ZGlmZiAtLWdpdCBhLy5naXRpZ25vcmUgYi8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxYThjMzMKLS0tIC9kZXYvbnVsbAorKysgYi8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsNTIgQEAKKy4qLnN3PworKi5vcmlnCisqLnJlagorKi5vCisqfgorLy5jY2FjaGUvCisvYW1pbmNsdWRlX3N0YXRpYy5hbQorL2J1aWxkLWF1eC8KK2NvbXBpbGUKK2NvbmZpZy5jYWNoZQorY29uZmlnLmxvZworY29uZmlnLnN0YXR1cworY29uZmlnLnN1YgorY29uZmlndXJlCitjc2NvcGUub3V0CitkZXBjb21wCisqLnBjCitpbnN0YWxsLXNoCitsaWJ0b29sCitsdG1haW4uc2gKK21pc3NpbmcKKy9tNC9sdCoubTQKKy9tNC9saWJ0b29sLm00CitzdGFtcC1oMQorc3RhbXAtaAorc3RhbXAtaC5pbgorRG94eWZpbGUKK01ha2VmaWxlCitNYWtlZmlsZS5pbgorYWNsb2NhbC5tNAorYXV0b200dGUuY2FjaGUKK2NvbmZpZy5ndWVzcworY29uZmlnLmgKK2NvbmZpZy5oLmluCisqLmJiCisqLmJiZworKi5kYQorKi5nY292CisqLmdjZGEKKyouZ2NubwordGFncworL2J1cy90bXBmaWxlcy5kL2RidXMuY29uZgorL2RidXMtMS4qLWNvdmVyYWdlLmluZm8KKy9kYnVzLTEuKi1jb3ZlcmFnZS5pbmZvLnRtcAorL2RidXMtMS4qLWNvdmVyYWdlLworL2RidXMtMS4qLworL2RidXMtMS4qLnRhci4qCisvbGNvdi5odG1sLworL2xjb3YuaW5mbworL2xjb3YuaW5mby50bXAKKy90YXAtZHJpdmVyLnNoCisvdGVzdC1kcml2ZXIKZGlmZiAtLWdpdCBhLy5tYWlsbWFwIGIvLm1haWxtYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGYzODZiOQotLS0gL2Rldi9udWxsCisrKyBiLy5tYWlsbWFwCkBAIC0wLDAgKzEsMTAgQEAKK0JlbmphbWluIFJlZWQgPHJhbmdlcnJpY2tAYmVmdW5rLmNvbT4gQmVuamFtaW4gUmVlZCA8cmFuZ2VyQGJlZnVuay5jb20+CitCZW5qYW1pbiBSZWVkIDxyYW5nZXJyaWNrQGJlZnVuay5jb20+IEJlbmphbWluIFJlZWQgPHJhbmdlckBTaW4ubG9jYWw+CitDaHJpc3RpYW4gRHl3YW4gPGNocmlzdGlhbi5keXdhbkBsYW5lZG8uY29tPiBDaHJpc3RpYW4gRHl3YW4gPGNocmlzdGlhbkBsYW5lZG8uY29tPgorQ29saW4gV2FsdGVycyA8d2FsdGVyc0B2ZXJidW0ub3JnPiBDb2xpbiBXYWx0ZXJzIDx3YWx0ZXJzQGxpZ2h0Ym94LmxvY2FsZG9tYWluPgorQ29saW4gV2FsdGVycyA8d2FsdGVyc0B2ZXJidW0ub3JnPiBDb2xpbiBXYWx0ZXJzIDx3YWx0ZXJzQHNwYWNlLWdob3N0LnZlcmJ1bS5wcml2YXRlPgorSGF2b2MgUGVubmluZ3RvbiA8aHBAcG9ib3guY29tPiBIYXZvYyBQZW5uaW5ndG9uIDxocEBsb2NhbGhvc3QubG9jYWxkb21haW4+CitSYWxmIEhhYmFja2VyIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+IFJhbGYgSGFiYWNrZXIgPFJhbGYuSGFiYWNrZXJAZnJlZW5ldC5kZT4KK1JhbGYgSGFiYWNrZXIgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4gUmFsZiBIYWJhY2tlciA8cmFsZkBzMTUyOTEzNTkub25saW5laG9tZS1zZXJ2ZXIuaW5mbz4KK1JhbGYgSGFiYWNrZXIgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4gdW5rbm93biA8QWRtaW5pc3RyYXRvckAuKG5vbmUpPgorUmFsZiBIYWJhY2tlciA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPiB1bmtub3duIDxIYWJhY2tlckAuKG5vbmUpPgpkaWZmIC0tZ2l0IGEvQVVUSE9SUyBiL0FVVEhPUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ4YWZkZgotLS0gL2Rldi9udWxsCisrKyBiL0FVVEhPUlMKQEAgLTAsMCArMSwxMjIgQEAKK0FsYmFuIENyZXF1eSA8YWxiYW4uY3JlcXV5QGNvbGxhYm9yYS5jby51az4KK0FsZXhhbmRlciBMYXJzc29uIDxhbGV4bEByZWRoYXQuY29tPgorQW5kZXJzIENhcmxzc29uIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KK0FuZHJlIEhlaW5lY2tlIDxhaGVpbmVja2VAaW50ZXZhdGlvbi5kZT4KK0FydGVtIEJpdHl1dHNraXkgPEFydGVtLkJpdHl1dHNraXlAbm9raWEuY29tPgorQXVyZWxpZW4gSmFybm8gPGF1cmVsMzJAZGViaWFuLm9yZz4KK0JlbmphbWluIFJlZWQgPHJhbmdlcnJpY2tAYmVmdW5rLmNvbT4KK0JyaWFuIENhbWVyb24gPGJyaWFuLmNhbWVyb25Ab3JhY2xlLmNvbT4KK0JyaWFuIENhbWVyb24gPGJyaWFuLmNhbWVyb25Ac3VuLmNvbT4KK0NocmlzIE1heW8gPGFrbGhmZXggZ21haWwgY29tPgorQ2hyaXN0aWFuIER5d2FuIDxjaHJpc3RpYW4uZHl3YW5AbGFuZWRvLmNvbT4KK0NocmlzdGlhbiBFaHJsaWNoZXIgPENoLkVocmxpY2hlckBnbXguZGU+CitDaHJpc3RpYW4gUGVyc2NoIChHTk9NRSkgPGNocGVAZ25vbWUub3JnPgorQ29saW4gV2FsdGVycyA8d2FsdGVyc0B2ZXJidW0ub3JnPgorQ29saW4gV2F0c29uIDxjandhdHNvbkB1YnVudHUuY29tPgorQ29zaW1vIEFsZmFyYW5vIDxjb3NpbW8uYWxmYXJhbm9AY29sbGFib3JhLmNvLnVrPgorQ3Jpc3RpYW4gUm9kcsOtZ3VleiA8Y3Jpc3RpYW4ucm9kcmlndWV6QG9wZW5zdXNlLm9yZz4KK0N5cmlsIEJydWxlYm9pcyA8a2liaUBkZWJpYW4ub3JnPgorRGFuaWVsIFAuIEJlcnJhbmdlIDxkYW5AYmVycmFuZ2UuY29tPgorRGFuaWVsIFJlZWQgPGRqckByZWRoYXQuY29tPgorRGF2aWQgWmV1dGhlbiA8ZGF2aWR6QHJlZGhhdC5jb20+CitEZW5uaXMgS2FhcnNlbWFrZXIgPGRlbm5pc0BrYWFyc2VtYWtlci5uZXQ+CitEaWVnbyBFLiAnRmxhbWVleWVzJyBQZXR0ZW7DsiA8ZmxhbWVleWVzQGdtYWlsLmNvbT4KK0VhbW9uIFdhbHNoIDxld2Fsc2hAdHljaG8ubnNhLmdvdj4KK0ZlZGVyaWNvIE1lbmEgUXVpbnRlcm8gPGZlZGVyaWNvQG5vdmVsbC5jb20+CitGcmFuayBPc3RlcmZlbGQgPGZyYW5rQGtkYWIubmV0PgorRnJlZGVyaWMgQ3JvemF0IDxmY3JvemF0QG1hbmRyaXZhLmNvbT4KK0ZyaWRyaWNoIMWgdHJiYSA8ZnJpZHJpY2guc3RyYmFAYmx1ZXdpbi5jaD4KK0dyemVnb3J6IETEhWJyb3dza2kgPGdkeEBwb2N6dGEuZm0+CitIYXJhbGQgRmVybmVuZ2VsIDxoYXJyeUBrZGV2ZWxvcC5vcmc+CitIYXJyaSBQb3J0ZW4gPHBvcnRlbkBrZGUub3JnPgorSGFzc28gVGVwcGVyIDxoYXNzb0Blc3RwYWsuZWU+CitIYXZvYyBQZW5uaW5ndG9uIDxocEBwb2JveC5jb20+CitIYXZvYyBQZW5uaW5ndG9uIDxocEByZWRoYXQuY29tPgorSGVuZHJpayBCdXNjaG1laWVyIDxoYnVzY2htZUBUZWNoRmFrLlVuaS1CaWVsZWZlbGQuREU+CitKYW1lcyBDYXJ0ZXIgPGp3Y2FydDJAdHljaG8ubnNhLmdvdj4KK0phbWVzIFdlc3RieSA8ancrZGViaWFuQGphbWVzd2VzdGJ5Lm5ldD4KK0phbWVzIFdpbGxjb3ggPGp3aWxsY294QGdub21lLm9yZz4KK0plbnMgR3JhbnNldWVyIDxqZW5zZ3JAZ214Lm5ldD4KK0rDqXLDqW1pZSBEaW1pbm8gPGplcmVtaWVAZGltaW5vLm9yZz4KK0ppxZnDrSBLbGltZcWhIDxqa2xpbWVzQHJlZGhhdC5jb20+CitKb2UgTWFyY3VzIENsYXJrZSA8bWFyY3VzQGZyZWVkZXNrdG9wLm9yZz4KK0pvZSBTaGF3IDxqb2VzaGF3QG5vdmVsbC5jb20+CitKb2hhbiBHeWxsZW5zcGV0eiA8am9oYW5neUBheGlzLmNvbT4KK0pvaGFubmVzIENhcmxzc29uIDxqb2hhbm5lcy5jYXJsc3Nvbi54QHNvbnllcmljc3Nvbi5jb20+CitKb2huIChKNSkgUGFsbWllcmkgPGpvaG5wQHJlZGhhdC5jb20+CitKb24gR29zdGluZyA8eXVrYXJpb25zZW5AZ21haWwuY29tPgorSm9uIFRyb3dicmlkZ2UgPHRyb3dAeGltaWFuLmNvbT4KK0theSBTaWV2ZXJzIDxrYXkuc2lldmVyc0B2cmZ5Lm9yZz4KK0tpbW1vIEjDpG3DpGzDpGluZW4gPGtpbW1vLmhhbWFsYWluZW5Abm9raWEuY29tPgorS2phcnRhbiBNYXJhYXMgPGttYXJhYXNAZ25vbWUub3JnPgorS3Jpc3RpYW4gSMO4Z3NiZXJnIDxrcmhAcmVkaGF0LmNvbT4KK0tyaXN0aWFuIFJpZXR2ZWxkIDxrcmlzQGd0ay5vcmc+CitLdXJ0IE1pbGxlciA8a3VydEBpbnRyaWNhdGVzb2Z0d2FyZS5jb20+CitMYXdyZW5jZSBSLiBTdGVlZ2VyIDxsc3RlZWdlckBnbWFpbC5jb20+CitMZW5uYXJ0IFBvZXR0ZXJpbmcgPGxlbm5hcnRAcG9ldHRlcmluZy5uZXQ+CitMZW5uYXJ0IFBvZXR0ZXJpbmcgPG16cW9oZkAwcG9pbnRlci5kZT4KK0xpb25lbCBMYW5kd2VybGluIDxsaW9uZWwubGFuZHdlcmxpbkBvcGVud2lkZS5mcj4KK0x1aXogQXVndXN0byBWb24gRGVudHogPGx1aXouZGVudHotdm9uQG5va2lhLmNvbT4KK01hcmMgQnJvY2tzY2htaWR0IDxoZUBkZWJpYW4ub3JnPgorTWFyYyBNdXR6IDxtYXJjQGtkYWIubmV0PgorTWFyY3VzIEJyaW5rbWFubiA8bWFyY3VzLmJyaW5rbWFubkBydWhyLXVuaS1ib2NodW0uZGU+CitNYXJrIEJyYW5kIDxtYWJyYW5kQG1hYnJhbmQubmw+CitNYXJrIE1jTG91Z2hsaW4gPG1hcmtAc2t5bmV0LmllPgorTWF0dGhpYXMgQ2xhc2VuIDxtY2xhc2VuQHJlZGhhdC5jb20+CitNYXR0IE1jQ3V0Y2hlbiA8bWF0dEBtYXR0bWNjdXRjaGVuLm5ldD4KK01pY2hhZWwgTWVla3MgPG1pY2hhZWwubWVla3NAbm92ZWxsLmNvbT4KK01pY2hhZWwgTWVla3MgPG1pY2hhZWxAeGltaWFuLmNvbT4KK01pa2FlbCBIYWxsZW5kYWwgPG1pY2tlQGNvZGVmYWN0b3J5LnNlPgorTWlrYWVsIEhhbGxlbmRhbCA8bWlja2VAaW1lbmRpby5jb20+CitNaWtlIE1jUXVhaWQgPG1pa2VAbWlrZW1jcXVhaWQuY29tPgorTWlsb3NsYXYgVHJtYWMgPG1pdHJAdm9sbnkuY3o+CitNdXJyYXkgQ3VtbWluZyA8bXVycmF5Y0BtdXJyYXljLmNvbT4KK05ndXnhu4VuIFRow6FpIE5n4buNYyBEdXkgPHBjbG91ZHNAZ21haWwuY29tPgorT2xlIEFuZHLDqSBWYWRsYSBSYXZuw6VzIDxvbGUuYW5kcmUucmF2bmFzQHRhbmRiZXJnLmNvbT4KK09saXZpZXIgQW5kcmlldSA8b2xpdl9fYUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CitPc3dhbGQgQnVkZGVuaGFnZW4gPG9zc2lAa2RlLm9yZz4KK093ZW4gRnJhc2VyLUdyZWVuIDxvd2VuQGRpc2NvYmFiZS5uZXQ+CitQYXRyaWNrIHZvbiBSZXRoIDxwYXRyaWNrLnZvbnJldGhAZ21haWwuY29tPgorUGF1IEdhcmNpYSBpIFF1aWxlcyA8cGdxdWlsZXNAZWxwYXVlci5vcmc+CitQYXVsIEJvbGxlIDxwZWJvbGxlQHRpc2NhbGkubmw+CitQZXRlciBCcmVpdGVubG9obmVyIDxwZWJAbXBwbXUubXBnLmRlPgorUGV0ZXIgS8O8bW1lbCA8c3ludGhldGljcHBAZ214Lm5ldD4KK1BldGVyIE1jQ3VyZHkgPHBtY2N1cmR5QHNrZXB0b3BvdGFtdXM+CitQaGlsaXAgQmx1bmRlbGwgPHBoaWxiQGdudS5vcmc+CitQbMOhY2lkbyBSZXZpbGxhIDx1bmtub3duQHVua25vd24uZG9tYWluPgorUmFsZiBIYWJhY2tlciA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorUmF5IFN0cm9kZSA8cnN0cm9kZUByZWRoYXQuY29tPgorUmljaGFyZCBBLiBIYW5raW5zIDxyaWNoYXJkLmEuaGFua2luc0BnbWFpbC5jb20+CitSaWNoYXJkIEh1Z2hlcyA8cmljaGFyZEBodWdoc2llLmNvbT4KK1JpY2hhcmQgSHVsdCA8cmh1bHRAY29kZWZhY3Rvcnkuc2U+CitSaWNoYXJkIEh1bHQgPHJpY2hhcmRAaW1lbmRpby5jb20+CitSb2JlcnQgTWNRdWVlbiA8cm9ib3QxMDFAZGViaWFuLm9yZz4KK1JvYmVydG8gR3VpZG8gPGJvYjRqb2JAZ21haWwuY29tPgorUm9tYWluIFBva3J6eXdrYSA8cm9tYWluQGtkYWIuY29tPgorUm9zcyBCdXJ0b24gPHJvc3NAb3BlbmVkaGFuZC5jb20+CitSeWFuIExvcnRpZSA8ZGVzcnRAZGVzcnQuY2E+CitTYXNjaGEgU2lsYmUgPHNhc2NoYS1wZ3BAc2lsYmUub3JnPgorU2FzY2hhIFNpbGJlIDxzYXNjaGEtd2ViLWJ1Z3MuZnJlZWRlc2t0b3Aub3JnQHNpbGJlLm9yZz4KK1Njb3R0IEphbWVzIFJlbW5hbnQgPHNjb3R0QG5ldHNwbGl0LmNvbT4KK1Njb3R0IEphbWVzIFJlbW5hbnQgPHNjb3R0QHVidW50dS5jb20+CitTZWJhc3RpYW4gU2F1ZXIgPHNlYnNhdWVyQGtkYWIubmV0PgorU2V0aCBOaWNrZWxsIDxzZXRoQGdub21lLm9yZz4KK1NpbW9uIE1jVml0dGllIDxzaW1vbi5tY3ZpdHRpZUBjb2xsYWJvcmEuY28udWs+CitTam9lcmQgU2ltb25zIDxzam9lcmRAbHVvbi5uZXQ+CitTbGVkeiA8c2xlZHpATU9CSUwtNDAwLTU4Ni5pbnRlcm4uZHJlc2VhcmNoLmRlPgorU3RldmUgR3J1YmIgPHNncnViYkByZWRoYXQuY29tPgorU3ZlbiBIZXJ6YmVyZyA8c3ZlbkBpbWVuZGlvLmNvbT4KK1RoaWFnbyBNYWNpZWlyYSA8dGhpYWdvQGtkZS5vcmc+CitUaW0gRGlqa3N0cmEgPHRpbUBmYW1kaWprc3RyYS5vcmc+CitUb2JpYXMgTXVlbGxlciA8ZmRvLWJ1Z3NAY3J5cHRvYml0Y2guZGU+CitUb21hcyBIb2dlciA8dGhvZ2VyQHJlZGhhdC5jb20+CitUb21hcyBQZWxrYSA8dHBlbGthQHJlZGhhdC5jb20+CitUb20gSHVnaGVzIDx0b20uaHVnaGVzQHBhbG0uY29tPgorVG9yIExpbGxxdmlzdCA8dG1sQGlraS5maT4KK1dhbGRvIEJhc3RpYW4gPGJhc3RpYW5Aa2RlLm9yZz4KK1dpbGxpYW0gTGFjaGFuY2UgPHdybGFjaEBnbWFpbC5jb20+CitXaWxsIFRob21wc29uIDx3aWxsLnRob21wc29uQGNvbGxhYm9yYS5jby51az4KK1d1bGYgQy4gS3J1ZWdlciA8cGhpbGFudHJvcEBleGhlcmJvLm9yZz4KK1hhbiBMb3BleiA8eGFuQGdub21lLm9yZz4KK1lhYWtvdiBTZWxrb3dpdHogPHlzZWxrb3dpdHpAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorWmFjayBSdXNpbiA8emFja0BrZGUub3JnPgpkaWZmIC0tZ2l0IGEvQW5kcm9pZC5tayBiL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA1M2U3ZAotLS0gL2Rldi9udWxsCisrKyBiL0FuZHJvaWQubWsKQEAgLTAsMCArMSBAQAoraW5jbHVkZSAkKGNhbGwgYWxsLXN1YmRpci1tYWtlZmlsZXMpCmRpZmYgLS1naXQgYS9DT05UUklCVVRJTkcubWQgYi9DT05UUklCVVRJTkcubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdjNjAyZQotLS0gL2Rldi9udWxsCisrKyBiL0NPTlRSSUJVVElORy5tZApAQCAtMCwwICsxLDM5MiBAQAorIyBDb250cmlidXRpbmcgdG8gZGJ1cworCitUaGUgZ3VpZGVsaW5lcyBpbiB0aGlzIGZpbGUgYXJlIHRoZSBpZGVhbHM7IGl0J3MgYmV0dGVyIHRvIHNlbmQgYQorbm90LWZ1bGx5LWZvbGxvd2luZy1ndWlkZWxpbmVzIHBhdGNoIHRoYW4gbm8gcGF0Y2ggYXQgYWxsLCB0aG91Z2guICBXZQorY2FuIGFsd2F5cyBwb2xpc2ggaXQgdXAuCisKKyMjIFNvdXJjZSBjb2RlIGFuZCBpc3N1ZSB0cmFja2luZworCitTb3VyY2UgY29kZSBhbmQgaXNzdWUgdHJhY2tpbmcgZm9yIHRoZSBELUJ1cyBzcGVjaWZpY2F0aW9uIGFuZCBpdHMKK3JlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiAnZGJ1cycgYXJlIHByb3ZpZGVkIGJ5IGZyZWVkZXNrdG9wLm9yZyBHaXRsYWI6Cis8aHR0cHM6Ly9naXRsYWIuZnJlZWRlc2t0b3Aub3JnL2RidXMvZGJ1cz4uCisKKyMjIFJlcG9ydGluZyBzZWN1cml0eSB2dWxuZXJhYmlsaXRpZXMKKworSWYgeW91IGZpbmQgYSBzZWN1cml0eSB2dWxuZXJhYmlsaXR5IHRoYXQgaXMgbm90IGtub3duIHRvIHRoZSBwdWJsaWMsCitwbGVhc2UgcmVwb3J0IGl0IHByaXZhdGVseSB0byBkYnVzLXNlY3VyaXR5QGxpc3RzLmZyZWVkZXNrdG9wLm9yZworb3IgYnkgcmVwb3J0aW5nIGEgR2l0bGFiIGlzc3VlIGF0CitodHRwczovL2dpdGxhYi5mcmVlZGVza3RvcC5vcmcvZGJ1cy9kYnVzL2lzc3Vlcy9uZXcgYW5kIG1hcmtpbmcgaXQKK2FzICJjb25maWRlbnRpYWwiLgorCisjIyBNYWlsaW5nIGxpc3QKKworVGhlIEQtQnVzIG1haWxpbmcgbGlzdCBpcyBkYnVzQGxpc3RzLmZyZWVkZXNrdG9wLm9yZzsgZGlzY3Vzc2lvbiBvZgorcHJvdG9jb2wgZW5oYW5jZW1lbnRzLCBuZXcgaW1wbGVtZW50YXRpb25zLCBldGMuIHNob3VsZCBnbyB0aGVyZS4KKworIyMgQ29kZSBvZiBDb25kdWN0CisKK0FzIGEgZnJlZWRlc2t0b3Aub3JnIHByb2plY3QsIGRidXMgZm9sbG93cyB0aGUgQ29udHJpYnV0b3IgQ292ZW5hbnQsCitmb3VuZCBhdDogaHR0cHM6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3dpa2kvQ29kZU9mQ29uZHVjdAorCitQbGVhc2UgY29uZHVjdCB5b3Vyc2VsZiBpbiBhIHJlc3BlY3RmdWwgYW5kIGNpdmlsaXNlZCBtYW5uZXIgd2hlbgoraW50ZXJhY3Rpbmcgd2l0aCBjb21tdW5pdHkgbWVtYmVycyBvbiBtYWlsaW5nIGxpc3RzLCBJUkMsIG9yIGJ1ZwordHJhY2tlcnMuIFRoZSBjb21tdW5pdHkgcmVwcmVzZW50cyB0aGUgcHJvamVjdCBhcyBhIHdob2xlLCBhbmQgYWJ1c2l2ZQorb3IgYnVsbHlpbmcgYmVoYXZpb3VyIGlzIG5vdCB0b2xlcmF0ZWQgYnkgdGhlIHByb2plY3QuCisKKyMjIERldmVsb3BtZW50CisKK0QtQnVzIHVzZXMgR2l0IGFzIGl0cyB2ZXJzaW9uIGNvbnRyb2wgc3lzdGVtLiBUaGUgbWFpbiByZXBvc2l0b3J5IGlzCitob3N0ZWQgb24gZnJlZWRlc2t0b3Aub3JnIEdpdGxhYi4gVG8gY2xvbmUgRC1CdXMsIGV4ZWN1dGUgb25lIG9mIHRoZQorZm9sbG93aW5nIGNvbW1hbmRzOgorCisgICAgZ2l0IGNsb25lIGh0dHBzOi8vZ2l0bGFiLmZyZWVkZXNrdG9wLm9yZy9kYnVzL2RidXMuZ2l0CisgICAgZ2l0IGNsb25lIGdpdEBnaXRsYWIuZnJlZWRlc2t0b3Aub3JnOmRidXMvZGJ1cy5naXQKKworVGhlIHNlY29uZCBmb3JtIGlzIHRoZSBvbmUgdGhhdCBhbGxvd3MgcHVzaGluZywgYnV0IGl0IGFsc28gcmVxdWlyZXMKK2FuIFNTSCBhY2NvdW50IG9uIHRoZSBzZXJ2ZXIuIFRoZSBmaXJzdCBmb3JtIGFsbG93cyBhbm9ueW1vdXMKK2NoZWNrb3V0cy4KKworIyMjIEJyYW5jaGVzCisKK0QtQnVzIGRldmVsb3BtZW50IGhhcHBlbnMgaW4gbXVsdGlwbGUgYnJhbmNoZXMgaW4gcGFyYWxsZWwuIFRoZSBtYWluCiticmFuY2hlcyBhcmUgdGhlIGN1cnJlbnQgc3RhYmxlIGJyYW5jaCwgd2l0aCBhbiBldmVuIG1pbm9yIG51bWJlciAobGlrZQorMS4wLCAxLjIgYW5kIDEuNCksIGFuZCB0aGUgbmV4dCBkZXZlbG9wbWVudCBicmFuY2gsIHdpdGggdGhlIG5leHQgb2RkCitudW1iZXIuIEF0IHRoZSB0aW1lIG9mIHdyaXRpbmcsIHRoZSBzdGFibGUgYnJhbmNoIGlzIGRidXMgMS4xMi54IGFuZAordGhlIGRldmVsb3BtZW50IGJyYW5jaCBpcyBkYnVzIDEuMTMueCwgbGVhZGluZyB0byBhIG5ldyAxLjE0Lnggc3RhYmxlCiticmFuY2ggaW4gZnV0dXJlLgorCitTdGFibGUgYnJhbmNoZXMgYXJlIG5hbWVkIGFmdGVyIHRoZSB2ZXJzaW9uIG51bWJlciBpdHNlbGYgKGBkYnVzLTEuMmAsCitgZGJ1cy0xLjRgKSwgd2hlcmVhcyB0aGUgZGV2ZWxvcG1lbnQgYnJhbmNoIGlzIHNpbXBseSBrbm93biBhcworYG1hc3RlcmAuCisKK05ldyBmZWF0dXJlcywgZW5oYW5jZW1lbnRzLCBtaW5vciBidWcgZml4ZXMsIGFuZCBidWcgZml4ZXMgdGhhdCBhcmUKK3VudXN1YWxseSBpbnRydXNpdmUgc2hvdWxkIGFsd2F5cyBiZSBiYXNlZCBvbiB0aGUgYG1hc3RlcmAgYnJhbmNoLgorCitGaXhlcyBmb3Igc2lnbmlmaWNhbnQgYnVncyBzaG91bGQgYmUgZGV2ZWxvcGVkIG9uIHRoZSBgbWFzdGVyYCBicmFuY2gKK2FuZCBjaGVycnktcGlja2VkIHRvIHRoZSBtb3N0IHJlY2VudCBzdGFibGUgYnJhbmNoLgorCitEZXBlbmRpbmcgb24gdGhlIHJlbGVhc2UgY3ljbGVzIG9mIHZhcmlvdXMgTGludXggZGlzdHJpYnV0aW9ucywgc29tZQorb2xkZXIgc3RhYmxlIGJyYW5jaGVzIG1pZ2h0IGNvbnRpbnVlIHRvIHJlY2VpdmUgZml4ZXMgZm9yIHNlY3VyaXR5Cit2dWxuZXJhYmlsaXRpZXMgKGFuZCBzb21ldGltZXMgbWFqb3Igbm9uLXNlY3VyaXR5IGJ1Z3MpIGZvciBhIHRpbWUuCitUaGVzZSBhcmUgYW5ub3VuY2VkIG9uIHRoZSBELUJ1cyBtYWlsaW5nIGxpc3QuCisKK09sZCBkZXZlbG9wbWVudCBicmFuY2hlcyBhcmUgbm90IHN1cHBvcnRlZCBhdCBhbGwsIGFuZCB3aWxsIG5vdCByZWNlaXZlCithbnkgYnVnIGZpeGVzIC0gbm90IGV2ZW4gZm9yIHNlY3VyaXR5IHZ1bG5lcmFiaWxpdGllcy4gUGxlYXNlIGRvIG5vdAordXNlIGEgZGV2ZWxvcG1lbnQgYnJhbmNoIGxpa2UgMS4xMy54IGluIHlvdXIgT1MgZGlzdHJpYnV0aW9uLCB1bmxlc3MKK3lvdSBjYW4gZ3VhcmFudGVlIHRoYXQgeW91IHdpbGwgdXBncmFkZSB0byB0aGUgbmV4dCBzdGFibGUgYnJhbmNoIHN1Y2gKK2FzIDEuMTQueCB3aGVuIGl0IGJlY29tZXMgYXZhaWxhYmxlLgorCisjIyMgQ29tbWl0cworCitJZiB5b3UgYXJlIG1ha2luZyBjaGFuZ2VzIHRoYXQgeW91IHdpc2ggdG8gYmUgaW5jb3Jwb3JhdGVkIHVwc3RyZWFtLAorcGxlYXNlIGRvIGFzIHNtYWxsIGNvbW1pdHMgdG8geW91ciBsb2NhbCBnaXQgdHJlZSB0aGF0IGFyZSBpbmRpdmlkdWFsbHkKK2NvcnJlY3QsIHNvIHRoZXJlIGlzIGEgZ29vZCBoaXN0b3J5IG9mIHlvdXIgY2hhbmdlcy4KKworVGhlIGZpcnN0IGxpbmUgb2YgdGhlIGNvbW1pdCBtZXNzYWdlIHNob3VsZCBiZSBhIHNpbmdsZSBzZW50ZW5jZSB0aGF0CitkZXNjcmliZXMgdGhlIGNoYW5nZSwgb3B0aW9uYWxseSB3aXRoIGEgcHJlZml4IHRoYXQgaWRlbnRpZmllcyB0aGUKK2FyZWEgb2YgdGhlIGNvZGUgdGhhdCBpcyBhZmZlY3RlZC4KKworVGhlIGJvZHkgb2YgdGhlIGNvbW1pdCBtZXNzYWdlIHNob3VsZCBkZXNjcmliZSB3aGF0IHRoZSBwYXRjaCBjaGFuZ2VzCithbmQgd2h5LCBhbmQgYWxzbyBub3RlIGFueSBwYXJ0aWN1bGFyIHNpZGUgZWZmZWN0cy4gVGhpcyBzaG91bGRuJ3QgYmUKK2VtcHR5IG9uIG1vc3Qgb2YgdGhlIGNhc2VzLiBJdCBzaG91bGRuJ3QgdGFrZSBhIGxvdCBvZiBlZmZvcnQgdG8gd3JpdGUgYQorY29tbWl0IG1lc3NhZ2UgZm9yIGFuIG9idmlvdXMgY2hhbmdlLCBzbyBhbiBlbXB0eSBjb21taXQgbWVzc2FnZSBib2R5IGlzCitvbmx5IGFjY2VwdGFibGUgaWYgdGhlIHF1ZXN0aW9ucyAiV2hhdD8iIGFuZCAiV2h5PyIgYXJlIGFscmVhZHkgYW5zd2VyZWQKK29uIHRoZSBvbmUtbGluZSBzdW1tYXJ5LgorCitUaGUgbGluZXMgb2YgdGhlIGNvbW1pdCBtZXNzYWdlIHNob3VsZCBoYXZlIGF0IG1vc3QgNzYgY2hhcmFjdGVycywKK3RvIGNvcGUgd2l0aCB0aGUgd2F5IGdpdCBsb2cgcHJlc2VudHMgdGhlbS4KKworU2VlIFtub3RlcyBvbiBjb21taXQgbWVzc2FnZXNdKGh0dHBzOi8vd2hvLXQuYmxvZ3Nwb3QuY29tLzIwMDkvMTIvb24tY29tbWl0LW1lc3NhZ2VzLmh0bWwpLAorW0EgTm90ZSBBYm91dCBHaXQgQ29tbWl0IE1lc3NhZ2VzXShodHRwczovL3RiYWdnZXJ5LmNvbS8yMDA4LzA0LzE5L2Etbm90ZS1hYm91dC1naXQtY29tbWl0LW1lc3NhZ2VzLmh0bWwpCitvciBbSG93IHRvIFdyaXRlIGEgR2l0IENvbW1pdCBNZXNzYWdlXShodHRwczovL2NocmlzLmJlYW1zLmlvL3Bvc3RzL2dpdC1jb21taXQvKQorZm9yIHJlY29tbWVuZGVkIHJlYWRpbmcgb24gd3JpdGluZyBoaWdoLXF1YWxpdHkgY29tbWl0IG1lc3NhZ2VzLgorCitZb3VyIHBhdGNoZXMgc2hvdWxkIGFsc28gaW5jbHVkZSBhIFNpZ25lZC1vZmYtYnkgbGluZSB3aXRoIHlvdXIgbmFtZSBhbmQKK2VtYWlsIGFkZHJlc3MsIGluZGljYXRpbmcgdGhhdCB5b3VyIGNvbnRyaWJ1dGlvbiBmb2xsb3dzIHRoZSBbRGV2ZWxvcGVyJ3MKK0NlcnRpZmljYXRlIG9mIE9yaWdpbl0oaHR0cHM6Ly9kZXZlbG9wZXJjZXJ0aWZpY2F0ZS5vcmcvKS4gSWYgeW91J3JlCitub3QgdGhlIHBhdGNoJ3Mgb3JpZ2luYWwgYXV0aG9yLCB5b3Ugc2hvdWxkIGFsc28gZ2F0aGVyIFMtby1iJ3MgYnkKK3RoZW0gKGFuZC9vciB3aG9tZXZlciBnYXZlIHRoZSBwYXRjaCB0byB5b3UuKSBUaGUgc2lnbmlmaWNhbmNlIG9mIHRoaXMKK2lzIHRoYXQgaXQgY2VydGlmaWVzIHRoYXQgeW91IGNyZWF0ZWQgdGhlIHBhdGNoLCB0aGF0IGl0IHdhcyBjcmVhdGVkCit1bmRlciBhbiBhcHByb3ByaWF0ZSBvcGVuIHNvdXJjZSBsaWNlbnNlLCBvciBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhvc2UKK3Rlcm1zLiBUaGlzIGxldHMgdXMgaW5kaWNhdGUgYSBjaGFpbiBvZiByZXNwb25zaWJpbGl0eSBmb3IgdGhlIGNvcHlyaWdodAorc3RhdHVzIG9mIHRoZSBjb2RlLgorCitXZSB3b24ndCByZWplY3QgcGF0Y2hlcyB0aGF0IGxhY2sgUy1vLWIsIGJ1dCBpdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZC4KKworIyMjIFNlbmRpbmcgYSBtZXJnZSByZXF1ZXN0CisKK1doZW4geW91IGNvbnNpZGVyIHlvdXIgY2hhbmdlcyB0byBiZSByZWFkeSBmb3IgbWVyZ2luZyB0byBtYWlubGluZToKKworKiBjcmVhdGUgYSBwZXJzb25hbCBmb3JrIG9mIDxodHRwczovL2dpdGxhYi5mcmVlZGVza3RvcC5vcmcvZGJ1cy9kYnVzPgorICBvbiBmcmVlZGVza3RvcC5vcmcgR2l0bGFiCisqIHB1c2ggeW91ciBjaGFuZ2VzIHRvIHlvdXIgcGVyc29uYWwgZm9yayBhcyBhIGJyYW5jaAorKiBjcmVhdGUgYSBtZXJnZSByZXF1ZXN0IGF0CisgIDxodHRwczovL2dpdGxhYi5mcmVlZGVza3RvcC5vcmcvZGJ1cy9kYnVzL21lcmdlX3JlcXVlc3RzPgorCisjIyMgU2VjdXJpdHkgZ3VpZGVsaW5lcworCitNb3N0IG9mIEQtQnVzIGlzIHNlY3VyaXR5IHNlbnNpdGl2ZS4gIEd1aWRlbGluZXMgcmVsYXRlZCB0byB0aGF0OgorCisgLSBhdm9pZCBgbWVtY3B5KClgLCBgc3ByaW50ZigpYCwgYHN0cmxlbigpYCwgYHNucHJpbnRmKClgLCBgc3RybGNhdCgpYCwKKyAgIGBzdHJzdHIoKWAsIGBzdHJ0b2soKWAsIG9yIGFueSBvZiB0aGlzIHN0dWZmLiBVc2UgYERCdXNTdHJpbmdgLgorICAgSWYgYERCdXNTdHJpbmdgIGRvZXNuJ3QgaGF2ZSB0aGUgZmVhdHVyZSB5b3UgbmVlZCwgYWRkIGl0CisgICB0byBgREJ1c1N0cmluZ2AuCisKKyAgIFRoZXJlIGFyZSBzb21lIGV4Y2VwdGlvbnMsIGZvciBleGFtcGxlCisgICBpZiB5b3VyIHN0cmluZ3MgYXJlIGp1c3QgdXNlZCB0byBpbmRleCBhIGhhc2ggdGFibGUKKyAgIGFuZCB5b3UgZG9uJ3QgZG8gYW55IHBhcnNpbmcvbW9kaWZpY2F0aW9uIG9mIHRoZW0sIHBlcmhhcHMKKyAgIGBEQnVzU3RyaW5nYCBpcyB3YXN0ZWZ1bCBhbmQgd291bGRuJ3QgaGVscCBtdWNoLiBCdXQgZGVmaW5pdGVseQorICAgaWYgeW91J3JlIGRvaW5nIGFueSBwYXJzaW5nLCByZWFsbG9jYXRpb24sIGV0Yy4gdXNlIGBEQnVzU3RyaW5nYC4KKworIC0gZG8gbm90IGluY2x1ZGUgc3lzdGVtIGhlYWRlcnMgb3V0c2lkZSBvZiBgZGJ1cy1tZW1vcnkuY2AsCisgICBgZGJ1cy1zeXNkZXBzLmNgLCBhbmQgb3RoZXIgcGxhY2VzIHdoZXJlIHRoZXkgYXJlIGFscmVhZHkKKyAgIGluY2x1ZGVkLiBUaGlzIGdpdmVzIHVzIG9uZSBwbGFjZSB0byBhdWRpdCBhbGwgZXh0ZXJuYWwKKyAgIGRlcGVuZGVuY2llcyBvbiBmZWF0dXJlcyBpbiBsaWJjLCBldGMuCisKKyAtIGRvIG5vdCB1c2UgbGliYyBmZWF0dXJlcyB0aGF0IGFyZSAiY29tcGxpY2F0ZWQiCisgICBhbmQgbWF5IGNvbnRhaW4gc2VjdXJpdHkgaG9sZXMuIEZvciBleGFtcGxlLCB5b3UgcHJvYmFibHkgc2hvdWxkbid0CisgICB0cnkgdG8gdXNlIGByZWdjb21wKClgIHRvIGNvbXBpbGUgYW4gdW50cnVzdGVkIHJlZ3VsYXIgZXhwcmVzc2lvbi4KKyAgIFJlZ3VsYXIgZXhwcmVzc2lvbnMgYXJlIGp1c3QgdG9vIGNvbXBsaWNhdGVkLCBhbmQgdGhlcmUgYXJlIG1hbnkKKyAgIGRpZmZlcmVudCBsaWJjIGltcGxlbWVudGF0aW9ucyBvdXQgdGhlcmUuCisKKyAtIHdlIG5lZWQgdG8gZGVzaWduIHRoZSBtZXNzYWdlIGJ1cyBkYWVtb24gKGFuZCBhbnkgc2ltaWxhciBmZWF0dXJlcykKKyAgIHRvIHVzZSBsaW1pdGVkIHByaXZpbGVnZXMsIHJ1biBpbiBhIGNocm9vdCBqYWlsLCBhbmQgc28gb24uCisKK2h0dHA6Ly92c2Z0cGQuYmVhc3RzLm9yZy8gaGFzIG90aGVyIGdvb2Qgc2VjdXJpdHkgc3VnZ2VzdGlvbnMuCisKKyMjIyBDb2RpbmcgU3R5bGUKKworIC0gUGxlYXNlIGZvbGxvdyB0aGUgY29kaW5nIHN0eWxlIGFuZCBpbmRlbnRhdGlvbiBvZiBuZWFyYnkgY29kZS4KKworIC0gQyBjb2RlIHVzZXMgR05VIGNvZGluZyBjb252ZW50aW9ucyAoYXBwcm94aW1hdGVseSAiZ251IiBzdHlsZSBpbgorICAgRW1hY3MpLCB3aXRoIEdMaWItbGlrZSBleHRlbnNpb25zIChlLmcuIGxpbmluZyB1cCBmdW5jdGlvbiBhcmd1bWVudHMpLgorCisgLSBXcml0ZSBkb2NzIGZvciBhbGwgbm9uLXN0YXRpYyBmdW5jdGlvbnMgYW5kIHN0cnVjdHMgYW5kIHNvIG9uLiB0cnkKKyAgIGBkb3h5Z2VuIERveHlmaWxlYCBwcmlvciB0byBjb21taXQgYW5kIHRyeSBub3QgdG8gY2F1c2UgYW55IG5ldworICAgd2FybmluZ3MuCisKKyAtIEFsbCBleHRlcm5hbCBpbnRlcmZhY2VzIChuZXR3b3JrIHByb3RvY29scywgZmlsZSBmb3JtYXRzLCBldGMuKQorICAgc2hvdWxkIGhhdmUgZG9jdW1lbnRlZCBzcGVjaWZpY2F0aW9ucyBzdWZmaWNpZW50IHRvIGFsbG93IGFuCisgICBhbHRlcm5hdGl2ZSBpbXBsZW1lbnRhdGlvbiB0byBiZSB3cml0dGVuLiBPdXIgaW1wbGVtZW50YXRpb24gc2hvdWxkCisgICBiZSBzdHJpY3QgYWJvdXQgc3BlY2lmaWNhdGlvbiBjb21wbGlhbmNlIChzaG91bGQgbm90IGZvciBleGFtcGxlCisgICBoZXVyaXN0aWNhbGx5IHBhcnNlIGEgZmlsZSBhbmQgYWNjZXB0IG5vdC13ZWxsLWZvcm1lZAorICAgZGF0YSkuIEF2b2lkaW5nIGhldXJpc3RpY3MgaXMgYWxzbyBpbXBvcnRhbnQgZm9yIHNlY3VyaXR5IHJlYXNvbnM7CisgICBpZiBpdCBsb29rcyBmdW5ueSwgaWdub3JlIGl0IChvciBleGl0LCBvciBkaXNjb25uZWN0KS4KKworIyMjIExpY2Vuc2luZworCitQbGVhc2UgbWF0Y2ggdGhlIGV4aXN0aW5nIGxpY2Vuc2luZyAoYSBkdWFsLWxpY2Vuc2U6IEFGTC0yLjEgb3IgR1BMLTIrLAorcmVjaXBpZW50J3MgY2hvaWNlKS4gRW50aXJlbHkgbmV3IG1vZHVsZXMgY2FuIGJlIHBsYWNlZCB1bmRlciBhIG1vcmUKK3Blcm1pc3NpdmUgbGljZW5zZTogdG8gYXZvaWQgbGljZW5zZSBwcm9saWZlcmF0aW9uLCBvdXIgcHJlZmVycmVkCitwZXJtaXNzaXZlIGxpY2Vuc2UgaXMgdGhlIHZhcmlhbnQgb2YgdGhlIE1JVC9YMTEgbGljZW5zZSB1c2VkIGJ5IHRoZQorRXhwYXQgWE1MIGxpYnJhcnkgKGZvciBleGFtcGxlIHNlZSB0aGUgdG9wIG9mIHRvb2xzL2NpLWJ1aWxkLnNoKS4KKworIyMjIEJ1aWxkIHN5c3RlbXMKKworVGhlIHByaW1hcnkgYnVpbGQgc3lzdGVtIGZvciBkYnVzIHVzZXMgdGhlIEdOVSBBdXRvdG9vbHMgc3VpdGUgKEF1dG9jb25mLAorQXV0b21ha2UgYW5kIExpYnRvb2wpLiBUaGlzIGJ1aWxkIHN5c3RlbSBpcyBzdHJvbmdseSByZWNvbW1lbmRlZCBmb3IKK1VuaXggT1MgaW50ZWdyYXRvcnMuIEl0IGNhbiBhbHNvIGJlIHVzZWQgdG8gY29tcGlsZSBkYnVzIGZvciBXaW5kb3dzCit1c2luZyB0aGUgbWluZ3ctdzY0IGNvbXBpbGVyIHN1aXRlLCBlaXRoZXIgYnkgY3Jvc3MtY29tcGlsaW5nIG9uIGEgVW5peAorc3lzdGVtIG9yIGJ5IHVzaW5nIGFuIGVudmlyb25tZW50IGxpa2UgTVNZUzIgb24gV2luZG93cy4KKworVGhlcmUgaXMgYWxzbyBhIENNYWtlIGJ1aWxkIHN5c3RlbS4gVGhpcyBpcyBwcmltYXJpbHkgdGhlcmUgdG8gbWFrZSBpdAorZWFzaWVyIHRvIGJ1aWxkIGRidXMgb24gV2luZG93cywgdXNpbmcgZWl0aGVyIGEgTVNZUzIvbWluZ3cgZW52aXJvbm1lbnQKK29yIHRoZSBNU1ZDIGNvbXBpbGVyIGZyb20gTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8uIEl0IGNhbiBhbHNvIGJlIHVzZWQKK29uIGEgR05VL0xpbnV4IHN5c3RlbSwgYnV0IHRoaXMgaXMgbm90IHJlY29tbWVuZGVkIGZvciBPUyBpbnRlZ3JhdG9ycy4KKworQ2hhbmdlcyBjb250cmlidXRlZCB0byBkYnVzIG11c3Qgbm90IGJyZWFrIHRoZSBidWlsZCBmb3IgZWl0aGVyIG9mIHRoZXNlCitidWlsZCBzeXN0ZW1zLiBJdCBpcyBPSyBmb3IgdGhlIENNYWtlIGJ1aWxkIHN5c3RlbSB0byBzdXBwb3J0IGZld2VyCitvcHRpb25zLCBzdXBwb3J0IGZld2VyIG9wZXJhdGluZyBzeXN0ZW1zLCBoYXZlIGxlc3MgdGVzdCBjb3ZlcmFnZSBvcgorYnVpbGQgZmV3ZXIgbm9uLWVzc2VudGlhbCBwcm9ncmFtcywgYnV0IGl0IG11c3QgY29udGludWUgdG8gd29yayBvbiBhdAorbGVhc3QgR05VL0xpbnV4IGFuZCBXaW5kb3dzLgorCisjIyMgRW52aXJvbm1lbnQgdmFyaWFibGVzCisKK1RoZXNlIGFyZSBzb21lIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdGhhdCBhcmUgdXNlZCBieSB0aGUgRC1CdXMKK2NsaWVudCBsaWJyYXJ5LgorCisqIGBEQlVTX1ZFUkJPU0U9MWAKKworICBUdXJucyBvbiBwcmludGluZyB2ZXJib3NlIG1lc3NhZ2VzLiBUaGlzIG9ubHkgd29ya3MgaWYgRC1CdXMgaGFzIGJlZW4KKyAgY29tcGlsZWQgd2l0aCBgLS1lbmFibGUtdmVyYm9zZS1tb2RlYC4KKworKiBgREJVU19NQUxMT0NfRkFJTF9OVEg9bmAKKworICBDYW4gYmUgc2V0IHRvIGEgbnVtYmVyLCBjYXVzaW5nIGV2ZXJ5ICpuKnRoIGNhbGwgdG8gYGRidXNfYWxsb2NgIG9yCisgIGBkYnVzX3JlYWxsb2NgIHRvIGZhaWwuIFRoaXMgb25seSB3b3JrcyBpZiBELUJ1cyBoYXMgYmVlbiBjb21waWxlZCB3aXRoCisgIGAtLWVuYWJsZS1lbWJlZGRlZC10ZXN0c2AuCisKKyogYERCVVNfTUFMTE9DX0ZBSUxfR1JFQVRFUl9USEFOPW5gCisKKyAgQ2FuIGJlIHNldCB0byBhIG51bWJlciwgY2F1c2luZyBldmVyeSBjYWxsIHRvIGBkYnVzX2FsbG9jYCBvcgorICBgZGJ1c19yZWFsbG9jYCB0byBmYWlsIGlmIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgYWxsb2NhdGVkIGlzIGdyZWF0ZXIKKyAgdGhhbiB0aGUgc3BlY2lmaWVkIG51bWJlci4gVGhpcyBvbmx5IHdvcmtzIGlmIEQtQnVzIGhhcyBiZWVuIGNvbXBpbGVkIHdpdGgKKyAgYC0tZW5hYmxlLWVtYmVkZGVkLXRlc3RzYC4KKworKiBgREJVU19URVNUX01BTExPQ19GQUlMVVJFUz1uYAorCisgIE1hbnkgb2YgdGhlIEQtQnVzIHRlc3RzIHdpbGwgcnVuIG92ZXIgYW5kIG92ZXIsIG9uY2UgZm9yIGVhY2ggYG1hbGxvY2AKKyAgaW52b2x2ZWQgaW4gdGhlIHRlc3QuIEVhY2ggcnVuIHdpbGwgZmFpbCBhIGRpZmZlcmVudCBgbWFsbG9jYCwgcGx1cyBzb21lCisgIG51bWJlciBvZiBgbWFsbG9jYHMgZm9sbG93aW5nIHRoYXQgbWFsbG9jIChiZWNhdXNlIGEgZmFpciBudW1iZXIgb2YgYnVncworICBvbmx5IGhhcHBlbiBpZiB0d28gb3IgbW9yZSBgbWFsbG9jYHMgZmFpbCBpbiBhIHJvdywgZS5nLiBlcnJvciByZWNvdmVyeQorICB0aGF0IGl0c2VsZiBpbnZvbHZlcyBgbWFsbG9jYCkuICBUaGlzIGVudmlyb25tZW50IHZhcmlhYmxlIHNldHMgdGhlCisgIG51bWJlciBvZiBjb25zZWN1dGl2ZSBgbWFsbG9jYHMgdG8gZmFpbC4KKworICBIZXJlJ3Mgd2h5IHlvdSBjYXJlOiBJZiBzZXQgdG8gMCwgdGhlbiB0aGUgYG1hbGxvY2AgY2hlY2tpbmcgaXMgc2tpcHBlZCwKKyAgd2hpY2ggbWFrZXMgdGhlIHRlc3Qgc3VpdGUgYSBsb3QgZmFzdGVyLiBKdXN0IHJ1biB3aXRoIHRoaXMKKyAgZW52aXJvbm1lbnQgdmFyaWFibGUgdW5zZXQgYmVmb3JlIHlvdSBjb21taXQuCisKKyMjIyBUZXN0cworCitQbGVhc2UgdHJ5IHRvIHdyaXRlIHRlc3QgY292ZXJhZ2UgZm9yIGFsbCBuZXcgZnVuY3Rpb25hbGl0eS4KK1dlIGhhdmUgdHdvIGJyb2FkIGNhdGVnb3JpZXMgb2YgdGVzdHMuCisKK1RoZSAqbW9kdWxhciB0ZXN0cyogYXJlIGVuYWJsZWQgYnkgY29uZmlndXJpbmcgd2l0aAorYC0tZW5hYmxlLW1vZHVsYXItdGVzdHNgLiBUaGVzZSBtb3N0bHkgdXNlIEdMaWIncyBHVGVzdCBmcmFtZXdvcmssCithbmQgYXJlIHN0YW5kYWxvbmUgcHJvZ3JhbXMgdGhhdCBkbyBub3QgYWZmZWN0IHRoZSBjb250ZW50cyBvZiB0aGUKK3Byb2R1Y3Rpb24gZGJ1cyBsaWJyYXJ5IGFuZCBwcm9ncmFtcy4gTW9zdCBvZiB0aGVtIGNhbiBiZSBpbnN0YWxsZWQKK2Fsb25nc2lkZSB0aGUgbGlicmFyeSBhbmQgcHJvZ3JhbXMgYnkgY29uZmlndXJpbmcgd2l0aAorYC0tZW5hYmxlLWluc3RhbGxlZC10ZXN0c2AuCisKK1RoZSAqZW1iZWRkZWQgdGVzdHMqIGFyZSBlbmFibGVkIGJ5IGNvbmZpZ3VyaW5nIHdpdGgKK2AtLWVuYWJsZS1lbWJlZGRlZC10ZXN0c2AuIFVubGlrZSB0aGUgbW9kdWxhciB0ZXN0cywgZW5hYmxpbmcgdGhlCitlbWJlZGRlZCB0ZXN0cyBhZGRzIHNwZWNpYWwgY29kZSB0byBsaWJkYnVzIGFuZCBkYnVzLWRhZW1vbiwgc29tZSBvZgord2hpY2ggbWF5IGhhcm0gcGVyZm9ybWFuY2Ugb3Igc2VjdXJpdHkuIEEgcHJvZHVjdGlvbiB2ZXJzaW9uIG9mIGRidXMKK3RoYXQgd2lsbCBiZSBpbmNsdWRlZCBpbiBhbiBvcGVyYXRpbmcgc3lzdGVtIHNob3VsZCBuZXZlciBoYXZlIHRoZQorZW1iZWRkZWQgdGVzdHMgZW5hYmxlZC4KKworSWYgcG9zc2libGUsIG5ldyB0ZXN0IGNvdmVyYWdlIHNob3VsZCBiZSBwcm92aWRlZCB2aWEgbW9kdWxhciB0ZXN0cywKK3ByZWZlcmFibHkgdXNpbmcgR0xpYidzIEdUZXN0IGZyYW1ld29yay4gYHRlc3QvZGJ1cy1kYWVtb24uY2AgaXMgYSBnb29kCitleGFtcGxlLgorCisjIyBJbmZvcm1hdGlvbiBmb3IgbWFpbnRhaW5lcnMKKworVGhpcyBzZWN0aW9uIGlzIG5vdCBkaXJlY3RseSByZWxldmFudCB0byBpbmZyZXF1ZW50IGNvbnRyaWJ1dG9ycy4KKworIyMjIFJlbGVhc2luZworCitUbyBtYWtlIGEgcmVsZWFzZSBvZiBELUJ1cywgZG8gdGhlIGZvbGxvd2luZzoKKworIC0gY2hlY2sgb3V0IGEgZnJlc2ggY29weSBmcm9tIEdpdAorCisgLSB2ZXJpZnkgdGhhdCB0aGUgbGlidG9vbCB2ZXJzaW9uaW5nL2xpYnJhcnkgc29uYW1lIGlzCisgICBjaGFuZ2VkIGlmIGl0IG5lZWRzIHRvIGJlLCBvciBub3QgY2hhbmdlZCBpZiBub3QKKworIC0gdXBkYXRlIHRoZSBmaWxlIE5FV1MgYmFzZWQgb24gdGhlIGdpdCBoaXN0b3J5CisKKyAtIHZlcmlmeSB0aGF0IHRoZSB2ZXJzaW9uIG51bWJlciBvZiBkYnVzLXNwZWNpZmljYXRpb24ueG1sIGlzCisgICBjaGFuZ2VkIGlmIGl0IG5lZWRzIHRvIGJlOyBpZiBjaGFuZ2VzIGhhdmUgYmVlbiBtYWRlLCB1cGRhdGUgdGhlCisgICByZWxlYXNlIGRhdGUgaW4gdGhhdCBmaWxlCisKKyAtIHVwZGF0ZSB0aGUgQVVUSE9SUyBmaWxlIHdpdGggIm1ha2UgdXBkYXRlLWF1dGhvcnMiIGlmIG5lY2Vzc2FyeQorCisgLSB0aGUgdmVyc2lvbiBudW1iZXIgc2hvdWxkIGhhdmUgbWFqb3IubWlub3IubWljcm8sIGV2ZW4KKyAgIGlmIG1pY3JvIGlzIDAsIGkuZS4gIjEuMC4wIiBhbmQgIjEuMi4wIiBub3QgIjEuMCIvIjEuMiI7IHRoZSBtaWNybworICAgdmVyc2lvbiBzaG91bGQgYmUgZXZlbiBmb3IgcmVsZWFzZXMsIGFuZCBvZGQgZm9yIGludGVybWVkaWF0ZSBzbmFwc2hvdHMKKworIC0gIm1ha2UgZGlzdGNoZWNrIiAoRE8gTk9UIGp1c3QgIm1ha2UgZGlzdCIgLSBwYXNzIHRoZSBjaGVjayEpCisKKyAtIGlmIG1ha2UgZGlzdGNoZWNrIGZhaWxzLCBmaXggaXQuCisKKyAtIG9uY2UgZGlzdGNoZWNrIHN1Y2NlZWRzLCAiZ2l0IGNvbW1pdCAtYSIuICBUaGlzIGlzIHRoZSB2ZXJzaW9uCisgICBvZiB0aGUgdHJlZSB0aGF0IGNvcnJlc3BvbmRzIGV4YWN0bHkgdG8gdGhlIHJlbGVhc2VkIHRhcmJhbGwuCisKKyAtIHRhZyB0aGUgdHJlZSB3aXRoICJnaXQgdGFnIC1zIC1tICdSZWxlYXNlZCBYLlkuWicgZGJ1cy1YLlkuWiIKKyAgIHdoZXJlIFguWS5aIGlzIHRoZSB2ZXJzaW9uIG9mIHRoZSByZWxlYXNlLiAgSWYgeW91IGNhbid0IHNpZ24KKyAgIHRoZW4gc2ltcGx5IGNyZWF0ZWQgYW4gdW5zaWduZWQgYW5ub3RhdGVkIHRhZzoKKyAgICJnaXQgdGFnIC1hIC1tICdSZWxlYXNlZCBYLlkuWicgZGJ1cy1YLlkuWiIuCisKKyAtIGJ1bXAgdGhlIHZlcnNpb24gbnVtYmVyIHVwIGluIGNvbmZpZ3VyZS5hYyAoc28gdGhlIG1pY3JvIHZlcnNpb24gaXMgb2RkKSwKKyAgIGFuZCBjb21taXQgaXQuICBNYWtlIHN1cmUgeW91IGRvIHRoaXMgKmFmdGVyKiB0YWdnaW5nIHRoZSBwcmV2aW91cworICAgcmVsZWFzZSEgVGhlIGlkZWEgaXMgdGhhdCBnaXQgaGFzIGEgbmV3ZXIgdmVyc2lvbiBudW1iZXIKKyAgIHRoYW4gYW55dGhpbmcgcmVsZWFzZWQuIFNpbWlsYXJseSwgYnVtcCB0aGUgdmVyc2lvbiBudW1iZXIgb2YKKyAgIGRidXMtc3BlY2lmaWNhdGlvbi54bWwgYW5kIHNldCB0aGUgcmVsZWFzZSBkYXRlIHRvICIobm90IGZpbmFsaXplZCkiLgorCisgLSBtZXJnZSB0aGUgYnJhbmNoIHlvdSd2ZSByZWxlYXNlZCB0byB0aGUgY2hyb25vbG9naWNhbGx5LWxhdGVyCisgICBicmFuY2ggKHVzdWFsbHkgIm1hc3RlciIpLiBZb3UnbGwgcHJvYmFibHkgaGF2ZSB0byBmaXggYSBtZXJnZQorICAgY29uZmxpY3QgaW4gY29uZmlndXJlLmFjICh0aGUgdmVyc2lvbiBudW1iZXIpLgorCisgLSBwdXNoIHlvdXIgY2hhbmdlcyBhbmQgdGhlIHRhZyB0byB0aGUgY2VudHJhbCByZXBvc2l0b3J5IHdpdGgKKyAgICAgZ2l0IHB1c2ggb3JpZ2luIG1hc3RlciBkYnVzLVguWSBkYnVzLVguWS5aCisKKyAtIHNjcCB5b3VyIHRhcmJhbGwgdG8gZnJlZWRlc2t0b3Aub3JnIHNlcnZlciBhbmQgY29weSBpdCB0bworICAgZGJ1cy5mcmVlZGVza3RvcC5vcmc6L3Nydi9kYnVzLmZyZWVkZXNrdG9wLm9yZy93d3cvcmVsZWFzZXMvZGJ1cy9kYnVzLVguWS5aLnRhci5nei4KKyAgIFRoaXMgc2hvdWxkIGJlIHBvc3NpYmxlIGlmIHlvdSdyZSBpbiBncm91cCAiZGJ1cyIKKworIC0gVXBkYXRlIHRoZSBvbmxpbmUgZG9jdW1lbnRhdGlvbiB3aXRoIGBtYWtlIC1DIGRvYyBtYWludGFpbmVyLXVwbG9hZC1kb2NzYC4KKworIC0gdXBkYXRlIHRoZSB3aWtpIHBhZ2UgaHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvU29mdHdhcmUvZGJ1cyBieQorICAgYWRkaW5nIHRoZSBuZXcgcmVsZWFzZSB1bmRlciB0aGUgRG93bmxvYWQgaGVhZGluZy4gVGhlbiwgY3V0IHRoZQorICAgbGluayBhbmQgY2hhbmdlbG9nIGZvciB0aGUgcHJldmlvdXMgdGhhdCB3YXMgdGhlcmUuCisKKyAtIHBvc3QgdG8gZGJ1c0BsaXN0cy5mcmVlZGVza3RvcC5vcmcgYW5ub3VuY2luZyB0aGUgcmVsZWFzZS4KKworIyMjIE1ha2luZyBhICIuMCIgc3RhYmxlIHJlbGVhc2UKKworV2UgY3JlYXRlIGEgYnJhbmNoIGZvciBlYWNoIHN0YWJsZSByZWxlYXNlLiBUaGUgYnJhbmNoIG5hbWUgc2hvdWxkIGJlCitkYnVzLVguWSB3aGljaCBpcyBhIGJyYW5jaCB0aGF0IGhhcyByZWxlYXNlcyB2ZXJzaW9uZWQgWC5ZLlo7CitjaGFuZ2VzIG9uIGEgc3RhYmxlIGJyYW5jaCBzaG91bGQgYmUgbGltaXRlZCB0byBzaWduaWZpY2FudCBidWcgZml4ZXMuCisKK0JlY2F1c2Ugd2Ugd29uJ3QgbWFrZSBtaW5vciBjaGFuZ2VzIGxpa2Uga2VlcGluZyB1cCB3aXRoIHRoZSBsYXRlc3QKK2RlcHJlY2F0aW9ucyBvbiBhIHN0YWJsZSBicmFuY2gsIHN0YWJsZSBicmFuY2hlcyBzaG91bGQgdHVybiBvZmYgdGhlCitnY2Mgd2FybmluZyBmb3IgZGVwcmVjYXRlZCBkZWNsYXJhdGlvbnMgKGUuZy4gc2VlIGNvbW1pdCA0ZWJiMjc1YWI3KS4KKworQmUgZXh0cmEtY2FyZWZ1bCBub3QgdG8gbWVyZ2UgbWFzdGVyIChvciBhbnkgYnJhbmNoIGJhc2VkIG9uIG1hc3RlcikgaW50byBhCitzdGFibGUgYnJhbmNoLgorCitUbyBicmFuY2g6CisKKyAgICBnaXQgYnJhbmNoIGRidXMtWC5ZCisKK2FuZCB1cGxvYWQgdGhlIGJyYW5jaCB0YWcgdG8gdGhlIHNlcnZlcjoKKworICAgIGdpdCBwdXNoIG9yaWdpbiBkYnVzLVguWQorCitUbyBkZXZlbG9wIGluIHRoaXMgYnJhbmNoOgorCisgICAgZ2l0IGNoZWNrb3V0IGRidXMtWC5ZCisKKyMjIyBDb2RlIHJldmlld3MKKworVGhlIGNvbW1pdCBydWxlcyBhcmUgYXBwcm94aW1hdGVseSB0aGVzZToKKworIC0gRml4ZXMgdGhhdCBkb24ndCBhZmZlY3QgQVBJIG9yIHByb3RvY29sIGNhbiBiZSBjb21taXR0ZWQKKyAgIGlmIGFueSBvbmUgcXVhbGlmaWVkIHJldmlld2VyIG90aGVyIHRoYW4gcGF0Y2ggYXV0aG9yCisgICByZXZpZXdzIGFuZCBhcHByb3ZlcworCisgLSBGb3IgZml4ZXMgdGhhdCBkbyBhZmZlY3QgQVBJIG9yIHByb3RvY29sLCB0d28gcGVvcGxlCisgICBpbiB0aGUgcmV2aWV3ZXIgZ3JvdXAgaGF2ZSB0byByZXZpZXcgYW5kIGFwcHJvdmUgdGhlIGNvbW1pdC4KKworIC0gSWYgdGhlcmUncyBhIGxpdmUgdW5yZXNvbHZlZCBjb250cm92ZXJzeSBhYm91dCBhIGNoYW5nZSwKKyAgIGRvbid0IGNvbW1pdCBpdCB3aGlsZSB0aGUgYXJndW1lbnQgaXMgc3RpbGwgcmFnaW5nLgorCisgLSBBdCB0aGVpciBkaXNjcmV0aW9uLCBtZW1iZXJzIG9mIHRoZSByZXZpZXdlciBncm91cCBtYXkgYWxzbyBjb21taXQKKyAgIGJyYW5jaGVzL3BhdGNoZXMgdW5kZXIgdGhlc2UgY29uZGl0aW9uczoKKworICAgLSB0aGUgYnJhbmNoIGRvZXMgbm90IGFkZCBvciBjaGFuZ2UgQVBJLCBBQkkgb3Igd2lyZS1wcm90b2NvbAorCisgICAtIHRoZSBicmFuY2ggc29sdmVzIGEga25vd24gcHJvYmxlbSBhbmQgaXMgY292ZXJlZCBieSB0aGUgcmVncmVzc2lvbiB0ZXN0cworCisgICAtIHRoZXJlIGFyZSBubyBvYmplY3Rpb25zIGZyb20gdGhlIHJlc3Qgb2YgdGhlIHJldmlldyBncm91cCB3aXRoaW4KKyAgICAgYSB3ZWVrIG9mIHRoZSBtZXJnZSByZXF1ZXN0IGJlaW5nIG9wZW5lZAorCisgICAtIHRoZSBjb21taXR0ZXIgZ2V0cyBhIHBvc2l0aXZlIHJldmlldyBvbiB0aGUgbWVyZ2UgcmVxdWVzdCBmcm9tIHNvbWVvbmUKKyAgICAgdGhleSBjb25zaWRlciBxdWFsaWZpZWQgdG8gcmV2aWV3IHRoZSBjaGFuZ2UgKGUuZy4gYSBjb2xsZWFndWUgd2l0aCBELUJ1cworICAgICBleHBlcmllbmNlOyBub3QgbmVjZXNzYXJpbHkgYSBtZW1iZXIgb2YgdGhlIHJldmlld2VyIGdyb3VwKQorCisgLSBSZWdhcmRsZXNzIG9mIHJldmlld3MsIHRvIGNvbW1pdCBhIHBhdGNoOgorCisgICAgLSBgbWFrZSBjaGVja2AgbXVzdCBwYXNzCisgICAgLSB0aGUgdGVzdCBzdWl0ZSBtdXN0IGJlIGV4dGVuZGVkIHRvIGNvdmVyIHRoZSBuZXcgY29kZQorICAgICAgYXMgbXVjaCBhcyByZWFzb25hYmx5IGZlYXNpYmxlIChzZWUgVGVzdHMgYWJvdmUpCisgICAgLSB0aGUgcGF0Y2ggaGFzIHRvIGZvbGxvdyB0aGUgcG9ydGFiaWxpdHksIHNlY3VyaXR5LCBhbmQKKyAgICAgIHN0eWxlIGd1aWRlbGluZXMKKyAgICAtIHRoZSBwYXRjaCBzaG91bGQgYXMgbXVjaCBhcyByZWFzb25hYmxlIGRvIG9uZSB0aGluZywKKyAgICAgIG5vdCBtYW55IHVucmVsYXRlZCBjaGFuZ2VzCisKKyAgIE5vIHJldmlld2VyIHNob3VsZCBhcHByb3ZlIGEgcGF0Y2ggd2l0aG91dCB0aGVzZSBhdHRyaWJ1dGVzLCBhbmQKKyAgIGZhaWx1cmUgb24gdGhlc2UgcG9pbnRzIGlzIGdyb3VuZHMgZm9yIHJldmVydGluZyB0aGUgcGF0Y2guCisKK1RoZSByZXZpZXdlciBncm91cCB0aGF0IGNhbiBhcHByb3ZlIHBhdGNoZXMgY29uc2lzdHMgb2YgdGhlIG1lbWJlcnMKK29mIDxodHRwczovL2dpdGxhYi5mcmVlZGVza3RvcC5vcmcvZGJ1cy9kYnVzL3Byb2plY3RfbWVtYmVycz4gd2l0aAorIk1haW50YWluZXIiIG9yICJPd25lciIgc3RhdHVzLgpkaWZmIC0tZ2l0IGEvQ09QWUlORyBiL0NPUFlJTkcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI2MGIxMAotLS0gL2Rldi9udWxsCisrKyBiL0NPUFlJTkcKQEAgLTAsMCArMSw1NTIgQEAKK0QtQnVzIGlzIGxpY2Vuc2VkIHRvIHlvdSB1bmRlciB5b3VyIGNob2ljZSBvZiB0aGUgQWNhZGVtaWMgRnJlZQorTGljZW5zZSB2ZXJzaW9uIDIuMSwgb3IgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKG9yLCBhdCB5b3VyIG9wdGlvbiBhbnkgbGF0ZXIgdmVyc2lvbikuCisKK0JvdGggbGljZW5zZXMgYXJlIGluY2x1ZGVkIGhlcmUuIFNvbWUgb2YgdGhlIHN0YW5kYWxvbmUgYmluYXJpZXMgYXJlCit1bmRlciB0aGUgR1BMIG9ubHk7IGluIHBhcnRpY3VsYXIsIGJ1dCBub3QgbGltaXRlZCB0bywKK3Rvb2xzL2RidXMtY2xlYW51cC1zb2NrZXRzLmMgYW5kIHRlc3QvZGVjb2RlLWdjb3YuYy4gRWFjaCBzb3VyY2UgY29kZQorZmlsZSBpcyBtYXJrZWQgd2l0aCB0aGUgcHJvcGVyIGNvcHlyaWdodCBpbmZvcm1hdGlvbiAtIGlmIHlvdSBmaW5kIGEKK2ZpbGUgdGhhdCBpc24ndCBtYXJrZWQgcGxlYXNlIGJyaW5nIGl0IHRvIG91ciBhdHRlbnRpb24uCisKK1RoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UKK3YuIDIuMQorCitUaGlzIEFjYWRlbWljIEZyZWUgTGljZW5zZSAodGhlICJMaWNlbnNlIikgYXBwbGllcyB0byBhbnkgb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwICh0aGUgIk9yaWdpbmFsIFdvcmsiKSB3aG9zZSBvd25lciAodGhlICJMaWNlbnNvciIpIGhhcyBwbGFjZWQgdGhlIGZvbGxvd2luZyBub3RpY2UgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciB0aGUgT3JpZ2luYWwgV29yazoKKworTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorCisxKSBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gTGljZW5zb3IgaGVyZWJ5IGdyYW50cyBZb3UgYQord29ybGQtd2lkZSwgcm95YWx0eS1mcmVlLCBub24tZXhjbHVzaXZlLCBwZXJwZXR1YWwsIHN1YmxpY2Vuc2VhYmxlCitsaWNlbnNlIHRvIGRvIHRoZSBmb2xsb3dpbmc6CisKK2EpIHRvIHJlcHJvZHVjZSB0aGUgT3JpZ2luYWwgV29yayBpbiBjb3BpZXM7CisKK2IpIHRvIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyAoIkRlcml2YXRpdmUgV29ya3MiKSBiYXNlZCB1cG9uIHRoZSBPcmlnaW5hbCBXb3JrOworCitjKSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgT3JpZ2luYWwgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0byB0aGUgcHVibGljOworCitkKSB0byBwZXJmb3JtIHRoZSBPcmlnaW5hbCBXb3JrIHB1YmxpY2x5OyBhbmQKKworZSkgdG8gZGlzcGxheSB0aGUgT3JpZ2luYWwgV29yayBwdWJsaWNseS4KKworMikgR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIExpY2Vuc29yIGhlcmVieSBncmFudHMgWW91IGEgd29ybGQtd2lkZSwKK3JveWFsdHktZnJlZSwgbm9uLWV4Y2x1c2l2ZSwgcGVycGV0dWFsLCBzdWJsaWNlbnNlYWJsZSBsaWNlbnNlLCB1bmRlcgorcGF0ZW50IGNsYWltcyBvd25lZCBvciBjb250cm9sbGVkIGJ5IHRoZSBMaWNlbnNvciB0aGF0IGFyZSBlbWJvZGllZCBpbgordGhlIE9yaWdpbmFsIFdvcmsgYXMgZnVybmlzaGVkIGJ5IHRoZSBMaWNlbnNvciwgdG8gbWFrZSwgdXNlLCBzZWxsIGFuZAorb2ZmZXIgZm9yIHNhbGUgdGhlIE9yaWdpbmFsIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MuCisKKzMpIEdyYW50IG9mIFNvdXJjZSBDb2RlIExpY2Vuc2UuIFRoZSB0ZXJtICJTb3VyY2UgQ29kZSIgbWVhbnMgdGhlCitwcmVmZXJyZWQgZm9ybSBvZiB0aGUgT3JpZ2luYWwgV29yayBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQgYW5kCithbGwgYXZhaWxhYmxlIGRvY3VtZW50YXRpb24gZGVzY3JpYmluZyBob3cgdG8gbW9kaWZ5IHRoZSBPcmlnaW5hbAorV29yay4gTGljZW5zb3IgaGVyZWJ5IGFncmVlcyB0byBwcm92aWRlIGEgbWFjaGluZS1yZWFkYWJsZSBjb3B5IG9mIHRoZQorU291cmNlIENvZGUgb2YgdGhlIE9yaWdpbmFsIFdvcmsgYWxvbmcgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIE9yaWdpbmFsCitXb3JrIHRoYXQgTGljZW5zb3IgZGlzdHJpYnV0ZXMuIExpY2Vuc29yIHJlc2VydmVzIHRoZSByaWdodCB0byBzYXRpc2Z5Cit0aGlzIG9ibGlnYXRpb24gYnkgcGxhY2luZyBhIG1hY2hpbmUtcmVhZGFibGUgY29weSBvZiB0aGUgU291cmNlIENvZGUKK2luIGFuIGluZm9ybWF0aW9uIHJlcG9zaXRvcnkgcmVhc29uYWJseSBjYWxjdWxhdGVkIHRvIHBlcm1pdAoraW5leHBlbnNpdmUgYW5kIGNvbnZlbmllbnQgYWNjZXNzIGJ5IFlvdSBmb3IgYXMgbG9uZyBhcyBMaWNlbnNvcgorY29udGludWVzIHRvIGRpc3RyaWJ1dGUgdGhlIE9yaWdpbmFsIFdvcmssIGFuZCBieSBwdWJsaXNoaW5nIHRoZQorYWRkcmVzcyBvZiB0aGF0IGluZm9ybWF0aW9uIHJlcG9zaXRvcnkgaW4gYSBub3RpY2UgaW1tZWRpYXRlbHkKK2ZvbGxvd2luZyB0aGUgY29weXJpZ2h0IG5vdGljZSB0aGF0IGFwcGxpZXMgdG8gdGhlIE9yaWdpbmFsIFdvcmsuCisKKzQpIEV4Y2x1c2lvbnMgRnJvbSBMaWNlbnNlIEdyYW50LiBOZWl0aGVyIHRoZSBuYW1lcyBvZiBMaWNlbnNvciwgbm9yCit0aGUgbmFtZXMgb2YgYW55IGNvbnRyaWJ1dG9ycyB0byB0aGUgT3JpZ2luYWwgV29yaywgbm9yIGFueSBvZiB0aGVpcgordHJhZGVtYXJrcyBvciBzZXJ2aWNlIG1hcmtzLCBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKK3Byb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIE9yaWdpbmFsIFdvcmsgd2l0aG91dCBleHByZXNzIHByaW9yIHdyaXR0ZW4KK3Blcm1pc3Npb24gb2YgdGhlIExpY2Vuc29yLiBOb3RoaW5nIGluIHRoaXMgTGljZW5zZSBzaGFsbCBiZSBkZWVtZWQgdG8KK2dyYW50IGFueSByaWdodHMgdG8gdHJhZGVtYXJrcywgY29weXJpZ2h0cywgcGF0ZW50cywgdHJhZGUgc2VjcmV0cyBvcgorYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBMaWNlbnNvciBleGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAoraGVyZWluLiBObyBwYXRlbnQgbGljZW5zZSBpcyBncmFudGVkIHRvIG1ha2UsIHVzZSwgc2VsbCBvciBvZmZlciB0bworc2VsbCBlbWJvZGltZW50cyBvZiBhbnkgcGF0ZW50IGNsYWltcyBvdGhlciB0aGFuIHRoZSBsaWNlbnNlZCBjbGFpbXMKK2RlZmluZWQgaW4gU2VjdGlvbiAyLiBObyByaWdodCBpcyBncmFudGVkIHRvIHRoZSB0cmFkZW1hcmtzIG9mCitMaWNlbnNvciBldmVuIGlmIHN1Y2ggbWFya3MgYXJlIGluY2x1ZGVkIGluIHRoZSBPcmlnaW5hbCBXb3JrLiBOb3RoaW5nCitpbiB0aGlzIExpY2Vuc2Ugc2hhbGwgYmUgaW50ZXJwcmV0ZWQgdG8gcHJvaGliaXQgTGljZW5zb3IgZnJvbQorbGljZW5zaW5nIHVuZGVyIGRpZmZlcmVudCB0ZXJtcyBmcm9tIHRoaXMgTGljZW5zZSBhbnkgT3JpZ2luYWwgV29yawordGhhdCBMaWNlbnNvciBvdGhlcndpc2Ugd291bGQgaGF2ZSBhIHJpZ2h0IHRvIGxpY2Vuc2UuCisKKzUpIFRoaXMgc2VjdGlvbiBpbnRlbnRpb25hbGx5IG9taXR0ZWQuCisKKzYpIEF0dHJpYnV0aW9uIFJpZ2h0cy4gWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIENvZGUgb2YgYW55CitEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGNyZWF0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50IG9yIHRyYWRlbWFyaworbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgQ29kZSBvZiB0aGUgT3JpZ2luYWwgV29yaywgYXMgd2VsbCBhcyBhbnkKK25vdGljZXMgb2YgbGljZW5zaW5nIGFuZCBhbnkgZGVzY3JpcHRpdmUgdGV4dCBpZGVudGlmaWVkIHRoZXJlaW4gYXMgYW4KKyJBdHRyaWJ1dGlvbiBOb3RpY2UuIiBZb3UgbXVzdCBjYXVzZSB0aGUgU291cmNlIENvZGUgZm9yIGFueQorRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBjcmVhdGUgdG8gY2FycnkgYSBwcm9taW5lbnQgQXR0cmlidXRpb24KK05vdGljZSByZWFzb25hYmx5IGNhbGN1bGF0ZWQgdG8gaW5mb3JtIHJlY2lwaWVudHMgdGhhdCBZb3UgaGF2ZQorbW9kaWZpZWQgdGhlIE9yaWdpbmFsIFdvcmsuCisKKzcpIFdhcnJhbnR5IG9mIFByb3ZlbmFuY2UgYW5kIERpc2NsYWltZXIgb2YgV2FycmFudHkuIExpY2Vuc29yCit3YXJyYW50cyB0aGF0IHRoZSBjb3B5cmlnaHQgaW4gYW5kIHRvIHRoZSBPcmlnaW5hbCBXb3JrIGFuZCB0aGUgcGF0ZW50CityaWdodHMgZ3JhbnRlZCBoZXJlaW4gYnkgTGljZW5zb3IgYXJlIG93bmVkIGJ5IHRoZSBMaWNlbnNvciBvciBhcmUKK3N1YmxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIHdpdGggdGhlIHBlcm1pc3Npb24KK29mIHRoZSBjb250cmlidXRvcihzKSBvZiB0aG9zZSBjb3B5cmlnaHRzIGFuZCBwYXRlbnQgcmlnaHRzLiBFeGNlcHQgYXMKK2V4cHJlc3NseSBzdGF0ZWQgaW4gdGhlIGltbWVkaWF0ZWx5IHByb2NlZWRpbmcgc2VudGVuY2UsIHRoZSBPcmlnaW5hbAorV29yayBpcyBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2Ugb24gYW4gIkFTIElTIiBCQVNJUyBhbmQgV0lUSE9VVAorV0FSUkFOVFksIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLAordGhlIHdhcnJhbnRpZXMgb2YgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKK1BBUlRJQ1VMQVIgUFVSUE9TRS4gVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIE9GIFRIRSBPUklHSU5BTAorV09SSyBJUyBXSVRIIFlPVS4gVGhpcyBESVNDTEFJTUVSIE9GIFdBUlJBTlRZIGNvbnN0aXR1dGVzIGFuIGVzc2VudGlhbAorcGFydCBvZiB0aGlzIExpY2Vuc2UuIE5vIGxpY2Vuc2UgdG8gT3JpZ2luYWwgV29yayBpcyBncmFudGVkIGhlcmV1bmRlcgorZXhjZXB0IHVuZGVyIHRoaXMgZGlzY2xhaW1lci4KKworOCkgTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIFVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgYW5kIHVuZGVyIG5vIGxlZ2FsCit0aGVvcnksIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3IKK290aGVyd2lzZSwgc2hhbGwgdGhlIExpY2Vuc29yIGJlIGxpYWJsZSB0byBhbnkgcGVyc29uIGZvciBhbnkgZGlyZWN0LAoraW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkKK2NoYXJhY3RlciBhcmlzaW5nIGFzIGEgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciB0aGUgdXNlIG9mIHRoZQorT3JpZ2luYWwgV29yayBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgZGFtYWdlcyBmb3IgbG9zcyBvZgorZ29vZHdpbGwsIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQKK2FsbCBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzLiBUaGlzIGxpbWl0YXRpb24gb2YgbGlhYmlsaXR5CitzaGFsbCBub3QgYXBwbHkgdG8gbGlhYmlsaXR5IGZvciBkZWF0aCBvciBwZXJzb25hbCBpbmp1cnkgcmVzdWx0aW5nCitmcm9tIExpY2Vuc29yJ3MgbmVnbGlnZW5jZSB0byB0aGUgZXh0ZW50IGFwcGxpY2FibGUgbGF3IHByb2hpYml0cyBzdWNoCitsaW1pdGF0aW9uLiBTb21lIGp1cmlzZGljdGlvbnMgZG8gbm90IGFsbG93IHRoZSBleGNsdXNpb24gb3IKK2xpbWl0YXRpb24gb2YgaW5jaWRlbnRhbCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHNvIHRoaXMgZXhjbHVzaW9uCithbmQgbGltaXRhdGlvbiBtYXkgbm90IGFwcGx5IHRvIFlvdS4KKworOSkgQWNjZXB0YW5jZSBhbmQgVGVybWluYXRpb24uIElmIFlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKK09yaWdpbmFsIFdvcmsgb3IgYSBEZXJpdmF0aXZlIFdvcmssIFlvdSBtdXN0IG1ha2UgYSByZWFzb25hYmxlIGVmZm9ydAordW5kZXIgdGhlIGNpcmN1bXN0YW5jZXMgdG8gb2J0YWluIHRoZSBleHByZXNzIGFzc2VudCBvZiByZWNpcGllbnRzIHRvCit0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLiBOb3RoaW5nIGVsc2UgYnV0IHRoaXMgTGljZW5zZSAob3IgYW5vdGhlcgord3JpdHRlbiBhZ3JlZW1lbnQgYmV0d2VlbiBMaWNlbnNvciBhbmQgWW91KSBncmFudHMgWW91IHBlcm1pc3Npb24gdG8KK2NyZWF0ZSBEZXJpdmF0aXZlIFdvcmtzIGJhc2VkIHVwb24gdGhlIE9yaWdpbmFsIFdvcmsgb3IgdG8gZXhlcmNpc2UKK2FueSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQgaW4gU2VjdGlvbiAxIGhlcmVpbiwgYW5kIGFueSBhdHRlbXB0IHRvIGRvCitzbyBleGNlcHQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSAob3IgYW5vdGhlciB3cml0dGVuCithZ3JlZW1lbnQgYmV0d2VlbiBMaWNlbnNvciBhbmQgWW91KSBpcyBleHByZXNzbHkgcHJvaGliaXRlZCBieQorVS5TLiBjb3B5cmlnaHQgbGF3LCB0aGUgZXF1aXZhbGVudCBsYXdzIG9mIG90aGVyIGNvdW50cmllcywgYW5kIGJ5CitpbnRlcm5hdGlvbmFsIHRyZWF0eS4gVGhlcmVmb3JlLCBieSBleGVyY2lzaW5nIGFueSBvZiB0aGUgcmlnaHRzCitncmFudGVkIHRvIFlvdSBpbiBTZWN0aW9uIDEgaGVyZWluLCBZb3UgaW5kaWNhdGUgWW91ciBhY2NlcHRhbmNlIG9mCit0aGlzIExpY2Vuc2UgYW5kIGFsbCBvZiBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMuCisKKzEwKSBUZXJtaW5hdGlvbiBmb3IgUGF0ZW50IEFjdGlvbi4gVGhpcyBMaWNlbnNlIHNoYWxsIHRlcm1pbmF0ZQorYXV0b21hdGljYWxseSBhbmQgWW91IG1heSBubyBsb25nZXIgZXhlcmNpc2UgYW55IG9mIHRoZSByaWdodHMgZ3JhbnRlZAordG8gWW91IGJ5IHRoaXMgTGljZW5zZSBhcyBvZiB0aGUgZGF0ZSBZb3UgY29tbWVuY2UgYW4gYWN0aW9uLAoraW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltLCBhZ2FpbnN0IExpY2Vuc29yIG9yIGFueQorbGljZW5zZWUgYWxsZWdpbmcgdGhhdCB0aGUgT3JpZ2luYWwgV29yayBpbmZyaW5nZXMgYSBwYXRlbnQuIFRoaXMKK3Rlcm1pbmF0aW9uIHByb3Zpc2lvbiBzaGFsbCBub3QgYXBwbHkgZm9yIGFuIGFjdGlvbiBhbGxlZ2luZyBwYXRlbnQKK2luZnJpbmdlbWVudCBieSBjb21iaW5hdGlvbnMgb2YgdGhlIE9yaWdpbmFsIFdvcmsgd2l0aCBvdGhlciBzb2Z0d2FyZQorb3IgaGFyZHdhcmUuCisKKzExKSBKdXJpc2RpY3Rpb24sIFZlbnVlIGFuZCBHb3Zlcm5pbmcgTGF3LiBBbnkgYWN0aW9uIG9yIHN1aXQgcmVsYXRpbmcKK3RvIHRoaXMgTGljZW5zZSBtYXkgYmUgYnJvdWdodCBvbmx5IGluIHRoZSBjb3VydHMgb2YgYSBqdXJpc2RpY3Rpb24KK3doZXJlaW4gdGhlIExpY2Vuc29yIHJlc2lkZXMgb3IgaW4gd2hpY2ggTGljZW5zb3IgY29uZHVjdHMgaXRzIHByaW1hcnkKK2J1c2luZXNzLCBhbmQgdW5kZXIgdGhlIGxhd3Mgb2YgdGhhdCBqdXJpc2RpY3Rpb24gZXhjbHVkaW5nIGl0cworY29uZmxpY3Qtb2YtbGF3IHByb3Zpc2lvbnMuIFRoZSBhcHBsaWNhdGlvbiBvZiB0aGUgVW5pdGVkIE5hdGlvbnMKK0NvbnZlbnRpb24gb24gQ29udHJhY3RzIGZvciB0aGUgSW50ZXJuYXRpb25hbCBTYWxlIG9mIEdvb2RzIGlzCitleHByZXNzbHkgZXhjbHVkZWQuIEFueSB1c2Ugb2YgdGhlIE9yaWdpbmFsIFdvcmsgb3V0c2lkZSB0aGUgc2NvcGUgb2YKK3RoaXMgTGljZW5zZSBvciBhZnRlciBpdHMgdGVybWluYXRpb24gc2hhbGwgYmUgc3ViamVjdCB0byB0aGUKK3JlcXVpcmVtZW50cyBhbmQgcGVuYWx0aWVzIG9mIHRoZSBVLlMuIENvcHlyaWdodCBBY3QsIDE3IFUuUy5DLiDDgsKnIDEwMQorZXQgc2VxLiwgdGhlIGVxdWl2YWxlbnQgbGF3cyBvZiBvdGhlciBjb3VudHJpZXMsIGFuZCBpbnRlcm5hdGlvbmFsCit0cmVhdHkuIFRoaXMgc2VjdGlvbiBzaGFsbCBzdXJ2aXZlIHRoZSB0ZXJtaW5hdGlvbiBvZiB0aGlzIExpY2Vuc2UuCisKKzEyKSBBdHRvcm5leXMgRmVlcy4gSW4gYW55IGFjdGlvbiB0byBlbmZvcmNlIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UKK29yIHNlZWtpbmcgZGFtYWdlcyByZWxhdGluZyB0aGVyZXRvLCB0aGUgcHJldmFpbGluZyBwYXJ0eSBzaGFsbCBiZQorZW50aXRsZWQgdG8gcmVjb3ZlciBpdHMgY29zdHMgYW5kIGV4cGVuc2VzLCBpbmNsdWRpbmcsIHdpdGhvdXQKK2xpbWl0YXRpb24sIHJlYXNvbmFibGUgYXR0b3JuZXlzJyBmZWVzIGFuZCBjb3N0cyBpbmN1cnJlZCBpbgorY29ubmVjdGlvbiB3aXRoIHN1Y2ggYWN0aW9uLCBpbmNsdWRpbmcgYW55IGFwcGVhbCBvZiBzdWNoIGFjdGlvbi4gVGhpcworc2VjdGlvbiBzaGFsbCBzdXJ2aXZlIHRoZSB0ZXJtaW5hdGlvbiBvZiB0aGlzIExpY2Vuc2UuCisKKzEzKSBNaXNjZWxsYW5lb3VzLiBUaGlzIExpY2Vuc2UgcmVwcmVzZW50cyB0aGUgY29tcGxldGUgYWdyZWVtZW50Citjb25jZXJuaW5nIHRoZSBzdWJqZWN0IG1hdHRlciBoZXJlb2YuIElmIGFueSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlCitpcyBoZWxkIHRvIGJlIHVuZW5mb3JjZWFibGUsIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIG9ubHkgdG8KK3RoZSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2UgaXQgZW5mb3JjZWFibGUuCisKKzE0KSBEZWZpbml0aW9uIG9mICJZb3UiIGluIFRoaXMgTGljZW5zZS4gIllvdSIgdGhyb3VnaG91dCB0aGlzCitMaWNlbnNlLCB3aGV0aGVyIGluIHVwcGVyIG9yIGxvd2VyIGNhc2UsIG1lYW5zIGFuIGluZGl2aWR1YWwgb3IgYQorbGVnYWwgZW50aXR5IGV4ZXJjaXNpbmcgcmlnaHRzIHVuZGVyLCBhbmQgY29tcGx5aW5nIHdpdGggYWxsIG9mIHRoZQordGVybXMgb2YsIHRoaXMgTGljZW5zZS4gRm9yIGxlZ2FsIGVudGl0aWVzLCAiWW91IiBpbmNsdWRlcyBhbnkgZW50aXR5Cit0aGF0IGNvbnRyb2xzLCBpcyBjb250cm9sbGVkIGJ5LCBvciBpcyB1bmRlciBjb21tb24gY29udHJvbCB3aXRoCit5b3UuIEZvciBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLAorZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaAorZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkKK3BlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsCitvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCisKKzE1KSBSaWdodCB0byBVc2UuIFlvdSBtYXkgdXNlIHRoZSBPcmlnaW5hbCBXb3JrIGluIGFsbCB3YXlzIG5vdAorb3RoZXJ3aXNlIHJlc3RyaWN0ZWQgb3IgY29uZGl0aW9uZWQgYnkgdGhpcyBMaWNlbnNlIG9yIGJ5IGxhdywgYW5kCitMaWNlbnNvciBwcm9taXNlcyBub3QgdG8gaW50ZXJmZXJlIHdpdGggb3IgYmUgcmVzcG9uc2libGUgZm9yIHN1Y2gKK3VzZXMgYnkgWW91LgorCitUaGlzIGxpY2Vuc2UgaXMgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDQgTGF3cmVuY2UgRS4gUm9zZW4uIEFsbCByaWdodHMKK3Jlc2VydmVkLiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhpcworbGljZW5zZSB3aXRob3V0IG1vZGlmaWNhdGlvbi4gVGhpcyBsaWNlbnNlIG1heSBub3QgYmUgbW9kaWZpZWQgd2l0aG91dAordGhlIGV4cHJlc3Mgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIGl0cyBjb3B5cmlnaHQgb3duZXIuCisKKworLS0gCitFTkQgT0YgQUNBREVNSUMgRlJFRSBMSUNFTlNFLiBUaGUgZm9sbG93aW5nIGlzIGludGVuZGVkIHRvIGRlc2NyaWJlIHRoZSBlc3NlbnRpYWwgCitkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgKEFGTCkgdmVyc2lvbiAxLjAgYW5kIG90aGVyIAorb3BlbiBzb3VyY2UgbGljZW5zZXM6CisKK1RoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgaXMgc2ltaWxhciB0byB0aGUgQlNELCBNSVQsIFVvSS9OQ1NBIGFuZCBBcGFjaGUgCitsaWNlbnNlcyBpbiBtYW55IHJlc3BlY3RzIGJ1dCBpdCBpcyBpbnRlbmRlZCB0byBzb2x2ZSBhIGZldyBwcm9ibGVtcyB3aXRoIAordGhvc2UgbGljZW5zZXMuCisgICAgCisqIFRoZSBBRkwgaXMgd3JpdHRlbiBzbyBhcyB0byBtYWtlIGl0IGNsZWFyIHdoYXQgc29mdHdhcmUgaXMgYmVpbmcgCitsaWNlbnNlZCAoYnkgdGhlIGluY2x1c2lvbiBvZiBhIHN0YXRlbWVudCBmb2xsb3dpbmcgdGhlIGNvcHlyaWdodCBub3RpY2UgCitpbiB0aGUgc29mdHdhcmUpLiBUaGlzIHdheSwgdGhlIGxpY2Vuc2UgZnVuY3Rpb25zIGJldHRlciB0aGFuIGEgdGVtcGxhdGUgCitsaWNlbnNlLiBUaGUgQlNELCBNSVQgYW5kIFVvSS9OQ1NBIGxpY2Vuc2VzIGFwcGx5IHRvIHVuaWRlbnRpZmllZCBzb2Z0d2FyZS4KKyAgICAKKyogVGhlIEFGTCBjb250YWlucyBhIGNvbXBsZXRlIGNvcHlyaWdodCBncmFudCB0byB0aGUgc29mdHdhcmUuIFRoZSBCU0QgCithbmQgQXBhY2hlIGxpY2Vuc2VzIGFyZSB2YWd1ZSBhbmQgaW5jb21wbGV0ZSBpbiB0aGF0IHJlc3BlY3QuCisgICAgCisqIFRoZSBBRkwgY29udGFpbnMgYSBjb21wbGV0ZSBwYXRlbnQgZ3JhbnQgdG8gdGhlIHNvZnR3YXJlLiBUaGUgQlNELCBNSVQsIAorVW9JL05DU0EgYW5kIEFwYWNoZSBsaWNlbnNlcyByZWx5IG9uIGFuIGltcGxpZWQgcGF0ZW50IGxpY2Vuc2UgYW5kIGNvbnRhaW4gCitubyBleHBsaWNpdCBwYXRlbnQgZ3JhbnQuCisgICAgCisqIFRoZSBBRkwgbWFrZXMgaXQgY2xlYXIgdGhhdCBubyB0cmFkZW1hcmsgcmlnaHRzIGFyZSBncmFudGVkIHRvIHRoZSAKK2xpY2Vuc29yJ3MgdHJhZGVtYXJrcy4gVGhlIEFwYWNoZSBsaWNlbnNlIGNvbnRhaW5zIHN1Y2ggYSBwcm92aXNpb24sIGJ1dCB0aGUgCitCU0QsIE1JVCBhbmQgVW9JL05DU0EgbGljZW5zZXMgZG8gbm90LgorICAgIAorKiBUaGUgQUZMIGluY2x1ZGVzIHRoZSB3YXJyYW50eSBieSB0aGUgbGljZW5zb3IgdGhhdCBpdCBlaXRoZXIgb3ducyB0aGUgCitjb3B5cmlnaHQgb3IgdGhhdCBpdCBpcyBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlIHVuZGVyIGEgbGljZW5zZS4gTm9uZSBvZiAKK3RoZSBvdGhlciBsaWNlbnNlcyBjb250YWluIHRoYXQgd2FycmFudHkuIEFsbCBvdGhlciB3YXJyYW50aWVzIGFyZSBkaXNjbGFpbWVkLCAKK2FzIGlzIHRoZSBjYXNlIGZvciB0aGUgb3RoZXIgbGljZW5zZXMuCisKKyogVGhlIEFGTCBpcyBpdHNlbGYgY29weXJpZ2h0ZWQgKHdpdGggdGhlIHJpZ2h0IGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSAKK3dpdGhvdXQgbW9kaWZpY2F0aW9uKS4gVGhpcyBlbnN1cmVzIHRoYXQgdGhlIG93bmVyIG9mIHRoZSBjb3B5cmlnaHQgdG8gdGhlIAorbGljZW5zZSB3aWxsIGNvbnRyb2wgY2hhbmdlcy4gVGhlIEFwYWNoZSBsaWNlbnNlIGNvbnRhaW5zIGEgY29weXJpZ2h0IG5vdGljZSwgCitidXQgdGhlIEJTRCwgTUlUIGFuZCBVb0kvTkNTQSBsaWNlbnNlcyBkbyBub3QuIAorLS0KK1NUQVJUIE9GIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCistLQorCisJCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorCQkgICAgICAgVmVyc2lvbiAyLCBKdW5lIDE5OTEKKworIENvcHlyaWdodCAoQykgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcworIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgorCisJCQkgICAgUHJlYW1ibGUKKworICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyCitmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworTGljZW5zZSBpcyBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgZnJlZQorc29mdHdhcmUtLXRvIG1ha2Ugc3VyZSB0aGUgc29mdHdhcmUgaXMgZnJlZSBmb3IgYWxsIGl0cyB1c2Vycy4gIFRoaXMKK0dlbmVyYWwgUHVibGljIExpY2Vuc2UgYXBwbGllcyB0byBtb3N0IG9mIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uJ3Mgc29mdHdhcmUgYW5kIHRvIGFueSBvdGhlciBwcm9ncmFtIHdob3NlIGF1dGhvcnMgY29tbWl0IHRvCit1c2luZyBpdC4gIChTb21lIG90aGVyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBzb2Z0d2FyZSBpcyBjb3ZlcmVkIGJ5Cit0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpbnN0ZWFkLikgIFlvdSBjYW4gYXBwbHkgaXQgdG8KK3lvdXIgcHJvZ3JhbXMsIHRvby4KKworICBXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSwgbm90CitwcmljZS4gIE91ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQgeW91CitoYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UgZm9yCit0aGlzIHNlcnZpY2UgaWYgeW91IHdpc2gpLCB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQgaXQKK2lmIHlvdSB3YW50IGl0LCB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBzb2Z0d2FyZSBvciB1c2UgcGllY2VzIG9mIGl0CitpbiBuZXcgZnJlZSBwcm9ncmFtczsgYW5kIHRoYXQgeW91IGtub3cgeW91IGNhbiBkbyB0aGVzZSB0aGluZ3MuCisKKyAgVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBtYWtlIHJlc3RyaWN0aW9ucyB0aGF0IGZvcmJpZAorYW55b25lIHRvIGRlbnkgeW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91IHRvIHN1cnJlbmRlciB0aGUgcmlnaHRzLgorVGhlc2UgcmVzdHJpY3Rpb25zIHRyYW5zbGF0ZSB0byBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgZm9yIHlvdSBpZiB5b3UKK2Rpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSwgb3IgaWYgeW91IG1vZGlmeSBpdC4KKworICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHN1Y2ggYSBwcm9ncmFtLCB3aGV0aGVyCitncmF0aXMgb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQKK3lvdSBoYXZlLiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlCitzb3VyY2UgY29kZS4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyCityaWdodHMuCisKKyAgV2UgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIHR3byBzdGVwczogKDEpIGNvcHlyaWdodCB0aGUgc29mdHdhcmUsIGFuZAorKDIpIG9mZmVyIHlvdSB0aGlzIGxpY2Vuc2Ugd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsIHBlcm1pc3Npb24gdG8gY29weSwKK2Rpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGUgc29mdHdhcmUuCisKKyAgQWxzbywgZm9yIGVhY2ggYXV0aG9yJ3MgcHJvdGVjdGlvbiBhbmQgb3Vycywgd2Ugd2FudCB0byBtYWtlIGNlcnRhaW4KK3RoYXQgZXZlcnlvbmUgdW5kZXJzdGFuZHMgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlCitzb2Z0d2FyZS4gIElmIHRoZSBzb2Z0d2FyZSBpcyBtb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgd2UKK3dhbnQgaXRzIHJlY2lwaWVudHMgdG8ga25vdyB0aGF0IHdoYXQgdGhleSBoYXZlIGlzIG5vdCB0aGUgb3JpZ2luYWwsIHNvCit0aGF0IGFueSBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IG90aGVycyB3aWxsIG5vdCByZWZsZWN0IG9uIHRoZSBvcmlnaW5hbAorYXV0aG9ycycgcmVwdXRhdGlvbnMuCisKKyAgRmluYWxseSwgYW55IGZyZWUgcHJvZ3JhbSBpcyB0aHJlYXRlbmVkIGNvbnN0YW50bHkgYnkgc29mdHdhcmUKK3BhdGVudHMuICBXZSB3aXNoIHRvIGF2b2lkIHRoZSBkYW5nZXIgdGhhdCByZWRpc3RyaWJ1dG9ycyBvZiBhIGZyZWUKK3Byb2dyYW0gd2lsbCBpbmRpdmlkdWFsbHkgb2J0YWluIHBhdGVudCBsaWNlbnNlcywgaW4gZWZmZWN0IG1ha2luZyB0aGUKK3Byb2dyYW0gcHJvcHJpZXRhcnkuICBUbyBwcmV2ZW50IHRoaXMsIHdlIGhhdmUgbWFkZSBpdCBjbGVhciB0aGF0IGFueQorcGF0ZW50IG11c3QgYmUgbGljZW5zZWQgZm9yIGV2ZXJ5b25lJ3MgZnJlZSB1c2Ugb3Igbm90IGxpY2Vuc2VkIGF0IGFsbC4KKworICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAorbW9kaWZpY2F0aW9uIGZvbGxvdy4KKwwKKwkJICAgIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgQ09QWUlORywgRElTVFJJQlVUSU9OIEFORCBNT0RJRklDQVRJT04KKworICAwLiBUaGlzIExpY2Vuc2UgYXBwbGllcyB0byBhbnkgcHJvZ3JhbSBvciBvdGhlciB3b3JrIHdoaWNoIGNvbnRhaW5zCithIG5vdGljZSBwbGFjZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXIgc2F5aW5nIGl0IG1heSBiZSBkaXN0cmlidXRlZAordW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoZSAiUHJvZ3JhbSIsIGJlbG93LAorcmVmZXJzIHRvIGFueSBzdWNoIHByb2dyYW0gb3Igd29yaywgYW5kIGEgIndvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0iCittZWFucyBlaXRoZXIgdGhlIFByb2dyYW0gb3IgYW55IGRlcml2YXRpdmUgd29yayB1bmRlciBjb3B5cmlnaHQgbGF3OgordGhhdCBpcyB0byBzYXksIGEgd29yayBjb250YWluaW5nIHRoZSBQcm9ncmFtIG9yIGEgcG9ydGlvbiBvZiBpdCwKK2VpdGhlciB2ZXJiYXRpbSBvciB3aXRoIG1vZGlmaWNhdGlvbnMgYW5kL29yIHRyYW5zbGF0ZWQgaW50byBhbm90aGVyCitsYW5ndWFnZS4gIChIZXJlaW5hZnRlciwgdHJhbnNsYXRpb24gaXMgaW5jbHVkZWQgd2l0aG91dCBsaW1pdGF0aW9uIGluCit0aGUgdGVybSAibW9kaWZpY2F0aW9uIi4pICBFYWNoIGxpY2Vuc2VlIGlzIGFkZHJlc3NlZCBhcyAieW91Ii4KKworQWN0aXZpdGllcyBvdGhlciB0aGFuIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQgbW9kaWZpY2F0aW9uIGFyZSBub3QKK2NvdmVyZWQgYnkgdGhpcyBMaWNlbnNlOyB0aGV5IGFyZSBvdXRzaWRlIGl0cyBzY29wZS4gIFRoZSBhY3Qgb2YKK3J1bm5pbmcgdGhlIFByb2dyYW0gaXMgbm90IHJlc3RyaWN0ZWQsIGFuZCB0aGUgb3V0cHV0IGZyb20gdGhlIFByb2dyYW0KK2lzIGNvdmVyZWQgb25seSBpZiBpdHMgY29udGVudHMgY29uc3RpdHV0ZSBhIHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtIChpbmRlcGVuZGVudCBvZiBoYXZpbmcgYmVlbiBtYWRlIGJ5IHJ1bm5pbmcgdGhlIFByb2dyYW0pLgorV2hldGhlciB0aGF0IGlzIHRydWUgZGVwZW5kcyBvbiB3aGF0IHRoZSBQcm9ncmFtIGRvZXMuCisKKyAgMS4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSdzCitzb3VyY2UgY29kZSBhcyB5b3UgcmVjZWl2ZSBpdCwgaW4gYW55IG1lZGl1bSwgcHJvdmlkZWQgdGhhdCB5b3UKK2NvbnNwaWN1b3VzbHkgYW5kIGFwcHJvcHJpYXRlbHkgcHVibGlzaCBvbiBlYWNoIGNvcHkgYW4gYXBwcm9wcmlhdGUKK2NvcHlyaWdodCBub3RpY2UgYW5kIGRpc2NsYWltZXIgb2Ygd2FycmFudHk7IGtlZXAgaW50YWN0IGFsbCB0aGUKK25vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UgYW5kIHRvIHRoZSBhYnNlbmNlIG9mIGFueSB3YXJyYW50eTsKK2FuZCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBQcm9ncmFtIGEgY29weSBvZiB0aGlzIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhlIFByb2dyYW0uCisKK1lvdSBtYXkgY2hhcmdlIGEgZmVlIGZvciB0aGUgcGh5c2ljYWwgYWN0IG9mIHRyYW5zZmVycmluZyBhIGNvcHksIGFuZAoreW91IG1heSBhdCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eSBwcm90ZWN0aW9uIGluIGV4Y2hhbmdlIGZvciBhIGZlZS4KKworICAyLiBZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIHRoZSBQcm9ncmFtIG9yIGFueSBwb3J0aW9uCitvZiBpdCwgdGh1cyBmb3JtaW5nIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSwgYW5kIGNvcHkgYW5kCitkaXN0cmlidXRlIHN1Y2ggbW9kaWZpY2F0aW9ucyBvciB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDEKK2Fib3ZlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6CisKKyAgICBhKSBZb3UgbXVzdCBjYXVzZSB0aGUgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIGZpbGVzIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLgorCisgICAgYikgWW91IG11c3QgY2F1c2UgYW55IHdvcmsgdGhhdCB5b3UgZGlzdHJpYnV0ZSBvciBwdWJsaXNoLCB0aGF0IGluCisgICAgd2hvbGUgb3IgaW4gcGFydCBjb250YWlucyBvciBpcyBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0gb3IgYW55CisgICAgcGFydCB0aGVyZW9mLCB0byBiZSBsaWNlbnNlZCBhcyBhIHdob2xlIGF0IG5vIGNoYXJnZSB0byBhbGwgdGhpcmQKKyAgICBwYXJ0aWVzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCisKKyAgICBjKSBJZiB0aGUgbW9kaWZpZWQgcHJvZ3JhbSBub3JtYWxseSByZWFkcyBjb21tYW5kcyBpbnRlcmFjdGl2ZWx5CisgICAgd2hlbiBydW4sIHlvdSBtdXN0IGNhdXNlIGl0LCB3aGVuIHN0YXJ0ZWQgcnVubmluZyBmb3Igc3VjaAorICAgIGludGVyYWN0aXZlIHVzZSBpbiB0aGUgbW9zdCBvcmRpbmFyeSB3YXksIHRvIHByaW50IG9yIGRpc3BsYXkgYW4KKyAgICBhbm5vdW5jZW1lbnQgaW5jbHVkaW5nIGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UgYW5kIGEKKyAgICBub3RpY2UgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSAob3IgZWxzZSwgc2F5aW5nIHRoYXQgeW91IHByb3ZpZGUKKyAgICBhIHdhcnJhbnR5KSBhbmQgdGhhdCB1c2VycyBtYXkgcmVkaXN0cmlidXRlIHRoZSBwcm9ncmFtIHVuZGVyCisgICAgdGhlc2UgY29uZGl0aW9ucywgYW5kIHRlbGxpbmcgdGhlIHVzZXIgaG93IHRvIHZpZXcgYSBjb3B5IG9mIHRoaXMKKyAgICBMaWNlbnNlLiAgKEV4Y2VwdGlvbjogaWYgdGhlIFByb2dyYW0gaXRzZWxmIGlzIGludGVyYWN0aXZlIGJ1dAorICAgIGRvZXMgbm90IG5vcm1hbGx5IHByaW50IHN1Y2ggYW4gYW5ub3VuY2VtZW50LCB5b3VyIHdvcmsgYmFzZWQgb24KKyAgICB0aGUgUHJvZ3JhbSBpcyBub3QgcmVxdWlyZWQgdG8gcHJpbnQgYW4gYW5ub3VuY2VtZW50LikKKwwKK1RoZXNlIHJlcXVpcmVtZW50cyBhcHBseSB0byB0aGUgbW9kaWZpZWQgd29yayBhcyBhIHdob2xlLiAgSWYKK2lkZW50aWZpYWJsZSBzZWN0aW9ucyBvZiB0aGF0IHdvcmsgYXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0sCithbmQgY2FuIGJlIHJlYXNvbmFibHkgY29uc2lkZXJlZCBpbmRlcGVuZGVudCBhbmQgc2VwYXJhdGUgd29ya3MgaW4KK3RoZW1zZWx2ZXMsIHRoZW4gdGhpcyBMaWNlbnNlLCBhbmQgaXRzIHRlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2UKK3NlY3Rpb25zIHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZSB3b3Jrcy4gIEJ1dCB3aGVuIHlvdQorZGlzdHJpYnV0ZSB0aGUgc2FtZSBzZWN0aW9ucyBhcyBwYXJ0IG9mIGEgd2hvbGUgd2hpY2ggaXMgYSB3b3JrIGJhc2VkCitvbiB0aGUgUHJvZ3JhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd2hvbGUgbXVzdCBiZSBvbiB0aGUgdGVybXMgb2YKK3RoaXMgTGljZW5zZSwgd2hvc2UgcGVybWlzc2lvbnMgZm9yIG90aGVyIGxpY2Vuc2VlcyBleHRlbmQgdG8gdGhlCitlbnRpcmUgd2hvbGUsIGFuZCB0aHVzIHRvIGVhY2ggYW5kIGV2ZXJ5IHBhcnQgcmVnYXJkbGVzcyBvZiB3aG8gd3JvdGUgaXQuCisKK1RodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdAoreW91ciByaWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsgcmF0aGVyLCB0aGUgaW50ZW50IGlzIHRvCitleGVyY2lzZSB0aGUgcmlnaHQgdG8gY29udHJvbCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRlcml2YXRpdmUgb3IKK2NvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24gdGhlIFByb2dyYW0uCisKK0luIGFkZGl0aW9uLCBtZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgd29yayBub3QgYmFzZWQgb24gdGhlIFByb2dyYW0KK3dpdGggdGhlIFByb2dyYW0gKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtKSBvbiBhIHZvbHVtZSBvZgorYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIKK3RoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgMy4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhIHdvcmsgYmFzZWQgb24gaXQsCit1bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB1bmRlciB0aGUgdGVybXMgb2YKK1NlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBkbyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKworICAgIGEpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUKKyAgICBzb3VyY2UgY29kZSwgd2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMKKyAgICAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKKworICAgIGIpIEFjY29tcGFueSBpdCB3aXRoIGEgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0IGxlYXN0IHRocmVlCisgICAgeWVhcnMsIHRvIGdpdmUgYW55IHRoaXJkIHBhcnR5LCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZSB0aGFuIHlvdXIKKyAgICBjb3N0IG9mIHBoeXNpY2FsbHkgcGVyZm9ybWluZyBzb3VyY2UgZGlzdHJpYnV0aW9uLCBhIGNvbXBsZXRlCisgICAgbWFjaGluZS1yZWFkYWJsZSBjb3B5IG9mIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLCB0byBiZQorICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtCisgICAgY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAorCisgICAgYykgQWNjb21wYW55IGl0IHdpdGggdGhlIGluZm9ybWF0aW9uIHlvdSByZWNlaXZlZCBhcyB0byB0aGUgb2ZmZXIKKyAgICB0byBkaXN0cmlidXRlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUuICAoVGhpcyBhbHRlcm5hdGl2ZSBpcworICAgIGFsbG93ZWQgb25seSBmb3Igbm9uY29tbWVyY2lhbCBkaXN0cmlidXRpb24gYW5kIG9ubHkgaWYgeW91CisgICAgcmVjZWl2ZWQgdGhlIHByb2dyYW0gaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHdpdGggc3VjaAorICAgIGFuIG9mZmVyLCBpbiBhY2NvcmQgd2l0aCBTdWJzZWN0aW9uIGIgYWJvdmUuKQorCitUaGUgc291cmNlIGNvZGUgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsgZm9yCittYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gIEZvciBhbiBleGVjdXRhYmxlIHdvcmssIGNvbXBsZXRlIHNvdXJjZQorY29kZSBtZWFucyBhbGwgdGhlIHNvdXJjZSBjb2RlIGZvciBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cyBhbnkKK2Fzc29jaWF0ZWQgaW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMsIHBsdXMgdGhlIHNjcmlwdHMgdXNlZCB0bworY29udHJvbCBjb21waWxhdGlvbiBhbmQgaW5zdGFsbGF0aW9uIG9mIHRoZSBleGVjdXRhYmxlLiAgSG93ZXZlciwgYXMgYQorc3BlY2lhbCBleGNlcHRpb24sIHRoZSBzb3VyY2UgY29kZSBkaXN0cmlidXRlZCBuZWVkIG5vdCBpbmNsdWRlCithbnl0aGluZyB0aGF0IGlzIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIChpbiBlaXRoZXIgc291cmNlIG9yIGJpbmFyeQorZm9ybSkgd2l0aCB0aGUgbWFqb3IgY29tcG9uZW50cyAoY29tcGlsZXIsIGtlcm5lbCwgYW5kIHNvIG9uKSBvZiB0aGUKK29wZXJhdGluZyBzeXN0ZW0gb24gd2hpY2ggdGhlIGV4ZWN1dGFibGUgcnVucywgdW5sZXNzIHRoYXQgY29tcG9uZW50CitpdHNlbGYgYWNjb21wYW5pZXMgdGhlIGV4ZWN1dGFibGUuCisKK0lmIGRpc3RyaWJ1dGlvbiBvZiBleGVjdXRhYmxlIG9yIG9iamVjdCBjb2RlIGlzIG1hZGUgYnkgb2ZmZXJpbmcKK2FjY2VzcyB0byBjb3B5IGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCB0aGVuIG9mZmVyaW5nIGVxdWl2YWxlbnQKK2FjY2VzcyB0byBjb3B5IHRoZSBzb3VyY2UgY29kZSBmcm9tIHRoZSBzYW1lIHBsYWNlIGNvdW50cyBhcworZGlzdHJpYnV0aW9uIG9mIHRoZSBzb3VyY2UgY29kZSwgZXZlbiB0aG91Z2ggdGhpcmQgcGFydGllcyBhcmUgbm90Citjb21wZWxsZWQgdG8gY29weSB0aGUgc291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLgorDAorICA0LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KK2V4Y2VwdCBhcyBleHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55IGF0dGVtcHQKK290aGVyd2lzZSB0byBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2Ugb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpcwordm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91ciByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLgorSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsIG9yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXIKK3RoaXMgTGljZW5zZSB3aWxsIG5vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzIHRlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoCitwYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuCisKKyAgNS4gWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSwgc2luY2UgeW91IGhhdmUgbm90CitzaWduZWQgaXQuICBIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvcgorZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBvciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gIFRoZXNlIGFjdGlvbnMgYXJlCitwcm9oaWJpdGVkIGJ5IGxhdyBpZiB5b3UgZG8gbm90IGFjY2VwdCB0aGlzIExpY2Vuc2UuICBUaGVyZWZvcmUsIGJ5Cittb2RpZnlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKK1Byb2dyYW0pLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzbywgYW5kCithbGwgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpbmcgb3IgbW9kaWZ5aW5nCit0aGUgUHJvZ3JhbSBvciB3b3JrcyBiYXNlZCBvbiBpdC4KKworICA2LiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtKSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQorb3JpZ2luYWwgbGljZW5zb3IgdG8gY29weSwgZGlzdHJpYnV0ZSBvciBtb2RpZnkgdGhlIFByb2dyYW0gc3ViamVjdCB0bwordGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIKK3Jlc3RyaWN0aW9ucyBvbiB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ugb2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi4KK1lvdSBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHRvCit0aGlzIExpY2Vuc2UuCisKKyAgNy4gSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0aW9uIG9mIHBhdGVudAoraW5mcmluZ2VtZW50IG9yIGZvciBhbnkgb3RoZXIgcmVhc29uIChub3QgbGltaXRlZCB0byBwYXRlbnQgaXNzdWVzKSwKK2NvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3IKK290aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QKK2V4Y3VzZSB5b3UgZnJvbSB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90CitkaXN0cmlidXRlIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzCitMaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91CittYXkgbm90IGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gYXQgYWxsLiAgRm9yIGV4YW1wbGUsIGlmIGEgcGF0ZW50CitsaWNlbnNlIHdvdWxkIG5vdCBwZXJtaXQgcm95YWx0eS1mcmVlIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGJ5CithbGwgdGhvc2Ugd2hvIHJlY2VpdmUgY29waWVzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCB5b3UsIHRoZW4KK3RoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIGl0IGFuZCB0aGlzIExpY2Vuc2Ugd291bGQgYmUgdG8KK3JlZnJhaW4gZW50aXJlbHkgZnJvbSBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0uCisKK0lmIGFueSBwb3J0aW9uIG9mIHRoaXMgc2VjdGlvbiBpcyBoZWxkIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlcgorYW55IHBhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRlbmRlZCB0bworYXBwbHkgYW5kIHRoZSBzZWN0aW9uIGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYXBwbHkgaW4gb3RoZXIKK2NpcmN1bXN0YW5jZXMuCisKK0l0IGlzIG5vdCB0aGUgcHVycG9zZSBvZiB0aGlzIHNlY3Rpb24gdG8gaW5kdWNlIHlvdSB0byBpbmZyaW5nZSBhbnkKK3BhdGVudHMgb3Igb3RoZXIgcHJvcGVydHkgcmlnaHQgY2xhaW1zIG9yIHRvIGNvbnRlc3QgdmFsaWRpdHkgb2YgYW55CitzdWNoIGNsYWltczsgdGhpcyBzZWN0aW9uIGhhcyB0aGUgc29sZSBwdXJwb3NlIG9mIHByb3RlY3RpbmcgdGhlCitpbnRlZ3JpdHkgb2YgdGhlIGZyZWUgc29mdHdhcmUgZGlzdHJpYnV0aW9uIHN5c3RlbSwgd2hpY2ggaXMKK2ltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQorZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAordGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKK3N5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcKK3RvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdAoraW1wb3NlIHRoYXQgY2hvaWNlLgorCitUaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KK2JlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgorDAorICA4LiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIFByb2dyYW0gaXMgcmVzdHJpY3RlZCBpbgorY2VydGFpbiBjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlCitvcmlnaW5hbCBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBMaWNlbnNlCittYXkgYWRkIGFuIGV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcKK3Rob3NlIGNvdW50cmllcywgc28gdGhhdCBkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcKK2NvdW50cmllcyBub3QgdGh1cyBleGNsdWRlZC4gIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcwordGhlIGxpbWl0YXRpb24gYXMgaWYgd3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgOS4gVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMKK29mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLiAgU3VjaCBuZXcgdmVyc2lvbnMgd2lsbAorYmUgc2ltaWxhciBpbiBzcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwgYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvCithZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KKworRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBJZiB0aGUgUHJvZ3JhbQorc3BlY2lmaWVzIGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlIHdoaWNoIGFwcGxpZXMgdG8gaXQgYW5kICJhbnkKK2xhdGVyIHZlcnNpb24iLCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKK2VpdGhlciBvZiB0aGF0IHZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgSWYgdGhlIFByb2dyYW0gZG9lcyBub3Qgc3BlY2lmeSBhIHZlcnNpb24gbnVtYmVyIG9mCit0aGlzIExpY2Vuc2UsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLgorCisgIDEwLiBJZiB5b3Ugd2lzaCB0byBpbmNvcnBvcmF0ZSBwYXJ0cyBvZiB0aGUgUHJvZ3JhbSBpbnRvIG90aGVyIGZyZWUKK3Byb2dyYW1zIHdob3NlIGRpc3RyaWJ1dGlvbiBjb25kaXRpb25zIGFyZSBkaWZmZXJlbnQsIHdyaXRlIHRvIHRoZSBhdXRob3IKK3RvIGFzayBmb3IgcGVybWlzc2lvbi4gIEZvciBzb2Z0d2FyZSB3aGljaCBpcyBjb3B5cmlnaHRlZCBieSB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgd2Ugc29tZXRpbWVzCittYWtlIGV4Y2VwdGlvbnMgZm9yIHRoaXMuICBPdXIgZGVjaXNpb24gd2lsbCBiZSBndWlkZWQgYnkgdGhlIHR3byBnb2Fscworb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMgb2YgYWxsIGRlcml2YXRpdmVzIG9mIG91ciBmcmVlIHNvZnR3YXJlIGFuZAorb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nIGFuZCByZXVzZSBvZiBzb2Z0d2FyZSBnZW5lcmFsbHkuCisKKwkJCSAgICBOTyBXQVJSQU5UWQorCisgIDExLiBCRUNBVVNFIFRIRSBQUk9HUkFNIElTIExJQ0VOU0VEIEZSRUUgT0YgQ0hBUkdFLCBUSEVSRSBJUyBOTyBXQVJSQU5UWQorRk9SIFRIRSBQUk9HUkFNLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVy4gIEVYQ0VQVCBXSEVOCitPVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUiBPVEhFUiBQQVJUSUVTCitQUk9WSURFIFRIRSBQUk9HUkFNICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRAorT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKK01FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBUSEUgRU5USVJFIFJJU0sgQVMKK1RPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgUFJPR1JBTSBJUyBXSVRIIFlPVS4gIFNIT1VMRCBUSEUKK1BST0dSQU0gUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FIFRIRSBDT1NUIE9GIEFMTCBORUNFU1NBUlkgU0VSVklDSU5HLAorUkVQQUlSIE9SIENPUlJFQ1RJT04uCisKKyAgMTIuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4gV1JJVElORworV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZIEFORC9PUgorUkVESVNUUklCVVRFIFRIRSBQUk9HUkFNIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVSBGT1IgREFNQUdFUywKK0lOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORworT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgUFJPR1JBTSAoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRAorVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcgUkVOREVSRUQgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZCitZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBIEZBSUxVUkUgT0YgVEhFIFBST0dSQU0gVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUgorUFJPR1JBTVMpLCBFVkVOIElGIFNVQ0ggSE9MREVSIE9SIE9USEVSIFBBUlRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFCitQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisKKwkJICAgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKwwKKwkgICAgSG93IHRvIEFwcGx5IFRoZXNlIFRlcm1zIHRvIFlvdXIgTmV3IFByb2dyYW1zCisKKyAgSWYgeW91IGRldmVsb3AgYSBuZXcgcHJvZ3JhbSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdAorcG9zc2libGUgdXNlIHRvIHRoZSBwdWJsaWMsIHRoZSBiZXN0IHdheSB0byBhY2hpZXZlIHRoaXMgaXMgdG8gbWFrZSBpdAorZnJlZSBzb2Z0d2FyZSB3aGljaCBldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UgdW5kZXIgdGhlc2UgdGVybXMuCisKKyAgVG8gZG8gc28sIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIHByb2dyYW0uICBJdCBpcyBzYWZlc3QKK3RvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkKK2NvbnZleSB0aGUgZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0Cit0aGUgImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KKworICAgIDxvbmUgbGluZSB0byBnaXZlIHRoZSBwcm9ncmFtJ3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4+CisgICAgQ29weXJpZ2h0IChDKSA8eWVhcj4gIDxuYW1lIG9mIGF1dGhvcj4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCisKK0Fsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLgorCitJZiB0aGUgcHJvZ3JhbSBpcyBpbnRlcmFjdGl2ZSwgbWFrZSBpdCBvdXRwdXQgYSBzaG9ydCBub3RpY2UgbGlrZSB0aGlzCit3aGVuIGl0IHN0YXJ0cyBpbiBhbiBpbnRlcmFjdGl2ZSBtb2RlOgorCisgICAgR25vbW92aXNpb24gdmVyc2lvbiA2OSwgQ29weXJpZ2h0IChDKSB5ZWFyIG5hbWUgb2YgYXV0aG9yCisgICAgR25vbW92aXNpb24gY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZOyBmb3IgZGV0YWlscyB0eXBlIGBzaG93IHcnLgorICAgIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZSwgYW5kIHlvdSBhcmUgd2VsY29tZSB0byByZWRpc3RyaWJ1dGUgaXQKKyAgICB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnM7IHR5cGUgYHNob3cgYycgZm9yIGRldGFpbHMuCisKK1RoZSBoeXBvdGhldGljYWwgY29tbWFuZHMgYHNob3cgdycgYW5kIGBzaG93IGMnIHNob3VsZCBzaG93IHRoZSBhcHByb3ByaWF0ZQorcGFydHMgb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBPZiBjb3Vyc2UsIHRoZSBjb21tYW5kcyB5b3UgdXNlIG1heQorYmUgY2FsbGVkIHNvbWV0aGluZyBvdGhlciB0aGFuIGBzaG93IHcnIGFuZCBgc2hvdyBjJzsgdGhleSBjb3VsZCBldmVuIGJlCittb3VzZS1jbGlja3Mgb3IgbWVudSBpdGVtcy0td2hhdGV2ZXIgc3VpdHMgeW91ciBwcm9ncmFtLgorCitZb3Ugc2hvdWxkIGFsc28gZ2V0IHlvdXIgZW1wbG95ZXIgKGlmIHlvdSB3b3JrIGFzIGEgcHJvZ3JhbW1lcikgb3IgeW91cgorc2Nob29sLCBpZiBhbnksIHRvIHNpZ24gYSAiY29weXJpZ2h0IGRpc2NsYWltZXIiIGZvciB0aGUgcHJvZ3JhbSwgaWYKK25lY2Vzc2FyeS4gIEhlcmUgaXMgYSBzYW1wbGU7IGFsdGVyIHRoZSBuYW1lczoKKworICBZb3lvZHluZSwgSW5jLiwgaGVyZWJ5IGRpc2NsYWltcyBhbGwgY29weXJpZ2h0IGludGVyZXN0IGluIHRoZSBwcm9ncmFtCisgIGBHbm9tb3Zpc2lvbicgKHdoaWNoIG1ha2VzIHBhc3NlcyBhdCBjb21waWxlcnMpIHdyaXR0ZW4gYnkgSmFtZXMgSGFja2VyLgorCisgIDxzaWduYXR1cmUgb2YgVHkgQ29vbj4sIDEgQXByaWwgMTk4OQorICBUeSBDb29uLCBQcmVzaWRlbnQgb2YgVmljZQorCitUaGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZG9lcyBub3QgcGVybWl0IGluY29ycG9yYXRpbmcgeW91ciBwcm9ncmFtIGludG8KK3Byb3ByaWV0YXJ5IHByb2dyYW1zLiAgSWYgeW91ciBwcm9ncmFtIGlzIGEgc3Vicm91dGluZSBsaWJyYXJ5LCB5b3UgbWF5Citjb25zaWRlciBpdCBtb3JlIHVzZWZ1bCB0byBwZXJtaXQgbGlua2luZyBwcm9wcmlldGFyeSBhcHBsaWNhdGlvbnMgd2l0aCB0aGUKK2xpYnJhcnkuICBJZiB0aGlzIGlzIHdoYXQgeW91IHdhbnQgdG8gZG8sIHVzZSB0aGUgR05VIExpYnJhcnkgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgaW5zdGVhZCBvZiB0aGlzIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9DaGFuZ2VMb2cgYi9DaGFuZ2VMb2cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJjMzNkNAotLS0gL2Rldi9udWxsCisrKyBiL0NoYW5nZUxvZwpAQCAtMCwwICsxLDUgQEAKKzIwMDgtMDQtMTYgIEpvaG4gKEo1KSBQYWxtaWVyaSA8am9obnBAcmVkaGF0LmNvbT4KKworCSogdG9vbHMvZGJ1cy1tb25pdG9yLmM6IHRha2Ugb3V0IHRoZSB0cmFpbGluZyBjb21tYSBpbiB0aGUKKwkgIFByb2ZpbGVBdHRyaWJ1dGVGbGFncyBlbnVtIGFzIGl0IGlzbid0IGluIG91ciBzdHlsZSBndWlkZXMKKwkgIGFuZCBjYXVzZXMgc29tZSBjb21waWxlcnMgdG8gZXJyb3Igb3V0CmRpZmYgLS1naXQgYS9DaGFuZ2VMb2cucHJlLTEtMCBiL0NoYW5nZUxvZy5wcmUtMS0wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhYjU5ODIKLS0tIC9kZXYvbnVsbAorKysgYi9DaGFuZ2VMb2cucHJlLTEtMApAQCAtMCwwICsxLDE1MTQ2IEBACisyMDA2LTExLTA5ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBSZWxlYXNlZCAxLjAuMAorCisyMDA2LTExLTA5ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBBVVRIT1JTOiBhZGRlZCBQZXRlciBhbmQgVG9yIG9mIHdpbmRvd3MgcG9ydGluZyBmYW1lCisKKzIwMDYtMTEtMDggIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnhtbDogYWRkIGEgbm90ZSBhYm91dCBwcm90b2NvbCBzdGFiaWxpdHkKKworCSogZG9jL1RPRE86IFJlbW92ZSAiaW1wb3J0YW50IGZvciAxLjAiIHNlY3Rpb24sIHJlcGxhY2Ugd2l0aAorCSJpbXBvcnRhbnQgZm9yIDEuMiIgc2VjdGlvbgorCQorMjAwNi0xMS0wOCAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogUkVBRE1FOiByZW1vdmUgc29tZSBvZiB0aGUgb3V0IG9mIGRhdGUgZmxhZ3MKKworCSogZG9jL1RPRE86IFJlbW92ZSB0b2RvIGl0ZW1zIHdoaWNoIGFyZSBkb25lCisKKzIwMDYtMTEtMDggIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIHRvb2xzL2RidXMtbW9uaXRvci5jOiBIYW5kbGUgc2lnaW50IHNvIHdlIGZsdXNoIHN0ZG91dAorCShQYXRjaCBmcm9tIE9sbGkgU2FsbGkgPG9sbGkgZG90IHNhbGxpIGF0IGNvbGxhYm9yYSBkb3QgY28gZG90IHVrPikKKworMjAwNi0xMS0wOCAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogdG9vbHMvZGJ1cy1tb25pdG9yLjE6IHVwZGF0ZSB0aGUgbWFucGFnZSBmb3IgZGJ1cy1tb25pdG9yCisJKFBhdGNoIGZyb20gT2xsaSBTYWxsaSA8b2xsaSBkb3Qgc2FsbGkgYXQgY29sbGFib3JhIGRvdCBjbyBkb3QgdWs+KQorCisyMDA2LTExLTA4ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBBVVRIT1JTOiBVcGRhdGUgd2l0aCBhbGwgcGVvcGxlIGxpc3RlZCBpbiB0aGUgQ2hhbmdlTG9nCisKKzIwMDYtMTEtMDggIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIHRvb2xzL2RidXMtbW9uaXRvci5jOiBhZGQgcHJvZmlsaW5nIHRvb2xzIHRvIGRidXMtbW9uaXRvcgorCShQYXRjaCBmcm9tIE9sbGkgU2FsbGkgPG9sbGkgZG90IHNhbGxpIGF0IGNvbGxhYm9yYSBkb3QgY28gZG90IHVrPikKKworMjAwNi0xMS0wNyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIEhBQ0tJTkc6IFVwZGF0ZSByZWxlYXNlIGluc3RydWN0aW9ucyB0byBpbmNsdWRlIHN0dWZmIGFib3V0CisJc3RhYmxlIHJlbGVhc2VzLCBicmFuY2hpbmcsIGV0Yy4gTWF5IG5vdCBiZSB0b3RhbGx5IGNvcnJlY3QsCisJcGxlYXNlIGZpeCBpZiBuZWVkZWQsIGJ1dCBrZWVwIGluc3RydWN0aW9ucyB1cC10by1kYXRlIHNvIHdlIGRvCisJZWFjaCBzdGFibGUgcmVsZWFzZSBjb25zaXN0ZW50bHkgaW4gdGhlIGZ1dHVyZS4KKworMjAwNi0xMS0wNyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRvYy9kYnVzLXNwZWNpZmljYXRpb24ueG1sLCBkb2MvZGJ1cy1mYXEueG1sLCBSRUFETUU6IHZhcmlvdXMKKwlkb2N1bWVudGF0aW9uIHVwZGF0ZXMuIEJ1bXAgZmFxL3NwZWMgdmVyc2lvbnMgKG5vdCB0byAxLjA7IEkgZG9uJ3QKKwl0aGluayB0aGUgc3BlYyB3aWxsIGJlICJmaW5pc2hlZCIvMS4wIHdoZW4gd2Ugc2hpcCB0aGUgMS4wIGxpYnJhcnkpLgorCisyMDA2LTExLTA2ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBidXMvYnVzLmM6IE1pc3NlZCBwYXRjaCAtIHBhc3MgaW4gdGhlIGNvbnRleHQgdG8gdGhlIGRpcmVjdG9yeSB3YXRjaAorCisyMDA2LTExLTAyICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBSZWxlYXNlZCBELUJ1cyAxLjAgUkMgMygwLjk1KQorCisyMDA2LTExLTAyICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBidXMvYWN0aXZhdGlvbi5jIChidXNfYWN0aXZhdGlvbl9uZXcpOiBkb24ndCBmYWlsIGlmIHdlIGNhbiBub3QgcmVhZAorCXRoZSBkaXJlY3RvcnkgYXMgaXQgbWF5IG5vdCBleGlzdAorCisyMDA2LTExLTAyICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBidXMvY29uZmlnLXBhcnNlci5jIChzZXJ2aWNlX2RpcnNfZmluZF9kaXIpOiB1c2UgCisJX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rIHNvIHdlIGRvbid0IGdldCBzdHVjayBpbiBhbiBpbmZpbml0ZSBsb29wCisJKHN0YXJ0X2J1c2NvbmZpZ19jaGlsZCk6IG1vdmUgcHJvY2Vzc2luZyBvZiBzdGFuZGFyZF9zZXNzaW9uX3NlcnZpY2VkaXJzCisJdGFncyBoZXJlIGJlY2F1c2UgdGhleSBoYXZlIG5vIGNvbnRlbnQKKwkoYnVzX2NvbmZpZ19wYXJzZXJfY29udGVudCk6IGNoZWNrIHdlIGRvbid0IGhhdmUgY29udGVudCBpbiAKKwlzdGFuZGFyZF9zZXNzaW9uX3NlcnZpY2VkaXJzIHRhZworCisyMDA2LTExLTAyICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiB0b29scy9NYWtlZmlsZS5hbTogTWFrZSBzdXJlIHRoZSAvdmFyL2xpYi9kYnVzIGRpcmVjdG9yeSBpcyBjcmVhdGVkCisJUGFja2FnZXJzIG5lZWQgdG8gb3duIHRoaXMgZGlyZWN0b3J5CisKKzIwMDYtMTEtMDIgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIHRvb2xzL3J1bi13aXRoLXRtcC1zZXNzaW9uLWJ1cy5zaDogZml4ZWQgc2NyaXB0IHRvIHJlcGxhY2UgdGhlIAorCTxzdGFuZGFyZF9zZXNzaW9uX3NlcnZpY2VkaXJzPiB0YWcgd2l0aCBhIDxzZXZpY2VkaXI+IHRhZyB0aGF0CisJcG9pbnRzIHRvIHRoZSB0ZXN0IHNlcnZpY2UgZGlyZWN0b3J5CisKKzIwMDYtMTEtMDIgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogQWRkIGEgY2hlY2sgZm9yIERJUiAqZGlycC0+ZGRfZmQKKworCSogZGJ1cy9kYnVzLXN5c2RlcHMtdXRpbC11bml4OiBpZiBIQVZFX0RERkQgaXMgZGVmaW5lZCB1c2UgCisJRElSICpkaXJwLT5kZF9mZCBlbHNlIHVzZSBESVIgKmRpcnAtPl9fZGRfZmQuICBUaGlzIHRha2VzIGNhcmUKKwlvZiBib3RoIFNvbGFyaXMgYW5kIElyaXgKKworMjAwNi0xMS0wMSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGJ1cy9kYnVzLWRhZW1vbi4xLmluOiBkb2N1bWVudCBzdGFuZGFyZF9zZXNzaW9uX3NlcnZpY2VkaXJzCisKKzIwMDYtMTEtMDEgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogZXhwb3NlIERCVVNfREFUQURJUgorCQorCSogYnVzL2NvbmZpZy1wYXJzZXIuYzogYWRkIHRoZSBzdGFuZGFyZF9zZXNzaW9uX3NlcnZpY2VkaXJzIGVsZW1lbnQKKwl0byB0aGUgcGFyc2VyCisJKGJ1c19jb25maWdfcGFyc2VyX2NvbnRlbnQpOiBwcm9jZXNzIHRoZSBzdGFuZGFyZF9zZXNzaW9uX3NlcnZpY2VkaXJzCisJZWxlbWVudCBieSBnZXR0aW5nIHRoZSBzdGFuZGFyZCBkaXJlY3RvcmllcyBmcm9tIHN5c2RlcHMgYW5kIG1lcmdpbmcKKwl0aGVtIGludG8gdGhlIHNlcnZpY2UgZGlyZWN0b3J5IGxpc3QKKwkodGVzdF9kZWZhdWx0X3Nlc3Npb25fc2VydmljZWRpcnMpOiBtYWtlIHN1cmUgd2UgZ2V0IHdoYXQgd2UgZXhwZWN0CisKKwkqIGJ1cy9zZXNzaW9uLmNvbmYuaW46IHJlcGxhY2UgdGhlIHNlcnZpY2VkaXIgdGFnIHdpdGggdGhlIAorCXN0YW5kYXJkX3Nlc3Npb25fc2VydmljZWRpcnMgdGFnCisKKwkqIGRidXMvZGJ1cy1saXN0Lmg6IHJlbW92ZSB0aGUgdHlwZWRlZiBvZiBEQnVzTGlzdCBhbmQgcGxhY2UgaXQgaW4KKwlkYnVzLXN5c2RlcHMuaCB0byBhdm9pZCBjaXJjdWxhciBoZWFkZXIgZGVwZW5kZW5jaWVzCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmg6IGFkZCB0aGUgdHlwZWRlZiBvZiBEQnVzTGlzdAorCisJKiBkYnVzL2RidXMtc3lzZGVwcy11bml4LmMgKHNwbGl0X3BhdGhzX2FuZF9hcHBlbmQpOiB1dGlsaXR5IGZ1bmN0aW9uCisJd2hpY2ggdGFrZXMgYSBzdHJpbmcgb2YgZGlyZWN0b3JpZXMgZGVsaW1pdGVkIGJ5IGNvbG9ucywgcGFyc2VzIHRoZW0gCisJb3V0LCBhcHBlbmRzIGEgc3VmZml4IGFuZCBwdXRzIHRoZW0gaW4gYSBsaXN0IGlnbm9yaW5nIGVtcHR5IGVsZW1lbnRzCisJKF9kYnVzX2dldF9zdGFuZGFyZF9zZXNzaW9uX3NlcnZpY2VkaXJzKTogcmV0dXJucyB0aGUgc3RhbmRhcmQgCisJZGlyZWN0b3JpZXMgZm9yIGEgc2Vzc2lvbiBidXMgdG8gbG9vayBmb3Igc2VydmljZSBhY3RpdmF0aW9uIGZpbGVzCisJb24gVW5peCB3aGljaCBpbmNsdWRlcyB0aGUgWERHX0RBVEFfSE9NRSwgWERHX0RBVEFfRElSUyBhbmQgCisJREJVU19EQVRBRElSIGRpcmVjdG9yaWVzCisKKwkqIHRlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMvbWFueS1ydWxlcy5jb25mOiBhZGQgdGhlIAorCXN0YW5kYXJkX3Nlc3Npb25fc2VydmljZWRpcnMgdGFnIHRvIHRoZSB2YWxpZCBjb25maWcgZmlsZSB0ZXN0cworCisyMDA2LTEwLTMwICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogdG9vbHMvZGJ1cy1sYXVuY2guMSwgZG9jL1RPRE86IGNhcHR1cmUgaW50ZW50IHRvIGNoYW5nZSB0aGUKKwljb21tYW5kIGxpbmUgb3B0aW9ucyBvZiBkYnVzLWxhdW5jaCBhIGJpdCBwb3N0IDEuMAorCisyMDA2LTEwLTI3ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKwkKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMgKGRidXNfY29ubmVjdGlvbl9vcGVuX3ByaXZhdGUpOiBkb2N1bWVudAorCWhvdyB0byBjaG9vc2Ugc2hhcmVkIHZzLiBwcml2YXRlIGNvbm5lY3Rpb25zCisKKzIwMDYtMTAtMjcgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtdGVzdC5jOiBlbmNsb3NlIG1vcmUgb2YgdGhlIGZpbGUgaW4gdGhlCisJREJVU19CVUlMRF9URVNUUyBjaGVjay4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMtcHRocmVhZC5jIChQVEhSRUFEX0NIRUNLKTogZml4IGZvcgorCURCVVNfRElTQUJMRV9BU1NFUlQgY2FzZS4KKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYyAoZGJ1c19jb25uZWN0aW9uX2dldF91bml4X3VzZXIpOiBkb2N1bWVudAorCXRoYXQgaXQgb25seSB3b3JrcyBvbiB0aGUgc2VydmVyIHNpZGUKKworCSogZGJ1cy9kYnVzLWJ1cy5jOiBhZGQgYSBnbG9iYWwgbG9jayBjb3ZlcmluZyB0aGUgQnVzRGF0YSB3ZQorCWF0dGFjaCB0byBlYWNoIGNvbm5lY3Rpb24KKwkoaW50ZXJuYWxfYnVzX2dldCk6IGxvY2sgb3VyIGFjY2VzcyB0byB0aGUgQnVzRGF0YQorCShkYnVzX2J1c19yZWdpc3Rlcik6IGxvY2sgdGhlIGVudGlyZSByZWdpc3RyYXRpb24gcHJvY2VzcworCXdpdGggX0RCVVNfTE9DSyhidXNfZGF0YXMpLiBJZiB3ZSBnZXQgdGhlIGxvY2sgYW5kIAorCXJlZ2lzdHJhdGlvbiBpcyBhbHJlYWR5IGNvbXBsZXRlLCBzaWxlbnRseSByZXR1cm4gKHZzLiBwcmV2aW91cworCWJlaGF2aW9yIG9mIGFib3J0aW5nKS4KKwkoZGJ1c19idXNfc2V0X3VuaXF1ZV9uYW1lKTogbG9jayB0aGUgQnVzRGF0YQorCShkYnVzX2J1c19nZXRfdW5pcXVlX25hbWUpOiBsb2NrIHRoZSBCdXNEYXRhCisKKzIwMDYtMTAtMjcgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGJ1cy9jb25maWctcGFyc2VyLmMgKHNlcnZpY2VfZGlyc19maW5kX2RpciwgCisJc2VydmljZV9kaXJzX2FwcGVuZF91bmlxdWVfb3JfZnJlZSwgCisJc2VydmljZV9kaXJzX2FwcGVuZF9saW5rX3VuaXF1ZV9vcl9mcmVlKTogTmV3IHN0YXRpYyBtZXRob2RzCisJZm9yIG9ubHkgYXBwZW5kaW5nIHVuaXF1ZSBzZXJ2aWNlIGRpcmVjdG9yeSBuYW1lcyBpbnRvCisJdGhlIHNlcnZpY2UgZGlyZWN0b3J5IGxpc3QKKwkobWVyZ2VfaW5jbHVkZWQsIGJ1c19jb25maWdfcGFyc2VyX2NvbnRlbnQpOiBPbmx5IGFkZCB1bmlxdWUKKwlzZXJ2aWNlIGRpcmVjdG9yeSBuYW1lcyBpbnRvIHRoZSBsaXN0CisKKzIwMDYtMTAtMjcgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy1wdGhyZWFkLmM6IG1ha2UgdGhlICJjb3VudCIgYW5kICJob2xkZXIiCisJdmFyaWFibGVzIHZvbGF0aWxlLCBzdWdnZXN0ZWQgYnkgVGhpYWdvLiBEb2N1bWVudCBzdHJ1Y3QgZmllbGRzLgorCShQVEhSRUFEX0NIRUNLKTogcmVtb3ZlIHB0aHJlYWQgZXJyb3IgY2hlY2tpbmcgaWYgYXNzZXJ0aW9ucyBhcmUKKwlkaXNhYmxlZCwgc2hvdWxkIHJlZHVjZSB0aGUgbm8tYXNzZXJ0aW9ucyBjYXNlIHRvIHRoZSBiYXJlCisJbWluaW11bSBjb2RlLgorCisyMDA2LTEwLTI2ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKwkKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLXB0aHJlYWQuYyAoX2RidXNfcHRocmVhZF9tdXRleF9sb2NrKTogY2hhbmdlCisJdG8gYmUgcmVjdXJzaXZlCisJKF9kYnVzX3B0aHJlYWRfbXV0ZXhfdW5sb2NrKTogbWFrZSBpdCByZWN1cnNpdmUKKwkoX2RidXNfcHRocmVhZF9jb25kdmFyX3dhaXQpOiBzYXZlL3Jlc3RvcmUgdGhlIHJlY3Vyc2lvbiBjb3VudAorCShfZGJ1c19wdGhyZWFkX2NvbmR2YXJfd2FpdF90aW1lb3V0KTogc2F2ZS9yZXN0b3JlIHRoZSByZWN1cnNpb24gY291bnQKKworMjAwNi0xMC0yNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRvYy9kYnVzLXNwZWNpZmljYXRpb24ueG1sOiBjbGFyaWZ5IHRoZSBVVUlEIHRleHQgc2xpZ2h0bHkKKworCSogZGJ1cy9kYnVzLXN5c2RlcHMtcHRocmVhZC5jOiBjaGVjayBmb3IgYW5kIG1vc3RseSBhYm9ydCBvbgorCXB0aHJlYWQgZXJyb3JzLiBBZGQgREJ1c011dGV4UFRocmVhZCBhbmQgREJ1c0NvbmRWYXJQVGhyZWFkIAorCWluIHByZXBhcmF0aW9uIGZvciBiZWluZyBhYmxlIHRvIGV4dGVuZCB0aGVtIGZvciBlLmcuIHJlY3Vyc2l2ZQorCW11dGV4ZXMuCisKKzIwMDYtMTAtMjYgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisgICAgICAgICogZGJ1cy9kYnVzLXRocmVhZHMuW2hjXTogRG9jdW1lbnRhdGlvbiBpbXByb3ZlbWVudHMuIENsYXJpZnkgaG93IAorCWNvbmRpdGlvbiB2YXJpYWJsZXMgcmVsYXRlIHRvIHJlY3Vyc2l2ZSBtdXRleGVzLgorCQorICAgICAgICAqIGRidXMvZGJ1cy1zeXNkZXBzLXB0aHJlYWQuYywgZGJ1cy9kYnVzLXN5c2RlcHMtd2luLXRocmVhZC5jLCAKKwlkYnVzL2RidXMtdGhyZWFkcy5jOiBTcGxpdCB0aGUgcGxhdGZvcm1zLXNwZWNpZmljIHRocmVhZCAKKwlpbXBsZW1lbnRhdGlvbnMgaW50byB0aGVpciBvd24gZmlsZXMuCisJCisJKiBkYnVzL2RidXMtc3lzZGVwcy1wdGhyZWFkLmMKKwkoX2RidXNfcHRocmVhZF9jb25kdmFyX3dhaXRfdGltZW91dCk6IGludmVydCB0aGUgcmV0dXJuIHZhbHVlLCBpdAorCXdhcyBiYWNrd2FyZC4gTm90IHRoYXQgYW55dGhpbmcgdXNlcyBpdC4KKworMjAwNi0xMC0yNiAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy1zeXNkZXBzLXVuaXguYyAoX2RidXNfc2V0X2xvY2FsX2NyZWRzKTogQ2xlYW4gdXAgdGhlCisJTE9DQUxfQ1JFRFMgdnMgQ01TR0NSRUQgc3R1ZmYgYSBiaXQuICBQcmVmZXIgQ01TR0NSRUQuICBUaGlzCisJbmVlZHMgdG8gYmUgY2xlYW5lZCB1cCBtb3JlLgorCisJKiBkb2MvVE9ETzogQWRkIGEgdG9kbyB0aGF0ICpCU0QgaGFja2VycyBzaG91bGQgbG9vayBhdCBjbGVhbmluZworCXVwIHRoZSBDUkVEUyBpc3N1ZS4KKworMjAwNi0xMC0yNiAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogY29uZmlndXJlLmluLCBkYnVzLTEucGMuaW46IENoZWNrIHRvIHNlZSBpZiB0aHJlYWQgbWV0aG9kcyAKKwlhcmUgaW4gZ2xpYmMgb3IgbGlicHRocmVhZCBhbmQgYWRkIC1scHRocmVhZCB0byB0aGUgbGluayBzdGFnZSAKKwlpZiBpdCBpcyB0aGUgbGF0dGVyCisKKzIwMDYtMTAtMjYgIFRoaWFnbyBNYWNpZWlyYSAgPHRoaWFnb0BrZGUub3JnPgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jIChfZGJ1c19jb25uZWN0aW9uX29wZW5faW50ZXJuYWwpOiBGaXgKKyAgICAgICAgYnVnIDg3ODA6IHRoZSBjb25uZWN0aW9uIGxvY2sgaXMgb25seSByZXF1aXJlZCB3aGlsZSByZWNvcmRpbmcKKyAgICAgICAgdGhlIHNoYXJlZCBjb25uZWN0aW9uLCBzbyBwcm90ZWN0IG9ubHkgdGhhdCBjb2RlCisgICAgICAgIHNlY3Rpb24uIERvbid0IHJlcXVpcmUgY29ubmVjdGlvbl9sb29rdXBfc2hhcmVkIHRvIHJldHVybiBhCisgICAgICAgIGxvY2tlZCBjb25uZWN0aW9uLgorCisyMDA2LTEwLTI2ICBUaGlhZ28gTWFjaWVpcmEgIDx0aGlhZ29Aa2RlLm9yZz4KKworCSogdG9vbHMvZGJ1cy1sYXVuY2gteDExLmMgKGdldF9zZXNzaW9uX2ZpbGUsIGluaXRfeF9hdG9tcyk6CisgICAgICAgIGNoZWNrIGlmIGdldF9tYWNoaW5lX3V1aWQoKSByZXR1cm5zIE5VTEwgYmVmb3JlIHByb2NlZWRpbmcgYW55CisgICAgICAgIGZ1cnRoZXI6IHdlIGNhbid0IGluaXQgdGhlIFggYXRvbXMgb3IgY3JlYXRlIGEgc2Vzc2lvbiBmaWxlCisgICAgICAgIG5hbWUgaWYgdGhlcmUgaXMgbm8gbWFjaGluZSBJRC4KKwlUaGlzIHNvbHZlcyBhIGNyYXNoIHJlcG9ydGVkIGJ5IHNvbWUgdXNlcnMgaWYKKyAgICAgICAgLS1leGl0LXdpdGgtc2Vzc2lvbiB3YXMgdXNlZCB3aXRob3V0IC0tYXV0b2xhdW5jaD08bWFjaGluZS1pZD4KKworMjAwNi0xMC0yNiAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogdG9vbHMvZGJ1cy1sYXVuY2guYyAobWFpbik6IHJ1biB0aGUgZGJ1cy1kYWVtb24gaW4gdGhlIGJ1aWxkZGlyCisJaWYgdGVzdHMgYXJlIGVuYWJsZWQgYW5kIHRoZSBEQlVTX1VTRV9URVNUX0JJTkFSWSBlbnYgdmFyaWFibGUgaXMgc2V0CisKKwkqIHRvb2xzL3J1bi13aXRoLXRtcC1zZXNzaW9uLWJ1cy5zaDogc2V0IERCVVNfVVNFX1RFU1RfQklOQVJZCisJYmVmb3JlIHdlIHJ1biBkYnVzLWxhdW5jaAorCisJKiBjb25maWd1cmUuaW46IGRlZmluZSBURVNUX0JVU19CSU5BUlkgdG8gYmUgdGhlIGZ1bGwgcGF0aCB0byAKKwlkYnVzLWRhZW1vbiBpbiB0aGUgYnVpbGQgcm9vdCAKKworMjAwNi0xMC0yNSAgU2pvZXJkIFNpbW9ucyAgPHNqb2VyZEBsdW9uLm5ldD4KKworCSogZGJ1cy9NYWtlZmlsZS5hbToKKwkqIHRvb2xzL01ha2VmaWxlLmFtOgorCSogdG9vcy9kYnVzLXV1aWRnZW4uMToKKwkJTW92ZSB0aGUgbWFjaGluZS1pZCBmaWxlIHRvIC92YXIvbGliL2RidXMgCisKKzIwMDYtMTAtMjQgIERhdmlkIFpldXRoZW4gIDxkYXZpZHpAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLXRocmVhZHMuYyAoaW5pdF91bmluaXRpYWxpemVkX2xvY2tzKTogRml4IHR5cG8gc28gaXQncworCV9kYnVzX2Fzc2VydCAodGhyZWFkX2luaXRfZ2VuZXJhdGlvbiAhPSBfZGJ1c19jdXJyZW50X2dlbmVyYXRpb24pCisJbm90IF9kYnVzX2Fzc2VydCAodGhyZWFkX2luaXRfZ2VuZXJhdGlvbiA9PSBfZGJ1c19jdXJyZW50X2dlbmVyYXRpb24pCisKKzIwMDYtMTAtMjQgIFRoaWFnbyBNYWNpZWlyYSAgPHRoaWFnb0BrZGUub3JnPgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5oOgorCSogZGJ1cy9kYnVzLXN5c2RlcHMtdW5peC5jOiBBZGQgZnVuY3Rpb24KKwlfZGJ1c19tYWtlX2ZpbGVfd29ybGRfcmVhZGFibGUgdGhhdCBjaG1vZHMgYSBmaWxlIHRvIDA2NDQuCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLXVuaXguYyAoX2RidXNfZ2V0X2F1dG9sYXVuY2hfYWRkcmVzcyk6CisgICAgICAgIEF2b2lkIHdyaXRpbmcgdG8gdGhlIHN0YXRpYyAiYXJndiIgYXJyYXksIHRoZXJlYnkgYXZvaWRpbmcgYQorICAgICAgICBDT1cgb24gdGhlIGNoaWxkIHByb2Nlc3MuCisKKwkqIGRidXMvZGJ1cy1pbnRlcm5hbHMuYyAoX2RidXNfY3JlYXRlX3V1aWRfZmlsZV9leGNsdXNpdmVseSk6CisgICAgICAgIGNhbGwgX2RidXNfbWFrZV9maWxlX3dvcmxkX3JlYWRhYmxlIG9uIHRoZSBjcmVhdGVkIGZpbGUuCisKKzIwMDYtMTAtMjMgIERhdmlkIFpldXRoZW4gIDxkYXZpZHpAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLW1lbW9yeS5jOiBVc2UgYXRvbWljIHZhcmlhYmxlIHRvIHByb3RlY3QKKwluX2Jsb2Nrc19vdXRzdGFuZGluZyBvdGhlcndpc2UgT09NIHdpbGwgYmUgcmVwb3J0ZWQgdXNpbmcgU01QIG9uCisJc29tZSBhcmNoZXMKKwkKKwkqIGJ1cy9kaXNwYXRjaC5jOiBBZGQgbWlzc2luZyBlbmQgb2YgbGluZSBjaGFyYWN0ZXJzCisKKwkqIGJ1cy9kZXNrdG9wLWZpbGUuYyAocGFyc2Vfc2VjdGlvbl9zdGFydCwgcGFyc2Vfa2V5X3ZhbHVlKSAKKwkoYnVzX2Rlc2t0b3BfZmlsZV9sb2FkKTogUHJvcGVydGx5IGhhbmRsZSBPT00KKworCSogZGJ1cy9kYnVzLXRocmVhZHMuYyAoaW5pdF91bmluaXRpYWxpemVkX2xvY2tzKTogQ2hlY2sgdGhhdAorCXRocmVhZF9pbml0X2dlbmVyYXRpb24gZXF1YWxzIF9kYnVzX2N1cnJlbnRfZ2VuZXJhdGlvbiwgbm90IDAKKworMjAwNi0xMC0yMiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLWludGVybmFsLmg6IG1vdmUgcHJvdG90eXBlIG9mCisJX2RidXNfYnVzX25vdGlmeV9zaGFyZWRfY29ubmVjdGlvbl9kaXNjb25uZWN0ZWRfdW5sb2NrZWQoKSBoZXJlIHNvCisJaXQgaXNuJ3QgaW4gYSBwdWJsaWMgaGVhZGVyIGFuZCBkb2Vzbid0IGVuZCB1cCBpbiB0aGUgREJ1c0J1cworCWdyb3VwIGluIERveHlnZW4KKworMjAwNi0xMC0yMSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIE1ha2VmaWxlLmFtIChFWFRSQV9ESVNUKTogZGlzdCBjbGVhbnVwLW1hbi1wYWdlcy5zaCBzbyBpdCdzIGluCisJdGhlIHRhcmJhbGwgaWYgcGFja2FnZXJzIHdhbnQgdG8gcnVuIGl0CisKKwkqIGNsZWFudXAtbWFuLXBhZ2VzLnNoOiBBZGQgYSBzY3JpcHQgd2hpY2ggbXVuZ2VzIGFsbCB0aGUgaW50ZXJuYWwKKwlBUEkgbWFuIHBhZ2VzIG91dCBvZiB0aGUgRG94eWdlbiBvdXRwdXQuIFRoaXMgcmVkdWNlcyB0aGUgc2l6ZSBvZgorCXRoZSBpbnN0YWxsZWQgbWFuIHBhZ2VzIGZyb20gNyB0byAyIG1lZ3MsIGFuZCBhdm9pZHMKKwluYW1lc3BhY2UtcG9sbHV0aW5nIHBhZ2VzLiBSaWdodCBub3cgKGxpa2UgRG94eWdlbikgdGhpcyBzY3JpcHQKKwlpc24ndCBpbiB0aGUgYnVpbGQsIGl0J3Mgc29tZXRoaW5nIHBhY2thZ2VycyBjYW4gZG8gbWFudWFsbHkuCisKKzIwMDYtMTAtMjEgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5oOiBkb24ndCBpbmNsdWRlIHRoZSB3YXRjaC90aW1lb3V0CisJZnVuY3Rpb25zIGluIGNvbm5lY3Rpb24gc2VjdGlvbgorCisyMDA2LTEwLTIxICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogRG9jdW1lbnRhdGlvbiEgV2hlZSEgRG94eWdlbiBub3cgMTAwJSBzaWxlbnQuIElmIHlvdSBtYWtlIGl0CisJYW5ncnkgYWdhaW4sIHlvdSB3aWxsIGJlIHB1bmlzaGVkLgorCQorMjAwNi0xMC0yMSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIE1vcmUgZG9jdW1lbnRhdGlvbiAtIGFsbCBwdWJsaWMgQVBJIG5vdyBkb2N1bWVudGVkIGFjY29yZGluZyB0bworCURveHlnZW4KKworMjAwNi0xMC0yMSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIERvY3VtZW50IGEgYnVuY2ggb2YgdW5kb2N1bWVudGVkIHN0dWZmCisJCisyMDA2LTEwLTIxICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogQ2xlYW4gdXAgRG94eWdlbiBncm91cCBtYXJrZXJzIGZvciBwdWJsaWMgQVBJIHNvIERveHlnZW4gZmluZHMKKwlldmVyeXRoaW5nIChub3QgY29tcHJlaGVuc2l2ZWx5IGZpeGVkIGZvciBwcml2YXRlIEFQSSkuCisJTWVhbnMgYWxsIHJlbWFpbmluZyBEb3h5Z2VuIHdhcm5pbmdzIGFyZSBqdXN0IGFib3V0IG1pc3NpbmcgZG9jcworCWFuZCB0aHVzIHByZXR0eSBzaW1wbGUgdG8gcmVzb2x2ZS4KKwkKKzIwMDYtMTAtMjEgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCQorCSogZGJ1cy9kYnVzLW1hY3Jvcy5oOiBhZGQgREJVU19HTlVDX0RFUFJFQ0FURUQgbWFjcm8KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuaDogbWFyayBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJyYXlfbGVuKCkgCisJYXMgREJVU19HTlVDX0RFUFJFQ0FURUQKKworMjAwNi0xMC0yMSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKyAgICAgICAgKiBNb3ZlIGFsbCBwcml2YXRlIEFQSSBpbnRvIHRoZSBwcml2YXRlIERveHlnZW4gZ3JvdXAgc2VjdGlvbnMgb2YKKwl0aGUgZmlsZXMsIHNvIHRoZXkgZG9uJ3Qgc2hvdyB1cCBpbiB0aGUgcHVibGljIEFQSSBkb2NzCisJCisyMDA2LTEwLTIxICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuaDogcHV0ICNpZm5kZWYgREJVU19ESVNBQkxFX0RFUFJFQ0FURUQgYXJvdW5kIAorCWRidXNfbWVzc2FnZV9pdGVyX2dldF9hcnJheV9sZW4oKS4KKworCSogdGhyb3VnaG91dDogZG9jdW1lbnRhdGlvbiBpbXByb3ZlbWVudHMuCisKKzIwMDYtMTAtMjAgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkb2MvVE9ETzogcmVtb3ZlIHRoZSBpbnQ2NCB0aGluZyBmcm9tIDEuMCBzaW5jZSBpdCBkb2Vzbid0CisJbWF0dGVyLCBhbmQgdGhlIG1lc3NhZ2UtbG9hZGVyLWJyZWFrZXIgdGhpbmcgc2luY2Ugbm9ib2R5IGlzIGdvaW5nCisJdG8gZG8gaXQuICBBZGQgYW4gaXRlbSB0byAxLjAgYWJvdXQgc3VwcG9ydGluZyByZWN1cnNpdmUgbG9ja3MKKwlpbiBkYnVzX3RocmVhZHNfaW5pdF9kZWZhdWx0KCkgdGhvdWdoLCBzaW5jZSBpdCBzaG91bGQgYmUgZWFzeS4KKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYyAoX2RidXNfY29ubmVjdGlvbl9yZWFkX3dyaXRlX2Rpc3BhdGNoKToKKwlGaXggdGhpcyBpbiB0aGUgIWRpc3BhdGNoIGNhc2UgdG8gYXZvaWQgYnVzeS1sb29waW5nIGFmdGVyCisJZGlzY29ubmVjdGlvbgorCisgICAgICAgICogTW9yZSBtaXNjIGRvY3MgaW1wcm92ZW1lbnRzCisKKzIwMDYtMTAtMTkgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBtb3JlIERveHlnZW4tcmVsYXRlZCBmaXhlcyAobG90cyBvZiBtb3ZpbmcgdGhpbmdzIGZyb20gdGhlCisJcHVibGljIHRvIGludGVybmFsIHNlY3Rpb24gaW4gZGJ1cy1jb25uZWN0aW9uLmMpCisKKzIwMDYtMTAtMTkgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBGaXggYSBwaWxlIG9mIERveHlnZW4gd2FybmluZ3MgYW5kIG1pc3NpbmcgZG9jcworCisyMDA2LTEwLTE5ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBidXMvZGlyLXdhdGNoLWRlZmF1bHQuYywgYnVzL2Rpci13YXRjaC1kbm90aWZ5LmMsIAorCWJ1cy9kaXItd2F0Y2gta3F1ZXVlLmMgKGJ1c193YXRjaF9kaXJlY3RvcnkpOiBQYXNzIGluIGEgQnVzQ29udGV4dCAKKwlpbnN0ZWFkIG9mIGEgdm9pZCAqLiAga3F1ZXVlIHVzZXMgdGhpcyB0byBnZXQgdGhlIGNvbnRleHQncyBsb29wCisJd2hpbGUgdGhlIG90aGVyIG1vZHVsZXMgaWdub3JlIHRoZSBwYXJhbWV0ZXIuICBUaGlzIGFsbG93cyB1cyB0bworCWF2b2lkIHBsYXRmb3JtIGNvbmRpdGlvbmFscworCisJKiBidXMvYnVzLmMgKHByb2Nlc3NfY29uZmlnX3Bvc3Rpbml0KTogUGFzcyBpbiB0aGUgY29udGV4dCB0byB0aGUgCisJd2F0Y2gKKworMjAwNi0xMC0xOSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogYnVzL21lc3NhZ2VidXMuaW4sIGJ1cy9yYy5tZXNzYWdlYnVzLmluOiBydW4gZGJ1cy11dWlkZ2VuIC0tZW5zdXJlCisJd2hlbiBzdGFydGluZyB0aGUgc3lzdGVtIGJ1cworCisyMDA2LTEwLTE4ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBjb25maWd1cmUuaW46IE1vcmUgZml4dXBzIGZvciBjcm9zcyBjb21waWxlIChQYXRjaCBmcm9tIAorCU1hcmNvIFByYWN1Y2NpIDxkZXZlbG9wbWVudCBhdCBwcmFjdWNjaSBkb3QgY29tPikKKworMjAwNi0xMC0xNyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIHRvb2xzL2RidXMtc2VuZC5jIChtYWluKTogZG9uJ3QgY2xvc2Ugc2hhcmVkIGNvbm5lY3Rpb24sIGZpeAorCWZyb20gVGltbyBIb2VuaWcKKworMjAwNi0xMC0xNyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbiAoQ1BQRkxBR1MpOiBkb24ndCBkbyAtRERCVVNfQVBJX1NVQkpFQ1RfVE9fQ0hBTkdFIGhlcmUKKworCSogZGJ1cy9kYnVzLmg6IGRyb3AgdGhlIERCVVNfQVBJX1NVQkpFQ1RfVE9fQ0hBTkdFIHJlcXVpcmVtZW50LAorCXNpbmNlIHJlYWxpc3RpY2FsbHkgaXQgZG9lc24ndCBsb29rIGxpa2Ugd2UnbGwgYmUgY2hhbmdpbmcgaXQKKwlhbnltb3JlLgorCisyMDA2LTEwLTE3ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLWludGVybmFscy5jIChfZGJ1c193YXJuX2NoZWNrX2ZhaWxlZCk6IG5ldyBmdW5jdGlvbiB0bworCWJlIHVzZWQgZm9yIHJldHVybl9pZl9mYWlsIHR5cGUgd2FybmluZ3M7IHByZWZpeGVzIHRoZSBwaWQsIGFuZAorCWZhdGFsIGJ5IGRlZmF1bHQuCisKKzIwMDYtMTAtMTQgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogUmVsZWFzZWQgMS4wIFJDIDIoMC45NCkKKwlBZGQgY2hlY2sgZm9yIC1mUElDIGFuZCBlbmFibGUgaXQgaWYgYXZhaWxhYmxlCisKKzIwMDYtMTAtMTQgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGRvYy9UT0RPOiBSZW1vdmUgdGhlIGNoZWNrIFRPRE8gaXRlbQorCisyMDA2LTEwLTEzICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBkYnVzLXRyYW5zcG9ydC1zb2NrZXQuYyAoZXhjaGFuZ2VfY3JlZGVudGlhbHMpOgorCVByaW50IG91dCBtb3JlIGRldGFpbGVkIGVycm9ycyBpZiByZWFkaW5nIG9yIHNlbmRpbmcKKwljcmVkZW50aWFscyBmYWlsIChQYXRjaCBmcm9tIEp1bGlvIE0uIE1lcmlubyBWaWRhbCAKKwk8am1tdiBhdCBOZXRCU0QgZG90IG9yZz4pCisKKzIwMDYtMTAtMTMgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogd2hlbiBjaGVja2luZyBmb3IgcG9zaXggZ2V0cHduYW1fciBhc3N1bWUgdHJ1ZQorCWZvciBjcm9zcyBjb21waWxlcworCisyMDA2LTEwLTEzICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBjb25maWd1cmUuaW46IENoZWNrIGZvciBnZXRob3N0YnluYW1lIGZpcnN0IGJlZm9yZSB3ZSBjaGVjayBmb3IgaXQKKwlpbiBsaWJuc2wuICBPbiBnbnUgc3lzdGVtcyBpdCBpcyBpbXBsZW1lbmV0ZWQgCisKKzIwMDYtMTAtMTMgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jCisJKGRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHlfYW5kX2Jsb2NrKTogZml4IHRvIGhhbmRsZSBjbG9zZWQKKwljb25uZWN0aW9ucywgZnJvbSBUYW1iZXQgSW5nbyBidWcgIzg2MzEKKworMjAwNi0xMC0xMSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogY29uZmlndXJlLmluOiB1c2UgQUNfVFJZX0NPTVBJTEUgZm9yIGRpcmZkIGluc3RlYWQgb2YgQUNfVFJZX1JVTgorCisyMDA2LTEwLTExICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiB0ZXN0L25hbWUtdGVzdC9NYWtlZmlsZS5hbTogZG9uJ3QgbGluayBhZ2FpbnN0IGJvdGggbGliZGJ1cyBhbmQKKwlsaWJkYnVzLWNvbnZlbmllbmNlCisKKzIwMDYtMTAtMTEgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogY2hlY2sgZm9yIGRpcmZkIGV2ZW4gaWYgaXQgaXMgYSBtYWNybworCShQYXRjaCBmcm9tIFRpbW90aHkgUmVkYWVsbGkgPGRyaXp6dCBhdCBndWZpIGRvdCBvcmc+KQorCisyMDA2LTEwLTA4ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBjb25maWd1cmUuaW46IGRlZmluZSBfUE9TSVhfUFRIUkVBRF9TRU1BTlRJQ1Mgb24gc29sYXJpcworCWF2b2lkIHVzaW5nIGRpcmZkIG9uIHN5c3RlbXMgdGhhdCBkb24ndCBoYXZlIGRpcmZkIAorCShQYXRjaCBieSBCcmlhbiBDYW1lcm9uIDxicmlhbiBkb3QgY2FtZXJvbiBhdCBzdW4gZG90IGNvbT4pIAorCisyMDA2LTEwLTAyICBKb2huIChKNSkgUGFsbWllaXIgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jIChfZGJ1c19hYm9ydCk6IFJlbW92ZSBmcm9tIAorCSNpZm5kZWYgREJVU19ESVNBQkxFX0FTU0VSVFMgbWFjcm8gdG8gZml4IGRpc3RjaGVjaworCisJKiBkYnVzL2RidXMtc3lzZGVwcy11bml4LmMgKF9kYnVzX3ByaW50X2JhY2t0cmFjZSk6IFJlbW92ZSBmcm9tCisJI2lmICFkZWZpbmVkIChEQlVTX0RJU0FCTEVfQVNTRVJUKSB8fCBkZWZpbmVkKERCVVNfQlVJTERfVEVTVFMpCisJbWFjcm8gYmVjYXVzZSBfZGJ1c19hYm9ydCBjYWxscyBpdAorCisJKiB0b29scy9NYWtlZmlsZS5hbTogQWRkIGRidXMtbGF1bmNoLmggdG8gdGhlIHNvdXJjZSBsaXN0IHNvIGRpc3RjaGVjaworCXdvcmtzCisKKzIwMDYtMTAtMDIgIEpvaG4gKEo1KSBQYWxtaWVpciAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLXV0aWwtdW5peC5jIChkaXJlbnRfYnVmX3NpemUpOiBBZGQgY2hlY2sgZm9yCisJTUFYTkFNRUxFTiBmb3IgTWFjIE9TWC4gIChQYXRjaCBmcm9tIEpvbmFzIEIgPHNhbm9peCBhdCBnbWFpbCBkb3QgY29tPikKKworMjAwNi0xMC0wMiAgVGhpYWdvIE1hY2llaXJhICA8dGhpYWdvQGtkZS5vcmc+CisKKwkqIHRvb2xzL2RidXMtbGF1bmNoLmMgKG1haW4pOiBtYWtlIGl0IGNvbXBsYWluIGFuZCBhYm9ydAorCWV4ZWN1dGlvbiBpbiBjYXNlIGFuIHVua25vd24gb3B0aW9uIGlzIGdpdmVuLiBBbHNvLCBwcm9jZXNzCisJdGhlICctLScgYXJndW1lbnQgYXMgdGhlIGVuZCBvZiBhcmd1bWVudHMuCisKKzIwMDYtMTAtMDEgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiB0b29scy9kYnVzLWxhdW5jaC5jIChwcmludF92YXJpYWJsZXMpOiBpZiBubyBzeW50YXggaXMgZ2l2ZW4sCisJZG9uJ3QgcHJpbnQgc29tZXRoaW5nIHRoYXQncyBzb3J0LW9mLWhhbGYtc2gtc3ludGF4LCBqdXN0IHByaW50CisJYSBwbGFpbiBrZXktdmFsdWUgcGFpcnMgdGhpbmcuCisKKwkqIHRvb2xzL2RidXMtbGF1bmNoLXgxMS5jOiB1c2UgbWFjaGluZSBJRCByYXRoZXIgdGhhbiBob3N0bmFtZSBmb3IKKwl0aGUgbG9jYWwgbWFjaGluZSByZXByZXNlbnRhdGlvbiAoYnV0IHN0aWxsIGhhdmUgdGhlIGhvc3RuYW1lIGluCisJdGhlIGRpc3BsYXkpLiBSZW1vdmUgdGhlIGhvc3RuYW1lIGZyb20gdGhlIGRpc3BsYXkgaWYgaXQgaXMKKwlsb2NhbGhvc3QuIENoYW5nZSBzZXNzaW9uIGZpbGVzIHRvIGJlIG5hbWVkCisJfi8uZGJ1cy9zZXNzaW9uLWJ1cy9tYWNoaW5lLWRpc3BsYXkuIENoYW5nZSBYIGF0b21zIHRvIGJlCisJdW5kZXJzY29yZS1wcmVmaXhlZCBzbyBub2JvZHkgd2hpbmVzIGFib3V0IElDQ0NNIGNvbXBsaWFuY2UuCisJT3RoZXJ3aXNlIG5hbWUgdGhlbSB0aGUgc2FtZSBhcyB0aGUgZW52IHZhcmlhYmxlcy4KKwlDaGFuZ2Ugc2Vzc2lvbiBmaWxlIGZvcm1hdCB0byBpbmNsdWRlIGtleS12YWx1ZSBwYWlycyBhbmQgYW4KKwlleHBsYW5hdG9yeSBjb21tZW50LiBLZXlzIGFyZSB0aGUgc2FtZSBhcyB0aGUgZW52IHZhcmlhYmxlcy4KKwkoc2V0X2FkZHJlc3NfaW5feDExKTogWCBwcm9wZXJ0eSBmb3JtYXQgY2FuJ3QgZGVwZW5kIG9uCisJc2l6ZW9mKHBpZF90KSBvbiBhIHBhcnRpY3VsYXIgbWFjaGluZSwgZml4IHRvIGFsd2F5cyBiZSAzMiBiaXRzCisKKwkqIHRvb2xzL2RidXMtbGF1bmNoLmM6IG1ha2UgLS1hdXRvbGF1bmNoIHRha2UgYSBtYWNoaW5lIGlkCisJYXJndW1lbnQuIElmIC0tYXV0b2xhdW5jaCBpcyB1c2VkIHdpdGggYSBwcm9ncmFtIHRvIHJ1biwgY29tcGxhaW4KKwlmb3Igbm93IChidXQgYWRkIGEgRklYTUUpLiBBbHNvLCBkb24ndCBsb29rIGZvciBleGlzdGluZyBidXMgaWYgCisJdGhlcmUncyBhIHByb2dyYW0gdG8gcnVuIChidXQgYWRkIGEgRklYTUUpLgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy11bml4LmMgKF9kYnVzX2dldF9hdXRvbGF1bmNoX2FkZHJlc3MpOiBwYXNzCisJbWFjaGluZSB1dWlkIHRvIGRidXMtbGF1bmNoIChhdm9pZHMgbGlua2luZyBkYnVzLWxhdW5jaCB0byBsaWJkYnVzCisJanVzdCB0byBnZXQgdGhpcywgYW5kIGF2b2lkcyBkdXBsaWNhdGluZyB1dWlkLXJlYWRpbmcgY29kZSkuCisKKwkqIHRvb2xzL2RidXMtbGF1bmNoLjE6IGNsYXJpZnkgdmFyaW91cyB0aGluZ3MKKwkKKzIwMDYtMTAtMDEgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiB0ZXN0L3Rlc3Qtc2VydmljZS5jIChwYXRoX21lc3NhZ2VfZnVuYyk6IHJlbW92ZSBicm9rZW4gZXh0cmEKKwl1bnJlZiB0aGF0IHdhcyBoaWRkZW4gYnkgdGhlIGJ1Z3MgaW4gZGJ1cy1jb25uZWN0aW9uLmMvZGJ1cy1idXMuYworCisJKiB0ZXN0L3Rlc3Qtc2hlbGwtc2VydmljZS5jIChwYXRoX21lc3NhZ2VfZnVuYyk6IHNhbWUgZml4CisJCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jCisJKF9kYnVzX2Nvbm5lY3Rpb25fZ2V0X2Rpc3BhdGNoX3N0YXR1c191bmxvY2tlZCk6IGJyZWFrIHVwIHRoZQorCWZ1bmN0aW9uIGEgbGl0dGxlIGZvciBjbGFyaXR5IGFuZCBmaXggdGhlIG5vdGlmaWNhdGlvbiBvZgorCWRidXMtYnVzLmMgdG8gbm90IHJlcXVpcmUgZGlzcGF0Y2ggdG8gYmUgY29tcGxldGUKKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYyAoZGJ1c19jb25uZWN0aW9uX3VucmVmKTogaW1wcm92ZSB0aGUKKwl3YXJuaW5nIHdoZW4geW91IHRyeSB0byBmaW5hbGl6ZSBhbiBvcGVuIGNvbm5lY3Rpb24uCisJCisyMDA2LTEwLTAxICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLWJ1cy5jCisJKGludGVybmFsX2J1c19nZXQpOiBvbmx5IHdlYWsgcmVmIHRoZSBjb25uZWN0aW9uOyB0aGlzIG1lYW5zIAorCV9kYnVzX2J1c19ub3RpZnlfc2hhcmVkX2Nvbm5lY3Rpb25fZGlzY29ubmVjdGVkX3VubG9ja2VkIGNhbiBiZQorCWNhbGxlZCBzYWZlbHkgaW4gYW55IGNvbnRleHQKKwkoX2RidXNfYnVzX25vdGlmeV9zaGFyZWRfY29ubmVjdGlvbl9kaXNjb25uZWN0ZWRfdW5sb2NrZWQpOiBkb24ndAorCXVucmVmCisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMKKwkoX2RidXNfY29ubmVjdGlvbl9nZXRfZGlzcGF0Y2hfc3RhdHVzX3VubG9ja2VkKTogbW92ZQorCV9kYnVzX2J1c19ub3RpZnlfc2hhcmVkX2Nvbm5lY3Rpb25fZGlzY29ubmVjdGVkX3VubG9ja2VkIGhlcmUKKwl3aGVuIHF1ZXVpbmcgRGlzY29ubmVjdGVkIGluc3RlYWQgb2Ygd2hlbiB0aGUgRGlzY29ubmVjdGVkIG1lc3NhZ2UKKwlhcnJpdmVzLCBzbyBkYnVzX2J1c19nZXQoKSB3b24ndCByZXR1cm4gY2xvc2VkIGNvbm5lY3Rpb25zLgorCQorMjAwNi0xMC0wMSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMgKF9kYnVzX2Nvbm5lY3Rpb25fY2xvc2VfaWZfb25seV9vbmVfcmVmKTogCisJQWRkIGEgaGFjayB0byBtYWtlIERCdXNOZXdDb25uZWN0aW9uRnVuY3Rpb24gd29yayByaWdodC4KKworCSogZGJ1cy9kYnVzLXNlcnZlci1zb2NrZXQuYyAoaGFuZGxlX25ld19jbGllbnRfZmRfYW5kX3VubG9jayk6IHVzZQorCXRoZSBoYWNrIGhlcmUuIEFsc28sIGZpeCB0aGUgdG9kbyBhYm91dCByZWZjb3VudCBsZWFrLgorCQorCSogZGJ1cy9kYnVzLXNlcnZlci1kZWJ1Zy1waXBlLmMgKF9kYnVzX3RyYW5zcG9ydF9kZWJ1Z19waXBlX25ldyk6CisJYW5kIHVzZSB0aGUgaGFjayBoZXJlCisJCisgICAgICAgICogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYzogS2lsbCB0aGUgInNoYXJlZCIgZmxhZyB2cy4gdGhlCisJInNoYXJlYWJsZSIgZmxhZzsgdGhpcyB3YXMgY29tcGxldGVseSBicm9rZW4sIHNpbmNlIGl0IG1lYW50IAorCWRidXNfY29ubmVjdGlvbl9vcGVuKCkgcmV0dXJuZWQgYSBjb25uZWN0aW9uIG9mIHVua25vd24KKwlzaGFyZWQtbmVzcy4gTm93LCB3ZSBhbHdheXMgaG9sZCBhIHJlZiBvbiBhbnl0aGluZyBvcGVuZWQgCisJYXMgc2hhcmVhYmxlLgorCisJTW92ZSB0aGUgY2FsbCB0byBub3RpZnkgZGJ1cy1idXMuYyBpbnRvCisJY29ubmVjdGlvbl9mb3JnZXRfc2hhcmVkX3VubG9ja2VkLCBzbyBsaWJkYnVzIGNvbnNpc3RlbnRseSBmb3JnZXRzCisJYWxsIGl0cyBrbm93bGVkZ2Ugb2YgYSBjb25uZWN0aW9uIGF0IG9uY2UuIFRoaXMgZXhwb3NlZCBudW1lcm91cworCXBsYWNlcyB3aGVyZSB0aGluZ3Mgd2VyZSB0b3RhbGx5IGJyb2tlbiBpZiB3ZSBkcm9wcGVkIGEgcmVmIGluc2lkZQorCWdldF9kaXNwYXRjaF9zdGF0dXNfdW5sb2NrZWQgd2hlcmUKKwljb25uZWN0aW9uX2ZvcmdldF9zaGFyZWRfdW5sb2NrZWQgd2FzIHByZXZpb3VzbHksIHNvIG1vdmUKKwljb25uZWN0aW9uX2ZvcmdldF9zaGFyZWRfdW5sb2NrZWQgaW50bworCV9kYnVzX2Nvbm5lY3Rpb25fdXBkYXRlX2Rpc3BhdGNoX3N0YXR1c19hbmRfdW5sb2NrLiBBbHNvIG1vdmUgdGhlCisJZXhpdF9vbl9kaXNjb25uZWN0IGhlcmUuCisKKwkoc2hhcmVkX2Nvbm5lY3Rpb25zX3NodXRkb3duKTogdGhpcyBhc3N1bWVkIHdlYWsgcmVmcyB0byB0aGUKKwlzaGFyZWQgY29ubmVjdGlvbnM7IHNpbmNlIHdlIGhhdmUgc3Ryb25nIHJlZnMgbm93LCB0aGUgYXNzZXJ0aW9uIAorCXdhcyBmYWlsaW5nIGFuZCBzdHVmZiB3YXMgbGVmdCBpbiB0aGUgaGFzaC4gRml4IGl0IHRvIGNsb3NlCisJc3RpbGwtb3BlbiBzaGFyZWQgY29ubmVjdGlvbnMuCisJCisJKiBidXMvZGlzcGF0Y2guYzogZml4dXAgdG8gdXNlIGRidXNfY29ubmVjdGlvbl9vcGVuX3ByaXZhdGUgb24gdGhlIAorCWRlYnVnIHBpcGUgY29ubmVjdGlvbnMKKwkKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMgKGRidXNfY29ubmVjdGlvbl9kaXNwYXRjaCk6IG9ubHkgbm90aWZ5CisJZGJ1cy1idXMuYyBpZiB0aGUgY2xvc2VkIGNvbm5lY3Rpb24gaXMgaW4gZmFjdCBzaGFyZWQKKwkoX2RidXNfY29ubmVjdGlvbl9jbG9zZV9wb3NzaWJseV9zaGFyZWQpOiByZW5hbWUgZnJvbSAKKwlfZGJ1c19jb25uZWN0aW9uX2Nsb3NlX2ludGVybmFsCisJKGRidXNfY29ubmVjdGlvbl9jbG9zZSwgZGJ1c19jb25uZWN0aW9uX29wZW4sCisJZGJ1c19jb25uZWN0aW9uX29wZW5fcHJpdmF0ZSk6IEltcHJvdmUgZG9jcyB0byBleHBsYWluIHRoZSBkZWFsCisJd2l0aCB3aGVuIHlvdSBzaG91bGQgY2xvc2Ugb3IgdW5yZWYgb3IgYm90aAorCisJKiBkYnVzL2RidXMtYnVzLmMKKwkoX2RidXNfYnVzX25vdGlmeV9zaGFyZWRfY29ubmVjdGlvbl9kaXNjb25uZWN0ZWRfdW5sb2NrZWQpOiByZW5hbWUKKwlmcm9tIF9kYnVzX2J1c19jaGVja19jb25uZWN0aW9uX2FuZF91bnJlZl91bmxvY2tlZCBhbmQgbW9kaWZ5IHRvCisJbG9vcCBvdmVyIGFsbCBjb25uZWN0aW9ucworCisJKiB0ZXN0L3Rlc3QtdXRpbHMuYyAodGVzdF9jb25uZWN0aW9uX3NodXRkb3duKTogZG9uJ3QgdHJ5IHRvIGNsb3NlCisJc2hhcmVkIGNvbm5lY3Rpb25zLgorCisJKiB0ZXN0L25hbWUtdGVzdC90ZXN0LXRocmVhZHMtaW5pdC5jIChtYWluKTogZml4IHdhcm5pbmdzIGluIGhlcmUKKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYyAoX2RidXNfYWJvcnQpOiBzdXBwb3J0IERCVVNfQkxPQ0tfT05fQUJPUlQKKwllbnYgdmFyaWFibGUgdG8gY2F1c2UgYmxvY2tpbmcgd2FpdGluZyBmb3IgZ2RiOyBkcm9wCisJREJVU19QUklOVF9CQUNLVFJBQ0UgYW5kIGp1c3QgY2FsbCBfZGJ1c19wcmludF9iYWNrdHJhY2UoKSAKKwl1bmNvbmRpdGlvbmFsbHkuCisKKwkqIGNvbmZpZ3VyZS5pbjogYWRkIC1leHBvcnQtZHluYW1pYyB0byBsaWJ0b29sIGZsYWdzIGlmIGFzc2VydGlvbnMgZW5hYmxlZAorCXNvIF9kYnVzX3ByaW50X2JhY2t0cmFjZSB3b3Jrcy4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMtdW5peC5jIChfZGJ1c19wcmludF9iYWNrdHJhY2UpOiB1c2UgZnByaW50ZgorCWluc3RlYWQgb2YgX2RidXNfdmVyYm9zZSB0byBwcmludCB0aGUgYmFja3RyYWNlLCBhbmQgZGlhZ25vc2UgbGFjayAKKwlvZiAtcmR5bmFtaWMvLWV4cG9ydC1keW5hbWljCisJCisyMDA2LTA5LTMwICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLWJ1cy5jIChkYnVzX2J1c19nZXRfcHJpdmF0ZSwgZGJ1c19idXNfZ2V0KSAKKwkoaW50ZXJuYWxfYnVzX2dldCk6IGZpeCBzY3Jld3kgY29kZSBmb3JtYXR0aW5nLiB3aG9ldmVyIGNvbW1pdHRlZAorCXRoYXQgd2FzIG5vdCBwYXlpbmcgYXR0ZW50aW9uIQorCisyMDA2LTA5LTMwICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogY29uZmlndXJlLmluIChMVF9DVVJSRU5ULCBMVF9BR0UpOiBpbmNyZW1lbnQgY3VycmVudCBhbmQgYWdlIHRvCisJcmVmbGVjdCBhZGRpdGlvbiBvZiBpbnRlcmZhY2VzLgorCisJKiBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnhtbDogZGVzY3JpYmUgYSBuZXcKKwlvcmcuZnJlZWRlc2t0b3AuREJ1cy5QZWVyLkdldE1hY2hpbmVJZCBtZXRob2QKKworCSogZGJ1cy9kYnVzLXN0cmluZy5jIChfZGJ1c19zdHJpbmdfc2tpcF93aGl0ZV9yZXZlcnNlKTogbmV3IGZ1bmN0aW9uCisJKF9kYnVzX3N0cmluZ19za2lwX3doaXRlLCBfZGJ1c19zdHJpbmdfc2tpcF9ibGFuayk6IHVzZSBuZXcKKwlEQlVTX0lTX0FTQ0lJX0JMQU5LLCBEQlVTX0lTX0FTQ0lJX1dISVRFIG1hY3JvcyBhbmQgZml4IGFzc2VydGlvbgorCWF0IGVuZCBvZiBza2lwX3doaXRlCisJKF9kYnVzX3N0cmluZ19jaG9wX3doaXRlKTogbmV3IGZ1bmN0aW9uCisKKwkqIGJ1cy9jb25uZWN0aW9uLmMgKGJ1c19jb25uZWN0aW9uc19zZXR1cF9jb25uZWN0aW9uKTogY2FsbAorCWRidXNfY29ubmVjdGlvbl9zZXRfcm91dGVfcGVlcl9tZXNzYWdlcy4KKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYworCShfZGJ1c19jb25uZWN0aW9uX3BlZXJfZmlsdGVyX3VubG9ja2VkX25vX3VwZGF0ZSk6IG1vZGlmeSB0bworCXN1cHBvcnQgYSBHZXRNYWNoaW5lSWQgbWV0aG9kLgorCisJQWxzbywgc3VwcG9ydCBhIG5ldyBmbGFnIHRvIGxldCB0aGUgYnVzIHBhc3MgcGVlciBtZXRob2RzIHRocm91Z2gKKwl0byBhcHBzIG9uIHRoZSBidXMsIHdoaWNoIGNhbiBiZSBzZXQgd2l0aAorCWRidXNfY29ubmVjdGlvbl9zZXRfcm91dGVfcGVlcl9tZXNzYWdlcy4KKworCUZpbmFsbHksIGhhbmRsZSBhbmQgcmV0dXJuIGFuIGVycm9yIGZvciBhbnl0aGluZyB1bmtub3duIG9uIHRoZQorCVBlZXIgaW50ZXJmYWNlLCB3aGljaCB3aWxsIGFsbG93IHVzIHRvIGV4dGVuZCB0aGUgUGVlciBpbnRlcmZhY2UKKwlpbiB0aGUgZnV0dXJlIHdpdGhvdXQgZmVhciB0aGF0IHdlJ3JlIG5vdyBpbnRlcmNlcHRpbmcgc29tZXRoaW5nCisJYXBwcyB3ZXJlIHdhbnRpbmcgdG8gc2VlLgorCQorCSogdG9vbHMvZGJ1cy11dWlkZ2VuLmM6IGEgdGhpbiB3cmFwcGVyIGFyb3VuZCB0aGUgZnVuY3Rpb25zIGluIAorCWRidXMvZGJ1cy11dWlkZ2VuLmMKKworCSogZGJ1cy9kYnVzLXV1aWRnZW4uYzogaW1wbGVtZW50IHRoZSBidWxrIG9mIHRoZSBkYnVzLXV1aWRnZW4KKwliaW5hcnkgaGVyZSwgc2luY2UgbW9zdCBvZiB0aGUgY29kZSBpcyBhbHJlYWR5IGluIGxpYmRidXMKKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYyAoX2RidXNfcmVhZF9sb2NhbF9tYWNoaW5lX3V1aWQpOiByZWFkIHRoZQorCXV1aWQgZnJvbSB0aGUgc3lzdGVtIGNvbmZpZyBmaWxlCisKKwkqIGRidXMvZGJ1cy1pbnRlcm5hbHMuYyAoX2RidXNfZ2VuZXJhdGVfdXVpZCwgX2RidXNfdXVpZF9lbmNvZGUpIAorCShfZGJ1c19yZWFkX3V1aWRfZmlsZV93aXRob3V0X2NyZWF0aW5nKSAKKwkoX2RidXNfY3JlYXRlX3V1aWRfZmlsZV9leGNsdXNpdmVseSwgX2RidXNfcmVhZF91dWlkX2ZpbGUpOiBuZXcKKwl1dWlkLXJlbGF0ZWQgZnVuY3Rpb25zLCBwYXJ0bHkgZmFjdG9yZWQgb3V0IGZyb20gZGJ1cy1zZXJ2ZXIuYworCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jIChfZGJ1c19lcnJvcl9mcm9tX2Vycm5vKTogY29udmVydCBFRVhJU1QgdG8KKwlEQlVTX0VSUk9SX0ZJTEVfRVhJU1RTIGluc3RlYWQgb2YgRUVYSVNUCisKKwkqIGRidXMvZGJ1cy1wcm90b2NvbC5oIChEQlVTX0VSUk9SX0ZJTEVfRVhJU1RTKTogYWRkIGZpbGUgZXhpc3RzIGVycm9yCisKKwkqIHRvb2xzL2RidXMtY2xlYW51cC1zb2NrZXRzLjE6IGV4cGxhaW4gd2hhdCB0aGUgcG9pbnQgb2YgdGhpcworCXRoaW5nIGlzIGEgYml0IG1vcmUKKworCSogYXV0b2dlbi5zaCAocnVuX2NvbmZpZ3VyZSk6IGFkZCAtLWNvbmZpZy1jYWNoZSB0byBkZWZhdWx0CisJY29uZmlndXJlIGFyZ3MKKworCSogZGJ1cy9kYnVzLWludGVybmFscy5oIChfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUKTogZGlzYWJsZSB0aGUKKwllcnJvciBzZXQvY2xlYXIgYXNzZXJ0aW9ucyB3aGVuIERCVVNfRElTQUJMRV9DSEVDS1MgaXMgZGVmaW5lZAorCisJKiB0b29scy9kYnVzLWxhdW5jaC5jIChtYWluKTogaWYgeGRpc3BsYXkgaGFzbid0IGJlZW4gb3BlbmVkLAorCWRvbid0IHRyeSB0byBzYXZlIGFkZHJlc3MsIGZpeGVzIGNyYXNoIGluIG1ha2UgY2hlY2sKKwkKKzIwMDYtMDktMzAgIFRoaWFnbyBNYWNpZWlyYSAgPHRoaWFnb0BrZGUub3JnPgorCisJKiBjb25maWd1cmUuaW46IGFkZCBEQlVTX0JJTkRJUiBhcyBhICNkZWZpbmUgdG8gQyBzb3VyY2UgY29kZS4KKworCSogdG9vbHMvZGJ1cy1sYXVuY2guYworCSogdG9vbHMvZGJ1cy1sYXVuY2guaAorCSogdG9vbHMvZGJ1cy1sYXVuY2gteDExLmM6CisJKiB0b29scy9kYnVzLWxhdW5jaC4xOiBBZGQgdGhlIC0tYXV0b2xhdW5jaCBvcHRpb24gdG8KKwlkYnVzLWxhdW5jaCwgd2hpY2ggbWFrZXMgaXQgc2NhbiBmb3IgYW4gZXhpc3Rpbmcgc2Vzc2lvbgorCXN0YXJ0ZWQgd2l0aCAtLWF1dG9sYXVuY2guIFdpdGggdGhhdCBvcHRpb24sIGl0IGFsc28gY3JlYXRlcworCWFuIFgxMSB3aW5kb3cgYW5kIHNhdmVzIHRoZSBidXMgYWRkcmVzcyBhbmQgUElEIHRvIGl0LgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5oOgorCSogZGJ1cy9kYnVzLXN5c2RlcHMtdW5peC5jIChfZGJ1c19nZXRfYXV0b2xhdW5jaF9hZGRyZXNzKTogQWRkCisJYSBmdW5jdGlvbiB0aGF0IHJ1bnMgImRidXMtbGF1bmNoIC0tYXV0b2xhdW5jaCIgdG8gcmV0cmlldmUKKwl0aGUgcnVubmluZyBELUJ1cyBzZXNzaW9uIGFkZHJlc3MgKG9yIHN0YXJ0IG9uZSBpZiBub25lIHdhcyBydW5uaW5nKQorCisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LmM6IEFkZCB0aGUgaGFuZGxlciBmb3IgdGhlICJhdXRvbGF1bmNoOiIKKyAgICAgICAgYWRkcmVzcyBwcm90b2NvbCwgd2hpY2ggdHJpZXMgdG8gZ2V0IHRoZSBydW5uaW5nIHNlc3Npb24gZnJvbQorICAgICAgICBkYnVzLWxhdW5jaC4KKworCSogZGJ1cy9kYnVzLWJ1cy5jOgorCSogZGJ1cy9kYnVzLWludGVybmFscy5oOiBNYWtlICJhdXRvbGF1bmNoOiIgYmUgdGhlIGRlZmF1bHQKKwlELUJ1cyBzZXNzaW9uIGJ1cyBhZGRyZXNzLgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jOiBGaXggaG9ycmlibGUgdHlwbyBpbiBlcnJvciBtZXNzYWdlLgorCisyMDA2LTA5LTE4ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiB0b29scy9NYWtlZmlsZS5hbTogdXNlIEBFWFBBTkRFRF9EQVRBRElSQCBpbnN0ZWFkIG9mIEBEQVRBRElSTkFNRUAgIAorCisyMDA2LTA5LTE3ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC5jIChfZGJ1c190cmFuc3BvcnRfZ2V0X2lzX2F1dGhlbnRpY2F0ZWQpOgorCWZpeCBzbyB0aGF0IGlmIHVuaXhfdXNlcl9mdW5jdGlvbiBpcyBzZXQgb24gd2luZG93cywgd2Ugc3RpbGwKKwlkbyB0aGUgZGVmYXVsdCBjaGVjayB0aGF0IHRoZSBhdXRoIGlkZW50aXR5IG1hdGNoZXMgdGhlIGJ1cyBpZGVudGl0eQorCisyMDA2LTA5LTE2ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC5jIChfZGJ1c190cmFuc3BvcnRfb3Blbik6IG1vZGlmeSB0byBkZWxlZ2F0ZQorCXRvIF9kYnVzX3RyYW5zcG9ydF9vcGVuX3BsYXRmb3JtX3NwZWNpZmljLAorCV9kYnVzX3RyYW5zcG9ydF9vcGVuX3NvY2tldCwKKwlhbmQgX2RidXNfdHJhbnNwb3J0X29wZW5fZGVidWdfcGlwZQorCisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LXByb3RlY3RlZC5oOiBhZGQgX2RidXNfdHJhbnNwb3J0X29wZW5fcGxhdGZvcm1fc3BlY2lmaWMKKworMjAwNi0wOS0xNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKyAgICAgICAgQXR0ZW1wdCBhdWRpdGluZyBwdWJsaWMgQVBJIHRvIHJlbW92ZSBhbGwgY2FzZXMgd2hlcmUgYSBVbml4CisJZnVuY3Rpb24gcmV0dXJucyB3ZWlyZCBlbXVsYXRlZCBnb28gdG8gV2luZG93cy4gVGhpcyBwcm9iYWJseSAKKwlicmVha3MgdGhlIGJ1cyBkYWVtb24gb24gV2luZG93cywgdG8gZml4IGl0IGFnYWluIHdlIG1heSAKKwluZWVkIHRvIHN0b3AgcHJvY2Vzc2luZyB1bml4LXNwZWNpZmljIGNvbmZpZyBvcHRpb25zIG9uIFdpbmRvd3MsCisJYW5kIG1heSBuZWVkIHRvIGFkZCBXaW5kb3dzLXNwZWNpZmljIHB1YmxpYyBBUEkgb3IgY29uZmlnIG9wdGlvbnMuCisJCisJKiBjb25maWd1cmUuaW4gKExUX0NVUlJFTlQsIExUX0FHRSk6IGluY3JlbWVudCBjdXJyZW50IGFuZCBhZ2UsCisJdG8gcmVmbGVjdCBhZGRlZCBpbnRlcmZhY2VzOyBzaG91bGQgbm90IGJyZWFrIHNvbmFtZS4KKwkKKwkqIGRidXMvZGJ1cy10cmFuc3BvcnQuYyAoX2RidXNfdHJhbnNwb3J0X2dldF9pc19hdXRoZW50aWNhdGVkKTogZG8KKwlub3QgaW52b2tlIHVuaXggdXNlciBmdW5jdGlvbiBvbiBXaW5kb3dzLiBLaW5kIG9mIGEgaGFja3kgZml4LCBidXQgCisJd2UgZG9uJ3Qgd2FudCBhICJ1bml4IHVpZCIgbGVha2luZyBvdXQgb24gV2luZG93cy4KKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYyAoZGJ1c19jb25uZWN0aW9uX2dldF9zb2NrZXQpOiBhZGQgbmV3IEFQSQorCXRvIGdldCB0aGUgc29ja2V0IGZkIG9uIFdpbmRvd3Mgb3IgVU5JWAorCShkYnVzX2Nvbm5lY3Rpb25fZ2V0X3VuaXhfZmQpOiBtYWtlIHRoaXMgYWx3YXlzIGZhaWwgb24gV2luZG93cworCisyMDA2LTA5LTE2ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLXNlcnZlci5jIChkYnVzX3NlcnZlcl9saXN0ZW4pOiBjaGFuZ2UgaG93IHRoaXMgd29ya3MKKwl0byBiZSBhYmxlIHRvIGRlbGVnYXRlIHRvIGEgc2V0IG9mIGhhbmRsZXJzIHRoYXQgY2FuIHN1Y2NlZWQsCisJZmFpbCwgb3IgY2hvb3NlIG5vdCB0byBoYW5kbGUuIEFsbG93cyB1cyB0byBoYXZlIAorCWRidXNfc2VydmVyX2xpc3Rlbl9wbGF0Zm9ybV9zcGVjaWZpYy4KKworCSogZGJ1cy9kYnVzLXNlcnZlci1zb2NrZXQuYyAoX2RidXNfc2VydmVyX25ld19mb3JfdGNwX3NvY2tldCk6CisJZmFjdG9yIG91dCB0aGUgdGNwIHNvY2tldCBzdHVmZiB0byBiZSB1c2VkIG9uIHdpbmRvd3MsIGxlYXZpbmcKKwl1bml4IGRvbWFpbiBzb2NrZXQgb25seSBpbiBkYnVzLXNvY2tldC11bml4LmMKKworCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC1zb2NrZXQuYworCShfZGJ1c190cmFuc3BvcnRfbmV3X2Zvcl90Y3Bfc29ja2V0KTogZmFjdG9yIG91dCB0aGUgdGNwIHNvY2tldAorCXN0dWZmIHRvIGJlIHVzZWQgb24gd2luZG93cywgbGVhdmluZyB1bml4IGRvbWFpbiBzb2NrZXQgb25seSAKKwlpbiBkYnVzLXRyYW5zcG9ydC11bml4LmMKKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYyAoZGJ1c19jb25uZWN0aW9uX2dldF91bml4X3VzZXIpOiBpbnNlcnQKKwl0ZW1wb3JhcnkgaGFjayB0byBiZSBzdXJlIHRoaXMgZmFpbHMgb24gd2luZG93cworCShkYnVzX2Nvbm5lY3Rpb25fZ2V0X3VuaXhfcHJvY2Vzc19pZCk6IGRpdHRvCisKKzIwMDYtMDktMTYgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy11bml4LmMgKF9kYnVzX29wZW5fdGNwX3NvY2tldCkgCisJKF9kYnVzX29wZW5fdW5peF9zb2NrZXQsIF9kYnVzX29wZW5fc29ja2V0KTogY2hhbmdlIEFQSSBmb3IgCisJX2RidXNfb3Blbl9zb2NrZXQgc28gdGhlIGRvbWFpbi90eXBlL3Byb3RvY29sIGZyb20gc3lzdGVtIGhlYWRlcnMKKwlhcmUgbm90IHJlcXVpcmVkLiBUaGlzIGlzIGtpbmQgb2YgcG9pbnRsZXNzIHRob3VnaCB1bmxlc3Mgd2UgbW92ZQorCXBhcnQgb2YgX2RidXNfY29ubmVjdF90Y3Bfc29ja2V0IGludG8gc3lzZGVwcy5jIGluc3RlYWQgb2YKKwlzeXNkZXBzLXVuaXguYywgd2hpY2ggd291bGQgbWVhbiBhZGRpbmcgYSB3cmFwcGVyIGFyb3VuZAorCWJpbmQvbGlzdGVuL2V0Yy4KKwlBbHNvLCBhZGQgREJ1c0Vycm9yIHRvIHRoZSBzb2NrZXQtb3BlbmluZyBmdW5jdGlvbnMgc28gdGhleSAKKwlkb24ndCByZXF1aXJlIHVzZSBvZiBlcnJuby4KKworMjAwNi0wOS0xNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLXVuaXguaDogc21hbGwgY2hhbmdlIHRvIFBldGVyJ3MgcGF0Y2ggdG8gbWFrZQorCWRidXMtc3lzZGVwcy11bml4LXV0aWwuYyBidWlsZCwgYWRkIHVuaXgtc3BlY2lmaWMgc3lzZGVwcyBoZWFkZXIuCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmgsIGRidXMtc3lzZGVwcy11bml4LmM6IHBhdGNoIGZyb20gUGV0ZXIgCisJS8O8bW1lbCBidWcgIzgyNDkgdG8gbWFrZSB0aGUgc3lzZGVwcy5oIHJlYWQvd3JpdGUvb3Blbi9jbG9zZQorCWZ1bmN0aW9ucyBzcGVjaWZpY2FsbHkgZm9yIHNvY2tldHMgb25seSwgYW5kIG1vdmUgZ2VuZXJpYyAKKwlyZWFkL3dyaXRlL29wZW4vY2xvc2UgaW50byB1bml4LXNwZWNpZmljIGNvZGUuCisKKzIwMDYtMDktMTQgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LXVuaXguYyAodW5peF9kb19pdGVyYXRpb24pOiBmaXggYSB2YWxncmluZAorCWNvbXBsYWludCBhYm91dCBhY2Nlc3NpbmcgcmV2ZW50cyB3aGVuIHBvbGwgcmV0dXJucyAwLCBmcm9tIEp1bGlhbiBTZXdhcmQuCisKKzIwMDYtMDktMTQgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIFJlbGVhc2VkIDEuMCBSQyAxICgwLjkzKSAKKworMjAwNi0wOS0xNCAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMtdXRpbC11bml4LmMgKF9kYnVzX3dyaXRlX3BpZF9maWxlKToKKwl1c2UgX2RidXNfY2xvc2UgaW5zdGVhZCBvZiBjbG9zZQorCisyMDA2LTA5LTE0ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jOiBBZGQgc3VwcG9ydCBmb3IgTE9DQUxfQ1JFRFMgc29ja2V0CisJY3JlZGVudGlhbHMuICBGaXhlcyAiZXh0ZXJuYWwiIGF1dGhlbnRpY2F0aW9uIHVuZGVyIGUuZy4gTmV0QlNECisJd2hpY2ggZG9lcyBub3Qgc3VwcG9ydCBhbnkgb3RoZXIgc29ja2V0IGNyZWRlbnRpYWxzIG1lY2hhbmlzbS4KKwkoUGF0Y2ggZnJvbSBKdWxpbyBNLiBNZXJpbm8gVmlkYWwgIDxqbW12IGF0IE5ldEJTRCBkb3Qgb3JnPikKKworMjAwNi0wOS0xNCAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLXRocmVhZHMuYzogQWxsb3cgcmVjdXJzaXZlIG11dGV4J3MgdG8gYmUgcGFzc2VkIGludG8KKwlkYnVzX3RocmVhZHNfaW5pdCBhbmQgYmUgdXNlZCBieSB0aGUgZGJ1cyBtdXRleCBmdW5jdGlvbnMgdG8KKwlhdm9pZCBkZWFkbG9ja3MuCisKKwkqIGRvYy9UT0RPOiBSZW1vdmUgcmVjdXJzaXZlIG11dGV4IGRidXNfY29ubmVjdGlvbl9kaXNwYXRjaCBUT0RPIGl0ZW0KKworMjAwNi0wOS0xMyAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMtdXRpbC11bml4LmMgKF9kYnVzX2RpcmVjdG9yeV9nZXRfbmV4dF9maWxlKToKKwl1c2UgdGhyZWFkc2FmZSByZWFkZGlyX3IgaW5zdGVhZCBvZiByZWFkZGlyCisKKzIwMDYtMDktMTMgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGRidXMtdGhyZWFkcy5jIChkYnVzX3RocmVhZHNfaW5pdF9kZWZhdWx0KTogTmV3IG1ldGhvZCBmb3IKKwlpbml0aWFsaXppbmcgdGhlIGludGVybmFsIHRocmVhZCBpbXBsZW1lbnRhdGlvbiAoUGF0Y2ggZnJvbQorCUFsZXhhbmRlciBMYXJzc29uIDxhbGV4bCBhdCByZWRoYXQgZG90IGNvbT4pCisKKzIwMDYtMDktMTEgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIHJlbW92ZSBhIGJ1bmNoIG9mIHRvZG8gaXRlbXMgZnJvbSB0aGUgMS4wIGxpc3QKKworMjAwNi0wOS0xMSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogYnVzL2FjdGl2YXRpb24uYywgYnVzL2Rlc2t0b3AtZmlsZS5jOiBEaXN0aW5ndWlzaCBiZXR3ZWVuIE9PTSBhbmQKKwlrZXkgbm90IGZvdW5kCisKKzIwMDYtMDktMTEgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1pbnRlcm5hbC5jOiBBZGQgZGJ1c19pc192ZXJib3NlIHNvIHdlIGNhbiBoYXZlIG1vcmUKKwljb21wbGV4IGRlYnVnZ2luZyBjb2RlCisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLWJhc2ljLmMgKF9kYnVzX21hcnNoYWxfcmVhZF9maXhlZF9tdWx0aSk6IE1vdmUKKwliZXR3ZWVuIHRoZSB0ZXN0IHN1aXRlIGlmZGVmcworCShfZGJ1c192ZXJib3NlX2J5dGVzKTogcmV0dXJuIGlmIHZlcmJvc2l0eSBpcyBub3QgZW5hYmxlZCAKKworMjAwNi0wOS0xMSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLW1hcnNoYWwtcmVjdXJzaXZlLXV0aWwuYywgZGJ1cy9kYnVzLW1hcnNoYWwtcmVjdXJzaXZlLmM6CisJcmVtb3ZlIERCdXNNYXJrCisKKzIwMDYtMDktMTAgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisgICAgICAgcGF0Y2ggbW9zdGx5IGJ5IFBldGVyIEvDvG1tZWwsIGJ1ZyAjODIxMQorCQorCSogZGJ1cy9kYnVzLXN5c2RlcHMtdW5peC5jOiBuZXcgZmlsZSwgd2hpY2ggc3BsaXRzIG91dAorCXVuaXgtc3BlY2lmaWMgc3R1ZmYgaW4gZGJ1cy1zeXNkZXBzLmMKKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYzogZG9uJ3QgaW5jbHVkZSBhbnkgVU5JWC1vbmx5IGhlYWRlcnMsIAorCWFuZCBtb3ZlIHVuaXgtc3BlY2lmaWMgc3R1ZmYgdG8gZGJ1cy1zeXNkZXBzLXVuaXguYworCisJKiBjb25maWd1cmUuaW46IGNoZWNrIEhBVkVfRVJSTk9fSAorCQorMjAwNi0wOS0wOCAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogYnVzL3Rlc3QtbWFpbi5jIChtYWluKTogSW5pdGlhbGl6ZSB0aHJlYWRpbmcgZHVyaW5nIHRlc3RzCisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMgKF9kYnVzX2Nvbm5lY3Rpb25fbmV3X2Zvcl90cmFuc3BvcnQpOgorCVVubG9jayBjb25uZWN0aW9uIG9uIGVycm9yCisJKGdlbmVyYXRlX2xvY2FsX2Vycm9yX21lc3NhZ2UpOiBzdGF0aWMgbWV0aG9kIGZvciBnZW5lcmF0aW5nCisJYW4gZXJyb3IgbWVzc2FnZSB3aGVuIHdlIGRvbid0IGhhdmUgYSBtZXNzYWdlIHRvIHJlcGx5IHRvCisJKF9kYnVzX2Nvbm5lY3Rpb25fYmxvY2tfcGVuZGluZ19jYWxsKTogU2VuZCBhIGRpc2Nvbm5lY3QgZXJyb3IKKwlpbnN0ZWFkIG9mIGp1c3QgYSB0aW1lb3V0IChOVUxMKSB3aGVuIHRoZSBidXMgZ2V0cyBkaXNjb25uZWN0ZWQKKwl3aGlsZSBibG9ja2luZyBmb3IgYSByZXBseS4KKwkKKzIwMDYtMDktMDggIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMgKGRidXNfY29ubmVjdGlvbl9kaXNwYXRjaCk6IFByb3Blcmx5IHJlbW92ZQorCWZpbHRlcnMgKFBhdGNoIGZyb20gS2ltbW8gSMOkbcOkbMOkaW5lbiAKKwk8a2ltbW8gZG90IGhhbWFsYWluZW4gYXQgbm9raWEgZG90IGNvbT4pCisKKzIwMDYtMDktMDcgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLWludGVybmFsLmg6IEFkZCBwcm90b3R5cGUgZm9yIAorCV9kYnVzX2Nvbm5lY3Rpb25fdGVzdF9nZXRfbG9ja3MgdG8gcmVtb3ZlIHdhcm5pbmcKKworMjAwNi0wOS0wNyAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLXNwYXduLmMgKF9kYnVzX3NwYXduX2FzeW5jX3dpdGhfYmFieXNpdHRlcik6IE1ha2Ugc3VyZSB3ZQorCWNsb3NlIGNoaWxkX2Vycl9yZXBvcnRfcGlwZVtXUklURV9FTkRdIG9uIGV4ZWMgKFBhdGNoIGZyb20gCisJS2ltbW8gSMOkbcOkbMOkaW5lbiA8a2ltbW8gZG90IGhhbWFsYWluZW4gYXQgbm9raWEgZG90IGNvbT4pCisKKzIwMDYtMDktMDcgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIENsZWFuIHVwIGNsb3NlIGNhbGxzIHRvIHVzZSBfZGJ1c19jbG9zZSAoUGF0Y2ggZnJvbSAKKwlLaW1tbyBIw6Rtw6Rsw6RpbmVuIDxraW1tbyBkb3QgaGFtYWxhaW5lbiBhdCBub2tpYSBkb3QgY29tPikKKworMjAwNi0wOS0wNiAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogZG9jL1RPRE86CisJLSBSZW1vdmUgcGVuZGluZyBjYWxsIGxvY2tpbmcgdG9kbyBpdGVtCisJLSBkYnVzX2Nvbm5lY3Rpb25fb3BlbiBub3cgaG9sZHMgaGFyZCByZWYuICBSZW1vdmUgdG9kbyBpdGVtCisJLSBkbyBwcm9wZXIgbG9ja2luZyBvbiBfZGJ1c19idXNfY2hlY2tfY29ubmVjdGlvbl9hbmRfdW5yZWYKKwkgIGFuZCBoYW5kbGUgREJVU19CVVNfU1RBUlRFUi4gUmVtb3ZlIHRvZG8gaXRlbQorCS0gV2FybiBvbiBjbG9zaW5nIG9mIGEgc2hhcmVkIGNvbm5lY3Rpb24uICBSZW1vdmUgdG9kbyBpdGVtCisKKwkqIGJ1cy9idXMuYywgYnVzL2Nvbm5lY3Rpb24uYywgYnVzL2Rpc3BhdGNoLmMsIGRidXMvZGJ1cy1idXMuYywKKwlkYnVzL2RidXMtY29ubmVjdGlvbi5jOiBVc2UgdGhlIGRidXNfY29ubmVjdGlvbl9jbG9zZV9pbnRlcm5hbAorCXNvIHdlIGRvbid0IGdldCB0aGUgd2FybmluZyB3aGVuIGNsb3Npbmcgc2hhcmVkIGNvbm5lY3Rpb25zCisKKwkqIHRlc3QvdGVzdC1zZXJ2aWNlLmMsIHRlc3QvdGVzdC1zaGVsbC1zZXJ2aWNlLmM6IEFwcGxpY2F0aW9ucworCWRvbid0IGNsb3NlIHNoYXJlZCBjb25uZWN0aW9ucyB0aGVtc2VsdmVzIHNvIHdlIHVucmVmIGluc3RlYWQgb2YKKwljbG9zZQorCisJKiB0ZXN0L3Rlc3QtdXRpbHMuYyAodGVzdF9jb25uZWN0aW9uX3NodXRkb3duKTogQ2xvc2UgdGhlIGNvbm5lY3Rpb24KKworCSogZGJ1cy9kYnVzLWJ1cy5jIChfZGJ1c19idXNfY2hlY2tfY29ubmVjdGlvbl9hbmRfdW5yZWYpOiBDaGFuZ2VkIHRvCisJX2RidXNfYnVzX2NoZWNrX2Nvbm5lY3Rpb25fYW5kX3VucmVmX3VubG9ja2VkIHNpbmNlIHdlIG9ubHkgY2FsbCB0aGlzCisJbWV0aG9kIG9uIGEgbG9ja2VkIGNvbm5lY3Rpb24uICAKKwlNYWtlIHN1cmUgd2UgY2FsbCBfZGJ1c19jb25uZWN0aW9uX3VucmVmX3VubG9ja2VkIGluc3RlYWQgb2YgCisJZGJ1c19jb25uZWN0aW9uX3VucmVmIGFsc28uCisJSGFuZGxlIERCVVNfQlVTX1NUQVJURVIgY29ycmVjdGx5CisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMgKGNvbm5lY3Rpb25fcmVjb3JkX3NoYXJlZF91bmxvY2tlZCk6CisJTWFyayBhcyBzaGFyZWQgYW5kIGhhcmQgcmVmIHRoZSBjb25uZWN0aW9uCisJKGNvbm5lY3Rpb25fZm9yZ2V0X3NoYXJlZF91bmxvY2tlZCk6IFJlbW92ZSB0aGUgaGFyZCByZWYgZnJvbSB0aGUgCisJY29ubmVjdGlvbgorCShfZGJ1c19jb25uZWN0aW9uX2Nsb3NlX2ludGVybmFsX2FuZF91bmxvY2spOiAgTmV3IGludGVybmFsIGZ1bmN0aW9uCisJd2hpY2ggdGFrZXMgYSBsb2NrZWQgY29ubmVjdGlvbiBhbmQgdW5sb2NrcyBpdCBhZnRlciBjbG9zaW5nIGl0CisJKF9kYnVzX2Nvbm5lY3Rpb25fY2xvc2VfaW50ZXJuYWwpOiBOZXcgaW50ZXJuYWwgZnVuY3Rpb24gd2hpY2ggYWN0cworCWxpa2UgdGhlIG9yaWdvbmFsIGRidXNfY29ubmVjdGlvbl9jbG9zZSBtZXRob2QgYnkgZ3JhYmJpbmcgYSBjb25uZWN0aW9uCisJbG9jayBhbmQgY2FsbGluZyBfZGJ1c19jb25uZWN0aW9uX2Nsb3NlX2ludGVybmFsX2FuZF91bmxvY2sKKwkoZGJ1c19jb25uZWN0aW9uX2Nsb3NlKTogUHVibGljIGNsb3NlIG1ldGhvZCwgd2FybnMgd2hlbiB0aGUgYXBwCisJdHJ5cyB0byBjbG9zZSBhIHNoYXJlZCBjb25uZWN0aW9uCisKKzIwMDYtMDktMDYgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGJ1cy9kcml2ZXIuYzoKKwkoYnVzX2RyaXZlcl9nZW5lcmF0ZV9pbnRyb3NwZWN0X3N0cmluZyk6IE5ldyBtZXRob2QgZm9yIHBvcHVsYXRpbmcKKwlhIERCdXNTdHJpbmcgd2l0aCB0aGUgaW50cm9zcGVjdCBkYXRhCisJKGJ1c19kcml2ZXJfaGFuZGxlX2ludHJvc3BlY3QpOiBNb3ZlIGludHJvc3BlY3QgZ2VuZXJhdGlvbiBjb2RlIHRvIAorCWJ1c19kcml2ZXJfZ2VuZXJhdGVfaW50cm9zcGVjdF9zdHJpbmcKKworCSogYnVzL21haW4uYzoKKwkoaW50cm9zcGVjdCk6IE5ldyBmdW5jdGlvbiB3aGljaCBwcmludHMgb3V0IHRoZSBpbnRyb3BlY3QgZGF0YSBhbmQKKwlleGl0cworCShtYWluKTogQWRkIGEgLS1pbnRyb3NwZWN0IHN3aXRjaAorCisyMDA2LTA5LTA2ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBkb2MvVE9ETzogUmVtb3ZlZCBkdGQgcHVibGlzaGluZyBpdGVtLiAgCisJSXQgc2VlbXMgdGhlIGR0ZCBoYXMgYWxyZWFkeSBiZWVuIGFkZGVkIGF0CisJaHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc3RhbmRhcmRzL2RidXMvMS4wL2ludHJvc3BlY3QuZHRkCisKKzIwMDYtMDktMDUgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGRvYy9UT0RPLCB2YXJpb3VzIHNvdXJjZSBmaWxlczogQXVkaXRlZCB0b2RvJ3MgYW5kIEZJWE1FJ3MgYW5kCisJcHJlcGVuZGVkIHRoZSBvbmVzIHdlIHNob3VsZCBiZSBsb29raW5nIGF0IHdpdGggMS4wLiAgVGhvc2UKKwlwcmVwZW5kZWQgd2l0aCAxLjA/IG5lZWQgY2xlcmlmaWNhdGlvbiBvciBtaWdodCBub3QgYmUgbmVlZGVkCisJZm9yIDEuMAorCisyMDA2LTA5LTA1ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtcGVuZGluZy1jYWxsLmM6IEFkZCBzb21lIGNoZWNrcyBzbyB3ZSBkb24ndCBjcmFzaCBvbgorCU5VTEwgaW4gdGhlIHB1YmxpYyBBUEkgKFBhdGNoIGZyb20gS2ltbW8gSMOkbcOkbMOkaW5lbiAKKwk8a2ltbW8gZG90IGhhbWFsYWluZW4gYXQgbm9raWEgZG90IGNvbT4pCisKKzIwMDYtMDktMDUgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogRml4IGZvciBPUy1YIGNvbXBpbGUgdGltZSBlbmRpYW4gaXNzdWVzIChwYXRjaCBmcm9tCisJQmVuamFtaW4gUmVlZCA8cmFuZ2VyIGF0IGJlZnVuayBkb3QgY29tPikKKworMjAwNi0wOS0wNSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogY29uZmlndXJlLmluOiBDaGVjayBmb3Igbm8tY29tbW9uIGNvbXBpbGVyIGZsYWcgKE9TLVggZml4IGZyb20KKwlCZW5qYW1pbiBSZWVkIDxyYW5nZXIgYXQgYmVmdW5rIGRvdCBjb20+KQorCisyMDA2LTA5LTAxICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiB0b29scy9kYnVzLWxhdW5jaC5jOiBBZGQgYSBzaWd0ZXJtIGhhbmRsZXIgKHBhdGNoIGZyb20gRnJlZGVyaWMgQ3JvemF0CisJPGZjcm96YXQgYXQgbWFuZHJpdmEgZG90IGNvbT4pCisKKzIwMDYtMDgtMjkgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiB0ZXN0L3Rlc3Qtc2VydmljZS5jIChwYXRoX21lc3NhZ2VfZnVuYyk6IGZpeCBsYWNrIG9mIHJldHVybiB2YWx1ZQorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jIChfZGJ1c19wcmludGZfc3RyaW5nX3VwcGVyX2JvdW5kKTogZml4CisJZm9ybWF0dGluZywgcmVtb3ZlICNpZmRlZiwgYW5kIGZpeCBkb2NzLiAjaWZkZWYgZG9lc24ndCBtYWtlCisJYW55IG1vcmUgc2Vuc2UgdGhhbiBvbiBhbnl0aGluZyBlbHNlIGluIHRoaXMgZmlsZS4KKwkoX2RidXNfZ2V0X3RtcGRpcik6IGFkZCBjb25zdCB0byByZXR1cm4gdmFsdWUsIGFuZCBrZWVwIHRoZQorCXJlc3VsdHMgb2YgdGhlIHZhcmlvdXMgZ2V0ZW52IGFyb3VuZCBpbiBhIHN0YXRpYyB2YXJpYWJsZS4KKworMjAwNi0wOC0yOSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLXV0aWwuYywgZGJ1cy9kYnVzLXN5c2RlcHMtdXRpbC11bml4LmM6IGNoYW5nZQorCWZyb20gUmFsZiBIYWJhY2tlciB0byBtb3ZlIFVOSVgtc3BlY2lmaWMgc3lzZGVwcyBpbnRvIGEgc2VwYXJhdGUgZmlsZS4KKworMjAwNi0wOC0yNSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogdGVzdC9NYWtlZmlsZS5hbTogY2hhbmdlIGZpbmQgdG8gdXNlIHN5bnRheCB0aGF0IHdvcmtzIHdpdGggbm9uCisJZ251IHZlcnNpb25zIG9mIGZpbmQKKworMjAwNi0wOC0yNSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC5jOiBmaXggaW52YWxpZCBkZXJlZiB3aGVuIGNoZWNraW5nIGlmCisJYSB2dGFibGUgbWV0aG9kIGV4aXN0cyAoUGF0Y2ggZnJvbSBDaHJpc3RpYW4gRWhybGljaGVyIAorCTxjaCBkb3QgZWhybGljaGVyIGF0IGdteCBkb3QgZGU+KQorCisyMDA2LTA4LTI1ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBjb25maWd1cmUuaW4sIGRidXMvTWFrZWZpbGUuYW0sIHRlc3QvbmFtZS10ZXN0L3J1bi10ZXN0LnNoLCAKKwl0ZXN0L25hbWUtdGVzdC9NYWtlZmlsZS5hbTogRml4ZWQgc29tZSBpc3N1ZXMgd2l0aCBnZXR0aW5nIGdldCBkYnVzIAorCXRvIGJ1aWxkIHdpdGggYnVpbGRkaXIgIT0gc3JjZGlyIChUYWtlbiBmcm9tIGEgcGF0Y2ggYnkgQmVybmFyZCBMZWFrCisJPGJlcm5hcmQgYXQgYnJlbmRhLWFya2xlIGRvdCBkZW1vbiBkb3QgY28gZG90IHVrPikKKworMjAwNi0wOC0yNSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogY29uZmlndXJlLmluOiBGaXggREJVU19EQUVNT05ESVIgdG8gdXNlIEVYUEFOREVEX0JJTkRJUiBmb3IgdGhlCisJZGVmYXVsdCBjYXNlCisKKzIwMDYtMDgtMjUgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYywgYnVzL01ha2VmaWxlLmFtOiBHZW5lcmFsaXplIGtxdWV1ZSBzdXBwb3J0IHNvIHRoYXQKKwlpdCB3b3JrcyBvbiBhbnkgc3lzdGVtIHByb3ZpZGluZyB0aGlzIGludGVyZmFjZSwgbm90IG9ubHkgRnJlZUJTRC4KKwlGb3IgZXhhbXBsZSwgTmV0QlNELiAoUGF0Y2ggYnkgSnVsaW8gTS4gTWVyaW5vIFZpZGFsICA8am1tdiBhdCBOZXRCU0QgZG90IG9yZz4pCisKKzIwMDYtMDgtMjAgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkb2MvZGJ1cy1mYXEueG1sLCBkb2MvZGJ1cy10dXRvcmlhbC54bWw6IHNvbWUgaW1wcm92ZW1lbnRzIHRvCisJdGhlIGRvY3MKKworMjAwNi0wOC0xOCAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogUmVsZWFzZWQgMC45MiAKKworMjAwNi0wOC0xOCAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLXRocmVhZHMuYyAoZGJ1c190aHJlYWRzX2luaXQpOiBjaGFuZ2UgdGhlIGRvY3VtZW50YXRpb24KKwl0byByZWZsZWN0IHRoZSBpbml0IGxhdGUgY2hhbmdlCisKKwkqIGJ1cy9idXMuYyAoYnVzX2NvbnRleHRfbmV3KTogQ2hlY2sgdXNlciBiZWZvcmUgd2UgZm9yayBzbyB3ZSBjYW4KKwlwcmludCBvdXQgYW4gZXJyb3IgbWVzc2FnZSBhIHVzZXIgd2lsbCBiZSBhYmxlIHRvIHNlZQorCisyMDA2LTA4LTE4ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJUGF0Y2ggcHJvdmlkZWQgYnkgUmFsZiBIYWJhY2tlciAocmFsZiBkb3QgaGFiYWNrZXIgYXQgZnJlZW5ldCBkb3QgZGUpIAorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jLCBkYnVzL2RidXMtdGhyZWFkcy5jLCBkYnVzL2RidXMtaW50ZXJuYWxzLmg6CisJQWRkIHR3byBtb3JlIGdsb2JhbCBsb2NrcyBmb3IgdXNlIG9uIHdpbmRvd3MgcGxhdGZvcm1zLiAgVGhlc2UgYXJlCisJdW51c2VkIG9uIG5vbi13aW5kb3dzIHBsYXRmb3JtcyBidXQgYXJlIG5vdCBpZmRlZmVkIG91dCB0byBhdm9pZAorCXBvdGVudGlhbCBidWdzIChpLmUuIHRoZSBmZXcgYnl0ZXMgbG9zdCBkb2VzIG5vdCB3YXJyZW50IHRoZSBleHRyYQorCW1haW50YW5lbmNlIGFuZCBjb21wbGV4aXR5IHRoYXQgaGF2aW5nIHNlcGVyYXRlIHNldHMgb2YgbG9ja3Mgd291bGQKKwljYXVzZSkKKworMjAwNi0wOC0xOCAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogYnVzL3NlcnZpY2VzLmMgKGJ1c19yZWdpc3RyeV9hY3F1aXJlX3NlcnZpY2UpOiBSZXR1cm4gYW4gZXJyb3IKKwl3aGVuIGFuIGFwcGxpY2F0aW9uIHRyaWVzIHRvIHJlZ2lzdGVyIHRoZSBvcmcuZnJlZWRlc2t0b3AuREJ1cyBCdXMgTmFtZQorCisJKiBidXMvc2VydmljZXMuYyAoYnVzX3JlZ2lzdHJ5X3JlbGVhc2Vfc2VydmljZSk6IFJldHVybiBhbiBlcnJvcgorCXdoZW4gYW4gYXBwbGljYXRpb24gdHJpZXMgdG8gcmVsZWFzZSB0aGUgb3JnLmZyZWVkZXNrdG9wLkRCdXMgQnVzIE5hbWUKKworMjAwNi0wOC0xNyAgQWxwIFRva2VyICA8YWxwQGF0b2tlci5jb20+CisKKwkqIGRvYy9kYnVzLXNwZWNpZmljYXRpb24ueG1sOiBGaXggc29tZSBtaW5vciB0eXBvcy4KKworMjAwNi0wOC0xNyAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogY29uZmlndXJlLmluOiB1c2UgJHdpdGhfaW5pdF9zY3JpcHRzIGluc3RlYWQgb2YgJG9wZXJhdGluZ19zeXN0ZW0KKwl0byBkZXRlcm1pbmUgd2hlcmUgdG8gc3RvcmUgdGhlIHBpZCBzaW5jZSB0aGUgaW5pdCBzY3JpcHRzIG1hbmlwdWxhdGUgCisJdGhlIHBpZCBmaWxlIChwYXRjaCBmcm9tIE1hcmNlbG8gUmljYXJkbyBMZWl0bmVyIAorCTxtYXJjZWxvIGRvdCBsZWl0bmVyIGF0IHRlcnJhIGRvdCBjb20gZG90IGJyPi4gIAorCisyMDA2LTA4LTE2ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtdGhyZWFkcy5jOiBBZGQgc3RhdGljIERCdXNMaXN0ICp1bmluaXRpYWxpemVkX211dGV4X2xpc3QgYW5kCisJc3RhdGljIERCdXNMaXN0ICp1bmluaXRpYWxpemVkX2NvbmR2YXJfbGlzdCB0byBzdXBwb3J0IG5ldyBsYXRlIAorCWluaXRpYWxpemF0aW9uIHRocmVhZGluZyBtb2RlbC4gIEluIHRoaXMgbW9kZWwgdGhyZWFkcyBjYW4gYmUgaW5pdGlhbGl6ZWQKKwlldmVuIGFmdGVyIHRoZSBELUJ1cyBBUEkgaGFzIGJlZW4gdXNlZCBidXQgc3RpbGwgbmVlZHMgdG8gYmUgaW5pdGlhbGl6ZWQgCisJYmVmb3JlIHRoZSBzZWNvbmQgdGhyZWFkIGhhcyBiZWVuIHN0YXJ0ZWQuICBNdXRleGVzIGFuZCBjb25kdmFyIGFkZHJlc3NlcworCWFyZSBzdG9yZWQgaW4gdGhlIHR3byBzdGF0aWMgbGlzdHMgYW5kIGFyZSByZXBsYWNlZCB3aXRoIGFjdHVhbGwgbG9ja3MKKwl3aGVuIHRocmVhZHMgYXJlIGluaXRhbGl6ZWQuCisJKF9kYnVzX211dGV4X25ld19hdF9sb2NhdGlvbik6IE5ldyBtZXRob2QgZm9yIGNyZWF0aW5nIGEgbXV0ZXggYW5kIHBsYWNpbmcKKwl0aGUgbG9jYXRpb24gaW50byB0aGUgc3RhdGljIGxpc3QKKwkoX2RidXNfbXV0ZXhfZnJlZV9hdF9sb2NhdGlvbik6IE5ldyBtZXRob2QgZm9yIHJlbW92aW5nIGEgbXV0ZXggbG9jYXRpb24gCisJZnJvbSB0aGUgc3RhdGljIGxpc3QgYW5kIGZyZWVpbmcgdGhlIG11dGV4CisJKF9kYnVzX2NvbmR2YXJfbmV3X2F0X2xvY2F0aW9uKTogTmV3IG1ldGhvZCBmb3IgY3JlYXRpbmcgYSBjb25kaXRpb25hbCAKKwl2YXJpYWJsZSBhbmQgcGxhY2luZyB0aGUgbG9jYXRpb24gaW50byB0aGUgc3RhdGljIGxpc3QKKwkoX2RidXNfY29uZHZhcl9mcmVlX2F0X2xvY2F0aW9uKTogTmV3IG1ldGhvZCBmb3IgcmVtb3ZpbmcgYSBjb25kaXRpb25hbAorCXZhcmlhYmxlIGxvY2F0aW9uIGZyb20gdGhlIHN0YXRpYyBsaXN0IGFuZCBmcmVlaW5nIHRoZSBjb25kaXRpb25hbCB2YXJpYWJsZSAKKwkoaW5pdF91bmluaXRpYWxpemVkX2xvY2tzKTogQXRvbWljIG1ldGhvZCB3aGljaCBnb2VzIHRocm91Z2ggdGhlIHN0YXRpYyAKKwlsaXN0cyBvZiBtdXRleCBhbmQgY29uZHZhciBsb2NhdGlvbiBhbmQgdXBkYXRlcyB0aGVtIHdpdGggYWN0dWFsbCBsb2NrcworCShpbml0X2dsb2JhbF9sb2Nrcyk6IGNoYW5nZWQgdG8gaW5pdF9sb2NrcworCQorCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYzoKKwkoX2RidXNfY29ubmVjdGlvbl90ZXN0X2dldF9sb2Nrcyk6IE5ldyBtZXRob2QgZm9yIHRlc3RzIHRvIGNoZWNrIGNvbm5lY3Rpb25zCisJKF9kYnVzX2Nvbm5lY3Rpb25fbmV3X2Zvcl90cmFuc3BvcnQpOiBVc2UgdGhlIG5ldyBhdF9sb2NhdGlvbiBtdXRleCBhbmQKKwljb25kdmFyIEFQSQorCShkYnVzX2Nvbm5lY3Rpb25fYWxsb2NhdGVfZGF0YV9zbG90KTogUGFzcyBpbiB0aGUgZ2xvYmFsIGxvY2sgYWRkcmVzcworCXRvIF9kYnVzX2RhdGFfc2xvdF9hbGxvY2F0b3JfYWxsb2MKKworCSogZGJ1cy9kYnVzLWRhdGFzbG90LmM6CisJKF9kYnVzX2RhdGFfc2xvdF9hbGxvY2F0b3JfYWxsb2MpOiBVc2UgdGhlIGFkZHJlc3Mgb2YgdGhlIG11dGV4CisJaW5zdGVhZCBvZiB0aGUgbXV0ZXggaXRzZWxmCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmM6CisJKGRidXNfbWVzc2FnZV9hbGxvY2F0ZV9kYXRhX3Nsb3QpOiBQYXNzIGluIHRoZSBnbG9iYWwgbG9jayBhZGRyZXNzCisJdG8gX2RidXNfZGF0YV9zbG90X2FsbG9jYXRvcl9hbGxvYworCisJKiBkYnVzL2RidXMtcGVuZGluZy1jYWxsLmM6CisJKGRidXNfcGVuZGluZ19jYWxsX2FsbG9jYXRlX2RhdGFfc2xvdCk6IFBhc3MgaW4gdGhlIGdsb2JhbCBsb2NrIGFkZHJlc3MKKwl0byBfZGJ1c19kYXRhX3Nsb3RfYWxsb2NhdG9yX2FsbG9jCisKKwkqIGRidXMvZGJ1cy1zZXJ2ZXIuYzoKKwkoX2RidXNfc2VydmVyX2luaXRfYmFzZSk6IFVzZSB0aGUgbmV3IGF0X2xvY2F0aW9uIG11dGV4IEFQSQorCShkYnVzX3NlcnZlcl9hbGxvY2F0ZV9kYXRhX3Nsb3QpOiBQYXNzIGluIHRoZSBnbG9iYWwgbG9jayBhZGRyZXNzCisJdG8gX2RidXNfZGF0YV9zbG90X2FsbG9jYXRvcl9hbGxvYworCisJKiB0ZXN0L25hbWUtdGVzdC90ZXN0LXRocmVhZHMtaW5pdC5jOiBOZXcgdGVzdCBjYXNlIGZvciBsYXRlIHRocmVhZAorCWluaXRpYWxpemF0aW9uCisKKzIwMDYtMDgtMTQgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1kYXRhc2xvdC5jIChfZGJ1c19kYXRhX3Nsb3RfYWxsb2NhdG9yX2FsbG9jKToKKwlDaGFuZ2UgX2RidXNfYWJvcnQgdG8gX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkIGJlY2F1c2UgX2RidXNfYWJvcnQKKwljYXVzZXMgY29tcGlsZSBwcm9ibGVtcyB3aGVuIGFzc2VydHMgYXJlIHR1cm5lZCBvZmYKKwlLZWVwaW5nIF9kYnVzX3dhcm4gZm9yIHByaW50aW5nIG91dCB0aGUgbWVzc2FnZSBzbyBldmVuIGlmCisJYXNzZXJ0cyBhcmUgdHVybmVkIG9mZiB0aGUgdXNlciBnZXRzIHRoZSBtZXNzYWdlcyB0aGF0IHNvbWV0aGluZyBpcyAKKwl3cm9uZyAKKworMjAwNi0wOC0xNCAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCVBhdGNoZXMgYnkgS2phcnRhbiBNYXJhYXMgPGttYXJhYXMgYXQgZ25vbWUgZG90IG9yZz4KKworCSogYnVzL3NlcnZpY2VzLmMgKGJ1c19zZXJ2aWNlX2xpc3RfcXVldWVkX293bmVycyk6CisJQWRkIGEgcG9pbnRlciBjYXN0IHRvIGZpeCBjb21waWxlciB3YXJuaW5nCisKKwkqIGRidXMvZGJ1cy1kYXRhc2xvdC5jIChfZGJ1c19kYXRhX3Nsb3RfbGlzdF9nZXQpOgorCXJldHVybiBhIE5VTEwgaW5zdGVhZCBvZiBGQUxTRSBzaW5jZSB0aGUgcmV0dXJuIHR5cGUKKwlpcyBub3QgZXhwZWN0aW5nIGEgYm9vbGVhbgorCisJKiBkYnVzL2RidXMtbWFyc2hhbC1iYXNpYy5jIChfZGJ1c19tYXJzaGFsX3Rlc3QpOgorCVJlbW92ZSB1bnVzZWQgdmFyaWFibGUKKworCSogZGJ1cy9kYnVzLW1hcnNoYWwtcmVjdXJzaXZlLXV0aWwuYyAobm9kZV9uZXcpOgorCXJldHVybiBhIE5VTEwgaW5zdGVhZCBvZiBGQUxTRSBzaW5jZSB0aGUgcmV0dXJuIHR5cGUKKwlpcyBub3QgZXhwZWN0aW5nIGEgYm9vbGVhbgorCisJKiBkYnVzL2RidXMtc2VydmVyLWRlYnVnLXBpcGUuYyAoX2RidXNfdHJhbnNwb3J0X2RlYnVnX3BpcGVfbmV3KToKKwlTZW5kIGEgTlVMTCBpbnRvIF9kYnVzX3RyYW5zcG9ydF9uZXdfZm9yX2ZkIGluc3RlYWQgb2YgYSBGQUxTRQorCWJlY2F1c2Ugd2UgYXJlIGV4cGVjdGluZyBhIHBvaW50ZXIgbm90IGEgYm9vbGVhbgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy11dGlsLmMgKF9kYnVzX2dldF90bXBkaXIpOiAKKwlhZGQgdm9pZCBhcyB0aGUgcGFyYW1ldGVyIHNvIHNvbWUgY29tcGlsZXJzCisJZG9uJ3QgY29tcGxhaW4KKworCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC11bml4LmMgKF9kYnVzX3RyYW5zcG9ydF9uZXdfZm9yX2RvbWFpbl9zb2NrZXQsCisJICBfZGJ1c190cmFuc3BvcnRfbmV3X2Zvcl90Y3Bfc29ja2V0KToKKwlTZW5kIGEgTlVMTCBpbnRvIF9kYnVzX3RyYW5zcG9ydF9uZXdfZm9yX2ZkIGluc3RlYWQgb2YgYSBGQUxTRQorCWJlY2F1c2Ugd2UgYXJlIGV4cGVjdGluZyBhIHBvaW50ZXIgbm90IGEgYm9vbGVhbgorCisJKiB0ZXN0L3NoZWxsLXRlc3QuYyAodGVzdF9jb21tYW5kX2xpbmUpOgorCWNhc3QgdGhlIHNlY29uZCBhcmd1bWVudCB0byBfZGJ1c19saXN0X2FwcGVuZCB0byBhdm9pZCBjb21waWxlcgorCXdhcm5pbmdzCisKKwkqIHRlc3QvdGVzdC1uYW1lcy5jIChtYWluKTogcmVtb3ZlIHVudXNlZCB2YXJpYWJsZQorCisJKiB0ZXN0L3Rlc3Qtc2VydmljZS5jIChjaGVja19oZWxsb19mcm9tX3NlbGZfcmVwbHkpOgorCUluaXRpYWxpemUgZWNob19tZXNzYWdlIGFuZCBlY2hvX3JlcGx5IHRvIE5VTEwKKwkKKwkqIHRlc3QvdGVzdC1zaGVsbC1zZXJ2aWNlLmMgKGhhbmRsZV9lY2hvKToKKwlSZW1vdmUgdW51c2VkIHZhcmlhYmxlIGFuZCBjYXN0IHRoZSB0aGlyZCBwYXJhbWV0ZXIgcGFzc2VkIHRvCisJZGJ1c19jb25uZWN0aW9uX2dldF9vYmplY3RfcGF0aF9kYXRhIHRvIGF2b2lkIGNvbXBpbGVyIHdhcnJuaW5ncworCisJKiB0ZXN0L25hbWUtdGVzdC90ZXN0LW5hbWVzLmMgKGNsZWFyX21lc3NhZ2VfcXVldWUpOgorCVJlbW92ZSB1bnVzZWQgZnVuY3Rpb24KKworCSogdGVzdC9uYW1lLXRlc3QvdGVzdC1wZW5kaW5nLWNhbGwtZGlzcGF0Y2guYzoKKwlGaXggZm9ybWF0IHN0cmluZyBpbiBwcmludGYKKworCisyMDA2LTA4LTE0ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtYnVzLmM6CisJKiB0ZXN0L25hbWUtdGVzdC90ZXN0LW5hbWVzLmM6CisJUmVtb3ZlIHRlc3QgbWV0aG9kIGRidXNfYnVzX2Nvbm5lY3Rpb25fZ2V0X3VuaXF1ZV9uYW1lIGJlY2F1c2UgCisJd2UgYWxyZWFkeSBoYXZlIHB1YmxpYyBtZXRob2QgZGJ1c19idXNfZ2V0X3VuaXF1ZV9uYW1lIHRoYXQgCisJZG9lcyB0aGUgZXhhY3Qgc2FtZSB0aGluZworCisyMDA2LTA4LTEwICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtc2lnbmF0dXJlLmM6CisJZml4IHR5cG9zIGluIEp1bGlvJ3MgcHJldmlvdXMgcGF0Y2ggd2hpY2ggY2F1c2UgbWFrZSBjaGVjayB0byBmYWlsCisKKzIwMDYtMDgtMTAgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1hZGRyZXNzLmMgKF9kYnVzX2FkZHJlc3NfdGVzdCk6IFJldmVydCBsZWFraW5nIHN0cmNtcC4gIAorCUluIGFueSBjYXNlIGl0IHdhcyB3cm9uZyBzaW5jZSB0aGlzIGlzIGEgdGVzdCBjaGVja2luZyB0byBzZWUgaWYKKwlhZGRyZXNzIHBhcnNpbmcgaXMgY29ycmVjdC4gIFRoZXJlIHdhcyBubyBuZWVkIHRvIGdldCB0aGUgdHJ1ZQorCXRtcCBkaXJlY3RvcnkuICAKKworMjAwNi0wOC0xMCAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLW1hY3Jvcy5oOiBSZXZlcnQgdGhlIGFkZGl0aW9uIG9mIHN0ZGRlZi5oCisJYXMgd2Ugc2hvdWxkIG5vdCBiZSBhZGRpbmcgaXQgdG8gbGlicmFyeSBoZWFkZXJzIAorCisyMDA2LTA4LTEwICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtc2lnbmF0dXJlLmM6CisJRml4IHRoZSB1bml0IHRlc3RzIHNvIHRoYXQgdGhleSB3b3JrIGlmIGFzc2VydGlvbnMgYXJlIG5vdCBlbmFibGVkLgorCShwYXRjaCBmcm9tIEp1bGlvIE0uIE1lcmlubyBWaWRhbCAgPGptbXYgYXQgTmV0QlNEIGRvdCBvcmc+KQorCisyMDA2LTA4LTEwICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiB0b29scy9ydW4td2l0aC10bXAtc2Vzc2lvbi1idXMuc2g6CisJKiB0ZXN0L25hbWUtdGVzdC9ydW4tdGVzdC5zaDoKKwlSZW1vdmUgYmFzaGlzbXMgKHBhdGNoIGZyb20gSnVsaW8gTS4gTWVyaW5vIFZpZGFsCisJPGptbXYgYXQgTmV0QlNEIGRvdCBvcmc+KQorCisyMDA2LTA4LTEwICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBjb25maWd1cmUuaW46IGFkZCBhIHZlcnNpb24gKD49IDIuNi4wKSBjaGVjayBmb3IgbGlieG1sMgorCisyMDA2LTA4LTEwICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBjb25maWd1cmUuaW46IG1ha2Ugc3VyZSB0aGUgY29tcGlsZXIgc3VwcG9ydHMgLVdmbG9hdC1lcXVhbAorCQorCSogYnVzL2Rpci13YXRjaC1kbm90aWZ5LmM6IG1vdmUgZnVuY3Rpb25hbCBjb2RlIGFmdGVyIAorCXZhcmlhYmxlIGRlY2xlcmF0aW9ucyAoQzk5IGZpeCkgIChwYXRjaGVzIGZyb20gSmVucyBHcmFuc2V1ZXIKKwk8amVuc2dyIGF0IGdteCBkb3QgbmV0PgorCisyMDA2LTA4LTEwICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtbWFjcm9zLmg6CisJYWRkICNpbmNsdWRlIDxzdGRkZWYuaD4gc28gdGhhdCBTdW4gY29tcGlsZXJzIGRvbid0IGNvbXBsYWluIGFib3V0CisJdGhlIGRlZmluaW5nIE5VTEwKKworMjAwNi0wOC0xMCAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYzoKKwkqIGRidXMvZGJ1cy1hZGRyZXNzLmM6CisJKiBidXMvYWN0aXZhdGlvbi5jOgorCSogdGVzdC9zaGVsbC10ZXN0LmM6CisJZG9uJ3QgaGFyZGNvZGUgdG1wIGRpcmVjdG9yeSAocGF0Y2ggZnJvbSBEYXZlIE1laWtsZSAKKwk8ZG1rIGF0IGRhdmVtZWlrbGUgZG90IGNvIGRvdCB1az4pCisKKzIwMDYtMDgtMDkgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1kYXRhc2xvdC5jIChfZGJ1c19kYXRhX3Nsb3RfYWxsb2NhdG9yX2FsbG9jKToKKwlDaGFuZ2UgYW4gYXNzZXJ0IHRvIGEgZGV0YWlsZWQgd2FybmluZyBhbmQgYWJvcnQuICAKKwlXaGVuIGFsbG9jYXRvci0+bG9jayAhPSBtdXRleCBpdCBpbmRpY2F0ZXMgdGhhdCB0aGUgdXNlciBoYXMgZmFpbGVkCisJdG8gaW5pdGFsaXplIHRocmVhZHMgYmVmb3JlIHVzaW5nIHRoZSBELUJ1cyBsaWJyYXJ5LiAgVGhpcyB3YXJuaW5nCisJaGVscHMgdGhlIHVzZXIgaWRlbnRpZnkgdGhlIGlzc3VlIGFuZCBmaXggdGhlaXIgYXBwLgorCisyMDA2LTA4LTA4ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJVGhlc2UgYXJlIGFsbCBwYXRjaGVzIGZyb20gS2phcnRhbiBNYXJhYXMgPGttYXJhYXMgYXQgZ25vbWUgZG90IG9yZz4KKwl3aXRoIGNsZWFudXBzIG9mIGJ1Z3MgZm91bmQgZnJvbSBDb3Zlcml0eSByZXBvcnRzOgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy11dGlsLmMgKF9kYnVzX3dyaXRlX3BpZF9maWxlKToKKwljbG9zZSB0aGUgZmlsZSBvbiBlcnJvciB0byBhdm9pZCBhIGxlYWsKKworCSogYnVzL2V4cGlyZWxpc3QuYyAoYnVzX2V4cGlyZV9saXN0X3Rlc3QpOgorCUNoZWNrIGZvciBOVUxMIG9uIGRidXNfbmV3MAorCisJKiBidXMvYWN0aXZhdGlvbi5jICh1cGRhdGVfZGlyZWN0b3J5KToKKwlyZW1vdmUgZGVhZCBjb2RlCisKKwkqIGJ1cy9jb25maWctcGFyc2VyLmMgKG1lcmdlX3NlcnZpY2VfY29udGV4dF9oYXNoLCBzdGFydF9zZWxpbnV4X2NoaWxkKToKKwlGaXggc29tZSBsZWFrcworCisJKiBidXMvYnVzLmMgKHByb2Nlc3NfY29uZmlnX2V2ZXJ5X3RpbWUpOgorCUZpeGVkIGEgbGVhaworCisJKiBidXMvZGVza3RvcC1maWxlLmMgKHBhcnNlX2tleV92YWx1ZSk6CisJRml4ZWQgbGVhaworCisJKiBidXMvc2VsaW51eC5jIChidXNfc2VsaW51eF9pZF90YWJsZV9pbnNlcnQpOgorCUZpeGVkIGxlYWsKKworMjAwNi0wOC0wOCAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLW9iamVjdC10cmVlLmMgKF9kYnVzX29iamVjdF9zdWJ0cmVlX25ldyk6CisJcmVtb3ZlIGRlYWQgY29kZQorCisyMDA2LTA4LTA4ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiB0b29scy9ydW4td2l0aC10bXAtc2Vzc2lvbi1idXMuc2g6IHVzZSAjIS9iaW4vc2ggaW5zdGVhZCBvZgorCSMhL2Jpbi9iYXNoCisKKzIwMDYtMDgtMDggIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIERveHlmaWxlLmluOiBmaXggdGhlIElOUFVUIGxpbmUgc28gd2UgY2FuIGdlbmVyYXRlIGRvY3MgCisJd2hlbiBzb3VyY2VkaXIgIT0gYnVpbGRkaXIgKHBhdGNoIGZyb20gQ3lnd2luIFBvcnRzIG1haW50YWluZXIKKwk8eXNlbGtvd2l0eiBhdCB1c2VycyBkb3Qgc291cmNlZm9yZ2UgZG90IG5ldD4KKworMjAwNi0wOC0wOCAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuaDoKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmM6IAorCSogZGJ1cy9kYnVzLXN0cmluZy5jOiAKKwlzL19kYnVzX3ByaW50Zl9sZW5ndGgvX2RidXNfcHJpbnRmX3N0cmluZ191cHBlcl9ib3VuZCB0byBjb21mb3JtIHdpdGgKKwlHTGliJ3MgZnVuY3Rpb24gd2hpY2ggZG9lcyB0aGUgc2FtZSB0aGluZworCisJKiBjb25maWd1cmUuaW46CisJKiBidXMvTWFrZWZpbGUuYW06CisJKiBidXMvZGlyLXdhdGNoLWRlZmF1bHQuYzoKKwkqIGJ1cy9kaXItd2F0Y2gtZG5vdGlmeS5jOgorCSogYnVzL2Rpci13YXRjaC1rcXVldWUuYzoKKwlBZGQga3F1ZXVlIGRpcmVjdG9yeSB3YXRjaGluZyBmb3IgZnJlZWJzZCBhbmQgc3BsaXQgdGhlIGRpcmVjdG9yeQorCXdhdGNoaW5nIGNvZGUgaW50byBzZXBlcmF0ZSBmaWxlcyBwZXIgbWV0aG9kL2FyY2gKKwkocGF0Y2hlcyBmcm9tIFRpbW90aHkgUmVkYWVsbGkgPGRyaXp6dCBhdCBndWZpIGRvdG9yZz4pCisKKzIwMDYtMDgtMDggIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjoKKwkqIHRvb2xzL01ha2VmaWxlLmFtOgorCSogdG9vbHMvZGJ1cy1sYXVuY2guYzoKKwkqIGJ1cy9NYWtlZmlsZS5hbToKKwlhbGxvdyAtLXdpdGgtZGJ1cy1kYWVtb25kaXIgc3dpdGNoIHRvIGJlIHVzZWQgdG8gbWFrZSB0aGUKKwlkYWVtb24gaW5zdGFsbCB0byBhIHNlcGVyYXRlIGJpbmRpciBsaWtlIC91c3IvbGliZXhlYworCShwYXRjaCBmcm9tIEJyaWFuIENhbWVyb24gPGJyaWFuIGRvdCBjYW1lcm9uIGF0IHN1biBkb3QgY29tKQorCisyMDA2LTA4LTA4ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBidXMvTWFrZWZpbGUuYW0gKGluc3RhbGwtZGF0YS1ob29rKTogcmVtb3ZlZCB0aGUgc2xhc2ggYWZ0ZXIgCisJJChERVNURElSKSBzbyB3ZSBkb24ndCBnZXQgdGhlIGRvdWJsZSBzbGFzaCB3aGljaCBkb2VzIG5vdCB3b3JrCisJaW4gd2luZG93cyAocGF0Y2ggZnJvbSBBbmRyYXMgUG9yamVzeiAKKwk8YW5kcmFzIGRvdCBwb3JqZXN6IGF0IHNpZW1lbnMgZG90IGNvbT4pCisKKzIwMDYtMDgtMDggIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmg6CisJKiBkYnVzL2RidXMtc3lzZGVwcy5jOiAKKwkgIGFkZCBfZGJ1c19wcmludGZfbGVuZ3RoIChwYXRjaCBmcm9tIFBldGVyIEvDvG1tZWwgCisJICA8c3ludGhldGljcHAgYXQgZ214IGRvdCBuZXQ+KQorCisyMDA2LTA4LTA4ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtaW50ZXJuYWxzLmM6IHVuaXN0ZC5oIGlzIG5vdCB1c2VkIAorCShfZGJ1c192ZXJib3NlX3JlYWwpOiBvbmx5IGVuYWJsZSB2ZXJib3NlIHByaW50aW5nIAorCWlmIERCVVNfVkVSQk9TRSBlbnZpcm9ubWVudCB2YXIgaXMgc2V0IHRvICcxJworCShwYXRjaCBmcm9tIFBldGVyIEvDvG1tZWwgPHN5bnRoZXRpY3BwIGF0IGdteCBkb3QgbmV0PikKKworMjAwNi0wOC0wOCAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogY29uZmlndXJlLmluOiBhZGQgYSBHQ0MgZmxhZyBjaGVjayBmb3IgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQKKwlzbyB3ZSBzdGlsbCBjb21waWxlIG9uIG9sZGVyIGdjYyAocGF0Y2ggZnJvbSBGcmVkZXJpYyBQZXRlcnMgCisJPGZwZXRlcnMgYXQgMGQgZG90IGJlPgorCisyMDA2LTA4LTA0ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogY29uZmlndXJlLmluOiBhZGQgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQKKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYzogY2hhbmdlIGFsbCB0aGUgcGVuZGluZyBjYWxsIHN0dWZmIHRvCisJcmVmbGVjdCB0aGUgZmFjdCB0aGF0IHBlbmRpbmcgY2FsbCBvcGVyYXRpb25zIHVzZSB0aGUgY29ubmVjdGlvbgorCWxvY2sKKworCSogZGJ1cy9kYnVzLXBlbmRpbmctY2FsbC5jOiBhZGQgbG9ja2luZyBoZXJlCisKKwkqIGRidXMvZGJ1cy1lcnJvcnMuYyAoc3RydWN0IERCdXNSZWFsRXJyb3IpOiBkb24ndCBtYWtlIHRoZSBuYW1lCisJZmllbGQgY29uc3QgY29uc2lzdGVudCB3aXRoIGhvdyBtZXNzYWdlIGZpZWxkIGlzIGRvbmUKKworMjAwNi0wOC0wMyAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogcy9ELUJVUy9ELUJ1cy9nCisKKzIwMDYtMDgtMDMgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1vYmplY3QtdHJlZS5jOiBQYXRjaCBieSBCZW5qYW1pbiBPdHRlIAorCTxpbjd5MTE4IGF0IHB1YmxpYy51bmktaGFtYnVyZyBkb3QgZGU+IC0gZml4IGludmFsaWQKKwlyZWFkL3dyaXRlIHJlcG9ydGVkIGJ5IHZhbGdyaW5kCisKKzIwMDYtMDctMjQgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIFJlbGVhc2VkIDAuOTEKKworMjAwNi0wNy0yMiAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYzoKKwkoX2RidXNfY29ubmVjdGlvbl9hdHRhY2hfcGVuZGluZ19jYWxsX3VubG9ja2VkKToKKwkoY29ubmVjdGlvbl90aW1lb3V0X2FuZF9jb21wbGV0ZV9hbGxfcGVuZGluZ19jYWxsc191bmxvY2tlZCk6CisJTWFrZSBzdXJlIHdlIHNldCB0aW1lb3V0X2FkZGVkIG9uIHBlbmRpbmcgY2FsbHMgdG8gRkFMU0Ugd2hlbgorCXdlIHJlbW92ZSB0aGUgdGltZW91dCBmcm9tIHRoZSBjb25uZWN0aW9uCisKKzIwMDYtMDctMjEgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIFJlbW92ZWQgc29tZSBleHRyYSBiaW5kaW5ncyBzdHVmZiBsaW5nZXJpbmcgYXJvdW5kICh0aGFua3MgdGltbykKKwkqIGRidXMtcGVuZGluZ2NhbGwuYyAoX2RidXNfcGVuZGluZ19jYWxsX25ldyk6IAorCXMvZGJ1c19jb25uZWN0aW9uX3JlZi9fZGJ1c19jb25uZWN0aW9uX3JlZl91bmxvY2tlZCBmaXhlcyBhc3NlcnRpb24KKwl3aGVuIHdlIHRyaWVkIHRvIHRha2UgYSBsb2NrIG9uIGFuIGFscmVhZHkgbG9ja2VkIGNvbm5lY3Rpb24KKworMjAwNi0wNy0xNyAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogUmVsZWFzZWQgMC45MAorCisyMDA2LTA3LTE3ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLW1hcnNoYWwtYmFzaWMuYyAoX2RidXNfdHlwZV90b19zdHJpbmcpOiBzdXBwb3J0IDY0LWJpdAorCWludHMsIHJlcG9ydGVkIGJ5IE93ZW4gVGF5bG9yCisKKzIwMDYtMDctMTcgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGRvYy9UT0RPOgorCSogZGJ1cy9kYnVzLWJ1cy5jOgorCSogZGJ1cy1lcnJvcnMuYzoKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLXZhbGlkYXRlLmM6CisJICBSZW1vdmVkIFRPRE8gaXRlbXMgd2hpY2ggd2VyZSBmaXhlZCBvciBhcmUgbm8gbG9uZ2VyIHJlbGV2ZW50CisKKzIwMDYtMDctMTcgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGRidXMtcXQ0LTEucGMuaW4sIGRidXMtc2hhcnAucGMuaW46CisJUmVtb3ZlIHN0cmF5IGZpbGVzIGZyb20gdGhlIHN0cmlwcGVkIGJpbmRpbmdzCisKKzIwMDYtMDctMTYgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtcGVuZGluZy1jYWxsLmMgKF9kYnVzX3BlbmRpbmdfY2FsbF9zZXRfdGltZW91dF9lcnJvcik6CisJSW1wcm92ZSB0aGUgZXJyb3IgbWVzc2FnZSBvbiByZXBseSB0aW1lb3V0CisKKzIwMDYtMDctMTQgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIFJlbW92ZSBhbGwgYmluZGluZ3MKKworMjAwNi0wNy0xMyAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy1jb25uZWN0aW9uLmMgKGRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHkpOiByZXR1cm4gVFJVRQorCWFuZCBzZXQgcGVuZGluZ19yZXBseSBvdXQgYXJnIHRvIE5VTEwgaXMgY29ubmVjdGlvbiBpcyBkaXNjb25uZWN0ZWQKKwkoY29ubmVjdGlvbl90aW1lb3V0X2FuZF9jb21wbGV0ZV9hbGxfcGVuZGluZ19jYWxsc191bmxvY2tlZCk6IE5ldworCXN0YXRpYyBtZXRob2QgZm9yIGNsZWFuaW5nIHVwIHBlbmRpbmcgY2FsbHMgb24gZGlzY29ubmVjdAorCShfZGJ1c19jb25uZWN0aW9uX2dldF9kaXNwYXRjaF9zdGF0dXNfdW5sb2NrZWQpOiBJZiB3ZSBoYXZlIHBlbmRpbmcgCisJY2FsbHMgcXVldWVkIHRpbWVvdXRzIG9uIGRpc2Nvbm5lY3QgCisKKwkgKiBkYnVzL2RidXMtcGVuZGluZy1jYWxsLmMgKF9kYnVzX3BlbmRpbmdfY2FsbF9zZXRfY29ubmVjdGlvbik6CisJUmVtb3ZlIAorCisyMDA2LTA3LTEzICBDYXJsb3MgR2FyY2lhIENhbXBvcyAgPGNhcmxvc2djQGdub21lLm9yZz4KKworCSogYnVzL2FjdGl2YXRpb24uW2NoXSAoYnVzX2FjdGl2YXRpb25fbGlzdF9zZXJ2aWNlcyk6IG5ldyBmdW5jdGlvbiB0byAKKwlnZXQgdGhlIGxpc3Qgb2Ygc2VydmljZXMgdGhhdCBjYW4gYmUgYWN0aXZhdGVkCisKKwkqIGJ1cy9kaXNwYXRjaC5jOiB0ZXN0IGNvdmVyYWdlIGZvciB0aGUgbmV3IGJ1cyBtZXRob2QKKwlMaXN0QWN0aXZhdGFibGVOYW1lcworCisJKiBidXMvZHJpdmVyLmM6IG5ldyBidXMgbWV0aG9kIExpc3RBY3RpdmF0YWJsZU5hbWVzIHRvIGdldCB0aGUgbGlzdCBvZgorCXNlcnZpY2VzIHRoYXQgY2FuIGJlIGFjdGl2YXRlZAorCisJKiBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnhtbDogTGlzdEFjdGl2YXRhYmxlTmFtZXMgbWV0aG9kIGRvY3VtZW50YXRpb24KKworMjAwNi0wNy0xMiAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKwkqIGRidXMvTWFrZWZpbGUuYW06IGFkZCBkYnVzLXBlbmRpbmctY2FsbC1pbnRlcm5hbC5oIHRvIHRoZSBsaXN0IG9mCisJc291cmNlIGZpbGVzCisKKzIwMDYtMDctMTIgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisJKiBkYnVzL2RidXMtbWVzc2FnZS1mYWN0b3J5LmM6CisJRml4IGluZGV4IGludG8gYW4gYXJyYXkgKHBhdGNoIGJ5IFBldGVyIEvDvG1tZWwgPHN5bnRoZXRpY3BwIGF0IGdteC5uZXQ+KQorCisyMDA2LTA3LTEyICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24taW50ZXJuYWwuaDoKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmM6CisJKiBmaWxlIGRidXMvZGJ1cy1wZW5kaW5nLWNhbGwuYzoKKwkqIGRidXMvZGJ1cy1wZW5kaW5nLWNhbGwuaDoKKwlNYWtlIERCdXNQZW5kaW5nQ2FsbCBhbiBvcGFxdWUgdHlwZSBldmVuIHRvIEQtQnVzIGludGVybmFscworCisyMDA2LTA3LTA3ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5oOiByZW1vdmUgY29ubmVjdGlvbl9kaXNjb25uZWN0IGFuZCByZXBsYWNlIHdpdGgKKwljb25uZWN0aW9uX2Nsb3NlCisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmM6IGluY2x1ZGUgZGJ1cy1idXMuaAorCShfZGJ1c19jb25uZWN0aW9uX3JlYWRfd3JpdGVfZGlzcGF0Y2gpOiBtYWtlIHN0YXRpYworCisyMDA2LTA3LTA3ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jIChkYnVzX2Nvbm5lY3Rpb25fY2xvc2UpOiByZW1vdmVkIGRlcHJlY2F0ZWQKKwlmdW5jdGlvbgorCShkYnVzX2Nvbm5lY3Rpb25fZGlzcGF0Y2gpOiBPbiBkaXNjb25uZWN0IHVucmVmIGFueSBzaGFyZWQgY29ubmVjdGlvbnMKKworCSogZGJ1cy9kYnVzLWJ1cy5jIChfZGJ1c19idXNfY2hlY2tfY29ubmVjdGlvbl9hbmRfdW5yZWYpOiBuZXcgZnVuY3Rpb24KKwlmb3IgY2xlYW5pbmcgdXAgc2hhcmVkIGNvbm5lY3Rpb25zIG9uIGRpc2Nvbm5lY3QKKwkoaW50ZXJuYWxfYnVzX2dldCk6IGdldCBhIGhhcmQgcmVmcmVuY2UgdG8gc2hhcmVkIGNvbm5lY3Rpb25zIHdoZW4KKwl0aGV5IGFyZSBjcmVhdGVkCisJCisJKiBkb2MvVE9ETzogUmVtb3ZlIGl0ZW1zIHdoaWNoIGFyZSBubyBsb25nZXIgcmVsZXZlbnQgb3IgaGF2ZSBiZWVuIGZpeGVkCisJU3BsaXQgMS4wIHRvZG8gaXRlbXMgd2l0aCBhIDAuOTAgZnJlZXplIHRvZG8gbGlzdAorIAorMjAwNi0wNi0xNCAgUm9zcyBCdXJ0b24gIDxyb3NzQG9wZW5lZGhhbmQuY29tPgorCisJKiBnbGliL2RidXMtZ29iamVjdC5jOgorCUZyZWUgYSBsZWFraW5nIEdBcnJheSAoc3VyZWx5IG5vdCEpIGluIGRidXNfZ19tZXRob2RfcmV0dXJuLgorCisyMDA2LTA2LTE0ICBSb3NzIEJ1cnRvbiAgPHJvc3NAb3BlbmVkaGFuZC5jb20+CisKKwkqIHRvb2xzL01ha2VmaWxlLmFtOgorCSogdG9vbHMvZGJ1cy1tb25pdG9yLmM6CisJRG9uJ3QgdXNlIHRoZSBHTGliIGJpbmRpbmdzIGluIGRidXMtbW9uaXRvciAocGF0Y2ggZnJvbSBSYWxmCisJSGFiYWNrZXIpLgorCQorMjAwNi0wNi0xNCAgUm9zcyBCdXJ0b24gIDxyb3NzQG9wZW5lZGhhbmQuY29tPgorCisJKiB0b29scy9kYnVzLXByaW50LW1lc3NhZ2UuYzoKKwlBbHNvIHByaW50IHRoZSBvYmplY3QgcGF0aCB3aGVuIG91dHB1dHRpbmcgc2lnbmFscyBvciBtZXRob2QgY2FsbHMuCisKKzIwMDYtMDYtMTMgIFRoaWFnbyBNYWNpZWlyYSA8dGhpYWdvLm1hY2llaXJhQHRyb2xsdGVjaC5jb20+CisKKwkqIHF0L3NyYy9NYWtlZmlsZS5hbTogaW5zdGFsbCB0aGUgcWRidXMuaCBoZWFkZXIuCisJVGhpcyBhbGxvd3MgcGVvcGxlIHRvIGFjdHVhbGx5IHVzZSB0aGUgaW5zdGFsbGVkIGNvZGUuCisKKzIwMDYtMDYtMTIgIFJvc3MgQnVydG9uICA8cm9zc0BvcGVuZWRoYW5kLmNvbT4KKworCSogZ2xpYi9kYnVzLWdwcm94eS5jOgorCURvbid0IGxlYWsgYSBHQXJyYXkgd2hlbiBmaXJpbmcgc2lnbmFscyAodGhhbmsgUm9iIFRheWxvciBmb3IgcmV2aWV3KS4KKworMjAwNi0wNi0xMiAgVGhpYWdvIE1hY2llaXJhIDx0aGlhZ28ubWFjaWVpcmFAdHJvbGx0ZWNoLmNvbT4KKworCSogUmVsZWFzZWQgMC42MgorCisyMDA2LTA2LTEyICBUaGlhZ28gTWFjaWVpcmEgPHRoaWFnby5tYWNpZWlyYUB0cm9sbHRlY2guY29tPgorCisJKiBkYnVzL2RidXMtYXJjaC1kZXBzLmguaW46IFJlbW92ZSBzcHVyaW91cyBzZW1pLWNvbG9ucyB0aGF0CisgICAgICAgIGJyZWFrIHBlZGFudGljIGJ1aWxkcy4gQ2xvc2VzIGJ1ZyA2MDQzIChwYXRjaCBhcHByb3ZlZCBieQorICAgICAgICBIYXZvYyBiYWNrIGluIEZlYnJ1YXJ5KS4KKworMjAwNi0wNi0xMiAgVGhpYWdvIE1hY2llaXJhIDx0aGlhZ28ubWFjaWVpcmFAdHJvbGx0ZWNoLmNvbT4KKworCSogcXQvc3JjL3FkYnVzaW50ZWdyYXRvci5jcHA6IEZpeCBidWcgaW4gcGFyc2luZyBhc3luYyBtZXRob2RzCisgICAgICAgIHRoYXQgdG9vayBhIFFEQnVzTWVzc2FnZSBwYXJhbWV0ZXIuCisJKiBxdC9zcmMvcWRidXNidXMuaDogQWRkIGEgZGVmYXVsdCBmbGFnIGZvciBSZXF1ZXN0TmFtZS4KKwkqIHF0L3Rvb2xzL2RidXMuY3BwOiBEb24ndCB1c2UgYXV0b21hdGljIGNhbGwgYmVjYXVzZSB3ZSBtaWdodAorICAgICAgICBiZSBjYWxsaW5nIGFuIGFzeW5jIG1ldGhvZDogcmVxdWVzdCBhIHJlcGx5LgorCisyMDA2LTA2LTExICBUaGlhZ28gTWFjaWVpcmEgPHRoaWFnby5tYWNpZWlyYUB0cm9sbHRlY2guY29tPgorCisJKiB0ZXN0L3F0Lyo6IFVwZGF0ZSB0aGUgdGVzdGNhc2VzLCBpbmNsdWRpbmcgdGVzdGluZyB0aGUgbmV3CisgICAgICAgIGZ1bmN0aW9uYWxpdHkgb2Ygc2VuZGluZyBudWxsIFFCeXRlQXJyYXkgYW5kIFFTdHJpbmcgb3ZlciB0aGUKKyAgICAgICAgYnVzLiBBZGQgbmV3IGhlYWRlcnRlc3QgdGVzdCBhbmQgcmVzdG9yZSB0aGUgb2xkCisgICAgICAgIHFkYnVzeG1scGFyc2VyIHRlc3QuCisKKzIwMDYtMDYtMTEgIFRoaWFnbyBNYWNpZWlyYSA8dGhpYWdvLm1hY2llaXJhQHRyb2xsdGVjaC5jb20+CisKKwkqIHF0L3Rvb2xzL2RidXNjcHAyeG1sLmNwcDogQ29tcGlsZSBvbiBXaW5kb3dzLgorCSogcXQvdG9vbHMvZGJ1c2lkbDJjcHAuY3BwOiBBZGQgbWlzc2luZyBuZXdsaW5lLgorCisJKiBxdC9leGFtcGxlcy9NYWtlZmlsZS5hbToKKwkqIHF0L2V4YW1wbGVzL2NoYXQuaDogVXNlIFVJLWdlbmVyYXRlZCBmaWxlcyB3aXRoIHRoZSB1aV8qLmgKKwlmb3JtLgorCisJKiBxdC9zcmMvcWRidXNtYXJzaGFsbC5jcHA6IEFsbG93IHNlbmRpbmcgb2YgUVN0cmluZygpIGFuZAorCVFCeXRlQXJyYXkoKSAobnVsbHMpIG92ZXIgdGhlIGJ1cy4KKwkqIHF0L3NyYy9xZGJ1c2Fic3RyYWN0aW50ZXJmYWNlLmNwcDogVXNlIHRoZSBjb3JyZWN0IHZhcmlhYmxlLAorCXRoZSBvbmUgdGhhdCBoYXMgdGhlIHNpZ25hdHVyZSBzdWZmaXggc3RyaXBwZWQuCisJKiBxdC9zcmMvcWRidXNyZXBseS5oOiBNYWtlIHNvbWUgbWV0aG9kcyBjb25zdC4KKworMjAwNi0wNi0wOSAgVGhpYWdvIE1hY2llaXJhIDx0aGlhZ28ubWFjaWVpcmFAdHJvbGx0ZWNoLmNvbT4KKworCVBhdGNoIGZyb20gVGltbyBIb2VuaWcgPHRob2VuaWdAc3VzZS5kZT4uCisKKwkqIHF0L2RidXMvTWFrZWZpbGUuYW06IE5ldyBmaWxlLiAgRml4ICJtYWtlIGRpc3QiLCBhZGQgYWxsIGhlYWRlcnMKKwlyZXF1aXJlZCBkdXJpbmcgYnVpbGQgdG8gRVhUUkFfRElTVC4KKwkqIHF0L3NyYy9NYWtlZmlsZS5hbTogRml4ICJtYWtlIGRpc3QiLCBhZGQgJ3FkYnVzLmgnIHRvIEVYVFJBX0RJU1QuCisJKiBxdC9NYWtlZmlsZS5hbTogRml4ICJtYWtlIGRpc3QiLCBhZGQgJ2RidXMnIHRvIERJU1RfU1VCRElSUy4KKwkqIGNvbmZpZ3VyZS5pbjogRml4ICJtYWtlIGRpc3QiLCB0YWtlIGNhcmUgdGhhdCB0aGUgTWFrZWZpbGUgZm9yCisJcXQvZGJ1cyBpcyBiZWluZyBnZW5lcmF0ZWQuCisKKzIwMDYtMDYtMDcgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGJ1cy9idXMuYzogRml4IGVhdmVzZHJvcHBpbmcgb24gbWV0aG9kIGNhbGxzCisKKzIwMDYtMDYtMDcgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjoKKwkqIGRidXMvZGJ1cy11c2VyZGItdXRpbC5jOgorCUFkZCBTb2xhcmlzIGNvbnNvbGUgb3duZXIgcGF0Y2ggZnJvbSBBcnRlbSBLYWNoaXRjaGtpbmUKKworMjAwNi0wNi0wNyAgVGhpYWdvIE1hY2llaXJhIDx0aGlhZ28ubWFjaWVpcmFAdHJvbGx0ZWNoLmNvbT4KKworCSogcXQvTWFrZmlsZS5hbToKKwkqIHF0L3NyYy9NYWtlZmlsZS5hbTogRml4IHRoZSBFWFRSQV9ESVNUIGFmdGVyIHRoZQorCXJlb3JnYW5pc2F0aW9uLiBUaGFua3MgdG8gVGltbyBIb2VuaWcgZm9yIHBvaW50aW5nIHRoaXMgb3V0LgorCisyMDA2LTA2LTA2ICBSb2JlcnQgTWNRdWVlbiAgPHJvYm90MTAxQGRlYmlhbi5vcmc+CisKKwkqIGdsaWIvZGJ1cy1ndHlwZS1zcGVjaWFsaXplZC5jOiBGaXggb2J2aW91cyBsZWFrIG9mIEdBcnJheSBpbiBldmVyeQorCSAgY2FsbCB0byBkYnVzX2dfdHlwZV9nZXRfc3RydWN0LgorCisyMDA2LTA2LTA2ICBSb2JlcnQgTWNRdWVlbiAgPHJvYm90MTAxQGRlYmlhbi5vcmc+CisKKwkqIGdsaWIvZGJ1cy1ndmFsdWUtdXRpbHMuYzogRml4IHRoZSBmYWlsaW5nIHRlc3Qgd2hlcmUgc3RhdGljIHN0cmluZworCSAgcG9pbnRlcnMgd2VyZSBwdXQgaW50byBhIEdQdHJBcnJheS1iYXNlZCBzcGVjaWFsaXNlZCBjb2xsZWN0aW9uLCBhbmQKKwkgIHRoZW4gZnJlZWQgYWxvbmcgd2l0aCB0aGUgYXJyYXkuIEdWYWx1ZXMgd2hpY2ggeW91IGFkZCBpbnRvCisJICBjb2xsZWN0aW9ucyBvciBtYXBzIHdoaWNoIGhhdmUgdGhlIE5PQ09QWSBmbGFnIHNldCBhcmUgYXNzdW1lZCB0byBub3QKKwkgIGJlbG9uZyB0byB0aGUgY2FsbGVyLCBzbyByYXRoZXIgdGhhbiB0aGUgZXhpc3RpbmcgcG9pbnRlci1zdGVhbGluZworCSAgc2VtYW50aWNzLCB0aGV5IGFyZSBjb3BpZWQgaW5zdGVhZC4gR2l2ZW4gdGhhdCB0aGUgbWFpbiBjb25zdW1lcnMgb2YKKwkgIHRoaXMgYWJzdHJhY3Rpb24gYXJlIHRoZSBiaW5kaW5ncyB0aGVtc2VsdmVzLCBJIGRvbid0IHRoaW5rIHRoaXMgaXMKKwkgIHRvbyBiYWQsIGJ1dCBvdGhlcnMgc2hvdWxkIHdhdGNoIHRoZWlyIGNob2ljZSBvZiB0YWtlIHZzIHNldF9zdGF0aWMuCisKKzIwMDYtMDYtMDYgIFJvYmVydCBNY1F1ZWVuICA8cm9ib3QxMDFAZGViaWFuLm9yZz4KKworCSogZ2xpYi9kYnVzLWd2YWx1ZS11dGlscy5jOiBTcG90dGVkIGEgd2FybmluZyBhYm91dCB0aGUgcmV0dXJuIHZhbHVlCisJICBvZiBnX3NsaXN0X3ByZXBlbmQgbm90IGJlaW5nIHVzZWQuIEZpeGVkIGNvcHlpbmcgb2Ygc2xpc3QtYmFzZWQKKwkgIHNwZWNpYWxpc2VkIGNvbGxlY3Rpb25zLCB0aGVuIHdyb3RlIGEgdGVzdCBjYXNlIGFuZCBmb3VuZCB0aGF0IGl0IHdhcworCSAgYWxsIGJyb2tlbi4gV2VudCBvbiB0byBmaXggaXRlcmF0aW5nIGFuZCBhcHBlbmRpbmcgdG9vLiBHb29kIHRoaW5nCisJICBub2JvZHkgdXNlcyB0aGlzIGNvZGUgeWV0LgorCisyMDA2LTA2LTA2ICBSb2JlcnQgTWNRdWVlbiAgPHJvYm90MTAxQGRlYmlhbi5vcmc+CisKKwkqIGdsaWIvZGJ1cy1ndmFsdWUtdXRpbHMuYzogUmVtb3ZlIGR1cGxpY2F0ZWQgY29kZSBieSBoYXZpbmcgYWxsIG9mCisJICB0aGUgaXRlcmF0b3JzIHVzZSBndmFsdWVfdGFrZV9wdHJhcnJheV92YWx1ZSAodGhlIEdWYWx1ZXMgdGhlbXNlbHZlcworCSAgYXJlIGRpc2NhcmRlZCB3aXRob3V0IHVuc2V0dGluZywgc28gaXQgbWFrZXMgbm8gZGlmZmVyZW5jZSB3aGV0aGVyCisJICB3ZSB0YWtlIG9yIHNldF9zdGF0aWMpLiBSZW1vdmUgY2FzZXMgZm9yIEdfVFlQRV9QT0lOVEVSIGJlY2F1c2UKKwkgIHRoZXJlIHJlYWxseSBpcyBub3RoaW5nIHVzZWZ1bCB3ZSBjYW4gZG8gd2l0aCB0aGVtIGluIG91cgorCSAgc3BlY2lhbGlzZWQgdHlwZXMgLSB3ZSAqbmVlZCogYm94ZWQgY29weS9mcmVlIGZ1bmN0aW9ucyBhdCB0aGUgdmVyeQorCSAgbGVhc3QuCisKKzIwMDYtMDYtMDUgIFRoaWFnbyBNYWNpZWlyYSA8dGhpYWdvLm1hY2llaXJhQHRyb2xsdGVjaC5jb20+CisKKwkqIHF0L2RidXM6IEFkZCBkaXJlY3RvcnkuIEkgaGFkIGZvcmdvdHRlbiB0byBhZGQgdGhpcworCXllc3RlcmRheSBhZnRlciB0aGUgbW92ZS4uLgorCisJKiBxdC9leGFtcGxlcy9NYWtlZmlsZS5hbToKKwkqIHF0L2V4YW1wbGVzL2RidXMuY3BwOiBNb3ZlZCB0byBxdC90b29scy9kYnVzLmNwcC4KKworCSogcXQvdG9vbHMvTWFrZWZpbGUuYW06CisJKiBxdC90b29scy9kYnVzLmNwcDogTW92ZWQgZnJvbSBxdC9leGFtcGxlcy9kYnVzLmNwcC4KKwlBZGRlZCBmZWF0dXJlIHRvIGdldCBhbmQgc2V0IHByb3BlcnRpZXMuCisJQWRkZWQgdmFsaWRhdGlvbiBvZiBzZXJ2aWNlLCBvYmplY3QgcGF0aCBhbmQgaW50ZXJmYWNlIG5hbWVzLgorCisJKiBxdC90b29scy9kYnVzaWRsMmNwcC5jcHA6IFR3byBuZXcgZmVhdHVyZXM6CisJMSkgQWxsb3cgc3BlY2lmeWluZyBib3RoIHRoZSBoZWFkZXIgYW5kIHRoZSBzb3VyY2UgZmlsZSBuYW1lcywKKwlieSBzZXBhcmF0aW5nIHRoZW0gd2l0aCBhIGNvbG9uLgorCTIpIERvbid0IHdyaXRlIGFuIGludGVyZmFjZSBvdXRwdXQgaWYgdGhlIC1wIHN3aXRjaCB3YXNuJ3QKKwlnaXZlbiwgYnV0IHRoZSAtYSB3YXMuCisKKwkqIHF0L3NyYy8qOiBGaXggdXNhZ2Ugb2YgSXRlcmF0b3JzIGFuZCBDb25zdEl0ZXJhdG9ycy4KKwlGaXggc2hhZG93aW5nIG9mIHZhcmlhYmxlcyBieSBvdGhlciB2YXJpYWJsZXMgKC1Xc2hhZG93KS4KKwlGaXgga2V5d29yZC1jbGVhbmxpbmVzcyBpbiBoZWFkZXJzLgorCUZpeCBBU0NJSS1jYXN0IChRTGF0aW4xU3RyaW5nLCBRTGF0aW4xQ2hhcikuCisJRml4IHZhbGlkYXRpb24gb2YgbWVtYmVyIG5hbWVzLgorCUFkZCBleHRyYSBjaGVja2luZyBvZiBpbnRyb3NwZWN0aW9uIGRhdGEgZHVyaW5nIFhNTCBwYXJzaW5nLgorCVZhcmlvdXMgYnVnIGZpeGVzLgorCisyMDA2LTA2LTA0ICBUaGlhZ28gTWFjaWVpcmEgPHRoaWFnby5tYWNpZWlyYUB0cm9sbHRlY2guY29tPgorCisJKiBkYnVzL01ha2VmaWxlLmFtOgorCSogZGJ1cy9xZGJ1cy5oOiBSZW1vdmUgdW5uZWNlc3NhcnkgZmlsZS4gVGhpcyBpcyBtaXJyb3JlZCBpbnRvCisgICAgICAgIHF0L2RidXMvcWRidXMuaCBub3cuCisKKzIwMDYtMDYtMDQgIFRoaWFnbyBNYWNpZWlyYSA8dGhpYWdvLm1hY2llaXJhQHRyb2xsdGVjaC5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogTWFrZSAtLWRpc2FibGUtcXQgYWN0dWFsbHkgZG8KKyAgICAgICAgICBzb21ldGhpbmcuIFBhdGNoIGluc3BpcmVkIGJ5IFphY2sgUnVzaW4uCisKKzIwMDYtMDYtMDQgIFRoaWFnbyBNYWNpZWlyYSA8dGhpYWdvLm1hY2llaXJhQHRyb2xsdGVjaC5jb20+CisKKwkqIHF0LzogVXBkYXRlIHRvIFN1YnZlcnNpb24gcjU0ODAzMi4KKwlUaGlzIGluY2x1ZGVzIGEgYmlnIHJlb3JnYW5pc2F0aW9uIG9mIHRoZSBmaWxlcyBpbnNpZGUgdGhlCisJc3ViZGlyLgorCisyMDA2LTA1LTMwICBTam9lcmQgU2ltb25zICA8c2pvZXJkQGx1b24ubmV0PgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jOiBNYWtlIHRjcCBzb2NrZXQgY29ubmVjdGlvbiBlcnJvciBzb21ld2hhdCBtb3JlCisJY2xlYXI6ICAKKwkiRmFpbGVkIHRvIGNvbm5lY3QgdG8gc29ja2V0IDxob3N0Pjo8cG9ydD4gPGVycm9yPiIgaW5zdGVhZCBvZgorCSJGYWlsZWQgdG8gY29ubmVjdCB0byBzb2NrZXQgPGhvc3Q+OiA8ZXJyb3I+Ojxwb3J0PiIKKworCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC11bml4LmM6IEZpeCBjcmFzaCB3aGVuIG5vIGhvc3Qgb3B0aW9uIGlzIGdpdmVuCisJZm9yIGEgdGNwIHRyYW5zcG9ydC4gCisKKzIwMDYtMDUtMjkgIFRoaWFnbyBNYWNpZWlyYSAgPHRoaWFnby5tYWNpZWlyYUB0cm9sbHRlY2guY29tPgorCisJKiBxdC8qOiBVcGRhdGUgdGhlIFF0REJ1cyBiaW5kaW5ncyB1cCB0byByZXZpc2lvbiA1NDYzMTAgaW4KKyAgICAgICAgU3VidmVyc2lvbi4KKwlUaGlzIGFkZHMgdGhlIGRidXNjcHAyeG1sIHRvb2wsIHRoYXQgcGFyc2VzIGEgQysrIGhlYWRlciBhbmQKKyAgICAgICAgb3V0cHV0cyBhIEQtQlVTIEludHJvc3BlY3Rpb24gWE1MLgorCisyMDA2LTA1LTIxICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZ2xpYi9kYnVzLWdwcm94eS5jOiBQdXQgaW4gYSBwaWxlIG9mIGFzc2VydGlvbnMgdGhhdCB0aGUgcHJveHkgbmFtZQorCWlzIG5vdCBOVUxMIHdoZW4gaXQgc2hvdWxkbid0IGJlLiBBbHNvIGEgY291cGxlIG9mIHBvc3NpYmxlIGZpeGVzCisJZm9yICM0NjM3IHRob3VnaCBJIGRvbid0IHVuZGVyc3RhbmQgd2h5IHRoZSBidWcgaGFwcGVucywgdG8gYmUKKwlob25lc3QuLi4gYWxzbyB0aGUgb2JqZWN0IGNvbnN0cnVjdG9yIGhhcyBhbiBhc3NlcnQgbmFtZSAhPSBOVUxMCisJYW5kIHRoZSBuYW1lIGlzIG9ubHkgY3VycmVudGx5IE5VTEwgZm9yIHBlZXItdG8tcGVlciBwcm94aWVzIHRoYXQgCisJSSBkb24ndCB0aGluayBhbnlvbmUgdXNlcz8gU28gaXQgc2hvdWxkIGJlIGFzc2VydGluZy4KKwlBbnl3YXksIGZvciBub3cgYXQgbGVhc3Qgc2VlIGlmIHdlIGdldCBhbiBlYXJsaWVyIGFzc2VydGlvbiBmYWlsdXJlLgorCisJKiBnbGliL2RidXMtZ3ZhbHVlLXV0aWxzLmM6IFB1dCBpbiBhIGNvdXBsZSBvZiBhc3NlcnRpb25zIGZvcgorCWFwcGFyZW50bHkgYnJva2VuIGNvZGUgdG8gYmUgc3VyZSB0aGUgdGVzdHMgZmFpbCBhbmQgc29tZW9uZSAKKwl3aWxsIGZpeCB0aGVtLi4uCisKKzIwMDYtMDUtMDcgIFRoaWFnbyBNYWNpZWlyYSAgPHRoaWFnby5tYWNpZWlyYUB0cm9sbHRlY2guY29tPgorCisJKiBxdC9xZGJ1c21hcnNoYWxsLmNwcDogRml4IGEgcHJvYmxlbSBvZiBkZW1hcnNoYWxsaW5nIGxpc3RzCisgICAgICAgIGFuZCBhcnJheXMgd2hlbiB0aGV5IGhhZCBhIHNpbmdsZSBlbGVtZW50OiBoYXNfbmV4dCByZXR1cm5zCisgICAgICAgIGZhbHNlLCBldmVuIGJlZm9yZSB5b3UgcmVhZCB0aGUgZWxlbWVudC4gU28sIGluc3RlYWQsIGNoZWNrCisgICAgICAgIHRoZSBhcnJheSBsZW5ndGguCisKKzIwMDYtMDUtMDYgIFRoaWFnbyBNYWNpZWlyYSAgPHRoaWFnby5tYWNpZWlyYUB0cm9sbHRlY2guY29tPgorCisJKiBxdC9xZGJ1c21lc3NhZ2UuY3BwOgorCSogcXQvcWRidXN0eXBlaGVscGVyX3AuaDoKKwkqIHF0L3FkYnVzaW50ZWdyYXRvci5jcHA6IGdjYyAzLjQgZG9lc24ndCBsaWtlIFFfRk9SRUFDSCB3aGVuCisJdGhlIGxpc3QgaXMgYSBjb25zdC1yZWZlcmVuY2UKKworMjAwNi0wNS0wMyAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogQWRkaW5nIG9sZCBkb2MgcGF0Y2ggdGhhdCBuZXZlciBnb3QgYXBwbGllZAorCQorCSogZGJ1cy9idXMuYyAoZGJ1c19idXNfYWRkX21hdGNoKTogQWRkIGRvY3VtZW50YXRpb24KKworCSogZG9jL2RidXMtc3BlY2lmaWNhdGlvbi54bWw6IEFkZCBkb2N1bWVudGF0aW9uIGZvciB0aGUgbWF0Y2ggcnVsZXMKKwkgIGFuZCB0aGUgQWRkTWF0Y2ggYW5kIFJlbW92ZU1hdGNoIG1ldGhvZHMKKworMjAwNi0wNS0wMiAgVGhpYWdvIE1hY2llaXJhICA8dGhpYWdvLm1hY2llaXJhQHRyb2xsdGVjaC5jb20+CisKKwkqIHF0L2RidXNpZGwyY3BwLmNwcDogVGhlcmUncyBubyBjYWxsQXN5bmMuIFVzZSB0aGUgY29ycmVjdAorICAgICAgICBjYWxsIChyNTM1NTA2KQorCisJKiBxdC9kYnVzaWRsMmNwcC5jcHA6CisJKiBxdC9xZGJ1c2Fic3RyYWN0YWRhcHRvci5jcHA6CisJKiBxdC9xZGJ1c2Fic3RyYWN0YWRhcHRvci5oOiBNYWtlIFFEQnVzQWRhcHRvckNvbm5lY3RvciBiZSBhCisgICAgICAgIHNpYmxpbmcgb2YgdGhlIFFEQnVzQWJzdHJhY3RBZGFwdG9yIG9iamVjdHMgaW5zdGVhZCBvZiB0aGUKKyAgICAgICAgcGFyZW50LiAocjUzNTg0OCkKKworCSogcXQvZGJ1c2lkbDJjcHAuY3BwOgorCSogcXQvcWRidXNhYnN0cmFjdGludGVyZmFjZS5jcHA6CisJKiBxdC9xZGJ1c2Fic3RyYWN0aW50ZXJmYWNlLmg6CisJKiBxdC9xZGJ1c2Fic3RyYWN0aW50ZXJmYWNlX3AuaDoKKwkqIHF0L3FkYnVzaW50ZXJmYWNlLmNwcDogTWFrZSBwcm9wZXJ0aWVzIGluIGludGVyZmFjZXMKKyAgICAgICAgYWN0dWFsbHkgd29yay4gVGhlIGNvZGUgdGhhdCB3YXMgZ2VuZXJhdGVkIHdvdWxkIG5vdCBjb21waWxlLAorICAgICAgICBkdWUgdG8gbW9jIGNhbGxzIHRvIGZ1bmN0aW9ucyB0aGF0IGRpZCBub3QgZXhpc3QuIFRoZXkgbm93CisgICAgICAgIHNoYWxsLiAocjUzNjU3MSkKKworMjAwNi0wNC0zMCAgVGhpYWdvIE1hY2llaXJhICA8dGhpYWdvLm1hY2llaXJhQHRyb2xsdGVjaC5jb20+CisKKwkqIE1ha2VmaWxlLmFtOgorCSogY29uZmlndXJlLmluOgorCSogZGJ1cy1xdDQtMS5wYy5pbjogQWRkIGEgcGtnLWNvbmZpZyBmaWxlIGZvciBsaWJkYnVzLXF0NC0xLgorCVRoYW5rcyB0byBCcmFkIEhhcmRzIGZvciBwcm92aWRpbmcgdGhlIHBhdGNoCisKKzIwMDYtMDQtMjkgIFRoaWFnbyBNYWNpZWlyYSAgPHRoaWFnby5tYWNpZWlyYUB0cm9sbHRlY2guY29tPgorCisJKiBxdC9kYnVzaWRsMmNwcC5jcHA6IFRoZXJlJ3Mgbm8gY2FsbEFzeW5jLiBVc2UgdGhlIGNvcnJlY3QKKyAgICAgICAgY2FsbC4gKHI1MzU1MDYpCisKKzIwMDYtMDQtMjkgIFRoaWFnbyBNYWNpZWlyYSAgPHRoaWFnby5tYWNpZWlyYUB0cm9sbHRlY2guY29tPgorCisJKiBxdC9leGFtcGxlcy9kYnVzLmNwcDogRW5oYW5jZSBlcnJvciBtZXNzYWdlcyBhbmQgdXNlCisgICAgICAgIFFEQnVzSW50ZXJmYWNlUHRyLgorCisyMDA2LTA0LTI5ICBUaGlhZ28gTWFjaWVpcmEgIDx0aGlhZ28ubWFjaWVpcmFAdHJvbGx0ZWNoLmNvbT4KKworCSogcXQvcWRidXNpbnRlcmZhY2UuaDogUmVuYW1lIFFEQnVzUmVmIHRvIFFEQnVzSW50ZXJmYWNlUHRyCisgICAgICAgIGFuZCBkaXNhYmxlIHRoZSBjb3B5IG9wZXJhdG9ycy4gKHI1MzM3NzIsIHI1MzQ3NDYpCisKKwkqIHF0L3FkYnVzZXJyb3IuaDogUmVtb3ZlIHRoZSBhdXRvbWF0aWMgY2FzdCB0byBib29sLiAocjUzMzkyOSkKKworCSogcXQvcWRidXNhYnN0cmFjdGludGVyZmFjZS5jcHA6CisJKiBxdC9xZGJ1c2Fic3RyYWN0aW50ZXJmYWNlLmg6IENoYW5nZSB0aGUgZGVmYXVsdCBjYWxsIG1vZGUgdG8KKyAgICAgICAgbm90IHVzZSB0aGUgZXZlbnQgbG9vcC4gQWRkIGNvbnZlbmllbmNlIGNhbGwoKSBtZXRob2RzIHRoYXQKKyAgICAgICAgdGFrZSBhIENhbGxNb2RlIHBhcmFtZXRlci4gKHI1MzQwNDIpCisKKwkqIHF0L3FkYnVzY29ubmVjdGlvbi5oOiBDaGFuZ2UgdGhlIGRlZmF1bHQgY2FsbCBtb2RlIHRvIG5vdAorICAgICAgICB1c2UgdGhlIGV2ZW50IGxvb3AuIChyNTM0MDQyKQorCisJKiBxdC9xZGJ1c2ludGVyZmFjZS5jcHA6CisJKiBxdC9xZGJ1c2ludGVyZmFjZS5oOiBBZGQgYSBtZXRob2QgdG8gdGVsbCB1cyBpZiB0aGUKKwlpbnRlcmZhY2UgaXMgdmFsaWQgKHNpbmNlIHdlIGRvbid0IHJldHVybiBhIG51bGwgcG9pbnRlcgorCWFueW1vcmUpIChyNTM0MDk5KQorCisJKiBxdC9xZGJ1c2ludGVyZmFjZV9wLmg6IERvbid0IGNyYXNoIGlmIG1ldGFPYmplY3QgaXMgMAorICAgICAgICAocjUzNDEwMSkKKworCSogcXQvcWRidXNpbnRlcm5hbGZpbHRlcnMuY3BwOiBEZWNvdXBsZSB0aGUgaW50cm9zcGVjdGlvbgorICAgICAgICBmdW5jdGlvbiBpbiB0d28gc28gdGFodCB3ZSBnZXQgdGhlIGNoYW5jZSB0byBpbnRyb3NwZWN0CisgICAgICAgIHdpdGhvdXQgaGF2aW5nIGEgUURCdXNNZXNzYWdlIChyNTM0MTAyKQorCisJKiBxdC9xZGJ1c2J1cy5oOgorCSogcXQvcWRidXNjb25uZWN0aW9uLmNwcDoKKwkqIHF0L3FkYnVzY29ubmVjdGlvbl9wLmg6CisJKiBxdC9xZGJ1c2ludGVncmF0b3IuY3BwOiBLZWVwIGEgbGlzdCBvZiBvdXIgb3duIG5hbWVzIHRvCisgICAgICAgIGF2b2lkIGEgcm91bmQtdHJpcCB0byB0aGUgc2VydmVyIHdoZW4gYXR0ZW1wdGluZyB0byBpbnRyb3NwZWN0CisgICAgICAgIG9uZSBvZiBvdXIgb3duIG9iamVjdHMuIEFsc28gbWFrZSBzdXJlIHRoZSBmaWx0ZXIgZnVuY3Rpb25zCisgICAgICAgIG1hdGNoIHRoZSBlbXB0eSBpbnRlcmZhY2UgYXMgd2VsbC4gKHI1MzQxMDgpCisJRG9uJ3Qga2VlcCB0aGUgY29ubmVjdGlvbiBuYW1lcy4gSW5zdGVhZCwgdHJ1c3QgdGhlIHVuaXF1ZQorICAgICAgICBjb25uZWN0aW9uIG5hbWUgKHI1MzQxMTEpCisJUmVtb3ZlIGV2ZW50IGxvb3AgdXNhZ2UgKHI1MzQxMTIpCisKKzIwMDYtMDQtMjkgIFRoaWFnbyBNYWNpZWlyYSAgPHRoaWFnby5tYWNpZWlyYUB0cm9sbHRlY2guY29tPgorCisJKiBxdC9xZGJ1c2ludGVncmF0b3IuY3BwOiBGaXggYXNzZXJ0aW9uIGZhaWx1cmUgc3BvdHRlZCBieQorCUJyYWQgSGFyZHMuCisKKzIwMDYtMDQtMjggIFJvYmVydCBNY1F1ZWVuICA8cm9ib3QxMDFAZGViaWFuLm9yZz4KKworCSogZ2xpYi9kYnVzLWdwcm94eS5jOiBGaXggcHJvcGVydGllcyBzbyB0aGF0IHRoZXkgY2FuIGJlIGdpdmVuIGluCisJYW55IG9yZGVyLCBtYWtpbmcgaXQgZWFzaWVyIGZvciBwZW9wbGUgd2hvIGluaGVyaXQgZnJvbSB0aGlzCisJb2JqZWN0LgorCisyMDA2LTA0LTI4ICBSb2JlcnQgTWNRdWVlbiAgPHJvYm90MTAxQGRlYmlhbi5vcmc+CisKKwkqIGdsaWIvZGJ1cy1ndmFsdWUtdXRpbHMuYzogUGF0Y2ggZnJvbSBKYWt1YiBTdGFjaG93c2tpIHRvIGZpeCBsZWFraW5nCisJb2YgbWVtb3J5IGZyb20gd2l0aGluIHBvaW50ZXIgYXJyYXlzIGFuZCBsaXN0cy4gRml4ZXMgYnVnICM2MzAwLgorCisyMDA2LTA0LTI4ICBSb2JlcnQgTWNRdWVlbiAgPHJvYm90MTAxQGRlYmlhbi5vcmc+CisKKwkqIGdsaWIvZGJ1cy1ndmFsdWUuYzogUGF0Y2ggZnJvbSBKYWt1YiBTdGFjaG93c2tpIHRvIGZpeCBhIGxlYWsgaW4KKwlnZW5lcmF0aW5nIHN0cnVjdCBzaWduYXR1cmVzLiBGaXhlcyBidWcgIzYwODMuCisKKzIwMDYtMDQtMjggIFJvYmVydCBNY1F1ZWVuICA8cm9ib3QxMDFAZGViaWFuLm9yZz4KKworCSogcXQvTWFrZWZpbGUuYW06IFR3ZWFrIENMRUFORklMRVMgZnJvbSBxZGJ1c2Nvbm5lY3Rpb24ubW9jCisJdG8gcWRidXNjb25uZWN0aW9uX3AubW9jLgorCisyMDA2LTA0LTI0IEpvaG4gKEo1KSBQYWxtaWVyaSA8am9obnBAcmVkaGF0LmNvbT4KKworCSogUkVBRE1FLCBJTlNUQUxMOiBEb2MgZml4ZXMKKwlQYXRjaCBmcm9tIEJyYWQgSGFyZHMgPGJyYWRoIGF0IGZyb2dtb3V0aC5uZXQ+CisKKzIwMDYtMDQtMjMgIFRoaWFnbyBNYWNpZWlyYSAgPHRoaWFnby5tYWNpZWlyYUB0cm9sbHRlY2guY29tPgorCisJKiBxdC9leGFtcGxlcy9kYnVzLmNwcDogVXNlIHRoZSBuZXcgbWVyZ2VkLWludGVyZmFjZSBtb2RlIGZvcgorCXRoZSBkeW5hbWljIG1ldGEgb2JqZWN0LiBObyBuZWVkIHRvIGd1ZXNzIHdoaWNoIGludGVyZmFjZSB0bworCWNhbGwuCisKKzIwMDYtMDQtMjMgIFRoaWFnbyBNYWNpZWlyYSAgPHRoaWFnby5tYWNpZWlyYUB0cm9sbHRlY2guY29tPgorCisJKiBxdC9xZGJ1c2Nvbm5lY3Rpb25fcC5oOgorCSogcXQvcWRidXNtZXRhb2JqZWN0LmNwcDoKKwkqIHF0L3FkYnVzbWV0YW9iamVjdF9wLmg6CisJKiBxdC9xZGJ1c2ludGVncmF0b3IuY3BwOiBVc2UgdGhlIG5ldyBtZXJnZWQtaW50ZXJmYWNlIG1vZGUKKwlmb3IgdGhlIGR5bmFtaWMgbWV0YSBvYmplY3QuIE5vIG5lZWQgdG8gZ3Vlc3Mgd2hpY2gKKwlpbnRlcmZhY2UgdG8gY2FsbC4KKwkqIHF0L3FkYnVzYWJzdHJhY3RpbnRlcmZhY2VfcC5oOgorCSogcXQvcWRidXNjb25uZWN0aW9uLmNwcDoKKwkqIHF0L3FkYnVzaW50ZWdyYXRvci5jcHA6CisJKiBxdC9xZGJ1c2ludGVyZmFjZS5jcHA6CisJKiBxdC9xZGJ1c2ludGVyZmFjZS5oOiBNYWtlIGZpbmRJbnRlcmZhY2UgYWx3YXlzIHJldHVybiBhIG5vbi1udWxsIHBvaW50ZXIuCisJQWRkIGEgUURCdXNSZWYgdGhhdCBsb29rcyBhbmQgYmVoYXZlcyBsaWtlIERDT1BSZWYuCisKKzIwMDYtMDQtMjMgIFRoaWFnbyBNYWNpZWlyYSAgPHRoaWFnby5tYWNpZWlyYUB0cm9sbHRlY2guY29tPgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jOiBJbnRlcmZhY2VzIGFyZSBvcHRpb25hbCBpbiBtZXRob2QKKyAgICAgICAgY2FsbHMsIHNvIGRvbid0IGdpdmUgdXAgaWYgdGhlIGludGVyZmFjZSBwYXJhbWV0ZXIgaXMgTlVMTC4KKwlQYXRjaCByZXZpZXdlZCBieSBIYXZvYyBQZW5uaW5ndG9uLgorCisyMDA2LTA0LTIzICBUaGlhZ28gTWFjaWVpcmEgIDx0aGlhZ28ubWFjaWVpcmFAdHJvbGx0ZWNoLmNvbT4KKworCSogcXQvcWRidXNyZXBseS5oOiBBZGQgZGVmYXVsdCBjb25zdHJ1Y3RvciBhbmQgb3BlcmF0b3I9CisgICAgICAgICAgKHI1MzI2MjUpCisJKiBxdC9xZGJ1c3R5cGVoZWxwZXJfcC5oOiBVc2UgYSBjbGVhbiBuYW1lc3BhY2U6IG5vIGZvcmVhY2goKQorICAgICAgICAgIGluIHB1YmxpYyBoZWFkZXJzIChyNTMyOTUyKQorCSogcXQvcWRidXNhYnN0cmFjdGludGVyZmFjZS5jcHA6CisJKiBxdC9xZGJ1c2Fic3RyYWN0aW50ZXJmYWNlX3AuaDogQWRkIHRoZSBBdXRvRGV0ZWN0IG1vZGUgYW5kCisgICAgICAgICAgbWFrZSBpdCB0aGUgZGVmYXVsdCAocjUzMjk1MSkKKworMjAwNi0wNC0xOSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYzogRml4IGFzc2VydHMKKwlQYXRjaCBmcm9tIFRpbSBNb2xvbmV5IDx0Lm1vbG9uZXkgYXQgdmVyaXpvbi5uZXQ+CisKKzIwMDYtMDQtMTkgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIG1vbm8vQ29ubmVjdGlvbi5jcywgbW9uby9NZXNzYWdlLmNzOiBDaGVjayBUYXJnZXQgdHlwZQorCVBhdGNoIGZyb20gQWFyb24gQm9ja292ZXIgKGFib2Nrb3ZlciBhdCBub3ZlbGwuY29tKQorCisyMDA2LTA0LTEzICBUaGlhZ28gTWFjaWVpcmEgIDx0aGlhZ28ubWFjaWVpcmFAdHJvbGx0ZWNoLmNvbT4KKworCSogSU5TVEFMTDogZmluZS10dW5lIHRoZSByZXF1aXJlbWVudHMgZm9yIHRoZSBRdDQgYmluZGluZy4KKworMjAwNi0wNC0xNiAgRGFuaWVsIFAuIEJlcnJhbmdlICA8ZGFuQGJlcnJhbmdlLmNvbT4KKworCSogdG9vbHMvZGJ1cy1wcmludC1tZXNzYWdlLmM6IEFkZGVkIHN1cHBvcnQgZm9yIHByaW50aW5nIG9mIGFsbCAKKwkgIHJlbWFpbmluZyBkYXRhIHR5cGVzLiBGaXhlZCBsb2dpYyBmb3IgaW5kZW50YXRpb24gb2YgY29tcG91bmQKKwkgIGRhdGEgdHlwZXMuCisJCisyMDA2LTA0LTE1ICBEYW5pZWwgUC4gQmVycmFuZ2UgIDxkYW5AYmVycmFuZ2UuY29tPgorCisJKiBJTlNUQUxMOiBmaWxsIG91dCBjb250ZW50IG9mIGZpbGUgcHJvdmlkaW5nIERCdXMgc3BlY2lmaWMKKwkgIGJ1aWxkIGluc3RhbGxhdGlvbnMsIGZvbGxvd2VkIGJ5IGdlbmVyaWMgQXV0byogSU5TVEFMTCBmaWxlCisJICBjb250ZW50CisJCisyMDA2LTA0LTEzICBUaGlhZ28gTWFjaWVpcmEgIDx0aGlhZ28ubWFjaWVpcmFAdHJvbGx0ZWNoLmNvbT4KKworCSogcXQvcWRidXNpbnRlZ3JhdG9yLmNwcDogV29yayBhcm91bmQgZysrIDMuMyBidWcuCisJICBQYXRjaCBieSBTdGVmYW4gRWlsZXJzLiAocjUyOTUzNykKKworMjAwNi0wNC0xMyAgVGhpYWdvIE1hY2llaXJhICA8dGhpYWdvLm1hY2llaXJhQHRyb2xsdGVjaC5jb20+CisKKwkqIHF0L3FkYnVzaW50ZXJuYWxmaWx0ZXJzLmNwcDogRG9uJ3Qgc2hvdyB0aGUgcGFyZW50J3MKKyAgCSAgY29udGVudHMgKHI1MjgyMDgpCisKKzIwMDYtMDQtMTAgIFRoaWFnbyBNYWNpZWlyYSAgPHRoaWFnby5tYWNpZWlyYUB0cm9sbHRlY2guY29tPgorCisJKiBxdC9NYWtlZmlsZS5hbTogZml4IHRoZSBkZXBlbmRlbmN5IGZvcgorICAgICAgICAgIHFkYnVzY29ubmVjdGlvbl9wLm1vYy4gSXQncyBpbmNsdWRlZCBpbiBxZGJ1c2ludGVncmF0b3IuY3BwLAorCSAgbm90IGluIHFkYnVzY29ubmVjdGlvbi5jcHAuCisJICBUaGFua3MgdG8gSmFrdWIgU3RhY2hvd3NraSA8c3RhY2hvd3NraUBoeXBhaXIubmV0PiBmb3IKKyAgICAgICAgICBzcG90dGluZyB0aGlzLgorCisyMDA2LTA0LTEwICBUaGlhZ28gTWFjaWVpcmEgIDx0aGlhZ28ubWFjaWVpcmFAdHJvbGx0ZWNoLmNvbT4KKworCSogcXQvZXhhbXBsZXMvbGlzdG5hbWVzLmNwcDoKKwkqIHF0L2V4YW1wbGVzL01ha2VmaWxlLmFtOiBUaHJlZSB3YXlzIHRvIGxpc3QgdGhlIG5hbWVzIG9uIHRoZQorCSAgYnVzLgorCisyMDA2LTA0LTEwICBUaGlhZ28gTWFjaWVpcmEgIDx0aGlhZ28ubWFjaWVpcmFAdHJvbGx0ZWNoLmNvbT4KKworCSogdGVzdC9xdC90c3RfaGFsLmNwcDogUmVtb3ZlIHRoZSB3YWl0aW5nLCBzaW5jZSBpdCdzIG5vdAorICAgICAgICAgIG5lZWRlZCBhbnltb3JlLiBSZXF1aXJlcyBRdCA0LjEuMyB0byB3b3JrIHByb3Blcmx5LiAocjUyODE0OCkKKworMjAwNi0wNC0xMCAgVGhpYWdvIE1hY2llaXJhICA8dGhpYWdvLm1hY2llaXJhQHRyb2xsdGVjaC5jb20+CisKKwlNZXJnZSBmcm9tIFN1YnZlcnNpb246CisJKiBxdC9xdC1kYnVzLnFkb2Njb25mOiBVcGRhdGUgVHJvbGx0ZWNoJ3Mgd2VicGFnZSBsaW5rIHRvCisJICBzb21ldGhpbmcgdGhhdCBleGlzdHMgKHI1MjYzMTUpCisJKiBxdC9xZGJ1c2ludGVybmFsZmlsdGVycy5jcHA6IENvcnJlY3RseSBkZXRlY3Qgbm9uLXNjcmlwdGFibGUKKwkgIHNsb3RzL3NpZ25hbHMgKHI1MjYzMTYpCisJKiBxdC9xZGJ1c2ludGVybmFsZmlsdGVycy5jcHA6IEZpeCB0aGUgc2V0UHJvcGVydHkgY2FsbCBhbmQKKwkgIGFsc28gcmV0dXJuIGFuIHVua25vd24tbWV0aG9kIGVycm9yIGlmIHRoZSBwYXJhbWV0ZXJzIGRvbid0CisJICBtYXRjaCBmb3Igb3JnLmZyZWVkZXNrdG9wLkRCdXMuUHJvcGVydGllcy4gKHI1MjY4NDIpCisJKiBxdC9leGFtcGxlcy9kYnVzLmNwcDogQWxsb3cgcGFzc2luZyBvZiBRVmFyaWFudHMgKHI1MjY4NDMpCisJKiBxdC9xZGJ1c2ludGVncmF0b3IuY3BwOiBSZXN0b3JlIHRoZSBwcm9wZXIgb3JkZXIgb2YKKwkgIGRlbGl2ZXJ5OiBkb24ndCBtYWtlIG1ldGhvZCByZXR1cm5zIGJlIGRlbGl2ZXJlZCBvbiBwcmlvcml0eQorCSAgKHI1MjgxNTApCisKKzIwMDYtMDMtMjggIFRoaWFnbyBNYWNpZWlyYSAgPHRoaWFnby5tYWNpZWlyYUB0cm9sbHRlY2guY29tPgorCisJKiBjb25maWd1cmUuaW4gcXQvTWFrZWZpbGUuYW06IGFkZCBxdC9leGFtcGxlcworCSogcXQvZXhhbXBsZXM6IEFkZCBRdERCdXMgZXhhbXBsZSBwcm9ncmFtczoKKwkgIC0gaGVsbG86IEhlbGxvLCBXb3JsZAorCSAgLSBwaW5nOiBTaW1wbGUgbWV0aG9kLWNhbGxpbmcgcHJvZ3JhbQorCSAgLSBwb25nOiBTaW1wbGUgb2JqZWN0LWV4cG9ydGluZyBwcm9ncmFtIChub3QgdXNpbmcgYWRhcHRvcnMpCisJICAtIGNvbXBsZXhwaW5nOiBJbnRlcmFjdGl2ZSBtZXRob2QtY2FsbGluZyBwcm9ncmFtIAorCQkoYWxzbyBnZXRzIGFuZCBzZXRzIHByb3BlcnRpZXMpLgorCSAgLSBjb21wbGV4cG9uZzogU2FtcGxlIHByb2dyYW0gZXhwb3J0aW5nIG1ldGhvZHMsIHNpZ25hbHMgYW5kCisJCXByb3BlcnRpZXMsIHVzaW5nIGFkYXB0b3JzLgorCSAgLSBkYnVzOiBTaW1wbGUgaW1wbGVtZW50YXRpb24gb2YgYSBnZW5lcmljIG1ldGhvZC1jYWxsaW5nCisJCXByb2dyYW0sIHNpbWlsYXIgdG8gJ2RidXMtc2VuZCcsIGJ1dCB3aXRoIHNlbWFudGljcworCQlzaW1pbGFyIHRvICdkY29wJy4KKwkgIC0gY2hhdDogU2ltcGxpc3RpYyBjaGF0IHByb2dyYW0sIGltcGxlbWVudGVkIHVzaW5nIHNpZ25hbHMKKwkJYW5kIHRoZSBzeXN0ZW0gYnVzLiBMb29rcyBsaWtlIElSQy4KKworMjAwNi0wMy0yOCAgVGhpYWdvIE1hY2llaXJhICA8dGhpYWdvLm1hY2llaXJhQHRyb2xsdGVjaC5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogRGV0ZWN0IFF0R3VpIChuZWNlc3NhcnkgZm9yIG9uZSBvZiB0aGUKKyAgICAgICAgICBleGFtcGxlIHByb2dyYW1zKS4gTm90ZTogdGhpcyBpbmNyZWFzZXMgdGhlIG1pbmltdW0gcmVxdWlyZWQKKyAgICAgICAgICB2ZXJzaW9uIG9mIFF0IHRvIDQuMS4zLgorCisyMDA2LTAzLTI4ICBUaGlhZ28gTWFjaWVpcmEgIDx0aGlhZ28ubWFjaWVpcmFAdHJvbGx0ZWNoLmNvbT4KKworCSogdGVzdC9xdC8qOiBTeW5jIHdpdGggS0RFIFN1YnZlcnNpb24gcmV2aXNpb24gNTIzNjQ3LgorICAgICAgICBVcGRhdGUgdGhlIHRlc3RjYXNlcyB0byB0aGUgbmV3IEFQSS4gUmVtb3ZlIHRlc3RjYXNlcyBmb3IKKyAgICAgICAgY2xhc3NlcyB0aGF0IGFyZSBubyBsb25nZXIgcHVibGljIG9yIGhhdmUgYmVlbiByZW1vdmVkLgorCisyMDA2LTAzLTI4ICBUaGlhZ28gTWFjaWVpcmEgIDx0aGlhZ28ubWFjaWVpcmFAdHJvbGx0ZWNoLmNvbT4KKworCSogcXQvKjogCisJKiBkYnVzL3FkYnVzLmg6IFN5bmMgd2l0aCBLREUgU3VidmVyc2lvbiByZXZpc2lvbgorCTUyMzY0Ny4gSG9wZWZ1bGx5LCB0aGlzIHdpbGwgYmUgdGhlIGxhc3Qgb2YgdGhlCisJc291cmNlLWluY29tcGF0aWJsZSBjaGFuZ2VzLiBEb2N1bWVudGF0aW9uIGhhcyBiZWVuIGltcHJvdmVkOworCXN1cHBvcnQgZm9yIFFMaXN0PGJhc2ljLXR5cGVzPiBoYXMgYmVlbiBhZGRlZDsgUURCdXNPYmplY3QgaXMKKwlnb25lOyBRREJ1cyhBYnN0cmFjdClJbnRlcmZhY2UgaXMgbm93IGEgUU9iamVjdCB3aXRoCisJYXV0by1nZW5lcmF0ZWQgbWV0YS1vYmplY3Q7IFFEQnVzSW50cm9zcGVjdGlvbiBpcyBtYXJrZWQKKwlwcml2YXRlLCBzaW5jZSBRTWV0YU9iamVjdCBjYW4gYmUgdXNlZCBub3c7IGxvdHMgb2YgYnVnZml4ZXMuCisKKzIwMDYtMDMtMTYgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwlQYXRjaCBmcm9tIE1pbG9zeiBEZXJlenluc2tpIDxpbnRlcm5hbGVycm9yIGF0IGdtYWlsLmNvbT4KKwkKKwkqIGNvbmZpZ3VyZS5pbjoKKwlPdXRwdXQgdGhlIHNlcnZpY2UgZGlyZWN0b3J5IGluIHRoZSBjb25maWd1cmUgc3VtbWFyeQorCisJKiBkYnVzLTEucGMuaW46CisJQWRkIHNlc3Npb25fYnVzX3NlcnZpY2VzX2RpcgorCisyMDA2LTAzLTEwICBSb3NzIEJ1cnRvbiAgPHJvc3NAb3BlbmVkaGFuZC5jb20+CisKKwkqIHRvb2xzL2RidXMtcHJpbnQtbWVzc2FnZS5jOgorCUFkZCBzdXBwb3J0IGZvciBvYmplY3QgcGF0aHMgYW5kIHNpZ25hdHVyZXMuCisKKzIwMDYtMDMtMDYgIFNqb2VyZCBTaW1vbnMgPHNqb2VyZEBsdW9uLm5ldD4KKworCSogYnVzL2J1cy5jOiAoYnVzX2NvbnRleHRfcmVsb2FkX2NvbmZpZyk6IEZsdXNoIHRoZSB1c2VyIGRhdGFiYXNlIGNhY2hlIG9uCisJY29uZmlnIHJlbG9hZC4KKwkqIGJ1cy9kYnVzLWRhZW1vbi4xLmluOiBBbHNvIG5vdGUgdGhhdCBTSUdIVVAgZmx1c2hlcyB0aGUgdXNlci9ncm91cAorCWluZm9ybWF0aW9uIGNhY2hlcworCSogZGJ1cy9kYnVzLWhhc2guYzogKF9kYnVzX2hhc2hfdGFibGVfcmVtb3ZlX2FsbCk6IAorCSogZGJ1cy9kYnVzLWhhc2guaDogQWRkIGZ1bmN0aW9uIHRvIHJlbW92ZSBhbGwgZW50cmllcyBmcm9tIGEgaGFzaCB0YWJsZQorCSogZGJ1cy9kYnVzLXVzZXJkYi5jOiAoX2RidXNfdXNlcl9kYXRhYmFzZV9mbHVzaCk6CisJKiBkYnVzL2RidXMtdXNlcmRiLmg6IEFkZCBmdW5jdGlvbiB0byBmbHVzaCBhbGwgdXNlci9ncm91cCBpbmZvcm1hdGlvbgorCWNhY2hlcy4KKworMjAwNi0wMy0wNiAgVGhpYWdvIE1hY2llaXJhICA8dGhpYWdvLm1hY2llaXJhQHRyb2xsdGVjaC5jb20+CisKKwkqIHF0L2RidXNpZGwyY3BwLmNwcDoKKwkqIHF0L01ha2VmaWxlLmFtOiBhZGQgdGhlIGRidXNpZGwyY3BwIHRvb2wsIHRoZSByZXBsYWNlbWVudAorCWZvciBkY29waWRsMmNwcCwgZm91bmQgaW4gdGhlIEtERSBpbnN0YWxsYXRpb25zIChvciB0aGUgbW9yZQorCW1vZGVybiBrYWx5cHR1cyk6IGdlbmVyYXRlIFF0NCBDKysgY29kZSBmb3IgdGhlIGlucHV0IFhNTAorCWludHJvc3BlY3Rpb24uIEN1cnJlbnRseSBubyBJREwgcGFyc2luZy4KKworMjAwNi0wMy0wNiAgVGhpYWdvIE1hY2llaXJhICA8dGhpYWdvLm1hY2llaXJhQHRyb2xsdGVjaC5jb20+CisKKwkqIHRlc3QvcXQvKjogVXBkYXRlIHRoZSBzZWxmLXRlc3RzLgorCisyMDA2LTAzLTA2ICBUaGlhZ28gTWFjaWVpcmEgIDx0aGlhZ28ubWFjaWVpcmFAdHJvbGx0ZWNoLmNvbT4KKworCSogcXQvKjogCisJKiBkYnVzL3FkYnVzLmg6IFN5bmMgd2l0aCBLREUgU3VidmVyc2lvbiByZXZpc2lvbiA1MTYyMzcuIFRoaXMKKwlyZXByZXNlbnRzIHRoZSBmaXJzdCBmZWF0dXJlLWNvbXBsZXRlIHZlcnNpb24gb2YgdGhlIFF0NAorCWJpbmRpbmdzIHNpbmNlIEkgdG9vayBvdmUgbWFpbnRhaW5lcnNoaXAuCisKKzIwMDYtMDMtMDYgIFRoaWFnbyBNYWNpZWlyYSAgPHRoaWFnby5tYWNpZWlyYUB0cm9sbHRlY2guY29tPgorCisJKiBxdC9Eb3h5ZmlsZTogQWRkaW5nIGEgRG94eWZpbGUgZm9yIHRoZSBRdDQgYmluZGluZ3MKKyAgICAgICAgZGlyLiBUaGlzIGlzIEMrKywgc28gd2UgY2FuJ3QgdXNlIHRoZSBEQnVzIG9uZXMuCisKKzIwMDYtMDMtMDIgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIHB5dGhvbi9kYnVzX2JpbmRpbmdzLnB5eDogUmVtb3ZlIHJlZnJlbmNlIHRvIHN5cy9jZGVmcy5oCisJKFBhdGNoIGZyb20gQXJ0ZW0gS2FjaGl0Y2hraW5lIDxBcnRlbS5LYWNoaXRjaGtpbiBhdCBTdW4uQ09NPikKKworMjAwNi0wMy0wMiAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYzogCisJKF9kYnVzX2Nvbm5lY3Rpb25fYmxvY2tfcGVuZGluZ19jYWxsKToKKwlDaGVjayB0byBzZWUgaWYgb3VyIGRhdGEgaGFzIGFscmVhZHkgYmVlbiByZWFkIG9mZiB0aGUgY29ubmVjdGlvbgorCWJ5IGFub3RoZXIgYmxvY2tpbmcgcGVuZGluZyBjYWxsIGJlZm9yZSB3ZSBibG9jayBpbiBwb2xsLgorCShjaGVja19mb3JfcmVwbHlfYW5kX3VwZGF0ZV9kaXNwYXRjaF91bmxvY2tlZCk6CisJQ29kZSB0YWtlbiBmcm9tIF9kYnVzX2Nvbm5lY3Rpb25fYmxvY2tfcGVuZGluZ19jYWxsIC0gY2hlY2tzIGZvcgorCWFuIGFscmVhZHkgcmVhZCByZXBseSBhbmQgdXBkYXRlcyB0aGUgZGlzcGF0Y2ggaWYgdGhlcmUgaXMgb25lLgorCisJKiB0ZXN0L25hbWUtdGVzdC90ZXN0LXBlbmRpbmctY2FsbC1kaXNwYXRjaC5jOgorCU5ldyB0ZXN0IGZvciBtYWtpbmcgc3VyZSB3ZSBkb24ndCBnZXQgc3R1Y2sgcG9sbGluZyBhIAorCWRidXMgY29ubmVjdGlvbiB3aGljaCBoYXMgbm8gZGF0YSBvbiB0aGUgc29ja2V0IHdoZW4KKwlibG9ja2luZyBvdXQgb2Ygb3JkZXIgb24gdHdvIG9yIG1vcmUgcGVuZGluZyBjYWxscy4KKworMjAwNi0wMi0yOCAgVGhpYWdvIE1hY2llaXJhIDx0aGlhZ28ubWFjaWVpcmFAdHJvbGx0ZWNoLmNvbT4KKworCSogcXQvTWFrZWZpbGUuYW06IFBhdGNoIGJ5IFNqb2VyZCBTaW1vbnMuIE1vcmUgLm1vYyBpc3N1ZXM6CisgICAgICAgIG1ha2UvYXV0b21ha2UgZG9uJ3QgZGV0ZWN0IHRoYXQgd2UncmUgdGFsa2luZyBhYm91dCB0aGUgc2FtZQorICAgICAgICAubG8gZmlsZSBpZiBJIHNwZWNpZnkgdGhlIGZ1bGwgcGF0aCB0byB0aGUgc291cmNlIGZpbGVzLgorCisyMDA2LTAyLTI2ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogYnVzL2RidXMtZGFlbW9uLjEuaW46IGltcHJvdmUgdGhlIGxhbmd1YWdlIGluIGEgY291cGxlIHNwb3RzIEkgbm90aWNlZAorCisJKiBkYnVzL2RidXMtYnVzLmMgKGludGVybmFsX2J1c19nZXQpOiBpbiB0aGUgZXJyb3IgbWVzc2FnZSBpZiB0aGUKKwlzZXNzaW9uIGJ1cyB2YXJpYWJsZSBpcyB1bnNldCwgc3VnZ2VzdCAibWFuIGRidXMtbGF1bmNoIiBhbmQgIm1hbgorCWRidXMtZGFlbW9uIiB0byBmaWd1cmUgb3V0IGhvdyB0byBmaXggdGhlIHByb2JsZW0KKworMjAwNi0wMi0yNSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGdsaWIvZGJ1cy1nbGliLXRvb2wuYyAodXNhZ2UpOiBmaXggdXAgdGhlIHVzYWdlIG1lc3NhZ2UsIHNvbWVvbmUKKwlzaG91bGQgbWFrZSB0aGlzIHRoaW5nIHVzZSB0aGUgbmV3IGdsaWIgb3B0aW9ucyBwYXJzZXIKKworMjAwNi0wMi0yNSAgVGhpYWdvIE1hY2llaXJhIDx0aGlhZ28ubWFjaWVpcmFAdHJvbGx0ZWNoLmNvbT4KKworCSogcXQvTWFrZWZpbGUuYW06IFBhdGNoIGJ5IFNqb2VyZCBTaW1vbnMuIEZpeCB0aGUgcGF0aCB0byB0aGUKKyAgICAgICAgLmxvIGZpbGVzIHRha2luZyBtb2Mgc291cmNlcy4KKworMjAwNi0wMi0yNSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy5oLCBkYnVzL01ha2VmaWxlLmFtOiBhZGQgZGJ1cy1zaWduYXR1cmUuaCB0byBkYnVzLmgKKwlhbmQgaW5zdGFsbCBpdCBhcyBhIHB1YmxpYyBoZWFkZXIKKworMjAwNi0wMi0yNCAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogUmVsZWFzZWQgMC42MQorCisyMDA2LTAyLTI0ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCQorCSogcHJveGllcy5weTogRml4IHRoZSBjYWxsY2hhaW4KKworMjAwNi0wMi0yNCAgSm9obiAoSjUpIFBhbG1pZXJpIDxqb2hucEByZWRoYXQuY29tPgorCQorCSogcGF0Y2ggZnJvbSBTam9lcmQgU2ltb25zIDxzam9lcmQgYXQgZGViaWFuLm9yZz46CQorCisJKiBkYnVzL2RidXMtc3lzZGVwcy11dGlsLmMgKF9kYnVzX2dyb3VwX2luZm9fZnJlZSk6IE1vdmVkIHRvIAorCWRidXMvZGJ1cy1zeXNkZXBzLmMKKworCSogZGJ1cy9kYnVzLXVzZXJkYi5jIChfZGJ1c19ncm91cF9pbmZvX2ZyZWVfYWxsb2NhdGVkKTogRG9uJ3QKKwljYWxsIF9kYnVzX2dyb3VwX2luZm9fZnJlZV9hbGxvY2F0ZWQgd2hpY2ggY2F1c2VzIGluZmluaXRlIGxvb3AsCisJY29ycmVjdGx5IGNhbGwgX2RidXNfZ3JvdXBfaW5mb19mcmVlCisKKzIwMDYtMDItMjAgIFRoaWFnbyBNYWNpZWlyYSA8dGhpYWdvLm1hY2llaXJhQHRyb2xsdGVjaC5jb20+CisKKwkqIHF0L3FkYnVzaW50ZXJmYWNlX3AuaDoKKwkqIHF0L3FkYnVzaW50ZXJmYWNlLmNwcDogVXNlIHRoZSBzdGFuZGFyZAorCW9yZy5mcmVlZGVza3RvcC5EQnVzLk1ldGhvZC5Ob1JlcGx5IGFubm90YXRpb24gZm9yIHRoZSAiYXN5bmMiCisJY2FsbHMgaW5zdGVhZCBvZiBjcmVhdGluZyBvbmUgZm9yIHVzLgorCisJKiBxdC9xZGJ1c2Nvbm5lY3Rpb25fcC5oOgorCSogcXQvcWRidXNpbnRlZ3JhdG9yLmNwcDogUmVtb3ZlIGRlYnVnZ2luZyBjb2RlLgorCisJKiBxdC9xZGJ1c2ludGVncmF0b3IuY3BwOgorCSogcXQvcWRidXNtZXNzYWdlLmNwcDoKKwkqIHF0L3FkYnVzbWVzc2FnZV9wLmg6CisJKiBxdC9xZGJ1c21lc3NhZ2UuaDogQ2hhbmdlIHRoZSBiZWhhdmlvdXIgb2YgYXV0b21hdGljCisJcmVwbHktc2VuZGluZzogbm93IGEgcmVwbHkgaXMgYWx3YXlzIHNlbnQsIHVubGVzcyB0aGUgY2FsbGVyCisJZGlkbid0IHJlcXVlc3Qgb25lIG9yIGlmIHRoZSB1c2VyIHNsb3QgaGFzIGFscmVhZHkgc2VudCBvbmUuCisKKzIwMDYtMDItMTYgIFJvYmVydCBNY1F1ZWVuICA8cm9ib3QxMDFAZGViaWFuLm9yZz4KKworCSogY29uZmlndXJlLmluOiBQYXRjaCBmcm9tIERlYmlhbiBwYWNrYWdlcyBieSBTam9lcmQgU2ltb25zCisJPHNqb2VyZEBkZWJpYW4ub3JnPiB0byBhZGQgLS13aXRoLXF0LW1vYyBhbmQgLS13aXRoLXF0My1tb2MKKwlhcmd1bWVudHMgc28gaXQncyBwb3NzaWJsZSB0byBidWlsZCBib3RoIGJpbmRpbmdzIGluIHRoZQorCXNhbWUgdHJlZS4KKworCSogcXQvTWFrZWZpbGUuYW06IEZpeCB0cnVuY2F0ZWQgdmFsdWUgc28gdGhhdCBtYWtlIGRpc3Qgd29ya3MuCisKKzIwMDYtMDItMTYgIFJvYmVydCBNY1F1ZWVuICA8cm9ib3QxMDFAZGViaWFuLm9yZz4KKworCSogYWNpbmNsdWRlLm00LCBjb25maWd1cmUuaW46IFBhdGNoIGZyb20gQnJhZCBIYXJkcworCTxicmFkaEBmcm9nbW91dGgubmV0PiB0byBhdm9pZCB3YXJuaW5ncyBmcm9tIGF1dG9jb25mIDEuOSBieQorCWltcHJvdmluZyBxdW90aW5nLCByZS1vcmRlcmluZyBhIGZldyBjaGVja3MsIGFuZCBhIGZldyBvdGhlcgorCWFlc3RoZXRpYyB0aWR5LXVwcy4KKworMjAwNi0wMi0xNiAgUm9iZXJ0IE1jUXVlZW4gIDxyb2JvdDEwMUBkZWJpYW4ub3JnPgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChkYnVzX21lc3NhZ2VfaXRlcl9nZXRfZml4ZWRfYXJyYXkpOgorCVBhdGNoIGZyb20gUm9iIFRheWxvciA8cm9iLnRheWxvckBjb2xsYWJvcmEuY28udWs+IHRvIGNvcnJlY3QgYSBib2d1cworCWFzc2VydGlvbiB0aGF0IHRoZSBuZXh0IGVsZW1lbnQgdG8gcmVhZCBmcm9tIHRoZSBpdGVyIGlzIGZpeGVkIGluCisJc2l6ZS4gVGhpcyBpcyBub3QgdGhlIGNhc2Ugd2hlbiB5b3UgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIGl0ZXIsCisJYmVjYXVzZSB0aGUgbmV4dCBlbGVtZW50IHR5cGUgaXMgSU5WQUxJRC4KKworCSogZGJ1cy9kYnVzLXN0cmluZy5jIChfZGJ1c19zdHJpbmdfaW5pdF9jb25zdF9sZW4pOiBDb3JyZWN0IGEKKwlhIGJvZ3VzIGFzc2VydCB3aGljaCBtZWFucyB0aGF0IHlvdSBtYXkgbm90IGluaXRpYWxpc2UgYSAwLWxlbmd0aAorCXN0cmluZyB1bmxlc3MgeW91IHByb3ZpZGUgYSBub24tTlVMTCBwb2ludGVyLiBUaGlzIHByZXZlbnRlZAorCXlvdSBmcm9tIG1hcnNoYWxsaW5nIG1lc3NhZ2VzIGNvbnRhaW5pbmcgemVyby1sZW5ndGggYXJyYXlzIGluCisJc29tZSBjYXNlcy4KKworCSogZ2xpYi9kYnVzLWd2YWx1ZS5jIChkZW1hcnNoYWxfY29sbGVjdGlvbl9hcnJheSk6IEFub3RoZXIgcGF0Y2gKKwlmcm9tIFJvYiB0byBjb3JyZWN0IGJvZ3VzIGFzc2VydHMgd2hlbiB0cnlpbmcgdG8gZGVtYXJzaGFsIGFuCisJYXJyYXkgYW5kIGdldF9maXhlZF9hcnJheSBnb3QgeW91IDAgZWxlbWVudHMuIEFwcGVuZCBub3RoaW5nIHRvCisJdGhlIEdBcnJheSBpbiB0aGlzIGNhc2UuCisKKwkqIHRlc3QvZ2xpYi90ZXN0LWRidXMtZ2xpYi5jOiBBZGQgYSB0ZXN0IGNhc2UgZm9yIHJvdW5kLXRyaXBwaW5nCisJYW4gZW1wdHkgYXJyYXkgdmlhIHRoZSBnbGliIGJpbmRpbmdzLiBXaXRob3V0IGFsbCBvZiB0aGUgYWJvdmUKKwlwYXRjaGVzLCB0aGlzIG5ldyB0ZXN0IGZhaWxzLgorCisyMDA2LTAyLTE2ICBSb2JlcnQgTWNRdWVlbiAgPHJvYm90MTAxQGRlYmlhbi5vcmc+CisKKwkqIGdsaWIvZGJ1cy1nbWFpbi5jOiBNYWtlIHRoZSBwcmV2aW91cyBjb21taXQgY29tcGlsZS4KKworCSogcHl0aG9uL19kYnVzLnB5LCBweXRob24vbWF0Y2hydWxlcy5weTogUGF0Y2ggZnJvbSBPbGUgQW5kcmUKKwlSYXZuYWFzIDxvbGUuYW5kcmUucmF2bmFhc0Bjb2xsYWJvcmEuY28udWs+IHRvIGFsbG93IHlvdSB0bworCXNwZWNpZnkgc2VuZGVyX2tleXdvcmQ9ImZvbyIsIHBhdGhfa2V5d29yZD0iYmFyIiB3aGVuIGFkZGluZworCWEgc2lnbmFsIGxpc3RlbmVyLCBzbyB0aGF0IHlvdSBjYW4gYmluZCB0byBzaWduYWxzIGdlbmVyaWNhbGx5CisJYnV0IHN0aWxsIGRvIHNvbWV0aGluZyB1c2VmdWwgaW4geW91ciBjYWxsYmFjay4KKworCSogcHl0aG9uL2RidXNfYmluZGluZ3MucHl4OiBEZW1hcnNoYWwgdGhlIGJ5dGUgdHlwZSBhcyB1bnNpZ25lZAorCWNoYXJzIHNvIHRoYXQgdGhleSdyZSBub3QgY2FzdCB0byBjaGFycyBhbmQgbWFkZSBuZWdhdGl2ZS4gVGhhbmtzCisJdG8gSmFrdWIgU3RhY2hvd3NraSBmb3IgcmVwb3J0aW5nIHRoaXMgYW5kIHRlc3RpbmcgdGhlIGZpeC4KKworMjAwNi0wMi0xNSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLWdsaWIuaDoKKwkqIGdsaWIvZGJ1cy1nbWFpbi5oOgorCShkYnVzX2dfY29ubmVjdGlvbl9vcGVuKTogbmV3IG1ldGhvZCBmb3Igb3Blbm5pbmcKKwlhIGNvbm5lY3Rpb24gdG8gYW4gYXJiaXRyYXJ5IGFkZHJlc3MgaW4gdGhlIGdsaWIgYmluZGluZ3MKKworCSogQ2hhbmdlTG9nOiBjaGVja2luIGxhc3QgZW50cnkgd2hpY2ggZG9lc24ndCBzZWVtIHRvIGJlIGNvbW1pdGVkCisKKzIwMDYtMDItMTMgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIHRvb2xzL2RidXMtbGF1bmNoLmM6IEZpeGVkIHNoIHN5bnRheCBvdXRwdXQKKworMjAwNi0wMi0xMyAgUm9iZXJ0IE1jUXVlZW4gIDxyb2JvdDEwMUBkZWJpYW4ub3JnPgorCisJKiBnbGliL2RidXMtYmluZGluZy10b29sLWdsaWIuYywgZ2xpYi9kYnVzLWdtYWluLmMsCisJZ2xpYi9kYnVzLWdzaWduYXR1cmUuYywgZ2xpYi9kYnVzLWd0eXBlLXNwZWNpYWxpemVkLmMsCisJZ2xpYi9kYnVzLWd0eXBlLXNwZWNpYWxpemVkLmgsIGdsaWIvZGJ1cy1ndmFsdWUtdXRpbHMuYywKKwlnbGliL2RidXMtZ3ZhbHVlLXV0aWxzLmgsIGdsaWIvZGJ1cy1ndmFsdWUuYzoKKwlQYXRjaCBmcm9tIFJvYiBUYXlsb3IgPHJvYi50YXlsb3JAY29sbGFib3JhLmNvLnVrPiB0byBhZGQgYSBiaWcKKwltaXNzaW5nIHBpZWNlIG9mIHRoZSBnbGliIGJpbmRpbmdzIGppZ3NhdyBwdXp6bGUuIFRoaXMgbW9kaWZpZXMKKwl0aGUgZXhpc3Rpbmcgc3BlY2lhbGlzZWQgdHlwZXMgdG8gaGF2ZSBOIHR5cGUgcGFyYW1ldGVycyAocmF0aGVyCisJdGhhbiB0aGUgY3VycmVudCAxIG9yIDIgZm9yIGFycmF5cyBhbmQgZGljdGlvbmFyaWVzIHJlc3BlY3RpdmVseSkuCisJWW91IGNhbiB0aGVuIHVzZSB0aGlzIHRvIGdldCBhIGdsaWIgdHlwZSB0byByZXByZXNlbnQgYW55IGFyYml0cmFyeQorCUQtQnVzIHN0cnVjdCB0eXBlIHVzaW5nIGRidXNfZ190eXBlX2dldF9zdHJ1Y3QuIFRoZSBvbmx5CisJaW1wbGVtZW50YXRpb24gb2YgdGhlc2UgdHlwZXMgaXMgd2l0aCBHVmFsdWVBcnJheXMgYXMgYmVmb3JlLAorCWJ1dCBpdCdzIG5vdyBwb3NzaWJsZSB0byBzdG9yZSB0aGVzZSBpbiBhcnJheXMsIGVtaXQgdGhlbSBpbgorCXNpZ25hbHMsIGV0Yy4KKworMjAwNi0wMi0xMCAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLXNpZ25hdHVyZS5jIChkYnVzX3NpZ25hdHVyZV9pdGVyX3JlY3Vyc2UpOiBDb3JyZWN0bHkKKwlkZWFsIHdpdGggbmVzdGVkIGFycmF5cyAoQnVnICM1ODIzKSBQYXRjaCBieSBUaGlhZ28gTWFjaWVpcmEgCisJPHRoaWFnby5tYWNpZWlyYSBhdCB0cm9sbHRlY2guY29tPgorCisyMDA2LTAyLTEwICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBtb25vL2RvYy9NYWtlZmlsZS5hbTogRml4IHBhcmFsbGVsIG1ha2UgcHJvYmxlbSB3aXRoIG1vbm8tZG9jCisJKEJ1ZyAjNDIxMykgUGF0Y2ggZnJvbSBEb3VnIEdvbGRzdGVpbiA8Y2FyZG9lIGF0IGdlbnRvby5vcmc+CisKKzIwMDYtMDItMTAgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGJ1cy9jb25uZWN0aW9uLmMgKGJ1c19jb25uZWN0aW9uc19leHBlY3RfcmVwbHkpOiBNYWtlCisJcGVuZGluZyByZXBseSBsaW1pdCBub3QgY29tbW9uIHRvIGFsbCBjb25uZWN0aW9ucyAoQnVnICM1NDE2KQorCVBhdGNoIGZyb20gS2ltbW8gSMOkbcOkbMOkaW5lbiA8a2ltbW8uaGFtYWxhaW5lbiBhdCBub2tpYS5jb20+CisKKzIwMDYtMDItMTAgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIHRvb2xzL2RidXMtbGF1bmNoLmM6IEZpeGVkIGNzaCBzeW50YXggb3V0cHV0IChCdWcgIzU3MjApCisKKzIwMDYtMDItMTAgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGdjai9NYWtlZmlsZS5hbTogcG9pbnQgdG8gY29ycmVjdCBqYXIgY29tbWFuZCAoQnVnICM0NTI5KQorCXBhdGNoIGZyb20gRG91ZyBHb2xkc3RlaW4gPGNhcmRvZSBhdCBnZW50b28ub3JnPgorCisyMDA2LTAyLTA5ICBKb2UgU2hhdyAgPGpvZXNoYXdAbm92ZWxsLmNvbT4KKworCSogbW9uby9Bcmd1bWVudHMuY3M6IEZpeCBhIG1hZ2ljIG51bWJlciBpbiB0aGUgbW9ubyBiaW5kaW5ncworCXRoYXQgZG9lc24ndCB3b3JrIG9uIDY0IGJpdCBhcmNoZXMuICBQYXRjaCBmcm9tIFBldGVyIEpvaGFuc29uLgorCisyMDA2LTAxLTI3ICBSb2JlcnQgTWNRdWVlbiAgPHJvYm90MTAxQGRlYmlhbi5vcmc+CisKKwkqIGdsaWIvZGJ1cy1iaW5kaW5nLXRvb2wtZ2xpYi5bY2hdOiBQYXRjaCBiYXNlZCBvbiBSaWNhcmRvIEtla2tpJ3MKKwlwYXRjaCB0byB1c2UgYW4gYW5ub3RhdGlvbiBvcmcuZnJlZWRlc2t0b3AuREJ1cy5HTGliLkNsaWVudENTeW1ib2wKKwl3aGVuIGdlbmVyYXRpbmcgdGhlIGNsaWVudC1zaWRlIG1ldGhvZHMsIGluc3RlYWQgb2Ygb3ZlcmxvYWRpbmcKKwlDU3ltYm9sIHdoaWNoIGJyb2tlIGV2ZXJ5dGhpbmcgaG9ycmlibHkuIE15IGFwb2xvZ2llcy4KKworMjAwNi0wMS0yNyAgUm9iZXJ0IE1jUXVlZW4gIDxyb2JvdDEwMUBkZWJpYW4ub3JnPgorCisJKiBnbGliL2RidXMtZ3R5cGUtc3BlY2lhbGl6ZWQuW2NoXSwgZ2xpYi9kYnVzLWd2YWx1ZS11dGlscy5jOiBQYXRjaAorCWJ5IG1lIGFuZCBSb2IgVGF5bG9yIHRvIGFkZCBhIHNpbXBsZV9mcmVlIGZ1bmN0aW9uIHRvIEQtQnVzIG1hcAorCWFuZCBjb2xsZWN0aW9uIHR5cGVzLCB3aGljaCBhbGxvd3MgdGhvc2UgdHlwZXMgd2hpY2ggY2FuIGJlIGZyZWVkCisJd2l0aCBhIEdEZXN0cm95Tm90aWZ5IChzdWNoIGFzIEdIYXNoVGFibGVzIGFuZCBHQXJyYXlzLCBidXQgbm90CisJR1B0ckFycmF5cykgdG8gYmUgc3RvcmVkIGFzIHRoZSB2YWx1ZXMgaW4gaGFzaHRhYmxlcy4KKworCSogdGVzdC9nbGliL3Rlc3QtZGJ1cy1nbGliLmMsIHRlc3QvZ2xpYi90ZXN0LXNlcnZpY2UtZ2xpYi57Yyx4bWx9OgorCVBhdGNoIGJ5IFJvYiBUYXlsb3IgdG8gYWRkIG5lc3RlZCBkaWN0cyB0byB0aGUgZ2xpYiB0ZXN0cyB0byBjaGVjaworCXRoZSBhYm92ZSBjb2RlIHdvcmtzLCBhbmQgYXBwZWFycyBub3QgdG8gbGVhayB3aGVuIGNhbGxlZCByZXBlYXRlZGx5LgorCisyMDA2LTAxLTI3ICBSb2JlcnQgTWNRdWVlbiAgPHJvYm90MTAxQGRlYmlhbi5vcmc+CisKKwkqIGdsaWIvZGJ1cy1ndmFsdWUuYyAoZGVtYXJzaGFsX3ZhbHVlYXJyYXkpOiBQYXRjaCBmcm9tIFJvYiBUYXlsb3IKKwl0byBmcmVlIGEgRC1CdXMgYWxsb2NhdGVkIHN0cmluZyB3aXRoIGRidXNfZnJlZSAoKSBpbnN0ZWFkIG9mCisJZ19mcmVlICgpLgorCisyMDA2LTAxLTI3ICBJYWluIEhvbG1lcyAgPGlhaW5Ab3BlbmVkaGFuZC5jb20+CisKKwkqIGdsaWIvZGJ1cy1ncHJveHkuYyAoZGJ1c19nX3Byb3h5X2Rpc3Bvc2UpOiBQcm90ZWN0IHRoZSBkaXNwb3NlCisJbWV0aG9kIGZyb20gYmVpbmcgY2FsbGVkIG11bHRpcGxlIHRpbWVzLgorCisyMDA2LTAxLTE5ICBSb2JlcnQgTWNRdWVlbiAgPHJvYm90MTAxQGRlYmlhbi5vcmc+CisKKwkqIGdsaWIvZGJ1cy1iaW5kaW5nLXRvb2wtZ2xpYi5jOiBQYXRjaCBmcm9tIFJvYiBUYXlsb3IKKwk8cm9iLnRheWxvckBjb2xsYWJvcmEuY28udWs+IHRvIGFkZCBzdXBwb3J0IGZvciBnZW5lcmF0aW5nIGJpbmRpbmdzCisJdG8gYXJyYXlzIHRoYXQgYXJlIHJlcHJlc2VudGVkIGFzIEdQdHJBcnJheXMgcmF0aGVyIHRoYW4gR0FycmF5cyAoaWUKKwlzaXplLXZhcmlhYmxlIHRoaW5ncywgc3VjaCBhcyBzdHJpbmdzLCBvYmplY3RzLCBzdHJ1Y3RzLCBldGMpLgorCisyMDA2LTAxLTA1ICBSb2JlcnQgTWNRdWVlbiAgPHJvYm90MTAxQGRlYmlhbi5vcmc+CisKKwkqIGRidXMvZGJ1cy1nbGliLmgsIGdsaWIvZGJ1cy1ncHJveHkuYzogUGF0Y2ggZnJvbSBSaWNhcmRvIEtla2tpCisJPHJpY2FyZG8ua2Vra2lAbW92aWFsLmZpPiB0byBtYWtlIGl0IHBvc3NpYmxlIHRvIGluaGVyaXQgZnJvbQorCURCdXNHUHJveHksIGJ5IHNwbGl0dGluZyB0aGUgREJ1c0dQcm94eSBzdHJ1Y3QgaW50byBhIHB1YmxpYyBwYXJ0IGFuZAorCWEgcHJpdmF0ZSBwYXJ0LCBhbmQgbW92aW5nIHRoZSBzZXR0aW5nIG9mIHRoZSBEQnVzR1Byb3h5TWFuYWdlciBpbnRvIGEKKwljb25uZWN0aW9uIHByb3BlcnR5LCBhbGxvd2luZyBwcm9wZXIgR09iamVjdCBjb25zdHJ1Y3Rpb24uCisKKzIwMDYtMDEtMDUgIFJvYmVydCBNY1F1ZWVuICA8cm9ib3QxMDFAZGViaWFuLm9yZz4KKworCSogZ2xpYi9kYnVzLWJpbmRpbmctdG9vbC1nbGliLmM6IFBhdGNoIGZyb20gUmljYXJkbyBLZWtraQorCTxyaWNhcmRvLmtla2tpQG1vdmlhbC5maT4gdG8gbWFrZSBkYnVzLWJpbmRpbmctdG9vbCBoZWVkIEMgc3ltYm9sIG5hbWUKKwlhbm5vdGF0aW9ucyB3aGVuIGdlbmVyYXRpbmcgZ2xpYiBjbGllbnQgYmluZGluZ3MuCisKKzIwMDUtMTItMTkgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLXNoYXJlZC5oOiBDYWxsIGl0IHNoYXJlZCBjb25zdGFudHMgaW5zdGVhZCBvZiBzaGFyZWQgbWFjcm9zCisKKwkqIGRidXMvZGJ1cy1wcm90b2NvbC5oOiBhZGQgRE94eWdlbiBtYXJrdXAgdG8gcXVpZXQgd2FybmluZ3MKKworMjAwNS0xMi0xOSBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtc2hhcmVkLmg6IGFkZCBET3h5Z2VuIG1hcmt1cCB0byBxdWlldCB3YXJuaW5ncworCisyMDA1LTEyLTE5IEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+IAorCisJKiBkYnVzL2RidXMtbWFjcm9zLmg6IGNvcnJlY3QgRE94eWdlbiBlbmQgb2Ygc2VjdGlvbiAocy99QC9AfSkKKworMjAwNS0xMi0xOSAgUm9zcyBCdXJ0b24gIDxyb3NzQG9wZW5lZGhhbmQuY29tPgorCisJKiBkb2MvZGJ1cy10dXRvcmlhbC54bWw6CisJRG9jdW1lbnQgdGhlIEdsaWIgY2xpZW50LXNpZGUgYmluZGluZ3MsIGFuZCBsaXN0IGFsbCBwb3NzaWJsZSBhbm5vdGF0aW9ucy4KKworMjAwNS0xMi0xOSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9idXMuYyAoZGJ1c19idXNfcmVsZWFzZV9uYW1lKTogQWRkIGRvY3VtZW50YXRpb24KKworMjAwNS0xMi0wNiAgUm9iZXJ0IE1jUXVlZW4gIDxyb2JvdDEwMUBkZWJpYW4ub3JnPgorCisJKiBweXRob24vc2VydmljZS5weTogcy9zdWNlc3NmdWwvc3VjY2Vzc2Z1bC8gc28gd2UncmUgYWxsb2NhdGluZyB0bworCWFuZCByZWFkaW5nIGZyb20gdGhlIHNhbWUgdmFyaWFibGUuIE9vcHMuCisKKzIwMDUtMTEtMzAgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIFJlbGVhc2VkIDAuNjAKKworMjAwNS0xMS0zMCAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogdGVzdC9xdC9NYWtlZmlsZS5hbTogYnVpbGQgZnJvbSBzcmNkaXIKKworCSogcXQvcXRjb25uZWN0aW9uLmNwcCAocmVxdWVzdE5hbWUpOiBDaGFuZ2VkIFBST0hJQklUX1JFUExBQ0UgdG8gQUxMT1dfUkVQTEFDRQorCU5vdGUgLSB0aGlzIGNvZGUgaXMgd3JvbmcgYW5kIG5lZWRzIHRvIGJlIGZpeGVkIGJ5IHRoZSBRdCBiaW5kaW5nCisJZGV2ZWxvcGVycy4gIFRoZSBmbGFncyBzaG91bGQgYmUgdHJlYXRlZCBhcyBiaXRmaWVsZHMgYW5kIG5vdCBlbnVtcy4KKworCSogcXQvcXRjb25uZWN0aW9uLmg6IENoYW5nZSBQcm9oaWJpdFJlcGxhY2UgdG8gQWxsb3dSZXBsYWNlCisKKzIwMDUtMTEtMzAgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1saXN0LmMgKF9kYnVzX2xpc3RfaW5zZXJ0X2FmdGVyX2xpbmssIF9kYnVzX2xpc3RfaW5zZXJ0X2FmdGVyLCAKKwkgIGxpbmtfYWZ0ZXIpOiByZW1vdmUgI2lmZGVmIERCVVNfQlVJTERfVEVTVFMgc2luY2Ugd2UgdXNlIHRoZXNlIG1ldGhvZHMgCisJICBpbiBwcm9kdWN0aW9uIGNvZGUKKworMjAwNS0xMS0zMCAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYyAoZGJ1c19jb25uZWN0aW9uX3JlYWRfd3JpdGUpOiBBZGQgbmV3CisJbWV0aG9kIGZvciBnZXR0aW5nIG1lc3NhZ2VzIG9mZiB0aGUgYnVzIGluIHRoZSBhYnNlbmNlIG9mIGEKKwltYWlubG9vcC4gIFRoaXMgbWV0aG9kIGlzIG11Y2ggbGlrZSAKKwlkYnVzX2Nvbm5lY3Rpb25fcmVhZF93cml0ZV9kaXNwYXRjaCBleGNlcHQgaXQgZG9lcyBub3QgZGlzcGF0Y2gKKwl0aGUgbWVzc2FnZXMgdG8gYSByZWdpc3RlcmVkIGZpbHRlciBmdW5jdGlvbi4gIEluc3RlYWQgaXQKKwlhbGxvd3MgYSBkZXZlbG9wZXIgdG8gcHJvY2VzcyBtZXNzYWdlcyBieSBkaXJlY3RseSBwb3BwaW5nCisJdGhlbSBvZmYgdGhlIGJ1cy4KKworMjAwNS0xMS0zMCAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogYnVzL2Rlc2t0b3AtZmlsZS5jIChwYXJzZV9rZXlfdmFsdWUpOiBJZ25vcmUgbG9jYWxlcyBhbGxvd2luZyAKKwl0aGUgcGFyc2VyIHRvIGNvbnRpbnVlIGluc3RlYWQgb2YgcmV0dXJuaW5nIGVycm9yCisJKGJ1c19kZXNrdG9wX2ZpbGVfbG9hZCk6IERvIG5vdCBmcmVlIHBhcnNlciBkYXRhIHdoZW4KKwlwYXJzZV9zZWN0aW9uX3N0YXJ0IG9yIHBhcnNlX2tleV92YWx1ZSBmYWlscyBiZWNhdXNlIGl0IHdhcyAKKwlhbHJlYWR5IGZyZWVkIGJ5IHBhcnNlcl9mcmVlIChwYXRjaCBmcm9tIENhcmxvcyBHYXJjaWEgQ2FtcG9zICAKKwk8Y2FybG9zZ2MgYXQgZ25vbWUub3JnPikKKworMjAwNS0xMS0zMCAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLWF1dGguYywgZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYywgZGJ1cy9kYnVzLWtleXJpbmcuYywKKwlkYnVzL2RidXMtc2VydmVyLWRlYnVnLXBpcGUuYywgZ2xpYi9kYnVzLWJpbmRpbmctdG9vbC1nbGliLmMKKwlnbGliL2RidXMtZ2xpYi10b29sLmMsIGdsaWIvZGJ1cy1ncGFyc2VyLmMsIGdsaWIvZGJ1cy1ncHJveHkuYworCXRlc3QvdGVzdC1zZWdmYXVsdC5jLCB0ZXN0L3Rlc3QtdXRpbHMuYywKKwl0ZXN0L2dsaWIvdGVzdC1kYnVzLWdsaWIuYywgdG9vbHMvZGJ1cy1jbGVhbnVwLXNvY2tldHMuYworCXRvb2xzL2RidXMtbGF1bmNoLmMsIHRvb2xzL2RidXMtdHJlZS12aWV3LmMsIHRvb2xzL2RidXMtdmlld2VyLmM6CisJVmFyaW91cyBjbGVhbnVwIG9mIGRlYWQgY29kZSBhbmQgY29tcGlsZXIgd2FybmluZ3MgKHBhdGNoIGZyb20KKwlLamFydGFuIE1hcmFhcyA8a21hcmFhcyBhdCBnbm9tZS5vcmc+KSAKKworMjAwNS0xMS0zMCAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogZ2xpYi9kYnVzLWdtYWluLmMgKGNvbm5lY3Rpb25fc2V0dXBfYWRkX3dhdGNoKTogcGx1Z2dlZCBhIGxlYWsKKwkocGF0Y2ggZnJvbSBDYXJsb3MgR2FybmFjaG8gUGFycm8gPGNhcmxvc2cgYXQgZ25vbWUub3JnPgorCisyMDA1LTExLTI3ICBSb2JlcnQgTWNRdWVlbiAgPHJvYm90MTAxQGRlYmlhbi5vcmc+CisKKwkqIHB5dGhvbi9kYnVzX2JpbmRpbmdzLnB5eDogUmVwYWlyIG15IHByZXZpb3VzIGNvbW1pdCB3aGljaCByZXZlcnRlZAorCXBhcnQgb2YgdGhlIHByZWNlZGluZyBvbmUuIE9vcHMuIE1lcmdlIHBhdGNoIGJ5IEpvaGFuIEhlZGJlcmcKKwk8am9oYW4uaGVkYmVyZ0Bub2tpYS5jb20+IHRvIGZpeCBtYXJzaGFsbGluZyBvZiAxNi1iaXQgaW50ZWdlciB2YWx1ZXMKKwlvbiBiaWctZW5kaWFuIHBsYXRmb3Jtcy4KKworCSogdGVzdC9weXRob24vdGVzdC1jbGllbnQucHk6IEFkZCBzb21lIDE2LWJpdCBpbnRlZ2VycyB0byB0aGUgdGVzdAorCXZhbHVlcy4KKworMjAwNS0xMS0yNyAgQ2FybG9zIEdhcmNpYSBDYW1wb3MgIDxjYXJsb3NnY0Bnbm9tZS5vcmc+CisKKwkqIGdsaWIvZGJ1cy1nb2JqZWN0LmM6IEFwcGVuZCBhIEdWYWx1ZSBpbnN0ZWFkIG9mIGEgYmFzaWMgdHlwZSBpbgorCW1ldGhvZCByZXR1cm4gbWVzc2FnZSBmb3IgcHJvcGVydHkgZ2V0dGVycworCisyMDA1LTExLTI3ICBSb2JlcnQgTWNRdWVlbiAgPHJvYm90MTAxQGRlYmlhbi5vcmc+CisKKwkqIHB5dGhvbi9kYnVzX2JpbmRpbmdzLnB5eDogRml4IGEgYnVnIHdoZXJlIGRvaW5nIGEgc3RyaWN0IGFwcGVuZAorCXdpdGggdHlwZSB2IG9mIGFuIGluc3RhbmNlIG9mIGRidXMuVmFyaWFudChmb28sIHR5cGU9J3gnKSBjYXVzZWQKKwlpdCB0byBiZSBib3hlZCB0d2ljZSBiZWZvcmUgc2VuZGluZyBvdmVyIHRoZSBidXMuCisKKwkqIHB5dGhvbi9kYnVzX2JpbmRpbmdzLnB5eCwgcHl0aG9uL3NlcnZpY2UucHksCisJdGVzdC9weXRob24vdGVzdC1jbGllbnQucHk6IFVwZGF0ZSB0aGUgY29uc3RhbnRzIGZvciB0aGUgbmV3CisJcmVxdWVzdF9uYW1lIGZsYWdzLCBhbmQgdXBkYXRlIGNvbW1lbnRzL3Rlc3QgY2FzZXMgbm93IHRoYXQgcXVldWVpbmcKKwlpcyB0aGUgZGVmYXVsdCBhY3Rpb24uCisKKzIwMDUtMTEtMjIgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjoKKwktIENoYW5nZSB2ZXJzaW9uIHRvIDAuNjAgZm9yIGltcGVuZGluZyByZWxlYXNlCisJLSB1cHBlZCB0aGUgc29uYW1lcyBiZWNhdXNlIG9mIEFCSSBhbmQgQVBJIGJyZWFrYWdlCisKKzIwMDUtMTEtMjIgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogQWRkIHRlc3QvbmFtZS10ZXN0L01ha2VmaWxlIHRvIHRoZSBnZW5lcmF0ZWQKKwlNYWtlZmlsZSBsaXN0CisKKwkqIGRidXMvZGJ1cy1zaGFyZWQuaCAoI2RlZmluZSBEQlVTX05BTUVfRkxBR19BTExPV19SRVBMQUNFTUVOVCk6CisJTmV3IGZsYWcgd2hpY2ggcmVwbGFjZXMgREJVU19OQU1FX0ZMQUdfUFJPSElCSVRfUkVQTEFDRU1FTlQKKwkoI2RlZmluZSBEQlVTX05BTUVfRkxBR19ET19OT1RfUVVFVUUpOiBOZXcgZmxhZyBmb3Igc3BlY2lmeWluZworCW5vdCB0byBxdWV1ZSBhbiBvd2VyIGlmIGl0IGNhbid0IGJlIHRoZSBwcmltYXJ5IG93bmVyCisKKwkqIGJ1cy9idXMuaDogQWRkIG5ldyBpbnRlcm5hbCBCdXNPd25lciBzdHJ1Y3QKKworCSogYnVzL2RyaXZlci5jIChidXNfZHJpdmVyX2hhbmRsZV9oZWxsbyk6IFNlbmQgZmxhZ3MgKDAgZm9yIGRlZmF1bHQpCisJdG8gYnVzX3JlZ2lzdHJ5X2Vuc3VyZSBhbmQgZG9uJ3Qgc2V0IHRoZSBwcm9oaWJpdF9yZXBsYWNlbWVudCBmbGFnCisJc2luY2UgdGhleSBhcmUgbm93IHNldCBwZXIgQnVzT3duZXIgYW5kIG5vdCBwZXIgbmFtZS4KKwkoYnVzX2RyaXZlcl9oYW5kbGVfbGlzdF9xdWV1ZWRfb3duZXJzKTogYnVzIG1ldGhvZCAoTGlzdFF1ZXVlZE93bmVycykgCisJdGhhdCByZXR1cm5zIHRoZSBsaXN0IG9mIGNvbm5lY3Rpb25zIGluIGEgbmFtZSdzIGNvbm5lY3Rpb24gcXVldWUKKwkKKwkqIGJ1cy9zZXJ2aWNlcy5jIChzdHJ1Y3QgQnVzU2VydmljZSk6IHJlbW92ZSBwcm9oaWJpdF9yZXBsYWNlbWVudCBmaWVsZAorCShzdHJ1Y3QgQnVzT3duZXIpOiBuZXcgc3RydWN0IGZvciBrZWVwaW5nIHRyYWNrIG9mIHF1ZXVlZCBjb25uZWN0aW9ucworCWFuZCB0aGVpciBhc3NvY2lhdGVkIGZsYWdzIGZvciB0aGUgcXVldWUKKwkoc3RydWN0IEJ1c1JlZ2lzdHJ5KTogYWRkIGEgQnVzT3duZXIgbWVtb3J5IHBvb2wKKwkoYnVzX3JlZ2lzdHJ5X25ldyk6IGluaXRpYWxpemUgdGhlIEJ1c093bmVyIG1lbW9yeSBwb29sCisJKGJ1c19yZWdpc3RyeV91bnJlZik6IGZyZWUgdGhlIEJ1c093bmVyIG1lbW9yeSBwb29sCisJKF9idXNfc2VydmljZV9maW5kX293bmVyX2xpbmspOiBuZXcgaW50ZXJuYWwgbWV0aG9kIGZvcgorCXNlYXJjaGluZyB0aGUgcXVldWUgZm9yIGEgc3BlY2lmaWMgY29ubmVjdGlvbgorCShidXNfb3duZXJfc2V0X2ZsYWdzKTogbmV3IG1ldGhvZCBmb3IgYWRkaW5nIHNldHRpbmcgdGhlIGZsYWdzIG9uIGEKKwlidXMgb3duZXIKKwkoYnVzX293bmVyX25ldyk6IG5ldyBtZXRob2QgdGhhdCBjcmVhdGVzIGEgQnVzT3duZXIgb2JqZWN0IGZyb20gdGhlCisJcG9vbCBhbmQgc2V0cyBpdHMgZmxhZ3MKKwkoYnVzX293bmVyX3JlZiwgYnVzX293bmVyX3VucmVmKTogcmVmIGNvdW50aW5nIGZvciBCdXNPd25lciBvYmplY3RzCisJKGJ1c19yZWdpc3RyeV9lbnN1cmUpOiBBZGQgdGhlIGZsYWdzIHBhcmFtZXRlcgorCShidXNfcmVnaXN0cnlfYWNxdWlyZV9zZXJ2aWNlKTogU3dpdGNoIGZyb20gdXNpbmcgcmF3IGNvbm5lY3Rpb25zIHRvCisJdXNpbmcgdGhlIEJ1c093bmVyIHN0cnVjdAorCUFkZCBuZXcgc3RhdGUgbWFjaGluZSBmb3IgZGVhbGluZyB3aXRoIHRoZSBuZXcgc2V0IG9mIGZsYWdzCisJKGJ1c19yZWdpc3RyeV9zZXRfc2VydmljZV9jb250ZXh0X3RhYmxlLCBzdHJ1Y3QgT3duZXJzaGlwQ2FuY2VsRGF0YSwgCisJY2FuY2VsX293bmVyc2hpcCwgZnJlZV9vd25lcnNoaXBfY2FuY2VsX2RhdGEsIAorCWFkZF9jYW5jZWxfb3duZXJzaGlwX3RvX3RyYW5zYWN0aW9uLCBzdHJ1Y3QgT3duZXJzaGlwUmVzdG9yZURhdGEsIAorCXJlc3RvcmVfb3duZXJzaGlwLCBmcmVlX293bmVyc2hpcF9yZXN0b3JlX2RhdGEsIAorCWFkZF9yZXN0b3JlX293bmVyc2hpcF90b190cmFuc2FjdGlvbik6IFN3aXRjaCB0byB1c2luZyBCdXNPd25lciAKKwlpbnN0ZWFkIG9mIHJhdyBjb25uZWN0aW9ucworCShidXNfc2VydmljZV9hZGRfb3duZXIpOiBBZGQgZmxhZ3MgcGFyYW1ldGVyCisJU3dpdGNoIHRvIHVzaW5nIEJ1c093bmVyIGluc3RlYWQgb2YgcmF3IGNvbm5lY3Rpb25zCisJQWRkIHN0YXRlIG1hY2hpbmUgZm9yIGRlYWxpbmcgd2l0aCB0aGUgbmV3IHNldCBvZiBmbGFncworCShidXNfc2VydmljZV9zd2FwX293bmVyKTogU3dhcHMgdGhlIGZpcnN0IGFuZCBzZWNvbmQgb3duZXJzIGluIHRoZQorCXF1ZXVlLiAgVXNlZCB0byBtYWtlIHN1cmUgcHJvcGVyIHNpZ25hbHMgYXJlIHNlbnQgd2hlbiBhIHNlcnZpY2UgbG9vc2VzIAorCW9yIGdhaW5zIHByaW1hcnkgb3duZXJzaGlwLiAgV2UgbmV2ZXIgaW5zZXJ0IGFuIG93bmVyIGF0IHRoZSB0b3Agb2YgdGhlCisJcXVldWUuICBJbnN0ZWFkIHdlIGluc2VydCBpdCBpbiB0aGUgc2Vjb25kIHBvc2l0aW9uIGFuZCB0aGVuIHN3YXAuCisJKGJ1c19zZXJ2aWNlX3JlbW92ZV9vd25lcik6IFJlbW92ZSB0aGUgb3duZXIgZnJvbSB0aGUgcXVldWUgc2VuZGluZworCW91dCB0aGUgTmFtZUxvc3QgYW5kIE5hbWVPd25lckNoYW5nZWQgc2lnbmFscyBpZiB0aGUgd2Ugd2VyZSB0aGUgCisJcHJpbWFyeSBvd25lcgorCShidXNfc2VydmljZV9nZXRfcHJpbWFyeV9vd25lcnNfY29ubmVjdGlvbik6IE5ldyBtZXRob2QgdGhhdCBleHRyYWN0cworCXRoZSBjb25uZWN0aW9uIGZyb20gdGhlIHByaW1hcnkgb3duZXIKKwkoYnVzX3NlcnZpY2VfZ2V0X3ByaW1hcnlfb3duZXIpOiBSZXR1cm5zIHRoZSBCdXNPd25lciBpbnN0ZWFkIG9mIHRoZSAKKwljb25uZWN0aW9uCisJKGJ1c19zZXJ2aWNlX2dldF9hbGxvd19yZXBsYWNlbWVudCk6IENoYW5nZWQgZnJvbSB0aGUgb2xkIAorCWJ1c19zZXJ2aWNlX2dldF9wcm9oaWJpdF9yZXBsYWNlbWVudCBtZXRob2QuICBDaGVja3MgdGhlIGZsYWdzIG9mIHRoZSAKKwlwcmltYXJ5IG93bmVyIGFuZCByZXR1cm5zIGlmIGl0IGNhbiBiZSByZXBsYWNlZCBvciBub3QKKwkoYnVzX3NlcnZpY2Vfc2V0X3Byb2hpYml0X3JlcGxhY2VtZW50KTogcmVtb3ZlZAorCShidXNfc2VydmljZV9oYXNfb3duZXIpOiByZXR1cm5zIFRSVUUgaWYgYW5kIG93bmVyIHdpdGgKKwl0aGUgc3BlY2lmaWVkIGNvbm5lY3Rpb24gZXhpc3RzIGluIHRoZSBxdWV1ZQorCQorCSogZGJ1cy9kYnVzLWJ1cy5jIChkYnVzX2J1c19jb25uZWN0aW9uX2dldF91bmlxdWVfbmFtZSk6IE5ldyBoZWxwZXIKKwltZXRob2QgdGhhdCBvbmx5IGNvbXBpbGVzIGlmIHRlc3RzIGFyZSBlbmFibGVkLiAgQWxsb3dzIHVzIHRvIGdldCB0aGUgCisJdW5pcXVlIG5hbWUgb2YgYSBjb25uZWN0aW9uIHNvIHdlIGNhbiBjaGVjayBpdCBhZ2FpbnN0IHRoZSBxdWV1ZSB3aGVuCisJZG9pbmcgcmVncmVzc2lvbiB0ZXN0cworCisJKiBidXMvYWN0aXZhdGlvbi5jIChidXNfYWN0aXZhdGlvbl9zZW5kX3BlbmRpbmdfYXV0b19hY3RpdmF0ZSksCisJYnVzL2Rpc3BhdGNoLmMgKGJ1c19kaXNwYXRjaCksICAKKwlidXMvZHJpdmVyLmMgKGJ1c19kcml2ZXJfaGFuZGxlX2dldF9zZXJ2aWNlX293bmVyLCAKKwlidXNfZHJpdmVyX2hhbmRsZV9nZXRfY29ubmVjdGlvbl91bml4X3VzZXIsIAorCWJ1c19kcml2ZXJfaGFuZGxlX2dldF9jb25uZWN0aW9uX3VuaXhfcHJvY2Vzc19pZCwKKwlidXNfZHJpdmVyX2hhbmRsZV9nZXRfY29ubmVjdGlvbl9zZWxpbnV4X3NlY3VyaXR5X2NvbnRleHQpLAorCWJ1cy9zaWduYWxzLmMgKGNvbm5lY3Rpb25faXNfcHJpbWFyeV9vd25lcik6IAorCXVzZSBidXNfc2VydmljZV9nZXRfcHJpbWFyeV9vd25lcnNfY29ubmVjdGlvbiBpbnN0ZWFkIG9mCisJYnVzX3NlcnZpY2VfZ2V0X3ByaW1hcnlfb3duZXIKKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYyAoX2RidXNfY29ubmVjdF91bml4X3NvY2tldCwgCisJX2RidXNfbGlzdGVuX3VuaXhfc29ja2V0KTogQ2FsY3VsYXRlIHRoZSBsZW5ndGggb2YgdGhlIHNvY2tldAorCXBhdGggYW5kIHVzZSB0aGF0IGluc3RlYWQgb2YgdXNpbmcgYSBmaXhlZCBsZW5ndGggd2hpY2ggd2FzCisJY2F1c2luZyBzb2NrZXQgbmFtZXMgdG8gY29udGFpbiBtYW55IHRyYWlsaW5nIE51bCBieXRlcy4KKworCSogZGJ1cy9kYnVzLWdsaWItbG93bGV2ZWwuaCwgZ2xpYi9kYnVzLWdvYmplY3QuYworCShkYnVzX2dfbWV0aG9kX2dldF9zZW5kZXIpOiBOZXcgbWV0aG9kIGZvciBleHRyYWN0aW5nIHRoZSBzZW5kZXIgCisJZnJvbSBhIERCdXNHTWV0aG9kSW52b2NhdGlvbgorCShkYnVzX2dfbWV0aG9kX3JldHVybl9nZXRfcmVwbHkpOiBjaGFuZ2VkIG5hbWUgdG8gCisJZGJ1c19nX21ldGhvZF9nZXRfcmVwbHkKKwkoZGJ1c19nX21ldGhvZF9yZXR1cm5fc2VuZF9yZXBseSk6IGNoYW5nZWQgbmFtZSB0bworCWRidXNfZ19tZXRob2Rfc2VuZCByZXBseQorCisJKiBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnhtbDogTmV3IGRvY3MgdGhhdCBkZXNjcmliZSBob3cgdGhlIG5ldworCXF1ZXVlaW5nIHN5c3RlbSB3b3JrcyBhbmQgdGFsa3MgYWJvdXQgdGhlIGNoYW5nZXMgdG8gdGhlIGhvdworCXdlIHNwZWNpZnkgc29ja2V0IG5hbWVzCisKKwkqIGdsaWIvZXhhbXBsZXMvZXhhbXBsZS1zZXJ2aWNlLmMsIAorCWdsaWIvZXhhbXBsZXMvZXhhbXBsZS1zaWduYWwtZW1pdHRlci5jLAorCWdsaWIvZXhhbXBsZXMvc3RhdGVtYWNoaW5lL3N0YXRlbWFjaGluZS1zZXJ2ZXIuYzoKKwlDaGFuZ2VkIHRoZSBSZXF1ZXN0TmFtZSBmbGFncyB0byB0aGUgbmV3IHN5c3RlbQorCisJKiB0ZXN0L25hbWUtdGVzdC8gKHRlc3QtbmFtZXMuYywgcnVuLXRlc3Quc2gsIE1ha2VmaWxlLmFtKTogTmV3CisJcmVncmVzc2lvbiB0ZXN0IHN1aXRlIGZvciB0ZXN0aW5nIHZhcmlvdXMgc3RhdGVzIG9mIHRoZSBuZXcKKwlxdWV1ZWluZyBzeXN0ZW0KKwkKKzIwMDUtMTEtMTUgIFJvYmVydCBNY1F1ZWVuICA8cm9ib3QxMDFAZGViaWFuLm9yZz4KKworCSogZGJ1cy9kYnVzLWdsaWItbG93bGV2ZWwuaCwgZ2xpYi9kYnVzLWdvYmplY3QuYzogUGF0Y2ggZnJvbSBSb2IKKwlUYXlsb3IgdG8gYWRkIHR3byBtZXRob2RzLCBkYnVzX2dfbWV0aG9kX3JldHVybl9nZXRfcmVwbHkgYW5kCisJZGJ1c19nX21ldGhvZF9yZXR1cm5fc2VuZF9yZXBseSwgdG8gYWxsb3cgeW91IHRvIGdldCB0aGUgcmVwbHkKKwltZXNzYWdlIGZyb20gYSBEQnVzR01ldGhvZEludm9jYXRpb24sIGFwcGVuZCBhcmJpdHJhcnkgc3R1ZmYgdG8gaXQsCisJYW5kIHNlbmQgaXQuIFRoZSBHTGliIGJpbmRpbmdzIGNhbid0IG1hcnNoYWwgYSByZXR1cm4gdmFsdWUgb2YKKwlzb21ldGhpbmcgbGlrZSBhKHMpIGlmIHRoZSBhcnJheSBpcyBlbXB0eSAtIHVsdGltYXRlbHkgdGhleSBzaG91bGQgYmUKKwltYWRlIHRvIGhlZWQgdGhlIHNpZ25hdHVyZSBvZiB0aGUgb3V0IGFyZ3VtZW50cyBhcyB0aGUgUHl0aG9uIGJpbmRpbmdzCisJbm93IGNhbiwgYnV0IHRoaXMgaXMgYSB3b3JrYWJsZSBpbnRlcmltIHNvbHV0aW9uIHdoaWNoIG1pZ2h0IGhhdmUKKwlvdGhlciBhcHBsaWNhdGlvbnMuCisKKzIwMDUtMTEtMTUgIFJvYmVydCBNY1F1ZWVuICA8cm9ib3QxMDFAZGViaWFuLm9yZz4KKworCSogYnVzL2RyaXZlci5jLCBidXMvc2VydmljZXMuYywgYnVzL3NlcnZpY2VzLmg6IEFkZCBhIFJlbGVhc2VOYW1lCisJbWV0aG9kIHRvIG9yZy5mcmVlZGVza3RvcC5EQnVzIHRvIHJlbGVhc2UgYSBidXMgbmFtZSBvciBnaXZlIHVwCisJd2FpdGluZyBpbiB0aGUgcXVldWUgZm9yIGl0LgorCisJKiBkYnVzL2RidXMtYnVzLmMsIGRidXMvZGJ1cy1idXMuaCwgZGJ1cy9kYnVzLXNoYXJlZC5oOiBBZGQgYQorCWRidXNfYnVzX3JlbGVhc2VfbmFtZSBtZXRob2QgdG8gc2VuZCB0aGUgUmVsZWFzZU5hbWUgbWV0aG9kIGNhbGxzLgorCUFkZCBjb25zdGFudHMgZm9yIHRoZSByZXR1cm4gdmFsdWVzIHRvIGRidXMvZGJ1cy1zaGFyZWQuaC4KKworCSogZG9jL2RidXMtc3BlY2lmaWNhdGlvbi54bWw6IERvY3VtZW50IHRoZSBuZXcgUmVsZWFzZU5hbWUgbWV0aG9kCisJaW4gdGhlIHNwZWNpZmljYXRpb24uCisKKwkqIHB5dGhvbi9kYnVzX2JpbmRpbmdzLnB5eDogQWRkIGEgbG93LWxldmVsIHB5dGhvbiBiaW5kaW5nIGZvciB0aGUKKwlyZWxlYXNlIG5hbWUgbWV0aG9kLgorCisJKiBweXRob24vZXhjZXB0aW9ucy5weSwgcHl0aG9uL3NlcnZpY2UucHk6IE1ha2UgZnJlZWluZyBCdXNOYW1lCisJb2JqZWN0cyByZWxlYXNlIHRoZSBuYW1lLiBBZGQgYSBOYW1lRXhpc3RzRXhjZXB0aW9uLCBhbmQgZml4IGEKKwlidWcgd2l0aCBjcmVhdGluZyBVbmtub3duTWV0aG9kRXhjZXB0aW9uLgorCisJKiB0ZXN0L3B5dGhvbi90ZXN0LWNsaWVudC5weTogQWRkIHRlc3RzIGZvciBmcmVlaW5nIEJ1c05hbWUKKwlvYmplY3RzIGNhdXNpbmcgbmFtZXMgdG8gYmUgcmVsZWFzZWQuCisKKzIwMDUtMTEtMTQgIFJvYmVydCBNY1F1ZWVuICA8cm9ib3QxMDFAZGViaWFuLm9yZz4KKworCSogcHl0aG9uL3NlcnZpY2UucHk6IEluY2x1ZGUgdGhlIHRyYWNlYmFjayBpbiB0aGUgZXJyb3IgcmVwbHkgd2hlbiB3ZQorCXNlbmQgYW4gZXhjZXB0aW9uIG92ZXIgdGhlIGJ1cy4gX0JFU1RfIF9QQVRDSF8gX0VWRVJfCisKKzIwMDUtMTEtMTQgIERhdmlkIFpldXRoZW4gIDxkYXZpZHpAcmVkaGF0LmNvbT4KKworCVBhdGNoIGZyb20gVGltbyBIb2VuaWcgPHRob2VuaWdAc3VzZS5kZT4uCisKKwkqIGJ1cy9idXMuYzogSSd2ZSByZWNlbnRseSBpbnZlc3RpZ2F0ZWQgd2h5IHRoZSBhdXRvbWF0aWMgcmVsb2FkCisJb2YgY29uZmlndXJhdGlvbiBmaWxlcyBkb2VzIG5vdCB3b3JrIGFzIGV4cGVjdGVkLgorCisJQ3VycmVudGx5LCByZWxvYWRpbmcgY29uZmlndXJhdGlvbiBmaWxlcyBkb2VzIG9ubHkgd29yayB3aGVuCisJcnVubmluZyBkYnVzLWRhZW1vbiB3aXRoIC0tbm9kYWVtb24uICBJZiB3ZSBhcmUgcnVubmluZyBhcyBkYWVtb24KKwl3ZSdyZSBoaXR0aW5nIGEgZG5vdGlmeSBidWcgb25jZSB3ZSBmb3JrIHRoZSBwcm9jZXNzLgorCisJV2UncmUgaW5pdGlhbGl6aW5nIHRoZSBkbm90aWZ5IGZkcyBiZWZvcmUgY2FsbGluZyBmb3JrKCkuICBPbmNlCisJdGhlIGNoaWxkIHByb2Nlc3MgZm9ya2VkIGl0IGRvZXMgc3RpbGwgaGF2ZSB0aGUgZmRzIChhbmQgdGhleQorCXN0aWxsIHNob3cgdXAgaW4gL3Byb2MvYHBpZG9mIGRidXMtZGFlbW9uYC9mZC8pIGJ1dCB3ZSdyZSBub3QKKwlnZXR0aW5nIFNJR0lPIGFzIGNoYW5nZXMgYXJlIG1hZGUgdG8gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZXMuCisKKwlUaGUgYXR0YWNoZWQgcGF0Y2ggbW92ZXMgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBkbm90aWZ5IGZkcyB0bworCXByb2Nlc3NfY29uZmlnX3Bvc3Rpbml0KCkuICBUaGlzIGlzIHNhZmUgZm9yIGFsbCBjdXJyZW50IGNvZGUKKwlwYXRocyBhbmQgc29sdmVzIHRoZSBkbm90aWZ5IGRpc2Z1bmN0aW9uLiAgSWYgd2UncmUgcnVubmluZworCWRidXMtZGFlbW9uIGFzIGRhZW1vbiB0aGUgZmRzIGZvciBkbm90aWZ5IGFyZSBub3cgYmVpbmcKKwlpbml0aWFsaXplZCBhZnRlciBmb3JrKCkgZm9yIHRoZSBjaGlsZCBwcm9jZXNzLgorCisJKiBjb25maWd1cmUuaW46IFRoZSBjdXJyZW50IGNvbmZpZ3VyZS5pbiBjaGVjayBmb3IgZG5vdGlmeSBwcm9iZXMKKwkneCR0YXJnZXRfb3MnIGZvciBiZWluZyAneGxpbnV4LWdudScuICBJJ3ZlIGNoYW5nZWQgdGhlIGNoZWNrIHRvCisJbWF0Y2ggZm9yICd4bGludXgnLCB0b28uIEFkZGl0aW9uYWxseSBJIGhhdmUgYWRhcHRlZCB0aGUgY29uZmlndXJlCisJb3B0aW9uJ3Mgc3R5bGUgdG8gbWF0Y2ggd2l0aCB0aGUgb3RoZXJzLgorCisyMDA1LTExLTE0ICBSb2JlcnQgTWNRdWVlbiAgPHJvYm90MTAxQGRlYmlhbi5vcmc+CisKKwkqIHB5dGhvbi9kZWNvcmF0b3JzLnB5LCBweXRob24vc2VydmljZS5weTogQWRkIGEgbmV3IGFyZ3VtZW50IHRvIHRoZQorCWRidXMuc2VydmljZS5tZXRob2QgZGVjb3JhdG9yIGNhbGxlZCBzZW5kZXJfa2V5d29yZCwgd2hpY2ggaWYgc2V0LAorCXNwZWNpZmllcyB0aGUgbmFtZSBvZiBhbiBhcmd1bWVudCB3aGljaCB3aWxsIGJlIHByb3ZpZGVkIHRoZSBidXMKKwluYW1lIG9mIHRoZSBtZXRob2QgY2FsbGVyLgorCisJKiB0ZXN0L3B5dGhvbi90ZXN0LWNsaWVudC5weSwgdGVzdC9weXRob24vdGVzdC1zZXJ2aWNlLnB5OiBBZGQgYQorCW1ldGhvZCBhbmQgdGVzdCB0byBjaGVjayB0aGUgc2VuZGVyX2tleXdvcmQgZnVuY3Rpb25hbGl0eS4KKworMjAwNS0xMS0wNyAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogYnVzL2RyaXZlci5jIChidXNfZHJpdmVyX2hhbmRsZV9yZWxvYWRfY29uZmlnKTogTWFrZSBzdXJlIHdlIHNlbmQgYW4gCisJZW1wdHkgcmVwbHkgc28gYmxvY2tpbmcgY2FsbHMgZG9uJ3QgYmxvY2sgZm9yZXZlciAoUGF0Y2ggZnJvbSBTam9lcmQgCisJU2ltb25zIDxzam9lcmQgYXQgbHVvbi5uZXQ+KQorCisJKiBBVVRIT1JTOiBBZGQgUm9iZXJ0IE1jUXVlZW4gZm9yIGhpcyB3b3JrIG9uIHRoZSBQeXRob24KKwlCaW5kaW5ncyBhbmQgb3RoZXIgcGFydHMgb2YgRC1CdXMKKworMjAwNS0xMS0wNyAgUm9iZXJ0IE1jUXVlZW4gIDxyb2JvdDEwMUBkZWJpYW4ub3JnPgorCisJKiBweXRob24vZGVjb3JhdG9ycy5weTogQ2hhbmdlIGVtaXRfc2lnbmFsIGZ1bmN0aW9uIHRvIHVzZSB0aGUKKwlzaWduYXR1cmUgYW5ub3RhdGlvbiBvZiB0aGUgc2lnbmFsIHdoZW4gbWFyaHNhbGxpbmcgdGhlIGFyZ3VtZW50cyBmcm9tCisJdGhlIHNlcnZpY2UuIEZpeCBhIGJ1ZyB3aGVyZSB0aGUgY29kZSBjaGVja2luZyBzaWduYXR1cmUgbGVuZ3RoCisJYWdhaW5zdCBhcmd1bWVudCBsZW5ndGggcmVmZXJlbmNlZCB0aGUgd3JvbmcgdmFyaWFibGUuCisKKwkqIHB5dGhvbi9pbnRyb3NwZWN0X3BhcnNlci5weTogQXZvaWQgYWRkaW5nIHRoZSB0eXBlIHNpZ25hdHVyZSBvZgorCXNpZ25hbCBhcmd1bWVudHMgdG8gYW55IG1ldGhvZHMgd2hpY2ggb2NjdXIgYWZ0ZXIgdGhlbSBpbiB0aGUKKwlpbnRyb3NwZWN0aW9uIGRhdGEgKCEpIGJ5IG1ha2luZyB0aGUgcGFyc2VyIGEgbGl0dGxlIG1vcmUgY2FyZWZ1bAorCWFib3V0IGl0cyBjdXJyZW50IHN0YXRlLgorCisJKiBweXRob24vc2VydmljZS5weTogUmVtb3ZlIGRlYnVnIHByaW50cyBmcm9tIGxhc3QgY29tbWl0IChhZ2FpbiA6RCkuCisKKwkqIHRlc3QvcHl0aG9uL3Rlc3QtY2xpZW50LnB5LCB0ZXN0L3B5dGhvbi90ZXN0LXNlcnZpY2UucHk6IEFkZCB0ZXN0CisJc2lnbmFscyB3aXRoIHNpZ25hdHVyZSBkZWNvcmF0b3JzIHRvIHRlc3QgdGhlIHN0cmljdCBtYXJzaGFsbGluZyBjb2RlCisJZ2l2ZXMgZXJyb3JzIGF0IHRoZSByaWdodCB0aW1lLiBDb3VsZCBkbyB3aXRoIGNoZWNraW5nIHRoZSBzaWduYWxzCisJYWN0dWFsbHkgZ2V0IGVtaXR0ZWQgdG9vLCBnaXZlbiB0aGF0IHRoZSB0ZXN0IGRvZXMgbm90aGluZyB3aXRoCisJc2lnbmFscyBhdCB0aGUgbW9tZW50Li4uCisKKzIwMDUtMTEtMDcgIFJvYmVydCBNY1F1ZWVuICA8cm9ib3QxMDFAZGViaWFuLm9yZz4KKworCSogcHl0aG9uL19kYnVzLnB5OiBBZGQgV2Vha1JlZmVyZW5jZURpY3Rpb25hcnkgY2FjaGUgb2YgZGJ1cy5CdXMKKwlpbnN0YW5jZXMgdG8gc3RvcCBtYWRuZXNzIG9mIGNyZWF0aW5nIG5ldyBpbnN0YW5jZXMgcmVwcmVzZW50aW5nCisJdGhlIHNhbWUgYnVzIGNvbm5lY3Rpb24gYWxsIHRoZSB0aW1lLCByZW5kZXJpbmcgYW55IHRyYWNraW5nIG9mCisJbWF0Y2ggcnVsZXMgYW5kIGJ1cyBuYW1lcyBxdWl0ZSBtZWFuaW5nbGVzcy4gQ2F1Z2h0IGEgYnVnIHdoZXJlCisJdGhlIHByaXZhdGUgYXJndW1lbnQgdG8gU2Vzc2lvbkJ1cygpIGFuZCBmcmllbmRzIHdhcyBiZWluZyBwYXNzZWQKKwlpbiBhcyB1c2VfZGVmYXVsdF9tYWlubG9vcCBieSBtaXN0YWtlLiBTdGlsbCBzb21lIHByb2JsZW1zIHdpdGgKKwltdWx0aXBsZSBkYnVzX2JpbmRpbmcuQ29ubmVjdGlvbiBpbnN0YW5jZXMgcmVwcmVzZW50aW5nIHRoZSBzYW1lCisJbG93LWxldmVsIGNvbm5lY3Rpb24gKGVnIHdoZW4geW91IHVzZSBib3RoIFNlc3Npb25CdXMoKSBhbmQKKwlTdGFydGVyQnVzKCkgaW4gc2FtZSBwcm9jZXNzKSwgYnV0IGl0J3MgYSBsb3QgYmV0dGVyIG5vdyB0aGFuIGl0CisJd2FzLgorCisJKiBweXRob24vZGJ1c19iaW5kaW5ncy5weXg6IEFkZCBjb25zdGFudHMgd2l0aCB0aGUgcmV0dXJuIHZhbHVlcworCWZvciBidXNfcmVxdWVzdF9uYW1lKCkuCisKKwkqIHB5dGhvbi9zZXJ2aWNlLnB5OiBTdG9yZSBidXMgbmFtZSBpbnN0YW5jZXMgaW4gYSBwZXItZGJ1cy5CdXMgY2FjaGUKKwlhbmQgcmV0cmlldmUgdGhlIHNhbWUgaW5zdGFuY2VzIGZvciB0aGUgc2FtZSBuYW1lLCBzbyBkZWxldGlvbiBjYW4gYmUKKwlkb25lIHdpdGggcmVmY291bnRpbmcuIEFsc28gbm93IHRocm93cyBzb21lIGtpbmQgb2YgZXJyb3IgaWYgeW91CisJZG9uJ3QgYWN0dWFsbHkgZ2V0IHRoZSBuYW1lIHlvdSByZXF1ZXN0ZWQsIHVubGlrZSBwcmV2aW91c2x5Li4uCisKKwkqIHRlc3QvcHl0aG9uL3Rlc3QtY2xpZW50LnB5OiBBZGQgdGVzdHMgZm9yIGluc3RhbmNlIGNhY2hpbmcgb2YgYnVzZXMKKwlhbmQgYnVzIG5hbWUgb2JqZWN0cy4KKworMjAwNS0xMS0wNCAgUm9iZXJ0IE1jUXVlZW4gIDxyb2JvdDEwMUBkZWJpYW4ub3JnPgorCisJKiBweXRob24vZGJ1c19iaW5kaW5ncy5weXgsIHRlc3QvcHl0aG9uL3Rlc3QtY2xpZW50LnB5OiBGaXgKKwltYXJzaGFsbGluZyBvZiBib29sZWFuIHZhbHVlcy4gQWRkIHNvbWUgYm9vbGVhbnMgdG8gdGhlIHZhbHVlcyBpbgorCXRoZSB0ZXN0IGNsaWVudC4KKworCSogcHl0aG9uL2RlY29yYXRvcnMucHksIHB5dGhvbi9zZXJ2aWNlLnB5OiBBZGQgYW4gJ2FzeW5jX2NhbGxiYWNrcycKKwlhcmd1bWVudCB0byB0aGUgZGJ1cy5zZXJ2aWNlLm1ldGhvZCBkZWNvcmF0b3IsIHdoaWNoIGFsbG93cyB5b3UgdG8KKwluYW1lIGFyZ3VtZW50cyB0byB0YWtlIHR3byBjYWxsYmFjayBmdW5jdGlvbnMgZm9yIHJlcGx5aW5nIHdpdGgKKwlyZXR1cm4gdmFsdWVzIG9yIGFuIGV4Y2VwdGlvbi4KKworCSogdGVzdC9weXRob24vdGVzdC1jbGllbnQucHksIHRlc3QvcHl0aG9uL3Rlc3Qtc2VydmljZS5weTogQWRkIHRlc3QKKwljYXNlIHVzaW5nIGFzeW5jaHJvbm91cyBtZXRob2QgcmVwbHkgZnVuY3Rpb25zLCBib3RoIHJldHVybiB2YWx1ZXMgYW5kCisJZXJyb3JzLCBhbmQgZnJvbSB3aXRoaW4gYm90aCB0aGUgZnVuY3Rpb24gaXRzZWxmIGFuZCBmcm9tIGEgbWFpbmxvb3AKKwljYWxsYmFjay4KKworCSogcHl0aG9uL2RlY29yYXRvcnMucHksIHB5dGhvbi9zZXJ2aWNlLnB5OiBQZXJmb3JtIGNoZWNraW5nIHRoYXQgdGhlCisJbnVtYmVyIG9mIG1ldGhvZC9zaWduYWwgYXJndW1lbnRzIG1hdGNoZXMgdGhlIG51bWJlciBvZiB0eXBlcyBpbiB0aGUKKwlzaWduYXR1cmUgYXQgY2xhc3MgbG9hZGluZyB0aW1lLCBub3Qgd2hlbiB5b3UgZmlyc3QgaW50cm9zcGVjdCB0aGUKKwljbGFzcy4KKworCSogcHl0aG9uL3NlcnZpY2UucHk6IFJlbW92ZSBkZWJ1ZyBwcmludCBsZWZ0IGJ5IHRoZSBsYXN0IGNvbW1pdC4KKworMjAwNS0xMS0wMyAgUm9iZXJ0IE1jUXVlZW4gIDxyb2JvdDEwMUBkZWJpYW4ub3JnPgorCisJKiBweXRob24vc2VydmljZS5weTogSGVhdnkgcmVmYWN0b3Jpbmcgb2YgbWV0aG9kIGludm9jYXRpb24sIHdpdGgKKwlob3BlZnVsbHkgbm8gZWZmZWN0IG9uIGZ1bmN0aW9uYWxpdHkuIE51a2VkIF9kaXNwYXRjaF9kYnVzX21ldGhvZF9jYWxsCisJaW4gZmF2b3VyIG9mIGEgbmV3IF9tZXNzYWdlX2NiIHRoYXQgdXNlcyBzZXBlcmF0ZSBmdW5jdGlvbnMgZm9yCisJbG9va2luZyB1cCB0aGUgbWV0aG9kIHRvIGNhbGwsIG1hcnNoYWxsaW5nIHRoZSByZXR1cm4gdmFsdWVzLCBhbmQKKwlzZW5kaW5nIGV4Y2VwdGlvbnMgYXMgZXJyb3JzLCBhbmQgaXMgZWFzaWVyIHRvIGZvbGxvdyBhcyBhCisJY29uc2VxdWVuY2UuICBGaXhlcyBzb21lIGNvcm5lciBjYXNlcyBhYm91dCByZXR1cm5pbmcgdGhpbmdzIHRoYXQKKwlkb24ndCBtYXRjaCB5b3VyIGRlY2xhcmVkIG91dF9zaWduYXR1cmUsIGFsbG93cyBleGNlcHRpb25zIHRvIGRlZmluZQorCV9kYnVzX2Vycm9yX25hbWUgYW5kIGhhdmUgaXQgYmUgc2VudCBvdmVyIHRoZSBidXMgYXMgdGhlIGVycm9yIG5hbWUsCisJYW5kIHBhdmVzIHRoZSB3YXkgZm9yIGNvb2wgc3R1ZmYgbGlrZSBoZWVkaW5nIHRoZSBtZXNzYWdlIG5vIHJlcGx5CisJZmxhZywgYXN5bmNocm9ub3VzIG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMsIGluZm9ybWluZyB0aGUgbWV0aG9kIG9mIHRoZQorCXNlbmRlciwgYW5kIGluY2x1ZGluZyBiYWNrdHJhY2VzIGluIHRoZSBlcnJvciBtZXNzYWdlcy4KKworCSogdGVzdC9weXRob24vdGVzdC1jbGllbnQucHk6IENhdGNoIGFuZCBwcmludCBleGNlcHRpb25zIHRocm93biBpbiB0aGUKKwlhc3luYyBjYWxsYmFjayB0ZXN0cywgcmF0aGVyIHRoYW4gcGFzc2luZyB0aGVtIHRvIHRoZSBsb3ctbGV2ZWwKKwliaW5kaW5ncyB0byBiZSBpZ25vcmVkIGluIGEgbm9pc3kgYW5kIGZydXN0cmF0aW5nIG1hbm5lci4KKworMjAwNS0xMS0wMyAgUm9iZXJ0IE1jUXVlZW4gIDxyb2JvdDEwMUBkZWJpYW4ub3JnPgorCisJKiBweXRob24vX2RidXMucHksIHB5dGhvbi9wcm94aWVzLnB5LCBweXRob24vc2VydmljZS5weTogQWRkIF9fcmVwcl9fCisJZnVuY3Rpb25zIHRvIGRidXMuQnVzLCBkYnVzLnNlcnZpY2UuQnVzTmFtZSBhbmQgZGJ1cy5zZXJ2aWNlLk9iamVjdCwKKwl0d2VhayBvdGhlcnMgdG8gYmUgY29uc2lzdGVudC4KKworCSogdGVzdC9weXRob24vdGVzdC1jbGllbnQucHk6IFR3ZWFrIG91dHB1dCBvZiB0ZXN0SW5oZXJpdGFuY2UuCisKKzIwMDUtMTAtMjkgIFJvYmVydCBNY1F1ZWVuICA8cm9ib3QxMDFAZGViaWFuLm9yZz4KKworCSogcHl0aG9uL3NlcnZpY2UucHk6IE1ham9yIGNoYW5nZXMgdG8gYWxsb3cgbXVsdGlwbGUgaW5oZXJpdGFuY2UKKwlmcm9tIGNsYXNzZXMgdGhhdCBkZWZpbmUgRC1CdXMgaW50ZXJmYWNlczoKKwkKKwkgMS4gQ3JlYXRlIGEgbmV3IEludGVyZmFjZSBjbGFzcyB3aGljaCBpcyB0aGUgcGFyZW50IGNsYXNzIG9mCisJICAgIE9iamVjdCwgYW5kIG1ha2UgdGhlIE9iamVjdFR5cGUgbWV0YWNsYXNzIGludG8gSW50ZXJmYWNlVHlwZS4KKwkKKwkgMi4gUGF0Y2ggd3JpdHRlbiB3aXRoIFJvYiBUYXlsb3IgdG8gcmVwbGFjZSB1c2Ugb2YgbWV0aG9kX3Z0YWJsZQorCSAgICB3aXRoIGNvZGUgdGhhdCB3YWxrcyB0aGUgY2xhc3MncyBfX01ST19fIChtZXRob2QgcmVzb2x1dGlvbiBvcmRlcikKKwkgICAgdG8gYmVoYXZlIGxpa2UgUHl0aG9uIGRvZXMgd2hlbiBpbnZva2luZyBtZXRob2RzIGFuZCBhbGxvdworCSAgICBvdmVycmlkaW5nIGFzIHlvdSdkIGV4cGVjdC4gQ29kZSBpcyBxdWl0ZSB0cmlja3kgYmVjYXVzZQorCSAgICB3ZSBoYXZlIHRvIGZpbmQgdHdvIG1ldGhvZHMsIHRoZSBvbmUgdG8gaW52b2tlIHdoaWNoIGhhcyB0aGUKKwkgICAgcmlnaHQgbmFtZSBhbmQgaXNuJ3QgZGVjb3JhdGVkIHdpdGggdGhlIC93cm9uZy8gaW50ZXJmYWNlLAorCSAgICBhbmQgdGhlIG9uZSB0byBwaWNrIHVwIHRoZSBzaWduYXR1cmVzIGZyb20gd2hpY2ggaXMgZGVjb3JhdGVkCisJICAgIHdpdGggdGhlIHJpZ2h0IGludGVyZmFjZS4KKwkKKwkgICAgVGhlIHNhbWUgY2F2ZWF0cyBhcHBseSBhcyB0byBub3JtYWwgbXVsdGlwbGUgaW5oZXJpdGFuY2UgLQorCSAgICB0aGlzIGhhcyB1bmRlZmluZWQgYmVoYXZpb3VyIGlmIHlvdSB0cnkgYW5kIGluaGVyaXQgZnJvbSB0d28KKwkgICAgY2xhc3NlcyB0aGF0IGRlZmluZSBhIG1ldGhvZCB3aXRoIHRoZSBzYW1lIG5hbWUgYnV0IGFyZQorCSAgICBkZWNvcmF0ZWQgd2l0aCBkaWZmZXJlbnQgaW50ZXJmYWNlcy4gWW91IHNob3VsZCBkZWNvcmF0ZQorCSAgICB5b3VyIG92ZXJyaWRpbmcgbWV0aG9kIHdpdGggdGhlIGludGVyZmFjZSB5b3Ugd2FudC4KKwkKKwkgMy4gUmVwbGFjZSBncnVuZ3kgaW50cm9zcGVjdGlvbiBYTUwgZ2VuZXJhdGlvbiBjb2RlIGluIHRoZSBtZXRhY2xhc3MKKwkgICAgd2l0aCBkaWN0aW9uYXJpZXMgdGhhdCBjb3BlIGNvcnJlY3RseSB3aXRoIG11bHRpcGxlIGluaGVyaXRhbmNlCisJICAgIGFuZCB0aGUgb3ZlcnJpZGluZyBvZiBtZXRob2RzLiBUaGlzIGFsc28gdXNlcyB0aGUgc2lnbmF0dXJlCisJICAgIGRlY29yYXRpb25zIHRvIHByb3ZpZGUgY29ycmVjdCBpbnRyb3NwZWN0aW9uIGRhdGEsIGluY2x1ZGluZworCSAgICB0aGUgZGVidXQgYXBwZWFyYW5jZSBvZiB0aGUgdHlwZXMgb2YgeW91ciByZXR1cm4gdmFsdWVzLiA6RAorCisJKiB0ZXN0L3B5dGhvbi90ZXN0LWNsaWVudC5weSwgdGVzdC9weXRob24vdGVzdC1zZXJ2aWNlLnB5OiBBZGQgYSB0ZXN0CisJY2FzZSB0byB0cnkgaW52b2tpbmcgYW4gbWV0aG9kIHRoYXQgb3ZlcnJpZGVzIG9uZSBpbmhlcml0ZWQgZnJvbSBhCisJRC1CdXMgaW50ZXJmYWNlIGNsYXNzLgorCisyMDA1LTEwLTI5ICBSb2JlcnQgTWNRdWVlbiAgPHJvYm90MTAxQGRlYmlhbi5vcmc+CisKKwkqIHB5dGhvbi9kYnVzX2JpbmRpbmdzLnB5eDogVHdlYWsgJ3JhaXNlIEFzc2VydGlvbkVycm9yJyB0byBhc3NlcnQoKS4KKwlBZGQgY2hlY2tpbmcgZm9yIHRoZSBlbmQgb2Ygc3RydWN0IGNoYXJhY3RlciB3aGVuIG1hcnNoYWxsaW5nIGEKKwlzdHJ1Y3QgaW4gTWVzc2FnZUl0ZXIuYXBwZW5kX3N0cmljdC4KKworCSogcHl0aG9uL2V4YW1wbGVzL2V4YW1wbGUtc2VydmljZS5weSwKKwlweXRob24vZXhhbXBsZXMvZ2NvbmYtcHJveHktc2VydmljZS5weSwKKwlweXRob24vZXhhbXBsZXMvZ2NvbmYtcHJveHktc2VydmljZTIucHk6IFVwZGF0ZSB0byB1c2UgZ29iamVjdAorCW1haW5sb29wIGRpcmVjdGx5IHJhdGhlciB0aGFuIGFwcGVhcmluZyB0byBkZXBlbmQgb24gZ3RrLgorCisJKiBweXRob24vdGVzdC90ZXN0LWNsaWVudC5weSwgcHl0aG9uL3Rlc3QvdGVzdC1zZXJ2ZXIucHk6IFJlbW92ZQorCW9ic29sZXRlIGFuZCBicm9rZW4gdGVzdCBzY3JpcHRzIGZvciBvbGQgYmluZGluZ3MuIFdlIGhhdmUgdXAgdG8gZGF0ZQorCWFuZCB3b3JraW5nIHRlc3RzIGluIHRlc3QvcHl0aG9uLy4KKworMjAwNS0xMC0yOSAgUm9iZXJ0IE1jUXVlZW4gIDxyb2JvdDEwMUBkZWJpYW4ub3JnPgorCisJKiBweXRob24vZGVjb3JhdG9ycy5weTogQWRkIG9wdGlvbmFsIGFyZ3VtZW50cyB0byB0aGUgbWV0aG9kIGFuZAorCXNpZ25hbCBkZWNvcmF0b3JzIHRvIGFsbG93IHlvdSB0byBzcGVjaWZ5IHRoZSBzaWduYXR1cmUgb2YgYXJndW1lbnRzCisJYW5kIHJldHVybiB2YWx1ZXMuIFByZXNlcnZlIHRoZSBkb2Mgc3RyaW5ncyBvZiBzaWduYWwgZnVuY3Rpb25zIGluIHRoZQorCWRlY29yYXRlZCB2ZXJzaW9uLCBmb3IgcHlkb2MgYW5kIGZyaWVuZHMuCisKKwkqIHB5dGhvbi9kYnVzX2JpbmRpbmdzLnB5eCwgcHl0aG9uL3Byb3hpZXMucHk6IFJlcGxhY2UgdGhlCisJcGFyc2Vfc2lnbmF0dXJlX2Jsb2NrIGZ1bmN0aW9uIHdpdGggYW4gaXRlcmFibGUgZGJ1cy5TaWduYXR1cmUoKQorCXR5cGUuIEZpeCBhIGJ1ZyBpbiBNZXNzYWdlSXRlci5hcHBlbmRfc3RyaWN0IHdoZXJlIHlvdSBjb3VsZCBhcHBlbmQKKwlhbnl0aGluZyBieSBjbGFpbWluZyBpdCB3YXMgYSBzdHJpbmcuCisKKwkqIHB5dGhvbi9zZXJ2aWNlLnB5OiBVc2UgdGhlIG91dF9zaWduYXR1cmUgZGVjb3JhdGlvbiBvbiBtZXRob2RzIHRvCisJbWFyc2hhbCByZXR1cm4gdmFsdWVzLCBtZWFuaW5nIHlvdSBubyBsb25nZXIgcmVxdWlyZSBkYnVzLkFycmF5KCkKKwlvciBkYnVzLkRpY3Rpb25hcnkoKSB0byBpbmRpY2F0ZSB0aGUgdHlwZSB3aGVuIHJldHVybmluZyBlbXB0eQorCWFycmF5cyBvciBkaWN0aW9uYXJpZXMuIEZpeCBhIGJ1ZyB3aGVyZSBleGNlcHRpb25zIHdoaWNoIGFyZSBkZWZpbmVkCisJaW4gX19tYWluX18gYXJlIG5vdCB0dXJuZWQgaW50byBlcnJvciByZXBsaWVzLgorCisJKiB0ZXN0L3B5dGhvbi90ZXN0LWNsaWVudC5weSwgdGVzdC9weXRob24vdGVzdC1zZXJ2aWNlLnB5OiBBZGQgdGVzdAorCWZvciBjb3JyZWN0IG1hcnNoYWxsaW5nIG9mIHJldHVybiB2YWx1ZXMgYWNjb3JkaW5nIHRvIG91dF9zaWduYXR1cmUuCisJRml4IGEgYnVnIGluIHRoZSBhc3luYyBjYWxsIHRlc3Qgd2hlcmUgdGhlIGVycm9yX2hhbmRsZXIgaXMgbWlzc2luZyBhCisJc2VsZiBhcmd1bWVudC4KKworMjAwNS0xMC0yOSAgUm9iZXJ0IE1jUXVlZW4gIDxyb2JvdDEwMUBkZWJpYW4ub3JnPgorCisJKiBnbGliL01ha2VmaWxlLmFtLCBnbGliL2V4YW1wbGVzL01ha2VmaWxlLmFtLAorCWdsaWIvZXhhbXBsZXMvc3RhdGVtYWNoaW5lL01ha2VmaWxlLmFtOiBNZXJnZSBwYXRjaCBmcm9tIFVidW50dSBieQorCURhbmllbCBTdG9uZSB0byByZXBsYWNlIGV4cGxpY2l0IGNhbGxzIHRvIGxpYnRvb2wgd2l0aCAkKExJQlRPT0wpLgorCisJKiB0ZXN0L3B5dGhvbi8uY3ZzaWdub3JlOiBBZGQgcnVuLXdpdGgtdG1wLXNlc3Npb24tYnVzLmNvbmYuCisKKwkqIHRvb2xzL2RidXMtbW9uaXRvci4xLCB0b29scy9kYnVzLW1vbml0b3IuYzogTWVyZ2UgZGJ1cy1tb25pdG9yIHBhdGNoCisJZnJvbSBVYnVudHUgYnkgRGFuaWVsIFNpbHZlcnN0b25lIHRvIGFsbG93IHNwZWNpZnlpbmcgbWF0Y2ggcnVsZXMgb24KKwl0aGUgY29tbWFuZCBsaW5lLgorCisyMDA1LTEwLTI3ICBSb3NzIEJ1cnRvbiAgPHJvc3NAb3BlbmVkaGFuZC5jb20+CisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLWhlYWRlci5jOgorCVJlbW92ZSBkZWFkIGNvZGUuCisKKwkqIGdsaWIvZGJ1cy1nb2JqZWN0LmM6CisJU3RvcCBjb21waWxlciB3YXJuaW5nLgorCisyMDA1LTEwLTI1ICBSb3NzIEJ1cnRvbiAgPHJvc3NAb3BlbmVkaGFuZC5jb20+CisKKwkqIGRidXMvZGJ1cy1hdXRoLmM6CisJKiBkYnVzL2RidXMtc2VydmVyLXVuaXguYzoKKwkqIGRidXMvZGJ1cy10cmFuc3BvcnQtdW5peC5jOgorCSogZ2xpYi9kYnVzLWdtYWluLmM6CisJKiBnbGliL2RidXMtZ29iamVjdC5jOgorCUFkZCBzb21lIGNvbnN0IGtleXdvcmRzLgorCisyMDA1LTEwLTI1ICBSb3NzIEJ1cnRvbiAgPHJvc3NAb3BlbmVkaGFuZC5jb20+CisKKwkqIGRvYy9kYnVzLXNwZWNpZmljYXRpb24ueG1sOgorCURvY3VtZW50IHRoZSBOb1JlcGx5IGFubm90YXRpb24uCisKKwkqIGdsaWIvZGJ1cy1iaW5kaW5nLXRvb2wtZ2xpYi5oOgorCSogZ2xpYi9kYnVzLWJpbmRpbmctdG9vbC1nbGliLmM6CisJUmVzcGVjdCB0aGUgTm9SZXBseSBhbm5vdGF0aW9uLgorCisyMDA1LTEwLTI0ICBSb2JlcnQgTWNRdWVlbiA8cm9ib3QxMDFAZGViaWFuLm9yZz4KKworCSogcHl0aG9uL2RidXNfYmluZGluZ3MucHl4IChTdHJpbmcsIE1lc3NhZ2VJdGVyKTogbWFrZSBELUJ1cyBzdHJpbmdzCisJZGVyaXZlIGZyb20gdW5pY29kZSBpbnN0ZWFkIG9mIHN0ciwgYW5kIGVuY29kZS9kZWNvZGUgVVRGLTggd2hlbgorCW1hcnNoYWxsaW5nL3VubWFyc2hhbGxpbmcgYnVzIG1lc3NhZ2VzCisKKwkqIHB5dGhvbi9pbnRyb3NwZWN0X3BhcnNlci5weTogZW5jb2RlIGludHJvc3BlY3Rpb24gZGF0YSBhcyBVVEYtOAorCWJlZm9yZSBwYXNzaW5nIHRoZSBidWZmZXIgaW50byBsaWJ4bWwyCisKKwkqIHRlc3QvcHl0aG9uL3Rlc3QtY2xpZW50LnB5OiBhZGQgdW5pY29kZSB0ZXN0IHN0cmluZ3MKKworCSogdGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMvLmN2c2lnbm9yZSwgdGVzdC9weXRob24vLmN2c2lnbm9yZToKKwlpZ25vcmUgZ2VuZXJhdGVkIHB5dGhvbiB0ZXN0IGZpbGVzCisKKzIwMDUtMTAtMTcgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGdsaWIvZGJ1cy1ndmFsdWUtdXRpbHMuYyAoaGFzaF9mcmVlX2Zyb21fZ3R5cGUpOiBoYW5kbGUgZ2RvdWJsZQorCWFuZCBHX1RZUEVfVkFMVUVfQVJSQVkgKERCVVNfVFlQRV9TVFJVQ1QpCisJKGd2YWx1ZV9mcm9tX2hhc2hfdmFsdWUsIGhhc2hfdmFsdWVfZnJvbV9ndmFsdWUpOiBoYW5kbGUgZ2RvdWJsZQorCisJKiBnbGliL2RidXMtZ3ZhbHVlLmMgKGRidXNfZ3ZhbHVlX3RvX3NpZ25hdHVyZSk6IGFkZCBtaXNzaW5nCisJREJVU19TVFJVQ1RfQkVHSU5fQ0hBUiBhbmQgREJVU19TVFJVQ1RfRU5EX0NIQVIgY2hhcmF0ZXJzCisJd2hlbiBjb25zdHJ1Y3Rpbmcgc3RydWN0IHNpZ25hdHVyZXMKKworCSogcHl0aG9uL19kYnVzLnB5IChCdXMpOiBoYW5kbGUgcHJpdmF0ZSBjb25uZWN0aW9ucyB1c2luZyB0aGUKKwlwcml2YXRlIGtleXdvcmQgaW4gdGhlIGNvbnN0cnVjdG9yLiBkZWZhdWx0cyB0byBwcml2YXRlPUZhbHNlCisJKEJ1czo6Y2xvc2UpOiBuZXcgbWV0aG9kIHRvIGNsb3NlIGEgY29ubmVjdGlvbiB0byB0aGUgYnVzCisKKwkqIHB5dGhvbi9kYnVzX2JpbmRpbmdzLnB5eCAoQ29ubmVjdGlvbjo6Y2xvc2UpOiByZW5hbWVkIG1ldGhvZAorCXdhcyBwcmV2aW91c2x5IGNhbGxlZCBkaXNjb25uZWN0CisJKGJ1c19nZXQpOiBub3cgc3VwcG9ydHMgZ2V0dGluZyBhIHByaXZhdGUgY29ubmVjdGlvbgorCisJKiBweXRob24vcHJveGllcy5weSAoUHJveHlNZXRob2Q6Ol9fY2FsbF9fKTogY2hlY2sgaWYgaWdub3JlX3JlcGx5CisJa2V5d29yZCBpcyBzZXQgdG8gVHJ1ZS4gIGlmIGl0IGlzLCBleGVjdXRlIHRoZSBtZXRob2Qgd2l0aG91dCB3YWl0aW5nCisJZm9yIGEgcmVwbHkKKwkoUHJveHlPYmplY3Q6Ol9pbnRyb3NwZWN0X2V4ZWN1dGVfcXVldWUpOiBuZXcgbWV0aG9kIGZvciBleGVjdXRpbmcKKwlhbGwgdGhlIHBlbmRpbmcgbWV0aG9kcyB0aGF0IHdlcmUgd2FpdGluZyBmb3IgdGhlIGludHJvc3BlY3QgdG8KKwlmaW5pc2guICB0aGlzIGlzIGNhbGxlZCB3aGVuIGludHJvc3BlY3QgZWl0aGVyIHN1Y2NlZWRzIG9yIGZhaWxzCisJKFByb3h5T2JqZWN0OjpfaW50cm9zcGVjdF9lcnJvcl9oYW5kbGVyKTogY2FsbCBxdWV1ZWQgbWV0aG9kcworCisyMDA1LTEwLTE0ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBweXRob24vZGJ1c19iaW5kaW5ncy5weXggKE1lc3NhZ2VJdGVyOjphcHBlbmRfc3RyaWN0KTogY2hlY2sgZm9yCisJU1RSVUNUX0JFR0lOIG5vdCBUWVBFX1NUUlVDVCBpbiBpbmRpY2F0ZSB3ZSBhcmUgbWFyc2hhbGxpbmcgYSBzdHJ1Y3QKKworCSogcHl0aG9uL3NlcnZpY2UucHkgKE9iamVjdDo6X21lc3NhZ2VfY2IpOiBoYW5kbGUgZXhjZXB0aW9ucyBjb3JyZWN0bHkKKwlieSBzZW5kaW5nIHRoZW0gb3ZlciB0aGUgd2lyZSB0byB0aGUgY2FsbGluZyBhcHAuICBUaGlzIG1ha2VzIHN1cmUKKwl0aGUgY2xpZW50IHJldHVybnMgaW1tZWRpYXRlbHkgaW5zdGVhZCBvZiB3YWl0aW5nIHRoZSAxNSBzZWNvbmRzIHRvCisJdGltZW91dC4KKworCSogdGVzdC9weXRob24vdGVzdC1jbGllbnQucHkgKFRlc3REQnVzQmluZGluZ3M6OnRlc3RCZW5jaG1hcmtJbnRyb3NwZWN0KTogCisJQWRkIGEgdGVzdCB0byBiZW5jaG1hcmsgaG93IGxvbmcgaXQgdGFrZXMgdG8gaW50cm9zcGVjdCBhIHNlcnZpY2UgYW5kIAorCWNhbGwgYSBtZXRob2Qgd2hpY2ggcmV0dXJucyBhIGxhcmdlIGVsZW1lbnQgKHByZXR0eSBmYXN0KQorCisJKiB0ZXN0L3B5dGhvbi90ZXN0LXNlcnZpY2UucHkgKFRlc3RPYmplY3Q6OkdldENvbXBsZXhBcnJheSk6IG5ldyB0ZXN0IAorCW1ldGhvZCB3aGljaCBwdXNoZXMgYSBsb3Qgb2YgZGF0YQorCisyMDA1LTEwLTEzICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBweXRob24vc2VydmljZS5weShPYmplY3RUeXBlOjpfcmVmbGVjdF9vbl9zaWduYWwsIF9yZWZsZWN0X29uX21ldGhvZCk6IAkKKwlyZWNsYWltIG1lbW9yeSBvdXRzaWRlIG9mIHRoZSBsb29wIGFuZCB1c2UgZGVsIGlzdGVhZCBvZiBqdXN0IHNldHRpbmcKKwl0aGUga2V5IHRvIE5vbmUKKworMjAwNS0xMC0xMyAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogcHl0aG9uL3NlcnZpY2UucHkgKE9iamVjdFR5cGU6Ol9yZWZsZWN0X29uX3NpZ25hbCk6IEFsd2F5cyBjbG9zZQorCXNpZ25hbCB0YWcgZXZlbiB3aGVuIHRoZXJlIGFyZSBubyBhcmd1bWVudHMKKworMjAwNS0xMC0xMyAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogY29uZmlndXJlLmluOiBTZXQgbW9ubywgbW9uby1kb2NzIGFuZCBRdDMgdG8gZGVmYXVsdAorCXRvIG5vIGluc3RlYWQgb2YgYXV0byB3aGVuIGJ1aWxkaW5nLiAgVGhlc2UgYmluZGluZ3MgZG8gbm90CisJaGF2ZSBmdWxsIHRpbWUgbWFpbnRhaW5lcnMgYW5kIHdpbGwgbm90IGJlIHN1cHBvcnRlZCBmb3IgdGhlCisJMS4wIHJlbGVhc2UuCisKKzIwMDUtMTAtMTIgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwlwYXRjaGVzIGZyb20gTWljaGFlbCBLcml2b3J1Y2hrbyA8bWlzaGEgYXQgc3VuLmNvbT46IAorCQorCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYyAoX2RidXNfY29ubmVjdGlvbl9xdWV1ZV9yZWNlaXZlZF9tZXNzYWdlX2xpbmssCisJX2RidXNfY29ubmVjdGlvbl9tZXNzYWdlX3NlbnQsIAorCV9kYnVzX2Nvbm5lY3Rpb25fc2VuZF9wcmVhbGxvY2F0ZWRfdW5sb2NrZWRfbm9fdXBkYXRlLCAKKwlfZGJ1c19jb25uZWN0aW9uX3BvcF9tZXNzYWdlX2xpbmtfdW5sb2NrZWQpOiBoYW5kbGUgdGhlIGNhc2Ugd2hlbiBwYXRoIAorCWlzIE5VTEwgd2hlbiBjYWxsaW5nIF9kYnVzX3ZlcmJvc2UKKworCSogY29uZmlndXJlLmluOiBjaGVjayBmb3IgZnVuY3Rpb25zIGdldHBlZXJ1Y3JlZCBhbmQgZ2V0cGVlcmVpZAorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jIChfZGJ1c19yZWFkX2NyZWRlbnRpYWxzX3VuaXhfc29ja2V0KTogcHJvdmlkZXMgCisJc3VwcG9ydCBvZiBhdXRoIEVYVEVSTkFMIG9uIFNvbGFyaXMgMTArIChnZXRwZWVydWNyZWQpLCBGcmVlQlNEIDQuNissIAorCU9wZW5CU0QgMy4wKyBhbmQgRnJlZUJTRCA1LjArIGFzIHdlbGwgYXMgTWFjT1NYIDEwLjIrIChnZXRwZWVyZWlkKS4gCisJUGF0Y2ggd2FzIG9ubHkgdGVzdGVkIG9uIFNvbGFyaXMgMTAgeDg2IHNvIGl0IG1pZ2h0IGJlIGlzc3VlcworCXdpdGggb3RoZXIgcGxhdGZvcm1zIChpLmUuIEJTRHMgYW5kIE1hY09TWCkKKwkKKworMjAwNS0xMC0wNSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogZ2xpYi9kYnVzLWd2YWx1ZS5jIChtYXJzaGFsX3ZhcmlhbnQpOiBjYWxsIF9kYnVzX2d2YWx1ZV9tYXJzaGFsIAorCWluc3RlYWQgb2YgbWFyc2hhbCBiYXNpYyBzbyB3ZSBjYW4gaGFuZGxlIHJlY3Vyc2l2ZSB0eXBlcyBpbiBhIHZhcmlhbnQKKworCSogdGVzdC9nbGliL3Rlc3QtZGJ1cy1nbGliLmM6IEFkZCB0ZXN0IGZvciBtYXJzaGFsaW5nIHJlY3VyaXZlIHR5cGVzCisJaW4gdmFyaWFudHMKKworCSogdGVzdC9nbGliL3Rlc3Qtc2VydmljZS1nbGliLmMsIHRlc3Qtc2VydmljZS1nbGliLnhtbAorCShteV9vYmplY3RfZWNob192YXJpYW50IFtFY2hvVmFyaWFudF0sIAorCW15X29iamVjdF9wcm9jZXNzX3ZhcmlhbnRfb2ZfYXJyYXlfb2ZfaW50czEyMworCVtQcm9jZXNzVmFyaWFudE9mQXJyYXlPZkludHMxMjNdKTogCisJQWRkIHR3byB0ZXN0IG1ldGhvZHMKKworCSogcHl0aG9uL2ludHJvc3BlY3RfcGFyc2VyLnB5OiBOZXcgbW9kdWxlIGZvciBwYXJzaW5nIGludHJvc3BlY3QKKwlkYXRhLgorCisJKiBweXRob24vZGJ1c19iaW5kaW5ncy5weXg6CisJKHZhcmlvdXMgcGxhY2VzKTogd2hlbiB0aHJvd2luZyBlcnJvcnMgZml4IHRvIHVzZSBlcnJvcm1zZyBpbnN0ZWFkIAorCW9mIG1lc3NhZ2UgbG9jYWwgdmFyaWFibGUgYmVjYXVzZSBQeXJleCBjYW4gZ2V0IGNvbmZ1c2VkIHdpdGggb3RoZXIgCisJbWVzc2FnZSB2YXJpYWJsZXMgKGluaXRpYWwgcGF0Y2ggYnkgUm9iZXJ0IE1jUXVlZW4gCisJPHJvYmVydC5tY3F1ZWVuIGF0IGNvbGxhYm9yYS5jby51az4pCisJKE1lc3NhZ2VJdGVyOjpwYXJzZV9zaWduYXR1cmVfYmxvY2spOiBuZXcgbWV0aG9kIGZvciBnZXR0aW5nIHRoZSBuZXh0CisJYmxvY2sgaW4gYSBzaWduaXR1cmUuCisJKE1lc3NhZ2VJdGVyOjphcHBlbmRfc3RyaWN0KTogbmV3IG1ldGhvZCBmb3IgYXBwZW5kaW5nIHZhbHVlcyBzdHJpY3RseQorCXVzaW5nIHRoZSBwYXNzZWQgaW4gc2lnbmF0dXJlIGluc3RlYWQgb2YgZ3Vlc3NpbmcgYXQgdGhlIHR5cGUKKwkoTWVzc2FnZUl0dGVyOjogYXBwZW5kX2RpY3QsIGFwcGVuZF9zdHJ1Y3QsIGFwcGVuZF9hcnJheSk6IHVzZSAKKwlzaWduYXR1cmVzIHRvIG1hcnNoYWwgY2hpbGRyZW4gaWYgdGhlIHNpZ25hdHVyZSBpcyBhdmFpbGFibGUKKwkKKwkqIHB5dGhvbi9leGNlcHRpb25zLnB5IChJbnRyb3NwZWN0aW9uUGFyc2VyRXhjZXB0aW9uKTogbmV3IGV4Y2VwdGlvbgorCisJKiBweXRob24vcHJveGllcy5weSAoUHJveHlNZXRob2Q6Ol9fY2FsbF9fKTogTWFyc2hhbCBhcmdzIHdpdGggCisJaW50cm9zcGVjdGVkIHNpZ25hdHVyZXMgaWYgYXZhaWxhYmxlLCBlbHNlIHdlIGZhbGwgYmFjayB0byB0aGUKKwlvbGQgd2F5IG9mIGRvaW5nIHRoaW5ncy4KKwkoUHJveHlPYmplY3Q6Ol9pbnRyb3NwZWN0X3JlcGx5X2hhbmRsZXIgKTogcGFyc2UgaW50cm9zcGVjdGlvbiBkYXRhCisJCisJKiBweXRob24vc2VydmljZS5weSAoT2JqZWN0VHlwZTo6X3JlZmxlY3Rfb25fbWV0aG9kKTogUHJvcGVybHkKKwl0ZXJtaW5hdGUgPG1ldGhvZD4gaWYgdGhlcmUgYXJlIG5vIGFyZ3MgaW4gdGhlIHJlZmxlY3Rpb24gZGF0YQorCisJKiB0ZXN0L3B5dGhvbi90ZXN0LWNsaWVudC5weTogYWRkIHRlc3RzIGZvciB0YWxraW5nIHdpdGggdGhlIEdMaWIKKwl0ZXN0IHNlcnZlci4gIFRoaXMgZ2l2ZXMgdXMgYmV0dGVyIGNvdmVyYWdlIGZvciBpbnRyb3NwZWN0aW9uIHNpbmNlCisJcHl0aG9uIHRvIHB5dGhvbiB3aWxsIGFsd2F5cyBnZW5lcmF0ZSBhcmd1bWVudHMgYXMgdmFyaWFudHMuICBJdCBhbHNvCisJYWxsb3dzIHVzIHRvIHRlc3QgdGhlIHJvYnVzdG5lc3Mgb2YgdGhlIEdMaWIgYmluZGluZ3MgYW5kIGludGVybGFuZ3VhZ2UKKwljb21tdW5pY2F0aW9ucy4KKworCQorMjAwNS0xMC0wMyAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogYnVzL2RyaXZlci5jIChidXNfZHJpdmVyX2hhbmRsZV9pbnRyb3NwZWN0KTogQWRkIHNpZ25hbHMKKwl0byB0aGUgaW50cm9zcGVjdCBkYXRhLiAocGF0Y2ggZnJvbSBEYW5pZWwgUC4gQmVycmFuZ2UgCisJPGRhbiBhdCBiZXJyYW5nZS5jb20+KQorCisJKiBidXMvZGlzcGF0Y2guYyAoY2hlY2tfZXhpc3RlbnRfcGluZyk6IEFkZCB0ZXN0Y2FzZSBmb3IgUGluZworCQorCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYyAoX2RidXNfY29ubmVjdGlvbl9wZWVyX2ZpbHRlciwKKwlfZGJ1c19jb25uZWN0aW9uX3J1bl9idWlsdGluX2ZpbHRlcnMpOiBDaGFuZ2VkIHRoZXNlIHRvCisJYmUgdW5sb2NrX25vX3VwZGF0ZSBmdW5jdGlvbnMgYW5kIGNhbGwgCisJX2RidXNfY29ubmVjdGlvbl9zZW5kX3VubG9ja2VkX25vX3VwZGF0ZSBpbnN0ZWFkIG9mCisJZGJ1c19jb25uZWN0aW9uX3NlbmQgdG8gYXZvaWQgbG9ja2luZyBlcnJvcnMuCisJCisJKiBkb2MvVE9ETzogUmVtb3ZlZCB0aGUgbWFrZSBQaW5nIHRlc3QgVE9ETworCQorMjAwNS0wOS0yNiAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9QeXRob24ucHl4OiBGaXhlZCBtZW1vcnkgbGVha3Mgd2hlbiB0aHJvd2luZyBlcnJvcnMuCisJV2Ugbm93IGNvcHkgdGhlIG1lc3NhZ2UgZnJvbSBhIERCdXNFcnJvciBhbmQgdGhlbiBmcmVlIAorCXRoZSBlcnJvciBvYmplY3QgYmVmb3IgdGhyb3dpbmcgdGhlIGVycm9yCisKKwkqIGdsaWIvZGJ1cy1nbGliLXRvb2wuYzogcmVtb3ZlZCBleHRyYSBjb21tYSBhdCB0aGUgZW5kIG9mIHRoZQorCURCdXNCaW5kaW5nT3V0cHV0TW9kZSBlbnVtIHdoaWNoIHdhcyBjYXVzaW5nIGEgd2FybmluZy4KKwkjaW5jbHVkZSA8dGltZS5oPiBzbyB1c2luZyB0aW1lX3QgaXMgZXhwbGljaXRseSBkZWZpbmVkCisKKzIwMDUtMDktMjYgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIEludGVncmF0ZSBwYXRjaGVzIGZyb20gTGVubmFydCBQb2V0dGVyaW5nIDxtenNxYiBhdCAwcG9pbnRlci5kZT46CisJLSBkYnVzL2RidXMtYnVzLmMKKwkoaW50ZXJuYWxfYnVzX2dldCk6IG5ldyBtZXRob2QgdGhhdCB0YWtlIG92ZXIgdGhlIGhlYXZ5IGxpZnRpbmcKKwlvZiBkYnVzX2J1c19nZXQgYW5kIGFkZHMgdGhlIGFiaWxpdHkgdG8gZ2V0IGEgcHJpdmF0ZSBjb25uZWN0aW9uCisJdG8gdGhlIGJ1cworCShkYnVzX2J1c19nZXQpOiB3cmFwcGVyIHRvIGludGVybmFsX2J1c19nZXQgdGhhdCBwcm92aWRlcyB0aGUgc2FtZQorCWludGVyZmFjZSBhcyBpbiBwcmV2aW91cyB2ZXJzaW9ucworCShkYnVzX2J1c19nZXRfcHJpdmF0ZSk6IG5ldyBtZXRob2QgdGhhdCBpcyBhIHdyYXBwZXIgdG8gCisJaW50ZXJuYWxfYnVzX2dldCB0byBnZXQgYSBwcml2YXRlIGNvbm5lY3Rpb24gdG8gdGhlIGJ1cworCisJLSBkYnVzL2RidXMtYnVzLmgKKwkoZGJ1c19idXNfZ2V0X3ByaXZhdGUpOiBhZGQgYXMgYSBwdWJsaWMgbGliZGJ1cyBpbnRlcmZhY2UKKworCS0gZGJ1cy0xLnBjLmluOiBvdXRwdXQgc3lzdGVtX2J1c19kZWZhdWx0X2FkZHJlc3MgYW5kIAorCXN5c2NvbmZkaXIgdmFyaWFibGVzIHNvIGFwcHMgY2FuIHVzZSB0aGVtIHdoZW4gY29tcGlsaW5nCisKKzIwMDUtMDktMjMgIEhhcmFsZCBGZXJuZW5nZWwgIDxoYXJyeUBrZGV2ZWxvcC5vcmc+CisJKiBkYnVzL3F0OiBOZXcgUXQgYmluZGluZ3MKKworMjAwNS0wOS0xMiAgV2FsZG8gQmFzdGlhbiAgPGJhc3RpYW5Aa2RlLm9yZz4KKworCSogZGJ1cy9kYnVzLW1hcnNoYWwtdmFsaWRhdGUuYywKKwlkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnhtbCwgdGVzdC9NYWtlZmlsZS5hbSwKKwl0ZXN0L3Rlc3QtbmFtZXMuYzogYWxsb3cgaHlwaGVucyBpbiBidXMgbmFtZXMuCisKKzIwMDUtMDktMTEgIE1hcmsgTWNMb3VnaGxpbiAgPG1hcmtAc2t5bmV0LmllPgorCisJKiB0ZXN0L2RhdGEvYXV0aC9mYWxsYmFjay5hdXRoLXNjcmlwdDogd2UgZG9uJ3QKKwlyZXRyeSB0aGUgRVhURVJOQUwgbWV0aG9kIHdoZW4gd2Uga25vdyBpdHMgZ29pbmcKKwl0byBmYWlsIGFueW1vcmUuCisKKzIwMDUtMDktMTEgIE1hcmsgTWNMb3VnaGxpbiAgPG1hcmtAc2t5bmV0LmllPgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi1pbnRlcm5hbC5oOiByZW5hbWUKKwkoYWRkfHJlbW92ZXx0b2dnbGUpXyh3YXRjaHx0aW1lb3V0KSB0byB1bmxvY2tlZCgpCisJCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jOiBkaXR0by4KKwkKKwkqIGRidXMvZGJ1cy10aW1lb3V0LmMsIGRidXMvZGJ1cy10cmFuc3BvcnQtdW5peC5jOgorCVVwZGF0ZSBzb21lIGNhbGxlcnMgZm9yIHRoZSByZW5hbWluZy4KKworMjAwNS0wOS0xMCAgTWFyayBNY0xvdWdobGluICA8bWFya0Bza3luZXQuaWU+CisKKwkqIGRidXMvZGJ1cy1hdXRoLmM6IChyZWNvcmRfbWVjaGFuaXNtcyk6IGRvbid0CisJcmV0cnkgdGhlIGZpcnN0IGF1dGggbWVjaGFuaXNtIGJlY2F1c2Ugd2Uga25vdworCXdlJ3JlIGp1c3QgZ29pbmcgdG8gZ2V0IHJlamVjdGVkIGFnYWluLgorCQorCSogZGJ1cy9kYnVzLWtleXJpbmcuYzogKF9kYnVzX2tleXJpbmdfcmVsb2FkKToKKwlGaXggdGhpbmtvIC4uLiBhbmQgd2hhdCBhIG5hc3R5IGxpdHRsZSBidWdnZXIgdG8KKwl0cmFjayBkb3duIHlvdSB3ZXJlIC4uLgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jOgorCShfZGJ1c19jb25uZWN0aW9uX2FkZF93YXRjaCksCisJKF9kYnVzX2Nvbm5lY3Rpb25fcmVtb3ZlX3dhdGNoKTogYWRkIG5vdGUgYWJvdXQKKwl0aGVzZSBuZWVkaW5nIHRoZSBjb25uZWN0aW9uIHRvIGJlIGxvY2tlZC4KKwkoX2RidXNfY29ubmVjdGlvbl9nZXRfZGlzcGF0Y2hfc3RhdHVzX3VubG9ja2VkKToKKwlzZXQgc3RhdHVzIHRvIERBVEFfUkVNQUlOUyB3aGVuIHdlIHF1ZXVlIHRoZQorCWRpc2Nvbm5lY3RlZCBtZXNzYWdlLgorCQorCSogYnVzL2Rpc3BhdGNoLmM6CisJKGJ1c19kaXNwYXRjaCk6IGZpeCB3YXJuaW5nLgorCShjaGVja19leGlzdGVudF9zZXJ2aWNlX25vX2F1dG9fc3RhcnQpOgorCUV4cGVjdCBDaGlsZFNpZ25hbGVkIGVycm9yIHRvby4KKwkoY2hlY2tfZXhpc3RlbnRfaGVsbG9fZnJvbV9zZWxmKTogZml4IGFub3RoZXIKKwljb3VwbGUgb2Ygd2FybmluZ3MuCisJCisyMDA1LTA5LTA4ICBKb2UgU2hhdyAgPGpvZXNoYXdAbm92ZWxsLmNvbT4KKworCVBhdGNoZXMgZnJvbSBKYW1lcyBXaWxsY294IDxzbm9ycEBzbm9ycC5uZXQ+CisKKwkqIG1vbm8vTWFrZWZpbGUuYW06IEFkZCBJbnQxNi5jcyBhbmQgVUludDE2LmNzCisKKwkqIG1vbm8vREJ1c1R5cGUvQXJyYXkuY3M6IEhhbmRsZSBtdWx0aWRpbWVuc2lvbmFsIGFycmF5cywgYW5kCisJc3VwcG9ydCBhcnJheSAib3V0IiBwYXJhbWV0ZXJzLgorCisJKiBtb25vL0RCdXNUeXBlL0ludDE2LmNzLCBtb25vL0RCdXNUeXBlL1VJbnQxNi5jczogTmV3IGZpbGVzLAorCWZvciAxNi1iaXQgaW50IHN1cHBvcnQuCisKKzIwMDUtMDktMDYgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIFJlbGVhc2VkIDAuNTAKKworCSogUGF0Y2ggZnJvbSBTdGV2ZSBHcnViYjoKKwktIGJ1cy9hY3RpdmF0aW9uLmMgKGJ1c19hY3RpdmF0aW9uX3NlcnZpY2VfcmVsb2FkX3Rlc3QpOiBjbGVhbiB1cAorCXNvbWUgaW5kZW50YXRpb24KKwktIGRidXMvZGJ1cy1rZXlyaW5nLmMgKF9kYnVzX2tleXJpbmdfcmVsb2FkKTogZml4IGNvbmRpdGlvbmFsIAorCS0gZGJ1cy9kYnVzLW1lc3NhZ2UtZmFjdG9yeS5jIChnZW5lcmF0ZV9zcGVjaWFsKTogZml4IGEgY291cGxlIG9mCisJYnVmZmVyIG92ZXJmbG93cyBpbiB0aGUgdGVzdCBzdWl0ZS4gIFRoaXMgaXMgbm9uIGNyaXRpY2FsIGJlY2F1c2UKKwlpdCBjYW4gbm90IGJlIGV4cGxvaXRlZCBhbmQgdGhpcyBjb2RlIGlzIG9ubHkgcnVuIHdoZW4gZG9pbmcgYSAKKwltYWtlIGNoZWNrLgorCisJKiBQYXRjaCBmcm9tIFlhYWtvdiBTZWxrb3dpdHo6IEJ1aWxkIGZpeGVzIGZvciBDeWd3aW4KKwktIGNvbmZpZ3VyZS5pbjogRG9uJ3QgY2hlY2sgYW5kIGxpbmsgYWdhaW5zdCBrZGVjb3JlLCBvbmx5IHF0IGhlYWRlcnMKKwktIGRidXMvTWFrZWZpbGUuYW06IEFkZCAtbm8tdW5kZWZpbmVkIHRvIGxpYmRidXNfMV9sYV9MREZMQUdTCisJLSBnY2ovb3JnL2ZyZWVkZXNrdG9wL2RidXMvTWFrZWZpbGUuYW06CisJYWRkIGxpYmRidXNfZ2NqXzFfbGFfTERGTEFHUyA9IC1uby11bmRlZmluZWQKKwktIGdsaWIvTWFrZWZpbGUuYW06IEFkZCAtbm8tdW5kZWZpbmVkIHRvIGxpYmRidXNfZ2xpYl8xX2xhX0xERkxBR1MKKwlhbmQgJChEQlVTX0dMSUJfTElCUykgdG8gZGJ1c19iaW5kaW5nX3Rvb2xfTERBREQKKwktIHF0L01ha2VmaWxlLmFtOiBBZGQgLW5vLXVuZGVmaW5lZCB0byBsaWJkYnVzX3F0XzFfbGFfTERGTEFHUworCS0gdG9vbHMvTWFrZWZpbGUuYW06IEFkZCBwbGF0Zm9ybSBleHRlbnRpb25zIHRvIGJpbmFyaWVzIAorCShpLmUuIC5leGUgb24gd2luZG93cykKKworCSogY29uZmlndXJlLmluOiAKKwktIE1ha2UgaXQgc28gaWYgbm8gc3VpdGFibGUgdmVyc2lvbiBvZiBweXRob24gaXMgZm91bmQgd2Ugb25seSAKKwlkaXNhYmxlIGJ1aWxkaW5nIHB5dGhvbiBpbnN0ZWFkIG9mIGV4aXRpbmcgdGhlIGNvbmZpZ3VyZSBzY3JpcHQKKwktIFJlcXVpcmUgdmVyc2lvbiAyLjQgb2YgZ2xpYiBmb3IgZ2xpYiBiaW5kaW5ncworCS0gVXAgdmVyc2lvbiB0byAwLjUwCisKKwkqIHB5dGhvbi9fX2luaXRfXy5weTogU3luYyB2ZXJzaW9uIHdpdGggbGliZGJ1cyB0byAoMCw1MCwwKQorCQorMjAwNS0wOS0wNSAgT2xpdmllciBBbmRyaWV1ICA8b2xpdl9fYUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIGRidXMvZGJ1cy1vYmplY3QtdHJlZS5jIChmaW5kX3N1YnRyZWVfcmVjdXJzZSk6CisJYSBjb3VwbGUgb2Ygb3B0aW1pemF0aW9ucyAoYnVnICM3MTApOgorCS0gZG8gYSBiaW5hcnkgc2VhcmNoIGluIHRoZSB0cmVlCisJLSBpbnNlcnQgYSBuZXcgY2hpbGQgYXQgdGhlIHJpZ2h0IHBsYWNlIGRpcmVjdGx5LCBubyBuZWVkIGZvcgorCSAgcXNvcnQgYW55bW9yZQorCS0gZG8gdGhlICJkb3VibGUgYWxsb2MiIHRoaW5nIHdoZW4gYWxsb2NhdGluZyBjaGlsZHJlbgorCisyMDA1LTA4LTMxICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBweXRob24vTWFrZWZpbGUuYW06IEJyZWFrIG9uIHB5cmV4YyBlcnJvcnMgaW5zdGVhZCBvZiBpZ25vcmluZyB0aGVtCisKKwkqIHB5dGhvbi9kYnVzX2JpbmRpbmdzLnB5eDogTWVtb3J5IG1hbmFnZW1lbnQgZm9vCisJKGdsb2JhbCk6IHJlbW92ZSBoYWNreSBfdXNlcl9kYXRhX3JlZmVyZW5jZXMgZ2xvYmFsIGxpc3QKKwkoR0lMX3NhZmVfY3VucmVnaXN0ZXJfZnVuY3Rpb25faGFuZGxlcik6IHVzZXJkYXRhIG5vdyBzdHVmZmVkIGludG8KKwl0dXBsZXMuIFVucmVmIHVzZXJfZGF0YQorCShHSUxfc2FmZV9jbWVzc2FnZV9mdW5jdGlvbl9oYW5kbGVyKTogdXNlcmRhdGEgbm93IHN0dWZmZWQgaW50byB0dXBsZXMKKwkoQ29ubmVjdGlvbjo6X19kZWxfXyk6IFJlbW92ZSBhbmQgcmVwbGFjZSB3aXRoIF9fZGVhbGxvY19fIG1ldGhvZAorCShDb25uZWN0aW9uOjphZGRfZmlsdGVyKTogU3R1ZmYgdXNlcl9kYXRhIGludG8gYSB0dXBsZS4gIFVzZSBQeV9JTkNSRUYKKwl0byBrZWVwIHR1cGxlIGZyb20gYmVpbmcgZGVhbGxvY2F0ZWQgaW5zdGVhZCBvZiB0aGUgZ2xvYmFsIHZhciBoYWNrCisJKENvbm5lY3Rpb246OnJlZ2lzdGVyX29iamVjdF9wYXRoKTogU3R1ZmYgdXNlcl9kYXRhIGludG8gYSB0dXBsZS4KKwlVc2UgUHlfSU5DUkVGIHRvIGtlZXAgdHVwbGUgZnJvbSBiZWluZyBkZWFsbG9jYXRlZCBpbnN0ZWFkIG9mIHRoZSAKKwlnbG9iYWwgdmFyIGhhY2sKKwkoQ29ubmVjdGlvbjo6cmVnaXN0ZXJfZmFsbGJhY2spOiBTdHVmZiB1c2VyX2RhdGEgaW50byBhIHR1cGxlLgorCVVzZSBQeV9JTkNSRUYgdG8ga2VlcCB0dXBsZSBmcm9tIGJlaW5nIGRlYWxsb2NhdGVkIGluc3RlYWQgb2YgdGhlIAorCWdsb2JhbCB2YXIgaGFjaworCShHSUxfc2FmZV9wZW5kaW5nX2NhbGxfbm90aWZpY2F0aW9uKTogRG9uJ3QgdW5yZWYgdGhlIG1lc3NhZ2UKKwliZWNhdXNlIGl0IGdldHMgdW5yZWZmZWQgd2hlbiBnb2luZyBvdXQgb2Ygc2NvcGUuICBQeV9YREVDUkVGCisJdGhlIHVzZXJfZGF0YQorCShQZW5kaW5nQ2FsbDo6X19kZWxfXyk6IFJlbW92ZSBhbmQgcmVwbGFjZSB3aXRoIF9fZGVhbGxvY19fIG1ldGhvZAorCShQZW5kaW5nQ2FsbDo6c2V0X25vdGlmeSk6IHJlZiB0aGUgcGVuZGluZyBjYWxsIGJlY2F1c2Ugd2Ugd2lsbAorCW5lZWQgaXQgdG8gc3RpY2sgYXJvdW5kIGZvciB3aGVuIHRoZSBub3RpZnkgY2FsbGJhY2sgZ2V0cyBjYWxsZWQKKwkoTWVzc2FnZTo6X19kZWxfXyk6IFJlbW92ZSBhbmQgcmVwbGFjZSB3aXRoIF9fZGVhbGxvY19fIG1ldGhvZAorCisJKiBweXRob24vZGJ1c19nbGliX2JpbmRpbmdzLnB5eCAoaW5pdF9ndGhyZWFkcyk6IENoYW5nZWQgdG8gCisJZ3RocmVhZHNfaW5pdCB0byBtYXRjaCB1cCB3aXRoIHRoZSBkYnVzIGNhbGwKKworCSogcHl0aG9uL2dsaWIucHkgKGluaXRfdGhyZWFkcyk6IENoYW5nZWQgdG8gdGhyZWFkc19pbml0IHRvIG1hdGNoCisJdXAgd2l0aCBnb2JqZWN0LnRocmVhZHNfaW5pdCgpLiAgaW5pdF90aHJlYWRzIGlzIGtlcHQgZm9yIGJhY2t3YXJkcworCWNvbXBhdCBidXQgd2lsbCBtb3N0IGxpa2VseSBiZSBkZXByZWNhdGVkIGluIHRoZSBmdXR1cmUKKworCSogdGVzdC9weXRob24vdGVzdC1jbGllbnQucHk6IAorCS0gcmV2YW1wIHRvIHVzZSBQeXRob24ncyB1bml0dGVzdCBmdW5jdGlvbmFsaXR5CisJLSBhZGQgYXN5bmMgY2FsbCB0ZXN0cworCS0gc2V0dXAgdGhyZWFkcyBpbiBnbGliIGFuZCBkYnVzIHNvIHdlIG1ha2Ugc3VyZSBsb2NrcyBhcmUgd29ya2luZworCQorMjAwNS0wOC0zMCAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogcHl0aG9uL2RidXNfYmluZGluZ3MucHl4IAorCShfcGVuZGluZ19jYWxsX25vdGlmaWNhdGlvbiwgY3VucmVnaXN0ZXJfZnVuY3Rpb25faGFuZGxlciwgCisJY21lc3NhZ2VfZnVuY3Rpb25faGFuZGxlcik6IEFsbCBjYWxsYmFjayBmdW5jdGlvbnMgaGF2ZSBiZWVuIHJlYXJyYW5nZWQgCisJdG8gd29ya2Fyb3VuZCBhIGJ1ZyBpbiBQeXJleCB3aGVuIHdvcmtpbmcgd2l0aCB0aGUgR0lMIHdoaWNoIGlzIFB5dGhvbidzIAorCWdsb2JhbCBsb2NrIHdoZW4gZGVhbGluZyB3aXRoIHRocmVhZHMuICBUaGV5IGhhdmUgYmVlbiBzcGxpdCBpbnRvCisJYSB3cmFwcGVyIGZ1bmN0aW9uICh3aGljaCBhc3N1bWVzIHRoZSBuYW1lIG9mIHRoZSBvbGQgZnVuY3Rpb24pIGFuZAorCWEgX0dJTF9zYWZlXzxmdW5jdGlvbiBuYW1lPiBmdW5jdGlvbiB3aGljaCBjb250YWlucyB0aGUgZnVuY3Rpb25hbGl0eQorCW9mIHRoZSBvbGQgZnVuY3Rpb24uICBUaGlzIGVuc3VyZXMgdGhhdCBQeXJleCBkb2VzIG5vdCB3cml0ZSBjb2RlCisJdGhlIGxvY2sgaXMgcmVsZWFzZWQuCisJCisKKzIwMDUtMDgtMzAgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIHB5dGhvbi9kYnVzX2JpbmRpbmdzLnB5eCAoX3BlbmRpbmdfY2FsbF9ub3RpZmljYXRpb24pOiBPYnRhaW4gdGhlCisJR0lMIGdsb2JhbCBsb2NrIHdoZW4gY2FsbGluZyBiYWNrIGludG8gUHl0aG9uCisKKzIwMDUtMDgtMjkgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIFJlbGVhc2UgMC4zNi4yCisKKwkqIEFkZCBIYXZvYydzIHBhdGNoIHRoYXQgbmV2ZXIgZ290IGFwcGxpZWQgdG8gSEVBRCAoQnVnICMyNDM2KToKKworCSogYnVzL3BvbGljeS5jIChidXNfcG9saWN5X2FsbG93X3VzZXIpOiBjaGFuZ2UgZGVmYXVsdCAidXNlciBpcworCWFsbG93ZWQiIHRvIGJlICJ1c2VyIGhhcyBzYW1lIHVpZCBhcyB0aGUgYnVzIGl0c2VsZiI7IGFueQorCWFsbG93L2RlbnkgcnVsZXMgd2lsbCBvdmVycmlkZS4KKworCSogYnVzL3Nlc3Npb24uY29uZi5pbjogZG9uJ3QgYWxsb3cgYWxsIHVzZXJzLCBzaW5jZSBub3cgYnkgZGVmYXVsdAorCXRoZSB1c2VyIHRoYXQgcmFuIHRoZSBidXMgY2FuIGNvbm5lY3QuCisKKzIwMDUtMDgtMjYgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwkqIHRvb2xzL2RidXMtcHJpbnQtbWVzc2FnZS5jIChwcmludF9tZXNzYWdlKTogRmx1c2ggc3Rkb3V0CisJYWZ0ZXIgcHJpbnRpbmcgYSBtZXNzYWdlLCBzbyB0aGF0IHJlZGlyZWN0aW5nIHRvIGEgZmlsZSwgdGhlbgorCWhpdHRpbmcgQ3RybC1DIHdvcmtzLgorCisyMDA1LTA4LTI1ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBweXRob24vZGJ1c19iaW5kaW5ncy5weXg6IFRyYWNrZWQgZG93biBhIG1ham9yIG1lbWxlYWsgYW5kIGZpeGVkIGl0CisJKEVtcHR5TWVzc2FnZSk6IG5ldyBjbGFzcyB0aGF0IHN1YmNsYXNzZXMgTWVzc2FnZS4gIFRoaXMgaXMgYSB3b3JrYXJvdW5kCisJdG8gYSBQeXJleCBidWcgdGhhdCBmYWlscyB0byBjYWxsIF9fZGVsX18gd2hlbiB0aGUgTWVzc2FnZSBvYmplY3QgZ29lcyBvdXQKKwlvZiBzY29wZS4gIEZvciBzb21lIHJlYXNvbiBzdWJjbGFzc2luZyBNZXNzYWdlIGZpeGVzIHRoaXMgYnVnCisJKEJ1czo6c2VuZF93aXRoX3JlcGx5X2FuZF9ibG9jayk6IHVzZSBFbXB0eU1lc3NhZ2UgaW5zdGVhZCBvZiBNZXNzYWdlCisJLSBzL01lc3NhZ2UoX2NyZWF0ZT0wKS9FbXB0eU1lc3NhZ2UgZXZlcnl3aGVyZSBlbHNlCisJCisJKiB0ZXN0L3B5dGhvbi90ZXN0LXtzZXJ2ZXJ8Y2xpZW50fS5weTogYWRkIHRoZSBweXRob24vLmxpYnMgZGlyZWN0b3J5CisJdG8gdGhlIGxvb2t1cCBwYXRoIHNvIGRidXNfYmluZGluZ3MgYW5kIGRidXNfZ2xpYl9iaW5kaW5ncyBkb24ndAorCWdldCBwaWNrZWQgdXAgZnJvbSB0aGUgc3lzdGVtCisKKzIwMDUtMDgtMjUgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwkqIGdsaWIvZGJ1cy1ncHJveHkuYyAoZGJ1c19nX3Byb3h5X2NhbGwpOiBEb2MgdXBkYXRlLCB0aGFua3MKKwl0byBSeWFuIExvcnRpZSBmb3IgdGhlIHN1Z2dlc3Rpb24uCisKKzIwMDUtMDgtMjQgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIHRlc3QvcHl0aG9uOiBBZGQgcHl0aG9uIHJlZ3Jlc3Npb24gdGVzdAorCisJKiBjb25maWd1cmUuaW46IEFkZCB0ZXN0L3B5dGhvbi9NYWtlZmlsZQorCisJKiB0ZXN0L01ha2VmaWxlLmFtOiBBZGQgdGhlIHB5dGhvbiBkaXJlY3RvcnkgdG8gU1VCRElSUworCisyMDA1LTA4LTI0ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBSZWxlYXNlIDAuMzYuMQorCisJKiBweXRob24vX2RidXMucHk6IAorCShJbnRlcmZhY2U6OmNvbm5lY3RfdG9fc2lnbmFsKTogcHJvcGlnYXRlIGtleXdvcmRzIGZvciBtYXRjaCBvbiBhcmdzCisJKEJ1czo6YWRkX3NpZ25hbF9yZWNlaXZlcik6IEZpeCB0eXBvIHMvZGJ1c19pbnRlZmFjZS9kYnVzX2ludGVyZmFjZQorCisJKiBweXRob24vcHJveGllcy5weSAoUHJveHlPYmplY3Q6OmNvbm5lY3RfdG9fc2lnbmFsKToKKwlwcm9waWdhdGUga2V5d29yZHMgZm9yIG1hdGNoIG9uIGFyZ3MKKworCSogTWFrZWZpbGUuYW06IHBvaW50IGV2ZXJ5dGhpbmcgdG8gcHlleGVjZGlyIHNpbmNlIHB5dGhvbiBib3JrcworCW9uIG11bHRpbGliCisKKzIwMDUtMDgtMjMgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIFJlbGVhc2UgMC4zNgorCisyMDA1LTA4LTIzICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiB0ZXN0L2dsaWIvTWFrZWZpbGUuYW06IERvbid0IG11bHRpcGx5LWRlZmluZSBFWFRSQV9ESVNULgorCisyMDA1LTA4LTIzICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBweXRob24vZGJ1c19nbGliX2JpbmRpbmdzLnB5eDogcmVvcmRlciBpbXBvcnRzIGFuZCBjIGRlZmluaXRpb25zCisJdG8gZml4IHNvbWUgd3JhbmluZ3MuIFdlIG5vdyB1c2UgZGJ1c19iaW5kaW5ncy5EQnVzQ29ubmVjdGlvbiBpbnN0ZWFkCisJb2YgZGVmaW5pbmcgREJ1c0Nvbm5lY3Rpb24gb3Vyc2VsdmVzLgorCisyMDA1LTA4LTE4ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBweXRob24vZGJ1cy5wdGg6IE5ldyBwYXRoIGZpbGUgdG8gZml4IHVwIHByb2JsZW1zIHdoZW4gaW5zdGFsbGluZworCWMgbGlicmFyaWVzIHRvIGxpYjY0IGFuZCBweXRob24gZmlsZXMgdG8gbGliLgorCisJKiBweXRob24vTWFrZWZpbGUuYW06IGluc3RhbGwgZGJ1cy5wdGggaW4gdGhlIGNvcnJlY3Qgc3BvdAorCisyMDA1LTA4LTE3ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCSogQ2hhbmdlTG9nOiBjbGVhbiB1cCBteSBsYXN0IGVudHJ5IGEgYml0CisKKwkqIGRvYy9pbnRyb3NwZWN0LnhzbDogTmV3IHN0eWxlc2hlZXQgZm9yIGNvbnZlcnRpbmcgaW50cm9zcGVjdGlvbiBkYXRhCisJaW50byBicm93c2VyIHJlbmRlcmFibGUgeGh0bWwuIENvbnRyaWJ1dGVkIGJ5IExlbm5hcnQgUG9ldHRlcmluZy4KKworCSogZG9jL2ludHJvc3BlY3QuZHRkOiBGaXh1cHMgaW4gdGhlIGludHJvc3BlY3QgZm9ybWF0IGZyb20gTGVubmFydAorCVBvZXR0ZXJpbmcuCisKKwkqIGRvYy9kYnVzLXR1dG9yaWFsLnhtbDogCisJLSBBZGQgQ29saW4gV2FsdGVyIHRvIHRoZSBBdXRob3JzIHNlY3Rpb24gZm9yIGF1dGhvcmluZyB0aGUgR0xpYgorCXNlY3Rpb24KKwktIEFkZCBkZXNjcmlwdGlvbnMgb2YgdGhlIG5ldyBzaWduYXR1cmUgYW5kIHR5cGUgZnVuY3Rpb25hbGl0eQorCWluIHRoZSBQeXRob24gY29tcGxleCB0eXBlIG1hcHBpbmcgc2VjdGlvbgorCS0gQWRkIGEgc2lkZW5vdGUgb24gdGhlIG5ldyBhcmdzIG1hdGNoaW5nIGZ1bmN0aW9uYWxpdHkgaW4gCisJdGhlIFB5dGhvbiBiaW5kaW5ncworCS0gRml4ZWQgdXAgc29tZSBvZiB0aGUgZXhhbXBsZXMgdG8gdXNlIHRoZSBnb2JqZWN0Lk1haW5Mb29wCisJaW5zdGVhZCBvZiBndGsubWFpbgorCQorCSogcHl0aG9uL19kYnVzLnB5OgorCShCdXM6Ol9jcmVhdGVfYXJnc19kaWN0KTogTmV3LiBDb252ZXJ0cyBhIGhhc2ggb2YgYXJnIG1hdGNoZXMKKwl0byBhIG1vcmUgdXNlYWJsZSBmb3JtYXQKKwkoQnVzOjphZGRfc2lnbmFsX3JlY2VpdmVyKTogYWRkIGEgKiprZXl3b3JkcyBwYXJhbWV0ZXIgZm9yIGNhdGNoaW5nCisJYXJnIG1hdGNoIHBhcmFtZXRlcnMKKwkoQnVzOjpyZW1vdmVfc2lnbmFsX3JlY2VpdmVyKTogYWRkIGEgKiprZXl3b3JkcyBwYXJhbWV0ZXIgZm9yIGNhdGNoaW5nCisJYXJnIG1hdGNoIHBhcmFtZXRlcnMKKwkKKwkqIHB5dGhvbi9tYXRjaHJ1bGVzLnB5OgorCShNYXRjaFRyZWU6OmV4ZWNfbWF0Y2hlcyk6IENoZWNrIGZvciBhcmcgbWF0Y2hlcworCShTaWduYWxNYXRjaFJ1bGU6OmFkZF9hcmdzX21hdGNoKTogTmV3IG1ldGhvZAorCShTaWduYWxNYXRjaFJ1bGU6OmV4ZWN1dGUpOiBBZGRlZCBhcmdzX2xpc3QgcGFyYW1ldGVyIGFzIGFuIG9wdGltaXphdGlvbgorCXNvIHdlIGRvbid0IGhhdmUgdG8gbWFyc2hhbCB0aGUgYXJncyBtb3JlIHRoYW4gb25jZQorCShTaWduYWxNYXRjaFJ1bGU6Om1hdGNoX2FyZ3NfZnJvbV9saXN0KTogTmV3IG1ldGhvZCB0aGF0IGNoZWNrcyB0byBzZWUKKwlpZiB0aGUgcnVsZSdzIGFyZyBtYXRjaGVzIG1hdGNoIGFuIGFyZ3VtZW50IGxpc3QuICBPbmx5IGFyZ3VtZW50cworCXNldCBpbiB0aGUgcnVsZSBhcmUgY2hlY2tlZC4KKwkoU2lnbmFsTWF0Y2hSdWxlOjptYXRjaF9hcmdzX2Zyb21fcnVsZSk6IE5ldyBtZXRob2QgdGhhdCBjaGVja3MgdG8gc2VlCisJaWYgdGhlIHJ1bGUncyBhcmcgbWF0Y2hlcyBtYXRjaCBhbm90aGVyIHJ1bGUncy4gIEFsbCBhcmdzIGhhdmUgdG8gbWF0Y2gKKwlpbiBvcmRlciBmb3IgdGhpcyBtZXRob2QgdG8gcmV0dXJuIHRydWUuICBJZiBlaXRoZXIgcnVsZSBoYXMgbW9yZSBhcmdzCisJdGhlbiBpdCBpcyBub3QgYSBtYXRjaC4KKwkoU2lnbmFsTWF0Y2hSdWxlOjppc19tYXRjaCk6IEFkZCBhcmdzIG1hdGNoCisJKFNpZ25hbE1hdGNoUnVsZTo6cmVwcik6IEFkZCBhcmdzIHRvIHRoZSBmaW5hbCBvdXRwdXQgaWYgdGhleSBleGlzdAorCisyMDA1LTA4LTE3ICBSb3NzIEJ1cnRvbiAgPHJvc3NAYnVydG9uaW5pLmNvbT4KKworCSogZ2xpYi9kYnVzLWdwcm94eS5jOgorCShkYnVzX2dfcHJveHlfY2FsbF9ub19yZXBseSk6IHVucmVmIHRoZSBtZXNzYWdlIG9uY2Ugc2VudC4KKwkoZGJ1c19nX3Byb3h5X2NhbGwpOiBwcm90ZWN0IGFnYWluc3QgTlVMTCBwcm94eS4KKworMjAwNS0wOC0xNiAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogcHl0aG9uL19faW5pdF9fLnB5OiBWZXJzaW9uIHVwZGF0ZWQgKDAsIDQzLCAwKQorCQorCSogcHl0aG9uL2RidXNfYmluZGluZ3MucHl4OiAKKwktIEZpeGVkIHR5cGUgb2JqZWN0cyB0byBoYXZlIHNlbGYgcGFzc2VkIGludG8gX19pbml0X18KKwktIEFkZGVkIHRoZSBWYXJpYW50IHR5cGUKKwktIEFkZCB0aGUgYWJpbGl0eSB0byBzcGVjaWZ5IHR5cGVzIG9yIHNpZ25hdHVyZXMgZm9yIEFycmF5LCBWYXJpYW50IAorCWFuZCBEaWN0aW9uYXJ5CisJKENvbm5lY3Rpb246OnNlbmRfd2l0aF9yZXBseV9oYW5kbGVycyk6IHJldHVybiBhIFBlbmRpbmdDYWxsIG9iamVjdAorCShfcGVuZGluZ19jYWxsX25vdGlmaWNhdGlvbik6IGhhbmRsZSB0aGUgY2FzZSB3aGVuIGFuIGVycm9yIGlzIHJldHVybmVkIAorCXdpdGhvdXQgYW4gZXJyb3IgbWVzc2FnZSBpbiB0aGUgYm9keQorCShNZXNzYWdlSXRlcjo6Z2V0X2Jvb2xlYW4pOiByZXR1cm4gVHJ1ZSBvciBGYWxzZSBpbnN0ZWFkIG9mIGFuIGludGVnZXIKKwkoTWVzc2FnZUl0ZXI6OnB5dGhvbl92YWx1ZV90b19kYnVzX3NpZyk6IGFkZCBkaXJlY3QgY2hlY2tpbmcgb2YgdHlwZXMgCisJYW5kIGFkZCBjaGVja3MgZm9yIG9iamVjdHMgd2l0aCBlbWJlZGVkIHNpZ25hdHVyZXMgb3IgdHlwZXMgKEFycmF5LCAKKwlWYXJpYW50IGFuZCBEaWN0aW9uYXJ5KQorCShNZXNzYWdlSXRlcjo6YXBwZW5kX2J5dGUpOiBoYW5kbGUgY2FzZSB3aGVuIHRoZSB2YWx1ZSBpcyBhIGRidXMuQnl0ZQorCShNZXNzYWdlSXRlcjo6YXBwZW5kX2RpY3QpOiBoYW5kbGUgZW1iZWRlZCB0eXBlcyBvciBzaWduYXR1cmVzCisJKE1lc3NhZ2VJdGVyOjphcHBlbmRfYXJyYXkpOiBoYW5kbGUgZW1iZWRlZCB0eXBlcyBvciBzaWduYXR1cmVzCisJKE1lc3NhZ2VJdGVyOjphcHBlbmRfdmFyaWFudCk6IG5ldyBtZXRob2QKKwkKKwkqIHB5dGhvbi9wcm94aWVzLnB5OgorCShEZWZlcmVkTWV0aG9kKTogTmV3LiBEdW1teSBleGVjdXRhYmxlIG9iamVjdCB1c2VkIHdoZW4gcXVldWluZyBjYWxscyAKKwlibG9ja2luZyBvbiBpbnRyb3NwZWN0aW9uIGRhdGEKKwkoUHJveHlNZXRob2Q6Ol9fY2FsbF9fKTogYWRkIHRoZSB0aW1lb3V0IGtleXdvcmQgZm9yIHNwZWNpZnlpbmcgbG9uZ2VyIAorCW9yIHNob3J0ZXIgdGltZW91dHMgZm9yIG1ldGhvZCBjYWxscworCShQcm94eU9iamVjdCk6IEFkZCBmaXJzdCBwYXNzIGF0IGFuIGludHJvc3BlY3Rpb24gc3RhdGUgbWFjaGluZQorCShQcm94eU9iamVjdDo6X19pbml0X18pOiBBZGQgaW50cm9zcGVjdCBrZXl3b3JkIGZvciB0dXJpbmcgb2ZmIGFuIG9uIAorCWludHJvc3BlY3Rpb24uIAorCShQcm94eU9iamVjdDo6X0ludHJvc3BlY3QpOiBJbnRlcm5hbCBJbnRyb3NwZWN0IGNhbGwgdGhhdCBieXBhc3NlcyAKKwl0aGUgdXN1YWwgbWVjaGFuaXNtcyBmb3Igc2VuZGluZyBtZXNzYWdlcy4gIFRoaXMgaXMgdG8gYXZvaWQgYSBkZWFkbG9jaworCXdoZXJlIHRoZSBJbnRvc3BlY3QgY2FsbCB3b3VsZCBiZSBxdWV1ZWQgd2FpdGluZyBmb3IgdGhlIEludHJvc3BlY3QgCisJY2FsbCB0byBmaW5pc2ggOy0pCisJKFByb3h5T2JqZWN0OjpfaW50cm9zcGVjdF9yZXBseV9oYW5kbGVyKTogTmV3LiAgVGhpcyBtZXRob2QgaXMgY2FsbGVkIAorCXdoZW4gaW50cm9zcGVjdGlvbiByZXR1cm5zIHdpdGggbm8gZXJyb3IKKwkoUHJveHlPYmplY3Q6Ol9pbnRyb3NwZWN0X2Vycm9yX2hhbmRsZXIpOiBOZXcuICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgCisJd2hlbiBpbnRyb3NwZWN0aW9uIGVuY291bnRlcnMgYW4gZXJyb3IKKwkoUHJveHlPYmplY3Q6Ol9fZ2V0YXR0cl9fKTogQ29kZSB0byBoYW5kbGUgZGlmZmVyZW50IGludHJvc3BlY3Rpb24gCisJc3RhdGVzLiAgUXVldWUgYXN5bmMgY2FsbHMgb3IgYmxvY2sgYmxvY2tpbmcgY2FsbHMgaWYgd2UgYXJlIAorCWludHJvc3BlY3RpbmcuICBQYXNzIHRocm91Z2ggYXMgbm9ybWFsIGlmIHdlIGFyZSBub3Qgb3IgYXJlIGRvbmUgd2l0aCAKKwlpbnRyb3NwZWN0aW5nLgorCQorCSogcHl0aG9uL3NlcnZpY2UucHk6IEltcG9ydCBzaWduYWwgYW5kIG1ldGhvZCBmcm9tIGRlY29yYXRvcnMucHkKKworCSogcHl0aG9uL3R5cGVzLnB5OiBBZGQgVmFyaWFudCB0eXBlCisKKzIwMDUtMDgtMTYgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwkqIGdsaWIvZGJ1cy1nb2JqZWN0LmMgKGRidXNfc2V0X2dfZXJyb3IpOiBEb24ndCBsb3NlIGlmIHRoZQorCURCdXNFcnJvciBtZXNzYWdlIGlzIE5VTEwuCisKKzIwMDUtMDgtMDkgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtZXJyb3JzLmM6IGFwcGx5IHBhdGNoIGZyb20gVGltbyBUZXJhcyB0byBtYWtlIGEKKwltYWxsb2MnZCBjb3B5IG9mIHRoZSBuYW1lIHBhcmFtZXRlcgorCisyMDA1LTA4LTA5ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAoZGJ1c19tZXNzYWdlX3NldF9yZXBseV9zZXJpYWwpOiBwcmludAorCXdhcm5pbmcgaWYgdGhlIHJlcGx5IHNlcmlhbCBpcyBzZXQgdG8gMAorCisyMDA1LTA4LTA0ICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiBnbGliL2RidXMtZ3ZhbHVlLXV0aWxzLmggKF9kYnVzX2dfdHlwZV9zcGVjaWFsaXplZF9idWlsdGluc19pbml0KQorCShkYnVzX2dfdHlwZV9pc19maXhlZCwgZGJ1c19nX3R5cGVfZml4ZWRfZ2V0X3NpemUpCisJKGRidXNfZ3ZhbHVlX3NldF9mcm9tX3BvaW50ZXIsIGRidXNfZ19oYXNoX3RhYmxlX3ZhbHVlX2ZvcmVhY2gpCisJKGRidXNfZ19oYXNoX3RhYmxlX2luc2VydF92YWx1ZXMsIGRidXNfZ19oYXNoX3RhYmxlX2luc2VydF9zdGVhbF92YWx1ZXMpCisJKGRidXNfZ3R5cGVfaXNfdmFsaWRfaGFzaF9rZXksIGRidXNfZ3R5cGVfaXNfdmFsaWRfaGFzaF92YWx1ZSkKKwkoZGJ1c19nX2hhc2hfZnVuY19mcm9tX2d0eXBlLCBkYnVzX2dfaGFzaF9mcmVlX2Zyb21fZ3R5cGUpCisJKGRidXNfZ19oYXNoX2VxdWFsX2Zyb21fZ3R5cGUsIGRidXNfZ3ZhbHVlX3N0b3IsIGRidXNfZ3ZhbHVlX3Rha2UpOgorCSogZ2xpYi9kYnVzLWd2YWx1ZS5oIChkYnVzX2dfdmFsdWVfdHlwZXNfaW5pdCkKKwkoZGJ1c19ndmFsdWVfZGVtYXJzaGFsLCBkYnVzX2d2YWx1ZV9kZW1hcnNoYWxfdmFyaWFudCkKKwkoZGJ1c19ndmFsdWVfZGVtYXJzaGFsX21lc3NhZ2UsIGRidXNfZ3ZhbHVlX21hcnNoYWwpOgorCQorCVByZWZpeCBuYW1lIHdpdGggXyB0byBlbnN1cmUgdGhleSdyZSBub3QgZXhwb3J0ZWQuICBBbGwgY2FsbGVycworCXVwZGF0ZWQuCisKKwkqIGdsaWIvZGJ1cy1ndmFsdWUuYyAodHlwZWNvZGVfdG9fZ3R5cGUpCisJKGRidXNfdHlwZWNvZGVfbWFwc190b19iYXNpYywgYmFzaWNfdHlwZWNvZGVfdG9fZ3R5cGUpCisJKHNpZ25hdHVyZV9pdGVyX3RvX2dfdHlwZV9kaWN0KQorCShzaWduYXR1cmVfaXRlcl90b19nX3R5cGVfYXJyYXkpCisJKGRidXNfZ3R5cGVfZnJvbV9zaWduYXR1cmVfaXRlciwgZGJ1c19ndHlwZV9mcm9tX3NpZ25hdHVyZSkKKwkoZGJ1c19ndHlwZXNfZnJvbV9hcmdfc2lnbmF0dXJlKToKKwlNb3ZlIHRvIGRidXMtZ3NpZ25hdHVyZS5jLgorCisJKiBnbGliL2RidXMtYmluZGluZy10b29sLWdsaWIuYyAoZGJ1c19iaW5kaW5nX3Rvb2xfb3V0cHV0X2dsaWJfc2VydmVyKTogQ2FsbAorCWRidXNfZ190eXBlX3NwZWNpYWxpemVkX2J1aWx0aW5zX2luaXQgaW5zdGVhZCBvZiBkYnVzX2dfdmFsdWVfdHlwZXNfaW5pdC4KKwkoZGJ1c19iaW5kaW5nX3Rvb2xfb3V0cHV0X2dsaWJfY2xpZW50KTogRGl0dG8uCisKKwkqIGdsaWIvTWFrZWZpbGUuYW0gKERCVVNfR0xJQl9JTlRFUk5BTFMpOiBBZGQgZGJ1cy1nc2lnbmF0dXJlLmMKKwlhbmQgZGJ1cy1nc2lnbmF0dXJlLmgKKworCSogdGVzdC9nbGliL3Rlc3Qtc2VydmljZS1nbGliLmMgKG15X29iamVjdF9yZWNfYXJyYXlzKTogRGVsZXRlCisJdW51c2VkIHZhcmlhYmxlLgorCisyMDA1LTA4LTAzICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiBnbGliL2RidXMtZ29iamVjdC5jOiBBZGQgdGVzdHMgb24gaGFyZGNvZGVkIG9iamVjdCBpbmZvOyB0aGlzIHNob3VsZAorCWNhdGNoIGFueSBpbmNvbXBhdGlibGUgY2hhbmdlcyBhY2NpZGVudGFsbHkgbWFkZS4KKworMjAwNS0wOC0wMyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMgKF9kYnVzX3JlYWRfY3JlZGVudGlhbHNfdW5peF9zb2NrZXQpOiBmaXgKKwl0eXBvLCBmcm9tIEp1bGllbiBQdXlkdAorCisJKiBidXMvY29ubmVjdGlvbi5jIChidXNfY29ubmVjdGlvbl9kaXNjb25uZWN0ZWQpOiB3ZSB3ZXJlIGFsd2F5cworCWRvaW5nIGEgd2FpdF9mb3JfbWVtb3J5IGR1ZSB0byBhIGJ1Z2d5IGxvb3AsIGZvdW5kIGJ5IFRpbW8gSG9lbmlnCisKKzIwMDUtMDgtMDEgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwlQYXRjaCBmcm9tIEpvZSBNYXJrdXMgQ2xhcmtlOgkKKwkKKwkqIGdsaWIvZGJ1cy1naWRsLmMgKHByb3BlcnR5X2luZm9fdW5yZWYsIGFyZ19pbmZvX3VucmVmKTogRml4CisJdXNlLWFmdGVyLWZyZWUuCisKKzIwMDUtMDgtMDEgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisJCisJUGF0Y2ggZnJvbSBKb2UgTWFya3VzIENsYXJrZToJCisJCisJKiB0b29scy9kYnVzLXNlbmQuYyAobWFpbik6IAorCQorCURvbid0IHVzZSBDOTkgc3R5bGUgaW5pdGlhbGl6ZXJzIChidWcgIzM5MzMpLgorCQorMjAwNS0wOC0wMSAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCVBhdGNoIGZyb20gSm9lIE1hcmt1cyBDbGFya2U6CQorCisJKiBnbGliL2RidXMtZ3ZhbHVlLmMgKGRidXNfZ192YWx1ZV90eXBlc19pbml0KTogCisJKiBnbGliL2RidXMtZ3ZhbHVlLXV0aWxzLmMgKGRidXNfZ190eXBlX3NwZWNpYWxpemVkX2J1aWx0aW5zX2luaXQpIAorCSogZ2xpYi9kYnVzLWdvYmplY3QuYyAod3JpdGVfaW50ZXJmYWNlKToKKworCURvbid0IHVzZSBDOTkgc3R5bGUgaW5pdGlhbGl6ZXJzIChidWcgIzM5MzMpLgorCisyMDA1LTA3LTMxICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogdG9vbHMvZGJ1cy12aWV3ZXIuYyAobG9hZF9jaGlsZF9ub2Rlcyk6IGZpeCBpbnZvY2F0aW9uIG9mCisJZGJ1c19nX3Byb3h5X2NhbGwsIGZpeCBmcm9tIFBpb3RyIFppZWxpbnNraSBidWcgIzM5MjAKKworMjAwNS0wNy0zMCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGZpeCBhIGJ1bmNoIG9mIERveHlnZW4gd2FybmluZ3MgYW5kIG1pc3Rha2VzCisKKzIwMDUtMDctMzAgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jIChfZGJ1c19zdHJpbmdfcGFyc2VfdWludCk6IHJlbW92ZSAjaWZkZWYKKwlEQlVTX0JVSUxEX1RFU1RTIHNpbmNlIGl0J3Mgbm93IHVzZWQgaW4gcHJvZHVjdGlvbiBjb2RlCisKKzIwMDUtMDctMjkgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiB0ZXN0L2dsaWIvdGVzdC1wcm9maWxlLmMgKHdyaXRlX2p1bmspOiBpbml0aWFsaXplIHRoZSBqdW5rCisJYnVmZmVyIHNvIHZhbGdyaW5kIGRvZXNuJ3QgaGF2ZSBhIGJyZWFrZG93bgorCisyMDA1LTA3LTI5ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogYnVzL3NpZ25hbHMuYyAoYnVzX3NpZ25hbHNfdGVzdCk6IGFkZCBtYXRjaF9ydWxlX2VxdWFsKCkgdGVzdHMKKwkobWF0Y2hfcnVsZV9tYXRjaGVzKTogcmVtb3ZlIHVudXNlZCBhcmcKKwkodGVzdF9tYXRjaGluZyk6IGFkZCB0ZXN0cyBmb3IgbWF0Y2hfcnVsZV9tYXRjaGVzKCkKKworCSogYnVzL3NpZ25hbHMuYyAoYnVzX21hdGNoX3J1bGVfcGFyc2VfYXJnX21hdGNoKTogYWRkIGFiaWxpdHkgdG8KKwlkbyBhcmcwPSdmb28nIGFyZzU9J2JhcicgaW4gdGhlIG1hdGNoIHJ1bGVzCisJKG1hdGNoX3J1bGVfbWF0Y2hlcyk6IGRvbid0IG1hdGNoIGlmIHRoZSBhcmcwPSdmb28nIGRvZXNuJ3QgbWF0Y2guCisKKwkqIGRidXMvZGJ1cy1wcm90b2NvbC5oIChEQlVTX01BWElNVU1fTUFUQ0hfUlVMRV9BUkdfTlVNQkVSKTogYWRkIHRoaXMKKworMjAwNS0wNy0yOSAgUm9zcyBCdXJ0b24gIDxyb3NzQG9wZW5lZGhhbmQuY29tPgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jOgorCURvbid0IGNyZWF0ZSBhIERCdXNDb25kVmFyIHdoaWNoIGlzIG5ldmVyIHVzZWQuCisKKzIwMDUtMDctMjcgIFJvc3MgQnVydG9uICA8cm9zc0BvcGVuZWRoYW5kLmNvbT4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYzoKKwlSZWR1Y2UgdGhlIHNpemUgb2YgdGhlIG1heGltdW0gY2FjaGVkIG1lc3NhZ2UgdG8gMTBLLgorCisyMDA1LTA3LTI1ICBSb3NzIEJ1cnRvbiAgPHJvc3NAb3BlbmVkaGFuZC5jb20+CisKKwkqIGdsaWIvZGJ1cy1ncHJveHkuYzoKKwlSZW1vdmUgbWF0Y2hlcyB3aGVuIGFsbCBwcm94aWVzIGFyZSB1bnJlZ2lzdGVyZWQuCisKKzIwMDUtMDctMjQgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwkqIGdsaWIvZGJ1cy1ndmFsdWUuYyAoc2lnbmF0dXJlX2l0ZXJfdG9fZ190eXBlX2FycmF5KTogRG9uJ3QgcmVxdWlyZQorCXR5cGVkYXRhOyByZWN1cnNpdmUgYXJyYXlzIHdvbid0IGhhdmUgaXQuCisKKwkqIHRlc3QvZ2xpYi90ZXN0LWRidXMtZ2xpYi5jOgorCSogdGVzdC9nbGliL3Rlc3Qtc2VydmljZS1nbGliLmM6CisJKiB0ZXN0L2dsaWIvdGVzdC1zZXJ2aWNlLWdsaWIueG1sOiBBZGQgcmVjdXJzaXZlIGFycmF5cyB0ZXN0cy4KKwkKKzIwMDUtMDctMjAgIEpvaG4gKEo1KSBQYWxtaWVpciAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIHB5dGhvbi9fZGJ1cy5weSwgX3V0aWwucHksIGRlY29yYXRvcnMucHksIGV4dHJhY3QucHksIG1hdGNocnVsZXMucHkuCisJcHJveGllcy5weSwgc2VydmljZS5weTogQ2xlYW51cCBvZiBjb2RlIGFmdGVyIHJ1bm5pbmcgaXQgdGhyb3VnaCB0aGUKKwlweWZsYWtlcyBjb2RlIGNoZWNrZXIgbW9zdGx5IGRlYWxpbmcgd2l0aCB1bmRlZmluZWQgbmFtZXMuICAKKwkoQnVnICMzODI4LCBQYXRjaCBmcm9tIEFudGhvbnkgQmF4dGVyIDxhbnRob255QGludGVybGluay5jb20uYXU+KQorCisyMDA1LTA3LTE3ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBORVdTOiBVcGRhdGUgdG8gMC4zNS4yCisKKzIwMDUtMDctMTcgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIHB5dGhvbi9fZGJ1cy5weTogUmVtb3ZlIGltcG9ydCBvZiB0aGUgZGJ1cy5zZXJ2aWNlcworCW1vZHVsZSBhcyBpdCBubyBsb25nZXIgZXhpc3RzIChwYXRjaCBmcm9tIERpbWl0dXIgS2lyb3YpCisKKwkqIHB5dGhvbi9zZXJ2aWNlLnB5IChPYmplY3Q6Ol9faW5pdF9fKTogRml4ZWQgdHlwbworCXMvbmFtZS9idXNfbmFtZSAocGF0Y2ggZnJvbSBEaW1pdHVyIEtpcm92KQorCisJKiBweXRob24vZXhhbXBsZXMvZXhhbXBsZS1zaWduYWwtZW1pdHRlci5weTogaW1wb3J0IGRidXMuZ2xpYgorCXRvIGdldCB0aGUgbWFpbiBsb29wIGFuZCB1c2UgZ2xpYiBtYWlubG9vcCBpbnN0ZWFkIG9mIGd0ayBzbworCVggZG9lc24ndCBoYXZlIHRvIGJlIHJ1bm5pbmcuCisKKwkqIHB5dGhvbi9leGFtcGxlcy9leGFtcGxlLXNpZ25hbC1yZWNpcGllbnQucHk6IGltcG9ydCBkYnVzLmdsaWIKKwl0byBnZXQgdGhlIG1haW4gbG9vcCBhbmQgdXNlIGdsaWIgbWFpbmxvb3AgaW5zdGVhZCBvZiBndGsgc28KKwlYIGRvZXNuJ3QgaGF2ZSB0byBiZSBydW5uaW5nLiBJbXBvcnQgdGhlIGRlY29yYXRvcnMgbW9kdWxlCisJZGlyZWN0bHkuCisKKwkqIHRlc3QvZ2xpYi9NYWtlZmlsZS5hbTogIEFkZGVkIERJU1RfRVhUUkEgZmlsZXMgdGhhdCBkaXN0Y2hlY2sKKwlkaWRuJ3QgcGljayB1cCBvbiBidXQgYXJlIG5lZWRlZCB0byBidWlsZAorCisJKiBjb25maWd1cmUuaW46IHVwcGVkIHZlcnNpb24gdG8gMC4zNS4yCisKKwkqIGJ1cy9kcml2ZXIuYywgYnVzL3NlbGludXguYywgYnVzL3NlbGludXguaCwgZGJ1cy9kYnVzLXByb3RvY29sLmg6CisJYWRkZWQgQ29saW4gV2FsdGVycycgU0VMaW51eCBBUEkgcmVuYW1lIHBhdGNoIGZyb20gaGVhZCAKKwlzL3VuaXggc2VyY3VyaXR5IGNvbnRleHQvc2VsaW51eCBzZWN1cml0eSBjb250ZXh0LworCisyMDA1LTA3LTE2ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBweXRob24vTWFrZWZpbGUuYW06IGRidXNfYmluZGluZy5weGQuaW4gc2hvdWxkIGJlIGluY2x1ZGVkIAorCWluIEVYVFJBX0RJU1Qgbm90IGRidXNfYmluZGluZy5weGQKKwlmaXggdXAgJChzcmNkaXIpIGhvcGVmdWxseSBmb3IgdGhlIGxhc3QgdGltZQorCisJKiBORVdTOiBVcGRhdGUgdG8gMC4zNS4xCisKKzIwMDUtMDctMTYgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwkqIGJ1cy9kcml2ZXIuYyAoYnVzX2RyaXZlcl9oYW5kbGVfZ2V0X2Nvbm5lY3Rpb25fc2VsaW51eF9zZWN1cml0eV9jb250ZXh0KTogUmVuYW1lZAorCWZyb20gYnVzX2RyaXZlcl9oYW5kbGVfZ2V0X2Nvbm5lY3Rpb25fdW5peF9zZWN1cml0eV9jb250ZXh0LiAgVXBkYXRlIGZvcgorCWVycm9yIHVzYWdlLgorCShtZXNzYWdlX2hhbmRsZXJzKTogVXBkYXRlIGZvciByZW5hbWVzLgorCisJKiBidXMvc2VsaW51eC5jIChidXNfc2VsaW51eF9hbGxvd3Nfc2VuZCk6IEhhbmRsZSBPT00gb24KKwlfZGJ1c19zdHJpbmdfaW5pdCBmYWlsdXJlIGNvcnJlY3RseS4KKwkoYnVzX3NlbGludXhfYXBwZW5kX2NvbnRleHQpOiBDb252ZXJ0IFNJRCB0byBjb250ZXh0LiAgQXBwZW5kIGl0CisJYXMgYSBieXRlIGFycmF5LgorCShidXNfc2VsaW51eF9zaHV0ZG93bik6IEhhbmRsZSB0aGUgY2FzZSB3aGVyZSBidXNfc2VsaW51eF9mdWxsX2luaXQKKwloYXNuJ3QgYmVlbiBjYWxsZWQuCisKKwkqIGJ1cy9zZWxpbnV4Lmg6IFVwZGF0ZSBwcm90b3R5cGUuCisKKwkqIGRidXMvZGJ1cy1wcm90b2NvbC5oIChEQlVTX0VSUk9SX1NFTElOVVhfU0VDVVJJVFlfQ09OVEVYVF9VTktOT1dOKTogUmVuYW1lZAorCWZyb20gREJVU19FUlJPUl9VTklYX1NFQ1VSSVRZX0NPTlRFWFRfVU5LTk9XTi4KKworMjAwNS0wNy0xNSAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogZG9jL1RPRE86IEFkZCBub3RlIGFib3V0IGNvbnZlbmllbmNlIHdyYXBwZXJzLgorCisyMDA1LTA3LTE1ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBORVdTOiBVcGRhdGUgdG8gMC4zNQorCisyMDA1LTA3LTE1ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBnbGliL01ha2VmaWxlLmFtOiBBZGQgbWFrZS1kYnVzLWdsaWItZXJyb3Itc3dpdGNoLnNoIHRvIEVYVFJBX0RJU1QKKwlzbyBkaXN0Y2hlY2sgZG9lc24ndCBmYWlsCisKKwkqIGdsaWIvZXhhbXBsZXMvTWFrZWZpbGUuYW06IEFkZCBleGFtcGxlLXNlcnZpY2UueG1sIGFuZCAKKwlleGFtcGxlLXNpZ25hbC1lbWl0dGVyLnhtbCB0byBFWFRSQV9ESVNUIHNvIGRpc3RjaGVjayBkb2Vzbid0IGZhaWwKKworCSogZ2xpYi9leGFtcGxlcy9zdGF0ZW1hY2hpbmUvTWFrZWZpbGUuYW06IEFkZCBzdGF0ZW1hY2hpbmUueG1sIGFuZAorCXN0YXRlbWFjaGluZS1zZXJ2ZXIueG1sIHRvIEVYVFJBX0RJU1Qgc28gZGlzdGNoZWNrIGRvZXNuJ3QgZmFpbAorCisJKiBweXRob24vTWFrZWZpbGUuYW06IFByZXByZW5kICQoc3JjZGlyKS8gdG8gc291cmNlIGZpbGVzIHNvIHRoZQorCWNvbXBpbGVyIGxvb2tzIGluIHRoZSByaWdodCBwbGFjZXMgZHVyaW5nIGRpc3RjaGVjaworCisyMDA1LTA3LTE1ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBnbGliL2V4YW1wbGUvTWFrZWZpbGUuYW06IEZpeCBhIHR5cG8gd2hpY2ggY2F1c2UgbWFrZSBkaXN0Y2hlY2sKKwl0byBmYWlsCisKKzIwMDUtMDctMTUgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIHB5dGhvbi9leGFtcGxlcy9leGFtcGxlLXNlcnZpY2UucHksCisJcHl0aG9uL2V4YW1wbGVzL2V4YW1wbGUtc2lnbmFsLWVtaXR0ZXIucHk6IEZpeGVkIHVwIGV4YW1wbGVzCisJZm9yIEFQSSBjaGFuZ2VzCisKKzIwMDUtMDctMTUgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIHB5dGhvbi9fX2luaXRfXy5weTogVXBwZWQgdG8gdmVyc2lvbiAoMCw0MiwwKSBiZWNhdXNlIG9mCisJdGhlIEFQSSBjaGFuZ2UKKworMjAwNS0wNy0xNSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogQ2hhbmdlTG9nOiBmaXggZGF0ZSBpbiBsYXN0IGVudHJ5CisKKwkqIGNvbmZpZ3VyZS5pbiwgYnVzL3N5c3RlbS5jb25mLmluOiBhZGQgdGhlIGFiaWxpdHkgdG8gY29uZmlndXJlIAorCXRoZSBzeXN0ZW0gYnVzIHVzZXIgYXQgY29tcGlsZXRpbWUgd2l0aCB0aGUgLS13aXRoLWRidXMtdXNlciBmbGFnCisJKHBhdGNoIGZyb20gS3Jpc3RvZiBWYW5zYW50KQorCisyMDA1LTA3LTE1ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBidXMvZGlzcGF0Y2guYywgdGVzdC90ZXN0LXNlcnZpY2UuYzogQWRkIHRlc3RjYXNlCisJZm9yIHNlbmRpbmcgbWVzc2FnZXMgdG8gb25lc2VsZiAoVE9ETyBpdGVtKS4KKworCSogcHl0aG9uL3NlcnZpY2UucHkgKGNsYXNzIE9iamVjdCk6IFN3YXAgb3JkZXJpbmcgb2YgYnVzX25hbWUgCisJYW5kIG9iamVjdF9wYXRoIHBhcmFtZXRlcnMgdG8gYmV0dGVyIHN1cHBvcnQgaW5oZXJpdGFuY2UuCisKKwkqIGRvYy9kYnVzLXR1dG9yaWFsLnhtbDogY2hhbmdlIFB5dGhvbiBkb2NzIHRvIHJlZmxlY3QgY2hhbmdlCisJaW4gcGFyYW1ldGVyIG9yZGVyaW5nIGFuZCBmaXggdGhlIGluaGVyaXRhbmNlIHNlY3Rpb24uCisKKwkqIGRvYy9UT0RPOiByZW1vdmUgc2VuZGluZyBtZXNzYWdlIHRvIG9uZXNlbGYgVE9ETyBpdGVtCisKKzIwMDUtMDctMTUgIFJvc3MgQnVydG9uICA8cm9zc0BvcGVuZWRoYW5kLmNvbT4KKworCSogZ2xpYi9kYnVzLWdwcm94eS5jOgorCUZpeCBhIGxlYWsgd2hlbiBjYWxsaW5nIG1ldGhvZHMgdmlhIHRoZSBwcm94eS4KKworMjAwNS0wNy0xNSAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogYnVzL3NlbGludXguYyAoYnVzX3NlbGludXhfYXBwZW5kX2NvbnRleHQpOiBXcmFwIGluCisJSEFWRV9TRUxJTlVYLgorCisyMDA1LTA3LTE0ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBweXRob24vX2RidXMucHkgKEJ1czo6cmVtb3ZlX3NpZ25hbF9yZWNlaXZlcik6CisJZG9uJ3QgYWRkIGEgY2FsbGJhY2sgdG8gdGhlIG1hdGNoIGlmIG5vbmUgaGFzIGJlZW4gcGFzc2VkIGluCisJCisJKiBweXRob24vbWF0Y2hydWxlcy5weSAoU2lnbmFsTWF0Y2hUcmVlOjpyZW1vdmUpOiBpZiB0aGUgcnVsZQorCWJlaW5nIG1hdGNoZWQgZG9lcyBub3QgaGF2ZSBhIGNhbGxiYWNrIHRyZWF0IGl0IGFzIGEgd2lsZGNhcmQKKwlmaXggbWF0Y2hpbmcgbG9naWMKKworCSogZG9jL2RidXMtdHV0b3JpYWwueG1sOiBBZGQgUHl0aG9uIHR1dG9yaWFsCisKKzIwMDUtMDctMTQgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwkqIGJ1cy9kcml2ZXIuYworCShidXNfZHJpdmVyX2hhbmRsZV9nZXRfY29ubmVjdGlvbl91bml4X3NlY3VyaXR5X2NvbnRleHQpOiBOZXcgZnVuY3Rpb24uCisJKG1lc3NhZ2VfaGFuZGxlcnMpOiBBZGQuCisKKwkqIGJ1cy9zZWxpbnV4LmMgKGJ1c19zZWxpbnV4X2FwcGVuZF9jb250ZXh0KTogTmV3IGZ1bmN0aW9uOyBhcHBlbmRzCisJc2VjdXJpdHkgY29udGV4dCB0byBtZXNzYWdlLgorCisJKiBidXMvc2VsaW51eC5oOiBQcm90b3R5cGUuCisKKwkqIGRidXMvZGJ1cy1wcm90b2NvbC5oIChEQlVTX0VSUk9SX1VOSVhfU0VDVVJJVFlfQ09OVEVYVF9VTktOT1dOKTogTmV3LgorCisyMDA1LTA3LTE0ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBidXMvYWN0aXZhdGlvbi5jOiBjbGVhbiB1cCBhbGwgdGFicyB0byBiZSA4IHNwYWNlcyAKKwkoYnVzX2FjdGl2YXRpb25fYWN0aXZhdGVfc2VydmljZSk6IG1ha2Ugc3VyZSB3ZSBjbGVhbiB1cAorCWlmIGFjdGl2YXRpb24gZmFpbHMKKworCSogYnVzL2Rpc3BhdGNoLmM6IGNsZWFuIHVwIGFsbCB0YWJzIHRvIGJlIDggc3BhY2VzIAorCShjaGVja19zaGVsbF9mYWlsX3NlcnZpY2VfYXV0b19zdGFydCk6IE5ldyBmdW5jdGlvbgorCXRlc3RzIHRvIG1ha2Ugc3VyZSB3ZSBnZXQgZmFpbCBwcm9wZXJseSB3aGVuIHRyeWluZyB0byBhdXRvIHN0YXJ0IGEgc2VydmljZQorCXdpdGggYSBmYXVsdHkgY29tbWFuZCBsaW5lCisJKGNoZWNrX3NoZWxsX3NlcnZpY2Vfc3VjY2Vzc19hdXRvX3N0YXJ0KTogTmV3IGZ1bmN0aW9uIHRlc3RzIHRvIG1ha2Ugc3VyZQorCWF1dG8gc3RhcnRlZCBzZXJ2aWNlcyBnZXQgdGhlIGFyZ3VtZW50cyBvbiB0aGUgY29tbWFuZCBsaW5lCisKKwkqIHRlc3QvdGVzdC1zaGVsbC1zZXJ2aWNlLmM6IEFkZGVkIHNlcnZpY2UgZm9yIHRlc3RpbmcgYXV0by1zdGFydGluZyB3aXRoIAorCWNvbW1hbmQgbGluZSBhcmd1bWVudHMKKworCSogdGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMvZGVidWctc2hlbGwtZWNoby1mYWlsLnNlcnZpY2UuaW4sIAorCXRlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzL2RlYnVnLXNoZWxsLWVjaG8tc3VjY2Vzcy5zZXJ2aWNlLmluOgorCUFkZGVkIHNlcnZpY2UgZmlsZXMgZm9yIHRlc3RpbmcgYXV0by1zdGFydGluZyB3aXRoIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKKworCSogKi8uY3ZzaWdub3JlOiBhZGRlZCBhIGJ1bmNoIG9mIGdlbmVyYXRlZCBmaWxlcyB0byB2YXJpb3VzIC5jdnNpZ25vcmUgZmlsZXMKKworMjAwNS0wNy0xNCAgUm9kcmlnbyBNb3lhICA8cm9kcmlnb0Bub3ZlbGwuY29tPgorCisJKiBkYnVzL2RidXMtc2hlbGwuW2NoXTogY29weS9wYXN0ZWQgY29kZSBmcm9tIEdMaWIuCisJCisJKiBkYnVzL01ha2VmaWxlLmFtOiBhZGRlZCBuZXcgZmlsZXMgdG8gYnVpbGQuCisKKwkqIGJ1cy9hY3RpdmF0aW9uLmMgKGJ1c19hY3RpdmF0aW9uX2FjdGl2YXRlX3NlcnZpY2UpOiBzdXBwb3J0CisJYWN0aXZhdGlvbiBjb21tYW5kcyB3aXRoIHBhcmFtZXRlcnMuCisKKwkqIHRlc3Qvc2hlbGwtdGVzdC5jOiBhZGRlZCB0ZXN0IHByb2dyYW0gZm9yIHRoZSBzaGVsbCBwYXJzaW5nCisJY29kZS4KKworMjAwNS0wNy0xMyAgRGF2aWQgWmV1dGhlbiAgPGRhdmlkekByZWRoYXQuY29tPgorCisJKiB0b29scy9kYnVzLXNlbmQuYyAoYXBwZW5kX2FyZywgdHlwZV9mcm9tX25hbWUpOiBBbHNvIHN1cHBvcnQgMTYgYW5kCisJNjQgYml0IHNpZ25lZCBhbmQgdW5zaWduZWQgcGFyYW1ldGVycworCisyMDA1LTA3LTEzICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBweXRob24vLmN2c2lnbm9yZTogcmVtb3ZlIGRidXNfYmluZGluZ3MucHl4LCBhZGQgZGJ1c19iaW5kaW5ncy5weGQKKworCSogcHl0aG9uL3NlcnZpY2UucHkgKGNsYXNzIE5hbWUpOiByZW5hbWVkIEJ1c05hbWUgdG8gbWFrZSBpdCBjbGVhcmVyCisJd2hhdCB0aGUgb2JqZWN0IGlzIGZvciAoYSBuYW1lIG9uIHRoZSBidXMpCisKKwkqIHB5dGhvbi9leGFtcGxlcy9leGFtcGxlLXNlcnZpY2UucHksCisJcHl0aG9uL2V4YW1wbGVzL2V4YW1wbGUtc2lnbmFsLWVtaXR0ZXIucHk6IGNoYW5nZSB0aGUgTmFtZSBvYmplY3QgdG8KKwlCdXNOYW1lCisKKzIwMDUtMDctMTIgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwlQYXRjaCBmcm9tIEppbSBHZXR0eXMgPEppbS5HZXR0eXNAaHAuY29tPi4KKworCSogdG9vbHMvZGJ1cy1sYXVuY2guYzogSW5jbHVkZSBzeXMvc2VsZWN0LmguCisKKzIwMDUtMDctMTIgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisJKiBweXRob24vZGJ1c19iaW5kaW5ncy5weXguaW46IHJlbW92ZWQKKworCSogcHl0aG9uL2RidXNfYmluZGluZ3MucHl4OiBBZGRlZC4KKwktIEZpeGVkIHNvbWUgbWVtbGVha3MgKHBhdGNoIGZyb20gCisJU2VhbiBNZWluZXJzIDxzZWFuLm1laW5lcnNAbGluc3BpcmVpbmMuY29tPikKKwktIEJyb2tlIG91dCB0aGUgI2luY2x1ZGUgImRidXNfaF93cmFwcGVyLmgiIGFuZCBwdXQgaXQgaW4gaXRzCisJb3duIHB4ZCBmaWxlIChQeXJleCBkZWZpbml0aW9uKQorCS0gQnJva2Ugb3V0IGdsaWIgZGVwZW5kYW5jaWVzIGludG8gaXRzIG93biBweXggbW9kdWxlCisJCisJKiBweXRob24vZGJ1c19iaW5kaW5ncy5wZHg6IEFkZGVkLgorCS0gRGVmaW5lcyBDIGNsYXNzIENvbm5lY3Rpb24gZm9yIGV4cG9ydGluZyB0byBvdGhlciBtb2R1bGVzCisKKwkqIHB5dGhvbi9kYnVzX2dsaWJfYmluZGluZ3MucHl4OiBBZGRlZC4KKwktIE5ldyBtb2R1bGUgdG8gaGFuZGxlIGxvd2xldmVsIGRidXMtZ2xpYiBtYWlubG9vcCBpbnRlZ3JhdGlvbgorCisJKiBweXRob24vZ2xpYi5weTogQWRkZWQuCisJLSBSZWdpc3RlcnMgdGhlIGdsaWIgbWFpbmxvb3Agd2hlbiB5b3UgaW1wb3J0IHRoaXMgbW9kdWxlCisKKwkqIHB5dGhvbi9zZXJ2aWNlcy5weTogUmVtb3ZlZCAocmVuYW1lZCB0byBzZXJ2aWNlLnB5KQorCQorCSogcHl0aG9uL3NlcnZpY2UucHk6IEFkZGVkLgorCS0gKGNsYXNzIFNlcnZlcik6IHJlbmFtZWQgTmFtZQorCisJKiBweXRob24vX19pbml0X18ucHk6IEJ1bXAgcm8gdmVyc2lvbiAoMCw0MSwwKQorCS1kb24ndCBpbXBvcnQgdGhlIGRlY29yYXRvcnMgb3Igc2VydmljZSBtb2R1bGUKKwlieSBkZWZhdWx0LiAgVGhlc2Ugbm93IHJlc2lkZSBpbiB0aGUgZGJ1cy5zZXJ2aWNlIG5hbWVzcGFjZQorCisJKiBweXRob24vX2RidXMucHkgKEJ1czo6X19pbml0X18pOiBBZGQgY29kZSBydW4gdGhlIG1haW4gbG9vcCAKKwlzZXR1cCBmdW5jdGlvbiBvbiBjcmVhdGlvbiAKKworCSogcHl0aG9uL2V4YW1wbGVzL2V4YW1wbGUtc2VydmljZS5weSwKKwlweXRob24vZXhhbXBsZXMvZXhhbXBsZS1zaWduYWwtZW1pdHRlci5weTogdXBkYXRlIGV4YW1wbGVzCisKKwkqIHB5dGhvbi9leGFtcGxlcy9nY29uZi1wcm94eS1zZXJ2aWNlLnB5LAorCXB5dGhvbi9leGFtcGxlcy9nY29uZi1wcm94eS1zZXJ2aWNlMi5weTogVE9ETyBmaXggdGhlc2UgdXAKKworCSogZG9jL1RPRE86IEFkZGl0aW9uCisJLSBBZGRlZCBhIFB5dGhvbiBCaW5kaW5ncyAxLjAgc2VjdGlvbgorCS0gYWRkZWQgIkFkZCBtYXRjaCBvbiBhcmdzIG9yIG1hdGNoIG9uIGRldGFpbHMgdG8gbWF0Y2ggcnVsZXMiCisKKworMjAwNS0wNy0xMiAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogZ2xpYi9leGFtcGxlcy9zdGF0ZW1hY2hpbmUvTWFrZWZpbGUuYW0gKHN0YXRlbWFjaGluZS1zZXJ2ZXItZ2x1ZS5oKSAKKwkoc3RhdGVtYWNoaW5lLWdsdWUuaCk6IAorCSogZ2xpYi9leGFtcGxlcy9NYWtlZmlsZS5hbSAoZXhhbXBsZS1zZXJ2aWNlLWdsdWUuaCkgCisJKGV4YW1wbGUtc2lnbmFsLWVtaXR0ZXItZ2x1ZS5oKTogCisJKiBnbGliL01ha2VmaWxlLmFtIChkYnVzLWdsaWItZXJyb3Itc3dpdGNoLmgpOiAKKwlBZGQgbGlidG9vbCAtLW1vZGU9ZXhlY3V0ZSBzbyB3ZSB1c2UgdGhlIGJ1aWx0IGxpYnJhcnkgaW5zdGVhZAorCW9mIGFueSBpbnN0YWxsZWQgb25lLgorCisyMDA1LTA3LTExICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiBnbGliL2RidXMtZ3ZhbHVlLmMgKHN0cnVjdCBfREJ1c0dWYWx1ZSk6IERlbGV0ZS4KKwkoZGJ1c19nX3ZhbHVlX3R5cGVzX2luaXQpOiBSZW1vdmUgYXNzZXJ0aW9uLgorCShkYnVzX2dfdmFsdWVfZ2V0X2dfdHlwZSwgZGJ1c19nX3ZhbHVlX29wZW4pCisJKGRidXNfZ192YWx1ZV9pdGVyYXRvcl9nZXRfdmFsdWVzLCBkYnVzX2dfdmFsdWVfZ2V0X3NpZ25hdHVyZSkKKwkoZGJ1c19nX3ZhbHVlX2NvcHksIGRidXNfZ192YWx1ZV9mcmVlKTogRGVsZXRlIHVuaW1wbGVtZW50ZWQKKwlmdW5jdGlvbnMgcmVsYXRlZCB0byBEQnVzR1ZhbHVlLiAgTm93IHdlIG1hcnNoYWwvZGVtYXJzaGFsCisJc3RydWN0dXJlcyBhcyBHVmFsdWVBcnJheS4KKwkoZGJ1c19ndHlwZV9mcm9tX3NpZ25hdHVyZV9pdGVyKTogUmV0dXJuIEdfVFlQRV9WQUxVRV9BUlJBWSBmb3IKKwlzdHJ1Y3R1cmVzLgorCShzaWduYXR1cmVfaXRlcl90b19nX3R5cGVfYXJyYXkpOiBEb24ndCBjYWxsCisJc2lnbmF0dXJlX2l0ZXJfdG9fZ190eXBlX3N0cnVjdC4KKwkoc2lnbmF0dXJlX2l0ZXJfdG9fZ190eXBlX3N0cnVjdCk6IERlbGV0ZS4KKwkoZGJ1c19ndmFsdWVfdG9fc2lnbmF0dXJlKTogRGVsZXRlLgorCShkYnVzX2d2YWx1ZV90b19zaWduYXR1cmUpOiBOZXcgZnVuY3Rpb24gd2l0aCBzYW1lIG5hbWUgYXMgb3RoZXIKKwlvbmU7IHdlIGNhbiBjb252ZXJ0IHN0cnVjdHVyZXMgdG8gc2lnbmF0dXJlcy4KKwkoZGVtYXJzaGFsX3ZhbHVlYXJyYXkpOiBOZXcgZnVuY3Rpb24uCisJKGdldF90eXBlX2RlbWFyc2hhbGxlcik6IFVzZSBpdC4KKwkoZGVtYXJzaGFsX3JlY3Vyc2UpOiBEZWxldGUuCisJKG1hcnNoYWxfcHJveHkpOiBOZXcgZnVuY3Rpb24uCisJKG1hcnNoYWxfbWFwKTogV2FybiBpZiB3ZSBjYW4ndCBkZXRlcm1pbmUgc2lnbmF0dXJlIGZyb20gdHlwZS4KKwkobWFyc2hhbF9jb2xsZWN0aW9uX3B0cmFycmF5KTogRGl0dG8uCisJKG1hcnNoYWxfY29sbGVjdGlvbl9hcnJheSk6IERpdHRvLgorCShnZXRfdHlwZV9tYXJzaGFsbGVyKTogVXNlIG1hcnNoYWxfdmFsdWVhcnJheS4KKwkobWFyc2hhbF9yZWN1cnNlKTogRGVsZXRlLgorCShfZGJ1c19ndmFsdWVfdGVzdCk6IEFkZCBzb21lIHRlc3RzLgorCisJKiBkYnVzL2RidXMtZ2xpYi5oIChzdHJ1Y3QgX0RCdXNHVmFsdWVJdGVyYXRvcik6IAorCShkYnVzX2dfdmFsdWVfZ2V0X2dfdHlwZSwgREJVU19UWVBFX0dfVkFMVUUpCisJKGRidXNfZ192YWx1ZV9vcGVuLCBkYnVzX2dfdmFsdWVfaXRlcmF0b3JfZ2V0X3ZhbHVlKQorCShkYnVzX2dfdmFsdWVfaXRlcmF0b3JfZ2V0X3ZhbHVlcywgZGJ1c19nX3ZhbHVlX2l0ZXJhdG9yX3JlY3Vyc2UpCisJKGRidXNfZ192YWx1ZV9mcmVlKTogUmVtb3ZlIHByb3RvdHlwZXMuCisKKwkqIGdsaWIvZGJ1cy1iaW5kaW5nLXRvb2wtZ2xpYi5jIChkYnVzX2dfdHlwZV9nZXRfbG9va3VwX2Z1bmN0aW9uKTogSGFuZGxlCisJR19UWVBFX1ZBTFVFX0FSUkFZLgorCisJKiBnbGliL2V4YW1wbGVzL2V4YW1wbGUtc2VydmljZS5jOgorCSogZ2xpYi9leGFtcGxlcy9leGFtcGxlLWNsaWVudC5jOiBJbXBsZW1lbnQgR2V0VHVwbGUuCisKKwkqIHRlc3QvZ2xpYi90ZXN0LWRidXMtZ2xpYi5jOgorCSogdGVzdC9nbGliL3Rlc3Qtc2VydmljZS1nbGliLmM6CisJKiB0ZXN0L2dsaWIvdGVzdC1zZXJ2aWNlLWdsaWIueG1sOiBBZGQgc3RydWN0dXJlIHRlc3RzLgorCisyMDA1LTA3LTEwICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiBkb2MvVE9ETzogS25vY2sgb2ZmIHNvbWUgR0xpYiBpdGVtcyB3aXRoIHRoaXMgcGF0Y2guCisKKwkqIGdsaWIvZGJ1cy1ndmFsdWUtdXRpbHMuYyAoX2RidXNfZ3R5cGVfY2FuX3NpZ25hbF9lcnJvcikgCisJKF9kYnVzX2d2YWx1ZV9zaWduYWxzX2Vycm9yKTogTmV3IGZ1bmN0aW9ucy4KKworCSogZ2xpYi9kYnVzLWd2YWx1ZS11dGlscy5oOiBQcm90b3R5cGUgdGhlbS4KKworCSogZ2xpYi9kYnVzLWdvYmplY3QuYyAoYXJnX2l0ZXJhdGUpOiBVcGRhdGUgdG8gaGFuZGxlIHJldHVybiB2YWxzCisJYW5kIGNoYW5nZSB0byBub3Qgb3V0cHV0IGNvbnN0L3JldHZhbCBmbGFncyBmb3IgaW5wdXQgYXJncy4gIEFsbAorCWNhbGxlcnMgdXBkYXRlZC4KKwkoaW52b2tlX29iamVjdF9tZXRob2QpOiBSZWZhY3RvciB0byBoYW5kbGUgcmV0dXJuIHZhbHVlcy4gIEFkZAorCXNvbWUgbW9yZSBjb21tZW50cyBpbiB2YXJpb3VzIHBsYWNlcy4gIFJlbW92ZSBkZWJ1ZyBnX3ByaW50LgorCisJKiBnbGliL2RidXMtYmluZGluZy10b29sLWdsaWIuaCAoREJVU19HTElCX0FOTk9UQVRJT05fUkVUVVJOVkFMKTogTmV3LgorCisJKiBnbGliL2RidXMtYmluZGluZy10b29sLWdsaWIuYyAoZGJ1c19nX3R5cGVfZ2V0X21hcnNoYWxfbmFtZSk6CisJSGFuZGxlIEdfVFlQRV9OT05FLgorCShjb21wdXRlX2dzaWduYXR1cmUpOiBOZXcgZnVuY3Rpb247IHJlZmFjdG9yZWQgZnJvbSBjb2RlIGZyb20KKwljb21wdXRlX21hcnNoYWxsZXIgYW5kIGNvbXB1dGVfbWFyc2hhbGxlcl9uYW1lLiAgRW5oYW5jZSB0bworCWhhbmRsZSByZXR1cm4gdmFsdWVzIGFuZCBhc3luYyBvcHMgbW9yZSBjbGVhbmx5LiAgVXBkYXRlIGZvcgorCWFzeW5jIG9wcyByZXR1cm5pbmcgTk9ORSBpbnN0ZWFkIG9mIEJPT0xFQU4uCisJKGNvbXB1dGVfbWFyc2hhbGxlciwgY29tcHV0ZV9tYXJzaGFsbGVyX25hbWUpOiBDYWxsIGNvbXB1dGVfZ3NpZ25hdHVyZQorCWFuZCBvdXRwdXQgYXBwcm9wcmlhdGUgc3RyaW5nLgorCShnZW5lcmF0ZV9nbHVlKTogSGFuZGxlIHJldHVybiB2YWx1ZSBhbm5vdGF0aW9uLiAgQWxzbyBkb24ndCBkdW1wCisJY29uc3RuZXNzIGZsYWcgZm9yIGlucHV0IGFyZ3VtZW50cy4KKworCSogZ2xpYi9NYWtlZmlsZS5hbSAoREJVU19HTElCX0lOVEVSTkFMUyk6IE5ldyB2YXJpYWJsZTsgY29udGFpbnMKKwlmaWxlcyBzaGFyZWQgYmV0d2VlbiBpbnN0YWxsZWQgbGlicmFyeSBhbmQgdXRpbGl0aWVzLgorCShsaWJkYnVzX2dsaWJfMV9sYV9TT1VSQ0VTKTogTW92ZSBzb21lIHN0dWYgaW50byBEQlVTX0dMSUJfSU5URVJOQUxTLgorCShsaWJkYnVzX2d0b29sX2xhX1NPVVJDRVMpOiBTdWNrIGluIERCVVNfR0xJQl9JTlRFUk5BTFMgc28gdGhlCisJYmluZGluZyB0b29sIGNhbiBhY2Nlc3MgZ3R5cGUgdXRpbGl0eSBmdW5jdGlvbnMuCisKKwkqIHRlc3QvZ2xpYi90ZXN0LXNlcnZpY2UtZ2xpYi5jOiAKKwkqIHRlc3QvZ2xpYi90ZXN0LXNlcnZpY2UtZ2xpYi54bWw6IAorCSogdGVzdC9nbGliL3Rlc3QtZGJ1cy1nbGliLmM6IEFkZCBzb21lIHRlc3RzIGZvciByZXR1cm4gdmFsdWVzLgorCisyMDA1LTA3LTA5ICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiBnbGliL2RidXMtZ3BhcnNlci5jIChwYXJzZV9hbm5vdGF0aW9uKTogQWRkIGFubm90YXRpb25zIHRvCisJYXJndW1lbnQgaWYgYXZhaWxhYmxlLCBub3QgbWV0aG9kLgorCisJKiBnbGliL2RidXMtZ29iamVjdC5jIChhcmdfaXRlcmF0ZSk6IE1vcmUgdmVyYm9zZSB3YXJuaW5ncy4KKwkoaW52b2tlX29iamVjdF9tZXRob2QpOiBGaXJzdCwgcmVtb3ZlIHNvbWUgcmVkdW5kYW50CisJR1ZhbHVlcyAob2JqZWN0X3ZhbHVlLCBlcnJvcl92YWx1ZSkgaW4gZmF2b3Igb2Ygd29ya2luZyBvbgorCWFycmF5IGRpcmVjdGx5LiAgU2Vjb25kLCByZXdvcmsgY29uc3RuZXNzIHRvIGJlIGxlc3MgYnVnZ3kuCisJTm93IHdlIGl0ZXJhdGUgZGlyZWN0bHkgb3ZlciB0aGUgYXJndW1lbnQgbWV0YWRhdGEgaW5zdGVhZAorCW9mIHBhcmFsbGVsIGl0ZXJhdGluZyBvdmVyIG91dHB1dCBzaWduYXR1cmUgYW5kIG1ldGFkYXRhLgorCisJKiBnbGliL2RidXMtZ2xpYi10b29sLmg6IEFkZCBJTlZBTElEX0FOTk9UQVRJT04gZXJyb3IuCisKKwkqIGdsaWIvZGJ1cy1iaW5kaW5nLXRvb2wtZ2xpYi5jIChnZW5lcmF0ZV9nbHVlKTogQmFyZiBvbiBjb25zdAorCWFubm90YXRpb24gb24gaW5wdXQgYXJncy4KKwkKKzIwMDUtMDctMDkgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwkqIGdsaWIvZGJ1cy1iaW5kaW5nLXRvb2wtZ2xpYi5oIChEQlVTX0dMSUJfQU5OT1RBVElPTl9DT05TVCk6CisJRGVmaW5lLgorCisJKiBnbGliL2RidXMtYmluZGluZy10b29sLWdsaWIuYyAoZ2VuZXJhdGVfZ2x1ZSk6IEhhbmRsZSBDb25zdAorCWFubm90YXRpb24uCisKKwkqIGdsaWIvZGJ1cy1nb2JqZWN0LmMgKGFyZ19pdGVyYXRlKTogVXBkYXRlIHRvIHBhcnNlIGNvbnN0dmFsIHRvby4KKwkobWV0aG9kX2Rpcl9zaWduYXR1cmVfZnJvbV9vYmplY3RfaW5mbyk6IEhhbmRsZSBhcmdfaXRlcmF0ZSBjaGFuZ2UuCisJKHdyaXRlX2ludGVyZmFjZSk6IERpdHRvLgorCShsb29rdXBfb2JqZWN0X2luZm8pOiBEb24ndCBiYXJmIGlmIGZvcm1hdF92ZXJzaW9uIGlzID4gMC4KKwkoaW52b2tlX29iamVjdF9tZXRob2QpOiBIYW5kbGUgYXJnIGNvbnN0bmVzcy4KKworCSogZ2xpYi9kYnVzLWdpZGwuYyAoc3RydWN0IEFyZ0luZm8pOiBBZGQgYW5ub3RhdGlvbnMuCisJKGFyZ19pbmZvX25ldyk6IENyZWF0ZS4KKwkoYXJnX2luZm9fdW5yZWYpOiBEZXN0cm95LgorCShhcmdfaW5mb19nZXRfYW5ub3RhdGlvbnMsIGFyZ19pbmZvX2dldF9hbm5vdGF0aW9uKSAKKwkoYXJnX2luZm9fYWRkX2Fubm90YXRpb24pOiBOZXcgZnVuY3Rpb25zLgorCisJKiBnbGliL2RidXMtZ2lkbC5oOiBQcm90b3R5cGUgdGhlbS4KKworCSogZ2xpYi9kYnVzLWdwYXJzZXIuYyAocGFyc2VfYW5ub3RhdGlvbik6IEFsbG93IGFubm90YXRpb25zIGluCisJYXJncywgZGlzYWxsb3cgdGhlbSBpbiBwcm9wZXJ0aWVzLgorCShwYXJzZV9hbm5vdGF0aW9uKTogSGFuZGxlIGFyZyBhbm5vdGF0aW9ucy4KKworCSogdGVzdC9nbGliL3Rlc3Qtc2VydmljZS1nbGliLnhtbDogCisJKiB0ZXN0L2dsaWIvdGVzdC1zZXJ2aWNlLWdsaWIuYzogVXBkYXRlIHRvIG1ha2Ugc29tZSBtZXRob2RzCisJY29uc3QuCisKKzIwMDUtMDctMDggIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwkqIHRlc3QvZ2xpYi90ZXN0LXNlcnZpY2UtZ2xpYi54bWw6IAorCSogdGVzdC9nbGliL3Rlc3Qtc2VydmljZS1nbGliLmM6CisJKiB0ZXN0L2dsaWIvdGVzdC1kYnVzLWdsaWIuYzogVGVzdCBhe3N2fS4KKworCSogZ2xpYi9leGFtcGxlcy9zdGF0ZW1hY2hpbmUvc3RhdGVtYWNoaW5lLmM6CisJKiBnbGliL2V4YW1wbGVzL3N0YXRlbWFjaGluZS9zdGF0ZW1hY2hpbmUtc2VydmVyLmM6CisJKiBnbGliL2V4YW1wbGVzL3N0YXRlbWFjaGluZS9zdGF0ZW1hY2hpbmUtY2xpZW50LmM6IEZpeCBzb21lIGJ1Z3MsCisJYWRkIHByb2dyZXNzIGJhciwgZXRjLgorCisJKiBnbGliL2RidXMtZ3ZhbHVlLmMgKHJlZ2lzdGVyX2FycmF5LCByZWdpc3Rlcl9kaWN0KTogRGVsZXRlOyBub3QKKwluZWVkZWQgYW55bW9yZSBkdWUgdG8gZ2VuZXJpYyBhcnJheS9tYXAgbWFyc2hhbGxpbmcuCisJKGRidXNfZ192YWx1ZV90eXBlc19pbml0KTogRG9uJ3QgcmVnaXN0ZXIgYmFzaWMgYXJyYXlzIG9yIHRoZQorCXN0cmluZy9zdHJpbmcgaGFzaC4KKwkoZGJ1c19ndHlwZV9mcm9tX3NpZ25hdHVyZV9pdGVyKTogRG9uJ3QgdHJ5IHRvIHJlY3Vyc2UgaW50bworCXZhcmlhbnRzLgorCShkYnVzX2d0eXBlX3RvX3NpZ25hdHVyZSk6IENoZWNrIGNvbGxlY3Rpb24vbWFwIGJlZm9yZSB0eXBlCisJbWV0YWRhdGEuCisJKGRlbWFyc2hhbF9nYXJyYXlfYmFzaWMpOiBSZW5hbWVkIHRvIGRlbWFyc2hhbF9jb2xsZWN0aW9uX2FycmF5LgorCShkZW1hcnNoYWxfZ2hhc2h0YWJsZSk6IFJlbmFtZWQgdG8gZGVtYXJzaGFsX21hcDsgZml4IHRvIHVzZSBuZXcKKwlnZW5lcmljIG1hcCBjcmVhdGlvbi9hcHBlbmQgZnVuY3Rpb25zIGluc3RlYWQgb2YgaGFzaCB0YWJsZQorCXNwZWNpZmljYWxseS4KKwkoZ2V0X3R5cGVfZGVtYXJzaGFsbGVyKTogSGFuZGxlIG1hcHMuCisJKGRlbWFyc2hhbF9jb2xsZWN0aW9uKTogRGlzcGF0Y2ggb24gY29sbGVjdGlvbiB0eXBlIHRvIGVpdGhlcgorCWRlbWFyc2hhbF9jb2xsZWN0aW9uX3B0cmFycmF5IG9yIGRlbWFyc2hhbF9jb2xsZWN0aW9uX2FycmF5LgorCShnZXRfdHlwZV9tYXJzaGFsbGVyKTogSGFuZGxlIG1hcHMuCisJKG1hcnNoYWxfY29sbGVjdGlvbik6IERpc3BhdGNoIGNvbGxlY3Rpb24gdHlwZSB0byBlaXRoZXIKKwltYXJzaGFsX2NvbGxlY3Rpb25fcHRyYXJyYXkgb3IgbWFyc2hhbF9jb2xsZWN0aW9uX2FycmF5LgorCShfZGJ1c19ndmFsdWVfdGVzdCk6IE5ldyB0ZXN0LgorCisJKiBnbGliL2RidXMtZ3ZhbHVlLXV0aWxzLmMgKHVuc2V0X2FuZF9mcmVlX2dfdmFsdWUpOiBOZXcgZnVuY3Rpb24uCisJKGhhc2hfZnJlZV9mcm9tX2d0eXBlKTogVXNlIGl0IHRvIGZyZWUgR1ZhbHVlcy4KKwkoaGFzaHRhYmxlX2FwcGVuZCk6IE5ldyBmdW5jdGlvbi4KKwkocHRyYXJyYXlfYXBwZW5kKTogRml4IHByb3RvdHlwZS4KKwkoc2xpc3RfYXBwZW5kKTogRGl0dG8uCisJKF9kYnVzX2d2YWx1ZV91dGlsc190ZXN0KTogRXh0ZW5kIHRlc3RzLgorCisJKiBnbGliL2RidXMtZ3R5cGUtc3BlY2lhbGl6ZWQuYworCShkYnVzX2dfdHlwZV9zcGVjaWFsaXplZF9pbml0X2FwcGVuZCk6IFJlbmFtZWQgZnJvbQorCWRidXNfZ190eXBlX3NwZWNpYWxpemVkX2NvbGxlY3Rpb25faW5pdF9hcHBlbmQuICBSZW1vdmUgY29uc3QgZnJvbQorCXZhbHVlLCBzaW5jZSB3ZSBzdGVhbCBpdC4KKwkoZGJ1c19nX3R5cGVfc3BlY2lhbGl6ZWRfbWFwX2FwcGVuZCk6IE5ldyBmdW5jdGlvbi4KKworCSogZ2xpYi9kYnVzLWd0eXBlLXNwZWNpYWxpemVkLmg6IFVwZGF0ZSBwcm90b3R5cGVzLgorCUFkZCBEQnVzR1R5cGVTcGVjaWFsaXplZE1hcEFwcGVuZEZ1bmMuCisKKwkqIGdsaWIvZGJ1cy1ndGVzdC5jIChkYnVzX2dsaWJfaW50ZXJuYWxfZG9fbm90X3VzZV9ydW5fdGVzdHMpOiBSdW4KKwlfZGJ1c19ndmFsdWVfdGVzdC4KKwkKKwkqIGdsaWIvZGJ1cy1ndGVzdC5oOiBQcm90b3R5cGUgaXQuCisKKzIwMDUtMDctMDggIFJvc3MgQnVydG9uICA8cm9zc0BvcGVuZWRoYW5kLmNvbT4KKworCSogZGJ1cy9kYnVzLWdsaWIuaDoKKwlBZGQgREJ5c0dBc3luY0RhdGEgZm9yIHRoZSBhc3luYyBiaW5kaW5ncy4KKworCSogZ2xpYi9kYnVzLWJpbmRpbmctdG9vbC1nbGliLmM6CisJUmUtZW5hYmxlIHRoZSBhc3luYyBiaW5kaW5ncy4KKworCSogdGVzdC9nbGliL3Rlc3QtZGJ1cy1nbGliLmM6CisJQWRkIGEgdGVzdCBmb3IgdGhlIGdlbmVyYXRlZCBhc3luYyBiaW5kaW5ncy4KKworMjAwNS0wNy0wOCAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogZG9jL1RPRE86IFVwZGF0ZSBHTGliIHRvZG8gYml0cywgYWxzbyBhZGQgYSBwb3N0LTEuMCBUT0RPIGZvciBhCisJY29ubmVjdGlvbiBjb25jZXB0LgorCQorMjAwNS0wNy0wOCAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKwkKKwkqIHRvb2xzL01ha2VmaWxlLmFtOiBLaWxsIG9mIHByaW50LWludHJvc3BlY3QgaW4gZmF2b3Igb2YgdXNpbmcKKwlkYnVzLXNlbmQgLS1wcmludC1yZXBseT1saXRlcmFsLgorCisJKiB0ZXN0L2dsaWIvdGVzdC1zZXJ2aWNlLWdsaWIueG1sOiAKKwkqIHRlc3QvZ2xpYi90ZXN0LXNlcnZpY2UtZ2xpYi5jIChteV9vYmplY3RfZ2V0X29ianMpOiBOZXcgdGVzdAorCWZvciAiYW8iLgorCisJKiB0ZXN0L2dsaWIvdGVzdC1kYnVzLWdsaWIuYyAoZWNob19yZWNlaXZlZF9jYik6IEZyZWUgZWNobyBkYXRhLgorCShtYWluKTogVGVzdCBHZXRPYmpzLgorCisJKiBnbGliL2V4YW1wbGVzL3N0YXRlbWFjaGluZS9NYWtlZmlsZS5hbToKKwkqIGdsaWIvZXhhbXBsZXMvc3RhdGVtYWNoaW5lL3NtLW1hcnNoYWwubGlzdDoKKwkqIGdsaWIvZXhhbXBsZXMvc3RhdGVtYWNoaW5lL3N0YXRlbWFjaGluZS1jbGllbnQuYzoKKwkqIGdsaWIvZXhhbXBsZXMvc3RhdGVtYWNoaW5lL3N0YXRlbWFjaGluZS1zZXJ2ZXIuYzoKKwkqIGdsaWIvZXhhbXBsZXMvc3RhdGVtYWNoaW5lL3N0YXRlbWFjaGluZS1zZXJ2ZXIueG1sOgorCSogZ2xpYi9leGFtcGxlcy9zdGF0ZW1hY2hpbmUvc3RhdGVtYWNoaW5lLmM6CisJKiBnbGliL2V4YW1wbGVzL3N0YXRlbWFjaGluZS9zdGF0ZW1hY2hpbmUuaDoKKwkqIGdsaWIvZXhhbXBsZXMvc3RhdGVtYWNoaW5lL3N0YXRlbWFjaGluZS54bWw6CisKKwlOZXcgZXhhbXBsZS4KKworCSogZ2xpYi9leGFtcGxlcy9leGFtcGxlLXNlcnZpY2UuYyAobWFpbik6IE1vdmUgaW52b2NhdGlvbgorCW9mIGRidXNfZ19vYmplY3RfdHlwZV9pbnN0YWxsX2luZm8gZWFybGllciwgdG8gZW1waGFzaXplIGl0CisJc2hvdWxkIG9ubHkgYmUgZG9uZSBvbmNlLgorCisJKiBnbGliL2V4YW1wbGVzL2V4YW1wbGUtc2lnbmFsLWVtaXR0ZXIuYyAobWFpbik6IERpdHRvLgorCisJKiBnbGliL2V4YW1wbGVzL01ha2VmaWxlLmFtIChTVUJESVJTKTogSW5jbHVkZSBzdGF0ZW1hY2hpbmUuCisKKwkqIGdsaWIvZGJ1cy1ndmFsdWUuaCAoZGJ1c19ndHlwZV90b19zaWduYXR1cmUpCisJKGRidXNfZ3ZhbHVlX21hcnNoYWwpOiBVcGRhdGUgcHJvdG90eXBlcy4KKworCSogZ2xpYi9kYnVzLWd2YWx1ZS5jOiBVcGRhdGUgYWxsIG1hcnNoYWxsaW5nIGZ1bmN0aW9ucyB0byB0YWtlCisJY29uc3QgR1ZhbHVlIGluc3RlYWQgb2YgR1ZhbHVlLgorCShzaWduYXR1cmVfaXRlcl90b19nX3R5cGVfYXJyYXkpOiBSZXR1cm4gYSBHUHRyQXJyYXkgZm9yIG5vbmZpeGVkCisJdHlwZXMuCisJKGRidXNfZ3ZhbHVlX3RvX3NpZ25hdHVyZSk6IFVwZGF0ZSBmb3IgZGJ1c19ndHlwZV90b19zaWduYXR1cmUKKwljaGFuZ2UuCisJKGRidXNfZ3R5cGVfdG9fc2lnbmF0dXJlKTogSGFuZGxlIGdlbmVyaWMgY29sbGVjaXRvbnMgYW5kIG1hcHMuCisJUmV0dXJuIGEgbmV3bHktYWxsb2NhdGVkIHN0cmluZy4KKwkoZGVtYXJzaGFsX3Byb3h5LCBkZW1hcnNoYWxfb2JqZWN0X3BhdGgsIGRlbWFyc2hhbF9vYmplY3QpCisJKGRlbWFyc2hhbF9zdHJ2LCBkZW1hcnNoYWxfZ2hhc2h0YWJsZSk6IFNldCBlcnJvciwgZG9uJ3QgYXNzZXJ0IGlmCisJd2UgZ2V0IHRoZSB3cm9uZyB0eXBlcyBmcm9tIG1lc3NhZ2UuCisJKGdldF90eXBlX2RlbWFyc2hhbGxlcik6IE5ldyBmdW5jdGlvbiwgZXh0cmFjdGVkIGZyb20KKwlkYnVzX2d2YWx1ZV9kZW1hcnNoYWwuCisJKGRlbWFyc2hhbF9jb2xsZWN0aW9uKTogTmV3IGZ1bmN0aW9uLCBkZW1hcnNoYWxzIGdlbmVyaWMKKwljb2xsZWN0aW9uLgorCShkYnVzX2d2YWx1ZV9kZW1hcnNoYWwpOiBKdXN0IGludm9rZSByZXN1bHQgb2YKKwlnZXRfdHlwZV9kZW1hcnNoYWxsZXIuICBUaHJvdyBlcnJvciBpZiB3ZSBkb24ndCBoYXZlIG9uZS4KKwkobWFyc2hhbF9nYXJyYXlfYmFzaWMpOiBBYm9ydCBvbiBPT00uCisJKGdldF90eXBlX21hcnNoYWxsZXIpOiBOZXcgZnVuY3Rpb24sIGV4dHJhY3RlZCBmcm9tCisJZGJ1c19ndmFsdWVfbWFyc2hhbC4KKwkoY29sbGVjdGlvbl9tYXJzaGFsX2l0ZXJhdG9yLCBtYXJzaGFsX2NvbGxlY3Rpb24pOiBOZXcgZnVuY3Rpb25zOworCWltcGxlbWVudHMgZ2VuZXJpYyBtYXJzaGFsbGluZyBmb3IgYW4gaXRlcmF0YWJsZSBzcGVjaWFsaXplZAorCWNvbGxlY3Rpb24uCisJKGRidXNfZ3ZhbHVlX21hcnNoYWwpOiBKdXN0IGludm9rZSByZXN1bHQgb2YgZ2V0X3R5cGVfbWFyc2hhbGxlci4KKworCSogZ2xpYi9kYnVzLWd2YWx1ZS11dGlscy5jIChndmFsdWVfZnJvbV9wdHJhcnJheV92YWx1ZSk6IEhhbmRsZQorCUdfVFlQRV9TVFJJTkcuCisJKHB0cmFycmF5X3ZhbHVlX2Zyb21fZ3ZhbHVlKTogRGl0dG8uCisJKHB0cmFycmF5X2FwcGVuZCwgcHRyYXJyYXlfZnJlZSk6IE5ldyBmdW5jdGlvbnMuCisJKHNsaXN0X2NvbnN0cnVjdG9yLCBzbGlzdF9pdGVyYXRvciwgc2xpc3RfY29weV9lbHQsIHNsaXN0X2NvcHkpIAorCShzbGlzdF9hcHBlbmQsIHNsaXN0X2VuZF9hcHBlbmQsIHNsaXN0X2ZyZWUpOiBOZXcgZnVuY3Rpb25zLgorCShkYnVzX2dfdHlwZV9zcGVjaWFsaXplZF9idWlsdGluc19pbml0KTogQWRkIGFwcGVuZCBmdWN0aW9ucworCWZvciBHUHRyQXJyYXkgYW5kIEdTTGlzdC4gIFJlZ2lzdGVyIEdTTGlzdC4KKwkodGVzdF9zcGVjaWFsaXplZF9oYXNoLCBfZGJ1c19ndmFsdWVfdXRpbHNfdGVzdCk6IE5ldyBmdW5jdGlvbnMuCisKKwkqIGdsaWIvZGJ1cy1ndHlwZS1zcGVjaWFsaXplZC5oIChEQnVzR1R5cGVTcGVjaWFsaXplZEFwcGVuZENvbnRleHQpOgorCU5ldy4KKwkoZGJ1c19nX3R5cGVfc3BlY2lhbGl6ZWRfY29sbGVjdGlvbl9pbml0X2FwcGVuZCkKKwkoZGJ1c19nX3R5cGVfc3BlY2lhbGl6ZWRfY29sbGVjdGlvbl9hcHBlbmQpCisJKGRidXNfZ190eXBlX3NwZWNpYWxpemVkX2NvbGxlY3Rpb25fZW5kX2FwcGVuZCk6IFByb3RvdHlwZS4KKwkoREJ1c0dUeXBlU3BlY2lhbGl6ZWRDb2xsZWN0aW9uVnRhYmxlKTogQWRkIGFwcGVuZF9mdW5jIGFuZAorCWVuZF9hcHBlbmRfZnVuYy4KKworCSogZ2xpYi9kYnVzLWd0eXBlLXNwZWNpYWxpemVkLmMgKGRidXNfZ190eXBlX3NwZWNpYWxpemVkX2NvbGxlY3Rpb25faW5pdF9hcHBlbmQpIAorCShkYnVzX2dfdHlwZV9zcGVjaWFsaXplZF9jb2xsZWN0aW9uX2FwcGVuZCkgCisJKGRidXNfZ190eXBlX3NwZWNpYWxpemVkX2NvbGxlY3Rpb25fZW5kX2FwcGVuZCk6IE5ldyBmdW5jdGlvbnMuCisJKGRidXNfZ190eXBlX21hcF92YWx1ZV9pdGVyYXRlKTogVGFrZSBjb25zdCBHVmFsdWUuCisJKGRidXNfZ190eXBlX2NvbGxlY3Rpb25fdmFsdWVfaXRlcmF0ZSk6IERpdHRvLgorCisJKiBnbGliL2RidXMtZ3Rlc3QuYyAoZGJ1c19nbGliX2ludGVybmFsX2RvX25vdF91c2VfcnVuX3Rlc3RzKTogUnVuCisJX2RidXNfZ3ZhbHVlX3V0aWxzX3Rlc3QuCisJCisJKiBnbGliL2RidXMtZ3Rlc3QuaDogUHJvdG90eXBlIGl0LgorCisJKiBnbGliL2RidXMtZ3Byb3h5LmMgKGRidXNfZ19wcm94eV9tYW5hZ2VyX2ZpbHRlcik6IEF2b2lkCisJdXNpbmcgdW5pbml0aWFsaXplZCBvd25lcl9saXN0LgorCShkYnVzX2dfcHJveHlfYmVnaW5fY2FsbF9pbnRlcm5hbCk6IE1vdmUgcmV0dXJuX2lmX2ZhaWwgdG8KKwlwdWJsaWMgQVBJLgorCShkYnVzX2dfcHJveHlfZW5kX2NhbGxfaW50ZXJuYWwpOiBVcGRhdGUgdG8gdXNlIGVycm9yIHNldAorCWZyb20gZGJ1c19ndmFsdWVfZGVtYXJzaGFsIGluc3RlYWQgb2Ygc2V0dGluZyBpdCBoZXJlLgorCShkYnVzX2dfcHJveHlfYmVnaW5fY2FsbCk6IE1vdmUgcmV0dXJuX2lmX2ZhaWwgaGVyZS4KKworCSogZ2xpYi9kYnVzLWdvYmplY3QuYyAod3JpdGVfaW50ZXJmYWNlKTogVXBkYXRlIGZvcgorCWRidXNfZ3R5cGVfdG9fc2lnbmF0dXJlIHJldHVybmluZyBuZXcgc3RyaW5nLgorCisJKiBjb25maWd1cmUuaW46IEFkZCBnbGliL2V4YW1wbGVzL3N0YXRlbWFjaGluZS4KKworMjAwNS0wNy0wOCAgSm9lIFNoYXcgIDxqb2VzaGF3QG5vdmVsbC5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogQWRkIGEgY29uZmlndXJlIG9wdGlvbiwgLS13aXRoLWNvbnNvbGUtYXV0aC1kaXIKKwkKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLXV0aWwuYyAoX2RidXNfdXNlcl9hdF9jb25zb2xlKTogVXNlIHRoZQorCW5ldyBzZXR0aW5nLiAgUGF0Y2ggZnJvbSBLYXkgU2lldmVycy4KKworMjAwNS0wNy0wNiAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogZGJ1cy9kYnVzLWdsaWIuaCAoREJ1c0dQZW5kaW5nQ2FsbCwgREJ1c0dQZW5kaW5nQ2FsbE5vdGlmeSkKKwkoREJVU19UWVBFX0dfUEVORElOR19DQUxMLCBkYnVzX2dfcGVuZGluZ19jYWxsX2dldF9nX3R5cGUpCisJKGRidXNfZ19wZW5kaW5nX2NhbGxfcmVmLCBkYnVzX2dfcGVuZGluZ19jYWxsX3VucmVmKTogRGVsZXRlLgorCShkYnVzX2dfcGVuZGluZ19jYWxsX3NldF9ub3RpZnksIGRidXNfZ19wZW5kaW5nX2NhbGxfY2FuY2VsKToKKwlEZWxldGUgaW4gZmF2b3Igb2YgZGJ1c19nX3Byb3h5X2JlZ2luX2NhbGwgYW5kCisJZGJ1c19nX3Byb3h5X2NhbmNlbF9jYWxsLgorCShEQnVzR1Byb3h5Q2FsbCwgREJ1c0dQcm94eUNhbGxOb3RpZnkpOiBOZXcuCisJKGRidXNfZ19wcm94eV9iZWdpbl9jYWxsKTogQ2hhbmdlIHByb3RvdHlwZSB0byB0YWtlIGNhbGxiYWNrLCB1c2VyCisJZGF0YSwgYW5kIGRlc3Ryb3kgZnVuY3Rpb24uICBUaGlzIHJlcGxhY2VzCisJZGJ1c19nX3BlbmRpbmdfY2FsbF9zZXRfbm90aWZ5LgorCShkYnVzX2dfcHJveHlfY2FuY2VsX2NhbGwpOiBQcm90b3R5cGUuCisJKERCdXNHQXN5bmNEYXRhKTogRGVsZXRlLCBzaG91bGRuJ3QgYmUgbmVlZGVkIGFueW1vcmUuCisKKwkqIGdsaWIvZGJ1cy1ncHJveHkuYyAoc3RydWN0IF9EQnVzR1Byb3h5KTogQWRkIGNhbGxfaWRfY291bnRlciBhbmQKKwlwZW5kaW5nX2NhbGxzIG1hcC4KKwkoc3RydWN0IF9EQnVzR1Byb3h5TWFuYWdlcik6IEFkZCBidXNfcHJveHkgbWVtYmVyLCB3aGljaCBpcyBhbgorCWludGVybmFsIHByb3h5IGZvciBjYWxscyB0byB0aGUgYnVzLiBSZW1vdmUKKwlwZW5kaW5nX25hbWVvd25lcl9jYWxscywgbm93IHRoZSBpbnRlcm5hbCBwcm94eSBrZWVwcyB0cmFjay4KKwkoZGJ1c19nX3Byb3h5X21hbmFnZXJfdW5yZWYpOiBVbnJlZiBidXMgcHJveHksIHJlbW92ZSByZWZlcmVuY2UgdG8KKwlwZW5kaW5nX25hbWVvd25lcl9jYWxscy4KKwkoZ290X25hbWVfb3duZXJfY2IpOiBVcGRhdGUgcHJvdG90eXBlLCBhbmQgdXNlCisJZGJ1c19nX3Byb3h5X2VuZF9jYWxsLgorCShnb3RfbmFtZV9vd25lcl9jYik6IFJlbW92ZSByZWZlcmVuY2UgdG8gcGVuZGluZ19uYW1lb3duZXJfY2FsbHMuCisJKGRidXNfZ19wcm94eV9tYW5hZ2VyX3JlZ2lzdGVyKTogRGVsZXRlIGRpcmVjdGx5IGxpYmRidXMgY29kZSBpbgorCWZhdm9yIG9mIHVzaW5nIGludGVybmFsIHByb3h5LgorCShkYnVzX2dfcHJveHlfbWFuYWdlcl91bnJlZ2lzdGVyKTogVXBkYXRlIHRvIHVzZQorCWRidXNfZ19wcm94eV9jYW5jZWxfY2FsbCBmb3IgYW55IHBlbmRpbmcgR2V0TmFtZU93bmVyIGNhbGwuCisJKGRidXNfZ19wcm94eV9pbml0KTogSW5pdGlhbGl6ZSBwZW5kaW5nIGNhbGxzIG1hcC4KKwkoZGJ1c19nX3Byb3h5X2NvbnN0cnVjdG9yKTogTmV3LgorCShkYnVzX2dfcHJveHlfY2xhc3NfaW5pdCk6IEFkZCBnZXQvc2V0IHByb3BlcnR5IGZ1bmN0aW9ucywKKwljb25zdHJ1Y3RvciwgYW5kIGFkZCBOQU1FLCBQQVRILCBhbmQgSU5URVJGQUNFIHByb3BlcnRpZXMuCisJKGNhbmNlbF9wZW5kaW5nX2NhbGwpOiBOZXcgZnVuY3Rpb24uCisJKGRidXNfZ19wcm94eV9kaXNwb3NlKTogSXRlcmF0ZSBvdmVyIGFueSBvdXRzdGFuZGluZyBjYWxscyBhbmQKKwljYW5jZWwgdGhlbS4KKwkoZGJ1c19nX3Byb3h5X3NldF9wcm9wZXJ0eSwgZGJ1c19nX3Byb3h5X2dldF9wcm9wZXJ0eSk6IE5ldy4KKwkoR1BlbmRpbmdOb3RpZnlDbG9zdXJlKTogTmV3IHN0cnVjdHVyZS4KKwkoZF9wZW5kaW5nX2NhbGxfbm90aWZ5LCBkX3BlbmRpbmdfY2FsbF9mcmVlKTogTW92ZWQgaGVyZSBmcm9tCisJZGJ1cy1nbGliLmMuCisJKERCVVNfR19WQUxVRV9BUlJBWV9DT0xMRUNUX0FMTCk6IE1vdmVkIGFyb3VuZCB0byBzYXRpc2Z5IGZ1bmN0aW9uCisJb3JkZXJpbmcuCisJKG1hbmFnZXJfYmVnaW5fYnVzX2NhbGwpOiBOZXcgaW50ZXJuYWwgZnVuY3Rpb24gZm9yIHRhbGtpbmcgdG8KKwlpbnRlcm5hbCBidXMgcHJveHkuCisJKGRidXNfZ19wcm94eV9uZXcpOiBDb25zdHJ1Y3Qgb2JqZWN0IHVzaW5nIEdPYmpldCBwcm9wZXJ0aWVzLgorCShkYnVzX2dfcHJveHlfYmVnaW5fY2FsbF9pbnRlcm5hbCk6IFVwZGF0ZSB0byB0YWtlIHVzZXIgZGF0YSwgZXRjLgorCUNyZWF0ZSBjbG9zdXJlIG9mIHNhbWUsIGFuZCBpbnNlcnQgY2FsbCBpbnRvIG1hcCBvZiBwZW5kaW5nIGNhbGxzLgorCShkYnVzX2dfcHJveHlfZW5kX2NhbGxfaW50ZXJuYWwpOiBUYWtlIGNhbGwgaWQgaW5zdGVhZCBvZiBwZW5kaW5nCisJY2FsbC4gIExvb2sgdXAgcGVuZGluZyBjYWxsIGluIGN1cnJlbnQgc2V0LiAgUmVtb3ZlIGl0IHdoZW4gd2UndmUKKwljb21wbGV0ZWQuCisJKGRidXNfZ19wZW5kaW5nX2NhbGxfZW5kLCBkYnVzX2dfcHJveHlfZW5kX2NhbGxfaW50ZXJuYWwpOiBEZWxldGUuCisJKGRidXNfZ19wcm94eV9iZWdpbl9jYWxsKTogQ2hhbmdlIEFQSSB0byB0YWtlIGNhbGxiYWNrLCB1c2VyIGRhdGEsCisJYW5kIGRlc3Ryb3kgZnVuY3Rpb24gZGlyZWN0bHkuCisJKGRidXNfZ19wcm94eV9lbmRfY2FsbCk6IFVwZGF0ZSB0byB0YWtlIERCdXNHUHJveHlDYWxsLgorCShkYnVzX2dfcHJveHlfY2FsbCk6IEludm9rZSB3aXRoIE5VTEwgY2FsbGJhY2suCisJKGRidXNfZ19wcm94eV9jYW5jZWxfY2FsbCk6IE5ldyBmdW5jdGlvbiwgcmVwbGFjZXMKKwlkYnVzX2dfcGVuZGluZ19jYWxsX2NhbmNlbC4KKworCSogZ2xpYi9kYnVzLWdwYXJzZXIuYyAodmFsaWRhdGVfc2lnbmF0dXJlKTogRml4IGNhbGwgdG8KKwlkYnVzX3NldF9nX2Vycm9yLgorCisJKiBnbGliL2RidXMtZ29iamVjdC5jIChkYnVzX2dfb2JqZWN0X3R5cGVfZGJ1c19tZXRhZGF0YV9xdWFyayk6CisJTmV3IHF1YXJrIGZvciBhdHRhY2hpbmcgbWV0YWRhdGEgdG8gR1R5cGUuCisJKGluZm9faGFzaCk6IERlbGV0ZS4KKwkobG9va3VwX29iamVjdF9pbmZvKTogTG9vayB1cCB1c2luZyBxdWFyay4KKwkoZGJ1c19nX29iamVjdF90eXBlX2luc3RhbGxfaW5mbyk6IENoZWNrIHRoYXQgYSB0eXBlIGlzIGNsYXNzZWQsCisJbm90IHRoYXQgaXQncyBhbiBvYmplY3QuICBBbHNvIGp1c3QgaW5zdGFsbCB0eXBlIGRhdGEgdXNpbmcgcXVhcmsKKwlpbnN0ZWFkIG9mIHVzaW5nIGdsb2JhbCBoYXNoLgorCisJKiBnbGliL2RidXMtZ2xpYi5jIChkYnVzX2dfcGVuZGluZ19jYWxsX3JlZikgCisJKGRidXNfZ19wZW5kaW5nX2NhbGxfdW5yZWYsIGRidXNfcGVuZGluZ19jYWxsX2dldF9nX3R5cGUpCisJKEdQZW5kaW5nTm90aWZ5Q2xvc3VyZSk6IERlbGV0ZS4KKwkoZF9wZW5kaW5nX2NhbGxfbm90aWZ5LCBkX3BlbmRpbmdfY2FsbF9mcmVlKTogTW92ZSB0byBkYnVzLWdwcm94eS5jLgorCShkYnVzX2dfcGVuZGluZ19jYWxsX3NldF9ub3RpZnksIGRidXNfZ19wZW5kaW5nX2NhbGxfY2FuY2VsKTogRGVsZXRlLgorCisJKiBnbGliL2RidXMtYmluZGluZy10b29sLWdsaWIuYyAoZ2VuZXJhdGVfY2xpZW50X2dsdWUpOiBEaXNhYmxlIGFzeW5jCisJY2xpZW50IG1ldGhvZCBnZW5lcmF0aW9uIHVudGlsIHdlIGNhbiBmaXggaXQuLi4KKwkKKwkqIHRvb2xzL2RidXMtdmlld2VyLmMgKGxvYWRfY2hpbGRfbm9kZXMpOiBVc2UgZGJ1c19nX3Byb3h5X2NhbGwuCisJKGxvYWRfZnJvbV9zZXJ2aWNlX3RocmVhZF9mdW5jKTogRGl0dG8uCisKKwkqIHRvb2xzL2RidXMtbmFtZXMtbW9kZWwuYyAoc3RydWN0IE5hbWVzTW9kZWwpOiBIb2xkCisJREJ1c0dQcm94eUNhbGwuCisJKGhhdmVfbmFtZXNfbm90aWZ5KTogVXBkYXRlIHByb3RvdHlwZSwgdXNlCisJZGJ1c19nX3Byb3h5X2NhbmNlbF9jYWxsLgorCShuYW1lc19tb2RlbF9yZWxvYWQpOiBVcGRhdGUgZm9yIG5ldyBkYnVzX2dfcHJveHlfYmVnaW5fY2FsbCBBUEkuCisKKwkqIHRvb2xzL2RidXMtbW9uaXRvci5jIChmaWx0ZXJfZnVuYyk6IFVwZGF0ZSBmb3IgcHJpbnRfbWVzc2FnZQorCUFQSSBjaGFuZ2UuCisKKwkqIHRlc3QvZ2xpYi90ZXN0LWRidXMtZ2xpYi5jOiBBZGQgbW9yZSB0ZXN0cyBmb3IgYXN5bmMKKwlpbnZvY2F0aW9ucy4gIFVwZGF0ZSBtYW55IGJlZ2luX2NhbGwvZW5kX2NhbGwgcGFpcnMgdG8ganVzdCB1c2UKKwlkYnVzX2dfcHJveHlfY2FsbC4KKworCSogdG9vbHMvZGJ1cy1zZW5kLmMgKG1haW4pOiBBZGQgLS1wcmludC1yZXBseT1saXRlcmFsIG1vZGUuICBUaGlzCisJYWxsb3dzIHVzIHRvIGR1bXAgcHJpbnQtaW50cm9zcGVjdC5jLgorCisJKiB0b29scy9kYnVzLXByaW50LW1lc3NhZ2UuaCAocHJpbnRfbWVzc2FnZSk6IEFkZCBsaXRlcmFsIGFyZ3VtZW50CisJdG8gcHJpbnRfbWVzc2FnZSB3aGljaCBpcyBpbnRlbmRlZCB0byBhbGxvdyBwcmludGluZyBhcmd1bWVudHMgd2l0aG91dAorCW1ldGFkYXRhIGxpa2UgInN0cmluZz0iLgorCisJKiB0b29scy9kYnVzLXByaW50LW1lc3NhZ2UuYyAocHJpbnRfaXRlcik6IEFkZCBsaXRlcmFsIGFyZ3VtZW50LgorCShwcmludF9tZXNzYWdlKTogQWxsb3cgcHJpbnRpbmcgc3RyaW5nIG1lc3NhZ2VzIGxpdGVyYWxseS4KKworMjAwNS0wNy0wNSAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogZ2xpYi9kYnVzLWdwcm94eS5jIChtYXJzaGFsX2RidXNfbWVzc2FnZV90b19nX21hcnNoYWxsZXIpOgorCVJlbW92ZSB2YWx1ZSByZWZjb3VudCBsZWFrLCBvcmlnaW5hbCBwYXRjaCBmcm9tIEpvcm4gQmFheWVuCisJPGpvcm5Ab3BlbmVkaGFuZC5jb20+LiAgQWxzbyByZW1vdmUgdXNlbGVzcyBleHRyYSB2YWx1ZSBpbiBmYXZvcgorCW9mIHByZXBlbmRpbmcgdG8gdmFsdWUgYXJyYXkgZGlyZWN0bHkuCisKKzIwMDUtMDctMDIgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwkqIGdsaWIvZGJ1cy1nbWFpbi5jIChfZGJ1c19nbWFpbl90ZXN0KTogRml4IHRlc3QuCisKKzIwMDUtMDctMDEgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwlQYXRjaCBmcm9tIEpvbmF0aGFuIE1hdHRoZXcgPGpvbmF0aGFuQGthb2xpbi5obi5vcmc+CisJCisJKiBnbGliL2RidXMtZ3ZhbHVlLmMgKGJhc2ljX3R5cGVjb2RlX3RvX2d0eXBlKTogRml4IHJldHVybiB0eXBlLgorCShkYnVzX2dfdmFsdWVfdHlwZXNfaW5pdCk6IE1hcnNoYWwgR19UWVBFX0NIQVIgYXMgREJVU19UWVBFX0JZVEUsCisJR19UWVBFX0xPTkcgYXMgREJVU19UWVBFX0lOVDMyLCBHX1RZUEVfVUxPTkcgYXMgREJVU19UWVBFX1VJTlQzMiwKKwlhbmQgR19UWVBFX0ZMT0FUIGFzIERCVVNfVFlQRV9ET1VCTEUuCisKKzIwMDUtMDYtMzAgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwkqIHRlc3QvZ2xpYi90ZXN0LWRidXMtZ2xpYi5jOgorCSogdGVzdC9nbGliL3Rlc3Qtc2VydmljZS1nbGliLmM6CisJKiB0ZXN0L2dsaWIvdGVzdC1zZXJ2aWNlLWdsaWIueG1sOiBVcGRhdGUgdGVzdHMgZm9yIG5ldyBlcnJvcgorCXNldHRpbmcgYml0cywgYWxzbyBhZGQgYXN5bmMgdGVzdHMgKHBhdGNoIGZyb20gUm9zcyBCdXJ0b24pLgorCisJKiB0ZXN0L2dsaWIvTWFrZWZpbGUuYW0gKHRlc3Rfc2VydmljZV9nbGliX0xEQUREKTogQWRkCisJREJVU19HTElCX1RIUkVBRFNfTElCUy4KKworCSogZ2xpYi9kYnVzLWdwcm94eS5jIChnZXRfbmFtZV9vd25lcikKKwkoZGJ1c19nX3BlbmRpbmdfY2FsbF9lbmRfdmFsaXN0KTogRGl0dG8uCisKKwkqIGdsaWIvZGJ1cy1nb2JqZWN0LmMgKGVycm9yX21ldGFkYXRhKTogTmV3IG1hcHBpbmcgZnJvbSBHRXJyb3IKKwlkb21haW4gKEdRdWFyaykgdG8gREJ1c0dFcnJvckluZm8uICAKKwkoZ2Vycm9yX2RvbWFpbmNvZGVfdG9fZGJ1c19lcnJvcl9uYW1lKTogQXR0ZW1wdCB0byBsb29rIHVwIGVycm9yCisJcXVhcmsgaW4gZXJyb3JfbWV0YWRhdGEuICBUYWtlIG1lc3NhZ2UgaW50ZXJmYWNlIGFzIGRlZmF1bHQKKwllcnJvciBtZXNzYWdlIGludGVyZmFjZS4KKwkoZ2Vycm9yX3RvX2RidXNfZXJyb3JfbWVzc2FnZSk6IFBhc3MgbWVzc2FnZSBpbnRlcmZhY2UuCisJKGRidXNfc2V0X2dfZXJyb3IpOiBSZXN1cnJlY3RlZC4KKwkoZGJ1c19nX2Vycm9yX2luZm9fZnJlZSk6IE5ldyBmdW5jdGlvbi4KKwkoZGJ1c19nX29iamVjdF90eXBlX2luc3RhbGxfaW5mbyk6IFVzZSBnX3R5cGVfY2xhc3NfcmVmIGluc3RlYWQKKwlvZiBfcGVlayB0byBhY3R1YWxseSBjcmVhdGUgdGhlIG9iamVjdCBjbGFzcyBpZiBpdCBoYXNuJ3QgYmVlbgorCWNyZWF0ZWQgeWV0LgorCShkYnVzX2dfZXJyb3JfZG9tYWluX3JlZ2lzdGVyKTogTmV3IGZ1bmN0aW9uLgorCisJKiBnbGliL2RidXMtZ21haW4uYyAoZGJ1c19nX2J1c19nZXQpOiBTd2l0Y2ggdG8gZGJ1c19zZXRfZ19lcnJvci4KKworCSogZ2xpYi9kYnVzLWdwYXJzZXIuYyAodmFsaWRhdGVfc2lnbmF0dXJlKTogRGl0dG8uCisKKwkqIGRidXMvZGJ1cy1nbGliLmggKGRidXNfZ19lcnJvcl9zZXQpOiBEZWxldGUuCisJKGRidXNfZ19lcnJvcl9kb21haW5fcmVnaXN0ZXIpOiBQcm90b3R5cGUuCisKKwkqIGdsaWIvZGJ1cy1nbGliLmMgKGRidXNfZ19lcnJvcl9zZXQpOiBEZWxldGUuCisJVXBkYXRlIHRlc3RzLgorCisyMDA1LTA2LTI5ICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiBkYnVzL2RidXMtZ2xpYi5oOiBEZWxldGUgREJVU19UWVBFX0dfUFJPWFlfQVJSQVkuICBBZGQKKwlEQlVTX1RZUEVfR19PQkpFQ1RfUEFUSC4KKworCSogZ2xpYi9kYnVzLWd2YWx1ZS5jIChkYnVzX2dfdmFsdWVfdHlwZXNfaW5pdCk6IFJlbW92ZSBtYXJzaGFsbGVycworCWZvciBHX1RZUEVfT0JKRUNUIGFuZCBEQlVTX1RZUEVfR19QUk9YWV9BUlJBWSAodGhlIGxhdHRlciBzaG91bGQKKwliZSBoYW5kbGVkIG1vcmUgZ2VuZXJpY2FsbHkpLiAgQWRkIERCVVNfVFlQRV9HX09CSkVDVF9QQVRILgorCShkYnVzX2dfb2JqZWN0X3BhdGhfZ2V0X2dfdHlwZSk6IE5ldyBmdW5jdGlvbi4KKwkoZGJ1c19ndHlwZV9mcm9tX3NpZ25hdHVyZV9pdGVyKTogTWFwIERCVVNfVFlQRV9PQkpFQ1RfUEFUSAorCXRvIERCVVNfVFlQRV9HX09CSkVDVF9QQVRIIGJ5IGRlZmF1bHQuCisJKGRlbWFyc2hhbF9wcm94eSk6IFJlbW92ZSB1bnVzZWQgbmFtZSB2YXJpYWJsZS4KKwkoZGVtYXJzaGFsX29iamVjdF9wYXRoLCBtYXJzaGFsX29iamVjdF9wYXRoKTogTmV3IGZ1bmN0aW9ucy4KKwkoZGVtYXJzaGFsX3Byb3h5X2FycmF5LCBtYXJzaGFsX3Byb3h5X2FycmF5KTogRGVsZXRlLgorCQorCSogZ2xpYi9kYnVzLWJpbmRpbmctdG9vbC1nbGliLmMgKGRidXNfZ190eXBlX2dldF9jX25hbWUpOiBNYXAKKwlEQlVTX1RZUEVfR19PQkpFQ1RfUEFUSCB0byBjaGFyICouCisJKGRidXNfZ190eXBlX2dldF9sb29rdXBfZnVuY3Rpb24pOiBNYXAgYnVpbHRpbgorCURCVVNfVFlQRV9HX09CSkVDVF9QQVRILgorCisJKiB0ZXN0L2dsaWIvdGVzdC1kYnVzLWdsaWIuYworCSogdGVzdC9nbGliL3Rlc3Qtc2VydmljZS1nbGliLmMgKG15X29iamVjdF9vYmpwYXRoKTogCisJQWRhcHQgdGVzdHMgdG8gbmV3IG9iamVjdCBwYXRoIG1hcnNoYWxsaW5nLgorCisyMDA1LTA2LTI5ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBjb25maWd1cmUuaW46IGZvcmNlIGNoZWNrIGZvciBQeXRob24gPj0gMi40CisKKzIwMDUtMDYtMjkgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisJCisJUGF0Y2ggZnJvbSBSb3NzIEJ1cnRvbiA8cm9zc0BvcGVuZWRoYW5kLmNvbT4KKwkKKwkqIGdsaWIvZGJ1cy1nb2JqZWN0LmMgKGludm9rZV9vYmplY3RfbWV0aG9kKTogVW5zZXQgb2JqZWN0CisJdmFsdWUgaW4gYWxsIGNhc2VzLCBub3Qgb25seSBpbiBhc3luYyBjYXNlLgorCisyMDA1LTA2LTI5ICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiBnbGliL2RidXMtZ3Byb3h5LmMgKHN0cnVjdCBfREJ1c0dQcm94eSk6IEFkZCBuZXcgbWVtYmVyCisJbmFtZV9jYWxsIGZvciBrZWVwaW5nIHRyYWNrIG9mIGFueSBvdXRnb2luZyBHZXROYW1lT3duZXIgY2FsbC4KKwlBbHNvIGFkZCBmb3Jfb3duZXIgYW5kIGFzc29jaWF0ZWQuCisJKHN0cnVjdCBfREJ1c0dQcm94eU1hbmFnZXIpOiBBZGQgb3duZXJfbmFtZXMsIHdoaWNoIGlzIGhhc2ggdGFibGUKKwl0aGF0IG1hcHMgYSBiYXNlIG5hbWUgdG8gYSBsaXN0IG9mIG5hbWVzIGl0IG93bnMgKHRoYXQgd2UncmUKKwlpbnRlcmVzdGVkIGluKS4gIEFkZCBwZW5kaW5nX25hbWVvd25lcl9jYWxscyB3aGljaCBpcyBhIGxpc3Qgb2YKKwlhbGwgb3V0c3RhbmRpbmcgR2V0TmFtZU93bmVyOyBhdm9pZHMgdXMgaGF2aW5nIHRvIGl0ZXJhdGUgb3ZlcgorCWV2ZXJ5IHByb3h5LiAgQWRkIHVuYXNzb2NpYXRlZF9wcm94aWVzIHdoaWNoIGtlZXBzIHRyYWNrIG9mIG5hbWUKKwlwcm94aWVzIHdpdGggbm8gYXNzb2NpYXRlZCBuYW1lIG93bmVyLgorCShkYnVzX2dfcHJveHlfbWFuYWdlcl91bnJlZik6IERlc3Ryb3kgb3duZXJfbmFtZXMuCisJKHN0cnVjdCBEQnVzR1Byb3h5TmFtZU93bmVySW5mbyk6IE5ldyBzdHJ1Y3QgZm9yIGtlZXBpbmcgdHJhY2sgb2YKKwluYW1lIHJlZmNvdW50cy4KKwkoZmluZF9uYW1lX2luX2luZm8sIG5hbWVfb3duZXJfZm9yZWFjaCkKKwkoZGJ1c19nX3Byb3h5X21hbmFnZXJfbG9va3VwX25hbWVfb3duZXIsIGluc2VydF9uYW1laW5mbykKKwkoZGJ1c19nX3Byb3h5X21hbmFnZXJfbW9uaXRvcl9uYW1lX293bmVyKQorCShkYnVzX2dfcHJveHlfbWFuYWdlcl91bm1vbml0b3JfbmFtZV9vd25lcikKKwkodW5hc3NvY2lhdGVfcHJveGllcywgZGJ1c19nX3Byb3h5X21hbmFnZXJfcmVwbGFjZV9uYW1lX293bmVyKToKKwlOZXcgZnVuY3Rpb25zOyB0aGV5IG1hbmlwdWxhdGUgdGhlIG93bmVyX25hbWVzIG1hcHBpbmcuCisJKGdvdF9uYW1lX293bmVyX2NiKTogTmV3IGZ1bmN0aW9uLgorCShnZXRfbmFtZV9vd25lcik6IE5ldyBmdW5jdGlvbiwgZXh0cmFjdGVkIGZyb20KKwlkYnVzX2dfcHJveHlfbmV3X2Zvcl9uYW1lX293bmVyLgorCShkYnVzX2dfcHJveHlfbWFuYWdlcl9yZWdpc3Rlcik6IEZvciBub3cgd2UgbmVlZCB0byBrZWVwIHRyYWNrIG9mCisJYWxsIE5hbWVPd25lckNoYW5nZWQuICBBbHNvIGlmIHRoZSBwcm94eSBpcyBmb3IgYSBuYW1lLCBpZiB3ZQorCWRvbid0IGFscmVhZHkga25vdyB0aGUgbmFtZSBvd25lciwgcXVldWUgYSBuZXcgR2V0TmFtZU93bmVyCisJcmVxdWVzdCBhbmQgYWRkIGl0IHRvIG91ciBsaXN0IG9mIHVuYXNzb2NpYXRlZCBwcm94aWVzLiAgT3RoZXJ3aXNlCisJaW5jIHRoZSByZWZjb3VudC4KKwkoZGJ1c19nX3Byb3h5X21hbmFnZXJfdW5yZWdpc3Rlcik6IElmIHRoaXMgcHJveHkgaXMgZm9yIGEgbmFtZSwKKwljYW5jZWwgYW55IHBlbmRpbmcgR2V0TmFtZU93bmVyIGNhbGwsIGV0Yy4KKwkoZGJ1c19nX3Byb3h5X21hbmFnZXJfZmlsdGVyKTogSGFuZGxlIE5hbWVPd25lckNoYW5nZWQuICBBbHNvIHVzZQorCXRoZSBvd25lcl9uYW1lcyBtYXBwaW5nIHRvIGxvb2sgdXAgdGhlIGN1cnJlbnQgbmFtZXMgZm9yIHRoZQorCXNpZ25hbCBzb3VyY2UsIGFuZCBkaXNwYXRjaCB0byBhbnkgcHJveGllcyBmb3IgdGhhdCBuYW1lLgorCShkYnVzX2dfcHJveHlfbmV3KTogSW5pdGlhbGl6ZSBuZXcgbWVtYmVycy4KKwkoZGJ1c19nX3Byb3h5X25ld19mb3JfbmFtZSk6IERlbGV0ZSB1bnVzZWQgcHJveHkgdmFyaWFibGUuCisJKGRidXNfZ19wcm94eV9uZXdfZm9yX25hbWVfb3duZXIpOiBVc2UgZ2V0X25hbWVfb3duZXIuCisJKGRidXNfZ19wZW5kaW5nX2NhbGxfZW5kX3ZhbGlzdCk6IE5ldyBmdW5jdGlvbiwgZXh0cmFjdGVkIGZyb20KKwlkYnVzX2dfcHJveHlfZW5kX2NhbGxfaW50ZXJuYWwuICBVc2VmdWwgd2hlbiB3ZSBkb24ndCBoYXZlIGEgcHJveHkKKwlidXQgd2FudCB0byB1c2UgdGhlIEdMaWIgaW5mcmFzdHJ1Y3R1cmUuICBBbHNvIG5vdGUgaG93IG1hbnkKKwlhcmd1bWVudHMgaW4gcmVwbHkgd2VyZSBvdmVyLgorCShkYnVzX2dfcGVuZGluZ19jYWxsX2VuZCk6IE5ldyBmdW5jdGlvbiwganVzdCBjYWxsCisJZGJ1c19nX3BlbmRpbmdfY2FsbF9lbmRfdmFsaXN0LgorCShkYnVzX2dfcHJveHlfZW5kX2NhbGxfaW50ZXJuYWwpOiBKdXN0IGNhbGwKKwlkYnVzX2dfcGVuZGluZ19jYWxsX2VuZF92YWxpc3QuCisKKwkqIGdsaWIvZGJ1cy1nb2JqZWN0LmMgKF9kYnVzX2dvYmplY3RfbG9va3VwX21hcnNoYWxsZXIpOiBGaXggbG9va3VwCisJb2YgYnVpbHRpbiBtYXJzaGFsbGVyIGZvciBTVFJJTkdfU1RSSU5HX1NUUklORy4KKworCSogdGVzdC9nbGliL3Rlc3QtZGJ1cy1nbGliLmM6IAorCSogdGVzdC9nbGliL3Rlc3Qtc2VydmljZS1nbGliLmM6CisJKiB0ZXN0L2dsaWIvdGVzdC1zZXJ2aWNlLWdsaWIueG1sOgorCUV4dGVuZCB0ZXN0cyB0byBjb3ZlciBuYW1lIHByb3hpZXMsIGRlc3RydWN0aW9uIG9mIG93bmVyIHByb3hpZXMsCisJZXRjLgorCQorCSogZ2xpYi9leGFtcGxlcy9leGFtcGxlLXNpZ25hbC1yZWNpcGllbnQuYworCShkYnVzX2dfcHJveHlfbmV3X2Zvcl9uYW1lX293bmVyKTogQ3JlYXRlIGEgbmFtZSBwcm94eS4KKwkKKwkqIHRvb2xzL2RidXMtc2VuZC5jIChtYWluKTogUHJpbnQgRC1CVVMgZXJyb3IgbmFtZSBpbiBhZGRpdGlvbgorCXRvIG1lc3NhZ2UuCisKKzIwMDUtMDYtMjggIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIHB5dGhvbi9kYnVzX2JpbmRpbmdzLnB5eC5pbiAoY3VucmVnaXN0ZXJfZnVuY3Rpb25faGFuZGxlciwKKwljbWVzc2FnZV9mdW5jdGlvbl9oYW5kbGVyKTogUGF0Y2ggZnJvbSAKKwlBbnRob255IEJheHRlciA8YW50aG9ueUBpbnRlcmxpbmsuY29tLmF1PiBmaXhlcyB0aHJlYWRpbmcgcHJvYmxlbXMKKwlieSB1c2luZyB0aGUgUHlfR0lMU3RhdGVfRW5zdXJlL1JlbGVhc2UgdG8gc3luY2hyb25pemUgd2l0aCB0aGUKKwlweXRob24gcnVudGltZS4KKwkKKzIwMDUtMDYtMjggIFJheSBTdHJvZGUgIDxyc3Ryb2RlQHJlZGhhdC5jb20+CisKKwkqICBkYnVzL2RidXMtc3Bhd24uYyAoX2RidXNfYmFieXNpdHRlcl91bnJlZik6IGtpbGwKKwliYWJ5c2l0dGVyIGhlbHBlciBwcm9jZXNzIG9uIGxhc3QgdW5yZWYsIGJ1ZyAjMjgxMy4KKworMjAwNS0wNi0yNyAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogdGVzdC9nbGliL3Rlc3QtZGJ1cy1nbGliLmM6IAorCSogdGVzdC9nbGliL3Rlc3Qtc2VydmljZS1nbGliLmM6CisJKiB0ZXN0L2dsaWIvdGVzdC1zZXJ2aWNlLWdsaWIueG1sOgorCVRlc3QgaGFzaCB0YWJsZSBzaWduYWwgZW1pdHRpbmcuCisKKwkqIGdsaWIvZGJ1cy1nb2JqZWN0LmMgKF9kYnVzX2dvYmplY3RfbG9va3VwX21hcnNoYWxsZXIpOiBDb252ZXJ0CisJdHlwZXMgdG8gdGhlaXIgZnVuZGFtZW50YWwgYmFzaXMgdHlwZXMsIHNpbmNlIHRoaXMgaXMgd2hhdAorCW1hcnNoYWxsZXJzIG9wZXJhdGUgb24uICBBbHNvIGFkZCBhbiBlbnRyeSBmb3IgVk9JRF9fQk9YRUQuCisJKGRidXNfZ19vYmplY3RfcmVnaXN0ZXJfbWFyc2hhbGxlcl9hcnJheSk6IENvbnZlcnQgdG8gZnVuZGFtZW50YWwuCisKKzIwMDUtMDYtMjYgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkb2MvZGJ1cy10dXRvcmlhbC54bWw6IGZpeCBuYW1lcyBvZiBpbnRlcmZhY2Uvc2VydmljZS9wYXRoLCBmaXgKKwlmcm9tIERvbiBQYXJrCisKKzIwMDUtMDYtMjYgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwkqIGdsaWIvZGJ1cy1nbGliLmMgKGRidXNfc2V0X2dfZXJyb3IpOiBEZWxldGUuCisJKGRidXNfZ19lcnJvcl9zZXQpOiBOZXcgcHVibGljIGZ1bmN0aW9uIGZyb20gaXRzIGFzaGVzOyB1c2VkIGJ5CisJYm90aCBzZXJ2aWNlLXNpZGUgbWV0aG9kIGltcGxlbWVudGF0aW9uIGFuZCBHTGliIGJpbmRpbmdzCisJaW50ZXJuYWxzLgorCShkYnVzX2dfZXJyb3JfaGFzX25hbWUsIGRidXNfZ19lcnJvcl9nZXRfbmFtZSk6IE5ldyBmdW5jdGlvbi4KKwkoX2RidXNfZ2xpYl90ZXN0KTogQWRkIHNvbWUgdGVzdHMuCisKKwkqIHRlc3QvZ2xpYi90ZXN0LWRidXMtZ2xpYi5jIChtYWluKTogVGVzdCBkYnVzX2dfZXJyb3JfaGFzX25hbWUuCisKKwkqIHRlc3QvZ2xpYi90ZXN0LXNlcnZpY2UtZ2xpYi5jIChteV9vYmplY3RfdGhyb3dfZXJyb3IpOiBVc2UKKwlkYnVzX2dfZXJyb3Jfc2V0LgorCisJKiBnbGliL2RidXMtZ29iamVjdC5jIChnZXJyb3JfdG9fZGJ1c19lcnJvcl9tZXNzYWdlKTogSGFuZGxlCisJZXJyb3JzIHRocm93biBieSBkYnVzX2dfZXJyb3Jfc2V0LgorCisJKiBnbGliL2RidXMtZ21haW4uYyAoZGJ1c19nX2J1c19nZXQpOiBDaGFuZ2UgdG8gZGJ1c19nX2Vycm9yX3NldC4KKworCSogZ2xpYi9kYnVzLWdwYXJzZXIuYyAodmFsaWRhdGVfc2lnbmF0dXJlKTogRGl0dG8uCisKKwkqIGdsaWIvZGJ1cy1ncHJveHkuYyAoZGJ1c19nX3Byb3h5X25ld19mb3JfbmFtZV9vd25lcikgCisJKGRidXNfZ19wcm94eV9lbmRfY2FsbF9pbnRlcm5hbCk6IERpdHRvLgorCisJKiBnbGliL01ha2VmaWxlLmFtOiBHZW5lcmF0ZSBkYnVzLWdsaWItZXJyb3Itc3dpdGNoLmgsIHdoaWNoCisJY29udmVydHMgREJVU19FUlJPUl94IHRvIERCVVNfR0VSUk9SX3guCisJKGxpYmRidXNfZ2xpYl8xX2xhX1NPVVJDRVMsIEJVSUxUX1NPVVJDRVMsIENMRUFORklMRVMpOiBBZGQgaXQuCisKKwkqIGRvYy9UT0RPOiBSZW1vdmUgZXJyb3IgVE9ETy4KKworCSogZG9jL2RidXMtdHV0b3JpYWwueG1sOiBVcGRhdGUgd2l0aCBkb2N1bWVudGF0aW9uIGFib3V0IGVycm9yCisJaGFuZGxpbmcuCisKKwkqIGRidXMvbWFrZS1kYnVzLWdsaWItZXJyb3ItZW51bS5zaDogVGlnaHRlbiB1cCByZWdleHAgdG8gbWFrZQorCXN1cmUgd2Ugb25seSBjaGFuZ2UgREJVU19FUlJPUiB0byBEQlVTX0dFUlJPUiwgbm90IGFsbCBFUlJPUiB0bworCUdFUlJPUi4gIEFsc28gYWRkIERCVVNfR0VSUk9SX1JFTU9URV9FWENFUFRJT04uCisKKzIwMDUtMDYtMjIgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisJCisJUGF0Y2ggZnJvbSBSb3NzIEJ1cnRvbiA8cm9zc0BvcGVuZWRoYW5kLmNvbT4KKworCSogZ2xpYi9kYnVzLWdvYmplY3QuYyAoZGJ1c19nX21ldGhvZF9yZXR1cm4pOiBGcmVlIG91dF9zaWcuCisKKzIwMDUtMDYtMjAgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwkqIGNvbmZpZ3VyZS5pbjogQWRkIGdsaWIvZXhhbXBsZXMuCisKKwkqIGdsaWIvTWFrZWZpbGUuYW06IEFkZCBleGFtcGxlcy8KKworCSogZ2xpYi9leGFtcGxlcy8uY3ZzaWdub3JlCisJKiBnbGliL2V4YW1wbGVzL01ha2VmaWxlLmFtCisJKiBnbGliL2V4YW1wbGVzL2V4YW1wbGUtY2xpZW50LmMKKwkqIGdsaWIvZXhhbXBsZXMvZXhhbXBsZS1zZXJ2aWNlLmMKKwkqIGdsaWIvZXhhbXBsZXMvZXhhbXBsZS1zZXJ2aWNlLnhtbAorCSogZ2xpYi9leGFtcGxlcy9leGFtcGxlLXNpZ25hbC1lbWl0dGVyLmMKKwkqIGdsaWIvZXhhbXBsZXMvZXhhbXBsZS1zaWduYWwtZW1pdHRlci54bWwKKwkqIGdsaWIvZXhhbXBsZXMvZXhhbXBsZS1zaWduYWwtcmVjaXBpZW50LmM6CisJTmV3IGZpbGVzOyBHTGliIGJpbmRpbmcgZXhhbXBsZXMsIHBvcnRlZCBmcm9tCisJcHl0aG9uL2V4YW1wbGVzLgorCisyMDA1LTA2LTIwICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiBkYnVzL2RidXMtZ2xpYi5oOiAKKwkqIGdsaWIvZGJ1cy1ncHJveHkuYzogUmVuYW1lIGRidXNfZ19wcm94eV9pbnZva2UgdG8KKwlkYnVzX2dfcHJveHlfY2FsbC4KKworCSogZ2xpYi9kYnVzLWJpbmRpbmctdG9vbC1nbGliLmM6IAorCSogZG9jL2RidXMtdHV0b3JpYWwueG1sOiAKKwkqIHRlc3QvZ2xpYi90ZXN0LWRidXMtZ2xpYi5jOiBVcGRhdGUgZm9yIHJlbmFtZS4KKwkKKzIwMDUtMDYtMjAgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwlQYXRjaCBzdWdnZXN0ZWQgYnkgUm9zcyBCdXJ0b24gPHJvc3NAb3BlbmVkaGFuZC5jb20+CisKKwkqIGdsaWIvZGJ1cy1nb2JqZWN0LmMgKGV4cG9ydF9zaWduYWxzKTogRnJlZSBzaWduYWwgbmFtZS4KKwkoZ192YWx1ZV9pbml0KTogVXNlIEdfVkFMVUVfTk9DT1BZX0NPTlRFTlRTIHRvIHBsdWcKKwltZW1vcnkgbGVhay4gIEFkZCBhIGJpdCBvZiBkb2N1bWVudGF0aW9uLgorCShkYnVzX2dfbWV0aG9kX3JldHVybl9lcnJvcik6IEZyZWUgY29udGV4dCwgYW5kIG5vdGUgd2UgZG8KKwlzby4KKworMjAwNS0wNi0xOCAgTXVycmF5IEN1bW1pbmcgIDxtdXJyYXljQG11cnJheWMuY29tPgorCisJKiBkYnVzL2RidXMtZ2xpYi5oOgorCSogZ2xpYi9kYnVzLWdvYmplY3QuYzoKKwkqIGdsaWIvZGJ1cy1ncHJveHkuYzoKKwkqIGdsaWIvZGJ1cy1ndmFsdWUuYzogUHJlZGVjbGFyZSBzdHJ1Y3RzIGFzIAorCXR5cGVkZWYgc3RydWN0IF9Tb21ldGhpbmcgU29tZXRoaW5nIGluc3RlYWQgb2YgCisgIAl0eXBlZGVmIHN0cnVjdCBTb21ldGhpbmcgU29tZXRoaW5nLCBzbyB3ZSBjYW4gCisJcmVkZWNsYXJlIHRoZSBwcm90b3R5cGVzLiBPdGhlciBHTk9NRSBsaWJyYXJpZXMgCisJZG8gdGhpcyBhbHJlYWR5LgorCisyMDA1LTA2LTE3ICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiB0b29scy9kYnVzLW5hbWVzLW1vZGVsLmMgKGhhdmVfbmFtZXNfbm90aWZ5KTogRml4IGNhbGwKKwl0byBkYnVzX2dfcHJveHlfZW5kX2NhbGwuCisJCisyMDA1LTA2LTE3ICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiBnbGliL2RidXMtZ3Byb3h5LmMgKGRidXNfZ19wcm94eV9lbWl0X3JlbW90ZV9zaWduYWwpOiBEb24ndAorCXNwZXcgd2FybmluZ3MgaWYgd2UgZ2V0IG1hbGZvcm1lZCByZW1vdGUgc2lnbmFscy4KKworCSogZ2xpYi9kYnVzLWdvYmplY3QuYyAocHJvcHNpZ19pdGVyYXRlKTogTmV3IGZ1bmN0aW9uLgorCShsb29rdXBfb2JqZWN0X2luZm8pOiBOZXcgZnVuY3Rpb24sIGV4dHJhY3RlZCBmcm9tCisJbG9va3VwX29iamVjdF9hbmRfbWV0aG9kLgorCShpbnRyb3NwZWN0X3Byb3BlcnRpZXMsIGludHJvc3BlY3Rfc2lnbmFscyk6IERlbGV0ZTsgdGhlc2UKKwlhcmUgbWVyZ2VkIGludG8gd3JpdGVfaW50ZXJmYWNlLgorCSh3cml0ZV9pbnRlcmZhY2UpOiBXcml0ZSBvdXQgc2lnbmFscyBhbmQgcHJvcGVydGllcyBoZXJlOworCWR1bXAgdGhlIG9yZy5ndGsub2JqZWN0IHN0dWZmIGFuZCB1c2UgdGhlIGludGVyZmFjZSBnaXZlbgorCWluIHRoZSBpbnRyb3NwZWN0aW9uIGRhdGEgYmxvYi4gIEFsc28gZml4IHVwIHByb3BlcnR5IFhNTC4KKwkobG9va3VwX3ZhbHVlcyk6IE5ldyBmdW5jdGlvbi4KKwkoaW50cm9zcGVjdF9pbnRlcmZhY2VzKTogR2F0aGVyIGEgbWFwcGluZyBmcm9tIGludGVyZmFjZSB0byBhCisJbGlzdCBvZiBpdHMgbWV0aG9kcywgc2lnbmFscywgYW5kIHByb3BlcnRpZXMsIHRoZW4gd3JpdGUgb3V0CisJZWFjaCBpbnRlcmZhY2UuCisJKGxvb2t1cF9vYmplY3RfYW5kX21ldGhvZCk6IFVzZSBsb29rdXBfb2JqZWN0X2luZm8uCisJKHN0cnVjdCBEQnVzR1NpZ25hbENsb3N1cmUpOiBBZGQgaW50ZXJmYWNlLgorCShkYnVzX2dfc2lnbmFsX2Nsb3N1cmVfbmV3KTogQWRkIGludGVyZmFjZS4gRG9uJ3QgZHVwIHNpZ25hbWU7CisJd2UgY2FuIGp1c3QgdXNlIHRoZSBjb25zdGFudCBkYXRhLgorCShkYnVzX2dfc2lnbmFsX2Nsb3N1cmVfZmluYWxpemUpOiBEb24ndCBmcmVlIHNpZ25hbCBuYW1lLgorCShzaWduYWxfZW1pdHRlcl9tYXJzaGFsbGVyKTogVXNlIGludGVyZmFjZSBmcm9tIHNpZ25hbCBjbG9zdXJlLgorCShleHBvcnRfc2lnbmFscyk6IE9ubHkgZXhwb3J0IHNpZ25hbHMgbWVudGlvbmVkIGluIGludHJvc3BlY3Rpb24KKwlibG9iLgorCShkYnVzX2dfY29ubmVjdGlvbl9yZWdpc3Rlcl9nX29iamVjdCk6IFdhcm4gaWYgd2UgaGF2ZSBubworCWludHJvc3BlY3Rpb24gZGF0YSBmb3IgYW4gb2JqZWN0LgorCShmdW5jc2lnX2VxdWFsKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZS4KKwkoZGJ1c19nX29iamVjdF9yZWdpc3Rlcl9tYXJzaGFsbGVyKTogVGFrZSB2YXJhcmdzIGluc3RlYWQgb2YKKwlsaXN0LgorCShkYnVzX2dfb2JqZWN0X3JlZ2lzdGVyX21hcnNoYWxsZXJfYXJyYXkpOiBOZXcgZnVuY3Rpb24sCisJZXh0cmFjdGVkIGZyb20gb2xkIGRidXNfZ19vYmplY3RfcmVnaXN0ZXJfbWFyc2hhbGxlci4KKworCSogZ2xpYi9kYnVzLWJpbmRpbmctdG9vbC1nbGliLmMgKHN0cnVjdCBEQnVzQmluZGluZ1Rvb2xDRGF0YSk6IEFkZAorCXNpZ25hbHMgYW5kIHByb3BlcnR5IGRhdGEuCisJKHdyaXRlX3F1b3RlZF9zdHJpbmcpOiBOZXcgZnVuY3Rpb24sIGV4dHJhY3RlZCBmcm9tIGdlbmVyYXRlX2dsdWUuCisJKGdlbmVyYXRlX2dsdWUpOiBXcml0ZSBzaWduYWxzIGFuZCBwcm9wZXJ0aWVzIHRvIGludHJvc3BlY3Rpb24KKwlibG9iLgorCisJKiBkYnVzL2RidXMtZ2xpYi5oIChzdHJ1Y3QgREJ1c0dPYmplY3RJbmZvKTogSW5jbHVkZQorCWV4cG9ydGVkX3NpZ25hbHMgYW5kIGV4cG9ydGVkX3Byb3BlcnRpZXMuCisJKGRidXNfZ19vYmplY3RfcmVnaXN0ZXJfbWFyc2hhbGxlcik6IFVwZGF0ZSBwcm90b3R5cGUuCisJKGRidXNfZ19vYmplY3RfcmVnaXN0ZXJfbWFyc2hhbGxlcl9hcnJheSk6IFByb3RvdHlwZS4KKwkKKwkqIHRlc3QvZ2xpYi90ZXN0LWRidXMtZ2xpYi5jOiBFeHRlbmQgdGVzdGluZyB0byBjb3ZlciBuZXcgc2lnbmFscy4KKworCSogdGVzdC9nbGliL3Rlc3Qtc2VydmljZS1nbGliLmM6IEFkZCBuZXcgdGVzdCBzaWduYWxzIGFuZCBtZXRob2QKKwl0byBlbWl0IHRoZW0uCisKKwkqIHRlc3QvZ2xpYi90ZXN0LXNlcnZpY2UtZ2xpYi54bWw6IEFkZCBzb21lIHRlc3Qgc2lnbmFscy4KKworCSogdGVzdC9nbGliL01ha2VmaWxlLmFtIChCVUlMVF9TT1VSQ0VTKTogQWRkIG15LW9iamVjdC1tYXJzaGFsLmMKKwlhbmQgbXktb2JqZWN0LW1hcnNoYWwuaAorCSh0ZXN0X3NlcnZpY2VfZ2xpYl9TT1VSQ0VTLCB0ZXN0X2RidXNfZ2xpYl9TT1VSQ0VTKTogQWRkCisJbXktb2JqZWN0LW1hcnNoYWwuYy4KKwkobXktb2JqZWN0LW1hcnNoYWwuYywgbXktb2JqZWN0LW1hcnNoYWwuaCk6IEltcGxlbWVudC4KKworCSogdGVzdC9nbGliLy5jdnNpZ25vcmU6IFVwZGF0ZS4KKworCSogZG9jL1RPRE86IFJlbW92ZSB0d28gR0xpYiBUT0RPIGl0ZW1zIGZpeGVkIGJ5IHRoaXMKKwlwYXRjaC4KKworMjAwNS0wNi0xNiAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogZG9jL1RPRE86IFVwZGF0ZSBmb3IgR0xpYiBiaW5kaW5ncy4KKwkKKzIwMDUtMDYtMTYgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwkqIGdsaWIvZGJ1cy1iaW5kaW5nLXRvb2wtZ2xpYi5jOgorCSogZ2xpYi9kYnVzLWdvYmplY3QuYzoKKwkqIGdsaWIvZGJ1cy1ncHJveHkuYzogIEFkZCBOb2tpYSBjb3B5cmlnaHQ7IFBhdGNoCisJZnJvbSBSb3NzIEJ1cnRvbiwgZm9yIGhpcyBHTGliIGJpbmRpbmdzIHdvcmsuCisKKzIwMDUtMDYtMTYgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwkqIGdsaWIvZGJ1cy1nb2JqZWN0LmMgKGZ1bmNzaWdfaGFzaCwgZnVuY3NpZ19lcXVhbCk6IFVzZSBuX3BhcmFtcworCXRvIGl0ZXJhdGUgaW5zdGVhZCBvZiB3YWxraW5nIHRvIEdfVFlQRV9JTlZBTElELgorCisJUGF0Y2ggYmFzZWQgb24gYSBwYXRjaCBmcm9tIFJ5YW4gR2FtbW9uLgorCisyMDA1LTA2LTE2ICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiBidXMvYnVzLmMgKGJ1c19jb250ZXh0X25ldyk6IFNldCBwYXJzZXIgdG8gTlVMTAorCWFmdGVyIHdlIHVucmVmIGl0IChQYXRjaCBmcm9tIENocmlzIEJvc2NvbG8sICMyMTc0KS4KKwkKKzIwMDUtMDYtMTYgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwkqIHB5dGhvbi9kYnVzX2JpbmRpbmdzLnB5eC5pbjogSW1wb3J0IHNpemVfdCwKKwlfX2ludDY0X3QsIF9fdWludDY0X3QsIGFuZCBfX3NpZ25lZC4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYyA8SEFWRV9DTVNHQ1JFRD4gKHdyaXRlX2NyZWRlbnRpYWxzX2J5dGUpOgorCURlZmluZSBjbXNnIHN0cnVjdCwgb3V0cHV0IGl0LgorCShfZGJ1c19yZWFkX2NyZWRlbnRpYWxzX3VuaXhfc29ja2V0KToKKwlVc2UgY21zZyBzdHJ1Y3QuCisJCisJUGF0Y2ggZnJvbSBKb2UgTWFya3VzIENsYXJrZSBmb3IgRnJlZUJTRCBzdXBwb3J0LgorCQorMjAwNS0wNi0xNiAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogdG9vbHMvZGJ1cy1zZW5kLmMgKGFwcGVuZF9hcnJheSk6IFVzZSBzdHJ0b2suCisJKGFwcGVuZF9kaWN0KTogTmV3IGZ1bmN0aW9uLgorCSh0eXBlX2Zyb21fbmFtZSk6IE5ldyBmdW5jdGlvbiwgZXh0cmFjdGVkIGZyb20gbWFpbi4KKwkobWFpbik6IEhhbmRsZSBzZW5kaW5nIGRpY3RzLgorCisJKiB0b29scy9kYnVzLXByaW50LW1lc3NhZ2UuYyAocHJpbnRfaXRlcik6IFByaW50IGRpY3QKKwllbnRyaWVzLgorCQorMjAwNS0wNi0xNiAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogZ2xpYi9kYnVzLWd2YWx1ZS5jIChtYXJzaGFsX2Jhc2ljKTogTWFyc2hhbCBOVUxMIHN0cmluZworCXZhbHVlcyBhcyB0aGUgZW1wdHkgc3RyaW5nICgjMjk0OCkuCisJCisyMDA1LTA2LTE2ICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiBkYnVzL01ha2VmaWxlLmFtOgorCSogbW9uby9kb2MvTWFrZWZpbGUuYW06CisJKiB0ZXN0L2dsaWIvTWFrZWZpbGUuYW06CisKKwlGaXggc3JjZGlyICE9IGJ1aWxkZGlyIGlzc3VlcyAoUGF0Y2ggZnJvbSBDaHJpcyBXaWxzb24sICMzNDc3KQorCisyMDA1LTA2LTE2ICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiBkYnVzL2RidXMtbWFyc2hhbC1oZWFkZXIuYyAoX2RidXNfaGVhZGVyX2xvYWQpOiBTZXQKKwloZWFkZXIgYnl0ZSBvcmRlciBmcm9tIGV4cGVjdGVkIGJ5dGUgb3JkZXIgKFBhdGNoIGZyb20gQ2hyaXMgV2lsc29uLCAjMzQ3NSkuCisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLWJ5dGVzd2FwLmMgKGJ5dGVzd2FwX2JvZHlfaGVscGVyKTogCisJSW5jcmVtZW50IHBvaW50ZXIgYWZ0ZXIgc3dhcHBpbmcgZml4ZWQgYXJyYXkuICBBZGQgYXNzZXJ0aW9uCisJZm9yIGFycmF5IGxlbmd0aC4KKwkJCisyMDA1LTA2LTE1ICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jIDxIQVZFX0NNU0dDUkVEPiAoX2RidXNfcmVhZF9jcmVkZW50aWFsc191bml4X3NvY2tldCk6CisJRml4IGNhbGwgdG8gZGJ1c19zZXRfZXJyb3IuICAoUGF0Y2ggZnJvbSBNaWNoYWVsIEJhbmNrLCAjMzQ2MSkKKwkKKzIwMDUtMDYtMTUgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIE5FV1M6IFVwZGF0ZSB0byAwLjM0CisKKzIwMDUtMDYtMTUgIERhdmlkIFpldXRoZW4gIDxkYXZpZHpAcmVkaGF0LmNvbT4KKworCSogY29uZmlndXJlLmluIChMVF9DVVJSRU5UKTogUmV2ZXJ0IGJhY2sgdG8gMSBhcyB0aGUgbGlicmFyeQorCWhhc24ndCBjaGFuZ2VkIGFuZCB3ZSd2ZSBjZXJ0YWlubHkgbm90IGNvbW1pdHRlZCB0byBwcm90b2NvbAorCXN0YWJpbGl0eSB5ZXQuICBBbGwgdGhpcyBkb2VzIGlzIHRvIGJyZWFrIEFCSS4gU2VlIGNvbW1pdCBub3RlCisJZnJvbSBocEByZWRoYXQuY29tIDIwMDUtMDUtMDUgZm9yIGRldGFpbHMuCisJCisyMDA1LTA2LTE1ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jIChfZGJ1c19jb25uZWN0aW9uX3BlZXJfZmlsdGVyKTogTmV3IG1ldGhvZCAKKwkoX2RidXNfY29ubmVjdGlvbl9ydW5fYnVpbHRpbl9maWx0ZXJzKTogTmV3IG1ldGhvZAorCShkYnVzX2Nvbm5lY3Rpb25fZGlzcGF0Y2gpOiBSdW4gdGhlIGJ1aWx0aW4gZmlsdGVycyB3aGljaCBpbiB0dXJuCisJcnVucyB0aGUgcGVlciBmaWx0ZXIgd2hpY2ggaGFuZGxlcyBQaW5nIG1lc3NhZ2VzLgorCisJKiBkb2MvVE9ETzogCisJIC0gUGluZyBpc24ndCBoYW5kbGVkOiBUaGlzIHBhdGNoIGZpeGVzIGl0CisJIAorCSAtIEFkZCBhIHRlc3QgY2FzZSBmb3IgdGhlIFBpbmcgbWVzc2FnZTogYWRkZWQgVE9ETyBpdGVtCisKKzIwMDUtMDYtMTUgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmM6CisJKGRidXNfbWVzc2FnZV9oYXNfcGF0aCk6IE5ldyBtZXRob2QKKwkoZGJ1c19tZXNzYWdlX2hhc19pbnRlcmZhY2UpOiBOZXcgbWV0aG9kCisJKGRidXNfbWVzc2FnZV9oYXNfbWVtYmVyKTogTmV3IG1ldGhvZAorCisJKiBkYnVzL2RidXMvZGJ1cy1zeXNkZXBzLmMgKF9kYnVzX2NoZWNrX2Rpcl9pc19wcml2YXRlX3RvX3VzZXIpOgorCU5ldyBtZXRob2QKKworCSogZGJ1cy9kYnVzLWtleXJpbmcuYyAoX2RidXNfa2V5cmluZ19yZWxvYWQpOiBDaGVjayB0byBzZWUgdGhhdCAKKwl0aGUga2V5cmluZyBkaXJlY3RvcnkgaXMgcHJpdmF0ZSB0byB0aGUgdXNlcgorCisJKiBkb2MvVE9ETzoKKwkgLSBUaGUgY29udmVuaWVuY2UgZnVuY3Rpb25zIGluIGRidXMtYnVzLmggc2hvdWxkIHBlcmhhcHMgaGF2ZQorCSB0aGUgc2lnbmF0dXJlcyB0aGF0IHRoZXkgd291bGQgaGF2ZSBpZiB0aGV5IHdlcmUgYXV0b2dlbmVyYXRlZAorCSBzdHVicy4gZS5nLiB0aGUgYWNxdWlyZSBzZXJ2aWNlIGZ1bmN0aW9uLiBXZSBzaG91bGQgYWxzbyBldmFsdWF0ZQorCSB3aGljaCBvZiB0aGVzZSBmdW5jdGlvbnMgdG8gaW5jbHVkZSwgaW4gbGlnaHQgb2YgdGhlIGZhY3QgdGhhdAorCSBHTGliL1F0IG5hdGl2ZSBzdHVicyB3aWxsIHByb2JhYmx5IGFsc28gZXhpc3QuOiBQdW50ZWQKKworCSAtIGFkZCBkYnVzX21lc3NhZ2VfaGFzX3BhdGgoKSwgbWF5YmUgaGFzX21lbWJlci9pbnRlcmZhY2U6CisJIGZpeGVkIGluIHRoaXMgcGF0Y2gKKworCSAtIGluIGRidXMta2V5cmluZy5jLCBlbmZvcmNlIHRoYXQgdGhlIGtleXJpbmcgZGlyIGlzIG5vdAorCSB3b3JsZCByZWFkYWJsZS93cml0YWJsZTogRml4ZWQgaW4gdGhpcyBwYXRjaAorCisyMDA1LTA2LTE1ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtbWFyc2hhbC12YWxpZGF0ZS5oOiBBZGRlZCBhIG5ldyB2YWxpZGF0aW9uCisJZXJyb3IgY29kZSBEQlVTX1ZBTElESVRZX1VOS05PV05fT09NX0VSUk9SID0gLTQgZm9yIAorCW91dCBvZiBtZW1vcnkgZXJyb3JzIHdoZW4gdmFsaWRhdGluZyBzaWduaXR1cmVzCisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLWhlYWRlci5jOiB1c2UgREJVU19WQUxJRElUWV9VTktOT1dOX09PTV9FUlJPUgorCWluIHBsYWNlcyB3aGVyZSB3ZSBwcmV2aW91c2x5IHVzZWQgREJVU19WQUxJRCBhbmQgYSBGQUxTRSByZXR1cm4gCisJdmFsdWUgdG8gaW5kaWNhdGUgT09NCisJCisJKiBkYnVzL2RidXMtbWFyc2hhbC12YWxpZGF0ZS5jIChfZGJ1c192YWxpZGF0ZV9zaWduYXR1cmVfd2l0aF9yZWFzb24pOgorCVVzZSBhIHN0YWNrIHRvIHRyYWNrIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW5zaWRlIGNvbnRhaW5lcnMuICBUaGUgCisJc3RhY2sgdmFsdWVzIGFyZSB0aGVuIHVzZWQgdG8gdmFsaWRhdGUgdGhhdCBkaWN0IGVudHJpZXMgaGF2ZSBvbmx5IHR3bworCWVsZW1lbnRzIHdpdGhpbiB0aGVtLgorCSh2YWxpZGF0ZV9ib2R5X2hlbHBlcik6IGNoZWNrIHRoZSByZWFzb24gZm9yIGZhaWx1cmUgd2hlbiB2YWxpZGF0aW5nCisJdmFyaWVudHMKKwkKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKGxvYWRfbWVzc2FnZSk6IHVzZSAKKwlEQlVTX1ZBTElESVRZX1VOS05PV05fT09NX0VSUk9SIGluIHBsYWNlcyB3aGVyZSB3ZSBwcmV2aW91c2x5IHVzZWQgCisJREJVU19WQUxJRCBhbmQgYSBGQUxTRSByZXR1cm4gdmFsdWUgdG8gaW5kaWNhdGUgT09NCisKKwkqIGRvYy9UT0RPOiByZW1vdmUgIi0gdmFsaWRhdGUgZGljdCBlbnRyeSBudW1iZXIgb2YgZmllbGRzIiBhcyB0aGlzCisJcGF0Y2ggZml4ZXMgaXQKKworMjAwNS0wNi0xNCAgRGF2aWQgWmV1dGhlbiAgPGRhdmlkekByZWRoYXQuY29tPgorCisJKiBidXMvYnVzLmMgKHByb2Nlc3NfY29uZmlnX2V2ZXJ5X3RpbWUpOiBEcm9wIGV4aXN0aW5nIGNvbmYtZGlyCisJd2F0Y2hlcyAoaWYgYXBwbGljYWJsZSkgYW5kIGFkZCBuZXcgd2F0Y2hlcworCisJKiBidXMvbWFpbi5jIChzaWduYWxfaGFuZGxlcik6IEhhbmRsZSBTSUdJTyBpZiB1c2luZyBEX05PVElGWQorCShtYWluKTogU2V0dXAgU0lHSU8gc2lnbmFsIGhhbmRsZXIgaWYgdXNpbmcgRF9OT1RJRlkKKworCSogYnVzL2NvbmZpZy1wYXJzZXIuaDogQWRkIHByb3RvdHlwZSBidXNfY29uZmlnX3BhcnNlcl9nZXRfY29uZl9kaXJzCisKKwkqIGJ1cy9jb25maWctcGFyc2VyLmMgKHN0cnVjdCBCdXNDb25maWdQYXJzZXIpOiBBZGQgY29uZl9kaXJzIGxpc3QKKwkobWVyZ2VfaW5jbHVkZWQpOiBBbHNvIG1lcmdlIGNvbmZfZGlycyBsaXN0CisJKGJ1c19jb25maWdfcGFyc2VyX3VucmVmKTogQ2xlYXIgY29uZl9kaXJzIGxpc3QKKwkoaW5jbHVkZV9kaXIpOiBBZGQgZGlyZWN0b3J5IHRvIGNvbmZfZGlycyBsaXN0CisJKGJ1c19jb25maWdfcGFyc2VyX2dldF9jb25mX2RpcnMpOiBOZXcgZnVuY3Rpb24KKworCSogYnVzL2Rpci13YXRjaC5bY2hdOiBOZXcgZmlsZXMKKworCSogYnVzL01ha2VmaWxlLmFtIChCVVNfU09VUkNFUyk6IEFkZCBkaXItd2F0Y2guW2NoXQorCisJKiBjb25maWd1cmUuaW46IEFkZCBjaGVja3MgZm9yIERfTk9USUZZIG9uIExpbnV4CisKKzIwMDUtMDYtMTQgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwkqIGdsaWIvZGJ1cy1iaW5kaW5nLXRvb2wtZ2xpYi5jOgorCSogZ2xpYi9kYnVzLWdvYmplY3QuYzoKKwkqIGdsaWIvZGJ1cy1ndmFsdWUuYzogRml4IGluZGVudGF0aW9uIGFuZCBicmFjZSBzdHlsZS4KKwkKKzIwMDUtMDYtMTQgIFJvc3MgQnVydG9uIDxyb3NzQG9wZW5lZGhhbmQuY29tPi4KKworCSogZ2xpYi9kYnVzLWdsaWIuaDogTWFrZSBEQnVzR01ldGhvZEludm9jYXRpb24KKwlhIHByaXZhdGUgc3RydWN0dXJlLiAgUmVhcnJhbmdlIHByb3RvdHlwZXMgYSBiaXQuCisJCisJKiBnbGliL2RidXMtZ3Byb3h5LmMgKGRidXNfZ19wcm94eV9pbnZva2UpOiBBZGQKKwlkb2N1bWVudGF0aW9uIGZvciBmaXJzdF9hcmdfdHlwZS4KKwkKKwkqIGdsaWIvZGJ1cy1nb2JqZWN0LmM6IE1vdmUgREJ1c0dNZXRob2RJbnZvY2F0aW9uCisJaGVyZSwgYWRkIGRvY3VtZW50YXRpb24uICBNb3ZlIGRidXNfZ19tZXRob2RfcmV0dXJuCisJYW5kIGRidXNfZ19tZXRob2RfcmV0dXJuX2Vycm9yIGludG8gcHVibGljIEFQSQorCXNlY3Rpb24uCisKKzIwMDUtMDYtMTQgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwkqIGdsaWIvZGJ1cy1nb2JqZWN0LmMgKF9kYnVzX2dvYmplY3RfbG9va3VwX21hcnNoYWxsZXIpOgorCUFkZCBtaXNzaW5nIHJldHVybiBzdGF0ZW1lbnRzLCBub3RpY2VkIGJ5IFJvc3MgQnVydG9uLgorCQorMjAwNS0wNi0xMyAgUm9zcyBCdXJ0b24gPHJvc3NAb3BlbmVkaGFuZC5jb20+LgorCisJKiBnbGliL2RidXMtZ29iamVjdC5jOiBIYW5kbGUgZXJyb3JzIG9uIG1lc3NhZ2UKKwlkZW1hcnNoYWxsaW5nIGJ5IHNlbmRpbmcgZXJyb3IgbWVzc2FnZSBiYWNrLgorCSogZ2xpYi9kYnVzLWd2YWx1ZS5jOiBJbml0aWFsaXplIHJldHVybiB2YXJpYWJsZXMuCisKKzIwMDUtMDYtMTMgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwkqIGdsaWIvTWFrZWZpbGUuYW06IEZpeCB0aGlua28gaW4gbGFzdCBwYXRjaC4KKworMjAwNS0wNi0xMyAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogZ2xpYi9NYWtlZmlsZS5hbTogTW92ZSBkYnVzLWd0eXBlLXNwZWNpYWxpemVkLmMKKwlhbmQgZGJ1cy1ndHlwZS1zcGVjaWFsaXplZC5oIGludG8gYSBfSEVBREVSUyB2YXJpYWJsZSwKKwlpbnN0YWxsIHRoZW0uCisKKzIwMDUtMDYtMTIgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwlBc3luYyBzaWduYWxzIGFuZCB2YXJpb3VzIGJ1Z2ZpeGVzIGFuZCB0ZXN0aW5nIGJ5CisJUm9zcyBCdXJ0b24gPHJvc3NAb3BlbmVkaGFuZC5jb20+LgorCisJKiBnbGliL2RidXMtZ3ZhbHVlLmg6IChzdHJ1Y3QgREJ1c0Jhc2ljR1ZhbHVlKTogRGVsZXRlLgorCShkYnVzX2d2YWx1ZV9nZW5tYXJzaGFsX25hbWVfZnJvbV90eXBlKQorCShkYnVzX2d2YWx1ZV9jdHlwZV9mcm9tX3R5cGUpOiBNb3ZlZCB0byBkYnVzLWJpbmRpbmctdG9vbC1nbGliLmMuCisJKGRidXNfZ3R5cGVfdG9fZGJ1c190eXBlKTogUmVuYW1lZCB0byBkYnVzX2d0eXBlX2Zyb21fc2lnbmF0dXJlLgorCShkYnVzX2dfdmFsdWVfdHlwZXNfaW5pdCwgZGJ1c19ndHlwZV9mcm9tX3NpZ25hdHVyZSkKKwkoZGJ1c19ndHlwZV9mcm9tX3NpZ25hdHVyZV9pdGVyLCBkYnVzX2d0eXBlX3RvX3NpZ25hdHVyZSkKKwkoZGJ1c19ndHlwZXNfZnJvbV9hcmdfc2lnbmF0dXJlKTogTmV3IGZ1bmN0aW9uIHByb3RvdHlwZXMuCisJKGRidXNfZ3ZhbHVlX2RlbWFyc2hhbCk6IFRha2UgY29udGV4dCBhbmQgZXJyb3IgYXJndW1lbnRzLgorCShkYnVzX2d2YWx1ZV9kZW1hcnNoYWxfdmFyaWFudCk6IE5ldyBmdW5jdGlvbi4KKwkoZGJ1c19ndmFsdWVfZGVtYXJzaGFsX21lc3NhZ2UpOiBOZXcgZnVuY3Rpb24uCisJKGRidXNfZ3ZhbHVlX3N0b3JlKTogRGVsZXRlLgorCisJKiBnbGliL2RidXMtZ3ZhbHVlLmM6CisKKwlGaWxlIGhhcyBiZWVuIGFsbW9zdCBlbnRpcmVseSByZXdyaXR0ZW47IG5vdyB3ZSBzcGVjaWFsLWNhc2UKKwltb3JlIHR5cGVzIHN1Y2ggYXMgREJVU19UWVBFX1NJR05BVFVSRSwgaGFuZGxlIGFycmF5cyBhbmQKKwloYXNoIHRhYmxlcyBjb3JyZWN0bHksIGV0Yy4gIEZ1bGwgc3VwcG9ydCBmb3IgcmVjdXJzaXZlIHZhbHVlcworCWlzIG5vdCB5ZXQgY29tcGxldGUuCisKKwkqIGdsaWIvZGJ1cy1ncHJveHkuYyAoZGJ1c19nX3Byb3h5X2NsYXNzX2luaXQpOiBDaGFuZ2UgbGFzdAorCWFyZ3VtZW50IG9mIHNpZ25hbCB0byBHX1RZUEVfUE9JTlRFUiBzaW5jZSB3ZSBub3cgcGFzcyBhCisJc3RydWN0dXJlLgorCShsb29rdXBfZ19tYXJzaGFsbGVyKTogRGVsZXRlIGluIGZhdm9yIG9mCisJX2RidXNfZ29iamVjdF9sb29rdXBfbWFyc2hhbGxlci4KKwkobWFyc2hhbF9kYnVzX21lc3NhZ2VfdG9fZ19tYXJzaGFsbGVyKTogVXNlCisJX2RidXNfZ29iamVjdF9sb29rdXBfbWFyc2hhbGxlciBhbmQgZGJ1c19ndmFsdWVfZGVtYXJzaGFsX21lc3NhZ2UKKwl0byBoYW5kbGUgcmVtb3RlIHNpZ25hbCBjYWxsYmFja3MuCisJKGRidXNfZ19wcm94eV9uZXdfZnJvbV9wcm94eSk6IE5ldyBmdW5jdGlvbjsgY3JlYXRlcyBhIG5ldworCURCdXNHUHJveHkgYnkgY29weWluZyBhbiBleGlzdGluZyBvbmUuCisJKGRidXNfZ19wcm94eV9nZXRfaW50ZXJmYWNlLCBkYnVzX2dfcHJveHlfc2V0X2ludGVyZmFjZSkKKwkoZGJ1c19nX3Byb3h5X2dldF9wYXRoKTogTmV3IGZ1bmN0aW9ucy4KKwkoZGJ1c19nX3Byb3h5X21hcnNoYWxfYXJnc190b19tZXNzYWdlKTogTmV3IGZ1bmN0aW9uOworCWZhY3RvcmVkIG91dCBvZiBleGlzdGluZyBjb2RlLgorCShEQlVTX0dfVkFMVUVfQVJSQVlfQ09MTEVDVF9BTEwpOiBDb2xsZWN0IGFsbCBhcmd1bWVudHMKKwlmcm9tIGEgdmFyYXJncyBhcnJheS4KKwkoZGJ1c19nX3Byb3h5X2JlZ2luX2NhbGxfaW50ZXJuYWwpOiBOZXcgZnVuY3Rpb24uCisJKGRidXNfZ19wcm94eV9lbmRfY2FsbF9pbnRlcm5hbCk6IE5ldyBmdW5jdGlvbi4KKwkoZGJ1c19nX3Byb3h5X2JlZ2luX2NhbGwpOiBUYWtlIEdUeXBlcyBpbnN0ZWFkIG9mIERCdXMgdHlwZXMKKwlhcyBhcmd1bWVudHM7IHNpbXBseSBpbnZva2UgZGJ1c19nX3Byb3h5X2JlZ2luX2NhbGxfaW50ZXJuYWwKKwlhZnRlciBjb2xsZWN0aW5nIGFyZ3MgaW50byB2YWx1ZSBhcnJheS4KKwkoZGJ1c19nX3Byb3h5X2VuZF9jYWxsKTogVGFrZSBHVHlwZXMgaW5zdGVhZCBvZiBEQnVzIHR5cGVzOworCWludm9rZSBkYnVzX2dfcHJveHlfZW5kX2NhbGxfaW50ZXJuYWwuCisJKGRidXNfZ19wcm94eV9pbnZva2UpOiBTaW1wbHkgaW52b2tlIGJlZ2luX2NhbGxfaW50ZXJhbmwgYW5kCisJZW5kX2NhbGxfaW50ZXJuYWwuCisJKGRidXNfZ19wcm94eV9jYWxsX25vX3JlcGx5KTogVGFrZSBHVHlwZXMgaW5zdGVhZCBvZiBEQnVzCisJdHlwZXMuCisJKGFycmF5X2ZyZWVfYWxsKTogTmV3IGZ1bmN0aW9uLgorCShkYnVzX2dfcHJveHlfYWRkX3NpZ25hbCk6IFRha2UgR1R5cGVzLgorCisJKiBnbGliL2RidXMtZ29iamVjdC5oOgorCShfZGJ1c19nbGliX21hcnNoYWxfZGJ1c19tZXNzYWdlX3RvX2d2YWx1ZV9hcnJheSk6IERlbGV0ZS4KKwkoX2RidXNfZ29iamVjdF9nZXRfcGF0aCwgX2RidXNfZ29iamVjdF9sb29rdXBfbWFyc2hhbGxlcik6CisJUHJvdG90eXBlLgorCisJKiBnbGliL2RidXMtZ29iamVjdC5jOiBBZGQgYSBnbG9iYWwgbWFyc2hhbF90YWJsZSBoYXNoIHdoaWNoCisJc3RvcmVzIG1hcHBpbmdzIGZyb20gdHlwZSBzaWduYXR1cmVzIHRvIG1hcnNoYWxsZXJzLiAgQ2hhbmdlIGxvdHMKKwlvZiBpbnZvY2F0aW9ucyBvZiBkYnVzX2d0eXBlX3RvX2RidXNfdHlwZSB0bworCWRidXNfZ3R5cGVfdG9fc2lnbmF0dXJlLgorCShfZGJ1c19nbGliX21hcnNoYWxfZGJ1c19tZXNzYWdlX3RvX2d2YWx1ZV9hcnJheSk6IERlbGV0ZS4KKwkoaW50cm9zcGVjdF9zaWduYWxzKTogRml4IHRlc3QgZm9yIHF1ZXJ5LnJldHVybl90eXBlLgorCShzZXRfb2JqZWN0X3Byb3BlcnR5KTogVXBkYXRlIGludm9jYXRpb24gb2YgZGJ1c19ndmFsdWVfZGVtYXJzaGFsLgorCShpbnZva2Vfb2JqZWN0X21ldGhvZCk6IE1hbnkgY2hhbmdlcy4gIEhhbmRsZSBhc3luY2hyb25vdXMKKwlpbnZvY2F0aW9ucy4gIENvbnZlcnQgYXJndW1lbnRzIHdpdGgKKwlkYnVzX2d2YWx1ZV9kZW1hcnNoYWxfbWVzc2FnZS4gIEhhbmRsZSBlcnJvcnMuICBVc2UKKwlEQnVzU2lnbmF0dXJlSXRlciBpbnN0ZWFkIG9mIHN0cmxlbiBvbiBhcmdzLiBIYW5kbGUgYWxsIGFyZ3VtZW50cworCWdlbmVyaWNhbGx5LiAgU3BlY2lhbC1jYXNlIHZhcmlhbnRzLgorCShkYnVzX2dfbWV0aG9kX3JldHVybiwgZGJ1c19nX21ldGhvZF9yZXR1cm5fZXJyb3IpOiBOZXcgZnVuY3Rpb24uCisJKERCdXNHU2lnbmFsQ2xvc3VyZSk6IE5ldyBzdHJ1Y3R1cmUsIGNsb3NlcyBvdmVyIHNpZ25hbAorCWluZm9ybWF0aW9uLgorCShkYnVzX2dfc2lnbmFsX2Nsb3N1cmVfbmV3KTogTmV3IGZ1bmN0aW9uLgorCShkYnVzX2dfc2lnbmFsX2Nsb3N1cmVfZmluYWxpemUpOiBOZXcgZnVuY3Rpb24uCisJKHNpZ25hbF9lbWl0dGVyX21hcnNoYWxsZXIpOiBOZXcgZnVuY3Rpb247IGlzIHNwZWNpYWwgbWFyc2hhbGxlcgorCXdoaWNoIGVtaXRzIHNpZ25hbHMgb24gYnVzLgorCShleHBvcnRfc2lnbmFscyk6IE5ldyBmdW5jdGlvbjsgaW50cm9zcGVjdHMgb2JqZWN0IHNpZ25hbHMgYW5kCisJY29ubmVjdHMgdG8gdGhlbS4KKwkoZGJ1c19nX29iamVjdF90eXBlX2luc3RhbGxfaW5mbyk6IFRha2UgR1R5cGUgaW5zdGVhZCBvZgorCUdPYmplY3RDbGFzcy4KKwkoZGJ1c19nX2Nvbm5lY3Rpb25fcmVnaXN0ZXJfZ19vYmplY3QpOiBJbnZva2UgZXhwb3J0X3NpZ25hbHMuCisJKGRidXNfZ19jb25uZWN0aW9uX2xvb2t1cF9nX29iamVjdCk6IE5ldyBmdW5jdGlvbi4KKwkoREJ1c0dGdW5jU2lnbmF0dXJlKSBOZXcgc3RydWN0dXJlOyB1c2VkIGZvciBtYXBwaW5nIHR5cGUKKwlzaWduYXR1cmVzIHRvIG1hcnNoYWxsZXJzLgorCShmdW5jc2lnX2hhc2gpOiBOZXcgZnVuY3Rpb247IGhhc2hlcyBEQnVzR0Z1bmNTaWduYXR1cmUuCisJKGZ1bmNzaWdfZXF1YWwpOiBOZXcgZnVuY3Rpb247IGNvbXBhcmVzIERCdXNHRnVuY1NpZ25hdHVyZS4KKwkoX2RidXNfZ29iamVjdF9sb29rdXBfbWFyc2hhbGxlcik6IE5ldyBmdW5jdGlvbi4KKwkoZGJ1c19nX29iamVjdF9yZWdpc3Rlcl9tYXJzaGFsbGVyKTogTmV3IGZ1bmN0aW9uOyB1c2VkIHRvCisJcmVnaXN0ZXIgYSBtYXJzaGFsbGVyIGF0IHJ1bnRpbWUgZm9yIGEgcGFydGljdWxhciBzaWduYXR1cmUuCisKKwkqIGdsaWIvZGJ1cy1nbWFpbi5jIChfZGJ1c19nbWFpbl90ZXN0KTogQWRkIHZhcmlvdXMgdGVzdHMuCisKKwkqIGdsaWIvZGJ1cy1iaW5kaW5nLXRvb2wtZ2xpYi5oOiBBZGQgREJVU19HTElCX0FOTk9UQVRJT05fQVNZTkMKKwl3aGljaCBub3RlcyBhIHNlcnZlciBtZXRob2QgaW1wbGVtZW50YXRpb24gc2hvdWxkIGJlCisJYXN5bmNocm9ub3VzLgorCisJKiBnbGliL2RidXMtYmluZGluZy10b29sLWdsaWIuYworCShkYnVzX2JpbmRpbmdfdG9vbF9vdXRwdXRfZ2xpYl9zZXJ2ZXIpOiBDYWxsCisJZGJ1c19nX3ZhbHVlX3R5cGVzX2luaXQuCisJKHdyaXRlX2Zvcm1hbF9wYXJhbWV0ZXJzKTogVXNlIGRidXNfZ3R5cGVfZnJvbV9zaWduYXR1cmUuICBIYW5kbGUKKwl2YXJpYW50cyBzcGVjaWFsbHkuCisJKGRidXNfZ190eXBlX2dldF9sb29rdXBfZnVuY3Rpb24pOiBUdXJuIEdUeXBlIGludG8gYW4gaW52b2NhdGlvbgorCW9mIGEgbG9va3VwIGZ1bmN0aW9uLgorCSh3cml0ZV9hcmdzX2Zvcl9kaXJlY3Rpb24pOiBVc2UgZGJ1c19nX3R5cGVfZ2V0X2xvb2t1cF9mdW5jdGlvbi4KKwkod3JpdGVfdW50eXBlZF9vdXRfYXJncyk6IE5ldyBtZXRob2Q7IHdyaXRlIG91dHB1dCBhcmd1bWVudHMuCisJKHdyaXRlX2Zvcm1hbF9kZWNsYXJhdGlvbnNfZm9yX2RpcmVjdGlvbik6IEZ1bmN0aW9uIGZvcgorCXdyaXRpbmcgcHJvdG90eXBlcy4KKwkod3JpdGVfZm9ybWFsX3BhcmFtZXRlcnNfZm9yX2RpcmVjdGlvbik6IEZ1bmN0aW9uIGZvcgorCXdyaXRpbmcgaW1wbGVtZW50YXRpb25zLgorCSh3cml0ZV90eXBlZF9hcmdzX2Zvcl9kaXJlY3Rpb24pOiBGdW5jdGlvbiBmb3Igd3JpdGluZworCWFyZ3VtZW50cyBwcmVmaXhlZCB3aXRoIEdUeXBlcy4KKwkod3JpdGVfYXN5bmNfbWV0aG9kX2NsaWVudCk6IFdyaXRlIG91dCBhc3luYyB2ZXJzaW9uCisJb2YgbWV0aG9kLgorCisJKiBnbGliL2RidXMtYmluZGluZy10b29sLWdsaWIuYzogSW5jbHVkZSBkYnVzLWd2YWx1ZS11dGlscy5oLgorCShkYnVzX2dfdHlwZV9nZXRfbWFyc2hhbF9uYW1lKTogTW92ZSBtYXBwaW5nIGZyb20gR1R5cGUKKwl0byBtYXJzaGFsIG5hbWUgaW50byBoZXJlLgorCShkYnVzX2dfdHlwZV9nZXRfY19uYW1lKTogTW92ZSBpbnRvIGhlcmUuCisJKGNvbXB1dGVfbWFyc2hhbGxlcik6IENvbnZlcnQgc2lnbmF0dXJlIHRvIHR5cGUgd2l0aAorCWRidXNfZ3R5cGVfZnJvbV9zaWduYXR1cmUsIHVzZSBkYnVzX2dfdHlwZV9nZXRfbWFyc2hhbF9uYW1lLgorCShjb21wdXRlX21hcnNoYWxsZXJfbmFtZSk6IERpdHRvLgorCShjb21wdXRlX21hcnNoYWxsZXIpOiBIYW5kbGUgYXN5bmMgc2lnbmFsIGFubm90YXRpb25zLgorCShnYXRoZXJfbWFyc2hhbGxlcnMpOiBSZXR1cm4gaWYgd2UgZG9uJ3QgaGF2ZSBhIGtub3duCisJcHJlZml4LgorCShnZW5lcmF0ZV9nbHVlKTogQ29sbGVjdCBpbnRyb3NwZWN0aW9uIGJsb2IgaGVyZSwgYW5kCisJd3JpdGUgYWxsIG9mIHRoZSBibG9iIGF0IHRoZSBlbmQuICBUaGlzIGFsbG93cyBhbiBvYmplY3QKKwl3aXRoIG11bHRpcGxlIGludGVyZmFjZXMgdG8gd29yay4KKwlNYXJrIGFzeW5jIG1ldGhvZHMgaW4gaW50cm9zcGVjdGlvbiBibG9iLgorCisJKiBnbGliL01ha2VmaWxlLmFtIChsaWJkYnVzX2dsaWJfMV9sYV9TT1VSQ0VTKTogQWRkCisJZGJ1cy1ndHlwZS1zcGVjaWFsaXplZC5jLCBkYnVzLWd0eXBlLXNwZWNpYWxpemVkLmgsCisJZGJ1cy1ndmFsdWUtdXRpbHMuaCwgZGJ1cy1ndmFsdWUtdXRpbHMuYy4KKworCSogZGJ1cy9kYnVzLWdsaWIuaDogRG9uJ3QgaW5jbHVkZSBkYnVzLXByb3RvY29sLmg7IHRoaXMKKwlhdm9pZHMgcGVvcGxlIGFjY2lkZW50YWxseSB1c2luZyBEQlVTX1RZUEVfKiB3aGljaCBzaG91bGQKKwlub3QgYmUgbmVjZXNzYXJ5IGFueW1vcmUuCisJRG8gaW5jbHVkZSBkYnVzLWd0eXBlLXNwZWNpYWxpemVkLmgsIHdoaWNoIGFyZSB1dGlsaXRpZXMKKwlmb3IgR0xpYiBjb250YWluZXIgdHlwZXMuCisJQWRkIHZhcmlvdXMgI2RlZmluZXMgZm9yIHR5cGVzIHN1Y2ggYXMKKwlEQlVTX1RZUEVfR19CT09MRUFOX0FSUkFZLgorCShEQnVzR1ZhbHVlSXRlcmF0b3IsIERCdXNHVmFsdWUpOiBEZWZpbmUsIG5vdCBmdWxseSB1c2VkCisJeWV0LgorCShkYnVzX2dfdmFsdWVfZ2V0X2dfdHlwZSk6IFR5cGUgZm9yIHJlY3Vyc2l2ZSB2YWx1ZS4KKwkoZGJ1c19nX3ZhbHVlX29wZW4sIGRidXNfZ192YWx1ZV9pdGVyYXRvcl9nZXRfdmFsdWUpCisJKGRidXNfZ192YWx1ZV9pdGVyYXRvcl9nZXRfdmFsdWVzLCBkYnVzX2dfdmFsdWVfaXRlcmF0b3JfcmVjdXJzZSkKKwkoZGJ1c19nX3ZhbHVlX2ZyZWUpOiBQcm90b3R5cGVzLgorCShkYnVzX2dfb2JqZWN0X3JlZ2lzdGVyX21hcnNoYWxsZXIsIGRidXNfZ19wcm94eV9uZXdfZnJvbV9wcm94eSk6IFByb3RvdHlwZS4KKwkoZGJ1c19nX3Byb3h5X3NldF9pbnRlcmZhY2UpOiBQcm90b3R5cGUuCisJKGRidXNfZ19wcm94eV9iZWdpbl9jYWxsLCBkYnVzX2dfcHJveHlfZW5kX2NhbGwpCisJKGRidXNfZ19wcm94eV9jYWxsX25vX3JlcGx5KTogVGFrZSBHTGliIHR5cGVzIGluc3RlYWQgb2YgREJ1cworCXR5cGVzLgorCShkYnVzX2dfcHJveHlfZ2V0X3BhdGgsIGRidXNfZ19wcm94eV9nZXRfaW50ZXJmYWNlKToKKwlBY2Nlc3NvcnMuCisJKERCdXNHQXN5bmNEYXRhLCBEQnVzR01ldGhvZEludm9jYXRpb24pOiBTdHJ1Y3R1cmVzIGZvcgorCWRvaW5nIGFzeW5jIGludm9jYXRpb25zLgorCShkYnVzX2dfbWV0aG9kX3JldHVybiwgZGJ1c19nX21ldGhvZF9yZXR1cm5fZXJyb3IpOgorCVByb3RvdHlwZXMuCisJKiBkb2MvZGJ1cy10dXRvcmlhbC54bWw6IFVwZGF0ZSBHTGliIHNlY3Rpb24uCisJCisJKiB0b29scy9kYnVzLXZpZXdlci5jIChsb2FkX2NoaWxkX25vZGVzKTogVXBkYXRlCisJZm9yIG5ldyBpbnZvY2F0aW9uIHR5cGUgb2YgZGJ1c19nX3Byb3h5X2VuZF9jYWxsLgorCShsb2FkX2Zyb21fc2VydmljZV90aHJlYWRfZnVuYyk6IERpdHRvLgorCisJKiB0b29scy9wcmludC1pbnRyb3NwZWN0LmMgKG1haW4pOiBEaXR0by4KKworCSogdG9vbHMvZGJ1cy1uYW1lcy1tb2RlbC5jIChoYXZlX25hbWVzX25vdGlmeSkKKwkobmFtZXNfbW9kZWxfcmVsb2FkLCBuYW1lc19tb2RlbF9zZXRfY29ubmVjdGlvbikKKwlVc2UgR1R5cGVzLgorCisJKiBweXRob24vTWFrZWZpbGUuYW0gKElOQ0xVREVTKTogRGVmaW5lIERCVVNfQ09NUElMQVRJT04sCisJbmVlZGVkIHNpbmNlIFB5dGhvbiBiaW5kaW5ncyB1c2UgR0xpYiBiaW5kaW5ncy4KKworCSogdGVzdC9nbGliL01ha2VmaWxlLmFtIChJTkNMVURFUyk6IERlZmluZSBEQlVTX0NPTVBJTEFUSU9OLgorCUFkZCAtLXByZWZpeCBhcmd1bWVudC4KKworCSogdG9vbHMvTWFrZWZpbGUuYW06IERlZmluZSBEQlVTX0NPTVBJTEFUSU9OLiAgUmVtb3ZlCisJdW5uZWVkZWQgLS1pZ25vcmUtdW5zdXBwb3J0ZWQgYXJnLgorCQorCSogdGVzdC9nbGliL3Rlc3Qtc2VydmljZS1nbGliLmM6IAorCSogdGVzdC9nbGliL3Rlc3Qtc2VydmljZS1nbGliLnhtbDoKKwkqIHRlc3QvZ2xpYi90ZXN0LWRidXMtZ2xpYi5jOiBBZGQgbWFueSBtb3JlIHRlc3RzLgorCisyMDA1LTA2LTA2ICBEYXZpZCBaZXV0aGVuICA8ZGF2aWR6QHJlZGhhdC5jb20+CisKKwkqIGRvYy9UT0RPOiBBZGQgaXRlbSBhYm91dCBuZWVkIHRvIHJlbW92ZSBkZXByZWNhdGVkIGZ1bmN0aW9ucy4KKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uaDogQWRkIHByb3RvdHlwZSBmb3IgZGJ1c19jb25uZWN0aW9uX2Rpc2Nvbm5lY3QKKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYyAoZGJ1c19jb25uZWN0aW9uX2Rpc2Nvbm5lY3QpOiBOZXcgZnVuY3Rpb24KKwl0byByZXBhaXIgdGhlIEFCSSB3aGljaCB3YXMgYnJva2VuIHdpdGggdGhlIGxhc3QgY29tbWl0LgorCisyMDA1LTA2LTAyICBKb2huIChKNSkgUGFsbWllcmkgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqICBkYnVzL2RidXMtY29ubmVjdGlvbi5jLCBkYnVzL2RidXMtY29ubmVjdGlvbi5oIAorCShkYnVzX2Nvbm5lY3Rpb25fZGlzY29ubmVjdCk6IHJlbmFtZWQgdG8gZGJ1c19jb25uZWN0aW9uX2Nsb3NlIAorCWZvciBBUEkgc3ltbWV0cnkgd2l0aCBkYnVzX2Nvbm5lY3Rpb25fb3BlbgorCShfZGJ1c19jb25uZWN0aW9uX29wZW5faW50ZXJuYWwpOiAKKwlzL2RidXNfY29ubmVjdGlvbl9kaXNjb25uZWN0L2RidXNfY29ubmVjdGlvbl9jbG9zZQorCisJKiBkYnVzL2RidXMtYnVzLmMgKGRidXNfYnVzX2dldCk6CisJcy9kYnVzX2Nvbm5lY3Rpb25fZGlzY29ubmVjdC9kYnVzX2Nvbm5lY3Rpb25fY2xvc2UKKworCSogYnVzL2Nvbm5lY3Rpb24uYyAoYnVzX2Nvbm5lY3Rpb25zX3VucmVmLCAKKwlidXNfY29ubmVjdGlvbnNfc2V0dXBfY29ubmVjdGlvbiwgYnVzX2Nvbm5lY3Rpb25zX2V4cGlyZV9pbmNvbXBsZXRlKToKKwlzL2RidXNfY29ubmVjdGlvbl9kaXNjb25uZWN0L2RidXNfY29ubmVjdGlvbl9jbG9zZQorCisJKiBidXMvZGlzcGF0Y2guYyAoYnVzX2Rpc3BhdGNoLCBraWxsX2NsaWVudF9jb25uZWN0aW9uLCAKKwlraWxsX2NsaWVudF9jb25uZWN0aW9uX3VuY2hlY2tlZCwgY2hlY2tfaGVsbG9fY29ubmVjdGlvbik6CisJcy9kYnVzX2Nvbm5lY3Rpb25fZGlzY29ubmVjdC9kYnVzX2Nvbm5lY3Rpb25fY2xvc2UKKworCSogYnVzL2J1cy5jIChuZXdfY29ubmVjdGlvbl9jYWxsYmFjayk6CisJcy9kYnVzX2Nvbm5lY3Rpb25fZGlzY29ubmVjdC9kYnVzX2Nvbm5lY3Rpb25fY2xvc2UKKworCSogdG9vbHMvZGJ1cy1zZW5kLmMgKG1haW4pOgorCXMvZGJ1c19jb25uZWN0aW9uX2Rpc2Nvbm5lY3QvZGJ1c19jb25uZWN0aW9uX2Nsb3NlCisKKwkqIHRlc3QvZ2xpYi90ZXN0LXByb2ZpbGUuYyAobm9fYnVzX3RocmVhZF9mdW5jLCB3aXRoX2J1c190aHJlYWRfZnVuYyk6CisJcy9kYnVzX2Nvbm5lY3Rpb25fZGlzY29ubmVjdC9kYnVzX2Nvbm5lY3Rpb25fY2xvc2UKKwkKKwkqIHRlc3QvdGVzdC1zZXJ2aWNlLmMgKHBhdGhfbWVzc2FnZV9mdW5jLCBmaWx0ZXJfZnVuYyk6CisJcy9kYnVzX2Nvbm5lY3Rpb25fZGlzY29ubmVjdC9kYnVzX2Nvbm5lY3Rpb25fY2xvc2UKKwkKKwkqIGRvYy9UT0RPOiByZW1vdmUgY29ubmVjdGlvbl9vcGVuL2Nvbm5lY3Rpb25fZGlzY29ubmVjdCBsYWNrcyBzeW1tZXRyeSAJaXRlbSB0aGF0IHdhcyBqdXN0IGZpeGVkCisJCisyMDA1LTA1LTI1ICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiBkYnVzL2RidXMtcHJvdG9jb2wuaDogTW92ZSB2YXJpb3VzIGJ1cyBzZXJ2aWNlICNkZWZpbmVzIHN1Y2gKKwkgIGFzIERCVVNfU0VSVklDRV9EQlVTIGFuZCBEQlVTX05BTUVfRkxBR19QUk9ISUJJVF9SRVBMQUNFTUVOVCB0bworCSAgZGJ1cy9kYnVzLXNoYXJlZC5oLgorCSogZGJ1cy9kYnVzLXNoYXJlZC5oOiBWYXJpb3VzIGRlZmluZXMgbW92ZWQgaGVyZS4KKwkqIGRidXMvZGJ1cy1tYXJzaGFsLWhlYWRlci5jOiBJbmNsdWRlIGRidXMtc2hhcmVkLmguCisKKzIwMDUtMDUtMjUgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIHB5dGhvbi9fX2luaXRfXy5weTogUHl0aG9uIGJpbmRpbmdzIGRlc2VydmUgYSBtaW5vciB2ZXJzaW9uCisJdXBkYXRlLiAgVXBwZWQgdG8gKDAsIDQwLCAyKQorCisyMDA1LTA1LTI0ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBweXRob24vZGVjb3JhdG9ycy5weTogYWRkIGV4cGxpY2l0bHlfcGFzc19tZXNzYWdlIGRlY29yYXRvcgorCWZvciBwYXNzaW5nIGluIHRoZSBkYnVzIG1lc3NhZ2UgYXMga2V5d29yZCBmb3IgZWRnZSBjYXNlIHNpZ25hbAorCWhhbmRsaW5nCisKKwkqIHB5dGhvbi9tYXRjaHJ1bGVzLnB5IChTaWduYWxNYXRjaFJ1bGUuX19yZXByX18pOiBmaXggb3V0cHV0CisJdG8gY29uZm9ybSB3aXRoIHdoYXQgZGJ1cyBleHBlY3RzIGZvciBtYXRjaCBydWxlcworCShTaWduYWxNYXRjaFJ1bGUuZXhlY3V0ZSk6IGFkZCB0aGUgZGJ1cyBtZXNzYWdlIGFzIGEga2V5d29yZAorCWlmIHRoZSBzaWduYWwgaGFuZGxlciBoYXMgcmVxdWVzdGVkIGl0CisKKwkqIHB5dGhvbi9leGFtcGxlcy9leGFtcGxlL3NpZ25hbC1yZWNpcGllbnQucHk6IGFkZGVkIHNvbWUgbW9yZQorCWV4YW1wbGVzIG9uIGhvdyB0byBob29rIHVwIHRvIHNpZ25hbHMKKworMjAwNS0wNS0yMyAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogcHl0aG9uL2RlY29yYXRvcnMucHk6IGltcG9ydCBkYnVzX2JpbmRpbmdzCisKKwkqIHB5dGhvbi9tYXRjaHJ1bGVzLnB5IChTaWduYWxNYXRjaFJ1bGUsIFNpZ25hbE1hdGNoVHJlZSwgCisJU2lnbmFsTWF0Y2hOb2RlKTogbmV3IGNsYXNzZXMgdGhhdCBpbXBsZW1lbnQgd2lsZGNhcmQgc2lnbmFsCisJY2FsbGJhY2sgbWF0Y2hpbmcgdXNpbmcgYSB0cmVlIGxvb2t1cC4gSGVhdmlseSBtb2RpZmllZCBmcm9tIGEKKwlwYXRjaCBzZW50IGJ5IENlbHNvIFBpbnRvIChmZC5vIGJ1ZyAjMzI0MSkKKworCSogX2RidXMucHkgKGFkZF9zaWduYWxfcmVjZWl2ZXIsIHJlbW92ZV9zaWduYWxfcmVjZWl2ZXIsIF9zaWduYWxfZnVuYyk6CisJdXNlIG5ldyBtYXRjaCBjbGFzc2VzIHRvIGhhbmRsZSBzaWduYWxzLgorCisyMDA1LTA1LTE5ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCQorCSogcHl0aG9uL2RidXNfYmluZGluZ3MucHl4LmluOiBzL1RZUEVfUEFUSC9UWVBFX09CSkVDVF9QQVRICisKKzIwMDUtMDUtMTggIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBjb25maWd1cmUuaW46IHVzZSBHTElCX0dOVV9HRVRURVhUIHRvIGdldCBJTlRMTElCUyBhbmQgcmVxdWlyZQorCWdldHRleHQuIE5vdCByZWFsbHkgd29ydGggcmVxdWlyaW5nIHlldCBwZXJoYXBzLCBidXQgYW55CisJcHJvZHVjdGlvbiBxdWFsaXR5IDEuMCB3b3VsZCByZXF1aXJlIGl0IHNvIHdlIHNob3VsZCBnbyBhaGVhZCBhbmQKKwlnZXQgdGhpbmdzIHNldCB1cC4gV2UgZG8gaGF2ZSBhIGNvdXBsZSB0b2tlbiBjYWxscyB0bworCWJpbmR0ZXh0ZG9tYWluIGluIHRoZSBjb2RlIGFscmVhZHkuCisKKzIwMDUtMDUtMTYgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGdsaWIvZGJ1cy1nbWFpbi5jIChpb19oYW5kbGVyX2Rpc3BhdGNoKTogZml4IGRlYWRsb2NrCisJd2hlbiB1c2luZyByZWN1cnNpdmUgZ19tYWluX2xvb3BzCisKKwkqIHB5dGhvbi9fZGJ1cy5weSAoY2xhc3MgQnVzKTogYWRkIHRoZSBQcm94eU9iamVjdENsYXNzCisJYWxpYXMgZm9yIFByb3h5T2JqZWN0IHRvIG1ha2UgaXQgZWFzaWVyIGZvciB0aGUgVHdpc3RlZCAKKwluZXR3b3JraW5nIGZyYW1ld29yayB0byBpbnRlZ3JhdGUgZGJ1cy4KKworCSogcHl0aG9uL3Byb3hpZXMucHkgKGNsYXNzIFByb3h5T2JqZWN0KTogYWRkIHRoZSBQcm94eU1ldGhvZENsYXNzCisJYWxpYXMgZm9yIFByb3h5TWV0aG9kIHRvIG1ha2UgaXQgZWFzaWVyIGZvciB0aGUgVHdpc3RlZCAKKwluZXR3b3JraW5nIGZyYW1ld29yayB0byBpbnRlZ3JhdGUgZGJ1cy4gCisKKzIwMDUtMDUtMTEgIFJvc3MgQnVydG9uICA8cm9zc0BvcGVuZWRoYW5kLmNvbT4KKworCSogZ2xpYi9kYnVzLWdsaWItdG9vbC5jOiBBZGQgLS1wcmVmaXggYXJndW1lbnQuCisJKiBnbGliL2RidXMtYmluZGluZy10b29sLWdsaWIuaDogQWRkIHByZWZpeCBhcmd1bWVudC4KKwkqIGdsaWIvZGJ1cy1iaW5kaW5nLXRvb2wtZ2xpYi5jIChjb21wdXRlX21hcnNoYWxsZXJfbmFtZSk6CisJQWRkIHByZWZpeCBhcmd1bWVudC4KKwkoZ2VuZXJhdGVfZ2x1ZSk6IFBhc3MgcHJlZml4IGFyZ3VtZW50IGRvd24uCisJKGRidXNfYmluZGluZ190b29sX291dHB1dF9nbGliX3NlcnZlcik6IFBhc3MgcHJlZml4IHRvCisJZ2xpYi1nZW5tYXJzaGFsLgorCQorMjAwNS0wNS0xMSAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogdG9vbHMvZGJ1cy1zZW5kLmMgKGFwcGVuZF9hcnJheSk6IE5ldyBmdW5jdGlvbi4KKwkoYXBwZW5kX2FyZyk6IEJyb2tlbiBvdXQgZnJvbSBtYWluLgorCShtYWluKTogQWRkIGNoZWVzeSBoYWNrIHRvIHNlbmQgYXJyYXlzIGFuZCB2YXJpYW50cy4KKwkodXNhZ2UpOiBVcGRhdGUuCisJKiB0b29scy9kYnVzLXByaW50LW1lc3NhZ2UuYyAocHJpbnRfaXRlcik6IEJyb2tlbiBvdXQKKwlmcm9tIG1haW4uCisKKzIwMDUtMDUtMTEgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwkqIGRidXMvZGJ1cy1zaWduYXR1cmUuYyAoZGJ1c19zaWduYXR1cmVfaXRlcl9nZXRfc2lnbmF0dXJlKToKKwlOZXcgZnVuY3Rpb24sIHJldHVybnMgc2lnbmF0dXJlIHN0cmluZyBmb3Igc2lnbmF0dXJlIGl0ZXIuCisJKiBkYnVzL2RidXMtc2lnbmF0dXJlLmg6IFByb3RvdHlwZSBpdC4KKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKGRidXNfbWVzc2FnZV9pdGVyX2dldF9zaWduYXR1cmUpOgorCU5ldyBmdW5jdGlvbiwgcmV0dXJucyBzaWduYXR1cmUgc3RyaW5nIGZvciBtZXNzYWdlIGl0ZXIuCisJKGRidXNfbWVzc2FnZV9pdGVyX2dldF9hcnJheV9sZW4pOiBOZXcgZnVuY3Rpb24sIHJldHVybnMKKwlsZW5ndGggb2YgYXJyYXkuCisJKGRidXNfbWVzc2FnZV9pdGVyX2dldF9maXhlZF9hcnJheSk6IEZpeCBhc3NlcnRpb247IHRoaXMKKwlmdW5jdGlvbiBzaG91bGQgYmUgdXNlZCB3aGVuIHRoZSBpdGVyIGlzIHBvaW50aW5nIHRvIHRoZQorCWNvbnRlbnRzIG9mIGFuIGFycmF5CisJKiBkYnVzL2RidXMtbWVzc2FnZS5oOiBQcm90b3R5cGVzLgorCSogZGJ1cy9kYnVzLW1hcnNoYWwtcmVjdXJzaXZlLmMgKF9kYnVzX3R5cGVfcmVhZGVyX2dldF9hcnJheV9sZW5ndGgpOgorCU5ldyBmdW5jdGlvbjsgcmV0dXJucyBsZW5ndGggb2YgYW4gYXJyYXkuCisJKiBkYnVzL2RidXMtbWFyc2hhbC1yZWN1cnNpdmUuaDogUHJvdG90eXBlIGl0LgorCQorMjAwNS0wNS0xMSAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMtdXRpbC5jIDwhSEFWRV9QT1NJWF9HRVRQV05BTV9SPjogRml4CisJY29tcGlsYXRpb24gZXJyb3IuCisJCisyMDA1LTA1LTA4ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMtdXRpbC5jIChfZGJ1c19iZWNvbWVfZGFlbW9uKTogd3JpdGUgdGhlCisJZGFlbW9uJ3MgcGlkLCBub3QgdGhlIHBhcmVudCdzIHBpZCwgdG8gdGhlIGZpbGUgZGVzY3JpcHRvci4KKwlSZXBvcnRlZCBieSBUYWogTW9ydG9uLgorCisyMDA1LTA1LTA1ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogY29uZmlndXJlLmluIChMVF8qKTogYWRkIG5vdGVzIG9uIGhvdyB0aGUgbGlidG9vbCB2ZXJzaW9uaW5nCisJd29ya3MgdG8gc2F2ZSB0aGlua2luZy4gSW5jcmVtZW50IHNvbmFtZSB0byBpbmRpY2F0ZSBwcm90b2NvbAorCWJyZWFrYWdlICh0aG91Z2ggcmVhbGx5IHRoZSBsaWJyYXJ5IGludGVyZmFjZSBoYXNuJ3QgY2hhbmdlZCBJCisJZ3Vlc3MpCisKKwkqIGRidXMvZGJ1cy10cmFuc3BvcnQuYyAoX2RidXNfdHJhbnNwb3J0X2dldF9pc19hdXRoZW50aWNhdGVkKToKKwl2ZXJpZnkgdGhlIEdVSUQgcmVjZWl2ZWQgZnJvbSBzZXJ2ZXIgbWF0Y2hlcyB3aGF0IHdlIHdlcmUKKwlleHBlY3RpbmcsIGlmIHdlIGhhZCBhbiBleHBlY3RhdGlvbgorCisJKiBkYnVzL2RidXMtYXV0aC5jIChzZW5kX29rKTogc2VuZCBHVUlEIGFsb25nIHdpdGggdGhlIE9LIGNvbW1hbmQKKwkoX2RidXNfYXV0aF9nZXRfZ3VpZF9mcm9tX3NlcnZlcik6IG5ldyBmdW5jdGlvbgorCShzZW5kX2JlZ2luKTogcGFyc2UgdGhlIE9LIGFyZ3MKKworCSogZG9jL2RidXMtc3BlY2lmaWNhdGlvbi54bWw6IGFkZCBHVUlEIHRvIHRoZSBhdXRoIHByb3RvY29sCisKKzIwMDUtMDUtMDUgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIEZpeCBteSBuYW1lIGluIHByZXZpb3VzIGNoYW5nZWxvZyA7KQorCisJKiBweXRob24vcHJveGllcy5weSAoUHJveHlPYmplY3QuX19nZXRhdHRyX18pOiBhZGQgZnVydGhlciBwYXRjaAorCWZyb20gQW50aG9ueSBCYXh0ZXIgdG8gdGhyb3cgYW4gQXR0cmlidXRlRXJyb3Igd2hlbiBweXRob24gCisJX19zcGVjaWFsX18gZnVuY3Rpb25zIGFyZSBjYWxsZWQgaW5zdGVhZCBvZiBtYXJzaGxpbmcgdGhlbSBvdmVyIAorCXRoZSBidXMgKEJ1ZyMxNjg1IGNvbW1lbnQgMykuCisKKzIwMDUtMDUtMDQgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIHB5dGhvbi9NYWtlZmlsZS5hbTogY2hhbmdlZCB0byB1c2UgcHlleGVjZGlyIGZvciB0aGUgYmluZGluZworCXNoYXJlZCBsaWJyYXJpZXMgKEJ1ZyMyNDk0KQorCisJKiBweXRob24vZXhjZXB0aW9ucy5weTogYnJpbmcgZXhjZXB0aW9ucyBvdmVyIGZyb20gdGhlIGJpbmRpbmdzCisJc28gdGhleSBjYW4gYmUgdXNlZCBpbiBhcHBsaWNhdGlvbnMgKEJ1ZyMyMDM2KQorCU1ha2UgYWxsIGV4Y2VwdGlvbnMgZGVyaXZlIGZyb20gREJ1c0V4Y2VwdGlvbgorCisJKiBweXRob24vX2RidXMucHksIHB5dGhvbi9wcm94aWVzLnB5OiBpbXBsZW1lbnQgX19yZXByX18gaW4gYSBjb3VwbGUKKwlvZiBjbGFzc2VzIHNvIHRoYXQgcHJpbnQgb2JqIGRvZXNuJ3QgdGhyb3cgYW4gZXhjZXB0aW9uIChCdWcgIzE2ODUpCisKKzIwMDUtMDUtMDMgIFJvc3MgQnVydG9uICA8cm9zc0BvcGVuZWRoYW5kLmNvbT4KKworCSogZ2xpYi9kYnVzLWdvYmplY3QuYyAoZGJ1c19nX2Nvbm5lY3Rpb25fcmVnaXN0ZXJfZ19vYmplY3QpOgorCVJldHVybiBpZiB3ZSBnZXQgYW4gZXJyb3IgZHVyaW5nIHJlZ2lzdHJhdGlvbi4gIFNldCB1cCBhCisJd2VhayByZWZlcmVuY2Ugb24gb2JqZWN0IHRvIHVucmVnaXN0ZXIgaWYgb2JqZWN0IGlzIGRlc3Ryb3llZC4KKwkodW5yZWdpc3Rlcl9nb2JqZWN0KTogTmV3IGZ1bmN0aW9uLgorCQorMjAwNS0wNS0wMSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogcHl0aG9uL2RidXNfYmluZGluZ3MucHl4LmluOiAKKwktIGFkZGVkIG5ldyB0eXBlIGNsYXNzZXMgZm9yIGhpbnRpbmcgdG8gdGhlIG1hcmFzaGFsZXIgd2hhdCB0eXBlIAorCXRvIHNlbmQgb3ZlciB0aGUgd2lyZQorCS0gYWRkZWQgaW50MTYgYW5kIHVpbnQxNiBtYXJzaGFsZXJzCisJLSBGaXhlZCBhIGJ1ZyBpbiB0aGUgdHlwZSBjb25zdGFudHMgdGhhdCBjYXVzZWQgaW50MzIgdG8gZ28gb3V0CisJYXMgdWludDE2IG92ZXIgdGhlIHdpcmUKKwkqIHB5dGhvbi9kYnVzLnB5OiBzcGxpdCB1cCBpbnRvIGRpZmZlcmVudCBmaWxlcyBhbmQgcmVuYW1lZCBfZGJ1cy5weQorCSogcHl0aG9uL19faW5pdF9fLnB5LCBweXRob24vX3V0aWwucHksIHB5dGhvbi9kZWNvcmF0b3JzLnB5LCAKKwlweXRob24vZXhjZXB0aW9ucy5weSwgcHl0aG9uL3Byb3hpZXMucHksIHB5dGhvbi9zZXJ2aWNlcy5weSwKKwlweXRob24vdHlwZXMucHk6IG5ldyBmaWxlcyBzcGxpdCBvZmYgZnJvbSBkYnVzLnB5CisJKiBweXRob24vTWFrZWZpbGUuYW06IEFkZCBuZXcgZmlsZXMsIHJlbW92ZSBkYnVzLnB5IGFuZCAKKwlpbnN0YWxsIGFsbCBweXRob24gZmlsZXMgdG8gPHB5dGhvbiBtb2R1bGUgZGlyPi9kYnVzCisJKiBweXRob24vZXhhbXBsZXMvKjogQWRkZWQgIyEvdXNyL2Jpbi9lbnYgcHl0aG9uIHRvIHRoZSB0b3Agb2YKKwlldmVyeSBleGFtcGxlLiAgUGF0Y2ggcHJvdmlkZWQgYnkgVGF0YXZhcnR5IEthbHlhbgorCisyMDA1LTA0LTI1ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBORVdTOiBVcGRhdGUgdG8gMC4zMworCisyMDA1LTA0LTI1ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBweXRob24vZGJ1c19iaW5kaW5ncy5weXguaW4gKHNlbmRfd2l0aF9yZXBseV9oYW5kbGVycyk6IE5ldyBzZW5kCisJbWV0aG9kIGZvciBkb2luZyBhc3luYyBjYWxscworCShfcGVuZGluZ19jYWxsX25vdGlmaWNhdGlvbik6IE5ldyBDIGZ1bmN0aW9uIGZvciBoYW5kbGluZyBwZW5kbmluZyBjYWxsCisJY2FsbGJhY2tzCisJKHNldF9ub3RpZnkpOiBOZXcgbWV0aG9kIGZvciBzZXR0aW5nIHBlbmRpbmcgY2FsbCBub3RpZmljYXRpb24KKwkKKwkqIHB5dGhvbi9kYnVzLnB5OiBuZXcgdmVyc2lvbiB0dXBsZSAidmVyc2lvbiIgaXMgc2V0IGF0ICgwLCA0MCwgMCkKKwlBc3luYyBjYXBhYmlsaXRpZXMgYWRkZWQgdG8gcmVtb3RlIG1ldGhvZCBjYWxscworCShTZW5kZXIpOiBjbGFzcyByZW1vdmVkCisJKFJlbW90ZVNlcnZpY2UpOiBjbGFzcyByZW1vdmVkCisJKE9iamVjdFRyZWUpOiBjbGFzcyByZW1vdmVkIGZvciBub3cKKwkoUmVtb3RlT2JqZWN0KTogUmVuYW1lZCB0byBQcm94eU9iamVjdAorCShSZW1vdGVNZXRob2QpOiBSZW5hbWVkIHRvIFByb3h5TWV0aG9kCisJKG1ldGhvZCk6IERlY29yYXRvciBhZGRlZCBmb3IgZGVjb3JhdGluZyBweXRob24gbWV0aG9kcyBhcyBkYnVzIG1ldGhvZHMKKwkoc2lnbmFsKTogRGVjb3JhdG9yIGFkZGVkIGZvciBkZWNvcmF0aW5nIHB5dGhvbiBtZXRob2RzIGFzIHNpZ25hbCBlbWl0dGVycworCShPYmplY3RUeXBlKTogTWV0YWNsYXNzIGFkZGVkIGZvciBnZW5lcmF0aW5nIGludHJvc3BlY3Rpb24gZGF0YSBhbmQgdGhlCisJbWV0aG9kIGNhbGxiYWNrIHZ0YWJsZQorCShJbnRlcmZhY2UpOiBXcmFwcGVyIGNsYXNzIGFkZGVkIHRvIHdyYXAgb2JqZWN0cyBpbiBhIGRidXMgaW50ZXJmYWNlCisJKE9iamVjdCk6IFVzZXMgT2JqZWN0VHlwZSBhcyBpdHMgbWV0YWNsYXNzIGFuZCBleHBvcnRzIEludHJvc3BlY3QKKwlvZiB0aGUgb3JnLmZyZWVkZXNrdG9wLkRCdXMuSW50cm9zcGVjdGFibGUgaW50ZXJmYWNlCisJKFZhbGlkYXRpb25FeGNlcHRpb24sIFVua25vd25NZXRob2RFeGNlcHRpb24pOiBuZXcgZXhjZXB0aW9ucworCisJKiBweXRob24vZXhhbXBsZXMvKjogTW9kaWZpZWQgdG8gZml0IHdpdGggdGhlIG5ldyBiaW5kaW5ncworCisyMDA1LTA0LTIzICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAoZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzKTogZml4IGRvYyBjb21tZW50LAorCXJlcG9ydGVkIGJ5IFRvbnkgSG91Z2h0b24KKworCSogdGVzdC90ZXN0LXNlcnZpY2UuYyAobWFpbik6IHRlc3QKKwlkYnVzX2Nvbm5lY3Rpb25fZ2V0X29iamVjdF9wYXRoX2RhdGEoKQorCisJKiBkYnVzL2RidXMtb2JqZWN0LXRyZWUuYyAoZmluZF9oYW5kbGVyKTogYmUgc3VyZSB3ZSBhbHdheXMgaW5pdAorCXRoZSBleGFjdF9tYXRjaAorCShfZGJ1c19vYmplY3RfdHJlZV9nZXRfdXNlcl9kYXRhX3VubG9ja2VkKTogbmV3IGZ1bmN0aW9uIHVzZWQgYnkKKwlkYnVzX2Nvbm5lY3Rpb25fZ2V0X29iamVjdF9wYXRoX2RhdGEoKQorCShkb19yZWdpc3Rlcik6IGFkZCBhc3NlcnRpb24gdGVzdCBmb3IgZ2V0X3VzZXJfZGF0YV91bmxvY2tlZAorCShvYmplY3RfdHJlZV90ZXN0X2l0ZXJhdGlvbik6IG1vcmUgdGVzdHMKKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYyAoZGJ1c19jb25uZWN0aW9uX2dldF9vYmplY3RfcGF0aF9kYXRhKToKKwluZXcgZnVuY3Rpb24gZnJvbSBEYW4gUmVlZCB0byBsZXQgeW91IGdldCB0aGUgdXNlciBkYXRhIGZyb20gCisJZGJ1c19jb25uZWN0aW9uX3JlZ2lzdGVyX29iamVjdF9wYXRoKCkKKworMjAwNS0wNC0yMyAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLW1hcnNoYWwtcmVjdXJzaXZlLXV0aWwuYzogRml4ZWQgYnVmZmVyIG92ZXJmbG93CisJaW4gbnVtZXJvdXMgcGxhY2VzIHRoYXQgZGlkIG5vdCBhY2NvdW50IGZvciB0aGUgTlVMTCB0ZXJtaW5hdG9yCisJKHNpZ25hdHVyZV9mcm9tX3NlZWQpOiBjaGFuZ2VkIHRoZSBtYW51YWwgc3RyaW5nIGNvcHkgbG9vcCB0byAKKwlqdXN0IHVzZSBzdHJjcHkgaW5zdGVhZAorCW1ha2UgY2hlY2sgc2hvdWxkIG5vdyBwYXNzCisKKzIwMDUtMDQtMTkgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLWhlYWRlci5jIChfZGJ1c19oZWFkZXJfY3JlYXRlKTogRml4IGFzc2VydAorCXNvIHRoYXQgaXQgYWxsb3dzIG1lc3NhZ2VzIHRoYXQgYXJlIG5vdCBzaWduYWxzIHRvIHBhc3MgaW4gCisJTlVMTCBhcyB0aGUgaW50ZXJmYWNlLgorCisyMDA1LTA0LTE4ICBEYXZpZCBaZXV0aGVuICA8ZGF2aWR6QHJlZGhhdC5jb20+CisKKwkqIGdsaWIvZGJ1cy1nbWFpbi5jIChpb19oYW5kbGVyX2Rlc3Ryb3lfc291cmNlKTogCisJKHRpbWVvdXRfaGFuZGxlcl9kZXN0cm95X3NvdXJjZSwgY29ubmVjdGlvbl9zZXR1cF9mcmVlKTogCisJQWxzbyB1bnJlZiB0aGUgc291cmNlIHRvIGF2b2lkIG1lbW9yeSBsZWFrcy4KKworMjAwNS0wNC0xMyAgRGF2aWQgWmV1dGhlbiAgPGRhdmlkekByZWRoYXQuY29tPgorCisJKiBidXMvY29uZmlnLXBhcnNlci5jIChidXNfY29uZmlnX3BhcnNlcl9uZXcpOiBCdW1wIHRoaXMgdG8gYQorCW1vcmUgcmVhc29uYWJsZSwgeWV0IHN0aWxsIHRvdGFsbHkgYXJiaXRyYXJ5LCB2YWx1ZSA6LSkuIAorCisyMDA1LTA0LTEzICBEYXZpZCBaZXV0aGVuICA8ZGF2aWR6QHJlZGhhdC5jb20+CisKKwkqIGRvYy9UT0RPOiBBZGRlZCBhbiAiaW1wb3J0YW50IGZvciAxLjAiIGl0ZW0gYWJvdXQgc2VsaW51eAorCWFsbG93L2RlbnkgbWVzc2FnZXMKKworMjAwNS0wNC0xMyAgRGF2aWQgWmV1dGhlbiAgPGRhdmlkekByZWRoYXQuY29tPgorCisJKiBidXMvc2VsaW51eC5jOiBBZGQgYy1maWxlLXN0eWxlIHRvIHRvcCBvZiBmaWxlCisJKGxvZ19hdWRpdF9jYWxsYmFjayk6IERvbid0IGZyZWUgdGhlIGRhdGEgaGVyZSBhbnltb3JlCisJKGJ1c19zZWxpbnV4X2NoZWNrKTogRG9uJ3QgdGFrZSBzcGlkIGFuZCB0cGlkIHNpbmNlIGFwcGVuZGluZworCXRoYXQgdG8gYXV4ZGF0YSBtYXkgT09NLgorCShidXNfc2VsaW51eF9hbGxvd3NfYWNxdWlyZV9zZXJ2aWNlKTogSGFuZGxlIE9PTSBhbmQgc2lnbmFsIGJhY2sKKwl0byB0aGUgY2FsbGVyIGlmIHdlIGFyZSBPT00gYnkgdGFraW5nIGFuIGVycm9yIG9iamVjdC4KKwkoYnVzX3NlbGludXhfYWxsb3dzX3NlbmQpOiAtZG8tCisKKwkqIGJ1cy9zZWxpbnV4Lmg6IEZpeCBwcm90b3R5cGVzIGZvciBidXNfc2VsaW51eF9hbGxvd3NfYWNxdWlyZV9zZXJ2aWNlCisJYW5kIGJ1c19zZWxpbnV4X2FsbG93c19zZW5kCisKKwkqIGJ1cy9idXMuYyAoYnVzX2NvbnRleHRfY2hlY2tfc2VjdXJpdHlfcG9saWN5KTogUGFzcyBlcnJvciBhbmQKKwlwYXNzIG9uIE9PTSB0aHJvd24gYnkgYnVzX3NlbGludXhfYWxsb3dzX3NlbmQoKQorCisJKiBidXMvc2VydmljZXMuYyAoYnVzX3JlZ2lzdHJ5X2FjcXVpcmVfc2VydmljZSk6IFBhc3MgZXJyb3IgYW5kCisJcGFzcyBvbiBPT00gdGhyb3duIGJ5IGJ1c19zZWxpbnV4X2FsbG93c19hY3F1aXJlX3NlcnZpY2UoKQorCisyMDA1LTA0LTEzICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZ2xpYi9kYnVzLWdtYWluLmMgKG1lc3NhZ2VfcXVldWVfZGlzcGF0Y2gpOiBvbmx5IGRpc3BhdGNoIG9uZQorCW1lc3NhZ2UgYXQgYSB0aW1lIHRvIGF2b2lkIG1vbm9wb2xpemluZyB0aGUgbWFpbiBsb29wLCBidWcgCisJIzI5NTMgZnJvbSBCZW5qYW1pbiBPdHRlCisKKzIwMDUtMDQtMDkgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtc3RyaW5nLmMgKGNvcHkpOiBjaGFuZ2UgYSBtZW1jcHkgdG8gbWVtbW92ZSBkdWUgdG8KKwlwb3NzaWJsZSBvdmVybGFwLCBmaXggZnJvbSBEYW5pZWwgUmVlZAorCShmaXh1cF9hbGlnbm1lbnQpOiBmaXggc2lnbmVkbmVzcyB3YXJuaW5ncworCShfZGJ1c19zdHJpbmdfYXBwZW5kX3VuaWNoYXIpOiBkaXR0bworCisyMDA1LTA0LTA5ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UtdXRpbC5jIChfZGJ1c19tZXNzYWdlX3Rlc3QpOiBmaXggc2lnbmVkbmVzcyB3YXJuaW5nCisKKwkqIGdsaWIvZGJ1cy1nbGliLXRvb2wuYyAobWFpbik6IGZpeCB3YXJuaW5nCisKKwkqIGdsaWIvZGJ1cy1iaW5kaW5nLXRvb2wtZ2xpYi5jIChnZW5lcmF0ZV9nbHVlKTogZml4IHdhcm5pbmcKKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYyAoZGJ1c19jb25uZWN0aW9uX3JlYWRfd3JpdGVfZGlzcGF0Y2gpOgorCWFkZCBhIG5ldyBmdW5jdGlvbiB0aGF0IGNhbiBiZSB1c2VkIGluIHNpbXBsZSBhcHBsaWNhdGlvbnMgdGhhdAorCWRvbid0IGhhdmUgYSBtYWluIGxvb3AgYW5kIGFyZSB3aWxsaW5nIHRvIGJsb2NrCisKKzIwMDUtMDQtMDUgIERhdmlkIFpldXRoZW4gIDxkYXZpZHpAcmVkaGF0LmNvbT4KKworCUZpeCBodHRwczovL2J1Z3MuZnJlZWRlc2t0b3Aub3JnL3Nob3dfYnVnLmNnaT9pZD0yODg5CisKKwkqIGdsaWIvZGJ1cy1nbWFpbi5jOgorCShpb19oYW5kbGVyX2Rlc3Ryb3lfc291cmNlKTogUmVtb3ZlIGZyb20gbGlzdCBvZiBJTyBoYW5kbGVycworCW9mIHRoZSBDb25uZWN0aW9uU2V0dXAgb2JqZWN0CisJKHRpbWVvdXRfaGFuZGxlcl9kZXN0cm95X3NvdXJjZSk6IC1kby0gZm9yIHRpbWVvdXQgaGFuZGxlcnMKKwkoaW9faGFuZGxlcl9zb3VyY2VfZmluYWxpemVkKTogRG9uJ3QgcmVtb3ZlIGZyb20gbGlzdCBzaW5jZQorCXdlIG5vdyBkbyB0aGF0IGluIGlvX2hhbmRsZXJfZGVzdHJveV9zb3VyY2UoKS4gUmVuYW1lZCBmcm9tCisJaW9faGFuZGxlcl9zb3VyY2VfZGVzdHJveWVkCisJKHRpbWVvdXRfaGFuZGxlcl9zb3VyY2VfZGVzdHJveWVkKTogLWRvLSBmb3IgdGltZW91dCBoYW5kbGVycworCShjb25uZWN0aW9uX3NldHVwX2ZyZWUpOiBJdCBpcyBub3cgc2FmZSB0byBpdGVyYXRlIG92ZXIgYWxsCisJSU8gYW5kIHRpbWVvdXQgaGFuZGxlcnMgYXMgdGhlIF9kZXN0cm95X3NvdXJjZSByZW1vdmVzIHRoZW0KKwlmcm9tIHRoZSBsaXN0IHN5bmNocm9ub3VzbHkKKworMjAwNS0wMy0zMCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogY2hhbmdlIGNoZWNrIHRvIGd0ayAyLjQKKworCSogdG9vbHMvZGJ1cy12aWV3ZXIuYyAobmFtZV9jb21ib19jaGFuZ2VkX2NhbGxiYWNrKTogcmVtb3ZlCisJZ3RrX2NvbWJvX2JveF9nZXRfYWN0aXZlX3RleHQoKSB1c2FnZSB0byBkZWNyZW1lbnQgR1RLIHJlcXVpcmVtZW50CisJdG8gMi40CisKKzIwMDUtMDMtMjkgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIE5ld3M6IFVwZGF0ZSAwLjMyCisKKwkqIEhBQ0tJTkc6IEZpeGVkIHJlYWxlYXNlIGluc3RydWN0aW9ucy4gIGNvbmZpZ3VyZS5pbiBzaG91bGQgYmUgdXBkYXRlZCB0bworCSAgdGhlIG5leHQgcmVsZWFzZSBieSB0aGUgcGVyc29uIHdobyBtYWRlIHRoZSBsYXN0IHJlbGVhc2UuCisKKzIwMDUtMDMtMjkgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIHB5dGhvbi9sdmFsdWVfY2FzdF9wb3N0X3Byb2Nlc3MucHkgLSByZW1vdmVkLiAgUGF0Y2ggaGFzIGJlZW4KKwkgIHN1Ym1pdHRlZCB0byBQeXJleCBtYWludGFpbmVycyB0aGF0IGZpeGVzIGdjYzQuMCBlcnJvcnMKKworCSogcHl0aG9uL01ha2VmaWxlLmFtOiByZW1vdmVkIHJlZnJlbmNlcyB0byBsdmFsdWVfY2FzdF9wb3N0X3Byb2Nlc3MucHkKKworMjAwNS0wMy0yNCAgRGFuaWVsIFJlZWQgIDxuQG1sLm9yZz4KKworCSogdG9vbHMvTWFrZWZpbGUuYW06IE1ha2UgcHJpbnQtaW50cm9zcGVjdCBhbmQKKwlkYnVzLWJ1cy1pbnRyb3NwZWN0LnhtbCBidWlsZGluZyBjb25kaXRpb25hbCBvbiBIQVZFX0dMSUIuCisKKzIwMDUtMDMtMjIgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIHRvb2xzL01ha2VmaWxlLmFtOiBQYXRjaCBieSBDb2xpbiBXYWx0ZXJzIHRoYXQgZml4ZXMgZGlzdGNoZWNrCisKKwkqIGRidXMvZGJ1cy11c2VyZGIuYywgZGJ1cy9kYnVzLXVzZXJkYi11dGlsLmM6IEFkZCBwYXRjaCB3ZSBoYXZlIAorCSAgaGFkIGluIFJlZCBIYXQgcGFja2FnZXMgZm9yIGEgd2hpbGUgYnV0IGZvciBzb21lIHJlYXNvbiBuZXZlciAKKwkgIGdvdCBtZXJnZWQgdXBzdHJlYW0KKwkgIChfZGJ1c19pc19hX251bWJlcik6IE5ldyBjaGVja3MgaWYgYSBzdHJpbmcKKwkgIGNhbiBiZSBjb252ZXJ0ZWQgdG8gYSBudW1iZXIgYW5kIGRvZXMgdGhlIGNvbnZlcnNpb24gaWYgaXQgY2FuCisJICAoX2RidXNfdXNlcl9kYXRhYmFzZV9sb29rdXApOiBBZGQgY2hlY2sgdG8gc2VlIGlmIHRoZSBnaXZlbiB1c2VybmFtZQorCSAgaXMgYSB1ZGkuICBUaGlzIGFsbG93cyB1ZGkncyB0byBiZSB1c2VkIGluc3RlYWQgb2YgdXNlcm5hbWVzIGluIHRoZQorCSAgY29uZmlnIGZpbGUuCisJICAoX2RidXNfdXNlcl9kYXRhYmFzZV9sb29rdXBfZ3JvdXApOiBBZGQgY2hlY2sgdG8gc2VlIGlmIHRoZSBnaXZlbiBncm91cG5hbWUKKwkgIGlzIGEgZ2RpLiAgVGhpcyBhbGxvd3MgZ2RpJ3MgdG8gYmUgdXNlZCBpbnN0ZWFkIG9mIGdyb3VwbmFtZXMgaW4gdGhlCisJICBjb25maWcgZmlsZS4KKworMjAwNS0wMy0yMSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogcHl0aG9uL2x2YWx1ZV9jYXN0X3Bvc3RfcHJvY2Vzcy5weSAtIGFkZGVkIHBvc3QgcHJvY2Vzc29yIHRvIGZpeCBQeXJleAorCSAgY29kZSBzbyB0aGF0IGl0IGNvbXBpbGVzIHdpdGggZ2NjNC4wCisKKwkqIHB5dGhvbi9NYWtlZmlsZS5hbTogQWRkZWQgbHZhbHVlX2Nhc3RfcG9zdF9wcm9jZXNzLnB5IHRvIEVYVFJBX0RJU1QKKwkgIHJ1biBkYnVzX2JpbmRpbmdzLmMgdGhyb3VnaCBsdmFsdWVfY2FzdF9wb3N0X3Byb2Nlc3MucHkgYW5kIGNvcHkgdGhlCisJICByZXN1bHRzIGJhY2sgdG8gZGJ1c19iaW5kaW5nLmMKKworMjAwNS0wMy0yMCAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCVBhdGNoIHN1Z2dlc3RlZCBieSBJbmd1dmEgUmFqYXNla2hhciA8cmluZ3V2YUBub3ZlbGwuY29tPi4KKworCSogY29uZmlndXJlLmluOiBSZXF1aXJlIEdUSysgMi42LgorCQorMjAwNS0wMy0yMCAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogTWFrZWZpbGUuYW0gKFNVQkRJUlMsIERJU1RfU1VCRElSUyk6IEJ1aWxkIHRvb2xzIGJlZm9yZSB0ZXN0LgorCisyMDA1LTAzLTE3ICBUb20gUGFya2VyICA8cGFsZnJleUB0ZXZwLm5ldD4KKworCSogZGJ1cy9kYnVzLXVzZXJkYi5jIChfZGJ1c191c2VyX2RhdGFiYXNlX2xvb2t1cCk6IERvbid0CisJcHJpbnQgREJVU19VSURfVU5TRVQ7IGluc3RlYWQgcHJpbnQgcGFzc2VkIHVzZXJuYW1lLiAgQWxzbworCWJlIHN1cmUgdG8gYWN0dWFsbHkgdXNlIGdpZCBsb29rZWQgdXAgaW4gY2FjaGUuCisJCisJKiBkYnVzL2RidXMtdXNlcmRiLXV0aWwuYyAoX2RidXNfdXNlcl9kYXRhYmFzZV9sb29rdXBfZ3JvdXApOiBEaXR0bworCWZvciBEQlVTX0dJRF9VTlNFVCBhbmQgZ3JvdXBuYW1lLgorCisyMDA1LTAzLTE3ICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiBidXMvcHJpbnQtaW50cm9zcGVjdC5jOiBNb3ZlIHRvIHRvb2xzLy4KKwkqIGJ1cy9ydW4td2l0aC10bXAtc2Vzc2lvbi1idXMuc2g6IERpdHRvLgorCQorCSogZ2xpYi9NYWtlZmlsZS5hbSAoZGJ1cy1nbGliLWJpbmRpbmdzLmgpOiBNb3ZlCisJZ2VuZXJhdGlvbiB0byB0b29scy9NYWtlZmlsZS5hbS4KKworCSogdGVzdC9nbGliL3J1bi10ZXN0LnNoOiBVcGRhdGUgdG8gaGFuZGxlIG1vdmUKKwlvZiBydW4td2l0aC10bXAtc2Vzc2lvbi1idXMuc2guCisKKwkqIHRlc3QvZ2xpYi90ZXN0LXNlcnZpY2UtZ2xpYi5jOiBVcGRhdGUgdG8gaGFuZGxlCisJbW92ZSBvZiBkYnVzLWdsaWItYmluZGluZ3MuaC4KKworCSogdG9vbHMvcHJpbnQtaW50cm9zcGVjdC5jOiBNb3ZlZCBoZXJlCisJZnJvbSBidXMvLCBhbmQgcG9ydGVkIHRvIEdMaWIgYmluZGluZ3MuCisKKwkqIHRvb2xzL3J1bi13aXRoLXRtcC1zZXNzaW9uLWJ1cy5zaDogTW92ZWQgaGVyZQorCWZyb20gYnVzLy4KKworCSogdG9vbHMvTWFrZWZpbGUuYW06IEdlbmVyYXRlIGRidXMtZ2xpYi1iaW5kaW5ncy5oCisJYW5kIGRidXMtYnVzLWludHJvc3BlY3QueG1sIGhlcmUuCisKKwkqIHRvb2xzLy5jdnNpZ25vcmUsIGdsaWIvLmN2c2lnbm9yZSwgYnVzLy5jdnNpZ25vcmU6CisJVXBkYXRlLgorCisyMDA1LTAzLTE3ICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiBidXMvZHJpdmVyLmMgKHdyaXRlX2FyZ3NfZm9yX2RpcmVjdGlvbik6IFVzZQorCV9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSB0byByZXRyaWV2ZSBzdHJpbmc7CisJX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhX2xlbiBkb2Vzbid0IGFjdHVhbGx5IHJldHVybgorCWEgTlVMTC10ZXJtaW5hdGVkIHN1YnN0cmluZy4KKworCSogdGVzdC9nbGliL3Rlc3Qtc2VydmljZS1nbGliLmM6IEluY2x1ZGUgZGJ1cy1nbGliLWJpbmRpbmdzLmguCisJKG1haW4pOiBDaGFuZ2UgdG8gdXNlIG9yZ19mcmVlZGVza3RvcF9EQnVzX3JlcXVlc3RfbmFtZQorCWluc3RlYWQgb2YgdXNpbmcgZ19wcm94eV9iZWdpbl9jYWxsL2VuZF9jYWxsLgorCisyMDA1LTAzLTE1ICBKb2UgU2hhdyAgPGpvZXNoYXdAbm92ZWxsLmNvbT4KKworCSogbW9uby9Qcm94eUJ1aWxkZXIuY3MgKEJ1aWxkRmluYWxpemVyKTogRml4IHNvbWUgaW52YWxpZCBJTCB3aGVuCisJZ2VuZXJhdGluZyB0aGUgZmluYWxpemVyLiAgRml4ZXMgZnJvbSBCZW4gTWF1cmVyLgorCisyMDA1LTAzLTEyICBKb2UgU2hhdyAgPGpvZXNoYXdAbm92ZWxsLmNvbT4KKworCSogbW9uby9CdXNEcml2ZXIuY3M6IFVwZGF0ZSBtZXRob2QgbmFtZXM6IExpc3RTZXJ2aWNlcworCWJlY29tZXMgTGlzdE5hbWVzOyBHZXRPd25lciBiZWNvbWVzIEdldE5hbWVPd25lci4KKworCSogbW9uby9Qcm94eUJ1aWxkZXIuY3MgKEJ1aWxkRmluYWxpemVyKTogTmVlZCB0byBsb2FkIGFyZyAwCisJb250byB0aGUgZXZhbCBzdGFjayB3aGVuIHJlbW92aW5nIHRoZSBkZWxlZ2F0ZS4KKworMjAwNS0wMy0xMiAgSm9lIFNoYXcgIDxqb2VzaGF3QG5vdmVsbC5jb20+CisKKwkqIG1vbm8vZGJ1cy1zaGFycC5kbGwuY29uZmlnLmluOiBEb24ndCBoYXJkY29kZSAwIGZvcgorCUxUX0NVUlJFTlQuICBTZXQgaXQgdG8gdGhlIGF1dG9jb25mIHZhcmlhYmxlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkqIG1vbm8vUHJveHlCdWlsZGVyLmNzOiBBZGQgYSBmaW5hbGl6ZXIgdG8gdGhlIGdlbmVyYXRlZCBwcm94eQorCWNsYXNzZXMgdGhhdCBkaXNjb25uZWN0cyB0aGUgc2lnbmFsIGhhbmRsZXIgZGVsZWdhdGUgZnJvbSB0aGUKKwlzZXJ2aWNlIG9iamVjdC4gIEZpeGVzIGEgYmlnIGxlYWsgb2YgcHJveHkgb2JqZWN0cyBvbiB0aGUKKwljbGllbnQgc2lkZSBvZiB0aGluZ3MuICBQYXRjaCBmcm9tIEJlbiBNYXVyZXIKKwk8Ym1hdXJlckB4aW1pYW4uY29tPgorCisyMDA1LTAzLTEyICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiBidXMvZHJpdmVyLmMgKHdyaXRlX2FyZ3NfZm9yX2RpcmVjdGlvbik6IE5ldyBmdW5jdGlvbiwKKwlwYXJzZXMgYSB0eXBlIHNpZ25hdHVyZSBpbnRvIGFyZ3VtZW50cyBhbmQgb3V0cHV0cyB0bworCVhNTC4KKwkoYnVzX2RyaXZlcl9oYW5kbGVfaW50cm9zcGVjdCk6IFVzZSBpdCBpbnN0ZWFkIG9mCisJaGFyZGNvZGluZyBYTUwgZm9yIGNlcnRhaW4gc2lnbmF0dXJlcy4KKwkKKwkqIGJ1cy9NYWtlZmlsZS5hbSAoZGJ1cy1idXMtaW50cm9zcGVjdC54bWwpOiBBZGQKKwlkZXBlbmRlbmN5IG9uIGRidXMtZGFlbW9uLgorCisJKiBnbGliL2RidXMtZ2xpYi10b29sLmMgKG1haW4pOiBQYXJzZSBpZ25vcmVfdW5zdXBwb3J0ZWQKKwlhcmd1bWVudCwgcGFzcyBpdCB0byBkYnVzX2JpbmRpbmdfdG9vbF9vdXRwdXRfZ2xpYl9jbGllbnQuCisKKwkqIGdsaWIvZGJ1cy1iaW5kaW5nLXRvb2wtZ2xpYi5jCisJKGdlbmVyYXRlX2NsaWVudF9nbHVlKTogUHJvdGVjdCBhZ2FpbnN0IG11bHRpcGxlIGluY2x1c2lvbi4KKwkoZGJ1c19iaW5kaW5nX3Rvb2xfb3V0cHV0X2dsaWJfY2xpZW50KTogQWRkCisJR19CRUdJTl9ERUNMUy9HX0VORF9ERUNMUy4KKworCSogZ2xpYi9kYnVzLWJpbmRpbmctdG9vbC1nbGliLmMgKGNvbXB1dGVfY2xpZW50X21ldGhvZF9uYW1lKToKKwlDaGFuZ2UgdG8ganVzdCB0YWtlIGlmYWNlIHByZWZpeCBkaXJlY3RseS4KKwkod3JpdGVfZm9ybWFsX3BhcmFtZXRlcnMpOiBDbGFyaWZ5IGVycm9yIG1lc3NhZ2UuCisJKGNoZWNrX3N1cHBvcnRlZF9wYXJhbWV0ZXJzKTogTmV3IGZ1bmN0aW9uOyBjaGVja3MgdG8gc2VlIHR5cGUKKwlzaWduYXR1cmVzIG9mIG1ldGhvZCBwYXJhbWV0ZXJzIGFyZSBzdXBwb3J0ZWQuCisJKGdlbmVyYXRlX2NsaWVudF9nbHVlKTogSGFuZGxlIGlnbm9yZV91bnN1cHBvcnRlZCBmbGFnLgorCShkYnVzX2JpbmRpbmdfdG9vbF9vdXRwdXRfZ2xpYl9jbGllbnQpOiBIYW5kbGUgaWdub3JlX3Vuc3VwcG9ydGVkCisJcGFyYW1ldGVyLgorCisJKiBnbGliL01ha2VmaWxlLmFtIChkYnVzLWdsaWItYmluZGluZ3MuaCk6IFBhc3MKKwktLWlnbm9yZS11bnN1cHBvcnRlZCBieSBkZWZhdWx0IHVudGlsIGdsaWIgYmluZGluZ3MKKwlzdXBwb3J0IGFycmF5cy4KKworMjAwNS0wMy0xMSAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogZ2xpYi9NYWtlZmlsZS5hbTogR2VuZXJhdGUgZGJ1cy1nbGliLWJpbmRpbmdzLmggYW5kCisJaW5zdGFsbCBpdC4KKworCSogYnVzL3ByaW50LWludHJvc3BlY3QuYzogTmV3IGZpbGU7IHByaW50cyBpbnRyb3NwZWN0aW9uCisJZGF0YSBmb3IgYSBnaXZlbiBuYW1lIGFuZCBvYmplY3QgcGF0aC4KKworCSogYnVzL3J1bi13aXRoLXRtcC1zZXNzaW9uLWJ1cy5zaDogTmV3IGZpbGUsIHJlZmFjdG9yZWQKKwlmcm9tIHRlc3QvZ2xpYi9ydW4tdGVzdC5zaC4gIENyZWF0ZXMgYSB0ZW1wb3Jhcnkgc2Vzc2lvbgorCWJ1cyBhbmQgcnVucyBhbm90aGVyIHByb2dyYW0uCisKKwkqIHRlc3QvZ2xpYi9ydW4tdGVzdC5zaDogUmVmYWN0b3IgdG8gaW52b2tlCisJcnVuLXdpdGgtdG1wLXNlc3Npb24tYnVzLnNoLgorCisJKiBidXMvZHJpdmVyLmMgKGJ1c19kcml2ZXJfaGFuZGxlX2ludHJvc3BlY3QpOiBGaXggdG8gcHJpbnQgbmV3CisJaW50cm9zcGVjdGlvbiBmb3JtYXQuICBBbHNvIGNoYW5nZSB0byB1c2UgREJVU19UWVBFX3hfQVNfU1RSSU5HCisJbWFjcm9zIGluc3RlYWQgb2YgaGFyZGNvZGluZy4KKworCSogZ2xpYi8uY3ZzaWdub3JlLCBidXMvLmN2c2lnbm9yZSwgdGVzdC9nbGliLy5jdnNpZ25vcmU6IFVwZGF0ZS4KKworMjAwNS0wMy0xMSAgSm9lIFNoYXcgIDxqb2VzaGF3QG5vdmVsbC5jb20+CisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMgKGRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHkpOiBSZW1vdmUKKwl0aGlzIHVucmVmOyBpdCBkb2Vzbid0IG1hdGNoIHVwIGV2ZW5seSBpbiBzb21lIGNvZGVwYXRocy4KKwkoX2RidXNfY29ubmVjdGlvbl9ibG9ja19wZW5kaW5nX2NhbGwpOiBVbnJlZiBhdCBldmVyeSBleGl0cG9pbnQ7CisJdGhpcyBldmVubHkgbWF0Y2hlcyB3aXRoIHRoZSByZWYgbmVhciB0aGUgdG9wIG9mIHRoaXMgZnVuY3Rpb24uCisKKzIwMDUtMDMtMDkgIEpvZSBTaGF3ICA8am9lc2hhd0Bub3ZlbGwuY29tPgorCisJKiBkYnVzL2RidXMtb2JqZWN0LXRyZWUuYworCShfZGJ1c19vYmplY3RfdHJlZV91bnJlZ2lzdGVyX2FuZF91bmxvY2spOiBJZiBjaGVja3MgYXJlIGVuYWJsZWQKKwlhbmQgd2UgdHJ5IHRvIHVucmVnaXN0ZXIgYSBwYXRoIHRoYXQncyBub3QgcmVnaXN0ZXJlZCwgc3RpbGwgZ28KKwl0aHJvdWdoIHRoZSBwcm9jZXNzIG9mIHVubG9ja2luZyBhbmQgZG9uJ3QganVzdCByZXR1cm4uCisKKzIwMDUtMDMtMDkgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwkqIGdsaWIvZGJ1cy1ncHJveHkuYyAoZGJ1c19nX3Byb3h5X2ludm9rZSk6IE5ldyBtZXRob2Q7IGNhbGxzCisJdG8gdGhpcyBhcmUgZ2VuZXJhdGVkIGZvciBjbGllbnQtc2lkZSB3cmFwcGVycy4gIEludm9rZXMgYQorCUQtQlVTIG1ldGhvZCBhbmQgcmV0dXJucyByZXBseSB2YWx1ZXMuICAKKworCSogZ2xpYi9kYnVzLWJpbmRpbmctdG9vbC1nbGliLmMgKHdyaXRlX2FyZ3Nfc2lnX2Zvcl9kaXJlY3Rpb24pOiBOZXcKKwlmdW5jdGlvbjsgd3JpdGVzIHNpZ25hdHVyZSBzdHJpbmcgZm9yIGFyZ3VtZW50IGRpcmVjdGlvbi4KKwkod3JpdGVfYXJnc19mb3JfZGlyZWN0aW9uKTogQ2hhbmdlIHRvIHBhc3MgaW5wdXQgdmFsdWVzIGRpcmVjdGx5CisJaW5zdGVhZCBvZiB2aWEgYWRkcmVzcywgYW5kIGZpeCBpbmRlbnRhdGlvbi4KKwkoZ2VuZXJhdGVfY2xpZW50X2dsdWUpOiBDaGFuZ2UgdG8gaW52b2tlIGRidXNfZ19wcm94eV9pbnZva2UuICBBbHNvCisJbWFrZSBnZW5lcmF0ZWQgd3JhcHBlcnMgaW5saW5lYWJsZS4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2ZpeGVkX2FycmF5KTogQWRkCisJbm90ZSBhYm91dCB1c2luZyBkYnVzX3R5cGVfaXNfZml4ZWQuCisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLWJhc2ljLmMgKF9kYnVzX3R5cGVfaXNfZml4ZWQpOiBNb3ZlZCB0bworCWRidXMvZGJ1cy1zaWduYXR1cmUuYyBhcyBkYnVzX3R5cGVfaXNfZml4ZWQuCisKKwlBbGwgY2FsbGVycyB1cGRhdGVkLgorCisJKiBkYnVzL2RidXMtc2lnbmF0dXJlLmMgKGRidXNfdHlwZV9pc19maXhlZCk6IE1vdmVkIGhlcmUKKwlmcm9tIGRidXMvZGJ1cy1tYXJzaGFsLWJhc2ljLmM6X2RidXNfdHlwZV9pc19maXhlZC4KKworCSogZGJ1cy9kYnVzLXNpZ25hdHVyZS5oOiBQcm90b3R5cGUuCisKKwkqIGdsaWIvZGJ1cy1iaW5kaW5nLXRvb2wtZ2xpYi5jIChjb21wdXRlX21hcnNoYWxsZXJfbmFtZSk6IEZpeAorCWVycm9yIHByaW50ZiBjb2RlLgorCisJKiB0ZXN0L2dsaWIvdGVzdC1kYnVzLWdsaWIuYyAobWFpbik6IEJlIHN1cmUgdG8gY2xlYXIgZXJyb3IgYXMKKwlhcHByb3ByaWF0ZSBpbnN0ZWFkIG9mIGp1c3QgZnJlZWluZyBpdC4KKwkobWFpbik6IEZyZWUgcmV0dXJuZWQgc3RyaW5ncyB1c2luZyBnX2ZyZWUuCisKKwkqIHRlc3QvZ2xpYi9NYWtlZmlsZS5hbSAodGVzdC1zZXJ2aWNlLWdsaWItZ2x1ZS5oKQorCSh0ZXN0LXNlcnZpY2UtZ2xpYi1iaW5kaW5ncy5oKTogQWRkIGRlcGVuZGVuY3kgb24gZGJ1cy1iaW5kaW5nLXRvb2wuCisKKwkqIGdsaWIvZGJ1cy1ndmFsdWUuYyAoTUFQX0JBU0lDKTogUmVmYWN0b3JlZCBmcm9tIE1BUF9CQVNJQ19JTklUOworCXNpbXBseSBtYXBzIGEgc2ltcGxlIEQtQlVTIHR5cGUgdG8gR1R5cGUuCisJKGRidXNfZGJ1c190eXBlX3RvX2d0eXBlKTogRnVuY3Rpb24gd2hpY2ggbWFwcyBELUJVUyB0eXBlIHRvCisJR1R5cGUuCisJKGRidXNfZ3ZhbHVlX2luaXQpOiBKdXN0IGludm9rZSBkYnVzX2RidXNfdHlwZV90b19ndHlwZSBhbmQKKwlpbml0aWFsaXplIHRoZSB2YWx1ZSB3aXRoIGl0LgorCShkYnVzX2d2YWx1ZV9iaW5kaW5nX3R5cGVfZnJvbV90eXBlKTogVW51c2VkLCBkZWxldGUuCisJKGRidXNfZ3ZhbHVlX2RlbWFyc2hhbCk6IFN3aXRjaCB0byBoYXJkY29kaW5nIGRlbWFyc2hhbGxpbmcgZm9yCisJdmFyaW91cyB0eXBlcyBpbnN0ZWFkIG9mIHVubWFyc2hhbGxpbmcgdG8gdmFsdWUgZGF0YSBkaXJlY3RseS4KKwlSZW1vdmUgY2FuX2NvbnZlcnQgYm9vbGVhbi4KKwkoZGJ1c19ndmFsdWVfbWFyc2hhbCk6IFJlbW92ZSBkdXBsaWNhdGUgaW5pdGlhbGl6YXRpb247IHN3aXRjaCB0bworCXJldHVybmluZyBkaXJlY3RseSBpbnN0ZWFkIG9mIHVzaW5nIGNhbl9jb252ZXJ0IGJvb2xlYW4uCisJKGRidXNfZ3ZhbHVlX3N0b3JlKTogTmV3IGZ1bmN0aW9uOyBub3QgcmVsYXRlZCB0byBELUJVUyBwZXItc2UuCisJU3RvcmVzIGEgR1ZhbHVlIGluIGEgcG9pbnRlciB0byBhIHZhbHVlIG9mIGl0cyBjb3JyZXNwb25kaW5nIEMKKwl0eXBlLgorCisJKiBnbGliL2RidXMtZ3ZhbHVlLmg6IFJlbW92ZSBkYnVzX2d2YWx1ZV9iaW5kaW5nX3R5cGVfZnJvbV90eXBlLAorCWFkZCBkYnVzX2d2YWx1ZV9zdG9yZS4KKworMjAwNS0wMy0wOCAgSm9lIFNoYXcgIDxqb2VzaGF3QG5vdmVsbC5jb20+CisKKwlGaXggYSBidW5jaCBvZiBsaWZlY3ljbGUgYW5kIG1lbW9yeSBtYW5hZ2VtZW50IHByb2JsZW1zCisJaW4gdGhlIG1vbm8gYmluZGluZ3MuCisKKwkqIG1vbm8vQXJndW1lbnRzLmNzIChBcmd1bWVudHMpOiBJbXBsZW1lbnQgSURpc3Bvc2FibGUKKworCSogbW9uby9CdXMuY3MgKEJ1cyk6IERvbid0IGFsbG93IHB1YmxpYyBpbnN0YW50aWF0aW9uLiAgVGhpcyBpcworCXN0cmljdGx5IGEgc3RhdGljIGNsYXNzLgorCisJKiBtb25vL0Nvbm5lY3Rpb24uY3M6IE1vdmUgdGhlIERCdXNPYmplY3RQYXRoVlRhYmxlIGFuZCBhc3NvY2lhdGVkCisJZGVsZWdhdGVzIGludG8gdGhpcyBmaWxlLgorCShDb25uZWN0aW9uKTogSW1wbGVtZW50IElEaXNwb3NhYmxlLgorCShEaXNwb3NlKTogRGlzY29ubmVjdCB0aGUgY29ubmVjdGlvbiBhbmQgc2V0IHRoZSByYXcgY29ubmVjdGlvbgorCXBvaW50ZXIgdG8gSW50UHRyLlplcm8uCisJKH5Db25uZWN0aW9uKTogQ2FsbCBEaXNwb3NlKCkuCisJKFJlZ2lzdGVyT2JqZWN0UGF0aCk6IEFkZGVkLiAgTWFuYWdlcyB0aGUgcmVnaXN0cmF0aW9uIG9mIG9iamVjdAorCXBhdGhzIHNvIHdlIGNhbiBjbGVhbmx5IGRpc2Nvbm5lY3QgdGhlbSBhdCBkaXNwb3NlL2ZpbmFsaXplIHRpbWUuCisJKFVucmVnaXN0ZXJPYmplY3RQYXRoKTogRGl0dG8uCisJKHNldF9SYXdDb25uZWN0aW9uKTogVW5yZWdpc3RlciBhbGwgb2YgdGhlIG9iamVjdCBwYXRocyB3aGVuCisJY2hhbmdpbmcgdGhlIHVuZGVybHlpbmcgREJ1c0Nvbm5lY3Rpb24uICBBZGQgdGhlbSBiYWNrIG9udG8gdGhlCisJbmV3IGNvbm5lY3Rpb24sIGlmIGFueS4KKworCSogbW9uby9IYW5kbGVyLmNzOiBEb24ndCBpbXBsZW1lbnQgSURpc3Bvc2FibGU7IGl0IGRvZXNuJ3QgdXNlIGFueQorCW1vcmUgdW5tYW5hZ2VkIHJlc291cmNlcyBhbnltb3JlLCBzbyBpdCdzIG5vdCBuZWNlc3NhcnkuICBNb3ZlIGFsbAorCXRoZSBEQnVzT2JqZWN0UGF0aFZUYWJsZSBzdHVmZiBvdXQgb2YgaGVyZS4KKwkoSGFuZGxlcik6IFNhdmUgcmVmZXJlbmNlcyB0byBvdXIgZGVsZWdhdGVzIHNvIHRoYXQgdGhleSBkb24ndCBnZXQKKwlmaW5hbGl6ZWQuICBDYWxsIENvbm5lY3Rpb24uUmVnaXN0ZXJPYmplY3RQYXRoKCkgaW5zdGVhZCBvZgorCWRidXNfY29ubmVjdGlvbl9yZWdpc3Rlcl9vYmplY3RfcGF0aCgpIGRpcmVjdGx5LgorCShNZXNzYWdlX0NhbGxlZCk6IERpc3Bvc2UgdGhlIG1lc3NhZ2UgYWZ0ZXIgd2UncmUgZmluaXNoZWQgd2l0aAorCWl0LgorCisJKiBtb25vL01lc3NhZ2UuY3MgKE1lc3NhZ2UpOiBJbXBsZW1lbnQgSURpc3Bvc2FibGUuCisJKERpc3Bvc2UpOiBEaXNwb3NlIHRoZSBBcmd1bWVudHMsIGFuZCBzZXQgdGhlIFJhd01lc3NhZ2UgdG8KKwlJbnRQdHIuWmVyby4KKwkoU2VuZFdpdGhSZXBseUFuZEJsb2NrKTogV2Ugb3duIHRoZSByZWYgdG8gdGhlIHJlcGx5IHRoYXQgY29tZXMKKwliYWNrIGZyb20gZGJ1c19jb25uZWN0aW9uX3NlbmRfd2l0aF9yZXBseV9hbmRfYmxvY2soKSBzbyBhZGQgYQorCWNvbW1lbnQgYWJvdXQgdGhhdCBhbmQgdW5yZWYgaXQgYWZ0ZXIgd2UndmUgY29uc3RydWN0ZWQgYSBtYW5hZ2VkCisJTWV0aG9kUmV0dXJuIGNsYXNzIGFyb3VuZCBpdC4gIEZpeGVzIGEgYmlnLCBiaWcgbGVhay4KKworCSogbW9uby9Qcm94eUJ1aWxkZXIuY3M6IFJlZmxlY3QgaW50byBNZXNzYWdlIHRvIGdldCB0aGUgRGlzcG9zZQorCW1ldGhvZC4KKwkoQnVpbGRTaWduYWxIYW5kbGVyKTogQWZ0ZXIgd2UndmUgc2VudCB0aGUgU2lnbmFsIG1lc3NhZ2UsIGRpc3Bvc2UKKwlvZiBpdC4KKwkoQnVpbGRNZXRob2QpOiBEaXNwb3NlIG9mIHRoZSBtZXRob2QgY2FsbCBhbmQgcmVwbHkgbWVzc2FnZXMgYWZ0ZXIKKwl3ZSd2ZSBzZW50IHRoZSBtZXNzYWdlIGFuZCBleHRyYWN0ZWQgdGhlIGRhdGEgd2Ugd2FudCBmcm9tIHRoZQorCXJlcGx5LgorCisJKiBtb25vL1NlcnZpY2UuY3MgKFVucmVnaXN0ZXJPYmplY3QpOiBEb24ndCBjYWxsIGhhbmRsZXIuRGlzcG9zZSgpCisJYW55bW9yZS4KKwkoU2VydmljZV9GaWx0ZXJDYWxsZWQpOiBEaXNwb3NlIG9mIHRoZSBtZXNzYWdlIGFmdGVyIHdlJ3JlCisJZmluaXNoZWQgd2l0aCBpdC4KKworMjAwNS0wMy0wOCAgSm9lIFNoYXcgIDxqb2VzaGF3QG5vdmVsbC5jb20+CisKKyAgICAgICAgKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jIChkYnVzX2Nvbm5lY3Rpb25fc2VuZF93aXRoX3JlcGx5KToKKyAgICAgICAgQWZ0ZXIgd2UgYXR0YWNoIG91ciBwZW5kaW5nIGNhbGwgdG8gdGhlIGNvbm5lY3Rpb24sIHVucmVmCisgICAgICAgIGl0LiAgRml4ZXMgYSBsZWFrLgorIAorICAgICAgICAqIG1vbm8vQ29ubmVjdGlvbi5jcyAoc2V0X1Jhd0Nvbm5lY3Rpb24pOiBEaXNjb25uZWN0IG91cgorICAgICAgICBmaWx0ZXIgYW5kIG1hdGNoIGNhbGxiYWNrcyBmcm9tIHRoZSBvbGQgY29ubmVjdGlvbiBhbmQKKyAgICAgICAgcmVjb25uZWN0IHRoZW0gdG8gdGhlIG5ldyBjb25uZWN0aW9uLCBpZiBhbnkuCisKKwkqIG1vbm8vREJ1c1R5cGUvQXJyYXkuY3M6ICJDb2RlIiBpcyBhIHN0YXRpYyBtZW1iZXIsIHNvCisJZG9uJ3QgdXNlICJ0aGlzIiB0byByZWZlciB0byBpdC4gIEZpeCBmb3Igc3RyaWN0ZXIgY2hlY2tpbmcKKwlpbiBNb25vIDEuMS40LgorIAorICAgICAgICAqIG1vbm8vREJ1c1R5cGUvT2JqZWN0UGF0aC5jcyAoQXBwZW5kKTogRG9uJ3QgbGVhayB0aGUKKwlvYmplY3QgcGF0aCB0aGF0IHdlIHBhc3MgaW50byB1bm1hbmFnZWQgY29kZS4KKyAKKyAgICAgICAgKiBtb25vL0RCdXNUeXBlL1N0cmluZy5jcyAoQXBwZW5kKTogRG9uJ3QgbGVhayB0aGUgc3RyaW5nCisJdGhhdCB3ZSBwYXNzIGludG8gdW5tYW5nZWQgY29kZS4KKworMjAwNS0wMy0wNyAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKwkqIE5FV1M6IFVwZGF0ZSBmb3IgMC4zMQorCisJKiBjb25maWd1cmUuaW46IFJlbGVhc2UgMC4zMQorCWFkZCBMVF9DVVJSRU5ULCBMVF9SRVZJU0lPTiwgTFRfQUdFIGZvciBlYXN5IHNvbmFtZSBidW1waW5nCisKKwkqIHF0L01ha2VmaWxlLmFtOiBmaXhlZCBidWlsZAorCisJKiBkYnVzL01ha2VmaWxlLmFtOiBzb25hbWUgYnVtcCBmb3IgbGliZGJ1cworCisJKiBnbGliL01ha2VmaWxlLmFtOiBzb25hbWUgYnVtcCBmb3IgbGliZGJ1cy1nbGliCisKKzIwMDUtMDMtMDUgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jOgorCShwc2V1ZG9yYW5kb21fZ2VuZXJhdGVfcmFuZG9tX2J5dGVzX2J1ZmZlcik6IGZpeCB0byBoYXZlIG5vIHJldHVybgorCXZhbHVlCisJKF9kYnVzX2dlbmVyYXRlX3JhbmRvbV9ieXRlc19idWZmZXIpOiBmaXggcmV0dXJuIHZhbHVlCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLXV0aWwuYzogcy9HRVRQV05BTUUvR0VUUFdOQU0vIHNvIGNvbmZpZ3VyZQorCWNoZWNrcyBhY3R1YWxseSB3b3JrLCBmcm9tIFRvbSBQYXJrZXIgPGZkb0B0ZXZwLm5ldD4KKworMjAwNS0wMy0wMSAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogdGVzdC9nbGliL3Rlc3QtZGJ1cy1nbGliLmMgKGxvc2UsIGxvc2VfZ2Vycm9yKTogVXRpbGl0eQorCWZ1bmN0aW9ucyBjb3BpZWQgZnJvbSBkYnVzLWdsaWItdG9vbC5jLgorCShtYWluKTogQ29udmVydCBsb3RzIG9mIGVycm9yIGNvZGUgdG8gdXNlIHRoZW0uCisJQWxzbyBhZGQgc29tZSB0ZXN0aW5nIGZvciBpbnRyb3NwZWN0aW9uIGJpdHMuCisKKzIwMDUtMDMtMDEgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisJCisJKiBkb2MvVE9ETzogUmVtb3ZlIGludHJvc3BlY3Rpb24gc2lnbmF0dXJlIFRPRE8uCisKKzIwMDUtMDItMjcgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwkqIGdsaWIvZGJ1cy1naWRsLmMgKHByb3BlcnR5X2luZm9fZ2V0X3R5cGUsIGFyZ19pbmZvX2dldF90eXBlKToKKwlDaGFuZ2UgcmV0dXJuIHZhbHVlIHRvIGNvbnN0IGNoYXIgKiBpbnN0ZWFkIG9mIGludCBzbyB3ZSBjYW4gZG8KKwlmdWxsIHNpZ25hdHVyZXMuCisJKHN0cnVjdCBQcm9wZXJ0eUluZm8sIHN0cnVjdCBBcmdJbmZvKTogU3RvcmUgY2hhciAqLgorCShwcm9wZXJ0eV9pbmZvX25ldywgYXJnX2luZm9fbmV3KTogVXBkYXRlIHBhcmFtZXRlcnMsIHN0cmR1cC4KKwkocHJvcGVydHlfaW5mb191bnJlZiwgYXJnX2luZm9fdW5yZWYpOiBGcmVlLgorCisJKiBnbGliL2RidXMtZ2lkbC5oOiBVcGRhdGUgcHJvdG90eXBlcy4KKworCSogZ2xpYi9kYnVzLWdwYXJzZXIuYyAoYmFzaWNfdHlwZV9mcm9tX3N0cmluZyk6IERlbGV0ZS4KKwkodmFsaWRhdGVfc2lnbmF0dXJlKTogTmV3IGZ1bmN0aW9uLCBqdXN0IHZhbGlkYXRlcyBzaWduYXR1cmUgYW5kCisJc2V0cyBHRXJyb3IuCisJKHBhcnNlX3Byb3BlcnR5LCBwYXJzZV9hcmcpOiBJbnZva2UgdmFsaWRhdGVfc2lnbmF0dXJlLiAgU3RvcmUKKwlzaWduYXR1cmUgaW5zdGVhZCBvZiBqdXN0IHR5cGUgY29kZS4KKworCSogZ2xpYi9kYnVzLWd2YWx1ZS5jIChiYXNlX3R5cGVfZnJvbV9zaWduYXR1cmUpOiBOZXcgdXRpbGl0eQorCWZ1bmN0aW9uIHRvIHJldHVybiBhIHByaW1hcnkgdHlwZSBmb3IgYSBzaWduYXR1cmUsIGRyb3BwaW5nCisJaW5mb3JtYXRpb24gYWJvdXQgdHlwZXMgaW4gY29udGFpbmVyIHR5cGVzLgorCShkYnVzX2d2YWx1ZV9nZW5tYXJzaGFsX25hbWVfZnJvbV90eXBlKQorCShkYnVzX2d2YWx1ZV9iaW5kaW5nX3R5cGVfZnJvbV90eXBlKQorCShkYnVzX2d2YWx1ZV9jdHlwZV9mcm9tX3R5cGUpOiBVcGRhdGUgdG8gdGFrZSBmdWxsIHNpZ25hdHVyZQorCSBpbnN0ZWFkIG9mIHR5cGUgY29kZS4KKwkoZGJ1c19ndHlwZV90b19kYnVzX3R5cGUpOiBNb3ZlZCBoZXJlIGZyb20gZ2xpYi9kYnVzLWdvYmplY3QuYy4KKworCSogZ2xpYi9kYnVzLWd2YWx1ZS5oOiBVcGRhdGUgcHJvdG90eXBlcyBmb3IgYWJvdmUuCisKKwkqIGdsaWIvZGJ1cy1nb2JqZWN0LmMgKGd0eXBlX3RvX2RidXNfdHlwZSk6IE1vdmVkIHRvCisJZ2xpYi9kYnVzLWd2YWx1ZS5jIGFzIGRidXNfZ3R5cGVfdG9fZGJ1c190eXBlLgorCShpbnRyb3NwZWN0X3Byb3BlcnRpZXMsIGludHJvc3BlY3Rfc2lnbmFscywgd3JpdGVfaW50ZXJmYWNlKToKKwlVcGRhdGUgdG8gaGFuZGxlIHNpZ25hdHVyZXMsIGFuZCByZW1vdmUgdXNhZ2Ugb2YKKwlfZGJ1c19ndXRpbHNfdHlwZV90b19zdHJpbmcuCisJKGhhbmRsZV9pbnRyb3NwZWN0KTogUHJpbnQgb3V0IHR5cGUgY29kZXMgaW5zdGVhZCBvZiBlLmcuICJzdHJpbmciCisJaW4gaGFyZGNvZGVkIGludHJvc3BlY3Rpb24gWE1MOyBhbHNvIHVzZSB4X0FTX1NUUklORyBjb25zdGFudHMKKwlpbnN0ZWFkIG9mIGhhcmRjb2RpbmcgaW4gc3RyaW5nLgorCisJKiBnbGliL2RidXMtZ2xpYi10b29sLmMgKHByZXR0eV9wcmludCk6IEhhbmRsZSBzaWduYXR1cmUgY2hhbmdlCisJdG8gc3RyaW5nLiAgUmVtb3ZlIHVzYWdlIG9mIF9kYnVzX2d1dGlsc190eXBlX3RvX3N0cmluZy4KKworCSogZ2xpYi9kYnVzLWd1dGlscy5jIChfZGJ1c19ndXRpbHNfdHlwZV90b19zdHJpbmcpOiBEZWxldGUuCisKKwkqIGdsaWIvZGJ1cy1ndXRpbHMuaCAoX2RidXNfZ3V0aWxzX3R5cGVfdG9fc3RyaW5nKTogVXBkYXRlIGZvcgorCWRlbGV0aW9uLgorCQorCSogZ2xpYi9kYnVzLWJpbmRpbmctdG9vbC1nbGliLmMgKGNvbXB1dGVfbWFyc2hhbGxlcikKKwkoY29tcHV0ZV9tYXJzaGFsbGVyX25hbWUsIGdlbmVyYXRlX2dsdWUpOiBIYW5kbGUgc2lnbmF0dXJlIGNoYW5nZQorCXRvIHN0cmluZy4KKwkod3JpdGVfZm9ybWFsX3BhcmFtZXRlcnMsIHdyaXRlX2FyZ3NfZm9yX2RpcmVjdGlvbik6IERpdHRvLCBhbmQKKwlyZW1vdmUgRklYTUUuCisKKwkqIHRvb2xzL2RidXMtdHJlZS12aWV3LmMgKHR5cGVfdG9fc3RyaW5nKTogRGVsZXRlLgorCShpbmZvX3NldF9mdW5jX3RleHQpOiBVcGRhdGUgdG8gcHJpbnQgZnVsbCBzaWduYXR1cmVzLgorCisJKiB0ZXN0L2dsaWIvdGVzdC1zZXJ2aWNlLWdsaWIueG1sOiBDaGFuZ2UgdHlwZXMgdG8gbmV3CisJaW50cm9zcGVjdGlvbiBmb3JtYXQuCisKKzIwMDUtMDItMjYgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkb2MvVE9ETzogcmVtb3ZlIHRoZSAiZ3VpZCIgaXRlbQorCisJKiB0ZXN0L2dsaWIvdGVzdC1wcm9maWxlLmMgKG5vX2J1c190aHJlYWRfZnVuYyk6IHVzZSBvcGVuX3ByaXZhdGUKKwkod2l0aF9idXNfdGhyZWFkX2Z1bmMpOiB1c2Ugb3Blbl9wcml2YXRlCisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMgKGRidXNfY29ubmVjdGlvbl9vcGVuX3ByaXZhdGUpOiBuZXcKKwlmdW5jdGlvbiB0aGF0IHdvcmtzIGxpa2UgdGhlIG9sZCBkYnVzX2Nvbm5lY3Rpb25fb3BlbigpCisJKGRidXNfY29ubmVjdGlvbl9vcGVuKTogbm93IHJldHVybnMgYW4gZXhpc3RpbmcgY29ubmVjdGlvbiBpZgorCXBvc3NpYmxlCisKKwkqIGRidXMvZGJ1cy1zZXJ2ZXItdW5peC5jIChoYW5kbGVfbmV3X2NsaWVudF9mZF9hbmRfdW5sb2NrKTogcGFzcworCXRocm91Z2ggdGhlIEdVSUQgdG8gdGhlIHRyYW5zcG9ydAorCisJKiBkYnVzL2RidXMtc2VydmVyLmMgKF9kYnVzX3NlcnZlcl9pbml0X2Jhc2UpOiBrZWVwIGFyb3VuZCB0aGUKKwlHVUlEIGluIGhleC1lbmNvZGVkIGZvcm0uCisKKwkqIGRidXMvZGJ1cy1zZXJ2ZXItZGVidWctcGlwZS5jIChfZGJ1c190cmFuc3BvcnRfZGVidWdfcGlwZV9uZXcpOgorCXBhc3MgR1VJRCBhcmd1bWVudCBpbiB0byB0aGUgdHJhbnNwb3J0CisKKwkqIGRidXMvZGJ1cy10cmFuc3BvcnQtdW5peC5jIChfZGJ1c190cmFuc3BvcnRfbmV3X2Zvcl9mZCk6IGFkZAorCWd1aWQgYXJndW1lbnQKKworCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC5jIChfZGJ1c190cmFuc3BvcnRfaW5pdF9iYXNlKTogYWRkIGd1aWQgYXJndW1lbnQKKworCSogZGJ1cy9kYnVzLWF1dGguYyAoX2RidXNfYXV0aF9zZXJ2ZXJfbmV3KTogYWRkIGd1aWQgYXJndW1lbnQKKworMjAwNS0wMi0yNSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRvYy9kYnVzLXNwZWNpZmljYXRpb24ueG1sOiBkb2N1bWVudCB0aGUgR1VJRCB0aGluZworCisJKiBkYnVzL2RidXMtc2VydmVyLmMgKF9kYnVzX3NlcnZlcl9pbml0X2Jhc2UpOiBpbml0aWFsaXplIGEKKwlnbG9iYWxseSB1bmlxdWUgSUQgZm9yIHRoZSBzZXJ2ZXIsIGFuZCBwdXQgYSAiZ3VpZD1oZXhlbmNvZGVkIgorCWZpZWxkIGluIHRoZSBhZGRyZXNzCisKKwkqIGRidXMvZGJ1cy1idXMuYzogZml4IG1pc3NpbmcgI2luY2x1ZGUgb2YgZGJ1cy10aHJlYWRzLWludGVybmFsLmgKKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYzogZGl0dG8KKworCSogZGJ1cy9kYnVzLWRhdGFzbG90LmM6IGRpdHRvCisKKwkqIGRidXMvZGJ1cy1saXN0LmM6IGRpdHRvCisKKwkqIGRidXMvZGJ1cy1pbnRlcm5hbHMuaDogd2FpdCwganVzdCBpbmNsdWRlCisJZGJ1cy10aHJlYWRzLWludGVybmFsLmggaGVyZQorCQorCSogZGJ1cy9kYnVzLXN0cmluZy5jIChfZGJ1c19zdHJpbmdfY29weV90b19idWZmZXIpOiBtb3ZlIGJhY2sgZm9yCisJdXNlIGluIG1haW4gbGlicmFyeQorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jIChfZGJ1c19nZW5lcmF0ZV9yYW5kb21fYnl0ZXNfYnVmZmVyKTogbmV3IGZ1bmN0aW9uCisKKzIwMDUtMDItMjQgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwkqIHRlc3QvZ2xpYi9NYWtlZmlsZS5hbSAoRVhUUkFfRElTVCk6IEFkZCB0ZXN0LXNlcnZpY2UtZ2xpYi54bWwKKworMjAwNS0wMi0yNCAgSm9obiAoSjUpIFBhbG1pZWlyICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogZ2xpYi9NYWtlZmlsZS5hbTogYWRkZWQgZGJ1cy1nb2JqZWN0LmggdG8gc291cmNlcyBsaXN0CisJc28gZGlzdGNoZWNrIGRvZXNuJ3QgZmFpbAorCQorMjAwNS0wMi0yNCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1zZXJ2ZXIuYywgZGJ1cy9kYnVzLXNlcnZlci11bml4LmM6IGNoYW5nZSBzZW1hbnRpY3Mgc28KKwl5b3UgbXVzdCBkaXNjb25uZWN0IGJlZm9yZSB1bnJlZiwgc2luY2UgbG9ja2luZyBhbmQgb3RoZXIgdGhpbmdzCisJYXJlIHNjcmV3ZWQgdXAgb3RoZXJ3aXNlLiBGaXggYXNzb3J0ZWQgb3RoZXIgbG9ja2luZyBzdHVmZi4KKworCSogZGJ1cy9kYnVzLXNpZ25hdHVyZS5jIChkYnVzX3NpZ25hdHVyZV9pdGVyX2dldF9lbGVtZW50X3R5cGUpOgorCWZpeCBjb21waWxhdGlvbgorCisJKiBkYnVzL2RidXMtdGhyZWFkcy1pbnRlcm5hbC5oOiBtb3ZlIHRoZSBtdXRleC9jb25kdmFyIHdyYXBwZXJzCisJaW50byBhIHByaXZhdGUgaGVhZGVyIGFuZCBkb24ndCBleHBvcnQgZnJvbSB0aGUgbGlicmFyeQorCisJKiB0aHJvdWdob3V0IC0gY2FsbCBfZGJ1c190aHJlYWRfc3R1ZmYgdnMuIGRidXNfdGhyZWFkX3N0dWZmCisKKzIwMDUtMDItMjQgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisJCisJKiBkYnVzL2RidXMtc2lnbmF0dXJlLmM6IE5ldyBmaWxlOyBpbXBsZW1lbnRzIHZhcmlvdXMgZnVuY3Rpb25zCisJcmVsYXRlZCB0byB0eXBlIHNpZ25hdHVyZXMuICBJbmNsdWRlcyBhbiBpbnRlcmF0b3IgZm9yIHBhcnNpbmcsCisJdmFsaWRhdGlvbiBmdW5jdGlvbnMuCisJKGRidXNfdHlwZV9pc19iYXNpYyk6IE1vdmVkIGhlcmUgZnJvbQorCWRidXMtbWFyc2hhbC1iYXNpYy5jOl9kYnVzX3R5cGVfaXNfYmFzaWMuCisJKGRidXNfdHlwZV9pc19jb250YWluZXIpOiBNb3ZlZCBoZXJlIGZyb20KKwlkYnVzLW1hcnNoYWwtYmFzaWMuYzpfZGJ1c190eXBlX2lzX2NvbnRhaW5lci4KKworCUFsbCBjYWxsZXJzIG9mIF9kYnVzX3R5cGVfaXNfY29udGFpbmVyIGFuZCBfZGJ1c190eXBlX2lzX2Jhc2ljCisJdXBkYXRlZCwgYW5kIGluY2x1ZGUgZGJ1cy1zaWduYXR1cmUuaC4KKworCSogZGJ1cy9kYnVzLXNpZ25hdHVyZS5oOiBOZXcgZmlsZTsgcHJvdG90eXBlcyBmb3IgdGhlIGFib3ZlLgorCisJKiBkYnVzL01ha2VmaWxlLmFtIChEQlVTX0xJQl9TT1VSQ0VTKTogQWRkIGRidXMtc2lnbmF0dXJlLmMsCisJZGJ1cy1zaWduYXR1cmUuaC4KKworCSogZGJ1cy9kYnVzLW1hcnNoYWwtYmFzaWMuYyAobWFwX3R5cGVfY2hhcl90b190eXBlKTogTmV3IHV0aWxpdHkKKwlmdW5jdGlvbiBmYWN0b3JlZCBvdXQgb2YgX2RidXNfZmlyc3RfdHlwZV9pbl9zaWduYXR1cmUuCisJKF9kYnVzX2ZpcnN0X3R5cGVfaW5fc2lnbmF0dXJlX2Nfc3RyKTogTmV3IGZ1bmN0aW9uOyByZXR1cm5zIGZpcnN0CisJdHlwZSBjb2RlIGZvciBhIHR5cGUgc2lnbmF0dXJlIGNoYXJhY3Rlci4KKworCSogZGJ1cy9kYnVzLW1hcnNoYWwtYmFzaWMuaDogUHJvdG90eXBlIF9kYnVzX2ZpcnN0X3R5cGVfaW5fc2lnbmF0dXJlX2Nfc3RyLAorCWhhbmRsZSBmdW5jdGlvbiBtb3Zlcy4KKworCSogZGJ1cy9kYnVzLW1hcnNoYWwtcmVjdXJzaXZlLmg6IEV4cG9ydCBfZGJ1c190eXBlX3NpZ25hdHVyZV9uZXh0LgorCisJKiBkYnVzL2RidXMtbWFyc2hhbC1yZWN1cnNpdmUuYyAoX2RidXNfdHlwZV9zaWduYXR1cmVfbmV4dCk6IE5ldworCWZ1bmN0aW9uOyBza2lwcyB0byBuZXh0IGNvbXBsZXRlIHR5cGUgaW4gdHlwZSBzaWduYXR1cmUuCisJSW1wbGVtZW50ZWQgdXNpbmcgcHJldmlvdXMgc2tpcF9vbmVfY29tcGxldGVfdHlwZS4gIE5vdworCXNraXBfb25lX2NvbXBsZXRlX3R5cGUganVzdCBkZWxlZ2F0ZXMgdG8KKwlfZGJ1c190eXBlX3NpZ25hdHVyZV9uZXh0LgorCisJKiBkYnVzL2RidXMtbWFyc2hhbC1iYXNpYy5jIChfZGJ1c190eXBlX2lzX2Jhc2ljKTogTW92ZWQKKwl0byBkYnVzLXNpZ25hdHVyZS5jCisJKF9kYnVzX3R5cGVfaXNfY29udGFpbmVyKTogRGl0dG8uCisKKwkqIGRvYy9kYnVzLXNwZWNpZmljYXRpb24ueG1sOiBVcGRhdGUgaW50cm9zcGVjdGlvbiBzYW1wbGUgdG8KKwl1c2UgcmVhbCB0eXBlIHNpZ25hdHVyZXMuCisKKwkqIGRidXMvZGJ1cy10ZXN0Lmg6IFByb3RvdHlwZSBzaWduYXR1cmUgdGVzdC4KKworCSogZGJ1cy9kYnVzLXRlc3QuYyAoZGJ1c19pbnRlcm5hbF9kb19ub3RfdXNlX3J1bl90ZXN0cyk6IFJ1bgorCXNpZ25hdHVyZSB0ZXN0cy4KKworCSogZGJ1cy9kYnVzLXByb3RvY29sLmggKERCVVNfRVJST1JfSU5WQUxJRF9TSUdOQVRVUkUpOiBOZXcgZXJyb3IuCisKKzIwMDUtMDItMjMgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIHB5dGhvbi9kYnVzX2JpbmRpbmdzLnB5eC5pbiAoUGVuZGluZ0NhbGw6OmdldF9yZXBseSk6CisJcy9kYnVzX3BlbmRpbmdfY2FsbF9nZXRfcmVwbHkvZGJ1c19wZW5kaW5nX2NhbGxfc3RlYWxfcmVwbHkKKworMjAwNS0wMi0yMSAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogZGJ1cy9kYnVzLXRlc3QtbWFpbi5jIChtYWluKTogVGFrZSBvcHRpb25hbCBzcGVjaWZpYyB0ZXN0CisJYXJndW1lbnQuCisKKwkqIGRidXMvZGJ1cy10ZXN0LmMgKHJ1bl90ZXN0KTogTmV3IGZ1bmN0aW9uLCBydW5zIGEgdGVzdCBmdW5jdGlvbgorCXdpdGggbm8gZGF0YSBkaXJlY3RvcnkuCisJKHJ1bl9kYXRhX3Rlc3QpOiBMaWtlIGFib3ZlLCBidXQgdGFrZXMgZGF0YSBkaXJlY3RvcnkuCisJKGRidXNfaW50ZXJuYWxfZG9fbm90X3VzZV9ydW5fdGVzdHMpOiBUYWtlCisJc3BlY2lmaWMgdGVzdCBhcmd1bWVudC4gIFJlcGxhY2UgbG90cyBvZiBjdXQgbicgcGFzdGUgY29kZQorCXdpdGggcnVuX3Rlc3QgYW5kIHJ1bl9kYXRhX3Rlc3QuCisKKwkqIGRidXMvZGJ1cy10ZXN0Lmg6IFVwZGF0ZSBwcm90b3R5cGUgZm9yCisJZGJ1c19pbnRlcm5hbF9kb19ub3RfdXNlX3J1bl90ZXN0cy4KKworMjAwNS0wMi0yMCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKyAgICAgICAgRml4IGJ1Z3MgcmVwb3J0ZWQgYnkgRGFuaWVsIFAuIEJlcnJhbmdlCisJCisJKiBkYnVzL2RidXMtc2VydmVyLmMgKF9kYnVzX3NlcnZlcl91bnJlZl91bmxvY2tlZCk6IG5ldyBmdW5jdGlvbgorCShwcm90ZWN0ZWRfY2hhbmdlX3dhdGNoKTogbmV3IGZ1bmN0aW9uCisJKF9kYnVzX3NlcnZlcl90b2dnbGVfd2F0Y2gsIF9kYnVzX3NlcnZlcl9yZW1vdmVfd2F0Y2gpCisJKF9kYnVzX3NlcnZlcl9hZGRfd2F0Y2gpOiBjaGFuZ2UgdG8gd29yayBsaWtlIHRoZQorCWRidXMtY29ubmVjdGlvbi5jIGVxdWl2YWxlbnRzOyBsaWtlIHRob3NlLCBwcm9iYWJseSBraW5kIG9mCisJYnVzdGVkLCBidXQgc2hvdWxkIGF0IGxlYXN0IG1vc3RseSB3b3JrIGZvciBub3cKKwkoZGJ1c19zZXJ2ZXJfZGlzY29ubmVjdCk6IGRyb3AgdGhlIGxvY2sgaWYgd2Ugd2VyZSBhbHJlYWR5CisJZGlzY29ubmVjdGVkLCBwYXRjaCBmcm9tIERhbmllbCBQLiBCZXJyYW5nZQorCisJKiBkYnVzL2RidXMtc2VydmVyLmMgKF9kYnVzX3NlcnZlcl90b2dnbGVfdGltZW91dCkgCisJKF9kYnVzX3NlcnZlcl9yZW1vdmVfdGltZW91dCwgX2RidXNfc2VydmVyX2FkZF90aW1lb3V0KTogYWxsIHRoZQorCXNhbWUgc3R1ZmYKKworCSogZG9jL1RPRE86IHRvZG8gYWJvdXQgdW5zY3Jld2luZyB0aGlzIG1lc3MKKworMjAwNS0wMi0xOSAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogZ2xpYi9kYnVzLWJpbmRpbmctdG9vbC1nbGliLmMKKwkoZGJ1c19iaW5kaW5nX3Rvb2xfb3V0cHV0X2dsaWJfc2VydmVyKTogRml4IGlvY2hhbm5lbCByZWZjb3VudGluZy4KKworCSogZ2xpYi9kYnVzLWdsaWItdG9vbC5jOiBJbmNsdWRlIGRidXMtZ2xpYi10b29sLmgsIGFzIHdlbGwKKwlhcyBlcnJuby5oIGFuZCBzeXMvc3RhdC5oLgorCShsb3NlKTogTmV3IGZ1bmN0aW9uLCBwcmludHMgZXJyb3Igd2l0aAorCW5ld2xpbmUgYW5kIGV4aXRzLgorCShsb3NlX2dlcnJvcik6IFNpbWlsYXIsIGJ1dCB0YWtlcyBHRXJyb3IgZm9yIG1lc3NhZ2UuCisJKG1haW4pOiBBZGQgLS1vdXRwdXQgYXJndW1lbnQgdG8gc3BlY2lmeSBvdXRwdXQgZmlsZSB0byB3cml0ZSB0bywKKwlpbnN0ZWFkIG9mIGFsd2F5cyBwcmludGluZyB0byBzdGRvdXQuICBJbiB0aGlzIG1vZGUsIGRldGVybWluZQorCXRpbWVzdGFtcHMgb24gc291cmNlIGZpbGVzIHRvIHNlZSB3aGV0aGVyIGFueSBhcmUgbmV3ZXIgdGhhbiB0aGUKKwl0YXJnZXQgZmlsZS4gIElmIG5vdCwgZXhpdC4gIEFsc28gY29udmVydCBhIG51bWJlciBvZiBlcnJvcgorCW1lc3NhZ2VzIHRvIHVzZSBsb3NlIChzaW5jZSBpdCdzIHNob3J0ZXIpLCBhbmQgc3dpdGNoIHRvIHVzaW5nCisJZ19pb19jaGFubmVsX3NodXRkb3duLgorCisyMDA1LTAyLTE5ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZ2xpYi9kYnVzLWdvYmplY3QuYworCShfZGJ1c19nbGliX21hcnNoYWxfZGJ1c19tZXNzYWdlX3RvX2d2YWx1ZV9hcnJheSk6IGFkZCBkb2NzCisKKwkqIGdsaWIvZGJ1cy1nbGliLmM6IGZpeCBkb3h5Z2VuIHdhcm5pbmdzCisKKwkqIGdsaWIvZGJ1cy1ncGFyc2VyLmMgKHBhcnNlX2Fubm90YXRpb24pOiBlcnJvciBpZiBhbiBhbm5vdGF0aW9uCisJaXMgZm91bmQgb24gYW4gPGFyZz4KKworMjAwNS0wMi0xNyAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogZ2xpYi9kYnVzLWdvYmplY3QuaDogRG9uJ3QgZXhwb3J0CisJX2RidXNfZ2xpYl9tYXJzaGFsX2RidXNfbWVzc2FnZV90b19ndmFsdWVfYXJyYXkuCisJCisJKiBnbGliL2RidXMtZ29iamVjdC5jIChfZGJ1c19nbGliX21hcnNoYWxfZGJ1c19tZXNzYWdlX3RvX2d2YWx1ZV9hcnJheSk6IERvIHJlbmFtZS4KKwkoaW52b2tlX29iamVjdF9tZXRob2QpOiBIYW5kbGUgaXQuCisKKwkqIGdsaWIvZGJ1cy1ncHJveHkuYyAobWFyc2hhbF9kYnVzX21lc3NhZ2VfdG9fZ19tYXJzaGFsbGVyKToKKwlIYW5kbGUgcmVuYW1lLgorCQorMjAwNS0wMi0xNyAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogYnVzLy5jdnNpZ25vcmUsIGRvYy8uY3ZzaWdub3JlCisJKiB0ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy8uY3ZzaWdub3JlLCB0ZXN0L2dsaWIvLmN2c2lnbm9yZToKKwlVcGRhdGUuCisKKzIwMDUtMDItMTcgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisJCisJKiBkYnVzL2RidXMtcHJvdG9jb2wuaCAoREJVU19TRVJWSUNFX09SR19GUkVFREVTS1RPUF9EQlVTKToKKwlSZW5hbWUgdG8gREJVU19TRVJWSUNFX0RCVVMuCisJKERCVVNfUEFUSF9PUkdfRlJFRURFU0tUT1BfREJVUyk6IFJlbmFtZSB0byBEQlVTX1BBVEhfREJVUy4KKwkoREJVU19QQVRIX09SR19GUkVFREVTS1RPUF9MT0NBTCk6IFJlbmFtZSB0byBEQlVTX1BBVEhfTE9DQUwuCisJQ2hhbmdlIHRoZSB2YWx1ZSBmcm9tICJvcmcuZnJlZWRlc2t0b3AuTG9jYWwiCisJdG8gIm9yZy5mcmVlZGVza3RvcC5EQnVzLkxvY2FsIi4KKwkoREJVU19JTlRFUkZBQ0VfT1JHX0ZSRUVERVNLVE9QX0RCVVMpOiBSZW5hbWUgdG8gREJVU19JTlRFUkZBQ0VfREJVUy4KKwkoREJVU19JTlRFUkZBQ0VfT1JHX0ZSRUVERVNLVE9QX0lOVFJPU1BFQ1RBQkxFKTogUmVuYW1lIHRvCisJREJVU19JTlRFUkZBQ0VfSU5UUk9TUEVDVEFCTEUuCisJQ2hhbmdlIHRoZSB2YWx1ZSBmcm9tICJvcmcuZnJlZWRlc2t0b3AuSW50cm9zcGVjdGFibGUiCisJdG8gIm9yZy5mcmVlZGVza3RvcC5EQnVzLkludHJvc3BlY3RhYmxlIi4KKwkoREJVU19JTlRFUkZBQ0VfT1JHX0ZSRUVERVNLVE9QX1BST1BFUlRJRVMpOiBSZW5hbWUgdG8KKwlEQlVTX0lOVEVSRkFDRV9QUk9QRVJUSUVTLgorCUNoYW5nZSB0aGUgdmFsdWUgZnJvbSAib3JnLmZyZWVkZXNrdG9wLlByb3BlcnRpZXMiCisJdG8gIm9yZy5mcmVlZGVza3RvcC5EQnVzLlByb3BlcnRpZXMiLgorCShEQlVTX0lOVEVSRkFDRV9PUkdfRlJFRURFU0tUT1BfUEVFUik6IFJlbmFtZSB0bworCURCVVNfSU5URVJGQUNFX1BFRVIuCisJQ2hhbmdlIHRoZSB2YWx1ZSBmcm9tICJvcmcuZnJlZWRlc2t0b3AuUGVlciIKKwl0byAib3JnLmZyZWVkZXNrdG9wLkRCdXMuUGVlciIuCisJKERCVVNfSU5URVJGQUNFX09SR19GUkVFREVTS1RPUF9MT0NBTCk6IAorCURCVVNfSU5URVJGQUNFX0xPQ0FMLgorCUNoYW5nZSB0aGUgdmFsdWUgZnJvbSAib3JnLmZyZWVkZXNrdG9wLkxvY2FsIgorCXRvICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5Mb2NhbCIuCisKKwlBbGwgb3RoZXIgdXNlcnMgb2YgdGhvc2UgY29uc3RhbnRzIGhhdmUgYmVlbiBjaGFuZ2VkLgorCisJKiBidXMvZHJpdmVyLmMgKGJ1c19kcml2ZXJfaGFuZGxlX2ludHJvc3BlY3QpOiBVc2UgY29uc3RhbnRzLgorCisJKiBnbGliL2RidXMtZ29iamVjdC5jIChoYW5kbGVfaW50cm9zcGVjdCk6IFVzZSBjb25zdGFudHMuCisKKwkqIGRvYy9kYnVzLWZhcS54bWwsIGRvYy9kYnVzLXNwZWNpZmljYXRpb24ueG1sOiBVcGRhdGUgZm9yIHJlbmFtZS4KKworMjAwNS0wMi0xNyAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogZ2xpYi9kYnVzLWdwYXJzZXIuYyAoc3RydWN0IFBhcnNlcik6IEFkZCBpbl9hbm5vdGF0aW9uIGJvb2xlYW4uCisJKHBhcnNlX25vZGUsIHBhcnNlX2ludGVyZmFjZSwgcGFyc2VfbWV0aG9kLCBwYXJzZV9zaWduYWwpCisJKHBhcnNlX3Byb3BlcnR5LCBwYXJzZV9hbm5vdGF0aW9uKTogTG9zZSBpZiB3ZSdyZSBjdXJyZW50bHkgaW4gYW4KKwlhbm5vdGF0aW9uLgorCShwYXJzZV9hbm5vdGF0aW9uKTogTmV3IGZ1bmN0aW9uLgorCShwYXJzZXJfc3RhcnRfZWxlbWVudCwgcGFyc2VyX2VuZF9lbGVtZW50KTogSGFuZGxlIGFubm90YXRpb24uCisJKHBhcnNlX21ldGhvZCwgcGFyc2VfaW50ZXJmYWNlKTogUmVtb3ZlIHN1cHBvcnQgZm9yIGNfbmFtZSBhdHRyaWJ1dGUsCisJc3dpdGNoIHRvIGFubm90YXRpb25zLgorCisJKiBnbGliL2RidXMtZ2lkbC5oIChpbnRlcmZhY2VfaW5mb19nZXRfYmluZGluZ19uYW1lcykKKwkobWV0aG9kX2luZm9fZ2V0X2JpbmRpbmdfbmFtZXMpCisJKGludGVyZmFjZV9pbmZvX2dldF9iaW5kaW5nX25hbWUsIG1ldGhvZF9pbmZvX2dldF9iaW5kaW5nX25hbWUpCisJKGludGVyZmFjZV9pbmZvX3NldF9iaW5kaW5nX25hbWUsIG1ldGhvZF9pbmZvX3NldF9iaW5kaW5nX25hbWUpOgorCVJlbW92ZS4KKwkoaW50ZXJmYWNlX2luZm9fZ2V0X2Fubm90YXRpb25zLCBtZXRob2RfaW5mb19nZXRfYW5ub3RhdGlvbnMpCisJKGludGVyZmFjZV9pbmZvX2dldF9hbm5vdGF0aW9uLCBtZXRob2RfaW5mb19nZXRfYW5ub3RhdGlvbikKKwkoaW50ZXJmYWNlX2luZm9fYWRkX2Fubm90YXRpb24sIG1ldGhvZF9pbmZvX2FkZF9hbm5vdGF0aW9uKToKKwlQcm90b3R5cGUuCisKKwkqIGdsaWIvZGJ1cy1naWRsLmMgKHN0cnVjdCBJbnRlcmZhY2VJbmZvKTogU3Vic3RpdHV0ZSAiYW5ub3RhdGlvbnMiCisJZm9yICJiaW5kaW5ncyIuCisJKHN0cnVjdCBNZXRob2RJbmZvKTogRGl0dG8uCisJU3RyYWlnaHRmb3dhcmQgY29udmVyc2lvbiBvZiBiaW5kaW5nIG1ldGhvZHMgaW50byBhbm5vdGF0aW9uIG1ldGhvZHMKKwlhcyBwcm90b3R5cGVkLgorCisJKiBnbGliL2RidXMtZ2xpYi10b29sLmMgKHByZXR0eV9wcmludCk6IFByaW50IGFubm90YXRpb25zLgorCisJKiBnbGliL2RidXMtYmluZGluZy10b29sLWdsaWIuaCAoREJVU19HTElCX0FOTk9UQVRJT05fQ19TWU1CT0wpOiBEZWZpbmUuCisKKwkqIGdsaWIvZGJ1cy1iaW5kaW5nLXRvb2wtZ2xpYi5jIChnYXRoZXJfbWFyc2hhbGxlcnMsIGdlbmVyYXRlX2dsdWUpOgorCVVzZSBuZXcgYW5ub3RhdGlvbiBBUEkuCisKKwkqIGRvYy9pbnRyb3NwZWN0LmR0ZDogRml4IGEgbnVtYmVyIG9mIERURCBzeW50YXggZXJyb3JzLiAgQWRkCisJYW5ub3RhdGlvbiBlbGVtZW50LgorCQorCSogZG9jL2RidXMtc3BlY2lmaWNhdGlvbi54bWw6IERpc2N1c3MgaW50cm9zcGVjdGlvbiBhbm5vdGF0aW9ucywKKwlpbmNsdWRlIGxpc3Qgb2Ygd2VsbC1rbm93biBhbm5vdGF0aW9ucy4KKworCSogdGVzdC9nbGliL3Rlc3Qtc2VydmljZS1nbGliLnhtbDogTWFrZSB2YWxpZGF0ZSBhZ2FpbnN0IG5ldyBEVEQuCisKKzIwMDUtMDItMTcgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwlUaGlzIHBhdGNoIGlzIGJhc2VkIG9uIGluaXRpYWwgd29yayBmcm9tCisJUGF1bCBLdWxpbmlld2ljeiA8a3VsaW5pZXdAcHVyZHVlLmVkdT4uCisKKwkqIGdsaWIvZGJ1cy1ndmFsdWUuYyAoZGJ1c19ndmFsdWVfaW5pdCk6IE5ldyBmdW5jdGlvbjsgbW92ZQorCWluaXRpYWxpemF0aW9uIG9mIEdWYWx1ZSBmcm9tIGRidXMgdHlwZSB0byBoZXJlLgorCShkYnVzX2d2YWx1ZV9nZW5tYXJzaGFsX25hbWVfZnJvbV90eXBlKTogTmV3IGZ1bmN0aW9uOyBnZW5lcmF0ZXMgYSBzdHJpbmcKKwlmb3IgdGhlICJnbGliLWdlbm1hcnNoYWwiIHByb2dyYW0gZnJvbSBhIERCdXMgdHlwZS4KKwkoZGJ1c19ndmFsdWVfYmluZGluZ190eXBlX2Zyb21fdHlwZSk6IE5ldyBmdW5jdGlvbjsgdHVybnMgYSBEQnVzIHR5cGUKKwlpbnRvIHRoZSBDIG5hbWUgZm9yIGl0IHdlIHVzZSBpbiB0aGUgZ2xpYiBiaW5kaW5ncy4KKwkoZGJ1c19ndmFsdWVfY3R5cGVfZnJvbV90eXBlKTogTmV3IGZ1bmN0aW9uOyBtYXBzIGEgREJ1cyB0eXBlIGludG8gYQorCWdsaWIgQyB0eXBlIChub3QgR1ZhbHVlKS4KKwkoZGJ1c19ndmFsdWVfZGVtYXJzaGFsKTogaW52b2tlIGRidXNfZ3ZhbHVlX2luaXQuCisKKwkqIGdsaWIvZGJ1cy1ndXRpbHMuYyAoX2RidXNfZ3V0aWxzX3dpbmNhcHNfdG9fdXNjb3JlKTogTW92ZWQgaGVyZQorCWZyb20gZGJ1cy1nb2JqZWN0LmMuCisKKwkqIGdsaWIvZGJ1cy1ndXRpbHMuaDogUHJvdG90eXBlIGl0LgorCisJKiBnbGliL2RidXMtZ3Byb3h5LmM6IEluY2x1ZGUgbmV3IGRidXMtZ29iamVjdC5oLgorCShtYXJzaGFsX2RidXNfbWVzc2FnZV90b19nX21hcnNoYWxsZXIpOiBVc2UgbmV3IHNoYXJlZCBmdW5jdGlvbgorCWRidXNfZ2xpYl9tYXJzaGFsX2RidXNfbWVzc2FnZV90b19ndmFsdWVfYXJyYXkuCisKKwkqIGdsaWIvZGJ1cy1ncGFyc2VyLmMgKHBhcnNlX2ludGVyZmFjZSwgcGFyc2VfbWV0aG9kKTogSGFuZGxlIGNfbmFtZSBhdHRyaWJ1dGUuCisJV2lsbCBiZSBjaGFuZ2VkIG9uY2Ugd2UgaGF2ZSBhbm5vdGF0aW9ucy4KKworCSogZ2xpYi9kYnVzLWdvYmplY3QuYzogQ2hhbmdlIGluZm9faGFzaF9tdXRleCBmcm9tIEdTdGF0aWNNdXRleCB0bworCUdTdGF0aWNSV0xvY2suICBDYWxsZXJzIHVwZGF0ZWQuCisJKHdpbmNhcHNfdG9fdXNjb3JlKTogTW92ZSB0byBkYnVzLWd1dGlscy5jLiAgQ2FsbGVycyB1cGRhdGVkLgorCShzdHJpbmdfdGFibGVfbmV4dCk6IE5ldyBmdW5jdGlvbiBmb3IgaXRlcmF0aW5nIG92ZXIgemVyby10ZXJtaW5hdGVkCisJc3RyaW5nIHZhbHVlIGFycmF5LgorCShzdHJpbmdfdGFibGVfbG9va3VwKTogTmV3IGZ1bmN0aW9uOyByZXRyaWV2ZXMgc3BlY2lmaWMgZW50cnkgaW4KKwlhcnJheS4KKwkoZ2V0X21ldGhvZF9kYXRhKTogTmV3IGZ1bmN0aW9uOyBsb29rIHVwIG1ldGhvZCBkYXRhIGluIG9iamVjdCBkYXRhIGNodW5rLgorCShvYmplY3RfZXJyb3JfZG9tYWluX3ByZWZpeF9mcm9tX29iamVjdF9pbmZvKQorCShvYmplY3RfZXJyb3JfY29kZV9mcm9tX29iamVjdF9pbmZvKTogTmV3IGZ1bmN0aW9ucywgYnV0IG5vdCBpbXBsZW1lbnRlZCB5ZXQuCisJKG1ldGhvZF9pbnRlcmZhY2VfZnJvbV9vYmplY3RfaW5mbyk6IE5ldyBmdW5jdGlvbjsgcmV0cmlldmUgaW50ZXJmYWNlIG5hbWUuCisJKG1ldGhvZF9uYW1lX2Zyb21fb2JqZWN0X2luZm8pOiBOZXcgZnVuY3Rpb247IHJldHJpZXZlIG1ldGhvZCBuYW1lLgorCShtZXRob2RfYXJnX2luZm9fZnJvbV9vYmplY3RfaW5mbyk6IE5ldyBmdW5jdGlvbjsgcmV0cmlldmUgYXJndW1lbnQgZGF0YS4KKwkoYXJnX2l0ZXJhdGUpOiBOZXcgZnVuY3Rpb247IGl0ZXJhdGVzIG92ZXIgc2VyaWFsaXplZCBhcmd1bWVudCBkYXRhLgorCShtZXRob2RfZGlyX3NpZ25hdHVyZV9mcm9tX29iamVjdF9pbmZvKTogTmV3IGZ1bmN0aW9uOyByZXR1cm5zIGEKKwlHU3RyaW5nIGhvbGRpbmcgdHlwZSBzaWduYXR1cmUgZm9yIGFyZ3VtZW50cyBmb3IganVzdCBvbmUKKwlkaXJlY3Rpb24gKGlucHV0IG9yIG91dHB1dCkuCisJKG1ldGhvZF9pbnB1dF9zaWduYXR1cmVfZnJvbV9vYmplY3RfaW5mbykKKwkobWV0aG9kX291dHB1dF9zaWduYXR1cmVfZnJvbV9vYmplY3RfaW5mbyk6IE5ldyBmdW5jdGlvbnMuCisJKGRidXNfZ2xpYl9tYXJzaGFsX2RidXNfbWVzc2FnZV90b19ndmFsdWVfYXJyYXkpOiBOZXcgc2hhcmVkIGZ1bmN0aW9uOworCWNvbnZlcnRzIGRidXMgbWVzc2FnZSBhcmd1bWVudHMgaW50byBhIEdWYWx1ZSBhcnJheS4gIFVzZWQgZm9yIGJvdGgKKwlzaWduYWwgaGFuZGxpbmcgYW5kIG1ldGhvZCBpbnZvY2F0aW9uLgorCShzdHJ1Y3QgREJ1c0dsaWJXcml0ZUl0ZXJmYWNlRGF0YSk6IE5ldyB1dGlsaXR5IHN0cnVjdHVyZS4KKwkod3JpdGVfaW50ZXJmYWNlKTogTmV3IGZ1bmN0aW9uOyBnZW5lcmF0ZSBpbnRyb3NwZWN0aW9uIFhNTCBmb3IKKwlhbiBpbnRlcmZhY2UuCisJKGludHJvc3BlY3RfaW50ZXJmYWNlcyk6IE5ldyBmdW5jdGlvbjsgZ2F0aGVycyBhbGwgaW50ZXJmYWNlLT5tZXRob2RzLAorCWdlbmVyYXRlcyBpbnRyb3NwZWN0aW9uIFhNTCBmb3IgdGhlbS4KKwkoaGFuZGxlX2ludHJvc3BlY3QpOiBJbnZva2UgaW50cm9zcGVjdF9pbnRlcmZhY2VzLgorCShnZXRfb2JqZWN0X3Byb3BlcnR5KTogQmUgc3VyZSB0byB6ZXJvLWluaXRhbGl6ZSBzdGFjay1hbGxvY2F0ZWQgR1ZhbHVlLgorCShsb29rdXBfb2JqZWN0X2FuZF9tZXRob2QpOiBOZXcgZnVuY3Rpb247IGV4YW1pbmVzIGFuIGluY29taW5nIG1lc3NhZ2UKKwlhbmQgYXR0ZW1wdHMgdG8gbWF0Y2ggaXQgdXAgKHZpYSBpbnRlcmZhY2UsIG1ldGhvZCBuYW1lLCBhbmQgYXJndW1lbnQKKwlzaWduYXR1cmUpIHdpdGggYSBrbm93biBvYmplY3QgYW5kIG1ldGhvZC4KKwkoZ2Vycm9yX2RvbWFpbmNvZGVfdG9fZGJ1c19lcnJvcl9uYW1lKTogTmV3IGZ1bmN0aW9uOyBjb252ZXJ0cyBhCisJR0Vycm9yIGRvbWFpbiBhbmQgY29kZSBpbnRvIGEgREJ1cyBlcnJvciBuYW1lLiAgTmVlZHMgR0Vycm9yIGRhdGEKKwlhZGRlZCB0byBvYmplY3QgaW50cm9zcGVjdGlvbiB0byB3b3JrIHdlbGwuCisJKGdlcnJvcl90b19kYnVzX2Vycm9yX21lc3NhZ2UpOiBDcmVhdGVzIGEgREJ1c01lc3NhZ2UgZXJyb3IgcmV0dXJuIGZyb20KKwlHRXJyb3IuCisJKGludm9rZV9vYmplY3RfbWV0aG9kKTogTmV3IGZ1bmN0aW9uIHRvIGludm9rZSBhbiBvYmplY3QgbWV0aG9kCisJbG9va2VkIHVwIHZpYSBsb29rdXBfb2JqZWN0X2FuZF9tZXRob2QuICBQYXJzZXMgdGhlIGluY29taW5nCisJbWVzc2FnZSwgdHVybnMgaXQgaW50byBhIEdWYWx1ZSBhcnJheSwgdGhlbiBpbnZva2VzIHRoZSBtYXJzaGFsbGVyCisJc3BlY2lmaWVkIGluIHRoZSBEQnVzR01ldGhvZEluZm8uICBDcmVhdGVzIGEgbmV3IG1lc3NhZ2Ugd2l0aAorCWVpdGhlciByZXR1cm4gdmFsdWVzIG9yIGVycm9yIG1lc3NhZ2UgYXMgYXBwcm9wcmlhdGUuCisJKGdvYmplY3RfbWVzc2FnZV9mdW5jdGlvbik6IEludm9rZSBsb29rdXBfb2JqZWN0X2FuZF9tZXRob2QgYW5kCisJaW52b2tlX29iamVjdF9tZXRob2QuCisKKwkqIGdsaWIvZGJ1cy1nbGliLXRvb2wuYzogSW5jbHVkZSBkYnVzLWJpbmRpbmctdG9vbC1nbGliLmguCisJKGVudW0gREJ1c0JpbmRpbmdPdXRwdXRNb2RlKTogTmV3IGVudW0gZm9yIGJpbmRpbmcgb3V0cHV0IG1vZGVzLgorCShwcmV0dHlfcHJpbnQpOiBQcmludCBiaW5kaW5nIG5hbWVzLgorCShkYnVzX2JpbmRpbmdfdG9vbF9lcnJvcl9xdWFyayk6IEdFcnJvciBiaXRzLgorCSh2ZXJzaW9uKTogRml4IHR5cG8uCisJKG1haW4pOiBDcmVhdGUgR0lPQ2hhbm5lbCBmb3Igb3V0cHV0LiAgUGFyc2UgbmV3IC0tbW9kZSBhcmd1bWVudCwKKwlwb3NzaWJsZSB2YWx1ZXMgYXJlICJwcmV0dHktcHJpbnQiLCAiZ2xpYi1zZXJ2ZXIiLCAiZ2xpYi1jbGllbnQiLgorCVVzZSBtb2RlIHRvIGludm9rZSBhcHByb3ByaWF0ZSBmdW5jdGlvbi4KKwkKKwkqIGdsaWIvZGJ1cy1nb2JqZWN0Lmg6IFByb3RvdHlwZSBkYnVzX2dsaWJfbWFyc2hhbF9kYnVzX21lc3NhZ2VfdG9fZ3ZhbHVlX2FycmF5LgorCisJKiBnbGliL2RidXMtZ2xpYi10b29sLmg6IE5ldyBoZWFkZXIsIGp1c3QgaW5jbHVkZXMgR0Vycm9yIGJpdHMKKwlmb3Igbm93LgorCisJKiBnbGliL2RidXMtZ2lkbC5jIChzdHJ1Y3QgSW50ZXJmYWNlSW5mbyk6IEFkZCBiaW5kaW5ncyBoYXNodGFibGU7CisJbWFwcyBiaW5kaW5nIHN0eWxlIHRvIG5hbWUuCisJKHN0cnVjdCBNZXRob2RJbmZvKTogRGl0dG8uCisJKGdldF9oYXNoX2tleXMsIGdldF9oYXNoX2tleSk6IFV0aWxpdHkgZnVuY3Rpb24sIHJldHVybnMga2V5cyBmb3IKKwlhIEdIYXNoVGFibGUuCisJKGludGVyZmFjZV9pbmZvX25ldywgbWV0aG9kX2luZm9fbmV3KTogSW5pdGlhbGl6ZSBiaW5kaW5ncy4KKwkoaW50ZXJmYWNlX2luZm9fdW5yZWYsIG1ldGhvZF9pbmZvX3VucmVmKTogRGVzdHJveSBiaW5kaW5ncy4KKwkobWV0aG9kX2luZm9fZ2V0X2JpbmRpbmdfbmFtZXMsIG1ldGhvZF9pbmZvX2dldF9iaW5kaW5nX25hbWUpCisJKGludGVyZmFjZV9pbmZvX2dldF9iaW5kaW5nX25hbWVzLCBpbnRlcmZhY2VfaW5mb19nZXRfYmluZGluZ19uYW1lKToKKwlGdW5jdGlvbnMgZm9yIHJldHJpZXZpbmcgYmluZGluZyBuYW1lcy4KKwkobWV0aG9kX2luZm9fc2V0X2JpbmRpbmdfbmFtZSwgaW50ZXJmYWNlX2luZm9fc2V0X2JpbmRpbmdfbmFtZSk6CisJRnVuY3Rpb25zIGZvciBzZXR0aW5nIGJpbmRpbmcgbmFtZXMuCisKKwkqIGdsaWIvZGJ1cy1iaW5kaW5nLXRvb2wtZ2xpYi5oOiBOZXcgZmlsZSwgaGFzIHByb3RvdHlwZXMKKwlmb3IgZ2xpYiBiaW5kaW5nIGdlbmVyYXRpb24uCisKKwkqIGdsaWIvZGJ1cy1iaW5kaW5nLXRvb2wtZ2xpYi5jOiBOZXcgZmlsZSwgaW1wbGVtZW50cyBzZXJ2ZXItc2lkZQorCWFuZCBjbGllbnQtc2lkZSBnbGliIGdsdWUgZ2VuZXJhdGlvbi4KKworCSogZ2xpYi9NYWtlZmlsZS5hbSAoZGJ1c19iaW5kaW5nX3Rvb2xfU09VUkNFUyk6IEFkZAorCWRidXMtYmluZGluZy10b29sLWdsaWIuYywgZGJ1cy1iaW5kaW5nLXRvb2wtZ2xpYi5oLAorCWRidXMtZ2xpYi10b29sLmguCisKKwkqIGRidXMvZGJ1cy1nbGliLmggKHN0cnVjdCBEQnVzR01ldGhvZE1hcnNoYWxsZXIpOiBSZW1vdmUgaW4gZmF2b3IKKwlvZiB1c2luZyBHQ2xvc3VyZU1hcnNoYWwgZGlyZWN0bHkuCisJKHN0cnVjdCBEQnVzR09iamVjdEluZm8pOiBBZGQgbl9pbmZvcyBtZW1iZXIuCisKKwkqIHRlc3QvZ2xpYi90ZXN0LXNlcnZpY2UtZ2xpYi54bWw6IE5ldyBmaWxlOyBjb250YWlucyBpbnRyb3NwZWN0aW9uIGRhdGEKKwlmb3IgTXlUZXN0T2JqZWN0IHVzZWQgaW4gdGVzdC1zZXJ2aWNlLWdsaWIuYy4KKworCSogdGVzdC9nbGliL3Rlc3Qtc2VydmljZS1nbGliLmMgKGVudW0gTXlPYmplY3RFcnJvcik6IE5ldyBHRXJyb3IgZW51bS4KKwkobXlfb2JqZWN0X2RvX25vdGhpbmcsIG15X29iamVjdF9pbmNyZW1lbnQsIG15X29iamVjdF90aHJvd19lcnJvcikKKwkobXlfb2JqZWN0X3VwcGVyY2FzZSwgbXlfb2JqZWN0X21hbnlfYXJncyk6IE5ldyB0ZXN0IG1ldGhvZHMuCisJKG1haW4pOiBVc2UgZGJ1c19nX29iamVjdF9jbGFzc19pbnN0YWxsX2luZm8gdG8gaW5jbHVkZSBnZW5lcmF0ZWQgb2JqZWN0CisJaW5mby4KKworCSogdGVzdC9nbGliL01ha2VmaWxlLmFtOiBHZW5lcmF0ZSBzZXJ2ZXItc2lkZSBnbHVlIGZvciB0ZXN0LXNlcnZpY2UtZ2xpYi5jLAorCWFzIHdlbGwgYXMgY2xpZW50LXNpZGUgYmluZGluZ3MuCisKKwkqIHRlc3QvZ2xpYi90ZXN0LWRidXMtZ2xpYi5jOiBJbmNsdWRlIHRlc3Qtc2VydmljZS1nbGliLWJpbmRpbmdzLmguCisJKG1haW4pOiBBY3RpdmF0ZSBUZXN0U3VpdGVHTGliU2VydmljZTsgdGVzdCBpbnZva2UgYSBidW5jaCBvZiBpdHMgbWV0aG9kcworCXVzaW5nIGJvdGggdGhlIGRidXNfZ3Byb3h5IHN0dWZmIGRpcmVjdGx5IGFzIHdlbGwgYXMgdGhlIGdlbmVyYXRlZCBiaW5kaW5ncy4KKworMjAwNS0wMi0xNSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMgKGRidXNfY29ubmVjdGlvbl9kaXNwYXRjaCk6IGFsd2F5cworCWNvbXBsZXRlIGEgcGVuZGluZyBjYWxsLCBkb24ndCBydW4gZmlsdGVycyBmaXJzdC4KKworCSogZ2xpYi9kYnVzLWdwcm94eS5jIChkYnVzX2dfcHJveHlfZW5kX2NhbGwpOiBjaGFuZ2UgdG8gdXNlCisJZGJ1c19wZW5kaW5nX2NhbGxfc3RlYWxfcmVwbHkKKworCSogZGJ1cy9kYnVzLXBlbmRpbmctY2FsbC5jIChkYnVzX3BlbmRpbmdfY2FsbF9ibG9jayk6IGp1c3QgY2FsbAorCV9kYnVzX2Nvbm5lY3Rpb25fYmxvY2tfcGVuZGluZ19jYWxsCisJKGRidXNfcGVuZGluZ19jYWxsX2dldF9yZXBseSk6IGNoYW5nZSB0byBzdGVhbF9yZXBseSBhbmQgcmV0dXJuIGEKKwlyZWYKKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYworCShkYnVzX2Nvbm5lY3Rpb25fc2VuZF93aXRoX3JlcGx5X2FuZF9ibG9jayk6IHBvcnQgdG8gd29yayBpbiB0ZXJtcworCW9mIERCdXNQZW5kaW5nQ2FsbAorCShfZGJ1c19jb25uZWN0aW9uX2Jsb2NrX3BlbmRpbmdfY2FsbCk6IHJlcGxhY2UgYmxvY2tfZm9yX3JlcGx5CisJd2l0aCB0aGlzCisKKzIwMDUtMDItMTQgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtdXNlcmRiLXV0aWwuYyAoX2RidXNfdXNlcl9kYXRhYmFzZV9sb29rdXBfZ3JvdXApOgorCXByb3Blcmx5IGhhbmRsZSBsb29raW5nIHVwIGdyb3VwIGluZm9ybWF0aW9uIGJ5IG5hbWU7IGZpeCAKKwlmcm9tIGpAYm9vdGxhYi5vcmcKKworMjAwNS0wMi0xMyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMgKGRidXNfY29ubmVjdGlvbl9yZXR1cm5fbWVzc2FnZSkgCisJKGRidXNfY29ubmVjdGlvbl9ib3Jyb3dfbWVzc2FnZSk6IGhvbGQgZGlzcGF0Y2ggbG9jayB3aGlsZSBtZXNzYWdlCisJaXMgb3V0c3RhbmRpbmcKKwkoX2RidXNfY29ubmVjdGlvbl9ibG9ja19mb3JfcmVwbHkpOiBob2xkIGRpc3BhdGNoIGxvY2sgd2hpbGUgd2UKKwlibG9jayBmb3IgdGhlIHJlcGx5LCBzbyBub2JvZHkgc3RlYWxzIG91ciByZXBseQorCShkYnVzX2Nvbm5lY3Rpb25fcG9wX21lc3NhZ2UpOiBob2xkIHRoZSBkaXNwYXRjaCBsb2NrIHdoaWxlIHdlCisJcGx1Y2sgdGhlIG1lc3NhZ2UKKworMjAwNS0wMi0xMyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMgKF9kYnVzX2Nvbm5lY3Rpb25fYWNxdWlyZV9kaXNwYXRjaCkKKwkoX2RidXNfY29ubmVjdGlvbl9yZWxlYXNlX2Rpc3BhdGNoKQorCShfZGJ1c19jb25uZWN0aW9uX2FjcXVpcmVfaW9fcGF0aCkKKwkoX2RidXNfY29ubmVjdGlvbl9yZWxlYXNlX2lvX3BhdGgpOiBtYWtlIHRoZSBtdXRleCBhbmQgY29uZHZhcgorCWNvbnRyb2wgYWNjZXNzIHRvIHRoZSAiYWNxdWlyZWQiIGZsYWcuIERyb3AgdGhlIGNvbm5lY3Rpb24gbG9jaworCXdoaWxlIHdhaXRpbmcgb24gdGhlIGNvbmR2YXIuIEhvcGVmdWxseSB0aGVzZSBhcmUgYmFieSBzdGVwcyBpbgorCXJvdWdobHkgdGhlIHJpZ2h0IGRpcmVjdGlvbi4KKworMjAwNS0wMi0xMyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmM6IHVzZSBzZXBhcmF0ZSBtdXRleGVzIGZvciB0aGUgY29uZGl0aW9uCisJdmFyaWFibGVzOyB0aGlzIGlzIHNvbWUga2luZCBvZiBiYXNlbGluZSBmb3Igc2FuaXR5LCBidXQgdGhlCisJY29uZGl0aW9uIHZhcmlhYmxlcyBzdGlsbCBhcmVuJ3QgdXNlZCBjb3JyZWN0bHkgYWZhaWN0CisKKzIwMDUtMDItMTMgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtb2JqZWN0LXRyZWUuYyAoaGFuZGxlX2RlZmF1bHRfaW50cm9zcGVjdF9hbmRfdW5sb2NrKToKKwlmaXggYSBkb3VibGUtdW5sb2NrCisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMKKwkoX2RidXNfY29ubmVjdGlvbl9kZXRhY2hfcGVuZGluZ19jYWxsX3VubG9ja2VkKTogYWRkIHRoaXMKKworICAgICAgICBJbml0aWFsIHNlbWktY29ycmVjdCBwYXNzIHRocm91Z2ggdG8gZml4IHRocmVhZCBsb2NraW5nOyB0aGVyZSBhcmUKKwlzdGlsbCBzb21lIGlzc3VlcyB3aXRoIHRoZSBjb25kaXRpb24gdmFyaWFibGUgcGF0aHMgSSdtIHByZXR0eQorCXN1cmUKKwkKKwkqIGRidXMvZGJ1cy1zZXJ2ZXIuYzogYWRkIGEgbXV0ZXggb24gREJ1c1NlcnZlciBhbmQgYXBwcm9wcmlhdGUKKwlsb2NrL3VubG9jayBjYWxscworCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jIChfZGJ1c19jb25uZWN0aW9uX2RvX2l0ZXJhdGlvbl91bmxvY2tlZCk6CisJcmVuYW1lIHRvIGFkZCBfdW5sb2NrZWQKKwkoc3RydWN0IERCdXNDb25uZWN0aW9uKTogbW92ZSAiZGlzcGF0Y2hfYWNxdWlyZWQiIGFuZAorCSJpb19wYXRoX2FjcXVpcmVkIiB0byB1c2Ugb25seSBvbmUgYml0IGVhY2guCisJKENPTk5FQ1RJT05fTE9DSywgQ09OTkVDVElPTl9VTkxPQ0spOiBhZGQgY2hlY2tzIHdpdGggIURCVVNfRElTQUJMRV9DSEVDS1MKKwkoZGJ1c19jb25uZWN0aW9uX3NldF93YXRjaF9mdW5jdGlvbnMpOiBoYWNreSBmaXggdG8gcmVlbnRyYW5jeQorCShfZGJ1c19jb25uZWN0aW9uX2FkZF93YXRjaCwgX2RidXNfY29ubmVjdGlvbl9yZW1vdmVfd2F0Y2gpIAorCShfZGJ1c19jb25uZWN0aW9uX3RvZ2dsZV93YXRjaCwgX2RidXNfY29ubmVjdGlvbl9hZGRfdGltZW91dCkgCisJKF9kYnVzX2Nvbm5lY3Rpb25fcmVtb3ZlX3RpbWVvdXQpIAorCShfZGJ1c19jb25uZWN0aW9uX3RvZ2dsZV90aW1lb3V0KTogZHJvcCBsb2NrIHdoZW4gY2FsbGluZyBvdXQgdG8KKwl1c2VyIGZ1bmN0aW9uczsgZG9uZSBpbiBhIGhhY2t5L2JhZCB3YXkuCisJKF9kYnVzX2Nvbm5lY3Rpb25fc2VuZF9hbmRfdW5sb2NrKTogYWRkIGEgbWlzc2luZyB1bmxvY2sKKwkoX2RidXNfY29ubmVjdGlvbl9ibG9ja19mb3JfcmVwbHkpOiBhZGQgYSBtaXNzaW5nIHVubG9jaworCisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LmMgKF9kYnVzX3RyYW5zcG9ydF9nZXRfaXNfYXV0aGVudGljYXRlZCk6CisJZHJvcCBsb2NrIGluIGEgaGFja3kgcHJvYmFibHkgdW5zYWZlIHdheSB0byBjYWxsIG91dCB0byB1c2VyCisJZnVuY3Rpb24KKworMjAwNS0wMi0xMiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIHRvb2xzL2RidXMtdHJlZS12aWV3LmMgKGluZm9fc2V0X2Z1bmNfdGV4dCk6IGRpc3BsYXkgbW9yZQorCWRldGFpbHMgb24gYXJncworCisJKiBidXMvZHJpdmVyLmMgKGJ1c19kcml2ZXJfaGFuZGxlX2xpc3Rfc2VydmljZXMpOiBsaXN0IHRoZSBidXMKKwlkcml2ZXIKKworCSogZ2xpYi9kYnVzLWdwYXJzZXIuYyAocGFyc2VfYXJnKTogZ2VuZXJhdGUgYW4gYXJnIG5hbWUgaWYgbm9uZSBpcyBzdXBwbGllZAorCisJKiBnbGliL2RidXMtZ2lkbC5jIChzaWduYWxfaW5mb19nZXRfbl9hcmdzKTogbmV3IGZ1bmN0aW9uCisJKG1ldGhvZF9pbmZvX2dldF9uX2FyZ3MpOiBuZXcgZnVuY3Rpb24KKworMjAwNS0wMi0xMiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGJ1cy9kcml2ZXIuYyAoYnVzX2RyaXZlcl9oYW5kbGVfaW50cm9zcGVjdCk6IGFkZCBpbnRyb3NwZWN0aW9uCisJZm9yIGJ1cyBkcml2ZXIKKworMjAwNS0wMi0xMiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGJ1cy9kcml2ZXIuYzogcHV0IHRoZSBzaWduYXR1cmUgb2YgZWFjaCBidXMgZHJpdmVyIG1ldGhvZCBpbiB0aGUKKwl0YWJsZSBvZiBoYW5kbGVycyBhbmQgY2hlY2sgaXQgb24gaW5jb21pbmcgY2FsbHM7IHRoaXMgaXNuJ3QKKwlyZWFsbHkgdXNlZnVsLCBidXQgZ29pbmcgdG8gYWRkIGludHJvc3BlY3Qgc3VwcG9ydCBpbiBhIG1pbnV0ZS4KKworMjAwNS0wMi0xMSAgSm9lIFNoYXcgIDxqb2VzaGF3QG5vdmVsbC5jb20+CisKKwkqIG1vbm8vQ29ubmVjdGlvbi5jczogVGhlIHVucHJlZGljdGFiaWxpdHkgb2YgZmluYWxpemVycyBpbiBtb25vCisJcHJldmVudHMgdXMgZnJvbSBkZXRlcm1pbmlzdGljYWxseSBkaXNjb25uZWN0aW5nIHRoZSBmaWx0ZXJzIGZyb20KKwl0aGUgU2VydmljZSBjbGFzcydzIGZpbmFsaXplciwgc28gbW92ZSB0cmFja2luZyBvZiBmaWx0ZXJzIGFuZAorCW1hdGNoZXMgaGVyZS4gIEFkZCBBUEkgZm9yIHRoYXQuCisKKwkqIG1vbm8vU2VydmljZS5jczogUmVtb3ZlIHRoZSBjb2RlLCBhZGQgY29kZSB3aGljaCBjYWxscyB0aGUKKwltZXRob2RzIG5vdyBvbiB0aGUgQ29ubmVjdGlvbiBjbGFzcy4KKworMjAwNS0wMi0xMSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogcHl0aG9uL2RidXMucHkgKGNsYXNzIFNlbmRlcik6IGFkZGVkIHRvIHN1cHBvcnQgZGJ1cyBzaWduYWxzIGJldHRlcgorCShCdXM6OmFkZF9zaWduYWxfcmVjZWl2ZXIpOiBhZGRlZCBleHBhbmRfYXJncyBwYXJhbWV0ZXIgd2hpY2ggZGVmYXVsdHMKKwl0byBUcnVlLiAgV2hlbiBleHBhbmQgYXJncyBpcyBUcnVlIHRoZSBzaWduYWwgaGFuZGxlciB3aWxsIHBhc3MgdGhlIAorCW1lc3NhZ2UgYXJndW1lbnRzIGFzIHBhcmFtZXRlcnMgdG8gdGhlIHNpZ25hbCBoYW5kbGVyLiAgSWYgRmFsc2UKKwlyZXZlcnQgdG8gcHJldmlvdXMgYmVoYXZpb3Igd2hlcmUgdGhlIHNpZ25hbCBoYW5kbGVyIG11c3QgZ2V0IHRoZQorCWFyZ3VtZW50IGxpc3QgZnJvbSB0aGUgbWVzc2FnZS4gIFRoaXMgaXMgdG8gaGVscCBwb3J0IGFwcGxpY2F0aW9ucworCWxpa2UgSEFMIHRoYXQgaGF2ZSBhIHRlbmRhbmN5IHRvIHNlbmQgdmFyaWFibGUgbGVuZ3RoIGFyZ3VtZW50IGxpc3RzLgorCXNlbGYuX21hdGNoX3J1bGVfdG9fcmVjZWl2ZXJzIGlzIG5vdyBhIGRpY3Qgb2YgZGljdHMuCisJKEJ1czo6cmVtb3ZlX3NpZ25hbF9yZWNlaXZlcik6IHBvcCBoYW5kbGVyIG9mZiB0aGUgZGljdCBpbnRlYWQgb2YgCisJcmVtb3ZpbmcgaXQgZnJvbSBhIGxpc3QKKwkoQnVzOjpfc2lnbmFsX2Z1bmMpOiBjaGFuZ2Ugc2lnbmFsIGhhbmRsZXJzIHNvIHRoYXQgaW50ZXJmYWNlLAorCXNpZ25hbF9uYW1lLCBzZXJ2aWNlLCBwYXRoIGFuZCBtZXNzYWdlIGFyZSBwYWNrZWQgaW50byBhIFNlbmRlcgorCW9iamVjdCBhbmQgdGhhdCBpcyBwYXNzZWQgdG8gdGhlIGhhbmRsZXIuICBJZiBleHBhbmRfYXJncyBpcyBUcnVlCisJZXh0cmFjdCB0aGUgYXJncyBsaXN0IGZyb20gdGhlIG1lc3NhZ2UgYW5kIGFwcGVuZCBpdCB0byB0aGUgcGFyYW1ldGVyCisJbGlzdAorCQorCSogcHl0aG9uL2RidXNfYmluZGluZ3MucHl4LmluIChjbGFzcyBTaWduYXR1cmUpOiBhZGRlZCB0byBzdXBwb3J0IAorCXNpZ25pYXR1cmUgdHlwZXMKKwkoTWVzc2FnZUl0ZXI6Ol9faW5pdF9fKTogY2hhbmdlZCBpdGVyYXRpb24gbGltaXQgdG8gbWF0Y2ggRC1CVVMKKwkoTWVzc2FnZUl0ZXI6OmdldCopOiBhZGRlZCBJTlQxNiwgVUlOVDE2LCBTSUdOQVRVUkUsIERJQ1RfRU5UUlksIAorCVNUUlVDVCBhbmQgVkFSSUVOVCB0eXBlIHN1cHBvcnQKKwkoTWVzc2FnZUl0ZXI6OnB5dGhvbl92YWx1ZV90b19kYnVzX3NpZyk6IG1hZGUgcmVjdXJzaXZlIHRvIHN1cHBvcnQKKwlyZWN1cnNpdmUgdHlwZXMKKwkoTWVzc2FnZUl0ZXI6OmFwcGVuZCopOiBhZGRlZCBTaWduYXR1cmUsIGRpY3QsIHR1cGxlIAorCXN1cHBvcnQKKworCSogcHl0aG9uL2V4YW1wbGVzL2V4YW1wbGUtY2xpZW50LnB5OiBhZGRlZCBleGFtcGxlcyBvZiBnZXR0aW5nIHR1cGxlcworCWFuZCBkaWN0cworCisJKiBweXRob24vZXhhbXBsZXMvZXhhbXBsZS1zZXJ2aWNlLnB5OiBhZGRlZCBleGFtcGxlcyBvZiBzZW5kaW5nIHR1cGxlcworCWFuZCBkaWN0cworCisJKiBweXRob24vZXhhbXBsZXMvZXhhbXBsZS1zaWduYWwtcmVjaXBpZW50LnB5OiBGaXhlZCB0byBoYW5kbGUgbmV3CisJc2lnbmFsIGNhbGxiYWNrIGZvcm1hdAorCisyMDA1LTAyLTEwICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogdGVzdC9nbGliL3Rlc3QtZGJ1cy1nbGliLmMgKG1haW4pOiBmaXggc28gdGhpcyB0ZXN0IGRvZXNuJ3QgZmFpbAorCShjYWxsIGRidXNfZ19wcm94eV9hZGRfc2lnbmFsKQorCisJKiBkYnVzL2RidXMtc2VydmVyLXVuaXguYyAoX2RidXNfc2VydmVyX25ld19mb3JfdGNwX3NvY2tldCk6CisJZXNjYXBlIHRoZSBob3N0bmFtZQorCShfZGJ1c19zZXJ2ZXJfbmV3X2Zvcl9kb21haW5fc29ja2V0KTogZXNjYXBlIHRoZSBwYXRoCisKKwkqIGRidXMvZGJ1cy1hZGRyZXNzLmMgKGRidXNfYWRkcmVzc19lc2NhcGVfdmFsdWUpOiBuZXcKKwkoZGJ1c19hZGRyZXNzX3VuZXNjYXBlX3ZhbHVlKTogbmV3CisJKGRidXNfcGFyc2VfYWRkcmVzcyk6IHVuZXNjYXBlIHZhbHVlcworCisJKiBkYnVzL2RidXMtc3RyaW5nLmMgKF9kYnVzX3N0cmluZ19hcHBlbmRfYnl0ZV9hc19oZXgpOiBuZXcgZnVuY3Rpb24KKworCSogZG9jL2RidXMtc3BlY2lmaWNhdGlvbi54bWw6IGV4cGxhaW4gaG93IHRvIGVzY2FwZSB2YWx1ZXMgaW4KKwlhZGRyZXNzZXMKKworMjAwNS0wMi0xMCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLWZhY3RvcnkuYyAoZ2VuZXJhdGVfc3BlY2lhbCk6IG1vZGlmeSB0ZXN0IHRvCisJYXZvaWQgdXNpbmcgYSBub24tYmFzaWMgZGljdCBrZXkKKworCSogZGJ1cy9kYnVzLW1hcnNoYWwtdmFsaWRhdGUtdXRpbC5jOiBhZGQgdGVzdCBmb3IgdGhlIGJlbG93CisKKwkqIGRvYy9kYnVzLXNwZWNpZmljYXRpb24ueG1sOiByZXF1aXJlIHRoYXQgZGljdCBrZXlzIGFyZSBhIGJhc2ljCisJdHlwZQorCisJKiBkYnVzL2RidXMtbWFyc2hhbC12YWxpZGF0ZS5jCisJKF9kYnVzX3ZhbGlkYXRlX3NpZ25hdHVyZV93aXRoX3JlYXNvbik6IHJlcXVpcmUgdGhhdCBkaWN0IGtleSBpcyBhCisJYmFzaWMgdHlwZQorCisyMDA1LTAyLTEwICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLW9iamVjdC10cmVlLmMgKGhhbmRsZV9kZWZhdWx0X2ludHJvc3BlY3RfYW5kX3VubG9jayk6CisJY2hhbmdlIHRvIGJlIF9hbmRfdW5sb2NrIGluc3RlYWQgb2YgX3VubG9ja2VkCisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMKKwkoX2RidXNfY29ubmVjdGlvbl9zZW5kX3ByZWFsbG9jYXRlZF91bmxvY2tlZF9ub191cGRhdGUpOiByZW5hbWUgdG8KKwloYXZlIG5vX3VwZGF0ZSBzbyB3ZSBjYW4gZmluZCB0aGlzIGJ1ZyBxdWlja2x5IGluIGZ1dHVyZQorCisyMDA1LTAyLTEwICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UtdXRpbC5jICh2ZXJpZnlfdGVzdF9tZXNzYWdlKTogdGVzdHMgZm9yIHN0cmluZworCWFycmF5CisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKGRidXNfbWVzc2FnZV9hcHBlbmRfYXJnc192YWxpc3QpOiBhZGQKKwlzdXBwb3J0IGZvciBhcnJheXMgb2Ygc3RyaW5nL3NpZ25hdHVyZS9wYXRoCisKKzIwMDUtMDItMTAgIEpvZSBTaGF3ICA8am9lc2hhd0Bub3ZlbGwuY29tPgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jCisJKF9kYnVzX2Nvbm5lY3Rpb25fcXVldWVfcmVjZWl2ZWRfbWVzc2FnZV9saW5rLAorCV9kYnVzX2Nvbm5lY3Rpb25fbWVzc2FnZV9zZW50KTogQWRkIHRoZSBwYXRoIHRvCisJdGhlIHZlcmJvc2Ugb3V0cHV0LgorCShfZGJ1c19jb25uZWN0aW9uX3NlbmRfcHJlYWxsb2NhdGVkX2FuZF91bmxvY2spOiBBZGRlZC4gIENhbGxzCisJX2RidXNfY29ubmVjdGlvbl9zZW5kX3ByZWFsbG9jYXRlZF91bmxvY2tlZCgpLCB1cGRhdGVkIHRoZQorCWRpc3BhdGNoIHN0YXR1cywgYW5kIHVubG9ja3MuICBGaXhlcyBhIGJ1ZyB3aGVyZSBjZXJ0YWluCisJc2l0dWF0aW9ucyAobGlrZSBhIGJyb2tlbiBwaXBlKSBjb3VsZCBjYXVzZSBhIERpc2Nvbm5lY3QgbWVzc2FnZQorCXRvIG5vdCBiZSBzZW50LCB0cmlja2luZyB0aGUgYnVzIGludG8gdGhpbmtpbmcgYSBzZXJ2aWNlIHdhcyBzdGlsbAorCXRoZXJlIHdoZW4gdGhlIHByb2Nlc3MgaGFkIHF1aXQuCisJKF9kYnVzX2Nvbm5lY3Rpb25fc2VuZF9wcmVhbGxvY2F0ZWQpOiBDYWxsCisJX2RidXNfY29ubmVjdGlvbl9zZW5kX3ByZWFsbG9jYXRlZF9hbmRfdW5sb2NrKCkuCisJKF9kYnVzX2Nvbm5lY3Rpb25fc2VuZF9hbmRfdW5sb2NrKTogQWRkZWQuICBDYWxscworCV9kYnVzX2Nvbm5lY3Rpb25fc2VuZF9wcmVhbGxvY2F0ZWRfYW5kX3VubG9jaygpLgorCShkYnVzX2Nvbm5lY3Rpb25fc2VuZCk6IENhbGwgX2RidXNfY29ubmVjdGlvbl9zZW5kX2FuZF91bmxvY2soKS4KKwkoZGJ1c19jb25uZWN0aW9uX3NlbmRfd2l0aF9yZXBseSk6IFVwZGF0ZSB0aGUgZGlzcGF0Y2ggc3RhdHVzIGFuZAorCXVubG9jay4KKworCSogbW9uby9TZXJ2aWNlLmNzICh+U2VydmljZSk6IEFkZGVkLiAgUmVtb3ZlcyB0aGUgZmlsdGVyIHNvIHRoYXQKKwl3ZSBkb24ndCBnZXQgdW5tYW5hZ2VkIGNvZGUgY2FsbGluZyBiYWNrIGludG8gYSBHQ2VkIGRlbGVnYXRlLgorCShSZW1vdmVGaWx0ZXIpOyBBZGRlZC4KKworMjAwNS0wMi0wOSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAoZGJ1c19tZXNzYWdlX2l0ZXJfb3Blbl9jb250YWluZXIpOgorCS0gUmVtb3ZlZCBjaGVjayBmb3IgaXRlcmF0b3IgdHlwZSBiZWluZyBhbiBhcnJheSBiZWNhdXNlCisJZ2V0X2FyZ190eXBlIGRvZXMgbm90IHdvcmsgd2l0aCB3cml0ZXIgaXRlcmF0b3JzCisJLSBQYXNzIE5VTEwgdG8gX2RidXNfdHlwZV93cml0ZXJfcmVjdXJzZSBpZiBzaWduaXR1cmUgaXMgTlVMTAorCisyMDA1LTAyLTA3ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZG9jL2RidXMtc3BlY2lmaWNhdGlvbi54bWw6IHNvbWUgbW9yZSBsYW5ndWFnZSBjbGVhbnVwczsgYWRkCisJc3R1ZmYgYWJvdXQgaG93IHRvIGRlYWwgd2l0aCBpbnZhbGlkIHByb3RvY29sIGFuZCBleHRlbnNpb24KKwlwb2ludHM7IGFkZCBfIHRvIGFsbG93ZWQgY2hhcnMgaW4gYXV0aCBjb21tYW5kczsgYWRkIEVYVEVOU0lPTl8KKwlhdXRoIGNvbW1hbmQgcHJlZml4CisKKzIwMDUtMDItMDYgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBzL2V4cGVjdGVkL3JlcXVpcmVkLyBpbiBhIGNvdXBsZSBwbGFjZXMgZm9yIGNsYXJpdHkKKworMjAwNS0wMi0wNyAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogYnVzL3NlbGludXguYyAoYnVzX3NlbGludXhfYWxsb3dzX3NlbmQpOiBIYW5kbGUgTlVMTCBmb3IKKwlzZW5kZXIgb3IgcHJvcG9zZWRfcmVjaXBpZW50LgorCisyMDA1LTAyLTA2ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UtZmFjdG9yeS5jIChnZW5lcmF0ZV9zcGVjaWFsKTogbW9yZSB0ZXN0cworCisJKiBkYnVzL2RidXMtbWFyc2hhbC12YWxpZGF0ZS5jICh2YWxpZGF0ZV9ib2R5X2hlbHBlcik6IGRldGVjdAorCWFycmF5IGxlbmd0aCB0aGF0IGV4Y2VlZHMgdGhlIG1heGltdW0KKworMjAwNS0wMi0wNSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLWZhY3RvcnkuYyAoZ2VuZXJhdGVfc3BlY2lhbCk6IG1vcmUgdGVzdCBjYXNlcywKKwlpbmNyZWFzaW5nIGNvdmVyYWdlCisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLXZhbGlkYXRlLmMgKHZhbGlkYXRlX2JvZHlfaGVscGVyKTogcmV0dXJuIHRoZQorCXJlYXNvbiB3aHkgYSBzaWduYXR1cmUgd2FzIGludmFsaWQKKworCSogZGJ1cy9kYnVzLW1hcnNoYWwtaGVhZGVyLmMgKGxvYWRfYW5kX3ZhbGlkYXRlX2ZpZWxkKTogZml4IHRvCisJc2tpcCB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgYmVmb3JlIHdlIGxvb2sgYXQgaXQgaW4gdmFsaWRhdGlvbgorCisJKiBkYnVzL2RidXMtc3RyaW5nLXV0aWwuYyAoX2RidXNfc3RyaW5nX3Rlc3QpOiBhZGQgdGVzdHMgZm9yCisJZXF1YWxfc3Vic3RyaW5nCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKF9kYnVzX21lc3NhZ2VfbG9hZGVyX25ldyk6IGRlZmF1bHQKKwltYXhfbWVzc2FnZV9sZW5ndGggdG8gREJVU19NQVhJTVVNX01FU1NBR0VfTEVOR1RICisKKzIwMDUtMDItMDUgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtbWFyc2hhbC12YWxpZGF0ZS5jICh2YWxpZGF0ZV9ib2R5X2hlbHBlcik6IGZpeCBjcmFzaAorCWlmIHRoZSBzaWduYXR1cmUgb2YgYSB2YXJpYW50IHdhcyBlbXB0eQorCShfZGJ1c192YWxpZGF0ZV9zaWduYXR1cmVfd2l0aF9yZWFzb24pOiBjYXRjaCAiKGEpIiAoYXJyYXkgaW5zaWRlCisJc3RydWN0IHdpdGggbm8gZWxlbWVudCB0eXBlKQorCisJKiBkYnVzL2RidXMtbWVzc2FnZS1mYWN0b3J5LmMgKGdlbmVyYXRlX3VpbnQzMl9jaGFuZ2VkKTogYWRkIG1vcmUKKwltYW5nbGVkIG1lc3NhZ2VzIHRvIGJyZWFrIHRoaW5ncworCisyMDA1LTAyLTA0ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZ2xpYi9kYnVzLWdwcm94eS5jIChkYnVzX2dfcHJveHlfZGlzY29ubmVjdF9zaWduYWwpOiB1c2UKKwlnX3F1YXJrX3RyeV9zdHJpbmcoKSBzbyBpdCBhY3R1YWxseSBjYW4gcmV0dXJuIDAKKwkoZGJ1c19nX3Byb3h5X2Nvbm5lY3Rfc2lnbmFsKTogZGl0dG8KKworMjAwNS0wMi0wNCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGdsaWIvZGJ1cy1ncHJveHkuYyAoZGJ1c19nX3Byb3h5X2VtaXRfcmVtb3RlX3NpZ25hbCk6IGZpeCBhCisJYm9ndXMgd2FybmluZworCSh0cmlzdHJpbmdfZnJvbV9tZXNzYWdlKTogYXNzZXJ0IGNsZWFubHkgb24gbnVsbCBwYXRoL2ludGVyZmFjZQorCShzaG91bGQgbm90IGJlIHBvc3NpYmxlIHRob3VnaCBJIGRlY2lkZWQgbGF0ZXIpCisJKGRidXNfZ19wcm94eV9kaXNwb3NlKTogbW92ZSBwcm94eSBtYW5hZ2VyIHVucmVnaXN0cmF0aW9uIGhlcmUKKwkoREJVU19HX1BST1hZX0RFU1RST1lFRCk6IGFkZCB0aGlzIG1hY3JvLCBhbmQgdXNlIGl0IGluIGEgYnVuY2ggb2YKKwlnX3JldHVybl9pZl9mYWlsKCkgY2hlY2tzCisKKzIwMDUtMDItMDQgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkb2MvTWFrZWZpbGUuYW0gKEVYVFJBX0RJU1QpOiBhZGQgRFREcyB0byBtYWtlZmlsZQorCisJKiBkb2MvaW50cm9zcGVjdC5kdGQ6IGFkZCBpbnRyb3NwZWN0LmR0ZCBmcm9tIERhdmlkIEEuIFdoZWVsZXIKKwkod2l0aCBzb21lIG1pbm9yIGNoYW5nZXMpCisKKwkqIGRvYy9kYnVzLXNwZWNpZmljYXRpb24ueG1sOiBhZGQgZGVwcmVjYXRlZCBhdHRyaWJ1dGUgdG8KKwlpbnRyb3NwZWN0aW9uIGZvcm1hdAorCisyMDA1LTAxLTMxICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZ2xpYi9kYnVzLWdwcm94eS5jOiByZXdyaXRlIGhvdyBzaWduYWxzIHdvcmsgYWdhaW4sIHRoaXMgdGltZSBJCisJdGhpbmsgaXQncyBzb3J0IG9mIHJpZ2h0CisKKzIwMDUtMDEtMzAgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiB0b29scy9kYnVzLXZpZXdlci5jOiBraW5kIG9mIGhhbGYtYXNzIGhvb2sgdXAgdGhlIG9wdGlvbiBtZW51LgorCisyMDA1LTAxLTMwICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogdG9vbHMvZGJ1cy1uYW1lcy1tb2RlbC5jOiBkeW5hbWljYWxseSB3YXRjaCBOYW1lT3duZXJDaGFuZ2VkCisKKwkqIGF1dG9nZW4uc2g6IGNoYW5nZSB0byBhdXRvdG9vbHMgMS45CisKKwkqIGdsaWIvZGJ1cy1ncHJveHkuYzogY29tcGxldGVseSBjaGFuZ2UgaG93IHNpZ25hbHMgd29yaworCShkYnVzX2dfcHJveHlfYWRkX3NpZ25hbCk6IG5ldyBmdW5jdGlvbiB0byBzcGVjaWZ5IHNpZ25hdHVyZSBvZiBhCisJc2lnbmFsCisJKGRidXNfZ19wcm94eV9lbWl0X3JlY2VpdmVkKTogbWFyc2hhbCB0aGUgZGJ1cyBtZXNzYWdlIHRvIEdWYWx1ZXMsCisJYW5kIGdfd2FybmluZyBpZiB0aGUgaW5jb21pbmcgbWVzc2FnZSBoYXMgdGhlIHdyb25nIHNpZ25hdHVyZS4KKworMjAwNS0wMS0zMCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIHRvb2xzL2RidXMtbmFtZXMtbW9kZWwuYyAoaGF2ZV9uYW1lc19ub3RpZnkpOiBmaXggdGhpcworCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChfZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2FyZ3NfdmFsaXN0KTogY2xlYW4KKwl1cCB0aGUgc3RyaW5nIGFycmF5IGhhbmRsaW5nIGEgYml0IAorCisyMDA1LTAxLTMwICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZ2xpYi9kYnVzLWdsaWIuYyAoZGJ1c19nX3BlbmRpbmdfY2FsbF9zZXRfbm90aWZ5KTogbmV3IGZ1bmN0aW9uCisJKGRidXNfZ19wZW5kaW5nX2NhbGxfY2FuY2VsKTogbmV3IGZ1bmN0aW9uCisKKwkqIGRidXMvZGJ1cy1nbGliLmg6IG1vdmUgR1R5cGUgZGVjbHMgZm9yIGNvbm5lY3Rpb24vbWVzc2FnZSBoZXJlOworCSogZGJ1cy9kYnVzLWdsaWIuYzogbW92ZSBhbGwgdGhlIGdfdHlwZSBhbmQgcmVmL3VucmVmIHN0dWZmIGluCisJaGVyZSwganVzdCBraW5kIG9mIHJhdGlvbmFsaXppbmcgaG93IHdlIGhhbmRsZSBhbGwgdGhhdAorCisJKiB0b29scy9kYnVzLW5hbWVzLW1vZGVsLmM6IG5ldyBmaWxlIGZvciBhIHRyZWUgbW9kZWwgbGlzdGluZyB0aGUKKwlzZXJ2aWNlcyBvbiBhIGJ1cworCisJKiB0b29scy9kYnVzLXRyZWUtdmlldy5jIChtb2RlbF9uZXcpOiB1c2UgcHJvcGVyIHR5cGluZyBvbiB0aGUKKwltb2RlbCByb3dzCisKKzIwMDUtMDEtMzAgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBnbGliL2RidXMtZ21haW4uYzogYWRkIGEgY3VzdG9tIEdTb3VyY2UgYmFjayB0aGF0IGp1c3QgY2hlY2tzCisJd2hldGhlciB0aGUgbWVzc2FnZSBxdWV1ZSBoYXMgYW55dGhpbmcgaW4gaXQ7IG90aGVyd2lzZSwgdGhlcmUgYXJlIAorCWNhc2VzIHdoZXJlIHdlIHdvbid0IHNlZSBtZXNzYWdlcyBpbiB0aGUgcXVldWUgc2luY2UgdGhlcmUgd2FzIG5vIAorCUlPIHZpc2libGUgdG8gdGhlIGdsaWIgbWFpbiBsb29wCisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLWludGVybmFsLmggKF9EQlVTX0RFRkFVTFRfVElNRU9VVF9WQUxVRSk6CisJaW5jcmVhc2UgZGVmYXVsdCBtZXNzYWdlIHRpbWVvdXQgdG8gMjUgc2Vjb25kcworCisyMDA1LTAxLTMwICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogdGVzdC9nbGliL3Rlc3QtcHJvZmlsZS5jIChub19idXNfc3RvcF9zZXJ2ZXIpOiByZW1vdmUgdGhlCisJd2FybmluZyBhYm91dCB0aGUgZ193YXJuaW5nIHRoYXQgSSBqdXN0IGZpeGVkCisKKwkqIGdsaWIvZGJ1cy1nbWFpbi5jOiByZXdyaXRlIHRoZSBtYWluIGxvb3Agc3R1ZmYgdG8gYXZvaWQgdGhlCisJY3VzdG9tIHNvdXJjZSwgc2VlbXMgdG8gYmUgYSBsb3QgZWFzaWVyIHRvIHVuZGVyc3RhbmQgYW5kIHdvcmsKKwliZXR0ZXIuCisKKzIwMDUtMDEtMzAgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisgICAgICAgIEkgdGhpbmsgdGhpcyBtYWluIGxvb3AgdGhpbmcgaXMgY29uY2VwdHVhbGx5IGJyb2tlbiwgYnV0IGhlcmUgYXJlIAorCXNvbWUgYmFuZCBhaWRzLiBJJ2xsIG1heWJlIHJld3JpdGUgaXQgaW4gYSBtaW51dGUuCisJCisJKiBnbGliL2RidXMtZ21haW4uYyAoYWRkX3RpbWVvdXQpOiB0aW1lb3V0IHN0dWZmIGRvZXNuJ3QgdXNlIHRoZQorCWN1c3RvbSBHU291cmNlLCBzbyBkb24ndCBwYXNzIGl0IGluOyBjb25mdXNpbmcKKwkoZ3NvdXJjZV9zZXJ2ZXJfZmluYWxpemUsIGdzb3VyY2VfY29ubmVjdGlvbl9maW5hbGl6ZSk6IGFkZAorCWZpbmFsaXplIGhhbmRsZXJzIHRoYXQgcmVtb3ZlIGFsbCB0aGUgd2F0Y2hlcy4JCisKKzIwMDUtMDEtMzAgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBnbGliL2RidXMtZ29iamVjdC5jIChpbnRyb3NwZWN0X3Byb3BlcnRpZXMpOiBmaXggdGhlIFhNTAorCWdlbmVyYXRlZAorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChkYnVzX21lc3NhZ2VfdW5yZWYpOiBhZGQgYW4gaW5fY2FjaGUgZmxhZworCXdoaWNoIGVmZmVjdGl2ZWx5IGRldGVjdHMgdGhlIHVzZSBvZiBmcmVlZCBtZXNzYWdlcworCisJKiBnbGliL2RidXMtZ29iamVjdC5jIChoYW5kbGVfaW50cm9zcGVjdCk6IG1vZGlmeSBhbmQgcmV0dXJuIHRoZQorCXJlcGx5IG1lc3NhZ2UgaW5zdGVhZCBvZiB0aGUgaW5jb21pbmcgbWVzc2FnZQorCisJKiBkYnVzL2RidXMtb2JqZWN0LXRyZWUuYyAoaGFuZGxlX2RlZmF1bHRfaW50cm9zcGVjdF91bmxvY2tlZCk6CisJZ2VlLCBtYXliZSBpdCBzaG91bGQgU0VORCBUSEUgWE1MIGluc3RlYWQgb2YganVzdCBtYWtpbmcgYSBzdHJpbmcKKwlhbmQgZnJlZWluZyBpdCBhZ2FpbiA7LSkKKworCSogdG9vbHMvZGJ1cy1wcmludC1tZXNzYWdlLmMgKHByaW50X21lc3NhZ2UpOiBpbXByb3ZlIHByaW50aW5nIG9mCisJbWVzc2FnZXMKKworCSogY29uZmlndXJlLmluOiBhZGQgZGVidWctZ2xpYi5zZXJ2aWNlIHRvIHRoZSBvdXRwdXQKKworMjAwNS0wMS0zMCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKyAgICAgICAgZGJ1cy12aWV3ZXIgaW50cm9zcGVjdGVkIGFuZCBkaXNwbGF5ZWQgdGhlIGJ1cyBkcml2ZXIKKwkKKwkqIGRidXMvZGJ1cy1vYmplY3QtdHJlZS5jIAorCShvYmplY3RfdHJlZV90ZXN0X2l0ZXJhdGlvbik6IGFkZCB0ZXN0cyBmb3IgYSBoYW5kbGVyIHJlZ2lzdGVyZWQgb24gIi8iCisKKwkqIGRidXMvZGJ1cy1vYmplY3QtdHJlZS5jCisJKF9kYnVzX2RlY29tcG9zZV9wYXRoKTogZml4IHRvIGhhbmRsZSBwYXRoICIvIiBwcm9wZXJseQorCShydW5fZGVjb21wb3NlX3Rlc3RzKTogYWRkIHRlc3RzIGZvciBwYXRoIGRlY29tcG9zaXRpb24KKwkKKwkqIGdsaWIvZGJ1cy1ndXRpbHMuYyAoX2RidXNfZ3V0aWxzX3NwbGl0X3BhdGgpOiBmaXggdG8gaGFuZGxlICIvIgorCXByb3Blcmx5CisKKwkqIGdsaWIvZGJ1cy1nb2JqZWN0LmMgKGhhbmRsZV9pbnRyb3NwZWN0KTogZml4IHF1b3RlcworCisJKiB0ZXN0L2dsaWIvcnVuLXRlc3Quc2g6IHN1cHBvcnQgbGF1bmNoaW5nIHRoZSBidXMsIHRoZW4gcnVubmluZworCWRidXMtdmlld2VyCisKKwkqIHRlc3QvZ2xpYi90ZXN0LXNlcnZpY2UtZ2xpYi5jIChtYWluKTogcHV0IGluIGEgdHJpdmlhbCBnb2JqZWN0CisJc3ViY2xhc3MgYW5kIHJlZ2lzdGVyIGl0IG9uIHRoZSBjb25uZWN0aW9uCisKKwkqIGJ1cy9kcml2ZXIuYyAoYnVzX2RyaXZlcl9oYW5kbGVfaW50cm9zcGVjdCk6IGltcGxlbWVudAorCWludHJvc3BlY3Rpb24gb2YgdGhlIGJ1cyBkcml2ZXIgc2VydmljZQorCisJKiBkYnVzL2RidXMtcHJvdG9jb2wuaDogYWRkICNkZWZpbmVzIGZvciB0aGUgWE1MIG5hbWVzcGFjZSwKKwlpZGVudGlmaWVycywgZG9jdHlwZSBkZWNsCisKKwkqIGJ1cy9kcml2ZXIuYyAoYnVzX2RyaXZlcl9oYW5kbGVfZ2V0X3NlcnZpY2Vfb3duZXIpOiBoYW5kbGUKKwlhdHRlbXB0cyB0byBnZXQgb3duZXIgb2YgREJVU19TRVJWSUNFX09SR19GUkVFREVTS1RPUF9EQlVTIGJ5IAorCXJldHVybmluZyB0aGUgc2VydmljZSB1bmNoYW5nZWQuCisJKGJ1c19kcml2ZXJfaGFuZGxlX21lc3NhZ2UpOiByZW1vdmUgb2xkIGNoZWNrIGZvciByZXBseV9zZXJpYWwgaW4KKwltZXRob2QgY2FsbHMsIG5vdyB0aGUgbWVzc2FnZSB0eXBlIGRlYWxzIHdpdGggdGhhdAorCShidXNfZHJpdmVyX2hhbmRsZV9tZXNzYWdlKTogaGFuZGxlIE5VTEwgaW50ZXJmYWNlCisKKwkqIGdsaWIvZGJ1cy1ncHJveHkuYyAoZGJ1c19nX3Byb3h5X2dldF9idXNfbmFtZSk6IG5ldyBmdW5jdGlvbgorCisJKiBnbGliL2RidXMtZ2xvYWRlci1leHBhdC5jIChkZXNjcmlwdGlvbl9sb2FkX2Zyb21fc3RyaW5nKTogYWxsb3cKKwktMSBmb3IgbGVuCisKKwkqIHRvb2xzL2RidXMtdmlld2VyLmM6IGFkZCBzdXBwb3J0IGZvciBpbnRyb3NwZWN0aW5nIGEgc2VydmljZSBvbgorCWEgYnVzCisKKwkqIGdsaWIvZGJ1cy1ncHJveHkuYyAoZGJ1c19nX3BlbmRpbmdfY2FsbF9yZWYpOiBhZGQKKwkoZGJ1c19nX3BlbmRpbmdfY2FsbF91bnJlZik6IGFkZAorCisyMDA1LTAxLTI5ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogdG9vbHMvZGJ1cy10cmVlLXZpZXcuYzogYWRkIHN1cHBvcnQgZm9yIGRpc3BsYXlpbmcgcHJvcGVydGllcy4KKwkocnVuIGRidXMtdmlld2VyIHdpdGggYW4gaW50cm9zcGVjdCB4bWwgZmlsZSBhcyBhcmcsIHRoZW4gcmVzaXplCisJdGhlIHdpbmRvdyBzbyB0aGUgdHJlZSBlbGVtZW50cyBzaG93IHVwLCBub3Qgc3VyZSB3aGF0IHRoYXQgaXMpCisKKwkqIGdsaWIvZGJ1cy1nb2JqZWN0LmMgKGhhbmRsZV9pbnRyb3NwZWN0KTogcmV0dXJuCisJb3JnLmZyZWVkZXNrdG9wLlByb3BlcnRpZXMgYW5kIG9yZy5mcmVlZGVza3RvcC5JbnRyb3NwZWN0YWJsZQorCWludGVyZmFjZXMgd2hlbiB3ZSBhcmUgaW50cm9zcGVjdGVkLgorCisJKiBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnhtbDogYWxsb3cgZW1wdHkgaW50ZXJmYWNlIG5hbWUgd2hlbiAKKwlHZXQvU2V0IGEgcHJvcGVydHkKKworMjAwNS0wMS0yOSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGdsaWIvTWFrZWZpbGUuYW06IHJlbmFtZSBkYnVzLWdsaWItdG9vbCB0byBkYnVzLWJpbmRpbmctdG9vbDsKKwl0aG91Z2ggaXQgdXNlcyBnbGliLCBpdCBjb3VsZCBiZSBleHRlbmRlZCBmb3IgYW55IGJpbmRpbmcgaW4KKwlwcmluY2lwbGUKKworCSogZ2xpYi9kYnVzLWdvYmplY3QuYyAoZ29iamVjdF9tZXNzYWdlX2Z1bmN0aW9uKTogY2hhbmdlIHRvIHRoZQorCW5ldyB3YXkgcHJvcGVydGllcyB3b3JrCisKKwkqIGRidXMvZGJ1cy1wcm90b2NvbC5oOiBhZGQgdGhlIG5ldyBpbnRlcmZhY2VzCisKKwkqIGRvYy9kYnVzLXNwZWNpZmljYXRpb24ueG1sOiBkb2N1bWVudCB0aGUgaW50cm9zcGVjdGlvbiBmb3JtYXQsCisJSW50cm9zcGVjdGFibGUgaW50ZXJmYWNlLCBhbmQgYWRkIGFuIG9yZy5mcmVlZGVza3RvcC5Qcm9wZXJ0aWVzCisJaW50ZXJmYWNlLgorCisJKiBnbGliL2RidXMtZ3BhcnNlci5jOiBhZGQgc3VwcG9ydCBmb3IgYSA8cHJvcGVydHk+IGVsZW1lbnQKKworCSogZ2xpYi9kYnVzLWdpZGwuYzogYWRkIFByb3BlcnR5SW5mbworCisJKiBnbGliL2RidXMtZ29iamVjdC5jIChoYW5kbGVfaW50cm9zcGVjdCk6IHB1dCB0aGUgb3V0ZXJtb3N0CisJPG5vZGU+IG91dHNpZGUgdGhlIHNpZ25hbCBhbmQgcHJvcGVydHkgZGVzY3JpcHRpb25zLgorCShpbnRyb3NwZWN0X3Byb3BlcnRpZXMpOiBleHBvcnQgcHJvcGVydGllcyBhcyA8cHJvcGVydHk+IHJhdGhlcgorCXRoYW4gYXMgbWV0aG9kIGNhbGxzCisKKzIwMDUtMDEtMjggIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkb2MvVE9ETywgZG9jL2RidXMtc3BlY2lmaWNhdGlvbi54bWw6IHNwZWMgYW5kIFRPRE8gdHdlYWtzCisJcmVsYXRlZCB0byBhdXRoZW50aWNhdGlvbiBwcm90b2NvbAorCisyMDA1LTAxLTI4ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBweXRob24vZGJ1c19iaW5kaW5ncy5weXguaW46IFVwZGF0ZWQgdG8gaGFuZGxlIG5ldyBELUJVUyB0eXBlIHN5c3RlbQorCQktIEJVU19BQ1RJVkFUSU9OIC0+IEJVU19TVEFSVEVSCisJCS0gREJVU19CVVNfQUNUSVZBVElPTiAtPiBEQlVTX0JVU19TVEFSVEVSCisJCS0gY2xhc3MgTWVzc2FnZUl0ZXIgKF9faW5pdF9fKTogQWRkZWQgcmVjdXJzaW9uIGNoZWNraW5nIAorCQlzbyB3ZSB0aHJvdyBhIG5pY2UgZXJyb3IgaW5zdGVhZCBvZiBqdXN0IGRpc2Nvbm5lY3RpbmcgZnJvbSB0aGUKKwkJYnVzLgorCQkoZ2V0KTogQWRkZWQgYXJnX3R5cGUgcGFyYW1ldGVyIGZvciByZWN1cnNpb24uCisJCVJlbW92ZWQgdGhlIG5pbCB0eXBlCisJCUFkZGVkIHNpZ25pdHVyZSB0eXBlIHBsYWNlaG9sZGVyIChub3QgaW1wbGVtZW50ZWQpCisJCUFkZGVkIHN0cnVjdCB0eXBlIHBsYWNlaG9sZGVyIChub3QgaW1wbGVtZW50ZWQpCisJCUFkZGVkIHZhcmllbnQgdHlwZSBwbGFjZWhvbGRlciAobm90IGltcGxlbWVudGVkKQorCQlDb21tZW50ZWQgb3V0IGRpY3QgdHlwZSBmb3Igbm93CSAgICAKKwkJKGdldF9lbGVtZW50X3R5cGUpOiByZW5hbWVkIGZyb20gZ2V0X2FycmF5X3R5cGUKKwkJKGdldF8qKTogY2hhbmdlZCB0byB1c2UgdGhlIGRidXNfbWVzc2FnZV9pdGVyX2dldF9iYXNpYyBBUEkKKwkJKGdldF8qX2FycmF5KTogcmVtb3ZlZCBpbiBmYXZvciBvZiByZWN1cnNpdmUgZ2V0X2FycmF5IG1ldGhvZAorCQkoZ2V0X2FycmF5KTogbmV3IHJlY3Vyc2l2ZSBtZXRob2Qgd2hpY2ggY2FsbHMgZ2V0IHRvIG1hcnNoYWwKKwkgICAgICAgIHRoZSBlbGVtZW50cyBvZiB0aGUgYXJyYXkKKwkJKHZhbHVlX3RvX2RidXNfc2lnKTogTmV3IG1ldGhvZCByZXR1cm5zIHRoZSBjb3JyYXNwb25kaW5nCisJCWRidXMgc2lnbml0dXJlIHRvIGEgcHl0aG9uIHZhbHVlCisJCShhcHBlbmQpOiBDb21tZW50IG91dCBkaWN0IGhhbmRsaW5nIGZvciBub3cKKwkJSGFuZGxlIGxpc3RzIHdpdGggdGhlIG5ldyByZWN1cnNpdmUgQVBJCisJCUNvbW1lbnQgb3V0IE5vbmUgaGFuZGxpbmcgZm9yIG5vdworCQkoYXBwZW5kX25pbCk6IHJlbW92ZWQKKwkJKGFwcGVuZF8qKTogY2hhbmdlZCB0byB1c2UgZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljIEFQSQorCQkoYXBwZW5kXypfYXJyYXkpOiByZW1vdmVkIGluIGZhdm9yIG9mIHJlY3Vyc2l2ZSBhcHBlbmRfYXJyYXkgCisJCW1ldGhvZAorCQkoX19zdHJfXyk6IE1ha2UgaXQgZWFzaWVyIHRvIHByaW50IG91dCByZWN1cnNpdmUgaXRlcmF0b3JzCisJCWZvciBkZWJ1Z2dpbmcKKwkJLSBjbGFzcyBNZXNzYWdlIChfX3N0cl9fKTogbW92ZWQgdHlwZSBpbnNwZWN0aW9uIHRvIHRoZQorCQlNZXNzYWdlSXRlciBjbGFzcycgX19zdHJfXyBtZXRob2QKKwkJKGdldF9pdGVyKTogQWRkZWQgYW4gYXBwZW5kIHBhcmFtZXRlciB3aWNoIGRlZmF1bHRzIHRvIEZhbHNlCisJCUlmIFRydWUgdXNlIHRoZSBuZXcgQVBJJ3MgdG8gY3JlYXRlIGFuIGFwcGVuZCBpdGVyYXRvcgorCisJKiBweXRob24vZGJ1cy5weTogVXBkYXRlIHRvIHVzZSBuZXcgYmluZGluZ3MgQVBJCisJCS0gVFlQRV9BQ1RJVkFUSU9OIC0+IFRZUEVfU1RBUlRFUgorCQktIGNsYXNzIEJ1cyAoX2dldF9tYXRjaF9ydWxlKTogR2V0U2VydmljZU93bmVyIC0+IEdldE5hbWVPd25lcgorCQktIGNsYXNzIEFjdGl2YXRpb25CdXMgLT4gY2xhc3MgU3RhcnRlckJ1cworCQktIGNsYXNzIFJlbW90ZU9iamVjdCAoX19jYWxsX18pOiBnZXQgYW4gYXBwZW5kIGl0ZXJhdG9yCisJCS0gKF9kaXNwYXRjaF9kYnVzX21ldGhvZF9jYWxsKTogZ2V0IGFuIGFwcGVuZCBpdGVyYXRvcgorCQktIGNsYXNzIE9iamVjdCAoZW1pdF9zaWduYWwpOiBnZXQgYW4gYXBwZW5kIGl0ZXJhdG9yCisKKwkqIHB5dGhvbi9leGFtcGxlcy86IEZpeGVkIHVwIHRoZSBleGFtcGxlcyB0byB3b3JrIHdpdGggdGhlIG5ldyBBUEkKKwkJCisyMDA1LTAxLTI4ICBKb2UgU2hhdyAgPGpvZXNoYXdAbm92ZWxsLmNvbT4KKworCSogY29uZmlndXJlLmluOiBCdW1wIHZlcnNpb24gdXAgdG8gMC4zMC4KKworCSogSEFDS0lORzogQWRkIGEgcmVsZWFzZSBpdGVtIHRvIGJ1bXAgdGhlIHZlcnNpb24gbnVtYmVyIHVwIGFmdGVyIAorCWEgcmVsZWFzZS4KKworMjAwNS0wMS0yOCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRvYy9kYnVzLXNwZWNpZmljYXRpb24ueG1sOiB1cGRhdGUgdG8gZGVzY3JpYmUgMTYtYml0IHR5cGVzIGFuZAorCWRpY3QgZW50cmllcworCisJKiBkYnVzL2RidXMtbWFyc2hhbC1iYXNpYy5jIChfZGJ1c191bnBhY2tfdWludDE2KTogZml4IGJyb2tlbgorCWFzc2VydGlvbgorCisJKiBkYnVzL2RidXMtcHJvdG9jb2wuaCAoREJVU19UWVBFX0RJQ1RfRU5UUlkpOiBhZGQgRElDVF9FTlRSWSBhcyBhCisJdHlwZQorCisJKiBkYnVzL2RidXMtbWFyc2hhbC1yZWN1cnNpdmUuYzogaW1wbGVtZW50CisKKzIwMDUtMDEtMjcgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtYXJjaC1kZXBzLmguaW46IGFkZCAxNi8zMi1iaXQgdHlwZXMKKworCSogY29uZmlndXJlLmluOiBmaW5kIHRoZSByaWdodCB0eXBlIGZvciAxNiBhbmQgMzIgYml0IGludHMgYXMgd2VsbAorCWFzIDY0CisKKwkqIGRidXMvZGJ1cy1wcm90b2NvbC5oIChEQlVTX1RZUEVfSU5UMTYsIERCVVNfVFlQRV9VSU5UMTYpOiBhZGQKKwl0aGUgMTYtYml0IHR5cGVzIHNvIHBlb3BsZSBkb24ndCBoYXZlIHRvIHN0dWZmIHRoZW0gaW4gMzItYml0IG9yCisJYnl0ZSBhcnJheXMuCisKKzIwMDUtMDEtMjcgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisgICAgICAgICogZGJ1cy9kYnVzLW1lc3NhZ2UuYzogYnl0ZXN3YXAgdGhlIG1lc3NhZ2UgaWYgeW91IGluaXQgYW4KKwlpdGVyYXRvciB0byByZWFkL3dyaXRlIGZyb20gaXQKKwkKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLWJ5dGVzd2FwLmM6IG5ldyBmaWxlIGltcGxlbWVudGluZyAKKwlfZGJ1c19tYXJzaGFsX2J5dGVzd2FwKCkKKworCSogZGJ1cy9kYnVzLW1hcnNoYWwtYmFzaWMuYzogYWRkIF9kYnVzX3N3YXBfYXJyYXkoKQorCisyMDA1LTAxLTI2ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKwkKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLXZhbGlkYXRlLXV0aWwuYzogYnJlYWsgdGhpcyBvdXQgKGFuZCBmaXgKKwlidWlsZCwgYXBwYXJlbnRseSAtIG5vYm9keSBub3RpY2VkPykKKwkKKzIwMDUtMDEtMjYgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtbWFyc2hhbC1yZWN1cnNpdmUuaDogcmVtb3ZlIHRvZG8gY29tbWVudAorCisyMDA1LTAxLTI1ICBKb2UgU2hhdyAgPGpvZXNoYXdAbm92ZWxsLmNvbT4KKworCSogTGFuZCB0aGUgbW9ubyBiaW5kaW5nIGNoYW5nZXMgdG8gY29uZm9ybSB0byB0aGUgbmV3IEFQSXMuCisKKwkqIG1vbm8vTWFrZWZpbGUuYW06IFJlbW92ZSBDdXN0b20uY3MsIERCdXNUeXBlL0N1c3RvbS5jcywKKwlEQnVzVHlwZS9EaWN0LmNzLCBhbmQgREJ1c1R5cGUvTmlsLmNzIGZyb20gdGhlIGJ1aWxkLgorCisJKiBtb25vL0FyZ3VtZW50cy5jcyAoR2V0Q29kZUFzU3RyaW5nKTogQWRkZWQuICBSZXR1cm5zIHRoZSBkYnVzCisJdHlwZSBjb2RlIGFzIGEgc3RyaW5nLgorCShJbml0QXBwZW5kaW5nKTogUmVuYW1lIGRidXNfbWVzc2FnZV9hcHBlbmRfaXRlcl9pbml0KCkgdG8KKwlkYnVzX21lc3NhZ2VfaXRlcl9pbml0X2FwcGVuZCgpLgorCisJKiBtb25vL0J1c0RyaXZlci5jczogUmVuYW1lIFNlcnZpY2VFdmVudEhhbmRsZXIgdG8KKwlOYW1lT3duZXJDaGFuZ2VkSGFuZGxlci4gIFJlbmFtZSBHZXRTZXJ2aWNlT3duZXIgdG8gR2V0T3duZXIuCisJUmVuYW1lIFNlcnZpY2VPd25lckNoYW5nZWQgdG8gTmFtZU93bmVyQ2hhbmdlZC4KKworCSogbW9uby9Db25uZWN0aW9uLmNzOiBSZW5hbWUgQmFzZVNlcnZpY2UgdG8gVW5pcXVlTmFtZSwgYW5kIHRoZQorCXVuZGVybHlpbmcgQyBjYWxsLgorCisJKiBtb25vL0N1c3RvbS5jczogUmVtb3ZlZC4gIFRoZSBDVVNUT00gdHlwZSBoYXMgYmVlbiByZW1vdmVkLgorCisJKiBtb25vL1NlcnZpY2UuY3M6IFJlbmFtZSBFeGlzdHMgdG8gSGFzT3duZXIsIGludGVybmFsbHkgcmVuYW1lCisJZGJ1c19idXNfYWNxdWlyZV9zZXJ2aWNlKCkgdG8gZGJ1c19idXNfcmVxdWVzdF9uYW1lKCkuCisKKwkqIG1vbm8vREJ1c1R5cGUvQXJyYXkuY3MgKGN0b3IpOiBVc2UgVHlwZS5HZXRFbGVtZW50VHlwZSgpIGluc3RlYWQKKwlvZiBUeXBlLlVuZGVybHlpbmdTeXN0ZW1UeXBlIHRvIGdldCB0aGUgY29ycmVjdCBlbGVtZW50IHR5cGUgZm9yCisJdGhlIGFycmF5LgorCShjdG9yKTogVXBkYXRlIGNvZGUgZm9yIG5ldyBBUElzOiB1c2UgZGJ1c19tZXNzYWdlX2l0ZXJfcmVjdXJzZSgpLAorCWRidXNfbWVzc2FnZV9nZXRfe2VsZW1lbnR8YXJnfV90eXBlKCkgaW5zdGVhZCBvZgorCWRidXNfbWVzc2FnZV9pdGVyX2luaXRfYXJyYXlfaXRlcmF0b3IoKS4KKwkoQXBwZW5kKTogUmVwbGFjZSBkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfYXJyYXkoKSB3aXRoCisJZGJ1c19tZXNzYWdlX2l0ZXJfb3Blbl9jb250YWluZXIoKSBhbmQKKwlkYnVzX21lc3NhZ2VfaXRlcl9jbG9zZV9jb250YWluZXIoKS4KKworCSogbW9uby9EQnVzVHlwZS9DdXN0b20uY3MsIG1vbm8vREJ1c1R5cGUvTmlsLmNzOiBSZW1vdmVkLiAgVGhlc2UKKwl0eXBlcyBoYXZlIGJlZW4gcmVtb3ZlZC4KKwkKKwkqIG1vbm8vREJ1c1R5cGUvKi5jczogUmVwbGFjZSBjYWxscyBvZgorCWRidXNfbWVzc2FnZV9pdGVyX2dldF9bdHlwZV0oKSB0byBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYmFzaWMoKSwKKwlidXQgc3BlY2lmeSB0aGUgdHlwZSBpbiB0aGUgRGxsSW1wb3J0IGV4dGVybiBkZWNsYXJhdGlvbi4gIERpdHRvCisJZm9yIGRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9bdHlwZV0oKSAtPgorCWRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYygpLgorCisJKiBtb25vL2V4YW1wbGUvQnVzTGlzdGVuZXIuY3M6IFVwZGF0ZSBmb3IgU2VydmljZUV2ZW50SGFuZGxlciAtPgorCU5hbWVPd25lckNoYW5nZWRIYW5kbGVyLgorCisyMDA1LTAxLTI1ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBweXRob24vZGJ1c19iaW5kaW5ncy5weXguaW46IFJlbmFtZSBvZiBtZXRob2RzIGFuZCBiaW5kaW5ncworCQktIGdldF9iYXNlX3NlcnZpY2UgLT4gZ2V0X3VuaXF1ZV9uYW1lCisJCS0gYnVzX2dldF9iYXNlX3NlcnZpY2UgLT4gYnVzX2dldF91bmlxdWVfbmFtZQorCQktIGRidXNfYnVzX2dldF9iYXNlX3NlcnZpY2UgLT4gZGJ1c19idXNfZ2V0X3VuaXF1ZV9uYW1lCisJCS0gQUNUSVZBVElPTl9SRVBMWV9BQ1RJVkFURUQgLT4gREJVU19TVEFSVF9SRVBMWV9TVUNDRVNTIAorCQktIEFDVElWQVRJT05fUkVQTFlfQUxSRUFEWV9BQ1RJVkUgLT4gREJVU19TVEFSVF9SRVBMWV9BTFJFQURZX1JVTk5JTkcKKwkJLSBidXNfYWN0aXZhdGVfc2VydmljZSAtPiBidXNfc3RhcnRfc2VydmljZV9ieV9uYW1lCisJCS0gZGJ1c19idXNfYWN0aXZhdGVfc2VydmljZSAtPiBkYnVzX2J1c19zdGFydF9zZXJ2aWNlX2J5X25hbWUKKwkJLSBidXNfYWNxdWlyZV9zZXJ2aWNlIC0+IGJ1c19yZXF1ZXN0X25hbWUKKwkJLSBkYnVzX2J1c19hY3F1aXJlX3NlcnZpY2UgLT4gZGJ1c19idXNfcmVxdWVzdF9uYW1lCisJCS0gYnVzX3NlcnZpY2VfZXhpc3RzIC0+IGJ1c19uYW1lX2hhc19vd25lcgorCQktIGRidXNfYnVzX3NlcnZpY2VfZXhpc3RzIC0+IGRidXNfYnVzX25hbWVfaGFzX293bmVyCisKKwkqIHB5dGhvbi9kYnVzLnB5OiBSZW5hbWUgb2YgbWV0aG9kcworCQktIGFjdGl2YXRlX3NlcnZpY2UgLT4gc3RhcnRfc2VydmljZV9ieV9uYW1lCisJCS0gYnVzX2FjcXVpcmVfc2VydmljZSAtPiBidXNfcmVxdWVzdF9uYW1lCisJCS0gQUNUSVZBVElPTl9SRVBMWV9BQ1RJVkFURUQgLT4gU1RBUlRfUkVQTFlfU1VDQ0VTUyAKKwkJLSBBQ1RJVkFUSU9OX1JFUExZX0FMUkVBRFlfQUNUSVZFIC0+IFNUQVJUX1JFUExZX0FMUkVBRFlfUlVOTklORworCisJCisyMDA1LTAxLTI0ICBKb2UgU2hhdyAgPGpvZXNoYXdAbm92ZWxsLmNvbT4KKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYyAoZGJ1c19jb25uZWN0aW9uX2Rpc3BhdGNoKTogUHJpbnQgb3V0IHRoZQorCXNpZ25hdHVyZSBmb3IgdGhlIG1ldGhvZCB0aGF0IGNhbid0IGJlIGZvdW5kLgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChkYnVzX21lc3NhZ2VfaXRlcl9pbml0KTogVG8gY2hlY2sgdG8gc2VlIGlmCisJdGhlIG1lc3NhZ2UgaGFzIGFueSBhcmd1bWVudHMsIHdlIG5lZWQgdG8gY2FsbAorCV9kYnVzX3R5cGVfcmVhZGVyX2dldF9jdXJyZW50X3R5cGUoKSwgbm90CisJX2RidXNfdHlwZV9yZWFkZXJfaGFzX25leHQoKS4KKworMjAwNS0wMS0yNCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLWZhY3RvcnkuYzogbW9yZSB0ZXN0aW5nIG9mIG1lc3NhZ2UgdmFsaWRhdGlvbgorCisJKiBkYnVzL2RidXMtcHJvdG9jb2wuaCAoREJVU19NSU5JTVVNX0hFQURFUl9TSVpFKTogbW92ZSB0byB0aGlzCisJaGVhZGVyCisKKzIwMDUtMDEtMjMgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS1mYWN0b3J5LmMsIGRidXMvZGJ1cy1tZXNzYWdlLXV0aWwuYzogCisJZ2V0IHRoaXMgYWxsIHdvcmtpbmcsIG5vdCBtYW55IHRlc3RzIGluIHRoZSBmcmFtZXdvcmsgeWV0IHRob3VnaAorCisyMDA1LTAxLTIyICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZG9jL2RidXMtZmFxLnhtbCwgZG9jL2RidXMtdHV0b3JpYWw6IGFkZCBhIEZBUSBhbmQgdXBkYXRlCisJdHV0b3JpYWwsIGJhc2VkIG9uIHdvcmsgZnJvbSBEYXZpZCBXaGVlbGVyLgorCisyMDA1LTAxLTIxICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLWJ1cy5jOiBhZGQgbW9yZSByZXR1cm5faWZfZmFpbCBjaGVja3MKKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAobG9hZF9tZXNzYWdlKTogaGF2ZSB0aGUgIm5vIHZhbGlkYXRpb24iCisJbW9kZSAoaGF2ZSB0byBlZGl0IHRoZSBjb2RlIHRvIHRvZ2dsZSB0aGUgbW9kZSBmb3Igbm93IHRob3VnaCkKKworCSogZGJ1cy9kYnVzLW1hcnNoYWwtaGVhZGVyLmMgKF9kYnVzX2hlYWRlcl9sb2FkKTogaGF2ZSBhIG1vZGUgdGhhdAorCXNraXBzIGFsbCB2YWxpZGF0aW9uOyBJIHdhbnQgdG8gdXNlIHRoaXMgYXQgbGVhc3QgZm9yIGJlbmNobWFyaworCWJhc2VsaW5lLCBJJ20gbm90IHN1cmUgaWYgaXQgc2hvdWxkIGJlIGEgcHVibGljbHktYXZhaWxhYmxlIHN3aXRjaC4KKworMjAwNS0wMS0yMSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGdsaWIvZGJ1cy1nbWFpbi5jOiBkb24ndCBwdXQgdGhlIEdMaWIgYmluZGluZ3MgaW4gdGhlIHNhbWUKKwl0b3BsZXZlbCBkb3h5Z2VuIGdyb3VwIGFzIHRoZSBsb3ctbGV2ZWwgQVBJIHN0dWZmCisKKwkqIGRidXMvZGJ1cy5oOiBub3RlIHRoYXQgbGliZGJ1cyBpcyB0aGUgbG93LWxldmVsIEFQSQorCisyMDA1LTAxLTIwICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogdXBkYXRlLWRidXMtZG9jcy5zaDogc2NyaXB0IHRvIHVwZGF0ZSBkb2NzIG9uIHRoZSB3ZWIgc2l0ZSwgb25seQorCXdvcmtzIGZvciBtZSB0aG91Z2guIG5lZW5lci4KKworMjAwNS0wMS0yMCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMgKF9kYnVzX3BvbGwpOiBhbWF6aW5nbHksIHRyeWluZyB0byBjb21waWxlCisJY29kZSBjYW4gcmV2ZWFsIGJ1Z3MgaW4gaXQKKworMjAwNS0wMS0yMCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMgKF9kYnVzX3BvbGwpOiBmaXggc2V2ZXJhbCBidWdzIGluIHRoZQorCXNlbGVjdCgpIHZlcnNpb24sIHBhdGNoZXMgZnJvbSBUb3IgTGlsbHF2aXN0CisKKzIwMDUtMDEtMjAgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkb2MvZGJ1cy10dXRvcmlhbC54bWw6IHJlcGxhY2UgPiB3aXRoICZndDsKKworCSogYnVzL3NlcnZpY2VzLmMgKGJ1c19yZWdpc3RyeV9hY3F1aXJlX3NlcnZpY2UpOiB2YWxpZGF0ZSB0aGUgbmFtZQorCWFuZCByZXR1cm4gYSBiZXR0ZXIgZXJyb3IgaWYgaXQncyBubyBnb29kLgorCisJKiBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnhtbDogbm90ZSBOT19BVVRPX1NUQVJUIGNoYW5nZQorCisJKiBkYnVzL2RidXMtcHJvdG9jb2wuaCAoREJVU19IRUFERVJfRkxBR19OT19BVVRPX1NUQVJUKTogY2hhbmdlCisJZnJvbSBBVVRPX1NUQVJULCB3ZSdyZSB0b2dnbGluZyB0aGUgZGVmYXVsdAorCisJKiBidXMvZGlzcGF0Y2guYzogYWRhcHQgdGhlIHRlc3RzIHRvIGNoYW5nZSBvZiBhdXRvLXN0YXJ0IGRlZmF1bHQKKworMjAwNS0wMS0xOCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIHJlbmFtZSBkYnVzLWRhZW1vbi0xIHRvIGRidXMtZGFlbW9uIHRocm91Z2hvdXQKKworMjAwNS0wMS0xOCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKyAgICAgICAgKiBUaHJvdWdob3V0LCBncmFuZCByZW5hbWluZyB0byBzdHJpcCBvdXQgdGhlIHVzZSBvZiAic2VydmljZSIsCisJanVzdCBzYXkgIm5hbWUiIGluc3RlYWQgKG9yICJidXMgbmFtZSIgd2hlbiBhbWJpZ3VvdXMpLiAgRGlkIG5vdAorCWNoYW5nZSB0aGUgaW50ZXJuYWwgY29kZSBvZiB0aGUgbWVzc2FnZSBidXMgaXRzZWxmLCBvbmx5IHRoZQorCXByb2dyYW1tZXItZmFjaW5nIEFQSSBhbmQgbWVzc2FnZXMuCisJCisJKiBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnhtbDogZnVydGhlciB1cGRhdGUgdGhlIG1lc3NhZ2UgYnVzIHNlY3Rpb24KKwkKKwkqIGJ1cy9jb25maWctcGFyc2VyLmMgKGFsbF9hcmVfZXF1aXYpOiBmaXggYnVnIHVzaW5nIGZyZWVkIHN0cmluZworCWluIGVycm9yIGNhc2UKKworMjAwNS0wMS0xNyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy10eXBlcy5oOiByZW1vdmUgMTYtYml0IHR5cGVzIHNpbmNlIHdlIGRvbid0IHVzZSB0aGVtCisJZXZlcgorCisJKiBkYnVzL2RidXMtbWFyc2hhbC12YWxpZGF0ZS5jIChfZGJ1c192YWxpZGF0ZV9wYXRoKTogZGlzYWxsb3cgYW55CisJImludmFsaWQgbmFtZSBjaGFyYWN0ZXIiIG5vdCBvbmx5IG5vbi1BU0NJSQorCisJKiBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnhtbDogZnVydGhlciB1cGRhdGUgc3BlYywgbWVzc2FnZSBidXMgCisJcGFydHMgYXJlIHN0aWxsIG91dC1vZi1kYXRlIGJ1dCB0aGUgbWFyc2hhbGluZyBldGMuIHN0dWZmIGlzIG5vdworCWFjY3VyYXRlLWlzaAorCisyMDA1LTAxLTE3ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZG9jL2RidXMtc3BlY2lmaWNhdGlvbi54bWw6IHBhcnRpYWxseSB1cGRhdGUgc3BlYworCisyMDA1LTAxLTE3ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworICAgICAgICAqIFRocm91Z2hvdXQsIGFsaWduIHZhcmlhbnQgYm9kaWVzIGFjY29yZGluZyB0byB0aGUgY29udGFpbmVkCisJdHlwZSwgcmF0aGVyIHRoYW4gYWx3YXlzIHRvIDguIFNob3VsZCBzYXZlIGEgZmFpciBiaXQgb2Ygc3BhY2UgaW4KKwltZXNzYWdlIGhlYWRlcnMuCisJCisJKiBkYnVzL2RidXMtbWFyc2hhbC12YWxpZGF0ZS5jIChfZGJ1c192YWxpZGF0ZV9ib2R5X3dpdGhfcmVhc29uKToKKwlmaXggaGFuZGxpbmcgb2YgY2FzZSB3aGVyZSBwID09IGVuZAorCisJKiBkb2MvVE9ETzogcmVtb3ZlIHRoZSBkYnVzX2Jvb2xfdCBpdGVtIGFuZCB2YXJpYW50IGFsaWdubWVudCBpdGVtcworCisyMDA1LTAxLTE3ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLXR5cGVzLmg6IGhhcmRjb2RlIGRidXNfYm9vbF90IHRvIDMyIGJpdHMKKworCSogVGhyb3VnaG91dDogbW9kaWZ5IERCVVNfVFlQRV9CT09MRUFOIHRvIGJlIGEgMzItYml0IHR5cGUgaW5zdGVhZAorCW9mIGFuIDgtYml0IHR5cGUuIE5vdyBkYnVzX2Jvb2xfdCBpcyB0aGUgdHlwZSB0byB1c2Ugd2hlbmV2ZXIgeW91IAorCWFyZSBtYXJzaGFsaW5nL3VubWFyc2hhbGluZyBhIGJvb2xlYW4uCisKKzIwMDUtMDEtMTYgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisgICAgICAgIFRoaXMgaXMgYWJvdXQgaXQgb24gd2hhdCBjYW4gYmUgZGlzYWJsZWQvZGVsZXRlZCBmcm9tIGxpYmRidXMKKwllYXNpbHksIGJhY2sgYmVsb3cgMTUwSyBhbnlob3cuIERlZXBlciBjdXRzIGFyZSBtb3JlIHdvcmsgdGhhbiAKKwlqdXN0IHR1cm5pbmcgdGhlIGNvZGUgb2ZmIGFzIEkndmUgZG9uZSBoZXJlLgorCQorCSogZGJ1cy9kYnVzLW1hcnNoYWwtYmFzaWMuYyAoX2RidXNfcGFja19pbnQzMik6IHdlIGRvbid0IG5lZWQgdGhlCisJc2lnbmVkIGludCBjb252ZW5pZW5jZSBmdW5jcworCisJKiBkYnVzL2RidXMtaW50ZXJuYWxzLmMgKF9kYnVzX3ZlcmJvc2VfcmVhbCk6IG9taXQgd2hlbiBub3QgaW4KKwl2ZXJib3NlIG1vZGUKKworCSogZGJ1cy9kYnVzLXN0cmluZy11dGlsLmMsIGRidXMvZGJ1cy1zdHJpbmcuYzogbW9yZSBicmVha2luZworCXRoaW5ncyBvdXQgb2YgbGliZGJ1cworCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jLCBkYnVzL2RidXMtc3lzZGVwcy11dGlsLmM6IHNhbWUKKwkKKwkqIGRidXMvZGJ1cy1oYXNoLmM6IHB1cmdlIHRoZSBUV09fU1RSSU5HUyBjcmFwICh3ZWxsLCBtYWtlIGl0CisJdGVzdHMtZW5hYmxlZC1vbmx5LCB0aG91Z2ggaXQgc2hvdWxkIHByb2JhYmx5IGJlIGRlbGV0ZWQpCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLXV0aWwuYzogc2FtZSBzdHVmZgorCisJKiBkYnVzL2RidXMtYXV0aC11dGlsLmM6IHNhbWUgc3R1ZmYKKworMjAwNS0wMS0xNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy11c2VyZGItdXRpbC5jOiBzcGxpdCBvdXQgcGFydCBvZiBkYnVzLXVzZXJkYi5jCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMgKF9kYnVzX3VpZF9mcm9tX3N0cmluZyk6IG1vdmUgaGVyZSB0byBwYXZlCisJd2F5IGZvciBzdHJpcHBpbmcgZG93biBkYnVzLXVzZXJkYi5jIHN0dWZmIGluY2x1ZGVkIGluIGxpYmRidXMuCisJUmVuYW1lIF9kYnVzX3BhcnNlX3VpZCBmb3IgY29uc2lzdGVuY3kuCisKKzIwMDUtMDEtMTYgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtaW50ZXJuYWxzLmMgKF9kYnVzX3JlYWxfYXNzZXJ0KTogcHJpbnQgdGhlIGZ1bmN0aW9uCisJbmFtZSB0aGUgYXNzZXJ0aW9uIGZhaWxlZCBpbgorCisJKiBkYnVzL2RidXMtaW50ZXJuYWxzLmggKF9kYnVzX3JldHVybl9pZl9mYWlsKSAKKwkoX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsKTogYXNzZXJ0IHRoYXQgdGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uCisJY29udGFpbmluZyB0aGUgY2hlY2sgZG9lc24ndCBzdGFydCB3aXRoICdfJywgc2luY2Ugd2Ugb25seSB3YW50IHRvIAorCXVzZSBjaGVja3Mgb24gcHVibGljIGZ1bmN0aW9ucworCQorCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYyAoX2RidXNfY29ubmVjdGlvbl9yZWZfdW5sb2NrZWQpOiBjaGFuZ2UKKwljaGVja3MgdG8gYXNzZXJ0aW9ucworCisJKiBkYnVzL2RidXMtbWFyc2hhbC1oZWFkZXIuYyAoX2RidXNfaGVhZGVyX3NldF9maWVsZF9iYXNpYyk6CisJY2hhbmdlIGNoZWNrcyB0byBhc3NlcnRzIGZvciBwcml2YXRlIGZ1bmN0aW9uCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKF9kYnVzX21lc3NhZ2Vfc2V0X3NlcmlhbCk6IGNoZWNrcworCXRvIGFzc2VydHMgZm9yIHByaXZhdGUgZnVuY3Rpb24KKworCSogZGJ1cy9kYnVzLW1hcnNoYWwtcmVjdXJzaXZlLmMgKHNraXBfb25lX2NvbXBsZXRlX3R5cGUpOiByZW1vdmUKKwlicm9rZW4gYXNzZXJ0aW9uIHRoYXQgd2FzIGJyZWFraW5nIG1ha2UgY2hlY2sKKwkoX2RidXNfdHlwZV9yZWFkZXJfYXJyYXlfaXNfZW1wdHkpOiByZW1vdmUgdGhpcyByYXRoZXIgdGhhbiBmaXgKKwlpdCwgd2FzIG9ubHkgdXNlZCBpbiBhc3NlcnRpb25zCisKKzIwMDUtMDEtMTYgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiB0ZXN0L3VudXNlZC1jb2RlLWdjLnB5OiBoYWNreSBzY3JpcHQgdG8gZmluZCBjb2RlIHRoYXQncyB1c2VkCisJb25seSBieSB0aGUgYnVzIChub3QgbGliZGJ1cykgb3IgdXNlZCBvbmx5IGJ5IHRlc3RzIG9yIG5vdCB1c2VkIGF0CisJYWxsLiBJdCBoYXMgc29tZSBmYWxzZSBhbGFybXMsIGJ1dCBsb29rcyBsaWtlIHdlIGNhbiBjbGVhbiB1cCBhCisJbG90IG9mIHNpemUgZnJvbSBsaWJkYnVzLgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jLCBkYnVzL2RidXMtc3lzZGVwcy11dGlscy5jLAorCWRidXMvTWFrZWZpbGUuYW06IGluaXRpYWxseSBtb3ZlIDEwSyBvZiBiaW5hcnkgc2l6ZSBvdXQgb2YgbGliZGJ1cworCQorMjAwNS0wMS0xNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKyAgICAgICAgKiBBZGQgYW5kIGZpeCBkb2NzIGFjY29yZGluZyB0byBEb3h5Z2VuIHdhcm5pbmdzIHRocm91Z2hvdXQKKwlzb3VyY2UuCisJCisJKiBkYnVzL2RidXMtbWFyc2hhbC1yZWN1cnNpdmUuYworCShfZGJ1c190eXBlX3JlYWRlcl9hcnJheV9pc19lbXB0eSk6IGNoYW5nZSB0aGlzIHRvIGp1c3QgY2FsbAorCWFycmF5X3JlYWRlcl9nZXRfYXJyYXlfbGVuKCkgYW5kIG1ha2UgaXQgc3RhdGljCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKGRidXNfbWVzc2FnZV9pdGVyX2dldF9lbGVtZW50X3R5cGUpOiByZW5hbWUKKwlmcm9tIGdldF9hcnJheV90eXBlCisJKGRidXNfbWVzc2FnZV9pdGVyX2luaXRfYXBwZW5kKTogcmVuYW1lIGZyb20gYXBwZW5kX2l0ZXJfaW5pdAorCisJKiBkYnVzL2RidXMtbWFyc2hhbC1yZWN1cnNpdmUuYworCShfZGJ1c190eXBlX3JlYWRlcl9nZXRfZWxlbWVudF90eXBlKTogcmVuYW1lIGZyb20KKwlfZGJ1c190eXBlX3JlYWRlcl9nZXRfYXJyYXlfdHlwZQorCisyMDA1LTAxLTE1ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogdGVzdC9nbGliL3Rlc3QtcHJvZmlsZS5jICh3aXRoX2J1c19zZXJ2ZXJfZmlsdGVyKTogZml4IGNyYXNoCisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLWJhc2ljLmMgKF9kYnVzX3VucGFja191aW50MzIpOiBpbmxpbmUgYXMgbWFjcm8KKwl3aGVuIERCVVNfRElTQUJMRV9BU1NFUlQKKwkoX2RidXNfbWFyc2hhbF9zZXRfYmFzaWMpOiBiZSBzdXJlIHdlIGFsaWduIGZvciB0aGUgc3RyaW5nIGxlbmd0aAorCisJKiBkYnVzL2RidXMtbWFyc2hhbC1yZWN1cnNpdmUuYyAoc2tpcF9vbmVfY29tcGxldGVfdHlwZSk6IG1ha2UKKwl0aGlzIGxvb2sgZmFzdGVyCisKKwkqIGRidXMvZGJ1cy1zdHJpbmcuYyAoX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhX2xlbik6IGFkZCBhbgorCWlubGluZSBtYWNybyB2ZXJzaW9uCisJKF9kYnVzX3N0cmluZ19zZXRfYnl0ZSk6IHByb3ZpZGUgaW5saW5lIG1hY3JvIHZlcnNpb24KKworMjAwNS0wMS0xNSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIExhbmQgdGhlIG5ldyBtZXNzYWdlIGFyZ3MgQVBJIGFuZCB0eXBlIHN5c3RlbS4KKworCVRoaXMgcGF0Y2ggaXMgaHVnZSwgYnV0IHRoZSBwdWJsaWMgQVBJIGNoYW5nZSBpcyBub3QgCisJcmVhbGx5IGxhcmdlLiBUaGUgc2V0IG9mIEQtQlVTIHR5cGVzIGhhcyBjaGFuZ2VkIHNvbWV3aGF0LCAKKwlhbmQgdGhlIGFyZyAiZ2V0dGVycyIgYXJlIG1vcmUgZ2VhcmVkIHRvd2FyZCBsYW5ndWFnZSBiaW5kaW5nczsKKwl0aGV5IGRvbid0IG1ha2UgYSBjb3B5LCBldGMuCisKKwlUaGVyZSBhcmUgYWxzbyBzb21lIGtub3duIGlzc3Vlcy4gU2VlIHRoZXNlIGVtYWlscyBmb3IgZGV0YWlscworCW9uIHRoaXMgaHVnZSBwYXRjaDoKKwlodHRwOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL2FyY2hpdmVzL2RidXMvMjAwNC1EZWNlbWJlci8wMDE4MzYuaHRtbAorICAgICAgICBodHRwOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL2FyY2hpdmVzL2RidXMvMjAwNS1KYW51YXJ5LzAwMTkyMi5odG1sCisJCisJKiBkYnVzL2RidXMtbWFyc2hhbC0qOiBhbGwgdGhlIG5ldyBzdHVmZgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jOiBiYXNpY2FsbHkgcmV3cml0dGVuCisKKwkqIGRidXMvZGJ1cy1tZW1vcnkuYyAoY2hlY2tfZ3VhcmRzKTogd2l0aCAiZ3VhcmRzIiBlbmFibGVkLCBpbml0CisJZnJlZWQgYmxvY2tzIHRvIGJlIGFsbCBub24tbnVsIGJ5dGVzIHNvIHVzaW5nIGZyZWVkIG1lbW9yeSBpcyBsZXNzCisJbGlrZWx5IHRvIHdvcmsgcmlnaHQKKworCSogZGJ1cy9kYnVzLWludGVybmFscy5jIChfZGJ1c190ZXN0X29vbV9oYW5kbGluZyk6IGFkZAorCURCVVNfRkFJTF9NQUxMT0M9TiBlbnZpcm9ubWVudCB2YXJpYWJsZSwgc28geW91IGNhbiBkbworCURCVVNfRkFJTF9NQUxMT0M9MCB0byBza2lwIHRoZSBvdXQtb2YtbWVtb3J5IGNoZWNraW5nLCBvcgorCURCVVNfRkFJTF9NQUxMT0M9MTAgdG8gbWFrZSBpdCByZWFsbHksIHJlYWxseSwgcmVhbGx5IHNsb3cgYW5kCisJdGhvcm91Z2guCisKKwkqIHF0L21lc3NhZ2UuY3BwOiBwb3J0IHRvIHRoZSBuZXcgbWVzc2FnZSBhcmdzIEFQSQorCShvcGVyYXRvcjw8KTogdXNlIHN0ci51dGY4KCkgcmF0aGVyIHRoYW4gc3RyLnVuaWNvZGUoKQorCShwcmV0dHkgc3VyZSB0aGlzIGlzIHJpZ2h0IGZyb20gdGhlIFF0IGRvY3M/KQorCisJKiBnbGliL2RidXMtZ3ZhbHVlLmM6IHBvcnQgdG8gdGhlIG5ldyBtZXNzYWdlIGFyZ3MgQVBJCisKKwkqIGJ1cy9kaXNwYXRjaC5jLCBidXMvZHJpdmVyLmM6IHBvcnQgdG8gdGhlIG5ldyBtZXNzYWdlIGFyZ3MgQVBJCisKKwkqIGRidXMvZGJ1cy1zdHJpbmcuYyAoX2RidXNfc3RyaW5nX2luaXRfY29uc3RfbGVuKTogaW5pdGlhbGl6ZSB0aGUKKwkibG9ja2VkIiBmbGFnIHRvIFRSVUUgYW5kIGFsaWduX29mZnNldCB0byAwOyBJIGd1ZXNzIHdlIG5ldmVyCisJbG9va2VkIGF0IHRoZXNlIGFueWhvdywgYnV0IHNlZW1zIGNsZWFuZXIuCisKKwkqIGRidXMvZGJ1cy1zdHJpbmcuaCAoX0RCVVNfU1RSSU5HX0FMTE9DQVRJT05fUEFERElORyk6CisJbW92ZSBhbGxvY2F0aW9uIHBhZGRpbmcgbWFjcm8gdG8gdGhpcyBoZWFkZXI7IHVzZSBpdCB0byBpbXBsZW1lbnQKKwkoX0RCVVNfU1RSSU5HX1NUQVRJQyk6IGFiaWxpdHkgdG8gZGVjbGFyZSBhIHN0YXRpYyBzdHJpbmcuCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKF9kYnVzX21lc3NhZ2VfaGFzX3R5cGVfaW50ZXJmYWNlX21lbWJlcik6CisJY2hhbmdlIHRvIHJldHVybiBUUlVFIGlmIHRoZSBpbnRlcmZhY2UgaXMgbm90IHNldC4KKworCSogZGJ1cy9kYnVzLXN0cmluZy5baGNdOiBtb3ZlIHRoZSBELUJVUyBzcGVjaWZpYyB2YWxpZGF0aW9uIHN0dWZmCisJdG8gZGJ1cy1tYXJzaGFsLXZhbGlkYXRlLltoY10KKworCSogZGJ1cy9kYnVzLW1hcnNoYWwtYmFzaWMuYyAoX2RidXNfdHlwZV90b19zdHJpbmcpOiBtb3ZlIGhlcmUgZnJvbQorCWRidXMtaW50ZXJuYWxzLmMKKworCSogZGJ1cy9NYWtlZmlsZS5hbTogY3V0IG92ZXIgZnJvbSBkYnVzLW1hcnNoYWwuW2hjXQorCXRvIGRidXMtbWFyc2hhbC0qLltoY10KKworCSogZGJ1cy9kYnVzLW9iamVjdC10cmVlLmMgKF9kYnVzX2RlY29tcG9zZV9wYXRoKTogbW92ZSB0aGlzCisJZnVuY3Rpb24gaGVyZSBmcm9tIGRidXMtbWFyc2hhbC5jCisKKzIwMDUtMDEtMTIgIEpvZSBTaGF3ICA8am9lc2hhd0Bub3ZlbGwuY29tPgorCisJKiBORVdTOiBVcGRhdGUgZm9yIDAuMjMuCisKKwkqIGNvbmZpZ3VyZS5pbjogUmVsZWFzZSAwLjIzLgorCisyMDA1LTAxLTEyICBKb2UgU2hhdyAgPGpvZXNoYXdAbm92ZWxsLmNvbT4KKworCSogbW9uby9NYWtlZmlsZS5hbSwgbW9uby9leGFtcGxlL01ha2VmaWxlLmFtOiBBbHdheXMgYnVpbGQgdGhlIAorCWRidXMgRExMIHdpdGggLS1kZWJ1Zy4gIENsZWFuIHVwIGFmdGVyIHRoZSAubWRiIGZpbGVzIHRoaXMgbGVhdmVzCisJYmVoaW5kLgorCisJKiBtb25vL2RvYy9NYWtlZmlsZS5hbTogTmVlZCB0byB1bmluc3RhbGwgdGhlIGRvY3Mgb24gIm1ha2UKKwl1bmluc3RhbGwiCisKKwkqIG1vbm8vQXJndW1lbnRzLmNzIChHZXREQnVzVHlwZUNvbnN0cnVjdG9yKTogSWYgdGhlIHR5cGUKKwlpcyBhbiBlbnVtLCBnZXQgdGhlIGVudW0ncyB1bmRlcmx5aW5nIHR5cGUuICBBbm90aGVyIG1vbm8KKwkxLjEuMyBmaXguCisKKzIwMDUtMDEtMTEgIEpvZSBTaGF3ICA8am9lc2hhd0Bub3ZlbGwuY29tPgorCisJUGF0Y2ggZnJvbSBTam9lcmQgU2ltb25zIDxzam9lcmRAbHVvbi5uZXQ+CisKKwkqIG1vbm8vTWFrZWZpbGUuYW0sIG1vbm8vZXhhbXBsZS9NYWtlZmlsZS5hbTogRG9uJ3QgcmVkZWZpbmUKKwlERVNURElSLiAgSXQgYnJlYWtzIHN0dWZmLgorCisyMDA1LTAxLTExICBKb2UgU2hhdyAgPGpvZXNoYXdAbm92ZWxsLmNvbT4KKworCVBhdGNoIGZyb20gVGFtYmV0IEluZ28gPHRhbWJldEB4aW1pYW4uY29tPgorCisJKiBtb25vL0RCdXNUeXBlL0FycmF5LmNzIChHZXQpOiBHZXQgdGhlIHVuZGVybHlpbmcgZWxlbWVudCB0eXBlIGJ5CisJY2FsbGluZyB0eXBlLkdldEVsZW1lbnRUeXBlKCkuICBUaGUgY29kZSBwcmV2aW91c2x5IGRlcGVuZGVkIG9uCisJYnJva2VuIE1vbm8gYmVoYXZpb3IsIHdoaWNoIHdhcyBmaXhlZCBpbiBNb25vIDEuMS4zLgorCisJKiBtb25vL0RCdXNUeXBlL0RpY3QuY3MgKGNvbnN0cnVjdG9yKTogRml4IHRoZSBwYXJhbWV0ZXJzIGZvcgorCUFjdGl2YXRvci5DcmVhdGVJbnN0YW5jZSgpIHNvIHRoYXQgdGhlIGNsYXNzJ3MgY29uc3RydWN0b3IgaXMKKwljYWxsZWQgd2l0aCB0aGUgcmlnaHQgcGFyYW1ldGVycy4KKworMjAwNS0wMS0xMSAgSm9lIFNoYXcgIDxqb2VzaGF3QG5vdmVsbC5jb20+CisKKwlQYXRjaCBmcm9tIFRpbW8gVGVyw6RzIDxleHQtdGltby50ZXJhc0Bub2tpYS5jb20+CisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMKKwkoX2RidXNfY29ubmVjdGlvbl9xdWV1ZV9yZWNlaXZlZF9tZXNzYWdlX2xpbmspOiBDYWxsCisJX2RidXNfY29ubmVjdGlvbl9yZW1vdmVfdGltZW91dCgpIGluc3RlYWQgb2YgdGhlIF9sb2NrZWQoKQorCXZhcmlhbnQsIHNpbmNlIGl0J3MgYWx3YXlzIGNhbGxlZCBmcm9tCisJX2RidXNfY29ubmVjdGlvbl9oYW5kbGVfd2F0Y2goKSwgd2hpY2ggaGFuZGxlcyB0aGUgbG9ja2luZy4KKwlSZW1vdmVkIHRoZSBfbG9ja2VkKCkgdmFyaWFudCBzaW5jZSBpdCdzIG5vIGxvbmdlciB1c2VkLgorCisyMDA1LTAxLTAzICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLWludGVybmFscy5oOiBJJ20gYW4gaWRpb3QsIF9kYnVzX2Fzc2VydCBjZXJ0YWlubHkgY2FuCisJcmV0dXJuCisJCisyMDA0LTEyLTI2ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLWludGVybmFscy5oOiBhZGQgX0RCVVNfR05VQ19OT1JFVFVSTiB0byBfZGJ1c19hc3NlcnQKKworMjAwNS0wMS0wMyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMgKF9kYnVzX3N5c2RlcHNfdGVzdCk6IGZpeCB1c2luZyA9PSBvbgorCWZsb2F0aW5nIHBvaW50CisKKwkqIGRidXMvZGJ1cy1zdHJpbmcuYyAoX2RidXNfc3RyaW5nX2luc2VydF9hbGlnbm1lbnQpOiBuZXcgZnVuY3Rpb24KKworMjAwNS0wMS0wMiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1pbnRlcm5hbHMuaCAoX0RCVVNfQUxJR05fT0ZGU0VUKTogbmV3IG1hY3JvCisKKzIwMDUtMDEtMDEgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBjb25maWd1cmUuaW46IGFkZCAtV2Zsb2F0LWVxdWFsCisKKzIwMDUtMDEtMDEgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5oOiBhZGQgX0RCVVNfRE9VQkxFU19CSVRXSVNFX0VRVUFMIG1hY3JvLCAKKwlmb3IgYSB2YXJpZXR5IG9mIHJlYXNvbnMgJz09JyBkb2Vzbid0IGRvIHRoaXMuCisKKzIwMDQtMTItMzEgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtc3RyaW5nLmMgKF9kYnVzX3N0cmluZ19lcXVhbF9zdWJzdHJpbmdzKTogbmV3IGZ1bmN0aW9uCisJSSBrZWVwIHdpc2hpbmcgSSBoYWQKKworMjAwNC0xMi0zMCAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogcHl0aG9uL2RidXMucHk6IHMvQUNUSVZBVElPTl9SRVBMWV9BQ1RJVkUvQUNUSVZBVElPTl9SRVBMWV9BQ1RJVkFURUQKKworMjAwNC0xMi0zMCAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogcHl0aG9uL2RidXNfYmluZGluZ3MucHl4LmluOiBDaGFuZ2UgREJVU19BQ1RJVkFUSU9OX1JFUExZX0FDVElWQVRFRAorCWFuZCBEQlVTX0FDVElWQVRJT05fUkVQTFlfQUxSRUFEWV9BQ1RJVkUgdG8gbWF0Y2ggdGhlIHZhbHVlcyBpbgorCWRidXMtcHJvdG9jb2wuaC4gIEJlY2F1c2UgdGhleSBhcmUgZGVmaW5lcyBhbmQgbm90IGVudW1zIHRoZXkgYXJlIG5vdAorCWF1dG9nZW5lcmF0ZWQuCisKKzIwMDQtMTItMjYgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIHB5dGhvbi9kYnVzX2JpbmRpbmdzLnB5eC5pbiAoYnVzX2FjdGl2YXRlX3NlcnZpY2UpOiBCaW5kCisJZGJ1c19idXNfYWN0aXZhdGVfc2VydmljZQorCisJKiBweXRob24vZGJ1cy5weSAoQnVzLmFjdGl2YXRlX3NlcnZpY2UpOiBhY3RpdmF0ZSBhIHNlcnZpY2Ugb24gdGhlCisJYnVzLgorCisyMDA0LTEyLTI0ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogdGVzdC9kZWNvZGUtZ2Nvdi5jOiBjaGFuZ2UgdG8gdXNlIC5nY25vIGFuZCAuZ2NkYSBmaWxlcywgYnV0IHRoZQorCWZpbGUgZm9ybWF0IGhhcyBhbHNvIGNoYW5nZWQgYW5kIEkgaGF2ZW4ndCBhZGFwdGVkIHRvIHRoYXQgeWV0CisJCisJKiBNYWtlZmlsZS5hbTogbG9hZCAuZ2NubyBmaWxlcyBmcm9tIGxhdGVzdCBnY2MKKworMjAwNC0xMi0yMyAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKwkqIFBhdGNoIGZyb20gUm9iIFRheWxvciA8cm9idGF5bG9yQGZhc3RtYWlsLmZtPgorCisJKiBweXRob24vZGJ1c19iaW5kaW5ncy5weXguaW4gKGJ1c19nZXRfdW5peF91c2VyKTogTmV3CisJbG93bGV2ZWwgYmluZGluZworCisJKiBweXRob24vZGJ1cy5weSAoZ2V0X3VuaXhfdXNlcik6IEFkZGVkIGJpbmRpbmcgdG8gCisJY2FsbCBkYnVzX2JpbmRpbmdzLmJ1c19nZXRfdW5peF91c2VyCisKKwkqIHB5dGhvbi9leHRyYWN0LnB5OiBNb2RpZmllZCB0aGUgcHJvdG9fcGF0IHJlZ2V4IHRvCisJaGFuZGxlIHVuc2lnbmVkIGxvbmcKKworMjAwNC0xMi0yMSAgT2xpdmllciBBbmRyaWV1ICA8b2xpdl9fYUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIGRidXMvbWFrZS1kYnVzLWdsaWItZXJyb3ItZW51bS5zaDogb21pdCB0aGUgZnVuY3Rpb24ga2V5d29yZCBmb3IKKwliZXR0ZXIgUE9TSVggY29tcGxpYW5jZS4KKworMjAwNC0xMi0xOSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1zdHJpbmcuYyAoX2RidXNfc3RyaW5nX2luc2VydF80X2FsaWduZWQpIAorCShfZGJ1c19zdHJpbmdfaW5zZXJ0XzhfYWxpZ25lZCk6IG5ldyBmdW5jdGlvbnMKKworCSogZGJ1cy9kYnVzLXN0cmluZy5jIChfZGJ1c19zdHJpbmdfYWxsb2Nfc3BhY2UpOiBuZXcgZnVuY3Rpb24KKworMjAwNC0xMi0xOCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1zdHJpbmcuYyAoX2RidXNfc3RyaW5nX3ZhbGlkYXRlX2FzY2lpKTogdXNlIElTQVNDSUkKKwltYWNybworCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jOiBmaXggYSBjb21tZW50LCBhbmQgYWRkIGEgc3RpbGwtdW51c2VkCisJbm90LWltcGxlbWVudGVkIGZ1bmN0aW9uCisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLmg6IGZpeCBjb21tZW50CisKKwkqIGRidXMvZGJ1cy1pbnRlcm5hbHMuaCAoX0RCVVNfSVNBU0NJSSk6IG5ldyBtYWNybworCisyMDA0LTEyLTE3ICBKb2UgU2hhdyAgPGpvZXNoYXdAbm92ZWxsLmNvbT4KKworCSogbW9uby9EQnVzVHlwZS9CeXRlLmNzLCBtb25vL0RCdXNUeXBlL0ludDMyLmNzLAorCW1vbm8vREJ1c1R5cGUvSW50NjQuY3MsIG1vbm8vREJ1c1R5cGUvVUludDMyLmNzLAorCW1vbm8vREJ1c1R5cGUvVUludDY0LmNzOiBVc2UgRW51bS5HZXRVbmRlcmx5aW5nVHlwZSgpIGluc3RlYWQgb2YKKwlUeXBlLlVuZGVybHlpbmdTeXN0ZW1UeXBlIHRvIGdldCB0aGUgYWN0dWFsIHN5c3RlbSB0eXBlCisJdW5kZXJuZWF0aC4gIFRoaXMgY29kZSBwcmV2aW91c2x5IGRlcGVuZGVkIG9uIHRoZSBicm9rZW4gTW9ubworCWJlaGF2aW9yLCB3aGljaCB3YXMgZml4ZWQgaW4gMS4xLjMuCisKKzIwMDQtMTEtMjcgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtc3RyaW5nLmggKF9kYnVzX3N0cmluZ19nZXRfYnl0ZSk6IGlubGluZSB3aGVuIGFzc2VydHMKKwlhcmUgZGlzYWJsZWQKKwkoX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhKTogaW5saW5lIHdoZW4gYXNzZXJ0cyBhcmUgZGlzYWJsZWQKKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYzogcmVjb3JkIHRoZSBfZGJ1c19jdXJyZW50X2dlbmVyYXRpb24gb2YKKwljcmVhdGlvbiBzbyB3ZSBjYW4gY29tcGxhaW4gaWYgZGJ1c19zaHV0ZG93bigpIGlzIHVzZWQgaW1wcm9wZXJseS4KKwlEbyB0aGlzIG9ubHkgaWYgY2hlY2tzIGFyZSBlbmFibGVkLgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jOiBkaXR0bworCQorMjAwNC0xMS0yNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIHRlc3QvZ2xpYi90ZXN0LXByb2ZpbGUuYzogYWRkIHdpdGhfYnVzIG1vZGUgdG8gcHJvZmlsZSBlY2hvZXMKKwl0aGF0IGdvIHRocm91Z2ggdGhlIGJ1cy4KKworCSogdGVzdC9nbGliL3J1bi10ZXN0LnNoOiBhZGQgYWJpbGl0eSB0byBydW4gdGVzdC1wcm9maWxlCisKKwkqIGJ1cy9kYnVzLWRhZW1vbi0xLjEuaW46IGZpeCB0byBzYXkgdGhhdCBTSUdIVVAgY2F1c2VzIHBhcnRpYWwKKwljb25maWcgZmlsZSByZWxvYWQuCisKKzIwMDQtMTEtMjYgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiB0ZXN0L2dsaWIvdGVzdC1wcm9maWxlLmM6IGNsZWFuIHVwIGhvdyB0aGUgZmFrZV9tYWxsb2Nfb3ZlcmhlYWQKKwl0aGluZyB3YXMgaW1wbGVtZW50ZWQKKworMjAwNC0xMS0yNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIHRlc3QvZ2xpYi90ZXN0LXByb2ZpbGUuYzogdHdlYWsgYSBiaXQsIGFkZCBzdXBwb3J0IGZvciBzb21lCisJbWFkZS11cCBtaW5pbWFsIG1hbGxvYyBvdmVyaGVhZCB3aXRoIHBsYWluIHNvY2tldHMsIHNpbmNlIGluIAorCXJlYWwgbGlmZSBzb21lIHNvcnQgb2YgYnVmZmVycyBhcmUgdW5hdm9pZGFibGUgdGh1cyB3ZSBjb3VsZCAKKwljb3VudCB0aGVtIGluIHRoZSB0aGVvcmV0aWNhbCBiZXN0IGNhc2UKKworMjAwNC0xMS0yNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKGRidXNfbWVzc2FnZV9jYWNoZV9vcl9maW5hbGl6ZSk6IGZpeCBidWcKKwl3aGVyZSBJIHdhcyB0cnlpbmcgdG8gY2FjaGUgb25lIHRvbyBtYW55IG1lc3NhZ2VzCisKKzIwMDQtMTEtMjYgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jOiByZWltcGxlbWVudCBtZXNzYWdlIGNhY2hlIGFzIGFuIGFycmF5IHdoaWNoIAorCW1ha2VzIHRoZSBjYWNoZSBhYm91dCB0d2ljZSBhcyBmYXN0IGFuZCBzYXZlcyBtYXliZSAxLjUlIG92ZXJhbGwKKworMjAwNC0xMS0yNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy10aHJlYWRzLmMgKGluaXRfZ2xvYmFsX2xvY2tzKTogZm9yZ290IHRvIHB1dCB0aGUKKwltZXNzYWdlIGNhY2hlIGxvY2sgaGVyZQorCisyMDA0LTExLTI2ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAoc3RydWN0IERCdXNNZXNzYWdlKTogcHV0IHRoZSBsb2NrZWQgYml0IGFuZAorCXRoZSAiY2hhciBieXRlX29yZGVyIiBuZXh0IHRvIGVhY2ggb3RoZXIgdG8gc2F2ZSA0IGJ5dGVzCisJKGRidXNfbWVzc2FnZV9uZXdfZW1wdHlfaGVhZGVyKTogcmVkdWNlIHByZWFsbG9jYXRpb24sIHNpbmNlIHRoZQorCW1lc3NhZ2UgY2FjaGUgc2hvdWxkIGFjaGlldmUgYSBzaW1pbGFyIGVmZmVjdAorCShkYnVzX21lc3NhZ2VfY2FjaGVfb3JfZmluYWxpemUsIGRidXNfbWVzc2FnZV9nZXRfY2FjaGVkKTogYWRkIGEKKwltZXNzYWdlIGNhY2hlIHRoYXQga2VlcHMgYSBmZXcgREJ1c01lc3NhZ2UgYXJvdW5kIGluIGEgcG9vbCwKKwlhbm90aGVyIDglIHNwZWVkdXAgb3Igc28uCisKKwkqIGRidXMvZGJ1cy1kYXRhc2xvdC5jIChfZGJ1c19kYXRhX3Nsb3RfbGlzdF9jbGVhcik6IG5ldyBmdW5jdGlvbgorCisyMDA0LTExLTI1ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC11bml4LmMgKHVuaXhfZG9faXRlcmF0aW9uKTogaWYgd2UncmUgZ29pbmcKKwl0byB3cml0ZSwgd2l0aG91dCByZWFkaW5nIG9yIGJsb2NraW5nLCB0cnkgaXQgYmVmb3JlIHRoZSBwb2xsKCkKKwlhbmQgc2tpcCB0aGUgcG9sbCgpIGlmIG5vdGhpbmcgcmVtYWlucyB0byB3cml0ZS4gVGhpcyBpcyBhYm91dCBhCisJMyUgc3BlZWR1cCBpbiB0aGUgZWNobyBjbGllbnQvc2VydmVyCisKKzIwMDQtMTEtMjUgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisgICAgICAgIFRoZSBwcmltYXJ5IGNoYW5nZSBoZXJlIGlzIHRvIGFsd2F5cyB3cml0ZSgpIG9uY2UgYmVmb3JlIGFkZGluZworCXRoZSB3cml0ZSB3YXRjaCwgd2hpY2ggZ2l2ZXMgdXMgYWJvdXQgYSAxMCUgcGVyZm9ybWFuY2UgaW5jcmVhc2UuCisJCisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LXVuaXguYzogYSBudW1iZXIgb2YgbW9kaWZpY2F0aW9ucyB0byBjb3BlCisJd2l0aCByZW1vdmluZyBtZXNzYWdlc19wZW5kaW5nCisJKGNoZWNrX3dyaXRlX3dhdGNoKTogcHJvcGVybHkgaGFuZGxlCisJREJVU19BVVRIX1NUQVRFX1dBSVRJTkdfRk9SX01FTU9SWTsgYWRhcHQgdG8gcmVtb3ZhbCBvZgorCW1lc3NhZ2VzX3BlbmRpbmcgc3R1ZmYKKwkoY2hlY2tfcmVhZF93YXRjaCk6IHByb3Blcmx5IGhhbmRsZSBXQUlUSU5HX0ZPUl9NRU1PUlkgYW5kCisJQVVUSEVOVElDQVRFRCBjYXNlcworCSh1bml4X2hhbmRsZV93YXRjaCk6IGFmdGVyIHdyaXRpbmcsIHNlZSBpZiB0aGUgd3JpdGUgd2F0Y2ggY2FuIGJlCisJcmVtb3ZlZAorCSh1bml4X2RvX2l0ZXJhdGlvbik6IGFzc2VydCB0aGF0IHdyaXRlX3dhdGNoL3JlYWRfd2F0Y2ggYXJlCisJbm9uLU5VTEwgcmF0aGVyIHRoYW4gdGVzdGluZyB0aGF0IHRoZXkgYXJlbid0LCBzaW5jZSB0aGV5IAorCWFyZW4ndCBhbGxvd2VkIHRvIGJlIE5VTEwuIGNoZWNrX3dyaXRlX3dhdGNoKCkgYXQgdGhlIGVuZCBzbyAKKwl3ZSBhZGQgdGhlIHdhdGNoIGlmIHdlIGRpZCBub3QgZmluaXNoIHdyaXRpbmcgKGUuZy4gZ290IEVBR0FJTikKKworCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC1wcm90ZWN0ZWQuaDogcmVtb3ZlIG1lc3NhZ2VzX3BlbmRpbmcgY2FsbCwKKwlzaW5jZSBpdCByZXN1bHRlZCBpbiB0b28gbXVjaCBpbmVmZmljaWVudCB3YXRjaCBhZGRpbmcvcmVtb3Zpbmc7IAorCWluc3RlYWQgd2Ugbm93IHJlcXVpcmUgdGhhdCB0aGUgdHJhbnNwb3J0IHVzZXIgZG9lcyBhbiBpdGVyYXRpb24gCisJYWZ0ZXIgcXVldWVpbmcgb3V0Z29pbmcgbWVzc2FnZXMsIGFuZCBhZnRlciB0cnlpbmcgdGhlIGZpcnN0CisJd3JpdGUoKSB3ZSBhZGQgYSB3cml0ZSB3YXRjaCBpZiB3ZSBnb3QgRUFHQUlOIG9yIGV4Y2VlZGVkIG91ciAKKwltYXggYnl0ZXMgdG8gd3JpdGUgcGVyIGl0ZXJhdGlvbiBzZXR0aW5nCisKKwkqIGRidXMvZGJ1cy1zdHJpbmcuYyAoX2RidXNfc3RyaW5nX3ZhbGlkYXRlX3NpZ25hdHVyZSk6IGFkZCB0aGlzCisJZnVuY3Rpb24KKworCSogZGJ1cy9kYnVzLXNlcnZlci11bml4LmMgKHVuaXhfZmluYWxpemUpOiB0aGUgc29ja2V0IG5hbWUgd2FzCisJZnJlZWQgYW5kIHRoZW4gYWNjZXNzZWQsIHZhbGdyaW5kIGZsYWdnZWQgdGhpcyBidWcsIGZpeCBpdAorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jOiBmaXggc2V2ZXJhbCBidWdzIHdoZXJlIEhFQURFUl9GSUVMRF9MQVNUIHdhcyB0YWtlbgorCWFzIHRoZSBsYXN0IHZhbGlkIGZpZWxkIHBsdXMgMSwgd2hlcmUgcmVhbGx5IGl0IGlzIGVxdWFsIHRvIHRoZQorCWxhc3QgdmFsaWQgZmllbGQuIENvcnJlY3RzIHNvbWUgbWVzc2FnZSBjb3JydXB0aW9uIGlzc3Vlcy4KKworCSogZGJ1cy9kYnVzLW1haW5sb29wLmM6IHZlcmJvc2l0eSBjaGFuZ2VzCisKKwkqIGRidXMvZGJ1cy1rZXlyaW5nLmMgKF9kYnVzX2tleXJpbmdfbmV3X2hvbWVkaXIpOiBoYW5kbGUgT09NCisJaW5zdGVhZCBvZiBhYm9ydGluZyBpbiBvbmUgb2YgdGhlIHRlc3QgY29kZXBhdGhzCisKKwkqIGRidXMvZGJ1cy1pbnRlcm5hbHMuYyAoX2RidXNfdmVyYm9zZV9yZWFsKTogZml4IGEgYnVnIHRoYXQKKwljYXVzZWQgbm90IHByaW50aW5nIHRoZSBwaWQgZXZlciBhZ2FpbiBpZiBhIHZlcmJvc2Ugd2FzIG1pc3NpbmcKKwl0aGUgbmV3bGluZSBhdCB0aGUgZW5kCisJKF9kYnVzX2hlYWRlcl9maWVsZF90b19zdHJpbmcpOiBhZGQgSEVBREVSX0ZJRUxEX1NJR05BVFVSRQorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jOiB2ZXJib3NpdHkgY2hhbmdlczsgCisJKGRidXNfY29ubmVjdGlvbl9oYXNfbWVzc2FnZXNfdG9fc2VuZCk6IG5ldyBmdW5jdGlvbgorCShfZGJ1c19jb25uZWN0aW9uX21lc3NhZ2Vfc2VudCk6IG5vIGxvbmdlciBjYWxsIHRyYW5zcG9ydC0+bWVzc2FnZXNfcGVuZGluZworCShfZGJ1c19jb25uZWN0aW9uX3NlbmRfcHJlYWxsb2NhdGVkX3VubG9ja2VkKTogZG8gb25lIGl0ZXJhdGlvbiB0bworCXRyeSB0byB3cml0ZSgpIGltbWVkaWF0ZWx5LCBzbyB3ZSBjYW4gYXZvaWQgdGhlIHdyaXRlIHdhdGNoLiBUaGlzCisJaXMgdGhlIGNvcmUgcHVycG9zZSBvZiB0aGlzIHBhdGNoc2V0CisJKF9kYnVzX2Nvbm5lY3Rpb25fZ2V0X2Rpc3BhdGNoX3N0YXR1c191bmxvY2tlZCk6IGlmIGRpc2Nvbm5lY3RlZCwKKwlkdW1wIHRoZSBvdXRnb2luZyBtZXNzYWdlIHF1ZXVlLCBzbyBub2JvZHkgd2lsbCBnZXQgY29uZnVzZWQKKwl0cnlpbmcgdG8gc2VuZCB0aGVtIG9yIHRoaW5raW5nIHN0dWZmIGlzIHBlbmRpbmcgdG8gYmUgc2VudAorCisJKiBidXMvdGVzdC5jOiB2ZXJib3NpdHkgY2hhbmdlcworCisJKiBidXMvZHJpdmVyLmM6IHZlcmJvc2l0eS9hc3NlcnRpb24gY2hhbmdlcworCisJKiBidXMvZGlzcGF0Y2guYzogYSBidW5jaCBvZiBsaXR0bGUgdHdlYWtzIHRvIGdldCBpdCB3b3JraW5nIGFnYWluCisJYmVjYXVzZSB0aGlzIHBhdGNoc2V0IGNoYW5nZXMgd2hlbi93aGVyZSB5b3UgbmVlZCB0byBibG9jay4KKworMjAwNC0xMS0yMyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIHRlc3QvZ2xpYi90ZXN0LXByb2ZpbGUuYzogbW9kaWZ5IHRvIGFjY2VwdCBhIHBsYWluX3NvY2tldHMKKwlhcmd1bWVudCBpbiB3aGljaCBjYXNlIGl0IHdpbGwgYmVuY2ggcGxhaW4gc29ja2V0cyBpbnN0ZWFkIG9mCisJbGliZGJ1cywgZm9yIGNvbXBhcmlzb24gcHVycG9zZXMuCisKKzIwMDQtMTEtMjIgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiB0ZXN0L2dsaWIvdGVzdC1wcm9maWxlLmMgKE5fQ0xJRU5UX1RIUkVBRFMpOiBydW4gbXVsdGlwbGUKKwl0aHJlYWRzIGZvciBtb3JlIHRpbWUsIHNvIHN5c3Byb2YgY2FuIGdldCBhIGdyaXAgb24gaXQuCisKKwkqIGRidXMvZGJ1cy1zdHJpbmcuYyAoX2RidXNfc3RyaW5nX3ZhbGlkYXRlX3V0ZjgpOiByZW1vdmUKKwlwb2ludGxlc3MgdmFyaWFibGUKKworMjAwNC0xMS0xMyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIHRlc3QvZ2xpYi90ZXN0LXByb2ZpbGUuYzogZml4IHRoaXMgdGhpbmcgdXAgYSBiaXQKKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAoZGJ1c19tZXNzYWdlX25ld19lbXB0eV9oZWFkZXIpOiBpbmNyZWFzZQorCXByZWFsbG9jYXRpb24gc2l6ZXMgYnkgYSBmYWlyIGJpdDsgbm90IHN1cmUgaWYgdGhpcyB3aWxsIGJlIGFuCisJb3ZlcmFsbCBwZXJmb3JtYW5jZSB3aW4gb3Igbm90LCBidXQgaXQgZG9lcyByZWR1Y2UgcmVhbGxvY3MuCisKKwkqIGRidXMvZGJ1cy1zdHJpbmcuYyAoc2V0X2xlbmd0aCwgcmVhbGxvY2F0ZV9mb3JfbGVuZ3RoKTogaWdub3JlCisJdGhlIHRlc3QgaGFjayB0aGF0IGZvcmNlZCBjb25zdGFudCByZWFsbG9jIGlmIGFzc2VydHMgYXJlCisJZGlzYWJsZWQsIHNvIHdlIGNhbiBwcm9maWxlIHNhbmVseS4gU3ByaW5rbGUgaW4gc29tZQorCV9EQlVTX1VOTElLRUxZKCkgd2hpY2ggYXJlIHByb2JhYmx5IHBvaW50bGVzcywgYnV0IGJlZm9yZSBJCisJbm90aWNlZCB0aGUgcmVhbCBwZXJmb3JtYW5jZSBwcm9ibGVtIEkgcHV0IHRoZW0gaW4uCisJKF9kYnVzX3N0cmluZ192YWxpZGF0ZV91dGY4KTogbWljcm8tb3B0aW1pemUgdGhpcyB0aGluZyBhIGxpdHRsZQorCWJpdCwgdGhvdWdoIGNhbGxncmluZCBzYXlzIGl0IGRpZG4ndCBoZWxwOyB0aGVuIHNwZWNpYWwtY2FzZQorCWFzY2lpLCB3aGljaCBkaWQgaGVscCBhIGxvdDsgdGhlbiBiZSBzdXJlIHdlIGRldGVjdCBudWwgYnl0ZXMgYXMKKwlpbnZhbGlkLCB3aGljaCBpcyBhIGJ1Z2ZpeC4KKwkoYWxpZ25fbGVuZ3RoX3RoZW5fbGVuZ3RoZW4pOiBhZGQgc29tZSBtb3JlIF9EQlVTX1VOTElLRUxZCisJc3VwZXJzdGl0aW9uOyB1c2UgbWVtc2V0IHRvIG51bCB0aGUgcGFkZGluZyBpbnN0ZWFkIG9mIGEgbWFudWFsCisJbG9vcC4KKwkoX2RidXNfc3RyaW5nX2dldF9sZW5ndGgpOiBpbmxpbmUgdGhpcyBhcyBhCisJbWFjcm87IGl0IHNob3dlZCB1cCBpbiB0aGUgcHJvZmlsZSBiZWNhdXNlIGl0J3MgdXNlZCBmb3IgbG9vcAorCXRlc3RzIGFuZCBzbyBmb3J0aAorCisyMDA0LTExLTEwICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiBkYnVzL2RidXMtc3Bhd24uYyAoY2hlY2tfYmFieXNpdF9ldmVudHMpOiBIYW5kbGUgRUlOVFIsCisJZm9yIGV4dHJhIHBhcmFub2lhLgorCisyMDA0LTExLTA5ICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiBkYnVzL2RidXMtc3RyaW5nLmMgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoKTogTmV3CisJZnVuY3Rpb24sIHdyaXRlcyBEQnVzU3RyaW5nIHRvIEMgYnVmZmVyLgorCisJKiBkYnVzL2RidXMtc3RyaW5nLmg6IFByb3RvdHlwZSBpdC4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAoZGJ1c19tZXNzYWdlX3R5cGVfdG9fc3RyaW5nKTogTmV3CisJZnVuY3Rpb24sIGNvbnZlcnRzIG1lc3NhZ2UgdHlwZSBpbnRvIEMgc3RyaW5nLgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5oOiBQcm90b3R5cGUgaXQuCisKKwkqIGJ1cy9zZWxpbnV4LmMgKGJ1c19zZWxpbnV4X2NoZWNrKTogVGFrZSBzb3VyY2UgcGlkLAorCXRhcmdldCBwaWQsIGFuZCBhdWRpdCBkYXRhLiAgUGFzcyBhdWRpdCBkYXRhIHRvCisJYXZjX2hhc19wZXJtLgorCShsb2dfYXVkaXRfY2FsbGJhY2spOiBOZXcgZnVuY3Rpb24sIGFwcGVuZHMgZXh0cmEKKwlhdWRpdCBpbmZvcm1hdGlvbi4KKwkoYnVzX3NlbGludXhfYWxsb3dzX2FjcXVpcmVfc2VydmljZSk6IEFsc28gdGFrZQorCXNlcnZpY2UgbmFtZSwgYWRkIGl0IHRvIGF1ZGl0IGRhdGEuCisJKGJ1c19zZWxpbnV4X2FsbG93c19zZW5kKTogQWxzbyB0YWtlIG1lc3NhZ2UKKwl0eXBlLCBpbnRlcmZhY2UsIG1ldGhvZCBtZW1iZXIsIGVycm9yIG5hbWUsCisJYW5kIGRlc3RpbmF0aW9uLCBhbmQgYWRkIHRoZW0gdG8gYXVkaXQgZGF0YS4KKwkobG9nX2NiKTogSW5pdGlhbGl6ZSBmdW5jX2F1ZGl0LgorCQorCSogYnVzL3NlbGludXguaCAoYnVzX3NlbGludXhfYWxsb3dzX2FjcXVpcmVfc2VydmljZSkKKwkoYnVzX3NlbGludXhfYWxsb3dzX3NlbmQpOiBVcGRhdGUgcHJvdG90eXBlcyAKKworCSogYnVzL3NlcnZpY2VzLmMgKGJ1c19yZWdpc3RyeV9hY3F1aXJlX3NlcnZpY2UpOiBQYXNzCisJc2VydmljZSBuYW1lIHRvIGJ1c19zZWxpbnV4X2FsbG93c19hY3F1aXJlX3NlcnZpY2UuCisKKwkqIGJ1cy9idXMuYyAoYnVzX2NvbnRleHRfY2hlY2tfc2VjdXJpdHlfcG9saWN5KTogUGFzcworCWFkZGl0aW9uYWwgYXVkaXQgZGF0YS4gIE1vdmUgYXNzaWdubWVudCBvZiBkZXN0CisJdG8gaXRzIG93biBsaW5lLgorCisyMDA0LTExLTA3ICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LXVuaXguYyAoZG9fYXV0aGVudGljYXRpb24pOiBBbHdheXMKKwlpbml0aWFsaXplIGF1dGhfY29tcGxldGVkLgorCQorMjAwNC0xMS0wNyAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogYnVzL2J1cy5jIChsb2FkX2NvbmZpZyk6IEJyZWFrIGludG8gdGhyZWUKKwlzZXBhcmF0ZSBmdW5jdGlvbnM6IHByb2Nlc3NfY29uZmlnX2ZpcnN0X3RpbWVfb25seSwKKwlwcm9jZXNzX2NvbmZpZ19ldmVyeV90aW1lLCBhbmQgcHJvY2Vzc19jb25maWdfcG9zdGluaXQuCisJKHByb2Nlc3NfY29uZmlnX2V2ZXJ5X3RpbWUpOiBNb3ZlIGNhbGwgb2YKKwlidXNfcmVnaXN0cnlfc2V0X3NlcnZpY2VfY29udGV4dF90YWJsZSBpbnRvCisJcHJvY2Vzc19jb25maWdfcG9zdGluaXQuCisJKHByb2Nlc3NfY29uZmlnX3Bvc3Rpbml0KTogTmV3IGZ1bmN0aW9uLCBkb2VzCisJYW55IHByb2Nlc3NpbmcgdGhhdCBuZWVkcyB0byBoYXBwZW4gbGF0ZQorCWluIGluaXRpYWxpemF0aW9uIChhbmQgYWxzbyBvbiByZWxvYWQpLgorCShidXNfY29udGV4dF9uZXcpOiBJbnN0ZWFkIG9mIGNhbGxpbmcgbG9hZF9jb25maWcsCisJb3BlbiBjb25maWcgcGFyc2VyIGhlcmUgYW5kIGNhbGwgcHJvY2Vzc19jb25maWdfZmlyc3RfdGltZV9vbmx5CisJYW5kIHByb2Nlc3NfY29uZmlnX2V2ZXJ5X3RpbWUgZGlyZWN0bHkuICBMYXRlciwgYWZ0ZXIKKwl3ZSBoYXZlIGZvcmtlZCBidXQgYmVmb3JlIGNoYW5naW5nIFVJRCwKKwlpbnZva2UgYnVzX3NlbGludXhfZnVsbF9pbml0LCBhbmQgdGhlbiBjYWxsCisJcHJvY2Vzc19jb25maWdfcG9zdGluaXQuCisJKGJ1c19jb250ZXh0X3JlbG9hZF9jb25maWcpOiBBcyBpbiBidXNfY29udGV4dF9uZXcsCisJbG9hZCBwYXJzZSBmaWxlIGluc2lkZSBoZXJlLCBhbmQgY2FsbCBwcm9jZXNzX2NvbmZpZ19ldmVyeV90aW1lCisJYW5kIHByb2Nlc3NfY29uZmlnX3Bvc3Rpbml0LgorCisJKiBidXMvc2VydmljZXMuaCwgYnVzL3NlcnZpY2VzLmMKKwkoYnVzX3JlZ2lzdHJ5X3NldF9zZXJ2aWNlX2NvbnRleHRfdGFibGUpOiBSZW5hbWUKKwlmcm9tIGJ1c19yZWdpc3RyeV9zZXRfc2lkX3RhYmxlLiAgVGFrZSBzdHJpbmcgaGFzaCBmcm9tIGNvbmZpZworCXBhcnNlciwgYW5kIGNvbnZlcnQgdGhlbSBoZXJlIGludG8gU0lEcy4KKworCSogYnVzL2NvbmZpZy1wYXJzZXIuYyAoc3RydWN0IEJ1c0NvbmZpZ1BhcnNlcik6IEhhdmUKKwljb25maWcgcGFyc2VyIG9ubHkgc3RvcmUgYSBtYXBwaW5nIG9mIHNlcnZpY2UtPmNvbnRleHQKKwlzdHJpbmcuCisJKG1lcmdlX3NlcnZpY2VfY29udGV4dF9oYXNoKTogTmV3IGZ1bmN0aW9uLgorCShtZXJnZV9pbmNsdWRlZCk6IE1lcmdlIGNvbnRleHQgc3RyaW5nIGhhc2hlcyBpbnN0ZWFkCisJb2YgdXNpbmcgYnVzX3NlbGludXhfaWRfdGFibGVfdW5pb24uCisJKGJ1c19jb25maWdfcGFyc2VyX25ldyk6IERvbid0IHVzZSBidXNfc2VsaW51eF9pZF90YWJsZV9uZXc7CisJc2ltcGx5IGNyZWF0ZSBhIG5ldyBzdHJpbmcgaGFzaC4KKwkoYnVzX2NvbmZpZ19wYXJzZXJfdW5yZWYpOiBVbnJlZiBpdC4KKwkoc3RhcnRfc2VsaW51eF9jaGlsZCk6IFNpbXBseSBpbnNlcnQgc3RyaW5ncyBpbnRvIGhhc2gsCisJZG9uJ3QgY2FsbCBidXNfc2VsaW51eF9pZF90YWJsZV9jb3B5X292ZXIuCisKKwkqIGJ1cy9zZWxpbnV4LmgsIGJ1cy9zZWxpbnV4LmMgKGJ1c19zZWxpbnV4X2lkX3RhYmxlX3VuaW9uKQorCShidXNfc2VsaW51eF9pZF90YWJsZV9jb3B5X292ZXIpOiBEZWxldGUuCisKKzIwMDQtMTEtMDMgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwkqIGJ1cy9zZWxpbnV4LmMgKGJ1c19zZWxpbnV4X3ByZV9pbml0KTogS2lsbCBzb21lIHVudXNlZAorCXZhcmlhYmxlcy4KKwkKKzIwMDQtMTEtMDMgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwkqIGJ1cy90ZXN0LW1haW4uYyAodGVzdF9wcmVfaG9vayk6IEZpeCB0ZXN0IGxvZ2ljLAorCXRoYW5rcyBKb2VyZyBCYXJmdXJ0aCA8Sm9lcmcuQmFyZnVydGhAU3VuLkNPTT4uCisKKzIwMDQtMTEtMDIgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHJlZGhhdC5jb20+CisKKwkqIGJ1cy9zZWxpbnV4LmMgKGJ1c19zZWxpbnV4X2luaXQpOiBTcGxpdCBpbnRvIHR3byBmdW5jdGlvbnMsCisJYnVzX3NlbGludXhfcHJlX2luaXQgYW5kIGJ1c19zZWxpbnV4X3Bvc3RfaW5pdC4KKwkoYnVzX3NlbGludXhfcHJlX2luaXQpOiBKdXN0IGRldGVybWluZSB3aGV0aGVyIFNFTGludXggaXMKKwllbmFibGVkLgorCShidXNfc2VsaW51eF9wb3N0X2luaXQpOiBEbyBldmVyeXRoaW5nIGVsc2UuCisKKwkqIGJ1cy9tYWluLmMgKG1haW4pOiBDYWxsIGJ1c19zZWxpbnV4X3ByZV9pbml0IGJlZm9yZSBwYXJzaW5nCisJY29uZmlnIGZpbGUsIGFuZCBidXNfc2VsaW51eF9wb3N0X2luaXQgYWZ0ZXIuICBUaGlzIGVuc3VyZXMgdGhhdAorCXdlIGRvbid0IGxvc2UgdGhlIHBvbGljeXJlbG9hZCBub3RpZmljYXRpb24gdGhyZWFkIHRoYXQKKwlidXNfc2VsaW51eF9pbml0IGNyZWF0ZWQgYmVmb3JlIGZvcmtpbmcgcHJldmlvdXNseS4KKwkKKwkqIGJ1cy90ZXN0LW1haW4uYyAodGVzdF9wcmVfaG9vayk6IFVwZGF0ZSBmb3Igc3BsaXQuCisKKzIwMDQtMTAtMzEgIE93ZW4gRnJhc2VyLUdyZWVuICA8b3dlbkBkaXNjb2JhYmUubmV0PgorCisJUGF0Y2ggZnJvbSBKb2hhbiBGaXNjaGVyIDxsaW51eEBmaXNjaGF6LmNvbT4KKwkKKwkqIG1vbm8vZG9jL01ha2VmaWxlLmFtIChpbnN0YWxsLWRhdGEtbG9jYWwpOiBBZGRlZCBkaXJlY3RvcnkKKwlpbnN0YWxsIGZvciBERVNURElSCisKKzIwMDQtMTAtMjkgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmggKF9kYnVzX2JlY29tZV9kYWVtb24pOiBBbHNvIHRha2UKKwlwYXJhbWV0ZXIgZm9yIGZkIHRvIHdyaXRlIHBpZCB0by4JCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMgKF9kYnVzX2JlY29tZV9kYWVtb24pOiBJbXBsZW1lbnQgaXQuCisJCisJKiBidXMvYnVzLmMgKGJ1c19jb250ZXh0X25ldyk6IFBhc3MgcHJpbnRfcGlkX2ZkCisJdG8gX2RidXNfYmVjb21lX2RhZW1vbiAoYnVnICMxNzIwKQorCisyMDA0LTEwLTI5ICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0ByZWRoYXQuY29tPgorCisJUGF0Y2ggZnJvbSBFZCBDYXRtdXIgPGVkQGNhdG11ci5jby51az4KKworCSogbW9uby9kb2MvTWFrZWZpbGUuYW0gKGluc3RhbGwtZGF0YS1sb2NhbCk6IEhhbmRsZQorCURFU1RESVIuCisKKzIwMDQtMTAtMjkgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHJlZGhhdC5jb20+CisKKwkqIGJ1cy8uY3ZzaWdub3JlLCBxdC8uY3ZzaWdub3JlOiBVcGRhdGUuCisKKzIwMDQtMTAtMjkgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHJlZGhhdC5jb20+CisKKwlQYXRjaCBmcm9tIEtyaXN0b2YgVmFuc2FudCA8ZGVfbHVwdXNAcGFuZG9yYS5iZT4KKworCSogY29uZmlndXJlLmluOiBEZXRlY3QgU2xhY2t3YXJlLgorCSogYnVzL01ha2VmaWxlLmFtIChTQ1JJUFRfSU5fRklMRVMpOiBBZGQgcmMubWVzc2FnZWJ1cy5pbi4KKwkqIGJ1cy9yYy5tZXNzYWdlYnVzLmluOiBOZXcgZmlsZS4KKworMjAwNC0xMC0yOSAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAcmVkaGF0LmNvbT4KKworCSogdG9vbHMvZGJ1cy1tb25pdG9yLmMgKGZpbHRlcl9mdW5jKTogUmV0dXJuCisJREJVU19IQU5ETEVSX1JFU1VMVF9IQU5ETEVEIGluIGZpbHRlciBmdW5jdGlvbgorCWZvciBub3cuICBTZWU6CisJaHR0cDovL2ZyZWVkZXNrdG9wLm9yZy9waXBlcm1haWwvZGJ1cy8yMDA0LUF1Z3VzdC8wMDE0MzMuaHRtbAorCisyMDA0LTEwLTI5ICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0ByZWRoYXQuY29tPgorCisJUGF0Y2ggZnJvbSBNYXR0aGV3IFJpY2thcmQgPG1qcmlja2FAZXBvY2gubmNzYy5taWw+CisKKwkqIGJ1cy9zZXJ2aWNlcy5jIChidXNfcmVnaXN0cnlfYWNxdWlyZV9zZXJ2aWNlKTogCisJQ29ycmVjdGx5IHJldHJpZXZlIHNlcnZpY2UgbmFtZSBmcm9tIERCdXNTdHJpbmcKKwlmb3IgcHJpbnRpbmcuCisKKzIwMDQtMTAtMjkgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1nbGliLmg6IFVwZGF0ZSBkb2N1bWVudGF0aW9uIHRvIG5vdAorCXJlZmVyIHRvIGludGVybmFsIEFQSXMuCisKKzIwMDQtMTAtMjcgIEpvZSBTaGF3ICA8am9lc2hhd0Bub3ZlbGwuY29tPgorCisJKiBtb25vL0FyZ3VtZW50cy5jcyAoR2V0REJ1c1R5cGVDb25zdHJ1Y3Rvcik6CisJdHlwZS5VbmRlcmx5aW5nU3lzdGVtVHlwZSB3aWxsIHJldHVybiAiU3lzdGVtLkJ5dGUiIGlmIHlvdSBkbyBpdAorCW9uICJieXRlW10iLCB3aGljaCBpcyBub3Qgd2hhdCB3ZSB3YW50LiAgU28gY2hlY2sgdGhlIHR5cGUuSXNBcnJheQorCXByb3BlcnR5IGFuZCB1c2UgU3lzdGVtLkFycmF5IGluc3RlYWQuCisKKzIwMDQtMTAtMjUgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMgKGZpbGxfdXNlcl9pbmZvKTogT24gZXJyb3JzIGRvIG5vdCBmcmVlCisJdGhlIERCdXNVc2VySW5mbyBzdHJ1Y3R1cmUgc2luY2UgdGhpcyBpcyBwYXNzZWQgaW50byB0aGUgZnVuY3Rpb24uCisJVGhpcyB3b3VsZCBjYXVzZSBhIGRvdWJsZSBmcmVlIHdoZW4gdGhlIGZ1bmN0aW9uIHRoYXQgYWxsb2NhdGVkCisJdGhlIHN0cnVjdHVyZSB3b3VsZCB0cnkgdG8gZnJlZSBpdCB3aGVuIGFuIGVycm9yIG9jY3VyZWQuCisKKwkqIChidXMvc2Vzc2lvbi5jb25mLmluLCBidXMvTWFrZWZpbGUuYW0sIGRidXMvY29uZmlndXJlLmluKToKKwl1c2UgL3Vzci9zaGFyZS9kYnVzLTEvc2VydmljZXMgaW5zdGVhZCBvZiAvdXNyL2xpYi9kYnVzLTEuMC9zZXJ2aWNlcworCWZvciBzZXJ2aWNlIGFjdGl2YXRpb24gdG8gYXZvaWQgMzJiaXQvNjRiaXQgcGFyYWxsZWwgaW5zdGFsbCBpc3N1ZXMKKworMjAwNC0xMC0yMSAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogQVVUSE9SUzogRml4IG15IGVtYWlsIGFkZHJlc3MsIHRoZSBAZ251Lm9yZyBvbmUKKwloYXMgYmVlbiBib3VuY2luZyBmb3Igc29tZSB0aW1lLiAgQWxzbyBhZGQgSjUuCisJCisyMDA0LTEwLTIxICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LXVuaXguYyAoZG9fYXV0aGVudGljYXRpb24pOiBSZXR1cm4KKwlhdXRoZW50aWNhdGlvbiBzdGF0dXMgdG8gY2FsbGVycy4KKwkodW5peF9oYW5kbGVfd2F0Y2gpOiBJZiB3ZSBjb21wbGV0ZWQgYXV0aGVudGljYXRpb24gdGhpcyByb3VuZCwKKwlkb24ndCBkbyBhbm90aGVyIHJlYWQuICBJbnN0ZWFkIHdhaXQgdW50aWwgdGhlIG5leHQgaXRlcmF0aW9uLAorCWFmdGVyIHdlJ3ZlIHJlYWQgYW55IHBlbmRpbmcgZGF0YSBpbiB0aGUgYXV0aCBidWZmZXIuCisJKHVuaXhfZG9faXRlcmF0aW9uKTogRGl0dG8uCisJKHVuaXhfaGFuZGxlX3dhdGNoKTogVXBkYXRlZCBmb3IgbmV3IGRvX2F1dGhlbnRpY2F0aW9uIHByb3RvdHlwZS4KKworMjAwNC0xMC0xOCAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogYnVzL3NlbGludXguYyAoYnVzX3NlbGludXhfZW5hYmxlZCk6IEhhbmRsZQorCS0tZGlzYWJsZS1zZWxpbnV4IGNhc2UuCisJCisyMDA0LTEwLTE4ICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiBidXMvc2VsaW51eC5oOiBBZGQgYnVzX3NlbGludXhfZW5hYmxlZC4KKwkKKwkqIGJ1cy9zZWxpbnV4LmMgKGJ1c19zZWxpbnV4X2VuYWJsZWQpOiBJbXBsZW1lbnQgaXQuCisJCisJKiBidXMvY29uZmlnLXBhcnNlci5jIChzdHJ1Y3QgaW5jbHVkZSk6IEFkZAorCWlmX3NlbGludXhfZW5hYmxlZCBtZW1iZXIuCisJKHN0YXJ0X2J1c2NvbmZpZ19jaGlsZCk6IFBhcnNlIGlmX3NlbGludXhfZW5hYmxlZAorCWF0dHJpYnV0ZSBmb3IgaW5jbHVkZS4KKwkoYnVzX2NvbmZpZ19wYXJzZXJfY29udGVudCk6IEhhbmRsZSBpdC4KKworCSogYnVzL3Nlc3Npb24uY29uZi5pbiwgYnVzL3N5c3RlbS5jb25mLmluOiBBZGQKKwlpbmNsdXNpb24gb2YgY29udGV4dCBtYXBwaW5nIHRvIGRlZmF1bHQgY29uZmlnIGZpbGVzOworCWNvbmRpdGlvbmFsIG9uIFNFTGludXggYmVpbmcgZW5hYmxlZC4KKwkKKwkqIGRvYy9idXNjb25maWcuZHRkOiBBZGQgdG8gaWZfc2VsaW51eF9lbmFibGVkIHRvIGRlZmF1bHQgRFRELgorCQorCSogdGVzdC9kYXRhL2ludmFsaWQtY29uZmlnLWZpbGVzL2JhZHNlbGludXgtMS5jb25mLCAKKwl0ZXN0L2RhdGEvaW52YWxpZC1jb25maWctZmlsZXMvYmFkc2VsaW51eC0yLmNvbmY6CisJVGVzdCBmaWxlcyBmb3IgYmFkIHN5bnRheC4KKwkKKzIwMDQtMTAtMTcgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwkqIGRidXMvZGJ1cy1tZW1vcnkuYyAoX2RidXNfaW5pdGlhbGl6ZV9tYWxsb2NfZGVidWcsIGNoZWNrX2d1YXJkcykKKwkoZGJ1c19tYWxsb2MsIGRidXNfbWFsbG9jMCwgZGJ1c19yZWFsbG9jKTogRml4IHVwIHByaW50ZgorCWZvcm1hdCBzcGVjaWZpZXIgbWlzbWF0Y2hlcy4KKworMjAwNC0xMC0wNyAgT2xpdmllciBBbmRyaWV1ICA8b2xpdl9fYUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMgKF9kYnVzX2ZpbGVfZ2V0X2NvbnRlbnRzKTogZml4IGFuIGluY29ycmVjdAorCWZvcm1hdCBzdHJpbmcuCisKKwkqIGdsaWIvZGJ1cy1kYnVzLWdtYWluLmMgKGRidXNfZ19idXNfZ2V0KTogZG8gbm90IG1hbmdsZSBOVUxMCisJcG9pbnRlciAoYnVnICMxNTQwLCBMZW9uYXJkbyBCb2lrbykuCisKKzIwMDQtMDktMjggIEpvbiBUcm93YnJpZGdlICA8dHJvd0B4aW1pYW4uY29tPgorCisJKiBtb25vL0J1c0RyaXZlci5jczogQ2hhbmdlZCBCdXNEcml2ZXIgc3RydWN0IHRvIHJlbW92ZQorCXRoZSBTZXJ2aWNlQ3JlYXRlZCBhbmQgU2VydmljZURlbGV0ZWQgZXZlbnRzIGFuZCByZXBsYWNlIHRoZW0KKwl3aXRoIHRoZSBuZXcgU2VydmljZU93bmVyQ2hhbmdlZCBldmVudC4KKworCSogbW9uby9leGFtcGxlL0J1c0xpc3RlbmVyLmNzOiBBZGRlZCBhIG5ldyBleGFtcGxlIHByb2dyYW0sCisJd2hpY2ggbGlzdGVucyBmb3IgYW5kIHJlcG9ydHMgYW55IFNlcnZpY2VPd25lckNoYW5nZWQgZXZlbnRzCisJb24gdGhlIGJ1cyBkcml2ZXIuCisKKwkqIG1vbm8vZXhhbXBsZS9NYWtlZmlsZS5hbSAoREVTVERJUik6IEJ1aWxkIGNoYW5nZXMgZm9yIHRoZQorCW5ldyBCdXNMaXN0ZW5lci5jcyBleGFtcGxlLgorCisyMDA0LTA5LTI3ICBPbGl2aWVyIEFuZHJpZXUgIDxvbGl2X19hQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogYnVzL3NpZ25hbHMuYyAoYnVzX21hdGNoX3J1bGVfcGFyc2UpOiB2YWxpZGF0ZSB0aGUgY29tcG9uZW50cyBvZgorCW1hdGNoIHJ1bGVzIChidWcgIzE0MzkpLgorCisJKiBkYnVzL2RidXMtYnVzLmMgKGRidXNfYnVzX2FkZF9tYXRjaCk6IGFkZCBhIG1pc3NpbmcgT09NIHRlc3QuCisKKzIwMDQtMDktMjQgIE9saXZpZXIgQW5kcmlldSAgPG9saXZfX2FAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnhtbDogZG9jdW1lbnQgU2VydmljZU93bmVyQ2hhbmdlZAorCXNpZ25hbC4KKwkKKwkqIGJ1cy9kcml2ZXIuYywgYnVzL2RyaXZlci5oLCBidXMvc2VydmljZXMuYzogVXNlCisJU2VydmljZU93bmVyQ2hhbmdlZCBzaWduYWwgaW5zdGVhZCBvZiBTZXJ2aWNlQ3JlYXRlZCBhbmQKKwlTZXJ2aWNlRGVsZXRlZC4KKwkKKwkqIGJ1cy9kaXNwYXRjaC5jOiB1cGRhdGUgdGVzdGNhc2UgZm9yIHRoZSBuZXcgc2lnbmFsLgorCisyMDA0LTA5LTIwICBKb24gVHJvd2JyaWRnZSAgPHRyb3dAeGltaWFuLmNvbT4KKworCVBhdGNoIGZyb20gTmF0IEZyaWVkbWFuIDxuYXRAbm92ZWxsLmNvbT4KKworCSogbW9uby9NYWtlZmlsZS5hbTogQSBudW1iZXIgb2Ygc21hbGwgYnVpbGQgZml4ZXMgdG8gYWxsb3cgIm1ha2UKKwlkaXN0Y2hlY2siIHRvIHN1Y2NlZWQuCisKKwkqIG1vbm8vZXhhbXBsZS9NYWtlZmlsZS5hbTogIm1ha2UgZGlzdGNoZWNrIiBmaXhlcy4KKworCSogbW9uby9Bc3NlbWJseUluZm8uY3MuaW46IFdoZW4gc2lnbmluZyB0aGUgYXNzZW1ibHksIGxvb2sgZm9yIHRoZQorCWtleSBpbiBAc3JjZGlyQC4KKworCSogdGVzdC9NYWtlZmlsZS5hbTogIm1ha2UgZGlzdGNoZWNrIiBmaXhlcy4KKworMjAwNC0wOS0xNyAgT2xpdmllciBBbmRyaWV1ICA8b2xpdl9fYUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMgKF9kYnVzX3VzZXJfYXRfY29uc29sZSk6IGZpeCBtZW1sZWFrIGluIE9PTS4KKworCSogZG9jL2J1c2NvbmZpZy5kdGQ6IHVwZGF0ZSB0aGUgRFREIGZvciB0aGUgYXRfY29uc29sZSBhdHRyaWJ1dGUuCisKKwkqIGJ1cy9kcml2ZXIuYyAoYnVzX2RyaXZlcl9oYW5kbGVfaGVsbG8pOiBjb3JyZWN0bHkgaGFuZGxlIEhlbGxvCisJbWVzc2FnZXMgYWZ0ZXIgdGhlIGZpcnN0IG9uZSAoYnVnICMxMzg5KS4KKwkKKwkqIGJ1cy9kaXNwYXRjaC5jIChjaGVja19kb3VibGVfaGVsbG9fbWVzc2FnZSk6IGFkZCBhIHRlc3QgY2FzZSBmb3IKKwl0aGUgZG91YmxlIGhlbGxvIG1lc3NhZ2UgYnVnLgorCShjaGVja19leGlzdGVudF9zZXJ2aWNlX2FjdGl2YXRpb24pOiBmaXggY2hlY2sgb2Ygc3Bhd25pbmcgZXJyb3IuCisJCisyMDA0LTA5LTE2ICBEYXZpZCBaZXV0aGVuICA8ZGF2aWRAZnViYXIuZGs+CisKKwkqIHB5dGhvbi9kYnVzX2JpbmRpbmdzLnB5eC5pbjogQWRkIHN1cHBvcnQgZm9yIGludDY0IGFuZCB1aW50NjQKKworMjAwNC0wOS0xMiAgRGF2aWQgWmV1dGhlbiAgPGRhdmlkQGZ1YmFyLmRrPgorCisJUGF0Y2ggZnJvbSBLYXkgU2lldmVycyA8a2F5LnNpZXZlcnNAdnJmeS5vcmc+CisKKwkqIGJ1cy9idXMuYyAoYnVzX2NvbnRleHRfbmV3KToKKwkqIGJ1cy9idXMuaDoKKwkqIGJ1cy9tYWluLmMgKHVzYWdlKQorCShtYWluKToKKwlBZGQgY29tbWFuZGxpbmUgb3B0aW9uIC0tbm9mb3JrIHRvIG92ZXJyaWRlIGNvbmZpZ3VyYXRpb24gZmlsZQorCXNldHRpbmcuCisKKzIwMDQtMDktMDkgIE9saXZpZXIgQW5kcmlldSAgPG9saXZfX2FAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBkYnVzL2RidXMtKi5oOiByZW1vdmUgdGhlIDsgYWZ0ZXIgREJVU18oQkVHSU58RU5EKV9ERUNMUy4gU29tZSBDCisJY29tcGlsZXJzIGRvbid0IGxpa2UgaXQgKGJ1ZyAjOTc0KS4KKworMjAwNC0wOS0wNCAgSGFyYWxkIEZlcm5lbmdlbCAgPGhhcnJ5QGtkZXZlbG9wLm9yZz4KKworCSogcXQvY29ubmVjdGlvbi4qOiBBcHBsaWVkIHBhdGNoIGJ5IErDqXLDtG1lIExvZGV3eWNrCisJPGxvZGV3eWNrQGNsaXBwZXIuZW5zLmZyPiB0byBpbnRlZ3JhdGUgYW4gZXhpc3RpbmcKKwljb25uZWN0aW9uIGludG8gdGhlIFF0IGV2ZW50bG9vcAorCisyMDA0LTA4LTMwICBKb24gVHJvd2JyaWRnZSAgPHRyb3dAeGltaWFuLmNvbT4KKworCSogbW9uby9CdXNEcml2ZXIuY3M6IEFkZGVkLiAgVGhpcyBpcyBhIGNsYXNzIGZvciBpbnRlcmFjdGluZyB3aXRoCisJdGhlIG9yZy5mcmVlZGVza3RvcC5EQnVzIHNlcnZpY2UuCisKKwkqIG1vbm8vTWVzc2FnZS5jczogQWRkZWQgYSBtZWNoYW5pc20gdG8gZXhwb3NlIHRoZSBtZXNzYWdlIHRoYXQgaXMKKwljdXJyZW50bHkgYmVpbmcgZGlzcGF0Y2hlZCB2aWEgdGhlIHN0YXRpYyBNZXNzYWdlLkN1cnJlbnQKKwlwcm9wZXJ0eS4gIEFkZGVkIE1lc3NhZ2UuU2VuZGVyIGFuZCBNZXNzYWdlLkRlc3RpbmF0aW9uCisJcHJvcGVydGllcy4KKworCSogbW9uby9IYW5kbGVyLmNzOiBFeHBvc2UgdGhlIGRpc3BhdGNoZWQgbWVzc2FnZSB2aWEKKwlNZXNzYWdlLkN1cnJlbnQgd2hlbiBoYW5kbGluZyBtZXRob2QgY2FsbHMuCisKKwkqIG1vbm8vU2VydmljZS5jczogRXhwb3NlIHRoZSBkaXNwYXRjaGVkIG1lc3NhZ2UgdmlhCisJTWVzc2FnZS5DdXJyZW50IHdoZW4gaGFuZGxpbmcgc2lnbmFsIGVtaXNzaW9ucy4KKwkKKwkqIG1vbm8vQ29ubmVjdGlvbi5jczogQmluZCBkYnVzX2J1c19nZXRfYmFzZV9zZXJ2aWNlIHZpYSB0aGUKKwlDb25uZWN0aW9uLkJhc2VTZXJ2aWNlIHByb3BlcnR5LgorCisyMDA0LTA4LTI4ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLXVzZXJkYi5jIChfZGJ1c19pc19jb25zb2xlX3VzZXIpOiByZW1vdmUgdW51c2VkIHZhcmlhYmxlCisKKyAgICAgICAgTW9yZSBmaXhlcyBmcm9tIFN0ZXZlIEdydWJiCisJCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jIChfZGJ1c19jb25uZWN0X3RjcF9zb2NrZXQpOiBmaXggZmQgbGVhaworCShfZGJ1c19saXN0ZW5fdGNwX3NvY2tldCk6IGZpeCBmZCBsZWFrCisKKwkqIGRidXMvZGJ1cy1zcGF3bi5jIChyZWFkX3BpZCwgcmVhZF9pbnRzKTogbW92ZSB0aGUgImFnYWluOiIgZm9yCisJRUlOVFIgdG8gYSBiaXQgbG93ZXIgaW4gdGhlIGNvZGUKKworMjAwNC0wOC0yNiAgSm9uIFRyb3dicmlkZ2UgIDx0cm93QHhpbWlhbi5jb20+CisKKwkqIGJ1cy9kcml2ZXIuYyAoYnVzX2RyaXZlcl9oYW5kbGVfc2VydmljZV9leGlzdHMpOiBSZXNwb25kIHdpdGgKKwlUUlVFIGlmIHdlIGFyZSBpbnF1aXJpbmcgYWJvdXQgdGhlIGV4aXN0ZW5jZSBvZiB0aGUgYnVpbHQtaW4KKwlvcmcuZnJlZWRlc2t0b3AuREJ1cyBzZXJ2aWNlLgorCisyMDA0LTA4LTI1ICBKb2huIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKwkqIGJ1cy9jb25maWctcGFyc2VyLmM6CisJKHN0cnVjdCBQb2xpY3lUeXBlKTogQWRkIFBPTElDWV9DT05TT0xFCisJKHN0cnVjdCBFbGVtZW50LmQucG9saWN5KTogcy9naWRfb3JfdWlkL2dpZF91aWRfb3JfYXRfY29uc29sZQorCShzdGFydF9idXNjb25maWdfY2hpbGQpOiBTZXRzIHVwIGNvbnNvbGUgZWxlbWVudCB3aGVuCisJPHBvbGljeSBhdF9jb25zb2xlPSIiPiBpcyBlbmNvdW50ZXJlZCBpbiBhIHBvbGljeSBmaWxlCisJKGFwcGVuZF9ydWxlX2Zyb21fZWxlbWVudCk6IENvbnZlcnQgY29uc29sZSBlbGVtZW50cyB0byBjb25zb2xlCisJcnVsZXMuCisKKwkqIGJ1cy9wb2xpY3kuYzogCisJKGJ1c19wb2xpY3lfY3JlYXRlX2NsaWVudF9wb2xpY3kpOiBBZGQgY29uc29sZSBydWxlcyB0byB0aGUgY2xpZW50CisJcG9saWN5IGJhc2VkIG9uIGlmIHRoZSBjbGllbnQgaXMgYXQgdGhlIGNvbnNvbGUKKwkoYnVzX3BvbGljeV9hcHBlbmRfY29uc29sZV9ydWxlKTogTmV3IGZ1bmN0aW9uIGZvciBhZGRpbmcgYQorCWNvbnNvbGUgcnVsZSB0byBhIHBvbGljeQorCShidXNfcG9saWN5X21lcmdlKTogSGFuZGxlIGNvbnNvbGUgcnVsZSBtZXJnaW5nCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmg6IEFkZGVkIHRoZSBEQlVTX0NPTlNPTEVfRElSIGNvbnN0YW50CisJd2hlcmUgd2UgY2hlY2sgZm9yIGNvbnNvbGUgdXNlciBmaWxlcworCQorCSogZGJ1cy9kYnVzLXN5c2RlcHMuYzoKKwkoX2RidXNfZmlsZV9leGlzdHMpOiBOZXcgZnVuY3Rpb24gd2hpY2ggY2hlY2tzIGlmIHRoZSBnaXZlbgorCWZpbGUgZXhpc3RzCisJKF9kYnVzX3VzZXJfYXRfY29uc29sZSk6IE5ldyBmdW5jdGlvbiB3aGljaCBkb2VzIHRoZSBzeXN0ZW0KKwlzcGVjaWZpYyBwcm9jZXNzIG9mIGNoZWNraW5nIGlmIHRoZSB1c2VyIGlzIGF0IHRoZSBjb25zb2xlCisKKwkqIGRidXMvZGJ1cy11c2VyZGIuYzoKKwkoX2RidXNfaXNfY29uc29sZV91c2VyKTogTmV3IGZ1bmN0aW9uIGNvbnZlcnRzIGEgVUlEIHRvIHVzZXIgbmFtZQorCWFuZCB0aGVuIGNhbGxzIHRoZSBzeXN0ZW0gc3BlY2lmaWMgX2RidXNfdXNlcl9hdF9jb25zb2xlIHRvIAorCXNlZSBpZiB0aGUgdXNlciBpcyBhdCB0aGUgY29uc29sZSBhbmQgdGhlcmVmb3IgYSBjb25zb2xlIHVzZXIKKworMjAwNC0wOC0yNSAgT2xpdmllciBBbmRyaWV1ICA8b2xpdl9fYUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIGJ1cy9jb25maWctcGFyc2VyLmMgKHNldF9saW1pdCk6CisJKiBidXMvZGJ1cy1kYWVtb24tMS4xLmluOgorCSogdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9tYW55LXJ1bGVzLmNvbmY6IHNldCB0aGUKKwltYXhfbWF0Y2hfcnVsZXNfcGVyX2Nvbm5lY3Rpb24gbGltdCBmcm9tIHRoZSBjb25maWcgZmlsZS4gCisKKwkqIGRvYy9idXNjb25maWcuZHRkOiB1cGRhdGUgdGhlIERURC4KKworCSogYnVzL2RyaXZlci5jOiByZW1vdmUgc29tZSB1bnVzZWQgdmFyaWFibGVzLgorCisyMDA0LTA4LTI0ICBNaWthZWwgSGFsbGVuZGFsICA8bWlja2VAaW1lbmRpby5jb20+CisKKwkqIGRidXMvZGJ1cy1nbGliLWxvd2xldmVsLmg6IFJlbW92ZWQgZGJ1c19idXNfZ2V0X3dpdGhfZ19tYWluIHNpbmNlIAorCWl0J3MgYmVlbiByZXBsYWNlZCBieSBkYnVzX2dfYnVzX2dldAorCisyMDA0LTA4LTIzICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0ByZWRoYXQuY29tPgorCisJVXBkYXRlZCBTRUxpbnV4IHN1cHBvcnQgZnJvbSBNYXR0aGV3IFJpY2thcmQgPG1qcmlja2FAZXBvY2gubmNzYy5taWw+CisKKwkqIGJ1cy9zZWxpbnV4Lmg6IFByb3RvdHlwZSBidXNfc2VsaW51eF9nZXRfcG9saWN5X3Jvb3QuCisKKwkqIGJ1cy9zZWxpbnV4LmM6IENyZWF0ZSBhIHRocmVhZCBmb3IgcG9saWN5IHJlbG9hZCBub3RpZmljYXRpb24uCisJKGJ1c19zZWxpbnV4X2dldF9wb2xpY3lfcm9vdCk6IEltcGxlbWVudC4KKworCSogYnVzL2NvbmZpZy1wYXJzZXIuYyAoc3RhcnRfYnVzY29uZmlnX2NoaWxkKQorCShidXNfY29uZmlnX3BhcnNlcl9jb250ZW50KTogU3VwcG9ydCBTRUxpbnV4LXJvb3QgcmVsYXRpdmUKKwlpbmNsdXNpb24uCisKKwkqIGNvbmZpZ3VyZS5pbiA8SEFWRV9TRUxJTlVYPjogQWRkIC1scHRocmVhZC4KKwkKKwkqIGJ1cy90ZXN0LW1haW4uYyAodGVzdF9wcmVfaG9vaywgdGVzdF9wb3N0X2hvb2spOiBOZXcuCisJKHRlc3RfcG9zdF9ob29rKTogTW92ZSBtZW1vcnkgY2hlY2tpbmcgaW50byBoZXJlLgorCSh0ZXN0X3ByZV9ob29rLCB0ZXN0X3Bvc3RfaG9vayk6IE1vdmUgU0VMaW51eCBjaGVja3MgaW4KKwloZXJlLCBidXQgY29uZGl0aW9uYWwgb24gYSBEQlVTX1RFU1RfU0VMSU5VWCBlbnZpcm9ubWVudAorCXZhcmlhYmxlLiAgVW5mb3J0dW5hdGVseSB3ZSBjYW4ndCBydW4gdGhlIFNFTGludXggY2hlY2tzCisJYXMgYSBub3JtYWwgdXNlciwgc2luY2UgdGhleSB3b24ndCBoYXZlIGFueSBwZXJtaXNzaW9ucworCWZvciAvc2VsaW51eC4gIFNvIHRoaXMgd2lsbCBoYXZlIHRvIGJlIHRlc3RlZCBtYW51YWxseQorCWZvciBub3csIHVudGlsIHdlIGhhdmUgdmlydHVhbGl6YXRpb24gZm9yIG1vc3Qgb2YKKwlsaWJzZWxpbnV4LgorCQorMjAwNC0wOC0yMyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMgKF9kYnVzX2NoYW5nZV9pZGVudGl0eSk6IGFkZCBzZXRncm91cHMoKSB0bworCWRyb3Agc3VwcGxlbWVudGFyeSBncm91cHMsIHN1Z2dlc3RlZCBieSBTdGV2ZSBHcnViYgorCisyMDA0LTA4LTIwICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0ByZWRoYXQuY29tPgorCisJKiBidXMvY29uZmlnLXBhcnNlci5jIChzdGFydF9idXNjb25maWdfY2hpbGQpOiBSZW1vdmUgc29tZSB1bnVzZWQKKwl2YXJpYWJsZXMuCisJCisJKiBidXMvc2VsaW51eC5jIChidXNfc2VsaW51eF9pZF90YWJsZV9pbnNlcnQpOiBBdm9pZCBjb21waWxlcgorCXdhcm5pbmcuCisKKzIwMDQtMDgtMTcgIEpvZSBTaGF3ICA8am9lc2hhd0Bub3ZlbGwuY29tPgorCisJKiBjb25maWd1cmUuaW46IElmIC0tZW5hYmxlLW1vbm8gaXMgcGFzc2VkIGluLCBpZiB3ZSBjYW4ndCBmaW5kCisJbW9ubyBlcnJvciBvdXQuCisKKwkqIG1vbm8vTWFrZWZpbGUuYW06IFVzZSAvZ2FjdXRpbCB0byBpbnN0YWxsIGFzc2VtYmxpZXMgaW50byB0aGUKKwlHQUMgYW5kIG5vdCAvcm9vdC4KKworMjAwNC0wOC0xMiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIE5FV1M6IHVwZGF0ZSBmb3IgMC4yMgorCisJKiBjb25maWd1cmUuaW46IHJlbGVhc2UgMC4yMgorCisyMDA0LTA4LTExICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0ByZWRoYXQuY29tPgorCisJKiB0b29scy9kYnVzLXNlbmQuYyAobWFpbiwgdXNhZ2UpOiBBZGQgLS1yZXBseS10aW1lb3V0CisJYXJndW1lbnQuCisKKzIwMDQtMDgtMTAgIE9saXZpZXIgQW5kcmlldSAgPG9saXZfX2FAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBidXMvYnVzLmMgKHByb2Nlc3NfY29uZmlnX2ZpcnN0X3RpbWVfb25seSk6IGdldCByaWQgb2YgYW4gdW51c2VkCisJREJ1c0Vycm9yIHRoYXQgd2FzIGNhdXNpbmcgYSBtZW1veSBsZWFrIChidWcgIzk4OSkuCisKKwkqIGRidXMvZGJ1cy1rZXlyaW5nLmMsIGRidXMvZGJ1cy1tZXNzYWdlLmM6CisJZml4IGNvbXBpbGF0aW9uIG9uIFNvbGFyaXMvRm9ydGUgQyAoYnVnICM5NzQpCisKKwkqIGJ1cy9tYWluLmMgKG1haW4pOiBwbHVnIHR3byBtaW51c2N1bGUgbWVtbGVha3MuCisKKzIwMDQtMDgtMTAgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkb2MvZGJ1cy10dXRvcmlhbC54bWw6IGFkZCBzb21lIG1vcmUgaW5mbyBvbiBHTGliIGJpbmRpbmdzCisKKzIwMDQtMDgtMDkgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBDT1BZSU5HOiBzd2l0Y2ggdG8gQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xIGluc3RlYWQgb2YKKwkyLjAsIHRvIHJlc29sdmUgY29tcGxhaW50cyBhYm91dCBwYXRlbnQgdGVybWluYXRpb24gY2xhdXNlLgorCisyMDA0LTA3LTMxICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBSRUFETUU6IGFkZGVkIGRvY3VtZW50YXRpb24gZm9yIHRoZSAtLWVuYWJsZS1weXRob24gCisJY29uZmlndXJlIHN3aXRjaC4KKworMjAwNC0wNy0zMSAgT2xpdmllciBBbmRyaWV1ICA8b2xpdl9fYUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIGJ1cy9jb25maWctcGFyc2VyLmMgKGJ1c19jb25maWdfcGFyc2VyX25ldyk6IGZpeCBhbiBpbnZhbGlkCisJX3VucmVmIGluIHRoZSBTRUxpbnV4IHN1cHBvcnQuCisKKwkqIGRvYy9idXNjb25maWcuZHRkOiB1cGRhdGUgRFREIGZvciBTRUxpbnV4IHN1cHBvcnQuCisKKwkqIGJ1cy9jb25maWctbG9hZGVyLWxpYnhtbC5jOiBmaXggZXJyb3IgaGFuZGxlciBhbmQgcGFyc2VyCisJaW5pdGlhbGlzYXRpb24vY2xlYW51cC4gT09NIHRlc3Qgbm93IHdvcmtzIHdpdGggbGlieG1sMiBIRUFELgorCisJKiBjb25maWd1cmUuaW46IHJlbW92ZSB0aGUgd2FybmluZyBhYm91dCBsaWJ4bWwyLgorCisJKiBkYnVzL2RidXMtYnVzLmM6IHNpbGVuY2UgZG94eWdlbiB3YXJuaW5nLgorCisyMDA0LTA3LTMxICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0ByZWRoYXQuY29tPgorCisJKiBjb25maWd1cmUuaW46IE1vdmUgI2Vycm9yIGluIFNFTGludXggY2hlY2sgdG8gaXRzIG93biBsaW5lLgorCisyMDA0LTA3LTMxICBPbGl2aWVyIEFuZHJpZXUgIDxvbGl2X19hQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogZGJ1cy9kYnVzLWludGVybmFscy5oIChfREJVU19TRVRfT09NKToKKwkqIGJ1cy91dGlscy5oIChCVVNfU0VUX09PTSk6IHVzZSBkYnVzX2Vycm9yX3NldF9jb25zdCBpbnN0ZWFkIG9mCisJZGJ1c19lcnJvcl9zZXQuCisKKwkqIGJ1cy9kaXNwYXRjaC5jIChjaGVja19zZW5kX2V4aXRfdG9fc2VydmljZSk6IGZpeCB0aGUgdGVzdCBjYXNlLAorCWJyb2tlbiBieSB0aGUgY2hhbmdlIGluIHRoZSBfU0VUX09PTSBtYWNyb3MuCisKKzIwMDQtMDctMzEgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHJlZGhhdC5jb20+CisKKwkqIGJ1cy9zZWxpbnV4LmMgPEhBVkVfU0VMSU5VWD46IEluY2x1ZGUgdXRpbHMuaCB0byBnZXQKKwlCVVNfU0VUX09PTS4KKworMjAwNC0wNy0zMSAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAcmVkaGF0LmNvbT4KKworCSogY29uZmlndXJlLmluOiBVc2UgQUNfVFJZX0NPTVBJTEUgaW5zdGVhZCBvZiBBQ19FR1JFUF9IRUFERVIKKwl0byBjb3JyZWN0bHkgZGV0ZWN0IERCVVNfX0FDUVVJUkVfU1ZDLiAgQWxzbyBhZGQgYW4KKwlBQ19NU0dfQ0hFQ0tJTkcuCisKKzIwMDQtMDctMjQgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJU0VMaW51eCBzdXBwb3J0IGZyb20gTWF0dGhldyBSaWNrYXJkIDxtanJpY2thQGVwb2NoLm5jc2MubWlsPgorCisJKiBidXMvc2VsaW51eC5jLCBidXMvc2VsaW51eC5oOiBuZXcgZmlsZSBlbmNhcHN1bGF0aW5nIHNlbGludXgKKwlmdW5jdGlvbmFsaXR5CisKKwkqIGNvbmZpZ3VyZS5pbjogYWRkIC0tZW5hYmxlLXNlbGludXgKKwkKKwkqIGJ1cy9wb2xpY3kuYyAoYnVzX3BvbGljeV9tZXJnZSk6IGFkZCBGSVhNRSB0byBhIGNvbW1lbnQKKworCSogYnVzL21haW4uYyAobWFpbik6IGluaXRpYWxpemUgYW5kIHNodXQgZG93biBzZWxpbnV4CisKKwkqIGJ1cy9jb25uZWN0aW9uLmM6IHN0b3JlIFNFTGludXggSUQgb24gZWFjaCBjb25uZWN0aW9uLCB0byBhdm9pZCAKKwlyZXBlYXRlZCBnZXR0aW5nIG9mIHRoZSBzdHJpbmcgY29udGV4dCBhbmQgY29udmVydGluZyBpdCBpbnRvIAorCWFuIElECisKKwkqIGJ1cy9idXMuYyAoYnVzX2NvbnRleHRfZ2V0X3BvbGljeSk6IG5ldyBhY2Nlc3NvciwgdGhvdWdoIGl0CisJaXNuJ3QgdXNlZAorCShidXNfY29udGV4dF9jaGVja19zZWN1cml0eV9wb2xpY3kpOiBjaGVjayB3aGV0aGVyIHRoZSBzZWN1cml0eQorCWNvbnRleHQgb2Ygc2VuZGVyIGNvbm5lY3Rpb24gY2FuIHNlbmQgdG8gdGhlIHNlY3VyaXR5IGNvbnRleHQgb2YKKwlyZWNpcGllbnQgY29ubmVjdGlvbgorCisJKiBidXMvY29uZmlnLXBhcnNlci5jOiBhZGQgcGFyc2luZyBmb3IgPHNlbGludXg+IGFuZCA8YXNzb2NpYXRlPgorCQorCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC5jIChfZGJ1c190cmFuc3BvcnRfZ2V0X3VuaXhfZmQpOiB0bworCWltcGxlbWVudCBkYnVzX2Nvbm5lY3Rpb25fZ2V0X3VuaXhfZmQoKQorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jIChkYnVzX2Nvbm5lY3Rpb25fZ2V0X3VuaXhfZmQpOiBuZXcKKwlmdW5jdGlvbiwgdXNlZCBieSB0aGUgc2VsaW51eCBzdHVmZgorCQorMjAwNC0wNy0yOSAgT2xpdmllciBBbmRyaWV1ICA8b2xpdl9fYUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIGJ1cy9jb25maWctbG9hZGVyLWxpYnhtbC5jOiBjb21wbGV0ZSB0aGUgaW1wbGVtZW50YXRpb24gb2YKKwlsaWJ4bWwgYmFja2VuZCBmb3IgY29uZmlnIGZpbGUgbG9hZGVyLiBEb2Vzbid0IHdvcmsgd2l0aCBmdWxsIE9PTQorCXRlc3QgeWV0LiAKKwkKKwkqIGNvbmZpZ3VyZS5pbjogY2hhbmdlIGVycm9yIHdoZW4gc2VsZWN0aW5nIGxpYnhtbCBpbnRvIGEgd2FybmluZy4KKwkKKwkqIHRlc3QvZGF0YS9pbnZhbGlkLWNvbmZpZy1maWxlczogYWRkIHR3byBub24td2VsbC1mb3JtZWQgWE1MCisJZmlsZXMuIAorCQorCSogZ2xpYi9NYWtlZmlsZS5hbTogbGliZGJ1c19ndG9vbCBhbHdheXMgdXNlcyBleHBhdCwgbm90IGxpYnhtbC4KKwkKKwkqIGRidXMvZGJ1cy10cmFuc3BvcnQtdW5peC5jICh1bml4X2hhbmRsZV93YXRjaCk6IGRvIG5vdAorCWRpc2Nvbm5lY3QgaW4gY2FzZSBvZiBEQlVTX1dBVENIX0hBTkdVUCwgc2V2ZXJhbCBkb19yZWFkaW5nKCkgbWF5CisJYmUgbmVjZXNzYXJ5IHRvIHJlYWQgYWxsIHRoZSBidWZmZXIuIChidWcgIzg5NCkKKworCSogYnVzL2FjdGl2YXRpb24uYyAoYnVzX2FjdGl2YXRpb25fYWN0aXZhdGVfc2VydmljZSk6IGZpeCBhCisJcG90ZW50aWFsIGFzc2VydGlvbiBmYWlsdXJlIChidWcgIzg5NikuIFNtYWxsIG9wdGltaXphdGlvbiBpbiB0aGUKKwljYXNlIG9mIGF1dG8tYWN0aXZhdGlvbiBtZXNzYWdlcy4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAodmVyaWZ5X3Rlc3RfbWVzc2FnZSwgX2RidXNfbWVzc2FnZV90ZXN0KToKKwlhZGQgdGVzdCBjYXNlIGZvciBieXRlLXRocm91Z2gtdmFyYXJnIGJ1ZyAoIzkwMSkuIHBhdGNoIGJ5IEtpbW1vCisJSMOkbcOkbMOkaW5lbi4gCisKKzIwMDQtMDctMjggIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGdub21lLm9yZz4KKworCSogcHl0aG9uL2RidXMucHk6CisJKiBweXRob24vZGJ1c19iaW5kaW5ncy5weXguaW46CisJQWRkIGRidXMuaW5pdF9ndGhyZWFkcyAoKSwgYWxsb3cgZW1pdF9zaWduYWwgdG8gcGFzcworCWFyZ3VtZW50cyB0byB0aGUgc2lnbmFsLgorCQorMjAwNC0wNy0yNCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIEFVVEhPUlM6IGFkZCBzb21lIHBlb3BsZSwgbm90IHJlYWxseSBjb21wcmVoZW5zaXZlbHksIGxldCBtZQorCWtub3cgaWYgSSBtaXNzZWQgeW91CisKKzIwMDQtMDctMjQgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBNYWtlZmlsZS5hbSAoRElTVF9TVUJESVJTKTogYWRkIERJU1RfU1VCRElSUywgcHJvYmxlbSBzb2x2ZWQgYnkKKwlPd2VuCisKKwkqIHRlc3QvTWFrZWZpbGUuYW0gKERJU1RfU1VCRElSUyk6IGhlcmUgYWxzbworCisyMDA0LTA3LTIyICBPbGl2aWVyIEFuZHJpZXUgIDxvbGl2X19hQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYyAoZmlsbF91c2VyX2luZm8pOiBmaXggaW5leGlzdGVudCBsYWJlbCBuYW1lLAorCWJyZWFraW5nIGJ1aWxkIG9uIFNvbGFyaXMsIHJlcG9ydGVkIGJ5IEZhcmhhZCBTYWJlcmkgb24gdGhlIE1MLgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3NfdmFsaXN0KTogZml4IHRoZQorCXZhX2FyZyBpbnZvY2F0aW9uIHRvIGFjY291bnQgZm9yIGludGVnZXIgcHJvbW90aW9uIGluIHRoZSBjYXNlIG9mCisJREJVU19UWVBFX0JZVEUgKHVuc2lnbmVkIGNoYXIgaXMgcHJvbW90ZWQgdG8gaW50KS4gKGJ1ZyAjOTAxKQorCisJKiBidXMvc2VydmljZXMuYyAoYnVzX3NlcnZpY2VfcmVtb3ZlX293bmVyKTogZml4IGJ1ZyAjOTAyLCB1c2UKKwlfZGJ1c19saXN0X2dldF9maXJzdF9saW5rLCBub3QgX2RidXNfbGlzdF9nZXRfZmlyc3QuCisKKwkqIGRidXMvZGJ1cy1idXMuYyAoZGJ1c19idXNfc2VydmljZV9leGlzdHMpOiBwbHVnIGEgbWVtb3J5IGxlYWsuCisKKwkqIGRidXMvZGJ1cy1vYmplY3QtdHJlZS5jIChmcmVlX3N1YnRyZWVfcmVjdXJzZSk6IGFsd2F5cyBudWxsCisJaGFuZGxlciBmdW5jdGlvbnMgc28gdGhhdCB0aGUgYXNzZXJ0cyBpbiBfZGJ1c19vYmplY3Rfc3VidHJlZV91bnJlZgorCWRvIG5vdCBmYWlsLgorCisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LXVuaXguYyAoZG9fcmVhZGluZyk6CisJX2RidXNfdHJhbnNwb3J0X3F1ZXVlX21lc3NhZ2VzIHJldHVybiB2YWx1ZSBpcyBvZiB0eXBlCisJZGJ1c19ib29sX3QsIG5vdCBEQnVzRGlzcGF0Y2hTdGF0dXMuCisJCisyMDA0LTA3LTE5ICBEYXZpZCBaZXV0aGVuICA8ZGF2aWRAZnViYXIuZGs+CisKKwkqIGRidXMvZGJ1cy1wcm90b2NvbC5oOiBBZGQgREJVU19FUlJPUl9VTklYX1BST0NFU1NfSURfVU5LTk9XTgorCisJKiBidXMvZGlzcGF0Y2guYzoKKwkoY2hlY2tfZ2V0X2Nvbm5lY3Rpb25fdW5peF91c2VyKTogRGVidWcgc2F5cyBHZXRQcm9wZXJ0eTsgYnV0IHRoZQorCW1ldGhvZCBpcyBjYWxsZWQgR2V0Q29ubmVjdGlvblVuaXhVc2VyCisJKGNoZWNrX2dldF9jb25uZWN0aW9uX3VuaXhfcHJvY2Vzc19pZCk6IE5ldyBmdW5jdGlvbgorCShidXNfZGlzcGF0Y2hfdGVzdCk6IEFjdHVhbGx5IGNhbGwgY2hlY2tfZ2V0X2Nvbm5lY3Rpb25fdW5peF91c2VyKCk7CisJYWxzbyBjYWxsIGNoZWNrX2dldF9jb25uZWN0aW9uX3VuaXhfcHJvY2Vzc19pZCgpCisJCisJKiBidXMvZHJpdmVyLmM6CisJKGJ1c19kcml2ZXJfaGFuZGxlX2dldF9jb25uZWN0aW9uX3VuaXhfcHJvY2Vzc19pZCk6IE5ldyBmdW5jdGlvbiwKKwloYW5kbGVzIEdldENvbm5lY3Rpb25Vbml4UHJvY2Vzc0lEIG9uIHRoZSBvcmcuZnJlZWRlc2t0b3AuREJ1cworCWludGVyZmFjZQorCQorCSogZGJ1cy9kYnVzLWF1dGguYzoKKwkoaGFuZGxlX3NlcnZlcl9kYXRhX2V4dGVybmFsX21lY2gpOiBTZXQgcGlkIGZyb20gdGhlIGNyZWRlbnRpYWxzCisJb2J0YWluZWQgZnJvbSB0aGUgc29ja2V0CisJCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jOgorCShkYnVzX2Nvbm5lY3Rpb25fZ2V0X3VuaXhfcHJvY2Vzc19pZCk6IE5ldyBmdW5jdGlvbgorCQorCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uaDogCisJQWRkIHByb3RvdHlwZSBmb3IgZGJ1c19jb25uZWN0aW9uX2dldF91bml4X3Byb2Nlc3NfaWQKKwkKKwkqIGRidXMvZGJ1cy10cmFuc3BvcnQuYzoKKwkoX2RidXNfdHJhbnNwb3J0X2dldF91bml4X3Byb2Nlc3NfaWQpOiBOZXcgZnVuY3Rpb24KKwkKKwkqIGRidXMvZGJ1cy10cmFuc3BvcnQuaDoKKwlBZGQgcHJvdG90eXBlIGZvciBfZGJ1c190cmFuc3BvcnRfZ2V0X3VuaXhfcHJvY2Vzc19pZAorCQorMjAwNC0wNy0xOSAgT2xpdmllciBBbmRyaWV1ICA8b2xpdl9fYUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmM6IE1lc3NhZ2UgY291bnRlciBmaXgsIHBhdGNoIGJ5IENocmlzdGlhbgorCUhhbW1vbmQgPGNoaXB4ODZAZ251cGRhdGUub3JnPgorCisyMDA0LTA3LTE4ICBTZXRoIE5pY2tlbGwgIDxzZXRoQGdub21lLm9yZz4KKworCSogcHl0aG9uL2RidXMucHk6CisJKiBweXRob24vZGJ1c19iaW5kaW5ncy5weXguaW46CisJKiBweXRob24vdGVzdHMvdGVzdC1jbGllbnQucHk6CisKKwlBZGQgZGJ1cy5CeXRlQXJyYXkgYW5kIGRidXNfYmluZGluZ3MuQnl0ZUFycmF5CisJdHlwZXMgc28gdGhhdCBieXRlIHN0cmVhbXMgY2FuIGJlIHBhc3NlZCBiYWNrLgorCisJR2l2ZSBqZGFobGluIHRoZSBoZWFwcyBvZiBjcmVkaXQgdGhhdCBhcmUgc28KKwlyaWdodGZ1bGx5IGhpcy4KKwkKKzIwMDQtMDctMTIgIFNldGggTmlja2VsbCAgPHNldGhAZ25vbWUub3JnPgorCisJKiBweXRob24vZGJ1cy5weToKKworCUFkZCBtZXNzYWdlIGFyZ3VtZW50IHRvIHRoZSBkZWZhdWx0IG9iamVjdF9tZXRob2RfaGFuZGxlcgorCWZ1bmN0aW9uLgorCQorCSogcHl0aG9uL2RidXNfYmluZGluZ3MucHl4LmluOgorCisJQXV0b21hdGljYWxseSByZXR1cm4gTklMIHdoZW4gcGFzc2VkIGFuIGVtcHR5IGxpc3QKKwkod2UgY2FuJ3QgcGFzcyBiYWNrIGEgbGlzdCBzaW5jZSBsaXN0cyBhcmUgdHlwZWQKKwlhbmQgd2UgZG9uJ3QgaGF2ZSBhbnkgaWRlYSB3aGF0IHR5cGUgdGhlIHRoZSBjbGllbnQKKwlpbnRlbmRlZCB0aGUgbGlzdCB0byBiZS4uLiA6LSggKQorCQorMjAwNC0wNy0xMCAgU2V0aCBOaWNrZWxsICA8c2V0aEBnbm9tZS5vcmc+CisKKwkqIHB5dGhvbi9leGFtcGxlcy9NYWtlZmlsZS5hbToKKworCUZpeCBkaXN0Y2hlY2sgYnJlYWthZ2UgY2F1c2VkIGJ5IG5ldyBleGFtcGxlcy4KKworMjAwNC0wNy0xMCAgU2V0aCBOaWNrZWxsICA8c2V0aEBnbm9tZS5vcmc+CisKKwkqIHB5dGhvbi9kYnVzLnB5OgorCisJQWRkICJtZXNzYWdlIiBhcmd1bWVudCB0byBzZXJ2aWNlLXNpZGUgZGJ1cy5PYmplY3QKKwltZXRob2RzLiBUaGlzIHdpbGwgYnJlYWsgZXhpc3Rpbmcgc2VydmljZXMgd3JpdHRlbgorCXVzaW5nIHRoZSBweXRob24gYmluZGluZ3MsIGJ1dCB3aWxsIGFsbG93IGV4dHJhY3Rpb24KKwlvZiBhbGwgdGhlIG1lc3NhZ2UgaW5mb3JtYXRpb24gKGUuZy4gd2hvIGl0cyBmcm9tKS4KKworCUFkZCBpbXByb3ZlZCAib2JqZWN0IG9yaWVudGVkIiBzaWduYWwgaGFuZGxpbmcvZW1pc3Npb24uCisJCisJKiBweXRob24vZXhhbXBsZXMvZXhhbXBsZS1zZXJ2aWNlLnB5OgorCisJTml4IHRoaXMgZXhhbXBsZS4KKwkKKwkqIHB5dGhvbi9leGFtcGxlcy9leGFtcGxlLXNpZ25hbC1lbWl0dGVyLnB5OgorCSogcHl0aG9uL2V4YW1wbGVzL2V4YW1wbGUtc2lnbmFsLXJlY2lwaWVudC5weToKKworCVR3byBuZXcgZXhhbXBsZXMgdGhhdCBzaG93IGhvdyB0byBlbWl0IGFuZCByZWNlaXZlCisJc2lnbmFscyB1c2luZyB0aGUgbmV3IEFQSXMuCisJCisJKiBweXRob24vZXhhbXBsZXMvZXhhbXBsZS1zaWduYWxzLnB5OgorCSogcHl0aG9uL2V4YW1wbGVzL2djb25mLXByb3h5LXNlcnZpY2UucHk6CisJKiBweXRob24vZXhhbXBsZXMvZ2NvbmYtcHJveHktc2VydmljZTIucHk6CisKKwlBZGQgIm1lc3NhZ2UiIGFyZ3VtZW50IHRvIHNlcnZpY2UgbWV0aG9kcy4KKworMjAwNC0wNi0yOCAgS2F5IFNpZXZlcnMgPGtheS5zaWV2ZXJzQHZyZnkub3JnPgorCisJKiBidXMvZHJpdmVyLmMgKGJ1c19kcml2ZXJfaGFuZGxlX2dldF9jb25uZWN0aW9uX3VuaXhfdXNlcikKKwkqIGRidXMvYnVzLmMgKGRidXNfYnVzX2dldF91bml4X3VzZXIpCisJKiBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnhtbDogaW1wbGVtZW50IEdldENvbm5lY3Rpb25Vbml4VXNlcgorCW1ldGhvZCBvZiBvcmcuZnJlZWRlc2t0b3AuREJ1cyBpbnRlcmZhY2UuCisKKwkqIGJ1cy9kaXNwYXRjaC5jOiB0ZXN0IGNhc2UKKworMjAwNC0wNi0yMyAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogcHl0aG9uL01ha2VmaWxlLmFtOiBzd2l0Y2hlZCBpbmNsdWRlIGRpcmVjdG9yeSBmcm9tIGdsaWIvIHRvIGRidXMvCisJc2luY2UgZGJ1cy1nbGliLmggbW92ZWQKKyAKKzIwMDQtMDYtMjIgIE9saXZpZXIgQW5kcmlldSAgPG9saXZfX2FAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBjb25maWd1cmUuaW46IHByZXZlbnQgYnVpbGRpbmcgdGhlIGdjaiBzdHVmZiBhbmQgbGlieG1sIGxvYWRlcgorCXNpbmNlIHRoZXkgYXJlIGJyb2tlbi4KKworMjAwNC0wNi0yMCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKyAgICAgICAgKiBkYnVzL2RidXMtZ2xpYi1lcnJvci1lbnVtLmg6IGF1dG9nZW5lcmF0ZSB0aGUgR0Vycm9yIGVudW0gCisJY29kZXMgZnJvbSB0aGUgZGJ1cyBlcnJvciBuYW1lcworCQorICAgICAgICAqIGdsaWIvZGJ1cy1nbGliLmg6IG1vdmUgdG8gc3ViZGlyIGRidXMvIHNpbmNlIGl0J3MgaW5jbHVkZWQgCisJYXMgZGJ1cy9kYnVzLWdsaWIuaCBhbmQgdGhhdCBicmVha2FnZSBpcyBub3cgdmlzaWJsZSBkdWUgdG8gCisJaW5jbHVkaW5nIGRidXMvZGJ1cy1nbGliLmggaW4gZGJ1cy1nbGliLWxvd2xldmVsLmgKKwkKKwkqIGdsaWIvZGJ1cy1nbGliLmg6IHMvZ3Byb3h5L2dfcHJveHkvCisKKwkqIGRidXMvZGJ1cy1zaGFyZWQuaDogbmV3IGhlYWRlciB0byBob2xkIHN0dWZmIHNoYXJlZCB3aXRoCisJYmluZGluZyBBUElzCisJCisJKiBkYnVzL2RidXMtcHJvdG9jb2wuaCAoREJVU19FUlJPUl8qKTogbW92ZSBlcnJvcnMgaGVyZSByYXRoZXIKKwl0aGFuIGRidXMtZXJyb3JzLmgKKworCSogZ2xpYi9kYnVzLWdsaWIuaCAoZGJ1c19zZXRfZ19lcnJvcik6IG1vdmUgdG8KKwlkYnVzLWdsaWItbG93bGV2ZWwuaAorCisJKiBnbGliL2RidXMtZ2xpYi5oOiByZW1vdmUgZGJ1cy9kYnVzLmggZnJvbSBoZXJlOyBjaGFuZ2UgYSBidW5jaAorCW9mIHN0dWZmIHRvIGVuYWJsZSB0aGlzCisKKwkqIGRidXMvZGJ1cy1nbGliLWxvd2xldmVsLmg6IHB1dCBkYnVzL2RidXMuaCBoZXJlCisKKwkqIGEgYnVuY2ggb2Ygb3RoZXIgY2hhbmdlcyB3aXRoIHRoZSBzYW1lIGJhc2ljICJzZXBhcmF0ZSBnbGliIAorCWJpbmRpbmdzIGZyb20gZGJ1cy5oIiB0aGVtZQorCQorMjAwNC0wNi0xMCAgT3dlbiBGcmFzZXItR3JlZW4gIDxvd2VuQGRpc2NvYmFiZS5uZXQ+CisKKwkqIGRidXMtc2hhcnAucGMuaW46IFJlbW92ZWQgZ2xpYi1zaGFycCBpbmNsdXNpb24gaW4gTGlicy4KKworCSogcHl0aG9uL2V4YW1wbGVzL01ha2VmaWxlLmFtOiBGaXhlZCB0eXBvIGluIEVYVFJBX0RJU1QuCisKKzIwMDQtMDYtMDkgIE9saXZpZXIgQW5kcmlldSAgPG9saXZfX2FAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBidXMvZHJpdmVyLmMsIGRidXMvZGJ1cy1idXMuYzogdXNlIEJPT0xFQU4gaW5zdGVhZCBvZiBVSU5UMzIgZm9yCisJdGhlIHJlcGx5IHZhbHVlIG9mIHRoZSBTZXJ2aWNlRXhpc3RzIG1lc3NhZ2UuCisKKzIwMDQtMDYtMDcgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIHB5dGhvbi9kYnVzX2JpbmRpbmdzLnB5eC5pbjogTm8gbG9uZ2VyIG5lZWQgdG8gcGFyc2UgcGF0aAorCWVsZW1lbnRzIGFuZCBwYXNzIHRoZW0gYXMgYXJyYXlzIG9mIHN0cmluZ3MuICBUaGUgQyBBUEkgbm93CisJYWNjZXB0cyBwbGFpbiBwYXRoIHN0cmluZ3MuCisJKF9idWlsZF9wYXJzZWRfcGF0aCk6IHJlbW92ZWQgCisKKzIwMDQtMDYtMDcgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkb2MvVE9ETzogcmVtb3ZlIGF1dG8tYWN0aXZhdGlvbiBpdGVtIHNpbmNlIGl0J3MgZG9uZTsgc29ydAorCWl0ZW1zIGJ5IGltcG9ydGFuY2UvbWlsZXN0b25lCisKKzIwMDQtMDYtMDcgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS1idWlsZGVyLmMgKF9kYnVzX21lc3NhZ2VfZGF0YV9sb2FkKTogYXBwZW5kCisJcmFuZG9tIHNpZ25hdHVyZSB3aGVuIHVzaW5nIFJFUVVJUkVEX0ZJRUxEUyAodGhpcyBoYWNrIHdvbid0IHdvcmsKKwlpbiB0aGUgbG9uZyB0ZXJtKQorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jOiBjaGFuZ2UgdGhlIHNpZ25hdHVyZSB0byBiZSBhIGhlYWRlciBmaWVsZCwKKwlpbnN0ZWFkIG9mIG1lc3NhZ2UtPnNpZ25hdHVyZSBzcGVjaWFsLWNhc2Ugc3RyaW5nLiBJbmNyZW1lbnRhbAorCXN0ZXAgZm9yd2FyZC4gVGhlbiB3ZSBjYW4gZml4IHVwIGNvZGUgdG8gc2VuZCB0aGUgc2lnbmF0dXJlIGluIHRoZQorCW1lc3NhZ2UsIHRoZW4gZml4IHVwIGNvZGUgdG8gdmFsaWRhdGUgc2FpZCBzaWduYXR1cmUsIHRoZW4gZml4IHVwCisJY29kZSB0byBub3QgcHV0IHRoZSB0eXBlY29kZXMgaW5saW5lLCBldGMuCisJKGxvYWRfb25lX21lc3NhZ2UpOiBkb24ndCBtYWtlIHVwIHRoZSBzaWduYXR1cmUgYWZ0ZXIgdGhlIGZhY3QKKwkoZGVjb2RlX2hlYWRlcl9kYXRhKTogcmVxdWlyZSBzaWduYXR1cmUgZmllbGQgZm9yIHRoZSBrbm93bgorCW1lc3NhZ2UgdHlwZXMKKworCSogZGJ1cy9kYnVzLW1hcnNoYWwuYyAoX2RidXNfbWFyc2hhbF9zdHJpbmdfbGVuKTogbmV3CisKKwkqIGRidXMvZGJ1cy1wcm90b2NvbC5oOiBhZGQgREJVU19IRUFERVJfRklFTERfU0lHTkFUVVJFCisKKzIwMDQtMDYtMDcgIE93ZW4gRnJhc2VyLUdyZWVuICA8b3dlbkBkaXNjb2JhYmUubmV0PgorCisJKiBtb25vL0RCdXNUeXBlL09iamVjdFBhdGguY3M6IFJlbmFtZWQgUGF0aE5hbWUgYXJndW1lbnQgdG8gUGF0aAorCisJKiBtb25vL0hhbmRsZXIuY3M6IFVwZGF0ZWQgdG8gZm9sbG93IG5ldyBwYXRoIGFyZ3VtZW50IGZvcgorCSh1bi0pcmVnaXN0ZXJpbmcgb2JqZWN0cy4KKworCSogbW9uby9leGFtcGxlL01ha2VmaWxlLmFtOgorCSogbW9uby9NYWtlZmlsZS5hbToKKwkqIGNvbmZpZ3VyZS5pbjogQnVtcGVkIHJlcXVpcmVkIHZlcnNpb24gZm9yIG1vbm8gYW5kIHVzZSBuZXcgLXBrZworCXN5bnRheCBmb3IgZGVwcworCisyMDA0LTA2LTA1ICBPbGl2aWVyIEFuZHJpZXUgIDxvbGl2X19hQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uaCwgZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYzogaGF2ZSBvYmplY3QgcGF0aAorCXJlZ2lzdHJhdGlvbiBmdW5jdGlvbnMgdGFrZSB0aGUgcGF0aCBhcmd1bWVudCBhcyBjaGFyKiBpbnN0ZWFkIG9mCisJY2hhcioqLgorCisJKiBkYnVzL2RidXMtbWFyc2hhbC5oLCBkYnVzL2RidXMtbWFyc2hhbC5jIChfZGJ1c19kZWNvbXBvc2VfcGF0aCk6CisJc3BsaXQgb2ZmIHRoZSBwYXRoIGRlY29tcG9zdGlvbiBwYXJ0IG9mCisJX2RidXNfZGVtYXJzaGFsX29iamVjdF9wYXRoLiBTb21lIG1pc2MuIGZpeGVzIHRvIHNpbGVuY2UgY29tcGlsZXIKKwl3YXJuaW5ncy4gCisKKwkqIGdsaWIvZGJ1cy1nb2JqZWN0LmMsIHRlc3QvdGVzdC1zZXJ2aWNlLmM6IHVwZGF0ZSBhY2NvcmRpbmdseS4KKwkKKzIwMDQtMDYtMDIgIEtyaXN0aWFuIEjDuGdzYmVyZyAgPGtyaEByZWRoYXQuY29tPgorIAorCSogZGJ1cy9kYnVzLWF1dGguYzogUmV3cml0ZSBhdXRoIHByb3RvY29sIGhhbmRsaW5nIHRvIHVzZSBhIHN0YXRlCisJbWFjaGluZSBhcHByb2FjaC4gIEEgc3RhdGUgaXMgaW1wbGVtZW50ZWQgYXMgYSBmdW5jdGlvbiB0aGF0CisJaGFuZGxlcyBpbmNvbWluZyBldmVudHMgYXMgc3BlY2lmaWVkIGZvciB0aGF0IHN0YXRlLgorCQorCSogZG9jL2RidXMtc3BlY2lmaWNhdGlvbi54bWw6IFVwZGF0ZSBhdXRoIHByb3RvY29sIHN0YXRlIG1hY2hpbmUKKwlzcGVjaWZpY2F0aW9uIHRvIG1hdGNoIGltcGxlbWVudGF0aW9uLiAgUmVtb3ZlIHNvbWUgbGVmdG92ZXIKKwliYXNlNjQgZXhhbXBsZXMuCisKKzIwMDQtMDYtMDIgIEtyaXN0aWFuIEjDuGdzYmVyZyAgPGtyaEByZWRoYXQuY29tPgorCisJKiBnbGliL2RidXMtZ3Byb3h5LmMsIGdsaWIvZGJ1cy1nbWFpbi5jLCBkYnVzL2RidXMtc3RyaW5nLmMsCisJZGJ1cy9kYnVzLW9iamVjdC10cmVlLmMsIGRidXMvZGJ1cy1tZXNzYWdlLmM6IGFkZCBjb21tZW50cyB0bworCXF1aWV0IGRveHlnZW4uCisKKwkqIERveHlmaWxlLmluOiByZW1vdmUgZGVwcmVjYXRlZCBvcHRpb25zLgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS1oYW5kbGVyLmMsIGRidXMvZGJ1cy1tZXNzYWdlLWhhbmRsZXIuaCwKKwlnbGliL3Rlc3QtdGhyZWFkLmgsIGdsaWIvdGVzdC10aHJlYWQtY2xpZW50LmMsCisJZ2xpYi90ZXN0LXRocmVhZC1zZXJ2ZXIuYywgZ2xpYi90ZXN0LXByb2ZpbGUuYywKKwlnbGliL3Rlc3QtZGJ1cy1nbGliLmM6IHJlbW92ZSB0aGVzZSB1bnVzZWQgZmlsZXMuCisKKzIwMDQtMDYtMDEgIE9saXZpZXIgQW5kcmlldSAgPG9saXZfX2FAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBkYnVzL2RidXMtb2JqZWN0LXRyZWUuYworCShfZGJ1c19vYmplY3RfdHJlZV9kaXNwYXRjaF9hbmRfdW5sb2NrKTogZml4IGRpc3BhdGNoIGZvcgorCW5vbi1mYWxsYmFjayBoYW5kbGVycyAoYnVnICM2ODQpLgorCShfZGJ1c19vYmplY3Rfc3VidHJlZV9uZXcpOiBpbml0aWFsaXplIGludm9rZV9hc19mYWxsYmFjayBmaWVsZC4KKwkoZmluZF9zdWJ0cmVlX3JlY3Vyc2UpOiByZXBvcnQgd2V0aGVyIHRoZSByZXR1cm5lZCBzdWJ0cmVlIGlzIGFuCisJZXhhY3QgbWF0Y2ggb3IgYSAiZmFsbGJhY2siIG1hdGNoIGhpZ2hlciB1cCBpbiB0aGUgdHJlZS4KKwkob2JqZWN0X3RyZWVfdGVzdF9pdGVyYXRpb24pOiB1cGRhdGUgdGVzdCBjYXNlLgorCisyMDA0LTA2LTAxICBTZXRoIE5pY2tlbGwgIDxzZXRoQGdub21lLm9yZz4KKworCSogcHl0aG9uL2RidXNfYmluZGluZ3MucHl4LmluOgorCSogcHl0aG9uL3Rlc3RzL3Rlc3QtY2xpZW50LnB5OgorCisJUm91bmQgb2ZmIGJhc2ljIHR5cGUgc3VwcG9ydC4gQWRkIGRpY3RzICh5YXkhKSwgYW5kIAorCXJlbWFpbmluZyBhcnJheSB0eXBlcy4KKworCU1ha2UgTWVzc2FnZUl0ZXIgbW9yZSBnZW5lcmFsIHNvIGl0IHdvcmtzIGZvciBkaWN0cyB0b28uCisKKwlNYXJrIGFsbCBsb29wIHZhcmlhYmxlcyBhcyBDIGludGVnZXJzLgorCQorMjAwNC0wNS0zMSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGdsaWIvZGJ1cy1naWRsLmMgKG1ldGhvZF9pbmZvX2FkZF9hcmcpOiBrZWVwIGFyZ3Mgc29ydGVkIHdpdGgKKwkiaW4iIGJlZm9yZSAib3V0IgorCisJKiBnbGliL2RidXMtZ29iamVjdC5jIChkYnVzX3R5cGVfdG9fc3RyaW5nKTogbW92ZSB0byBkYnVzLWd1dGlscy5jCisKKwkqIGdsaWIvZGJ1cy1nbGliLXRvb2wuYyAobWFpbik6IHNldCB1cCB0byBoYXZlIGEgLS1zZWxmLXRlc3QKKwlvcHRpb24gdGhhdCBydW5zIHRoZSB0ZXN0cywgYW5kIHN0YXJ0IGZpbGxpbmcgaW4gc29tZSBjb2RlCisJaW5jbHVkaW5nIGZvciBzdGFydGVycyBqdXN0IGR1bXBpbmcgdGhlIGludGVyZmFjZXMgdG8gc3Rkb3V0CisKKwkqIGdsaWIvTWFrZWZpbGUuYW0gKElOQ0xVREVTKTogZGVmaW5lIERCVVNfTE9DQUxFRElSCisKKwkqIHRlc3QvZGF0YS92YWxpZC1pbnRyb3NwZWN0aW9uLWZpbGVzL2xvdHMtb2YtdHlwZXMueG1sOiB0ZXN0IG9mCisJYW4gZXhhbXBsZSBpbnRyb3NwZWN0aW9uIGZpbGUKKworCSogZ2xpYi9kYnVzLWdwYXJzZXIuYyAocGFyc2VyX2NoZWNrX2RvY3R5cGUpOiBkb2N0eXBlIHNob3VsZCBiZQorCSJub2RlIiAoSSB0aGluay4uLikKKworMjAwNC0wNS0zMSAgU2V0aCBOaWNrZWxsICA8c2V0aEBnbm9tZS5vcmc+CisKKwkqIHB5dGhvbi9kYnVzX2JpbmRpbmdzLnB5eC5pbjoKKwkqIHB5dGhvbi90ZXN0cy90ZXN0LWNsaWVudC5weToKKworCVRlc3QgU3VpdGU6IDEKKwlQeXRob24gQmluZGluZ3M6IDAKKworCUZpeCBzdHJpbmcgYXJyYXkgbWVtb3J5IHRyYXNoaW5nIGJ1Zy4uLiBvb3BzLi4uCisKKzIwMDQtMDUtMzAgIFNldGggTmlja2VsbCAgPHNldGhAZ25vbWUub3JnPgorCisJKiBweXRob24vZGJ1cy5weToKKworCUFkZCBhIG5pY2VyLWJ1dC1sZXNzLWZsZXhpYmxlIGFsdGVybmF0ZSBBUEkgZm9yIGhhbmRsaW5nIAorCWNhbGxzIHRvIHZpcnR1YWwgb2JqZWN0cyBpbiBkYnVzLk9iamVjdFRyZWUuCisKKwlTY3JldyB1cCB0aGUgYXJndW1lbnQgb3JkZXIgdG8gdGhlIGRidXMuT2JqZWN0IGNvbnN0cnVjdG9yCisJZm9yIGNvbnNpc3RlbmN5IHdpdGggZGJ1cy5PYmplY3RUcmVlIChhbmQgdG8gbWFrZSBkYnVzX21ldGhvZHMKKwlvcHRpb25hbCBmb3IgZnV0dXJlIGV4dGVuc2lvbikKKwkKKwkqIHB5dGhvbi9leGFtcGxlcy9NYWtlZmlsZS5hbToKKwkqIHB5dGhvbi9leGFtcGxlcy9nY29uZi1wcm94eS1zZXJ2aWNlLnB5OgorCSogcHl0aG9uL2V4YW1wbGVzL2djb25mLXByb3h5LXNlcnZpY2UyLnB5OgorCisJQWx0ZXJuYXRlIGltcGxlbWVudGF0aW9uIG9mIGdjb25mLXByb3h5LXNlcnZpY2UgdXNpbmcgdGhlCisJbmljZXIgZGJ1cy5PYmplY3RUcmVlIEFQSS4KKwkKKwkqIHB5dGhvbi9leGFtcGxlcy9leGFtcGxlLXNlcnZpY2UucHk6CisJKiBweXRob24vdGVzdHMvdGVzdC1zZXJ2ZXIucHkKKworCVJldmVyc2UgdGhlIGFyZ3VtZW50IG9yZGVyIHRvIGRlYWwgd2l0aCBkYnVzLk9iamVjdCBjb25zdHJ1Y3RvcgorCWNoYW5nZXMuCisJCisyMDA0LTA1LTMwICBTZXRoIE5pY2tlbGwgIDxzZXRoQGdub21lLm9yZz4KKworCSogcHl0aG9uL2V4YW1wbGVzL2V4YW1wbGUtY2xpZW50LnB5OgorCSogcHl0aG9uL2V4YW1wbGVzL2V4YW1wbGUtc2VydmljZS5weToKKworCVRha2UgaXQgYmFjay4gTGlzdHMgc2VlbSB0byB3b3JrIGJ1dCB0aGV5J3JlIGJyb2tlbgorCWluIHRoZSB0ZXN0IHN1aXRlLiBNYWtlIHRoZSBiYXNlIGV4YW1wbGVzIHVzZQorCWxpc3RzICh3b3JrcyBmaW5lKS4KKworMjAwNC0wNS0zMCAgU2V0aCBOaWNrZWxsICA8c2V0aEBnbm9tZS5vcmc+CisKKwkqIHB5dGhvbi9kYnVzX2JpbmRpbmdzLnB5eC5pbjoKKwkqIHB5dGhvbi90ZXN0cy90ZXN0LWNsaWVudC5weToKKworCUFkZCBzb21lIG1vcmUgdGVzdHMgYW5kIGZpeCBlcnJvcnMgdGhhdCBjcm9wIHVwLgorCVVuZm9ydHVuYXRlbHksIGN1cnJlbnRseSBpdCBzZWVtcyBsaWtlIG1hcnNoYWxsaW5nCisJYW5kIHVubWFyc2hhbGxpbmcgb2YgbGlzdHMgaXMgY29tcGxldGVseSBicm9rZW4gOi0oCisKKzIwMDQtMDUtMzAgIFNldGggTmlja2VsbCAgPHNldGhAZ25vbWUub3JnPgorCisJKiBweXRob24vZGJ1c19iaW5kaW5ncy5weXguaW46CisKKwlBZGQgc3VwcG9ydCBmb3IgT2JqZWN0UGF0aCB0eXBlLgorCisJKiBweXRob24vZGJ1cy5weToKKworCVJlZmFjdG9yIG1lc3NhZ2UgaGFuZGxpbmcgY29kZSB0byBhIGNvbW1vbiBmdW5jdGlvbi4KKwkKKwkqIHB5dGhvbi90ZXN0cy90ZXN0LWNsaWVudC5weToKKwkqIHB5dGhvbi90ZXN0cy90ZXN0LXNlcnZlci5weToKKworCUFkZCB0ZXN0cyB0aGF0IGNoZWNrIHRvIG1ha2Ugc3VyZSB2YWx1ZXMgb2YgYWxsIHR5cGVzCisJY2FuIGJlIGVjaG9lZCBmcm9tIGEgc2VydmljZSB3L28gbWFuZ2xpbmcuCisJCisyMDA0LTA1LTI5ICBTZXRoIE5pY2tlbGwgIDxzZXRoQGdub21lLm9yZz4KKworCSogcHl0aG9uL2RidXMucHk6CisKKwlBZGQgT2JqZWN0VHJlZSBjbGFzcyB3aGljaCBhbGxvd3MgaW1wbGVtZW50YXRpb24KKwlvZiB0cmVlcyBvZiAidmlydHVhbCIgb2JqZWN0cy4gQmFzaWNhbGx5IHRoZSBweXRob24KKwl3cmFwcGVyIGZvciAicmVnaXN0ZXJfZmFsbGJhY2siLgorCQorCSogcHl0aG9uL2V4YW1wbGVzL01ha2VmaWxlLmFtCisJKiBweXRob24vZXhhbXBsZXMvZ2NvbmYtcHJveHktY2xpZW50LnB5OgorCSogcHl0aG9uL2V4YW1wbGVzL2djb25mLXByb3h5LXNlcnZpY2UucHk6CisKKwlJbXBsZW1lbnQgYSBzaW1wbGUgR0NvbmYgcHJveHkgc2VydmljZSB0aGF0IHN1cHBvcnRzCisJZ2V0L3NldCBvbiBzdHJpbmcgYW5kIGludCBHQ29uZiBrZXlzIHVzaW5nIHRoZSBPYmplY3RUcmVlLgorCQorMjAwNC0wNS0yOSAgU2V0aCBOaWNrZWxsICA8c2V0aEBnbm9tZS5vcmc+CisKKwkqIHB5dGhvbi9kYnVzLnB5OgorCSogcHl0aG9uL2V4YW1wbGVzL2V4YW1wbGUtY2xpZW50LnB5OgorCSogcHl0aG9uL2V4YW1wbGVzL2V4YW1wbGUtc2VydmljZS5weToKKwkqIHB5dGhvbi9leGFtcGxlcy9saXN0LXN5c3RlbS1zZXJ2aWNlcy5weToKKworCUFkZCBTZXNzaW9uQnVzLCBTeXN0ZW1CdXMgYW5kIEFjdGl2YXRpb25CdXMgY2xhc3NlcworCXNvIHlvdSBkb24ndCBuZWVkIHRvIGtub3cgdGhlIHNwZWNpYWwgbGl0dGxlIEJVU19UWVBFCisJZmxhZy4KKwkKKzIwMDQtMDUtMjkgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBidXMvY29uZmlnLXBhcnNlci5jIChwcm9jZXNzX3Rlc3RfdmFsaWRfc3ViZGlyKTogdGVtcG9yYXJpbHkKKwlzdG9wIHRlc3RpbmcgY29uZmlnIHBhcnNlciBPT00gaGFuZGxpbmcsIHNpbmNlIGV4cGF0IGhhcyBpc3N1ZXMKKwlodHRwOi8vZnJlZWRlc2t0b3Aub3JnL3BpcGVybWFpbC9kYnVzLzIwMDQtTWF5LzAwMTE1My5odG1sCisKKwkqIGJ1cy9kYnVzLWRhZW1vbi0xLjEuaW46IGNoYW5nZSByZXF1ZXN0ZWRfcmVwbHkgdG8KKwlzZW5kX3JlcXVlc3RlZF9yZXBseS9yZWNlaXZlX3JlcXVlc3RlZF9yZXBseSBzbyB3ZSBjYW4gc2VuZCB0aGUKKwlyZXBsaWVzLCBub3QganVzdCByZWNlaXZlIHRoZW0uCisKKwkqIGJ1cy9jb25maWctcGFyc2VyLmM6IHBhcnNlIHRoZSBuZXcKKwlzZW5kX3JlcXVlc3RlZF9yZXBseS9yZWNlaXZlX3JlcXVlc3RlZF9yZXBseQorCisJKiBidXMvcG9saWN5LmMgKGJ1c19jbGllbnRfcG9saWN5X2NoZWNrX2Nhbl9zZW5kKTogYWRkCisJcmVxdWVzdGVkX3JlcGx5IGFyZ3VtZW50IGFuZCB1c2UgaXQKKworCSogYnVzL2J1cy5jIChidXNfY29udGV4dF9jaGVja19zZWN1cml0eV9wb2xpY3kpOiBwYXNzIHRocm91Z2gKKwlyZXF1ZXN0ZWRfcmVwbHkgc3RhdHVzIHRvIG1lc3NhZ2Ugc2VuZCBjaGVjaworCisJKiBidXMvc3lzdGVtLmNvbmYuaW46IGFkYXB0IHRvIHJlcXVlc3RlZF9yZXBseSBjaGFuZ2UKKwkKKzIwMDQtMDUtMjggIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiB0ZXN0L2dsaWIvdGVzdC1zZXJ2aWNlLWdsaWIuYyAobWFpbik6IHJlbW92ZSB1bnVzZWQgdmFyaWFibGUKKworCSogZ2xpYi9kYnVzLWdpZGwuYyAoYmFzZV9pbmZvX3JlZik6IGZpeCBhIHNpbGx5IGNvbXBpbGVyIHdhcm5pbmcKKworCSogZGJ1cy9kYnVzLWF1dGguaCAoZW51bSk6IHJlbW92ZSBBVVRIRU5USUNBVEVEX1dJVEhfVU5VU0VEX0JZVEVTCisJZnJvbSB0aGUgZW51bSwgbm8gbG9uZ2VyIGluIHVzZS4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuaDogaW5jbHVkZSBjb25maWcuaCBzbyBEQlVTX1ZBX0NPUFkgYWN0dWFsbHkKKwl3b3JrcyByaWdodC4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYzogYWRkIHZhcmlvdXMgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIGZvcgorCXdoZXRoZXIgZXJyb3JfbmFtZSBwYXNzZWQgaW4gaXMgYSB2YWxpZCBlcnJvciBuYW1lLgorCisyMDA0LTA1LTI4ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MpOiBBZGRlZCBzdXBwb3J0IGZvcgorCU9CSkVDVF9QQVRIIGFuZCBPQkpFQ1RfUEFUSF9BUlJBWQorCisyMDA0LTA1LTI4ICBTZXRoIE5pY2tlbGwgIDxzZXRoQGdub21lLm9yZz4KKworCSogcHl0aG9uL2V4YW1wbGVzL01ha2VmaWxlLmFtOgorCisJRm9yZ2V0IHRvIGFkZCBNYWtlZmlsZS5hbS4gRG8gbm90IHBhc3MgZ28uCisKKzIwMDQtMDUtMjggIE1pY2hhZWwgTWVla3MgIDxtaWNoYWVsQHhpbWlhbi5jb20+CisKKwkqIGdsaWIvZGJ1cy1ndmFsdWUuYyAoZGJ1c19ndmFsdWVfbWFyc2hhbCwgZGJ1c19ndmFsdWVfZGVtYXJzaGFsKTogCisJZml4IG5vIGludDY0IGNhc2UuCisKKwkqIGRidXMvZGJ1cy1zdHJpbmcuYyAoX2RidXNfc3RyaW5nX3BhcnNlX2Jhc2ljX3R5cGUpOiBpbXBsLgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChfZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2Jhc2ljX3R5cGUpLAorCShfZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2Jhc2ljX3R5cGVfYXJyYXkpOiBpbXBsLgorCWRyYXN0aWNhbGx5IHNpbXBsaWZ5IH5hbGwgcmVsZXZhbnQgX2dldCBtZXRob2RzIHRvIHVzZSB0aGVzZS4KKwkoX2RidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpY19hcnJheSksCisJKGRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYyk6IGltcGwKKwlkcmFzdGljYWxseSBzaW1wbGlmeSB+YWxsIHJlbGV2YW50IF9hcHBlbmQgbWV0aG9kcyB0byB1c2UgdGhlc2UuCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLWJ1aWxkZXIuYyAocGFyc2VfYmFzaWNfdHlwZSkgCisJKHBhcnNlX2Jhc2ljX2FycmF5LCBsb29rdXBfYmFzaWNfdHlwZSk6IGltcGwuCisJKF9kYnVzX21lc3NhZ2VfZGF0YV9sb2FkKTogcHJ1bmUgc2NhZHMgb2YgZHVwbGljYXRlIC8KKwljdXQgJiBwYXN0ZSBjb2RpbmcuCisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLmMgKF9kYnVzX2RlbWFyc2hhbF9iYXNpY190eXBlX2FycmF5KSAKKwkoX2RidXNfZGVtYXJzaGFsX2Jhc2ljX3R5cGUpOiBpbXBsZW1lbnQsCisJKGRlbWFyc2hhbF9hbmRfdmFsaWRhdGVfbGVuL2FyZyk6IGJlZWYgdXAgZGVidWcuCisJKF9kYnVzX21hcnNoYWxfYmFzaWNfdHlwZSwgX2RidXNfbWFyc2hhbF9iYXNpY190eXBlX2FycmF5KTogaW1wbC4KKworMjAwNC0wNS0yNyAgU2V0aCBOaWNrZWxsICA8c2V0aEBnbm9tZS5vcmc+CisKKwkqIGNvbmZpZ3VyZS5pbjoKKwkqIHB5dGhvbi9NYWtlZmlsZS5hbToKKworCUluY2x1ZGUgdGhlIGV4YW1wbGUgcHl0aG9uIGFwcHMgaW4gdGhlIHRhcmJhbGwuCisJCisJKiBweXRob24vZXhhbXBsZXMvbGlzdC1zeXN0ZW0tc2VydmljZXMucHkKKworCUFkZCBhIHB5dGhvbiBuZXcgZXhhbXBsZSB0aGF0IGZldGNoZXMgdGhlIGxpc3Qgb2Ygc2VydmljZXMKKwlmcm9tIHRoZSBzeXN0ZW0gYnVzLgorCQorMjAwNC0wNS0yNyAgU2V0aCBOaWNrZWxsICA8c2V0aEBnbm9tZS5vcmc+CisKKwkqIHB5dGhvbi9kYnVzLnB5OgorCSogcHl0aG9uL2RidXNfYmluZGluZ3MucHl4LmluOgorCisJRml4IGZhaWx1cmUgdG8gbm90aWZ5IHRoYXQgYSBzaWduYWwgd2FzIG5vdCBoYW5kbGVkLAorCXJlc3VsdGVkIGluIGh1bmcgZnVuY3Rpb25zLgorCQorMjAwNC0wNS0yNSAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAcmVkaGF0LmNvbT4KKworCSogdG9vbHMvZGJ1cy1tb25pdG9yLmMgKG1haW4pOiBNb25pdG9yIGFsbCB0eXBlcyBvZiBtZXNzYWdlcy4KKworMjAwNC0wNS0yMyAgT3dlbiBGcmFzZXItR3JlZW4gIDxvd2VuQGRpc2NvYmFiZS5uZXQ+CisKKwkqIG1vbm8vSGFuZGxlci5jcywgbW9uby9TZXJ2aWNlLmNzOiBBZGRlZCBVbnJlZ2lzdGVyT2JqZWN0IG1ldGhvZAorCXdoaWNoIHVucmVnaXN0ZXJzIHRoZSBvYmplY3QgcGF0aCBhbmQgZGlzcG9zZXMgdGhlIGhhbmRsZXIuCisKKzIwMDQtMDUtMjMgIEtyaXN0aWFuIEjDuGdzYmVyZyAgPGtyaEByZWRoYXQuY29tPgorIAorICAgICAgICBQYXRjaCBmcm9tIFRpbW8gVGVyw6RzIDxleHQtdGltby50ZXJhc0Bub2tpYS5jb20+ICgjNjE0KToKKyAgICAgICAgIAorCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2FyZ3NfdmFsaXN0KTogU3dhcAorICAgICAgICBvcGVyYW5kcyB0byAmJiBzbyB3ZSBjYWxsIGRidXNfbWVzc2FnZV9pdGVyX25leHQgKCkgZm9yIHRoZSBsYXN0CisgICAgICAgIGFyZ3VtZW50IGFsc28uCisKKzIwMDQtMDUtMjEgIE9saXZpZXIgQW5kcmlldSAgPG9saXZfX2FAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBkYnVzL2RidXMtb2JqZWN0LXRyZWUuYworCShfZGJ1c19vYmplY3RfdHJlZV9saXN0X3JlZ2lzdGVyZWRfdW5sb2NrLCBsb29rdXBfc3VidHJlZSk6IHJldHVybgorCWNoaWxkcmVuIGV2ZW4gaWYgdGhlIHJlcXVlc3RlZCBwYXRoIGlzbid0IHJlZ2lzdGVyZWQuCisJKG9iamVjdF90cmVlX3Rlc3RfaXRlcmF0aW9uKTogdGVzdCBvYmplY3RfdHJlZV9saXN0X3JlZ2lzdGVyZWQuCisKKwkqIGNvbmZpZ3VyZS5pbjogdW5kZWZpbmUgSEFWRV9BQlNUUkFDVF9TT0NLRVRTIGluc3RlYWQgb2YgZGVmaW5pbmcKKwlpdCB0byAwLgorCQorMjAwNC0wNS0yMCAgS3Jpc3RpYW4gSMO4Z3NiZXJnICA8a3JoQHJlZGhhdC5jb20+CisKKwkqIGRvYy9UT0RPOiBSZW1vdmUgcmVzb2x2ZWQgaXRlbXMuCisKKwkqIGJ1cy9leHBpcmVsaXN0LmggKHN0cnVjdCBCdXNFeHBpcmVMaXN0KTogcmVtb3ZlIHVudXNlZCBuX2l0ZW1zCisJZmllbGQuCisJCisJKiBidXMvY29ubmVjdGlvbi5jIChidXNfY29ubmVjdGlvbnNfZXhwZWN0X3JlcGx5KTogRW5mb3JjZSB0aGUKKwlwZXItY29ubmVjdGlvbiBsaW1pdCBvbiBwZW5kaW5nIHJlcGxpZXMuCisJCisJUGF0Y2ggZnJvbSBKb24gVHJvd2JyaWRnZSA8dHJvd0B4aW1pYW4uY29tPjoKKyAKKyAJKiBidXMvbWFpbi5jIChzZXR1cF9yZWxvYWRfcGlwZSk6IEFkZGVkLiAgQ3JlYXRlcyBhIHBpcGUgYW5kIHNldHMKKyAJdXAgYSB3YXRjaCB0aGF0IHRyaWdnZXJzIGEgY29uZmlnIHJlbG9hZCB3aGVuIG9uZSBlbmQgb2YgdGhlIHBpcGUKKyAJYmVjb21lcyByZWFkYWJsZS4KKyAJKHNpZ25hbF9oYW5kbGVyKTogSW5zdGVhZCBvZiBkb2luZyB0aGUgY29uZmlnIHJlbG9hZCBpbiBvdXIgU0lHSFVQCisgCWhhbmRsZXIsIGp1c3Qgd3JpdGUgdG8gdGhlIHJlbG9hZCBwaXBlIGFuZCBsZXQgdGhlIGFzc29jaWF0ZWQKKyAJd2F0Y2ggaGFuZGxlIHRoZSByZWxvYWQgd2hlbiBjb250cm9sIHJldHVybnMgdG8gdGhlIG1haW4gbG9vcC4KKyAKKyAJKiBidXMvZHJpdmVyLmMgKGJ1c19kcml2ZXJfaGFuZGxlX3JlbG9hZF9jb25maWcpOiBBZGRlZC4KKyAJSW1wbGVtZW50cyBhIFJlbG9hZENvbmZpZyBtZXRob2QgZm9yIHJlcXVlc3RpbmcgYSBjb25maWd1cmF0aW9uCisgCWZpbGUgcmVsb2FkIHZpYSB0aGUgYnVzIGRyaXZlci4KKyAKKzIwMDQtMDUtMTkgIE93ZW4gRnJhc2VyLUdyZWVuICA8b3dlbkBkaXNjb2JhYmUubmV0PgorCisJKiBIQUNLSU5HOiBVcGRhdGVkIHJlbGVhc2UgaW5zdHJ1Y3Rpb25zIGNvbmNlcm5pbmcgdGhlIHdpa2kgcGFnZS4KKworMjAwNC0wNS0xOCAgS3Jpc3RpYW4gSMO4Z3NiZXJnICA8a3JoQHJlZGhhdC5jb20+CisKKyAJKiBkYnVzL2RidXMtYXV0aC5jIChjbGllbnRfdHJ5X25leHRfbWVjaGFuaXNtKTogUmVtb3ZlIGxvZ2ljIHRvCisJZmlsdGVyIGFnYWluc3QgYXV0aC0+YWxsb3dlZF9tZWNoczsgd2Ugb25seSBhZGQgYWxsb3dlZCBtZWNocyBpbgorCXJlY29yZF9tZWNoYW5pc21zKCkuCisgCisgCSogZGJ1cy9kYnVzLWF1dGgtc2NyaXB0LmMgKF9kYnVzX2F1dGhfc2NyaXB0X3J1bik6IEFkZCBhbgorCUFMTE9XRURfTUVDSFMgdG8gYXV0aC1zY3JpcHQgZm9ybWF0IHNvIHdlIGNhbiBzZXQgdGhlIGxpc3Qgb2YKKwlhbGxvd2VkIG1lY2hhbmlzbXMuCisgCisgCSogZGF0YS9hdXRoL2NsaWVudC1vdXQtb2YtbWVjaGFuaXNtcy5hdXRoLXNjcmlwdDogTmV3IHRlc3QgdG8KKwljaGVjayBjbGllbnQgZGlzY29ubmVjdHMgd2hlbiBpdCBpcyBvdXQgb2YgbWVjaGFuaXNtcyB0byB0cnkuCisgCisgCSogZGJ1cy9kYnVzLWF1dGguYyAocHJvY2Vzc19jb21tYW5kKTogUmVtb3ZlIGNoZWNrIGZvciBsaW5lcworCWxvbmdlciB0aGF0IDEgTUI7IHdlIG9ubHkgYnVmZmVyIHVwIG1heGltdW0gMTYga0IuCisgCisgCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC5jLCBkYnVzL2RidXMtdHJhbnNwb3J0LXVuaXguYywKKwlkYnVzL2RidXMtYXV0aC1zY3JpcHQuYywgZGJ1cy9kYnVzLWF1dGguYywgZGJ1cy9kYnVzLWF1dGguaDoKKwlSZW1vdmUgYXV0aCBzdGF0ZSBBVVRIRU5USUNBVEVEX1dJVEhfVU5VU0VEX0JZVEVTLCBpbnN0ZWFkIGFsd2F5cworCWFzc3VtZSB0aGVyZSBtaWdodCBiZSB1bnVzZWQgYnl0ZXMuCisgCisgCSogZGJ1cy9kYnVzLWF1dGguYyAoX2RidXNfYXV0aF9kb193b3JrKTogUmVtb3ZlIGNoZWNrIGZvcgorCWNsaWVudC1vdXQtb2YtbWVjaHMsIGl0IGlzIGhhbmRsZWQgaW4gcHJvY2Vzc19yZWplY3QoKS4gTW92ZSBjaGVjaworCWZvciBtYXggZmFpbHVyZXMgdG8gc2VuZF9yZWplY3RlZCgpLCBhcyBpdCdzIGEgc2VydmVyLW9ubHkgdGhpbmcuCisKKwkqIGRidXMvZGJ1cy1hdXRoLmM6IEZhY3RvciBvdXQgcHJvdG9jb2wgcmVwbHkgY29kZSBpbnRvIGZ1bmN0aW9ucworCXNlbmRfYXV0aCgpLCBzZW5kX2RhdGEoKSwgc2VuZF9yZWplY3RlZCgpLCBzZW5kX2Vycm9yKCksCisJc2VuZF9vaygpLCBzZW5kX2JlZ2luKCkgYW5kIHNlbmRfY2FuY2VsKCkuCisKKzIwMDQtMDUtMTcgIEtyaXN0aWFuIEjDuGdzYmVyZyAgPGtyaEByZWRoYXQuY29tPgorCisJUmVtb3ZlIGJhc2U2NCBlbmNvZGluZywgcmVwbGFjZSB3aXRoIGhleCBlbmNvZGluZy4gT3JpZ2luYWwgcGF0Y2gKKwlmcm9tIHRyb3dAeGltaWFuLmNvbSwgYWRkZWQgZXJyb3IgaGFuZGxpbmcuCisKKwkqIGRidXMvZGJ1cy1zdHJpbmcuYyAoX2RidXNfc3RyaW5nX2Jhc2U2NF9lbmNvZGUpCisJKF9kYnVzX3N0cmluZ19iYXNlNjRfZGVjb2RlKTogUmVtb3ZlLgorCShfZGJ1c19zdHJpbmdfaGV4X2RlY29kZSk6IEFkZCBlbmRfcmV0dXJuIGFyZ3VtZW50IHNvIHdlIGNhbgorCWRpc3Rpbmd1aXNoIGJldHdlZW4gT09NIGFuZCBpbnZhbGlkIGhleCBlbmNvZGluZy4KKwkoX2RidXNfc3RyaW5nX3Rlc3QpOiBSZW1vdmUgYmFzZTY0IHRlc3RzIGFuZCBhZGQgdGVzdCBjYXNlIGZvcgorCWludmFsaWQgaGV4LgorCisJKiBkYnVzL2RidXMta2V5cmluZy5jLCBkYnVzL2RidXMtYXV0aC1zY3JpcHQuYywgZGJ1cy9kYnVzLWF1dGguYzoKKwlSZXBsYWNlIGJhc2U2NCB3aXRoIGhleC4KKworCSogdGVzdC9kYXRhL2F1dGgvaW52YWxpZC1oZXgtZW5jb2RpbmcuYXV0aC1zY3JpcHQ6IE5ldyB0ZXN0IGNhc2UKKwlmb3IgaW52YWxpZCBoZXggZW5jb2RlZCBkYXRhIGluIGF1dGggcHJvdG9jb2wuCisKKzIwMDQtMDUtMTcgIE9saXZpZXIgQW5kcmlldSAgPG9saXZfX2FAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jIChjaGVja19mb3JfcmVwbHlfdW5sb2NrZWQpOiBwbHVnIGEgbWVtb3J5CisJbGVhay4KKworMjAwNC0wNS0xNSAgT3dlbiBGcmFzZXItR3JlZW4gIDxvd2VuQGRpc2NvYmFiZS5uZXQ+CisKKwkqIG1vbm8vZGJ1cy1zaGFycC5kbGwuY29uZmlnLmluOiBBZGRlZCBmb3IgR0FDCisJKiBtb25vL2RidXMtc2hhcnAuc25rOiBBZGRlZCBmb3IgR0FDCisJKiBtb25vL0Fzc2VtYmx5LmNzLmluOiBBZGRlZCBmb3IgR0FDCisJKiBtb25vL01ha2VmaWxlLmFtOiBDaGFuZ2VzIGZvciBHQUMgaW5zdGFsbGF0aW9uCQorCSogY29uZmlndXJlLmluOiBBZGRlZCByZWZzIGZvciBkYnVzLXNoYXJwLmRsbC5jb25maWcuaW4gYW5kCisJQXNzZW1ibHkuY3MuaW4uIE1vcmUgZml4ZXMgZm9yIG1vbm8gdGVzdGluZworCSogbW9uby9leGFtcGxlL01ha2VmaWxlLmFtOiBDaGFuZ2VkIHZhciB0byBDU0MKKwkqIE1ha2VmaWxlLmFtOiBDaGFuZ2VkIGZsYWcgbmFtZSB0byBEQlVTX1VTRV9DU0MKKworMjAwNC0wNS0xNSAgT3dlbiBGcmFzZXItR3JlZW4gIDxvd2VuQGRpc2NvYmFiZS5uZXQ+CisKKwkqIG1vbm8vTWFrZWZpbGUuYW06IEFkZGVkIFNVQkRJUlMgZm9yIGRvY3MuIENoYW5nZWQgU1VCRElSUyBvcmRlcgorCSogbW9uby9kb2MvKjogQWRkZWQgZG9jdW1lbnRhdGlvbiBmcmFtZXdvcmsKKwkqIGNvbmZpZ3VyZS5pbjogQWRkZWQgbW9ub2RvYyBjaGVjaworCSogUkVBRE1FOiBBZGRlZCBkZXNjcmlwdGlvbiBvZiBtb25vIGNvbmZpZ3VyZSBmbGFncworCisyMDA0LTA1LTExICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPjoKKworCSogZG9jL2RidXMtc3BlY2lmaWNhdGlvbi54bWw6IEFkZGVkIGEgIlJlcXVpcmVkIiBjb2x1bW4gdG8gdGhlIAorCWhlYWRlciBmaWVsZHMgdGFibGUgYW5kIGNoYW5nZWQgdGhlICJ6ZXJvIG9yIG1vcmUiIHZlcmJhZ2UgaW4KKwl0aGUgYWJvdmUgcGFyYWdyYXBoIHRvIHJlYWQgIlRoZSBoZWFkZXIgbXVzdCBjb250YWluIHRoZSByZXF1aXJlZCAKKwluYW1lZCBoZWFkZXIgZmllbGRzIGFuZCB6ZXJvIG9yIG1vcmUgb2YgdGhlIG9wdGlvbmFsIG5hbWVkIGhlYWRlciAKKwlmaWVsZHMiLgorCSogdGVzdC9kYXRhL2ludmFsaWQtbWVzc2FnZXMvKi5tZXNzYWdlOiBBZGRlZCB0aGUgcmVxdWlyZWQgUEFUSCAKKwluYW1lZCBoZWFkZXIgZmllbGQgdG8gdGhlIHRlc3RzIHNvIHRoYXQgdGhleSBkb24ndCBmYWlsIG9uIAorCSdNaXNzaW5nIHBhdGggZmllbGQnCisKKzIwMDQtMDUtMDcgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIHB5dGhvbi9kYnVzLWJpbmRpbmdzLnB5eC5pbjogU3RvcHBlZCB0aGUgYmluZGluZ3MgZnJvbSB0cmFzaGluZworCXRoZSBzdGFjayBieSBpbXBsaWNpdGx5IGRlZmluaW5nIHZhcmlhYmxlIGFuZCBwYXJhbWV0ZXIgdHlwZXMgYW5kCisJcmVtb3ZpbmcgdGhlIGhhY2sgb2YgZGVmaW5pbmcgQyBwb2ludGVycyBhcyBweXRob24gb2JqZWN0cyBhbmQgbGF0ZXIKKwljYXN0aW5nIHRoZW0uCisKKzIwMDQtMDUtMDIgIE93ZW4gRnJhc2VyLUdyZWVuICA8b3dlbkBkaXNjb2JhYmUubmV0PgorCisJKiBtb25vL01ha2VmaWxlLmFtOiBSZW1vdmVkIHRlc3QtZGJ1cy1zaGFycC5leGUgZnJvbSBhbGwgdGFyZ2V0CisKKzIwMDQtMDUtMDEgIE93ZW4gRnJhc2VyLUdyZWVuICA8b3dlbkBkaXNjb2JhYmUubmV0PgorCisJKiBtb25vL0RCdXNUeXBlL0RpY3QuY3M6IEhhbmRsZSBlbXB0eSBkaWN0cworCSogbW9uby9EQnVzVHlwZS9BcnJheS5jczogSGFuZGxlIGVtcHR5IGFycmF5cworCSogbW9uby9Bcmd1bWVudHMuY3M6IEhhbmRsZSBlbXB0eSBhcmd1bWVudHMKKworMjAwNC0wNC0zMCAgT3dlbiBGcmFzZXItR3JlZW4gIDxvd2VuQGRpc2NvYmFiZS5uZXQ+CisKKwkqIGRidXMtc2hhcnAucGMuaW46IE1vZGlmaWVkIHRvIGluY2x1ZGUgaW5jbHVkZSBMaWJzIGFuZCBSZXF1aXJlcworCWZpZWxkCisKKzIwMDQtMDQtMjUgIEtyaXN0aWFuIEjDuGdzYmVyZyAgPGtyaEByZWRoYXQuY29tPgorCisJKiB0ZXN0L2RhdGEvdmFsaWQtbWVzc2FnZXMvc3RhbmRhcmQtKi5tZXNzYWdlOiBVcGRhdGUgbWVzc2FnZQorCXRlc3Qgc2NyaXB0cyB0byBuZXcgaGVhZGVyIGZpZWxkIG5hbWVzLgorCisyMDA0LTA0LTIyICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiB0ZXN0L2JyZWFrLWxvYWRlci5jIChyYW5kb21seV9kb19uX3RoaW5ncyk6IHRyYWNrZWQgZG93biBidWZmZXIKKwlvdmVyZmxvdyB0byB0aW1lc193ZV9kaWRfZWFjaF90aGluZyBhcnJheSB3aGljaCB3b3VsZCBjaG9wIG9mZiB0aGUKKwlmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIGZhaWx1cmVfZGlyIHN0cmluZy4gSW5jcmVhc2VkIHRoZSBzaXplIG9mCisJdGhlIGFycmF5IHRvIDcgdG8gcmVmbGVjdCB0aGUgbnVtYmVyIG9mIHJhbmRvbSBtdXRhdGlvbiBmdW5jdGlvbnMKKwl3ZSBoYXZlLgorCisyMDA0LTA0LTIxICBLcmlzdGlhbiBIw7hnc2JlcmcgIDxrcmhAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLXNlcnZlci11bml4LmMgKHVuaXhfZmluYWxpemUpOiBEb24ndCB1bnJlZgorCXVuaXhfc2VydmVyLT53YXRjaCBoZXJlLCBpdCBpcyB1bnJlZmZlZCBpbiBkaXNjb25uZWN0LgorCShfZGJ1c19zZXJ2ZXJfbmV3X2Zvcl90Y3Bfc29ja2V0KTogY29udmVydCBOVUxMIGhvc3QgdG8KKwkibG9jYWxob3N0IiBoZXJlIHNvIHdlIGRvbid0IGFwcGVuZCBOVUxMIHRvIGFkZHJlc3MuCisJCisJKiBkYnVzL2RidXMtc2VydmVyLmMgKF9kYnVzX3NlcnZlcl90ZXN0KTogQWRkIHRlc3QgY2FzZSBmb3IKKwl2YXJpb3VzIGFkZHJlc3NlcywgaW5jbHVkaW5nIHRjcCB3aXRoIG5vIGV4cGxpY2l0IGhvc3QuCisKKzIwMDQtMDQtMjEgIE9saXZpZXIgQW5kcmlldSAgPG9saXZfX2FAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChkZWNvZGVfaGVhZGVyX2RhdGEsIGRlY29kZV9zdHJpbmdfZmllbGQpOgorCWZpeCBpbmNvcnJlY3Qgc2V0dGluZyBvZiAubmFtZV9vZmZzZXQgaW4gdGhlIEhlYWRlckZpZWxkIChpdCB3YXMKKwlvZmYgYnkgdHdvIGJ5dGVzLCBwb3NpdGlvbmVkIHJpZ2h0IGFmdGVyIHRoZSBuYW1lIGFuZCB0eXBlY29kZSkKKworCSogYnVzL2J1cy5jIChidXNfY29udGV4dF9uZXcsIGJ1c19jb250ZXh0X3VucmVmKTogdGVzdCBiZWZvcmUKKwljYWxsaW5nIGRidXNfc2VydmVyX2ZyZWVfZGF0YV9zbG90IGFuZCBfZGJ1c191c2VyX2RhdGFiYXNlX3VucmVmCisJaW4gY2FzZSBvZiBhbiBlcnJvci4KKworCSogdG9vbHMvTWFrZWZpbGUuYW06IGFkZCAkKERCVVNfR0xJQl9UT09MX0xJQlMpLCB4bWwgbGlicyBuZWVkZWQKKwlieSBsaWJkYnVzLWd0b29sLgorCisyMDA0LTA0LTE5ICBLcmlzdGlhbiBIw7hnc2JlcmcgIDxrcmhAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC11bml4LmMgKHVuaXhfZG9faXRlcmF0aW9uKTogUmV3cml0ZSB0byB1c2UKKwlfZGJ1c19wb2xsKCkgaW5zdGVhZCBvZiBzZWxlY3QoKS4KKworMjAwNC0wNC0xNSAgSm9uIFRyb3dicmlkZ2UgIDx0cm93QHhpbWlhbi5jb20+CisKKwkqIGJ1cy9tYWluLmMgKHNpZ25hbF9oYW5kbGVyKTogUmVsb2FkIHRoZSBjb25maWd1cmF0aW9uIGZpbGVzCisJb24gU0lHSFVQLgorCShtYWluKTogU2V0IHVwIG91ciBTSUdIVVAgaGFuZGxlci4KKworCSogYnVzL2J1cy5jIChzdHJ1Y3QgQnVzQ29udGV4dCk6IFN0b3JlIHRoZSBjb25maWcgZmlsZSwgdXNlciBhbmQKKwlmb3JrIGZsYWcgaW4gdGhlIEJ1c0NvbnRleHQuCisJKHByb2Nlc3NfY29uZmlnX2ZpcnN0X3RpbWVfb25seSk6IEFkZGVkLiAgQ29udGFpbnMgdGhlIGNvZGUKKwkocHJldmlvdXNseSBpbiBidXNfY29udGV4dF9uZXcpIGZvciBzZXR0aW5nIHVwIHRoZSBCdXNDb250ZXh0IGZyb20KKwl0aGUgQnVzQ29uZmlnUGFyc2VyIHRoYXQgc2hvdWxkIG9ubHkgYmUgcnVuIHRoZSBmaXJzdCB0aW1lIHRoZQorCWNvbmZpZyBmaWxlcyBhcmUgcmVhZC4KKwkocHJvY2Vzc19jb25maWdfZXZlcnlfdGltZSk6IEFkZGVkLiAgQ29udGFpbnMgdGhlIGNvZGUgKHByZXZpb3VzbHkKKwlpbiBidXNfY29udGV4dF9uZXcpIGZvciBzZXR0aW5nIHVwIHRoZSBCdXNDb250ZXh0IGZyb20gdGhlCisJQnVzQ29uZmlnUGFyc2VyIHRoYXQgc2hvdWxkIGJlIHJ1biBldmVyeSB0aW1lIHRoZSBjb25maWcgZmlsZXMgYXJlCisJcmVhZC4KKwkobG9hZF9jb25maWcpOiBBZGRlZC4gIEJ1aWxkcyBhIEJ1c0NvbmZpZ1BhcnNlciBmcm9tIHRoZSBjb25maWcKKwlmaWxlcyBhbmQgcGFzc2VzIHRoZSByZXN1bHRpbmcgc3RydWN0dXJlIG9mZiB0bworCXByb2Nlc3NfY29uZmlnX2ZpcnN0X3RpbWVfb25seSAoYXNzdW1pbmcgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSkKKwlhbmQgcHJvY2Vzc19jb25maWdfZXZlcnlfdGltZS4KKwkoYnVzX2NvbnRleHRfbmV3KTogQWxsIG9mIHRoZSBjb25maWctcmVsYXRlZCBjb2RlIGhhcyBiZWVuIG1vdmVkCisJdG8gcHJvY2Vzc19jb25maWdfZmlyc3RfdGltZV9vbmx5IGFuZCBwcm9jZXNzX2NvbmZpZ19ldmVyeV90aW1lLgorCU5vdyB0aGlzIGZ1bmN0aW9uIGp1c3QgZG9lcyB0aGUgbm9uLWNvbmZpZy1yZWxhdGVkIGluaXRpYWxpemF0aW9ucworCWFuZCBjYWxscyBsb2FkX2NvbmZpZy4KKwkoYnVzX2NvbnRleHRfcmVsb2FkX2NvbmZpZyk6IEFkZGVkLgorCisyMDA0LTA0LTE1ICBPbGl2aWVyIEFuZHJpZXUgIDxvbGl2X19hQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogYnVzL2RyaXZlci5jIChidXNfZHJpdmVyX2hhbmRsZV9nZXRfc2VydmljZV9vd25lcik6CisJaW1wbGVtZW50IGEgR2V0U2VydmljZU93bmVyIG1ldGhvZC4KKwkqIGRvYy9kYnVzLXNwZWNpZmljYXRpb24ueG1sOiBkb2N1bWVudCBpdC4KKwkqIGRidXMvZGJ1cy1lcnJvcnMuaDogYWRkIGEgJ1NlcnZpY2VIYXNOb093bmVyJyBlcnJvci4KKwkKKwkqIGdsaWIvZGJ1cy1ncHJveHkuYyAoZGJ1c19ncHJveHlfbmV3X2Zvcl9zZXJ2aWNlX293bmVyKToKKwlpbXBsZW1lbnQsIHVzaW5nIHRoZSBidXMgR2V0U2VydmljZU93bmVyIG1ldGhvZC4KKworCSogdGVzdC9nbGliL3Rlc3QtZGJ1cy1nbGliLmM6CisJdXNlIGRidXNfZ3Byb3h5X25ld19mb3Jfc2VydmljZV9vd25lciBzbyB0aGF0IHdlIGNhbiByZWNlaXZlIHRoZQorCXNpZ25hbC4gCisKKzIwMDQtMDQtMTUgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1pbnRlcm5hbHMuYywgZGJ1cy9kYnVzLW1lc3NhZ2UtYnVpbGRlci5jLAorCWRidXMvZGJ1cy1tZXNzYWdlLmMsIGRidXMvZGJ1cy1wcm90b2NvbC5oCisJKERCVVNfSEVBREVSX0ZJRUxEX1NFUlZJQ0UpOiByZW5hbWVkIERCVVNfSEVBREVSX0ZJRUxEX0RFU1RJTkFUSU9OCisKKwkqIGRidXMvZGJ1cy1pbnRlcm5hbHMuYywgZGJ1cy9kYnVzLW1lc3NhZ2UtYnVpbGRlci5jLAorCWRidXMvZGJ1cy1tZXNzYWdlLmMsIGRidXMvZGJ1cy1wcm90b2NvbC5oCisJKERCVVNfSEVBREVSX0ZJRUxEX1NFTkRFUl9TRVJWSUNFKTogcmVuYW1lZCBEQlVTX0hFQURFUl9GSUVMRF9TRU5ERVIKKworCSogZGJ1cy9kYnVzLWludGVybmFscy5jIChfZGJ1c19oZWFkZXJfZmllbGRfdG9fc3RyaW5nKToKKwlEQlVTX0hFQURFUl9GSUVMRF9ERVNUSU5BVElPTiByZXNvbHZlcyB0byAiZGVzdGluYXRpb24iCisJREJVU19IRUFERVJfRklFTERfU0VOREVSIHJlc29sdmVzIHRvICJzZW5kZXIiCisKKwkqIGRvYy9kYnVzLXNwZWNpZmljYXRpb24ueG1sIChIZWFkZXIgRmllbGRzIFRhYmxlKToKKwlzL1NFUlZJQ0UvREVTVElOQVRJT04KKwlzL1NFTkRFUl9TRVJWSUNFL1NFTkRFUgorCisKKzIwMDQtMDQtMTQgIE9saXZpZXIgQW5kcmlldSAgPG9saXZfX2FAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiB0ZXN0L2dsaWIvdGVzdC1kYnVzLWdsaWIuYyAodGltZWRfZXhpdCk6IGZhaWwgdGhlIHRlc3QgYWZ0ZXIKKwlhIGZldyBzZWNvbmRzLgorCisyMDA0LTA0LTEzICBNaWNoYWVsIE1lZWtzICA8bWljaGFlbEB4aW1pYW4uY29tPgorCisJKiBnbGliL2RidXMtZ29iamVjdC5jIChoYW5kbGVfaW50cm9zcGVjdCk6IHNwbGl0IG91dAorCShpbnRyb3NwZWN0X3Byb3BlcnRpZXMpOiB0aGlzLgorCShoYW5kbGVfaW50cm9zcGVjdCk6IGltcGxlbWVudCB0aGlzLgorCisJKiB0ZXN0L2dsaWIvTWFrZWZpbGUuYW06IHVzZSB0aGUgYWJzb2x1dGUgcGF0aCBzbyB0aGUgYnVzCisJZGFlbW9uJ3MgY2hkaXIgKCIvIikgZG9lc24ndCBraWxsIHVzIGRlYWQuCisKKwkqIGNvbmZpZ3VyZS5pbjogc3Vic3QgQUJTT0xVVEVfVE9QX0JVSUxERElSCisKKzIwMDQtMDQtMTIgIEpvbiBUcm93YnJpZGdlICA8dHJvd0B4aW1pYW4uY29tPgorCisJKiBidXMvY29uZmlnLXBhcnNlci5jIChzdHJ1Y3QgQnVzQ29uZmlnUGFyc2VyKTogQWRkZWQKKwlpbmNsdWRlZF9maWxlcyBmaWVsZC4KKwkoc2Vlbl9pbmNsdWRlKTogQWRkZWQuICBDaGVja3Mgd2hldGhlciBvciBub3QgYSBmaWxlIGhhcyBhbHJlYWR5CisJYmVlbiBpbmNsdWRlZCBieSBhbnkgcGFyZW50IEJ1c0NvbmZpZ1BhcnNlci4KKwkoYnVzX2NvbmZpZ19wYXJzZXJfbmV3KTogQ29weSB0aGUgcGFyZW50J3MgaW5jbHVkZWRfZmlsZXMuCisJKGluY2x1ZGVfZmlsZSk6IFRyYWNrIHdoaWNoIGZpbGVzIGhhdmUgYmVlbiBpbmNsdWRlZCwgYW5kIGZhaWwgb24KKwljaXJjdWxhciBpbmNsdXNpb25zLgorCShwcm9jZXNzX3Rlc3RfdmFsaWRfc3ViZGlyKTogQ2hhbmdlZCBwcmludGYgdG8gcmVwb3J0IGlmIHdlIGFyZQorCXRlc3RpbmcgdmFsaWQgb3IgaW52YWxpZCBjb25mIGZpbGVzLgorCShhbGxfYXJlX2VxdWl2KTogQ2hhbmdlZCBwcmludGYgdG8gYmUgYSBiaXQgY2xlYXJlciBhYm91dAorCXdoYXQgd2UgYXJlIGFjdHVhbGx5IGRvaW5nLgorCShidXNfY29uZmlnX3BhcnNlcl90ZXN0KTogVGVzdCBpbnZhbGlkIGNvbmZpZ3VyYXRpb24gZmlsZXMuCisKKzIwMDQtMDQtMDkgIEpvbiBUcm93YnJpZGdlICA8dHJvd0B4aW1pYW4uY29tPgorCisJKiBidXMvY29uZmlnLXBhcnNlci5jIChidXNfY29uZmlnX3BhcnNlcl9uZXcpOiBBZGRlZCBhICdwYXJlbnQnCisJYXJndW1lbnQuICBJZiBub24tbnVsbCwgdGhlIG5ld2x5LWNvbnN0cnVjdGVkIEJ1c0NvbmZpZ1BhcnNlciB3aWxsCisJYmUgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgcGFyZW50J3MgQnVzTGltaXRzIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQKKwl2YWx1ZXMuCisJKGluY2x1ZGVfZmlsZSk6IFdoZW4gaW5jbHVkaW5nIGEgY29uZmlnIGZpbGUsIHBhc3MgaW4KKwl0aGUgY3VycmVudCBwYXJzZXIgYXMgdGhlIHBhcmVudCBhbmQgdGhlbiBjb3B5IHRoZSBCdXNMaW1pdHMKKwlmcm9tIHRoZSBpbmNsdWRlZCBCdXNDb25maWdQYXJzZXIgcGFjayB0byB0aGUgY3VycmVudCBwYXJzZXIuCisJKHByb2Nlc3NfdGVzdF92YWxpZF9zdWJkaXIpOiBSZW5hbWVkIGZyb20gcHJvY2Vzc190ZXN0X3N1YmRpci4KKwkocHJvY2Vzc190ZXN0X2VxdWl2X3N1YmRpcik6IEFkZGVkLiAgV2Fsa3MgdGhyb3VnaCBhIGRpcmVjdG9yeSwKKwlkZXNjZW5kaW5nIGludG8gZWFjaCBzdWJkaXJlY3RvcnkgYW5kIGxvYWRpbmcgdGhlIGNvbmZpZyBmaWxlcworCWl0IGZpbmRzIHRoZXJlLiAgSWYgYW55IHN1YmRpcmVjdG9yeSBjb250YWlucyB0d28gY29uZmlnIGZpbGVzCisJdGhhdCBkb24ndCBwcm9kdWNlIGlkZW50aWNhbCBCdXNDb25maWdQYXJzZXIgc3RydWN0cywgZmFpbC4KKwlGb3Igbm93LCB0aGUgQnVzQ29uZmlnUGFyc2VyJ3MgQnVzUG9saWNpZXMgYXJlIG5vdCBjb21wYXJlZC4KKwkoYnVzX2NvbmZpZ19wYXJzZXJfdGVzdCk6IENhbGwgYm90aCBwcm9jZXNzX3Rlc3RfdmFsaWRfc3ViZGlyIGFuZAorCXByb2Nlc3NfdGVzdF9lcXVpdl9zdWJkaXIuCisKKwkqIGJ1cy9jb25maWctbG9hZGVyLWxpYnhtbC5jIChidXNfY29uZmlnX2xvYWQpOiBUYWtlIGEgcGFyZW50CisJYXJndW1lbnQgYW5kIHBhc3MgaXQgYWxvbmcgdG8gdGhlIGNhbGwgdG8gYnVzX2NvbmZpZ19wYXJzZXJfbmV3LgorCUFsc28gbWFkZSBhIGZldyBzbWFsbCBjaGFuZ2VzIHRvIGFsbG93IHRoaXMgY29kZSB0byBjb21waWxlLgorCisJKiBidXMvY29uZmlnLWxvYWRlci1leHBhdC5jIChidXNfY29uZmlnX2xvYWQpOiBUYWtlIGEgcGFyZW50CisJYXJndW1lbnQgYW5kIHBhc3MgaXQgYWxvbmcgdG8gdGhlIGNhbGwgdG8gYnVzX2NvbmZpZ19wYXJzZXJfbmV3LgorCisJKiBidXMvYnVzLmMgKGJ1c19jb250ZXh0X25ldyk6IExvYWQgdGhlIGNvbmZpZyBmaWxlCisJd2l0aCBhIE5VTEwgcGFyZW50IGFyZ3VtZW50LgorCisyMDA0LTAzLTI5ICBNaWNoYWVsIE1lZWtzICA8bWljaGFlbEB4aW1pYW4uY29tPgorCisJKiBnbGliL2RidXMtZ29iamVjdC5jIChpbnRyb3NwZWN0X3Byb3BlcnRpZXMpOiBzcGxpdAorCW91dCwgZml4IG1hbmdsZWQgJ3doaWxlJyBmbG93IGNvbnRyb2wuCisJKGludHJvc3BlY3Rfc2lnbmFscyk6IGltcGxlbWVudC4KKwkoaGFuZGxlX2ludHJvc3BlY3QpOiB1cGRhdGUuCisKKzIwMDQtMDMtMjkgIE1pY2hhZWwgTWVla3MgIDxtaWNoYWVsQHhpbWlhbi5jb20+CisKKwkqIGdsaWIvZGJ1cy1nb2JqZWN0LmMgKHNldF9vYmplY3RfcHJvcGVydHkpOiBzcGxpdCBvdXQgLyAKKwlyZS13b3JrLCB1c2UgdGhlIHByb3BlcnR5IHR5cGUsIGFuZCBub3QgdGhlIG1lc3NhZ2UgdHlwZSghKQorCShnZXRfb2JqZWN0X3Byb3BlcnR5KTogZGl0dG8uCisKKyAgICAgICAgKiBnbGliL2RidXMtZ3ZhbHVlLmMgKGRidXNfZ3ZhbHVlX2RlbWFyc2hhbCksCisJKGRidXNfZ3ZhbHVlX21hcnNoYWwpOiBtYWtlIHRoaXMgY29kZSByZS11c2FibGUsIG5lZWRlZAorCWZvciBzaWduYWxzIHRvbywgYWxzbyBvbiBib3RoIHByb3h5IGFuZCBzZXJ2ZXIgc2lkZS4KKwlSZS13cml0ZSBmb3IgbW9yZSBlZmZpY2llbmN5IC8gcmVhZGFiaWxpdHkuCisKKzIwMDQtMDMtMjkgIE1pY2hhZWwgTWVla3MgIDxtaWNoYWVsQHhpbWlhbi5jb20+CisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMKKwkoZGJ1c19tZXNzYWdlX25ld19lcnJvcl9wcmludGYpOiBpbXBsLgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jCisJKGRidXNfY29ubmVjdGlvbl91bnJlZ2lzdGVyX29iamVjdF9wYXRoKTogZml4IHdhcm5pbmcuCisKKwkqIGNvbmZpZ3VyZS5pbjogZml4IG5vLW1vbm8taW5zdGFsbGVkIHNpdHVhdGlvbi4KKworMjAwNC0wMy0yNyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwlQYXRjaCBmcm9tIFRpbW8gVGVyw6RzOgorCQorCSogdG9vbHMvZGJ1cy1zZW5kLmMgKG1haW4pOiBpZiAtLXByaW50LXJlcGx5LCBhc3N1bWUgdHlwZSBpcworCW1ldGhvZCBjYWxsOyBzdXBwb3J0IGJvb2xlYW4gdHlwZSBhcmdzCisJCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jIChkYnVzX2Nvbm5lY3Rpb25fc2VuZF93aXRoX3JlcGx5KTogZml4IGEKKwlidW5jaCBvZiBtZW1sZWFrIGFuZCBsb2dpYyBidWdzCisJCisyMDA0LTAzLTIzICBPd2VuIEZyYXNlci1HcmVlbiAgPG93ZW5AZGlzY29iYWJlLm5ldD4KKworICAgICAgICAqIG1vbm8vQXJndW1lbnRzLmNzOgorCSogbW9uby9JbnRyb3NwZWN0b3IuY3M6CisJKiBtb25vL0hhbmRsZXIuY3M6CisJKiBtb25vL0ludGVyZmFjZVByb3h5LmNzOgorCSogbW9uby9NZXNzYWdlLmNzCisJKiBtb25vL1Byb3h5QnVpbGRlci5jczoKKwkqIG1vbm8vU2VydmljZS5jczoKKwlBZGRlZCBJbnRlcmZhY2VQcm94eSBjbGFzcyB0byBhdm9pZCBidWlsZGluZyBwcm94aWVzIGZvciBldmVyeQorCW9iamVjdC4KKworCSogZGJ1cy1tZXNzYWdlLmg6CisJKiBkYnVzLW1lc3NhZ2UuYyAoZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzX3ZhbGlzdCkKKwkoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X29iamVjdF9wYXRoKQorCShkYnVzX21lc3NhZ2VfaXRlcl9nZXRfb2JqZWN0X3BhdGhfYXJyYXkpCisJKGRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9vYmplY3RfcGF0aCkKKwkoZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX29iamVjdF9wYXRoX2FycmF5KToKKwlBZGRlZCBvYmplY3RfcGF0aCBpdGVyIGZ1bmN0aW9ucyB0byBoYW5kbGUgT0JKRUNUX1BBVEggYXJndW1lbnRzCisJCisyMDA0LTAzLTIzICBPd2VuIEZyYXNlci1HcmVlbiAgPG93ZW5AZGlzY29iYWJlLm5ldD4KKworCUZpcnN0IGNoZWNraW4gb2YgbW9ubyBiaW5kaW5ncy4KKwkqIGNvbmZpZ3VyZS5pbjoKKwkqIE1ha2VmaWxlLmFtOgorCUJ1aWxkIHN0dWZmIGZvciB0aGUgYmluZGluZ3MKKwkqIGRidXMtc2hhcnAucGMuaW46IEFkZGVkIGZvciBwa2djb25maWcKKwkKKzIwMDQtMDMtMjEgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiB0ZXN0L3Rlc3Qtc2VydmljZS5jIChtYWluKTogcmVtb3ZlIGRlYnVnIHNwZXcKKworMjAwNC0wMy0yMSAgT2xpdmllciBBbmRyaWV1ICA8b2xpdl9fYUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLmMgKF9kYnVzX21hcnNoYWxfdmFsaWRhdGVfYXJnKTogYWNjZXB0IGVtcHR5CisJYXJyYXlzCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmgsIGJ1cy9kYnVzLW1lc3NhZ2UuYyAoZGJ1c19tZXNzYWdlX2l0ZXJfaW5pdCkKKwkoZGJ1c19tZXNzYWdlX2l0ZXJfaW5pdF9hcnJheV9pdGVyYXRvcikKKwkoZGJ1c19tZXNzYWdlX2l0ZXJfaW5pdF9kaWN0X2l0ZXJhdG9yKTogcmV0dXJuIGEgZGJ1c19ib29sX3QgdG8KKwlpbmRpY2F0ZSB3aGV0aGVyIHRoZSBpdGVyYXRvciBpcyBlbXB0eQorCisJKiBkYnVzL2RidXMtcGVuZGluZy1jYWxsLmMsIGRidXMvZGJ1cy1zZXJ2ZXIuYzogc2lsZW5jZSBjb21waWxlcgorCXdhcm5pbmdzCisKKzIwMDQtMDMtMTkgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBORVdTOiAwLjIxIHVwZGF0ZXMKKworCSogY29uZmlndXJlLmluOiAwLjIxCisKKwkqIGRvYy9NYWtlZmlsZS5hbTogYWRkIGFsbCBYTUxUTyB1c2FnZSB0byBEQlVTX1hNTF9ET0NTX0VOQUJMRUQKKwkKKwkqIHB5dGhvbi9NYWtlZmlsZS5hbTogY2hhbmdlIHRvIGF2b2lkIGRpc3Qgb2YgZGJ1c19iaW5kaW5ncy5jIHNvCisJeW91IGRvbid0IG5lZWQgcHlyZXggdG8gbWFrZSBkaXN0CisKKwkqIHF0L01ha2VmaWxlLmFtIChsaWJkYnVzX3F0XzFfbGFfU09VUkNFUyk6IGFkZCBpbnRlZ3JhdG9yLmggdG8KKwlzb3VyY2VzOyBydW4gbW9jCisJCisyMDA0LTAzLTE4ICBSaWNoYXJkIEh1bHQgIDxyaWNoYXJkQGltZW5kaW8uY29tPgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChkYnVzX21lc3NhZ2VfZ2V0X2F1dG9fYWN0aXZhdGlvbikgCisJKGRidXNfbWVzc2FnZV9zZXRfYXV0b19hY3RpdmF0aW9uKTogQWRkIGRveHlnZW4gZG9jcy4KKworMjAwNC0wMy0xNiAgUmljaGFyZCBIdWx0ICA8cmljaGFyZEBpbWVuZGlvLmNvbT4KKworCSogYnVzL2FjdGl2YXRpb24uYzogKGJ1c19hY3RpdmF0aW9uX3NlcnZpY2VfY3JlYXRlZCksCisJKGJ1c19hY3RpdmF0aW9uX3NlbmRfcGVuZGluZ19hdXRvX2FjdGl2YXRpb25fbWVzc2FnZXMpLAorCShidXNfYWN0aXZhdGlvbl9hY3RpdmF0ZV9zZXJ2aWNlKToKKwkqIGJ1cy9hY3RpdmF0aW9uLmg6CisJKiBidXMvZGlzcGF0Y2guYzogKGJ1c19kaXNwYXRjaCksCisJKGNoZWNrX25vbmV4aXN0ZW50X3NlcnZpY2VfYXV0b19hY3RpdmF0aW9uKSwKKwkoY2hlY2tfc2VydmljZV9hdXRvX2FjdGl2YXRlZCksCisJKGNoZWNrX3NlZ2ZhdWx0X3NlcnZpY2VfYXV0b19hY3RpdmF0aW9uKSwKKwkoY2hlY2tfZXhpc3RlbnRfc2VydmljZV9hdXRvX2FjdGl2YXRpb24pLCAoYnVzX2Rpc3BhdGNoX3Rlc3QpOgorCSogYnVzL2RyaXZlci5jOiAoYnVzX2RyaXZlcl9oYW5kbGVfYWN0aXZhdGVfc2VydmljZSk6CisJKiBidXMvc2VydmljZXMuYzogKGJ1c19yZWdpc3RyeV9hY3F1aXJlX3NlcnZpY2UpOgorCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYzogKGRidXNfbWVzc2FnZV9zZXRfYXV0b19hY3RpdmF0aW9uKSwKKwkoZGJ1c19tZXNzYWdlX2dldF9hdXRvX2FjdGl2YXRpb24pOgorCSogZGJ1cy9kYnVzLW1lc3NhZ2UuaDoKKwkqIGRidXMvZGJ1cy1wcm90b2NvbC5oOiBJbXBsZW1lbnQgYXV0by1hY3RpdmF0aW9uLgorCQorCSogZG9jL2RidXMtc3BlY2lmaWNhdGlvbi54bWw6IEFkZCBhdXRvLWFjdGl2YXRpb24gdG8gdGhlIHNwZWMuCisKKzIwMDQtMDMtMTIgIE9saXZpZXIgQW5kcmlldSAgPG9saXZfX2FAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBkYnVzL2RidXMtbWFyc2hhbC5jIChfZGJ1c19tYXJzaGFsX2dldF9hcmdfZW5kX3Bvcyk6CisJZml4IGEgYnVnIHdpdGggQ1VTVE9NIHR5cGVzLgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChtZXNzYWdlX2l0ZXJfdGVzdCwgX2RidXNfbWVzc2FnZV90ZXN0KTogYWRkCisJYSB1bml0IHRlc3QgZm9yIHRoaXMgYnVnICh1c2VkIHRvIGZhaWwpLgorCisyMDA0LTAzLTEyICBNaWthZWwgSGFsbGVuZGFsICA8bWlja2VAaW1lbmRpby5jb20+CisKKwkqIGJ1cy9hY3RpdmF0aW9uLmM6CisJKGJhYnlzaXR0ZXJfd2F0Y2hfY2FsbGJhY2spOiBub3RpZnkgYWxsIHBlbmRpbmcgYWN0aXZhdGlvbnMgd2FpdGluZyBmb3IKKwkgIHRoZSBzYW1lIGV4ZWMgdGhhdCB0aGUgYWN0aXZhdGlvbiBmYWlsZWQuCisJKGJ1c19hY3RpdmF0aW9uX2FjdGl2YXRlX3NlcnZpY2UpOiBzaG9ydGN1dCB0aGUgYWN0aXZhdGlvbiBpZiB3ZSAKKwkgIGFscmVhZHkgd2FpdGluZyBmb3IgdGhlIHNhbWUgZXhlY3V0YWJsZSB0byBzdGFydCB1cC4KKworMjAwNC0wMy0xMiAgTWlrYWVsIEhhbGxlbmRhbCAgPG1pY2tlQGltZW5kaW8uY29tPgorCisJKiBidXMvYWN0aXZhdGlvbi5jOiAKKwktIEFkZGVkIHNlcnZpY2UgZmlsZSByZWxvYWRpbmcuIAorCSAgRWFjaCBzZXJ2aWNlIGZpbGVzIGRpcmVjdG9yeSBpcyBrZXB0IGluIGFuIGhhc2ggdGFibGUgaW4gCisJICBCdXNBY3RpdmF0aW9uIGFuZCBlYWNoIEJ1c0FjdGl2YXRpb25FbnRyeSBrbm93cyB3aGF0IC5zZXJ2aWNlLWZpbGUgaXQKKwkgIHdhcyByZWFkIGZyb20uIFNvIHdoZW4geW91IHRyeSB0byBhY3RpdmF0ZSBhIHNlcnZpY2UgdGhlIGJ1cyB3aWxsIAorCSAgY2hlY2sgaWYgaXQncyBiZWVuIHVwZGF0ZWQsIHJlbW92ZWQgb3IgaWYgbmV3IC5zZXJ2aWNlLWZpbGVzIGhhcyAKKwkgIGJlZW4gaW5zdGFsbGVkLgorCS0gVGVzdCBjb2RlIGF0IHRoZSBib3R0b20gZm9yIHRoZSBzZXJ2aWNlIGZpbGUgcmVsb2FkaW5nLgorCSogYnVzL3Rlc3QtbWFpbi5jOiAobWFpbik6CisJKiBidXMvdGVzdC5oOgorCS0gYWRkZWQgc2VydmljZSByZWxvYWRpbmcgdGVzdC4KKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmM6IAorCSogZGJ1cy9kYnVzLXN5c2RlcHMuaDogKF9kYnVzX2RlbGV0ZV9kaXJlY3RvcnkpOiBBZGRlZC4KKworMjAwNC0wMy0wOCAgTWljaGFlbCBNZWVrcyAgPG1pY2hhZWxAeGltaWFuLmNvbT4KKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYyAoX2RidXNfY29ubmVjdGlvbl9ibG9ja19mb3JfcmVwbHkpOiAKKwliYWlsIGltbWVkaWF0ZWx5IGlmIGRpc2Nvbm5lY3RlZCwgdG8gYXZvaWQgYnVzeSBsb29wLgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJnc192YWxpc3QpOgorCWNsZWFudXAgY3V0L3Bhc3RlL2luZWZmaWNpZW5jeS4KKworMjAwNC0wMy0wMSAgRGF2aWQgWmV1dGhlbiAgPGRhdmlkQGZ1YmFyLmRrPgorCisJKiBkYnVzL2RidXMtc3RyaW5nLmMgKF9kYnVzX3N0cmluZ19hcHBlbmRfcHJpbnRmX3ZhbGlzdCk6IEZpeCBhCisJYnVnIHdoZXJlIGFyZ3Mgd2VyZSB1c2VkIHR3aWNlLiBUaGlzIGJ1ZyByZXN1bHRlZCBpbiBhIHNlZ2ZhdWx0CisJb24gYSBEZWJpYW4vUFBDIHN5c3RlbSB3aGVuIHN0YXJ0aW5nIHRoZSBtZXNzYWdlYnVzIGRhZW1vbi4gSW5jbHVkZQorCWRidXMtc3lzZGVwcy5oIGZvciBEQlVTX1ZBX0NPUFkKKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuaDogRGVmaW5lIERCVVNfVkFfQ09QWSBpZiBuZWNjZXNzYXJ5LiBGcm9tIEdMaWIKKworCSogY29uZmlndXJlLmluOiBDaGVjayBmb3IgdmFfY29weTsgZGVmaW5lIERCVVNfVkFfQ09QWSB0byB0aGUKKwlhcHByb3ByaWF0ZSB2YV9jb3B5IGltcGxlbWVudGF0aW9uLiBGcm9tIEdMaWIKKyAJCisyMDA0LTAyLTI0ICBKb2UgU2hhdyAgPGpvZUB4aW1pYW4uY29tPgorCisJKiBidXMvc2VydmljZXMuYyAoYnVzX3JlZ2lzdHJ5X2FjcXVpcmVfc2VydmljZSk6IFdlIG5lZWQgdG8gcGFzcworCWluIHRoZSBzZXJ2aWNlIG5hbWUgdG8gZGJ1c19zZXRfZXJyb3IoKSB0byBwcmV2ZW50IGEgY3Jhc2guCisKKzIwMDMtMTItMjYgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGdub21lLm9yZz4KKworCSogQVVUSE9SUzogUmV2ZWFsIG15IFRydWUgaWRlbnRpdHkuCisKKzIwMDMtMTItMTcgIE1pa2FlbCBIYWxsZW5kYWwgIDxtaWNrZUBpbWVuZGlvLmNvbT4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYzogKGRidXNfbWVzc2FnZV9hcHBlbmRfYXJnc192YWxpc3QpOiAKKwktIEFkZGVkIGNhc2UgZm9yIERCVVNfVFlQRV9CWVRFLCBwYXRjaCBmcm9tIEpvaGFuIEhlZGJlcmcuCisKKzIwMDMtMTItMTMgIE1pa2FlbCBIYWxsZW5kYWwgIDxtaWNrZUBpbWVuZGlvLmNvbT4KKworCSogZG9jL1RPRE86IEFkZGVkIG5vdCBhYm91dCBiZXR0ZXIgZXJyb3IgY2hlY2sgb2YgY29uZmlndXJhdGlvbiBmaWxlcy4KKworMjAwMy0xMi0wMiAgUmljaGFyZCBIdWx0ICA8cmljaGFyZEBpbWVuZGlvLmNvbT4KKworCSogVXBkYXRlIEFGTCB2ZXJzaW9uIHRvIDIuMCB0aHJvdWdob3V0IHRoZSBzb3VyY2UgZmlsZXMgdG8gcmVmbGVjdAorCXRoZSB1cGRhdGUgdGhhdCB3YXMgZG9uZSBhIHdoaWxlIGFnby4KKworMjAwMy0xMi0wMiAgUmljaGFyZCBIdWx0ICA8cmljaGFyZEBpbWVuZGlvLmNvbT4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAoZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2RpY3QpOiBTZXQKKwl3cm90ZV9kaWN0X2tleSB0byBGQUxTRSBvbiB0aGUgaXRlciB0aGF0IHRoZSBkaWN0IGlzIGFwcGVuZGVkIHRvLAorCWp1c3QgbGlrZSB3aGVuIGFwcGVuZGluZyBvdGhlciB0eXBlcy4gRml4ZXMgYSBidWcgd2hlcmUgYSBkaWN0CisJY291bGRuJ3QgYmUgcHV0IGluc2lkZSBhIGRpY3QuCisJKGRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9kaWN0X2tleSk6IEZpeCB0eXBvIGluIHdhcm5pbmcgbWVzc2FnZS4KKwkobWVzc2FnZV9pdGVyX3Rlc3QsIF9kYnVzX21lc3NhZ2VfdGVzdCk6IEFkZCB0ZXN0IGNhc2UgZm9yIGRpY3QKKwlpbnNpZGUgZGljdC4KKworMjAwMy0xMi0wMSAgRGF2aWQgWmV1dGhlbiAgPGRhdmlkQGZ1YmFyLmRrPgorCisJKiBweXRob24vZGJ1cy5weTogQWRkIHRoZSBhY3R1YWwgbWVzc2FnZSB3aGVuIGNhbGxpbmcgdGhlIHJlY2lldmVyCisJb2YgYSBzaWduYWwgc3VjaCB0aGF0IHBhcmFtZXRlcnMgY2FuIGJlIGluc3BlY3RlZC4gQWRkIHRoZSBtZXRob2QKKwlyZW1vdmVfc2lnbmFsX3JlY2VpdmVyCisJCisyMDAzLTExLTI2ICBNaWthZWwgSGFsbGVuZGFsICA8bWlja2VAaW1lbmRpby5jb20+CisKKwkqIGJ1cy8qLltjaF06CisJKiBkYnVzLyouW2NoXToKKwkqIGdsaWIvKi5bY2hdOiBNYWRlIHJlZiBmdW5jdGlvbnMgcmV0dXJuIHRoZSBwb2ludGVyCisKKzIwMDMtMTEtMjUgIFphY2sgUnVzaW4gIDx6YWNrQGtkZS5vcmc+CisKKwkqIHF0L2ludGVncmF0b3IuaCwgcXQvaW50ZWdyYXRvci5jcHA6IEFkZGluZyBoYW5kbGluZyBvZiBEQnVzU2VydmVyLAorCisJKiBxdC9zZXJ2ZXIuaCwgcXQvc2VydmVyLmNwcCwgcXQvTWFrZWZpbGUuYW06IEFkZGluZyBEQnVzU2VydmVyIAorCXdyYXBwZXJzLAorCisJKiBxdC9jb25uZWN0aW9uLmgsIHF0L2Nvbm5lY3Rpb24uY3BwOiBBZGp1c3RpbmcgdG8gY2hhbmdlcyBpbiAKKwl0aGUgSW50ZWdyYXRvciBhbmQgdG8gYmV0dGVyIGZpdCB3aXRoIHRoZSBzZXJ2ZXIsCisKKzIwMDMtMTEtMjQgIFphY2sgUnVzaW4gIDx6YWNrQGtkZS5vcmc+CisKKwkqIHF0L2Nvbm5lY3Rpb24uaCwgcXQvY29ubmVjdGlvbi5jcHA6IHJlbW92aW5nIGluaXREYnVzIG1ldGhvZCBzaW5jZQorCXRoZSBpbnRlZ3JhdG9yIGhhbmRsZXMgaXQgbm93CisKKwkqIHF0L2ludGVncmF0b3IuaCwgcXQvaW50ZWdyYXRvci5jcHA6IHJld29ya2luZyBoYW5kbGluZyBvZiB0aW1lb3V0cywKKwlzaW5jZSBRVGltZXIgd2Fzbid0IHJlYWxseSBtZWFudCB0byBiZSB1c2VkIHRoZSB3YXkgREJ1c1RpbWVvdXQgaXMKKworMjAwMy0xMS0yNCAgWmFjayBSdXNpbiAgPHphY2tAa2RlLm9yZz4KKworCSogcXQvaW50ZWdyYXRvci5oLCBxdC9pbnRlZ3JhdG9yLmNwcCwgTWFrZWZpbGUuYW06IEFkZGluZyAKKwlJbnRlZ3JhdG9yIGNsYXNzIHdoaWNoIGludGVncmF0ZXMgRC1CVVMgd2l0aCB0aGUgUXQgZXZlbnQgbG9vcCwKKworCSogcXQvY29ubmVjdGlvbi5oLCBxdC9jb25uZWN0aW9uLmNwcDogTW92ZSBhbGwgdGhlIGNvZGUgd2hpY2gKKwl3YXMgZGVhbGluZyB3aXRoIEQtQlVTIGludGVncmF0aW9uIHRvIHRoZSBJbnRlZ3JhdG9yIGNsYXNzLAorCWFuZCBzdGFydCB1c2luZyBJbnRlZ3JhdG9yLAorCisyMDAzLTExLTIzICBaYWNrIFJ1c2luICA8emFja0BrZGUub3JnPgorCisJKiBxdC9jb25uZWN0aW9uLmgsIHF0L2Nvbm5lY3Rpb24uY3BwOiBBZGRpbmcgdGhlIERCdXNDb25uZWN0aW9uIAorCXdyYXBwZXIKKworCSogcXQvbWVzc2FnZS5oLCBxdC9tZXNzYWdlLmNwcDogdXBkYXRpbmcgdG8gdGhlIGN1cnJlbnQgRC1CVVMgYXBpLAorCXN3aXRjaGluZyBuYW1lc3BhY2VzIHRvIERCdXNRdCwgcmV3b3JraW5nIHRoZSBjbGFzcywKKworCSogTWFrZWZpbGUuY3ZzOiBzd2l0Y2hpbmcgZGVwZW5kZW5jaWVzIHNvIHRoYXQgaXQgbWF0Y2hlcyBLREUgCisJc2NoZW1hdGljcywKKwkKKwkqIHF0L01ha2VmaWxlLmFtOiBhZGRpbmcgY29ubmVjdGlvbi57aCxjcHB9IGFuZCBtZXNzYWdlLntoLGNwcH0gdG8gCisJdGhlIGxpYnJhcnkKKworMjAwMy0xMS0xOSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIE5FV1M6IHVwZGF0ZQorCisgICAgICAgICogY29uZmlndXJlLmluOiBidW1wIHZlcnNpb24gdG8gMC4yMAorCisJKiBjb25maWd1cmUuaW4gKGhhdmVfcXQpOiBhZGQgeWV0IGFub3RoZXIgcGxhY2UgdG8gbG9vayBmb3IgcXQKKwkoc29tZW9uZSBoYW5kIHRyb2xsdGVjaCBhIC5wYyBmaWxlLi4uKQorCisyMDAzLTExLTAxICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZG9jL2RidXMtc3BlY2lmaWNhdGlvbi54bWw6IGFkZCBzdGF0ZSBtYWNoaW5lIGRvY3Mgb24gdGhlIGF1dGgKKwlwcm90b2NvbDsganVzdCBhIGZpcnN0IGRyYWZ0LCBJJ20gc3VyZSBpdCdzIHdyb25nLgkKKworMjAwMy0xMC0yOCAgRGF2aWQgWmV1dGhlbiAgPGRhdmlkQGZ1YmFyLmRrPgorCisJKiBweXRob24vZGJ1c19iaW5kaW5ncy5weXguaW46IGFkZCBnZXRfZGljdCB0byBoYW5kbGUgZGljdGlvbmFyaWVzCisJcmV0dXJuIHR5cGVzLiBGaXh1cCBUWVBFXyogdG8gcmVmbGVjdCBjaGFuZ2VzIGluIGRidXMvZGJ1cy1wcm90b2NvbC5oCisJCisyMDAzLTEwLTI4ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAoZ2V0X25leHRfZmllbGQpOiBkZWxldGUgdW51c2VkIGZ1bmN0aW9uCisKKzIwMDMtMTAtMjggIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBidXMvZXhwaXJlbGlzdC5jIChkb19leHBpcmF0aW9uX3dpdGhfY3VycmVudF90aW1lKTogZGV0ZWN0CisJZmFpbHVyZSBvZiB0aGUgZXhwaXJlX2Z1bmMgZHVlIHRvIE9PTQorCisJKiBidXMvY29ubmVjdGlvbi5jIChidXNfcGVuZGluZ19yZXBseV9leHBpcmVkKTogcmV0dXJuIEZBTFNFIG9uIE9PTQorCisJKiBidXMvZGlzcGF0Y2guYyAoY2hlY2tfc2VuZF9leGl0X3RvX3NlcnZpY2UpOiBmaXggdG8gaGFuZGxlIHRoZQorCU5vUmVwbHkgZXJyb3IgdGhhdCdzIG5vdyBjcmVhdGVkIGJ5IHRoZSBidXMgd2hlbiB0aGUgc2VydmljZSBleGl0cworCisyMDAzLTEwLTI4ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAoX2RidXNfbWVzc2FnZV90ZXN0KTogZW5hYmxlIGFuZCBmaXggdGhlCisJdGVzdHMgZm9yIHNldF9wYXRoLCBzZXRfaW50ZXJmYWNlLCBzZXRfbWVtYmVyLCBldGMuCisKKwkqIGRidXMvZGJ1cy1zdHJpbmcuYyAoX2RidXNfc3RyaW5nX2luc2VydF9ieXRlcyk6IGFsbG93IDAgYnl0ZXMKKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAoc2V0X3N0cmluZ19maWVsZCk6IGFsd2F5cyBqdXN0IGRlbGV0ZSBhbmQKKwlyZS1hcHBlbmQgdGhlIGZpZWxkOyBhY2NlcHQgTlVMTCBmb3IgZGVsZXRpb24KKwkocmVfYWxpZ25fZmllbGRzX3JlY3Vyc2UpOiByZWltcGxlbWVudAorCQorMjAwMy0xMC0yNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmM6IGZpeCBkb2NzIHRvIHByb3Blcmx5IGRlc2NyaWJlIHRoZQorCWRpc2Nvbm5lY3RlZCBtZXNzYWdlCisJKF9kYnVzX2Nvbm5lY3Rpb25fbm90aWZ5X2Rpc2Nvbm5lY3RlZCk6IHJlbW92ZSB0aGlzIGZ1bmN0aW9uOyAKKwl3ZSBjYW4ndCBzeW5jaHJvbm91c2x5IGFkZCB0aGUgZGlzY29ubmVjdGVkIG1lc3NhZ2UsIHdlIGhhdmUgdG8gCisJZG8gaXQgYWZ0ZXIgd2UndmUgcXVldWVkIGFueSByZW1haW5pbmcgcmVhbCBtZXNzYWdlcworCShfZGJ1c19jb25uZWN0aW9uX2dldF9kaXNwYXRjaF9zdGF0dXNfdW5sb2NrZWQpOiBxdWV1ZSB0aGUKKwlkaXNjb25uZWN0IG1lc3NhZ2Ugb25seSBpZiB0aGUgdHJhbnNwb3J0IGhhcyBmaW5pc2hlZCBxdWV1ZWluZyBhbGwKKwlpdHMgcmVhbCBtZXNzYWdlcyBhbmQgaXMgZGlzY29ubmVjdGVkLgorCShkYnVzX2Nvbm5lY3Rpb25fZGlzY29ubmVjdCk6IHVwZGF0ZSB0aGUgZGlzcGF0Y2ggc3RhdHVzIGhlcmUKKworMjAwMy0xMC0yMiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGJ1cy9idXMuYyAoYnVzX2NvbnRleHRfY2hlY2tfc2VjdXJpdHlfcG9saWN5KTogZml4IHVwIGFzc2VydGlvbgorCisJKiBidXMvY29ubmVjdGlvbi5jIChidXNfdHJhbnNhY3Rpb25fc2VuZF9mcm9tX2RyaXZlcik6IHNldCB0aGUKKwlkZXN0aW5hdGlvbiB0byB0aGUgY29ubmVjdGlvbidzIGJhc2Ugc2VydmljZQorCisyMDAzLTEwLTIwICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworICAgICAgICBobW0sIG1ha2UgY2hlY2sgaXMgY3VycmVudGx5IG5vdCBwYXNzaW5nLgorCQorCSogZG9jL2RidXMtc3BlY2lmaWNhdGlvbi54bWw6IGFkZCByZXF1aXJlbWVudCB0aGF0IGN1c3RvbSB0eXBlCisJbmFtZXMgZm9sbG93IHRoZSBzYW1lIHJ1bGVzIGFzIGludGVyZmFjZSBuYW1lcy4KKworCSogZGJ1cy9kYnVzLXByb3RvY29sLmg6IGNoYW5nZSBzb21lIG9mIHRoZSBieXRlIGNvZGVzLCB0byBhdm9pZAorCWR1cGxpY2F0aW9uIGFuZCBhbGxvdyAnYycgdG8gYmUgJ2N1c3RvbSc7IGRpY3QgaXMgbm93ICdtJyBmb3IKKwknbWFwJworCisJKiBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnhtbDogdXBkYXRlIHR5cGUgY29kZXMgdG8gbWF0Y2gKKwlkYnVzLXByb3RvY29sLmgsIHVzaW5nIHRoZSBBU0NJSSBieXRlIHZhbHVlcy4gUmVuYW1lIHR5cGUgTkFNRUQgdG8KKwlDVVNUT00uIEFkZCB0eXBlIE9CSkVDVF9QQVRIIHRvIHRoZSBzcGVjLgorCisyMDAzLTEwLTE3ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogYnVzL2RyaXZlci5jIChjcmVhdGVfdW5pcXVlX2NsaWVudF9uYW1lKTogdXNlICIuIiBhcyBzZXBhcmF0b3IKKwlpbiBiYXNlIHNlcnZpY2UgbmFtZXMgaW5zdGVhZCBvZiAnLScKKworCSogZGJ1cy9kYnVzLXN0cmluZy5jIChfZGJ1c19zdHJpbmdfZ2V0X2J5dGUpOiBhbGxvdyBnZXR0aW5nIG51bAorCWJ5dGUgYXQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nCisKKwkqIGRidXMvZGJ1cy1pbnRlcm5hbHMuaCAoX0RCVVNfTElLRUxZLCBfREJVU19VTkxJS0VMWSk6IGFkZAorCW9wdGltaXphdGlvbiBtYWNyb3Mgc2luY2Ugc3RyaW5nIHZhbGlkYXRpb24gc2VlbXMgdG8gYmUgYSBzbG93CisJcG9pbnQuCisJCisJKiBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnhtbDogcmVzdHJpY3QgdmFsaWQKKwlzZXJ2aWNlL2ludGVyZmFjZS9tZW1iZXIvZXJyb3IgbmFtZXMuIEFkZCB0ZXN0IHN1aXRlIGNvZGUgZm9yIHRoZQorCW5hbWUgdmFsaWRhdGlvbi4KKworCSogZGJ1cy9kYnVzLXN0cmluZy5jOiBsaW1pdCBzZXJ2aWNlL2ludGVyZmFjZS9tZW1iZXIvZXJyb3IgbmFtZXMgCisJdG8gWzAtOV1bQS1aXVthLXpdXworCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jIChkYnVzX2Nvbm5lY3Rpb25fZGlzcGF0Y2gpOiBhZGQgbWlzc2luZworCWZvcm1hdCBhcmcgdG8gdmVyYm9zZSBzcGV3CisKKwkqIGdsaWIvZGJ1cy1ncHJveHkuYyAoZGJ1c19ncHJveHlfY2FsbF9ub19yZXBseSk6IGlmIG5vdCBvdXQgb2YKKwltZW1vcnksIHJldHVybiBpbnN0ZWFkIG9mIGdfZXJyb3IKKworCSogdGVzdC90ZXN0LXNlcnZpY2UuYyAocGF0aF9tZXNzYWdlX2Z1bmMpOiBzdXBwb3J0IGVtaXR0aW5nIGEKKwlzaWduYWwgb24gcmVxdWVzdAorCisJKiBkYnVzL2RidXMtYnVzLmMgKGluaXRfY29ubmVjdGlvbnNfdW5sb2NrZWQpOiBvbmx5IGZpbGwgaW4KKwlhY3RpdmF0aW9uIGJ1cyB0eXBlIGlmIERCVVNfQlVTX0FDVElWQVRJT04gd2FzIHNldDsgZGVmYXVsdCB0bworCWFzc3VtaW5nIHRoZSBhY3RpdmF0aW9uIGJ1cyB3YXMgdGhlIHNlc3Npb24gYnVzIHNvIHRoYXQgc2VydmljZXMKKwlzdGFydGVkIG1hbnVhbGx5IHdpbGwgc3RpbGwgcmVnaXN0ZXIuCisJKGluaXRfY29ubmVjdGlvbnNfdW5sb2NrZWQpOiBmaXggc28gdGhhdCBpbiBPT00gc2l0dWF0aW9uIHdlIGdldAorCXRoZSBzYW1lIHNlbWFudGljcyB3aGVuIHJldHJ5aW5nIHRoZSBmdW5jdGlvbgorCQorCSogdGVzdC90ZXN0LXNlcnZpY2UuYyAobWFpbik6IGNoYW5nZSB0byB1c2UgcGF0aCByZWdpc3RyYXRpb24sIHRvCisJdGVzdCB0aG9zZSBjb2RlcGF0aHM7IHJlZ2lzdGVyIHdpdGggREJVU19CVVNfQUNUSVZBVElPTiByYXRoZXIKKwl0aGFuIERCVVNfQlVTX1NFU1NJT04KKworMjAwMy0xMC0xNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGdsaWIvZGJ1cy1ndGVzdC1tYWluLmM6IGJyYWNrZXQgd2l0aCAjaWZkZWYgREJVU19CVUlMRF9URVNUUworCisJKiBNYWtlZmlsZS5hbSAoR0NPVl9ESVJTKTogcmVtb3ZlICJ0ZXN0Iiwgd2UgZG9uJ3QgY2FyZSBhYm91dCB0ZXN0CisJY292ZXJhZ2Ugb2YgdGhlIHRlc3RzCisJKGNvdmVyYWdlLXJlcG9ydC50eHQpOiBkb24ndCBtb3ZlIHRoZSAuZGEgYW5kIC5iYmcgZmlsZXMgYXJvdW5kCisKKzIwMDMtMTAtMTYgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBidXMvYnVzLmMgKHN0cnVjdCBCdXNDb250ZXh0KTogcmVtb3ZlIHN0cnVjdCBmaWVsZCBJIGRpZG4ndCBtZWFuCisJdG8gcHV0IHRoZXJlCisKKzIwMDMtMTAtMTYgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBidXMvY29ubmVjdGlvbi5jIChidXNfcGVuZGluZ19yZXBseV9leHBpcmVkKTogZWl0aGVyIGNhbmNlbCBvcgorCWV4ZWN1dGUsIG5vdCBib3RoCisJKGJ1c19jb25uZWN0aW9uc19jaGVja19yZXBseSk6IHVzZSB1bmxpbmssIG5vdCByZW1vdmVfbGluaywgYXMgd2UKKwlkb24ndCB3YW50IHRvIGZyZWUgdGhlIGxpbms7IGZpeGVzIGRvdWJsZSBmcmVlIG1lc3MKKworCSogZGJ1cy9kYnVzLXBlbmRpbmctY2FsbC5jIChkYnVzX3BlbmRpbmdfY2FsbF9ibG9jayk6IGZpeCBpbiBjYXNlCisJd2hlcmUgbm8gcmVwbHkgd2FzIHJlY2VpdmVkCisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMgKF9kYnVzX3BlbmRpbmdfY2FsbF9jb21wbGV0ZV9hbmRfdW5sb2NrKToKKwlmaXggYSByZWZjb3VudCBsZWFrCisKKwkqIGJ1cy9zaWduYWxzLmMgKG1hdGNoX3J1bGVfbWF0Y2hlcyk6IGFkZCBzcGVjaWFsIGNhc2VzIGZvciB0aGUKKwlidXMgZHJpdmVyLCBzbyB5b3UgY2FuIG1hdGNoIG9uIHNlbmRlci9kZXN0aW5hdGlvbiBmb3IgaXQuCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMgKF9kYnVzX2Fib3J0KTogcHJpbnQgYmFja3RyYWNlIGlmCisJREJVU19QUklOVF9CQUNLVFJBQ0UgaXMgc2V0CisKKwkqIGRidXMvZGJ1cy1pbnRlcm5hbHMuYzogYWRkIHBpZCB0byBhc3NlcnRpb24gZmFpbHVyZSBtZXNzYWdlcworCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jOiBhZGQgbWVzc2FnZSB0eXBlIGNvZGUgdG8gdGhlIGRlYnVnIHNwZXcKKworCSogZ2xpYi9kYnVzLWdwcm94eS5jIChncHJveHlfZ2V0X21hdGNoX3J1bGUpOiBtYXRjaCBydWxlcyB3YW50CisJc2VuZGVyPWZvbyBub3Qgc2VydmljZT1mb28KKworCSogZGJ1cy9kYnVzLWJ1cy5jIChkYnVzX2J1c19nZXQpOiBpZiB0aGUgYWN0aXZhdGlvbiBidXMgaXMgdGhlCisJc2Vzc2lvbiBidXMgYnV0IERCVVNfU0VTU0lPTl9CVVNfQUREUkVTUyBpc24ndCBzZXQsIHVzZSAKKwlEQlVTX0FDVElWQVRJT05fQUREUkVTUyBpbnN0ZWFkCisKKwkqIGJ1cy9hY3RpdmF0aW9uLmM6IHNldCBEQlVTX1NFU1NJT05fQlVTX0FERFJFU1MsCisJREJVU19TWVNURU1fQlVTX0FERFJFU1MgaWYgYXBwcm9wcmlhdGUKKworCSogYnVzL2J1cy5jIChidXNfY29udGV4dF9uZXcpOiBoYW5kbGUgT09NIGNvcHlpbmcgYnVzIHR5cGUgaW50bworCWNvbnRleHQgc3RydWN0CisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKGRidXNfbWVzc2FnZV9pdGVyX2dldF9vYmplY3RfcGF0aCk6IG5ldyBmdW5jdGlvbgorCShkYnVzX21lc3NhZ2VfaXRlcl9nZXRfb2JqZWN0X3BhdGhfYXJyYXkpOiBuZXcgZnVuY3Rpb24gKGhhbGYKKwlmaW5pc2hlZCwgZGlzYWJsZWQgZm9yIHRoZSBtb21lbnQpCisJCisJKiBnbGliL2RidXMtZ3Byb3h5LmMgKGRidXNfZ3Byb3h5X2VuZF9jYWxsKTogcHJvcGVybHkgaGFuZGxlCisJREJVU19NRVNTQUdFX1RZUEVfRVJST1IKKworCSogdG9vbHMvZGJ1cy1sYXVuY2guYyAoYmFieXNpdCk6IHN1cHBvcnQgREJVU19ERUJVR19PVVRQVVQgdG8KKwlhdm9pZCByZWRpcmVjdGluZyBzdGRlcnIgdG8gL2Rldi9udWxsCisJKGJhYnlzaXQpOiBjbG9zZSBzdGRpbiBpZiBub3QgZG9pbmcgdGhlICJleGl0X3dpdGhfc2Vzc2lvbiIgdGhpbmcKKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYyAoX2RidXNfYmVjb21lX2RhZW1vbik6IGRlbGV0ZSBzb21lIGxlZnRvdmVyCisJZGVidWcgY29kZTsgY2hhbmdlIERCVVNfREVCVUdfT1VUUFVUIHRvIG9ubHkgZW5hYmxlIHN0ZGVyciwgbm90CisJc3Rkb3V0L3N0ZGluLCBzbyB0aGluZ3MgZG9uJ3QgZ2V0IGNvbmZ1c2VkCisJCisJKiBidXMvc3lzdGVtLmNvbmYuaW46IGZpeCB0byBhbGxvdyByZXBsaWVzLCBJIG1vZGlmaWVkIC5jb25mCisJaW5zdGVhZCBvZiAuY29uZi5pbiBhZ2Fpbi4KKworMjAwMy0xMC0xNCAgRGF2aWQgWmV1dGhlbiAgPGRhdmlkQGZ1YmFyLmRrPgorCisJKiBweXRob24vZGJ1c19iaW5kaW5ncy5weXguaW4gKE1lc3NhZ2VJdGVyLmdldCk6IGZpeGVkIHR5cG8gaW4KKwlhcmd0eXBlIHRvIGFyZ190eXBlIHdoZW4gcmFpc2luZyB1bmtub3duIGFyZyB0eXBlIGV4Y2VwdGlvbi4KKwlDaGFuZ2VkIHR5cGUgbGlzdCB0byByZWZsZWN0IHRoZSBjaGFuZ2VzIGluIGRidXMtcHJvdG9jb2wuaCBzbyAKKwl0aGUgYmluZGluZ3MgYWN0dWFsbHkgd29yay4KKworMjAwMy0xMC0xNCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIHRlc3QvZGVjb2RlLWdjb3YuYzogc3VwcG9ydCBnY2MgMy4zIGFsc28sIHRob3VnaCBnY2MgMy4zIHNlZW1zCisJdG8gaGF2ZSBhIGJ1ZyBrZWVwaW5nIGl0IGZyb20gb3V0cHV0dGluZyB0aGUgLmRhIGZpbGVzIHNvbWV0aW1lcworCShzdHJpbmdfZ2V0X3N0cmluZyk6IGRvbid0IGFwcGVuZCBnYXJiYWdlIG51bCBieXRlcyB0byB0aGUgc3RyaW5nLgorCisyMDAzLTEwLTE1ICBTZXRoIE5pY2tlbGwgIDxzZXRoQGdub21lLm9yZz4KKworCSogcHl0aG9uL01ha2VmaWxlLmFtOgorCisJSW5jbHVkZSBkYnVzX2hfd3JhcHBlci5oIGluIHRoZSBkaXN0IHRhcmJhbGwuCisKKzIwMDMtMTAtMTQgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBidXMvYnVzLmMgKGJ1c19jb250ZXh0X2NoZWNrX3NlY3VyaXR5X3BvbGljeSk6IHJldmFtcCB0aGlzIHRvCisJd29yayBtb3JlIHNhbmVseSB3aXRoIG5ldyBwb2xpY3ktYmFzZWQgcmVxdWVzdGVkIHJlcGx5IHNldHVwCisKKwkqIGJ1cy9jb25uZWN0aW9uLmMgKGJ1c190cmFuc2FjdGlvbl9zZW5kX2Zyb21fZHJpdmVyKTogc2V0IGJ1cworCWRyaXZlciBtZXNzYWdlcyBhcyBubyByZXBseQorCisJKiBidXMvcG9saWN5LmMgKGJ1c19jbGllbnRfcG9saWN5X2NoZWNrX2Nhbl9yZWNlaXZlKTogaGFuZGxlIGEKKwlyZXF1ZXN0ZWRfcmVwbHkgYXR0cmlidXRlIG9uIGFsbG93L2RlbnkgcnVsZXMKKworCSogYnVzL3N5c3RlbS5jb25mOiBhZGQgPGFsbG93IHJlcXVlc3RlZF9yZXBseT0idHJ1ZSIvPgorCisJKiBidXMvZHJpdmVyLmMgKGJ1c19kcml2ZXJfaGFuZGxlX21lc3NhZ2UpOiBmaXggY2hlY2sgZm9yIHJlcGxpZXMKKwlzZW50IHRvIHRoZSBidXMgZHJpdmVyLCB3aGljaCB3YXMgYmFja3dhcmQuIEhvdyBkaWQgdGhpcyBldmVyIHdvcmsKKwlhdCBhbGwgdGhvdWdoPyBJIHRoaW5rIEknbSBtaXNzaW5nIHNvbWV0aGluZy4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAoZGVjb2RlX2hlYWRlcl9kYXRhKTogcmVxdWlyZSBlcnJvciBhbmQKKwltZXRob2QgcmV0dXJuIG1lc3NhZ2VzIHRvIGhhdmUgYSByZXBseSBzZXJpYWwgZmllbGQgdG8gYmUgdmFsaWQKKwkoX2RidXNfbWVzc2FnZV9sb2FkZXJfcXVldWVfbWVzc2FnZXMpOiBicmVhayB1cCB0aGlzIGZ1bmN0aW9uOworCXZhbGlkYXRlIHRoYXQgcmVwbHkgc2VyaWFsIGFuZCBwbGFpbiBzZXJpYWwgYXJlIG5vbnplcm87IAorCWNsZWFuIHVwIHRoZSBPT00vZXJyb3IgaGFuZGxpbmcuCisJKGdldF91aW50X2ZpZWxkKTogZG9uJ3QgcmV0dXJuIC0xIGZyb20gdGhpcworCShkYnVzX21lc3NhZ2VfY3JlYXRlX2hlYWRlcik6IGZpeCBzaWduZWQvdW5zaWduZWQgYnVnCisKKwkqIGJ1cy9jb25uZWN0aW9uLmMgKGJ1c19jb25uZWN0aW9uc19leHBlY3RfcmVwbHkpOiBzYXZlIHNlcmlhbCBvZgorCXRoZSBpbmNvbWluZyBtZXNzYWdlLCBub3QgcmVwbHkgc2VyaWFsCisKKzIwMDMtMTAtMTQgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBidXMvY29ubmVjdGlvbi5jOiBpbXBsZW1lbnQgcGVuZGluZyByZXBseSB0cmFja2luZyB1c2luZworCUJ1c0V4cGlyZUxpc3QKKworCSogYnVzL2J1cy5jIChidXNfY29udGV4dF9jaGVja19zZWN1cml0eV9wb2xpY3kpOiB2ZXJpZnkgdGhhdCBhCisJcmVwbHkgaXMgcGVuZGluZyBpbiBvcmRlciB0byBhbGxvdyBhIHJlcGx5IHRvIGJlIHNlbnQuIERlbnkgCisJbWVzc2FnZXMgb2YgdW5rbm93biB0eXBlLgorCisJKiBidXMvZGJ1cy1kYWVtb24tMS4xLmluOiB1cGRhdGUgdG8gbWVudGlvbiBuZXcgcmVzb3VyY2UgbGltaXRzCisKKwkqIGJ1cy9idXMuYyAoYnVzX2NvbnRleHRfZ2V0X21heF9yZXBsaWVzX3Blcl9jb25uZWN0aW9uKTogbmV3CisJKGJ1c19jb250ZXh0X2dldF9yZXBseV90aW1lb3V0KTogbmV3CisKKzIwMDMtMTAtMTMgIFNldGggTmlja2VsbCAgPHNldGhAZ25vbWUub3JnPgorCisJKiBweXRob24vTWFrZWZpbGUuYW06CisKKwlQYXNzICJtYWtlIGRpc3RjaGVjayI6IHJlbW92ZSBhIGNvdXBsZSBmaWxlcyBmcm9tIERJU1RfRklMRVMKKwl0aGF0IHdlcmVuJ3QgaW5jbHVkZWQgaW4gdGhlIGZpbmFsIHZlcnNpb24uCisKKzIwMDMtMTAtMTIgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKyAgICAgICAgQWRkZWQgdGVzdCBjb2RlIHRoYXQgMSkgc3RhcnRzIGFuIGFjdHVhbCBidXMgZGFlbW9uIGFuZCAyKSB1c2VzCisJREJ1c0dQcm94eTsgZml4ZWQgYnVncyB0aGF0IHdlcmUgcmV2ZWFsZWQgYnkgdGhlIHRlc3QuIExvdHMgCisJbW9yZSB0ZXN0aW5nIHBvc3NpYmxlLCBidXQgdGhpcyBpcyB0aGUgYmFzaWMgZnJhbWV3b3JrLgorCQorCSogZ2xpYi9kYnVzLWdwcm94eS5jIChkYnVzX2dwcm94eV9tYW5hZ2VyX3VucmVnaXN0ZXIpOiByZW1vdmUKKwllbXB0eSBwcm94eSBsaXN0cyBmcm9tIHRoZSBwcm94eSBsaXN0IGhhc2gKKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2FyZ3NfdmFsaXN0KTogYWRkIGEKKwljb3VwbGUgb2YgcmV0dXJuX2lmX2ZhaWwgY2hlY2tzCisKKwkqIGRidXMvZGJ1cy1wZW5kaW5nLWNhbGwuYyAoX2RidXNfcGVuZGluZ19jYWxsX25ldyk6IHVzZSBkYnVzX25ldzAKKwl0byBhbGxvY2F0ZSwgc28gZXZlcnl0aGluZyBpcyBjbGVhcmVkIHRvIE5VTEwgYXMgaXQgc2hvdWxkIGJlLgorCisJKiBnbGliL2RidXMtZ21haW4uYyAoZGJ1c19jb25uZWN0aW9uX3NldHVwX3dpdGhfZ19tYWluKTogcGFzcworCXNvdXJjZSBhcyBkYXRhIHRvIGRidXNfY29ubmVjdGlvbl9zZXRfdGltZW91dF9mdW5jdGlvbnMoKSBhcyB0aGUgCisJdGltZW91dCBmdW5jdGlvbnMgZXhwZWN0ZWQKKworCSogdGVzdC9nbGliL3J1bi10ZXN0LnNoOiBhZGQgYSBsaXR0bGUgc2NyaXB0IHRvIHN0YXJ0IHVwIGEgbWVzc2FnZQorCWJ1cyBhbmQgcnVuIHRlc3RzIHVzaW5nIGl0CisKKwkqIHRvb2xzL2RidXMtbGF1bmNoLjE6IHVwZGF0ZXMKKworCSogdG9vbHMvZGJ1cy1sYXVuY2guYyAobWFpbik6IGFkZCAtLWNvbmZpZy1maWxlIG9wdGlvbgorCisJKiB0b29scy9kYnVzLWxhdW5jaC5jIChtYWluKTogcmVtb3ZlIGNvbmZ1c2luZyBlbHNlIGlmIChydW5wcm9nKQorCXRoYXQgY291bGQgbmV2ZXIgYmUgcmVhY2hlZC4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAoZGJ1c19tZXNzYWdlX25ld19tZXRob2RfcmV0dXJuKSAKKwkoZGJ1c19tZXNzYWdlX25ld19lcnJvciwgZGJ1c19tZXNzYWdlX25ld19zaWduYWwpOiBzZXQgdGhlCisJbm8tcmVwbHktZXhwZWN0ZWQgZmxhZyBvbiBhbGwgdGhlc2UuIFJlZHVuZGFudCwgYnV0IG1heQorCWFzIHdlbGwgYmUgY29uc2lzdGVudC4KKworMjAwMy0xMC0xMSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogdGVzdC9kZWNvZGUtZ2Nvdi5jIChmdW5jdGlvbl9zb2x2ZV9ncmFwaCk6IG1ha2UgYnJva2VuIGJsb2NrCisJZ3JhcGggYSBub25mYXRhbCBlcnJvciBzaW5jZSBpdCBzZWVtcyB0byBiZSBicm9rZW4uIE5lZWQgdG8gZGVidWcKKwl0aGlzLgorCisJKiBkYnVzL2RidXMtbWFyc2hhbC5jIChfZGJ1c190eXBlX2lzX3ZhbGlkKTogbmV3IGZ1bmN0aW9uIHNpbmNlIHdlCisJY2FuJ3QganVzdCBjaGVjayB0eXBlID4gSU5WQUxJRCA8IExBU1QgYW55bW9yZQorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChkYnVzX21lc3NhZ2VfZ2V0X3NpZ25hdHVyZSk6IG5ldyBmdW5jdGlvbgorCShkYnVzX21lc3NhZ2VfaGFzX3NpZ25hdHVyZSk6IG5ldyBmdW5jdGlvbgorCShzdHJ1Y3QgREJ1c01lc3NhZ2UpOiBhZGQgc2lnbmF0dXJlIGZpZWxkIChyaWdodCBub3cgaXQgaXNuJ3Qgc2VudAorCW92ZXIgdGhlIHdpcmUsIGp1c3QgZ2VuZXJhdGVkIG9uIHRoZSBmbHkpCisJKGRidXNfbWVzc2FnZV9jb3B5KTogY29weSB0aGUgc2lnbmF0dXJlLCBhbmQgaW5pdCBzdHJpbmdzIHRvCisJcHJvcGVyIGxlbmd0aCB0byBhdm9pZCBzb21lIHJlYWxsb2NzCisJKGRidXNfbWVzc2FnZV9pdGVyX2luaXRfYXJyYXlfaXRlcmF0b3IpOiByZXR1cm4gdm9pZCwgc2luY2UgaXQKKwljYW4ndCBmYWlsCisJKGRidXNfbWVzc2FnZV9pdGVyX2luaXRfZGljdF9pdGVyYXRvcik6IHJldHVybiB2b2lkIHNpbmNlIGl0IGNhbid0IGZhaWwKKwkoX2RidXNfbWVzc2FnZV9sb2FkZXJfcXVldWVfbWVzc2FnZXMpOiBhZGQgc2lsbHkgdGVtcG9yYXJ5IGhhY2sgdG8KKwlmaWxsIGluIG1lc3NhZ2UtPnNpZ25hdHVyZSBvbiBsb2FkCisKKwkqIGRidXMvZGJ1cy1wcm90b2NvbC5oOiBjaGFuZ2UgREJVU19UWVBFXyogdmFsdWVzIHRvIGJlIEFTQ0lJCisJY2hhcmFjdGVycywgc28gdGhleSBhcmUgcmVsYXRpdmVseSBodW1hbi1yZWFkYWJsZS4KKworMjAwMy0xMC0xMSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAoX2RidXNfbWVzc2FnZV90ZXN0KTogYWRkIG1vcmUgdGVzdAorCWNvdmVyYWdlLCBidXQgI2lmIDAgZm9yIG5vdyBzaW5jZSB0aGV5IHVuY292ZXIgYSBidWcgCisJbm90IGZpeGVkIHlldDsgSSB0aGluayBpbiByZV9hbGlnbl9maWVsZF9yZWN1cnNlKCkKKwkocmVfYWxpZ25fZmllbGRfcmVjdXJzZSk6IGFkZCBGSVhNRSBhYm91dCBicm9rZW4gYXNzZXJ0aW9uCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMgKF9kYnVzX3N5c2RlcHNfdGVzdCk6IGFkZCBtb3JlIHRlc3QgY292ZXJhZ2UKKworCSogYnVzL2Nvbm5lY3Rpb24uYzogc2hhcmUgYSBjb3VwbGUgY29kZSBiaXRzIHdpdGggZXhwaXJlbGlzdC5jCisKKwkqIGJ1cy9leHBpcmVsaXN0LmgsIGJ1cy9leHBpcmVsaXN0LmM6IGltcGxlbWVudCBhIGdlbmVyaWMKKwlleHBpcmUtaXRlbXMtYWZ0ZXItTi1zZWNvbmRzIGZhY2lsaXR5LCB3YXMgZ29pbmcgdG8gc2hhcmUgYmV0d2VlbgorCWV4cGlyaW5nIGNvbm5lY3Rpb25zIGFuZCByZXBsaWVzLCBkZWNpZGVkIG5vdCB0byB1c2UgZm9yIGV4cGlyaW5nCisJY29ubmVjdGlvbnMgZm9yIG5vdy4KKworCSogQ09QWUlORzogaW5jbHVkZSBBRkwgMi4wIChzdGlsbCBuZWVkIHRvIGNoYW5nZSBhbGwgdGhlIGZpbGUgaGVhZGVycykKKworMjAwMy0xMC0wOSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogZGVmaW5lIERCVVNfSEFWRV9HQ0MzM19HQ09WIGlmIHdlIGhhdmUKKwlnY2MgMy4zLiBOb3QgdGhhdCB3ZSBkbyBhbnl0aGluZyBhYm91dCBpdCB5ZXQuCisKKwkqIGJ1cy9zaWduYWxzLmMgKGJ1c19tYXRjaF9ydWxlX3BhcnNlKTogaW1wb3NlIG1heCBsZW5ndGggb24gdGhlCisJbWF0Y2ggcnVsZSB0ZXh0CisKKwkqIGRidXMvZGJ1cy1wcm90b2NvbC5oOiBhZGQgREJVU19NQVhJTVVNX01BVENIX1JVTEVfTEVOR1RICisKKzIwMDMtMTAtMDkgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisgICAgICAgIE1ha2UgbWF0Y2hpbmcgcnVsZXMgdGhlb3JldGljYWxseSB3b3JrIChhZGQgcGFyc2VyKS4KKwkKKwkqIGJ1cy9idXMuYyAoYnVzX2NvbnRleHRfY2hlY2tfc2VjdXJpdHlfcG9saWN5KTogZml4IHVwIHRvIGhhbmRsZQorCXRoZSBjYXNlIHdoZXJlIGRlc3RpbmF0aW9uIGlzIGV4cGxpY2l0bHkgc3BlY2lmaWVkIGFzIGJ1cyBkcml2ZXIKKwlhbmQgc29tZW9uZSBlbHNlIGlzIGVhdmVzZHJvcHBpbmcuCisJCisJKiBidXMvcG9saWN5LmMgKGJ1c19jbGllbnRfcG9saWN5X2NoZWNrX2Nhbl9yZWNlaXZlKTogZml4IHVwCisJZGVmaW5pdGlvbiBvZiBlYXZlc2Ryb3BwaW5nIGFuZCBhc3NlcnRpb24KKworCSogdG9vbHMvZGJ1cy1zZW5kLmMgKG1haW4pOiB1c2UgZGJ1c19tZXNzYWdlX3R5cGVfZnJvbV9zdHJpbmcKKworCSogYnVzL3NpZ25hbHMuYyAoYnVzX21hdGNoX3J1bGVfcGFyc2UpOiBpbXBsZW1lbnQKKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAoZGJ1c19tZXNzYWdlX3R5cGVfZnJvbV9zdHJpbmcpOiBuZXcKKworCSogZGJ1cy9kYnVzLWVycm9ycy5oIChEQlVTX0VSUk9SX01BVENIX1JVTEVfSU5WQUxJRCk6IGFkZAorCisyMDAzLTEwLTAyICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBnbGliL2RidXMtZ3Byb3h5LmMgKGRidXNfZ3Byb3h5X2NhbGxfbm9fcmVwbHkpOiByZW5hbWUgZnJvbQorCWRidXNfZ3Byb3h5X29uZXdheV9jYWxsCisKKwkqIGdsaWIvZGJ1cy1nbWFpbi5jIChkYnVzX2Nvbm5lY3Rpb25fc2V0dXBfd2l0aF9nX21haW4pIAorCShkYnVzX3NlcnZlcl9zZXR1cF93aXRoX2dfbWFpbik6IGZpeCB0byBhbGxvdyBjYWxsaW5nIHRoZW0gbW9yZQorCXRoYW4gb25jZSBvbiB0aGUgc2FtZSBhcmdzCisJKGRidXNfYnVzX2dldF93aXRoX2dfbWFpbik6IG5ldyBmdW5jdGlvbgorCisyMDAzLTEwLTAyICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZG9jL2RidXMtdHV0b3JpYWwueG1sOiB3cml0ZSBzb21lIHN0dWZmCisKKzIwMDMtMDktMjkgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogc3BsaXQgY2hlY2tzIGZvciBEb3h5Z2VuIGZyb20gWE1MIGRvY3MsIGNoZWNrIGZvcgorCXhtbHRvCisKKwkqIGRvYy9NYWtlZmlsZS5hbTogWE1MLWlmeSBhbGwgdGhlIGRvY3MsIGFuZCBhZGQgYSBibGFuaworCWRidXMtdHV0b3JpYWwueG1sCisKKzIwMDMtMDktMjkgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIE1lcmdlIGRidXMtb2JqZWN0LW5hbWVzIGJyYW5jaC4gVG8gc2VlIHRoZSBlbnRpcmUgcGF0Y2ggCisJZG8gY3ZzIGRpZmYgLXIgREJVU19PQkpFQ1RfTkFNRVNfQlJBTkNIUE9JTlQgLXIgZGJ1cy1vYmplY3QtbmFtZXMsCisJaXQncyBodXV1dWdlIHRob3VnaC4KKwlUbyByZXZlcnQsIEkgdGFnZ2VkIERCVVNfQkVGT1JFX09CSkVDVF9OQU1FU19NRVJHRS4KKwkKKzIwMDMtMDktMjggIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIEhBQ0tJTkc6IHVwZGF0ZSB0byByZWZsZWN0IG5ldyBzZXJ2ZXIKKworMjAwMy0wOS0yNiAgU2V0aCBOaWNrZWxsICA8c2V0aEBnbm9tZS5vcmc+CisKKwkqIHB5dGhvbi9kYnVzLnB5OgorCSogcHl0aG9uL2V4YW1wbGVzL2V4YW1wbGUtc2lnbmFscy5weToKKworCVN0YXJ0IGltcGxlbWVudGluZyBzb21lIG5vdGlvbnMgb2Ygc2lnbmFscy4gVGhlIEFQSQorCWlzIHJlYWxseSB0ZXJyaWJsZSwgYnV0IHRoZXkgc29ydCBvZiB3b3JrICh3aXRoIHRoZQorCWV4Y2VwdGlvbiBvZiBiZWluZyBhYmxlIHRvIGZpbHRlciBieSBzZXJ2aWNlLCBhbmQgdG8KKwl0cmFuc21pdCBzaWduYWxzICphcyogYSBwYXJ0aWN1bGFyIHNlcnZpY2UpLiBOZWVkIHRvCisJZmlndXJlIG91dCBob3cgdG8gbWFrZSBtZXNzYWdlcyBjb21lIGZyb20gdGhlIHNlcnZpY2UKKwl3ZSByZWdpc3RlcmVkIDotKAorCQorCSogcHl0aG9uL2RidXNfYmluZGluZ3MucHl4LmluOgorCisJUmVtb3ZlZCBkdXBsaWNhdGUgbWVzc2FnZV9oYW5kbGVyIGNhbGxiYWNrcy4KKwkKKzIwMDMtMDktMjUgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBidXMvc2Vzc2lvbi5jb25mLmluOiBmaXggbXkgbWVzcworCisyMDAzLTA5LTI1ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBidXMvc2Vzc2lvbi5jb25mLmluOiBmaXggc2VjdXJpdHkgcG9saWN5LCByZXBvcnRlZCBieSBTZXRoIE5pY2tlbGwKKworMjAwMy0wOS0yNSAgU2V0aCBOaWNrZWxsICA8c2V0aEBnbm9tZS5vcmc+CisKKwkqIHB5dGhvbi9leGFtcGxlcy9leGFtcGxlLXNlcnZpY2UucHk6CisKKwlKb2hhbiBub3RpY2VzIGNvbXBsZXRlIHdyb25nIGNvZGUgaW4gZXhhbXBsZS1zZXJ2aWNlLCBidXQKKwljb21wbGV0ZWx5IHdyb25nIGluIGEgd2F5IHRoYXQgd29ya3MgZXhhY3RseSB0aGUgc2FtZSAoISkuCisJSm9oYW4gaXMgY29uZnVzZWQsIGhvdyBjb3VsZCB0aGlzIHBvc3NpYmx5IHdvcms/IEV4YW1wbGUKKwljb2RlIGZhaWxzIHRvIHNlcnZlIHB1cnBvc2Ugb2YgbWFraW5nIHRoaW5ncyBjbGVhci4KKwlTZXRoIGZpeGVzLgorCisyMDAzLTA5LTI1ICBNYXJrIE1jTG91Z2hsaW4gIDxtYXJrQHNreW5ldC5pZT4KKworCSogZG9jL2RidXMtc3BlY2lmaWNhdGlvbi5zZ21sOiBkb24ndCByZXF1aXJlIGhlYWRlciBmaWVsZHMKKwl0byBiZSA0LWJ5dGUgYWxpZ25lZCBhbmQgc3BlY2lmeSB0aGF0IGZpZWxkcyBzaG91bGQgYmUKKwlkaXN0aW5ndWlzaGVkIGZyb20gcGFkZGluZyBieSB0aGUgZmFjdCB0aGF0IHplcm8gaXMgbm90CisJYSB2YWxpZCBmaWVsZCBuYW1lLgorCQorCSogZG9jL1RPRE86IHJlbW92ZSByZS1hbGlnbm1lbnQgaXRlbSBhbmQgYWRkIGl0ZW0gdG8gZG9jCisJdGhlIE9CSkVDVF9QQVRIIHR5cGUuCisJCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jOgorCShIZWFkZXJGaWVsZCk6IHJlbmFtZSB0aGUgb3JpZ2luYWwgbWVtYmVyIHRvIHZhbHVlX29mZnNldAorCWFuZCBpbnRyb2R1Y2UgYSBuYW1lX29mZnNldCBtZW1iZXIgdG8ga2VlcCB0cmFjayBvZiB3aGVyZQorCXRoZSBmaWVsZCBhY3R1YWxseSBiZWdpbnMuCisJKGFkanVzdF9maWVsZF9vZmZzZXRzKTogcmVtb3ZlLgorCShhcHBlbmRfaW50X2ZpZWxkKSwgKGFwcGVuZF91aW50X2ZpZWxkKSwKKwkoYXBwZW5kX3N0cmluZ19maWVsZCk6IGRvbid0IGFsaWduIHRoZSBzdGFydCBvZiB0aGUgaGVhZGVyCisJZmllbGQgdG8gYSA0LWJ5dGUgYm91bmRhcnkuCisJKGdldF9uZXh0X2ZpZWxkKTogaW1wbCBmaW5kaW5nIHRoZSBuZXh0IG1hcmhzYWxsZWQgZmllbGQKKwlhZnRlciBhIGdpdmVuIGZpZWxkLgorCShyZV9hbGlnbl9maWVsZF9yZWN1cnNlKTogaW1wbCByZS1hbGlnbmluZyBhIG51bWJlciBvZgorCWFscmVhZHkgbWFyc2hhbGxlZCBmaWVsZHMuCisJKGRlbGV0ZV9maWVsZCk6IGltcGwgZGVsZXRpbmcgYSBmaWVsZCBvZiBhbnkgdHlwZSBhbmQKKwlyZS1hbGlnbmluZyBhbnkgZm9sbG93aW5nIGZpZWxkcy4KKwkoZGVsZXRlX2ludF9vcl91aW50X2ZpZWxkKSwgKGRlbGV0ZV9zdHJpbmdfZmllbGQpOiByZW1vdmUuCisJKHNldF9pbnRfZmllbGQpLCAoc2V0X3VpbnRfZmllbGQpOiBubyBuZWVkIHRvIHJlLWNoZWNrCisJdGhhdCB3ZSBoYXZlIHRoZSBjb3JyZWN0IHR5cGUgZm9yIHRoZSBmaWVsZC4KKwkoc2V0X3N0cmluZ19maWVsZCk6IGRpdHRvIGFuZCBpbXBsIHJlLWFsaWduaW5nIGFueQorCWZvbGxvd2luZyBmaWVsZHMuCisJKGRlY29kZV9oZWFkZXJfZGF0YSk6IHVwZGF0ZSB0byB0YWtlIGludG8gYWNjb3VudCB0aGF0CisJdGhlIGZpZWxkcyBhcmVuJ3QgNC1ieXRlIGFsaWduZWQgYW55IG1vcmUgYW5kIHRoZSBuZXcKKwl3YXkgdG8gZGlzdGluZ3Vpc2ggcGFkZGluZyBmcm9tIGhlYWRlciBmaWVsZHMuIEFsc28sCisJZG9uJ3QgZXhpdCB3aGVuIHRoZXJlIGlzIHRvbyBtdWNoIGhlYWRlciBwYWRkaW5nLgorCShwcm9jZXNzX3Rlc3Rfc3ViZGlyKTogcHJpbnQgdGhlIGRpcmVjdG9yeS4KKwkoX2RidXNfbWVzc2FnZV90ZXN0KTogYWRkIHRlc3QgdG8gbWFrZSBzdXJlIGEgZm9sbG93aW5nCisJZmllbGQgaXMgcmUtYWxpZ25lZCBjb3JyZWN0bHkgYWZ0ZXIgZmllbGQgZGVsZXRpb24uCisJCisJKiBkYnVzL2RidXMtc3RyaW5nLltjaF06CisJKF9kYnVzX3N0cmluZ19pbnNlcnRfYnl0ZXMpOiByZW5hbWUgZnJvbSBpbnNlcnRfYnl0ZSBhbmQKKwlhbGxvdyB0aGUgaW5zZXJ0IG9mIG11bHRpcGxlIGJ5dGVzLgorCShfZGJ1c19zdHJpbmdfdGVzdCk6IHRlc3QgaW5zZXJ0aW5nIG11bHRpcGxlIGJ5dGVzLgorCisJKiBkYnVzL2RidXMtbWFyc2hhbC5jOiAoX2RidXNfbWFyc2hhbF9zZXRfc3RyaW5nKTogYWRkCisJd2FybmluZyBub3RlIHRvIGRvY3MgYWJvdXQgaGF2aW5nIHRvIHJlLWFsaWduIGFueQorCW1hcnNoYWxsZWQgdmFsdWVzIGZvbGxvd2luZyB0aGUgc3RyaW5nLgorCQorCSogZGJ1cy9kYnVzLW1lc3NhZ2UtYnVpbGRlci5jOgorCShhcHBlbmRfc3RyaW5nX2ZpZWxkKSwgKF9kYnVzX21lc3NhZ2VfZGF0YV9sb2FkKToKKwlkb24ndCBhbGlnbiB0aGUgaGVhZGVyIGZpZWxkLgorCQorCSogZGJ1cy9kYnVzLWF1dGguYzogKHByb2Nlc3NfdGVzdF9zdWJkaXIpOiBwcmludCB0aGUKKwlkaXJlY3RvcnkuCisJCisJKiB0ZXN0L2JyZWFrLWxvYWRlci5jOiAocmFuZG9tbHlfYWRkX29uZV9ieXRlKTogdXBkLiBmb3IKKwlpbnNlcnRfYnl0ZSBjaGFuZ2UuCisJCisJKiB0ZXN0L2RhdGEvaW52YWxpZC1tZXNzYWdlcy9iYWQtaGVhZGVyLWZpZWxkLWFsaWdubWVudC5tZXNzYWdlOgorCW5ldyB0ZXN0IGNhc2UuCisJCisJKiB0ZXN0L2RhdGEvdmFsaWQtbWVzc2FnZXMvdW5rbm93bi1oZWFkZXItZmllbGQubWVzc2FnZTogc2hvdmUKKwlhIGRpY3QgaW4gdGhlIHVua25vd24gZmllbGQuCisKKzIwMDMtMDktMjUgIFNldGggTmlja2VsbCAgPHNldGhAZ25vbWUub3JnPgorCisJKiBweXRob24vZGJ1cy5weToKKwkqIHB5dGhvbi9kYnVzX2JpbmRpbmdzLnB5eC5pbjoKKworCUhhbmRsZSByZXR1cm4gdmFsdWVzLgorCQorCSogcHl0aG9uL2V4YW1wbGVzL2V4YW1wbGUtY2xpZW50LnB5OgorCSogcHl0aG9uL2V4YW1wbGVzL2V4YW1wbGUtc2VydmljZS5weToKKworCVBhc3MgYmFjayByZXR1cm4gdmFsdWVzIGZyb20gdGhlIHNlcnZpY2UgdG8gdGhlIGNsaWVudC4KKwkKKzIwMDMtMDktMjQgIFNldGggTmlja2VsbCAgPHNldGhAZ25vbWUub3JnPgorCisJKiBweXRob24vZGJ1cy5weToKKworCUNvbm5lY3QgT2JqZWN0IG1ldGhvZHMgKHdoZW4geW91IGFyZSBzaGFyaW5nIGFuIG9iamVjdCkgdXAuLi4gcGFzcworCWluIGEgbGlzdCBvZiBtZXRob2RzIHRvIGJlIHNoYXJlZC4gU2hhcmluZyBhbGwgdGhlIG1ldGhvZHMganVzdAorCXdvcmtlZCBvdXQgdG9vIHdlaXJkLiBZb3UgY2FuIG5vdyBjcmVhdGUgbmljZSBTZXJ2aWNlcyBvdmVyIHRoZQorCURCdXMgaW4gUHl0aG9uLiA6LSkKKwkKKwkqIHB5dGhvbi9kYnVzX2JpbmRpbmdzLnB5eC5pbjoKKworCUtlZXAgcmVmZXJlbmNlcyB0byB1c2VyX2RhdGEgdHVwbGVzIHBhc3NlZCBpbnRvIEMgZnVuY3Rpb25zIHNvIAorCVB5dGhvbiBkb2Vzbid0IGdhcmJhZ2UgY29sbGVjdCBvbiB1cy4KKworCUltcGxlbWVudCBNZXRob2RSZXR1cm4gYW5kIEVycm9yIHN1YmNsYXNzZXMgb2YgTWVzc2FnZSBmb3IgY3JlYXRpbmcKKwlEQnVzTWVzc2FnZSdzIG9mIHRob3NlIHR5cGVzLgorCQorCSogcHl0aG9uL2V4YW1wbGVzL2V4YW1wbGUtY2xpZW50LnB5OgorCSogcHl0aG9uL2V4YW1wbGVzL2V4YW1wbGUtc2VydmljZS5weToKKworCVNpbXBsZSBleGFtcGxlIGNvZGUgc2hvd2luZyBib3RoIGhvdyBjcmVhdGUgREJ1cyBzZXJ2aWNlcyBhbmQgb2JqZWN0cywKKwlhbmQgaG93IHRvIHVzZSB0aGVtLgorCisyMDAzLTA5LTIzICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBnbGliL2RidXMtZ3Byb3h5LmMgKGRidXNfZ3Byb3h5X21hbmFnZXJfZmlsdGVyKTogaW1wbGVtZW50CisKKzIwMDMtMDktMjMgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBnbGliL2RidXMtZ3Byb3h5LmMgKGRidXNfZ3Byb3h5X2Nvbm5lY3Rfc2lnbmFsKTogaW1wbGVtZW50CisJKGRidXNfZ3Byb3h5X2Rpc2Nvbm5lY3Rfc2lnbmFsKTogaW1wbGVtZW50CisJKGRidXNfZ3Byb3h5X21hbmFnZXJfcmVtb3ZlX3NpZ25hbF9tYXRjaCk6IGltcGxlbWVudAorCShkYnVzX2dwcm94eV9tYW5hZ2VyX2FkZF9zaWduYWxfbWF0Y2gpOiBpbXBsZW1lbnQKKwkoZGJ1c19ncHJveHlfb25ld2F5X2NhbGwpOiBpbXBsZW1lbnQKKworMjAwMy0wOS0yMyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZ2xpYi9kYnVzLWdwcm94eS5jIChzdHJ1Y3QgREJ1c0dQcm94eSk6IGNvbnZlcnQgdG8gYSBHT2JqZWN0CisJc3ViY2xhc3MuIFRoaXMgbWVhbnMgZHJvcHBpbmcgdGhlIHRyYW5zcGFyZW50IHRocmVhZCBzYWZldHkgb2YgdGhlCisJcHJveHk7IHlvdSBub3cgbmVlZCBhIHNlcGFyYXRlIHByb3h5IHBlci10aHJlYWQsIG9yIHlvdXIgb3duCisJbG9ja2luZyBvbiB0aGUgcHJveHkuIFByb2JhYmx5IHJpZ2h0IGFueXdheS4KKwkoZGJ1c19ncHJveHlfcmVmLCBkYnVzX2dwcm94eV91bnJlZik6IG51a2UsIGp1c3QgdXNlIGdfb2JqZWN0X3JlZgorCisyMDAzLTA5LTIyICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZ2xpYi9kYnVzLWdwcm94eS5jIChkYnVzX2dwcm94eV9tYW5hZ2VyX2dldCk6IGltcGxlbWVudAorCisyMDAzLTA5LTIxICBTZXRoIE5pY2tlbGwgIDxzZXRoQGdub21lLm9yZz4KKworICAgICAgICBGaXJzdCBjaGVja2luIG9mIHRoZSBQeXRob24gYmluZGluZ3MuCisJCisJKiBweXRob24vLmN2c2lnbm9yZToKKwkqIHB5dGhvbi9NYWtlZmlsZS5hbToKKwkqIHB5dGhvbi9kYnVzX2JpbmRpbmdzLnB5eC5pbjoKKwkqIHB5dGhvbi9kYnVzX2hfd3JhcHBlci5oOgorCisJUGllY2VzIGZvciBQeXJleCB0byBvcGVyYXRlIG9uLCBidWlsZGluZyBhIGRidXNfYmluZGluZ3Muc28KKwlweXRob24gbW9kdWxlIGZvciBsb3ctbGV2ZWwgYWNjZXNzIHRvIHRoZSBEQnVzIEFQSXMuCisJCisJKiBweXRob24vZGJ1cy5weToKKworCUhpZ2gtbGV2ZWwgUHl0aG9uIG1vZHVsZSBmb3IgYWNjZXNzaW5nIERCdXMgb2JqZWN0cy4KKworCSogY29uZmlndXJlLmluOgorCSogTWFrZWZpbGUuYW06CisKKwlCdWlsZCBzdHVmZiBmb3IgdGhlIHB5dGhvbiBiaW5kaW5ncy4KKworCSogYWNpbmNsdWRlLm00OgorCisJRXh0cmEgbWFjcm8gbmVlZGVkIGZvciBmaW5kaW5nIHRoZSBQeXRob24gQyBoZWFkZXIgZmlsZXMuCisKKzIwMDMtMDktMjEgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGdsaWIvZGJ1cy1ncHJveHkuYyAoZGJ1c19ncHJveHlfbWFuYWdlcl9uZXcpOiBzdGFydAorCWltcGxlbWVudGluZyB0aGUgcHJveHkgbWFuYWdlciwgZGlkbid0IGdldCB2ZXJ5IGZhci4KKworCSogZGJ1cy9kYnVzLWJ1cy5jIChkYnVzX2J1c19hZGRfbWF0Y2gpOiBuZXcKKwkoZGJ1c19idXNfcmVtb3ZlX21hdGNoKTogbmV3CisKKwkqIGdsaWIvZGJ1cy1ncHJveHkuYyAoZGJ1c19ncHJveHlfbmV3X2Zvcl9zZXJ2aWNlKTogYWRkIGEKKwlwYXRoX25hbWUgYXJndW1lbnQ7IGFkanVzdCB0aGUgb3RoZXIgbm90LXlldC1pbXBsZW1lbnRlZCAKKwlncHJveHkgY29uc3RydWN0b3JzIHRvIGJlIHdoYXQgSSB0aGluayB0aGV5IHNob3VsZCBiZS4KKworMjAwMy0wOS0yMSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLWJ1cy5jIChkYnVzX2J1c19nZXQpOiBzZXQgZXhpdF9vbl9kaXNjb25uZWN0IHRvIFRSVUUKKwlieSBkZWZhdWx0IGZvciBtZXNzYWdlIGJ1cyBjb25uZWN0aW9ucy4KKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYyAoZGJ1c19jb25uZWN0aW9uX2Rpc3BhdGNoKTogZXhpdCBpZgorCWV4aXRfb25fZGlzY29ubmVjdCBmbGFnIGlzIHNldCBhbmQgd2UgcHJvY2VzcyB0aGUgZGlzY29ubmVjdGVkCisJc2lnbmFsLgorCShkYnVzX2Nvbm5lY3Rpb25fc2V0X2V4aXRfb25fZGlzY29ubmVjdCk6IG5ldyBmdW5jdGlvbgorCisyMDAzLTA5LTIxICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJR2V0IG1hdGNoaW5nIHJ1bGVzIG1vc3RseSB3b3JraW5nIGluIHRoZSBidXM7IG9ubHkgYWN0dWFsbHkKKwlwYXJzaW5nIHRoZSBydWxlIHRleHQgcmVtYWlucy4gSG93ZXZlciwgdGhlIGNsaWVudCBzaWRlIG9mCisJInNpZ25hbCBjb25uZWN0aW9ucyIgaGFzbid0IGJlZW4gc3RhcnRlZCwgdGhpcyBwYXRjaCBpcyBvbmx5IHRoZQorCWJ1cyBzaWRlLgorCQorCSogZGJ1cy9kaXNwYXRjaC5jOiBmaXggZm9yIHRoZSBtYXRjaGluZyBydWxlcyBjaGFuZ2VzCisJCisJKiBidXMvZHJpdmVyLmMgKGJ1c19kcml2ZXJfaGFuZGxlX3JlbW92ZV9tYXRjaCkKKwkoYnVzX2RyaXZlcl9oYW5kbGVfYWRkX21hdGNoKTogc2VuZCBhbiBhY2sgcmVwbHkgZnJvbSB0aGVzZQorCW1ldGhvZCBjYWxscworCisJKiBnbGliL2RidXMtZ3Byb3h5LmMgKGRidXNfZ3Byb3h5X2JlZ2luX2NhbGwpOiBmaXggb3JkZXIgb2YKKwlhcmd1bWVudHMsIHJlcG9ydGVkIGJ5IFNldGggTmlja2VsbAorCisJKiBidXMvY29uZmlnLXBhcnNlci5jIChhcHBlbmRfcnVsZV9mcm9tX2VsZW1lbnQpOiBzdXBwb3J0CisJZWF2ZXNkcm9wPXRydWV8ZmFsc2UgYXR0cmlidXRlIG9uIHBvbGljaWVzIHNvIG1hdGNoIHJ1bGVzIAorCWNhbiBiZSBwcmV2ZW50ZWQgZnJvbSBzbm9vcGluZyBvbiB0aGUgc3lzdGVtIGJ1cy4KKworCSogYnVzL2RidXMtZGFlbW9uLTEuMS5pbjogY29uc2lzdGVudGx5IHVzZSB0ZXJtaW5vbG9neSAic2VuZGVyIgorCWFuZCAiZGVzdGluYXRpb24iIGluIGF0dHJpYnV0ZSBuYW1lczsgZml4IHNvbWUgZG9jcyBidWdzOyAKKwlhZGQgZWF2ZXNkcm9wPXRydWV8ZmFsc2UgYXR0cmlidXRlCisKKwkqIGJ1cy9kcml2ZXIuYyAoYnVzX2RyaXZlcl9oYW5kbGVfYWRkX21hdGNoKQorCShidXNfZHJpdmVyX2hhbmRsZV9yZW1vdmVfbWF0Y2gpOiBoYW5kbGUgQWRkTWF0Y2gsIFJlbW92ZU1hdGNoCisJbWVzc2FnZXMKKworCSogZGJ1cy9kYnVzLXByb3RvY29sLmggKERCVVNfU0VSVklDRV9PUkdfRlJFRURFU0tUT1BfQlJPQURDQVNUKTogZ2V0CisJcmlkIG9mIGJyb2FkY2FzdCBzZXJ2aWNlIGNvbmNlcHQsIHNpZ25hbHMgYXJlIGp1c3QgYWx3YXlzIGJyb2FkY2FzdAorCisJKiBidXMvc2lnbmFscy5jLCBidXMvZGlzcGF0Y2guYywgYnVzL2Nvbm5lY3Rpb24uYywgYnVzL2J1cy5jOgorCW1vc3RseSBpbXBsZW1lbnQgbWF0Y2hpbmcgcnVsZXMgc3R1ZmYgKGN1cnJlbnRseSBvbmx5IGV4cG9zZWQgYXMgc2lnbmFsCisJY29ubmVjdGlvbnMpCisKKzIwMDMtMDktMjEgIE1hcmsgTWNMb3VnaGxpbiAgPG1hcmtAc2t5bmV0LmllPgorCisJKiBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnNnbWw6IENoYW5nZSB0aGUgaGVhZGVyIGZpZWxkIG5hbWUKKwl0byBiZSBhbiBlbnVtIGFuZCB1cGRhdGUgdGhlIHJlc3Qgb2YgdGhlIHNwZWMgdG8gcmVmZXJlbmNlCisJdGhlIGZpZWxkcyB1c2luZyB0aGUgY29udmVudGluYWwgbmFtZS4KKworCSogZGJ1cy9kYnVzLXByb3RvY29sLmg6IHVwZGF0ZSB0byByZWZsZWN0IHRoZSBzcGVjLgorCisJKiBkb2MvVE9ETzogYWRkIGl0ZW0gdG8gcmVtb3ZlIHRoZSA0IGJ5dGUgYWxpZ25tZW50IHJlcXVpcmVtZW50LgorCQorCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYzogUmVtb3ZlIHRoZSBjb2RlIHRvIGdlbmVyYWxpc2UgdGhlCisJaGVhZGVyL2JvZHkgbGVuZ3RoIGFuZCBzZXJpYWwgbnVtYmVyIGhlYWRlciBmaWVsZHMgYXMgbmFtZWQKKwloZWFkZXIgZmllbGRzIHNvIHdlIGNhbiByZWZlcmVuY2UgZmllbGQgbmFtZXMgdXNpbmcgdGhlIAorCXByb3RvY29sIHZhbHVlcy4KKwkoYXBwZW5kX2ludF9maWVsZCksIChhcHBlbmRfdWludF9maWVsZCksIChhcHBlbmRfc3RyaW5nX2ZpZWxkKToKKwlBcHBlbmQgdGhlIGZpZWxkIG5hbWUgYXMgYSBieXRlIHJhdGhlciB0aGFuIGZvdXIgY2hhcnMuCisJKGRlbGV0ZV9pbnRfb3JfdWludF9maWVsZCksIChkZWxldGVfc3RyaW5nX2ZpZWxkKTogcmVmbGVjdCB0aGUKKwlmYWN0IHRoYXQgdGhlIGZpZWxkIG5hbWUgYW5kIHR5cGVjb2RlIG5vdyBvY2N1cHkgNCBieXRlcyBpbnN0ZWFkCisJb2YgOC4KKwkoZGVjb2RlX3N0cmluZ19maWVsZCksIChkZWNvZGVfaGVhZGVyX2RhdGEpOiB1cGRhdGUgdG8gcmVmbGVjdAorCXByb3RvY29sIGNoYW5nZXMgYW5kIG1vdmUgdGhlIGZpZWxkIHNwZWNpZmljIGVuY29kaW5nIGZyb20KKwlkZWNvZGVfc3RyaW5nX2ZpZWxkKCkgYmFjayBpbnRvIGRlY29kZV9oZWFkZXJfZGF0YSgpLgorCQorCSogZGJ1cy9kYnVzLWludGVybmFscy5bY2hdOiAoX2RidXNfaGVhZGVyX2ZpZWxkX3RvX3N0cmluZyk6CisJQWRkIHV0aWxpdHkgdG8gYWlkIGRlYnVnZ2luZy4KKwkKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLWJ1aWxkZXIuYzoKKwkoYXBwZW5kX3N0cmluZ19maWVsZCksIChfZGJ1c19tZXNzYWdlX2RhdGFfbG9hZCk6IFVwZGF0ZSB0bworCXJlZmxlY3QgcHJvdG9jb2wgY2hhbmdlczsgQ2hhbmdlIHRoZSBGSUVMRF9OQU1FIGRpcmVjdGl2ZQorCXRvIEhFQURFUl9GSUVMRCBhbmQgYWxsb3cgaXQgdG8gdGFrZSB0aGUgZmllbGQncyBjb252ZW50aW9uYWwKKwluYW1lIHJhdGhlciB0aGFuIHRoZSBhY3R1YWwgdmFsdWUuCisJCisJKiB0ZXN0L2RhdGEvKi8qLm1lc3NhZ2U6IFVwZGF0ZSB0byB1c2UgSEVBREVSX0ZJRUxEIGluc3RlYWQKKwlvZiBGSUVMRF9OQU1FOyBBbHdheXMgYWxpZ24gdGhlIGhlYWRlciBvbiBhbiA4IGJ5dGUgYm91bmRhcnkKKwkqYmVmb3JlKiB1cGRhdGluZyB0aGUgaGVhZGVyIGxlbmd0aC4KKworMjAwMy0wOS0xNSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLXBlbmRpbmctY2FsbC5jOiBhZGQgdGhlIGdldC9zZXQgb2JqZWN0IGRhdGEKKwlib2lsZXJwbGF0ZSBhcyBmb3IgREJ1c0Nvbm5lY3Rpb24sIGV0Yy4gVXNlIGdlbmVyaWMgb2JqZWN0IGRhdGEKKwlmb3IgdGhlIG5vdGlmeSBjYWxsYmFjay4KKworCSogZ2xpYi9kYnVzLWdwYXJzZXIuYyAocGFyc2Vfbm9kZSk6IHBhcnNlIGNoaWxkIG5vZGVzCisKKwkqIHRvb2xzL2RidXMtdmlld2VyLmM6IG1vcmUgaGFja2luZyBvbiB0aGUgZGJ1cy12aWV3ZXIKKwkKKwkqIGdsaWIvZGJ1cy1ndXRpbHMuYyAoX2RidXNfZ3V0aWxzX3NwbGl0X3BhdGgpOiBhZGQgYSBmaWxlIHRvCisJY29udGFpbiBmdW5jdGlvbnMgc2hhcmVkIGJldHdlZW4gdGhlIGNvbnZlbmllbmNlIGxpYiBhbmQgdGhlCisJaW5zdGFsbGVkIGxpYgorCisJKiBnbGliL01ha2VmaWxlLmFtIChsaWJkYnVzX2dsaWJfMV9sYV9MREZMQUdTKTogYWRkCisJLWV4cG9ydC1zeW1ib2xzLXJlZ2V4IHRvIHRoZSBHTGliIGxpYnJhcnkKKworCSogZGJ1cy9kYnVzLW9iamVjdC10cmVlLmMgKF9kYnVzX29iamVjdF90cmVlX2Rpc3BhdGNoX2FuZF91bmxvY2spOgorCWZpeCB0aGUgbG9ja2luZyBpbiBoZXJlLCBhbmQgYWRkIGEgZGVmYXVsdCBoYW5kbGVyIGZvcgorCUludHJvc3BlY3QoKSB0aGF0IGp1c3QgcmV0dXJucyBzdWItbm9kZXMuCisKKzIwMDMtMDktMTQgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGdsaWIvZGJ1cy1ndGhyZWFkLmMgKGRidXNfZ190aHJlYWRfaW5pdCk6IHJlbmFtZSB0byBtYWtlIGdfZm9vCisJcmF0aGVyIHRoYW4gZ2ZvbyBjb25zaXN0ZW50CisKKwkqIGdsaWIvZGJ1cy1ncHJveHkuaDogZGVsZXRlIGZvciBub3csIG1vdmUgY29udGVudHMgdG8KKwlkYnVzLWdsaWIuaCwgYmVjYXVzZSB0aGUgaW5jbHVkZSBmaWxlcyBkb24ndCB3b3JrIHJpZ2h0IHNpbmNlIHdlCisJYXJlbid0IGluIHRoZSBkYnVzLyBzdWJkaXIuCisJCisJKiBnbGliL2RidXMtZ3Byb3h5LmMgKGRidXNfZ3Byb3h5X3NlbmQpOiBmaW5pc2ggaW1wbGVtZW50aW5nCisJKGRidXNfZ3Byb3h5X2VuZF9jYWxsKTogZmluaXNoCisJKGRidXNfZ3Byb3h5X2JlZ2luX2NhbGwpOiBmaW5pc2gKKworCSogZ2xpYi9kYnVzLWdtYWluLmMgKGRidXNfc2V0X2dfZXJyb3IpOiBuZXcKKworCSogZ2xpYi9kYnVzLWdvYmplY3QuYyAoaGFuZGxlX2ludHJvc3BlY3QpOiBpbmNsdWRlIGluZm9ybWF0aW9uCisJYWJvdXQgY2hpbGQgbm9kZXMgaW4gdGhlIGludHJvc3BlY3Rpb24KKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYyAoZGJ1c19jb25uZWN0aW9uX2xpc3RfcmVnaXN0ZXJlZCk6IG5ldworCWZ1bmN0aW9uIHRvIGhlbHAgaW4gaW1wbGVtZW50YXRpb24gb2YgaW50cm9zcGVjdGlvbgorCisJKiBkYnVzL2RidXMtb2JqZWN0LXRyZWUuYworCShfZGJ1c19vYmplY3RfdHJlZV9saXN0X3JlZ2lzdGVyZWRfYW5kX3VubG9jayk6IG5ldyBmdW5jdGlvbgorCisyMDAzLTA5LTEyICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBnbGliL2RidXMtZ2lkbC5oOiBhZGQgY29tbW9uIGJhc2UgY2xhc3MgZm9yIGFsbCB0aGUgZm9vX2luZm8KKwl0eXBlcworCisgICAgICAgICogdG9vbHMvZGJ1cy12aWV3ZXIuYzogYWRkIEdUSy1iYXNlZCBpbnRyb3NwZWN0aW9uIFVJIHRoaW5neQorCXNpbWlsYXIgdG8ga2Rjb3AKKworCSogdGVzdC9NYWtlZmlsZS5hbTogdHJ5IHRlc3Qgc3JjZGlyIC1lZiAuIGluIGFkZGl0aW9uIHRvIHRlc3QKKwlzcmNkaXIgPSAuLCBvbmUgb2YgdGhlbSBzaG91bGQgd29yayAoeWVhaCBsYW1lKQorCQorICAgICAgICAqIGdsaWIvTWFrZWZpbGUuYW06IGJ1aWxkIHRoZSAiaWRsIiBwYXJzZXIgc3R1ZmYgYXMgYSBjb252ZW5pZW5jZQorCWxpYnJhcnkKKwkKKwkqIGdsaWIvZGJ1cy1ncGFyc2VyLmg6IG1ha2UgZGVzY3JpcHRpb25fbG9hZCByb3V0aW5lcyByZXR1cm4KKwlOb2RlSW5mbyogbm90IFBhcnNlcioKKworCSogTWFrZWZpbGUuYW0gKFNVQkRJUlMpOiBidWlsZCB0ZXN0IGRpciBhZnRlciBhbGwgbGlicmFyeSBkaXJzCisKKwkqIGNvbmZpZ3VyZS5pbjogYWRkIEdUSysgZGV0ZWN0aW9uCisKKzIwMDMtMDktMDcgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIE1ha2UgRG94eWdlbiBjb250ZW50ZWQuCisKKzIwMDMtMDktMDcgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRvYy9kYnVzLXNwZWNpZmljYXRpb24uc2dtbDogbW9yZSB1cGRhdGVzCisKKzIwMDMtMDktMDYgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRvYy9kYnVzLXNwZWNpZmljYXRpb24uc2dtbDogcGFydGlhbCB1cGRhdGVzCisKKwkqIGJ1cy9kYnVzLWRhZW1vbi0xLjEuaW46IGZpeCB0aGUgY29uZmlnIGZpbGUgZG9jcyBmb3IgdGhlCisJemlsbGlvbnRoIHRpbWU7IGhvcGVmdWxseSBJIGVkaXRlZCB0aGUgcmlnaHQgZmlsZSB0aGlzIHRpbWUuCisKKwkqIGJ1cy9jb25maWctcGFyc2VyLmMgKGFwcGVuZF9ydWxlX2Zyb21fZWxlbWVudCk6IHN1cHBvcnQKKwlzZW5kX3R5cGUsIHNlbmRfcGF0aCwgcmVjZWl2ZV90eXBlLCByZWNlaXZlX3BhdGgKKworCSogYnVzL3BvbGljeS5jOiBhZGQgbWVzc2FnZSB0eXBlIGFuZCBwYXRoIHRvIHRoZSBsaXN0IG9mIHRoaW5ncworCXRoYXQgY2FuIGJlICJmaXJld2FsbGVkIgorCisyMDAzLTA5LTA2ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jIChkYnVzX2Nvbm5lY3Rpb25fcmVnaXN0ZXJfZmFsbGJhY2spOiBhZGQgdGhpcworCShkYnVzX2Nvbm5lY3Rpb25fcmVnaXN0ZXJfb2JqZWN0X3BhdGgpOiBtYWtlIHRoaXMgbm90IGhhbmRsZQorCW1lc3NhZ2VzIHRvIHBhdGhzIGJlbG93IHRoZSBnaXZlbiBwYXRoCisKKzIwMDMtMDktMDMgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIHRlc3QvZ2xpYi9NYWtlZmlsZS5hbTogYWRkIHRoaXMgd2l0aCByYW5kb20gZ2xpYi1saW5rZWQgdGVzdAorCXByb2dyYW1zCisKKwkqIGdsaWIvTWFrZWZpbGUuYW06IHJlbW92ZSB0aGUgcmFuZG9tIHRlc3QgcHJvZ3JhbXMgZnJvbSBoZXJlLAorCWxlYXZlIG9ubHkgdGhlIHVuaXQgdGVzdHMKKworCSogZ2xpYi9kYnVzLWdvYmplY3QuYyAoX2RidXNfZ29iamVjdF90ZXN0KTogYWRkIHRlc3QgZm9yIAorCXVzY29yZS9qYXZhY2FwcyBjb252ZXJzaW9uLCBhbmQgZml4CQorCShnZXRfb2JqZWN0X3Byb3BlcnR5LCBzZXRfb2JqZWN0X3Byb3BlcnR5KTogY2hhbmdlIHRvIC5ORVQKKwljb252ZW50aW9uIGZvciBtYXBwaW5nIHByb3BzIHRvIG1ldGhvZHMsIHNldF9Gb29CYXIvZ2V0X0Zvb0JhciwgCisJc2luY2Ugb25lIGxhbmd1YWdlIGhhcyBzdWNoIGEgY29udmVudGlvbiB3ZSBtYXkgYXMgd2VsbCBjb3B5IGl0LiAKKwlQbHVzIHJlYWwgbWV0aG9kcyBpbiBlaXRoZXIgZ2V0Rm9vQmFyIG9yIGdldF9mb29fYmFyIHN0eWxlIHdvbid0IAorCWNvbGxpZGUgd2l0aCB0aGlzIGNvbnZlbnRpb24uCisKKzIwMDMtMDktMDEgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGdsaWIvZGJ1cy1ncGFyc2VyLmM6IGltcGxlbWVudAorCisJKiBnbGliL2RidXMtZ29iamVjdC5jOiBzdGFydCBpbXBsZW1lbnRpbmcgc2tlbGV0b25zIHN1cHBvcnQKKworCSogY29uZmlndXJlLmluOiB3aGVuIGRpc2FibGluZyBjaGVja3MvYXNzZXJ0LCBhbHNvIGRlZmluZQorCUdfRElTQUJMRV9BU1NFUlQgYW5kIEdfRElTQUJMRV9DSEVDS1MKKworMjAwMy0wOS0wMSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZ2xpYi9NYWtlZmlsZS5hbTogcmVhcnJhbmdlIGEgYnVuY2ggb2YgZmlsZXMgYW5kIGdldCAibWFrZQorCWNoZWNrIiBmcmFtZXdvcmsgc2V0IHVwCisKKzIwMDMtMDgtMzEgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGZpeCBidWlsZCB3aXRoIC0tZGlzYWJsZS10ZXN0cworCisyMDAzLTA4LTMwICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jOiBwdXJnZSBEQnVzTWVzc2FnZUhhbmRsZXIKKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UtaGFuZGxlci5jOiByZW1vdmUgREJ1c01lc3NhZ2VIYW5kbGVyLCBqdXN0IAorCXVzZSBjYWxsYmFja3MgZXZlcnl3aGVyZQorCisyMDAzLTA4LTMwICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiB0ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzL3N5c3RlbS5kL3Rlc3QuY29uZjogY2hhbmdlIHRvIAorCXJvb3QgZm9yIHRoZSB1c2VyIHNvIHdhcm5pbmdzIGRvbid0IGdldCBwcmludGVkCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmM6IGFkZCBkYnVzX21lc3NhZ2VfZ2V0X3BhdGgsCisJZGJ1c19tZXNzYWdlX3NldF9wYXRoCisJCisJKiBkYnVzL2RidXMtb2JqZWN0LXRyZWUuYyAoZG9fdGVzdF9kaXNwYXRjaCk6IGFkZCB0ZXN0IG9mCisJZGlzcGF0Y2hpbmcgdG8gYSBwYXRoCisKKwkqIGRidXMvZGJ1cy1zdHJpbmcuYyAoX2RidXNfc3RyaW5nX3ZhbGlkYXRlX3BhdGgpOiBhZGQKKworCSogZGJ1cy9kYnVzLW1hcnNoYWwuYyAoX2RidXNfZGVtYXJzaGFsX29iamVjdF9wYXRoKTogaW1wbGVtZW50CisJKF9kYnVzX21hcnNoYWxfb2JqZWN0X3BhdGgpOiBpbXBsZW1lbnQKKworCSogZGJ1cy9kYnVzLXByb3RvY29sLmggKERCVVNfSEVBREVSX0ZJRUxEX1BBVEgpOiBuZXcgaGVhZGVyIGZpZWxkIAorCXRvIGNvbnRhaW4gdGhlIHBhdGggdG8gdGhlIHRhcmdldCBvYmplY3QKKwkoREJVU19IRUFERVJfRklFTERfU0VOREVSX1NFUlZJQ0UpOiByZW5hbWUKKwlEQlVTX0hFQURFUl9GSUVMRF9TRU5ERVIgdG8gZXhwbGljaXRseSBzYXkgaXQncyB0aGUgc2VuZGVyIHNlcnZpY2UKKworMjAwMy0wOC0zMCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLW9iamVjdC10cmVlLmM6IHdyaXRlIHRlc3RzIGFuZCBmaXggdGhlIGRpc2NvdmVyZWQgYnVncworCisyMDAzLTA4LTI5ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtb2JqZWN0LXRyZWUuYzogbW9kaWZ5IHRvIGFsbG93IG92ZXJsYXBwaW5nIHBhdGhzIHRvIGJlCisJcmVnaXN0ZXJlZAorCShzdHJ1Y3QgREJ1c09iamVjdFN1YnRyZWUpOiBzaHJpbmsgdGhpcworCWEgbG90LCBzaW5jZSB3ZSBtYXkgaGF2ZSBhIGxvdCBvZiB0aGVtCisJKF9kYnVzX29iamVjdF90cmVlX2ZyZWVfYWxsX3VubG9ja2VkKTogaW1wbGVtZW50CisJKF9kYnVzX29iamVjdF90cmVlX2Rpc3BhdGNoX2FuZF91bmxvY2spOiBpbXBsZW1lbnQKKworMjAwMy0wOC0yOSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLWludGVybmFscy5oOiBmaXggX0RCVVNfTl9HTE9CQUxfTE9DS1MKKworMjAwMy0wOC0yOCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCXB1cmdlIERCdXNPYmplY3RJRAorCQorCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYzogcG9ydCB0byBubyBPYmplY3RJRCwgY3JlYXRlIGEKKwlEQnVzT2JqZWN0VHJlZSwgcmVuYW1lIE9iamVjdFRyZWUgdG8gT2JqZWN0UGF0aCBpbiBwdWJsaWMgQVBJCisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmggKHN0cnVjdCBEQnVzT2JqZWN0VHJlZVZUYWJsZSk6IGRlbGV0ZSAKKwlldmVyeXRoaW5nIGV4Y2VwdCBVbnJlZ2lzdGVyRnVuY3Rpb24gYW5kIE1lc3NhZ2VGdW5jdGlvbgorCQorCSogZGJ1cy9kYnVzLW1hcnNoYWwuYzogcG9ydCBhd2F5IGZyb20gREJ1c09iamVjdElELCAKKwlhZGQgREJVU19UWVBFX09CSkVDVF9QQVRICisJCisJKiBkYnVzL2RidXMtb2JqZWN0LXJlZ2lzdHJ5LltoY10sIGRidXMvZGJ1cy1vYmplY3QuW2hjXSwgCisJZGJ1cy9kYnVzLW9iamVjdGlkLltoY106IHJlbW92ZSB0aGVzZSwgd2UgYXJlIG1vdmluZyB0byAKKwlwYXRoLWJhc2VkIG9iamVjdCBJRHMKKworMjAwMy0wOC0yNSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworICAgICAgICBKdXN0IG5vdGljZWQgdGhhdCBkYnVzX21lc3NhZ2VfdGVzdCBpcyBob3NlZCwgSSB3b25kZXIgd2hlbiBJCisJYnJva2UgdGhhdC4gSSB0aG91Z2h0IG1ha2UgY2hlY2sgd2FzIHBhc3NpbmcgZWFybGllci4uLgorCQorCSogZGJ1cy9kYnVzLW9iamVjdC10cmVlLmM6IGFkZCBuZXcgIm9iamVjdCB0cmVlIiB0byBtYXRjaCBEQ09QIAorCWNvbnRhaW5lciB0cmVlLCB3aWxsIHJlcGxhY2UgbW9zdCBvZiBkYnVzLW9iamVjdC1yZWdpc3RyeQorCisJKiBkYnVzL2RidXMtc3RyaW5nLmMgKF9kYnVzX3N0cmluZ19hcHBlbmRfcHJpbnRmX3ZhbGlzdCk6IGZpeCBDOTkKKwlzY3Jld3VwCisKKzIwMDMtMDgtMTkgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKGRlY29kZV9zdHJpbmdfZmllbGQpOiBzdXBwb3J0IEZJRUxEX1NFTkRFUgorCShkYnVzX21lc3NhZ2VfaXNfZXJyb3IpOiBmaXggdGhpcyBmdW5jdGlvbgorCisJKiBidXMvZGJ1cy1kYWVtb24tMS4xOiBjbGFyaWZ5IGxvZ2ljIG9uIHdoZW4gPGRlbnk+LzxhbGxvdz4gcnVsZXMKKwltYXRjaAorCisJKiBidXMvcG9saWN5LmMgKGJ1c19jbGllbnRfcG9saWN5X2NoZWNrX2Nhbl9yZWNlaXZlKTogZml4IGNvZGUgdG8KKwlyZWZsZWN0IGNsYXJpZmllZCBtYW4gcGFnZQorCShidXNfY2xpZW50X3BvbGljeV9jaGVja19jYW5fc2VuZCk6IGRpdHRvCisJCisJKiBidXMvc2Vzc2lvbi5jb25mLmluOiBmaXh1cAorCisJKiBidXMvc3lzdGVtLmNvbmYuaW46IGZpeHVwCisKKzIwMDMtMDgtMTggIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtaGFzaC5jIChfZGJ1c19oYXNoX3RhYmxlX2luc2VydF90d29fc3RyaW5ncyk6IGZpeAorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChfZGJ1c19tZXNzYWdlX2xvYWRlcl9xdWV1ZV9tZXNzYWdlcyk6IGZpeAorCWR1bWIgYnVnIGNyZWF0ZWQgZWFybGllciAod3Jvbmcgb3JkZXIgb2YgYXJncyB0bworCWRlY29kZV9oZWFkZXJfZGF0YSgpKQorCQorCSogdG9vbHMvZGJ1cy1zZW5kLmM6IHBvcnQKKworCSogdG9vbHMvZGJ1cy1wcmludC1tZXNzYWdlLmMgKHByaW50X21lc3NhZ2UpOiBwb3J0CisKKyAgICAgICAgKiB0ZXN0L2RhdGEvKm1lc3NhZ2VzOiBwb3J0IGFsbCBtZXNzYWdlcyBvdmVyCisJCisgICAgICAgICogZGJ1cy9kYnVzLW1lc3NhZ2UtYnVpbGRlci5jOiBzdXBwb3J0IGluY2x1ZGluZyAKKwltZXNzYWdlIHR5cGUKKwkKKyAgICAgICAgKiBidXMvZHJpdmVyLmM6IHBvcnQgb3ZlcgorCQorCSogYnVzL2Rpc3BhdGNoLmM6IHBvcnQgb3ZlciB0byBuZXcgc3R1ZmYKKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYyAoX2RidXNfY29ubmVjdGlvbl9uZXdfZm9yX3RyYW5zcG9ydCk6CisJcmVuYW1lIGRpc2Nvbm5lY3Qgc2lnbmFsIHRvICJEaXNjb25uZWN0ZWQiCisKKzIwMDMtMDgtMTcgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwlUaGlzIGRvZXNuJ3QgY29tcGlsZSB5ZXQsIGJ1dCBzeW5jaW5nIHVwIHNvIEkgY2FuIGhhY2sgb24gaXQgZnJvbQorCXdvcmsuIFdoYXQgYXJlIGJyYW5jaGVzIGZvciBpZiBub3QgYnJva2VuIGNvZGU/IDstKQorCQorCSogZGJ1cy9kYnVzLXByb3RvY29sLmg6IHJlbW92ZSBEQlVTX0hFQURFUl9GSUVMRF9OQU1FLCBhZGQKKwlEQlVTX0hFQURFUl9GSUVMRF9JTlRFUkZBQ0UsIERCVVNfSEVBREVSX0ZJRUxEX01FTUJFUiwKKwlEQlVTX0hFQURFUl9GSUVMRF9FUlJPUl9OQU1FCisJCisJKiBkYnVzL2RidXMtaGFzaC5jOiBJbnRyb2R1Y2UgREJVU19IQVNIX1RXT19TVFJJTkdTIGFzIGhhY2sgdG8gdXNlCisJZm9yIHRoZSBpbnRlcmZhY2UrbWVtYmVyIHBhaXJzCisJKHN0cmluZ19oYXNoKTogY2hhbmdlIHRvIHVzZSBnX3N0cl9oYXNoIGFsZ29yaXRobQorCShmaW5kX2RpcmVjdF9mdW5jdGlvbiwgZmluZF9zdHJpbmdfZnVuY3Rpb24pOiByZWZhY3RvciB0aGVzZSB0bworCXNoYXJlIG1vc3QgY29kZS4KKwkKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmM6IHBvcnQgYWxsIG9mIHRoaXMgb3ZlciB0byBzdXBwb3J0IAorCWludGVyZmFjZS9tZW1iZXIgZmllbGRzIGluc3RlYWQgb2YgbmFtZSBmaWVsZAorCisJKiBkYnVzL2RidXMtb2JqZWN0LXJlZ2lzdHJ5LmM6IHBvcnQgb3ZlcgorCQorCSogZGJ1cy9kYnVzLXN0cmluZy5jIChfZGJ1c19zdHJpbmdfdmFsaWRhdGVfaW50ZXJmYWNlKTogcmVuYW1lCisJZnJvbSBfZGJ1c19zdHJpbmdfdmFsaWRhdGVfbmFtZQorCisJKiBidXMvZGJ1cy1kYWVtb24tMS4xOiBjaGFuZ2UgZmlsZSBmb3JtYXQgZm9yIHRoZSAKKwk8ZGVueT4vPGFsbG93PiBzdHVmZiB0byBtYXRjaCBuZXcgbWVzc2FnZSBuYW1pbmcgc2NoZW1lCisKKwkqIGJ1cy9wb2xpY3kuYzogcG9ydCBvdmVyCisKKwkqIGJ1cy9jb25maWctcGFyc2VyLmM6IHBhcnNlIG5ldyBmb3JtYXQKKwkKKzIwMDMtMDgtMTYgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy1vYmplY3QtcmVnaXN0cnkuYyAoYWRkX2FuZF9yZW1vdmVfb2JqZWN0cyk6IHJlbW92ZQorCWJyb2tlbiBhc3NlcnRpb24KKworCSogZ2xpYi9kYnVzLWdwcm94eS5jOiBzb21lIGhhY2tpbmcKKworMjAwMy0wOC0xNSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1wZW5kaW5nLWNhbGwuYyAoZGJ1c19wZW5kaW5nX2NhbGxfYmxvY2spOiBpbXBsZW1lbnQKKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYworCShkYnVzX2Nvbm5lY3Rpb25fc2VuZF93aXRoX3JlcGx5X2FuZF9ibG9jayk6IGZhY3RvciBvdXQgaW50ZXJuYWxzOworCWNoYW5nZSB0byBjb252ZXJ0IGFueSBlcnJvciByZXBsaWVzIHRvIERCdXNFcnJvciBpbnN0ZWFkIG9mIAorCXJldHVybmluZyB0aGVtIGFzIGEgbWVzc2FnZQorCisyMDAzLTA4LTE1ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jLCAKKwlkYnVzL2RidXMtcGVuZGluZy1jYWxsLmM6IEZpbmlzaCB0aGUgcGVuZGluZyBjYWxsIHN0dWZmCisKKzIwMDMtMDgtMTQgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtcGVuZGluZy1jYWxsLmM6IHN0YXJ0IG9uIG5ldyBvYmplY3QgdGhhdCB3aWxsIHJlcGxhY2UKKwlEQnVzTWVzc2FnZUhhbmRsZXIgYW5kIFJlcGx5SGFuZGxlckRhdGEgZm9yIHRyYWNraW5nIG91dHN0YW5kaW5nCisJcmVwbGllcworCisJKiBkYnVzL2RidXMtZ3Byb3h5LmM6IHN0YXJ0IG9uIHByb3h5IG9iamVjdCB1c2VkIHRvIGNvbW11bmljYXRlCisJd2l0aCByZW1vdGUgaW50ZXJmYWNlcworCisJKiBkYnVzL2RidXMtZ2lkbC5jOiBkbyB0aGUgYm9yaW5nIGJvaWxlcnBsYXRlIGluIGhlcmUKKwkKKzIwMDMtMDgtMTIgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGJ1cy9kaXNwYXRjaC5jIChidXNfZGlzcGF0Y2gpOiBtYWtlIHRoaXMgcmV0dXJuIHByb3BlciAKKwlEQnVzSGFuZGxlclJlc3VsdCB0byBhdm9pZCBEQlVTX0VSUk9SX1VOS05PV05fTUVUSE9ECisKKwkqIGRidXMvZGJ1cy1lcnJvcnMuYyAoZGJ1c19zZXRfZXJyb3IpOiB1c2UKKwlfZGJ1c19zdHJpbmdfYXBwZW5kX3ByaW50Zl92YWxpc3QKKworCSogZGJ1cy9kYnVzLXN0cmluZy5jIChfZGJ1c19zdHJpbmdfYXBwZW5kX3ByaW50Zl92YWxpc3QpCisJKF9kYnVzX3N0cmluZ19hcHBlbmRfcHJpbnRmKTogbmV3CisKKwkqIGRidXMvZGJ1cy1lcnJvcnMuaCAoREJVU19FUlJPUl9VTktOT1dOX01FU1NBR0UpOiBjaGFuZ2UgdG8KKwlVTktOT1dOX01FVEhPRAorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jIChkYnVzX2Nvbm5lY3Rpb25fZGlzcGF0Y2gpOiBoYW5kbGUKKwlEQlVTX0hBTkRMRVJfUkVTVUxUX05FRURfTUVNT1JZOyBzZW5kIGRlZmF1bHQgZXJyb3IgcmVwbHkgaWYgYQorCW1lc3NhZ2UgaXMgdW5oYW5kbGVkLgorCisyMDAzLTA4LTExICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBidXMvdGVzdC5jIChjbGllbnRfZGlzY29ubmVjdF9oYW5kbGVyKTogY2hhbmdlIHRvIHJldHVybgorCUhBTkRMRUQgKHdvdWxkIGhhdmUgYmVlbiBSRU1PVkVfTUVTU0FHRSkKKworCSogZGJ1cy9kYnVzLW9iamVjdC5oIChlbnVtIERCdXNIYW5kbGVyUmVzdWx0KTogcmVuYW1lIHRvCisJSEFORExFRC9OT1RfWUVUX0hBTkRMRUQgaW5zdGVhZCBvZgorCVJFTU9WRV9NRVNTQUdFL0FMTE9XX01PUkVfSEFORExFUlMgdG8gbWFrZSBpdCBjbGVhcmVyIGhvdyBpdCAKKwlzaG91bGQgYmUgdXNlZC4KKworMjAwMy0wOC0xMCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogdG9vbHMvZGJ1cy1zZW5kLmMgKG1haW4pOiBhZGQgLS10eXBlIGFyZ3VtZW50LCBmb3Igbm93CisJc3VwcG9ydGluZyBvbmx5IG1ldGhvZF9jYWxsIGFuZCBzaWduYWwgdHlwZXMuCisKKwkqIHRvb2xzL2RidXMtcHJpbnQtbWVzc2FnZS5jOiBwcmludCBtZXNzYWdlIHR5cGUKKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYyAoX2RidXNfY29ubmVjdGlvbl9uZXdfZm9yX3RyYW5zcG9ydCk6CisJaW5pdCBjb25uZWN0aW9uLT5vYmplY3RzCisKKwkqIGRvYy9kYnVzLXNwZWNpZmljYXRpb24uc2dtbDogZml4IHNnbWwKKworCSogYnVzLyouYzogcG9ydCBvdmVyIHRvIG9iamVjdC1pbnN0YW5jZSBBUEkgY2hhbmdlcworCisJKiB0ZXN0L3Rlc3Qtc2VydmljZS5jOiBkaXR0bworCQorCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAoZGJ1c19tZXNzYWdlX2NyZWF0ZV9oZWFkZXIpOiBhbGxvdyAjTlVMTAorCW5hbWUsIHdlIHdpbGwgaGF2ZSB0byBmaXggdXAgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgdG8gYWxzbyBoYW5kbGUKKwl0aGlzCisJKGRidXNfbWVzc2FnZV9uZXcpOiBnZW5lcmljIG1lc3NhZ2UtY3JlYXRpb24gY2FsbAorCShzZXRfc3RyaW5nX2ZpZWxkKTogYWxsb3cgYXBwZW5kaW5nIG5hbWUgZmllbGQKKworMjAwMy0wOC0wNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLW9iamVjdC1yZWdpc3RyeS5jOiBpbXBsZW1lbnQgc2lnbmFsIGNvbm5lY3Rpb24gCisJYW5kIGRpc3BhdGNoCisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMgKF9kYnVzX2Nvbm5lY3Rpb25fdW5yZWZfdW5sb2NrZWQpOiBuZXcKKworCSogZGJ1cy9kYnVzLWludGVybmFscy5jIChfZGJ1c19tZW1kdXApOiBuZXcgZnVuY3Rpb24KKworMjAwMy0wOC0wMiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAoZGJ1c19tZXNzYWdlX2dldF9ub19yZXBseSkKKwkoZGJ1c19tZXNzYWdlX3NldF9ub19yZXBseSk6IGFkZCB0aGVzZSBhbmQgcmVtb3ZlCisJc2V0X2lzX2Vycm9yL2dldF9pc19lcnJvcgorCisJKiBkYnVzL2RidXMtcHJvdG9jb2wuaCwgZG9jL2RidXMtc3BlY2lmaWNhdGlvbi5zZ21sOiAKKwlyZW1vdmUgdGhlIEVSUk9SIGZsYWcsIHNpbmNlIHRoZXJlJ3Mgbm93IGFuIEVSUk9SIHR5cGUKKworMjAwMy0wOC0wMSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLW9iamVjdC1yZWdpc3RyeS5jIChfZGJ1c19vYmplY3RfcmVnaXN0cnlfaGFuZGxlX2FuZF91bmxvY2spOgorCWltcGxlbWVudAorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChkYnVzX21lc3NhZ2VfZ2V0X3R5cGUpOiBuZXcgZnVuY3Rpb24KKworCSogZG9jL2RidXMtc3BlY2lmaWNhdGlvbi5zZ21sOiBhZGQgInR5cGUiIGJ5dGUgdG8gbWVzc2FnZXMKKworMjAwMy0wOC0wMSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLXByb3RvY29sLmggKERCVVNfTUVTU0FHRV9UWVBFXyopOiBpbnRyb2R1Y2UKKwlhIG1lc3NhZ2UgdHlwZSBlbnVtIHRvIGRpc3Rpbmd1aXNoIGtpbmRzIG9mIG1lc3NhZ2UKKwkoREJVU19IRUFERVJfRkxBR19OT19SRVBMWV9FWFBFQ1RFRCk6IGZsYWcgZm9yIGEgbWVzc2FnZSAKKwl0aGF0IG5lZWQgbm90IGJlIHJlcGxpZWQgdG8KKworMjAwMy0wOC0wMSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLW1hcnNoYWwuYzogYWRhcHQgdG8gREJ1c09iamVjdElEIGNoYW5nZXMKKwkodW5wYWNrXzhfb2N0ZXRzKTogZml4IG5vLTY0LWJpdC1pbnQgYnVnCisKKwkqIGRidXMvZGJ1cy1vYmplY3QtcmVnaXN0cnkuYyAodmFsaWRhdGVfaWQpOiB2YWxpZGF0ZSB0aGUgCisJY29ubmVjdGlvbiBJRCBiaXRzLCBub3QganVzdCB0aGUgaW5zdGFuY2UgSUQuCisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMgKF9kYnVzX2Nvbm5lY3Rpb25faW5pdF9pZCk6IGluaXRpYWxpemUKKwl0aGUgY29ubmVjdGlvbi1nbG9iYWwgMzMgYml0cyBvZiB0aGUgb2JqZWN0IElECisKKwkqIGRidXMvZGJ1cy1vYmplY3QtcmVnaXN0cnkuYyAoaW5mb19mcm9tX2VudHJ5KTogZmlsbCBpbiAKKwlvYmplY3QgSUQgaW4gdGhlIG5ldyB3YXkKKworCSogZGJ1cy9kYnVzLW9iamVjdGlkLmg6IHJhdGhlciB0aGFuIGhpZ2gvbG93IGJpdHMsIHNwZWNpZmljYWxseSAKKwlkZWZpbmUgc2VydmVyL2NsaWVudC9pbnN0YW5jZSBiaXRzLgorCisyMDAzLTA3LTMwICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jIChkYnVzX2Nvbm5lY3Rpb25fcmVnaXN0ZXJfb2JqZWN0KTogZml4CisJYnVpbGQKKworMjAwMy0wNy0xMyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLW9iamVjdC5oIChzdHJ1Y3QgREJ1c09iamVjdFZUYWJsZSk6IGFkZCBwYWRkaW5nCisJZmllbGRzIHRvIERCdXNPYmplY3RWVGFibGUgYW5kIERCdXNPYmplY3RJbmZvCisKKzIwMDMtMDctMTIgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy1vYmplY3QtcmVnaXN0cnkuYzogaW1wbGVtZW50IHVuaXQgdGVzdCwKKwlmaXggYnVncyBkaXNjb3ZlcmVkIGluIHByb2Nlc3MKKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYzogcmVtb3ZlIGhhbmRsZXJfdGFibGUgYW5kCisJcmVnaXN0ZXJfaGFuZGxlcigpLCBhZGQgREJ1c09iamVjdFJlZ2lzdHJ5IHVzYWdlCisKKwkqIGRidXMvZGJ1cy1vYmplY3RpZC5jIChkYnVzX29iamVjdF9pZF9pc19udWxsKQorCShkYnVzX29iamVjdF9pZF9zZXRfbnVsbCk6IG5ldyBmdW5jdGlvbnMKKworMjAwMy0wNy0wOCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLW9iamVjdC5jOiBpbXBsZW1lbnQgc29tZSBvZiB0aGlzCisKKwkqIGRidXMvZGJ1cy1vYmplY3QtcmVnaXN0cnkuYworCShfZGJ1c19vYmplY3RfcmVnaXN0cnlfYWRkX2FuZF91bmxvY2spOiBmaWxsIGluIHRoZSBvYmplY3RfaWQgb3V0CisJcGFyYW0KKwkoX2RidXNfb2JqZWN0X3JlZ2lzdHJ5X25ldyk6IGhhbmRsZSBPT00KKworMjAwMy0wNy0wOCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLW9iamVjdC5oOiBza2V0Y2ggb3V0IGFuIEFQSSBmb3IgcmVnaXN0ZXJpbmcgb2JqZWN0cworCXdpdGggYSBjb25uZWN0aW9uLCB0aGF0IGFsbG93cyB1cyB0byB1c2UgYXMgbGl0dGxlIGFzIDI0IGJ5dGVzCisJcGVyIG9iamVjdCBhbmQgbGV0cyBhcHBsaWNhdGlvbiBjb2RlIHJlcHJlc2VudCBhbiBvYmplY3QgaW4gCisJYW55IGNvbmNlaXZhYmxlIHdheS4KKworCSogZGJ1cy9kYnVzLW9iamVjdC1yZWdpc3RyeS5jOiBpbXBsZW1lbnQgdGhlIGhhcmQgYml0cyBvZiB0aGUKKwlEQnVzQ29ubmVjdGlvbiBhc3BlY3Qgb2Ygb2JqZWN0IEFQSS4gTm90IHlldCB3aXJlZCB1cC4KKwkKKzIwMDMtMDctMDYgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLmMgKF9kYnVzX21hcnNoYWxfc2V0X29iamVjdF9pZCk6IG5ldyBmdW5jdGlvbgorCShfZGJ1c19tYXJzaGFsX29iamVjdF9pZCk6IG5ldworCShfZGJ1c19kZW1hcnNoYWxfb2JqZWN0X2lkKTogbmV3CisJKF9kYnVzX21hcnNoYWxfZ2V0X2FyZ19lbmRfcG9zKTogc3VwcG9ydCBvYmplY3QgSUQgdHlwZSwgYW5kCisJY29uc29saWRhdGUgaWRlbnRpY2FsIHN3aXRjaCBjYXNlcy4gRG9uJ3QgY29uZGl0aW9uYWxpemUgaGFuZGxpbmcKKwlvZiBEQlVTX1RZUEVfVUlOVDY0LCBuZWVkIHRvIGhhbmRsZSB0aGUgdHlwZSBhbHdheXMuCisJKF9kYnVzX21hcnNoYWxfdmFsaWRhdGVfYXJnKTogY29uc29saWRhdGUgaWRlbnRpY2FsIGNhc2VzLCBhbmQKKwloYW5kbGUgREJVU19UWVBFX09CSkVDVF9JRAorCisJKiBkYnVzL2RidXMtb2JqZWN0aWQuYzogbmV3IGZpbGUgd2l0aCBEQnVzT2JqZWN0SUQgZGF0YSB0eXBlLgorCisJKiBkYnVzL2RidXMtcHJvdG9jb2wuaDogYWRkIERCVVNfVFlQRV9PQkpFQ1RfSUQKKworMjAwMy0wOS0yOCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogcmVhbCAwLjEzIHJlbGVhc2UKKworMjAwMy0wOS0yOCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZG9jL01ha2VmaWxlLmFtIChkYnVzLXNwZWNpZmljYXRpb24uaHRtbCk6IHRlc3RpbmcgYSBmdW5reSBoYWNrCisJdG8gd29yayB3aXRoIERlYmlhbiBkYjJodG1sCisKKzIwMDMtMDktMjggIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogMC4xMworCisJKiBkb2MvTWFrZWZpbGUuYW0gKGRidXMtdGVzdC1wbGFuLmh0bWwpOiBhY2NlcHQgbm9uZXhpc3RlbmNlIG9mCisJc3R5bGVzaGVldC1pbWFnZXMgZm9yIGJlbmVmaXQgb2YgRGViaWFuCisJCisJQ2hhbmdlIGJhY2sgdG8gdXNpbmcgZmlsZXN5c3RlbS1saW5rZWQgc29ja2V0cyBmb3IgdGhlIHN5c3RlbQorCWJ1cywgc28gb25seSByb290IGNhbiBjcmVhdGUgdGhlIGRlZmF1bHQgc3lzdGVtIGJ1cyBhZGRyZXNzLgorCQorCSogYnVzL3N5c3RlbS5jb25mLmluOiBjaGFuZ2UgdG8gdXNlCisJREJVU19TWVNURU1fQlVTX0RFRkFVTFRfQUREUkVTUworCisJKiBkYnVzL01ha2VmaWxlLmFtIChJTkNMVURFUyk6IHJlbW92ZSBEQlVTX1NZU1RFTV9CVVNfUEFUSCBkZWZpbmUKKwlmcm9tIGhlcmUuCisKKwkqIGNvbmZpZ3VyZS5pbjogZGVmaW5lIERCVVNfU1lTVEVNX0JVU19ERUZBVUxUX0FERFJFU1MKKwloZXJlLCBhbmQgQUNfREVGSU5FIERCVVNfU1lTVEVNX1BBVEgKKworMjAwMy0wOC0wOSAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGRvYy9UT0RPOgorCSogZG9jL2J1c2NvbmZpZy5kdGQ6CisJQWRkIGJ1c2NvbmZpZyBEVEQuCisJCisyMDAzLTA4LTA5ICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogZG9jL2RidXMtc3BlY2lmaWNhdGlvbi5zZ21sOgorCUFkZCBhY3RpdmF0aW9uIHJlcGx5IHZhbHVlcy4KKwkKKzIwMDMtMDgtMDUgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBjb25maWd1cmUuaW46IDAuMTIKKworMjAwMy0wOC0wNSAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGdsaWIvZGJ1cy1nbWFpbi5jOiAod2F0Y2hfZmRfbmV3KSwgKHdhdGNoX2ZkX3JlZiksCisJKHdhdGNoX2ZkX3VucmVmKSwgKGRidXNfZ3NvdXJjZV9jaGVjayksIChkYnVzX2dzb3VyY2VfZGlzcGF0Y2gpLAorCShhZGRfd2F0Y2gpLCAocmVtb3ZlX3dhdGNoKSwgKGNyZWF0ZV9zb3VyY2UpOgorCVJlZmNvdW50IGZkcywgZml4ZXMgc29tZSByZWVudHJhbmN5IGlzc3Vlcy4KKwkKKzIwMDMtMDctMzAgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtYnVzLmMgKGluaXRfY29ubmVjdGlvbnNfdW5sb2NrZWQpOiBmaXggZGVmYXVsdCBzeXN0ZW0KKwlidXMgYWRkcmVzcyB0byBiZSBhYnN0cmFjdCBpZiB3ZSBoYXZlIGFic3RyYWN0IHNvY2tldHMKKworCSogTkVXUzogdXBkYXRlCisKKzIwMDMtMDctMjggIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBidXMvbWVzc2FnZWJ1cy5pbjogZml4IHRvIGF2b2lkIHByb2Nlc3NuYW1lL3NlcnZpY2VuYW1lIAorCWNvbmZ1c2lvbiwgZnJvbSBNaWNoYWVsIEtlYXJleQorCWh0dHBzOi8vYnVnemlsbGEucmVkaGF0LmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MTAwOTY1CisJCisyMDAzLTA3LTIzICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChkYnVzX21lc3NhZ2VfaXRlcl9nZXRfbmFtZWQpOiAKKwlmaXggZnJvbSBBbmR5IEhhbnRvbiB0byByZW1vdmUgYnJva2VuICIrMSIKKworMjAwMy0wNy0xNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogdG9vbHMvZGJ1cy1sYXVuY2guYyAoYmFieXNpdCk6IGNsb3NlIHN0ZG91dC9zdGRlcnIgaW4gdGhlCisJYmFieXNpdHRlciBwcm9jZXNzLCBhcyBzdWdnZXN0ZWQgYnkgVGhvbWFzIExlb25hcmQsIHNvIAorCWFuICJldmFsIGBkYnVzLWxhdW5jaCAtLWV4aXQtd2l0aC1zZXNzaW9uYCIgd2lsbCBhY3R1YWxseSAKKwlyZXR1cm4KKworMjAwMy0wNy0xNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogY29uZmlndXJlLmluOiBwcmludCBvdXQgRVhQQU5ERURfKiB2YXJpYWJsZXMgaW4gdGhlIHN1bW1hcnkgYXQKKwl0aGUgZW5kOyBjbGVhbiB1cCB0aGUgY29kZSB0aGF0IGNvbXB1dGVzIEVYUEFOREVEXyB2YXJpYWJsZXMgYW5kCisJZ2V0IHRoZSBvbmVzIHVzaW5nIGV4ZWNfcHJlZml4IHJpZ2h0LiBTaG91bGQgbWFrZSB0aGluZ3Mgd29yaworCXdoZW4geW91IGJ1aWxkIHdpdGhvdXQgLS1wcmVmaXgKKworMjAwMy0wNi0yOSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogbW9uby9UZXN0LmNzIChjbGFzcyBUZXN0KTogZmlyZSB1cCBhIG1haW4gbG9vcCBhbmQgcnVuIGl0CisKKwkqIG1vbm8vREJ1cy5jcyAoREJ1cyk6IGRvbid0IGdfdGhyZWFkX2luaXQgc2luY2UgaXQgY2FuIG9ubHkgYmUKKwlkb25lIG9uY2UsIHRoZSBhcHAgaGFzIHRvIGRvIGl0CisKKzIwMDMtMDYtMjYgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIG1vbm8vQ29ubmVjdGlvbi5jczogc2V0IHVwIGNvbm5lY3Rpb24gd2l0aCB0aGUgZ2xpYiBtYWluIGxvb3AKKworMjAwMy0wNy0wMSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRvYy9kYnVzLXNwZWNpZmljYXRpb24uc2dtbDogY2xhcmlmeSB0aGUgZm9ybWF0IG9mIGEgdHlwZSBjb2RlLAorCWNoYW5nZSBzdWdnZXN0ZWQgYnkgSmltIEJsYW5keQorCisyMDAzLTA2LTI5ICBNaWxvc2xhdiBUcm1hYyAgPG1pdHJAdm9sbnkuY3o+CisKKwkqIGRvYy9NYWtlZmlsZS5hbToKKwkqIHRvb2xzL01ha2VmaWxlLmFtOiBEb24ndCBhc3N1bWUgc3JjZGlyID09IGJ1aWxkZGlyLgorCisJKiBkYnVzL2RidXMtbWVtb3J5LmMgKGRidXNfcmVhbGxvYyk6IERvbid0IGNoZWNrIGd1YXJkcyBhZnRlciBzaHJpbmtpbmcKKwl0aGUgYWxsb2NhdGVkIGJsb2NrLgorCShfZGJ1c19tZW1vcnlfdGVzdCk6IE5ldyBmdW5jdGlvbi4KKwkqIGRidXMvZGJ1cy10ZXN0Lmg6IEFkZCBfZGJ1c19tZW1vcnlfdGVzdCAoKS4KKwkqIGRidXMvZGJ1cy10ZXN0LmMgKGRidXNfaW50ZXJuYWxfZG9fbm90X3VzZV9ydW5fdGVzdHMpOiBDYWxsIGl0LgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChkZWNvZGVfaGVhZGVyX2RhdGEpOiBVc2UgJS40cyBpbnN0ZWFkCisJb2YgJWMlYyVjJWMuCisJKGRidXNfbWVzc2FnZV9uZXcpOiBSZW1vdmUgb2Jzb2xldGUgQHRvZG8uCisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLmMgKF9kYnVzX21hcnNoYWxfc2V0X2ludDY0KQorCShfZGJ1c19tYXJzaGFsX3NldF91aW50NjQpOiBGaXggY29tbWVudC4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAoYXBwZW5kX2ludF9maWVsZCwgYXBwZW5kX3VpbnRfZmllbGQpOiBEb24ndAorCWhhcmRjb2RlIEZJRUxEX1JFUExZX1NFUklBTC4KKworCSogZGJ1cy9kYnVzLW1haW5sb29wLmMgKF9kYnVzX2xvb3BfcmVtb3ZlX3dhdGNoKQorCShfZGJ1c19sb29wX3JlbW92ZV90aW1lb3V0KTogQ2FzdCBmdW5jdGlvbiBwb2ludGVycyB0byAodm9pZCAqKSBmb3IgJXAKKworCSogY29uZmlndXJlLmluOiBBZGQgLURfUE9TSVhfQ19TT1VSQ0U9MTk5MzA5TCAtREJTRF9TT1VSQ0UgdG8gQ0ZMQUdTCisJYW5kIGRpc2FibGUgREJVU19VU0VfQVRPTUlDX0lOVF80ODYgd2hlbiAtLWVuYWJsZS1hbnNpIGlzIHVzZWQKKworMjAwMy0wNi0yNCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogbW9uby8qLmNzOiBVc2UgSW50UHRyLlplcm8gaW5zdGVhZCBvZiAoKEludFB0cikgMCkKKworMjAwMy0wNi0yMyAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGNvbmZpZ3VyZS5pbjoKKwkqIGdjai8uY3ZzaWdub3JlOgorCSogZ2NqL0hlbGxvLmphdmE6CisJKiBnY2ovTWFrZWZpbGUuYW06CisJKiBnY2ovVGVzdE1lc3NhZ2UuamF2YTogKFRlc3RNZXNzYWdlKSwgKFRlc3RNZXNzYWdlLm1haW4pOgorCSogZ2NqL29yZy8uY3ZzaWdub3JlOgorCSogZ2NqL29yZy9NYWtlZmlsZS5hbToKKwkqIGdjai9vcmcvZnJlZWRlc2t0b3AvLmN2c2lnbm9yZToKKwkqIGdjai9vcmcvZnJlZWRlc2t0b3AvTWFrZWZpbGUuYW06CisJKiBnY2ovb3JnL2ZyZWVkZXNrdG9wL2RidXMvLmN2c2lnbm9yZToKKwkqIGdjai9vcmcvZnJlZWRlc2t0b3AvZGJ1cy9NYWtlZmlsZS5hbToKKwkqIGdjai9vcmcvZnJlZWRlc2t0b3AvZGJ1cy9NZXNzYWdlLmphdmE6IChNZXNzYWdlKSwKKwkoTWVzc2FnZS5NZXNzYWdlKToKKwkqIGdjai9vcmcvZnJlZWRlc2t0b3AvZGJ1cy9uYXRNZXNzYWdlLmNjOgorCUZpeCB0aGUgYnVpbGQgc3lzdGVtLgorCisyMDAzLTA2LTIyICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBtb25vL0Nvbm5lY3Rpb24uY3M6IGFkZCBtb3JlIGJpbmRpbmdzCisKKwkqIGRidXMvZGJ1cy10aHJlYWRzLmMgKGRidXNfdGhyZWFkc19pbml0KTogYWxsb3cgY2FsbGluZyB0aGlzCisJbW9yZSB0aGFuIG9uY2UuCisKKzIwMDMtMDYtMjIgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIG1vbm8vQ29ubmVjdGlvbi5jcywgbW9uby9EQnVzLmNzLCBtb25vL0Vycm9yLmNzOgorCVN0YXJ0IHdyYXBwaW5nIG1vcmUgc3R1ZmYuCisKKzIwMDMtMDYtMjIgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIG1vbm8vTWVzc2FnZS5jczogaW1wbGVtZW50IE1lc3NhZ2UuV3JhcCgpIHRoYXQgZW5zdXJlcyB3ZSBvbmx5CisJaGF2ZSBhIHNpbmdsZSBDIyB3cmFwcGVyIHBlciBEQnVzTWVzc2FnZSwgYXNzdW1pbmcgaXQgd29ya3Mgd2hpY2gKKwlpdCBwcm9iYWJseSBkb2Vzbid0LgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChkYnVzX21lc3NhZ2VfYWxsb2NhdGVfZGF0YV9zbG90KTogbmV3CisJKGRidXNfbWVzc2FnZV9mcmVlX2RhdGFfc2xvdCk6IG5ldworCShkYnVzX21lc3NhZ2Vfc2V0X2RhdGEpOiBuZXcKKwkoZGJ1c19tZXNzYWdlX2dldF9kYXRhKTogbmV3CisKKzIwMDMtMDYtMjIgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy1kYXRhc2xvdC5jIChfZGJ1c19kYXRhX3Nsb3RfYWxsb2NhdG9yX3VucmVmKQorCShfZGJ1c19kYXRhX3Nsb3RfYWxsb2NhdG9yX2FsbG9jKTogcmV3b3JrIHRoZXNlIHRvIGtlZXAgYQorCXJlZmVyZW5jZSBjb3VudCBvbiBlYWNoIHNsb3QgYW5kIGF1dG9tYXRpY2FsbHkgbWFuYWdlIGEgZ2xvYmFsCisJc2xvdCBJRCB2YXJpYWJsZSBwYXNzZWQgaW4gYnkgYWRkcmVzcworCisJKiBidXMvYnVzLmM6IGNvbnZlcnQgdG8gbmV3IGRhdGFzbG90IEFQSQorCisJKiBkYnVzL2RidXMtYnVzLmM6IGNvbnZlcnQgdG8gbmV3IGRhdGFzbG90IEFQSQorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jOiBjb252ZXJ0IHRvIG5ldyBkYXRhc2xvdCBBUEkKKworCSogZGJ1cy9kYnVzLXNlcnZlci5jOiBjb252ZXJ0IHRvIG5ldyBkYXRhc2xvdCBBUEkKKworCSogZ2xpYi9kYnVzLWdtYWluLmM6IGRpdHRvCisKKwkqIGJ1cy90ZXN0LmM6IGRpdHRvCisKKwkqIGJ1cy9jb25uZWN0aW9uLmM6IGRpdHRvCisKKzIwMDMtMDYtMjIgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBjb25maWd1cmUuaW46IEFkZCBBTV9QUk9HX0dDSiBhbmQgbW92ZSBBTV9QUk9HX0xJQlRPT0wKKwlhZnRlciB0aGUgZ2NqIGNoZWNrcyBzbyB0aGF0IHRoZSBjb3JyZWN0IGNvbmZpZ3VyYXRpb24gdGFncworCXdpbGwgYmUgYWRkZWQgdG8gbGlidG9vbC4KKworCSogZGJ1cy1nbGliLTEucGMuaW46IE5vIG5lZWQgdG8gc3BlY2lmeSBhbnkgaW5jbHVkZXMgc2luY2UKKwlkYnVzLTEucGMuaW4gaGFzIHRob3NlLgorCisyMDAzLTA2LTIyICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBtb25vLyosIGdjai8qLCBjb25maWd1cmUuaW4sIE1ha2VmaWxlLmFtOgorCUNoZWNrIGluIG1ha2VmaWxlcyBhbmQgc3ViZGlycyBmb3IgbW9ubyBhbmQgZ2NqIGJpbmRpbmdzLgorCU5laXRoZXIgYmluZGluZyBhY3R1YWxseSBleGlzdHMsIGp1c3QgdHJ5aW5nIHRvIGdldCB0aHJvdWdoCisJYWxsIHRoZSBidWlsZCBhbmQgb3RoZXIgYm9yaW5nIGJpdHMuCisKKzIwMDMtMDYtMjEgIFBoaWxpcCBCbHVuZGVsbCAgPHBoaWxiQGdudS5vcmc+CisKKwkqIHRvb2xzL2RidXMtbW9uaXRvci4xOiBVcGRhdGVkLgorCisJKiB0b29scy9kYnVzLXNlbmQuMTogTGlrZXdpc2UuCisKKzIwMDMtMDYtMjAgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LXVuaXguYyAodW5peF9oYW5kbGVfd2F0Y2gpOiBDaGVjaworCWZvciBoYW5ndXAgYW5kIGVycm9yIGFmdGVyIGNoZWNraW5nIHJlYWQgc28gd2Ugd29uJ3QgZGlzY2FyZAorCXBlbmRpbmcgZGF0YSBpZiBib3RoIGhhbmd1cCBhbmQgcmVhZCBhcmUgc2V0LgorCisyMDAzLTA2LTE5ICBQaGlsaXAgQmx1bmRlbGwgIDxwaGlsYkBnbnUub3JnPgorCisJKiB0b29scy9kYnVzLXByaW50LW1lc3NhZ2UuYyAocHJpbnRfbWVzc2FnZSk6IEhhbmRsZSBCT09MRUFOLgorCisJKiB0b29scy9kYnVzLXNlbmQuYzogQWNjZXB0IGJvdGggLS1zeXN0ZW0gYW5kIC0tc2Vzc2lvbi4KKworCSogdG9vbHMvZGJ1cy1tb25pdG9yLmM6IFNhbWUgaGVyZS4KKworMjAwMy0wNi0xOSAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGdsaWIvZGJ1cy1nbGliLmg6IEZpeCBzbyB0aGF0IGRidXMtZ2xpYi5oIGNhbiBiZSB1c2VkCisJZnJvbSBDKysgKFBhdGNoIGJ5IE1pbG9zbGF2IFRybWFjKS4KKworMjAwMy0wNi0xNSAgSm9lIFNoYXcgIDxqb2VAYXNzYmFybi5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogQ2hlY2sgZm9yIHNvY2tsZW5fdC4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYzogRGVmaW5lIHNvY2tsZW5fdCBpZiBpdCdzIG5vdCBkZWZpbmVkLgorCisJKiB0ZXN0L3Rlc3Qtc2VnZmF1bHQuYzogQWRkICNpbmNsdWRlIDxzeXMvdGltZS5oPgorCisJKiB0b29scy9NYWtlZmlsZS5hbTogQWRkIERCVVNfWF9DRkxBR1MgdG8gdGhlIElOQ0xVREVTIHNpbmNlCisJZGJ1cy1sYXVuY2ggbmVlZHMgaXQuCisKKzIwMDMtMDYtMDkgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jIChfZGJ1c19saXN0ZW5fdW5peF9zb2NrZXQpOiBkb24ndCB1c2UKKwlTVU5fTEVOLCBpdCBicmVha3MgYWJzdHJhY3Qgc29ja2V0IHVzYWdlCisKKwkqIGRidXMvZGJ1cy1pbnRlcm5hbHMuYyAoX2RidXNfdmVyYm9zZV9yZWFsKTogb25seSBwcmludCBQSUQgYXQKKwlzdGFydHMgb2YgbGluZXMuCisKKzIwMDMtMDYtMDQgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy1zZXJ2ZXIuYyAoZGJ1c19zZXJ2ZXJfbGlzdGVuKTogYWxsb3cgYWJzdHJhY3Qgc29ja2V0cworCXVzaW5nIHVuaXg6YWJzdHJhY3Q9L2ZvbywgYW5kIHdoZW4gbGlzdGVuaW5nIGluIGEgdG1wZGlyCisJaS5lLiB1bml4OnRtcGRpcj0vdG1wLCBhbHdheXMgdXNlIGFic3RyYWN0IHNvY2tldHMgaWYgd2UgY2FuLgorCisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LmMgKF9kYnVzX3RyYW5zcG9ydF9vcGVuKTogc3VwcG9ydAorCXVuaXg6YWJzdHJhY3Q9L2ZvbworCisJKiBkYnVzL2RidXMtc2VydmVyLXVuaXguYyAoX2RidXNfc2VydmVyX25ld19mb3JfZG9tYWluX3NvY2tldCk6CisJc3VwcG9ydCBhYnN0cmFjdCBzb2NrZXRzCisKKwkqIGRidXMvZGJ1cy10cmFuc3BvcnQtdW5peC5jCisJKF9kYnVzX3RyYW5zcG9ydF9uZXdfZm9yX2RvbWFpbl9zb2NrZXQpOiBzdXBwb3J0IGFic3RyYWN0IHNvY2tldHMKKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYyAoX2RidXNfY29ubmVjdF91bml4X3NvY2tldCk6IGFkZCAiYWJzdHJhY3QiCisJdG9nZ2xlIGFzIGFuIGFyZ3VtZW50LCBpbXBsZW1lbnQgYWJzdHJhY3QgbmFtZXNwYWNlIHN1cHBvcnQKKwkoX2RidXNfbGlzdGVuX3VuaXhfc29ja2V0KTogZGl0dG8KKworCSogY29uZmlndXJlLmluOiBhZGQgLS1lbmFibGUtYWJzdHJhY3Qtc29ja2V0cyBhbmQgaW1wbGVtZW50CisJYSBjb25maWd1cmUgY2hlY2sgZm9yIGF1dG9kZXRlY3Rpb24gb2YgdGhlIHJpZ2h0IHZhbHVlLgorCisyMDAzLTA2LTAxICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiB0b29scy9kYnVzLWNsZWFudXAtc29ja2V0cy5jOiBhZGQgdXRpbGl0eSB0byBjbGVhbiB1cCBzb2NrZXRzCisJaW4gL3RtcCAodGhvdWdoIG9uIExpbnV4IHRoaXMgd2lsbCBlbmQgdXAgYmVpbmcgdXNlbGVzcywKKwl3aGVuIHdlIGFkZCBhYnN0cmFjdCBuYW1lc3BhY2Ugc3VwcG9ydCkKKworCSogY29uZmlndXJlLmluOiBkZWZpbmUgREJVU19TRVNTSU9OX1NPQ0tFVF9ESVIgaW4gYWRkaXRpb24gdG8KKwlzdWJzdCdpbmcgaXQKKworMjAwMy0wNS0yOCAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogdG9vbHMvZGJ1cy1tb25pdG9yLmMgKG1haW4pOiBGaXggc2lsbHkgdHlwbyAocy8tLXNlc3Npb24vLS1zeXN0ZW0vKS4KKworMjAwMy0wNS0xOCAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKGRidXNfbWVzc2FnZV9uZXcpOiBSZW1vdmUgQHRvZG8uCisKKzIwMDMtMDUtMTcgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQGdudS5vcmc+CisKKwkqIHRvb2xzL2RidXMtc2VuZC5jOiBEb24ndCBleGl0IHdpdGggYW4gZXJyb3IgY29kZSBpZiAtLWhlbHAgd2FzCisJcGFzc2VkLiAgRGVmYXVsdCB0byB1c2luZyB0aGUgc2Vzc2lvbiBidXMgaW5zdGVhZCBvZiB0aGUgc3lzdGVtCisJb25lLgorCisJKiB0b29scy9kYnVzLWxhdW5jaC5jOiBEaXR0by4KKworCSogdG9vbHMvZGJ1cy1tb25pdG9yLmM6IERpdHRvLgorCisJKiB0b29scy9kYnVzLXNlbmQuMTogVXBkYXRlIHdpdGggbmV3IGFyZ3VtZW50cy4KKworCSogdG9vbHMvZGJ1cy1sYXVuY2guYzogRW1pdCBjb2RlIHRvIGV4cG9ydCB2YXJpYWJsZXMuICBOZXcKKwlhcmd1bWVudHMgLXMgYW5kIC1jIHRvIHNwZWNpZnkgc2hlbGwgc3ludGF4LCBhbmQgYSBiaXQgb2YgY29kZSB0bworCWF1dG9kZXRlY3Qgc3ludGF4LiAgQWxzbywgYWxsb3cgc3BlY2lmeWluZyBhIHByb2dyYW0gdG8gcnVuLgorCisJKiB0b29scy9kYnVzLWxhdW5jaC4xOiBVcGRhdGUgd2l0aCBuZXcgYXJndW1lbnRzLgorCisJKiB0b29scy9kYnVzLXNlbmQuMTogRGl0dG8uCisKKwkqIHRvb2xzL2RidXMtbW9uaXRvci4xOiBEaXR0by4KKworMjAwMy0wNS0xNyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogYnVzL2NvbmZpZy1wYXJzZXIuYyAobWVyZ2VfaW5jbHVkZWQpOiBtZXJnZSBpbiBwb2xpY2llcyBmcm9tCisJY2hpbGQgY29uZmlndXJhdGlvbiBmaWxlLgorCisJKiBidXMvcG9saWN5LmMgKGJ1c19wb2xpY3lfbWVyZ2UpOiBmdW5jdGlvbiB0byBtZXJnZSB0d28gcG9saWNpZXMKKwl0b2dldGhlcgorCisyMDAzLTA1LTE2ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYzogZGlzYWJsZSB2ZXJib3NlIGxvY2sgc3BldworCisJKiB0b29scy9kYnVzLXNlbmQuYzogYWRkIC0tcHJpbnQtcmVwbHkgY29tbWFuZCBsaW5lIG9wdGlvbgorCisJKiB0b29scy9kYnVzLXByaW50LW1lc3NhZ2UuaCAocHJpbnRfbWVzc2FnZSk6IG5ldyB1dGlsIGZ1bmN0aW9uCisJc2hhcmVkIGJ5IGRidXMtc2VuZCBhbmQgZGJ1cy1tb25pdG9yCisKKwkqIHRvb2xzL2RidXMtbW9uaXRvci5jIChoYW5kbGVyX2Z1bmMpOiBleGl0IG9uIGRpc2Nvbm5lY3QKKworCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC11bml4LmMgKGRvX3JlYWRpbmcpOiBpZiB0aGUgdHJhbnNwb3J0IGlzCisJZGlzY29ubmVjdGVkLCBkb24ndCB0cnkgdG8gdXNlIHRoZSByZWFkX3dhdGNoCisKKwkqIGRidXMvZGJ1cy13YXRjaC5jIChkYnVzX3dhdGNoX2dldF9lbmFibGVkKTogYXNzZXJ0IHdhdGNoICE9IE5VTEwKKwlzbyB3ZSBjYW4gZmluZCB0aGlzIGJ1ZyBtb3JlIGVhc2lseQorCisyMDAzLTA1LTE2ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogYnVzL3BvbGljeS5jIChmcmVlX3J1bGVfbGlzdF9mdW5jKTogYXZvaWQgYSBjcmFzaCB3aGVuIHBhc3NlZAorCU5VTEwgYXMgREJ1c0hhc2hUYWJsZSBpcyBhbm5veWluZ2x5IGxpa2VseSB0byBkby4KKworMjAwMy0wNS0xNiAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogdG9vbHMvZGJ1cy1tb25pdG9yLmM6IEFkZCAtLXNlc3Npb24gYXJndW1lbnQgYW5kIHVzYWdlKCkKKwlmdW5jdGlvbi4KKworCSogdG9vbHMvZGJ1cy1tb25pdG9yLjE6IFVwZGF0ZSB3aXRoIG5ldyAtLXNlc3Npb24gYXJnLgorCisJKiBidXMvTWFrZWZpbGUuYW0gKGluc3RhbGwtZGF0YS1ob29rKTogQ3JlYXRlCisJJChsaWJkaXIpL2RidXMtMS4wL3NlcnZpY2VzIHNvIHRoYXQgdGhlIHNlc3Npb24gYnVzIGlzIGhhcHB5LgorCisyMDAzLTA1LTE1ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYyAoX2RidXNfYXRvbWljX2RlYywgX2RidXNfYXRvbWljX2luYyk6IHdvcmsKKwlvbiBub24teDg2LiBpZmRlZidzIGFyZSBldmlsLgorCisyMDAzLTA1LTE1ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogY29uZmlndXJlLmluOiAwLjExCisKKwkqIE5FV1M6IHVwZGF0ZQorCisJKiBidXMvTWFrZWZpbGUuYW0gKGluaXRkZGlyKTogYXBwYXJlbnRseSB3ZSBhcmUgc3VwcG9zZWQgdG8gcHV0CisJaW5pdCBzY3JpcHRzIGluIC9ldGMvcmMuZC9pbml0LmQgbm90IC9ldGMvaW5pdC5kCisKKwkqIGJ1cy9NYWtlZmlsZS5hbTogcmVtb3ZlIHRoZSAieW91IG11c3QgLS1lbmFibGUtdGVzdHMgdG8gbWFrZQorCWNoZWNrIiBhcyBpdCBicm9rZSBkaXN0Y2hlY2sKKworCSogYnVzL01ha2VmaWxlLmFtIChpbnN0YWxsLWRhdGEtaG9vayk6IGNyZWF0ZSAvZXRjL2RidXMtMS9zeXN0ZW0uZAorCisyMDAzLTA1LTEzICBKYW1lcyBXaWxsY294ICA8andpbGxjb3hAZ25vbWUub3JnPgorCisJKiBjb25maWd1cmUuaW46CisJKiBidXMvYWN0aXZhdGlvbi5jOiAoYnVzX2FjdGl2YXRpb25fc2VydmljZV9jcmVhdGVkKSwKKwkoYnVzX2FjdGl2YXRpb25fYWN0aXZhdGVfc2VydmljZSk6CisJKiBidXMvZHJpdmVyLmM6IChidXNfZHJpdmVyX3NlbmRfc2VydmljZV9kZWxldGVkKSwKKwkoYnVzX2RyaXZlcl9zZW5kX3NlcnZpY2VfY3JlYXRlZCksIChidXNfZHJpdmVyX3NlbmRfc2VydmljZV9sb3N0KSwKKwkoYnVzX2RyaXZlcl9zZW5kX3NlcnZpY2VfYWNxdWlyZWQpLAorCShidXNfZHJpdmVyX3NlbmRfd2VsY29tZV9tZXNzYWdlKSwKKwkoYnVzX2RyaXZlcl9oYW5kbGVfbGlzdF9zZXJ2aWNlcyk6CisJKiBidXMvc2Vzc2lvbi5jb25mLmluOgorCSogZGJ1cy9kYnVzLWJ1cy5jOiAoZGJ1c19idXNfYWNxdWlyZV9zZXJ2aWNlKSwKKwkoZGJ1c19idXNfc2VydmljZV9leGlzdHMpLCAoZGJ1c19idXNfYWN0aXZhdGVfc2VydmljZSk6CisJKiBkYnVzL2RidXMtYnVzLmg6CisKKwlBZGQgc29tZSBjb252ZW5pZW5jZSBBUEkgd2hpY2ggbGV0cyB5b3UgYWN0aXZhdGUgYSBzZXJ2aWNlLCBhbmQgZGlkIGEKKwlidW5jaCBvZiBzLzAvREJVU19UWVBFX0lOVkFMSUQvIGluIGNhbGxzIHRvIGRidXNfbWVzc2FnZV9hcHBlbmRfYXJncygpCisJYW5kIGRidXNfbWVzc2FnZV9nZXRfYXJncygpCisKKzIwMDMtMDUtMTEgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLmMgKF9kYnVzX21hcnNoYWxfdmFsaWRhdGVfYXJnKTogZml4IHRvIGF2b2lkCisJY2FsbGluZyBfZGJ1c19tYXJzaGFsX3ZhbGlkYXRlX2FyZygpIGZvciBldmVyeSBieXRlIGluIGEgYnl0ZQorCWFycmF5LCBldGMuCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLWhhbmRsZXIuYzogdXNlIGF0b21pYyByZWZlcmVuY2UgY291bnRpbmcgdG8KKwlyZWR1Y2UgbnVtYmVyIG9mIGxvY2tzIHNsaWdodGx5OyB0aGUgZ2xvYmFsIGxvY2sgaW4gaGVyZSBzdWNrcworCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jCisJKF9kYnVzX2Nvbm5lY3Rpb25fdXBkYXRlX2Rpc3BhdGNoX3N0YXR1c19hbmRfdW5sb2NrKTogdmFyaWFudCBvZgorCXVwZGF0ZV9kaXNwYXRjaF9zdGF0dXMgdGhhdCBjYW4gYmUgY2FsbGVkIHdpdGggbG9jayBoZWxkOyB0aGVuIHVzZQorCWluIGEgY291cGxlIHBsYWNlcyB0byByZWR1Y2UgbG9ja2luZy91bmxvY2tpbmcKKwkoZGJ1c19jb25uZWN0aW9uX3NlbmQpOiBob2xkIHRoZSBsb2NrIG92ZXIgdGhlIHdob2xlIGZ1bmN0aW9uCisJaW5zdGVhZCBvZiBhY3F1aXJpbmcgaXQgdHdpY2UuCisKKwkqIGRidXMvZGJ1cy10aW1lb3V0LmMgKF9kYnVzX3RpbWVvdXRfbmV3KTogaGFuZGxlIE9PTQorCisJKiBidXMvY29ubmVjdGlvbi5jIChidXNfY29ubmVjdGlvbnNfc2V0dXBfY29ubmVjdGlvbik6IGZpeCBhY2Nlc3MKKwl0byBhbHJlYWR5LWZyZWVkIG1lbW9yeS4KKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYzoga2VlcCBhIGxpdHRsZSBjYWNoZSBvZiBsaW5rZWQgbGlzdAorCW5vZGVzLCB0byBhdm9pZCB1c2luZyB0aGUgZ2xvYmFsIGxpbmtlZCBsaXN0IGFsbG9jIGxvY2sgaW4gdGhlCisJbm9ybWFsIHNlbmQtbWVzc2FnZSBjYXNlLiBJbnN0ZWFkIHdlIGp1c3QgdXNlIHRoZSBjb25uZWN0aW9uIGxvY2sKKwl0aGF0IHdlIGFscmVhZHkgaGF2ZSB0byB0YWtlLgorCisJKiBkYnVzL2RidXMtbGlzdC5jIChfZGJ1c19saXN0X2ZpbmRfbGFzdCk6IG5ldyBmdW5jdGlvbgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jIChfZGJ1c19hdG9taWNfaW5jLCBfZGJ1c19hdG9taWNfZGVjKToKKwljaGFuZ2UgdG8gdXNlIGEgc3RydWN0IGZvciB0aGUgYXRvbWljIHR5cGU7IGZpeCBkb2NzLAorCXRoZXkgcmV0dXJuIHZhbHVlIGJlZm9yZSBpbmNyZW1lbnQsIG5vdCBhZnRlciBpbmNyZW1lbnQuCisKKwkqIGRidXMvZGJ1cy1zdHJpbmcuYyAoX2RidXNfc3RyaW5nX2FwcGVuZF80X2FsaWduZWQpCisJKF9kYnVzX3N0cmluZ19hcHBlbmRfOF9hbGlnbmVkKTogbmV3IGZ1bmN0aW9ucyB0byB0cnkgdG8KKwltaWNyb29wdGltaXplIHRoaXMgb3BlcmF0aW9uLgorCShyZWFsbG9jYXRlX2Zvcl9sZW5ndGgpOiBicmVhayB0aGlzIG91dCBvZiBzZXRfbGVuZ3RoKCksIHRvCisJaW1wcm92ZSBwcm9maWxlIGluZm8sIGFuZCBhbHNvIHNvIHdlIGNhbiBjb25zaWRlciBpbmxpbmluZyB0aGUKKwlzZXRfbGVuZ3RoKCkgcGFydC4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAoZGJ1c19tZXNzYWdlX25ld19lbXB0eV9oZWFkZXIpOiBpbml0IGRhdGEKKwlzdHJpbmdzIHdpdGggc29tZSBwcmVhbGxvY2F0aW9uLCBjdXRzIGRvd24gb24gb3VyIGNhbGxzIHRvIHJlYWxsb2MKKwlhIGZhaXIgYml0LiBUaG91Z2ggaWYgd2UgY2FuIGdldCB0aGUgIm1vdmUgZW50aXJlIHN0cmluZyB0byBlbXB0eQorCXN0cmluZyIgb3B0aW1pemF0aW9uIGJlbG93IHRvIGtpY2sgaW4gaGVyZSwgaXQgd291bGQgYmUgYmV0dGVyLgorCisJKiBkYnVzL2RidXMtc3RyaW5nLmMgKF9kYnVzX3N0cmluZ19tb3ZlKToganVzdCBjYWxsCisJX2RidXNfc3RyaW5nX21vdmVfbGVuCisJKF9kYnVzX3N0cmluZ19tb3ZlX2xlbik6IGFkZCBhIHNwZWNpYWwgY2FzZSBmb3IgbW92aW5nCisJYW4gZW50aXJlIHN0cmluZyBpbnRvIGFuIGVtcHR5IHN0cmluZzsgd2UgY2FuIGp1c3QKKwlzd2FwIHRoZSBzdHJpbmcgZGF0YSBpbnN0ZWFkIG9mIGRvaW5nIGFueSByZWFsbG9jcy4KKwkoX2RidXNfc3RyaW5nX2luaXRfcHJlYWxsb2NhdGVkKTogbmV3IGZ1bmN0aW9uCisKKzIwMDMtMDUtMTEgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwlXcml0ZSBhICJ0ZXN0LXByb2ZpbGUiIHRoYXQgZG9lcyBlY2hvIGNsaWVudC1zZXJ2ZXIgd2l0aCB0aHJlYWRzOworCXByb2ZpbGUgcmV2ZWFscyBsb2NrIGNvbnRlbnRpb24sIG1lbWNweS9yZWFsbG9jIG9mIGJ1ZmZlcnMsIGFuZAorCVVURi04IHZhbGlkYXRpb24gYXMgaG90IHNwb3RzLiAyMCUgb2YgbG9jayBjb250ZW50aW9uIGVsaW1pbmF0ZWQKKwl3aXRoIGRidXNfYXRvbWljX2luYy9kZWMgaW1wbGVtZW50YXRpb24gb24geDg2LiAgTXVjaCByZW1haW5pbmcKKwljb250ZW50aW9uIGlzIGdsb2JhbCBtZW1wb29sIGxvY2tzIGZvciBHTGlzdCBhbmQgREJ1c0xpc3QuCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMgKF9kYnVzX2F0b21pY19pbmMsIF9kYnVzX2F0b21pY19kZWMpOiBhZGQKKwl4ODYgaW1wbGVtZW50YXRpb24KKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYyAoc3RydWN0IERCdXNDb25uZWN0aW9uKTogdXNlCisJZGJ1c19hdG9taWNfdCBmb3IgdGhlIHJlZmVyZW5jZSBjb3VudAorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChzdHJ1Y3QgREJ1c01lc3NhZ2UpOiBkZWNsYXJlCisJZGJ1c19hdG9taWNfdCB2YWx1ZXMgYXMgdm9sYXRpbGUKKworCSogY29uZmlndXJlLmluOiBjb2RlIHRvIGRldGVjdCBhYmlsaXR5IHRvIHVzZSBhdG9taWMgaW50ZWdlcgorCW9wZXJhdGlvbnMgaW4gYXNzZW1ibHksIGZyb20gR0xpYiBwYXRjaAorCisJKiBkYnVzL2RidXMtaW50ZXJuYWxzLmMgKF9kYnVzX3ZlcmJvc2VfcmVhbCk6IGNhbGwgZ2V0cGlkIGV2ZXJ5CisJdGltZSwgdGlyZWQgb2YgaXQgYmVpbmcgd3JvbmcgaW4gdGhyZWFkcyBhbmQgZm9ya2VkIHByb2Nlc3NlcworCisJKiBnbGliL3Rlc3QtcHJvZmlsZS5jOiBhIGxpdHRsZSBwcm9ncmFtIHRvIGJvdW5jZSBtZXNzYWdlcyBiYWNrCisJYW5kIGZvcnRoIGJldHdlZW4gdGhyZWFkcyBhbmQgZWF0IENQVQorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jOiBhZGQgZGVidWcgc3BldyBtYWNyb3MgZm9yIGRlYnVnZ2luZworCXRocmVhZCBsb2NrczsgaW5jbHVkZSBjb25maWcuaCBhdCB0b3A7IGZpeCBkZWFkbG9jayBpbgorCWRidXNfY29ubmVjdGlvbl9mbHVzaCgpCisKKzIwMDMtMDUtMDggIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy1zcGF3bi5jOiBzL19leGl0L2V4aXQvIGJlY2F1c2UgaXQgd2FzIGtlZXBpbmcgZ2NvdgorCWRhdGEgZnJvbSBnZXR0aW5nIHdyaXR0ZW4sIGFuZCB0aGVyZSB3YXNuJ3QgYSBnb29kIHJlYXNvbiB0bworCXVzZSBfZXhpdCByZWFsbHkuCisKKwkqIHRlc3QvZGVjb2RlLWdjb3YuYyAobWFya19pbnNpZGVfZGJ1c19idWlsZF90ZXN0cyk6IGRvbid0IGNvdW50CisJZGJ1c192ZXJib3NlIGxpbmVzIGluIHRlc3QgY292ZXJhZ2UKKwkobWFpbik6IGFkZCBsaXN0IG9mIGZ1bmN0aW9ucyBzb3J0ZWQgYnkgIyBvZiB1bnRlc3RlZCBibG9ja3MKKwl0byB0aGUgY292ZXJhZ2UgcmVwb3J0CisKKwkqIGRidXMvZGJ1cy1tZW1wb29sLmM6IHB1dCBzb21lIHRlc3Qtb25seSBjb2RlIGluIERCVVNfQlVJTERfVEVTVFMKKworCSogZGJ1cy9kYnVzLW1hcnNoYWwuYyAoX2RidXNfbWFyc2hhbF90ZXN0KTogZXh0ZW5kIHRlc3QgY292ZXJhZ2UKKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UtaGFuZGxlci5jIChfZGJ1c19tZXNzYWdlX2hhbmRsZXJfdGVzdCk6CisJZXh0ZW5kIHRlc3QgY292ZXJhZ2UKKworCSogdGVzdC9kYXRhL2F1dGgvY2FuY2VsLmF1dGgtc2NyaXB0OiB0ZXN0IGNhbmNlbGluZyBhbgorCWF1dGhlbnRpY2F0aW9uCisKKwkqIGRidXMvTWFrZWZpbGUuYW06IHJlbW92ZSBkYnVzLXNlcnZlci1kZWJ1Zy5baGNdIGZvciBub3csIGFzIHRoZXkKKwlhcmVuJ3QgdXNlZC4gaW4gQ1ZTIGhpc3RvcnkgaWYgd2UgZW5kIHVwIG5lZWRpbmcgdGhlbS4KKworMjAwMy0wNS0wNCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UtaGFuZGxlci5jIChfZGJ1c19tZXNzYWdlX2hhbmRsZXJfdGVzdCk6IGFkZAorCXVuaXQgdGVzdAorCisJKiBkYnVzL2RidXMtbWFyc2hhbC5jIChfZGJ1c19kZW1hcnNoYWxfc3RyaW5nX2FycmF5KTogZml4IHRoaXMKKwlmdW5jdGlvbiwgd2hpY2ggYXNzdW1lZCBsZW5ndGggd2FzIGluICMgb2Ygc3RyaW5ncywgbm90IGJ5dGVzCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKF9kYnVzX21lc3NhZ2VfdGVzdCk6IGFkZCB0ZXN0cyBmb3Igc29tZQorCW1pc3NpbmcgY292ZXJhZ2UKKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYworCShfZGJ1c19jb25uZWN0aW9uX3F1ZXVlX3JlY2VpdmVkX21lc3NhZ2UpOiBkaXNhYmxlIGZ1bmN0aW9uIGZvcgorCW5vdywgd2UgYXJlIG9ubHkgdXNpbmcgaXQgaW4gdGVzdCBtb2RlCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKF9kYnVzX21lc3NhZ2VfbG9hZGVyX3F1ZXVlX21lc3NhZ2VzKToKKwlyZW1vdmUgYSBtaXN0YWtlbiBGSVhNRQorCisyMDAzLTA1LTA0ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jIChkYnVzX2Nvbm5lY3Rpb25fcHJlYWxsb2NhdGVfc2VuZCk6CisJdW5sb2NrIG11dGV4IG9uIHN1Y2Nlc3NmdWwgcmV0dXJuLCBwYXRjaCBmcm9tIEFuZGVycyBHdXN0YWZzc29uCisKKzIwMDMtMDUtMDQgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMtZ2xpYi0xLnBjLmluIChSZXF1aXJlcyk6IGZpeCBkZXBlbmRlbmNpZXMsIGZyb20KKwlBbmRlcnMgR3VzdGFmc3NvbgorCisyMDAzLTA1LTA0ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiB0b29scy9kYnVzLWxhdW5jaC5jOiBpbXBsZW1lbnQKKworCSogYnVzL21haW4uYyAobWFpbiksIGJ1cy9idXMuYyAoYnVzX2NvbnRleHRfbmV3KToKKwlpbXBsZW1lbnQgLS1wcmludC1waWQgYW5kIC0tZm9yaworCisyMDAzLTA1LTAzICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLWFkZHJlc3MuYyAoZGJ1c19wYXJzZV9hZGRyZXNzKTogZml4IGJ1ZyB3aGVuIGEga2V5IGluCisJdGhlIGFkZHJlc3MgaGFkIG5vIHZhbHVlLCBhbmQgYWRkIHRvIHRlc3Qgc3VpdGUuIEZpeCBhbmQKKwlyZWdyZXNzaW9uIHRlc3QgZnJvbSBNaWxvc2xhdiBUcm1hYworCisyMDAzLTA1LTAzICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtd2F0Y2guYyAoZGJ1c193YXRjaF9oYW5kbGUpOiB3YXJuIGFuZCByZXR1cm4gaWYgYQorCXdhdGNoIGlzIGludmFsaWQgd2hlbiBoYW5kbGVkCisKKwkqIHRvb2xzL01ha2VmaWxlLmFtLCB0b29scy9kYnVzLWxhdW5jaC5jLCB0b29scy9kYnVzLWxhdW5jaC4xOiBhZGQKKwlkYnVzLWxhdW5jaCB1dGlsaXR5IHRvIGxhdW5jaCB0aGUgYnVzIGZyb20gYSBzaGVsbCBzY3JpcHQuICBEaWRuJ3QKKwlhY3R1YWxseSBpbXBsZW1lbnQgZGJ1cy1sYXVuY2ggeWV0LCBpdCdzIGp1c3QgYSBwbGFjZWhvbGRlciBzdGlsbC4KKworMjAwMy0wNS0wMyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogYnVzL01ha2VmaWxlLmFtLCBidXMvZGJ1cy1kYWVtb24tMS4xLmluOiBtYW4gcGFnZSBmb3IgdGhlCisJZGFlbW9uOyBhbHNvIGRvY3VtZW50cyBkYWVtb24gY29uZmlnIGZpbGUsIHNvIHJlcGxhY2VzCisJZG9jL2NvbmZpZy1maWxlLnR4dC4gQ29ycmVjdGVkIHNvbWUgc3R1ZmYgZnJvbSBjb25maWctZmlsZS50eHQgaW4KKwl0aGUgcHJvY2VzcyBvZiBtb3ZpbmcgaXQuCisKKzIwMDMtMDUtMDMgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIHRvb2xzL01ha2VmaWxlLmFtLCB0b29scy9kYnVzLXNlbmQuMSwgdG9vbHMvZGJ1cy1tb25pdG9yLjE6CisJYWRkIHNvbWUgbWFuIHBhZ2VzCisKKzIwMDMtMDUtMDMgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMgKGZpbGxfdXNlcl9pbmZvKTogVGVzdCBhZ2FpbnN0CisJREJVU19VSURfVU5TRVQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdG8gZG8gYSB1aWQgbG9va3VwIG9yIG5vdC4KKworCSogTWFrZWZpbGUuYW06IFVwZGF0ZSB0byB1c2UgbmV3IC5wYyB2ZXJzaW9uaW5nIHNjaGVtZS4KKworMjAwMy0wNS0wMiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGJ1cy9zeXN0ZW0uY29uZi5pbjogYWxsb3cgc2VuZC9yZWNlaXZlIHRvL2Zyb20gbWVzc2FnZSBidXMKKwlzZXJ2aWNlCisKKzIwMDMtMDQtMzAgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBjb25maWd1cmUuaW46IHByaW50IGEgbm90ZSB3aGVuIGJ1aWxkaW5nIHdpdGggdW5pdCB0ZXN0cyBhbmQKKwl3aXRob3V0IGFzc2VydGlvbnMKKworMjAwMy0wNC0zMCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIE1ha2VmaWxlLmFtOiBhZGQgYSBjaGVjay1sb2NhbCB0aGF0IGNvbXBsYWlucyBpZiB5b3UgZGlkbid0CisJY29uZmlndXJlIHdpdGggLS1lbmFibGUtdGVzdHMKKworMjAwMy0wNC0yOSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGdsaWIvZGJ1cy1nbWFpbi5jOiBkb2NzIGNsZWFudXBzCisKKwkqIGRidXMvZGJ1cy10eXBlcy5oOiBhZGQgZG9jcyBvbiBpbnQ2NCB0eXBlcworCisJKiBkYnVzL2RidXMtbWVtb3J5LmM6IGZpeCBkb2NzIHRvIGF2b2lkIHB1dHRpbmcgcHJpdmF0ZSBBUEkgaW4KKwlwdWJsaWMgQVBJIGRvY3Mgc2VjdGlvbgorCisyMDAzLTA0LTI5ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy0xLnBjLmluLCBkYnVzLWdsaWItMS5wYy5pbjogcmVuYW1lIHRoZXNlIGZyb20KKwlkYnVzLTEuMC5wYy5pbiwgZGJ1cy1nbGliLTEuMC5wYy5pbi4gQXMgdGhlc2UgY2hhbmdlIHdpdGggdGhlCisJcGFyYWxsZWwgaW5zdGFsbCBBUEkgdmVyc2lvbiwgbm90IHdpdGggdGhlIEQtQlVTIHBhY2thZ2UgdmVyc2lvbi4KKworCSogSEFDS0lORzogbW92ZSBzb21lIG9mIFJFQURNRSBvdmVyIGhlcmUKKworCSogUkVBRE1FOiB1cGRhdGVzLCBhbmQgZG9jdW1lbnQgQVBJL0FCSSBwb2xpY3kKKworCSogY29uZmlndXJlLmluOiByZWluZGVudGF0aW9uCisKKzIwMDMtMDQtMjkgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMuaDogYWRkICJ5b3UgaGF2ZSB0byBkZWZpbmUgREJVU19BUElfU1VCSkVDVF9UT19DSEFOR0UKKwl0byB1c2UgdGhpcyBsaWJyYXJ5IiB0byBiZSBzdXJlIHBlb3BsZSBoYXZlIHRoZSByaWdodAorCWV4cGVjdGF0aW9ucy4KKworMjAwMy0wNC0yOCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogYWRkIC0tZW5hYmxlLWRvY3Mgd2hpY2ggYnkgZGVmYXVsdCBpcyBhdXRvIHllcyBpZgorCWRveHlnZW4gYW5kIGRiMmh0bWwgZm91bmQsIG5vIG90aGVyd2lzZTsgYnV0IGNhbiBiZSBmb3JjZWQgb24vb2ZmCisKKwkqIGRvYy9NYWtlZmlsZS5hbTogY29uZGl0aW9uYWxpemUgd2hldGhlciB0byBidWlsZCBkb2NzIG9uCisJLS1lbmFibGUtZG9jcworCisyMDAzLTA0LTI4ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogY29uZmlndXJlLmluOiAwLjEwCisKKwkqIE5FV1M6IHVwZGF0ZQorCisJKiBidXMvc3lzdGVtLmNvbmYuaW46IGFkZCA8aW5jbHVkZWRpcj5zeXN0ZW0uZDwvaW5jbHVkZWRpcj4KKworCSogZGJ1cy9kYnVzLXVzZXJkYi5jIChfZGJ1c191c2VyX2RhdGFiYXNlX2xvb2t1cCk6IGZpeCBidWcgd2hlbgorCXVzZXJuYW1lIHdhcyBwcm92aWRlZCBidXQgbm90IHVpZAorCisJKiBidXMvY29uZmlnLXBhcnNlci5jIChzdHJ1Y3QgQnVzQ29uZmlnUGFyc2VyKToga2VlcCB0cmFjayBvZgorCXdoZXRoZXIgdGhlIHBhcnNlciBpcyB0b3BsZXZlbCBvciB3YXMgaW5jbHVkZWQ7IGNoYW5nZSBzb21lCisJb2YgdGhlIGVycm9yIGhhbmRsaW5nIGlmIGl0J3MgaW5jbHVkZWQuCisKKzIwMDMtMDQtMjcgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwlVbmJyZWFrIG15IGNvZGUuLi4KKworCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC5jIChfZGJ1c190cmFuc3BvcnRfZ2V0X2Rpc3BhdGNoX3N0YXR1cyk6CisJcmVwb3J0IGNvcnJlY3Qgc3RhdHVzIGlmIHdlIGZpbmlzaCBwcm9jZXNzaW5nIGF1dGhlbnRpY2F0aW9uCisJaW5zaWRlIHRoaXMgZnVuY3Rpb24uCisKKwkqIGJ1cy9hY3RpdmF0aW9uLmMgKHRyeV9zZW5kX2FjdGl2YXRpb25fZmFpbHVyZSk6IHVzZQorCWJ1c190cmFuc2FjdGlvbl9zZW5kX2Vycm9yX3JlcGx5CisKKwkqIGJ1cy9jb25uZWN0aW9uLmMgKGJ1c19jb25uZWN0aW9uX2dldF9ncm91cHMpOiByZXR1cm4gYW4gZXJyb3IKKwlleHBsYWluaW5nIHRoZSBwcm9ibGVtCisKKwkqIGJ1cy9idXMuYyAoYnVzX2NvbnRleHRfY2hlY2tfc2VjdXJpdHlfcG9saWN5KTogaW1wbGVtZW50CisJcmVzdHJpY3Rpb24gaGVyZSB0aGF0IGluYWN0aXZlIGNvbm5lY3Rpb25zIGNhbiBvbmx5IHNlbmQgdGhlCisJaGVsbG8gbWVzc2FnZS4gQWxzbywgYWxsb3cgYnVzIGRyaXZlciB0byBzZW5kIGFueXRoaW5nIHRvCisJYW55IHJlY2lwaWVudC4KKworCSogYnVzL2Nvbm5lY3Rpb24uYyAoYnVzX2Nvbm5lY3Rpb25fY29tcGxldGUpOiBjcmVhdGUgdGhlCisJQnVzQ2xpZW50UG9saWN5IGhlcmUgaW5zdGVhZCBvZiBvbi1kZW1hbmQuCisJKGJ1c19jb25uZWN0aW9uX2dldF9wb2xpY3kpOiBkb24ndCByZXR1cm4gYW4gZXJyb3IKKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAoZGJ1c19tZXNzYWdlX25ld19lcnJvcl9yZXBseSk6IGFsbG93IE5VTEwKKwlzZW5kZXIgZmllbGQgaW4gbWVzc2FnZSBiZWluZyByZXBsaWVkIHRvCisKKwkqIGJ1cy9idXMuYyAoYnVzX2NvbnRleHRfY2hlY2tfc2VjdXJpdHlfcG9saWN5KTogZml4IHNpbGx5IHR5cG8KKwljYXVzaW5nIGl0IHRvIHJldHVybiBGQUxTRSBhbHdheXMKKworCSogYnVzL3BvbGljeS5jIChidXNfY2xpZW50X3BvbGljeV9jaGVja19jYW5fc2VuZCk6IGZpeCBidWcgd2hlcmUKKwl3ZSBjaGVja2VkIHNlbmRlciByYXRoZXIgdGhhbiBkZXN0aW5hdGlvbgorCisyMDAzLTA0LTI1ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworICAgICAgICB0ZXN0IHN1aXRlIGlzIHNsaWdodGx5IGhvc2VkIGF0IHRoZSBtb21lbnQsIHdpbGwgZml4IHNvb24KKworCSogYnVzL2Nvbm5lY3Rpb24uYyAoYnVzX2Nvbm5lY3Rpb25zX2V4cGlyZV9pbmNvbXBsZXRlKTogZml4IHRvCisJcHJvcGVybHkgZGlzYWJsZSB0aGUgdGltZW91dCB3aGVuIHJlcXVpcmVkCisJKGJ1c19jb25uZWN0aW9uX3NldF9uYW1lKTogY2hlY2sgd2hldGhlciB3ZSBjYW4gcmVtb3ZlIGluY29tcGxldGUKKwljb25uZWN0aW9ucyB0aW1lb3V0IGFmdGVyIHdlIGNvbXBsZXRlIGVhY2ggY29ubmVjdGlvbi4KKworCSogZGJ1cy9kYnVzLW1haW5sb29wLmMgKGNoZWNrX3RpbWVvdXQpOiBmaXggdGhpcyB1cCBhIGJpdCwKKwlwcm9iYWJseSBzdGlsbCBicm9rZW4uCisKKwkqIGJ1cy9zZXJ2aWNlcy5jIChidXNfcmVnaXN0cnlfYWNxdWlyZV9zZXJ2aWNlKTogaW1wbGVtZW50IG1heAorCW51bWJlciBvZiBzZXJ2aWNlcyBvd25lZCwgYW5kIGhvbm9yIGFsbG93L2RlbnkgcnVsZXMgb24gd2hpY2gKKwlzZXJ2aWNlcyBhIGNvbm5lY3Rpb24gY2FuIG93bi4KKworCSogYnVzL2Nvbm5lY3Rpb24uYyAoYnVzX2Nvbm5lY3Rpb25fZ2V0X3BvbGljeSk6IHJlcG9ydCBlcnJvcnMgaGVyZQorCisJKiBidXMvYWN0aXZhdGlvbi5jOiBpbXBsZW1lbnQgbGltaXQgb24gbnVtYmVyIG9mIHBlbmRpbmcKKwlhY3RpdmF0aW9ucworCisyMDAzLTA0LTI1ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC5jIChfZGJ1c190cmFuc3BvcnRfZ2V0X3VuaXhfdXNlcik6IGZpeCBidWcKKwl3aGVyZSB3ZSB1c2VkID49IDAgaW5zdGVhZCBvZiAhPSBEQlVTX1VJRF9VTlNFVC4KKworMjAwMy0wNC0yNSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGdsaWIvZGJ1cy1nbWFpbi5jIChyZW1vdmVfd2F0Y2gpOiBmaXggZm9yIGEgY3Jhc2ggd2hlbiB3YXRjaGVzCisJd2VyZSB0b2dnbGVkIHdpdGhvdXQgYWRkL3JlbW92ZSwgZml4IGZyb20gQW5kZXJzIEd1c3RhZnNzb24KKworMjAwMy0wNC0yNCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIHRlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMvYmFzaWMuY29uZjogYWRkIDxsaW1pdD4gdGFncyB0bworCXRoaXMgdGVzdAorCisJKiBidXMvY29uZmlnLXBhcnNlci5oLCBidXMvY29uZmlnLXBhcnNlci5jLCBidXMvYnVzLmM6IEltcGxlbWVudAorCTxsaW1pdD4gdGFnIGluIGNvbmZpZ3VyYXRpb24gZmlsZS4KKworMjAwMy0wNC0yNCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGJ1cy9kaXNwYXRjaC5jOiBzb21laG93IG1pc3NlZCBzb21lIG5hbWVfaXMKKworCSogZGJ1cy9kYnVzLXRpbWVvdXQuYyAoX2RidXNfdGltZW91dF9zZXRfZW5hYmxlZCkKKwkoX2RidXNfdGltZW91dF9zZXRfaW50ZXJ2YWwpOiBuZXcKKworCSogYnVzL2Nvbm5lY3Rpb24uYyAoYnVzX2Nvbm5lY3Rpb25zX3NldHVwX2Nvbm5lY3Rpb24pOiByZWNvcmQgdGltZQorCXdoZW4gZWFjaCBjb25uZWN0aW9uIGlzIGZpcnN0IHNldCB1cCwgYW5kIGV4cGlyZSB0aGVtIGFmdGVyIHRoZQorCWF1dGggdGltZW91dCBwYXNzZXMuCisKKzIwMDMtMDQtMjQgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChkYnVzX21lc3NhZ2VfbmFtZV9pcyk6IHJlbmFtZQorCShkYnVzX21lc3NhZ2Vfc2VydmljZV9pcyk6IHJlbmFtZQorCShkYnVzX21lc3NhZ2Vfc2VuZGVyX2lzKTogcmVuYW1lCisJKGRidXNfbWVzc2FnZV9nZXRfc2VydmljZSk6IHJlbmFtZQorCisyMDAzLTA0LTI0ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogY29uZmlndXJlLmluOiBhZGQgLS1lbmFibGUtY2hlY2tzCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKGRidXNfbWVzc2FnZV9uZXcpOiByZXZlcnNlIG5hbWUvc2VydmljZSBhcmd1bWVudHMKKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYyAoZGJ1c19jb25uZWN0aW9uX3ByZWFsbG9jYXRlX3NlbmQpOiBmaXgKKwl0byB1c2UgdGhyZWFkIGxvY2tzLgorCShfZGJ1c19jb25uZWN0aW9uX2hhbmRsZXJfZGVzdHJveWVkX2xvY2tlZCk6IG1vdmUgc29tZSBwcml2YXRlCisJZnVuY3Rpb25zIGludG8gcHJvcGVyIGRvY3MgZ3JvdXAKKworCSogZGJ1cy9kYnVzLWludGVybmFscy5oOiBhZGQgX2RidXNfcmV0dXJuX2lmX2ZhaWwsCisJX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsCisKKwlUaHJvdWdob3V0OiB1c2UgZGJ1c19yZXR1cm5faWZfZmFpbAorCisyMDAzLTA0LTIzICBKYW1lcyBXaWxsY294ICA8andpbGxjb3hAZ25vbWUub3JnPgorCisJKiBnbGliL2RidXMtZ2xpYi5oOgorCSogZ2xpYi9kYnVzLWdtYWluLmM6IChhZGRfdGltZW91dCksICh3YWtldXBfbWFpbiksIChjcmVhdGVfc291cmNlKSwKKwkoZGJ1c19jb25uZWN0aW9uX3NldHVwX3dpdGhfZ19tYWluKSwKKwkoZGJ1c19zZXJ2ZXJfc2V0dXBfd2l0aF9nX21haW4pOgorCSogZ2xpYi90ZXN0LWRidXMtZ2xpYi5jOiAobWFpbik6CisJKiBnbGliL3Rlc3QtdGhyZWFkLWNsaWVudC5jOiAobWFpbik6CisJKiBnbGliL3Rlc3QtdGhyZWFkLXNlcnZlci5jOiAobmV3X2Nvbm5lY3Rpb25fY2FsbGJhY2spLCAobWFpbik6CisJKiB0b29scy9kYnVzLW1vbml0b3IuYzogKG1haW4pOgorCisJQWRkZWQgYSBHTWFpbkNvbnRleHQgYXJndW1lbnQgdG8gZGJ1c19jb25uZWN0aW9uX3NldHVwX3dpdGhfZ19tYWluKCkKKwlhbmQgZGJ1c19zZXJ2ZXJfc2V0dXBfd2l0aF9nX21haW4oKS4KKworMjAwMy0wNC0yMCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZG9jL2RidXMtc3BlY2lmaWNhdGlvbi5zZ21sOiBkb2N1bWVudCB0aGUgcmVzdHJpY3Rpb25zIG9uCisJbWVzc2FnZSBhbmQgc2VydmljZSBuYW1lcworCisyMDAzLTA0LTIyICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYywgZGJ1cy9kYnVzLW1hcnNoYWwuYzogYWRkIDY0LWJpdCBpbnRlZ2VyCisJc3VwcG9ydCwgYW5kIGRvIHNvbWUgY29kZSBjbGVhbnVwcyB0byBzaGFyZSBtb3JlIGNvZGUgYW5kCisJc3BlZWQgdXAgYXJyYXkgbWFyc2hhbC9kZW1hcnNoYWwuCisKKwkqIGRidXMtMS4wLnBjLmluIChDZmxhZ3MpOiBwdXQgbGliZGlyIGluY2x1ZGUgZmlsZSBpbiBjZmxhZ3MKKworCSogY29uZmlndXJlLmluOiBnZW5lcmF0ZSBkYnVzLWFyY2gtZGVwcy5oCisKKwkqIGRidXMvZGJ1cy1wcm90b2NvbC5oIChEQlVTX1RZUEVfSU5UNjQsIERCVVNfVFlQRV9VSU5UNjQpOiBhZGQKKwk2NC1iaXQgdHlwZWNvZGVzCisKKzIwMDMtMDQtMjIgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiB0ZXN0L2RhdGEvdmFsaWQtbWVzc2FnZXMvb3Bwb3NpdGUtZW5kaWFuLm1lc3NhZ2U6IGZpeCB0ZXN0CisJdG8gdXNlIHByb3BlciB0eXBlIGZvciBycGx5IGZpZWxkCisKKyAgICAgICAgKiB0ZXN0L2RhdGEvaW52YWxpZC1tZXNzYWdlczogYWRkIHRlc3RzIGZvciBiZWxvdyB2YWxpZGF0aW9uCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKGRlY29kZV9oZWFkZXJfZGF0YSk6IHZhbGlkYXRlIGZpZWxkIHR5cGVzLAorCWFuZCB2YWxpZGF0ZSB0aGF0IG5hbWVkIGZpZWxkcyBhcmUgdmFsaWQgbmFtZXMKKwkoZGVjb2RlX25hbWVfZmllbGQpOiBjb25zaWRlciBtZXNzYWdlcyBpbiB0aGUKKwlvcmcuZnJlZWRlc2t0b3AuTG9jYWwuIG5hbWVzcGFjZSB0byBiZSBpbnZhbGlkLgorCisJKiBkYnVzL2RidXMtc3RyaW5nLmMgKF9kYnVzX3N0cmluZ192YWxpZGF0ZV9uYW1lKTogbmV3CisKKzIwMDMtMDQtMTkgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGJ1cy9kcml2ZXIuYyAoYnVzX2RyaXZlcl9oYW5kbGVfaGVsbG8pOiBjaGVjayBsaW1pdHMgYW5kCisJcmV0dXJuIGFuIGVycm9yIGlmIHRoZXkgYXJlIGV4Y2VlZGVkLgorCisJKiBidXMvY29ubmVjdGlvbi5jOiBtYWludGFpbiBzZXBhcmF0ZSBsaXN0cyBvZiBhY3RpdmUgYW5kIGluYWN0aXZlCisJY29ubmVjdGlvbnMsIGFuZCBhIGNvdW50IG9mIGVhY2guIE1haW50YWluIGNvdW50IG9mIGNvbXBsZXRlZAorCWNvbm5lY3Rpb25zIHBlciB1c2VyLiBJbXBsZW1lbnQgY29kZSB0byBjaGVjayBjb25uZWN0aW9uIGxpbWl0cy4KKworCSogZGJ1cy9kYnVzLWxpc3QuYyAoX2RidXNfbGlzdF91bmxpbmspOiBleHBvcnQKKworCSogYnVzL2J1cy5jIChidXNfY29udGV4dF9jaGVja19zZWN1cml0eV9wb2xpY3kpOiBlbmZvcmNlIGEgbWF4aW11bQorCW51bWJlciBvZiBieXRlcyBpbiB0aGUgbWVzc2FnZSBxdWV1ZSBmb3IgYSBjb25uZWN0aW9uCisKKzIwMDMtMDQtMTggIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy1hdXRoLmMgKHJlY29yZF9tZWNoYW5pc21zKTogbWVtbGVhayBmaXhlcworCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jIChfZGJ1c19zdHJpbmdfc2F2ZV90b19maWxlKTogZml4IHNvbWUKKwltZW1sZWFrcworCisJKiBkYnVzL2RidXMta2V5cmluZy5jIChhZGRfbmV3X2tleSk6IGZpeCBhIG1lbWxlYWssIGFuZAorCW9uIHJlYWxsb2MgYmUgc3VyZSB0byB1cGRhdGUgdGhlIHBvaW50ZXIgaW4gdGhlIGtleXJpbmcKKworCSogZGJ1cy9kYnVzLXN0cmluZy5jIChfZGJ1c19zdHJpbmdfemVybyk6IGNvbXBlbnNhdGUgZm9yIGFsaWduCisJb2Zmc2V0IHRvIGF2b2lkIHdyaXRpbmcgdG8gdW5hbGxvY2F0ZWQgbWVtb3J5CisKKwkqIGRidXMvZGJ1cy1hdXRoLmMgKHByb2Nlc3NfcmVqZWN0ZWQpOiByZXR1cm4gRkFMU0UgaWYgd2UgZmFpbCB0bworCXRyeSB0aGUgbmV4dCBtZWNoYW5pc20sIHNvIHdlIHByb3Blcmx5IGhhbmRsZSBPT00KKworCSogZGJ1cy9kYnVzLWtleXJpbmcuYyAoX2RidXNfa2V5cmluZ19uZXdfaG9tZWRpcik6IGZpeCBkb3VibGUtZnJlZQorCW9uIE9PTS4KKwkoX2RidXNfa2V5cmluZ19uZXcpOiBmaXggT09NIGJ1ZworCShfZGJ1c19rZXlyaW5nX25ld19ob21lZGlyKTogYWx3YXlzIHNldCBlcnJvcjsgaW1wb3NlIGEgbWF4aW11bQorCW51bWJlciBvZiBrZXlzIHdlJ2xsIGxvYWQgZnJvbSB0aGUgZmlsZSwgbW9zdGx5IHRvIHNwZWVkIHVwIHRoZQorCXRlc3Qgc3VpdGUgYW5kIG1ha2UgaXRzIE9PTSBjaGVja3MgbW9yZSB1c2VmdWwsIGJ1dCBhbHNvIGZvcgorCWdlbmVyYWwgc2FuaXR5LgorCisJKiBkYnVzL2RidXMtYXV0aC5jIChwcm9jZXNzX2Vycm9yX3NlcnZlcik6IHJlamVjdCBhdXRoZW50aWNhdGlvbgorCWlmIHdlIGdldCBhbiBlcnJvciBmcm9tIHRoZSBjbGllbnQKKwkocHJvY2Vzc19jYW5jZWwpOiBvbiBjYW5jZWwsIHNlbmQgUkVKRUNURUQsIHBlciB0aGUgc3BlYworCShwcm9jZXNzX2Vycm9yX2NsaWVudCk6IHNlbmQgQ0FOQ0VMIGlmIHdlIGdldCBhbiBlcnJvciBmcm9tIHRoZQorCXNlcnZlci4KKworMjAwMy0wNC0xOCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLW1haW5sb29wLmMgKF9kYnVzX2xvb3BfaXRlcmF0ZSk6IGZpeCBVTVIgaW4gdmVyYm9zZQorCWRlYnVnIHNwZXcKKworCSogZGJ1cy9kYnVzLWF1dGguYyAoaGFuZGxlX2NsaWVudF9kYXRhX2Nvb2tpZV9zaGExX21lY2gpOiBmaXggT09NCisJaGFuZGxpbmcgcHJvYmxlbQorCisJKiBkYnVzL2RidXMta2V5cmluZy5jIChfZGJ1c19rZXlyaW5nX25ld19ob21lZGlyKTogb25seSB3aGluZQorCWFib3V0IERCVVNfVEVTVF9IT01FRElSIG9uY2UKKworCSogYnVzL01ha2VmaWxlLmFtIChURVNUU19FTlZJUk9OTUVOVCk6IHB1dCBEQlVTX1RFU1RfSE9NRURJUiBpbgorCXRoZSBlbnZpcm9ubWVudAorCisJKiBidXMvZGlzcGF0Y2guYyAoYnVzX2Rpc3BhdGNoX3NoYTFfdGVzdCk6IGFjdHVhbGx5IGxvYWQgc2hhMQorCWNvbmZpZyBmaWxlIHNvIHdlIHRlc3QgdGhlIHJpZ2h0IHRoaW5nCisKKwlUaHJvdWdob3V0OiBhc3NvcnRlZCBkb2NzIGltcHJvdmVtZW50cworCisyMDAzLTA0LTE4ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBnbGliL2RidXMtZ21haW4uYzogYWRhcHQgdG8gd2F0Y2ggY2hhbmdlcworCisJKiBidXMvYnVzLmMsIGJ1cy9hY3RpdmF0aW9uLmMsIGV0Yy46IGFkanVzdCB0byB3YXRjaCBjaGFuZ2VzCisKKwkqIGRidXMvZGJ1cy1zZXJ2ZXIuaDogcmVtb3ZlIGRidXNfc2VydmVyX2hhbmRsZV93YXRjaAorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5oOiByZW1vdmUgZGJ1c19jb25uZWN0aW9uX2hhbmRsZV93YXRjaAorCisJKiBkYnVzL2RidXMtd2F0Y2guYyAoZGJ1c193YXRjaF9oYW5kbGUpOiBjaGFuZ2UgREJ1c1dhdGNoIHRvIHdvcmsKKwlsaWtlIERCdXNUaW1lb3V0LCBzbyB3ZSBkb24ndCBuZWVkIGRidXNfY29ubmVjdGlvbl9oYW5kbGVfd2F0Y2gKKwlldGMuCisKKzIwMDMtMDQtMTcgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtdXNlcmRiLmMsIGRidXMvZGJ1cy1zeXNkZXBzLmM6IHJlZG8gYWxsIHRoZSBwYXNzd2QKKwlkYXRhYmFzZSB1c2FnZSBzbyBpdCBhbGwgZ29lcyB2aWEgdGhlIERCdXNVc2VyRGF0YWJhc2UgY2FjaGUuCisKKzIwMDMtMDQtMTcgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtbWFpbmxvb3AuYyAoX2RidXNfbG9vcF9pdGVyYXRlKTogZml4IGxvZ2ljIHNvIHRoYXQgaWYKKwl0aGVyZSB3YXMgYW4gT09NIHdhdGNoIHdlIHNraXBwZWQsIHdlIGFsd2F5cyByZXR1cm4gVFJVRSBzbyB3ZQorCWl0ZXJhdGUgYWdhaW4gdG8gaGF2ZSBhIGxvb2sgYXQgaXQgYWdhaW4uIEZpeGVzIHRlc3Qgc3VpdGUgaGFuZy4KKwlDb2RlIHJlYXJyYW5nZW1lbnQgYWxzbyBsZXRzIHVzIGxvc2Ugc29tZSBtZW1zZXQgYW5kIG9ubHkgaXRlcmF0ZQorCW92ZXIgY2FsbGJhY2tzIG9uY2UuCisKKwkqIGJ1cy9kcml2ZXIuYyAoYnVzX2RyaXZlcl9oYW5kbGVfbWVzc2FnZSk6IHNlbnNlIG9mIHRlc3QgZm9yCisJcmVwbHkgd2FzIGJhY2t3YXJkCisKKzIwMDMtMDQtMTYgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRvYy9kYnVzLXNwZWNpZmljYXRpb24uc2dtbDogbWFrZSBzcGVjIHNheSBzZXJpYWxzIGFyZSB1bnNpZ25lZAorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5oOiBjaGFuZ2UgbWVzc2FnZSBzZXJpYWxzIHRvIHVuc2lnbmVkCisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmM6IGFkYXB0IHRvIG1lc3NhZ2Ugc2VyaWFscyBiZWluZyB1bnNpZ25lZAorCisyMDAzLTA0LTE1ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBidXMvYnVzLmM6IGNyZWF0ZSBhbmQga2VlcCBhcm91bmQgYSBzaGFyZWQgREJ1c1VzZXJEYXRhYmFzZQorCW9iamVjdC4KKworCSogYnVzL2Nvbm5lY3Rpb24uYyAoYnVzX2Nvbm5lY3Rpb25fZ2V0X2dyb3Vwcyk6IGRvbid0IGNhY2hlCisJZ3JvdXBzIGZvciB1c2VyIGluIHRoZSBjb25uZWN0aW9uIG9iamVjdCwgc2luY2UgdXNlciBkYXRhYmFzZQorCW9iamVjdCBub3cgZG9lcyB0aGF0LgorCisyMDAzLTA0LTE2ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAoX2RidXNfbWVzc2FnZV9hZGRfc2l6ZV9jb3VudGVyKToga2VlcCBhCisJbGlzdCBvZiBzaXplIGNvdW50ZXJzCisJKF9kYnVzX21lc3NhZ2VfbG9hZGVyX3B1dGJhY2tfbWVzc2FnZV9saW5rKTogcHV0IGJhY2sgYSBwb3BwZWQgbGluaworCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jCisJKGRidXNfY29ubmVjdGlvbl9zZXRfbWF4X2xpdmVfbWVzc2FnZXNfc2l6ZSk6IHJlbmFtZQorCW1heF9yZWNlaXZlZF9zaXplCisJKGRidXNfY29ubmVjdGlvbl9nZXRfb3V0Z29pbmdfc2l6ZSk6IGdldCBzaXplIG9mIG91dGdvaW5nCisJcXVldWUKKwkoX2RidXNfY29ubmVjdGlvbl9zZXRfY29ubmVjdGlvbl9jb3VudGVyKTogcmVtb3ZlIHRoaXMgY3J1ZnQKKworMjAwMy0wNC0xNCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy11c2VyZGIuYzogdXNlciBkYXRhYmFzZSBhYnN0cmFjdGlvbiwgbW9zdGx5IHRvIGdldAorCWNhY2hpbmcsIGJ1dCBhdCBzb21lIHBvaW50IHdlIG1pZ2h0IHdhbnQgdG8gYmUgYWJsZSB0byB1c2UgYQorCWRpZmZlcmVudCBkYXRhYmFzZS4KKworCSogYnVzL2Rpc3BhdGNoLmMgKGJ1c19kaXNwYXRjaF9zaGExX3Rlc3QpOiBhZGQgYSB0ZXN0IHRoYXQgdXNlcworCVNIQTEgY29uZiBmaWxlIHRvIHRlc3QgdGhlIHNoYTEgYXV0aCBtZWNoYW5pc20sIHNpbmNlIHRoZSByZWd1bGFyCisJdGVzdCBhbHdheXMgdXNlcyBFWFRFUk5BTCB3aGVuIGF2YWlsYWJsZS4KKworCSogY29uZmlndXJlLmluLAorCXRlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMvZGVidWctYWxsb3ctYWxsLXNoYTEuY29uZi5pbjoKKwlhZGQgY29uZiBmaWxlIHRoYXQgcmVxdWlyZXMgdXNlIG9mIHNoYTEgYXV0aAorCisyMDAzLTA0LTEzICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisgICAgICAgICogdG9vbHMvZGJ1cy1zZW5kLmMsIHRvb2xzL2RidXMtbW9uaXRvci5jOiB0d28gdXRpbGl0eSBwcm9ncmFtcworCWZyb20gUGhpbGlwIEJsdW5kZWxsIHRvIHNlbmQgbWVzc2FnZXMgYW5kIG1vbml0b3IgdGhlbS4KKworMjAwMy0wNC0xMyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLW1haW5sb29wLmM6IGZpeCBzb21lIHJlZW50cmFuY3kgaXNzdWVzIGJ5IHJlZmNvdW50aW5nCisJY2FsbGJhY2tzCisKKwkqIHRlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMvZGVidWctYWxsb3ctYWxsLmNvbmYuaW46IGFsbG93IGFsbAorCXVzZXJzCisKKwkqIGRidXMvZGJ1cy10cmFuc3BvcnQuYyAoX2RidXNfdHJhbnNwb3J0X2dldF9kaXNwYXRjaF9zdGF0dXMpOgorCWZpeCB0byBvbmx5IHJlY292ZXIgdW51c2VkIGJ5dGVzIGlmIHdlJ3JlIGFscmVhZHkgYXV0aGVudGljYXRlZAorCShfZGJ1c190cmFuc3BvcnRfZ2V0X2lzX2F1dGhlbnRpY2F0ZWQpOiBmaXggdG8gc3RpbGwgbWFyayB1cworCWF1dGhlbnRpY2F0ZWQgaWYgdGhlcmUgYXJlIHVudXNlZCBieXRlcy4KKworCSogYnVzL2Rpc3BhdGNoLmM6IGltcGxlbWVudCBzZWN1cml0eSBwb2xpY3kgY2hlY2tpbmcKKworCSogYnVzL2Nvbm5lY3Rpb24uYyAoYnVzX3RyYW5zYWN0aW9uX3NlbmRfZnJvbV9kcml2ZXIpOiBuZXcKKworCSogYnVzL2J1cy5jIChidXNfY29udGV4dF9jaGVja19zZWN1cml0eV9wb2xpY3kpOiBuZXcKKworCSogYnVzL2Rpc3BhdGNoLmMgKHNlbmRfc2VydmljZV9ub25leGlzdGVudF9lcnJvcik6IGRlbGV0ZSB0aGlzLAorCW5vdyB3ZSBqdXN0IHNldCB0aGUgREJ1c0Vycm9yIGFuZCBpdCBnZXRzIGNvbnZlcnRlZCB0byBhbiBlcnJvcgorCXJlcGx5LgorCisJKiBidXMvY29ubmVjdGlvbi5jIChhbGxvd191c2VyX2Z1bmN0aW9uKTogZW5hYmxlIGNvZGUgdXNpbmcgYWN0dWFsCisJZGF0YSBmcm9tIHRoZSBjb25maWcgZmlsZQorCisJKiBidXMvcG9saWN5LmMgKGxpc3RfYWxsb3dzX3VzZXIpOiBoYW5kbGUgd2lsZGNhcmQgcnVsZXMgZm9yCisJdXNlci9ncm91cCBjb25uZWN0aW9uIHBlcm1zCisKKzIwMDMtMDQtMTMgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGJ1cy9jb25maWctcGFyc2VyLmM6IExvYWQgdXAgdGhlIEJ1c1BvbGljeSBhbmQgQnVzUG9saWN5UnVsZXMKKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYyAoX2RidXNfZ2V0X3VzZXJfaWQpOiBuZXcgZnVuY3Rpb24KKworCSogYnVzL3BvbGljeS5jIChidXNfcG9saWN5X2FwcGVuZF9tYW5kYXRvcnlfcnVsZSkKKwkoYnVzX3BvbGljeV9hcHBlbmRfZGVmYXVsdF9ydWxlLCBidXNfcG9saWN5X2FwcGVuZF91c2VyX3J1bGUpCisJKGJ1c19wb2xpY3lfYXBwZW5kX2dyb3VwX3J1bGUpOiBuZXcgZnVuY3Rpb25zCisKKzIwMDMtMDQtMTIgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGJ1cy9jb25maWctcGFyc2VyLmMgKGJ1c19jb25maWdfcGFyc2VyX25ldyk6IGZpeCBhIG1lbWxlYWsKKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYzogY2hhbmdlIERCdXNDcmVkZW50aWFscyB0byB1c2UgbG9uZ3MgZm9yCisJdGhlIHBpZC9naWQvdWlkLCBqdXN0IGZvciBwYXJhbm9pYS4KKworCSogdGVzdC9icmVhay1sb2FkZXIuYyAocmFuZG9tbHlfZG9fbl90aGluZ3MpOiBmaW5kIGEgYnl0ZQorCWNvbnRhaW5pbmcgYSB0eXBlIGNvZGUsIGFuZCByYW5kb21seSBjaGFuZ2UgaXQgdG8gYSBkaWZmZXJlbnQKKwl0eXBlIGNvZGUuCisKKzIwMDMtMDQtMTIgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGJ1cy9wb2xpY3kuaDogY2hhbmdlIEJ1c1BvbGljeSB0byBiZSB0aGUgdGhpbmcgZnJvbSB0aGUgY29uZmlnCisJZmlsZSwgYW5kIHJlbmFtZSBvbGQgQnVzUG9saWN5IHRvIEJ1c0NsaWVudFBvbGljeQorCisJKiBidXMvYnVzLmMsIGJ1cy9jb25uZWN0aW9uLmMsIGJ1cy9jb25maWctcGFyc2VyLmM6IGNoYW5nZSB0bworCW1hdGNoIGNoYW5nZSBpbiBob3cgcG9saWN5IHdvcmtzCisKKwkqIGRidXMvZGJ1cy1pbnRlcm5hbHMuaDogbWFyayBhc3NlcnRfbm90X3JlYWNoZWQgYXMKKwlfX2F0dHJpYnV0ZSgobm9yZXR1cm4pKV9fCisKKzIwMDMtMDQtMTEgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnNnbWw6IGZpeCBhIHNwb3Qgd2l0aCB0aGUgd3JvbmcgbmFtZSBmb3IKKwl0aGUgYnJvYWRjYXN0IHNlcnZpY2UuIFVzZSBib29sZWFuIHJldHVybiBmb3IgU2VydmljZUV4aXN0cy4KKworMjAwMy0wNC0xMSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogYWRkIGFub3RoZXIgZGlyZWN0b3J5IHRvIGxvb2sgZm9yIHF0IGluLgorCisyMDAzLTA0LTExICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogQVVUSE9SUzogYWRkIENvbGluIFdhbHRlcnMKKworMjAwMy0wNC0xMSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIE5FV1M6IHVwZGF0ZQorCisJKiBjb25maWd1cmUuaW46IDAuOQorCisyMDAzLTA0LTExICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogYnVzL21lc3NhZ2VidXMuaW46IHJlbW92ZSBwaWQgZmlsZSB3aGVuIHN0b3BwaW5nIHRoZQorCW1lc3NhZ2UgYnVzLCBzaW5jZSB0aGUgYnVzIHdvbid0IGhhdmUgcHJpdmlsZWdlcyB0byByZW1vdmUgaXQKKwlpdHNlbGYuCisKKzIwMDMtMDQtMTEgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBidXMvYnVzLmMgKGJ1c19jb250ZXh0X25ldyk6IG1vdmUgY3JlZGVudGlhbHMgY2hhbmdlIGFmdGVyCisJY3JlYXRpbmcgcGlkZmlsZQorCisyMDAzLTA0LTExICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiB0ZXN0L2RlY29kZS1nY292LmM6IGFkZCAiYmVsb3cgYXZlcmFnZSBmdW5jdGlvbnMiIHRvIHRoZQorCWNvdmVyYWdlIHJlcG9ydCwgYW5kIGNoYW5nZSBob3cgc29tZSBvZiB0aGUgY29kZSB3b3Jrcy4KKworCSogYnVzL3Rlc3QtbWFpbi5jOiBicmFja2V0IHNvbWUgc3R1ZmYgaW4gREJVU19CVUlMRF9URVNUUyBzbyBpdCdzCisJbm90IGluIHRoZSBjb3ZlcmFnZSBzdGF0cy4KKworCSogdGVzdC90ZXN0LXNlcnZpY2UuYyAobWFpbik6IHVzZSBfZGJ1c192ZXJib3NlIG5vdCBmcHJpbnRmIGluIGEKKwljb3VwbGUgcGxhY2VzIHNvIHJ1bm5pbmcgdGhlIHRlc3Qgc3VpdGUgZG9lc24ndCByZXN1bHQgaW4gbWVnYXNwYW0uCisKKzIwMDMtMDQtMTEgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGJ1cy9kaXNwYXRjaC5jIChjaGVja19leGlzdGVudF9zZXJ2aWNlX2FjdGl2YXRpb24pOiBhY2NlcHQgYSBubworCW1lbW9yeSBlcnJvciBpbiBhIHBsYWNlIHdlIGRpZG4ndCBiZWZvcmUKKworCSogYnVzL3Rlc3QuYyAoYnVzX3Rlc3RfcnVuX2V2ZXJ5dGhpbmcpOiByZW1vdmUgaGFja3kgImRvIGl0IHR3aWNlCisJaW4gY2FzZSB0aGUgZmlyc3Qgb25lIGZhaWxlZCwiIHNpbmNlIHRoZSB0ZXN0IHN1aXRlIGlzIGxlc3MKKwlicm9rZW4gbm93LgorCisyMDAzLTA0LTEwICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBidXMvZGlzcGF0Y2guYyAoY2hlY2tfc2VnZmF1bHRfc2VydmljZV9hY3RpdmF0aW9uKTogYWRkIHRlc3QKKwlmb3IgbGF1bmNoaW5nIGFuIGV4ZWN1dGFibGUgdGhhdCBqdXN0IGNyYXNoZXMuCisKKwkqIHRlc3QvdGVzdC1zZWdmYXVsdC5jIChtYWluKTogdHJ5IHNldHRpbmcgY29yZWR1bXBzaXplIHRvIDAgc28gd2UKKwlkb24ndCBsZWF2ZSBhIG1pbGxpb24gY29yZXMuIFdlJ2xsIHNlZSBob3cgcG9ydGFibGUgdGhpcyBpcy4KKworMjAwMy0wNC0xMCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLXNwYXduLmMgKF9kYnVzX3NwYXduX2FzeW5jX3dpdGhfYmFieXNpdHRlcik6IG1vdmUgYWxsCisJdGhlIHBvc3NpYmxlIHBhcmVudCBmYWlsdXJlcyBiZWZvcmUgd2UgZm9yaywgc28gdGhhdCB3ZSBkb24ndAorCWZhaWwgdG8gY3JlYXRlIGEgYmFieXNpdHRlciBhZnRlciBjcmVhdGluZyB0aGUgY2hpbGQuCisKKwkqIGJ1cy9hY3RpdmF0aW9uLmMgKGJ1c19hY3RpdmF0aW9uX2FjdGl2YXRlX3NlcnZpY2UpOiBraWxsIGNoaWxkCisJaWYgd2UgZG9uJ3Qgc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlIHRoZSBhY3RpdmF0aW9uLgorCisyMDAzLTA0LTEwICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYyAoZGJ1c19jb25uZWN0aW9uX2ZsdXNoKTogZG9uJ3Qgc3BpbiBvbgorCXRoZSBjb25uZWN0aW9uIGlmIGl0J3MgZGlzY29ubmVjdGVkCisKKwkqIGJ1cy9hY3RpdmF0aW9uLmMgKGJ1c19hY3RpdmF0aW9uX3NlcnZpY2VfY3JlYXRlZCk6IHVzZSBuZXcKKwl0cmFuc2FjdGlvbiBmZWF0dXJlcyB0byByb2xsIGJhY2sgcmVtb3ZhbCBvZiBwZW5kaW5nIGFjdGl2YXRpb24gaWYKKwl3ZSBkb24ndCBzdWNjZXNzZnVsbHkgY3JlYXRlIHRoZSBzZXJ2aWNlIGFmdGVyIGFsbC4gRG9uJ3QgcmVtb3ZlCisJcGVuZGluZyBhY3RpdmF0aW9uIGlmIHRoZSBmdW5jdGlvbiBmYWlscy4KKworCSogZGJ1cy9kYnVzLWxpc3QuYyAoX2RidXNfbGlzdF9pbnNlcnRfYmVmb3JlX2xpbmspCisJKF9kYnVzX2xpc3RfaW5zZXJ0X2FmdGVyX2xpbmspOiBuZXcgY29kZSB0byBmYWNpbGl0YXRlCisJc2VydmljZXMuYyBmaXhlcworCisJKiBkYnVzL2RidXMtaGFzaC5jIChfZGJ1c19oYXNoX3RhYmxlX2luc2VydF9zdHJpbmdfcHJlYWxsb2NhdGVkKToKKwluZXcgZnVuY3Rpb25hbGl0eSwgc28gd2UgY2FuIHByZWFsbG9jYXRlIHRoZSBhYmlsaXR5IHRvIGluc2VydAorCWludG8gYSBoYXNoIHRhYmxlLgorCisJKiBidXMvY29ubmVjdGlvbi5jIChidXNfdHJhbnNhY3Rpb25fYWRkX2NhbmNlbF9ob29rKTogbmV3IGZ1bmN0aW9uCisJYWxsb3dpbmcgdXMgdG8gcHV0IGN1c3RvbSBob29rcyBpbiBhIHRyYW5zYWN0aW9uIHRvIGJlIHVzZWQgZm9yCisJY2FuY2VsbGluZyBzYWlkIHRyYW5zYWN0aW9uCisKKwkqIGRvYy9kYnVzLXNwZWNpZmljYXRpb24uc2dtbDogYWRkIHNvbWUgZGlzY3Vzc2lvbiBvZiBzZWNvbmRhcnkKKwlzZXJ2aWNlIG93bmVycywgYW5kIGRpc2FsbG93IHplcm8tbGVuZ3RoIHNlcnZpY2UgbmFtZXMKKworCSogYnVzL3NlcnZpY2VzLmMgKGJ1c19yZWdpc3RyeV9hY3F1aXJlX3NlcnZpY2UpOiBuZXcgZnVuY3Rpb24sCisJc3BsaXRzIG91dCBwYXJ0IG9mIGJ1c19kcml2ZXJfaGFuZGxlX2FjcXVpcmVfc2VydmljZSgpIGFuZCBmaXhlcworCWEgYnVnIHdoZXJlIHdlIGRpZG4ndCByZW1vdmUgdGhlIHNlcnZpY2UgZG9pbmcgdGhlIGFjcXVpcmluZworCWZyb20gdGhlIHNlY29uZGFyeSBxdWV1ZSBpZiB3ZSBmYWlsZWQgdG8gcmVtb3ZlIHRoZSBjdXJyZW50IG93bmVyCisJZnJvbSB0aGUgZnJvbnQgb2YgdGhlIHF1ZXVlLgorCisyMDAzLTA0LTEwICBBbGV4YW5kZXIgTGFyc3NvbiAgPGFsZXhsQHJlZGhhdC5jb20+CisKKwkqIGRvYy9kYnVzLXNwZWNpZmljYXRpb24uc2dtbDoKKwlzL29yZy5mcmVlZGVza3RvcC5Ccm9hZGNhc3Qvb3JnLmZyZWVkZXNrdG9wLkRCdXMuQnJvYWRjYXN0LworCisyMDAzLTA0LTEwICBBbGV4YW5kZXIgTGFyc3NvbiAgPGFsZXhsQHJlZGhhdC5jb20+CisKKwkqIGJ1cy8uY3ZzaWdub3JlOgorCSogZ2xpYi8uY3ZzaWdub3JlOgorCSogdGVzdC8uY3ZzaWdub3JlOgorCUFkZGVkIGZpbGVzIHRvIGN2c2lnbm9yZQorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5oOgorCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYzogKGRidXNfbWVzc2FnZV9pdGVyX2dldF9uYW1lZCk6CisJTWFrZSBnZXRfbmFtZWQoKSB0YWtlIHR3byBvdXQgYXJndW1lbnQgYW5kIHJldHVybiBhIGJvb2xlYW4uCisJKGRidXNfbWVzc2FnZV9pdGVyX2dldF9hcmdzX3ZhbGlzdCk6CisJVXBkYXRlIHVzYWdlIG9mIGdldF9uYW1lZCgpLgorCShkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfYnl0ZSk6CisJRml4IHR5cG8KKwkoZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX25hbWVkKQorCUZpeCB0eXBvCisJKG1lc3NhZ2VfaXRlcl90ZXN0KSwgKGNoZWNrX21lc3NhZ2VfaGFuZGxpbmdfdHlwZSksIChfZGJ1c19tZXNzYWdlX3Rlc3QpOgorCU1vcmUgdGVzdHMuCisKKzIwMDMtMDQtMTAgIEFsZXhhbmRlciBMYXJzc29uICA8YWxleGxAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLW1hcnNoYWwuW2NoXToKKwlBZGQgYXJyYXlfdHlwZV9wb3MgYXJndW1lbnQgdG8gX2RidXNfbWFyc2hhbF92YWxpZGF0ZV9hcmcuCisJTGV0IHlvdSBwYXNzIGEgTlVMTCBlbmRfcG9zIHRvIF9kYnVzX21hcnNoYWxfdmFsaWRhdGVfdHlwZS4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuW2NoXToKKwlNdWx0aS1kaW1lbnNpb25hbCBhcnJheXMgaGF2ZSBmdWxsIHR5cGUgc3BlY2lmaWNhdGlvbiBpbiB0aGUKKwlvdXRlcm1vc3QgYXJyYXkuIEl0ZXIgY29kZSByZS1hcnJhbmdlZCB0byBoYW5kbGUgdGhpcy4KKwlBZGRlZCBzb21lIG1vcmUgaXRlciB0ZXN0cy4KKworCSogZG9jL2RidXMtc3BlY2lmaWNhdGlvbi5zZ21sOgorCUFkZCBtZSB0byBhdXRob3JzLgorCVJlbW92ZSBvbGQgRklYTUUuCisJVXBkYXRlIG5ldyBhcnJheSBlbmNvZGluZyBkZXNjcmlwdGlvbi4KKwlDb3JyZWN0IERCVVNfU0VSVklDRV9GTEFHU19SRVBMQUNFX0VYSVNUSU5HIGRlc2NyaXB0aW9uLgorCisJKiB0ZXN0L2RhdGEvaW52YWxpZC1tZXNzYWdlcy9hcnJheS13aXRoLW1peGVkLXR5cGVzLm1lc3NhZ2U6CisJKiB0ZXN0L2RhdGEvdmFsaWQtbWVzc2FnZXMvYXJyYXktb2YtYXJyYXktb2YtdWludDMyLm1lc3NhZ2U6CisJQ2hhbmdlIHRvIHRoZSBuZXcgYXJyYXkgZm9ybWF0LgorCisJKiB0ZXN0L2RhdGEvaW52YWxpZC1tZXNzYWdlcy90b28tc2hvcnQtZGljdC5tZXNzYWdlOgorCUZpeCBidWcgaW4gdGVzdC4KKworCSogdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL3JlY3Vyc2l2ZS10eXBlcy5tZXNzYWdlOgorCUZpeCB1cCBhbmQgZXh0ZW5kIHRlc3QuCisKKzIwMDMtMDQtMTAgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGJ1cy9kaXNwYXRjaC5jOiBsb3RzIG9mIGZpeGVzCisKKwkqIGRidXMvZGJ1cy1tYWlubG9vcC5jIChfZGJ1c19sb29wX2Rpc3BhdGNoKTogZXhwb3J0CisJKF9kYnVzX2xvb3BfaXRlcmF0ZSk6IHJlbW92ZSBvbGQgInF1aXQgaWYgbm8gY2FsbGJhY2tzIiBjb2RlLAorCXRoYXQgd2FzIGNyYWNrLCBicm9rZSB0aGUgdGVzdCBzZXJ2aWNlLgorCisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LmMgKF9kYnVzX3RyYW5zcG9ydF9vcGVuKTogZml4IGVycm9yCisJaGFuZGxpbmcgdG8gYXZvaWQgcGlsaW5nIHVwIGVycm9ycyBpZiB3ZSBnZXQgYSBmYWlsdXJlIG9uIHRoZQorCWZpcnN0IGFkZHJlc3MuCisKKwkqIGRidXMvZGJ1cy1pbnRlcm5hbHMuYyAoX2RidXNfcmVhbF9hc3NlcnRfbm90X3JlYWNoZWQpOiBpbmNsdWRlCisJcGlkIGluIGFzc2VydGlvbiBmYWlsdXJlcy4KKworCSogZGJ1cy9kYnVzLW1haW5sb29wLmMgKF9kYnVzX2xvb3BfaXRlcmF0ZSk6IHVzZSBzdGF0aWMgYXJyYXlzIHVwCisJdG8gc29tZSBmaXhlZCBzaXplIG9mIGZpbGUgZGVzY3JpcHRvciBhcnJheS4gRG9uJ3QgcmV0dXJuIFRSVUUKKwlhbnl0aW1lIGEgdGltZW91dCBleGlzdHMsIHRoYXQgbGVkIHRvIGxvdHMgb2YgYnVzeSBsb29wIHNpbGxpbmVzcworCWluIHRoZSB0ZXN0cy4KKworMjAwMy0wNC0wOSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1tYWlubG9vcC5jIChjaGVja190aW1lb3V0KTogZml4IHRpbWVvdXRzLCBJIHRob3VnaHQKKwlJJ2QgY2hlY2tlZCB0aGlzIGluIGVhcmxpZXIgYnV0IGhhZG4ndC4KKworMjAwMy0wNC0wOSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGJ1cy9kaXNwYXRjaC5jIChidXNfZGlzcGF0Y2hfdGVzdCk6IGdldCBhIGJpdCBmdXJ0aGVyIHRocm91Z2gKKwl0aGUgYWN0aXZhdGlvbiB0ZXN0IChtYW4gdGhpcyBpcyBnZXR0aW5nIG9sZCEpCisKKzIwMDMtMDQtMDkgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiB0ZXN0L3Rlc3QtdXRpbHMuYzogdXNlIGRpc3BhdGNoIHN0YXR1cyBmdW5jdGlvbiB0byBmaXggdGhpcyB1cAorCisJKiBidXMvY29ubmVjdGlvbi5jIChjb25uZWN0aW9uX3dhdGNoX2NhbGxiYWNrKTogZG9uJ3QgZGlzcGF0Y2gKKwlmcm9tIGhlcmUKKwkoY29ubmVjdGlvbl90aW1lb3V0X2NhbGxiYWNrKTogZG9uJ3QgZGlzcGF0Y2ggZnJvbSBoZXJlCisJKGJ1c19jb25uZWN0aW9uc19zZXR1cF9jb25uZWN0aW9uKTogc2V0IHRoZSBkaXNwYXRjaCBzdGF0dXMgZnVuY3Rpb24KKwkoYnVzX2Nvbm5lY3Rpb25fZGlzY29ubmVjdGVkKTogdW5zZXQgaXQKKworCSogZGJ1cy9kYnVzLW1haW5sb29wLmMgKF9kYnVzX2xvb3BfcXVldWVfZGlzcGF0Y2gpOiBuZXcgZnVuY3Rpb24KKwl1c2VkIHRvIGFkZCBhIGNvbm5lY3Rpb24gdG8gYmUgZGlzcGF0Y2hlZAorCShfZGJ1c19sb29wX2l0ZXJhdGUpOiBkbyB0aGUgZGlzcGF0Y2hpbmcgYXQgdGhlIGVuZCBvZiBlYWNoCisJaXRlcmF0aW9uCisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMKKwkoZGJ1c19jb25uZWN0aW9uX3NldF9kaXNwYXRjaF9zdGF0dXNfZnVuY3Rpb24pOiBuZXcgZnVuY3Rpb24KKwlhbGxvd2luZyB1cyB0byBmaXggdXAgbWFpbiBsb29wIHVzYWdlCisJKF9kYnVzX2Nvbm5lY3Rpb25fbGFzdF91bnJlZik6IGZyZWUgYWxsIHRoZSB2YXJpb3VzIGZ1bmN0aW9uCisJdXNlciBkYXRhCisJKGRidXNfY29ubmVjdGlvbl9kaXNwYXRjaCk6IGNhbGwgdGhlIERpc3BhdGNoU3RhdHVzRnVuY3Rpb24KKwl3aGVuZXZlciB0aGlzIGZ1bmN0aW9uIHJldHVybnMKKwkoZGJ1c19jb25uZWN0aW9uX2hhbmRsZV93YXRjaCk6IGNhbGwgRGlzcGF0Y2hTdGF0dXNGdW5jdGlvbgorCShkYnVzX2Nvbm5lY3Rpb25fc2VuZF93aXRoX3JlcGx5X2FuZF9ibG9jayk6IGNhbGwgRGlzcGF0Y2hTdGF0dXNGdW5jdGlvbgorCShyZXBseV9oYW5kbGVyX3RpbWVvdXQpOiBjYWxsIERpc3BhdGNoU3RhdHVzRnVuY3Rpb24KKwkoZGJ1c19jb25uZWN0aW9uX2ZsdXNoKTogY2FsbCBEaXNwYXRjaFN0YXR1c0Z1bmN0aW9uCisKKzIwMDMtMDQtMDkgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtYnVzLmMgKGRidXNfYnVzX3JlZ2lzdGVyKTogZml4IHVwIGVycm9yIGhhbmRsaW5nIGFuZAorCWEgbWVtb3J5IGxlYWsKKworCSogYnVzL2Rpc3BhdGNoLmMgKGNoZWNrX3NlcnZpY2VfYWN0aXZhdGVkKTogZml4IGJ1ZyBpbiB0ZXN0CisKKwkqIGRidXMvZGJ1cy1tYWlubG9vcC5jIChjaGVja190aW1lb3V0KTogZml4IHRoaXMgdXAKKworCSogZGJ1cy9kYnVzLWludGVybmFscy5jIChfZGJ1c192ZXJib3NlX3JlYWwpOiBpbmNsdWRlIFBJRCBpbgorCXZlcmJvc2Ugb3V0cHV0IHNvIHdlIGNhbiBzb3J0IG91dCBvdXRwdXQgZnJvbSBkaWZmZXJlbnQgcHJvY2Vzc2VzLAorCWUuZy4gaW4gdGhlIGFjdGl2YXRpb24gY2FzZS4KKworMjAwMy0wNC0wOCAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAZ251Lm9yZz4KKworIAkqIGJ1cy9idXMuYyAoc3RydWN0IEJ1c0NvbnRleHQpIFtwaWRmaWxlXTogTmV3IG1lbWJlciwgdG8gc3RvcmUKKyAJdGhlIHBpZCBmaWxlLgorIAkoYnVzX2NvbnRleHRfbmV3KTogU2V0IGl0LgorIAkoYnVzX2NvbnRleHRfdW5yZWYpOiBVc2UgaXQgdG8gZGVsZXRlIHRoZSBwaWQgZmlsZS4KKworMjAwMy0wNC0wOCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIHRlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL2FycmF5LXdpdGgtbWl4ZWQtdHlwZXMubWVzc2FnZToKKwlyZWdyZXNzaW9uIHRlc3QgdGhhdCBmYWlscyBmb3IgdGhlIG1vbWVudAorCisJKiBkYnVzL2RidXMtdGVzdC5jIChkYnVzX2ludGVybmFsX2RvX25vdF91c2VfcnVuX3Rlc3RzKTogcmVvcmRlcgorCXRlc3RzIGZvciBjb252ZW5pZW5jZQorCisJKiBkYnVzL2RidXMtbWFyc2hhbC5jIChfZGJ1c19tYXJzaGFsX3ZhbGlkYXRlX2FyZyk6IGRvbid0IGFsbG93CisJYXJyYXkgb2YgbmlsLCBpdCBicm9rZSB0aGluZ3MuCisKKwkqIHRlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL2FycmF5LW9mLW5pbC5tZXNzYWdlOiByZWdyZXNzaW9uIHRlc3QKKworCSogdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL2FycmF5LW9mLWFycmF5LW9mLXVpbnQzMi5tZXNzYWdlOgorCWhhcHBlbmVkIHRvIHdyaXRlIHRoaXMgc28gYWRkZWQgaXQgdG8gc3VpdGUKKworMjAwMy0wNC0wOCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGJ1cy9kcml2ZXIuYyAoYnVzX2RyaXZlcl9oYW5kbGVfYWNxdWlyZV9zZXJ2aWNlKTogaW5pdAorCXJldHZhbC9yZXBseSBiZWZvcmUgY2hlY2tpbmcgbmFtZQorCisJKiBkYnVzL2RidXMtbWFyc2hhbC5jIChfZGJ1c19tYXJzaGFsX3ZhbGlkYXRlX2FyZyk6IGFkZCBhCisJcmVjdXJzaW9uIGRlcHRoIGFyZ3VtZW50CisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmggKHN0cnVjdCBEQnVzTWVzc2FnZUl0ZXIpOiBwdXQgc29tZSBwYWRkaW5nCisJaW4gdGhlIHB1YmxpYyBzdHJ1Y3QgZm9yIGZ1dHVyZSBleHRlbnNpb24KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UtYnVpbGRlci5jIChfZGJ1c19tZXNzYWdlX2RhdGFfbG9hZCk6IGZpeAorCXR5cG8KKworCSogZGJ1cy9kYnVzLW1hcnNoYWwuYyAoX2RidXNfbWFyc2hhbF92YWxpZGF0ZV9hcmcpOiBmaXggYSB2ZXJib3NlCisJbWVzc2FnZQorCisJKiBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnNnbWw6IGZpeCB0eXBvCisKKzIwMDMtMDQtMDggIEFsZXhhbmRlciBMYXJzc29uICA8YWxleGxAcmVkaGF0LmNvbT4KKworCUltcGxlbWVudGVkIHJlY3Vyc2l2ZSB0eXBlcywgbmFtZWQgdHlwZXMgYW5kIG5ldy1zdHlsZSBpdGVycworCisJKiBidXMvZHJpdmVyLmM6CisJKiBnbGliL3Rlc3QtdGhyZWFkLWNsaWVudC5jOiAodGhyZWFkX2Z1bmMpOgorCSogZ2xpYi90ZXN0LXRocmVhZC1zZXJ2ZXIuYzogKGhhbmRsZV90ZXN0X21lc3NhZ2UpOgorCSogdGVzdC90ZXN0LXNlcnZpY2UuYzogKGhhbmRsZV9lY2hvKToKKwlVcGRhdGUgdG8gbmV3IGFwaQorCisJKiBkYnVzL01ha2VmaWxlLmFtOgorCSogZGJ1cy9kYnVzLWRpY3QuYzoKKwkqIGRidXMvZGJ1cy1kaWN0Lmg6CisJKiBkYnVzL2RidXMuaAorCVJlbW92ZSBEQnVzRGljdAorCisJKiBkYnVzL2RidXMtaW50ZXJuYWxzLmM6IChfZGJ1c190eXBlX3RvX3N0cmluZyk6CisJVXBkYXRlIGZvciBuZXcgdHlwZXMuCisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLltjaF06CisJSW1wbGVtZW50IHJlY3Vyc2l2ZSB0eXBlcyBhbmQgdGhlIG5ldyBtYXJzaGFsbGluZyBmb3JtYXQuCisJUmVtb3ZlIGhhcmRjb2RlZCBkaWN0IG1hcnNoYWxsaW5nLgorCU1hcnNoYWwgbmFtZWQgdHlwZXMuCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLWJ1aWxkZXIuYzoKKwlBZGQgQllURV9BUlJBWS4KKwlSZW1vdmUgcmVmZXJlbmNlcyB0byBvbGQgdHlwZXMKKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuW2NoXToKKwlOZXcgbm9uLXJlZmNvdW50ZWQgaXRlciBBUEkgdGhhdCBzdXBwb3J0cyByZWN1cnNpdmUgaXRlcnMuCisJVXNlIGl0ZXJzIGZvciBhcHBlbmRpbmcsIGluY2x1ZGluZyBzdXBwb3J0IGZvciByZWN1cnNpdmUKKwlpdGVycy4KKwlBZGQgYnl0ZSBhbmQgbmFtZWQgdHlwZSBzdXBwb3J0LgorCVVwZGF0ZSBldmVyeXRoaW5nIHRvIG5ldyBtYXJzaGFsbGluZyBmb3JtYXRzLgorCUFkZCB0ZXN0cyBmb3IgbmV3IEFQSS4KKworCSogZGJ1cy9kYnVzLXByb3RvY29sLmg6CisJUmVtb3ZlIG9sZCBhcnJheSB0eXBlcy4KKwlBZGQgdHlwZXM6IEJZVEUsIEFSUkFZLCBESUNULCBOQU1FRAorCisJKiBkYnVzL2RidXMtc3RyaW5nLmM6CisJKiBkYnVzL2RidXMtc3lzZGVwcy5jOgorCU1ha2UgcGFyc2VfZG91YmxlIGxvY2FsZSBzYWZlLgorCisJKiBkYnVzL2RidXMtdGVzdC1tYWluLmM6CisJQ2FsbCBzZXRsb2NhbGUuCisKKwkqIGRidXMvZGJ1cy10ZXN0LmM6CisJS2lsbCBkaWN0IHRlc3QKKworCSogZG9jL2RidXMtc3BlY2lmaWNhdGlvbi5zZ21sOgorCVVwZGF0ZSBzcGVjCisKKwkqIHRlc3QvZGF0YS9pbmNvbXBsZXRlLW1lc3NhZ2VzL21pc3NpbmctYm9keS5tZXNzYWdlOgorCSogdGVzdC9kYXRhL2ludmFsaWQtbWVzc2FnZXMvYmFkLWJvb2xlYW4ubWVzc2FnZToKKwkqIHRlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL2JhZC1ib29sZWFuLWFycmF5Lm1lc3NhZ2U6CisJKiB0ZXN0L2RhdGEvaW52YWxpZC1tZXNzYWdlcy9ib29sZWFuLWFycmF5LWxlbmd0aC10b28tbG9uZy5tZXNzYWdlLXJhdzoKKwkqIHRlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL2Jvb2xlYW4taGFzLW5vLXZhbHVlLm1lc3NhZ2UtcmF3OgorCSogdGVzdC9kYXRhL2ludmFsaWQtbWVzc2FnZXMvdG9vLXNob3J0LWRpY3QubWVzc2FnZToKKwkqIHRlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy9kaWN0LXNpbXBsZS5tZXNzYWdlOgorCSogdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL2RpY3QubWVzc2FnZToKKwkqIHRlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy9lbXB0aW5lc3MubWVzc2FnZToKKwkqIHRlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy9sb3RzLW9mLWFyZ3VtZW50cy5tZXNzYWdlOgorCSogdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL25vLXBhZGRpbmcubWVzc2FnZToKKwkqIHRlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy9yZWN1cnNpdmUtdHlwZXMubWVzc2FnZToKKwlBZGQgbWlzc2luZyBOQU1FIGZpZWxkcworCUZpeCB1cCBkaWN0cyAmIGFycmF5cworCisJKiB0ZXN0L2RhdGEvaW52YWxpZC1tZXNzYWdlcy9kaWN0LXdpdGgtbmlsLXZhbHVlLm1lc3NhZ2U6CisJUmVtb3ZlZCwgdGhpcyBpcyBub3QgaW52YWxpZCBhbnltb3JlLgorCisJKiB0ZXN0L2RhdGEvdmFsaWQtbWVzc2FnZXMvcmVjdXJzaXZlLXR5cGVzLm1lc3NhZ2U6CisJQWRkIG5ldyB0ZXN0IGZvciBkZWVwbHkgcmVjdXJzaXZlIHR5cGVzLgorCisyMDAzLTA0LTA3ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBidXMvZHJpdmVyLmMgKGJ1c19kcml2ZXJfaGFuZGxlX2FjcXVpcmVfc2VydmljZSk6IHJldHVybiBhbgorCWVycm9yIGlmIHlvdSB0cnkgdG8gYWNxdWlyZSBhIHNlcnZpY2UgdGhhdCBzdGFydHMgd2l0aCAnOicKKworMjAwMy0wNC0wNyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRvYy9kYnVzLXNwZWNpZmljYXRpb24uc2dtbDogcmVxdWlyZSB0aGF0IGJhc2Ugc2VydmljZSBuYW1lcworCXN0YXJ0IHdpdGggJzonIGFuZCB0aGF0IHRoZSBiYXNlIHNlcnZpY2UgaXMgY3JlYXRlZC9kZWxldGVkCisJYXMgZmlyc3QgYW5kIGxhc3QgdGhpbmdzIGEgY29ubmVjdGlvbiBkb2VzIG9uIHRoZSBidXMKKworCSogYnVzL2Rpc3BhdGNoLmMgKGNoZWNrX2V4aXN0ZW50X3NlcnZpY2VfYWN0aXZhdGlvbik6IGxvdHMgbW9yZQorCXdvcmsgb24gdGhlIGFjdGl2YXRpb24gdGVzdDsgaXQgZG9lc24ndCBmdWxseSBwYXNzIHlldC4uLgorCisJKiB0ZXN0L3Rlc3Qtc2VydmljZS5jIChtYWluKTogZml4IHNvIHdlIGRvbid0IG1lbWxlYWsgdGhlCisJY29ubmVjdGlvbiB0byB0aGUgbWVzc2FnZSBidXMKKwkoZmlsdGVyX2Z1bmMpOiBhY2NlcHQgYSBtZXNzYWdlIGFza2luZyB1cyB0byBleGl0CisKKzIwMDMtMDQtMDYgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIHF0L01ha2VmaWxlLmFtIChkYnVzaW5jbHVkZV9IRUFERVJTKTogaW5zdGFsbCBkYnVzLXF0LmgsCisJZnJvbSBDb2xpbiBXYWx0ZXJzCisKKwkqIGNvbmZpZ3VyZS5pbjogZml4ZXMgdG8gUXQgZGV0ZWN0aW9uIGZyb20gQ29saW4gV2FsdGVycworCisJKiBkb2MvTWFrZWZpbGUuYW06IE9ubHkgcmVtb3ZlIGdlbmVyYXRlZCBkb2Nib29rIGRpcnMgaWYgdGhleQorCWV4aXN0LCBmcm9tIENvbGluIFdhbHRlcnMKKworCSogZGJ1cy9kYnVzLWJ1cy5jOiBjaGFuZ2UgaG93IHdlIHNldCB3ZWxsLWtub3duIGNvbm5lY3Rpb25zIHRvCisJTlVMTCwgc28gdGhhdCBpdCB3b3JrcyBpZiBhIHNpbmdsZSBjb25uZWN0aW9uIGlzIHN0b3JlZCBpbgorCXR3byB3ZWxsLWtub3duIGFycmF5IHNsb3RzLgorCisJKiB0ZXN0L01ha2VmaWxlLmFtOiByZW1vdmUgYSBsb3Qgb2Ygc3R1ZmYgdGhhdCBpc24ndCBpbW1lZGlhdGVseQorCXVzZWZ1bCwgaXQncyBpbiBDVlMgaGlzdG9yeSBpZiB3ZSB3YW50IGl0LgorCisJKiB0ZXN0L3Rlc3Qtc2VydmljZS5jOiB1c2UgZGJ1cy1tYWlubG9vcCBpbnN0ZWFkIG9mIHRoYXQKKwl3YXRjaC5baGNdIGNyYWNrCisKKzIwMDMtMDQtMDYgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvTWFrZWZpbGUuYW06IHNwbGl0IGxpc3RzIG9mIHNvdXJjZXMgaW50byBzdHVmZiB0aGF0IGdvZXMgaW4KKwl0aGUgbGlicmFyeSwgdXRpbCBmdW5jdGlvbnMgdGhhdCBnbyBpbiB0aGUgbGliIGFuZCBhcmUgYWxzbyB1c2VkCisJZWxzZXdoZXJlLCBhbmQgdXRpbCBmdW5jdGlvbnMgdGhhdCBhcmUgdXNlZCBpbiB0ZXN0cy9kYWVtb24gYnV0CisJZG9uJ3QgZ28gaW4gdGhlIGxpYi4KKworCSogZGJ1cy9kYnVzLW1haW5sb29wLmgsIGRidXMvZGJ1cy1tYWlubG9vcC5jOiBtb3ZlIGJ1cy9sb29wLltoY10KKwloZXJlIHNvIGl0IGNhbiBiZSB1c2VkIGluIHRlc3QgYmluYXJpZXMgYWxzbworCisyMDAzLTA0LTA2ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jIChfZGJ1c19iZWNvbWVfZGFlbW9uKTogd3JpdGUgdGhlIHBpZGZpbGUKKwloZXJlIGluIHRoZSBwYXJlbnQgcHJvY2Vzcywgc28gd2UgY2FuIHJldHVybiBhbiBlcnJvciBpZiBpdAorCWZhaWxzLiBBbHNvLCBtb3ZlIHNvbWUgb2YgdGhlIGNvZGUgaW50byB0aGUgY2hpbGQgc28gdGhlIHBhcmVudAorCWlzIGxlc3MgaG9zZWQgaWYgd2UgZmFpbCBtaWR3YXkgdGhyb3VnaC4KKworCSogYnVzL2J1cy5jIChidXNfY29udGV4dF9uZXcpOiBtb3ZlIHBpZGZpbGUgZGV0ZWN0aW9uIGZ1cnRoZXIgdXAKKwlpbiB0aGUgZnVuY3Rpb24sIGJlZm9yZSB3ZSBzdGFydCBvdmVyd3JpdGluZyBzb2NrZXRzIGFuZCBzdWNoLgorCisJKiBidXMvbWVzc2FnZWJ1cy5pbjogYWRqdXN0IHRoaXMgYSBiaXQsIG5vdCBzdXJlIGlmIGl0IHdpbGwgd29yay4KKworCSogY29uZmlndXJlLmluOiBhZGQgLS13aXRoLXN5c3RlbS1waWQtZmlsZSBhbmQgLS13aXRoLXN5c3RlbS1zb2NrZXQKKworMjAwMy0wNC0wNiAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogY29uZmlndXJlLmluIChEQlVTX1NZU1RFTV9QSURfRklMRSk6IE5ldyB2YXJpYWJsZS4KKworCSogYnVzL3N5c3RlbS5jb25mLmluOiBEZWNsYXJlIGEgcGlkZmlsZS4KKworCSogYnVzL2J1cy5jIChidXNfY29udGV4dF9uZXcpOiBUZXN0IGZvciBhbiBleGlzdGluZyBwaWQgZmlsZSwgYW5kCisJY3JlYXRlIG9uZSAoaWYgYXBwcm9wcmlhdGUpLgorCisJKiBidXMvY29uZmlnLXBhcnNlci5jIChlbnVtIEVsZW1lbnRUeXBlKSBbRUxFTUVOVF9QSURGSUxFXTogTmV3LgorCShzdHJ1Y3QgQnVzQ29uZmlnUGFyc2VyKSBbcGlkZmlsZV06IE5ldy4KKwkoZWxlbWVudF90eXBlX3RvX25hbWUsIG1lcmdlX2luY2x1ZGVkLCBzdGFydF9idXNjb25maWdfY2hpbGQpCisJKGJ1c19jb25maWdfcGFyc2VyX2VuZF9lbGVtZW50LCBidXNfY29uZmlnX3BhcnNlcl9jb250ZW50KTogSGFuZGxlIGl0LgorCShidXNfY29uZmlnX3BhcnNlcl91bnJlZik6IEZyZWUgaXQuCisJKGJ1c19jb25maWdfcGFyc2VyX2dldF9waWRmaWxlKTogTmV3IGZ1bmN0aW9uLgorCisJKiBidXMvY29uZmlnLXBhcnNlci5oIChfZGJ1c193cml0ZV9waWRfZmlsZSk6IFByb3RvdHlwZS4KKworCSogZGJ1cy9kYnVzLWVycm9ycy5oIChEQlVTX0VSUk9SX1BJREZJTEVfRVhJU1RTKTogTmV3IGVycm9yLgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jIChfZGJ1c193cml0ZV9waWRfZmlsZSk6IE5ldyBmdW5jdGlvbi4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuaDogUHJvdG90eXBlIGl0LgorCisyMDAzLTA0LTA2ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBidXMvYnVzLmMgKGJ1c19jb250ZXh0X25ldyk6IHByaW50IHRoZSBhZGRyZXNzIGluIGhlcmUsIHJhdGhlcgorCXRoYW4gaW4gbWFpbigpLCBiZWNhdXNlIHdlIG5lZWQgdG8gZG8gaXQgYmVmb3JlIGZvcmtpbmcgdGhlIGRhZW1vbgorCisJKiBidXMvZGlzcGF0Y2guYyAoc2VuZF9zZXJ2aWNlX25vbmV4aXN0ZW50X2Vycm9yKTogc2V0IHRoZSBzZW5kZXIKKwlvbiB0aGUgc2VydmljZSBub25leGlzdGVudCBlcnJvcgorCisJKiBidXMvZHJpdmVyLmMgKGJ1c19kcml2ZXJfaGFuZGxlX2FjcXVpcmVfc2VydmljZSk6IHNldCB0aGUKKwlzZW5kZXIgb24gdGhlIEFjcXVpcmVTZXJ2aWNlIHJlcGx5CisKKwkqIHRlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMvZGVidWctYWxsb3ctYWxsLmNvbmYuaW46IE1ha2UgdGVzdAorCXNlcnZlciBhbHNvIGxpc3RlbiBvbiBhIFVOSVggc29ja2V0IHNvIHNlcnZpY2VzIGNhbiBjb25uZWN0IHRvIGl0LgorCisyMDAzLTA0LTA2ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtdGhyZWFkcy5jOiBSZWRvIGhvdyB0aGUgZmFrZSBkZWJ1ZyBtdXRleGVzIGFyZSBkb25lCisJc28gaXQgZGV0ZWN0cyBkZWFkbG9ja3MgYW5kIGFsc28gd2UgYWN0dWFsbHkgaW5pdCB0aHJlYWRzIHdoZW4KKwlkZWJ1Z2dpbmcuCisKKzIwMDMtMDQtMDYgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy1zZXJ2ZXItdW5peC5jIChfZGJ1c19zZXJ2ZXJfbmV3X2Zvcl9kb21haW5fc29ja2V0KToKKwlzYXZlIHRoZSBkb21haW4gc29ja2V0IG5hbWUsIGFuZCB1bmxpbmsgaXQgd2hlbiB3ZSBkaXNjb25uZWN0IHRoZQorCXNlcnZlci4gTWVhbnMgdGhhdCBhdCBsZWFzdCB3aGVuIHdlIGV4aXQgbm9ybWFsbHksIHdlIHdvbid0IGxlYXZlCisJYSBidW5jaCBvZiBqdW5rIGluIC90bXAKKworCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC11bml4LmMKKwkoX2RidXNfdHJhbnNwb3J0X25ld19mb3JfZG9tYWluX3NvY2tldCk6IGNvZGUgY2xlYW51cCAobmljZXIKKwltZW1vcnkgbWFuYWdlbWVudCkuIChJIHdhcyBtYWtpbmcgYSByZWFsIGNoYW5nZSBoZXJlIGJ1dCB0aGVuCisJZGlkbid0KQorCisyMDAzLTA0LTA2ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBidXMvYnVzLmMgKGJ1c19jb250ZXh0X25ldyk6IGZpeCB3cm9uZyBoYW5kbGluZyBvZgorCXNlcnZlcl9kYXRhX3Nsb3RfdW5yZWYoKSBpbiB0aGUgZXJyb3IgY2FzZS4KKworCSogZGJ1cy9kYnVzLWludGVybmFscy5oIChfZGJ1c19hc3NlcnQpOiBjaGFuZ2Ugc28gaXQgcGFzc2VzCisJIihjb25kaXRpb24pICE9IDAiIHRvIF9kYnVzX3JlYWxfYXNzZXJ0IHNvIHRoYXQKKwkiX2RidXNfYXNzZXJ0IChwb2ludGVyKSIgZG9lc24ndCBjYXVzZSBhIHdhcm5pbmcKKworCSogYnVzL21haW4uYyAobWFpbik6IGFjY2VwdCAtLXByaW50LWFkZHJlc3Mgb3B0aW9uIHRvIHByaW50IG91dAorCXRoZSBtZXNzYWdlIGJ1cyBhZGRyZXNzCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMgKF9kYnVzX2dlbmVyYXRlX3JhbmRvbV9hc2NpaSk6IGV4cG9ydCB0aGlzCisKKwkqIGRidXMvZGJ1cy10cmFuc3BvcnQuYyAoX2RidXNfdHJhbnNwb3J0X29wZW4pOiBzcGVjaWFsIGVycm9yIGZvcgorCSJ0bXBkaXIiIG9wdGlvbiB0byB1bml4OiBhZGRyZXNzIG9uIGNsaWVudCBzaWRlCisKKwkqIGRidXMvZGJ1cy1zZXJ2ZXIuYyAoZGJ1c19zZXJ2ZXJfbGlzdGVuKTogaGFuZGxlICJ0bXBkaXIiIG9wdGlvbgorCXRvIHVuaXg6IGFkZHJlc3MKKworCSogY29uZmlndXJlLmluIChURVNUX1NPQ0tFVF9ESVIpOiBsb2NhdGUgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5CisJd2UgY2FuIHVzZSB0byBjcmVhdGUgc29ja2V0cyBpbiB0aGUgdGVzdCBzdWl0ZS4KKworCSogYnVzL21haW4uYyAoc2lnbmFsX2hhbmRsZXIpOiBvbiBTSUdURVJNLCBleGl0IHRoZSBkYWVtb24KKwljbGVhbmx5LiBUbyBiZSB1c2VkIGZvciB0ZXN0aW5nLgorCisJKiBkYnVzL2RidXMtc3Bhd24uYyAoYmFieXNpdCk6IHVzZSBfZGJ1c19zZXRfc2lnbmFsX2hhbmRsZXIoKQorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jIChfZGJ1c19zZXRfc2lnbmFsX2hhbmRsZXIpOiBuZXcKKworCSogZGJ1cy9kYnVzLXNlcnZlci1kZWJ1Zy1waXBlLmMgKF9kYnVzX3RyYW5zcG9ydF9kZWJ1Z19waXBlX25ldyk6CisJaGFuZGxlIHRyeWluZyB0byBjYWxsIHRoaXMgd2hlbiB0aGVyZSdzIG5vIHNlcnZlcnMgYWN0aXZlCisKKzIwMDMtMDQtMDUgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIE5FV1M6IHVwZGF0ZQorCisJKiBjb25maWd1cmUuaW46IDAuOAorCisyMDAzLTA0LTA1ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBidXMvYnVzLmMgKHNldHVwX3NlcnZlcik6IGZpeCB0aGlzIHNvIGRidXMtZGFlbW9uLTEgZG9lc24ndAorCWNyYXNoIG9uIHN0YXJ0dXAuIE5lZWQgdG8gZ2V0ICJ0cnkgc3RhcnRpbmcgdGhlIGRhZW1vbiIKKwlpbiB0aGUgdGVzdCBzdWl0ZSBJIGd1ZXNzLiA7LSkKKworCSogZGJ1cy9kYnVzLXNlcnZlci5oLCBkYnVzL2RidXMtc2VydmVyLmM6IHJlbW92ZSB0aGUgc3R1ZmYgdGhhdAorCXRyYWNrZWQgdGhlIG51bWJlciBvZiBvcGVuIGNvbm5lY3Rpb25zOyBpdCdzIGJldHRlciBkb25lIGluCisJYXBwbGljYXRpb24tc3BlY2lmaWMgY29kZSBhcyB5b3Ugd2FudCBpdCB0byBzcGFuIGFsbCBzZXJ2ZXJzIGV0Yy4KKworMjAwMy0wNC0wNSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogYnVzL01ha2VmaWxlLmFtIChpbnN0YWxsLWRhdGEtaG9vayk6IGFkZCBtaXNzaW5nIERFU1RESVIsCisJcGF0Y2ggZnJvbSBDb2xpbiBXYWx0ZXJzCisKKzIwMDMtMDQtMDUgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRvYy9jb25maWctZmlsZS50eHQgKEVsZW1lbnRzKTogZml4IGRvY3Mgb2YgPGF1dGg+IHRvIHJlZmxlY3QKKwlyZWFsaXR5OyBpbiBmYWN0IG11bHRpcGxlIG1lY2hhbmlzbXMgYXJlIGFsbG93ZWQuCisKKwkqIGRidXMvZGJ1cy1pbnRlcm5hbHMuYyAoX2RidXNfcmVhbF9hc3NlcnQpCisJKF9kYnVzX3JlYWxfYXNzZXJ0X25vdF9yZWFjaGVkKTogbW92ZSBndXRzIG9mIF9kYnVzX2Fzc2VydCgpIGFuZAorCV9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCgpIGludG8gZnVuY3Rpb25zLCBzbyB0aGF0IHRoZXkgZG9uJ3Qgc2hvdworCXVwIGluIGJhc2ljIGJsb2NrIGNvdW50cyBmb3IgdGVzdCBjb3ZlcmFnZSwgYW5kIGRvbid0IHVzZSB1cCBhcworCW11Y2ggZGlzayBzcGFjZS4gRG9lcyBtZWFuIHNsb3dlciBleGVjdXRpb24gc3BlZWQgdGhvdWdoLCBzbworCWFzc3VtZXMgLS1kaXNhYmxlLWFzc2VydHMgaXMgdGhlIG5vcm1hbCBwcm9kdWN0aW9uIGNhc2UuCisKKzIwMDMtMDQtMDUgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIHRlc3QvTWFrZWZpbGUuYW0gKGRpc3QtaG9vayk6IGFsc28gZGlzdCAqLmluIGZpbGVzCisKKwkqIE5FV1M6IHVwZGF0ZQorCisJKiBjb25maWd1cmUuaW46IDAuNworCisyMDAzLTA0LTA1ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtc3RyaW5nLmM6IGRvY3Mgd2FybmluZworCisJKiBkYnVzL2RidXMtc3Bhd24uYzogbWlzc2luZyBkb2NzCisKKwkqIGRidXMvZGJ1cy1tZW1vcnkuYyAoc3RydWN0IFNodXRkb3duQ2xvc3VyZSk6IG1pc3NpbmcgZG9jcworCisyMDAzLTA0LTA1ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBidXMvbG9vcC5jIChidXNfbG9vcF9pdGVyYXRlKTogZml4IHRoZSB0aW1lb3V0IGNvZGUsIHVzaW5nCisJbWFnaWMgZnJvbSBHTGliCisKKwkqIGRidXMvZGJ1cy1zcGF3bi5jIChfZGJ1c19iYWJ5c2l0dGVyX3VucmVmKTogc2V0IHNpdHRlcl9waWQKKwl0byAtMSBvbmNlIHdlJ3ZlIHJlYXBlZCB0aGUgYmFieXNpdHRlcgorCShfZGJ1c19iYWJ5c2l0dGVyX2hhbmRsZV93YXRjaCk6IGRvIGFzIG11Y2ggd29yayBhcyB3ZSBjYW4sIG5vdAorCWp1c3Qgb25lIGdvIG9mIGl0CisKKwkqIGJ1cy9hY3RpdmF0aW9uLmM6IGFkZCBjb2RlIHVzaW5nIERCdXNCYWJ5c2l0dGVyIHNvIHRoYXQgd2UKKwloYW5kbGUgaXQgd2hlbiBhIHNlcnZpY2UgZmFpbHMgdG8gc3RhcnQgdXAgcHJvcGVybHkuCisJKGJ1c19hY3RpdmF0aW9uX3NlcnZpY2VfY3JlYXRlZCk6IGRvbid0IHJlbW92ZSB0aGUgYWN0aXZhdGlvbgorCWVudHJpZXMgYXMgd2UgZ28sIGp1c3QgbGV0IHRoZW0gZ2V0IHJlbW92ZWQgd2hlbiB3ZSBmcmVlIHRoZSBwZW5kaW5nCisJYWN0aXZhdGlvbi4gVW5yZWYgcmVwbHkgbWVzc2FnZXMgYWZ0ZXIgc2VuZGluZyB0aGVtLgorCisyMDAzLTA0LTA1ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiB0ZXN0L2RlY29kZS1nY292LmMgKG1haW4pOiBwcmludCBwZXItZGlyZWN0b3J5IHN0YXRzIGluIHRoZSByZXBvcnQKKworCSogTWFrZWZpbGUuYW0gKGNvdmVyYWdlLXJlcG9ydC50eHQpOiBkb24ndCBpbmNsdWRlIHRlc3QvKiBpbiBnY292IHN0YXRzCisKKzIwMDMtMDQtMDUgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIE1ha2VmaWxlLmFtIChjb3ZlcmFnZS1yZXBvcnQudHh0KTogYWRkIHRhcmdldCAiY292ZXJhZ2UtcmVwb3J0LnR4dCIKKworCSogdGVzdC9kZWNvZGUtZ2Nvdi5jOiBoYWNrIHVwIGEgbGl0dGxlIHByb2dyYW0gdG8gc3VjayBkYXRhCisJb3V0IG9mIGdjb3YgZmlsZXMuIFllcyB0aGlzIGlzIHNvcnQgb2Ygc2lsbHkuCisKKwkqIGNvbmZpZ3VyZS5pbjogZGVmaW5lIHNvbWV0aGluZyBpbiBjb25maWcuaCBhbmQgZG8gYW4KKwlBTV9DT05ESVRJT05BTCB3aGVuIGdjb3YgaXMgZW5hYmxlZAorCisyMDAzLTA0LTA0ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLXNwYXduLmMsIGRidXMvZGJ1cy1zcGF3bi5oOiBDaGFuZ2UgZGJ1c19zcGF3biB0bworCXJldHVybiBhICJiYWJ5c2l0dGVyIiBvYmplY3QgdGhhdCBpcyB1c2VkIHRvIG1vbml0b3IgdGhlIHN0YXR1cyBvZgorCXRoZSBzcGF3bmVkIHByb2Nlc3MgYW5kIHJlYXAgaXQgd2hlbiByZXF1aXJlZC4KKworCSogdGVzdC90ZXN0LXNlZ2ZhdWx0LmMsIHRlc3QvdGVzdC1leGl0LmMsCisJdGVzdC90ZXN0LXNsZWVwLWZvcmV2ZXIuYzogYmluYXJpZXMgdGhhdCBkbyB2YXJpb3VzIGxhbWUgdGhpbmdzLAorCXVzZWQgaW4gdGhlIHRlc3Qgc3VpdGUuCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmM6IGtpbGwgX2RidXNfZXJybm9fdG9fc3RyaW5nKCkKKworMjAwMy0wNC0wMyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLXNwYXduLmM6IE1vdmUgZGJ1cy1zcGF3biBpbnRvIGEgc2VwYXJhdGUgZmlsZQorCWluIHByZXBhcmF0aW9uIGZvciBtb2RpZnlpbmcgaXQsIGRidXMtc3lzZGVwcyBpcyBnZXR0aW5nCisJYSBiaXQgdW5tYW5hZ2VhYmxlLgorCisyMDAzLTA0LTAzICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogYnVzL2xvb3AuaCwgYnVzL2xvb3AuYzogbWFrZSB0aGUgbWFpbmxvb3AgYW4gb2JqZWN0IHNvIHdlIGNhbgorCWhhdmUgbXVsdGlwbGUgb25lcworCisJKiBidXMvKi5baGNdOiBhZGFwdCB0byBtYWlubG9vcCBjaGFuZ2UKKworMjAwMy0wNC0wMyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGJ1cy9hY3RpdmF0aW9uLmMgKGxvYWRfZGlyZWN0b3J5KTogZml4IHVwIG1lbWxlYWtzCisJKGJ1c19hY3RpdmF0aW9uX2VudHJ5X2ZyZWUpOiBmcmVlIHRoZSBlbnRyeQorCisJKiBkYnVzL2RidXMtYnVzLmMgKGRidXNfYnVzX2FjcXVpcmVfc2VydmljZSk6IHJldHVybiBhbiBlcnJvciBpZgorCXdlIGdldCBvbmUgZnJvbSB0aGUgbWVzc2FnZSBidXM7IGZpeCBtZW1sZWFrcy4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAoZGJ1c19zZXRfZXJyb3JfZnJvbV9tZXNzYWdlKTogbmV3IGZ1bmN0aW9uCisKKzIwMDMtMDQtMDMgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGJ1cy9jb25maWctcGFyc2VyLmMgKGJ1c19jb25maWdfcGFyc2VyX3VucmVmKTogZnJlZQorCWxpc3Qgb2YgbWVjaGFuaXNtcywgYnVnIGRpc2NvdmVyZWQgYnkgdGVzdCBzdWl0ZSBlbmhhbmNlbWVudHMKKwkocHV0dGluZyBzeXN0ZW0uY29uZiBhbmQgc2Vzc2lvbi5jb25mIGludG8gc3VpdGUpCisKKwkqIHRlc3QvTWFrZWZpbGUuYW0sIHRlc3QvdGVzdC1zZXJ2aWNlLmM6IGFkZCBwbGFjZWhvbGRlciBmb3IgYQorCXRlc3Qgc2VydmljZSB0aGF0IHdlJ2xsIGFjdGl2YXRlIGFzIHBhcnQgb2YgdGVzdCBzdWl0ZS4gRG9lc24ndAorCWRvIGFueXRoaW5nIHlldC4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYyAoX2RidXNfc2V0ZW52KTogc3VwcG9ydCB1bnNldGVudiBieQorCXNldHRpbmcgTlVMTCB2YWx1ZSwgYW5kIHVzZSBzeXN0ZW0gbWFsbG9jIG5vdCBkYnVzX21hbGxvYygpCisJd2hlbiB3ZSBoYXZlIHVuYXZvaWRhYmxlIG1lbWxlYWthZ2UuCisKKwkqIGRidXMvZGJ1cy1idXMuYyAoZGJ1c19idXNfZ2V0KTogZml4IGJ1ZyB3aGVyZSBidXMgdHlwZSBvZiAwCisJZGlkbid0IHdvcmssIGFuZCBzdXBwb3J0IERCVVNfQlVTX0FDVElWQVRJT04uCisKKwkqIGJ1cy9hY3RpdmF0aW9uLmMgKGNoaWxkX3NldHVwKTogcGFzcyBvdXIgd2VsbC1rbm93biBidXMgdHlwZSB0bworCXRoZSBjaGlsZAorCisJKiBidXMvY29uZmlnLXBhcnNlci5jOiBzdXBwb3J0IDx0eXBlPiB0byBzcGVjaWZ5IHdlbGwta25vd24gdHlwZQorCisJKiBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnNnbWw6IGRvY3VtZW50IHRoZSBlbnYgdmFyaWFibGVzIHRvCisJbG9jYXRlIHdlbGwta25vd24gYnVzZXMgYW5kIGZpbmQgc2VydmljZSBhY3RpdmF0b3IKKworMjAwMy0wNC0wMiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIHRlc3QvTWFrZWZpbGUuYW0gKGFsbC1sb2NhbCk6IGFkZCBhIHJ1bGUgdG8gY29weSB0ZXN0cyB0bworCWJ1aWxkZGlyLCBzbyB3ZSBjYW4gaGF2ZSBnZW5lcmF0ZWQgdGVzdHMuIFVzZSB0aGlzIHRvIHJlbW92ZSB0aGUKKwlzaWxseSBoYWNrIGZvciB0ZXN0aW5nIHN5c3RlbS5jb25mIGFuZCBzZXNzaW9uLmNvbmYuIFdpbGwgdXNlIHRoaXMKKwlzaG9ydGx5IHRvIGdlbmVyYXRlIC5zZXJ2aWNlIGZpbGVzIHBvaW50aW5nIHRvIHRlc3QgYmluYXJpZXMuCisKKzIwMDMtMDQtMDIgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtc3RyaW5nLmMgKHNldF9sZW5ndGgpOiBmaXggYSBidWcgLSB3ZSBhbGxvY2F0ZWQgbWF4IG9mCisJY3VycmVudCBhbGxvYyBhbmQgbmVlZGVkIG5ldyBsZW5ndGgsIG5vdCBtYXggb2YgdGhlIGRvdWJsZWQKKwlhbGxvY2F0aW9uIGFuZCBuZWVkZWQgbmV3IGxlbmd0aC4gQWxzbywgd2hlbiBidWlsZGluZyB0ZXN0cywKKwlkb24ndCBkbyB0aGUgZG91YmxlLWFsbG9jYXRpb24gc3R1ZmYsIGp1c3QgcmVhbGxvYyBldmVyeSB0aW1lLgorCisyMDAzLTA0LTAyICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYyAoX2RidXNfZmlsZV9nZXRfY29udGVudHMpOiBpbmNsdWRlIGZpbGVuYW1lcworCWluIGVycm9yIG1lc3NhZ2VzCisJKF9kYnVzX3N0cmluZ19nZXRfZGlybmFtZSk6IG5ldworCShfZGJ1c19zeXNkZXBzX3Rlc3QpOiBuZXcKKwkoX2RidXNfZGlyZWN0b3J5X29wZW4pOiBpbmNsdWRlIGRpcm5hbWVzIGluIGVycm9yIG1lc3NhZ2VzCisKKwkqIGJ1cy9jb25maWctcGFyc2VyLmM6IGludGVycHJldCA8aW5jbHVkZT4gYW5kIDxpbmNsdWRlZGlyPiBhbmQKKwk8c2VydmljZWRpcj4gcmVsYXRpdmUgdG8gY29uZmlnIGZpbGUgbG9jYXRpb24gaWYgdGhlIGdpdmVuCisJZmlsZW5hbWUgaXMgbm90IGFic29sdXRlLgorCisJKiBkYnVzL2RidXMtc3RyaW5nLmMgKF9kYnVzX3N0cmluZ19maW5kX2J5dGVfYmFja3dhcmQpOiBuZXcKKworMjAwMy0wNC0wMiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGJ1cy9jb25uZWN0aW9uLmMgKGJ1c190cmFuc2FjdGlvbl9zZW5kX2Vycm9yX3JlcGx5KTogc2V0IHNlbmRlcgorCXNlcnZpY2UgZm9yIHRoZSBlcnJvciwgYW5kIHVucmVmIHRoZSByZXBseSBvbiBzdWNjZXNzCisKKwkqIGJ1cy9hY3RpdmF0aW9uLmM6IGNvbnZlcnQgdG8gdXNlIEJ1c1RyYW5zYWN0aW9uIHNvIE9PTSBjYW4gYmUKKwloYW5kbGVkIGNvcnJlY3RseQorCShidXNfYWN0aXZhdGlvbl9zZXJ2aWNlX2NyZWF0ZWQpOiBzZXQgc2VuZGVyIG9mIHRoZSBtZXNzYWdlCisKKzIwMDMtMDQtMDEgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBidXMvY29uZmlnLXBhcnNlci5jLCBidXMvYnVzLmM6IGltcGxlbWVudCA8c2VydmljZWRpcj4gYW5kCisJPGluY2x1ZGVkaXI+IChhdCBsZWFzdCBtb3N0bHkpCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMgKF9kYnVzX2NoYW5nZV9pZGVudGl0eSk6IHNldCB0aGUgZ3JvdXAgSUQKKwlmaXJzdCwgdGhlbiB0aGUgdXNlciBJRAorCisyMDAzLTA0LTAxICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtc2VydmVyLmMgKGRidXNfc2VydmVyX3NldF9hdXRoX21lY2hhbmlzbXMpOiBuZXcKKwlmdW5jdGlvbgorCisJKiBkYnVzL2RidXMtYXV0aC5jIChfZGJ1c19hdXRoX3NldF9tZWNoYW5pc21zKTogbmV3CisKKwkqIGRidXMvZGJ1cy1pbnRlcm5hbHMuYyAoX2RidXNfZHVwX3N0cmluZ19hcnJheSk6IG5ldyBmdW5jdGlvbgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jIChfZGJ1c19saXN0ZW5fdW5peF9zb2NrZXQpOiBjaG1vZCB0aGUKKwlzb2NrZXQgMDc3NywgYW5kIHVubGluayBhbnkgZXhpc3Rpbmcgc29ja2V0LgorCisJKiBidXMvYnVzLmMgKGJ1c19jb250ZXh0X25ldyk6IGNoYW5nZSBvdXIgVUlEL0dJRCBhbmQgZm9yayBpZgorCXRoZSBjb25maWd1cmF0aW9uIGZpbGUgc28gc3BlY2lmaWVzOyBzZXQgdXAgYXV0aCBtZWNoYW5pc20KKwlyZXN0cmljdGlvbnMKKworCSogYnVzL2NvbmZpZy1wYXJzZXIuYyAoYnVzX2NvbmZpZ19wYXJzZXJfY29udGVudCk6IGFkZCBzdXBwb3J0CisJZm9yIDxmb3JrPiBvcHRpb24gYW5kIGZpbGwgaW4gY29kZSBmb3IgPGF1dGg+CisKKwkqIGJ1cy9zeXN0ZW0uY29uZi5pbjogYWRkIDxmb3JrLz4gdG8gZGVmYXVsdCBjb25maWd1cmF0aW9uLAorCWFuZCBsaW1pdCBhdXRoIG1lY2hhbmlzbXMgdG8gRVhURVJOQUwKKworCSogZG9jL2NvbmZpZy1maWxlLnR4dCAoRWxlbWVudHMpOiBhZGQgPGZvcms+CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMgKF9kYnVzX2JlY29tZV9kYWVtb24pOiBuZXcgZnVuY3Rpb24KKwkoX2RidXNfY2hhbmdlX2lkZW50aXR5KTogbmV3IGZ1bmN0aW9uCisKKzIwMDMtMDMtMzEgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jIChfZGJ1c19jb25uZWN0X3VuaXhfc29ja2V0KQorCShfZGJ1c19saXN0ZW5fdW5peF9zb2NrZXQpOiBmaXggb2ZmLWJ5LW9uZSBlcnJvciBpbiBudWxsCisJdGVybWluYXRpb24gc3BvdHRlZCBieSBOYWxpbgorCisyMDAzLTAzLTMxICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLWtleXJpbmcuYyAoX2RidXNfa2V5cmluZ19uZXdfaG9tZWRpcik6IGFsbG93IHNldHRpbmcKKwlEQlVTX1RFU1RfSE9NRURJUiB3aGVuIHRlc3RzIGFyZSBlbmFibGVkLCBzbyB3ZSBjYW4gdGVzdCB3aXRob3V0CisJaGF2aW5nIGEgcmVhbCBob21lIGRpcmVjdG9yeSBhdmFpbGFibGUuCisKKzIwMDMtMDMtMzEgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBidXMvTWFrZWZpbGUuYW0gKGluc3RhbGwtZGF0YS1ob29rKTogY3JlYXRlIC92YXIvcnVuL2RidXMKKworCSogYnVzL21lc3NhZ2VidXMuaW46IGFkZCBpbml0IHNjcmlwdCBmb3IgUmVkIEhhdCAvZXRjL2luaXQuZAorCisJKiBjb25maWd1cmUuaW46IGFkZCBzdXBwb3J0IGZvciBzcGVjaWZ5aW5nIGEgc3R5bGUgb2YgaW5pdCBzY3JpcHQKKwl0byBpbnN0YWxsCisKKzIwMDMtMDMtMzEgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisgICAgICAgIEZpeCBzb21lIGFubm95aW5nIERCdXNTdHJpbmcgQVBJIGFuZCBmaXggYWxsIGFmZmVjdGVkIGNvZGUuCisKKwkqIGRidXMvZGJ1cy1zdHJpbmcuYyAoX2RidXNfc3RyaW5nX2luaXQpOiBnZXQgcmlkIG9mIGFubm95aW5nCisJbWF4X2xlbmd0aCBhcmd1bWVudAorCShfZGJ1c19zdHJpbmdfZ2V0X2RhdGEpOiBjaGFuZ2UgdG8gcmV0dXJuIHN0cmluZyBpbnN0ZWFkIG9mIHVzaW5nCisJYW4gb3V0IHBhcmFtCisJKF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSk6IGRpdHRvCisJKF9kYnVzX3N0cmluZ19nZXRfZGF0YV9sZW4pOiBkaXR0bworCShfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuKTogZGl0dG8KKworMjAwMy0wMy0zMSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGJ1cy9tYWluLmMgKG1haW4pOiBmaXggdXAgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgdG8gYmUgbmljZXIKKworMjAwMy0wMy0zMSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvTWFrZWZpbGUuYW0gKElOQ0xVREVTKTogdXNlIEVYUEFOREVEX0xPQ0FMU1RBVEVESVIgdG8KKwlkZWZpbmUgREJVU19TWVNURU1fQlVTX1BBVEggYXMgd2Ugd2FudCB0byBjb21waWxlIGluIHRoZSBzYW1lCisJZmluYWwgbG9jYXRpb24gdGhhdCBsYW5kcyBpbiB0aGUgY29uZmlnIGZpbGUKKworCSogYnVzL2NvbmZpZy1sb2FkZXItZXhwYXQuYyAoYnVzX2NvbmZpZ19sb2FkKTogZml4IHR5cGUgb2YKKwlYTUxfUGFyc2VyIHZhcmlhYmxlCisKKwkqIGRvYy9UT0RPOiByZW1vdmUgVE9ETyBpdGVtIGZvciBkYnVzX2J1c19nZXQoKQorCisJKiBkYnVzL2RidXMtYnVzLmMgKGJ1c19kYXRhX2ZyZWUpOiBhZGQgbWlzc2luZyBsb2NrL3VubG9jaworCisyMDAzLTAzLTMxICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LXVuaXguYyAoX2RidXNfdHJhbnNwb3J0X25ld19mb3JfZG9tYWluX3NvY2tldCkKKwkoX2RidXNfdHJhbnNwb3J0X25ld19mb3JfdGNwX3NvY2tldCk6IHRoZXNlIGRpZG4ndCBuZWVkIHRoZSAic2VydmVyIgorCWFyZ3VtZW50IHNpbmNlIHRoZXkgYXJlIGFsd2F5cyBjbGllbnQgc2lkZQorCisJKiBkYnVzL2RidXMtc2VydmVyLmMgKGRidXNfc2VydmVyX2dldF9hZGRyZXNzKTogbmV3IGZ1bmN0aW9uCisKKwkqIGJ1cy9tYWluLmMgKG1haW4pOiB0YWtlIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgYXMgYW4gYXJndW1lbnQuCisKKwkqIHRlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMvZGVidWctYWxsb3ctYWxsLmNvbmY6IG5ldyBmaWxlIHRvCisJdXNlIHdpdGggZGlzcGF0Y2guYyB0ZXN0cyBmb3IgZXhhbXBsZQorCisJKiBidXMvdGVzdC1tYWluLmMgKG1haW4pOiByZXF1aXJlIHRlc3QgZGF0YSBkaXIKKworCSogYnVzL2J1cy5jIChidXNfY29udGV4dF9uZXcpOiBjaGFuZ2UgdGhpcyB0byB0YWtlIGEKKwljb25maWd1cmF0aW9uIGZpbGUgbmFtZSBhcyBhcmd1bWVudAorCisJKiBkb2MvY29uZmlnLWZpbGUudHh0IChFbGVtZW50cyk6IGFkZCA8c2VydmljZWRpcj4KKworCSogYnVzL3N5c3RlbS5jb25mLCBidXMvc2Vzc2lvbi5jb25mOiBuZXcgZmlsZXMKKworCSogZGJ1cy9kYnVzLWJ1cy5jIChkYnVzX2J1c19nZXQpOiBsb29rIGZvciBzeXN0ZW0gYnVzIG9uCisJd2VsbC1rbm93biBzb2NrZXQgaWYgbm9uZSBzZXQKKworCSogY29uZmlndXJlLmluOiBjcmVhdGUgc3lzdGVtLmNvbmYgYW5kIHNlc3Npb24uY29uZgorCisyMDAzLTAzLTMwICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBidXMvY29uZmlnLXBhcnNlci5jOiBoYWNraW5nCisKKwkqIGRidXMvZGJ1cy1tZW1vcnkuYzogZG9uJ3QgdXNlIERCdXNMaXN0IGZvciB0aGUgbGlzdCBvZiBzdHVmZgorCXRvIHNodXQgZG93biwgc2luY2UgaXQgY291bGQgY2F1c2Ugd2VpcmRuZXNzIHdpdGggdGhlIERCdXNMaXN0CisJbG9jaworCisJKiBkYnVzL2RidXMtbGlzdC5jIChfZGJ1c19saXN0X3Rlc3QpOiBhZGQgdGVzdHMgZm9yIHRoZQorCWxpbmstb3JpZW50ZWQgc3RhY2sgcm91dGluZXMKKwkoYWxsb2NfbGluayk6IGZyZWUgdGhlIG1lbXBvb2wgaWYgdGhlIGZpcnN0IGFsbG9jIGZyb20gaXQgZmFpbHMKKworCSogZGJ1cy9kYnVzLW1lbXBvb2wuYyAoc3RydWN0IERCdXNNZW1CbG9jayk6IGZpeCBhbGlnbm1lbnQgaXNzdWUKKworCSogZGJ1cy9kYnVzLXN0cmluZy5jIChVTklDT0RFX1ZBTElEKTogc3luYyBuZXcgdmVyc2lvbiBvZiB0aGlzCisJZnJvbSBHTGliCisJKF9kYnVzX3N0cmluZ19za2lwX3doaXRlKTogbmV3CisKKwkqIGRvYy9jb25maWctZmlsZS50eHQgKEVsZW1lbnRzKTogYWRkIDxpbmNsdWRlZGlyPgorCisyMDAzLTAzLTI4ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtc3RyaW5nLmMgKF9kYnVzX3N0cmluZ19jb3B5X2RhdGFfbGVuKQorCShfZGJ1c19zdHJpbmdfY29weV9kYXRhKTogbmV3IGZ1bmN0aW9ucworCisyMDAzLTAzLTI4ICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogZGJ1cy9kYnVzLWJ1cy5jOiAoYnVzX2RhdGFfZnJlZSksIChkYnVzX2J1c19nZXQpOgorCSogZGJ1cy9kYnVzLWJ1cy5oOgorCUFkZCBkYnVzX2J1c19nZXQuCisKKwkqIGRidXMvZGJ1cy1tZW1vcnkuYzoKKwlGaXggYSBkb2MgY29tbWVudC4KKworMjAwMy0wMy0yOCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogYnVzL3Rlc3QuYyAoYnVzX3Rlc3RfZmx1c2hfYnVzKTogcmVtb3ZlIHRoZSBzbGVlcCBmcm9tIGhlcmUsCisJSSB0aGluayBpdCBtYXkgaGF2ZSBqdXN0IGJlZW4gc3VwZXJzdGl0aW9uLiBOb3Qgc3VyZS4KKworCSogZGJ1cy9kYnVzLXN0cmluZy5jIChfZGJ1c19zdHJpbmdfYmFzZTY0X2RlY29kZSk6IGNhdGNoIHNvbWUgT09NCisJZmFpbHVyZXMgdGhhdCB3ZXJlIG5vdCBiZWluZyBoYW5kbGVkLgorCisJKiBkYnVzL2RidXMtYXV0aC5jIChwcm9jZXNzX2F1dGgpOiBmaXggYSBtZW1sZWFrIGluIE9PTSBoYW5kbGluZworCisJKiBkYnVzL2RidXMtbWVtb3J5LmM6IGFkZCBhYmlsaXR5IHRvIHNldCBudW1iZXIgb2YgbWFsbG9jcyBpbiBhCisJcm93IHRoYXQgd2lsbCBmYWlsIG9uIG91dC1vZi1tZW1vcnkuCisKKwkqIGRidXMvZGJ1cy1pbnRlcm5hbHMuYyAoX2RidXNfdGVzdF9vb21faGFuZGxpbmcpOiBjb252ZW5pZW5jZQorCWZ1bmN0aW9uIGZvciB0ZXN0aW5nIG91dC1vZi1tZW1vcnkgaGFuZGxpbmcuCisKKwkqIGJ1cy9jb25maWctbG9hZGVyLWV4cGF0LmMgKG1lbXN1aXRlKTogZG9uJ3Qgd3JhcCB0aGUgZGJ1cworCWFsbG9jYXRpb24gZnVuY3Rpb25zLCB0aGV5IGRvIG1hcCBleGFjdGx5IHRvIHRoZSBleHBhdCBvbmVzLgorCisyMDAzLTAzLTI3ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogYnVzL2NvbmZpZy1sb2FkZXItbGlieG1sLmMgKGJ1c19jb25maWdfbG9hZCk6IGFkZCBhbm90aGVyIGVycm9yCisJY2hlY2sKKworMjAwMy0wMy0yNiAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGRvYy9UT0RPOgorCUFkZCBub3RlIGFib3V0IGF1dG9tYXRpYyBzZXJ2aWNlIGFjdGl2YXRpb24uCisKKwkqIGRvYy9kYnVzLXNwZWNpZmljYXRpb24uc2dtbDoKKwlSZW5hbWUgdGhlIHNwZWNpZmljYXRpb24gYW5kIGNsYXJpZnkgYSBmZXcgdGhpbmdzLgorCisyMDAzLTAzLTI2ICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogRG94eWZpbGUuaW46CisJKiBkYnVzL2RidXMtYWRkcmVzcy5jOgorCSogZGJ1cy9kYnVzLWRpY3QuYzoKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLmM6CisJKiBkYnVzL2RidXMtc2VydmVyLWRlYnVnLXBpcGUuYzoKKwkqIGRidXMvZGJ1cy10cmFuc3BvcnQtdW5peC5jOgorCUZpeCBkb2N1bWVudGF0aW9uIHdhcm5pbmdzLgorCisyMDAzLTAzLTI2ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBidXMvdGVzdC1tYWluLmMsIGRidXMvZGJ1cy10ZXN0LmMgKG1haW4pOiBjaGVjayBtZW1sZWFrcworCWFmdGVyIGV2ZXJ5IHRlc3Qgc28gaXQncyBxdWljayBhbmQgZWFzeSB0byBzZWUgd2hpY2ggbGVha2VkLCBhbmQKKwlzbyB3ZSB0ZXN0IG11bHRpcGxlIGRidXNfc2h1dGRvd24oKSBjYWxscworCisJKiBjb25maWd1cmUuaW46IGNoYW5nZSBjb25maWd1cmUuaW4gWE1MIHN0dWZmIHRvIGFsc28gc3VwcG9ydAorCWV4cGF0CisKKwkqIGNvbmZpZy1sb2FkZXItbGlieG1sLmM6IHNvbWUgaGFja2luZworCisJKiBjb25maWctbG9hZGVyLWV4cGF0LmM6IHNvbWUgaGFja2luZworCisJKiBjb25maWctcGFyc2VyLmM6IHNvbWUgaGFja2luZywgcGx1cyB0ZXN0cworCisyMDAzLTAzLTI1ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworICAgICAgICAqIHRocm91Z2hvdXQgLSBhZGQgbW9yZSBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIKKworCSogY29uZmlndXJlLmluOiBhZGQgLS13aXRoLXhtbCBvcHRpb24gdG8gc3BlY2lmeSBYTUwgbGlicmFyeSwKKwlyaWdodCBub3cgb25seSBsaWJ4bWwgaXMgc3VwcG9ydGVkLgorCisJKiBidXMvY29uZmlnLWxvYWRlci1saWJ4bWwuYywgY29uZmlnLXBhcnNlci5jOiBzeW5jIHNvbWUgbWlub3IKKwlub253b3JraW5nIGNvZGUgYmV0d2VlbiBob21lIGFuZCB3b3JrLCBzdGlsbCBqdXN0IHN0dWJzCisKKzIwMDMtMDMtMjQgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jIChfZGJ1c19zZXRfZmRfbm9uYmxvY2tpbmcpOiBtb3ZlIHRvIHRoaXMKKwlmaWxlCisKKwkqIGRidXMvZGJ1cy1lcnJvcnMuYyAoZGJ1c19zZXRfZXJyb3IsIGRidXNfc2V0X2Vycm9yX2NvbnN0KTogYWxsb3cKKwlOVUxMIGFyZ3VtZW50IGZvciAibWVzc2FnZSIgaWYgdGhlIGVycm9yIGlzIGEgd2VsbC1rbm93biBvbmUsCisJZmlsbCBpbiBhIGdlbmVyaWMgbWVzc2FnZSBpbiB0aGlzIGNhc2UuCisKKwkqIGRidXMvZGJ1cy1lcnJvcnMuaCAoREJ1c1Jlc3VsdENvZGUpOiBLaWxsIERCdXNSZXN1bHRDb2RlIGluCisJZmF2b3Igb2YgREJ1c0Vycm9yCisKKwkqIGJ1cy90ZXN0LmMgKGJ1c190ZXN0X2ZsdXNoX2J1cyk6IGFkZAorCisJKiBidXMvcG9saWN5LmMgKGJ1c19wb2xpY3lfdGVzdCk6IHRlc3QgY29kZSBzdHViCisKKzIwMDMtMDMtMjQgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGJ1cy9jb25uZWN0aW9uLmMgKGJ1c19jb25uZWN0aW9uc19zZXR1cF9jb25uZWN0aW9uKTogc2V0IHVwCisJdGhlICJjYW4gdGhpcyB1c2VyIGNvbm5lY3QiIGZ1bmN0aW9uLCBidXQgaXQgYWx3YXlzIHJldHVybnMKKwlUUlVFIHVudGlsIHdlIGhhdmUgYSBjb25maWcgZmlsZSBwYXJzZXIgc28gd2UgY2FuIGhhdmUgYSBjb25maWcKKwlmaWxlIHRoYXQgYWxsb3dzIGNvbm5lY3Rpb25zLgorCisyMDAzLTAzLTIzICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtdGhyZWFkcy5jIChkYnVzX211dGV4X25ldywgZGJ1c19jb25kdmFyX25ldyk6IHdpdGgKKwlEQlVTX0JVSUxEX1RFU1RTLCBhY3R1YWxseSBhbGxvYy9mcmVlIGEgYmxvY2sgb2YgbWVtb3J5IGZvcgorCXRoZSBtdXRleCwgc28gd2UgY2FuIGNoZWNrIGZvciBwcm9wZXIgbWVtb3J5IG1hbmFnZW1lbnQKKwlhbmQgT09NIGhhbmRsaW5nLgorCisJKiBkYnVzL2RidXMtZGF0YXNsb3QuYzogcmVtb3ZlIHRoZSBtdXRleCBmcm9tCisJREJ1c0RhdGFTbG90QWxsb2NhdG9yIGFuZCBsb2NrIGl0IG1hbnVhbGx5IHdoZW4gdXNpbmcgaXQsCisJdG8gc2ltcGxpZnkgZml0dGluZyBpdCBpbnRvIHRoZSBnbG9iYWwgc2xvdHMgZnJhbWV3b3JrLgorCisJKiBkYnVzL2RidXMtdGhyZWFkcy5jIChpbml0X3N0YXRpY19sb2Nrcyk6IHJld29yayBob3cgd2UncmUKKwloYW5kbGluZyBnbG9iYWwgbG9ja3Mgc28gdGhleSBhcmUgZWFzaWx5IHNodXQgZG93bi4KKworCSogYnVzL3BvbGljeS5jIChidXNfcG9saWN5X2FwcGVuZF9ydWxlKTogZml4CisKKwkqIGJ1cy90ZXN0LW1haW4uYyAobWFpbik6IGNoZWNrIGZvciBtZW1sZWFrcworCisJKiBkYnVzL2RidXMtdGVzdC5jIChkYnVzX2ludGVybmFsX2RvX25vdF91c2VfcnVuX3Rlc3RzKTogbWFrZQorCXRlc3Qgc3VpdGUgY2hlY2sgZm9yIG1lbWxlYWtzCisKKwkqIGRidXMvZGJ1cy1tZW1vcnkuYzogYWRkIHN1cHBvcnQgaW4gdGVzdCBtb2RlIGZvciB0cmFja2luZworCW51bWJlciBvZiBvdXRzdGFuZGluZyBibG9ja3MKKworMjAwMy0wMy0yMyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogYnVzL3BvbGljeS5jLCBidXMvYnVzLmMsIGJ1cy9jb25uZWN0aW9uLmM6IGltcGxlbWVudCBhbGxvdy9kZW55CisJcG9saWNpZXMgY29kZQorCisJKiBkYnVzL2RidXMtaGFzaC5oOiBhZGQgVUxPTkcgaGFzaCBrZXlzCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMgKF9kYnVzX2dldF9ncm91cHMpOiBuZXcKKwkoX2RidXNfZ2V0X2dyb3VwX2lkKTogbmV3IGZ1bmN0aW9uCisKKzIwMDMtMDMtMjAgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jIChkYnVzX2Nvbm5lY3Rpb25fc2V0X3VuaXhfdXNlcl9mdW5jdGlvbik6CisJbmV3IGZ1bmN0aW9uCisJKGRidXNfY29ubmVjdGlvbl9nZXRfdW5peF91c2VyKTogbmV3IGZ1bmN0aW9uCisKKzIwMDMtMDMtMjAgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGJ1cy9jb25uZWN0aW9uLmMgKGJ1c19jb25uZWN0aW9uX3NlbmRfb29tX2Vycm9yKTogYXNzZXJ0IHRoYXQKKwltZXNzYWdlIGhhcyBhIHNlbmRlcgorCShjb25uZWN0aW9uX2V4ZWN1dGVfdHJhbnNhY3Rpb24pOiBkaXR0bworCShidXNfY29ubmVjdGlvbl9wcmVhbGxvY2F0ZV9vb21fZXJyb3IpOiBmaXggdG8gc2V0IHRoZSBzZW5kZXIsIGFuZAorCXNldCByZWNpcGllbnQgdG8gdGhlIGRlc3RpbmF0aW9uIHNlcnZpY2UsIG5vdCB0aGUgYnVzIGRyaXZlcgorCisJKiBidXMvcG9saWN5LmM6IGhhY2tpbmcKKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAoZGJ1c19tZXNzYWdlX3NlcnZpY2VfaXMpOiBuZXcgZnVuY3Rpb24KKwkoZGJ1c19tZXNzYWdlX3NlbmRlcl9pcyk6IG5ldworCisyMDAzLTAzLTE5ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogYnVzL3BvbGljeS5jOiBzdGFydCBza2V0Y2hpbmcgY29kZSBmb3IgcG9saWN5IHJlc3RyaWN0aW9ucyBvbgorCXdoYXQgY29ubmVjdGlvbnMgY2FuIGRvLgorCisyMDAzLTAzLTE4ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZG9jL1RPRE86IHNvbWUgbm90ZXMgb24gaGlnaC1sZXZlbCB0b2RvIGl0ZW1zLiBMaXR0bGUgbml0cGljaworCXN0dWZmIGlzIGFsbCBpbiBAdG9kbywgc28gbm8gbmVlZCB0byBhZGQgaXQgaGVyZS4KKworCSogZG9jL2NvbmZpZy1maWxlLnR4dDogc29tZSBub3RlcyBvbiBob3cgY29uZmlnIGZpbGUgbWlnaHQgbG9vaworCisyMDAzLTAzLTE4ICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogY29uZmlndXJlLmluOiAwLjYKKworCSogTkVXUzogVXBkYXRlLgorCisyMDAzLTAzLTE3ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLWludGVybmFscy5oOiBhZGQgZ2NjIGF0dHJpYnV0ZXMgc28gdGhhdAorCW91ciBwcmludGYtc3R5bGUgZnVuY3Rpb25zIHdhcm4gb24gYmFkIGFyZ3VtZW50cyB0bworCWZvcm1hdAorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jIChfZGJ1c19jb25uZWN0X3RjcF9zb2NrZXQpOiBmaXggcHJpbnRmCisJZm9ybWF0IGJ1ZworCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChfZGJ1c19tZXNzYWdlX2xvYWRlcl9xdWV1ZV9tZXNzYWdlcyk6IGZpeAorCXByaW50ZiBmb3JtYXQgYnVnCisKKzIwMDMtMDMtMTcgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBidXMvdGVzdC1tYWluLmMgKG1haW4pOiBtYWtlIGl0IHByaW50IHNvbWV0aGluZyBhcyBpdCBydW5zCisJc28gbWFrZSBjaGVjayBkb2Vzbid0IGxvb2sgc3R1Y2sKKworCSogZG9jL25lZ290aWF0aW9uLnR4dCwgZG9jL2RidXMtc2FzbC1wcm9maWxlLnR4dDogcmVtb3ZlCisJZnJvbSBDVlMsIG5vdyBvYnNvbGV0ZQorCisyMDAzLTAzLTE3ICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogYnVzL2Rpc3BhdGNoLmM6IChidXNfZGlzcGF0Y2gpOgorCVJlZmV0Y2ggdGhlIHNlcnZpY2UgbmFtZSBzaW5jZSBpdCBtYXkgaGF2ZSBiZWVuIHJlYWxsb2NhdGVkCisJd2hlbiBkYnVzX21lc3NhZ2Vfc2V0X3NlbmRlciB3YXMgY2FsbGVkLgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jOiAoX2RidXNfYWNjZXB0KToKKwlBZGQgYWRkcmVzcyBhbmQgYWRkcmVzcyBsZW5ndGggdmFyaWFibGVzIGFuZCB1c2UgdGhlbSB0byBzdG9wCisJdmFsZ3JpbmQgZnJvbSBjb21wbGFpbmluZy4KKworMjAwMy0wMy0xNyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCUFsbCB0ZXN0cyBwYXNzLCBubyBtZW1sZWFrcywgbm8gdmFsZ3JpbmQgY29tcGxhaW50cy4KKworCSogYnVzL3Rlc3QuYzogcmVmY291bnQgaGFuZGxlcl9zbG90CisKKwkqIGJ1cy9jb25uZWN0aW9uLmMgKGJ1c19jb25uZWN0aW9uc19uZXcpOiByZWZjb3VudAorCWNvbm5lY3Rpb25fZGF0YV9zbG90CisKKwkqIGRidXMvZGJ1cy1hdXRoLXNjcmlwdC5jIChfZGJ1c19hdXRoX3NjcmlwdF9ydW4pOiBkZWxldGUgdW51c2VkCisJYnl0ZXMgc28gdGhhdCBhdXRoIHNjcmlwdHMgcGFzcy4KKworCSogYnVzL2Rpc3BhdGNoLmM6IGluaXQgbWVzc2FnZV9oYW5kbGVyX3Nsb3Qgc28gaXQgZ2V0cyBhbGxvY2F0ZWQKKwlwcm9wZXJseQorCisJKiBidXMvZGlzcGF0Y2guYyAobWVzc2FnZV9oYW5kbGVyX3Nsb3RfcmVmKTogZml4IG1lbWxlYWsKKworCSogZGJ1cy9kYnVzLXNlcnZlci1kZWJ1Zy1waXBlLmMgKF9kYnVzX3NlcnZlcl9kZWJ1Z19waXBlX25ldyk6CisJZGVhbGxvYyBzZXJ2ZXJfcGlwZV9oYXNoIHdoZW4gbm8gbG9uZ2VyIHVzZWQgZm9yIGJlbmVmaXQgb2YKKwlsZWFrIGNoZWNraW5nCisKKwkqIGRidXMvZGJ1cy1hdXRoLmMgKHByb2Nlc3NfY29tbWFuZCk6IG1lbWxlYWsgZml4CisKKwkqIGJ1cy9kaXNwYXRjaC5jIChjaGVja19oZWxsb19tZXNzYWdlKTogbWVtbGVhayBmaXgKKworMjAwMy0wMy0xNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLWJ1cy5jIChlbnN1cmVfYnVzX2RhdGEpOiBmaXggZG91YmxlLXVucmVmIG9mIHRoZSBkYXRhIHNsb3QKKworMjAwMy0wMy0xNyAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGJ1cy9hY3RpdmF0aW9uLmMgKGJ1c19hY3RpdmF0aW9uX2FjdGl2YXRlX3NlcnZpY2UpOiBBcHBlbmQKKwl0aGUgcGVuZGluZyBhY3RpdmF0aW9uIGVudHJ5IHRvIHRoZSBsaXN0IG9mIHBlbmRpbmcgYWN0aXZhdGlvbnMuCisKKzIwMDMtMDMtMTYgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGJ1cy9kaXNwYXRjaC5jIChidXNfZGlzcGF0Y2hfdGVzdCk6IHJlbW92ZSBkb3VibGUtdW5yZWZzIG9mCisJY29ubmVjdGlvbnMKKworCSogZGJ1cy9kYnVzLWFkZHJlc3MuYyAoY3JlYXRlX2VudHJ5KTogZml4IE9PTSBoYW5kbGluZyB3aGVuCisJZmFpbGluZyB0byBhbGxvYyBlbnRyeS0+bWV0aG9kCisKKzIwMDMtMDMtMTYgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy13YXRjaC5jIChfZGJ1c193YXRjaF9uZXcpOiBoYW5kbGUgZmFpbHVyZSB0byBtYWxsb2MKKwl0aGUgd2F0Y2gKKworCSogZGJ1cy9kYnVzLXNlcnZlci1kZWJ1Zy1waXBlLmMgKF9kYnVzX3RyYW5zcG9ydF9kZWJ1Z19waXBlX25ldyk6CisJYWRkIHNvbWUgbWlzc2luZyBkYnVzX3NldF9yZXN1bHQKKworCSogYnVzL2Rpc3BhdGNoLmMgKGJ1c19kaXNwYXRjaF9hZGRfY29ubmVjdGlvbik6IGhhbmRsZSBmYWlsdXJlIHRvCisJYWxsb2MgdGhlIERCdXNNZXNzYWdlSGFuZGxlcgorCisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LmMgKF9kYnVzX3RyYW5zcG9ydF9kaXNjb25uZWN0KTogZG9uJ3QgcmVmCisJdGhlIHRyYW5zcG9ydCBoZXJlLCBzaW5jZSB3ZSBjYWxsIHRoaXMgZnJvbSB0aGUgZmluYWxpemVyOyBpdAorCXJlc3VsdGVkIGluIGEgZG91YmxlLWZpbmFsaXplLgorCisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LmMgKF9kYnVzX3RyYW5zcG9ydF9kaXNjb25uZWN0KTogZml4IGEgYnVnCisJd2hlcmUgd2UgdHJpZWQgdG8gdXNlIHRyYW5zcG9ydC0+Y29ubmVjdGlvbiB0aGF0IHdhcyBOVUxMLAorCWhhcHBlbmVkIHdoZW4gdHJhbnNwb3J0IHdhcyBkaXNjb25uZWN0ZWQgZWFybHkgb24gZHVlIHRvIE9PTQorCisJKiBidXMvKi5jOiBhZGFwdCB0byBoYW5kbGUgT09NIGZvciB3YXRjaGVzL3RpbWVvdXRzCisKKwkqIGRidXMvZGJ1cy10cmFuc3BvcnQtdW5peC5jOiBwb3J0IHRvIGhhbmRsZSBPT00gZHVyaW5nCisJd2F0Y2ggaGFuZGxpbmcKKworCSogZGJ1cy9kYnVzLWF1dGguYyAoX2RidXNfYXV0aF9nZXRfdW51c2VkX2J5dGVzKTogcmV0dXJuIGEKKwlyZWZlcmVuY2UgdG8gdW51c2VkIGJ5dGVzIGluc3RlYWQgb2YgYSBjb3B5CisKKwkqIGRidXMvZGJ1cy1zZXJ2ZXIuYyAoZGJ1c19zZXJ2ZXJfaGFuZGxlX3dhdGNoKTogcmV0dXJuIEZBTFNFIGZvcgorCW91dCBvZiBtZW1vcnkKKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYyAoZGJ1c19jb25uZWN0aW9uX2hhbmRsZV93YXRjaCk6IHJldHVybgorCUZBTFNFIG9uIE9PTQorCisJKiBkYnVzL2RidXMtdGltZW91dC5jIChkYnVzX3RpbWVvdXRfaGFuZGxlKTogcmV0dXJuIEZBTFNFIGZvciBvdXQKKwlvZiBtZW1vcnkKKworMjAwMy0wMy0xNiAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGRvYy9kYnVzLXNwZWNpZmljYXRpb24uc2dtbDoKKwlEb2N1bWVudCByZXBseSBtZXNzYWdlIGZvciBBY3RpdmF0ZVNlcnZpY2UuCisKKzIwMDMtMDMtMTYgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBidXMvYWN0aXZhdGlvbi5jOiAoYnVzX3BlbmRpbmdfYWN0aXZhdGlvbl9lbnRyeV9mcmVlKSwKKwkoYnVzX3BlbmRpbmdfYWN0aXZhdGlvbl9mcmVlKSwgKGJ1c19hY3RpdmF0aW9uX25ldyksCisJKGJ1c19hY3RpdmF0aW9uX3VucmVmKSwgKGJ1c19hY3RpdmF0aW9uX3NlcnZpY2VfY3JlYXRlZCksCisJKGJ1c19hY3RpdmF0aW9uX2FjdGl2YXRlX3NlcnZpY2UpOgorCSogYnVzL2FjdGl2YXRpb24uaDoKKwkqIGJ1cy9idXMuYzogKGJ1c19jb250ZXh0X25ldyk6CisJKiBidXMvZGVza3RvcC1maWxlLmM6IChuZXdfc2VjdGlvbik6CisJKiBidXMvZHJpdmVyLmM6IChidXNfZHJpdmVyX3NlbmRfc2VydmljZV9kZWxldGVkKSwKKwkoYnVzX2RyaXZlcl9oYW5kbGVfYWN0aXZhdGVfc2VydmljZSk6CisJKiBidXMvc2VydmljZXMuYzogKGJ1c19yZWdpc3RyeV9uZXcpLCAoYnVzX3JlZ2lzdHJ5X2Vuc3VyZSk6CisJKiBidXMvc2VydmljZXMuaDoKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmM6CisJKGRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHlfYW5kX2Jsb2NrKToKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmM6IChkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3NfdmFsaXN0KToKKwkqIGRidXMvZGJ1cy1wcm90b2NvbC5oOgorCU1ha2UgYWN0aXZhdGlvbiB3b3JrIGJldHRlci4gTm93IHBlbmRpbmcgYWN0aXZhdGlvbnMgd2lsbCBiZSBxdWV1ZWQKKwlhbmQgdGhlIGRhZW1vbiB3b24ndCB0cnkgdG8gYWN0aXZhdGUgc2VydmljZXMgdGhhdCBhcmUgYWxyZWFkeSByZWdpc3RlcmVkLgorCisyMDAzLTAzLTE2ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtYnVzLmMgKGVuc3VyZV9idXNfZGF0YSk6IGhhbmRsZSBmYWlsdXJlIHRvIHNldAorCWNvbm5lY3Rpb24gZGF0YQorCisJKiBkYnVzL2RidXMtbWVtb3J5LmMgKF9kYnVzX2luaXRpYWxpemVfbWFsbG9jX2RlYnVnKTogc3VwcG9ydAorCURCVVNfTUFMTE9DX0JBQ0tUUkFDRVMgdG8gcHJpbnQgdHJhY2Ugd2hlbiBmYWlsaW5nIGFuIGFsbG9jCisKKzIwMDMtMDMtMTYgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy1zdHJpbmcuYyAoX2RidXNfc3RyaW5nX3ZhbGlkYXRlX3V0ZjgpOiBvb3BzLCB1bmJyZWFrCisJdGhpcy4gYWx3YXlzIHJ1biB0aGUgdGVzdCBzdWl0ZSBiZWZvcmUgY29tbWl0Li4uCisKKwkqIGJ1cy8qOiBhZGFwdCB0byBEQnVzQ29ubmVjdGlvbiBBUEkgY2hhbmdlcworCisJKiBnbGliL2RidXMtZ21haW4uYzogYWRhcHQgdG8gREJ1c0Nvbm5lY3Rpb24gQVBJIGNoYW5nZXMsCisJcmVxdWlyZXMgcmVuYW1pbmcgc3R1ZmYgdG8gYXZvaWQgZGJ1c19jb25uZWN0aW9uX2Rpc3BhdGNoIG5hbWUKKwljb25mbGljdC4KKworCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC5jIChfZGJ1c190cmFuc3BvcnRfcXVldWVfbWVzc2FnZXMpOiBuZXcKKwlmdW5jdGlvbgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChfZGJ1c19tZXNzYWdlX2xvYWRlcl9xdWV1ZV9tZXNzYWdlcyk6CisJc2VwYXJhdGUgZnJvbSBfZGJ1c19tZXNzYWdlX2xvYWRlcl9yZXR1cm5fYnVmZmVyKCkKKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYyAoZGJ1c19jb25uZWN0aW9uX2dldF9uX21lc3NhZ2VzKTogcmVtb3ZlCisJdGhpcywgYmVjYXVzZSBpdCdzIG5vdyBhbHdheXMgYnJva2VuIHRvIHVzZTsgdGhlIG51bWJlciBvZgorCW1lc3NhZ2VzIGluIHF1ZXVlIHZzLiB0aGUgbnVtYmVyIHN0aWxsIGJ1ZmZlcmVkIGJ5IHRoZSBtZXNzYWdlCisJbG9hZGVyIGlzIHVuZGVmaW5lZC9tZWFuaW5nbGVzcy4gU2hvdWxkIHVzZQorCWRidXNfY29ubmVjdGlvbl9nZXRfZGlzcGF0Y2hfc3RhdGUoKS4KKwkoZGJ1c19jb25uZWN0aW9uX2Rpc3BhdGNoKTogcmVuYW1lIGZyb20KKwlkYnVzX2Nvbm5lY3Rpb25fZGlzcGF0Y2hfbWVzc2FnZQorCisyMDAzLTAzLTE2ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtc3RyaW5nLmMgKF9kYnVzX3N0cmluZ192YWxpZGF0ZV91dGY4KTogY29weSBpbiBhIHJlYWwKKwlpbXBsZW1lbnRhdGlvbgorCisyMDAzLTAzLTE2ICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYzoKKwkoZGJ1c19jb25uZWN0aW9uX3NlbmRfd2l0aF9yZXBseV9hbmRfYmxvY2spOgorCURlY3JlYXNlIGNvbm5lY3Rpb24tPm5faW5jb21pbmcgd2hlbiByZW1vdmluZyBhbiBlbnRyeQorCWZyb20gdGhlIGxpc3QuCisJKiBkYnVzL2RidXMtZGljdC5jOiAoZGJ1c19kaWN0X2VudHJ5X2ZyZWUpLAorCShkYnVzX2RpY3Rfc2V0X2Jvb2xlYW5fYXJyYXkpLCAoZGJ1c19kaWN0X3NldF9pbnQzMl9hcnJheSksCisJKGRidXNfZGljdF9zZXRfdWludDMyX2FycmF5KSwgKGRidXNfZGljdF9zZXRfZG91YmxlX2FycmF5KSwKKwkoZGJ1c19kaWN0X3NldF9ieXRlX2FycmF5KSwgKGRidXNfZGljdF9zZXRfc3RyaW5nX2FycmF5KSwKKwkoZGJ1c19kaWN0X2dldF9ib29sZWFuX2FycmF5KSwgKGRidXNfZGljdF9nZXRfZG91YmxlX2FycmF5KSwKKwkoZGJ1c19kaWN0X2dldF9ieXRlX2FycmF5KToKKwlIYW5kbGUgTlVMTCBhcnJheXMgYW5kIHN0cmluZ3MuIEFsc28gYWRkIHN1cHBvcnQgZm9yIGJ5dGUgYXJyYXlzLgorCisJKiBkYnVzL2RidXMtbWFyc2hhbC5jOiAoX2RidXNfbWFyc2hhbF9ieXRlX2FycmF5KSwKKwkoX2RidXNfbWFyc2hhbF9kaWN0KSwgKF9kYnVzX2RlbWFyc2hhbF9ieXRlX2FycmF5KSwKKwkoX2RidXNfZGVtYXJzaGFsX2ludDMyX2FycmF5KSwgKF9kYnVzX2RlbWFyc2hhbF91aW50MzJfYXJyYXkpLAorCShfZGJ1c19kZW1hcnNoYWxfZG91YmxlX2FycmF5KSwgKF9kYnVzX2RlbWFyc2hhbF9zdHJpbmdfYXJyYXkpLAorCShfZGJ1c19kZW1hcnNoYWxfZGljdCksIChkZW1hcnNoYWxfYW5kX3ZhbGlkYXRlX2xlbiksCisJKF9kYnVzX21hcnNoYWxfdmFsaWRhdGVfYXJnKSwgKF9kYnVzX21hcnNoYWxfdGVzdCk6CisJKiBkYnVzL2RidXMtbWFyc2hhbC5oOgorCUFkZCBzdXBwb3J0IGZvciBtYXJzaGFsbGluZyBhbmQgZGVtYXJzaGFsbGluZyBlbXB0eSBhcnJheXMgYW5kIHN0cmluZ3MuCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmM6IChkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3NfdmFsaXN0KSwKKwkoZGJ1c19tZXNzYWdlX2FwcGVuZF9zdHJpbmdfYXJyYXkpLAorCShkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYm9vbGVhbiksCisJKGRidXNfbWVzc2FnZV9pdGVyX2dldF9ib29sZWFuX2FycmF5KSwKKwkoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2ludDMyX2FycmF5KSwKKwkoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X3VpbnQzMl9hcnJheSksCisJKGRidXNfbWVzc2FnZV9pdGVyX2dldF9kb3VibGVfYXJyYXkpLAorCShkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYnl0ZV9hcnJheSksCisJKGRidXNfbWVzc2FnZV9pdGVyX2dldF9zdHJpbmdfYXJyYXkpLCAoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2RpY3QpLAorCShjaGVja19tZXNzYWdlX2hhbmRsaW5nKToKKwlBZGQgc3VwcG9ydCBmb3IgZ2V0dGluZyBlbXB0eSBhcnJheXMgYW5kIGRpY3RzLgorCisJKiBkYnVzL2RidXMtc3RyaW5nLmM6IChfZGJ1c19zdHJpbmdfdmFsaWRhdGVfdXRmOCk6CisJRG9uJ3QgZG8gYW55IHZhbGlkYXRpb24gYXQgYWxsIGZvciBub3csIHRoYXQncyBiZXR0ZXIgdGhhbiBqdXN0IGNoZWNraW5nCisJZm9yIEFTQ0lJLgorCisJKiB0ZXN0L2RhdGEvdmFsaWQtbWVzc2FnZXMvZW1wdGluZXNzLm1lc3NhZ2U6CisJTmV3IHRlc3QgbWVzc2FnZSB3aXRoIGxvdHMgb2YgZW1wdHkgYXJyYXlzLgorCisyMDAzLTAzLTE2ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jCisJKF9kYnVzX2Nvbm5lY3Rpb25fcXVldWVfcmVjZWl2ZWRfbWVzc2FnZV9saW5rKTogbmV3IGZ1bmN0aW9uIHRoYXQKKwljYW4ndCBmYWlsIGR1ZSB0byBPT00KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAoX2RidXNfbWVzc2FnZV9sb2FkZXJfcG9wX21lc3NhZ2VfbGluayk6CisJbmV3IGZ1bmN0aW9uIHBvcHMgYSBtZXNzYWdlIHRvZ2V0aGVyIHdpdGggYSBsaXN0IGxpbmsKKwljb250YWluaW5nIGl0LgorCisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LXVuaXguYyAocXVldWVfbWVzc2FnZXMpOiB1c2UgbmV3IGxpbmstYmFzZWQKKwltZXNzYWdlIHF1ZXVpbmcgZnVuY3Rpb25zIHRvIGF2b2lkIG5lZWRpbmcgdG8gYWxsb2MgbWVtb3J5CisKKzIwMDMtMDMtMTYgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwlPb3BzIC0gdGVzdCBjb2RlIHdhcyBvbmx5IHRlc3RpbmcgZmFpbHVyZSBvZiBhcm91bmQgMzAgb2YgdGhlCisJbWFsbG9jcyBpbiB0aGUgdGVzdCBwYXRoLCBidXQgaXQgdHVybnMgb3V0IHRoZXJlIGFyZSA1MDArCisJbWFsbG9jcy4gSSBiZWxpZXZlIHRoaXMgd2FzIGR1ZSB0byBtaXNndWlkZWQgbGlua2luZyBzZXR1cCBzdWNoCisJdGhhdCB0aGVyZSB3YXMgb25lIGNvcHkgb2YgZGJ1c19tYWxsb2MgZXRjLiBpbiB0aGUgZGFlbW9uIGFuZCBvbmUKKwlpbiB0aGUgc2hhcmVkIGxpYiwgYW5kIG9ubHkgZGFlbW9uIG1hbGxvY3Mgd2VyZSB0ZXN0ZWQuIEluIGFueQorCWNhc2UsIHRoZSB0ZXN0IGNhc2Ugbm93IHRlc3RzIGFsbCA1MDArIG1hbGxvY3MsIGFuZCBkb2Vzbid0IHBhc3MKKwl5ZXQsIHRob3VnaCB0aGVyZSBhcmUgbG90cyBvZiBmaXhlcyBpbiB0aGlzIHBhdGNoLgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jIChkYnVzX2Nvbm5lY3Rpb25fZGlzcGF0Y2hfbWVzc2FnZSk6IGZpeAorCXRoaXMgc28gdGhhdCBpdCBkb2Vzbid0IG5lZWQgdG8gYWxsb2NhdGUgbWVtb3J5LCBzaW5jZSBpdAorCWhhcyBubyB3YXkgb2YgaW5kaWNhdGluZyBmYWlsdXJlIGR1ZSB0byBPT00gKGFuZCB3b3VsZCBiZQorCWFubm95aW5nIGlmIGl0IGRpZCkuCisKKwkqIGRidXMvZGJ1cy1saXN0LmMgKF9kYnVzX2xpc3RfcG9wX2ZpcnN0X2xpbmspOiBuZXcgZnVuY3Rpb24KKworCSogYnVzL01ha2VmaWxlLmFtOiByZWFycmFuZ2UgdG8gY3JlYXRlIHR3byBzZWxmLWNvbnRhaW5lZAorCWxpYnJhcmllcywgdG8gYXZvaWQgaGF2aW5nIGxpYnJhcmllcyB3aXRoIG92ZXJsYXBwaW5nIHN5bWJvbHMuCisJdGhhdCB3YXMgcmVzdWx0aW5nIGluIHdlaXJkbmVzcywgZS5nLiBJJ20gcHJldHR5IHN1cmUgdGhlcmUKKwl3ZXJlIHR3byBjb3BpZXMgb2YgZ2xvYmFsIHN0YXRpYyB2YXJpYWJsZXMuCisKKwkqIGRidXMvZGJ1cy1pbnRlcm5hbHMuYzogbW92ZSB0aGUgbWFsbG9jIGRlYnVnIHN0dWZmIHRvCisJZGJ1cy1tZW1vcnkuYworCisJKiBkYnVzL2RidXMtbGlzdC5jIChmcmVlX2xpbmspOiBmcmVlIGxpc3QgbWVtcG9vbCBpZiBpdCBiZWNvbWVzCisJZW1wdHkuCisKKwkqIGRidXMvZGJ1cy1tZW1vcnkuYyAoX2RidXNfZGlzYWJsZV9tZW1fcG9vbHMpOiBuZXcgZnVuY3Rpb24KKworCSogZGJ1cy9kYnVzLWFkZHJlc3MuYyAoZGJ1c19wYXJzZV9hZGRyZXNzKTogZnJlZSBsaXN0IG5vZGVzCisJb24gZmFpbHVyZS4KKworCSogYnVzL2Rpc3BhdGNoLmMgKGJ1c19kaXNwYXRjaF9hZGRfY29ubmVjdGlvbik6IGZyZWUKKwltZXNzYWdlX2hhbmRsZXJfc2xvdCB3aGVuIG5vIGxvbmdlciB1c2luZyBpdCwgc28KKwltZW1vcnkgbGVhayBjaGVja2VycyBhcmUgaGFwcHkgZm9yIHRoZSB0ZXN0IHN1aXRlLgorCisJKiBkYnVzL2RidXMtc2VydmVyLWRlYnVnLXBpcGUuYyAoZGVidWdfZmluYWxpemUpOiBmcmVlIHNlcnZlciBuYW1lCisKKwkqIGJ1cy9idXMuYyAobmV3X2Nvbm5lY3Rpb25fY2FsbGJhY2spOiBkaXNjb25uZWN0IGluIGhlcmUgaWYKKwlidXNfY29ubmVjdGlvbnNfc2V0dXBfY29ubmVjdGlvbiBmYWlscy4KKworCSogYnVzL2Nvbm5lY3Rpb24uYyAoYnVzX2Nvbm5lY3Rpb25zX3VucmVmKTogZml4IHRvIGZyZWUgdGhlCisJY29ubmVjdGlvbnMKKwkoYnVzX2Nvbm5lY3Rpb25zX3NldHVwX2Nvbm5lY3Rpb24pOiBpZiB0aGlzIGZhaWxzLCBkb24ndAorCWRpc2Nvbm5lY3QgdGhlIGNvbm5lY3Rpb24sIGp1c3QgYmUgc3VyZSB0aGVyZSBhcmUgbm8gc2lkZQorCWVmZmVjdHMuCisKKwkqIGRidXMvZGJ1cy1zdHJpbmcuYyAodW5kb19hbGlnbm1lbnQpOiB1bmJyZWFrIHRoaXMKKworCSogZGJ1cy9kYnVzLWF1dGguYyAoX2RidXNfYXV0aF91bnJlZik6IGZyZWUgc29tZSBzdHVmZiB3ZSB3ZXJlCisJbGVha2luZworCShfZGJ1c19hdXRoX25ldyk6IGZpeCB0aGUgb3JkZXIgaW4gd2hpY2ggd2UgZnJlZSBzdHJpbmdzCisJb24gT09NIGZhaWx1cmUKKworCSogYnVzL2Nvbm5lY3Rpb24uYyAoYnVzX2Nvbm5lY3Rpb25fZGlzY29ubmVjdGVkKTogZml4IHRvCisJbm90IHNlbmQgU2VydmljZURlbGV0ZWQgbXVsdGlwbGUgdGltZXMgaW4gY2FzZSBvZiBtZW1vcnkKKwlhbGxvY2F0aW9uIGZhaWx1cmUKKworCSogZGJ1cy9kYnVzLWJ1cy5jIChkYnVzX2J1c19nZXRfYmFzZV9zZXJ2aWNlKTogbmV3IGZ1bmN0aW9uIHRvCisJZ2V0IHRoZSBiYXNlIHNlcnZpY2UgbmFtZQorCShkYnVzX2J1c19yZWdpc3Rlcl9jbGllbnQpOiBkb24ndCByZXR1cm4gYmFzZSBzZXJ2aWNlIG5hbWUsCisJaW5zdGVhZCBzdG9yZSBpdCBvbiB0aGUgREJ1c0Nvbm5lY3Rpb24gYW5kIGhhdmUgYW4gYWNjZXNzb3IKKwlmdW5jdGlvbiBmb3IgaXQuCisJKGRidXNfYnVzX3JlZ2lzdGVyX2NsaWVudCk6IHJlbmFtZSBkYnVzX2J1c19yZWdpc3RlcigpCisKKwkqIGJ1cy9kaXNwYXRjaC5jIChjaGVja19oZWxsb19tZXNzYWdlKTogdmVyaWZ5IHRoYXQgb3RoZXIKKwljb25uZWN0aW9ucyBvbiB0aGUgYnVzIGFsc28gZ290IHRoZSBjb3JyZWN0IHJlc3VsdHMsIG5vdAorCWp1c3QgdGhlIG9uZSBzZW5kaW5nIGhlbGxvCisKKzIwMDMtMDMtMTUgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwlNYWtlIGl0IHBhc3MgdGhlIEhlbGxvIGhhbmRsaW5nIHRlc3QgaW5jbHVkaW5nIGFsbCBPT00gY29kZXBhdGhzLgorCU5vdyB0byBkbyBvdGhlciBtZXNzYWdlcy4uLgorCisJKiBidXMvc2VydmljZXMuYyAoYnVzX3NlcnZpY2VfcmVtb3ZlX293bmVyKTogZml4IGNyYXNoIHdoZW4KKwlyZW1vdmluZyBvd25lciBmcm9tIGFuIGVtcHR5IGxpc3Qgb2Ygb3duZXJzCisJKGJ1c19yZWdpc3RyeV9lbnN1cmUpOiBkb24ndCBsZWF2ZSBzZXJ2aWNlIGluIHRoZSBsaXN0IG9mCisJYSBjb25uZWN0aW9uJ3Mgb3duZWQgc2VydmljZXMgaWYgd2UgZmFpbCB0byBwdXQgdGhlIHNlcnZpY2UKKwlpbiB0aGUgaGFzaCB0YWJsZS4KKworCSogYnVzL2Nvbm5lY3Rpb24uYyAoYnVzX2Nvbm5lY3Rpb25fcHJlYWxsb2NhdGVfb29tX2Vycm9yKTogc2V0CisJZXJyb3IgZmxhZyBvbiB0aGUgT09NIGVycm9yLgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jIChfZGJ1c19jb25uZWN0aW9uX25ld19mb3JfdHJhbnNwb3J0KToKKwloYW5kbGUgX2RidXNfdHJhbnNwb3J0X3NldF9jb25uZWN0aW9uIGZhaWx1cmUKKworCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC11bml4LmMgKF9kYnVzX3RyYW5zcG9ydF9uZXdfZm9yX2ZkKTogbW9kaWZ5CisJdG8gY3JlYXRlIHdhdGNoZXMgdXAgZnJvbnQgYW5kIHNpbXBseSBlbmFibGUvZGlzYWJsZSB0aGVtIGFzCisJbmVlZGVkLgorCSh1bml4X2Nvbm5lY3Rpb25fc2V0KTogdGhpcyBjYW4gbm93IGZhaWwgb24gT09NCisKKwkqIGRidXMvZGJ1cy10aW1lb3V0LmMsIGRidXMvZGJ1cy13YXRjaC5jOiBhZGQgY29uY2VwdAorCW9mIGVuYWJsaW5nL2Rpc2FibGluZyBhIHdhdGNoIG9yIHRpbWVvdXQuCisKKwkqIGJ1cy9sb29wLmMgKGJ1c19sb29wX2l0ZXJhdGUpOiBkb24ndCB0b3VjaCBkaXNhYmxlZAorCXdhdGNoZXMvdGltZW91dHMKKworCSogZ2xpYi9kYnVzLWdtYWluLmM6IGFkYXB0IHRvIGVuYWJsZS9kaXNhYmxlIHdhdGNoZXMgYW5kIHRpbWVvdXRzCisKKzIwMDMtMDMtMTUgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGJ1cy9kaXNwYXRjaC5jIChidXNfZGlzcGF0Y2hfdGVzdCk6IE9LLCBub3cgZmluYWxseSBhY3R1YWxseQorCXdyaXRlIHVzZWZ1bCB0ZXN0IGNvZGUsIGFmdGVyIGFsbCB0aGF0IGZ1dHppbmcgYXJvdW5kIDstKQorCisJVGVzdCBkb2VzIG5vdCB5ZXQgcGFzcyBiZWNhdXNlIHdlIGNhbid0IGhhbmRsZSBPT00gaW4KKwlfZGJ1c190cmFuc3BvcnRfbWVzc2FnZXNfcGVuZGluZyAoYmFzaWNhbGx5LAorCWRidXNfY29ubmVjdGlvbl9wcmVhbGxvY2F0ZV9zZW5kKCkgZG9lcyBub3QgcHJlYWxsb2MgdGhlIHdyaXRlCisJd2F0Y2gpLiBUbyBmaXggdGhpcywgSSB0aGluayB3ZSBuZWVkIHRvIGFkZCBuZXcgc3R1ZmYgdG8KKwlzZXRfd2F0Y2hfZnVuY3Rpb25zLCBuYW1lbHkgYSBTZXRFbmFibGVkIGZ1bmN0aW9uIHNvIHdlIGNhbiBhbGxvYworCXRoZSB3YXRjaCBlYXJsaWVyLCB0aGVuIGVuYWJsZSBpdCBsYXRlci4KKworCSogZGJ1cy9NYWtlZmlsZS5hbSAobGliZGJ1c19jb252ZW5pZW5jZV9sYV9TT1VSQ0VTKTogbW92ZQorCWRidXMtbWVtb3J5LmMgdG8gdGhlIGNvbnZlbmllbmNlIGxpYgorCisJKiBidXMvdGVzdC5jOiByZW5hbWUgc29tZSBzdGF0aWMgZnVuY3Rpb25zIHRvIGtlZXAgdGhlbSBjbGVhcmx5CisJZGlzdGluY3QgZnJvbSBzdHVmZiBpbiBjb25uZWN0aW9uLmMuIEhhbmRsZSBjbGllbnQgZGlzY29ubmVjdGlvbi4KKworMjAwMy0wMy0xNCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogYnVzL2Rpc3BhdGNoLmMgKGJ1c19kaXNwYXRjaF90ZXN0KTogZG8gdGVzdCB1c2luZyBkZWJ1Zy1waXBlCisJdHJhbnNwb3J0LCB0ZXN0cyBtb3JlIG9mIHRoZSByZWFsIGNvZGVwYXRoLiBTZXQgdXAgY2xpZW50cworCXdpdGggYnVzX3NldHVwX2RlYnVnX2NsaWVudC4KKworCSogYnVzL3Rlc3QuYyAoYnVzX3NldHVwX2RlYnVnX2NsaWVudCk6IGZ1bmN0aW9uIHRvIHNldCB1cCBkZWJ1ZworCSJjbGllbnRzIiBvbiB0aGUgbWFpbiBsb29wCisKKwkqIGRidXMvZGJ1cy10cmFuc3BvcnQuYyAoX2RidXNfdHJhbnNwb3J0X29wZW4pOiBhZGQgZGVidWctcGlwZQorCXN1cHBvcnQKKworCSogZGJ1cy9kYnVzLXNlcnZlci5jIChkYnVzX3NlcnZlcl9saXN0ZW4pOiBhZGQgZGVidWctcGlwZQorCXNlcnZlciB0eXBlCisKKwkqIGRidXMvZGJ1cy1zZXJ2ZXItZGVidWcuYzogc3VwcG9ydCBhIGRlYnVnIHNlcnZlciBiYXNlZCBvbiBwaXBlcworCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jIChfZGJ1c19mdWxsX2R1cGxleF9waXBlKTogbmV3IGZ1bmN0aW9uCisJKF9kYnVzX2Nsb3NlKTogbmV3IGZ1bmN0aW9uCisKKwkqIGNvbmZpZ3VyZS5pbjogY2hlY2sgZm9yIHNvY2tldHBhaXIKKworMjAwMy0wMy0xNCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1tZW1vcnkuYzogYWRkIGEgImRldGVjdCBidWZmZXIgb3ZlcndyaXRlcyBvbiBmcmVlIgorCWNoZWVzeSBoYWNrCisKKwkqIGRidXMvZGJ1cy10cmFuc3BvcnQtZGVidWcuYzogcmV3b3JrIHRoaXMgYSBnb29kIGJpdCB0byBiZQorCWxlc3MgY29tcGxpY2F0ZWQuIGhvcGVmdWxseSBzdGlsbCB3b3Jrcy4KKworCSogZGJ1cy9kYnVzLXNlcnZlci1kZWJ1Zy5jIChoYW5kbGVfbmV3X2NsaWVudCk6IHJlbW92ZSB0aW1lb3V0CisJbWFudWFsbHkKKworCSogZ2xpYi9kYnVzLWdtYWluLmMgKHRpbWVvdXRfaGFuZGxlcik6IGRvbid0IHJlbW92ZSB0aW1lb3V0CisJYWZ0ZXIgcnVubmluZyBpdAorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChkYnVzX21lc3NhZ2VfY29weSk6IHJlbmFtZSBmcm9tCisJZGJ1c19tZXNzYWdlX25ld19mcm9tX21lc3NhZ2UsIGZpeCBpdCB1cCB0byBjb3B5CisJYWxsIHRoZSBtZXNzYWdlIGZpZWxkcywgYWRkIHRlc3QgY2FzZQorCisJKiBidXMvZGlzcGF0Y2guYyAoYnVzX2Rpc3BhdGNoX3Rlc3QpOiBhZGQgc29tZSBtb3JlIHRlc3QgY29kZSwKKwlub3QgcXVpdGUgcGFzc2luZyB5ZXQKKworMjAwMy0wMy0xNCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogYnVzL2xvb3AuYyAoYnVzX2xvb3BfaXRlcmF0ZSk6IGFkZCB0aGlzIHNvIHdlIGNhbiAicnVuIGxvb3AKKwl1bnRpbCBubyB3b3JrIHJlbWFpbnMiIGluIHRlc3QgY29kZS4gKHRoZSBsYXJnZSBkaWZmIGhlcmUKKwlpcyBqdXN0IGNvZGUgbW92ZW1lbnQsIG5vIGFjdHVhbCBjaGFuZ2VzKQorCisJKiBkYnVzL2RidXMtc2VydmVyLWRlYnVnLmMgKERFRkFVTFRfSU5URVJWQUwpOiBjaGFuZ2UgaW50ZXJ2YWwgdG8KKwkxLCBubyBwb2ludCB3YWl0aW5nIGFyb3VuZCBmb3IgdGVzdCBjb2RlLgorCShfZGJ1c19zZXJ2ZXJfZGVidWdfYWNjZXB0X3RyYW5zcG9ydCk6IHVucmVmIHRoZSB0aW1lb3V0CisJYWZ0ZXIgYWRkaW5nIGl0IChyaWdodD8pCisKKwkqIGRidXMvZGJ1cy10cmFuc3BvcnQtZGVidWcuYyAoREVGQVVMVF9JTlRFUlZBTCk6IGRpdHRvCisKKzIwMDMtMDMtMTMgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtdGltZW91dC5jIChfZGJ1c190aW1lb3V0X2xpc3Rfc2V0X2Z1bmN0aW9ucyk6IGhhbmRsZQorCW91dCBvZiBtZW1vcnkKKworCSogZGJ1cy9kYnVzLXdhdGNoLmMgKF9kYnVzX3dhdGNoX2xpc3Rfc2V0X2Z1bmN0aW9ucyk6IGhhbmRsZSBvdXQKKwlvZiBtZW1vcnkKKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uaDogTWFrZSBBZGRXYXRjaEZ1bmN0aW9uIGFuZAorCUFkZFRpbWVvdXRGdW5jdGlvbiByZXR1cm4gYSBib29sIHNvIHRoZXkgY2FuIGZhaWwgb24gb3V0LW9mLW1lbW9yeQorCisJKiBidXMvYnVzLmMgKGJ1c19jb250ZXh0X25ldyk6IHNldCB1cCB0aW1lb3V0IGhhbmRsZXJzCisKKwkqIGJ1cy9jb25uZWN0aW9uLmMgKGJ1c19jb25uZWN0aW9uc19zZXR1cF9jb25uZWN0aW9uKTogc2V0IHVwCisJdGltZW91dCBoYW5kbGVycworCisJKiBnbGliL2RidXMtZ21haW4uYzogYWRhcHQgdG8gdGhlIGZhY3QgdGhhdCBzZXRfZnVuY3Rpb25zIHN0dWZmCisJY2FuIGZhaWwKKworCSogYnVzL2J1cy5jIChidXNfY29udGV4dF9uZXcpOiBhZGFwdCB0byBjaGFuZ2VzCisKKwkqIGJ1cy9jb25uZWN0aW9uLmM6IGFkYXB0IHRvIGNoYW5nZXMKKworCSogdGVzdC93YXRjaC5jOiBhZGFwdCB0byBEQnVzV2F0Y2ggY2hhbmdlcworCisJKiBidXMvZGlzcGF0Y2guYyAoYnVzX2Rpc3BhdGNoX3Rlc3QpOiBzdGFydGVkIGFkZGluZyB0aGlzIGJ1dAorCWRpZG4ndCBmaW5pc2gKKworMjAwMy0wMy0xNCAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGJ1cy9kaXNwYXRjaC5jIChzZW5kX3NlcnZpY2Vfbm9uZXhpc3RlbnRfZXJyb3IpOiBGaXggdHlwby4KKworMjAwMy0wMy0xMyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogYnVzL3Rlc3QuYywgYnVzL3Rlc3QuaCwgYnVzL01ha2VmaWxlLmFtLCBidXMvdGVzdC1tYWluLmM6CisJc2V0IHVwIGEgdGVzdCBmcmFtZXdvcmsgYXMgZm9yIHRoZSBsaWJyYXJ5CisKKzIwMDMtMDMtMTIgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwlUaHJvdWdob3V0OiBwdXJnZSBnbG9iYWwgdmFyaWFibGVzLCBpbnRyb2R1Y2UgQnVzQWN0aXZhdGlvbiwKKwlCdXNDb25uZWN0aW9ucywgQnVzUmVnaXN0cnksIGV0Yy4gb2JqZWN0cyBpbnN0ZWFkLgorCisJKiBidXMvYnVzLmgsIGJ1cy9idXMuYzogaW50cm9kdWNlIEJ1c0NvbnRleHQgYXMgYSBnbG9iYWwKKwltZXNzYWdlIGJ1cyBvYmplY3QKKworCSogdGVzdC9NYWtlZmlsZS5hbSAoVEVTVF9CSU5BUklFUyk6IGRpc2FibGUgYnVzLXRlc3QgZm9yIG5vdywKKwlnb2luZyB0byByZWRvIHRoaXMgYSBiaXQgZGlmZmVyZW50bHkgSSB0aGluaworCisyMDAzLTAzLTEyICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworICAgICAgICBNZWdhLXBhdGNoIHRoYXQgZ2V0cyB0aGUgbWVzc2FnZSBidXMgZGFlbW9uIGluaXRpYWxseSBoYW5kbGluZworCW91dC1vZi1tZW1vcnkuIFdvcmsgc3RpbGwgbmVlZGVkLiBBbHNvIGxvdHMgb2YgcmFuZG9tCisJbW92aW5nIHN0dWZmIHRvIERCdXNFcnJvciBpbnN0ZWFkIG9mIFJlc3VsdENvZGUuCisKKwkqIGRidXMvZGJ1cy1saXN0LmMgKF9kYnVzX2xpc3RfbGVuZ3RoX2lzX29uZSk6IG5ldyBmdW5jdGlvbgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jCisJKGRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHlfYW5kX2Jsb2NrKTogdXNlIERCdXNFcnJvcgorCisJKiBkYnVzL2RidXMtYnVzLmM6IGFkYXB0IHRvIEFQSSBjaGFuZ2VzLCBtYWtlIGl0IHVzZSBEQnVzRXJyb3Igbm90CisJREJ1c1Jlc3VsdENvZGUKKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYyAoZGJ1c19jb25uZWN0aW9uX3NlbmQpOiBkcm9wIHRoZSByZXN1bHQKKwljb2RlIGhlcmUsIGFzIHRoZSBvbmx5IGZhaWx1cmUgcG9zc2libGUgaXMgT09NLgorCisJKiBidXMvY29ubmVjdGlvbi5jIChidXNfY29ubmVjdGlvbl9kaXNjb25uZWN0KToKKwlyZW5hbWUgYnVzX2Nvbm5lY3Rpb25fZGlzY29ubmVjdGVkIGFzIGl0J3MgYSBub3RpZmljYXRpb24gb25seQorCisJKiBidXMvZHJpdmVyLmMgKGJ1c19kcml2ZXJfaGFuZGxlX2FjcXVpcmVfc2VydmljZSk6IGRvbid0IGZyZWUKKwkibmFtZSIgb24gZ2V0X2FyZ3MgZmFpbHVyZSwgc2hvdWxkIGJlIGRvbmUgYnkgZ2V0X2FyZ3M7CisJZG9uJ3QgZGlzY29ubmVjdCBjbGllbnQgZm9yIGJhZCBhcmdzLCBqdXN0IHJldHVybiBhbiBlcnJvci4KKwkoYnVzX2RyaXZlcl9oYW5kbGVfc2VydmljZV9leGlzdHMpOiBkaXR0bworCisJKiBidXMvc2VydmljZXMuYyAoYnVzX3NlcnZpY2VzX2xpc3QpOiBOVUxMLXRlcm1pbmF0ZSByZXR1cm5lZCBhcnJheQorCisJKiBidXMvZHJpdmVyLmMgKGJ1c19kcml2ZXJfc2VuZF9zZXJ2aWNlX2xvc3QpCisJKGJ1c19kcml2ZXJfc2VuZF9zZXJ2aWNlX2FjcXVpcmVkKTogc2VuZCBtZXNzYWdlcyBmcm9tIGRyaXZlciB0byBhCisJc3BlY2lmaWMgY2xpZW50IHRvIHRoZSBjbGllbnQncyB1bmlxdWUgbmFtZSwgbm90IHRvIHRoZSBicm9hZGNhc3QKKwlzZXJ2aWNlLgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChkZWNvZGVfaGVhZGVyX2RhdGEpOiByZWplY3QgbWVzc2FnZXMgdGhhdAorCWNvbnRhaW4gbm8gbmFtZSBmaWVsZAorCShfZGJ1c19tZXNzYWdlX2dldF9jbGllbnRfc2VyaWFsKTogcmVuYW1lIHRvCisJZGJ1c19tZXNzYWdlX2dldF9zZXJpYWwgYW5kIG1ha2UgcHVibGljCisJKF9kYnVzX21lc3NhZ2Vfc2V0X3NlcmlhbCk6IHJlbmFtZSBmcm9tIHNldF9jbGllbnRfc2VyaWFsCisJKF9kYnVzX21lc3NhZ2Vfc2V0X3JlcGx5X3NlcmlhbCk6IG1ha2UgcHVibGljCisJKF9kYnVzX21lc3NhZ2VfZ2V0X3JlcGx5X3NlcmlhbCk6IG1ha2UgcHVibGljCisKKwkqIGJ1cy9jb25uZWN0aW9uLmMgKGJ1c19jb25uZWN0aW9uX2ZvcmVhY2gpOiBhbGxvdyBzdG9wcGluZworCWl0ZXJhdGlvbiBieSByZXR1cm5pbmcgRkFMU0UgZnJvbSBmb3JlYWNoIGZ1bmN0aW9uLgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jIChkYnVzX2Nvbm5lY3Rpb25fc2VuZF9wcmVhbGxvY2F0ZWQpCisJKGRidXNfY29ubmVjdGlvbl9mcmVlX3ByZWFsbG9jYXRlZF9zZW5kKQorCShkYnVzX2Nvbm5lY3Rpb25fcHJlYWxsb2NhdGVfc2VuZCk6IG5ldyBBUEkgZm9yIHNlbmRpbmcgYSBtZXNzYWdlCisJd2l0aG91dCBwb3NzaWJpbGl0eSBvZiBtYWxsb2MgZmFpbHVyZS4KKwkoZGJ1c19jb25uZWN0aW9uX3NlbmRfbWVzc2FnZSk6IHJlbmFtZSB0byBqdXN0CisJZGJ1c19jb25uZWN0aW9uX3NlbmQgKGFuZCBzYW1lIGZvciB3aG9sZSBmdW5jdGlvbiBmYW1pbHkpCisKKwkqIGRidXMvZGJ1cy1lcnJvcnMuYyAoZGJ1c19lcnJvcl9mcmVlKTogbWFrZSB0aGlzIHJlaW5pdCB0aGUgZXJyb3IKKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYyAoX2RidXNfZXhpdCk6IG5ldyBmdW5jdGlvbgorCisJKiBidXMvYWN0aXZhdGlvbi5jOiBoYW5kbGUvcmV0dXJuIGVycm9ycworCisJKiBkYnVzL2RidXMtZXJyb3JzLmg6IGFkZCBtb3JlIERCVVNfRVJST1IgI2RlZmluZQorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jIChfZGJ1c19kaXJlY3Rvcnlfb3BlbikgKF9kYnVzX2ZpbGVfZ2V0X2NvbnRlbnRzKQorCShfZGJ1c19kaXJlY3RvcnlfZ2V0X25leHRfZmlsZSk6IHVzZSBEQnVzRXJyb3IgaW5zdGVhZCBvZiBEQnVzUmVzdWx0Q29kZQorCShfZGJ1c19yZXN1bHRfZnJvbV9lcnJubyk6IG1vdmUgdG8gdGhpcyBmaWxlCisKKzIwMDMtMDMtMTAgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBkYnVzL2RidXMtbWFyc2hhbC5jOgorCShfZGJ1c19tYXJzaGFsX3NldF9zdHJpbmcpOgorCVRha2UgYSBsZW5ndGggYXJndW1lbnQgc28gd2UgY2FuIG1hcnNoYWwgdGhlIGNvcnJlY3Qgc3RyaW5nCisJbGVuZ3RoLgorCisJKF9kYnVzX21hcnNoYWxfZGljdCksIChfZGJ1c19kZW1hcnNoYWxfZGljdCksCisJKF9kYnVzX21hcnNoYWxfZ2V0X2FyZ19lbmRfcG9zKSwgKF9kYnVzX21hcnNoYWxfdmFsaWRhdGVfYXJnKSwKKwkoX2RidXNfbWFyc2hhbF90ZXN0KToKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLmg6CisJQWRkIHN1cHBvcnQgZm9yIG1hcnNoYWxsaW5nIGFuZCBkZW1hcnNoYWxsaW5nIGRpY3RzLgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS1idWlsZGVyLmM6IChfZGJ1c19tZXNzYWdlX2RhdGFfbG9hZCk6CisJQWRkIHN1cHBvcnQgZm9yIFRZUEUgRElDVC4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYzogKHNldF9zdHJpbmdfZmllbGQpOgorCUFkanVzdCBoZWFkZXIgcGFkZGluZy4KKworCShkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3NfdmFsaXN0KSwgKGRidXNfbWVzc2FnZV9hcHBlbmRfZGljdCksCisJKGRidXNfbWVzc2FnZV9nZXRfYXJnc192YWxpc3QpLCAoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2FyZ190eXBlKSwKKwkoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2RpY3QpLCAoX2RidXNfbWVzc2FnZV9sb2FkZXJfcmV0dXJuX2J1ZmZlciksCisJKGNoZWNrX21lc3NhZ2VfaGFuZGxpbmcpLCAoY2hlY2tfaGF2ZV92YWxpZF9tZXNzYWdlKToKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmg6CisJQWRkIGZ1bmN0aW9ucyBmb3Igc2V0dGluZyBhbmQgZ2V0dGluZyBkaWN0cy4KKworCSogZGJ1cy9kYnVzLXByb3RvY29sLmg6CisJQWRkIERCVVNfVFlQRV9ESUNULgorCisJKiBkYnVzL2RidXMuaDoKKwlBZGQgZGJ1cy1kaWN0LmgKKworCSogZG9jL2RidXMtc3BlY2lmaWNhdGlvbi5zZ21sOgorCUFkZCBpbmZvcm1hdGlvbiBhYm91dCBob3cgZGljdHMgYXJlIG1hcnNoYWxsZWQuCisKKwkqIHRlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL2RpY3Qtd2l0aC1uaWwtdmFsdWUubWVzc2FnZToKKwkqIHRlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL3Rvby1zaG9ydC1kaWN0Lm1lc3NhZ2U6CisJKiB0ZXN0L2RhdGEvdmFsaWQtbWVzc2FnZXMvZGljdC1zaW1wbGUubWVzc2FnZToKKwkqIHRlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy9kaWN0Lm1lc3NhZ2U6CisJQWRkIHNhbXBsZSBtZXNzYWdlcyBjb250YWluaW5nIGRpY3RzLgorCisyMDAzLTAzLTA4ICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogZGJ1cy9kYnVzLWRpY3QuaDogQWRkIERCVVNfRU5EX0RFQ0xTLgorCisyMDAzLTAzLTA3ICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogZGJ1cy9NYWtlZmlsZS5hbToKKwkqIGRidXMvZGJ1cy1kaWN0LmM6IChkYnVzX2RpY3RfZW50cnlfZnJlZSksIChkYnVzX2RpY3RfbmV3KSwKKwkoZGJ1c19kaWN0X2dldF9rZXlzKSwgKGluc2VydF9lbnRyeSksIChkYnVzX2RpY3Rfc2V0X2Jvb2xlYW4pLAorCShkYnVzX2RpY3Rfc2V0X2ludDMyKSwgKGRidXNfZGljdF9zZXRfdWludDMyKSwKKwkoZGJ1c19kaWN0X3NldF9kb3VibGUpLCAoZGJ1c19kaWN0X3NldF9zdHJpbmcpLAorCShkYnVzX2RpY3Rfc2V0X2Jvb2xlYW5fYXJyYXkpLCAoZGJ1c19kaWN0X3NldF9pbnQzMl9hcnJheSksCisJKGRidXNfZGljdF9zZXRfdWludDMyX2FycmF5KSwgKGRidXNfZGljdF9zZXRfZG91YmxlX2FycmF5KSwKKwkoZGJ1c19kaWN0X3NldF9zdHJpbmdfYXJyYXkpLCAoX2RidXNfZGljdF90ZXN0KToKKwkqIGRidXMvZGJ1cy1kaWN0Lmg6CisJRml4IGFjY29yZGluZyB0byBjb21tZW50cyBmcm9tIEhhdm9jLgorCisyMDAzLTAzLTA2ICBNaWNoYWVsIE1lZWtzICA8bWljaGFlbEBzZXJ2ZXIuaG9tZT4KKworCSogY29uZmlndXJlLmluOiBpZiB3ZSBkb24ndCBoYXZlIGtkZS1jb25maWcsIGRpc2FibGUgaGF2ZV9xdC4KKworMjAwMy0wMy0wNyAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGRidXMvTWFrZWZpbGUuYW06CisJQWRkIGRidXMtZGljdC5bY2hdCisKKwkqIGRidXMvZGJ1cy1kaWN0LmM6IChkYnVzX2RpY3RfZW50cnlfZnJlZSksIChkYnVzX2RpY3RfbmV3KSwKKwkoZGJ1c19kaWN0X3JlZiksIChkYnVzX2RpY3RfdW5yZWYpLCAoZGJ1c19kaWN0X2NvbnRhaW5zKSwKKwkoZGJ1c19kaWN0X3JlbW92ZSksIChkYnVzX2RpY3RfZ2V0X3ZhbHVlX3R5cGUpLAorCShkYnVzX2RpY3RfZ2V0X2tleXMpLCAoZGJ1c19kaWN0X3B1dF9ib29sZWFuKSwKKwkoZGJ1c19kaWN0X3B1dF9pbnQzMiksIChkYnVzX2RpY3RfcHV0X3VpbnQzMiksCisJKGRidXNfZGljdF9wdXRfZG91YmxlKSwgKGRidXNfZGljdF9wdXRfc3RyaW5nKSwKKwkoZGJ1c19kaWN0X3B1dF9ib29sZWFuX2FycmF5KSwgKGRidXNfZGljdF9wdXRfaW50MzJfYXJyYXkpLAorCShkYnVzX2RpY3RfcHV0X3VpbnQzMl9hcnJheSksIChkYnVzX2RpY3RfcHV0X2RvdWJsZV9hcnJheSksCisJKGRidXNfZGljdF9wdXRfc3RyaW5nX2FycmF5KSwgKGRidXNfZGljdF9nZXRfYm9vbGVhbiksCisJKGRidXNfZGljdF9nZXRfaW50MzIpLCAoZGJ1c19kaWN0X2dldF91aW50MzIpLAorCShkYnVzX2RpY3RfZ2V0X2RvdWJsZSksIChkYnVzX2RpY3RfZ2V0X3N0cmluZyksCisJKGRidXNfZGljdF9nZXRfYm9vbGVhbl9hcnJheSksIChkYnVzX2RpY3RfZ2V0X2ludDMyX2FycmF5KSwKKwkoZGJ1c19kaWN0X2dldF91aW50MzJfYXJyYXkpLCAoZGJ1c19kaWN0X2dldF9kb3VibGVfYXJyYXkpLAorCShkYnVzX2RpY3RfZ2V0X3N0cmluZ19hcnJheSksIChfZGJ1c19kaWN0X3Rlc3QpOgorCSogZGJ1cy9kYnVzLWRpY3QuaDoKKwlBZGQgREJ1c0RpY3QgaW1wbGVtZW50YXRpb24KKworCSogZGJ1cy9kYnVzLXRlc3QuYzogKGRidXNfaW50ZXJuYWxfZG9fbm90X3VzZV9ydW5fdGVzdHMpOgorCSogZGJ1cy9kYnVzLXRlc3QuaDoKKwlBZGQgX2RidXNfZGljdF90ZXN0CisKKzIwMDMtMDMtMDQgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIHRlc3QvZGF0YS9hdXRoLyo6IGFkYXB0IHRvIGNoYW5nZXMKKworCSogZGJ1cy9kYnVzLWF1dGgtc2NyaXB0LmMgKF9kYnVzX2F1dGhfc2NyaXB0X3J1bik6IGFkZAorCVVTRVJJRF9CQVNFNjQgYW5kIGNoYW5nZSBVU0VSTkFNRV9CQVNFNjQgdG8gcHV0IGluIHVzZXJuYW1lIG5vdAorCXVzZXJpZAorCisJKiBkYnVzL2RidXMta2V5cmluZy5jIChfZGJ1c19rZXlyaW5nX3ZhbGlkYXRlX2NvbnRleHQpOiBwcmV2ZW50CisJbW9yZSBzdHVmZiBmcm9tIGJlaW5nIGluIGEgY29udGV4dCBuYW1lLCB0byBtYWtlIHRoZSBwcm90b2NvbAorCXNpbXBsZXIgdG8gZGVhbCB3aXRoCisKKwkqIGRidXMvZGJ1cy1lcnJvcnMuYyAoZGJ1c19lcnJvcl9oYXNfbmFtZSk6IG5ldyBmdW5jdGlvbgorCShkYnVzX2Vycm9yX2lzX3NldCk6IG5ldyBmdW5jdGlvbgorCisJKiBkYnVzL2RidXMtYXV0aC5jOiByZXBsYWNlIERCVVNfU1RVUElEX1RFU1RfTUVDSCBhdXRoCisJd2l0aCBEQlVTX0NPT0tJRV9TSEExLCBpbXBsZW1lbnQgREJVU19DT09LSUVfU0hBMQorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jIChkYnVzX2Nvbm5lY3Rpb25fZmx1c2gpOiBhbHNvIHJlYWQKKwltZXNzYWdlcyBkdXJpbmcgYSBmbHVzaCBvcGVyYXRpb24KKworCSogZGJ1cy9NYWtlZmlsZS5hbTogcmVtb3ZlIGRidXMtbWQ1IHNpbmNlIGl0IGlzbid0IGN1cnJlbnRseSB1c2VkLgorCisyMDAzLTAzLTA1ICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogY29uZmlndXJlLmluOiBDaGVjayBmb3IgZ2V0aG9zdGJ5bmFtZSBvbiBTb2xhcmlzLgorCisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LmM6IChfZGJ1c190cmFuc3BvcnRfb3Blbik6CisJUmVtb3ZlIGR1cGxpY2F0ZSAidGNwIiBlbnRyeS4KKworCSogZG9jL2RidXMtc3BlY2lmaWNhdGlvbi5zZ21sOgorCUNsYXJpZnkgc29tZSB0aGluZ3MuCisKKzIwMDMtMDMtMDUgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBkYnVzL2RidXMtYXV0aC5jOiAoc2VuZF9yZWplY3RlZCksIChwcm9jZXNzX3Rlc3Rfc3ViZGlyKToKKwkqIGRidXMvZGJ1cy1rZXlyaW5nLmM6IChfZGJ1c19rZXlyaW5nX25ld19ob21lZGlyKSwKKwkoX2RidXNfa2V5cmluZ190ZXN0KToKKwkqIGRidXMvZGJ1cy1tZDUuYzogKF9kYnVzX21kNV9jb21wdXRlKToKKwkqIGRidXMvZGJ1cy1zaGEuYzogKF9kYnVzX3NoYV9jb21wdXRlKToKKwlQbHVnIG1lbW9yeSBsZWFrcy4KKworMjAwMy0wMy0wNSAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIFJFQURNRTogQWRkIHNvbWUgdGhpbmdzLgorCisyMDAzLTAzLTA0ICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAoZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzX3ZhbGlzdCk6IEFkZCBhIGJyZWFrOworCWFmdGVyIGNhc2UgREJVU19UWVBFX0JPT0VMQU4uCisKKzIwMDMtMDMtMDIgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIHRlc3QvYnJlYWstbG9hZGVyLmMgKHJhbmRvbWx5X3NldF9leHRyZW1lX2ludHMpOiBhZGQgdGVzdCB0aGF0CisJc2V0cyByZWFsbHkgaHVnZSBhbmQgc21hbGwgaW50ZWdlcnMKKworCSogZGJ1cy9kYnVzLW1hcnNoYWwuYyAoX2RidXNfbWFyc2hhbF92YWxpZGF0ZV9hcmcpOiBhZGQgY2hlY2sKKwl0aGF0IGxlbmd0aCBvZiBib29sZWFuIGFycmF5IGZpdHMgaW4gdGhlIHN0cmluZywgYW5kIHRoYXQKKwlzdHJpbmcgaGFzIHJvb20gZm9yIGJvb2xlYW4gdmFsdWUgaW4gc2luZ2xlLWJvb2wgY2FzZS4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UtYnVpbGRlci5jIChfZGJ1c19tZXNzYWdlX2RhdGFfbG9hZCk6IGFkZAorCW9wdGlvbmFsIHZhbHVlIHRvICJBTElHTiIgY29tbWFuZCB3aGljaCBpcyB3aGF0IHRvIGZpbGwgdGhlCisJYWxpZ25tZW50IHdpdGguCisKKwkqIHRlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy9uby1wYWRkaW5nLm1lc3NhZ2U6IGFkZCByZWdyZXNzaW9uCisJdGVzdCBmb3IgdGhlIG1lc3NhZ2UgcGFkZGluZyBwcm9ibGVtCisKKzIwMDMtMDMtMDIgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKGRlY29kZV9oZWFkZXJfZGF0YSk6IGZpeCB0byBhbHdheXMgaW5pdAorCW1lc3NhZ2VfcGFkZGluZywgZnJvbSBCZW5qYW1pbiBEYXV2ZXJnbmUKKworMjAwMy0wMy0wMiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogY29uZmlndXJlLmluOiAwLjUKKworCSogTkVXUzogVXBkYXRlLgorCisyMDAzLTAzLTAxICBKb2UgU2hhdyAgPGpvZUBhc3NiYXJuLmNvbT4KKworCSogY29uZmlndXJlLmluOiBDaGVjayBmb3IgInN0cnVjdCBjbXNnY3JlZCIgYW5kIHRyeSB0byBhY2Nlc3MgaXRzCisJbWVtYmVycyBmb3IgQlNELWxpa2UgdW5pY2VzLgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jIChyZWFkX2NyZWRlbnRpYWxzX2J5dGUpOiBGb2xkIHRoaXMgYmFjayBpbnRvCisJX2RidXNfcmVhZF9jcmVkZW50aWFsc191bml4X3NvY2tldCgpLgorCShfZGJ1c19yZWFkX2NyZWRlbnRpYWxzX3VuaXhfc29ja2V0KTogVXNlIHJlY3Ztc2coKSBpbnN0ZWFkIG9mCisJcmVhZCgpIGZvciByZWFkaW5nIHRoZSBjcmVkZW50aWFsIGJ5dGUgb2ZmIHRoZSB1bml4IHNvY2tldC4gIFVzZQorCXN0cnVjdCBjbXNnY3JlZCBvbiBzeXN0ZW1zIHRoYXQgc3VwcG9ydCBpdC4KKworMjAwMy0wMi0yNyAgQWxleGFuZGVyIExhcnNzb24gIDxhbGV4bEByZWRoYXQuY29tPgorCisJKiBnbGliL01ha2VmaWxlLmFtOgorCSogY29uZmlndXJlLmluOgorCU1ha2UgZ3RocmVhZHMtMi4wIGRlcGVuZGVuY3kgb3B0aW9uYWwuIERvbid0IGJ1aWxkIHRocmVhZCB0ZXN0IGlmCisJaXRzIG5vdCBmb3VuZC4KKworMjAwMy0wMi0yNyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYworCShkYnVzX2Nvbm5lY3Rpb25fc2VuZF9tZXNzYWdlX3dpdGhfcmVwbHlfYW5kX2Jsb2NrKTogZml4IGRvaCEKKwlkb2ghIGRvaCEgYnVnIHRoYXQgcmVzdWx0ZWQgaW4gbmV2ZXIgcmVtb3ZpbmcgYSByZXBseSBmcm9tIHRoZQorCXF1ZXVlLCBubyB3b25kZXIgd2UgY2FsbGVkIGdldF9yZXBseV9zZXJpYWwgc28gbXVjaCA7LSkKKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAoc3RydWN0IERCdXNNZXNzYWdlKTogY2FjaGUgcmVwbHkgc2VyaWFsCisJYW5kIGNsaWVudCBzZXJpYWwgaW5zdGVhZCBvZiBkZW1hcnNoYWxpbmcgdGhlbSBldmVyeSB0aW1lCisKKzIwMDMtMDItMjcgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLmMgKF9kYnVzX2RlbWFyc2hhbF9pbnQzMik6IHJld3JpdGUgdG8gYmUgbXVjaAorCW1vcmUgaW5saW5lZCwgdXNpbmcgZGJ1cy1zdHJpbmctcHJpdmF0ZS5oLCBzcGVlZHMgdGhpbmdzIHVwCisJc3Vic3RhbnRpYWxseQorCisJKiBkYnVzL2RidXMtc3RyaW5nLmMgKF9kYnVzX3N0cmluZ19mcmVlKTogYXBwbHkgYWxpZ24gb2Zmc2V0CisJd2hlbiBmcmVlaW5nIHRoZSBzdHJpbmcKKwkoX2RidXNfc3RyaW5nX3N0ZWFsX2RhdGEpOiBmaXggZm9yIGFsaWduIG9mZnNldAorCSh1bmRvX2FsaWdubWVudCk6IG5ldyBmdW5jdGlvbgorCisyMDAzLTAyLTI2ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworICAgICAgICBBbGwga2luZHMgb2YgYXVkaXQgZml4ZXMgZnJvbSBPd2VuLCBwbHVzIGluaXRpYWwgYXR0ZW1wdCB0bworCWhhbmRsZSB1bmFsaWduZWQgbWVtb3J5IHJldHVybmVkIGZyb20gbWFsbG9jLgorCisJKiBkYnVzL2RidXMtc3RyaW5nLmMgKF9kYnVzX3N0cmluZ19pbml0KTogY2xhbXAgbWF4IGxlbmd0aCB0bworCWxlYXZlIHJvb20gZm9yIGFsaWduX29mZnNldCBhbmQgbnVsIGJ5dGUKKwkoZml4dXBfYWxpZ25tZW50KTogZnVuY3Rpb24gdG8gdHJhY2sgYW4gYWxpZ25fb2Zmc2V0IGFuZAorCWVuc3VyZSByZWFsLT5zdHIgaXMgYWxpZ25lZAorCShEQlVTX0dFTkVSSUNfU1RSSU5HX1BSRUFNQkxFKTogbGVuIG11c3QgYmUgbGVzcyB0aGFuIGFsbG9jYXRlZCwKKwl0byBhbGxvdyBhIG51bCBieXRlIHBsdXMgYWxpZ24gb2Zmc2V0CisJKF9kYnVzX3N0cmluZ19sb2NrKTogZml4IG92ZXJmbG93IGlzc3VlCisJKF9kYnVzX3N0cmluZ19pbml0X2NvbnN0X2xlbik6IGFkZCBhc3NlcnRpb25zIG9uIHNhbml0eSBvZiBsZW4sCisJYXNzaWduIGFsbG9jYXRlZCB0byBiZSBBTExPQ0FUSU9OX1BBRERJTkcgbGFyZ2VyIHRoYW4gbGVuCisJKHNldF9sZW5ndGgpOiBmaXh1cCB0aGUgb3ZlcmZsb3cgaGFuZGxpbmcKKwkoX2RidXNfc3RyaW5nX2dldF9kYXRhX2xlbik6IGZpeCBvdmVyZmxvdyBpbiBhc3NlcnRpb24KKwkob3Blbl9nYXApOiBkZXRlY3Qgb3ZlcmZsb3cgaW4gc2l6ZSBvZiBnYXAgdG8gYmUgb3BlbmVkCisJKF9kYnVzX3N0cmluZ19sZW5ndGhlbik6IGFkZCBvdmVyZmxvdyBjaGVjaworCShfZGJ1c19zdHJpbmdfYWxpZ25fbGVuZ3RoKTogZml4IG92ZXJmbG93IHdpdGggX0RCVVNfQUxJR05fVkFMVUUKKwkoX2RidXNfc3RyaW5nX2FwcGVuZCk6IGFkZCBvdmVyZmxvdyBjaGVjaworCShfZGJ1c19zdHJpbmdfYXBwZW5kX3VuaWNoYXIpOiBvdmVyZmxvdworCShfZGJ1c19zdHJpbmdfZGVsZXRlKTogZml4IG92ZXJmbG93IGluIGFzc2VydGlvbgorCShfZGJ1c19zdHJpbmdfY29weV9sZW4pOiBvdmVyZmxvdyBpbiBhc3NlcnRpb24KKwkoX2RidXNfc3RyaW5nX3JlcGxhY2VfbGVuKTogb3ZlcmZsb3dzIGluIGFzc2VydGlvbnMKKwkoX2RidXNfc3RyaW5nX2ZpbmQpOiBjaGFuZ2UgdG8gaW1wbGVtZW50IGluIHRlcm1zIG9mCisJX2RidXNfc3RyaW5nX2ZpbmRfdG8KKwkoX2RidXNfc3RyaW5nX2ZpbmRfdG8pOiBhc3NvcnRlZCBmaXhhZ2UKKwkoX2RidXNfc3RyaW5nX2VxdWFsX2Nfc3RyKTogYXNzZXJ0IGNfc3RyICE9IE5VTEwsCisJZml4IGxvZ2ljIHNvIHRoZSBmdW5jdGlvbiB3b3JrcworCShfZGJ1c19zdHJpbmdfZW5kc193aXRoX2Nfc3RyKTogZml4IG92ZXJmbG93IHRoaW5neQorCShfZGJ1c19zdHJpbmdfYmFzZTY0X2VuY29kZSk6IG92ZXJmbG93IGZpeAorCShfZGJ1c19zdHJpbmdfdmFsaWRhdGVfYXNjaWkpOiBvdmVyZmxvdworCShfZGJ1c19zdHJpbmdfdmFsaWRhdGVfbnVsKTogb3ZlcmZsb3cKKworMjAwMy0wMi0yNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLmMgKF9kYnVzX21hcnNoYWxfdGVzdCk6IGZpeCB0byB3b3JrIHdpdGggRElTQUJMRV9BU1NFUlRTCisKKzIwMDMtMDItMjYgIEFsZXhhbmRlciBMYXJzc29uICA8YWxleGxAcmVkaGF0LmNvbT4KKworCSogY29uZmlndXJlLmluOgorCVNldCBEQlVTX0dMSUJfVEhSRUFEU19MSUJTIGZvciBhcHBzIHVzaW5nIGd0aHJlYWQtMi4wCisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmM6CisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5oOgorCUZpeCBfZGJ1c19jb25uZWN0aW9uX2FjcXVpcmVfaW9fcGF0aCBhbmQgX2RidXNfY29ubmVjdGlvbl9hY3F1aXJlX2Rpc3BhdGNoLgorCUFkZCBkYnVzX2Nvbm5lY3Rpb25fc2V0X3dha2V1cF9tYWluX2Z1bmN0aW9uIGFuZCB1c2UgaXQgd2hlbiBxdWV1ZWluZworCWluY29taW5nIGFuZCBvdXRnb2luZyBtZXNzYWdlcy4KKworCisJKiBkYnVzL2RidXMtZGF0YXNsb3QuYzoKKwlUaHJlYWRzYWZlIHVzYWdlIG9mIERCdXNEYXRhU2xvdEFsbG9jYXRvcgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jOiAoZGJ1c19tZXNzYWdlX2dldF9hcmdzX2l0ZXIpOgorCWRidXNfbmV3IGNhbiBmYWlsLgorCisJKiBkYnVzL2RidXMtc2VydmVyLXVuaXguYzoKKwlBZGQgdG9kbyBjb21tZW50CisKKwkqIGdsaWIvZGJ1cy1nbWFpbi5jOgorCUltcGxlbWVudCB0aGUgbmV3IHdha2V1cCBmdW5jdGlvbnMgZm9yIGdsaWIuCisKKwkqIGdsaWIvTWFrZWZpbGUuYW06CisJKiBnbGliL3Rlc3QtdGhyZWFkLWNsaWVudC5jOgorCSogZ2xpYi90ZXN0LXRocmVhZC1zZXJ2ZXIuYzoKKwkqIGdsaWIvdGVzdC10aHJlYWQuaDoKKwlJbml0aWFsIGN1dCBhdCBzb21lIHRocmVhZCB0ZXN0IGNvZGUuIE5vdCByZWFsbHkgZG9uZSB5ZXQuCisKKzIwMDMtMDItMjYgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMKKwkoZGJ1c19jb25uZWN0aW9uX3NlbmRfbWVzc2FnZV93aXRoX3JlcGx5X2FuZF9ibG9jayk6IGZpeCBjcmFzaAorCXdoZXJlIHdlIHJlZidkIHRoZSBvdXRnb2luZyBtZXNzYWdlIGluc3RlYWQgb2YgdGhlIHJldHVybmVkIHJlcGx5CisKKwkqIGRidXMvZGJ1cy10cmFuc3BvcnQtdW5peC5jIChkb19hdXRoZW50aWNhdGlvbik6IGNoZWNrIHJlYWQgd2F0Y2gKKwlhdCB0aGUgZW5kIG9mIHRoaXMgZnVuY3Rpb24sIHNvIGlmIHdlIGRpZG4ndCBuZWVkIHRvIHJlYWQgZm9yCisJYXV0aGVudGljYXRpb24sIHdlIHJlaW5zdGFsbCBpdCBmb3IgcmVjZWl2aW5nIG1lc3NhZ2VzCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKGRidXNfbWVzc2FnZV9uZXdfcmVwbHkpOiBhbGxvdyByZXBsaWVzIHRvCisJYSBOVUxMIHNlbmRlciBmb3IgcGVlci10by1wZWVyIGNhc2UKKworCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC11bml4LmMgKGNoZWNrX3JlYWRfd2F0Y2gpOiBoYW5kbGUKKwkhYXV0aGVudGljYXRlZCBjYXNlIGNvcnJlY3RseQorCisJKiBnbGliL2RidXMtZ21haW4uYzogYWRkIHN1cHBvcnQgZm9yIERCdXNTZXJ2ZXIKKworCSogZGJ1cy9kYnVzLXNlcnZlci5jOiBhZGQgZGF0YSBzbG90IHN1cHBvcnQKKworCSogZ2xpYi9kYnVzLWdtYWluLmMgKGRidXNfY29ubmVjdGlvbl9zZXR1cF93aXRoX2dfbWFpbik6IGNoZWNrCisJcmV0dXJuIHZhbHVlcyBhbmQgaGFuZGxlIGVycm9ycworCisJKiBkYnVzL2RidXMtZGF0YXNsb3QuYzogZmFjdG9yIG91dCB0aGUgZGF0YSBzbG90IHN0dWZmIGZyb20KKwlEQnVzQ29ubmVjdGlvbgorCisJKiBEb3h5ZmlsZS5pbiAoSU5QVVQpOiBhZGQgZ2xpYiBzdWJkaXIKKworCSogZ2xpYi9kYnVzLWdtYWluLmMgKGRidXNfY29ubmVjdGlvbl9zZXR1cF93aXRoX2dfbWFpbik6IHJlbmFtZQorCXNldHVwX3dpdGhfZ19tYWluIGluc3RlYWQgb2YgaG9va3VwX3dpdGhfZ19tYWluOyB3cml0ZSBkb2NzCisKKzIwMDMtMDItMjQgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBkYnVzL2RidXMtbWFyc2hhbC5jOiAoX2RidXNfbWFyc2hhbF92YWxpZGF0ZV9hcmcpOgorCSogZGJ1cy9kYnVzLW1lc3NhZ2UtYnVpbGRlci5jOiAoX2RidXNfbWVzc2FnZV9kYXRhX2xvYWQpOgorCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYzogKGRidXNfbWVzc2FnZV9hcHBlbmRfYm9vbGVhbiksCisJKGRidXNfbWVzc2FnZV9hcHBlbmRfYm9vbGVhbl9hcnJheSksCisJKGRidXNfbWVzc2FnZV9nZXRfYXJnc192YWxpc3QpLCAoX2RidXNfbWVzc2FnZV90ZXN0KToKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmg6CisJKiBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnNnbWw6CisJVmFyaW91cyBmaXhlcyBhcyBwb2ludGVkIG91dCBieSBIYXZvYy4KKworCSogdGVzdC9kYXRhL2ludmFsaWQtbWVzc2FnZXMvYmFkLWJvb2xlYW4tYXJyYXkubWVzc2FnZToKKwkqIHRlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL2JhZC1ib29sZWFuLm1lc3NhZ2U6CisJQWRkIGludmFsaWQgYm9vbGVhbiB2YWx1ZSB0ZXN0IGNhc2VzLgorCisyMDAzLTAyLTI0ICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogZGJ1cy9kYnVzLWludGVybmFscy5jOiAoX2RidXNfdHlwZV90b19zdHJpbmcpOgorCSogZGJ1cy9kYnVzLW1hcnNoYWwuYzogKF9kYnVzX21hcnNoYWxfZ2V0X2FyZ19lbmRfcG9zKSwKKwkoX2RidXNfbWFyc2hhbF92YWxpZGF0ZV9hcmcpOgorCSogZGJ1cy9kYnVzLW1lc3NhZ2UtYnVpbGRlci5jOiAoX2RidXNfbWVzc2FnZV9kYXRhX2xvYWQpOgorCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYzogKGRidXNfbWVzc2FnZV9hcHBlbmRfYXJnc192YWxpc3QpLAorCShkYnVzX21lc3NhZ2VfYXBwZW5kX2Jvb2xlYW4pLCAoZGJ1c19tZXNzYWdlX2FwcGVuZF9ib29sZWFuX2FycmF5KSwKKwkoZGJ1c19tZXNzYWdlX2dldF9hcmdzX3ZhbGlzdCksIChkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYm9vbGVhbiksCisJKGRidXNfbWVzc2FnZV9pdGVyX2dldF9pbnQzMiksIChkYnVzX21lc3NhZ2VfaXRlcl9nZXRfdWludDMyKSwKKwkoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2RvdWJsZSksCisJKGRidXNfbWVzc2FnZV9pdGVyX2dldF9ib29sZWFuX2FycmF5KSwgKG1lc3NhZ2VfaXRlcl90ZXN0KToKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmg6CisJKiBkYnVzL2RidXMtcHJvdG9jb2wuaDoKKwkqIGRvYy9kYnVzLXNwZWNpZmljYXRpb24uc2dtbDoKKwkqIHRlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy9sb3RzLW9mLWFyZ3VtZW50cy5tZXNzYWdlOgorCUFkZCBzdXBwb3J0IGZvciBib29sZWFuIGFuZCBib29sZWFuIGFycmF5IHR5cGVzLgorCisyMDAzLTAyLTIzICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMta2V5cmluZy5jOiBmaW5pc2ggbW9zdCBvZiB0aGlzIGltcGxlbWVudGF0aW9uIGFuZAorCXNpbXBsZSB1bml0IHRlc3QKKworCSogZGJ1cy9kYnVzLWVycm9ycy5jIChkYnVzX3NldF9lcnJvcl9jb25zdCwgZGJ1c19zZXRfZXJyb3IpOiBtYWtlCisJdGhlc2UgYmFyZiBpZiB0aGUgZXJyb3IgaXNuJ3QgY2xlYXJlZCB0byBOVUxMCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMgKF9kYnVzX2RlbGV0ZV9maWxlKTogc2V0IGVycm9yIG9uIGZhaWx1cmUKKwkoX2RidXNfY3JlYXRlX2RpcmVjdG9yeSk6IG5ldyBmdW5jdGlvbgorCisJKiBkYnVzL2RidXMtZXJyb3JzLmMgKGRidXNfc2V0X2Vycm9yKTogZml4IHdhcm5pbmcKKworCSogZGJ1cy9kYnVzLXN0cmluZy5jIChfZGJ1c19zdHJpbmdfaGV4X2VuY29kZSk6IG5ldyBmdW5jdGlvbgorCShfZGJ1c19zdHJpbmdfaGV4X2RlY29kZSk6IG5ldyBmdW5jdGlvbgorCSh0ZXN0X2hleF9yb3VuZHRyaXApOiB0ZXN0IGNvZGUKKworCSogZGJ1cy9kYnVzLXNoYS5jIChfZGJ1c19zaGFfY29tcHV0ZSk6IHVzZSBkYnVzX3N0cmluZ19oZXhfZW5jb2RlCisKKwkqIGRidXMvZGJ1cy1tZDUuYyAoX2RidXNfbWQ1X2NvbXB1dGUpOiB1c2UgZGJ1c19zdHJpbmdfaGV4X2VuY29kZQorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jIChfZGJ1c19zdHJpbmdfc2F2ZV90b19maWxlKTogbWFrZSB0aGlzIHVzZQorCXRoZSBzYXZlLXRvLXRlbXAvcmVuYW1lIHRyaWNrIHRvIGF0b21pY2FsbHkgd3JpdGUgdGhlIG5ldyBmaWxlCisJKF9kYnVzX3N0cmluZ19wYXJzZV91aW50KTogbmV3IGZ1bmN0aW9uCisKKzIwMDMtMDItMjIgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIHRlc3QvTWFrZWZpbGUuYW0gKGRpc3QtaG9vayk6IGZpeCBkaXN0IGZvciB0ZXN0L2RhdGEvc2hhLTEKKworMjAwMy0wMi0yMiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X3N0cmluZ19hcnJheSk6CisJKGRidXNfbWVzc2FnZV9pdGVyX2dldF9ieXRlX2FycmF5KTogRml4IHVwIGRveHlnZW4gd2FybmluZ3MKKworCSogZGJ1cy9kYnVzLXNoYS5jOiBhZGQgaW1wbGVtZW50YXRpb24gb2YgU0hBLTEgYWxnb3JpdGhtCisKKwkqIGRidXMvdGVzdC9kYXRhL3NoYS0xOiBhZGQgVVMgZ292ZXJubWVudCB0ZXN0IHN1aXRlIGZvciBTSEEtMQorCisyMDAzLTAyLTIxICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogZGJ1cy9kYnVzLW1hcnNoYWwuYzogKF9kYnVzX2RlbWFyc2hhbF9zdHJpbmdfYXJyYXkpOgorCU1ha2Ugc3RyaW5nIGFycmF5cyBOVUxMLXRlcm1pbmF0ZWQuCisKKwkqIGRidXMvZGJ1cy1tZW1vcnkuYzogKGRidXNfZnJlZV9zdHJpbmdfYXJyYXkpOgorCSogZGJ1cy9kYnVzLW1lbW9yeS5oOgorCU5ldyBmdW5jdGlvbiBmb3IgZnJlZWluZyBOVUxMLXRlcm1pbmF0ZWQgc3RyaW5nIGFycmF5cy4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UtYnVpbGRlci5jOiAoYXBwZW5kX3F1b3RlZF9zdHJpbmcpLAorCShfZGJ1c19tZXNzYWdlX2RhdGFfbG9hZCk6CisJQWRkIHN1cHBvcnQgZm9yIGFycmF5IHR5cGVzLgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jOiAoY2hlY2tfbWVzc2FnZV9oYW5kbGluZyk6CisJQWRkIG1vcmUgdHlwZXMgYXMgdGVzdCBjYXNlcy4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYzogKF9kYnVzX3N0cmluZ19wYXJzZV9pbnQpLAorCShfZGJ1c19zdHJpbmdfcGFyc2VfZG91YmxlKToKKwlBZGQgdGhlIHN0YXJ0IG9mZnNldCB0byB0aGUgZW5kIG9mZnNldC4KKworCSogdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL2xvdHMtb2YtYXJndW1lbnRzLm1lc3NhZ2U6CisJTmV3IHRlc3QgbWVzc2FnZSB3aXRoIGxvdHMgb2YgYXJndW1lbnRzLgorCisyMDAzLTAyLTIxICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYzogKGRidXNfbWVzc2FnZV9hcHBlbmRfbmlsKSwKKwkoZGJ1c19tZXNzYWdlX2FwcGVuZF9pbnQzMiksIChkYnVzX21lc3NhZ2VfYXBwZW5kX3VpbnQzMiksCisJKGRidXNfbWVzc2FnZV9hcHBlbmRfZG91YmxlKSwgKGRidXNfbWVzc2FnZV9hcHBlbmRfc3RyaW5nKSwKKwkoZGJ1c19tZXNzYWdlX2FwcGVuZF9pbnQzMl9hcnJheSksCisJKGRidXNfbWVzc2FnZV9hcHBlbmRfdWludDMyX2FycmF5KSwKKwkoZGJ1c19tZXNzYWdlX2FwcGVuZF9kb3VibGVfYXJyYXkpLAorCShkYnVzX21lc3NhZ2VfYXBwZW5kX2J5dGVfYXJyYXkpLAorCShkYnVzX21lc3NhZ2VfYXBwZW5kX3N0cmluZ19hcnJheSk6CisJRml4IGFsbCBvdXQtb2YtbWVtb3J5IGhhbmRsaW5nIGluIHRoZXNlIGZ1bmN0aW9ucy4KKworMjAwMy0wMi0yMSAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmM6IChkYnVzX21lc3NhZ2VfYXBwZW5kX25pbCk6CisJRml4IGEgc2lsbHkuCisKKzIwMDMtMDItMjEgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jOiAoZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzX3ZhbGlzdCksCisJKGRidXNfbWVzc2FnZV9hcHBlbmRfbmlsKSwgKGRidXNfbWVzc2FnZV9hcHBlbmRfaW50MzJfYXJyYXkpLAorCShkYnVzX21lc3NhZ2VfYXBwZW5kX3VpbnQzMl9hcnJheSksCisJKGRidXNfbWVzc2FnZV9hcHBlbmRfZG91YmxlX2FycmF5KSwKKwkoZGJ1c19tZXNzYWdlX2FwcGVuZF9ieXRlX2FycmF5KSwKKwkoZGJ1c19tZXNzYWdlX2FwcGVuZF9zdHJpbmdfYXJyYXkpLCAoZGJ1c19tZXNzYWdlX2dldF9hcmdzX3ZhbGlzdCksCisJKGRidXNfbWVzc2FnZV9pdGVyX2dldF9pbnQzMl9hcnJheSksCisJKGRidXNfbWVzc2FnZV9pdGVyX2dldF91aW50MzJfYXJyYXkpLAorCShkYnVzX21lc3NhZ2VfaXRlcl9nZXRfZG91YmxlX2FycmF5KSwKKwkoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2J5dGVfYXJyYXkpLAorCShkYnVzX21lc3NhZ2VfaXRlcl9nZXRfc3RyaW5nX2FycmF5KToKKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuaDoKKwlBZGQgZnVuY3Rpb25zIGZvciBhcHBlbmRpbmcgYW5kIGdldHRpbmcgYXJyYXlzLgorCisyMDAzLTAyLTIxICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogZGJ1cy9kYnVzLW1lbXBvb2wuYyAoX2RidXNfbWVtX3Bvb2xfbmV3KTogTWFrZSB0aGUKKwllbGVtZW50IHNpemUgYXQgbGVhc3QgOCBieXRlcywgZml4ZXMgbWVtcG9vbCB0ZXN0cyBvbgorCTY0LWJpdCBtYWNoaW5lcy4KKworMjAwMy0wMi0yMCAgQWxleGFuZGVyIExhcnNzb24gIDxhbGV4bEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LXVuaXguYyAodW5peF9kb19pdGVyYXRpb24pOgorCVVubG9jayB0aGUgY29ubmVjdGlvbiBtdXRleCBkdXJpbmcgYSBibG9ja2luZyBzZWxlY3QgY2FsbC4KKwlBZGQgdG9kbyBhYm91dCBob3cgd2UgbmVlZCBhIHdheSB0byB3YWtlIHVwIHRoZSBzZWxlY3QuCisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLWludGVybmFsLmg6CisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jOgorCUFkZCBfZGJ1c19jb25uZWN0aW9uX2xvY2sgYW5kIF9kYnVzX2Nvbm5lY3Rpb25fdW5sb2NrLgorCisyMDAzLTAyLTE5ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBEb3h5ZmlsZS5pbiAoUFJFREVGSU5FRCk6IHB1dCBET1hZR0VOX1NIT1VMRF9TS0lQX1RISVMgaW4KKwlEb3h5ZmlsZS5pbiwgbm90IERveHlmaWxlCisKKwkqIGRidXMvZGJ1cy1rZXlyaW5nLmM6IGRvIHNvbWUgaGFja2luZyBvbiB0aGlzCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMgKF9kYnVzX2RlbGV0ZV9maWxlKTogbmV3CisKKwkqIGRidXMvZGJ1cy1lcnJvcnMuYyAoZGJ1c19zZXRfZXJyb3JfY29uc3QpOiBkbyBub3QgY2FsbAorCWRidXNfZXJyb3JfaW5pdAorCShkYnVzX3NldF9lcnJvcik6IHJlbW92ZSBkYnVzX2Vycm9yX2luaXQsIGNoZWNrIGZvciBtZXNzYWdlID09CisJTlVMTCAqYmVmb3JlKiB3ZSBzcHJpbnRmIGludG8gaXQsIGFuZCBhZGQgQHRvZG8gYWJvdXQgaW5jbHVkaW5nCisJc3lzdGVtIGhlYWRlcnMgaW4gdGhpcyBmaWxlCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMgKF9kYnVzX2NyZWF0ZV9maWxlX2V4Y2x1c2l2ZWx5KTogbmV3CisKKwkqIGRidXMvZGJ1cy1lcnJvcnMuaCAoREJVU19FUlJPUl9GQUlMRUQpOiBhZGQKKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYyAoZ2V0X3VzZXJfaW5mbyk6IGJyZWFrIHRoaXMgZnVuY3Rpb24gb3V0IHRvCisJZ2V0IHZhcmlvdXMgYml0cyBvZiB1c2VyIGluZm9ybWF0aW9uIGJhc2VkIG9uIGVpdGhlciB1c2VybmFtZQorCW9yIHVzZXIgSUQKKwkoX2RidXNfaG9tZWRpcl9mcm9tX3VzZXJuYW1lKTogbmV3IGZ1bmN0aW9uCisKKzIwMDMtMDItMTkgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBjb25maWd1cmUuaW46CisJQWRkIGNoZWNrIGZvciBub25wb3NpeCBnZXRwd25hbV9yCisKKwkqIGRidXMvZGJ1cy1tZW1wb29sLmM6IChfZGJ1c19tZW1fcG9vbF9uZXcpOgorCUFsaWduIHRoZSBwb29sIGVsZW1lbnQgc2l6ZSB0byBhIHNpemVvZiAodm9pZCAqKSBib3VuZGFyeS4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYzogKF9kYnVzX3NldGVudiksIChfZGJ1c19jb25uZWN0X3VuaXhfc29ja2V0KSwKKwkoX2RidXNfbGlzdGVuX3VuaXhfc29ja2V0KSwgKF9kYnVzX2NyZWRlbnRpYWxzX2Zyb21fdXNlcm5hbWUpOgorCUdlbmVyYWwgU29sYXJpcyBmaXhlcy4KKworCSogdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL3NpbXBsZXN0LW1hbnVhbC5tZXNzYWdlOgorCUV4cGxpY2l0bHkgc3RhdGUgdGhhdCB3ZSB3YW50IGxpdHRsZS1lbmRpYW4gcGFja2luZy4KKworMjAwMy0wMi0xOSAgTWlrYWVsIEhhbGxlbmRhbCAgPG1pY2tlQGNvZGVmYWN0b3J5LnNlPgorCisJKiBkYnVzL2RidXMtc2VydmVyLmMgKGRidXNfc2VydmVyX2xpc3Rlbik6IFN1cHBvcnQgdGNwOiBhZGRyZXNzZXMuCisKKwkqIGRidXMvZGJ1cy10cmFuc3BvcnQtdW5peC5jIChfZGJ1c190cmFuc3BvcnRfbmV3X2Zvcl90Y3Bfc29ja2V0KToKKwlBZGRlZCB0byBjcmVhdGUgYSB0cmFuc3BvcnQgY29ubmVjdGluZyB1c2luZyBhIHRjcC9pcCBzb2NrZXQuCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMgKF9kYnVzX2Nvbm5lY3RfdGNwX3NvY2tldCk6IEFkZGVkIHRvIGNvbm5lY3QKKwl0byBhIHRjcCBzb2NrZXQgYXQgZ2l2ZW4gaG9zdCBhbmQgcG9ydC4KKwkoX2RidXNfbGlzdGVuX3RjcF9zb2NrZXQpOiBhZGRlZCB0byBsaXN0ZW4gb24gdGNwIHNvY2tldCBmb3IgZ2l2ZW4KKwlob3N0bmFtZSBhbmQgcG9ydC4KKworCSogZGJ1cy9kYnVzLXNlcnZlci5jIChkYnVzX3NlcnZlcl9saXN0ZW4pOiBTdXBwb3J0IHRjcDogYWRkcmVzc2VzLgorCisJKiBkYnVzL2RidXMtc2VydmVyLXVuaXguYyAoX2RidXNfc2VydmVyX25ld19mb3JfdGNwX3NvY2tldCk6CisJQWRkZWQgdG8gY3JlYXRlIGEgc2VydmVyIGxpc3RlbmluZyBvbiBhIFRDUC9JUCBzb2NrZXQuCisKKzIwMDMtMDItMTkgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwlUaHJvdWdob3V0OiBtb3AgdXAgYWxsIHRoZSBEb3h5Z2VuIHdhcm5pbmdzIGFuZCB1bmRvY3VtZW50ZWQKKwlzdHVmZi4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYyAoZG9fZXhlYyk6IGRvIG5vdCB1c2UgZXhlY3ZwLCB3ZSBkb24ndCB3YW50CisJdG8gc2VhcmNoIGFueSBwYXRocy4KKworCSogZGJ1cy9kYnVzLXRocmVhZHMuYzogbW92ZSBnbG9iYWwgbXV0ZXggaW5pdGlhbGl6ZXJzIHRvCisJZGJ1cy1pbnRlcm5hbHMuaCwgbXVsdGlwbGUgcHJvdG90eXBlcyB3YXMgY29uZnVzaW5nIGRveHlnZW4KKwliZXNpZGVzIGJlaW5nIGtpbmQgb2YgdWdseQorCisJKiBEb3h5ZmlsZSAoUFJFREVGSU5FRCk6IGhhdmUgRG94eWdlbiBkZWZpbmUKKwlET1hZR0VOX1NIT1VMRF9TS0lQX1RISVMgc28gd2UgY2FuIGV4Y2x1ZGUgdGhpbmdzIGZyb20KKwlkb2NzIHdpdGggI2lmbmRlZiBET1hZR0VOX1NIT1VMRF9TS0lQX1RISVMKKwkoZG8gbm90IGFidXNlIHRoZSBmZWF0dXJlISBpdCdzIGZvciBzdHVmZiBsaWtlIHRoZSBhdXRvZ2VuZXJhdGVkCisJbWFjcm9zIGluIGRidXMtbWQ1LmMsIG5vdCBqdXN0IGZvciB0aGluZ3MgeW91IGRvbid0IGZlZWwgbGlrZQorCWRvY3VtZW50aW5nLi4uKQorCisyMDAzLTAyLTE4ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtc3RyaW5nLmMgKF9kYnVzX3N0cmluZ196ZXJvKTogbmV3IGZ1bmN0aW9uCisKKwkqIGRidXMvZGJ1cy1tZDUuYzogaW5jbHVkZSBNRDUgaW1wbGVtZW50YXRpb24gYnkgTC4gUGV0ZXIgRGV1dHNjaCwKKwl3cmFwIGl0IGluIHNvbWUgZGJ1cy1mcmllbmRseSBBUEkKKworCSogZGJ1cy9kYnVzLXR5cGVzLmg6IGFkZCAxNi1iaXQgdHlwZXMKKworMjAwMy0wMi0xOCAgSm9lIFNoYXcgIDxqb2VAYXNzYmFybi5jb20+CisKKwkqIGRidXMvZGJ1cy1hdXRoLmMgKGhhbmRsZV9zZXJ2ZXJfZGF0YV9zdHVwaWRfdGVzdF9tZWNoKTogSnVzdCBnZXQKKwljcmVkZW50aWFscyBmcm9tIG91ciBjdXJyZW50bHkgcnVubmluZyBwcm9jZXNzLgorCShnZXRfd29yZCk6IEZpeCBhIGJ1Z2xldCB3aGVyZSB3ZSB3ZXJlIGNvcHlpbmcgdGhlIGVudGlyZSBsZW5ndGgKKwlpbnN0ZWFkIG9mIHJlbGF0aXZlIHRvIG91ciBwb3NpdGlvbi4KKworCSogZGJ1cy9kYnVzLWhhc2guYyAoX2RidXNfaGFzaF90ZXN0KTogRG9uJ3QgdHJ5IHRvIGFsbG9jYXRlIHRoZQorCWtleXMgb24gdGhlIHN0YWNrLi4uIGl0J3MgNjQwayBvZiBkYXRhLgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jIChfZGJ1c19yZWFkX2NyZWRlbnRpYWxzX3VuaXhfc29ja2V0KTogQWx3YXlzCisJcmVhZCB0aGUgY3JlZGVudGlhbHMgYnl0ZSBvZmYgdGhlIHNvY2tldCwgZXZlbiBpZiB3ZSBkb24ndCBoYXZlCisJU09fUEVFUkNSRUQuCisJKF9kYnVzX3BvbGwpOiBJbXBsZW1lbnQgcG9sbCgpIHVzaW5nIHNlbGVjdCgpIGZvciBzeXN0ZW1zIHdoaWNoCisJZG9uJ3QgaGF2ZSBpdC4KKworCSogZ2xpYi90ZXN0LWRidXMtZ2xpYi5jIChtYWluKTogUHJpbnQgb3V0IGFuIGVycm9yIGlmIG5vCisJcGFyYW1ldGVycyBhcmUgZ2l2ZW4uCisKKwkqIHRlc3QvZGF0YS9hdXRoL2ZhbGxiYWNrLmF1dGgtc2NyaXB0OiBBZGRlZC4gIFRlc3RzIHRoYXQgYSBjbGllbnQKKwljYW4gZmFsbGJhY2sgdG8gYSBzZWNvbmRhcnkgYXV0aCBtZWNoYW5pc20gaWYgdGhlIGZpcnN0IGZhaWxzLgorCisyMDAzLTAyLTE4ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBBVVRIT1JTOiBhZGQgQWxleAorCisyMDAzLTAyLTE3ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnNnbWw6IGxvdHMgb2YgY29zbWV0aWMKKwljbGVhbnVwcy9yZWFycmFuZ2VtZW50LCBhZGQgYXNzb3J0ZWQgRklYTUUsIGNoYW5nZSBEQlVTX0FERFJFU1MKKwllbnYgdmFyaWFibGUgdG8gREJVU19CVVNfQUREUkVTUywgcy9jbGllbnQvYXBwbGljYXRpb24vLAorCXMvc2VydmVyL2J1cy8gKGV4Y2VwdCBpbiBhdXRoZW50aWNhdGlvbiBzZWN0aW9uKS4gQWRkIGEgc2VjdGlvbgorCSJNZXNzYWdlIEJ1cyBNZXNzYWdlIFJvdXRpbmciCisKKzIwMDMtMDItMTcgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlLj4KKworCVJlbGVhc2UgMC40CisKKwkqIE5FV1M6IFVwZGF0ZQorCisyMDAzLTAyLTE3ICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogZG9jL2RidXMtc3BlY2lmaWNhdGlvbi5zZ21sOgorCVNwZWNpZmljYXRpb24gdXBkYXRlcy4KKworMjAwMy0wMi0xNyAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGJ1cy9hY3RpdmF0aW9uLmM6IChidXNfYWN0aXZhdGlvbl9pbml0KSwgKGNoaWxkX3NldHVwKSwKKwkoYnVzX2FjdGl2YXRpb25fYWN0aXZhdGVfc2VydmljZSk6CisJKiBidXMvYWN0aXZhdGlvbi5oOgorCSogYnVzL21haW4uYzogKG1haW4pOgorCVNldCBEQlVTX0FERFJFU1MgZW52aXJvbm1lbnQgdmFyaWFibGUuCisKKwkqIGRidXMvZGJ1cy1lcnJvcnMuYzogKGRidXNfc2V0X2Vycm9yKToKKwlEb24ndCB1c2UgdmFfY29weSBzaW5jZSB0aGF0J3MgYSBDOTkgZmVhdHVyZS4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYzogKF9kYnVzX3NldGVudiksIChkb19leGVjKSwKKwkoX2RidXNfc3Bhd25fYXN5bmMpOgorCSogZGJ1cy9kYnVzLXN5c2RlcHMuaDoKKwlBZGQgY2hpbGRfc2V0dXBfZnVuYyB0byBfZGJ1c19zcGF3bl9hc3luYy4KKworCSogZG9jL2RidXMtc3BlY2lmaWNhdGlvbi5zZ21sOgorCVVwZGF0ZSBzcGVjaWZpY2F0aW9uLgorCisJKiB0ZXN0L3NwYXduLXRlc3QuYzogKHNldHVwX2Z1bmMpLCAobWFpbik6CisJRml4IHRlc3QuCisKKzIwMDMtMDItMTcgIEFsZXhhbmRlciBMYXJzc29uICA8YWxleGxAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYyAoX2RidXNfY29ubmVjdGlvbl9oYW5kbGVyX2Rlc3Ryb3llZF9sb2NrZWQpOgorCUFkZGVkIHRvZG8uCisKKzIwMDMtMDItMTcgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBkb2MvLmN2c2lnbm9yZToKKwkqIGRvYy9NYWtlZmlsZS5hbToKKwkqIGRvYy9kYnVzLXRlc3QtcGxhbi5zZ21sOgorCUFkZCB0ZXN0IHBsYW4gZG9jdW1lbnQuCisKKwkqIHRlc3QvTWFrZWZpbGUuYW06CisJRml4IGRpc3RjaGVjay4KKworMjAwMy0wMi0xNyAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmM6IChkZWNvZGVfaGVhZGVyX2RhdGEpLAorCShfZGJ1c19tZXNzYWdlX2xvYWRlcl9yZXR1cm5fYnVmZmVyKToKKwlTZXQgdGhlIGhlYWRlciBwYWRkaW5nIGFtb3VudCB3aGVuIGxvYWRpbmcgYSBtZXNzYWdlLgorCisyMDAzLTAyLTE2ICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogYnVzL2Rpc3BhdGNoLmM6IChzZW5kX29uZV9tZXNzYWdlKToKKwlPbmx5IHNlbmQgYnJvYWRjYXN0IG1lc3NhZ2VzIHRvIHJlZ2lzdGVyZWQgY29ubmVjdGlvbnMuCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmM6IChkYnVzX21lc3NhZ2VfbmFtZV9pcyk6CisJKiBkYnVzL2RidXMtbWVzc2FnZS5oOgorCU5ldyBjb252ZW5pZW5jZSBmdW5jdGlvbi4KKworCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC1kZWJ1Zy5jOiAoZG9fcmVhZGluZyk6CisJT25seSBkaXNwYXRjaCBvbmUgbWVzc2FnZSBwZXIgcnVuLgorCisJKiB0ZXN0L01ha2VmaWxlLmFtOgorCSogdGVzdC9idXMtdGVzdC5jOiAobmV3X2Nvbm5lY3Rpb25fY2FsbGJhY2spLCAoZGllKSwKKwkodGVzdF9oZWxsb19jbGllbnQxX2hhbmRsZXIpLCAodGVzdF9oZWxsb19jbGllbnQyX2hhbmRsZXIpLAorCSh0ZXN0X2hlbGxvX3JlcGxpZXMpLCAobWFpbik6CisKKwkqIHRlc3QvYnVzLXRlc3QtbG9vcC5bY2hdOgorCUFkZCB0aGVzZS4KKworMjAwMy0wMi0xNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYyAoZGJ1c19jb25uZWN0aW9uX2Rpc3BhdGNoX21lc3NhZ2UpOiBmaXgKKwliYWNrd2FyZCBjb25kaXRpb25hbAorCisyMDAzLTAyLTE2ICBBbGV4YW5kZXIgTGFyc3NvbiAgPGFsZXhsQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmM6CisJSW1wbGVtZW50IHNlbnRfbWVzc2FnZV93aXRoX3JlcGx5LiAod2l0aF9yZXBseV9hbmQgYmxvY2sgaXMgc3RpbGwKKwlidXN0ZWQpLgorCU1hZGUgZGlzcGF0Y2hfbWVzc2FnZSBub3QgbG9zZSBtZXNzYWdlIGlmIE9PTS4KKworCSogZGJ1cy9kYnVzLWVycm9ycy5oOgorCUFkZCBOb1JlcGx5IGVycm9yIChmb3IgcmVwbHkgdGltZW91dHMpLgorCisyMDAzLTAyLTE2ICBBbGV4YW5kZXIgTGFyc3NvbiAgPGFsZXhsQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1oYXNoLmMgKF9kYnVzX2hhc2hfdGFibGVfdW5yZWYpOgorCUFjdHVhbGx5IGZyZWUga2V5cyBhbmQgdmFsdWVzIHdoZW4gZGVzdHJveWluZyBoYXNodGFibGUuCisKKzIwMDMtMDItMTYgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBkYnVzL2RidXMtYXV0aC5jOiAoY2xpZW50X3RyeV9uZXh0X21lY2hhbmlzbSk6CisJUGx1ZyBhIGxlYWsuCisKKwkqIGRidXMvZGJ1cy10aHJlYWRzLmM6IChkYnVzX2NvbmR2YXJfd2FpdF90aW1lb3V0KToKKwlSZXR1cm4gVFJVRSBpZiB0aGVyZSdzIG5vIHRocmVhZCBpbXBsZW1lbnRhdGlvbiBhcm91bmQuCisKKwkqIGdsaWIvZGJ1cy1nbWFpbi5jOiAoZnJlZV9zb3VyY2UpLAorCShkYnVzX2Nvbm5lY3Rpb25faG9va3VwX3dpdGhfZ19tYWluKToKKwlNYWtlIHN1cmUgdG8gcmVtb3ZlIHRoZSBHU291cmNlIHdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgZmluYWxpemVkLgorCisyMDAzLTAyLTE2ICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogYnVzL2Rpc3BhdGNoLmM6IChidXNfZGlzcGF0Y2hfbWVzc2FnZV9oYW5kbGVyKToKKwkqIGRidXMvZGJ1cy1lcnJvcnMuaDoKKwlSZXR1cm4gYW4gZXJyb3IgaWYgc29tZW9uZSB0cmllcyB0byBzZW5kIGEgbWVzc2FnZSB0byBhIHNlcnZpY2UKKwl0aGF0IGRvZXNuJ3QgZXhpc3QuCisKKzIwMDMtMDItMTYgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBidXMvYWN0aXZhdGlvbi5jOiAobG9hZF9kaXJlY3RvcnkpLCAoYnVzX2FjdGl2YXRpb25faW5pdCksCisJKGJ1c19hY3RpdmF0aW9uX2FjdGl2YXRlX3NlcnZpY2UpOgorCSogYnVzL2FjdGl2YXRpb24uaDoKKwkqIGJ1cy9kcml2ZXIuYzoKKwkoYnVzX2RyaXZlcl9oYW5kbGVfYWN0aXZhdGVfc2VydmljZSksIChidXNfZHJpdmVyX2hhbmRsZV9tZXNzYWdlKToKKwlNb3JlIHdvcmsgb24gdGhlIGFjdGl2YXRpb24gaGFuZGxpbmcuCisKKwkqIGRidXMvZGJ1cy1lcnJvcnMuaDoKKwlBZGQgc29tZSBlcnJvciBtZXNzYWdlcworCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jOiAoZGJ1c19tZXNzYWdlX25ld19lcnJvcl9yZXBseSk6CisJKiBkYnVzL2RidXMtbWVzc2FnZS5oOgorCU5ldyBmdW5jdGlvbiB0aGF0IGNyZWF0ZXMgYW4gZXJyb3IgbWVzc2FnZS4KKworCSogZGJ1cy9kYnVzLXByb3RvY29sLmg6CisJQWRkIEFDVElWQVRFX1NFUlZFUiBtZXNzYWdlLgorCisJKiBkYnVzL2RidXMtc2VydmVyLXVuaXguYzogKHVuaXhfaGFuZGxlX3dhdGNoKSwKKwkoX2RidXNfc2VydmVyX25ld19mb3JfZG9tYWluX3NvY2tldCk6CisJQ2FsbCBfZGJ1c19mZF9zZXRfY2xvc2Vfb25fZXhlYy4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYzogKG1ha2VfcGlwZSksIChkb19leGVjKSwKKwkoX2RidXNfc3Bhd25fYXN5bmMpLCAoX2RidXNfZGlzYWJsZV9zaWdwaXBlKSwKKwkoX2RidXNfZmRfc2V0X2Nsb3NlX29uX2V4ZWMpOgorCSogZGJ1cy9kYnVzLXN5c2RlcHMuaDoKKwlBZGQgX2RidXNfZmRfc2V0X2Nsb3NlX29uIGV4ZWMgZnVuY3Rpb24uIEFsc28gYWRkIGZ1bmN0aW9uIHRoYXQgY2hlY2tzCisJdGhhdCBhbGwgb3BlbiBmZHMgYXJlIHNldCB0byBjbG9zZS1vbi1leGVjIGFuZCB3YXJucyBvdGhlcndpc2UuCisKKwkqIGRidXMvZGJ1cy10cmFuc3BvcnQtdW5peC5jOgorCShfZGJ1c190cmFuc3BvcnRfbmV3X2Zvcl9kb21haW5fc29ja2V0KToKKwlDYWxsIF9kYnVzX2ZkX3NldF9jbG9zZV9vbl9leGVjLgorCisyMDAzLTAyLTE2ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jIChkYnVzX2Nvbm5lY3Rpb25fc2V0X2NoYW5nZV9zaWdwaXBlKToKKwlhbGxvdyBwZW9wbGUgdG8gYXZvaWQgc2V0dGluZyBTSUdQSVBFIHRvIFNJR19JR04KKwkoX2RidXNfY29ubmVjdGlvbl9uZXdfZm9yX3RyYW5zcG9ydCk6IGRpc2FibGUgU0lHUElQRSB1bmxlc3MKKwl3ZSd2ZSBiZWVuIGFza2VkIG5vdCB0bworCisyMDAzLTAyLTE1ICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogZGJ1cy9kYnVzLWxpc3QuYzogKF9kYnVzX2xpc3RfYXBwZW5kX2xpbmspLAorCShfZGJ1c19saXN0X3ByZXBlbmRfbGluayk6CisJKiBkYnVzL2RidXMtbWVtb3J5LmM6IChkYnVzX21hbGxvYyksIChkYnVzX21hbGxvYzApLAorCShkYnVzX3JlYWxsb2MpOgorCVdhcm5pbmcgZml4ZXMuCisKKzIwMDMtMDItMTUgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBidXMvTWFrZWZpbGUuYW06CisJKiBidXMvYWN0aXZhdGlvbi5jOiAoYnVzX2FjdGl2YXRpb25fZW50cnlfZnJlZSksCisJKGFkZF9kZXNrdG9wX2ZpbGVfZW50cnkpLCAobG9hZF9kaXJlY3RvcnkpLCAoYnVzX2FjdGl2YXRpb25faW5pdCk6CisJKiBidXMvYWN0aXZhdGlvbi5oOgorCSogYnVzL21haW4uYzogKG1haW4pOgorCUFkZCBzaW1wbGUgYWN0aXZhdGlvbiBzdXBwb3J0LCBkb2Vzbid0IHdvcmsgeWV0IHRob3VnaC4KKworMjAwMy0wMi0xNSAgIFphY2sgUnVzaW4gIDx6YWNrQGtkZS5vcmc+CisKKwkqIHF0L2RidXMtcXRocmVhZC5jcHA6ICBzbWFsbCBjYXN0aW5nIGZpeAorCisyMDAzLTAyLTE1ICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogZGJ1cy9kYnVzLWVycm9ycy5jOiAoZGJ1c19zZXRfZXJyb3IpOgorCSogZGJ1cy9kYnVzLWVycm9ycy5oOgorCUFkZCBhIGZldyBlcnJvcnMgYW5kIG1ha2UgZGJ1c19zZXRfZXJyb3Igdm9pZC4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYzoKKwkoX2RidXNfZXJybm9fdG9fc3RyaW5nKSwgKGNsb3NlX2FuZF9pbnZhbGlkYXRlKSwgKG1ha2VfcGlwZSksCisJKHdyaXRlX2Vycl9hbmRfZXhpdCksIChyZWFkX2ludHMpLCAoZG9fZXhlYyksIChfZGJ1c19zcGF3bl9hc3luYyk6CisJKiBkYnVzL2RidXMtc3lzZGVwcy5oOgorCUFkZCBfZGJ1c19zcGF3bl9hc3luYy4KKworCSogdGVzdC9zcGF3bi10ZXN0LmM6IChtYWluKToKKwlUZXN0IGZvciBfZGJ1c19zcGF3bl9hc3luYy4KKworMjAwMy0wMi0xNSAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGRidXMvZGJ1cy1pbnRlcm5hbHMuaDoKKwlGaXggYnVpbGQgd2l0aG91dCB0ZXN0cy4KKworCSogZGJ1cy9kYnVzLWxpc3QuYzogKGFsbG9jX2xpbmspOgorCUZpeCBhIHNlZ2ZhdWx0IHdoZW4gYSBtYWxsb2MgZmFpbHMuCisKKwkqIGRidXMvZGJ1cy1tZW1vcnkuYzogKGluaXRpYWxpemVfbWFsbG9jX2RlYnVnKSwgKGRidXNfbWFsbG9jKSwKKwkoZGJ1c19tYWxsb2MwKSwgKGRidXNfcmVhbGxvYyk6CisJQWRkIHN1cHBvcnQgZm9yIG1hbGxvYyBkZWJ1Z2dpbmcuCisKKzIwMDMtMDItMTUgIEFsZXhhbmRlciBMYXJzc29uICA8YWxleGxAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLXRocmVhZHMuYzoKKwkqIGRidXMvZGJ1cy10aHJlYWRzLmg6CisJQWRkIGNvbmR2YXJzLiBSZW1vdmUgc3RhdGljIG11dGV4dCBmcm9tIEFQSS4KKwlJbXBsZW1lbnQgc3RhdGljIG11dGV4ZXMgYnkgaW5pdGlhbGl6aW5nIHRoZW0gZnJvbSB0aHJlYWRzX2luaXQuCisKKwkqIGdsaWIvZGJ1cy1ndGhyZWFkLmM6CisJKiBxdC9kYnVzLXF0aHJlYWQuY3BwOgorCVVwZGF0ZSB3aXRoIHRoZSB0aHJlYWQgYXBpIGNoYW5nZXMuCisKKworCSogZGJ1cy9kYnVzLWxpc3QuYzoKKwkqIGRidXMvZGJ1cy1saXN0Lmg6CisJVHVybiBTdGF0aWNNdXRleCBpbnRvIG5vcm1hbCBtdXRleCArIGluaXQgZnVuY3Rpb24uCisJRXhwb3J0IG5ldyBmdW5jdGlvbnMgX2RidXNfbGlzdF9hbGxvY19saW5rLCBfZGJ1c19saXN0X2ZyZWVfbGluaywKKwlfZGJ1c19saXN0X2FwcGVuZF9saW5rLCBfZGJ1c19saXN0X3ByZXBlbmRfbGluaworCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmM6CisJKiBkYnVzL2RidXMtc3lzZGVwcy5oOgorCU5ldyB0eXBlIGRidXNfYXRvbWljX3QsIGFuZCBuZXcgZnVuY3Rpb25zIF9kYnVzX2F0b21pY19pbmMsCisJX2RidXNfYXRvbWljX2RlYy4gT25seSBzbG93IGZhbGxiYWNrIGltcGxlbWVudGF0aW9uIGF0IHRoZSBtb21lbnQuCisKKwkqIGRidXMvZGJ1cy1wcm90b2NvbC5oOgorCUFkZCBEQlVTX01FU1NBR0VfTE9DQUxfRElTQ09OTkVDVCBkZWZpbmUKKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYzoKKwlNYWtlIHJlZi91bnJlZiBhdG9taWMuCisJRml4IHNvbWUgZG9jcy4KKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24taW50ZXJuYWwuaDoKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmM6CisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5oOgorCU1ha2UgdGhyZWFkc2FmZS4KKwlDaGFuZ2UgX3BlZWsgdG8gX2JvcnJvdyxfcmV0dXJuICYgX3N0ZWFsX2JvcnJvd2VkLgorCUNoYW5nZSBkaXNjb25uZWN0IGNhbGxiYWNrIHRvIGV2ZW50LgorCU1ha2UgZGJ1c19jb25uZWN0aW9uX2Rpc3BhdGNoX21lc3NhZ2VzIHJlZW50cmFudC4KKworCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC5jOgorCURvbid0IHJlZiB0aGUgY29ubmVjdGlvbiBvbiBjYWxscyB0byB0aGUgdHJhbnNwb3J0CisJaW1wbGVtZW50YXRpb24uCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLWhhbmRsZXIuYzoKKwlNYWtlIHRocmVhZHNhZmUuCisKKwkqIGdsaWIvZGJ1cy1nbWFpbi5jOgorCURvbid0IHVzZSBwZWVrX21lc3NhZ2UgYW55bW9yZQorCisJKiB0ZXN0L01ha2VmaWxlLmFtOgorCSogdGVzdC9kZWJ1Zy10aHJlYWQuYzoKKwkqIHRlc3QvZGVidWctdGhyZWFkLmg6CisJU2ltcGxlIHRocmVhZCBpbXBsZW1lbnRhdGlvbiB0aGF0IGFzc2VydHMoKSBvbiBkZWFkbG9ja3MgaW4KKwlzaW5nbGUtdGhyZWFkZWQgY29kZS4KKworCSogdGVzdC9idXMtdGVzdC5jOgorCShtYWluKSBDYWxsIGRlYnVnX3RocmVhZHNfaW5pdC4KKworCSogdGVzdC93YXRjaC5jOgorCVVzZSBkaXNjb25uZWN0IG1lc3NhZ2UgaW5zdGVhZCBvZiBkaXNjb25uZWN0IGNhbGxiYWNrLgorCisJKiBidXMvY29ubmVjdGlvbi5jOgorCSogYnVzL2Nvbm5lY3Rpb24uaDoKKwlEb24ndCBjYWxsIGRidXNfY29ubmVjdGlvbl9zZXRfZGlzY29ubmVjdF9mdW5jdGlvbi4gSW5zdGVhZCBleHBvcnQKKwlidXNfY29ubmVjdGlvbl9kaXNjb25uZWN0LgorCisJKiBidXMvZGlzcGF0Y2guYzoKKwlDYWxsIGJ1c19jb25uZWN0aW9uX2Rpc2Nvbm5lY3Qgd2hlbiB3ZSBnZXQgYSBkaXNjb25uZWN0ZWQgbWVzc2FnZS4KKworMjAwMy0wMi0xNSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAoZGJ1c19tZXNzYWdlX25ldyk6IGZvb2wgYXJvdW5kIHdpdGggdGhlCisJZG9jcworCisyMDAzLTAyLTE0ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtbWVtcG9vbC5jOiBmYWlsIGlmIHRoZSBkZWJ1ZyBmdW5jdGlvbnMgc28gaW5kaWNhdGUKKworCSogZGJ1cy9kYnVzLW1lbW9yeS5jOiBmYWlsIGlmIHRoZSBkZWJ1ZyBmdW5jdGlvbnMgaW5kaWNhdGUgd2UKKwlzaG91bGQKKworCSogZGJ1cy9kYnVzLWludGVybmFscy5jIChfZGJ1c19zZXRfZmFpbF9hbGxvY19jb3VudGVyKQorCShfZGJ1c19kZWNyZW1lbnRfZmFpbF9hbGxvY19jb3VudGVyKTogZGVidWcgZnVuY3Rpb25zIHRvCisJc2ltdWxhdGUgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZXMKKworMjAwMy0wMi0xNCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLWVycm9ycy5oIChzdHJ1Y3QgREJ1c0Vycm9yKTogYWRkIGEgd29yZCBvZiBwYWRkaW5nCisJdG8gREJ1c0Vycm9yCisKKzIwMDMtMDItMTMgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBidXMvZHJpdmVyLmM6IChidXNfZHJpdmVyX2hhbmRsZV9oZWxsbyk6CisJKiBidXMvZHJpdmVyLmg6CisJKiBidXMvc2VydmljZXMuYzogKGJ1c19zZXJ2aWNlX2xvb2t1cCk6CisJUmVvcmRlciBtZXNzYWdlIHNlbmRpbmcgc28gd2UgZ2V0IGEgbW9yZSBzYW5lIG9yZGVyLgorCisJKiB0ZXN0L2J1cy10ZXN0LmM6IChtZXNzYWdlX2hhbmRsZXIpOgorCUZpeCB0eW9wLgorCisyMDAzLTAyLTEzICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogYnVzL2RyaXZlci5jOiAoYnVzX2RyaXZlcl9zZW5kX3NlcnZpY2VfZGVsZXRlZCksCisJKGJ1c19kcml2ZXJfc2VuZF9zZXJ2aWNlX2NyZWF0ZWQpLCAoYnVzX2RyaXZlcl9zZW5kX3NlcnZpY2VfbG9zdCksCisJKGJ1c19kcml2ZXJfc2VuZF9zZXJ2aWNlX2FjcXVpcmVkKSwgKGJ1c19kcml2ZXJfaGFuZGxlX2hlbGxvKSwKKwkoYnVzX2RyaXZlcl9zZW5kX3dlbGNvbWVfbWVzc2FnZSksCisJKGJ1c19kcml2ZXJfaGFuZGxlX2xpc3Rfc2VydmljZXMpLAorCShidXNfZHJpdmVyX2hhbmRsZV9hY3F1aXJlX3NlcnZpY2UpLAorCShidXNfZHJpdmVyX2hhbmRsZV9zZXJ2aWNlX2V4aXN0cyk6CisJKiBkYnVzL2RidXMtYnVzLmM6IChkYnVzX2J1c19yZWdpc3Rlcl9jbGllbnQpLAorCShkYnVzX2J1c19hY3F1aXJlX3NlcnZpY2UpLCAoZGJ1c19idXNfc2VydmljZV9leGlzdHMpOgorCSogZGJ1cy9kYnVzLWVycm9ycy5jOiAoZGJ1c19yZXN1bHRfdG9fc3RyaW5nKToKKwkqIGRidXMvZGJ1cy1lcnJvcnMuaDoKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmM6IChkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MpLAorCShkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3NfdmFsaXN0KSwgKGRidXNfbWVzc2FnZV9nZXRfYXJncyksCisJKGRidXNfbWVzc2FnZV9nZXRfYXJnc192YWxpc3QpLCAoZGJ1c19tZXNzYWdlX2dldF9hcmdzX2l0ZXIpLAorCShkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJnX3R5cGUpLCAoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X3N0cmluZyksCisJKGRidXNfbWVzc2FnZV9pdGVyX2dldF9ieXRlX2FycmF5KSwKKwkoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X3N0cmluZ19hcnJheSksIChtZXNzYWdlX2l0ZXJfdGVzdCksCisJKGNoZWNrX21lc3NhZ2VfaGFuZGxpbmcpLCAoX2RidXNfbWVzc2FnZV90ZXN0KToKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmg6CisJKiB0ZXN0L2J1cy10ZXN0LmM6IChtYWluKToKKwlDaGFuZ2UgZmllbGRzIHRvIGFyZ3VtZW50cyBpbiBtZXNzYWdlcywgc28gdGhhdCB0aGV5IHdvbid0IGJlCisJY29uZnVzZWQgd2l0aCBoZWFkZXIgZmllbGRzLgorCisJKiBnbGliL3Rlc3QtZGJ1cy1nbGliLmM6IChtYWluKToKKwlSZW1vdmUgYXBwZW5kX2ZpZWxkcyBmcm9tIGhlbGxvIG1lc3NhZ2UuCisKKzIwMDMtMDItMTMgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBkYnVzL2RidXMtZXJyb3JzLmM6CisJKiBkYnVzL2RidXMtbWVzc2FnZS5jOgorCSogZGJ1cy9kYnVzLXN0cmluZy5jOgorCURvY3VtZW50YXRpb24gZml4ZXMuCisKKzIwMDMtMDItMTMgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBnbGliL2RidXMtZ21haW4uYzogKHRpbWVvdXRfaGFuZGxlciksIChhZGRfdGltZW91dCksCisJKHJlbW92ZV90aW1lb3V0KToKKwlJbXBsZW1lbnQgc3VwcG9ydCBmb3IgdGltZW91dHMgaW4gZGJ1cy1nbGliLgorCisyMDAzLTAyLTEzICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UtYnVpbGRlci5jOiAoX2RidXNfbWVzc2FnZV9kYXRhX2xvYWQpOgorCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYzogKHByb2Nlc3NfdGVzdF9zdWJkaXIpOgorCSogdGVzdC9icmVhay1sb2FkZXIuYzogKGZpbmRfYnJlYWtzX2Jhc2VkX29uKToKKwlQbHVnIHNvbWUgbWVtb3J5IGxlYWtzLgorCisyMDAzLTAyLTEzICBSaWNoYXJkIEh1bHQgIDxyaHVsdEBjb2RlZmFjdG9yeS5zZT4KKworCSogYnVzL21haW4uYzogRml4IGJ1aWxkLgorCisJKiBkYnVzL2RidXMtZXJyb3JzLmg6CisJKiBkYnVzL2RidXMtZXJyb3JzLmM6IEZpeCBjb3B5cmlnaHQgZm9yIEFuZGVycy4KKworMjAwMy0wMi0xMyAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGJ1cy9NYWtlZmlsZS5hbToKKwlBZGQgdXRpbHMuW2NoXQorCisJKiBidXMvY29ubmVjdGlvbi5jOiAoYnVzX2Nvbm5lY3Rpb25fZm9yZWFjaCk6CisJRml4IGEgd2FybmluZy4KKworCSogYnVzL2Rlc2t0b3AtZmlsZS5jOiAoZ3Jvd19saW5lc19pbl9zZWN0aW9uKSwgKGdyb3dfc2VjdGlvbnMpLAorCSh1bmVzY2FwZV9zdHJpbmcpLCAobmV3X3NlY3Rpb24pLCAocGFyc2Vfc2VjdGlvbl9zdGFydCksCisJKHBhcnNlX2tleV92YWx1ZSksIChyZXBvcnRfZXJyb3IpLCAoYnVzX2Rlc2t0b3BfZmlsZV9sb2FkKSwKKwkoYnVzX2Rlc2t0b3BfZmlsZV9nZXRfc3RyaW5nKToKKwkqIGJ1cy9kZXNrdG9wLWZpbGUuaDoKKwlVc2UgREJ1c0Vycm9yIGZvciBlcnJvciByZXBvcnRpbmcuCisKKwkqIGJ1cy9kaXNwYXRjaC5jOiAoc2VuZF9vbmVfbWVzc2FnZSksCisJKGJ1c19kaXNwYXRjaF9tZXNzYWdlX2hhbmRsZXIpOgorCSogYnVzL2RyaXZlci5jOiAoYnVzX2RyaXZlcl9zZW5kX3NlcnZpY2VfZGVsZXRlZCksCisJKGJ1c19kcml2ZXJfc2VuZF9zZXJ2aWNlX2NyZWF0ZWQpLCAoYnVzX2RyaXZlcl9zZW5kX3NlcnZpY2VfbG9zdCksCisJKGJ1c19kcml2ZXJfc2VuZF9zZXJ2aWNlX2FjcXVpcmVkKSwgKGJ1c19kcml2ZXJfaGFuZGxlX2hlbGxvKSwKKwkoYnVzX2RyaXZlcl9zZW5kX3dlbGNvbWVfbWVzc2FnZSksCisJKGJ1c19kcml2ZXJfaGFuZGxlX2xpc3Rfc2VydmljZXMpLAorCShidXNfZHJpdmVyX2hhbmRsZV9hY3F1aXJlX3NlcnZpY2UpLAorCShidXNfZHJpdmVyX2hhbmRsZV9zZXJ2aWNlX2V4aXN0cyk6CisJKiBidXMvbG9vcC5jOiAoYnVzX2xvb3BfcnVuKToKKwkqIGJ1cy9tYWluLmM6CisJVXNlIEJVU19IQU5ETEVfT09NIGluc3RlYWQgb2YgX0RCVVNfSEFORExFX09PTS4KKworCSogYnVzL3V0aWxzLmM6IChidXNfd2FpdF9mb3JfbWVtb3J5KToKKwkqIGJ1cy91dGlscy5oOgorCU5ldyBmaWxlcyB3aXRoIGdlbmVyYWwgdXRpbGl0eSBmdW5jdGlvbnMuCisKKwkqIGRidXMvZGJ1cy1pbnRlcm5hbHMuaDoKKwlSZW1vdmUgX0RCVVNfSEFORExFX09PTS4KKworMjAwMy0wMi0xMyAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGRidXMvZGJ1cy1lcnJvcnMuYzogKGRidXNfcmVzdWx0X3RvX3N0cmluZyksIChkYnVzX2Vycm9yX2luaXQpLAorCShkYnVzX2Vycm9yX2ZyZWUpLCAoZGJ1c19zZXRfZXJyb3JfY29uc3QpLCAoZGJ1c19zZXRfZXJyb3IpOgorCSogZGJ1cy9kYnVzLWVycm9ycy5oOgorCUFkZCBEQnVzRXJyb3Igc3RydWN0dXJlLgorCisyMDAzLTAyLTEzICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL3N0YW5kYXJkLWFjcXVpcmUtc2VydmljZS5tZXNzYWdlOgorCSogdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL3N0YW5kYXJkLWhlbGxvLm1lc3NhZ2U6CisJKiB0ZXN0L2RhdGEvdmFsaWQtbWVzc2FnZXMvc3RhbmRhcmQtbGlzdC1zZXJ2aWNlcy5tZXNzYWdlOgorCSogdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL3N0YW5kYXJkLXNlcnZpY2UtZXhpc3RzLm1lc3NhZ2U6CisJQWRkIHNvbWUgc3RhbmRhcmQgbWVzc2FnZXMuCisKKzIwMDMtMDItMTMgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBidXMvZHJpdmVyLmM6IChidXNfZHJpdmVyX3NlbmRfd2VsY29tZV9tZXNzYWdlKSwKKwkoYnVzX2RyaXZlcl9oYW5kbGVfbGlzdF9zZXJ2aWNlcyksCisJKGJ1c19kcml2ZXJfaGFuZGxlX2FjcXVpcmVfc2VydmljZSksCisJKGJ1c19kcml2ZXJfaGFuZGxlX3NlcnZpY2VfZXhpc3RzKSwgKGJ1c19kcml2ZXJfaGFuZGxlX21lc3NhZ2UpOgorCVVwZGF0ZSBmb3IgQVBJIGNoYW5nZXMgaW4gbGliZGJ1cy4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYzogKGRidXNfbWVzc2FnZV9uZXdfcmVwbHkpOgorCSogZGJ1cy9kYnVzLW1lc3NhZ2UuaDoKKwlSZW1vdmUgdGhlIG5hbWUgYXJndW1lbnQuIFRoZSBzcGVjIHN0YXRlcyB0aGF0IHJlcGxpZXMgc2hvdWxkbid0CisJaGF2ZSBhIG5hbWUuCisKKzIwMDMtMDItMTMgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBidXMvZGVza3RvcC1maWxlLmM6IChwYXJzZV9zZWN0aW9uX3N0YXJ0KSwgKHBhcnNlX2tleV92YWx1ZSksCisJKHJlcG9ydF9lcnJvciksIChidXNfZGVza3RvcF9maWxlX2xvYWQpLCAobG9va3VwX3NlY3Rpb24pLAorCShsb29rdXBfbGluZSksIChidXNfZGVza3RvcF9maWxlX2dldF9yYXcpLAorCShidXNfZGVza3RvcF9maWxlX2dldF9zdHJpbmcpOgorCSogYnVzL2Rlc2t0b3AtZmlsZS5oOgorCVNvbWUgZml4ZXMsIGFuZCBuZXcgZnVuY3Rpb25zIGZvciBnZXR0aW5nIGEga2V5IHZhbHVlIGZyb20gYSBzZWN0aW9uLgorCisyMDAzLTAyLTEzICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiB0ZXN0L2RhdGEvYXV0aC9mYWlsLWFmdGVyLW4tYXR0ZW1wdHMuYXV0aC1zY3JpcHQ6IG5ldyB0ZXN0CisKKwkqIGRidXMvZGJ1cy1hdXRoLmMgKHNlbmRfcmVqZWN0ZWQpOiBzaHV0ZG93bl9tZWNoKCkgd2hlbiB3ZQorCXJlamVjdCB0aGUgY2xpZW50LgorCisyMDAzLTAyLTEzICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtYXV0aC5jIChoYW5kbGVfc2VydmVyX2RhdGFfZXh0ZXJuYWxfbWVjaCk6IGFyZ3MgdG8KKwlkYnVzX2NyZWRlbnRpYWxzX21hdGNoIHdlcmUgYmFja3dhcmQKKworCSogZGJ1cy9kYnVzLWF1dGgtc2NyaXB0LmMgKF9kYnVzX2F1dGhfc2NyaXB0X3J1bik6IHN1cHBvcnQKKwlOT19DUkVERU5USUFMUyBhbmQgUk9PVF9DUkVERU5USUFMUworCisJKiBkYnVzL2RidXMtYXV0aC5jIChfZGJ1c19hdXRoX2RvX3dvcmspOiBtb3ZlIGdldF9zdGF0ZSgpIHJvdXRpbmUKKwlpbnRvIGhlcmUuIE5ldmVyIHByb2Nlc3MgbW9yZSBjb21tYW5kcyBhZnRlciB3ZSd2ZSByZWFjaGVkIGFuCisJZW5kIHN0YXRlOyBzdG9yZSBmdXJ0aGVyIGRhdGEgYXMgdW51c2VkIGJ5dGVzLgorCisJKiB0ZXN0L2RhdGEvYXV0aC8qOiBhZGQgbW9yZSBhdXRoIHRlc3RzCisKKwkqIGRidXMvZGJ1cy1hdXRoLXNjcmlwdC5jIChfZGJ1c19hdXRoX3NjcmlwdF9ydW4pOiBzdXBwb3J0IEVYUEVDVAorCWNvbW1hbmQgdG8gbWF0Y2ggZXhhY3Qgc3RyaW5nIGFuZCBFWFBFQ1RfVU5VU0VEIHRvIG1hdGNoIHVudXNlZAorCWJ5dGVzCisKKwkqIHRlc3QvTWFrZWZpbGUuYW0gKGRpc3QtaG9vayk6IGZpeCB0byBkaXN0IGFsbCB0aGUgdGVzdCBzdHVmZgorCisyMDAzLTAyLTEyICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtc3RyaW5nLmMgKF9kYnVzX3N0cmluZ19wb3BfbGluZSk6IGZpeCB0byBhbHNvIHN0cmlwCisJXHIgb2ZmIG9mIHBvcHBlZCBsaW5lcworCisJKiBkYnVzL2RidXMtYXV0aC5jIChfZGJ1c19hdXRoX3Rlc3QpOiB3cml0ZSBjb2RlIHRvIHJ1biBhdXRoCisJc2NyaXB0cworCisJKiBkYnVzL2RidXMtYXV0aC1zY3JpcHQuYyAoX2RidXNfYXV0aF9zY3JpcHRfcnVuKTogd2hlbiBkb2luZyBhCisJU0VORCwgYXBwZW5kIFxyXG4KKworMjAwMy0wMi0xMiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9NYWtlZmlsZS5hbTogcmVtb3ZlIGJyZWFrLWxvYWRlciBmcm9tIHRoZSBidWlsZCwgc2luY2UgaXQKKwltb3ZlZC4KKworCSogY29uZmlndXJlLmluOiBhZGQgLS1lbmFibGUtZ2NvdiB0byB0dXJuIG9uIGNvdmVyYWdlIHByb2ZpbGluZworCWZsYWdzIGFuZCBkaXNhYmxlIG9wdGltaXphdGlvbgorCisyMDAzLTAyLTEwICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisgICAgICAgICogZGJ1cy9kYnVzLWF1dGgtc2NyaXB0LmMsIGRidXMvZGJ1cy1hdXRoLXNjcmlwdC5oOiBzeW5jCisJaW5pdGlhbCBjdXQgYXQgdGVzdCBmcmFtZXdvcmsgZm9yIERCdXNBdXRoIGZyb20gbGFwdG9wLgorCURvZXNuJ3QgcXVpdGUgd29yayB5ZXQgYnV0IGl0IGNvbXBpbGVzIGFuZCBJIG5lZWQgdG8gZ2V0CisJaXQgb2ZmIHRoZSAyNjZtaHogbGFwdG9wLiA7LSkKKworCSogZGJ1cy9kYnVzLXNlcnZlci1kZWJ1Zy5jIChfZGJ1c19zZXJ2ZXJfZGVidWdfYWNjZXB0X3RyYW5zcG9ydCk6CisJZml4IGEgbWVtbGVhayBpbiBlcnJvciBjYXNlCisKKzIwMDMtMDItMTIgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBidXMvTWFrZWZpbGUuYW06CisJKiBidXMvZGVza3RvcC1maWxlLmM6CisJKiBidXMvZGVza3RvcC1maWxlLmg6CisJQWRkIGEgZGVza3RvcCBmaWxlIHBhcnNlci4KKworMjAwMy0wMi0xMSAgWmFjayBSdXNpbiAgPHphY2tAa2RlLm9yZz4KKworCSogcXQvbWVzc2FnZS5baHxjcHBdOiBzYW1wbGUgaW1wbGVtZW50YXRpb24KKwlvZiB0aGUgS0RFIHdyYXBwZXIgZm9yIERCdXNNZXNzYWdlCisKKzIwMDMtMDItMDkgIFphY2sgUnVzaW4gIDx6YWNrQGtkZS5vcmc+CisKKwkqIHRlc3QvYnVzLXRlc3QuYzogbWFrZV9pdF9jb21waWxlCisJKiBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnNnbWw6IG1pbmltYWwgc2VtYW50aWMgZml4CisKKzIwMDMtMDItMDYgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJUmVsZWFzZSAwLjMKKworCSogTkVXUzogVXBkYXRlCisKKzIwMDMtMDItMDYgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBkYnVzL01ha2VmaWxlLmFtOgorCSogZGJ1cy9kYnVzLWJyZWFrLWxvYWRlci5jOgorCSogdGVzdC9NYWtlZmlsZS5hbToKKwkqIHRlc3QvYnJlYWstbG9hZGVyLmM6CisJTW92ZSBkYnVzLWJyZWFrLWxvYWRlciB0byB0ZXN0LyBhbmQgcmVuYW1lIGl0IHRvIGJyZWFrLWxvYWRlci4KKworMjAwMy0wMi0wMiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLWtleXJpbmcuYywgZGJ1cy9kYnVzLWtleXJpbmcuaDogdGVtcGxhdGUgZmlsZXMKKwlmb3IgY29kZSB0byBtYW5hZ2UgY29va2llcyBpbiB5b3VyIGhvbWUgZGlyZWN0b3J5CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMgKF9kYnVzX2dlbmVyYXRlX3JhbmRvbV9ieXRlcyk6IG5ldyBmdW5jdGlvbgorCisJKiBkYnVzL2RidXMtYXV0aC5jIChnZXRfc3RhdGUpOiBpbXBvc2UgYSBtYXhpbXVtIG51bWJlciBvZiB0cmllcworCXRvIGF1dGhlbnRpY2F0ZSwgdGhlbiBkaXNjb25uZWN0IHRoZSBjbGllbnQuCisKKzIwMDMtMDItMDMgIEFsZXhhbmRlciBMYXJzc29uICA8YWxleGxAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAoZGJ1c19tZXNzYWdlX2FwcGVuZF9maWVsZHMpOgorCUNvcnJlY3QgZG9jcy4KKworMjAwMy0wMi0wMiAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGRvYy9kYnVzLXNwZWNpZmljYXRpb24uc2dtbDoKKwlVcGRhdGUgYWRkcmVzcyBmb3JtYXQgc2VjdGlvbi4KKworMjAwMy0wMi0wMiAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIHRlc3QvTWFrZWZpbGUuYW06CisJKiB0ZXN0L2J1cy10ZXN0LmM6IChnZXRfdGltZSksIChhZGRfdGltZW91dCksIChyZW1vdmVfdGltZW91dCksCisJKG1lc3NhZ2VfaGFuZGxlciksIChuZXdfY29ubmVjdGlvbl9jYWxsYmFjayksIChsb29wX3F1aXQpLAorCShsb29wX3J1biksIChtYWluKToKKwlBZGQgYnVzIHRlc3QuCisKKzIwMDMtMDItMDIgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBidXMvZHJpdmVyLmM6IChidXNfZHJpdmVyX2hhbmRsZV9zZXJ2aWNlX2V4aXN0cyk6CisJU2ltcGxpZnkgdGhlIGNvZGUgYSBiaXQuCisKKwkqIGRidXMvZGJ1cy1idXMuYzogKGRidXNfYnVzX3NlcnZpY2VfZXhpc3RzKToKKwlGaXggYSBzaWxseS4KKworMjAwMy0wMi0wMiAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGJ1cy9NYWtlZmlsZS5hbToKKwlBZGQgbGliZGJ1cy1kYWVtb24ubGEgYW5kIGxpbmsgdG8gaXQuCisKKzIwMDMtMDItMDEgIEphbWVzIFdpbGxjb3ggIDxqd2lsbGNveEBnbm9tZS5vcmc+CisKKwkqIGJ1cy9kcml2ZXIuYzogKGJ1c19kcml2ZXJfaGFuZGxlX293bl9zZXJ2aWNlKToKKwlBY3R1YWxseSBpbmNsdWRlIHRoZSBzZXJ2aWNlIHJlcGx5IGNvZGUgaW4gdGhlIG1lc3NhZ2UuCisKKzIwMDMtMDItMDIgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBidXMvZHJpdmVyLmM6IChidXNfZHJpdmVyX2hhbmRsZV9zZXJ2aWNlX2V4aXN0cyk6CisJRG9uJ3QgdW5yZWYgdGhlIGluY29taW5nIG1lc3NhZ2UuCisKKzIwMDMtMDItMDIgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBkYnVzL2RidXMuaDogQWRkIGRidXMtYWRkcmVzcy5oIGFuZCBkYnVzLWJ1cy5oCisKKzIwMDMtMDItMDIgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBkYnVzL2RidXMtc2VydmVyLmM6IChkYnVzX3NlcnZlcl9saXN0ZW4pOgorCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC5jOiAoX2RidXNfdHJhbnNwb3J0X29wZW4pOgorCWlmZGVmIG91dCB0aGUgY2FsbHMgdG8gdGhlIGRlYnVnIHRyYW5zcG9ydCBhbmQgc2VydmVyLgorCisyMDAzLTAyLTAyICBBbGV4YW5kZXIgTGFyc3NvbiAgPGFsZXhsQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy13YXRjaC5jIChkYnVzX3dhdGNoX2dldF9mbGFncyk6CisJQWRkIG5vdGUgaW4gdGhlIGRvY3MgdGhhdCBFUlJPUiBvciBIQU5HVVAgd29uJ3QgYmUgcmV0dXJuZWQKKwlhbmQgYXJlIGFzc3VtZWQgYWx3YXlzIG9uLgorCisJKiBnbGliL2RidXMtZ21haW4uYyAoYWRkX3dhdGNoKToKKwlBbHdheXMgYWRkIElPX0VSUiB8IElPX0hVUAorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5oOgorCUFkZCBzZW1pY29sb24gYWZ0ZXIgZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X3N0cmluZ19hcnJheSgpLgorCU1ha2VzIHF0IGNvZGUgYnVpbGQgYWdhaW4KKworMjAwMy0wMi0wMSAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGJ1cy9kcml2ZXIuYzogKGNyZWF0ZV91bmlxdWVfY2xpZW50X25hbWUpLAorCShidXNfZHJpdmVyX2hhbmRsZV9oZWxsbyk6CisJRG9uJ3QgdGFrZSBhIG5hbWUsIGp1c3QgdXNlIGEgbnVtZXJpYyBpZCB0byBpZGVudGlmeQorCWVhY2ggY2xpZW50LgorCisJKiBkYnVzL01ha2VmaWxlLmFtOgorCSogZGJ1cy9kYnVzLWJ1cy5jOiAoZGJ1c19idXNfcmVnaXN0ZXJfY2xpZW50KSwKKwkoZGJ1c19idXNfYWNxdWlyZV9zZXJ2aWNlKSwgKGRidXNfYnVzX3NlcnZpY2VfZXhpc3RzKToKKwkqIGRidXMvZGJ1cy1idXMuaDoKKwlBZGQgbmV3IGNvbnZlbmllbmNlIGZ1bmN0aW9ucyBmb3IgY29tbXVuaWNhdGluZyB3aXRoIHRoZSBidXMuCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmg6CisKKwkqIGRidXMvZGJ1cy1wcm90b2NvbC5oOgorCUZpeCBhIHR5cG8uCisKKzIwMDMtMDItMDEgIEFsZXhhbmRlciBMYXJzc29uICA8YWxleGxAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAoZGJ1c19tZXNzYWdlX2FwcGVuZF9maWVsZHMpOgorCUFkZCBzb21lIG1vcmUgZG9jIGNvbW1lbnRzLgorCisyMDAzLTAyLTAxICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtYnJlYWstbG9hZGVyLmMgKHJhbmRvbWx5X21vZGlmeV9sZW5ndGgpOiBjaGFuZ2UKKwlhIDQtYnl0ZSB2YWx1ZSBpbiB0aGUgbWVzc2FnZSBhcyBpZiBpdCB3ZXJlIGEgbGVuZ3RoCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMgKF9kYnVzX3N0cmluZ19zYXZlX3RvX2ZpbGUpOiBkb24ndCBzZXQKKwlleGVjdXRlIGJpdCBvbiBzYXZlZCBmaWxlcworCisyMDAzLTAyLTAxICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtYnJlYWstbG9hZGVyLmMgKG1haW4pOiBuZXcgcHJvZ3JhbSB0byBmaW5kIG1lc3NhZ2VzCisJdGhhdCBicmVhayB0aGUgbG9hZGVyLgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jIChfZGJ1c19zdHJpbmdfYXBwZW5kX3VpbnQpOiBuZXcgZnVuY3Rpb24KKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMgKF9kYnVzX3N0cmluZ19zYXZlX3RvX2ZpbGUpOiBuZXcgZnVuY3Rpb24KKworCSogZGJ1cy9kYnVzLXN0cmluZy5jIChfZGJ1c19zdHJpbmdfc2V0X2J5dGUpOiBuZXcKKworMjAwMy0wMS0zMSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYzogcmVmYWN0b3IgdGhlIHRlc3QgY29kZSB0byBiZSBtb3JlIGdlbmVyYWwsCisJaW4gcHJlcGFyYXRpb24gZm9yIHdyaXRpbmcgYSAicmFuZG9tbHkgcGVybXV0ZSB0ZXN0IGNhc2VzIHRvCisJdHJ5IHRvIGJyZWFrIHRoZSBsb2FkZXIiIHByb2dyYW0uCisKKzIwMDMtMDEtMzEgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRvYy9kYnVzLXNwZWNpZmljYXRpb24uc2dtbDogd29yayBvbiB0aGUgc3BlY2lmaWNhdGlvbgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChfZGJ1c19tZXNzYWdlX2xvYWRlcl9yZXR1cm5fYnVmZmVyKTogY2hlY2sKKwl0aGUgcHJvdG9jb2wgdmVyc2lvbiBvZiB0aGUgbWVzc2FnZS4KKworCSogZGJ1cy9kYnVzLXByb3RvY29sLmg6IGRyb3Agc3BlY2lhbCBfUkVQTFkgbmFtZXMsIHRoZSBzcGVjCisJbm8gbG9uZ2VyIHNwZWNpZmllcyB0aGF0LgorCShEQlVTX1NFUlZJQ0VfUkVQTFlfU0VSVklDRV9FWElTVFMpOiBmaXggZmxhZ3MgKDEvMi80Lzggbm90CisJMS8yLzMvNCkKKworCSogZGJ1cy9kYnVzLW1hcnNoYWwuYyAoX2RidXNfbWFyc2hhbF9nZXRfYXJnX2VuZF9wb3MpOiBhZGQgbWlzc2luZworCSJicmVhayIgZm9yIERCVVNfVFlQRV9OSUwsIHJlbW92ZSBAdG9kbworCisyMDAzLTAxLTMxICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChkYnVzX21lc3NhZ2Vfc2V0X2lzX2Vycm9yX3JlcGx5KTogcmVuYW1lCisJanVzdCBzZXRfaXNfZXJyb3IvZ2V0X2lzX2Vycm9yIGFzIHRoaXMgaXMgYSBjb21tb25seS11c2VkCisJZnVuY3Rpb24sIGFuZCB3cml0ZSBkb2NzLgorCisyMDAzLTAxLTMxICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogZGJ1cy9kYnVzLWFkZHJlc3MuYzogKGRidXNfYWRkcmVzc19lbnRyeV9mcmVlKToKKwlGcmVlIGtleSBhbmQgdmFsdWUgbGlzdHMuCisKKwkqIGRidXMvZGJ1cy1pbnRlcm5hbHMuYzogKF9kYnVzX3R5cGVfdG9fc3RyaW5nKToKKwlBZGQgdGhlIHR5cGVzIHdlIGRpZG4ndCBoYXZlLgorCisJKiBkYnVzL2RidXMtbWFyc2hhbC5jOiAoX2RidXNfbWFyc2hhbF9nZXRfYXJnX2VuZF9wb3MpLAorCShfZGJ1c19tYXJzaGFsX3ZhbGlkYXRlX2FyZyk6CisJQWRkIE5JTCB0eXBlcy4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYzogKGRidXNfbWVzc2FnZV9zZXRfc2VuZGVyKToKKwlSZW1vdmUgdG9kbyBhYm91dCBiZWluZyBhYmxlIHRvIHNldCBzZW5kZXIgdG8gTlVMTC4KKworCShkYnVzX21lc3NhZ2Vfc2V0X2lzX2Vycm9yX3JlcGx5KSwKKwkoZGJ1c19tZXNzYWdlX2dldF9pc19lcnJvcl9yZXBseSk6CisJKiBkYnVzL2RidXMtbWVzc2FnZS5oOgorCU5ldyBmdW5jdGlvbnMuCisKKwkqIGRidXMvZGJ1cy1wcm90b2NvbC5oOgorCUFkZCBlcnJvciByZXBseSBmbGFnLgorCisJKiB0ZXN0L2RhdGEvdmFsaWQtbWVzc2FnZXMvb3Bwb3NpdGUtZW5kaWFuLm1lc3NhZ2U6CisJQWRkIE5JTCB0eXBlIHRvIHRlc3QuCisKKzIwMDMtMDEtMzEgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRvYy9kYnVzLXNwZWNpZmljYXRpb24uc2dtbDogZnVsbHkgc3BlY2lmeSB0aGUgaGVhZGVyLiAgQWRkCisJZmxhZ3MgYW5kIG1ham9yIHByb3RvY29sIHZlcnNpb24sIGFuZCBjaGFuZ2UgaGVhZGVyL2JvZHkgbGVuIHRvCisJdW5zaWduZWQuCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLWJ1aWxkZXIuYyAoYXBwZW5kX3NhdmVkX2xlbmd0aCk6IGFwcGVuZCBsZW5ndGgKKwlhcyB1aW50MzIKKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAoZGJ1c19tZXNzYWdlX2NyZWF0ZV9oZWFkZXIpOiBjaGFuZ2UgaGVhZGVyCisJbGVuZ3RoIGFuZCBib2R5IGxlbmd0aCB0byB1bnNpZ25lZC4gQWRkIHRoZSBuZXcgZmllbGRzIGZyb20gdGhlCisJc3BlYworCShfZGJ1c19tZXNzYWdlX2xvYWRlcl9yZXR1cm5fYnVmZmVyKTogdW5zaWduZWQgaGVhZGVyL2JvZHkgbGVuCisKKzIwMDMtMDEtMzAgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy1hdXRoLmM6IHJld29yayB0byB1c2Ugb25seSBSRUpFQ1RFRCwgbm8KKwlNRUNIQU5JU01TCisKKwkqIGRvYy9kYnVzLXNhc2wtcHJvZmlsZS50eHQ6IGRyb3AgTUVDSEFOSVNNUyBhbmQganVzdAorCXVzZSBSRUpFQ1RFRCwgc3VnZ2VzdGVkIGJ5IE1hcmsgTWNMb3VnaGxpbgorCisyMDAzLTAxLTMwICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtc2VydmVyLmMgKGRidXNfc2VydmVyX2xpc3Rlbik6IEB0b2RvIGFib3V0IGhvdyB3ZSBuZWVkCisJYSBiZXR0ZXIgd2F5IHRvIHJlcG9ydCBlcnJvcnMgaGVyZS4gZS5nLiAgInVuaXggYWRkcmVzcyBsYWNrcworCXBhdGgiIG9yIHNvbWV0aGluZy4gYWxzbyAibm8gc3VjaCBmaWxlIiB3aGVuIHRoZSBwYXRoIGRvZXNuJ3QKKwlleGlzdCwgZXRjLgorCisJKiBkYnVzL2RidXMtYWRkcmVzcy5jIChkYnVzX2FkZHJlc3NfZW50cmllc19mcmVlKTogYWRkIEB0b2RvIGFib3V0CisJbGVha2luZyBsaXN0IG5vZGVzCisJKGRidXNfcGFyc2VfYWRkcmVzcyk6IGFkZCBAdG9kbyBhYm91dCBkb2N1bWVudGluZyBhZGRyZXNzIGZvcm1hdCwKKwlhbmQgYWxsb3dpbmcgLCBhbmQgOyB0byBiZSBlc2NhcGVkCisKKzIwMDMtMDEtMzAgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBkYnVzL01ha2VmaWxlLmFtOgorCUFkZCBkYnVzLWFkZHJlc3MuW2NoXQorCisJKiBkYnVzL2RidXMtYWRkcmVzcy5jOiAoZGJ1c19hZGRyZXNzX2VudHJ5X2ZyZWUpLAorCShkYnVzX2FkZHJlc3NfZW50cmllc19mcmVlKSwgKGNyZWF0ZV9lbnRyeSksCisJKGRidXNfYWRkcmVzc19lbnRyeV9nZXRfbWV0aG9kKSwgKGRidXNfYWRkcmVzc19lbnRyeV9nZXRfdmFsdWUpLAorCShkYnVzX3BhcnNlX2FkZHJlc3MpLCAoX2RidXNfYWRkcmVzc190ZXN0KToKKwkqIGRidXMvZGJ1cy1hZGRyZXNzLmg6CisJTmV3IGZpbGVzIGZvciBkZWFsaW5nIHdpdGggYWRkcmVzcyBwYXJzaW5nLgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jOgorCURvY3VtZW50IHRpbWVvdXQgZnVuY3Rpb25zLgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jOgorCURvY3VtZW50IGRidXNfbWVzc2FnZV9uZXdfZnJvbV9tZXNzYWdlLgorCisJKiBkYnVzL2RidXMtc2VydmVyLWRlYnVnLmM6CisJRG9jdW1lbnQuCisKKwkqIGRidXMvZGJ1cy1zZXJ2ZXIuYzogKGRidXNfc2VydmVyX2xpc3Rlbik6CisJUGFyc2UgYWRkcmVzcyBhbmQgdXNlIGNvcnJlY3Qgc2VydmVyIGltcGxlbWVudGF0aW9uLgorCisJKiBkYnVzL2RidXMtc3RyaW5nLmM6IChfZGJ1c19zdHJpbmdfZmluZF90byksIChfZGJ1c19zdHJpbmdfdGVzdCk6CisJKiBkYnVzL2RidXMtc3RyaW5nLmg6CisJTmV3IGZ1bmN0aW9uIHdpdGggdGVzdC4KKworCSogZGJ1cy9kYnVzLXRlc3QuYzogKGRidXNfaW50ZXJuYWxfc3ltYm9sX2RvX25vdF91c2VfcnVuX3Rlc3RzKToKKwkqIGRidXMvZGJ1cy10ZXN0Lmg6CisJQWRkIGFkZHJlc3MgdGVzdHMuCisKKwkqIGRidXMvZGJ1cy10cmFuc3BvcnQtZGVidWcuYzoKKwlEb2N1bWVudC4KKworCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC5jOiAoX2RidXNfdHJhbnNwb3J0X29wZW4pOgorCVBhcnNlIGFkZHJlc3MgYW5kIHVzZSBjb3JyZWN0IHRyYW5zcG9ydCBpbXBsZW1lbnRhdGlvbi4KKworMjAwMy0wMS0zMCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYzogdXNlIG1lc3NhZ2UtPmJ5dGVfb3JkZXIgaW5zdGVhZCBvZgorCURCVVNfQ09NUElMRVJfQllURV9PUkRFUiB0aHJvdWdob3V0LgorCShkYnVzX21lc3NhZ2VfY3JlYXRlX2hlYWRlcik6IHBhZCBoZWFkZXIgdG8gYWxpZ24gdGhlCisJc3RhcnQgb2YgdGhlIGJvZHkgb2YgdGhlIG1lc3NhZ2UgdG8gOC1ieXRlIGJvdW5kYXJ5CisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLmg6IG1ha2UgYWxsIHRoZSBkZW1hcnNoYWxlcnMgdGFrZSBjb25zdAorCURCdXNTdHJpbmcgYXJndW1lbnRzLgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChfZGJ1c19tZXNzYWdlX2xvYWRlcl9yZXR1cm5fYnVmZmVyKToKKwl2YWxpZGF0ZSBtZXNzYWdlIGFyZ3MgaGVyZSwgc28gd2UgZG9uJ3QgaGF2ZSB0byBkbyBzbG93IHZhbGlkYXRpb24KKwlsYXRlciwgYW5kIHNvIHdlIGNhdGNoIGJhZCBtZXNzYWdlcyBhcyB0aGV5IGFyZSBpbmNvbWluZy4gQWxzbyBhZGQKKwliZXR0ZXIgY2hlY2tzIG9uIGhlYWRlcl9sZW4gYW5kIGJvZHlfbGVuLiBBbHNvIGZpbGwgaW4KKwltZXNzYWdlLT5ieXRlX29yZGVyCisKKwkqIGRidXMvZGJ1cy1zdHJpbmcuYyAoX2RidXNfc3RyaW5nX3ZhbGlkYXRlX3V0ZjgpOiBuZXcgKG5vdAorCWltcGxlbWVudGVkIHByb3Blcmx5KQorCShfZGJ1c19zdHJpbmdfdmFsaWRhdGVfbnVsKTogbmV3IGZ1bmN0aW9uIHRvIGNoZWNrIGFsbC1udWwKKworCSogZGJ1cy9kYnVzLW1hcnNoYWwuYyAoX2RidXNfbWFyc2hhbF9nZXRfZmllbGRfZW5kX3Bvcyk6IHJlbmFtZQorCWdldF9hcmdfZW5kX3BvcyBhbmQgcmVtb3ZlIGFsbCB2YWxpZGF0aW9uCisJKF9kYnVzX21hcnNoYWxfdmFsaWRhdGVfYXJnKTogYWN0dWFsbHkgZG8gdmFsaWRhdGlvbiBoZXJlLgorCisyMDAzLTAxLTI5ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChjaGVja19tZXNzYWdlX2hhbmRsaW5nKTogZml4IGFzc2VydGlvbgorCWZhaWx1cmUgb24gc2V0X2NsaWVudF9zZXJpYWwKKworMjAwMy0wMS0yOCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLXNlcnZlci1kZWJ1Zy5jOiBBZGQgZG9jIHNlY3Rpb24gY29tbWVudHMKKworCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC1kZWJ1Zy5jOiBhZGQgZG9jIHNlY3Rpb24gY29tbWVudHMKKworMjAwMy0wMS0yOCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1zdHJpbmcuYyAoX2RidXNfc3RyaW5nX2Jhc2U2NF9kZWNvZGUpOiBhcHBlbmQgYnl0ZXMgaW4KKwl0aGUgcmV2ZXJzZSBvcmRlciBmcm9tIGhvdyBJIGhhZCBpdAorCShfZGJ1c19zdHJpbmdfYmFzZTY0X2VuY29kZSk6IHJldmVyc2UgZW5jb2Rpbmcgb3JkZXIuIEkgd2FzCisJYmFzaWNhbGx5IGJ5dGVzd2FwcGluZyBldmVyeXRoaW5nIGR1cmluZyBlbmNvZGluZy4KKworMjAwMy0wMS0yOCAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLWludGVybmFsLmg6CisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jOiAoX2RidXNfY29ubmVjdGlvbl9hZGRfdGltZW91dCksCisJKF9kYnVzX2Nvbm5lY3Rpb25fcmVtb3ZlX3RpbWVvdXQpOgorCUFkZCBmdW5jdGlvbnMgZm9yIGFkZGluZyBhbmQgcmVtb3ZpbmcgdGltZW91dHMuCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmM6IChkYnVzX21lc3NhZ2VfbmV3X2Zyb21fbWVzc2FnZSk6CisJQWRkIG5ldyBmdW5jdGlvbiB0aGF0IHRha2VzIGEgbWVzc2FnZSBhbmQgY3JlYXRlcyBhbiBleGFjdAorCWNvcHkgb2YgaXQsIGJ1dCB3aXRoIHRoZSByZWZjb3VudCBzZXQgdG8gMS4KKwkoY2hlY2tfbWVzc2FnZV9oYW5kbGluZyk6CisJRml4IGJ1aWxkIGVycm9yLgorCisJKiBkYnVzL2RidXMtc2VydmVyLXByb3RlY3RlZC5oOgorCSogZGJ1cy9kYnVzLXNlcnZlci5jOiAoX2RidXNfc2VydmVyX2luaXRfYmFzZSksCisJKF9kYnVzX3NlcnZlcl9maW5hbGl6ZV9iYXNlKSwgKF9kYnVzX3NlcnZlcl9hZGRfdGltZW91dCksCisJKGRidXNfc2VydmVyX3NldF90aW1lb3V0X2Z1bmN0aW9ucyk6CisJKF9kYnVzX3NlcnZlcl9yZW1vdmVfdGltZW91dCk6CisJTmV3IGZ1bmN0aW9ucyBzbyB0aGF0IGEgc2VydmVyIGNhbiBhZGQgYW5kIHJlbW92ZSB0aW1lb3V0cy4KKworCShkYnVzX3NlcnZlcl9saXN0ZW4pOgorCUFkZCBjb21tZW50ZWQgb3V0IGNhbGwgdG8gZGJ1c19zZXJ2ZXJfZGVidWdfbmV3LgorCisJKiBkYnVzL2RidXMtdGltZW91dC5jOiAoX2RidXNfdGltZW91dF9uZXcpOgorCUFjdHVhbGx5IHNldCB0aGUgaGFuZGxlciwgZG9oLgorCisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LmM6IChfZGJ1c190cmFuc3BvcnRfb3Blbik6CisJQWRkIGNvbW1lbnRlZCBvdXQgY2FsbCB0byBkYnVzX3RyYW5zcG9ydF9kZWJ1Z19jbGllbnRfbmV3LgorCisJKiBkYnVzL01ha2VmaWxlLmFtOgorCUFkZCBkYnVzLXRyYW5zcG9ydC1kZWJ1Zy5bY2hdIGFuZCBkYnVzLXNlcnZlci1kZWJ1Zy5bY2hdCisKKzIwMDMtMDEtMjggIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKGNoZWNrX21lc3NhZ2VfaGFuZGxpbmcpOiBmdW5jdGlvbiB0byBjaGVjaworCW9uIHRoZSBsb2FkZWQgbWVzc2FnZSwgaXRlcmF0ZXMgb3ZlciBpdCBldGMuCisKKzIwMDMtMDEtMjggIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIHRlc3QvTWFrZWZpbGUuYW0gKGRpc3QtaG9vayk6IGZpeCBtYWtlIGRpc3RkaXIKKworCSogZGJ1cy9NYWtlZmlsZS5hbSAoVEVTVFNfRU5WSVJPTk1FTlQpOiBmaXggbWFrZSBjaGVjaworCisyMDAzLTAxLTI3ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtbWVtcG9vbC5jICh0aW1lX2Zvcl9zaXplKTogcmVwbGFjZSBwcmludGYgd2l0aAorCV9kYnVzX3ZlcmJvc2UKKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UtYnVpbGRlci5jIChfZGJ1c19tZXNzYWdlX2RhdGFfbG9hZCk6IGFsbG93CisJZW1wdHkgbGluZXM7IGZpeCB0aGUgU0FWRV9MRU5HVEggc3R1ZmYgdG8gYmUKKwlTVEFSVF9MRU5HVEgvRU5EX0xFTkdUSCBzbyBpdCBhY3R1YWxseSB3b3JrczsgY291cGxlIG90aGVyCisJYnVnZml4ZXMKKworCSogdGVzdC9NYWtlZmlsZS5hbSAoZGlzdC1ob29rKTogYWRkIGRpc3QtaG9vayBmb3IgLm1lc3NhZ2UgZmlsZXMKKworCSogZGJ1cy9kYnVzLXN0cmluZy5jIChEQlVTX1NUUklOR19DT1BZX1BSRUFNQkxFKTogc291cmNlIG9mIGEgY29weQorCWNhbiBiZSBjb25zdGFudCBvciBsb2NrZWQuCisJKF9kYnVzX3N0cmluZ19mcmVlKTogYWxsb3cgZnJlZWluZyBhIGNvbnN0IHN0cmluZyBhcworCWRvY3VtZW50ZWQvaW50ZW5kZWQKKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYyAoX2RidXNfY29uY2F0X2Rpcl9hbmRfZmlsZSk6IHV0aWxpdHkKKworCSogZGJ1cy9kYnVzLXRlc3QtbWFpbi5jIChtYWluKTogdGFrZSBhbiBhcmd1bWVudCB3aGljaCBpcyB0aGUKKwlkaXJlY3RvcnkgY29udGFpbmluZyB0ZXN0IGRhdGEKKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAoX2RidXNfbWVzc2FnZV90ZXN0KTogcGFzcyBhIHRlc3RfZGF0YV9kaXIKKwlhcmd1bWVudCB0byB0aGlzIGFuZCBsb2FkIGFsbCB0aGUgbWVzc2FnZXMgaW4gdGVzdC9kYXRhLworCWNoZWNraW5nIHRoYXQgdGhleSBjYW4gYmUgbG9hZGVkIG9yIG5vdCBsb2FkZWQgYXMgYXBwcm9wcmlhdGUuCisKKzIwMDMtMDEtMjcgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBidXMvZGlzcGF0Y2guYzogKGJ1c19kaXNwYXRjaF9tZXNzYWdlX2hhbmRsZXIpOgorCURpc3BhdGNoIG1lc3NhZ2VzIHNlbnQgdG8gc2VydmljZXMuCisKKwkqIGJ1cy9kcml2ZXIuYzogKGJ1c19kcml2ZXJfc2VuZF9zZXJ2aWNlX2RlbGV0ZWQpLAorCShidXNfZHJpdmVyX3NlbmRfc2VydmljZV9jcmVhdGVkKSwgKGJ1c19kcml2ZXJfc2VuZF9zZXJ2aWNlX2xvc3QpLAorCShidXNfZHJpdmVyX3NlbmRfc2VydmljZV9hY3F1aXJlZCk6CisJQWRkIGhlbHBlciBmdW5jdGlvbnMgZm9yIHNlbmRpbmcgc2VydmljZSByZWxhdGVkIG1lc3NhZ2VzLgorCisJKGJ1c19kcml2ZXJfc2VuZF93ZWxjb21lX21lc3NhZ2UpOgorCVNlbmQgSEVMTE9fUkVQTFkgaW5zdGVhZCBvZiBXRUxDT01FLgorCisJKGJ1c19kcml2ZXJfaGFuZGxlX2xpc3Rfc2VydmljZXMpOgorCVNlbmQgTElTVF9TRVJWSUNFU19SRVBMWSBpbnN0ZWFkIG9mIFNFUlZJQ0VTLgorCisJKGJ1c19kcml2ZXJfaGFuZGxlX293bl9zZXJ2aWNlKSwKKwkoYnVzX2RyaXZlcl9oYW5kbGVfc2VydmljZV9leGlzdHMpOgorCU5ldyBtZXNzYWdlIGhhbmRsZXJzLgorCisJKGJ1c19kcml2ZXJfaGFuZGxlX21lc3NhZ2UpOgorCUludm9rZSBuZXcgbWVzc2FnZSBoYW5kbGVycy4KKworCShidXNfZHJpdmVyX3JlbW92ZV9jb25uZWN0aW9uKToKKwlEb24ndCByZW1vdmUgYW55IHNlcnZpY2VzIGhlcmUgc2luY2UgdGhhdCdzIGRvbmUgYXV0b21hdGljYWxseQorCWJ5IGJ1c19zZXJ2aWNlX3JlbW92ZV9vd25lciBub3cuCisKKwkqIGJ1cy9kcml2ZXIuaDoKKwlOZXcgZnVuY3Rpb24gc2lnbmF0dXJlcy4KKworCSogYnVzL3NlcnZpY2VzLmM6IChidXNfc2VydmljZV9hZGRfb3duZXIpOgorCVNlbmQgU2VydmljZUFjcXVpcmVkIG1lc3NhZ2UgaWYgd2UncmUgdGhlIG9ubHkgcHJpbWFyeSBvd25lci4KKworCShidXNfc2VydmljZV9yZW1vdmVfb3duZXIpOgorCVNlbmQgU2VydmljZUFjcXVpcmVkL1NlcnZpY2VMb3N0IG1lc3NhZ2VzLgorCisJKGJ1c19zZXJ2aWNlX3NldF9wcm9oaWJpdF9yZXBsYWNlbWVudCksCisJKGJ1c19zZXJ2aWNlX2dldF9wcm9oaWJpdF9yZXBsYWNlbWVudCk6CisJRnVuY3Rpb25zIGZvciBzZXR0aW5nIHByb2hpYml0IHJlcGxhY2VtZW50LgorCisJKGJ1c19zZXJ2aWNlX2hhc19vd25lcik6CisJTmV3IGZ1bmN0aW9uIHRoYXQgY2hlY2tzIGlmIGEgY29ubmVjdGlvbiBpcyBpbiB0aGUgb3duZXIgcXVldWUgb2YKKwlhIGNlcnRhaW4gc2VydmljZS4KKworCSogYnVzL3NlcnZpY2VzLmg6CisJQWRkIG5ldyBmdW5jdGlvbiBzaWduYXR1cmVzLgorCisJKiBkYnVzL2RidXMtbGlzdC5jOiAoX2RidXNfbGlzdF90ZXN0KToKKwlBZGQgdGVzdHMgZm9yIF9kYnVzX2xpc3RfcmVtb3ZlX2xhc3QgYW5kIHRyYXZlcnNpbmcgdGhlIGxpc3QgYmFja3dhcmRzLgorCisJKiBkYnVzL2RidXMtbGlzdC5oOgorCUZpeCBhIHR5cG8gaW4gX2RidXNfbGlzdF9nZXRfcHJldl9saW5rLCBpZiB3ZSdyZSBhdCB0aGUgZmlyc3QgZWxlbWVudCB3ZSBjYW4ndAorCWdvIGFueSBmdXJ0aGVyLCBzbyByZXR1cm4gTlVMTCB0aGVuLgorCisJKiBkYnVzL2RidXMtcHJvdG9jb2wuaDoKKwlBZGQgbmV3IG1lc3NhZ2VzLCBzZXJ2aWNlIGZsYWdzIGFuZCBzZXJ2aWNlIHJlcGxpZXMuCisKKzIwMDMtMDEtMjYgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLWJ1aWxkZXIuYzogaW1wbGVtZW50LCBjb21wbGV0ZWx5IHVudGVzdGVkLgorCisJKiB0ZXN0L2RhdGEvKjogYWRkIGRhdGEgdG8gYmUgdXNlZCBpbiB0ZXN0aW5nLgorCSIubWVzc2FnZSIgZmlsZXMgYXJlIG91ciBzaW1wbGUgbG9hZGFibGUgdGV4dCBmb3JtYXQuCisJIi5tZXNzYWdlLXJhdyIgd2lsbCBiZSBiaW5hcnkgZHVtcHMgb2YgbWVzc2FnZXMuCisKKwkqIGRidXMvZGJ1cy1zdHJpbmcuYyAoX2RidXNfc3RyaW5nX3N0YXJ0c193aXRoX2Nfc3RyKTogbmV3CisKKzIwMDMtMDEtMjYgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMgKF9kYnVzX2ZpbGVfZ2V0X2NvbnRlbnRzKTogbmV3IGZ1bmN0aW9uCisKKwkqIGRidXMvZGJ1cy1lcnJvcnMuYyAoZGJ1c19yZXN1bHRfdG9fc3RyaW5nKTogYWRkCisJZmlsZSBlcnJvcnMKKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UtYnVpbGRlci5jOiBuZXcgZmlsZSwgd2lsbCBjb250YWluIGNvZGUgdG8gbG9hZAorCXVwIG1lc3NhZ2VzIGZyb20gZmlsZXMuIE5vdCBpbXBsZW1lbnRlZCB5ZXQuCisKKzIwMDMtMDEtMjYgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKGRidXNfbWVzc2FnZV9zZXRfc2VuZGVyKTogc3VwcG9ydCBkZWxldGluZworCXRoZSBzZW5kZXIgYnkgc2V0dGluZyB0byBOVUxMCisKKzIwMDMtMDEtMjYgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKyAgICAgICAgVGhlIHVuaXQgdGVzdHMgcGFzcywgYnV0IG90aGVyd2lzZSB1bnRlc3RlZC4gIElmIGl0IGJyZWFrcywgdGhlCisJdGVzdHMgc2hvdWxkIGhhdmUgYmVlbiBiZXR0ZXIuIDstKQorCisJKiBidXMvZHJpdmVyLmMgKGJ1c19kcml2ZXJfaGFuZGxlX2hlbGxvKTogcmV0dXJuIGlmIHdlIGRpc2Nvbm5lY3QKKwl0aGUgY29ubmVjdGlvbi4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYzogcmVkbyBldmVyeXRoaW5nIHNvIHdlIG1haW50YWluCisJbWVzc2FnZS0+aGVhZGVyIGFzIHRoZSBvbmx5IGNvcHkgb2YgdGhlIHZhcmlvdXMgZmllbGRzLgorCVRoaXMgYXZvaWRzIHRoZSBwb3NzaWJpbGl0eSBvZiBvdXQtb2YtbWVtb3J5IGluIHNvbWUgY2FzZXMsCisJZm9yIGV4YW1wbGUgZGJ1c19tZXNzYWdlX2xvY2soKSBjYW4ndCBydW4gb3V0IG9mIG1lbW9yeSBhbnltb3JlLAorCWFuZCBhdm9pZHMgZXh0cmEgY29weWluZy4gRmlndXJlZCBJIG1heSBhcyB3ZWxsIGdvIGFoZWFkIGFuZCBkbworCXRoaXMgc2luY2UgaXQgd2FzIGJ1c3RlZCBmb3IgZGJ1c19tZXNzYWdlX2xvY2sgdG8gbm90IHJldHVybgorCWZhaWx1cmUgb24gT09NLCBhbmQgZGJ1c19tZXNzYWdlX3dyaXRlX2hlYWRlciB3YXMgdG90YWxseQorCXVuY2hlY2tlZCBmb3IgT09NLiBBbHNvIGZpeGVkIHNvbWUgcmFuZG9tIG90aGVyIGJ1Z3MuCisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLmMgKF9kYnVzX21hcnNoYWxfZ2V0X2ZpZWxkX2VuZF9wb3MpOiB2ZXJpZnkKKwl0aGF0IHN0cmluZ3MgYXJlIG51bC10ZXJtaW5hdGVkLiBBbHNvLCBlbmRfcG9zIGNhbiBiZSBlcXVhbAorCXRvIHN0cmluZyBsZW5ndGgganVzdCBub3QgZ3JlYXRlciB0aGFuLCBJIHRoaW5rLgorCShfZGJ1c19tYXJzaGFsX3NldF9pbnQzMik6IG5ldyBmdW5jdGlvbgorCShfZGJ1c19tYXJzaGFsX3NldF91aW50MzIpOiBuZXcgZnVuY3Rpb24KKwkoX2RidXNfbWFyc2hhbF9zZXRfc3RyaW5nKTogbmV3IGZ1bmN0aW9uCisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMgKF9kYnVzX2Nvbm5lY3Rpb25fbmV3X2Zvcl90cmFuc3BvcnQpOiBmaXgKKwlhIHdhcm5pbmcsIGluaXQgdGltZW91dF9saXN0IHRvIE5VTEwKKwkoZGJ1c19jb25uZWN0aW9uX3NlbmRfbWVzc2FnZSk6IGRvbid0IHVzZSB1bmluaXRpYWxpemVkIHZhcmlhYmxlCisJInNlcmlhbCIKKworCSogZGJ1cy9kYnVzLXN0cmluZy5jIChfZGJ1c19zdHJpbmdfcmVwbGFjZV9sZW4pOiBuZXcgZnVuY3Rpb24KKworMjAwMy0wMS0yNiAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGJ1cy9kcml2ZXIuYzogKGJ1c19kcml2ZXJfaGFuZGxlX2hlbGxvKSwKKwkoYnVzX2RyaXZlcl9zZW5kX3dlbGNvbWVfbWVzc2FnZSk6CisJUGx1ZyBsZWFrcworCisyMDAzLTAxLTI2ICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogZGJ1cy9kYnVzLWF1dGguYzogKHByb2Nlc3NfYXV0aCksIChfZGJ1c19hdXRoX3VucmVmKToKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmM6IChfZGJ1c19jb25uZWN0aW9uX25ld19mb3JfdHJhbnNwb3J0KSwKKwkoZGJ1c19jb25uZWN0aW9uX3VucmVmKToKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLmM6IChfZGJ1c19tYXJzaGFsX3Rlc3QpOgorCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYzogKGRidXNfbWVzc2FnZV91bnJlZiksCisJUGx1ZyBtZW1vcnkgbGVha3MuCisKKwkoZGJ1c19tZXNzYWdlX2dldF9maWVsZHMpOgorCVJlbW92ZSBkZWJ1Z2dpbmcgcHJpbnRvdXQuCisKKwkoX2RidXNfbWVzc2FnZV9sb2FkZXJfcmV0dXJuX2J1ZmZlcik6CisJRG9uJ3Qgc3RvcmUgdGhlIGhlYWRlciBzdHJpbmcuCisKKwkoX2RidXNfbWVzc2FnZV90ZXN0KToKKwlQbHVnIGxlYWtzLgorCisyMDAzLTAxLTI2ICBSaWNoYXJkIEh1bHQgIDxyaHVsdEBjb2RlZmFjdG9yeS5zZT4KKworCSogZ2xpYi9kYnVzLWdtYWluLmMgKGRidXNfY29ubmVjdGlvbl9kaXNwYXRjaCk6IFRyYXZlcnNlIGEgY29weSBvZgorCXRoZSBmaWxlIGRlc2NyaXB0b3IgbGlzdCwgc2luY2UgaXQgY2FuIGNoYW5nZSB1bmRlciB1cy4KKworMjAwMy0wMS0yNSAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGdsaWIvZGJ1cy1nbWFpbi5jOiAoZGJ1c19jb25uZWN0aW9uX3ByZXBhcmUpLAorCShkYnVzX2Nvbm5lY3Rpb25fY2hlY2spLCAoZGJ1c19jb25uZWN0aW9uX2Rpc3BhdGNoKSwgKGFkZF93YXRjaCksCisJKHJlbW92ZV93YXRjaCksIChkYnVzX2Nvbm5lY3Rpb25faG9va3VwX3dpdGhfZ19tYWluKToKKwlSZXdyaXRlIHRoZSBnbGliIGhhbmRsaW5nIHRvIHVzZSBpdHMgb3duIEdTb3VyY2UgaW5zdGVhZCBvZiBhCisJR0lPQ2hhbm5lbCBzbyB3ZSBjYW4gY2F0Y2ggbWVzc2FnZXMgcHV0IGluIHRoZSBxdWV1ZSB3aGlsZSB3YWl0aW5nCisJZm9yIGEgcmVwbHkuCisKKzIwMDMtMDEtMjUgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBidXMvTWFrZWZpbGUuYW06CisJKiBidXMvY29ubmVjdGlvbi5jOiAoY29ubmVjdGlvbl9kaXNjb25uZWN0X2hhbmRsZXIpLAorCShjb25uZWN0aW9uX3dhdGNoX2NhbGxiYWNrKSwgKGJ1c19jb25uZWN0aW9uX3NldHVwKToKKwkqIGJ1cy9kaXNwYXRjaC5jOiAoc2VuZF9vbmVfbWVzc2FnZSksCisJKGJ1c19kaXNwYXRjaF9icm9hZGNhc3RfbWVzc2FnZSksIChidXNfZGlzcGF0Y2hfbWVzc2FnZV9oYW5kbGVyKSwKKwkoYnVzX2Rpc3BhdGNoX2FkZF9jb25uZWN0aW9uKSwgKGJ1c19kaXNwYXRjaF9yZW1vdmVfY29ubmVjdGlvbik6CisJKiBidXMvZGlzcGF0Y2guaDoKKwkqIGJ1cy9kcml2ZXIuYzogKGJ1c19kcml2ZXJfc2VuZF9zZXJ2aWNlX2RlbGV0ZWQpLAorCShidXNfZHJpdmVyX3NlbmRfc2VydmljZV9jcmVhdGVkKSwgKGJ1c19kcml2ZXJfaGFuZGxlX2hlbGxvKSwKKwkoYnVzX2RyaXZlcl9zZW5kX3dlbGNvbWVfbWVzc2FnZSksCisJKGJ1c19kcml2ZXJfaGFuZGxlX2xpc3Rfc2VydmljZXMpLCAoYnVzX2RyaXZlcl9yZW1vdmVfY29ubmVjdGlvbiksCisJKGJ1c19kcml2ZXJfaGFuZGxlX21lc3NhZ2UpOgorCSogYnVzL2RyaXZlci5oOgorCVJlZmFjdG9yIGNvZGUsIHB1dCB0aGUgbWVzc2FnZSBkaXNwYXRjaGluZyBpbiBpdHMgb3duIGZpbGUuIFVzZQorCV9EQlVTX0hBTkRMRV9PT00uIEFsc28gc2VuZCBTZXJ2aWNlRGVsZXRlZCBtZXNzYWdlcyB3aGVuIGEgY2xpZW50CisJaXMgZGlzY29ubmVjdGVkLgorCisyMDAzLTAxLTI1ICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogZGJ1cy9kYnVzLWludGVybmFscy5oOgorCUFkZCBfREJVU19IQU5ETEVfT09NIG1hY3JvLCBpdCBkb2Vzbid0IGRvIGFueXRoaW5nIGN1cnJlbnRseS4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYzogKGRidXNfbWVzc2FnZV9nZXRfc2VuZGVyKToKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmg6CisJSW1wbGVtZW50IGRidXNfbWVzc2FnZV9nZXRfc2VuZGVyLgorCisJKiBkYnVzL2RidXMtcHJvdG9jb2wuaDoKKwlBZGQgbWVzc2FnZSBhbmQgc2VydmljZSBkZWZpbmVzLgorCisyMDAzLTAxLTI1ICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYzogKGRidXNfY29ubmVjdGlvbl9zZW5kX21lc3NhZ2UpOgorCSogZGJ1cy9kYnVzLW1lc3NhZ2UtaW50ZXJuYWwuaDoKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmM6IChfZGJ1c19tZXNzYWdlX2dldF9jbGllbnRfc2VyaWFsKSwKKwkoZGJ1c19tZXNzYWdlX3dyaXRlX2hlYWRlcik6CisJUmVtb3ZlIF9kYnVzX21lc3NhZ191bmxvY2sgYW5kIGRvbid0IHNldCB0aGUgY2xpZW50IHNlcmlhbCBvbiBhCisJbWVzc2FnZSBpZiBvbmUgYWxyZWFkeSBleGlzdHMuCisKKzIwMDMtMDEtMjQgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy1saXN0LmMgKGFsbG9jX2xpbmspOiBwdXQgYSB0aHJlYWQgbG9jayBvbiB0aGUgZ2xvYmFsCisJbGlzdF9wb29sCisKKwkqIGJ1cy9kcml2ZXIuYyAoYnVzX2RyaXZlcl9oYW5kbGVfbGlzdF9zZXJ2aWNlcyk6IGZpeCBhIGxlYWsKKwlvbiBPT00KKworMjAwMy0wMS0yNSAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGRidXMvZGJ1cy1saXN0LmM6IChhbGxvY19saW5rKSwgKGZyZWVfbGluayk6CisJVXNlIGEgbWVtb3J5IHBvb2wgZm9yIHRoZSBsaW5rcy4KKworMjAwMy0wMS0yNSAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGJ1cy9jb25uZWN0aW9uLmM6IChidXNfY29ubmVjdGlvbl9mb3JlYWNoKToKKwkqIGJ1cy9jb25uZWN0aW9uLmg6CisJQWRkIG5ldyBidXNfY29ubmVjdGlvbl9mb3JlYWNoIGZ1bmN0aW9uLgorCisJKiBidXMvZHJpdmVyLmM6IChzZW5kX29uZV9tZXNzYWdlKSwgKGJ1c19kcml2ZXJfYnJvYWRjYXN0X21lc3NhZ2UpOgorCUFkZCBmdW5jdGlvbiB0aGF0IGJyb2FkY2FzdHMgYSBtZXNzYWdlIHRvIGFsbCBjbGllbnRzLgorCisJKGJ1c19kcml2ZXJfc2VuZF9zZXJ2aWNlX2NyZWF0ZWQpLCAoYnVzX2RyaXZlcl9oYW5kbGVfaGVsbG8pLAorCShidXNfZHJpdmVyX3NlbmRfd2VsY29tZV9tZXNzYWdlKSwKKwkoYnVzX2RyaXZlcl9oYW5kbGVfbGlzdF9zZXJ2aWNlcyksIChidXNfZHJpdmVyX21lc3NhZ2VfaGFuZGxlcik6CisJSW1wbGVtZW50IGZ1bmN0aW9ucyB0aGF0IHRha2UgY2FyZSBvZiBsaXN0aW5nIHNlcnZpY2VzLCBhbmQgbm90aWZ5aW5nCisJY2xpZW50cyB3aGVuIG5ldyBzZXJ2aWNlcyBhcmUgY3JlYXRlZC4KKworCSogYnVzL3NlcnZpY2VzLmM6IChidXNfc2VydmljZXNfbGlzdCk6CisJKiBidXMvc2VydmljZXMuaDoKKwlBZGQgbmV3IGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhbiBhcnJheSBvZiBzdHJpbmdzIHdpdGggdGhlIGN1cnJlbnRseQorCXJlZ2lzdGVyZWQgc2VydmljZXMuCisKKwkqIGdsaWIvZGJ1cy1nbGliLmg6CisJKiBnbGliL2RidXMtZ21haW4uYzoKKwlVcGRhdGUgY29weXJpZ2h0IHllYXIuCisKKzIwMDMtMDEtMjUgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jOiAoZGJ1c19jb25uZWN0aW9uX3NlbmRfbWVzc2FnZSk6CisJVW5sb2NrIHRoZSBtZXNzYWdlIGluIGNhc2UgaXQgd2FzIHNlbnQgZWFybGllci4KKworCShkYnVzX2Nvbm5lY3Rpb25fc2VuZF9tZXNzYWdlX3dpdGhfcmVwbHlfYW5kX2Jsb2NrKToKKwlSZW1vdmUgdGhlIHJlcGx5IG1lc3NhZ2UgZnJvbSB0aGUgbGlzdC4KKworCSogZGJ1cy9kYnVzLW1hcnNoYWwuYzogKF9kYnVzX2RlbWFyc2hhbF9zdHJpbmdfYXJyYXkpOgorCVNldCBhcnJheV9sZW4gYW5kIG5ld19wb3MgY29ycmVjdGx5LgorCisJKF9kYnVzX21hcnNoYWxfdGVzdCk6CisJUmVtb3ZlIGRlYnVnIG91dHB1dC4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UtaW50ZXJuYWwuaDoKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmM6IChfZGJ1c19tZXNzYWdlX2dldF9yZXBseV9zZXJpYWwpOgorCU5ldyBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIHJlcGx5IHNlcmlhbC4KKworCShfZGJ1c19tZXNzYWdlX3VubG9jayk6CisJTmV3IGZ1bmN0aW9uIHRoYXQgdW5sb2NrcyBhIG1lc3NhZ2UgYW5kIHJlc2V0cyBpdHMgaGVhZGVyLgorCisJKGRidXNfbWVzc2FnZV9hcHBlbmRfc3RyaW5nX2FycmF5KSwKKwkoZGJ1c19tZXNzYWdlX2dldF9maWVsZHNfdmFsaXN0KSwKKwkoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2ZpZWxkX3R5cGUpLAorCShkYnVzX21lc3NhZ2VfaXRlcl9nZXRfc3RyaW5nX2FycmF5KSwKKwkoZGJ1c19tZXNzYWdlX2dldF9maWVsZHMpLAorCShkYnVzX21lc3NhZ2VfYXBwZW5kX2ZpZWxkc192YWxpc3QpOgorCUhhbmRsZSBzdHJpbmcgYXJyYXlzLgorCisJKGRidXNfbWVzc2FnZV9zZXRfc2VuZGVyKToKKwlNYWtlIHRoaXMgZnVuY3Rpb24gcHVibGljIHNpbmNlIHRoZSBidXMgZGFlbW9uIG5lZWRzIGl0LgorCisJKGRlY29kZV9oZWFkZXJfZGF0YSk6CisJU2V0IHRoZSByZXBseSBzZXJpYWwgdG8gLTEgaW5pdGlhbGx5LgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5oOgorCUFkZCBkYnVzX21lc3NhZ2Vfc2V0X3NlbmRlci4KKworMjAwMy0wMS0yNCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZG9jL2RidXMtc3BlY2lmaWNhdGlvbi5zZ21sOiBhZGQgc29tZSBzdHVmZgorCisyMDAzLTAxLTIyICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnNnbWw6IFN0YXJ0IHRvIGRvY3VtZW50IHRoZSBwcm90b2NvbC4KKworMjAwMy0wMS0yMiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYworCShkYnVzX2Nvbm5lY3Rpb25fc2VuZF9tZXNzYWdlX3dpdGhfcmVwbHlfYW5kX2Jsb2NrKTogYWRkIHNvbWUgQHRvZG8KKworCSogYnVzL2RyaXZlci5jIChidXNfZHJpdmVyX2FkZF9jb25uZWN0aW9uKTogYWRkIGEgRklYTUUgYWJvdXQgbWVtbGVhaworCisyMDAzLTAxLTIxICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisgICAgICAgIChwYXRjaCB1bnRlc3RlZCBiZWNhdXNlIGNhbid0IGNvbXBpbGUpCisKKwkqIGJ1cy9kcml2ZXIuYyAoY3JlYXRlX3VuaXF1ZV9jbGllbnRfbmFtZSk6IG1ha2UgdGhpcyBmdW5jdGlvbgorCW5ldmVyIHJlY3ljbGUgY2xpZW50IG5hbWVzLiBBbHNvLCBjYWxsZXIgc2hvdWxkIGluaXRpYWxpemUKKwl0aGUgREJ1c1N0cmluZy4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYyAoX2RidXNfZ2V0X2N1cnJlbnRfdGltZSk6IG5ldyBmdW5jdGlvbgorCisyMDAzLTAxLTIxICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogZGJ1cy9kYnVzLW1hcnNoYWwuYzogKF9kYnVzX21hcnNoYWxfZG91YmxlKSwKKwkoX2RidXNfbWFyc2hhbF9pbnQzMiksIChfZGJ1c19tYXJzaGFsX3VpbnQzMiksCisJKF9kYnVzX21hcnNoYWxfaW50MzJfYXJyYXkpLCAoX2RidXNfbWFyc2hhbF91aW50MzJfYXJyYXkpLAorCShfZGJ1c19tYXJzaGFsX2RvdWJsZV9hcnJheSksIChfZGJ1c19tYXJzaGFsX3N0cmluZ19hcnJheSksCisJKF9kYnVzX2RlbWFyc2hhbF9pbnQzMl9hcnJheSksIChfZGJ1c19kZW1hcnNoYWxfdWludDMyX2FycmF5KSwKKwkoX2RidXNfZGVtYXJzaGFsX2RvdWJsZV9hcnJheSksIChfZGJ1c19kZW1hcnNoYWxfc3RyaW5nX2FycmF5KSwKKwkoX2RidXNfbWFyc2hhbF9nZXRfZmllbGRfZW5kX3BvcyksIChfZGJ1c19tYXJzaGFsX3Rlc3QpOgorCSogZGJ1cy9kYnVzLW1hcnNoYWwuaDoKKwkqIGRidXMvZGJ1cy1wcm90b2NvbC5oOgorCUFkZCBzdXBwb3J0IGZvciBtYXJzaGFsbGluZyBhbmQgZGVtYXJzaGFsbGluZyBpbnRlZ2VyLCBkb3VibGUKKwlhbmQgc3RyaW5nIGFycmF5cy4KKworMjAwMy0wMS0yMSAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGJ1cy9NYWtlZmlsZS5hbToKKwlBZGQgZHJpdmVyLltjaF0KKworCSogYnVzL2Nvbm5lY3Rpb24uYzogKGNvbm5lY3Rpb25fZGlzY29ubmVjdF9oYW5kbGVyKToKKwlSZW1vdmUgdGhlIGNvbm5lY3Rpb24gZnJvbSB0aGUgYnVzIGRyaXZlcidzIGxpc3QuCisKKwkoY29ubmVjdGlvbl93YXRjaF9jYWxsYmFjayk6IERpc3BhdGNoIG1lc3NhZ2VzLgorCisJKGZyZWVfY29ubmVjdGlvbl9kYXRhKTogRnJlZSBjb25uZWN0aW9uIG5hbWUuCisKKwkoYnVzX2Nvbm5lY3Rpb25fc2V0dXApOiBBZGQgY29ubmVjdGlvbiB0byB0aGUgYnVzIGRyaXZlcidzIGxpc3QuCisJKGJ1c19jb25uZWN0aW9uX3JlbW92ZV9vd25lZF9zZXJ2aWNlKToKKwkoYnVzX2Nvbm5lY3Rpb25fc2V0X25hbWUpLCAoYnVzX2Nvbm5lY3Rpb25fZ2V0X25hbWUpOgorCUFkZCBmdW5jdGlvbnMgZm9yIHNldHRpbmcgYW5kIGdldHRpbmcgdGhlIGNvbm5lY3Rpb24ncyBuYW1lLgorCisJKiBidXMvY29ubmVjdGlvbi5oOgorCUFkZCBmdW5jdGlvbiBoZWFkZXJzLgorCisJKiBidXMvZHJpdmVyLmM6IChjcmVhdGVfdW5pcXVlX2NsaWVudF9uYW1lKSwKKwkoYnVzX2RyaXZlcl9oYW5kbGVfaGVsbG9fbWVzc2FnZSksCisJKGJ1c19kcml2ZXJfc2VuZF93ZWxjb21lX21lc3NhZ2UpLCAoYnVzX2RyaXZlcl9tZXNzYWdlX2hhbmRsZXIpLAorCShidXNfZHJpdmVyX2FkZF9jb25uZWN0aW9uKSwgKGJ1c19kcml2ZXJfcmVtb3ZlX2Nvbm5lY3Rpb24pOgorCSogYnVzL2RyaXZlci5oOgorCSogYnVzL21haW4uYzoKKwkqIGJ1cy9zZXJ2aWNlcy5jOiAoYnVzX3NlcnZpY2VfZnJlZSk6CisJKiBidXMvc2VydmljZXMuaDoKKwlOZXcgZmlsZSB0aGF0IGhhbmRsZXMgY29tbXVuaWNhdGlvbiBhbmQgcmVnaXN0cmVhdGlvbiB3aXRoIHRoZSBidXMKKwlpdHNlbGYuCisKKzIwMDMtMDEtMjEgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jOiAoZGJ1c19jb25uZWN0aW9uX3NlbmRfbWVzc2FnZSk6CisJQWRkIGEgbmV3IGNsaWVudF9zZXJpYWwgcGFyYW1ldGVyLgorCisJKGRidXNfY29ubmVjdGlvbl9zZW5kX21lc3NhZ2Vfd2l0aF9yZXBseSk6CisJUmVtb3ZlIGEgQHRvZG8gc2luY2Ugd2UndmUgaW1wbGVtZW50ZWQgdGhlIGJsb2NraW5nIGZ1bmN0aW9uLgorCisJKGRidXNfY29ubmVjdGlvbl9zZW5kX21lc3NhZ2Vfd2l0aF9yZXBseV9hbmRfYmxvY2spOgorCU5ldyBmdW5jdGlvbiB0aGF0IHNlbmRzIGEgbWVzc2FnZSBhbmQgd2FpdHMgZm9yIGEgcmVwbHkgYW5kCisJdGhlbiByZXR1cm5zIHRoZSByZXBseS4KKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uaDoKKwlBZGQgbmV3IGZ1bmN0aW9ucy4KKworCSogZGJ1cy9kYnVzLWVycm9ycy5jOiAoZGJ1c19yZXN1bHRfdG9fc3RyaW5nKToKKwkqIGRidXMvZGJ1cy1lcnJvcnMuaDoKKwlBZGQgbmV3IERCVVNfUkVTVUxULgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS1pbnRlcm5hbC5oOgorCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYzogKF9kYnVzX21lc3NhZ2VfZ2V0X3JlcGx5X3NlcmlhbCksCisJKF9kYnVzX21lc3NhZ2Vfc2V0X3NlbmRlciksIChkYnVzX21lc3NhZ2Vfd3JpdGVfaGVhZGVyKSwKKwkoZGJ1c19tZXNzYWdlX25ld19yZXBseSksIChkZWNvZGVfaGVhZGVyX2RhdGEpLAorCShfZGJ1c19tZXNzYWdlX2xvYWRlcl9yZXR1cm5fYnVmZmVyKSwgKF9kYnVzX21lc3NhZ2VfdGVzdCk6CisJKiBkYnVzL2RidXMtbWVzc2FnZS5oOgorCUFkZCBuZXcgZnVuY3Rpb25zIHRoYXQgc2V0IHRoZSByZXBseSBzZXJpYWwgYW5kIHNlbmRlci4KKwlBbHNvIG1hcnNoYWwgYW5kIGRlbWFyc2hhbCB0aGVtIGNvcnJlY3RseSBhbmQgYWRkIHRlc3QuCisKKwkqIGRidXMvZGJ1cy1wcm90b2NvbC5oOgorCUFkZCBuZXcgREJVU19NRVNTQUdFX1RZUEVfU0VOREVSLgorCisJKiBnbGliL2RidXMtZ2xpYi5oOgorCSogZ2xpYi9kYnVzLWdtYWluLmM6ICh3YXRjaF9jYWxsYmFjayksIChmcmVlX2NhbGxiYWNrX2RhdGEpLAorCShhZGRfd2F0Y2gpLCAocmVtb3ZlX3dhdGNoKSwgKGFkZF90aW1lb3V0KSwgKHJlbW92ZV90aW1lb3V0KSwKKwkoZGJ1c19jb25uZWN0aW9uX2hvb2t1cF93aXRoX2dfbWFpbik6CisJKiBnbGliL3Rlc3QtZGJ1cy1nbGliLmM6IChtYWluKToKKwlSZXdyaXRlIHRvIHVzZSBHSU9DaGFubmVsIGFuZCByZW1vdmUgdGhlIEdTb3VyY2UgY3JhY2suCisKKwkqIHRlc3QvZWNoby1jbGllbnQuYzogKG1haW4pOgorCSogdGVzdC93YXRjaC5jOiAoY2hlY2tfbWVzc2FnZXMpOgorCVVwZGF0ZSBmb3IgY2hhbmdlZCBBUElzCisKKzIwMDMtMDEtMTkgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBkYnVzL01ha2VmaWxlLmFtOiBBZGQgZGJ1cy10aW1lb3V0LltjxKddCisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmM6IChfZGJ1c19jb25uZWN0aW9uX25ld19mb3JfdHJhbnNwb3J0KToKKwlDcmVhdGUgYSBEQnVzVGltZW91dExpc3QuCisJKGRidXNfY29ubmVjdGlvbl9zZXRfdGltZW91dF9mdW5jdGlvbnMpOiBBZGQgbmV3IGZ1bmN0aW9uIHRvCisJc2V0IHRpbWVvdXQgY2FsbGJhY2tzCisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmg6IEFkZCBwdWJsaWMgREJ1c1RpbWVvdXQgQVBJLgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jOiAoZGJ1c19tZXNzYWdlX2dldF9zZXJ2aWNlKToKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmg6CU5ldyBmdW5jdGlvbi4KKworCSogZGJ1cy9kYnVzLXNlcnZlci5jOiBGaXggc21hbGwgZG9jIHR5cG8uCisKKwkqIGRidXMvZGJ1cy10aW1lb3V0LltjaF06IE5ldyBmaWxlcyBmb3IgbWFpbmxvb3AgdGltZW91dHMuCisKKzIwMDMtMDEtMTkgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBkYnVzL2RidXMtc3RyaW5nLmMgKF9kYnVzX3N0cmluZ19tb3ZlX2xlbik6IERvbid0IGRlbGV0ZSBhbGwKKwlvZiB0aGUgc3RyaW5nLCBqdXN0IGFzIGxvbmcgYXMgc3BlY2lmaWVkLgorCisyMDAzLTAxLTE5ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jIChkYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2F1dGhlbnRpY2F0ZWQpOgorCW5ldyBmdW5jdGlvbgorCisJKiBkYnVzL2RidXMtc2VydmVyLmMgKGRidXNfc2VydmVyX3NldF9tYXhfY29ubmVjdGlvbnMpCisJKGRidXNfc2VydmVyX2dldF9tYXhfY29ubmVjdGlvbnMsIGRidXNfc2VydmVyX2dldF9uX2Nvbm5lY3Rpb25zKToKKwlrZWVwIHRyYWNrIG9mIGN1cnJlbnQgbnVtYmVyIG9mIGNvbm5lY3Rpb25zLCBhbmQgYWRkIEFQSSBmb3IKKwlzZXR0aW5nIGEgbWF4IChidXQgaGF2ZW4ndCBpbXBsZW1lbnRlZCBlbmZvcmNpbmcgdGhlIG1heCB5ZXQpCisKKzIwMDMtMDEtMTggIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy10cmFuc3BvcnQtdW5peC5jICh1bml4X2RvX2l0ZXJhdGlvbik6IG9ubHkgZG8gdGhlCisJcmVhZGluZy93cml0aW5nIGlmIHJlYWRfd2F0Y2ggIT0gTlVMTCBvciB3cml0ZV93YXRjaCAhPSBOVUxMLgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChfZGJ1c19tZXNzYWdlX2xvYWRlcl9yZXR1cm5fYnVmZmVyKTogZml4CisJdGhlIG1lc3NhZ2UgbG9hZGVyIGNvZGUgdG8gYWN0dWFsbHkgbG9hZCBtZXNzYWdlLT5oZWFkZXIgYW5kCisJbWVzc2FnZS0+Ym9keSBpbnRvIHRoZSBuZXdseS1jcmVhdGVkIG1lc3NhZ2UuCisKKwkqIGRidXMvZGJ1cy10cmFuc3BvcnQtdW5peC5jIChjaGVja193cml0ZV93YXRjaCk6IGZpeCBhIG1lbSBsZWFrCisJaW4gT09NIGNhc2UKKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYyAoZGJ1c19jb25uZWN0aW9uX3NldF9tYXhfbWVzc2FnZV9zaXplKQorCShkYnVzX2Nvbm5lY3Rpb25fZ2V0X21heF9tZXNzYWdlX3NpemUpCisJKGRidXNfY29ubmVjdGlvbl9zZXRfbWF4X2xpdmVfbWVzc2FnZXNfc2l6ZSkKKwkoZGJ1c19jb25uZWN0aW9uX2dldF9tYXhfbGl2ZV9tZXNzYWdlc19zaXplKTogaW1wbGVtZW50IHNvbWUKKwlyZXNvdXJjZSBsaW1pdGF0aW9uIGZ1bmN0aW9ucworCisJKiBkYnVzL2RidXMtcmVzb3VyY2VzLmM6IG5ldyBmaWxlIGltcGxlbWVudGluZyBzb21lIG9mIHRoZQorCXJlc291cmNlIGxpbWl0cyBzdHVmZgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYnl0ZV9hcnJheSk6IGFkZAorCW1pc3NpbmcgZG9jcywgYWRkIEB0b2RvIHRvIGhhbmRsZSBPT00gZXRjLgorCisJKiBkYnVzL2RidXMtbWFyc2hhbC5jIChfZGJ1c19kZW1hcnNoYWxfYnl0ZV9hcnJheSk6IGFkZCBtaXNzaW5nCisJZG9jcworCisyMDAzLTAxLTE4ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jIChkYnVzX2Nvbm5lY3Rpb25fdW5yZWYpOiBkaXNjb25uZWN0IHRoZQorCWNvbm5lY3Rpb24gaWYgaXQgaGFzbid0IGJlZW4gYWxyZWFkeS4KKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uaDoga2lsbCBvZmYgdGhlIGlkZWEgb2YgYW4gRXJyb3JGdW5jdGlvbiwKKwlyZXBsYWNlIHdpdGggRGlzY29ubmVjdEZ1bmN0aW9uLgorCisyMDAzLTAxLTE4ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisgICAgICAgIEJ1aWxkaW5nIC0tZGlzYWJsZS12ZXJib3NlLW1vZGUgLS1kaXNhYmxlLWFzc2VydHMgLS1kaXNhYmxlLXRlc3RzCisJY3V0cyB0aGUgbGlicmFyeSBmcm9tIDExMksgdG8gNDVLIG9yIHNvCisKKwkqIGNvbmZpZ3VyZS5pbjogY2hlY2sgZm9yIHZhcmFyZ3MgbWFjcm8gc3VwcG9ydCwKKwlhZGQgLS1lbmFibGUtdmVyYm9zZS1tb2RlLCAtLWVuYWJsZS1hc3NlcnRzLgorCisJKiBkYnVzL2RidXMtaW50ZXJuYWxzLmggKF9kYnVzX2Fzc2VydCk6IHN1cHBvcnQKKwlEQlVTX0RJU0FCTEVfQVNTRVJUCisJKF9kYnVzX3ZlcmJvc2UpOiBzdXBwb3J0IERCVVNfRU5BQkxFX1ZFUkJPU0VfTU9ERQorCisyMDAzLTAxLTE4ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkYnVzL2RidXMtdGVzdC5jOiBpbmNsdWRlIGNvbmZpZy5oIHNvIHRoYXQgdGVzdHMgYWN0dWFsbHkgcnVuCisKKwkqIGRidXMvZGJ1cy1zdHJpbmcuYzogYWRkIGFzc2VydGlvbnMgdGhhdCBzdHVmZiBpcyA4LWJ5dGUgYWxpZ25lZCwKKwlzbyB0aGUgZmFpbHVyZSBtb2RlIHdoZW4gdGhhdCBhc3N1bXB0aW9uIGZhaWxzIHdpbGwgYmUgcGxlbnR5CisJb2J2aW91cy4KKworMjAwMy0wMS0xOCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogY29uZmlndXJlLmluOiBkZWZhdWx0IC0tZW5hYmxlLXRlc3RzIHRvICRVU0VfTUFJTlRBSU5FUl9NT0RFCisKKwkqIGRidXMvTWFrZWZpbGUuYW06IGZpeCBpdCB1cCBzbyBkdWJzLXRlc3QtbWFpbi5jIGlzIGluY2x1ZGVkIGluCisJdGhlIGRpc3RyaWJ1dGlvbgorCisJKiB0ZXN0L01ha2VmaWxlLmFtOiBkb24ndCB1c2Ugc3BlY2lhbCB2YXJpYWJsZSAiVEVTVFMiIGZvciBlY2hvLSoKKwlzaW5jZSB3ZSBkb24ndCB3YW50IHRvIHVzZSB0aG9zZSBpbiBtYWtlIGNoZWNrCisKKzIwMDMtMDEtMTUgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisgICAgICAgIFJlbGVhc2UgMC4yCisKKwkqIE5FV1M6IHVwZGF0ZQorCisyMDAzLTAxLTE1ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogdGVzdC9NYWtlZmlsZS5hbTogZml4IHNvIHRoYXQgdGVzdCBzb3VyY2UgY29kZSBlbmRzIHVwIGluIHRoZQorCWRpc3RyaWJ1dGlvbiBvbiBtYWtlIGRpc3RjaGVjaworCisyMDAzLTAxLTE1ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworICAgICAgICBSZWxlYXNlIDAuMS4KKworCSogTkVXUzogdXBkYXRlCisKKzIwMDMtMDEtMTUgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtdGVzdC5jIChkYnVzX2ludGVybmFsX3N5bWJvbF9kb19ub3RfdXNlX3J1bl90ZXN0cyk6CisJZml4IGJ1aWxkIHdoZW4gLS1kaXNhYmxlLXRlc3RzCisKKwkqIE1ha2VmaWxlLmFtIChFWFRSQV9ESVNUKTogcHV0IEhBQ0tJTkcgaW4gaGVyZQorCisJKiBIQUNLSU5HOiBkb2N1bWVudCBwcm9jZWR1cmUgZm9yIG1ha2luZyBhIHRhcmJhbGwgcmVsZWFzZS4KKworMjAwMy0wMS0xNCAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGJ1cy9jb25uZWN0aW9uLmM6IChjb25uZWN0aW9uX2Vycm9yX2hhbmRsZXIpLAorCShidXNfY29ubmVjdGlvbl9zZXR1cCk6CisJKiBidXMvbWFpbi5jOiAobWFpbik6CisJTWFrZSBzdXJlIHRoYXQgdGhlIERCdXNDb25uZWN0aW9uRGF0YSBzdHJ1Y3QgaXMgTlVMTGVkCisJb3V0IHRvIHByZXZlbnQgYSBzZWdmYXVsdC4KKworCSogZGJ1cy9kYnVzLWVycm9ycy5jOiAoZGJ1c19yZXN1bHRfdG9fc3RyaW5nKToKKwkqIGRidXMvZGJ1cy1lcnJvcnMuaDoKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmM6IChkYnVzX21lc3NhZ2VfZ2V0X2ZpZWxkcyksCisJKGRidXNfbWVzc2FnZV9nZXRfZmllbGRzX3ZhbGlzdCksIChfZGJ1c19tZXNzYWdlX3Rlc3QpOgorCSogZGJ1cy9kYnVzLW1lc3NhZ2UuaDoKKwlNYWtlIGRidXNfbWVzc2FnZV9nZXRfZmllbGRzIHJldHVybiBhIHJlc3VsdCBjb2RlIHNvIHdlIGNhbgorCXRyYWNrIGludmFsaWQgZmllbGRzIGFzIHdlbGwgYXMgb29tLgorCisyMDAzLTAxLTExICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBjb25maWd1cmUuaW46IGNoYW5nZSAtLWVuYWJsZS10ZXN0Ly0tZW5hYmxlLWFuc2kgYWN0aW9uLWlmLWdpdmVuCisJdG8gZW5hYmxlX2Zvbz0kZW5hYmxldmFsIGluc3RlYWQgb2YgZW5hYmxlX2Zvbz15ZXMKKworMjAwMy0wMS0wOCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLXN0cmluZy5jIChfZGJ1c19zdHJpbmdfYWxpZ25fbGVuZ3RoKTogbmV3IGZ1bmN0aW9uCisKKwkqIGRidXMvZGJ1cy10ZXN0LW1haW4uYzogbW92ZSBtYWluKCkgZm9yIHRlc3QgYXBwIGhlcmUKKwkqIGRidXMvZGJ1cy10ZXN0LmMKKwkoZGJ1c19pbnRlcm5hbF9zeW1ib2xfZG9fbm90X3VzZV9ydW5fdGVzdHMpOiB3ZSBoYXZlIHRvIGV4cG9ydCBhCisJc3ltYm9sIHRvIHJ1biB0ZXN0cywgYmVjYXVzZSBkYnVzLXRlc3QgaXNuJ3QgaW4gdGhlIG1haW4KKwlsaWJyYXJ5CisKKyAgICAgICAgQ29kZSByZXZpZXcgbml0cGlja3MuCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKGRidXNfbWVzc2FnZV93cml0ZV9oZWFkZXIpOiBhZGQgbmV3bGluZXMKKwlmb3IgcGVvcGxlIHdpdGggbmFycm93IGVtYWNzIDstKS4gQXNzZXJ0IGNsaWVudF9zZXJpYWwgd2FzIGZpbGxlZAorCWluLiBBc3NlcnQgbWVzc2FnZS0+bmFtZSAhPSBOVUxMLgorCShkYnVzX21lc3NhZ2VfYXBwZW5kX2ZpZWxkcyk6IGhhdmUgImZpcnN0X2ZpZWxkX3R5cGUiIGFyZyBzZXBhcmF0ZQorCWZyb20gdmEgbGlzdCwgbmVlZGVkIGZvciBDKysgYmluZGluZyB0aGF0IGFsc28gdXNlcyB2YXJhcmdzIElJUkMKKwlhbmQgaGVscHMgd2l0aCB0eXBlIHNhZmV0eQorCShkYnVzX21lc3NhZ2VfbmV3KTogYWRkIEB0b2RvIGFib3V0IHVzaW5nIERCdXNTdHJpbmcgdG8gc3RvcmUKKwlzZXJ2aWNlL25hbWUgaW50ZXJuYWxseQorCShkYnVzX21lc3NhZ2VfbmV3KTogZG9uJ3QgbGVhayAtPnNlcnZpY2UgYW5kIC0+bmFtZSBvbiBPT00gbGF0ZXIKKwlpbiB0aGUgZnVuY3Rpb24KKwkoZGJ1c19tZXNzYWdlX3VucmVmKTogZnJlZSB0aGUgc2VydmljZSBuYW1lCisJKGRidXNfbWVzc2FnZV9nZXRfZmllbGRzKTogc2FtZSBjaGFuZ2UgdG8gdmFyYXJncworCWkuZS4gZmlyc3RfZmllbGRfdHlwZQorCShfZGJ1c19tZXNzYWdlX2xvYWRlcl9yZXR1cm5fYnVmZmVyKTogYXNzZXJ0IHRoYXQgdGhlIG1lc3NhZ2UgZGF0YQorCWlzIGFsaWduZWQgKGlmIG5vdCBpdCdzIGEgYnVnIGluIG91ciBjb2RlKS4gUHV0IGluIHZlcmJvc2UgZ3JpcGluZworCWFib3V0IHdoeSB3ZSBzZXQgY29ycnVwdGVkID0gVFJVRS4KKwkoZGVjb2RlX2hlYWRlcl9kYXRhKTogYWRkIEZJWE1FIHRoYXQgY2hhciogaXMgZXZpbC4gIFdhcyBnb2luZyB0bworCWFkZCBGSVhNRSBhYm91dCBldmlsIGxvY2FsZS1zcGVjaWZpYyBzdHJpbmcuaCBzdHJuY21wLCBidXQganVzdAorCXN3aXRjaGVkIHRvIHdhY2t5IHN0cmluZy1hcy11aW50MzIgb3B0aW1pemF0aW9uLiBNb3ZlIGNoZWNrIGZvcgorCSJubyByb29tIGZvciBmaWVsZCBuYW1lIiBhYm92ZSBnZXRfY29uc3RfZGF0YV9sZW4oKSB0byBhdm9pZAorCWFzc2VydGlvbiBmYWlsdXJlIGluIGdldF9jb25zdF9kYXRhX2xlbiBpZiB3ZSBoYXZlIHRyYWlsaW5nIDIKKwlieXRlcyBvciB0aGUgbGlrZS4gQ2hlY2sgZm9yIHNlcnZpY2UgYW5kIG5hbWUgZmllbGRzIGJlaW5nCisJcHJvdmlkZWQgdHdpY2UuIERvbid0IGxlYWsgc2VydmljZS9uYW1lIG9uIGVycm9yLiBSZXF1aXJlIGZpZWxkCisJbmFtZXMgdG8gYmUgYWxpZ25lZCB0byA0IGJ5dGVzLgorCisJKiBkYnVzL2RidXMtbWFyc2hhbC5jOiBtb3ZlIGJ5dGUgc3dhcCBzdHVmZiB0byBoZWFkZXIKKwkoX2RidXNfcGFja19pbnQzMik6IHVzY29yZS1wcmVmaXgKKwkoX2RidXNfdW5wYWNrX2ludDMyKTogdXNjb3JlLXByZWZpeAorCShfZGJ1c191bnBhY2tfdWludDMyKTogZXhwb3J0CisJKF9kYnVzX2RlbWFyc2hhbF9zdHJpbmcpOiBhZGQgQHRvZG8gY29tcGxhaW5pbmcgYWJvdXQgdXNlIG9mCisJbWVtY3B5KCkKKwkoX2RidXNfbWFyc2hhbF9nZXRfZmllbGRfZW5kX3Bvcyk6IGFkZCBAdG9kbyBhYm91dCBiYWQgZXJyb3IKKwloYW5kbGluZyBhbGxvd2luZyBjb3JydXB0IGRhdGEgdG8gZ28gdW5jaGVja2VkCisKKzIwMDMtMDEtMDggIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LXVuaXguYyAodW5peF9kb19pdGVyYXRpb24pOiBhZGQgcmVhZC93cml0ZQorCXRvIHRoZSBzZWxlY3QoKSBhcyBuZWVkZWQgZm9yIGF1dGhlbnRpY2F0aW9uLiAoc2hvdWxkIGJlIHVzaW5nCisJX2RidXNfcG9sbCgpIG5vdCBzZWxlY3QsIGJ1dCBmb3IgYW5vdGhlciBkYXkpCisKKwkqIGRidXMvZGJ1cy5oOiBpbmNsdWRlIGRidXMvZGJ1cy1wcm90b2NvbC5oCisKKzIwMDMtMDEtMDggIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBkYnVzL01ha2VmaWxlLmFtIChkYnVzaW5jbHVkZV9IRUFERVJTKTogSW5zdGFsbAorCWRidXMtY29ubmVjdGlvbi5oCisKKzIwMDMtMDEtMDggIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBkYnVzL2RidXMtaW50ZXJuYWxzLmM6IChfZGJ1c190eXBlX3RvX3N0cmluZyk6CisJTmV3IGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIHN0cmluZyBkZXNjcmliaW5nIGEgdHlwZS4KKworCSogZGJ1cy9kYnVzLW1hcnNoYWwuYzogKF9kYnVzX2RlbWFyc2hhbF9ieXRlX2FycmF5KToKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLmg6CisJKiBkYnVzL2RidXMtbWVzc2FnZS5jOiAoZGJ1c19tZXNzYWdlX2dldF9maWVsZHNfdmFsaXN0KSwKKwkoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2ZpZWxkX3R5cGUpLCAoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2RvdWJsZSksCisJKGRidXNfbWVzc2FnZV9pdGVyX2dldF9ieXRlX2FycmF5KToKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmg6CisJQWRkIG5ldyBjb252ZW5pZW5jZSBmdW5jdGlvbnMgZm9yIGFwcGVuZGluZyBhbmQgZ2V0dGluZyBtZXNzYWdlIGZpZWxkcy4KKwlBbHNvIGFkZCBkZW1hcnNoYWxsaW5nIHJvdXRpbmVzIGZvciBieXRlIGFycmF5cy4KKworMjAwMy0wMS0wNyAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLWludGVybmFsLmg6CisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jOiAoX2RidXNfY29ubmVjdGlvbl9uZXdfZm9yX3RyYW5zcG9ydCksCisJKF9kYnVzX2Nvbm5lY3Rpb25fZ2V0X25leHRfY2xpZW50X3NlcmlhbCksCisJKGRidXNfY29ubmVjdGlvbl9zZW5kX21lc3NhZ2UpOgorCSogZGJ1cy9kYnVzLWludGVybmFscy5oOgorCSogZGJ1cy9kYnVzLW1hcnNoYWwuYzogKHVucGFja191aW50MzIpLCAoZGJ1c191bnBhY2tfaW50MzIpLAorCShkYnVzX3BhY2tfaW50MzIpLCAoX2RidXNfbWFyc2hhbF9kb3VibGUpLCAoX2RidXNfbWFyc2hhbF9pbnQzMiksCisJKF9kYnVzX21hcnNoYWxfdWludDMyKSwgKF9kYnVzX2RlbWFyc2hhbF9kb3VibGUpLAorCShfZGJ1c19kZW1hcnNoYWxfaW50MzIpLCAoX2RidXNfZGVtYXJzaGFsX3VpbnQzMiksCisJKF9kYnVzX2RlbWFyc2hhbF9zdHJpbmcpLCAoX2RidXNfbWFyc2hhbF9nZXRfZmllbGRfZW5kX3BvcyksCisJKF9kYnVzX3ZlcmJvc2VfYnl0ZXMpLCAoX2RidXNfbWFyc2hhbF90ZXN0KToKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLmg6CisJKiBkYnVzL2RidXMtbWVzc2FnZS1pbnRlcm5hbC5oOgorCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYzogKF9kYnVzX21lc3NhZ2Vfc2V0X2NsaWVudF9zZXJpYWwpLAorCShkYnVzX21lc3NhZ2Vfd3JpdGVfaGVhZGVyKSwgKF9kYnVzX21lc3NhZ2VfbG9jayksCisJKGRidXNfbWVzc2FnZV9uZXcpLCAoZGJ1c19tZXNzYWdlX3JlZiksIChkYnVzX21lc3NhZ2VfdW5yZWYpLAorCShkYnVzX21lc3NhZ2VfZ2V0X25hbWUpLCAoZGJ1c19tZXNzYWdlX2FwcGVuZF9pbnQzMiksCisJKGRidXNfbWVzc2FnZV9hcHBlbmRfdWludDMyKSwgKGRidXNfbWVzc2FnZV9hcHBlbmRfZG91YmxlKSwKKwkoZGJ1c19tZXNzYWdlX2FwcGVuZF9zdHJpbmcpLCAoZGJ1c19tZXNzYWdlX2FwcGVuZF9ieXRlX2FycmF5KSwKKwkoZGJ1c19tZXNzYWdlX2dldF9maWVsZHNfaXRlciksIChkYnVzX21lc3NhZ2VfaXRlcl9yZWYpLAorCShkYnVzX21lc3NhZ2VfaXRlcl91bnJlZiksIChkYnVzX21lc3NhZ2VfaXRlcl9oYXNfbmV4dCksCisJKGRidXNfbWVzc2FnZV9pdGVyX25leHQpLCAoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2ZpZWxkX3R5cGUpLAorCShkYnVzX21lc3NhZ2VfaXRlcl9nZXRfc3RyaW5nKSwgKGRidXNfbWVzc2FnZV9pdGVyX2dldF9pbnQzMiksCisJKGRidXNfbWVzc2FnZV9pdGVyX2dldF91aW50MzIpLCAoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2RvdWJsZSksCisJKGRlY29kZV9oZWFkZXJfZGF0YSksIChfZGJ1c19tZXNzYWdlX2xvYWRlcl9yZXR1cm5fYnVmZmVyKSwKKwkobWVzc2FnZV9pdGVyX3Rlc3QpLCAoX2RidXNfbWVzc2FnZV90ZXN0KToKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmg6CisJKiBkYnVzL2RidXMtcHJvdG9jb2wuaDoKKwkqIGRidXMvZGJ1cy10ZXN0LmM6IChtYWluKToKKwkqIGRidXMvZGJ1cy10ZXN0Lmg6CisJKiBnbGliL3Rlc3QtZGJ1cy1nbGliLmM6IChtZXNzYWdlX2hhbmRsZXIpLCAobWFpbik6CisJKiB0ZXN0L2VjaG8tY2xpZW50LmM6IChtYWluKToKKwkqIHRlc3Qvd2F0Y2guYzogKGNoZWNrX21lc3NhZ2VzKToKKwlNYWtlIG1lc3NhZ2VzIHNlbmRhYmxlIGFuZCByZWNlaXZhYmxlIGZvciByZWFsLgorCisyMDAzLTAxLTA3ICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogZGJ1cy9kYnVzLW1hcnNoYWwuYzogKF9kYnVzX21hcnNoYWxfZG91YmxlKSwKKwkoX2RidXNfbWFyc2hhbF9zdHJpbmcpLCAoX2RidXNfbWFyc2hhbF9ieXRlX2FycmF5KToKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmM6IChkYnVzX21lc3NhZ2VfYXBwZW5kX2ludDMyKSwKKwkoZGJ1c19tZXNzYWdlX2FwcGVuZF91aW50MzIpLCAoZGJ1c19tZXNzYWdlX2FwcGVuZF9kb3VibGUpLAorCShkYnVzX21lc3NhZ2VfYXBwZW5kX3N0cmluZyksIChkYnVzX21lc3NhZ2VfYXBwZW5kX2J5dGVfYXJyYXkpOgorCUhhbmRsZSBPT00gcmVzdG9yYXRpb24uCisKKzIwMDMtMDEtMDcgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBkYnVzL2RidXMtbWFyc2hhbC5jOiAoX2RidXNfbWFyc2hhbF9zdHJpbmcpLAorCShfZGJ1c19kZW1hcnNoYWxfc3RyaW5nKSwgKF9kYnVzX21hcnNoYWxfdGVzdCk6CisJKiBkYnVzL2RidXMtbWFyc2hhbC5oOgorCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYzogKGRidXNfbWVzc2FnZV9nZXRfbmFtZSksCisJRG9jdW1lbnQgdGhlc2UgZnVuY3Rpb25zLgorCisJKGRidXNfbWVzc2FnZV9hcHBlbmRfaW50MzIpLCAoZGJ1c19tZXNzYWdlX2FwcGVuZF91aW50MzIpLAorCShkYnVzX21lc3NhZ2VfYXBwZW5kX2RvdWJsZSksIChkYnVzX21lc3NhZ2VfYXBwZW5kX3N0cmluZyksCisJKGRidXNfbWVzc2FnZV9hcHBlbmRfYnl0ZV9hcnJheSk6CisJKiBkYnVzL2RidXMtbWVzc2FnZS5oOgorCUFkZCBmdW5jdGlvbnMgZm9yIGFkZGluZyBtZXNzYWdlIGZpZWxkcyBvZiBkaWZmZXJlbnQgdHlwZXMuCisKKwkqIGRidXMvZGJ1cy1wcm90b2NvbC5oOgorCUFkZCB0aGUgZGlmZmVyZW50IHR5cGVzLgorCisyMDAzLTAxLTA1ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBidXMvY29ubmVjdGlvbi5jOiBpbXBsZW1lbnQgcm91dGluZXMgZm9yIGhhbmRsaW5nIGNvbm5lY3Rpb25zLAorCWZpcnN0IHRoaW5nIGlzIGtlZXBpbmcgYSBsaXN0IG9mIG93bmVkIHNlcnZpY2VzIG9uIGVhY2ggY29ubmVjdGlvbgorCWFuZCBzZXR0aW5nIHVwIHdhdGNoZXMgZXRjLgorCisJKiBidXMvc2VydmljZXMuYzogaW1wbGVtZW50IGEgbWFwcGluZyBmcm9tIHNlcnZpY2UgbmFtZXMgdG8gbGlzdHMKKwlvZiBjb25uZWN0aW9ucworCisJKiBkYnVzL2RidXMtaGFzaC5jOiBhZGQgREJVU19IQVNIX1BPSU5URVIKKworCSogZGJ1cy9kYnVzLXRocmVhZHMuYyAoZGJ1c19zdGF0aWNfbXV0ZXhfbG9jayk6IGFkZCBmdW5jdGlvbnMKKwl0byB1c2Ugc3RhdGljIG11dGV4ZXMgZm9yIGdsb2JhbCBkYXRhCisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMgKGRidXNfY29ubmVjdGlvbl9zZXRfZGF0YSk6IGFkZCBuZXcKKwljb2xsZWN0aW9uIG9mIGZ1bmN0aW9ucyB0byBzZXQvZ2V0IGFwcGxpY2F0aW9uLXNwZWNpZmljIGRhdGEKKwlvbiB0aGUgREJ1c0Nvbm5lY3Rpb24uCisKKzIwMDMtMDEtMDQgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMgKF9kYnVzX3NsZWVwX21pbGxpc2Vjb25kcyk6IG5ldyBmdW5jdGlvbgorCShfZGJ1c19wb2xsKTogbmV3IGZ1bmN0aW9uCisKKwkqIGRidXMvZGJ1cy1pbnRlcm5hbHMuaCAoX0RCVVNfU1RSVUNUX09GRlNFVCk6IG5ldyBtYWNybworCWNvcGllZCBmcm9tIEdMaWIKKworCSogYnVzL2xvb3AuYzogaW5pdGlhbCBjb2RlIGZvciB0aGUgZGFlbW9uIG1haW4gbG9vcAorCisyMDAzLTAxLTA0ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiB0ZXN0L3dhdGNoLmMgKGVycm9yX2hhbmRsZXIpOiBtYWtlIGl0IHNhZmUgaWYgdGhlIGVycm9yIGhhbmRsZXIKKwlpcyBjYWxsZWQgbXVsdGlwbGUgdGltZXMgKGlmIHdlIHMvZXJyb3IgaGFuZGxlci9kaXNjb25uZWN0CisJaGFuZGxlci8gd2Ugc2hvdWxkIGp1c3QgZ3VhcmFudGVlIGl0J3MgY2FsbGVkIG9ubHkgb25jZSkKKworCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC5jIChfZGJ1c190cmFuc3BvcnRfZGlzY29ubmVjdCk6IGNhbGwgdGhlCisJZXJyb3IgaGFuZGxlciBvbiBkaXNjb25uZWN0IChpdCdzIHF1aXRlIHBvc3NpYmxlIHdlIHNob3VsZAorCWp1c3QgY2hhbmdlIHRoZSBlcnJvciBoYW5kbGVyIHRvIGEgImRpc2Nvbm5lY3QgaGFuZGxlciwiIEknbQorCW5vdCBzdXJlIHdlIGhhdmUgYW55IG90aGVyIG1lYW5pbmdmdWwgZXJyb3JzKQorCisJKiBjb25maWd1cmUuaW46IGNoZWNrIGZvciBnZXRwd25hbV9yCisKKwkqIGRidXMvZGJ1cy10cmFuc3BvcnQuYywgZGJ1cy9kYnVzLXRyYW5zcG9ydC11bml4LmMsCisJZGJ1cy9kYnVzLWF1dGguYzogYWRkIGNyZWRlbnRpYWxzIHN1cHBvcnQsIGFkZCBFWFRFUk5BTCBhdXRoCisJbWVjaGFuaXNtIGFzIGluIFNBU0wgc3BlYywgdXNpbmcgc29ja2V0IGNyZWRlbnRpYWxzCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMgKF9kYnVzX3JlYWRfY3JlZGVudGlhbHNfdW5peF9zb2NrZXQpOiBuZXcgZnVuY3Rpb24KKwkoX2RidXNfc2VuZF9jcmVkZW50aWFsc191bml4X3NvY2tldCk6IG5ldyBmdW5jdGlvbgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jIChfZGJ1c19hY2NlcHRfdW5peF9zb2NrZXQpOiByZW5hbWUganVzdAorCWRidXNfYWNjZXB0KCkKKwkoX2RidXNfd3JpdGUpOiBvbmx5IGNoZWNrIGVycm5vIGlmIDwwIHJldHVybmVkCisJKF9kYnVzX3dyaXRlX3R3byk6IGRpdHRvCisKKzIwMDMtMDEtMDIgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBkYnVzL2RidXMtbWFyc2hhbC5jOiAoX2RidXNfbWFyc2hhbF91dGY4X3N0cmluZyksCisJKF9kYnVzX21hcnNoYWxfYnl0ZV9hcnJheSksIChfZGJ1c19kZW1hcnNoYWxfdXRmOF9zdHJpbmcpLAorCShfZGJ1c19tYXJzaGFsX3Rlc3QpOgorCSogZGJ1cy9kYnVzLW1hcnNoYWwuaDoKKwlBZGQgX2RidXNfbWFyc2hhbF9ieXRlX2FycmF5IGFuZCByZW5hbWUgX2RidXNfbWFyc2hhbF9zdHJpbmcKKwl0byBfZGJ1c19tYXJzaGFsX3V0Zjhfc3RyaW5nLiBBbHNvIGZpeCBzb21lIHRlc3RzLgorCisyMDAyLTEyLTI4ICBIYXJyaSBQb3J0ZW4gIDxwb3J0ZW5Aa2RlLm9yZz4KKworCSogY29uZmlndXJlLmluOiBhZGRlZCBjaGVjayBmb3IgQysrIGNvbXBpbGVyIGFuZCBhIHZlcnkgY2hlZXN5CisJY2hlY2sgZm9yIHRoZSBRdCBpbnRlZ3JhdGlvbgorCisJKiBNYWtlZmlsZS5hbSAoU1VCRElSUyk6IGNvbXBpbGUgcXQgc3ViZGlyIGlmIHN1cHBvcnQgaXMgZW5hYmxlZAorCisJKiBxdC9NYWtlZmlsZS5hbTogYWRkZWQKKworCSogcXQvLmN2c2lnbm9yZTogYWRkZWQKKworCSogcXQvZGJ1cy1xdGhyZWFkLmNjLCBxdC9kYnVzLXF0aHJlYWQuY3BwOiByZW5hbWVkIGZvcm1lciB0bworCWxhdHRlciwgYWRkZWQgI2lmZGVmIFFUX1RIUkVBRF9TVVBQT1JUIGd1YXJkLgorCisJKiBkYnVzL01ha2VmaWxlLmFtOiBhZGRlZCBtaXNzaW5nIGhlYWRlcnMgZm9yIG1ha2UgZGlzdAorCisyMDAyLTEyLTI4ICBLcmlzdGlhbiBSaWV0dmVsZCAgPGtyaXNAZ3RrLm9yZz4KKworCSogZGJ1cy9NYWtlZmlsZS5hbTogZml4dXAgZXhwb3J0LXN5bWJvbHMtcmVnZXguCisKKzIwMDItMTItMjcgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBhY2luY2x1ZGUubTQ6IEFkZCB0aGlzIGZpbGUgYW5kIHB1dCB0aGUKKwlQS0dfQ0hFQ0tfTU9EVUxFIG1hY3JvIGluIGl0LgorCisyMDAyLTEyLTI3ICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBjb2RlZmFjdG9yeS5zZT4KKworCSogZGJ1cy9kYnVzLW1hcnNoYWwuYzogKF9kYnVzX21hcnNoYWxfc3RyaW5nKSwKKwkoX2RidXNfZGVtYXJzaGFsX2RvdWJsZSksIChfZGJ1c19kZW1hcnNoYWxfaW50MzIpLAorCShfZGJ1c19kZW1hcnNoYWxfdWludDMyKSwgKF9kYnVzX2RlbWFyc2hhbF9zdHJpbmcpLAorCShfZGJ1c19tYXJzaGFsX3Rlc3QpOgorCU1ha2UgdGhlIGRlbWFyc2hhbGxpbmcgcm91dGluZXMgYWxpZ24gdGhlIHBvcyBhcmd1bWVudC4KKwlBZGQgc3RyaW5nIG1hcnNoYWxsaW5nIHRlc3RzIGFuZCBmaXggdGhlIG9idmlvdXMgYnVncworCWRpc2NvdmVyZWQuCisKKzIwMDItMTItMjYgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy1hdXRoLmM6IGZpeGVzIGZpeGVzIGZpeGVzCisKKwkqIGRidXMvZGJ1cy10cmFuc3BvcnQtdW5peC5jOiB3aXJlIHVwIHN1cHBvcnQgZm9yCisJZW5jb2RpbmcvZGVjb2RpbmcgZGF0YSBvbiB0aGUgd2lyZQorCisJKiBkYnVzL2RidXMtYXV0aC5jIChfZGJ1c19hdXRoX2VuY29kZV9kYXRhKQorCShfZGJ1c19hdXRoX2RlY29kZV9kYXRhKTogYXBwZW5kIHRvIHRhcmdldCBzdHJpbmcKKwlpbnN0ZWFkIG9mIG51a2luZyBpdC4KKworMjAwMi0xMi0yNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLW1hcnNoYWwuaCAoREJVU19DT01QSUxFUl9CWVRFX09SREVSKTogI2lmZGVmCisJV09SRFNfQklHRU5ESUFOIHRoZW4gY29tcGlsZXIgYnl0ZSBvcmRlciBpcyBEQlVTX0JJR19FTkRJQU4sCisJZG9oCisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLmM6IEFkZCBtYWNyb3MgdG8gZG8gaW50IHN3YXBwaW5nIGluLXBsYWNlIGFuZAorCWF2b2lkIHN3YXBfYnl0ZXMoKSBvdmVyaGVhZCAoaWdub3JpbmcgcG9zc2libGUgYXNzZW1ibHkgc3R1ZmYgZm9yCisJbm93KS4gTWFpbiBwb2ludCBpcyBiZWNhdXNlIEkgd2FudGVkIHVucGFja191aW50MzIgdG8gaW1wbGVtZW50CisJX2RidXNfdmVyYm9zZV9ieXRlcworCShfZGJ1c192ZXJib3NlX2J5dGVzKTogbmV3IGZ1bmN0aW9uCisKKwkqIGRidXMvZGJ1cy1zdHJpbmcuYyAoX2RidXNfc3RyaW5nX3ZhbGlkYXRlX2FzY2lpKTogbmV3IGZ1bmN0aW9uCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKF9kYnVzX21lc3NhZ2VfbG9hZGVyX2dldF9pc19jb3JydXB0ZWQpOiBhZGQKKwltZWNoYW5pc20gdG8gaGFuZGxlIGEgY29ycnVwdCBtZXNzYWdlIHN0cmVhbQorCShfZGJ1c19tZXNzYWdlX2xvYWRlcl9uZXcpOiBmaXggcHJlYWxsb2NhdGlvbiB0byBvbmx5IHByZWFsbG9jLAorCW5vdCBwcmVsZW5ndGhlbgorCisJKiBkYnVzL2RidXMtc3RyaW5nLmMgKF9kYnVzX3N0cmluZ19za2lwX2JsYW5rKTogZml4IHRoaXMgZnVuY3Rpb24KKwkoX2RidXNfc3RyaW5nX3Rlc3QpOiBlbmhhbmNlIHRlc3RzIGZvciBjb3B5L21vdmUgYW5kIGZpeCB0aGUKKwlmdW5jdGlvbnMKKworCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC11bml4LmM6IEhvbGQgcmVmZXJlbmNlcyBpbiBtb3JlIHBsYWNlcyB0bworCWF2b2lkIHJlZW50cmFuY3kgcHJvYmxlbXMKKworCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC5jOiBkaXR0bworCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jIChkYnVzX2Nvbm5lY3Rpb25fZGlzcGF0Y2hfbWVzc2FnZSk6IGRvbid0CisJbGVhayByZWZlcmVuY2UgY291bnQgaW4gbm8tbWVzc2FnZSBjYXNlCisKKwkqIHRlc3Qvd2F0Y2guYyAoZG9fbWFpbmxvb3ApOiBoYW5kbGUgYWRkaW5nL3JlbW92aW5nIHdhdGNoZXMKKwlkdXJpbmcgaXRlcmF0aW9uIG92ZXIgdGhlIHdhdGNoZXMuIEFsc28sIHJlZiB0aGUgY29ubmVjdGlvbi9zZXJ2ZXIKKwlzdG9yZWQgb24gYSB3YXRjaCwgc28gd2UgZG9uJ3QgdHJ5IHRvIG1hbmdsZSBhIGRlc3Ryb3llZCBvbmUuCisKKwkqIGRidXMvZGJ1cy10cmFuc3BvcnQtdW5peC5jIChkb19hdXRoZW50aWNhdGlvbik6IHBlcmZvcm0KKwlhdXRoZW50aWNhdGlvbgorCisJKiBkYnVzL2RidXMtYXV0aC5jIChnZXRfc3RhdGUpOiBhZGQgYSBzdGF0ZQorCUFVVEhFTlRJQ0FURURfV0lUSF9VTlVTRURfQllURVMgYW5kIHJldHVybiBpdCBpZiByZXF1aXJlZAorCShfZGJ1c19hdXRoX2dldF91bnVzZWRfYnl0ZXMpOiBhcHBlbmQgdGhlIHVudXNlZCBieXRlcworCXRvIHRoZSBwYXNzZWQgaW4gc3RyaW5nLCByYXRoZXIgdGhhbiBwcmVwZW5kCisKKwkqIGRidXMvZGJ1cy10cmFuc3BvcnQuYyAoX2RidXNfdHJhbnNwb3J0X2luaXRfYmFzZSk6IGNyZWF0ZQorCXRoZSBhdXRoIGNvbnZlcnNhdGlvbiBEQnVzQXV0aAorCisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LXVuaXguYyAoX2RidXNfdHJhbnNwb3J0X25ld19mb3JfZmQpCisJKF9kYnVzX3RyYW5zcG9ydF9uZXdfZm9yX2RvbWFpbl9zb2NrZXQpOiB3aGVuIGNyZWF0aW5nIGEKKwl0cmFuc3BvcnQsIHBhc3MgaW4gd2hldGhlciBpdCdzIGEgY2xpZW50LXNpZGUgb3Igc2VydmVyLXNpZGUKKwl0cmFuc3BvcnQgc28gd2Uga25vdyB3aGljaCBEQnVzQXV0aCB0byBjcmVhdGUKKworMjAwMi0xMi0wMyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC11bml4LmMgKHVuaXhfZmluYWxpemUpOiBmaW5hbGl6ZSBiYXNlCisJX2FmdGVyXyBmaW5hbGl6aW5nIHRoZSBkZXJpdmVkIG1lbWJlcnMKKwkodW5peF9jb25uZWN0aW9uX3NldCk6IHVucmVmIHdhdGNoIGlmIHdlIGZhaWwgdG8gYWRkIGl0CisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMgKGRidXNfY29ubmVjdGlvbl91bnJlZik6IGRlbGV0ZSB0aGUKKwl0cmFuc3BvcnQgZmlyc3QsIHNvIHRoYXQgdGhlIGNvbm5lY3Rpb24gb3duZWQgYnkgdGhlCisJdHJhbnNwb3J0IHdpbGwgYmUgdmFsaWQgYXMgdGhlIHRyYW5zcG9ydCBmaW5hbGl6ZXMuCisKKwkqIGRidXMvZGJ1cy10cmFuc3BvcnQtdW5peC5jICh1bml4X2ZpbmFsaXplKTogZnJlZSB0aGUgd3JpdGVfd2F0Y2gKKwlpZiBuZWNlc3NhcnksIGFuZCByZW1vdmUgd2F0Y2hlcyBmcm9tIHRoZSBjb25uZWN0aW9uLgorCisJKiBkYnVzL2RidXMtd2F0Y2guYyAoX2RidXNfd2F0Y2hfbGlzdF9mcmVlKTogaW1wcm92ZSBhIGNvbW1lbnQKKworMjAwMi0xMi0yNiAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLmM6IChfZGJ1c19tYXJzaGFsX3N0cmluZyksCisJKF9kYnVzX2RlbWFyc2hhbF9kb3VibGUpLCAoX2RidXNfZGVtYXJzaGFsX2ludDMyKSwKKwkoX2RidXNfZGVtYXJzaGFsX3VpbnQzMiksIChfZGJ1c19kZW1hcnNoYWxfc3RyaW5nKSwKKwkoX2RidXNfbWFyc2hhbF90ZXN0KToKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLmg6CisJQWRkIHN0cmluZyBtYXJzaGFsIGZ1bmN0aW9ucyBhbmQgaGF2ZSB0aGUgZGVtYXJzaGFsIGZ1bmN0aW9ucworCXJldHVybiB0aGUgbmV3IHBvc2l0aW9uLgorCisyMDAyLTEyLTI1ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisJKiBkb2MvZGJ1cy1zYXNsLXByb2ZpbGUudHh0OiBkb2NzIG9uIHRoZSBhdXRoZW50aWNhdGlvbiBwcm90b2NvbCwKKwlpdCBpcyBhIHNpbXBsZSBwcm90b2NvbCB0aGF0IGp1c3QgbWFwcyBkaXJlY3RseSB0byBTQVNMLgorCisJKiBkYnVzL2RidXMtYXV0aC5oLCBkYnVzL2RidXMtYXV0aC5jOiBhdXRoZW50aWNhdGlvbiBwcm90b2NvbAorCWluaXRpYWwgaW1wbGVtZW50YXRpb24sIG5vdCBhY3R1YWxseSB1c2VkIHlldC4KKworCSogZGJ1cy9kYnVzLXN0cmluZy5jIChfZGJ1c19zdHJpbmdfZmluZCk6IG5ldyBmdW5jdGlvbgorCShfZGJ1c19zdHJpbmdfZXF1YWwpOiBuZXcgZnVuY3Rpb24KKwkoX2RidXNfc3RyaW5nX2Jhc2U2NF9lbmNvZGUpOiBuZXcgZnVuY3Rpb24KKwkoX2RidXNfc3RyaW5nX2Jhc2U2NF9kZWNvZGUpOiBuZXcgZnVuY3Rpb24KKworMjAwMi0xMi0yNSAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIGRidXMvTWFrZWZpbGUuYW06CisJKiBkYnVzL2RidXMtbWFyc2hhbC5jOiAoc3dhcF9ieXRlcyksIChfZGJ1c19tYXJzaGFsX2RvdWJsZSksCisJKF9kYnVzX21hcnNoYWxfaW50MzIpLCAoX2RidXNfbWFyc2hhbF91aW50MzIpLAorCShfZGJ1c19kZW1hcnNoYWxfZG91YmxlKSwgKF9kYnVzX2RlbWFyc2hhbF9pbnQzMiksCisJKF9kYnVzX2RlbWFyc2hhbF91aW50MzIpLCAoX2RidXNfbWFyc2hhbF90ZXN0KToKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLmg6CisJKiBkYnVzL2RidXMtcHJvdG9jb2wuaDoKKwkqIGRidXMvZGJ1cy10ZXN0LmM6IChtYWluKToKKwkqIGRidXMvZGJ1cy10ZXN0Lmg6CisJQWRkIHVuLW9wdGltaXplZCBtYXJzaGFsbGluZy9kZW1hcnNoYWxsaW5nIHJvdXRpbmVzLgorCisyMDAyLTEyLTI1ICBIYXJyaSBQb3J0ZW4gIDxwb3J0ZW5Aa2RlLm9yZz4KKworCSogcXQvZGJ1cy1xdC5oOiBhZGp1c3RlZCBjdG9yIGFuZCBnZXR0ZXIgdG8gS0RFL1F0IGNvbnZlbnRpb25zCisKKzIwMDItMTItMjQgIFphY2sgUnVzaW4gIDx6YWNrQGtkZS5vcmc+CisKKwkqIHF0L2RidXMtcXRocmVhZC5jYzogYWRkaW5nIC0gaW50ZWdyYXRlcyBRTXV0ZXggaW50byBEYnVzCisJKiBxdC9kYnVzLXF0Lmg6IHNrZWxldG9uIHdpdGggdHdvIHNhbXBsZSBpbXBsZW1lbmF0YXRpb24gb2YgdGhlCisJbWFpbiBsb29wIHN0dWZmCisKKzIwMDItMTItMjQgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGdsaWIvZGJ1cy1ndGhyZWFkLmM6IGZpeCBpbmNsdWRlCisKKwkqIGdsaWIvZGJ1cy1nbGliLmg6IHJlbmFtZSBEQnVzTWVzc2FnZUhhbmRsZXIgZm9yIG5vdy4KKwlJIHRoaW5rIGdsaWIgQVBJIG5lZWRzIHRvIGNoYW5nZSwgdGhvdWdoLCBhcyB5b3UgZG9uJ3QKKwl3YW50IHRvIHVzZSBEQnVzTWVzc2FnZUZ1bmN0aW9uLCB5b3Ugd2FudCB0byB1c2UgdGhlCisJREJ1c01lc3NhZ2VIYW5kbGVyIG9iamVjdC4gUHJvYmFibHkKKwlkYnVzX2Nvbm5lY3Rpb25fb3Blbl93aXRoX2dfbWFpbl9sb29wKCkKKwlhbmQgZGJ1c19jb25uZWN0aW9uX3NldHVwX2dfbWFpbl9sb29wKCkgb3Igc29tZXRoaW5nIGxpa2UgdGhhdAorCShidXQgdGhpbmsgb2YgYmV0dGVyIG5hbWVzLi4uKSB0aGF0IGp1c3QgY3JlYXRlIGEgY29ubmVjdGlvbgorCXRoYXQgaGFzIHdhdGNoL3RpbWVvdXQgZnVuY3Rpb25zIGV0Yy4gYWxyZWFkeSBzZXQgdXAuCisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMKKwkoZGJ1c19jb25uZWN0aW9uX3NlbmRfbWVzc2FnZV93aXRoX3JlcGx5KTogbmV3IGZ1bmN0aW9uIGp1c3QgdG8KKwlzaG93IGhvdyB0aGUgbWVzc2FnZSBoYW5kbGVyIGhlbHBzIHVzIGRlYWwgd2l0aCByZXBsaWVzLgorCisJKiBkYnVzL2RidXMtbGlzdC5jIChfZGJ1c19saXN0X3JlbW92ZV9sYXN0KTogbmV3IGZ1bmN0aW9uCisKKwkqIGRidXMvZGJ1cy1zdHJpbmcuYyAoX2RidXNfc3RyaW5nX3Rlc3QpOiBmcmVlIGEgc3RyaW5nIHRoYXQKKwl3YXNuJ3QKKworCSogZGJ1cy9kYnVzLWhhc2guYzogdXNlIG1lbW9yeSBwb29scyBmb3IgdGhlIGhhc2ggZW50cmllcworCShyZWJ1aWxkX3RhYmxlKTogYmUgbW9yZSBwYXJhbm9pZCBhYm91dCBvdmVyZmxvdywgYW5kCisJc2hyaW5rIHRhYmxlIHdoZW4gd2UgY2FuCisJKF9kYnVzX2hhc2hfdGVzdCk6IHJlZHVjZSBudW1iZXIgb2Ygc3ByaW50ZnMgYW5kIHdyaXRlCisJdmFsaWQgQzg5LiBBZGQgdGVzdHMgZm9yIGNhc2Ugd2hlcmUgd2UgZ3JvdyBhbmQgdGhlbgorCXNocmluayB0aGUgaGFzaCB0YWJsZS4KKworCSogZGJ1cy9kYnVzLW1lbXBvb2wuaCwgZGJ1cy9kYnVzLW1lbXBvb2wuYzogbWVtb3J5IHBvb2xzCisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMgKGRidXNfY29ubmVjdGlvbl9yZWdpc3Rlcl9oYW5kbGVyKQorCShkYnVzX2Nvbm5lY3Rpb25fdW5yZWdpc3Rlcl9oYW5kbGVyKTogbmV3IGZ1bmN0aW9ucworCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChkYnVzX21lc3NhZ2VfZ2V0X25hbWUpOiBuZXcKKworCSogZGJ1cy9kYnVzLWxpc3QuYzogZml4IGRvY3MgdHlwbworCisJKiBkYnVzL2RidXMtbWVzc2FnZS1oYW5kbGVyLmgsIGRidXMvZGJ1cy1tZXNzYWdlLWhhbmRsZXIuYzoKKwlhbiBvYmplY3QgcmVwcmVzZW50aW5nIGEgaGFuZGxlciBmb3IgbWVzc2FnZXMuCisKKzIwMDItMTItMTYgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBnbGliL2RidXMtZ2xpYi5oOgorCSogZ2xpYi9kYnVzLWd0aHJlYWQuYzogKGRidXNfZ3RocmVhZF9pbml0KToKKwlEb24ndCB1c2UgdGhlIGdkYnVzIHByZWZpeCBmb3IgcHVibGljIGZ1bmN0aW9ucy4KKworMjAwMi0xMi0xNiAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U+CisKKwkqIE1ha2VmaWxlLmFtOgorCSogY29uZmlndXJlLmluOgorCUFkZCBHTGliIGNoZWNrcyBhbmQgZml4dXAgLnBjIGZpbGVzCisKKwkqIGdsaWIvTWFrZWZpbGUuYW06CisJKiBnbGliL2RidXMtZ2xpYi5oOgorCSogZ2xpYi9kYnVzLWdtYWluLmM6IChnZGJ1c19jb25uZWN0aW9uX3ByZXBhcmUpLAorCShnZGJ1c19jb25uZWN0aW9uX2NoZWNrKSwgKGdkYnVzX2Nvbm5lY3Rpb25fZGlzcGF0Y2gpLAorCShnZGJ1c19hZGRfY29ubmVjdGlvbl93YXRjaCksIChnZGJ1c19yZW1vdmVfY29ubmVjdGlvbl93YXRjaCksCisJKGRidXNfY29ubmVjdGlvbl9nc291cmNlX25ldyk6CisJKiBnbGliL2RidXMtZ3RocmVhZC5jOiAoZGJ1c19nbXV0ZXhfbmV3KSwgKGRidXNfZ211dGV4X2ZyZWUpLAorCShkYnVzX2dtdXRleF9sb2NrKSwgKGRidXNfZ211dGV4X3VubG9jayksIChkYnVzX2d0aHJlYWRfaW5pdCk6CisJKiBnbGliL3Rlc3QtZGJ1cy1nbGliLmM6IChtZXNzYWdlX2hhbmRsZXIpLCAobWFpbik6CisJQWRkIEdMaWIgc3VwcG9ydC4KKworMjAwMi0xMi0xNSAgSGFycmkgUG9ydGVuICA8cG9ydGVuQGtkZS5vcmc+CisKKwkqIGF1dG9nZW4uc2g6IGNoZWNrIGZvciBsaWJ0b29saXplIGJlZm9yZSBhdHRlbXB0aW5nIHRvIHVzZSBpdAorCisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LXVuaXguYzogaW5jbHVkZSA8c3lzL3RpbWUuaD4gZm9yIHRpbWV2YWwKKwlzdHJ1Y3QuCisKKwkqIC5jdnNpZ25vcmU6IGlnbm9yZSBtb3JlIHN0YW1wIGZpbGVzCisKKwkqIGRidXMvZGJ1cy13YXRjaC5jIChfZGJ1c193YXRjaF9saXN0X25ldyk6IGZpeGVkIGRvYyBlcnJvcgorCisJKiB0ZXN0L01ha2VmaWxlLmFtOiBhZGRlZCAtSSQodG9wX3NyY2RpcikgdG8gYmUgYWJsZSB0byBjb21waWxlCisJd2l0aG91dCBtYWtlIGluc3RhbGwuCisKKzIwMDItMTItMTUgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy10aHJlYWRzLmM6IGFkZCB0aHJlYWQgc3R1YnMgdGhhdCBhIGhpZ2hlciBsaWJyYXJ5CisJbGF5ZXIgY2FuIGZpbGwgaW4uIGUuZy4gdGhlIEdMaWIgd3JhcHBlciBtaWdodCBmaWxsIHRoZW0gaW4gd2l0aAorCUdUaHJlYWQgc3R1ZmYuIFdlIHN0aWxsIG5lZWQgdG8gdXNlIHRoaXMgdGhyZWFkIEFQSSB0bworCXRocmVhZC1zYWZlLWl6ZSB0aGUgbGlicmFyeS4KKworMjAwMi0xMi0xMiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC11bml4LmMsIGRidXMvZGJ1cy1zZXJ2ZXItdW5peC5jOiB1c2UgdGhlCisJYmVsb3cgbmV3IGludGVyZmFjZXMgYW5kIGluY2x1ZGUgZmV3ZXIgc3lzdGVtIGhlYWRlcnMuCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMgKF9kYnVzX3JlYWQpOiBuZXcgZnVuY3Rpb24KKwkoX2RidXNfd3JpdGUpOiBuZXcgZnVuY3Rpb24KKwkoX2RidXNfd3JpdGVfdHdvKTogbmV3IGZ1bmN0aW9uCisJKF9kYnVzX2Nvbm5lY3RfdW5peF9zb2NrZXQpOiBuZXcgZnVuY3Rpb24KKwkoX2RidXNfbGlzdGVuX3VuaXhfc29ja2V0KTogbmV3IGZ1bmN0aW9uCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLWludGVybmFsLmg6IGNoYW5nZSBpbnRlcmZhY2VzIHRvIHVzZQorCURCdXNTdHJpbmcKKworMjAwMi0xMi0xMSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLXR5cGVzLmg6IGFkZCBkYnVzX3VuaWNoYXIKKworCSogZGJ1cy9kYnVzLWludGVybmFscy5jIChfZGJ1c192ZXJib3NlKTogdXNlIF9kYnVzX2dldGVudgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jIChkYnVzX2Nvbm5lY3Rpb25fc2VuZF9tZXNzYWdlKTogcmV0dXJuCisJVFJVRSBvbiBzdWNjZXNzCisKKwkqIGRidXMvZGJ1cy10cmFuc3BvcnQuYzogaW5jbHVkZSBkYnVzLXdhdGNoLmgKKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYzogaW5jbHVkZSBkYnVzLW1lc3NhZ2UtaW50ZXJuYWwuaAorCisJKiBIQUNLSU5HOiBhZGQgZmlsZSB3aXRoIGNvZGluZyBndWlkZWxpbmVzIHN0dWZmLgorCisJKiBkYnVzL2RidXMtc3RyaW5nLmgsIGRidXMvZGJ1cy1zdHJpbmcuYzogRW5jYXBzdWxhdGUgYWxsIHN0cmluZworCWhhbmRsaW5nIGhlcmUsIGZvciBzZWN1cml0eSBwdXJwb3NlcyAoYXMgaW4gdnNmdHBkKS4gTm90IGFjdHVhbGx5CisJdXNpbmcgdGhpcyBjbGFzcyB5ZXQuCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmgsIGRidXMvZGJ1cy1zeXNkZXBzLmM6IEVuY2Fwc3VsYXRlIGFsbAorCXN5c3RlbS9saWJjIHVzYWdlIGhlcmUsIGFzIGluIHZzZnRwZCwgZm9yIGVhc2Ugb2YgYXVkaXRpbmcgKGFuZAorCXNob3VsZCBhbHNvIHNpbXBsaWZ5IHBvcnRhYmlsaXR5KS4gSGF2ZW4ndCBhY3R1YWxseSBtb3ZlZCBhbGwgdGhlCisJc3lzdGVtL2xpYmMgdXNhZ2UgaW50byBoZXJlIHlldC4KKworMjAwMi0xMS0yNSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogZGJ1cy9kYnVzLWludGVybmFscy5jIChfZGJ1c192ZXJib3NlKTogZml4IHRvIG5vdAorCWFsd2F5cyBwcmludCB0aGUgZmlyc3QgdmVyYm9zZSBtZXNzYWdlLgorCisyMDAyLTExLTI0ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcG9ib3guY29tPgorCisgICAgICAgICogdGVzdC9lY2hvLWNsaWVudC5jLCB0ZXN0L2VjaG8tc2VydmVyLmM6IGNoZWVzeSB0ZXN0CisJY2xpZW50cy4KKworCSogY29uZmlndXJlLmluIChBQ19DSEVDS19GVU5DUyk6IGNoZWNrIGZvciB3cml0ZXYKKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAoX2RidXNfbWVzc2FnZV9nZXRfbmV0d29ya19kYXRhKTogbmV3CisJZnVuY3Rpb24KKworCSogZGJ1cy9kYnVzLWxpc3QuYyAoX2RidXNfbGlzdF9mb3JlYWNoKTogbmV3IGZ1bmN0aW9uCisKKwkqIGRidXMvZGJ1cy1pbnRlcm5hbHMuYyAoX2RidXNfdmVyYm9zZSk6IG5ldyBmdW5jdGlvbgorCisJKiBkYnVzL2RidXMtc2VydmVyLmMsIGRidXMvZGJ1cy1zZXJ2ZXIuaDogcHVibGljIG9iamVjdAorCXJlcHJlc2VudGluZyBhIHNlcnZlciB0aGF0IGxpc3RlbnMgZm9yIGNvbm5lY3Rpb25zLgorCisJKiBkYnVzLy5jdnNpZ25vcmU6IGNyZWF0ZQorCisJKiBkYnVzL2RidXMtZXJyb3JzLmgsIGRidXMvZGJ1cy1lcnJvcnMuYzoKKwlwdWJsaWMgQVBJIGZvciByZXBvcnRpbmcgZXJyb3JzCisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmgsIGRidXMvZGJ1cy1jb25uZWN0aW9uLmM6CisJcHVibGljIG9iamVjdCByZXByZXNlbnRpbmcgYSBjb25uZWN0aW9uIHRoYXQKKwlzZW5kcy9yZWNlaXZlcyBtZXNzYWdlcy4gKFNhbWUgb2JqZWN0IHVzZWQgZm9yCisJYm90aCBjbGllbnQgYW5kIHNlcnZlci4pCisKKwkqIGRidXMvZGJ1cy10cmFuc3BvcnQuaCwgZGJ1cy9kYnVzLXRyYW5zcG9ydC5jOgorCUJhc2ljIGFic3RyYWN0aW9uIGZvciBkaWZmZXJlbnQga2luZHMgb2Ygc3RyZWFtCisJdGhhdCB3ZSBtaWdodCByZWFkL3dyaXRlIG1lc3NhZ2VzIGZyb20uCisKKzIwMDItMTEtMjMgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy1pbnRlcm5hbHMuaCAoX0RCVVNfSU5UX01BWCk6IGFkZCBfREJVU19JTlRfTUlOCisJX0RCVVNfSU5UX01BWAorCisJKiBkYnVzL2RidXMtdGVzdC5jIChtYWluKTogYWRkIGxpc3QgdGVzdCwgYW5kIGluY2x1ZGUKKwlkYnVzLXRlc3QuaCBhcyBpbnRlbmRlZAorCisJKiBkYnVzL2RidXMtaGFzaC5jIChfZGJ1c19oYXNoX3RhYmxlX3JlbW92ZV9zdHJpbmcpCisJKF9kYnVzX2hhc2hfdGFibGVfcmVtb3ZlX2ludCk6IHJldHVybiB2YWx1ZSBpbmRpY2F0ZXMKKwl3aGV0aGVyIHRoZSBlbnRyeSBleGlzdGVkIHRvIHJlbW92ZQorCisJKiBkYnVzL2RidXMtbGlzdC5jOiBhZGQgbGlua2VkIGxpc3QgdXRpbGl0eSBjbGFzcywKKwl3aXRoIGRvY3MgYW5kIHRlc3RzCisKKwkqIGRidXMvZGJ1cy1oYXNoLmM6IGFkZCBUT0RPIGl0ZW0gYWJvdXQgc2hyaW5raW5nIHRoZSBoYXNoIGJ1Y2tldAorCWFycmF5IHNvbWV0aW1lcy4KKworMjAwMi0xMS0yMyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHBvYm94LmNvbT4KKworCSogRG94eWZpbGUuaW4gKElOQ0xVREVfRklMRV9QQVRURVJOUyk6IGV4cGFuZCBEQlVTX0JFR0lOX0RFQ0xTLworCURCVVNfRU5EX0RFQ0xTIHRvIG5vdGhpbmcsIHRoYXQgc2hvdWxkIGZpeCB0aGlzIG9uY2UgYW5kIGZvciBhbGwKKworCSogRG94eWZpbGUuaW4gKEpBVkFET0NfQVVUT0JSSUVGKTogc2V0IHRvIFlFUworCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jLCBkYnVzL2RidXMtaGFzaC5jOgorCWFkZCBzb21lIG1pc3NpbmcgQGJyaWVmCisKKzIwMDItMTEtMjMgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmg6IHB1dCBzZW1pY29sb25zIGFmdGVyIERFQlVHX0JFR0lOX0RFQ0xTCisJdG8gYXZvaWQgY29uZnVzaW5nIERveHlnZW4KKworCSogZGJ1cy9kYnVzLWhhc2guYzogQH0gbm90IH1ACisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKHN0cnVjdCBEQnVzTWVzc2FnZSk6IHNwbGl0IG91dAorCWludGVybmFscyBkb2NzCisKKzIwMDItMTEtMjMgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogcGlsZSBvbiBtb3JlIHdhcm5pbmcgZmxhZ3MgaWYgdXNpbmcgZ2NjCisKKwkqIERveHlmaWxlLmluIChFWFRSQUNUX1NUQVRJQyk6IHNldCB0byBOTywgc28gd2UgZG9uJ3QgaGF2ZQorCXRvIGRvY3VtZW50IHN0YXRpYyBmdW5jdGlvbnMKKworCSogY29uZmlndXJlLmluOiBhZGQgc3VtbWFyeSB0byBlbmQgb2YgY29uZmlndXJlIHNvIGl0CisJbG9va3MgbmljZSBhbmQgYXR0cmFjdGl2ZQorCisJKiBkYnVzL2RidXMtaGFzaC5jOiBmaW5pc2ggaW1wbGVtZW50YXRpb24gYW5kIHdyaXRlIHVuaXQKKwl0ZXN0cyBhbmQgZG9jcworCisJKiBjb25maWd1cmUuaW46IGFkZCAtLWVuYWJsZS10ZXN0cyB0byBlbmFibGUgdW5pdCB0ZXN0cworCisJKiBkYnVzL2RidXMtdGVzdC5jOiB0ZXN0IHByb2dyYW0gdG8gcnVuIHVuaXQgdGVzdHMKKwlmb3IgYWxsIGZpbGVzIGluIGRidXMvKiwgaW5pdGlhbGx5IHJ1bnMgYSB0ZXN0IGZvcgorCWRidXMtaGFzaC5jCisKKwkqIGRidXMvZGJ1cy1pbnRlcm5hbHMuaDogZmlsZSB0byBob2xkIHNvbWUgaW50ZXJuYWwgdXRpbGl0eSBzdHVmZgorCisyMDAyLTExLTIyICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLWhhc2guYzogY29weSBpbiBUY2wgaGFzaCB0YWJsZSwgbm90IHlldAorCSJwb3J0ZWQiIGF3YXkgZnJvbSBUY2wKKworCSogZGJ1cy9kYnVzLXR5cGVzLmg6IGhlYWRlciBmb3IgdHlwZXMgc3VjaCBhcyBkYnVzX2Jvb2xfdAorCisyMDAyLTExLTIyICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLmg6IGZpeHVwcyBmb3IgZG9jIHdhcm5pbmdzCisKKwkqIERveHlmaWxlLmluIChGSUxFX1BBVFRFUk5TKTogd2UgbmVlZCB0byBzY2FuIC5oIHRvIHBpY2sgdXAKKwltYWNyb3MKKwkoUVVJRVQpOiBtYWtlIGl0IHF1aWV0IHNvIHdlIGNhbiBzZWUgd2FybmluZ3MKKworCSogZGJ1cy9kYnVzLW1lbW9yeS5jOiB0ZWFjaCBELUJVUyB0byBhbGxvY2F0ZSBhbmQgZnJlZSBtZW1vcnkKKworMjAwMi0xMS0yMiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIE1ha2VmaWxlLmFtOiBpbmNsdWRlICJEb3h5ZmlsZSIgdGFyZ2V0IGluIGFsbC1sb2NhbAorCisJKiBjb25maWd1cmUuaW46IGdlbmVyYXRlIHRoZSBEb3h5ZmlsZQorCisJKiBEb3h5ZmlsZS5pbjogbW92ZSBEb3h5ZmlsZSBoZXJlLCBzbyB3ZSBjYW4gdXNlCisJY29uZmlndXJlIHRvIGdlbmVyYXRlIGEgRG94eWZpbGUgd2l0aCB0aGUgcmlnaHQKKwl2ZXJzaW9uIG51bWJlciBldGMuCisKKzIwMDItMTEtMjIgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jOiBtb3ZlIGlubGluZSBkb2NzIGludG8gLmMgZmlsZQorCisJKiBEb3h5ZmlsZSAoT1VUUFVUX0RJUkVDVE9SWSk6IG1vdmUgb3V0cHV0IHRvIGRvYy9hcGkKKwlzbyBhbGwgZG9jcyBhcmUgdW5kZXIgZG9jLworCShNQU5fRVhURU5TSU9OKTogZ2VuZXJhdGUgbWFuIHBhZ2VzLiBVc2UgZXh0ZW5zaW9uCisJIi4zZGJ1cyIgd2hpY2ggbWF0Y2hlcyAiLjNxdCIgb24gbXkgc3lzdGVtLAorCUkgZ3Vlc3MgdGhpcyBpcyBPSywgSSBkb24ndCBrbm93IHJlYWxseS4KKwkoRklMRV9QQVRURVJOUyk6IGxvb2sgZm9yIC5jIGZpbGVzIG5vdCAuaCwgbWFrZXMgc2Vuc2UKKwlmb3IgcGxhaW4gQyBJIHRoaW5rCisKKzIwMDItMTEtMjIgIEhhdm9jIFBlbm5pbmd0b24gIDxocEBwb2JveC5jb20+CisKKwkqIE1ha2VmaWxlLmFtIChTVUJESVJTKTogcmVuYW1lIHN1YmRpciAic2VydmVyIiB0byAiYnVzIgorCWJlY2F1c2UgYW55IGFwcCBjYW4gYmUgYSBzZXJ2ZXIsIGFuZCBhbnkgYXBwIGNhbiBiZSBhIGNsaWVudCwKKwl0aGUgYnVzIGlzIGEgc3BlY2lhbCBraW5kIG9mIHNlcnZlci4KKworVGh1IE5vdiAyMSAyMzozNTozMSAyMDAyICBaYWNrIFJ1c2luICA8emFja0BrZGUub3JnPgorCisJKiBEb3h5ZmlsZSA6IGFkZGluZy4gU3RpbGwgbmVlZHMgTWFrZWZpbGUgcnVsZXMgdG8gYmUgZ2VuZXJhdGVkCisJYXV0b21hdGljYWxseSAoanVzdCBydW4gImRveHlnZW4iIGluIHRoZSB0b3BsZXZlbCBkaXIgZm9yIG5vdyB0bworCWdlbmVyYXRlIGRvY3MpCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmggOiBBZGRpbmcgc2FtcGxlIGRvY3MgKGphdmFkb2Mgc2luY2UKKwlyZXNlbWJsZXMgZ3RrLWRvYyBhIGxpdHRsZSBtb3JlKQorCisJKiBkYnVzL2RidXMuaCA6IEFkZGluZyBzYW1wbGUgZG9jcworCisyMDAyLTExLTIxICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9NYWtlZmlsZS5hbSAoSU5DTFVERVMpOiBkZWZpbmUgREJVU19DT01QSUxBVElPTgorCXNvIHdlIGNhbiBhbGxvdyBvdXJzZWx2ZXMgdG8gaW5jbHVkZSBmaWxlcyBkaXJlY3RseSwKKwlpbnN0ZWFkIG9mIGhhdmluZyB0byB1c2UgZGJ1cy5oCisKKwkqIGRidXMvZGJ1cy5oOiBmaWxsIGluCisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmg6IHNrZXRjaCBvdXQgYSBzYW1wbGUgaGVhZGVyIGZpbGUuCisJSW5jbHVkZSBncmlwaW5nIGlmIHlvdSBpbmNsdWRlIGl0IGRpcmVjdGx5IGluc3RlYWQgb2YKKwl2aWEgZGJ1cy5oCisKKwkqIGRidXMvZGJ1cy1tYWNyb3MuaDogbmV3IGZpbGUgd2l0aCBtYWNyb3MgZm9yIGV4dGVybiAiQyIsCisJVFJVRS9GQUxTRSwgTlVMTCwgZXRjLgorCisJKiBkb2MvZmlsZS1ib2lsZXJwbGF0ZS5jOiBwdXQgaW5jbHVkZSBndWFyZHMgaW4gaGVyZQorCisyMDAyLTExLTIxICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZG9jL2ZpbGUtYm9pbGVycGxhdGUuYzogaW5jbHVkZSBib3RoIEFGTCBhbmQgR1BMIGJvaWxlcnBsYXRlLgorCisJKiBDT1BZSU5HOiBpbmNsdWRlIHRoZSBHUEwgYXMgd2VsbCwgYW5kIGxpY2Vuc2UgY29kZQorCXVuZGVyIGJvdGggQUZMIGFuZCBHUEwuCisKKzIwMDItMTEtMjEgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBhY2NvbmZpZy5oOiBnZXQgcmlkIG9mIHRoaXMKKworCSogYXV0b2dlbi5zaCAocnVuX2NvbmZpZ3VyZSk6IGFkZCAtLW5vLWNvbmZpZ3VyZSBvcHRpb24KKworCSogY29uZmlndXJlLmluOiByZW1vdmUgQUNfQVJHX1BST0dSQU0gdG8gbWFrZQorCWF1dG9jb25mIGNvbXBsYWluIGxlc3MuIGFkZCBBQ19QUkVSRVEuCisJYWRkIEFDX0RFRklORSB0aGlyZCBhcmcuCisKKzIwMDItMTEtMjEgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGNvZGVmYWN0b3J5LnNlPgorCisJKiBkb2MvTWFrZWZpbGUuYW06CisJRml4IHJlZmVyZW5jZXMgc28gd2UgY2FuIGRpc3RjaGVjay4KKworMjAwMi0xMS0yMSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIEluaXRpYWwgbW9kdWxlIGNyZWF0aW9uCisKZGlmZiAtLWdpdCBhL0NoYW5nZUxvZy5wcmUtMS0yIGIvQ2hhbmdlTG9nLnByZS0xLTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjIyMDQ0OAotLS0gL2Rldi9udWxsCisrKyBiL0NoYW5nZUxvZy5wcmUtMS0yCkBAIC0wLDAgKzEsMjAyNyBAQAorMjAwOC0wNC0wNCAgSm9obiAoSjUpIFBhbG1pZXJpIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBSZWxlYXNlZCAxLjIuMQorCisyMDA4LTA0LTAzICBKb2huIChKNSkgUGFsbWllcmkgPGpvaG5wQHJlZGhhdC5jb20+CisKKwlQYXRjaCBmcm9tIFN1bWl0IDxzdW1pdHNral8yMEB5YWhvby5jb20+LCBjb21tZW50cyBhZGRlZAorCisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LmMoX2RidXNfdHJhbnNwb3J0X29wZW4pOiBmaXggbWVtIGxlYWsKKworMjAwOC0wNC0wMyAgSm9obiAoSjUpIFBhbG1pZXJpIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jIChkYnVzX2Nvbm5lY3Rpb25fc2VuZCk6IGFkZCBkb2N1bWVudGF0aW9uCisJICB0byBkZXNjcmliZSB3aGVuIHRvIGNhbGwgZGJ1c19jb25uZWN0aW9uX2ZsdXNoIGFuZAorCSAgZGJ1c19jb25uZWN0aW9uX3VucmVmIGFmdGVyIGEgY2FsbCB0byBkYnVzX2Nvbm5lY3Rpb25fc2VuZCBpcyBtYWRlCisJICBJbml0aWFsIHdvcmRpbmcgYnkgU3RhbmlzbGF2IEJyYWJlYyA8c2JyYWJlYyBhdCBzdXNlLmN6PiAKKwkgIChmZC5vIGJ1ZyMxMzU1OCkKKworMjAwOC0wNC0wMyAgSm9obiAoSjUpIFBhbG1pZXJpIDxqb2hucEByZWRoYXQuY29tPgorCisJUGF0Y2ggZnJvbSBLaW1tbyBIw6Rtw6Rsw6RpbmVuIDxraW1tby5oYW1hbGFpbmVuIGF0IG5va2lhLmNvbT4KKworCSogYnVzL2V4cGlyZWxpc3QuYworCSAgKGRvX2V4cGlyYXRpb25fd2l0aF9jdXJyZW50X3RpbWUpOiBjYWxjdWxhdGUgY29ycmVjdCBtaW4gd2FpdCB0aW1lCisJICBhbmQgbmV4dCBpbnRlcnZhbAorCSAgKGJ1c19leHBpcmVfbGlzdF9hZGQsIGJ1c19leHBpcmVfbGlzdF9hZGRfbGluayk6IGlmIHRoZSB0aW1lb3V0IGlzIAorCSAgZGlzYWJsZWQgd2hlbiB3ZSBhZGQgYW4gaXRlbSB0byB0aGUgZXhwaXJlIGxpc3QsIGVuYWJsZSB0aGUgdGltZW91dAorCSAgKGRvX2V4cGlyYXRpb25fd2l0aF9jdXJyZW50X3RpbWUpOiBvbmx5IHNldCB0aW1lb3V0IGlmIHRoZXJlIGFyZQorCSAgaXRlbXMgdG8gZXhwaXJlCisKKzIwMDgtMDQtMDEgIFRpbW8gSG9lbmlnICA8dGhvZW5pZ0BzdXNlLmRlPgorCisJUGF0Y2ggZnJvbSBGcmVkZXJpYyBDcm96YXQgPGZjcm96YXRAbWFuZHJpdmEuY29tPgorCisJKiBidXMvZGlyLXdhdGNoLWlub3RpZnkuYyAoYnVzX3dhdGNoX2RpcmVjdG9yeSk6IE9ubHkgbW9uaXRvcgorCSAgSU5fQ0xPU0VfV1JJVEUsIElOX0RFTEVURSwgSU5fTU9WRV9UTyBhbmQgSU5fTU9WRV9GUk9NIGV2ZW50cy4gVGhpcworCSAgd2F5LCBvbmx5IGF0b21pYyBjaGFuZ2VzIHRvIGNvbmZpZ3VyYXRpb24gZmlsZSBhcmUgbW9uaXRvcmVkLgorCSogYnVzL2Rpci13YXRjaC1pbm90aWZ5LmMgKF9oYW5kbGVfaW5vdGlmeV93YXRjaCk6IEZpeCB0eXBvIGluCisJICBfZGJ1c192ZXJib3NlIGZ1bmN0aW9uIGNhbGwKKwkqIGJ1cy9kaXItd2F0Y2gtaW5vdGlmeS5jIChidXNfZHJvcF9hbGxfZGlyZWN0b3J5X3dhdGNoZXMpOiBVc2UKKwkgIF9kYnVzX3N0cmVycm9yIGluc3RlYWQgb2YgcGVycm9yCisKKzIwMDgtMDMtMDQgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBidXMvY29ubmVjdGlvbi5jLCBidXMvZXhwaXJlbGlzdC5jOiBNYWtlIHRoZSBCdXNFeHBpcmVMaXN0CisJc3RydWN0IG9wYXF1ZSwgYWRkaW5nIGFjY2Vzc29ycyBmb3IgbWFuaXB1bGF0aW5nIHRoZSBsaXN0LiBJbiB0aGlzCisJY29tbWl0IHRoZXJlIHNob3VsZCBiZSBubyBjaGFuZ2UgaW4gZnVuY3Rpb25hbGl0eSBvciBiZWhhdmlvci4gVGhlCisJcHVycG9zZSBvZiB0aGlzIGNoYW5nZSBpcyB0byBpbXByb3ZlIGVuY2Fwc3VsYXRpb24gcHJpb3IgdG8gZml4aW5nCisJc29tZSBidWdzIEtpbW1vIEjDpG3DpGzDpGluZW4gZm91bmQgd2hlcmUgdGhlIHRpbWVvdXQgaXMgbm90IHByb3Blcmx5CisJdXBkYXRlZCwgc2luY2Ugd2UgbmVlZCB0byBlLmcuIHRha2Ugc29tZSBhY3Rpb24gd2hlbmV2ZXIgYWRkaW5nCisJYW5kIHJlbW92aW5nIHN0dWZmIGZyb20gdGhlIGV4cGlyZSBsaXN0LgorCisyMDA4LTAzLTMxICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJUGF0Y2ggZnJvbSBPd2VuIFRheWxvciA8b3RheWxvckByZWRoYXQuY29tPgorCisJKiB0b29scy9kYnVzLWxhdW5jaC14MTEuYzogQ2hlY2sgZm9yIFgxMSBldmVudHMgYmVmb3JlCisJc2VsZWN0aW5nIChGRE8gYnVnICMxNTI5MykKKworMjAwOC0wMy0zMSAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCVBhdGNoIGZyb20gT3dlbiBUYXlsb3IgPG90YXlsb3JAcmVkaGF0LmNvbT4KKworCSogdG9vbHMvZGJ1cy1sYXVuY2gteDExLmM6IE1ha2Ugc3VyZSB3ZSBjYWxsIFhGbHVzaCgpCisJb24gYWxsIGNvZGUgcGF0aHMgKEZETyBidWcgIzE1MjkzKQorCisyMDA4LTAzLTI3ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogdG9vbHMvZGJ1cy1zZW5kLmMgKGFwcGVuZF9kaWN0KTogRG8gbm90IHByb3ZpZGUgYSBzaWduYXR1cmUgdG8KKwlkYnVzX21lc3NhZ2VfaXRlcl9vcGVuX2NvbnRhaW5lcigpIHdoZW4gb3BlbmluZyBhIGRpY3QgZW50cnkuCisKKzIwMDgtMDMtMjYgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwlQYXRjaCBmcm9tIFNjb3R0IEphbWVzIFJlbW5hbnQgPHNjb3R0QG5ldHNwbGl0LmNvbT4KKworCSogZGJ1cy9kYnVzLWJ1cy5jOiBTZXQgZGVmYXVsdCBleGl0X29uX2Rpc2Nvbm5lY3QgYWZ0ZXIgcmVnaXN0cmF0aW9uIHdpdGgKKwl0aGUgYnVzLCBub3QgYmVmb3JlLiAgVGhpcyBlbnN1cmVzIHRoYXQgcHJvZ3JhbXMgd2hpY2ggd2lzaCB0byBzZXQKKwlleGl0X29uX2Rpc2Nvbm5lY3QgdG8gRkFMU0Ugd2lsbCBub3QgYmUgdGVybWluYXRlZCBpZiB0aGUgYnVzIGV4aXRzCisJZHVyaW5nIHJlZ2lzdHJhdGlvbi4gIChGRE8gQnVnICMxNTExMikKKworMjAwOC0wMy0wNCAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogZml4IGJyb2tlbiBwb2xsIG9uIE1hYyBPU1ggLSBidWlsZCBwYXRjaCBieSBCZW5qYW1pbiBSZWVkCisJKiBjb25maWd1cmUuaW46IGNoZWNrIGZvciBPU1gncyBkZWFkbG9ja2luZyBwb2xsCisJKiBkYnVzL2RidXMtc3lzZGVwcy11bml4LmMgKF9kYnVzX3BvbGwpOiBpZiB3ZSBoYXZlIGEgYnJva2VuIHBvbGwKKwkgIGRvbid0IHVzZSBwb2xsCisKKzIwMDgtMDMtMDQgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGNoZWNrIGlmIHRoZSBsaW5rZXIgc3VwcG9ydHMgYSBmbGFnIGluc3RlYWQgb2YganVzdCBjaGVja2luZyBmb3IgR05VCisJICBsZAorCSogY29uZmlndXJlLmluOiBtb3ZlIEFNX1BST0dfTElCVE9PTCB0byB0aGUgdG9wCisJICAobGRfc3VwcG9ydHNfZmxhZyk6IG5ldyBmdW5jdGlvbiBmb3IgY2hlY2tpbmcgaWYgdGhlIGxpbmtlciBzdXBwb3J0cworCSAgYSBnaXZlbiBmbGFnCisKKzIwMDgtMDMtMDQgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGFkZCBhIGNoYW5nZWxvZyBmb3IgQmVuamFtaW4gUmVlZCdzIGdpdCBwYXRjaCBSQU5UOiBDaGFuZ2UgTG9ncyBhcmUKKwkgIGhhbmRsZWQgYnkgZ2l0IGFuZCBoYXZpbmcgYW4gZXh0ZXJuYWwgY2hhbmdlbG9nIGp1c3Qgc2NyZXdzIHVwCisJICBtZXJnaW5nLiAgV2Ugc2hvdWxkIHdyaXRlIGRvd24gcnVsZXMgZm9yIGRvaW5nIGdpdCBjb21taXQgbWVzc2FnZXMKKwkgIGFuZCBsZWF2ZSBpdCBhdCB0aGF0LgorCSogY29uZmlndXJlLmluOiBQbGF0Zm9ybSBidWlsZCBmaXhlcyBmb3IgTWFjIE9TIFgKKwkgIHRoZSBEYXJ3aW4gbGlua2VyIGRvZXMgbm90IHVuZGVyc3RhbmQgdGhlIC16IG9wdGlvbjsgd3JhcCBpdCBpbiAKKwkgIGEgY2hlY2sgZm9yICR3aXRoX2dudV9sZC4KKwkgIGVudmlyb24gaXMgb25seSBhdmFpbGFibGUgYXQgcnVudGltZSwgc28geW91IG5lZWQgdG8gbWFrZSBhCisJICByZWZlcmVuY2UgdG8gX05TR2V0RW52aXJvbiBpbnN0ZWFkIGZvciBzeW1ib2xzIHRvIHJlc29sdmUgcHJvcGVybHkuCisKKzIwMDgtMDMtMDQgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogYWRkICRUSFJFQURfTElCUyB0byBEQlVTX0xBVU5DSEVSX0xJQlMgc28gd2UgbGluayAKKwkgIGNvcnJlY3RseQorCisyMDA4LTAzLTA0ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiB0b29scy9kYnVzLWxhdW5jaC5jOiB3cmFwIFgnaXNtIGluICNpZmRlZiBzbyB3ZSBjYW4gY29tcGlsZSAKKwkgIHdpdGhvdXQgWAorCisyMDA4LTAyLTI4ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy11bml4LmM6IGRlZmluZSBfQUlfQUREUkNPTkZJRyBhcyAwIGlmIG5vdAorCSAgZGVmaW5lZCBzbyB0aGF0IHdlIGNhbiBjb21waWxlIHdpdGggYW4gb2xkZXIgZ2xpYmMgCisKKzIwMDgtMDItMjYgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIFJlbGVhc2VkIDEuMS4yMAorCisyMDA4LTAyLTI2ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBDVkUtMjAwOC0wNTk1IC0gc2VjdXJpdHkgcG9saWN5IG9mIHRoZSB0eXBlIDxhbGxvdyBzZW5kX2ludGVyZmFjZT0KKwkgICJzb21lLmludGVyZmFjZS5XaXRoTWV0aG9kcyIvPiB3b3JrIGFzIGFuIGltcGxpY2l0IGFsbG93IGZvcgorCSAgbWVzc2FnZXMgc2VudCB3aXRob3V0IGFuIGludGVyZmFjZSBieXBhc3NpbmcgdGhlIGRlZmF1bHQgZGVueSBydWxlcworCSAgYW5kIHBvdGVudGlhbGx5IGFsbG93aW5nIHJlc3RyaWN0ZWQgbWV0aG9kcyBleHBvcnRlZCBvbiB0aGUgYnVzIHRvIGJlCisJICBleGVjdXRlZCBieSB1bmF1dGhvcml6ZWQgdXNlcnMuICBUaGlzIHBhdGNoIGZpeGVzIHRoZSBpc3N1ZS4KKwkqIGJ1cy9wb2xpY3kuYyAoYnVzX2NsaWVudF9wb2xpY3lfY2hlY2tfY2FuX3NlbmQsCisJICBidXNfY2xpZW50X3BvbGljeV9jaGVja19jYW5fcmVjZWl2ZSk6IHNraXAgbWVzc2FnZXMgd2l0aG91dCBhbiAKKwkgIGludGVyZmFjZSB3aGVuIGV2YWx1YXRpbmcgYW4gYWxsb3cgcnVsZSwgYW5kIHRodXMgcGFzcyBpdCB0byB0aGUKKwkgIGRlZmF1bHQgZGVueSBydWxlcworCisyMDA4LTAyLTI2ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBjb3JyZWN0bHkgdW5yZWYgY29ubmVjdGlvbnMgd2l0aG91dCBndWlkcyBkdXJpbmcgc2h1dGRvd24KKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMgKGNsb3NlX2Nvbm5lY3Rpb25fb25fc2h1dGRvd24pOiBuZXcgbWV0aG9kCisJICBzcGxpdCBvdXQgZnJvbSBzaGFyZWRfY29ubmVjdGlvbnNfc2h1dGRvd24KKwkgIChzaGFyZWRfY29ubmVjdGlvbnNfc2h1dGRvd24pOiBzaHV0ZG93biBhbGwgc2hhcmVkIGNvbm5lY3Rpb25zCisJICB3aXRob3V0IGd1aWRzCisJICAoX2RidXNfY29ubmVjdGlvbl9yZWZfdW5sb2NrZWQpOiBoYW5kbGUgT09NIHdoZW4gcHJlcGVuZGluZyBubyBndWlkCisJICBjb25uZWN0aW9ucyB0byB0aGUgc2hhcmVkX2Nvbm5lY3Rpb25zX25vX2d1aWQgbGlzdAorCSogUGF0Y2ggYnkgIEtpbW1vIEjDpG3DpGzDpGluZW4gPGtpbW1vIGRvdCBoYW1hbGFpbmVuIGF0IG5va2lhIGRvdCBjb20+CisKKzIwMDgtMDItMjEgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisJCisJKiBmaXggYnVpbGQgYWdhaW5zdCB0aGUgbGF0ZXN0IGdjYy9nbGliYworCSogZGJ1cy9kYnVzLXN5c2RlcHMtdW5peC5jOiBkZWZpbmUgX0dOVV9TT1VSQ0UKKwkqIGJ1cy9zZWxpbnV4LmM6IGluY2x1ZGUgbGltaXRzLmgKKwkqIFBhdGNoIGJ5IE1hdHRoaWFzIENsYXNlbiA8bWNsYXNlbiBhdCByZWRoYXQuY29tPgorCisyMDA4LTAyLTIxICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBmaXhlcyBkYnVzLWxhdW5jaCBzbyB0aGUgYnVzIGdvZXMgYXdheSB3aGVuIFggZG9lcworCSAgKFJlZCBIYXQgQnVnICM0MzA0MTIpCisJKiB0b29scy9kYnVzLWxhdW5jaC5jIChtYWluKTogc2V0IHhkaXNwbGF5ID0gTlVMTAorCSogUGF0Y2ggYnkgTWF0dGhpYXMgQ2xhc2VuIDxtY2xhc2VuIGF0IHJlZGhhdC5jb20+CisKKzIwMDgtMDEtMTcgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisJCisJKiBSZWxlYXNlZCAxLjEuNAorCisyMDA4LTAxLTE3ICBUaW1vIEhvZW5pZyAgPHRob2VuaWdAc3VzZS5kZT4KKwkqIGZpeCBpbm90aWZ5IHN1cHBvcnQKKwkqIGJ1cy9kaXItd2F0Y2gtaW5vdGlmeS5jIChfaGFuZGxlX2lub3RpZnlfd2F0Y2gpOiBmaXggcmVhZGluZyBvZiB0aGUKKwlpbm90aWZ5IGV2ZW50cy4gQWxzbywgdXNlIHNzaXplX3Qgbm90IHNpemVfdCBmb3IgJ3JldCcuCisJKiBidXMvZGlyLXdhdGNoLWlub3RpZnkuYyAoYnVzX3dhdGNoX2RpcmVjdG9yeSk6IHdhdGNoIG5vdCBvbmx5IGZvcgorCUlOX01PRElGWSBidXQgYWxzbyBmb3IgSU5fQ1JFQVRFIGFuZCBJTl9ERUxFVEUKKwkqIGJ1cy9kaXItd2F0Y2gtaW5vdGlmeS5jIChidXNfZHJvcF9hbGxfZGlyZWN0b3J5X3dhdGNoZXMpOiBkcm9wIHRoZQorCWlub3RpZnkgd2F0Y2hlcyBtb3JlIGVsZWdhbnRseSBieSBjbG9zaW5nIGlub3RpZnk6X2ZkLCBzZXQgaW5vdGlmeV9mZCB0bworCS0xIGFmdGVyIGRyb3BwaW5nIHRoZSB3YXRjaGVzCisKKzIwMDgtMDEtMTUgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogY29uZmlndXJlLmluOiBwb3N0LXJlbGVhc2UgdmVyc2lvbiBidW1wCisKKzIwMDgtMDEtMTUgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogUmVsZWFzZWQgMS4xLjMgKDEuMi4wUkMxKQorCisyMDA4LTAxLTE1ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBmaXggaGFja2luZyB0byBzYXkgZ2l0IGluc3RlYWQgb2YgY3ZzCisKKzIwMDgtMDEtMTUgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIHBhdGNoIGJ5IFPDqWJhc3RpZW4gQ291cmV0IDwxMGZ1bmN0aW9uIGF0IGdtYWlsIGRvdCBjb20+CisKKwkqIGRidXMvZGJ1cy1tYXJzaGFsLXJlY3Vyc2l2ZS5jIChhbGxfcmVhZGVyX2NsYXNzZXNbXSk6IHdyYXAgaW4gCisJI2lmbmRlZiBEQlVTX0RJU0FCTEVfQVNTRVJUIHNpbmNlIGl0IGlzIG9ubHkgdXNlZCBpbiBhc3NlcnRzIHdoaWNoCisJYXJlIG5vb3AKKworMjAwOC0wMS0xNSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogcGF0Y2ggYnkgTWFnbnVzIEhlbm9jaCA8aGVub2NoIHBsdXMgYmZkbyBhdCBkdGVrIGRvdCBjaGFsbWVycyBkb3Qgc2U+CisKKwkqIGRidXMvZGJ1cy1hdXRoLmMgKGhhbmRsZV9zZXJ2ZXJfZGF0YV9leHRlcm5hbF9tZWNoKTogaGFuZGxlIFNBU0wKKwlFWFRFUk5BTCdzIGluaXRhbCBlbXB0eSByZXNwb25jZSAoRkRPIEJ1ZyAjOTk0NSkKKworMjAwOC0wMS0xNSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogYnVzL21lc3NhZ2VidXMuaW46IGFkZCBsc2IgaGVhZGVycyAoRkRPIEJ1ZyAjMTE0OTEpCisKKzIwMDgtMDEtMTUgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIHBhdGNoIGJ5IFBldGVyIE8nR29ybWFuIDxwb2dtYSBhdCB0aGV3cml0dGVud29yZCBkb3QgY29tPgorCisJKiBkYnVzL2RidXMtc3Bhd24uYyAoYmFieXNpdF9zaWduYWxfaGFuZGxlcik6IGNoZWNrIHdyaXRlIHJldHVybiB2YWx1ZQorCXNvIHdlIGRvbid0IGhhbmcgKEZETyBCdWcgIzExNjY1KQorCisyMDA4LTAxLTE1ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBwYXRjaCBieSBQZXRlciBPJ0dvcm1hbiA8cG9nbWEgYXQgdGhld3JpdHRlbndvcmQgZG90IGNvbT4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuaDogc3VwcG9ydCBmb3IgQUlYIHBvbGwgaW1wbGVtZW50YXRpb24gKEZETyBCdWcgCisJIzExNjY2KQorCisyMDA4LTAxLTE1ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiB0ZXN0cy9uYW1lLXRlc3QvcnVuLXRlc3Quc2g6IG1ha2UgbW9yZSBwb3J0YWJsZSAoRkRPIEJ1ZyAjMTE2NjcpCisKKzIwMDgtMDEtMTUgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIHBhdGNoIGJ5IEtpbW1vIEjDpG3DpGzDpGluZW4gPGtpbW1vIGRvdCBoYW1hbGFpbmVuIGF0IG5va2lhIGRvdCBjb20+CisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMgKF9kYnVzX2Nvbm5lY3Rpb25fZ2V0X25leHRfY2xpZW50X3NlcmlhbCk6CisJZG9uJ3QgY2hlY2sgZm9yIDwgMCBvbiBhbiB1bnNpZ25lZCB2YXJpYWJsZSAoRkRPIEJ1ZyAjMTI5MjQpCisKKzIwMDgtMDEtMTUgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisJCisJKiBwYXRjaCBieSBLaW1tbyBIw6Rtw6Rsw6RpbmVuIDxraW1tbyBkb3QgaGFtYWxhaW5lbiBhdCBub2tpYSBkb3QgY29tPgorCisJKiBidXMvYnVzLmMgKHNldHVwX3NlcnZlcik6IGNoZWNrIGZhaWxlZCBhbGxvY2F0aW9uIChGRE8gQnVnICMxMjkyMCkKKwkKKzIwMDgtMDEtMTUgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisJCisJKiBwYXRjaCBieSBLaW1tbyBIw6Rtw6Rsw6RpbmVuIDxraW1tbyBkb3QgaGFtYWxhaW5lbiBhdCBub2tpYSBkb3QgY29tPgorCisJKiBkYnVzL2RidXMtc3Bhd24uYyAoX2RidXNfc3Bhd25fYXN5bmNfd2l0aF9iYWJ5c2l0dGVyKTogdGhlIEFQSSAKKwljb250cmFjdCBzYXlzIHNpdHRlcl9wIGNhbiBiZSBOVUxMLCBzbyBsZXQncyBjaGVjayBpdCAoRkRPIEJ1ZyAjMTI5MTkpCisKKzIwMDgtMDEtMTUgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisJCisJKiBwYXRjaCBieSBLaW1tbyBIw6Rtw6Rsw6RpbmVuIDxraW1tbyBkb3QgaGFtYWxhaW5lbiBhdCBub2tpYSBkb3QgY29tPgorCisJKiBkYnVzL2RidXMtc3Bhd24uYyAocmVhZF9pbnRzLCByZWFkX3BpZCk6IHVzZSBjb3JyZWN0IHNzaXplX3QgdHlwZQorCWluc3RlYWQgb2Ygc2l6ZV90IChGRE8gQnVnICMxMjg2MikKKworMjAwOC0wMS0xNSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKwkKKwkqIHBhdGNoIGJ5IEtpbW1vIEjDpG3DpGzDpGluZW4gPGtpbW1vIGRvdCBoYW1hbGFpbmVuIGF0IG5va2lhIGRvdCBjb20+CisKKwkqIGRidXMvZGJ1cy1lcnJvcnMuYyAoZGJ1c19zZXRfZXJyb3IpOiBtYWtlIHN1cmUgdG8gY2FsbCB2YV9lbmQgaWYgd2UKKwloaXQgYW4gT09NIGVycm9yIGluc2lkZSB2YV9zdGFydCAoRkRPIEJ1ZyAjMTI4NDYpCisKKzIwMDgtMDEtMTUgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisJCisJKiBwYXRjaCBieSBLaW1tbyBIw6Rtw6Rsw6RpbmVuIDxraW1tbyBkb3QgaGFtYWxhaW5lbiBhdCBub2tpYSBkb3QgY29tPgorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jIChkYnVzX2Nvbm5lY3Rpb25fc2VuZF93aXRoX3JlcGx5KTogCisJZml4IHBvc3NpYmxlIGNyYXNoIGlmIHBlbmRpbmdfcmV0dXJuIGlzIE5VTEwgKEZETyBCdWcgIzEyNjczKQorCisyMDA4LTAxLTE1ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBwb3J0aW9ucyBvZiBwYXRjaCBzdWJtaXR0ZWQgYnkgVGltIE1vb25leSAKKwk8ZW5jaGFudGVyIGF0IHVzZXJzIGRvdCBzb3VyY2Vmb3JnZSBkb3QgbmV0PgorCisJKiBjb25maWd1cmUuaW46IG5ldmVyIGF1dG8tc2VsZWN0IGxpYnhtbCAoRkRPIEJ1ZyAjMTI0NzkpCisKKzIwMDgtMDEtMTUgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIHBhdGNoZXMgYnkgS2ltbW8gSMOkbcOkbMOkaW5lbiA8a2ltbW8gZG90IGhhbWFsYWluZW4gYXQgbm9raWEgZG90IGNvbT4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMtdW5peCAoX2RidXNfZ2V0X2F1dG9sYXVuY2hfYWRkcmVzcyk6IGhhbmRsZSBPT00KKwkoRkRPIEJ1ZyAjMTI5NDUpCisKKwkqIGRidXMvZGJ1cy11dWlkZ2VuLmMgKHJldHVybl91dWlkKTogaGFuZGxlIE9PTSAoRkRPIEJ1ZyAjMTI5MjgpCisKKwkqIGRidXMvZGJ1cy1taXNjLmMgKGRidXNfZ2V0X2xvY2FsX21hY2hpbmVfaWQpOiBoYW5kbGUgT09NLCBmaXggcmV0dXJuCisJdmFsdWUgdG8gcmV0dXJuIE5VTEwgbm90IEZBTFNFIChGRE8gQnVnICMxMjk0NikKKworMjAwOC0wMS0xNSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogYnVzL2J1cy5jIChidXNfY29udGV4dF9jaGVja19zZWN1cml0eV9wb2xpY3kpOiByZXdyaXRlIHNlbGludXggZXJyb3IKKwloYW5kbGluZyB0byBub3QgYWJvcnQgZHVlIHRvIGEgTlVMTCByZWFkIGFuZCB0byBzZXQgdGhlIGVycm9yIG9ubHkgaWYKKwlpdCBpcyBub3QgYWxyZWFkeSBzZXQgKEJhc2VkIG9mZiBvZiBGRE8gQnVnICMxMjQzMCkKKworMjAwOC0wMS0xNSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogcGF0Y2ggYnkgS2ltbW8gSMOkbcOkbMOkaW5lbiA8a2ltbW8gZG90IGhhbWFsYWluZW4gYXQgbm9raWEgZG90IGNvbT4KKworCSogZGJ1cy9kYnVzLWludGVybmFscy5jIChfZGJ1c19yZWFkX3V1aWRfZmlsZV93aXRob3V0X2NyZWF0aW5nLAorCV9kYnVzX2NyZWF0ZV91dWlkX2ZpbGVfZXhjbHVzaXZlbHkpOiBhZGQgT09NIGhhbmRsaW5nIChGRE8gQnVnICMxMjk1MikKKworMjAwOC0wMS0xNSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogcGF0Y2ggYnkgS2ltbW8gSMOkbcOkbMOkaW5lbiA8a2ltbW8gZG90IGhhbWFsYWluZW4gYXQgbm9raWEgZG90IGNvbT4KKworCSogZGJ1cy9kYnVzLXNwYXduLmMgKGJhYnlzaXQsIGJhYnlzaXR0ZXJfaXRlcmF0aW9uKTogYWRkIGVycm9yCisJaGFuZGxpbmcgd2hlbiBwb2xsaW5nIChGRE8gQnVnICMxMjk1NCkgCisKKzIwMDgtMDEtMTUgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIHBhdGNoIGJ5IEtpbW1vIEjDpG3DpGzDpGluZW4gPGtpbW1vIGRvdCBoYW1hbGFpbmVuIGF0IG5va2lhIGRvdCBjb20+CisKKwkqIGJ1cy9jb25maWctcGFyc2VyLmMgKGxvY2F0ZV9hdHRyaWJ1dGVzKTogcmVtb3ZlIGRlYWQgY29kZSB3aGljaAorCWFsd2F5cyBldmFsdWF0ZWQgdG8gVFJVRQorCisJKiBkYnVzL2RidXMtc2hlbGwuYyAoX2RidXNfc2hlbGxfcXVvdGUpOiByZW1vdmUgdW51c2VkIGNvZGUKKworMjAwOC0wMS0xNCAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogcGF0Y2ggYnkgS2ltbW8gSMOkbcOkbMOkaW5lbiA8a2ltbW8gZG90IGhhbWFsYWluZW4gYXQgbm9raWEgZG90IGNvbT4KKworCSogYnVzL2Nvbm5lY3Rpb24uYyAoYnVzX2Nvbm5lY3Rpb25fY29tcGxldGUpOiBwbHVnIGEgcG9zc2libGUgCisJQnVzQ2xpZW50UG9saWN5IGxlYWsgKEZETyBCdWcgIzEzMjQyKQorCisyMDA4LTAxLTE0ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBwYXRjaCBieSBGcmVkZXJpYyBDcm96YXQgPGZjcm96YXQgYXQgbWFuZHJpdmEgZG90IGNvbT4gKEZETyBCeiMKKwkxMzI2OCkKKworCSogYWRkIGlub3RpZnkgc3VwcG9ydAorCisJKiBidXMvTWFrZWZpbGUuYW06IGFkZCBpbm90aWZ5IG1vZHVsZSB0byB0aGUgYnVpbGQKKworCSogYnVzL2Rpci13YXRjaC1pbm90aWZ5LmM6IGlub3RpZnkgbW9kdWxlIGJhc2VkIG9mZiB0aGUgZG5vdGlmeSBhbmQKKwlrcXVldWUgbW9kdWxlcworCisJKiBjb25maWd1cmUuaW46IGFkZCBjaGVja3MgYW5kIHN3aXRjaCBmb3IgaW5vdGlmeQorCWFsc28gYWRkIGEgcHJpbnRvdXQgYXQgdGhlIGVuZCBvZiBjb25maWd1cmUgaWYgaW5vdGlmeSBhbmQga3F1ZXVlCisJc3VwcG9ydCBpcyBiZWluZyBidWlsdCBpbiAoZG5vdGlmeSBhbHJlYWR5IGhhZCB0aGlzKQorCisyMDA4LTAxLTE0ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBwYXRjaCBieSBGcmVkZXJpYyBDcm96YXQgPGZjcm96YXQgYXQgbWFuZHJpdmEgZG90IGNvbT4KKworCSogYnVzL2Rpci13YXRjaC1kbm90aWZ5LmMgKGJ1c193YXRjaF9kaXJlY3RvcnkpOiB3YXRjaCBmb3IgZmlsZQorCWNyZWF0ZXMgYWxzbworCisyMDA4LTAxLTE0ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBwYXRjaCBieSBLaW1tbyBIw6Rtw6Rsw6RpbmVuIDxraW1tbyBkb3QgaGFtYWxhaW5lbiBhdCBub2tpYSBkb3QgY29tPgorCisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LXNvY2tldC5jKGRvX3JlYWRpbmcpOiByZXR1cm4gbWVzc2FnZSAKKwlsb2FkZXIgYnVmZmVyIGluIGNhc2Ugb2YgT09NIChGRE8gQnVnIzEyNjY2KQorCisyMDA4LTAxLTE0ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBjb25maWd1cmUuaW46IGFkZCB3YXJuaW5nIHRvIG91dHB1dCB3aGVuIGxpYnhtbCBpcyBzZWxlY3RlZCBzaW5jZQorCXdlIGRvbid0IGhhdmUgYSBsaWJ4bWwgbWFpbnRhaW5lciBhbmQgZXhwYXQgd29ya3MgcGVyZmVjdGx5IGZpbmUKKwlmb3Igd2hhdCB3ZSBuZWVkIGFuIHhtbCBwYXJzZXIgZm9yCisKKzIwMDgtMDEtMTQgIEpvaG4gKEo1KSBQYWxtaWVyaSAgPGpvaG5wQHJlZGhhdC5jb20+CisKKwkqIFBhdGNoIGJ5IEFuZHJlYSBMdXp6YXJkaSAgPHNjb3ggYXQgc2lnMTEgZG90IG9yZz46IGNyZWF0ZXMgYQorCV9kYnVzX2dldGV1aWQgZnVuY3Rpb24gdG8gZml4IEVYVEVSTkFMIGF1dGhlbnRpY2F0aW9uIGluIHNldHVpZAorCWFwcGxpY2F0aW9ucworCisJKiAgZGJ1cy9kYnVzLXN5c2RlcHMtdW5peC5jIChfZGJ1c19nZXRldWlkKTogdXNlZCB0byBnZXQgdGhlIGVmZmVjdGl2ZQorCXVpZCBvZiB0aGUgcnVubmluZyBwcm9ncmFtCisJKF9kYnVzX2NyZWRlbnRpYWxzX2FkZF9mcm9tX2N1cnJlbnRfcHJvY2Vzcyk6IHVzZSBnZXRldWlkIGluc3RlYWQgb2YKKwlnZXR1aWQKKwkoX2RidXNfYXBwZW5kX3VzZXJfZnJvbV9jdXJyZW50X3Byb2Nlc3MpOiB1c2UgZ2V0ZXVpZCBpbnN0ZWFkIG9mCisJZ2V0dWlkCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLXV0aWwtdW5peC5jIChfZGJ1c19jaGFuZ2VfdG9fZGFlbW9uX3VzZXIpOiB1c2UKKwlnZXRldWlkIGluc3RlYWQgb2YgZ2V0dWlkCisJKF9kYnVzX3VuaXhfdXNlcl9pc19hdF9jb25zb2xlKTogdXNlIGdldGV1aWQgaW5zdGVhZCBvZiBnZXR1aWQKKworCSogZGJ1cy9kYnVzLXN5c2RlcHMtd2luLmMgKF9kYnVzX2dldGV1aWQpOiBhZGQgYSB3aW5kb3dzIGVxdWl2aWxhbnQKKwl0aGF0IHJldHVybnMgREJVU19VSURfVU5TRVQKKworMjAwNy0xMi0xOCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMgKF9kYnVzX2Nvbm5lY3Rpb25fYmxvY2tfcGVuZGluZ19jYWxsKToKKwlmaXggbG9jYXRpb24gb2YgY3VybHkgYnJhY2VzCisKKzIwMDctMTEtMjMgIFNqb2VyZCBTaW1vbnMgIDxzam9lcmRAbHVvbi5uZXQ+CisKKwkqIHRvb2xzL2RidXMtbGF1bmNoLmM6IGxldCBib3RoIGEgbm9ybWFsIGRidXMtbGF1bmNoIGFuZCBhbgorCWF1dG9sYXVuY2hlZCBidXMgc2F2ZSB0aGVpciBwYXJhbWV0ZXJzIGluIFgxMSBpZiBwb3NzaWJsZS4gVGhpcyBtYWtlcworCXRoZSBhdXRvbGF1bmNoIGFuZCBub24tYXV0b2xhdW5jaCBiZWhhdmlvdXIgbW9yZSBzaW1pbGFyLiBXaXRoIHRoZQorCWV4Y2VwdGlvbiB0aGF0IG9uIGEgbm9ybWFsIGxhdW5jaCB0aGVyZSB3aWxsIGFsd2F5cyBiZSBhIG5ldyBzZXNzaW9uCisJYnVzIGFuZCBub3QgYmVpbmcgYWJsZSB0byBzYXZlIHBhcmFtZXRlcnMgaXMgbm90IGZhdGFsLiBUaGlzIGFsc28KKwllbmFibGVzIHRvIGxhdW5jaCBwcm9ncmFtcyBkaXJlY3RseSB3aXRoIGF1dG9sYXVuY2ggKG5vdCB2ZXJ5IHVzZWZ1bGwKKwl0aG91Z2gpLgorCisyMDA3LTEwLTMxICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogYnVzL3NlbGludXguYyAobG9nX2F1ZGl0X2NhbGxiYWNrKTogcmV3cml0ZSB0byB1c2UKKwlfZGJ1c19zdHJpbmdfY29weV90b19idWZmZXJfd2l0aF9udWwoKQorCisJKiBkYnVzL2RidXMtc3RyaW5nLmMgKF9kYnVzX3N0cmluZ19jb3B5X3RvX2J1ZmZlcik6IGNoYW5nZSB0byBOT1QKKwludWwtdGVybWluYXRlIHRoZSBidWZmZXI7IGZhaWwgYW4gYXNzZXJ0aW9uIGlmIHRoZXJlIGlzIG5vdCBlbm91Z2gKKwlzcGFjZSBpbiB0aGUgdGFyZ2V0IGJ1ZmZlci4gVGhpcyBmaXhlcyB0d28gYnVncyB3aGVyZQorCWNvcHlfdG9fYnVmZmVyIHdhcyB1c2VkIHRvIGNvcHkgdGhlIGJpbmFyeSBieXRlcyBpbiBhIFVVSUQsIHdoZXJlCisJbnVsIHRlcm1pbmF0aW9uIGRpZCBub3QgbWFrZSBzZW5zZS4gQnVnIHJlcG9ydGVkIGJ5IERhdmlkIENhc3RlbG93LgorCShfZGJ1c19zdHJpbmdfY29weV90b19idWZmZXJfd2l0aF9udWwpOiBuZXcgZnVuY3Rpb24gdGhhdCBhbHdheXMKKwludWwtdGVybWluYXRlcyB0aGUgYnVmZmVyLCBhbmQgZmFpbHMgYW4gYXNzZXJ0aW9uIGlmIHRoZXJlIGlzIG5vdCAKKwllbm91Z2ggc3BhY2UgaW4gdGhlIGJ1ZmZlci4KKworMjAwNy0xMC0yMyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGJ1cy9idXMuYyAoYnVzX2NvbnRleHRfbmV3KTogdXNlIHRoZSBuZXcgbmFtZSBoZXJlCisKKwkqIGJ1cy9zZWxpbnV4LmMgKGJ1c19zZWxpbnV4X2F1ZGl0X2luaXQpOiByZW5hbWUgZnJvbSBhdWRpdF9pbml0KCkKKwl0byBhdm9pZCBwb3NzaWJsZSBsaWJjIGNvbmZsaWN0LCBhbmQgZGVjbGFyZSBpdCBpbiAuaCBmaWxlIHRvCisJYXZvaWQgYSB3YXJuaW5nCisKKzIwMDctMTAtMTkgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgkKKwkKKwkqIGJ1cy9idXMuYyAoYnVzX2NvbnRleHRfbmV3KTogcHV0IGF1ZGl0X2luaXQoKSBpbiBIQVZFX1NFTElOVVgKKwkKKzIwMDctMTAtMTkgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgkKKworCSogYnVzL2J1cy5jIChidXNfY29udGV4dF9uZXcpOiBwdXQgdGhlIGF1ZGl0X2luaXQoKSBpbiBoZXJlCisJaW5zdGVhZCwgd2hpY2ggSSBiZWxpZXZlIGVuZHMgdXAgYmVpbmcgdGhlIHNhbWUgYXMgd2hlcmUgaXQgd2FzCisJYmVmb3JlLCB0aG91Z2ggSSdtIG5vdCBzdXJlIEkgdW5kZXJzdGFuZCB3aHkgaXQgZ29lcyBoZXJlLgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy11dGlsLXVuaXguYyAoX2RidXNfY2hhbmdlX3RvX2RhZW1vbl91c2VyKToKKwlyZW1vdmUgYXVkaXRfaW5pdCgpIGZyb20gaGVyZSwgdGhpcyBmaWxlIGNhbid0IGRlcGVuZCBvbiBjb2RlIGluCisJYnVzLyBkaXJlY3RvcnkKKworMjAwNy0xMC0xNiAgU2ltb24gTWNWaXR0aWUgIDxzaW1vbi5tY3ZpdHRpZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5pbjogKkFjdHVhbGx5KiBmaXggZGV0ZWN0aW9uIG9mIGk0ODYgYXRvbWljIG9wcyAtCisJbXkgcHJldmlvdXMgYXR0ZW1wdCBhdCBhIGZpeCB3b3VsZCBhbHdheXMgZW5hYmxlIHRoZW0gZHVlIHRvIHdyb25nCisJcXVvdGluZy4gUGF0Y2ggZnJvbSBDb2xpbiBXYWx0ZXJzIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKzIwMDctMTAtMTEgIFNpbW9uIE1jVml0dGllICA8c2ltb24ubWN2aXR0aWVAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuaW46IGVuYWJsZSBBdXRvY29uZidzIEFDX0NfSU5MSU5FIHRvIGF2b2lkIGNvbXBpbGF0aW9uCisJZmFpbHVyZSB3aXRoIGdjYyAtYW5zaQorCSogZGJ1cy9kYnVzLW1hY3Jvcy5oLCBkYnVzL2RidXMtYXJjaC1kZXBzLmguaW46IFVzZSBuZXcgbWFjcm8KKwlfREJVU19HTlVDX0VYVEVOU0lPTiAodGhlIHNhbWUgYXMgR19HTlVDX0VYVEVOU0lPTikgdG8gYXZvaWQgLWFuc2kKKwl3YXJuaW5ncyBhYm91dCB1c2Ugb2YgImxvbmcgbG9uZyIuCisJKiBkYnVzL2RidXMtc2VydmVyLXNvY2tldC5jOiByZW1vdmUgdW51c2VkIHZhcmlhYmxlIHdoZW4gYXNzZXJ0aW9ucworCWFyZSBkaXNhYmxlZAorCSogZGJ1cy9kYnVzLW1hcnNoYWwtdmFsaWRhdGUuYzogYXZvaWQgZW1wdHkgc3RhdGVtZW50cyBieSByZW1vdmluZworCXN0cmF5IHNlbWljb2xvbnMKKwkqIHRvb2xzL2RidXMtbGF1bmNoLmM6IGNvbnZlcnQgQysrLXN0eWxlIGNvbW1lbnQgdG8gQy1zdHlsZSwgYWRkIHt9CisJZm9yIGNsYXJpdHkKKwkqIC5naXRpZ25vcmU6IGlnbm9yZSB2aSBzd2FwZmlsZXMKKwkqIGRidXMvZGJ1cy1lcnJvcnMuaCwgZGJ1cy9kYnVzLWVycm9ycy5jOiBBZGQgREJVU19FUlJPUl9JTklUIG1hY3JvLAorCWVxdWl2YWxlbnQgdG8gY2FsbGluZyBkYnVzX2Vycm9yX2luaXQoKSBvbiBhbiB1bmluaXRpYWxpemVkIERCdXNFcnJvcgorCSogZGJ1cy9kYnVzLWFkZHJlc3MuYywgZGJ1cy9kYnVzLWF1dGgtc2NyaXB0LmMsIGRidXMvZGJ1cy1hdXRoLXV0aWwuYywKKwlkYnVzL2RidXMtY29ubmVjdGlvbi5jLCBkYnVzL2RidXMtaW50ZXJuYWxzLmMsIGRidXMvZGJ1cy1rZXlyaW5nLmMsCisJZGJ1cy9kYnVzLW1lc3NhZ2UtdXRpbC5jLCBkYnVzL2RidXMtc2VydmVyLmMsIGRidXMvZGJ1cy1zaGEuYywKKwlkYnVzL2RidXMtc3Bhd24td2luLmMsIGRidXMvZGJ1cy1zcGF3bi5jLAorCWRidXMvZGJ1cy1zeXNkZXBzLXV0aWwtd2luLmMsIGRidXMvZGJ1cy10cmFuc3BvcnQtc29ja2V0LmMsCisJZGJ1cy9kYnVzLXRyYW5zcG9ydC5jLCBkYnVzL2RidXMtdXNlcmRiLmM6IHVzZSB0aGF0IG1hY3JvIGluc3RlYWQgb2YKKwljYWxsaW5nIGRidXNfZXJyb3JfaW5pdCgpIHdoZXJlIGl0J3MgY2xlYXJseSBlcXVpdmFsZW50CisJKiBjb25maWd1cmUuaW4sIGRidXMvZGJ1cy1zeXNkZXBzLmgsIGRidXMvZGJ1cy1zeXNkZXBzLXVuaXguYzogRml4CisJZGV0ZWN0aW9uIG9mIGk0ODYgYXRvbWljIG9wcy4gUHJldmlvdXNseSwgdGhlIGF0dGVtcHRzIHRvIGRldGVybWluZQorCXN1cHBvcnQgYXQgY29tcGlsZS10aW1lIG9uIERhcndpbiB3ZXJlIGNhdXNpbmcgdGhlIGk0ODYgYXRvbWljIG9wcyB0bworCWJlIHVzZWQgb24gKmFsbCogaTM4NiBvciB4ODYtNjQgR0NDIGJ1aWxkcyAoQUhfVkVSQkFUSU0gY2FuJ3QgYmUKKwljb25kaXRpb25hbGl6ZWQgbGlrZSB3ZSB3ZXJlIHRyeWluZyB0bykuCisKKzIwMDctMTAtMTAgIFNpbW9uIE1jVml0dGllICA8c2ltb24ubWN2aXR0aWVAY29sbGFib3JhLmNvLnVrPgorCisJKiBkYnVzL2RidXMtZXJyb3JzLmMsIGRidXMvZGJ1cy1wcm90b2NvbC5oOiBBZGQgbmV3IGVycm9yCisJb3JnLmZyZWVkZXNrdG9wLkRCdXMuRXJyb3IuT2JqZWN0UGF0aEluVXNlCisJKiBkYnVzL2RidXMtb2JqZWN0LXRyZWUuaCwgZGJ1cy9kYnVzLW9iamVjdC10cmVlLmMsCisJZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYywgZGJ1cy9kYnVzLWNvbm5lY3Rpb24uaDogYWRkIG5ldyBmdW5jdGlvbnMKKwlkYnVzX2Nvbm5lY3Rpb25fdHJ5X3JlZ2lzdGVyX29iamVjdF9wYXRoIGFuZAorCWRidXNfY29ubmVjdGlvbl90cnlfcmVnaXN0ZXJfZmFsbGJhY2ssIHdoaWNoIHJhaXNlIE9iamVjdFBhdGhJblVzZQorCXJhdGhlciB0aGFuIGFzc2VydGluZywgdG8gbWFrZSBvYmplY3QgcGF0aCByZWdpc3RyYXRpb24gbGVzcyBwYWluZnVsCisJZm9yIGJpbmRpbmdzCisJKiAuZ2l0aWdub3JlOiBhZGQgdmFyaW91cyB0aGluZ3MgdGhhdCB3ZXJlbid0IGluIC5jdnNpZ25vcmUgYmVjYXVzZQorCUNWUyBpbXBsaWNpdGx5IGlnbm9yZWQgdGhlbTsgZ2VuZXJhbGx5IGJyaW5nIHVwIHRvIGRhdGUKKworMjAwNy0xMC0wOSAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogdG9vbHMvcnVuLXdpdGgtdG1wLXNlc3Npb24tYnVzLnNoOiBGaXggZW52IGV4cG9ydHMgZm9yIGJldHRlcgorCXBvcnRhYmlsaXR5ICgjOTI4MCkKKwkqIHRvb2xzL2RidXMtc2VuZC4xOiBEb2N1bWVudCBzeW50YXggZm9yIGNvbnRhaW5lciB0eXBlcyBpbiBkYnVzLXNlbmQKKwltYW4gZmlsZSAoIzk1NTMpIC0gcGF0Y2ggZnJvbSBKYWNrIFNwYWFyIDxqc3BhYXIgYXQKKwl1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwlbQm90aCBPSyBmb3IgTUlUL1gxMSByZWxpY2Vuc2luZyAtc21jdl0KKworMjAwNy0xMC0wOSAgU2ltb24gTWNWaXR0aWUgIDxzaW1vbi5tY3ZpdHRpZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGRvYy9kYnVzLXNwZWNpZmljYXRpb24ueG1sOiBTcGVjaWZpY2FsbHkgZm9yYmlkIGVtcHR5IHN0cnVjdHMgKCM3OTY5KQorCSogZG9jL2RidXMtc3BlY2lmaWNhdGlvbi54bWw6IFBhdGNoZXMgZnJvbSBLcmlzdG9mZmVyIEx1bmTDqW4gdG8gY2xhcmlmeQorCWRlc2NyaXB0aW9uIG9mIERCVVNfQ09PS0lFX1NIQTEgKCMxMDE4NCkgYW5kIGFsbG93YWJsZSBjb250ZW50cyBvZiBhCisJdmFyaWFudCAoIzEwMTg1LCBhbWVuZGVkIGFzIHBlciBIYXZvYydzIGNvbW1lbnRzKQorCisJW0FsbCBvZiB0aGUgYWJvdmUgYXJlIE9LIGZvciBNSVQvWDExIGxpY2Vuc2luZ10KKworMjAwNy0xMC0wMyAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLWludGVybmFscy5oOiBmZC5vIGJ1ZyAjMTE2NzggRG9uJ3QgZXJyb3Igb3V0IGlmIGNvbXBpbGVyCisJZG9lcyBub3Qgc3VwcG9ydCB2YXJhcmcgbWFjcm9zLiBfZGJ1c192ZXJib3NlIGlzIHRoZSBvbmx5IGZ1bmN0aW9uCisJdGhhdCBkb2VzIHRoaXMgc28gbWFrZSBpdCBhIG5vb3AgaWYgdmFyYXJnIG1hY3JvcyBhcmUgbm90IHN1cHBvcnRlZAorCSogYnVzL3NlbGludXguYywgZGJ1cy9kYnVzLXN5c2RlcHMtdXRpbC11bml4LmM6IGZkLm8gYnVnICMxMjQyOQorCVJldmVyc2UgY2hlY2sgdG8gc2V0cGNhcCBhbmQgb25seSBpbml0IGF1ZGl0IGlmIHdlIHdlcmUgcm9vdAorCShwYXRjaCBieSBEYW4gV2Fsc2ggPGR3YWxzaEByZWRoYXQuY29tPiwKKwlodHRwczovL2J1Z3MuZnJlZWRlc2t0b3Aub3JnL3Nob3dfYnVnLmNnaT9pZD0xMjQyOSkuIFJldmVyc2UKKwl3ZV93ZXJlX3Jvb3QgY2hlY2sgdG8gc2V0cGNhcCBpZiB3ZSB3ZXJlIHJvb3QuICBBbHNvIG9ubHkgaW5pdCBhdWRpdAorCWlmIHdlIHdlcmUgcm9vdC4gIFNvIGVycm9yIGRidXMgbWVzc2FnZSB3aWxsIG5vdCBzaG93IHVwIHdoZW4gcG9saWN5CisJcmVsb2FkIGhhcHBlbnMuICBkYnVzIC1zZXNzaW9uIHdpbGwgbm8gbG9uZ2VyIHRyeSB0byBzZW5kIGF1ZGl0CisJbWVzc2FnZSwgb25seSBzeXN0ZW0gd2lsbC4KKwkqIGNvbmZpZ3VyZS5pbjogZmQubyBidWcgIzExODcyIGltcHJvdmUgbGlua2VyIHRlc3QgZm9yIC0tZ2Mtc2VjdGlvbnMuCisJUGF0Y2ggYnkgVGltIE1vb25leSA8ZW5jaGFudGVyIGF0IHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKwkqIGNvbmZpZ3VyZS5pbiwgZGJ1cy9kYnVzLXN5c2RlcHMuYzogZmQubyBidWcgIzExODcyIGZpeCBjbGVhcmVudiBmb3IKKwlzeXN0ZW1zIHRoYXQgZG8gbm90IGhhdmUgaXQuIFBhdGNoIGZyb20gQnJpYW4gQ2FtZXJvbiA8YnJpYW4uY2FtZXJvbgorCWF0IHN1bi5jb20+CisJKiB0b29scy9kYnVzLWxhdW5jaC5jOiBmZC5vIGJ1ZyAjMTI1NDcgcmVtb3ZlIHN1cGVyZmx1b3VzIGlmLgorCUFsc28gY29udmVydCB0YWJzIHRvIHNwYWNlcworCSogY29uZmlndXJlLmluLCBidXMvTWFrZWZpbGUuYW0sIGRidXMvTWFrZWZpbGUuYW06IENvcnJlY3RseSBpbXBsZW1lbnQKKwktZlBJQyBhbmQgLWZQSUUuIEZvciBzZWN1cml0eSByZWFzb25zIHdlIHdhbnQgcG9zc2l0aW9uIGluZGVwZW5kZW50CisJY29kZSBmb3IgbGlicmFyaWVzIGFuZCBwb3NzaXRpb24gaW5kZXBlbmRlbnQgZXhlY3V0YWJsZSBmb3IKKwlleGVjdXRhYmxlcy4gQmVmb3JlIHdlIHdlcmUganVzdCBlbmFibGluZyAtZlBJQy4gTm93IHdlIGNvcnJlY3RseQorCWVuYWJsZSAtZlBJQyBhbmQgLVBJRSBmb3IgbGliZGJ1cyBhbmQgdGhlIGJ1cyByZXNwZWN0aXZlbHkuIFByb3BlcgorCUxEX0ZMQUdTIGFyZSBzZXQgZm9yIGVhY2ggYWxzby4KKworMjAwNy0wOS0yMCAgUnlhbiBMb3J0aWUgIDxkZXNydEBkZXNydC5jYT4KKworCUFkZCBhcmd1bWVudCBwYXRoIG1hdGNoaW5nIHN1cHBvcnQuICBCdWcgIzExMDY2LgorCisJKiBkYnVzL3NpZ25hbHMuYyAoc3RydWN0IERCdXNNYXRjaFJ1bGUsIGJ1c19tYXRjaF9ydWxlX25ldywKKwlidXNfbWF0Y2hfcnVsZV9zZXRfYXJnLCBidXNfbWF0Y2hfcnVsZV9wYXJzZV9hcmdfbWF0Y2gsCisJbWF0Y2hfcnVsZV9tYXRjaGVzKTogQWRkIHN1cHBvcnQgZm9yIHBhcnNpbmcgYW5kIG1hdGNoaW5nIG9uCisJYXJnMHBhdGg9Jy9zb21lL3BhdGgnIHR5cGUgcnVsZXMuCisKKwkqIGRidXMvc2lnbmFscy5oIChidXNfbWF0Y2hfcnVsZV9zZXRfYXJnKTogY2hhbmdlIHRvIHRha2UgY29uc3QKKwlEQnVzU3RyaW5nIGluc3RlYWQgb2YgY29uc3QgY2hhciAqIGZvciB0aGUgc3RyaW5nIHRvIG1hdGNoIGFnYWluc3QuCisKKwkqIGRidXMvZGJ1cy1idXMuYzogYWRkIGEgcXVpY2sgbm90ZSB0byBkYnVzX2J1c19hZGRfbWF0Y2gKKwlkb2N1bWVudGF0aW9uIGFib3V0IHRoZSBwYXRoIG1hdGNoaW5nLgorCisJKiBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnhtbDogYWRkIGEgbW9yZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGUKKwljaGFuZ2VzIGhlcmUuCisKKzIwMDctMDktMTkgIFJ5YW4gTG9ydGllICA8ZGVzcnRAZGVzcnQuY2E+CisKKwlBZGQgc3VwcG9ydCBmb3IgY29tcGFjdGluZyBEQnVzU3RyaW5ncyB0byByZWxlYXNlIHdhc3RlZCBtZW1vcnkuCisKKwkqIGRidXMvZGJ1cy1zdHJpbmcuW2NoXSAoY29tcGFjdCwgX2RidXNfc3RyaW5nX2NvbXBhY3QsCisJX2RidXNfc3RyaW5nX2xvY2spOiBuZXcgY29tcGFjdCBmdW5jdGlvbiB0byBmcmVlIHVwIGFsbG9jYXRlZCBtZW1vcnkKKwl0aGF0IGlzIG5vIGxvbmdlciB1c2VkLgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jIChsb2FkX21lc3NhZ2UpOiBjYWxsIF9kYnVzX3N0cmluZ19jb21wYWN0IG9uIHRoZQorCW1lc3NhZ2UgbG9hZGVyIGJ1ZmZlci4KKworCSogZGJ1cy9kYnVzLXRyYW5zcG9ydC1zb2NrZXQuYyAoZG9fcmVhZGluZywgZG9fd3JpdGluZyk6IGNhbGwKKwlfZGJ1c19zdHJpbmdfY29tcGFjdCBvbiB0aGUgaW5jb21pbmcvb3V0Z29pbmcgImVuY29kZWQiIGJ1ZmZlcnMuCisKKwkqIGRidXMvZGJ1cy1zdHJpbmctdXRpbC5jIChfZGJ1c19zdHJpbmdfdGVzdCk6IGFkZCBhIGZldyB0ZXN0cyBmb3IKKwlzdHJpbmcgY29tcGFjdGluZy4KKworMjAwNy0wOS0xMyAgUnlhbiBMb3J0aWUgIDxkZXNydEBkZXNydC5jYT4KKworCSogSEFDS0lORzogYWRkIG1vcmUgZXhwbGljaXQgZ2l0IGJyYW5jaC90YWcgaW5zdHJ1Y3Rpb25zCisKKzIwMDctMDktMTMgIFJ5YW4gTG9ydGllICA8ZGVzcnRAZGVzcnQuY2E+CisKKwltaWdyYXRlIGZyb20gY3ZzIHRvIGdpdCAoY3ZzMnN2biAtPiBnaXQtc3ZuaW1wb3J0KS4KKworCSogSEFDS0lORzogdXBkYXRlIHJlbGVhc2UvYnJhbmNoL3RhZyBpbnN0cnVjdGlvbnMKKwkqICovLmN2c2lnbm9yZTogcmVuYW1lIHRvIC5naXRpZ25vcmUKKworCWFsc28sIGNsZWFuIHVwIHRhZ3MgYW5kIGJyYW5jaCBuYW1lcyB0byBjb25mb3JtIHRvIEhBQ0tJTkcKKworMjAwNy0wOC0xNyAgV2lsbGlhbSBKb24gTWNDYW5uICA8bWNjYW5uQGpodS5lZHU+CisKKwkqIHVwZGF0ZS1kYnVzLWRvY3Muc2g6IHVwbG9hZCBEVEQgdG8gc2VydmVyCisKKzIwMDctMDgtMTcgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiB0b29scy9kYnVzLWxhdW5jaC14MTEuYyAoc2V0X2FkZHJlc3NfaW5feDExKTogZml4IGZyb20gTWljaGFlbAorCUxvcmVueiB0byB1c2UgbG9uZyBub3QgaW50IHdpdGggWENoYW5nZVByb3BlcnR5IGZvcm1hdCAzMgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy11dGlsLXVuaXguYworCShfZGJ1c193cml0ZV9waWRfdG9fZmlsZV9hbmRfcGlwZSk6IGZhY3RvciB0aGlzIG91dCwgYW5kIHVzZSB0aGUKKwlzYW1lIGNvZGUgaW4gX2RidXNfYmVjb21lX2RhZW1vbiAod2hlcmUgdGhlIHBhcmVudCB3cml0ZXMgdGhlIHBpZAorCWZpbGUgYW5kIHRvIHRoZSBwaWQgcGlwZSkgYW5kIGluIGJ1c19jb250ZXh0X25ldyAod2hlcmUgdGhlIGRhZW1vbgorCXdyaXRlcyBpdHMgb3duIHBpZCBmaWxlIGFuZCB0byBpdHMgb3duIHBpZCBwaXBlKQorCisJKiBidXMvYnVzLmMgKGJ1c19jb250ZXh0X25ldyk6IGNsb3NlIHRoZSBwaWQgcGlwZSBhZnRlciB3ZSBwcmludAorCXRvIGl0LiBBbHNvLCBkb24ndCB3cml0ZSB0aGUgcGlkIHRvIHRoZSBwaXBlIHR3aWNlIHdoZW4gd2UgZm9yaywKKwlzb21lb25lIHJlcG9ydGVkIHRoaXMgYnVnIGEgbG9uZyB0aW1lIGFnby4KKworMjAwNy0wOC0wMyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogYWRkIG1ham9yL21pbm9yL21pY3JvIHZlcnNpb24gbnVtYmVyIEFDX1NVQlNUCisKKwkqIGRidXMvZGJ1cy1hcmNoLWRlcHMuaC5pbiAoREJVU19NQUpPUl9WRVJTSU9OLAorCURCVVNfTUlOT1JfVkVSU0lPTiwgREJVU19NSUNST19WRVJTSU9OLCBEQlVTX1ZFUlNJT05fU1RSSU5HLAorCURCVVNfVkVSU0lPTik6IGNvbGxlY3Rpb24gb2YgbWFjcm9zIHRvIGdldCB2ZXJzaW9uIG9mIGxpYnJhcnkgd2UKKwlhcmUgY29tcGlsZWQgYWdhaW5zdC4KKworCSogZGJ1cy9kYnVzLW1pc2MuYyAoZGJ1c19nZXRfdmVyc2lvbik6IG5ldyBmdW5jdGlvbiwgdG8gZ2V0CisJdmVyc2lvbiBvZiBsaWJyYXJ5IHdlIGFyZSBsaW5rZWQgYWdhaW5zdCBhdCBydW50aW1lLgorCisyMDA3LTA3LTMwICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogYnVzL2FjdGl2YXRpb24taGVscGVyLmMgKGNoZWNrX2J1c19uYW1lKTogZG9uJ3QgdXNlCisJX2RidXNfY2hlY2tfdmFsaWRfYnVzX25hbWUoKSB3aGljaCBpcyBvbmx5IGFyb3VuZCB3aXRoCisJLS1lbmFibGUtY2hlY2tzLCBpbnN0ZWFkIHVzZSBfZGJ1c192YWxpZGF0ZV9idXNfbmFtZSgpLgorCUJ1ZyAjMTE3NjYgZnJvbSBEaWVnbyA8ZGllZ29AcGVtYXMubmV0PgorCisyMDA3LTA3LTI3ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogY29uZmlndXJlLmluOiBwb3N0LXJlbGVhc2UgdmVyc2lvbiBidW1wCisKKzIwMDctMDctMjcgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiByZWxlYXNlIDEuMS4yCisKKzIwMDctMDctMjYgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBidXMvY29uZmlnLXBhcnNlci10cml2aWFsLmMgKGNoZWNrX3JldHVybl92YWx1ZXMpOiBkaXNhYmxlIGEKKwl0ZXN0IHRoYXQgaGFyZGNvZGVkIHRoZSBidXMgdXNlcidzIG5hbWUKKworCSogYnVzL2Rpc3BhdGNoLmMgKGJ1c19kaXNwYXRjaF90ZXN0X2NvbmYpOiByZW1vdmUgdGhlICJpZgorCSghdXNlX2xhdW5jaGVyKSIgYXJvdW5kIHRoZSB0ZXN0cywgdGhleSB3ZXJlIG9ubHkgZmFpbGluZyBiZWNhdXNlCisJd2UgZGlkbid0IHBhc3MgdGhyb3VnaCBhbGwgdGhlIGV4cGVjdGVkIGVycm9ycyBmcm9tIHRoZSBoZWxwZXIuCisKKwkqIGJ1cy9hY3RpdmF0aW9uLWV4aXQtY29kZXMuaAorCShCVVNfU1BBV05fRVhJVF9DT0RFX0NISUxEX1NJR05BTEVEKTogYWRkIGEgY29kZSBmb3IgY2hpbGQgc2VnZmF1bHRpbmcKKwkoQlVTX1NQQVdOX0VYSVRfQ09ERV9HRU5FUklDX0ZBSUxVUkUpOiBtYWtlICIxIiBiZSBhIGdlbmVyaWMKKwlmYWlsdXJlIGNvZGUsIHNvIGlmIGEgdGhpcmQgcGFydHkgbGF1bmNoIGhlbHBlciB3ZXJlIHdyaXR0ZW4gaXQKKwljb3VsZCBqdXN0IGFsd2F5cyByZXR1cm4gMSBvbiBmYWlsdXJlLgorCQorMjAwNy0wNy0yNCAgRGFuaWVsIFAuIEJlcnJhbmdlIDxkYW5AYmVycmFuZ2UuY29tPgorCisJKiBidXMvZGJ1cy1kYWVtb24uMTogQWRkIGRvY3Mgb24gbmV3IHN5bnRheCBvcHRpb25zIGZvciB0aGUgYnVzCisJYWRkcmVzcyBzdHJpbmdzCisKKwkqIGRidXMvZGJ1cy1hZGRyZXNzLmM6IEFsbG93ICogaW4gYWRkcmVzc2VzIChmb3IgYmluZGluZyB0byBhbGwKKwlhZGRyZXNzZXMpLgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5oOgorCSogZGJ1cy9kYnVzLXN5c2RlcHMtdW5peC5jOiBSZS13cml0ZSB0byB1c2UgZ2V0YWRkcmluZm8gaW5zdGVhZAorCW9mIGdldGhvc3RieW5hbWUgdG8gZW5hYmxlIHByb3RvY29sIGluZGVwZW5kYW50IG5hbWUgbG9va3VwLAorCW1ha2luZyBJUHY2IHdvcmsKKworCSogZGJ1cy9kYnVzLXNlcnZlci1zb2NrZXQuaDoKKwkqIGRidXMvZGJ1cy1zZXJ2ZXItc29ja2V0LmM6IEFkZCBzdXBwb3J0IGZvciAnZmFtaWx5JyBpbiB0aGUKKwlhZGRyZXNzIHN0cmluZyB0byBzcGVjaWZ5IGlwdjQgdnMgaXB2Ni4gVXNlIGEgcG9ydCBzdHJpbmcgdG8KKwlhbGxvdyBmb3Igc2VydmljZSByZXNvbHV0aW9uLiBBbGxvdyBmb3IgYmluZGluZyB0byBtdWx0aXBsZQorCXNvY2tldHMgYXQgb25jZSBpbiBjYXNlIG9mIGR1YWwgSVB2NCAmIElQdjYgc3RhY2tzLgorCisJKiBkYnVzL2RidXMtc2VydmVyLXVuaXguYzogUGFzcyBpbiBhbiBhcnJheSBvZiBmaWxlIGRlc2NyaXB0b3JzCisJaW5zdGVhZCBvZiBhIHNpbmdsZSBvbmUuCisKKwkqIGRidXMvZGJ1cy10cmFuc3BvcnQtc29ja2V0Lmg6CisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LXNvY2tldC5jOiBBZGQgc3VwcG9ydCBmb3IgJ2ZhbWlseScgaW4gdGhlCisJYWRkcmVzcyBzdHJpbmcgdG8gc3BlY2lmeSBpcHY0IHZzIGlwdjYuIFVzZSBhIHBvcnQgc3RyaW5nIHRvCisJYWxsb3cgZm9yIHNlcnZpY2UgcmVzb2x1dGlvbi4KKworMjAwNy0wNy0yNCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogYWRkIEFNX1BST0dfQ0NfQ19PIHRvIGFsbG93IHBlci10YXJnZXQgQ1BQRkxBR1MKKworCSogYnVzL2Rpc3BhdGNoLmMgKGJ1c19kaXNwYXRjaF90ZXN0X2NvbmYpOiBGaXggdXAgc2V0dGluZworCVRFU1RfTEFVTkNIX0hFTFBFUl9DT05GSUcgdG8gaW5jbHVkZSB0aGUgZnVsbCBwYXRoLCBhbmQgZW5hYmxlCisJdGVzdCBzaGVsbF9mYWlsX3NlcnZpY2VfYXV0b19zdGFydCB3aGVuIHVzZV9sYXVuY2hlcj09VFJVRQorCisJKiBidXMvYWN0aXZhdGlvbi1oZWxwZXItYmluLmMgKGNvbnZlcnRfZXJyb3JfdG9fZXhpdF9jb2RlKTogcGFzcworCXRocm91Z2ggdGhlIElOVkFMSURfQVJHUyBlcnJvciBzbyB0aGUgdGVzdCBzdWl0ZSB3b3JrcworCisJKiBidXMvYWN0aXZhdGlvbi5jIChoYW5kbGVfYWN0aXZhdGlvbl9leGl0X2Vycm9yKTogcmV0dXJuCisJREJVU19FUlJPUl9OT19NRU1PUlkgaWYgd2UgZ2V0IEJVU19TUEFXTl9FWElUX0NPREVfTk9fTUVNT1JZCisKKwkqIGRidXMvZGJ1cy1zcGF3bi5jIChfZGJ1c19iYWJ5c2l0dGVyX2dldF9jaGlsZF9leGl0X3N0YXR1cyk6CisJcmV0dXJuIG9ubHkgdGhlIGV4aXQgY29kZSBvZiB0aGUgY2hpbGQsIG5vdCB0aGUgZW50aXJlIHRoaW5neSBmcm9tIAorCXdhaXRwaWQoKSwgYW5kIG1ha2UgdGhlIHJldHVybiB2YWx1ZSBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBjaGlsZCAKKwlleGl0ZWQgbm9ybWFsbHkgKHdpdGggYSBzdGF0dXMgY29kZSkKKworCSogYnVzL2J1cy5jIChwcm9jZXNzX2NvbmZpZ19maXJzdF90aW1lX29ubHkpOiBfZGJ1c19zdHJkdXAgd29ya3MKKwlvbiBOVUxMIHNvIG5vIG5lZWQgdG8gY2hlY2sKKwkocHJvY2Vzc19jb25maWdfZXZlcnlfdGltZSk6IG1vdmUgc2VydmljZWhlbHBlciBpbml0IGhlcmUsIHNvIHdlCisJcmVsb2FkIGl0IG9uIEhVUCBvciBjb25maWcgZmlsZSBjaGFuZ2UKKworCSogYnVzL01ha2VmaWxlLmFtIChpbnN0YWxsLWRhdGEtaG9vayk6IHJlbW92ZSBjb21tZW50IGJlY2F1c2UKKwlFbWFjcyBtYWtlIG1vZGUgc2VlbXMgdG8gYmUgZ3J1bXB5IGFib3V0IGl0CisKKzIwMDctMDctMjQgIFJpY2hhcmQgSHVnaGVzICA8cmljaGFyZEBodWdoc2llLmNvbT4KKworCSogYnVzL01ha2VmaWxlLmFtOgorCSogYnVzL3Rlc3Qtc3lzdGVtLmM6IChkaWUpLCAoY2hlY2tfbWVtbGVha3MpLCAodGVzdF9wcmVfaG9vayksCisJKHRlc3RfcG9zdF9ob29rKSwgKG1haW4pOgorCUFkZCBiYWNrIHRoZSB0ZXN0LXN5c3RlbS5jIGZpbGUgLSBub3Qgc3VyZSBub3cgdGhpcyBnb3QgaWdub3JlZCBpbiB0aGUKKwlkaWZmLiBJIGJsYW1lIGdpdC4KKworMjAwNy0wNy0yNCAgUmljaGFyZCBIdWdoZXMgIDxyaWNoYXJkQGh1Z2hzaWUuY29tPgorCisJKiBjb25maWd1cmUuaW46CisJVXNlIHVzdGFyIHRvIGdlbmVyYXRlIHRoZSB0YXJiYWxsOyB0aGlzIGZpeGVzIHRoZSBtYWtlIGRpc3RjaGVjaworCXByb2JsZW0gd2hlbiB0aGUgZGF0YSBmaWxlcyBkbyBub3QgZml0IGluIHRoZSBhcmNoaXZlOgorCXRhcjogZGJ1cy0xLjEuMi90ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy9vcmcuZnJlZWRlc2t0b3AuREJ1cy4KKwlUZXN0U3VpdGVTaGVsbEVjaG9TZXJ2aWNlRmFpbC5zZXJ2aWNlLmluOiBmaWxlIG5hbWUgaXMgdG9vCisJbG9uZyAobWF4IDk5KTsgbm90IGR1bXBlZAorCisJV2UgaGF2ZSB0byBoYXZlIHRoZSAnbG9uZycgbmFtZXMgYXMgdGhlIHNlcnZpY2UgaGVscGVyIG1hdGNoZXMgYnkKKwlmaWxlbmFtZSByYXRoZXIgdGhhbiBieSB0aGUgbmFtZSBpbiB0aGUgc2VydmljZSBmaWxlLgorCisyMDA3LTA3LTI0ICBSaWNoYXJkIEh1Z2hlcyAgPHJpY2hhcmRAaHVnaHNpZS5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjoKKwkqIHRlc3QvTWFrZWZpbGUuYW06CisJKiB0ZXN0L2RhdGEvaW52YWxpZC1zZXJ2aWNlLWZpbGVzLXN5c3RlbS9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0UworCXVpdGVOb0V4ZWMuc2VydmljZS5pbjoKKwkqIHRlc3QvZGF0YS9pbnZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTCisJdWl0ZU5vU2VydmljZS5zZXJ2aWNlLmluOgorCSogdGVzdC9kYXRhL2ludmFsaWQtc2VydmljZS1maWxlcy1zeXN0ZW0vb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFMKKwl1aXRlTm9Vc2VyLnNlcnZpY2UuaW46CisJKiB0ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzLXN5c3RlbS9kZWJ1Zy1hbGxvdy1hbGwtZmFpbC5jb25mLmluOgorCSogdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy1zeXN0ZW0vZGVidWctYWxsb3ctYWxsLXBhc3MuY29uZi5pbjoKKwkqIHRlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMvZGVidWctYWxsb3ctYWxsLXNoYTEuY29uZi5pbjoKKwkqIHRlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMvZGVidWctYWxsb3ctYWxsLmNvbmYuaW46CisJKiB0ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy1zeXN0ZW0vb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aQorCXRlRWNob1NlcnZpY2Uuc2VydmljZS5pbjoKKwkqIHRlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzLXN5c3RlbS9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpCisJdGVTZWdmYXVsdFNlcnZpY2Uuc2VydmljZS5pbjoKKwkqIHRlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzLXN5c3RlbS9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpCisJdGVTaGVsbEVjaG9TZXJ2aWNlRmFpbC5zZXJ2aWNlLmluOgorCSogdGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWkKKwl0ZVNoZWxsRWNob1NlcnZpY2VTdWNjZXNzLnNlcnZpY2UuaW46CisJKiB0ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy9kZWJ1Zy1lY2hvLnNlcnZpY2UuaW46CisJKiB0ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy9kZWJ1Zy1zZWdmYXVsdC5zZXJ2aWNlLmluOgorCSogdGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMvZGVidWctc2hlbGwtZWNoby1mYWlsLnNlcnZpY2UuaW46CisJKiB0ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy9kZWJ1Zy1zaGVsbC1lY2hvLXN1Y2Nlc3Muc2VydmljZS5pbjoKKwkqIHRlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZUVjaG9TCisJZXJ2aWNlLnNlcnZpY2UuaW46CisJKiB0ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVTZWdmYQorCXVsdFNlcnZpY2Uuc2VydmljZS5pbjoKKwkqIHRlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZVNoZWxsCisJRWNob1NlcnZpY2VGYWlsLnNlcnZpY2UuaW46CisJKiB0ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVTaGVsbAorCUVjaG9TZXJ2aWNlU3VjY2Vzcy5zZXJ2aWNlLmluOgorCUFkZCB0aGUgZGF0YSBmaWxlcyBuZWVkZWQgYnkgdGhlIHN5c3RlbSBhY3RpdmF0aW9uIHVuaXQgY2hlY2tzLgorCisyMDA3LTA3LTI0ICBSaWNoYXJkIEh1Z2hlcyAgPHJpY2hhcmRAaHVnaHNpZS5jb20+CisKKwkqIGJ1cy9kaXNwYXRjaC5jOiAoY2hlY2tfc2VnZmF1bHRfc2VydmljZV9ub19hdXRvX3N0YXJ0KSwKKwkoY2hlY2tfbGF1bmNoX3NlcnZpY2VfZmlsZV9taXNzaW5nKSwKKwkoY2hlY2tfbGF1bmNoX3NlcnZpY2VfdXNlcl9taXNzaW5nKSwKKwkoY2hlY2tfbGF1bmNoX3NlcnZpY2VfZXhlY19taXNzaW5nKSwKKwkoY2hlY2tfbGF1bmNoX3NlcnZpY2Vfc2VydmljZV9taXNzaW5nKSwgKGJ1c19kaXNwYXRjaF90ZXN0X2NvbmYpLAorCShidXNfZGlzcGF0Y2hfdGVzdF9jb25mX2ZhaWwpLCAoYnVzX2Rpc3BhdGNoX3Rlc3QpOgorCUFkZCB1bml0IHRlc3RzIGZvciBzeXN0ZW0gYWN0aXZhdGlvbi4gTW9zdCBhcmUgY29waWVkIGZyb20gdGhlCisJc2Vzc2lvbiBhY3RpdmF0aW9uIHRlc3RzLCBidXQgc29tZSBkaWRuJ3QgYXBwbHkgd2hlbiB1c2luZyBhIGxhdWNoZXIuCisKKzIwMDctMDctMjQgIFJpY2hhcmQgSHVnaGVzICA8cmljaGFyZEBodWdoc2llLmNvbT4KKworCSogYnVzL2FjdGl2YXRpb24uYzogKGJ1c19hY3RpdmF0aW9uX2FjdGl2YXRlX3NlcnZpY2UpOgorCUlmIHRoZSBidXMgdXNlcyBhIHNlcnZpY2UtbGF1Y2hlciwgdGhlbiB1c2UgdGhlIHNldHVpZCBsYXVjaGVyLgorCisyMDA3LTA3LTI0ICBSaWNoYXJkIEh1Z2hlcyAgPHJpY2hhcmRAaHVnaHNpZS5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjoKKwlBZGQgdGhlIG5lZWRlZCBsaWJyYXJ5IGV4cG9ydHMgZm9yIHRoZSBuZXcgbGF1Y2hlci4KKworMjAwNy0wNy0yNCAgUmljaGFyZCBIdWdoZXMgIDxyaWNoYXJkQGh1Z2hzaWUuY29tPgorCisJKiBjb25maWd1cmUuaW46CisJQ2hlY2sgZm9yIC1XbCwtLWdjLXNlY3Rpb25zIHNvIHdlIGNhbiByZWFsbHkgcmVkdWNlIHRoZSBzaXplIG9mIHRoZQorCXNldHVpZCBiaW5hcnkuCisKKzIwMDctMDctMjQgIFJpY2hhcmQgSHVnaGVzICA8cmljaGFyZEBodWdoc2llLmNvbT4KKworCSogYnVzL2FjdGl2YXRpb24uYzogKGhhbmRsZV9hY3RpdmF0aW9uX2V4aXRfZXJyb3IpLAorCShiYWJ5c2l0dGVyX3dhdGNoX2NhbGxiYWNrKToKKwlNYXAgdGhlIGNoaWxkIGV4aXQgc3RhdHVzIGludGVnZXIgdG8gYSBwcm9wZXIgZGJ1cyBlcnJvci4KKworMjAwNy0wNy0yNCAgUmljaGFyZCBIdWdoZXMgIDxyaWNoYXJkQGh1Z2hzaWUuY29tPgorCisJKiBidXMvYnVzLmM6IChwcm9jZXNzX2NvbmZpZ19maXJzdF90aW1lX29ubHkpLAorCShwcm9jZXNzX2NvbmZpZ19ldmVyeV90aW1lKSwgKGJ1c19jb250ZXh0X3VucmVmKSwKKwkoYnVzX2NvbnRleHRfZ2V0X3NlcnZpY2VoZWxwZXIpOgorCSogYnVzL2J1cy5oOgorCUFkZCB0aGUgY29uY2VwdCBvZiBhIHNlcnZpY2UtaGVscGVyIGFuZCBhbGxvdyBpdCdzIHZhbHVlIHRvIGJlIHJlYWQuCisKKzIwMDctMDctMjQgIFJpY2hhcmQgSHVnaGVzICA8cmljaGFyZEBodWdoc2llLmNvbT4KKworCSogYnVzL2FjdGl2YXRpb24uYzogKGJ1c19hY3RpdmF0aW9uX2VudHJ5X3VucmVmKSwKKwkodXBkYXRlX2Rlc2t0b3BfZmlsZV9lbnRyeSk6CisJQWRkIHRoZSBjb25jZXB0IG9mLCBhbmQgcmVhZCB0aGUgdmFsdWUgb2YgdXNlciBmcm9tIHRoZSBkZXNrdG9wIGZpbGUuCisJVGhlIHVzZXIgc3RyaW5nIGlzIG5vdCByZXF1aXJlZCB1bmxlc3Mgd2UgYXJlIHVzaW5nIHN5c3RlbSBhY3RpdmF0aW9uLgorCisyMDA3LTA3LTI0ICBSaWNoYXJkIEh1Z2hlcyAgPHJpY2hhcmRAaHVnaHNpZS5jb20+CisKKwkqIGJ1cy9hY3RpdmF0aW9uLmM6CisJKiBidXMvZGVza3RvcC1maWxlLmg6CisJTW92ZSB0aGUgZGVmaW5lcyBpbnRvIHRoZSBoZWFkZXIgZmlsZSwgYXMgd2UgdXNlIHRoZXNlIGluIHRoZSBsYXVjaAorCWhlbHBlciBhcyB3ZWxsIGFzIHRoZSBkZXNrdG9wIGZpbGUgcGFyc2luZy4KKworMjAwNy0wNy0yNCAgUmljaGFyZCBIdWdoZXMgIDxyaWNoYXJkQGh1Z2hzaWUuY29tPgorCisJKiBidXMvLmN2c2lnbm9yZToKKwlBZGQgdGhlIGF1dG9nZW5lcmF0ZWQgYmluYXJ5IGZpbGVzLgorCisyMDA3LTA3LTI0ICBSaWNoYXJkIEh1Z2hlcyAgPHJpY2hhcmRAaHVnaHNpZS5jb20+CisKKwkqIGJ1cy9NYWtlZmlsZS5hbToKKwkqIGJ1cy90ZXN0Lmg6CisJQWRkIHRoZSBidWlsZCBnbHVlIGZvciB0aGUgbGF1Y2ggaGVscGVyLCBhbmQgYWxzbyBhZGQgdGhlIGxhdW5jaC1oZWxwZXIKKwlPT00gY2hlY2tzIGludG8gbWFrZSBjaGVjay4gSSd2ZSBwcm9iYWJseSBicm9rZW4gdGhlIGJ1aWxkLCBnaXZlIG1lIDIuCisKKzIwMDctMDctMjQgIFJpY2hhcmQgSHVnaGVzICA8cmljaGFyZEBodWdoc2llLmNvbT4KKworCSogYnVzL3Rlc3QtbGF1bmNoLWhlbHBlci5jOiAoZGllKSwgKGNoZWNrX21lbWxlYWtzKSwKKwkodGVzdF9wb3N0X2hvb2spLCAoYnVzX2FjdGl2YXRpb25faGVscGVyX29vbV90ZXN0KSwgKG1haW4pOgorCUFkZCBhIHRlc3Qgd3JhcHBlciB0byBhbGxvdyBPT00gY2hlY2tzIG9uIHRoZSBsYXVuY2ggaGVscGVyLgorCisyMDA3LTA3LTI0ICBSaWNoYXJkIEh1Z2hlcyAgPHJpY2hhcmRAaHVnaHNpZS5jb20+CisKKwkqIGJ1cy9hY3RpdmF0aW9uLWhlbHBlci1iaW4uYzogKGNvbnZlcnRfZXJyb3JfdG9fZXhpdF9jb2RlKSwKKwkobWFpbik6CisJKiBidXMvYWN0aXZhdGlvbi1oZWxwZXIuYzogKGRlc2t0b3BfZmlsZV9mb3JfbmFtZSksCisJKGNsZWFyX2Vudmlyb25tZW50KSwgKGNoZWNrX3Blcm1pc3Npb25zKSwgKGNoZWNrX3NlcnZpY2VfbmFtZSksCisJKGdldF9wYXJhbWV0ZXJzX2Zvcl9zZXJ2aWNlKSwgKHN3aXRjaF91c2VyKSwKKwkoZXhlY19mb3JfY29ycmVjdF91c2VyKSwgKGNoZWNrX2J1c19uYW1lKSwgKGdldF9jb3JyZWN0X3BhcnNlciksCisJKGxhdW5jaF9idXNfbmFtZSksIChjaGVja19kYnVzX3VzZXIpLCAocnVuX2xhdW5jaF9oZWxwZXIpOgorCSogYnVzL2FjdGl2YXRpb24taGVscGVyLmg6CisJQWRkIHRoZSBpbml0aWFsIGxhdW5jaC1oZWxwZXIuIFRoaXMgaXMgc3BsaXQgaW50byBhIG1haW4gc2VjdGlvbiBhbmQgYQorCWJpbmFyeSBsb2FkZXIgdGhhdCBhbGxvd3MgdXMgdG8gbGF1Y2ggdGhlIG1haW4gc2VjdGlvbiBpbiBhbm90aGVyIHRlc3QKKwloYXJuZXNzIHRvIGRvIHN0dWZmIGxpa2UgT09NIHRlc3RpbmcuIE5vIGJ1aWxkIGdsdWUgeWV0LgorCisyMDA3LTA3LTI0ICBSaWNoYXJkIEh1Z2hlcyAgPHJpY2hhcmRAaHVnaHNpZS5jb20+CisKKwkqIGJ1cy9NYWtlZmlsZS5hbToKKwkqIGJ1cy9jb25maWctcGFyc2VyLmM6IChidXNfY29uZmlnX3BhcnNlcl91bnJlZiksCisJKHN0YXJ0X2J1c2NvbmZpZ19jaGlsZCksIChidXNfY29uZmlnX3BhcnNlcl9lbmRfZWxlbWVudCksCisJKHNlcnZpY2VoZWxwZXJfcGF0aCksIChidXNfY29uZmlnX3BhcnNlcl9jb250ZW50KSwKKwkoYnVzX2NvbmZpZ19wYXJzZXJfZmluaXNoZWQpLAorCShidXNfY29uZmlnX3BhcnNlcl9nZXRfc2VydmljZWhlbHBlciksCisJKHRlc3RfZGVmYXVsdF9zZXNzaW9uX3NlcnZpY2VkaXJzKSwKKwkodGVzdF9kZWZhdWx0X3N5c3RlbV9zZXJ2aWNlZGlycyksIChidXNfY29uZmlnX3BhcnNlcl90ZXN0KToKKwkqIGJ1cy9jb25maWctcGFyc2VyLmg6CisJTWFrZSB0aGUgY29uZmlnLXBhcnNlciBjb2RlIHVzZSB0aGUgY29tbW9uIGNvbmZpZyBjb2RlLgorCUFsc28gYWRkIHRoZSBzZXNzaW9uIGFuZCBzeXN0ZW1kaXJzIHN0dWZmLCBhbmQgbWFrZSB0aGUgY29uZmlnIHBhcnNlcgorCWF3YXJlIG9mIHRoZSBzZXJ2aWNlaGVscGVyIGZpZWxkLgorCisyMDA3LTA3LTI0ICBSaWNoYXJkIEh1Z2hlcyAgPHJpY2hhcmRAaHVnaHNpZS5jb20+CisKKwkqIGJ1cy9zeXN0ZW0uY29uZi5pbjoKKwlBZGQgbmV3IHNlcnZpY2VoZWxwZXIgZmllbGRzIHRvIHRoZSBkZWZhdWx0IHN5c3RlbS5jb25mIGZpbGUuCisKKzIwMDctMDctMjQgIFJpY2hhcmQgSHVnaGVzICA8cmljaGFyZEBodWdoc2llLmNvbT4KKworCSogYnVzL2NvbmZpZy1wYXJzZXItdHJpdmlhbC5jOiAoc2VydmljZV9kaXJzX2ZpbmRfZGlyKSwKKwkoc2VydmljZV9kaXJzX2FwcGVuZF9saW5rX3VuaXF1ZV9vcl9mcmVlKSwgKGJ1c19jb25maWdfcGFyc2VyX25ldyksCisJKGJ1c19jb25maWdfcGFyc2VyX3VucmVmKSwgKGJ1c19jb25maWdfcGFyc2VyX3N0YXJ0X2VsZW1lbnQpLAorCShidXNfY29uZmlnX3BhcnNlcl9lbmRfZWxlbWVudCksIChidXNfY29uZmlnX3BhcnNlcl9jb250ZW50KSwKKwkoYnVzX2NvbmZpZ19wYXJzZXJfZmluaXNoZWQpLCAoYnVzX2NvbmZpZ19wYXJzZXJfZ2V0X3VzZXIpLAorCShidXNfY29uZmlnX3BhcnNlcl9nZXRfdHlwZSksIChidXNfY29uZmlnX3BhcnNlcl9nZXRfc2VydmljZV9kaXJzKSwKKwkoY2hlY2tfcmV0dXJuX3ZhbHVlcyksIChkb19sb2FkKSwgKGNoZWNrX2xvYWRlcl9vb21fZnVuYyksCisJKHByb2Nlc3NfdGVzdF92YWxpZF9zdWJkaXIpLCAobWFrZV9mdWxsX3BhdGgpLCAoY2hlY2tfZmlsZV92YWxpZCksCisJKGJ1c19jb25maWdfcGFyc2VyX3RyaXZpYWxfdGVzdCk6CisJKiBidXMvY29uZmlnLXBhcnNlci10cml2aWFsLmg6CisJQWRkIGEgc2VjdXJpdHkgc2Vuc2l0aXZlIHN0cmlwcGVkIGRvd24gY29uZmlnIHBhcnNlciBmb3IgdGhlIHNldHVpZAorCWxhdW5jaGVyLiBUaGlzIGZpbGUgb25seSByZWFkcyB3aGF0IGl0IG5lZWRzLCBhbmQgZG9lc24ndCB0cnkgdG8gZG8KKwlhbnl0aGluZyByZW1vdGVseSBjbGV2ZXIgbGlrZSBpbmNsdWRpbmcgZXh0ZXJuYWwgZmlsZXMuCisJSXQgaXMgbm90IGludGVuZGVkIHRvIHZhbGlkYXRlIHRoZSBjb25maWcgZmlsZTsgaXQgaXMgZXhwZWN0ZWQgdGhhdAorCWNvbmZpZy1wYXJzZXIgd2lsbCBkbyB0aGF0IGJlZm9yZSB0aGUgc2V0dWlkIHByb2dyYW0gdHJpZXMgdG8gcmVhZCBpdC4KKworMjAwNy0wNy0yNCAgUmljaGFyZCBIdWdoZXMgIDxyaWNoYXJkQGh1Z2hzaWUuY29tPgorCisJKiBidXMvY29uZmlnLXBhcnNlci1jb21tb24uYzoKKwkoYnVzX2NvbmZpZ19wYXJzZXJfZWxlbWVudF9uYW1lX3RvX3R5cGUpLAorCShidXNfY29uZmlnX3BhcnNlcl9lbGVtZW50X3R5cGVfdG9fbmFtZSk6CisJKiBidXMvY29uZmlnLXBhcnNlci1jb21tb24uaDoKKwlXZSBkb24ndCB3YW50IHRvIHJ1biB0aGUgd2hvbGUgY29uZmlnIHBhcnNlciB3aXRoIGFsbCBpdCdzIGRlcHMgaW4gdGhlCisJc2V0dWlkIHByb2dyYW0uIFdlIG5lZWQgdG8gaW1wbGVtZW50IGEgc3RyaXBwZWQgZG93biBjb25maWcgcGFyc2VyIGp1c3QKKwlmb3IgdGhlIGxhdW5jaGVyLCBhbmQgdG8gZG8gc28gSSBuZWVkIHNvbWUgY29tbW9uIGZ1bmN0aW9ucyBhbmQKKwlkZWZpbmVzOyBhZGQgdGhlbSBoZXJlLgorCisyMDA3LTA3LTI0ICBSaWNoYXJkIEh1Z2hlcyAgPHJpY2hhcmRAaHVnaHNpZS5jb20+CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLXVuaXguYzoKKwkoX2RidXNfZ2V0X3N0YW5kYXJkX3N5c3RlbV9zZXJ2aWNlZGlycyk6CisJKiBkYnVzL2RidXMtc3lzZGVwcy13aW4uYzoKKwlQcm92aWRlIGEgd2F5IHRvIGdldCB0aGUgc3RhbmRhcmQgc3lzdGVtIHNlcnZpY2VkaXJzLCBqdXN0IGxpa2Ugd2UgZG8KKwlmb3IgdGhlIHNlc3Npb24gc2VydmljZSBkaXJzLiBUaGVzZSBzaG91bGQgYmUgc2Vwb3JhdGUsIGFzIHRoZXJlIG1heQorCWJlIGEgc2VjdXJpdHkgaXNzdWUgc3RhcnRpbmcgdXAgc29tZSBzZXNzaW9uIHN0dWZmIGFzIHJvb3QuCisJVGhlIHVzZS1jYXNlIGZvciB0aGUgc2FtZSBiaW5hcnkgc3RhcnRpbmcgdXAgcGVyLXN5c3RlbSBfYW5kXworCXBlci1zZXNzaW9uIGlzIGFsc28gbm90IHZhbGlkLgorCisyMDA3LTA3LTI0ICBSaWNoYXJkIEh1Z2hlcyAgPHJpY2hhcmRAaHVnaHNpZS5jb20+CisKKwkqIGJ1cy9kYnVzLWRhZW1vbi4xLmluOgorCUFkZCBzdGFuZGFyZF9zeXN0ZW1fc2VydmljZWRpcnMgYW5kIHNlcnZpY2VoZWxwZXIgaW50byB0aGUgbWFuIGZpbGUKKwlhbmQgZXhwbGFpbiB3aGF0IGVhY2ggZG9lcy4KKworMjAwNy0wNy0yNCAgUmljaGFyZCBIdWdoZXMgIDxyaWNoYXJkQGh1Z2hzaWUuY29tPgorCisJKiBkb2MvYnVzY29uZmlnLmR0ZDoKKwlBZGQgc2VydmljZWhlbHBlciBpbnRvIHRoZSBkdGQsIGl0IHdpbGwgc29vbiBiZSBhIHZhbGlkIHBhcnQgb2YgdGhlCisJY29uZmlnIGZpbGUuCisKKzIwMDctMDctMjQgIFJpY2hhcmQgSHVnaGVzICA8cmljaGFyZEBodWdoc2llLmNvbT4KKworCSogZGJ1cy9kYnVzLXNwYXduLmM6IChyZWFkX2RhdGEpLAorCShfZGJ1c19iYWJ5c2l0dGVyX2dldF9jaGlsZF9leGl0X3N0YXR1cyk6CisJKiBkYnVzL2RidXMtc3Bhd24uaDoKKwlBZGQgYSBmdW5jdGlvbiBzbyB3ZSBjYW4gZ2V0IGFjY2VzcyB0byB0aGUgZXhpdCBzdGF0dXMgb2YgdGhlIGxhdW5jaAorCWhlbHBlci4KKwlCeSBwcm92aWRpbmcgdGhlIHJldHVybiBjb2RlIGFuZCBub3QgdGhlIGVycm9yIHdlIGNhbiBsZWF2ZSB0aGUKKwknd2hhdCBkb2VzIHRoaXMgbWVhbj8nIHRvIHRoZSBidXMgbGF1bmNoIGNvZGUgYW5kIG5vdCBpbmNsdWRlIGl0IGluIHRoZQorCWRidXMgZGlyZWN0b3J5LgorCisyMDA3LTA3LTI0ICBSaWNoYXJkIEh1Z2hlcyAgPHJpY2hhcmRAaHVnaHNpZS5jb20+CisKKwkqIGJ1cy9hY3RpdmF0aW9uLWV4aXQtY29kZXMuaDoKKwlBZGQgZGVmaW5lcyB3aGljaCBzcGVjaWZ5IHRoZSBvdXRwdXQgY29kZXMgb2YgdGhlIGxhdW5jaCBoZWxwZXIuCisJV2UgaGF2ZSB0byB1c2UgZXhpdCBjb2RlcyBhcyB0aGlzIGlzIHRoZSBvbmx5IHdheSB3ZSBjYW4gcmV0dXJuIGZhaWx1cmUKKwl0eXBlIHdpdGhvdXQgZ29pbmcgZ3JvdHR5IHRoaW5ncyBsaWtlIHJlZGlyZWN0aW5nIHBvc3NpYmx5LW5vbnNlY3VyZQorCXN0ZGVyciBpbnRvIHRoZSBlcnJvci4KKworMjAwNy0wNy0yNCAgUmljaGFyZCBIdWdoZXMgIDxyaWNoYXJkQGh1Z2hzaWUuY29tPgorCisJKiBkYnVzL2RidXMtcHJvdG9jb2wuaDoKKwlBZGQgbmV3IGVycm9yIG5hbWVzIG5lZWRlZCBmb3IgdGhlIGxhdW5jaCBoZWxwZXIuCisKKzIwMDctMDctMjQgIFJpY2hhcmQgSHVnaGVzICA8cmljaGFyZEBodWdoc2llLmNvbT4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYzogKF9kYnVzX2NsZWFyZW52KToKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmg6CisJQWRkIGEgd3JhcHBlciBmb3IgY2xlYXJlbnYuCisKKzIwMDctMDctMjQgIFJpY2hhcmQgSHVnaGVzICA8cmljaGFyZEBodWdoc2llLmNvbT4KKworCSogZG9jL3N5c3RlbS1hY3RpdmF0aW9uLnR4dDoKKwlBZGQgZGVzaWduIGRvY3VtZW50IGZvciB0aGUgc3lzdGVtIGFjdGl2YXRpb24gcGFydHMuIEknbGwgc2hvcnRseSBiZQorCWNvbW1pdHRpbmcgbWFueSBwYXRjaGVzIHRoYXQgYWRkIHN5c3RlbSBhY3RpdmF0aW9uIHVzaW5nIGEgc2V0dWlkCisJbGF1bmNoZXIgaW50byBDVlMsIHNvIGV4cGVjdCB0aGluZ3MgdG8gYmUgYnJva2VuIGZvciBhIGZldyBob3Vycy4KKworMjAwNy0wNy0xOSAgUmFsZiBIYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogY21ha2UvbW9kdWxlcy9GaW5kS0RFV0lOLmNtYWtlOiBmaXhlZCBjb21tZW50CisJKiBjbWFrZS9tb2R1bGVzL0ZpbmRLREVXSU4zMi5jbWFrZTogcmVtb3ZlZCBvYnNvbGF0ZSBjbWFrZSBtb2R1bGUKKworMjAwNy0wNy0xOCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKGRidXNfbWVzc2FnZV9nZXRfY2FjaGVkKQorCShkYnVzX21lc3NhZ2VfY2FjaGVfb3JfZmluYWxpemUpOiBkb24ndCBtZXNzIHdpdGggbWVzc2FnZSBmcm9tCisJbWVzc2FnZSBjYWNoZSBvdXRzaWRlIG9mIHRoZSBjYWNoZSBsb2NrLiBCdWcgIzkxNjQgZnJvbSBKb25hdGhhbgorCU1hdHRoZXcuCisKKzIwMDctMDctMTMgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBBZGQgaW5kZW50LXRhYnMtbW9kZTogbmlsIHRvIGFsbCBmaWxlIGhlYWRlcnMuCisKKzIwMDctMDctMTIgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy11dGlsLmMgKF9kYnVzX3N5c2RlcHNfdGVzdCk6IGludmVydCB0aGUgdGVzdAorCWZvciBwYXJzaW5nIGhleCBhcyBkb3VibGUgdG8gYmUgc3VyZSBpdCBmYWlscyB0byB3b3JrCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLmMgKF9kYnVzX3N0cmluZ19wYXJzZV9kb3VibGUpOiBkb24ndCBhbGxvdyBoZXggbnVtYmVycy4KKworMjAwNy0wNy0xMCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMgKHN0cnVjdCBEQnVzQ29ubmVjdGlvbik6IEZpeCBmcm9tIE9saXZpZXIKKwlIb2NocmV1dGluZXIgdG8gYXZvaWQgdHJ5aW5nIHRvIHByb3RlY3QgaW5kaXZpZHVhbCBiaXRzIGluIGEgd29yZAorCXdpdGggZGlmZmVyZW50IGxvY2tzIChtYWtlIGRpc3BhdGNoX2FjcXVpcmVkIGFuZCBpb19wYXRoX2FjcXVpcmVkCisJZGJ1c19ib29sX3QgcmF0aGVyIHRoYW4gYml0ZmllbGRzKQorCisyMDA3LTA3LTA5ICBSYWxmIEhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy13aW4uYyxkYnVzLXN5c2RlcHMtd2luLmgsZGJ1cy1zeXNkZXBzLXdpbi11dGlsLmMsCisJZGJ1cy1zeXNkZXBzLXNwYXduLXdpbi5jOiBzeW5jZWQgd2l0aCB3aW5kYnVzIHNvdXJjZXMgCisKKzIwMDctMDctMDcgIFJhbGYgSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLXdpbi5jIAorCQkoX2RidXNfZ2V0c2lkKTogcmVtb3ZlIHVudXNlZCBqdW1wIGxhYmVsCisJCShfZGJ1c19yZWFkX2NyZWRlbnRpYWxzX3NvY2tldCk6IF9kYnVzX3N0cmluZ19pbml0IGNvdWxkIGZhaWwsIAorCSAgICAgICAgY2hlY2sgaW5pdGlhbGlzYXRpb24KKwkJKF9kYnVzX2dldF93b3JraW5nX2RpciwgX2RidXNfaW5pdF93b3JraW5nX2Rpcik6IHJlbW92ZSB1bnVzZWQgCisJCQlmdW5jdGlvbnMKKworMjAwNy0wNy0wNCAgUmFsZiBIYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogY21ha2UvbW9kdWxlcy9GaW5kS0RFV0lOLmNtYWtlOiBzZWFyY2ggaW4gPHByb2dyYW0gZmlsZXMgZGlyPlx3aW4zMmxpYnMgCisJZm9yIHdpbmRvd3Mgc3VwcGxlbWVudGFyeSBwYWNrYWdlcyB0b28KKworMjAwNy0wNi0zMCAgUmFsZiBIYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogY21ha2UvZGJ1cy9DTWFrZUxpc3RzLnR4dDogaGFuZGxlIHVzZXJkYiBhcyB1bml4IGZpbGUKKworMjAwNy0wNi0zMCAgUmFsZiBIYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMtd2luLmMsZGJ1cy9kYnVzLXN5c2RlcHMtd2luLmg6IHJlbW92ZWQgb2Jzb2xhdGUgCisJREJ1c1VzZXJJbmZvIGNvZGUKKworMjAwNy0wNi0zMCAgUmFsZiBIYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMtd2luLmMgKF9kYnVzX2RhZW1vbl9pbml0KTogcmVkdWNlZCBjb21waWxlciB3YXJuaW5ncworCisyMDA3LTA2LTIzICBSYWxmIEhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiBkYnVzL2RidXMtYXV0aC1zY3JpcHQuYyAoX2RidXNfYXV0aF9zY3JpcHRfcnVuKTogYWRkZWQgVU5JWF9PTkxZIGFuZCAKKwlXSU5fT05MWSBjb21tYW5kcyBmb3IgYXV0aCBzY3JpcHRzCisJKiB0ZXN0L2RhdGEvYXV0aC9leHRlcm5hbC1yb290LmF1dGgtc2NyaXB0OiBsaW1pdCBleGVjdXRpb24gdG8gdW5peAorCisyMDA3LTA2LTIxICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLXRyYW5wb3J0LmMgKGF1dGhfdmlhX2RlZmF1bHRfcnVsZXMpOiBtYWRlIHRoZSB2ZXJib3NlIHNwYW0KKwljcm9zcy1wbGF0Zm9ybQorCisyMDA3LTA2LTIxICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLXdhdGNoLmMgKGRidXNfd2F0Y2hfZ2V0X2ZkKTogMSkgaXRzIGJlaGF2aW9yIHNob3VsZAorCW5vdCBiZSB0aGUgc2FtZSBhcyBiZWZvcmUsIHRoZSBBQkkgaGFzIG5ldmVyIGJlZW4gZGVjbGFyZWQgc3RhYmxlCisJb24gV2luZG93cyBhbmQgMikgZG8gbm90IGNvbW1pdCB0byBjcm9zcy1wbGF0Zm9ybSBmaWxlcyB3aXRob3V0CisJcG9zdGluZyB0aGUgZXhhY3QgcGF0Y2ggdG8gdGhlIG1haWxpbmcgbGlzdAorCQorCSogZGJ1cy9kYnVzLXN5c2RlcHMtdXRpbC5jIChfZGJ1c19zeXNkZXBzX3Rlc3QpOiBhcyBJIGhhdmUgcG9pbnRlZAorCW91dCBiZWZvcmUsIGVpdGhlciAweGZmIG5lZWRzIHRvIHdvcmsgb24gYm90aCBwbGF0Zm9ybXMsIG9yIG5vbmUKKwlvZiB0aGUgZGJ1cyBjb2RlIGNhbiByZWx5IG9uIGl0IHdvcmtpbmcuIFRoYXQgbWVhbnMgdGhlIG9wdGlvbnMKKwlhcmUgMSkgYXVkaXQgdGhlIGNvZGUgZm9yIGFueXdoZXJlIHRoYXQgcmVsaWVzIG9uIDB4ZmYgd29ya2luZywgaWYKKwlub25lIGZvdW5kIGlkZWFsbHkgYWRkIGEgdGVzdCB0aGF0IGl0ICpkb2Vzbid0KiB3b3JrIGFuZCBtYWtlIHVuaXgKKwlyZWplY3QgaXQgZXhwbGljaXRseSwgYnV0IGluIGFueSBjYXNlIHRoaXMgdGVzdCB3b3VsZCBnbyBhd2F5IG9yCisJMikgbWFrZSBpdCB3b3JrIG9uIFdpbmRvd3MgYWxzbywgdGhlbiB3ZSBkb24ndCBoYXZlIHRvIGZpZ3VyZSBvdXQgCisJd2hldGhlciB3ZSByZWx5IG9uIGl0LgorCisJQW5kIGluIGVpdGhlciBjYXNlLCBwb3N0IHRoZSBleGFjdCBwYXRjaCB0byB0aGUgbWFpbGluZyBsaXN0IGFuZAorCWRvbid0IGp1c3QgY29tbWl0LgorCisyMDA3LTA2LTIxIFJhbGYgSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIGNtYWtlL0NNYWtlTGlzdHMudHh0OiBhZGRlZCBWRVJTSU9OX1BBVENIIHRvIGJlIGFibGUgdG8gCisJZGlzdGluZ3Vpc2ggd2luMzIgYmluYXJ5IHJlbGVhc2UgZnJvbSBkYnVzIHZlcnNpb25pbmcKKworMjAwNy0wNi0yMSBSYWxmIEhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy13aW4uYzogZGVsZXRlZCBsb2NhbCBEQnVzQ3JlZGVudGlhbHMgc3RydWN0dXJlCisJICAgIChfZGJ1c19nZXRzaWQpOiBuZXcgZnVuY3Rpb24KKwkgICAgKF9kYnVzX3JlYWRfY3JlZGVudGlhbHNfc29ja2V0KTogdXNlZCBjb3JyZWN0IGZ1bmN0aW9uCisJICAgIChfZGJ1c19hcHBlbmRfdXNlcl9mcm9tX2N1cnJlbnRfcHJvY2VzcywgCisJICAgICAgICBfZGJ1c19jcmVkZW50aWFsc19hZGRfZnJvbV9jdXJyZW50X3Byb2Nlc3MpOiBhZGRlZCByZWFsIAorCSAgICAgICAgICAgIHNpZCByZWFkaW5nCisJICAgIChfZGJ1c19jcmVkZW50aWFsc19wYXJzZV9hbmRfYWRkX2Rlc2lyZWQsX2RidXNfcGFyc2VfdWlkKTogCisJICAgICAgICBkZWxldGVkCisKKzIwMDctMDYtMjEgUmFsZiBIYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMtdXRpbC5jIChfZGJ1c19zeXNkZXBzX3Rlc3QpOiBkb24ndCBjaGVjayAKKwkweGZmIGFzIGZsb2F0aW5nIHBvaW50LCB0aGlzIGlzbid0IHN1cHBvcnRlZCBvbiB3aW4zMiBtYXRoIAorCWltcGxlbWVudGF0aW9uCisKKzIwMDctMDYtMjEgUmFsZiBIYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMtd2luLmMgKF9kYnVzX2hvbWVkaXJfZnJvbV91c2VybmFtZSwgCisJX2RidXNfaG9tZWRpcl9mcm9tX2N1cnJlbnRfcHJvY2VzcywgX2RidXNfYXBwZW5kX2Rlc2lyZWRfaWRlbnRpdHkpOiAKKwlyZW1vdmVkIG9ic29sYXRlIGZ1bmN0aW9ucworCisyMDA3LTA2LTIxIFJhbGYgSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLXdpbi5jLCBkYnVzL2RidXMtc3lzZGVwcy11dGlsLXdpbi5jLCAKKwlkYnVzL2RidXMtc3lzZGVwcy13aW4uaDogZGlzYWJsZWQgdWlkL3NpZCBjb252ZXJzYXRpb24gc3R1ZmYKKwlpbXBsZW1lbnRhdGlvbiBieSBQZXRlciBLdWVtbWVsIAorCisyMDA3LTA2LTIxICBSYWxmIEhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiBkYnVzL2RidXMtd2F0Y2guYyAoZGJ1c193YXRjaF9nZXRfZmQpOiB0aGlzIGZ1bmN0aW9uIGlzIAorCWRlcHJlY2F0ZWQgYW5kIGl0cyBiZWhhdmlvciBzaG91bGQgYmUgYXMgYmVmb3JlIHVudGlsIGFsbCAKKwljbGllbnQgY29kZSBpcyBtaWdyYXRlZC4gCisKKzIwMDctMDYtMTkgIFJhbGYgSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLXV0aWwtd2luLmMsIHRvb2xzL2RidXMtbGF1bmNoLXdpbi5jOiAKKwltc3ZjNy4xIGZpeGVzIGJ5IEphcm9zbGF3IFN0YW5pZWsgdGVzdGVkIHdpdGggbWluZ3cgCisKKzIwMDctMDYtMTkgIFJhbGYgSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLXdpbi5jLCBkYnVzL2RidXMtc3lzZGVwcy1zcGF3bi13aW4uYywgCisJZGJ1cy9kYnVzLXN5c2RlcHMtd2luLmg6IGRpc2FibGVkIERCdXNTb2NrZXQgaW1wbGVtZW50YXRpb24KKwlieSBQZXRlciBLdWVtbWVsIAorCisyMDA3LTA2LTE4ICBSYWxmIEhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiBkYnVzLXdpbi5wYXRjaDogcmVtb3ZlZCBvYnNvbGF0ZSBwYXRjaGVzCisKKzIwMDctMDYtMTggIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBjb25maWd1cmUuaW46IGJ1bXAgdmVyc2lvbiB0byAxLjEuMiBzbyBDVlMgaXMgaGlnaGVyIHRoYW4gbGFzdAorCXJlbGVhc2UgKHRoaXMgaXMgbm90IHRoZSAxLjEuMiByZWxlYXNlKQorCisyMDA3LTA2LTE4ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogUmVsZWFzZSAxLjEuMQorCisyMDA3LTA2LTE4ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZG9jL2RidXMtc3BlY2lmaWNhdGlvbi54bWw6IGRvY3VtZW50IG9yZy5mcmVlZGVza3RvcC5EQnVzLkdldElkKCkKKworCSogYnVzL2RyaXZlci5jIChidXNfZHJpdmVyX2hhbmRsZV9nZXRfaWQpOiBpbXBsZW1lbnQgb3JnLmZyZWVkZXNrdG9wLkRCdXMuR2V0SWQoKQorCisJKiBidXMvYnVzLmMgKGJ1c19jb250ZXh0X25ldyk6IGdlbmVyYXRlIGEgdW5pcXVlIElEIGZvciBlYWNoIGJ1cyBjb250ZXh0CisKKwkqIGRidXMvZGJ1cy1jb25uZWN0aW9uLmMgKGRidXNfY29ubmVjdGlvbl9nZXRfc2VydmVyX2lkKTogbmV3IGZ1bmN0aW9uCisKKwkqIGRidXMvZGJ1cy1idXMuYyAoZGJ1c19idXNfZ2V0X2lkKTogbmV3IGZ1bmN0aW9uCisKKwkqIGRidXMvZGJ1cy1zZXJ2ZXIuYyAoZGJ1c19zZXJ2ZXJfZ2V0X2lkKTogbmV3IGZ1bmN0aW9uCisKKzIwMDctMDYtMTggIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy11bml4LmMgKF9kYnVzX3JlYWRfY3JlZGVudGlhbHNfc29ja2V0KTogY2xlYW4KKwl0aGlzIHVwIGEgbGl0dGxlIGJpdCwgdG8gdHJ5IGFuZCB1bmRlcnN0YW5kIHdoeSB0ZWxuZXQnaW5nIHRvIGEKKwlzZXJ2ZXIgYW5kIHNlbmRpbmcgYSBub24tbnVsIGJ5dGUgZGlkbid0IGRpc2Nvbm5lY3QgaW1tZWRpYXRlbHk7CisJbm93IGl0IHNlZW1zIHRoYXQgaXQgZG9lcyBkaXNjb25uZWN0IGltbWVkaWF0ZWx5IGFzIGl0IHNob3VsZCwKKwl0aG91Z2ggSSBkb24ndCB1bmRlcnN0YW5kIHdoYXQgaGFzIGNoYW5nZWQuCisKKzIwMDctMDYtMTggIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtd2F0Y2guYyAoZGJ1c193YXRjaF9nZXRfc29ja2V0KQorCShkYnVzX3dhdGNoX2dldF91bml4X2ZkKTogbmV3IEFQSSB0byBtYXRjaCBEQnVzQ29ubmVjdGlvbgorCShkYnVzX3dhdGNoX2dldF9mZCk6IGRlcHJlY2F0ZSB0aGlzCisKKwlUaHJvdWdob3V0OiBqdXN0IHMvZGJ1c193YXRjaF9nZXRfZmQvZGJ1c193YXRjaF9nZXRfc29ja2V0L2cgZm9yCisJbm93IHNpbmNlIGFsbCB0aGUgdHJhbnNwb3J0cyB1c2Ugc29ja2V0cyBhbnl3YXkKKwkKKzIwMDctMDYtMTYgIFJhbGYgSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIGRidXMvZGJ1cy1tYWNyb3MuaCwgZGJ1cy9kYnVzLW1lc3NhZ2UuYywgCisJZGJ1cy9kYnVzLW1lc3NhZ2UuaDogcmVuYW1lZCBEQlVTX0dOVUNfREVQUkVDQVRFRCAKKwl0byBEQlVTX0RFUFJFQ0FURUQgYW5kIGV4dGVuZGVkIHRvIG1zdmMgY29tcGlsZXIKKworMjAwNy0wNi0xNSAgUmFsZiBIYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogY21ha2UvQ01ha2VMaXN0cy50eHQ6IHVzZSBsb2NhbCBpbmNsdWRlIGhlYWRlciBmaXJzdAorCisJKiBkYnVzL2RidXMtc3lzZGVwcy13aW4uYzogbWluZ3cgZml4IG9mIERCdXNDcmVkZW50aWFsIHN0cnVjdAorCisyMDA3LTA2LTE1ICBSYWxmIEhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiBjbWFrZS9Db25maWd1cmVDaGVja3MuY21ha2UsY21ha2UvY29uZmlnLmguY21ha2U6IAorCWFkZGVkIGNoZWNrIGZvciBIQVZFX0VSUk5PX0gKKworCSogY21ha2UvZGJ1cy9DTWFrZUxpc3RzLnR4dDogYWRkZWQgbWlzc2luZyBmaWxlcyAKKwkKKwkqIGRidXMvZGJ1cy10cmFuc3BvcnQtd2luLmMvLmg6IG5ldyBmaWxlcworCisJKiBkYnVzL2RidXMtc3lzZGVwcy13aW4uYywuaDogYWRkZWQgcmVxdWlyZWQgX3VuaXggZnVuY3Rpb25zIAorCXRvIG1ha2UgZGJ1cyBjb21waWxhYmxlIG9uIHdpbjMyIAorCQorCSogZGJ1cy9kYnVzLXN5c2RlcHMtd2luLXV0aWxzLmMsLmg6IG1vdmVkIHNvbWUgZnVuY3Rpb25zIHRvIAorCWRidXMtc3lzZGVwcy13aW4uYworCQorCSogZGJ1cy13aW4ucGF0Y2g6IHJlbW92ZWQgYXBwbGllZCBvciBvYnNvbGF0ZSBwYXRjaGVzCisJCisJTm90ZTogZGJ1cy13aW4zMiBpcyBub3cgY29tcGlsYWJsZSwgbm8gZ3VhcmFudGVlIHRoYXQgaXQgcnVucyAKKwl3aXRob3V0IGFueSBwcm9ibGVtcyAKKworMjAwNy0wNi0xNSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLXVuaXguYyAoX2RidXNfYXBwZW5kX3Nlc3Npb25fY29uZmlnX2ZpbGUpCisJKF9kYnVzX2FwcGVuZF9zeXN0ZW1fY29uZmlnX2ZpbGUpOiBuZXcgZnVuY3Rpb25zCisKKwkqIGJ1cy9tYWluLmMgKG1haW4pOiB1c2UgX2RidXNfYXBwZW5kX3N5c3RlbV9jb25maWdfZmlsZSgpIGFuZCAKKwlfZGJ1c19hcHBlbmRfc2Vzc2lvbl9jb25maWdfZmlsZSgpCisKKwkqIGRidXMvTWFrZWZpbGUuYW0gKElOQ0xVREVTKTogbW92ZSBEQlVTX1NZU1RFTV9DT05GSUdfRklMRSBhbmQKKwlEQlVTX1NFU1NJT05fQ09ORklHX0ZJTEUgaW50byB0aGlzIG1ha2VmaWxlCisKKzIwMDctMDYtMTUgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jIChfZGJ1c19zZXRfZXJybm9fdG9femVybykKKwkoX2RidXNfZ2V0X2lzX2Vycm5vX25vbnplcm8sIF9kYnVzX2dldF9pc19lcnJub19laW50cikKKwkoX2RidXNfc3RyZXJyb3JfZnJvbV9lcnJubyk6IGZhbWlseSBvZiBmdW5jdGlvbnMgdG8gYWJzdHJhY3QKKwllcnJubywgdGhvdWdoIHRoZXNlIGFyZSBzb21ld2hhdCBib2d1cyAocmVhbGx5IHdlIHNob3VsZCBtYWtlIG91cgorCXNvY2tldCB3cmFwcGVycyBub3QgdXNlIGVycm5vIHByb2JhYmx5IC0gdGhlIGlzc3VlIGlzIHRoYXQgYW55CisJdXNhZ2Ugb2YgZXJybm8gdGhhdCBpc24ndCBzb2NrZXQtcmVsYXRlZCBwcm9iYWJseSBpcyBub3QKKwljcm9zcy1wbGF0Zm9ybSwgc28gc2hvdWxkIGVpdGhlciBiZSBpbiBhIHVuaXgtb25seSBmaWxlIHRoYXQgY2FuCisJdXNlIGVycm5vIGRpcmVjdGx5LCBvciBpcyBhIGJ1ZyAtIHRoZXNlIGdlbmVyYWwgZXJybm8gd3JhcHBlcnMKKwloaWRlIGlzc3VlcyBvZiB0aGlzIG5hdHVyZSBpbiBub24tc29ja2V0IGNvZGUsIHdoaWxlCisJc29ja2V0LXNwZWNpZmljIEFQSSBjaGFuZ2VzIHdvdWxkIG5vdCBzaW5jZSBzb2NrZXRzIGFyZSBhbGxvd2VkCisJY3Jvc3MtcGxhdGZvcm0pCisKKzIwMDctMDYtMTQgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBidXMvZGlzcGF0Y2guYyAoY2hlY2tfZ2V0X2Nvbm5lY3Rpb25fdW5peF9wcm9jZXNzX2lkKTogbW9wIHVwCisJZ2V0cGlkKCkgKG5vdGljZWQgYnkgUGV0ZXIgS8O8bW1lbCkgYW5kIGFkYXB0IHRoZSB0ZXN0IHRvIAorCWV4cGVjdCBhICJwaWQgdW5rbm93biIgZXJyb3Igd2hlbiBydW5uaW5nIG9uIFdpbmRvd3MuCisKKzIwMDctMDYtMTQgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy11bml4LmMgKF9kYnVzX2NyZWRlbnRpYWxzX3BhcnNlX2FuZF9hZGRfdXNlcik6CisJZGVsZXRlIHRoaXMgZnVuY3Rpb24gc2luY2UgaXQgd2FzIGVmZmVjdGl2ZWx5IHRoZSBzYW1lIGFzCisJX2RidXNfY3JlZGVudGlhbHNfYWRkX2Zyb21fdXNlcm5hbWUoKQorCisyMDA3LTA2LTE0ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLWF1dGguYzogYWRhcHQgdG8ga2V5cmluZyBjaGFuZ2VzCisKKwkqIGRidXMvZGJ1cy1rZXlyaW5nLmM6IGNoYW5nZSB0byBhdm9pZCB1c2luZyB1c2VyIElEIGFuZCBob21lCisJZGlyZWN0b3J5IGRpcmVjdGx5OyBpbnN0ZWFkIHVzZSBhCisJa2V5cmluZy1sb2NhdGlvbi1mcm9tLWNyZWRlbnRpYWxzIGZ1bmN0aW9uIGluIGRidXMtc3lzZGVwcworCisJKiBmaXggdG8gdXNlIF9kYnVzX2FwcGVuZF91c2VyX2Zyb21fY3VycmVudF9wcm9jZXNzKCkgaW5zdGVhZCBvZiAKKwlfZGJ1c191c2VybmFtZV9mcm9tX2N1cnJlbnRfcHJvY2VzcygpIG9yIF9kYnVzX2FwcGVuZF9kZXNpcmVkX2lkZW50aXR5KCkuCisJCisyMDA3LTA2LTE0ICBSYWxmIEhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiByZXZlcnRlZCBnbG9iYWwgcmVuYW1lIG9mIGZ1bmN0aW9uIF9kYnVzX3VzZXJuYW1lX2Zyb21fY3VycmVudF9wcm9jZXNzLiAKKwlJdCBuZWVkcyB0b28gbXVjaCB0ZXN0cyB0byB2ZXJpZnkgdGhhdCB0aGUgY2hhbmdlIGRvZXMgbm90IGJyZWFrIGFueXRoaW5nLiAKKwlJIGhhZCBvdmVyc2VlbiB0aGF0IHRoZSBzaWduYXR1cmVzIGFyZSBkaWZmZXJlbnQgYW5kIHJlcXVpcmVzIG5vbgorCXRyaXZpYWwgY2hhbmdlcy4gCisJVGhpcyBpcyBvbmUgKm1ham9yKiBkaXNhZHZhbnRhZ2Ugb2YgZW11bGF0aW5nIG9vcCBmdW5jdGlvbmFsaXR5IHdpdGggYy4gCisJWW91IGFyZSByZXNwb25zaWJsZSBmb3IgY2xlYW5pbmcgZXZlcnkgb2JqZWN0IG9uIGV2ZXJ5IGZ1bmN0aW9uIHJldHVybiBwb2ludAorCXdoaWNoIGNvdWxkIGJlIGEgbmlnaHRtYXJlIGlmIHlvdSBhcmUgbm90IHdvcmtpbmcgd2l0aCBkYnVzIGFsbCB0aGUgZGF5cy4KKworMjAwNy0wNi0xNCAgUmFsZiBIYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKyAgICAKKwkqIGRidXMvZGJ1cy1hdXRoLmMgKGhhbmRsZV9jbGllbnRfaW5pdGlhbF9yZXNwb25zZV9jb29raWVfc2hhMV9tZWNoKTogCisJZml4ZWQgdXNhZ2Ugb2YgX2RidXNfYXBwZW5kX2Rlc2lyZWRfaWRlbnRpdHkoKQorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5oIChfZGJ1c191c2VybmFtZV9mcm9tX2N1cnJlbnRfcHJvY2Vzcyk6IHJlbW92ZWQgcHJvdG90eXBlCisKKzIwMDctMDYtMTQgIFJhbGYgSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisgICAgCisJKiBkYnVzL2RidXMtc3lzZGVwcy5jOiBtb3ZlZCBnbG9iYWwgbG9jayBzeXN0ZW1fdXNlcnMgZnJvbSBkYnVzLXVzZXJkYi5jCisKKzIwMDctMDYtMTQgIFJhbGYgSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisgICAgCisJKiBnbG9iYWwgcmVuYW1lIG9mIGZ1bmN0aW9uIF9kYnVzX3VzZXJuYW1lX2Zyb21fY3VycmVudF9wcm9jZXNzCisJdG8gX2RidXNfYXBwZW5kX2Rlc2lyZWRfaWRlbnRpdHkuIAorCUFwcHJvdmVkIGJ5IEhhdm9jIFBlbm5pbmd0b24KKworMjAwNy0wNi0xNCAgUmFsZiBIYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMtd2luLmM6IGRpc2FibGVkIERCdXNVc2VySW5mbyByZWxhdGVkIGNvZGUKKwkJKF9kYnVzX2FwcGVuZF9kZXNpcmVkX2lkZW50aXR5LAlfZGJ1c193aW5kb3dzX3VzZXJfaXNfcHJvY2Vzc19vd25lcik6CisgICAgCQluZXcgd2luMzIgZnVuY3Rpb25zIGFzIGNvdW50ZXJwYXJ0IG9mIHVuaXggcmVsYXRlZCAKKwkJKF9kYnVzX3NlbmRfY3JlZGVudGlhbHNfc29ja2V0LF9kYnVzX3JlYWRfY3JlZGVudGlhbHNfc29ja2V0KTogCisJICAgIAlyZW5hbWVkIGZyb20gLi4uX3VuaXhfc29ja2V0CisJCShfZGJ1c19zZW5kX2NyZWRlbnRpYWxzX3VuaXhfc29ja2V0KTogcmVtb3ZlZCBvYnNvbGF0ZSBmdW5jdGlvbgorCQorCSogZGJ1cy9kYnVzLXN5c2RlcHMtd2luLXV0aWwuYzogZGlzYWJsZWQgREJ1c0dyb3VwSW5mbyByZWxhdGVkIGNvZGUKKwkJKF9kYnVzX3ZlcmlmeV9kYWVtb25fdXNlcixfZGJ1c19jaGFuZ2VfdG9fZGFlbW9uX3VzZXIpOiAKKwkJICAgIG5ldyB3aW4zMiBmdW5jdGlvbnMgYXMgY291bnRlcnBhcnQgb2YgdW5peCByZWxhdGVkCisJCisyMDA3LTA2LTE0ICBTaW1vbiBNY1ZpdHRpZSAgPHNpbW9uLm1jdml0dGllQGNvbGxhYm9yYS5jby51az4KKworCSogZG9jL2RidXMtc3BlY2lmaWNhdGlvbi54bWw6IHNheSB0aGUgcHJvdG9jb2wgdmVyc2lvbiBpcyAxIGluc3RlYWQgb2YKKwkwIChwYXRjaCBmcm9tIEtyaXN0b2ZmZXIgTHVuZMOpbiwgZmQubyMxMDAzMykgYW5kIHJlbW92ZSB0aGUgRklYTUUKKwlhYm91dCByZW1vdmluZyBwcm90b2NvbCB2ZXJzaW9uIGZyb20gbWVzc2FnZXMgKGFzIHBlciBIYXZvYydzIGNvbW1lbnQKKwlvbiB0aGF0IGJ1ZykKKworMjAwNy0wNi0xNCAgUmFsZiBIYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMtd2luLmMgKF9kYnVzX3BpZF9mb3JfbG9nLF9kYnVzX2ZsdXNoX2NhY2hlcyk6IAorCW5ldyB3aW4zMiBmdW5jdGlvbnMgYXMgY291bnRlcnBhcnQgb2YgdW5peCByZWxhdGVkCisKKzIwMDctMDYtMTQgIFJhbGYgSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisJCisJKiBjbWFrZS9tb2R1bGVzL0ZpbmRLREVXSU4uY21ha2UsCisJICBjbWFrZS9tb2R1bGVzL0ZpbmRLREVXSU5fUGFja2FnZXIuY21ha2UsIAorCSAgY21ha2UvbW9kdWxlcy9XaW4zMk1hY3Jvcy5jbWFrZTogbmV3IGZpbGVzIGZyb20gdGhlIAorCSAga2Rld2luMzIgcHJvamVjdAorCSogY21ha2UvQ01ha2VMaXN0cy50eHQ6IGNsZWFuZWQgc3VwcG9ydCBmb3Iga2Rld2luIGluc3RhbGxlciBhbmQgCisJICB3aW4zMiBleHBsb3JlciB3cmFwcGVyCisKKzIwMDctMDYtMTMgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCQorCSogZGJ1cy9kYnVzLW1lc3NhZ2UuYyAoZGJ1c19tZXNzYWdlX2l0ZXJfb3Blbl9jb250YWluZXIpOiBGaXgKKwlicm9rZW4gcmV0dXJuX2lmX2ZhaWwgKGtpbmQgb2Ygc2NhcnkgdGhhdCB0ZXN0IHN1aXRlIGRvZXMgbm90CisJY292ZXIgdGhpcykKKworMjAwNy0wNi0xMyAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1zZXJ2ZXItc29ja2V0LmMgKF9kYnVzX3NlcnZlcl9saXN0ZW5fc29ja2V0KTogc3VwcG9ydAorCWFsbF9pbnRlcmZhY2VzPXRydWV8ZmFsc2UgZm9yIHRjcCBzZXJ2ZXJzCisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLXVuaXguYyAoX2RidXNfbGlzdGVuX3RjcF9zb2NrZXQpOiBzdXBwb3J0CisJaW5hZGRyX2FueSBmbGFnCisKKwkqIGJ1cy9zZWxpbnV4LmM6IGZpeCBzb21lIG1pc3NpbmcgaW5jbHVkZXMKKworCSogZGJ1cy9kYnVzLXNlcnZlci1zb2NrZXQuYyAoX2RidXNfc2VydmVyX2xpc3Rlbl9zb2NrZXQpOiBhbGxvdworCXBvcnQgdG8gc2ltcGx5IGJlIG9taXR0ZWQgaW4gYWRkaXRpb24gdG8gc3BlY2lmeWluZyAwCisKKzIwMDctMDYtMTMgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBjb25maWd1cmUuYWMsIGJ1cy9zZWxpbnV4LmMsIGRidXMvZGJ1cy1zeXNkZXBzLXVuaXgtdXRpbC5jOiBhZGQKKwlsaWJhdWRpdCBzdXBwb3J0LCBubyBjbHVlIHdoYXQgdGhpcyBtZWFucyByZWFsbHkgYnV0IG5vdyB3ZSBoYXZlCisJaXQuIFBhdGNoZXMgZnJvbSBGZWRvcmEgcGFja2FnZS4KKworCSogYnVzL2J1cy5jIChidXNfY29udGV4dF9uZXcpOiBtb3ZlIHNlbGludXggaW5pdGlhbGl6YXRpb24gYWZ0ZXIKKwljaGFuZ2luZyB0byBkYWVtb24gdXNlciwgcGF0Y2ggZnJvbSBGZWRvcmEgcGFja2FnZQorCisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LmMgKGF1dGhfdmlhX3VuaXhfdXNlcl9mdW5jdGlvbik6IGZpeCBhIHR5cG8KKworMjAwNy0wNi0xMiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1tZXNzYWdlLmMgKGRidXNfbWVzc2FnZV9pdGVyX29wZW5fY29udGFpbmVyKTogaW1wcm92ZQorCXRoZSBjaGVja3Mvd2FybmluZ3MgZm9yIGNvbnRhaW5lZF9zaWduYXR1cmUgYSBiaXQKKworMjAwNy0wNi0xMiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisJCisJKiBkYnVzL2RidXMtbWFyc2hhbC1yZWN1cnNpdmUuYyAod3JpdGVfb3JfdmVyaWZ5X3R5cGVjb2RlKToKKwlpbXByb3ZlIHRoZSB3YXJuaW5nIGEgYml0IGlmIHlvdSB3cml0ZSBleHRyYSBkYXRhIGludG8gYSBtZXNzYWdlCisKKzIwMDctMDYtMTIgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtYXV0aC5jIChzaGExX2hhbmRsZV9zZWNvbmRfY2xpZW50X3Jlc3BvbnNlKQorCShoYW5kbGVfc2VydmVyX2RhdGFfYW5vbnltb3VzX21lY2gpOiBhZGQgdGhlIHByb2Nlc3MgSUQgZnJvbQorCXNvY2tldCBjcmVkZW50aWFscywgaWYgYXZhaWxhYmxlLCBldmVuIGlmIG5vdCB1c2luZyBFWFRFUk5BTAorCisJKiBkYnVzL2RidXMtdHJhbnNwb3J0LmMgKGF1dGhfdmlhX2RlZmF1bHRfcnVsZXMpOiBzdXBwb3J0CisJYWxsb3dfYW5vbnltb3VzIGZsYWcKKworCSogZGJ1cy9kYnVzLWNvbm5lY3Rpb24uYyAoZGJ1c19jb25uZWN0aW9uX2dldF9pc19hbm9ueW1vdXMpCisJKGRidXNfY29ubmVjdGlvbl9zZXRfYWxsb3dfYW5vbnltb3VzKTogbmV3IEFQSSBmb3IgY29udHJvbGxpbmcKKwlhbm9ueW1vdXMgYWNjZXNzCisKKzIwMDctMDYtMDkgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtc3RyaW5nLmMgKF9kYnVzX3N0cmluZ19wb3BfbGluZSk6IGZpeCB0aGlzIG5vdCB0bworCXRoaW5rIGFuIGVtcHR5IGxpbmUgaXMgdGhlIGVuZCBvZiB0aGUgZmlsZS4KKwlBbHNvLCBmaXggc29tZSB3aGl0ZXNwYWNlLgorCisJKiBkYnVzL2RidXMtc3RyaW5nLXV0aWwuYzogYWRkIG1vcmUgdGVzdHMgZm9yCisJX2RidXNfc3RyaW5nX3BvcF9saW5lKCkgcmV2ZWFsaW5nIHRoYXQgaXQgdGhpbmtzIGFuIGVtcHR5IGxpbmUgaXMKKwl0aGUgZW5kIG9mIHRoZSBmaWxlLCB3aGljaCBicm9rZSBkYnVzLWF1dGgtc2NyaXB0LmMgc28gCisJaXQgZGlkbid0IHJlYWxseSBydW4gdGhlIHNjcmlwdHMKKworCSogZGJ1cy9kYnVzLWF1dGguYzogYWRkIEFOT05ZTU9VUyBtZWNoYW5pc20KKworCSogZGJ1cy9kYnVzLWF1dGgtc2NyaXB0LmMgKF9kYnVzX2F1dGhfc2NyaXB0X3J1bik6IGZpeCB0byBkZXRlY3QKKwlhbiBlbXB0eS9uby1vcCBhdXRoIHNjcmlwdDsgYWRkIGNvbW1hbmRzIHRvIGNoZWNrIHRoYXQgd2UgaGF2ZSBvcgorCWRvbid0IGhhdmUgdGhlIGV4cGVjdGVkIGNyZWRlbnRpYWxzCQorCisyMDA3LTA2LTA5ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogYnVzL3BvbGljeS5jIChidXNfcG9saWN5X2NyZWF0ZV9jbGllbnRfcG9saWN5KTogZ3JhY2VmdWxseQorCWNvbnRpbnVlIGlmIHRoZSBjb25uZWN0aW9uIGhhcyBubyB1bml4IHVzZXIgLSBqdXN0IGRvbid0IGFwcGx5IAorCWFueSB1bml4IHVzZXIgZGVwZW5kZW50IHJ1bGVzLgorCisJKiBidXMvY29uZmlnLXBhcnNlci5jOiByZW1vdmUgZGJ1cy11c2VyZGIuaCB1c2FnZQorCisJKiBidXMvYnVzLmM6IHJlbW92ZSBkYnVzLXVzZXJkYi5oIHVzYWdlCisKKwkqIGRidXMvZGJ1cy10cmFuc3BvcnQuYyAoX2RidXNfdHJhbnNwb3J0X2dldF9pc19hdXRoZW50aWNhdGVkKToKKwlzdXBwb3J0IFdpbmRvd3MgdXNlciBmdW5jdGlvbjsgYWxzbywgZml4IHRoZSBsb2dpYyBmb3IgY2hlY2tpbmcKKwlhdXRoIGFzIHJvb3QgaW4gdGhlIGRlZmF1bHQgYXV0aCBjb2RlIChicm9rZW4gaW4gdGhlIHByZXZpb3VzCisJY29tbWl0KQorCisJKiBkYnVzL2RidXMtY29ubmVjdGlvbi5jCisJKGRidXNfY29ubmVjdGlvbl9zZXRfd2luZG93c191c2VyX2Z1bmN0aW9uKTogbmV3IGZ1bmN0aW9uCisJKGRidXNfY29ubmVjdGlvbl9nZXRfd2luZG93c191c2VyKTogbmV3IGZ1bmN0aW9uCisKKzIwMDctMDYtMDkgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBidXMvZGlzcGF0Y2guYyAoY2hlY2tfZ2V0X2Nvbm5lY3Rpb25fdW5peF9wcm9jZXNzX2lkKTogYWRhcHQKKwlzaW5jZSBzeXNkZXBzLXVuaXguaCBzdHVmZiBpc24ndCBpbmNsdWRlZCBhbnltb3JlCisKKwkqIGJ1cy9idXMuYyAoYnVzX2NvbnRleHRfbmV3KTogdXNlIG1vcmUgYWJzdHJhY3QgZnVuY3Rpb25zIHRvCisJY2hhbmdlIHVzZXIsIHNvIHRoZXkgY2FuIGJlIG5vLW9wcyBvbiBXaW5kb3dzCisKKwkqIGRidXMvZGJ1cy1jcmVkZW50aWFscy5jLCBkYnVzL2RidXMtY3JlZGVudGlhbHMuaCwKKwlkYnVzL2RidXMtY3JlZGVudGlhbHMtdXRpbC5jOiBuZXcgZmlsZXMgY29udGFpbmluZyBhIGZ1bGx5IG9wYXF1ZQorCURCdXNDcmVkZW50aWFscyBkYXRhIHR5cGUgdG8gcmVwbGFjZSB0aGUgb2xkIG5vdCBvcGFxdWUgb25lLgorCisJKiBjb25maWd1cmUuaW4gKERCVVNfVU5JWCk6IGRlZmluZSBEQlVTX1VOSVggdG8gbWF0Y2ggREJVU19XSU4gb24KKwl3aW5kb3dzCisKKwkqIGRidXMvZGJ1cy11c2VyZGIuaDogcHJvaGliaXQgb24gV2luZG93cywgbmV4dCBzdGVwIGlzIHRvIGNsZWFuCisJdXAgdGhlIHVzZXMgb2YgaXQgaW4gYnVzLyouYyBhbmQgZmFjdG9yIG91dCB0aGUgcGFydHMgb2YgCisJY29va2llIGF1dGggdGhhdCBkZXBlbmQgb24gaXQKKwkKKzIwMDctMDYtMDcgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkYnVzL2RidXMtbWVzc2FnZS5jOiBpbXByb3ZlIHNvbWUgZG9jcyByZWxhdGVkIHRvIHJlYWRpbmcgdmFsdWVzCisJZnJvbSBhIG1lc3NhZ2UgaXRlcgorCisyMDA3LTA2LTAyICBSYWxmIEhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiBjbWFrZTogYWRkZWQgY3lnd2luIGNvbXBpbGUgc3VwcG9ydAorCisyMDA3LTA2LTAxICBSYWxmIEhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiB0b29scy9kYnVzLWxhdW5jaC13aW4uYzogbmV3IGZpbGUsIHJlcGxhY2VzIHNjcmlwdCB3cmFwcGVyIG9uIHdpbjMyLgorCisJKiBjbWFrZS9kYnVzLWxhdW5jaC5iYXQuY21ha2U6IHJlbW92ZWQgb2Jzb2xhdGUgZmlsZQorCisyMDA3LTA1LTMxICBSYWxmIEhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiBidXMvbWFpbi5jIChtYWluKTogdXNlcyBfZGJ1c19nZXRfY29uZmlnX2ZpbGVfbmFtZSgpIHRvIGRldGVjdCAKKwlzZXNzaW9uLmNvbmYgbG9jYXRpb24gb24gd2luMzIuIAorCisJKiBkYnVzLXN5c2RlcHMtd2luLmggKF9kYnVzX2dldF9jb25maWdfZmlsZV9uYW1lLF9kYnVzX2ZpbGVfZXhpc3RzKTogCisJbmV3IHByb3RvdHlwLCB1bmRlZmluZWQgaW50ZXJmYWNlIGFmdGVyIGluY2x1ZGluZyB3aW5kb3dzLmggYmVjYXVzZSAKKwlpdCBtYWtlcyB0cm91YmxlIHdoZW4gYSBwYXJhbWF0ZXIgaXMgbmFtZWQgaW50ZXJmYWNlLgorCisJKiBkYnVzLXN5c2RlcHMtd2luLmMgKF9kYnVzX2dldF9pbnN0YWxsX3Jvb3QsCisJX2RidXNfZ2V0X2NvbmZpZ19maWxlX25hbWUsX2RidXNfZmlsZV9leGlzdHMpOiAJbmV3IGZ1bmN0aW9ucy4KKworMjAwNy0wNS0yNyAgUmFsZiBIYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogYnVzL3BvbGljeS5jLGRidXMvZGJ1cy1pbnRlcm5hbHMuYzogZml4ZWQgaW5jb25zaXN0YW50IGxpbmUgZW5kaW5ncyAKKwlhcyByZXBvcnRlZCBieSBQZXRlciBLw7xtbWVsLgorCisyMDA3LTA1LTI1ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBSZWxlYXNlZCAxLjEuMAorCisyMDA3LTA1LTI1ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBTcGxpdCBORVdTIGFuZCBDaGFuZ2VMb2cgaW50byBhIC5wcmUtMS0wIGZpbGUgYXMgcGVyIEhBQ0tJTkcKKwlXZSBmb3Jnb3QgdG8gZG8gdGhpcyBkdXJpbmcgdGhlIDEuMCByZWxlYXNlIGFuZCBpdCBtYWtlcyBzZW5zZQorCW5vdyBhcyB3ZSBnZXQgcmVhZHkgdG8gcmVsZWFzZSB0aGUgZmlyc3QgMS4xLjAgZGV2ZWxvcG1lbnQgdGFyYmFsbAorCisyMDA3LTA1LTI1ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBjcmVhdGUgZGlyZWN0b3J5IHRlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMvc2Vzc2lvbi5kIHNvIHRoYXQKKwltYWtlIGNoZWNrIHBhc3NlcworCisyMDA3LTA1LTI1ICBKb2huIChKNSkgUGFsbWllcmkgIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBJTlNUQUxMOiByZW1vdmUgZGVwZW5kYW5jaWVzIGZvciBiaW5kaW5ncyBzaW5jZSB0aGV5IG5vIGxvbmdlcgorCWFyZSBhIHBhcnQgb2YgY29yZQorCisyMDA3LTA1LTI1ICBSYWxmIEhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiBkYnVzL2RidXMtc2VydmVyLXdpbi5jLGRidXMvZGJ1cy1zZXJ2ZXItd2luLmg6IG5ldyBmaWxlIAorCXdpdGggZW1wdHkgZnVuY3Rpb24gX2RidXNfc2VydmVyX2xpc3Rlbl9wbGF0Zm9ybV9zcGVjaWZpYygpLiAKKworCSogZGJ1cy9kYnVzLXNlcnZlci5jIChsaXN0ZW5fZnVuY3MpOiB1c2VzIAorCV9kYnVzX3NlcnZlcl9saXN0ZW5fcGxhdGZvcm1fc3BlY2lmaWMgb24gYW55IHBsYXRmb3JtLgorCisyMDA3LTA1LTI1ICBSYWxmIEhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy13aW4uYyAoZmlsbF93aW5fdXNlcl9pbmZvX2hvbWVkaXIpOiBub3QgZ2V0dGluZyAKKwl1c2VyIGluZm8gZnJvbSBhIGRvbWFpbiBjb250cm9sbGVyIGlzbid0IGFuIGVycm9yLCB0aGUgY29tcHV0ZXIgCisJbWF5IHJ1biBpbiBhIG5vbiBkb21haW4gY29udGV4dC4gCisKKzIwMDctMDUtMjUgIFJhbGYgSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLXdpbi5jIChfZGJ1c19mdWxsX2R1cGxleF9waXBlKTogZml4ZWQgYXNzZXJ0YXRpb24uCisKKzIwMDctMDUtMjQgIFNpbW9uIE1jVml0dGllICA8c2ltb24ubWN2aXR0aWVAY29sbGFib3JhLmNvLnVrPgorCisJKiBidXMvY29uZmlnLXBhcnNlci5jICh0ZXN0X3NlcnZpY2VfZGlyX21hdGNoZXMpOiBmaXhlZCBvcmRlcmluZyBmb3IgdW5peC4KKworCSogYnVzL2NvbmZpZy1wYXJzZXIuYyAodGVzdF9kZWZhdWx0X3Nlc3Npb25fc2VydmljZWRpcnMpOiBtYWRlIGFsbG9jYXRpb24gCisJb2YgX3Byb2dzIHBsYXRmb3JtIGluZGVwZW5kZW50LgorCisyMDA3LTA1LTIzICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogYnVzL01ha2VmaWxlLmFtIChpbnN0YWxsLWRhdGEtaG9vayk6IGNyZWF0ZSBzZXNzaW9uLmQKKworCSogYnVzL3Nlc3Npb24uY29uZi5pbjogYWRkIHNlc3Npb24uZCBmb3IgdGhlIHNlc3Npb24gYnVzLCBzbworCXNlY3VyaXR5IHBvbGljeSBjYW4gYmUgZXh0ZW5kZWQKKworMjAwNy0wNS0yMiBSYWxmLkhhYmFja2VyIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIGNtYWtlL0NNYWtlTGlzdHMudHh0OiBmaXhlZCBjcmVhdGluZyBvZiBURVNUXy4uLl9CSU5BUlkgdG8gbWFrZSAKKwlidXMtdGVzdCBhYmxlIHRvIGZpbmQgdGhlIGJpbmFyaWVzLgorCisyMDA3LTA1LTIxIFNpbW9uIE1jVml0dGllICA8c2ltb24ubWN2aXR0aWVAY29sbGFib3JhLmNvLnVrPgorCisJKiBhY2luY2x1ZGUubTQsIGNvbmZpZ3VyZS5pbjogSW4gcmVjZW50IGF1dG90b29scywgJHtkYXRhZGlyfSBpcworCWRlZmluZWQgaW4gdGVybXMgb2YgJHtkYXRhcm9vdGRpcn0sIHNvIEVYUEFOREVEX0RBVEFESVIgbmVlZHMgdG8gYmUKKwlleHBhbmRlZCByZWN1cnNpdmVseS4gUmF0aGVyIHRoYW4gZml4aW5nIGNvbmZpZ3VyZS5pbiB0byBkbyB0aGlzLCBJCisJZ3JhYmJlZCB0aGUgQVNfQUNfRVhQQU5EIG1hY3JvIGZyb20gYXV0b3N0YXJzLnNmLm5ldCwgd2hpY2ggc2VlbXMgdG8gYmUKKwljb21tb25seSB1c2VkLgorCisyMDA3LTA1LTIxIFNpbW9uIE1jVml0dGllICA8c2ltb24ubWN2aXR0aWVAY29sbGFib3JhLmNvLnVrPgorCisJKiB1cGRhdGUtZGJ1cy1kb2NzLnNoOiBBc3NvcnRlZCBpbXByb3ZlbWVudHM6CisJLSBEZWZhdWx0IHVzZXIgaWYgJEZEVVNFUiBpcyBub3Qgc2V0IGlzIHRoZSBzc2ggZGVmYXVsdAorCSAgKHNldCBpbiB+Ly5zc2gvY29uZmlnIG9yIGJhc2VkIG9uIHRoZSBsb2NhbCB1c2VybmFtZSksIG5vdCBhCisJICBoYXJkLWNvZGVkICJqb2hucCIKKwktIFRlbXBvcmFyeSBjaGVja291dCBkaXJlY3RvcnkgaXMgY3JlYXRlZCBzZWN1cmVseSAocHJldmVudGluZyBzeW1saW5rCisJICBhdHRhY2tzKSwgaWYgbWt0ZW1wKDEpIGlzIGF2YWlsYWJsZQorCS0gVXNlIG1ha2UgLUMgcmF0aGVyIHRoYW4gY2QgJiYgbWFrZSAmJiBjZCAuLgorCisyMDA3LTA1LTIxIFNpbW9uIE1jVml0dGllICA8c2ltb24ubWN2aXR0aWVAY29sbGFib3JhLmNvLnVrPgorCisJKiBIQUNLSU5HOiBQb2ludCB0byBjb3JyZWN0IG1haWxpbmcgbGlzdAorCisyMDA3LTA1LTIxIFNpbW9uIE1jVml0dGllICA8c2ltb24ubWN2aXR0aWVAY29sbGFib3JhLmNvLnVrPgorCisJKiBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnhtbDogZXhwbGljaXRseSBzcGVjaWZ5IHRoYXQgU1RSSU5HIGNhbm5vdAorCWNvbnRhaW4gZW1iZWRkZWQgTlVMcy4KKworMjAwNy0wNS0yMCBSYWxmLkhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiBkYnVzL2RidXMtaW50ZXJuYWwuYzogZml4IGlubGluZSBwcm9ibGVtIG9uIHdpbjMyLgorCisyMDA3LTA1LTIwIFJhbGYuSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLXdpbi5jIChmaWxsX3dpbl91c2VyX2luZm9faG9tZWRpcik6IG5vdCByZWFjaGluZyAKKwlkb21haW4gY29udHJvbGxlciBpc24ndCBhbiBlcnJvciwgY29udmVydGVkIGVycm9yIG1lc3NhZ2UgdG8gdmVyYm9zZSAKKwltZXNzYWdlLgorCisyMDA3LTA1LTE5IFJhbGYuSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIGRidXMvZGJ1cy10ZXN0LmMgKGRidXNfaW50ZXJuYWxfZG9fbm90X3VzZV9ydW5fdGVzdHMpOiBkaXNhYmxlZCAKKwl0ZXN0cyBub3QgcnVubmluZyBvbiB3aW5jZS4KKworMjAwNy0wNS0xOSBSYWxmLkhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiBkYnVzL2RidXMtaW50ZXJuYWxzLmMgKF9kYnVzX3ZlcmJvc2VfaW5pdCk6IHdpbjMyIHJlcXVpcmVzICd2YXJuYW1lPScgCisJdG8gdW5zZXQgYSBlbnZpcm9ubWVudCB2YXJpYWJsZS4gCisKKzIwMDctMDUtMTkgUmFsZi5IYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYyAoX2RidXNfc2V0ZW52KTogd2luMzIgcmVxdWlyZXMgJ3Zhcm5hbWU9JyAKKwl0byB1bnNldCBhIGVudmlyb25tZW50IHZhcmlhYmxlLiAKKworMjAwNy0wNS0xOSBSYWxmLkhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiBidXMvcG9saWN5LmMgKGJ1c19wb2xpY3lfY3JlYXRlX2NsaWVudF9wb2xpY3kpOiAKKwl3aW4zMiB0ZW1wb3JhcnkgZml4IHVudGlsIHRoZSB1c2VyZGIgc3R1ZmYgaXMgcG9ydGVkIGNvbXBsZXRseS4KKworMjAwNy0wNS0xOSAgUmFsZi5IYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogZGJ1cy9kYnVzLXNlcnZlci5jIChsaXN0ZW5fZnVuY3MpOiAKKwlfZGJ1c19zZXJ2ZXJfbGlzdGVuX3BsYXRmb3JtX3NwZWNpZmljIGlzIGVtcHR5IG9uIHdpbjMyLCAKKwlsaW1pdGVkIHRvIHVuaXggb25seS4KKworCSogZGJ1cy9kYnVzLXNlcnZlci5jICh2YWxpZF9hZGRyZXNzZXMpOiBsaW1pdCB1bml4IAorCW9ubHkgYWRkcmVzc2VzIHRvIHVuaXguIAorCisyMDA3LTA1LTE4ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZG9jL2RidXMtc3BlY2lmaWNhdGlvbi54bWw6IGFkZCBhIEdldEFsbCB0byB0aGUgUHJvcGVydGllcworCWludGVyZmFjZS4KKworMjAwNy0wNS0xNyBSYWxmLkhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorIAorCSogYnVzXGNvbmZpZy1wYXJzZXIuYyAodGVzdF9kZWZhdWx0X3Nlc3Npb25fc2VydmljZWRpcnMpOgorCXdpbjMyIGZpeC4KKworMjAwNy0wNS0xNyBSYWxmLkhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorIAorCSogY29uZmlndXJlLmluOiBkZWZpbmUgY29uc3RhbnQgREJVU19VTklYLgorCisyMDA3LTA1LTE0ICBSYWxmIEhhYmFja2VyIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLXdpbi5jIChfZGJ1c19wcmludGZfc3RyaW5nX3VwcGVyX2JvdW5kKToKKwljb21waWxlIGZpeCBmb3IgTVMgUGxhdGZvcm0gU0RLIDYgCisJcGF0Y2ggZnJvbSBNaWNoYWVsIEx1c2NoYXMgPG1sdXNjaGFzQGdtYWlsLmNvbT4KKworMjAwNy0wNS0xMCAgSm9obiAoSjUpIFBhbG1pZXJpIDxqb2hucEByZWRoYXQuY29tPgorCisJKiBkYnVzLTEucGMuaW46IGFkZCBkYWVtb25kaXIgdG8gcGMgZmlsZQorCXBhdGNoIGZyb20gQnJpYW4gQ2FtZXJvbiA8YnJpYW4uY2FtZXJvbiBhdCBzdW4uY29tPgorCisyMDA3LTA1LTA0ICBTaW1vbiBNY1ZpdHRpZSA8c2ltb24ubWN2aXR0aWVAY29sbGFib3JhLmNvLnVrPgorCisJKiBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnhtbDogbWVudGlvbiB0aGUgcmVzZXJ2ZWQgby5mZC5EQnVzLkxvY2FsCisJaW50ZXJmYWNlIGFuZCB0aGUgY29ycmVzcG9uZGluZyAvby9mZC9EQnVzL0xvY2FsIG9iamVjdCBwYXRoOworCWRlc2NyaWJlIHRoZW0gYXMgcmVzZXJ2ZWQgYW5kIGZvcmJpZCB1c2luZyB0aGVtIGluIGEgc2VudCBtZXNzYWdlLAorCW1lbnRpb25pbmcgdGhhdCBpbiB0aGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHRoaXMgd2lsbCBjYXVzZSB0aGUKKwljb25uZWN0aW9uIHRvIGJlIGRyb3BwZWQuIFBhdGNoIGFwcHJvdmVkIGJ5IEhhdm9jLgorCisyMDA3LTA0LTI4ICBSYWxmIEhhYmFja2VyIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIGNtYWtlLzogZG9uJ3QgaW5zdGFsbCB0ZXN0IGFwcGxpY2F0aW9ucyBhbmQgc2VydmljZSBmaWxlcywKKwltb3ZlZCBDTUFLRV9ERUJVR19QT1NURklYIHRvIHRvcCBsZXZlbCBDTWFrZUxpc3RzLnR4dAorCisyMDA3LTA0LTI3ICBIYXZvYyBQZW5uaW5ndG9uICA8aHBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMtdW5peC5jIChfZGJ1c19vcGVuX3NvY2tldCk6IGZpeCAjMTA3ODEgZnJvbQorCVRvYmlhcyBOeWdyZW4sIGNoZWNraW5nIHBvaW50ZXIgdG8gZmQgdnMuIDAgcmF0aGVyIHRoYW4gY2hlY2tpbmcKKwl0aGUgZmQgaXRzZWxmCisKKzIwMDctMDQtMjYgUmFsZiBIYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogY21ha2UvOiBhZGRlZCBkZWJ1ZyBwb3N0Zml4ZXMgdG8gZGVidWcgZXhlJ3MgZm9yIAorCWVhc2llciBkZWJ1Z2dpbmcuCisJKiBkYnVzXGRidXMtc3lzZGVwcy13aW4uYyAoX2RidXNfd2luX3NldF9lcnJvcl9mcm9tX3dpbl9lcnJvcik6IAorCXByaW50IGVycm9yIGNvZGUgaW4gY2FzZSBubyBzdHJpbmcgbWVzc2FnZSBpcyBhdmFpbGFibGUuCisKKzIwMDctMDQtMDYgU2ltb24gTWNWaXR0aWUgPHNpbW9uLm1jdml0dGllQGNvbGxhYm9yYS5jby51az4KKworCSogZGJ1cy9kYnVzLW1lc3NhZ2UtdXRpbC5jLCBkYnVzL2RidXMtbWVzc2FnZS5jLAorCWRidXMvZGJ1cy1tZXNzYWdlLmg6IEFkZCBBUEkgdG8gY29udmVydCBhIERCdXNNZXNzYWdlIHRvL2Zyb20gYQorCWJ5dGUgYXJyYXkuIFBhdGNoIGZyb20gRGFmeWRkIEhhcnJpZXMgPGRhZnlkZC5oYXJyaWVzQGNvbGxhYm9yYS5jby51az4sCisJYXBwcm92ZWQgYnkgSGF2b2MgUGVubmluZ3Rvbi4KKworMjAwNy0wNC0wMyAgVGltbyBIb2VuaWcgIDx0aG9lbmlnQHN1c2UuZGU+CisKKwkqIGRidXMvZGJ1cy1hZGRyZXNzLmMgKGRidXNfcGFyc2VfYWRkcmVzcyk6IERvIG5vdCBhY2NlcHQgemVyby0KKwkgIGxlbmd0aCBhZGRyZXNzLgorCSogZGJ1cy9kYnVzLWFkZHJlc3MuYyAoX2RidXNfYWRkcmVzc190ZXN0KTogQWRkIHRlc3QgZm9yIHplcm8tCisJICBsZW5ndGggYWRkcmVzcy4KKworMjAwNy0wMy0yNSBSYWxmLkhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiBjbWFrZS9kYnVzL0NNYWtlTGlzdHMudHh0OiBkZWJ1ZyBwb3N0Zml4IGFsc28gZm9yIG1pbmd3LgorCisyMDA3LTAzLTE2IFJhbGYuSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIGNtYWtlL21vZHVsZXMvRmluZEV4cGF0LmNtYWtlOiBmaXggcGFja2FnZSBkZXRlY3Rpb24gb24gd2luMzIuCisKKwkqIFJFQURNRS53aW46IHVwZGF0ZSBpbnN0YWxsIGluc3RydWN0aW9ucy4gCisKKzIwMDctMDMtMTYgUmFsZi5IYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuaCAoX2RidXNfc3BsaXRfcGF0aHNfYW5kX2FwcGVuZCk6CisJbmV3IHByb3RvdHlwCisJKF9EQlVTX1BBVEhfU0VQQVJBVE9SKTogbmV3IG1hY3JvLiAKKworCSogZGJ1cy9kYnVzLXN5c2RlcHMuYyAoX2RidXNfc3BsaXRfcGF0aHNfYW5kX2FwcGVuZCk6IG1lcmdlZCAKKwlmcm9tIGRidXMvZGJ1cy1zeXNkZXBzLXVuaXguYyBhbmQgZGJ1cy9kYnVzLXN5c2RlcHMtd2luLmMuIAorCisyMDA3LTAzLTE1IFJhbGYuSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIGJ1cy9jb25maWctcGFyc2VyLmMsIGJ1cy9wb2xpY3kuYywgIAorCWJ1cy9wb2xpY3kuaCwgYnVzL2RidXMtZGFlbW9uLjEuaW4sCisJYnVzL3Nlc3Npb24uY29uZi5pbjogYWRkZWQgZWF2ZXNkcm9wIHN1cHBvcnQgCisJZm9yIHJlcGxpZXMgLSBwYXRjaCBieSBvbGxpLnNhbGxpIGF0IGNvbGxhYm9yYS5jby51aworCWFwcHJvdmVkIGJ5IEhhdm9jIFBlbm5pbmd0b24uIAorCisyMDA3LTAzLTE1IFJhbGYuSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIGRidXNcZGJ1cy1zeXNkZXBzLXdpbi10aHJlYWQuYzogcmVuYW1lZCB0byAKKwlkYnVzLXN5c2RlcHMtdGhyZWFkLXdpbi5jLCBpdCBpcyBhIHBsYXRmb3JtIGRlcGVuZGluZyBmaWxlIAorCXNpbWlsYXIJdG8gZGJ1cy1zeXNkZXBzLXB0aHJlYWQuYy4KKworMjAwNy0wMy0xNSBSYWxmLkhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiBjbWFrZVxkb2NcQ01ha2VMaXN0cy50eHQ6IGFkZGVkIHByZWxpbWFyeSB4bWwgZG9jIAorCXN1cHBvcnQsIG5lZWRzIGNtYWtlIEZpbmQgc2NyaXB0LgorCisyMDA3LTAzLTE0IFJhbGYuSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIGNtYWtlOiBhZGQgZG94eWdlbiBzdXBwb3J0CisKKzIwMDctMDMtMTQgIFJhbGYuSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIGNtYWtlL2NvbmZpZy5oLmNtYWtlOiBXSU5DRSBmaXhlcywgZGVmaW5lZCBEQlVTX1VOSVguCisKKzIwMDctMDMtMTMgIFJhbGYuSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLXV0aWwtd2luLmMgKGRidXNfYmVjb21lX2RhZW1vbik6IAorCXdpbjMyIGNvbXBpbGUgZml4LiAKKworMjAwNy0wMy0xMyAgUmFsZi5IYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogZGJ1cy13aW4ucGF0Y2g6IHJlbW92ZWQgb2Jzb2xhdGUgcGF0Y2hlcy4gCisKKzIwMDctMDMtMTMgIFJhbGYuSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLXdpbi5jOiBhZGRlZCB6ZXJvIGJ5dGUgc2VuZGluZyAKKwlhbmQgcmVjZWl2aW5nIGFmdGVyIGNvbm5lY3Rpb24gc3RhcnQgdXAKKworMjAwNy0wMy0xMSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIHRvb2xzL2RidXMtbGF1bmNoLmMgKGRvX2Nsb3NlX3N0ZGVycik6IGZpeCBDODkgcHJvYmxlbSBhbmQKKwlmb3JtYXR0aW5nIHByb2JsZW0KKworCSogTW9zdGx5IGZpeCB0aGUgREJ1c1BpcGUgbWVzcy4KKwktIHB1dCBsaW5lIGJyZWFrIGFmdGVyIGZ1bmN0aW9uIHJldHVybiB0eXBlcworCS0gcHV0IHNwYWNlIGJlZm9yZSBwYXJlbnMKKwktIGRvIG5vdCBwYXNzIHN0cnVjdHMgYXJvdW5kIGJ5IHZhbHVlCisJLSBkb24ndCB1c2UgZGJ1c19zdHJlcnJvciBhZnRlciBjYWxsaW5nIHN1cHBvc2VkbHkgY3Jvc3MtcGxhdGZvcm0KKwlhcGkKKwktIGRvbid0IG5hbWUgcGlwZSB2YXJpYWJsZXMgImZkIgorCS0gYWJzdHJhY3Qgc3BlY2lhbCBmZCBudW1iZXJzIGxpa2UgLTEgYW5kIDEKKworMjAwNy0wMy0xMiAgUmFsZiBIYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMtd2luLmgsIGRidXMvZGJ1cy1zeXNkZXBzLXdpbi5jLCAKKwlkYnVzL2RidXMtc3lzZGVwcy11dGlsLXdpbi5jOiByZW5hbWVkIGZ1bmN0aW9ucyAKKwlfZGJ1c194eHhfZmlsZSgpIHRvIF9kYnVzX2ZpbGVfeHh4KCkgdG8gcmVmbGVjdCAKKwlzdHJ1Y3QgbmFtZSBEQnVzRmlsZS4gCisKKzIwMDctMDMtMTIgIFJhbGYgSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLXV0aWwtdW5peC5jIChfZGJ1c19iZWNvbWVfZGFlbW9uKToKKwlmaXggX2RidXNfcGlkX2ZkIGNoZWNrLiAKKworMjAwNy0wMy0xMCAgUmFsZiBIYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogdG9vbHMvZGJ1cy1wcmludC1tZXNzYWdlLmMgKHByaW50X21lc3NhZ2UpOgorCWFkZGVkIHByaW50aW5nIG9mIHRoZSByZXBseSBzZXJpYWwgdG8gbWV0aG9kIHJldHVybnMgYW5kIAorCWVycm9ycywgc28geW91IGNhbiBhY3R1YWxseSBmaWd1cmUgb3V0IHRoZSBtZXNzYWdlL3JlcGx5IAorCXBhaXJzIC0gcGF0Y2ggYnkgb2xsaS5zYWxsaSBhdCBjb2xsYWJvcmEuY28udWsuCisKKzIwMDctMDMtMTAgIFJhbGYgSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIGRidXMtd2luLnBhdGNoOiByZW1vdmVkIGNvbW1pdHRlZCBwYXRjaGVzLiAKKworMjAwNy0wMy0xMCAgUmFsZiBIYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogYnVzL2J1cy5jLCBidXMvYnVzLmgsIGJ1cy9tYWluLmMsIGJ1cy90ZXN0LmMsCisJZGJ1cy9kYnVzLXN5c2RlcHMtdW5peC5jLCBkYnVzL2RidXMtc3lzZGVwcy11dGlsLXVuaXguYywKKwlkYnVzL2RidXMtc3lzZGVwcy11dGlsLXdpbi5jLCBkYnVzL2RidXMtc3lzZGVwcy13aW4uYywKKwlkYnVzL2RidXMtc3lzZGVwcy5oOiByZW5hbWVkIF9kYnVzX3h4eF9waXBlIHRvIF9kYnVzX3BpcGVfeHh4LAorCWNvbXBsZXRlZCBfZGJ1c19waXBlIHN1cHBvcnQuIAorCisyMDA3LTAzLTEwICBSYWxmIEhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5oIChfZGJ1c19saXN0ZW5fdGNwX3NvY2tldCk6CisJY2hhbmdlZCB0eXBlIG9yIHBvcnQgdG8gcG9pbnRlciwgYmVjYXVzZSB0aGUgcG9ydCBpcyBnaXZlbiBiYWNrLgorCisJKiBkYnVzL2RidXMtc2VydmVyLXNvY2tldC5jIChfZGJ1c19zZXJ2ZXJfbmV3X2Zvcl90Y3Bfc29ja2V0KToKKwlpbXBsZW1lbnRlZCByZXR1cm5pbmcgdGNwIHBvcnQuIFNraXBwaW5nIHBvcnQgcGFyYW1ldGVyCisJYW5kIG5vbiBpbnRlZ2VyIHBvcnQgdmFsdWVzIGluIGNvbmZpZyA8bGlzdGVuPiBzdGF0ZW1lbnQKKwluZWVkcyBtb3JlIGVmZm9ydC4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMtdW5peC5jLCBkYnVzL2RidXMtc3lzZGVwcy13aW4uYworCShfZGJ1c19saXN0ZW5fdGNwX3NvY2tldCk6IHJldHVybiB0aGUgcmVhbCB1c2VkIHRjcCBwb3J0LgorCisJKiBidXMvZGJ1cy1kYWVtb24uMS5pbjogYWRkZWQgPGxpc3Rlbj4gdGNwIGV4YW1wbGVzCisKKzIwMDctMDMtMDkgIFJhbGYgSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIGNtYWtlL2NvbmZpZy5oLmNtYWtlOiB3aW4zMiBtc3ZjIGJ1ZyBmaXgKKworMjAwNy0wMy0wOSAgUmFsZiBIYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogY21ha2UvY29uZmlnLmguY21ha2U6IGZpeGVkIERCVVNfV0lOeHggZGVmaW5lcywKKwl1c2luZyBfV0lOQ0UgZG9lcyBub3Qgd29yay4KKworMjAwNy0wMy0wOCAgUmFsZiBIYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogZGJ1cy13aW4ucGF0Y2g6IHJlbW92ZWQgX2RidXNfd3JpdGVfcGlwZSgpIHBhdGNoLCBpdCBpcyBub3cgCisJY29tbWl0dGVkLgorCisyMDA3LTAzLTA4ICBSYWxmIEhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiBidXMvYnVzLmMsIGRidXMvZGJ1cy1zeXNkZXBzLXVuaXguYywgZGJ1cy9kYnVzLXN5c2RlcHMuaDoKKwlyZW5hbWUgcGlwZSByZWxhdGVkIHdyaXRlKCkgZnVuY3Rpb24gY2FsbHMgdG8gX2RidXNfd3JpdGVfcGlwZSgpLgorCisyMDA3LTAzLTA4ICBSYWxmIEhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiBkYnVzLXdpbi5wYXRjaDogYWRkZWQgYnVzL2NvbmZpZy1sb2FkZXItbGliZXhwYXQuYyBwYXRjaCwgCisJdXNlcyBEQlVTX1dJTiBmb3IgYWxscyB3aW4zMiByZWxhdGVkICNpZmRlZnMsIAorCXNvbWUgbWlub3IgY2xlYW51cHMKKworMjAwNy0wMy0wOCAgUmFsZiBIYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogZGJ1cy13aW4ucGF0Y2g6IHVwZGF0ZWQgcGF0Y2ggZm9yIGJ1cy9kaXNwYXRjaC5jLgorCisyMDA3LTAzLTA4ICBSYWxmIEhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiBkYnVzLXdpbi5wYXRjaDogZGJ1cy1jb25uZWN0aW9uLmMgKGRidXNfY29ubmVjdGlvbl9nZXRfdW5peF91c2VyLAorCWRidXNfY29ubmVjdGlvbl9nZXRfdW5peF9wcm9jZXNzX2lkKTogTGV0IHJldHVybiB0aGVtIHZhbGlkIHVzZXIgaWQncywgCisJb3RoZXJ3aXNlIGJ1cy10ZXN0IGZhaWxzLiBIb3cgdG8gcmVwbGFjZSBvbiB3aW4zMiA/LgorCQorCSogZGJ1cy9kYnVzLXN5c2RlcHMtd2luLmMgKGZpbGxfd2luX3VzZXJfaW5mb19ob21lZGlyKToKKwlmaXggbWVtb3J5IGxlYWsuCisKKzIwMDctMDMtMDggIFJhbGYgSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLXdpbi5jIChfZGJ1c193aW5fc2V0X2Vycm9yX2Zyb21fd2luX2Vycm9yKToKKwl1c2UgZGJ1cyBmcmllbmRseSBlcnJvciBuYW1lLgorCShmaWxsX3dpbl91c2VyX2luZm9faG9tZWRpcik6IHByaW50IHVzZXIgbmFtZSBpbiBlcnJvciBjYXNlIHRvby4KKworMjAwNy0wMy0wOCAgUmFsZiBIYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogY21ha2UvQ29uZmlndXJlQ2hlY2tzLmNtYWtlOiBmaXhlZCBzb2NrZXRwYWlyIGNoZWNrCisKKzIwMDctMDMtMDggIFJhbGYgSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIGJ1cy9kaXNwYXRjaC5jOiBkaXNhYmxlZCBzZWdmYXVsdCB0ZXN0IG9uIHdpbjMyIGZvciBub3cKKworMjAwNy0wMy0wOCAgUmFsZiBIYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogY29uZmlndXJlLmluLCBjbWFrZS9Db25maWd1cmVDaGVja3MuY21ha2U6IGFkZGVkIGNoZWNrIAorCWZvciBzZXRybGltaXQuIAorCSogdGVzdC90ZXN0LXNlZ2ZhdWx0LmM6IG9ubHkgaW5jbHVkZSBzZXRybGltaXQgc3R1ZmYgb25seSAKKwl3aGVuIGF2YWlsYWJsZS4gIAorCisyMDA3LTAzLTA3ICBSYWxmIEhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiB0ZXN0L3Rlc3Qtc2VnZmF1bHQuYzogdW5peCBjb21waWxlIGZpeC4KKwkqIGRidXMtd2luLnBhdGNoOiByZW1vdmVkIG9ic29sYXRlIHBhdGNoZXMuCisKKzIwMDctMDMtMDcgIFJhbGYgSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIGJ1cy9hY3RpdmF0aW9uLmM6IHJlbW92ZWQgb2Jzb2xhdGUgaW5jbHVkZSBoZWFkZXIuCisJKiB0ZXN0L3Rlc3Qtc2VnZmF1bHQuYzogd2luMzIgY29tcGlsZSBmaXgsIHJsaW1pdCAKKwlpc24ndCBhdmFpbGFibGUgb24gd2luMzIuCisJKiBkYnVzLXdpbi5wYXRjaDogcmVtb3ZlZCBzb21lIG1vcmUgcGF0Y2hlcywgdGhleQorCWFyZSBhcHBsaWVkIG9yIG9ic29sYXRlIAorCisyMDA3LTAzLTA2ICBSYWxmIEhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiBidXMtd2luLnBhdGNoOiBmaXhlcyB1bml4IGxpc3RlbiBwcm9ibGVtcywgZGJ1cy10ZXN0IAorCW5vdyBydW5zLgorCisyMDA3LTAzLTA2ICBSYWxmIEhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiBjbWFrZS9kYnVzL0NNYWtlTGlzdHMudHh0LGNtYWtlL2J1cy9DTWFrZUxpc3RzLnR4dCwKKwljbWFrZS9DTWFrZUxpc3RzLnR4dDogd2luMzIgY29tcGlsZSBmaXgKKworMjAwNy0wMy0wNCAgUmFsZiBIYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogZGJ1cy13aW4ucGF0Y2gsIFJFQURNRS53aW46IGFkZGVkIGF2YWlsYWJsZSB3aW4zMiAKKwlwYXRjaGVzIGZyb20gd2luZGJ1cyBwcm9qZWN0IChodHRwOi8vc2YubmV0L3Byb2plY3RzL3dpbmRidXMpCisKKzIwMDctMDMtMDQgIFJhbGYgSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIGJ1cy9hY3RpdmF0aW9uLmM6IChidXNfYWN0aXZhdGlvbl9hY3RpdmF0ZV9zZXJ2aWNlKToKKwlmaXhlZCBjYWxsIHRvIF9kYnVzX3NwYXduX2FzeW5jX3dpdGhfYmFieXNpdHRlcigpLgorCisyMDA3LTAzLTA0ICBSYWxmIEhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiBkYnVzL2RidXMtc3Bhd24uYyxkYnVzL2RidXMtc3Bhd24uaCAoX2RidXNfc3Bhd25fYXN5bmNfd2l0aF9iYWJ5c2l0dGVyKToKKwlhZGRlZCBlbnZpcm9ubWVudCBwb2ludGVyIGFzIGZ1bmN0aW9uIHBhcmFtZXRlciwgdXNlZCBvbiB3aW4zMi4KKworCSogdGVzdC9zcGF3bi10ZXN0LmM6IGZpeGVkIGNhbGwgdG8gYWJvdmUgbWVudGlvbmVkIGZ1bmN0aW9uLgorCisyMDA3LTAzLTA0ICBSYWxmIEhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiBjb25maWd1cmUuaW4sdGVzdC90ZXN0LXNsZWVwLWZvcmV2ZXIuYyx0ZXN0L3Rlc3QtbmFtZXMuYzogCisJYWRkZWQgY29uZmlndXJlIGNoZWNrIGZvciB1bmlzdGQuaC4KKworMjAwNy0wMy0wNCAgUmFsZiBIYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogdGVzdC9NYWtlZmlsZS5hbTogZml4ZWQgdGVzdCBkYXRhIGNvcHkgcHJvYmxlbSBpbiAKKwlvdXQgb2Ygc291cmNlIGJ1aWxkLCB3aGVuIHNvdXJjZXMgY2FtZSBmcm9tIHN2biBvciBjdnMuIAorCisyMDA3LTAzLTAzICBSYWxmIEhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiBkYnVzLyotd2luLiosYnVzLyotd2luLio6IGFkZGVkIHdpbjMyIHBsYXRmb3JtIHJlbGF0ZWQKKwlmaWxlcy4gVGhlc2UgZmlsZXMgYXJlIG9ubHkgYWRkZWQgdG8gdGhlIGNtYWtlIGJ1aWxkIHN5c3RlbS4gIAorCVRoZSBtaXNzaW5nIGRidXMtd2luLnBhdGNoIGZpbGUgd2lsbCBiZSBhZGRlZCBsYXRlci4gCisKKzIwMDctMDMtMDMgIFJhbGYgSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIGNtYWtlOiBuZXcgZGlyZWN0b3J5LCBjb250YWlucyBjbWFrZSBidWlsZCBzdXBwb3J0LgorCVNlZSBodHRwOi8vd3d3LmNtYWtlLm9yZyBmb3IgbW9yZSBpbmZvcm1hdGlvbnMuCisJQ3VycmVudGx5IG9ubHkgdW5peCB3aWxsIGJlIGJ1aWxkYWJsZSBiZWNhdXNlIHNvbWUgCisJd2luMzIgcmVxdWlyZWQgZmlsZXMgYXJlIHN0aWxsIG1pc3NpbmcuIAorCisyMDA3LTAzLTAzICBUaGlhZ28gTWFjaWVpcmEgIDx0aGlhZ29Aa2RlLm9yZz4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMtdW5peC5jOiBjYXB0dXJlIHRoZSBkYnVzLWxhdW5jaCBzdGRlcnIKKyAgICAgICAgb3V0cHV0IGFuZCBhZGQgaXQgdG8gdGhlIERCdXNFcnJvciBtZXNzYWdlIHdlIHJldHVybi4KKworCSogdG9vbHMvZGJ1cy1sYXVuY2guMToKKwkqIHRvb2xzL2RidXMtbGF1bmNoLmM6IEFkZCBvcHRpb24gLS1jbG9zZS1zdGRlcnIgdG8sIHdlbGwsCisJY2xvc2Ugc3RkZXJyIGJlZm9yZSBzdGFydGluZyBkYnVzLWRhZW1vbi4KKworMjAwNy0wMS0zMSAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGJ1cy9kYnVzLWRhZW1vbi4xLmluOiB3cml0ZSBhIHNlY3Rpb24gaW4gdGhlIG1hbiBwYWdlIG9uIHJ1bm5pbmcKKwlhIHRlc3QgZGFlbW9uIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMKKworMjAwNy0wMS0yNiAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGJ1cy9zZXNzaW9uLmNvbmYuaW46IG92ZXJyaWRlIGFsbCB0aGUgZGVmYXVsdCBsaW1pdHMgd2l0aCBtdWNoCisJaGlnaGVyIGxpbWl0cyBvbiB0aGUgc2Vzc2lvbiBidXMsIHRoZXJlIGlzIG5vIHJlYXNvbiB0aGUgc2Vzc2lvbgorCWJ1cyBzaG91bGQgaGF2ZSBsb3cgbGltaXRzCisKKwkqIGJ1cy9jb25maWctcGFyc2VyLmMgKGJ1c19jb25maWdfcGFyc2VyX25ldyk6IGluY3JlYXNlIGRlZmF1bHQKKwlsaW1pdHMgc28gdGhleSBhcmUgbGVzcyBsaWtlbHkgdG8gYmUgaGl0OyBpbiBwYXJ0aWN1bGFyIHRoZSBtYXgKKwlyZXBsaWVzIHBlciBjb25uZWN0aW9uIHdhcyB3YXkgdG9vIGxvdworCisyMDA2LTAxLTI1ICBTaW1vbiBNY1ZpdHRpZSAgPHNpbW9uLm1jdml0dGllQGNvbGxhYm9yYS5jby51az4KKworCSogZG9jL2RidXMtdHV0b3JpYWwueG1sOiBSZXBsYWNlIFB5dGhvbiBzZWN0aW9uIG9mIHR1dG9yaWFsIHdpdGgKKwlhIHBvaW50ZXIgdG8gdGhlIHR1dG9yaWFsIG1haW50YWluZWQgYXMgcGFydCBvZiBkYnVzLXB5dGhvbgorCisyMDA2LTEyLTMxICBSYWxmIEhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy11bml4LmM6IHVuaXggY29tcGlsZSBmaXgsIG1vdmVkIAorCWF0b21pY19leGNoYW5nZV9hbmRfYWRkKCkgZnJvbSBkYnVzL2RidXMtc3lzZGVwcy5jIAorCXRvIGhlcmUsIGl0J3MgdXNlZCBieSBfZGJ1c19hdG9taWNfaW5jKCkgYW5kIF9kYnVzX2F0b21pY19kZWMoKS4KKworMjAwNi0xMi0zMSAgUmFsZiBIYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogdG9vbHMvZGJ1cy1tb25pdG9yLmM6IGdldHRpbWVvZmRheSgpIGlzIG5vdCBhdmFpbGFibGUgCisJb24gd2luZG93cyBzbyB3ZSBoYXZlIHRvIHByb3ZpZGUgb3VyIG93bi4gSXQncyB0YWtlbiBmcm9tIAorCWxncGwnZCBrZGV3aW4zMiBwYWNrYWdlLiAtIFBhdGNoZXMgZnJvbSBDaHJpc3RpYW4gRWhybGljaGVyCisKKzIwMDYtMTItMzEgIFJhbGYgSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisKKwkqIGRidXMvZGJ1cy1zeXNkZXBzLXVuaXguYzogbW92ZWQgX2RidXNfYXRvbWljX2luYy9kZWMoKSAKKwlmcm9tIGRidXMvZGJ1cy1zeXNkZXBzLmMsIHdpbmRvd3MgdmVyc2lvbiBvZiBfZGJ1c19hdG9taWNfaW5jL2RlYygpIAorCWlzIGluIGRidXMtc3lzZGVwcy13aW4uYyAobm90IGluIHRoaXMgcGF0Y2gpLgorCisJKiBkYnVzL2RidXMtc3lzZGVwcy5oOiBEQnVzQXRvbWljOjp2YWx1ZSBpcyBsb25nIG9uIHdpbmRvd3MgdG8gZml0IAorCXdpdGggSW50ZXJsb2NrZWRJbmMvRGVjcmVtZW50LiAKKwktIFBhdGNoZXMgZnJvbSBDaHJpc3RpYW4gRWhybGljaGVyCisJCisyMDA2LTEyLTMxICBSYWxmIEhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiB0b29scy9kYnVzLXNlbmQuYywgdG9vbHMvZGJ1cy1tb25pdG9yLmM6IHdpbjMyIGNvbXBpbGUgZml4LgorCisyMDA2LTEyLTMxICBSYWxmIEhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiBkYnVzL2RidXMtbWFyc2hhbC1yZWN1cnNpdmUuYyAodHlwZSBEQnVzVHlwZVJlYWRlckNsYXNzKToKKwlmaXggbWlzcGFjZWQgY29uc3Qgc3RhdGVtZW50LiAtIFBhdGNoIGZyb20gUGV0ZXIgS8O8bW1lbAorCisyMDA2LTEyLTE5ICBSYXkgU3Ryb2RlICA8cnN0cm9kZUByZWRoYXQuY29tPgorCisJKiBidXMvYnVzLmMgKHByb2Nlc3NfY29uZmlnX2V2ZXJ5X3RpbWUpOgorCWRvbid0IG92ZXJ3cml0ZSBleGlzdGluZyBidXMgY29udGV4dCBhY3RpdmF0aW9uIG9iamVjdAorCXVudGlsIGFmdGVyIHdlJ3ZlIGNoZWNrZWQgdGhhdCB0aGUgbmV3IGFjdGl2YXRpb24gaXMKKwl2YWxpZC4KKworCSogYnVzL21haW4uYyAKKwkoc2lnbmFsX2hhbmRsZXIpLCAoaGFuZGxlX3JlbG9hZF93YXRjaCk6CisJZG9uJ3QgY2FsbCBleGl0KCkgb24gZmFpbHVyZSwgaW5zdGVhZCBtYWtlIGRvIGFuZCBrZWVwCisJZ29pbmcuCisJKGNsb3NlX3JlbG9hZF9waXBlKTogbmV3IGZ1bmN0aW9uIHRvIHR1cm4gb2ZmCisJaGFuZ3VwLWNhdXNlcy1jb25maWctcmVsb2FkIGJlaGF2aW9yIGlmIGFuIHVuZXhwZWN0ZWQKKwllcnJvciBvY2N1cnMKKworMjAwNi0xMi0xMyAgUmFsZiBIYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMtd2luLXRocmVhZC5jIChfZGJ1c19jb25kdmFyX3dhaXRfd2luMzIpOgorCWNvcnJlY3RuZXNzIGZpeC4gLSBQYXRjaCBmcm9tIENocmlzdGlhbiBFaHJsaWNoZXIKKworMjAwNi0xMi0xMyAgUmFsZiBIYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogZGJ1cy9kYnVzLWludGVybmFscy5oOiBtc3ZjIGFsc28ga25vd3MgYWJvdXQgX19GVU5DVElPTl9fLCAKKwl3ZSBzaG91bGQgYWxzbyB1c2UgaXQuIC0gUGF0Y2ggZnJvbSBDaHJpc3RpYW4gRWhybGljaGVyCisKKzIwMDYtMTItMTMgIFJhbGYgSGFiYWNrZXIgIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisgIAorCSogZGJ1cy1zeXNkZXBzLXV0aWwuYzogYWRkZWQgd2luMzIgcmVsYXRlZCB0ZXN0cworCisyMDA2LTEyLTEyICBSYWxmIEhhYmFja2VyICA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorCisJKiBkYnVzL2RidXMtc3RyaW5nLmMgKF9kYnVzX3N0cmluZ19wb3BfbGluZSksCisJYnVzL2Rlc2t0b3AtZmlsZS5jIChwYXJzZV9zZWN0aW9uX3N0YXJ0LAorCXBhcnNlX2NvbW1lbnRfb3JfYmxhbmsscGFyc2Vfa2V5X3ZhbHVlLCk6IHVzZXMKKwlfZGJ1c19zdHJpbmdfZmluZF9lb2woKSB0byBzdXBwb3J0IHBsYXRmb3JtIGluZGVwZW5kZW50IGVvbCBzdHlsZS4KKworMjAwNi0xMi0xMiAgUmFsZiBIYWJhY2tlciAgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKworCSogZGJ1cy9kYnVzLXN0cmluZy5bY2hdIChfZGJ1c19zdHJpbmdfZmluZF9lb2wpOiBuZXcgZnVuY3Rpb24uIAorCSogZGJ1cy9kYnVzLXN0cmluZy11dGlsLmMgKF9kYnVzX3N0cmluZ190ZXN0KTogYWRkZWQgdGVzdGNhc2VzIGZvciAKKwkgICAgICBfZGJ1c19zdHJpbmdfZmluZF9lb2woKS4KKwlBcHByb3ZlZCBieTogSGF2b2MgUGVubmluZ3Rvbi4KKworMjAwNi0xMi0xMiAgVGltIERpamtzdHJhIDx0aW1AZmFtZGlqa3N0cmEub3JnPgorCisJKiBjb25maWd1cmUuaW46IEFkZGVkIHN3aXRjaCB0byBkaXNhYmxlIHVzZXJfZGF0YWJhc2UgY2FjaGluZy4KKworCSogZGJ1cy9kYnVzLXVzZXJkYi11dGlsLmMsIGRidXMvZGJ1cy11c2VyZGIuYzogQWRkIGlmZGVmcyB0bworCWJlIGFibGUgZGlzYWJsZSB1c2VyX2RhYmFzZSBjYWNoaW5nLgorCisyMDA2LTEyLTEyICBUaW0gRGlqa3N0cmEgPHRpbUBmYW1kaWprc3RyYS5vcmc+CisKKwkqIGJ1cy9idXMuYywgYnVzL2J1cy5oOiBSZW1vdmUgREJ1c1VzZXJEYXRhYmFzZSBmcm9tIHRoZSBCdXNDb250ZXh0IAorCXN0cnVjdC4gSXQgaXMgdW5uZWNlc3Nhcnkgd2UgaGF2ZSBhIGdsb2JhbCBvbmUgYWxyZWFkeS4gQWxzbyByZW1vdmUgCisJYnVzX2NvbnRleHRfZ2V0X3VzZXJfZGF0YWJhc2UgZnVuY3Rpb24sIGl0IGlzIG5vIGxvbmdlciBuZWVkZWQuCisJRmx1c2ggdGhlIGdsb2JhbCBkYXRhYmFzZSBvbiByZWxvYWQuCisKKwkqIGRidXMvZGJ1cy11c2VyZGItdXRpbC5jOiBSZXBsYWNlIF9kYnVzX3VzZXJfZGF0YWJhc2VfZ2V0X2dyb3VwcyAKKwl3aXRoIF9kYnVzX2dyb3Vwc19mcm9tX3VpZC4gSXQgbm8gbG9uZ2VyIG5lZWRzIGEgREJ1c1VzZXJEYXRhYmFzZS4KKworCSogZGJ1cy9kYnVzLXVzZXJkYi5jLCBkYnVzL2RidXMtdXNlcmRiLmg6IAorCUFkZCBfZGJ1c191c2VyX2RhdGFiYXNlX2ZsdXNoX3N5c3RlbS4gCisJTWFrZSBtb3JlIGZ1bmN0aW9ucyBEQlVTX1VTRVJEQl9JTkNMVURFU19QUklWQVRFLiAKKwlTbWFsbCB1bnJlbGF0ZWQgY2hhbmdlIGluIF9kYnVzX2lzX2FfbnVtYmVyOiBjaGFuZ2UgCisJX2RidXNfc3RyaW5nX3BhcnNlX2ludCB0byBfZGJ1c19zdHJpbmdfcGFyc2VfdWludC4gCisKKwkqIGJ1cy9jb25uZWN0aW9uLmM6IENoYW5nZSBjYWxsIHRvIF9kYnVzX3VzZXJfZGF0YWJhc2VfZ2V0X2dyb3VwcyB0byAKKwlfZGJ1c19ncm91cHNfZnJvbV91aWQuCisKKwkqIGJ1cy9wb2xpY3kuYywgYnVzL3BvbGljeS5oOiBDaGFuZ2UgY2FsbCB0byAKKwlfZGJ1c191c2VyX2RhdGFiYXNlX2dldF9ncm91cHMgdG8gX2RidXNfZ3JvdXBzX2Zyb21fdWlkLiBSZW1vdmUgCisJREJ1c1VzZXJEYXRhYmFzZSBmcm9tIGJ1c19wb2xpY3lfYWxsb3dfdXNlciBwcm90b3R5cGUsIGl0IG5vIGxvbmdlciAKKwluZWVkcyBpdC4KKworMjAwNi0xMi0xMiAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogYnVzL3NpZ25hbC5jOiBGaXggbWF0Y2hfcnVsZV9lcXVhbCBlcnJhdGEKKwkoQ1ZFLTIwMDYtNjEwNyAtIFBhdGNoIGZyb20gS2ltbW8gSMOkbcOkbMOkaW5lbiAKKwk8a2ltbW8uaGFtYWxhaW5lbkBub2tpYS5jb20+KQorCisyMDA2LTExLTE5ICBUaGlhZ28gTWFjaWVpcmEgIDx0aGlhZ29Aa2RlLm9yZz4KKworCSogZGJ1cy9kYnVzLXN5c2RlcHMtcHRocmVhZC5jIChfZGJ1c19wdGhyZWFkX211dGV4X2xvY2ssCisgICAgICAgIF9kYnVzX3B0aHJlYWRfY29uZHZhcl93YWl0LAorICAgICAgICBfZGJ1c19wdGhyZWFkX2NvbmR2YXJfd2FpdF90aW1lb3V0KTogc2V0IHBtdXRleC0+aG9sZGVyIHRvCisgICAgICAgIHB0aHJlYWRfc2VsZigpIGFmdGVyIGNvbWluZyBiYWNrIGZyb20gYSBjb25kaXRpb25hbCB2YXJpYWJsZQorICAgICAgICB3YWl0IGFzIHdlbGwgYXMgaW4gb25lIGNvZGVwYXRoIHdoZXJlIGl0IHdhcyBmb3Jnb3R0ZW4uCisJQXBwcm92ZWQgYnk6IEhhdm9jIFBlbm5pbmd0b24uCisKKzIwMDYtMTEtMTcgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiB1cGRhdGUtZGJ1cy1kb2NzLnNoOiBhbGxvdyBzZXR0aW5nIGZkLm9yZyB1c2VybmFtZSB2aWEgZW52CisJdmFyaWFibGUuIE1ha2UgaXQgcnVuIGF1dG9nZW4gd2l0aCAtLWVuYWJsZS14bWwtZG9jcz15ZXMKKwktLWVuYWJsZS1kb3h5Z2VuLWRvY3M9eWVzIHNvIGNvbmZpZ3VyZSB3aWxsIGZhaWwgaWYgdGhlIHJlcXVpcmVkCisJdG9vbHMgYXJlIG1pc3NpbmcuCisKKzIwMDYtMTEtMTcgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCisJKiBkb2MvZGJ1cy1mYXEueG1sOiBtaW5vciBGQVEgdHdlYWtzCisKKzIwMDYtMTEtMTQgIEhhdm9jIFBlbm5pbmd0b24gIDxocEByZWRoYXQuY29tPgorCQorCSogZGJ1cy9kYnVzLW1pc2MuYywgZGJ1cy9kYnVzLW1pc2MuaDogTW92ZQorCWRidXNfZ2V0X2xvY2FsX21hY2hpbmVfaWQoKSB0byBpdHMgb3duIGZpbGUsIG5vIHN1YnN0YW50aXZlCisJY2hhbmdlcy4gVGhlcmUgYXJlIGEgY291cGxlIG90aGVyIHRoaW5ncyB3ZSBtaWdodCB3YW50IHRvIGFkZCB0aGF0CisJYXJlICJtaXNjIiBzbyBtb3Zpbmcgb3V0IG9mIGRidXMtY29ubmVjdGlvbi5baGNdIHdoaWNoIGlzIGJpZworCWVub3VnaCBhbHJlYWR5LgorCQorMjAwNi0xMS0xNCAgSGF2b2MgUGVubmluZ3RvbiAgPGhwQHJlZGhhdC5jb20+CisKKwkqIGRidXMvZGJ1cy1pbnRlcm5hbHMuYyAoX2RidXNfZ2VuZXJhdGVfdXVpZCk6IFRoZSBzcGVjIHNhaWQgdGhlCisJVVVJRCBoYWQgdGhlIHRpbWVzdGFtcCBsYXN0LCBidXQgdGhlIGltcGxlbWVudGF0aW9uIGhhZCBpdCBmaXJzdDsKKwltb3ZlIGl0IHRvIGxhc3Qgc2luY2UgSSB0aGluayBpdCdzIGEgdGlueSBiaXQgbmljZXIgKGVhc2llciB0bworCWNvbXBhcmUgYXQgYSBnbGFuY2UsIGZhc3RlciB0byBzb3J0LCBsZXNzIGNvZGUpLCBhbmQgd2lsbCBub3QKKwljYXVzZSBhbnkgcHJhY3RpY2FsIGNvbXBhdGliaWxpdHkgcHJvYmxlbXMuIEFsc28sIGFsd2F5cyBjb252ZXJ0CisJdGhlIHRpbWVzdGFtcCB0byBiaWcgZW5kaWFuLgorCisJKiBkb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnhtbDogQ2xlYW4gdXAgdGhlIGRvY3Mgb24gdGhlIFVVSUQuCisKKwkqIHRvb2xzL2RidXMtdXVpZGdlbi4xOiBtb3JlIHByb21pbmVudGx5IHNheSBpdCBpcyBub3Qgc3VpdGFibGUKKwlhcyBhIHJlcGxhY2VtZW50IGZvciByZWd1bGFyIHV1aWRnZW4vUkZDNDEyMi4KKworMjAwNi0xMS0xNCAgSm9obiAoSjUpIFBhbG1pZXJpICA8am9obnBAcmVkaGF0LmNvbT4KKworCSogZGJ1cy9kYnVzLXRocmVhZHMuaDogZml4IERCVVNfVEhSRUFEX0ZVTkNUSU9OU19BTExfTUFTSyB0byBoYXZlCisJdGhlIGNvcnJlY3QgdmFsdWUgc28gd2UgZG9uJ3QgYXNzZXJ0IHdoZW4gaW5pdGFsaXppbmcgcmVjdXJzaXZlIHRocmVhZHMKKworCSogdGVzdC9uYW1lLXRlc3QvdGVzdC10aHJlYWQtaW5pdC5jOiBjYWxsIGRidXNfdGhyZWFkc19pbml0X2RlZmF1bHQKKwlpbnN0ZWFkIG9mIF9kYnVzX3RocmVhZHNfaW5pdF9kZWJ1ZyBzaW5jZSBpdCBpcyBtb3JlIG9mIGEgcmVhbCB3b3JsZAorCXRlc3QKKwpkaWZmIC0tZ2l0IGEvQ2xlYW5TcGVjLm1rIGIvQ2xlYW5TcGVjLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4NGUxYjYKLS0tIC9kZXYvbnVsbAorKysgYi9DbGVhblNwZWMubWsKQEAgLTAsMCArMSw0OSBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIyBJZiB5b3UgZG9uJ3QgbmVlZCB0byBkbyBhIGZ1bGwgY2xlYW4gYnVpbGQgYnV0IHdvdWxkIGxpa2UgdG8gdG91Y2gKKyMgYSBmaWxlIG9yIGRlbGV0ZSBzb21lIGludGVybWVkaWF0ZSBmaWxlcywgYWRkIGEgY2xlYW4gc3RlcCB0byB0aGUgZW5kCisjIG9mIHRoZSBsaXN0LiAgVGhlc2Ugc3RlcHMgd2lsbCBvbmx5IGJlIHJ1biBvbmNlLCBpZiB0aGV5IGhhdmVuJ3QgYmVlbgorIyBydW4gYmVmb3JlLgorIworIyBFLmcuOgorIyAgICAgJChjYWxsIGFkZC1jbGVhbi1zdGVwLCB0b3VjaCAtYyBleHRlcm5hbC9zcWxpdGUvc3FsaXRlMy5oKQorIyAgICAgJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvb2JqL1NUQVRJQ19MSUJSQVJJRVMvbGliel9pbnRlcm1lZGlhdGVzKQorIworIyBBbHdheXMgdXNlICJ0b3VjaCAtYyIgYW5kICJybSAtZiIgb3IgInJtIC1yZiIgdG8gZ3JhY2VmdWxseSBkZWFsIHdpdGgKKyMgZmlsZXMgdGhhdCBhcmUgbWlzc2luZyBvciBoYXZlIGJlZW4gbW92ZWQuCisjCisjIFVzZSAkKFBST0RVQ1RfT1VUKSB0byBnZXQgdG8gdGhlICJvdXQvdGFyZ2V0L3Byb2R1Y3QvYmxhaC8iIGRpcmVjdG9yeS4KKyMgVXNlICQoT1VUX0RJUikgdG8gcmVmZXIgdG8gdGhlICJvdXQiIGRpcmVjdG9yeS4KKyMKKyMgSWYgeW91IG5lZWQgdG8gcmUtZG8gc29tZXRoaW5nIHRoYXQncyBhbHJlYWR5IG1lbnRpb25lZCwganVzdCBjb3B5CisjIHRoZSBjb21tYW5kIGFuZCBhZGQgaXQgdG8gdGhlIGJvdHRvbSBvZiB0aGUgbGlzdC4gIEUuZy4sIGlmIGEgY2hhbmdlCisjIHRoYXQgeW91IG1hZGUgbGFzdCB3ZWVrIHJlcXVpcmVkIHRvdWNoaW5nIGEgZmlsZSBhbmQgYSBjaGFuZ2UgeW91CisjIG1hZGUgdG9kYXkgcmVxdWlyZXMgdG91Y2hpbmcgdGhlIHNhbWUgZmlsZSwganVzdCBjb3B5IHRoZSBvbGQKKyMgdG91Y2ggc3RlcCBhbmQgYWRkIGl0IHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QuCisjCisjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIyBORVdFUiBDTEVBTiBTVEVQUyBNVVNUIEJFIEFUIFRIRSBFTkQgT0YgVEhFIExJU1QKKyMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyMgRm9yIGV4YW1wbGU6CisjJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChPVVRfRElSKS90YXJnZXQvY29tbW9uL29iai9BUFBTL0FuZHJvaWRUZXN0c19pbnRlcm1lZGlhdGVzKQorIyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoT1VUX0RJUikvdGFyZ2V0L2NvbW1vbi9vYmovSkFWQV9MSUJSQVJJRVMvY29yZV9pbnRlcm1lZGlhdGVzKQorIyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgZmluZCAkKE9VVF9ESVIpIC10eXBlIGYgLW5hbWUgIklHVGFsa1Nlc3Npb24qIiAtcHJpbnQwIHwgeGFyZ3MgLTAgcm0gLWYpCisjJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvZGF0YS8qKQorCisjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIyBORVdFUiBDTEVBTiBTVEVQUyBNVVNUIEJFIEFUIFRIRSBFTkQgT0YgVEhFIExJU1QKKyMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS9Eb3h5ZmlsZS5pbiBiL0RveHlmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiYmRiNGYKLS0tIC9kZXYvbnVsbAorKysgYi9Eb3h5ZmlsZS5pbgpAQCAtMCwwICsxLDE4MSBAQAorIyBEb3h5ZmlsZSAwLjEKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBHZW5lcmFsIGNvbmZpZ3VyYXRpb24gb3B0aW9ucworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUFJPSkVDVF9OQU1FICAgICAgICAgICA9IEQtQnVzCitQUk9KRUNUX05VTUJFUiAgICAgICAgID0gQFZFUlNJT05ACitPVVRQVVRfRElSRUNUT1JZICAgICAgID0gZG9jL2FwaQorT1VUUFVUX0xBTkdVQUdFICAgICAgICA9IEVuZ2xpc2gKK0VYVFJBQ1RfQUxMICAgICAgICAgICAgPSBOTworRVhUUkFDVF9QUklWQVRFICAgICAgICA9IE5PCitFWFRSQUNUX1NUQVRJQyAgICAgICAgID0gTk8KK0hJREVfVU5ET0NfTUVNQkVSUyAgICAgPSBOTworSElERV9VTkRPQ19DTEFTU0VTICAgICA9IE5PCitCUklFRl9NRU1CRVJfREVTQyAgICAgID0gWUVTCitSRVBFQVRfQlJJRUYgICAgICAgICAgID0gWUVTCitBTFdBWVNfREVUQUlMRURfU0VDICAgID0gTk8KK0ZVTExfUEFUSF9OQU1FUyAgICAgICAgPSBOTworU1RSSVBfRlJPTV9QQVRIICAgICAgICA9IAorSU5URVJOQUxfRE9DUyAgICAgICAgICA9IE5PCitTVFJJUF9DT0RFX0NPTU1FTlRTICAgID0gWUVTCitDQVNFX1NFTlNFX05BTUVTICAgICAgID0gWUVTCitTSE9SVF9OQU1FUyAgICAgICAgICAgID0gTk8KK0hJREVfU0NPUEVfTkFNRVMgICAgICAgPSBOTworVkVSQkFUSU1fSEVBREVSUyAgICAgICA9IFlFUworU0hPV19JTkNMVURFX0ZJTEVTICAgICA9IFlFUworSkFWQURPQ19BVVRPQlJJRUYgICAgICA9IFlFUworSU5IRVJJVF9ET0NTICAgICAgICAgICA9IFlFUworSU5MSU5FX0lORk8gICAgICAgICAgICA9IFlFUworU09SVF9NRU1CRVJfRE9DUyAgICAgICA9IFlFUworRElTVFJJQlVURV9HUk9VUF9ET0MgICA9IE5PCitUQUJfU0laRSAgICAgICAgICAgICAgID0gOAorR0VORVJBVEVfVE9ET0xJU1QgICAgICA9IFlFUworR0VORVJBVEVfVEVTVExJU1QgICAgICA9IFlFUworR0VORVJBVEVfQlVHTElTVCAgICAgICA9IFlFUworQUxJQVNFUyAgICAgICAgICAgICAgICA9IAorRU5BQkxFRF9TRUNUSU9OUyAgICAgICA9IAorTUFYX0lOSVRJQUxJWkVSX0xJTkVTICA9IDMwCitPUFRJTUlaRV9PVVRQVVRfRk9SX0MgID0gWUVTCitTSE9XX1VTRURfRklMRVMgICAgICAgID0gWUVTCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHdhcm5pbmcgYW5kIHByb2dyZXNzIG1lc3NhZ2VzCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitRVUlFVCAgICAgICAgICAgICAgICAgID0gWUVTCitXQVJOSU5HUyAgICAgICAgICAgICAgID0gWUVTCitXQVJOX0lGX1VORE9DVU1FTlRFRCAgID0gWUVTCitXQVJOX0ZPUk1BVCAgICAgICAgICAgID0gCitXQVJOX0xPR0ZJTEUgICAgICAgICAgID0gCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBpbnB1dCBmaWxlcworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorSU5QVVQgICAgICAgICAgICAgICAgICA9IEB0b3Bfc3JjZGlyQC9kYnVzCitGSUxFX1BBVFRFUk5TICAgICAgICAgID0gKi5jICouaAorUkVDVVJTSVZFICAgICAgICAgICAgICA9IFlFUworI0VYQ0xVREUgICAgICAgICAgICAgICAgPSB0ZXN0CisKKyMgSWYgdGhlIHZhbHVlIG9mIHRoZSBJTlBVVCB0YWcgY29udGFpbnMgZGlyZWN0b3JpZXMsIHlvdSBjYW4gdXNlIHRoZSAKKyMgRVhDTFVERV9QQVRURVJOUyB0YWcgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSB3aWxkY2FyZCBwYXR0ZXJucyB0byBleGNsdWRlIAorIyBjZXJ0YWluIGZpbGVzIGZyb20gdGhvc2UgZGlyZWN0b3JpZXMuCisKK0VYQ0xVREVfUEFUVEVSTlMgICAgICAgPSBNYWtlZmlsZS4qIENoYW5nZUxvZyBDSEFOR0VTIENIQU5HRVMuKiBSRUFETUUgXAorICAgICAgICAgICAgICAgICAgICAgICAgIFJFQURNRS4qICoucG5nIEFVVEhPUlMgREVTSUdOIERFU0lHTi4qICouZGVza3RvcCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgREVTS1RPUCogQ09NTUVOVFMgSE9XVE8gbWFnaWMgTk9URVMgVE9ETyBUSEFOS1MKKworIyBUaGUgRVhBTVBMRV9QQVRIIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGZpbGVzIG9yIAorIyBkaXJlY3RvcmllcyB0aGF0IGNvbnRhaW4gZXhhbXBsZSBjb2RlIGZyYWdtZW50cyB0aGF0IGFyZSBpbmNsdWRlZCAoc2VlIAorIyB0aGUgXGluY2x1ZGUgY29tbWFuZCkuCisKK0VYQU1QTEVfUEFUSCAgICAgICAgICAgPSAKK0VYQU1QTEVfUEFUVEVSTlMgICAgICAgPSAKK0VYQU1QTEVfUkVDVVJTSVZFICAgICAgPSBOTworSU1BR0VfUEFUSCAgICAgICAgICAgICA9IAorSU5QVVRfRklMVEVSICAgICAgICAgICA9IAorRklMVEVSX1NPVVJDRV9GSUxFUyAgICA9IE5PCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHNvdXJjZSBicm93c2luZworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU09VUkNFX0JST1dTRVIgICAgICAgICA9IFlFUworSU5MSU5FX1NPVVJDRVMgICAgICAgICA9IE5PCitSRUZFUkVOQ0VEX0JZX1JFTEFUSU9OID0gWUVTCitSRUZFUkVOQ0VTX1JFTEFUSU9OICAgID0gWUVTCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBhbHBoYWJldGljYWwgY2xhc3MgaW5kZXgKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0FMUEhBQkVUSUNBTF9JTkRFWCAgICAgPSBOTworQ09MU19JTl9BTFBIQV9JTkRFWCAgICA9IDUKK0lHTk9SRV9QUkVGSVggICAgICAgICAgPSAKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIEhUTUwgb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitHRU5FUkFURV9IVE1MICAgICAgICAgID0gWUVTCitIVE1MX09VVFBVVCAgICAgICAgICAgID0gCitIVE1MX0hFQURFUiAgICAgICAgICAgID0gCitIVE1MX0ZPT1RFUiAgICAgICAgICAgID0gCitIVE1MX1NUWUxFU0hFRVQgICAgICAgID0gCitIVE1MX0FMSUdOX01FTUJFUlMgICAgID0gWUVTCitHRU5FUkFURV9IVE1MSEVMUCAgICAgID0gTk8KK0dFTkVSQVRFX0NISSAgICAgICAgICAgPSBOTworQklOQVJZX1RPQyAgICAgICAgICAgICA9IE5PCitUT0NfRVhQQU5EICAgICAgICAgICAgID0gTk8KK0RJU0FCTEVfSU5ERVggICAgICAgICAgPSBOTworRU5VTV9WQUxVRVNfUEVSX0xJTkUgICA9IDQKK0dFTkVSQVRFX1RSRUVWSUVXICAgICAgPSBOTworVFJFRVZJRVdfV0lEVEggICAgICAgICA9IDI1MAorSFRNTF9USU1FU1RBTVAgICAgICAgICA9IE5PCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBMYVRlWCBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0dFTkVSQVRFX0xBVEVYICAgICAgICAgPSBOTworTEFURVhfT1VUUFVUICAgICAgICAgICA9IAorQ09NUEFDVF9MQVRFWCAgICAgICAgICA9IE5PCitQQVBFUl9UWVBFICAgICAgICAgICAgID0gYTR3aWRlCitFWFRSQV9QQUNLQUdFUyAgICAgICAgID0gCitMQVRFWF9IRUFERVIgICAgICAgICAgID0gCitQREZfSFlQRVJMSU5LUyAgICAgICAgID0gTk8KK1VTRV9QREZMQVRFWCAgICAgICAgICAgPSBOTworTEFURVhfQkFUQ0hNT0RFICAgICAgICA9IE5PCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBSVEYgb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitHRU5FUkFURV9SVEYgICAgICAgICAgID0gTk8KK1JURl9PVVRQVVQgICAgICAgICAgICAgPSAKK0NPTVBBQ1RfUlRGICAgICAgICAgICAgPSBOTworUlRGX0hZUEVSTElOS1MgICAgICAgICA9IE5PCitSVEZfU1RZTEVTSEVFVF9GSUxFICAgID0gCitSVEZfRVhURU5TSU9OU19GSUxFICAgID0gCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBtYW4gcGFnZSBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0dFTkVSQVRFX01BTiAgICAgICAgICAgPSBZRVMKK01BTl9PVVRQVVQgICAgICAgICAgICAgPSBtYW4KK01BTl9FWFRFTlNJT04gICAgICAgICAgPSAuM2RidXMKK01BTl9MSU5LUyAgICAgICAgICAgICAgPSBZRVMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIFhNTCBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0dFTkVSQVRFX1hNTCAgICAgICAgICAgPSBZRVMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIHByZXByb2Nlc3NvciAgIAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRU5BQkxFX1BSRVBST0NFU1NJTkcgICA9IFlFUworTUFDUk9fRVhQQU5TSU9OICAgICAgICA9IFlFUworRVhQQU5EX09OTFlfUFJFREVGICAgICA9IFlFUworU0VBUkNIX0lOQ0xVREVTICAgICAgICA9IFlFUworSU5DTFVERV9QQVRIICAgICAgICAgICA9IAorSU5DTFVERV9GSUxFX1BBVFRFUk5TICA9IAorUFJFREVGSU5FRCAgICAgICAgICAgICA9ICJEQlVTX0JFR0lOX0RFQ0xTPSIgCQkJXAorCQkJICJEQlVTX0VORF9ERUNMUz0iIAkJCVwKKwkJCSAiRE9YWUdFTl9TSE9VTERfU0tJUF9USElTIiAJCVwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiREJVU19HTlVDX0RFUFJFQ0FURUQ9IiAgICAgICAgICAgICAgICBcCisJCQkgIl9EQlVTX0dOVUNfUFJJTlRGKGZyb20sdG8pPSIKK1NLSVBfRlVOQ1RJT05fTUFDUk9TICAgPSBZRVMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbjo6YWRkdGlvbnMgcmVsYXRlZCB0byBleHRlcm5hbCByZWZlcmVuY2VzICAgCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUQUdGSUxFUyAgICAgICAgICAgICAgID0gCitHRU5FUkFURV9UQUdGSUxFICAgICAgID0gCitBTExFWFRFUk5BTFMgICAgICAgICAgID0gTk8KK1BFUkxfUEFUSCAgICAgICAgICAgICAgPSAKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIGRvdCB0b29sICAgCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitDTEFTU19ESUFHUkFNUyAgICAgICAgID0gWUVTCitIQVZFX0RPVCAgICAgICAgICAgICAgID0gTk8KK0NMQVNTX0dSQVBIICAgICAgICAgICAgPSBZRVMKK0NPTExBQk9SQVRJT05fR1JBUEggICAgPSBZRVMKK1RFTVBMQVRFX1JFTEFUSU9OUyAgICAgPSBZRVMKK0hJREVfVU5ET0NfUkVMQVRJT05TICAgPSBZRVMKK0lOQ0xVREVfR1JBUEggICAgICAgICAgPSBZRVMKK0lOQ0xVREVEX0JZX0dSQVBIICAgICAgPSBZRVMKK0dSQVBISUNBTF9ISUVSQVJDSFkgICAgPSBZRVMKK0RPVF9QQVRIICAgICAgICAgICAgICAgPSAKK0RPVEZJTEVfRElSUyAgICAgICAgICAgPSAKK01BWF9ET1RfR1JBUEhfV0lEVEggICAgPSA2NDAKK01BWF9ET1RfR1JBUEhfSEVJR0hUICAgPSAxMDI0CitHRU5FUkFURV9MRUdFTkQgICAgICAgID0gWUVTCitET1RfQ0xFQU5VUCAgICAgICAgICAgID0gWUVTCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb246OmFkZHRpb25zIHJlbGF0ZWQgdG8gdGhlIHNlYXJjaCBlbmdpbmUgICAKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NFQVJDSEVOR0lORSAgICAgICAgICAgPSBOTwpkaWZmIC0tZ2l0IGEvSU5TVEFMTCBiL0lOU1RBTEwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJmMDEyMgotLS0gL2Rldi9udWxsCisrKyBiL0lOU1RBTEwKQEAgLTAsMCArMSwyNDggQEAKKyAgICAgICAgICAgREJ1cyBJbnN0YWxsYXRpb24KKyAgICAgICAgICAgPT09PT09PT09PT09PT09PT0KKworUXVpY2sgc3RhcnQKKz09PT09PT09PT09CisKK0RCdXMgY291bGQgYmUgYnVpbGQgd2l0aCBHTlUgQXV0b1Rvb2xzIG9yIHdpdGggY21ha2UgZm9yIGl0cyBidWlsZCBzeXN0ZW0sCit0aHVzIHRoZSBiYXNpYyBpbnN0YWxsIHByb2NlZHVyZSBjYW4gYmUgc3VtbWFyaXplZCBhczoKKword2l0aCBhdXRvdG9vbHM6CisKKyAgICAuL2NvbmZpZ3VyZSAtLXByZWZpeD0vdXNyCisgICAgbWFrZQorICAgIHN1IG1ha2UgaW5zdGFsbAorCitUaGUgY29uZmlndXJlIHNjcmlwdCB3aWxsIGF1dG9tYXRpY2FsbHkgZGV0ZXJtaW5lIHdoZXRoZXIgdG8gdHJ5IGFuZAorYnVpbGQgYmluZGluZ3MgZm9yIEdMaWIsIFF0LCBRdDMsIFB5dGhvbiBhbmQgTW9ubyBiYXNlZCBvbiB3aGF0IHRvb2xzCithcmUgaW5zdGFsbGVkIG9uIHRoZSBob3N0IHN5c3RlbS4gVGhlIGRlZmF1bHQgYnVpbGQgYmVoYXZpb3VyIGNhbiBiZQorb3ZlcnJpZGRlbiB1c2luZyB0aGUgLS1lbmFibGUtWFhYLy0tZGlzYWJsZS1YWFggYXJndW1lbnRzIHRvIGNvbmZpZ3VyZS4KK0EgdHlwaWNhbCBzY2VuYXJpbyBpbiB3aGljaCBpdCBpcyBkZXNpcmFibGUgdG8gb3ZlcnJpZGUgYXV0b21hdGljCitkZXRlY3Rpb24sIGlzIGR1cmluZyBwYWNrYWdpbmcgb2YgYmluYXJ5IGJ1aWxkcywgd2hlcmUgYSBwcmVkaWN0YWJsZQorZGVwZW5kYW5jeSBjaGFpbiBpcyByZXF1aXJlZC4gRm9yIG1vcmUgZGV0YWlscyBvbiBHTlUgQXV0b1Rvb2xzCitpbnN0YWxsYXRpb24sIGNvbnN1bHQgdGhlIGdlbmVyaWMgaW5zdHJ1Y3Rpb25zIGxhdGVyIGluIHRoaXMgZG9jdW1lbnQKKword2l0aCBjbWFrZToKKyAgICBta2RpciBkYnVzLWJ1aWxkLWRpcgorICAgIGNkIGRidXMtYnVpbGQtZGlyCisgICAgY21ha2UgLUcgPG1ha2VmaWxlLWdlbmVyYXRvci1uYW1lPiBbLUQ8b3B0aW9uPl0gPGRidXMtc3JjLXJvb3Q+L2NtYWtlCisgICAgbWFrZQorICAgIG1ha2UgaW5zdGFsbAorCitjbWFrZSB3aWxsIGF1dG9tYXRpY2FsbHkgZGV0ZXJtaW5lIHdoZXRoZXIgdG8gYnVpbGQgc29tZSBmZWF0dXJlcworYmFzZWQgb24gd2hhdCB0b29scyBhbmQvb3IgbGlicmFyaWVzIGFyZSBpbnN0YWxsZWQgb24gdGhlIGhvc3Qgc3lzdGVtLiAKK1RoZSBkZWZhdWx0IGJ1aWxkIGJlaGF2aW91ciBjYW4gYmUgb3ZlcnJpZGRlbiB1c2luZyB0aGUgCistREVOQUJMRV88WFhYPiBhcmd1bWVudHMgdG8gY21ha2UuCitBIHR5cGljYWwgc2NlbmFyaW8gaW4gd2hpY2ggaXQgaXMgZGVzaXJhYmxlIHRvIG92ZXJyaWRlIGF1dG9tYXRpYworZGV0ZWN0aW9uLCBpcyBkdXJpbmcgcGFja2FnaW5nIG9mIGJpbmFyeSBidWlsZHMsIHdoZXJlIGEgcHJlZGljdGFibGUKK2RlcGVuZGFuY3kgY2hhaW4gaXMgcmVxdWlyZWQuIEZvciBtb3JlIGRldGFpbHMgb24gY21ha2UgaW5zdGFsbGF0aW9uLCAKK2NvbnN1bHQgaHR0cDovL3d3dy5jbWFrZS5vcmcvY21ha2UvaGVscC9oZWxwLmh0bWwuIAorCitFeHRlcm5hbCBzb2Z0d2FyZSBkZXBlbmRhbmNpZXMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGUgb25seSBmdW5kYW1lbnRhbCByZXF1aXJlbWVudCB0byBidWlsZCBEQnVzIGlzIGFuIFhNTCBwYXJzZXIsCitob3dldmVyLCB0aGVyZSBhcmUgYSBudW1iZXIgb2Ygb3RoZXIgc29mdHdhcmUgcGFja2FnZXMgd2hpY2ggKGlmCitwcmVzZW50KSB3aWxsIGVuaGFuY2UgZnVuY3Rpb25hbGl0eS4KKworQ29yZSBsaWJyYXJ5CistLS0tLS0tLS0tLS0KKworIFJlcXVpc2l0ZToKKworICAtIEdldHRleHQKKyAgLSBleHBhdAorCisgT3B0aW9uYWw6CisKKyAgLSBsaWJzZWxpbnV4ICAgICAgICAgICAoZm9yIFNFTGludXggaW50ZWdyYXRpb24pCisgIC0gZG94eWdlbiAgICAgICAgICAgICAgKGZvciBBUEkgZG9jdW1lbnRhdGlvbikKKyAgLSB4bWx0byBvciBtZWlucHJvYzQgICAoZm9yIFNwZWMgJiBvdGhlciBYTUwgZG9jdW1lbnRhdGlvbikKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhlIHJlc3Qgb2YgdGhpcyBkb2N1bWVudCBjb250YWlucyB0aGUgZ2VuZXJpYyBHTlUgQXV0b1Rvb2xzIGluc3RhbGwKK2luc3J1Y3Rpb25zLi4uLgorCitCYXNpYyBJbnN0YWxsYXRpb24KKz09PT09PT09PT09PT09PT09PQorCisgICBUaGVzZSBhcmUgZ2VuZXJpYyBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zLgorCisgICBUaGUgYGNvbmZpZ3VyZScgc2hlbGwgc2NyaXB0IGF0dGVtcHRzIHRvIGd1ZXNzIGNvcnJlY3QgdmFsdWVzIGZvcgordmFyaW91cyBzeXN0ZW0tZGVwZW5kZW50IHZhcmlhYmxlcyB1c2VkIGR1cmluZyBjb21waWxhdGlvbi4gIEl0IHVzZXMKK3Rob3NlIHZhbHVlcyB0byBjcmVhdGUgYSBgTWFrZWZpbGUnIGluIGVhY2ggZGlyZWN0b3J5IG9mIHRoZSBwYWNrYWdlLgorSXQgbWF5IGFsc28gY3JlYXRlIG9uZSBvciBtb3JlIGAuaCcgZmlsZXMgY29udGFpbmluZyBzeXN0ZW0tZGVwZW5kZW50CitkZWZpbml0aW9ucy4gIEZpbmFsbHksIGl0IGNyZWF0ZXMgYSBzaGVsbCBzY3JpcHQgYGNvbmZpZy5zdGF0dXMnIHRoYXQKK3lvdSBjYW4gcnVuIGluIHRoZSBmdXR1cmUgdG8gcmVjcmVhdGUgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiwgYSBmaWxlCitgY29uZmlnLmNhY2hlJyB0aGF0IHNhdmVzIHRoZSByZXN1bHRzIG9mIGl0cyB0ZXN0cyB0byBzcGVlZCB1cAorcmVjb25maWd1cmluZywgYW5kIGEgZmlsZSBgY29uZmlnLmxvZycgY29udGFpbmluZyBjb21waWxlciBvdXRwdXQKKyh1c2VmdWwgbWFpbmx5IGZvciBkZWJ1Z2dpbmcgYGNvbmZpZ3VyZScpLgorCisgICBJZiB5b3UgbmVlZCB0byBkbyB1bnVzdWFsIHRoaW5ncyB0byBjb21waWxlIHRoZSBwYWNrYWdlLCBwbGVhc2UgdHJ5Cit0byBmaWd1cmUgb3V0IGhvdyBgY29uZmlndXJlJyBjb3VsZCBjaGVjayB3aGV0aGVyIHRvIGRvIHRoZW0sIGFuZCBtYWlsCitkaWZmcyBvciBpbnN0cnVjdGlvbnMgdG8gdGhlIGFkZHJlc3MgZ2l2ZW4gaW4gdGhlIGBSRUFETUUnIHNvIHRoZXkgY2FuCitiZSBjb25zaWRlcmVkIGZvciB0aGUgbmV4dCByZWxlYXNlLiAgSWYgYXQgc29tZSBwb2ludCBgY29uZmlnLmNhY2hlJworY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3Qgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgorCisgICBUaGUgZmlsZSBgY29uZmlndXJlLmluJyBpcyB1c2VkIHRvIGNyZWF0ZSBgY29uZmlndXJlJyBieSBhIHByb2dyYW0KK2NhbGxlZCBgYXV0b2NvbmYnLiAgWW91IG9ubHkgbmVlZCBgY29uZmlndXJlLmluJyBpZiB5b3Ugd2FudCB0byBjaGFuZ2UKK2l0IG9yIHJlZ2VuZXJhdGUgYGNvbmZpZ3VyZScgdXNpbmcgYSBuZXdlciB2ZXJzaW9uIG9mIGBhdXRvY29uZicuCisKK1RoZSBzaW1wbGVzdCB3YXkgdG8gY29tcGlsZSB0aGlzIHBhY2thZ2UgaXM6CisKKyAgMS4gYGNkJyB0byB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIHBhY2thZ2UncyBzb3VyY2UgY29kZSBhbmQgdHlwZQorICAgICBgLi9jb25maWd1cmUnIHRvIGNvbmZpZ3VyZSB0aGUgcGFja2FnZSBmb3IgeW91ciBzeXN0ZW0uICBJZiB5b3UncmUKKyAgICAgdXNpbmcgYGNzaCcgb24gYW4gb2xkIHZlcnNpb24gb2YgU3lzdGVtIFYsIHlvdSBtaWdodCBuZWVkIHRvIHR5cGUKKyAgICAgYHNoIC4vY29uZmlndXJlJyBpbnN0ZWFkIHRvIHByZXZlbnQgYGNzaCcgZnJvbSB0cnlpbmcgdG8gZXhlY3V0ZQorICAgICBgY29uZmlndXJlJyBpdHNlbGYuCisKKyAgICAgUnVubmluZyBgY29uZmlndXJlJyB0YWtlcyBhd2hpbGUuICBXaGlsZSBydW5uaW5nLCBpdCBwcmludHMgc29tZQorICAgICBtZXNzYWdlcyB0ZWxsaW5nIHdoaWNoIGZlYXR1cmVzIGl0IGlzIGNoZWNraW5nIGZvci4KKworICAyLiBUeXBlIGBtYWtlJyB0byBjb21waWxlIHRoZSBwYWNrYWdlLgorCisgIDMuIE9wdGlvbmFsbHksIHR5cGUgYG1ha2UgY2hlY2snIHRvIHJ1biBhbnkgc2VsZi10ZXN0cyB0aGF0IGNvbWUgd2l0aAorICAgICB0aGUgcGFja2FnZS4KKworICA0LiBUeXBlIGBtYWtlIGluc3RhbGwnIHRvIGluc3RhbGwgdGhlIHByb2dyYW1zIGFuZCBhbnkgZGF0YSBmaWxlcyBhbmQKKyAgICAgZG9jdW1lbnRhdGlvbi4KKworICA1LiBZb3UgY2FuIHJlbW92ZSB0aGUgcHJvZ3JhbSBiaW5hcmllcyBhbmQgb2JqZWN0IGZpbGVzIGZyb20gdGhlCisgICAgIHNvdXJjZSBjb2RlIGRpcmVjdG9yeSBieSB0eXBpbmcgYG1ha2UgY2xlYW4nLiAgVG8gYWxzbyByZW1vdmUgdGhlCisgICAgIGZpbGVzIHRoYXQgYGNvbmZpZ3VyZScgY3JlYXRlZCAoc28geW91IGNhbiBjb21waWxlIHRoZSBwYWNrYWdlIGZvcgorICAgICBhIGRpZmZlcmVudCBraW5kIG9mIGNvbXB1dGVyKSwgdHlwZSBgbWFrZSBkaXN0Y2xlYW4nLiAgVGhlcmUgaXMKKyAgICAgYWxzbyBhIGBtYWtlIG1haW50YWluZXItY2xlYW4nIHRhcmdldCwgYnV0IHRoYXQgaXMgaW50ZW5kZWQgbWFpbmx5CisgICAgIGZvciB0aGUgcGFja2FnZSdzIGRldmVsb3BlcnMuICBJZiB5b3UgdXNlIGl0LCB5b3UgbWF5IGhhdmUgdG8gZ2V0CisgICAgIGFsbCBzb3J0cyBvZiBvdGhlciBwcm9ncmFtcyBpbiBvcmRlciB0byByZWdlbmVyYXRlIGZpbGVzIHRoYXQgY2FtZQorICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKK0NvbXBpbGVycyBhbmQgT3B0aW9ucworPT09PT09PT09PT09PT09PT09PT09CisKKyAgIFNvbWUgc3lzdGVtcyByZXF1aXJlIHVudXN1YWwgb3B0aW9ucyBmb3IgY29tcGlsYXRpb24gb3IgbGlua2luZyB0aGF0Cit0aGUgYGNvbmZpZ3VyZScgc2NyaXB0IGRvZXMgbm90IGtub3cgYWJvdXQuICBZb3UgY2FuIGdpdmUgYGNvbmZpZ3VyZScKK2luaXRpYWwgdmFsdWVzIGZvciB2YXJpYWJsZXMgYnkgc2V0dGluZyB0aGVtIGluIHRoZSBlbnZpcm9ubWVudC4gIFVzaW5nCithIEJvdXJuZS1jb21wYXRpYmxlIHNoZWxsLCB5b3UgY2FuIGRvIHRoYXQgb24gdGhlIGNvbW1hbmQgbGluZSBsaWtlCit0aGlzOgorICAgICBDQz1jODkgQ0ZMQUdTPS1PMiBMSUJTPS1scG9zaXggLi9jb25maWd1cmUKKworT3Igb24gc3lzdGVtcyB0aGF0IGhhdmUgdGhlIGBlbnYnIHByb2dyYW0sIHlvdSBjYW4gZG8gaXQgbGlrZSB0aGlzOgorICAgICBlbnYgQ1BQRkxBR1M9LUkvdXNyL2xvY2FsL2luY2x1ZGUgTERGTEFHUz0tcyAuL2NvbmZpZ3VyZQorCitDb21waWxpbmcgRm9yIE11bHRpcGxlIEFyY2hpdGVjdHVyZXMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICBZb3UgY2FuIGNvbXBpbGUgdGhlIHBhY2thZ2UgZm9yIG1vcmUgdGhhbiBvbmUga2luZCBvZiBjb21wdXRlciBhdCB0aGUKK3NhbWUgdGltZSwgYnkgcGxhY2luZyB0aGUgb2JqZWN0IGZpbGVzIGZvciBlYWNoIGFyY2hpdGVjdHVyZSBpbiB0aGVpcgorb3duIGRpcmVjdG9yeS4gIFRvIGRvIHRoaXMsIHlvdSBtdXN0IHVzZSBhIHZlcnNpb24gb2YgYG1ha2UnIHRoYXQKK3N1cHBvcnRzIHRoZSBgVlBBVEgnIHZhcmlhYmxlLCBzdWNoIGFzIEdOVSBgbWFrZScuICBgY2QnIHRvIHRoZQorZGlyZWN0b3J5IHdoZXJlIHlvdSB3YW50IHRoZSBvYmplY3QgZmlsZXMgYW5kIGV4ZWN1dGFibGVzIHRvIGdvIGFuZCBydW4KK3RoZSBgY29uZmlndXJlJyBzY3JpcHQuICBgY29uZmlndXJlJyBhdXRvbWF0aWNhbGx5IGNoZWNrcyBmb3IgdGhlCitzb3VyY2UgY29kZSBpbiB0aGUgZGlyZWN0b3J5IHRoYXQgYGNvbmZpZ3VyZScgaXMgaW4gYW5kIGluIGAuLicuCisKKyAgIElmIHlvdSBoYXZlIHRvIHVzZSBhIGBtYWtlJyB0aGF0IGRvZXMgbm90IHN1cHBvcnRzIHRoZSBgVlBBVEgnCit2YXJpYWJsZSwgeW91IGhhdmUgdG8gY29tcGlsZSB0aGUgcGFja2FnZSBmb3Igb25lIGFyY2hpdGVjdHVyZSBhdCBhIHRpbWUKK2luIHRoZSBzb3VyY2UgY29kZSBkaXJlY3RvcnkuICBBZnRlciB5b3UgaGF2ZSBpbnN0YWxsZWQgdGhlIHBhY2thZ2UgZm9yCitvbmUgYXJjaGl0ZWN0dXJlLCB1c2UgYG1ha2UgZGlzdGNsZWFuJyBiZWZvcmUgcmVjb25maWd1cmluZyBmb3IgYW5vdGhlcgorYXJjaGl0ZWN0dXJlLgorCitJbnN0YWxsYXRpb24gTmFtZXMKKz09PT09PT09PT09PT09PT09PQorCisgICBCeSBkZWZhdWx0LCBgbWFrZSBpbnN0YWxsJyB3aWxsIGluc3RhbGwgdGhlIHBhY2thZ2UncyBmaWxlcyBpbgorYC91c3IvbG9jYWwvYmluJywgYC91c3IvbG9jYWwvbWFuJywgZXRjLiAgWW91IGNhbiBzcGVjaWZ5IGFuCitpbnN0YWxsYXRpb24gcHJlZml4IG90aGVyIHRoYW4gYC91c3IvbG9jYWwnIGJ5IGdpdmluZyBgY29uZmlndXJlJyB0aGUKK29wdGlvbiBgLS1wcmVmaXg9UEFUSCcuCisKKyAgIFlvdSBjYW4gc3BlY2lmeSBzZXBhcmF0ZSBpbnN0YWxsYXRpb24gcHJlZml4ZXMgZm9yCithcmNoaXRlY3R1cmUtc3BlY2lmaWMgZmlsZXMgYW5kIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBmaWxlcy4gIElmIHlvdQorZ2l2ZSBgY29uZmlndXJlJyB0aGUgb3B0aW9uIGAtLWV4ZWMtcHJlZml4PVBBVEgnLCB0aGUgcGFja2FnZSB3aWxsIHVzZQorUEFUSCBhcyB0aGUgcHJlZml4IGZvciBpbnN0YWxsaW5nIHByb2dyYW1zIGFuZCBsaWJyYXJpZXMuCitEb2N1bWVudGF0aW9uIGFuZCBvdGhlciBkYXRhIGZpbGVzIHdpbGwgc3RpbGwgdXNlIHRoZSByZWd1bGFyIHByZWZpeC4KKworICAgSW4gYWRkaXRpb24sIGlmIHlvdSB1c2UgYW4gdW51c3VhbCBkaXJlY3RvcnkgbGF5b3V0IHlvdSBjYW4gZ2l2ZQorb3B0aW9ucyBsaWtlIGAtLWJpbmRpcj1QQVRIJyB0byBzcGVjaWZ5IGRpZmZlcmVudCB2YWx1ZXMgZm9yIHBhcnRpY3VsYXIKK2tpbmRzIG9mIGZpbGVzLiAgUnVuIGBjb25maWd1cmUgLS1oZWxwJyBmb3IgYSBsaXN0IG9mIHRoZSBkaXJlY3RvcmllcworeW91IGNhbiBzZXQgYW5kIHdoYXQga2luZHMgb2YgZmlsZXMgZ28gaW4gdGhlbS4KKworICAgSWYgdGhlIHBhY2thZ2Ugc3VwcG9ydHMgaXQsIHlvdSBjYW4gY2F1c2UgcHJvZ3JhbXMgdG8gYmUgaW5zdGFsbGVkCit3aXRoIGFuIGV4dHJhIHByZWZpeCBvciBzdWZmaXggb24gdGhlaXIgbmFtZXMgYnkgZ2l2aW5nIGBjb25maWd1cmUnIHRoZQorb3B0aW9uIGAtLXByb2dyYW0tcHJlZml4PVBSRUZJWCcgb3IgYC0tcHJvZ3JhbS1zdWZmaXg9U1VGRklYJy4KKworT3B0aW9uYWwgRmVhdHVyZXMKKz09PT09PT09PT09PT09PT09CisKKyAgIFNvbWUgcGFja2FnZXMgcGF5IGF0dGVudGlvbiB0byBgLS1lbmFibGUtRkVBVFVSRScgb3B0aW9ucyB0bworYGNvbmZpZ3VyZScsIHdoZXJlIEZFQVRVUkUgaW5kaWNhdGVzIGFuIG9wdGlvbmFsIHBhcnQgb2YgdGhlIHBhY2thZ2UuCitUaGV5IG1heSBhbHNvIHBheSBhdHRlbnRpb24gdG8gYC0td2l0aC1QQUNLQUdFJyBvcHRpb25zLCB3aGVyZSBQQUNLQUdFCitpcyBzb21ldGhpbmcgbGlrZSBgZ251LWFzJyBvciBgeCcgKGZvciB0aGUgWCBXaW5kb3cgU3lzdGVtKS4gIFRoZQorYFJFQURNRScgc2hvdWxkIG1lbnRpb24gYW55IGAtLWVuYWJsZS0nIGFuZCBgLS13aXRoLScgb3B0aW9ucyB0aGF0IHRoZQorcGFja2FnZSByZWNvZ25pemVzLgorCisgICBGb3IgcGFja2FnZXMgdGhhdCB1c2UgdGhlIFggV2luZG93IFN5c3RlbSwgYGNvbmZpZ3VyZScgY2FuIHVzdWFsbHkKK2ZpbmQgdGhlIFggaW5jbHVkZSBhbmQgbGlicmFyeSBmaWxlcyBhdXRvbWF0aWNhbGx5LCBidXQgaWYgaXQgZG9lc24ndCwKK3lvdSBjYW4gdXNlIHRoZSBgY29uZmlndXJlJyBvcHRpb25zIGAtLXgtaW5jbHVkZXM9RElSJyBhbmQKK2AtLXgtbGlicmFyaWVzPURJUicgdG8gc3BlY2lmeSB0aGVpciBsb2NhdGlvbnMuCisKK1NwZWNpZnlpbmcgdGhlIFN5c3RlbSBUeXBlCis9PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICBUaGVyZSBtYXkgYmUgc29tZSBmZWF0dXJlcyBgY29uZmlndXJlJyBjYW4gbm90IGZpZ3VyZSBvdXQKK2F1dG9tYXRpY2FsbHksIGJ1dCBuZWVkcyB0byBkZXRlcm1pbmUgYnkgdGhlIHR5cGUgb2YgaG9zdCB0aGUgcGFja2FnZQord2lsbCBydW4gb24uICBVc3VhbGx5IGBjb25maWd1cmUnIGNhbiBmaWd1cmUgdGhhdCBvdXQsIGJ1dCBpZiBpdCBwcmludHMKK2EgbWVzc2FnZSBzYXlpbmcgaXQgY2FuIG5vdCBndWVzcyB0aGUgaG9zdCB0eXBlLCBnaXZlIGl0IHRoZQorYC0taG9zdD1UWVBFJyBvcHRpb24uICBUWVBFIGNhbiBlaXRoZXIgYmUgYSBzaG9ydCBuYW1lIGZvciB0aGUgc3lzdGVtCit0eXBlLCBzdWNoIGFzIGBzdW40Jywgb3IgYSBjYW5vbmljYWwgbmFtZSB3aXRoIHRocmVlIGZpZWxkczoKKyAgICAgQ1BVLUNPTVBBTlktU1lTVEVNCisKK1NlZSB0aGUgZmlsZSBgY29uZmlnLnN1YicgZm9yIHRoZSBwb3NzaWJsZSB2YWx1ZXMgb2YgZWFjaCBmaWVsZC4gIElmCitgY29uZmlnLnN1YicgaXNuJ3QgaW5jbHVkZWQgaW4gdGhpcyBwYWNrYWdlLCB0aGVuIHRoaXMgcGFja2FnZSBkb2Vzbid0CituZWVkIHRvIGtub3cgdGhlIGhvc3QgdHlwZS4KKworICAgSWYgeW91IGFyZSBidWlsZGluZyBjb21waWxlciB0b29scyBmb3IgY3Jvc3MtY29tcGlsaW5nLCB5b3UgY2FuIGFsc28KK3VzZSB0aGUgYC0tdGFyZ2V0PVRZUEUnIG9wdGlvbiB0byBzZWxlY3QgdGhlIHR5cGUgb2Ygc3lzdGVtIHRoZXkgd2lsbAorcHJvZHVjZSBjb2RlIGZvciBhbmQgdGhlIGAtLWJ1aWxkPVRZUEUnIG9wdGlvbiB0byBzZWxlY3QgdGhlIHR5cGUgb2YKK3N5c3RlbSBvbiB3aGljaCB5b3UgYXJlIGNvbXBpbGluZyB0aGUgcGFja2FnZS4KKworU2hhcmluZyBEZWZhdWx0cworPT09PT09PT09PT09PT09PQorCisgICBJZiB5b3Ugd2FudCB0byBzZXQgZGVmYXVsdCB2YWx1ZXMgZm9yIGBjb25maWd1cmUnIHNjcmlwdHMgdG8gc2hhcmUsCit5b3UgY2FuIGNyZWF0ZSBhIHNpdGUgc2hlbGwgc2NyaXB0IGNhbGxlZCBgY29uZmlnLnNpdGUnIHRoYXQgZ2l2ZXMKK2RlZmF1bHQgdmFsdWVzIGZvciB2YXJpYWJsZXMgbGlrZSBgQ0MnLCBgY2FjaGVfZmlsZScsIGFuZCBgcHJlZml4Jy4KK2Bjb25maWd1cmUnIGxvb2tzIGZvciBgUFJFRklYL3NoYXJlL2NvbmZpZy5zaXRlJyBpZiBpdCBleGlzdHMsIHRoZW4KK2BQUkVGSVgvZXRjL2NvbmZpZy5zaXRlJyBpZiBpdCBleGlzdHMuICBPciwgeW91IGNhbiBzZXQgdGhlCitgQ09ORklHX1NJVEUnIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgc2l0ZSBzY3JpcHQuCitBIHdhcm5pbmc6IG5vdCBhbGwgYGNvbmZpZ3VyZScgc2NyaXB0cyBsb29rIGZvciBhIHNpdGUgc2NyaXB0LgorCitPcGVyYXRpb24gQ29udHJvbHMKKz09PT09PT09PT09PT09PT09PQorCisgICBgY29uZmlndXJlJyByZWNvZ25pemVzIHRoZSBmb2xsb3dpbmcgb3B0aW9ucyB0byBjb250cm9sIGhvdyBpdAorb3BlcmF0ZXMuCisKK2AtLWNhY2hlLWZpbGU9RklMRScKKyAgICAgVXNlIGFuZCBzYXZlIHRoZSByZXN1bHRzIG9mIHRoZSB0ZXN0cyBpbiBGSUxFIGluc3RlYWQgb2YKKyAgICAgYC4vY29uZmlnLmNhY2hlJy4gIFNldCBGSUxFIHRvIGAvZGV2L251bGwnIHRvIGRpc2FibGUgY2FjaGluZywgZm9yCisgICAgIGRlYnVnZ2luZyBgY29uZmlndXJlJy4KKworYC0taGVscCcKKyAgICAgUHJpbnQgYSBzdW1tYXJ5IG9mIHRoZSBvcHRpb25zIHRvIGBjb25maWd1cmUnLCBhbmQgZXhpdC4KKworYC0tcXVpZXQnCitgLS1zaWxlbnQnCitgLXEnCisgICAgIERvIG5vdCBwcmludCBtZXNzYWdlcyBzYXlpbmcgd2hpY2ggY2hlY2tzIGFyZSBiZWluZyBtYWRlLiAgVG8KKyAgICAgc3VwcHJlc3MgYWxsIG5vcm1hbCBvdXRwdXQsIHJlZGlyZWN0IGl0IHRvIGAvZGV2L251bGwnIChhbnkgZXJyb3IKKyAgICAgbWVzc2FnZXMgd2lsbCBzdGlsbCBiZSBzaG93bikuCisKK2AtLXNyY2Rpcj1ESVInCisgICAgIExvb2sgZm9yIHRoZSBwYWNrYWdlJ3Mgc291cmNlIGNvZGUgaW4gZGlyZWN0b3J5IERJUi4gIFVzdWFsbHkKKyAgICAgYGNvbmZpZ3VyZScgY2FuIGRldGVybWluZSB0aGF0IGRpcmVjdG9yeSBhdXRvbWF0aWNhbGx5LgorCitgLS12ZXJzaW9uJworICAgICBQcmludCB0aGUgdmVyc2lvbiBvZiBBdXRvY29uZiB1c2VkIHRvIGdlbmVyYXRlIHRoZSBgY29uZmlndXJlJworICAgICBzY3JpcHQsIGFuZCBleGl0LgorCitgY29uZmlndXJlJyBhbHNvIGFjY2VwdHMgc29tZSBvdGhlciwgbm90IHdpZGVseSB1c2VmdWwsIG9wdGlvbnMuCmRpZmYgLS1naXQgYS9NT0RVTEVfTElDRU5TRV9BRkxfQU5EX0dQTCBiL01PRFVMRV9MSUNFTlNFX0FGTF9BTkRfR1BMCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9NT0RVTEVfTElDRU5TRV9BRkxfQU5EX0dQTApkaWZmIC0tZ2l0IGEvTWFrZWZpbGUuYW0gYi9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTE4M2NiCi0tLSAvZGV2L251bGwKKysrIGIvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw1NCBAQAorU1VCRElSUz1kYnVzIGJ1cyB0b29scyB0ZXN0IGRvYworCitwa2djb25maWdkaXIgPSAkKGxpYmRpcikvcGtnY29uZmlnCitwa2djb25maWdfREFUQSA9IGRidXMtMS5wYworCitjbWFrZWNvbmZpZ2RpciA9ICQobGliZGlyKS9jbWFrZS9EQnVzMQorY21ha2Vjb25maWdfREFUQSA9IGNtYWtlL0RCdXMxQ29uZmlnLmNtYWtlICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICBjbWFrZS9EQnVzMUNvbmZpZ1ZlcnNpb24uY21ha2UKKworRVhUUkFfRElTVCA9CQkJXAorCWF1dG9nZW4uc2gJCVwKKwlDT05UUklCVVRJTkcubWQJCVwKKwlkYnVzLTEucGMuaW4JCVwKKwljbGVhbnVwLW1hbi1wYWdlcy5zaCAgICBcCisgICAgICAgIENoYW5nZUxvZy5wcmUtMS0wICAgICAgIFwKKyAgICAgICAgTkVXUy5wcmUtMS0wICAgICAgICAgICAgXAorCUNoYW5nZUxvZy5wcmUtMS0yICAgICAgIFwKKyAgICAgICAgTkVXUy5wcmUtMS0yCQlcCisJUkVBRE1FLmNtYWtlCQlcCisJUkVBRE1FLnZhbGdyaW5kCQlcCisJUkVBRE1FLndpbgkJXAorCVJFQURNRS53aW5jZQkJXAorCVJFQURNRS5jeWd3aW4JCVwKKwlSRUFETUUubGF1bmNoZAkJXAorCWNtYWtlL0NNYWtlTGlzdHMudHh0IFwKKwljbWFrZS9Db25maWd1cmVDaGVja3MuY21ha2UgXAorCWNtYWtlL0RCdXMxQ29uZmlnLmNtYWtlLmluIFwKKwljbWFrZS9EQnVzMUNvbmZpZy5wa2djb25maWcuaW4gXAorCWNtYWtlL0RCdXMxQ29uZmlnVmVyc2lvbi5jbWFrZS5pbiBcCisJY21ha2UvYnVzIFwKKwljbWFrZS9idXMtdGVzdC5iYXQuY21ha2UgXAorCWNtYWtlL2NvbmZpZy5oLmNtYWtlIFwKKwljbWFrZS9kYnVzIFwKKwljbWFrZS9kYnVzLWVudi5iYXQuY21ha2UgXAorCWNtYWtlL2RvYyBcCisJY21ha2UvaTY4Ni13NjQtbWluZ3czMi5jbWFrZSBcCisJY21ha2UvbW9kdWxlcyBcCisJY21ha2UvdGVzdCBcCisJY21ha2UvdG9vbHMgXAorCSQoTlVMTCkKKworYWxsLWxvY2FsOiBEb3h5ZmlsZQorCit1cGRhdGUtYXV0aG9yczoKKwlnaXQgc2hvcnRsb2cgLXMgLWUgfCBjdXQgLWMgOC0gfCBzb3J0ID4gQVVUSE9SUworCitESVNUQ0hFQ0tfQ09ORklHVVJFX0ZMQUdTID0gXAorCS0tZW5hYmxlLXhtbC1kb2NzIFwKKwktLXdpdGgtc3lzdGVtZHN5c3RlbXVuaXRkaXI9JCRkY19pbnN0YWxsX2Jhc2UvJChzeXN0ZW1kc3lzdGVtdW5pdGRpcikKKworQUNMT0NBTF9BTUZMQUdTID0gLUkgbTQgJHtBQ0xPQ0FMX0ZMQUdTfQorCisjIEFkZCBydWxlcyBmb3IgY29kZS1jb3ZlcmFnZSB0ZXN0aW5nLCBhcyBkZWZpbmVkIGJ5IEFYX0NPREVfQ09WRVJBR0UKK2luY2x1ZGUgJCh0b3Bfc3JjZGlyKS9hbWluY2x1ZGVfc3RhdGljLmFtCmRpZmYgLS1naXQgYS9ORVdTIGIvTkVXUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmNhMTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvTkVXUwpAQCAtMCwwICsxLDMxODggQEAKK2RidXMgMS4xMi4yMCAoMjAyMC0wNy0wMikKKz09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhlIOKAnHRlbXBvcmFyeSBuZW1lc2lz4oCdIHJlbGVhc2UuCisKK01heWJlIHNlY3VyaXR5IGZpeGVzOgorCivigKIgT24gVW5peCwgYXZvaWQgYSB1c2UtYWZ0ZXItZnJlZSBpZiB0d28gdXNlcm5hbWVzIGhhdmUgdGhlIHNhbWUKKyAgbnVtZXJpYyB1aWQuIEluIG9sZGVyIHZlcnNpb25zIHRoaXMgY291bGQgbGVhZCB0byBhIGNyYXNoIChkZW5pYWwgb2YKKyAgc2VydmljZSkgb3Igb3RoZXIgdW5kZWZpbmVkIGJlaGF2aW91ciwgcG9zc2libHkgaW5jbHVkaW5nIGluY29ycmVjdAorICBhdXRob3JpemF0aW9uIGRlY2lzaW9ucyBpZiA8cG9saWN5IGdyb3VwPS4uLj4gaXMgdXNlZC4KKyAgTGlrZSBVbml4IGZpbGVzeXN0ZW1zLCBELUJ1cycgbW9kZWwgb2YgaWRlbnRpdHkgY2Fubm90IGRpc3Rpbmd1aXNoCisgIGJldHdlZW4gdXNlcnMgb2YgZGlmZmVyZW50IG5hbWVzIHdpdGggdGhlIHNhbWUgbnVtZXJpYyB1aWQsIHNvIHRoaXMKKyAgY29uZmlndXJhdGlvbiBpcyBub3QgYWR2aXNhYmxlIG9uIHN5c3RlbXMgd2hlcmUgRC1CdXMgd2lsbCBiZSB1c2VkLgorICBUaGFua3MgdG8gRGFuaWVsIE9uYWNhLgorICAoZGJ1cyMzMDUsIGRidXMhMTY2OyBTaW1vbiBNY1ZpdHRpZSkKKworT3RoZXIgZml4ZXM6CisKK+KAoiBPbiBTb2xhcmlzIGFuZCBpdHMgZGVyaXZhdGl2ZXMsIGlmIGEgY21zZyBoZWFkZXIgaXMgdHJ1bmNhdGVkLCBlbnN1cmUKKyAgdGhhdCB3ZSBkbyBub3Qgb3ZlcnJ1biB0aGUgYnVmZmVyIHVzZWQgZm9yIGZkLXBhc3NpbmcsIGV2ZW4gaWYgdGhlCisgIGtlcm5lbCB0ZWxscyB1cyB0by4KKyAgKGRidXMjMzA0LCBkYnVzITE2NTsgQW5keSBGaWRkYW1hbikKKworZGJ1cyAxLjEyLjE4ICgyMDIwLTA2LTAyKQorPT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGUg4oCcdGVsZXBhdGhpYyB2aW5lc+KAnSByZWxlYXNlLgorCitEZW5pYWwgb2Ygc2VydmljZSBmaXhlczoKKwor4oCiIENWRS0yMDIwLTEyMDQ5OiBJZiBhIG1lc3NhZ2UgY29udGFpbnMgbW9yZSBmaWxlIGRlc2NyaXB0b3JzIHRoYW4gY2FuCisgIGJlIHNlbnQsIGNsb3NlIHRob3NlIHRoYXQgZGlkIGdldCB0aHJvdWdoIGJlZm9yZSByZXBvcnRpbmcgZXJyb3IuCisgIFByZXZpb3VzbHksIGEgbG9jYWwgYXR0YWNrZXIgY291bGQgY2F1c2UgdGhlIHN5c3RlbSBkYnVzLWRhZW1vbiAob3IKKyAgYW5vdGhlciBzeXN0ZW0gc2VydmljZSB3aXRoIGl0cyBvd24gREJ1c1NlcnZlcikgdG8gcnVuIG91dCBvZiBmaWxlCisgIGRlc2NyaXB0b3JzLCBieSByZXBlYXRlZGx5IGNvbm5lY3RpbmcgdG8gdGhlIHNlcnZlciBhbmQgc2VuZGluZyBmZHMgdGhhdAorICB3b3VsZCBnZXQgbGVha2VkLgorICBUaGFua3MgdG8gS2V2aW4gQmFja2hvdXNlIG9mIEdpdEh1YiBTZWN1cml0eSBMYWIuCisgIChkYnVzIzI5NCwgR0hTTC0yMDIwLTA1NzsgU2ltb24gTWNWaXR0aWUpCisKK090aGVyIGZpeGVzOgorCivigKIgRml4IGEgY3Jhc2ggd2hlbiB0aGUgZGJ1cy1kYWVtb24gaXMgdGVybWluYXRlZCB3aGlsZSBvbmUgb3IgbW9yZQorICBtb25pdG9ycyBhcmUgYWN0aXZlIChkYnVzIzI5MSwgZGJ1cyExNDA7IFNpbW9uIE1jVml0dGllKQorCivigKIgVGhlIGRidXMtc2VuZCgxKSBtYW4gcGFnZSBub3cgZG9jdW1lbnRzIC0tYnVzIGFuZCAtLXBlZXIgaW5zdGVhZCBvZgorICB0aGUgb2xkIC0tYWRkcmVzcyBzeW5vbnltIGZvciAtLXBlZXIsIHdoaWNoIGhhcyBiZWVuIGRlcHJlY2F0ZWQgc2luY2UKKyAgdGhlIGludHJvZHVjdGlvbiBvZiAtLWJ1cyBhbmQgLS1wZWVyIGluIDEuNy42CisgIChmZC5vICM0ODgxNiwgZGJ1cyExMTU7IENocmlzIE1vcmluKQorCivigKIgRml4IGEgd3JvbmcgZW52aXJvbm1lbnQgdmFyaWFibGUgbmFtZSBpbiBkYnVzLWRhZW1vbigxKQorICAoZGJ1cyMyNzUsIGRidXMhMTIyOyBNdWJpbiwgUGhpbGlwIFdpdGhuYWxsKQorCivigKIgRml4IGZvcm1hdHRpbmcgb2YgZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIGV4YW1wbGUKKyAgKGRidXMhMTI2LCBGZWxpcGUgRnJhbmNpb3NpKQorCivigKIgQXZvaWQgYSB0ZXN0IGZhaWx1cmUgb24gTGludXggd2hlbiBidWlsdCBpbiBhIGNvbnRhaW5lciBhcyB1aWQgMCwgYnV0CisgIHdpdGhvdXQgdGhlIG5lY2Vzc2FyeSBwcml2aWxlZ2VzIHRvIGluY3JlYXNlIHJlc291cmNlIGxpbWl0cworICAoZGJ1cyE1OCwgRGViaWFuICM5MDgwOTI7IFNpbW9uIE1jVml0dGllKQorCivigKIgV2hlbiBidWlsZGluZyB3aXRoIENNYWtlLCBjb3BlIHdpdGggbGliWDExIGluIGEgbm9uLXN0YW5kYXJkIGxvY2F0aW9uCisgIChkYnVzITEyOSwgVHVvbW8gUmlubmUpCisKK2RidXMgMS4xMi4xNiAoMjAxOS0wNi0xMSkKKz09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhlIOKAnHRyZWUgY2F04oCdIHJlbGVhc2UuCisKK1NlY3VyaXR5IGZpeGVzOgorCivigKIgQ1ZFLTIwMTktMTI3NDk6IERvIG5vdCBhdHRlbXB0IHRvIGNhcnJ5IG91dCBEQlVTX0NPT0tJRV9TSEExCisgIGF1dGhlbnRpY2F0aW9uIGZvciBpZGVudGl0aWVzIHRoYXQgZGlmZmVyIGZyb20gdGhlIHVzZXIgcnVubmluZyB0aGUKKyAgREJ1c1NlcnZlci4gUHJldmlvdXNseSwgYSBsb2NhbCBhdHRhY2tlciBjb3VsZCBtYW5pcHVsYXRlIHN5bWJvbGljCisgIGxpbmtzIGluIHRoZWlyIG93biBob21lIGRpcmVjdG9yeSB0byBieXBhc3MgYXV0aGVudGljYXRpb24gYW5kIGNvbm5lY3QKKyAgdG8gYSBEQnVzU2VydmVyIHdpdGggZWxldmF0ZWQgcHJpdmlsZWdlcy4gVGhlIHN0YW5kYXJkIHN5c3RlbSBhbmQKKyAgc2Vzc2lvbiBkYnVzLWRhZW1vbnMgaW4gdGhlaXIgZGVmYXVsdCBjb25maWd1cmF0aW9uIHdlcmUgaW1tdW5lIHRvIHRoaXMKKyAgYXR0YWNrIGJlY2F1c2UgdGhleSBkaWQgbm90IGFsbG93IERCVVNfQ09PS0lFX1NIQTEsIGJ1dCB0aGlyZC1wYXJ0eQorICB1c2VycyBvZiBEQnVzU2VydmVyIHN1Y2ggYXMgVXBzdGFydCBjb3VsZCBiZSB2dWxuZXJhYmxlLgorICBUaGFua3MgdG8gSm9lIFZlbm5peCBvZiBBcHBsZSBJbmZvcm1hdGlvbiBTZWN1cml0eS4KKyAgKGRidXMjMjY5LCBTaW1vbiBNY1ZpdHRpZSkKKworZGJ1cyAxLjEyLjE0ICgyMDE5LTA1LTE3KQorPT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGUg4oCccmVjbGFpbWVkIGZsb29yYm9hcmRz4oCdIHJlbGVhc2UuCisKK0VuaGFuY2VtZW50czoKKwor4oCiIFJhaXNlIHNvZnQgZmQgbGltaXQgdG8gbWF0Y2ggaGFyZCBsaW1pdCwgZXZlbiBpZiB1bnByaXZpbGVnZWQuCisgIFRoaXMgbWFrZXMgc2Vzc2lvbiBidXNlcyB3aXRoIG1hbnkgY2xpZW50cywgb3Igd2l0aCBjbGllbnRzIHRoYXQgbWFrZQorICBoZWF2eSB1c2Ugb2YgZmQtcGFzc2luZywgbGVzcyBsaWtlbHkgdG8gc3VmZmVyIGZyb20gZmQgZXhoYXVzdGlvbi4KKyAgKGRidXMhMTAzLCBTaW1vbiBNY1ZpdHRpZSkKKworRml4ZXM6CisKK+KAoiBJZiBhIHByaXZpbGVnZWQgZGJ1cy1kYWVtb24gaGFzIGEgaGFyZCBmZCBsaW1pdCBncmVhdGVyIHRoYW4gNjRLLCBkb24ndAorICByZWR1Y2UgaXQgdG8gNjRLLCBlbnN1cmluZyB0aGF0IHdlIGNhbiBwdXQgYmFjayB0aGUgb3JpZ2luYWwgZmQgbGltaXRzCisgIHdoZW4gY2Fycnlpbmcgb3V0IHRyYWRpdGlvbmFsIChub24tc3lzdGVtZCkgYWN0aXZhdGlvbi4gVGhpcyBmaXhlcyBhCisgIHJlZ3Jlc3Npb24gd2l0aCBzeXN0ZW1kID49IDI0MCBpbiB3aGljaCBzeXN0ZW0gc2VydmljZXMgaW5oZXJpdGVkCisgIGRidXMtZGFlbW9uJ3MgaGFyZCBhbmQgc29mdCBsaW1pdCBvZiA2NEsgZmRzLCBpbnN0ZWFkIG9mIHRoZSBpbnRlbmRlZAorICBzb2Z0IGxpbWl0IG9mIDFLIGFuZCBoYXJkIGxpbWl0IG9mIDUxMksgb3IgMU0uCisgIChkYnVzITEwMywgRGViaWFuIzkyODg3NzsgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBGaXggYnVpbGQgZmFpbHVyZXMgY2F1c2VkIGJ5IGFuIEFYX0NPREVfQ09WRVJBR0UgQVBJIGNoYW5nZSBpbiBuZXdlcgorICBhdXRvY29uZi1hcmNoaXZlIHZlcnNpb25zIChkYnVzIzI0OSwgZGJ1cyE4ODsgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBGaXggYnVpbGQgZmFpbHVyZXMgd2l0aCBuZXdlciBhdXRvY29uZi1hcmNoaXZlIHZlcnNpb25zIHRoYXQgaW5jbHVkZQorICBBWF8tcHJlZml4ZWQgc2hlbGwgdmFyaWFibGUgbmFtZXMgKGRidXMjMjQ5LCBkYnVzITg2OyBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIFBhcnNlIHNlY3Rpb24vZ3JvdXAgbmFtZXMgaW4gLnNlcnZpY2UgZmlsZXMgYWNjb3JkaW5nIHRvIHRoZSBzeW50YXgKKyAgZnJvbSB0aGUgRGVza3RvcCBFbnRyeSBTcGVjaWZpY2F0aW9uLCByZWplY3RpbmcgY29udHJvbCBjaGFyYWN0ZXJzCisgIGFuZCBub24tQVNDSUkgaW4gc2VjdGlvbi9ncm91cCBuYW1lcyAoZGJ1cyMyMDgsIERhdmlkIEtpbmcpCisKK+KAoiBGaXggdmFyaW91cyAtV2xvZ2ljYWwtb3AgaXNzdWVzIHRoYXQgY2F1c2UgYnVpbGQgZmFpbHVyZSB3aXRoIG5ld2VyCisgIGdjYyB2ZXJzaW9ucyAoZGJ1cyMyMjUsIGRidXMhMTA5OyBEYXZpZCBLaW5nKQorCivigKIgRG9uJ3QgYXNzdW1lIHdlIGNhbiBzZXQgcGVybWlzc2lvbnMgb24gYSBkaXJlY3RvcnksIGZvciB0aGUgYmVuZWZpdCBvZgorICBNU1lTIGFuZCBDeWd3aW4gYnVpbGRzIChkYnVzIzIxNiwgZGJ1cyExMTA7IFNpbW9uIE1jVml0dGllKQorCivigKIgRG9uJ3Qgb3ZlcndyaXRlIFBLR19DT05GSUdfUEFUSCBhbmQgcmVsYXRlZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgd2hlbgorICB0aGUgcGtnLWNvbmZpZy1iYXNlZCB2ZXJzaW9uIG9mIERCdXMxQ29uZmlnIGlzIHVzZWQgaW4gYSBDTWFrZSBwcm9qZWN0CisgIChkYnVzIzI2NywgZGJ1cyE5NjsgQ2xlbWVucyBMYW5nKQorCitkYnVzIDEuMTIuMTIgKDIwMTgtMTItMDQpCis9PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoZSDigJxkcmFjb25pYyBkaXNjaXBsZeKAnSByZWxlYXNlLgorCitkYnVzIHZlcnNpb24gY29udHJvbCBpcyBub3cgaG9zdGVkIG9uIGZyZWVkZXNrdG9wLm9yZydzIEdpdGxhYgoraW5zdGFsbGF0aW9uLCBhbmQgYnVnIHJlcG9ydHMgYW5kIGZlYXR1cmUgcmVxdWVzdHMgaGF2ZSBzd2l0Y2hlZCBmcm9tCitCdWd6aWxsYSBidWdzIChpbmRpY2F0ZWQgYnkgImZkLm8gI25ubiIpIHRvIEdpdGxhYiBpc3N1ZXMgKCJkYnVzI25ubiIpCithbmQgbWVyZ2UgcmVxdWVzdHMgKCJkYnVzIW5ubiIpLgorCitFbmhhbmNlbWVudHM6CisKK+KAoiBSZWZlcmVuY2UgdGhlIGZyZWVkZXNrdG9wLm9yZyBDb2RlIG9mIENvbmR1Y3QgKFNpbW9uIE1jVml0dGllKQorCitGaXhlczoKKwor4oCiIFN0b3AgdGhlIGRidXMtZGFlbW9uIGxlYWtpbmcgbWVtb3J5IChhbiBlcnJvciBtZXNzYWdlKSBpZiBkZWxpdmVyaW5nCisgIHRoZSBtZXNzYWdlIHRoYXQgdHJpZ2dlcmVkIGF1dG8tYWN0aXZhdGlvbiBpcyBmb3JiaWRkZW4uIFRoaXMgaXMKKyAgdGVjaG5pY2FsbHkgYSBkZW5pYWwgb2Ygc2VydmljZSBiZWNhdXNlIHRoZSBkYnVzLWRhZW1vbiB3aWxsCisgIHJ1biBvdXQgb2YgbWVtb3J5IGV2ZW50dWFsbHksIGJ1dCBpdCdzIGEgdmVyeSBzbG93IGFuZCBub2lzeSBvbmUsCisgIGJlY2F1c2UgYWxsIHRoZSByZWplY3RlZCBtZXNzYWdlcyBhcmUgYWxzbyB2ZXJ5IGxpa2VseSB0byBoYXZlCisgIGJlZW4gbG9nZ2VkIHRvIHRoZSBzeXN0ZW0gbG9nLCBhbmQgaXRzIHNjb3BlIGlzIHR5cGljYWxseSBsaW1pdGVkIGJ5CisgIHRoZSBmaW5pdGUgbnVtYmVyIG9mIGFjdGl2YXRhYmxlIHNlcnZpY2VzIGF2YWlsYWJsZS4KKyAgKGRidXMjMjM0LCBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIFJlbW92ZSBfX2F0dHJpYnV0ZV9fKChfX21hbGxvY19fKSkgYXR0cmlidXRlIG9uIGRidXNfcmVhbGxvYygpLAorICB3aGljaCBkb2VzIG5vdCBtZWV0IHRoZSBjcml0ZXJpYSBmb3IgdGhhdCBhdHRyaWJ1dGUgaW4gZ2NjIDQuNyssCisgIHBvdGVudGlhbGx5IGxlYWRpbmcgdG8gbWlzY29tcGlsYXRpb24gKGZkLm8gIzEwNzc0MSwgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBGaXggc29tZSBzbWFsbCBPKDEpIG1lbW9yeSBsZWFrcyAoZmQubyAjMTA3MzIwLCBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIEZpeCBwcmludGYgZm9ybWF0cyBmb3IgcG9pbnRlci1zaXplZCBpbnRlZ2VycyBvbiA2NC1iaXQgV2luZG93cworICAoZmQubyAjMTA1NjYyLCBSYWxmIEhhYmFja2VyKQorCivigKIgQWx3YXlzIHVzZSBzZWxlY3QoKS1iYXNlZCBwb2xsKCkgZW11bGF0aW9uIG9uIERhcndpbi1iYXNlZCBPU3MKKyAgKG1hY09TLCBldGMuKSBhbmQgb24gSW50ZXJpeCwgc2ltaWxhciB0byB3aGF0IGxpYmN1cmwgZG9lcworICAoZGJ1cyMyMzIsIGRidXMhMTk7IFNpbW9uIE1jVml0dGllKQorCivigKIgRXh0ZW5kIGEgdGVzdCB0aW1lb3V0IHRvIGF2b2lkIHNwdXJpb3VzIGZhaWx1cmVzIGluIENJCisgIChkYnVzITI2LCBTaW1vbiBNY1ZpdHRpZSkKKworVGVzdHMgYW5kIENJOgorCivigKIgQWRkIFRyYXZpcy1DSSBidWlsZHMgZm9yIDY0LWJpdCBXaW5kb3dzIHVzaW5nIG1pbmd3LXc2NAorICAoZmQubyAjMTA1NjYyLCBSYWxmIEhhYmFja2VyKQorCivigKIgQWRkIEdpdGxhYi1DSSBpbnRlZ3JhdGlvbiAoZmQubyAjMTA4MTc3LCBTaW1vbiBNY1ZpdHRpZSkKKworZGJ1cyAxLjEyLjEwICgyMDE4LTA4LTAyKQorPT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGUg4oCcYmVhbSBkZWZsZWN0aW9u4oCdIHJlbGVhc2UuCisKK0ZpeGVzOgorCivigKIgUHJldmVudCByZWFkaW5nIHVwIHRvIDMgYnl0ZXMgYmV5b25kIHRoZSBlbmQgb2YgYSB0cnVuY2F0ZWQgbWVzc2FnZS4KKyAgVGhpcyBjb3VsZCBpbiBwcmluY2lwbGUgYmUgYW4gaW5mb3JtYXRpb24gbGVhayBvciBkZW5pYWwgb2Ygc2VydmljZQorICBvbiB0aGUgc3lzdGVtIGJ1cywgYnV0IGlzIG5vdCBiZWxpZXZlZCB0byBiZSBleHBsb2l0YWJsZSB0byBjcmFzaAorICB0aGUgc3lzdGVtIGJ1cyBvciBsZWFrIGludGVyZXN0aW5nIGluZm9ybWF0aW9uIGluIHByYWN0aWNlLgorICAoZmQubyAjMTA3MzMyLCBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIEZpeCBidWlsZCB3aXRoIGdjYyA4IC1XZXJyb3I9Y2FzdC1mdW5jdGlvbi10eXBlCisgIChmZC5vICMxMDczNDksIFNpbW9uIE1jVml0dGllKQorCivigKIgRml4IHdhcm5pbmcgZnJvbSBnY2MgOCBhYm91dCBzdXNwaWNpb3VzIHVzZSBvZiBzdHJuY3B5KCkgd2hlbgorICBwb3B1bGF0aW5nIHN0cnVjdCBzb2NrYWRkcl91biAoZmQubyAjMTA3MzUwLCBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIEZpeCBhIG1pbm9yIG1lbW9yeSBsZWFrIHdoZW4gYSBEQnVzU2VydmVyIGxpc3RlbnMgb24gYSBuZXcgYWRkcmVzcworICAoZmQubyAjMTA3MTk0LCBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIEZpeCBhbiBpbnZhbGlkIE5VTEwgYXJndW1lbnQgdG8gcm1kaXIoKSBpZiBhIG5vbmNlLXRjcCBEQnVzU2VydmVyCisgIHJ1bnMgb3V0IG9mIG1lbW9yeSAoZmQubyAjMTA3MTk0LCBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIERvbid0IHVzZSBtaXNsZWFkaW5nIGVycm5vLWRlcml2ZWQgZXJyb3IgbmFtZXMgaWYgZ2V0YWRkcmluZm8oKSBvcgorICBnZXRuYW1laW5mbygpIGZhaWxzIHdpdGggYSBjb2RlIG90aGVyIHRoYW4gRUFJX1NZU1RFTQorICAoZmQubyAjMTA2Mzk1LCBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIFNraXAgdGVzdHMgdGhhdCByZXF1aXJlIHdvcmtpbmcgVENQIGlmIHdlIGFyZSBpbiBhIGNvbnRhaW5lciBlbnZpcm9ubWVudAorICB3aGVyZSAxMjcuMC4wLjEgY2Fubm90IGJlIHJlc29sdmVkIChmZC5vICMxMDY4MTIsIFNpbW9uIE1jVml0dGllKQorCitkYnVzIDEuMTIuOCAoMjAxOC0wNC0zMCkKKz09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGUg4oCcZ29sZGVuIHN1cGVyLXZlbG9jaXJhcHRvcuKAnSByZWxlYXNlLgorCitFbmhhbmNlbWVudHM6CisKK+KAoiBUaGUgRGV2aGVscCBkb2N1bWVudGF0aW9uIGluZGV4IGlzIG5vdyBpbiB2ZXJzaW9uIDIgZm9ybWF0CisgIChmZC5vICMxMDYxODYsIFNpbW9uIE1jVml0dGllKQorCivigKIgR2l2ZSB0aGUgZGJ1cy1kYWVtb24gbWFuIHBhZ2Ugc29tZSBzY2FyaWVyIHdhcm5pbmdzIGFib3V0CisgIDxhbGxvd19hbm9ueW1vdXMvPiBhbmQgbm9uLWxvY2FsIFRDUCwgd2hpY2ggYXJlIGluc2VjdXJlIGFuZCBzaG91bGQKKyAgbm90IGJlIHVzZWQsIHBhcnRpY3VsYXJseSBmb3IgdGhlIHN0YW5kYXJkIHN5c3RlbSBhbmQgc2Vzc2lvbiBidXNlcworICAoZmQubyAjMTA2MDA0LCBTaW1vbiBNY1ZpdHRpZSkKKworRml4ZXM6CisKK+KAoiBGaXggaW5zdGFsbGF0aW9uIG9mIER1Y2t0eXBlIGRvY3VtZW50YXRpb24gd2l0aCBuZXdlciB5ZWxwLWJ1aWxkCisgIHZlcnNpb25zIChmZC5vICMxMDYxNzEsIFNpbW9uIE1jVml0dGllKQorCitkYnVzIDEuMTIuNiAoMjAxOC0wMy0wMSkKKz09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGUg4oCcanVzdCB0aGUgb25lIHN3YW4sIGFjdHVhbGx54oCdIHJlbGVhc2UuCisKK0ZpeGVzOgorCivigKIgSW5jcmVhc2Ugc3lzdGVtIGRidXMtZGFlbW9uJ3MgUkxJTUlUX05PRklMRSBybGltaXQgYmVmb3JlIGl0IGRyb3BzCisgIHByaXZpbGVnZXMsIGJlY2F1c2UgaXQgd29uJ3QgaGF2ZSBwZXJtaXNzaW9uIGFmdGVyd2FyZHMuIFRoaXMgZml4ZXMgYQorICByZWdyZXNzaW9uIGluIGRidXMgMS4xMC4xOCBhbmQgMS4xMS4wIHdoaWNoIG1hZGUgdGhlIHN0YW5kYXJkIHN5c3RlbSBidXMKKyAgbW9yZSBzdXNjZXB0aWJsZSB0byBkZWxpYmVyYXRlIG9yIGFjY2lkZW50YWwgZGVuaWFsIG9mIHNlcnZpY2UuCisgIChmZC5vICMxMDUxNjUsIERhdmlkIEtpbmcpCisKK2RidXMgMS4xMi40ICgyMDE4LTAyLTA4KQorPT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoZSDigJxTdHJpYSBDYW1wYW5pYSAxMTXigJ0gcmVsZWFzZS4KKworRml4ZXM6CisKK+KAoiBXaGVuIGl0ZXJhdGluZyB0aGUgREJ1c0Nvbm5lY3Rpb24gd2hpbGUgYmxvY2tpbmcgb24gYSBwZW5kaW5nIGNhbGwsCisgIGRvbid0IHdhaXQgZm9yIEkvTyBpZiB0aGF0IHBlbmRpbmcgY2FsbCBhbHJlYWR5IGhhcyBhIHJlc3VsdDsgYW5kIG1ha2UKKyAgc3VyZSB0aGF0IHdoZXRoZXIgaXQgaGFzIGEgcmVzdWx0IGlzIHByb3BhZ2F0ZWQgaW4gYSB0aHJlYWQtc2FmZSB3YXkuCisgIFRoaXMgcHJldmVudHMgY2VydGFpbiBtdWx0aS10aHJlYWRlZCBjYWxsaW5nIHBhdHRlcm5zIGZyb20gYmxvY2tpbmcKKyAgdW50aWwgdGhlaXIgdGltZW91dCBldmVuIHdoZW4gdGhleSBzaG91bGQgaGF2ZSBzdWNjZWVkZWQgc29vbmVyLgorICAoZmQubyAjMTAyODM5OyBNYW5pc2ggTmFyYW5nLCBNaWNoYWVsIFNlYXJsZSkKKwor4oCiIFJlcG9ydCB0aGUgY29ycmVjdCBlcnJvciBpZiBPT00gaXMgcmVhY2hlZCB3aGlsZSB0cnlpbmcgdG8gbGlzdGVuCisgIG9uIGEgVENQIHNvY2tldCAoZmQubyAjODkxMDQsIFNpbW9uIE1jVml0dGllKQorCivigKIgRml4IGFzc2VydGlvbiBmYWlsdXJlcyBpbiByZWNvdmVyeSBmcm9tIE9PTSB3aGlsZSBzZXR0aW5nIHVwIGEKKyAgREJ1c1NlcnZlciAoZmQubyAjODkxMDQsIFNpbW9uIE1jVml0dGllKQorCivigKIgQWRkIGEgbWlzc2luZyBzcGFjZSB0byBhIHdhcm5pbmcgbWVzc2FnZSAoZmQubyAjMTAzNzI5LCBUaG9tYXMgWmFqaWMpCisKK+KAoiBFeHBhbmQgJHtiaW5kaXJ9IGNvcnJlY3RseSB3aGVuIHBrZy1jb25maWcgaXMgYXNrZWQgZm9yIGRidXNfZGFlbW9uZGlyCisgIChmZC5vICMxMDQyNjUsIEJlbmVkaWt0IEhlaW5lKQorCivigKIgT24gTGludXggc3lzdGVtcyB3aXRoIHN5c3RlbWQgPCAyMzcsIGlmICR7bG9jYWxzdGF0ZWRpcn0vZGJ1cyBkb2Vzbid0CisgIGV4aXN0LCBjcmVhdGUgaXQgYmVmb3JlIHRyeWluZyB0byBjcmVhdGUgJHtsb2NhbHN0YXRlZGlyfS9kYnVzL21hY2hpbmUtaWQKKyAgKGZkLm8gIzEwNDU3NywgQ2hyaXMgTGVzaWFrKQorCivigKIgRml4IGVzY2FwaW5nIGluIGRidXMtYXBpLWRlc2lnbiBkb2N1bWVudCAoZmQubyAjMTA0OTI1LCBQaGlsaXAgV2l0aG5hbGwpCisKK2RidXMgMS4xMi4yICgyMDE3LTExLTEzKQorPT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoZSDigJxzcGlkZXIgcHVtcGtpbuKAnSByZWxlYXNlLgorCitFbmhhbmNlbWVudHM6CisKK+KAoiBMb2cgYSB3YXJuaW5nIGlmIGEgbmV3IGNvbm5lY3Rpb24gY2Fubm90IGJlIGFjY2VwdGVkIGR1ZSB0byBhbgorICBvdXQtb2YtbWVtb3J5IGNvbmRpdGlvbiBvciBmYWlsdXJlIHRvIGlkZW50aWZ5IGl0cyBBcHBBcm1vciBvcgorICBTRUxpbnV4IGNvbnRleHQgKGZkLm8gIzEwMzU5MiwgU2ltb24gTWNWaXR0aWUpCisKK0ZpeGVzOgorCivigKIgTWFrZSB1c2Ugb2YgJChNS0RJUl9QKSBjb21wYXRpYmxlIHdpdGggaW5zdGFsbC1zaCwgZml4aW5nIGJ1aWxkIHdoZW4gYQorICBHTlUtY29tcGF0aWJsZSBgbWtkaXIgLXBgIGlzIG5vdCBhdmFpbGFibGUgKGZkLm8gIzEwMzUyMSwgaWxvdmV6ZnMpCisKK+KAoiBXaGVuIGJ1aWxkaW5nIGZvciBXaW5kb3dzIHdpdGggQXV0b3Rvb2xzLCBhdm9pZCBgZWNobyAtZWAsIGZpeGluZworICBjcm9zcy1jb21waWxhdGlvbiBvbiBub24tR05VIHBsYXRmb3JtcyBsaWtlIG1hY09TCisgIChmZC5vICMxMDM0OTMsIFRvbnkgVGhlb2RvcmUpCisKK+KAoiBGaXggY3Jhc2hlcyBpbiB0aGUgc2VydmVyIHNpZGUgb2YgdGhlIG5vbmNlLXRjcDogdHJhbnNwb3J0IHVuZGVyCisgIHZhcmlvdXMgZXJyb3IgY29uZGl0aW9ucy4gVGhpcyB0cmFuc3BvcnQgc2hvdWxkIG5vcm1hbGx5IG9ubHkgYmUgdXNlZAorICBvbiBXaW5kb3dzLCB3aGVyZSBBRl9VTklYIHNvY2tldHMgYXJlIHVuYXZhaWxhYmxlOyB0aGUgdW5peDogdHJhbnNwb3J0CisgIGlzIHRoZSBvbmx5IG9uZSByZWNvbW1lbmRlZCBmb3IgcHJvZHVjdGlvbiB1c2Ugb24gVW5peCBwbGF0Zm9ybXMuCisgIChmZC5vICMxMDM1OTcsIFNpbW9uIE1jVml0dGllKQorCitJbnRlcm5hbCBjaGFuZ2VzOgorCivigKIgSW1wcm92ZSB0ZXN0IGNvdmVyYWdlIG9uIFRyYXZpcy1DSSAoU2ltb24gTWNWaXR0aWUpCisKK2RidXMgMS4xMi4wICgyMDE3LTEwLTMwKQorPT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoZSDigJxnaW5nZXJicmVhZCBza3VsbOKAnSByZWxlYXNlLgorCisxLjEyLnggaXMgYSBuZXcgc3RhYmxlIGJyYW5jaCwgcmVjb21tZW5kZWQgZm9yIHVzZSBpbiBPUworZGlzdHJpYnV0aW9ucy4KKworU3VtbWFyeSBvZiBtYWpvciBjaGFuZ2VzIGJldHdlZW4gMS4xMC54IGFuZCAxLjEyLjAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0RlcGVuZGVuY2llczoKKwor4oCiIEV4cGF0ID49IDIuMS4wIGlzIHJlcXVpcmVkLgor4oCiIEdMaWIgPj0gMi40MCBpcyByZXF1aXJlZCBpZiBmdWxsIHRlc3QgY292ZXJhZ2UgaXMgZW5hYmxlZC4KK+KAoiBbTGludXhdIGxpYnNlbGludXggPj0gMi4wLjg2IGlzIHJlcXVpcmVkIGlmIFNFTGludXggc3VwcG9ydCBpcworICBlbmFibGVkLgor4oCiIFtVbml4XSBkYnVzIG5vdyByZXF1aXJlcyBhbiA8aW50dHlwZXMuaD4gdGhhdCBkZWZpbmVzIEM5OSBjb25zdGFudHMKKyAgc3VjaCBhcyBQUklkNjQgYW5kIFBSSXU2NCwgZXhjZXB0IHdoZW4gYnVpbGRpbmcgZm9yIFdpbmRvd3MuCivigKIgW0F1dG90b29sc10gQnVpbGRpbmcgZnJvbSBnaXQgKGJ1dCBub3QgZnJvbSB0YXJiYWxscykgd2l0aCBBdXRvdG9vbHMKKyAgbm93IHJlcXVpcmVzIG1hY3JvcyBmcm9tIHRoZSBHTlUgQXV0b2NvbmYgQXJjaGl2ZS4KK+KAoiBbQ01ha2VdIEJ1aWxkcyBkb25lIHVzaW5nIENNYWtlIG5vdyByZXF1aXJlIENNYWtlIDMuMC4yLgorCitCdWlsZC10aW1lIGNvbmZpZ3VyYXRpb24gY2hhbmdlczoKKwor4oCiIEV4cGF0IGlzIG5vdyBmb3VuZCB1c2luZyBwa2ctY29uZmlnLiBTZWUgdGhlIHJlbGVhc2Ugbm90ZXMgZm9yCisgIDEuMTEuMTQuCivigKIgVGhlIC0tZGlzYWJsZS1jb21waWxlci1vcHRpbWlzYXRpb25zIGFuZCAtLWVuYWJsZS1jb21waWxlci1jb3ZlcmFnZQorICBvcHRpb25zIG5vIGxvbmdlciBleGlzdC4gIFNlZSB0aGUgcmVsZWFzZSBub3RlcyBmb3IgMS4xMS40IGFuZCAxLjExLjguCivigKIgW1VuaXhdIFRoZSAtLWVuYWJsZS1hYnN0cmFjdC1zb2NrZXRzIGFuZCAtLWRpc2FibGUtYWJzdHJhY3Qtc29ja2V0cworICBvcHRpb25zIG5vIGxvbmdlciBleGlzdC4gU2VlIHRoZSByZWxlYXNlIG5vdGVzIGZvciAxLjExLjIwLgor4oCiIFtVbml4XSBGbGFnIGZpbGVzIGluIC92YXIvcnVuL2NvbnNvbGUvJHt1c2VybmFtZX0gYXJlIG5vIGxvbmdlcgorICBjaGVja2VkIGZvciBhdF9jb25zb2xlIGJ5IGRlZmF1bHQuIFNlZSB0aGUgcmVsZWFzZSBub3RlcyBmb3IgMS4xMS4xOC4KK+KAoiBbVW5peCwgQ3lnd2luXSBJbml0IHNjcmlwdHMgYXJlIG5vIGxvbmdlciBwcm92aWRlZCBieSB1cHN0cmVhbSBkYnVzLAorICBhbmQgcGFja2FnZXJzIHdpbGwgbm93IG5lZWQgdG8gYWRkIHRoZXNlIGRvd25zdHJlYW0gKG1vc3QgYWxyZWFkeSBkbykuCisgIFNlZSB0aGUgcmVsZWFzZSBub3RlcyBmb3IgMS4xMS4xOC4KK+KAoiBbVW5peF0gVGhlIHByb2Nlc3MgSUQgZmlsZSBubyBsb25nZXIgaGFzIGEgZGlmZmVyZW50IGRlZmF1bHQgbG9jYXRpb24KKyAgb24gUmVkIEhhdCBkZXJpdmF0aXZlcy4gU2VlIHRoZSByZWxlYXNlIG5vdGVzIGZvciAxLjExLjE4Lgor4oCiIFtVbml4XSAke3J1bnN0YXRlZGlyfSBpcyBub3cgaW5kZXBlbmRlbnQgb2YgJHtsb2NhbHN0YXRlZGlyfSB3aXRoCisgIHJlY2VudCBBdXRvdG9vbHMgdmVyc2lvbnMuIFNlZSB0aGUgcmVsZWFzZSBub3RlcyBmb3IgMS4xMS4xNi4KK+KAoiBbV2luZG93c10gVGhlIFdJTkRSRVMgdmFyaWFibGUgaXMgbm8gbG9uZ2VyIHVzZWQuIFNlZSB0aGUgcmVsZWFzZQorICBub3RlcyBmb3IgMS4xMS4yMi4KKworRGVwcmVjYXRpb25zOgorCivigKIgRWF2ZXNkcm9wcGluZyBpcyBvZmZpY2lhbGx5IGRlcHJlY2F0ZWQgaW4gZmF2b3VyIG9mIEJlY29tZU1vbml0b3IuCisgIFNlZSB0aGUgcmVsZWFzZSBub3RlcyBmb3Igc3BlYyB2ZXJzaW9uIDAuMzEgKGluIGRidXMgMS4xMS4xNCkuCivigKIgW1VuaXhdIEZsYWcgZmlsZXMgaW4gL3Zhci9ydW4vY29uc29sZS8ke3VzZXJuYW1lfSBhcmUgZGVwcmVjYXRlZC4KKyAgU2VlIHRoZSByZWxlYXNlIG5vdGVzIGZvciAxLjExLjE4LgorCitOZXcgQVBJczoKKwor4oCiIDxhbGxvdz4gYW5kIDxkZW55PiBydWxlcyBpbiBkYnVzLWRhZW1vbiBjb25maWd1cmF0aW9uIGNhbiBub3cKKyAgaW5jbHVkZSBzZW5kX2Jyb2FkY2FzdD0idHJ1ZSIsIHNlbmRfYnJvYWRjYXN0PSJmYWxzZSIsCisgIG1heF91bml4X2Zkcz0iTiIsIG1pbl91bml4X2Zkcz0iTiIgKGZvciBzb21lIGludGVnZXIgTikuCisgIFNlZSB0aGUgcmVsZWFzZSBub3RlcyBmb3IgMS4xMS4xOC4KK+KAoiBkYnVzX3RyeV9nZXRfbG9jYWxfbWFjaGluZV9pZCgpIGlzIGxpa2UKKyAgZGJ1c19nZXRfbG9jYWxfbWFjaGluZV9pZCgpLCBidXQgcmV0dXJucyBhIERCdXNFcnJvci4KK+KAoiBOZXcgQVBJcyBhcm91bmQgREJ1c01lc3NhZ2VJdGVyIHRvIHNpbXBsaWZ5IGNsZWFudXAuCisgIFNlZSB0aGUgcmVsZWFzZSBub3RlcyBmb3IgMS4xMS4xNi4KK+KAoiBUaGUgbWVzc2FnZSBidXMgZGFlbW9uIG5vdyBpbXBsZW1lbnRzIHRoZSBzdGFuZGFyZCBJbnRyb3NwZWN0YWJsZSwKKyAgUGVlciBhbmQgUHJvcGVydGllcyBpbnRlcmZhY2VzLiBTZWUgdGhlIHJlbGVhc2Ugbm90ZXMgZm9yCisgIGRidXMgMS4xMS4xNCBhbmQgc3BlYyB2ZXJzaW9uIDAuMzEuCivigKIgRFREcyBmb3IgaW50cm9zcGVjdGlvbiBYTUwgYW5kIGJ1cyBjb25maWd1cmF0aW9uIGFyZSBpbnN0YWxsZWQuCivigKIgZGJ1cyBjYW4gYmUgY29tcGlsZWQgdG8gYmUgcmVsb2NhdGFibGUsIG1ha2luZyBpdCBtb3JlIHN1aXRhYmxlIGZvcgorICBiaW5hcnkgYnVuZGxpbmcgd2l0aCBvdGhlciBzb2Z0d2FyZS4gT24gV2luZG93cywgdGhpcyBpcyBvbiBieQorICBkZWZhdWx0Lgor4oCiIFtVbml4XSBBIG5ldyB1bml4OmRpcj3igKYgYWRkcmVzcyBmYW1pbHkgcmVzZW1ibGVzIHVuaXg6dG1wZGlyPeKApiBidXQKKyAgbmV2ZXIgdXNlcyBMaW51eCBhYnN0cmFjdCBzb2NrZXRzLCB3aGljaCBpcyBhZHZhbnRhZ2VvdXMgZm9yCisgIGNvbnRhaW5lcnMuIE9uIG5vbi1MaW51eCBpdCBpcyBlcXVpdmFsZW50IHRvIHVuaXg6dG1wZGlyPeKApi4KKyAgU2VlIHRoZSByZWxlYXNlIG5vdGVzIGZvciBkYnVzIDEuMTEuMTQgYW5kIHNwZWMgdmVyc2lvbiAwLjMxLgor4oCiIFtVbml4XSBOZXcgb3B0aW9uICJkYnVzLWxhdW5jaCAtLWV4aXQtd2l0aC14MTEiLgor4oCiIFtVbml4XSBTZXNzaW9uIG1hbmFnZXJzIGNhbiBjcmVhdGUgdHJhbnNpZW50IC5zZXJ2aWNlIGZpbGVzIGluCisgICRYREdfUlVOVElNRV9ESVIvZGJ1cy0xL3NlcnZpY2VzLiBTZWUgdGhlIHJlbGVhc2Ugbm90ZXMgZm9yIDEuMTEuMTIuCivigKIgW1VuaXhdIEEgc3lzdXNlcnMuZCBzbmlwcGV0IGNhbiBjcmVhdGUgdGhlIG1lc3NhZ2VidXMgdXNlciBvbi1kZW1hbmQuCisKK01pc2NlbGxhbmVvdXMgYmVoYXZpb3VyIGNoYW5nZXM6CisKK+KAoiBbVW5peF0gVGhlIHNlc3Npb24gYnVzIG5vdyBsb2dzIHRvIHN5c2xvZyBpZiBpdCB3YXMgc3RhcnRlZCBieQorICBkYnVzLWxhdW5jaC4KK+KAoiBbVW5peF0gSW50ZXJuYWwgd2FybmluZ3MgYXJlIGxvZ2dlZCB0byBzeXNsb2cgaWYgY29uZmlndXJlZC4KK+KAoiBbVW5peF0gRXhjZWVkaW5nIGFuIGFudGktRG9TIGxpbWl0IGlzIGxvZ2dlZCB0byBzeXNsb2cgaWYgY29uZmlndXJlZCwKKyAgb3IgdG8gc3RkZXJyLgorCitDaGFuZ2VzIHNpbmNlIDEuMTEuMjIgcmVsZWFzZSBjYW5kaWRhdGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitTdGFuZGFyZCBzdGFibGUtYnJhbmNoIGNoYW5nZXM6CisKK+KAoiBEaXNhYmxlIHdhcm5pbmdzIGFib3V0IHVzZSBvZiBkZXByZWNhdGVkIGZ1bmN0aW9ucyAoU2ltb24gTWNWaXR0aWUpCisKK0ZpeGVzOgorCivigKIgRG9uJ3QgZGlzdHJpYnV0ZSBmaWxlcyBnZW5lcmF0ZWQgYnkgLi9jb25maWd1cmUgaW4gdGhlIHNvdXJjZSB0YXJiYWxsCisgIChmZC5vICMxMDM0MjAsIFNpbW9uIE1jVml0dGllKQorCitJbnRlcm5hbCBjaGFuZ2VzOgorCivigKIgUmVtb3ZlIHNvbWUgdW51c2VkIGZpbGVzIGZyb20gdGhlIGdpdCByZXBvc2l0b3J5CisgIChmZC5vICMxMDM0MjAsIFNpbW9uIE1jVml0dGllKQorCitELUJ1cyAxLjExLjIyICgyMDE3LTEwLTIzKQorPT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhlIOKAnGZpcmUgc3VyZmFjZeKAnSByZWxlYXNlLgorCitUaGlzIGlzIHRoZSBmaXJzdCByZWxlYXNlLWNhbmRpZGF0ZSBmb3IgdGhlIDEuMTIuMCBzdGFibGUgcmVsZWFzZS4KKworQnVpbGQtdGltZSBjb25maWd1cmF0aW9uIGNoYW5nZXM6CisKK+KAoiBXaGVuIGJ1aWxkaW5nIGZvciBXaW5kb3dzIHdpdGggQXV0b3Rvb2xzLCBzZXR0aW5nIHRoZSBXSU5EUkVTIHZhcmlhYmxlCisgIG5vIGxvbmdlciB3b3JrcyB0byBzZWxlY3QgYSBub24tc3RhbmRhcmQgcmVzb3VyY2UgY29tcGlsZXIuIFVzZQorICBsaWJ0b29sJ3Mgc3RhbmRhcmQgUkMgdmFyaWFibGUgaW5zdGVhZCwgZm9yIGV4YW1wbGUKKyAgIi4vY29uZmlndXJlIFJDPWk2ODYtdzY0LW1pbmd3MzItd2luZHJlcyIKKworRGVwZW5kZW5jaWVzOgorCivigKIgQnVpbGRzIGRvbmUgdXNpbmcgQ01ha2Ugbm93IHJlcXVpcmUgQ01ha2UgMy4wLjIuCisKK0VuaGFuY2VtZW50czoKKwor4oCiIFdoZW4gYnVpbGRpbmcgZm9yIFdpbmRvd3MsIGltcHJvdmUgcXVhbGl0eSBvZiBtZXRhZGF0YSBpbgorICBsaWJkYnVzLTEtMy5kbGwgKGZkLm8gIzEwMzAxNSwgUmFsZiBIYWJhY2tlcikKKworRml4ZXM6CisKK+KAoiBGaXggYSB0eXBvICJ1aW50IDE2IiBpbiBkYnVzLXNlbmQoMSkgbWFuIHBhZ2UKKyAgKGZkLm8gIzEwMzA3NSwgRGF2aWQgS2luZykKKwor4oCiIFdoZW4gYnVpbGRpbmcgZm9yIFdpbmRvd3MsIGxpYmRidXMtMS0zLmRsbCBhbHdheXMgaW5jbHVkZXMgdmVyc2lvbgorICBpbmZvcm1hdGlvbi4gUHJldmlvdXNseSwgdGhpcyB3YXMgbWlzc2luZyBpZiB1c2luZyBDTWFrZSBhbmQgYW55CisgIG5vbi1NU1ZDIGNvbXBpbGVyLiAoZmQubyAjMTAzMDE1LCBSYWxmIEhhYmFja2VyKQorCivigKIgRml4IHRoZSBidWlsZCB3aXRoIE1TVkMsIHdoaWNoIHJlZ3Jlc3NlZCB3aXRoIHRoZSAjMTAyNTU4IGZpeCBpbgorICAxLjExLjIwLiAoZmQubyAjMTAyNTU4LCBSYWxmIEhhYmFja2VyKQorCitJbnRlcm5hbCBjaGFuZ2VzOgorCivigKIgU2ltcGxpZnkgV2luZG93cyByZXNvdXJjZSBlbWJlZGRpbmcKKyAgKGZkLm8gIzEwMzAxNSwgU2ltb24gTWNWaXR0aWUpCisKK0QtQnVzIDEuMTEuMjAgKDIwMTctMTAtMDMpCis9PQorCitUaGUg4oCcd3JhaXRoIHN0dW7igJ0gcmVsZWFzZS4KKworQnVpbGQtdGltZSBjb25maWd1cmF0aW9uIGNoYW5nZXM6CisKK+KAoiBUaGUgLS1lbmFibGUtYWJzdHJhY3Qtc29ja2V0cyBhbmQgLS1kaXNhYmxlLWFic3RyYWN0LXNvY2tldHMgb3B0aW9ucworICBubyBsb25nZXIgZXhpc3QuIFN1cHBvcnQgZm9yIExpbnV4J3MgYWJzdHJhY3QgQUZfVU5JWCBzb2NrZXRzIGlzIG5vdworICB1bmNvbmRpdGlvbmFsbHkgZW5hYmxlZCBvbiBMaW51eCBhbmQgZGlzYWJsZWQgZXZlcnl3aGVyZSBlbHNlLgorICAoZmQubyAjMzQ5MDUsIFNpbW9uIE1jVml0dGllKQorCitFbmhhbmNlbWVudHM6CisKK+KAoiBNYWtlIHNsb3dlciB0ZXN0cyBsZXNzIGxpa2VseSB0byB0aW1lIG91dCwgYW5kIGltcHJvdmUgZGlhZ25vc3RpY3MgaWYKKyAgdGVzdHMgZG8gdGltZSBvdXQgKGZkLm8gIzEwMzAwOSwgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBPbiBXaW5kb3dzLCBkb24ndCBjb21waWxlIGFuIHVudXNlZCBzdHViIGltcGxlbWVudGF0aW9uIG9mCisgIF9kYnVzX3NldF9zaWduYWxfaGFuZGxlcigpIChmZC5vICMxMDMwMTAsIFNpbW9uIE1jVml0dGllKQorCitGaXhlczoKKwor4oCiIEJlIG1vcmUgY2FyZWZ1bCB0byBzYXZlIGFuZCByZXN0b3JlIGVycm5vIGluIFBPU0lYIGFzeW5jIHNpZ25hbAorICBoYW5kbGVycyAoZmQubyAjMTAzMDEwLCBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIE9uIFdpbmRvd3MsIGVtYmVkIGEgbWFuaWZlc3QgaW4gZGJ1cy11cGRhdGUtYWN0aXZhdGlvbi1lbnZpcm9ubWVudC5leGUKKyAgc28gdGhhdCB0aGUgaGV1cmlzdGljcyB1c2VkIGZvciBVQUMgZG8gbm90IGFzc3VtZSBpdCBuZWVkcyBlbGV2YXRlZAorICBwcml2aWxlZ2VzIGR1ZSB0byBpdHMgbmFtZSBjb250YWluaW5nICJ1cGRhdGUiCisgIChmZC5vICMxMDI1NTgsIFJhbGYgSGFiYWNrZXIpCisKK+KAoiBPbiBXaW5kb3dzIHdpdGggQXV0b21ha2UsIGVtYmVkIHZlcnNpb24gaW5mb3JtYXRpb24gaW4gbGliZGJ1cy0xLAorICBhcyB3YXMgbWVhbnQgdG8gaGFwcGVuIGluIGFsbCB2ZXJzaW9ucyBzaW5jZSAyMDA5CisgIChmZC5vICMxMDMwMTUsIFNpbW9uIE1jVml0dGllKQorCitELUJ1cyAxLjExLjE4ICgyMDE3LTA5LTI1KQorPT0KKworVGhlIOKAnHZhbXBpcmUgY29ucXVpc3RhZG9y4oCdIHJlbGVhc2UuCisKK0J1aWxkLXRpbWUgY29uZmlndXJhdGlvbiBjaGFuZ2VzOgorCivigKIgQnkgZGVmYXVsdCwgZGJ1cy1kYWVtb24gb24gVW5peCBubyBsb25nZXIgY2hlY2tzIGZvciBmbGFnIGZpbGVzCisgIC92YXIvcnVuL2NvbnNvbGUvJHt1c2VybmFtZX0gY3JlYXRlZCBieSB0aGUgb2Jzb2xldGUgcGFtX2NvbnNvbGUgYW5kCisgIHBhbV9mb3JlZ3JvdW5kIFBBTSBtb2R1bGVzIHdoZW4gZGVjaWRpbmcgd2hldGhlciAke3VzZXJuYW1lfSBpcworICBjdXJyZW50bHkgYXQgdGhlIGNvbnNvbGUuIFRoZSBvbGQgZGVmYXVsdCBiZWhhdmlvdXIgY2FuIGJlIHJlc3RvcmVkCisgIGJ5IHNwZWNpZnlpbmcgLS13aXRoLWNvbnNvbGUtYXV0aC1kaXI9L3Zhci9ydW4vY29uc29sZSBpbiB0aGUKKyAgcmVjb21tZW5kZWQgQXV0b3Rvb2xzIGJ1aWxkIHN5c3RlbSwgb3IKKyAgLUREQlVTX0NPTlNPTEVfQVVUSF9ESVI9L3Zhci9ydW4vY29uc29sZSBpbiBDTWFrZS4gVGhpcyBmZWF0dXJlIGlzCisgIG5vdyBkZXByZWNhdGVkLCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGRidXMgMS4xMyB1bmxlc3MgZmVlZGJhY2sgdmlhCisgIGZkLm8gIzEwMTYyOSBpbmRpY2F0ZXMgdGhhdCB0aGlzIHdvdWxkIGJlIHByb2JsZW1hdGljLgorICAoZmQubyAjMTAxNjI5LCBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIExTQi1zdHlsZSBpbml0IHNjcmlwdHMgZm9yIFJlZCBIYXQgYW5kIFNsYWNrd2FyZSwgYW5kIGEgbm9uLUxTQiBpbml0CisgIHNjcmlwdCBmb3IgQ3lnd2luLCBhcmUgbm8gbG9uZ2VyIHByb3ZpZGVkIGluIHRoZSB1cHN0cmVhbSBkYnVzCisgIHNvdXJjZS4gV2UgcmVjb21tZW5kIHRoYXQgZGlzdHJpYnV0b3JzIHdobyBzdXBwb3J0IG5vbi1zeXN0ZW1kIHNlcnZpY2UKKyAgbWFuYWdlbWVudCBzaG91bGQgbWFpbnRhaW4gdGhlaXIgb3duIGluaXQgc2NyaXB0cyBvciBvdGhlciBzZXJ2aWNlCisgIG1hbmFnZXIgaW50ZWdyYXRpb24gYXMgcGFydCBvZiB0aGVpciBkb3duc3RyZWFtIHBhY2thZ2luZywgc2ltaWxhciB0bworICB0aGUgd2F5IERlYmlhbiBkaXN0cmlidXRlcyBhIERlYmlhbi1zcGVjaWZpYyBMU0IgaW5pdCBzY3JpcHQgZm9yIGRidXMuCisKKyAgVGhlIHN5c3RlbWQgdW5pdCBjb250aW51ZXMgdG8gYmUgbWFpbnRhaW5lZCBhcyBwYXJ0IG9mIHRoZSB1cHN0cmVhbQorICBkYnVzIHNvdXJjZSwgYmVjYXVzZSBpdCByZWNlaXZlcyByZWd1bGFyIHRlc3RpbmcgYW5kIG1haW50ZW5hbmNlLgorCisgIChmZC5vICMxMDE3MDYsIFNpbW9uIE1jVml0dGllKQorCivigKIgVGhlIHByb2Nlc3MgSUQgZmlsZSBjcmVhdGVkIGJ5IHRoZSBzeXN0ZW0gYnVzIGlzIG5vIGxvbmdlciBpbmZsdWVuY2VkCisgIGJ5IHRoZSAtLXdpdGgtaW5pdC1zY3JpcHRzPXJlZGhhdCBjb25maWd1cmUgb3B0aW9uIG9yIHRoZSBwcmVzZW5jZSBvZgorICAvZXRjL3JlZGhhdC1yZWxlYXNlIGF0IGJ1aWxkIHRpbWUuIElmIHlvdXIgT1MncyBpbml0IHNjcmlwdCBvciBvdGhlcgorICBzZXJ2aWNlIG1hbmFnZW1lbnQgcmVsaWVzIG9uIHRoZSBSZWQgSGF0LXN0eWxlIHBpZCBmaWxlLCBpdCBjYW4gYmUKKyAgcmVzdG9yZWQgYnkgc3BlY2lmeWluZyAtLXdpdGgtc3lzdGVtLXBpZC1maWxlPS9ydW4vbWVzc2FnZWJ1cy5waWQgYXQKKyAgY29uZmlndXJlIHRpbWUgb3IgdXNpbmcgdGhlIDxwaWRmaWxlPiBkaXJlY3RpdmUgaW4gYnVzIGNvbmZpZ3VyYXRpb24uCisKKyAgTm90ZSB0aGF0IHRoZSB1cHN0cmVhbS1zdXBwbGllZCBzeXN0ZW1kIHVuaXQgcnVucyBkYnVzLWRhZW1vbiB3aXRoCisgIHRoZSAtLW5vcGlkZmlsZSBvcHRpb24sIHNvIGl0IGRvZXMgbm90IG5vcm1hbGx5IHdyaXRlIGEgcGlkIGZpbGUsCisgIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgT1MgaXMgUmVkLUhhdC1kZXJpdmVkIG9yIG5vdC4KKworICAoZmQubyAjMTAxNzA2LCBTaW1vbiBNY1ZpdHRpZSkKKworRW5oYW5jZW1lbnRzOgorCivigKIgPGFsbG93PiBhbmQgPGRlbnk+IHJ1bGVzIGluIGRidXMtZGFlbW9uIGNvbmZpZ3VyYXRpb24gY2FuIG5vdworICBpbmNsdWRlIHNlbmRfYnJvYWRjYXN0PSJ0cnVlIiBvciBzZW5kX2Jyb2FkY2FzdD0iZmFsc2UiLCB3aGljaCBtYWtlCisgIHRoZSBydWxlIG9ubHkgbWF0Y2ggYnJvYWRjYXN0IHNpZ25hbHMsIG9yIG9ubHkgbWF0Y2ggbWVzc2FnZXMgdGhhdAorICBhcmUgbm90IGJyb2FkY2FzdCBzaWduYWxzLCByZXNwZWN0aXZlbHkuCisgIChmZC5vICMyOTg1MywgU2ltb24gTWNWaXR0aWUpCisKK+KAoiA8YWxsb3c+IGFuZCA8ZGVueT4gcnVsZXMgY2FuIG5vdyBiZSBjb25maWd1cmVkIHRvIGFwcGx5IG9ubHkgdG8KKyAgbWVzc2FnZXMgd2l0aCBvciB3aXRob3V0IFVuaXggZmlsZSBkZXNjcmlwdG9ycyBhdHRhY2hlZC4gVGhpcyB3b3VsZAorICB0eXBpY2FsbHkgYmUgdXNlZCBpbiBydWxlcyBsaWtlIHRoZXNlOgorICA8YWxsb3cgc2VuZF9kZXN0aW5hdGlvbj0iLi4uIiBtYXhfdW5peF9mZHM9IjAiLz4KKyAgPGRlbnkgc2VuZF9kZXN0aW5hdGlvbj0iLi4uIiBtaW5fdW5peF9mZHM9IjEiLz4KKyAgPGRlbnkgcmVjZWl2ZV9zZW5kZXI9Ii4uLiIgbWluX3VuaXhfZmRzPSIxIi8+CisgIGJ1dCBjYW4gYWxzbyBiZSB1c2VkIHRvIHNldCBhIG5vbnplcm8gdXBwZXIgbGltaXQgb24gdGhlIG51bWJlciBvZgorICBmaWxlIGRlc2NyaXB0b3JzOgorICA8YWxsb3cgc2VuZF9kZXN0aW5hdGlvbj0iLi4uIiBtYXhfdW5peF9mZHM9IjQiLz4KKyAgKGZkLm8gIzEwMTg0OCwgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBPbiBVbml4IHBsYXRmb3JtcywgdGhlIERCVVNfQ09PS0lFX1NIQTEgYXV0aGVudGljYXRpb24gbWVjaGFuaXNtCisgIG5vdyByZXNwZWN0cyB0aGUgSE9NRSBlbnZpcm9ubWVudCB2YXJpYWJsZSBvbiB0aGUgY2xpZW50IHNpZGUsIGFuZAorICBvbiB0aGUgc2VydmVyIHNpZGUgd2hlbiB0aGUgdWlkIGF0dGVtcHRpbmcgdG8gY29ubmVjdCBpcyB0aGUgc2FtZQorICBhcyB0aGUgdWlkIG9mIHRoZSBzZXJ2ZXIuIFRoaXMgYWxsb3dzIHRoZSBhdXRvbWF0ZWQgdGVzdHMgdG8gcGFzcyBpbgorICBlbnZpcm9ubWVudHMgd2hlcmUgdGhlIHVzZXIncyAib2ZmaWNpYWwiIGhvbWUgZGlyZWN0b3J5IGluIC9ldGMvcGFzc3dkCisgIGlzIG5vbmV4aXN0ZW50LCBzdWNoIGFzIERlYmlhbiBhdXRvYnVpbGRlcnMuCisgIChmZC5vICMxMDE5NjAsIFNpbW9uIE1jVml0dGllKQorCitGaXhlczoKKwor4oCiIFdoZW4gcGFyc2luZyBkYnVzLWRhZW1vbiBjb25maWd1cmF0aW9uLCB0ZWxsIEV4cGF0IG5vdCB0byB1c2UKKyAgY3J5cHRvZ3JhcGhpYy1xdWFsaXR5IGVudHJvcHkgYXMgYSBzYWx0IGZvciBpdHMgaGFzaCB0YWJsZXM6IHdlIHRydXN0CisgIHRoZSBjb25maWd1cmF0aW9uIGZpbGVzLCBzbyB3ZSBhcmUgbm90IGNvbmNlcm5lZCBhYm91dCBhbGdvcml0aG1pYworICBjb21wbGV4aXR5IGF0dGFja3MgdmlhIGhhc2ggdGFibGUgY29sbGlzaW9ucy4gVGhpcyBwcmV2ZW50cworICBkYnVzLWRhZW1vbiAtLXN5c3RlbSBmcm9tIGhvbGRpbmcgdXAgdGhlIGJvb3QgcHJvY2VzcyAoYW5kIGNhdXNpbmcKKyAgZWFybHktYm9vdCBzeXN0ZW0gc2VydmljZXMgbGlrZSBzeXN0ZW1kLCBsb2dpbmQsIG5ldHdvcmtkIHRvIHRpbWUKKyAgb3V0KSBvbiBlbnRyb3B5LXN0YXJ2ZWQgZW1iZWRkZWQgc3lzdGVtcy4KKyAgKGZkLm8gIzEwMTg1OCwgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBBdm9pZCBhIC1XZXJyb3I9ZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50IGJ1aWxkIGZhaWx1cmUgb24gU29sYXJpcworICAoZmQubyAjMTAyMTQ1LCBBbGFuIENvb3BlcnNtaXRoKQorCivigKIgT24gVW5peCBwbGF0Zm9ybSwgZHJvcCBEQlVTX1NZU1RFTV9MT0dfSU5GTyBtZXNzYWdlcyBmcm9tIExPR19OT1RJQ0UKKyAgdG8gTE9HX0lORk8sIG1hdGNoaW5nIGhvdyB3ZSB1c2UgdGhpcyBsb2cgbGV2ZWwgaW4gcHJhY3RpY2UKKyAgKGZkLm8gIzEwMjY4NiwgU2ltb24gTWNWaXR0aWUpCisKK0QtQnVzIDEuMTEuMTYgKDIwMTctMDctMjcpCis9PQorCitUaGUg4oCcc291dGggZmFjaW5nIGdhcmRlbuKAnSByZWxlYXNlLgorCitCdWlsZC10aW1lIGNvbmZpZ3VyYXRpb24gY2hhbmdlczoKKwor4oCiIFRoZSBBdXRvdG9vbHMgYnVpbGQgc3lzdGVtIG5vdyBzdXBwb3J0cyB2YXJ5aW5nICR7cnVuc3RhdGVkaXJ9CisgIGluZGVwZW5kZW50bHkgb2YgJHtsb2NhbHN0YXRlZGlyfSwgaWYgdXNpbmcgYW4gQXV0b2NvbmYgdmVyc2lvbgorICB0aGF0IGhhcyB0aGF0IGZlYXR1cmU7IHZlcnNpb24gMi43MCB3aWxsIGV2ZW50dWFsbHkgaGF2ZSB0aGlzLCBidXQKKyAgbWFueSBMaW51eCBkaXN0cmlidXRpb25zIGFkZCBpdCB0byB2ZXJzaW9uIDIuNjkgYXMgYSBwYXRjaC4KKyAgQSB0eXBpY2FsIHVzZSBpcyB0byBzZXQgcHJlZml4PS91c3IsIHN5c2NvbmZkaXI9L2V0YywgbG9jYWxzdGF0ZWRpcj0vdmFyCisgIGFuZCBydW5zdGF0ZWRpcj0vcnVuLiAoZmQubyAjMTAxNTY5LCBTaW1vbiBNY1ZpdHRpZSkKKworRW5oYW5jZW1lbnRzOgorCivigKIgTmV3IEFQSXMgREJVU19NRVNTQUdFX0lURVJfSU5JVF9DTE9TRUQsIGRidXNfbWVzc2FnZV9pdGVyX2luaXRfY2xvc2VkKCkKKyAgYW5kIGRidXNfbWVzc2FnZV9pdGVyX2FiYW5kb25fY29udGFpbmVyX2lmX29wZW4oKSBzaW1wbGlmeSB0aGUKKyAgc2luZ2xlLWV4aXQtcG9pbnQgKCJnb3RvIG91dCIpIHN0eWxlIG9mIHJlc291cmNlIGNsZWFudXAuIFRoZSBBUEkKKyAgZG9jdW1lbnRhdGlvbiBhcm91bmQgREJ1c01lc3NhZ2VJdGVyIGFuZCBjb250YWluZXJzIGhhcyBhbHNvIGJlZW4KKyAgY2xhcmlmaWVkLiAoZmQubyAjMTAxNTY4LCBTaW1vbiBNY1ZpdHRpZSkKKworRml4ZXM6CisKK+KAoiBGaXggdGhlIGltcGxlbWVudGF0aW9uIG9mIHJlLWVuYWJsaW5nIGEgdGltZW91dCAoYWdhaW4pIHNvIHRoYXQgaXRzCisgIGNvdW50ZG93biBpcyBhbHdheXMgcmVzdGFydGVkIGFzIGludGVuZGVkLiAoZmQubyAjOTU2MTksCisgIE1pY2hhbCBLb3V0bsO9KQorCivigKIgTWFrZSB0aGUgZGJ1cy1kYWVtb24ncyBQcm9wZXJ0aWVzIGludGVyZmFjZSwgYXMgaW50cm9kdWNlZCBpbiAxLjExLjE0LAorICBhdmFpbGFibGUgdG8gYWxsIHVzZXJzIG9uIHRoZSBzeXN0ZW0gYnVzIChmZC5vICMxMDE3MDAsIFNpbW9uIE1jVml0dGllKQorCivigKIgZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljKCkgbm8gbG9uZ2VyIGxlYWtzIG1lbW9yeSBpZiBpdCBmYWlscyB0bworICBhcHBlbmQgYSBmaWxlIGRlc2NyaXB0b3IgdG8gYSBtZXNzYWdlLiAoZmQubyAjMTAxNTY4LCBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIGRidXNfbWVzc2FnZV9pdGVyX29wZW5fY29udGFpbmVyKCkgbm8gbG9uZ2VyIGxlYWtzIG1lbW9yeSBpZiBpdCBydW5zIG91dAorICBvZiBtZW1vcnkuIChmZC5vICMxMDE1NjgsIFNpbW9uIE1jVml0dGllKQorCivigKIgZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzX3ZhbGlzdCgpIG5vIGxvbmdlciBsZWFrcyBtZW1vcnkgaWYgZ2l2ZW4gYW4KKyAgdW5zdXBwb3J0ZWQgdHlwZS4gVGhpcyBzaXR1YXRpb24gaXMgc3RpbGwgY29uc2lkZXJlZCB0byBiZSBhIHByb2dyYW1taW5nCisgIGVycm9yIHdoaWNoIG5lZWRzIHRvIGJlIGNvcnJlY3RlZCBieSB0aGUgdXNlciBvZiBsaWJkYnVzLgorICAoZmQubyAjMTAxNTY4LCBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIGRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYygpIGFuZCBkYnVzX21lc3NhZ2VfaXRlcl9vcGVuX2NvbnRhaW5lcigpCisgIHdpbGwgbm8gbG9uZ2VyIHJlcG9ydCB0aGF0IHRoZWlyIGFyZ3VtZW50cyB3ZXJlIGludmFsaWQgaWYgdGhleSBydW4gb3V0CisgIG9mIG1lbW9yeSBhdCBleGFjdGx5IHRoZSB3cm9uZyB0aW1lLiAoZmQubyAjMTAxNTY4LCBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIEVuc3VyZSB0aGF0IHRlc3RzIGZhaWwgaWYgdGhleSB3b3VsZCBvdGhlcndpc2UgaGF2ZSB0cmllZCB0byBjb25uZWN0IHRvCisgIHRoZSByZWFsIHNlc3Npb24gYnVzIChmZC5vICMxMDE2OTgsIFNpbW9uIE1jVml0dGllKQorCivigKIgTWFrZSBidWlsZC10aW1lIHRlc3RzIGNvcGUgd2l0aCBmaW5kaW5nIFB5dGhvbiAzLCBidXQgbm90IFB5dGhvbiAyCisgIChmZC5vICMxMDE3MTYsIFNpbW9uIE1jVml0dGllKQorCitJbnRlcm5hbCBjaGFuZ2VzIHJlbGV2YW50IHRvIGRidXMgZGV2ZWxvcGVyczoKKwor4oCiIERCdXNWYXJpYW50IGlzIGEgbmV3IG1lY2hhbmlzbSB0byBjb3B5IHNpbmdsZSB2YWx1ZXMgZnJvbSBhIG1lc3NhZ2UgaW50bworICBhIGJ1ZmZlciB3aXRob3V0IGNvcHlpbmcgdGhlIGVudGlyZSBtZXNzYWdlIChmZC5vICMxMDE1NjgsIFNpbW9uIE1jVml0dGllKQorCivigKIgREJVU19TWVNURU1fTE9HX0ZBVEFMIGhhcyBiZWVuIHJlcGxhY2VkIGJ5IERCVVNfU1lTVEVNX0xPR19FUlJPUi4KKyAgTG9nZ2luZyBhbiBFUlJPUiBtZXNzYWdlIGRvZXMgbm90IG1ha2UgdGhlIHByb2Nlc3MgZXhpdDsgdGhlIGNhbGxlcgorICBpcyByZXNwb25zaWJsZSBmb3IgY2FsbGluZyBhYm9ydCgpIG9yIGV4aXQoKSwgd2hpY2hldmVyIGlzIG1vcmUgYXBwcm9wcmlhdGUuCisgIChmZC5vICMxMDE1NjgsIFNpbW9uIE1jVml0dGllKQorCivigKIgQmV0dGVyIHRlc3QgY292ZXJhZ2UgKGZkLm8gIzEwMTU2OCwgU2ltb24gTWNWaXR0aWUpCisKK0QtQnVzIDEuMTEuMTQgKDIwMTctMDYtMjkpCis9PQorCitUaGUg4oCcaXJyYXRpb25hbCBmZWFyIG9mIGJlZXPigJ0gcmVsZWFzZS4KKworRGVwZW5kZW5jaWVzOgorCivigKIgRXhwYXQgPj0gMi4xLjAgaXMgYWx3YXlzIHJlcXVpcmVkCivigKIgbGlic2VsaW51eCA+PSAyLjAuODYgaXMgcmVxdWlyZWQgaWYgU0VMaW51eCBzdXBwb3J0IGlzIGVuYWJsZWQKK+KAoiBHTGliID49IDIuNDAgaXMgcmVxdWlyZWQgaWYgZnVsbCB0ZXN0IGNvdmVyYWdlIGlzIGVuYWJsZWQKKworQnVpbGQtdGltZSBjb25maWd1cmF0aW9uIGNoYW5nZXM6CisKK+KAoiBXZSBub3cgdXNlIHBrZy1jb25maWcgdG8gZmluZCBsaWJleHBhdCBpbiBBdXRvdG9vbHMgYnVpbGRzLiBUaGlzIHJlcXVpcmVzCisgIEV4cGF0IDIuMS4wIChNYXJjaCAyMDEyKSBvciBsYXRlci4gSW4gcGFydGljdWxhciwgdGhpcyBzaG91bGQgcmVtb3ZlIHRoZQorICBuZWVkIHRvIGNvbmZpZ3VyZSB3aXRoIExERkxBR1M9LUwvdXNyL2xvY2FsL2xpYiBvbiBPcGVuQlNELCB3aGljaCBjYW4KKyAgaXRzZWxmIGNhdXNlIGNvbXBpbGF0aW9uIGZhaWx1cmVzLgorCisgIEFzIHdpdGggYWxsIHBrZy1jb25maWctYmFzZWQgY29uZmlndXJlIGNoZWNrcywgeW91IGNhbiB1c2UKKyAgUEtHX0NPTkZJR19QQVRIPS93aGF0ZXZlci9saWIvcGtnY29uZmlnIHRvIGZpbmQgZXhwYXQucGMgaW4gYQorICBub24tc3RhbmRhcmQgcHJlZml4LCBvciBFWFBBVF9DRkxBR1M9Ii1JL3doYXRldmVyL2luY2x1ZGUiIGFuZAorICBFWFBBVF9MSUJTPSItTC93aGF0ZXZlci9saWIgLWxleHBhdCIgdG8gYXZvaWQgbmVlZGluZyBhIC5wYyBmaWxlCisgIGF0IGFsbC4KKworICAoZmQubyAjNjk4MDEsIFNpbW9uIE1jVml0dGllKQorCivigKIgU2ltaWxhcmx5LCB3ZSBub3cgdXNlIHBrZy1jb25maWcgdG8gZmluZCBsaWJzZWxpbnV4LiBWZXJzaW9uIDIuMC44NgorICBpcyByZXF1aXJlZCBkdWUgdG8gdGhlIHJlbW92YWwgb2YgZXhwbGljaXQgcmVmY291bnRpbmcgZm9yIFNJRHMuCisgIChmZC5vICMxMDA5MTIsIExhdXJlbnQgQmlnb252aWxsZSkKKworQmVoYXZpb3VyIGNoYW5nZXM6CisKK+KAoiBQcmV2aW91c2x5LCAvZXRjL21hY2hpbmUtaWQgY291bGQgYmUgY29waWVkIHRvIC92YXIvbGliL2RidXMvbWFjaGluZS1pZAorICBhcyBhIHNpZGUtZWZmZWN0IG9mIGEgc3VmZmljaWVudGx5IHByaXZpbGVnZWQgcHJvY2VzcyBtZXJlbHkgcmVhZGluZyB0aGUKKyAgbWFjaGluZSBJRC4gSXQgaXMgbm8gbG9uZ2VyIGNvcGllZCBhcyBhIHNpZGUtZWZmZWN0IG9mIHJlYWRpbmcuCisgIFJ1bm5pbmcgZGJ1cy11dWlkZ2VuIC0tZW5zdXJlLCB3aGljaCBzaG91bGQgYmUgZG9uZSBhZnRlciBpbnN0YWxsaW5nIGRidXMsCisgIGNvbnRpbnVlcyB0byBjb3B5IC9ldGMvbWFjaGluZS1pZCB0byAvdmFyL2xpYi9kYnVzL21hY2hpbmUtaWQgaWYgdGhlCisgIGZvcm1lciBleGlzdHMgYW5kIHRoZSBsYXR0ZXIgZG9lcyBub3QuCisgIChmZC5vICMxMDEyNTcsIFNpbW9uIE1jVml0dGllKQorCivigKIgVGhlIHVuZG9jdW1lbnRlZCBWZXJib3NlIGludGVyZmFjZSwgYW5kIHRoZSBHZXRBbGxNYXRjaFJ1bGVzIG1ldGhvZCBvbgorICB0aGUgdW5kb2N1bWVudGVkIFN0YXRzIGludGVyZmFjZSwgbXVzdCBub3cgYmUgdXNlZCB2aWEgdGhlIG9iamVjdCBwYXRoCisgIC9vcmcvZnJlZWRlc2t0b3AvREJ1cy4gUHJldmlvdXNseSwgdGhleSBleGlzdGVkIG9uIGFsbCBvYmplY3QgcGF0aHMuCisgIChmZC5vICMxMDEyNTcsIFNpbW9uIE1jVml0dGllKQorCivigKIgQWRkTWF0Y2goKSB3aXRoIGEgbWF0Y2ggcnVsZSBjb250YWluaW5nIGVhdmVzZHJvcD0ndHJ1ZScgd2lsbCBub3cgZmFpbAorICB1bmxlc3MgY2FsbGVkIGJ5IGVpdGhlciB0aGUgc2FtZSB1c2VyIGFzIHRoZSBkYnVzLWRhZW1vbiwgb3IgVW5peCB1aWQgMAorICAocm9vdCksIG1hdGNoaW5nIHRoZSByZXN0cmljdGlvbnMgYXBwbGllZCB0byB0aGUgbmV3ZXIgQmVjb21lTW9uaXRvcigpCisgIG1ldGhvZC4gT24gdGhlIHNlc3Npb24gYnVzIHRoaXMgaGFzIG5vIHByYWN0aWNhbCBlZmZlY3QuIE9uIHRoZSBzeXN0ZW0KKyAgYnVzIHRoaXMgd2lsbCBwcmV2ZW50IGNlcnRhaW4gY29uZmlndXJhdGlvbnMgdGhhdCBhbHJlYWR5IGRpZCBub3QKKyAgd29yayB3ZWxsIGluIHByYWN0aWNlLiAoZmQubyAjMTAxNTY3LCBTaW1vbiBNY1ZpdHRpZSkKKworRW5oYW5jZW1lbnRzOgorCivigKIgRC1CdXMgU3BlY2lmaWNhdGlvbiB2ZXJzaW9uIDAuMzEKKyAgwrcgRG9uJ3QgcmVxdWlyZSBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpYyBzZWFyY2ggcGF0aHMgdG8gYmUgbG93ZXN0CisgICAgcHJpb3JpdHkKKyAgwrcgQ29ycmVjdCByZWdleCBzeW50YXggZm9yIG9wdGlvbmFsbHktZXNjYXBlZCBieXRlcyBpbiBhZGRyZXNzZXMgc28gaXQKKyAgICBpbmNsdWRlcyBoeXBoZW4tbWludXMsIGZvcndhcmQgc2xhc2ggYW5kIHVuZGVyc2NvcmUgYXMgaW50ZW5kZWQKKyAgwrcgRGVzY3JpYmUgYWxsIG1lc3NhZ2UgYnVzIG1ldGhvZHMgaW4gdGhlIHNhbWUgc2VjdGlvbgorICDCtyBDbGFyaWZ5IHRoZSBjb3JyZWN0IG9iamVjdCBwYXRoIGZvciBtZXRob2QgY2FsbHMgdG8gdGhlIG1lc3NhZ2UgYnVzCisgICAgKC9vcmcvZnJlZWRlc2t0b3AvREJ1cywgREJVU19QQVRIX0RCVVMgaW4gdGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbikKKyAgwrcgRG9jdW1lbnQgdGhhdCB0aGUgbWVzc2FnZSBidXMgaW1wbGVtZW50cyBJbnRyb3NwZWN0YWJsZSwgUGVlciBhbmQKKyAgICBQcm9wZXJ0aWVzCisgIMK3IEFkZCBuZXcgRmVhdHVyZXMgYW5kIEludGVyZmFjZXMgcHJvcGVydGllcyBmb3IgbWVzc2FnZSBidXMKKyAgICBmZWF0dXJlLWRpc2NvdmVyeQorICDCtyBBZGQgdW5peDpkaXI9Li4uLCB3aGljaCByZXNlbWJsZXMgdW5peDp0bXBkaXI9Li4uIGJ1dCBuZXZlciB1c2VzCisgICAgYWJzdHJhY3Qgc29ja2V0cworICDCtyBEb24ndCByZXF1aXJlIGVhdmVzZHJvcD0ndHJ1ZScgdG8gYmUgYWNjZXB0ZWQgZnJvbSBjb25uZWN0aW9ucyBub3QKKyAgICBzdWZmaWNpZW50bHkgcHJpdmlsZWdlZCB0byB1c2UgaXQgc3VjY2Vzc2Z1bGx5CisgIMK3IEZvcm1hbGx5IGRlcHJlY2F0ZSBlYXZlc2Ryb3BwaW5nIGluIGZhdm91ciBvZiBCZWNvbWVNb25pdG9yCisgIChmZC5vICM5OTgyNSwgIzEwMDY4NiwgIzEwMDc5NSwgIzEwMTI1NiwgIzEwMTI1NywgIzEwMTU2NzsKKyAgU2ltb24gTWNWaXR0aWUsIFRvbSBHdW5kZXJzZW4pCisKK+KAoiBJbXBsZW1lbnQgdGhlIFByb3BlcnRpZXMgYW5kIFBlZXIgaW50ZXJmYWNlcyBpbiBkYnVzLWRhZW1vbgorICAoZmQubyAjMTAxMjU3LCBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIE5ldyBmdW5jdGlvbiBkYnVzX3RyeV9nZXRfbG9jYWxfbWFjaGluZV9pZCgpIGlzIGxpa2UKKyAgZGJ1c19nZXRfbG9jYWxfbWFjaGluZV9pZCgpLCBidXQgcmV0dXJuaW5nIGEgREJ1c0Vycm9yLiBPdGhlciBjb2RlCisgIHRoYXQgbmVlZHMgdGhlIG1hY2hpbmUgSUQgd2lsbCBub3cgcmVwb3J0IGEgcmVjb3ZlcmFibGUgZXJyb3IgKGluc3RlYWQKKyAgb2YgbG9nZ2luZyB0byBzdGRlcnIgYW5kIGFib3J0aW5nKSBpZiBubyBtYWNoaW5lIElEIGlzIGF2YWlsYWJsZS4KKyAgR2VuZXJhdGluZyBhIG1hY2hpbmUgSUQgaXMgc3RpbGwgY29uc2lkZXJlZCB0byBiZSBhIHJlcXVpcmVkIHBhcnQgb2YKKyAgaW5zdGFsbGluZyBkYnVzIGNvcnJlY3RseS4gKGZkLm8gIzEzMTk0LCBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIEltcGxlbWVudCBHZXRDb25uZWN0aW9uU0VMaW51eFNlY3VyaXR5Q29udGV4dCgib3JnLmZyZWVkZXNrdG9wLkRCdXMiKQorICAoZmQubyAjMTAxMzE1LCBMYXVyZW50IEJpZ29udmlsbGUpCisKK+KAoiBBdm9pZCBkZXByZWNhdGVkIEFQSSBjYWxscyB3aGVuIHVzaW5nIFNFTGludXgKKyAgKGZkLm8gIzEwMDkxMiwgTGF1cmVudCBCaWdvbnZpbGxlKQorCivigKIgU3dpdGNoIGEgdGVzdCBmcm9tIHRoZSBkZXByZWNhdGVkIGdfdGVzdF90cmFwX2ZvcmsoKSB0bworICBnX3Rlc3RfdHJhcF9zdWJwcm9jZXNzKCksIGZvciBXaW5kb3dzIHN1cHBvcnQgYW5kIGJldHRlciByb2J1c3RuZXNzCisgIG9uIFVuaXggKGZkLm8gIzEwMTM2MiwgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBPbiBzeXN0ZW1kIHN5c3RlbXMsIGlmICR7bG9jYWxzdGF0ZWRpcn0vZGJ1cy9tYWNoaW5lLWlkIGRvZXNuJ3QgZXhpc3QsCisgIGluc3RydWN0IHN5c3RlbWQtdG1wZmlsZXMgdG8gbWFrZSBpdCBhIHN5bWJvbGljIGxpbmsgdG8gL2V0Yy9tYWNoaW5lLWlkLgorICBUaGlzIHByZXZlbnRzIHRoZSB0d28gZmlsZXMgZnJvbSBnb2luZyBvdXQgb2Ygc3luYyBvbiBzdGF0ZWxlc3Mgb3IgbGl2ZQorICBpbWFnZXMgd2l0aG91dCBuZWVkaW5nIHRvIHJ1biBkYnVzLXV1aWRnZW4sIGFuZCBzdXBwb3J0cyBvbGRlciBELUJ1cworICBpbXBsZW1lbnRhdGlvbnMgdGhhdCBkbyBub3QgbmVjZXNzYXJpbHkgcmVhZCAvZXRjL21hY2hpbmUtaWQgdGhlbXNlbHZlcy4KKyAgKGZkLm8gIzEwMTU3MCwgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBJbXBsZW1lbnQgdW5peDpkaXI9Li4uLCB3aGljaCByZXNlbWJsZXMgdW5peDp0bXBkaXI9Li4uIGJ1dCBuZXZlciB1c2VzCisgIGFic3RyYWN0IHNvY2tldHMuIFRoaXMgaXMgcHJlZmVyYWJsZSB3aGVuIHVzZWQgd2l0aCBMaW51eCBjb250YWluZXJzLgorICAoZmQubyAjMTAxNTY3LCBTaW1vbiBNY1ZpdHRpZSkKKworRml4ZXM6CisKK+KAoiBGaXggYSByZWZlcmVuY2UgbGVhayB3aGVuIGJsb2NraW5nIG9uIGEgcGVuZGluZyBjYWxsIG9uIGEgY29ubmVjdGlvbgorICB0aGF0IGhhcyBiZWVuIGRpc2Nvbm5lY3RlZCAoZmQubyAjMTAxNDgxLCBTaGluLWljaGkgTU9SSVRBKQorCivigKIgRG9uJ3QgcHV0IHRpbWVzdGFtcHMgaW4gdGhlIERveHlnZW4tZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCisgIG9yIGhhcmQtY29kZSB0aGUgYnVpbGQgZGlyZWN0b3J5IGludG8gYnVpbGRzIHdpdGggZW1iZWRkZWQgdGVzdHMsCisgIGZvciByZXByb2R1Y2libGUgYnVpbGRzIChmZC5vICMxMDA2OTIsIFNpbW9uIE1jVml0dGllKQorCivigKIgRml4IHNvbWUgaW50ZWdyYXRpb24gdGVzdCBpc3N1ZXMgKGZkLm8gIzEwMDY4NiwgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBGaXggbWVtb3J5IGxlYWtzIGluIHRoZSB0ZXN0cyAoZmQubyAjMTAxMjU3LCBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIElmIHdlIHNvbWVob3cgZ2V0IGFuIGF1dG9sYXVuY2ggYWRkcmVzcyB3aXRoIG11bHRpcGxlIHNlbWljb2xvbi1zZXBhcmF0ZWQKKyAgY29tcG9uZW50cywgYW5kIHRoZXkgZG9uJ3Qgd29yaywgZG9uJ3QgaW52YWxpZGx5ICJwaWxlIHVwIiBlcnJvcnMKKyAgKGZkLm8gIzEwMTI1NywgU2ltb24gTWNWaXR0aWUpCisKK0RvY3VtZW50YXRpb246CisKK+KAoiBVcGRhdGUgZ2l0IFVSSXMgaW4gSEFDS0lORyBkb2N1bWVudCB0byBzeW5jIHVwIHdpdGggY2dpdC5mcmVlZGVza3RvcC5vcmcKKyAgKGZkLm8gIzEwMDcxNSwgU2ltb24gTWNWaXR0aWUpCisKK0QtQnVzIDEuMTEuMTIgKDIwMTctMDQtMDcpCis9PQorCitUaGUg4oCcaXQncyBzb21ldGhpbmcgaHVtYW5zIGRv4oCdIHJlbGVhc2UuCisKK0VuaGFuY2VtZW50czoKKwor4oCiIFRoZSBzZXNzaW9uIGRidXMtZGFlbW9uIG5vdyBzdXBwb3J0cyB0cmFuc2llbnQgLnNlcnZpY2UgZmlsZXMKKyAgaW4gJFhER19SVU5USU1FX0RJUi9kYnVzLTEvc2VydmljZXMuIFVubGlrZSB0aGUgb3RoZXIgc3RhbmRhcmQKKyAgc2VydmljZSBkaXJlY3RvcmllcywgdGhpcyBkaXJlY3RvcnkgaXMgbm90IG1vbml0b3JlZCB3aXRoIGlub3RpZnkKKyAgb3Igc2ltaWxhciwgYW5kIHRoZSBzZXJ2aWNlIGZpbGVzIG11c3QgYmUgbmFtZWQgZXhhY3RseQorICAke2J1c19uYW1lfS5zZXJ2aWNlLiAoZmQubyAjOTk4MjUsIFNpbW9uIE1jVml0dGllKQorCivigKIgZGJ1cyBjYW4gYmUgY29uZmlndXJlZCB3aXRoIC0tZW5hYmxlLXJlbG9jYXRpb24gd2hlbiBidWlsZGluZyB3aXRoCisgIEF1dG90b29scywgb3Igd2l0aCAtRERCVVNfUkVMT0NBVEFCTEU9T04gd2hlbiBidWlsZGluZyB3aXRoIGNtYWtlLAorICB0byBtYWtlIHRoZSBwa2ctY29uZmlnIG1ldGFkYXRhIHJlbG9jYXRhYmxlLiBUaGlzIGlzIHVzZWZ1bCBmb3IKKyAgbm9uLXN0YW5kYXJkIHByZWZpeGVzLCBhbmQgaW4gcGFydGljdWxhciBmb3IgV2luZG93cyBpbnN0YWxsYXRpb25zLgorICBIb3dldmVyLCBpdCBpcyBub3QgcmVjb21tZW5kZWQgZm9yIHN5c3RlbS13aWRlIGluc3RhbGxhdGlvbnMgaW50bworICAvdXNyLCBiZWNhdXNlIGl0IGludGVyZmVyZXMgd2l0aCBwa2ctY29uZmlnJ3MgYWJpbGl0eSB0byBmaWx0ZXIgb3V0CisgIGNvbXBpbGVyIGRlZmF1bHQgbGlua2VyIGRpcmVjdG9yaWVzLgorCisgIFdpdGggQXV0b3Rvb2xzLCB0aGUgZGVmYXVsdCBpcyAtLWVuYWJsZS1yZWxvY2F0aW9uIHdoZW4gYnVpbGRpbmcKKyAgZm9yIFdpbmRvd3Mgb3IgLS1kaXNhYmxlLXJlbG9jYXRpb24gb3RoZXJ3aXNlLiBXaXRoIENNYWtlLCB0aGUgZGVmYXVsdAorICBpcyAtRERCVVNfUkVMT0NBVEFCTEU9T04uCisKKyAgKGZkLm8gIzk5NzIxOyBSYWxmIEhhYmFja2VyLCBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIFVzZXJzIG9mIENNYWtlIOKJpSAyLjYgY2FuIG5vdyBsaW5rIHRvIGxpYmRidXMgd2l0aG91dCBwcm92aWRpbmcgdGhlaXIKKyAgb3duIEZpbmREQnVzLmNtYWtlIG1hY3Jvcywgd2hldGhlciBkYnVzIHdhcyBjb21waWxlZCB3aXRoIEF1dG90b29scworICBvciB3aXRoIENNYWtlLiBTZWUgdGhlIGVuZCBvZiBSRUFETUUuY21ha2UgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgIChmZC5vICM5OTcyMTsgUmFsZiBIYWJhY2tlciwgU2ltb24gTWNWaXR0aWUpCisKK0ZpeGVzOgorCivigKIgQWx3YXlzIHJlYWQgc2VydmljZSBmaWxlIGRpcmVjdG9yaWVzIGluIHRoZSBpbnRlbmRlZCBvcmRlcgorICAoZmQubyAjOTk4MjUsIFNpbW9uIE1jVml0dGllKQorCivigKIgV2hlbiB0ZXN0cyBhcmUgc2tpcHBlZCwgZG9uJ3QgdHJ5IHRvIGtpbGwgbm9uZXhpc3RlbnQgcHJvY2VzcyAwCisgIChmZC5vICM5OTgyNSwgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBBdm9pZCB2YWxncmluZCBmYWxzZSBwb3NpdGl2ZXMgKGZkLm8gIzg4ODA4LCBQaGlsaXAgV2l0aG5hbGwpCisKK+KAoiBGaXggYSBoYXJtbGVzcyByZWFkIG92ZXJmbG93IGFuZCBzb21lIG1lbW9yeSBsZWFrcyBpbiBhIHVuaXQgdGVzdAorICAoZmQubyAjMTAwNTY4LCBQaGlsaXAgV2l0aG5hbGwpCisKK+KAoiBGaXggc29tZSB0eXBvcyBpbiB0ZXN0IGNvZGUKKyAgKGZkLm8gIzk5OTk5LCBDb3Zlcml0eSAjMTQxODc2LCAjMTQxODc3OyBQaGlsaXAgV2l0aG5hbGwpCisKK+KAoiBDbGFyaWZ5IHRoZSByb2xlcyBvZiAvZXRjL2RidXMtMS9zKi5kIGFuZCAvdXNyL3NoYXJlL2RidXMtMS9zKi5kCisgIGluIGRvY3VtZW50YXRpb24gKGZkLm8gIzk5OTAxLCBQaGlsaXAgV2l0aG5hbGwpCisKK+KAoiBGaXggYW5kIGVuYWJsZSBjb21waWxlciB3YXJuaW5ncyByZWxhdGVkIHRvIC1Xc3dpdGNoCisgIChmZC5vICM5ODE5MTsgVGhvbWFzIFppbW1lcm1hbm4sIFNpbW9uIE1jVml0dGllKQorCivigKIgRml4IHdyaXRpbmcgb2ZmIHRoZSBlbmQgb2YgYSBmZF9zZXQgd2hlbiB0ZXN0aW5nIHdpdGggdmFsZ3JpbmQKKyAgKGZkLm8gIzk5ODM5LCBQaGlsaXAgV2l0aG5hbGwpCisKK0QtQnVzIDEuMTEuMTAgKDIwMTctMDItMTYpCis9PQorCitUaGUg4oCccHVycGxlIGhhaXIgZ2l2ZXMgeW91IHRlbGVraW5lc2lzP+KAnSByZWxlYXNlLgorCitEZXBlbmRlbmNpZXM6CisKK+KAoiBBcHBBcm1vciBzdXBwb3J0IHJlcXVpcmVzIGF0IGxlYXN0IGxpYmFwcGFybW9yIDIuOC45NSwgcmVkdWNlZAorICBmcm9tIDIuMTAgaW4gcHJldmlvdXMgdmVyc2lvbnMuIE9uZSB0ZXN0IHJlcXVpcmVzIDIuMTAgYW5kIGlzCisgIHNraXBwZWQgaWYgYnVpbGRpbmcgd2l0aCBhbiBvbGRlciB2ZXJzaW9uLgorCitFbmhhbmNlbWVudHM6CisKK+KAoiBEbyB0aGUgVHJhdmlzLUNJIGJ1aWxkIGluIERvY2tlciBjb250YWluZXJzIGZvciBVYnVudHUgTFRTLCBEZWJpYW4KKyAgc3RhYmxlIGFuZCBEZWJpYW4gdGVzdGluZyBpbiBhZGRpdGlvbiB0byB0aGUgb2xkZXIgVWJ1bnR1IHRoYXQgaXMKKyAgdGhlIGRlZmF1bHQgKGZkLm8gIzk4ODg5LCBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIEF2b2lkIHNvbWUgZGVwcmVjYXRlZCBDTWFrZSBmdW5jdGlvbnMgKGZkLm8gIzk5NTg2LCBSYWxmIEhhYmFja2VyKQorCivigKIgU2lsZW5jZSBtYW55IC1Xc3dpdGNoLWVudW0gYW5kIC1Xc3dpdGNoLWRlZmF1bHQgd2FybmluZ3MKKyAgKGZkLm8gIzk4MTkxOyBUaG9tYXMgWmltbWVybWFubiwgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBJbnN0YWxsIGEgc3lzdXNlcnMuZCBzbmlwcGV0IHNvIGBkYnVzLWRhZW1vbiAtLXN5c3RlbWAgY2FuIGJlIHVzZWQKKyAgd2l0aCBhbiB1bnBvcHVsYXRlZCAvZXRjIChmZC5vICM5OTE2MiwgTGVubmFydCBQb2V0dGVyaW5nKQorCivigKIgSW5zdGFsbCBwa2ctY29uZmlnIG1ldGFkYXRhIG9uIFVuaXggZXZlbiBpZiBidWlsZGluZyB3aXRoIENNYWtlCisgIChmZC5vICM5OTc1MiwgUmFsZiBIYWJhY2tlcikKKwor4oCiIEV4Y2x1ZGUgYXV0aCBtZWNoYW5pc21zIGZyb20gUkVKRUNURUQgbWVzc2FnZSBpZiB0aGV5IGFyZSBzdXBwb3J0ZWQKKyAgaW4gdGhlIGNvZGUgYnV0IGJ1dCBjb25maWd1cmVkIHRvIGJlIGRpc2FsbG93ZWQgKGZkLm8gIzk5NjIxLAorICBSYWxmIEhhYmFja2VyKQorCitGaXhlczoKKwor4oCiIFByZXZlbnQgc3ltbGluayBhdHRhY2tzIGluIHRoZSBub25jZS10Y3AgdHJhbnNwb3J0IG9uIFVuaXggdGhhdCBjb3VsZAorICBhbGxvdyBhbiBhdHRhY2tlciB0byBvdmVyd3JpdGUgYSBmaWxlIG5hbWVkICJub25jZSIsIGluIGEgZGlyZWN0b3J5CisgIHRoYXQgdGhlIHVzZXIgcnVubmluZyBkYnVzLWRhZW1vbiBjYW4gd3JpdGUsIHdpdGggYSByYW5kb20gdmFsdWUKKyAga25vd24gb25seSB0byB0aGUgdXNlciBydW5uaW5nIGRidXMtZGFlbW9uLiBUaGlzIGlzIHVubGlrZWx5IHRvIGJlCisgIGV4cGxvaXRhYmxlIGluIHByYWN0aWNlLCBwYXJ0aWN1bGFybHkgc2luY2UgdGhlIG5vbmNlLXRjcCB0cmFuc3BvcnQKKyAgaXMgcmVhbGx5IG9ubHkgdXNlZnVsIG9uIFdpbmRvd3MuCisKKyAgT24gVW5peCBzeXN0ZW1zIHdlIHN0cm9uZ2x5IHJlY29tbWVuZCB1c2luZyBvbmx5IHRoZSB1bml4OiBhbmQgc3lzdGVtZDoKKyAgdHJhbnNwb3J0cywgdG9nZXRoZXIgd2l0aCBFWFRFUk5BTCBhdXRoZW50aWNhdGlvbi4gVGhlc2UgYXJlIHRoZSBvbmx5CisgIHRyYW5zcG9ydHMgYW5kIGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbXMgZW5hYmxlZCBieSBkZWZhdWx0LgorCisgIChmZC5vICM5OTgyOCwgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBBdm9pZCBzeW1saW5rIGF0dGFja3MgaW4gdGhlICJlbWJlZGRlZCB0ZXN0cyIsIHdoaWNoIGFyZSBub3QgZW5hYmxlZAorICBieSBkZWZhdWx0IGFuZCBzaG91bGQgbmV2ZXIgYmUgZW5hYmxlZCBpbiBwcm9kdWN0aW9uIGJ1aWxkcyBvZiBkYnVzLgorICAoZmQubyAjOTk4MjgsIFNpbW9uIE1jVml0dGllKQorCivigKIgRml4IHRoZSBpbXBsZW1lbnRhdGlvbiBvZiByZS1lbmFibGluZyBhIHRpbWVvdXQgc28gdGhhdCBpdHMKKyAgY291bnRkb3duIGlzIHJlc3RhcnRlZCBhcyBpbnRlbmRlZCwgaW5zdGVhZCBvZiBjb250aW51YWxseQorICBkZWNyZWFzaW5nLiAoZmQubyAjOTU2MTk7IE1pY2hhbCBLb3V0bsO9LCBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIFdoZW4gcmVjZWl2aW5nIGEgbWVzc2FnZSB3aXRoIGZpbGUgZGVzY3JpcHRvcnMsIGRvIG5vdCBzdGFydCByZWFkaW5nCisgIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG5leHQgbWVzc2FnZSwgc28gdGhhdCBvbmx5IG9uZSBzdWNoIG1lc3NhZ2UKKyAgaXMgcHJvY2Vzc2VkIGF0IGEgdGltZS4gSW4gY29uanVuY3Rpb24gd2l0aCB0aGUgZml4IGZvciAjOTU2MTkKKyAgdGhpcyBtZWFucyB0aGF0IHByb2Nlc3NlcyBzZW5kaW5nIG1hbnkgZmlsZSBkZXNjcmlwdG9ycywgc3VjaCBhcworICBzeXN0ZW1kLWxvZ2luZCBvbiBhIHN5c3RlbSB0aGF0IHJlY2VpdmVzIHZlcnkgcmFwaWQgc3NoIGNvbm5lY3Rpb25zLAorICBhcmUgbm90IHRyZWF0ZWQgYXMgYWJ1c2l2ZSBhbmQga2lja2VkIG9mZiB0aGUgYnVzLiBSZXZlcnQgdGhlIHByZXZpb3VzCisgIHdvcmthcm91bmQgdGhhdCBzcGVjaWFsLWNhc2VkIHVpZCAwLgorICAoZmQubyAjOTUyNjMsIExQIzE1OTE0MTE7IFNpbW9uIE1jVml0dGllKQorCivigKIgRG8gbm90IHJlcXVpcmUgVE1QRElSLCBURU1QIG9yIFRNUCB0byBiZSBzZXQgd2hlbiBjcm9zcy1jb21waWxpbmcKKyAgZm9yIFdpbmRvd3Mgd2l0aCBDTWFrZSAoZmQubyAjOTk1ODYsIFJhbGYgSGFiYWNrZXIpCisKK+KAoiBEbyBub3Qgc2V0IFVuaXgtc3BlY2lmaWMgdmFyaWFibGVzIHdoZW4gdGFyZ2V0aW5nIFdpbmRvd3MKKyAgKGZkLm8gIzk5NTg2LCBSYWxmIEhhYmFja2VyKQorCivigKIgSW5zdGFsbCBVbml4IGV4ZWN1dGFibGVzIHRvICR7Q01BS0VfSU5TVEFMTF9QUkVGSVh9L2JpbiBhcyBpbnRlbmRlZCwKKyAgbm90ICR7Q01BS0VfSU5TVEFMTF9QUkVGSVh9L2xpYiAoZmQubyAjOTk3NTIsIFJhbGYgSGFiYWNrZXIpCisKK+KAoiBVc2UgcmVsYXRpdmUgaW5zdGFsbCBsb2NhdGlvbnMgaW4gQ01ha2Ugb24gVW5peCB0byByZXNwZWN0IERFU1RESVIsCisgIGFuZCB1c2UgR05VLXN0eWxlIGluc3RhbGwgbGF5b3V0IChmZC5vICM5OTcyMSwgIzk5NzUyOyBSYWxmIEhhYmFja2VyKQorCivigKIgSW5zdGFsbCBkYnVzLWFyY2gtZGVwcy5oIGNvcnJlY3RseSB3aGVuIHVzaW5nIENNYWtlCisgIChmZC5vICM5OTU4NiwgIzk5NzIxOyBSYWxmIEhhYmFja2VyKQorCivigKIgSW1wcm92ZSBhcmd1bWVudCB2YWxpZGF0aW9uIGZvciBgZGJ1cy10ZXN0LXRvb2wgc3BhbWAKKyAgKGZmZC5vICM5OTY5MywgQ292ZXJpdHkgIzU0NzU5OyBQaGlsaXAgV2l0aG5hbGwpCisKK+KAoiBEb24ndCBzaGlmdCBieSBhIG5lZ2F0aXZlIGludGVnZXIgaWYgYSBoYXNoIHRhYmxlIGJlY29tZXMgbW9uc3Ryb3VzbHkKKyAgbGFyZ2UgKGZkLm8gIzk5NjQxLCBDb3Zlcml0eSAjNTQ2ODI7IFBoaWxpcCBXaXRobmFsbCkKKwor4oCiIERvbid0IGxlYWsgTFNNIGxhYmVsIGlmIGRidXMtZGFlbW9uIHJ1bnMgb3V0IG9mIG1lbW9yeSB3aGVuIGRlYWxpbmcgd2l0aAorICBhIG5ldyBjb25uZWN0aW9uIChmZC5vICM5OTYxMiwgQ292ZXJpdHkgIzE0MTA1ODsgUGhpbGlwIFdpdGhuYWxsKQorCivigKIgUmVtb3ZlIGFuIHVubmVjZXNzYXJ5IE5VTEwgY2hlY2sKKyAgKGZkLm8gIzk5NjQyLCBDb3Zlcml0eSAjMTQxMDYyOyBQaGlsaXAgV2l0aG5hbGwpCisKK+KAoiBJbXByb3ZlIGVycm9yIGhhbmRsaW5nIGluIHVuaXQgdGVzdHMgYW5kIGRidXMtc2VuZAorICAoZmQubyAjOTk2NDMsICM5OTY5NCwgIzk5NzEyLCAjOTk3MjIsICM5OTcyMywgIzk5NzI0LCAjOTk3NTgsCisgICM5OTc1OSwgIzk5NzkzLCBDb3Zlcml0eSAjNTQ2ODgsICM1NDY5MiwgIzU0NjkzLCAjNTQ2OTcsICM1NDcwMSwKKyAgIzU0NzEwLCAjNTQ3MTEsICM1NDcxNCwgIzU0NzE1LCAjNTQ3MTgsICM1NDcyMSwgIzU0NzI0LCAjNTQ3MjYsCisgICM1NDczMCwgIzU0NzQwLCAjNTQ4MjIsICM1NDgyMywgIzU0ODI0LCAjNTQ4MjU7IFBoaWxpcCBXaXRobmFsbCkKKwor4oCiIERvIG5vdCBwcmludCB2ZXJib3NlIG1lc3NhZ2VzJyB0aW1lc3RhbXBzIHRvIHN0ZGVyciBpZiB0aGUgYWN0dWFsIG1lc3NhZ2UKKyAgaGFzIGJlZW4gcmVkaXJlY3RlZCB0byB0aGUgV2luZG93cyBkZWJ1ZyBwb3J0IChmZC5vICM5OTc0OSwgUmFsZiBIYWJhY2tlcikKKworRC1CdXMgMS4xMS44ICgyMDE2LTExLTI4KQorPT0KKworVGhlIOKAnHBhbmljcyBpbiB0aGUgZmFjZSBvZiBicmVha2Zhc3QgZm9vZHPigJ0gcmVsZWFzZS4KKworQnVpbGQtdGltZSBjb25maWd1cmF0aW9uOgorCivigKIgVGhlIG5ldyAtLWVuYWJsZS1kZWJ1ZyBjb25maWd1cmUgb3B0aW9uIHByb3ZpZGVzIGFuIGVhc3kgd2F5IHRvCisgIGVuYWJsZSBkZWJ1ZyBzeW1ib2xzLCBkaXNhYmxlIG9wdGltaXphdGlvbiBhbmQvb3IgZW5hYmxlIHByb2ZpbGluZy4KKwor4oCiIFRoZSAtLWVuYWJsZS1jb21waWxlLXdhcm5pbmdzIGNvbmZpZ3VyZSBvcHRpb24gY2FuIGJlIHVzZWQgdG8gY29udHJvbAorICBjb21waWxlciB3YXJuaW5ncy4KKwor4oCiIFRoZSAtLWRpc2FibGUtY29tcGlsZXItb3B0aW1pc2F0aW9ucyBjb25maWd1cmUgb3B0aW9uIGlzIG5vIGxvbmdlcgorICBzdXBwb3J0ZWQuIFVzZSAtLWVuYWJsZS1kZWJ1Zz15ZXMgb3IgQ0ZMQUdTPS1PMCBpbnN0ZWFkLgorCitFbmhhbmNlbWVudHM6CisKK+KAoiBELUJ1cyBTcGVjaWZpY2F0aW9uIHZlcnNpb24gMC4zMAorICDCtyBEZWZpbmUgdGhlIGphcmdvbiB0ZXJtICJhY3RpdmF0aW9uIiBtb3JlIGNsZWFybHkKKyAgwrcgRGVmaW5lIHRoZSBqYXJnb24gdGVybSAiYXV0by1zdGFydGluZyIsIHdoaWNoIGlzIG9uZSBmb3JtIG9mIGFjdGl2YXRpb24KKyAgwrcgRG9jdW1lbnQgdGhlIG9wdGlvbmFsIFN5c3RlbWRTZXJ2aWNlIGtleSBpbiBzZXJ2aWNlIGZpbGVzCisgIMK3IFVzZSB2ZXJzaW9uZWQgaW50ZXJmYWNlIGFuZCBidXMgbmFtZXMgaW4gbW9zdCBleGFtcGxlcworICDCtyBDbGFyaWZ5IGludGVuZGVkIGJlaGF2aW91ciBvZiBQcm9wZXJ0aWVzLkdldEFsbAorICAoZmQubyAjMzYxOTAsIGZkLm8gIzk4NjcxOyBQaGlsaXAgV2l0aG5hbGwsIFNpbW9uIE1jVml0dGllKQorCivigKIgRml4IGFuZCBlbmFibGUgYSBsb3Qgb2YgY29tcGlsZXIgd2FybmluZ3MgdG8gaW1wcm92ZSBmdXR1cmUgY29kZQorICBxdWFsaXR5LiBUaGlzIG1pZ2h0IGluY2lkZW50YWxseSBhbHNvIGZpeCBzb21lIGVudmlyb25tZW50IHZhcmlhYmxlCisgIGFjY2Vzc2VzIG9uIE9TIFguCisgIMK3IEluIHBhcnRpY3VsYXIsIHByaW50Zi1zdHlsZSBmdW5jdGlvbnMgaW4gdGhlIGxpYmRidXMgQVBJIGFyZSBub3cgYW5ub3RhdGVkCisgICAgd2l0aCBfX2F0dHJpYnV0ZV9fKChfX2Zvcm1hdF9fKF9fcHJpbnRmX18sICosICopKSkgd2hlbiBjb21waWxpbmcgd2l0aAorICAgIGdjYyBvciBjbGFuZy4gVGhpcyBtaWdodCBtYWtlIHByaW50ZiBidWdzIGluIG90aGVyIHNvZnR3YXJlIHZpc2libGUKKyAgICBhdCBjb21waWxlIHRpbWUuCisgIChmZC5vICM5NzM1NywgZmQubyAjOTgxOTIsIGZkLm8gIzk4MTk1LCBmZC5vICM5ODY1ODsKKyAgVGhvbWFzIFppbW1lcm1hbm4sIFNpbW9uIE1jVml0dGllKQorCivigKIgV2hlbiBydW5uaW5nIHdpdGggQXBwQXJtb3IgbWVkaWF0aW9uIChmb3IgZXhhbXBsZSB1c2luZyBVYnVudHUncyBwYXRjaGVkCisgIExpbnV4IGtlcm5lbCksIGNsaWVudHMgY2FuIG5vIGxvbmdlciBhdXRvLXN0YXJ0IHNlcnZpY2VzIHVubGVzcyB0aGV5IHdvdWxkCisgIGhhdmUgYmVlbiBhYmxlIHRvIHNlbmQgdGhlIGF1dG8tc3RhcnRpbmcgbWVzc2FnZSB0byB0aGUgc2VydmljZSBhZnRlciBpdAorICBzdGFydHMuIFN0YXJ0U2VydmljZUJ5TmFtZSgpIGlzIHVuYWZmZWN0ZWQsIGFuZCBjb250aW51ZXMgdG8gYmUgYWxsb3dlZCBieQorICBkZWZhdWx0IGluIEFwcEFybW9yJ3MgPGFic3RyYWN0aW9ucy9kYnVzLXN0cmljdD4gYW5kCisgIDxhYnN0cmFjdGlvbnMvZGJ1cy1zZXNzaW9uLXN0cmljdD4uIChmZC5vICM5ODY2NiwgU2ltb24gTWNWaXR0aWUpCisKK0ZpeGVzOgorCivigKIgV29yayBhcm91bmQgYW4gdW5kZXNpcmVkIGVmZmVjdCBvZiB0aGUgZml4IGZvciBDVkUtMjAxNC0zNjM3CisgIChmZC5vICM4MDU1OSksIGluIHdoaWNoIHByb2Nlc3NlcyB0aGF0IGZyZXF1ZW50bHkgc2VuZCBmZHMsIHN1Y2ggYXMKKyAgbG9naW5kIGR1cmluZyBhIGZsb29kIG9mIG5ldyBQQU0gc2Vzc2lvbnMsIGNhbiBnZXQgZGlzY29ubmVjdGVkIGZvcgorICBjb250aW51b3VzbHkgaGF2aW5nIGF0IGxlYXN0IG9uZSBmZCAiaW4gZmxpZ2h0IiBmb3IgdG9vIGxvbmc7CisgIGRidXMtZGFlbW9uIGludGVycHJldHMgdGhhdCBhcyBhIHBvdGVudGlhbCBkZW5pYWwgb2Ygc2VydmljZSBhdHRhY2suCisgIFRoZSB3b3JrYXJvdW5kIGlzIHRvIGRpc2FibGUgdGhhdCBjaGVjayBmb3IgdWlkIDAgcHJvY2VzcyBzdWNoIGFzCisgIGxvZ2luZCwgd2l0aCBhIG1lc3NhZ2UgaW4gdGhlIHN5c3RlbSBsb2cuIFRoZSBidWcgcmVtYWlucyBvcGVuIHdoaWxlCisgIHdlIGxvb2sgZm9yIGEgbW9yZSBnZW5lcmFsIHNvbHV0aW9uLgorICAoZmQubyAjOTUyNjMsIExQIzE1OTE0MTE7IFNpbW9uIE1jVml0dGllKQorCivigKIgRG9uJ3QgcnVuIHRoZSB0ZXN0IHRlc3QtZGJ1cy1sYXVuY2gteDExLnNoIGlmIFgxMSBhdXRvbGF1bmNoaW5nCisgIHdhcyBkaXNhYmxlZCBhdCBjb21waWxlIHRpbWUuIFRoYXQgdGVzdCBpcyBub3QgZXhwZWN0ZWQgdG8gd29yaworICBpbiB0aGF0IGNvbmZpZ3VyYXRpb24uIChmZC5vICM5ODY2NSwgU2ltb24gTWNWaXR0aWUpCisKK0QtQnVzIDEuMTEuNiAoMjAxNi0xMC0xMCkKKz09CisKK1RoZSDigJxkYXJrbHkgd2hpbXNpY2Fs4oCdIHJlbGVhc2UuCisKK1NlY3VyaXR5IGZpeGVzOgorCivigKIgRG8gbm90IHRyZWF0IEFjdGl2YXRpb25GYWlsdXJlIG1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSByb290LW93bmVkIHN5c3RlbWQKKyAgbmFtZSBhcyBhIGZvcm1hdCBzdHJpbmcuIEluIHByaW5jaXBsZSB0aGlzIGlzIGEgc2VjdXJpdHkgdnVsbmVyYWJpbGl0eSwKKyAgYnV0IHdlIGRvIG5vdCBiZWxpZXZlIGl0IGlzIGV4cGxvaXRhYmxlIGluIHByYWN0aWNlLCBiZWNhdXNlIG9ubHkKKyAgcHJpdmlsZWdlZCBwcm9jZXNzZXMgY2FuIG93biB0aGUgb3JnLmZyZWVkZXNrdG9wLnN5c3RlbWQxIGJ1cyBuYW1lLCBhbmQKKyAgc3lzdGVtZCBkb2VzIG5vdCBhcHBlYXIgdG8gc2VuZCBhY3RpdmF0aW9uIGZhaWx1cmVzIHRoYXQgY29udGFpbiAiJSIuCisKKyAgUGxlYXNlIG5vdGUgdGhhdCB0aGlzIHByb2JhYmx5ICp3YXMqIGV4cGxvaXRhYmxlIGluIGRidXMgdmVyc2lvbnMKKyAgb2xkZXIgdGhhbiAxLjYuMzAsIDEuOC4xNiBhbmQgMS45LjEwIGR1ZSB0byBhIG1pc3NpbmcgY2hlY2sgd2hpY2ggYXQKKyAgdGhlIHRpbWUgd2FzIG9ubHkgdGhvdWdodCB0byBiZSBhIGRlbmlhbCBvZiBzZXJ2aWNlIHZ1bG5lcmFiaWxpdHkKKyAgKENWRS0yMDE1LTAyNDUpLiBJZiB5b3UgYXJlIHN0aWxsIHJ1bm5pbmcgb25lIG9mIHRob3NlIHZlcnNpb25zLAorICBwYXRjaCBvciB1cGdyYWRlIGltbWVkaWF0ZWx5LgorCisgIChmZC5vICM5ODE1NywgU2ltb24gTWNWaXR0aWUpCisKK0VuaGFuY2VtZW50czoKKwor4oCiIEQtQnVzIFNwZWNpZmljYXRpb24gdmVyc2lvbiAwLjI5CisgIMK3IFJlY29tbWVuZCBub3QgdXNpbmcgJy8nIGZvciBvYmplY3QgcGF0aHMgKGZkLm8gIzM3MDk1LCBQaGlsaXAgV2l0aG5hbGwpCisgIMK3IEFsbG93IDxhbm5vdGF0aW9uPiBpbiA8YXJnPiBlbGVtZW50cyAoZmQubyAjODYxNjIsIFBoaWxpcCBXaXRobmFsbCkKKwor4oCiIExvZyB0byBzeXNsb2cgd2hlbiB3ZSBleGNlZWQgdmFyaW91cyBhbnRpLURvUyBsaW1pdHMsIGFuZCBhZGQgdGVzdAorICBjb3ZlcmFnZSBmb3IgdGhlbSAoZmQubyAjODY0NDIsIFNpbW9uIE1jVml0dGllKQorCivigKIgSW1wcm92ZSBzeXNsb2cgaGFuZGxpbmcgc28gdGhhdCBfZGJ1c193YXJuKCkgYW5kIHNpbWlsYXIgd2FybmluZ3MKKyAgZ28gdG8gc3lzbG9nLCBhZGQgZGJ1cy1kYWVtb24gLS1zeXNsb2d8LS1ub3N5c2xvZ3wtLXN5c2xvZy1vbmx5IG9wdGlvbnMsCisgIGFuZCBsb2cgdG8gc3lzbG9nIChpbnN0ZWFkIG9mIC9kZXYvbnVsbCkgd2hlbiBkYnVzLWRhZW1vbiBpcyBzdGFydGVkIGJ5CisgIGRidXMtbGF1bmNoLiAoZmQubyAjOTcwMDksIFNpbW9uIE1jVml0dGllKQorCivigKIgSW5zdGFsbCBpbnRyb3NwZWN0LmR0ZCBhbmQgYnVzY29uZmlnLmR0ZCB0byAke2RhdGFkaXJ9L3htbC9kYnVzLTEKKyAgKGZkLm8gIzg5MDExLCBQaGlsaXAgV2l0aG5hbGwpCisKK+KAoiBXaGVuIGxvZ2dpbmcgbWVzc2FnZXMgYWJvdXQgc2VydmljZSBhY3RpdmF0aW9uLCBtZW50aW9uIHdoaWNoIHBlZXIKKyAgcmVxdWVzdGVkIHRoZSBhY3RpdmF0aW9uIChmZC5vICM2ODIxMiwgUGhpbGlwIFdpdGhuYWxsKQorCivigKIgT24gTGludXgsIG1lbnRpb24gdGhlIExTTSBsYWJlbCAoaWYgYXZhaWxhYmxlKSB3aGVuZXZlciB3ZSBwcmludAorICBkZWJ1ZyBpbmZvcm1hdGlvbiBhYm91dCBhIHBlZXIgKGZkLm8gIzY4MjEyLCBQaGlsaXAgV2l0aG5hbGwpCisKK090aGVyIGZpeGVzOgorCivigKIgSGFyZGVuIGRidXMtZGFlbW9uIGFnYWluc3QgbWFsaWNpb3VzIG9yIGluY29ycmVjdCBBY3RpdmF0aW9uRmFpbHVyZQorICBtZXNzYWdlcyBieSByZWplY3RpbmcgdGhlbSBpZiB0aGV5IGRvIG5vdCBjb21lIGZyb20gYSBwcml2aWxlZ2VkCisgIHByb2Nlc3MsIG9yIGlmIHN5c3RlbWQgYWN0aXZhdGlvbiBpcyBub3QgZW5hYmxlZAorICAoZmQubyAjOTgxNTcsIFNpbW9uIE1jVml0dGllKQorCivigKIgQXZvaWQgdW5kZWZpbmVkIGJlaGF2aW91ciB3aGVuIHNldHRpbmcgcmVwbHkgc2VyaWFsIG51bWJlciB3aXRob3V0IGdvaW5nCisgIHZpYSB1bmlvbiBEQnVzQmFzaWNWYWx1ZSAoZmQubyAjOTgwMzUsIE1hcmMgTXV0eikKKwor4oCiIEZpeCBDTWFrZSBidWlsZCBmb3IgVW5peCBwbGF0Zm9ybXMgdGhhdCBkbyBub3QgaGF2ZSAtbHJ0LCBzdWNoIGFzIEFuZHJvaWQsCisgIG9yIHRoYXQgZG8gbmVlZCAtbHNvY2tldCwgc3VjaCBhcyBRTlggKGZkLm8gIzk0MDk2LCBSYWxmIEhhYmFja2VyKQorCivigKIgYXV0b2dlbi5zaDogZmFpbCBjbGVhbmx5IGlmIGF1dG9jb25mIGZhaWxzIChTaW1vbiBNY1ZpdHRpZSkKKworRC1CdXMgMS4xMS40ICgyMDE2LTA4LTE1KQorPT0KKworVGhlIOKAnGNvcHBlciBwaWNrYXhl4oCdIHJlbGVhc2UuCisKK0RlcGVuZGVuY2llczoKKwor4oCiIEJ1aWxkaW5nIGZyb20gZ2l0IChidXQgbm90IGZyb20gdGFyYmFsbHMpIG5vdyByZXF1aXJlcworICBtYWNyb3MgZnJvbSB0aGUgR05VIEF1dG9jb25mIEFyY2hpdmUsIGZvciBleGFtcGxlIHRoZSBhdXRvY29uZi1hcmNoaXZlCisgIHBhY2thZ2UgaW4gRGViaWFuIG9yIEZlZG9yYSBkZXJpdmF0aXZlcy4KKworQnVpbGQtdGltZSBjb25maWd1cmF0aW9uOgorCivigKIgVGhlIG9wdGlvbiB0byBlbmFibGUgY292ZXJhZ2UgaW5zdHJ1bWVudGF0aW9uIGhhcyBjaGFuZ2VkIGZyb20KKyAgLS1lbmFibGUtY29tcGlsZXItY292ZXJhZ2UgdG8gLS1lbmFibGUtY29kZS1jb3ZlcmFnZS4KKworRW5oYW5jZW1lbnRzOgorCivigKIgRC1CdXMgU3BlY2lmaWNhdGlvbiB2ZXJzaW9uIDAuMjgKKyAgwrcgQ2xhcmlmeSBzb21lIGRldGFpbHMgb2Ygc2VyaWFsaXphdGlvbiAoZmQubyAjOTMzODIsIFBoaWxpcCBXaXRobmFsbCkKKwor4oCiIEluY3JlYXNlIGxpc3RlbigpIGJhY2tsb2cgb2YgQUZfVU5JWCBzb2NrZXRzIHRvIHRoZSBtYXhpbXVtIHBvc3NpYmxlLAorICBtaW5pbWl6aW5nIGZhaWxlZCBjb25uZWN0aW9ucyB1bmRlciBoZWF2eSBsb2FkCisgIChmZC5vICM5NTI2NCwgTGVubmFydCBQb2V0dGVyaW5nKQorCivigKIgQWRkIGEgbmV3IGRidXMtbGF1bmNoIC0tZXhpdC13aXRoLXgxMSBvcHRpb24gKGZkLm8gIzM5MTk3LCBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIFVzZSB0aGUgc2FtZSByZWdyZXNzaW9uIHRlc3RzIGZvciBzdWJwcm9jZXNzIHN0YXJ0aW5nIG9uIFVuaXggYW5kIFdpbmRvd3MKKyAgKGZkLm8gIzk1MTkxLCBSYWxmIEhhYmFja2VyKQorCivigKIgUHJpbnQgdGltZXN0YW1wcyBhbmQgdGhyZWFkIElEcyBpbiB2ZXJib3NlIG1lc3NhZ2VzCisgIChmZC5vICM5NTE5MSwgUmFsZiBIYWJhY2tlcikKKwor4oCiIE9uIFVuaXgsIHVuaWZ5IHRoZSB2YXJpb3VzIHBsYWNlcyB0aGF0IHJlb3BlbiBzdGRpbiwgc3Rkb3V0IGFuZC9vciBzdGRlcnIKKyAgcG9pbnRpbmcgdG8gL2Rldi9udWxsIChmZC5vICM5NzAwOCwgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBVc2UgQVhfQ09ERV9DT1ZFUkFHRSBpbnN0ZWFkIG9mIG91ciBvd24gQ09NUElMRVJfQ09WRVJBR0UKKyAgKGZkLm8gIzg4OTIyLCBUaG9tYXMgWmltbWVybWFubikKKworRml4ZXM6CisKK+KAoiBPbiBXaW5kb3dzLCBmaXggYSBtZW1vcnkgbGVhayBpbiByZXBsYWNpbmcgdGhlIGluc3RhbGxhdGlvbiBwcmVmaXgKKyAgKGZkLm8gIzk1MTkxLCBSYWxmIEhhYmFja2VyKQorCivigKIgT24gTGludXgsIHdoZW4gZGJ1cy1kYWVtb24gaXMgcnVuIHdpdGggcmVkdWNlZCBzdXNjZXB0aWJpbGl0eSB0byB0aGUKKyAgT09NIGtpbGxlciAodHlwaWNhbGx5IHZpYSBzeXN0ZW1kKSwgZG8gbm90IGxldCBjaGlsZCBwcm9jZXNzZXMgaW5oZXJpdAorICB0aGF0IHNldHRpbmcgKGZkLm8gIzMyODUxOyBLaW1tbyBIw6Rtw6Rsw6RpbmVuLCBXYUx5b25nIENobykKKwor4oCiIE9uIFVuaXgsIG1ha2UgZGJ1cy1sYXVuY2ggYW5kIGRidXMtZGFlbW9uIC0tZm9yayB3b3JrIGFzIGludGVuZGVkCisgIGV2ZW4gaWYgYSBwYXJlbnQgcHJvY2VzcyBpbmNvcnJlY3RseSBzdGFydHMgdGhlbSB3aXRoIHN0ZGluLCBzdGRvdXQKKyAgYW5kL29yIHN0ZGVyciBjbG9zZWQgKGZkLm8gIzk3MDA4LCBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIE91dHB1dCB2YWxpZCBzaGVsbCBzeW50YXggaW4gfi8uZGJ1cy9zZXNzaW9uLWJ1cy8gaWYgdGhlIGJ1cyBhZGRyZXNzCisgIGNvbnRhaW5zIGEgc2VtaWNvbG9uIChmZC5vICM5NDc0NiwgVGhpYWdvIE1hY2llaXJhKQorCivigKIgRml4IG1lbW9yeSBsZWFrcyBhbmQgdGhyZWFkIHNhZmV0eSBpbiBzdWJwcm9jZXNzIHN0YXJ0aW5nIG9uIFdpbmRvd3MKKyAgKGZkLm8gIzk1MTkxLCBSYWxmIEhhYmFja2VyKQorCivigKIgU3RvcCB0ZXN0LWRidXMtZGFlbW9uIGluY29ycmVjdGx5IGZhaWxpbmcgb24gcGxhdGZvcm1zIHRoYXQgY2Fubm90CisgIGRpc2NvdmVyIHRoZSBwcm9jZXNzIElEIG9mIGNsaWVudHMgKGZkLm8gIzk2NjUzLCDQoNGD0YHQu9Cw0L0g0JjQttCx0YPQu9Cw0YLQvtCyKQorCivigKIgSW4gdGVzdHMgdGhhdCBleGVyY2lzZSBjb3JyZWN0IGhhbmRsaW5nIG9mIGNyYXNoaW5nIEQtQnVzIHNlcnZpY2VzLAorICBzdXBwcmVzcyBXaW5kb3dzIGNyYXNoIGhhbmRsZXIgKGZkLm8gIzk1MTU1OyBZaXlhbmcgRmVpLCBSYWxmIEhhYmFja2VyKQorCivigKIgRXhwbGljaXRseSBjaGVjayBmb3Igc3RkaW50LmggKElvYW4tQWRyaWFuIFJhdGl1KQorCivigKIgSW4gdGVzdHMsIGFkZCBhbiBpbnZhbGlkIERCdXNBdXRoU3RhdGUgdG8gYXZvaWQgdW5kZWZpbmVkIGJlaGF2aW91cgorICBpbiBzb21lIHRlc3QgY2FzZXMgKGZkLm8gIzkzOTA5LCBOaWNrIExld3lja3kpCisKK+KAoiBBZGQgYXNzZXJ0aW9ucyB0byByZWFzc3VyZSBhIHN0YXRpYyBhbmFseXNpcyB0b29sCisgIChmZC5vICM5MzIxMCwgRGVlcGlrYSBBZ2dhcndhbCkKKwor4oCiIEJlIGV4cGxpY2l0IGFib3V0IGVudW0gY29tcGFyaXNvbiB3aGVuIGxvYWRpbmcgWE1MCisgIChmZC5vICM5MzIwNSwgRGVlcGlrYSBBZ2dhcndhbCkKKwor4oCiIHVwZGF0ZS1hY3RpdmF0aW9uLWVudmlyb25tZW50OiBwcm9kdWNlIGJldHRlciBkaWFnbm9zdGljcyBvbiBlcnJvcgorICAoZmQubyAjOTY2NTMsIFNpbW9uIE1jVml0dGllKQorCivigKIgQXZvaWQgdmFyaW91cyBjb21waWxlciB3YXJuaW5ncyB3aXRoIGdjYyA2CisgIChmZC5vICM5NzI4MjsgVGhvbWFzIFppbW1lcm1hbm4sIFNpbW9uIE1jVml0dGllKQorCivigKIgT24gVW5peCB3aGVuIGNvbmZpZ3VyZWQgdG8gdXNlIHRoZSBzeXN0ZW0gbG9nLCByZXBvcnQgYXMgImRidXMtZGFlbW9uIiwKKyAgbm90IGFzICJkYnVzIiAoZmQubyAjOTcwMDksIFNpbW9uIE1jVml0dGllKQorCivigKIgRHVyaW5nIHVuaXQgdGVzdHMsIHJlZHVjZSB0aGUgYW1vdW50IHdlIHdyaXRlIHRvIHRoZSBzeXN0ZW0gbG9nCisgIChmZC5vICM5NzAwOSwgU2ltb24gTWNWaXR0aWUpCisKK0QtQnVzIDEuMTEuMiAoMjAxNi0wMy0wNykKKz09CisKK1RoZSDigJxwbmV1bWF0aWMgZHJpbGwgdnMuIElyb24gTWFpZGVu4oCdIHJlbGVhc2UuCisKK0ZpeGVzOgorCivigKIgRW5hYmxlICJsYXJnZSBmaWxlIHN1cHBvcnQiIG9uIHN5c3RlbXMgd2hlcmUgaXQgZXhpc3RzOiBkYnVzLWRhZW1vbgorICBpcyBub3QgZXhwZWN0ZWQgdG8gb3BlbiBsYXJnZSBmaWxlcywgYnV0IGl0IG1pZ2h0IG5lZWQgdG8gc3RhdCBmaWxlcworICB0aGF0IGhhcHBlbiB0byBoYXZlIGxhcmdlIGlub2RlIG51bWJlcnMgKGZkLm8gIzkzNTQ1LCBIb25neHUgSmlhKQorCivigKIgRWxpbWluYXRlIHBhZGRpbmcgaW5zaWRlIERCdXNNZXNzYWdlSXRlciBvbiA2NC1iaXQgcGxhdGZvcm1zLAorICB3aGljaCBtaWdodCByZXN1bHQgaW4gYSBwZWRhbnRpYyBDIGNvbXBpbGVyIG5vdCBjb3B5aW5nIHRoZSBlbnRpcmUgY29udGVudHMKKyAgb2YgYSBEQnVzTWVzc2FnZUl0ZXI7IHN0YXRpY2FsbHkgYXNzZXJ0IHRoYXQgdGhpcyBpcyBub3QgYW4gQUJJIGNoYW5nZQorICBpbiBwcmFjdGljZSAoZmQubyAjOTQxMzYsIFNpbW9uIE1jVml0dGllKQorCivigKIgRG9jdW1lbnQgZGJ1cy10ZXN0LXRvb2wgZWNobyAtLXNsZWVwLW1zPU4gaW5zdGVhZCBvZiBpbmNvcnJlY3QgLS1zbGVlcD1OCisgIChmZC5vICM5NDI0NCwgRG1pdHJpIElvdWNodGNoZW5rbykKKwor4oCiIENvcnJlY3RseSByZXBvcnQgdGVzdCBmYWlsdXJlcyBpbiBDIHRlc3RzIGZyb20gcnVuLXRlc3Quc2gKKyAgKGZkLm8gIzkzMzc5OyBhbWl0IHRld2FyaSwgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBXaGVuIHRlc3RzIGFyZSBlbmFibGVkLCBydW4gYWxsIHRoZSBtYXJzaGFsLXZhbGlkYXRlIHRlc3RzLCBub3QganVzdAorICB0aGUgZXZlbi1udW1iZXJlZCBvbmVzIChmZC5vICM5MzkwOCwgTmljayBMZXd5Y2t5KQorCivigKIgQ29ycmVjdCB0aGUgZXhwZWN0ZWQgZXJyb3IgZnJvbSBvbmUgbWFyc2hhbC12YWxpZGF0ZSB0ZXN0LCB3aGljaCB3YXMKKyAgcHJldmlvdXNseSBub3QgcnVuIGR1ZSB0byB0aGUgYWJvdmUgYnVnIChmZC5vICM5MzkwOCwgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBGaXggY29tcGlsYXRpb24gdW5kZXIgQ01ha2Ugd2hlbiBlbWJlZGRlZCB0ZXN0cyBhcmUgZGlzYWJsZWQKKyAgKGZkLm8gIzk0MDk0LCBlcmljLmh5ZXIpCisKK0ludGVybmFsIGNoYW5nZXM6CisKK+KAoiBGaXggYWxsIC1XcG9pbnRlci1zaWduIChzaWduZWQvdW5zaWduZWQgbWlzbWF0Y2gpIHdhcm5pbmdzLCBhbmQgZW5hYmxlIHRoZQorICB3YXJuaW5nIChmZC5vICM5MzA2OTsgUmFsZiBIYWJhY2tlciwgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBXaGVuIGJ1aWxkaW5nIHdpdGggQ01ha2UsIHVzZSB0aGUgc2FtZSBnY2MvY2xhbmcgd2FybmluZ3MgYXMgdW5kZXIgQXV0b3Rvb2xzLAorICBvciBNU1ZDIHdhcm5pbmdzIHRoYXQgYXJlIGJyb2FkbHkgc2ltaWxhciAoZmQubyAjOTMwNjksIFJhbGYgSGFiYWNrZXIpCisKK+KAoiB0ZXN0L25hbWUtdGVzdDogbWFrZSBDIHRlc3RzIHByb2R1Y2UgVEFQIG91dHB1dCBhbmQgcnVuIHRoZW0gZGlyZWN0bHksIG5vdAorICB2aWEgcnVuLXRlc3Quc2ggKGZkLm8gIzkyODk5LCBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIFVuZGVyIENNYWtlIHdoZW4gY3Jvc3MtY29tcGlsaW5nIGZvciBXaW5kb3dzIG9uIFVuaXgsIHJ1biB0aGUgdGVzdHMKKyAgdW5kZXIgV2luZSBldmVuIGlmIGJpbmZtdF9taXNjIHN1cHBvcnQgaXMgbm90IGF2YWlsYWJsZQorICAoZmQubyAjODg5NjYsIFJhbGYgSGFiYWNrZXIpCisKK+KAoiBUaGUgREJVU19VU0VfVEVTVF9CSU5BUlkgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbm8gbG9uZ2VyIHVzZWQgYnkgYnVpbGRzIHdpdGgKKyAgZW1iZWRkZWQgdGVzdHM7IERCVVNfVEVTVF9EQlVTX0xBVU5DSCByZXBsYWNlcyBpdCAoZmQubyAjOTI4OTksIFNpbW9uIE1jVml0dGllKQorCivigKIgRmFjdG9yIG91dCBzb21lIGZ1bmN0aW9ucyB0aGF0IHdpbGwgYmUgbmVlZGVkIGluIGZ1dHVyZSBmb3IgYSBXaW5kb3dzCisgIGltcGxlbWVudGF0aW9uIG9mIGRidXMtcnVuLXNlc3Npb24gKGZkLm8gIzkyODk5LCBSYWxmIEhhYmFja2VyKQorCitELUJ1cyAxLjExLjAgKDIwMTUtMTItMDIpCis9PQorCitUaGUg4oCccGVwcGVybWludCBkZWVy4oCdIHJlbGVhc2UuCisKK0RlcGVuZGVuY2llczoKKwor4oCiIE9uIG5vbi1XaW5kb3dzIHBsYXRmb3JtcywgZGJ1cyBub3cgcmVxdWlyZXMgYW4gPGludHR5cGVzLmg+IHRoYXQgZGVmaW5lcworICBDOTkgY29uc3RhbnRzIHN1Y2ggYXMgUFJJZDY0IGFuZCBQUkl1NjQuCisKK0VuaGFuY2VtZW50czoKKwor4oCiIEQtQnVzIFNwZWNpZmljYXRpb24gdmVyc2lvbiAwLjI3CisgIMK3IFNwZWNpZnkgdGhhdCBzZXJ2aWNlcyBzaG91bGQgbm90IHJlcGx5IGlmIE5PX1JFUExZX0VYUEVDVEVEIHdhcyB1c2VkCisgICAgKGZkLm8gIzc1NzQ5LCBMYXJzIFVlYmVybmlja2VsKQorCivigKIgQWRkIGEgc2NyaXB0IHRvIGRvIGNvbnRpbnVvdXMtaW50ZWdyYXRpb24gYnVpbGRzLCBhbmQgbWV0YWRhdGEgdG8gcnVuIGl0CisgIG9uIHRyYXZpcy1jaS5vcmcuIFRvIHVzZSB0aGlzLCBjbG9uZSB0aGUgZGJ1cyBnaXQgcmVwb3NpdG9yeSBvbiBHaXRIdWIKKyAgYW5kIHNldCBpdCB1cCB3aXRoIHRyYXZpcy1jaS5vcmc7IHRoZSBvbmx5IHNwZWNpYWwgc2V0dGluZyBuZWVkZWQgaXMKKyAgIm9ubHkgYnVpbGQgYnJhbmNoZXMgd2l0aCBhIC50cmF2aXMueW1sIi4gKGZkLm8gIzkzMTk0LCBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIElmIGRidXMtZGFlbW9uIGlzIHJ1biB3aXRoIC0tc3lzdGVtZC1hY3RpdmF0aW9uLCBkbyBub3QgcmVxdWlyZQorICBvcmcuZnJlZWRlc2t0b3Auc3lzdGVtZDEuc2VydmljZSB0byBleGlzdCAoZmQubyAjOTMxOTQsIFNpbW9uIE1jVml0dGllKQorCitGaXhlczoKKwor4oCiIFJlLW9yZGVyIGRidXMtZGFlbW9uIHN0YXJ0dXAgc28gdGhhdCBvbiBTRUxpbnV4IHN5c3RlbXMsIHRoZSB0aHJlYWQKKyAgdGhhdCByZWFkcyBBVkMgbm90aWZpY2F0aW9ucyByZXRhaW5zIHRoZSBhYmlsaXR5IHRvIHdyaXRlIHRvIHRoZQorICBhdWRpdCBsb2cgKGZkLm8gIzkyODMyLCBMYXVyZW50IEJpZ29udmlsbGUpCisKK+KAoiBQcmludCA2NC1iaXQgaW50ZWdlcnMgb24gbm9uLUdOVSBVbml4IHBsYXRmb3JtcyAoZmQubyAjOTIwNDMsIE5hdGFuYWVsIENvcGEpCisKK+KAoiBXaGVuIHVzaW5nIHRoZSBNb25pdG9yaW5nIGludGVyZmFjZSwgbWF0Y2ggbWVzc2FnZXMnIGRlc3RpbmF0aW9ucworICAoZmQubyAjOTIwNzQsIFNpbW9uIE1jVml0dGllKQorCivigKIgT24gTGludXggd2l0aCBzeXN0ZW1kLCBzdG9wIGluc3RhbGxpbmcgYSByZWZlcmVuY2UgdG8gdGhlIG9ic29sZXRlCisgIGRidXMudGFyZ2V0LCBhbmQgZW5hYmxlIGRidXMuc29ja2V0IHN0YXRpY2FsbHkgKGZkLm8gIzc4NDEyLCAjOTI0MDI7CisgIFNpbW9uIE1jVml0dGllKQorCivigKIgT24gV2luZG93cywgd2hlbiBpbmNsdWRpbmcgY29uZmlndXJhdGlvbiBmaWxlcyB3aXRoIDxpbmNsdWRlPiBvcgorICA8aW5jbHVkZWRpcj4sIGFwcGx5IHRoZSBzYW1lIHJlbG9jYXRpb24gYXMgZm9yIHRoZSBFeGVjIHBhdGhzCisgIGluIC5zZXJ2aWNlIGZpbGVzIChmZC5vICM5MjAyOCwgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBBZGQgc3VwcG9ydCBmb3IgYmFja3RyYWNlcyBvbiBXaW5kb3dzIChmZC5vICM5MjcyMSwgUmFsZiBIYWJhY2tlcikKKwor4oCiIEZpeCBtYW55IC1XcG9pbnRlci1zaWduIHdhcm5pbmdzIChmZC5vICM5MzA2OSwgUmFsZiBIYWJhY2tlcikKKworRC1CdXMgMS4xMC42ICgyMDE1LTEyLTAxKQorPT0KKworVGhlIOKAnG1hcnppcGFuIGJlZXRsZXPigJ0gcmVsZWFzZS4KKworRml4ZXM6CisKK+KAoiBPbiBVbml4IHdoZW4gcnVubmluZyB0ZXN0cyBhcyByb290LCBkb24ndCBhc3NlcnQgdGhhdCByb290IGFuZAorICB0aGUgZGJ1cy1kYWVtb24gdXNlciBjYW4gc3RpbGwgY2FsbCBVcGRhdGVBY3RpdmF0aW9uRW52aXJvbm1lbnQ7CisgIGFzc2VydCB0aGF0IHRob3NlIHByaXZpbGVnZWQgdXNlcnMgY2FuIGNhbGwgQmVjb21lTW9uaXRvciBpbnN0ZWFkCisgIChmZC5vICM5MzAzNiwgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBPbiBXaW5kb3dzLCBmaXggYSBtZW1vcnkgbGVhayBpbiB0aGUgYXV0b2xhdW5jaCB0cmFuc3BvcnQgKGZkLm8gIzkyODk5LAorICBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIE9uIFdpbmRvd3MgQXV0b3Rvb2xzIGJ1aWxkcywgZG9uJ3QgcnVuIHRlc3RzIHRoYXQgcmVseSBvbgorICBkYnVzLXJ1bi1zZXNzaW9uIGFuZCBvdGhlciBVbml4LXNwZWNpZmljcyAoZmQubyAjOTI4OTksIFNpbW9uIE1jVml0dGllKQorCitELUJ1cyAxLjEwLjQgKDIwMTUtMTEtMTcpCis9PQorCitUaGUg4oCcRnJvc3RidXJuIENhbnlvbuKAnSByZWxlYXNlLgorCitFbmhhbmNlbWVudHM6CisKK+KAoiBHZXRDb25uZWN0aW9uQ3JlZGVudGlhbHMsIEdldENvbm5lY3Rpb25Vbml4VXNlciBhbmQKKyAgR2V0Q29ubmVjdGlvblVuaXhQcm9jZXNzSUQgd2l0aCBhcmd1bWVudCAib3JnLmZyZWVkZXNrdG9wLkRCdXMiCisgIHdpbGwgbm93IHJldHVybiBkZXRhaWxzIG9mIHRoZSBkYnVzLWRhZW1vbiBpdHNlbGYuIFRoaXMgaXMgcmVxdWlyZWQKKyAgdG8gYmUgYWJsZSB0byBjYWxsIFNldEVudmlyb25tZW50IG9uIHN5c3RlbWQuCisgIChmZC5vICM5Mjg1NywgSmFuIEFsZXhhbmRlciBTdGVmZmVucykKKworRml4ZXM6CisKK+KAoiBNYWtlIFVwZGF0ZUFjdGl2YXRpb25FbnZpcm9ubWVudCBhbHdheXMgZmFpbCB3aXRoIEFjY2Vzc0RlbmllZCBvbiB0aGUKKyAgc3lzdGVtIGJ1cy4gUHJldmlvdXNseSwgaXQgd2FzIHBvc3NpYmxlIHRvIGNvbmZpZ3VyZSBpdCBzbyByb290IGNvdWxkCisgIGNhbGwgaXQsIGJ1dCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIHdlcmUgbm90IGFjdHVhbGx5IHVzZWQsCisgIGJlY2F1c2UgdGhlIGxhdW5jaCBoZWxwZXIgd291bGQgZGlzY2FyZCB0aGVtLgorICAoZmQubyAjOTI4NTcsIEphbiBBbGV4YW5kZXIgU3RlZmZlbnMpCisKK+KAoiBPbiBVbml4IHdpdGggLS1zeXN0ZW1kLWFjdGl2YXRpb24gb24gYSB1c2VyIGJ1cywgbWFrZQorICBVcGRhdGVBY3RpdmF0aW9uRW52aXJvbm1lbnQgcGFzcyBvbiBpdHMgYXJndW1lbnRzIHRvIHN5c3RlbWQncworICBTZXRFbnZpcm9ubWVudCBtZXRob2QsIHNvbHZpbmcgaW5jb25zaXN0ZW5jeSBiZXR3ZWVuIHRoZSBlbnZpcm9ubWVudHMKKyAgdXNlZCBmb3IgdHJhZGl0aW9uYWwgYWN0aXZhdGlvbiBhbmQgc3lzdGVtZCB1c2VyLXNlcnZpY2UgYWN0aXZhdGlvbi4KKyAgKGZkLm8gIzkyODU3LCBKYW4gQWxleGFuZGVyIFN0ZWZmZW5zKQorCivigKIgT24gV2luZG93cywgZG9uJ3QgY3Jhc2ggaWYgPHN5c2xvZy8+IG9yIC0tc3lzbG9nIGlzIHVzZWQKKyAgKGZkLm8gIzkyNTM4LCBSYWxmIEhhYmFja2VyKQorCivigKIgT24gV2luZG93cywgZml4IGEgbWVtb3J5IGxlYWsgd2hlbiBzZXR0aW5nIGEgREJ1c0Vycm9yIGZyb20gYSBXaW5kb3dzCisgIGVycm9yIChmZC5vICM5MjcyMSwgUmFsZiBIYWJhY2tlcikKKwor4oCiIE9uIFdpbmRvd3MsIGRvbid0IGdvIGludG8gaW5maW5pdGUgcmVjdXJzaW9uIGlmIHdlIGFib3J0IHRoZSBwcm9jZXNzCisgIHdpdGggYmFja3RyYWNlcyBlbmFibGVkIChmZC5vICM5MjcyMSwgUmFsZiBIYWJhY2tlcikKKwor4oCiIEZpeCB2YXJpb3VzIGZhaWxpbmcgdGVzdHMsIHZhcmlvdXNseSBvbiBXaW5kb3dzIGFuZCBjcm9zcy1wbGF0Zm9ybToKKyAgwrcgZG9uJ3QgdGVzdCBzeXN0ZW0uY29uZiBmZWF0dXJlcyAodXNlcnMsIGdyb3VwcykgdGhhdCBvbmx5IG1ha2Ugc2Vuc2UKKyAgICBvbiB0aGUgc3lzdGVtIGJ1cywgd2hpY2ggaXMgbm90IHN1cHBvcnRlZCBvbiBXaW5kb3dzCisgIMK3IGRvbid0IGNhbGwgX2RidXNfd2FybigpIHdoZW4gd2Ugc2tpcCBhIHRlc3QsIHNpbmNlIGl0IGlzIGZhdGFsCisgIMK3IGZpeCBjb21wdXRhdGlvbiBvZiBleHBlY3RlZCA8c3RhbmRhcmRfc2Vzc2lvbl9zZXJ2aWNlZGlycy8+CisgIMK3IHdoZW4gcnVubmluZyBUQVAgdGVzdHMsIHRyYW5zbGF0ZSBuZXdsaW5lcyB0byBVbml4IGZvcm1hdCwgZml4aW5nCisgICAgY3Jvc3MtY29tcGlsZWQgdGVzdHMgdW5kZXIgV2luZSBvbiBMaW51eAorICDCtyBkb24ndCBzdHJlc3MtdGVzdCByZWZjb3VudGluZyB1bmRlciBXaW5lLCB3aGVyZSBpdCdzIHJlYWxseSBzbG93CisgIMK3IHN0b3AgYXNzdW1pbmcgdGhhdCBhIG1lc3NhZ2UgbG9vcGVkLWJhY2sgdG8gdGhlIHRlc3Qgd2lsbCBiZSByZWNlaXZlZAorICAgIGltbWVkaWF0ZWx5CisgIMK3IHNraXAgc29tZSBzeXN0ZW0gYnVzIHRlc3RzIG9uIFdpbmRvd3Mgc2luY2UgdGhleSBtYWtlIG5vIHNlbnNlIHRoZXJlCisgIChmZC5vICM5MjUzOCwgZmQubyAjOTI3MjE7IFJhbGYgSGFiYWNrZXIsIFNpbW9uIE1jVml0dGllKQorCitELUJ1cyAxLjEwLjIgKDIwMTUtMTAtMjYpCis9PQorCitUaGUg4oCcd29yc3QgcGllcyBpbiBMb25kb27igJ0gcmVsZWFzZS4KKworRml4ZXM6CisKK+KAoiBDb3JyZWN0IGVycm9yIGhhbmRsaW5nIGZvciBhY3RpdmF0aW9uOiBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgYXR0ZW1wdHMKKyAgdG8gYWN0aXZhdGUgdGhlIHNhbWUgc2VydmljZSBhbmQgaXQgZmFpbHMgaW1tZWRpYXRlbHksIHRoZSBmaXJzdCBhdHRlbXB0CisgIHdvdWxkIGdldCB0aGUgY29ycmVjdCByZXBseSwgYnV0IHRoZSByZXN0IHdvdWxkIHRpbWUgb3V0LiBXZSBub3cgc2VuZAorICB0aGUgc2FtZSBlcnJvciByZXBseSB0byBlYWNoIGF0dGVtcHQuIChmZC5vICM5MjIwMCwgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBJZiBCZWNvbWVNb25pdG9yIGlzIGNhbGxlZCB3aXRoIGEgc3ludGFjdGljYWxseSBpbnZhbGlkIG1hdGNoIHJ1bGUsCisgIGRvbid0IGNyYXNoIHdpdGggYW4gYXNzZXJ0aW9uIGZhaWx1cmUsIGZpeGluZyBhIHJlZ3Jlc3Npb24gaW4gMS45LjEwLgorICBUaGlzIHdhcyBub3QgZXhwbG9pdGFibGUgYXMgYSBkZW5pYWwgb2Ygc2VydmljZSwgYmVjYXVzZSB0aGUgY2hlY2sKKyAgZm9yIGEgcHJpdmlsZWdlZCB1c2VyIGlzIGRvbmUgZmlyc3QuIChmZC5vICM5MjI5OCwgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBPbiBMaW51eCB3aXRoIC0tZW5hYmxlLXVzZXItc2Vzc2lvbiwgYWRkIHRoZSBidXMgYWRkcmVzcyB0byB0aGUKKyAgZW52aXJvbm1lbnQgb2Ygc3lzdGVtZCBzZXJ2aWNlcyBmb3IgYmV0dGVyIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CisgIChmZC5vICM5MjYxMiwgSmFuIEFsZXhhbmRlciBTdGVmZmVucykKKwor4oCiIE9uIFdpbmRvd3MsIGZpeCB0aGUgbG9naWMgZm9yIHJlcGxhY2luZyB0aGUgaW5zdGFsbGF0aW9uIHByZWZpeAorICBpbiBzZXJ2aWNlIGZpbGVzJyBFeGVjIGxpbmVzIChmZC5vICM4MzUzOTsgTWlsYW4gQ3JoYSwgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBPbiBXaW5kb3dzLCBpZiBpbnN0YWxsZWQgaW4gdGhlIGNvbnZlbnRpb25hbCBsYXlvdXQgd2l0aCAke3ByZWZpeH0vZXRjCisgIGFuZCAke3ByZWZpeH0vc2hhcmUsIHVzZSByZWxhdGl2ZSBwYXRocyBiZXR3ZWVuIGJ1cyBjb25maWd1cmF0aW9uIGZpbGVzCisgIHRvIGFsbG93IHRoZSB0cmVlIHRvIGJlIHJlbG9jYXRlZCAoZmQubyAjOTIwMjgsIFNpbW9uIE1jVml0dGllKQorCivigKIgTWFrZSBtb3JlIG9mIHRoZSByZWdyZXNzaW9uIHRlc3RzIHBhc3MgaW4gV2luZG93cyBidWlsZHMgKGZkLm8gIzkyNTM4LAorICBTaW1vbiBNY1ZpdHRpZSkKKworRC1CdXMgMS4xMC4wICgyMDE1LTA4LTI1KQorPT0KKworVGhlIOKAnDB4MjDigJ0gcmVsZWFzZS4KKworVGhpcyBpcyBhIG5ldyBzdGFibGUgYnJhbmNoLCByZWNvbW1lbmRlZCBmb3IgdXNlIGluIE9TIGRpc3RyaWJ1dGlvbnMuCisKK0ZpeGVzIHNpbmNlIDEuOS4yMDoKKwor4oCiIGRpc3RyaWJ1dGUgdGVzdC90YXAtdGVzdC5zaC5pbiwgZXZlbiBpZiB0aGUgdGFyYmFsbCB3YXMgYnVpbHQgd2l0aG91dAorICB0ZXN0cyBlbmFibGVkIChmZC5vICM5MTY4NCwgU2ltb24gTWNWaXR0aWUpCivigKIgd29yayBhcm91bmQgYSBmZCBsZWFrIGluIGxpYmNhcC1uZyA8IDAuNy43IChmZC5vICM5MTY4NCwgU2ltb24gTWNWaXR0aWUpCisKK1N1bW1hcnkgb2YgbWFqb3IgY2hhbmdlcyBzaW5jZSAxLjguMDoKKwor4oCiIFRoZSBiYXNpYyBzZXR1cCBmb3IgdGhlIHdlbGwta25vd24gc3lzdGVtIGFuZCBzZXNzaW9uIGJ1c2VzIGlzCisgIG5vdyBkb25lIGluIHJlYWQtb25seSBmaWxlcyBpbiAke2RhdGFkaXJ9IChub3JtYWxseSAvdXNyL3NoYXJlKS4KKyAgU2VlIHRoZSBORVdTIGVudHJ5IGZvciAxLjkuMTggZm9yIGRldGFpbHMuCisKK+KAoiBBcHBBcm1vciBpbnRlZ3JhdGlvbiBoYXMgYmVlbiBtZXJnZWQsIHdpdGggZmVhdHVyZXMgc2ltaWxhciB0byB0aGUKKyAgcHJlLWV4aXN0aW5nIFNFTGludXggaW50ZWdyYXRpb24uIEl0IGlzIG1vc3RseSBjb21wYXRpYmxlIHdpdGggdGhlCisgIHBhdGNoZXMgcHJldmlvdXNseSBzaGlwcGVkIGJ5IFVidW50dSwgd2l0aCBvbmUgc2lnbmlmaWNhbnQgY2hhbmdlOgorICBVYnVudHUncyBHZXRDb25uZWN0aW9uQXBwQXJtb3JTZWN1cml0eUNvbnRleHQgbWV0aG9kIGhhcyBiZWVuIHN1cGVyc2VkZWQKKyAgYnkgR2V0Q29ubmVjdGlvbkNyZWRlbnRpYWxzIGFuZCB3YXMgbm90IGluY2x1ZGVkLgorCivigKIgVGhlIC0tZW5hYmxlLXVzZXItc2Vzc2lvbiBjb25maWd1cmUgb3B0aW9uIGNhbiBiZSBlbmFibGVkCisgIGJ5IE9TIGludGVncmF0b3JzIGludGVuZGluZyB0byB1c2Ugc3lzdGVtZCB0byBwcm92aWRlIGEgc2Vzc2lvbiBidXMKKyAgcGVyIHVzZXIgKGluIGVmZmVjdCwgdHJlYXRpbmcgYWxsIGNvbmN1cnJlbnQgZ3JhcGhpY2FsIGFuZCBub24tZ3JhcGhpY2FsCisgIGxvZ2luIHNlc3Npb25zIGFzIG9uZSBsYXJnZSBzZXNzaW9uKS4KKwor4oCiIFRoZSBuZXcgbGlzdGVuYWJsZSBhZGRyZXNzIG1vZGUgInVuaXg6cnVudGltZT15ZXMiIGxpc3RlbnMgb24KKyAgJFhER19SVU5USU1FX0RJUi9idXMsIHRoZSBzYW1lIEFGX1VOSVggc29ja2V0IHVzZWQgYnkgdGhlIHN5c3RlbWQKKyAgdXNlciBzZXNzaW9uLiBsaWJkYnVzIGFuZCAiZGJ1cy1sYXVuY2ggLS1hdXRvbGF1bmNoIiB3aWxsIGNvbm5lY3QgdG8KKyAgdGhpcyBhZGRyZXNzIGJ5IGRlZmF1bHQuIEdMaWIg4omlIDIuNDUuMyBhbmQgc2QtYnVzIOKJpSAyMDkgaGF2ZSBhCisgIG1hdGNoaW5nIGRlZmF1bHQuCisKK+KAoiBBbGwgZXhlY3V0YWJsZXMgYXJlIG5vdyBkeW5hbWljYWxseSBsaW5rZWQgdG8gbGliZGJ1cy0xLgorICBQcmV2aW91c2x5LCBzb21lIGV4ZWN1dGFibGVzLCBtb3N0IG5vdGFibHkgZGJ1cy1kYWVtb24sIHdlcmUgc3RhdGljYWxseQorICBsaW5rZWQgdG8gYSBzcGVjaWFsbHktY29tcGlsZWQgdmFyaWFudCBvZiBsaWJkYnVzLiBUaGlzIHJlc3VsdHMgaW4KKyAgdmFyaW91cyBwcml2YXRlIGZ1bmN0aW9ucyBpbiB0aGUgX2RidXMgbmFtZXNwYWNlIGJlaW5nIGV4cG9zZWQgYnkgdGhlCisgIHNoYXJlZCBsaWJyYXJ5LiBUaGVzZSBhcmUgbm90IEFQSSwgYW5kIG11c3Qgbm90IGJlIHVzZWQgb3V0c2lkZQorICB0aGUgZGJ1cyBzb3VyY2UgdHJlZS4KKwor4oCiIE9uIHBsYXRmb3JtcyB3aXRoIEVMRiBzeW1ib2wgdmVyc2lvbmluZywgYWxsIHB1YmxpYyBzeW1ib2xzCisgIGFyZSB2ZXJzaW9uZWQgTElCREJVU18xXzMuCisKK05ldyBidXMgQVBJczoKKwor4oCiIG9yZy5mcmVlZGVza3RvcC5EQnVzLkdldENvbm5lY3Rpb25DcmVkZW50aWFscyByZXR1cm5zCisgIExpbnV4U2VjdXJpdHlMYWJlbCB3aGVyZSBzdXBwb3J0ZWQKK+KAoiBvcmcuZnJlZWRlc2t0b3AuREJ1cy5Nb25pdG9yaW5nIGludGVyZmFjZSAocHJpdmlsZWdlZCkKKyAgwrcgQmVjb21lTW9uaXRvciBtZXRob2Qgc3VwZXJzZWRlcyBtYXRjaCBydWxlcyB3aXRoIGVhdmVzZHJvcD10cnVlLAorICAgIHdoaWNoIGFyZSBub3cgZGVwcmVjYXRlZAor4oCiIG9yZy5mcmVlZGVza3RvcC5EQnVzLlN0YXRzIGludGVyZmFjZSAoc2VtaS1wcml2aWxlZ2VkKQorICDCtyBub3cgZW5hYmxlZCBieSBkZWZhdWx0CisgIMK3IG5ldyBHZXRBbGxNYXRjaFJ1bGVzIG1ldGhvZAor4oCiIG9yZy5mcmVlZGVza3RvcC5EQnVzLlZlcmJvc2UgaW50ZXJmYWNlIChub3Qgbm9ybWFsbHkgY29tcGlsZWQpCisgIMK3IHRvZ2dsZXMgdGhlIGVmZmVjdCBvZiBEQlVTX1ZFUkJPU0UKKworTmV3IGV4ZWN1dGFibGVzOgorCivigKIgZGJ1cy10ZXN0LXRvb2wKK+KAoiBkYnVzLXVwZGF0ZS1hY3RpdmF0aW9uLWVudmlyb25tZW50CisKK05ldyBvcHRpb25hbCBkZXBlbmRlbmNpZXM6CisKK+KAoiBUaGUgc3lzdGVtZDogcHNldWRvLXRyYW5zcG9ydCByZXF1aXJlcyBsaWJzeXN0ZW1kIG9yIGxpYnNkLWRhZW1vbgor4oCiIENvbXBsZXRlIGRvY3VtZW50YXRpb24gcmVxdWlyZXMgRHVja3R5cGUgYW5kIHllbHAtdG9vbHMKK+KAoiBGdWxsIHRlc3QgY292ZXJhZ2UgcmVxdWlyZXMgR0xpYiAyLjM2IGFuZCBQeUdJCivigKIgQXBwQXJtb3IgaW50ZWdyYXRpb24gcmVxdWlyZXMgbGliYXBwYXJtb3IgYW5kIG9wdGlvbmFsbHkgbGliYXVkaXQKKworRGVwZW5kZW5jaWVzIHJlbW92ZWQ6CisKK+KAoiBkYnVzLWdsaWIKKworRC1CdXMgMS45LjIwICgyMDE1LTA4LTA2KQorPT0KKworVGhlIOKAnFJlbWVtYmVyIFRvbW9ycm934oCdIHJlbGVhc2UuCisKK1RoaXMgaXMgYSByZWxlYXNlLWNhbmRpZGF0ZSBmb3IgRC1CdXMgMS4xMC4wLiBPUyBkaXN0cmlidXRpb24gdmVuZG9ycworc2hvdWxkIHRlc3QgaXQuCisKK0ZpeGVzOgorCivigKIgRG9uJ3Qgc2Vjb25kLWd1ZXNzIHdoYXQgdGhlIEFCSSBvZiBwb2xsKCkgaXMsIGFsbG93aW5nIGl0IHRvIGJlIHVzZWQKKyAgb24gSW50ZWdyaXR5IFJUT1MgYW5kIG90aGVyIHVudXN1YWwgcGxhdGZvcm1zIChmZC5vICM5MDMxNDsKKyAgUm9sbGFuZCBEdWRlbWFpbmUsIFNpbW9uIE1jVml0dGllKQorCivigKIgRG9uJ3QgZHVwbGljYXRlIGF1ZGl0IHN1YnN5c3RlbSBpbnRlZ3JhdGlvbiBpZiBBcHBBcm1vciBhbmQgU0VMaW51eCBhcmUKKyAgYm90aCBlbmFibGVkIChmZC5vICM4OTIyNSwgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBMb2cgYXVkaXQgZXZlbnRzIGZvciBBcHBBcm1vci9TRUxpbnV4IHBvbGljeSB2aW9sYXRpb25zIHdoZW5ldmVyCisgIHdlIGhhdmUgQ0FQX0FVRElUX1dSSVRFLCBldmVuIGlmIG5vdCB0aGUgc3lzdGVtIGJ1cworICAoZmQubyAjODM4NTYsIExhdXJlbnQgQmlnb252aWxsZSkKKworRC1CdXMgMS45LjE4ICgyMDE1LTA3LTIxKQorPT0KKworVGhlIOKAnFBpcmF0ZSBFbGl0ZeKAnSByZWxlYXNlLgorCitDb25maWd1cmF0aW9uIGNoYW5nZXM6CisKK+KAoiBUaGUgYmFzaWMgc2V0dXAgZm9yIHRoZSB3ZWxsLWtub3duIHN5c3RlbSBhbmQgc2Vzc2lvbiBidXNlcyBpcyBub3cgZG9uZQorICBpbiByZWFkLW9ubHkgZmlsZXMgaW4gJHtkYXRhZGlyfSwgbW92aW5nIGEgc3RlcCBjbG9zZXIgdG8gc3lzdGVtcworICB0aGF0IGNhbiBvcGVyYXRlIHdpdGggYW4gZW1wdHkgL2V0YyBkaXJlY3RvcnkuIEluIGluY3JlYXNpbmcgb3JkZXIKKyAgb2YgcHJlY2VkZW5jZToKKworICDCtyAke2RhdGFkaXJ9L2RidXMtMS9zKi5jb25mIG5vdyBwZXJmb3JtIHRoZSBiYXNpYyBzZXR1cCBzdWNoIGFzIHNldHRpbmcKKyAgICB0aGUgZGVmYXVsdCBtZXNzYWdlIHBvbGljaWVzLgorICDCtyAke3N5c2NvbmZkaXJ9L2RidXMtMS9zKi5jb25mIGFyZSBub3cgb3B0aW9uYWwuIEJ5IGRlZmF1bHQKKyAgICBkYnVzIHN0aWxsIGluc3RhbGxzIGEgdHJpdmlhbCB2ZXJzaW9uIG9mIGVhY2gsIGZvciBkb2N1bWVudGF0aW9uCisgICAgcHVycG9zZXM7IHB1dHRpbmcgY29uZmlndXJhdGlvbiBkaXJlY3RpdmVzIGluIHRoZXNlIGZpbGVzIGlzIGRlcHJlY2F0ZWQuCisgIMK3ICR7ZGF0YWRpcn0vZGJ1cy0xL3MqLmQvIGFyZSBub3cgYXZhaWxhYmxlIGZvciB0aGlyZC1wYXJ0eSBzb2Z0d2FyZQorICAgIHRvIGluc3RhbGwgImRyb3AtaW4iIGNvbmZpZ3VyYXRpb24gc25pcHBldHMgKGFueSBwYWNrYWdlcworICAgIHVzaW5nIHRob3NlIGRpcmVjdG9yaWVzIHNob3VsZCBleHBsaWNpdGx5IGRlcGVuZCBvbiBhdCBsZWFzdCB0aGlzCisgICAgdmVyc2lvbiBvZiBkYnVzKS4KKyAgwrcgJHtzeXNjb25mZGlyfS9kYnVzLTEvcyouZC8gYXJlIGFsc28gc3RpbGwgYXZhaWxhYmxlIGZvciBzeXNhZG1pbnMKKyAgICBvciB0aGlyZC1wYXJ0eSBzb2Z0d2FyZSB0byBpbnN0YWxsICJkcm9wLWluIiBjb25maWd1cmF0aW9uIHNuaXBwZXRzCisgIMK3ICR7c3lzY29uZmRpcn0vZGJ1cy0xL3MqLWxvY2FsLmNvbmYgYXJlIHN0aWxsIGF2YWlsYWJsZSBmb3Igc3lzYWRtaW5zJworICAgIG92ZXJyaWRlcworCisgICR7ZGF0YWRpcn0gaXMgbm9ybWFsbHkgL3Vzci9zaGFyZSwgJHtzeXNjb25mZGlyfSBpcyBub3JtYWxseSAvZXRjLAorICBhbmQgInMqIiByZWZlcnMgdG8gZWl0aGVyIHN5c3RlbSBvciBzZXNzaW9uIGFzIGFwcHJvcHJpYXRlLgorCisgIChmZC5vICM4OTI4MCwgRGltaXRyaSBKb2huIExlZGtvdikKKworRml4ZXM6CisKK+KAoiBGaXggYSBtZW1vcnkgbGVhayB3aGVuIEdldENvbm5lY3Rpb25DcmVkZW50aWFscygpIHN1Y2NlZWRzCisgIChmZC5vICM5MTAwOCwgSmFjZWsgQnVrYXJld2ljeikKKwor4oCiIEVuc3VyZSB0aGF0IGRidXMtbW9uaXRvciBkb2VzIG5vdCByZXBseSB0byBtZXNzYWdlcyBpbnRlbmRlZCBmb3Igb3RoZXJzLAorICByZXN1bHRpbmcgaW4gaXRzIG93biBkaXNjb25uZWN0aW9uIChmZC5vICM5MDk1MiwgU2ltb24gTWNWaXR0aWUpCisKK0QtQnVzIDEuOS4xNiAoMjAxNS0wNS0xNCkKKz09CisKK1RoZSDigJx0aXRhbml1bSBiYXJuc+KAnSByZWxlYXNlLgorCitEZXBlbmRlbmNpZXM6CisKK+KAoiBBdXRvbWFrZSAxLjEzIGlzIG5vdyByZXF1aXJlZCB3aGVuIGNvbXBpbGluZyBmcm9tIGdpdCBvciBtb2RpZnlpbmcKKyAgdGhlIGJ1aWxkIHN5c3RlbS4KKworU2VjdXJpdHkgaGFyZGVuaW5nOgorCivigKIgT24gVW5peCBwbGF0Zm9ybXMsIGNoYW5nZSB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIGZvciB0aGUgc2Vzc2lvbiBidXMKKyAgdG8gb25seSBhbGxvdyBFWFRFUk5BTCBhdXRoZW50aWNhdGlvbiAoc2VjdXJlIGtlcm5lbC1tZWRpYXRlZAorICBjcmVkZW50aWFscy1wYXNzaW5nKSwgYXMgd2FzIGFscmVhZHkgZG9uZSBmb3IgdGhlIHN5c3RlbSBidXMuCisKKyAgVGhpcyBhdm9pZHMgZmFsbGluZyBiYWNrIHRvIERCVVNfQ09PS0lFX1NIQTEsIHdoaWNoIHJlbGllcyBvbiBzdHJvbmdseQorICB1bnByZWRpY3RhYmxlIHBzZXVkby1yYW5kb20gbnVtYmVycy4KKworICBJZiB5b3UgYXJlIHVzaW5nIEQtQnVzIG92ZXIgdGhlICh1bmVuY3J5cHRlZCEpIHRjcDogb3Igbm9uY2UtdGNwOiB0cmFuc3BvcnQsCisgIGluIGNvbmp1bmN0aW9uIHdpdGggREJVU19DT09LSUVfU0hBMSBhbmQgYSBzaGFyZWQgaG9tZSBkaXJlY3RvcnkgdXNpbmcKKyAgTkZTIG9yIHNpbWlsYXIsIHlvdSB3aWxsIG5lZWQgdG8gcmVjb25maWd1cmUgdGhlIHNlc3Npb24gYnVzIHRvIGFjY2VwdAorICBEQlVTX0NPT0tJRV9TSEExIGJ5IGNvbW1lbnRpbmcgb3V0IHRoZSA8YXV0aD4gZWxlbWVudC4gVGhpcyBjb25maWd1cmF0aW9uCisgIGlzIG5vdCByZWNvbW1lbmRlZC4KKworICAoZmQubyAjOTA0MTQsIFNpbW9uIE1jVml0dGllKQorCivigKIgV2hlbiBhc2tlZCBmb3IgcmFuZG9tIG51bWJlcnMgZm9yIERCVVNfQ09PS0lFX1NIQTEsIHRoZSBub25jZS10Y3A6CisgIHRyYW5zcG9ydCwgVVVJRHMgb3IgYW55IG90aGVyIHJlYXNvbiwgZmFpbCBpZiB3ZSBjYW5ub3Qgb2J0YWluIGVudHJvcHkKKyAgKGZyb20gL2Rldi91cmFuZG9tIG9yIENyeXB0R2VuUmFuZG9tKCkpIG9yIGFuIG91dC1vZi1tZW1vcnkgY29uZGl0aW9uCisgIG9jY3VycywgaW5zdGVhZCBvZiBzaWxlbnRseSBmYWxsaW5nIGJhY2sgdG8gbG93LWVudHJvcHkgcHNldWRvcmFuZG9tCisgIG51bWJlcnMgZnJvbSByYW5kKCkuIChmZC5vICM5MDQxNDsgU2ltb24gTWNWaXR0aWUsIFJhbGYgSGFiYWNrZXIpCisKK0VuaGFuY2VtZW50czoKKwor4oCiIEFkZCBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfZWxlbWVudF9jb3VudCgpCisgIChmZC5vICMzMDM1MDsgQ2hyaXN0aWFuIER5d2FuLCBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIEludHJvZHVjZSBuZXcgaW50ZXJuYWwgREJ1c1NvY2tldCBhbmQgREJ1c1BvbGxhYmxlIHR5cGVzIHNvIHdlIGNhbgorICBzdG9wIHRyZWF0aW5nIHRoZSBXaW5kb3dzIFNPQ0tFVCB0eXBlIGFzIGlmIGl0IHdhcyBpbnQuIERCdXNTb2NrZXQKKyAgaXMgc3BlY2lmaWNhbGx5IGEgc29ja2V0LCBjcm9zcy1wbGF0Zm9ybS4gREJ1c1BvbGxhYmxlIGlzIHdoYXRldmVyCisgIF9kYnVzX3BvbGwoKSBjYW4gYWN0IG9uLCBpLmUuIGEgZmQgb24gVW5peCBvciBhIFNPQ0tFVCBvbiBXaW5kb3dzLgorICAoZmQubyAjODk0NDQ7IFJhbGYgSGFiYWNrZXIsIFNpbW9uIE1jVml0dGllKQorCivigKIgQWxsIHJlZ3Jlc3Npb24gdGVzdHMgbm93IG91dHB1dCBUQVAgPGh0dHBzOi8vdGVzdGFueXRoaW5nLm9yZy8+CisgIChmZC5vICM4OTg0NiwgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBJbnRlcm5hbCBBUElzIGNvbnNpc3RlbnRseSB1c2Ugc2lnbmVkIHZhbHVlcyBmb3IgdGltZXN0YW1wcworICAoZmQubyAjMTg0OTQsIFBldGVyIE1jQ3VyZHkpCisKK+KAoiBJbXByb3ZlIGRpYWdub3N0aWNzIHdoZW4gVXBkYXRlQWN0aXZhdGlvbkVudmlyb25tZW50IGNhbGxzIGFyZSByZWplY3RlZAorICAoZmQubyAjODg4MTIsIFNpbW9uIE1jVml0dGllKQorCivigKIgQ2xlYW4gdXAgYSBsb3Qgb2YgY29tcGlsZXIgd2FybmluZ3MKKyAgKGZkLm8gIzE3Mjg5LCBmZC5vICM4OTI4NDsgUmFsZiBIYWJhY2tlciwgU2ltb24gTWNWaXR0aWUpCisKK0ZpeGVzOgorCivigKIgQWRkIGxvY2tpbmcgdG8gREJ1c0NvdW50ZXIncyByZWZlcmVuY2UgY291bnQgYW5kIG5vdGlmeSBmdW5jdGlvbgorICAoZmQubyAjODkyOTcsIEFkcmlhbiBTenluZGVsYSkKKwor4oCiIEVuc3VyZSB0aGF0IERCdXNUcmFuc3BvcnQncyByZWZlcmVuY2UgY291bnQgaXMgcHJvdGVjdGVkIGJ5IHRoZQorICBjb3JyZXNwb25kaW5nIERCdXNDb25uZWN0aW9uJ3MgbG9jayAoZmQubyAjOTAzMTIsIEFkcmlhbiBTenluZGVsYSkKKwor4oCiIENvcnJlY3RseSByZWxlYXNlIERCdXNTZXJ2ZXIgbXV0ZXggYmVmb3JlIGVhcmx5LXJldHVybiBpZiB3ZSBydW4gb3V0CisgIG9mIG1lbW9yeSB3aGlsZSBjb3B5aW5nIGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbXMgKGZkLm8gIzkwMDIxLAorICBSYWxmIEhhYmFja2VyKQorCivigKIgTWFrZSBkYnVzLXRlc3QtdG9vbCBhbmQgZGJ1cy11cGRhdGUtYWN0aXZhdGlvbi1lbnZpcm9ubWVudCBwb3J0YWJsZQorICB0byBXaW5kb3dzIChmZC5vICM5MDA4OSwgUmFsZiBIYWJhY2tlcikKKwor4oCiIENvcnJlY3RseSBpbml0aWFsaXplIGFsbCBmaWVsZHMgb2YgREJ1c1R5cGVSZWFkZXIgKGZkLm8gIzkwMDIxOworICBSYWxmIEhhYmFja2VyLCBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIEZpeCBzb21lIG1pc3NpbmcgXG4gaW4gdmVyYm9zZSAoZGVidWcgbG9nKSBtZXNzYWdlcyAoZmQubyAjOTAwMDQsCisgIFJhbGYgSGFiYWNrZXIpCisKK+KAoiBDbGVhbiB1cCBzb21lIG1lbW9yeSBhbmQgZmQgbGVha3MgaW4gdGVzdCBjb2RlIGFuZCB0b29scworICAoZmQubyAjOTAwMjEsIFJhbGYgSGFiYWNrZXIpCisKK+KAoiBGaXggYSBOVUxMIGRlcmVmZXJlbmNlIGlmIHRoZSBkYnVzLWRhZW1vbiBjYW5ub3QgcmVhZCBhIGNvbmZpZ3VyYXRpb24KKyAgZGlyZWN0b3J5IGZvciBhIHJlYXNvbiB0aGF0IGlzIG5vdCBFTk9FTlQgKGZkLm8gIzkwMDIxLCBSYWxmIEhhYmFja2VyKQorCivigKIgQ01ha2UgZ2VuZXJhdGVzIGEgdmVyc2lvbmVkIHNoYXJlZCBsaWJyYXJ5IGV2ZW4gaWYgdGhlIHJldmlzaW9uIGlzIDAsCisgIGFzIGl0IHVzdWFsbHkgaXMgb24gdGhlIGRldmVsb3BtZW50IGJyYW5jaC4gKGZkLm8gIzg5NDUwLCBSYWxmIEhhYmFja2VyKQorCitELUJ1cyAxLjkuMTQgKDIwMTUtMDMtMDIpCis9PQorCitUaGUg4oCcZG9uJ3Qgc3RhbmQgaW4gdGhlIHBvaXNvbiBjbG91ZOKAnSByZWxlYXNlLgorCitEZXBlbmRlbmNpZXM6CisKK+KAoiBkYnVzLWRhZW1vbiBhbmQgZGJ1cy1kYWVtb24tbGF1bmNoLWhlbHBlciBub3cgcmVxdWlyZSBsaWJkYnVzLiBUaGV5CisgIHdlcmUgcHJldmlvdXNseSBsaW5rZWQgdG8gYSBzdGF0aWMgdmVyc2lvbiBvZiBsaWJkYnVzLgorCivigKIgVGhlIHRlc3RzIG5vIGxvbmdlciByZXF1aXJlIGRidXMtZ2xpYiBpbiBvcmRlciB0byBleGVyY2lzZSB0aGUgbGliZGJ1cworICBzaGFyZWQgbGlicmFyeTsgdGhleSBhcmUgYWx3YXlzIGxpbmtlZCB0byBsaWJkYnVzIG5vdy4KKworQnVpbGQtdGltZSBjb25maWd1cmF0aW9uOgorCivigKIgVGhlIG5ldyAtLWVuYWJsZS11c2VyLXNlc3Npb24gb3B0aW9uLCBvZmYgYnkgZGVmYXVsdCwgY2FuIGJlIGVuYWJsZWQKKyAgYnkgT1MgaW50ZWdyYXRvcnMgaW50ZW5kaW5nIHRvIHVzZSBzeXN0ZW1kIHRvIHByb3ZpZGUgYSBzZXNzaW9uIGJ1cworICBwZXIgdXNlciAoaW4gZWZmZWN0LCB0cmVhdGluZyBhbGwgY29uY3VycmVudCBncmFwaGljYWwgYW5kIG5vbi1ncmFwaGljYWwKKyAgbG9naW4gc2Vzc2lvbnMgYXMgb25lIGxhcmdlIHNlc3Npb24pCisKK0VuaGFuY2VtZW50czoKKwor4oCiIEFsbCBleGVjdXRhYmxlcyBhcmUgbm93IGxpbmtlZCBkeW5hbWljYWxseSB0byBsaWJkYnVzLgorICAoZmQubyAjODMxMTU7IEJlcnRyYW5kIFNJTU9OTkVULCBTaW1vbiBNY1ZpdHRpZSwgUmFsZiBIYWJhY2tlcikKKwor4oCiIE9uIHBsYXRmb3JtcyB0aGF0IHN1cHBvcnQgdGhlbSAoR05VIGxpYmMgYW5kIHBvc3NpYmx5IG90aGVycyksCisgIGxpYmRidXMgbm93IGhhcyB2ZXJzaW9uZWQgc3ltYm9scyBmb3IgaXRzIHB1YmxpYyBBUEkuCisgIEFsbCBwdWJsaWMgc3ltYm9scyAodmlzaWJsZSBpbiB0aGUgaGVhZGVyIGZpbGVzKSBhcmUgY3VycmVudGx5CisgIHZlcnNpb25lZCBhcyBMSUJEQlVTXzFfMzsgcHJpdmF0ZSBzeW1ib2xzIHN0YXJ0aW5nIHdpdGggX2RidXMgb3IKKyAgZGJ1c19pbnRlcm5hbCBoYXZlIGEgdmVyc2lvbiB0aGF0IGNoYW5nZXMgd2l0aCBlYWNoIHJlbGVhc2UsIGFuZAorICBtdXN0IG5vdCBiZSB1c2VkIGJ5IGFwcGxpY2F0aW9ucy4gKGFsc28gZmQubyAjODMxMTUpCisKK+KAoiBOZXcgbGlzdGVuYWJsZSBhZGRyZXNzIG1vZGUgInVuaXg6cnVudGltZT15ZXMiIHdoaWNoIGxpc3RlbnMgb24KKyAgYSByZWFsIGZpbGVzeXN0ZW0gKG5vbi1hYnN0cmFjdCkgc29ja2V0ICRYREdfUlVOVElNRV9ESVIvYnVzCisgIChmZC5vICM2MTMwMzsgQ29saW4gV2FsdGVycywgQWxleGFuZGVyIExhcnNzb24sIFNpbW9uIE1jVml0dGllKQorCivigKIgQWRkIG9wdGlvbmFsIHN5c3RlbWQgdW5pdHMgZm9yIGEgcGVyLXVzZXIgYnVzIGxpc3RlbmluZyBvbgorICAkWERHX1JVTlRJTUVfRElSL2J1cyAoZmQubyAjNjEzMDE7IFNpbW9uIE1jVml0dGllLCBDb2xpbiBXYWx0ZXJzKQorCivigKIgT24gVW5peCBwbGF0Zm9ybXMsIGJvdGggbGliZGJ1cyBhbmQgImRidXMtbGF1bmNoIC0tYXV0b2xhdW5jaCIKKyAgZGVmYXVsdCB0byBjb25uZWN0aW5nIHRvICRYREdfUlVOVElNRV9ESVIvYnVzIGlmIGl0IGlzIGEgc29ja2V0CisgIChhbHNvIGZkLm8gIzYxMzAxKQorCivigKIgTmV3IGRidXMtdXBkYXRlLWFjdGl2YXRpb24tZW52aXJvbm1lbnQgdG9vbCB1cGxvYWRzIGVudmlyb25tZW50CisgIHZhcmlhYmxlcyB0byAiZGJ1cy1kYWVtb24gLS1zZXNzaW9uIiBhbmQgb3B0aW9uYWxseSAic3lzdGVtZCAtLXVzZXIiLAorICBwcmltYXJpbHkgYXMgYSB3YXkgdG8ga2VlcCB0aGUgcGVyLXVzZXIgYnVzIGNvbXBhdGlibGUgd2l0aAorICBkaXN0cmlidXRpb25zJyBleGlzdGluZyBYMTEgbG9naW4gc2NyaXB0cyAoYWxzbyBmZC5vICM2MTMwMSkKKwor4oCiIDxpbmNsdWRlZGlyLz4gZWxlbWVudHMgaW4gZGJ1cy1kYWVtb24gY29uZmlndXJhdGlvbiBhcmUgbm93IHNpbGVudGx5CisgIGlnbm9yZWQgaWYgdGhlIGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdC4gKGZkLm8gIzg5MjgwLCBEaW1pdHJpIEpvaG4gTGVka292KQorCivigKIgQWRkIG1pY3Jvc2Vjb25kLXJlc29sdXRpb24gdGltZXN0YW1wcyB0byB0aGUgZGVmYXVsdCBvdXRwdXQgb2YKKyAgZGJ1cy1tb25pdG9yIGFuZCBkYnVzLXNlbmQgKGZkLm8gIzg4ODk2OyBSYWxmIEhhYmFja2VyLCBTaW1vbiBNY1ZpdHRpZSkKKworRml4ZXM6CisKK+KAoiBGaXggYSByYWNlIGNvbmRpdGlvbiBpbiB0aGUgJ21vbml0b3InIHRlc3QgaW50cm9kdWNlZCBpbiAxLjkuMTAKKyAgKGZkLm8gIzg5MjIyLCBTaW1vbiBNY1ZpdHRpZSkKKworRC1CdXMgMS45LjEyICgyMDE1LTAyLTE5KQorPT0KKworVGhlIOKAnG1vbnN0ZXIgbGFzYWduYeKAnSByZWxlYXNlLgorCitEZXBlbmRlbmNpZXM6CisKK+KAoiBEdWNrdHlwZSBhbmQgeWVscC10b29scyBhcmUgbm93IHJlcXVpcmVkIHRvIGJ1aWxkIGNvbXBsZXRlIGRvY3VtZW50YXRpb24KKyAgKHRoZXkgYXJlIG9wdGlvbmFsIGZvciBub3JtYWwgYnVpbGRzKS4KKworRW5oYW5jZW1lbnRzOgorCivigKIgRC1CdXMgU3BlY2lmaWNhdGlvbiB2ZXJzaW9uIDAuMjYKKyAgwrcgR2V0Q29ubmVjdGlvbkNyZWRlbnRpYWxzIGNhbiByZXR1cm4gTGludXhTZWN1cml0eUxhYmVsIG9yIFdpbmRvd3NTSUQKKyAgwrcgZG9jdW1lbnQgdGhlIEJlY29tZU1vbml0b3IgbWV0aG9kCisKK+KAoiBPbiBMaW51eCwgYWRkIExpbnV4U2VjdXJpdHlMYWJlbCB0byBHZXRDb25uZWN0aW9uQ3JlZGVudGlhbHMKKyAgKGZkLm8gIzg5MDQxOyBUeWxlciBIaWNrcywgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBPbiBMaW51eCwgYWRkIHN1cHBvcnQgZm9yIEFwcEFybW9yIG1lZGlhdGlvbiBvZiBtZXNzYWdlIHNlbmRpbmcgYW5kCisgIHJlY2VpdmluZyBhbmQgbmFtZSBvd25lcnNoaXAgKHBhcmFsbGVsaW5nIGV4aXN0aW5nIFNFTGludXggbWVkaWF0aW9uCisgIHN1cHBvcnQpLCBhbmQgZWF2ZXNkcm9wcGluZyAoYSBuZXcgY2hlY2ssIGN1cnJlbnRseSBBcHBBcm1vci1zcGVjaWZpYykKKyAgKGZkLm8gIzc1MTEzOyBKb2huIEpvaGFuc2VuLCBUeWxlciBIaWNrcywgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBJbiBkYnVzLXNlbmQgYW5kIGRidXMtbW9uaXRvciwgcHJldHR5LXByaW50IFwwLXRlcm1pbmF0ZWQgYnl0ZXN0cmluZ3MKKyAgdGhhdCBoYXZlIHByaW50YWJsZSBBU0NJSSBjb250ZW50czsgd2UgcHJldmlvdXNseSBvbmx5IGRpZCB0aGlzIGZvcgorICB1bnRlcm1pbmF0ZWQgYnl0ZXN0cmluZ3MgKGZkLm8gIzg5MTA5LCBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIEFkZCBhIGd1aWRlIHRvIGRlc2lnbmluZyBnb29kIEQtQnVzIEFQSXMgKGZkLm8gIzg4OTk0LCBQaGlsaXAgV2l0aG5hbGwpCisKK+KAoiBPbiBXaW5kb3dzLCBhZGQgV2luZG93c1NJRCB0byBHZXRDb25uZWN0aW9uQ3JlZGVudGlhbHMKKyAgKGZkLm8gIzU0NDQ1LCBSYWxmIEhhYmFja2VyKQorCivigKIgSW1wcm92ZSBjbGFyaXR5IG9mIGRidXMtbW9uaXRvciAtLXByb2ZpbGUgb3V0cHV0IGFuZCBhZGQgbW9yZSBjb2x1bW5zCisgIChmZC5vICM4OTE2NSwgUmFsZiBIYWJhY2tlcikKKwor4oCiIEFkZCBhIG1hbiBwYWdlIGZvciBkYnVzLXRlc3QtdG9vbCwgYW5kIGJ1aWxkIGl0IHVuZGVyIENNYWtlIGFzIHdlbGwKKyAgYXMgQXV0b3Rvb2xzIChmZC5vIzg5MDg2LCBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIElmIGRidXMtZGFlbW9uIHdhcyBjb21waWxlZCB3aXRoIC0tZW5hYmxlLXZlcmJvc2UsIGFkZCBhIEQtQnVzIEFQSQorICB0byBjb250cm9sIGl0IGF0IHJ1bnRpbWUsIG92ZXJyaWRpbmcgdGhlIERCVVNfVkVSQk9TRSBlbnZpcm9ubWVudCB2YXJpYWJsZQorICAoZmQubyAjODg4OTYsIFJhbGYgSGFiYWNrZXIpCisKK0ZpeGVzOgorCivigKIgUmVkdWNlIHRoZSBudW1iZXIgb2YgZmlsZSBkZXNjcmlwdG9ycyB1c2VkIGluIHRoZSBmZC1wYXNzaW5nIHRlc3QsCisgIGF2b2lkaW5nIGZhaWx1cmUgdW5kZXIgdGhlIGRlZmF1bHQgTGludXggZmQgbGltaXQsIGFuZCBhdXRvbWF0aWNhbGx5CisgIHNraXAgaXQgaWYgdGhlIHJsaW1pdCBpcyB0b28gc21hbGwgKGZkLm8gIzg4OTk4LCBTaW1vbiBNY1ZpdHRpZSkKKworRC1CdXMgMS45LjEwICgyMDE1LTAyLTA5KQorPT0KKworVGhlIOKAnHNhZCBjeWJvcmdz4oCdIHJlbGVhc2UuCisKK1NlY3VyaXR5IGZpeGVzIG1lcmdlZCBmcm9tIDEuOC4xNjoKKwor4oCiIERvIG5vdCBhbGxvdyBub24tdWlkLTAgcHJvY2Vzc2VzIHRvIHNlbmQgZm9yZ2VkIEFjdGl2YXRpb25GYWlsdXJlCisgIG1lc3NhZ2VzLiBPbiBMaW51eCBzeXN0ZW1zIHdpdGggc3lzdGVtZCBhY3RpdmF0aW9uLCB0aGlzIHdvdWxkCisgIGFsbG93IGEgbG9jYWwgZGVuaWFsIG9mIHNlcnZpY2U6IHVucHJpdmlsZWdlZCBwcm9jZXNzZXMgY291bGQKKyAgZmxvb2QgdGhlIGJ1cyB3aXRoIHRoZXNlIGZvcmdlZCBtZXNzYWdlcywgd2lubmluZyB0aGUgcmFjZSB3aXRoCisgIHRoZSBhY3R1YWwgc2VydmljZSBhY3RpdmF0aW9uIGFuZCBjYXVzaW5nIGFuIGVycm9yIHJlcGx5CisgIHRvIGJlIHNlbnQgYmFjayB3aGVuIHNlcnZpY2UgYXV0by1hY3RpdmF0aW9uIHdhcyByZXF1ZXN0ZWQuCisgIFRoaXMgZG9lcyBub3QgcHJldmVudCB0aGUgcmVhbCBzZXJ2aWNlIGZyb20gYmVpbmcgc3RhcnRlZCwKKyAgc28gdGhlIGF0dGFjayBvbmx5IHdvcmtzIHdoaWxlIHRoZSByZWFsIHNlcnZpY2UgaXMgbm90IHJ1bm5pbmcuCisgIChDVkUtMjAxNS0wMjQ1LCBmZC5vICM4ODgxMTsgU2ltb24gTWNWaXR0aWUpCisKK0VuaGFuY2VtZW50czoKKwor4oCiIFRoZSBuZXcgTW9uaXRvcmluZyBpbnRlcmZhY2UgaW4gdGhlIGRidXMtZGFlbW9uIGxldHMgZGJ1cy1tb25pdG9yIGFuZAorICBzaW1pbGFyIHRvb2xzIHJlY2VpdmUgbWVzc2FnZXMgd2l0aG91dCBhbHRlcmluZyB0aGUgc2VjdXJpdHkgcHJvcGVydGllcworICBvZiB0aGUgc3lzdGVtIGJ1cywgYnkgY2FsbGluZyB0aGUgbmV3IEJlY29tZU1vbml0b3IgbWV0aG9kIG9uIGEKKyAgcHJpdmF0ZSBjb25uZWN0aW9uLiBUaGlzIGJ5cGFzc2VzIHRoZSBub3JtYWwgPGFsbG93PiBhbmQgPGRlbnk+IHJ1bGVzCisgIGVudGlyZWx5LCBzbyB0byBwcmVzZXJ2ZSBub3JtYWwgbWVzc2FnZS1wcml2YWN5IGFzc3VtcHRpb25zLCBvbmx5IHJvb3QKKyAgaXMgYWxsb3dlZCB0byBkbyB0aGlzIG9uIHRoZSBzeXN0ZW0gYnVzLiBSZXN0cmljdGVkIGVudmlyb25tZW50cywKKyAgc3VjaCBhcyBMaW51eCB3aXRoIExTTXMsIHNob3VsZCBsb2NrIGRvd24gYWNjZXNzIHRvIHRoZSBNb25pdG9yaW5nCisgIGludGVyZmFjZS4gKGZkLm8gIzQ2Nzg3LCBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIGRidXMtbW9uaXRvciB1c2VzIEJlY29tZU1vbml0b3IgdG8gY2FwdHVyZSBtb3JlIHRyYWZmaWMsIGlmIHRoZQorICBkYnVzLWRhZW1vbiBzdXBwb3J0cyBpdCBhbmQgYWNjZXNzIHBlcm1pc3Npb25zIGFsbG93IGl0LgorICBJdCBzdGlsbCBzdXBwb3J0cyB0aGUgcHJldmlvdXMgYXBwcm9hY2ggKCJlYXZlc2Ryb3BwaW5nIiBtYXRjaCBydWxlcykKKyAgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciBidXMgZGFlbW9ucy4gKGZkLm8gIzQ2Nzg3LCBTaW1vbikKKwor4oCiIGRidXMtbW9uaXRvciBjYW4gbm93IGxvZyB0aGUgbWVzc2FnZSBzdHJlYW0gYXMgYmluYXJ5IGRhdGEgZm9yIGxhdGVyCisgIGFuYWx5c2lzLCB3aXRoIGVpdGhlciBubyBleHRyYSBmcmFtaW5nIGJleW9uZCB0aGUgbm9ybWFsIEQtQnVzIGhlYWRlcnMsCisgIG9yIGxpYnBjYXAtY29tcGF0aWJsZSBmcmFtaW5nIHRyZWF0aW5nIGVhY2ggRC1CdXMgbWVzc2FnZQorICBhcyBhIGNhcHR1cmVkIHBhY2tldC4gKGZkLm8gIzQ2Nzg3LCBTaW1vbikKKworT3RoZXIgZml4ZXM6CisKK+KAoiBGaXggc29tZSBDTWFrZSBidWlsZCByZWdyZXNzaW9ucyAoZmQubyAjODg5NjQsIFJhbGYgSGFiYWNrZXIpCisKK+KAoiBPbiBVbml4LCBmb3JjaWJseSB0ZXJtaW5hdGUgcmVncmVzc2lvbiB0ZXN0cyBhZnRlciA2MCBzZWNvbmRzIHRvCisgIHByZXZlbnQgdGhlbSBmcm9tIGJsb2NraW5nIGNvbnRpbnVvdXMgaW50ZWdyYXRpb24gZnJhbWV3b3JrcworICAoZmQubyAjNDY3ODcsIFNpbW9uKQorCitELUJ1cyAxLjkuOCAoMjAxNS0wMi0wMykKKz09CisKK1RoZSDigJxhbGwgdGhlIHR5cGVzIG9mIHByZWNpcGl0YXRpb27igJ0gcmVsZWFzZS4KKworRGVwZW5kZW5jaWVzOgorCivigKIgZnVsbCB0ZXN0IGNvdmVyYWdlIG5vdyByZXF1aXJlcyBHTGliIDIuMzYKK+KAoiBmdWxsIHRlc3QgY292ZXJhZ2Ugbm93IHJlcXVpcmVzIFB5R0kgKFB5R09iamVjdCAzLAorICAiaW1wb3J0IGdpLnJlcG9zaXRvcnkuR09iamVjdCIpIGluc3RlYWQgb2YgdGhlCisgIG9ic29sZXRlIFB5R09iamVjdCAyICgiaW1wb3J0IGdvYmplY3QiKQorCitFbmhhbmNlbWVudHM6CisKK+KAoiBhZGQgR0xpYi1zdHlsZSAiaW5zdGFsbGVkIHRlc3RzIiAoZmQubyAjODg4MTAsIFNpbW9uIE1jVml0dGllKQorCivigKIgYmV0dGVyIHJlZ3Jlc3Npb24gdGVzdCBjb3ZlcmFnZSwgaW5jbHVkaW5nIHN5c3RlbWQgYWN0aXZhdGlvbgorICAoZmQubyAjNTc5NTIsICM4ODgxMDsgU2ltb24gTWNWaXR0aWUpCisKK0ZpeGVzOgorCivigKIgZmF0YWwgZXJyb3JzIGNvcnJlY3RseSBtYWtlIHRoZSBkYnVzLWRhZW1vbiBleGl0IGV2ZW4gaWYgPHN5c2xvZy8+IGlzCisgIHR1cm5lZCBvZmYgKGZkLm8gIzg4ODA4LCBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIFRDUCBzb2NrZXRzIG9uIFdpbmRvd3Mgbm8gbG9uZ2VyIGZhaWwgdG8gbGlzdGVuIGFwcHJveGltYXRlbHkgMSB0aW1lCisgIGluIDI1NiwgY2F1c2VkIGJ5IGEgbG9naWMgZXJyb3IgdGhhdCBzaG91bGQgaGF2ZSBhbHdheXMgbWFkZSBpdCBmYWlsIGJ1dAorICB3YXMgbWl0aWdhdGVkIGJ5IGluY29ycmVjdCBlbmRpYW5uZXNzIGZvciB0aGUgcG9ydCBudW1iZXIKKyAgKGZkLm8gIzg3OTk5LCBSYWxmIEhhYmFja2VyKQorCivigKIgZml4IHNvbWUgV2luZG93cyBidWlsZCBmYWlsdXJlcyAoZmQubyAjODgwMDksICM4ODAxMDsgUmFsZiBIYWJhY2tlcikKKwor4oCiIG9uIFdpbmRvd3MsIGFsbG93IHVwIHRvIDhLIGNvbm5lY3Rpb25zIHRvIHRoZSBkYnVzLWRhZW1vbiBpbnN0ZWFkIG9mIHRoZQorICBwcmV2aW91cyA2NCwgY29tcGxldGluZyBhIHByZXZpb3VzIGZpeCB3aGljaCBvbmx5IHdvcmtlZCB1bmRlcgorICBBdXRvdG9vbHMgKGZkLm8gIzcxMjk3LCBSYWxmIEhhYmFja2VyKQorCivigKIgb24gV2luZG93cywgaWYgdGhlIElQIGZhbWlseSBpcyB1bnNwZWNpZmllZCBvbmx5IHVzZSBJUHY0LAorICB0byBtaXRpZ2F0ZSBJUHY2IG5vdCB3b3JraW5nIGNvcnJlY3RseSAoZmQubyAjODc5OTksIFJhbGYgSGFiYWNrZXIpCisKK+KAoiBmaXggc29tZSB1bmxpa2VseSBtZW1vcnkgbGVha3Mgb24gT09NIChmZC5vICM4ODA4NywgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBsY292IGNvZGUgY292ZXJhZ2UgYW5hbHlzaXMgd29ya3MgYWdhaW4gKGZkLm8gIzg4ODA4LCBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIGZpeCBhbiB1bnVzZWQgZnVuY3Rpb24gZXJyb3Igd2l0aCAtLWRpc2FibGUtZW1iZWRkZWQtdGVzdHMgKGZkLm8gIzg3ODM3LAorICBUaGlhZ28gTWFjaWVpcmEpCisKK0QtQnVzIDEuOS42ICgyMDE1LTAxLTA1KQorPT0KKworVGhlIOKAnEkgZG8gaGF2ZSBhIGJyZWFkIGtuaWZl4oCdIHJlbGVhc2UuCisKK1NlY3VyaXR5IGhhcmRlbmluZzoKKwor4oCiIERvIG5vdCBhbGxvdyBjYWxscyB0byBVcGRhdGVBY3RpdmF0aW9uRW52aXJvbm1lbnQgZnJvbSB1aWRzIG90aGVyIHRoYW4KKyAgdGhlIHVpZCBvZiB0aGUgZGJ1cy1kYWVtb24uIElmIGEgc3lzdGVtIHNlcnZpY2UgaW5zdGFsbHMgdW5zYWZlCisgIHNlY3VyaXR5IHBvbGljeSBydWxlcyB0aGF0IGFsbG93IGFyYml0cmFyeSBtZXRob2QgY2FsbHMKKyAgKHN1Y2ggYXMgQ1ZFLTIwMTQtODE0OCkgdGhlbiB0aGlzIHByZXZlbnRzIG1lbW9yeSBjb25zdW1wdGlvbiBhbmQKKyAgcG9zc2libGUgcHJpdmlsZWdlIGVzY2FsYXRpb24gdmlhIFVwZGF0ZUFjdGl2YXRpb25FbnZpcm9ubWVudC4KKworICBXZSBiZWxpZXZlIHRoYXQgaW4gcHJhY3RpY2UsIHByaXZpbGVnZSBlc2NhbGF0aW9uIGhlcmUgaXMgYXZvaWRlZAorICBieSBkYnVzLWRhZW1vbi1sYXVuY2gtaGVscGVyIHNhbml0aXppbmcgaXRzIGVudmlyb25tZW50OyBidXQKKyAgaXQgc2VlbXMgYmV0dGVyIHRvIGJlIHNhZmUuCisKK+KAoiBEbyBub3QgYWxsb3cgY2FsbHMgdG8gVXBkYXRlQWN0aXZhdGlvbkVudmlyb25tZW50IG9yIHRoZSBTdGF0cyBpbnRlcmZhY2UKKyAgb24gb2JqZWN0IHBhdGhzIG90aGVyIHRoYW4gL29yZy9mcmVlZGVza3RvcC9EQnVzLiBTb21lIHN5c3RlbSBzZXJ2aWNlcworICBpbnN0YWxsIHVuc2FmZSBzZWN1cml0eSBwb2xpY3kgcnVsZXMgdGhhdCBhbGxvdyBhcmJpdHJhcnkgbWV0aG9kIGNhbGxzCisgIHRvIGFueSBkZXN0aW5hdGlvbiwgbWV0aG9kIGFuZCBpbnRlcmZhY2Ugd2l0aCBhIHNwZWNpZmllZCBvYmplY3QgcGF0aDsKKyAgd2hpbGUgbGVzcyBiYWQgdGhhbiBhbGxvd2luZyBhcmJpdHJhcnkgbWV0aG9kIGNhbGxzLCB0aGVzZSBzZWN1cml0eQorICBwb2xpY2llcyBhcmUgc3RpbGwgaGFybWZ1bCwgc2luY2UgZGJ1cy1kYWVtb24gbm9ybWFsbHkgb2ZmZXJzIHRoZQorICBzYW1lIEFQSSBvbiBhbGwgb2JqZWN0IHBhdGhzIGFuZCBvdGhlciBzeXN0ZW0gc2VydmljZXMgbWlnaHQgYmVoYXZlCisgIHNpbWlsYXJseS4KKworT3RoZXIgZml4ZXM6CisKK+KAoiBBZGQgbWlzc2luZyBpbml0aWFsaXphdGlvbiBzbyBHZXRFeHRlbmRlZFRjcFRhYmxlIGRvZXNuJ3QgY3Jhc2ggb24KKyAgV2luZG93cyBWaXN0YSBTUDAgKGZkLm8gIzc3MDA4LCDQmNC70YzRjyDQkC4g0KLQutCw0YfQtdC90LrQvikKKworRC1CdXMgMS45LjQgKDIwMTQtMTEtMjQpCis9PQorCitUaGUg4oCcZXh0cmEtc3R1cmR5IGNhcmFtZWzigJ0gcmVsZWFzZS4KKworRml4ZXM6CisKK+KAoiBQYXJ0aWFsbHkgcmV2ZXJ0IHRoZSBDVkUtMjAxNC0zNjM5IHBhdGNoIGJ5IGluY3JlYXNpbmcgdGhlIGRlZmF1bHQKKyAgYXV0aGVudGljYXRpb24gdGltZW91dCBvbiB0aGUgc3lzdGVtIGJ1cyBmcm9tIDUgc2Vjb25kcyBiYWNrIHRvIDMwCisgIHNlY29uZHMsIHNpbmNlIHRoaXMgaGFzIGJlZW4gcmVwb3J0ZWQgdG8gY2F1c2UgYm9vdCByZWdyZXNzaW9ucyBmb3IKKyAgc29tZSB1c2VycywgbW9zdGx5IHdpdGggcGFyYWxsZWwgYm9vdCAoc3lzdGVtZCkgb24gc2xvd2VyIGhhcmR3YXJlLgorCisgIE9uIGZhc3Qgc3lzdGVtcyB3aGVyZSBsb2NhbCB1c2VycyBhcmUgY29uc2lkZXJlZCBwYXJ0aWN1bGFybHkgaG9zdGlsZSwKKyAgYWRtaW5pc3RyYXRvcnMgY2FuIHJldHVybiB0byB0aGUgNSBzZWNvbmQgdGltZW91dCAob3IgYW55IG90aGVyIHZhbHVlCisgIGluIG1pbGxpc2Vjb25kcykgYnkgc2F2aW5nIHRoaXMgYXMgL2V0Yy9kYnVzLTEvc3lzdGVtLWxvY2FsLmNvbmY6CisKKyAgPGJ1c2NvbmZpZz4KKyAgICA8bGltaXQgbmFtZT0iYXV0aF90aW1lb3V0Ij41MDAwPC9saW1pdD4KKyAgPC9idXNjb25maWc+CisKKyAgKGZkLm8gIzg2NDMxLCBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIEFkZCBhIG1lc3NhZ2UgaW4gc3lzbG9nL3RoZSBKb3VybmFsIHdoZW4gdGhlIGF1dGhfdGltZW91dCBpcyBleGNlZWRlZAorICAoZmQubyAjODY0MzEsIFNpbW9uIE1jVml0dGllKQorCivigKIgU2VuZCBiYWNrIGFuIEFjY2Vzc0RlbmllZCBlcnJvciBpZiB0aGUgYWRkcmVzc2VkIHJlY2lwaWVudCBpcyBub3QgYWxsb3dlZAorICB0byByZWNlaXZlIGEgbWVzc2FnZSAoYW5kIGluIGJ1aWxkcyB3aXRoIGFzc2VydGlvbnMgZW5hYmxlZCwgZG9uJ3QKKyAgYXNzZXJ0IHVuZGVyIHRoZSBzYW1lIGNvbmRpdGlvbnMpLiAoZmQubyAjODYxOTQsIEphY2VrIEJ1a2FyZXdpY3opCisKK0QtQnVzIDEuOS4yICgyMDE0LTExLTEwKQorPT0KKworVGhlIOKAnHN0cnVjdHVyYWxseSB1bnNvdW5kIGZsYXBqYWNr4oCdIHJlbGVhc2UuCisKK1NlY3VyaXR5IGZpeGVzOgorCivigKIgSW5jcmVhc2UgZGJ1cy1kYWVtb24ncyBSTElNSVRfTk9GSUxFIHJsaW1pdCB0byA2NTUzNgorICBzbyB0aGF0IENWRS0yMDE0LTM2MzYgcGFydCBBIGNhbm5vdCBleGhhdXN0IHRoZSBzeXN0ZW0gYnVzJworICBmaWxlIGRlc2NyaXB0b3JzLCBjb21wbGV0aW5nIHRoZSBpbmNvbXBsZXRlIGZpeCBpbiAxLjguOC4KKyAgKENWRS0yMDE0LTc4MjQsIGZkLm8gIzg1MTA1OyBTaW1vbiBNY1ZpdHRpZSwgQWxiYW4gQ3JlcXV5KQorCitFbmhhbmNlbWVudHM6CisKK+KAoiBELUJ1cyBTcGVjaWZpY2F0aW9uIHZlcnNpb24gMC4yNQorICDCtyBuZXcgdmFsdWUgJ2NvbnN0JyBmb3IgRW1pdHNDaGFuZ2VkU2lnbmFsIGFubm90YXRpb24KKyAgICAoZmQubyAjNzI5NTgsIExlbm5hcnQgUG9ldHRlcmluZykKKyAgwrcgbmV3IEFMTE9XX0lOVEVSQUNUSVZFX0FVVEhPUklaQVRJT04gZmxhZywgZm9yIFBvbGljeUtpdCBhbmQgc2ltaWxhcgorICAgIChmZC5vICM4MzQ0OTsgTGVubmFydCBQb2V0dGVyaW5nLCBTaW1vbiBNY1ZpdHRpZSkKKyAgwrcgYW5ub3RhdGUgdGFibGUgb2YgdHlwZXMgd2l0aCByZXNlcnZlZC9iYXNpYy9jb250YWluZXIsIGFuZCBmb3IKKyAgICBiYXNpYyB0eXBlcywgZml4ZWQvc3RyaW5nLWxpa2UKKyAgwrcgY2xhcmlmeSBhcmJpdHJhcnkgbGltaXRzIGJ5IHF1b3RpbmcgdGhlbSBpbiBtZWJpYnl0ZXMKKwor4oCiIE5ldyBBUEk6IGFkZCBhY2Nlc3NvcnMgZm9yIHRoZSBBTExPV19JTlRFUkFDVElWRV9BVVRIT1JJWkFUSU9OIGZsYWcKKyAgKGZkLm8gIzgzNDQ5LCBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIEFkZCBkYnVzLXRlc3QtdG9vbCwgYSBELUJ1cyBzd2lzcyBhcm15IGtuaWZlIHdpdGggbXVsdGlwbGUgc3ViY29tbWFuZHMsCisgIHVzZWZ1bCBmb3IgZGVidWdnaW5nIGFuZCBwZXJmb3JtYW5jZSB0ZXN0aW5nOgorICDCtyBkYnVzLXRlc3QtdG9vbCBzcGFtOiBzZW5kIHJlcGVhdGVkIG1lc3NhZ2VzCisgIMK3IGRidXMtdGVzdC10b29sIGVjaG86IHNlbmQgYW4gZW1wdHkgcmVwbHkgZm9yIGFsbCBtZXRob2QgY2FsbHMKKyAgwrcgZGJ1cy10ZXN0LXRvb2wgYmxhY2staG9sZTogZG8gbm90IHJlcGx5IHRvIG1ldGhvZCBjYWxscworICAoZmQubyAjMzQxNDA7IEFsYmFuIENyZXF1eSwgU2ltb24gTWNWaXR0aWUsIFdpbGwgVGhvbXBzb24pCisKK+KAoiBBZGQgc3VwcG9ydCBmb3IgcHJvY2VzcyBJRCBpbiBjcmVkZW50aWFscy1wYXNzaW5nIG9uIE5ldEJTRAorICAoZmQubyAjNjk3MDIsIFBhdHJpY2sgV2VsY2hlKQorCivigKIgQWRkIGFuIGV4YW1wbGUgc2NyaXB0IHRvIGZpbmQgcG90ZW50aWFsbHkgdW5kZXNpcmVkIG1hdGNoIHJ1bGVzCisgIChmZC5vICM4NDU5OCwgQWxiYW4gQ3JlcXV5KQorCivigKIgRG9jdW1lbnQgdGhlIGNlbnRyYWwgYXNzdW1wdGlvbiB0aGF0IG1ha2VzIG91ciB1c2Ugb2YgY3JlZGVudGlhbHMtcGFzc2luZworICBzZWN1cmUgKGZkLm8gIzgzNDk5LCBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIFJlcGxhY2UgdGhlIGRidXMtZ2xpYiBzZWN0aW9uIG9mIHRoZSB0dXRvcmlhbCB3aXRoIGEgR0RCdXMgcmVjb21tZW5kYXRpb24sCisgIGFuZCBhZGQgc29tZSBsaW5rcyB0byBHREJ1cyBhbmQgUXREQnVzIGRvY3VtZW50YXRpb24gKGZkLm8gIzI1MTQwLAorICBTaW1vbiBNY1ZpdHRpZSkKKworRml4ZXM6CisKK+KAoiBVc2UgYSBsZXNzIGNvbmZ1c2luZyBOb1JlcGx5IG1lc3NhZ2Ugd2hlbiBkaXNjb25uZWN0ZWQgd2l0aCBhIHJlcGx5IHBlbmRpbmcKKyAgKGZkLm8gIzc2MTEyLCBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIE1ha2UgdGhlIC5wYyBmaWxlIHJlbG9jYXRhYmxlIGJ5IGxldHRpbmcgcGtnLWNvbmZpZyBkbyBhbGwgdmFyaWFibGUKKyAgZXhwYW5zaW9uIGl0c2VsZiAoZmQubyAjNzU4NTgsINCg0YPRgdC70LDQvSDQmNC20LHRg9C70LDRgtC+0LIpCisKK+KAoiBGaXggYSBidWlsZCBmYWlsdXJlIG9uIHBsYXRmb3JtcyB3aXRoIGtxdWV1ZSwgd2hpY2ggcmVncmVzc2VkIGluIDEuOS4wCisgIChmZC5vICM4NTU2MywgUGF0cmljayBXZWxjaGUpCisKK+KAoiBDb25zaXN0ZW50bHkgc2F2ZSBlcnJubyBhZnRlciBzb2NrZXQgY2FsbHMgKGZkLm8gIzgzNjI1LCBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIEluIGRidXMtc3Bhd24sIHdoZW4gdGhlIGdyYW5kY2hpbGQgcHJvY2VzcyBleGl0cyBkdWUgdG8gYSBmYWlsZWQgZXhlYygpLAorICBkbyBub3QgbG9zZSB0aGUgZXhlYygpIGVycm5vIChmZC5vICMyNDgyMSwgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBEbyBub3QgZmFpbCB0aGUgdGVzdHMgaWYgYSBwYXJlbnQgcHJvY2VzcyBoYXMgbGVha2VkIG5vbi1jbG9zZS1vbi1leGVjCisgIGZpbGUgZGVzY3JpcHRvcnMgdG8gdXMgKGZkLm8gIzczNjg5LCBmZC5vICM4Mzg5OTsgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBEbyBub3QgZmFpbCB0aGUgdGVzdHMgb24gVW5peCBwbGF0Zm9ybXMgd2l0aCBpbmNvbXBsZXRlCisgIGNyZWRlbnRpYWxzLXBhc3Npbmcgc3VwcG9ydCwgYnV0IGRvIGZhaWwgaWYgd2UgY2FuJ3QgcGFzcyBjcmVkZW50aWFscworICBvbiBhIHBsYXRmb3JtIHdoZXJlIGl0IGlzIGtub3duIHRvIHdvcms6IExpbnV4LCBGcmVlQlNELCBPcGVuQlNELCBOZXRCU0QKKyAgKGZkLm8gIzY5NzAyLCBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIERldGVjdCBhY2NlcHQ0LCBkaXJmZCwgaW5vdGlmeV9pbml0MSwgcGlwZTIsIGFuZCBVbml4IGZkIHBhc3NpbmcKKyAgd2hlbiBidWlsZGluZyB3aXRoIGNtYWtlLCBhbmQgZXhwYW5kIHRlc3QgY292ZXJhZ2UgdGhlcmUKKyAgKGZkLm8gIzczNjg5OyBSYWxmIEhhYmFja2VyLCBTaW1vbiBNY1ZpdHRpZSkKKworRC1CdXMgMS45LjAgKDIwMTQtMTAtMDEpCis9PQorCitUaGUg4oCcdGllcmVkIGNoZWVzZXPigJ0gcmVsZWFzZS4KKworUmVxdWlyZW1lbnRzOgorCivigKIgU3VwcG9ydCBmb3IgdGhlIHN5c3RlbWQ6IChMSVNURU5fRkRTKSBwc2V1ZG8tdHJhbnNwb3J0IG9uIExpbnV4IG5vdworICByZXF1aXJlcyBlaXRoZXIgdGhlIGxpYnN5c3RlbWQgb3IgbGlic2QtZGFlbW9uIHNoYXJlZCBsaWJyYXJ5LCBkcm9wcGluZyB0aGUKKyAgZW1iZWRkZWQgY29udmVuaWVuY2UgY29weSBvZiBzZC1kYWVtb24gKGZkLm8gIzcxODE4LCBTaW1vbikKKworQnVpbGQtdGltZSBjb25maWd1cmF0aW9uIGNoYW5nZXM6CisKK+KAoiBUaGUgU3RhdHMgaW50ZXJmYWNlIGlzIG5vdyBlbmFibGVkIGJ5IGRlZmF1bHQsIGFuZCBsb2NrZWQtZG93biB0bworICByb290LW9ubHkgb24gdGhlIHN5c3RlbSBidXMuIENvbmZpZ3VyZSB3aXRoIC0tZGlzYWJsZS1zdGF0cworICB0byBkaXNhYmxlIGl0IGFsdG9nZXRoZXIgb24gbWVtb3J5LSBvciBkaXNrLWNvbnN0cmFpbmVkIHN5c3RlbXMsCisgIG9yIHNlZSAke2RvY2Rpcn0vZXhhbXBsZXMvIHRvIG9wZW4gaXQgdXAgdG8gbm9uLXJvb3QgdXNlcnMgb24gdGhlCisgIHN5c3RlbSBidXMgb3IgcmVzdHJpY3QgYWNjZXNzIG9uIHRoZSBzZXNzaW9uIGJ1cy4KKyAgKGZkLm8gIzgwNzU5OyBTaW1vbiBNY1ZpdHRpZSwgQWxiYW4gQ3JlcXV5KQorCivigKIgVGhlIENNYWtlIGJ1aWxkIHN5c3RlbSBub3cgYnVpbGRzIHRoZSBzYW1lIHNoYXJlZCBsaWJyYXJ5IG5hbWUgYXMgQXV0b3Rvb2xzCisgIG9uIGF0IGxlYXN0IExpbnV4IGFuZCBXaW5kb3dzOgorICAtIG9uIExpbnV4IChhbmQgcGVyaGFwcyBvdGhlciBVbml4IHBsYXRmb3JtcyksIGl0IHByZXZpb3VzbHkgYnVpbHQKKyAgICBsaWJkYnVzLTEuc28sIGJ1dCBub3cgYnVpbGRzIGxpYmRidXMtMS5zby4zLiogd2l0aCBkZXZlbG9wbWVudAorICAgIHN5bWxpbmsgbGliZGJ1cy0xLnNvIGFuZCBTT05BTUUvc3ltbGluayBsaWJkYnVzLTEuc28uMworICAtIG9uIFdpbmRvd3MsIGl0IHByZXZpb3VzbHkgYnVpbHQgZWl0aGVyIGxpYmRidXMtMS5kbGwgKHJlbGVhc2UpIG9yCisgICAgbGliZGJ1cy0xZC5kbGwgKGRlYnVnKSwgYnV0IG5vdyBidWlsZHMgbGliZGJ1cy0xLTMuZGxsLCBjb3BpZWQgdG8KKyAgICBsaWJkYnVzLTEuZGxsIGZvciBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgYXBwbGljYXRpb25zLgorICAoZmQubyAjNzQxMTcsIFJhbGYgSGFiYWNrZXIpCisKK0VuaGFuY2VtZW50czoKKwor4oCiIEQtQnVzIFNwZWNpZmljYXRpb24gdmVyc2lvbiAwLjI0CisgIMK3IGRvY3VtZW50IGhvdyB0byBxdW90ZSBtYXRjaCBydWxlcyAoZmQubyAjMjQzMDcsIFNpbW9uIE1jVml0dGllKQorICDCtyBleHBsaWNpdGx5IHNheSB0aGF0IG1vc3QgbWVzc2FnZSB0eXBlcyBuZXZlciBleHBlY3QgYSByZXBseQorICAgIHJlZ2FyZGxlcyBvZiB3aGV0aGVyIHRoZXkgaGF2ZSBOT19SRVBMWV9FWFBFQ1RFRAorICAgIChmZC5vICM3NTc0OSwgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBvbiBVbml4IHBsYXRmb3JtcywgZGlzYWJsZSBOYWdsZSdzIGFsZ29yaXRobSBvbiBUQ1AgY29ubmVjdGlvbnMgdG8gaW1wcm92ZQorICBpbml0aWFsIGxhdGVuY3kgKGZkLm8gIzc1NTQ0LCBNYXR0IEhvb3NpZXIpCisKK+KAoiB1c2UgYmFja3RyYWNlKCkgaWYgaXQgaXMgaW4gLWxleGVjaW5mbyBpbnN0ZWFkIG9mIGxpYmMsIGFzIG9uIE5ldEJTRAorICAoZmQubyAjNjk3MDIsIFBhdHJpY2sgV2VsY2hlKQorCivigKIgaW4gZGJ1cy1tb25pdG9yLCBwcmludCBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGZpbGUgZGVzY3JpcHRvcnMKKyAgKGZkLm8gIzgwNjAzLCBBbGJhbiBDcmVxdXkpCisKK+KAoiBkbyBub3QgaW5zdGFsbCBzeXN0ZW0gYnVzIGNvbmZpZ3VyYXRpb24gaWYgYnVpbHQgZm9yIFdpbmRvd3MKKyAgKGZkLm8gIzgzNTgzOyBSYWxmIEhhYmFja2VyLCBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIEFkZCBHZXRBbGxNYXRjaFJ1bGVzIHRvIHRoZSBTdGF0cyBpbnRlcmZhY2UgKGZkLm8gIzI0MzA3LCBBbGJhbiBDcmVxdXkpCisKK+KAoiBBZGQgYSByZWdyZXNzaW9uIHRlc3QgZm9yIGZpbGUgZGVzY3JpcHRvciBwYXNzaW5nIChmZC5vICM4MzYyMiwKKyAgU2ltb24gTWNWaXR0aWUpCisKK0ZpeGVzOgorCivigKIgZml4IGFuIGluY29ycmVjdCBlcnJvciBtZXNzYWdlIGlmIGEgVW5peCBzb2NrZXQgcGF0aCBpcyB0b28gbG9uZworICAoZmQubyAjNzM4ODcsIEFudG9pbmUgSmFjb3V0b3QpCisKK+KAoiBpbiBhbiBNU1lTL0N5Z3dpbiBlbnZpcm9ubWVudCwgcGFzcyBVbml4LXN0eWxlIGZpbGVuYW1lcyB0byB4bWx0bywKKyAgZml4aW5nIGRvY3VtZW50YXRpb24gZ2VuZXJhdGlvbiAoZmQubyAjNzU4NjAsINCg0YPRgdC70LDQvSDQmNC20LHRg9C70LDRgtC+0LIpCisKK+KAoiBpbiBVbml4IHdpdGggWDExLCBhdm9pZCBnaXZpbmcgZGJ1cy1sYXVuY2ggYSBtaXNsZWFkaW5nIGFyZ3ZbMF0KKyAgaW4gcHMoMSkgKGZkLm8gIzY5NzE2LCBDaGVuZ3dlaSBZYW5nKQorCivigKIgYXZvaWQgY2FsbGluZyBwb2xsKCkgd2l0aCB0aW1lb3V0IDwgLTEsIHdoaWNoIGlzIGNvbnNpZGVyZWQgaW52YWxpZAorICBvbiBGcmVlQlNEIGFuZCBOZXRCU0QgKGZkLm8gIzc4NDgwLCBKYWFwIEJvZW5kZXIpCisKK+KAoiBiZSBwb3J0YWJsZSB0byBCU0QtZGVyaXZlZCBwbGF0Zm9ybXMgd2hlcmUgT19DTE9FWEVDIGlzIHVuYXZhaWxhYmxlIGluIGxpYmMKKyAgKGxpa2UgTWFjIE9TIFggMTAuNiksIG9yIGF2YWlsYWJsZSBpbiBsaWJjIGJ1dCB1bnN1cHBvcnRlZCBieSB0aGUga2VybmVsCisgIChmZC5vICM3NzAzMjsgcm12c3hvcCwgT0JBVEEgQWtpbywgUGF0cmljayBXZWxjaGUpCisKK+KAoiBGaXggaW5jbHVkZSBwYXRoIGZvciB0ZXN0L2ludGVybmFsLyouYyB3aXRoIGNtYWtlIChSYWxmIEhhYmFja2VyKQorCivigKIgRG9jdW1lbnRhdGlvbiBpbXByb3ZlbWVudHMKKyAgKGZkLm8gIzgwNzk1LCAjODQzMTM7IFRob21hcyBIYWxsZXIsIFNlYmFzdGlhbiBSYXNtdXNzZW4pCisKK+KAoiBpbiBkYnVzLW1vbml0b3IsIGRvIG5vdCBsZWFrIGZpbGUgZGVzY3JpcHRvcnMgdGhhdCB3ZSBoYXZlIG1vbml0b3JlZAorICAoZmQubyAjODA2MDMsIEFsYmFuIENyZXF1eSkKKwor4oCiIFNldCB0aGUgY2xvc2Utb24tZXhlYyBmbGFnIGZvciB0aGUgaW5vdGlmeSBmaWxlIGRlc2NyaXB0b3IsIGV2ZW4KKyAgaWYgYnVpbHQgd2l0aCBDTWFrZSBvciBvbGRlciBsaWJjIChmZC5vICM3MzY4OSwgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBSZW1vdmUgc29tZSBMR1BMIGNvZGUgZnJvbSB0aGUgV2luZG93cyBkYnVzLWRhZW1vbgorICAoZmQubyAjNTcyNzIsIFJhbGYgSGFiYWNrZXIpCisKK0QtQnVzIDEuOC44ICgyMDE0LTA5LTE2KQorPT0KKworVGhlICJzbWFzaHkgc21hc2h5IGVnZyBtYW4iIHJlbGVhc2UuCisKK1NlY3VyaXR5IGZpeGVzOgorCivigKIgRG8gbm90IGFjY2VwdCBhbiBleHRyYSBmZCBpbiB0aGUgcGFkZGluZyBvZiBhIGNtc2cgbWVzc2FnZSwgd2hpY2gKKyAgY291bGQgbGVhZCB0byBhIDQtYnl0ZSBoZWFwIGJ1ZmZlciBvdmVycnVuLgorICAoQ1ZFLTIwMTQtMzYzNSwgZmQubyAjODM2MjI7IFNpbW9uIE1jVml0dGllKQorCivigKIgUmVkdWNlIGRlZmF1bHQgZm9yIG1heGltdW0gVW5peCBmaWxlIGRlc2NyaXB0b3JzIHBhc3NlZCBwZXIgbWVzc2FnZQorICBmcm9tIDEwMjQgdG8gMTYsIHByZXZlbnRpbmcgYSB1aWQgd2l0aCB0aGUgZGVmYXVsdCBtYXhpbXVtIG51bWJlciBvZgorICBjb25uZWN0aW9ucyBmcm9tIGV4aGF1c3RpbmcgdGhlIHN5c3RlbSBidXMnIGZpbGUgZGVzY3JpcHRvcnMgdW5kZXIKKyAgTGludXgncyBkZWZhdWx0IHJsaW1pdC4gRGlzdHJpYnV0b3JzIG9yIHN5c3RlbSBhZG1pbmlzdHJhdG9ycyB3aXRoIGEKKyAgbW9yZSByZXN0cmljdGl2ZSBmZCBsaW1pdCBtYXkgd2lzaCB0byByZWR1Y2UgdGhlc2UgbGltaXRzIGZ1cnRoZXIuCisKKyAgQWRkaXRpb25hbGx5LCBvbiBMaW51eCB0aGlzIHByZXZlbnRzIGEgc2Vjb25kIGRlbmlhbCBvZiBzZXJ2aWNlCisgIGluIHdoaWNoIHRoZSBkYnVzLWRhZW1vbiBjYW4gYmUgbWFkZSB0byBleGNlZWQgdGhlIG1heGltdW0gbnVtYmVyCisgIG9mIGZkcyBwZXIgc2VuZG1zZygpIGFuZCBkaXNjb25uZWN0IHRoZSBwcm9jZXNzIHRoYXQgd291bGQgaGF2ZQorICByZWNlaXZlZCB0aGVtLgorICAoQ1ZFLTIwMTQtMzYzNiwgZmQubyAjODI4MjA7IEFsYmFuIENyZXF1eSkKKwor4oCiIERpc2Nvbm5lY3QgY29ubmVjdGlvbnMgdGhhdCBzdGlsbCBoYXZlIGEgZmQgcGVuZGluZyB1bm1hcnNoYWxsaW5nIGFmdGVyCisgIGEgbmV3IGNvbmZpZ3VyYWJsZSBsaW1pdCwgcGVuZGluZ19mZF90aW1lb3V0IChkZWZhdWx0aW5nIHRvIDE1MCBzZWNvbmRzKSwKKyAgcmVtb3ZpbmcgdGhlIHBvc3NpYmlsaXR5IG9mIGNyZWF0aW5nIGFuIGFidXNpdmUgY29ubmVjdGlvbiB0aGF0IGNhbm5vdCBiZQorICBkaXNjb25uZWN0ZWQgYnkgc2V0dGluZyB1cCBhIGNpcmN1bGFyIHJlZmVyZW5jZSB0byBhIGNvbm5lY3Rpb24ncworICBmaWxlIGRlc2NyaXB0b3IuCisgIChDVkUtMjAxNC0zNjM3LCBmZC5vICM4MDU1OTsgQWxiYW4gQ3JlcXV5KQorCivigKIgUmVkdWNlIGRlZmF1bHQgZm9yIG1heGltdW0gcGVuZGluZyByZXBsaWVzIHBlciBjb25uZWN0aW9uIGZyb20gODE5MiB0byAxMjgsCisgIG1pdGlnYXRpbmcgYW4gYWxnb3JpdGhtaWMgY29tcGxleGl0eSBkZW5pYWwtb2Ytc2VydmljZSBhdHRhY2sKKyAgKENWRS0yMDE0LTM2MzgsIGZkLm8gIzgxMDUzOyBBbGJhbiBDcmVxdXkpCisKK+KAoiBSZWR1Y2UgZGVmYXVsdCBmb3IgYXV0aGVudGljYXRpb24gdGltZW91dCBvbiB0aGUgc3lzdGVtIGJ1cyBmcm9tCisgIDMwIHNlY29uZHMgdG8gNSBzZWNvbmRzLCBhdm9pZGluZyBkZW5pYWwgb2Ygc2VydmljZSBieSB1c2luZyB1cAorICBhbGwgdW5hdXRoZW50aWNhdGVkIGNvbm5lY3Rpb24gc2xvdHM7IGFuZCB3aGVuIGFsbCB1bmF1dGhlbnRpY2F0ZWQKKyAgY29ubmVjdGlvbiBzbG90cyBhcmUgdXNlZCB1cCwgbWFrZSBuZXcgY29ubmVjdGlvbiBhdHRlbXB0cyBibG9jaworICBpbnN0ZWFkIG9mIGRpc2Nvbm5lY3RpbmcgdGhlbS4KKyAgKENWRS0yMDE0LTM2MzksIGZkLm8gIzgwOTE5OyBBbGJhbiBDcmVxdXkpCisKK090aGVyIGZpeGVzOgorCivigKIgQ2hlY2sgZm9yIGxpYnN5c3RlbWQgZnJvbSBzeXN0ZW1kID49IDIwOSwgZmFsbGluZyBiYWNrIHRvCisgIHRoZSBvbGRlciBzZXBhcmF0ZSBsaWJyYXJpZXMgaWYgbm90IGZvdW5kIChVbXV0IFRlemR1eWFyIExpbmRza29nLAorICBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIE9uIExpbnV4LCB1c2UgcHJjdGwoKSB0byBkaXNhYmxlIGNvcmUgZHVtcHMgZnJvbSBhIHRlc3QgZXhlY3V0YWJsZQorICB0aGF0IGRlbGliZXJhdGVseSByYWlzZXMgU0lHU0VHViB0byB0ZXN0IGRidXMtZGFlbW9uJ3MgaGFuZGxpbmcKKyAgb2YgdGhhdCBjb25kaXRpb24gKGZkLm8gIzgzNzcyLCBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIEZpeCBjb21waWxhdGlvbiB3aXRoIC0tZW5hYmxlLXN0YXRzIChmZC5vICM4MTA0MywgR2VudG9vICM1MDcyMzI7CisgIEFsYmFuIENyZXF1eSkKKwor4oCiIEltcHJvdmUgZG9jdW1lbnRhdGlvbiBmb3IgcnVubmluZyB0ZXN0cyBvbiBXaW5kb3dzIChmZC5vICM0MTI1MiwKKyAgUmFsZiBIYWJhY2tlcikKKworRC1CdXMgMS44LjYgKDIwMTQtMDYtMDIpCis9PQorCitTZWN1cml0eSBmaXhlczoKKwor4oCiIE9uIExpbnV4IOKJpSAyLjYuMzctcmM0LCBpZiBzZW5kbXNnKCkgZmFpbHMgd2l0aCBFVE9PTUFOWVJFRlMsIHNpbGVudGx5IGRyb3AKKyAgdGhlIG1lc3NhZ2UuIFRoaXMgcHJldmVudHMgYW4gYXR0YWNrIGluIHdoaWNoIGEgbWFsaWNpb3VzIGNsaWVudCBjYW4KKyAgbWFrZSBkYnVzLWRhZW1vbiBkaXNjb25uZWN0IGEgc3lzdGVtIHNlcnZpY2UsIHdoaWNoIGlzIGEgbG9jYWwKKyAgZGVuaWFsIG9mIHNlcnZpY2UuCisgIChmZC5vICM4MDE2MywgQ1ZFLTIwMTQtMzUzMjsgQWxiYW4gQ3JlcXV5KQorCivigKIgVHJhY2sgcmVtYWluaW5nIFVuaXggZmlsZSBkZXNjcmlwdG9ycyBjb3JyZWN0bHkgd2hlbiBtb3JlIHRoYW4gb25lCisgIG1lc3NhZ2UgaW4gcXVpY2sgc3VjY2Vzc2lvbiBjb250YWlucyBmZHMuIFRoaXMgcHJldmVudHMgYW5vdGhlciBhdHRhY2sKKyAgaW4gd2hpY2ggYSBtYWxpY2lvdXMgY2xpZW50IGNhbiBtYWtlIGRidXMtZGFlbW9uIGRpc2Nvbm5lY3QgYSBzeXN0ZW0KKyAgc2VydmljZS4KKyAgKGZkLm8gIzc5Njk0LCBmZC5vICM4MDQ2OSwgQ1ZFLTIwMTQtMzUzMzsgQWxlamFuZHJvIE1hcnTDrW5leiBTdcOhcmV6LAorICBTaW1vbiBNY1ZpdHRpZSwgQWxiYW4gQ3JlcXV5KQorCitPdGhlciBmaXhlczoKKwor4oCiIFdoZW4gZGJ1cy1sYXVuY2ggLS1leGl0LXdpdGgtc2Vzc2lvbiBzdGFydHMgYSBkYnVzLWRhZW1vbiBidXQgdGhlbiBjYW5ub3QKKyAgYXR0YWNoIHRvIGEgc2Vzc2lvbiwga2lsbCB0aGUgZGJ1cy1kYWVtb24gYXMgaW50ZW5kZWQKKyAgKGZkLm8gIzc0Njk4LCDQoNC+0LzQsNC9INCU0L7QvdGH0LXQvdC60L4pCisKK0QtQnVzIDEuOC40ICgyMDE0LTA2LTEwKQorPT0KKworU2VjdXJpdHkgZml4OgorCivigKIgQWxiYW4gQ3JlcXV5IGF0IENvbGxhYm9yYSBMdGQuIGRpc2NvdmVyZWQgYW5kIGZpeGVkIGEgZGVuaWFsLW9mLXNlcnZpY2UKKyAgZmxhdyBpbiBkYnVzLWRhZW1vbiwgcGFydCBvZiB0aGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIG9mIEQtQnVzLgorICBBZGRpdGlvbmFsbHksIGluIGhpZ2hseSB1bnVzdWFsIGVudmlyb25tZW50cyB0aGUgc2FtZSBmbGF3IGNvdWxkIGxlYWQgdG8KKyAgYSBzaWRlIGNoYW5uZWwgYmV0d2VlbiBwcm9jZXNzZXMgdGhhdCBzaG91bGQgbm90IGJlIGFibGUgdG8gY29tbXVuaWNhdGUuCisgIChDVkUtMjAxNC0zNDc3LCBmZC5vICM3ODk3OSkKKworRC1CdXMgMS44LjIgKDIwMTQtMDQtMzApCis9PQorCitUaGUg4oCcbm9ib2R5IHdhbnRzIHJlZOKAnSByZWxlYXNlLgorCitFbmhhbmNlbWVudHM6CisKK+KAoiBpbiB0aGUgQ01ha2UgYnVpbGQgc3lzdGVtLCBhZGQgc29tZSBoaW50cyBmb3IgTGludXggdXNlcnMgY3Jvc3MtY29tcGlsaW5nCisgIFdpbmRvd3MgRC1CdXMgYmluYXJpZXMgdG8gYmUgYWJsZSB0byBydW4gdGVzdHMgdW5kZXIgV2luZQorICAoZmQubyAjNDEyNTIsIFJhbGYgSGFiYWNrZXIpCisKK+KAoiBhZGQgRG9jdW1lbnRhdGlvbiBrZXkgdG8gZGJ1cy5zZXJ2aWNlIChmZC5vICM3NzQ0NywgQ2FtZXJvbiBOb3JtYW4pCisKK0ZpeGVzOgorCivigKIgaW4gImRidXMtdXVpZGdlbiAtLWVuc3VyZSIsIHRyeSB0byBjb3B5IHN5c3RlbWQncyAvZXRjL21hY2hpbmUtaWQKKyAgdG8gL3Zhci9saWIvZGJ1cy9tYWNoaW5lLWlkIGluc3RlYWQgb2YgZ2VuZXJhdGluZyBhbiBlbnRpcmVseSBuZXcgSUQKKyAgKGZkLm8gIzc3OTQxLCBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIGlmIGRidXMtbGF1bmNoIHJlY2VpdmVzIGFuIFggZXJyb3IgdmVyeSBxdWlja2x5LCBkbyBub3Qga2lsbAorICB1bnJlbGF0ZWQgcHJvY2Vzc2VzIChmZC5vICM3NDY5OCwg0KDQvtC80LDQvSDQlNC+0L3Rh9C10L3QutC+KQorCivigKIgb24gV2luZG93cywgYWxsb3cgdXAgdG8gOEsgY29ubmVjdGlvbnMgdG8gdGhlIGRidXMtZGFlbW9uLCBpbnN0ZWFkIG9mIHRoZQorICBwcmV2aW91cyA2NCAoZmQubyAjNzEyOTc7IENyaXN0aWFuIE9uZXQsIFJhbGYgSGFiYWNrZXIpCisKK+KAoiBjb3BlIHdpdGggXHJcbiBuZXdsaW5lcyBpbiByZWdyZXNzaW9uIHRlc3RzLCBzaW5jZSBvbiBXaW5kb3dzLAorICBkYnVzLWRhZW1vbi5leGUgdXNlcyB0ZXh0IG1vZGUgKGZkLm8gIzc1ODYzLCDQoNGD0YHQu9Cw0L0g0JjQttCx0YPQu9Cw0YLQvtCyKQorCitELUJ1cyAxLjguMCAoMjAxNC0wMS0yMCkKKz09CisKK1RoZSDigJxXb2x2ZXJpbmUgZGlzdHJ1c3RzIG15IHByaW50ZXLigJ0gcmVsZWFzZS4KKworVGhpcyBzdGFydHMgYSBuZXcgc3RhYmxlIGJyYW5jaC4gVGhlIDEuNi54IGJyYW5jaCBpcyBub3cgY29uc2lkZXJlZCB0byBiZQorb3V0ZGF0ZWQsIGFuZCB3aWxsIG9ubHkgcmVjZWl2ZSBmaXhlcyBmb3Igc2VyaW91cyBidWdzIHN1Y2ggYXMgc2VjdXJpdHkKK2ZsYXdzLiBUaGUgMS40LnggYW5kIDEuMi54IGJyYW5jaGVzIG5vIGxvbmdlciBoYXZlIHVwc3RyZWFtIHN1cHBvcnQgYW5kCithcmUgdW5saWtlbHkgdG8gZ2V0IGFueSBtb3JlIHJlbGVhc2VzLCBidXQgaWYgZGlzdHJpYnV0b3JzIHN0aWxsIG5lZWQgdG8KK3N1cHBvcnQgdGhlbSwgcGxlYXNlIHNoYXJlIHNlY3VyaXR5IHBhdGNoZXMgdmlhIHVwc3RyZWFtLgorCitTdW1tYXJ5IG9mIGNoYW5nZXMgc2luY2UgMS42Lng6CisKK+KAoiBsaWJkYnVzIGFsd2F5cyBiZWhhdmVzIGFzIGlmIGRidXNfdGhyZWFkc19pbml0X2RlZmF1bHQoKSBoYWQgYmVlbiBjYWxsZWQKKyAgKHRocmVhZC1zYWZldHkgYnkgZGVmYXVsdCkKK+KAoiBuZXcgZGJ1cy1ydW4tc2Vzc2lvbiB0b29sLCByZXBsYWNpbmcgY2VydGFpbiBtaXN1c2VzIG9mIGRidXMtbGF1bmNoCivigKIgZGJ1cy1tb25pdG9yIGNhbiB0YWxrIHRvIG91dGRhdGVkIHZlcnNpb25zIG9mIGRidXMtZGFlbW9uIGFnYWluCivigKIgbmV3IG9yZy5mcmVlZGVza3RvcC5EQnVzLkdldENvbm5lY3Rpb25DcmVkZW50aWFscyBtZXRob2QKK+KAoiBHZXRDb25uZWN0aW9uVW5peFByb2Nlc3NJRCBhbHNvIHdvcmtzIGNvcnJlY3RseSBvbiBXaW5kb3dzLCByZXR1cm5pbmcKKyAgdGhlIFdpbmRvd3MgcHJvY2VzcyBJRAor4oCiIEdldENvbm5lY3Rpb25XaW5kb3dzU0lEIHJldHVybnMgdGhlIGNvcnJlY3QgU0lEIG9uIFdpbmRvd3MKK+KAoiBleHBhdCBpcyByZXF1aXJlZCwgbGlieG1sMiBjYW4gbm8gbG9uZ2VyIGJlIHVzZWQgYXMgYSBzdWJzdGl0dXRlCivigKIgdGhlIHVzZXJEQiBjYWNoZSBpcyByZXF1aXJlZCwgYW5kIGNhbm5vdCBiZSBkaXNhYmxlZAor4oCiIGEgNjQtYml0IGludGVnZXIgdHlwZSAoZWl0aGVyIGludCwgbG9uZywgbG9uZyBsb25nIG9yIF9pbnQ2NCkgaXMgcmVxdWlyZWQKK+KAoiBiZXR0ZXIgc3lzdGVtZC1qb3VybmFsZCBpbnRlZ3JhdGlvbiBvbiBMaW51eAor4oCiIGZpeGVkIGxvbmctc3RhbmRpbmcgZmQgYW5kIGFycmF5IGxlYWtzIHdoZW4gZmFpbGluZyB0byBwYXJzZSBhIG1lc3NhZ2UKK+KAoiBmaXhlZCByZWZlcmVuY2VkLWJ1dC1uZXZlci1mcmVlZCBwYXJlbnQgbm9kZXMgKGVmZmVjdGl2ZWx5IG1lbW9yeSBsZWFrcykKKyAgd2hlbiB1c2luZyBjZXJ0YWluIG9iamVjdC1wYXRoIGFsbG9jYXRpb24gcGF0dGVybnMsIG5vdGFibHkgaW4gQXZhaGkKK+KAoiBiZXR0ZXIgZGVmYXVsdHMgZm9yIFdpbmRvd3Mgc3VwcG9ydAor4oCiIGJldHRlciBDTWFrZSBzdXBwb3J0CivigKIgYmV0dGVyIHBvcnRhYmlsaXR5IHRvIG1pbmd3MzIsIEZyZWVCU0QsIE5ldEJTRCwgUU5YIGFuZCBIdXJkCivigKIgdGhlIHNvdXJjZSBsYW5ndWFnZSBmb3IgdGhlIG1hbiBwYWdlcyBpcyBub3cgRG9jYm9vayBYTUwKKworRW5oYW5jZW1lbnRzIHNpbmNlIDEuNy4xMDoKKwor4oCiIEVuaGFuY2UgdGhlIENNYWtlIGJ1aWxkIHN5c3RlbSB0byBjaGVjayBmb3IgR0xpYiBhbmQgY29tcGlsZS9ydW4KKyAgYSBzdWJzZXQgb2YgdGhlIHJlZ3Jlc3Npb24gdGVzdHMgKGZkLm8gIzQxMjUyLCAjNzM0OTU7IFJhbGYgSGFiYWNrZXIpCisKK0ZpeGVzIHNpbmNlIDEuNy4xMDoKKwor4oCiIGRvbid0IHJlbHkgb24gdmFfY29weSgpLCB1c2UgREJVU19WQV9DT1BZKCkgd3JhcHBlciAoZmQubyAjNzI4NDAsCisgIFJhbGYgSGFiYWNrZXIpCisKK+KAoiBmaXggY29tcGlsYXRpb24gb2Ygc3lzdGVtZCBqb3VybmFsIHN1cHBvcnQgb24gb2xkZXIgc3lzdGVtZCB2ZXJzaW9ucyB3aGVyZQorICBzZC1qb3VybmFsLmggZG9lc24ndCBpbmNsdWRlIHN5c2xvZy5oIChmZC5vICM3MzQ1NSwgUmFsZiBIYWJhY2tlcikKKwor4oCiIGZpeCBjb21waWxhdGlvbiBvbiBvbGRlciBNU1ZDIHZlcnNpb25zIGJ5IGluY2x1ZGluZyBzdGRsaWIuaAorICAoZmQubyAjNzM0NTUsIFJhbGYgSGFiYWNrZXIpCisKK+KAoiBBbGxvdyA8YWxsb3dfYW5vbnltb3VzLz4gdG8gYXBwZWFyIGluIGFuIGluY2x1ZGVkIGNvbmZpZ3VyYXRpb24gZmlsZQorICAoZmQubyAjNzM0NzUsIE1hdHQgSG9vc2llcikKKworVGVzdCBiZWhhdmlvdXIgY2hhbmdlcyBzaW5jZSAxLjcuMTA6CisKK+KAoiBJZiB0aGUgdGVzdHMgY3Jhc2ggd2l0aCBhbiBhc3NlcnRpb24gZmFpbHVyZSwgdGhleSBubyBsb25nZXIgZGVmYXVsdCB0bworICBibG9ja2luZyBmb3IgYSBkZWJ1Z2dlciB0byBiZSBhdHRhY2hlZC4gU2V0IERCVVNfQkxPQ0tfT05fQUJPUlQgaW4gdGhlCisgIGVudmlyb25tZW50IGlmIHlvdSB3YW50IHRoZSBvbGQgYmVoYXZpb3VyLgorCivigKIgVG8gaW1wcm92ZSBkZWJ1Z2dhYmlsaXR5LCB0aGUgZGJ1cy1kYWVtb24gYW5kIGRidXMtZGFlbW9uLWVhdmVzZHJvcCB0ZXN0cworICBjYW4gYmUgcnVuIHdpdGggYW4gZXh0ZXJuYWwgZGJ1cy1kYWVtb24gYnkgc2V0dGluZworICBEQlVTX1RFU1RfREFFTU9OX0FERFJFU1MgaW4gdGhlIGVudmlyb25tZW50LiBUZXN0LWNhc2VzIHRoYXQgcmVxdWlyZQorICBhbiB1bnVzdWFsbHktY29uZmlndXJlZCBkYnVzLWRhZW1vbiBhcmUgc2tpcHBlZC4KKworRC1CdXMgMS43LjEwICgyMDE0LTAxLTA2KQorPT0KKworVGhlIOKAnHdlaWdodGVkIGNvbXBhbmlvbiBjdWJl4oCdIHJlbGVhc2UuCisKK1RoaXMgaXMgYSByZWxlYXNlIGNhbmRpZGF0ZSBmb3IgRC1CdXMgMS44LgorCitELUJ1cyBTcGVjaWZpY2F0aW9uIDAuMjM6CisKK+KAoiBkb24ndCByZXF1aXJlIG1lc3NhZ2VzIHdpdGggbm8gSU5URVJGQUNFIHRvIGJlIGRpc3BhdGNoZWQKKyAgKGZkLm8gIzY4NTk3LCBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIGRvY3VtZW50ICJ0Y3A6YmluZD0uLi4iIGFuZCAibm9uY2UtdGNwOmJpbmQ9Li4uIiAoZmQubyAjNzIzMDEsCisgIENoZW5nd2VpIFlhbmcpCisKK+KAoiBkZWZpbmUgImxpc3RlbmFibGUiIGFuZCAiY29ubmVjdGFibGUiIGFkZHJlc3NlcywgYW5kIGRpc2N1c3MKKyAgdGhlIGRpZmZlcmVuY2UgKGZkLm8gIzYxMzAzLCBTaW1vbiBNY1ZpdHRpZSkKKworRW5oYW5jZW1lbnRzOgorCivigKIgc3VwcG9ydCBwcmludGluZyBVbml4IGZpbGUgZGVzY3JpcHRvcnMgaW4gZGJ1cy1zZW5kLCBkYnVzLW1vbml0b3IKKyAgKGZkLm8gIzcwNTkyLCBSb2JlcnQgQW5jZWxsKQorCivigKIgZG9uJ3QgaW5zdGFsbCBzeXN0ZW1kIHVuaXRzIGlmIC0tZGlzYWJsZS1zeXN0ZW1kIGlzIGdpdmVuCisgIChmZC5vICM3MTgxOCwgQ2hlbmd3ZWkgWWFuZykKKworRml4ZXM6CisKK+KAoiBkb24ndCBsZWFrIG1lbW9yeSBvbiBvdXQtb2YtbWVtb3J5IHdoaWxlIGxpc3RpbmcgYWN0aXZhdGFibGUgb3IKKyAgYWN0aXZlIHNlcnZpY2VzIChmZC5vICM3MTUyNiwgUmFkb3NsYXcgUGFqYWspCisKK+KAoiBmaXggdW5kZWZpbmVkIGJlaGF2aW91ciBpbiBhIHJlZ3Jlc3Npb24gdGVzdCAoZmQubyAjNjk5MjQsIERyZWFtTmlrKQorCivigKIgZXNjYXBlIFVuaXggc29ja2V0IGFkZHJlc3NlcyBjb3JyZWN0bHkgKGZkLm8gIzQ2MDEzLCBDaGVuZ3dlaSBZYW5nKQorCivigKIgb24gU0VMaW51eCBzeXN0ZW1zLCBkb24ndCBhc3N1bWUgdGhhdCBTRUNDTEFTU19EQlVTLCBEQlVTX19BQ1FVSVJFX1NWQworICBhbmQgREJVU19fU0VORF9NU0cgYXJlIG51bWVyaWNhbGx5IGVxdWFsIHRvIHRoZWlyIHZhbHVlcyBpbiB0aGUKKyAgcmVmZXJlbmNlIHBvbGljeSAoZmQubyAjODg3MTksIG9zbW9uZCBzdW4pCisKK+KAoiBkZWZpbmUgUFJPQ0VTU19RVUVSWV9MSU1JVEVEX0lORk9STUFUSU9OIGlmIG1pc3NpbmcgZnJvbSBNaW5HVyA8IDQgaGVhZGVycworICAoZmQubyAjNzEzNjYsIE1hdHQgRmlzY2hlcikKKwor4oCiIGRlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOIHRvIGF2b2lkIGNvbmZsaWN0cyBiZXR3ZWVuIHdpbnNvY2suaCBhbmQKKyAgd2luc29jazIuaCAoZmQubyAjNzE0MDUsIE1hdHQgRmlzY2hlcikKKwor4oCiIGRvIG5vdCByZXR1cm4gZmFpbHVyZSBmcm9tIF9kYnVzX3JlYWRfbm9uY2UoKSB3aXRoIG5vIGVycm9yIHNldCwKKyAgcHJldmVudGluZyBhIHBvdGVudGlhbCBjcmFzaCAoZmQubyAjNzIyOTgsIENoZW5nd2VpIFlhbmcpCisKK+KAoiBvbiBCU0Qgc3lzdGVtcywgYXZvaWQgc29tZSBPKDEpLXBlci1wcm9jZXNzIG1lbW9yeSBhbmQgZmQgbGVha3MgaW4ga3F1ZXVlLAorICBwcmV2ZW50aW5nIHRlc3QgZmFpbHVyZXMgKGZkLm8gIzY5MzMyLCBmZC5vICM3MjIxMzsgQ2hlbmd3ZWkgWWFuZykKKwor4oCiIGZpeCB3YXJuaW5nIHNwYW0gb24gSHVyZCBieSBub3QgdHJ5aW5nIHRvIHNldCBTT19SRVVTRUFERFIgb24gVW5peCBzb2NrZXRzLAorICB3aGljaCBkb2Vzbid0IGRvIGFueXRoaW5nIGFueXdheSBvbiBhdCBsZWFzdCBMaW51eCBhbmQgRnJlZUJTRAorICAoZmQubyAjNjk0OTIsIFNpbW9uIE1jVml0dGllKQorCivigKIgZml4IHVzZSBvZiBUQ1Agc29ja2V0cyBvbiBGcmVlQlNEIGFuZCBIdXJkIGJ5IHRvbGVyYXRpbmcgRUlOVkFMIGZyb20KKyAgc2VuZG1zZygpIHdpdGggU0NNX0NSRURTIChyZXRyeWluZyB3aXRoIHBsYWluIHNlbmQoKSksIGFuZCBsb29raW5nCisgIGZvciBjcmVkZW50aWFscyBtb3JlIGNvcnJlY3RseSAoZmQubyAjNjk0OTIsIFNpbW9uIE1jVml0dGllKQorCivigKIgZW5zdXJlIHRoYXQgdGVzdHMgcnVuIHdpdGggYSB0ZW1wb3JhcnkgWERHX1JVTlRJTUVfRElSIHRvIGF2b2lkCisgIGdldHRpbmcgbWl4ZWQgdXAgaW4gWERHL3N5c3RlbWQgInVzZXIgc2Vzc2lvbnMiIChmZC5vICM2MTMwMSwKKyAgU2ltb24gTWNWaXR0aWUpCisKK+KAoiByZWZyZXNoIGNhY2hlZCBwb2xpY3kgcnVsZXMgZm9yIGV4aXN0aW5nIGNvbm5lY3Rpb25zIHdoZW4gYnVzCisgIGNvbmZpZ3VyYXRpb24gY2hhbmdlcyAoZmQubyAjMzk0NjMsIENoZW5nd2VpIFlhbmcpCisKK0QtQnVzIDEuNy44ICgyMDEzLTExLTAxKQorPT0KKworVGhlIOKAnGV4dHJlbWUgaGlsbHPigJ0gcmVsZWFzZS4KKworRGVwZW5kZW5jaWVzOgorCivigKIgSWYgc3lzdGVtZCBzdXBwb3J0IGlzIGVuYWJsZWQsIGxpYnN5c3RlbWQtam91cm5hbCBpcyBub3cgcmVxdWlyZWQuCisKK0VuaGFuY2VtZW50czoKKwor4oCiIFdoZW4gYWN0aXZhdGluZyBhIG5vbi1zeXN0ZW1kIHNlcnZpY2UgdW5kZXIgc3lzdGVtZCwgYW5ub3RhdGUgaXRzCisgIHN0ZG91dC9zdGRlcnIgd2l0aCBpdHMgYnVzIG5hbWUgaW4gdGhlIEpvdXJuYWwuIEtub3duIGxpbWl0YXRpb246CisgIGJlY2F1c2UgdGhlIHNvY2tldCBpcyBvcGVuZWQgYmVmb3JlIGZvcmtpbmcsIHRoZSBwcm9jZXNzIHdpbGwgc3RpbGwgYmUKKyAgbG9nZ2VkIGFzIGlmIGl0IGhhZCBkYnVzLWRhZW1vbidzIHByb2Nlc3MgSUQgYW5kIHVzZXIgSUQuCisgIChmZC5vICM2ODU1OSwgQ2hlbmd3ZWkgWWFuZykKKwor4oCiIERvY3VtZW50IG1vcmUgY29uZmlndXJhdGlvbiBlbGVtZW50cyBpbiBkYnVzLWRhZW1vbigxKQorICAoZmQubyAjNjkxMjUsIENoZW5nd2VpIFlhbmcpCisKK0ZpeGVzOgorCivigKIgRG9uJ3QgbGVhayBzdHJpbmcgYXJyYXlzIG9yIGZkcyBpZiBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJnc192YWxpc3QoKQorICB1bnBhY2tzIHRoZW0gYW5kIHRoZW4gZW5jb3VudGVycyBhbiBlcnJvciAoZmQubyAjMjEyNTksIENoZW5nd2VpIFlhbmcpCisKK+KAoiBJZiBjb21waWxlZCB3aXRoIGxpYmF1ZGl0LCByZXRhaW4gQ0FQX0FVRElUX1dSSVRFIHNvIHdlIGNhbiB3cml0ZQorICBkaXNhbGxvd2VkIG1ldGhvZCBjYWxscyB0byB0aGUgYXVkaXQgbG9nLCBmaXhpbmcgYSByZWdyZXNzaW9uIGluIDEuNy42CisgIChmZC5vICM0OTA2MiwgQ29saW4gV2FsdGVycykKKwor4oCiIHBhdGhfbmFtZXNwYWNlPScvJyBpbiBtYXRjaCBydWxlcyBpbmNvcnJlY3RseSBtYXRjaGVkIG5vdGhpbmc7IGl0CisgIG5vdyBtYXRjaGVzIGV2ZXJ5dGhpbmcuIChmZC5vICM3MDc5OSwgU2ltb24gTWNWaXR0aWUpCisKK0QtQnVzIDEuNy42ICgyMDEzLTEwLTA5KQorPT0KKworVGhlIOKAnENTSSBTaHJld3NidXJ54oCdIHJlbGVhc2UuCisKK0J1aWxkLXRpbWUgY29uZmlndXJhdGlvbiBjaGFuZ2VzOgorCivigKIgRGlyZWN0b3J5IGNoYW5nZSBub3RpZmljYXRpb24gdmlhIGRub3RpZnkgb24gTGludXggaXMgbm8gbG9uZ2VyCisgIHN1cHBvcnRlZDsgaXQgaGFkbid0IGNvbXBpbGVkIHN1Y2Nlc3NmdWxseSBzaW5jZSAyMDEwIGluIGFueSBjYXNlLgorICBJZiB5b3UgZG9uJ3QgaGF2ZSBpbm90aWZ5IChMaW51eCkgb3Iga3F1ZXVlICgqQlNEKSwgeW91IHdpbGwgbmVlZAorICB0byBzZW5kIFNJR0hVUCB0byB0aGUgZGJ1cy1kYWVtb24gd2hlbiBpdHMgY29uZmlndXJhdGlvbiBjaGFuZ2VzLgorICAoZmQubyAjMzMwMDEsIENoZW5nd2VpIFlhbmcpCisKK+KAoiBDb21waWxpbmcgd2l0aCAtLWRpc2FibGUtdXNlcmRiLWNhY2hlIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQ7CisgIGl0IGRpZG4ndCB3b3JrIHNpbmNlIGF0IGxlYXN0IDIwMDgsIGFuZCB3b3VsZCBsZWFkIHRvIGFuIGV4dHJlbWVseQorICBzbG93IGRidXMtZGFlbW9uIGV2ZW4gaXQgd29ya2VkLiAoZmQubyAjMTU1ODksICMxNzEzMywgIzY2OTQ3OworICBDaGVuZ3dlaSBZYW5nKQorCivigKIgVGhlIERCVVNfRElTQUJMRV9BU1NFUlRTIENNYWtlIG9wdGlvbiBkaWRuJ3QgYWN0dWFsbHkgZGlzYWJsZSBtb3N0CisgIGFzc2VydGlvbnMuIEl0IGhhcyBiZWVuIHJlbmFtZWQgdG8gREJVU19ESVNBQkxFX0FTU0VSVCB0byBiZSBjb25zaXN0ZW50CisgIHdpdGggdGhlIEF1dG90b29scyBidWlsZCBzeXN0ZW0uIChmZC5vICM2NjE0MiwgQ2hlbmd3ZWkgWWFuZykKKwor4oCiIC0td2l0aC12YWxncmluZD1hdXRvIGVuYWJsZXMgVmFsZ3JpbmQgaW5zdHJ1bWVudGF0aW9uIGlmIGFuZCBvbmx5IGlmCisgIHZhbGdyaW5kIGhlYWRlcnMgYXJlIGF2YWlsYWJsZS4gVGhlIGRlZmF1bHQgaXMgc3RpbGwgLS13aXRoLXZhbGdyaW5kPW5vLgorICAoZmQubyAjNTY5MjUsIFNpbW9uIE1jVml0dGllKQorCitEZXBlbmRlbmNpZXM6CisKK+KAoiBQbGF0Zm9ybXMgd2l0aCBubyA2NC1iaXQgaW50ZWdlciB0eXBlIGFyZSBubyBsb25nZXIgc3VwcG9ydGVkLgorICAoZmQubyAjNjU0MjksIFNpbW9uIE1jVml0dGllKQorCivigKIgR05VIG1ha2UgaXMgbm93IChkb2N1bWVudGVkIHRvIGJlKSByZXF1aXJlZC4gKGZkLm8gIzQ4Mjc3LCBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIEZ1bGwgdGVzdCBjb3ZlcmFnZSBubyBsb25nZXIgcmVxdWlyZXMgZGJ1cy1nbGliLCBhbHRob3VnaCB0aGUgdGVzdHMgZG8gbm90CisgIGV4ZXJjaXNlIHRoZSBzaGFyZWQgbGlicmFyeSAob25seSBhIHN0YXRpYyBjb3B5KSBpZiBkYnVzLWdsaWIgaXMgbWlzc2luZy4KKyAgKGZkLm8gIzY4ODUyLCBTaW1vbiBNY1ZpdHRpZSkKKworRW5oYW5jZW1lbnRzOgorCivigKIgRC1CdXMgU3BlY2lmaWNhdGlvbiAwLjIyCisgIMK3IERvY3VtZW50IEdldEFkdEF1ZGl0U2Vzc2lvbkRhdGEoKSBhbmQKKyAgICBHZXRDb25uZWN0aW9uU0VMaW51eFNlY3VyaXR5Q29udGV4dCgpIChmZC5vICM1NDQ0NSwgU2ltb24pCisgIMK3IEZpeCBleGFtcGxlIC5zZXJ2aWNlIGZpbGUgKGZkLm8gIzY2NDgxLCBDaGVuZ3dlaSBZYW5nKQorICDCtyBEb24ndCBjbGFpbSBELUJ1cyBpcyAibG93LWxhdGVuY3kiIChsb3dlciB0aGFuIHdoYXQ/KSwganVzdAorICAgIGdpdmUgZmFjdHVhbCBzdGF0ZW1lbnRzIGFib3V0IGl0IHN1cHBvcnRpbmcgYXN5bmMgdXNlCisgICAgKGZkLm8gIzY1MTQxLCBKdXN0aW4gTGVlKQorICDCtyBEb2N1bWVudCB0aGUgY29udGVudHMgb2YgLnNlcnZpY2UgZmlsZXMsIGFuZCB0aGUgZmFjdCB0aGF0CisgICAgc3lzdGVtIHNlcnZpY2VzJyBmaWxlbmFtZXMgYXJlIGNvbnN0cmFpbmVkCisgICAgKGZkLm8gIzY2NjA4OyBTaW1vbiBNY1ZpdHRpZSwgQ2hlbmd3ZWkgWWFuZykKKwor4oCiIEJlIHRocmVhZC1zYWZlIGJ5IGRlZmF1bHQgb24gYWxsIHBsYXRmb3JtcywgZXZlbiBpZgorICBkYnVzX3RocmVhZHNfaW5pdF9kZWZhdWx0KCkgaGFzIG5vdCBiZWVuIGNhbGxlZC4gRm9yIGNvbXBhdGliaWxpdHkgd2l0aAorICBvbGRlciBsaWJkYnVzLCBsaWJyYXJ5IHVzZXJzIHNob3VsZCBjb250aW51ZSB0byBjYWxsCisgIGRidXNfdGhyZWFkc19pbml0X2RlZmF1bHQoKTogaXQgaXMgaGFybWxlc3MgdG8gZG8gc28uCisgIChmZC5vICM1NDk3MiwgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBBZGQgR2V0Q29ubmVjdGlvbkNyZWRlbnRpYWxzKCkgbWV0aG9kIChmZC5vICM1NDQ0NSwgU2ltb24pCisKK+KAoiBOZXcgQVBJOiBkYnVzX3NldGVudigpLCBhIHNpbXBsZSB3cmFwcGVyIGFyb3VuZCBzZXRlbnYoKS4KKyAgTm90ZSB0aGF0IHRoaXMgaXMgbm90IHRocmVhZC1zYWZlLiAoZmQubyAjMzkxOTYsIFNpbW9uKQorCivigKIgQWRkIGRidXMtc2VuZCAtLXBlZXI9QUREUkVTUyAoY29ubmVjdCB0byBhIGdpdmVuIHBlZXItdG8tcGVlciBjb25uZWN0aW9uLAorICBsaWtlIC0tYWRkcmVzcz1BRERSRVNTIGluIHByZXZpb3VzIHZlcnNpb25zKSBhbmQgZGJ1cy1zZW5kIC0tYnVzPUFERFJFU1MKKyAgKGNvbm5lY3QgdG8gYSBnaXZlbiBidXMsIGxpa2UgZGJ1cy1tb25pdG9yIC0tYWRkcmVzcz1BRERSRVNTKS4KKyAgZGJ1cy1zZW5kIC0tYWRkcmVzcyBzdGlsbCBleGlzdHMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LAorICBidXQgaXMgbm8gbG9uZ2VyIGRvY3VtZW50ZWQuIChmZC5vICM0ODgxNiwgQW5kcmV5IE1hem8pCisKK+KAoiBXaW5kb3dzLXNwZWNpZmljOgorICDCtyAiZGJ1cy1kYWVtb24gLS1ub2ZvcmsiIGlzIGFsbG93ZWQgb24gV2luZG93cyBhZ2Fpbi4gKGZkLm8gIzY4ODUyLAorICAgIFNpbW9uIE1jVml0dGllKQorCitGaXhlczoKKwor4oCiIEF2b2lkIGFuIGluZmluaXRlIGJ1c3ktbG9vcCBpZiBhIHNpZ25hbCBpbnRlcnJ1cHRzIHdhaXRwaWQoKQorICAoZmQubyAjNjg5NDUsIFNpbW9uIE1jVml0dGllKQorCivigKIgQ2xlYW4gdXAgbWVtb3J5IGZvciBwYXJlbnQgbm9kZXMgd2hlbiBvYmplY3RzIGFyZSB1bmV4cG9ydGVkCisgIChmZC5vICM2MDE3NiwgVGhvbWFzIEZpdHpzaW1tb25zKQorCivigKIgTWFrZSBkYnVzX2Nvbm5lY3Rpb25fc2V0X3JvdXRlX3BlZXJfbWVzc2FnZXMoeCwgRkFMU0UpIGJlaGF2ZSBhcworICBkb2N1bWVudGVkLiBQcmV2aW91c2x5LCBpdCBhc3N1bWVkIGl0cyBzZWNvbmQgcGFyYW1ldGVyIHdhcyBUUlVFLgorICAoZmQubyAjNjkxNjUsIENoZW5nd2VpIFlhbmcpCisKK+KAoiBFc2NhcGUgYWRkcmVzc2VzIGNvbnRhaW5pbmcgbm9uLUFTQ0lJIGNoYXJhY3RlcnMgY29ycmVjdGx5CisgIChmZC5vICM1MzQ5OSwgQ2hlbmd3ZWkgWWFuZykKKwor4oCiIERvY3VtZW50IDxzZXJ2aWNlZGlyPiBzZWFyY2ggb3JkZXIgY29ycmVjdGx5IChmZC5vICM2Njk5NCwgQ2hlbmd3ZWkgWWFuZykKKwor4oCiIERvbid0IGNyYXNoIG9uICJkYnVzLXNlbmQgLS1zZXNzaW9uIC8geC55LnoiIHdoaWNoIHJlZ3Jlc3NlZCBpbiAxLjcuNC4KKyAgKGZkLm8gIzY1OTIzLCBDaGVuZ3dlaSBZYW5nKQorCivigKIgSWYgbWFsbG9jKCkgcmV0dXJucyBOVUxMIGluIF9kYnVzX3N0cmluZ19pbml0KCkgb3Igc2ltaWxhciwgZG9uJ3QgZnJlZQorICBhbiBpbnZhbGlkIHBvaW50ZXIgaWYgdGhlIHN0cmluZyBpcyBsYXRlciBmcmVlZCAoZmQubyAjNjU5NTksIENoZW5nd2VpIFlhbmcpCisKK+KAoiBJZiBtYWxsb2MoKSByZXR1cm5zIE5VTEwgaW4gZGJ1c19zZXRfZXJyb3IoKSwgZG9uJ3QgdmFfZW5kKCkgYSB2YV9saXN0CisgIHRoYXQgd2FzIG5ldmVyIHZhX3N0YXJ0KCllZCAoZmQubyAjNjYzMDAsIENoZW5nd2VpIFlhbmcpCisKK+KAoiBmaXggYnVpbGQgZmFpbHVyZSB3aXRoIC0tZW5hYmxlLXN0YXRzIChmZC5vICM2NjAwNCwgQ2hlbmd3ZWkgWWFuZykKKwor4oCiIGZpeCBhIHJlZ3Jlc3Npb24gdGVzdCBvbiBwbGF0Zm9ybXMgd2l0aCBzdHJpY3QgYWxpZ25tZW50IChmZC5vICM2NzI3OSwKKyAgQ29saW4gV2FsdGVycykKKwor4oCiIEF2b2lkIGNhbGxpbmcgZnVuY3Rpb24gcGFyYW1ldGVycyAiaW50ZXJmYWNlIiBzaW5jZSBjZXJ0YWluIFdpbmRvd3MgaGVhZGVycworICBoYXZlIGEgbmFtZXNwYWNlLXBvbGx1dGluZyBtYWNybyBvZiB0aGF0IG5hbWUgKGZkLm8gIzY2NDkzLCBJdmFuIFJvbWFub3YpCisKK+KAoiBBc3NvcnRlZCBEb3h5Z2VuIGZpeGVzIChmZC5vICM2NTc1NSwgQ2hlbmd3ZWkgWWFuZykKKwor4oCiIFZhcmlvdXMgdGhyZWFkLXNhZmV0eSBpbXByb3ZlbWVudHMgdG8gc3RhdGljIHZhcmlhYmxlcyAoZmQubyAjNjg2MTAsCisgIFNpbW9uIE1jVml0dGllKQorCivigKIgTWFrZSAibWFrZSAtaiBjaGVjayIgd29yayAoZmQubyAjNjg4NTIsIFNpbW9uIE1jVml0dGllKQorCivigKIgRml4IGEgTlVMTCBwb2ludGVyIGRlcmVmZXJlbmNlIG9uIGFuIHVubGlrZWx5IGVycm9yIHBhdGgKKyAgKGZkLm8gIzY5MzI3LCBTdmlhdG9zbGF2IENoYWdhZXYpCisKK+KAoiBJbXByb3ZlIHZhbGdyaW5kIG1lbW9yeSBwb29sIHRyYWNraW5nIChmZC5vICM2OTMyNiwKKyAgU3ZpYXRvc2xhdiBDaGFnYWV2KQorCivigKIgRG9uJ3Qgb3Zlci1hbGxvY2F0ZSBtZW1vcnkgaW4gZGJ1cy1tb25pdG9yIChmZC5vICM2OTMyOSwKKyAgU3ZpYXRvc2xhdiBDaGFnYWV2KQorCivigKIgZGJ1cy1tb25pdG9yIGNhbiBtb25pdG9yIGRidXMtZGFlbW9uIDwgMS41LjYgYWdhaW4KKyAgKGZkLm8gIzY2MTA3LCBDaGVuZ3dlaSBZYW5nKQorCivigKIgVW5peC1zcGVjaWZpYzoKKyAgwrcgSWYgYWNjZXB0NCgpIGZhaWxzIHdpdGggRUlOVkFMLCBhcyBpdCBjYW4gb24gb2xkZXIgTGludXgga2VybmVscworICAgIHdpdGggbmV3ZXIgZ2xpYmMsIHRyeSBhY2NlcHQoKSBpbnN0ZWFkIG9mIGdvaW5nIGludG8gYSBidXN5LWxvb3AuCisgICAgKGZkLm8gIzY5MDI2LCBDaGVuZ3dlaSBZYW5nKQorICDCtyBJZiBzb2NrZXQoKSBvciBzb2NrZXRwYWlyKCkgZmFpbHMgd2l0aCBFSU5WQUwgb3IgRVBST1RPVFlQRSwKKyAgICBmb3IgaW5zdGFuY2Ugb24gSHVyZCBvciBvbGRlciBMaW51eCB3aXRoIGEgbmV3IGdsaWJjLCB0cnkgd2l0aG91dAorICAgIFNPQ0tfQ0xPRVhFQy4gKGZkLm8gIzY5MDczOyBQaW5vIFRvc2Nhbm8sIENoZW5nd2VpIFlhbmcpCisgIMK3IEZpeCBhIGZpbGUgZGVzY3JpcHRvciBsZWFrIG9uIGFuIGVycm9yIGNvZGUgcGF0aC4KKyAgICAoZmQubyAjNjkxODIsIFN2aWF0b3NsYXYgQ2hhZ2FldikKKyAgwrcgZGJ1cy1ydW4tc2Vzc2lvbjogY2xlYXIgc29tZSB1bndhbnRlZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMKKyAgICAoZmQubyAjMzkxOTYsIFNpbW9uKQorICDCtyBkYnVzLXJ1bi1zZXNzaW9uOiBjb21waWxlIG9uIEZyZWVCU0QgKGZkLm8gIzY2MTk3LCBDaGVuZ3dlaSBZYW5nKQorICDCtyBEb24ndCBmYWlsIHRoZSBhdXRvbGF1bmNoIHRlc3QgaWYgdGhlcmUgaXMgbm8gRElTUExBWSAoZmQubyAjNDAzNTIsIFNpbW9uKQorICDCtyBVc2UgZGJ1cy1sYXVuY2ggZnJvbSB0aGUgYnVpbGRkaXIgZm9yIHRlc3RpbmcsIG5vdCB0aGUgaW5zdGFsbGVkIGNvcHkKKyAgICAoZmQubyAjMzc4NDksIENoZW5nd2VpIFlhbmcpCisgIMK3IEZpeCBjb21waWxhdGlvbiBpZiB3cml0ZXYoKSBpcyB1bmF2YWlsYWJsZSAoZmQubyAjNjk0MDksCisgICAgVmFzaWxpeSBCYWx5YXNueXkpCisgIMK3IFJlbW92ZSBicm9rZW4gc3VwcG9ydCBmb3IgTE9DQUxfQ1JFRFMgY3JlZGVudGlhbHMgcGFzc2luZywgYW5kCisgICAgZG9jdW1lbnQgd2hlcmUgZWFjaCBjcmVkZW50aWFsLXBhc3Npbmcgc2NoZW1lIGlzIHVzZWQgKGZkLm8gIzYwMzQwLAorICAgIFNpbW9uIE1jVml0dGllKQorICDCtyBNYWtlIGF1dG9nZW4uc2ggd29yayBvbiAqQlNEIGJ5IG5vdCBhc3N1bWluZyBHTlUgY29yZXV0aWxzIGZ1bmN0aW9uYWxpdHkKKyAgICAoZmQubyAjMzU4ODEsICM2OTc4NzsgQ2hlbmd3ZWkgWWFuZykKKyAgwrcgZGJ1cy1tb25pdG9yOiBiZSBwb3J0YWJsZSB0byBOZXRCU0QgKGZkLm8gIzY5ODQyLCBDaGVuZ3dlaSBZYW5nKQorICDCtyBkYnVzLWxhdW5jaDogc3RvcCB1c2luZyBub24tcG9ydGFibGUgYXNwcmludGYgKGZkLm8gIzM3ODQ5LCBTaW1vbikKKyAgwrcgSW1wcm92ZSBlcnJvciByZXBvcnRpbmcgZnJvbSB0aGUgc2V0dWlkIGFjdGl2YXRpb24gaGVscGVyIChmZC5vICM2NjcyOCwKKyAgICBDaGVuZ3dlaSBZYW5nKQorCivigKIgV2luZG93cy1zcGVjaWZpYzoKKyAgwrcgUmVtb3ZlIHVuYXZhaWxhYmxlIGNvbW1hbmQtbGluZSBvcHRpb25zIGZyb20gJ2RidXMtZGFlbW9uIC0taGVscCcKKyAgICAoZmQubyAjNDI0NDEsIFJhbGYgSGFiYWNrZXIpCisgIMK3IEFkZCBzdXBwb3J0IGZvciBsb29raW5nIHVwIGxvY2FsIFRDUHY0IGNsaWVudHMnIGNyZWRlbnRpYWxzIG9uCisgICAgV2luZG93cyBYUCB2aWEgdGhlIHVuZG9jdW1lbnRlZCBBbGxvY2F0ZUFuZEdldFRjcEV4VGFibGVGcm9tU3RhY2sKKyAgICBmdW5jdGlvbiAoZmQubyAjNjYwNjAsIFJhbGYgSGFiYWNrZXIpCisgIMK3IEZpeCBpbnN1ZmZpY2llbnQgZGVwZW5kZW5jeS10cmFja2luZyAoZmQubyAjNjg1MDUsIFNpbW9uIE1jVml0dGllKQorICDCtyBEb24ndCBpbmNsdWRlIHdzcGlhcGkuaCwgZml4aW5nIGEgY29tcGlsZXIgd2FybmluZyAoZmQubyAjNjg4NTIsCisgICAgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBJbnRlcm5hbCBjaGFuZ2VzOgorICDCtyBhZGQgREJVU19FTkFCTEVfQVNTRVJULCBEQlVTX0VOQUJMRV9DSEVDS1MgZm9yIGxlc3MgY29uZnVzaW5nCisgICAgY29uZGl0aW9uYWxzIChmZC5vICM2NjE0MiwgQ2hlbmd3ZWkgWWFuZykKKyAgwrcgaW1wcm92ZSB2ZXJib3NlLW1vZGUgb3V0cHV0IChmZC5vICM2MzA0NywgQ29saW4gV2FsdGVycykKKyAgwrcgY29uc29saWRhdGUgQXV0b3Rvb2xzIGFuZCBDTWFrZSBidWlsZCAoZmQubyAjNjQ4NzUsIFJhbGYgSGFiYWNrZXIpCisgIMK3IGZpeCB2YXJpb3VzIHVudXNlZCB2YXJpYWJsZXMsIHVudXN1YWwgYnVpbGQgY29uZmlndXJhdGlvbnMKKyAgICBldGMuIChmZC5vICM2NTcxMiwgIzY1OTkwLCAjNjYwMDUsICM2NjI1NywgIzY5MTY1LCAjNjk0MTAsICM3MDIxODsKKyAgICBDaGVuZ3dlaSBZYW5nLCBWYXNpbGl5IEJhbHlhc255eSkKKworRC1CdXMgMS43LjQgKDIwMTMtMDYtMTMpCis9PQorCitUaGUg4oCcYnV0IGlzIHlvdXIgdGhyZWFkLXNhZmV0eSB0aHJlYWQtc2FmZT/igJ0gcmVsZWFzZS4KKworU2VjdXJpdHkgZml4ZXM6CisKK+KAoiBDVkUtMjAxMy0yMTY4OiBGaXggbWlzdXNlIG9mIHZhX2xpc3QgdGhhdCBjb3VsZCBiZSB1c2VkIGFzIGEgZGVuaWFsCisgIG9mIHNlcnZpY2UgZm9yIHN5c3RlbSBzZXJ2aWNlcy4gVnVsbmVyYWJpbGl0eSByZXBvcnRlZCBieSBBbGV4YW5kcnUgQ29ybmVhLgorICAoU2ltb24pCisKK0RlcGVuZGVuY2llczoKKwor4oCiIFRoZSBXaW5kb3dzIHZlcnNpb24gb2YgbGliZGJ1cyBub3cgY29udGFpbnMgYSBDKysgc291cmNlIGZpbGUsIHVzZWQKKyAgdG8gcHJvdmlkZSBnbG9iYWwgaW5pdGlhbGl6YXRpb24gd2hlbiB0aGUgbGlicmFyeSBpcyBsb2FkZWQuCisgIGdjYyAobWluZ3cqKSB1c2VycyBzaG91bGQgZW5zdXJlIHRoYXQgZysrIGlzIGFsc28gaW5zdGFsbGVkLgorCivigKIgVGhlIGxpYnhtbDItYmFzZWQgY29uZmlndXJhdGlvbiByZWFkZXIgKHdoaWNoIGhhc24ndCB3b3JrZWQgZm9yIDIuNSB5ZWFycywKKyAgYW5kIHdhcyBuZXZlciB0aGUgcmVjb21tZW5kZWQgb3B0aW9uKSBoYXMgYmVlbiByZW1vdmVkLiBFeHBhdCBpcyBub3cgYQorICBoYXJkIGRlcGVuZGVuY3kuCisKK0VuaGFuY2VtZW50czoKKwor4oCiIEl0IHNob3VsZCBub3cgYmUgc2FmZSB0byBjYWxsIGRidXNfdGhyZWFkc19pbml0X2RlZmF1bHQoKSBmcm9tIGFueSB0aHJlYWQsCisgIGF0IGFueSB0aW1lLiBBdXRob3JzIG9mIGxvYWRhYmxlIG1vZHVsZXMgYW5kIHBsdWdpbnMgdGhhdCB1c2UgbGliZGJ1cworICBzaG91bGQgY29uc2lkZXIgZG9pbmcgc28gZHVyaW5nIGluaXRpYWxpemF0aW9uLgorICAoZmQubyAjNTQ5NzIsIFNpbW9uIE1jVml0dGllKQorCivigKIgSW1wcm92ZSBkYnVzLXNlbmQgZG9jdW1lbnRhdGlvbiBhbmQgY29tbWFuZC1saW5lIHBhcnNpbmcgKGZkLm8gIzY1NDI0LAorICBDaGVuZ3dlaSBZYW5nKQorCitVbml4LXNwZWNpZmljOgorICDCtyBkYnVzLXJ1bi1zZXNzaW9uOiBleHBlcmltZW50YWwgbmV3IHRvb2wgdG8gc3RhcnQgYSB0ZW1wb3JhcnkgRC1CdXMKKyAgICBzZXNzaW9uLCBlLmcuIGZvciByZWdyZXNzaW9uIHRlc3RzIG9yIGEgdGV4dCBjb25zb2xlLCByZXBsYWNpbmcKKyAgICBjZXJ0YWluIHVzZXMgb2YgZGJ1cy1sYXVuY2ggd2hpY2ggd2VyZW4ndCByZWFsbHkgY29ycmVjdAorICAgIChmZC5vICMzOTE5NiwgU2ltb24pCisKK090aGVyIGZpeGVzOgorCivigKIgSW4gZGJ1cy1kYWVtb24sIGRvbid0IGNyYXNoIGlmIGEgLnNlcnZpY2UgZmlsZSBzdGFydHMgd2l0aCBrZXk9dmFsdWUKKyAgKGZkLm8gIzYwODUzLCBDaGVuZ3dlaSBZYW5nKQorCivigKIgVW5peC1zcGVjaWZpYzoKKyAgwrcgRml4IGEgY3Jhc2ggc2ltaWxhciB0byBDVkUtMjAxMy0yMTY4IHRoZSBmaXJzdCB0aW1lIHdlIHRyeSB0byB1c2Ugc3lzbG9nCisgICAgb24gYSBwbGF0Zm9ybSBub3QgZGVmaW5pbmcgTE9HX1BFUlJPUiwgc3VjaCBhcyBTb2xhcmlzIG9yIFFOWC4KKyAgICBUaGlzIHJlZ3Jlc3NlZCBpbiAxLjcuMC4gKFNpbW9uKQorICDCtyBGaXggYW4gYXNzZXJ0aW9uIGZhaWx1cmUgaWYgd2UgdHJ5IHRvIGFjdGl2YXRlIHN5c3RlbWQgc2VydmljZXMgYmVmb3JlCisgICAgc3lzdGVtZCBjb25uZWN0cyB0byB0aGUgYnVzIChmZC5vICM1MDE5OSwgQ2hlbmd3ZWkgWWFuZykKKyAgwrcgQXZvaWQgY29tcGlsZXIgd2FybmluZ3MgZm9yIGlnbm9yaW5nIHRoZSByZXR1cm4gZnJvbSB3cml0ZSgpCisgICAgKENoZW5nd2VpIFlhbmcpCisKK+KAoiBXaW5kb3dzLXNwZWNpZmljOgorICDCtyBVbmRlciBjbWFrZSwgaW5zdGFsbCBydW50aW1lIGxpYnJhcmllcyAoRExMcykgaW50byBiaW4vIGluc3RlYWQgb2YgbGliLworICAgIHNvIHRoYXQgV2luZG93cyBmaW5kcyB0aGVtIChmZC5vICM1OTczMywgUmFsZiBIYWJhY2tlcikKKworRC1CdXMgMS43LjIgKDIwMTMtMDQtMjUpCis9PQorCitUaGUg4oCcb25seSBwYXJ0aWFsbHkgb3BhcXVl4oCdIHJlbGVhc2UuCisKK0NvbmZpZ3VyYXRpb24gY2hhbmdlczoKKwor4oCiIE9uIG5vbi1RTlggVW5peCBwbGF0Zm9ybXMsIHRoZSBkZWZhdWx0IGxpbWl0IG9uIGZkcyBwZXIgbWVzc2FnZSBpbiB0aGUKKyAgc2Vzc2lvbiBidXMgY29uZmlndXJhdGlvbiBoYXMgcmVkdWNlZCBmcm9tIDQwOTYgdG8gMTAyNC4gVGhlIGRlZmF1bHQKKyAgbGltaXQgdXNlZCBvbiB0aGUgc3lzdGVtIGJ1cyB3YXMgYWxyZWFkeSAxMDI0LiBPbiBRTlgsIGJvdGggbGltaXRzIGFyZQorICByZWR1Y2VkIGZ1cnRoZXIsIHRvIDEyOC4KKworRW5oYW5jZW1lbnRzOgorCivigKIgRC1CdXMgU3BlY2lmaWNhdGlvbiAwLjIxCisgIMK3IEZvbGxvd2luZyBVbmljb2RlIENvcnJpZ2VuZHVtICM5LCB0aGUgbm9uY2hhcmFjdGVycyBVK25GRkZFLCBVK25GRkZGLAorICAgIFUrRkREMC4uVStGREVGIGFyZSBhbGxvd2VkIGluIFVURi04IHN0cmluZ3MgYWdhaW4uIChmZC5vICM2MzA3MiwKKyAgICBTaW1vbiBNY1ZpdHRpZSkKKworRml4ZXM6CisKK+KAoiBEaWFnbm9zZSBpbmNvcnJlY3QgdXNlIG9mIGRidXNfY29ubmVjdGlvbl9nZXRfZGF0YSgpIHdpdGggbmVnYXRpdmUgc2xvdAorICAoaS5lLiBiZWZvcmUgYWxsb2NhdGluZyB0aGUgc2xvdCkgcmF0aGVyIHRoYW4gcmV0dXJuaW5nIGp1bmsKKyAgKGZkLm8gIzYzMTI3LCBEYW4gV2lsbGlhbXMpCisKK+KAoiBGaXggYSBjbWFrZSBidWlsZCByZWdyZXNzaW9uIHNpbmNlIDEuNy4wIChmZC5vICM2MzY4MjsgUmFsZiBIYWJhY2tlciwKKyAgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBVbml4LXNwZWNpZmljOgorICDCtyBPbiBMaW51eCwgbGluayBzdWNjZXNzZnVsbHkgd2l0aCBnbGliYyAyLjE3IChmZC5vICM2MzE2NiwgU2ltb24gTWNWaXR0aWUpCivCoCDCtyBVbmRlciBzeXN0ZW1kLCBsb2cgdG8gc3lzbG9nIG9ubHksIG5vdCBzdGRlcnIsIGF2b2lkaW5nIGR1cGxpY2F0aW9uCisgICAgKGZkLm8gIzYxMzk5LCAjMzk5ODc7IENvbGluIFdhbHRlcnMsIERhZ29iZXJ0IE1pY2hlbHNlbikKKyAgwrcgVW5kZXIgc3lzdGVtZCwgcmVtb3ZlIHVubmVjZXNzYXJ5IGRlcGVuZGVuY3kgb24gc3lzbG9nLnNvY2tldAorICAgIChmZC5vICM2MzUzMSwgQ3Jpc3RpYW4gUm9kcsOtZ3VleikKKyAgwrcgSW5jbHVkZSBhbGxvY2EuaCBmb3IgYWxsb2NhKCkgaWYgYXZhaWxhYmxlLCBmaXhpbmcgY29tcGlsYXRpb24gb24KKyAgICBTb2xhcmlzIDEwIChmZC5vICM2MzA3MSwgRGFnb2JlcnQgTWljaGVsc2VuKQorICDCtyBBbGxvdyB1c2Ugb2Ygc3lzdGVtZC1sb2dpbmQgd2l0aG91dCB0aGUgcmVzdCBvZiBzeXN0ZW1kCisgICAgKGZkLm8gIzYyNTg1LCBNYXJ0aW4gUGl0dCkKKyAgwrcgV2hlbiBidWlsdCB3aXRoIENNYWtlLCBsaW5rIHRvIGxpYnJ0IGFuZCB1c2UgdGhlIHJpZ2h0IHBhdGggZm9yCisgICAgbWVpbnByb2MncyBYU0xUIHN0eWxlc2hlZXRzIChmZC5vICM2MTYzNywgUmFsZiBIYWJhY2tlcikKKyAgwrcgUmVkdWNlIHRoZSBkZWZhdWx0IGxpbWl0IG9uIG51bWJlciBvZiBmZHMgcGVyIG1lc3NhZ2UgdG8gMTI4IHVuZGVyCisgICAgUU5YLCB3b3JraW5nIGFyb3VuZCBhbiBhcmJpdHJhcnkgT1MgbGltaXQgKGZkLm8gIzYxMTc2LCBNYXR0IEZpc2NoZXIpCisKK+KAoiBXaW5kb3dzLXNwZWNpZmljOgorICDCtyBEbyBub3QgY2xhaW0gdGhhdCBhbGwgYnVzIGNsaWVudHMgaGF2ZSB0aGUgZGJ1cy1kYWVtb24ncyBjcmVkZW50aWFsczsKKyAgICBwaWNrIHVwIGxvY2FsIFRDUHY0IGNsaWVudHMnIGNyZWRlbnRpYWxzIChwcm9jZXNzIElEIGFuZCBzZWN1cml0eQorICAgIGlkZW50aWZpZXIsIGkuZS4gdXNlcikgdXNpbmcgR2V0RXh0ZW5kZWRUY3BUYWJsZSgpIChmZC5vICM2MTc4NywKKyAgICBSYWxmIEhhYmFja2VyKQorCitELUJ1cyAxLjcuMCAoMjAxMy0wMi0yMikKKz09CisKK1RoZSAiRGlzaW5nZW51b3VzIEFzc2VydGlvbnMiIHJlbGVhc2UuCisKK1RoaXMgaXMgYSBuZXcgZGV2ZWxvcG1lbnQgcmVsZWFzZSwgc3RhcnRpbmcgdGhlIDEuNy54IGJyYW5jaC4gRC1CdXMgMS42CityZW1haW5zIHRoZSByZWNvbW1lbmRlZCB2ZXJzaW9uIGZvciBsb25nLXRlcm0tc3VwcG9ydGVkIGRpc3RyaWJ1dGlvbnMKK29yIHRoZSB1cGNvbWluZyBHTk9NRSAzLjggcmVsZWFzZS4KKworQnVpbGQtdGltZSBjb25maWd1cmF0aW9uIGNoYW5nZXM6CisKK+KAoiBUaGUgLS13aXRoLWRidXMtc2Vzc2lvbi1idXMtZGVmYXVsdC1hZGRyZXNzIGNvbmZpZ3VyZSBvcHRpb24gaXMgbm8gbG9uZ2VyCisgIHN1cHBvcnRlZC4gVXNlIHRoZSBuZXcgLS13aXRoLWRidXMtc2Vzc2lvbi1idXMtY29ubmVjdC1hZGRyZXNzIGFuZAorICAtLXdpdGgtZGJ1cy1zZXNzaW9uLWJ1cy1saXN0ZW4tYWRkcmVzcyBvcHRpb25zIGluc3RlYWQuIE9uIFdpbmRvd3MsIHlvdQorICB1c3VhbGx5IHdhbnQgdGhlbSB0byBoYXZlIHRoZSBzYW1lIGFyZ3VtZW50OyBvbiBVbml4LCB0aGUgZGVmYXVsdHMgYXJlCisgIHVzdWFsbHkgY29ycmVjdC4KKwor4oCiIFNpbWlsYXJseSwgdGhlIERCVVNfU0VTU0lPTl9CVVNfREVGQVVMVF9BRERSRVNTIENNYWtlIHZhcmlhYmxlIGlzIG5vIGxvbmdlcgorICBzdXBwb3J0ZWQ7IHVzZSB0aGUgbmV3IERCVVNfU0VTU0lPTl9CVVNfTElTVEVOX0FERFJFU1MgYW5kCisgIERCVVNfU0VTU0lPTl9CVVNfQ09OTkVDVF9BRERSRVNTIHZhcmlhYmxlcyBpbnN0ZWFkLgorCivigKIgY21ha2UvY3Jvc3MtY29tcGlsZS5zaCBoYXMgYmVlbiByZW1vdmVkLiBJbnN0ZWFkLCBwbGVhc2UgdXNlIGEKKyAgY3Jvc3MtdG9vbGNoYWluIGZpbGUgKC1EQ01BS0VfVE9PTENIQUlOX0ZJTEUpIGFzIGRvY3VtZW50ZWQgYXQKKyAgPGh0dHA6Ly93d3cudnRrLm9yZy9XaWtpL0NNYWtlX0Nyb3NzX0NvbXBpbGluZz47IG9yIHVzZSBBdXRvdG9vbHMKKyAgYXMgZG9jdW1lbnRlZCBpbiAiaW5mbyBhdXRvbWFrZSBDcm9zcy1Db21waWxhdGlvbiIsIGFuZCBzZXQKKyAgUEtHX0NPTkZJR19QQVRIIGFwcHJvcHJpYXRlbHkuCisKK1JlcXVpcmVtZW50czoKKwor4oCiIE1hbiBwYWdlcyBub3cgcmVxdWlyZSB4bWx0byAob3IgZWl0aGVyIHhtbHRvIG9yIG1laW5wcm9jLCBpZiB1c2luZyBDTWFrZSkuCivigKIgbWFuMmh0bWwgaXMgbm8gbG9uZ2VyIHVzZWQuCisKK0VuaGFuY2VtZW50czoKKwor4oCiIEQtQnVzIFNwZWNpZmljYXRpb24gMC4yMAorICDCtyBhY3R1YWxseSBzYXkgdGhhdCAvb3JnL2ZyZWVkZXNrdG9wL0RCdXMgaXMgdGhlIG9iamVjdCB0aGF0CisgICAgaW1wbGVtZW50cyBvLmZkLkRCdXMgKGZkLm8gIzUxODY1LCBDb2xpbiBXYWx0ZXJzKQorICDCtyB2YXJpb3VzIHJlb3JnYW5pc2F0aW9uIGZvciBiZXR0ZXIgY2xhcml0eSAoZmQubyAjMzgyNTIsIFNpbW9uIE1jVml0dGllKQorICDCtyBzdG9wIGNsYWltaW5nIHRoYXQgYWxsIGJhc2ljIHR5cGVzIHdvcmsganVzdCBsaWtlIElOVDMyIChzdHJpbmdzIGRvbid0ISkKKwor4oCiIFRoZSAic291cmNlIGNvZGUiIGZvciB0aGUgbWFuIHBhZ2VzIGlzIG5vdyBEb2Nib29rIFhNTCwgZWxpbWluYXRpbmcKKyAgdGhlIG91dGRhdGVkIGR1cGxpY2F0ZSBjb3BpZXMgdXNlZCB3aGVuIGJ1aWxkaW5nIHdpdGggQ01ha2UuCisgIChmZC5vICM1OTgwNTsgUmFsZiBIYWJhY2tlciwgU2ltb24gTWNWaXR0aWUpCisKK0ZpeGVzOgorCivigKIgSW4gdGhlIGFjdGl2YXRpb24gaGVscGVyLCB3aGVuIGNvbXBpbGVkIGZvciB0ZXN0cywgZG8gbm90IHJlc2V0IHRoZSBzeXN0ZW0KKyAgYnVzIGFkZHJlc3MsIGZpeGluZyB0aGUgcmVncmVzc2lvbiB0ZXN0cy4gKGZkLm8gIzUyMjAyLCBTaW1vbikKKwor4oCiIEZpeCBidWlsZGluZyB3aXRoIFZhbGdyaW5kIDMuOCwgYXQgdGhlIGNvc3Qgb2YgY2F1c2luZyBoYXJtbGVzcyB3YXJuaW5ncworICB3aXRoIFZhbGdyaW5kIDMuNiBvbiBzb21lIGNvbXBpbGVycyAoZmQubyAjNTU5MzIsIEFydW4gUmFnaGF2YW4pCisKK+KAoiBNZXJnZSA8c2VydmljZWhlbHBlcj4gZnJvbSBzeXN0ZW0tbG9jYWwuY29uZiBpZiBuZWNlc3NhcnkgKGZkLm8gIzUxNTYwLAorICBLcnp5c3p0b2YgS29ub3BrbykKKwor4oCiIFVuZGVyIENNYWtlLCBwcmVmZXIgeG1sdG8gb3ZlciBtZWlucHJvYyAoZmQubyAjNTk3MzMsIFJhbGYgSGFiYWNrZXIpCisKK+KAoiBTdG9wIGR1cGxpY2F0aW5nIENNYWtlJ3Mgb3duIGxvZ2ljIHRvIGZpbmQgbGliZXhwYXQKKyAgKGZkLm8gIzU5NzMzLCBSYWxmIEhhYmFja2VyKQorCivigKIgRG9uJ3QgYXNzdW1lIENNYWtlIGhvc3QgYW5kIGJ1aWxkIHN5c3RlbSBhcmUgdGhlIHNhbWUgKGZkLm8gIzU5NzMzLAorICBSYWxmIEhhYmFja2VyKQorCivigKIgQXZvaWQgZGVwcmVjYXRpb24gd2FybmluZ3MgZm9yIEdMaWIgMi4zNSAoZmQubyAjNTk5NzEsIFNpbW9uIE1jVml0dGllKQorCivigKIgVW5peC1zcGVjaWZpYzoKKyAgwrcgQ2hlY2sgZm9yIGZ1bmN0aW9ucyBpbiBsaWJwdGhyZWFkIGNvcnJlY3RseSwgZml4aW5nIGNvbXBpbGF0aW9uIG9uCisgICAgKGF0IGxlYXN0KSBPcGVuQlNEIChmZC5vICM0NzIzOSwgU2ltb24pCisgIMK3IERvbid0IGxlYWsgdGVtcG9yYXJ5IGZkcyBwb2ludGluZyB0byAvZGV2L251bGwgKGZkLm8gIzU2OTI3LAorICAgIE1pY2hlbCBIRVJNSUVSKQorICDCtyBVcGRhdGUgc2QtZGFlbW9uLltjaF0gZnJvbSBzeXN0ZW1kIChmZC5vICM2MDY4MSkKKyAgwrcgQWRkIHBhcnRpYWwgc3VwcG9ydCBmb3IgUU5YIChmZC5vICM2MDMzOSwgZmQubyAjNjExNzY7IE1hdHQgRmlzY2hlcikKKwor4oCiIFdpbmRvd3Mtc3BlY2lmaWM6CisgIMK3IFRoZSBkZWZhdWx0IHNlc3Npb24gYnVzIGxpc3RlbmluZyBhbmQgY29ubmVjdGluZyBhZGRyZXNzIGlzIG5vdworICAgICJhdXRvbGF1bmNoOiIsIHdoaWNoIG1ha2VzIEQtQnVzIG9uIFdpbmRvd3MgaW50ZXJvcGVyYXRlIHdpdGggaXRzZWxmCisgICAgYW5kIEdEQnVzICJvdXQgb2YgdGhlIGJveCIuIFVzZSB0aGUgY29uZmlndXJlIG9wdGlvbnMgYW5kIGNtYWtlIHZhcmlhYmxlcworICAgIGRlc2NyaWJlZCBhYm92ZSBpZiB5b3UgcmVxdWlyZSBhIGRpZmZlcmVudCBhdXRvbGF1bmNoIHNjb3BlLgorICAgIChmZC5vICMzODIwMSwgU2ltb24gTWNWaXR0aWUpCisgIMK3IEF2b2lkIGEgQ01ha2Ugd2FybmluZyB1bmRlciBDeWd3aW4gKGZkLm8gIzU5NDAxLCBSYWxmIEhhYmFja2VyKQorCivigKIgQ3JlYXRlIHNlc3Npb24uZCwgc3lzdGVtLmQgZGlyZWN0b3JpZXMgdW5kZXIgQ01ha2UgKGZkLm8gIzQxMzE5LAorICBSYWxmIEhhYmFja2VyKQorCitELUJ1cyAxLjYuOCAoMjAxMi0wOS0yOCkKKz09CisKK1RoZSAiRml4IG9uZSB0aGluZywgYnJlYWsgYW5vdGhlciIgcmVsZWFzZS4KKwor4oCiIEZvbGxvdyB1cCB0byBDVkUtMjAxMi0zNTI0OiBUaGUgYWRkaXRpb25hbCBoYXJkZW5pbmcKKyAgd29yayB0byB1c2UgX19zZWN1cmVfZ2V0ZW52KCkgYXMgYSBmb2xsb3d1cCB0byBidWcgIzUyMjAyCisgIGJyb2tlIGNlcnRhaW4gY29uZmlndXJhdGlvbnMgb2YgZ25vbWUta2V5cmluZy4gIEdpdmVuCisgIHRoZSBkaWZmaWN1bHR5IG9mIG1ha2luZyB0aGlzIHdvcmsgd2l0aG91dCBleHRlbnNpdmUKKyAgY2hhbmdlcyB0byBnbm9tZS1rZXlyaW5nLCB1c2Ugb2YgX19zZWN1cmVfZ2V0ZW52KCkgaXMKKyAgZGVmZXJyZWQuCisKK0QtQnVzIDEuNi42ICgyMDEyLTA5LTI4KQorPT0KKworVGhlICJDbGVhciB0aGUgZW52aXJvbm1lbnQgaW4geW91ciBzZXR1aWQgYmluYXJpZXMsIHBsZWFzZSIgcmVsZWFzZS4KKwor4oCiIENWRS0yMDEyLTM1MjQ6IERvbid0IGFjY2VzcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgKGZkLm8gIzUyMjAyKQorICBUaGFua3MgdG8gd29yayBhbmQgaW5wdXQgZnJvbSBDb2xpbiBXYWx0ZXJzLCBTaW1vbiBNY1ZpdHRpZSwKKyAgR2VvZmZyZXkgVGhvbWFzLCBhbmQgb3RoZXJzLgor4oCiIFVuaXgtc3BlY2lmaWM6CisgIMK3IEZpeCBjb21waWxhdGlvbiBvbiBTb2xhcmlzIChmZC5vICM1MzI4NiwgSm9uYXRoYW4gUGVya2luKQorICDCtyBXb3JrIGFyb3VuZCBpbnRlcmRlcGVuZGVudCBoZWFkZXJzIG9uIE9wZW5CU0QgYnkgaW5jbHVkaW5nIHN5cy90eXBlcy5oCisgICAgYmVmb3JlIGVhY2ggdXNlIG9mIHN5cy9zb2NrZXQuaCAoZmQubyAjNTQ0MTgsIEJyYWQgU21pdGgpCisKK0QtQnVzIDEuNi40ICgyMDEyLTA3LTE4KQorPT0KKwor4oCiIERldGVjdCB0aGF0IHVzZXJzIGFyZSAiYXQgdGhlIGNvbnNvbGUiIGNvcnJlY3RseSB3aGVuIGNvbmZpZ3VyZWQgd2l0aAorICBhIG5vbi1kZWZhdWx0IHBhdGggc3VjaCBhcyAtLWVuYWJsZS1jb25zb2xlLWF1dGgtZGlyPS9ydW4vY29uc29sZQorICAoZmQubyAjNTE1MjEsIERhdmUgUmVpc25lcikKKwor4oCiIFJlbW92ZSBhbiBpbmNvcnJlY3QgYXNzZXJ0aW9uIGZyb20gREJ1c1RyYW5zcG9ydCAoZmQubyAjNTE2NTcsCisgIFNpbW9uIE1jVml0dGllKQorCivigKIgTWFrZSAtLWVuYWJsZS1kZXZlbG9wZXIgZGVmYXVsdCB0byAibm8iIChyZWdyZXNzaW9uIGluIDEuNi4yOworICBmZC5vICM1MTY1NywgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBXaW5kb3dzLXNwZWNpZmljOgorICDCtyBMYXVuY2ggZGJ1cy1kYWVtb24gY29ycmVjdGx5IGlmIGl0cyBwYXRoIGNvbnRhaW5zIGEgc3BhY2UKKyAgICAoZmQubyAjNDk0NTAsIFdvbGZnYW5nIEJhcm9uKQorCitELUJ1cyAxLjYuMiAoMjAxMi0wNi0yNykKKz09CisKK1RoZSAiSWNlIENhYmJhZ2UiIHJlbGVhc2UuCisKK+KAoiBDaGFuZ2UgaG93IHdlIGNyZWF0ZSAvdmFyL2xpYi9kYnVzIHNvIGl0IHdvcmtzIHVuZGVyIEF1dG9tYWtlID49IDEuMTEuNAorICAoZmQubyAjNTE0MDYsIFNpbW9uIE1jVml0dGllKQorCivigKIgRG9uJ3QgcmV0dXJuIGZyb20gZGJ1c19wZW5kaW5nX2NhbGxfc2V0X25vdGlmeSB3aXRoIGEgbG9jayBoZWxkIG9uIE9PTQorICAoZmQubyAjNTEwMzIsIFNpbW9uIE1jVml0dGllKQorCivigKIgRGlzY29ubmVjdCAiZGV2ZWxvcGVyIG1vZGUiIChhc3NlcnRpb25zLCB2ZXJib3NlIG1vZGUgZXRjLikgZnJvbQorICBBdXRvbWFrZSBtYWludGFpbmVyIG1vZGUuIEQtQnVzIGRldmVsb3BlcnMgc2hvdWxkIG5vdyBjb25maWd1cmUgd2l0aAorICAtLWVuYWJsZS1kZXZlbG9wZXIuIEF1dG9tYWtlIG1haW50YWluZXIgbW9kZSBpcyBub3cgb24gYnkgZGVmYXVsdDsKKyAgZGlzdHJpYnV0aW9ucyBjYW4gZGlzYWJsZSBpdCB3aXRoIC0tZGlzYWJsZS1tYWludGFpbmVyLW1vZGUuCisgIChmZC5vICMzNDY3MSwgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBBdXRvbWF0aWNhbGx5IGRlZmluZSBEQlVTX1NUQVRJQ19CVUlMRCBpbiBzdGF0aWMtb25seSBBdXRvdG9vbHMgYnVpbGRzLAorICBmaXhpbmcgbGlua2luZyB3aGVuIHRhcmdldGluZyBXaW5kb3dzIChmZC5vICMzMzk3Mzsgd2lsbGlhbSwgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBVbml4LXNwZWNpZmljOgorICDCtyBDaGVjayBmb3IgbGlicHRocmVhZCB1bmRlciBDTWFrZSBvbiBVbml4IChmZC5vICM0NzIzNywgU2ltb24gTWNWaXR0aWUpCisKK0QtQnVzIDEuNi4wICgyMDEyLTA2LTA1KQorPT0KKworVGhlIOKAnHNvdWwgb2YgdGhpcyBtYWNoaW5lIGhhcyBpbXByb3ZlZOKAnSByZWxlYXNlLgorCitUaGlzIHZlcnNpb24gc3RhcnRzIGEgbmV3IHN0YWJsZSBicmFuY2ggb2YgRC1CdXM6IG9ubHkgYnVnIGZpeGVzIHdpbGwKK2JlIGFjY2VwdGVkIGludG8gMS42LnguIE90aGVyIGNoYW5nZXMgd2lsbCBub3cgZ28gdG8gdGhlIDEuNy54IGJyYW5jaC4KKworU3VtbWFyeSBvZiBjaGFuZ2VzIHNpbmNlIDEuNC54OgorCivigKIgTmV3IHJlcXVpcmVtZW50cworICDCtyBQVEhSRUFEX01VVEVYX1JFQ1VSU0lWRSBvbiBVbml4CisgIMK3IGNvbXBpbGVyIHN1cHBvcnQgZm9yIDY0LWJpdCBpbnRlZ2VycyAoaW50NjRfdCBvciBlcXVpdmFsZW50KQorCivigKIgRC1CdXMgU3BlY2lmaWNhdGlvbiB2MC4xOQorCivigKIgTmV3IGRidXMtZGFlbW9uIGZlYXR1cmVzCisgIMK3IDxhbGxvdyBvd25fcHJlZml4PSJjb20uZXhhbXBsZS5TZXJ2aWNlIi8+IHJ1bGVzIGFsbG93IHRoZSBzZXJ2aWNlIHRvCisgICAgb3duIG5hbWVzIGxpa2UgY29tLmV4YW1wbGUuU2VydmljZS5JbnN0YW5jZTMKKyAgwrcgb3B0aW9uYWwgc3lzdGVtZCBpbnRlZ3JhdGlvbiB3aGVuIGNoZWNraW5nIGF0X2NvbnNvbGUgcG9saWNpZXMKKyAgwrcgLS1ub3BpZGZpbGUgb3B0aW9uLCBtYWlubHkgZm9yIHVzZSBieSBzeXN0ZW1kCisgIMK3IHBhdGhfbmFtZXNwYWNlIGFuZCBhcmcwbmFtZXNwYWNlIG1heSBhcHBlYXIgaW4gbWF0Y2ggcnVsZXMKKyAgwrcgZWF2ZXNkcm9wcGluZyBpcyBkaXNhYmxlZCB1bmxlc3MgdGhlIG1hdGNoIHJ1bGUgY29udGFpbnMgZWF2ZXNkcm9wPXRydWUKKwor4oCiIE5ldyBwdWJsaWMgQVBJCisgIMK3IGZ1bmN0aW9ucyB0byB2YWxpZGF0ZSB2YXJpb3VzIHN0cmluZyB0eXBlcyAoZGJ1c192YWxpZGF0ZV9wYXRoKCkgZXRjLikKKyAgwrcgZGJ1c190eXBlX2lzX3ZhbGlkKCkKKyAgwrcgREJ1c0Jhc2ljVmFsdWUsIGEgdW5pb24gb2YgZXZlcnkgYmFzaWMgdHlwZQorCivigKIgQnVnIGZpeGVzCisgIMK3IHJlbW92ZWQgYW4gdW5zYWZlIHJlaW1wbGVtZW50YXRpb24gb2YgcmVjdXJzaXZlIG11dGV4ZXMKKyAgwrcgZGJ1cy1kYWVtb24gbm8gbG9uZ2VyIGJ1c3ktbG9vcHMgaWYgaXQgaGFzIGZhciB0b28gbWFueSBmaWxlIGRlc2NyaXB0b3JzCisgIMK3IGRidXMtZGFlbW9uLmV4ZSAtLXByaW50LWFkZHJlc3Mgd29ya3Mgb24gV2luZG93cworICDCtyBhbGwgdGhlIG90aGVyIGJ1ZyBmaXhlcyBmcm9tIDEuNC4yMAorCivigKIgT3RoZXIgbWFqb3IgaW1wbGVtZW50YXRpb24gY2hhbmdlcworICDCtyBvbiBMaW51eCwgZGJ1cy1kYWVtb24gdXNlcyBlcG9sbCBpZiBzdXBwb3J0ZWQsIGZvciBiZXR0ZXIgc2NhbGFiaWxpdHkKKyAgwrcgZGJ1c190aHJlYWRzX2luaXQoKSBpZ25vcmVzIGl0cyBhcmd1bWVudCBhbmQgYmVoYXZlcyBsaWtlCisgICAgZGJ1c190aHJlYWRzX2luaXRfZGVmYXVsdCgpIGluc3RlYWQKKyAgwrcgcmVtb3ZlZCB0aGUgcGVyLWNvbm5lY3Rpb24gbGluayBjYWNoZSwgaW1wcm92aW5nIGRidXMtZGFlbW9uIHBlcmZvcm1hbmNlCisKK+KAoiBEZXZlbG9wZXIgZmVhdHVyZXMKKyAgwrcgb3B0aW9uYWwgVmFsZ3JpbmQgaW5zdHJ1bWVudGF0aW9uICgtLXdpdGgtdmFsZ3JpbmQpCisgIMK3IG9wdGlvbmFsIFN0YXRzIGludGVyZmFjZSBvbiB0aGUgZGJ1cy1kYWVtb24gKC0tZW5hYmxlLXN0YXRzKQorICDCtyBvcHRpb25hbGx5IGFib3J0IHdoZW5ldmVyIG1hbGxvYygpIGZhaWxzICgtLWVuYWJsZS1lbWJlZGRlZC10ZXN0cworICAgIGFuZCBleHBvcnQgREJVU19NQUxMT0NfQ0FOTk9UX0ZBSUw9MSkKKworQ2hhbmdlcyBzaW5jZSAxLjUuMTI6CisKK+KAoiBCZSBtb3JlIGNhcmVmdWwgYWJvdXQgbW9ub3RvbmljIHRpbWUgdnMuIHJlYWwgdGltZSwgZml4aW5nIERCVVNfQ09PS0lFX1NIQTEKKyAgc3BlYy1jb21wbGlhbmNlIChmZC5vICM0ODU4MCwgRGF2aWQgWmV1dGhlbikKKwor4oCiIERvbid0IHVzZSBpbnN0YWxsKDEpIHdpdGhpbiB0aGUgc291cmNlL2J1aWxkIHRyZWVzLCBmaXhpbmcgdGhlIGJ1aWxkIGFzCisgIG5vbi1yb290IHdoZW4gdXNpbmcgT3BlbkJTRCBpbnN0YWxsKDEpIChmZC5vICM0ODIxNywgQW50b2luZSBKYWNvdXRvdCkKKwor4oCiIEFkZCBtaXNzaW5nIGNvbW1hcyBpbiBzb21lIHRjcCBhbmQgbm9uY2UtdGNwIGFkZHJlc3NlcywgYW5kIHJlbW92ZQorICBhbiB1bnVzZWQgZHVwbGljYXRlIGNvcHkgb2YgdGhlIG5vbmNlLXRjcCB0cmFuc3BvcnQgaW4gV2luZG93cyBidWlsZHMKKyAgKGZkLm8gIzQ1ODk2LCBTaW1vbiBNY1ZpdHRpZSkKKworRC1CdXMgMS41LjEyICgyMDEyLTAzLTI3KQorPT0KKworVGhlIOKAnEJpZyBCb29rIG9mIFNjaWVuY2XigJ0gcmVsZWFzZS4KKwor4oCiIEFkZCBwdWJsaWMgQVBJIHRvIHZhbGlkYXRlIHZhcmlvdXMgc3RyaW5nIHR5cGVzOgorICBkYnVzX3ZhbGlkYXRlX3BhdGgoKSwgZGJ1c192YWxpZGF0ZV9pbnRlcmZhY2UoKSwgZGJ1c192YWxpZGF0ZV9tZW1iZXIoKSwKKyAgZGJ1c192YWxpZGF0ZV9lcnJvcl9uYW1lKCksIGRidXNfdmFsaWRhdGVfYnVzX25hbWUoKSwgZGJ1c192YWxpZGF0ZV91dGY4KCkKKyAgKGZkLm8gIzM5NTQ5LCBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIFR1cm4gREJ1c0Jhc2ljVmFsdWUgaW50byBwdWJsaWMgQVBJIHNvIGJpbmRpbmdzIGRvbid0IG5lZWQgdG8gaW52ZW50IHRoZWlyCisgIG93biAidW5pb24gb2YgZXZlcnl0aGluZyIgdHlwZSAoZmQubyAjMTExOTEsIFNpbW9uIE1jVml0dGllKQorCivigKIgRW51bWVyYXRlIGRhdGEgZmlsZXMgaW5jbHVkZWQgaW4gdGhlIGJ1aWxkIHJhdGhlciB0aGFuIHVzaW5nIGZpbmQoMSkKKyAgKGZkLm8gIzMzODQwLCBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIEFkZCBzdXBwb3J0IGZvciBwb2xpY3kgcnVsZXMgbGlrZSA8YWxsb3cgb3duX3ByZWZpeD0iY29tLmV4YW1wbGUuU2VydmljZSIvPgorICBpbiBkYnVzLWRhZW1vbiAoZmQubyAjNDYyNzMsIEFsYmFuIENyZXF1eSkKKwor4oCiIFdpbmRvd3Mtc3BlY2lmaWM6CisgIMK3IG1ha2UgZGJ1cy1kYWVtb24uZXhlIC0tcHJpbnQtYWRkcmVzcyAoYW5kIC0tcHJpbnQtcGlkKSB3b3JrIGFnYWluCisgICAgb24gV2luMzIsIGJ1dCBub3Qgb24gV2luQ0UgKGZkLm8gIzQ2MDQ5LCBTaW1vbiBNY1ZpdHRpZSkKKyAgwrcgZml4IGR1cGxpY2F0ZSBjYXNlIHZhbHVlIHdoZW4gY29tcGlsaW5nIGFnYWluc3QgbWluZ3ctdzY0CisgICAgKGZkLm8gIzQ3MzIxLCBBbmRvbmkgTW9yYWxlcyBBbGFzdHJ1ZXkpCisKK0QtQnVzIDEuNS4xMCAoMjAxMi0wMi0yMSkKKz09CisKK1RoZSAiZmlyZSBpbiBEZWxlcml1bSIgcmVsZWFzZS4KKworT24gVW5peCBwbGF0Zm9ybXMsIFBUSFJFQURfTVVURVhfUkVDVVJTSVZFIChhcyBzcGVjaWZpZWQgaW4gUE9TSVggMjAwOCBCYXNlCithbmQgU1VTdjIpIGlzIG5vdyByZXF1aXJlZC4KKwor4oCiIEQtQnVzIFNwZWNpZmljYXRpb24gMC4xOToKKyAgwrcgRm9ybWFsbHkgZGVmaW5lIHVuaXF1ZSBjb25uZWN0aW9uIG5hbWVzIGFuZCB3ZWxsLWtub3duIGJ1cyBuYW1lcywKKyAgICBhbmQgZG9jdW1lbnQgYmVzdCBwcmFjdGljZXMgZm9yIGludGVyZmFjZSwgYnVzLCBtZW1iZXIgYW5kIGVycm9yIG5hbWVzLAorICAgIGFuZCBvYmplY3QgcGF0aHMgKGZkLm8gIzM3MDk1LCBTaW1vbiBNY1ZpdHRpZSkKKyAgwrcgRG9jdW1lbnQgdGhlIHNlYXJjaCBwYXRoIGZvciBzZXNzaW9uIGFuZCBzeXN0ZW0gc2VydmljZXMgb24gVW5peCwgYW5kCisgICAgd2hlcmUgdGhleSBzaG91bGQgYmUgaW5zdGFsbGVkIGJ5IGJ1aWxkIHN5c3RlbXMgKGZkLm8gIzIxNjIwLCBmZC5vICMzNTMwNjsKKyAgICBTaW1vbiBNY1ZpdHRpZSkKKyAgwrcgRG9jdW1lbnQgdGhlIHN5c3RlbWQgdHJhbnNwb3J0IChmZC5vICMzNTIzMiwgTGVubmFydCBQb2V0dGVyaW5nKQorCivigKIgTWFrZSBkYnVzX3RocmVhZHNfaW5pdCgpIHVzZSB0aGUgc2FtZSBidWlsdC1pbiB0aHJlYWRpbmcgaW1wbGVtZW50YXRpb24KKyAgYXMgZGJ1c190aHJlYWRzX2luaXRfZGVmYXVsdCgpOyB0aGUgdXNlci1zcGVjaWZpZWQgcHJpbWl0aXZlcyB0aGF0IGl0CisgIHRha2VzIGFzIGEgcGFyYW1ldGVyIGFyZSBub3cgaWdub3JlZCAoZmQubyAjNDM3NDQsIFNpbW9uIE1jVml0dGllKQorCivigKIgQWxsb3cgYWxsIGNvbmZpZ3VyZWQgYXV0aCBtZWNoYW5pc21zLCBub3QganVzdCBvbmUgKGZkLm8gIzQ1MTA2LAorICBQYXZlbCBTdHJhc2hraW4pCisKK+KAoiBJbXByb3ZlIGNtYWtlIGJ1aWxkIHN5c3RlbSAoUmFsZiBIYWJhY2tlcik6CisgIMK3IHNpbXBsaWZ5IFhNTCBwYXJzZXIgZGVwZW5kZW5jaWVzIChmZC5vICM0MTAyNykKKyAgwrcgZ2VuZXJhdGUgYnVpbGQgdGltZXN0YW1wIChmZC5vICM0MTAyOSkKKyAgwrcgb25seSBjcmVhdGUgYmF0Y2ggZmlsZXMgb24gV2luZG93cworICDCtyBmaXggb3B0aW9uIGFuZCBjYWNoZSBzeW50YXgKKyAgwrcgYWRkIGhlbHAtb3B0aW9ucyB0YXJnZXQKKyAgwrcgc2hhcmUgZGJ1cy1hcmNoLWRlcHMuaC5pbiB3aXRoIGF1dG90b29scyByYXRoZXIgdGhhbiBoYXZpbmcgb3VyCisgICAgb3duIHZlcnNpb24gKGZkLm8gIzQxMDMzKQorCivigKIgQnVpbGQgdGVzdHMgc3VjY2Vzc2Z1bGx5IHdpdGggb2xkZXIgR0xpYiwgYXMgZm91bmQgaW4gZS5nLiBEZWJpYW4gNgorICAoZmQubyAjNDEyMTksIFNpbW9uIE1jVml0dGllKQorCivigKIgQXZvaWQgdXNlIG9mIGRlcHJlY2F0ZWQgR1RocmVhZCBBUEkgKGZkLm8gIzQ0NDEzLCBNYXJ0aW4gUGl0dCkKKwor4oCiIEJ1aWxkIGRvY3VtZW50YXRpb24gY29ycmVjdGx5IGlmIG1hbjJodG1sIGRvZXNuJ3Qgc3VwcG9ydCBmaWxlbmFtZXMgb24KKyAgaXRzIGNvbW1hbmQtbGluZSAoZmQubyAjNDM4NzUsIEphY2sgTmFnZWwpCisKK+KAoiBJbXByb3ZlIHRlc3QgY292ZXJhZ2UuIFRvIGdldCBldmVuIG1vcmUgY292ZXJhZ2UsIHJ1biB0aGUgdGVzdHMgd2l0aAorICBEQlVTX1RFU1RfU0xPVz0xIChmZC5vICMzODI4NSwgIzQyODExOyBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIFJlZHVjZSB0aGUgc2l6ZSBvZiB0aGUgc2hhcmVkIGxpYnJhcnkgYnkgbW92aW5nIGZ1bmN0aW9uYWxpdHkgb25seSB1c2VkCisgIGJ5IGRidXMtZGFlbW9uLCB0ZXN0cyBldGMuIGludG8gdGhlaXIgaW50ZXJuYWwgbGlicmFyeSBhbmQgZGVsZXRpbmcKKyAgdW51c2VkIGNvZGUgKGZkLm8gIzM0OTc2LCAjMzk3NTk7IFNpbW9uIE1jVml0dGllKQorCivigKIgQWRkIGRidXMtZGFlbW9uIC0tbm9waWRmaWxlIG9wdGlvbiwgb3ZlcnJpZGluZyB0aGUgY29uZmlndXJhdGlvbiwgZm9yCisgIHNldHVwcyB3aGVyZSB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIG11c3QgaW5jbHVkZSA8cGlkZmlsZS8+IHRvIGF2b2lkCisgIGJyZWFraW5nIHRyYWRpdGlvbmFsIGluaXQsIGJ1dCB0aGUgcGlkIGZpbGUgaXMgaW4gZmFjdCB1bm5lY2Vzc2FyeTsgdXNlCisgIGl0IHVuZGVyIHN5c3RlbWQgdG8gaW1wcm92ZSBzdGFydHVwIHRpbWUgYSBiaXQgKGZkLm8gIzQ1NTIwLAorICBMZW5uYXJ0IFBvZXR0ZXJpbmcpCisKK+KAoiBPcHRpb25hbGx5IChpZiBjb25maWd1cmVkIC0td2l0aC12YWxncmluZCkgYWRkIGluc3RydW1lbnRhdGlvbiB0byBkZWJ1ZworICBsaWJkYnVzIGFuZCBhc3NvY2lhdGVkIHRvb2xzIG1vcmUgbWVhbmluZ2Z1bGx5IHVuZGVyIFZhbGdyaW5kCisgIChmZC5vICMzNzI4NiwgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBJbXByb3ZlIHRoZSBkYnVzLXNlbmQoMSkgbWFuIHBhZ2UgKGZkLm8gIzE0MDA1LCBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIE1ha2UgZGJ1cy1wcm90b2NvbC5oIGNvbXBhdGlibGUgd2l0aCBDKysxMSAoZmQubyAjNDYxNDcsIE1hcmMgTXV0eikKKwor4oCiIElmIHRlc3RzIGFyZSBlbmFibGVkIGFuZCBEQlVTX01BTExPQ19DQU5OT1RfRkFJTCBpcyBzZXQgaW4gdGhlIGVudmlyb25tZW50LAorICBhYm9ydCBvbiBmYWlsdXJlIHRvIG1hbGxvYygpIChsaWtlIEdMaWIgZG9lcyksIHRvIHR1cm4gcnVuYXdheSBtZW1vcnkgbGVha3MKKyAgaW50byBhIGRlYnVnZ2FibGUgY29yZS1kdW1wIGlmIGEgcmVzb3VyY2UgbGltaXQgaXMgYXBwbGllZCAoZmQubyAjNDEwNDgsCisgIFNpbW9uIE1jVml0dGllKQorCivigKIgRG9uJ3QgY3Jhc2ggaWYgcmVhbGxvYygpIHJldHVybnMgTlVMTCBpbiBhIGRlYnVnIGJ1aWxkIChmZC5vICM0MTA0OCwKKyAgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBVbml4LXNwZWNpZmljOgorICDCtyBSZXBsYWNlIG91ciBicm9rZW4gcmVpbXBsZW1lbnRhdGlvbiBvZiByZWN1cnNpdmUgbXV0ZXhlcywgd2hpY2ggaGFzCisgICAgYmVlbiBicm9rZW4gc2luY2UgMjAwNiwgd2l0aCBhbiBvcmRpbmFyeSBwdGhyZWFkcyByZWN1cnNpdmUgbXV0ZXgKKyAgICAoZmQubyAjNDM3NDQ7IFNpZ211bmQgQXVnZGFsLCBTaW1vbiBNY1ZpdHRpZSkKKyAgwrcgVXNlIGVwb2xsKDcpIGZvciBhIG1vcmUgZWZmaWNpZW50IG1haW4gbG9vcCBpbiBMaW51eDsgZXF1aXZhbGVudCBwYXRjaGVzCisgICAgd2VsY29tZWQgZm9yIG90aGVyIE9TcycgZXF1aXZhbGVudHMgbGlrZSBrcXVldWUsIC9kZXYvcG9sbCwgb3IgU29sYXJpcworICAgIGV2ZW50IHBvcnRzIChmZC5vICMzMzMzNzsgU2ltb24gTWNWaXR0aWUsIFJhbGYgSGFiYWNrZXIpCisgIMK3IFdoZW4gcnVubmluZyB1bmRlciBzeXN0ZW1kLCB1c2UgaXQgaW5zdGVhZCBvZiBDb25zb2xlS2l0IHRvIGNoZWNrCisgICAgd2hldGhlciB0byBhcHBseSBhdF9jb25zb2xlIHBvbGljaWVzIChmZC5vICMzOTYwOSwgTGVubmFydCBQb2V0dGVyaW5nKQorICDCtyBBdm9pZCBhIGhpZ2hseSB1bmxpa2VseSBmZCBsZWFrIChmZC5vICMyOTg4MSwgU2ltb24gTWNWaXR0aWUpCisgIMK3IERvbid0IGNsb3NlIGludmFsaWQgZmQgLTEgaWYgZ2V0YWRkcmluZm8gZmFpbHMgKGZkLm8gIzM3MjU4LCBlWGVDMDAxZXIpCivCoCDCtyBEb24ndCB0b3VjaCB+Ly5kYnVzIGFuZCB+Ly5kYnVzLWtleXJpbmdzIHdoZW4gcnVubmluZyAnbWFrZSBpbnN0YWxsY2hlY2snCisgICAgKGZkLm8gIzQxMjE4LCBTaW1vbiBNY1ZpdHRpZSkKKyAgwrcgU3RvcCBwcmV0ZW5kaW5nIHdlIHJlc3BlY3QgWERHX0RBVEFfRElSUyBmb3Igc3lzdGVtIHNlcnZpY2VzOiB0aGUgbGF1bmNoCisgICAgaGVscGVyIGRvZXNuJ3Qgb2JleSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gYXZvaWQgcHJpdmlsZWdlIGVzY2FsYXRpb24KKyAgICBhdHRhY2tzLCBzbyBtYWtlIHRoZSBzeXN0ZW0gYnVzIGZvbGxvdyB0aGUgc2FtZSBydWxlcworICAgIChmZC5vICMyMTYyMCwgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBXaW5kb3dzLXNwZWNpZmljOgorICDCtyBGaW5kIHRoZSBkYnVzLWRhZW1vbiBleGVjdXRhYmxlIG5leHQgdG8gdGhlIHNoYXJlZCBsaWJyYXJ5IChmZC5vICM0MTU1ODsKKyAgICBKZXNwZXIgRGFtLCBSYWxmIEhhYmFja2VyKQorICDCtyBSZW1vdmUgdGhlIGZhdWx0eSBpbXBsZW1lbnRhdGlvbiBvZiBfZGJ1c19jb25kdmFyX3dha2VfYWxsIChmZC5vICM0NDYwOSwKKyAgICBTaW1vbiBNY1ZpdHRpZSkKKworRC1CdXMgMS41LjggKDIwMTEtMDktMjEpCis9PQorCitUaGUgImNyb3NzLW1ldGVyaW5nIiByZWxlYXNlLgorCitJbiBhZGRpdGlvbiB0byBkZWFkIGNvZGUgcmVtb3ZhbCBhbmQgcmVmYWN0b3JpbmcsIHRoaXMgcmVsZWFzZSBjb250YWlucyBhbGwKK29mIHRoZSBidWdmaXhlcyBmcm9tIDEuNC4xNi4KKwor4oCiIENsZWFuIHVwIGRlYWQgY29kZSwgYW5kIG1ha2UgbW9yZSB3YXJuaW5ncyBmYXRhbCBpbiBkZXZlbG9wbWVudCBidWlsZHMKKyAgKGZkLm8gIzM5MjMxLCBmZC5vICM0MTAxMjsgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBJZiBmdWxsIHRlc3QgY292ZXJhZ2UgaXMgcmVxdWVzdGVkIHZpYSAtLWVuYWJsZS10ZXN0cywgc3RyaWN0bHkgcmVxdWlyZQorICBQeXRob24sIHB5Z29iamVjdCBhbmQgZGJ1cy1weXRob24sIHdoaWNoIGFyZSByZXF1aXJlZCBieSBzb21lIHRlc3RzOyBpZiBub3QsCisgIGFuZCBQeXRob24gaXMgbWlzc2luZywgc2tpcCB0aG9zZSB0ZXN0cyByYXRoZXIgdGhhbiBmYWlsaW5nCisgIChmZC5vICMzNzg0NywgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBXaGVuIHVzaW5nIGNtYWtlLCBwcm92aWRlIHRoZSBzYW1lIHZlcnNpb24taW5mbyBBUEkgaW4gdGhlIGluc3RhbGxlZCBoZWFkZXJzCisgIGFzIGZvciBhdXRvdG9vbHMgKERCVVNfVkVSU0lPTiwgZXRjLikgKGZkLm8gIzQwOTA1LCBSYWxmIEhhYmFja2VyKQorCivigKIgQWRkIGEgcmVncmVzc2lvbiB0ZXN0IGZvciBmZC5vICMzODAwNSAoZmQubyAjMzk4MzYsIFNpbW9uIE1jVml0dGllKQorCivigKIgTWFrZSAiTk9DT05GSUdVUkU9MSAuL2F1dG9nZW4uc2giIG5vdCBydW4gY29uZmlndXJlIChDb2xpbiBXYWx0ZXJzKQorCivigKIgQWRkIF9EQlVTX1NUQVRJQ19BU1NFUlQgYW5kIHVzZSBpdCB0byBjaGVjayBpbnZhcmlhbnRzIChmZC5vICMzOTYzNiwKKyAgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBGaXggZHVwbGljYXRlcyBpbiBhdXRob3JzIGxpc3QgKFJhbGYgSGFiYWNrZXIpCisKK+KAoiBGaXggYnJva2VuIGxpbmtzIGZyb20gZGJ1cy10dXRvcmlhbC5odG1sIGlmICQoaHRtbGRpcikgIT0gJChkb2NkaXIpCisgIChmZC5vICMzOTg3OSwgQ2hyaXMgTWF5bykKKwor4oCiIEZpeCBhIHNtYWxsIG1lbW9yeSBsZWFrLCBhbmQgYSBmYWlsdXJlIHRvIHJlcG9ydCBlcnJvcnMsIHdoZW4gdXBkYXRpbmcKKyAgYSBzZXJ2aWNlIGZpbGUgZW50cnkgZm9yIGFjdGl2YXRpb24gKGZkLm8gIzM5MjMwLCBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIFVuaXgtc3BlY2lmaWM6CisgIMK3IENsZWFuIHVwIChub24tYWJzdHJhY3QpIFVuaXggc29ja2V0cyBvbiBidXMgZGFlbW9uIGV4aXQgKGZkLm8gIzM4NjU2OworICAgIEJyaWFuIENhbWVyb24sIFNpbW9uIE1jVml0dGllKQorICDCtyBPbiBzeXN0ZW1zIHRoYXQgdXNlIGxpYmNhcC1uZyBidXQgbm90IHN5c3RlbWQsIGRyb3Agc3VwcGxlbWVudGFsIGdyb3VwcworICAgIHdoZW4gc3dpdGNoaW5nIHRvIHRoZSBkYWVtb24gdXNlciAoUmVkIEhhdCAjNzI2OTUzLCBTdGV2ZSBHcnViYikKKyAgwrcgTWFrZSB0aGUgY21ha2UgYnVpbGQgd29yayBhZ2FpbiBvbiBHTlUgcGxhdGZvcm1zIChmZC5vICMyOTIyOCwKKyAgICBTaW1vbiBNY1ZpdHRpZSkKKyAgwrcgRml4IGNvbXBpbGF0aW9uIG9uIG5vbi1DOTkgc3lzdGVtcyB0aGF0IGhhdmUgaW50dHlwZXMuaCBidXQgbm90IHN0ZGludC5oLAorICAgIGxpa2UgU29sYXJpcyAoZmQubyAjNDAzMTMsIERhZ29iZXJ0IE1pY2hlbHNlbikKKyAgwrcgRGVmaW5lIENNU0dfQUxJR04sIENNU0dfTEVOLCBDTVNHX1NQQUNFIG9uIFNvbGFyaXMgPCAxMAorICAgIChmZC5vICM0MDIzNSwgU2ltb24gTWNWaXR0aWUpCisgIMK3IENvcGUgd2l0aCBVbml4ZXMgdGhhdCBkb24ndCBoYXZlIExPR19QRVJST1IsIGxpa2UgU29sYXJpcyAxMAorICAgIChmZC5vICMzOTk4NywgU2ltb24gTWNWaXR0aWUpCisgIMK3IENvcGUgd2l0aCBwbGF0Zm9ybXMgd2hvc2UgdnNucHJpbnRmIHZpb2xhdGVzIGJvdGggUE9TSVggYW5kIEM5OSwgbGlrZQorICAgIFRydTY0LCBJUklYIGFuZCBIUC1VWCAoZmQubyAjMTE2NjgsIFNpbW9uIE1jVml0dGllKQorCivigKIgV2luZG93cy1zcGVjaWZpYzoKKyAgwrcgRml4IGNvbXBpbGF0aW9uIG9uIE1TVkMsIHdoaWNoIGRvZXNuJ3QgdW5kZXJzdGFuZCAiaW5saW5lIiB3aXRoIGl0cworICAgIEM5OSBtZWFuaW5nIChmZC5vICM0MDAwMDsgUmFsZiBIYWJhY2tlciwgU2ltb24gTWNWaXR0aWUpCisgIMK3IEZpeCBtaXN1c2Ugb2YgR1BpZCBpbiB0ZXN0L2RidXMtZGFlbW9uLmMgKGZkLm8gIzQwMDAzLCBTaW1vbiBNY1ZpdHRpZSkKKyAgwrcgRml4IGNyb3NzLWNvbXBpbGF0aW9uIHRvIFdpbmRvd3Mgd2l0aCBBdXRvbWFrZSAoZmQubyAjNDAwMDMsIFNpbW9uIE1jVml0dGllKQorCitELUJ1cyAxLjUuNiAoMjAxMS0wNy0yOSkKKz09CisKK1RoZSAid2VpcmQsIGdyYXZ5LWxpa2UgYWZ0ZXJ0YXN0ZSIgcmVsZWFzZS4KKworSW4gYWRkaXRpb24gdG8gbmV3IGZlYXR1cmVzIGFuZCByZWZhY3RvcmluZywgdGhpcyByZWxlYXNlIGNvbnRhaW5zIGFsbCBvZiB0aGUKK2J1Z2ZpeGVzIGZyb20gMS40LjE0LgorCitQb3RlbnRpYWxseSBpbmNvbXBhdGlibGUgKEJ1c3RsZSBhbmQgc2ltaWxhciBkZWJ1Z2dpbmcgdG9vbHMgd2lsbCBuZWVkCitjaGFuZ2VzIHRvIHdvcmsgYXMgaW50ZW5kZWQpOgorCivigKIgRG8gbm90IGFsbG93IG1hdGNoIHJ1bGVzIHRvICJlYXZlc2Ryb3AiIChyZWNlaXZlIG1lc3NhZ2VzIGludGVuZGVkIGZvciBhCisgIGRpZmZlcmVudCByZWNpcGllbnQpIGJ5IG1pc3Rha2U6IGVhdmVzZHJvcHBlcnMgbXVzdCBub3cgb3B0LWluIHRvIHRoaXMKKyAgYmVoYXZpb3VyIGJ5IHB1dHRpbmcgImVhdmVzZHJvcD0ndHJ1ZSciIGluIHRoZSBtYXRjaCBydWxlLCB3aGljaCB3aWxsCisgIG5vdCBoYXZlIGFueSBwcmFjdGljYWwgZWZmZWN0IG9uIGJ1c2VzIHdoZXJlIGVhdmVzZHJvcHBpbmcgaXMgbm90IGFsbG93ZWQKKyAgKGZkLm8gIzM3ODkwLCBDb3NpbW8gQWxmYXJhbm8pCisKK090aGVyIGNoYW5nZXM6CisKK+KAoiBELUJ1cyBTcGVjaWZpY2F0aW9uIHZlcnNpb24gMC4xOCAoZmQubyAjMzc4OTAsIGZkLm8gIzM5NDUwLCBmZC5vICMzODI1MjsKKyAgQ29zaW1vIEFsZmFyYW5vLCBTaW1vbiBNY1ZpdHRpZSkKKyAgwrcgYWRkIHRoZSAiZWF2ZXNkcm9wIiBrZXl3b3JkIHRvIG1hdGNoIHJ1bGVzCisgIMK3IGRlZmluZSBlYXZlc2Ryb3BwaW5nLCB1bmljYXN0IG1lc3NhZ2VzIGFuZCBicm9hZGNhc3QgbWVzc2FnZXMKKyAgwrcgc3RvcCBjbGFpbWluZyB0aGF0IG1hdGNoIHJ1bGVzIGFyZSBuZWVkZWQgdG8gbWF0Y2ggdW5pY2FzdCBtZXNzYWdlcyB0byB5b3UKKyAgwrcgcHJvbW90ZSB0aGUgdHlwZSBzeXN0ZW0gdG8gYmUgYSB0b3AtbGV2ZWwgc2VjdGlvbgorCivigKIgVXNlIERCVVNfRVJST1JfT0JKRUNUX1BBVEhfSU5fVVNFIGlmIGRidXNfY29ubmVjdGlvbl90cnlfcmVnaXN0ZXJfb2JqZWN0X3BhdGgKKyAgb3IgZGJ1c19jb25uZWN0aW9uX3RyeV9yZWdpc3Rlcl9mYWxsYmFjayBmYWlscywgbm90IC4uLkFERFJFU1NfSU5fVVNFLAorICBhbmQgc2ltcGxpZnkgb2JqZWN0LXBhdGggcmVnaXN0cmF0aW9uIChmZC5vICMzODg3NCwgSmnFmcOtIEtsaW1lxaEpCisKK+KAoiBDb25zaXN0ZW50bHkgdXNlIGF0b21pYyBvcGVyYXRpb25zIG9uIGV2ZXJ5dGhpbmcgdGhhdCBpcyBldmVyIG1hbmlwdWxhdGVkCisgIHZpYSBhdG9taWMgb3BzLCBhcyB3YXMgZG9uZSBmb3IgY2hhbmdlcyB0byBEQnVzQ29ubmVjdGlvbidzIHJlZmNvdW50IGluCisgIDEuNC4xMiAoZmQubyAjMzgwMDUsIFNpbW9uIE1jVml0dGllKQorCivigKIgRml4IGEgZmlsZSBkZXNjcmlwdG9yIGxlYWsgd2hlbiBjb25uZWN0aW5nIHRvIGEgVENQIHNvY2tldCAoZmQubyAjMzcyNTgsCisgIFNpbW9uIE1jVml0dGllKQorCivigKIgTWFrZSAibWFrZSBjaGVjayIgaW4gYSBjbGVhbiB0cmVlIHdvcmssIGJ5IG5vdCBydW5uaW5nIHRlc3RzIHVudGlsCisgIHRlc3QgZGF0YSBoYXMgYmVlbiBzZXQgdXAgKGZkLm8gIzM0NDA1LCBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIFRoZSBkYnVzLWRhZW1vbiBubyBsb25nZXIgYnVzeS1sb29wcyBpZiBpdCBoYXMgYSB2ZXJ5IGxhcmdlIG51bWJlciBvZiBmaWxlCisgIGRlc2NyaXB0b3JzIChmZC5vICMyMzE5NCwgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBSZWZhY3RvciBtZXNzYWdlIGZsb3cgdGhyb3VnaCBkaXNwYXRjaGluZyB0byBhdm9pZCBsb2NraW5nIHZpb2xhdGlvbnMgaWYKKyAgdGhlIGJ1cyBkYWVtb24ncyBtZXNzYWdlIGxpbWl0IGlzIGhpdDsgcmVtb3ZlIHRoZSBwZXItY29ubmVjdGlvbiBsaW5rIGNhY2hlLAorICB3aGljaCB3YXMgbWVhbnQgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZSwgYnV0IG5vdyByZWR1Y2VzIGl0IChmZC5vICMzNDM5MywKKyAgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBTb21lIGNtYWtlIGZpeGVzIChSYWxmIEhhYmFja2VyKQorCivigKIgUmVtb3ZlIGRlYWQgY29kZSwgbWFpbmx5IGZyb20gREJ1c1N0cmluZyAoZmQubyAjMzg1NzAsIGZkLm8gIzM5NjEwOworICBTaW1vbiBNY1ZpdHRpZSwgTGVubmFydCBQb2V0dGVyaW5nKQorCivigKIgU3RvcCBzdG9yaW5nIHR3byBleHRyYSBieXRlIG9yZGVyIGluZGljYXRvcnMgaW4gZWFjaCBELUJ1cyBtZXNzYWdlCisgIChmZC5vICMzODI4NywgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBBZGQgYW4gb3B0aW9uYWwgU3RhdHMgaW50ZXJmYWNlIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGdldCBzdGF0aXN0aWNzIGZyb20KKyAgYSBydW5uaW5nIGRidXMtZGFlbW9uIGlmIGVuYWJsZWQgYXQgY29uZmlndXJlIHRpbWUgd2l0aCAtLWVuYWJsZS1zdGF0cworICAoZmQubyAjMzQwNDAsIFNpbW9uIE1jVml0dGllKQorCivigKIgRml4IHZhcmlvdXMgdHlwb3MgKGZkLm8gIzI3MjI3LCBmZC5vICMzODI4NDsgU2FzY2hhIFNpbGJlLCBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIERvY3VtZW50YXRpb24gKGZkLm8gIzM2MTU2LCBTaW1vbiBNY1ZpdHRpZSk6CisgIMK3IGxldCB4c2x0cHJvYyBiZSBvdmVycmlkZGVuIGFzIHVzdWFsOiAuL2NvbmZpZ3VyZSBYU0xUUFJPQz1teXhzbHRwcm9jCisgIMK3IGluc3RhbGwgbW9yZSBkb2N1bWVudGF0aW9uIGF1dG9tYXRpY2FsbHksIGluY2x1ZGluZyBtYW4yaHRtbCBvdXRwdXQKKyAgwrcgcHV0IGRidXMuZGV2aGVscCBpbiB0aGUgcmlnaHQgcGxhY2UgKGl0IG11c3QgZ28gaW4gJHtodG1sZGlyfSkKKwor4oCiIFVuaXgtc3BlY2lmaWM6CisgIMK3IGxvb2sgZm9yIHN5c3RlbSBzZXJ2aWNlcyBpbiAvbGliL2RidXMtMS9zeXN0ZW0tc2VydmljZXMgaW4gYWRkaXRpb24gdG8gYWxsCisgICAgdGhlIG90aGVyIHdlbGwta25vd24gbG9jYXRpb25zOyBub3RlIHRoYXQgdGhpcyBzaG91bGQgYWx3YXlzIGJlIC9saWIsCisgICAgZXZlbiBvbiBwbGF0Zm9ybXMgd2hlcmUgc2hhcmVkIGxpYnJhcmllcyBvbiB0aGUgcm9vdCBGUyB3b3VsZCBnbyBpbiAvbGliNjQsCisgICAgL2xpYi94ODZfNjQtbGludXgtZ251IG9yIHNpbWlsYXIgKGZkLm8gIzM1MjI5LCBMZW5uYXJ0IFBvZXR0ZXJpbmcpCisgIMK3IG9wdC1pbiB0byBmZCBwYXNzaW5nIG9uIFNvbGFyaXMgKGZkLm8gIzMzNDY1LCBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIFdpbmRvd3Mtc3BlY2lmaWMgKFJhbGYgSGFiYWNrZXIpOgorICDCtyBmaXggdXNlIG9mIGEgbXV0ZXggZm9yIGF1dG9sYXVuY2ggc2VydmVyIGRldGVjdGlvbgorICDCtyBkb24ndCBjcmFzaCBvbiBtYWxsb2MgZmFpbHVyZSBpbiBfZGJ1c19wcmludGZfc3RyaW5nX3VwcGVyX2JvdW5kCisKK0QtQnVzIDEuNS40ICgyMDExLTA2LTEwKQorPT0KKworU2VjdXJpdHkgKGxvY2FsIGRlbmlhbCBvZiBzZXJ2aWNlKToKKwor4oCiIEJ5dGUtc3dhcCBmb3JlaWduLWVuZGlhbiBtZXNzYWdlcyBjb3JyZWN0bHksIHByZXZlbnRpbmcgYSBsb25nLXN0YW5kaW5nCisgIGxvY2FsIERvUyBpZiBmb3JlaWduLWVuZGlhbiBtZXNzYWdlcyBhcmUgcmVsYXllZCB0aHJvdWdoIHRoZSBkYnVzLWRhZW1vbgorICAoYmFja3BvcnRlcnM6IHRoaXMgaXMgZ2l0IGNvbW1pdCBjMzIyM2JhNmM0MDFiYTgxZGYxMzA1ODUxMzEyYTQ3YzQ4NWU2Y2Q3KQorICAoQ1ZFLTIwMTEtMjIwMCwgZmQubyAjMzgxMjAsIERlYmlhbiAjNjI5OTM4OyBTaW1vbiBNY1ZpdHRpZSkKKworTmV3IHRoaW5nczoKKwor4oCiIFRoZSBjb25zdGFudCB0byB1c2UgZm9yIGFuIGluZmluaXRlIHRpbWVvdXQgbm93IGhhcyBhIG5hbWUsCisgIERCVVNfVElNRU9VVF9JTkZJTklURS4gSXQgaXMgbnVtZXJpY2FsbHkgZXF1aXZhbGVudCB0byAweDdmZmZmZmZmIChJTlQzMl9NQVgpCisgIHdoaWNoIGNhbiBiZSB1c2VkIGZvciBzb3VyY2UgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIHZlcnNpb25zIG9mIGxpYmRidXMuCisKK+KAoiBJZiBHTGliIGFuZCBEQnVzLUdMaWIgYXJlIGFscmVhZHkgaW5zdGFsbGVkLCBtb3JlIHRlc3RzIHdpbGwgYmUgYnVpbHQsCisgIHByb3ZpZGluZyBiZXR0ZXIgY292ZXJhZ2UuIFRoZSBuZXcgdGVzdHMgY2FuIGFsc28gYmUgaW5zdGFsbGVkIHZpYQorICAgICAgLi9jb25maWd1cmUgLS1lbmFibGUtaW5zdGFsbGVkLXRlc3RzCisgIGZvciBzeXN0ZW0gaW50ZWdyYXRpb24gdGVzdGluZywgaWYgcmVxdWlyZWQuIChmZC5vICMzNDU3MCwgU2ltb24gTWNWaXR0aWUpCisKK0NoYW5nZXM6CisKK+KAoiBDb25zaXN0ZW50bHkgdXNlIGF0b21pYyBvcGVyYXRpb25zIGZvciB0aGUgREJ1c0Nvbm5lY3Rpb24ncyByZWZjb3VudCwKKyAgZml4aW5nIHBvdGVudGlhbCB0aHJlYWRpbmcgcHJvYmxlbXMgKGZkLm8gIzM4MDA1LCBTaW1vbiBNY1ZpdHRpZSkKKwor4oCiIERvbid0IHVzZSAtV2wsLS1nYy1zZWN0aW9ucyBieSBkZWZhdWx0OiBpbiBwcmFjdGljZSB0aGUgc2l6ZSBkZWNyZWFzZSBpcworICBzbWFsbCAoMzAwS2lCIG9uIHg4Ni02NCkgYW5kIGl0IGZyZXF1ZW50bHkgZG9lc24ndCB3b3JrIGluIHVudXN1YWwKKyAgdG9vbGNoYWlucy4gVG8gb3B0aW1pemUgZm9yIG1pbmltdW0gaW5zdGFsbGVkIHNpemUsIHlvdSBzaG91bGQgYmVuY2htYXJrCisgIHZhcmlvdXMgcG9zc2liaWxpdGllcyBmb3IgQ0ZMQUdTIGFuZCBMREZMQUdTLCBhbmQgc2V0IHRoZSBiZXN0IGZsYWdzIGZvcgorICB5b3VyIHBhcnRpY3VsYXIgdG9vbGNoYWluIGF0IGNvbmZpZ3VyZSB0aW1lLiAoZmQubyAjMzM0NjYsIFNpbW9uIE1jVml0dGllKQorCivigKIgVXNlICMhL2Jpbi9zaCBmb3IgcnVuLXdpdGgtdG1wLXNlc3Npb24tYnVzLnNoLCBtYWtpbmcgaXQgd29yayBvbiAqQlNECisgIChmZC5vICMzNTg4MCwgVGltb3RoeSBSZWRhZWxsaSkKKwor4oCiIFVzZSBsbiAtZnMgdG8gc2V0IHVwIGRidXMgZm9yIHN5c3RlbWQsIHdoaWNoIHNob3VsZCBmaXggcmVpbnN0YWxsYXRpb24KKyAgd2hlbiBub3QgdXNpbmcgYSBERVNURElSIChmZC5vICMzNzg3MCwgU2ltb24gTWNWaXR0aWUpCisKK+KAoiBXaW5kb3dzLXNwZWNpZmljIGNoYW5nZXM6CisgIMK3IGRvbid0IHRyeSB0byBidWlsZCBkYnVzLWRhZW1vbi1sYXVuY2gtaGVscGVyIChmZC5vICMzNzgzOCwgTWFyayBCcmFuZCkKKworRC1CdXMgMS41LjIgKDIwMTEtMDYtMDEpCis9PQorCitUaGUgIkJvYXIgSHVudGVyIiByZWxlYXNlLgorCitOb3RlcyBmb3IgZGlzdHJpYnV0b3JzOgorCisgIFRoaXMgdmVyc2lvbiBvZiBELUJ1cyBubyBsb25nZXIgdXNlcyAtZlBJRSBieSBkZWZhdWx0LiBEaXN0cmlidXRpb25zIHdpc2hpbmcKKyAgdG8gaGFyZGVuIHRoZSBkYnVzLWRhZW1vbiBhbmQgZGJ1cy1sYXVuY2gtaGVscGVyIGNhbiByZS1lbmFibGUgdGhpcyBpZiB0aGVpcgorICB0b29sY2hhaW4gc3VwcG9ydHMgaXQgcmVsaWFibHksIHZpYSBzb21ldGhpbmcgbGlrZToKKworICAgIC4vY29uZmlndXJlIENGTEFHUz0tZlBJRSBMREZMQUdTPSItcGllIC1XbCwteixyZWxybyIKKworICBvciBieSB1c2luZyBkaXN0cmlidXRpb24tc3BlY2lmaWMgd3JhcHBlcnMgc3VjaCBhcyBEZWJpYW4ncyBoYXJkZW5pbmctd3JhcHBlci4KKworQ2hhbmdlczoKKworICDigKIgRC1CdXMgU3BlY2lmaWNhdGlvbiB2MC4xNworICAgIMK3IFJlc2VydmUgdGhlIGV4dHJhIGNoYXJhY3RlcnMgdXNlZCBpbiBzaWduYXR1cmVzIGJ5IEdWYXJpYW50CisgICAgICAoZmQubyAjMzQ1MjksIFNpbW9uIE1jVml0dGllKQorICAgIMK3IERlZmluZSB0aGUgT2JqZWN0TWFuYWdlciBpbnRlcmZhY2UgKGZkLm8gIzM0ODY5LCBEYXZpZCBaZXV0aGVuKQorICDigKIgRG9uJ3QgZm9yY2UgLWZQSUU6IGRpc3RyaWJ1dGlvbnMgYW5kIGxpYnRvb2wga25vdyBiZXR0ZXIgdGhhbiB3ZSBkbyB3aGV0aGVyCisgICAgaXQncyBkZXNpcmFibGUgKGZkLm8gIzE2NjIxLCBmZC5vICMyNzIxNTsgU2ltb24gTWNWaXR0aWUpCisgIOKAoiBBbGxvdyAtLWRpc2FibGUtZ2Mtc2VjdGlvbnMsIGluIGNhc2UgeW91ciB0b29sY2hhaW4gb2ZmZXJzIHRoZQorICAgIC1mZnVuY3Rpb24tc2VjdGlvbnMsIC1mZGF0YS1zZWN0aW9ucyBhbmQgLVdsLC0tZ2Mtc2VjdGlvbnMgb3B0aW9ucworICAgIGJ1dCB0aGV5J3JlIGJyb2tlbiwgYXMgc2VlbiBvbiBTb2xhcmlzIChmZC5vICMzMzQ2NiwgU2ltb24gTWNWaXR0aWUpCisgIOKAoiBJbnN0YWxsIGRidXMtZGFlbW9uIGFuZCBkYnVzLWRhZW1vbi1sYXVuY2gtaGVscGVyIGluIGEgbW9yZSBub3JtYWwgd2F5CisgICAgKGZkLm8gIzE0NTEyOyBTaW1vbiBNY1ZpdHRpZSwgbG9vc2VseSBiYXNlZCBvbiBhIHBhdGNoIGZyb20gTHVjYSBCYXJiYXRvKQorICDigKIgRW5zdXJlIHRoYXQgbWFpbnRhaW5lcnMgdXBsb2FkIGRvY3VtZW50YXRpb24gd2l0aCB0aGUgcmlnaHQgcGVybWlzc2lvbnMKKyAgICAoZmQubyAjMzYxMzAsIFNpbW9uIE1jVml0dGllKQorICDigKIgRG9uJ3QgZm9yY2UgdXNlcnMgb2YgbGliZGJ1cyB0byBiZSBsaW5rZWQgYWdhaW5zdCAtbHB0aHJlYWQsIC1scnQKKyAgICAoZmQubyAjMzI4MjcsIFNpbW9uIE1jVml0dGllKQorICDigKIgTG9nIHN5c3RlbS1idXMgYWN0aXZhdGlvbiBpbmZvcm1hdGlvbiB0byBzeXNsb2cgKGZkLm8gIzM1NzA1LAorICAgIENvbGluIFdhbHRlcnMpCisgIOKAoiBMb2cgbWVzc2FnZXMgZHJvcHBlZCBkdWUgdG8gcXVvdGFzIHRvIHN5c2xvZyAoZmQubyAjMzUzNTgsCisgICAgU2ltb24gTWNWaXR0aWUpCisgIOKAoiBNYWtlIHRoZSBub25jZS10Y3AgdHJhbnNwb3J0IHdvcmsgb24gVW5peCAoZmQubyAjMzQ1NjksIFNpbW9uIE1jVml0dGllKQorICDigKIgT24gVW5peCwgaWYgL3Zhci9saWIvZGJ1cy9tYWNoaW5lLWlkIGNhbm5vdCBiZSByZWFkLCB0cnkgL2V0Yy9tYWNoaW5lLWlkCisgICAgKGZkLm8gIzM1MjI4LCBMZW5uYXJ0IFBvZXR0ZXJpbmcpCisgIOKAoiBJbiB0aGUgcmVncmVzc2lvbiB0ZXN0cywgZG9uJ3QgcmVwb3J0IGZkcyBhcyAibGVha2VkIiBpZiB0aGV5IHdlcmUgb3BlbgorICAgIG9uIHN0YXJ0dXAgKGZkLm8gIzM1MTczLCBTaW1vbiBNY1ZpdHRpZSkKKyAg4oCiIE1ha2UgZGJ1cy1tb25pdG9yIGJhaWwgb3V0IGlmIGFza2VkIHRvIG1vbml0b3IgbW9yZSB0aGFuIG9uZSBidXMsCisgICAgcmF0aGVyIHRoYW4gc2lsZW50bHkgdXNpbmcgdGhlIGxhc3Qgb25lIChmZC5vICMyNjU0OCwgV2lsbCBUaG9tcHNvbikKKyAg4oCiIENsYXJpZnkgZG9jdW1lbnRhdGlvbiAoZmQubyAjMzUxODIsIFNpbW9uIE1jVml0dGllKQorICDigKIgQ2xlYW4gdXAgbWlub3IgZGVhZCBjb2RlIGFuZCBzb21lIGluY29ycmVjdCBlcnJvciBoYW5kbGluZworICAgIChmZC5vICMzMzEyOCwgZmQubyAjMjk4ODE7IFNpbW9uIE1jVml0dGllKQorICDigKIgQ2hlY2sgdGhhdCBjb21waWxlciBvcHRpb25zIGFyZSBzdXBwb3J0ZWQgYmVmb3JlIHVzaW5nIHRoZW0gKGZkLm8gIzE5NjgxLAorICAgIFNpbW9uIE1jVml0dGllKQorICDigKIgV2luZG93czoKKyAgICDigKIgUmVtb3ZlIG9ic29sZXRlIHdvcmthcm91bmQgZm9yIHdpbmlvY3RsLmggKGZkLm8gIzM1MDgzLCBSYWxmIEhhYmFja2VyKQorCitELUJ1cyAxLjUuMCAoMjAxMS0wNC0xMSkKKz09CisKK1RoZSAieW91IG5ldmVyIGtub3cgd2hlbiB5b3UgbmVlZCB0byB0b3cgc29tZXRoaW5nIGZyb20geW91ciBnaWFudAorZmx5aW5nIHNoYXJrIiByZWxlYXNlLgorCisgIOKAoiBELUJ1cyBTcGVjaWZpY2F0aW9uIHYwLjE2CisgICAgwrcgQWRkIHN1cHBvcnQgZm9yIHBhdGhfbmFtZXNwYWNlIGFuZCBhcmcwbmFtZXNwYWNlIGluIG1hdGNoIHJ1bGVzCisgICAgICAoZmQubyAjMjQzMTcsICMzNDg3MDsgV2lsbCBUaG9tcHNvbiwgRGF2aWQgWmV1dGhlbiwgU2ltb24gTWNWaXR0aWUpCisgICAgwrcgTWFrZSBhcmdOcGF0aCBzdXBwb3J0IG9iamVjdCBwYXRocywgbm90IGp1c3Qgb2JqZWN0LXBhdGgtbGlrZSBzdHJpbmdzLAorICAgICAgYW5kIGRvY3VtZW50IGl0IGJldHRlciAoZmQubyAjMzE4MTgsIFdpbGwgVGhvbXBzb24pCisgIOKAoiBMZXQgdGhlIGJ1cyBkYWVtb24gaW1wbGVtZW50IG1vcmUgdGhhbiBvbmUgaW50ZXJmYWNlIChmZC5vICMzMzc1NywKKyAgICBTaW1vbiBNY1ZpdHRpZSkKKyAg4oCiIE9wdGltaXplIF9kYnVzX3N0cmluZ19yZXBsYWNlX2xlbiB0byByZWR1Y2Ugd2FzdGUgKGZkLm8gIzIxMjYxLAorICAgIFJvYmVydG8gR3VpZG8pCisgIOKAoiBSZXF1aXJlIHVzZXIgaW50ZXJ2ZW50aW9uIHRvIGNvbXBpbGUgd2l0aCBtaXNzaW5nIDY0LWJpdCBzdXBwb3J0CisgICAgKGZkLm8gIzM1MTE0LCBTaW1vbiBNY1ZpdHRpZSkKKyAg4oCiIEFkZCBkYnVzX3R5cGVfaXNfdmFsaWQgYXMgcHVibGljIEFQSSAoZmQubyAjMjA0OTYsIFNpbW9uIE1jVml0dGllKQorICDigKIgUmFpc2UgVW5rbm93bk9iamVjdCBpbnN0ZWFkIG9mIFVua25vd25NZXRob2QgZm9yIGNhbGxzIHRvIG1ldGhvZHMgb24KKyAgICBwYXRocyB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgb2JqZWN0IHRyZWUsIGFuZCBVbmtub3duSW50ZXJmYWNlIGZvciBjYWxscworICAgIHRvIHVua25vd24gaW50ZXJmYWNlcyBpbiB0aGUgYnVzIGRhZW1vbiAoZmQubyAjMzQ1MjcsIExlbm5hcnQgUG9ldHRlcmluZykKKworRC1CdXMgMS40LjggKDIwMTEtMDQtMDgpCis9PQorCitUaGUgIkl0J3MgbGlrZSB0aGUgYmVnaW5uaW5nIG9mIGEgbG9ic3RlciIgcmVsZWFzZS4KKworICDigKIgUmVuYW1lIGNvbmZpZ3VyZS5pbiB0byBjb25maWd1cmUuYWMsIGFuZCB1cGRhdGUgaXQgdG8gbW9kZXJuIGNvbnZlbnRpb25zCisgICAgKGZkLm8gIzMyMjQ1OyBKYXZpZXIgSmFyZMOzbiwgU2ltb24gTWNWaXR0aWUpCisgIOKAoiBDb3JyZWN0bHkgZ2l2ZSBYREdfREFUQV9IT01FIHByaW9yaXR5IG92ZXIgWERHX0RBVEFfRElSUyAoZmQubyAjMzQ0OTYsCisgICAgQW5kZXJzIEthc2VvcmcpCisgIOKAoiBQcmV2ZW50IFgxMSBhdXRvbGF1bmNoaW5nIGlmICRESVNQTEFZIGlzIHVuc2V0IG9yIGVtcHR5LCBhbmQgYWRkCisgICAgLS1kaXNhYmxlLXgxMS1hdXRvbGF1bmNoIGNvbmZpZ3VyZSBvcHRpb24gdG8gcHJldmVudCBpdCBhbHRvZ2V0aGVyCisgICAgaW4gZW1iZWRkZWQgZW52aXJvbm1lbnRzIChmZC5vICMxOTk5NywgTkIjMjE5OTY0OyBTaW1vbiBNY1ZpdHRpZSkKKyAg4oCiIEluc3RhbGwgdGhlIGRvY3VtZW50YXRpb24sIGFuZCBhbiBpbmRleCBmb3IgRGV2aGVscCAoZmQubyAjMTM0OTUsCisgICAgRGViaWFuICM0NTQxNDI7IFNpbW9uIE1jVml0dGllLCBNYXR0aGlhcyBDbGFzZW4pCisgIOKAoiBJZiBjaGVja3MgYXJlIG5vdCBkaXNhYmxlZCwgY2hlY2sgdmFsaWRpdHkgb2Ygc3RyaW5nLWxpa2UgdHlwZXMgYW5kCisgICAgYm9vbGVhbnMgd2hlbiBzZW5kaW5nIHRoZW0gKGZkLm8gIzE2MzM4LCBOQiMyMjMxNTI7IFNpbW9uIE1jVml0dGllKQorICDigKIgQWRkIFVua25vd25PYmplY3QsIFVua25vd25JbnRlcmZhY2UsIFVua25vd25Qcm9wZXJ0eSBhbmQgUHJvcGVydHlSZWFkT25seQorICAgIGVycm9ycyB0byBkYnVzLXNoYXJlZC5oIChmZC5vICMzNDUyNywgTGVubmFydCBQb2V0dGVyaW5nKQorICDigKIgQnJlYWsgdXAgYSBodWdlIGNvbmRpdGlvbmFsIGluIGNvbmZpZy1wYXJzZXIgc28gZ2NvdiBjYW4gcHJvZHVjZSBjb3ZlcmFnZQorICAgIGRhdGEgKGZkLm8gIzEwODg3LCBTaW1vbiBNY1ZpdHRpZSkKKyAg4oCiIExpc3Qgd2hpY2ggcGFydHMgb2YgdGhlIERlc2t0b3AgRW50cnkgc3BlY2lmaWNhdGlvbiBhcmUgYXBwbGljYWJsZSB0bworICAgIC5zZXJ2aWNlIGZpbGVzIChmZC5vICMxOTE1OSwgU3ZlbiBIZXJ6YmVyZykKKyAg4oCiIERvbid0IHN1cHByZXNzIHNlcnZpY2UgYWN0aXZhdGlvbiBpZiB0d28gc2VydmljZXMgaGF2ZSB0aGUgc2FtZSBFeGVjPQorICAgIChmZC5vICMzNTc1MCwgQ29saW4gV2FsdGVycykKKyAg4oCiIFdpbmRvd3M6CisgICAgwrcgQXZvaWQgdGhlIG5hbWUgRUxFTUVOVF9UWVBFIGR1ZSB0byBuYW1lc3BhY2UtcG9sbHV0aW9uIGZyb20gd2luaW9jdGwuaAorICAgICAgKEFuZHJlIEhlaW5lY2tlKQorICAgIMK3IEluY2x1ZGUgX2RidXNfcGF0aF9pc19hYnNvbHV0ZSBpbiBsaWJkYnVzIG9uIFdpbmRvd3MsIGZpeGluZyBjb21waWxhdGlvbgorICAgICAgKGZkLm8gIzMyODA1LCBNYXJrIEJyYW5kKQorCitELUJ1cyAxLjQuNiAoMjAxMC0wMi0xNykKKz09CisKK1RoZSAiMSwgMiwgbWlzcyBhIGZldywgOTksIDEwMCIgcmVsZWFzZS4KKworICDigKIgUmVtb3ZlIHVuZmluaXNoZWQgY2hhbmdlcyBpbnRlbmRlZCB0byBzdXBwb3J0IEdUZXN0LWJhc2VkIHRlc3RzLAorICAgIHdoaWNoIHdlcmUgbWlzdGFrZW5seSBpbmNsdWRlZCBpbiAxLjQuNAorCitELUJ1cyAxLjQuNCAoMjAxMC0wMi0xNykKKz09CisKKyAg4oCiIFN3aXRjaCBiYWNrIHRvIHVzaW5nIGV2ZW4gbWljcm8gdmVyc2lvbnMgZm9yIHN0YWJsZSByZWxlYXNlczsgMS40LjEKKyAgICBzaG91bGQgaGF2ZSBiZWVuIGNhbGxlZCAxLjQuMiwgc28gc2tpcCB0aGF0IHZlcnNpb24gbnVtYmVyCisgIOKAoiBEb24ndCBsZWF2ZSBiYWQgZmlsZSBkZXNjcmlwdG9ycyBiZWluZyB3YXRjaGVkIHdoZW4gc3Bhd25pbmcgcHJvY2Vzc2VzLAorICAgIHdoaWNoIGNvdWxkIHJlc3VsdCBpbiBhIGJ1c3ktbG9vcCAoZmQubyAjMzI5OTIsIE5CIzIwMDI0ODsgcG9zc2libHkKKyAgICBhbHNvIExQIzY1NjEzNCwgTFAjNjgwNDQ0LCBMUCM3MTMxNTcpCisgIOKAoiBDaGVjayBmb3IgTVNHX05PU0lHTkFMIGNvcnJlY3RseQorICDigKIgRml4IGZhaWx1cmUgdG8gZGV0ZWN0IGFic3RyYWN0IHNvY2tldCBzdXBwb3J0IChmZC5vICMyOTg5NSkKKyAg4oCiIE1ha2UgX2RidXNfc3lzdGVtX2xvZ3YgYWN0dWFsbHkgZXhpdCB3aXRoIERCVVNfU1lTVEVNX0xPR19GQVRBTAorICAgIChmZC5vICMzMjI2MiwgTkIjMTgwNDg2KQorICDigKIgSW1wcm92ZSBzb21lIGVycm9yIGNvZGUgcGF0aHMgKGZkLm8gIzI5OTgxLCBmZC5vICMzMjI2NCwgZmQubyAjMzIyNjIsCisgICAgZmQubyAjMzMxMjgsIGZkLm8gIzMzMjc3LCBmZC5vICMzMzEyNiwgTkIjMTgwNDg2KQorICDigKIgQXZvaWQgcG9zc2libGUgc3ltbGluayBhdHRhY2tzIGluIC90bXAgZHVyaW5nIGNvbXBpbGF0aW9uIChmZC5vICMzMjg1NCkKKyAg4oCiIFRpZHkgdXAgZGVhZCBjb2RlIChmZC5vICMyNTMwNiwgZmQubyAjMzMxMjgsIGZkLm8gIzM0MjkyLCBOQiMxODA0ODYpCisgIOKAoiBJbXByb3ZlIGdjYyBtYWxsb2MgYW5ub3RhdGlvbnMgKGZkLm8gIzMyNzEwKQorICDigKIgSWYgdGhlIHN5c3RlbSBidXMgaXMgbGF1bmNoZWQgdmlhIHN5c3RlbWQsIHByb3RlY3QgaXQgZnJvbSB0aGUgT09NIGtpbGxlcgorICDigKIgRG9jdW1lbnRhdGlvbiBpbXByb3ZlbWVudHMgKGZkLm8gIzExMTkwKQorICDigKIgQXZvaWQgcmVhZGRpcl9yLCB3aGljaCBpcyBkaWZmaWN1bHQgdG8gdXNlIGNvcnJlY3RseSAoZmQubyAjODI4NCwKKyAgICBmZC5vICMxNTkyMiwgTFAjMjQxNjE5KQorICDigKIgQ29wZSB3aXRoIGludmFsaWQgZmlsZXMgaW4gc2Vzc2lvbi5kLCBzeXN0ZW0uZCAoZmQubyAjMTkxODYsCisgICAgRGViaWFuICMyMzAyMzEpCisgIOKAoiBEb24ndCBkaXN0cmlidXRlIGdlbmVyYXRlZCBmaWxlcyB0aGF0IGVtYmVkIG91ciBidWlsZGRpciAoZmQubyAjMzAyODUsCisgICAgZmQubyAjMzQyOTIpCisgIOKAoiBSYWlzZSB0aGUgc3lzdGVtIGJ1cydzIGZkIGxpbWl0IHRvIGJlIHN1ZmZpY2llbnQgZm9yIGl0cyBjb25maWd1cmF0aW9uCisgICAgKGZkLm8gIzMzNDc0LCBMUCMzODEwNjMpCisgIOKAoiBGaXggc3lzbG9nIHN0cmluZyBwcm9jZXNzaW5nCisgIOKAoiBJZ25vcmUgLVdhZGRyZXNzCisgIOKAoiBSZW1vdmUgYnJva2VuIGdjb3YgcGFyc2luZyBjb2RlIGFuZCAtLWVuYWJsZS1nY292LCBhbmQgcmVwbGFjZSB0aGVtCisgICAgd2l0aCBsY292IEhUTUwgcmVwb3J0cyBhbmQgLS1lbmFibGUtY29tcGlsZXItY292ZXJhZ2UgKGZkLm8gIzEwODg3KQorICDigKIgV2luZG93czoKKyAgICDCtyBhdm9pZCBsaXZlLWxvY2sgaW4gV2luZG93cyBDRSBkdWUgdG8gdW5mYWlyIGNvbmRpdGlvbiB2YXJpYWJsZXMKKyAg4oCiIE9wZW5CU0Q6CisgICAgwrcgc3VwcG9ydCBjcmVkZW50aWFscy1wYXNzaW5nIChmZC5vICMzMjU0MikKKyAg4oCiIFNvbGFyaXM6CisgICAgwrcgb3B0LWluIHRvIHRocmVhZCBzYWZldHkgKGZkLm8gIzMzNDY0KQorCitELUJ1cyAxLjQuMSAoMjAgRGVjZW1iZXIgMjAxMCkKKz09CisKKyDigKIgRml4IGZvciBDVkUtMjAxMC00MzUyOiBzZW5kaW5nIG1lc3NhZ2VzIHdpdGggZXhjZXNzaXZlbHktbmVzdGVkIHZhcmlhbnRzIGNhbgorICAgY3Jhc2ggdGhlIGJ1cy4gVGhlIGV4aXN0aW5nIHJlc3RyaWN0aW9uIHRvIDY0LWxldmVscyBvZiBuZXN0aW5nIHByZXZpb3VzbHkKKyAgIG9ubHkgYXBwbGllZCB0byB0aGUgc3RhdGljIHR5cGUgc2lnbmF0dXJlOyBub3cgaXQgYWxzbyBhcHBsaWVzIHRvIGR5bmFtaWMKKyAgIG5lc3RpbmcgdXNpbmcgdmFyaWFudHMuIFRoYW5rcyB0byBSw6ltaSBEZW5pcy1Db3VybW9udCBmb3IgZGlzY292aW5nIHRoaXMKKyAgIGlzc3VlLgorIOKAoiBPUyBYIHBvcnRhYmlsaXR5IGZpeGVzLCBpbmNsdWRpbmcgbGF1bmNoZCBzdXBwb3J0LgorIOKAoiBXaW5kb3dzIGF1dG9sYXVuY2ggaW1wcm92ZW1lbnRzLgorIOKAoiBWYXJpb3VzIGJ1ZyBmaXhlcy4KKworRC1CdXMgMS40LjAgKDYgU2VwIDIwMTApCis9PQorIC0gc3lzdGVtZCBob29rdXAKKworRC1CdXMgMS4zLjEgKDIzIEp1bmUgMjAxMCkKKz09CisgLSBOZXcgc3RhbmRhcmRpemVkIFByb3BlcnRpZXNDaGFuZ2VkIHNpZ25hbCBpbiB0aGUgcHJvcGVydGllcyBpbnRlcmZhY2UKKyAtIFZhcmlvdXMgcG9ydGFiaWxpdHkgZml4ZXMsIGluIHBhcnRpY3VsYXIgdG8gV2luZG93cyBwbGF0Zm9ybXMKKyAtIFN1cHBvcnQgZm9ya2luZyBidXMgc2VydmljZXMsIGZvciBjb21wYXRpYmlsaXR5CisKK0QtQnVzIDEuMy4wICgyOSBKdWx5IDIwMDkpCis9PQorIC0gYWJpbGl0eSBmb3IgZGJ1cy1zZW5kIHRvIHNlbmQgdG8gYW55IGJ1cyAoLS1hZGRyZXNzKQorIC0gZmlsZSBkZXNjcmlwdG9yIHBhc3Npbmcgb24gVW5peCBzb2NrZXQgdHJhbnNwb3J0cworIC0gdXNlIG9mIEdDQyBhdG9taWMgaW50cmluc2ljcyBmb3IgYmV0dGVyIHByb2Nlc3NvciBzdXBwb3J0CisgICAocmVxdWlyZXMgLW1hcmNoPWk0ODYgb3IgYWJvdmUgZm9yIHg4NiBjb21waWxhdGlvbikKKyAtIHRocmVhZC1zYWZlIEZEX0NMT0VYRUMgc2V0dGluZyBvbiByZWNlbnQgTGludXgga2VybmVscyAoMi42LjI0LTI3IGFuZCB1cCkKKyAgIGFuZCBnbGliYyAoMi45IGZvciBwaXBlMiBhbmQgMi4xMCBmb3IgYWNjZXB0NCkKKyAtIGZlYXR1cmUgbmVnb3RpYXRpb24gaW4gdGhlIGJ1cyBkYWVtb24KZGlmZiAtLWdpdCBhL05FV1MucHJlLTEtMCBiL05FV1MucHJlLTEtMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTA1YmM1Ci0tLSAvZGV2L251bGwKKysrIGIvTkVXUy5wcmUtMS0wCkBAIC0wLDAgKzEsNjE0IEBACitELUJ1cyAxLjAuMCAoMDggTm92ZW1iZXIgMjAwNikKKz09CistIERvY3VtZW50cyB1cGRhdGVkIHdpdGggQVBJL0FCSSBnYXJ1bnRlZXMgCistIEFkZGVkIG1pc3NpbmcgcGF0Y2ggRnJlZUJTRCBuZWVkIHRvIHJ1biBvdXQgb2YgdGhlIGJveAorLSBkYnVzLW1vbml0b3Igbm93IGhhcyBhIHByb2ZpbGUgbW9kZQorLSBBVVRIT1JTIGZpbGUgdXBkYXRlZCB3aXRoIG5hbWVzIGZyb20gdGhlIENoYW5nZUxvZworICBUaGFua3MgdG8gZXZlcnlvbmUgd2hvIGhlbHBlZCBnZXQgdXMgaGVyZQorCitELUJ1cyAxLjAgUkMgMyAoMC45NSkgKDAyIE5vdmVtYmVyIDIwMDYpCis9PQorLSBEQlVTX0FQSV9TVUJKRUNUX1RPX0NIQU5HRSBubyBsb25nZXIgbmVlZHMgdG8gYmUgZGVmaW5lZCB3aGVuIGJ1aWxkaW5nIGFwcHMKKy0gLi9jb25maWd1cmUgY2hlY2tzIG5vdyB3b3JrIHdoZW4gY3Jvc3MgY29tcGlsaW5nCistIGRidXMtdXVpZGdlbiAtLWVuc3VyZSBpcyBub3cgcnVuIGluIHRoZSBpbml0IHNjcmlwdCBzbyB0aGVyZSBpcyBubyBuZWVkIHRvCisgIHJ1biBpdCBpbiBhIHBvc3Qgc2NyaXB0CistIGRidXMtdXVpZGdlbiBub3cgd3JpdGVzIG91dCB0byAvdmFyL2xpYi9kYnVzIHRvIHdvcmsgd2l0aCBzeXN0ZW1zIHRoYXQgZG8gbm90CisgIGhhdmUgYSB3cml0YWJsZSAvZXRjLiBQYWNrYWdlcyBzaG91bGQgaW5zdGFsbCBhbmQgb3duIHRoZSAvdmFyL2xpYi9kYnVzIAorICBkaXJlY3RvcnkKKy0gcmVjdXJzaXZlIGxvY2tzIGFyZSBub3cgdXNlZCB3aGVuIGRidXNfdGhyZWFkc19pbml0X2RlZmF1bHQgaXMgY2FsbGVkCistIHN0YW5kYXJkX3Nlc3Npb25fc2VydmljZWRpcnMgdGFnIGFkZGVkIHRvIHRoZSBzZXNzaW9uLmNvbmYKKyAgdW5kZXIgYSBub3JtYWwgYnVpbGQgdGhpcyBzcGVjaWZpZXMgdGhlc2Ugc2VydmljZSBkaXJlY3RvcmllczoKKyAgICAvdXNyL2xvY2FsL3NoYXJlL2RidXMtMS9zZXJ2aWNlcworICAgIC91c3Ivc2hhcmUvZGJ1cy0xL3NlcnZpY2VzCisgICAgJEhPTUUvLmxvY2FsL3NoYXJlL2RidXMtMS9zZXJ2aWNlcworLSBmaXhlZCBjcmFzaCB3aGVuIGEgc2VydmljZSBkaXJlY3RvcnkgaXMgc3BlY2lmaWVkIG1vcmUgdGhhbiBvbmNlCistIGZpeGVkIGEgY3Jhc2ggaW4gKkJTRCB3aGVuIHdhdGNoaW5nIGNvbmZpZyBkaXJlY3RvcmllcyBmb3IgY2hhbmdlcworLSBmaXhlZCBJcml4IGJ1aWxkIGJ5IHVzaW5nIGRpcnAtPl9fZGRfZmQgdG8gZ2V0IHRoZSBmaWxlIGRlc2NyaXB0b3IKKy0gY2xlYW5lZCB1cCB0aGUgTE9DQUxfQ1JFRFMgdnMgQ01HQ1JFRCBjcmVkZW50aWFsIGNvZGUgc28gKkJTRCdzIGRvbid0IAorICBjcmFzaCBoZXJlIGFueW1vcmUKKy0gZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2FycmF5X2xlbiBkZXByZWNhdGVkCistIGNsZWFudXAtbWFuLXBhZ2VzLnNoIGFkZGVkIHNvIHBhY2thZ2VycyBjYW4gY2xlYW4gdXAgRG94eWdlbiBtYW4gcGFnZSBvdXRwdXQKKyAgZnJvbSA3IHRvIDIgbWVncworLSBsYXJnZSBkb2N1bWVudGF0aW9uIGltcHJvdmVtZW50cworLSBudW1lcm91cyBidWcgZml4ZXMKKworRC1CdXMgMS4wIFJDIDIgKDAuOTQpICgxNCBPY3RvYmVyIDIwMDYpCis9PQorLSBkYnVzLXV1aWRnZW4gYmluYXJ5IGFkZGVkIGZvciBmdXR1cmUgcmVtb3RlIG1hY2hpbmUgaWRlbnRpZmljYXRpb24KKyAgcGFja2FnZXJzIHNob3VsZCBjYWxsIGRidXMtdXVpZGdlbiAtLWVuc3VyZSBpbiB0aGVpciBwb3N0CistIEdldE1hY2hpbmVJZCBwZWVyIG1ldGhvZCBhZGRlZCB0byB0aGUgYnVzIEFQSQorLSBkYnVzX2Nvbm5lY3Rpb25fc2V0X3JvdXRlX3BlZXJfbWVzc2FnZXMgQVBJIGFkZGVkIHRvIGxldCB0aGUgYnVzIHNlbmQKKyAgcGVlciBtZXNzYWdlcyBkaXJlY3RseSB0byBhbiBhcHAKKy0gQXV0b2xhdW5jaCBhYmlsaXRpZXMgYWRkZWQgdG8gZGJ1cy1sYXVuY2ggd2l0aCB0aGUgLS1hdXRvbGF1bmNoIGZsYWcKKyAgVGhpcyBmZWF0dXJlIGFsbG93cyBsaWJkYnVzIHRvIHN0YXJ0IGEgc2Vzc2lvbiBidXMgaWYgbm9uZSBjYW4gYmUgZm91bmQKKyAgVGhpcyBpcyBhbiBpbnRlcm5hbCBmZWF0dXJlIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgYnkgc2NyaXB0cworICBEQlVTX1NFU1NJT05fQlVTX0FERFJFU1MgaXMgc3RpbGwgdGhlIGNvcnJlY3Qgd2F5IHRvIHNwZWNpZnkgYSBzZXNzaW9uIGJ1cworLSBkYnVzLWxhdW5jaCBub3cgcHJpbnRzIG91dCBhIHNpbXBsZSBrZXkgdmFsdWUgcGFpcnMgaW5zdGVhZCBvZiBzaGVsbCBzY3JpcHRzCisgIGlmIG9uZSBvZiB0aGUgc2hlbGwgZmxhZ3MgYXJlbid0IHVzZWQKKy0gc3VwcG9ydCBEQlVTX0JMT0NLX09OX0FCT1JUIGVudiB2YXJpYWJsZSB0byBjYXVzZSBibG9ja2luZyB3YWl0aW5nIGZvciBnZGIKKy0gd2VhayByZWYgYXJlIG5vdyBoZWxkIGZvciBzaGFyZWQgY29ubmVjdGlvbnMgc28gdGhlIHJpZ2h0IHRoaW5ncyBoYXBwZW4KKyAgdGhpcyBmaXhlcyBzb21lIHByZXR0eSBtYWpvciBidWdzIHdpdGggdGhlIHdheSBjb25uZWN0aW9ucyB3ZXJlIGhhbmRsZWQKKy0gU29tZSByZWZhY3RvcmluZyBmb3IgV2luZG93cyAoZG9lc24ndCBlZmZlY3QgVW5peCkKKy0gU29sYXJpcyBidWlsZCBmaXhlcworLSBNYWNPU1ggYnVpbGQgZml4ZXMKKy0gQ3Jvc3MgY29tcGlsZSBidWlsZCBmaXhlcy4gIFdlIG5vdyBhc3N1bWUgZ2V0cHduYW1fciBpcyBwb3NpeCBhbmQgdmFfbGlzdHMKKyAgY2FuIGJlIGNvcGllZCBieSB2YWx1ZSBzaW5jZSB3ZSBjYW4ndCBjaGVjayB0aGlzIGluIGEgY3Jvc3MgY29tcGlsZS4gIElmCisgIHRoaXMgaXMgbm90IHRydWUgZm9yIGEgcGFydGljdWxhciB0YXJnZXQgaXMgdXAgdG8gdGhlIGRldmVsb3BlciB0byBwYXRjaC4KKy0gQnVnIGZpeGluZyBhbGwgYXJvdW5kCisKK0QtQnVzIDEuMCBSQyAxICgwLjkzKSAoMTQgU2VwdGVtYmVyIDIwMDYpCis9PQorLSBkYnVzX3RocmVhZHNfaW5pdF9kZWZhdWx0IGFkZGVkIGZvciBpbml0YWxpemluZyB0aHJlYWRzIHdpdGhvdXQgdGhlIG5lZWQgZm9yCisgIGJpbmRpbmdzCistIEZpbHRlcnMgYXJlIG5vdyBwcm9wZXJseSByZW1vdmVkCistIGRidXNfY29ubmVjdGlvbl9vcGVuIG5vdyBob2xkcyBhIGhhcmQgcmVmIHRvIHNoYXJlZCBjb25uZWN0aW9ucworLSBXZSBub3cgcHJpbnQgb3V0IGEgd2FybmluZyBhbmQgZG8gbm90aGluZyB3aGVuIHNvbWVvbmUgdHJpZXMgdG8gY2xvc2UgYSAKKyAgc2hhcmVkIGNvbm5lY3Rpb24KKy0gVGhlIC0taW50cm9zcGVjdCBzd2l0Y2ggaGFzIGJlZW4gYWRkZWQgdG8gdGhlIGJ1cyBmb3IgcHJpbnRpbmcgb3V0IAorICBpbnRyb3NwZWN0aW9uIGRhdGEgd2l0aG91dCBhY3R1YWxseSBydW5uaW5nIHRoZSBidXMKKy0gTE9DQUxfQ1JFRFMgc29ja2V0IGNyZWRlbnRpYWxzIGFyZSBub3cgc3VwcG9ydGVkIGZvciBzeXN0ZW1zIHdoaWNoIAorICBzdXBwb3J0IGl0IHN1Y2ggYXMgTmV0QlNECistIEdlbmVyYWxpemUga3F1ZXVlIHN1cHBvcnQgc28gaXQgd29ya3Mgd2l0aCBOZXRCU0QgYXMgd2VsbCBhcyBGcmVlQlNECistIE51bWVyb3VzIGJ1ZyBmaXhlcyBhbmQgbWVtb3J5IGxlYWtzIHBhdGNoZWQKKworRC1CdXMgMC45MiAoMTggQXVndXN0IDIwMDYpCis9PQorLSBQcm9wZXIgdGhyZWFkIGxvY2tpbmcgYWRkZWQgdG8gcGVuZGluZyBjYWxscworLSBUaHJlYWRpbmcgc2VtYW50aWNzIGNoYW5nZWQgZnJvbSBpbml0IGVhcmx5IHRvIGluaXQgYmVmb3JlIHRoZSBzZWNvbmQgdGhyZWFkCisgIGlzIHN0YXJ0ZWQKKy0gQ29ycmVjdGx5IGVycm9yIG91dCB3aGVuIGFuIGFwcGxpY2F0aW9uIHRyaWVzIHRvIGFjcXVpcmUgb3IgcmVsZWFzZSB0aGUKKyAgb3JnLmZyZWVkZXNrdG9wLkRCdXMgbmFtZSBpbnN0ZWFkIG9mIHNlbmRpbmcgZmFsc2UgcmVzdWx0IGNvZGVzCistIGtxdWV1ZSBkaXJlY3Rvcnkgd2F0Y2hpbmcgY29kZSBjYW4gbm93IGJlIHVzZWQgdG8gbW9uaXRvciBjb25maWcgZmlsZSBjaGFuZ2VzCisgIG9uIEZyZWVCU0QKKy0gLS13aXRoLWRidXMtZGFlbW9uZGlyIGNvbmZpZ3VyZSBzd2l0Y2ggYWRkZWQgc28gdGhlIGRhZW1vbiBjYW4gYmUgaW5zdGFsbGVkCisgIHNlcGFyYXRlIGZyb20gdGhlIHVzZXIgYmluYXJpZXMKKy0gTWFrZWZpbGVzIGZpeGVkIGZvciBjeWd3aW4gCistIFZhcmlvdXMgZml4ZXMgZm9yIHRoZSBvbmdvaW5nIFdpbmRvd3MgcG9ydCAKKy0gRml4ZWQgZG9jcyBhbmQgY29tbWVudHMgdG8gdXNlIHRoZSBELUJ1cyBzcGVsbGluZyBpbnN0ZWFkIG9mIEQtQlVTCistIE1hbnkgbWVtbGVha3MgYW5kIGJ1Z3MgZml4ZWQKKworRC1CdXMgMC45MSAoMjQgSnVseSAyMDA2KQorPT0KKy0gUmVtb3ZlIHNvbWUgbGluZ2VyaW5nIGJpdHMgbGVmdCBvdmVyIGZyb20gdGhlIGJpbmRpbmdzIHNwbGl0CistIEZpeCBhc3NlcnRpb24gY2F1c2luZyBELUJ1cyBhcHBsaWNhdGlvbnMgdG8gY3Jhc2ggd2hlbiBjaGVja3MgYXJlIGVuYWJsZWQKKy0gRml4IGEgdGltZW91dCBidWcgd2hpY2ggd291bGQgYmxvY2sgYXBwbGljYXRpb25zIGZyb20gYmVpbmcgYXV0byBzdGFydGVkCisKK0QtQnVzIDAuOTAgKDE3IEp1bHkgMjAwNikKKz09CistIEFQSS9BQkkgZnJlZXplIGZvciAxLjAKKy0gQmluZGluZ3MgYXJlIG5vdyBzcGxpdCBvdXQgaW50byBzZXBlcmF0ZSBwYWNrYWdlcworLSBMaXN0QWN0aXZhdGFibGVOYW1lcyBhZGRlZCBhcyBhIG1ldGhvZCBvbiB0aGUgYnVzCistIFJlbW92ZWQgZGVwcmVjYXRlZCBkYnVzX2Nvbm5lY3Rpb25fZGlzY29ubmVjdCAodXNlIGRidXNfY29ubmVjdGlvbl9jbG9zZSkKKy0gU2hhcmVkIGNvbm5lY3Rpb25zIGFyZSBub3cgdW5yZWZmZWQgb24gZGlzY29ubmVjdAorLSBGaXhlZCBwZW5kaW5nIGNhbGxzIGZvciB0aHJlYWRlZCBlbnZpb3JubWVudHMKKy0gUGVuZGluZyBjYWxscyBnZXQgdGltZWQgb3V0IG9uIGNvbm5lY3Rpb24gZGlzY29ubmVjdAorLSBkYnVzX2Nvbm5lY3Rpb25fc2VuZF93aXRoX3JlcGx5IHJldHVybnMgVFJVRSBhbmQgYSBOVUxMIHBlbmRpbmcgY2FsbAorICBpZiB5b3UgY2FsbCBpdCBvbiBhIGNvbm5lY3Rpb24gb2JqZWN0IHdoaWNoIGhhcyBiZWVuIGRpc2Nvbm5lY3RlZCBhbHJlYWR5CisgIChpdCByZXR1cm5zIEZBTFNFIG9uIE91dCBvZiBNZW1vcnkgZXJyb3JzIG9ubHkpCistIGRidXMtbW9uaXRvciBub3cgY29ycmVjdGx5IGNhdGNoZXMgbWV0aG9kcywgbm90IGp1c3Qgc2lnbmFscworLSBkYnVzLW1vbml0b3Igbm93IHByaW50cyBvYmplY3QgcGF0aHMgCisKK0QtQlVTIDAuNjIgKDEyIEp1bmUgMjAwNikKKz09CistIERvYyBmaXhlcworLSBBZGRlZCBzdXBwb3J0IGZvciBhbGwgZGF0YS10eXBlcyBmb3IgdGhlIGRidXMgdG9vbHMKKy0gRml4ZWQgZWF2ZXNkcm9wcGluZyBvbiBtZXRob2QgY2FsbHMgKGRidXMtbW9uaXRvcikKKy0gRml4ZWQgc2lsZW50IGRyb3BwaW5nIG9mIG1ldGhvZCBjYWxscyB3aXRoIGludGVyZmFjZT1OVUxMCistIEZpeGVkIGNvbnNvbGUgb3duZXJzaGlwIHByb2JsZW1zIGluIFNvbGFyaXMKKy0gRml4ZWQgaW5zdGFsbGF0aW9uIG9mIGRidXMtc2lnbmF0dXJlLmggYW5kICNpbmNsdWRlIGl0IGluIGRidXMvZGJ1cy5oCistIEZsdXNoIHRoZSB1c2VyIGRhdGFiYXNlIGNhY2hlIG9uIGNvbmZpZyByZWxvYWQKKy0gR0xpYiBiaW5kaW5nczoKKyAgLSBGaXggbWVtb3J5IGxlYWtzCisgIC0gRml4IHByb3BlcnRpZXMgaW4gREJ1c0dQcm94eSBzbyB0aGF0IHRoZXkgY2FuIGJlIGdpdmVuIGluIGFueQorICAgIG9yZGVyCisgIC0gQWRkZWQgbG90cyBvZiBhc3NlcnRpb25zIHRvIGVuc3VyZSBjb3JyZWN0IHVzZQorICAtIFJlbW92ZSBkdXBsaWNhdGVkIGNvZGUKKyAgLSBGaXggc3RhdGljIHN0cmluZyBwb2ludGVyIHVzZXMgaW4gR1B0ckFycmF5LWJhc2VkIGNvbGxlY3Rpb25zCistIFB5dGhvbiBiaW5kaW5nczoKKyAgLSBSZW1vdmUgcmVmZXJlbmNlIHRvIHN5cy9jZGVmcy5oCistIFF0NCBiaW5kaW5nczoKKyAgLSBDb2RlIHJlb3JnYW5pemVkCisgIC0gQWRkZWQgdGhlIGRidXNpZGwyY3BwLCBkYnVzY3BwMnhtbCBhbmQgZGJ1cyB0b29scworICAtIEFkZGVkIGV4YW1wbGUgcHJvZ3JhbXMgKHBpbmctcG9uZywgY29tcGxleCBwaW5nLXBvbmcsIGxpc3RuYW1lcywgY2hhdCkKKyAgLSBVcGRhdGVkIHNlbGZ0ZXN0cworICAtIEZpeGVkIGNvbXBpbGF0aW9uIGFuZCAubW9jLSBhbmQgLnVpLWZpbGUgcHJvY2Vzc2luZyBhbmQgY2xlYW5pbmcKKyAgLSBNYWRlIGNlbnRyYWwgY2xhc3NlcyBkZXJpdmUgZnJvbSBRT2JqZWN0CisgIC0gRW5oYW5jZSBlcnJvciByZXBvcnRpbmcKKyAgLSBNYW55IGJ1Z2ZpeGVzCistIE1vbm8gYmluZGluZ3M6CisgIC0gTWlub3IgYnVnZml4ZXMKKworRC1CVVMgMC42MSAoMjQgRmVidWFyeSAyMDA2KQorPT0KKy0gRG9jdW1lbnRhdGlvbiBhbGwgYXJvdW5kCistIGRidXMtbGF1bmNoIG5vdyBwcm9kdWNlcyBjb3JyZWN0IHNoIGFuZCBjc2ggc3ludGF4CistIE5lc3RlZCBhcnJheXMgbm93IHdvcmsgY29ycmVjdGx5CistIEdMaWIgYmluZGluZ3M6CisgIC0gSW5oZXJpdGluZyBmcm9tIERCdXNHUHJveHkgaXMgbm93IHBvc3NpYmxlCisgIC0gR1B0ckFycmF5cyBjYW4gbm93IGJlIG1hcnNoYWxsZWQKKyAgLSBvcmcuZnJlZWRlc2t0b3AuREJ1cy5HTGliLkNsaWVudENTeW1ib2wgYW5ub3RhdGlvbiBhZGRlZAorICAtIE9wZW5uaW5nIGNvbm5lY3Rpb25zIHRvIGFyYml0cmFyeSBhZGRyZXNzZXMgbm93IHN1cHBvcnRlZAorLSBQeXRob24gYmluZGluZ3M6CisgIC0gc2VuZGVyX2tleXdvcmQgYW5kIHBhdGhfa2V5d29yZCBrZXl3b3JkcyBhZGRlZCB0byBzaWduYWwgbGlzdGVuZXIgQVBJCisgIC0gQnl0ZSB0eXBlcyBub3cgZGVtYXJzaGFsIHRvIHVuc2lnbmVkIGNoYXIKKyAgLSBjYWxsaW5nIG1ldGhvZHMgbm93IGRvIHRoZSBjb3JyZWN0IHRoaW5nCistIFF0IGJpbmRpbmdzOgorICAtIGJvdGggUXQzIGFuZCBRdDQgYmluZGluZ3MgY2FuIGJlIGJ1aWx0IGF0IHRoZSBzYW1lIHRpbWUKKyAgLSBVc2UgdGhlIHN0YW5kYXJkIG9yZy5mcmVlZGVza3RvcC5EQnVzLk1ldGhvZC5Ob1JlcGx5IGFubm90YXRpb24gCisgICAgZm9yIHRoZSAiYXN5bmMiIGNhbGxzIGluc3RlYWQgb2YgY3JlYXRpbmcgb25lIGZvciB1cy4KKy0gTW9ubyBiaW5kaW5nczoKKyAgLSA2NGJpdCBhcmNoIGZpeGVzCistIE1hc3NpdmUgYnVnIGZpeGluZyBhbGwgYXJvdW5kCisKK0QtQlVTIDAuNjAgKDMwIE5vdmVtYmVyIDIwMDUpCis9PQorCistIG1ham9yIEFCSS9BUEkgY2hhbmdlcyAtIHNvbmFtZXMgY2hhbmdlZAorLSBSZXF1ZXN0TmFtZSBxdWV1aW5nIGJlaGF2aW9yIGhhcyBjaGFuZ2VkIChyZWZlciB0byBkYnVzLXNwZWNpZmljYXRpb24pCisgIC0gREJVU19OQU1FX0ZMQUdfUFJPSElCSVRfUkVQTEFDRU1FTlQgaGFzIGJlZW4gcmVtb3ZlZCBhbmQKKyAgICBEQlVTX05BTUVfRkxBR19BTExPV19SRVBMQUNFTUVOVCBoYXMgYmVlbiBhZGRlZCB0byB0aGUgZmxhZ3MKKy0gc2lnbmFscyBlbWl0dGVkIGJ5IHRoZSBidXMgbm93IHNob3cgdXAgaW4gdGhlIGludHJvc3BlY3QgZGF0YQorLSBhdXRoIEVYVEVSTkFMIG5vdyBzdXBwb3J0ZWQgb24gQlNEIHZhcmllbnRzCistIFJlbGVhc2VOYW1lIG1ldGhvZCBhZGRlZCB0byB0aGUgYnVzIHRvIGFsbG93IGEgc2VydmljZQorICB0byByZW1vdmUgaXRzZWxmIGFzIG93bmVyIG9mIGEgYnVzIG5hbWUKKy0gZGJ1c19jb25uZWN0aW9uX3JlYWRfd3JpdGUgYWRkZWQgZm9yIGdldHRpbmcgbWVzc2FnZXMgb2ZmIHRoZSBidXMgCisgIGluIHRoZSBhYnNlbmNlIG9mIGEgbWFpbmxvb3AKKy0gUXQ0IGJpbmRpbmdzIGFkZGVkIGFuZCB0aGUgUXQzIGJpbmRpbmdzIGhhdmUgYmVlbiBkZXByaWNhdGVkCistIHB5dGhvbiBiaW5kaW5nczoKKyAgLSBtYXJzaGFsIHVzaW5nIGludHJvc3BlY3QgZGF0YSBpZiBhdmFpbGFibGUKKyAgLSBiZXR0ZXIgZXhjZXB0aW9uIGhhbmRsaW5nIGFuZCBwcm9waWdhdGlvbgorICAtIHByaXZhdGUgY29ubmVjdGlvbnMgYXJlIG5vdyBzdXBwb3J0ZWQKKyAgLSBVVEYtOCBjbGVhbnVwcworICAtIG91dF9zaWduYXR1cmUgYWRkZWQgdG8gbWV0aG9kIGRlY29yYXRvcnMgZm9yIHNwZWNpZnlpbmcKKyAgICBob3cgdGhlIHJldHVybiB2YWx1ZXMgc2hvdWxkIGJlIG1hcnNoYWxlZAorICAtIHNlbmRlcl9rZXl3b3JkIGFkZGVkIHRvIG1ldGhvZCBkZWNvcmF0b3JzIGZvciBzcGVjaWZ5aW5nCisgICAgYW5kIGFyZ3VtZW50IHRvIHByb3ZpZGUgdGhlIHVuaXF1ZSBuYW1lIG9mIHRoZSBtZXRob2QgY2FsbGVyCisgIC0gYXN5bmNfY2FsbGJhY2tzIGFkZGVkIHRvIG1ldGhvZCBkZWNvcmF0b3JzIAorICAtIG11bHRpcGxlIGluaGVyaXRhbmNlIG9mIGNsYXNzZXMgbm93IHN1cHBvcnRlZCAKKy0gR0xpYiBiaW5kaW5nczoKKyAgLSByZXNwZWN0IE5vUmVwbHkgYW5ub3RhdGlvbnMKKyAgLSBkYnVzX2dfbWV0aG9kX3JldHVybl9nZXRfcmVwbHkgYW5kIGRidXNfZ19tZXRob2RfcmV0dXJuX3NlbmRfcmVwbHkKKyAgICBhZGRlZCB0byB0aGUgbG93bGV2ZWwgY29kZSBmb3IgdXNlIHdoZW4gdGhlIGRidXMtZ2xpYiBtYXJzaGFsbGluZworICAgIGNvZGUgaXMgbm90IGFkaXF1YXRlCistIG51bWVyb3VzIGJ1ZyBmaXhlcyBhbGwgYXJvdW5kCisKK0QtQlVTIDAuNTAgKDA2IFNlcHRlbWJlciAyMDA1KQorPT09CitUaGlzIGlzIGEgbWlub3IgcmVsZWFzZSBmcm9tIDAuMzYuMi4gIFRoZSBzZXJpZXMgbnVtYmVyIGhhcyBjaGFuZ2VkIAorbm90IGJlY2F1c2Ugb2YgYW55IHRlY2huaWNhbCByZWFzb25zIGJ1dCBhcyBhbiBpbmRpY2F0aW9uIHRoYXQgd2UKK2FyZSBtb3ZpbmcgY2xvc2VyIHRvIDEuMC4gIEl0IGlzIGhvcGVkIHRoYXQgdGhpcyB3aWxsIGJlIHRoZSBsYXN0CitzZXJpZXMgdG8gc2VlIG1ham9yIGNoYW5nZXMsIG1vc3Qgb2Ygd2hpY2ggd2lsbCBiZSBpc29sYXRlZCB0byB0aGUKK0dMaWIgYW5kIFB5dGhvbiBiaW5kaW5ncywgYXMgd2UgdHJhbnNpdGlvbiB0byBjb25jZW50cmF0ZSBtb3JlIG9uCitidWcgYnVzdGluZyBhbmQgY29kZSBhdWRpdGluZy4KKworLSBELUJ1cyBidWlsZHMgb24gdGhlIEN5Z3dpbiBwbGF0Zm9ybQorLSBNYWtlZmlsZSBjbGVhbnVwcworLSBWYXJpb3VzIGJ1ZyBmaXhlcworLSBPcHRpbWl6YXRpb24gb2YgdGhlIGRidXMgb2JqZWN0IHRyZWUgCistIE1lbWxlYWtzIGFuZCBHSUwgY3Jhc2hlciBidWdzIGhhdmUgYmVlbiBmaXhlZCBpbiB0aGUgUHl0aG9uIGJpbmRpbmdzCisKK0QtQlVTIDAuMzYuMiAoMjkgQXVndXN0IDIwMDUpCis9PT0KKy0gU2VjdXJpdHk6IFJlc3RyaWN0IG90aGVyIHVzZXJzIGZyb20gY29ubmVjdGluZyB0byBhbm90aGVyIHVzZXJzIAorICBzZXNzaW9uIGJ1cworCitELUJVUyAwLjM2LjEgKDI0IEF1Z3VzdCAyMDA1KQorPT09CistIFB5dGhvbiBCaW5kaW5nczoKKyAgLSBmaXhlZCB0byB3b3JrIHdpdGggaGFsLWRldmljZS1tYW5hZ2VyCisgIC0gRm9yIDY0Yml0IGJ1aWxkcyBldmVyeXRoaW5nIGlzIGluc3RhbGxlZCB0byBsaWI2NC9weXRob24yLjQvCisgICAgc2luY2UgUHl0aG9uIGNhbid0IGhhbmRsZSBtdWx0aWxpYgorCitELUJVUyAwLjM2ICgyMyBBdWd1c3QgMjAwNSkKKz09PQorLSBNYXhpbXVtIHNpemVkIG9mIGNhY2hlZCBtZXNzYWdlcyBoYXZlIGJlZW4gcmVkdWNlZCB0byAxMEsKKy0gTWF0Y2ggcnVsZXMgbm93IGFsbG93IG1hdGNoaW5nIG9uIGFyZ3VtZW50cyBpbnNpZGUgdGhlIG1lc3NhZ2UKKy0gaW50cm9zcGVjdC54c2wgWFNMVCBzdHlsZSBzaGVldCBhZGRlZCBmb3IgZm9ybWF0dGluZyBpbnRyb3NwZWN0aW9uCisgIGRhdGEgaW50byBYSFRNTCBmb3IgYW5hbHlzaXMKKy0gUHl0aG9uIGJpbmRpbmdzOgorICAtIG5vdyBoYXZlIHdvcmtpbmcgdHlwZSBvYmplY3RzIGZvciBleHBsaWNpdAorICAgIHR5cGVjYXN0aW5nCisgIC0gVmFyaWFudCB0eXBlIGhhcyBiZWVuIGFkZGVkCisgIC0gRGljdGlvbmFyaWVzLCBWYXJpYW50cyBhbmQgQXJyYXlzIGNhbiBhbGwgYmUgcGFzc2VkIHRoZSBzaWduaXR1cmUgb3IKKyAgICB0eXBlKHMpIG9mIHRoZWlyIGNoaWxkcmVuCisgIC0gdGhlIG9wdGlvbmFsIHRpbWVvdXQ9IGtleXdvcmQgaGFzIGJlZW4gYWRkZWQgd2hlbiBtYWtpbmcgbWV0aG9kIGNhbGxzCisgIC0gbWF0Y2ggb24gYXJncyBoYXMgYmVlbiBpbXBsZW1lbnRlZAorICAtIGEgLnB0aCBmaWxlIGhhcyBiZWVuIGFkZGVkIGZvciBkZWFsaW5nIHdpdGggbGlicmFyaWVzIGFuZCBweXRob24gZmlsZXMKKyAgICBiZWluZyBpbiBkaWZmZXJlbnQgZGlyZWN0b3JpZXMgc3VjaCBhcyBpbiA2NGJpdCBpbnN0YWxscworICAtIHZhcmlvdXMgYnVnIGZpeGVzCistIEdMaWIgYmluZGluZ3M6CisgIC0gZGVlcGx5IHJlY3Vyc2l2ZSB0eXBlcyBub3cgc3VwcG9ydGVkCisgIC0gbWFueSBzeW1ib2xzIGFyZSBubyBsb25nZXIgZXhwb3J0ZWQgYXMgcGFydCBvZiB0aGUgcHVibGljIEFQSQorICAtIHZhcmlvdXMgbWVtbGVhayBhbmQgb3RoZXIgYnVnIGZpeGVzCisKK0QtQlVTIDAuMzUuMiAoMTcgSnVseSAyMDA1KQorPT09CistIFJlbmFtZSBVbml4IFNlY3VyaXR5IENvbnRleHQgdG8gU0VMaW51eCBTZWN1cml0eSBDb250ZXh0IGluIEFQSQorLSBGaXhlZCBtb3JlIGRpc3QgZXJyb3JzIHRoYXQgZGlzdGNoZWNrIGRpZG4ndCBwaWNrIHVwIG9uCistIEZpeGVkIHZhcmlvdXMgYnVncyBpbiB0aGUgcHl0aG9uIGJpbmRpbmdzIHRoYXQgcHJldmVudGVkIHRoZW0gZnJvbSB3b3JraW5nCisKK0QtQlVTIDAuMzUuMSAoMTYgSnVseSAyMDA1KQorPT09CistIEZpeGVkIGRpc3QgZXJyb3Igd2hlcmUgcHl0aG9uL2RidXNfYmluZGluZ3MucHhkIHdhcyBiZWluZyBzaGlwcGVkIAorICBpbnN0ZWFkIG9mIGRidXNfYmluZGluZ3MucHhkLmluCistIFVzZSB0aGlzIGluc3RlYWQgb2YgdGhlIDAuMzUgdGFyYmFsbCAKKworRC1CVVMgMC4zNSAoMTUgSnVseSAyMDA1KQorPT09CistIC0td2l0aC1kYnVzLXVzZXIgYWRkZWQgdG8gdGhlIGNvbmZpZ3VyZSBzY3JpcHRzIGZvciBjb25maWd1cmluZyB0aGUgCisgIHVzZXIgdGhlIHN5c3RlbSBidXMgcnVucyBvbgorLSAtLXdpdGgtY29uc29sZS1hdXRoLWRpciBhZGRlZCB0byBjb25maWd1cmUgc2NyaXB0cyBmb3IgY29uZmlndXJpbmcgdGhlCisgIGRpcmVjdG9yeSB0byBsb29rIGluIGZvciBjb25zb2xlIHVzZXIgbG9ja3MKKy0gc2VydmljZSBmaWxlcyBmb3IgYXV0by1zdGFydGluZyBELUJ1cyBzZXJ2aWNlcyBub3cgaGFzIHRoZSBhYmlsaXR5IHRvIHBhc3MKKyAgaW4gY29tbWFuZCBsaW5lIGFyZ3VtZW50cyB0byB0aGUgZXhlY3V0YWJsZQorLSBIdWdlIGF1dG8tc3RhcnQgYnVnIHNxdWFzaGVkIHdoaWNoIGNhdXNlZCBzb21lIHNlcnZpY2VzIG5vdCB0byBzdGFydCB3aGVuCisgIHJlcXVlc3RlZCBpbiByYXBpZCBzdWNjZXNzaW9uCistIFNFLUxpbnV4IHNlY3VyaXR5IGNvbnRleHRzIGNhbiBub3cgYmUgYXBwZW5kZWQgdG8gbWVzc2FnZXMgZm9yIGluc3BlY3Rpb24KKyAgYnkgc2VydmljZXMgdGhhdCBlbmZvcmNlIHRoZWlyIG93biBzZWN1cml0eSBwb2xpY2llcworLSBDb2xpbiBzYXlzIHRoZSBHTGliIGJpbmRpbmcgYXJlIHJlYWR5IGZvciBnZW5lcmFsIGNvbnN1bXB0aW9uCistIE5ldyBHTGliIHR1dG9yaWFsCistIE5ldyBHTGliIGV4YW1wbGUgY29kZQorLSBQeXRob24gYmluZGluZ3MgYXJlIG5vdyB2ZXJzaW9uICgwLDQyLDApCistIFB5dGhvbiBiaW5kaW5ncyBBUEkgaGFzIGNoYW5nZWQgb24gdGhlIHNlcnZpY2Ugc2lkZQorLSBkYnVzLnNlcnZpY2UgaGFzIGJlZW4gc3BsaXQgb3V0IGFzIGEgc2VwZXJhdGUgbW9kdWxlCistIGRidXMuc2VydmljZS5TZXJ2aWNlIGlzIHJlbmFtZWQgdG8gZGJ1cy5zZXJ2aWNlLkJ1c05hbWUKKy0gZGJ1cy5zZXJ2aWNlLk9iamVjdCBoYXMgc3dhcHBlZCB0aGUgYnVzX25hbWUgYW5kIG9iamVjdF9wYXRoIGNvbnN0cnVjdG9yCisgIHBhcmFtZXRlcnMgdG8gbWFrZSBpdCBlYXNpZXIgdG8gZG8gaW5oZXJpdGFuY2Ugb3ZlciB0aGUgYnVzCistIGRidXMuZ2xpYiBoYXMgYmVlbiBzZXBlcmF0ZWQgb3V0IGluIG9yZGVyIHRvIGxlc3NlbiB0aGUgZGVwZW5kZW5jeSBvbiBnbGliCisgIGFuZCB0byBhbGxvdyBvdGhlciBtYWlubG9vcHMgdG8gYmUgaW50ZWdyYXRlZCB3aXRoIHRoZSBiaW5kaW5ncyBpbmNsdWRpbmcKKyAgYSBwbGFubmVkIGdlbmVyaWMgbWFpbmxvb3AgZm9yIG5vbi1ndWkgYXBwcy4KKy0gUHl0aG9uIGJpbmRpbmdzIG5vdyBhcXVpcmUgdGhlIEdJTCB3aGVuIGNhbGxpbmcgYmFjayBpbnRvIHRoZSBweXRob24KKyAgaW50ZXJwcmV0ZXIuICBGaXhlcyBjcmFzaGVzIHdoZW4gdXNpbmcgdGhyZWFkaW5nIGFuZCBvdGhlciByYW5kb20gc2VnZmF1bHRzLgorLSBOZXcgUHl0aG9uIHR1dG9yaWFsCistIE51bWVyb3VzIEQtQnVzIGJ1ZyBmaXhlcyBhbGwgYXJvdW5kCisKK0QtQlVTIDAuMzQgKDE1IEp1bmUgMjAwNSkKKz09PQorLSBkYnVzX2Nvbm5lY3Rpb25fZGlzY29ubmVjdCBpcyBkZXByZWNhdGVkIGluIGZhdm9yIG9mIGRidXNfY29ubmVjdGlvbl9jbG9zZQorLSBUaGUgYnVzIGNhbiBub3cgdXNlIERfTk9USUZZIChpZiBhdmFpbGFibGUpIHRvIGNoZWNrIHdoZW4gY29uZmlndXJhdGlvbiBmaWxlcyAKKyAgaGF2ZSBjaGFuZ2VkIGFuZCByZWxvYWQgdGhlbQorLSBOZXcgZGJ1c19tZXNzYWdlX2hhc19wYXRoL21lbWJlci9pbnRlcmZhY2UgQVBJIGFkZGVkCistIFRoZSBQaW5nIG1lc3NhZ2UgZnJvbSB0aGUgb3JnLmZyZWVkZXNrdG9wLkRCdXMuUGVlciBpbnRlcmZhY2UgaXMgbm93IGhhbmRsZWQKKy0gQ29tcGxldGUgZ2xpYiBiaW5kaW5ncyBvdmVyaGF1bCAoYW5kIGFyZSBzdGlsbCB1bmRlciBjb25zdHJ1Y3Rpb24pCistIFR1dG9yaWFsIG5vdyBoYXMgYW4gdXBkYXRlZCBHTGliIHNlY3Rpb24gCistIEdMaWIgYmluZGluZ3MgY2FuIG5vdyBzZW5kL3JlY2VpdmUgaGFzaCB0YWJsZXMsIGFycmF5cyBhbmQgb3RoZXIgY29tcGxleCB0eXBlcworLSBQeXRob24gYmluZGluZ3Mgb3ZlcmhhdWwgKG1vc3QgcHVibGljIGZhY2luZyBBUEkncyBkb25lKQorLSBQeXRob24gYmluZGluZ3MgaGF2ZSBiZWVuIHNwbGl0IHVwIGludG8gc2VwYXJhdGUgZmlsZXMKKy0gUHl0aG9uIGFkZGVkIG5ldyB0eXBlIGNsYXNzZXMgZm9yIGhpbnRpbmcgdG8gdGhlIG1hcnNoYWxlciB3aGF0IHR5cGUKKyAgdG8gc2VuZCBvdmVyIHRoZSB3aXJlCistIFB5dGhvbiBiaW5kaW5ncyBub3cgaGF2ZSBkZWNvcmF0b3JzIGZvciBzcGVjaWZ5aW5nIGV4cG9ydGVkIG1ldGhvZHMgYW5kIHNpZ25hbHMKKy0gTnVtZXJvdXMgYnVnIGZpeGVzCisKK0QtQlVTIDAuMzMgKDI1IEFwciAyMDA1KQorPT09CisKKy0gZG93bmdyYWRlIHJlcXVpcmVtZW50IGZyb20gR1RLKy0yLjYgdG8gMi40IGZvciBidWlsZGluZyBndGsgY29tcG9uZW50cworLSBweXRob24gYmluZGluZyBBUEkncyBoYXZlIGJlZW4gb3ZlcmhhbGxlZCB0byBiZSBtb3JlICJweXRob25pYyIgYW5kIGNsZWFuZXIKKy0gcHl0aG9uIGJpbmRpbmdzIG5vdyBleHBvcnQgZGJ1cy52ZXJzaW9uIHdoaWNoIGlzIHNldCB0byAoMCw0MCwwKQorLSBweXRob24gYmluZGluZ3Mgbm93IGltcGxlbWVudCB0aGUgb3JnLmZyZWVkZXNrdG9wLkRCdXMuSW50cm9zcGVjdGFibGUgaW50ZXJmYWNlCistIHB5dGhvbiBiaW5kaW5nIG1hdGNoIHJ1bGVzIGFyZSBub3cgbW9yZSBmbGV4YWJsZQorLSBtYWtlIGNoZWNrIGhhcyBiZWVuIGZpeGVkCistIG1hbnksIG1hbnkgbWFqb3IgYnVnIGZpeGVzCisKK0QtQlVTIDAuMzIgKDI5IE1hciAyMDA1KQorPT09CisKKy0gbW9ubyBiaW5kaW5ncyBub3cgY29tcGlsZXMgY29ycmVjdGx5CistIG1vbm8gYmluZGluZyBjbGVhbnVwcworLSBnbGliIGJpbmRpbmdzIGdlbmVyYXRlcyB3cmFwcGVycyBmb3IgYnVzIG1ldGhvZHMgaW4gZGJ1cy1nbGliLWJpbmRpbmdzLmgKKy0gZ2xpYiBiaW5kaW5nIGNsZWFudXMKKy0gdXNlcnMgYW5kIGdyb3VwcyBjYW4gbm93IGJlIHNwZWNpZmllZCBieSBVSUQgYW5kIEdJRCBpbiBjb25maWcgZmlsZXMKKy0gbnVtZXJvdXMgbWVtb3J5IGxlYWsgZml4ZXMKKy0gdmFyaW91cyBvdGhlciBmaXhlcworCitELUJVUyAwLjMxICgwNyBNYXIgMjAwNSkKKz09PQorCistIGxhbmQgdGhlIG5ldyBtZXNzYWdlIGFyZ3MgQVBJIGFuZCByZWN1cnNpdmUgdHlwZSBzeXN0ZW0KKy0gYWRkIGRvY3MgYW5kIGZpeGVkIERveHlnZW4gd2FybmluZ3MgdGhyb3VnaHQgc291cmNlCistIHNwbGl0IG91dCBzb21lIGZ1bmN0aW9ucyBub3QgbmVlZGVkIGluIGxpYmRidXMgdG8gKi11dGlsLmMgc291cmNlIGZpbGVzCistIHRha2Ugb3V0IHR5cGUgY29udmllbmllbmNlIGZ1bmN0aW9ucworLSBsaWJkYnVzIG5vdyBiYWNrIGJlbG93IDE1MEsKKy0gYm9vbGVhbnMgYXJlIG5vdyAzMi1iaXQgaW5zdGVhZCBvZiA4LWJpdAorLSBzcGVjaWZpY2F0aW9uIHVwZGF0ZWQKKy0gZ3JhbmQgcmVuYW1pbmcgdG8gc3RyaXAgb3V0IHRoZSB1c2Ugb2YgInNlcnZpY2UiCisgIGp1c3Qgc2F5ICJuYW1lIiBpbnN0ZWFkIChvciAiYnVzIG5hbWUiIHdoZW4gYW1iaWd1b3VzKQorLSByZW5hbWUgZGJ1cy1kYWVtb24tMSB0byBkYnVzLWRhZW1vbiB0aHJvdWdob3V0CistIHJlbmFtZSBhY3RpdmF0aW9uIHRvIGF1dG8tc3RhcnQKKy0gYXV0by1zdGFydCBvbiBieSBkZWZhdWx0IG5vdworLSBub3RlIHRoYXQgbGliZGJ1cyBpcyB0aGUgbG93LWxldmVsIEFQSQorLSBweXRob24gYmluZGluZ3MgdXBkYXRlZCB0byB0aGUgbmV3IEFQSQorLSBtb25vIGJpbmRpbmdzIHVwZGF0ZWQgdG8gdGhlIG5ldyBBUEkKKy0gYWRkIDE2IGJpdCB0eXBlcworLSBkaWN0aW9uYXJpZXMgYXJlIG5vdyBBUlJBWVMgb2YgRElDVF9FTlRSWQorLSBkYnVzLWdsaWItdG9vbCByZW5hbWVkIHRvIGRidXMtYmluZGluZy10b29sCistIG1hc3NpdmUgcmV3cml0ZSBvZiB0aGUgZ2xpYiBiaW5kaW5ncworLSBzYW5lciBuYW1lcyBmb3IgdGhlIGRidXMgaW50ZXJmYWNlLCBvYmplY3QgcGF0aCBhbmQgc2VydmljZSBkZWZpbmVzCistIG5ldyBmdW5jdGlvbnMgZm9yIGhhbmRsaW5nIHR5cGUgc2lnbml0dXJlcworLSBidW1wIHNvbmFtZXMgZm9yIGxpYmRidXMgYW5kIGxpYmRidXMtZ2xpYgorLSB2YXJpb3VzIHNtYWxsIGZpeGVzCisKK0QtQlVTIDAuMjMgKDExIEphbiAyMDA1KQorPT09CisKKy0gYWRkIHNldGdyb3VwcygpIHRvIGRyb3Agc3VwcGxlbWVudGFyeSBncm91cHMKKy0gdXBkYXRlZCBTRUxpbnV4IHN1cHBvcnQKKy0gYWRkIGFuICJhdCBjb25zb2xlIiBzZWN1cml0eSBwb2xpY3kKKy0gZml4IGEgYnVnIHdoZXJlIG9yZy5mcmVlZGVza3RvcC5EQnVzIHdhc24ndCByZWNvZ25pemVkIGFzIGFuIGV4aXN0aW5nCisgIHNlcnZpY2UuCistIGVycm9yIG91dCBpZiAtLWVuYWJsZS1tb25vIGlzIGV4cGxpY2l0bHkgc2V0IGFuZCBtb25vIGxpYnMgY2FuJ3QgYmUgZm91bmQKKy0gc2V0IHRoZSBtYXhfbWF0Y2hfcnVsZXNfcGVyX2Nvbm5lY3Rpb24gbGltaXQgZnJvbSB0aGUgY29uZmlnIGZpbGUuCistIHJlbW92ZWQgZGJ1c19idWdfZ2V0X3dpdGhfZ19tYWluIHNpbmNlIGl0J3MgYmVlbiByZXBsYWNlZCBieQorICBkYnVzX2dfYnVzX2dldAorLSBmaXggZmQgbGVha3MgaW4gc29ja2V0IGNvZGUKKy0gbG90cyBhbmQgbG90cyBvZiBtb25vIGJpbmRpbmcgdXBkYXRlcywgaW5jbHVkaW5nIGZpeGVzIHRvIG1ha2UgaXQKKyAgY29tcGF0aWJsZSB3aXRoIE1vbm8gMS4xLjMKKy0gYWRkZWQgLS1ub2Zvcmsgb3B0aW9uIHRvIG92ZXJyaWRlIGNvbmZpZyBmaWxlIHNldHRpbmcgYXQgcnVudGltZQorLSBhZGRlZCBzdXBwb3J0IGZvciBpbnQ2NCBhbmQgdWludDY0IHRvIHRoZSBweXRob24gYmluZGluZ3MKKy0gbG90cyBvZiBweXRob24gYmluZGluZyB1cGRhdGVzCistIGNvbmZpZyBmaWxlIERURCB1cGRhdGVzCistIHVzZSBTZXJpdmNlT3duZXJDaGFuZ2VzIHNpZ25hbCBpbnN0ZWFkIG9mIFNlcnZpY2VDcmVhdGVkIGFuZAorICBTZXJ2aWNlRGVsZXRlZAorLSBmaXhlcyB0byB0aGUgYXV0aGVudGljYXRpb24gY29kZQorLSBuZXcgaW5pdCBzY3JpcHQgZm9yIFNsYWNrd2FyZQorLSBwcmludCBvdXQgdGhlIHBpZCBldmVuIHdoZW4gLS1mb3JrIGlzIHBhc3NlZAorLSBpbmNyZWFzZSBwcmVhbGxvY2F0aW9uIHNpemVzIGluIERCdXNNZXNzYWdlIHRvIGhlYXZpbHkgcmVkdWNlCisgIHJlYWxsb2NzCistIGxvdHMgb2YgcGVyZm9ybWFuY2UgZW5oYW5jZW1lbnRzCistIGxvdHMgbW9yZSBzbWFsbCBidWcgZml4ZXMKKworRC1CVVMgMC4yMgorPT09CisKKy0gYWRkIC0tcmVwbHktdGltZW91dCB0byBkYnVzLXNlbmQKKy0gZml4IGEgbWVtbGVhaworLSBmaXggU29sYXJpcy9Gb3J0ZSBidWlsZAorLSBzd2l0Y2ggdG8gQUZMIDIuMSByYXRoZXIgdGhhbiAyLjAgdG8gYWRkcmVzcyBwYXRlbnQgdGVybWluYXRpb24gY2xhdXNlIAorICBjb25jZXJucworLSBhZGQgU0VMaW51eCBzdXBwb3J0CistIG1vc3RseSByZXBhaXIgbGlieG1sIGJhY2tlbmQgZm9yIGNvbmZpZyBwYXJzZXIsIHN0aWxsIGRvZXNuJ3QgCisgIHBhc3Mgb3V0IG9mIG1lbW9yeSB0ZXN0cworLSBmaXggZGlzdGNoZWNrIHRvIGluY2x1ZGUgbGFuZ3VhZ2UgYmluZGluZ3MKKy0gYWRkIEdldENvbm5lY3Rpb25Vbml4VXNlciBtZXRob2Qgb24gYnVzIGRyaXZlcgorLSBhbHNvIGZvciBVbml4UHJvY2Vzc0lECistIGxvdHMgb2YgUHl0aG9uLCBNb25vLCBvdGhlciBiaW5kaW5nIGZpeGVzCistIGNoYW5nZSBHTGliIGJpbmRpbmdzIHRvIG5vdCBpbmNsdWRlIGRidXMvZGJ1cy5oIChmdWxseSBlbmNhcHN1bGF0ZSBsaWJkYnVzKQorLSBwYXNzIHBhdGhzIGFzIHN0cmluZ3MsIG5vdCBhcnJheXMgb2Ygc3RyaW5nCistIGFkZCBtZXNzYWdlIHNpZ25hdHVyZSBoZWFkZXIgZmllbGQKKy0gY2xlYW51cHMgdG8gbWFyc2hhbGluZyBjb2RlCistIGNsZWFuIHVwIGF1dGhlbnRpY2F0aW9uIGNvZGUKKy0gcmVsb2FkIGNvbmYgZmlsZXMgb24gU0lHSFVQCistIHJlbmFtZSBTRVJWSUNFL1NFTkRFUl9TRVJWSUNFIHRvIERFU1RJTkFUSU9OL1NFTkRFUgorLSBmaXggY2lyY3VsYXIgY29uZiBmaWxlIGluY2x1c2lvbgorLSBhbGxvdyBlbXB0eSBhcnJheXMKKy0gdG9ucyBvZiBvdGhlciBzbWFsbCBidWdmaXhlcworCitELUJVUyAwLjIxCis9PT0KKworLSBpbXBsZW1lbnQgImF1dG8gYWN0aXZhdGlvbiIgZmxhZyBvbiBtZXNzYWdlcywgc28gdGhlIGRlc3RpbmF0aW9uIAorICBzZXJ2aWNlIGNhbiBiZSBsYXVuY2hlZCBhdXRvbWF0aWNhbGx5CistIGZpeCBhIGJ1ZyBpbiBjdXN0b20gdHlwZSBtYXJzaGFsaW5nCistIG9wdGltaXplIGNhc2Ugd2hlcmUgbXVsdGlwbGUgYXBwcyBhY3RpdmF0ZSB0aGUgc2FtZSBzZXJ2aWNlCisgIChhdm9pZCAidGh1bmRlcmluZyBoZXJkIikKKy0gYWRkIGR5bmFtaWMgc2VydmljZSBmaWxlIGRpc2NvdmVyeS9yZWxvYWRpbmcKKy0gZml4IGEgYnVzeSBsb29wIHdoZW4gYmxvY2tpbmcgZm9yIGEgcmVwbHkKKy0gZml4IGEgNjQtYml0IGNyYXNoIGludm9sdmluZyB2YXJhcmdzCistIGZpeCBhIGJ1cyBjcmFzaCB3aGVuIHByb2Nlc3NpbmcgYW4gQWNxdWlyZVNlcnZpY2UKKy0gYWxsb3cgYXBwZW5kaW5nIFRZUEVfQllURSB2aWEgYXBwZW5kX2FyZ3NfdmFsaXN0CistIGZpeCBkaWN0cy1pbnNpZGUtZGljdHMKKy0gZW5oYW5jZW1lbnRzIHRvIFB5dGhvbiBhbmQgUXQgYmluZGluZ3MKKworRC1CVVMgMC4yMAorPT09CisKK1RoaXMgcmVsZWFzZSBsYW5kcyBzb21lIHZlcnkgbGFyZ2UgQVBJIGNoYW5nZXMgYW5kIG51bWVyb3VzIGJ1Z2ZpeGVzLgorVGhlIGxpc3Qgb2YgY2hhbmdlcyBpcyB0b28gbGFyZ2UgdG8gZnVsbHkgZG9jdW1lbnQgaGVyZTsgcGxlYXNlIHJlZmVyCit0byB0aGUgZG9jdW1lbnRhdGlvbiwgYW5kIG1lc3NhZ2UtYnVzLWxpc3QgYXJjaGl2ZXMuCisKK0QtQlVTIDAuMTMKKz09PQorCitUaGlzIGlzIHByb2JhYmx5IHRoZSBsYXN0IHJlbGVhc2UgYmVmb3JlIGxhbmRpbmcgdGhlIGxhcmdlIEFQSSBjaGFuZ2VzCitvbiB0aGUgImRidXMtb2JqZWN0LW5hbWVzIiBicmFuY2guCisKKy0gZml4IHN5c3RlbSBidXMgdG8gYWx3YXlzIHVzZSBmaWxlc3lzdGVtIHNvY2tldDsgYW55b25lIAorICBjYW4gY3JlYXRlIGFueSBhYnN0cmFjdCBzb2NrZXQsIHdoaWNoIGlzbid0IHNlY3VyZSAKKyAgc2luY2UgaWYgeW91IGNhbiBjcmFzaCB0aGUgc3lzdGVtIGJ1cyB5b3UnZCBiZSBhYmxlCisgIHRvIHJlcGxhY2UgaXQuCistIGFkZCBEVEQgZm9yIGNvbmZpZ3VyYXRpb24gZmlsZQorLSBpbXByb3ZlIHNwZWNpZmljYXRpb24gYSBiaXQKKworRC1CVVMgMC4xMgorPT09CisKKy0gZml4ICJzZXJ2aWNlIG1lc3NhZ2VidXMgc3RhdHVzIiBvbiBSZWQgSGF0CistIGZpeCBkZW1hcnNoYWxpbmcgb2YgREJVU19UWVBFX05BTUVECistIGZpeCAiZXZhbCBgZGJ1cy1sYXVuY2ggLS1leGl0LXdpdGgtc2Vzc2lvbmAiIHRvIGV4aXQgcHJvcGVybHkKKy0gZml4IGJ1aWxkIHdpdGhvdXQgLS1wcmVmaXgKKy0gdXNlbGVzcyBmb29saW5nIHdpdGggTW9ubyBiaW5kaW5ncworLSB1c2VsZXNzIGZvb2xpbmcgd2l0aCBnY2ogYmluZGluZ3MKKy0gZml4IHNyY2RpciAhPSBidWlsZGRpcgorLSBmaXggdmFyaW91cyBjb21waWxlciB3YXJuaW5ncyBhbmQgb3RoZXIgaXNzdWVzCistIGFkZCBnZXQvc2V0IGRhdGEgdG8gREJ1c01lc3NhZ2UKKy0gZml4IGhlYWRlcnMgZm9yIEMrKworLSBPUyBYIGJ1aWxkIGZpeGVzCistIGFic3RyYWN0IGRvbWFpbiBzb2NrZXRzIHN1cHBvcnQgKExpbnV4IG9ubHkpCistIGFkZCBkYnVzLWNsZWFudXAtc29ja2V0cyB1dGlsaXR5IGZvciBwZW9wbGUKKyAgbm90IHVzaW5nIGxpbnV4CistIGJlIGNvbnNpc3RlbnQgYWJvdXQgZGVmYXVsdGluZyB0byAtLXNlc3Npb24vLS1zeXN0ZW0gCisgIHdpdGggY29tbWFuZCBsaW5lIHRvb2xzCistIG1lcmdlIGluIHBvbGljaWVzIGZyb20gaW5jbHVkZWQgY29uZmlnIGZpbGVzCistIGZpeCBidWlsZCBvbiBub24teDg2CistIGRvY3MgdXBkYXRlcworLSBsb3RzIG9mIG90aGVyIGJ1Z2ZpeGVzCisKK0QtQlVTIDAuMTEKKz09PQorCistIGFkZCAtLWVuYWJsZS1kb2NzIHRvIHR1cm4gb2ZmL29uIHRoZSBkb2Nib29rIHN0dWZmCisgIChkb2Vzbid0IGNvdmVyIGRveHlnZW4gc3R1ZmYgeWV0KQorLSBtYWtlIHBlb3BsZSBkZWZpbmUgREJVU19BUElfU1VCSkVDVF9UT19DSEFOR0UKKyAgYW5kIHJlYWQgd2FybmluZyBpbiBSRUFETUUgc28gdGhleSBkb24ndCAKKyAgZXhwZWN0IHRoZSBBUEkgdG8gYmUgZnJvemVuIGFscmVhZHkKKy0gcmVuYW1lIC5wYyBmaWxlcyB0byAiZGJ1cy0xLnBjIiBpbnN0ZWFkIG9mIAorICAiZGJ1cy0xLjAucGMiIGV0Yy4gLSB0aGlzIHdpbGwgcmVxdWlyZSBjaGFuZ2luZyAKKyAgcGtnLWNvbmZpZyBpbnZvY2F0aW9ucworLSBzb21lIGRvY3MgY2xlYW51cHMKKy0gYWRkIG1hbiBwYWdlcyBmb3IgYWxsIGV4ZWN1dGFibGVzCistIGFsbG93IHNlbmQgdG8vZnJvbSBidXMgZHJpdmVyIGluIHRoZSBkZWZhdWx0IHN5c3RlbS5jb25mCistIGZpeCB1c2VyIGxvb2t1cCBidWcKKy0gaW1wbGVtZW50IGRidXMtbGF1bmNoIHRvIGxhdW5jaCB0aGUgc2Vzc2lvbiBtZXNzYWdlIGJ1cworLSBmaXggc29tZSB0aHJlYWQgZGVhZGxvY2tzCistIHNvbWUgcGVyZm9ybWFuY2UgcHJvZmlsaW5nL29wdGltaXphdGlvbgorLSBhZGQgZGJ1c19idXNfYWN0aXZhdGVfc2VydmljZSgpIGZ1bmN0aW9uCistIGZpeCBzb21lIG1pbm9yIGJ1Z3MgaGVyZSBhbmQgdGhlcmUKKy0gaW5zdGFsbCBSZWQgSGF0IGluaXRzY3JpcHQgaW4gdGhlIHJpZ2h0IHBsYWNlCisKK0QtQlVTIDAuMTAKKz09PQorCistIHJldmVyc2VkIG9yZGVyIG9mIGFyZ3MgdG8gZGJ1c19tZXNzYWdlX25ldygpCistIHJlbmFtZWQgZGJ1c19tZXNzYWdlX25hbWVfaXMoKSBhbmQgc29tZSBvdGhlcgorICBmdW5jdGlvbnMKKy0gY2hhbmdlIERCdXNXYXRjaCB0byBoYXZlIGRidXNfd2F0Y2hfaGFuZGxlKCkgCisgIHNpbWlsYXIgdG8gZGJ1c190aW1lb3V0X2hhbmRsZSgpLCBkcm9wIAorICBjb25uZWN0aW9uL3NlcnZlci1zcGVjaWZpYyBoYW5kbGUgcm91dGluZXMKKy0gY2hhbmdlIG1lc3NhZ2Ugc2VyaWFscyB0byBiZSB1bnNpZ25lZAorLSBpbXBsZW1lbnRlZCA8YWxsb3c+LzxkZW55Pi88bGltaXQ+IGZlYXR1cmVzIGZvciAKKyAgY29uZmlnIGZpbGU7IHN5c3RlbSBidXMgbm93IGhhcyBhIGRlbnktYWxsIHBvbGljeSAKKyAgYnkgZGVmYXVsdC4KKy0gc3lzdGVtLmNvbmYgaGFzIDxpbmNsdWRlZGlyPnN5c3RlbS5kPC9pbmNsdWRlZGlyPgorICBzbyBwYWNrYWdlcyBjYW4gaW5zdGFsbCBhZGRpdGlvbnMgdG8gdGhlIGRlZmF1bHQgCisgIHBvbGljeSB0byA8YWxsb3c+IHRoZSBtZXNzYWdlcyB0aGV5IG5lZWQuIGUuZy4KKyAgQ1VQUyBtaWdodCBpbnN0YWxsIGEgY3Vwcy5jb25mIC0gc2VlIAorICB0ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzL3N5c3RlbS5kL3Rlc3QuY29uZiAKKyAgZm9yIGFuIGV4YW1wbGUuCistIGFkZCB0aW1lb3V0cyBmb3IgYXV0aGVudGljYXRpb24sIGFjdGl2YXRpb24KKy0gYWRkIGdsaWItc3R5bGUgImNoZWNrcyIgb24gcHVibGljIEFQSSwgZW5hYmxlIAorICB0aG9zZSBieSBkZWZhdWx0LCBkaXNhYmxlIGFzc2VydGlvbnMgYnkgZGVmYXVsdAorLSBhZGQgR01haW5Db250ZXh0IGFyZ3VtZW50IHRvIEdMaWIgc2V0dXAgZnVuY3Rpb25zLCAKKyAgY2FuIGJlIE5VTEwgZm9yIGRlZmF1bHQgY29udGV4dC4gTmVlZGVkIGZvciB0aHJlYWRzLgorLSBhZGQgNjQtYml0IGludGVnZXIgdHlwZQorLSB2YWxpZGF0ZSB0eXBlIG9mIHN0YW5kYXJkIG1lc3NhZ2UgaGVhZGVyIGZpZWxkcworLSBjb25zaWRlciBtZXNzYWdlcyBpbiB0aGUgb3JnLmZyZWVkZXNrdG9wLkxvY2FsCisgIG5hbWVzcGFjZSB0byBiZSBpbnZhbGlkICh0byBhdm9pZCBmYWtlIGRpc2Nvbm5lY3QgCisgIG1lc3NhZ2VzIGZvciBleGFtcGxlKQorLSBmaXggYXNzb3J0ZWQgbWVtb3J5IGxlYWtzIGFuZCBvdGhlciBidWdzIGluIAorICB0aGUgU0hBLTEgYXV0aCBtZWNoYW5pc20KKy0gY2FjaGUgdXNlciBkYXRhYmFzZSBpbmZvcm1hdGlvbiAoZ3JvdXBzIHVzZXIgaXMgCisgIGluLCBldGMuKSBoZWxwcyBhIGxvdCB3aXRoIE5JUworLSBhbHdheXMgc3RvcmUgdWlkX3QsIHBpZF90LCBnaWRfdCBpbiAidWxvbmciIAorICByYXRoZXIgdGhhbiAiaW50IgorLSBpbXBsZW1lbnQgY29uZmlnIGZpbGUgc2V0dGluZ3MgZm9yIHdoaWNoIAorICB1c2VycyBjYW4gY29ubmVjdAorLSBTSEEtMSB1bml0IHRlc3QKKy0gZGJ1cy1zZW5kLCBkYnVzLW1vbml0b3IgY29tbWFuZCBsaW5lIHV0aWxpdGllcworLSBmaXhlZCBsb3RzIG9mIG1pc2MgY3Jhc2hlcyBhbmQgb3RoZXIgYnVncworCitELUJVUyAwLjkKKz09PQorCistIGltcGxlbWVudGVkIGEgdGVzdCBjYXNlIGZvciBzZXJ2aWNlIGFjdGl2YXRpb24sCisgIGFuZCBmaXhlZCBtYW55IGJ1Z3MgZXhwb3NlZCBieSB0aGF0CistIGltcGxlbWVudGVkIHJlY3Vyc2l2ZSBhcmd1bWVudCBtYXJzaGFsaW5nL2RlbWFyc2hhbGluZyAKKyAgZm9yIG1lc3NhZ2VzLCBhbGxvd2luZyBtdWx0aWRpbWVuc2lvbmFsIGFycmF5cworLSBmaXhlZCB1cCBpbnRlZ3JhdGlvbiBvZiBtZXNzYWdlIGRpc3BhdGNoIHdpdGggCisgIG1haW4gbG9vcCBieSBhZGRpbmcgYSBjYWxsYmFjayBvbiBjaGFuZ2Ugb2YgCisgIGRpc3BhdGNoIHN0YXR1cworLSBhZGQgYSBwaWRmaWxlIGZlYXR1cmUgdG8gZGFlbW9uCistIHNvbWUgYnVpbGQgZml4ZXMKKy0gY2xlYW4gdXAgdW5peCBkb21haW4gc29ja2V0cyBvbiBleGl0CistIGFkZCAtLXByaW50LWFkZHJlc3MgYW5kIHRoZSBhYmlsaXR5IAorICB0byBjcmVhdGUgYSByYW5kb20gc2VydmVyIGFkZHJlc3MgCisgIGluIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeQorCitELUJVUyAwLjgKKz09PQorCistIGZpeCBkdW1iIGJ1ZyBpbiAwLjcKKworRC1CVVMgMC43Cis9PT0KKworLSBpbXBsZW1lbnQgY29uZmlndXJhdGlvbiBmaWxlIHVzZWQgdG8gY29udHJvbCBidXMgY2hhcmFjdGVyaXN0aWNzCistIGltcGxlbWVudCBkYWVtb24gbW9kZSwgY2hhbmdpbmcgdXNlciBJRCwgYW5kIG90aGVyIHN5c3RlbQorICBidXMgZmVhdHVyZXMKKy0gYWRkIGluaXQgc2NyaXB0cyBmb3Igc3lzdGVtd2lkZSBidXMKKy0gYWRkICJtYWtlIGNoZWNrLWNvdmVyYWdlIiB0YXJnZXQgdG8gY2hlY2sgdGVzdCBjb3ZlcmFnZQorLSBtb3JlIHRlc3Qgc3VpdGUgYWRkaXRpb25zCistIG1hbnksIG1hbnkgYnVnZml4ZXMKKy0gbWFueSBBUEkgY2hhbmdlcy9maXhlcworCitELUJVUyAwLjYKKz09PQorLSBWYXN0bHkgaW1wcm92ZWQgYnVzIGRhZW1vbiB0ZXN0IHN1aXRlCistIExvdHMgb2YgbWlzYy4gYnVnZml4ZXMgYW5kIG1lbW9yeSBsZWFrIGZpeGVzCistIFN1cHBvcnQgZm9yIG1hcnNoYWxsaW5nIGtleS92YWx1ZSBkYXRhCistIEFjdGl2YXRpb24gaW1wcm92ZW1lbnRzLgorCitELUJVUyAwLjUKKz09PQorCistIFNwZWNpZmljYXRpb24gdXBkYXRlcworLSBwb3J0IHRvIE9TIFggYW5kIG90aGVyIEJTRCB2YXJpYW50cworLSBwb3J0IHRvIFNvbGFyaXMKKy0gUGFydGlhbCB3b3JrIG9uIGNvb2tpZS1iYXNlZCBhdXRoZW50aWNhdGlvbgorLSBUaHJlYWQgc2FmZXR5IGZpeGVzCistIExvdHMgb2YgbWlzYy4gYnVnZml4ZXMKKy0gU3VwcG9ydCBmb3IgbW9yZSBhcnJheSB0eXBlcworLSBBZGQgZGF0YSBzbG90cyB0byBEQnVzU2VydmVyCistIERCdXNTdHJpbmcgc2VjdXJpdHkgYXVkaXQgZml4ZXMKKy0gRml4IGZvciBzeXN0ZW1zIChvciB2YWxncmluZCkgd2l0aCB1bmFsaWduZWQgbWFsbG9jIGJsb2NrcworCitELUJVUyAwLjQKKz09PQorCistIFByZWxpbWluYXJ5IGFjdGl2YXRpb24gc3VwcG9ydC4KKy0gQmV0dGVyIGF1dGhlbnRpY2F0aW9uIHRlc3Qgc3VpdGUKKy0gQnVzIHRlc3QgcHJvZ3JhbQorLSBTcGVjaWZpY2F0aW9uIHVwZGF0ZXMKKy0gVGhyZWFkIHNhZmV0eQorLSBCdWcgZml4ZXMKKworRC1CVVMgMC4zCis9PT0KKworIC0gUHJlbGltaW5hcnkgbGltaXRhdGlvbnMgCisgLSBNZXNzYWdlIHNlbmRpbmcgd29ya3MKKyAtIEJ1cyBjbGllbnQKKyAtIEFycmF5IG1hcnNoYWxsaW5nL2RlbWFyc2hhbGxpbmcKKyAtIFNlcnZpY2VzCisgLSBCZXR0ZXIgT09NIGhhbmRsaW5nIGluIHRoZSBidXMKKyAtIEluLXByb2MgZGVidWcgdHJhbnNwb3J0CisgLSBUcmFuc3BvcnQvc2VydmVyIGFkZHJlc3Mgc3VwcG9ydAorCitELUJVUyAwLjIKKz09PQorCisgLSBJbmNsdWRlIHRlc3QgY29kZSBpbiB0aGUgdGFyYmFsbC4KKworRC1CVVMgMC4xCis9PT0KKworIC0gSW5pdGlhbCByZWxlYXNlLgpkaWZmIC0tZ2l0IGEvTkVXUy5wcmUtMS0yIGIvTkVXUy5wcmUtMS0yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5ODk4ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9ORVdTLnByZS0xLTIKQEAgLTAsMCArMSwxNTMgQEAKK0QtQnVzIDEuMi4xICgwNCBBcHJpbCkKKz09CistIER1ZSB0byBpc3N1ZXMgcHV0dGluZyB0aGUgcmUtbGljZW5zaW5nIGVmZm9ydCBvbiBob2xkIGluZGVmaW5pdGVseSwgaXQgaGFzIAorICBiZWVuIGRlY2lkZWQgdG8gbW92ZSB0byAxLjIueCB2ZXJzaW9uaW5nIHNjaGVtZS4gIEJlaW5nIHRoYXQgMS4xLjIwIGlzIAorICBjb25zaWRlcmVkIHRvIGFsc28gYmUgMS4yLjAgYW5kIHRoaXMgYmVpbmcgdGhlIHNlY29uZCByZWxlYXNlIGluIHRoZSAxLjIueCAKKyAgc3RhYmxlIHNlcmllcyB3ZSBoYXZlIHZlcnNpb25lZCB0aGlzIHJlbGVhc2UgMS4yLjEuIFRoaXMgcmVsZWFzZSBjb250YWlucyBhIAorICBudW1iZXIgb2YgYnVnIGZpeGVzIGlkZW50aWZpZWQgYWZ0ZXIgMS4xLjIwLgorLSBjb21waWxlcyB1bmRlciBzb21lIG9sZGVyIHZlcnNpb25zIG9mIGdsaWJjCistIGNvbXBpbGVzIHdpdGhvdXQgWCBzdXBwb3J0IG9uY2UgYWdhaW4KKy0gZml4IHN0dWNrIHNlcnZlciBncmFiIGlmIGRidXMtbGF1bmNoIGlzIHJ1biBpbiBhbiBleGlzdGluZyBELUJ1cyBYIHNlc3Npb24KKy0gdmFyaW91cyBNYWMgT1NYIGJ1aWxkIGZpeGVzIGFkZGVkCistIGRvbid0IHVzZSB0aGUgYnJva2VuIHBvbGwgY2FsbCBvbiBNYWMgT1NYCistIGJldHRlciBjaGVja3MgZm9yIGxpbmtlciBmbGFnIHN1cHBvcnQgc2hvdWxkIGFsbG93IEQtQnVzIHRvIGxpbmsgdW5kZXIKKyAgdmFyaW91cyBsaW5rZXJzCistIGV4aXRfb25fZGlzY29ubmVjdCBpcyBzZXQgYWZ0ZXIgdGhlIGNvbm5lY3Rpb24gcmVnaXN0ZXJzIHdpdGggYSBidXMgc28gd2UgCisgIGRvbid0IGV4aXQgaWYgd2UgZ2V0IGEgZGlzY29ubmVjdCBkdXJpbmcgdGhlIGhhbmRzaGFrZQorLSBkaWN0cyBub3cgd29yayBjb3JyZWN0bHkgd2l0aCBkYnVzLXNlbmQKKy0gaW5vdGlmeSBiYWNrZW5kIGlzIG5vdyBsZXNzIGFnZ3Jlc3NpdmUKKy0gcGVuZGluZyBjYWxscyBleHBpcmUgY29ycmVjdGx5CistIG1lbWxlYWsgb2YgdXVpZCB3aGVuIHRoZSBidXMgaXMgYXV0b2xhdW5jaGVkIGZpeGVkCisKK0QtQnVzIDEuMS4yMCAtICJDb25pc3RlbiBXYXRlciIgKDI3IEZlYnVhcnkpCis9PQorCistIFRoaXMgaXMgdGhlIG5leHQgZ2VuZXJhdGlvbiBzdXBwb3J0ZWQgU1RBQkxFIHJlbGVhc2Ugb2YgRC1CdXMuIEZvciBhbGwgCisgIGludGVudHMgYW5kIHB1cnBvc2VzIHRoaXMgaXMgdGhlIDEuMi4wIHJlbGVhc2UgV0lUSE9VVCB0aGUgcGxhbm5lZCBYMTEvTUlUIAorICBsaWNlbnNlIGNoYW5nZSBkdWUgdG8gYSBjb3VwbGUgb2YgbGljZW5zZSBob2xkZXJzIHdobyBoYXZlIHlldCB0byByZXNwb25kLgorICBGb3IgdGhlIG1vc3QgcGFydCB0aGlzIGxpY2Vuc2UgY2hhbmdlIGlzIGJlaW5nIHBlcnN1ZWQgdG8gc2ltcGxpZnkgbGljZW5zaW5nCisgIGlzc3VlcyBhbmQgZml4IGEgY291cGxlIG9mIGxpY2Vuc2luZyBjb3VybmVyIGNhc2VzLiAgV2hlbiB0aGlzIGhhcHBlbnMgRC1CdXMKKyAgd2lsbCBiZSByZWxlYXNlZCB1bmRlciB0aGUgMS4yLjAgdmVyc2lvbi4KKworLSBELUJ1cyAxLjAueCBlZmZlY3RpdmVseSBnb2VzIGludG8gc2VjdXJpdHkgZml4IG1vZGUgYW5kIHdpbGwgb25seSBiZQorICB1cGRhdGVkIGZvciBtYWpvciBpc3N1ZXMuCisKKy0gRml4ZWQgQ1ZFLTIwMDgtMDU5NSAtIHNlY3VyaXR5IHBvbGljeSBvZiB0aGUgdHlwZSA8YWxsb3cgc2VuZF9pbnRlcmZhY2U9CisgICJzb21lLmludGVyZmFjZS5XaXRoTWV0aG9kcyIvPiB3b3JrIGFzIGFuIGltcGxpY2l0IGFsbG93IGZvcgorICBtZXNzYWdlcyBzZW50IHdpdGhvdXQgYW4gaW50ZXJmYWNlIGJ5cGFzc2luZyB0aGUgZGVmYXVsdCBkZW55IHJ1bGVzIGFuZCAKKyAgcG90ZW50aWFsbHkgYWxsb3dpbmcgcmVzdHJpY3RlZCBtZXRob2RzIGV4cG9ydGVkIG9uIHRoZSBidXMgdG8gYmUgZXhlY3V0ZWQKKyAgYnkgdW5hdXRob3JpemVkIHVzZXJzLiAKKworLSBGaXhlcyBkYnVzLWxhdW5jaCBzbyB0aGUgc2Vzc2lvbiBidXMgZ29lcyBhd2F5IHNvIGRvZXMgRC1CdXMKKworLSBCdWlsZHMgYWdhaW5zdCBsYXRlc3QgZ2NjL2dsaWJjIGNoYW5nZXMKKworLSBDb3JyZWN0bHkgdW5yZWYgY29ubmVjdGlvbnMgd2l0aG91dCBndWlkcyBkdXJpbmcgc2h1dGRvd24KKworLSBBYm91dCB0aGUgbmFtZTogU3VibWl0dGVkIGJ5IEdyZWcgSyBOaWNob2xzb24sIENvbmlzdGVuIFdhdGVyIGlzIGEgbGFrZSBpbiAKKyAgQ3VtYnJpYSwgRW5nbGFuZCB3aGVyZSBzZXZlcmFsIHdhdGVyIHNwZWVkIHJlY29yZHMgaGF2ZSBiZWVuIGJyb2tlbi4gQmV0d2VlbiAKKyAgMTk1NiBhbmQgMTk1OSBTaXIgTWFsY29sbSdzIHNvbiBEb25hbGQgQ2FtcGJlbGwgc2V0IGZvdXIgc3VjY2Vzc2l2ZSByZWNvcmRzIG9uICB0aGUgbGFrZSBpbiBCbHVlYmlyZCBLNywgYSBoeWRyb3BsYW5lLgorICAoV2lraXBlZGlhIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ29uaXN0b25fV2F0ZXIjV2F0ZXJzcGVlZF9yZWNvcmQpCisKK0QtQnVzIDEuMS40IC0gMS4yLjBSQzIgKDE3IEphbnVhcnkgMjAwNykKKz09CistIEZpeGVzIGlub3RpZnkgc3VwcG9ydAorCitELUJ1cyAxLjEuMyAtIDEuMi4wUkMxICgxNSBKYW51YXJ5IDIwMDcpCis9PQorCistIFRoaXMgcmVsZWFzZSBpcyBpbnRlbmRlZCB0byBiZSBSZWxlYXNlIENhbmRpZGF0ZSAxIG9mIG1ham9yIHJlbGVhc2UKKyAgRC1CdXMgMS4yLjAuICBJZiBub3RoaW5nIGlzIGZvdW5kIHRvIGJlIHdyb25nIHdpdGggdGhpcyByZWxlYXNlIGl0CisgIHdpbGwgYmVjb21lIDEuMi4wIHdpdGhpbiBhIHdlZWsuICBJZiB3ZSBuZWVkIHRvIG1ha2UgbWFqb3IgY2hhbmdlcworICB3ZSB3aWxsIHJlbGVhc2UgYW4gUkMyIGFuZCBzdGFydCB0aGUgcHJvY2VzcyBvdmVyIGFnYWluLgorCistIFRoaXMgaXMgYSBkZXZlbG9wbWVudCByZWxlYXNlLCBzbyBBUEkncyBtYXkgc3RpbGwgY2hhbmdlIGlmIHByb2JsZW1zCisgIGFyZSBmb3VuZCAodGhvdWdoIHRoaXMgaXMgZXh0cmVhbWx5IHVubGlrZWx5KS4KKworLSBEVEQgZm9yIHRoZSBpbnRyb3NwZWN0aW9uIGZvcm1hdCBpcyBmaXhlZCBhbmQgdXBsb2FkZWQgdG8gdGhlIHNlcnZlcnMKKworLSBTb3VyY2VzIG5vdyByZXNpZGUgaW4gYSBnaXQgcmVwb3NpdG9yeSBhdCAKKyAgaHR0cDovL2dpdHdlYi5mcmVlZGVza3RvcC5vcmcvP3A9ZGJ1cy9kYnVzLmdpdDthPXN1bW1hcnkKKworLSBBcmd1bWVudCBwYXRoIG1hdGNoaW5nIG9mIHRoZSB0eXBlIGFyZzBwYXRoPScvYWEvYmIvJyBpcyBub3cgc3VwcG9ydGVkCisgIChzZWUgdGhlIHNwZWNpZmljYXRpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24pCisKKy0gTmV3IGVycm9yIG9yZy5mcmVlZGVza3RvcC5EQnVzLkVycm9yLk9iamVjdFBhdGhJblVzZSBhZGRlZAorCistIEF1dG9sYXVuY2hlZCBidXNzZXMgbm93IHNhdmUgdGhlaXIgcGFyYW1ldGVycyBpbiBYMTEgaWYgcG9zc2libGUgbWFraW5nIHRoZW0KKyAgYmVoYXZlIGNsb3NlciB0byBidXNzZXMgbGF1bmNoZWQgdGhyb3VnaCB0aGUgbm9ybWFsIG1lY2hhbmlzbXMgCisKKy0gaW5vdGlmeSBpcyBub3cgdGhlIGRlZmF1bHQgYmFja2VuZCBmb3Igd2F0Y2hpbmcgY29uZmlndXJhdGlvbiBmaWxlIGNoYW5nZXMKKworLSBNb3JlIHN1cHBvcnQgZm9yIHRoZSBBSVggcGxhdGZvcm0gaGFzIGJlZW4gYWRkZWQKKworLSBOdW1lcm91cyBidWcgZml4ZXMgYW5kIHBlcmZvcm1hbmNlIGVuaGFuY2VtZW50cworCitELUJ1cyAxLjEuMiAoMjcgSnVseSAyMDA3KQorPT0KKworLSBUaGlzIHJlbGVhc2UgaXMgaW50ZW5kZWQgdG8gYmUgYSBmZWF0dXJlIGNvbXBsZXRlIGJldGEgZm9yIHN0YWJsZQorICByZWxlYXNlIDEuMi4wLCBwbGVhc2UgdGVzdCBpdC4gMS4yLjAgd2lsbCBmb2xsb3cgcHJldHR5IHNvb24gaWYgbm8KKyAgbWFqb3IgcHJvYmxlbXMgYXJlIGZvdW5kLiAgV2UnbGwgZG8gbW9yZSBiZXRhcyBpZiBzaWduaWZpY2FudAorICBjaGFuZ2VzIGFyZSBtYWRlLgorCistIFRoaXMgaXMgYSBkZXZlbG9wbWVudCByZWxlYXNlLCBzbyBBUEkncyBtYXkgc3RpbGwgY2hhbmdlIGlmIHByb2JsZW1zCisgIGFyZSBmb3VuZCAodGhvdWdoIHdlIHdpbGwgdHJ5IGhhcmQgbm90IHRvKS4KKworLSBUaGUgc3lzdGVtIGJ1cyBub3cgc3VwcG9ydHMgc3RhcnRpbmcgc2VydmljZXMgb24gZGVtYW5kLiBUaGlzIHVzZXMgYQorICBzZXR1aWQgaGVscGVyIHByb2dyYW0gYmVjYXVzZSBzeXN0ZW0gYnVzIGRhZW1vbiBydW5zIGFzIGEgbm9ib2R5CisgIHVzZXIsIHdoaWxlIHNlcnZpY2VzIGl0IGxhdW5jaGVzIG1heSBuZWVkIHRvIHJ1biBhcyBhIGRpZmZlcmVudAorICB1c2VyLgorCisgICoqKkV4dHJhIGV5ZXMgYXVkaXRpbmcgdGhlIHNldHVpZCBoZWxwZXIgYXJlIGVuY291cmFnZWQgYW5kIHdvdWxkIGJlCisgIHRpbWVseSByaWdodCBub3csIGJlZm9yZSAxLjIuMCoqKgorCisgIEEgZGVzaWduIGRvYyBpcyBhdmFpbGFibGUgaW4gZG9jL3N5c3RlbS1hY3RpdmF0aW9uLnR4dAorCistIFRoZSBUQ1AgYWRkcmVzcyBmb3JtYXQgaGFzIGJlZW4gZW5oYW5jZWQsIHN1Y2ggdGhhdCBUQ1AgbWF5IGJlCisgIGFjdHVhbGx5IHVzYWJsZS4gIFRoZSBkYnVzLWRhZW1vbiBtYW4gcGFnZSBkZXNjcmliZXMgdGhlIG5ldworICBlbGVtZW50cyBpbiB0aGUgYWRkcmVzcyBmb3JtYXQuICAxLjEuMSBoYWQgYWRkZWQgYW4gYWxsX2ludGVyZmFjZXMKKyAgZmxhZyB0byB0aGUgZm9ybWF0LCB3aGljaCBoYXMgYmVlbiByZW1vdmVkIGluIGZhdm9yIG9mIGEgY2xlYW5lcgorICBhcHByb2FjaC4KKworLSBTb21lIHRocmVhZC1yZWxhdGVkIGJ1Z3MgaGF2ZSBiZWVuIGZpeGVkLCB0aGVzZSBhcmUgaW1wb3J0YW50IGZpeGVzCisgIGlmIHlvdSBhcmUgdXNpbmcgbXVsdGlwbGUgdGhyZWFkcyB3aXRoIGxpYmRidXMsIGFuZCBub3QgaW1wb3J0YW50CisgIG90aGVyd2lzZS4KKworCitELUJ1cyAxLjEuMSAoMTggSnVuZSAyMDA3KQorPT0KKy0gVGhpcyBpcyBhIGRldmVsb3BtZW50IHJlbGVhc2UsIHVubGVzcyB5b3UgbmVlZCBzcGVjaWZpYyAKKyAgZnVuY3Rpb25hbGl0eSBwbGVhc2UgdXNlIHRoZSBzdGFibGUgcmVsZWFzZXMgYXMgQVBJJ3MgbWF5IGNoYW5nZQorICAodGhvdWdoIHdlIHdpbGwgdHJ5IGhhcmQgbm90IHRvKQorLSBUaGUgYnVzIGRhZW1vbiBub3cgZ2VuZXJhdGVzIGEgZ2xvYmFsbHktdW5pcXVlIElEIGZvciBpdHNlbGYsIHdoaWNoIGlzIGF2YWlsYWJsZSAKKyAgdXNpbmcgdGhlIGNvbnZlbmllbmNlIGZ1bmN0aW9uIGRidXNfYnVzX2dldF9pZCgpLiBVc2UgdGhpcyBhcyBhIHVuaXF1ZSBJRCAKKyAgZm9yIGEgdXNlcidzIHNlc3Npb24sIGZvciBleGFtcGxlLgorLSBkYnVzX3NlcnZlcl9nZXRfaWQoKSwgZGJ1c19jb25uZWN0aW9uX2dldF9zZXJ2ZXJfaWQoKSBub3cgYXZhaWxhYmxlIHRvIGFjY2VzcworICB0aGUgdW5pcXVlIElEIG9mIGEgcGFydGljdWxhciBhZGRyZXNzCistIGRidXNfd2F0Y2hfZ2V0X2ZkKCkgZGVwcmVjYXRlZCBzaW5jZSBpdCBoYWQgdW5jbGVhciBjcm9zcy1wbGF0Zm9ybSBzZW1hbnRpY3MuCisgIGRidXNfd2F0Y2hfZ2V0X3VuaXhfZmQoKSBhbmQgZGJ1c193YXRjaF9nZXRfc29ja2V0KCkgcmVwbGFjZSBpdC4KKy0gc3VwcG9ydCBBTk9OWU1PVVMgbWVjaGFuaXNtIGZvciBhdXRoZW50aWNhdGlvbiwgd2hpY2ggYWxsb3dzIGEgY2xpZW50IHRvIAorICBhdXRoZW50aWNhdGUgYXMgbm9ib2R5IGluIHBhcnRpY3VsYXIKKy0gYWRkIEFQSSBkYnVzX2Nvbm5lY3Rpb25fc2V0X2FsbG93X2Fub255bW91cygpIHdoaWNoIHdpbGwgYWxsb3cgdGhlIG1lc3NhZ2UKKyAgc3RyZWFtIHRvIGJlZ2luIGlmIHRoZSBjbGllbnQgYXV0aHMgYXMgYW5vbnltb3VzIChvdGhlcndpc2UsIHRoZSBjbGllbnQgCisgIHdpbGwgYmUgZHJvcHBlZCB1bmxlc3MgdGhleSBhdXRoIGFzIGEgdXNlcikuCistIHRoZSBBTk9OWU1PVVMgc3VwcG9ydCBtZWFucyB5b3UgY2FuIG5vdyB1c2UgRC1CdXMgKHdpdGhvdXQgYSBidXMgZGFlbW9uKSBhcyAKKyAgYSBwcm90b2NvbCBmb3IgYSBuZXR3b3JrIHNlcnZpY2UgcHJvdmlkZWQgdG8gYW5vbnltb3VzIEludGVybmV0IG9yIExBTiAgCisgIGNsaWVudHMKKy0gbWFueSBpbnRlcm5hbCBjaGFuZ2VzIHRvIGJldHRlciBzdXBwb3J0IHRoZSBXaW5kb3dzIHBvcnQsIHRob3VnaCB0aGUgCisgIHBvcnQgaXMgc3RpbGwgbm90IGNvbXBsZXRlIGluIHRoaXMgcmVsZWFzZQorLSBzb21lIGltcHJvdmVkIGRvY3VtZW50YXRpb24gYW5kIHJldHVybl9pZl9mYWlsIGNoZWNrcworLSBzb21lIHNtYWxsIGJ1ZyBmaXhlcworCitELUJ1cyAxLjEuMCAoMjUgTWF5IDIwMDcpCis9PQorLSBmaXJzdCByZWxlYXNlIGluIHRoZSBkZXZlbG9wbWVudCBzZXJpZXMsIHVubGVzcyB5b3UgbmVlZCBzcGVjaWZpYyAKKyAgZnVuY3Rpb25hbGl0eSBwbGVhc2UgdXNlIHRoZSBzdGFibGUgcmVsZWFzZXMgYXMgQVBJJ3MgbWF5IGNoYW5nZQorICAodGhvdWdoIHdlIHdpbGwgdHJ5IGhhcmQgbm90IHRvKQorLSBiZXR0ZXIgZWF2ZXNkcm9wcGluZyBzdXBwb3J0IG5vdyBwaWNrcyB1cCByZXBseSBtZXNzYWdlcyBmb3IgZGVidWdnaW5nCistIC5wYyBmaWxlIG5vdyBsaXN0cyB0aGUgZGlyZWN0b3J5IHRoZSBkYWVtb24gaXMgaW5zdGFsbGVkIGludG8gKGRhZW1vbmRpcikKKy0gR2V0QWxsIGNhbGwgYWRkZWQgdG8gdGhlIHByb3BlcnRpZXMgaW50ZXJmYWNlCistIHN1cHBvcnQgZm9yIG1lc3NhZ2Ugc2VyaWFsaXphdGlvbiBhZGRlZCBmb3IgdXNlIHdpdGggZXh0ZXJuYWwgdHJhbnNwb3J0cyBsaWtlCisgIFRVQkVTISEhCistIG1hbnkgYnVncyBmaXhlZApkaWZmIC0tZ2l0IGEvTk9USUNFIGIvTk9USUNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MWNhMWQKLS0tIC9kZXYvbnVsbAorKysgYi9OT1RJQ0UKQEAgLTAsMCArMSw1NTEgQEAKK0QtQnVzIGlzIGxpY2Vuc2VkIHRvIHlvdSB1bmRlciB5b3VyIGNob2ljZSBvZiB0aGUgQWNhZGVtaWMgRnJlZQorTGljZW5zZSB2ZXJzaW9uIDIuMSwgb3IgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4KK0JvdGggbGljZW5zZXMgYXJlIGluY2x1ZGVkIGhlcmUuIFNvbWUgb2YgdGhlIHN0YW5kYWxvbmUgYmluYXJpZXMgYXJlCit1bmRlciB0aGUgR1BMIG9ubHk7IGluIHBhcnRpY3VsYXIsIGJ1dCBub3QgbGltaXRlZCB0bywKK3Rvb2xzL2RidXMtY2xlYW51cC1zb2NrZXRzLmMgYW5kIHRlc3QvZGVjb2RlLWdjb3YuYy4gRWFjaCBzb3VyY2UgY29kZQorZmlsZSBpcyBtYXJrZWQgd2l0aCB0aGUgcHJvcGVyIGNvcHlyaWdodCBpbmZvcm1hdGlvbiAtIGlmIHlvdSBmaW5kIGEKK2ZpbGUgdGhhdCBpc24ndCBtYXJrZWQgcGxlYXNlIGJyaW5nIGl0IHRvIG91ciBhdHRlbnRpb24uCisKKworVGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZQordi4gMi4xCisKK1RoaXMgQWNhZGVtaWMgRnJlZSBMaWNlbnNlICh0aGUgIkxpY2Vuc2UiKSBhcHBsaWVzIHRvIGFueSBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAgKHRoZSAiT3JpZ2luYWwgV29yayIpIHdob3NlIG93bmVyICh0aGUgIkxpY2Vuc29yIikgaGFzIHBsYWNlZCB0aGUgZm9sbG93aW5nIG5vdGljZSBpbW1lZGlhdGVseSBmb2xsb3dpbmcgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIHRoZSBPcmlnaW5hbCBXb3JrOgorCitMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisKKzEpIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBMaWNlbnNvciBoZXJlYnkgZ3JhbnRzIFlvdSBhCit3b3JsZC13aWRlLCByb3lhbHR5LWZyZWUsIG5vbi1leGNsdXNpdmUsIHBlcnBldHVhbCwgc3VibGljZW5zZWFibGUKK2xpY2Vuc2UgdG8gZG8gdGhlIGZvbGxvd2luZzoKKworYSkgdG8gcmVwcm9kdWNlIHRoZSBPcmlnaW5hbCBXb3JrIGluIGNvcGllczsKKworYikgdG8gcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzICgiRGVyaXZhdGl2ZSBXb3JrcyIpIGJhc2VkIHVwb24gdGhlIE9yaWdpbmFsIFdvcms7CisKK2MpIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBPcmlnaW5hbCBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRvIHRoZSBwdWJsaWM7CisKK2QpIHRvIHBlcmZvcm0gdGhlIE9yaWdpbmFsIFdvcmsgcHVibGljbHk7IGFuZAorCitlKSB0byBkaXNwbGF5IHRoZSBPcmlnaW5hbCBXb3JrIHB1YmxpY2x5LgorCisyKSBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gTGljZW5zb3IgaGVyZWJ5IGdyYW50cyBZb3UgYSB3b3JsZC13aWRlLAorcm95YWx0eS1mcmVlLCBub24tZXhjbHVzaXZlLCBwZXJwZXR1YWwsIHN1YmxpY2Vuc2VhYmxlIGxpY2Vuc2UsIHVuZGVyCitwYXRlbnQgY2xhaW1zIG93bmVkIG9yIGNvbnRyb2xsZWQgYnkgdGhlIExpY2Vuc29yIHRoYXQgYXJlIGVtYm9kaWVkIGluCit0aGUgT3JpZ2luYWwgV29yayBhcyBmdXJuaXNoZWQgYnkgdGhlIExpY2Vuc29yLCB0byBtYWtlLCB1c2UsIHNlbGwgYW5kCitvZmZlciBmb3Igc2FsZSB0aGUgT3JpZ2luYWwgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3Jrcy4KKworMykgR3JhbnQgb2YgU291cmNlIENvZGUgTGljZW5zZS4gVGhlIHRlcm0gIlNvdXJjZSBDb2RlIiBtZWFucyB0aGUKK3ByZWZlcnJlZCBmb3JtIG9mIHRoZSBPcmlnaW5hbCBXb3JrIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdCBhbmQKK2FsbCBhdmFpbGFibGUgZG9jdW1lbnRhdGlvbiBkZXNjcmliaW5nIGhvdyB0byBtb2RpZnkgdGhlIE9yaWdpbmFsCitXb3JrLiBMaWNlbnNvciBoZXJlYnkgYWdyZWVzIHRvIHByb3ZpZGUgYSBtYWNoaW5lLXJlYWRhYmxlIGNvcHkgb2YgdGhlCitTb3VyY2UgQ29kZSBvZiB0aGUgT3JpZ2luYWwgV29yayBhbG9uZyB3aXRoIGVhY2ggY29weSBvZiB0aGUgT3JpZ2luYWwKK1dvcmsgdGhhdCBMaWNlbnNvciBkaXN0cmlidXRlcy4gTGljZW5zb3IgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHNhdGlzZnkKK3RoaXMgb2JsaWdhdGlvbiBieSBwbGFjaW5nIGEgbWFjaGluZS1yZWFkYWJsZSBjb3B5IG9mIHRoZSBTb3VyY2UgQ29kZQoraW4gYW4gaW5mb3JtYXRpb24gcmVwb3NpdG9yeSByZWFzb25hYmx5IGNhbGN1bGF0ZWQgdG8gcGVybWl0CitpbmV4cGVuc2l2ZSBhbmQgY29udmVuaWVudCBhY2Nlc3MgYnkgWW91IGZvciBhcyBsb25nIGFzIExpY2Vuc29yCitjb250aW51ZXMgdG8gZGlzdHJpYnV0ZSB0aGUgT3JpZ2luYWwgV29yaywgYW5kIGJ5IHB1Ymxpc2hpbmcgdGhlCithZGRyZXNzIG9mIHRoYXQgaW5mb3JtYXRpb24gcmVwb3NpdG9yeSBpbiBhIG5vdGljZSBpbW1lZGlhdGVseQorZm9sbG93aW5nIHRoZSBjb3B5cmlnaHQgbm90aWNlIHRoYXQgYXBwbGllcyB0byB0aGUgT3JpZ2luYWwgV29yay4KKworNCkgRXhjbHVzaW9ucyBGcm9tIExpY2Vuc2UgR3JhbnQuIE5laXRoZXIgdGhlIG5hbWVzIG9mIExpY2Vuc29yLCBub3IKK3RoZSBuYW1lcyBvZiBhbnkgY29udHJpYnV0b3JzIHRvIHRoZSBPcmlnaW5hbCBXb3JrLCBub3IgYW55IG9mIHRoZWlyCit0cmFkZW1hcmtzIG9yIHNlcnZpY2UgbWFya3MsIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgT3JpZ2luYWwgV29yayB3aXRob3V0IGV4cHJlc3MgcHJpb3Igd3JpdHRlbgorcGVybWlzc2lvbiBvZiB0aGUgTGljZW5zb3IuIE5vdGhpbmcgaW4gdGhpcyBMaWNlbnNlIHNoYWxsIGJlIGRlZW1lZCB0bworZ3JhbnQgYW55IHJpZ2h0cyB0byB0cmFkZW1hcmtzLCBjb3B5cmlnaHRzLCBwYXRlbnRzLCB0cmFkZSBzZWNyZXRzIG9yCithbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIExpY2Vuc29yIGV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCitoZXJlaW4uIE5vIHBhdGVudCBsaWNlbnNlIGlzIGdyYW50ZWQgdG8gbWFrZSwgdXNlLCBzZWxsIG9yIG9mZmVyIHRvCitzZWxsIGVtYm9kaW1lbnRzIG9mIGFueSBwYXRlbnQgY2xhaW1zIG90aGVyIHRoYW4gdGhlIGxpY2Vuc2VkIGNsYWltcworZGVmaW5lZCBpbiBTZWN0aW9uIDIuIE5vIHJpZ2h0IGlzIGdyYW50ZWQgdG8gdGhlIHRyYWRlbWFya3Mgb2YKK0xpY2Vuc29yIGV2ZW4gaWYgc3VjaCBtYXJrcyBhcmUgaW5jbHVkZWQgaW4gdGhlIE9yaWdpbmFsIFdvcmsuIE5vdGhpbmcKK2luIHRoaXMgTGljZW5zZSBzaGFsbCBiZSBpbnRlcnByZXRlZCB0byBwcm9oaWJpdCBMaWNlbnNvciBmcm9tCitsaWNlbnNpbmcgdW5kZXIgZGlmZmVyZW50IHRlcm1zIGZyb20gdGhpcyBMaWNlbnNlIGFueSBPcmlnaW5hbCBXb3JrCit0aGF0IExpY2Vuc29yIG90aGVyd2lzZSB3b3VsZCBoYXZlIGEgcmlnaHQgdG8gbGljZW5zZS4KKworNSkgVGhpcyBzZWN0aW9uIGludGVudGlvbmFsbHkgb21pdHRlZC4KKworNikgQXR0cmlidXRpb24gUmlnaHRzLiBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgQ29kZSBvZiBhbnkKK0Rlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgY3JlYXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQgb3IgdHJhZGVtYXJrCitub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBDb2RlIG9mIHRoZSBPcmlnaW5hbCBXb3JrLCBhcyB3ZWxsIGFzIGFueQorbm90aWNlcyBvZiBsaWNlbnNpbmcgYW5kIGFueSBkZXNjcmlwdGl2ZSB0ZXh0IGlkZW50aWZpZWQgdGhlcmVpbiBhcyBhbgorIkF0dHJpYnV0aW9uIE5vdGljZS4iIFlvdSBtdXN0IGNhdXNlIHRoZSBTb3VyY2UgQ29kZSBmb3IgYW55CitEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGNyZWF0ZSB0byBjYXJyeSBhIHByb21pbmVudCBBdHRyaWJ1dGlvbgorTm90aWNlIHJlYXNvbmFibHkgY2FsY3VsYXRlZCB0byBpbmZvcm0gcmVjaXBpZW50cyB0aGF0IFlvdSBoYXZlCittb2RpZmllZCB0aGUgT3JpZ2luYWwgV29yay4KKworNykgV2FycmFudHkgb2YgUHJvdmVuYW5jZSBhbmQgRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gTGljZW5zb3IKK3dhcnJhbnRzIHRoYXQgdGhlIGNvcHlyaWdodCBpbiBhbmQgdG8gdGhlIE9yaWdpbmFsIFdvcmsgYW5kIHRoZSBwYXRlbnQKK3JpZ2h0cyBncmFudGVkIGhlcmVpbiBieSBMaWNlbnNvciBhcmUgb3duZWQgYnkgdGhlIExpY2Vuc29yIG9yIGFyZQorc3VibGljZW5zZWQgdG8gWW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2Ugd2l0aCB0aGUgcGVybWlzc2lvbgorb2YgdGhlIGNvbnRyaWJ1dG9yKHMpIG9mIHRob3NlIGNvcHlyaWdodHMgYW5kIHBhdGVudCByaWdodHMuIEV4Y2VwdCBhcworZXhwcmVzc2x5IHN0YXRlZCBpbiB0aGUgaW1tZWRpYXRlbHkgcHJvY2VlZGluZyBzZW50ZW5jZSwgdGhlIE9yaWdpbmFsCitXb3JrIGlzIHByb3ZpZGVkIHVuZGVyIHRoaXMgTGljZW5zZSBvbiBhbiAiQVMgSVMiIEJBU0lTIGFuZCBXSVRIT1VUCitXQVJSQU5UWSwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sCit0aGUgd2FycmFudGllcyBvZiBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorUEFSVElDVUxBUiBQVVJQT1NFLiBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgT0YgVEhFIE9SSUdJTkFMCitXT1JLIElTIFdJVEggWU9VLiBUaGlzIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkgY29uc3RpdHV0ZXMgYW4gZXNzZW50aWFsCitwYXJ0IG9mIHRoaXMgTGljZW5zZS4gTm8gbGljZW5zZSB0byBPcmlnaW5hbCBXb3JrIGlzIGdyYW50ZWQgaGVyZXVuZGVyCitleGNlcHQgdW5kZXIgdGhpcyBkaXNjbGFpbWVyLgorCis4KSBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gVW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBhbmQgdW5kZXIgbm8gbGVnYWwKK3RoZW9yeSwgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvcgorb3RoZXJ3aXNlLCBzaGFsbCB0aGUgTGljZW5zb3IgYmUgbGlhYmxlIHRvIGFueSBwZXJzb24gZm9yIGFueSBkaXJlY3QsCitpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueQorY2hhcmFjdGVyIGFyaXNpbmcgYXMgYSByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIHRoZSB1c2Ugb2YgdGhlCitPcmlnaW5hbCBXb3JrIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBkYW1hZ2VzIGZvciBsb3NzIG9mCitnb29kd2lsbCwgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZAorYWxsIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMuIFRoaXMgbGltaXRhdGlvbiBvZiBsaWFiaWxpdHkKK3NoYWxsIG5vdCBhcHBseSB0byBsaWFiaWxpdHkgZm9yIGRlYXRoIG9yIHBlcnNvbmFsIGluanVyeSByZXN1bHRpbmcKK2Zyb20gTGljZW5zb3IncyBuZWdsaWdlbmNlIHRvIHRoZSBleHRlbnQgYXBwbGljYWJsZSBsYXcgcHJvaGliaXRzIHN1Y2gKK2xpbWl0YXRpb24uIFNvbWUganVyaXNkaWN0aW9ucyBkbyBub3QgYWxsb3cgdGhlIGV4Y2x1c2lvbiBvcgorbGltaXRhdGlvbiBvZiBpbmNpZGVudGFsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc28gdGhpcyBleGNsdXNpb24KK2FuZCBsaW1pdGF0aW9uIG1heSBub3QgYXBwbHkgdG8gWW91LgorCis5KSBBY2NlcHRhbmNlIGFuZCBUZXJtaW5hdGlvbi4gSWYgWW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQorT3JpZ2luYWwgV29yayBvciBhIERlcml2YXRpdmUgV29yaywgWW91IG11c3QgbWFrZSBhIHJlYXNvbmFibGUgZWZmb3J0Cit1bmRlciB0aGUgY2lyY3Vtc3RhbmNlcyB0byBvYnRhaW4gdGhlIGV4cHJlc3MgYXNzZW50IG9mIHJlY2lwaWVudHMgdG8KK3RoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuIE5vdGhpbmcgZWxzZSBidXQgdGhpcyBMaWNlbnNlIChvciBhbm90aGVyCit3cml0dGVuIGFncmVlbWVudCBiZXR3ZWVuIExpY2Vuc29yIGFuZCBZb3UpIGdyYW50cyBZb3UgcGVybWlzc2lvbiB0bworY3JlYXRlIERlcml2YXRpdmUgV29ya3MgYmFzZWQgdXBvbiB0aGUgT3JpZ2luYWwgV29yayBvciB0byBleGVyY2lzZQorYW55IG9mIHRoZSByaWdodHMgZ3JhbnRlZCBpbiBTZWN0aW9uIDEgaGVyZWluLCBhbmQgYW55IGF0dGVtcHQgdG8gZG8KK3NvIGV4Y2VwdCB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIChvciBhbm90aGVyIHdyaXR0ZW4KK2FncmVlbWVudCBiZXR3ZWVuIExpY2Vuc29yIGFuZCBZb3UpIGlzIGV4cHJlc3NseSBwcm9oaWJpdGVkIGJ5CitVLlMuIGNvcHlyaWdodCBsYXcsIHRoZSBlcXVpdmFsZW50IGxhd3Mgb2Ygb3RoZXIgY291bnRyaWVzLCBhbmQgYnkKK2ludGVybmF0aW9uYWwgdHJlYXR5LiBUaGVyZWZvcmUsIGJ5IGV4ZXJjaXNpbmcgYW55IG9mIHRoZSByaWdodHMKK2dyYW50ZWQgdG8gWW91IGluIFNlY3Rpb24gMSBoZXJlaW4sIFlvdSBpbmRpY2F0ZSBZb3VyIGFjY2VwdGFuY2Ugb2YKK3RoaXMgTGljZW5zZSBhbmQgYWxsIG9mIGl0cyB0ZXJtcyBhbmQgY29uZGl0aW9ucy4KKworMTApIFRlcm1pbmF0aW9uIGZvciBQYXRlbnQgQWN0aW9uLiBUaGlzIExpY2Vuc2Ugc2hhbGwgdGVybWluYXRlCithdXRvbWF0aWNhbGx5IGFuZCBZb3UgbWF5IG5vIGxvbmdlciBleGVyY2lzZSBhbnkgb2YgdGhlIHJpZ2h0cyBncmFudGVkCit0byBZb3UgYnkgdGhpcyBMaWNlbnNlIGFzIG9mIHRoZSBkYXRlIFlvdSBjb21tZW5jZSBhbiBhY3Rpb24sCitpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0sIGFnYWluc3QgTGljZW5zb3Igb3IgYW55CitsaWNlbnNlZSBhbGxlZ2luZyB0aGF0IHRoZSBPcmlnaW5hbCBXb3JrIGluZnJpbmdlcyBhIHBhdGVudC4gVGhpcwordGVybWluYXRpb24gcHJvdmlzaW9uIHNoYWxsIG5vdCBhcHBseSBmb3IgYW4gYWN0aW9uIGFsbGVnaW5nIHBhdGVudAoraW5mcmluZ2VtZW50IGJ5IGNvbWJpbmF0aW9ucyBvZiB0aGUgT3JpZ2luYWwgV29yayB3aXRoIG90aGVyIHNvZnR3YXJlCitvciBoYXJkd2FyZS4KKworMTEpIEp1cmlzZGljdGlvbiwgVmVudWUgYW5kIEdvdmVybmluZyBMYXcuIEFueSBhY3Rpb24gb3Igc3VpdCByZWxhdGluZwordG8gdGhpcyBMaWNlbnNlIG1heSBiZSBicm91Z2h0IG9ubHkgaW4gdGhlIGNvdXJ0cyBvZiBhIGp1cmlzZGljdGlvbgord2hlcmVpbiB0aGUgTGljZW5zb3IgcmVzaWRlcyBvciBpbiB3aGljaCBMaWNlbnNvciBjb25kdWN0cyBpdHMgcHJpbWFyeQorYnVzaW5lc3MsIGFuZCB1bmRlciB0aGUgbGF3cyBvZiB0aGF0IGp1cmlzZGljdGlvbiBleGNsdWRpbmcgaXRzCitjb25mbGljdC1vZi1sYXcgcHJvdmlzaW9ucy4gVGhlIGFwcGxpY2F0aW9uIG9mIHRoZSBVbml0ZWQgTmF0aW9ucworQ29udmVudGlvbiBvbiBDb250cmFjdHMgZm9yIHRoZSBJbnRlcm5hdGlvbmFsIFNhbGUgb2YgR29vZHMgaXMKK2V4cHJlc3NseSBleGNsdWRlZC4gQW55IHVzZSBvZiB0aGUgT3JpZ2luYWwgV29yayBvdXRzaWRlIHRoZSBzY29wZSBvZgordGhpcyBMaWNlbnNlIG9yIGFmdGVyIGl0cyB0ZXJtaW5hdGlvbiBzaGFsbCBiZSBzdWJqZWN0IHRvIHRoZQorcmVxdWlyZW1lbnRzIGFuZCBwZW5hbHRpZXMgb2YgdGhlIFUuUy4gQ29weXJpZ2h0IEFjdCwgMTcgVS5TLkMuIMOCwqcgMTAxCitldCBzZXEuLCB0aGUgZXF1aXZhbGVudCBsYXdzIG9mIG90aGVyIGNvdW50cmllcywgYW5kIGludGVybmF0aW9uYWwKK3RyZWF0eS4gVGhpcyBzZWN0aW9uIHNoYWxsIHN1cnZpdmUgdGhlIHRlcm1pbmF0aW9uIG9mIHRoaXMgTGljZW5zZS4KKworMTIpIEF0dG9ybmV5cyBGZWVzLiBJbiBhbnkgYWN0aW9uIHRvIGVuZm9yY2UgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZQorb3Igc2Vla2luZyBkYW1hZ2VzIHJlbGF0aW5nIHRoZXJldG8sIHRoZSBwcmV2YWlsaW5nIHBhcnR5IHNoYWxsIGJlCitlbnRpdGxlZCB0byByZWNvdmVyIGl0cyBjb3N0cyBhbmQgZXhwZW5zZXMsIGluY2x1ZGluZywgd2l0aG91dAorbGltaXRhdGlvbiwgcmVhc29uYWJsZSBhdHRvcm5leXMnIGZlZXMgYW5kIGNvc3RzIGluY3VycmVkIGluCitjb25uZWN0aW9uIHdpdGggc3VjaCBhY3Rpb24sIGluY2x1ZGluZyBhbnkgYXBwZWFsIG9mIHN1Y2ggYWN0aW9uLiBUaGlzCitzZWN0aW9uIHNoYWxsIHN1cnZpdmUgdGhlIHRlcm1pbmF0aW9uIG9mIHRoaXMgTGljZW5zZS4KKworMTMpIE1pc2NlbGxhbmVvdXMuIFRoaXMgTGljZW5zZSByZXByZXNlbnRzIHRoZSBjb21wbGV0ZSBhZ3JlZW1lbnQKK2NvbmNlcm5pbmcgdGhlIHN1YmplY3QgbWF0dGVyIGhlcmVvZi4gSWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UKK2lzIGhlbGQgdG8gYmUgdW5lbmZvcmNlYWJsZSwgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgb25seSB0bwordGhlIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBpdCBlbmZvcmNlYWJsZS4KKworMTQpIERlZmluaXRpb24gb2YgIllvdSIgaW4gVGhpcyBMaWNlbnNlLiAiWW91IiB0aHJvdWdob3V0IHRoaXMKK0xpY2Vuc2UsIHdoZXRoZXIgaW4gdXBwZXIgb3IgbG93ZXIgY2FzZSwgbWVhbnMgYW4gaW5kaXZpZHVhbCBvciBhCitsZWdhbCBlbnRpdHkgZXhlcmNpc2luZyByaWdodHMgdW5kZXIsIGFuZCBjb21wbHlpbmcgd2l0aCBhbGwgb2YgdGhlCit0ZXJtcyBvZiwgdGhpcyBMaWNlbnNlLiBGb3IgbGVnYWwgZW50aXRpZXMsICJZb3UiIGluY2x1ZGVzIGFueSBlbnRpdHkKK3RoYXQgY29udHJvbHMsIGlzIGNvbnRyb2xsZWQgYnksIG9yIGlzIHVuZGVyIGNvbW1vbiBjb250cm9sIHdpdGgKK3lvdS4gRm9yIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsCitkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZSBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoCitlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3Igb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eQorcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZSBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwKK293bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KKworMTUpIFJpZ2h0IHRvIFVzZS4gWW91IG1heSB1c2UgdGhlIE9yaWdpbmFsIFdvcmsgaW4gYWxsIHdheXMgbm90CitvdGhlcndpc2UgcmVzdHJpY3RlZCBvciBjb25kaXRpb25lZCBieSB0aGlzIExpY2Vuc2Ugb3IgYnkgbGF3LCBhbmQKK0xpY2Vuc29yIHByb21pc2VzIG5vdCB0byBpbnRlcmZlcmUgd2l0aCBvciBiZSByZXNwb25zaWJsZSBmb3Igc3VjaAordXNlcyBieSBZb3UuCisKK1RoaXMgbGljZW5zZSBpcyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNCBMYXdyZW5jZSBFLiBSb3Nlbi4gQWxsIHJpZ2h0cworcmVzZXJ2ZWQuIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGlzCitsaWNlbnNlIHdpdGhvdXQgbW9kaWZpY2F0aW9uLiBUaGlzIGxpY2Vuc2UgbWF5IG5vdCBiZSBtb2RpZmllZCB3aXRob3V0Cit0aGUgZXhwcmVzcyB3cml0dGVuIHBlcm1pc3Npb24gb2YgaXRzIGNvcHlyaWdodCBvd25lci4KKworCistLSAKK0VORCBPRiBBQ0FERU1JQyBGUkVFIExJQ0VOU0UuIFRoZSBmb2xsb3dpbmcgaXMgaW50ZW5kZWQgdG8gZGVzY3JpYmUgdGhlIGVzc2VudGlhbCAKK2RpZmZlcmVuY2VzIGJldHdlZW4gdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSAoQUZMKSB2ZXJzaW9uIDEuMCBhbmQgb3RoZXIgCitvcGVuIHNvdXJjZSBsaWNlbnNlczoKKworVGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSBpcyBzaW1pbGFyIHRvIHRoZSBCU0QsIE1JVCwgVW9JL05DU0EgYW5kIEFwYWNoZSAKK2xpY2Vuc2VzIGluIG1hbnkgcmVzcGVjdHMgYnV0IGl0IGlzIGludGVuZGVkIHRvIHNvbHZlIGEgZmV3IHByb2JsZW1zIHdpdGggCit0aG9zZSBsaWNlbnNlcy4KKyAgICAKKyogVGhlIEFGTCBpcyB3cml0dGVuIHNvIGFzIHRvIG1ha2UgaXQgY2xlYXIgd2hhdCBzb2Z0d2FyZSBpcyBiZWluZyAKK2xpY2Vuc2VkIChieSB0aGUgaW5jbHVzaW9uIG9mIGEgc3RhdGVtZW50IGZvbGxvd2luZyB0aGUgY29weXJpZ2h0IG5vdGljZSAKK2luIHRoZSBzb2Z0d2FyZSkuIFRoaXMgd2F5LCB0aGUgbGljZW5zZSBmdW5jdGlvbnMgYmV0dGVyIHRoYW4gYSB0ZW1wbGF0ZSAKK2xpY2Vuc2UuIFRoZSBCU0QsIE1JVCBhbmQgVW9JL05DU0EgbGljZW5zZXMgYXBwbHkgdG8gdW5pZGVudGlmaWVkIHNvZnR3YXJlLgorICAgIAorKiBUaGUgQUZMIGNvbnRhaW5zIGEgY29tcGxldGUgY29weXJpZ2h0IGdyYW50IHRvIHRoZSBzb2Z0d2FyZS4gVGhlIEJTRCAKK2FuZCBBcGFjaGUgbGljZW5zZXMgYXJlIHZhZ3VlIGFuZCBpbmNvbXBsZXRlIGluIHRoYXQgcmVzcGVjdC4KKyAgICAKKyogVGhlIEFGTCBjb250YWlucyBhIGNvbXBsZXRlIHBhdGVudCBncmFudCB0byB0aGUgc29mdHdhcmUuIFRoZSBCU0QsIE1JVCwgCitVb0kvTkNTQSBhbmQgQXBhY2hlIGxpY2Vuc2VzIHJlbHkgb24gYW4gaW1wbGllZCBwYXRlbnQgbGljZW5zZSBhbmQgY29udGFpbiAKK25vIGV4cGxpY2l0IHBhdGVudCBncmFudC4KKyAgICAKKyogVGhlIEFGTCBtYWtlcyBpdCBjbGVhciB0aGF0IG5vIHRyYWRlbWFyayByaWdodHMgYXJlIGdyYW50ZWQgdG8gdGhlIAorbGljZW5zb3IncyB0cmFkZW1hcmtzLiBUaGUgQXBhY2hlIGxpY2Vuc2UgY29udGFpbnMgc3VjaCBhIHByb3Zpc2lvbiwgYnV0IHRoZSAKK0JTRCwgTUlUIGFuZCBVb0kvTkNTQSBsaWNlbnNlcyBkbyBub3QuCisgICAgCisqIFRoZSBBRkwgaW5jbHVkZXMgdGhlIHdhcnJhbnR5IGJ5IHRoZSBsaWNlbnNvciB0aGF0IGl0IGVpdGhlciBvd25zIHRoZSAKK2NvcHlyaWdodCBvciB0aGF0IGl0IGlzIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUgdW5kZXIgYSBsaWNlbnNlLiBOb25lIG9mIAordGhlIG90aGVyIGxpY2Vuc2VzIGNvbnRhaW4gdGhhdCB3YXJyYW50eS4gQWxsIG90aGVyIHdhcnJhbnRpZXMgYXJlIGRpc2NsYWltZWQsIAorYXMgaXMgdGhlIGNhc2UgZm9yIHRoZSBvdGhlciBsaWNlbnNlcy4KKworKiBUaGUgQUZMIGlzIGl0c2VsZiBjb3B5cmlnaHRlZCAod2l0aCB0aGUgcmlnaHQgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIAord2l0aG91dCBtb2RpZmljYXRpb24pLiBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgb3duZXIgb2YgdGhlIGNvcHlyaWdodCB0byB0aGUgCitsaWNlbnNlIHdpbGwgY29udHJvbCBjaGFuZ2VzLiBUaGUgQXBhY2hlIGxpY2Vuc2UgY29udGFpbnMgYSBjb3B5cmlnaHQgbm90aWNlLCAKK2J1dCB0aGUgQlNELCBNSVQgYW5kIFVvSS9OQ1NBIGxpY2Vuc2VzIGRvIG5vdC4gCistLQorU1RBUlQgT0YgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKKy0tCisKKwkJICAgIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCisJCSAgICAgICBWZXJzaW9uIDIsIEp1bmUgMTk5MQorCisgQ29weXJpZ2h0IChDKSAxOTg5LCAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKworIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcworIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgorCisJCQkgICAgUHJlYW1ibGUKKworICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyCitmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworTGljZW5zZSBpcyBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgZnJlZQorc29mdHdhcmUtLXRvIG1ha2Ugc3VyZSB0aGUgc29mdHdhcmUgaXMgZnJlZSBmb3IgYWxsIGl0cyB1c2Vycy4gIFRoaXMKK0dlbmVyYWwgUHVibGljIExpY2Vuc2UgYXBwbGllcyB0byBtb3N0IG9mIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uJ3Mgc29mdHdhcmUgYW5kIHRvIGFueSBvdGhlciBwcm9ncmFtIHdob3NlIGF1dGhvcnMgY29tbWl0IHRvCit1c2luZyBpdC4gIChTb21lIG90aGVyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBzb2Z0d2FyZSBpcyBjb3ZlcmVkIGJ5Cit0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpbnN0ZWFkLikgIFlvdSBjYW4gYXBwbHkgaXQgdG8KK3lvdXIgcHJvZ3JhbXMsIHRvby4KKworICBXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSwgbm90CitwcmljZS4gIE91ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQgeW91CitoYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UgZm9yCit0aGlzIHNlcnZpY2UgaWYgeW91IHdpc2gpLCB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQgaXQKK2lmIHlvdSB3YW50IGl0LCB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBzb2Z0d2FyZSBvciB1c2UgcGllY2VzIG9mIGl0CitpbiBuZXcgZnJlZSBwcm9ncmFtczsgYW5kIHRoYXQgeW91IGtub3cgeW91IGNhbiBkbyB0aGVzZSB0aGluZ3MuCisKKyAgVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBtYWtlIHJlc3RyaWN0aW9ucyB0aGF0IGZvcmJpZAorYW55b25lIHRvIGRlbnkgeW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91IHRvIHN1cnJlbmRlciB0aGUgcmlnaHRzLgorVGhlc2UgcmVzdHJpY3Rpb25zIHRyYW5zbGF0ZSB0byBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgZm9yIHlvdSBpZiB5b3UKK2Rpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSwgb3IgaWYgeW91IG1vZGlmeSBpdC4KKworICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHN1Y2ggYSBwcm9ncmFtLCB3aGV0aGVyCitncmF0aXMgb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQKK3lvdSBoYXZlLiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlCitzb3VyY2UgY29kZS4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyCityaWdodHMuCisKKyAgV2UgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIHR3byBzdGVwczogKDEpIGNvcHlyaWdodCB0aGUgc29mdHdhcmUsIGFuZAorKDIpIG9mZmVyIHlvdSB0aGlzIGxpY2Vuc2Ugd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsIHBlcm1pc3Npb24gdG8gY29weSwKK2Rpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGUgc29mdHdhcmUuCisKKyAgQWxzbywgZm9yIGVhY2ggYXV0aG9yJ3MgcHJvdGVjdGlvbiBhbmQgb3Vycywgd2Ugd2FudCB0byBtYWtlIGNlcnRhaW4KK3RoYXQgZXZlcnlvbmUgdW5kZXJzdGFuZHMgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlCitzb2Z0d2FyZS4gIElmIHRoZSBzb2Z0d2FyZSBpcyBtb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgd2UKK3dhbnQgaXRzIHJlY2lwaWVudHMgdG8ga25vdyB0aGF0IHdoYXQgdGhleSBoYXZlIGlzIG5vdCB0aGUgb3JpZ2luYWwsIHNvCit0aGF0IGFueSBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IG90aGVycyB3aWxsIG5vdCByZWZsZWN0IG9uIHRoZSBvcmlnaW5hbAorYXV0aG9ycycgcmVwdXRhdGlvbnMuCisKKyAgRmluYWxseSwgYW55IGZyZWUgcHJvZ3JhbSBpcyB0aHJlYXRlbmVkIGNvbnN0YW50bHkgYnkgc29mdHdhcmUKK3BhdGVudHMuICBXZSB3aXNoIHRvIGF2b2lkIHRoZSBkYW5nZXIgdGhhdCByZWRpc3RyaWJ1dG9ycyBvZiBhIGZyZWUKK3Byb2dyYW0gd2lsbCBpbmRpdmlkdWFsbHkgb2J0YWluIHBhdGVudCBsaWNlbnNlcywgaW4gZWZmZWN0IG1ha2luZyB0aGUKK3Byb2dyYW0gcHJvcHJpZXRhcnkuICBUbyBwcmV2ZW50IHRoaXMsIHdlIGhhdmUgbWFkZSBpdCBjbGVhciB0aGF0IGFueQorcGF0ZW50IG11c3QgYmUgbGljZW5zZWQgZm9yIGV2ZXJ5b25lJ3MgZnJlZSB1c2Ugb3Igbm90IGxpY2Vuc2VkIGF0IGFsbC4KKworICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAorbW9kaWZpY2F0aW9uIGZvbGxvdy4KKwwKKwkJICAgIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgQ09QWUlORywgRElTVFJJQlVUSU9OIEFORCBNT0RJRklDQVRJT04KKworICAwLiBUaGlzIExpY2Vuc2UgYXBwbGllcyB0byBhbnkgcHJvZ3JhbSBvciBvdGhlciB3b3JrIHdoaWNoIGNvbnRhaW5zCithIG5vdGljZSBwbGFjZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXIgc2F5aW5nIGl0IG1heSBiZSBkaXN0cmlidXRlZAordW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoZSAiUHJvZ3JhbSIsIGJlbG93LAorcmVmZXJzIHRvIGFueSBzdWNoIHByb2dyYW0gb3Igd29yaywgYW5kIGEgIndvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0iCittZWFucyBlaXRoZXIgdGhlIFByb2dyYW0gb3IgYW55IGRlcml2YXRpdmUgd29yayB1bmRlciBjb3B5cmlnaHQgbGF3OgordGhhdCBpcyB0byBzYXksIGEgd29yayBjb250YWluaW5nIHRoZSBQcm9ncmFtIG9yIGEgcG9ydGlvbiBvZiBpdCwKK2VpdGhlciB2ZXJiYXRpbSBvciB3aXRoIG1vZGlmaWNhdGlvbnMgYW5kL29yIHRyYW5zbGF0ZWQgaW50byBhbm90aGVyCitsYW5ndWFnZS4gIChIZXJlaW5hZnRlciwgdHJhbnNsYXRpb24gaXMgaW5jbHVkZWQgd2l0aG91dCBsaW1pdGF0aW9uIGluCit0aGUgdGVybSAibW9kaWZpY2F0aW9uIi4pICBFYWNoIGxpY2Vuc2VlIGlzIGFkZHJlc3NlZCBhcyAieW91Ii4KKworQWN0aXZpdGllcyBvdGhlciB0aGFuIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQgbW9kaWZpY2F0aW9uIGFyZSBub3QKK2NvdmVyZWQgYnkgdGhpcyBMaWNlbnNlOyB0aGV5IGFyZSBvdXRzaWRlIGl0cyBzY29wZS4gIFRoZSBhY3Qgb2YKK3J1bm5pbmcgdGhlIFByb2dyYW0gaXMgbm90IHJlc3RyaWN0ZWQsIGFuZCB0aGUgb3V0cHV0IGZyb20gdGhlIFByb2dyYW0KK2lzIGNvdmVyZWQgb25seSBpZiBpdHMgY29udGVudHMgY29uc3RpdHV0ZSBhIHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtIChpbmRlcGVuZGVudCBvZiBoYXZpbmcgYmVlbiBtYWRlIGJ5IHJ1bm5pbmcgdGhlIFByb2dyYW0pLgorV2hldGhlciB0aGF0IGlzIHRydWUgZGVwZW5kcyBvbiB3aGF0IHRoZSBQcm9ncmFtIGRvZXMuCisKKyAgMS4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSdzCitzb3VyY2UgY29kZSBhcyB5b3UgcmVjZWl2ZSBpdCwgaW4gYW55IG1lZGl1bSwgcHJvdmlkZWQgdGhhdCB5b3UKK2NvbnNwaWN1b3VzbHkgYW5kIGFwcHJvcHJpYXRlbHkgcHVibGlzaCBvbiBlYWNoIGNvcHkgYW4gYXBwcm9wcmlhdGUKK2NvcHlyaWdodCBub3RpY2UgYW5kIGRpc2NsYWltZXIgb2Ygd2FycmFudHk7IGtlZXAgaW50YWN0IGFsbCB0aGUKK25vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UgYW5kIHRvIHRoZSBhYnNlbmNlIG9mIGFueSB3YXJyYW50eTsKK2FuZCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBQcm9ncmFtIGEgY29weSBvZiB0aGlzIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhlIFByb2dyYW0uCisKK1lvdSBtYXkgY2hhcmdlIGEgZmVlIGZvciB0aGUgcGh5c2ljYWwgYWN0IG9mIHRyYW5zZmVycmluZyBhIGNvcHksIGFuZAoreW91IG1heSBhdCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eSBwcm90ZWN0aW9uIGluIGV4Y2hhbmdlIGZvciBhIGZlZS4KKworICAyLiBZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIHRoZSBQcm9ncmFtIG9yIGFueSBwb3J0aW9uCitvZiBpdCwgdGh1cyBmb3JtaW5nIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSwgYW5kIGNvcHkgYW5kCitkaXN0cmlidXRlIHN1Y2ggbW9kaWZpY2F0aW9ucyBvciB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDEKK2Fib3ZlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6CisKKyAgICBhKSBZb3UgbXVzdCBjYXVzZSB0aGUgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIGZpbGVzIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLgorCisgICAgYikgWW91IG11c3QgY2F1c2UgYW55IHdvcmsgdGhhdCB5b3UgZGlzdHJpYnV0ZSBvciBwdWJsaXNoLCB0aGF0IGluCisgICAgd2hvbGUgb3IgaW4gcGFydCBjb250YWlucyBvciBpcyBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0gb3IgYW55CisgICAgcGFydCB0aGVyZW9mLCB0byBiZSBsaWNlbnNlZCBhcyBhIHdob2xlIGF0IG5vIGNoYXJnZSB0byBhbGwgdGhpcmQKKyAgICBwYXJ0aWVzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCisKKyAgICBjKSBJZiB0aGUgbW9kaWZpZWQgcHJvZ3JhbSBub3JtYWxseSByZWFkcyBjb21tYW5kcyBpbnRlcmFjdGl2ZWx5CisgICAgd2hlbiBydW4sIHlvdSBtdXN0IGNhdXNlIGl0LCB3aGVuIHN0YXJ0ZWQgcnVubmluZyBmb3Igc3VjaAorICAgIGludGVyYWN0aXZlIHVzZSBpbiB0aGUgbW9zdCBvcmRpbmFyeSB3YXksIHRvIHByaW50IG9yIGRpc3BsYXkgYW4KKyAgICBhbm5vdW5jZW1lbnQgaW5jbHVkaW5nIGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UgYW5kIGEKKyAgICBub3RpY2UgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSAob3IgZWxzZSwgc2F5aW5nIHRoYXQgeW91IHByb3ZpZGUKKyAgICBhIHdhcnJhbnR5KSBhbmQgdGhhdCB1c2VycyBtYXkgcmVkaXN0cmlidXRlIHRoZSBwcm9ncmFtIHVuZGVyCisgICAgdGhlc2UgY29uZGl0aW9ucywgYW5kIHRlbGxpbmcgdGhlIHVzZXIgaG93IHRvIHZpZXcgYSBjb3B5IG9mIHRoaXMKKyAgICBMaWNlbnNlLiAgKEV4Y2VwdGlvbjogaWYgdGhlIFByb2dyYW0gaXRzZWxmIGlzIGludGVyYWN0aXZlIGJ1dAorICAgIGRvZXMgbm90IG5vcm1hbGx5IHByaW50IHN1Y2ggYW4gYW5ub3VuY2VtZW50LCB5b3VyIHdvcmsgYmFzZWQgb24KKyAgICB0aGUgUHJvZ3JhbSBpcyBub3QgcmVxdWlyZWQgdG8gcHJpbnQgYW4gYW5ub3VuY2VtZW50LikKKwwKK1RoZXNlIHJlcXVpcmVtZW50cyBhcHBseSB0byB0aGUgbW9kaWZpZWQgd29yayBhcyBhIHdob2xlLiAgSWYKK2lkZW50aWZpYWJsZSBzZWN0aW9ucyBvZiB0aGF0IHdvcmsgYXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0sCithbmQgY2FuIGJlIHJlYXNvbmFibHkgY29uc2lkZXJlZCBpbmRlcGVuZGVudCBhbmQgc2VwYXJhdGUgd29ya3MgaW4KK3RoZW1zZWx2ZXMsIHRoZW4gdGhpcyBMaWNlbnNlLCBhbmQgaXRzIHRlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2UKK3NlY3Rpb25zIHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZSB3b3Jrcy4gIEJ1dCB3aGVuIHlvdQorZGlzdHJpYnV0ZSB0aGUgc2FtZSBzZWN0aW9ucyBhcyBwYXJ0IG9mIGEgd2hvbGUgd2hpY2ggaXMgYSB3b3JrIGJhc2VkCitvbiB0aGUgUHJvZ3JhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd2hvbGUgbXVzdCBiZSBvbiB0aGUgdGVybXMgb2YKK3RoaXMgTGljZW5zZSwgd2hvc2UgcGVybWlzc2lvbnMgZm9yIG90aGVyIGxpY2Vuc2VlcyBleHRlbmQgdG8gdGhlCitlbnRpcmUgd2hvbGUsIGFuZCB0aHVzIHRvIGVhY2ggYW5kIGV2ZXJ5IHBhcnQgcmVnYXJkbGVzcyBvZiB3aG8gd3JvdGUgaXQuCisKK1RodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdAoreW91ciByaWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsgcmF0aGVyLCB0aGUgaW50ZW50IGlzIHRvCitleGVyY2lzZSB0aGUgcmlnaHQgdG8gY29udHJvbCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRlcml2YXRpdmUgb3IKK2NvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24gdGhlIFByb2dyYW0uCisKK0luIGFkZGl0aW9uLCBtZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgd29yayBub3QgYmFzZWQgb24gdGhlIFByb2dyYW0KK3dpdGggdGhlIFByb2dyYW0gKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtKSBvbiBhIHZvbHVtZSBvZgorYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIKK3RoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgMy4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhIHdvcmsgYmFzZWQgb24gaXQsCit1bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB1bmRlciB0aGUgdGVybXMgb2YKK1NlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBkbyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKworICAgIGEpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUKKyAgICBzb3VyY2UgY29kZSwgd2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMKKyAgICAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKKworICAgIGIpIEFjY29tcGFueSBpdCB3aXRoIGEgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0IGxlYXN0IHRocmVlCisgICAgeWVhcnMsIHRvIGdpdmUgYW55IHRoaXJkIHBhcnR5LCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZSB0aGFuIHlvdXIKKyAgICBjb3N0IG9mIHBoeXNpY2FsbHkgcGVyZm9ybWluZyBzb3VyY2UgZGlzdHJpYnV0aW9uLCBhIGNvbXBsZXRlCisgICAgbWFjaGluZS1yZWFkYWJsZSBjb3B5IG9mIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLCB0byBiZQorICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtCisgICAgY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAorCisgICAgYykgQWNjb21wYW55IGl0IHdpdGggdGhlIGluZm9ybWF0aW9uIHlvdSByZWNlaXZlZCBhcyB0byB0aGUgb2ZmZXIKKyAgICB0byBkaXN0cmlidXRlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUuICAoVGhpcyBhbHRlcm5hdGl2ZSBpcworICAgIGFsbG93ZWQgb25seSBmb3Igbm9uY29tbWVyY2lhbCBkaXN0cmlidXRpb24gYW5kIG9ubHkgaWYgeW91CisgICAgcmVjZWl2ZWQgdGhlIHByb2dyYW0gaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHdpdGggc3VjaAorICAgIGFuIG9mZmVyLCBpbiBhY2NvcmQgd2l0aCBTdWJzZWN0aW9uIGIgYWJvdmUuKQorCitUaGUgc291cmNlIGNvZGUgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsgZm9yCittYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gIEZvciBhbiBleGVjdXRhYmxlIHdvcmssIGNvbXBsZXRlIHNvdXJjZQorY29kZSBtZWFucyBhbGwgdGhlIHNvdXJjZSBjb2RlIGZvciBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cyBhbnkKK2Fzc29jaWF0ZWQgaW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMsIHBsdXMgdGhlIHNjcmlwdHMgdXNlZCB0bworY29udHJvbCBjb21waWxhdGlvbiBhbmQgaW5zdGFsbGF0aW9uIG9mIHRoZSBleGVjdXRhYmxlLiAgSG93ZXZlciwgYXMgYQorc3BlY2lhbCBleGNlcHRpb24sIHRoZSBzb3VyY2UgY29kZSBkaXN0cmlidXRlZCBuZWVkIG5vdCBpbmNsdWRlCithbnl0aGluZyB0aGF0IGlzIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIChpbiBlaXRoZXIgc291cmNlIG9yIGJpbmFyeQorZm9ybSkgd2l0aCB0aGUgbWFqb3IgY29tcG9uZW50cyAoY29tcGlsZXIsIGtlcm5lbCwgYW5kIHNvIG9uKSBvZiB0aGUKK29wZXJhdGluZyBzeXN0ZW0gb24gd2hpY2ggdGhlIGV4ZWN1dGFibGUgcnVucywgdW5sZXNzIHRoYXQgY29tcG9uZW50CitpdHNlbGYgYWNjb21wYW5pZXMgdGhlIGV4ZWN1dGFibGUuCisKK0lmIGRpc3RyaWJ1dGlvbiBvZiBleGVjdXRhYmxlIG9yIG9iamVjdCBjb2RlIGlzIG1hZGUgYnkgb2ZmZXJpbmcKK2FjY2VzcyB0byBjb3B5IGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCB0aGVuIG9mZmVyaW5nIGVxdWl2YWxlbnQKK2FjY2VzcyB0byBjb3B5IHRoZSBzb3VyY2UgY29kZSBmcm9tIHRoZSBzYW1lIHBsYWNlIGNvdW50cyBhcworZGlzdHJpYnV0aW9uIG9mIHRoZSBzb3VyY2UgY29kZSwgZXZlbiB0aG91Z2ggdGhpcmQgcGFydGllcyBhcmUgbm90Citjb21wZWxsZWQgdG8gY29weSB0aGUgc291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLgorDAorICA0LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KK2V4Y2VwdCBhcyBleHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55IGF0dGVtcHQKK290aGVyd2lzZSB0byBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2Ugb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpcwordm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91ciByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLgorSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsIG9yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXIKK3RoaXMgTGljZW5zZSB3aWxsIG5vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzIHRlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoCitwYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuCisKKyAgNS4gWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSwgc2luY2UgeW91IGhhdmUgbm90CitzaWduZWQgaXQuICBIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvcgorZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBvciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gIFRoZXNlIGFjdGlvbnMgYXJlCitwcm9oaWJpdGVkIGJ5IGxhdyBpZiB5b3UgZG8gbm90IGFjY2VwdCB0aGlzIExpY2Vuc2UuICBUaGVyZWZvcmUsIGJ5Cittb2RpZnlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKK1Byb2dyYW0pLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzbywgYW5kCithbGwgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpbmcgb3IgbW9kaWZ5aW5nCit0aGUgUHJvZ3JhbSBvciB3b3JrcyBiYXNlZCBvbiBpdC4KKworICA2LiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtKSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQorb3JpZ2luYWwgbGljZW5zb3IgdG8gY29weSwgZGlzdHJpYnV0ZSBvciBtb2RpZnkgdGhlIFByb2dyYW0gc3ViamVjdCB0bwordGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIKK3Jlc3RyaWN0aW9ucyBvbiB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ugb2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi4KK1lvdSBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHRvCit0aGlzIExpY2Vuc2UuCisKKyAgNy4gSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0aW9uIG9mIHBhdGVudAoraW5mcmluZ2VtZW50IG9yIGZvciBhbnkgb3RoZXIgcmVhc29uIChub3QgbGltaXRlZCB0byBwYXRlbnQgaXNzdWVzKSwKK2NvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3IKK290aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QKK2V4Y3VzZSB5b3UgZnJvbSB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90CitkaXN0cmlidXRlIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzCitMaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91CittYXkgbm90IGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gYXQgYWxsLiAgRm9yIGV4YW1wbGUsIGlmIGEgcGF0ZW50CitsaWNlbnNlIHdvdWxkIG5vdCBwZXJtaXQgcm95YWx0eS1mcmVlIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGJ5CithbGwgdGhvc2Ugd2hvIHJlY2VpdmUgY29waWVzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCB5b3UsIHRoZW4KK3RoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIGl0IGFuZCB0aGlzIExpY2Vuc2Ugd291bGQgYmUgdG8KK3JlZnJhaW4gZW50aXJlbHkgZnJvbSBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0uCisKK0lmIGFueSBwb3J0aW9uIG9mIHRoaXMgc2VjdGlvbiBpcyBoZWxkIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlcgorYW55IHBhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRlbmRlZCB0bworYXBwbHkgYW5kIHRoZSBzZWN0aW9uIGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYXBwbHkgaW4gb3RoZXIKK2NpcmN1bXN0YW5jZXMuCisKK0l0IGlzIG5vdCB0aGUgcHVycG9zZSBvZiB0aGlzIHNlY3Rpb24gdG8gaW5kdWNlIHlvdSB0byBpbmZyaW5nZSBhbnkKK3BhdGVudHMgb3Igb3RoZXIgcHJvcGVydHkgcmlnaHQgY2xhaW1zIG9yIHRvIGNvbnRlc3QgdmFsaWRpdHkgb2YgYW55CitzdWNoIGNsYWltczsgdGhpcyBzZWN0aW9uIGhhcyB0aGUgc29sZSBwdXJwb3NlIG9mIHByb3RlY3RpbmcgdGhlCitpbnRlZ3JpdHkgb2YgdGhlIGZyZWUgc29mdHdhcmUgZGlzdHJpYnV0aW9uIHN5c3RlbSwgd2hpY2ggaXMKK2ltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQorZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAordGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKK3N5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcKK3RvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdAoraW1wb3NlIHRoYXQgY2hvaWNlLgorCitUaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KK2JlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgorDAorICA4LiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIFByb2dyYW0gaXMgcmVzdHJpY3RlZCBpbgorY2VydGFpbiBjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlCitvcmlnaW5hbCBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBMaWNlbnNlCittYXkgYWRkIGFuIGV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcKK3Rob3NlIGNvdW50cmllcywgc28gdGhhdCBkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcKK2NvdW50cmllcyBub3QgdGh1cyBleGNsdWRlZC4gIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcwordGhlIGxpbWl0YXRpb24gYXMgaWYgd3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgOS4gVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMKK29mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLiAgU3VjaCBuZXcgdmVyc2lvbnMgd2lsbAorYmUgc2ltaWxhciBpbiBzcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwgYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvCithZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KKworRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBJZiB0aGUgUHJvZ3JhbQorc3BlY2lmaWVzIGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlIHdoaWNoIGFwcGxpZXMgdG8gaXQgYW5kICJhbnkKK2xhdGVyIHZlcnNpb24iLCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKK2VpdGhlciBvZiB0aGF0IHZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgSWYgdGhlIFByb2dyYW0gZG9lcyBub3Qgc3BlY2lmeSBhIHZlcnNpb24gbnVtYmVyIG9mCit0aGlzIExpY2Vuc2UsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLgorCisgIDEwLiBJZiB5b3Ugd2lzaCB0byBpbmNvcnBvcmF0ZSBwYXJ0cyBvZiB0aGUgUHJvZ3JhbSBpbnRvIG90aGVyIGZyZWUKK3Byb2dyYW1zIHdob3NlIGRpc3RyaWJ1dGlvbiBjb25kaXRpb25zIGFyZSBkaWZmZXJlbnQsIHdyaXRlIHRvIHRoZSBhdXRob3IKK3RvIGFzayBmb3IgcGVybWlzc2lvbi4gIEZvciBzb2Z0d2FyZSB3aGljaCBpcyBjb3B5cmlnaHRlZCBieSB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgd2Ugc29tZXRpbWVzCittYWtlIGV4Y2VwdGlvbnMgZm9yIHRoaXMuICBPdXIgZGVjaXNpb24gd2lsbCBiZSBndWlkZWQgYnkgdGhlIHR3byBnb2Fscworb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMgb2YgYWxsIGRlcml2YXRpdmVzIG9mIG91ciBmcmVlIHNvZnR3YXJlIGFuZAorb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nIGFuZCByZXVzZSBvZiBzb2Z0d2FyZSBnZW5lcmFsbHkuCisKKwkJCSAgICBOTyBXQVJSQU5UWQorCisgIDExLiBCRUNBVVNFIFRIRSBQUk9HUkFNIElTIExJQ0VOU0VEIEZSRUUgT0YgQ0hBUkdFLCBUSEVSRSBJUyBOTyBXQVJSQU5UWQorRk9SIFRIRSBQUk9HUkFNLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVy4gIEVYQ0VQVCBXSEVOCitPVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUiBPVEhFUiBQQVJUSUVTCitQUk9WSURFIFRIRSBQUk9HUkFNICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRAorT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKK01FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBUSEUgRU5USVJFIFJJU0sgQVMKK1RPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgUFJPR1JBTSBJUyBXSVRIIFlPVS4gIFNIT1VMRCBUSEUKK1BST0dSQU0gUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FIFRIRSBDT1NUIE9GIEFMTCBORUNFU1NBUlkgU0VSVklDSU5HLAorUkVQQUlSIE9SIENPUlJFQ1RJT04uCisKKyAgMTIuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4gV1JJVElORworV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZIEFORC9PUgorUkVESVNUUklCVVRFIFRIRSBQUk9HUkFNIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVSBGT1IgREFNQUdFUywKK0lOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORworT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgUFJPR1JBTSAoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRAorVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcgUkVOREVSRUQgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZCitZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBIEZBSUxVUkUgT0YgVEhFIFBST0dSQU0gVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUgorUFJPR1JBTVMpLCBFVkVOIElGIFNVQ0ggSE9MREVSIE9SIE9USEVSIFBBUlRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFCitQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisKKwkJICAgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKwwKKwkgICAgSG93IHRvIEFwcGx5IFRoZXNlIFRlcm1zIHRvIFlvdXIgTmV3IFByb2dyYW1zCisKKyAgSWYgeW91IGRldmVsb3AgYSBuZXcgcHJvZ3JhbSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdAorcG9zc2libGUgdXNlIHRvIHRoZSBwdWJsaWMsIHRoZSBiZXN0IHdheSB0byBhY2hpZXZlIHRoaXMgaXMgdG8gbWFrZSBpdAorZnJlZSBzb2Z0d2FyZSB3aGljaCBldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UgdW5kZXIgdGhlc2UgdGVybXMuCisKKyAgVG8gZG8gc28sIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIHByb2dyYW0uICBJdCBpcyBzYWZlc3QKK3RvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkKK2NvbnZleSB0aGUgZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0Cit0aGUgImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KKworICAgIDxvbmUgbGluZSB0byBnaXZlIHRoZSBwcm9ncmFtJ3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4+CisgICAgQ29weXJpZ2h0IChDKSA8eWVhcj4gIDxuYW1lIG9mIGF1dGhvcj4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKworCitBbHNvIGFkZCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29udGFjdCB5b3UgYnkgZWxlY3Ryb25pYyBhbmQgcGFwZXIgbWFpbC4KKworSWYgdGhlIHByb2dyYW0gaXMgaW50ZXJhY3RpdmUsIG1ha2UgaXQgb3V0cHV0IGEgc2hvcnQgbm90aWNlIGxpa2UgdGhpcword2hlbiBpdCBzdGFydHMgaW4gYW4gaW50ZXJhY3RpdmUgbW9kZToKKworICAgIEdub21vdmlzaW9uIHZlcnNpb24gNjksIENvcHlyaWdodCAoQykgeWVhciBuYW1lIG9mIGF1dGhvcgorICAgIEdub21vdmlzaW9uIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWTsgZm9yIGRldGFpbHMgdHlwZSBgc2hvdyB3Jy4KKyAgICBUaGlzIGlzIGZyZWUgc29mdHdhcmUsIGFuZCB5b3UgYXJlIHdlbGNvbWUgdG8gcmVkaXN0cmlidXRlIGl0CisgICAgdW5kZXIgY2VydGFpbiBjb25kaXRpb25zOyB0eXBlIGBzaG93IGMnIGZvciBkZXRhaWxzLgorCitUaGUgaHlwb3RoZXRpY2FsIGNvbW1hbmRzIGBzaG93IHcnIGFuZCBgc2hvdyBjJyBzaG91bGQgc2hvdyB0aGUgYXBwcm9wcmlhdGUKK3BhcnRzIG9mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgT2YgY291cnNlLCB0aGUgY29tbWFuZHMgeW91IHVzZSBtYXkKK2JlIGNhbGxlZCBzb21ldGhpbmcgb3RoZXIgdGhhbiBgc2hvdyB3JyBhbmQgYHNob3cgYyc7IHRoZXkgY291bGQgZXZlbiBiZQorbW91c2UtY2xpY2tzIG9yIG1lbnUgaXRlbXMtLXdoYXRldmVyIHN1aXRzIHlvdXIgcHJvZ3JhbS4KKworWW91IHNob3VsZCBhbHNvIGdldCB5b3VyIGVtcGxveWVyIChpZiB5b3Ugd29yayBhcyBhIHByb2dyYW1tZXIpIG9yIHlvdXIKK3NjaG9vbCwgaWYgYW55LCB0byBzaWduIGEgImNvcHlyaWdodCBkaXNjbGFpbWVyIiBmb3IgdGhlIHByb2dyYW0sIGlmCituZWNlc3NhcnkuICBIZXJlIGlzIGEgc2FtcGxlOyBhbHRlciB0aGUgbmFtZXM6CisKKyAgWW95b2R5bmUsIEluYy4sIGhlcmVieSBkaXNjbGFpbXMgYWxsIGNvcHlyaWdodCBpbnRlcmVzdCBpbiB0aGUgcHJvZ3JhbQorICBgR25vbW92aXNpb24nICh3aGljaCBtYWtlcyBwYXNzZXMgYXQgY29tcGlsZXJzKSB3cml0dGVuIGJ5IEphbWVzIEhhY2tlci4KKworICA8c2lnbmF0dXJlIG9mIFR5IENvb24+LCAxIEFwcmlsIDE5ODkKKyAgVHkgQ29vbiwgUHJlc2lkZW50IG9mIFZpY2UKKworVGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGRvZXMgbm90IHBlcm1pdCBpbmNvcnBvcmF0aW5nIHlvdXIgcHJvZ3JhbSBpbnRvCitwcm9wcmlldGFyeSBwcm9ncmFtcy4gIElmIHlvdXIgcHJvZ3JhbSBpcyBhIHN1YnJvdXRpbmUgbGlicmFyeSwgeW91IG1heQorY29uc2lkZXIgaXQgbW9yZSB1c2VmdWwgdG8gcGVybWl0IGxpbmtpbmcgcHJvcHJpZXRhcnkgYXBwbGljYXRpb25zIHdpdGggdGhlCitsaWJyYXJ5LiAgSWYgdGhpcyBpcyB3aGF0IHlvdSB3YW50IHRvIGRvLCB1c2UgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGluc3RlYWQgb2YgdGhpcyBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvUkVBRE1FIGIvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmYTAwOWUKLS0tIC9kZXYvbnVsbAorKysgYi9SRUFETUUKQEAgLTAsMCArMSwxODUgQEAKK1NlY3Rpb25zIGluIHRoaXMgZmlsZSBkZXNjcmliZToKKyAtIGludHJvZHVjdGlvbiBhbmQgb3ZlcnZpZXcKKyAtIGxvdy1sZXZlbCB2cy4gaGlnaC1sZXZlbCBBUEkKKyAtIHZlcnNpb24gbnVtYmVycworIC0gb3B0aW9ucyB0byB0aGUgY29uZmlndXJlIHNjcmlwdAorIC0gQUJJIHN0YWJpbGl0eSBwb2xpY3kKKworSW50cm9kdWN0aW9uCis9PT0KKworRC1CdXMgaXMgYSBzaW1wbGUgc3lzdGVtIGZvciBpbnRlcnByb2Nlc3MgY29tbXVuaWNhdGlvbiBhbmQgY29vcmRpbmF0aW9uLgorCitUaGUgImFuZCBjb29yZGluYXRpb24iIHBhcnQgaXMgaW1wb3J0YW50OyBELUJ1cyBwcm92aWRlcyBhIGJ1cyBkYWVtb24gdGhhdCBkb2VzIHRoaW5ncyBsaWtlOgorIC0gbm90aWZ5IGFwcGxpY2F0aW9ucyB3aGVuIG90aGVyIGFwcHMgZXhpdAorIC0gc3RhcnQgc2VydmljZXMgb24gZGVtYW5kCisgLSBzdXBwb3J0IHNpbmdsZS1pbnN0YW5jZSBhcHBsaWNhdGlvbnMKKworU2VlIGh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3NvZnR3YXJlL2RidXMvIGZvciBsb3RzIG9mIGRvY3VtZW50YXRpb24sIAorbWFpbGluZyBsaXN0cywgZXRjLgorCitTZWUgYWxzbyB0aGUgZmlsZSBDT05UUklCVVRJTkcubWQgZm9yIG5vdGVzIG9mIGludGVyZXN0IHRvIGRldmVsb3BlcnMKK3dvcmtpbmcgb24gRC1CdXMuCisKK0lmIHlvdSdyZSBjb25zaWRlcmluZyBELUJ1cyBmb3IgdXNlIGluIGEgcHJvamVjdCwgeW91IHNob3VsZCBiZSBhd2FyZQordGhhdCBELUJ1cyB3YXMgZGVzaWduZWQgZm9yIGEgY291cGxlIG9mIHNwZWNpZmljIHVzZSBjYXNlcywgYSAic3lzdGVtCitidXMiIGFuZCBhICJkZXNrdG9wIHNlc3Npb24gYnVzLiIgVGhlc2UgYXJlIGRvY3VtZW50ZWQgaW4gbW9yZSBkZXRhaWwKK2luIHRoZSBELUJ1cyBzcGVjaWZpY2F0aW9uIGFuZCBGQVEgYXZhaWxhYmxlIG9uIHRoZSB3ZWIgc2l0ZS4KKworSWYgeW91ciB1c2UtY2FzZSBpc24ndCBvbmUgb2YgdGhlc2UsIEQtQnVzIG1heSBzdGlsbCBiZSB1c2VmdWwsIGJ1dAorb25seSBieSBhY2NpZGVudDsgc28geW91IHNob3VsZCBldmFsdWF0ZSBjYXJlZnVsbHkgd2hldGhlciBELUJ1cyBtYWtlcworc2Vuc2UgZm9yIHlvdXIgcHJvamVjdC4KKworU2VjdXJpdHkKKz09CisKK0lmIHlvdSBmaW5kIGEgc2VjdXJpdHkgdnVsbmVyYWJpbGl0eSB0aGF0IGlzIG5vdCBrbm93biB0byB0aGUgcHVibGljLAorcGxlYXNlIHJlcG9ydCBpdCBwcml2YXRlbHkgdG8gZGJ1cy1zZWN1cml0eUBsaXN0cy5mcmVlZGVza3RvcC5vcmcKK29yIGJ5IHJlcG9ydGluZyBhIGZyZWVkZXNrdG9wLm9yZyBidWcgdGhhdCBpcyBtYXJrZWQgYXMKK3Jlc3RyaWN0ZWQgdG8gdGhlICJELUJVUyBzZWN1cml0eSBncm91cCIgKHlvdSBtaWdodCBuZWVkIHRvICJTaG93CitBZHZhbmNlZCBGaWVsZHMiIHRvIGhhdmUgdGhhdCBvcHRpb24pLgorCitPbiBVbml4IHN5c3RlbXMsIHRoZSBzeXN0ZW0gYnVzIChkYnVzLWRhZW1vbiAtLXN5c3RlbSkgaXMgZGVzaWduZWQKK3RvIGJlIGEgc2VjdXJpdHkgYm91bmRhcnkgYmV0d2VlbiB1c2VycyB3aXRoIGRpZmZlcmVudCBwcml2aWxlZ2VzLgorCitPbiBVbml4IHN5c3RlbXMsIHRoZSBzZXNzaW9uIGJ1cyAoZGJ1cy1kYWVtb24gLS1zZXNzaW9uKSBpcyBkZXNpZ25lZAordG8gYmUgdXNlZCBieSBhIHNpbmdsZSB1c2VyLCBhbmQgb25seSBhY2Nlc3NpYmxlIGJ5IHRoYXQgdXNlci4KKworV2UgZG8gbm90IGN1cnJlbnRseSBjb25zaWRlciBELUJ1cyBvbiBXaW5kb3dzIHRvIGJlIHNlY3VyaXR5LXN1cHBvcnRlZCwKK2FuZCB3ZSBkbyBub3QgcmVjb21tZW5kIGFsbG93aW5nIHVudHJ1c3RlZCB1c2VycyB0byBhY2Nlc3MgV2luZG93cworRC1CdXMgdmlhIFRDUC4KKworTm90ZTogbG93LWxldmVsIEFQSSB2cy4gaGlnaC1sZXZlbCBiaW5kaW5nIEFQSXMKKz09PQorCitBIGNvcmUgY29uY2VwdCBvZiB0aGUgRC1CdXMgaW1wbGVtZW50YXRpb24gaXMgdGhhdCAibGliZGJ1cyIgaXMKK2ludGVuZGVkIHRvIGJlIGEgbG93LWxldmVsIEFQSS4gTW9zdCBwcm9ncmFtbWVycyBhcmUgaW50ZW5kZWQgdG8gdXNlCit0aGUgYmluZGluZ3MgdG8gR0xpYiwgUXQsIFB5dGhvbiwgTW9ubywgSmF2YSwgb3Igd2hhdGV2ZXIuIFRoZXNlCitiaW5kaW5ncyBoYXZlIHZhcnlpbmcgbGV2ZWxzIG9mIGNvbXBsZXRlbmVzcyBhbmQgYXJlIG1haW50YWluZWQgYXMKK3NlcGFyYXRlIHByb2plY3RzIGZyb20gdGhlIG1haW4gRC1CdXMgcGFja2FnZS4gVGhlIG1haW4gRC1CdXMgcGFja2FnZQorY29udGFpbnMgdGhlIGxvdy1sZXZlbCBsaWJkYnVzLCB0aGUgYnVzIGRhZW1vbiwgYW5kIGEgZmV3IGNvbW1hbmQtbGluZQordG9vbHMgc3VjaCBhcyBkYnVzLWxhdW5jaC4KKworSWYgeW91IHVzZSB0aGUgbG93LWxldmVsIEFQSSBkaXJlY3RseSwgeW91J3JlIHNpZ25pbmcgdXAgZm9yIHNvbWUKK3BhaW4uIFRoaW5rIG9mIHRoZSBsb3ctbGV2ZWwgQVBJIGFzIGFuYWxvZ291cyB0byBYbGliIG9yIEdESSwgYW5kIHRoZQoraGlnaC1sZXZlbCBBUEkgYXMgYW5hbG9nb3VzIHRvIFF0L0dUSysvSFRNTC4KKworVmVyc2lvbiBudW1iZXJzCis9PT0KKworRC1CdXMgdXNlcyB0aGUgY29tbW9uICJMaW51eCBrZXJuZWwiIHZlcnNpb25pbmcgc3lzdGVtLCB3aGVyZQorZXZlbi1udW1iZXJlZCBtaW5vciB2ZXJzaW9ucyBhcmUgc3RhYmxlIGFuZCBvZGQtbnVtYmVyZWQgbWlub3IKK3ZlcnNpb25zIGFyZSBkZXZlbG9wbWVudCBzbmFwc2hvdHMuCisKK1NvIGZvciBleGFtcGxlLCBkZXZlbG9wbWVudCBzbmFwc2hvdHM6IDEuMS4xLCAxLjEuMiwgMS4xLjMsIDEuMy40CitTdGFibGUgdmVyc2lvbnM6IDEuMCwgMS4wLjEsIDEuMC4yLCAxLjIuMSwgMS4yLjMKKworQWxsIHByZS0xLjAgdmVyc2lvbnMgd2VyZSBkZXZlbG9wbWVudCBzbmFwc2hvdHMuCisKK0RldmVsb3BtZW50IHNuYXBzaG90cyBtYWtlIG5vIEFCSSBzdGFiaWxpdHkgZ3VhcmFudGVlcyBmb3IgbmV3IEFCSQoraW50cm9kdWNlZCBzaW5jZSB0aGUgbGFzdCBzdGFibGUgcmVsZWFzZS4gRGV2ZWxvcG1lbnQgc25hcHNob3RzIGFyZQorbGlrZWx5IHRvIGhhdmUgbW9yZSBidWdzIHRoYW4gc3RhYmxlIHJlbGVhc2VzLCBvYnZpb3VzbHkuCisKK0NvbmZpZ3VyYXRpb24gCis9PT0KKworZGJ1cyBjb3VsZCBiZSBidWlsZCBieSB1c2luZyBhdXRvdG9vbHMgb3IgY21ha2UuIAorCitXaGVuIHVzaW5nIGF1dG90b29scyB0aGUgY29uZmlndXJlIHN0ZXAgaXMgaW5pdGlhdGVkIGJ5IHJ1bm5pbmcgLi9jb25maWd1cmUgCit3aXRoIG9yIHdpdGhvdXQgYWRkaXRpb25hbCBjb25maWd1cmF0aW9uIGZsYWdzLiBkYnVzIHJlcXVpcmVzIEdOVSBNYWtlCisob24gQlNEIHN5c3RlbXMsIHRoaXMgaXMgdHlwaWNhbGx5IGNhbGxlZCBnbWFrZSkgb3IgYSAibWFrZSIgaW1wbGVtZW50YXRpb24KK3dpdGggY29tcGF0aWJsZSBleHRlbnNpb25zLgorCitXaGVuIHVzaW5nIGNtYWtlIHRoZSBjb25maWd1cmUgc3RlcCBpcyBpbml0aWF0ZWQgYnkgcnVubmluZyB0aGUgY21ha2UgCitwcm9ncmFtIHdpdGggb3Igd2l0aG91dCBhZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb24gZmxhZ3MuIAorCitDb25maWd1cmF0aW9uIGZsYWdzCis9PT0KKworV2hlbiB1c2luZyBhdXRvdG9vbHMsIHJ1biAiLi9jb25maWd1cmUgLS1oZWxwIiB0byBzZWUgdGhlIHBvc3NpYmxlCitjb25maWd1cmF0aW9uIG9wdGlvbnMgYW5kIGVudmlyb25tZW50IHZhcmlhYmxlcy4KKworV2hlbiB1c2luZyBjbWFrZSwgaW5zcGVjdCBSRUFETUUuY21ha2UgdG8gc2VlIHRoZSBwb3NzaWJsZQorY29uZmlndXJhdGlvbiBvcHRpb25zIGFuZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMuCisgICAgCitBUEkvQUJJIFBvbGljeQorPT09CisKK05vdyB0aGF0IEQtQnVzIGhhcyByZWFjaGVkIHZlcnNpb24gMS4wLCB0aGUgb2JqZWN0aXZlIGlzIHRoYXQgYWxsCithcHBsaWNhdGlvbnMgZHluYW1pY2FsbHkgbGlua2VkIHRvIGxpYmRidXMgd2lsbCBjb250aW51ZSB3b3JraW5nCitpbmRlZmluaXRlbHkgd2l0aCB0aGUgbW9zdCByZWNlbnQgc3lzdGVtIGFuZCBzZXNzaW9uIGJ1cyBkYWVtb25zLgorCisgLSBUaGUgcHJvdG9jb2wgd2lsbCBuZXZlciBiZSBicm9rZW4gYWdhaW47IGFueSBtZXNzYWdlIGJ1cyBzaG91bGQgCisgICB3b3JrIHdpdGggYW55IGNsaWVudCBmb3JldmVyLiBIb3dldmVyLCBleHRlbnNpb25zIGFyZSBwb3NzaWJsZQorICAgd2hlcmUgdGhlIHByb3RvY29sIGlzIGV4dGVuc2libGUuCisKKyAtIElmIHRoZSBsaWJyYXJ5IEFQSSBpcyBtb2RpZmllZCBpbmNvbXBhdGlibHksIHdlIHdpbGwgcmVuYW1lIGl0IAorICAgYXMgaW4gaHR0cDovL29tZXRlci5jb20vcGFyYWxsZWwuaHRtbCAtIGluIG90aGVyIHdvcmRzLCAKKyAgIGl0IHdpbGwgYWx3YXlzIGJlIHBvc3NpYmxlIHRvIGNvbXBpbGUgYWdhaW5zdCBhbmQgdXNlIHRoZSBvbGRlciAKKyAgIEFQSSwgYW5kIGFwcHMgd2lsbCBhbHdheXMgZ2V0IHRoZSBBUEkgdGhleSBleHBlY3QuCisKK0ludGVyZmFjZXMgY2FuIGFuZCBwcm9iYWJseSB3aWxsIGJlIF9hZGRlZF8uIFRoaXMgbWVhbnMgYm90aCBuZXcKK2Z1bmN0aW9ucyBhbmQgdHlwZXMgaW4gbGliZGJ1cywgYW5kIG5ldyBtZXRob2RzIGV4cG9ydGVkIHRvCithcHBsaWNhdGlvbnMgYnkgdGhlIGJ1cyBkYWVtb24uCisKK1RoZSBhYm92ZSBwb2xpY3kgaXMgaW50ZW5kZWQgdG8gbWFrZSBELUJ1cyBhcyBBUEktc3RhYmxlIGFzIG90aGVyCit3aWRlbHktdXNlZCBsaWJyYXJpZXMgKHN1Y2ggYXMgR1RLKywgUXQsIFhsaWIsIG9yIHlvdXIgZmF2b3JpdGUKK2V4YW1wbGUpLiBJZiB5b3UgaGF2ZSBxdWVzdGlvbnMgb3IgY29uY2VybnMgdGhleSBhcmUgdmVyeSB3ZWxjb21lIG9uCit0aGUgRC1CdXMgbWFpbGluZyBsaXN0LgorCitOT1RFIEFCT1VUIERFVkVMT1BNRU5UIFNOQVBTSE9UUyBBTkQgVkVSU0lPTklORworCitPZGQtbnVtYmVyZWQgbWlub3IgcmVsZWFzZXMgKDEuMS54LCAxLjMueCwgMi4xLngsIGV0Yy4gLQorbWFqb3IubWlub3IubWljcm8pIGFyZSBkZXZlbCBzbmFwc2hvdHMgZm9yIHRlc3RpbmcsIGFuZCBhbnkgbmV3IEFCSQordGhleSBpbnRyb2R1Y2UgcmVsYXRpdmUgdG8gdGhlIGxhc3Qgc3RhYmxlIHZlcnNpb24gaXMgc3ViamVjdCB0bworY2hhbmdlIGR1cmluZyB0aGUgZGV2ZWxvcG1lbnQgY3ljbGUuCisKK0FueSBBQkkgZm91bmQgaW4gYSBzdGFibGUgcmVsZWFzZSwgaG93ZXZlciwgaXMgZnJvemVuLgorCitBQkkgd2lsbCBub3QgYmUgYWRkZWQgaW4gYSBzdGFibGUgc2VyaWVzIGlmIHdlIGNhbiBoZWxwIGl0LiBpLmUuIHRoZQorQUJJIG9mIDEuMi4wIGFuZCAxLjIuNSB5b3UgY2FuIGV4cGVjdCB0byBiZSB0aGUgc2FtZSwgd2hpbGUgdGhlIEFCSSBvZgorMS40LnggbWF5IGFkZCBtb3JlIHN0dWZmIG5vdCBmb3VuZCBpbiAxLjIueC4KKworTk9URSBBQk9VVCBTVEFUSUMgTElOS0lORworCitXZSBhcmUgbm90IHlldCBmaXJtbHkgZnJlZXppbmcgYWxsIHJ1bnRpbWUgZGVwZW5kZW5jaWVzIG9mIHRoZSBsaWJkYnVzCitsaWJyYXJ5LiBGb3IgZXhhbXBsZSwgdGhlIGxpYnJhcnkgbWF5IHJlYWQgY2VydGFpbiBmaWxlcyBhcyBwYXJ0IG9mCitpdHMgaW1wbGVtZW50YXRpb24sIGFuZCB0aGVzZSBmaWxlcyBtYXkgbW92ZSBhcm91bmQgYmV0d2VlbiB2ZXJzaW9ucy4KKworQXMgYSByZXN1bHQsIHdlIGRvbid0IHlldCByZWNvbW1lbmQgc3RhdGljYWxseSBsaW5raW5nIHRvCitsaWJkYnVzLiBBbHNvLCByZWltcGxlbWVudGF0aW9ucyBvZiB0aGUgcHJvdG9jb2wgZnJvbSBzY3JhdGNoIG1pZ2h0CitoYXZlIHRvIHdvcmsgdG8gc3RheSBpbiBzeW5jIHdpdGggaG93IGxpYmRidXMgYmVoYXZlcy4KKworVG8gbG9jayB0aGluZ3MgZG93biBhbmQgZGVjbGFyZSBzdGF0aWMgbGlua2luZyBhbmQgcmVpbXBsZW1lbnRhdGlvbiB0bworYmUgc2FmZSwgd2UnZCBsaWtlIHRvIHNlZSBhbGwgdGhlIGludGVybmFsIGRlcGVuZGVuY2llcyBvZiBsaWJkYnVzCisoZm9yIGV4YW1wbGUsIGZpbGVzIHJlYWQpIHdlbGwtZG9jdW1lbnRlZCBpbiB0aGUgc3BlY2lmaWNhdGlvbiwgYW5kCit3ZSdkIGxpa2UgdG8gaGF2ZSBhIGhpZ2ggZGVncmVlIG9mIGNvbmZpZGVuY2UgdGhhdCB0aGVzZSBkZXBlbmRlbmNpZXMKK2FyZSBzdXBwb3J0YWJsZSBvdmVyIHRoZSBsb25nIHRlcm0gYW5kIGV4dGVuc2libGUgd2hlcmUgcmVxdWlyZWQuCisKK05PVEUgQUJPVVQgSElHSC1MRVZFTCBCSU5ESU5HUworCitOb3RlIHRoYXQgdGhlIGhpZ2gtbGV2ZWwgYmluZGluZ3MgYXJlIF9zZXBhcmF0ZSBwcm9qZWN0c18gZnJvbSB0aGUKK21haW4gRC1CdXMgcGFja2FnZSwgYW5kIGhhdmUgdGhlaXIgb3duIHJlbGVhc2UgY3ljbGVzLCBsZXZlbHMgb2YKK21hdHVyaXR5LCBhbmQgQUJJIHN0YWJpbGl0eSBwb2xpY2llcy4gUGxlYXNlIGNvbnN1bHQgdGhlIGRvY3VtZW50YXRpb24KK2ZvciB5b3VyIGJpbmRpbmcuCisKK0Jvb3RzdHJhcHBpbmcgRC1CdXMgb24gbmV3IHBsYXRmb3JtcworPT09CisKK0EgZnVsbCBidWlsZCBvZiBELUJ1cywgd2l0aCBhbGwgcmVncmVzc2lvbiB0ZXN0cyBlbmFibGVkIGFuZCBydW4sIGhhcyBzb21lCitkZXBlbmRlbmNpZXMgd2hpY2ggdGhlbXNlbHZlcyBkZXBlbmQgb24gRC1CdXMsIGVpdGhlciBmb3IgY29tcGlsYXRpb24gb3IKK2ZvciBzb21lIG9mICp0aGVpciogcmVncmVzc2lvbiB0ZXN0czogR0xpYiwgZGJ1cy1nbGliIGFuZCBkYnVzLXB5dGhvbiBhcmUKK2N1cnJlbnRseSBhZmZlY3RlZC4KKworVG8gYXZvaWQgY2lyY3VsYXIgZGVwZW5kZW5jaWVzLCB3aGVuIGJvb3RzdHJhcHBpbmcgRC1CdXMgZm9yIHRoZSBmaXJzdCB0aW1lCitvbiBhIG5ldyBPUyBvciBDUFUgYXJjaGl0ZWN0dXJlLCB5b3UgY2FuIGVpdGhlciBjcm9zcy1jb21waWxlIHNvbWUgb2YKK3Rob3NlIGNvbXBvbmVudHMsIG9yIGNob29zZSB0aGUgYnVpbGQgb3JkZXIgYW5kIG9wdGlvbnMgY2FyZWZ1bGx5OgorCisqIGJ1aWxkIGFuZCBpbnN0YWxsIEQtQnVzIHdpdGhvdXQgdGVzdHMKKyAgLSBkbyBub3QgdXNlIHRoZSAtLWVuYWJsZS1tb2R1bGFyLXRlc3RzPXllcyBjb25maWd1cmUgb3B0aW9uCisgIC0gZG8gbm90IHVzZSB0aGUgLS1lbmFibGUtdGVzdHM9eWVzIGNvbmZpZ3VyZSBvcHRpb24KKyogYnVpbGQgYW5kIGluc3RhbGwgR0xpYiwgYWdhaW4gd2l0aG91dCB0ZXN0cworKiB1c2UgdGhvc2UgdmVyc2lvbnMgb2YgbGliZGJ1cyBhbmQgR0xpYiB0byBidWlsZCBhbmQgaW5zdGFsbCBkYnVzLWdsaWIKKyogLi4uIGFuZCB1c2UgdGhvc2UgdG8gaW5zdGFsbCBkYnVzLXB5dGhvbgorKiByZWJ1aWxkIGxpYmRidXM7IHRoaXMgdGltZSB5b3UgY2FuIHJ1biBhbGwgb2YgdGhlIHRlc3RzCisqIHJlYnVpbGQgR0xpYjsgdGhpcyB0aW1lIHlvdSBjYW4gcnVuIGFsbCBvZiB0aGUgdGVzdHMKZGlmZiAtLWdpdCBhL1JFQURNRS5jbWFrZSBiL1JFQURNRS5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTAxMmZiCi0tLSAvZGV2L251bGwKKysrIGIvUkVBRE1FLmNtYWtlCkBAIC0wLDAgKzEsMTkzIEBACitUaGlzIGZpbGUgZGVzY3JpYmVzIGhvdyB0byBjb21waWxlIGRidXMgdXNpbmcgdGhlIGNtYWtlIGJ1aWxkIHN5c3RlbQorCitSZXF1aXJlbWVudHMKKy0tLS0tLS0tLS0tLQorLSBjbWFrZSB2ZXJzaW9uID49IDIuNi4wIHNlZSBodHRwOi8vd3d3LmNtYWtlLm9yZworLSBpbnN0YWxsZWQgbGliZXhwYXQgc2VlIGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvZXhwYXQvIAorICAgIHVuc3VwcG9ydGVkIFJlbFdpdGhEZWJJbmZvIGJ1aWxkcyBjb3VsZCBiZSBmZXRjaGVkIAorICAgIGZyb20gaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9rZGUtd2luZG93cy9maWxlcy9leHBhdC8KKworQnVpbGRpbmcKKy0tLS0tLS0tCisKK1dpbjMyIE1pbkdXLXc2NHwzMgorMS4gaW5zdGFsbCBtaW5ndy13NjQgZnJvbSBodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL21pbmd3LXc2NC8KKzIuIGluc3RhbGwgY21ha2UgYW5kIGxpYmV4cGF0CiszLiBnZXQgZGJ1cyBzb3VyY2VzCis0LiB1bnBhY2sgZGJ1cyBzb3VyY2VzIGludG8gYSBzdWIgZGlyZWN0b3J5IChyZWZlcnJlZCBhcyA8ZGJ1cy1zcmMtcm9vdD4gbGF0ZXIpCis1LiBta2RpciBkYnVzLWJ1aWxkCis2LiBjZCBkYnVzLWJ1aWxkCis3LiBydW4gCisgICAgY21ha2UgLUcgIk1pbkdXIE1ha2VmaWxlcyIgWzxvcHRpb25zLCBzZWUgYmVsb3c+XSA8ZGJ1cy1zcmMtcm9vdD4vY21ha2UKKyAgICBtaW5ndzMyLW1ha2UKKyAgICBtaW5ndzMyLW1ha2UgaW5zdGFsbAorCitXaW4zMiBNaWNyb3NvZnQgbm1ha2UKKzEuIGluc3RhbGwgTVNWQyAyMDEwIEV4cHJlc3MgVmVyc2lvbiBmcm9tIGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS92aXN1YWxzdHVkaW8vZW4tdXMvcHJvZHVjdHMvMjAxMC1lZGl0aW9ucy92aXN1YWwtY3BwLWV4cHJlc3MKKzIuIGluc3RhbGwgY21ha2UgYW5kIGxpYmV4cGF0CiszLiBnZXQgZGJ1cyBzb3VyY2VzCis0LiB1bnBhY2sgZGJ1cyBzb3VyY2VzIGludG8gYSBzdWIgZGlyZWN0b3J5IChyZWZlcnJlZCBhcyA8ZGJ1cy1zcmMtcm9vdD4gbGF0ZXIpCis1LiBta2RpciBkYnVzLWJ1aWxkCis2LiBjZCBkYnVzLWJ1aWxkCis3LiBydW4gCisgICAgY21ha2UgLUcgIk5NYWtlIE1ha2VmaWxlcyIgWzxvcHRpb25zLCBzZWUgYmVsb3c+XSA8ZGJ1cy1zcmMtcm9vdD4vY21ha2UKKyAgICBubWFrZQorICAgIG5tYWtlIGluc3RhbGwKKworV2luMzIgVmlzdWFsIFN0dWRpbyAyMDEwIEV4cHJlc3MgSURFCisxLiBpbnN0YWxsIE1TVkMgMjAxMCBFeHByZXNzIFZlcnNpb24gZnJvbSBodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vdmlzdWFsc3R1ZGlvL2VuLXVzL3Byb2R1Y3RzLzIwMTAtZWRpdGlvbnMvdmlzdWFsLWNwcC1leHByZXNzCisyLiBpbnN0YWxsIGNtYWtlIGFuZCBsaWJleHBhdAorMy4gZ2V0IGRidXMgc291cmNlcworNC4gdW5wYWNrIGRidXMgc291cmNlcyBpbnRvIGEgc3ViIGRpcmVjdG9yeSAocmVmZXJyZWQgYXMgPGRidXMtc3JjLXJvb3Q+IGxhdGVyKQorNS4gbWtkaXIgZGJ1cy1idWlsZAorNi4gY2QgZGJ1cy1idWlsZAorNy4gcnVuCisgICAgICBjbWFrZSAtRyAiVmlzdWFsIFN0dWRpbyAxMCIgWzxvcHRpb25zLCBzZWUgYmVsb3c+XSA8ZGJ1cy1zcmMtcm9vdD4vY21ha2UKKzhhLiBvcGVuIElERSB3aXRoCisgICAgICB2Y2V4cHJlc3MgZGJ1cy5zbG4KKzhiLiBmb3IgaW1tZWRpYXRlIGJ1aWxkIHJ1bgorICAgICAgdmNleHByZXNzIGRidXMuc2xuIC9idWlsZAorCitXaW4zMiBWaXN1YWwgU3R1ZGlvIDIwMTAgUHJvZmVzc2lvbmFsIElERQorMS4gaW5zdGFsbCBNU1ZDIDIwMTAgUHJvZmVzc2lvbmFsIFZlcnNpb24KKzIuIGluc3RhbGwgY21ha2UgYW5kIGxpYmV4cGF0CiszLiBnZXQgZGJ1cyBzb3VyY2VzCis0LiB1bnBhY2sgZGJ1cyBzb3VyY2VzIGludG8gYSBzdWIgZGlyZWN0b3J5IChyZWZlcnJlZCBhcyA8ZGJ1cy1zcmMtcm9vdD4gbGF0ZXIpCis1LiBta2RpciBkYnVzLWJ1aWxkCis2LiBjZCBkYnVzLWJ1aWxkCis3LiBydW4gCisgICAgICBjbWFrZSAtRyAiVmlzdWFsIFN0dWRpbyAxMCIgWzxvcHRpb25zLCBzZWUgYmVsb3c+XSA8ZGJ1cy1zcmMtcm9vdD4vY21ha2UKKzhhLiBvcGVuIElERSB3aXRoCisgICAgICBkZXZlbnYgZGJ1cy5zbG4KKzhiLiBmb3IgaW1tZWRpYXRlIGJ1aWxkIHJ1bgorICAgICAgZGV2ZW52IGRidXMuc2xuIC9idWlsZAorCitMaW51eAorMS4gaW5zdGFsbCBjbWFrZSBhbmQgbGliZXhwYXQKKzIuIGdldCBkYnVzIHNvdXJjZXMKKzMuIHVucGFjayBkYnVzIHNvdXJjZXMgaW50byBhIHN1YiBkaXJlY3RvcnkgKHJlZmVycmVkIGFzIDxkYnVzLXNyYy1yb290PiBsYXRlcikKKzQuIG1rZGlyIGRidXMtYnVpbGQKKzUuIGNkIGRidXMtYnVpbGQKKzYuIHJ1biAKKyAgICBjbWFrZSAtRyAiPGZvciBhdmFpbGFibGUgdGFyZ2V0cywgc2VlIGNtYWtlIC0taGVscCBmb3IgYSBsaXN0PiIgWzxvcHRpb25zLCBzZWUgYmVsb3c+XSA8ZGJ1cy1zcmMtcm9vdD4vY21ha2UKKyAgICBtYWtlCisgICAgbWFrZSBpbnN0YWxsCisKK0ZvciBvdGhlciBjb21waWxlcnMgc2VlIGNtYWtlIC0taGVscCBpbiB0aGUgR2VuZXJhdG9ycyBzZWN0aW9uCisKK0NvbmZpZ3VyYXRpb24gZmxhZ3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworV2hlbiB1c2luZyB0aGUgY21ha2UgYnVpbGQgc3lzdGVtIHRoZSBkYnVzLXNwZWNpZmljIGNvbmZpZ3VyYXRpb24gZmxhZ3MgdGhhdCBjYW4gYmUgZ2l2ZW4gCit0byB0aGUgY21ha2UgcHJvZ3JhbSBhcmUgdGhlc2UgKHVzZSAtRDxrZXk+PTx2YWx1ZT4gb24gY29tbWFuZCBsaW5lKS4gVGhlIGxpc3RlZCB2YWx1ZXMgCithcmUgdGhlIGRlZmF1bHRzIChpbiBhIHR5cGljYWwgYnVpbGQgLSBzb21lIGFyZSBwbGF0Zm9ybS1zcGVjaWZpYykuCisKKy8vIENob29zZSB0aGUgdHlwZSBvZiBidWlsZCwgb3B0aW9ucyBhcmU6IE5vbmUoQ01BS0VfQ1hYX0ZMQUdTIG9yCisvLyBDTUFLRV9DX0ZMQUdTIHVzZWQpIERlYnVnIFJlbGVhc2UgUmVsV2l0aERlYkluZm8gTWluU2l6ZVJlbC4KK0NNQUtFX0JVSUxEX1RZUEU6U1RSSU5HPURlYnVnCisKKy8vIEluY2x1ZGUgcGF0aCBmb3IgM3JkcGFydHkgcGFja2FnZXMKK0NNQUtFX0lOQ0xVREVfUEFUSDpQQVRIPQorCisvLyBMaWJyYXJ5IHBhdGggZm9yIDNyZHBhcnR5IHBhY2thZ2VzCitDTUFLRV9MSUJSQVJZX1BBVEg6UEFUSD0KKworLy8gSW5zdGFsbCBwYXRoIHByZWZpeCwgcHJlcGVuZGVkIG9udG8gaW5zdGFsbCBkaXJlY3Rvcmllcy4KK0NNQUtFX0lOU1RBTExfUFJFRklYOlBBVEg9QzovUHJvZ3JhbSBGaWxlcy9kYnVzCisKKworLy8gZW5hYmxlIHVuaXQgdGVzdCBjb2RlCitEQlVTX0JVSUxEX1RFU1RTOkJPT0w9T04KKworLy8gVGhlIG5hbWUgb2YgdGhlIGRidXMgZGFlbW9uIGV4ZWN1dGFibGUKK0RCVVNfREFFTU9OX05BTUU6U1RSSU5HPWRidXMtZGFlbW9uCisKKy8vIERpc2FibGUgYXNzZXJ0aW9uIGNoZWNraW5nCitEQlVTX0RJU0FCTEVfQVNTRVJUOkJPT0w9T0ZGCisKKy8vIERpc2FibGUgcHVibGljIEFQSSBzYW5pdHkgY2hlY2tpbmcKK0RCVVNfRElTQUJMRV9DSEVDS1M6Qk9PTD1PRkYKKworLy8gZW5hYmxlIC1hbnNpIC1wZWRhbnRpYyBnY2MgZmxhZ3MKK0RCVVNfRU5BQkxFX0FOU0k6Qk9PTD1PRkYKKworLy8gYnVpbGQgRE9YWUdFTiBkb2N1bWVudGF0aW9uIChyZXF1aXJlcyBEb3h5Z2VuKQorREJVU19FTkFCTEVfRE9YWUdFTl9ET0NTOkJPT0w9T0ZGCisKKy8vIGVuYWJsZSBidXMgZGFlbW9uIHVzYWdlIHN0YXRpc3RpY3MKK0RCVVNfRU5BQkxFX1NUQVRTOkJPT0w9T0ZGCisKKy8vIHN1cHBvcnQgdmVyYm9zZSBkZWJ1ZyBtb2RlCitEQlVTX0VOQUJMRV9WRVJCT1NFX01PREU6Qk9PTD1PTgorCisvLyBidWlsZCBYTUwgIGRvY3VtZW50YXRpb24gKHJlcXVpcmVzIHhtbHRvIG9yIG1laW5wcm9jNCkKK0RCVVNfRU5BQkxFX1hNTF9ET0NTOkJPT0w9T04KKworLy8gaW5zdGFsbCByZXF1aXJlZCBzeXN0ZW0gbGlicmFyaWVzCitEQlVTX0lOU1RBTExfU1lTVEVNX0xJQlM6Qk9PTD1PRkYKKworLy8gc2Vzc2lvbiBidXMgZGVmYXVsdCBsaXN0ZW5pbmcgYWRkcmVzcworREJVU19TRVNTSU9OX0JVU19MSVNURU5fQUREUkVTUzpTVFJJTkc9YXV0b2xhdW5jaDoKKworLy8gc2Vzc2lvbiBidXMgZmFsbGJhY2sgYWRkcmVzcyBmb3IgY2xpZW50cworREJVU19TRVNTSU9OX0JVU19DT05ORUNUX0FERFJFU1M6U1RSSU5HPWF1dG9sYXVuY2g6CisKKy8vIHN5c3RlbSBidXMgZGVmYXVsdCBhZGRyZXNzIChvbmx5IHVzZWZ1bCBvbiBVbml4KQorREJVU19TWVNURU1fQlVTX0RFRkFVTFRfQUREUkVTUzpTVFJJTkc9dW5peDpwYXRoPS92YXIvcnVuL2RidXMvc3lzdGVtX2J1c19zb2NrZXQKKword2luMzIgb25seToKKy8vIGVuYWJsZSB3aW4zMiBkZWJ1ZyBwb3J0IGZvciBtZXNzYWdlIG91dHB1dAorREJVU19VU0VfT1VUUFVUX0RFQlVHX1NUUklORzpCT09MPU9GRgorCitnY2Mgb25seToKKy8vIGNvbXBpbGUgd2l0aCBjb3ZlcmFnZSBwcm9maWxpbmcgaW5zdHJ1bWVudGF0aW9uCitEQlVTX0dDT1ZfRU5BQkxFRDpCT09MPU9GRgorCitzb2xhcmlzIG9ubHk6CisvLyBlbmFibGUgY29uc29sZSBvd25lciBmaWxlIAorSEFWRV9DT05TT0xFX09XTkVSX0ZJTEU6Qk9PTD1PTgorCisvLyBEaXJlY3RvcnkgdG8gY2hlY2sgZm9yIGNvbnNvbGUgb3duZXJzaGlwCitEQlVTX0NPTlNPTEVfT1dORVJfRklMRTpTVFJJTkc9L2Rldi9jb25zb2xlCisKKy8vIExpbnV4IG9ubHk6CisvLyBlbmFibGUgaW5vdGlmeSBhcyBkaXIgd2F0Y2ggYmFja2VuZAorREJVU19CVVNfRU5BQkxFX0lOT1RJRlk6Qk9PTD1PTgorCisqQlNEIG9ubHk6CisvLyBlbmFibGUga3F1ZXVlIGFzIGRpciB3YXRjaCBiYWNrZW5kCitEQlVTX0JVU19FTkFCTEVfS1FVRVVFOkJPT0w9T04KKworeDExIG9ubHk6CisvLyBCdWlsZCB3aXRoIFgxMSBhdXRvIGxhdW5jaCBzdXBwb3J0CitEQlVTX0JVSUxEX1gxMTpCT09MPU9OCisKKworTm90ZTogVGhlIGFib3ZlIG1lbnRpb25lZCBvcHRpb25zIGNvdWxkIGJlIGV4dHJhY3RlZCBhZnRlciAKK2NvbmZpZ3VyaW5nIGZyb20gdGhlIG91dHB1dCBvZiBydW5uaW5nICI8bWFrZXRvb2w+IGhlbHAtb3B0aW9ucyIgCitpbiB0aGUgYnVpbGQgZGlyZWN0b3J5LiBUaGUgcmVsYXRlZCBlbnRyaWVzIHN0YXJ0IHdpdGggCitDTUFLRV8gb3IgREJVU18uIAorCisKK0hvdyB0byBjb21waWxlIGluIGRidXMgaW50byBjbGllbnRzIHdpdGggY21ha2UKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVG8gY29tcGlsZSBkYnVzIGxpYnJhcnkgaW50byBhIGNsaWVudCBhcHBsaWNhdGlvbiB3aXRoIGNtYWtlCit0aGUgZm9sbG93aW5nIGNtYWtlIGNvbW1hbmRzIGFyZSByZXF1aXJlZDoKKworMS4gY2FsbCBmaW5kX3BhY2thZ2UgdG8gZmluZCBkYnVzIHBhY2thZ2UKKworZmluZF9wYWNrYWdlKERCdXMxKQorCisyLiBhZnRlciBzcGVjaWZpbmcgdGFyZ2V0cyBsaW5rIGRidXMgaW50byB0YXJnZXQKKworYWRkX2V4ZWN1dGFibGUodGVzdCB0ZXN0LmMpCit0YXJnZXRfbGlua19saWJyYXJpZXModGVzdCAke0RCdXMxX0xJQlJBUklFU30pCisKK0FkZGluZyAke0RCdXMxX0xJQlJBUklFU30gdG8gdGFyZ2V0cyBhbHNvIGFkZHMgcmVxdWlyZWQgZGJ1cworaW5jbHVkZSBkaXJzIGFuZCBjb21waWxlciBkZWZpbml0aW9ucyBieSBkZWZhdWx0LiBUaGVyZSBpcworbm8gbmVlZCB0byBhZGQgdGhlbSB3aXRoIGluY2x1ZGVfZGlyZWN0b3JpZXMgYW5kIGFkZF9kZWZpbml0aW9ucy4KKworVG8gY29tcGlsZSBhZ2FpbnN0IGRidXMgaW5zdGFsbGVkIGluIGEgbm9uIHN0YW5kYXJkIGxvY2F0aW9uCitzcGVjaWZ5IC1EREJ1czFfRElSPTxkYnVzLWluc3RhbGwtcm9vdD4vbGliWzY0XS9jbWFrZS9EQnVzMQorb24gY21ha2UgY29tbWFuZCBsaW5lLgpkaWZmIC0tZ2l0IGEvUkVBRE1FLmN5Z3dpbiBiL1JFQURNRS5jeWd3aW4KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTA0Y2JiNAotLS0gL2Rldi9udWxsCisrKyBiL1JFQURNRS5jeWd3aW4KQEAgLTAsMCArMSw2IEBACitUaGUgY3lnd2luIGRidXMgcG9ydCBpcyBpbmNsdWRlZCBpbiBtYXN0ZXIgYnJhbmNoIG9mCitkYnVzIGdpdCByZXBvc2l0b3J5IHNpbmNlIDEuMy4xLgorCitUaGUgY3lnd2luIHBvcnQgb2YgZGJ1cyBpcyBtYWludGFpbmVkIGJ5OgorCitodHRwOi8vc291cmNld2FyZS5vcmcvY3lnd2lucG9ydHMvCmRpZmYgLS1naXQgYS9SRUFETUUubGF1bmNoZCBiL1JFQURNRS5sYXVuY2hkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwMWU1N2QKLS0tIC9kZXYvbnVsbAorKysgYi9SRUFETUUubGF1bmNoZApAQCAtMCwwICsxLDYxIEBACitMYXVuY2hkWzEsMl0gcmVwbGFjZXMgaW5pdCwgaW5ldGQgYW5kIGNyb24gb24gTWFjIE9TIFggc2luY2UgMTAuNCAiVGlnZXIiLgorZGJ1cyB1c2VzIHRoaXMgc2VydmljZSB0byBwcm92aWRlIGEgY29tbW9uIHNlc3Npb24gYnVzIGFkZHJlc3MgZm9yIGVhY2ggdXNlcgorYW5kIHNvIGRlcHJlY2F0ZXMgdGhlIFgxMSBlbmFibGVkIGRidXMtbGF1bmNoZXIuCisKK1sxXSBodHRwOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9NYWNPc1gvbGF1bmNoZC5odG1sCitbMl0gaHR0cDovL2xhdW5jaGQubWFjb3Nmb3JnZS5vcmcvCisKKworU2V0dXAKKz09PQorCitDb25maWd1cmUgd2l0aCAtLWVuYWJsZS1sYXVuY2hkIGFuZCAtLXdpdGhvdXQteCAoWDExIHNob3VsZCBub3QgaGFybSBidXQgaXQncworc2ltcGx5IG5vdCBuZWNlc3NhcnkgYW55IG1vcmUpCitBZnRlciBpbnN0YWxsYXRpb24sIHRvIHByZXZlbnQgYSByZWJvb3QsIGxvYWQgdGhlIGRidXMgc2Vzc2lvbiBzdGFydGVyIGludG8KK2xhdW5jaGQgYnkgZXhlY3V0aW5nOgorJCBsYXVuY2hjdGwgbG9hZCAvTGlicmFyeS9MYXVuY2hBZ2VudHMvb3JnLmZyZWVkZXNrdG9wLmRidXMtc2Vzc2lvbi5wbGlzdAorCitZb3UgY2FuIGNoYW5nZSB0aGUgbGF1bmNoIGFnZW50IGRpciB2aWEgY29uZmlndXJlLCBidXQgaXQncyBub3QgcmVjb21tZW5kZWQuCitNYWtlIHN1cmUgdG8gZXhlY3V0ZSB0aGUgYWJvdmUgbGluZSBhcyB0aGUgYWN0dWFsIHVzZXIgZm9yIHdoaWNoIHlvdSB3YW50IHRvCit1c2UgYSBzZXNzaW9uIGJ1cyBzaW5jZSBsYXVuY2hkIG1hbmFnZXMgaXRzIGFnZW50cyBvbiBhIHBlciB1c2VyIGJhc2lzLgorCisKK0hvdyBpdCB3b3JrcworPT09CisKK0xhdW5jaGQgYWxsb2NhdGVzIGEgc29ja2V0IGFuZCBwcm92aWRlcyB0aGUgdW5peCBwYXRoIHRvIGl0IHZpYSB0aGUgdmFyaWFibGUKK0RCVVNfTEFVTkNIRF9TRVNTSU9OX0JVU19TT0NLRVQgaW4gbGF1bmNoZCdzIGVudmlyb25tZW50LiBFdmVyeSBwcm9jZXNzCitzcGF3bmVkIGJ5IGxhdW5jaGQgKG9yIGRidXMtZGFlbW9uLCBpZiBzdGFyZWQgYnkgbGF1bmNoZCkgY2FuIGFjY2VzcyBpdCB0aHJvdWdoCitpdHMgb3duIGVudmlyb25tZW50LiBPdGhlciBwcm9jZXNzZXMgY2FuIHF1ZXJ5IGxhdW5jaGQgZm9yIGl0IGJ5IGV4ZWN1dGluZzoKKyQgbGF1bmNoY3RsIGdldGVudiBEQlVTX0xBVU5DSERfU0VTU0lPTl9CVVNfU09DS0VUCitIb3dldmVyLCB0aGlzIGlzIG5vcm1hbGx5IGRvbmUgYnkgdGhlIGRidXMgY2xpZW50IGxpYiBmb3IgeW91LgorCitJZiBsYXVuY2hkIHN0YXJ0IGRidXMtZGFlbW9uIHdpdGggYSBjb25maWcgZmlsZSBjb250YWluaW5nIGEgImxhdW5jaGQ6ZW52PUZPTyIKK2FkZHJlc3MsIGFzIHRoZSBkZWZhdWx0IHNlc3Npb24gY29uZmlnIGRvZXMgd2l0aCBlbnY9REJVU19MQVVOQ0hEX1NFU1NJT05fQlVTX1NPQ0tFVCwKK3RoZSBkYWVtb24gd2lsbCBnZXQgdGhlIGZpbGUgZGVzY3JpcHRvciBmcm9tIGxhdW5jaGQgYW5kIHN0YXJ0IGxpc3RlbmluZyBvbiBpdC4KK1RoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyB1c2VkIHRvIGdldCB0aGUgYWN0dWFsIHNvY2tldCBwYXRoIHdoaWNoIGlzIHBhc3NlZAordG8gZXZlcnkgc2VydmljZSBzcGF3bmVkIGJ5IGRidXMtZGFlbW9uIGFzIGEgcmVzdWx0IGZyb20gYXV0b2xhdW5jaCBtZXNzYWdlcy4KK1BsZWFzZSBub3RlIHRoYXQgaXQncyBub3QgcG9zc2libGUgdG8gc3RhcnQgZGJ1cy1kYWVtb24gbWFudWFsbHkgd2hlbiB1c2luZyBhCisibGF1bmNoZDoiIGFkZHJlc3MuIE9ubHkgY2hpbGQgcHJvY2Vzc2VzIG9mIGxhdW5jaGQgY2FuIGFjY2VzcyB0aGUgYWJvdmUKK21lbnRpb25lZCBmaWxlIGRlc2NyaXB0b3IhCisKK1RvIGNyZWF0ZSBjdXN0b20gYnVzZXMganVzdCBzZXQgdXAgYW4gb3RoZXIgbGF1bmNoIGFnZW50LiBBcyBhIHF1aWNrIHN0YXJ0IGNvcHkKKy9MaWJyYXJ5L0xhdW5jaEFnZW50cy9vcmcuZnJlZWRlc2t0b3AuZGJ1cy1zZXNzaW9uLnBsaXN0LCBjaGFuZ2UgdGhlIGxhYmVsCit0byBpLmUuICJvcmcuZnJlZWRlc2t0b3AuZGJ1cy1mb28iIGFuZCBjaGFuZ2UgdGhlIFNlY3VyZVNvY2tldFdpdGhLZXkgdmFsdWUsCitpLmUuIHRvICJEQlVTX0xBVU5DSERfRk9PX0JVU19TT0NLRVQiLiBUaGlzIGVudmlyb25tZW50IHZhcmlhYmxlIGhhcyB0byBiZSBzZXQKK2luIHRoZSBjb25maWcgZmlsZSBmb3IgeW91ciBuZXcgYnVzIGluIHRoZSA8bGlzdGVuPiBlbGVtZW50IChzZWUgc2Vzc2lvbi5jb25maWcpLgorVGhlbiBlZGl0IHlvdXIgL0xpYnJhcnkvTGF1bmNoQWdlbnRzL29yZy5mcmVlZGVza3RvcC5kYnVzLWZvby5wbGlzdCB0byBzdGFydAorZGJ1cy1kYWVtb24gd2l0aCAiLS1jb25maWctZmlsZT0vb3B0L2xvY2FsL2V0Yy9kYnVzLTEvZm9vLmNvbmYiIGluc3RlYWQgb2YKKyItLXNlc3Npb24iLiBOb3cgbG9hZCB0aGUgbmV3IHBsaXN0IG9udG8gbGF1bmNoZCBhcyBkZXNjcmliZWQgaW4gdGhlIHNldHVwCitzZWN0aW9uIG9mIHRoaXMgZG9jdW1lbnQuCitFeGVjdXRpbmcgImxhdW5jaGN0bCBleHBvcnQiIHNob3VsZCBub3cgZ2l2ZSB5b3UgdHdvIHNvY2tldHMsIG9uZSBpbgorREJVU19MQVVOQ0hEX1NFU1NJT05fQlVTX1NPQ0tFVCBhbmQgdGhlIG5ldyBEQlVTX0xBVU5DSERfRk9PX0JVU19TT0NLRVQuCitUbyBjb25uZWN0IHRvIHRoaXMgbmV3IGJ1cyB1c2UgImxhdW5jaGQ6ZW52PURCVVNfTEFVTkNIRF9GT09fQlVTX1NPQ0tFVCIuCisKK1NpbmNlIE1hYyBPUyBYIDEwLjUgIkxlb3BhcmQiIHlvdSBjYW4gYWxzbyBjb25maWd1cmUgbGF1bmNoZCB0byBzdGFydAorZGJ1cy1kYWVtb24gb24gZGVtYW5kIGFzIHNvb24gYXMgc29tZSBwcm9jZXNzIGNvbm5lY3RzIHRvIHRoZSBzb2NrZXQuIFNpbmNlCitpdCdzIGJyb2tlbiBvbiAxMC40IHRoaXMgZmVhdHVyZSBpcyBkaXNhYmxlZCBwZXIgZGVmYXVsdC4gTG9vayBhdAorL0xpYnJhcnkvTGF1bmNoQWdlbnRzL29yZy5mcmVlZGVza3RvcC5kYnVzLXNlc3Npb24ucGxpc3QgdG8gY2hhbmdlIGl0LgorCitPbiB0aGUgY2xpZW50IHNpZGUsIHRoZSBlbnZ2YXIgREJVU19TRVNTSU9OX0JVU19BRERSRVNTIGNhbiBiZSBub3JtYWxseSB1c2VkCitidXQgaWYgaXQncyBub3Qgc2V0LCBsYXVuY2hkIGlzIHF1ZXJpZWQgZm9yIHRoZSBzZXNzaW9uIGJ1cyBzb2NrZXQuCmRpZmYgLS1naXQgYS9SRUFETUUudmFsZ3JpbmQgYi9SRUFETUUudmFsZ3JpbmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzEzZjUzMAotLS0gL2Rldi9udWxsCisrKyBiL1JFQURNRS52YWxncmluZApAQCAtMCwwICsxLDI0IEBACitSdW5uaW5nIEQtQnVzIGNsaWVudHMgd2l0aCBWYWxncmluZAorPT09PQorCitXaGVuIHJ1bm5pbmcgcHJvZ3JhbXMgdXNpbmcgbGliZGJ1cyBpbiBWYWxncmluZCwgc29tZSBzcGVjaWFsIGNhcmUgbmVlZHMgdG8gYmUKK3Rha2VuIHNvIGFzIHRvIGF2b2lkIGluY29ycmVjdCBkZXRlY3Rpb24gb2YgbGVha3MgaW4gbGliZGJ1cy4gVG8gYXZvaWQgdGhlc2UKK2ZhbHNlIHBvc2l0aXZlcywgZG8gdGhlIGZvbGxvd2luZzoKKworKiBHcmFiIGEgY29weSBvZiB0aGUgRC1CdXMgc291cmNlIGNvZGUKKworKiBSdW4gY29uZmlndXJlIHdpdGggdGhlIC0tZW5hYmxlLWRldmVsb3BlciBhbmQgLS13aXRoLXZhbGdyaW5kIG9wdGlvbnMKKworKiBSdW4gbWFrZQorCisqIEVpdGhlciBtYWtlIHN1cmUgeW91ciBjb2RlIGNhbGxzIGRidXNfc2h1dGRvd24oKSAoYXQgbGVhc3Qgd2hpbGUgcnVubmluZyBpbgorICBWYWxncmluZCkgb3Igc2V0IERCVVNfTUVTU0FHRV9DQUNIRT0wIGluIHlvdXIgZW52aXJvbm1lbnQKKworKiBSdW4gVmFsZ3JpbmQgb24geW91ciBwcm9ncmFtIHdpdGggdGhlIC9wYXRoL3RvL2RidXMvc291cmNlL2RidXMvLmxpYnMgaW4geW91cgorICBMRF9MSUJSQVJZX1BBVEgKKworWW91ciBWYWxncmluZCBsb2cgc2hvdWxkIG5vdyBiZSBmcmVlIG9mIGFueSAoc3B1cmlvdXMpIGxpYmRidXMtcmVsYXRlZCBsZWFrcy4KKworRm9yIHRoZSBjdXJpb3VzLCB0aGUgREJVU19NRVNTQUdFX0NBQ0hFPTAgaXMgcmVxdWlyZWQgYmVjYXVzZSBieQorZGVmYXVsdCwgbGliZGJ1cyB1c2VzIGEgcmVjeWNsYWJsZSBwb29sIG9mIG1lc3NhZ2Ugc3RydWN0cy4gVGhlc2UgaGVscAorcGVyZm9ybWFuY2UgYSBiaXQuCmRpZmYgLS1naXQgYS9SRUFETUUud2luIGIvUkVBRE1FLndpbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTViM2MwCi0tLSAvZGV2L251bGwKKysrIGIvUkVBRE1FLndpbgpAQCAtMCwwICsxLDExNCBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1dpbmRvd3MgcG9ydCBvZiB0aGUgZnJlZWRlc2t0b3Aub3JnIEQtQnVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitGZWF0dXJlcyBhbmQgY29tcGxldGVuZXNzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUaGUgd2luZG93cyBwb3J0IG9mIGRidXMgcHJvdmlkZXMgdGhlIGRidXMtMSBsaWJyYXJ5IGFuZCBtb3N0bHkKK2FwcGxpY2F0aW9ucyB3aGljaCBhcmUgYWxyZWFkeSBhdmFpbGFibGUgb24gdW5peC4gVGhlc2UgYXBwbGljYXRpb25zCithcmU6IGRidXMtZGFlbW9uLCBkYnVzLWxhdW5jaCwgZGJ1cy1tb25pdG9yIGFuZCBkYnVzLXNlbmQuCitEQnVzIGNvbWVzIHdpdGggYSB0ZXN0IHN1aXRlIHdoaWNoIGlzIHVzZWQgb24gdW5peCB0byBndWFyYW50YXRlCitwcm9kdWN0aW9uIHF1YWxpdHkgYW5kIHRoaXMgdGVzdCBzdWl0ZSBydW5zIG1vc3RseS4gVGhlcmUgYXJlIHNvbWUKK3Rlc3Qgbm90IHJ1bm5pbmcgeWV0IGFuZCB0aGVyZSBpcyBoZWxwIG5lZWRlZCB0byBnZXQgdGhlbSBydW5uaW5nLgorCitTdXBwb3J0ZWQgY29tcGlsZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tCitPbiB3aW5kb3dzIE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIDIwMTAgKEV4cHJlc3MgYW5kIHByb2Zlc3Npb25hbCB2YXJpYW50cykKK2FuZCBtaW5ndy13NjR8MzIgYXJlIGtub3duIHRvIHdvcmsuCisKK0J1aWxkaW5nCistLS0tLS0tLQorREJ1cyBjYW4gYmUgYnVpbHQgb24gd2luZG93cyB1c2luZyBhdXRvbWFrZSBvciBjbWFrZS4gU2VlIHRoZQorZmlsZSBJTlNUQUxMIGZvciBtb3JlIGluZm9ybWF0aW9uLgorCit3aW5kYnVzIGFuZCBkYnVzNHdpbiBQb3J0cworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1RoZSBXaW5kb3dzIHBvcnRzIGZyb20gdGhlIHdpbmRidXMgYW5kIGRidXM0d2luIHByb2plY3RzIGhhcyBiZWVuIG1lcmdlZAoraW50byB0aGUgZnJlZWRlc2t0b3AgZ2l0IG1hc3RlciBicmFuY2gsIGFzIGFwcGxpY2FibGUuIFRoZSBzcGVjIGhhcyBiZWVuCit1cGRhdGVkIHdpdGggd2luZG93cyBzcGVjaWZpYyBzdHVmZi4KKworCitUZXN0cworLS0tLS0KKyAtIHJ1biBjb21wbGV0ZSB0ZXN0IHN1aXRlCisgICAgIG1ha2UgY2hlY2sKKyAgIG9yCisgICAgIGN0ZXN0IFstVl0KKworIC0gZGJ1cyBsaWJyYXJ5IGNoZWNrCisgICAgY3Rlc3QgWy1WXSAtUiB0ZXN0LWRidXMKKworIC0gYnVzIGRhZW1vbiBjaGVjaworICAgIGN0ZXN0IFstVl0gLVIgdGVzdC1idXMKKworIC0gY2hlY2sgYXZhaWxhYmxlIG5hbWVzCisgICAgY3Rlc3QgWy1WXSAtUiB0ZXN0LW5hbWVzCisKKyAtIGNoZWNrIGlmIGRidXMtZGFlbW9uIGlzIGFjY2Vzc2FibGUKKyAgICBiaW5cZGJ1cy1zZW5kLmV4ZSAtLXNlc3Npb24gLS10eXBlPW1ldGhvZF9jYWxsIC0tcHJpbnQtcmVwbHkgLS1kZXN0PW9yZy5mcmVlZGVza3RvcC5EQnVzIC8gb3JnLmZyZWVkZXNrdG9wLkRCdXMuTGlzdE5hbWVzIG1ldGhvZCByZXR1cm4gc2VuZGVyPW9yZy5mcmVlZGVza3RvcC5EQnVzIC0+IGRlc3Q9OjEuNCBhcnJheSBbIHN0cmluZyAib3JnLmZyZWVkZXNrdG9wLkRCdXMic3RyaW5nICI6MS40Il0KKworIC0gc3RhcnQgc2Vzc2lvbiBkYnVzLWRhZW1vbgorICAgIGVpdGhlciBieSBydW5uaW5nCisgICAgICAgIGJpblxkYnVzLWxhdW5jaAorICAgIG9yCisgICAgICAgIHN0YXJ0IGJpblxkYnVzLWRhZW1vbiAtLXNlc3Npb24KKworICAgIEJlZm9yZSBydW5uaW5nIHRoZXNlIGNvbW1hbmRzIHlvdSBtYXkgZXhlY3V0ZQorICAgICAgICBzZXQgREJVU19WRVJCT1NFPTEKKyAgICBmb3IgZ2V0dGluZyBkZWJ1ZyBpbmZvcworCisKKyAtIGNhbGwgZnVuY3Rpb24gcmVnaXN0ZXJkIGluIGRidXMKKyAgICBiaW5cZGJ1cy1zZW5kLmV4ZSAgLS1kZXN0PW9yZy5mcmVlZGVza3RvcC5EQnVzIC0tcHJpbnQtcmVwbHkgLS10eXBlPW1ldGhvZF9jYWxsIC8gb3JnLmZyZWVkZXNrdG9wLkRCdXMuU3RhcnRTZXJ2aWNlQnlOYW1lIHN0cmluZzpvcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVFY2hvU2VydmljZSAgdWludDMyOjQ1NSBtZXRob2QgcmV0dXJuIHNlbmRlcj1vcmcuZnJlZWRlc2t0b3AuREJ1cyAtPiBkZXN0PToxLjggdWludDMyIDIKKworICAgIG5vdGU6IFdoZW4gYnVpbGRpbmcgd2l0aCB0aGUgVmlzdWFsIEMrKyBJREUgdGhlICouZXhlIGZpbGVzIGFyZSBpbgorICAgICAgICAgIHRoZSBiaW4vRGVidWcgYW5kIGJpbi9SZWxlYXNlIGZvbGRlciwgbm90IGluIHRoZSBiaW4gZm9sZGVyLgorCisKK0ZBUQorLS0tCisKKy0gSG93IGZhciBpcyBXaW5EQnVzIGZyb20gYmVpbmcgdXNhYmxlIGZvciBwcm9kdWN0aW9uID8KKworICBkYnVzIGNvbWVzIHdpdGggYSB0ZXN0IHN1aXRlIHdoaWNoIGlzIHVzZWQgb24gdW5peCB0byBndWFyYW50YXRlCisgIHByb2R1Y3Rpb24gcXVhbGl0eSBhbmQgdGhpcyB0ZXN0IHN1aXRlIHJ1bnMgbW9zdGx5LiBUaGVyZSBhcmUgc29tZQorICB0ZXN0IG5vdCBydW5uaW5nIGFuZCB3ZSBuZWVkIGhlbHAgdG8gZ2V0IHRoZW0gcnVubmluZy4KKyAgSW4gdGhlIHByYXRpY2UgSSBhbmQgc29tZSBvdGhlciBwZW9wbGUgYXJlIHVzaW5nIGRidXMgZm9yIGF0IGxlYXN0IG1vcmUKKyAgdGhhbiBmb3VyIHllYXJzIGluIGNvbmp1bmN0aW9uIHdpdGgga2RlIG9uIHdpbmRvd3Mgd2l0aG91dCBhbnkgcHJvYmxlbXMuCisKKy0gT24gVU5JWCBELUJ1cyB1c2VzIFVOSVggc29ja2V0cyB0byBjb21tdW5pY2F0ZSAoY29ycmVjdCBtZSBpZiBJJ20gd3JvbmcpLgorICBXaGF0IGlzIHVzZWQgb24gV2luZG93cyA/CisKKyAgdGNwIHNvY2tldHMsIHRoZXJlIGFyZSBzb21lIGVmZm9ydHMgdG8gZ2V0IG5hbWVkIHBpcGUgcnVubmluZywgYnV0IHNvbWUKKyAgZGVzaWduIHByb2JsZW1zIG9mIHRoZSB3aW4zMiBhcGksIHdlIGFyZSBub3QgYWJsZSB0byBzb2x2ZSB3aXRob3V0CisgIGJpZ2dlciBjaGFuZ2VzIHRvIHRoZSBkYnVzIGNvZGUgYmFzZSBsZXQgdXMgc3RvcCB0aGlzIGVmZm9ydC4KKworLSBEbyB5b3UgaGF2ZSBhbnkgY2x1ZSBpZiBkYnVzLXdpbjMyIGNhbiBydW4gaW4gYSBXaW5kb3dzIENFIGVudmlyb25tZW50PworCisgIGRidXMgaGFzIGJlZW4gcG9ydGVkIHRvIHdpbmNlLCBzZWUgUkVBRE1FLndpbmNlIGZvciBtb3JlIGluZm9ybWF0aW9uCisKKy0gRG8geW91IGtub3cgaWYgdGhlIEMrKyBiaW5kaW5nIG1hZGUgYnkgT3BlbldlbmdvIHdpbGwgYmUgZWFzaWx5IHBvcnRhYmxlIHRvIFdpbmRvd3M/CisKKyAgVGhlIE9wZW5XZW5nbyBkYnVzLWMrKyBiaW5kaW5nIGhhcyBiZWVuIHBvcnRlZCB0byB3aW5kb3dzIHNlZSBpbiBXaW5EQnVzIHN2bgorICAoaHR0cDovL3NmLm5ldC9wcm9qZWN0cy93aW5kYnVzKQorICBUaGUgcmVsYXRlZCB0ZXN0IGFwcGxpY2F0aW9ucyBhcmUgcnVubmluZyB3ZWxsLgorCisKK1RPRE8KKy0tLS0KKworT2N0b2JlciAyMDEwOgorCistIHRoZSBjb2RlIHdyYXBwZWQgd2l0aCBEQlVTX1dJTl9GSVhNRSBzaG91bGQgYmUgaW5zcGVjdGVkIGlmIGl0IHJlcXVpcmVkIGZvciB3aW5kb3dzCisKKy0gY3JlYXRlIGEgZGJ1cyBzZXR1cCBpbnN0YWxsZXIKKworLSBpbXBsZW1lbnQgc3lzdGVtIGJ1cyBhbmQgc3lzdGVtIGJ1cyBzZXJ2aWNlIHN0YXJ0ZXIKKyAgc2VlIGh0dHA6Ly93aW5kYnVzLnN2bi5zb3VyY2Vmb3JnZS5uZXQvdmlld3ZjL3dpbmRidXMvdHJ1bmsvYnVzL2J1cy1zZXJ2aWNlLXdpbi5jCisgIGZvciBhIHN0YXJ0aW5nIHBvaW50CisKKy0gaW1wbGVtZW50IGEgcmVhbCBsb2dpbiBzZXNzaW9uIGJ1cworICBUaGUgc2NvcGUgcGFyYW1ldGVyIG9mIHRoZSBhdXRvbGF1bmNoIG1ldGEgcHJvdG9jb2wgY291bGQgYmUgZXh0ZW5kZWQgdG8gc3VwcG9ydCB1c2VyCisgIHNwZWNpZmljIHNlc3Npb24gYnVzc2VzIChsaWtlIGFscmVhZHkgZG9uZSB3aXRoIHRoZSBhbWFyb2sgYnVuZGxlZCBkYnVzIHdoaWNoIHVzZSBhCisgIHNoYXJlZCBtZW1vcnkgYXJlYSBuYW1lZCAiREJ1c0RhZW1vbkFkZHJlc3NJbmZvOjx1c2VybmFtZT4iLgorICBBbHNvIHRoZSBkYnVzIGluc3RhbGxlciBzaG91bGQgc3RhcnQgYSBzZXNzaW9uIGJ1cyBvbiB1c2VyIGxvZ2luLgpkaWZmIC0tZ2l0IGEvUkVBRE1FLndpbmNlIGIvUkVBRE1FLndpbmNlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3OTBkY2YKLS0tIC9kZXYvbnVsbAorKysgYi9SRUFETUUud2luY2UKQEAgLTAsMCArMSw4MSBAQAorREJ1cyBEYWVtb24gZm9yIFdpbmRvd3MgQ0UvV2luZG93cyBNb2JpbGUgNi41Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworQnVncyBpbiB1cHN0cmVhbSBmb3IgYW55IHdpbmRvdyB2ZXJzaW9uOgorKiBNb3ZlRmlsZUV4QSA8IDAgcmVzdWx0IGNoZWNrIGJ1ZworKiBkb3VibGUgZGJ1c19mcmVlIHNvbWV3aGVyZSBJIGZvcmdvdCB3aGVyZSAoY2hlY2sgaW4gLXVnbHkpCisqIGFsaWdubWVudCBpc3N1ZQorKiBDcmVhdGVQcm9jZXNzIHByb2Nlc3MgaW5mb3JtYXRpb24gaGFuZGxlIGxlYWsKKyogX2RidXNfZ2V0c2lkIE5VTEwgdnMgSU5WQUxJRF9IQU5ETEVfVkFMVUUKKyogd2luX2FjY291bnRfdG9fc2lkCisKK0N1c3RvbWlzYXRpb24KKz09PT09PT09PT09PT0KKworMSkgQXQgaW5zdGFsbGF0aW9uLCB0aGUgZm9sbG93aW5nIHJlZ2lzdHJ5IHZhbHVlIHNob3VsZCBiZSBzZXQgdG8gdGhlCitpbnN0YWxsYXRpb24gZGlyZWN0b3J5IG9mIHRoZSBkYnVzIGluc3RhbGxhdGlvbiAodGhlIGRpcmVjdG9yeQorY29udGFpbmluZyB0aGUgYmluLCBldGMsIHNoYXJlIGZvbGRlcnMpOgorCitIS0xNXFNvZnR3YXJlXGZyZWVkZXNrdG9wXERCdXNcSW5zdGFsbCBEaXJlY3RvcnkKKworMikgSW5zdGVhZCBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZSBEQlVTX1ZFUkJPU0UsIHVzZQorSEtMTVxTb2Z0d2FyZVxmcmVlZGVza3RvcFxEQnVzXFZlcmJvc2UKKworMikgVGhlIGtleXJpbmcgZGlyZWN0b3J5IGlzIE1ZRE9DVU1FTlRTXGRidXMta2V5cmluZ3MsIG5vdAorSE9NRVBBVEhcLmRidXMta2V5cmluZ3MuCisKKworQ29tcGlsYXRpb24KKz09PT09PT09PT09CisKKy4vY29uZmlndXJlIC0taG9zdD1hcm0tbWluZ3czMmNlIENQUEZMQUdTPS1JL3BhdGgvdG8vZXhwYXQvaW5jbHVkZSBMREZMQUdTPS1ML3BhdGgvdG8vZXhwYXQvbGliCisKK0EgcmVjZW50IHZlcnNpb24gb2YgbGlidG9vbCBpcyByZXF1aXJlZCwgd2l0aCB0aGlzIGNoYW5nZToKKworMjAxMC0wMi0yOCAgUGllcnJlIE9zc21hbiAgPG9zc21hbkBvc3NtYW4ubGtwZy5jZW5kaW8uc2U+ICAodGlueSBjaGFuZ2UpCisgICAgICAgICAgICBSYWxmIFdpbGRlbmh1ZXMgPFJhbGYuV2lsZGVuaHVlc0BnbXguZGU+CisKKyAgICAgICBGaXggZGVwbGlicyBjaGVjayBmYWxsYmFjayBmb3IgNjQtYml0IFdpbmRvd3MgYW5kIFdpbmRvd3MgQ0UuCisgICAgICAgKiBsaWJsdGRsL200L2xpYnRvb2wubTQgKF9MVF9DSEVDS19NQUdJQ19NRVRIT0QpOiBBY2NlcHQgZmlsZSBmb3JtYXRzCisgICAgICAgJ3BlLWFybS13aW5jZScgYW5kICdwZS14ODYtNjQnLiAgQWRkIG5vdGUgYWJvdXQgY29uc2lzdGVuY3kgd2l0aCAuLi4KKyAgICAgICAqIGxpYmx0ZGwvY29uZmlnL2x0bWFpbi5tNHNoIChmdW5jX3dpbjMyX2xpYmlkKTogLi4uIHRoZSByZXNwZWN0aXZlCisgICAgICAgcGF0dGVybiBoZXJlOyBzeW5jIHBhdHRlcm4gZnJvbSB0aGUgZm9ybWVyLgorICAgICAgICogdGVzdHMvZGVwbGlicy1taW5ndy5hdCAoZGVwbGlicyB3aXRob3V0IGZpbGUgY29tbWFuZCk6IE5ldworICAgICAgIGZpbGUsIG5ldyB0ZXN0LgorICAgICAgICogTWFrZWZpbGUuYW0gKFRFU1RTVUlURV9BVCk6IFVwZGF0ZS4KKyAgICAgICAqIE5FV1M6IFVwZGF0ZS4KKworCitNQiB2cyBXQ0hBUgorPT09PT09PT09PT0KKworV2luZG93cyBDRSBvbmx5IHN1cHBvcnRzIHRoZSBVbmljb2RlIGludGVyZmFjZSwgd2hpbGUgREJ1cyBEYWVtb24gdXNlcwordGhlIE11bHRpLUJ5dGUgaW50ZXJmYWNlIG9uIFdpbmRvd3MgYnkgZGVmYXVsdC4gIFRoZSBnbHVlIGNvZGUgZG9lcworbm90IHN1cHBvcnQgbXVsdGlieXRlIGluIGFsbCBjYXNlcy4gIEluIHBhcnRpY3VsYXIsIHRoZSBfbWJzcmNocgorZnVuY3Rpb24gaXMgbm90IGNvcnJlY3RseSBpbXBsZW1lbnRlZC4gIEl0IGNvdWxkIGJlIGNvcnJlY3RseQoraW1wbGVtZW50ZWQsIG9yIGRidXMgZGFlbW9uIGNvdWxkIHVzZSB0aGUgd2NoYXIgaW50ZXJmYWNlIG1vcmUKK2NvbnNpc3RlbnRseSBvbiBhbGwgV2luZG93cyB0YXJnZXRzLiAgRm9yIG5vdywgdGhlIFdpbmRvd3MgQ0UgcG9ydAord2lsbCBvbmx5IHdvcmsgZm9yIGZpbGVzeXN0ZW1zIHdpdGhvdXQgc29tZSB3ZWlyZCBjaGFyYWN0ZXJzIGluIGZpbGUKK25hbWVzLiAgSXMgdGhpcyBhIHNlcmlvdXMgbGltaXRhdGlvbj8KKworCitLbm93biBJc3N1ZXMKKz09PT09PT09PT09PQorCitBdXRvbGF1bmNoIGlzIGJyb2tlbiBzbyBmYXIuCisKK0Vudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgZmFrZWQuICBTb21lIGFyZSBwdW50ZWQgdG8gdGhlIHJlZ2lzdHJ5LCBidXQKK2luIGFueSBjYXNlIHRoZXkgY2FuIG5vdCBiZSB1c2VkIHJlbGlhYmx5IGZvciBJUEMuCisKK1RoZSB0ZXN0IHN1aXRlIGlzIG5vdCBwb3J0ZWQgeWV0LgorCitkYnVzLXBpcGUuYzoKKyAqIFVzZXMgbGliYyBmaWxlIGRlc2NyaXB0b3JzLiAgTmVlZGVkIGZvciAtLXByaW50LWFkZHJlc3MgYW5kCisgICAtLXByaW50LXBpZCB3aGljaCBwcm9iYWJseSBkb24ndCB3b3JrIHlldC4KKworZGJ1cy1zeXNkZXBzLXdpbi5jOgorICogQmFja3RyYWNlcyBoYXZlIGJlZW4gZGlzYWJsZWQuCisgKiBfZGJ1c19mZF9zZXRfY2xvc2Vfb25fZXhlYyBOb3Qgc3VwcG9ydGVkLCBtYXliZSB3ZSBzaG91bGQgZGlzYWJsZQorICAgdGhlIHdhcm5pbmcuCisgKiBTZWFyY2hQYXRoQTogVXNlcyBIS0xNXFxTb2Z0d2FyZVxcZnJlZWRlc2t0b3BcXERCdXNcXEluc3RhbGwgRGlyZWN0b3J5CisgICB0byBsb2NhdGUgYmluYXJpZXMuCmRpZmYgLS1naXQgYS9hdXRvZ2VuLnNoIGIvYXV0b2dlbi5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42ZGU3MzVmCi0tLSAvZGV2L251bGwKKysrIGIvYXV0b2dlbi5zaApAQCAtMCwwICsxLDEwOCBAQAorIyEvYmluL3NoCisjIFJ1biB0aGlzIHRvIGdlbmVyYXRlIGFsbCB0aGUgaW5pdGlhbCBtYWtlZmlsZXMsIGV0Yy4KKworc3JjZGlyPWBkaXJuYW1lICQwYAordGVzdCAteiAiJHNyY2RpciIgJiYgc3JjZGlyPS4KKworT1JJR0RJUj1gcHdkYAorY2QgJHNyY2RpcgorCitQUk9KRUNUPWRidXMKK1RFU1RfVFlQRT0tZgorRklMRT1kYnVzLTEucGMuaW4KKworRElFPTAKKworaWYgWyAtZiAuZ2l0L2hvb2tzL3ByZS1jb21taXQuc2FtcGxlIC1hICEgLWYgLmdpdC9ob29rcy9wcmUtY29tbWl0IF0gOyB0aGVuCisgICAgZWNobyAiQWN0aXZhdGluZyBwcmUtY29tbWl0IGhvb2suIgorICAgIGNwIC5naXQvaG9va3MvcHJlLWNvbW1pdC5zYW1wbGUgLmdpdC9ob29rcy9wcmUtY29tbWl0CisgICAgY2htb2QgK3ggLmdpdC9ob29rcy9wcmUtY29tbWl0CitmaQorCisoYXV0b2NvbmYgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxIHx8IHsKKwllY2hvCisJZWNobyAiWW91IG11c3QgaGF2ZSBhdXRvY29uZiBpbnN0YWxsZWQgdG8gY29tcGlsZSAkUFJPSkVDVC4iCisJZWNobyAiRG93bmxvYWQgdGhlIGFwcHJvcHJpYXRlIHBhY2thZ2UgZm9yIHlvdXIgZGlzdHJpYnV0aW9uLCIKKwllY2hvICJvciBnZXQgdGhlIHNvdXJjZSB0YXJiYWxsIGF0IGZ0cDovL2Z0cC5nbnUub3JnL3B1Yi9nbnUvIgorCURJRT0xCit9CisKKyMgSWYgdGhlIHVzZXIgaGFzbid0IGV4cGxpY2l0bHkgY2hvc2VuIGFuIEF1dG9tYWtlIHZlcnNpb24sIHVzZSAxLjExLiBUaGlzIGlzCisjIHRoZSBlYXJsaWVzdCB2ZXJzaW9uIHRoYXQgZ2l2ZXMgdXMgc2lsZW50IHJ1bGVzLgoraWYgdGVzdCAteiAiJEFVVE9NQUtFIjsgdGhlbgorICAgIEFVVE9NQUtFPWF1dG9tYWtlLTEuMTEKKyAgICBBQ0xPQ0FMPWFjbG9jYWwtMS4xMQorZmkKKworKCRBVVRPTUFLRSAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjEgfHwgeworICAgICAgICBBVVRPTUFLRT1hdXRvbWFrZQorICAgICAgICBBQ0xPQ0FMPWFjbG9jYWwKK30KKworKCRBVVRPTUFLRSAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjEgfHwgeworCWVjaG8KKwllY2hvICJZb3UgbXVzdCBoYXZlIGF1dG9tYWtlIGluc3RhbGxlZCB0byBjb21waWxlICRQUk9KRUNULiIKKwllY2hvICJHZXQgZnRwOi8vZnRwLmN5Z251cy5jb20vcHViL2hvbWUvdHJvbWV5L2F1dG9tYWtlLTEuMmQudGFyLmd6IgorCWVjaG8gIihvciBhIG5ld2VyIHZlcnNpb24gaWYgaXQgaXMgYXZhaWxhYmxlKSIKKwlESUU9MQorfQorCitMSUJUT09MSVpFPWB3aGljaCBsaWJ0b29saXplYAoraWYgISB0ZXN0IC1mICIkTElCVE9PTElaRSI7IHRoZW4KKwlMSUJUT09MSVpFPWB3aGljaCBnbGlidG9vbGl6ZWAKK2ZpCisKKygkTElCVE9PTElaRSAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjEgfHwgeworCWVjaG8KKwllY2hvICJZb3UgbXVzdCBoYXZlIGxpYnRvb2xpemUgaW5zdGFsbGVkIHRvIGNvbXBpbGUgJFBST0pFQ1QuIgorCWVjaG8gIkluc3RhbGwgdGhlIGxpYnRvb2wgcGFja2FnZSBmcm9tIGZ0cC5nbnUub3JnIG9yIGEgbWlycm9yLiIKKwlESUU9MQorfQorCitpZiB0ZXN0ICIkRElFIiAtZXEgMTsgdGhlbgorCWV4aXQgMQorZmkKKwordGVzdCAkVEVTVF9UWVBFICRGSUxFIHx8IHsKKwllY2hvICJZb3UgbXVzdCBydW4gdGhpcyBzY3JpcHQgaW4gdGhlIHRvcC1sZXZlbCAkUFJPSkVDVCBkaXJlY3RvcnkiCisJZXhpdCAxCit9CisKK2lmIHRlc3QgLXogIiQqIjsgdGhlbgorCWVjaG8gIkkgYW0gZ29pbmcgdG8gcnVuIC4vY29uZmlndXJlIHdpdGggbm8gYXJndW1lbnRzIC0gaWYgeW91IHdpc2ggIgorICAgICAgICBlY2hvICJ0byBwYXNzIGFueSB0byBpdCwgcGxlYXNlIHNwZWNpZnkgdGhlbSBvbiB0aGUgJDAgY29tbWFuZCBsaW5lLiIKK2ZpCisKKyRMSUJUT09MSVpFIC0tY29weSAtLWZvcmNlCisKKyRBQ0xPQ0FMIC1JIG00ICRBQ0xPQ0FMX0ZMQUdTCisKKyMjIG9wdGlvbmFsbHkgZmVhdHVyZSBhdXRvaGVhZGVyCisoYXV0b2hlYWRlciAtLXZlcnNpb24pICA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxICYmIGF1dG9oZWFkZXIKKworJEFVVE9NQUtFIC1hICRhbV9vcHQKK2lmICEgYXV0b2NvbmY7IHRoZW4KKyAgZWNobyAiYXV0b2NvbmYgZmFpbGVkIC0gdmVyc2lvbiAyLjV4IGlzIHByb2JhYmx5IHJlcXVpcmVkIiA+JjIKKyAgZXhpdCAxCitmaQorCitjZCAkT1JJR0RJUgorCitpZiB0ZXN0IHgiJE5PQ09ORklHVVJFIiA9IHg7IHRoZW4KKyAgcnVuX2NvbmZpZ3VyZT10cnVlCisgIGZvciBhcmcgaW4gJCo7IGRvCisgICAgY2FzZSAkYXJnIGluIAorICAgICAgICAtLW5vLWNvbmZpZ3VyZSkKKyAgICAgICAgICAgIHJ1bl9jb25maWd1cmU9ZmFsc2UKKyAgICAgICAgICAgIDs7CisgICAgICAgICopCisgICAgICAgICAgICA7OworICAgIGVzYWMKKyAgZG9uZQorZWxzZQorICBydW5fY29uZmlndXJlPWZhbHNlCitmaQorCitpZiAkcnVuX2NvbmZpZ3VyZTsgdGhlbgorICAgICRzcmNkaXIvY29uZmlndXJlIC0tZW5hYmxlLWRldmVsb3BlciAtLWNvbmZpZy1jYWNoZSAiJEAiCitmaQpkaWZmIC0tZ2l0IGEvYnVpbGQtYXV4L3RhcC1kcml2ZXIuc2ggYi9idWlsZC1hdXgvdGFwLWRyaXZlci5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40MjU0ZTJiCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQtYXV4L3RhcC1kcml2ZXIuc2gKQEAgLTAsMCArMSw2NTEgQEAKKyMhIC9iaW4vc2gKKyMgQ29weXJpZ2h0IChDKSAyMDExLTIwMTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyMgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisjIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKKyMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCisjIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCisjIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKworIyBUaGlzIGZpbGUgaXMgbWFpbnRhaW5lZCBpbiBBdXRvbWFrZSwgcGxlYXNlIHJlcG9ydAorIyBidWdzIHRvIDxidWctYXV0b21ha2VAZ251Lm9yZz4gb3Igc2VuZCBwYXRjaGVzIHRvCisjIDxhdXRvbWFrZS1wYXRjaGVzQGdudS5vcmc+LgorCitzY3JpcHR2ZXJzaW9uPTIwMTMtMTItMjMuMTc7ICMgVVRDCisKKyMgTWFrZSB1bmNvbmRpdGlvbmFsIGV4cGFuc2lvbiBvZiB1bmRlZmluZWQgdmFyaWFibGVzIGFuIGVycm9yLiAgVGhpcworIyBoZWxwcyBhIGxvdCBpbiBwcmV2ZW50aW5nIHR5cG8tcmVsYXRlZCBidWdzLgorc2V0IC11CisKK21lPXRhcC1kcml2ZXIuc2gKKworZmF0YWwgKCkKK3sKKyAgZWNobyAiJG1lOiBmYXRhbDogJCoiID4mMgorICBleGl0IDEKK30KKwordXNhZ2VfZXJyb3IgKCkKK3sKKyAgZWNobyAiJG1lOiAkKiIgPiYyCisgIHByaW50X3VzYWdlID4mMgorICBleGl0IDIKK30KKworcHJpbnRfdXNhZ2UgKCkKK3sKKyAgY2F0IDw8RU5ECitVc2FnZToKKyAgdGFwLWRyaXZlci5zaCAtLXRlc3QtbmFtZT1OQU1FIC0tbG9nLWZpbGU9UEFUSCAtLXRycy1maWxlPVBBVEgKKyAgICAgICAgICAgICAgICBbLS1leHBlY3QtZmFpbHVyZT17eWVzfG5vfV0gWy0tY29sb3ItdGVzdHM9e3llc3xub31dCisgICAgICAgICAgICAgICAgWy0tZW5hYmxlLWhhcmQtZXJyb3JzPXt5ZXN8bm99XSBbLS1pZ25vcmUtZXhpdF0KKyAgICAgICAgICAgICAgICBbLS1kaWFnbm9zdGljLXN0cmluZz1TVFJJTkddIFstLW1lcmdlfC0tbm8tbWVyZ2VdCisgICAgICAgICAgICAgICAgWy0tY29tbWVudHN8LS1uby1jb21tZW50c10gWy0tXSBURVNULUNPTU1BTkQKK1RoZSAnLS10ZXN0LW5hbWUnLCAnLWxvZy1maWxlJyBhbmQgJy0tdHJzLWZpbGUnIG9wdGlvbnMgYXJlIG1hbmRhdG9yeS4KK0VORAorfQorCisjIFRPRE86IGJldHRlciBlcnJvciBoYW5kbGluZyBpbiBvcHRpb24gcGFyc2luZyAoaW4gcGFydGljdWxhciwgZW5zdXJlCisjIFRPRE86ICRsb2dfZmlsZSwgJHRyc19maWxlIGFuZCAkdGVzdF9uYW1lIGFyZSBkZWZpbmVkKS4KK3Rlc3RfbmFtZT0gIyBVc2VkIGZvciByZXBvcnRpbmcuCitsb2dfZmlsZT0gICMgV2hlcmUgdG8gc2F2ZSB0aGUgcmVzdWx0IGFuZCBvdXRwdXQgb2YgdGhlIHRlc3Qgc2NyaXB0LgordHJzX2ZpbGU9ICAjIFdoZXJlIHRvIHNhdmUgdGhlIG1ldGFkYXRhIG9mIHRoZSB0ZXN0IHJ1bi4KK2V4cGVjdF9mYWlsdXJlPTAKK2NvbG9yX3Rlc3RzPTAKK21lcmdlPTAKK2lnbm9yZV9leGl0PTAKK2NvbW1lbnRzPTAKK2RpYWdfc3RyaW5nPScjJword2hpbGUgdGVzdCAkIyAtZ3QgMDsgZG8KKyAgY2FzZSAkMSBpbgorICAtLWhlbHApIHByaW50X3VzYWdlOyBleGl0ICQ/OzsKKyAgLS12ZXJzaW9uKSBlY2hvICIkbWUgJHNjcmlwdHZlcnNpb24iOyBleGl0ICQ/OzsKKyAgLS10ZXN0LW5hbWUpIHRlc3RfbmFtZT0kMjsgc2hpZnQ7OworICAtLWxvZy1maWxlKSBsb2dfZmlsZT0kMjsgc2hpZnQ7OworICAtLXRycy1maWxlKSB0cnNfZmlsZT0kMjsgc2hpZnQ7OworICAtLWNvbG9yLXRlc3RzKSBjb2xvcl90ZXN0cz0kMjsgc2hpZnQ7OworICAtLWV4cGVjdC1mYWlsdXJlKSBleHBlY3RfZmFpbHVyZT0kMjsgc2hpZnQ7OworICAtLWVuYWJsZS1oYXJkLWVycm9ycykgc2hpZnQ7OyAjIE5vLW9wLgorICAtLW1lcmdlKSBtZXJnZT0xOzsKKyAgLS1uby1tZXJnZSkgbWVyZ2U9MDs7CisgIC0taWdub3JlLWV4aXQpIGlnbm9yZV9leGl0PTE7OworICAtLWNvbW1lbnRzKSBjb21tZW50cz0xOzsKKyAgLS1uby1jb21tZW50cykgY29tbWVudHM9MDs7CisgIC0tZGlhZ25vc3RpYy1zdHJpbmcpIGRpYWdfc3RyaW5nPSQyOyBzaGlmdDs7CisgIC0tKSBzaGlmdDsgYnJlYWs7OworICAtKikgdXNhZ2VfZXJyb3IgImludmFsaWQgb3B0aW9uOiAnJDEnIjs7CisgIGVzYWMKKyAgc2hpZnQKK2RvbmUKKwordGVzdCAkIyAtZ3QgMCB8fCB1c2FnZV9lcnJvciAibWlzc2luZyB0ZXN0IGNvbW1hbmQiCisKK2Nhc2UgJGV4cGVjdF9mYWlsdXJlIGluCisgIHllcykgZXhwZWN0X2ZhaWx1cmU9MTs7CisgICAgKikgZXhwZWN0X2ZhaWx1cmU9MDs7Citlc2FjCisKK2lmIHRlc3QgJGNvbG9yX3Rlc3RzID0geWVzOyB0aGVuCisgIGluaXRfY29sb3JzPScKKyAgICBjb2xvcl9tYXBbInJlZCJdPSIbWzA7MzFtIiAjIFJlZC4KKyAgICBjb2xvcl9tYXBbImdybiJdPSIbWzA7MzJtIiAjIEdyZWVuLgorICAgIGNvbG9yX21hcFsibGduIl09IhtbMTszMm0iICMgTGlnaHQgZ3JlZW4uCisgICAgY29sb3JfbWFwWyJibHUiXT0iG1sxOzM0bSIgIyBCbHVlLgorICAgIGNvbG9yX21hcFsibWduIl09IhtbMDszNW0iICMgTWFnZW50YS4KKyAgICBjb2xvcl9tYXBbInN0ZCJdPSIbW20iICAgICAjIE5vIGNvbG9yLgorICAgIGNvbG9yX2Zvcl9yZXN1bHRbIkVSUk9SIl0gPSAibWduIgorICAgIGNvbG9yX2Zvcl9yZXN1bHRbIlBBU1MiXSAgPSAiZ3JuIgorICAgIGNvbG9yX2Zvcl9yZXN1bHRbIlhQQVNTIl0gPSAicmVkIgorICAgIGNvbG9yX2Zvcl9yZXN1bHRbIkZBSUwiXSAgPSAicmVkIgorICAgIGNvbG9yX2Zvcl9yZXN1bHRbIlhGQUlMIl0gPSAibGduIgorICAgIGNvbG9yX2Zvcl9yZXN1bHRbIlNLSVAiXSAgPSAiYmx1IicKK2Vsc2UKKyAgaW5pdF9jb2xvcnM9JycKK2ZpCisKKyMgOjsgaXMgdGhlcmUgdG8gd29yayBhcm91bmQgYSBidWcgaW4gYmFzaCAzLjIgKGFuZCBlYXJsaWVyKSB3aGljaAorIyBkb2VzIG5vdCBhbHdheXMgc2V0ICckPycgcHJvcGVybHkgb24gcmVkaXJlY3Rpb24gZmFpbHVyZS4KKyMgU2VlIHRoZSBBdXRvY29uZiBtYW51YWwgZm9yIG1vcmUgZGV0YWlscy4KKzo7eworICAoCisgICAgIyBJZ25vcmUgY29tbW9uIHNpZ25hbHMgKGluIHRoaXMgc3Vic2hlbGwgb25seSEpLCB0byBhdm9pZCBwb3RlbnRpYWwKKyAgICAjIHByb2JsZW1zIHdpdGggS29ybiBzaGVsbHMuICBTb21lIEtvcm4gc2hlbGxzIGFyZSBrbm93biB0byBwcm9wYWdhdGUKKyAgICAjIHRvIHRoZW1zZWx2ZXMgc2lnbmFscyB0aGF0IGhhdmUga2lsbGVkIGEgY2hpbGQgcHJvY2VzcyB0aGV5IHdlcmUKKyAgICAjIHdhaXRpbmcgZm9yOyB0aGlzIGlzIGRvbmUgYXQgbGVhc3QgZm9yIFNJR0lOVCAoYW5kIHVzdWFsbHkgb25seSBmb3IKKyAgICAjIGl0LCBpbiB0cnV0aCkuICBXaXRob3V0IHRoZSBgdHJhcCcgYmVsb3csIHN1Y2ggYSBiZWhhdmlvdXIgY291bGQKKyAgICAjIGNhdXNlIGEgcHJlbWF0dXJlIGV4aXQgaW4gdGhlIGN1cnJlbnQgc3Vic2hlbGwsIGUuZy4sIGluIGNhc2UgdGhlCisgICAgIyB0ZXN0IGNvbW1hbmQgaXQgcnVucyBnZXRzIHRlcm1pbmF0ZWQgYnkgYSBTSUdJTlQuICBUaHVzLCB0aGUgYXdrCisgICAgIyBzY3JpcHQgd2UgYXJlIHBpcGluZyBpbnRvIHdvdWxkIG5ldmVyIHNlZW4gdGhlIGV4aXQgc3RhdHVzIGl0CisgICAgIyBleHBlY3RzIG9uIGl0cyBsYXN0IGlucHV0IGxpbmUgKHdoaWNoIGlzIGRpc3BsYXllZCBiZWxvdyBieSB0aGUKKyAgICAjIGxhc3QgYGVjaG8gJD8nIHN0YXRlbWVudCksIGFuZCB3b3VsZCB0aHVzIGRpZSByZXBvcnRpbmcgYW4gaW50ZXJuYWwKKyAgICAjIGVycm9yLgorICAgICMgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUgQXV0b2NvbmYgbWFudWFsIGFuZCB0aGUgdGhyZWFkczoKKyAgICAjIDxodHRwOi8vbGlzdHMuZ251Lm9yZy9hcmNoaXZlL2h0bWwvYnVnLWF1dG9jb25mLzIwMTEtMDkvbXNnMDAwMDQuaHRtbD4KKyAgICAjIDxodHRwOi8vbWFpbC5vcGVuc29sYXJpcy5vcmcvcGlwZXJtYWlsL2tzaDkzLWludGVncmF0aW9uLWRpc2N1c3MvMjAwOS1GZWJydWFyeS8wMDQxMjEuaHRtbD4KKyAgICB0cmFwIDogMSAzIDIgMTMgMTUKKyAgICBpZiB0ZXN0ICRtZXJnZSAtZ3QgMDsgdGhlbgorICAgICAgZXhlYyAyPiYxCisgICAgZWxzZQorICAgICAgZXhlYyAyPiYzCisgICAgZmkKKyAgICAiJEAiCisgICAgZWNobyAkPworICApIHwgTENfQUxMPUMgJHtBTV9UQVBfQVdLLWF3a30gXAorICAgICAgICAtdiBtZT0iJG1lIiBcCisgICAgICAgIC12IHRlc3Rfc2NyaXB0X25hbWU9IiR0ZXN0X25hbWUiIFwKKyAgICAgICAgLXYgbG9nX2ZpbGU9IiRsb2dfZmlsZSIgXAorICAgICAgICAtdiB0cnNfZmlsZT0iJHRyc19maWxlIiBcCisgICAgICAgIC12IGV4cGVjdF9mYWlsdXJlPSIkZXhwZWN0X2ZhaWx1cmUiIFwKKyAgICAgICAgLXYgbWVyZ2U9IiRtZXJnZSIgXAorICAgICAgICAtdiBpZ25vcmVfZXhpdD0iJGlnbm9yZV9leGl0IiBcCisgICAgICAgIC12IGNvbW1lbnRzPSIkY29tbWVudHMiIFwKKyAgICAgICAgLXYgZGlhZ19zdHJpbmc9IiRkaWFnX3N0cmluZyIgXAorJworIyBUT0RPOiB0aGUgdXNhZ2VzIG9mICJjYXQgPiYzIiBiZWxvdyBjb3VsZCBiZSBvcHRpbWl6ZWQgd2hlbiB1c2luZworIyAgICAgICBHTlUgYXdrLCBhbmQvb24gb24gc3lzdGVtcyB0aGF0IHN1cHBvcnRzIC9kZXYvZmQvLgorCisjIEltcGxlbWVudGF0aW9uIG5vdGU6IGluIHdoYXQgZm9sbG93cywgYHJlc3VsdF9vYmpgIHdpbGwgYmUgYW4KKyMgYXNzb2NpYXRpdmUgYXJyYXkgdGhhdCAocGFydGx5KSBzaW11bGF0ZXMgYSBUQVAgcmVzdWx0IG9iamVjdAorIyBmcm9tIHRoZSBgVEFQOjpQYXJzZXJgIHBlcmwgbW9kdWxlLgorCisjIyAtLS0tLS0tLS0tLSAjIworIyMgIEZVTkNUSU9OUyAgIyMKKyMjIC0tLS0tLS0tLS0tICMjCisKK2Z1bmN0aW9uIGZhdGFsKG1zZykKK3sKKyAgcHJpbnQgbWUgIjogIiBtc2cgfCAiY2F0ID4mMiIKKyAgZXhpdCAxCit9CisKK2Z1bmN0aW9uIGFib3J0KHdoZXJlKQoreworICBmYXRhbCgiaW50ZXJuYWwgZXJyb3IgIiB3aGVyZSkKK30KKworIyBDb252ZXJ0IGEgYm9vbGVhbiB0byBhICJ5ZXMiLyJubyIgc3RyaW5nLgorZnVuY3Rpb24geW4oYm9vbCkKK3sKKyAgcmV0dXJuIGJvb2wgPyAieWVzIiA6ICJubyI7Cit9CisKK2Z1bmN0aW9uIGFkZF90ZXN0X3Jlc3VsdChyZXN1bHQpCit7CisgIGlmICghdGVzdF9yZXN1bHRzX2luZGV4KQorICAgIHRlc3RfcmVzdWx0c19pbmRleCA9IDAKKyAgdGVzdF9yZXN1bHRzX2xpc3RbdGVzdF9yZXN1bHRzX2luZGV4XSA9IHJlc3VsdAorICB0ZXN0X3Jlc3VsdHNfaW5kZXggKz0gMQorICB0ZXN0X3Jlc3VsdHNfc2VlbltyZXN1bHRdID0gMTsKK30KKworIyBXaGV0aGVyIHRoZSB0ZXN0IHNjcmlwdCBzaG91bGQgYmUgcmUtcnVuIGJ5ICJtYWtlIHJlY2hlY2siLgorZnVuY3Rpb24gbXVzdF9yZWNoZWNrKCkKK3sKKyAgZm9yIChrIGluIHRlc3RfcmVzdWx0c19zZWVuKQorICAgIGlmIChrICE9ICJYRkFJTCIgJiYgayAhPSAiUEFTUyIgJiYgayAhPSAiU0tJUCIpCisgICAgICByZXR1cm4gMQorICByZXR1cm4gMAorfQorCisjIFdoZXRoZXIgdGhlIGNvbnRlbnQgb2YgdGhlIGxvZyBmaWxlIGFzc29jaWF0ZWQgdG8gdGhpcyB0ZXN0IHNob3VsZAorIyBiZSBjb3BpZWQgaW50byB0aGUgImdsb2JhbCIgdGVzdC1zdWl0ZS5sb2cuCitmdW5jdGlvbiBjb3B5X2luX2dsb2JhbF9sb2coKQoreworICBmb3IgKGsgaW4gdGVzdF9yZXN1bHRzX3NlZW4pCisgICAgaWYgKGsgIT0gIlBBU1MiKQorICAgICAgcmV0dXJuIDEKKyAgcmV0dXJuIDAKK30KKworZnVuY3Rpb24gZ2V0X2dsb2JhbF90ZXN0X3Jlc3VsdCgpCit7CisgICAgaWYgKCJFUlJPUiIgaW4gdGVzdF9yZXN1bHRzX3NlZW4pCisgICAgICByZXR1cm4gIkVSUk9SIgorICAgIGlmICgiRkFJTCIgaW4gdGVzdF9yZXN1bHRzX3NlZW4gfHwgIlhQQVNTIiBpbiB0ZXN0X3Jlc3VsdHNfc2VlbikKKyAgICAgIHJldHVybiAiRkFJTCIKKyAgICBhbGxfc2tpcHBlZCA9IDEKKyAgICBmb3IgKGsgaW4gdGVzdF9yZXN1bHRzX3NlZW4pCisgICAgICBpZiAoayAhPSAiU0tJUCIpCisgICAgICAgIGFsbF9za2lwcGVkID0gMAorICAgIGlmIChhbGxfc2tpcHBlZCkKKyAgICAgIHJldHVybiAiU0tJUCIKKyAgICByZXR1cm4gIlBBU1MiOworfQorCitmdW5jdGlvbiBzdHJpbmdpZnlfcmVzdWx0X29iaihyZXN1bHRfb2JqKQoreworICBpZiAocmVzdWx0X29ialsiaXNfdW5wbGFubmVkIl0gfHwgcmVzdWx0X29ialsibnVtYmVyIl0gIT0gdGVzdG5vKQorICAgIHJldHVybiAiRVJST1IiCisKKyAgaWYgKHBsYW5fc2VlbiA9PSBMQVRFX1BMQU4pCisgICAgcmV0dXJuICJFUlJPUiIKKworICBpZiAocmVzdWx0X29ialsiZGlyZWN0aXZlIl0gPT0gIlRPRE8iKQorICAgIHJldHVybiByZXN1bHRfb2JqWyJpc19vayJdID8gIlhQQVNTIiA6ICJYRkFJTCIKKworICBpZiAocmVzdWx0X29ialsiZGlyZWN0aXZlIl0gPT0gIlNLSVAiKQorICAgIHJldHVybiByZXN1bHRfb2JqWyJpc19vayJdID8gIlNLSVAiIDogQ09PS0VEX0ZBSUw7CisKKyAgaWYgKGxlbmd0aChyZXN1bHRfb2JqWyJkaXJlY3RpdmUiXSkpCisgICAgICBhYm9ydCgiaW4gZnVuY3Rpb24gc3RyaW5naWZ5X3Jlc3VsdF9vYmooKSIpCisKKyAgcmV0dXJuIHJlc3VsdF9vYmpbImlzX29rIl0gPyBDT09LRURfUEFTUyA6IENPT0tFRF9GQUlMCit9CisKK2Z1bmN0aW9uIGRlY29yYXRlX3Jlc3VsdChyZXN1bHQpCit7CisgIGNvbG9yX25hbWUgPSBjb2xvcl9mb3JfcmVzdWx0W3Jlc3VsdF0KKyAgaWYgKGNvbG9yX25hbWUpCisgICAgcmV0dXJuIGNvbG9yX21hcFtjb2xvcl9uYW1lXSAiIiByZXN1bHQgIiIgY29sb3JfbWFwWyJzdGQiXQorICAjIElmIHdlIGFyZSBub3QgdXNpbmcgY29sb3JpemVkIG91dHB1dCwgb3IgaWYgd2UgZG8gbm90IGtub3cgaG93CisgICMgdG8gY29sb3JpemUgdGhlIGdpdmVuIHJlc3VsdCwgd2Ugc2hvdWxkIHJldHVybiBpdCB1bmNoYW5nZWQuCisgIHJldHVybiByZXN1bHQKK30KKworZnVuY3Rpb24gcmVwb3J0KHJlc3VsdCwgZGV0YWlscykKK3sKKyAgaWYgKHJlc3VsdCB+IC9eKFg/KFBBU1N8RkFJTCl8U0tJUHxFUlJPUikvKQorICAgIHsKKyAgICAgIG1zZyA9ICI6ICIgdGVzdF9zY3JpcHRfbmFtZQorICAgICAgYWRkX3Rlc3RfcmVzdWx0KHJlc3VsdCkKKyAgICB9CisgIGVsc2UgaWYgKHJlc3VsdCA9PSAiIyIpCisgICAgeworICAgICAgbXNnID0gIiAiIHRlc3Rfc2NyaXB0X25hbWUgIjoiCisgICAgfQorICBlbHNlCisgICAgeworICAgICAgYWJvcnQoImluIGZ1bmN0aW9uIHJlcG9ydCgpIikKKyAgICB9CisgIGlmIChsZW5ndGgoZGV0YWlscykpCisgICAgbXNnID0gbXNnICIgIiBkZXRhaWxzCisgICMgT3V0cHV0IG9uIGNvbnNvbGUgbWlnaHQgYmUgY29sb3JpemVkLgorICBwcmludCBkZWNvcmF0ZV9yZXN1bHQocmVzdWx0KSBtc2cKKyAgIyBMb2cgdGhlIHJlc3VsdCBpbiB0aGUgbG9nIGZpbGUgdG9vLCB0byBoZWxwIGRlYnVnZ2luZyAodGhpcyBpcworICAjIGVzcGVjaWFsbHkgdHJ1ZSB3aGVuIHNhaWQgcmVzdWx0IGlzIGEgVEFQIGVycm9yIG9yICJCYWlsIG91dCEiKS4KKyAgcHJpbnQgcmVzdWx0IG1zZyB8ICJjYXQgPiYzIjsKK30KKworZnVuY3Rpb24gdGVzdHN1aXRlX2Vycm9yKGVycm9yX21lc3NhZ2UpCit7CisgIHJlcG9ydCgiRVJST1IiLCAiLSAiIGVycm9yX21lc3NhZ2UpCit9CisKK2Z1bmN0aW9uIGhhbmRsZV90YXBfcmVzdWx0KCkKK3sKKyAgZGV0YWlscyA9IHJlc3VsdF9vYmpbIm51bWJlciJdOworICBpZiAobGVuZ3RoKHJlc3VsdF9vYmpbImRlc2NyaXB0aW9uIl0pKQorICAgIGRldGFpbHMgPSBkZXRhaWxzICIgIiByZXN1bHRfb2JqWyJkZXNjcmlwdGlvbiJdCisKKyAgaWYgKHBsYW5fc2VlbiA9PSBMQVRFX1BMQU4pCisgICAgeworICAgICAgZGV0YWlscyA9IGRldGFpbHMgIiAjIEFGVEVSIExBVEUgUExBTiI7CisgICAgfQorICBlbHNlIGlmIChyZXN1bHRfb2JqWyJpc191bnBsYW5uZWQiXSkKKyAgICB7CisgICAgICAgZGV0YWlscyA9IGRldGFpbHMgIiAjIFVOUExBTk5FRCI7CisgICAgfQorICBlbHNlIGlmIChyZXN1bHRfb2JqWyJudW1iZXIiXSAhPSB0ZXN0bm8pCisgICAgeworICAgICAgIGRldGFpbHMgPSBzcHJpbnRmKCIlcyAjIE9VVC1PRi1PUkRFUiAoZXhwZWN0aW5nICVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlscywgdGVzdG5vKTsKKyAgICB9CisgIGVsc2UgaWYgKHJlc3VsdF9vYmpbImRpcmVjdGl2ZSJdKQorICAgIHsKKyAgICAgIGRldGFpbHMgPSBkZXRhaWxzICIgIyAiIHJlc3VsdF9vYmpbImRpcmVjdGl2ZSJdOworICAgICAgaWYgKGxlbmd0aChyZXN1bHRfb2JqWyJleHBsYW5hdGlvbiJdKSkKKyAgICAgICAgZGV0YWlscyA9IGRldGFpbHMgIiAiIHJlc3VsdF9vYmpbImV4cGxhbmF0aW9uIl0KKyAgICB9CisKKyAgcmVwb3J0KHN0cmluZ2lmeV9yZXN1bHRfb2JqKHJlc3VsdF9vYmopLCBkZXRhaWxzKQorfQorCisjIGBza2lwX3JlYXNvbmAgc2hvdWxkIGJlIGVtcHR5IHdoZW5ldmVyIHBsYW5uZWQgPiAwLgorZnVuY3Rpb24gaGFuZGxlX3RhcF9wbGFuKHBsYW5uZWQsIHNraXBfcmVhc29uKQoreworICBwbGFubmVkICs9IDAgIyBBdm9pZCBnZXR0aW5nIGNvbmZ1c2VkIGlmLCBzYXksIGBwbGFubmVkYCBpcyAiMDAiCisgIGlmIChsZW5ndGgoc2tpcF9yZWFzb24pICYmIHBsYW5uZWQgPiAwKQorICAgIGFib3J0KCJpbiBmdW5jdGlvbiBoYW5kbGVfdGFwX3BsYW4oKSIpCisgIGlmIChwbGFuX3NlZW4pCisgICAgeworICAgICAgIyBFcnJvciwgb25seSBvbmUgcGxhbiBwZXIgc3RyZWFtIGlzIGFjY2VwdGFibGUuCisgICAgICB0ZXN0c3VpdGVfZXJyb3IoIm11bHRpcGxlIHRlc3QgcGxhbnMiKQorICAgICAgcmV0dXJuOworICAgIH0KKyAgcGxhbm5lZF90ZXN0cyA9IHBsYW5uZWQKKyAgIyBUaGUgVEFQIHBsYW4gY2FuIGNvbWUgYmVmb3JlIG9yIGFmdGVyICphbGwqIHRoZSBUQVAgcmVzdWx0czsgd2Ugc3BlYWsKKyAgIyByZXNwZWN0aXZlbHkgb2YgYW4gImVhcmx5IiBvciBhICJsYXRlIiBwbGFuLiAgSWYgd2Ugc2VlIHRoZSBwbGFuIGxpbmUKKyAgIyBhZnRlciBhdCBsZWFzdCBvbmUgVEFQIHJlc3VsdCBoYXMgYmVlbiBzZWVuLCBhc3N1bWUgd2UgaGF2ZSBhIGxhdGUKKyAgIyBwbGFuOyBpbiB0aGlzIGNhc2UsIGFueSBmdXJ0aGVyIHRlc3QgcmVzdWx0IHNlZW4gYWZ0ZXIgdGhlIHBsYW4gd2lsbAorICAjIGJlIGZsYWdnZWQgYXMgYW4gZXJyb3IuCisgIHBsYW5fc2VlbiA9ICh0ZXN0bm8gPj0gMSA/IExBVEVfUExBTiA6IEVBUkxZX1BMQU4pCisgICMgSWYgdGVzdG5vID4gMCwgd2UgaGF2ZSBhbiBlcnJvciAoInRvbyBtYW55IHRlc3RzIHJ1biIpIHRoYXQgd2lsbCBiZQorICAjIGF1dG9tYXRpY2FsbHkgZGVhbHQgd2l0aCBsYXRlciwgc28gZG8gbm90IHdvcnJ5IGFib3V0IGl0IGhlcmUuICBJZgorICAjICRwbGFuX3NlZW4gaXMgdHJ1ZSwgd2UgaGF2ZSBhbiBlcnJvciBkdWUgdG8gYSByZXBlYXRlZCBwbGFuLCBhbmQgdGhhdAorICAjIGhhcyBhbHJlYWR5IGJlZW4gZGVhbHQgd2l0aCBhYm92ZS4gIE90aGVyd2lzZSwgd2UgaGF2ZSBhIHZhbGlkICJwbGFuCisgICMgd2l0aCBTS0lQIiBzcGVjaWZpY2F0aW9uLCBhbmQgc2hvdWxkIHJlcG9ydCBpdCBhcyBhIHBhcnRpY3VsYXIga2luZAorICAjIG9mIFNLSVAgcmVzdWx0LgorICBpZiAocGxhbm5lZCA9PSAwICYmIHRlc3RubyA9PSAwKQorICAgIHsKKyAgICAgIGlmIChsZW5ndGgoc2tpcF9yZWFzb24pKQorICAgICAgICBza2lwX3JlYXNvbiA9ICItICIgIHNraXBfcmVhc29uOworICAgICAgcmVwb3J0KCJTS0lQIiwgc2tpcF9yZWFzb24pOworICAgIH0KK30KKworZnVuY3Rpb24gZXh0cmFjdF90YXBfY29tbWVudChsaW5lKQoreworICBpZiAoaW5kZXgobGluZSwgZGlhZ19zdHJpbmcpID09IDEpCisgICAgeworICAgICAgIyBTdHJpcCBsZWFkaW5nIGBkaWFnX3N0cmluZ2AgZnJvbSBgbGluZWAuCisgICAgICBsaW5lID0gc3Vic3RyKGxpbmUsIGxlbmd0aChkaWFnX3N0cmluZykgKyAxKQorICAgICAgIyBBbmQgc3RyaXAgYW55IGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UgbGVmdC4KKyAgICAgIHN1YigiXlsgXHRdKiIsICIiLCBsaW5lKQorICAgICAgc3ViKCJbIFx0XSokIiwgIiIsIGxpbmUpCisgICAgICAjIFJldHVybiB3aGF0IGlzIGxlZnQgKGlmIGFueSkuCisgICAgICByZXR1cm4gbGluZTsKKyAgICB9CisgIHJldHVybiAiIjsKK30KKworIyBXaGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLCB3ZSBrbm93IHRoYXQgbGluZSBpcyBhIFRBUCByZXN1bHQgbGluZSwKKyMgc28gdGhhdCBpdCBtYXRjaGVzIHRoZSAocGVybCkgUkUgIl4obm90ICk/b2tcYiIuCitmdW5jdGlvbiBzZXR1cF9yZXN1bHRfb2JqKGxpbmUpCit7CisgICMgR2V0IHRoZSByZXN1bHQsIGFuZCByZW1vdmUgaXQgZnJvbSB0aGUgbGluZS4KKyAgcmVzdWx0X29ialsiaXNfb2siXSA9IChzdWJzdHIobGluZSwgMSwgMikgPT0gIm9rIiA/IDEgOiAwKQorICBzdWIoIl4obm90ICk/b2tbIFx0XSoiLCAiIiwgbGluZSkKKworICAjIElmIHRoZSByZXN1bHQgaGFzIGFuIGV4cGxpY2l0IG51bWJlciwgZ2V0IGl0IGFuZCBzdHJpcCBpdDsgb3RoZXJ3aXNlLAorICAjIGF1dG9tYXRpY2FsbHkgYXNzaW5nIHRoZSBuZXh0IHByb2dyZXNpdmUgbnVtYmVyIHRvIGl0LgorICBpZiAobGluZSB+IC9eWzAtOV0rJC8gfHwgbGluZSB+IC9eWzAtOV0rW15hLXpBLVowLTlfXS8pCisgICAgeworICAgICAgbWF0Y2gobGluZSwgIl5bMC05XSsiKQorICAgICAgIyBUaGUgZmluYWwgYCsgMGAgaXMgdG8gbm9ybWFsaXplIG51bWJlcnMgd2l0aCBsZWFkaW5nIHplcm9zLgorICAgICAgcmVzdWx0X29ialsibnVtYmVyIl0gPSBzdWJzdHIobGluZSwgMSwgUkxFTkdUSCkgKyAwCisgICAgICBsaW5lID0gc3Vic3RyKGxpbmUsIFJMRU5HVEggKyAxKQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHJlc3VsdF9vYmpbIm51bWJlciJdID0gdGVzdG5vCisgICAgfQorCisgIGlmIChwbGFuX3NlZW4gPT0gTEFURV9QTEFOKQorICAgICMgTm8gZnVydGhlciB0ZXN0IHJlc3VsdHMgYXJlIGFjY2VwdGFibGUgYWZ0ZXIgYSAibGF0ZSIgVEFQIHBsYW4KKyAgICAjIGhhcyBiZWVuIHNlZW4uCisgICAgcmVzdWx0X29ialsiaXNfdW5wbGFubmVkIl0gPSAxCisgIGVsc2UgaWYgKHBsYW5fc2VlbiAmJiB0ZXN0bm8gPiBwbGFubmVkX3Rlc3RzKQorICAgIHJlc3VsdF9vYmpbImlzX3VucGxhbm5lZCJdID0gMQorICBlbHNlCisgICAgcmVzdWx0X29ialsiaXNfdW5wbGFubmVkIl0gPSAwCisKKyAgIyBTdHJpcCB0cmFpbGluZyBhbmQgbGVhZGluZyB3aGl0ZXNwYWNlLgorICBzdWIoIl5bIFx0XSoiLCAiIiwgbGluZSkKKyAgc3ViKCJbIFx0XSokIiwgIiIsIGxpbmUpCisKKyAgIyBUaGlzIHdpbGwgaGF2ZSB0byBiZSBjb3JyZWN0ZWQgaWYgd2UgaGF2ZSBhICJUT0RPIi8iU0tJUCIgZGlyZWN0aXZlLgorICByZXN1bHRfb2JqWyJkZXNjcmlwdGlvbiJdID0gbGluZQorICByZXN1bHRfb2JqWyJkaXJlY3RpdmUiXSA9ICIiCisgIHJlc3VsdF9vYmpbImV4cGxhbmF0aW9uIl0gPSAiIgorCisgIGlmIChpbmRleChsaW5lLCAiIyIpID09IDApCisgICAgcmV0dXJuICMgTm8gcG9zc2libGUgZGlyZWN0aXZlLCBub3RoaW5nIG1vcmUgdG8gZG8uCisKKyAgIyBEaXJlY3RpdmVzIGFyZSBjYXNlLWluc2Vuc2l0aXZlLgorICByeCA9ICJbIFx0XSojWyBcdF0qKFt0VF1bb09dW2REXVtvT118W3NTXVtrS11baUldW3BQXSlbIFx0XSoiCisKKyAgIyBTZWUgd2hldGhlciB3ZSBoYXZlIHRoZSBkaXJlY3RpdmUsIGFuZCBpZiB5ZXMsIHdoZXJlLgorICBwb3MgPSBtYXRjaChsaW5lLCByeCAiJCIpCisgIGlmICghcG9zKQorICAgIHBvcyA9IG1hdGNoKGxpbmUsIHJ4ICJbXmEtekEtWjAtOV9dIikKKworICAjIElmIHRoZXJlIHdhcyBubyBUQVAgZGlyZWN0aXZlLCB3ZSBoYXZlIG5vdGhpbmcgbW9yZSB0byBkby4KKyAgaWYgKCFwb3MpCisgICAgcmV0dXJuCisKKyAgIyBMZXRgcyBub3cgc2VlIGlmIHRoZSBUQVAgZGlyZWN0aXZlIGhhcyBiZWVuIGVzY2FwZWQuICBGb3IgZXhhbXBsZToKKyAgIyAgZXNjYXBlZDogICAgIG9rIFwjIFNLSVAKKyAgIyAgbm90IGVzY2FwZWQ6IG9rIFxcIyBTS0lQCisgICMgIGVzY2FwZWQ6ICAgICBvayBcXFxcXCMgU0tJUAorICAjICBub3QgZXNjYXBlZDogb2sgXCAjIFNLSVAKKyAgaWYgKHN1YnN0cihsaW5lLCBwb3MsIDEpID09ICIjIikKKyAgICB7CisgICAgICBic2xhc2hfY291bnQgPSAwCisgICAgICBmb3IgKGkgPSBwb3M7IGkgPiAxICYmIHN1YnN0cihsaW5lLCBpIC0gMSwgMSkgPT0gIlxcIjsgaS0tKQorICAgICAgICBic2xhc2hfY291bnQgKz0gMQorICAgICAgaWYgKGJzbGFzaF9jb3VudCAlIDIpCisgICAgICAgIHJldHVybiAjIERpcmVjdGl2ZSB3YXMgZXNjYXBlZC4KKyAgICB9CisKKyAgIyBTdHJpcCB0aGUgZGlyZWN0aXZlIGFuZCBpdHMgZXhwbGFuYXRpb24gKGlmIGFueSkgZnJvbSB0aGUgdGVzdAorICAjIGRlc2NyaXB0aW9uLgorICByZXN1bHRfb2JqWyJkZXNjcmlwdGlvbiJdID0gc3Vic3RyKGxpbmUsIDEsIHBvcyAtIDEpCisgICMgTm93IHJlbW92ZSB0aGUgdGVzdCBkZXNjcmlwdGlvbiBmcm9tIHRoZSBsaW5lLCB0aGF0IGhhcyBiZWVuIGRlYWx0CisgICMgd2l0aCBhbHJlYWR5LgorICBsaW5lID0gc3Vic3RyKGxpbmUsIHBvcykKKyAgIyBTdHJpcCB0aGUgZGlyZWN0aXZlLCBhbmQgc2F2ZSBpdHMgdmFsdWUgKG5vcm1hbGl6ZWQgdG8gdXBwZXIgY2FzZSkuCisgIHN1YigiXlsgXHRdKiNbIFx0XSoiLCAiIiwgbGluZSkKKyAgcmVzdWx0X29ialsiZGlyZWN0aXZlIl0gPSB0b3VwcGVyKHN1YnN0cihsaW5lLCAxLCA0KSkKKyAgbGluZSA9IHN1YnN0cihsaW5lLCA1KQorICAjIE5vdyBnZXQgdGhlIGV4cGxhbmF0aW9uIGZvciB0aGUgZGlyZWN0aXZlIChpZiBhbnkpLCB3aXRoIGxlYWRpbmcKKyAgIyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZSByZW1vdmVkLgorICBzdWIoIl5bIFx0XSoiLCAiIiwgbGluZSkKKyAgc3ViKCJbIFx0XSokIiwgIiIsIGxpbmUpCisgIHJlc3VsdF9vYmpbImV4cGxhbmF0aW9uIl0gPSBsaW5lCit9CisKK2Z1bmN0aW9uIGdldF90ZXN0X2V4aXRfbWVzc2FnZShzdGF0dXMpCit7CisgIGlmIChzdGF0dXMgPT0gMCkKKyAgICByZXR1cm4gIiIKKyAgaWYgKHN0YXR1cyAhfiAvXlsxLTldWzAtOV0qJC8pCisgICAgYWJvcnQoImdldHRpbmcgZXhpdCBzdGF0dXMiKQorICBpZiAoc3RhdHVzIDwgMTI3KQorICAgIGV4aXRfZGV0YWlscyA9ICIiCisgIGVsc2UgaWYgKHN0YXR1cyA9PSAxMjcpCisgICAgZXhpdF9kZXRhaWxzID0gIiAoY29tbWFuZCBub3QgZm91bmQ/KSIKKyAgZWxzZSBpZiAoc3RhdHVzID49IDEyOCAmJiBzdGF0dXMgPD0gMjU1KQorICAgIGV4aXRfZGV0YWlscyA9IHNwcmludGYoIiAodGVybWluYXRlZCBieSBzaWduYWwgJWQ/KSIsIHN0YXR1cyAtIDEyOCkKKyAgZWxzZSBpZiAoc3RhdHVzID4gMjU2ICYmIHN0YXR1cyA8PSAzODQpCisgICAgIyBXZSB1c2VkIHRvIHJlcG9ydCBhbiAiYWJub3JtYWwgdGVybWluYXRpb24iIGhlcmUsIGJ1dCBzb21lIEtvcm4KKyAgICAjIHNoZWxscywgd2hlbiBhIGNoaWxkIHByb2Nlc3MgZGllIGR1ZSB0byBzaWduYWwgbnVtYmVyIG4sIGNhbiBsZWF2ZQorICAgICMgaW4gJD8gYW4gZXhpdCBzdGF0dXMgb2YgMjU2K24gaW5zdGVhZCBvZiB0aGUgbW9yZSBzdGFuZGFyZCAxMjgrbi4KKyAgICAjIEFwcGFyZW50bHksIGJvdGggYmVoYXZpb3VycyBhcmUgYWxsb3dlZCBieSBQT1NJWCAoMjAwOCksIHNvIGJlCisgICAgIyBwcmVwYXJlZCB0byBoYW5kbGUgdGhlbSBib3RoLiAgU2VlIGFsc28gQXVzdGluZyBHcm91cCByZXBvcnQgSUQKKyAgICAjIDAwMDAwNTEgPGh0dHA6Ly93d3cuYXVzdGluZ3JvdXBidWdzLm5ldC92aWV3LnBocD9pZD01MT4KKyAgICBleGl0X2RldGFpbHMgPSBzcHJpbnRmKCIgKHRlcm1pbmF0ZWQgYnkgc2lnbmFsICVkPykiLCBzdGF0dXMgLSAyNTYpCisgIGVsc2UKKyAgICAjIE5ldmVyIHNlZW4gaW4gcHJhY3RpY2UuCisgICAgZXhpdF9kZXRhaWxzID0gIiAoYWJub3JtYWwgdGVybWluYXRpb24pIgorICByZXR1cm4gc3ByaW50ZigiZXhpdGVkIHdpdGggc3RhdHVzICVkJXMiLCBzdGF0dXMsIGV4aXRfZGV0YWlscykKK30KKworZnVuY3Rpb24gd3JpdGVfdGVzdF9yZXN1bHRzKCkKK3sKKyAgcHJpbnQgIjpnbG9iYWwtdGVzdC1yZXN1bHQ6ICIgZ2V0X2dsb2JhbF90ZXN0X3Jlc3VsdCgpID4gdHJzX2ZpbGUKKyAgcHJpbnQgIjpyZWNoZWNrOiAiICB5bihtdXN0X3JlY2hlY2soKSkgPiB0cnNfZmlsZQorICBwcmludCAiOmNvcHktaW4tZ2xvYmFsLWxvZzogIiB5bihjb3B5X2luX2dsb2JhbF9sb2coKSkgPiB0cnNfZmlsZQorICBmb3IgKGkgPSAwOyBpIDwgdGVzdF9yZXN1bHRzX2luZGV4OyBpICs9IDEpCisgICAgcHJpbnQgIjp0ZXN0LXJlc3VsdDogIiB0ZXN0X3Jlc3VsdHNfbGlzdFtpXSA+IHRyc19maWxlCisgIGNsb3NlKHRyc19maWxlKTsKK30KKworQkVHSU4geworCisjIyAtLS0tLS0tICMjCisjIyAgU0VUVVAgICMjCisjIyAtLS0tLS0tICMjCisKKyciJGluaXRfY29sb3JzIicKKworIyBQcm9wZXJseSBpbml0aWFsaXplZCBvbmNlIHRoZSBUQVAgcGxhbiBpcyBzZWVuLgorcGxhbm5lZF90ZXN0cyA9IDAKKworQ09PS0VEX1BBU1MgPSBleHBlY3RfZmFpbHVyZSA/ICJYUEFTUyI6ICJQQVNTIjsKK0NPT0tFRF9GQUlMID0gZXhwZWN0X2ZhaWx1cmUgPyAiWEZBSUwiOiAiRkFJTCI7CisKKyMgRW51bWVyYXRpb24tbGlrZSBjb25zdGFudHMgdG8gcmVtZW1iZXIgd2hpY2gga2luZCBvZiBwbGFuIChpZiBhbnkpCisjIGhhcyBiZWVuIHNlZW4uICBJdCBpcyBpbXBvcnRhbnQgdGhhdCBOT19QTEFOIGV2YWx1YXRlcyAiZmFsc2UiIGFzCisjIGEgYm9vbGVhbi4KK05PX1BMQU4gPSAwCitFQVJMWV9QTEFOID0gMQorTEFURV9QTEFOID0gMgorCit0ZXN0bm8gPSAwICAgICAjIE51bWJlciBvZiB0ZXN0IHJlc3VsdHMgc2VlbiBzbyBmYXIuCitiYWlsZWRfb3V0ID0gMCAjIFdoZXRoZXIgYSAiQmFpbCBvdXQhIiBkaXJlY3RpdmUgaGFzIGJlZW4gc2Vlbi4KKworIyBXaGV0aGVyIHRoZSBUQVAgcGxhbiBoYXMgYmVlbiBzZWVuIG9yIG5vdCwgYW5kIGlmIHllcywgd2hpY2gga2luZAorIyBpdCBpcyAoImVhcmx5IiBpcyBzZWVuIGJlZm9yZSBhbnkgdGVzdCByZXN1bHQsICJsYXRlIiBvdGhlcndpc2UpLgorcGxhbl9zZWVuID0gTk9fUExBTgorCisjIyAtLS0tLS0tLS0gIyMKKyMjICBQQVJTSU5HICAjIworIyMgLS0tLS0tLS0tICMjCisKK2lzX2ZpcnN0X3JlYWQgPSAxCisKK3doaWxlICgxKQorICB7CisgICAgIyBJbnZvbHV0aW9ucyByZXF1aXJlZCBzbyB0aGF0IHdlIGFyZSBhYmxlIHRvIHJlYWQgdGhlIGV4aXQgc3RhdHVzCisgICAgIyBmcm9tIHRoZSBsYXN0IGlucHV0IGxpbmUuCisgICAgc3QgPSBnZXRsaW5lCisgICAgaWYgKHN0IDwgMCkgIyBJL08gZXJyb3IuCisgICAgICBmYXRhbCgiSS9PIGVycm9yIHdoaWxlIHJlYWRpbmcgZnJvbSBpbnB1dCBzdHJlYW0iKQorICAgIGVsc2UgaWYgKHN0ID09IDApICMgRW5kLW9mLWlucHV0CisgICAgICB7CisgICAgICAgIGlmIChpc19maXJzdF9yZWFkKQorICAgICAgICAgIGFib3J0KCJpbiBpbnB1dCBsb29wOiBvbmx5IG9uZSBpbnB1dCBsaW5lIikKKyAgICAgICAgYnJlYWsKKyAgICAgIH0KKyAgICBpZiAoaXNfZmlyc3RfcmVhZCkKKyAgICAgIHsKKyAgICAgICAgaXNfZmlyc3RfcmVhZCA9IDAKKyAgICAgICAgbmV4dGxpbmUgPSAkMAorICAgICAgICBjb250aW51ZQorICAgICAgfQorICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgY3VybGluZSA9IG5leHRsaW5lCisgICAgICAgIG5leHRsaW5lID0gJDAKKyAgICAgICAgJDAgPSBjdXJsaW5lCisgICAgICB9CisgICAgIyBDb3B5IGFueSBpbnB1dCBsaW5lIHZlcmJhdGltIGludG8gdGhlIGxvZyBmaWxlLgorICAgIHByaW50IHwgImNhdCA+JjMiCisgICAgIyBQYXJzaW5nIG9mIFRBUCBpbnB1dCBzaG91bGQgc3RvcCBhZnRlciBhICJCYWlsIG91dCEiIGRpcmVjdGl2ZS4KKyAgICBpZiAoYmFpbGVkX291dCkKKyAgICAgIGNvbnRpbnVlCisKKyAgICAjIFRBUCB0ZXN0IHJlc3VsdC4KKyAgICBpZiAoJDAgfiAvXihub3QgKT9vayQvIHx8ICQwIH4gL14obm90ICk/b2tbXmEtekEtWjAtOV9dLykKKyAgICAgIHsKKyAgICAgICAgdGVzdG5vICs9IDEKKyAgICAgICAgc2V0dXBfcmVzdWx0X29iaigkMCkKKyAgICAgICAgaGFuZGxlX3RhcF9yZXN1bHQoKQorICAgICAgfQorICAgICMgVEFQIHBsYW4gKG5vcm1hbCBvciAiU0tJUCIgd2l0aG91dCBleHBsYW5hdGlvbikuCisgICAgZWxzZSBpZiAoJDAgfiAvXjFcLlwuWzAtOV0rWyBcdF0qJC8pCisgICAgICB7CisgICAgICAgICMgVGhlIG5leHQgdHdvIGxpbmVzIHdpbGwgcHV0IHRoZSBudW1iZXIgb2YgcGxhbm5lZCB0ZXN0cyBpbiAkMC4KKyAgICAgICAgc3ViKCJeMVxcLlxcLiIsICIiKQorICAgICAgICBzdWIoIlteMC05XSokIiwgIiIpCisgICAgICAgIGhhbmRsZV90YXBfcGxhbigkMCwgIiIpCisgICAgICAgIGNvbnRpbnVlCisgICAgICB9CisgICAgIyBUQVAgIlNLSVAiIHBsYW4sIHdpdGggYW4gZXhwbGFuYXRpb24uCisgICAgZWxzZSBpZiAoJDAgfiAvXjFcLlwuMCtbIFx0XSojLykKKyAgICAgIHsKKyAgICAgICAgIyBUaGUgbmV4dCBsaW5lcyB3aWxsIHB1dCB0aGUgc2tpcCBleHBsYW5hdGlvbiBpbiAkMCwgc3RyaXBwaW5nCisgICAgICAgICMgYW55IGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UuICBUaGlzIGlzIGEgbGl0dGxlIG1vcmUKKyAgICAgICAgIyB0cmlja3kgaW4gdHJ1dGgsIHNpbmNlIHdlIHdhbnQgdG8gYWxzbyBzdHJpcCBhIHBvdGVudGlhbCBsZWFkaW5nCisgICAgICAgICMgIlNLSVAiIHN0cmluZyBmcm9tIHRoZSBtZXNzYWdlLgorICAgICAgICBzdWIoIl5bXiNdKiNbIFx0XSooU0tJUFs6IFx0XVsgXHRdKik/IiwgIiIpCisgICAgICAgIHN1YigiWyBcdF0qJCIsICIiKTsKKyAgICAgICAgaGFuZGxlX3RhcF9wbGFuKDAsICQwKQorICAgICAgfQorICAgICMgIkJhaWwgb3V0ISIgbWFnaWMuCisgICAgIyBPbGRlciB2ZXJzaW9ucyBvZiBwcm92ZSBhbmQgVEFQOjpIYXJuZXNzIChlLmcuLCAzLjE3KSBkaWQgbm90CisgICAgIyByZWNvZ25pemUgYSAiQmFpbCBvdXQhIiBkaXJlY3RpdmUgd2hlbiBwcmVjZWRlZCBieSBsZWFkaW5nCisgICAgIyB3aGl0ZXNwYWNlLCBidXQgbW9yZSBtb2Rlcm4gdmVyc2lvbnMgKGUuZy4sIDMuMjMpIGRvLiAgU28gd2UKKyAgICAjIGVtdWxhdGUgdGhlIGxhdHRlciwgIm1vcmUgbW9kZXJuIiBiZWhhdmlvdXIuCisgICAgZWxzZSBpZiAoJDAgfiAvXlsgXHRdKkJhaWwgb3V0IS8pCisgICAgICB7CisgICAgICAgIGJhaWxlZF9vdXQgPSAxCisgICAgICAgICMgR2V0IHRoZSBiYWlsb3V0IG1lc3NhZ2UgKGlmIGFueSksIHdpdGggbGVhZGluZyBhbmQgdHJhaWxpbmcKKyAgICAgICAgIyB3aGl0ZXNwYWNlIHN0cmlwcGVkLiAgVGhlIG1lc3NhZ2UgcmVtYWlucyBzdG9yZWQgaW4gYCQwYC4KKyAgICAgICAgc3ViKCJeWyBcdF0qQmFpbCBvdXQhWyBcdF0qIiwgIiIpOworICAgICAgICBzdWIoIlsgXHRdKiQiLCAiIik7CisgICAgICAgICMgRm9ybWF0IHRoZSBlcnJvciBtZXNzYWdlIGZvciB0aGUKKyAgICAgICAgYmFpbG91dF9tZXNzYWdlID0gIkJhaWwgb3V0ISIKKyAgICAgICAgaWYgKGxlbmd0aCgkMCkpCisgICAgICAgICAgYmFpbG91dF9tZXNzYWdlID0gYmFpbG91dF9tZXNzYWdlICIgIiAkMAorICAgICAgICB0ZXN0c3VpdGVfZXJyb3IoYmFpbG91dF9tZXNzYWdlKQorICAgICAgfQorICAgICMgTWF5YmUgd2UgaGF2ZSB0b28gbG9vayBmb3IgZGlhbm9ndGljIGNvbW1lbnRzIHRvby4KKyAgICBlbHNlIGlmIChjb21tZW50cyAhPSAwKQorICAgICAgeworICAgICAgICBjb21tZW50ID0gZXh0cmFjdF90YXBfY29tbWVudCgkMCk7CisgICAgICAgIGlmIChsZW5ndGgoY29tbWVudCkpCisgICAgICAgICAgcmVwb3J0KCIjIiwgY29tbWVudCk7CisgICAgICB9CisgIH0KKworIyMgLS0tLS0tLS0gIyMKKyMjICBGSU5JU0ggICMjCisjIyAtLS0tLS0tLSAjIworCisjIEEgIkJhaWwgb3V0ISIgZGlyZWN0aXZlIHNob3VsZCBjYXVzZSB1cyB0byBpZ25vcmUgYW55IGZvbGxvd2luZyBUQVAKKyMgZXJyb3IsIGFzIHdlbGwgYXMgYSBub24temVybyBleGl0IHN0YXR1cyBmcm9tIHRoZSBUQVAgcHJvZHVjZXIuCitpZiAoIWJhaWxlZF9vdXQpCisgIHsKKyAgICBpZiAoIXBsYW5fc2VlbikKKyAgICAgIHsKKyAgICAgICAgdGVzdHN1aXRlX2Vycm9yKCJtaXNzaW5nIHRlc3QgcGxhbiIpCisgICAgICB9CisgICAgZWxzZSBpZiAocGxhbm5lZF90ZXN0cyAhPSB0ZXN0bm8pCisgICAgICB7CisgICAgICAgIGJhZF9hbW91bnQgPSB0ZXN0bm8gPiBwbGFubmVkX3Rlc3RzID8gIm1hbnkiIDogImZldyIKKyAgICAgICAgdGVzdHN1aXRlX2Vycm9yKHNwcmludGYoInRvbyAlcyB0ZXN0cyBydW4gKGV4cGVjdGVkICVkLCBnb3QgJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFkX2Ftb3VudCwgcGxhbm5lZF90ZXN0cywgdGVzdG5vKSkKKyAgICAgIH0KKyAgICBpZiAoIWlnbm9yZV9leGl0KQorICAgICAgeworICAgICAgICAjIEZldGNoIGV4aXQgc3RhdHVzIGZyb20gdGhlIGxhc3QgbGluZS4KKyAgICAgICAgZXhpdF9tZXNzYWdlID0gZ2V0X3Rlc3RfZXhpdF9tZXNzYWdlKG5leHRsaW5lKQorICAgICAgICBpZiAoZXhpdF9tZXNzYWdlKQorICAgICAgICAgIHRlc3RzdWl0ZV9lcnJvcihleGl0X21lc3NhZ2UpCisgICAgICB9CisgIH0KKword3JpdGVfdGVzdF9yZXN1bHRzKCkKKworZXhpdCAwCisKK30gIyBFbmQgb2YgIkJFR0lOIiBibG9jay4KKycKKworIyBUT0RPOiBkb2N1bWVudCB0aGF0IHdlIGNvbnN1bWUgdGhlIGZpbGUgZGVzY3JpcHRvciAzIDotKAorfSAzPiIkbG9nX2ZpbGUiCisKK3Rlc3QgJD8gLWVxIDAgfHwgZmF0YWwgIkkvTyBvciBpbnRlcm5hbCBlcnJvciIKKworIyBMb2NhbCBWYXJpYWJsZXM6CisjIG1vZGU6IHNoZWxsLXNjcmlwdAorIyBzaC1pbmRlbnRhdGlvbjogMgorIyBldmFsOiAoYWRkLWhvb2sgJ3dyaXRlLWZpbGUtaG9va3MgJ3RpbWUtc3RhbXApCisjIHRpbWUtc3RhbXAtc3RhcnQ6ICJzY3JpcHR2ZXJzaW9uPSIKKyMgdGltZS1zdGFtcC1mb3JtYXQ6ICIlOnktJTAybS0lMDJkLiUwMkgiCisjIHRpbWUtc3RhbXAtdGltZS16b25lOiAiVVRDIgorIyB0aW1lLXN0YW1wLWVuZDogIjsgIyBVVEMiCisjIEVuZDoKZGlmZiAtLWdpdCBhL2J1cy8uZ2l0aWdub3JlIGIvYnVzLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdiMDQ3NwotLS0gL2Rldi9udWxsCisrKyBiL2J1cy8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsMjggQEAKKy5kZXBzCisubGlicworTWFrZWZpbGUKK01ha2VmaWxlLmluCisqLmxvCisqLmxhCitkYnVzLWRhZW1vbgorZGJ1cy1kYWVtb24tYWN0aXZhdGlvbi1oZWxwZXIKK2RidXMtZGFlbW9uLWFjdGl2YXRpb24taGVscGVyLXRlc3QKK2RidXMtZGFlbW9uLWxhdW5jaC1oZWxwZXIKK2RidXMtZGFlbW9uLWxhdW5jaC1oZWxwZXItdGVzdAorKi5iYgorKi5iYmcKKyouZGEKKyouZ2NvdgordGVzdC1idXMKK3JjLm1lc3NhZ2VidXMKK21lc3NhZ2VidXMKK21lc3NhZ2VidXMtY29uZmlnCitzZXNzaW9uLmNvbmYKK3N5c3RlbS5jb25mCit0ZXN0LWJ1cy1sYXVuY2gtaGVscGVyCit0ZXN0LWJ1cy1zeXN0ZW0KK2RidXMuc2VydmljZQorZGJ1cy5zb2NrZXQKK29yZy5mcmVlZGVza3RvcC5kYnVzLXNlc3Npb24ucGxpc3QKK2V4YW1wbGUtc2Vzc2lvbi1kaXNhYmxlLXN0YXRzLmNvbmYKK2V4YW1wbGUtc3lzdGVtLWVuYWJsZS1zdGF0cy5jb25mCmRpZmYgLS1naXQgYS9idXMvQW5kcm9pZC5tayBiL2J1cy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4YWY4OTUKLS0tIC9kZXYvbnVsbAorKysgYi9idXMvQW5kcm9pZC5tawpAQCAtMCwwICsxLDU3IEBACitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9DX0lOQ0xVREVTOj0gJChMT0NBTF9QQVRIKS8uLgorCitMT0NBTF9DRkxBR1M6PSBcCisJLU8zIFwKKwktRERCVVNfQU5EUk9JRF9MT0cgXAorCS1EREJVU19DT01QSUxBVElPTiBcCisJLUREQlVTX0RBRU1PTl9OQU1FPVwiZGJ1cy1kYWVtb25cIiBcCisJLUREQlVTX1NZU1RFTV9DT05GSUdfRklMRT1cIi9ldGMvZGJ1cy0xL3N5c3RlbS5jb25mXCIgXAorCS1EREJVU19TRVNTSU9OX0NPTkZJR19GSUxFPVwiL2V0Yy9kYnVzLTEvc2Vzc2lvbi5jb25mXCIgXAorCS1Xbm8tYWRkcmVzcyBcCisJLVduby1lbXB0eS1ib2R5IFwKKwktV25vLXBvaW50ZXItc2lnbiBcCisJLVduby1zaWduLWNvbXBhcmUgXAorCS1Xbm8tdW51c2VkLXBhcmFtZXRlcgorCitMT0NBTF9TUkNfRklMRVM6PSBcCisJYWN0aXZhdGlvbi5jIFwKKwlhY3RpdmF0aW9uLWhlbHBlci5jIFwKKwlhcHBhcm1vci5jIFwKKwlhdWRpdC5jIFwKKwlidXMuYyBcCisJY29uZmlnLWxvYWRlci1leHBhdC5jIFwKKwljb25maWctcGFyc2VyLmMgXAorCWNvbmZpZy1wYXJzZXItY29tbW9uLmMgXAorCWNvbm5lY3Rpb24uYyBcCisJZGVza3RvcC1maWxlLmMgXAorCWRpci13YXRjaC1pbm90aWZ5LmMgXAorCWRpc3BhdGNoLmMgXAorCWRyaXZlci5jIFwKKwlleHBpcmVsaXN0LmMgXAorCW1haW4uYyBcCisJcG9saWN5LmMgXAorCXNlbGludXguYyBcCisJc2VydmljZXMuYyBcCisJc2lnbmFscy5jIFwKKwlzdGF0cy5jIFwKKwl1dGlscy5jCisKK0xPQ0FMX0xERkxBR1M6PSAtV2wsLS1uby1leHBvcnQtZHluYW1pYywtLWdjLXNlY3Rpb25zCisKK2lmZXEgKCQoQlVJTERfRVVSRUtBKSx0cnVlKQorTE9DQUxfQ19JTkNMVURFUyArPSBleHRlcm5hbC9leHBhdC9saWIKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gbGliZXhwYXRfc3RhdGljCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKwlsaWJkYnVzCitlbHNlCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKwlsaWJleHBhdCBcCisJbGliZGJ1cworZW5kaWYKKworTE9DQUxfTU9EVUxFOj1kYnVzLWRhZW1vbgorCitpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL2J1cy9NYWtlZmlsZS5hbSBiL2J1cy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTE3MDYzCi0tLSAvZGV2L251bGwKKysrIGIvYnVzL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMzA5IEBACitkYnVzZGF0YWRpcj0kKGRhdGFkaXIpL2RidXMtMQorbGVnYWN5ZGJ1c2RhdGFkaXI9JChzeXNjb25mZGlyKS9kYnVzLTEKK2RidXNfZGFlbW9uX2V4ZWNkaXIgPSAkKERCVVNfREFFTU9ORElSKQorIyBBbHdheXMgbGliLCBldmVuIGlmICR7bGliZGlyfSBpcyBsaWI2NCBvciBsaWIveDg2XzY0LWxpbnV4LWdudQorc3lzdGVtZHRtcGZpbGVzZGlyID0gJChwcmVmaXgpL2xpYi90bXBmaWxlcy5kCitzeXN0ZW1kc3lzdXNlcnNkaXIgPSAkKHByZWZpeCkvbGliL3N5c3VzZXJzLmQKKworREJVU19CVVNfTElCUyA9IFwKKwkkKENPREVfQ09WRVJBR0VfTElCUykgXAorCSQoRVhQQVRfTElCUykgXAorCSQoU0VMSU5VWF9MSUJTKSBcCisJJChBUFBBUk1PUl9MSUJTKSBcCisJJChUSFJFQURfTElCUykgXAorCSQoQURUX0xJQlMpIFwKKwkkKE5FVFdPUktfbGlicykgXAorCSQoTlVMTCkKKworREJVU19MQVVOQ0hFUl9MSUJTID0gXAorCSQoQ09ERV9DT1ZFUkFHRV9MSUJTKSBcCisJJChFWFBBVF9MSUJTKSBcCisJJChUSFJFQURfTElCUykgXAorCSQoTkVUV09SS19saWJzKSBcCisJJChOVUxMKQorCitBTV9DUFBGTEFHUyA9IFwKKwkkKENPREVfQ09WRVJBR0VfQ1BQRkxBR1MpIFwKKwktSSQodG9wX3NyY2RpcikgXAorCSQoREJVU19TVEFUSUNfQlVJTERfQ1BQRkxBR1MpIFwKKwkkKEVYUEFUX0NGTEFHUykgXAorCSQoQVBQQVJNT1JfQ0ZMQUdTKSBcCisJLUREQlVTX1NZU1RFTV9DT05GSUdfRklMRT1cIiIkKGRidXNkYXRhZGlyKS9zeXN0ZW0uY29uZiJcIiBcCisJLUREQlVTX0NPTVBJTEFUSU9OIFwKKwkkKE5VTEwpCisKKyMgaWYgYXNzZXJ0aW9ucyBhcmUgZW5hYmxlZCwgaW1wcm92ZSBiYWNrdHJhY2VzCitBTV9MREZMQUdTID0gQFJfRFlOQU1JQ19MREZMQUdACisKK0FNX0NGTEFHUyA9IFwKKwkkKENPREVfQ09WRVJBR0VfQ0ZMQUdTKSBcCisJJChOVUxMKQorCitFRkVOQ0U9CisKK0VYVFJBX0RJU1QgPQkJCQkJXAorCXNlc3Npb24uY29uZi5pbgkJCQlcCisJc3lzdGVtLmNvbmYuaW4JCQkJXAorCWxlZ2FjeS1jb25maWcvc2Vzc2lvbi5jb25mLmluCQlcCisJbGVnYWN5LWNvbmZpZy9zeXN0ZW0uY29uZi5pbgkJXAorCW9yZy5mcmVlZGVza3RvcC5kYnVzLXNlc3Npb24ucGxpc3QuaW4JXAorCWV4YW1wbGUtc3lzdGVtLWVuYWJsZS1zdGF0cy5jb25mLmluCVwKKwlleGFtcGxlLXNlc3Npb24tZGlzYWJsZS1zdGF0cy5jb25mLmluCVwKKwkkKE5VTEwpCisKK2RidXNkYXRhX0RBVEEgPSBzZXNzaW9uLmNvbmYKK2xlZ2FjeWRidXNkYXRhX0RBVEEgPSBsZWdhY3ktY29uZmlnL3Nlc3Npb24uY29uZgorCitpZiBEQlVTX1VOSVgKK2RidXNkYXRhX0RBVEEgKz0gc3lzdGVtLmNvbmYKK2xlZ2FjeWRidXNkYXRhX0RBVEEgKz0gbGVnYWN5LWNvbmZpZy9zeXN0ZW0uY29uZgorZW5kaWYKKworZXhhbXBsZXNkaXIgPSAke2RvY2Rpcn0vZXhhbXBsZXMKK2V4YW1wbGVzX0RBVEEgPSBcCisJZXhhbXBsZS1zeXN0ZW0tZW5hYmxlLXN0YXRzLmNvbmYJXAorCWV4YW1wbGUtc2Vzc2lvbi1kaXNhYmxlLXN0YXRzLmNvbmYJXAorCSQoTlVMTCkKKworaWYgREJVU19FTkFCTEVfTEFVTkNIRAorYWdlbnRkaXI9JChMQVVOQ0hEX0FHRU5UX0RJUikKK2FnZW50X0RBVEE9b3JnLmZyZWVkZXNrdG9wLmRidXMtc2Vzc2lvbi5wbGlzdAorZW5kaWYKKworaWYgREJVU19CVVNfRU5BQkxFX0tRVUVVRQorRElSX1dBVENIX1NPVVJDRT1kaXItd2F0Y2gta3F1ZXVlLmMKK2Vsc2UKK2lmIERCVVNfQlVTX0VOQUJMRV9JTk9USUZZCitESVJfV0FUQ0hfU09VUkNFPWRpci13YXRjaC1pbm90aWZ5LmMKK2Vsc2UKK0RJUl9XQVRDSF9TT1VSQ0U9ZGlyLXdhdGNoLWRlZmF1bHQuYworZW5kaWYKK2VuZGlmCisKK0JVU19TT1VSQ0VTPQkJCQkJXAorCWFjdGl2YXRpb24uYwkJCQlcCisJYWN0aXZhdGlvbi5oCQkJCVwKKwlhY3RpdmF0aW9uLWV4aXQtY29kZXMuaAkJCVwKKwlhcHBhcm1vci5jCQkJCVwKKwlhcHBhcm1vci5oCQkJCVwKKwlhdWRpdC5jCQkJCQlcCisJYXVkaXQuaAkJCQkJXAorCWJ1cy5jCQkJCQlcCisJYnVzLmgJCQkJCVwKKwljb25maWctbG9hZGVyLWV4cGF0LmMJCQlcCisJY29uZmlnLXBhcnNlci5jCQkJCVwKKwljb25maWctcGFyc2VyLmgJCQkJXAorCWNvbmZpZy1wYXJzZXItY29tbW9uLmMJCQlcCisJY29uZmlnLXBhcnNlci1jb21tb24uaAkJCVwKKwljb25uZWN0aW9uLmMJCQkJXAorCWNvbm5lY3Rpb24uaAkJCQlcCisJZGVza3RvcC1maWxlLmMJCQkJXAorCWRlc2t0b3AtZmlsZS5oCQkJCVwKKwkkKERJUl9XQVRDSF9TT1VSQ0UpCQkJXAorCWRpci13YXRjaC5oCQkJCVwKKwlkaXNwYXRjaC5jCQkJCVwKKwlkaXNwYXRjaC5oCQkJCVwKKwlkcml2ZXIuYwkJCQlcCisJZHJpdmVyLmgJCQkJXAorCWV4cGlyZWxpc3QuYwkJCQlcCisJZXhwaXJlbGlzdC5oCQkJCVwKKwlwb2xpY3kuYwkJCQlcCisJcG9saWN5LmgJCQkJXAorCXNlbGludXguaAkJCQlcCisJc2VsaW51eC5jCQkJCVwKKwlzZXJ2aWNlcy5jCQkJCVwKKwlzZXJ2aWNlcy5oCQkJCVwKKwlzaWduYWxzLmMJCQkJXAorCXNpZ25hbHMuaAkJCQlcCisJc3RhdHMuYwkJCQkJXAorCXN0YXRzLmgJCQkJCVwKKwl0ZXN0LmMJCQkJCVwKKwl0ZXN0LmgJCQkJCVwKKwl1dGlscy5jCQkJCQlcCisJdXRpbHMuaAkJCQkJXAorCSQoTlVMTCkKKworZGJ1c19kYWVtb25fU09VUkNFUz0JCQkJXAorCSQoQlVTX1NPVVJDRVMpCQkJCVwKKwltYWluLmMKKworZGJ1c19kYWVtb25fTERBREQ9CQkJCQlcCisJJCh0b3BfYnVpbGRkaXIpL2RidXMvbGliZGJ1cy0xLmxhCVwKKwkkKHRvcF9idWlsZGRpcikvZGJ1cy9saWJkYnVzLWludGVybmFsLmxhCVwKKwkkKEVGRU5DRSkJCQkJCVwKKwkkKERCVVNfQlVTX0xJQlMpCisKK0xBVU5DSF9IRUxQRVJfU09VUkNFUz0JCQkJXAorCWNvbmZpZy1sb2FkZXItZXhwYXQuYwkJCVwKKwljb25maWctcGFyc2VyLWNvbW1vbi5jCQkJXAorCWNvbmZpZy1wYXJzZXItY29tbW9uLmgJCQlcCisJY29uZmlnLXBhcnNlci10cml2aWFsLmMJCQlcCisJY29uZmlnLXBhcnNlci10cml2aWFsLmgJCQlcCisJZGVza3RvcC1maWxlLmMJCQkJXAorCWRlc2t0b3AtZmlsZS5oCQkJCVwKKwl1dGlscy5jCQkJCQlcCisJdXRpbHMuaAkJCQkJXAorCWFjdGl2YXRpb24tZXhpdC1jb2Rlcy5oCQkJXAorCWFjdGl2YXRpb24taGVscGVyLmgJICAJCVwKKwlhY3RpdmF0aW9uLWhlbHBlci5jCisKKyMjIFRoaXMgaXMgdGhlIGluc3RhbGxlZCBsYXVuY2ggaGVscGVyIHdpdGggdGhlIHNldHVpZCBjaGVja3MKK2RidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfU09VUkNFUz0JCVwKKwlhY3RpdmF0aW9uLWhlbHBlci1iaW4uYwkJCVwKKwkkKExBVU5DSF9IRUxQRVJfU09VUkNFUykKKworZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl9MREFERD0JCVwKKwkkKHRvcF9idWlsZGRpcikvZGJ1cy9saWJkYnVzLTEubGEgXAorCSQodG9wX2J1aWxkZGlyKS9kYnVzL2xpYmRidXMtaW50ZXJuYWwubGEJXAorCSQoREJVU19MQVVOQ0hFUl9MSUJTKQorCisjIyB3ZSBidWlsZCBhbm90aGVyIGJpbmFyeSBzbyB3ZSBjYW4gZG8gdGhlIGxhdW5jaCB0ZXN0aW5nIHdpdGhvdXQgcm9vdCBwcml2cy4KKyMjIERPIE5PVCBJTlNUQUxMIFRISVMgRklMRQorZGJ1c19kYWVtb25fbGF1bmNoX2hlbHBlcl90ZXN0X1NPVVJDRVM9CQlcCisJYWN0aXZhdGlvbi1oZWxwZXItYmluLmMJCQlcCisJJChMQVVOQ0hfSEVMUEVSX1NPVVJDRVMpCisKK2RidXNfZGFlbW9uX2xhdW5jaF9oZWxwZXJfdGVzdF9MREFERD0JCVwKKwkkKHRvcF9idWlsZGRpcikvZGJ1cy9saWJkYnVzLTEubGEgXAorCSQodG9wX2J1aWxkZGlyKS9kYnVzL2xpYmRidXMtaW50ZXJuYWwubGEgXAorCSQoREJVU19MQVVOQ0hFUl9MSUJTKQorCitkYnVzX2RhZW1vbl9sYXVuY2hfaGVscGVyX3Rlc3RfQ1BQRkxBR1MgPSBcCisJJChBTV9DUFBGTEFHUykgXAorCS1EQUNUSVZBVElPTl9MQVVOQ0hFUl9URVNUCisKKyMjIHdlIGJ1aWxkIHlldCBhbm90aGVyIGJpbmFyeSBzbyB3ZSBjYW4gZG8gdGhlIE9PTSB0ZXN0cworIyMgRE8gTk9UIElOU1RBTEwgVEhJUyBGSUxFCit0ZXN0X2J1c19sYXVuY2hfaGVscGVyX1NPVVJDRVM9CQlcCisJdGVzdC1sYXVuY2gtaGVscGVyLmMgICAJCVwKKwkkKExBVU5DSF9IRUxQRVJfU09VUkNFUykKKwordGVzdF9idXNfbGF1bmNoX2hlbHBlcl9MREFERD0JCVwKKwkkKHRvcF9idWlsZGRpcikvZGJ1cy9saWJkYnVzLTEubGEgXAorCSQodG9wX2J1aWxkZGlyKS9kYnVzL2xpYmRidXMtaW50ZXJuYWwubGEgXAorCSQoREJVU19MQVVOQ0hFUl9MSUJTKQorCSQoTlVMTCkKKwordGVzdF9idXNfbGF1bmNoX2hlbHBlcl9DUFBGTEFHUyA9IFwKKwkkKEFNX0NQUEZMQUdTKSBcCisJLURBQ1RJVkFUSU9OX0xBVU5DSEVSX1RFU1QJXAorCS1EQUNUSVZBVElPTl9MQVVOQ0hFUl9ET19PT00KKworbm9pbnN0X1BST0dSQU1TID0KK2RidXNfZGFlbW9uX2V4ZWNfUFJPR1JBTVMgPSBkYnVzLWRhZW1vbgoraWYgREJVU19VTklYCitsaWJleGVjX1BST0dSQU1TID0gZGJ1cy1kYWVtb24tbGF1bmNoLWhlbHBlcgorZW5kaWYgREJVU19VTklYCisKKyMjIE5vdGUgdGhhdCBURVNUUyBoYXMgc3BlY2lhbCBtZWFuaW5nIChzdHVmZiB0byB1c2UgaW4gbWFrZSBjaGVjaykuCisjIyBXZSBkb24ndCBhY3R1YWxseSB3YW50IHRvIHJ1biBhbnkgb2YgdGhlc2UgdGVzdHMgdW50aWwgdGVzdC8gaGFzIGJlZW4KKyMjIGNvbXBpbGVkLCBzbyB3ZSBkb24ndCBwdXQgdGhlbSBpbiBURVNUUyBoZXJlOyB3ZSBydW4gdGhlbSBpbiB0ZXN0LworIyMgaW5zdGVhZC4KKworaWYgREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMKKyMjIHdlIHVzZSBub2luc3RfUFJPR1JBTVMgbm90IGNoZWNrX1BST0dSQU1TIHNvIHRoYXQgd2UgYnVpbGQKKyMjIGV2ZW4gd2hlbiBub3QgZG9pbmcgIm1ha2UgY2hlY2siCisKKyMgcnVuIGFzIGEgdGVzdCBieSB0ZXN0L01ha2VmaWxlLmFtCitub2luc3RfUFJPR1JBTVMgKz0gdGVzdC1idXMKKworaWYgREJVU19VTklYCisjIHJ1biBhcyBhIHRlc3QgYnkgdGVzdC9NYWtlZmlsZS5hbQorbm9pbnN0X1BST0dSQU1TICs9IHRlc3QtYnVzLWxhdW5jaC1oZWxwZXIgdGVzdC1idXMtc3lzdGVtCisjIHRoaXMgaXMgdXNlZCBieSB0aGUgdGVzdHMgYnV0IGlzIG5vdCxpdHNlbGYsIGEgdGVzdAorbm9pbnN0X1BST0dSQU1TICs9IGRidXMtZGFlbW9uLWxhdW5jaC1oZWxwZXItdGVzdAorZW5kaWYgREJVU19VTklYCisKK2VuZGlmIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTCisKK3Rlc3RfYnVzX3N5c3RlbV9TT1VSQ0VTPQkJCVwKKwljb25maWctbG9hZGVyLWV4cGF0LmMJCQlcCisJY29uZmlnLXBhcnNlci1jb21tb24uYwkJCVwKKwljb25maWctcGFyc2VyLWNvbW1vbi5oCQkJXAorCWNvbmZpZy1wYXJzZXItdHJpdmlhbC5jCQkJXAorCWNvbmZpZy1wYXJzZXItdHJpdmlhbC5oCQkJXAorCXV0aWxzLmMJCQkJCVwKKwl1dGlscy5oCQkJCQlcCisJdGVzdC1zeXN0ZW0uYworCit0ZXN0X2J1c19zeXN0ZW1fTERBREQgPSBcCisJJCh0b3BfYnVpbGRkaXIpL2RidXMvbGliZGJ1cy0xLmxhIFwKKwkkKHRvcF9idWlsZGRpcikvZGJ1cy9saWJkYnVzLWludGVybmFsLmxhIFwKKwkkKERCVVNfQlVTX0xJQlMpIFwKKwkkKE5VTEwpCisKK3Rlc3RfYnVzX1NPVVJDRVM9CQkJCVwKKwkkKEJVU19TT1VSQ0VTKQkJCQlcCisJdGVzdC1tYWluLmMKKwordGVzdF9idXNfTERBREQgPSBcCisJJCh0b3BfYnVpbGRkaXIpL2RidXMvbGliZGJ1cy0xLmxhIFwKKwkkKHRvcF9idWlsZGRpcikvZGJ1cy9saWJkYnVzLWludGVybmFsLmxhIFwKKwkkKERCVVNfQlVTX0xJQlMpIFwKKwkkKE5VTEwpCisKK2luc3RhbGwtZGF0YS1ob29rOgorCSQobWtpbnN0YWxsZGlycykgJChERVNURElSKSQoZGJ1c2RhdGFkaXIpL3Nlc3Npb24uZAorCSQobWtpbnN0YWxsZGlycykgJChERVNURElSKSQoZGJ1c2RhdGFkaXIpL3NlcnZpY2VzCitpZiBEQlVTX1VOSVgKKwkkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkKGxvY2Fsc3RhdGVkaXIpL3J1bi9kYnVzCisJJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChkYnVzZGF0YWRpcikvc3lzdGVtLmQKKwkkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkKGRidXNkYXRhZGlyKS9zeXN0ZW0tc2VydmljZXMKK2VuZGlmCitpZiBIQVZFX1NZU1RFTUQKKyMgSW5zdGFsbCBkYnVzLnNvY2tldCBhcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIGEgRC1CdXMgc3RhY2suCisjIERlbGliZXJhdGVseSBub3QgdXNpbmcgJChMTl9TKSBoZXJlOiBsbiAtZnMgaXMgbm90IHVuaXZlcnNhbGx5IHBvcnRhYmxlLAorIyBidXQgbmVpdGhlciBpcyBzeXN0ZW1kLCBzbyBpdCdzIE9LIHRvIGFzc3VtZSBoZXJlIHRoYXQgbG4gY29tcGxpZXMgd2l0aCBTVVMuCisjIFVuY29uZGl0aW9uYWxseSBlbmFibGUgRC1CdXMgb24gc3lzdGVtZCBpbnN0YWxsYXRpb25zCisJJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChzeXN0ZW1kc3lzdGVtdW5pdGRpcikvc29ja2V0cy50YXJnZXQud2FudHMKKwlsbiAtZnMgLi4vZGJ1cy5zb2NrZXQgJChERVNURElSKSQoc3lzdGVtZHN5c3RlbXVuaXRkaXIpL3NvY2tldHMudGFyZ2V0LndhbnRzL2RidXMuc29ja2V0CisJJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChzeXN0ZW1kc3lzdGVtdW5pdGRpcikvbXVsdGktdXNlci50YXJnZXQud2FudHMKKwlsbiAtZnMgLi4vZGJ1cy5zZXJ2aWNlICQoREVTVERJUikkKHN5c3RlbWRzeXN0ZW11bml0ZGlyKS9tdWx0aS11c2VyLnRhcmdldC53YW50cy9kYnVzLnNlcnZpY2UKK2VuZGlmCitpZiBEQlVTX0VOQUJMRV9VU0VSX1NFU1NJT04KKwkkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkKHN5c3RlbWR1c2VydW5pdGRpcikvc29ja2V0cy50YXJnZXQud2FudHMKKwlsbiAtZnMgLi4vZGJ1cy5zb2NrZXQgJChERVNURElSKSQoc3lzdGVtZHVzZXJ1bml0ZGlyKS9zb2NrZXRzLnRhcmdldC53YW50cy9kYnVzLnNvY2tldAorZW5kaWYKKworaWYgREJVU19VTklYCitpbnN0YWxsLWV4ZWMtaG9vazoKKwlpZiB0ZXN0IGBpZCAtdWAgLWVxIDA7IHRoZW4gXAorCQljaG93biByb290OiQoREJVU19VU0VSKSAkKERFU1RESVIpJChsaWJleGVjZGlyKS9kYnVzLWRhZW1vbi1sYXVuY2gtaGVscGVyJChFWEVFWFQpOyBcCisJCWNobW9kIDQ3NTAgJChERVNURElSKSQobGliZXhlY2RpcikvZGJ1cy1kYWVtb24tbGF1bmNoLWhlbHBlciQoRVhFRVhUKTsgXAorCWVsc2UgXAorCQllY2hvICJOb3QgaW5zdGFsbGluZyAkKERFU1RESVIpJChsaWJleGVjZGlyKS9kYnVzLWRhZW1vbi1sYXVuY2gtaGVscGVyIGJpbmFyeSBzZXR1aWQhIjsgXAorCQllY2hvICJZb3UnbGwgbmVlZCB0byBtYW51YWxseSBzZXQgcGVybWlzc2lvbnMgdG8gcm9vdDokKERCVVNfVVNFUikgYW5kIHBlcm1pc3Npb25zIDQ3NTAiOyBcCisJZmkKK2VuZGlmCisKK0VYVFJBX0RJU1QgKz0gXAorCWRidXMuc2VydmljZS5pbiBcCisJZGJ1cy5zb2NrZXQuaW4gXAorCXN5c3RlbWQtdXNlci9kYnVzLnNlcnZpY2UuaW4gXAorCXN5c3RlbWQtdXNlci9kYnVzLnNvY2tldC5pbiBcCisJc3lzdXNlcnMuZC9kYnVzLmNvbmYuaW4gXAorCXRtcGZpbGVzLmQvZGJ1cy5jb25mLmluIFwKKwkkKE5VTEwpCisKK2lmIEhBVkVfU1lTVEVNRAorc3lzdGVtZHN5c3RlbXVuaXRfREFUQSA9IFwKKwlkYnVzLnNlcnZpY2UgXAorCWRidXMuc29ja2V0CisKK25vZGlzdF9zeXN0ZW1kc3lzdXNlcnNfREFUQSA9IFwKKwlzeXN1c2Vycy5kL2RidXMuY29uZgorCitub2Rpc3Rfc3lzdGVtZHRtcGZpbGVzX0RBVEEgPSBcCisJdG1wZmlsZXMuZC9kYnVzLmNvbmYgXAorCSQoTlVMTCkKK2VuZGlmCisKK2lmIERCVVNfRU5BQkxFX1VTRVJfU0VTU0lPTgorc3lzdGVtZHVzZXJ1bml0X0RBVEEgPSBcCisJc3lzdGVtZC11c2VyL2RidXMuc2VydmljZSBcCisJc3lzdGVtZC11c2VyL2RidXMuc29ja2V0IFwKKwkkKE5VTEwpCitlbmRpZgorCisjIEFkZCBydWxlcyBmb3IgY29kZS1jb3ZlcmFnZSB0ZXN0aW5nLCBhcyBkZWZpbmVkIGJ5IEFYX0NPREVfQ09WRVJBR0UKK2luY2x1ZGUgJCh0b3Bfc3JjZGlyKS9hbWluY2x1ZGVfc3RhdGljLmFtCmRpZmYgLS1naXQgYS9idXMvTk9USUNFIGIvYnVzL05PVElDRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTFjYTFkCi0tLSAvZGV2L251bGwKKysrIGIvYnVzL05PVElDRQpAQCAtMCwwICsxLDU1MSBAQAorRC1CdXMgaXMgbGljZW5zZWQgdG8geW91IHVuZGVyIHlvdXIgY2hvaWNlIG9mIHRoZSBBY2FkZW1pYyBGcmVlCitMaWNlbnNlIHZlcnNpb24gMi4xLCBvciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLgorQm90aCBsaWNlbnNlcyBhcmUgaW5jbHVkZWQgaGVyZS4gU29tZSBvZiB0aGUgc3RhbmRhbG9uZSBiaW5hcmllcyBhcmUKK3VuZGVyIHRoZSBHUEwgb25seTsgaW4gcGFydGljdWxhciwgYnV0IG5vdCBsaW1pdGVkIHRvLAordG9vbHMvZGJ1cy1jbGVhbnVwLXNvY2tldHMuYyBhbmQgdGVzdC9kZWNvZGUtZ2Nvdi5jLiBFYWNoIHNvdXJjZSBjb2RlCitmaWxlIGlzIG1hcmtlZCB3aXRoIHRoZSBwcm9wZXIgY29weXJpZ2h0IGluZm9ybWF0aW9uIC0gaWYgeW91IGZpbmQgYQorZmlsZSB0aGF0IGlzbid0IG1hcmtlZCBwbGVhc2UgYnJpbmcgaXQgdG8gb3VyIGF0dGVudGlvbi4KKworCitUaGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlCit2LiAyLjEKKworVGhpcyBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgKHRoZSAiTGljZW5zZSIpIGFwcGxpZXMgdG8gYW55IG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcCAodGhlICJPcmlnaW5hbCBXb3JrIikgd2hvc2Ugb3duZXIgKHRoZSAiTGljZW5zb3IiKSBoYXMgcGxhY2VkIHRoZSBmb2xsb3dpbmcgbm90aWNlIGltbWVkaWF0ZWx5IGZvbGxvd2luZyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgdGhlIE9yaWdpbmFsIFdvcms6CisKK0xpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKworMSkgR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIExpY2Vuc29yIGhlcmVieSBncmFudHMgWW91IGEKK3dvcmxkLXdpZGUsIHJveWFsdHktZnJlZSwgbm9uLWV4Y2x1c2l2ZSwgcGVycGV0dWFsLCBzdWJsaWNlbnNlYWJsZQorbGljZW5zZSB0byBkbyB0aGUgZm9sbG93aW5nOgorCithKSB0byByZXByb2R1Y2UgdGhlIE9yaWdpbmFsIFdvcmsgaW4gY29waWVzOworCitiKSB0byBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3MgKCJEZXJpdmF0aXZlIFdvcmtzIikgYmFzZWQgdXBvbiB0aGUgT3JpZ2luYWwgV29yazsKKworYykgdG8gZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIE9yaWdpbmFsIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdG8gdGhlIHB1YmxpYzsKKworZCkgdG8gcGVyZm9ybSB0aGUgT3JpZ2luYWwgV29yayBwdWJsaWNseTsgYW5kCisKK2UpIHRvIGRpc3BsYXkgdGhlIE9yaWdpbmFsIFdvcmsgcHVibGljbHkuCisKKzIpIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBMaWNlbnNvciBoZXJlYnkgZ3JhbnRzIFlvdSBhIHdvcmxkLXdpZGUsCityb3lhbHR5LWZyZWUsIG5vbi1leGNsdXNpdmUsIHBlcnBldHVhbCwgc3VibGljZW5zZWFibGUgbGljZW5zZSwgdW5kZXIKK3BhdGVudCBjbGFpbXMgb3duZWQgb3IgY29udHJvbGxlZCBieSB0aGUgTGljZW5zb3IgdGhhdCBhcmUgZW1ib2RpZWQgaW4KK3RoZSBPcmlnaW5hbCBXb3JrIGFzIGZ1cm5pc2hlZCBieSB0aGUgTGljZW5zb3IsIHRvIG1ha2UsIHVzZSwgc2VsbCBhbmQKK29mZmVyIGZvciBzYWxlIHRoZSBPcmlnaW5hbCBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzLgorCiszKSBHcmFudCBvZiBTb3VyY2UgQ29kZSBMaWNlbnNlLiBUaGUgdGVybSAiU291cmNlIENvZGUiIG1lYW5zIHRoZQorcHJlZmVycmVkIGZvcm0gb2YgdGhlIE9yaWdpbmFsIFdvcmsgZm9yIG1ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0IGFuZAorYWxsIGF2YWlsYWJsZSBkb2N1bWVudGF0aW9uIGRlc2NyaWJpbmcgaG93IHRvIG1vZGlmeSB0aGUgT3JpZ2luYWwKK1dvcmsuIExpY2Vuc29yIGhlcmVieSBhZ3JlZXMgdG8gcHJvdmlkZSBhIG1hY2hpbmUtcmVhZGFibGUgY29weSBvZiB0aGUKK1NvdXJjZSBDb2RlIG9mIHRoZSBPcmlnaW5hbCBXb3JrIGFsb25nIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBPcmlnaW5hbAorV29yayB0aGF0IExpY2Vuc29yIGRpc3RyaWJ1dGVzLiBMaWNlbnNvciByZXNlcnZlcyB0aGUgcmlnaHQgdG8gc2F0aXNmeQordGhpcyBvYmxpZ2F0aW9uIGJ5IHBsYWNpbmcgYSBtYWNoaW5lLXJlYWRhYmxlIGNvcHkgb2YgdGhlIFNvdXJjZSBDb2RlCitpbiBhbiBpbmZvcm1hdGlvbiByZXBvc2l0b3J5IHJlYXNvbmFibHkgY2FsY3VsYXRlZCB0byBwZXJtaXQKK2luZXhwZW5zaXZlIGFuZCBjb252ZW5pZW50IGFjY2VzcyBieSBZb3UgZm9yIGFzIGxvbmcgYXMgTGljZW5zb3IKK2NvbnRpbnVlcyB0byBkaXN0cmlidXRlIHRoZSBPcmlnaW5hbCBXb3JrLCBhbmQgYnkgcHVibGlzaGluZyB0aGUKK2FkZHJlc3Mgb2YgdGhhdCBpbmZvcm1hdGlvbiByZXBvc2l0b3J5IGluIGEgbm90aWNlIGltbWVkaWF0ZWx5Citmb2xsb3dpbmcgdGhlIGNvcHlyaWdodCBub3RpY2UgdGhhdCBhcHBsaWVzIHRvIHRoZSBPcmlnaW5hbCBXb3JrLgorCis0KSBFeGNsdXNpb25zIEZyb20gTGljZW5zZSBHcmFudC4gTmVpdGhlciB0aGUgbmFtZXMgb2YgTGljZW5zb3IsIG5vcgordGhlIG5hbWVzIG9mIGFueSBjb250cmlidXRvcnMgdG8gdGhlIE9yaWdpbmFsIFdvcmssIG5vciBhbnkgb2YgdGhlaXIKK3RyYWRlbWFya3Mgb3Igc2VydmljZSBtYXJrcywgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCitwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBPcmlnaW5hbCBXb3JrIHdpdGhvdXQgZXhwcmVzcyBwcmlvciB3cml0dGVuCitwZXJtaXNzaW9uIG9mIHRoZSBMaWNlbnNvci4gTm90aGluZyBpbiB0aGlzIExpY2Vuc2Ugc2hhbGwgYmUgZGVlbWVkIHRvCitncmFudCBhbnkgcmlnaHRzIHRvIHRyYWRlbWFya3MsIGNvcHlyaWdodHMsIHBhdGVudHMsIHRyYWRlIHNlY3JldHMgb3IKK2FueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgTGljZW5zb3IgZXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKK2hlcmVpbi4gTm8gcGF0ZW50IGxpY2Vuc2UgaXMgZ3JhbnRlZCB0byBtYWtlLCB1c2UsIHNlbGwgb3Igb2ZmZXIgdG8KK3NlbGwgZW1ib2RpbWVudHMgb2YgYW55IHBhdGVudCBjbGFpbXMgb3RoZXIgdGhhbiB0aGUgbGljZW5zZWQgY2xhaW1zCitkZWZpbmVkIGluIFNlY3Rpb24gMi4gTm8gcmlnaHQgaXMgZ3JhbnRlZCB0byB0aGUgdHJhZGVtYXJrcyBvZgorTGljZW5zb3IgZXZlbiBpZiBzdWNoIG1hcmtzIGFyZSBpbmNsdWRlZCBpbiB0aGUgT3JpZ2luYWwgV29yay4gTm90aGluZworaW4gdGhpcyBMaWNlbnNlIHNoYWxsIGJlIGludGVycHJldGVkIHRvIHByb2hpYml0IExpY2Vuc29yIGZyb20KK2xpY2Vuc2luZyB1bmRlciBkaWZmZXJlbnQgdGVybXMgZnJvbSB0aGlzIExpY2Vuc2UgYW55IE9yaWdpbmFsIFdvcmsKK3RoYXQgTGljZW5zb3Igb3RoZXJ3aXNlIHdvdWxkIGhhdmUgYSByaWdodCB0byBsaWNlbnNlLgorCis1KSBUaGlzIHNlY3Rpb24gaW50ZW50aW9uYWxseSBvbWl0dGVkLgorCis2KSBBdHRyaWJ1dGlvbiBSaWdodHMuIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBDb2RlIG9mIGFueQorRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBjcmVhdGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCBvciB0cmFkZW1hcmsKK25vdGljZXMgZnJvbSB0aGUgU291cmNlIENvZGUgb2YgdGhlIE9yaWdpbmFsIFdvcmssIGFzIHdlbGwgYXMgYW55Citub3RpY2VzIG9mIGxpY2Vuc2luZyBhbmQgYW55IGRlc2NyaXB0aXZlIHRleHQgaWRlbnRpZmllZCB0aGVyZWluIGFzIGFuCisiQXR0cmlidXRpb24gTm90aWNlLiIgWW91IG11c3QgY2F1c2UgdGhlIFNvdXJjZSBDb2RlIGZvciBhbnkKK0Rlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgY3JlYXRlIHRvIGNhcnJ5IGEgcHJvbWluZW50IEF0dHJpYnV0aW9uCitOb3RpY2UgcmVhc29uYWJseSBjYWxjdWxhdGVkIHRvIGluZm9ybSByZWNpcGllbnRzIHRoYXQgWW91IGhhdmUKK21vZGlmaWVkIHRoZSBPcmlnaW5hbCBXb3JrLgorCis3KSBXYXJyYW50eSBvZiBQcm92ZW5hbmNlIGFuZCBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBMaWNlbnNvcgord2FycmFudHMgdGhhdCB0aGUgY29weXJpZ2h0IGluIGFuZCB0byB0aGUgT3JpZ2luYWwgV29yayBhbmQgdGhlIHBhdGVudAorcmlnaHRzIGdyYW50ZWQgaGVyZWluIGJ5IExpY2Vuc29yIGFyZSBvd25lZCBieSB0aGUgTGljZW5zb3Igb3IgYXJlCitzdWJsaWNlbnNlZCB0byBZb3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSB3aXRoIHRoZSBwZXJtaXNzaW9uCitvZiB0aGUgY29udHJpYnV0b3Iocykgb2YgdGhvc2UgY29weXJpZ2h0cyBhbmQgcGF0ZW50IHJpZ2h0cy4gRXhjZXB0IGFzCitleHByZXNzbHkgc3RhdGVkIGluIHRoZSBpbW1lZGlhdGVseSBwcm9jZWVkaW5nIHNlbnRlbmNlLCB0aGUgT3JpZ2luYWwKK1dvcmsgaXMgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlIG9uIGFuICJBUyBJUyIgQkFTSVMgYW5kIFdJVEhPVVQKK1dBUlJBTlRZLCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwKK3RoZSB3YXJyYW50aWVzIG9mIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCitQQVJUSUNVTEFSIFBVUlBPU0UuIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBPRiBUSEUgT1JJR0lOQUwKK1dPUksgSVMgV0lUSCBZT1UuIFRoaXMgRElTQ0xBSU1FUiBPRiBXQVJSQU5UWSBjb25zdGl0dXRlcyBhbiBlc3NlbnRpYWwKK3BhcnQgb2YgdGhpcyBMaWNlbnNlLiBObyBsaWNlbnNlIHRvIE9yaWdpbmFsIFdvcmsgaXMgZ3JhbnRlZCBoZXJldW5kZXIKK2V4Y2VwdCB1bmRlciB0aGlzIGRpc2NsYWltZXIuCisKKzgpIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBVbmRlciBubyBjaXJjdW1zdGFuY2VzIGFuZCB1bmRlciBubyBsZWdhbAordGhlb3J5LCB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yCitvdGhlcndpc2UsIHNoYWxsIHRoZSBMaWNlbnNvciBiZSBsaWFibGUgdG8gYW55IHBlcnNvbiBmb3IgYW55IGRpcmVjdCwKK2luZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55CitjaGFyYWN0ZXIgYXJpc2luZyBhcyBhIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3IgdGhlIHVzZSBvZiB0aGUKK09yaWdpbmFsIFdvcmsgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGRhbWFnZXMgZm9yIGxvc3Mgb2YKK2dvb2R3aWxsLCB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kCithbGwgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3Nlcy4gVGhpcyBsaW1pdGF0aW9uIG9mIGxpYWJpbGl0eQorc2hhbGwgbm90IGFwcGx5IHRvIGxpYWJpbGl0eSBmb3IgZGVhdGggb3IgcGVyc29uYWwgaW5qdXJ5IHJlc3VsdGluZworZnJvbSBMaWNlbnNvcidzIG5lZ2xpZ2VuY2UgdG8gdGhlIGV4dGVudCBhcHBsaWNhYmxlIGxhdyBwcm9oaWJpdHMgc3VjaAorbGltaXRhdGlvbi4gU29tZSBqdXJpc2RpY3Rpb25zIGRvIG5vdCBhbGxvdyB0aGUgZXhjbHVzaW9uIG9yCitsaW1pdGF0aW9uIG9mIGluY2lkZW50YWwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzbyB0aGlzIGV4Y2x1c2lvbgorYW5kIGxpbWl0YXRpb24gbWF5IG5vdCBhcHBseSB0byBZb3UuCisKKzkpIEFjY2VwdGFuY2UgYW5kIFRlcm1pbmF0aW9uLiBJZiBZb3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCitPcmlnaW5hbCBXb3JrIG9yIGEgRGVyaXZhdGl2ZSBXb3JrLCBZb3UgbXVzdCBtYWtlIGEgcmVhc29uYWJsZSBlZmZvcnQKK3VuZGVyIHRoZSBjaXJjdW1zdGFuY2VzIHRvIG9idGFpbiB0aGUgZXhwcmVzcyBhc3NlbnQgb2YgcmVjaXBpZW50cyB0bwordGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4gTm90aGluZyBlbHNlIGJ1dCB0aGlzIExpY2Vuc2UgKG9yIGFub3RoZXIKK3dyaXR0ZW4gYWdyZWVtZW50IGJldHdlZW4gTGljZW5zb3IgYW5kIFlvdSkgZ3JhbnRzIFlvdSBwZXJtaXNzaW9uIHRvCitjcmVhdGUgRGVyaXZhdGl2ZSBXb3JrcyBiYXNlZCB1cG9uIHRoZSBPcmlnaW5hbCBXb3JrIG9yIHRvIGV4ZXJjaXNlCithbnkgb2YgdGhlIHJpZ2h0cyBncmFudGVkIGluIFNlY3Rpb24gMSBoZXJlaW4sIGFuZCBhbnkgYXR0ZW1wdCB0byBkbworc28gZXhjZXB0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UgKG9yIGFub3RoZXIgd3JpdHRlbgorYWdyZWVtZW50IGJldHdlZW4gTGljZW5zb3IgYW5kIFlvdSkgaXMgZXhwcmVzc2x5IHByb2hpYml0ZWQgYnkKK1UuUy4gY29weXJpZ2h0IGxhdywgdGhlIGVxdWl2YWxlbnQgbGF3cyBvZiBvdGhlciBjb3VudHJpZXMsIGFuZCBieQoraW50ZXJuYXRpb25hbCB0cmVhdHkuIFRoZXJlZm9yZSwgYnkgZXhlcmNpc2luZyBhbnkgb2YgdGhlIHJpZ2h0cworZ3JhbnRlZCB0byBZb3UgaW4gU2VjdGlvbiAxIGhlcmVpbiwgWW91IGluZGljYXRlIFlvdXIgYWNjZXB0YW5jZSBvZgordGhpcyBMaWNlbnNlIGFuZCBhbGwgb2YgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zLgorCisxMCkgVGVybWluYXRpb24gZm9yIFBhdGVudCBBY3Rpb24uIFRoaXMgTGljZW5zZSBzaGFsbCB0ZXJtaW5hdGUKK2F1dG9tYXRpY2FsbHkgYW5kIFlvdSBtYXkgbm8gbG9uZ2VyIGV4ZXJjaXNlIGFueSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQKK3RvIFlvdSBieSB0aGlzIExpY2Vuc2UgYXMgb2YgdGhlIGRhdGUgWW91IGNvbW1lbmNlIGFuIGFjdGlvbiwKK2luY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSwgYWdhaW5zdCBMaWNlbnNvciBvciBhbnkKK2xpY2Vuc2VlIGFsbGVnaW5nIHRoYXQgdGhlIE9yaWdpbmFsIFdvcmsgaW5mcmluZ2VzIGEgcGF0ZW50LiBUaGlzCit0ZXJtaW5hdGlvbiBwcm92aXNpb24gc2hhbGwgbm90IGFwcGx5IGZvciBhbiBhY3Rpb24gYWxsZWdpbmcgcGF0ZW50CitpbmZyaW5nZW1lbnQgYnkgY29tYmluYXRpb25zIG9mIHRoZSBPcmlnaW5hbCBXb3JrIHdpdGggb3RoZXIgc29mdHdhcmUKK29yIGhhcmR3YXJlLgorCisxMSkgSnVyaXNkaWN0aW9uLCBWZW51ZSBhbmQgR292ZXJuaW5nIExhdy4gQW55IGFjdGlvbiBvciBzdWl0IHJlbGF0aW5nCit0byB0aGlzIExpY2Vuc2UgbWF5IGJlIGJyb3VnaHQgb25seSBpbiB0aGUgY291cnRzIG9mIGEganVyaXNkaWN0aW9uCit3aGVyZWluIHRoZSBMaWNlbnNvciByZXNpZGVzIG9yIGluIHdoaWNoIExpY2Vuc29yIGNvbmR1Y3RzIGl0cyBwcmltYXJ5CitidXNpbmVzcywgYW5kIHVuZGVyIHRoZSBsYXdzIG9mIHRoYXQganVyaXNkaWN0aW9uIGV4Y2x1ZGluZyBpdHMKK2NvbmZsaWN0LW9mLWxhdyBwcm92aXNpb25zLiBUaGUgYXBwbGljYXRpb24gb2YgdGhlIFVuaXRlZCBOYXRpb25zCitDb252ZW50aW9uIG9uIENvbnRyYWN0cyBmb3IgdGhlIEludGVybmF0aW9uYWwgU2FsZSBvZiBHb29kcyBpcworZXhwcmVzc2x5IGV4Y2x1ZGVkLiBBbnkgdXNlIG9mIHRoZSBPcmlnaW5hbCBXb3JrIG91dHNpZGUgdGhlIHNjb3BlIG9mCit0aGlzIExpY2Vuc2Ugb3IgYWZ0ZXIgaXRzIHRlcm1pbmF0aW9uIHNoYWxsIGJlIHN1YmplY3QgdG8gdGhlCityZXF1aXJlbWVudHMgYW5kIHBlbmFsdGllcyBvZiB0aGUgVS5TLiBDb3B5cmlnaHQgQWN0LCAxNyBVLlMuQy4gw4LCpyAxMDEKK2V0IHNlcS4sIHRoZSBlcXVpdmFsZW50IGxhd3Mgb2Ygb3RoZXIgY291bnRyaWVzLCBhbmQgaW50ZXJuYXRpb25hbAordHJlYXR5LiBUaGlzIHNlY3Rpb24gc2hhbGwgc3Vydml2ZSB0aGUgdGVybWluYXRpb24gb2YgdGhpcyBMaWNlbnNlLgorCisxMikgQXR0b3JuZXlzIEZlZXMuIEluIGFueSBhY3Rpb24gdG8gZW5mb3JjZSB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlCitvciBzZWVraW5nIGRhbWFnZXMgcmVsYXRpbmcgdGhlcmV0bywgdGhlIHByZXZhaWxpbmcgcGFydHkgc2hhbGwgYmUKK2VudGl0bGVkIHRvIHJlY292ZXIgaXRzIGNvc3RzIGFuZCBleHBlbnNlcywgaW5jbHVkaW5nLCB3aXRob3V0CitsaW1pdGF0aW9uLCByZWFzb25hYmxlIGF0dG9ybmV5cycgZmVlcyBhbmQgY29zdHMgaW5jdXJyZWQgaW4KK2Nvbm5lY3Rpb24gd2l0aCBzdWNoIGFjdGlvbiwgaW5jbHVkaW5nIGFueSBhcHBlYWwgb2Ygc3VjaCBhY3Rpb24uIFRoaXMKK3NlY3Rpb24gc2hhbGwgc3Vydml2ZSB0aGUgdGVybWluYXRpb24gb2YgdGhpcyBMaWNlbnNlLgorCisxMykgTWlzY2VsbGFuZW91cy4gVGhpcyBMaWNlbnNlIHJlcHJlc2VudHMgdGhlIGNvbXBsZXRlIGFncmVlbWVudAorY29uY2VybmluZyB0aGUgc3ViamVjdCBtYXR0ZXIgaGVyZW9mLiBJZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZQoraXMgaGVsZCB0byBiZSB1bmVuZm9yY2VhYmxlLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCBvbmx5IHRvCit0aGUgZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIGl0IGVuZm9yY2VhYmxlLgorCisxNCkgRGVmaW5pdGlvbiBvZiAiWW91IiBpbiBUaGlzIExpY2Vuc2UuICJZb3UiIHRocm91Z2hvdXQgdGhpcworTGljZW5zZSwgd2hldGhlciBpbiB1cHBlciBvciBsb3dlciBjYXNlLCBtZWFucyBhbiBpbmRpdmlkdWFsIG9yIGEKK2xlZ2FsIGVudGl0eSBleGVyY2lzaW5nIHJpZ2h0cyB1bmRlciwgYW5kIGNvbXBseWluZyB3aXRoIGFsbCBvZiB0aGUKK3Rlcm1zIG9mLCB0aGlzIExpY2Vuc2UuIEZvciBsZWdhbCBlbnRpdGllcywgIllvdSIgaW5jbHVkZXMgYW55IGVudGl0eQordGhhdCBjb250cm9scywgaXMgY29udHJvbGxlZCBieSwgb3IgaXMgdW5kZXIgY29tbW9uIGNvbnRyb2wgd2l0aAoreW91LiBGb3IgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwKK2RpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2gKK2VudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvciBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5CitwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbAorb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgorCisxNSkgUmlnaHQgdG8gVXNlLiBZb3UgbWF5IHVzZSB0aGUgT3JpZ2luYWwgV29yayBpbiBhbGwgd2F5cyBub3QKK290aGVyd2lzZSByZXN0cmljdGVkIG9yIGNvbmRpdGlvbmVkIGJ5IHRoaXMgTGljZW5zZSBvciBieSBsYXcsIGFuZAorTGljZW5zb3IgcHJvbWlzZXMgbm90IHRvIGludGVyZmVyZSB3aXRoIG9yIGJlIHJlc3BvbnNpYmxlIGZvciBzdWNoCit1c2VzIGJ5IFlvdS4KKworVGhpcyBsaWNlbnNlIGlzIENvcHlyaWdodCAoQykgMjAwMy0yMDA0IExhd3JlbmNlIEUuIFJvc2VuLiBBbGwgcmlnaHRzCityZXNlcnZlZC4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoaXMKK2xpY2Vuc2Ugd2l0aG91dCBtb2RpZmljYXRpb24uIFRoaXMgbGljZW5zZSBtYXkgbm90IGJlIG1vZGlmaWVkIHdpdGhvdXQKK3RoZSBleHByZXNzIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBpdHMgY29weXJpZ2h0IG93bmVyLgorCisKKy0tIAorRU5EIE9GIEFDQURFTUlDIEZSRUUgTElDRU5TRS4gVGhlIGZvbGxvd2luZyBpcyBpbnRlbmRlZCB0byBkZXNjcmliZSB0aGUgZXNzZW50aWFsIAorZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIChBRkwpIHZlcnNpb24gMS4wIGFuZCBvdGhlciAKK29wZW4gc291cmNlIGxpY2Vuc2VzOgorCitUaGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIGlzIHNpbWlsYXIgdG8gdGhlIEJTRCwgTUlULCBVb0kvTkNTQSBhbmQgQXBhY2hlIAorbGljZW5zZXMgaW4gbWFueSByZXNwZWN0cyBidXQgaXQgaXMgaW50ZW5kZWQgdG8gc29sdmUgYSBmZXcgcHJvYmxlbXMgd2l0aCAKK3Rob3NlIGxpY2Vuc2VzLgorICAgIAorKiBUaGUgQUZMIGlzIHdyaXR0ZW4gc28gYXMgdG8gbWFrZSBpdCBjbGVhciB3aGF0IHNvZnR3YXJlIGlzIGJlaW5nIAorbGljZW5zZWQgKGJ5IHRoZSBpbmNsdXNpb24gb2YgYSBzdGF0ZW1lbnQgZm9sbG93aW5nIHRoZSBjb3B5cmlnaHQgbm90aWNlIAoraW4gdGhlIHNvZnR3YXJlKS4gVGhpcyB3YXksIHRoZSBsaWNlbnNlIGZ1bmN0aW9ucyBiZXR0ZXIgdGhhbiBhIHRlbXBsYXRlIAorbGljZW5zZS4gVGhlIEJTRCwgTUlUIGFuZCBVb0kvTkNTQSBsaWNlbnNlcyBhcHBseSB0byB1bmlkZW50aWZpZWQgc29mdHdhcmUuCisgICAgCisqIFRoZSBBRkwgY29udGFpbnMgYSBjb21wbGV0ZSBjb3B5cmlnaHQgZ3JhbnQgdG8gdGhlIHNvZnR3YXJlLiBUaGUgQlNEIAorYW5kIEFwYWNoZSBsaWNlbnNlcyBhcmUgdmFndWUgYW5kIGluY29tcGxldGUgaW4gdGhhdCByZXNwZWN0LgorICAgIAorKiBUaGUgQUZMIGNvbnRhaW5zIGEgY29tcGxldGUgcGF0ZW50IGdyYW50IHRvIHRoZSBzb2Z0d2FyZS4gVGhlIEJTRCwgTUlULCAKK1VvSS9OQ1NBIGFuZCBBcGFjaGUgbGljZW5zZXMgcmVseSBvbiBhbiBpbXBsaWVkIHBhdGVudCBsaWNlbnNlIGFuZCBjb250YWluIAorbm8gZXhwbGljaXQgcGF0ZW50IGdyYW50LgorICAgIAorKiBUaGUgQUZMIG1ha2VzIGl0IGNsZWFyIHRoYXQgbm8gdHJhZGVtYXJrIHJpZ2h0cyBhcmUgZ3JhbnRlZCB0byB0aGUgCitsaWNlbnNvcidzIHRyYWRlbWFya3MuIFRoZSBBcGFjaGUgbGljZW5zZSBjb250YWlucyBzdWNoIGEgcHJvdmlzaW9uLCBidXQgdGhlIAorQlNELCBNSVQgYW5kIFVvSS9OQ1NBIGxpY2Vuc2VzIGRvIG5vdC4KKyAgICAKKyogVGhlIEFGTCBpbmNsdWRlcyB0aGUgd2FycmFudHkgYnkgdGhlIGxpY2Vuc29yIHRoYXQgaXQgZWl0aGVyIG93bnMgdGhlIAorY29weXJpZ2h0IG9yIHRoYXQgaXQgaXMgZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSB1bmRlciBhIGxpY2Vuc2UuIE5vbmUgb2YgCit0aGUgb3RoZXIgbGljZW5zZXMgY29udGFpbiB0aGF0IHdhcnJhbnR5LiBBbGwgb3RoZXIgd2FycmFudGllcyBhcmUgZGlzY2xhaW1lZCwgCithcyBpcyB0aGUgY2FzZSBmb3IgdGhlIG90aGVyIGxpY2Vuc2VzLgorCisqIFRoZSBBRkwgaXMgaXRzZWxmIGNvcHlyaWdodGVkICh3aXRoIHRoZSByaWdodCBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgCit3aXRob3V0IG1vZGlmaWNhdGlvbikuIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSBvd25lciBvZiB0aGUgY29weXJpZ2h0IHRvIHRoZSAKK2xpY2Vuc2Ugd2lsbCBjb250cm9sIGNoYW5nZXMuIFRoZSBBcGFjaGUgbGljZW5zZSBjb250YWlucyBhIGNvcHlyaWdodCBub3RpY2UsIAorYnV0IHRoZSBCU0QsIE1JVCBhbmQgVW9JL05DU0EgbGljZW5zZXMgZG8gbm90LiAKKy0tCitTVEFSVCBPRiBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorLS0KKworCQkgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKKwkJICAgICAgIFZlcnNpb24gMiwgSnVuZSAxOTkxCisKKyBDb3B5cmlnaHQgKEMpIDE5ODksIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorCisgRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzCisgb2YgdGhpcyBsaWNlbnNlIGRvY3VtZW50LCBidXQgY2hhbmdpbmcgaXQgaXMgbm90IGFsbG93ZWQuCisKKwkJCSAgICBQcmVhbWJsZQorCisgIFRoZSBsaWNlbnNlcyBmb3IgbW9zdCBzb2Z0d2FyZSBhcmUgZGVzaWduZWQgdG8gdGFrZSBhd2F5IHlvdXIKK2ZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBpdC4gIEJ5IGNvbnRyYXN0LCB0aGUgR05VIEdlbmVyYWwgUHVibGljCitMaWNlbnNlIGlzIGludGVuZGVkIHRvIGd1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBmcmVlCitzb2Z0d2FyZS0tdG8gbWFrZSBzdXJlIHRoZSBzb2Z0d2FyZSBpcyBmcmVlIGZvciBhbGwgaXRzIHVzZXJzLiAgVGhpcworR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcHBsaWVzIHRvIG1vc3Qgb2YgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24ncyBzb2Z0d2FyZSBhbmQgdG8gYW55IG90aGVyIHByb2dyYW0gd2hvc2UgYXV0aG9ycyBjb21taXQgdG8KK3VzaW5nIGl0LiAgKFNvbWUgb3RoZXIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHNvZnR3YXJlIGlzIGNvdmVyZWQgYnkKK3RoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGluc3RlYWQuKSAgWW91IGNhbiBhcHBseSBpdCB0bworeW91ciBwcm9ncmFtcywgdG9vLgorCisgIFdoZW4gd2Ugc3BlYWsgb2YgZnJlZSBzb2Z0d2FyZSwgd2UgYXJlIHJlZmVycmluZyB0byBmcmVlZG9tLCBub3QKK3ByaWNlLiAgT3VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VzIGFyZSBkZXNpZ25lZCB0byBtYWtlIHN1cmUgdGhhdCB5b3UKK2hhdmUgdGhlIGZyZWVkb20gdG8gZGlzdHJpYnV0ZSBjb3BpZXMgb2YgZnJlZSBzb2Z0d2FyZSAoYW5kIGNoYXJnZSBmb3IKK3RoaXMgc2VydmljZSBpZiB5b3Ugd2lzaCksIHRoYXQgeW91IHJlY2VpdmUgc291cmNlIGNvZGUgb3IgY2FuIGdldCBpdAoraWYgeW91IHdhbnQgaXQsIHRoYXQgeW91IGNhbiBjaGFuZ2UgdGhlIHNvZnR3YXJlIG9yIHVzZSBwaWVjZXMgb2YgaXQKK2luIG5ldyBmcmVlIHByb2dyYW1zOyBhbmQgdGhhdCB5b3Uga25vdyB5b3UgY2FuIGRvIHRoZXNlIHRoaW5ncy4KKworICBUbyBwcm90ZWN0IHlvdXIgcmlnaHRzLCB3ZSBuZWVkIHRvIG1ha2UgcmVzdHJpY3Rpb25zIHRoYXQgZm9yYmlkCithbnlvbmUgdG8gZGVueSB5b3UgdGhlc2UgcmlnaHRzIG9yIHRvIGFzayB5b3UgdG8gc3VycmVuZGVyIHRoZSByaWdodHMuCitUaGVzZSByZXN0cmljdGlvbnMgdHJhbnNsYXRlIHRvIGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyBmb3IgeW91IGlmIHlvdQorZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlLCBvciBpZiB5b3UgbW9kaWZ5IGl0LgorCisgIEZvciBleGFtcGxlLCBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2Ygc3VjaCBhIHByb2dyYW0sIHdoZXRoZXIKK2dyYXRpcyBvciBmb3IgYSBmZWUsIHlvdSBtdXN0IGdpdmUgdGhlIHJlY2lwaWVudHMgYWxsIHRoZSByaWdodHMgdGhhdAoreW91IGhhdmUuICBZb3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGV5LCB0b28sIHJlY2VpdmUgb3IgY2FuIGdldCB0aGUKK3NvdXJjZSBjb2RlLiAgQW5kIHlvdSBtdXN0IHNob3cgdGhlbSB0aGVzZSB0ZXJtcyBzbyB0aGV5IGtub3cgdGhlaXIKK3JpZ2h0cy4KKworICBXZSBwcm90ZWN0IHlvdXIgcmlnaHRzIHdpdGggdHdvIHN0ZXBzOiAoMSkgY29weXJpZ2h0IHRoZSBzb2Z0d2FyZSwgYW5kCisoMikgb2ZmZXIgeW91IHRoaXMgbGljZW5zZSB3aGljaCBnaXZlcyB5b3UgbGVnYWwgcGVybWlzc2lvbiB0byBjb3B5LAorZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoZSBzb2Z0d2FyZS4KKworICBBbHNvLCBmb3IgZWFjaCBhdXRob3IncyBwcm90ZWN0aW9uIGFuZCBvdXJzLCB3ZSB3YW50IHRvIG1ha2UgY2VydGFpbgordGhhdCBldmVyeW9uZSB1bmRlcnN0YW5kcyB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IGZvciB0aGlzIGZyZWUKK3NvZnR3YXJlLiAgSWYgdGhlIHNvZnR3YXJlIGlzIG1vZGlmaWVkIGJ5IHNvbWVvbmUgZWxzZSBhbmQgcGFzc2VkIG9uLCB3ZQord2FudCBpdHMgcmVjaXBpZW50cyB0byBrbm93IHRoYXQgd2hhdCB0aGV5IGhhdmUgaXMgbm90IHRoZSBvcmlnaW5hbCwgc28KK3RoYXQgYW55IHByb2JsZW1zIGludHJvZHVjZWQgYnkgb3RoZXJzIHdpbGwgbm90IHJlZmxlY3Qgb24gdGhlIG9yaWdpbmFsCithdXRob3JzJyByZXB1dGF0aW9ucy4KKworICBGaW5hbGx5LCBhbnkgZnJlZSBwcm9ncmFtIGlzIHRocmVhdGVuZWQgY29uc3RhbnRseSBieSBzb2Z0d2FyZQorcGF0ZW50cy4gIFdlIHdpc2ggdG8gYXZvaWQgdGhlIGRhbmdlciB0aGF0IHJlZGlzdHJpYnV0b3JzIG9mIGEgZnJlZQorcHJvZ3JhbSB3aWxsIGluZGl2aWR1YWxseSBvYnRhaW4gcGF0ZW50IGxpY2Vuc2VzLCBpbiBlZmZlY3QgbWFraW5nIHRoZQorcHJvZ3JhbSBwcm9wcmlldGFyeS4gIFRvIHByZXZlbnQgdGhpcywgd2UgaGF2ZSBtYWRlIGl0IGNsZWFyIHRoYXQgYW55CitwYXRlbnQgbXVzdCBiZSBsaWNlbnNlZCBmb3IgZXZlcnlvbmUncyBmcmVlIHVzZSBvciBub3QgbGljZW5zZWQgYXQgYWxsLgorCisgIFRoZSBwcmVjaXNlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kCittb2RpZmljYXRpb24gZm9sbG93LgorDAorCQkgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBDT1BZSU5HLCBESVNUUklCVVRJT04gQU5EIE1PRElGSUNBVElPTgorCisgIDAuIFRoaXMgTGljZW5zZSBhcHBsaWVzIHRvIGFueSBwcm9ncmFtIG9yIG90aGVyIHdvcmsgd2hpY2ggY29udGFpbnMKK2Egbm90aWNlIHBsYWNlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlciBzYXlpbmcgaXQgbWF5IGJlIGRpc3RyaWJ1dGVkCit1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgVGhlICJQcm9ncmFtIiwgYmVsb3csCityZWZlcnMgdG8gYW55IHN1Y2ggcHJvZ3JhbSBvciB3b3JrLCBhbmQgYSAid29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSIKK21lYW5zIGVpdGhlciB0aGUgUHJvZ3JhbSBvciBhbnkgZGVyaXZhdGl2ZSB3b3JrIHVuZGVyIGNvcHlyaWdodCBsYXc6Cit0aGF0IGlzIHRvIHNheSwgYSB3b3JrIGNvbnRhaW5pbmcgdGhlIFByb2dyYW0gb3IgYSBwb3J0aW9uIG9mIGl0LAorZWl0aGVyIHZlcmJhdGltIG9yIHdpdGggbW9kaWZpY2F0aW9ucyBhbmQvb3IgdHJhbnNsYXRlZCBpbnRvIGFub3RoZXIKK2xhbmd1YWdlLiAgKEhlcmVpbmFmdGVyLCB0cmFuc2xhdGlvbiBpcyBpbmNsdWRlZCB3aXRob3V0IGxpbWl0YXRpb24gaW4KK3RoZSB0ZXJtICJtb2RpZmljYXRpb24iLikgIEVhY2ggbGljZW5zZWUgaXMgYWRkcmVzc2VkIGFzICJ5b3UiLgorCitBY3Rpdml0aWVzIG90aGVyIHRoYW4gY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24gYXJlIG5vdAorY292ZXJlZCBieSB0aGlzIExpY2Vuc2U7IHRoZXkgYXJlIG91dHNpZGUgaXRzIHNjb3BlLiAgVGhlIGFjdCBvZgorcnVubmluZyB0aGUgUHJvZ3JhbSBpcyBub3QgcmVzdHJpY3RlZCwgYW5kIHRoZSBvdXRwdXQgZnJvbSB0aGUgUHJvZ3JhbQoraXMgY292ZXJlZCBvbmx5IGlmIGl0cyBjb250ZW50cyBjb25zdGl0dXRlIGEgd29yayBiYXNlZCBvbiB0aGUKK1Byb2dyYW0gKGluZGVwZW5kZW50IG9mIGhhdmluZyBiZWVuIG1hZGUgYnkgcnVubmluZyB0aGUgUHJvZ3JhbSkuCitXaGV0aGVyIHRoYXQgaXMgdHJ1ZSBkZXBlbmRzIG9uIHdoYXQgdGhlIFByb2dyYW0gZG9lcy4KKworICAxLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBQcm9ncmFtJ3MKK3NvdXJjZSBjb2RlIGFzIHlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0IHlvdQorY29uc3BpY3VvdXNseSBhbmQgYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbiBhcHByb3ByaWF0ZQorY29weXJpZ2h0IG5vdGljZSBhbmQgZGlzY2xhaW1lciBvZiB3YXJyYW50eTsga2VlcCBpbnRhY3QgYWxsIHRoZQorbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSBhbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55IHdhcnJhbnR5OworYW5kIGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFByb2dyYW0gYSBjb3B5IG9mIHRoaXMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGUgUHJvZ3JhbS4KKworWW91IG1heSBjaGFyZ2UgYSBmZWUgZm9yIHRoZSBwaHlzaWNhbCBhY3Qgb2YgdHJhbnNmZXJyaW5nIGEgY29weSwgYW5kCit5b3UgbWF5IGF0IHlvdXIgb3B0aW9uIG9mZmVyIHdhcnJhbnR5IHByb3RlY3Rpb24gaW4gZXhjaGFuZ2UgZm9yIGEgZmVlLgorCisgIDIuIFlvdSBtYXkgbW9kaWZ5IHlvdXIgY29weSBvciBjb3BpZXMgb2YgdGhlIFByb2dyYW0gb3IgYW55IHBvcnRpb24KK29mIGl0LCB0aHVzIGZvcm1pbmcgYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtLCBhbmQgY29weSBhbmQKK2Rpc3RyaWJ1dGUgc3VjaCBtb2RpZmljYXRpb25zIG9yIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMQorYWJvdmUsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCBhbGwgb2YgdGhlc2UgY29uZGl0aW9uczoKKworICAgIGEpIFlvdSBtdXN0IGNhdXNlIHRoZSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgZmlsZXMgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuCisKKyAgICBiKSBZb3UgbXVzdCBjYXVzZSBhbnkgd29yayB0aGF0IHlvdSBkaXN0cmlidXRlIG9yIHB1Ymxpc2gsIHRoYXQgaW4KKyAgICB3aG9sZSBvciBpbiBwYXJ0IGNvbnRhaW5zIG9yIGlzIGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSBvciBhbnkKKyAgICBwYXJ0IHRoZXJlb2YsIHRvIGJlIGxpY2Vuc2VkIGFzIGEgd2hvbGUgYXQgbm8gY2hhcmdlIHRvIGFsbCB0aGlyZAorICAgIHBhcnRpZXMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KKworICAgIGMpIElmIHRoZSBtb2RpZmllZCBwcm9ncmFtIG5vcm1hbGx5IHJlYWRzIGNvbW1hbmRzIGludGVyYWN0aXZlbHkKKyAgICB3aGVuIHJ1biwgeW91IG11c3QgY2F1c2UgaXQsIHdoZW4gc3RhcnRlZCBydW5uaW5nIGZvciBzdWNoCisgICAgaW50ZXJhY3RpdmUgdXNlIGluIHRoZSBtb3N0IG9yZGluYXJ5IHdheSwgdG8gcHJpbnQgb3IgZGlzcGxheSBhbgorICAgIGFubm91bmNlbWVudCBpbmNsdWRpbmcgYW4gYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgYQorICAgIG5vdGljZSB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IChvciBlbHNlLCBzYXlpbmcgdGhhdCB5b3UgcHJvdmlkZQorICAgIGEgd2FycmFudHkpIGFuZCB0aGF0IHVzZXJzIG1heSByZWRpc3RyaWJ1dGUgdGhlIHByb2dyYW0gdW5kZXIKKyAgICB0aGVzZSBjb25kaXRpb25zLCBhbmQgdGVsbGluZyB0aGUgdXNlciBob3cgdG8gdmlldyBhIGNvcHkgb2YgdGhpcworICAgIExpY2Vuc2UuICAoRXhjZXB0aW9uOiBpZiB0aGUgUHJvZ3JhbSBpdHNlbGYgaXMgaW50ZXJhY3RpdmUgYnV0CisgICAgZG9lcyBub3Qgbm9ybWFsbHkgcHJpbnQgc3VjaCBhbiBhbm5vdW5jZW1lbnQsIHlvdXIgd29yayBiYXNlZCBvbgorICAgIHRoZSBQcm9ncmFtIGlzIG5vdCByZXF1aXJlZCB0byBwcmludCBhbiBhbm5vdW5jZW1lbnQuKQorDAorVGhlc2UgcmVxdWlyZW1lbnRzIGFwcGx5IHRvIHRoZSBtb2RpZmllZCB3b3JrIGFzIGEgd2hvbGUuICBJZgoraWRlbnRpZmlhYmxlIHNlY3Rpb25zIG9mIHRoYXQgd29yayBhcmUgbm90IGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSwKK2FuZCBjYW4gYmUgcmVhc29uYWJseSBjb25zaWRlcmVkIGluZGVwZW5kZW50IGFuZCBzZXBhcmF0ZSB3b3JrcyBpbgordGhlbXNlbHZlcywgdGhlbiB0aGlzIExpY2Vuc2UsIGFuZCBpdHMgdGVybXMsIGRvIG5vdCBhcHBseSB0byB0aG9zZQorc2VjdGlvbnMgd2hlbiB5b3UgZGlzdHJpYnV0ZSB0aGVtIGFzIHNlcGFyYXRlIHdvcmtzLiAgQnV0IHdoZW4geW91CitkaXN0cmlidXRlIHRoZSBzYW1lIHNlY3Rpb25zIGFzIHBhcnQgb2YgYSB3aG9sZSB3aGljaCBpcyBhIHdvcmsgYmFzZWQKK29uIHRoZSBQcm9ncmFtLCB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3aG9sZSBtdXN0IGJlIG9uIHRoZSB0ZXJtcyBvZgordGhpcyBMaWNlbnNlLCB3aG9zZSBwZXJtaXNzaW9ucyBmb3Igb3RoZXIgbGljZW5zZWVzIGV4dGVuZCB0byB0aGUKK2VudGlyZSB3aG9sZSwgYW5kIHRodXMgdG8gZWFjaCBhbmQgZXZlcnkgcGFydCByZWdhcmRsZXNzIG9mIHdobyB3cm90ZSBpdC4KKworVGh1cywgaXQgaXMgbm90IHRoZSBpbnRlbnQgb2YgdGhpcyBzZWN0aW9uIHRvIGNsYWltIHJpZ2h0cyBvciBjb250ZXN0Cit5b3VyIHJpZ2h0cyB0byB3b3JrIHdyaXR0ZW4gZW50aXJlbHkgYnkgeW91OyByYXRoZXIsIHRoZSBpbnRlbnQgaXMgdG8KK2V4ZXJjaXNlIHRoZSByaWdodCB0byBjb250cm9sIHRoZSBkaXN0cmlidXRpb24gb2YgZGVyaXZhdGl2ZSBvcgorY29sbGVjdGl2ZSB3b3JrcyBiYXNlZCBvbiB0aGUgUHJvZ3JhbS4KKworSW4gYWRkaXRpb24sIG1lcmUgYWdncmVnYXRpb24gb2YgYW5vdGhlciB3b3JrIG5vdCBiYXNlZCBvbiB0aGUgUHJvZ3JhbQord2l0aCB0aGUgUHJvZ3JhbSAob3Igd2l0aCBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0pIG9uIGEgdm9sdW1lIG9mCithIHN0b3JhZ2Ugb3IgZGlzdHJpYnV0aW9uIG1lZGl1bSBkb2VzIG5vdCBicmluZyB0aGUgb3RoZXIgd29yayB1bmRlcgordGhlIHNjb3BlIG9mIHRoaXMgTGljZW5zZS4KKworICAzLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGEgd29yayBiYXNlZCBvbiBpdCwKK3VuZGVyIFNlY3Rpb24gMikgaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHVuZGVyIHRoZSB0ZXJtcyBvZgorU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIGRvIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorCisgICAgYSkgQWNjb21wYW55IGl0IHdpdGggdGhlIGNvbXBsZXRlIGNvcnJlc3BvbmRpbmcgbWFjaGluZS1yZWFkYWJsZQorICAgIHNvdXJjZSBjb2RlLCB3aGljaCBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucworICAgIDEgYW5kIDIgYWJvdmUgb24gYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAorCisgICAgYikgQWNjb21wYW55IGl0IHdpdGggYSB3cml0dGVuIG9mZmVyLCB2YWxpZCBmb3IgYXQgbGVhc3QgdGhyZWUKKyAgICB5ZWFycywgdG8gZ2l2ZSBhbnkgdGhpcmQgcGFydHksIGZvciBhIGNoYXJnZSBubyBtb3JlIHRoYW4geW91cgorICAgIGNvc3Qgb2YgcGh5c2ljYWxseSBwZXJmb3JtaW5nIHNvdXJjZSBkaXN0cmlidXRpb24sIGEgY29tcGxldGUKKyAgICBtYWNoaW5lLXJlYWRhYmxlIGNvcHkgb2YgdGhlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUsIHRvIGJlCisgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgb24gYSBtZWRpdW0KKyAgICBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCisKKyAgICBjKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgaW5mb3JtYXRpb24geW91IHJlY2VpdmVkIGFzIHRvIHRoZSBvZmZlcgorICAgIHRvIGRpc3RyaWJ1dGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZS4gIChUaGlzIGFsdGVybmF0aXZlIGlzCisgICAgYWxsb3dlZCBvbmx5IGZvciBub25jb21tZXJjaWFsIGRpc3RyaWJ1dGlvbiBhbmQgb25seSBpZiB5b3UKKyAgICByZWNlaXZlZCB0aGUgcHJvZ3JhbSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gd2l0aCBzdWNoCisgICAgYW4gb2ZmZXIsIGluIGFjY29yZCB3aXRoIFN1YnNlY3Rpb24gYiBhYm92ZS4pCisKK1RoZSBzb3VyY2UgY29kZSBmb3IgYSB3b3JrIG1lYW5zIHRoZSBwcmVmZXJyZWQgZm9ybSBvZiB0aGUgd29yayBmb3IKK21ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0LiAgRm9yIGFuIGV4ZWN1dGFibGUgd29yaywgY29tcGxldGUgc291cmNlCitjb2RlIG1lYW5zIGFsbCB0aGUgc291cmNlIGNvZGUgZm9yIGFsbCBtb2R1bGVzIGl0IGNvbnRhaW5zLCBwbHVzIGFueQorYXNzb2NpYXRlZCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmaWxlcywgcGx1cyB0aGUgc2NyaXB0cyB1c2VkIHRvCitjb250cm9sIGNvbXBpbGF0aW9uIGFuZCBpbnN0YWxsYXRpb24gb2YgdGhlIGV4ZWN1dGFibGUuICBIb3dldmVyLCBhcyBhCitzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGVkIG5lZWQgbm90IGluY2x1ZGUKK2FueXRoaW5nIHRoYXQgaXMgbm9ybWFsbHkgZGlzdHJpYnV0ZWQgKGluIGVpdGhlciBzb3VyY2Ugb3IgYmluYXJ5Citmb3JtKSB3aXRoIHRoZSBtYWpvciBjb21wb25lbnRzIChjb21waWxlciwga2VybmVsLCBhbmQgc28gb24pIG9mIHRoZQorb3BlcmF0aW5nIHN5c3RlbSBvbiB3aGljaCB0aGUgZXhlY3V0YWJsZSBydW5zLCB1bmxlc3MgdGhhdCBjb21wb25lbnQKK2l0c2VsZiBhY2NvbXBhbmllcyB0aGUgZXhlY3V0YWJsZS4KKworSWYgZGlzdHJpYnV0aW9uIG9mIGV4ZWN1dGFibGUgb3Igb2JqZWN0IGNvZGUgaXMgbWFkZSBieSBvZmZlcmluZworYWNjZXNzIHRvIGNvcHkgZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIHRoZW4gb2ZmZXJpbmcgZXF1aXZhbGVudAorYWNjZXNzIHRvIGNvcHkgdGhlIHNvdXJjZSBjb2RlIGZyb20gdGhlIHNhbWUgcGxhY2UgY291bnRzIGFzCitkaXN0cmlidXRpb24gb2YgdGhlIHNvdXJjZSBjb2RlLCBldmVuIHRob3VnaCB0aGlyZCBwYXJ0aWVzIGFyZSBub3QKK2NvbXBlbGxlZCB0byBjb3B5IHRoZSBzb3VyY2UgYWxvbmcgd2l0aCB0aGUgb2JqZWN0IGNvZGUuCisMCisgIDQuIFlvdSBtYXkgbm90IGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQorZXhjZXB0IGFzIGV4cHJlc3NseSBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBBbnkgYXR0ZW1wdAorb3RoZXJ3aXNlIHRvIGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGlzCit2b2lkLCBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSB5b3VyIHJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UuCitIb3dldmVyLCBwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkIGNvcGllcywgb3IgcmlnaHRzLCBmcm9tIHlvdSB1bmRlcgordGhpcyBMaWNlbnNlIHdpbGwgbm90IGhhdmUgdGhlaXIgbGljZW5zZXMgdGVybWluYXRlZCBzbyBsb25nIGFzIHN1Y2gKK3BhcnRpZXMgcmVtYWluIGluIGZ1bGwgY29tcGxpYW5jZS4KKworICA1LiBZb3UgYXJlIG5vdCByZXF1aXJlZCB0byBhY2NlcHQgdGhpcyBMaWNlbnNlLCBzaW5jZSB5b3UgaGF2ZSBub3QKK3NpZ25lZCBpdC4gIEhvd2V2ZXIsIG5vdGhpbmcgZWxzZSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gbW9kaWZ5IG9yCitkaXN0cmlidXRlIHRoZSBQcm9ncmFtIG9yIGl0cyBkZXJpdmF0aXZlIHdvcmtzLiAgVGhlc2UgYWN0aW9ucyBhcmUKK3Byb2hpYml0ZWQgYnkgbGF3IGlmIHlvdSBkbyBub3QgYWNjZXB0IHRoaXMgTGljZW5zZS4gIFRoZXJlZm9yZSwgYnkKK21vZGlmeWluZyBvciBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQorUHJvZ3JhbSksIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLCBhbmQKK2FsbCBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGluZyBvciBtb2RpZnlpbmcKK3RoZSBQcm9ncmFtIG9yIHdvcmtzIGJhc2VkIG9uIGl0LgorCisgIDYuIEVhY2ggdGltZSB5b3UgcmVkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKK1Byb2dyYW0pLCB0aGUgcmVjaXBpZW50IGF1dG9tYXRpY2FsbHkgcmVjZWl2ZXMgYSBsaWNlbnNlIGZyb20gdGhlCitvcmlnaW5hbCBsaWNlbnNvciB0byBjb3B5LCBkaXN0cmlidXRlIG9yIG1vZGlmeSB0aGUgUHJvZ3JhbSBzdWJqZWN0IHRvCit0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIFlvdSBtYXkgbm90IGltcG9zZSBhbnkgZnVydGhlcgorcmVzdHJpY3Rpb25zIG9uIHRoZSByZWNpcGllbnRzJyBleGVyY2lzZSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZWluLgorWW91IGFyZSBub3QgcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJkIHBhcnRpZXMgdG8KK3RoaXMgTGljZW5zZS4KKworICA3LiBJZiwgYXMgYSBjb25zZXF1ZW5jZSBvZiBhIGNvdXJ0IGp1ZGdtZW50IG9yIGFsbGVnYXRpb24gb2YgcGF0ZW50CitpbmZyaW5nZW1lbnQgb3IgZm9yIGFueSBvdGhlciByZWFzb24gKG5vdCBsaW1pdGVkIHRvIHBhdGVudCBpc3N1ZXMpLAorY29uZGl0aW9ucyBhcmUgaW1wb3NlZCBvbiB5b3UgKHdoZXRoZXIgYnkgY291cnQgb3JkZXIsIGFncmVlbWVudCBvcgorb3RoZXJ3aXNlKSB0aGF0IGNvbnRyYWRpY3QgdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLCB0aGV5IGRvIG5vdAorZXhjdXNlIHlvdSBmcm9tIHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZS4gIElmIHlvdSBjYW5ub3QKK2Rpc3RyaWJ1dGUgc28gYXMgdG8gc2F0aXNmeSBzaW11bHRhbmVvdXNseSB5b3VyIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMKK0xpY2Vuc2UgYW5kIGFueSBvdGhlciBwZXJ0aW5lbnQgb2JsaWdhdGlvbnMsIHRoZW4gYXMgYSBjb25zZXF1ZW5jZSB5b3UKK21heSBub3QgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBhdCBhbGwuICBGb3IgZXhhbXBsZSwgaWYgYSBwYXRlbnQKK2xpY2Vuc2Ugd291bGQgbm90IHBlcm1pdCByb3lhbHR5LWZyZWUgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYnkKK2FsbCB0aG9zZSB3aG8gcmVjZWl2ZSBjb3BpZXMgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB0aHJvdWdoIHlvdSwgdGhlbgordGhlIG9ubHkgd2F5IHlvdSBjb3VsZCBzYXRpc2Z5IGJvdGggaXQgYW5kIHRoaXMgTGljZW5zZSB3b3VsZCBiZSB0bworcmVmcmFpbiBlbnRpcmVseSBmcm9tIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbS4KKworSWYgYW55IHBvcnRpb24gb2YgdGhpcyBzZWN0aW9uIGlzIGhlbGQgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyCithbnkgcGFydGljdWxhciBjaXJjdW1zdGFuY2UsIHRoZSBiYWxhbmNlIG9mIHRoZSBzZWN0aW9uIGlzIGludGVuZGVkIHRvCithcHBseSBhbmQgdGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhcHBseSBpbiBvdGhlcgorY2lyY3Vtc3RhbmNlcy4KKworSXQgaXMgbm90IHRoZSBwdXJwb3NlIG9mIHRoaXMgc2VjdGlvbiB0byBpbmR1Y2UgeW91IHRvIGluZnJpbmdlIGFueQorcGF0ZW50cyBvciBvdGhlciBwcm9wZXJ0eSByaWdodCBjbGFpbXMgb3IgdG8gY29udGVzdCB2YWxpZGl0eSBvZiBhbnkKK3N1Y2ggY2xhaW1zOyB0aGlzIHNlY3Rpb24gaGFzIHRoZSBzb2xlIHB1cnBvc2Ugb2YgcHJvdGVjdGluZyB0aGUKK2ludGVncml0eSBvZiB0aGUgZnJlZSBzb2Z0d2FyZSBkaXN0cmlidXRpb24gc3lzdGVtLCB3aGljaCBpcworaW1wbGVtZW50ZWQgYnkgcHVibGljIGxpY2Vuc2UgcHJhY3RpY2VzLiAgTWFueSBwZW9wbGUgaGF2ZSBtYWRlCitnZW5lcm91cyBjb250cmlidXRpb25zIHRvIHRoZSB3aWRlIHJhbmdlIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkCit0aHJvdWdoIHRoYXQgc3lzdGVtIGluIHJlbGlhbmNlIG9uIGNvbnNpc3RlbnQgYXBwbGljYXRpb24gb2YgdGhhdAorc3lzdGVtOyBpdCBpcyB1cCB0byB0aGUgYXV0aG9yL2Rvbm9yIHRvIGRlY2lkZSBpZiBoZSBvciBzaGUgaXMgd2lsbGluZwordG8gZGlzdHJpYnV0ZSBzb2Z0d2FyZSB0aHJvdWdoIGFueSBvdGhlciBzeXN0ZW0gYW5kIGEgbGljZW5zZWUgY2Fubm90CitpbXBvc2UgdGhhdCBjaG9pY2UuCisKK1RoaXMgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBtYWtlIHRob3JvdWdobHkgY2xlYXIgd2hhdCBpcyBiZWxpZXZlZCB0bworYmUgYSBjb25zZXF1ZW5jZSBvZiB0aGUgcmVzdCBvZiB0aGlzIExpY2Vuc2UuCisMCisgIDguIElmIHRoZSBkaXN0cmlidXRpb24gYW5kL29yIHVzZSBvZiB0aGUgUHJvZ3JhbSBpcyByZXN0cmljdGVkIGluCitjZXJ0YWluIGNvdW50cmllcyBlaXRoZXIgYnkgcGF0ZW50cyBvciBieSBjb3B5cmlnaHRlZCBpbnRlcmZhY2VzLCB0aGUKK29yaWdpbmFsIGNvcHlyaWdodCBob2xkZXIgd2hvIHBsYWNlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIExpY2Vuc2UKK21heSBhZGQgYW4gZXhwbGljaXQgZ2VvZ3JhcGhpY2FsIGRpc3RyaWJ1dGlvbiBsaW1pdGF0aW9uIGV4Y2x1ZGluZwordGhvc2UgY291bnRyaWVzLCBzbyB0aGF0IGRpc3RyaWJ1dGlvbiBpcyBwZXJtaXR0ZWQgb25seSBpbiBvciBhbW9uZworY291bnRyaWVzIG5vdCB0aHVzIGV4Y2x1ZGVkLiAgSW4gc3VjaCBjYXNlLCB0aGlzIExpY2Vuc2UgaW5jb3Jwb3JhdGVzCit0aGUgbGltaXRhdGlvbiBhcyBpZiB3cml0dGVuIGluIHRoZSBib2R5IG9mIHRoaXMgTGljZW5zZS4KKworICA5LiBUaGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldyB2ZXJzaW9ucworb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuICBTdWNoIG5ldyB2ZXJzaW9ucyB3aWxsCitiZSBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJzaW9uLCBidXQgbWF5IGRpZmZlciBpbiBkZXRhaWwgdG8KK2FkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLgorCitFYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIElmIHRoZSBQcm9ncmFtCitzcGVjaWZpZXMgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIExpY2Vuc2Ugd2hpY2ggYXBwbGllcyB0byBpdCBhbmQgImFueQorbGF0ZXIgdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworZWl0aGVyIG9mIHRoYXQgdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24uICBJZiB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBzcGVjaWZ5IGEgdmVyc2lvbiBudW1iZXIgb2YKK3RoaXMgTGljZW5zZSwgeW91IG1heSBjaG9vc2UgYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24uCisKKyAgMTAuIElmIHlvdSB3aXNoIHRvIGluY29ycG9yYXRlIHBhcnRzIG9mIHRoZSBQcm9ncmFtIGludG8gb3RoZXIgZnJlZQorcHJvZ3JhbXMgd2hvc2UgZGlzdHJpYnV0aW9uIGNvbmRpdGlvbnMgYXJlIGRpZmZlcmVudCwgd3JpdGUgdG8gdGhlIGF1dGhvcgordG8gYXNrIGZvciBwZXJtaXNzaW9uLiAgRm9yIHNvZnR3YXJlIHdoaWNoIGlzIGNvcHlyaWdodGVkIGJ5IHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB3ZSBzb21ldGltZXMKK21ha2UgZXhjZXB0aW9ucyBmb3IgdGhpcy4gIE91ciBkZWNpc2lvbiB3aWxsIGJlIGd1aWRlZCBieSB0aGUgdHdvIGdvYWxzCitvZiBwcmVzZXJ2aW5nIHRoZSBmcmVlIHN0YXR1cyBvZiBhbGwgZGVyaXZhdGl2ZXMgb2Ygb3VyIGZyZWUgc29mdHdhcmUgYW5kCitvZiBwcm9tb3RpbmcgdGhlIHNoYXJpbmcgYW5kIHJldXNlIG9mIHNvZnR3YXJlIGdlbmVyYWxseS4KKworCQkJICAgIE5PIFdBUlJBTlRZCisKKyAgMTEuIEJFQ0FVU0UgVEhFIFBST0dSQU0gSVMgTElDRU5TRUQgRlJFRSBPRiBDSEFSR0UsIFRIRVJFIElTIE5PIFdBUlJBTlRZCitGT1IgVEhFIFBST0dSQU0sIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVEIEJZIEFQUExJQ0FCTEUgTEFXLiAgRVhDRVBUIFdIRU4KK09USEVSV0lTRSBTVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EL09SIE9USEVSIFBBUlRJRVMKK1BST1ZJREUgVEhFIFBST0dSQU0gIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VECitPUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFRIRSBFTlRJUkUgUklTSyBBUworVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBQUk9HUkFNIElTIFdJVEggWU9VLiAgU0hPVUxEIFRIRQorUFJPR1JBTSBQUk9WRSBERUZFQ1RJVkUsIFlPVSBBU1NVTUUgVEhFIENPU1QgT0YgQUxMIE5FQ0VTU0FSWSBTRVJWSUNJTkcsCitSRVBBSVIgT1IgQ09SUkVDVElPTi4KKworICAxMi4gSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIE9SIEFHUkVFRCBUTyBJTiBXUklUSU5HCitXSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1BWSBNT0RJRlkgQU5EL09SCitSRURJU1RSSUJVVEUgVEhFIFBST0dSQU0gQVMgUEVSTUlUVEVEIEFCT1ZFLCBCRSBMSUFCTEUgVE8gWU9VIEZPUiBEQU1BR0VTLAorSU5DTFVESU5HIEFOWSBHRU5FUkFMLCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HCitPVVQgT0YgVEhFIFVTRSBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRSBQUk9HUkFNIChJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVECitUTyBMT1NTIE9GIERBVEEgT1IgREFUQSBCRUlORyBSRU5ERVJFRCBJTkFDQ1VSQVRFIE9SIExPU1NFUyBTVVNUQUlORUQgQlkKK1lPVSBPUiBUSElSRCBQQVJUSUVTIE9SIEEgRkFJTFVSRSBPRiBUSEUgUFJPR1JBTSBUTyBPUEVSQVRFIFdJVEggQU5ZIE9USEVSCitQUk9HUkFNUyksIEVWRU4gSUYgU1VDSCBIT0xERVIgT1IgT1RIRVIgUEFSVFkgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUKK1BPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKworCQkgICAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworDAorCSAgICBIb3cgdG8gQXBwbHkgVGhlc2UgVGVybXMgdG8gWW91ciBOZXcgUHJvZ3JhbXMKKworICBJZiB5b3UgZGV2ZWxvcCBhIG5ldyBwcm9ncmFtLCBhbmQgeW91IHdhbnQgaXQgdG8gYmUgb2YgdGhlIGdyZWF0ZXN0Citwb3NzaWJsZSB1c2UgdG8gdGhlIHB1YmxpYywgdGhlIGJlc3Qgd2F5IHRvIGFjaGlldmUgdGhpcyBpcyB0byBtYWtlIGl0CitmcmVlIHNvZnR3YXJlIHdoaWNoIGV2ZXJ5b25lIGNhbiByZWRpc3RyaWJ1dGUgYW5kIGNoYW5nZSB1bmRlciB0aGVzZSB0ZXJtcy4KKworICBUbyBkbyBzbywgYXR0YWNoIHRoZSBmb2xsb3dpbmcgbm90aWNlcyB0byB0aGUgcHJvZ3JhbS4gIEl0IGlzIHNhZmVzdAordG8gYXR0YWNoIHRoZW0gdG8gdGhlIHN0YXJ0IG9mIGVhY2ggc291cmNlIGZpbGUgdG8gbW9zdCBlZmZlY3RpdmVseQorY29udmV5IHRoZSBleGNsdXNpb24gb2Ygd2FycmFudHk7IGFuZCBlYWNoIGZpbGUgc2hvdWxkIGhhdmUgYXQgbGVhc3QKK3RoZSAiY29weXJpZ2h0IiBsaW5lIGFuZCBhIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGZ1bGwgbm90aWNlIGlzIGZvdW5kLgorCisgICAgPG9uZSBsaW5lIHRvIGdpdmUgdGhlIHByb2dyYW0ncyBuYW1lIGFuZCBhIGJyaWVmIGlkZWEgb2Ygd2hhdCBpdCBkb2VzLj4KKyAgICBDb3B5cmlnaHQgKEMpIDx5ZWFyPiAgPG5hbWUgb2YgYXV0aG9yPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorCisKK0Fsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLgorCitJZiB0aGUgcHJvZ3JhbSBpcyBpbnRlcmFjdGl2ZSwgbWFrZSBpdCBvdXRwdXQgYSBzaG9ydCBub3RpY2UgbGlrZSB0aGlzCit3aGVuIGl0IHN0YXJ0cyBpbiBhbiBpbnRlcmFjdGl2ZSBtb2RlOgorCisgICAgR25vbW92aXNpb24gdmVyc2lvbiA2OSwgQ29weXJpZ2h0IChDKSB5ZWFyIG5hbWUgb2YgYXV0aG9yCisgICAgR25vbW92aXNpb24gY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZOyBmb3IgZGV0YWlscyB0eXBlIGBzaG93IHcnLgorICAgIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZSwgYW5kIHlvdSBhcmUgd2VsY29tZSB0byByZWRpc3RyaWJ1dGUgaXQKKyAgICB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnM7IHR5cGUgYHNob3cgYycgZm9yIGRldGFpbHMuCisKK1RoZSBoeXBvdGhldGljYWwgY29tbWFuZHMgYHNob3cgdycgYW5kIGBzaG93IGMnIHNob3VsZCBzaG93IHRoZSBhcHByb3ByaWF0ZQorcGFydHMgb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBPZiBjb3Vyc2UsIHRoZSBjb21tYW5kcyB5b3UgdXNlIG1heQorYmUgY2FsbGVkIHNvbWV0aGluZyBvdGhlciB0aGFuIGBzaG93IHcnIGFuZCBgc2hvdyBjJzsgdGhleSBjb3VsZCBldmVuIGJlCittb3VzZS1jbGlja3Mgb3IgbWVudSBpdGVtcy0td2hhdGV2ZXIgc3VpdHMgeW91ciBwcm9ncmFtLgorCitZb3Ugc2hvdWxkIGFsc28gZ2V0IHlvdXIgZW1wbG95ZXIgKGlmIHlvdSB3b3JrIGFzIGEgcHJvZ3JhbW1lcikgb3IgeW91cgorc2Nob29sLCBpZiBhbnksIHRvIHNpZ24gYSAiY29weXJpZ2h0IGRpc2NsYWltZXIiIGZvciB0aGUgcHJvZ3JhbSwgaWYKK25lY2Vzc2FyeS4gIEhlcmUgaXMgYSBzYW1wbGU7IGFsdGVyIHRoZSBuYW1lczoKKworICBZb3lvZHluZSwgSW5jLiwgaGVyZWJ5IGRpc2NsYWltcyBhbGwgY29weXJpZ2h0IGludGVyZXN0IGluIHRoZSBwcm9ncmFtCisgIGBHbm9tb3Zpc2lvbicgKHdoaWNoIG1ha2VzIHBhc3NlcyBhdCBjb21waWxlcnMpIHdyaXR0ZW4gYnkgSmFtZXMgSGFja2VyLgorCisgIDxzaWduYXR1cmUgb2YgVHkgQ29vbj4sIDEgQXByaWwgMTk4OQorICBUeSBDb29uLCBQcmVzaWRlbnQgb2YgVmljZQorCitUaGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZG9lcyBub3QgcGVybWl0IGluY29ycG9yYXRpbmcgeW91ciBwcm9ncmFtIGludG8KK3Byb3ByaWV0YXJ5IHByb2dyYW1zLiAgSWYgeW91ciBwcm9ncmFtIGlzIGEgc3Vicm91dGluZSBsaWJyYXJ5LCB5b3UgbWF5Citjb25zaWRlciBpdCBtb3JlIHVzZWZ1bCB0byBwZXJtaXQgbGlua2luZyBwcm9wcmlldGFyeSBhcHBsaWNhdGlvbnMgd2l0aCB0aGUKK2xpYnJhcnkuICBJZiB0aGlzIGlzIHdoYXQgeW91IHdhbnQgdG8gZG8sIHVzZSB0aGUgR05VIExpYnJhcnkgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgaW5zdGVhZCBvZiB0aGlzIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9idXMvYWN0aXZhdGlvbi1leGl0LWNvZGVzLmggYi9idXMvYWN0aXZhdGlvbi1leGl0LWNvZGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJiOThkYwotLS0gL2Rldi9udWxsCisrKyBiL2J1cy9hY3RpdmF0aW9uLWV4aXQtY29kZXMuaApAQCAtMCwwICsxLDQ1IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGFjdGl2YXRpb24tZXhpdC1jb2Rlcy5oICBSZXR1cm4gdmFsdWVzIGZvciB0aGUgbGF1bmNoIGhlbHBlciB3aGljaCBpcyBzZXQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgaGVscGVyIGFuZCByZWFkIGluIGRidXMtc3Bhd24uCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBCVVNfQUNUSVZBVElPTl9FWElUX0NPREVTX0gKKyNkZWZpbmUgQlVTX0FDVElWQVRJT05fRVhJVF9DT0RFU19ICisKKy8qKiBSZXR1cm4gY29kZXMgZnJvbSB0aGUgbGF1bmNoIGhlbHBlciAtIG5vdCBwdWJsaWMgQVBJLiBIb3dldmVyLAorICogIHByZXN1bWFibHkgaWYgc29tZSB0aGlyZCBwYXJ0eSBkaWQgd3JpdGUgdGhlaXIgb3duIGxhdW5jaCBoZWxwZXIsCisgKiAgdGhleSB3b3VsZCBoYXZlIHRvIHJlbHkgb24gdGhlc2UsIG9yIGF0IGxlYXN0IGFsd2F5cyByZXR1cm4KKyAqICAxIGZvciBHRU5FUklDX0ZBSUxVUkUuCisgKi8KKyNkZWZpbmUgQlVTX1NQQVdOX0VYSVRfQ09ERV9HRU5FUklDX0ZBSUxVUkUgICAgICAxCisjZGVmaW5lIEJVU19TUEFXTl9FWElUX0NPREVfTk9fTUVNT1JZICAgICAgICAgICAgMgorI2RlZmluZSBCVVNfU1BBV05fRVhJVF9DT0RFX0NPTkZJR19JTlZBTElEICAgICAgIDMKKyNkZWZpbmUgQlVTX1NQQVdOX0VYSVRfQ09ERV9TRVRVUF9GQUlMRUQgICAgICAgICA0CisjZGVmaW5lIEJVU19TUEFXTl9FWElUX0NPREVfTkFNRV9JTlZBTElEICAgICAgICAgNQorI2RlZmluZSBCVVNfU1BBV05fRVhJVF9DT0RFX1NFUlZJQ0VfTk9UX0ZPVU5EICAgIDYKKyNkZWZpbmUgQlVTX1NQQVdOX0VYSVRfQ09ERV9QRVJNSVNTSU9OU19JTlZBTElEICA3CisjZGVmaW5lIEJVU19TUEFXTl9FWElUX0NPREVfRklMRV9JTlZBTElEICAgICAgICAgOAorI2RlZmluZSBCVVNfU1BBV05fRVhJVF9DT0RFX0VYRUNfRkFJTEVEICAgICAgICAgIDkKKyNkZWZpbmUgQlVTX1NQQVdOX0VYSVRfQ09ERV9JTlZBTElEX0FSR1MgICAgICAgICAxMAorI2RlZmluZSBCVVNfU1BBV05fRVhJVF9DT0RFX0NISUxEX1NJR05BTEVEICAgICAgIDExCisKKyNlbmRpZiAvKiBCVVNfQUNUSVZBVElPTl9FWElUX0NPREVTX0ggKi8KZGlmZiAtLWdpdCBhL2J1cy9hY3RpdmF0aW9uLWhlbHBlci1iaW4uYyBiL2J1cy9hY3RpdmF0aW9uLWhlbHBlci1iaW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWYxNmQyCi0tLSAvZGV2L251bGwKKysrIGIvYnVzL2FjdGl2YXRpb24taGVscGVyLWJpbi5jCkBAIC0wLDAgKzEsMTAzIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGFjdGl2YXRpb24taGVscGVyLWJpbi5jICBTZXR1aWQgaGVscGVyIGZvciBsYXVuY2hpbmcgcHJvZ3JhbXMgYXMgYSBjdXN0b20KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLiBUaGlzIGZpbGUgaXMgc2VjdXJpdHkgc2Vuc2l0aXZlLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisKKyNpbmNsdWRlICJ1dGlscy5oIgorI2luY2x1ZGUgImFjdGl2YXRpb24taGVscGVyLmgiCisjaW5jbHVkZSAiYWN0aXZhdGlvbi1leGl0LWNvZGVzLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCitzdGF0aWMgaW50Citjb252ZXJ0X2Vycm9yX3RvX2V4aXRfY29kZSAoREJ1c0Vycm9yICplcnJvcikKK3sKKyAgaWYgKGRidXNfZXJyb3JfaGFzX25hbWUgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSkpCisgICAgcmV0dXJuIEJVU19TUEFXTl9FWElUX0NPREVfTk9fTUVNT1JZOworCisgIGlmIChkYnVzX2Vycm9yX2hhc19uYW1lIChlcnJvciwgREJVU19FUlJPUl9TUEFXTl9DT05GSUdfSU5WQUxJRCkpCisgICAgcmV0dXJuIEJVU19TUEFXTl9FWElUX0NPREVfQ09ORklHX0lOVkFMSUQ7CisKKyAgaWYgKGRidXNfZXJyb3JfaGFzX25hbWUgKGVycm9yLCBEQlVTX0VSUk9SX1NQQVdOX1NFVFVQX0ZBSUxFRCkpCisgICAgcmV0dXJuIEJVU19TUEFXTl9FWElUX0NPREVfU0VUVVBfRkFJTEVEOworCisgIGlmIChkYnVzX2Vycm9yX2hhc19uYW1lIChlcnJvciwgREJVU19FUlJPUl9TUEFXTl9TRVJWSUNFX0lOVkFMSUQpKQorICAgIHJldHVybiBCVVNfU1BBV05fRVhJVF9DT0RFX05BTUVfSU5WQUxJRDsKKworICBpZiAoZGJ1c19lcnJvcl9oYXNfbmFtZSAoZXJyb3IsIERCVVNfRVJST1JfU1BBV05fU0VSVklDRV9OT1RfRk9VTkQpKQorICAgIHJldHVybiBCVVNfU1BBV05fRVhJVF9DT0RFX1NFUlZJQ0VfTk9UX0ZPVU5EOworCisgIGlmIChkYnVzX2Vycm9yX2hhc19uYW1lIChlcnJvciwgREJVU19FUlJPUl9TUEFXTl9QRVJNSVNTSU9OU19JTlZBTElEKSkKKyAgICByZXR1cm4gQlVTX1NQQVdOX0VYSVRfQ09ERV9QRVJNSVNTSU9OU19JTlZBTElEOworCisgIGlmIChkYnVzX2Vycm9yX2hhc19uYW1lIChlcnJvciwgREJVU19FUlJPUl9TUEFXTl9GSUxFX0lOVkFMSUQpKQorICAgIHJldHVybiBCVVNfU1BBV05fRVhJVF9DT0RFX0ZJTEVfSU5WQUxJRDsKKworICBpZiAoZGJ1c19lcnJvcl9oYXNfbmFtZSAoZXJyb3IsIERCVVNfRVJST1JfU1BBV05fRVhFQ19GQUlMRUQpKQorICAgIHJldHVybiBCVVNfU1BBV05fRVhJVF9DT0RFX0VYRUNfRkFJTEVEOworCisgIGlmIChkYnVzX2Vycm9yX2hhc19uYW1lIChlcnJvciwgREJVU19FUlJPUl9JTlZBTElEX0FSR1MpKQorICAgIHJldHVybiBCVVNfU1BBV05fRVhJVF9DT0RFX0lOVkFMSURfQVJHUzsKKworICBpZiAoZGJ1c19lcnJvcl9oYXNfbmFtZSAoZXJyb3IsIERCVVNfRVJST1JfU1BBV05fQ0hJTERfU0lHTkFMRUQpKQorICAgIHJldHVybiBCVVNfU1BBV05fRVhJVF9DT0RFX0NISUxEX1NJR05BTEVEOworICAKKyAgLyogc2hvdWxkIHdlIGFzc2VydD8gKi8KKyAgZnByaW50ZihzdGRlcnIsICIlczogJXNcbiIsIGVycm9yLT5uYW1lLCBlcnJvci0+bWVzc2FnZSk7CisgIAorICByZXR1cm4gQlVTX1NQQVdOX0VYSVRfQ09ERV9HRU5FUklDX0ZBSUxVUkU7Cit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICBEQnVzRXJyb3IgZXJyb3I7CisgIGludCByZXR2YWw7CisKKyAgLyogZGVmYXVsdCBpcyBhbGwgb2theSAqLworICByZXR2YWwgPSAwOworCisgIC8qIGhhdmUgd2UgdXNlZCBhIGhlbHAgb3B0aW9uIG9yIG5vdCBzcGVjaWZpZWQgdGhlIGNvcnJlY3QgYXJndW1lbnRzPyAqLworICBpZiAoYXJnYyAhPSAyIHx8CisgICAgICBzdHJjbXAgKGFyZ3ZbMV0sICItLWhlbHAiKSA9PSAwIHx8CisgICAgICBzdHJjbXAgKGFyZ3ZbMV0sICItaCIpID09IDAgfHwKKyAgICAgIHN0cmNtcCAoYXJndlsxXSwgIi0/IikgPT0gMCkKKyAgICB7CisgICAgICAgIGZwcmludGYgKHN0ZGVyciwgImRidXMtZGFlbW9uLWFjdGl2YXRpb24taGVscGVyIHNlcnZpY2UudG8uYWN0aXZhdGVcbiIpOworICAgICAgICBleGl0ICgwKTsKKyAgICB9CisKKyAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworICBpZiAoIXJ1bl9sYXVuY2hfaGVscGVyIChhcmd2WzFdLCAmZXJyb3IpKQorICAgIHsKKyAgICAgIC8qIGNvbnZlcnQgZXJyb3IgdG8gYW4gZXhpdCBjb2RlICovCisgICAgICByZXR2YWwgPSBjb252ZXJ0X2Vycm9yX3RvX2V4aXRfY29kZSAoJmVycm9yKTsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICB9CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKwpkaWZmIC0tZ2l0IGEvYnVzL2FjdGl2YXRpb24taGVscGVyLmMgYi9idXMvYWN0aXZhdGlvbi1oZWxwZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjZhMDkwCi0tLSAvZGV2L251bGwKKysrIGIvYnVzL2FjdGl2YXRpb24taGVscGVyLmMKQEAgLTAsMCArMSw1NDkgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogYWN0aXZhdGlvbi1oZWxwZXIuYyAgU2V0dWlkIGhlbHBlciBmb3IgbGF1bmNoaW5nIHByb2dyYW1zIGFzIGEgY3VzdG9tCisgKiAgICAgICAgICAgICAgICAgICAgICB1c2VyLiBUaGlzIGZpbGUgaXMgc2VjdXJpdHkgc2Vuc2l0aXZlLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisKKyNpbmNsdWRlICJidXMuaCIKKyNpbmNsdWRlICJkcml2ZXIuaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorI2luY2x1ZGUgImRlc2t0b3AtZmlsZS5oIgorI2luY2x1ZGUgImNvbmZpZy1wYXJzZXItdHJpdmlhbC5oIgorI2luY2x1ZGUgImFjdGl2YXRpb24taGVscGVyLmgiCisjaW5jbHVkZSAiYWN0aXZhdGlvbi1leGl0LWNvZGVzLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHB3ZC5oPgorI2luY2x1ZGUgPGdycC5oPgorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLW1pc2MuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc2hlbGwuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbWFyc2hhbC12YWxpZGF0ZS5oPgorCitzdGF0aWMgQnVzRGVza3RvcEZpbGUgKgorZGVza3RvcF9maWxlX2Zvcl9uYW1lIChCdXNDb25maWdQYXJzZXIgKnBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAqZXJyb3IpCit7CisgIEJ1c0Rlc2t0b3BGaWxlICpkZXNrdG9wX2ZpbGU7CisgIERCdXNMaXN0ICoqc2VydmljZV9kaXJzOworICBEQnVzTGlzdCAqbGluazsKKyAgREJ1c0Vycm9yIHRtcF9lcnJvcjsKKyAgREJ1c1N0cmluZyBmdWxsX3BhdGg7CisgIERCdXNTdHJpbmcgZmlsZW5hbWU7CisgIGNvbnN0IGNoYXIgKmRpcjsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBkZXNrdG9wX2ZpbGUgPSBOVUxMOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZmaWxlbmFtZSkpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gb3V0X2FsbDsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmZ1bGxfcGF0aCkpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gb3V0X2ZpbGVuYW1lOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZmaWxlbmFtZSwgbmFtZSkgfHwKKyAgICAgICFfZGJ1c19zdHJpbmdfYXBwZW5kICgmZmlsZW5hbWUsICIuc2VydmljZSIpKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgc2VydmljZV9kaXJzID0gYnVzX2NvbmZpZ19wYXJzZXJfZ2V0X3NlcnZpY2VfcGF0aHMgKHBhcnNlcik7CisgIGZvciAobGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKHNlcnZpY2VfZGlycyk7CisgICAgICAgbGluayAhPSBOVUxMOworICAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKHNlcnZpY2VfZGlycywgbGluaykpCisgICAgeworICAgICAgZGlyID0gbGluay0+ZGF0YTsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJMb29raW5nIGF0ICclcydcbiIsIGRpcik7CisKKyAgICAgIGRidXNfZXJyb3JfaW5pdCAoJnRtcF9lcnJvcik7CisKKyAgICAgIC8qIGNsZWFyIHRoZSBwYXRoIGZyb20gbGFzdCB0aW1lICovCisgICAgICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoJmZ1bGxfcGF0aCwgMCk7CisKKyAgICAgIC8qIGJ1aWxkIHRoZSBmdWxsIHBhdGggKi8KKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmZ1bGxfcGF0aCwgZGlyKSB8fAorICAgICAgICAgICFfZGJ1c19jb25jYXRfZGlyX2FuZF9maWxlICgmZnVsbF9wYXRoLCAmZmlsZW5hbWUpKQorICAgICAgICB7CisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICBfZGJ1c192ZXJib3NlICgiVHJ5aW5nIHRvIGxvYWQgZmlsZSAnJXMnXG4iLCBfZGJ1c19zdHJpbmdfZ2V0X2RhdGEgKCZmdWxsX3BhdGgpKTsKKyAgICAgIGRlc2t0b3BfZmlsZSA9IGJ1c19kZXNrdG9wX2ZpbGVfbG9hZCAoJmZ1bGxfcGF0aCwgJnRtcF9lcnJvcik7CisgICAgICBpZiAoZGVza3RvcF9maWxlID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUICgmdG1wX2Vycm9yKTsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiQ291bGQgbm90IGxvYWQgJXM6ICVzOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZmdWxsX3BhdGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRtcF9lcnJvci5uYW1lLCB0bXBfZXJyb3IubWVzc2FnZSk7CisKKyAgICAgICAgICAvKiB3ZSBtYXkgaGF2ZSBmYWlsZWQgaWYgdGhlIGZpbGUgaXMgbm90IGZvdW5kOyB0aGlzIGlzIG5vdCBmYXRhbCAqLworICAgICAgICAgIGlmIChkYnVzX2Vycm9yX2hhc19uYW1lICgmdG1wX2Vycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfbW92ZV9lcnJvciAoJnRtcF9lcnJvciwgZXJyb3IpOworICAgICAgICAgICAgICAvKiB3ZSBvbmx5IGJhaWwgb3V0IG9uIE9PTSAqLworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZ0bXBfZXJyb3IpOworICAgICAgICB9CisKKyAgICAgIC8qIGRpZCB3ZSBmaW5kIHRoZSBkZXNrdG9wIGZpbGUgd2Ugd2FudD8gKi8KKyAgICAgIGlmIChkZXNrdG9wX2ZpbGUgIT0gTlVMTCkKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgIC8qIERpZG4ndCBmaW5kIGRlc2t0b3AgZmlsZTsgc2V0IGVycm9yICovCisgIGlmIChkZXNrdG9wX2ZpbGUgPT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfU1BBV05fU0VSVklDRV9OT1RfRk9VTkQsCisgICAgICAgICAgICAgICAgICAgICAgIlRoZSBuYW1lICVzIHdhcyBub3QgcHJvdmlkZWQgYnkgYW55IC5zZXJ2aWNlIGZpbGVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKKyAgICB9CisKK291dDoKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmdWxsX3BhdGgpOworb3V0X2ZpbGVuYW1lOgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZpbGVuYW1lKTsKK291dF9hbGw6CisgIHJldHVybiBkZXNrdG9wX2ZpbGU7Cit9CisKKy8qIENsZWFycyB0aGUgZW52aXJvbm1lbnQsIGV4Y2VwdCBmb3IgREJVU19TVEFSVEVSX3gsCisgKiB3aGljaCB3ZSBoYXJkY29kZSB0byB0aGUgc3lzdGVtIGJ1cy4KKyAqLworc3RhdGljIGRidXNfYm9vbF90CitjbGVhcl9lbnZpcm9ubWVudCAoREJ1c0Vycm9yICplcnJvcikKK3sKKyNpZm5kZWYgQUNUSVZBVElPTl9MQVVOQ0hFUl9URVNUCisgIC8qIHRvdGFsbHkgY2xlYXIgdGhlIGVudmlyb25tZW50ICovCisgIGlmICghX2RidXNfY2xlYXJlbnYgKCkpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX1NQQVdOX1NFVFVQX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiY291bGQgbm90IGNsZWFyIGVudmlyb25tZW50XG4iKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgLyogRW5zdXJlIHRoZSBidXMgaXMgc2V0IHRvIHN5c3RlbSAqLworICBkYnVzX3NldGVudiAoIkRCVVNfU1RBUlRFUl9BRERSRVNTIiwgREJVU19TWVNURU1fQlVTX0RFRkFVTFRfQUREUkVTUyk7CisgIGRidXNfc2V0ZW52ICgiREJVU19TVEFSVEVSX0JVU19UWVBFIiwgInN5c3RlbSIpOworI2VuZGlmCisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorY2hlY2tfcGVybWlzc2lvbnMgKGNvbnN0IGNoYXIgKmRidXNfdXNlciwgREJ1c0Vycm9yICplcnJvcikKK3sKKyNpZm5kZWYgQUNUSVZBVElPTl9MQVVOQ0hFUl9URVNUCisgIHVpZF90IHVpZCwgZXVpZDsKKyAgc3RydWN0IHBhc3N3ZCAqcHc7CisKKyAgcHcgPSBOVUxMOworICB1aWQgPSAwOworICBldWlkID0gMDsKKworICAvKiBiYWlsIG91dCB1bmxlc3MgdGhlIGRidXMgdXNlciBpcyBpbnZva2luZyB0aGUgaGVscGVyICovCisgIHB3ID0gZ2V0cHduYW0oZGJ1c191c2VyKTsKKyAgaWYgKCFwdykKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfU1BBV05fUEVSTUlTU0lPTlNfSU5WQUxJRCwKKyAgICAgICAgICAgICAgICAgICAgICAiY2Fubm90IGZpbmQgdXNlciAnJXMnIiwgZGJ1c191c2VyKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIHVpZCA9IGdldHVpZCgpOworICBpZiAocHctPnB3X3VpZCAhPSB1aWQpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX1NQQVdOX1BFUk1JU1NJT05TX0lOVkFMSUQsCisgICAgICAgICAgICAgICAgICAgICAgIm5vdCBpbnZva2VkIGZyb20gdXNlciAnJXMnIiwgZGJ1c191c2VyKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgLyogYmFpbCBvdXQgdW5sZXNzIHdlIGFyZSBzZXR1aWQgdG8gdXNlciByb290ICovCisgIGV1aWQgPSBnZXRldWlkKCk7CisgIGlmIChldWlkICE9IDApCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX1NQQVdOX1BFUk1JU1NJT05TX0lOVkFMSUQsCisgICAgICAgICAgICAgICAgICAgICAgIm5vdCBzZXR1aWQgcm9vdCIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyNlbmRpZgorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX3NlcnZpY2VfbmFtZSAoQnVzRGVza3RvcEZpbGUgKmRlc2t0b3BfZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKnNlcnZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBjaGFyICpuYW1lX3RtcDsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworCisgIHJldHZhbCA9IEZBTFNFOworCisgIC8qIHRyeSB0byBnZXQgTmFtZSAqLworICBpZiAoIWJ1c19kZXNrdG9wX2ZpbGVfZ2V0X3N0cmluZyAoZGVza3RvcF9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19TRVJWSUNFX1NFQ1RJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1NFUlZJQ0VfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lX3RtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkKKyAgICBnb3RvIGZhaWxlZDsKKworICAvKiB2ZXJpZnkgdGhhdCB0aGUgbmFtZSBpcyB0aGUgc2FtZSBhcyB0aGUgZmlsZSBzZXJ2aWNlIG5hbWUgKi8KKyAgaWYgKHN0cmNtcCAoc2VydmljZV9uYW1lLCBuYW1lX3RtcCkgIT0gMCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfU1BBV05fRklMRV9JTlZBTElELAorICAgICAgICAgICAgICAgICAgICAgICJTZXJ2aWNlICclcycgZG9lcyBub3QgbWF0Y2ggZXhwZWN0ZWQgdmFsdWUiLCBuYW1lX3RtcCk7CisgICAgICBnb3RvIGZhaWxlZF9mcmVlOworICAgIH0KKworICByZXR2YWwgPSBUUlVFOworCitmYWlsZWRfZnJlZToKKyAgLyogd2UgZG9uJ3QgcmV0dXJuIHRoZSBuYW1lLCBzbyBmcmVlIGl0IGhlcmUgKi8KKyAgZGJ1c19mcmVlIChuYW1lX3RtcCk7CitmYWlsZWQ6CisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZ2V0X3BhcmFtZXRlcnNfZm9yX3NlcnZpY2UgKEJ1c0Rlc2t0b3BGaWxlICpkZXNrdG9wX2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKnNlcnZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICAgICoqZXhlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICAgICoqdXNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIGNoYXIgKmV4ZWNfdG1wOworICBjaGFyICp1c2VyX3RtcDsKKworICBleGVjX3RtcCA9IE5VTEw7CisgIHVzZXJfdG1wID0gTlVMTDsKKworICAvKiBjaGVjayB0aGUgbmFtZSBvZiB0aGUgc2VydmljZSAqLworICBpZiAoIWNoZWNrX3NlcnZpY2VfbmFtZSAoZGVza3RvcF9maWxlLCBzZXJ2aWNlX25hbWUsIGVycm9yKSkKKyAgICBnb3RvIGZhaWxlZDsKKworICAvKiBnZXQgdGhlIGNvbXBsZXRlIHBhdGggb2YgdGhlIGV4ZWN1dGFibGUgKi8KKyAgaWYgKCFidXNfZGVza3RvcF9maWxlX2dldF9zdHJpbmcgKGRlc2t0b3BfZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfU0VSVklDRV9TRUNUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19TRVJWSUNFX0VYRUMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXhlY190bXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIC8qIGdldCB0aGUgdXNlciB0aGF0IHNob3VsZCBydW4gdGhpcyBzZXJ2aWNlIC0gdXNlciBpcyBjb21wdWxzYXJ5IGZvciBzeXN0ZW0gYWN0aXZhdGlvbiAqLworICBpZiAoIWJ1c19kZXNrdG9wX2ZpbGVfZ2V0X3N0cmluZyAoZGVza3RvcF9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19TRVJWSUNFX1NFQ1RJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1NFUlZJQ0VfVVNFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1c2VyX3RtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgLyogb25seSBhc3NpZ24gaWYgYWxsIHRoZSBjaGVja3MgcGFzc2VkICovCisgICpleGVjID0gZXhlY190bXA7CisgICp1c2VyID0gdXNlcl90bXA7CisgIHJldHVybiBUUlVFOworCitmYWlsZWQ6CisgIGRidXNfZnJlZSAoZXhlY190bXApOworICBkYnVzX2ZyZWUgKHVzZXJfdG1wKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3N3aXRjaF91c2VyIChjaGFyICp1c2VyLCBEQnVzRXJyb3IgKmVycm9yKQoreworI2lmbmRlZiBBQ1RJVkFUSU9OX0xBVU5DSEVSX1RFU1QKKyAgc3RydWN0IHBhc3N3ZCAqcHc7CisKKyAgLyogZmluZCB1c2VyICovCisgIHB3ID0gZ2V0cHduYW0gKHVzZXIpOworICBpZiAoIXB3KQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9TUEFXTl9TRVRVUF9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgImNhbm5vdCBmaW5kIHVzZXIgJyVzJ1xuIiwgdXNlcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIC8qIGluaXRpYWxpemUgdGhlIGdyb3VwIGFjY2VzcyBsaXN0ICovCisgIGlmIChpbml0Z3JvdXBzICh1c2VyLCBwdy0+cHdfZ2lkKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfU1BBV05fU0VUVVBfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJjb3VsZCBub3QgaW5pdGlhbGl6ZSBncm91cHMiKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgLyogY2hhbmdlIHRvIHRoZSBwcmltYXJ5IGdyb3VwIGZvciB0aGUgdXNlciAqLworICBpZiAoc2V0Z2lkIChwdy0+cHdfZ2lkKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfU1BBV05fU0VUVVBfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJjYW5ub3Qgc2V0Z2lkIGdyb3VwICVpIiwgcHctPnB3X2dpZCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIC8qIGNoYW5nZSB0byB0aGUgdXNlciBzcGVjaWZpZWQgKi8KKyAgaWYgKHNldHVpZCAocHctPnB3X3VpZCkgPCAwKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9TUEFXTl9TRVRVUF9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgImNhbm5vdCBzZXR1aWQgdXNlciAlaSIsIHB3LT5wd191aWQpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyNlbmRpZgorICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitleGVjX2Zvcl9jb3JyZWN0X3VzZXIgKGNoYXIgKmV4ZWMsIGNoYXIgKnVzZXIsIERCdXNFcnJvciAqZXJyb3IpCit7CisgIGNoYXIgKiphcmd2OworICBpbnQgYXJnYzsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworCisgIGFyZ2MgPSAwOworICByZXR2YWwgPSBUUlVFOworICBhcmd2ID0gTlVMTDsKKworICBpZiAoIXN3aXRjaF91c2VyICh1c2VyLCBlcnJvcikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIC8qIGNvbnZlcnQgY29tbWFuZCBpbnRvIGFyZ3VtZW50cyAqLworICBpZiAoIV9kYnVzX3NoZWxsX3BhcnNlX2FyZ3YgKGV4ZWMsICZhcmdjLCAmYXJndiwgZXJyb3IpKQorICAgIHJldHVybiBGQUxTRTsKKworI2lmbmRlZiBBQ1RJVkFUSU9OX0xBVU5DSEVSX0RPX09PTQorICAvKiByZXBsYWNlIHdpdGggbmV3IGJpbmFyeSwgd2l0aCBubyBlbnZpcm9ubWVudCAqLworICBpZiAoZXhlY3YgKGFyZ3ZbMF0sIGFyZ3YpIDwgMCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfU1BBV05fRVhFQ19GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBleGVjOiAlcyIsIGFyZ3ZbMF0pOworICAgICAgcmV0dmFsID0gRkFMU0U7CisgICAgfQorI2VuZGlmCisKKyAgZGJ1c19mcmVlX3N0cmluZ19hcnJheSAoYXJndik7CisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorY2hlY2tfYnVzX25hbWUgKGNvbnN0IGNoYXIgKmJ1c19uYW1lLAorICAgICAgICAgICAgICAgIERCdXNFcnJvciAgKmVycm9yKQoreworICBEQnVzU3RyaW5nIHN0cjsKKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnN0ciwgYnVzX25hbWUpOworICBpZiAoIV9kYnVzX3ZhbGlkYXRlX2J1c19uYW1lICgmc3RyLCAwLCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9TUEFXTl9TRVJWSUNFX0lOVkFMSUQsCisgICAgICAgICAgICAgICAgICAgICAgImJ1cyBuYW1lICclcycgaXMgbm90IGEgdmFsaWQgYnVzIG5hbWVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgYnVzX25hbWUpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2dldF9jb3JyZWN0X3BhcnNlciAoQnVzQ29uZmlnUGFyc2VyICoqcGFyc2VyLCBEQnVzRXJyb3IgKmVycm9yKQoreworICBEQnVzU3RyaW5nIGNvbmZpZ19maWxlOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisjaWZkZWYgQUNUSVZBVElPTl9MQVVOQ0hFUl9URVNUCisgIGNvbnN0IGNoYXIgKnRlc3RfY29uZmlnX2ZpbGU7CisjZW5kaWYKKworICByZXR2YWwgPSBGQUxTRTsKKworI2lmZGVmIEFDVElWQVRJT05fTEFVTkNIRVJfVEVTVAorICB0ZXN0X2NvbmZpZ19maWxlID0gTlVMTDsKKworICAvKiB0aGVyZSBpcyBubyBfd2F5XyB3ZSBzaG91bGQgYmUgc2V0dWlkIGlmIHRoaXMgZGVmaW5lIGlzIHNldC4KKyAgICogYnV0IHdlIHNob3VsZCBiZSBkb3VibHkgcGFyYW5vaWQgYW5kIGNoZWNrLi4uICovCisgIGlmIChnZXR1aWQoKSAhPSBnZXRldWlkKCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZGJ1cy1kYWVtb24tbGF1bmNoLWhlbHBlci10ZXN0IGJpbmFyeSBpcyBzZXR1aWQhIik7CisKKyAgLyogdGhpcyBpcyBub3QgYSBzZWN1cml0eSBob2xlLiBUaGUgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgb25seSBwYXNzZWQgaW4gdGhlCisgICAqIGRidXMtZGFlbW9uLWxhdWNoLWhlbHBlci10ZXN0IE5PTi1TRVRVSUQgbGF1bmNoZXIgKi8KKyAgdGVzdF9jb25maWdfZmlsZSA9IF9kYnVzX2dldGVudiAoIlRFU1RfTEFVTkNIX0hFTFBFUl9DT05GSUciKTsKKyAgaWYgKHRlc3RfY29uZmlnX2ZpbGUgPT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfU1BBV05fU0VUVVBfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJ0aGUgVEVTVF9MQVVOQ0hfSEVMUEVSX0NPTkZJRyBlbnYgdmFyaWFibGUgaXMgbm90IHNldCIpOworICAgICAgZ290byBvdXQ7CisgICAgfQorI2VuZGlmCisKKyAgLyogd2UgX29ubHlfIHVzZSB0aGUgcHJlZGVmaW5lZCBzeXN0ZW0gY29uZmlnIGZpbGUgKi8KKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmNvbmZpZ19maWxlKSkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgZ290byBvdXQ7CisgICAgfQorI2lmbmRlZiBBQ1RJVkFUSU9OX0xBVU5DSEVSX1RFU1QKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmY29uZmlnX2ZpbGUsIERCVVNfU1lTVEVNX0NPTkZJR19GSUxFKSkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgZ290byBvdXRfZnJlZV9jb25maWc7CisgICAgfQorI2Vsc2UKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmY29uZmlnX2ZpbGUsIHRlc3RfY29uZmlnX2ZpbGUpKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBnb3RvIG91dF9mcmVlX2NvbmZpZzsKKyAgICB9CisjZW5kaWYKKworICAvKiB3aGVyZSBhcmUgd2UgcG9pbnRpbmcuLi4uICovCisgIF9kYnVzX3ZlcmJvc2UgKCJkYnVzLWRhZW1vbi1hY3RpdmF0aW9uLWhlbHBlcjogdXNpbmcgY29uZmlnIGZpbGU6ICVzXG4iLAorICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZjb25maWdfZmlsZSkpOworCisgIC8qIGdldCB0aGUgZGJ1cyB1c2VyICovCisgICpwYXJzZXIgPSBidXNfY29uZmlnX2xvYWQgKCZjb25maWdfZmlsZSwgVFJVRSwgTlVMTCwgZXJyb3IpOworICBpZiAoKnBhcnNlciA9PSBOVUxMKQorICAgIHsKKyAgICAgIGdvdG8gb3V0X2ZyZWVfY29uZmlnOworICAgIH0KKworICAvKiB3b290ICovCisgIHJldHZhbCA9IFRSVUU7CisKK291dF9mcmVlX2NvbmZpZzoKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZjb25maWdfZmlsZSk7CitvdXQ6CisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorbGF1bmNoX2J1c19uYW1lIChjb25zdCBjaGFyICpidXNfbmFtZSwgQnVzQ29uZmlnUGFyc2VyICpwYXJzZXIsIERCdXNFcnJvciAqZXJyb3IpCit7CisgIEJ1c0Rlc2t0b3BGaWxlICpkZXNrdG9wX2ZpbGU7CisgIGNoYXIgKmV4ZWMsICp1c2VyOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisKKyAgZXhlYyA9IE5VTEw7CisgIHVzZXIgPSBOVUxMOworICByZXR2YWwgPSBGQUxTRTsKKworICAvKiBnZXQgdGhlIGNvcnJlY3Qgc2VydmljZSBmaWxlIGZvciB0aGUgbmFtZSB3ZSBhcmUgdHJ5aW5nIHRvIGFjdGl2YXRlICovCisgIGRlc2t0b3BfZmlsZSA9IGRlc2t0b3BfZmlsZV9mb3JfbmFtZSAocGFyc2VyLCBidXNfbmFtZSwgZXJyb3IpOworICBpZiAoZGVza3RvcF9maWxlID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIC8qIGdldCBleGVjIGFuZCB1c2VyIGZvciBzZXJ2aWNlIG5hbWUgKi8KKyAgaWYgKCFnZXRfcGFyYW1ldGVyc19mb3Jfc2VydmljZSAoZGVza3RvcF9maWxlLCBidXNfbmFtZSwgJmV4ZWMsICZ1c2VyLCBlcnJvcikpCisgICAgZ290byBmaW5pc2g7CisKKyAgX2RidXNfdmVyYm9zZSAoImRidXMtZGFlbW9uLWFjdGl2YXRpb24taGVscGVyOiBOYW1lPSclcydcbiIsIGJ1c19uYW1lKTsKKyAgX2RidXNfdmVyYm9zZSAoImRidXMtZGFlbW9uLWFjdGl2YXRpb24taGVscGVyOiBFeGVjPSclcydcbiIsIGV4ZWMpOworICBfZGJ1c192ZXJib3NlICgiZGJ1cy1kYWVtb24tYWN0aXZhdGlvbi1oZWxwZXI6IFVzZXI9JyVzJ1xuIiwgdXNlcik7CisKKyAgLyogYWN0dWFsbHkgZXhlY3V0ZSAqLworICBpZiAoIWV4ZWNfZm9yX2NvcnJlY3RfdXNlciAoZXhlYywgdXNlciwgZXJyb3IpKQorICAgIGdvdG8gZmluaXNoOworCisgIHJldHZhbCA9IFRSVUU7CisKK2ZpbmlzaDoKKyAgZGJ1c19mcmVlIChleGVjKTsKKyAgZGJ1c19mcmVlICh1c2VyKTsKKyAgYnVzX2Rlc2t0b3BfZmlsZV9mcmVlIChkZXNrdG9wX2ZpbGUpOworICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX2RidXNfdXNlciAoQnVzQ29uZmlnUGFyc2VyICpwYXJzZXIsIERCdXNFcnJvciAqZXJyb3IpCit7CisgIGNvbnN0IGNoYXIgKmRidXNfdXNlcjsKKworICBkYnVzX3VzZXIgPSBidXNfY29uZmlnX3BhcnNlcl9nZXRfdXNlciAocGFyc2VyKTsKKyAgaWYgKGRidXNfdXNlciA9PSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9TUEFXTl9DT05GSUdfSU5WQUxJRCwKKyAgICAgICAgICAgICAgICAgICAgICAiY291bGQgbm90IGdldCB1c2VyIGZyb20gY29uZmlnIGZpbGVcbiIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAvKiBjaGVjayB0byBzZWUgaWYgcGVybWlzc2lvbnMgYXJlIGNvcnJlY3QgKi8KKyAgaWYgKCFjaGVja19wZXJtaXNzaW9ucyAoZGJ1c191c2VyLCBlcnJvcikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJldHVybiBUUlVFOworfQorCitkYnVzX2Jvb2xfdAorcnVuX2xhdW5jaF9oZWxwZXIgKGNvbnN0IGNoYXIgKmJ1c19uYW1lLAorICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgKmVycm9yKQoreworICBCdXNDb25maWdQYXJzZXIgKnBhcnNlcjsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworCisgIHBhcnNlciA9IE5VTEw7CisgIHJldHZhbCA9IEZBTFNFOworCisgIC8qIGNsZWFyIHRoZSBlbnZpcm9ubWVudCwgYXBhcnQgZnJvbSBhIGZldyBzZWxlY3Qgc2V0dGluZ3MgKi8KKyAgaWYgKCFjbGVhcl9lbnZpcm9ubWVudCAoZXJyb3IpKQorICAgIGdvdG8gZXJyb3I7CisKKyAgLyogY2hlY2sgdG8gc2VlIGlmIHdlIGhhdmUgYSB2YWxpZCBidXMgbmFtZSAqLworICBpZiAoIWNoZWNrX2J1c19uYW1lIChidXNfbmFtZSwgZXJyb3IpKQorICAgIGdvdG8gZXJyb3I7CisKKyAgLyogZ2V0IHRoZSBjb3JyZWN0IHBhcnNlciwgZWl0aGVyIHRoZSB0ZXN0IG9yIGRlZmF1bHQgcGFyc2VyICovCisgIGlmICghZ2V0X2NvcnJlY3RfcGFyc2VyICgmcGFyc2VyLCBlcnJvcikpCisgICAgZ290byBlcnJvcjsKKworICAvKiBjaGVjayB3ZSBhcmUgYmVpbmcgaW52b2tlZCBieSB0aGUgY29ycmVjdCBkYnVzIHVzZXIgKi8KKyAgaWYgKCFjaGVja19kYnVzX3VzZXIgKHBhcnNlciwgZXJyb3IpKQorICAgIGdvdG8gZXJyb3JfZnJlZV9wYXJzZXI7CisKKyAgLyogbGF1bmNoIHRoZSBidXMgd2l0aCB0aGUgc2VydmljZSBkZWZpbmVkIHVzZXIgKi8KKyAgaWYgKCFsYXVuY2hfYnVzX25hbWUgKGJ1c19uYW1lLCBwYXJzZXIsIGVycm9yKSkKKyAgICBnb3RvIGVycm9yX2ZyZWVfcGFyc2VyOworCisgIC8qIHdvb2hvbyEgKi8KKyAgcmV0dmFsID0gVFJVRTsKKworZXJyb3JfZnJlZV9wYXJzZXI6CisgIGJ1c19jb25maWdfcGFyc2VyX3VucmVmIChwYXJzZXIpOworZXJyb3I6CisgIHJldHVybiByZXR2YWw7Cit9CisKZGlmZiAtLWdpdCBhL2J1cy9hY3RpdmF0aW9uLWhlbHBlci5oIGIvYnVzL2FjdGl2YXRpb24taGVscGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNlN2IxNQotLS0gL2Rldi9udWxsCisrKyBiL2J1cy9hY3RpdmF0aW9uLWhlbHBlci5oCkBAIC0wLDAgKzEsMzMgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogYWN0aXZhdGlvbi1oZWxwZXIuaCAgVGhlIGFjdHVhbCBhY3RpdmF0aW9uIGhlbHBlciBzcGxpdCBmcm9tIHRoZSBtYWluCisgKiAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBmb3IgdGVzdGluZy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaWZuZGVmIEJVU19BQ1RJVkFUSU9OX0hFTFBFUl9ICisjZGVmaW5lIEJVU19BQ1RJVkFUSU9OX0hFTFBFUl9ICisKKyNpbmNsdWRlIDxkYnVzL2RidXMuaD4KKworZGJ1c19ib29sX3QgcnVuX2xhdW5jaF9oZWxwZXIgKGNvbnN0IGNoYXIgKmJ1c19uYW1lLCBEQnVzRXJyb3IgKmVycm9yKTsKKworCisjZW5kaWYgLyogQlVTX0FDVElWQVRJT05fSEVMUEVSX0ggKi8KZGlmZiAtLWdpdCBhL2J1cy9hY3RpdmF0aW9uLmMgYi9idXMvYWN0aXZhdGlvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5NDA0YjkKLS0tIC9kZXYvbnVsbAorKysgYi9idXMvYWN0aXZhdGlvbi5jCkBAIC0wLDAgKzEsMjczMiBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBhY3RpdmF0aW9uLmMgIEFjdGl2YXRpb24gb2Ygc2VydmljZXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgIENvZGVGYWN0b3J5IEFCCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgIFJlZCBIYXQsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwNCAgSW1lbmRpbyBIQgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgImFjdGl2YXRpb24uaCIKKyNpbmNsdWRlICJhY3RpdmF0aW9uLWV4aXQtY29kZXMuaCIKKyNpbmNsdWRlICJjb25maWctcGFyc2VyLmgiCisjaW5jbHVkZSAiZGVza3RvcC1maWxlLmgiCisjaW5jbHVkZSAiZGlzcGF0Y2guaCIKKyNpbmNsdWRlICJzZXJ2aWNlcy5oIgorI2luY2x1ZGUgInRlc3QuaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorI2luY2x1ZGUgPGRidXMvZGJ1cy1pbnRlcm5hbHMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtaGFzaC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1saXN0Lmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXNoZWxsLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXNwYXduLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXRpbWVvdXQuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc3lzZGVwcy5oPgorI2lmZGVmIEhBVkVfRVJSTk9fSAorI2luY2x1ZGUgPGVycm5vLmg+CisjZW5kaWYKKworc3RydWN0IEJ1c0FjdGl2YXRpb24KK3sKKyAgaW50IHJlZmNvdW50OworICBEQnVzSGFzaFRhYmxlICplbnRyaWVzOworICBEQnVzSGFzaFRhYmxlICpwZW5kaW5nX2FjdGl2YXRpb25zOworICBjaGFyICpzZXJ2ZXJfYWRkcmVzczsKKyAgQnVzQ29udGV4dCAqY29udGV4dDsKKyAgaW50IG5fcGVuZGluZ19hY3RpdmF0aW9uczsgLyoqPCBUaGlzIGlzIGluIGZhY3QgdGhlIG51bWJlciBvZiBCdXNQZW5kaW5nQWN0aXZhdGlvbkVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBpLmUuIG51bWJlciBvZiBwZW5kaW5nIGFjdGl2YXRpb24gcmVxdWVzdHMsIG5vdCBwZW5kaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGFjdGl2YXRpb25zIHBlciBzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgREJ1c0xpc3QgKmRpcmVjdG9yaWVzOworICBEQnVzSGFzaFRhYmxlICplbnZpcm9ubWVudDsKK307CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGludCByZWZjb3VudDsKKyAgY2hhciAqZGlyX2M7CisgIEJ1c1NlcnZpY2VEaXJGbGFncyBmbGFnczsKKyAgREJ1c0hhc2hUYWJsZSAqZW50cmllczsKK30gQnVzU2VydmljZURpcmVjdG9yeTsKKworc3RydWN0IEJ1c0FjdGl2YXRpb25FbnRyeQoreworICBpbnQgcmVmY291bnQ7CisgIGNoYXIgKm5hbWU7CisgIGNoYXIgKmV4ZWM7CisgIGNoYXIgKnVzZXI7CisgIGNoYXIgKnN5c3RlbWRfc2VydmljZTsKKyAgY2hhciAqYXNzdW1lZF9hcHBhcm1vcl9sYWJlbDsKKyAgdW5zaWduZWQgbG9uZyBtdGltZTsKKyAgQnVzU2VydmljZURpcmVjdG9yeSAqc19kaXI7CisgIGNoYXIgKmZpbGVuYW1lOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgQnVzUGVuZGluZ0FjdGl2YXRpb25FbnRyeSBCdXNQZW5kaW5nQWN0aXZhdGlvbkVudHJ5OworCitzdHJ1Y3QgQnVzUGVuZGluZ0FjdGl2YXRpb25FbnRyeQoreworICAvKiBOb3JtYWxseSBhIG1ldGhvZCBjYWxsLCBidXQgaWYgY29ubmVjdGlvbiBpcyBOVUxMLCB0aGlzIGlzIGEgc2lnbmFsCisgICAqIGluc3RlYWQuCisgICAqLworICBEQnVzTWVzc2FnZSAqYWN0aXZhdGlvbl9tZXNzYWdlOworICAvKiBOVUxMIGlmIHRoaXMgYWN0aXZhdGlvbiBlbnRyeSBpcyBmb3IgdGhlIGRidXMtZGFlbW9uIGl0c2VsZiwKKyAgICogd2FpdGluZyBmb3Igc3lzdGVtZCB0byBzdGFydC4gSW4gdGhpcyBjYXNlLCBhdXRvX2FjdGl2YXRpb24gaXMgYWx3YXlzCisgICAqIFRSVUUuCisgICAqLworICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKworICBkYnVzX2Jvb2xfdCBhdXRvX2FjdGl2YXRpb247Cit9OworCit0eXBlZGVmIHN0cnVjdAoreworICBpbnQgcmVmY291bnQ7CisgIEJ1c0FjdGl2YXRpb24gKmFjdGl2YXRpb247CisgIGNoYXIgKnNlcnZpY2VfbmFtZTsKKyAgY2hhciAqZXhlYzsKKyAgY2hhciAqc3lzdGVtZF9zZXJ2aWNlOworICBEQnVzTGlzdCAqZW50cmllczsKKyAgaW50IG5fZW50cmllczsKKyAgREJ1c0JhYnlzaXR0ZXIgKmJhYnlzaXR0ZXI7CisgIERCdXNUaW1lb3V0ICp0aW1lb3V0OworICB1bnNpZ25lZCBpbnQgdGltZW91dF9hZGRlZCA6IDE7Cit9IEJ1c1BlbmRpbmdBY3RpdmF0aW9uOworCisjaWYgMAorc3RhdGljIEJ1c1NlcnZpY2VEaXJlY3RvcnkgKgorYnVzX3NlcnZpY2VfZGlyZWN0b3J5X3JlZiAoQnVzU2VydmljZURpcmVjdG9yeSAqZGlyKQoreworICBfZGJ1c19hc3NlcnQgKGRpci0+cmVmY291bnQpOworCisgIGRpci0+cmVmY291bnQrKzsKKworICByZXR1cm4gZGlyOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkCitidXNfc2VydmljZV9kaXJlY3RvcnlfdW5yZWYgKEJ1c1NlcnZpY2VEaXJlY3RvcnkgKmRpcikKK3sKKyAgaWYgKGRpciA9PSBOVUxMKQorICAgIHJldHVybjsKKworICBfZGJ1c19hc3NlcnQgKGRpci0+cmVmY291bnQgPiAwKTsKKyAgZGlyLT5yZWZjb3VudC0tOworCisgIGlmIChkaXItPnJlZmNvdW50ID4gMCkKKyAgICByZXR1cm47CisKKyAgaWYgKGRpci0+ZW50cmllcykKKyAgICBfZGJ1c19oYXNoX3RhYmxlX3VucmVmIChkaXItPmVudHJpZXMpOworCisgIGRidXNfZnJlZSAoZGlyLT5kaXJfYyk7CisgIGRidXNfZnJlZSAoZGlyKTsKK30KKworc3RhdGljIHZvaWQKK2J1c19wZW5kaW5nX2FjdGl2YXRpb25fZW50cnlfZnJlZSAoQnVzUGVuZGluZ0FjdGl2YXRpb25FbnRyeSAqZW50cnkpCit7CisgIGlmIChlbnRyeS0+YWN0aXZhdGlvbl9tZXNzYWdlKQorICAgIGRidXNfbWVzc2FnZV91bnJlZiAoZW50cnktPmFjdGl2YXRpb25fbWVzc2FnZSk7CisKKyAgaWYgKGVudHJ5LT5jb25uZWN0aW9uKQorICAgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoZW50cnktPmNvbm5lY3Rpb24pOworCisgIGRidXNfZnJlZSAoZW50cnkpOworfQorCitzdGF0aWMgQnVzUGVuZGluZ0FjdGl2YXRpb24gKgorYnVzX3BlbmRpbmdfYWN0aXZhdGlvbl9yZWYgKEJ1c1BlbmRpbmdBY3RpdmF0aW9uICpwZW5kaW5nX2FjdGl2YXRpb24pCit7CisgIF9kYnVzX2Fzc2VydCAocGVuZGluZ19hY3RpdmF0aW9uLT5yZWZjb3VudCA+IDApOworICBwZW5kaW5nX2FjdGl2YXRpb24tPnJlZmNvdW50ICs9IDE7CisKKyAgcmV0dXJuIHBlbmRpbmdfYWN0aXZhdGlvbjsKK30KKworc3RhdGljIHZvaWQKK2J1c19wZW5kaW5nX2FjdGl2YXRpb25fdW5yZWYgKEJ1c1BlbmRpbmdBY3RpdmF0aW9uICpwZW5kaW5nX2FjdGl2YXRpb24pCit7CisgIERCdXNMaXN0ICpsaW5rOworCisgIGlmIChwZW5kaW5nX2FjdGl2YXRpb24gPT0gTlVMTCkgLyogaGFzaCB0YWJsZSByZXF1aXJlcyB0aGlzICovCisgICAgcmV0dXJuOworCisgIF9kYnVzX2Fzc2VydCAocGVuZGluZ19hY3RpdmF0aW9uLT5yZWZjb3VudCA+IDApOworICBwZW5kaW5nX2FjdGl2YXRpb24tPnJlZmNvdW50IC09IDE7CisKKyAgaWYgKHBlbmRpbmdfYWN0aXZhdGlvbi0+cmVmY291bnQgPiAwKQorICAgIHJldHVybjsKKworICBpZiAocGVuZGluZ19hY3RpdmF0aW9uLT50aW1lb3V0X2FkZGVkKQorICAgIHsKKyAgICAgIF9kYnVzX2xvb3BfcmVtb3ZlX3RpbWVvdXQgKGJ1c19jb250ZXh0X2dldF9sb29wIChwZW5kaW5nX2FjdGl2YXRpb24tPmFjdGl2YXRpb24tPmNvbnRleHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ19hY3RpdmF0aW9uLT50aW1lb3V0KTsKKyAgICAgIHBlbmRpbmdfYWN0aXZhdGlvbi0+dGltZW91dF9hZGRlZCA9IEZBTFNFOworICAgIH0KKworICBpZiAocGVuZGluZ19hY3RpdmF0aW9uLT50aW1lb3V0KQorICAgIF9kYnVzX3RpbWVvdXRfdW5yZWYgKHBlbmRpbmdfYWN0aXZhdGlvbi0+dGltZW91dCk7CisKKyAgaWYgKHBlbmRpbmdfYWN0aXZhdGlvbi0+YmFieXNpdHRlcikKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX2JhYnlzaXR0ZXJfc2V0X3dhdGNoX2Z1bmN0aW9ucyAocGVuZGluZ19hY3RpdmF0aW9uLT5iYWJ5c2l0dGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ19hY3RpdmF0aW9uLT5iYWJ5c2l0dGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJzZXR0aW5nIHdhdGNoIGZ1bmN0aW9ucyB0byBOVUxMIGZhaWxlZCIpOworCisgICAgICBfZGJ1c19iYWJ5c2l0dGVyX3VucmVmIChwZW5kaW5nX2FjdGl2YXRpb24tPmJhYnlzaXR0ZXIpOworICAgIH0KKworICBkYnVzX2ZyZWUgKHBlbmRpbmdfYWN0aXZhdGlvbi0+c2VydmljZV9uYW1lKTsKKyAgZGJ1c19mcmVlIChwZW5kaW5nX2FjdGl2YXRpb24tPmV4ZWMpOworICBkYnVzX2ZyZWUgKHBlbmRpbmdfYWN0aXZhdGlvbi0+c3lzdGVtZF9zZXJ2aWNlKTsKKworICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJnBlbmRpbmdfYWN0aXZhdGlvbi0+ZW50cmllcyk7CisKKyAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBCdXNQZW5kaW5nQWN0aXZhdGlvbkVudHJ5ICplbnRyeSA9IGxpbmstPmRhdGE7CisKKyAgICAgIGJ1c19wZW5kaW5nX2FjdGl2YXRpb25fZW50cnlfZnJlZSAoZW50cnkpOworCisgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmcGVuZGluZ19hY3RpdmF0aW9uLT5lbnRyaWVzLCBsaW5rKTsKKyAgICB9CisgIF9kYnVzX2xpc3RfY2xlYXIgKCZwZW5kaW5nX2FjdGl2YXRpb24tPmVudHJpZXMpOworCisgIHBlbmRpbmdfYWN0aXZhdGlvbi0+YWN0aXZhdGlvbi0+bl9wZW5kaW5nX2FjdGl2YXRpb25zIC09CisgICAgcGVuZGluZ19hY3RpdmF0aW9uLT5uX2VudHJpZXM7CisKKyAgX2RidXNfYXNzZXJ0IChwZW5kaW5nX2FjdGl2YXRpb24tPmFjdGl2YXRpb24tPm5fcGVuZGluZ19hY3RpdmF0aW9ucyA+PSAwKTsKKworICBkYnVzX2ZyZWUgKHBlbmRpbmdfYWN0aXZhdGlvbik7Cit9CisKK3N0YXRpYyBCdXNBY3RpdmF0aW9uRW50cnkgKgorYnVzX2FjdGl2YXRpb25fZW50cnlfcmVmIChCdXNBY3RpdmF0aW9uRW50cnkgKmVudHJ5KQoreworICBfZGJ1c19hc3NlcnQgKGVudHJ5LT5yZWZjb3VudCA+IDApOworICBlbnRyeS0+cmVmY291bnQrKzsKKworICByZXR1cm4gZW50cnk7Cit9CisKK3N0YXRpYyB2b2lkCitidXNfYWN0aXZhdGlvbl9lbnRyeV91bnJlZiAoQnVzQWN0aXZhdGlvbkVudHJ5ICplbnRyeSkKK3sKKyAgaWYgKGVudHJ5ID09IE5VTEwpIC8qIGhhc2ggdGFibGUgcmVxdWlyZXMgdGhpcyAqLworICAgIHJldHVybjsKKworICBfZGJ1c19hc3NlcnQgKGVudHJ5LT5yZWZjb3VudCA+IDApOworICBlbnRyeS0+cmVmY291bnQtLTsKKworICBpZiAoZW50cnktPnJlZmNvdW50ID4gMCkKKyAgICByZXR1cm47CisKKyAgZGJ1c19mcmVlIChlbnRyeS0+bmFtZSk7CisgIGRidXNfZnJlZSAoZW50cnktPmV4ZWMpOworICBkYnVzX2ZyZWUgKGVudHJ5LT51c2VyKTsKKyAgZGJ1c19mcmVlIChlbnRyeS0+ZmlsZW5hbWUpOworICBkYnVzX2ZyZWUgKGVudHJ5LT5zeXN0ZW1kX3NlcnZpY2UpOworICBkYnVzX2ZyZWUgKGVudHJ5LT5hc3N1bWVkX2FwcGFybW9yX2xhYmVsKTsKKworICBkYnVzX2ZyZWUgKGVudHJ5KTsKK30KKworc3RhdGljIGRidXNfYm9vbF90Cit1cGRhdGVfZGVza3RvcF9maWxlX2VudHJ5IChCdXNBY3RpdmF0aW9uICAgICAgICphY3RpdmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzU2VydmljZURpcmVjdG9yeSAqc19kaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICAgICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c0Rlc2t0b3BGaWxlICAgICAgKmRlc2t0b3BfZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICAgKmVycm9yKQoreworICBjaGFyICpuYW1lLCAqZXhlYywgKnVzZXIsICpleGVjX3RtcCwgKnN5c3RlbWRfc2VydmljZTsKKyAgY2hhciAqYXNzdW1lZF9hcHBhcm1vcl9sYWJlbDsKKyAgQnVzQWN0aXZhdGlvbkVudHJ5ICplbnRyeTsKKyAgREJ1c1N0YXQgc3RhdF9idWY7CisgIERCdXNTdHJpbmcgZmlsZV9wYXRoOworICBEQnVzRXJyb3IgdG1wX2Vycm9yOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIERCdXNTdHJpbmcgc3RyOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIHJldHZhbCA9IEZBTFNFOworICBuYW1lID0gTlVMTDsKKyAgZXhlYyA9IE5VTEw7CisgIHVzZXIgPSBOVUxMOworICBleGVjX3RtcCA9IE5VTEw7CisgIGVudHJ5ID0gTlVMTDsKKyAgc3lzdGVtZF9zZXJ2aWNlID0gTlVMTDsKKyAgYXNzdW1lZF9hcHBhcm1vcl9sYWJlbCA9IE5VTEw7CisKKyAgZGJ1c19lcnJvcl9pbml0ICgmdG1wX2Vycm9yKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZmlsZV9wYXRoKSkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZmaWxlX3BhdGgsIHNfZGlyLT5kaXJfYykgfHwKKyAgICAgICFfZGJ1c19jb25jYXRfZGlyX2FuZF9maWxlICgmZmlsZV9wYXRoLCBmaWxlbmFtZSkpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAoIV9kYnVzX3N0YXQgKCZmaWxlX3BhdGgsICZzdGF0X2J1ZiwgTlVMTCkpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiQ2FuJ3Qgc3RhdCB0aGUgc2VydmljZSBmaWxlXG4iKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAoIWJ1c19kZXNrdG9wX2ZpbGVfZ2V0X3N0cmluZyAoZGVza3RvcF9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19TRVJWSUNFX1NFQ1RJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1NFUlZJQ0VfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKQorICAgIGdvdG8gb3V0OworCisgIGlmICghYnVzX2Rlc2t0b3BfZmlsZV9nZXRfc3RyaW5nIChkZXNrdG9wX2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1NFUlZJQ0VfU0VDVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfU0VSVklDRV9FWEVDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmV4ZWNfdG1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKQorICAgIGdvdG8gb3V0OworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZzdHIpKQorICAgIGdvdG8gb3V0OworCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnN0ciwgZXhlY190bXApIHx8CisgICAgICAhX2RidXNfcmVwbGFjZV9pbnN0YWxsX3ByZWZpeCAoJnN0cikgfHwKKyAgICAgICFfZGJ1c19zdHJpbmdfc3RlYWxfZGF0YSAoJnN0ciwgJmV4ZWMpKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmc3RyKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnN0cik7CisKKyAgLyogdXNlciBpcyBub3QgX3JlcXVpcmVkXyB1bmxlc3Mgd2UgYXJlIHVzaW5nIHN5c3RlbSBhY3RpdmF0aW9uICovCisgIGlmICghYnVzX2Rlc2t0b3BfZmlsZV9nZXRfc3RyaW5nIChkZXNrdG9wX2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1NFUlZJQ0VfU0VDVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfU0VSVklDRV9VU0VSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVzZXIsICZ0bXBfZXJyb3IpKQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKCZ0bXBfZXJyb3IpOworICAgICAgLyogaWYgd2UgZ290IE9PTSwgdGhlbiBleGl0ICovCisgICAgICBpZiAoZGJ1c19lcnJvcl9oYXNfbmFtZSAoJnRtcF9lcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlkpKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19tb3ZlX2Vycm9yICgmdG1wX2Vycm9yLCBlcnJvcik7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8qIGlmIHdlIGhhdmUgZXJyb3IgYmVjYXVzZSB3ZSBkaWRuJ3QgZmluZCBhbnl0aGluZyB0aGVuIGNvbnRpbnVlICovCisgICAgICAgICAgZGJ1c19lcnJvcl9mcmVlICgmdG1wX2Vycm9yKTsKKyAgICAgICAgICBkYnVzX2ZyZWUgKHVzZXIpOworICAgICAgICAgIHVzZXIgPSBOVUxMOworICAgICAgICB9CisgICAgfQorICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKCZ0bXBfZXJyb3IpOworCisgIC8qIHN5c3RlbWQgc2VydmljZSBpcyBuZXZlciByZXF1aXJlZCAqLworICBpZiAoIWJ1c19kZXNrdG9wX2ZpbGVfZ2V0X3N0cmluZyAoZGVza3RvcF9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19TRVJWSUNFX1NFQ1RJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1NFUlZJQ0VfU1lTVEVNRF9TRVJWSUNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN5c3RlbWRfc2VydmljZSwgJnRtcF9lcnJvcikpCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoJnRtcF9lcnJvcik7CisgICAgICAvKiBpZiB3ZSBnb3QgT09NLCB0aGVuIGV4aXQgKi8KKyAgICAgIGlmIChkYnVzX2Vycm9yX2hhc19uYW1lICgmdG1wX2Vycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSkpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX21vdmVfZXJyb3IgKCZ0bXBfZXJyb3IsIGVycm9yKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgLyogaWYgd2UgaGF2ZSBlcnJvciBiZWNhdXNlIHdlIGRpZG4ndCBmaW5kIGFueXRoaW5nIHRoZW4gY29udGludWUgKi8KKyAgICAgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZ0bXBfZXJyb3IpOworICAgICAgICAgIGRidXNfZnJlZSAoc3lzdGVtZF9zZXJ2aWNlKTsKKyAgICAgICAgICBzeXN0ZW1kX3NlcnZpY2UgPSBOVUxMOworICAgICAgICB9CisgICAgfQorCisgIC8qIGFzc3VtZWQgQXBwQXJtb3IgbGFiZWwgaXMgbmV2ZXIgcmVxdWlyZWQgKi8KKyAgaWYgKCFidXNfZGVza3RvcF9maWxlX2dldF9zdHJpbmcgKGRlc2t0b3BfZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfU0VSVklDRV9TRUNUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19TRVJWSUNFX0FTU1VNRURfQVBQQVJNT1JfTEFCRUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXNzdW1lZF9hcHBhcm1vcl9sYWJlbCwgJnRtcF9lcnJvcikpCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoJnRtcF9lcnJvcik7CisgICAgICAvKiBpZiB3ZSBnb3QgT09NLCB0aGVuIGV4aXQgKi8KKyAgICAgIGlmIChkYnVzX2Vycm9yX2hhc19uYW1lICgmdG1wX2Vycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSkpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX21vdmVfZXJyb3IgKCZ0bXBfZXJyb3IsIGVycm9yKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgLyogaWYgd2UgaGF2ZSBlcnJvciBiZWNhdXNlIHdlIGRpZG4ndCBmaW5kIGFueXRoaW5nIHRoZW4gY29udGludWUgKi8KKyAgICAgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZ0bXBfZXJyb3IpOworICAgICAgICAgIGRidXNfZnJlZSAoYXNzdW1lZF9hcHBhcm1vcl9sYWJlbCk7CisgICAgICAgICAgYXNzdW1lZF9hcHBhcm1vcl9sYWJlbCA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSICgmdG1wX2Vycm9yKTsKKworICBlbnRyeSA9IF9kYnVzX2hhc2hfdGFibGVfbG9va3VwX3N0cmluZyAoc19kaXItPmVudHJpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKGZpbGVuYW1lKSk7CisKKyAgaWYgKGVudHJ5ID09IE5VTEwpIC8qIE5ldyBmaWxlICovCisgICAgeworICAgICAgREJ1c1N0cmluZyBleHBlY3RlZF9uYW1lOworCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZXhwZWN0ZWRfbmFtZSkpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmV4cGVjdGVkX25hbWUsIG5hbWUpIHx8CisgICAgICAgICAgIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZleHBlY3RlZF9uYW1lLCAiLnNlcnZpY2UiKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmZXhwZWN0ZWRfbmFtZSk7CisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICBpZiAoX2RidXNfc3RyaW5nX2VxdWFsICgmZXhwZWN0ZWRfbmFtZSwgZmlsZW5hbWUpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIk5hbWUgb2YgXCIlc1wiIGlzIGFzIGV4cGVjdGVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmZpbGVfcGF0aCkpOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChzX2Rpci0+ZmxhZ3MgJiBCVVNfU0VSVklDRV9ESVJfRkxBR1NfU1RSSUNUX05BTUlORykKKyAgICAgICAgeworICAgICAgICAgIGJ1c19jb250ZXh0X2xvZ19hbmRfc2V0X2Vycm9yIChhY3RpdmF0aW9uLT5jb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1NZU1RFTV9MT0dfV0FSTklORywgZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2VydmljZSBmaWxlIFwiJXNcIiBzaG91bGQgaGF2ZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZWVuIG5hbWVkIFwiJXNcIjogbm90IGxvYWRpbmcgaXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZmaWxlX3BhdGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZleHBlY3RlZF9uYW1lKSk7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZleHBlY3RlZF9uYW1lKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoYnVzX2NvbnRleHRfZ2V0X3NlcnZpY2VoZWxwZXIgKGFjdGl2YXRpb24tPmNvbnRleHQpICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBidXNfY29udGV4dF9sb2cgKGFjdGl2YXRpb24tPmNvbnRleHQsIERCVVNfU1lTVEVNX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNlcnZpY2UgZmlsZSBcIiVzXCIgc2hvdWxkIGhhdmUgYmVlbiBuYW1lZCBcIiVzXCIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgImFuZCB3aWxsIG5vdCB3b3JrIHdpdGggc3lzdGVtIGJ1cyBhY3RpdmF0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmZpbGVfcGF0aCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZleHBlY3RlZF9uYW1lKSk7CisgICAgICAgICAgLyogV2UgZG9uJ3QgYWN0dWFsbHkgZXJyb3Igb3V0IGhlcmUsIGJlY2F1c2UgKnRlY2huaWNhbGx5KiBpdCBjb3VsZAorICAgICAgICAgICAqIHN0aWxsIHdvcmsgb24gc3lzdGVtZCBzeXN0ZW1zLCB3aGVyZSB3ZSB0ZWxsIHN5c3RlbWQgdG8gc3RhcnQgdGhlCisgICAgICAgICAgICogU3lzdGVtZFNlcnZpY2UgaW5zdGVhZCBvZiBsYXVuY2hpbmcgZGJ1cy1kYWVtb24tbGF1bmNoLWhlbHBlcgorICAgICAgICAgICAqIG91cnNlbHZlcy4gQnV0IG1heWJlIHdlIHNob3VsZDoKKyAgICAgICAgICAgKiBodHRwczovL2J1Z3MuZnJlZWRlc2t0b3Aub3JnL3Nob3dfYnVnLmNnaT9pZD05OTg3NCAqLworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvKiBXZSBjb3VsZCBtYXliZSBsb2cgbWlzbWF0Y2hlZCBuYW1lcyBmb3Igc2Vzc2lvbiBzZXJ2aWNlcyBpbgorICAgICAgICAgICAqIGEgdXNlci12aXNpYmxlIHdheSB0b28sIGJ1dCBub3QgdW50aWwKKyAgICAgICAgICAgKiBodHRwczovL2xpbnRpYW4uZGViaWFuLm9yZy90YWdzL2RidXMtc2Vzc2lvbi1zZXJ2aWNlLXdyb25nLW5hbWUuaHRtbAorICAgICAgICAgICAqIGlzIGEgYml0IHNob3J0ZXIuCisgICAgICAgICAgICogaHR0cHM6Ly9idWdzLmZyZWVkZXNrdG9wLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9OTk4NzMgKi8KKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiTmFtZSBvZiBcIiVzXCIgc2hvdWxkIGNhbm9uaWNhbGx5IGJlIFwiJXNcIlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZmaWxlX3BhdGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmV4cGVjdGVkX25hbWUpKTsKKyAgICAgICAgfQorCisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmV4cGVjdGVkX25hbWUpOworCisgICAgICAvKiBGSVhNRSB3ZSBuZWVkIGEgYmV0dGVyLWRlZmluZWQgYWxnb3JpdGhtIGZvciB3aGljaCBzZXJ2aWNlIGZpbGUgdG8KKyAgICAgICAqIHBpY2sgdGhhbiAid2hpY2hldmVyIG9uZSBpcyBmaXJzdCBpbiB0aGUgZGlyZWN0b3J5IGxpc3RpbmciCisgICAgICAgKiBTZWUgYWxzbyBodHRwczovL2J1Z3MuZnJlZWRlc2t0b3Aub3JnL3Nob3dfYnVnLmNnaT9pZD05OTg3NAorICAgICAgICovCisgICAgICBpZiAoX2RidXNfaGFzaF90YWJsZV9sb29rdXBfc3RyaW5nIChhY3RpdmF0aW9uLT5lbnRyaWVzLCBuYW1lKSkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJTZXJ2aWNlICVzIGFscmVhZHkgZXhpc3RzIGluIGFjdGl2YXRpb24gZW50cnkgbGlzdFxuIiwgbmFtZSk7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgICAgZW50cnkgPSBkYnVzX25ldzAgKEJ1c0FjdGl2YXRpb25FbnRyeSwgMSk7CisgICAgICBpZiAoZW50cnkgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgICAgZW50cnktPm5hbWUgPSBuYW1lOworICAgICAgZW50cnktPmV4ZWMgPSBleGVjOworICAgICAgZW50cnktPnVzZXIgPSB1c2VyOworICAgICAgZW50cnktPnN5c3RlbWRfc2VydmljZSA9IHN5c3RlbWRfc2VydmljZTsKKyAgICAgIGVudHJ5LT5hc3N1bWVkX2FwcGFybW9yX2xhYmVsID0gYXNzdW1lZF9hcHBhcm1vcl9sYWJlbDsKKyAgICAgIGVudHJ5LT5yZWZjb3VudCA9IDE7CisKKyAgICAgIC8qIG93bmVyc2hpcCBoYXMgYmVlbiB0cmFuc2ZlcnJlZCB0byBlbnRyeSwgZG8gbm90IGZyZWUgc2VwYXJhdGVseSAqLworICAgICAgbmFtZSA9IE5VTEw7CisgICAgICBleGVjID0gTlVMTDsKKyAgICAgIHVzZXIgPSBOVUxMOworICAgICAgc3lzdGVtZF9zZXJ2aWNlID0gTlVMTDsKKyAgICAgIGFzc3VtZWRfYXBwYXJtb3JfbGFiZWwgPSBOVUxMOworCisgICAgICBlbnRyeS0+c19kaXIgPSBzX2RpcjsKKyAgICAgIGVudHJ5LT5maWxlbmFtZSA9IF9kYnVzX3N0cmR1cCAoX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChmaWxlbmFtZSkpOworICAgICAgaWYgKCFlbnRyeS0+ZmlsZW5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgIGlmICghX2RidXNfaGFzaF90YWJsZV9pbnNlcnRfc3RyaW5nIChhY3RpdmF0aW9uLT5lbnRyaWVzLCBlbnRyeS0+bmFtZSwgYnVzX2FjdGl2YXRpb25fZW50cnlfcmVmIChlbnRyeSkpKQorICAgICAgICB7CisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICBpZiAoIV9kYnVzX2hhc2hfdGFibGVfaW5zZXJ0X3N0cmluZyAoc19kaXItPmVudHJpZXMsIGVudHJ5LT5maWxlbmFtZSwgYnVzX2FjdGl2YXRpb25fZW50cnlfcmVmIChlbnRyeSkpKQorICAgICAgICB7CisgICAgICAgICAgLyogUmV2ZXJ0IHRoZSBpbnNlcnRpb24gaW4gdGhlIGVudHJpZXMgdGFibGUgKi8KKyAgICAgICAgICBfZGJ1c19oYXNoX3RhYmxlX3JlbW92ZV9zdHJpbmcgKGFjdGl2YXRpb24tPmVudHJpZXMsIGVudHJ5LT5uYW1lKTsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJBZGRlZCBcIiVzXCIgdG8gbGlzdCBvZiBzZXJ2aWNlc1xuIiwgZW50cnktPm5hbWUpOworICAgIH0KKyAgZWxzZSAvKiBKdXN0IHVwZGF0ZSB0aGUgZW50cnkgKi8KKyAgICB7CisgICAgICBidXNfYWN0aXZhdGlvbl9lbnRyeV9yZWYgKGVudHJ5KTsKKyAgICAgIF9kYnVzX2hhc2hfdGFibGVfcmVtb3ZlX3N0cmluZyAoYWN0aXZhdGlvbi0+ZW50cmllcywgZW50cnktPm5hbWUpOworCisgICAgICBpZiAoX2RidXNfaGFzaF90YWJsZV9sb29rdXBfc3RyaW5nIChhY3RpdmF0aW9uLT5lbnRyaWVzLCBuYW1lKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJUaGUgbmV3IHNlcnZpY2UgbmFtZSBcIiVzXCIgb2Ygc2VydmljZSBmaWxlIFwiJXNcIiBpcyBhbHJlYWR5IGluIGNhY2hlLCBpZ25vcmluZ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZmaWxlX3BhdGgpKTsKKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlIG5ldyBzZXJ2aWNlIG5hbWUgXCIlc1wiIG9mIHNlcnZpY2UgZmlsZSBcIiVzXCIgaXMgYWxyZWFkeSBpbiBjYWNoZSwgaWdub3JpbmdcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmZpbGVfcGF0aCkpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgIC8qIG93bmVyc2hpcCBoYXMgYmVlbiB0cmFuc2ZlcnJlZCB0byBlbnRyeSwgZG8gbm90IGZyZWUgc2VwYXJhdGVseSAqLworICAgICAgZGJ1c19mcmVlIChlbnRyeS0+bmFtZSk7CisgICAgICBlbnRyeS0+bmFtZSA9IG5hbWU7CisgICAgICBuYW1lID0gTlVMTDsKKworICAgICAgZGJ1c19mcmVlIChlbnRyeS0+ZXhlYyk7CisgICAgICBlbnRyeS0+ZXhlYyA9IGV4ZWM7CisgICAgICBleGVjID0gTlVMTDsKKworICAgICAgZGJ1c19mcmVlIChlbnRyeS0+dXNlcik7CisgICAgICBlbnRyeS0+dXNlciA9IHVzZXI7CisgICAgICB1c2VyID0gTlVMTDsKKworICAgICAgZGJ1c19mcmVlIChlbnRyeS0+c3lzdGVtZF9zZXJ2aWNlKTsKKyAgICAgIGVudHJ5LT5zeXN0ZW1kX3NlcnZpY2UgPSBzeXN0ZW1kX3NlcnZpY2U7CisgICAgICBzeXN0ZW1kX3NlcnZpY2UgPSBOVUxMOworCisgICAgICBkYnVzX2ZyZWUgKGVudHJ5LT5hc3N1bWVkX2FwcGFybW9yX2xhYmVsKTsKKyAgICAgIGVudHJ5LT5hc3N1bWVkX2FwcGFybW9yX2xhYmVsID0gYXNzdW1lZF9hcHBhcm1vcl9sYWJlbDsKKyAgICAgIGFzc3VtZWRfYXBwYXJtb3JfbGFiZWwgPSBOVUxMOworCisgICAgICBpZiAoIV9kYnVzX2hhc2hfdGFibGVfaW5zZXJ0X3N0cmluZyAoYWN0aXZhdGlvbi0+ZW50cmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS0+bmFtZSwgYnVzX2FjdGl2YXRpb25fZW50cnlfcmVmKGVudHJ5KSkpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIC8qIEFsc28gcmVtb3ZlIHBhdGggdG8gZW50cmllcyBoYXNoIHNpbmNlIHdlIHdhbnQgdGhpcyBpbiBzeW5jIHdpdGgKKyAgICAgICAgICAgKiB0aGUgZW50cmllcyBoYXNoIHRhYmxlICovCisgICAgICAgICAgX2RidXNfaGFzaF90YWJsZV9yZW1vdmVfc3RyaW5nIChlbnRyeS0+c19kaXItPmVudHJpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS0+ZmlsZW5hbWUpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgfQorCisgIGVudHJ5LT5tdGltZSA9IHN0YXRfYnVmLm10aW1lOworICByZXR2YWwgPSBUUlVFOworCitvdXQ6CisgIC8qIGlmIHRoZXNlIGhhdmUgYmVlbiB0cmFuc2ZlcnJlZCBpbnRvIGVudHJ5LCB0aGUgdmFyaWFibGVzIHdpbGwgYmUgTlVMTCAqLworICBkYnVzX2ZyZWUgKGV4ZWNfdG1wKTsKKyAgZGJ1c19mcmVlIChuYW1lKTsKKyAgZGJ1c19mcmVlIChleGVjKTsKKyAgZGJ1c19mcmVlICh1c2VyKTsKKyAgZGJ1c19mcmVlIChzeXN0ZW1kX3NlcnZpY2UpOworICBkYnVzX2ZyZWUgKGFzc3VtZWRfYXBwYXJtb3JfbGFiZWwpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZpbGVfcGF0aCk7CisKKyAgaWYgKGVudHJ5KQorICAgIGJ1c19hY3RpdmF0aW9uX2VudHJ5X3VucmVmIChlbnRyeSk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19zZXJ2aWNlX2ZpbGUgKEJ1c0FjdGl2YXRpb24gICAgICAgKmFjdGl2YXRpb24sCisgICAgICAgICAgICAgICAgICAgIEJ1c0FjdGl2YXRpb25FbnRyeSAgKmVudHJ5LAorICAgICAgICAgICAgICAgICAgICBCdXNBY3RpdmF0aW9uRW50cnkgKip1cGRhdGVkX2VudHJ5LAorICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAgICplcnJvcikKK3sKKyAgREJ1c1N0YXQgc3RhdF9idWY7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgQnVzQWN0aXZhdGlvbkVudHJ5ICp0bXBfZW50cnk7CisgIERCdXNTdHJpbmcgZmlsZV9wYXRoOworICBEQnVzU3RyaW5nIGZpbGVuYW1lOworCisgIHJldHZhbCA9IFRSVUU7CisgIHRtcF9lbnRyeSA9IGVudHJ5OworCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmZmlsZW5hbWUsIGVudHJ5LT5maWxlbmFtZSk7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmZpbGVfcGF0aCkpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmZmlsZV9wYXRoLCBlbnRyeS0+c19kaXItPmRpcl9jKSB8fAorICAgICAgIV9kYnVzX2NvbmNhdF9kaXJfYW5kX2ZpbGUgKCZmaWxlX3BhdGgsICZmaWxlbmFtZSkpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHZhbCA9IEZBTFNFOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIGlmICghX2RidXNfc3RhdCAoJmZpbGVfcGF0aCwgJnN0YXRfYnVmLCBOVUxMKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiKioqKioqIENhbid0IHN0YXQgZmlsZSBcIiVzXCIsIHJlbW92aW5nIGZyb20gY2FjaGVcbiIsCisgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZmaWxlX3BhdGgpKTsKKworICAgICAgX2RidXNfaGFzaF90YWJsZV9yZW1vdmVfc3RyaW5nIChhY3RpdmF0aW9uLT5lbnRyaWVzLCBlbnRyeS0+bmFtZSk7CisgICAgICBfZGJ1c19oYXNoX3RhYmxlX3JlbW92ZV9zdHJpbmcgKGVudHJ5LT5zX2Rpci0+ZW50cmllcywgZW50cnktPmZpbGVuYW1lKTsKKworICAgICAgdG1wX2VudHJ5ID0gTlVMTDsKKyAgICAgIHJldHZhbCA9IFRSVUU7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoc3RhdF9idWYubXRpbWUgPiBlbnRyeS0+bXRpbWUpCisgICAgICAgIHsKKyAgICAgICAgICBCdXNEZXNrdG9wRmlsZSAqZGVza3RvcF9maWxlOworICAgICAgICAgIERCdXNFcnJvciB0bXBfZXJyb3I7CisKKyAgICAgICAgICBkYnVzX2Vycm9yX2luaXQgKCZ0bXBfZXJyb3IpOworCisgICAgICAgICAgZGVza3RvcF9maWxlID0gYnVzX2Rlc2t0b3BfZmlsZV9sb2FkICgmZmlsZV9wYXRoLCAmdG1wX2Vycm9yKTsKKyAgICAgICAgICBpZiAoZGVza3RvcF9maWxlID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJDb3VsZCBub3QgbG9hZCAlczogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmZpbGVfcGF0aCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcF9lcnJvci5tZXNzYWdlKTsKKyAgICAgICAgICAgICAgaWYgKGRidXNfZXJyb3JfaGFzX25hbWUgKCZ0bXBfZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBkYnVzX21vdmVfZXJyb3IgKCZ0bXBfZXJyb3IsIGVycm9yKTsKKyAgICAgICAgICAgICAgICAgIHJldHZhbCA9IEZBTFNFOworICAgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZ0bXBfZXJyb3IpOworICAgICAgICAgICAgICByZXR2YWwgPSBUUlVFOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIC8qIEB0b2RvIFdlIGNhbiByZXR1cm4gT09NIG9yIGEgREJVU19FUlJPUl9GQUlMRUQgZXJyb3IKKyAgICAgICAgICAgKiAgICAgICBIYW5kbGUgdGhlc2UgYm90aCBiZXR0ZXIKKyAgICAgICAgICAgKi8KKyAgICAgICAgICBpZiAoIXVwZGF0ZV9kZXNrdG9wX2ZpbGVfZW50cnkgKGFjdGl2YXRpb24sIGVudHJ5LT5zX2RpciwgJmZpbGVuYW1lLCBkZXNrdG9wX2ZpbGUsICZ0bXBfZXJyb3IpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBidXNfZGVza3RvcF9maWxlX2ZyZWUgKGRlc2t0b3BfZmlsZSk7CisgICAgICAgICAgICAgIGlmIChkYnVzX2Vycm9yX2hhc19uYW1lICgmdG1wX2Vycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgZGJ1c19tb3ZlX2Vycm9yICgmdG1wX2Vycm9yLCBlcnJvcik7CisgICAgICAgICAgICAgICAgICByZXR2YWwgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZGJ1c19lcnJvcl9mcmVlICgmdG1wX2Vycm9yKTsKKyAgICAgICAgICAgICAgcmV0dmFsID0gVFJVRTsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBidXNfZGVza3RvcF9maWxlX2ZyZWUgKGRlc2t0b3BfZmlsZSk7CisgICAgICAgICAgcmV0dmFsID0gVFJVRTsKKyAgICAgICAgfQorICAgIH0KKworb3V0OgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZpbGVfcGF0aCk7CisKKyAgaWYgKHVwZGF0ZWRfZW50cnkgIT0gTlVMTCkKKyAgICAqdXBkYXRlZF9lbnRyeSA9IHRtcF9lbnRyeTsKKyAgcmV0dXJuIHJldHZhbDsKK30KKworCisvKiB3YXJuaW5nOiB0aGlzIGRvZXNuJ3QgZnVsbHkgInVuZG8iIGl0c2VsZiBvbiBmYWlsdXJlLCBpLmUuIGRvZXNuJ3Qgc3RyaXAKKyAqIGhhc2ggZW50cmllcyBpdCBhbHJlYWR5IGFkZGVkLgorICovCitzdGF0aWMgZGJ1c19ib29sX3QKK3VwZGF0ZV9kaXJlY3RvcnkgKEJ1c0FjdGl2YXRpb24gICAgICAgKmFjdGl2YXRpb24sCisgICAgICAgICAgICAgICAgICBCdXNTZXJ2aWNlRGlyZWN0b3J5ICpzX2RpciwKKyAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICAgKmVycm9yKQoreworICBEQnVzRGlySXRlciAqaXRlcjsKKyAgREJ1c1N0cmluZyBkaXIsIGZpbGVuYW1lOworICBCdXNEZXNrdG9wRmlsZSAqZGVza3RvcF9maWxlOworICBEQnVzRXJyb3IgdG1wX2Vycm9yOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIEJ1c0FjdGl2YXRpb25FbnRyeSAqZW50cnk7CisgIERCdXNTdHJpbmcgZnVsbF9wYXRoOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIGl0ZXIgPSBOVUxMOworICBkZXNrdG9wX2ZpbGUgPSBOVUxMOworCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmZGlyLCBzX2Rpci0+ZGlyX2MpOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZmaWxlbmFtZSkpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmZ1bGxfcGF0aCkpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmZmlsZW5hbWUpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICByZXR2YWwgPSBGQUxTRTsKKworICAvKiBmcm9tIHRoaXMgcG9pbnQgaXQncyBzYWZlIHRvICJnb3RvIG91dCIgKi8KKworICBpdGVyID0gX2RidXNfZGlyZWN0b3J5X29wZW4gKCZkaXIsIGVycm9yKTsKKyAgaWYgKGl0ZXIgPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiRmFpbGVkIHRvIG9wZW4gZGlyZWN0b3J5ICVzOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgIHNfZGlyLT5kaXJfYywKKyAgICAgICAgICAgICAgICAgICAgIGVycm9yID8gZXJyb3ItPm1lc3NhZ2UgOiAidW5rbm93biIpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIC8qIE5vdyByZWFkIHRoZSBmaWxlcyAqLworICBkYnVzX2Vycm9yX2luaXQgKCZ0bXBfZXJyb3IpOworICB3aGlsZSAoX2RidXNfZGlyZWN0b3J5X2dldF9uZXh0X2ZpbGUgKGl0ZXIsICZmaWxlbmFtZSwgJnRtcF9lcnJvcikpCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0ICghZGJ1c19lcnJvcl9pc19zZXQgKCZ0bXBfZXJyb3IpKTsKKworICAgICAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKCZmdWxsX3BhdGgsIDApOworCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19lbmRzX3dpdGhfY19zdHIgKCZmaWxlbmFtZSwgIi5zZXJ2aWNlIikpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiU2tpcHBpbmcgbm9uLS5zZXJ2aWNlIGZpbGUgJyVzJ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZmaWxlbmFtZSkpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgIGVudHJ5ID0gX2RidXNfaGFzaF90YWJsZV9sb29rdXBfc3RyaW5nIChzX2Rpci0+ZW50cmllcywgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmZmlsZW5hbWUpKTsKKyAgICAgIGlmIChlbnRyeSkgLyogQWxyZWFkeSBoYXMgdGhpcyBzZXJ2aWNlIGZpbGUgaW4gdGhlIGNhY2hlICovCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIWNoZWNrX3NlcnZpY2VfZmlsZSAoYWN0aXZhdGlvbiwgZW50cnksIE5VTEwsIGVycm9yKSkKKyAgICAgICAgICAgIGdvdG8gb3V0OworCisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmZnVsbF9wYXRoLCBzX2Rpci0+ZGlyX2MpIHx8CisgICAgICAgICAgIV9kYnVzX2NvbmNhdF9kaXJfYW5kX2ZpbGUgKCZmdWxsX3BhdGgsICZmaWxlbmFtZSkpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgIC8qIE5ldyBmaWxlICovCisgICAgICBkZXNrdG9wX2ZpbGUgPSBidXNfZGVza3RvcF9maWxlX2xvYWQgKCZmdWxsX3BhdGgsICZ0bXBfZXJyb3IpOworICAgICAgaWYgKGRlc2t0b3BfZmlsZSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkNvdWxkIG5vdCBsb2FkICVzOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZmdWxsX3BhdGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRtcF9lcnJvci5tZXNzYWdlKTsKKworICAgICAgICAgIGlmIChkYnVzX2Vycm9yX2hhc19uYW1lICgmdG1wX2Vycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfbW92ZV9lcnJvciAoJnRtcF9lcnJvciwgZXJyb3IpOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGRidXNfZXJyb3JfZnJlZSAoJnRtcF9lcnJvcik7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgLyogQHRvZG8gV2UgY2FuIHJldHVybiBPT00gb3IgYSBEQlVTX0VSUk9SX0ZBSUxFRCBlcnJvcgorICAgICAgICogICAgICAgSGFuZGxlIHRoZXNlIGJvdGggYmV0dGVyCisgICAgICAgKi8KKyAgICAgIGlmICghdXBkYXRlX2Rlc2t0b3BfZmlsZV9lbnRyeSAoYWN0aXZhdGlvbiwgc19kaXIsICZmaWxlbmFtZSwgZGVza3RvcF9maWxlLCAmdG1wX2Vycm9yKSkKKyAgICAgICAgeworICAgICAgICAgIGJ1c19kZXNrdG9wX2ZpbGVfZnJlZSAoZGVza3RvcF9maWxlKTsKKyAgICAgICAgICBkZXNrdG9wX2ZpbGUgPSBOVUxMOworCisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkNvdWxkIG5vdCBhZGQgJXMgdG8gYWN0aXZhdGlvbiBlbnRyeSBsaXN0OiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZmdWxsX3BhdGgpLCB0bXBfZXJyb3IubWVzc2FnZSk7CisKKyAgICAgICAgICBpZiAoZGJ1c19lcnJvcl9oYXNfbmFtZSAoJnRtcF9lcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkYnVzX21vdmVfZXJyb3IgKCZ0bXBfZXJyb3IsIGVycm9yKTsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZ0bXBfZXJyb3IpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBidXNfZGVza3RvcF9maWxlX2ZyZWUgKGRlc2t0b3BfZmlsZSk7CisgICAgICAgICAgZGVza3RvcF9maWxlID0gTlVMTDsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgIH0KKworICBpZiAoZGJ1c19lcnJvcl9pc19zZXQgKCZ0bXBfZXJyb3IpKQorICAgIHsKKyAgICAgIGRidXNfbW92ZV9lcnJvciAoJnRtcF9lcnJvciwgZXJyb3IpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIHJldHZhbCA9IFRSVUU7CisKKyBvdXQ6CisgIGlmICghcmV0dmFsKQorICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgZWxzZQorICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIGlmIChpdGVyICE9IE5VTEwpCisgICAgX2RidXNfZGlyZWN0b3J5X2Nsb3NlIChpdGVyKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmaWxlbmFtZSk7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmZnVsbF9wYXRoKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3BvcHVsYXRlX2Vudmlyb25tZW50IChCdXNBY3RpdmF0aW9uICphY3RpdmF0aW9uKQoreworICBjaGFyICAgICAgICoqZW52aXJvbm1lbnQ7CisgIGRidXNfYm9vbF90ICByZXR2YWwgPSBGQUxTRTsKKworICBlbnZpcm9ubWVudCA9IF9kYnVzX2dldF9lbnZpcm9ubWVudCAoKTsKKworICBpZiAoZW52aXJvbm1lbnQgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dmFsID0gX2RidXNfaGFzaF90YWJsZV9mcm9tX2FycmF5IChhY3RpdmF0aW9uLT5lbnZpcm9ubWVudCwgZW52aXJvbm1lbnQsICc9Jyk7CisgIGRidXNfZnJlZV9zdHJpbmdfYXJyYXkgKGVudmlyb25tZW50KTsKKworICByZXR1cm4gcmV0dmFsOworfQorCitkYnVzX2Jvb2xfdAorYnVzX2FjdGl2YXRpb25fcmVsb2FkIChCdXNBY3RpdmF0aW9uICAgICAqYWN0aXZhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAgKmFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgIERCdXNMaXN0ICAgICAgICAgKipkaXJlY3RvcmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgKmVycm9yKQoreworICBEQnVzTGlzdCAgICAgICpsaW5rOworICBjaGFyICAgICAgICAgICpkaXI7CisKKyAgaWYgKGFjdGl2YXRpb24tPnNlcnZlcl9hZGRyZXNzICE9IE5VTEwpCisgICAgZGJ1c19mcmVlIChhY3RpdmF0aW9uLT5zZXJ2ZXJfYWRkcmVzcyk7CisgIGlmICghX2RidXNfc3RyaW5nX2NvcHlfZGF0YSAoYWRkcmVzcywgJmFjdGl2YXRpb24tPnNlcnZlcl9hZGRyZXNzKSkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIGlmIChhY3RpdmF0aW9uLT5lbnRyaWVzICE9IE5VTEwpCisgICAgX2RidXNfaGFzaF90YWJsZV91bnJlZiAoYWN0aXZhdGlvbi0+ZW50cmllcyk7CisgIGFjdGl2YXRpb24tPmVudHJpZXMgPSBfZGJ1c19oYXNoX3RhYmxlX25ldyAoREJVU19IQVNIX1NUUklORywgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChEQnVzRnJlZUZ1bmN0aW9uKWJ1c19hY3RpdmF0aW9uX2VudHJ5X3VucmVmKTsKKyAgaWYgKGFjdGl2YXRpb24tPmVudHJpZXMgPT0gTlVMTCkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIF9kYnVzX2xpc3RfZm9yZWFjaCAoJmFjdGl2YXRpb24tPmRpcmVjdG9yaWVzLAorICAgICAgICAgICAgICAgICAgICAgIChEQnVzRm9yZWFjaEZ1bmN0aW9uKSBidXNfc2VydmljZV9kaXJlY3RvcnlfdW5yZWYsIE5VTEwpOworICBfZGJ1c19saXN0X2NsZWFyICgmYWN0aXZhdGlvbi0+ZGlyZWN0b3JpZXMpOworCisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rIChkaXJlY3Rvcmllcyk7CisgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgeworICAgICAgQnVzQ29uZmlnU2VydmljZURpciAqY29uZmlnID0gbGluay0+ZGF0YTsKKyAgICAgIEJ1c1NlcnZpY2VEaXJlY3RvcnkgKnNfZGlyOworCisgICAgICBfZGJ1c19hc3NlcnQgKGNvbmZpZy0+cGF0aCAhPSBOVUxMKTsKKworICAgICAgZGlyID0gX2RidXNfc3RyZHVwIChjb25maWctPnBhdGgpOworICAgICAgaWYgKCFkaXIpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICB9CisKKyAgICAgIHNfZGlyID0gZGJ1c19uZXcwIChCdXNTZXJ2aWNlRGlyZWN0b3J5LCAxKTsKKyAgICAgIGlmICghc19kaXIpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX2ZyZWUgKGRpcik7CisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgfQorCisgICAgICBzX2Rpci0+cmVmY291bnQgPSAxOworICAgICAgc19kaXItPmRpcl9jID0gZGlyOworICAgICAgc19kaXItPmZsYWdzID0gY29uZmlnLT5mbGFnczsKKworICAgICAgc19kaXItPmVudHJpZXMgPSBfZGJ1c19oYXNoX3RhYmxlX25ldyAoREJVU19IQVNIX1NUUklORywgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChEQnVzRnJlZUZ1bmN0aW9uKWJ1c19hY3RpdmF0aW9uX2VudHJ5X3VucmVmKTsKKworICAgICAgaWYgKCFzX2Rpci0+ZW50cmllcykKKyAgICAgICAgeworICAgICAgICAgIGJ1c19zZXJ2aWNlX2RpcmVjdG9yeV91bnJlZiAoc19kaXIpOworICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgIH0KKworICAgICAgaWYgKCFfZGJ1c19saXN0X2FwcGVuZCAoJmFjdGl2YXRpb24tPmRpcmVjdG9yaWVzLCBzX2RpcikpCisgICAgICAgIHsKKyAgICAgICAgICBidXNfc2VydmljZV9kaXJlY3RvcnlfdW5yZWYgKHNfZGlyKTsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICB9CisKKyAgICAgIC8qIG9ubHkgZmFpbCBvbiBPT00sIGl0IGlzIG9rIGlmIHdlIGNhbid0IHJlYWQgdGhlIGRpcmVjdG9yeSAqLworICAgICAgaWYgKCF1cGRhdGVfZGlyZWN0b3J5IChhY3RpdmF0aW9uLCBzX2RpciwgZXJyb3IpKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGRidXNfZXJyb3JfaGFzX25hbWUgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSkpCisgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBkYnVzX2Vycm9yX2ZyZWUgKGVycm9yKTsKKyAgICAgICAgfQorCisgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rIChkaXJlY3RvcmllcywgbGluayk7CisgICAgfQorCisgIHJldHVybiBUUlVFOworIGZhaWxlZDoKKyAgcmV0dXJuIEZBTFNFOworfQorCitCdXNBY3RpdmF0aW9uKgorYnVzX2FjdGl2YXRpb25fbmV3IChCdXNDb250ZXh0ICAgICAgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAgKmFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgIERCdXNMaXN0ICAgICAgICAgKipkaXJlY3RvcmllcywKKyAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgKmVycm9yKQoreworICBCdXNBY3RpdmF0aW9uICphY3RpdmF0aW9uOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIGFjdGl2YXRpb24gPSBkYnVzX25ldzAgKEJ1c0FjdGl2YXRpb24sIDEpOworICBpZiAoYWN0aXZhdGlvbiA9PSBOVUxMKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgYWN0aXZhdGlvbi0+cmVmY291bnQgPSAxOworICBhY3RpdmF0aW9uLT5jb250ZXh0ID0gY29udGV4dDsKKyAgYWN0aXZhdGlvbi0+bl9wZW5kaW5nX2FjdGl2YXRpb25zID0gMDsKKworICBpZiAoIWJ1c19hY3RpdmF0aW9uX3JlbG9hZCAoYWN0aXZhdGlvbiwgYWRkcmVzcywgZGlyZWN0b3JpZXMsIGVycm9yKSkKKyAgICBnb3RvIGZhaWxlZDsKKworICAgLyogSW5pdGlhbGl6ZSB0aGlzIGhhc2ggdGFibGUgb25jZSwgd2UgZG9uJ3Qgd2FudCB0byBsb3NlIHBlbmRpbmcKKyAgICogYWN0aXZhdGlvbnMgb24gcmVsb2FkLiAqLworICBhY3RpdmF0aW9uLT5wZW5kaW5nX2FjdGl2YXRpb25zID0gX2RidXNfaGFzaF90YWJsZV9uZXcgKERCVVNfSEFTSF9TVFJJTkcsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKERCdXNGcmVlRnVuY3Rpb24pYnVzX3BlbmRpbmdfYWN0aXZhdGlvbl91bnJlZik7CisKKyAgaWYgKGFjdGl2YXRpb24tPnBlbmRpbmdfYWN0aXZhdGlvbnMgPT0gTlVMTCkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIGFjdGl2YXRpb24tPmVudmlyb25tZW50ID0gX2RidXNfaGFzaF90YWJsZV9uZXcgKERCVVNfSEFTSF9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChEQnVzRnJlZUZ1bmN0aW9uKSBkYnVzX2ZyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChEQnVzRnJlZUZ1bmN0aW9uKSBkYnVzX2ZyZWUpOworCisgIGlmIChhY3RpdmF0aW9uLT5lbnZpcm9ubWVudCA9PSBOVUxMKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgaWYgKCFwb3B1bGF0ZV9lbnZpcm9ubWVudCAoYWN0aXZhdGlvbikpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICByZXR1cm4gYWN0aXZhdGlvbjsKKworIGZhaWxlZDoKKyAgYnVzX2FjdGl2YXRpb25fdW5yZWYgKGFjdGl2YXRpb24pOworICByZXR1cm4gTlVMTDsKK30KKworQnVzQWN0aXZhdGlvbiAqCitidXNfYWN0aXZhdGlvbl9yZWYgKEJ1c0FjdGl2YXRpb24gKmFjdGl2YXRpb24pCit7CisgIF9kYnVzX2Fzc2VydCAoYWN0aXZhdGlvbi0+cmVmY291bnQgPiAwKTsKKworICBhY3RpdmF0aW9uLT5yZWZjb3VudCArPSAxOworCisgIHJldHVybiBhY3RpdmF0aW9uOworfQorCit2b2lkCitidXNfYWN0aXZhdGlvbl91bnJlZiAoQnVzQWN0aXZhdGlvbiAqYWN0aXZhdGlvbikKK3sKKyAgX2RidXNfYXNzZXJ0IChhY3RpdmF0aW9uLT5yZWZjb3VudCA+IDApOworCisgIGFjdGl2YXRpb24tPnJlZmNvdW50IC09IDE7CisKKyAgaWYgKGFjdGl2YXRpb24tPnJlZmNvdW50ID4gMCkKKyAgICByZXR1cm47CisKKyAgZGJ1c19mcmVlIChhY3RpdmF0aW9uLT5zZXJ2ZXJfYWRkcmVzcyk7CisgIGlmIChhY3RpdmF0aW9uLT5lbnRyaWVzKQorICAgIF9kYnVzX2hhc2hfdGFibGVfdW5yZWYgKGFjdGl2YXRpb24tPmVudHJpZXMpOworICBpZiAoYWN0aXZhdGlvbi0+cGVuZGluZ19hY3RpdmF0aW9ucykKKyAgICBfZGJ1c19oYXNoX3RhYmxlX3VucmVmIChhY3RpdmF0aW9uLT5wZW5kaW5nX2FjdGl2YXRpb25zKTsKKworICBfZGJ1c19saXN0X2ZvcmVhY2ggKCZhY3RpdmF0aW9uLT5kaXJlY3RvcmllcywKKyAgICAgICAgICAgICAgICAgICAgICAoREJ1c0ZvcmVhY2hGdW5jdGlvbikgYnVzX3NlcnZpY2VfZGlyZWN0b3J5X3VucmVmLCBOVUxMKTsKKyAgX2RidXNfbGlzdF9jbGVhciAoJmFjdGl2YXRpb24tPmRpcmVjdG9yaWVzKTsKKworICBpZiAoYWN0aXZhdGlvbi0+ZW52aXJvbm1lbnQpCisgICAgX2RidXNfaGFzaF90YWJsZV91bnJlZiAoYWN0aXZhdGlvbi0+ZW52aXJvbm1lbnQpOworCisgIGRidXNfZnJlZSAoYWN0aXZhdGlvbik7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYWRkX2J1c19lbnZpcm9ubWVudCAoQnVzQWN0aXZhdGlvbiAqYWN0aXZhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgKmVycm9yKQoreworICBjb25zdCBjaGFyICp0eXBlOworCisgIGlmICghYnVzX2FjdGl2YXRpb25fc2V0X2Vudmlyb25tZW50X3ZhcmlhYmxlIChhY3RpdmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRCVVNfU1RBUlRFUl9BRERSRVNTIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2YXRpb24tPnNlcnZlcl9hZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKQorICAgIHJldHVybiBGQUxTRTsKKworICB0eXBlID0gYnVzX2NvbnRleHRfZ2V0X3R5cGUgKGFjdGl2YXRpb24tPmNvbnRleHQpOworICBpZiAodHlwZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmICghYnVzX2FjdGl2YXRpb25fc2V0X2Vudmlyb25tZW50X3ZhcmlhYmxlIChhY3RpdmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEQlVTX1NUQVJURVJfQlVTX1RZUEUiLCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICBpZiAoc3RyY21wICh0eXBlLCAic2Vzc2lvbiIpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIWJ1c19hY3RpdmF0aW9uX3NldF9lbnZpcm9ubWVudF92YXJpYWJsZSAoYWN0aXZhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRCVVNfU0VTU0lPTl9CVVNfQUREUkVTUyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2YXRpb24tPnNlcnZlcl9hZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAodHlwZSwgInN5c3RlbSIpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIWJ1c19hY3RpdmF0aW9uX3NldF9lbnZpcm9ubWVudF92YXJpYWJsZSAoYWN0aXZhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRCVVNfU1lTVEVNX0JVU19BRERSRVNTIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZhdGlvbi0+c2VydmVyX2FkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgQnVzUGVuZGluZ0FjdGl2YXRpb24gKnBlbmRpbmdfYWN0aXZhdGlvbjsKKyAgREJ1c1ByZWFsbG9jYXRlZEhhc2ggKmhhc2hfZW50cnk7Cit9IFJlc3RvcmVQZW5kaW5nRGF0YTsKKworc3RhdGljIHZvaWQKK3Jlc3RvcmVfcGVuZGluZyAodm9pZCAqZGF0YSkKK3sKKyAgUmVzdG9yZVBlbmRpbmdEYXRhICpkID0gZGF0YTsKKworICBfZGJ1c19hc3NlcnQgKGQtPnBlbmRpbmdfYWN0aXZhdGlvbiAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChkLT5oYXNoX2VudHJ5ICE9IE5VTEwpOworCisgIF9kYnVzX3ZlcmJvc2UgKCJSZXN0b3JpbmcgcGVuZGluZyBhY3RpdmF0aW9uIGZvciBzZXJ2aWNlICVzLCBoYXMgdGltZW91dCA9ICVkXG4iLAorICAgICAgICAgICAgICAgICBkLT5wZW5kaW5nX2FjdGl2YXRpb24tPnNlcnZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgZC0+cGVuZGluZ19hY3RpdmF0aW9uLT50aW1lb3V0X2FkZGVkKTsKKworICBfZGJ1c19oYXNoX3RhYmxlX2luc2VydF9zdHJpbmdfcHJlYWxsb2NhdGVkIChkLT5wZW5kaW5nX2FjdGl2YXRpb24tPmFjdGl2YXRpb24tPnBlbmRpbmdfYWN0aXZhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQtPmhhc2hfZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQtPnBlbmRpbmdfYWN0aXZhdGlvbi0+c2VydmljZV9uYW1lLCBkLT5wZW5kaW5nX2FjdGl2YXRpb24pOworCisgIGJ1c19wZW5kaW5nX2FjdGl2YXRpb25fcmVmIChkLT5wZW5kaW5nX2FjdGl2YXRpb24pOworCisgIGQtPmhhc2hfZW50cnkgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZAorZnJlZV9yZXN0b3JlX3BlbmRpbmdfZGF0YSAodm9pZCAqZGF0YSkKK3sKKyAgUmVzdG9yZVBlbmRpbmdEYXRhICpkID0gZGF0YTsKKworICBpZiAoZC0+aGFzaF9lbnRyeSkKKyAgICBfZGJ1c19oYXNoX3RhYmxlX2ZyZWVfcHJlYWxsb2NhdGVkX2VudHJ5IChkLT5wZW5kaW5nX2FjdGl2YXRpb24tPmFjdGl2YXRpb24tPnBlbmRpbmdfYWN0aXZhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC0+aGFzaF9lbnRyeSk7CisKKyAgYnVzX3BlbmRpbmdfYWN0aXZhdGlvbl91bnJlZiAoZC0+cGVuZGluZ19hY3RpdmF0aW9uKTsKKworICBkYnVzX2ZyZWUgKGQpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2FkZF9yZXN0b3JlX3BlbmRpbmdfdG9fdHJhbnNhY3Rpb24gKEJ1c1RyYW5zYWN0aW9uICAgICAgICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1BlbmRpbmdBY3RpdmF0aW9uICpwZW5kaW5nX2FjdGl2YXRpb24pCit7CisgIFJlc3RvcmVQZW5kaW5nRGF0YSAqZDsKKworICBkID0gZGJ1c19uZXcgKFJlc3RvcmVQZW5kaW5nRGF0YSwgMSk7CisgIGlmIChkID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGQtPnBlbmRpbmdfYWN0aXZhdGlvbiA9IHBlbmRpbmdfYWN0aXZhdGlvbjsKKyAgZC0+aGFzaF9lbnRyeSA9IF9kYnVzX2hhc2hfdGFibGVfcHJlYWxsb2NhdGVfZW50cnkgKGQtPnBlbmRpbmdfYWN0aXZhdGlvbi0+YWN0aXZhdGlvbi0+cGVuZGluZ19hY3RpdmF0aW9ucyk7CisKKyAgYnVzX3BlbmRpbmdfYWN0aXZhdGlvbl9yZWYgKGQtPnBlbmRpbmdfYWN0aXZhdGlvbik7CisKKyAgaWYgKGQtPmhhc2hfZW50cnkgPT0gTlVMTCB8fAorICAgICAgIWJ1c190cmFuc2FjdGlvbl9hZGRfY2FuY2VsX2hvb2sgKHRyYW5zYWN0aW9uLCByZXN0b3JlX3BlbmRpbmcsIGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZV9yZXN0b3JlX3BlbmRpbmdfZGF0YSkpCisgICAgeworICAgICAgZnJlZV9yZXN0b3JlX3BlbmRpbmdfZGF0YSAoZCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIF9kYnVzX3ZlcmJvc2UgKCJTYXZlZCBwZW5kaW5nIGFjdGl2YXRpb24gdG8gYmUgcmVzdG9yZWQgaWYgdGhlIHRyYW5zYWN0aW9uIGZhaWxzXG4iKTsKKworICByZXR1cm4gVFJVRTsKK30KKworZGJ1c19ib29sX3QKK2J1c19hY3RpdmF0aW9uX3NlcnZpY2VfY3JlYXRlZCAoQnVzQWN0aXZhdGlvbiAgKmFjdGl2YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpzZXJ2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBCdXNQZW5kaW5nQWN0aXZhdGlvbiAqcGVuZGluZ19hY3RpdmF0aW9uOworICBEQnVzTWVzc2FnZSAqbWVzc2FnZTsKKyAgREJ1c0xpc3QgKmxpbms7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgLyogQ2hlY2sgaWYgaXQncyBhIHBlbmRpbmcgYWN0aXZhdGlvbiAqLworICBwZW5kaW5nX2FjdGl2YXRpb24gPSBfZGJ1c19oYXNoX3RhYmxlX2xvb2t1cF9zdHJpbmcgKGFjdGl2YXRpb24tPnBlbmRpbmdfYWN0aXZhdGlvbnMsIHNlcnZpY2VfbmFtZSk7CisKKyAgaWYgKCFwZW5kaW5nX2FjdGl2YXRpb24pCisgICAgcmV0dXJuIFRSVUU7CisKKyAgYnVzX2NvbnRleHRfbG9nIChhY3RpdmF0aW9uLT5jb250ZXh0LAorICAgICAgICAgICAgICAgICAgIERCVVNfU1lTVEVNX0xPR19JTkZPLCAiU3VjY2Vzc2Z1bGx5IGFjdGl2YXRlZCBzZXJ2aWNlICclcyciLAorICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfbmFtZSk7CisKKyAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZwZW5kaW5nX2FjdGl2YXRpb24tPmVudHJpZXMpOworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIEJ1c1BlbmRpbmdBY3RpdmF0aW9uRW50cnkgKmVudHJ5ID0gbGluay0+ZGF0YTsKKyAgICAgIERCdXNMaXN0ICpuZXh0ID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmcGVuZGluZ19hY3RpdmF0aW9uLT5lbnRyaWVzLCBsaW5rKTsKKworICAgICAgLyogZW50cnktPmNvbm5lY3Rpb24gaXMgTlVMTCBmb3IgYWN0aXZhdGluZyBzeXN0ZW1kICovCisgICAgICBpZiAoZW50cnktPmNvbm5lY3Rpb24gJiYgZGJ1c19jb25uZWN0aW9uX2dldF9pc19jb25uZWN0ZWQgKGVudHJ5LT5jb25uZWN0aW9uKSkKKyAgICAgICAgeworICAgICAgICAgIC8qIE9ubHkgc2VuZCBhY3RpdmF0aW9uIHJlcGxpZXMgdG8gcmVndWxhciBhY3RpdmF0aW9uIHJlcXVlc3RzLiAqLworICAgICAgICAgIGlmICghZW50cnktPmF1dG9fYWN0aXZhdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCByZXN1bHQ7CisKKyAgICAgICAgICAgICAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX3JldHVybiAoZW50cnktPmFjdGl2YXRpb25fbWVzc2FnZSk7CisgICAgICAgICAgICAgIGlmICghbWVzc2FnZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgcmVzdWx0ID0gREJVU19TVEFSVF9SRVBMWV9TVUNDRVNTOworCisgICAgICAgICAgICAgIGlmICghZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1VJTlQzMiwgJnJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGlmICghYnVzX3RyYW5zYWN0aW9uX3NlbmRfZnJvbV9kcml2ZXIgKHRyYW5zYWN0aW9uLCBlbnRyeS0+Y29ubmVjdGlvbiwgbWVzc2FnZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgIGxpbmsgPSBuZXh0OworICAgIH0KKworICByZXR1cm4gVFJVRTsKKworIGVycm9yOgorICByZXR1cm4gRkFMU0U7Cit9CisKK2RidXNfYm9vbF90CitidXNfYWN0aXZhdGlvbl9zZW5kX3BlbmRpbmdfYXV0b19hY3RpdmF0aW9uX21lc3NhZ2VzIChCdXNBY3RpdmF0aW9uICAqYWN0aXZhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1NlcnZpY2UgICAgICpzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uKQoreworICBCdXNQZW5kaW5nQWN0aXZhdGlvbiAqcGVuZGluZ19hY3RpdmF0aW9uOworICBEQnVzTGlzdCAqbGluazsKKworICAvKiBDaGVjayBpZiBpdCdzIGEgcGVuZGluZyBhY3RpdmF0aW9uICovCisgIHBlbmRpbmdfYWN0aXZhdGlvbiA9IF9kYnVzX2hhc2hfdGFibGVfbG9va3VwX3N0cmluZyAoYWN0aXZhdGlvbi0+cGVuZGluZ19hY3RpdmF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXNfc2VydmljZV9nZXRfbmFtZSAoc2VydmljZSkpOworCisgIGlmICghcGVuZGluZ19hY3RpdmF0aW9uKQorICAgIHJldHVybiBUUlVFOworCisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmcGVuZGluZ19hY3RpdmF0aW9uLT5lbnRyaWVzKTsKKyAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBCdXNQZW5kaW5nQWN0aXZhdGlvbkVudHJ5ICplbnRyeSA9IGxpbmstPmRhdGE7CisgICAgICBEQnVzTGlzdCAqbmV4dCA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJnBlbmRpbmdfYWN0aXZhdGlvbi0+ZW50cmllcywgbGluayk7CisKKyAgICAgIGlmIChlbnRyeS0+YXV0b19hY3RpdmF0aW9uICYmIChlbnRyeS0+Y29ubmVjdGlvbiA9PSBOVUxMIHx8IGRidXNfY29ubmVjdGlvbl9nZXRfaXNfY29ubmVjdGVkIChlbnRyeS0+Y29ubmVjdGlvbikpKQorICAgICAgICB7CisgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmFkZHJlc3NlZF9yZWNpcGllbnQ7CisgICAgICAgICAgREJ1c0Vycm9yIGVycm9yOworCisgICAgICAgICAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworCisgICAgICAgICAgYWRkcmVzc2VkX3JlY2lwaWVudCA9IGJ1c19zZXJ2aWNlX2dldF9wcmltYXJ5X293bmVyc19jb25uZWN0aW9uIChzZXJ2aWNlKTsKKworICAgICAgICAgIC8qIFJlc3VtZSBkaXNwYXRjaGluZyB3aGVyZSB3ZSBsZWZ0IG9mZiBpbiBidXNfZGlzcGF0Y2goKSAqLworICAgICAgICAgIGlmICghYnVzX2Rpc3BhdGNoX21hdGNoZXMgKHRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LT5jb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3NlZF9yZWNpcGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnktPmFjdGl2YXRpb25fbWVzc2FnZSwgJmVycm9yKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogSWYgcGVybWlzc2lvbiBpcyBkZW5pZWQsIHdlIGp1c3Qgd2FudCB0byByZXR1cm4gdGhlIGVycm9yCisgICAgICAgICAgICAgICAqIHRvIHRoZSBvcmlnaW5hbCBtZXRob2QgaW52b2tlcjsgaW4gcGFydGljdWxhciwgd2UgZG9uJ3QKKyAgICAgICAgICAgICAgICogd2FudCB0byBtYWtlIHRoZSBSZXF1ZXN0TmFtZSBjYWxsIGZhaWwgd2l0aCB0aGF0IGVycm9yCisgICAgICAgICAgICAgICAqIChzZWUgZmQubyAjNzg5NzksIENWRS0yMDE0LTM0NzcpLiAqLworICAgICAgICAgICAgICBpZiAoIWJ1c190cmFuc2FjdGlvbl9zZW5kX2Vycm9yX3JlcGx5ICh0cmFuc2FjdGlvbiwgZW50cnktPmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvciwgZW50cnktPmFjdGl2YXRpb25fbWVzc2FnZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgYnVzX2Nvbm5lY3Rpb25fc2VuZF9vb21fZXJyb3IgKGVudHJ5LT5jb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LT5hY3RpdmF0aW9uX21lc3NhZ2UpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICAgICAgICAgIGxpbmsgPSBuZXh0OworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICBsaW5rID0gbmV4dDsKKyAgICB9CisKKyAgaWYgKCFhZGRfcmVzdG9yZV9wZW5kaW5nX3RvX3RyYW5zYWN0aW9uICh0cmFuc2FjdGlvbiwgcGVuZGluZ19hY3RpdmF0aW9uKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiQ291bGQgbm90IGFkZCBjYW5jZWwgaG9vayB0byB0cmFuc2FjdGlvbiB0byByZXZlcnQgcmVtb3ZpbmcgcGVuZGluZyBhY3RpdmF0aW9uXG4iKTsKKyAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgIF9kYnVzX2hhc2hfdGFibGVfcmVtb3ZlX3N0cmluZyAoYWN0aXZhdGlvbi0+cGVuZGluZ19hY3RpdmF0aW9ucywgYnVzX3NlcnZpY2VfZ2V0X25hbWUgKHNlcnZpY2UpKTsKKworICByZXR1cm4gVFJVRTsKKworIGVycm9yOgorICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKgorICogRklYTUUgQHRvZG8gdGhlIGVycm9yIG1lc3NhZ2VzIGhlcmUgd291bGQgaWRlYWxseSBiZSBwcmVhbGxvY2F0ZWQKKyAqIHNvIHdlIGRvbid0IG5lZWQgdG8gYWxsb2NhdGUgbWVtb3J5IHRvIHNlbmQgdGhlbS4KKyAqIFVzaW5nIHRoZSB1c3VhbCB0YWN0aWMsIHByZWFsbG9jIGFuIE9PTSBtZXNzYWdlLCB0aGVuCisgKiBpZiB3ZSBjYW4ndCBhbGxvYyB0aGUgcmVhbCBlcnJvciBzZW5kIHRoZSBPT00gZXJyb3IgaW5zdGVhZC4KKyAqLworc3RhdGljIGRidXNfYm9vbF90Cit0cnlfc2VuZF9hY3RpdmF0aW9uX2ZhaWx1cmUgKEJ1c1BlbmRpbmdBY3RpdmF0aW9uICpwZW5kaW5nX2FjdGl2YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNFcnJvciAgICAgICpob3cpCit7CisgIEJ1c0FjdGl2YXRpb24gKmFjdGl2YXRpb247CisgIERCdXNMaXN0ICpsaW5rOworICBCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb247CisKKyAgYWN0aXZhdGlvbiA9IHBlbmRpbmdfYWN0aXZhdGlvbi0+YWN0aXZhdGlvbjsKKworICB0cmFuc2FjdGlvbiA9IGJ1c190cmFuc2FjdGlvbl9uZXcgKGFjdGl2YXRpb24tPmNvbnRleHQpOworICBpZiAodHJhbnNhY3Rpb24gPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZwZW5kaW5nX2FjdGl2YXRpb24tPmVudHJpZXMpOworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIEJ1c1BlbmRpbmdBY3RpdmF0aW9uRW50cnkgKmVudHJ5ID0gbGluay0+ZGF0YTsKKyAgICAgIERCdXNMaXN0ICpuZXh0ID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmcGVuZGluZ19hY3RpdmF0aW9uLT5lbnRyaWVzLCBsaW5rKTsKKworICAgICAgaWYgKGVudHJ5LT5jb25uZWN0aW9uICYmIGRidXNfY29ubmVjdGlvbl9nZXRfaXNfY29ubmVjdGVkIChlbnRyeS0+Y29ubmVjdGlvbikpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIWJ1c190cmFuc2FjdGlvbl9zZW5kX2Vycm9yX3JlcGx5ICh0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS0+Y29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnktPmFjdGl2YXRpb25fbWVzc2FnZSkpCisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisKKyAgICAgIGxpbmsgPSBuZXh0OworICAgIH0KKworICBidXNfdHJhbnNhY3Rpb25fZXhlY3V0ZV9hbmRfZnJlZSAodHJhbnNhY3Rpb24pOworCisgIHJldHVybiBUUlVFOworCisgZXJyb3I6CisgIGlmICh0cmFuc2FjdGlvbikKKyAgICBidXNfdHJhbnNhY3Rpb25fY2FuY2VsX2FuZF9mcmVlICh0cmFuc2FjdGlvbik7CisgIHJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBGcmVlIHRoZSBwZW5kaW5nIGFjdGl2YXRpb24gYW5kIHNlbmQgYW4gZXJyb3IgbWVzc2FnZSB0byBhbGwgdGhlCisgKiBjb25uZWN0aW9ucyB0aGF0IHdlcmUgd2FpdGluZyBmb3IgaXQuCisgKi8KK3N0YXRpYyB2b2lkCitwZW5kaW5nX2FjdGl2YXRpb25fZmFpbGVkIChCdXNQZW5kaW5nQWN0aXZhdGlvbiAqcGVuZGluZ19hY3RpdmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c0Vycm9yICAgICAgKmhvdykKK3sKKyAgLyogRklYTUUgdXNlIHByZWFsbG9jYXRlZCBPT00gbWVzc2FnZXMgaW5zdGVhZCBvZiBidXNfd2FpdF9mb3JfbWVtb3J5KCkgKi8KKyAgd2hpbGUgKCF0cnlfc2VuZF9hY3RpdmF0aW9uX2ZhaWx1cmUgKHBlbmRpbmdfYWN0aXZhdGlvbiwgaG93KSkKKyAgICBfZGJ1c193YWl0X2Zvcl9tZW1vcnkgKCk7CisKKyAgLyogRGVzdHJveSB0aGlzIHBlbmRpbmcgYWN0aXZhdGlvbiAqLworICBfZGJ1c19oYXNoX3RhYmxlX3JlbW92ZV9zdHJpbmcgKHBlbmRpbmdfYWN0aXZhdGlvbi0+YWN0aXZhdGlvbi0+cGVuZGluZ19hY3RpdmF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nX2FjdGl2YXRpb24tPnNlcnZpY2VfbmFtZSk7Cit9CisKKy8qKgorICogRGVwZW5kaW5nIG9uIHRoZSBleGl0IGNvZGUgb2YgdGhlIGhlbHBlciwgc2V0IHRoZSBlcnJvciBhY2NvcmRpbmdseQorICovCitzdGF0aWMgdm9pZAoraGFuZGxlX3NlcnZpY2VoZWxwZXJfZXhpdF9lcnJvciAoaW50ICAgICAgICBleGl0X2NvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgKmVycm9yKQoreworICBzd2l0Y2ggKGV4aXRfY29kZSkKKyAgICB7CisgICAgY2FzZSBCVVNfU1BBV05fRVhJVF9DT0RFX0NPTkZJR19JTlZBTElEOgorICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX1NQQVdOX0NPTkZJR19JTlZBTElELAorCQkgICAgICAiSW52YWxpZCBjb25maWd1cmF0aW9uIChtaXNzaW5nIG9yIGVtcHR5IDx1c2VyPj8pIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEJVU19TUEFXTl9FWElUX0NPREVfTk9fTUVNT1JZOgorICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwKKyAgICAgICAgICAgICAgICAgICAgICAiTGF1bmNoZXIgY291bGQgbm90IHJ1biAob3V0IG9mIG1lbW9yeSkiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQlVTX1NQQVdOX0VYSVRfQ09ERV9TRVRVUF9GQUlMRUQ6CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfU1BBV05fU0VUVVBfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gc2V0dXAgZW52aXJvbm1lbnQgY29ycmVjdGx5Iik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEJVU19TUEFXTl9FWElUX0NPREVfTkFNRV9JTlZBTElEOgorICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX1NQQVdOX1NFUlZJQ0VfSU5WQUxJRCwKKyAgICAgICAgICAgICAgICAgICAgICAiQnVzIG5hbWUgaXMgbm90IHZhbGlkIG9yIG1pc3NpbmciKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQlVTX1NQQVdOX0VYSVRfQ09ERV9TRVJWSUNFX05PVF9GT1VORDoKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9TUEFXTl9TRVJWSUNFX05PVF9GT1VORCwKKyAgICAgICAgICAgICAgICAgICAgICAiQnVzIG5hbWUgbm90IGZvdW5kIGluIHN5c3RlbSBzZXJ2aWNlIGRpcmVjdG9yeSIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCVVNfU1BBV05fRVhJVF9DT0RFX1BFUk1JU1NJT05TX0lOVkFMSUQ6CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfU1BBV05fUEVSTUlTU0lPTlNfSU5WQUxJRCwKKyAgICAgICAgICAgICAgICAgICAgICAiVGhlIHBlcm1pc3Npb24gb2YgdGhlIHNldHVpZCBoZWxwZXIgaXMgbm90IGNvcnJlY3QiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQlVTX1NQQVdOX0VYSVRfQ09ERV9GSUxFX0lOVkFMSUQ6CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfU1BBV05fUEVSTUlTU0lPTlNfSU5WQUxJRCwKKyAgICAgICAgICAgICAgICAgICAgICAiVGhlIHNlcnZpY2UgZmlsZSBpcyBpbmNvcnJlY3Qgb3IgZG9lcyBub3QgaGF2ZSBhbGwgcmVxdWlyZWQgYXR0cmlidXRlcyIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCVVNfU1BBV05fRVhJVF9DT0RFX0VYRUNfRkFJTEVEOgorICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX1NQQVdOX0VYRUNfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgbGF1bmNoIGRhZW1vbiwgZmlsZSBub3QgZm91bmQgb3IgcGVybWlzc2lvbnMgaW52YWxpZCIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCVVNfU1BBV05fRVhJVF9DT0RFX0lOVkFMSURfQVJHUzoKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9JTlZBTElEX0FSR1MsCisgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgYXJndW1lbnRzIHRvIGNvbW1hbmQgbGluZSIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCVVNfU1BBV05fRVhJVF9DT0RFX0NISUxEX1NJR05BTEVEOgorICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX1NQQVdOX0NISUxEX1NJR05BTEVELAorICAgICAgICAgICAgICAgICAgICAgICJMYXVuY2hlZCBjaGlsZCB3YXMgc2lnbmFsZWQsIGl0IHByb2JhYmx5IGNyYXNoZWQiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQlVTX1NQQVdOX0VYSVRfQ09ERV9HRU5FUklDX0ZBSUxVUkU6CisgICAgZGVmYXVsdDoKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9TUEFXTl9DSElMRF9FWElURUQsCisgICAgICAgICAgICAgICAgICAgICAgIkxhdW5jaCBoZWxwZXIgZXhpdGVkIHdpdGggdW5rbm93biByZXR1cm4gY29kZSAlaSIsIGV4aXRfY29kZSk7CisgICAgICBicmVhazsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitwZW5kaW5nX2FjdGl2YXRpb25fZmluaXNoZWRfY2IgKERCdXNCYWJ5c2l0dGVyICpiYWJ5c2l0dGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAqZGF0YSkKK3sKKyAgQnVzUGVuZGluZ0FjdGl2YXRpb24gKnBlbmRpbmdfYWN0aXZhdGlvbiA9IGRhdGE7CisgIGRidXNfYm9vbF90IHVzZXNfc2VydmljZWhlbHBlcjsKKworICBfZGJ1c19hc3NlcnQgKGJhYnlzaXR0ZXIgPT0gcGVuZGluZ19hY3RpdmF0aW9uLT5iYWJ5c2l0dGVyKTsKKyAgX2RidXNfYmFieXNpdHRlcl9yZWYgKGJhYnlzaXR0ZXIpOworCisgIC8qIFRoZXJlIGFyZSB0d28gbWFqb3IgY2FzZXMgaGVyZTsgYXJlIHdlIHRoZSBzeXN0ZW0gYnVzIG9yIHRoZSBzZXNzaW9uPyAgSGVyZSB0aGlzCisgICAqIGlzIGRpc3Rpbmd1aXNoZWQgYnkgd2hldGhlciBvciBub3Qgd2UgdXNlIGEgc2V0dWlkIGhlbHBlciBsYXVuY2hlci4gIFdpdGggdGhlIGxhdW5jaCBoZWxwZXIsCisgICAqIHNvbWUgcHJvY2VzcyBleGl0IGNvZGVzIGFyZSBtZWFuaW5nZnVsLCBwcm9jZXNzZWQgYnkgaGFuZGxlX3NlcnZpY2VoZWxwZXJfZXhpdF9lcnJvci4KKyAgICoKKyAgICogSW4gYm90aCBjYXNlcyB0aG91Z2gsIGp1c3QgaWdub3JlIHdoZW4gYSBwcm9jZXNzIGV4aXRzIHdpdGggc3RhdHVzIDA7IGl0J3MgcG9zc2libGUgZm9yCisgICAqIGEgcHJvZ3JhbSB0byAobWlzZ3VpZGVkbHkpICJkYWVtb25pemUiLCBhbmQgdGhhdCBhcHBlYXJzIHRvIHVzIGFzIGFuIGV4aXQuICBUaGlzIGNsb3NlcyBhIHJhY2UKKyAgICogY29uZGl0aW9uIGJldHdlZW4gdGhpcyBjb2RlIGFuZCB0aGUgY2hpbGQgcHJvY2VzcyBjbGFpbWluZyB0aGUgYnVzIG5hbWUuCisgICAqLworICB1c2VzX3NlcnZpY2VoZWxwZXIgPSBidXNfY29udGV4dF9nZXRfc2VydmljZWhlbHBlciAocGVuZGluZ19hY3RpdmF0aW9uLT5hY3RpdmF0aW9uLT5jb250ZXh0KSAhPSBOVUxMOworCisgIC8qIHN0cmljdGx5IHNwZWFraW5nIHRoaXMgaXMgcmVkdW5kYW50IHdpdGggdGhlIGNoZWNrIGluIGRidXMtc3Bhd24gbm93ICovCisgIGlmIChfZGJ1c19iYWJ5c2l0dGVyX2dldF9jaGlsZF9leGl0ZWQgKGJhYnlzaXR0ZXIpKQorICAgIHsKKyAgICAgIERCdXNFcnJvciBlcnJvcjsKKyAgICAgIERCdXNIYXNoSXRlciBpdGVyOworICAgICAgZGJ1c19ib29sX3QgYWN0aXZhdGlvbl9mYWlsZWQ7CisgICAgICBpbnQgZXhpdF9jb2RlID0gMDsKKworICAgICAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworCisgICAgICBfZGJ1c19iYWJ5c2l0dGVyX3NldF9jaGlsZF9leGl0X2Vycm9yIChiYWJ5c2l0dGVyLCAmZXJyb3IpOworCisgICAgICAvKiBFeHBsaWNpdGx5IGNoZWNrIGZvciBTUEFXTl9DSElMRF9FWElURUQgdG8gYXZvaWQgb3ZlcndyaXRpbmcgYW4KKyAgICAgICAqIGV4ZWMgZXJyb3IgKi8KKyAgICAgIGlmIChkYnVzX2Vycm9yX2hhc19uYW1lICgmZXJyb3IsIERCVVNfRVJST1JfU1BBV05fQ0hJTERfRVhJVEVEKQorICAgICAgICAgICYmIF9kYnVzX2JhYnlzaXR0ZXJfZ2V0X2NoaWxkX2V4aXRfc3RhdHVzIChiYWJ5c2l0dGVyLCAmZXhpdF9jb2RlKSkKKyAgICAgICAgeworICAgICAgICAgIGFjdGl2YXRpb25fZmFpbGVkID0gZXhpdF9jb2RlICE9IDA7CisKKyAgICAgICAgICBkYnVzX2Vycm9yX2ZyZWUoJmVycm9yKTsKKworICAgICAgICAgIGlmIChhY3RpdmF0aW9uX2ZhaWxlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKHVzZXNfc2VydmljZWhlbHBlcikKKyAgICAgICAgICAgICAgICBoYW5kbGVfc2VydmljZWhlbHBlcl9leGl0X2Vycm9yIChleGl0X2NvZGUsICZlcnJvcik7CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBfZGJ1c19iYWJ5c2l0dGVyX3NldF9jaGlsZF9leGl0X2Vycm9yIChiYWJ5c2l0dGVyLCAmZXJyb3IpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBhY3RpdmF0aW9uX2ZhaWxlZCA9IFRSVUU7CisgICAgICAgIH0KKworICAgICAgaWYgKGFjdGl2YXRpb25fZmFpbGVkKQorICAgICAgICB7CisgICAgICAgICAgYnVzX2NvbnRleHRfbG9nIChwZW5kaW5nX2FjdGl2YXRpb24tPmFjdGl2YXRpb24tPmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1NZU1RFTV9MT0dfSU5GTywgIkFjdGl2YXRlZCBzZXJ2aWNlICclcycgZmFpbGVkOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nX2FjdGl2YXRpb24tPnNlcnZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLm1lc3NhZ2UpOworCisgICAgICAgICAgLyogRGVzdHJveSBhbGwgcGVuZGluZyBhY3RpdmF0aW9ucyB3aXRoIHRoZSBzYW1lIGV4ZWMgKi8KKyAgICAgICAgICBfZGJ1c19oYXNoX2l0ZXJfaW5pdCAocGVuZGluZ19hY3RpdmF0aW9uLT5hY3RpdmF0aW9uLT5wZW5kaW5nX2FjdGl2YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlcik7CisgICAgICAgICAgd2hpbGUgKF9kYnVzX2hhc2hfaXRlcl9uZXh0ICgmaXRlcikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIEJ1c1BlbmRpbmdBY3RpdmF0aW9uICpwID0gX2RidXNfaGFzaF9pdGVyX2dldF92YWx1ZSAoJml0ZXIpOworCisgICAgICAgICAgICAgIGlmIChwICE9IHBlbmRpbmdfYWN0aXZhdGlvbiAmJiBwLT5leGVjICE9IE5VTEwgJiYKKyAgICAgICAgICAgICAgICAgIHN0cmNtcCAocC0+ZXhlYywgcGVuZGluZ19hY3RpdmF0aW9uLT5leGVjKSA9PSAwKQorICAgICAgICAgICAgICAgIHBlbmRpbmdfYWN0aXZhdGlvbl9mYWlsZWQgKHAsICZlcnJvcik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAvKiBEZXN0cm95cyB0aGUgcGVuZGluZyBhY3RpdmF0aW9uICovCisgICAgICAgICAgcGVuZGluZ19hY3RpdmF0aW9uX2ZhaWxlZCAocGVuZGluZ19hY3RpdmF0aW9uLCAmZXJyb3IpOworCisgICAgICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgICB9CisgICAgfQorCisgIF9kYnVzX2JhYnlzaXR0ZXJfdW5yZWYgKGJhYnlzaXR0ZXIpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2FkZF9iYWJ5c2l0dGVyX3dhdGNoIChEQnVzV2F0Y2ggICAgICAqd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgKmRhdGEpCit7CisgIEJ1c1BlbmRpbmdBY3RpdmF0aW9uICpwZW5kaW5nX2FjdGl2YXRpb24gPSBkYXRhOworCisgIHJldHVybiBfZGJ1c19sb29wX2FkZF93YXRjaCAoCisgICAgICBidXNfY29udGV4dF9nZXRfbG9vcCAocGVuZGluZ19hY3RpdmF0aW9uLT5hY3RpdmF0aW9uLT5jb250ZXh0KSwKKyAgICAgIHdhdGNoKTsKK30KKworc3RhdGljIHZvaWQKK3JlbW92ZV9iYWJ5c2l0dGVyX3dhdGNoIChEQnVzV2F0Y2ggICAgICAqd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgKmRhdGEpCit7CisgIEJ1c1BlbmRpbmdBY3RpdmF0aW9uICpwZW5kaW5nX2FjdGl2YXRpb24gPSBkYXRhOworCisgIF9kYnVzX2xvb3BfcmVtb3ZlX3dhdGNoIChidXNfY29udGV4dF9nZXRfbG9vcCAocGVuZGluZ19hY3RpdmF0aW9uLT5hY3RpdmF0aW9uLT5jb250ZXh0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhdGNoKTsKK30KKworc3RhdGljIHZvaWQKK3RvZ2dsZV9iYWJ5c2l0dGVyX3dhdGNoIChEQnVzV2F0Y2ggICAgICAqd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgKmRhdGEpCit7CisgIEJ1c1BlbmRpbmdBY3RpdmF0aW9uICpwZW5kaW5nX2FjdGl2YXRpb24gPSBkYXRhOworCisgIF9kYnVzX2xvb3BfdG9nZ2xlX3dhdGNoIChidXNfY29udGV4dF9nZXRfbG9vcCAocGVuZGluZ19hY3RpdmF0aW9uLT5hY3RpdmF0aW9uLT5jb250ZXh0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhdGNoKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitwZW5kaW5nX2FjdGl2YXRpb25fdGltZWRfb3V0ICh2b2lkICpkYXRhKQoreworICBCdXNQZW5kaW5nQWN0aXZhdGlvbiAqcGVuZGluZ19hY3RpdmF0aW9uID0gZGF0YTsKKyAgQnVzQ29udGV4dCAqY29udGV4dDsKKyAgREJ1c0Vycm9yIGVycm9yOworICBpbnQgdGltZW91dDsKKworICBjb250ZXh0ID0gcGVuZGluZ19hY3RpdmF0aW9uLT5hY3RpdmF0aW9uLT5jb250ZXh0OworICB0aW1lb3V0ID0gYnVzX2NvbnRleHRfZ2V0X2FjdGl2YXRpb25fdGltZW91dCAoY29udGV4dCk7CisKKyAgLyogS2lsbCB0aGUgc3Bhd25lZCBwcm9jZXNzLCBzaW5jZSBpdCBzdWNrcworICAgKiAobm90IHN1cmUgdGhpcyBpcyB3aGF0IHdlIHdhbnQgdG8gZG8sIGJ1dAorICAgKiBtYXkgYXMgd2VsbCB0cnkgaXQgZm9yIG5vdykKKyAgICovCisgIGlmIChwZW5kaW5nX2FjdGl2YXRpb24tPmJhYnlzaXR0ZXIpCisgICAgX2RidXNfYmFieXNpdHRlcl9raWxsX2NoaWxkIChwZW5kaW5nX2FjdGl2YXRpb24tPmJhYnlzaXR0ZXIpOworCisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKworICBidXNfY29udGV4dF9sb2dfYW5kX3NldF9lcnJvciAoY29udGV4dCwgREJVU19TWVNURU1fTE9HX1dBUk5JTkcsICZlcnJvciwKKyAgICAgICAgICAgICAgICAgICBEQlVTX0VSUk9SX1RJTUVEX09VVCwKKyAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGFjdGl2YXRlIHNlcnZpY2UgJyVzJzogdGltZWQgb3V0ICIKKyAgICAgICAgICAgICAgICAgICAiKHNlcnZpY2Vfc3RhcnRfdGltZW91dD0lZG1zKSIsCisgICAgICAgICAgICAgICAgICAgcGVuZGluZ19hY3RpdmF0aW9uLT5zZXJ2aWNlX25hbWUsIHRpbWVvdXQpOworCisgIHBlbmRpbmdfYWN0aXZhdGlvbl9mYWlsZWQgKHBlbmRpbmdfYWN0aXZhdGlvbiwgJmVycm9yKTsKKworICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitjYW5jZWxfcGVuZGluZyAodm9pZCAqZGF0YSkKK3sKKyAgQnVzUGVuZGluZ0FjdGl2YXRpb24gKnBlbmRpbmdfYWN0aXZhdGlvbiA9IGRhdGE7CisKKyAgX2RidXNfdmVyYm9zZSAoIkNhbmNlbGluZyBwZW5kaW5nIGFjdGl2YXRpb24gb2YgJXNcbiIsCisgICAgICAgICAgICAgICAgIHBlbmRpbmdfYWN0aXZhdGlvbi0+c2VydmljZV9uYW1lKTsKKworICBpZiAocGVuZGluZ19hY3RpdmF0aW9uLT5iYWJ5c2l0dGVyKQorICAgIF9kYnVzX2JhYnlzaXR0ZXJfa2lsbF9jaGlsZCAocGVuZGluZ19hY3RpdmF0aW9uLT5iYWJ5c2l0dGVyKTsKKworICBfZGJ1c19oYXNoX3RhYmxlX3JlbW92ZV9zdHJpbmcgKHBlbmRpbmdfYWN0aXZhdGlvbi0+YWN0aXZhdGlvbi0+cGVuZGluZ19hY3RpdmF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nX2FjdGl2YXRpb24tPnNlcnZpY2VfbmFtZSk7Cit9CisKK3N0YXRpYyB2b2lkCitmcmVlX3BlbmRpbmdfY2FuY2VsX2RhdGEgKHZvaWQgKmRhdGEpCit7CisgIEJ1c1BlbmRpbmdBY3RpdmF0aW9uICpwZW5kaW5nX2FjdGl2YXRpb24gPSBkYXRhOworCisgIGJ1c19wZW5kaW5nX2FjdGl2YXRpb25fdW5yZWYgKHBlbmRpbmdfYWN0aXZhdGlvbik7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYWRkX2NhbmNlbF9wZW5kaW5nX3RvX3RyYW5zYWN0aW9uIChCdXNUcmFuc2FjdGlvbiAgICAgICAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1BlbmRpbmdBY3RpdmF0aW9uICpwZW5kaW5nX2FjdGl2YXRpb24pCit7CisgIGlmICghYnVzX3RyYW5zYWN0aW9uX2FkZF9jYW5jZWxfaG9vayAodHJhbnNhY3Rpb24sIGNhbmNlbF9wZW5kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdfYWN0aXZhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlX3BlbmRpbmdfY2FuY2VsX2RhdGEpKQorICAgIHJldHVybiBGQUxTRTsKKworICBidXNfcGVuZGluZ19hY3RpdmF0aW9uX3JlZiAocGVuZGluZ19hY3RpdmF0aW9uKTsKKworICBfZGJ1c192ZXJib3NlICgiU2F2ZWQgcGVuZGluZyBhY3RpdmF0aW9uIHRvIGJlIGNhbmNlbGVkIGlmIHRoZSB0cmFuc2FjdGlvbiBmYWlsc1xuIik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAordXBkYXRlX3NlcnZpY2VfY2FjaGUgKEJ1c0FjdGl2YXRpb24gKmFjdGl2YXRpb24sIERCdXNFcnJvciAqZXJyb3IpCit7CisgIERCdXNMaXN0ICppdGVyOworCisgIGZvciAoaXRlciA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZhY3RpdmF0aW9uLT5kaXJlY3Rvcmllcyk7CisgICAgICAgaXRlciAhPSBOVUxMOworICAgICAgIGl0ZXIgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZhY3RpdmF0aW9uLT5kaXJlY3RvcmllcywgaXRlcikpCisgICAgeworICAgICAgREJ1c0Vycm9yIHRtcF9lcnJvcjsKKyAgICAgIEJ1c1NlcnZpY2VEaXJlY3RvcnkgKnNfZGlyID0gaXRlci0+ZGF0YTsKKworICAgICAgZGJ1c19lcnJvcl9pbml0ICgmdG1wX2Vycm9yKTsKKyAgICAgIGlmICghdXBkYXRlX2RpcmVjdG9yeSAoYWN0aXZhdGlvbiwgc19kaXIsICZ0bXBfZXJyb3IpKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGRidXNfZXJyb3JfaGFzX25hbWUgKCZ0bXBfZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c19tb3ZlX2Vycm9yICgmdG1wX2Vycm9yLCBlcnJvcik7CisgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGRidXNfZXJyb3JfZnJlZSAoJnRtcF9lcnJvcik7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBCdXNBY3RpdmF0aW9uRW50cnkgKgorYWN0aXZhdGlvbl9maW5kX2VudHJ5IChCdXNBY3RpdmF0aW9uICphY3RpdmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICpzZXJ2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgKmVycm9yKQoreworICBCdXNBY3RpdmF0aW9uRW50cnkgKmVudHJ5OworCisgIGVudHJ5ID0gX2RidXNfaGFzaF90YWJsZV9sb29rdXBfc3RyaW5nIChhY3RpdmF0aW9uLT5lbnRyaWVzLCBzZXJ2aWNlX25hbWUpOworICBpZiAoIWVudHJ5KQorICAgIHsKKyAgICAgIGlmICghdXBkYXRlX3NlcnZpY2VfY2FjaGUgKGFjdGl2YXRpb24sIGVycm9yKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICAgIGVudHJ5ID0gX2RidXNfaGFzaF90YWJsZV9sb29rdXBfc3RyaW5nIChhY3RpdmF0aW9uLT5lbnRyaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfbmFtZSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgQnVzQWN0aXZhdGlvbkVudHJ5ICp1cGRhdGVkX2VudHJ5OworCisgICAgICBpZiAoIWNoZWNrX3NlcnZpY2VfZmlsZSAoYWN0aXZhdGlvbiwgZW50cnksICZ1cGRhdGVkX2VudHJ5LCBlcnJvcikpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgICBlbnRyeSA9IHVwZGF0ZWRfZW50cnk7CisgICAgfQorCisgIGlmICghZW50cnkpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX1NFUlZJQ0VfVU5LTk9XTiwKKyAgICAgICAgICAgICAgICAgICAgICAiVGhlIG5hbWUgJXMgd2FzIG5vdCBwcm92aWRlZCBieSBhbnkgLnNlcnZpY2UgZmlsZXMiLAorICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfbmFtZSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgcmV0dXJuIGVudHJ5OworfQorCitzdGF0aWMgY2hhciAqKgorYnVzX2FjdGl2YXRpb25fZ2V0X2Vudmlyb25tZW50IChCdXNBY3RpdmF0aW9uICphY3RpdmF0aW9uKQoreworICByZXR1cm4gX2RidXNfaGFzaF90YWJsZV90b19hcnJheSAoYWN0aXZhdGlvbi0+ZW52aXJvbm1lbnQsICc9Jyk7Cit9CisKK2RidXNfYm9vbF90CitidXNfYWN0aXZhdGlvbl9zZXRfZW52aXJvbm1lbnRfdmFyaWFibGUgKEJ1c0FjdGl2YXRpb24gICAgICphY3RpdmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICplcnJvcikKK3sKKyAgY2hhciAgICAgICAgKmhhc2hfa2V5OworICBjaGFyICAgICAgICAqaGFzaF92YWx1ZTsKKyAgZGJ1c19ib29sX3QgIHJldHZhbDsKKworICByZXR2YWwgPSBGQUxTRTsKKyAgaGFzaF9rZXkgPSBOVUxMOworICBoYXNoX3ZhbHVlID0gTlVMTDsKKyAgaGFzaF9rZXkgPSBfZGJ1c19zdHJkdXAgKGtleSk7CisKKyAgaWYgKGhhc2hfa2V5ID09IE5VTEwpCisgICAgZ290byBvdXQ7CisKKyAgaGFzaF92YWx1ZSA9IF9kYnVzX3N0cmR1cCAodmFsdWUpOworCisgIGlmIChoYXNoX3ZhbHVlID09IE5VTEwpCisgICAgZ290byBvdXQ7CisKKyAgaWYgKCFfZGJ1c19oYXNoX3RhYmxlX2luc2VydF9zdHJpbmcgKGFjdGl2YXRpb24tPmVudmlyb25tZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaF9rZXksIGhhc2hfdmFsdWUpKQorICAgIGdvdG8gb3V0OworCisgIHJldHZhbCA9IFRSVUU7CitvdXQ6CisgIGlmIChyZXR2YWwgPT0gRkFMU0UpCisgICAgeworICAgICAgZGJ1c19mcmVlIChoYXNoX2tleSk7CisgICAgICBkYnVzX2ZyZWUgKGhhc2hfdmFsdWUpOworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICB9CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHZvaWQKK2NoaWxkX3NldHVwICh2b2lkICp1c2VyX2RhdGEpCit7CisjaWZkZWYgREJVU19VTklYCisgIEJ1c0FjdGl2YXRpb24gKmFjdGl2YXRpb24gPSB1c2VyX2RhdGE7CisgIERCdXNSTGltaXQgKmluaXRpYWxfZmRfbGltaXQ7CisgIERCdXNFcnJvciBlcnJvcjsKKworICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisgIGluaXRpYWxfZmRfbGltaXQgPSBidXNfY29udGV4dF9nZXRfaW5pdGlhbF9mZF9saW1pdCAoYWN0aXZhdGlvbi0+Y29udGV4dCk7CisKKyAgaWYgKGluaXRpYWxfZmRfbGltaXQgIT0gTlVMTCAmJgorICAgICAgIV9kYnVzX3JsaW1pdF9yZXN0b3JlX2ZkX2xpbWl0IChpbml0aWFsX2ZkX2xpbWl0LCAmZXJyb3IpKQorICAgIHsKKyAgICAgIC8qIHVuZm9ydHVuYXRlbHkgd2UgZG9uJ3QgYWN0dWFsbHkga25vdyB0aGUgc2VydmljZSBuYW1lIGhlcmUgKi8KKyAgICAgIGJ1c19jb250ZXh0X2xvZyAoYWN0aXZhdGlvbi0+Y29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgREJVU19TWVNURU1fTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gcmVzZXQgZmQgbGltaXQgYmVmb3JlIGFjdGl2YXRpbmcgIgorICAgICAgICAgICAgICAgICAgICAgICAic2VydmljZTogJXM6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IubmFtZSwgZXJyb3IubWVzc2FnZSk7CisgICAgfQorI2VuZGlmCit9CisKKworZGJ1c19ib29sX3QKK2J1c19hY3RpdmF0aW9uX2FjdGl2YXRlX3NlcnZpY2UgKEJ1c0FjdGl2YXRpb24gICphY3RpdmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgYXV0b19hY3RpdmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgKmFjdGl2YXRpb25fbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpzZXJ2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIERCdXNFcnJvciB0bXBfZXJyb3I7CisgIEJ1c0FjdGl2YXRpb25FbnRyeSAqZW50cnk7CisgIEJ1c1BlbmRpbmdBY3RpdmF0aW9uICpwZW5kaW5nX2FjdGl2YXRpb247CisgIEJ1c1BlbmRpbmdBY3RpdmF0aW9uRW50cnkgKnBlbmRpbmdfYWN0aXZhdGlvbl9lbnRyeTsKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisgIERCdXNTdHJpbmcgc2VydmljZV9zdHI7CisgIGNvbnN0IGNoYXIgKnNlcnZpY2VoZWxwZXI7CisgIGNoYXIgKiphcmd2OworICBjaGFyICoqZW52cCA9IE5VTEw7CisgIGludCBhcmdjOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIGRidXNfYm9vbF90IHdhc19wZW5kaW5nX2FjdGl2YXRpb247CisgIERCdXNTdHJpbmcgY29tbWFuZDsKKyAgaW50IGxpbWl0OworICBEQnVzU3Bhd25GbGFncyBmbGFncyA9IERCVVNfU1BBV05fTk9ORTsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBsaW1pdCA9IGJ1c19jb250ZXh0X2dldF9tYXhfcGVuZGluZ19hY3RpdmF0aW9ucyAoYWN0aXZhdGlvbi0+Y29udGV4dCk7CisKKyAgaWYgKGFjdGl2YXRpb24tPm5fcGVuZGluZ19hY3RpdmF0aW9ucyA+PSBsaW1pdCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTElNSVRTX0VYQ0VFREVELAorICAgICAgICAgICAgICAgICAgICAgICJUaGUgbWF4aW11bSBudW1iZXIgb2YgcGVuZGluZyBhY3RpdmF0aW9ucyBoYXMgYmVlbiAiCisgICAgICAgICAgICAgICAgICAgICAgInJlYWNoZWQsIGFjdGl2YXRpb24gb2YgJXMgZmFpbGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAiKG1heF9wZW5kaW5nX3NlcnZpY2Vfc3RhcnRzPSVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgc2VydmljZV9uYW1lLCBsaW1pdCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmIChidXNfY29udGV4dF9nZXRfc3lzdGVtZF9hY3RpdmF0aW9uIChhY3RpdmF0aW9uLT5jb250ZXh0KSAmJgorICAgICAgc3RyY21wIChzZXJ2aWNlX25hbWUsICJvcmcuZnJlZWRlc2t0b3Auc3lzdGVtZDEiKSA9PSAwKQorICAgIHsKKyAgICAgIC8qIGlmIHdlJ3JlIGRvaW5nIHN5c3RlbWQgYWN0aXZhdGlvbiwgd2UgYXNzdW1lIHN5c3RlbWQgd2lsbCBjb25uZWN0CisgICAgICAgKiBldmVudHVhbGx5LCBhbmQgaXQgZG9lcyBub3QgbmVlZCBhIC5zZXJ2aWNlIGZpbGUgKi8KKyAgICAgIGVudHJ5ID0gTlVMTDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBlbnRyeSA9IGFjdGl2YXRpb25fZmluZF9lbnRyeSAoYWN0aXZhdGlvbiwgc2VydmljZV9uYW1lLCBlcnJvcik7CisgICAgICBpZiAoIWVudHJ5KQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmIChhdXRvX2FjdGl2YXRpb24gJiYKKyAgICAgIGVudHJ5ICE9IE5VTEwgJiYKKyAgICAgICFidXNfY29udGV4dF9jaGVja19zZWN1cml0eV9wb2xpY3kgKGFjdGl2YXRpb24tPmNvbnRleHQsCisgICAgICAgIHRyYW5zYWN0aW9uLAorICAgICAgICBjb25uZWN0aW9uLCAvKiBzZW5kZXIgKi8KKyAgICAgICAgTlVMTCwgLyogYWRkcmVzc2VkIHJlY2lwaWVudCAqLworICAgICAgICBOVUxMLCAvKiBwcm9wb3NlZCByZWNpcGllbnQgKi8KKyAgICAgICAgYWN0aXZhdGlvbl9tZXNzYWdlLAorICAgICAgICBlbnRyeSwKKyAgICAgICAgZXJyb3IpKQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJhY3RpdmF0aW9uIG5vdCBhdXRob3JpemVkOiAlczogJXNcbiIsCisgICAgICAgICAgZXJyb3IgIT0gTlVMTCA/IGVycm9yLT5uYW1lIDogIihlcnJvciBpZ25vcmVkKSIsCisgICAgICAgICAgZXJyb3IgIT0gTlVMTCA/IGVycm9yLT5tZXNzYWdlIDogIihlcnJvciBpZ25vcmVkKSIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAvKiBCeXBhc3MgdGhlIHJlZ2lzdHJ5IGxvb2t1cCBpZiB3ZSdyZSBhdXRvLWFjdGl2YXRpbmcsIGJ1c19kaXNwYXRjaCB3b3VsZCBub3QKKyAgICogY2FsbCB1cyBpZiB0aGUgc2VydmljZSBpcyBhbHJlYWR5IGFjdGl2ZS4KKyAgICovCisgIGlmICghYXV0b19hY3RpdmF0aW9uKQorICAgIHsKKyAgICAgIC8qIENoZWNrIGlmIHRoZSBzZXJ2aWNlIGlzIGFjdGl2ZSAqLworICAgICAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZzZXJ2aWNlX3N0ciwgc2VydmljZV9uYW1lKTsKKyAgICAgIGlmIChidXNfcmVnaXN0cnlfbG9va3VwIChidXNfY29udGV4dF9nZXRfcmVnaXN0cnkgKGFjdGl2YXRpb24tPmNvbnRleHQpLCAmc2VydmljZV9zdHIpICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX3VpbnQzMl90IHJlc3VsdDsKKworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJTZXJ2aWNlIFwiJXNcIiBpcyBhbHJlYWR5IGFjdGl2ZVxuIiwgc2VydmljZV9uYW1lKTsKKworICAgICAgICAgIG1lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9yZXR1cm4gKGFjdGl2YXRpb25fbWVzc2FnZSk7CisKKyAgICAgICAgICBpZiAoIW1lc3NhZ2UpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJObyBtZW1vcnkgdG8gY3JlYXRlIHJlcGx5IHRvIGFjdGl2YXRlIG1lc3NhZ2VcbiIpOworICAgICAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICByZXN1bHQgPSBEQlVTX1NUQVJUX1JFUExZX0FMUkVBRFlfUlVOTklORzsKKworICAgICAgICAgIGlmICghZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfVUlOVDMyLCAmcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJObyBtZW1vcnkgdG8gc2V0IGFyZ3Mgb2YgcmVwbHkgdG8gYWN0aXZhdGUgbWVzc2FnZVxuIik7CisgICAgICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIHJldHZhbCA9IGJ1c190cmFuc2FjdGlvbl9zZW5kX2Zyb21fZHJpdmVyICh0cmFuc2FjdGlvbiwgY29ubmVjdGlvbiwgbWVzc2FnZSk7CisgICAgICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgICAgICBpZiAoIXJldHZhbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkZhaWxlZCB0byBzZW5kIHJlcGx5XG4iKTsKKyAgICAgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgICAgIH0KKyAgICB9CisKKyAgcGVuZGluZ19hY3RpdmF0aW9uX2VudHJ5ID0gZGJ1c19uZXcwIChCdXNQZW5kaW5nQWN0aXZhdGlvbkVudHJ5LCAxKTsKKyAgaWYgKCFwZW5kaW5nX2FjdGl2YXRpb25fZW50cnkpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIkZhaWxlZCB0byBjcmVhdGUgcGVuZGluZyBhY3RpdmF0aW9uIGVudHJ5XG4iKTsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHBlbmRpbmdfYWN0aXZhdGlvbl9lbnRyeS0+YXV0b19hY3RpdmF0aW9uID0gYXV0b19hY3RpdmF0aW9uOworCisgIHBlbmRpbmdfYWN0aXZhdGlvbl9lbnRyeS0+YWN0aXZhdGlvbl9tZXNzYWdlID0gYWN0aXZhdGlvbl9tZXNzYWdlOworICBkYnVzX21lc3NhZ2VfcmVmIChhY3RpdmF0aW9uX21lc3NhZ2UpOworICBwZW5kaW5nX2FjdGl2YXRpb25fZW50cnktPmNvbm5lY3Rpb24gPSBjb25uZWN0aW9uOworICBpZiAoY29ubmVjdGlvbikKKyAgICBkYnVzX2Nvbm5lY3Rpb25fcmVmIChjb25uZWN0aW9uKTsKKworICAvKiBDaGVjayBpZiB0aGUgc2VydmljZSBpcyBiZWluZyBhY3RpdmF0ZWQgKi8KKyAgcGVuZGluZ19hY3RpdmF0aW9uID0gX2RidXNfaGFzaF90YWJsZV9sb29rdXBfc3RyaW5nIChhY3RpdmF0aW9uLT5wZW5kaW5nX2FjdGl2YXRpb25zLCBzZXJ2aWNlX25hbWUpOworICB3YXNfcGVuZGluZ19hY3RpdmF0aW9uID0gKHBlbmRpbmdfYWN0aXZhdGlvbiAhPSBOVUxMKTsKKyAgaWYgKHdhc19wZW5kaW5nX2FjdGl2YXRpb24pCisgICAgeworICAgICAgaWYgKCFfZGJ1c19saXN0X2FwcGVuZCAoJnBlbmRpbmdfYWN0aXZhdGlvbi0+ZW50cmllcywgcGVuZGluZ19hY3RpdmF0aW9uX2VudHJ5KSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJGYWlsZWQgdG8gYXBwZW5kIGEgbmV3IGVudHJ5IHRvIHBlbmRpbmcgYWN0aXZhdGlvblxuIik7CisKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIGJ1c19wZW5kaW5nX2FjdGl2YXRpb25fZW50cnlfZnJlZSAocGVuZGluZ19hY3RpdmF0aW9uX2VudHJ5KTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgcGVuZGluZ19hY3RpdmF0aW9uLT5uX2VudHJpZXMgKz0gMTsKKyAgICAgIHBlbmRpbmdfYWN0aXZhdGlvbi0+YWN0aXZhdGlvbi0+bl9wZW5kaW5nX2FjdGl2YXRpb25zICs9IDE7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgcGVuZGluZ19hY3RpdmF0aW9uID0gZGJ1c19uZXcwIChCdXNQZW5kaW5nQWN0aXZhdGlvbiwgMSk7CisgICAgICBpZiAoIXBlbmRpbmdfYWN0aXZhdGlvbikKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJGYWlsZWQgdG8gY3JlYXRlIHBlbmRpbmcgYWN0aXZhdGlvblxuIik7CisKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIGJ1c19wZW5kaW5nX2FjdGl2YXRpb25fZW50cnlfZnJlZSAocGVuZGluZ19hY3RpdmF0aW9uX2VudHJ5KTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgcGVuZGluZ19hY3RpdmF0aW9uLT5hY3RpdmF0aW9uID0gYWN0aXZhdGlvbjsKKyAgICAgIHBlbmRpbmdfYWN0aXZhdGlvbi0+cmVmY291bnQgPSAxOworCisgICAgICBwZW5kaW5nX2FjdGl2YXRpb24tPnNlcnZpY2VfbmFtZSA9IF9kYnVzX3N0cmR1cCAoc2VydmljZV9uYW1lKTsKKyAgICAgIGlmICghcGVuZGluZ19hY3RpdmF0aW9uLT5zZXJ2aWNlX25hbWUpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiRmFpbGVkIHRvIGNvcHkgc2VydmljZSBuYW1lIGZvciBwZW5kaW5nIGFjdGl2YXRpb25cbiIpOworCisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICBidXNfcGVuZGluZ19hY3RpdmF0aW9uX3VucmVmIChwZW5kaW5nX2FjdGl2YXRpb24pOworICAgICAgICAgIGJ1c19wZW5kaW5nX2FjdGl2YXRpb25fZW50cnlfZnJlZSAocGVuZGluZ19hY3RpdmF0aW9uX2VudHJ5KTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgaWYgKGVudHJ5ICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBwZW5kaW5nX2FjdGl2YXRpb24tPmV4ZWMgPSBfZGJ1c19zdHJkdXAgKGVudHJ5LT5leGVjKTsKKyAgICAgICAgICBpZiAoIXBlbmRpbmdfYWN0aXZhdGlvbi0+ZXhlYykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkZhaWxlZCB0byBjb3B5IHNlcnZpY2UgZXhlYyBmb3IgcGVuZGluZyBhY3RpdmF0aW9uXG4iKTsKKyAgICAgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICAgICAgYnVzX3BlbmRpbmdfYWN0aXZhdGlvbl91bnJlZiAocGVuZGluZ19hY3RpdmF0aW9uKTsKKyAgICAgICAgICAgICAgYnVzX3BlbmRpbmdfYWN0aXZhdGlvbl9lbnRyeV9mcmVlIChwZW5kaW5nX2FjdGl2YXRpb25fZW50cnkpOworICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgaWYgKGVudHJ5ICE9IE5VTEwgJiYgZW50cnktPnN5c3RlbWRfc2VydmljZSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgcGVuZGluZ19hY3RpdmF0aW9uLT5zeXN0ZW1kX3NlcnZpY2UgPSBfZGJ1c19zdHJkdXAgKGVudHJ5LT5zeXN0ZW1kX3NlcnZpY2UpOworICAgICAgICAgIGlmICghcGVuZGluZ19hY3RpdmF0aW9uLT5zeXN0ZW1kX3NlcnZpY2UpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJGYWlsZWQgdG8gY29weSBzeXN0ZW1kIHNlcnZpY2UgZm9yIHBlbmRpbmcgYWN0aXZhdGlvblxuIik7CisgICAgICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgICAgIGJ1c19wZW5kaW5nX2FjdGl2YXRpb25fdW5yZWYgKHBlbmRpbmdfYWN0aXZhdGlvbik7CisgICAgICAgICAgICAgIGJ1c19wZW5kaW5nX2FjdGl2YXRpb25fZW50cnlfZnJlZSAocGVuZGluZ19hY3RpdmF0aW9uX2VudHJ5KTsKKyAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgIHBlbmRpbmdfYWN0aXZhdGlvbi0+dGltZW91dCA9CisgICAgICAgIF9kYnVzX3RpbWVvdXRfbmV3IChidXNfY29udGV4dF9nZXRfYWN0aXZhdGlvbl90aW1lb3V0IChhY3RpdmF0aW9uLT5jb250ZXh0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdfYWN0aXZhdGlvbl90aW1lZF9vdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nX2FjdGl2YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgIGlmICghcGVuZGluZ19hY3RpdmF0aW9uLT50aW1lb3V0KQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkZhaWxlZCB0byBjcmVhdGUgdGltZW91dCBmb3IgcGVuZGluZyBhY3RpdmF0aW9uXG4iKTsKKworICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgYnVzX3BlbmRpbmdfYWN0aXZhdGlvbl91bnJlZiAocGVuZGluZ19hY3RpdmF0aW9uKTsKKyAgICAgICAgICBidXNfcGVuZGluZ19hY3RpdmF0aW9uX2VudHJ5X2ZyZWUgKHBlbmRpbmdfYWN0aXZhdGlvbl9lbnRyeSk7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIGlmICghX2RidXNfbG9vcF9hZGRfdGltZW91dCAoYnVzX2NvbnRleHRfZ2V0X2xvb3AgKGFjdGl2YXRpb24tPmNvbnRleHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nX2FjdGl2YXRpb24tPnRpbWVvdXQpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkZhaWxlZCB0byBhZGQgdGltZW91dCBmb3IgcGVuZGluZyBhY3RpdmF0aW9uXG4iKTsKKworICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgYnVzX3BlbmRpbmdfYWN0aXZhdGlvbl91bnJlZiAocGVuZGluZ19hY3RpdmF0aW9uKTsKKyAgICAgICAgICBidXNfcGVuZGluZ19hY3RpdmF0aW9uX2VudHJ5X2ZyZWUgKHBlbmRpbmdfYWN0aXZhdGlvbl9lbnRyeSk7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIHBlbmRpbmdfYWN0aXZhdGlvbi0+dGltZW91dF9hZGRlZCA9IFRSVUU7CisKKyAgICAgIGlmICghX2RidXNfbGlzdF9hcHBlbmQgKCZwZW5kaW5nX2FjdGl2YXRpb24tPmVudHJpZXMsIHBlbmRpbmdfYWN0aXZhdGlvbl9lbnRyeSkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiRmFpbGVkIHRvIGFkZCBlbnRyeSB0byBqdXN0LWNyZWF0ZWQgcGVuZGluZyBhY3RpdmF0aW9uXG4iKTsKKworICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgYnVzX3BlbmRpbmdfYWN0aXZhdGlvbl91bnJlZiAocGVuZGluZ19hY3RpdmF0aW9uKTsKKyAgICAgICAgICBidXNfcGVuZGluZ19hY3RpdmF0aW9uX2VudHJ5X2ZyZWUgKHBlbmRpbmdfYWN0aXZhdGlvbl9lbnRyeSk7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIHBlbmRpbmdfYWN0aXZhdGlvbi0+bl9lbnRyaWVzICs9IDE7CisgICAgICBwZW5kaW5nX2FjdGl2YXRpb24tPmFjdGl2YXRpb24tPm5fcGVuZGluZ19hY3RpdmF0aW9ucyArPSAxOworCisgICAgICBpZiAoIV9kYnVzX2hhc2hfdGFibGVfaW5zZXJ0X3N0cmluZyAoYWN0aXZhdGlvbi0+cGVuZGluZ19hY3RpdmF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nX2FjdGl2YXRpb24tPnNlcnZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nX2FjdGl2YXRpb24pKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkZhaWxlZCB0byBwdXQgcGVuZGluZyBhY3RpdmF0aW9uIGluIGhhc2ggdGFibGVcbiIpOworCisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICBidXNfcGVuZGluZ19hY3RpdmF0aW9uX3VucmVmIChwZW5kaW5nX2FjdGl2YXRpb24pOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICBpZiAoIWFkZF9jYW5jZWxfcGVuZGluZ190b190cmFuc2FjdGlvbiAodHJhbnNhY3Rpb24sIHBlbmRpbmdfYWN0aXZhdGlvbikpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIkZhaWxlZCB0byBhZGQgcGVuZGluZyBhY3RpdmF0aW9uIGNhbmNlbCBob29rIHRvIHRyYW5zYWN0aW9uXG4iKTsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBnb3RvIGNhbmNlbF9wZW5kaW5nX2FjdGl2YXRpb247CisgICAgfQorCisgIGlmICh3YXNfcGVuZGluZ19hY3RpdmF0aW9uKQorICAgIHJldHVybiBUUlVFOworCisgIGlmIChidXNfY29udGV4dF9nZXRfc3lzdGVtZF9hY3RpdmF0aW9uIChhY3RpdmF0aW9uLT5jb250ZXh0KSkKKyAgICB7CisgICAgICBpZiAoc3RyY21wIChzZXJ2aWNlX25hbWUsICJvcmcuZnJlZWRlc2t0b3Auc3lzdGVtZDEiKSA9PSAwKQorICAgICAgICAgIC8qIHN5c3RlbWQgaXRzZWxmIGlzIG1pc3NpbmcgYXBwYXJlbnRseS4gVGhhdCBjYW4gaGFwcGVuCisgICAgICAgICAgICAgb25seSBkdXJpbmcgZWFybHkgc3RhcnR1cC4gTGV0J3MganVzdCB3YWl0IHVudGlsIHN5c3RlbWQKKyAgICAgICAgICAgICBjb25uZWN0cyB0byB1cyBhbmQgZG8gbm90aGluZy4gKi8KKyAgICAgICAgcmV0dXJuIFRSVUU7CisKKyAgICAgIGlmIChlbnRyeS0+c3lzdGVtZF9zZXJ2aWNlKQorICAgICAgICB7CisgICAgICAgICAgQnVzVHJhbnNhY3Rpb24gKmFjdGl2YXRpb25fdHJhbnNhY3Rpb247CisgICAgICAgICAgREJ1c1N0cmluZyBzZXJ2aWNlX3N0cmluZzsKKyAgICAgICAgICBCdXNTZXJ2aWNlICpzZXJ2aWNlOworICAgICAgICAgIEJ1c1JlZ2lzdHJ5ICpyZWdpc3RyeTsKKyAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqc3lzdGVtZCA9IE5VTEw7CisKKyAgICAgICAgICAvKiBPSywgd2UgaGF2ZSBhIHN5c3RlbWQgc2VydmljZSBjb25maWd1cmVkIGZvciB0aGlzIGVudHJ5LAorICAgICAgICAgICAgIGhlbmNlIGxldCdzIGVucXVldWUgYW4gYWN0aXZhdGlvbiByZXF1ZXN0IG1lc3NhZ2UuIFRoaXMKKyAgICAgICAgICAgICBpcyBpbXBsZW1lbnRlZCBhcyBhIGRpcmVjdGVkIHNpZ25hbCwgbm90IGEgbWV0aG9kIGNhbGwsCisgICAgICAgICAgICAgZm9yIHRocmVlIHJlYXNvbnM6IDEpIHdlIGRvbid0IGV4cGVjdCBhIHJlc3BvbnNlIG9uCisgICAgICAgICAgICAgc3VjY2Vzcywgd2hlcmUgd2UganVzdCBleHBlY3QgYSBuYW1lIGFwcGVhcmluZyBvbiB0aGUKKyAgICAgICAgICAgICBidXM7IDIpIGF0IHRoaXMgdGltZSB0aGUgc3lzdGVtZCBzZXJ2aWNlIG1pZ2h0IG5vdCB5ZXQKKyAgICAgICAgICAgICBoYXZlIGNvbm5lY3RlZCwgc28gd2Ugd291bGRuJ3Qga25vdyB0aGUgbWVzc2FnZSBzZXJpYWwgYXQKKyAgICAgICAgICAgICB0aGlzIHBvaW50IHRvIHNldCB1cCBhIHBlbmRpbmcgY2FsbDsgMykgaXQgaXMgdWdseSBpZiB0aGUKKyAgICAgICAgICAgICBidXMgc3VkZGVubHkgYmVjb21lcyB0aGUgY2FsbGVyIG9mIGEgcmVtb3RlIG1ldGhvZC4gKi8KKworICAgICAgICAgIG1lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfbmV3X3NpZ25hbCAoREJVU19QQVRIX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLnN5c3RlbWQxLkFjdGl2YXRvciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWN0aXZhdGlvblJlcXVlc3QiKTsKKyAgICAgICAgICBpZiAoIW1lc3NhZ2UpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJObyBtZW1vcnkgdG8gY3JlYXRlIGFjdGl2YXRpb24gbWVzc2FnZVxuIik7CisgICAgICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgICAgIGdvdG8gY2FuY2VsX3BlbmRpbmdfYWN0aXZhdGlvbjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGlmICghZGJ1c19tZXNzYWdlX3NldF9zZW5kZXIgKG1lc3NhZ2UsIERCVVNfU0VSVklDRV9EQlVTKSB8fAorICAgICAgICAgICAgICAhZGJ1c19tZXNzYWdlX3NldF9kZXN0aW5hdGlvbiAobWVzc2FnZSwgIm9yZy5mcmVlZGVza3RvcC5zeXN0ZW1kMSIpIHx8CisgICAgICAgICAgICAgICFkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZlbnRyeS0+c3lzdGVtZF9zZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJObyBtZW1vcnkgdG8gc2V0IGFyZ3Mgb2YgYWN0aXZhdGlvbiBtZXNzYWdlXG4iKTsKKyAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICAgICAgZ290byBjYW5jZWxfcGVuZGluZ19hY3RpdmF0aW9uOworICAgICAgICAgICAgfQorCisgICAgICAgICAgLyogQ3JlYXRlIG91ciB0cmFuc2FjdGlvbiAqLworICAgICAgICAgIGFjdGl2YXRpb25fdHJhbnNhY3Rpb24gPSBidXNfdHJhbnNhY3Rpb25fbmV3IChhY3RpdmF0aW9uLT5jb250ZXh0KTsKKyAgICAgICAgICBpZiAoYWN0aXZhdGlvbl90cmFuc2FjdGlvbiA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiTm8gbWVtb3J5IHRvIGNyZWF0ZSBhY3RpdmF0aW9uIHRyYW5zYWN0aW9uXG4iKTsKKyAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICAgICAgZ290byBjYW5jZWxfcGVuZGluZ19hY3RpdmF0aW9uOworICAgICAgICAgICAgfQorCisgICAgICAgICAgLyogQ2hlY2sgd2hldGhlciBzeXN0ZW1kIGlzIGFscmVhZHkgY29ubmVjdGVkICovCisgICAgICAgICAgcmVnaXN0cnkgPSBidXNfY29ubmVjdGlvbl9nZXRfcmVnaXN0cnkgKGNvbm5lY3Rpb24pOworICAgICAgICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmc2VydmljZV9zdHJpbmcsICJvcmcuZnJlZWRlc2t0b3Auc3lzdGVtZDEiKTsKKyAgICAgICAgICBzZXJ2aWNlID0gYnVzX3JlZ2lzdHJ5X2xvb2t1cCAocmVnaXN0cnksICZzZXJ2aWNlX3N0cmluZyk7CisKKyAgICAgICAgICBpZiAoc2VydmljZSkKKyAgICAgICAgICAgIHN5c3RlbWQgPSBidXNfc2VydmljZV9nZXRfcHJpbWFyeV9vd25lcnNfY29ubmVjdGlvbiAoc2VydmljZSk7CisKKyAgICAgICAgICAvKiBGb2xsb3dpbmcgdGhlIGdlbmVyYWwgcHJpbmNpcGxlIG9mICJsb2cgZWFybHkgYW5kIG9mdGVuIiwKKyAgICAgICAgICAgKiB3ZSBjYXB0dXJlIHRoYXQgd2UgKndhbnQqIHRvIHNlbmQgdGhlIGFjdGl2YXRpb24gbWVzc2FnZSwgZXZlbiBpZgorICAgICAgICAgICAqIHN5c3RlbWQgaXMgbm90IGFjdHVhbGx5IHRoZXJlIHRvIHJlY2VpdmUgaXQgeWV0ICovCisgICAgICAgICAgaWYgKCFidXNfdHJhbnNhY3Rpb25fY2FwdHVyZSAoYWN0aXZhdGlvbl90cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBzeXN0ZW1kLCBtZXNzYWdlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICAgICAgZ290byBjYW5jZWxfcGVuZGluZ19hY3RpdmF0aW9uOworICAgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKHNlcnZpY2UgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgYnVzX2NvbnRleHRfbG9nIChhY3RpdmF0aW9uLT5jb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfU1lTVEVNX0xPR19JTkZPLCAiQWN0aXZhdGluZyB2aWEgc3lzdGVtZDogc2VydmljZSBuYW1lPSclcycgdW5pdD0nJXMnIHJlcXVlc3RlZCBieSAnJXMnICglcykiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS0+c3lzdGVtZF9zZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1c19jb25uZWN0aW9uX2dldF9uYW1lIChjb25uZWN0aW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXNfY29ubmVjdGlvbl9nZXRfbG9naW5mbyAoY29ubmVjdGlvbikpOworICAgICAgICAgICAgICAvKiBXb25kZXJmdWwsIHN5c3RlbWQgaXMgY29ubmVjdGVkLCBsZXQncyBqdXN0IHNlbmQgdGhlIG1zZyAqLworICAgICAgICAgICAgICByZXR2YWwgPSBidXNfZGlzcGF0Y2hfbWF0Y2hlcyAoYWN0aXZhdGlvbl90cmFuc2FjdGlvbiwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5c3RlbWQsIG1lc3NhZ2UsIGVycm9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGJ1c19jb250ZXh0X2xvZyAoYWN0aXZhdGlvbi0+Y29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1NZU1RFTV9MT0dfSU5GTywgIkFjdGl2YXRpbmcgc3lzdGVtZCB0byBoYW5kLW9mZjogc2VydmljZSBuYW1lPSclcycgdW5pdD0nJXMnIHJlcXVlc3RlZCBieSAnJXMnICglcykiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS0+c3lzdGVtZF9zZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1c19jb25uZWN0aW9uX2dldF9uYW1lIChjb25uZWN0aW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXNfY29ubmVjdGlvbl9nZXRfbG9naW5mbyAoY29ubmVjdGlvbikpOworICAgICAgICAgICAgICAvKiBzeXN0ZW1kIGlzIG5vdCBhcm91bmQsIGxldCdzICJhY3RpdmF0ZSIgaXQuICovCisgICAgICAgICAgICAgIHJldHZhbCA9IGJ1c19hY3RpdmF0aW9uX2FjdGl2YXRlX3NlcnZpY2UgKGFjdGl2YXRpb24sIE5VTEwsIGFjdGl2YXRpb25fdHJhbnNhY3Rpb24sIFRSVUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsICJvcmcuZnJlZWRlc2t0b3Auc3lzdGVtZDEiLCBlcnJvcik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworCisgICAgICAgICAgaWYgKCFyZXR2YWwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGJ1c19jb250ZXh0X2xvZyAoYWN0aXZhdGlvbi0+Y29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1NZU1RFTV9MT0dfSU5GTywgIkZhaWxlZCB0byBhY3RpdmF0ZSB2aWEgc3lzdGVtZDogc2VydmljZSBuYW1lPSclcycgdW5pdD0nJXMnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnktPnN5c3RlbWRfc2VydmljZSk7CisgICAgICAgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoImZhaWxlZCB0byBzZW5kIGFjdGl2YXRpb24gbWVzc2FnZTogJXNcbiIsIGVycm9yLT5uYW1lKTsKKyAgICAgICAgICAgICAgYnVzX3RyYW5zYWN0aW9uX2NhbmNlbF9hbmRfZnJlZSAoYWN0aXZhdGlvbl90cmFuc2FjdGlvbik7CisgICAgICAgICAgICAgIGdvdG8gY2FuY2VsX3BlbmRpbmdfYWN0aXZhdGlvbjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGJ1c190cmFuc2FjdGlvbl9leGVjdXRlX2FuZF9mcmVlIChhY3RpdmF0aW9uX3RyYW5zYWN0aW9uKTsKKyAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgfQorCisgICAgICAvKiBPSywgd2UgaGF2ZSBubyBjb25maWd1cmVkIHN5c3RlbWQgc2VydmljZSwgaGVuY2UgbGV0J3MKKyAgICAgICAgIHByb2NlZWQgd2l0aCB0cmFkaXRpb25hbCBhY3RpdmF0aW9uLiAqLworICAgIH0KKworICAvKiBJZiBlbnRyeSB3YXMgTlVMTCwgaXQgd291bGQgYmUgYmVjYXVzZSB3ZSB3ZXJlIGRvaW5nIHN5c3RlbWQgYWN0aXZhdGlvbgorICAgKiBhbmQgYWN0aXZhdGluZyBzeXN0ZW1kIGl0c2VsZjsgYnV0IHdlIGFscmVhZHkgaGFuZGxlZCB0aGF0IGNhc2Ugd2l0aAorICAgKiBhbiBlYXJseS1yZXR1cm4gKi8KKyAgX2RidXNfYXNzZXJ0IChlbnRyeSAhPSBOVUxMKTsKKworICAvKiB1c2UgY29tbWFuZCBhcyBzeXN0ZW0gYW5kIHNlc3Npb24gZGlmZmVyZW50ICovCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZjb21tYW5kKSkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgZ290byBjYW5jZWxfcGVuZGluZ19hY3RpdmF0aW9uOworICAgIH0KKworICAvKiBkb2VzIHRoZSBidXMgdXNlIGEgaGVscGVyPyAqLworICBzZXJ2aWNlaGVscGVyID0gYnVzX2NvbnRleHRfZ2V0X3NlcnZpY2VoZWxwZXIgKGFjdGl2YXRpb24tPmNvbnRleHQpOworICBpZiAoc2VydmljZWhlbHBlciAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChlbnRyeS0+dXNlciA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZjb21tYW5kKTsKKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfU1BBV05fRklMRV9JTlZBTElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IGRvIHN5c3RlbS1idXMgYWN0aXZhdGlvbiB3aXRoIG5vIHVzZXJcbiIpOworICAgICAgICAgIGdvdG8gY2FuY2VsX3BlbmRpbmdfYWN0aXZhdGlvbjsKKyAgICAgICAgfQorCisgICAgICAvKiBqb2luIHRoZSBoZWxwZXIgcGF0aCBhbmQgdGhlIHNlcnZpY2UgbmFtZSAqLworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmY29tbWFuZCwgc2VydmljZWhlbHBlcikpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmNvbW1hbmQpOworICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgZ290byBjYW5jZWxfcGVuZGluZ19hY3RpdmF0aW9uOworICAgICAgICB9CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZjb21tYW5kLCAiICIpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZjb21tYW5kKTsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIGdvdG8gY2FuY2VsX3BlbmRpbmdfYWN0aXZhdGlvbjsKKyAgICAgICAgfQorICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmY29tbWFuZCwgc2VydmljZV9uYW1lKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmY29tbWFuZCk7CisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICBnb3RvIGNhbmNlbF9wZW5kaW5nX2FjdGl2YXRpb247CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiB0aGUgYnVzIGRvZXMgbm90IHVzZSBhIGhlbHBlciwgc28gd2UgY2FuIGFwcGVuZCBhcmd1bWVudHMgd2l0aCB0aGUgZXhlYyBsaW5lICovCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZjb21tYW5kLCBlbnRyeS0+ZXhlYykpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmNvbW1hbmQpOworICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgZ290byBjYW5jZWxfcGVuZGluZ19hY3RpdmF0aW9uOworICAgICAgICB9CisgICAgfQorCisgIC8qIGNvbnZlcnQgY29tbWFuZCBpbnRvIGFyZ3VtZW50cyAqLworICBpZiAoIV9kYnVzX3NoZWxsX3BhcnNlX2FyZ3YgKF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmNvbW1hbmQpLCAmYXJnYywgJmFyZ3YsIGVycm9yKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiRmFpbGVkIHRvIHBhcnNlIGNvbW1hbmQgbGluZTogJXNcbiIsIGVudHJ5LT5leGVjKTsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmY29tbWFuZCk7CisgICAgICBnb3RvIGNhbmNlbF9wZW5kaW5nX2FjdGl2YXRpb247CisgICAgfQorICBfZGJ1c19zdHJpbmdfZnJlZSAoJmNvbW1hbmQpOworCisgIGlmICghYWRkX2J1c19lbnZpcm9ubWVudCAoYWN0aXZhdGlvbiwgZXJyb3IpKQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgIGRidXNfZnJlZV9zdHJpbmdfYXJyYXkgKGFyZ3YpOworICAgICAgZ290byBjYW5jZWxfcGVuZGluZ19hY3RpdmF0aW9uOworICAgIH0KKworICBlbnZwID0gYnVzX2FjdGl2YXRpb25fZ2V0X2Vudmlyb25tZW50IChhY3RpdmF0aW9uKTsKKworICBpZiAoZW52cCA9PSBOVUxMKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5IChhcmd2KTsKKyAgICAgIGdvdG8gY2FuY2VsX3BlbmRpbmdfYWN0aXZhdGlvbjsKKyAgICB9CisKKyAgX2RidXNfdmVyYm9zZSAoIlNwYXduaW5nICVzIC4uLlxuIiwgYXJndlswXSk7CisgIGlmIChzZXJ2aWNlaGVscGVyICE9IE5VTEwpCisgICAgYnVzX2NvbnRleHRfbG9nIChhY3RpdmF0aW9uLT5jb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgREJVU19TWVNURU1fTE9HX0lORk8sICJBY3RpdmF0aW5nIHNlcnZpY2UgbmFtZT0nJXMnIHJlcXVlc3RlZCBieSAnJXMnICglcykgKHVzaW5nIHNlcnZpY2VoZWxwZXIpIiwKKyAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIGJ1c19jb25uZWN0aW9uX2dldF9uYW1lIChjb25uZWN0aW9uKSwKKyAgICAgICAgICAgICAgICAgICAgIGJ1c19jb25uZWN0aW9uX2dldF9sb2dpbmZvIChjb25uZWN0aW9uKSk7CisgIGVsc2UKKyAgICBidXNfY29udGV4dF9sb2cgKGFjdGl2YXRpb24tPmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICBEQlVTX1NZU1RFTV9MT0dfSU5GTywgIkFjdGl2YXRpbmcgc2VydmljZSBuYW1lPSclcycgcmVxdWVzdGVkIGJ5ICclcycgKCVzKSIsCisgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICBidXNfY29ubmVjdGlvbl9nZXRfbmFtZSAoY29ubmVjdGlvbiksCisgICAgICAgICAgICAgICAgICAgICBidXNfY29ubmVjdGlvbl9nZXRfbG9naW5mbyAoY29ubmVjdGlvbikpOworCisgIGRidXNfZXJyb3JfaW5pdCAoJnRtcF9lcnJvcik7CisKKyAgaWYgKGJ1c19jb250ZXh0X2dldF91c2luZ19zeXNsb2cgKGFjdGl2YXRpb24tPmNvbnRleHQpKQorICAgIGZsYWdzIHw9IERCVVNfU1BBV05fUkVESVJFQ1RfT1VUUFVUOworCisgIGlmICghX2RidXNfc3Bhd25fYXN5bmNfd2l0aF9iYWJ5c2l0dGVyICgmcGVuZGluZ19hY3RpdmF0aW9uLT5iYWJ5c2l0dGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJndiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkX3NldHVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0bXBfZXJyb3IpKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJGYWlsZWQgdG8gc3Bhd24gY2hpbGRcbiIpOworICAgICAgYnVzX2NvbnRleHRfbG9nIChhY3RpdmF0aW9uLT5jb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1NZU1RFTV9MT0dfSU5GTywgIkZhaWxlZCB0byBhY3RpdmF0ZSBzZXJ2aWNlICVzOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgdG1wX2Vycm9yLm1lc3NhZ2UpOworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoJnRtcF9lcnJvcik7CisgICAgICBkYnVzX21vdmVfZXJyb3IgKCZ0bXBfZXJyb3IsIGVycm9yKTsKKyAgICAgIGRidXNfZnJlZV9zdHJpbmdfYXJyYXkgKGFyZ3YpOworICAgICAgZGJ1c19mcmVlX3N0cmluZ19hcnJheSAoZW52cCk7CisgICAgICBnb3RvIGNhbmNlbF9wZW5kaW5nX2FjdGl2YXRpb247CisgICAgfQorCisgIGRidXNfZnJlZV9zdHJpbmdfYXJyYXkgKGFyZ3YpOworICBlbnZwID0gTlVMTDsKKworICBfZGJ1c19hc3NlcnQgKHBlbmRpbmdfYWN0aXZhdGlvbi0+YmFieXNpdHRlciAhPSBOVUxMKTsKKworICBfZGJ1c19iYWJ5c2l0dGVyX3NldF9yZXN1bHRfZnVuY3Rpb24gKHBlbmRpbmdfYWN0aXZhdGlvbi0+YmFieXNpdHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nX2FjdGl2YXRpb25fZmluaXNoZWRfY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ19hY3RpdmF0aW9uKTsKKworICBpZiAoIV9kYnVzX2JhYnlzaXR0ZXJfc2V0X3dhdGNoX2Z1bmN0aW9ucyAocGVuZGluZ19hY3RpdmF0aW9uLT5iYWJ5c2l0dGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkX2JhYnlzaXR0ZXJfd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVfYmFieXNpdHRlcl93YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvZ2dsZV9iYWJ5c2l0dGVyX3dhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ19hY3RpdmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJGYWlsZWQgdG8gc2V0IGJhYnlzaXR0ZXIgd2F0Y2ggZnVuY3Rpb25zXG4iKTsKKyAgICAgIGdvdG8gY2FuY2VsX3BlbmRpbmdfYWN0aXZhdGlvbjsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7CisKK2NhbmNlbF9wZW5kaW5nX2FjdGl2YXRpb246CisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgX2RidXNfaGFzaF90YWJsZV9yZW1vdmVfc3RyaW5nIChhY3RpdmF0aW9uLT5wZW5kaW5nX2FjdGl2YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdfYWN0aXZhdGlvbi0+c2VydmljZV9uYW1lKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCitkYnVzX2Jvb2xfdAorYnVzX2FjdGl2YXRpb25fbGlzdF9zZXJ2aWNlcyAoQnVzQWN0aXZhdGlvbiAqYWN0aXZhdGlvbiwKKwkJCSAgICAgIGNoYXIgICAgICAgICoqKmxpc3RwLAorCQkJICAgICAgaW50ICAgICAgICAgICAqYXJyYXlfbGVuKQoreworICBpbnQgaSwgaiwgbGVuOworICBjaGFyICoqcmV0dmFsOworICBEQnVzSGFzaEl0ZXIgaXRlcjsKKworICBsZW4gPSBfZGJ1c19oYXNoX3RhYmxlX2dldF9uX2VudHJpZXMgKGFjdGl2YXRpb24tPmVudHJpZXMpOworICByZXR2YWwgPSBkYnVzX25ldyAoY2hhciAqLCBsZW4gKyAxKTsKKworICBpZiAocmV0dmFsID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIF9kYnVzX2hhc2hfaXRlcl9pbml0IChhY3RpdmF0aW9uLT5lbnRyaWVzLCAmaXRlcik7CisgIGkgPSAwOworICB3aGlsZSAoX2RidXNfaGFzaF9pdGVyX25leHQgKCZpdGVyKSkKKyAgICB7CisgICAgICBCdXNBY3RpdmF0aW9uRW50cnkgKmVudHJ5ID0gX2RidXNfaGFzaF9pdGVyX2dldF92YWx1ZSAoJml0ZXIpOworCisgICAgICByZXR2YWxbaV0gPSBfZGJ1c19zdHJkdXAgKGVudHJ5LT5uYW1lKTsKKyAgICAgIGlmIChyZXR2YWxbaV0gPT0gTlVMTCkKKwlnb3RvIGVycm9yOworCisgICAgICBpKys7CisgICAgfQorCisgIHJldHZhbFtpXSA9IE5VTEw7CisKKyAgaWYgKGFycmF5X2xlbikKKyAgICAqYXJyYXlfbGVuID0gbGVuOworCisgICpsaXN0cCA9IHJldHZhbDsKKyAgcmV0dXJuIFRSVUU7CisKKyBlcnJvcjoKKyAgZm9yIChqID0gMDsgaiA8IGk7IGorKykKKyAgICBkYnVzX2ZyZWUgKHJldHZhbFtqXSk7CisgIGRidXNfZnJlZSAocmV0dmFsKTsKKworICByZXR1cm4gRkFMU0U7Cit9CisKK2RidXNfYm9vbF90CitkYnVzX2FjdGl2YXRpb25fc3lzdGVtZF9mYWlsdXJlIChCdXNBY3RpdmF0aW9uICphY3RpdmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAqbWVzc2FnZSkKK3sKKyAgREJ1c0Vycm9yIGVycm9yOworICBjb25zdCBjaGFyICpjb2RlLCAqc3RyLCAqdW5pdCA9IE5VTEw7CisKKyAgZGJ1c19lcnJvcl9pbml0KCZlcnJvcik7CisKKyAgLyogVGhpcyBpcyBjYWxsZWQgd2hlbmV2ZXIgdGhlIHN5c3RlbWQgYWN0aXZhdG9yIHNlbnQgdXMgYQorICAgICByZXNwb25zZS4gV2UnbGwgaW52YWxpZGF0ZSBhbGwgcGVuZGluZyBhY3RpdmF0aW9ucyB0aGF0IG1hdGNoIHRoZQorICAgICB1bml0IG5hbWUuICovCisKKyAgaWYgKGRidXNfbWVzc2FnZV9nZXRfYXJncyAobWVzc2FnZSwgJmVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmdW5pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJmNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICBkYnVzX3NldF9lcnJvciAoJmVycm9yLCBjb2RlLCAiJXMiLCBzdHIpOworCisKKyAgaWYgKHVuaXQpCisgICAgeworICAgICAgREJ1c0hhc2hJdGVyIGl0ZXI7CisKKyAgICAgIGJ1c19jb250ZXh0X2xvZyAoYWN0aXZhdGlvbi0+Y29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgREJVU19TWVNURU1fTE9HX0lORk8sICJBY3RpdmF0aW9uIHZpYSBzeXN0ZW1kIGZhaWxlZCBmb3IgdW5pdCAnJXMnOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgIHVuaXQsCisgICAgICAgICAgICAgICAgICAgICAgIHN0cik7CisKKyAgICAgIF9kYnVzX2hhc2hfaXRlcl9pbml0IChhY3RpdmF0aW9uLT5wZW5kaW5nX2FjdGl2YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpdGVyKTsKKworICAgICAgd2hpbGUgKF9kYnVzX2hhc2hfaXRlcl9uZXh0ICgmaXRlcikpCisgICAgICAgIHsKKyAgICAgICAgICBCdXNQZW5kaW5nQWN0aXZhdGlvbiAqcCA9IF9kYnVzX2hhc2hfaXRlcl9nZXRfdmFsdWUgKCZpdGVyKTsKKworICAgICAgICAgIGlmIChwLT5zeXN0ZW1kX3NlcnZpY2UgJiYgc3RyY21wIChwLT5zeXN0ZW1kX3NlcnZpY2UsIHVuaXQpID09IDApCisgICAgICAgICAgICBwZW5kaW5nX2FjdGl2YXRpb25fZmFpbGVkKHAsICZlcnJvcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgZGJ1c19lcnJvcl9mcmVlKCZlcnJvcik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2NvbnN0IGNoYXIgKgorYnVzX2FjdGl2YXRpb25fZW50cnlfZ2V0X2Fzc3VtZWRfYXBwYXJtb3JfbGFiZWwgKEJ1c0FjdGl2YXRpb25FbnRyeSAqZW50cnkpCit7CisgIHJldHVybiBlbnRyeS0+YXNzdW1lZF9hcHBhcm1vcl9sYWJlbDsKK30KKworI2lmZGVmIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjZGVmaW5lIFNFUlZJQ0VfTkFNRV8xICJjb20uZXhhbXBsZS5NeVNlcnZpY2UxIgorI2RlZmluZSBTRVJWSUNFX05BTUVfMiAib3JnLmV4YW1wbGUuTXlTZXJ2aWNlMiIKKyNkZWZpbmUgU0VSVklDRV9OQU1FXzMgIm5ldC5leGFtcGxlLk15U2VydmljZTMiCisKKyNkZWZpbmUgU0VSVklDRV9GSUxFXzEgInNlcnZpY2UtMS5zZXJ2aWNlIgorI2RlZmluZSBTRVJWSUNFX0ZJTEVfMiAic2VydmljZS0yLnNlcnZpY2UiCisjZGVmaW5lIFNFUlZJQ0VfRklMRV8zICJzZXJ2aWNlLTMuc2VydmljZSIKKworc3RhdGljIGRidXNfYm9vbF90Cit0ZXN0X2NyZWF0ZV9zZXJ2aWNlX2ZpbGUgKERCdXNTdHJpbmcgKmRpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmV4ZWMpCit7CisgIERCdXNTdHJpbmcgIGZpbGVfbmFtZSwgZnVsbF9wYXRoOworICBGSUxFICAgICAgICAqZmlsZTsKKyAgZGJ1c19ib29sX3QgIHJldF92YWw7CisKKyAgcmV0X3ZhbCA9IFRSVUU7CisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmZmlsZV9uYW1lLCBmaWxlbmFtZSk7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmZ1bGxfcGF0aCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmZ1bGxfcGF0aCwgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChkaXIpKSB8fAorICAgICAgIV9kYnVzX2NvbmNhdF9kaXJfYW5kX2ZpbGUgKCZmdWxsX3BhdGgsICZmaWxlX25hbWUpKQorICAgIHsKKyAgICAgIHJldF92YWwgPSBGQUxTRTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBmaWxlID0gZm9wZW4gKF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmZ1bGxfcGF0aCksICJ3Iik7CisgIGlmICghZmlsZSkKKyAgICB7CisgICAgICByZXRfdmFsID0gRkFMU0U7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgZnByaW50ZiAoZmlsZSwgIltELUJVUyBTZXJ2aWNlXVxuTmFtZT0lc1xuRXhlYz0lc1xuIiwgbmFtZSwgZXhlYyk7CisgIGZjbG9zZSAoZmlsZSk7CisKK291dDoKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmdWxsX3BhdGgpOworICByZXR1cm4gcmV0X3ZhbDsKK30KKworc3RhdGljIGRidXNfYm9vbF90Cit0ZXN0X3JlbW92ZV9zZXJ2aWNlX2ZpbGUgKERCdXNTdHJpbmcgKmRpciwgY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisgIERCdXNTdHJpbmcgIGZpbGVfbmFtZSwgZnVsbF9wYXRoOworICBkYnVzX2Jvb2xfdCByZXRfdmFsOworCisgIHJldF92YWwgPSBUUlVFOworCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmZmlsZV9uYW1lLCBmaWxlbmFtZSk7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmZ1bGxfcGF0aCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmZ1bGxfcGF0aCwgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChkaXIpKSB8fAorICAgICAgIV9kYnVzX2NvbmNhdF9kaXJfYW5kX2ZpbGUgKCZmdWxsX3BhdGgsICZmaWxlX25hbWUpKQorICAgIHsKKyAgICAgIHJldF92YWwgPSBGQUxTRTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAoIV9kYnVzX2RlbGV0ZV9maWxlICgmZnVsbF9wYXRoLCBOVUxMKSkKKyAgICB7CisgICAgICByZXRfdmFsID0gRkFMU0U7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKK291dDoKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmdWxsX3BhdGgpOworICByZXR1cm4gcmV0X3ZhbDsKK30KKworc3RhdGljIGRidXNfYm9vbF90Cit0ZXN0X3JlbW92ZV9kaXJlY3RvcnkgKERCdXNTdHJpbmcgKmRpcikKK3sKKyAgREJ1c0Rpckl0ZXIgKml0ZXI7CisgIERCdXNTdHJpbmcgICBmaWxlbmFtZSwgZnVsbF9wYXRoOworICBkYnVzX2Jvb2xfdCAgcmV0X3ZhbDsKKworICByZXRfdmFsID0gVFJVRTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZmlsZW5hbWUpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZnVsbF9wYXRoKSkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZpbGVuYW1lKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaXRlciA9IF9kYnVzX2RpcmVjdG9yeV9vcGVuIChkaXIsIE5VTEwpOworICBpZiAoaXRlciA9PSBOVUxMKQorICAgIHsKKyAgICAgIHJldF92YWwgPSBGQUxTRTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICB3aGlsZSAoX2RidXNfZGlyZWN0b3J5X2dldF9uZXh0X2ZpbGUgKGl0ZXIsICZmaWxlbmFtZSwgTlVMTCkpCisgICAgeworICAgICAgaWYgKCF0ZXN0X3JlbW92ZV9zZXJ2aWNlX2ZpbGUgKGRpciwgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmZmlsZW5hbWUpKSkKKyAgICAgICAgeworICAgICAgICAgIHJldF92YWwgPSBGQUxTRTsKKyAgICAgICAgICBfZGJ1c19kaXJlY3RvcnlfY2xvc2UgKGl0ZXIpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgfQorICBfZGJ1c19kaXJlY3RvcnlfY2xvc2UgKGl0ZXIpOworCisgIGlmICghX2RidXNfZGVsZXRlX2RpcmVjdG9yeSAoZGlyLCBOVUxMKSkKKyAgICB7CisgICAgICByZXRfdmFsID0gRkFMU0U7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKK291dDoKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmaWxlbmFtZSk7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmZnVsbF9wYXRoKTsKKworICByZXR1cm4gcmV0X3ZhbDsKK30KKworc3RhdGljIGRidXNfYm9vbF90Citpbml0X3NlcnZpY2VfcmVsb2FkX3Rlc3QgKERCdXNTdHJpbmcgKmRpcikKK3sKKyAgaWYgKCFfZGJ1c19jcmVhdGVfZGlyZWN0b3J5IChkaXIsIE5VTEwpKQorICAgIHJldHVybiBGQUxTRTsKKworICAvKiBDcmVhdGUgb25lIGluaXRpYWwgZmlsZSAqLworICBpZiAoIXRlc3RfY3JlYXRlX3NlcnZpY2VfZmlsZSAoZGlyLCBTRVJWSUNFX0ZJTEVfMSwgU0VSVklDRV9OQU1FXzEsICJleGVjLTEiKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorY2xlYW51cF9zZXJ2aWNlX3JlbG9hZF90ZXN0IChEQnVzU3RyaW5nICpkaXIpCit7CisgIGlmICghdGVzdF9yZW1vdmVfZGlyZWN0b3J5IChkaXIpKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gVFJVRTsKK30KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgQnVzQWN0aXZhdGlvbiAqYWN0aXZhdGlvbjsKKyAgY29uc3QgY2hhciAgICAqc2VydmljZV9uYW1lOworICBkYnVzX2Jvb2xfdCAgICBleHBlY3RpbmdfZmluZDsKK30gQ2hlY2tEYXRhOworCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX2Z1bmMgKHZvaWQgKmRhdGEpCit7CisgIENoZWNrRGF0YSAgICAgICAgICAqZDsKKyAgQnVzQWN0aXZhdGlvbkVudHJ5ICplbnRyeTsKKyAgREJ1c0Vycm9yICAgICAgICAgICBlcnJvcjsKKyAgZGJ1c19ib29sX3QgICAgICAgICByZXRfdmFsOworCisgIHJldF92YWwgPSBUUlVFOworICBkID0gZGF0YTsKKworICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisKKyAgZW50cnkgPSBhY3RpdmF0aW9uX2ZpbmRfZW50cnkgKGQtPmFjdGl2YXRpb24sIGQtPnNlcnZpY2VfbmFtZSwgJmVycm9yKTsKKyAgaWYgKGVudHJ5ID09IE5VTEwpCisgICAgeworICAgICAgaWYgKGRidXNfZXJyb3JfaGFzX25hbWUgKCZlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlkpKQorICAgICAgICB7CisgICAgICAgICAgcmV0X3ZhbCA9IFRSVUU7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGlmIChkLT5leHBlY3RpbmdfZmluZCkKKyAgICAgICAgICAgIHJldF92YWwgPSBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKCFkLT5leHBlY3RpbmdfZmluZCkKKyAgICAgICAgcmV0X3ZhbCA9IEZBTFNFOworICAgIH0KKworICByZXR1cm4gcmV0X3ZhbDsKK30KKworc3RhdGljIGRidXNfYm9vbF90Citkb190ZXN0IChjb25zdCBjaGFyICpkZXNjcmlwdGlvbiwgZGJ1c19ib29sX3Qgb29tX3Rlc3QsIENoZWNrRGF0YSAqZGF0YSkKK3sKKyAgZGJ1c19ib29sX3QgZXJyOworCisgIGlmIChvb21fdGVzdCkKKyAgICBlcnIgPSAhX2RidXNfdGVzdF9vb21faGFuZGxpbmcgKGRlc2NyaXB0aW9uLCBjaGVja19mdW5jLCBkYXRhKTsKKyAgZWxzZQorICAgIGVyciA9ICFjaGVja19mdW5jIChkYXRhKTsKKworICBpZiAoZXJyKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIlRlc3QgZmFpbGVkIik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZG9fc2VydmljZV9yZWxvYWRfdGVzdCAoY29uc3QgREJ1c1N0cmluZyAqdGVzdF9kYXRhX2RpciwKKyAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgKmRpciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgIG9vbV90ZXN0KQoreworICBCdXNBY3RpdmF0aW9uICphY3RpdmF0aW9uOworICBCdXNDb25maWdTZXJ2aWNlRGlyIGNvbmZpZzsKKyAgQnVzQ29udGV4dCAgICAqY29udGV4dDsKKyAgREJ1c1N0cmluZyAgICAgYWRkcmVzczsKKyAgREJ1c0xpc3QgICAgICAqZGlyZWN0b3JpZXM7CisgIENoZWNrRGF0YSAgICAgIGQ7CisKKyAgZGlyZWN0b3JpZXMgPSBOVUxMOworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJmFkZHJlc3MsICIiKTsKKworICBjb25maWcucGF0aCA9IF9kYnVzX3N0cmluZ19nZXRfZGF0YSAoZGlyKTsKKyAgY29uZmlnLmZsYWdzID0gQlVTX1NFUlZJQ0VfRElSX0ZMQUdTX05PTkU7CisKKyAgaWYgKCFfZGJ1c19saXN0X2FwcGVuZCAoJmRpcmVjdG9yaWVzLCAmY29uZmlnKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgY29udGV4dCA9IGJ1c19jb250ZXh0X25ld190ZXN0ICh0ZXN0X2RhdGFfZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWxpZC1jb25maWctZmlsZXMvZGVidWctYWxsb3ctYWxsLmNvbmYiKTsKKyAgaWYgKGNvbnRleHQgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgYWN0aXZhdGlvbiA9IGJ1c19hY3RpdmF0aW9uX25ldyAoY29udGV4dCwgJmFkZHJlc3MsICZkaXJlY3RvcmllcywgTlVMTCk7CisgIGlmICghYWN0aXZhdGlvbikKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgZC5hY3RpdmF0aW9uID0gYWN0aXZhdGlvbjsKKworICAvKiBDaGVjayBmb3IgZXhpc3Rpbmcgc2VydmljZSBmaWxlICovCisgIGQuZXhwZWN0aW5nX2ZpbmQgPSBUUlVFOworICBkLnNlcnZpY2VfbmFtZSA9IFNFUlZJQ0VfTkFNRV8xOworCisgIGlmICghZG9fdGVzdCAoIkV4aXN0aW5nIHNlcnZpY2UgZmlsZSIsIG9vbV90ZXN0LCAmZCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIC8qIENoZWNrIGZvciBub24tZXhpc3Rpbmcgc2VydmljZSBmaWxlICovCisgIGQuZXhwZWN0aW5nX2ZpbmQgPSBGQUxTRTsKKyAgZC5zZXJ2aWNlX25hbWUgPSBTRVJWSUNFX05BTUVfMzsKKworICBpZiAoIWRvX3Rlc3QgKCJOb25leGlzdGluZyBzZXJ2aWNlIGZpbGUiLCBvb21fdGVzdCwgJmQpKQorICAgIHJldHVybiBGQUxTRTsKKworICAvKiBDaGVjayBmb3IgYWRkZWQgc2VydmljZSBmaWxlICovCisgIGlmICghdGVzdF9jcmVhdGVfc2VydmljZV9maWxlIChkaXIsIFNFUlZJQ0VfRklMRV8yLCBTRVJWSUNFX05BTUVfMiwgImV4ZWMtMiIpKQorICAgIHJldHVybiBGQUxTRTsKKworICBkLmV4cGVjdGluZ19maW5kID0gVFJVRTsKKyAgZC5zZXJ2aWNlX25hbWUgPSBTRVJWSUNFX05BTUVfMjsKKworICBpZiAoIWRvX3Rlc3QgKCJBZGRlZCBzZXJ2aWNlIGZpbGUiLCBvb21fdGVzdCwgJmQpKQorICAgIHJldHVybiBGQUxTRTsKKworICAvKiBDaGVjayBmb3IgcmVtb3ZlZCBzZXJ2aWNlIGZpbGUgKi8KKyAgaWYgKCF0ZXN0X3JlbW92ZV9zZXJ2aWNlX2ZpbGUgKGRpciwgU0VSVklDRV9GSUxFXzIpKQorICAgIHJldHVybiBGQUxTRTsKKworICBkLmV4cGVjdGluZ19maW5kID0gRkFMU0U7CisgIGQuc2VydmljZV9uYW1lID0gU0VSVklDRV9GSUxFXzI7CisKKyAgaWYgKCFkb190ZXN0ICgiUmVtb3ZlZCBzZXJ2aWNlIGZpbGUiLCBvb21fdGVzdCwgJmQpKQorICAgIHJldHVybiBGQUxTRTsKKworICAvKiBDaGVjayBmb3IgdXBkYXRlZCBzZXJ2aWNlIGZpbGUgKi8KKworICBfZGJ1c19zbGVlcF9taWxsaXNlY29uZHMgKDEwMDApOyAvKiBTbGVlcCBhIHNlY29uZCB0byBtYWtlIHN1cmUgdGhlIG10aW1lIGlzIHVwZGF0ZWQgKi8KKworICBpZiAoIXRlc3RfY3JlYXRlX3NlcnZpY2VfZmlsZSAoZGlyLCBTRVJWSUNFX0ZJTEVfMSwgU0VSVklDRV9OQU1FXzMsICJleGVjLTMiKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgZC5leHBlY3RpbmdfZmluZCA9IFRSVUU7CisgIGQuc2VydmljZV9uYW1lID0gU0VSVklDRV9OQU1FXzM7CisKKyAgaWYgKCFkb190ZXN0ICgiVXBkYXRlZCBzZXJ2aWNlIGZpbGUsIHBhcnQgMSIsIG9vbV90ZXN0LCAmZCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGQuZXhwZWN0aW5nX2ZpbmQgPSBGQUxTRTsKKyAgZC5zZXJ2aWNlX25hbWUgPSBTRVJWSUNFX05BTUVfMTsKKworICBpZiAoIWRvX3Rlc3QgKCJVcGRhdGVkIHNlcnZpY2UgZmlsZSwgcGFydCAyIiwgb29tX3Rlc3QsICZkKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgYnVzX2FjdGl2YXRpb25fdW5yZWYgKGFjdGl2YXRpb24pOworICBfZGJ1c19saXN0X2NsZWFyICgmZGlyZWN0b3JpZXMpOworICBidXNfY29udGV4dF91bnJlZiAoY29udGV4dCk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2RidXNfYm9vbF90CitidXNfYWN0aXZhdGlvbl9zZXJ2aWNlX3JlbG9hZF90ZXN0IChjb25zdCBEQnVzU3RyaW5nICp0ZXN0X2RhdGFfZGlyKQoreworICBEQnVzU3RyaW5nIGRpcmVjdG9yeTsKKyAgY29uc3QgY2hhciAqdG1wOworICBkYnVzX2Jvb2xfdCByZXQgPSBGQUxTRTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZGlyZWN0b3J5KSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgdG1wID0gX2RidXNfZ2V0X3RtcGRpciAoKTsKKworICBpZiAodG1wID09IE5VTEwpCisgICAgZ290byBvdXQ7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmZGlyZWN0b3J5LCB0bXApKQorICAgIGdvdG8gb3V0OworCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmRpcmVjdG9yeSwgIi9kYnVzLXJlbG9hZC10ZXN0LSIpIHx8CisgICAgICAhX2RidXNfZ2VuZXJhdGVfcmFuZG9tX2FzY2lpICgmZGlyZWN0b3J5LCA2LCBOVUxMKSkKKyAgICBnb3RvIG91dDsKKworICAvKiBEbyBub3JtYWwgdGVzdHMgKi8KKyAgaWYgKCFpbml0X3NlcnZpY2VfcmVsb2FkX3Rlc3QgKCZkaXJlY3RvcnkpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkIG5vdCBpbml0aWF0ZSBzZXJ2aWNlIHJlbG9hZCB0ZXN0Iik7CisKKyAgaWYgKCFkb19zZXJ2aWNlX3JlbG9hZF90ZXN0ICh0ZXN0X2RhdGFfZGlyLCAmZGlyZWN0b3J5LCBGQUxTRSkpCisgICAgeworICAgICAgLyogRG8gbm90aGluZz8gKi8KKyAgICB9CisKKyAgaWYgKCFjbGVhbnVwX3NlcnZpY2VfcmVsb2FkX3Rlc3QgKCZkaXJlY3RvcnkpKQorICAgIGdvdG8gb3V0OworCisgIC8qIERvIE9PTSB0ZXN0cyAqLworICBpZiAoIWluaXRfc2VydmljZV9yZWxvYWRfdGVzdCAoJmRpcmVjdG9yeSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGQgbm90IGluaXRpYXRlIHNlcnZpY2UgcmVsb2FkIHRlc3QiKTsKKworICBpZiAoIWRvX3NlcnZpY2VfcmVsb2FkX3Rlc3QgKHRlc3RfZGF0YV9kaXIsICZkaXJlY3RvcnksIFRSVUUpKQorICAgIHsKKyAgICAgIC8qIERvIG5vdGhpbmc/ICovCisgICAgfQorCisgIC8qIENsZWFudXAgdGVzdCBkaXJlY3RvcnkgKi8KKyAgaWYgKCFjbGVhbnVwX3NlcnZpY2VfcmVsb2FkX3Rlc3QgKCZkaXJlY3RvcnkpKQorICAgIGdvdG8gb3V0OworCisgIHJldCA9IFRSVUU7CisKK291dDoKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZkaXJlY3RvcnkpOworICByZXR1cm4gcmV0OworfQorCisjZW5kaWYgLyogREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMgKi8KZGlmZiAtLWdpdCBhL2J1cy9hY3RpdmF0aW9uLmggYi9idXMvYWN0aXZhdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhZThhZGUKLS0tIC9kZXYvbnVsbAorKysgYi9idXMvYWN0aXZhdGlvbi5oCkBAIC0wLDAgKzEsNjkgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogYWN0aXZhdGlvbi5oICBBY3RpdmF0aW9uIG9mIHNlcnZpY2VzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzICBDb2RlRmFjdG9yeSBBQgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBCVVNfQUNUSVZBVElPTl9ICisjZGVmaW5lIEJVU19BQ1RJVkFUSU9OX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1saXN0Lmg+CisjaW5jbHVkZSAiYnVzLmgiCisKK0J1c0FjdGl2YXRpb24qIGJ1c19hY3RpdmF0aW9uX25ldyAgICAgICAgICAgICAgKEJ1c0NvbnRleHQgICAgICAgICpjb250ZXh0LAorCQkJCQkJY29uc3QgREJ1c1N0cmluZyAgKmFkZHJlc3MsCisJCQkJCQlEQnVzTGlzdCAgICAgICAgICoqZGlyZWN0b3JpZXMsCisJCQkJCQlEQnVzRXJyb3IgICAgICAgICAqZXJyb3IpOworZGJ1c19ib29sX3QgYnVzX2FjdGl2YXRpb25fcmVsb2FkICAgICAgICAgICAoQnVzQWN0aXZhdGlvbiAgICAgKmFjdGl2YXRpb24sCisJCQkJCQljb25zdCBEQnVzU3RyaW5nICAqYWRkcmVzcywKKwkJCQkJCURCdXNMaXN0ICAgICAgICAgKipkaXJlY3RvcmllcywKKwkJCQkJCURCdXNFcnJvciAgICAgICAgICplcnJvcik7CitCdXNBY3RpdmF0aW9uKiBidXNfYWN0aXZhdGlvbl9yZWYgICAgICAgICAgICAgIChCdXNBY3RpdmF0aW9uICAgICAqYWN0aXZhdGlvbik7Cit2b2lkICAgICAgICAgICBidXNfYWN0aXZhdGlvbl91bnJlZiAgICAgICAgICAgIChCdXNBY3RpdmF0aW9uICAgICAqYWN0aXZhdGlvbik7CisKK2RidXNfYm9vbF90ICAgYnVzX2FjdGl2YXRpb25fc2V0X2Vudmlyb25tZW50X3ZhcmlhYmxlIChCdXNBY3RpdmF0aW9uICAgICAqYWN0aXZhdGlvbiwKKwkJCQkJCWNvbnN0IGNoYXIgICAgICAgICprZXksCisJCQkJCQljb25zdCBjaGFyICAgICAgICAqdmFsdWUsCisJCQkJCQlEQnVzRXJyb3IgICAgICAgICAqZXJyb3IpOworZGJ1c19ib29sX3QgICAgYnVzX2FjdGl2YXRpb25fYWN0aXZhdGVfc2VydmljZSAoQnVzQWN0aXZhdGlvbiAgICAgKmFjdGl2YXRpb24sCisJCQkJCQlEQnVzQ29ubmVjdGlvbiAgICAqY29ubmVjdGlvbiwKKwkJCQkJCUJ1c1RyYW5zYWN0aW9uICAgICp0cmFuc2FjdGlvbiwKKwkJCQkJCWRidXNfYm9vbF90ICAgICAgICBhdXRvX2FjdGl2YXRpb24sCisJCQkJCQlEQnVzTWVzc2FnZSAgICAgICAqYWN0aXZhdGlvbl9tZXNzYWdlLAorCQkJCQkJY29uc3QgY2hhciAgICAgICAgKnNlcnZpY2VfbmFtZSwKKwkJCQkJCURCdXNFcnJvciAgICAgICAgICplcnJvcik7CitkYnVzX2Jvb2xfdCAgICBidXNfYWN0aXZhdGlvbl9zZXJ2aWNlX2NyZWF0ZWQgIChCdXNBY3RpdmF0aW9uICAgICAqYWN0aXZhdGlvbiwKKwkJCQkJCWNvbnN0IGNoYXIgICAgICAgICpzZXJ2aWNlX25hbWUsCisJCQkJCQlCdXNUcmFuc2FjdGlvbiAgICAqdHJhbnNhY3Rpb24sCisJCQkJCQlEQnVzRXJyb3IgICAgICAgICAqZXJyb3IpOworZGJ1c19ib29sX3QgICAgYnVzX2FjdGl2YXRpb25fbGlzdF9zZXJ2aWNlcyAgICAoQnVzQWN0aXZhdGlvbiAgICAgKnJlZ2lzdHJ5LAorCQkJCQkJY2hhciAgICAgICAgICAgICoqKmxpc3RwLAorCQkJCQkJaW50ICAgICAgICAgICAgICAgKmFycmF5X2xlbik7CitkYnVzX2Jvb2xfdCAgICBkYnVzX2FjdGl2YXRpb25fc3lzdGVtZF9mYWlsdXJlIChCdXNBY3RpdmF0aW9uICAgICAqYWN0aXZhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICAgICptZXNzYWdlKTsKKworZGJ1c19ib29sX3QgICAgYnVzX2FjdGl2YXRpb25fc2VuZF9wZW5kaW5nX2F1dG9fYWN0aXZhdGlvbl9tZXNzYWdlcyAoQnVzQWN0aXZhdGlvbiAgICAgKmFjdGl2YXRpb24sCisJCQkJCQkJCSAgICAgQnVzU2VydmljZSAgICAgICAgKnNlcnZpY2UsCisJCQkJCQkJCSAgICAgQnVzVHJhbnNhY3Rpb24gICAgKnRyYW5zYWN0aW9uKTsKKworY29uc3QgY2hhciAqYnVzX2FjdGl2YXRpb25fZW50cnlfZ2V0X2Fzc3VtZWRfYXBwYXJtb3JfbGFiZWwgKEJ1c0FjdGl2YXRpb25FbnRyeSAqZW50cnkpOworCisjZW5kaWYgLyogQlVTX0FDVElWQVRJT05fSCAqLwpkaWZmIC0tZ2l0IGEvYnVzL2FwcGFybW9yLmMgYi9idXMvYXBwYXJtb3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODVmNWU5Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzL2FwcGFybW9yLmMKQEAgLTAsMCArMSwxMTIxIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0KKyAqIGFwcGFybW9yLmMgIEFwcEFybW9yIHNlY3VyaXR5IGNoZWNrcyBmb3IgRC1CdXMKKyAqCisgKiBCYXNlZCBvbiBzZWxpbnV4LmMKKyAqCisgKiBDb3B5cmlnaHQgwqkgMjAxNC0yMDE1IENhbm9uaWNhbCwgTHRkLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiYXBwYXJtb3IuaCIKKworI2lmZGVmIEhBVkVfQVBQQVJNT1IKKworI2luY2x1ZGUgPGRidXMvZGJ1cy1pbnRlcm5hbHMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL2FwcGFybW9yLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXNsb2cuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2lmZGVmIEhBVkVfTElCQVVESVQKKyNpbmNsdWRlIDxsaWJhdWRpdC5oPgorI2VuZGlmIC8qIEhBVkVfTElCQVVESVQgKi8KKworI2luY2x1ZGUgImFjdGl2YXRpb24uaCIKKyNpbmNsdWRlICJhdWRpdC5oIgorI2luY2x1ZGUgImNvbm5lY3Rpb24uaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorCisvKiBTdG9yZSB0aGUgdmFsdWUgdGVsbGluZyB1cyBpZiBBcHBBcm1vciBELUJ1cyBtZWRpYXRpb24gaXMgZW5hYmxlZC4gKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdCBhcHBhcm1vcl9lbmFibGVkID0gRkFMU0U7CisKK3R5cGVkZWYgZW51bSB7CisgIEFQUEFSTU9SX0RJU0FCTEVELAorICBBUFBBUk1PUl9FTkFCTEVELAorICBBUFBBUk1PUl9SRVFVSVJFRAorfSBBcHBBcm1vckNvbmZpZ01vZGU7CisKKy8qIFN0b3JlIHRoZSB2YWx1ZSBvZiB0aGUgQXBwQXJtb3IgbWVkaWF0aW9uIG1vZGUgaW4gdGhlIGJ1cyBjb25maWd1cmF0aW9uICovCitzdGF0aWMgQXBwQXJtb3JDb25maWdNb2RlIGFwcGFybW9yX2NvbmZpZ19tb2RlID0gQVBQQVJNT1JfRU5BQkxFRDsKKworLyogVGhlIEFwcEFybW9yIGNvbnRleHQsIGNvbnNpc3Rpbmcgb2YgYSBsYWJlbCBhbmQgYSBtb2RlLiAqLworc3RydWN0IEJ1c0FwcEFybW9yQ29uZmluZW1lbnQKK3sKKyAgaW50IHJlZmNvdW50OyAvKiBSZWZlcmVuY2UgY291bnQgKi8KKworICBjaGFyICpsYWJlbDsgLyogQXBwQXJtb3IgY29uZmluZW1lbnQgbGFiZWwgKi8KKyAgY29uc3QgY2hhciAqbW9kZTsgLyogQXBwQXJtb3IgY29uZmluZW1lbnQgbW9kZSAoZnJlZWQgYnkgZnJlZWluZyAqbGFiZWwpICovCit9OworCitzdGF0aWMgQnVzQXBwQXJtb3JDb25maW5lbWVudCAqYnVzX2NvbiA9IE5VTEw7CisKKy8qKgorICogQ2FsbGVycyBvZiB0aGlzIGZ1bmN0aW9uIGdpdmUgdXAgb3duZXJzaGlwIG9mIHRoZSAqbGFiZWwgYW5kICptb2RlCisgKiBwb2ludGVycy4KKyAqCisgKiBBZGRpdGlvbmFsbHksIHRoZSByZXNwb25zaWJpbGl0eSBvZiBmcmVlaW5nICpsYWJlbCBhbmQgKm1vZGUgYmVjb21lcyB0aGUKKyAqIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBidXNfYXBwYXJtb3JfY29uZmluZW1lbnRfdW5yZWYoKSBmdW5jdGlvbi4gSG93ZXZlciwgaXQKKyAqIGRvZXMgbm90IGZyZWUgKm1vZGUgYmVjYXVzZSBsaWJhcHBhcm1vcidzIGFhX2dldGNvbigpLCBhbmQgbGliYXBwYXJtb3IncworICogb3RoZXIgcmVsYXRlZCBmdW5jdGlvbnMsIGFsbG9jYXRlIGEgc2luZ2xlIGJ1ZmZlciBmb3IgKmxhYmVsIGFuZCAqbW9kZSBhbmQKKyAqIHRoZW4gc2VwYXJhdGUgdGhlIHR3byBjaGFyIGFycmF5cyB3aXRoIGEgTlVMIGNoYXIuIFNlZSB0aGUgYWFfZ2V0Y29uKDIpIG1hbgorICogcGFnZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCitzdGF0aWMgQnVzQXBwQXJtb3JDb25maW5lbWVudCoKK2J1c19hcHBhcm1vcl9jb25maW5lbWVudF9uZXcgKGNoYXIgICAgICAgKmxhYmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbW9kZSkKK3sKKyAgQnVzQXBwQXJtb3JDb25maW5lbWVudCAqY29uZmluZW1lbnQ7CisKKyAgY29uZmluZW1lbnQgPSBkYnVzX25ldzAgKEJ1c0FwcEFybW9yQ29uZmluZW1lbnQsIDEpOworICBpZiAoY29uZmluZW1lbnQgIT0gTlVMTCkKKyAgICB7CisgICAgICBjb25maW5lbWVudC0+cmVmY291bnQgPSAxOworICAgICAgY29uZmluZW1lbnQtPmxhYmVsID0gbGFiZWw7CisgICAgICBjb25maW5lbWVudC0+bW9kZSA9IG1vZGU7CisgICAgfQorCisgIHJldHVybiBjb25maW5lbWVudDsKK30KKworLyoKKyAqIFJldHVybiBUUlVFIG9uIHN1Y2Nlc3NmdWwgY2hlY2ssIEZBTFNFIG9uIE9PTS4KKyAqIFNldCAqaXNfc3VwcG9ydGVkIHRvIHdoZXRoZXIgQUEgaGFzIEQtQnVzIGZlYXR1cmVzLgorICovCitzdGF0aWMgZGJ1c19ib29sX3QKK19idXNfYXBwYXJtb3JfZGV0ZWN0X2FhX2RidXNfc3VwcG9ydCAoZGJ1c19ib29sX3QgKmlzX3N1cHBvcnRlZCkKK3sKKyAgaW50IG1hc2tfZmlsZTsKKyAgREJ1c1N0cmluZyBhYV9kYnVzOworICBjaGFyICphYV9zZWN1cml0eWZzID0gTlVMTDsKKyAgZGJ1c19ib29sX3QgcmV0dmFsID0gRkFMU0U7CisKKyAgKmlzX3N1cHBvcnRlZCA9IEZBTFNFOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZhYV9kYnVzKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKGFhX2ZpbmRfbW91bnRwb2ludCAoJmFhX3NlY3VyaXR5ZnMpICE9IDApCisgICAgZ290byBvdXQ7CisKKyAgLyoKKyAgICogSm9obiBKb2hhbnNlbiBoYXMgY29uZmlybWVkIHRoYXQgdGhlIG1haW5saW5lIGtlcm5lbCB3aWxsIG5vdCBoYXZlCisgICAqIHRoZSBhcHBhcm1vcmZzL2ZlYXR1cmVzL2RidXMvbWFzayBmaWxlIHVudGlsIHRoZSBtYWlubGluZSBrZXJuZWwKKyAgICogaGFzIEFwcEFybW9yIGdldHBlZXJzZWMgc3VwcG9ydC4KKyAgICovCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmFhX2RidXMsIGFhX3NlY3VyaXR5ZnMpIHx8CisgICAgICAhX2RidXNfc3RyaW5nX2FwcGVuZCAoJmFhX2RidXMsICIvZmVhdHVyZXMvZGJ1cy9tYXNrIikpCisgICAgZ290byBvdXQ7CisKKyAgLyogV2UgbmVlZCB0byBvcGVuKCkgdGhlIGZsYWcgZmlsZSwgbm90IGp1c3Qgc3RhdCgpIGl0LCBiZWNhdXNlIEFwcEFybW9yCisgICAqIGRvZXMgbm90IG1lZGlhdGUgc3RhdCgpIGluIHRoZSBhcHBhcm1vcmZzLiBJZiB5b3UgaGF2ZSBhCisgICAqIGRidXMtZGFlbW9uIGluc2lkZSBhbiBMWEMgY29udGFpbmVyLCB3aXRoIGluc3VmZmljaWVudGx5IGJyb2FkCisgICAqIEFwcEFybW9yIHByaXZpbGVnZXMgdG8gZG8gaXRzIG93biBBcHBBcm1vciBtZWRpYXRpb24sIHRoZSBkZXNpcmVkCisgICAqIHJlc3VsdCBpcyB0aGF0IGl0IGJlaGF2ZXMgYXMgaWYgQXBwQXJtb3Igd2FzIG5vdCBwcmVzZW50OyBidXQgYSBzdGF0KCkKKyAgICogaGVyZSB3b3VsZCBzdWNjZWVkLCBhbmQgcmVzdWx0IGluIGl0IHRyeWluZyBhbmQgZmFpbGluZyB0byBkbyBmdWxsCisgICAqIG1lZGlhdGlvbi4gaHR0cHM6Ly9idWdzLmxhdW5jaHBhZC5uZXQvdWJ1bnR1Lytzb3VyY2UvZGJ1cy8rYnVnLzEyMzgyNjcgKi8KKyAgbWFza19maWxlID0gb3BlbiAoX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmYWFfZGJ1cyksCisgICAgICAgICAgICAgICAgICAgIE9fUkRPTkxZIHwgT19DTE9FWEVDKTsKKyAgaWYgKG1hc2tfZmlsZSAhPSAtMSkKKyAgICB7CisgICAgICAqaXNfc3VwcG9ydGVkID0gVFJVRTsKKyAgICAgIGNsb3NlIChtYXNrX2ZpbGUpOworICAgIH0KKworICByZXR2YWwgPSBUUlVFOworCitvdXQ6CisgIGZyZWUgKGFhX3NlY3VyaXR5ZnMpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmFhX2RidXMpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorbW9kZXN0cl9pc19jb21wbGFpbiAoY29uc3QgY2hhciAqbW9kZSkKK3sKKyAgaWYgKG1vZGUgJiYgc3RyY21wIChtb2RlLCAiY29tcGxhaW4iKSA9PSAwKQorICAgIHJldHVybiBUUlVFOworICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyB2b2lkCitsb2dfbWVzc2FnZSAoZGJ1c19ib29sX3QgYWxsb3csIGNvbnN0IGNoYXIgKm9wLCBEQnVzU3RyaW5nICpkYXRhKQoreworICBjb25zdCBjaGFyICptc3RyOworI2lmZGVmIEhBVkVfTElCQVVESVQKKyAgaW50IGF1ZGl0X2ZkOworI2VuZGlmCisKKyAgaWYgKGFsbG93KQorICAgIG1zdHIgPSAiQUxMT1dFRCI7CisgIGVsc2UKKyAgICBtc3RyID0gIkRFTklFRCI7CisKKyNpZmRlZiBIQVZFX0xJQkFVRElUCisgIGF1ZGl0X2ZkID0gYnVzX2F1ZGl0X2dldF9mZCAoKTsKKworICBpZiAoYXVkaXRfZmQgPj0gMCkKKyAgeworICAgIERCdXNTdHJpbmcgYXZjOworCisgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmF2YykpCisgICAgICBnb3RvIHN5c2xvZzsKKworICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9wcmludGYgKCZhdmMsCisgICAgICAgICAgImFwcGFybW9yPVwiJXNcIiBvcGVyYXRpb249XCJkYnVzXyVzXCIgJXNcbiIsCisgICAgICAgICAgbXN0ciwgb3AsIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoZGF0YSkpKQorICAgICAgeworICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmF2Yyk7CisgICAgICAgIGdvdG8gc3lzbG9nOworICAgICAgfQorCisgICAgLyogRklYTUU6IG5lZWQgdG8gY2hhbmdlIHRoaXMgdG8gc2hvdyByZWFsIHVzZXIgKi8KKyAgICBhdWRpdF9sb2dfdXNlcl9hdmNfbWVzc2FnZSAoYXVkaXRfZmQsIEFVRElUX1VTRVJfQVZDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZhdmMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLCBnZXR1aWQgKCkpOworICAgIF9kYnVzX3N0cmluZ19mcmVlICgmYXZjKTsKKyAgICByZXR1cm47CisgIH0KKworc3lzbG9nOgorI2VuZGlmIC8qIEhBVkVfTElCQVVESVQgKi8KKworICBzeXNsb2cgKExPR19VU0VSIHwgTE9HX05PVElDRSwgImFwcGFybW9yPVwiJXNcIiBvcGVyYXRpb249XCJkYnVzXyVzXCIgJXNcbiIsCisgICAgICAgICAgbXN0ciwgb3AsIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoZGF0YSkpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK19kYnVzX2FwcGVuZF9wYWlyX3VpbnQgKERCdXNTdHJpbmcgKmF1eGRhdGEsIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgdmFsdWUpCit7CisgIHJldHVybiBfZGJ1c19zdHJpbmdfYXBwZW5kIChhdXhkYXRhLCAiICIpICYmCisgICAgICAgICBfZGJ1c19zdHJpbmdfYXBwZW5kIChhdXhkYXRhLCBuYW1lKSAmJgorICAgICAgICAgX2RidXNfc3RyaW5nX2FwcGVuZCAoYXV4ZGF0YSwgIj0iKSAmJgorICAgICAgICAgX2RidXNfc3RyaW5nX2FwcGVuZF91aW50IChhdXhkYXRhLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorX2RidXNfYXBwZW5kX3BhaXJfc3RyIChEQnVzU3RyaW5nICphdXhkYXRhLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKyAgcmV0dXJuIF9kYnVzX3N0cmluZ19hcHBlbmQgKGF1eGRhdGEsICIgIikgJiYKKyAgICAgICAgIF9kYnVzX3N0cmluZ19hcHBlbmQgKGF1eGRhdGEsIG5hbWUpICYmCisgICAgICAgICBfZGJ1c19zdHJpbmdfYXBwZW5kIChhdXhkYXRhLCAiPVwiIikgJiYKKyAgICAgICAgIF9kYnVzX3N0cmluZ19hcHBlbmQgKGF1eGRhdGEsIHZhbHVlKSAmJgorICAgICAgICAgX2RidXNfc3RyaW5nX2FwcGVuZCAoYXV4ZGF0YSwgIlwiIik7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorX2RidXNfYXBwZW5kX21hc2sgKERCdXNTdHJpbmcgKmF1eGRhdGEsIHVpbnQzMl90IG1hc2spCit7CisgIGNvbnN0IGNoYXIgKm1hc2tfc3RyOworCisgIC8qIE9ubHkgb25lIHBlcm1pc3Npb24gYml0IGNhbiBiZSBzZXQgKi8KKyAgaWYgKG1hc2sgPT0gQUFfREJVU19TRU5EKQorICAgIG1hc2tfc3RyID0gInNlbmQiOworICBlbHNlIGlmIChtYXNrID09IEFBX0RCVVNfUkVDRUlWRSkKKyAgICBtYXNrX3N0ciA9ICJyZWNlaXZlIjsKKyAgZWxzZSBpZiAobWFzayA9PSBBQV9EQlVTX0JJTkQpCisgICAgbWFza19zdHIgPSAiYmluZCI7CisgIGVsc2UKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dXJuIF9kYnVzX2FwcGVuZF9wYWlyX3N0ciAoYXV4ZGF0YSwgIm1hc2siLCBtYXNrX3N0cik7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAoraXNfdW5jb25maW5lZCAoY29uc3QgY2hhciAqY29uLCBjb25zdCBjaGFyICptb2RlKQoreworICAvKiB0cmVhdCBjb24gPT0gTlVMTCBhcyBjb25maW5lZCBhcyBpdCBpcyBnb2luZyB0byByZXN1bHQgaW4gYSBkZW5pYWwgKi8KKyAgaWYgKCghbW9kZSAmJiBjb24gJiYgc3RyY21wIChjb24sICJ1bmNvbmZpbmVkIikgPT0gMCkgfHwKKyAgICAgIHN0cmNtcCAobW9kZSwgInVuY29uZmluZWQiKSA9PSAwKQorICAgIHsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorcXVlcnlfYXBwZW5kIChEQnVzU3RyaW5nICpxdWVyeSwgY29uc3QgY2hhciAqYnVmZmVyKQoreworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfYnl0ZSAocXVlcnksICdcMCcpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoYnVmZmVyICYmICFfZGJ1c19zdHJpbmdfYXBwZW5kIChxdWVyeSwgYnVmZmVyKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYnVpbGRfY29tbW9uX3F1ZXJ5IChEQnVzU3RyaW5nICpxdWVyeSwgY29uc3QgY2hhciAqY29uLCBjb25zdCBjaGFyICpidXN0eXBlKQoreworICAvKioKKyAgICogbGliYXBwYXJtb3IncyBhYV9xdWVyeV9sYWJlbCgpIGZ1bmN0aW9uIHNjcmliYmxlcyBvdmVyIHRoZSBmaXJzdAorICAgKiBBQV9RVUVSWV9DTURfTEFCRUxfU0laRSBieXRlcyBvZiB0aGUgcXVlcnkgc3RyaW5nIHdpdGggYSBwcml2YXRlIHZhbHVlLgorICAgKi8KKyAgcmV0dXJuIF9kYnVzX3N0cmluZ19pbnNlcnRfYnl0ZXMgKHF1ZXJ5LCAwLCBBQV9RVUVSWV9DTURfTEFCRUxfU0laRSwgMCkgJiYKKyAgICAgICAgIF9kYnVzX3N0cmluZ19hcHBlbmQgKHF1ZXJ5LCBjb24pICYmCisgICAgICAgICBfZGJ1c19zdHJpbmdfYXBwZW5kX2J5dGUgKHF1ZXJ5LCAnXDAnKSAmJgorICAgICAgICAgX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlIChxdWVyeSwgQUFfQ0xBU1NfREJVUykgJiYKKyAgICAgICAgIF9kYnVzX3N0cmluZ19hcHBlbmQgKHF1ZXJ5LCBidXN0eXBlID8gYnVzdHlwZSA6ICIiKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitidWlsZF9zZXJ2aWNlX3F1ZXJ5IChEQnVzU3RyaW5nICpxdWVyeSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNvbiwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmJ1c3R5cGUsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lKQoreworICByZXR1cm4gYnVpbGRfY29tbW9uX3F1ZXJ5IChxdWVyeSwgY29uLCBidXN0eXBlKSAmJgorICAgICAgICAgcXVlcnlfYXBwZW5kIChxdWVyeSwgbmFtZSk7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYnVpbGRfbWVzc2FnZV9xdWVyeSAoREJ1c1N0cmluZyAqcXVlcnksCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzcmNfY29uLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYnVzdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkc3RfY29uLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmludGVyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1lbWJlcikKK3sKKyAgcmV0dXJuIGJ1aWxkX2NvbW1vbl9xdWVyeSAocXVlcnksIHNyY19jb24sIGJ1c3R5cGUpICYmCisgICAgICAgICBxdWVyeV9hcHBlbmQgKHF1ZXJ5LCBuYW1lKSAmJgorICAgICAgICAgcXVlcnlfYXBwZW5kIChxdWVyeSwgZHN0X2NvbikgJiYKKyAgICAgICAgIHF1ZXJ5X2FwcGVuZCAocXVlcnksIHBhdGgpICYmCisgICAgICAgICBxdWVyeV9hcHBlbmQgKHF1ZXJ5LCBpbnRlcmZhY2UpICYmCisgICAgICAgICBxdWVyeV9hcHBlbmQgKHF1ZXJ5LCBtZW1iZXIpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2J1aWxkX2VhdmVzZHJvcF9xdWVyeSAoREJ1c1N0cmluZyAqcXVlcnksIGNvbnN0IGNoYXIgKmNvbiwgY29uc3QgY2hhciAqYnVzdHlwZSkKK3sKKyAgcmV0dXJuIGJ1aWxkX2NvbW1vbl9xdWVyeSAocXVlcnksIGNvbiwgYnVzdHlwZSk7Cit9CisKK3N0YXRpYyB2b2lkCitzZXRfZXJyb3JfZnJvbV9xdWVyeV9lcnJubyAoREJ1c0Vycm9yICplcnJvciwgaW50IGVycm9yX251bWJlcikKK3sKKyAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnJvcl9udW1iZXIpLAorICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBxdWVyeSBBcHBBcm1vciBwb2xpY3k6ICVzIiwKKyAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmVycm9yIChlcnJvcl9udW1iZXIpKTsKK30KKworc3RhdGljIHZvaWQKK3NldF9lcnJvcl9mcm9tX2RlbmllZF9tZXNzYWdlIChEQnVzRXJyb3IgICAgICAqZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKnNlbmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqcHJvcG9zZWRfcmVjaXBpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICByZXF1ZXN0ZWRfcmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKm1zZ3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKmludGVyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqbWVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICplcnJvcl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpkZXN0aW5hdGlvbikKK3sKKyAgY29uc3QgY2hhciAqcHJvcG9zZWRfcmVjaXBpZW50X2xvZ2luZm87CisgIGNvbnN0IGNoYXIgKnVuc2V0ID0gIih1bnNldCkiOworCisgIHByb3Bvc2VkX3JlY2lwaWVudF9sb2dpbmZvID0gcHJvcG9zZWRfcmVjaXBpZW50ID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXNfY29ubmVjdGlvbl9nZXRfbG9naW5mbyAocHJvcG9zZWRfcmVjaXBpZW50KSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ1cyI7CisKKyAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0FDQ0VTU19ERU5JRUQsCisgICAgICAgICAgICAgICAgICAiQW4gQXBwQXJtb3IgcG9saWN5IHByZXZlbnRzIHRoaXMgc2VuZGVyIGZyb20gc2VuZGluZyB0aGlzICIKKyAgICAgICAgICAgICAgICAgICJtZXNzYWdlIHRvIHRoaXMgcmVjaXBpZW50OyB0eXBlPVwiJXNcIiwgIgorICAgICAgICAgICAgICAgICAgInNlbmRlcj1cIiVzXCIgKCVzKSBpbnRlcmZhY2U9XCIlc1wiIG1lbWJlcj1cIiVzXCIgIgorICAgICAgICAgICAgICAgICAgImVycm9yIG5hbWU9XCIlc1wiIHJlcXVlc3RlZF9yZXBseT1cIiVkXCIgIgorICAgICAgICAgICAgICAgICAgImRlc3RpbmF0aW9uPVwiJXNcIiAoJXMpIiwKKyAgICAgICAgICAgICAgICAgIG1zZ3R5cGUsCisgICAgICAgICAgICAgICAgICBidXNfY29ubmVjdGlvbl9nZXRfbmFtZSAoc2VuZGVyKSwKKyAgICAgICAgICAgICAgICAgIGJ1c19jb25uZWN0aW9uX2dldF9sb2dpbmZvIChzZW5kZXIpLAorICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlID8gaW50ZXJmYWNlIDogdW5zZXQsCisgICAgICAgICAgICAgICAgICBtZW1iZXIgPyBtZW1iZXIgOiB1bnNldCwKKyAgICAgICAgICAgICAgICAgIGVycm9yX25hbWUgPyBlcnJvcl9uYW1lIDogdW5zZXQsCisgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRfcmVwbHksCisgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbiwKKyAgICAgICAgICAgICAgICAgIHByb3Bvc2VkX3JlY2lwaWVudF9sb2dpbmZvKTsKK30KKyNlbmRpZiAvKiBIQVZFX0FQUEFSTU9SICovCisKKy8qKgorICogRG8gZWFybHkgaW5pdGlhbGl6YXRpb247IGRldGVybWluZSB3aGV0aGVyIEFwcEFybW9yIGlzIGVuYWJsZWQuCisgKiBSZXR1cm4gVFJVRSBvbiBzdWNjZXNzZnVsIGNoZWNrICh3aGV0aGVyIEFwcEFybW9yIGlzIGFjdHVhbGx5CisgKiBlbmFibGVkIG9yIG5vdCkgb3IgRkFMU0Ugb24gT09NLgorICovCitkYnVzX2Jvb2xfdAorYnVzX2FwcGFybW9yX3ByZV9pbml0ICh2b2lkKQoreworI2lmZGVmIEhBVkVfQVBQQVJNT1IKKyAgYXBwYXJtb3JfZW5hYmxlZCA9IEZBTFNFOworCisgIGlmICghYWFfaXNfZW5hYmxlZCAoKSkKKyAgICByZXR1cm4gVFJVRTsKKworICBpZiAoIV9idXNfYXBwYXJtb3JfZGV0ZWN0X2FhX2RidXNfc3VwcG9ydCAoJmFwcGFybW9yX2VuYWJsZWQpKQorICAgIHJldHVybiBGQUxTRTsKKyNlbmRpZgorCisgIHJldHVybiBUUlVFOworfQorCitkYnVzX2Jvb2xfdAorYnVzX2FwcGFybW9yX3NldF9tb2RlX2Zyb21fY29uZmlnIChjb25zdCBjaGFyICptb2RlLCBEQnVzRXJyb3IgKmVycm9yKQoreworI2lmZGVmIEhBVkVfQVBQQVJNT1IKKyAgaWYgKG1vZGUgIT0gTlVMTCkKKyAgeworICAgIGlmIChzdHJjbXAgKG1vZGUsICJkaXNhYmxlZCIpID09IDApCisgICAgICBhcHBhcm1vcl9jb25maWdfbW9kZSA9IEFQUEFSTU9SX0RJU0FCTEVEOworICAgIGVsc2UgaWYgKHN0cmNtcCAobW9kZSwgImVuYWJsZWQiKSA9PSAwKQorICAgICAgYXBwYXJtb3JfY29uZmlnX21vZGUgPSBBUFBBUk1PUl9FTkFCTEVEOworICAgIGVsc2UgaWYgKHN0cmNtcCAobW9kZSwgInJlcXVpcmVkIikgPT0gMCkKKyAgICAgIGFwcGFybW9yX2NvbmZpZ19tb2RlID0gQVBQQVJNT1JfUkVRVUlSRUQ7CisgICAgZWxzZQorICAgICAgeworICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICAgIk1vZGUgYXR0cmlidXRlIG9uIDxhcHBhcm1vcj4gbXVzdCBoYXZlIHZhbHVlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcInJlcXVpcmVkXCIsIFwiZW5hYmxlZFwiIG9yIFwiZGlzYWJsZWRcIiwgIgorICAgICAgICAgICAgICAgICAgICAgICAgIm5vdCBcIiVzXCIiLCBtb2RlKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQorICB9CisKKyAgcmV0dXJuIFRSVUU7CisjZWxzZQorICBpZiAobW9kZSA9PSBOVUxMIHx8IHN0cmNtcCAobW9kZSwgImRpc2FibGVkIikgPT0gMCB8fAorICAgICAgICAgICAgICAgICAgICAgIHN0cmNtcCAobW9kZSwgImVuYWJsZWQiKSA9PSAwKQorICAgIHJldHVybiBUUlVFOworCisgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAiTW9kZSBhdHRyaWJ1dGUgb24gPGFwcGFybW9yPiBtdXN0IGhhdmUgdmFsdWUgXCJlbmFibGVkXCIgb3IgIgorICAgICAgICAgICAgICAgICAgIlwiZGlzYWJsZWRcIiBidXQgY2Fubm90IGJlIFwiJXNcIiB3aGVuIEQtQnVzIGlzIGJ1aWx0ICIKKyAgICAgICAgICAgICAgICAgICJ3aXRob3V0IEFwcEFybW9yIHN1cHBvcnQiLCBtb2RlKTsKKyAgcmV0dXJuIEZBTFNFOworI2VuZGlmCit9CisKKy8qKgorICogVmVyaWZ5IHRoYXQgdGhlIGNvbmZpZyBtb2RlIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUga2VybmVsJ3MgQXBwQXJtb3IKKyAqIHN1cHBvcnQuIElmIEFwcEFybW9yIG1lZGlhdGlvbiB3aWxsIGJlIGVuYWJsZWQsIGRldGVybWluZSB0aGUgYnVzCisgKiBjb25maW5lbWVudCBsYWJlbC4KKyAqLworZGJ1c19ib29sX3QKK2J1c19hcHBhcm1vcl9mdWxsX2luaXQgKERCdXNFcnJvciAqZXJyb3IpCit7CisjaWZkZWYgSEFWRV9BUFBBUk1PUgorICBjaGFyICpsYWJlbCwgKm1vZGU7CisKKyAgaWYgKGFwcGFybW9yX2VuYWJsZWQpCisgICAgeworICAgICAgaWYgKGFwcGFybW9yX2NvbmZpZ19tb2RlID09IEFQUEFSTU9SX0RJU0FCTEVEKQorICAgICAgICB7CisgICAgICAgICAgYXBwYXJtb3JfZW5hYmxlZCA9IEZBTFNFOworICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICB9CisKKyAgICAgIGlmIChidXNfY29uID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoYWFfZ2V0Y29uICgmbGFiZWwsICZtb2RlKSA9PSAtMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciBnZXR0aW5nIEFwcEFybW9yIGNvbnRleHQgb2YgYnVzOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgYnVzX2NvbiA9IGJ1c19hcHBhcm1vcl9jb25maW5lbWVudF9uZXcgKGxhYmVsLCBtb2RlKTsKKyAgICAgICAgICBpZiAoYnVzX2NvbiA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgICAgICBmcmVlIChsYWJlbCk7CisgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmIChhcHBhcm1vcl9jb25maWdfbW9kZSA9PSBBUFBBUk1PUl9SRVFVSVJFRCkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJBcHBBcm1vciBtZWRpYXRpb24gcmVxdWlyZWQgYnV0IG5vdCBwcmVzZW50Iik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChhcHBhcm1vcl9jb25maWdfbW9kZSA9PSBBUFBBUk1PUl9FTkFCTEVEKQorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworICByZXR1cm4gVFJVRTsKK30KKwordm9pZAorYnVzX2FwcGFybW9yX3NodXRkb3duICh2b2lkKQoreworI2lmZGVmIEhBVkVfQVBQQVJNT1IKKyAgaWYgKCFhcHBhcm1vcl9lbmFibGVkKQorICAgIHJldHVybjsKKworICBfZGJ1c192ZXJib3NlICgiQXBwQXJtb3Igc2h1dGRvd25cbiIpOworCisgIGJ1c19hcHBhcm1vcl9jb25maW5lbWVudF91bnJlZiAoYnVzX2Nvbik7CisgIGJ1c19jb24gPSBOVUxMOworI2VuZGlmIC8qIEhBVkVfQVBQQVJNT1IgKi8KK30KKworZGJ1c19ib29sX3QKK2J1c19hcHBhcm1vcl9lbmFibGVkICh2b2lkKQoreworI2lmZGVmIEhBVkVfQVBQQVJNT1IKKyAgcmV0dXJuIGFwcGFybW9yX2VuYWJsZWQ7CisjZWxzZQorICByZXR1cm4gRkFMU0U7CisjZW5kaWYKK30KKwordm9pZAorYnVzX2FwcGFybW9yX2NvbmZpbmVtZW50X3VucmVmIChCdXNBcHBBcm1vckNvbmZpbmVtZW50ICpjb25maW5lbWVudCkKK3sKKyNpZmRlZiBIQVZFX0FQUEFSTU9SCisgIGlmICghYXBwYXJtb3JfZW5hYmxlZCkKKyAgICByZXR1cm47CisKKyAgX2RidXNfYXNzZXJ0IChjb25maW5lbWVudCAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChjb25maW5lbWVudC0+cmVmY291bnQgPiAwKTsKKworICBjb25maW5lbWVudC0+cmVmY291bnQgLT0gMTsKKworICBpZiAoY29uZmluZW1lbnQtPnJlZmNvdW50ID09IDApCisgICAgeworICAgICAgLyoqCisgICAgICAgKiBEbyBub3QgZnJlZSBjb25maW5lbWVudC0+bW9kZSwgYXMgbGliYXBwYXJtb3IgZG9lcyBhIHNpbmdsZSBtYWxsb2MgZm9yCisgICAgICAgKiBib3RoIGNvbmZpbmVtZW50LT5sYWJlbCBhbmQgY29uZmluZW1lbnQtPm1vZGUuCisgICAgICAgKi8KKyAgICAgIGZyZWUgKGNvbmZpbmVtZW50LT5sYWJlbCk7CisgICAgICBkYnVzX2ZyZWUgKGNvbmZpbmVtZW50KTsKKyAgICB9CisjZW5kaWYKK30KKwordm9pZAorYnVzX2FwcGFybW9yX2NvbmZpbmVtZW50X3JlZiAoQnVzQXBwQXJtb3JDb25maW5lbWVudCAqY29uZmluZW1lbnQpCit7CisjaWZkZWYgSEFWRV9BUFBBUk1PUgorICBpZiAoIWFwcGFybW9yX2VuYWJsZWQpCisgICAgcmV0dXJuOworCisgIF9kYnVzX2Fzc2VydCAoY29uZmluZW1lbnQgIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAoY29uZmluZW1lbnQtPnJlZmNvdW50ID4gMCk7CisKKyAgY29uZmluZW1lbnQtPnJlZmNvdW50ICs9IDE7CisjZW5kaWYgLyogSEFWRV9BUFBBUk1PUiAqLworfQorCitCdXNBcHBBcm1vckNvbmZpbmVtZW50KgorYnVzX2FwcGFybW9yX2luaXRfY29ubmVjdGlvbl9jb25maW5lbWVudCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisjaWZkZWYgSEFWRV9BUFBBUk1PUgorICBCdXNBcHBBcm1vckNvbmZpbmVtZW50ICpjb25maW5lbWVudDsKKyAgY2hhciAqbGFiZWwsICptb2RlOworICBpbnQgZmQ7CisKKyAgaWYgKCFhcHBhcm1vcl9lbmFibGVkKQorICAgIHJldHVybiBOVUxMOworCisgIF9kYnVzX2Fzc2VydCAoY29ubmVjdGlvbiAhPSBOVUxMKTsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9nZXRfc29ja2V0IChjb25uZWN0aW9uLCAmZmQpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBnZXQgc29ja2V0IGZpbGUgZGVzY3JpcHRvciBvZiBjb25uZWN0aW9uIik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgaWYgKGFhX2dldHBlZXJjb24gKGZkLCAmbGFiZWwsICZtb2RlKSA9PSAtMSkKKyAgICB7CisgICAgICBpZiAoZXJybm8gPT0gRU5PTUVNKQorICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgZWxzZQorICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZ2V0IEFwcEFybW9yIGNvbmZpbmVtZW50IGluZm9ybWF0aW9uIG9mIHNvY2tldCBwZWVyOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBjb25maW5lbWVudCA9IGJ1c19hcHBhcm1vcl9jb25maW5lbWVudF9uZXcgKGxhYmVsLCBtb2RlKTsKKyAgaWYgKGNvbmZpbmVtZW50ID09IE5VTEwpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGZyZWUgKGxhYmVsKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICByZXR1cm4gY29uZmluZW1lbnQ7CisjZWxzZQorICByZXR1cm4gTlVMTDsKKyNlbmRpZiAvKiBIQVZFX0FQUEFSTU9SICovCit9CisKKy8qKgorICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBjb25uZWN0aW9uIGNhbiBhY3F1aXJlIGEgc2VydmljZSwKKyAqIHVzaW5nIHRoZSB0YXNrcyBzZWN1cml0eSBjb250ZXh0CisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gY29ubmVjdGlvbiB0aGF0IHdhbnRzIHRvIG93biB0aGUgc2VydmljZQorICogQHBhcmFtIGJ1c3R5cGUgbmFtZSBvZiB0aGUgYnVzCisgKiBAcGFyYW0gc2VydmljZV9uYW1lIHRoZSBuYW1lIG9mIHRoZSBzZXJ2aWNlIHRvIGFjcXVpcmUKKyAqIEBwYXJhbSBlcnJvciB0aGUgcmVhc29uIGZvciBmYWlsdXJlIHdoZW4gRkFMU0UgaXMgcmV0dXJuZWQKKyAqIEByZXR1cm5zIFRSVUUgaWYgYWNxdWlyZSBpcyBwZXJtaXR0ZWQKKyAqLworZGJ1c19ib29sX3QKK2J1c19hcHBhcm1vcl9hbGxvd3NfYWNxdWlyZV9zZXJ2aWNlIChEQnVzQ29ubmVjdGlvbiAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgICpidXN0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICAqc2VydmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICAqZXJyb3IpCit7CisKKyNpZmRlZiBIQVZFX0FQUEFSTU9SCisgIEJ1c0FwcEFybW9yQ29uZmluZW1lbnQgKmNvbiA9IE5VTEw7CisgIERCdXNTdHJpbmcgcXN0ciwgYXV4ZGF0YTsKKyAgZGJ1c19ib29sX3QgZnJlZV9hdXhkYXRhID0gRkFMU0U7CisgIC8qIHRoZSBBcHBBcm1vciBBUEkgdXNlcyBwb2ludGVycyB0byBpbnQgZm9yIHBvaW50ZXJzIHRvIGJvb2xlYW4sIGFuZAorICAgKiBpbnQgaXMgbm90IHN0cmljdGx5IGd1YXJhbnRlZWQgdG8gYmUgdGhlIHNhbWUgYXMgZGJ1c19ib29sX3QgKi8KKyAgaW50IGFsbG93ID0gRkFMU0UsIGF1ZGl0ID0gVFJVRTsKKyAgdW5zaWduZWQgbG9uZyBwaWQ7CisgIGludCByZXMsIHNlcnJubyA9IDA7CisKKyAgaWYgKCFhcHBhcm1vcl9lbmFibGVkKQorICAgIHJldHVybiBUUlVFOworCisgIF9kYnVzX2Fzc2VydCAoY29ubmVjdGlvbiAhPSBOVUxMKTsKKworICBjb24gPSBidXNfY29ubmVjdGlvbl9kdXBfYXBwYXJtb3JfY29uZmluZW1lbnQgKGNvbm5lY3Rpb24pOworCisgIGlmIChpc191bmNvbmZpbmVkIChjb24tPmxhYmVsLCBjb24tPm1vZGUpKQorICAgIHsKKyAgICAgIGFsbG93ID0gVFJVRTsKKyAgICAgIGF1ZGl0ID0gRkFMU0U7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnFzdHIpKQorICAgIGdvdG8gb29tOworCisgIGlmICghYnVpbGRfc2VydmljZV9xdWVyeSAoJnFzdHIsIGNvbi0+bGFiZWwsIGJ1c3R5cGUsIHNlcnZpY2VfbmFtZSkpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZxc3RyKTsKKyAgICAgIGdvdG8gb29tOworICAgIH0KKworICByZXMgPSBhYV9xdWVyeV9sYWJlbCAoQUFfREJVU19CSU5ELAorICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9kYXRhICgmcXN0ciksCisgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnFzdHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgJmFsbG93LCAmYXVkaXQpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnFzdHIpOworICBpZiAocmVzID09IC0xKQorICAgIHsKKyAgICAgIHNlcnJubyA9IGVycm5vOworICAgICAgc2V0X2Vycm9yX2Zyb21fcXVlcnlfZXJybm8gKGVycm9yLCBzZXJybm8pOworICAgICAgZ290byBhdWRpdDsKKyAgICB9CisKKyAgLyogRG9uJ3QgZmFpbCBvcGVyYXRpb25zIG9uIHByb2ZpbGVzIGluIGNvbXBsYWluIG1vZGUgKi8KKyAgaWYgKG1vZGVzdHJfaXNfY29tcGxhaW4gKGNvbi0+bW9kZSkpCisgICAgICBhbGxvdyA9IFRSVUU7CisKKyAgaWYgKCFhbGxvdykKKyAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfQUNDRVNTX0RFTklFRCwKKyAgICAgICAgICAgICAgICAgICAgIkNvbm5lY3Rpb24gXCIlc1wiIGlzIG5vdCBhbGxvd2VkIHRvIG93biB0aGUgc2VydmljZSAiCisgICAgICAgICAgICAgICAgICAgICJcIiVzXCIgZHVlIHRvIEFwcEFybW9yIHBvbGljeSIsCisgICAgICAgICAgICAgICAgICAgIGJ1c19jb25uZWN0aW9uX2lzX2FjdGl2ZSAoY29ubmVjdGlvbikgPworICAgICAgICAgICAgICAgICAgICAgYnVzX2Nvbm5lY3Rpb25fZ2V0X25hbWUgKGNvbm5lY3Rpb24pIDogIihpbmFjdGl2ZSkiLAorICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlX25hbWUpOworCisgIGlmICghYXVkaXQpCisgICAgZ290byBvdXQ7CisKKyBhdWRpdDoKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmF1eGRhdGEpKQorICAgIGdvdG8gb29tOworICBmcmVlX2F1eGRhdGEgPSBUUlVFOworCisgIGlmICghX2RidXNfYXBwZW5kX3BhaXJfc3RyICgmYXV4ZGF0YSwgImJ1cyIsIGJ1c3R5cGUgPyBidXN0eXBlIDogInVua25vd24iKSkKKyAgICBnb3RvIG9vbTsKKworICBpZiAoIV9kYnVzX2FwcGVuZF9wYWlyX3N0ciAoJmF1eGRhdGEsICJuYW1lIiwgc2VydmljZV9uYW1lKSkKKyAgICBnb3RvIG9vbTsKKworICBpZiAoc2Vycm5vICYmICFfZGJ1c19hcHBlbmRfcGFpcl9zdHIgKCZhdXhkYXRhLCAiaW5mbyIsIHN0cmVycm9yIChzZXJybm8pKSkKKyAgICBnb3RvIG9vbTsKKworICBpZiAoIV9kYnVzX2FwcGVuZF9tYXNrICgmYXV4ZGF0YSwgQUFfREJVU19CSU5EKSkKKyAgICBnb3RvIG9vbTsKKworICBpZiAoY29ubmVjdGlvbiAmJiBkYnVzX2Nvbm5lY3Rpb25fZ2V0X3VuaXhfcHJvY2Vzc19pZCAoY29ubmVjdGlvbiwgJnBpZCkgJiYKKyAgICAgICFfZGJ1c19hcHBlbmRfcGFpcl91aW50ICgmYXV4ZGF0YSwgInBpZCIsIHBpZCkpCisgICAgZ290byBvb207CisKKyAgaWYgKGNvbi0+bGFiZWwgJiYgIV9kYnVzX2FwcGVuZF9wYWlyX3N0ciAoJmF1eGRhdGEsICJsYWJlbCIsIGNvbi0+bGFiZWwpKQorICAgIGdvdG8gb29tOworCisgIGxvZ19tZXNzYWdlIChhbGxvdywgImJpbmQiLCAmYXV4ZGF0YSk7CisKKyBvdXQ6CisgIGlmIChjb24gIT0gTlVMTCkKKyAgICBidXNfYXBwYXJtb3JfY29uZmluZW1lbnRfdW5yZWYgKGNvbik7CisgIGlmIChmcmVlX2F1eGRhdGEpCisgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZhdXhkYXRhKTsKKyAgcmV0dXJuIGFsbG93OworCisgb29tOgorICBpZiAoZXJyb3IgIT0gTlVMTCAmJiAhZGJ1c19lcnJvcl9pc19zZXQgKGVycm9yKSkKKyAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICBhbGxvdyA9IEZBTFNFOworICBnb3RvIG91dDsKKworI2Vsc2UKKyAgcmV0dXJuIFRSVUU7CisjZW5kaWYgLyogSEFWRV9BUFBBUk1PUiAqLworfQorCisvKioKKyAqIENoZWNrIGlmIEFwcGFybW9yIHNlY3VyaXR5IGNvbnRyb2xzIGFsbG93IHRoZSBtZXNzYWdlIHRvIGJlIHNlbnQgdG8gYQorICogcGFydGljdWxhciBjb25uZWN0aW9uIGJhc2VkIG9uIHRoZSBzZWN1cml0eSBjb250ZXh0IG9mIHRoZSBzZW5kZXIgYW5kCisgKiB0aGF0IG9mIHRoZSByZWNlaXZlci4gVGhlIGRlc3RpbmF0aW9uIGNvbm5lY3Rpb24gbmVlZCBub3QgYmUgdGhlCisgKiBhZGRyZXNzZWQgcmVjaXBpZW50LCBpdCBjb3VsZCBiZSBhbiAiZWF2ZXNkcm9wcGVyIgorICoKKyAqIEBwYXJhbSBzZW5kZXIgdGhlIHNlbmRlciBvZiB0aGUgbWVzc2FnZS4KKyAqIEBwYXJhbSBwcm9wb3NlZF9yZWNpcGllbnQgdGhlIGNvbm5lY3Rpb24gdGhlIG1lc3NhZ2UgaXMgdG8gYmUgc2VudCB0by4KKyAqIEBwYXJhbSByZXF1ZXN0ZWRfcmVwbHkgVFJVRSBpZiB0aGUgbWVzc2FnZSBpcyBhIHJlcGx5IHJlcXVlc3RlZCBieQorICogICAgICAgICAgICAgICAgICAgICAgICBwcm9wb3NlZF9yZWNpcGllbnQKKyAqIEBwYXJhbSBidXN0eXBlIG5hbWUgb2YgdGhlIGJ1cworICogQHBhcmFtIG1zZ3R5cGUgbWVzc2FnZSB0eXBlIChEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfQ0FMTCwgZXRjLikKKyAqIEBwYXJhbSBwYXRoIG9iamVjdCBwYXRoIHRoZSBtZXNzYWdlIHNob3VsZCBiZSBzZW50IHRvCisgKiBAcGFyYW0gaW50ZXJmYWNlIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QgaW5zdGFuY2UKKyAqIEBwYXJhbSBtZW1iZXIgdGhlIG1lbWJlciBvZiB0aGUgb2JqZWN0CisgKiBAcGFyYW0gZXJyb3JfbmFtZSB0aGUgbmFtZSBvZiB0aGUgZXJyb3IgaWYgdGhlIG1lc3NhZ2UgdHlwZSBpcyBlcnJvcgorICogQHBhcmFtIGRlc3RpbmF0aW9uIG5hbWUgdGhhdCB0aGUgbWVzc2FnZSBzaG91bGQgYmUgc2VudCB0bworICogQHBhcmFtIHNvdXJjZSBuYW1lIHRoYXQgdGhlIG1lc3NhZ2Ugc2hvdWxkIGJlIHNlbnQgZnJvbQorICogQHBhcmFtIGVycm9yIHRoZSByZWFzb24gZm9yIGZhaWx1cmUgd2hlbiBGQUxTRSBpcyByZXR1cm5lZAorICogQHJldHVybnMgVFJVRSBpZiB0aGUgbWVzc2FnZSBpcyBwZXJtaXR0ZWQKKyAqLworZGJ1c19ib29sX3QKK2J1c19hcHBhcm1vcl9hbGxvd3Nfc2VuZCAoREJ1c0Nvbm5lY3Rpb24gICAgICpzZW5kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICAgICAqcHJvcG9zZWRfcmVjaXBpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICAgIHJlcXVlc3RlZF9yZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgICpidXN0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgIG1zZ3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICAqcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgICppbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICAqbWVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAgKmVycm9yX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICAqZGVzdGluYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICAqc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNBY3RpdmF0aW9uRW50cnkgKmFjdGl2YXRpb25fZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICAqZXJyb3IpCit7CisjaWZkZWYgSEFWRV9BUFBBUk1PUgorICBCdXNBcHBBcm1vckNvbmZpbmVtZW50ICpzcmNfY29uID0gTlVMTCwgKmRzdF9jb24gPSBOVUxMOworICBEQnVzU3RyaW5nIHFzdHIsIGF1eGRhdGE7CisgIGludCBzcmNfYWxsb3cgPSBGQUxTRSwgZHN0X2FsbG93ID0gRkFMU0U7CisgIGludCBzcmNfYXVkaXQgPSBUUlVFLCBkc3RfYXVkaXQgPSBUUlVFOworICBkYnVzX2Jvb2xfdCBmcmVlX2F1eGRhdGEgPSBGQUxTRTsKKyAgdW5zaWduZWQgbG9uZyBwaWQ7CisgIGludCBsZW4sIHJlcywgc3JjX2Vycm5vID0gMCwgZHN0X2Vycm5vID0gMDsKKyAgdWludDMyX3Qgc3JjX3Blcm0gPSBBQV9EQlVTX1NFTkQsIGRzdF9wZXJtID0gQUFfREJVU19SRUNFSVZFOworICBjb25zdCBjaGFyICptc2d0eXBlc3RyID0gZGJ1c19tZXNzYWdlX3R5cGVfdG9fc3RyaW5nKG1zZ3R5cGUpOworICBjb25zdCBjaGFyICpkc3RfbGFiZWwgPSBOVUxMOworICBjb25zdCBjaGFyICpkc3RfbW9kZSA9IE5VTEw7CisKKyAgaWYgKCFhcHBhcm1vcl9lbmFibGVkKQorICAgIHJldHVybiBUUlVFOworCisgIF9kYnVzX2Fzc2VydCAoc2VuZGVyICE9IE5VTEwpOworCisgIHNyY19jb24gPSBidXNfY29ubmVjdGlvbl9kdXBfYXBwYXJtb3JfY29uZmluZW1lbnQgKHNlbmRlcik7CisKKyAgaWYgKHByb3Bvc2VkX3JlY2lwaWVudCkKKyAgICB7CisgICAgICBkc3RfY29uID0gYnVzX2Nvbm5lY3Rpb25fZHVwX2FwcGFybW9yX2NvbmZpbmVtZW50IChwcm9wb3NlZF9yZWNpcGllbnQpOworICAgIH0KKyAgZWxzZSBpZiAoYWN0aXZhdGlvbl9lbnRyeSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGRzdF9sYWJlbCA9IGJ1c19hY3RpdmF0aW9uX2VudHJ5X2dldF9hc3N1bWVkX2FwcGFybW9yX2xhYmVsIChhY3RpdmF0aW9uX2VudHJ5KTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBkc3RfY29uID0gYnVzX2NvbjsKKyAgICAgIGJ1c19hcHBhcm1vcl9jb25maW5lbWVudF9yZWYgKGRzdF9jb24pOworICAgIH0KKworICBpZiAoZHN0X2NvbiAhPSBOVUxMKQorICAgIHsKKyAgICAgIGRzdF9sYWJlbCA9IGRzdF9jb24tPmxhYmVsOworICAgICAgZHN0X21vZGUgPSBkc3RfY29uLT5tb2RlOworICAgIH0KKworICAvKiBtYXAgcmVwbHkgbWVzc2FnZXMgdG8gaW5pdGlhbCBzZW5kIGFuZCByZWNlaXZlIHBlcm1pc3Npb24uIFRoYXQgaXMKKyAgICogcGVybWlzc2lvbiB0byByZWNlaXZlIGEgbWVzc2FnZSBmcm9tIFggZ3JhbnRzIHBlcm1pc3Npb24gdG8gcmVwbHkgdG8gWC4KKyAgICogQW5kIHBlcm1pc3Npb24gdG8gc2VuZCBhIG1lc3NhZ2UgdG8gWSBncmFudHMgcGVybWlzc2lvbiB0byByZWNlaXZlIGEgcmVwbHkKKyAgICogZnJvbSBZLiBOb3RlIHRoYXQgdGhpcyBvbmx5IGFwcGxpZXMgdG8gcmVxdWVzdGVkIHJlcGxpZXMuIFVucmVxdWVzdGVkCisgICAqIHJlcGxpZXMgc3RpbGwgcmVxdWlyZSBhIHBvbGljeSBxdWVyeS4KKyAgICovCisgIGlmIChyZXF1ZXN0ZWRfcmVwbHkpCisgICAgeworICAgICAgLyogaWdub3JlIHJlcXVlc3RlZCByZXBseSBtZXNzYWdlcyBhbmQgbGV0IGRidXMgcmVwbHkgbWFwcGluZyBoYW5kbGUgdGhlbQorICAgICAgICogYXMgdGhlIHNlbmQgd2FzIGFscmVhZHkgYWxsb3dlZAorICAgICAgICovCisgICAgICBzcmNfYWxsb3cgPSBUUlVFOworICAgICAgZHN0X2FsbG93ID0gVFJVRTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAoaXNfdW5jb25maW5lZCAoc3JjX2Nvbi0+bGFiZWwsIHNyY19jb24tPm1vZGUpKQorICAgIHsKKyAgICAgIHNyY19hbGxvdyA9IFRSVUU7CisgICAgICBzcmNfYXVkaXQgPSBGQUxTRTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmcXN0cikpCisgICAgICAgIGdvdG8gb29tOworCisgICAgICBpZiAoIWJ1aWxkX21lc3NhZ2VfcXVlcnkgKCZxc3RyLCBzcmNfY29uLT5sYWJlbCwgYnVzdHlwZSwgZGVzdGluYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9sYWJlbCwgcGF0aCwgaW50ZXJmYWNlLCBtZW1iZXIpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZxc3RyKTsKKyAgICAgICAgICBnb3RvIG9vbTsKKyAgICAgICAgfQorCisgICAgICByZXMgPSBhYV9xdWVyeV9sYWJlbCAoc3JjX3Blcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9kYXRhICgmcXN0ciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZxc3RyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3JjX2FsbG93LCAmc3JjX2F1ZGl0KTsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmcXN0cik7CisgICAgICBpZiAocmVzID09IC0xKQorICAgICAgICB7CisgICAgICAgICAgc3JjX2Vycm5vID0gZXJybm87CisgICAgICAgICAgc2V0X2Vycm9yX2Zyb21fcXVlcnlfZXJybm8gKGVycm9yLCBzcmNfZXJybm8pOworICAgICAgICAgIGdvdG8gYXVkaXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgLyogV2hlbiBkZWNpZGluZyB3aGV0aGVyIHdlIGNhbiBhY3RpdmF0ZSBhIHNlcnZpY2UsIHdlIG9ubHkgY2hlY2sgdGhhdAorICAgKiB3ZSBhcmUgYWxsb3dlZCB0byBzZW5kIGEgbWVzc2FnZSB0byBpdCwgbm90IHRoYXQgaXQgaXMgYWxsb3dlZCB0bworICAgKiByZWNlaXZlIHRoYXQgbWVzc2FnZSBmcm9tIHVzLgorICAgKi8KKyAgaWYgKGFjdGl2YXRpb25fZW50cnkgIT0gTlVMTCB8fCBpc191bmNvbmZpbmVkIChkc3RfbGFiZWwsIGRzdF9tb2RlKSkKKyAgICB7CisgICAgICBkc3RfYWxsb3cgPSBUUlVFOworICAgICAgZHN0X2F1ZGl0ID0gRkFMU0U7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnFzdHIpKQorICAgICAgICBnb3RvIG9vbTsKKworICAgICAgaWYgKCFidWlsZF9tZXNzYWdlX3F1ZXJ5ICgmcXN0ciwgZHN0X2xhYmVsLCBidXN0eXBlLCBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19jb24tPmxhYmVsLCBwYXRoLCBpbnRlcmZhY2UsIG1lbWJlcikpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnFzdHIpOworICAgICAgICAgIGdvdG8gb29tOworICAgICAgICB9CisKKyAgICAgIHJlcyA9IGFhX3F1ZXJ5X2xhYmVsIChkc3RfcGVybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2RhdGEgKCZxc3RyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnFzdHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkc3RfYWxsb3csICZkc3RfYXVkaXQpOworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZxc3RyKTsKKyAgICAgIGlmIChyZXMgPT0gLTEpCisgICAgICAgIHsKKyAgICAgICAgICBkc3RfZXJybm8gPSBlcnJubzsKKyAgICAgICAgICBzZXRfZXJyb3JfZnJvbV9xdWVyeV9lcnJubyAoZXJyb3IsIGRzdF9lcnJubyk7CisgICAgICAgICAgZ290byBhdWRpdDsKKyAgICAgICAgfQorICAgIH0KKworICAvKiBEb24ndCBmYWlsIG9wZXJhdGlvbnMgb24gcHJvZmlsZXMgaW4gY29tcGxhaW4gbW9kZSAqLworICBpZiAobW9kZXN0cl9pc19jb21wbGFpbiAoc3JjX2Nvbi0+bW9kZSkpCisgICAgc3JjX2FsbG93ID0gVFJVRTsKKyAgaWYgKG1vZGVzdHJfaXNfY29tcGxhaW4gKGRzdF9tb2RlKSkKKyAgICBkc3RfYWxsb3cgPSBUUlVFOworCisgIGlmICghc3JjX2FsbG93IHx8ICFkc3RfYWxsb3cpCisgICAgc2V0X2Vycm9yX2Zyb21fZGVuaWVkX21lc3NhZ2UgKGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3Bvc2VkX3JlY2lwaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkX3JlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2d0eXBlc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb24pOworCisgIC8qIERvbid0IGF1ZGl0IHRoZSBtZXNzYWdlIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZToKKyAgICogICAxKSBUaGUgQXBwQXJtb3IgcXVlcnkgaW5kaWNhdGVzIHRoYXQgYXVkaXRpbmcgc2hvdWxkIG5vdCBoYXBwZW4uCisgICAqICAgMikgVGhlIG1lc3NhZ2UgaXMgYSByZXBseSB0eXBlLiBSZXBseSBtZXNzYWdlIGFyZSBub3QgYXVkaXRlZCBiZWNhdXNlCisgICAqICAgICAgdGhlIEFwcEFybW9yIHBvbGljeSBsYW5ndWFnZSBkb2VzIG5vdCBoYXZlIHRoZSBub3Rpb24gb2YgYSByZXBseQorICAgKiAgICAgIG1lc3NhZ2UuIFVucmVxdWVzdGVkIHJlcGxpZXMgd2lsbCBiZSBzaWxlbnRseSBkaXNjYXJkZWQgaWYgdGhlIHNlbmRlcgorICAgKiAgICAgIGRvZXMgbm90IGhhdmUgcGVybWlzc2lvbiB0byBzZW5kIHRvIHRoZSByZWNlaXZlciBvciBpZiB0aGUgcmVjZWl2ZXIKKyAgICogICAgICBkb2VzIG5vdCBoYXZlIHBlcm1pc3Npb24gdG8gcmVjZWl2ZSBmcm9tIHRoZSBzZW5kZXIuCisgICAqLworICBpZiAoKCFzcmNfYXVkaXQgJiYgIWRzdF9hdWRpdCkgfHwKKyAgICAgIChtc2d0eXBlID09IERCVVNfTUVTU0FHRV9UWVBFX01FVEhPRF9SRVRVUk4gfHwKKyAgICAgICBtc2d0eXBlID09IERCVVNfTUVTU0FHRV9UWVBFX0VSUk9SKSkKKyAgICBnb3RvIG91dDsKKworIGF1ZGl0OgorICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmYXV4ZGF0YSkpCisgICAgZ290byBvb207CisgIGZyZWVfYXV4ZGF0YSA9IFRSVUU7CisKKyAgaWYgKCFfZGJ1c19hcHBlbmRfcGFpcl9zdHIgKCZhdXhkYXRhLCAiYnVzIiwgYnVzdHlwZSA/IGJ1c3R5cGUgOiAidW5rbm93biIpKQorICAgIGdvdG8gb29tOworCisgIGlmIChwYXRoICYmICFfZGJ1c19hcHBlbmRfcGFpcl9zdHIgKCZhdXhkYXRhLCAicGF0aCIsIHBhdGgpKQorICAgIGdvdG8gb29tOworCisgIGlmIChpbnRlcmZhY2UgJiYgIV9kYnVzX2FwcGVuZF9wYWlyX3N0ciAoJmF1eGRhdGEsICJpbnRlcmZhY2UiLCBpbnRlcmZhY2UpKQorICAgIGdvdG8gb29tOworCisgIGlmIChtZW1iZXIgJiYgIV9kYnVzX2FwcGVuZF9wYWlyX3N0ciAoJmF1eGRhdGEsICJtZW1iZXIiLCBtZW1iZXIpKQorICAgIGdvdG8gb29tOworCisgIGlmIChlcnJvcl9uYW1lICYmICFfZGJ1c19hcHBlbmRfcGFpcl9zdHIgKCZhdXhkYXRhLCAiZXJyb3JfbmFtZSIsIGVycm9yX25hbWUpKQorICAgIGdvdG8gb29tOworCisgIGxlbiA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmYXV4ZGF0YSk7CisKKyAgaWYgKHNyY19hdWRpdCkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX2FwcGVuZF9tYXNrICgmYXV4ZGF0YSwgc3JjX3Blcm0pKQorICAgICAgICBnb3RvIG9vbTsKKworICAgICAgaWYgKGRlc3RpbmF0aW9uICYmICFfZGJ1c19hcHBlbmRfcGFpcl9zdHIgKCZhdXhkYXRhLCAibmFtZSIsIGRlc3RpbmF0aW9uKSkKKyAgICAgICAgZ290byBvb207CisKKyAgICAgIGlmIChzZW5kZXIgJiYgZGJ1c19jb25uZWN0aW9uX2dldF91bml4X3Byb2Nlc3NfaWQgKHNlbmRlciwgJnBpZCkgJiYKKyAgICAgICAgICAhX2RidXNfYXBwZW5kX3BhaXJfdWludCAoJmF1eGRhdGEsICJwaWQiLCBwaWQpKQorICAgICAgICBnb3RvIG9vbTsKKworICAgICAgaWYgKHNyY19jb24tPmxhYmVsICYmCisgICAgICAgICAgIV9kYnVzX2FwcGVuZF9wYWlyX3N0ciAoJmF1eGRhdGEsICJsYWJlbCIsIHNyY19jb24tPmxhYmVsKSkKKyAgICAgICAgZ290byBvb207CisKKyAgICAgIGlmIChwcm9wb3NlZF9yZWNpcGllbnQgJiYKKyAgICAgICAgICBkYnVzX2Nvbm5lY3Rpb25fZ2V0X3VuaXhfcHJvY2Vzc19pZCAocHJvcG9zZWRfcmVjaXBpZW50LCAmcGlkKSAmJgorICAgICAgICAgICFfZGJ1c19hcHBlbmRfcGFpcl91aW50ICgmYXV4ZGF0YSwgInBlZXJfcGlkIiwgcGlkKSkKKyAgICAgICAgZ290byBvb207CisKKyAgICAgIGlmIChkc3RfbGFiZWwgJiYKKyAgICAgICAgICAhX2RidXNfYXBwZW5kX3BhaXJfc3RyICgmYXV4ZGF0YSwgInBlZXJfbGFiZWwiLCBkc3RfbGFiZWwpKQorICAgICAgICBnb3RvIG9vbTsKKworICAgICAgaWYgKHNyY19lcnJubyAmJiAhX2RidXNfYXBwZW5kX3BhaXJfc3RyICgmYXV4ZGF0YSwgImluZm8iLCBzdHJlcnJvciAoc3JjX2Vycm5vKSkpCisgICAgICAgIGdvdG8gb29tOworCisgICAgICBpZiAoZHN0X2Vycm5vICYmCisgICAgICAgICAgIV9kYnVzX2FwcGVuZF9wYWlyX3N0ciAoJmF1eGRhdGEsICJwZWVyX2luZm8iLCBzdHJlcnJvciAoZHN0X2Vycm5vKSkpCisgICAgICAgIGdvdG8gb29tOworCisgICAgICBsb2dfbWVzc2FnZSAoc3JjX2FsbG93LCBtc2d0eXBlc3RyLCAmYXV4ZGF0YSk7CisgICAgfQorICBpZiAoZHN0X2F1ZGl0KQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoICgmYXV4ZGF0YSwgbGVuKTsKKworICAgICAgaWYgKHNvdXJjZSAmJiAhX2RidXNfYXBwZW5kX3BhaXJfc3RyICgmYXV4ZGF0YSwgIm5hbWUiLCBzb3VyY2UpKQorICAgICAgICBnb3RvIG9vbTsKKworICAgICAgaWYgKCFfZGJ1c19hcHBlbmRfbWFzayAoJmF1eGRhdGEsIGRzdF9wZXJtKSkKKyAgICAgICAgZ290byBvb207CisKKyAgICAgIGlmIChwcm9wb3NlZF9yZWNpcGllbnQgJiYKKyAgICAgICAgICBkYnVzX2Nvbm5lY3Rpb25fZ2V0X3VuaXhfcHJvY2Vzc19pZCAocHJvcG9zZWRfcmVjaXBpZW50LCAmcGlkKSAmJgorICAgICAgICAgICFfZGJ1c19hcHBlbmRfcGFpcl91aW50ICgmYXV4ZGF0YSwgInBpZCIsIHBpZCkpCisgICAgICAgIGdvdG8gb29tOworCisgICAgICBpZiAoZHN0X2xhYmVsICYmCisgICAgICAgICAgIV9kYnVzX2FwcGVuZF9wYWlyX3N0ciAoJmF1eGRhdGEsICJsYWJlbCIsIGRzdF9sYWJlbCkpCisgICAgICAgIGdvdG8gb29tOworCisgICAgICBpZiAoc2VuZGVyICYmIGRidXNfY29ubmVjdGlvbl9nZXRfdW5peF9wcm9jZXNzX2lkIChzZW5kZXIsICZwaWQpICYmCisgICAgICAgICAgIV9kYnVzX2FwcGVuZF9wYWlyX3VpbnQgKCZhdXhkYXRhLCAicGVlcl9waWQiLCBwaWQpKQorICAgICAgICBnb3RvIG9vbTsKKworICAgICAgaWYgKHNyY19jb24tPmxhYmVsICYmCisgICAgICAgICAgIV9kYnVzX2FwcGVuZF9wYWlyX3N0ciAoJmF1eGRhdGEsICJwZWVyX2xhYmVsIiwgc3JjX2Nvbi0+bGFiZWwpKQorICAgICAgICBnb3RvIG9vbTsKKworICAgICAgaWYgKGRzdF9lcnJubyAmJiAhX2RidXNfYXBwZW5kX3BhaXJfc3RyICgmYXV4ZGF0YSwgImluZm8iLCBzdHJlcnJvciAoZHN0X2Vycm5vKSkpCisgICAgICAgIGdvdG8gb29tOworCisgICAgICBpZiAoc3JjX2Vycm5vICYmCisgICAgICAgICAgIV9kYnVzX2FwcGVuZF9wYWlyX3N0ciAoJmF1eGRhdGEsICJwZWVyX2luZm8iLCBzdHJlcnJvciAoc3JjX2Vycm5vKSkpCisgICAgICAgIGdvdG8gb29tOworCisgICAgICBsb2dfbWVzc2FnZSAoZHN0X2FsbG93LCBtc2d0eXBlc3RyLCAmYXV4ZGF0YSk7CisgICAgfQorCisgb3V0OgorICBpZiAoc3JjX2NvbiAhPSBOVUxMKQorICAgIGJ1c19hcHBhcm1vcl9jb25maW5lbWVudF91bnJlZiAoc3JjX2Nvbik7CisgIGlmIChkc3RfY29uICE9IE5VTEwpCisgICAgYnVzX2FwcGFybW9yX2NvbmZpbmVtZW50X3VucmVmIChkc3RfY29uKTsKKyAgaWYgKGZyZWVfYXV4ZGF0YSkKKyAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmF1eGRhdGEpOworCisgIHJldHVybiBzcmNfYWxsb3cgJiYgZHN0X2FsbG93OworCisgb29tOgorICBpZiAoZXJyb3IgIT0gTlVMTCAmJiAhZGJ1c19lcnJvcl9pc19zZXQgKGVycm9yKSkKKyAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICBzcmNfYWxsb3cgPSBGQUxTRTsKKyAgZHN0X2FsbG93ID0gRkFMU0U7CisgIGdvdG8gb3V0OworCisjZWxzZQorICByZXR1cm4gVFJVRTsKKyNlbmRpZiAvKiBIQVZFX0FQUEFSTU9SICovCit9CisKKy8qKgorICogQ2hlY2sgaWYgQXBwYXJtb3Igc2VjdXJpdHkgY29udHJvbHMgYWxsb3cgdGhlIGNvbm5lY3Rpb24gdG8gZWF2ZXNkcm9wIG9uCisgKiBvdGhlciBjb25uZWN0aW9ucy4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbiBhdHRlbXB0aW5nIHRvIGVhdmVzZHJvcC4KKyAqIEBwYXJhbSBidXN0eXBlIG5hbWUgb2YgdGhlIGJ1cworICogQHBhcmFtIGVycm9yIHRoZSByZWFzb24gZm9yIGZhaWx1cmUgd2hlbiBGQUxTRSBpcyByZXR1cm5lZAorICogQHJldHVybnMgVFJVRSBpZiBlYXZlc2Ryb3BwaW5nIGlzIHBlcm1pdHRlZAorICovCitkYnVzX2Jvb2xfdAorYnVzX2FwcGFybW9yX2FsbG93c19lYXZlc2Ryb3BwaW5nIChEQnVzQ29ubmVjdGlvbiAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICAqYnVzdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgICplcnJvcikKK3sKKyNpZmRlZiBIQVZFX0FQUEFSTU9SCisgIEJ1c0FwcEFybW9yQ29uZmluZW1lbnQgKmNvbiA9IE5VTEw7CisgIERCdXNTdHJpbmcgcXN0ciwgYXV4ZGF0YTsKKyAgaW50IGFsbG93ID0gRkFMU0UsIGF1ZGl0ID0gVFJVRTsKKyAgZGJ1c19ib29sX3QgZnJlZV9hdXhkYXRhID0gRkFMU0U7CisgIHVuc2lnbmVkIGxvbmcgcGlkOworICBpbnQgcmVzLCBzZXJybm8gPSAwOworCisgIGlmICghYXBwYXJtb3JfZW5hYmxlZCkKKyAgICByZXR1cm4gVFJVRTsKKworICBjb24gPSBidXNfY29ubmVjdGlvbl9kdXBfYXBwYXJtb3JfY29uZmluZW1lbnQgKGNvbm5lY3Rpb24pOworCisgIGlmIChpc191bmNvbmZpbmVkIChjb24tPmxhYmVsLCBjb24tPm1vZGUpKQorICAgIHsKKyAgICAgIGFsbG93ID0gVFJVRTsKKyAgICAgIGF1ZGl0ID0gRkFMU0U7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnFzdHIpKQorICAgIGdvdG8gb29tOworCisgIGlmICghYnVpbGRfZWF2ZXNkcm9wX3F1ZXJ5ICgmcXN0ciwgY29uLT5sYWJlbCwgYnVzdHlwZSkpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZxc3RyKTsKKyAgICAgIGdvdG8gb29tOworICAgIH0KKworICByZXMgPSBhYV9xdWVyeV9sYWJlbCAoQUFfREJVU19FQVZFU0RST1AsCisgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2RhdGEgKCZxc3RyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmcXN0ciksCisgICAgICAgICAgICAgICAgICAgICAgICAmYWxsb3csICZhdWRpdCk7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmcXN0cik7CisgIGlmIChyZXMgPT0gLTEpCisgICAgeworICAgICAgc2Vycm5vID0gZXJybm87CisgICAgICBzZXRfZXJyb3JfZnJvbV9xdWVyeV9lcnJubyAoZXJyb3IsIHNlcnJubyk7CisgICAgICBnb3RvIGF1ZGl0OworICAgIH0KKworICAvKiBEb24ndCBmYWlsIG9wZXJhdGlvbnMgb24gcHJvZmlsZXMgaW4gY29tcGxhaW4gbW9kZSAqLworICBpZiAobW9kZXN0cl9pc19jb21wbGFpbiAoY29uLT5tb2RlKSkKKyAgICBhbGxvdyA9IFRSVUU7CisKKyAgaWYgKCFhbGxvdykKKyAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfQUNDRVNTX0RFTklFRCwKKyAgICAgICAgICAgICAgICAgICAgIkNvbm5lY3Rpb24gXCIlc1wiIGlzIG5vdCBhbGxvd2VkIHRvIGVhdmVzZHJvcCBkdWUgdG8gIgorICAgICAgICAgICAgICAgICAgICAiQXBwQXJtb3IgcG9saWN5IiwKKyAgICAgICAgICAgICAgICAgICAgYnVzX2Nvbm5lY3Rpb25faXNfYWN0aXZlIChjb25uZWN0aW9uKSA/CisgICAgICAgICAgICAgICAgICAgIGJ1c19jb25uZWN0aW9uX2dldF9uYW1lIChjb25uZWN0aW9uKSA6ICIoaW5hY3RpdmUpIik7CisKKyAgaWYgKCFhdWRpdCkKKyAgICBnb3RvIG91dDsKKworIGF1ZGl0OgorICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmYXV4ZGF0YSkpCisgICAgZ290byBvb207CisgIGZyZWVfYXV4ZGF0YSA9IFRSVUU7CisKKyAgaWYgKCFfZGJ1c19hcHBlbmRfcGFpcl9zdHIgKCZhdXhkYXRhLCAiYnVzIiwgYnVzdHlwZSA/IGJ1c3R5cGUgOiAidW5rbm93biIpKQorICAgIGdvdG8gb29tOworCisgIGlmIChzZXJybm8gJiYgIV9kYnVzX2FwcGVuZF9wYWlyX3N0ciAoJmF1eGRhdGEsICJpbmZvIiwgc3RyZXJyb3IgKHNlcnJubykpKQorICAgIGdvdG8gb29tOworCisgIGlmICghX2RidXNfYXBwZW5kX3BhaXJfc3RyICgmYXV4ZGF0YSwgIm1hc2siLCAiZWF2ZXNkcm9wIikpCisgICAgZ290byBvb207CisKKyAgaWYgKGNvbm5lY3Rpb24gJiYgZGJ1c19jb25uZWN0aW9uX2dldF91bml4X3Byb2Nlc3NfaWQgKGNvbm5lY3Rpb24sICZwaWQpICYmCisgICAgICAhX2RidXNfYXBwZW5kX3BhaXJfdWludCAoJmF1eGRhdGEsICJwaWQiLCBwaWQpKQorICAgIGdvdG8gb29tOworCisgIGlmIChjb24tPmxhYmVsICYmICFfZGJ1c19hcHBlbmRfcGFpcl9zdHIgKCZhdXhkYXRhLCAibGFiZWwiLCBjb24tPmxhYmVsKSkKKyAgICBnb3RvIG9vbTsKKworICBsb2dfbWVzc2FnZSAoYWxsb3csICJlYXZlc2Ryb3AiLCAmYXV4ZGF0YSk7CisKKyBvdXQ6CisgIGlmIChjb24gIT0gTlVMTCkKKyAgICBidXNfYXBwYXJtb3JfY29uZmluZW1lbnRfdW5yZWYgKGNvbik7CisgIGlmIChmcmVlX2F1eGRhdGEpCisgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZhdXhkYXRhKTsKKworICByZXR1cm4gYWxsb3c7CisKKyBvb206CisgIGlmIChlcnJvciAhPSBOVUxMICYmICFkYnVzX2Vycm9yX2lzX3NldCAoZXJyb3IpKQorICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgIGFsbG93ID0gRkFMU0U7CisgIGdvdG8gb3V0OworCisjZWxzZQorICByZXR1cm4gVFJVRTsKKyNlbmRpZiAvKiBIQVZFX0FQUEFSTU9SICovCit9CmRpZmYgLS1naXQgYS9idXMvYXBwYXJtb3IuaCBiL2J1cy9hcHBhcm1vci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkNDY1ZjcKLS0tIC9kZXYvbnVsbAorKysgYi9idXMvYXBwYXJtb3IuaApAQCAtMCwwICsxLDY2IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0KKyAqIGFwcGFybW9yLmMgIEFwcEFybW9yIHNlY3VyaXR5IGNoZWNrcyBmb3IgRC1CdXMKKyAqCisgKiBBdXRob3JzOiBKb2huIEpvaGFuc2VuIDxqb2huLmpvaGFuc2VuQGNhbm9uaWNhbC5jb20+CisgKiAgICAgICAgICBUeWxlciBIaWNrcyA8dHloaWNrc0BjYW5vbmljYWwuY29tPgorICogQmFzZWQgb246IHNlbGludXguaCBieSBNYXR0aGV3IFJpY2thcmQKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBCVVNfQVBQQVJNT1JfSAorI2RlZmluZSBCVVNfQVBQQVJNT1JfSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLmg+CisjaW5jbHVkZSAiYnVzLmgiCisKK2RidXNfYm9vbF90IGJ1c19hcHBhcm1vcl9wcmVfaW5pdCAodm9pZCk7CitkYnVzX2Jvb2xfdCBidXNfYXBwYXJtb3Jfc2V0X21vZGVfZnJvbV9jb25maWcgKGNvbnN0IGNoYXIgKm1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAqZXJyb3IpOworZGJ1c19ib29sX3QgYnVzX2FwcGFybW9yX2Z1bGxfaW5pdCAoREJ1c0Vycm9yICplcnJvcik7Cit2b2lkIGJ1c19hcHBhcm1vcl9zaHV0ZG93biAodm9pZCk7CitkYnVzX2Jvb2xfdCBidXNfYXBwYXJtb3JfZW5hYmxlZCAodm9pZCk7CisKK3ZvaWQgYnVzX2FwcGFybW9yX2NvbmZpbmVtZW50X3VucmVmIChCdXNBcHBBcm1vckNvbmZpbmVtZW50ICpjb25maW5lbWVudCk7Cit2b2lkIGJ1c19hcHBhcm1vcl9jb25maW5lbWVudF9yZWYgKEJ1c0FwcEFybW9yQ29uZmluZW1lbnQgKmNvbmZpbmVtZW50KTsKK0J1c0FwcEFybW9yQ29uZmluZW1lbnQqIGJ1c19hcHBhcm1vcl9pbml0X2Nvbm5lY3Rpb25fY29uZmluZW1lbnQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKTsKKworZGJ1c19ib29sX3QgYnVzX2FwcGFybW9yX2FsbG93c19hY3F1aXJlX3NlcnZpY2UgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpidXN0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpzZXJ2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKTsKK2RidXNfYm9vbF90IGJ1c19hcHBhcm1vcl9hbGxvd3Nfc2VuZCAoREJ1c0Nvbm5lY3Rpb24gICAgICpzZW5kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICAgICAqcHJvcG9zZWRfcmVjaXBpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICAgIHJlcXVlc3RlZF9yZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgICpidXN0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgIG1zZ3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICAqcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgICppbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICAqbWVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAgKmVycm9yX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICAqZGVzdGluYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICAqc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNBY3RpdmF0aW9uRW50cnkgKmFjdGl2YXRpb25fZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICAqZXJyb3IpOworCitkYnVzX2Jvb2xfdCBidXNfYXBwYXJtb3JfYWxsb3dzX2VhdmVzZHJvcHBpbmcgKERCdXNDb25uZWN0aW9uICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgICpidXN0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAgKmVycm9yKTsKKworI2VuZGlmIC8qIEJVU19BUFBBUk1PUl9IICovCmRpZmYgLS1naXQgYS9idXMvYXVkaXQuYyBiL2J1cy9hdWRpdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxZjJjNWMKLS0tIC9kZXYvbnVsbAorKysgYi9idXMvYXVkaXQuYwpAQCAtMCwwICsxLDE5MCBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotCisgKiBhdWRpdC5jIC0gbGliYXVkaXQgaW50ZWdyYXRpb24gZm9yIFNFTGludXggYW5kIEFwcEFybW9yCisgKgorICogQmFzZWQgb24gYXBwYXJtb3IuYywgc2VsaW51eC5jCisgKgorICogQ29weXJpZ2h0IMKpIDIwMTQtMjAxNSBDYW5vbmljYWwsIEx0ZC4KKyAqIENvcHlyaWdodCDCqSAyMDE1IENvbGxhYm9yYSBMdGQuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiYXVkaXQuaCIKKworI2lmZGVmIEhBVkVfRVJSTk9fSAorI2luY2x1ZGUgPGVycm5vLmg+CisjZW5kaWYKKworI2lmZGVmIEhBVkVfTElCQVVESVQKKyNpbmNsdWRlIDxjYXAtbmcuaD4KKyNpbmNsdWRlIDxsaWJhdWRpdC5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxkYnVzL2RidXMtaW50ZXJuYWxzLmg+CisjaWZkZWYgREJVU19VTklYCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXVzZXJkYi5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX0xJQkFVRElUCitzdGF0aWMgaW50IGF1ZGl0X2ZkID0gLTE7CisjZW5kaWYKKworLyoqCisgKiBPcGVuIHRoZSBsaWJhdWRpdCBmZCBpZiBhcHByb3ByaWF0ZS4KKyAqLwordm9pZAorYnVzX2F1ZGl0X2luaXQgKEJ1c0NvbnRleHQgKmNvbnRleHQpCit7CisjaWZkZWYgSEFWRV9MSUJBVURJVAorICBpbnQgaTsKKworICBjYXBuZ19nZXRfY2Fwc19wcm9jZXNzICgpOworCisgIC8qIFdvcmsgYXJvdW5kIGEgYnVnIGluIGxpYmNhcC1uZyA8IDAuNy43OiBpdCBsZWFrcyBhIGZkLCB3aGljaCBpc24ndAorICAgKiBjbG9zZS1vbi1leGVjLiBBc3N1bWUgaXQgd2lsbCBiZSBvbmUgb2YgdGhlIGZpcnN0IGZldyBmZHMuICovCisgIGZvciAoaSA9IDM7IGkgPCA0MjsgaSsrKQorICAgIF9kYnVzX2ZkX3NldF9jbG9zZV9vbl9leGVjIChpKTsKKworICBpZiAoIWNhcG5nX2hhdmVfY2FwYWJpbGl0eSAoQ0FQTkdfRUZGRUNUSVZFLCBDQVBfQVVESVRfV1JJVEUpKQorICAgIHJldHVybjsKKworICBhdWRpdF9mZCA9IGF1ZGl0X29wZW4gKCk7CisKKyAgaWYgKGF1ZGl0X2ZkIDwgMCkKKyAgICB7CisgICAgICBpbnQgZSA9IGVycm5vOworCisgICAgICAvKiBJZiBrZXJuZWwgZG9lc24ndCBzdXBwb3J0IGF1ZGl0LCBiYWlsIG91dCAqLworICAgICAgaWYgKGUgPT0gRUlOVkFMIHx8IGUgPT0gRVBST1RPTk9TVVBQT1JUIHx8IGUgPT0gRUFGTk9TVVBQT1JUKQorICAgICAgICByZXR1cm47CisKKyAgICAgIGJ1c19jb250ZXh0X2xvZyAoY29udGV4dCwgREJVU19TWVNURU1fTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gb3BlbiBjb25uZWN0aW9uIHRvIHRoZSBhdWRpdCBzdWJzeXN0ZW06ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKGUpKTsKKyAgICB9CisjZW5kaWYgLyogSEFWRV9MSUJBVURJVCAqLworfQorCisvKioKKyAqIElmIGxpYmF1ZGl0IGlzIGluIHVzZSBhbmQgaXQgd291bGQgYmUgYXBwcm9wcmlhdGUgdG8gd3JpdGUgYXVkaXQgcmVjb3JkcywKKyAqIHJldHVybiB0aGUgbGliYXVkaXQgZmQuIE90aGVyd2lzZSByZXR1cm4gLTEuCisgKi8KK2ludAorYnVzX2F1ZGl0X2dldF9mZCAodm9pZCkKK3sKKyNpZmRlZiBIQVZFX0xJQkFVRElUCisgIGlmIChhdWRpdF9mZCA+PSAwKQorICB7CisgICAgcmV0dXJuIGF1ZGl0X2ZkOworICB9CisjZW5kaWYKKworICByZXR1cm4gLTE7Cit9CisKKy8qKgorICogQ2xvc2UgdGhlIGxpYmF1ZGl0IGZkLgorICovCit2b2lkCitidXNfYXVkaXRfc2h1dGRvd24gKHZvaWQpCit7CisjaWZkZWYgSEFWRV9MSUJBVURJVAorICBhdWRpdF9jbG9zZSAoYXVkaXRfZmQpOworI2VuZGlmIC8qIEhBVkVfTElCQVVESVQgKi8KK30KKworLyogVGhlICFIQVZFX0xJQkFVRElUIGNhc2UgbGl2ZXMgaW4gZGJ1cy1zeXNkZXBzLXV0aWwtdW5peC5jICovCisjaWZkZWYgSEFWRV9MSUJBVURJVAorLyoqCisgKiBDaGFuZ2VzIHRoZSB1c2VyIGFuZCBncm91cCB0aGUgYnVzIGlzIHJ1bm5pbmcgYXMuCisgKgorICogQHBhcmFtIHVzZXIgdGhlIHVzZXIgdG8gYmVjb21lCisgKiBAcGFyYW0gZXJyb3IgcmV0dXJuIGxvY2F0aW9uIGZvciBlcnJvcnMKKyAqIEByZXR1cm5zICNGQUxTRSBvbiBmYWlsdXJlCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19jaGFuZ2VfdG9fZGFlbW9uX3VzZXIgIChjb25zdCBjaGFyICAgICp1c2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAqZXJyb3IpCit7CisgIGRidXNfdWlkX3QgdWlkOworICBkYnVzX2dpZF90IGdpZDsKKyAgREJ1c1N0cmluZyB1OworCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmdSwgdXNlcik7CisKKyAgaWYgKCFfZGJ1c19nZXRfdXNlcl9pZF9hbmRfcHJpbWFyeV9ncm91cCAoJnUsICZ1aWQsICZnaWQpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgIlVzZXIgJyVzJyBkb2VzIG5vdCBhcHBlYXIgdG8gZXhpc3Q/IiwKKyAgICAgICAgICAgICAgICAgICAgICB1c2VyKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgLyogSWYgd2Ugd2VyZSByb290ICovCisgIGlmIChfZGJ1c19nZXRldWlkICgpID09IDApCisgICAgeworICAgICAgaW50IHJjOworICAgICAgaW50IGhhdmVfYXVkaXRfd3JpdGU7CisKKyAgICAgIGhhdmVfYXVkaXRfd3JpdGUgPSBjYXBuZ19oYXZlX2NhcGFiaWxpdHkgKENBUE5HX1BFUk1JVFRFRCwgQ0FQX0FVRElUX1dSSVRFKTsKKyAgICAgIGNhcG5nX2NsZWFyIChDQVBOR19TRUxFQ1RfQk9USCk7CisgICAgICAvKiBPbmx5IGF0dGVtcHQgdG8gcmV0YWluIENBUF9BVURJVF9XUklURSBpZiB3ZSBoYWQgaXQgd2hlbgorICAgICAgICogc3RhcnRpbmcuICBTZWU6CisgICAgICAgKiBodHRwczovL2J1Z3MuZnJlZWRlc2t0b3Aub3JnL3Nob3dfYnVnLmNnaT9pZD00OTA2MiNjOQorICAgICAgICovCisgICAgICBpZiAoaGF2ZV9hdWRpdF93cml0ZSkKKyAgICAgICAgY2FwbmdfdXBkYXRlIChDQVBOR19BREQsIENBUE5HX0VGRkVDVElWRSB8IENBUE5HX1BFUk1JVFRFRCwKKyAgICAgICAgICAgICAgICAgICAgICBDQVBfQVVESVRfV1JJVEUpOworICAgICAgcmMgPSBjYXBuZ19jaGFuZ2VfaWQgKHVpZCwgZ2lkLCBDQVBOR19EUk9QX1NVUFBfR1JQKTsKKyAgICAgIGlmIChyYykKKyAgICAgICAgeworICAgICAgICAgIHN3aXRjaCAocmMpIHsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGRyb3AgY2FwYWJpbGl0aWVzOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgLTQ6CisgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBzZXQgR0lEIHRvICVsdTogJXMiLCBnaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIC01OgorICAgICAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZHJvcCBzdXBwbGVtZW50YXJ5IGdyb3VwczogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAtNjoKKyAgICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHNldCBVSUQgdG8gJWx1OiAlcyIsIHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgLTc6CisgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byB1bnNldCBrZWVwLWNhcGFiaWxpdGllczogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworIHJldHVybiBUUlVFOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9idXMvYXVkaXQuaCBiL2J1cy9hdWRpdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxNzAxNmYKLS0tIC9kZXYvbnVsbAorKysgYi9idXMvYXVkaXQuaApAQCAtMCwwICsxLDMzIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0KKyAqIGF1ZGl0LmggLSBsaWJhdWRpdCBpbnRlZ3JhdGlvbiBmb3IgU0VMaW51eCBhbmQgQXBwQXJtb3IKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBCVVNfQVVESVRfSAorI2RlZmluZSBCVVNfQVVESVRfSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLmg+CisKKyNpbmNsdWRlICJidXMuaCIKKwordm9pZCBidXNfYXVkaXRfaW5pdCAoQnVzQ29udGV4dCAqY29udGV4dCk7CitpbnQgYnVzX2F1ZGl0X2dldF9mZCAodm9pZCk7Cit2b2lkIGJ1c19hdWRpdF9zaHV0ZG93biAodm9pZCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYnVzL2J1cy5jIGIvYnVzL2J1cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhZDhlNzgKLS0tIC9kZXYvbnVsbAorKysgYi9idXMvYnVzLmMKQEAgLTAsMCArMSwxODMzIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGJ1cy5jICBtZXNzYWdlIGJ1cyBjb250ZXh0IG9iamVjdAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiYnVzLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAiYWN0aXZhdGlvbi5oIgorI2luY2x1ZGUgImNvbm5lY3Rpb24uaCIKKyNpbmNsdWRlICJzZXJ2aWNlcy5oIgorI2luY2x1ZGUgInV0aWxzLmgiCisjaW5jbHVkZSAicG9saWN5LmgiCisjaW5jbHVkZSAiY29uZmlnLXBhcnNlci5oIgorI2luY2x1ZGUgInNpZ25hbHMuaCIKKyNpbmNsdWRlICJzZWxpbnV4LmgiCisjaW5jbHVkZSAiYXBwYXJtb3IuaCIKKyNpbmNsdWRlICJhdWRpdC5oIgorI2luY2x1ZGUgImRpci13YXRjaC5oIgorI2luY2x1ZGUgPGRidXMvZGJ1cy1hdXRoLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWxpc3QuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtaGFzaC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1jcmVkZW50aWFscy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1pbnRlcm5hbHMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc2VydmVyLXByb3RlY3RlZC5oPgorCisjaWZkZWYgREJVU19DWUdXSU4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNlbmRpZgorCitzdHJ1Y3QgQnVzQ29udGV4dAoreworICBpbnQgcmVmY291bnQ7CisgIERCdXNHVUlEIHV1aWQ7CisgIGNoYXIgKmNvbmZpZ19maWxlOworICBjaGFyICp0eXBlOworICBjaGFyICpzZXJ2aWNlaGVscGVyOworICBjaGFyICphZGRyZXNzOworICBjaGFyICpwaWRmaWxlOworICBjaGFyICp1c2VyOworICBjaGFyICpsb2dfcHJlZml4OworICBEQnVzTG9vcCAqbG9vcDsKKyAgREJ1c0xpc3QgKnNlcnZlcnM7CisgIEJ1c0Nvbm5lY3Rpb25zICpjb25uZWN0aW9uczsKKyAgQnVzQWN0aXZhdGlvbiAqYWN0aXZhdGlvbjsKKyAgQnVzUmVnaXN0cnkgKnJlZ2lzdHJ5OworICBCdXNQb2xpY3kgKnBvbGljeTsKKyAgQnVzTWF0Y2htYWtlciAqbWF0Y2htYWtlcjsKKyAgQnVzTGltaXRzIGxpbWl0czsKKyAgREJ1c1JMaW1pdCAqaW5pdGlhbF9mZF9saW1pdDsKKyAgdW5zaWduZWQgaW50IGZvcmsgOiAxOworICB1bnNpZ25lZCBpbnQgc3lzbG9nIDogMTsKKyAgdW5zaWduZWQgaW50IGtlZXBfdW1hc2sgOiAxOworICB1bnNpZ25lZCBpbnQgYWxsb3dfYW5vbnltb3VzIDogMTsKKyAgdW5zaWduZWQgaW50IHN5c3RlbWRfYWN0aXZhdGlvbiA6IDE7CisgIGRidXNfYm9vbF90IHdhdGNoZXNfZW5hYmxlZDsKK307CisKK3N0YXRpYyBkYnVzX2ludDMyX3Qgc2VydmVyX2RhdGFfc2xvdCA9IC0xOworCit0eXBlZGVmIHN0cnVjdAoreworICBCdXNDb250ZXh0ICpjb250ZXh0OworfSBCdXNTZXJ2ZXJEYXRhOworCisjZGVmaW5lIEJVU19TRVJWRVJfREFUQShzZXJ2ZXIpIChkYnVzX3NlcnZlcl9nZXRfZGF0YSAoKHNlcnZlciksIHNlcnZlcl9kYXRhX3Nsb3QpKQorCitzdGF0aWMgQnVzQ29udGV4dCoKK3NlcnZlcl9nZXRfY29udGV4dCAoREJ1c1NlcnZlciAqc2VydmVyKQoreworICBCdXNDb250ZXh0ICpjb250ZXh0OworICBCdXNTZXJ2ZXJEYXRhICpiZDsKKworICAvKiB0aGlzIGRhdGEgc2xvdCB3YXMgYWxsb2NhdGVkIGJ5IHRoZSBCdXNDb250ZXh0ICovCisgIF9kYnVzX2Fzc2VydCAoc2VydmVyX2RhdGFfc2xvdCA+PSAwKTsKKworICBiZCA9IEJVU19TRVJWRVJfREFUQSAoc2VydmVyKTsKKworICAvKiBldmVyeSBEQnVzU2VydmVyIGluIHRoZSBkYnVzLWRhZW1vbiBoYXMgZ29uZSB0aHJvdWdoIHNldHVwX3NlcnZlcigpICovCisgIF9kYnVzX2Fzc2VydCAoYmQgIT0gTlVMTCk7CisKKyAgY29udGV4dCA9IGJkLT5jb250ZXh0OworCisgIHJldHVybiBjb250ZXh0OworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2FkZF9zZXJ2ZXJfd2F0Y2ggKERCdXNXYXRjaCAgKndhdGNoLAorICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAqZGF0YSkKK3sKKyAgREJ1c1NlcnZlciAqc2VydmVyID0gZGF0YTsKKyAgQnVzQ29udGV4dCAqY29udGV4dDsKKworICBjb250ZXh0ID0gc2VydmVyX2dldF9jb250ZXh0IChzZXJ2ZXIpOworCisgIHJldHVybiBfZGJ1c19sb29wX2FkZF93YXRjaCAoY29udGV4dC0+bG9vcCwgd2F0Y2gpOworfQorCitzdGF0aWMgdm9pZAorcmVtb3ZlX3NlcnZlcl93YXRjaCAoREJ1c1dhdGNoICAqd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICpkYXRhKQoreworICBEQnVzU2VydmVyICpzZXJ2ZXIgPSBkYXRhOworICBCdXNDb250ZXh0ICpjb250ZXh0OworCisgIGNvbnRleHQgPSBzZXJ2ZXJfZ2V0X2NvbnRleHQgKHNlcnZlcik7CisKKyAgX2RidXNfbG9vcF9yZW1vdmVfd2F0Y2ggKGNvbnRleHQtPmxvb3AsIHdhdGNoKTsKK30KKworc3RhdGljIHZvaWQKK3RvZ2dsZV9zZXJ2ZXJfd2F0Y2ggKERCdXNXYXRjaCAgKndhdGNoLAorICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAqZGF0YSkKK3sKKyAgREJ1c1NlcnZlciAqc2VydmVyID0gZGF0YTsKKyAgQnVzQ29udGV4dCAqY29udGV4dDsKKworICBjb250ZXh0ID0gc2VydmVyX2dldF9jb250ZXh0IChzZXJ2ZXIpOworCisgIF9kYnVzX2xvb3BfdG9nZ2xlX3dhdGNoIChjb250ZXh0LT5sb29wLCB3YXRjaCk7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYWRkX3NlcnZlcl90aW1lb3V0IChEQnVzVGltZW91dCAqdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgKmRhdGEpCit7CisgIERCdXNTZXJ2ZXIgKnNlcnZlciA9IGRhdGE7CisgIEJ1c0NvbnRleHQgKmNvbnRleHQ7CisKKyAgY29udGV4dCA9IHNlcnZlcl9nZXRfY29udGV4dCAoc2VydmVyKTsKKworICByZXR1cm4gX2RidXNfbG9vcF9hZGRfdGltZW91dCAoY29udGV4dC0+bG9vcCwgdGltZW91dCk7Cit9CisKK3N0YXRpYyB2b2lkCityZW1vdmVfc2VydmVyX3RpbWVvdXQgKERCdXNUaW1lb3V0ICp0aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAqZGF0YSkKK3sKKyAgREJ1c1NlcnZlciAqc2VydmVyID0gZGF0YTsKKyAgQnVzQ29udGV4dCAqY29udGV4dDsKKworICBjb250ZXh0ID0gc2VydmVyX2dldF9jb250ZXh0IChzZXJ2ZXIpOworCisgIF9kYnVzX2xvb3BfcmVtb3ZlX3RpbWVvdXQgKGNvbnRleHQtPmxvb3AsIHRpbWVvdXQpOworfQorCitzdGF0aWMgdm9pZAorbmV3X2Nvbm5lY3Rpb25fY2FsbGJhY2sgKERCdXNTZXJ2ZXIgICAgICpzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKm5ld19jb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICpkYXRhKQoreworICBCdXNDb250ZXh0ICpjb250ZXh0ID0gZGF0YTsKKworICAvKiBJZiB0aGlzIGZhaWxzIGl0IGxvZ3MgYSB3YXJuaW5nLCBzbyB3ZSBkb24ndCBuZWVkIHRvIGRvIHRoYXQgKi8KKyAgaWYgKCFidXNfY29ubmVjdGlvbnNfc2V0dXBfY29ubmVjdGlvbiAoY29udGV4dC0+Y29ubmVjdGlvbnMsIG5ld19jb25uZWN0aW9uKSkKKyAgICB7CisgICAgICAvKiBpZiB3ZSBkb24ndCBkbyB0aGlzLCBpdCB3aWxsIGdldCB1bnJlZidkIHdpdGhvdXQKKyAgICAgICAqIGJlaW5nIGRpc2Nvbm5lY3RlZC4uLiBraW5kIG9mIHN0cmFuZ2UgcmVhbGx5CisgICAgICAgKiB0aGF0IHdlIGhhdmUgdG8gZG8gdGhpcywgcGVvcGxlIHdvbid0IGdldCBpdCByaWdodAorICAgICAgICogaW4gZ2VuZXJhbC4KKyAgICAgICAqLworICAgICAgZGJ1c19jb25uZWN0aW9uX2Nsb3NlIChuZXdfY29ubmVjdGlvbik7CisgICAgfQorCisgIGRidXNfY29ubmVjdGlvbl9zZXRfbWF4X3JlY2VpdmVkX3NpemUgKG5ld19jb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5saW1pdHMubWF4X2luY29taW5nX2J5dGVzKTsKKworICBkYnVzX2Nvbm5lY3Rpb25fc2V0X21heF9tZXNzYWdlX3NpemUgKG5ld19jb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQtPmxpbWl0cy5tYXhfbWVzc2FnZV9zaXplKTsKKworICBkYnVzX2Nvbm5lY3Rpb25fc2V0X21heF9yZWNlaXZlZF91bml4X2ZkcyAobmV3X2Nvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQtPmxpbWl0cy5tYXhfaW5jb21pbmdfdW5peF9mZHMpOworCisgIGRidXNfY29ubmVjdGlvbl9zZXRfbWF4X21lc3NhZ2VfdW5peF9mZHMgKG5ld19jb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQtPmxpbWl0cy5tYXhfbWVzc2FnZV91bml4X2Zkcyk7CisKKyAgZGJ1c19jb25uZWN0aW9uX3NldF9hbGxvd19hbm9ueW1vdXMgKG5ld19jb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC0+YWxsb3dfYW5vbnltb3VzKTsKKworICAvKiBvbiBPT00sIHdlIHdvbid0IGhhdmUgcmVmJ2QgdGhlIGNvbm5lY3Rpb24gc28gaXQgd2lsbCBkaWUuICovCit9CisKK3N0YXRpYyB2b2lkCitmcmVlX3NlcnZlcl9kYXRhICh2b2lkICpkYXRhKQoreworICBCdXNTZXJ2ZXJEYXRhICpiZCA9IGRhdGE7CisKKyAgZGJ1c19mcmVlIChiZCk7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorc2V0dXBfc2VydmVyIChCdXNDb250ZXh0ICpjb250ZXh0LAorICAgICAgICAgICAgICBEQnVzU2VydmVyICpzZXJ2ZXIsCisgICAgICAgICAgICAgIGNoYXIgICAgICAqKmF1dGhfbWVjaGFuaXNtcywKKyAgICAgICAgICAgICAgREJ1c0Vycm9yICAqZXJyb3IpCit7CisgIEJ1c1NlcnZlckRhdGEgKmJkOworCisgIGJkID0gZGJ1c19uZXcwIChCdXNTZXJ2ZXJEYXRhLCAxKTsKKyAgaWYgKGJkID09IE5VTEwgfHwgIWRidXNfc2VydmVyX3NldF9kYXRhIChzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyX2RhdGFfc2xvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZCwgZnJlZV9zZXJ2ZXJfZGF0YSkpCisgICAgeworICAgICAgZGJ1c19mcmVlIChiZCk7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBiZC0+Y29udGV4dCA9IGNvbnRleHQ7CisKKyAgaWYgKCFkYnVzX3NlcnZlcl9zZXRfYXV0aF9tZWNoYW5pc21zIChzZXJ2ZXIsIChjb25zdCBjaGFyKiopIGF1dGhfbWVjaGFuaXNtcykpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgZGJ1c19zZXJ2ZXJfc2V0X25ld19jb25uZWN0aW9uX2Z1bmN0aW9uIChzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X2Nvbm5lY3Rpb25fY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dCwgTlVMTCk7CisKKyAgaWYgKCFkYnVzX3NlcnZlcl9zZXRfd2F0Y2hfZnVuY3Rpb25zIChzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkX3NlcnZlcl93YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVfc2VydmVyX3dhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvZ2dsZV9zZXJ2ZXJfd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghZGJ1c19zZXJ2ZXJfc2V0X3RpbWVvdXRfZnVuY3Rpb25zIChzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRfc2VydmVyX3RpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVfc2VydmVyX3RpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyLCBOVUxMKSkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworLyogVGhpcyBjb2RlIG9ubHkgZ2V0cyBleGVjdXRlZCB0aGUgZmlyc3QgdGltZSB0aGUKKyAqIGNvbmZpZyBmaWxlcyBhcmUgcGFyc2VkLiAgSXQgaXMgbm90IGV4ZWN1dGVkCisgKiB3aGVuIGNvbmZpZyBmaWxlcyBhcmUgcmVsb2FkZWQuCisgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAorcHJvY2Vzc19jb25maWdfZmlyc3RfdGltZV9vbmx5IChCdXNDb250ZXh0ICAgICAgICpjb250ZXh0LAorCQkJCUJ1c0NvbmZpZ1BhcnNlciAgKnBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzQ29udGV4dEZsYWdzICAgZmxhZ3MsCisJCQkJREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCit7CisgIERCdXNTdHJpbmcgbG9nX3ByZWZpeDsKKyAgREJ1c0xpc3QgKmxpbms7CisgIERCdXNMaXN0ICoqYWRkcmVzc2VzOworICBjb25zdCBjaGFyICp1c2VyLCAqcGlkZmlsZTsKKyAgY2hhciAqKmF1dGhfbWVjaGFuaXNtczsKKyAgREJ1c0xpc3QgKiphdXRoX21lY2hhbmlzbXNfbGlzdDsKKyAgaW50IGxlbjsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICBEQnVzTG9nRmxhZ3MgbG9nX2ZsYWdzID0gREJVU19MT0dfRkxBR1NfU1RERVJSOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIHJldHZhbCA9IEZBTFNFOworICBhdXRoX21lY2hhbmlzbXMgPSBOVUxMOworICBwaWRmaWxlID0gTlVMTDsKKworICBpZiAoZmxhZ3MgJiBCVVNfQ09OVEVYVF9GTEFHX1NZU0xPR19BTFdBWVMpCisgICAgeworICAgICAgY29udGV4dC0+c3lzbG9nID0gVFJVRTsKKyAgICAgIGxvZ19mbGFncyB8PSBEQlVTX0xPR19GTEFHU19TWVNURU1fTE9HOworCisgICAgICBpZiAoZmxhZ3MgJiBCVVNfQ09OVEVYVF9GTEFHX1NZU0xPR19PTkxZKQorICAgICAgICBsb2dfZmxhZ3MgJj0gfkRCVVNfTE9HX0ZMQUdTX1NUREVSUjsKKyAgICB9CisgIGVsc2UgaWYgKGZsYWdzICYgQlVTX0NPTlRFWFRfRkxBR19TWVNMT0dfTkVWRVIpCisgICAgeworICAgICAgY29udGV4dC0+c3lzbG9nID0gRkFMU0U7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgY29udGV4dC0+c3lzbG9nID0gYnVzX2NvbmZpZ19wYXJzZXJfZ2V0X3N5c2xvZyAocGFyc2VyKTsKKworICAgICAgaWYgKGNvbnRleHQtPnN5c2xvZykKKyAgICAgICAgbG9nX2ZsYWdzIHw9IERCVVNfTE9HX0ZMQUdTX1NZU1RFTV9MT0c7CisgICAgfQorCisgIF9kYnVzX2luaXRfc3lzdGVtX2xvZyAoImRidXMtZGFlbW9uIiwgbG9nX2ZsYWdzKTsKKworICBpZiAoZmxhZ3MgJiBCVVNfQ09OVEVYVF9GTEFHX1NZU1RFTURfQUNUSVZBVElPTikKKyAgICBjb250ZXh0LT5zeXN0ZW1kX2FjdGl2YXRpb24gPSBUUlVFOworICBlbHNlCisgICAgY29udGV4dC0+c3lzdGVtZF9hY3RpdmF0aW9uID0gRkFMU0U7CisKKyAgLyogQ2hlY2sgZm9yIGFuIGV4aXN0aW5nIHBpZCBmaWxlLiBPZiBjb3Vyc2UgdGhpcyBpcyBhIHJhY2U7CisgICAqIHdlJ2QgaGF2ZSB0byB1c2UgZmNudGwoKSBsb2NrcyBvbiB0aGUgcGlkIGZpbGUgdG8KKyAgICogYXZvaWQgdGhhdC4gQnV0IHdlIHdhbnQgdG8gY2hlY2sgZm9yIHRoZSBwaWQgZmlsZQorICAgKiBiZWZvcmUgb3ZlcndyaXRpbmcgYW55IGV4aXN0aW5nIHNvY2tldHMsIGV0Yy4KKyAgICovCisKKyAgaWYgKGZsYWdzICYgQlVTX0NPTlRFWFRfRkxBR19XUklURV9QSURfRklMRSkKKyAgICBwaWRmaWxlID0gYnVzX2NvbmZpZ19wYXJzZXJfZ2V0X3BpZGZpbGUgKHBhcnNlcik7CisKKyAgaWYgKHBpZGZpbGUgIT0gTlVMTCkKKyAgICB7CisgICAgICBEQnVzU3RyaW5nIHU7CisgICAgICBEQnVzU3RhdCBzdGJ1ZjsKKworICAgICAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZ1LCBwaWRmaWxlKTsKKworICAgICAgaWYgKF9kYnVzX3N0YXQgKCZ1LCAmc3RidWYsIE5VTEwpKQorICAgICAgICB7CisjaWZkZWYgREJVU19DWUdXSU4KKyAgICAgICAgICBEQnVzU3RyaW5nIHA7CisgICAgICAgICAgbG9uZyAvKiBpbnQgKi8gcGlkOworCisgICAgICAgICAgX2RidXNfc3RyaW5nX2luaXQgKCZwKTsKKyAgICAgICAgICBfZGJ1c19maWxlX2dldF9jb250ZW50cygmcCwgJnUsIE5VTEwpOworICAgICAgICAgIF9kYnVzX3N0cmluZ19wYXJzZV9pbnQoJnAsIDAsICZwaWQsIE5VTEwpOworICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlKCZwKTsKKworICAgICAgICAgIGlmICgoa2lsbCgoaW50KXBpZCwgMCkpKSB7CisgICAgICAgICAgICBkYnVzX3NldF9lcnJvcihOVUxMLCBEQlVTX0VSUk9SX0ZJTEVfRVhJU1RTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgInBpZCAlbGQgbm90IHJ1bm5pbmcsIHJlbW92aW5nIHN0YWxlIHBpZCBmaWxlXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkKTsKKyAgICAgICAgICAgIF9kYnVzX2RlbGV0ZV9maWxlKCZ1LCBOVUxMKTsKKyAgICAgICAgICB9IGVsc2UgeworI2VuZGlmCisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKwkJICAgICAgICAgICAgICAgICAgIlRoZSBwaWQgZmlsZSBcIiVzXCIgZXhpc3RzLCBpZiB0aGUgbWVzc2FnZSBidXMgaXMgbm90IHJ1bm5pbmcsIHJlbW92ZSB0aGlzIGZpbGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRmaWxlKTsKKwkgICAgICBnb3RvIGZhaWxlZDsKKyNpZmRlZiBEQlVTX0NZR1dJTgorICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICB9CisgICAgfQorCisgIC8qIGtlZXAgYXJvdW5kIHRoZSBwaWQgZmlsZW5hbWUgc28gd2UgY2FuIGRlbGV0ZSBpdCBsYXRlciAqLworICBjb250ZXh0LT5waWRmaWxlID0gX2RidXNfc3RyZHVwIChwaWRmaWxlKTsKKworICAvKiBub3RlIHRoYXQgdHlwZSBtYXkgYmUgTlVMTCAqLworICBjb250ZXh0LT50eXBlID0gX2RidXNfc3RyZHVwIChidXNfY29uZmlnX3BhcnNlcl9nZXRfdHlwZSAocGFyc2VyKSk7CisgIGlmIChidXNfY29uZmlnX3BhcnNlcl9nZXRfdHlwZSAocGFyc2VyKSAhPSBOVUxMICYmIGNvbnRleHQtPnR5cGUgPT0gTlVMTCkKKyAgICBnb3RvIG9vbTsKKworICB1c2VyID0gYnVzX2NvbmZpZ19wYXJzZXJfZ2V0X3VzZXIgKHBhcnNlcik7CisgIGlmICh1c2VyICE9IE5VTEwpCisgICAgeworICAgICAgY29udGV4dC0+dXNlciA9IF9kYnVzX3N0cmR1cCAodXNlcik7CisgICAgICBpZiAoY29udGV4dC0+dXNlciA9PSBOVUxMKQorICAgICAgICBnb3RvIG9vbTsKKyAgICB9CisKKyAgLyogU2V0IHVwIHRoZSBwcmVmaXggZm9yIHN5c2xvZyBtZXNzYWdlcyAqLworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmbG9nX3ByZWZpeCkpCisgICAgZ290byBvb207CisgIGlmIChjb250ZXh0LT50eXBlICYmICFzdHJjbXAgKGNvbnRleHQtPnR5cGUsICJzeXN0ZW0iKSkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZsb2dfcHJlZml4LCAiW3N5c3RlbV0gIikpCisgICAgICAgIGdvdG8gb29tOworICAgIH0KKyAgZWxzZSBpZiAoY29udGV4dC0+dHlwZSAmJiAhc3RyY21wIChjb250ZXh0LT50eXBlLCAic2Vzc2lvbiIpKQorICAgIHsKKyAgICAgIERCdXNDcmVkZW50aWFscyAqY3JlZGVudGlhbHM7CisKKyAgICAgIGNyZWRlbnRpYWxzID0gX2RidXNfY3JlZGVudGlhbHNfbmV3X2Zyb21fY3VycmVudF9wcm9jZXNzICgpOworICAgICAgaWYgKCFjcmVkZW50aWFscykKKyAgICAgICAgZ290byBvb207CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZsb2dfcHJlZml4LCAiW3Nlc3Npb24gIikpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19jcmVkZW50aWFsc191bnJlZiAoY3JlZGVudGlhbHMpOworICAgICAgICAgIGdvdG8gb29tOworICAgICAgICB9CisgICAgICBpZiAoIV9kYnVzX2NyZWRlbnRpYWxzX3RvX3N0cmluZ19hcHBlbmQgKGNyZWRlbnRpYWxzLCAmbG9nX3ByZWZpeCkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19jcmVkZW50aWFsc191bnJlZiAoY3JlZGVudGlhbHMpOworICAgICAgICAgIGdvdG8gb29tOworICAgICAgICB9CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZsb2dfcHJlZml4LCAiXSAiKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX2NyZWRlbnRpYWxzX3VucmVmIChjcmVkZW50aWFscyk7CisgICAgICAgICAgZ290byBvb207CisgICAgICAgIH0KKyAgICAgIF9kYnVzX2NyZWRlbnRpYWxzX3VucmVmIChjcmVkZW50aWFscyk7CisgICAgfQorICBpZiAoIV9kYnVzX3N0cmluZ19zdGVhbF9kYXRhICgmbG9nX3ByZWZpeCwgJmNvbnRleHQtPmxvZ19wcmVmaXgpKQorICAgIGdvdG8gb29tOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmxvZ19wcmVmaXgpOworCisgIC8qIEJ1aWxkIGFuIGFycmF5IG9mIGF1dGggbWVjaGFuaXNtcyAqLworCisgIGF1dGhfbWVjaGFuaXNtc19saXN0ID0gYnVzX2NvbmZpZ19wYXJzZXJfZ2V0X21lY2hhbmlzbXMgKHBhcnNlcik7CisgIGxlbiA9IF9kYnVzX2xpc3RfZ2V0X2xlbmd0aCAoYXV0aF9tZWNoYW5pc21zX2xpc3QpOworCisgIGlmIChsZW4gPiAwKQorICAgIHsKKyAgICAgIGludCBpOworCisgICAgICBhdXRoX21lY2hhbmlzbXMgPSBkYnVzX25ldzAgKGNoYXIqLCBsZW4gKyAxKTsKKyAgICAgIGlmIChhdXRoX21lY2hhbmlzbXMgPT0gTlVMTCkKKyAgICAgICAgZ290byBvb207CisKKyAgICAgIGkgPSAwOworICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKGF1dGhfbWVjaGFuaXNtc19saXN0KTsKKyAgICAgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBEQnVzU3RyaW5nIG5hbWU7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZuYW1lLCBsaW5rLT5kYXRhKTsKKyAgICAgICAgICBpZiAoIV9kYnVzX2F1dGhfaXNfc3VwcG9ydGVkX21lY2hhbmlzbSAoJm5hbWUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBEQnVzU3RyaW5nIGxpc3Q7CisgICAgICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZsaXN0KSkKKyAgICAgICAgICAgICAgICBnb3RvIG9vbTsKKworICAgICAgICAgICAgICBpZiAoIV9kYnVzX2F1dGhfZHVtcF9zdXBwb3J0ZWRfbWVjaGFuaXNtcyAoJmxpc3QpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmbGlzdCk7CisgICAgICAgICAgICAgICAgICBnb3RvIG9vbTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5zdXBwb3J0ZWQgYXV0aCBtZWNoYW5pc20gXCIlc1wiIGluIGJ1cyBjb25maWcgZmlsZSBkZXRlY3RlZC4gU3VwcG9ydGVkIG1lY2hhbmlzbXMgYXJlIFwiJXNcIi4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIqKWxpbmstPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZsaXN0KSk7CisgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmbGlzdCk7CisgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgfQorICAgICAgICAgIGF1dGhfbWVjaGFuaXNtc1tpXSA9IF9kYnVzX3N0cmR1cCAobGluay0+ZGF0YSk7CisgICAgICAgICAgaWYgKGF1dGhfbWVjaGFuaXNtc1tpXSA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBvb207CisgICAgICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoYXV0aF9tZWNoYW5pc21zX2xpc3QsIGxpbmspOworICAgICAgICAgIGkgKz0gMTsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGF1dGhfbWVjaGFuaXNtcyA9IE5VTEw7CisgICAgfQorCisgIC8qIExpc3RlbiBvbiBvdXIgYWRkcmVzc2VzICovCisKKyAgaWYgKGFkZHJlc3MpCisgICAgeworICAgICAgREJ1c1NlcnZlciAqc2VydmVyOworCisgICAgICBzZXJ2ZXIgPSBkYnVzX3NlcnZlcl9saXN0ZW4gKF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YShhZGRyZXNzKSwgZXJyb3IpOworICAgICAgaWYgKHNlcnZlciA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICB9CisgICAgICBlbHNlIGlmICghc2V0dXBfc2VydmVyIChjb250ZXh0LCBzZXJ2ZXIsIGF1dGhfbWVjaGFuaXNtcywgZXJyb3IpKQorICAgICAgICB7CisgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICB9CisKKyAgICAgIGlmICghX2RidXNfbGlzdF9hcHBlbmQgKCZjb250ZXh0LT5zZXJ2ZXJzLCBzZXJ2ZXIpKQorICAgICAgICBnb3RvIG9vbTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBhZGRyZXNzZXMgPSBidXNfY29uZmlnX3BhcnNlcl9nZXRfYWRkcmVzc2VzIChwYXJzZXIpOworCisgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoYWRkcmVzc2VzKTsKKyAgICAgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBEQnVzU2VydmVyICpzZXJ2ZXI7CisKKyAgICAgICAgICBzZXJ2ZXIgPSBkYnVzX3NlcnZlcl9saXN0ZW4gKGxpbmstPmRhdGEsIGVycm9yKTsKKyAgICAgICAgICBpZiAoc2VydmVyID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZSBpZiAoIXNldHVwX3NlcnZlciAoY29udGV4dCwgc2VydmVyLCBhdXRoX21lY2hhbmlzbXMsIGVycm9yKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGlmICghX2RidXNfbGlzdF9hcHBlbmQgKCZjb250ZXh0LT5zZXJ2ZXJzLCBzZXJ2ZXIpKQorICAgICAgICAgICAgZ290byBvb207CisKKyAgICAgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rIChhZGRyZXNzZXMsIGxpbmspOworICAgICAgICB9CisgICAgfQorCisgIGNvbnRleHQtPmZvcmsgPSBidXNfY29uZmlnX3BhcnNlcl9nZXRfZm9yayAocGFyc2VyKTsKKyAgY29udGV4dC0+a2VlcF91bWFzayA9IGJ1c19jb25maWdfcGFyc2VyX2dldF9rZWVwX3VtYXNrIChwYXJzZXIpOworICBjb250ZXh0LT5hbGxvd19hbm9ueW1vdXMgPSBidXNfY29uZmlnX3BhcnNlcl9nZXRfYWxsb3dfYW5vbnltb3VzIChwYXJzZXIpOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworICByZXR2YWwgPSBUUlVFOworCisgZmFpbGVkOgorICBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5IChhdXRoX21lY2hhbmlzbXMpOworICByZXR1cm4gcmV0dmFsOworCisgb29tOgorICBCVVNfU0VUX09PTSAoZXJyb3IpOworICBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5IChhdXRoX21lY2hhbmlzbXMpOworICByZXR1cm4gRkFMU0U7Cit9CisKKy8qIFRoaXMgY29kZSBnZXRzIGV4ZWN1dGVkIGV2ZXJ5IHRpbWUgdGhlIGNvbmZpZyBmaWxlcworICogYXJlIHBhcnNlZDogYm90aCBkdXJpbmcgQnVzQ29udGV4dCBjb25zdHJ1Y3Rpb24KKyAqIGFuZCBvbiByZWxvYWRzLiBUaGlzIGZ1bmN0aW9uIGlzIHNsaWdodGx5IHNjcmV3eQorICogc2luY2UgaXQgY2FuIGRvIGEgImhhbGYgcmVsb2FkIiBpbiBvdXQtb2YtbWVtb3J5CisgKiBzaXR1YXRpb25zLiBSZWFsaXN0aWNhbGx5LCB1bmxpa2VseSB0byBldmVyIG1hdHRlci4KKyAqLworc3RhdGljIGRidXNfYm9vbF90Citwcm9jZXNzX2NvbmZpZ19ldmVyeV90aW1lIChCdXNDb250ZXh0ICAgICAgKmNvbnRleHQsCisJCQkgICBCdXNDb25maWdQYXJzZXIgKnBhcnNlciwKKwkJCSAgIGRidXNfYm9vbF90ICAgICAgaXNfcmVsb2FkLAorCQkJICAgREJ1c0Vycm9yICAgICAgICplcnJvcikKK3sKKyAgREJ1c1N0cmluZyBmdWxsX2FkZHJlc3M7CisgIERCdXNMaXN0ICpsaW5rOworICBEQnVzTGlzdCAqKmRpcnM7CisgIGNoYXIgKmFkZHI7CisgIGNvbnN0IGNoYXIgKnNlcnZpY2VoZWxwZXI7CisgIGNoYXIgKnM7CisKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIGFkZHIgPSBOVUxMOworICByZXR2YWwgPSBGQUxTRTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZnVsbF9hZGRyZXNzKSkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAvKiBnZXQgb3VyIGxpbWl0cyBhbmQgdGltZW91dCBsZW5ndGhzICovCisgIGJ1c19jb25maWdfcGFyc2VyX2dldF9saW1pdHMgKHBhcnNlciwgJmNvbnRleHQtPmxpbWl0cyk7CisKKyAgaWYgKGNvbnRleHQtPnBvbGljeSkKKyAgICBidXNfcG9saWN5X3VucmVmIChjb250ZXh0LT5wb2xpY3kpOworICBjb250ZXh0LT5wb2xpY3kgPSBidXNfY29uZmlnX3BhcnNlcl9zdGVhbF9wb2xpY3kgKHBhcnNlcik7CisgIF9kYnVzX2Fzc2VydCAoY29udGV4dC0+cG9saWN5ICE9IE5VTEwpOworCisgIC8qIGNvbnRleHQtPmNvbm5lY3Rpb25zIGlzIE5VTEwgd2hlbiBjcmVhdGluZyBuZXcgQnVzQ29udGV4dCAqLworICBpZiAoY29udGV4dC0+Y29ubmVjdGlvbnMpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIlJlbG9hZCBwb2xpY3kgcnVsZXMgZm9yIGNvbXBsZXRlZCBjb25uZWN0aW9uc1xuIik7CisgICAgICByZXR2YWwgPSBidXNfY29ubmVjdGlvbnNfcmVsb2FkX3BvbGljeSAoY29udGV4dC0+Y29ubmVjdGlvbnMsIGVycm9yKTsKKyAgICAgIGlmICghcmV0dmFsKQorICAgICAgICB7CisgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICB9CisgICAgfQorCisgIC8qIFdlIGhhdmUgdG8gYnVpbGQgdGhlIGFkZHJlc3MgYmFja3dhcmQsIHNvIHRoYXQKKyAgICogPGxpc3Rlbj4gbGF0ZXIgaW4gdGhlIGNvbmZpZyBmaWxlIGhhdmUgcHJpb3JpdHkKKyAgICovCisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9sYXN0X2xpbmsgKCZjb250ZXh0LT5zZXJ2ZXJzKTsKKyAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBhZGRyID0gZGJ1c19zZXJ2ZXJfZ2V0X2FkZHJlc3MgKGxpbmstPmRhdGEpOworICAgICAgaWYgKGFkZHIgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgIH0KKworICAgICAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmZnVsbF9hZGRyZXNzKSA+IDApCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZmdWxsX2FkZHJlc3MsICI7IikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmZ1bGxfYWRkcmVzcywgYWRkcikpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICB9CisKKyAgICAgIGRidXNfZnJlZSAoYWRkcik7CisgICAgICBhZGRyID0gTlVMTDsKKworICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X3ByZXZfbGluayAoJmNvbnRleHQtPnNlcnZlcnMsIGxpbmspOworICAgIH0KKworICBpZiAoaXNfcmVsb2FkKQorICAgIGRidXNfZnJlZSAoY29udGV4dC0+YWRkcmVzcyk7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weV9kYXRhICgmZnVsbF9hZGRyZXNzLCAmY29udGV4dC0+YWRkcmVzcykpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICAvKiBnZXQgdGhlIHNlcnZpY2UgZGlyZWN0b3JpZXMgKi8KKyAgZGlycyA9IGJ1c19jb25maWdfcGFyc2VyX2dldF9zZXJ2aWNlX2RpcnMgKHBhcnNlcik7CisKKyAgLyogYW5kIHRoZSBzZXJ2aWNlIGhlbHBlciAqLworICBzZXJ2aWNlaGVscGVyID0gYnVzX2NvbmZpZ19wYXJzZXJfZ2V0X3NlcnZpY2VoZWxwZXIgKHBhcnNlcik7CisKKyAgcyA9IF9kYnVzX3N0cmR1cChzZXJ2aWNlaGVscGVyKTsKKyAgaWYgKHMgPT0gTlVMTCAmJiBzZXJ2aWNlaGVscGVyICE9IE5VTEwpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGRidXNfZnJlZShjb250ZXh0LT5zZXJ2aWNlaGVscGVyKTsKKyAgICAgIGNvbnRleHQtPnNlcnZpY2VoZWxwZXIgPSBzOworICAgIH0KKworICAvKiBDcmVhdGUgYWN0aXZhdGlvbiBzdWJzeXN0ZW0gKi8KKyAgaWYgKGNvbnRleHQtPmFjdGl2YXRpb24pCisgICAgeworICAgICAgaWYgKCFidXNfYWN0aXZhdGlvbl9yZWxvYWQgKGNvbnRleHQtPmFjdGl2YXRpb24sICZmdWxsX2FkZHJlc3MsIGRpcnMsIGVycm9yKSkKKyAgICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgY29udGV4dC0+YWN0aXZhdGlvbiA9IGJ1c19hY3RpdmF0aW9uX25ldyAoY29udGV4dCwgJmZ1bGxfYWRkcmVzcywgZGlycywgZXJyb3IpOworICAgIH0KKworICBpZiAoY29udGV4dC0+YWN0aXZhdGlvbiA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgcmV0dmFsID0gVFJVRTsKKworIGZhaWxlZDoKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmdWxsX2FkZHJlc3MpOworCisgIGlmIChhZGRyKQorICAgIGRidXNfZnJlZSAoYWRkcik7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHZvaWQKK3JhaXNlX2ZpbGVfZGVzY3JpcHRvcl9saW1pdCAoQnVzQ29udGV4dCAgICAgICpjb250ZXh0KQoreworI2lmZGVmIERCVVNfVU5JWAorICBEQnVzRXJyb3IgZXJyb3IgPSBEQlVTX0VSUk9SX0lOSVQ7CisKKyAgLyogd2Ugb25seSBkbyB0aGlzIG9uY2UgKi8KKyAgaWYgKGNvbnRleHQtPmluaXRpYWxfZmRfbGltaXQgIT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAgY29udGV4dC0+aW5pdGlhbF9mZF9saW1pdCA9IF9kYnVzX3JsaW1pdF9zYXZlX2ZkX2xpbWl0ICgmZXJyb3IpOworCisgIGlmIChjb250ZXh0LT5pbml0aWFsX2ZkX2xpbWl0ID09IE5VTEwpCisgICAgeworICAgICAgYnVzX2NvbnRleHRfbG9nIChjb250ZXh0LCBEQlVTX1NZU1RFTV9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgIiVzOiAlcyIsIGVycm9yLm5hbWUsIGVycm9yLm1lc3NhZ2UpOworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAvKiBXZSB1c2VkIHRvIGNvbXB1dGUgYSBzdWl0YWJsZSBybGltaXQgYmFzZWQgb24gdGhlIGNvbmZpZ3VyZWQgbnVtYmVyCisgICAqIG9mIGNvbm5lY3Rpb25zLCBidXQgdGhhdCBicmVha3MgZG93biBhcyBzb29uIGFzIHdlIGFsbG93IGZkLXBhc3NpbmcsCisgICAqIGJlY2F1c2UgZWFjaCBjb25uZWN0aW9uIGlzIGFsbG93ZWQgdG8gcGFzcyA2NCBmZHMgdG8gdXMsIGFuZCBpZgorICAgKiB0aGV5IGFsbCBkaWQsIHdlJ2QgaGl0IGtlcm5lbCBsaW1pdHMuIFdlIG5vdyBoYXJkLWNvZGUgYSBnb29kCisgICAqIGxpbWl0IHRoYXQgaXMgZW5vdWdoIHRvIGF2b2lkIERvUyBmcm9tIGFueXRoaW5nIHNob3J0IG9mIG11bHRpcGxlCisgICAqIHVpZHMgY29uc3BpcmluZyBhZ2FpbnN0IHVzLCBtdWNoIGxpa2Ugc3lzdGVtZCBkb2VzLgorICAgKi8KKyAgaWYgKCFfZGJ1c19ybGltaXRfcmFpc2VfZmRfbGltaXQgKCZlcnJvcikpCisgICAgeworICAgICAgYnVzX2NvbnRleHRfbG9nIChjb250ZXh0LCBEQlVTX1NZU1RFTV9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgIiVzOiAlcyIsIGVycm9yLm5hbWUsIGVycm9yLm1lc3NhZ2UpOworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZgorfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3Byb2Nlc3NfY29uZmlnX3Bvc3Rpbml0IChCdXNDb250ZXh0ICAgICAgKmNvbnRleHQsCisJCQkgQnVzQ29uZmlnUGFyc2VyICpwYXJzZXIsCisJCQkgREJ1c0Vycm9yICAgICAgICplcnJvcikKK3sKKyAgREJ1c0hhc2hUYWJsZSAqc2VydmljZV9jb250ZXh0X3RhYmxlOworICBEQnVzTGlzdCAqd2F0Y2hlZF9kaXJzID0gTlVMTDsKKworICBzZXJ2aWNlX2NvbnRleHRfdGFibGUgPSBidXNfY29uZmlnX3BhcnNlcl9zdGVhbF9zZXJ2aWNlX2NvbnRleHRfdGFibGUgKHBhcnNlcik7CisgIGlmICghYnVzX3JlZ2lzdHJ5X3NldF9zZXJ2aWNlX2NvbnRleHRfdGFibGUgKGNvbnRleHQtPnJlZ2lzdHJ5LAorCQkJCQkgICAgICAgc2VydmljZV9jb250ZXh0X3RhYmxlKSkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBfZGJ1c19oYXNoX3RhYmxlX3VucmVmIChzZXJ2aWNlX2NvbnRleHRfdGFibGUpOworCisgIC8qIFdlIG5lZWQgdG8gbW9uaXRvciBib3RoIHRoZSBjb25maWd1cmF0aW9uIGRpcmVjdG9yaWVzIGFuZCBkaXJlY3RvcmllcworICAgKiBjb250YWluaW5nIC5zZXJ2aWNlIGZpbGVzLgorICAgKi8KKyAgaWYgKCFidXNfY29uZmlnX3BhcnNlcl9nZXRfd2F0Y2hlZF9kaXJzIChwYXJzZXIsICZ3YXRjaGVkX2RpcnMpKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGJ1c19zZXRfd2F0Y2hlZF9kaXJzIChjb250ZXh0LCAmd2F0Y2hlZF9kaXJzKTsKKworICBfZGJ1c19saXN0X2NsZWFyICgmd2F0Y2hlZF9kaXJzKTsKKworICByZXR1cm4gVFJVRTsKK30KKworQnVzQ29udGV4dCoKK2J1c19jb250ZXh0X25ldyAoY29uc3QgREJ1c1N0cmluZyAqY29uZmlnX2ZpbGUsCisgICAgICAgICAgICAgICAgIEJ1c0NvbnRleHRGbGFncyAgIGZsYWdzLAorICAgICAgICAgICAgICAgICBEQnVzUGlwZSAgICAgICAgICpwcmludF9hZGRyX3BpcGUsCisgICAgICAgICAgICAgICAgIERCdXNQaXBlICAgICAgICAgKnByaW50X3BpZF9waXBlLAorICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICphZGRyZXNzLAorICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgQnVzQ29udGV4dCAqY29udGV4dDsKKyAgQnVzQ29uZmlnUGFyc2VyICpwYXJzZXI7CisKKyAgX2RidXNfYXNzZXJ0ICgoZmxhZ3MgJiBCVVNfQ09OVEVYVF9GTEFHX0ZPUktfTkVWRVIpID09IDAgfHwKKyAgICAgICAgICAgICAgICAoZmxhZ3MgJiBCVVNfQ09OVEVYVF9GTEFHX0ZPUktfQUxXQVlTKSA9PSAwKTsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBjb250ZXh0ID0gTlVMTDsKKyAgcGFyc2VyID0gTlVMTDsKKworICBpZiAoIWRidXNfc2VydmVyX2FsbG9jYXRlX2RhdGFfc2xvdCAoJnNlcnZlcl9kYXRhX3Nsb3QpKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgY29udGV4dCA9IGRidXNfbmV3MCAoQnVzQ29udGV4dCwgMSk7CisgIGlmIChjb250ZXh0ID09IE5VTEwpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKyAgY29udGV4dC0+cmVmY291bnQgPSAxOworCisgIGlmICghX2RidXNfZ2VuZXJhdGVfdXVpZCAoJmNvbnRleHQtPnV1aWQsIGVycm9yKSkKKyAgICBnb3RvIGZhaWxlZDsKKworICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5X2RhdGEgKGNvbmZpZ19maWxlLCAmY29udGV4dC0+Y29uZmlnX2ZpbGUpKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgY29udGV4dC0+bG9vcCA9IF9kYnVzX2xvb3BfbmV3ICgpOworICBpZiAoY29udGV4dC0+bG9vcCA9PSBOVUxMKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgY29udGV4dC0+d2F0Y2hlc19lbmFibGVkID0gVFJVRTsKKworICBjb250ZXh0LT5yZWdpc3RyeSA9IGJ1c19yZWdpc3RyeV9uZXcgKGNvbnRleHQpOworICBpZiAoY29udGV4dC0+cmVnaXN0cnkgPT0gTlVMTCkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIHBhcnNlciA9IGJ1c19jb25maWdfbG9hZCAoY29uZmlnX2ZpbGUsIFRSVUUsIE5VTEwsIGVycm9yKTsKKyAgaWYgKHBhcnNlciA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICBpZiAoIXByb2Nlc3NfY29uZmlnX2ZpcnN0X3RpbWVfb25seSAoY29udGV4dCwgcGFyc2VyLCBhZGRyZXNzLCBmbGFncywgZXJyb3IpKQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKyAgaWYgKCFwcm9jZXNzX2NvbmZpZ19ldmVyeV90aW1lIChjb250ZXh0LCBwYXJzZXIsIEZBTFNFLCBlcnJvcikpCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIC8qIHdlIG5lZWQgYW5vdGhlciByZWYgb2YgdGhlIHNlcnZlciBkYXRhIHNsb3QgZm9yIHRoZSBjb250ZXh0CisgICAqIHRvIG93bgorICAgKi8KKyAgaWYgKCFkYnVzX3NlcnZlcl9hbGxvY2F0ZV9kYXRhX3Nsb3QgKCZzZXJ2ZXJfZGF0YV9zbG90KSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJzZWNvbmQgcmVmIG9mIHNlcnZlciBkYXRhIHNsb3QgZmFpbGVkIik7CisKKyAgLyogTm90ZSB0aGF0IHdlIGRvbid0IGtub3cgd2hldGhlciB0aGUgcHJpbnRfYWRkcl9waXBlIGlzCisgICAqIG9uZSBvZiB0aGUgc29ja2V0cyB3ZSdyZSB1c2luZyB0byBsaXN0ZW4gb24sIG9yIHNvbWUKKyAgICogb3RoZXIgcmFuZG9tIHRoaW5nLiBCdXQgSSB0aGluayB0aGUgYW5zd2VyIGlzICJkb24ndCBkbworICAgKiB0aGF0IHRoZW4iCisgICAqLworICBpZiAocHJpbnRfYWRkcl9waXBlICE9IE5VTEwgJiYgX2RidXNfcGlwZV9pc192YWxpZCAocHJpbnRfYWRkcl9waXBlKSkKKyAgICB7CisgICAgICBEQnVzU3RyaW5nIGFkZHI7CisgICAgICBjb25zdCBjaGFyICphID0gYnVzX2NvbnRleHRfZ2V0X2FkZHJlc3MgKGNvbnRleHQpOworICAgICAgaW50IGJ5dGVzOworCisgICAgICBfZGJ1c19hc3NlcnQgKGEgIT0gTlVMTCk7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmYWRkcikpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICB9CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmFkZHIsIGEpIHx8CisgICAgICAgICAgIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhZGRyLCAiXG4iKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmYWRkcik7CisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgfQorCisgICAgICBieXRlcyA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmYWRkcik7CisgICAgICBpZiAoX2RidXNfcGlwZV93cml0ZSAocHJpbnRfYWRkcl9waXBlLCAmYWRkciwgMCwgYnl0ZXMsIGVycm9yKSAhPSBieXRlcykKKyAgICAgICAgeworICAgICAgICAgIC8qIHBpcGUgd3JpdGUgcmV0dXJucyBhbiBlcnJvciBvbiBmYWlsdXJlIGJ1dCBub3Qgc2hvcnQgd3JpdGUgKi8KKyAgICAgICAgICBpZiAoZXJyb3IgIT0gTlVMTCAmJiAhZGJ1c19lcnJvcl9pc19zZXQgKGVycm9yKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcmludGluZyBtZXNzYWdlIGJ1cyBhZGRyZXNzOiBkaWQgbm90IHdyaXRlIGFsbCBieXRlc1xuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZhZGRyKTsKKyAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgfQorCisgICAgICBpZiAoIV9kYnVzX3BpcGVfaXNfc3Rkb3V0X29yX3N0ZGVyciAocHJpbnRfYWRkcl9waXBlKSkKKyAgICAgICAgX2RidXNfcGlwZV9jbG9zZSAocHJpbnRfYWRkcl9waXBlLCBOVUxMKTsKKworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZhZGRyKTsKKyAgICB9CisKKyAgY29udGV4dC0+Y29ubmVjdGlvbnMgPSBidXNfY29ubmVjdGlvbnNfbmV3IChjb250ZXh0KTsKKyAgaWYgKGNvbnRleHQtPmNvbm5lY3Rpb25zID09IE5VTEwpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICBjb250ZXh0LT5tYXRjaG1ha2VyID0gYnVzX21hdGNobWFrZXJfbmV3ICgpOworICBpZiAoY29udGV4dC0+bWF0Y2htYWtlciA9PSBOVUxMKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgLyogY2hlY2sgdXNlciBiZWZvcmUgd2UgZm9yayAqLworICBpZiAoY29udGV4dC0+dXNlciAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfdmVyaWZ5X2RhZW1vbl91c2VyIChjb250ZXh0LT51c2VyKSkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgZ2V0IFVJRCBhbmQgR0lEIGZvciB1c2VybmFtZSBcIiVzXCIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT51c2VyKTsKKyAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgfQorICAgIH0KKworICAvKiBOb3cgYmVjb21lIGEgZGFlbW9uIGlmIGFwcHJvcHJpYXRlIGFuZCB3cml0ZSBvdXQgcGlkIGZpbGUgaW4gYW55IGNhc2UgKi8KKyAgeworICAgIERCdXNTdHJpbmcgdTsKKworICAgIGlmIChjb250ZXh0LT5waWRmaWxlKQorICAgICAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZ1LCBjb250ZXh0LT5waWRmaWxlKTsKKworICAgIGlmICgoKGZsYWdzICYgQlVTX0NPTlRFWFRfRkxBR19GT1JLX05FVkVSKSA9PSAwICYmIGNvbnRleHQtPmZvcmspIHx8CisgICAgICAgIChmbGFncyAmIEJVU19DT05URVhUX0ZMQUdfRk9SS19BTFdBWVMpKQorICAgICAgeworICAgICAgICBfZGJ1c192ZXJib3NlICgiRm9ya2luZyBhbmQgYmVjb21pbmcgZGFlbW9uXG4iKTsKKworICAgICAgICBpZiAoIV9kYnVzX2JlY29tZV9kYWVtb24gKGNvbnRleHQtPnBpZGZpbGUgPyAmdSA6IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRfcGlkX3BpcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC0+a2VlcF91bWFzaykpCisgICAgICAgICAgeworICAgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgICAgfQorICAgICAgfQorICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgX2RidXNfdmVyYm9zZSAoIkZvcmsgbm90IHJlcXVlc3RlZFxuIik7CisKKyAgICAgICAgLyogTmVlZCB0byB3cml0ZSBQSUQgZmlsZSBhbmQgdG8gUElEIHBpcGUgZm9yIG91cnNlbHZlcywKKyAgICAgICAgICogbm90IGZvciB0aGUgY2hpbGQgcHJvY2Vzcy4gVGhpcyBpcyBhIG5vLW9wIGlmIHRoZSBwaWRmaWxlCisgICAgICAgICAqIGlzIE5VTEwgYW5kIHByaW50X3BpZF9waXBlIGlzIE5VTEwuCisgICAgICAgICAqLworICAgICAgICBpZiAoIV9kYnVzX3dyaXRlX3BpZF90b19maWxlX2FuZF9waXBlIChjb250ZXh0LT5waWRmaWxlID8gJnUgOiBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludF9waWRfcGlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfZ2V0cGlkICgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpCisgICAgICAgICAgeworICAgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgICAgfQorICAgICAgfQorICB9CisKKyAgaWYgKHByaW50X3BpZF9waXBlICYmIF9kYnVzX3BpcGVfaXNfdmFsaWQgKHByaW50X3BpZF9waXBlKSAmJgorICAgICAgIV9kYnVzX3BpcGVfaXNfc3Rkb3V0X29yX3N0ZGVyciAocHJpbnRfcGlkX3BpcGUpKQorICAgIF9kYnVzX3BpcGVfY2xvc2UgKHByaW50X3BpZF9waXBlLCBOVUxMKTsKKworICAvKiBSYWlzZSB0aGUgZmlsZSBkZXNjcmlwdG9yIGxpbWl0cyBiZWZvcmUgZHJvcHBpbmcgdGhlIHByaXZpbGVnZXMKKyAgICogcmVxdWlyZWQgdG8gZG8gc28uCisgICAqLworICByYWlzZV9maWxlX2Rlc2NyaXB0b3JfbGltaXQgKGNvbnRleHQpOworCisgIC8qIEhlcmUgd2UgY2hhbmdlIG91ciBjcmVkZW50aWFscyBpZiByZXF1aXJlZCwKKyAgICogYXMgc29vbiBhcyB3ZSd2ZSBzZXQgdXAgb3VyIHNvY2tldHMgYW5kIHBpZGZpbGUuCisgICAqIFRoaXMgbXVzdCBiZSBkb25lIGJlZm9yZSBpbml0aWFsaXppbmcgTFNNcywgc28gdGhhdCB0aGUgbmV0bGluaworICAgKiBtb25pdG9yaW5nIHRocmVhZCBzdGFydGVkIGJ5IGF2Y19pbml0KCkgd2lsbCBub3QgbG9zZSBDQVBfQVVESVRfV1JJVEUKKyAgICogd2hlbiB0aGUgbWFpbiB0aHJlYWQgY2FsbHMgc2V0dWlkKCkuCisgICAqIGh0dHBzOi8vYnVncy5mcmVlZGVza3RvcC5vcmcvc2hvd19idWcuY2dpP2lkPTkyODMyCisgICAqLworICBpZiAoY29udGV4dC0+dXNlciAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfY2hhbmdlX3RvX2RhZW1vbl91c2VyIChjb250ZXh0LT51c2VyLCBlcnJvcikpCisJeworCSAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworCSAgZ290byBmYWlsZWQ7CisJfQorICAgIH0KKworICAvKiBBdWRpdGluZyBzaG91bGQgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIExTTXMsIHNvIHRoYXQgdGhlIExTTXMgYXJlIGFibGUKKyAgICogdG8gbG9nIGF1ZGl0LWV2ZW50cyB0aGF0IGhhcHBlbiBkdXJpbmcgdGhlaXIgaW5pdGlhbGl6YXRpb24uCisgICAqLworICBidXNfYXVkaXRfaW5pdCAoY29udGV4dCk7CisKKyAgaWYgKCFidXNfc2VsaW51eF9mdWxsX2luaXQgKCkpCisgICAgeworICAgICAgYnVzX2NvbnRleHRfbG9nIChjb250ZXh0LCBEQlVTX1NZU1RFTV9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICJTRUxpbnV4IGVuYWJsZWQgYnV0IEQtQnVzIGluaXRpYWxpemF0aW9uIGZhaWxlZDsgIgorICAgICAgICAgICAgICAgICAgICAgICAiY2hlY2sgc3lzdGVtIGxvZyIpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIGlmICghYnVzX2FwcGFybW9yX2Z1bGxfaW5pdCAoZXJyb3IpKQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICBpZiAoYnVzX2FwcGFybW9yX2VuYWJsZWQgKCkpCisgICAgeworICAgICAgLyogT25seSBwcmludCBBcHBBcm1vciBtZWRpYXRpb24gbWVzc2FnZSB3aGVuIHN5c2xvZyBzdXBwb3J0IGlzIGVuYWJsZWQgKi8KKyAgICAgIGlmIChjb250ZXh0LT5zeXNsb2cpCisgICAgICAgIGJ1c19jb250ZXh0X2xvZyAoY29udGV4dCwgREJVU19TWVNURU1fTE9HX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIkFwcEFybW9yIEQtQnVzIG1lZGlhdGlvbiBpcyBlbmFibGVkXG4iKTsKKyAgICB9CisKKyAgLyogV2hlbiBTRUxpbnV4IGlzIHVzZWQsIHRoaXMgbXVzdCBoYXBwZW4gYWZ0ZXIgYnVzX3NlbGludXhfZnVsbF9pbml0KCkKKyAgICogc28gdGhhdCBpdCBoYXMgYWNjZXNzIHRvIHRoZSBhY2Nlc3MgdmVjdG9yIGNhY2hlLCB3aGljaCBpcyByZXF1aXJlZAorICAgKiB0byBwcm9jZXNzIDxhc3NvY2lhdGUvPiBlbGVtZW50cy4KKyAgICogaHR0cDovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9hcmNoaXZlcy9kYnVzLzIwMDgtT2N0b2Jlci8wMTA0OTEuaHRtbAorICAgKi8KKyAgaWYgKCFwcm9jZXNzX2NvbmZpZ19wb3N0aW5pdCAoY29udGV4dCwgcGFyc2VyLCBlcnJvcikpCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIGlmIChwYXJzZXIgIT0gTlVMTCkKKyAgICB7CisgICAgICBidXNfY29uZmlnX3BhcnNlcl91bnJlZiAocGFyc2VyKTsKKyAgICAgIHBhcnNlciA9IE5VTEw7CisgICAgfQorCisgIGRidXNfc2VydmVyX2ZyZWVfZGF0YV9zbG90ICgmc2VydmVyX2RhdGFfc2xvdCk7CisKKyAgcmV0dXJuIGNvbnRleHQ7CisKKyBmYWlsZWQ6CisgIGlmIChwYXJzZXIgIT0gTlVMTCkKKyAgICBidXNfY29uZmlnX3BhcnNlcl91bnJlZiAocGFyc2VyKTsKKyAgaWYgKGNvbnRleHQgIT0gTlVMTCkKKyAgICBidXNfY29udGV4dF91bnJlZiAoY29udGV4dCk7CisKKyAgaWYgKHNlcnZlcl9kYXRhX3Nsb3QgPj0gMCkKKyAgICBkYnVzX3NlcnZlcl9mcmVlX2RhdGFfc2xvdCAoJnNlcnZlcl9kYXRhX3Nsb3QpOworCisgIHJldHVybiBOVUxMOworfQorCitkYnVzX2Jvb2xfdAorYnVzX2NvbnRleHRfZ2V0X2lkIChCdXNDb250ZXh0ICAgICAgICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICp1dWlkKQoreworICByZXR1cm4gX2RidXNfdXVpZF9lbmNvZGUgKCZjb250ZXh0LT51dWlkLCB1dWlkKTsKK30KKworZGJ1c19ib29sX3QKK2J1c19jb250ZXh0X3JlbG9hZF9jb25maWcgKEJ1c0NvbnRleHQgKmNvbnRleHQsCisJCQkgICBEQnVzRXJyb3IgICplcnJvcikKK3sKKyAgQnVzQ29uZmlnUGFyc2VyICpwYXJzZXI7CisgIERCdXNTdHJpbmcgY29uZmlnX2ZpbGU7CisgIGRidXNfYm9vbF90IHJldDsKKworICAvKiBGbHVzaCB0aGUgdXNlciBkYXRhYmFzZSBjYWNoZSAqLworICBfZGJ1c19mbHVzaF9jYWNoZXMgKCk7CisKKyAgcmV0ID0gRkFMU0U7CisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmY29uZmlnX2ZpbGUsIGNvbnRleHQtPmNvbmZpZ19maWxlKTsKKyAgcGFyc2VyID0gYnVzX2NvbmZpZ19sb2FkICgmY29uZmlnX2ZpbGUsIFRSVUUsIE5VTEwsIGVycm9yKTsKKyAgaWYgKHBhcnNlciA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICBpZiAoIXByb2Nlc3NfY29uZmlnX2V2ZXJ5X3RpbWUgKGNvbnRleHQsIHBhcnNlciwgVFJVRSwgZXJyb3IpKQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKyAgaWYgKCFwcm9jZXNzX2NvbmZpZ19wb3N0aW5pdCAoY29udGV4dCwgcGFyc2VyLCBlcnJvcikpCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorICByZXQgPSBUUlVFOworCisgIGJ1c19jb250ZXh0X2xvZyAoY29udGV4dCwgREJVU19TWVNURU1fTE9HX0lORk8sICJSZWxvYWRlZCBjb25maWd1cmF0aW9uIik7CisgZmFpbGVkOgorICBpZiAoIXJldCkKKyAgICBidXNfY29udGV4dF9sb2cgKGNvbnRleHQsIERCVVNfU1lTVEVNX0xPR19JTkZPLCAiVW5hYmxlIHRvIHJlbG9hZCBjb25maWd1cmF0aW9uOiAlcyIsIGVycm9yLT5tZXNzYWdlKTsKKyAgaWYgKHBhcnNlciAhPSBOVUxMKQorICAgIGJ1c19jb25maWdfcGFyc2VyX3VucmVmIChwYXJzZXIpOworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAorc2h1dGRvd25fc2VydmVyIChCdXNDb250ZXh0ICpjb250ZXh0LAorICAgICAgICAgICAgICAgICBEQnVzU2VydmVyICpzZXJ2ZXIpCit7CisgIGlmIChzZXJ2ZXIgPT0gTlVMTCB8fAorICAgICAgIWRidXNfc2VydmVyX2dldF9pc19jb25uZWN0ZWQgKHNlcnZlcikpCisgICAgcmV0dXJuOworCisgIGlmICghZGJ1c19zZXJ2ZXJfc2V0X3dhdGNoX2Z1bmN0aW9ucyAoc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJzZXR0aW5nIHdhdGNoIGZ1bmN0aW9ucyB0byBOVUxMIGZhaWxlZCIpOworCisgIGlmICghZGJ1c19zZXJ2ZXJfc2V0X3RpbWVvdXRfZnVuY3Rpb25zIChzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInNldHRpbmcgdGltZW91dCBmdW5jdGlvbnMgdG8gTlVMTCBmYWlsZWQiKTsKKworICBkYnVzX3NlcnZlcl9kaXNjb25uZWN0IChzZXJ2ZXIpOworfQorCit2b2lkCitidXNfY29udGV4dF9zaHV0ZG93biAoQnVzQ29udGV4dCAgKmNvbnRleHQpCit7CisgIERCdXNMaXN0ICpsaW5rOworCisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmY29udGV4dC0+c2VydmVycyk7CisgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgeworICAgICAgc2h1dGRvd25fc2VydmVyIChjb250ZXh0LCBsaW5rLT5kYXRhKTsKKworICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJmNvbnRleHQtPnNlcnZlcnMsIGxpbmspOworICAgIH0KK30KKworQnVzQ29udGV4dCAqCitidXNfY29udGV4dF9yZWYgKEJ1c0NvbnRleHQgKmNvbnRleHQpCit7CisgIF9kYnVzX2Fzc2VydCAoY29udGV4dC0+cmVmY291bnQgPiAwKTsKKyAgY29udGV4dC0+cmVmY291bnQgKz0gMTsKKworICByZXR1cm4gY29udGV4dDsKK30KKwordm9pZAorYnVzX2NvbnRleHRfdW5yZWYgKEJ1c0NvbnRleHQgKmNvbnRleHQpCit7CisgIF9kYnVzX2Fzc2VydCAoY29udGV4dC0+cmVmY291bnQgPiAwKTsKKyAgY29udGV4dC0+cmVmY291bnQgLT0gMTsKKworICBpZiAoY29udGV4dC0+cmVmY291bnQgPT0gMCkKKyAgICB7CisgICAgICBEQnVzTGlzdCAqbGluazsKKworICAgICAgX2RidXNfdmVyYm9zZSAoIkZpbmFsaXppbmcgYnVzIGNvbnRleHQgJXBcbiIsIGNvbnRleHQpOworCisgICAgICBidXNfY29udGV4dF9zaHV0ZG93biAoY29udGV4dCk7CisKKyAgICAgIGlmIChjb250ZXh0LT5jb25uZWN0aW9ucykKKyAgICAgICAgeworICAgICAgICAgIGJ1c19jb25uZWN0aW9uc191bnJlZiAoY29udGV4dC0+Y29ubmVjdGlvbnMpOworICAgICAgICAgIGNvbnRleHQtPmNvbm5lY3Rpb25zID0gTlVMTDsKKyAgICAgICAgfQorCisgICAgICBpZiAoY29udGV4dC0+cmVnaXN0cnkpCisgICAgICAgIHsKKyAgICAgICAgICBidXNfcmVnaXN0cnlfdW5yZWYgKGNvbnRleHQtPnJlZ2lzdHJ5KTsKKyAgICAgICAgICBjb250ZXh0LT5yZWdpc3RyeSA9IE5VTEw7CisgICAgICAgIH0KKworICAgICAgaWYgKGNvbnRleHQtPmFjdGl2YXRpb24pCisgICAgICAgIHsKKyAgICAgICAgICBidXNfYWN0aXZhdGlvbl91bnJlZiAoY29udGV4dC0+YWN0aXZhdGlvbik7CisgICAgICAgICAgY29udGV4dC0+YWN0aXZhdGlvbiA9IE5VTEw7CisgICAgICAgIH0KKworICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZjb250ZXh0LT5zZXJ2ZXJzKTsKKyAgICAgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX3NlcnZlcl91bnJlZiAobGluay0+ZGF0YSk7CisKKyAgICAgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmY29udGV4dC0+c2VydmVycywgbGluayk7CisgICAgICAgIH0KKyAgICAgIF9kYnVzX2xpc3RfY2xlYXIgKCZjb250ZXh0LT5zZXJ2ZXJzKTsKKworICAgICAgaWYgKGNvbnRleHQtPnBvbGljeSkKKyAgICAgICAgeworICAgICAgICAgIGJ1c19wb2xpY3lfdW5yZWYgKGNvbnRleHQtPnBvbGljeSk7CisgICAgICAgICAgY29udGV4dC0+cG9saWN5ID0gTlVMTDsKKyAgICAgICAgfQorCisgICAgICBpZiAoY29udGV4dC0+bG9vcCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX2xvb3BfdW5yZWYgKGNvbnRleHQtPmxvb3ApOworICAgICAgICAgIGNvbnRleHQtPmxvb3AgPSBOVUxMOworICAgICAgICB9CisKKyAgICAgIGlmIChjb250ZXh0LT5tYXRjaG1ha2VyKQorICAgICAgICB7CisgICAgICAgICAgYnVzX21hdGNobWFrZXJfdW5yZWYgKGNvbnRleHQtPm1hdGNobWFrZXIpOworICAgICAgICAgIGNvbnRleHQtPm1hdGNobWFrZXIgPSBOVUxMOworICAgICAgICB9CisKKyAgICAgIGRidXNfZnJlZSAoY29udGV4dC0+Y29uZmlnX2ZpbGUpOworICAgICAgZGJ1c19mcmVlIChjb250ZXh0LT5sb2dfcHJlZml4KTsKKyAgICAgIGRidXNfZnJlZSAoY29udGV4dC0+dHlwZSk7CisgICAgICBkYnVzX2ZyZWUgKGNvbnRleHQtPmFkZHJlc3MpOworICAgICAgZGJ1c19mcmVlIChjb250ZXh0LT51c2VyKTsKKyAgICAgIGRidXNfZnJlZSAoY29udGV4dC0+c2VydmljZWhlbHBlcik7CisKKyAgICAgIGlmIChjb250ZXh0LT5waWRmaWxlKQorCXsKKyAgICAgICAgICBEQnVzU3RyaW5nIHU7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZ1LCBjb250ZXh0LT5waWRmaWxlKTsKKworICAgICAgICAgIC8qIERlbGliZXJhdGVseSBpZ25vcmUgZXJyb3JzIGhlcmUsIHNpbmNlIHRoZXJlJ3Mgbm90IG11Y2gKKwkgICAqIHdlIGNhbiBkbyBhYm91dCBpdCwgYW5kIHdlJ3JlIGV4aXRpbmcgYW55d2F5cy4KKwkgICAqLworCSAgX2RidXNfZGVsZXRlX2ZpbGUgKCZ1LCBOVUxMKTsKKworICAgICAgICAgIGRidXNfZnJlZSAoY29udGV4dC0+cGlkZmlsZSk7CisJfQorCisgICAgICBpZiAoY29udGV4dC0+aW5pdGlhbF9mZF9saW1pdCkKKyAgICAgICAgX2RidXNfcmxpbWl0X2ZyZWUgKGNvbnRleHQtPmluaXRpYWxfZmRfbGltaXQpOworCisgICAgICBkYnVzX2ZyZWUgKGNvbnRleHQpOworCisgICAgICBkYnVzX3NlcnZlcl9mcmVlX2RhdGFfc2xvdCAoJnNlcnZlcl9kYXRhX3Nsb3QpOworICAgIH0KK30KKworLyogdHlwZSBtYXkgYmUgTlVMTCAqLworY29uc3QgY2hhcioKK2J1c19jb250ZXh0X2dldF90eXBlIChCdXNDb250ZXh0ICpjb250ZXh0KQoreworICByZXR1cm4gY29udGV4dC0+dHlwZTsKK30KKworY29uc3QgY2hhcioKK2J1c19jb250ZXh0X2dldF9hZGRyZXNzIChCdXNDb250ZXh0ICpjb250ZXh0KQoreworICByZXR1cm4gY29udGV4dC0+YWRkcmVzczsKK30KKworY29uc3QgY2hhcioKK2J1c19jb250ZXh0X2dldF9zZXJ2aWNlaGVscGVyIChCdXNDb250ZXh0ICpjb250ZXh0KQoreworICByZXR1cm4gY29udGV4dC0+c2VydmljZWhlbHBlcjsKK30KKworZGJ1c19ib29sX3QKK2J1c19jb250ZXh0X2dldF9zeXN0ZW1kX2FjdGl2YXRpb24gKEJ1c0NvbnRleHQgKmNvbnRleHQpCit7CisgIHJldHVybiBjb250ZXh0LT5zeXN0ZW1kX2FjdGl2YXRpb247Cit9CisKK0J1c1JlZ2lzdHJ5KgorYnVzX2NvbnRleHRfZ2V0X3JlZ2lzdHJ5IChCdXNDb250ZXh0ICAqY29udGV4dCkKK3sKKyAgcmV0dXJuIGNvbnRleHQtPnJlZ2lzdHJ5OworfQorCitCdXNDb25uZWN0aW9ucyoKK2J1c19jb250ZXh0X2dldF9jb25uZWN0aW9ucyAoQnVzQ29udGV4dCAgKmNvbnRleHQpCit7CisgIHJldHVybiBjb250ZXh0LT5jb25uZWN0aW9uczsKK30KKworQnVzQWN0aXZhdGlvbioKK2J1c19jb250ZXh0X2dldF9hY3RpdmF0aW9uIChCdXNDb250ZXh0ICAqY29udGV4dCkKK3sKKyAgcmV0dXJuIGNvbnRleHQtPmFjdGl2YXRpb247Cit9CisKK0J1c01hdGNobWFrZXIqCitidXNfY29udGV4dF9nZXRfbWF0Y2htYWtlciAoQnVzQ29udGV4dCAgKmNvbnRleHQpCit7CisgIHJldHVybiBjb250ZXh0LT5tYXRjaG1ha2VyOworfQorCitEQnVzTG9vcCoKK2J1c19jb250ZXh0X2dldF9sb29wIChCdXNDb250ZXh0ICpjb250ZXh0KQoreworICByZXR1cm4gY29udGV4dC0+bG9vcDsKK30KKworZGJ1c19ib29sX3QKK2J1c19jb250ZXh0X2FsbG93X3VuaXhfdXNlciAoQnVzQ29udGV4dCAgICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHVpZCkKK3sKKyAgcmV0dXJuIGJ1c19wb2xpY3lfYWxsb3dfdW5peF91c2VyIChjb250ZXh0LT5wb2xpY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkKTsKK30KKworLyogRm9yIG5vdyB0aGlzIGlzIG5ldmVyIGFjdHVhbGx5IGNhbGxlZCBiZWNhdXNlIHRoZSBkZWZhdWx0CisgKiBEQnVzQ29ubmVjdGlvbiBiZWhhdmlvciBvZiAnc2FtZSB1c2VyIHRoYXQgb3ducyB0aGUgYnVzIGNhbiBjb25uZWN0JworICogaXMgYWxsIGl0IHdvdWxkIGRvLgorICovCitkYnVzX2Jvb2xfdAorYnVzX2NvbnRleHRfYWxsb3dfd2luZG93c191c2VyIChCdXNDb250ZXh0ICAgICAgICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICp3aW5kb3dzX3NpZCkKK3sKKyAgcmV0dXJuIGJ1c19wb2xpY3lfYWxsb3dfd2luZG93c191c2VyIChjb250ZXh0LT5wb2xpY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93c19zaWQpOworfQorCitCdXNQb2xpY3kgKgorYnVzX2NvbnRleHRfZ2V0X3BvbGljeSAoQnVzQ29udGV4dCAqY29udGV4dCkKK3sKKyAgcmV0dXJuIGNvbnRleHQtPnBvbGljeTsKK30KKworQnVzQ2xpZW50UG9saWN5KgorYnVzX2NvbnRleHRfY3JlYXRlX2NsaWVudF9wb2xpY3kgKEJ1c0NvbnRleHQgICAgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICplcnJvcikKK3sKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisgIHJldHVybiBidXNfcG9saWN5X2NyZWF0ZV9jbGllbnRfcG9saWN5IChjb250ZXh0LT5wb2xpY3ksIGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2ludAorYnVzX2NvbnRleHRfZ2V0X2FjdGl2YXRpb25fdGltZW91dCAoQnVzQ29udGV4dCAqY29udGV4dCkKK3sKKworICByZXR1cm4gY29udGV4dC0+bGltaXRzLmFjdGl2YXRpb25fdGltZW91dDsKK30KKworaW50CitidXNfY29udGV4dF9nZXRfYXV0aF90aW1lb3V0IChCdXNDb250ZXh0ICpjb250ZXh0KQoreworICByZXR1cm4gY29udGV4dC0+bGltaXRzLmF1dGhfdGltZW91dDsKK30KKworaW50CitidXNfY29udGV4dF9nZXRfcGVuZGluZ19mZF90aW1lb3V0IChCdXNDb250ZXh0ICpjb250ZXh0KQoreworICByZXR1cm4gY29udGV4dC0+bGltaXRzLnBlbmRpbmdfZmRfdGltZW91dDsKK30KKworaW50CitidXNfY29udGV4dF9nZXRfbWF4X2NvbXBsZXRlZF9jb25uZWN0aW9ucyAoQnVzQ29udGV4dCAqY29udGV4dCkKK3sKKyAgcmV0dXJuIGNvbnRleHQtPmxpbWl0cy5tYXhfY29tcGxldGVkX2Nvbm5lY3Rpb25zOworfQorCitpbnQKK2J1c19jb250ZXh0X2dldF9tYXhfaW5jb21wbGV0ZV9jb25uZWN0aW9ucyAoQnVzQ29udGV4dCAqY29udGV4dCkKK3sKKyAgcmV0dXJuIGNvbnRleHQtPmxpbWl0cy5tYXhfaW5jb21wbGV0ZV9jb25uZWN0aW9uczsKK30KKworaW50CitidXNfY29udGV4dF9nZXRfbWF4X2Nvbm5lY3Rpb25zX3Blcl91c2VyIChCdXNDb250ZXh0ICpjb250ZXh0KQoreworICByZXR1cm4gY29udGV4dC0+bGltaXRzLm1heF9jb25uZWN0aW9uc19wZXJfdXNlcjsKK30KKworaW50CitidXNfY29udGV4dF9nZXRfbWF4X3BlbmRpbmdfYWN0aXZhdGlvbnMgKEJ1c0NvbnRleHQgKmNvbnRleHQpCit7CisgIHJldHVybiBjb250ZXh0LT5saW1pdHMubWF4X3BlbmRpbmdfYWN0aXZhdGlvbnM7Cit9CisKK2ludAorYnVzX2NvbnRleHRfZ2V0X21heF9zZXJ2aWNlc19wZXJfY29ubmVjdGlvbiAoQnVzQ29udGV4dCAqY29udGV4dCkKK3sKKyAgcmV0dXJuIGNvbnRleHQtPmxpbWl0cy5tYXhfc2VydmljZXNfcGVyX2Nvbm5lY3Rpb247Cit9CisKK2ludAorYnVzX2NvbnRleHRfZ2V0X21heF9tYXRjaF9ydWxlc19wZXJfY29ubmVjdGlvbiAoQnVzQ29udGV4dCAqY29udGV4dCkKK3sKKyAgcmV0dXJuIGNvbnRleHQtPmxpbWl0cy5tYXhfbWF0Y2hfcnVsZXNfcGVyX2Nvbm5lY3Rpb247Cit9CisKK2ludAorYnVzX2NvbnRleHRfZ2V0X21heF9yZXBsaWVzX3Blcl9jb25uZWN0aW9uIChCdXNDb250ZXh0ICpjb250ZXh0KQoreworICByZXR1cm4gY29udGV4dC0+bGltaXRzLm1heF9yZXBsaWVzX3Blcl9jb25uZWN0aW9uOworfQorCitpbnQKK2J1c19jb250ZXh0X2dldF9yZXBseV90aW1lb3V0IChCdXNDb250ZXh0ICpjb250ZXh0KQoreworICByZXR1cm4gY29udGV4dC0+bGltaXRzLnJlcGx5X3RpbWVvdXQ7Cit9CisKK0RCdXNSTGltaXQgKgorYnVzX2NvbnRleHRfZ2V0X2luaXRpYWxfZmRfbGltaXQgKEJ1c0NvbnRleHQgKmNvbnRleHQpCit7CisgIHJldHVybiBjb250ZXh0LT5pbml0aWFsX2ZkX2xpbWl0OworfQorCitkYnVzX2Jvb2xfdAorYnVzX2NvbnRleHRfZ2V0X3VzaW5nX3N5c2xvZyAoQnVzQ29udGV4dCAqY29udGV4dCkKK3sKKyAgcmV0dXJuIGNvbnRleHQtPnN5c2xvZzsKK30KKwordm9pZAorYnVzX2NvbnRleHRfbG9nIChCdXNDb250ZXh0ICpjb250ZXh0LCBEQnVzU3lzdGVtTG9nU2V2ZXJpdHkgc2V2ZXJpdHksIGNvbnN0IGNoYXIgKm1zZywgLi4uKQoreworICB2YV9saXN0IGFyZ3M7CisKKyAgdmFfc3RhcnQgKGFyZ3MsIG1zZyk7CisKKyAgaWYgKGNvbnRleHQtPmxvZ19wcmVmaXgpCisgICAgeworICAgICAgREJ1c1N0cmluZyBmdWxsX21zZzsKKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmZ1bGxfbXNnKSkKKyAgICAgICAgZ290byBvdXQ7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZmdWxsX21zZywgY29udGV4dC0+bG9nX3ByZWZpeCkpCisgICAgICAgIGdvdG8gb29tX291dDsKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9wcmludGZfdmFsaXN0ICgmZnVsbF9tc2csIG1zZywgYXJncykpCisgICAgICAgIGdvdG8gb29tX291dDsKKworICAgICAgX2RidXNfbG9nIChzZXZlcml0eSwgIiVzIiwgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmZnVsbF9tc2cpKTsKKyAgICBvb21fb3V0OgorICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmdWxsX21zZyk7CisgICAgfQorICBlbHNlCisgICAgX2RidXNfbG9ndiAoc2V2ZXJpdHksIG1zZywgYXJncyk7CisKK291dDoKKyAgdmFfZW5kIChhcmdzKTsKK30KKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyICoKK25vbm51bGwgKGNvbnN0IGNoYXIgKm1heWJlX251bGwsCisgICAgICAgICBjb25zdCBjaGFyICppZl9udWxsKQoreworICByZXR1cm4gKG1heWJlX251bGwgPyBtYXliZV9udWxsIDogaWZfbnVsbCk7Cit9CisKK3ZvaWQKK2J1c19jb250ZXh0X2xvZ19saXRlcmFsIChCdXNDb250ZXh0ICAgICAgICAgICAgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N5c3RlbUxvZ1NldmVyaXR5ICBzZXZlcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAgICAgKm1zZykKK3sKKyAgX2RidXNfbG9nIChzZXZlcml0eSwgIiVzJXMiLCBub25udWxsIChjb250ZXh0LT5sb2dfcHJlZml4LCAiIiksIG1zZyk7Cit9CisKK3ZvaWQKK2J1c19jb250ZXh0X2xvZ19hbmRfc2V0X2Vycm9yIChCdXNDb250ZXh0ICAgICAgICAgICAgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N5c3RlbUxvZ1NldmVyaXR5ICBzZXZlcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAgICAgKmVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICAgICAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAgICAgKm1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4pCit7CisgIERCdXNFcnJvciBzdGFja19lcnJvciA9IERCVVNfRVJST1JfSU5JVDsKKyAgdmFfbGlzdCBhcmdzOworCisgIHZhX3N0YXJ0IChhcmdzLCBtc2cpOworICBfZGJ1c19zZXRfZXJyb3JfdmFsaXN0ICgmc3RhY2tfZXJyb3IsIG5hbWUsIG1zZywgYXJncyk7CisgIHZhX2VuZCAoYXJncyk7CisKKyAgLyogSWYgd2UgaGl0IE9PTSB3aGlsZSBzZXR0aW5nIHRoZSBlcnJvciwgdGhpcyB3aWxsIHN5c2xvZyAib3V0IG9mIG1lbW9yeSIKKyAgICogd2hpY2ggaXMgaXRzZWxmIGFuIGluZGljYXRpb24gdGhhdCBzb21ldGhpbmcgaXMgc2VyaW91c2x5IHdyb25nICovCisgIGJ1c19jb250ZXh0X2xvZ19saXRlcmFsIChjb250ZXh0LCBEQlVTX1NZU1RFTV9MT0dfU0VDVVJJVFksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFja19lcnJvci5tZXNzYWdlKTsKKworICBkYnVzX21vdmVfZXJyb3IgKCZzdGFja19lcnJvciwgZXJyb3IpOworfQorCisvKgorICogTG9nIHNvbWV0aGluZyBhYm91dCBhIG1lc3NhZ2UsIHVzdWFsbHkgdGhhdCBpdCB3YXMgcmVqZWN0ZWQuCisgKi8KK3N0YXRpYyB2b2lkCitjb21wbGFpbl9hYm91dF9tZXNzYWdlIChCdXNDb250ZXh0ICAgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICplcnJvcl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKmNvbXBsYWludCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBtYXRjaGVkX3J1bGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqc2VuZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKnByb3Bvc2VkX3JlY2lwaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICByZXF1ZXN0ZWRfcmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgbG9nLAorICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBEQnVzRXJyb3Igc3RhY2tfZXJyb3IgPSBEQlVTX0VSUk9SX0lOSVQ7CisgIGNvbnN0IGNoYXIgKnNlbmRlcl9uYW1lOworICBjb25zdCBjaGFyICpzZW5kZXJfbG9naW5mbzsKKyAgY29uc3QgY2hhciAqcHJvcG9zZWRfcmVjaXBpZW50X2xvZ2luZm87CisKKyAgaWYgKGVycm9yID09IE5VTEwgJiYgIWxvZykKKyAgICByZXR1cm47CisKKyAgaWYgKHNlbmRlciAhPSBOVUxMKQorICAgIHsKKyAgICAgIHNlbmRlcl9uYW1lID0gYnVzX2Nvbm5lY3Rpb25fZ2V0X25hbWUgKHNlbmRlcik7CisgICAgICBzZW5kZXJfbG9naW5mbyA9IGJ1c19jb25uZWN0aW9uX2dldF9sb2dpbmZvIChzZW5kZXIpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHNlbmRlcl9uYW1lID0gIih1bnNldCkiOworICAgICAgc2VuZGVyX2xvZ2luZm8gPSAiKGJ1cykiOworICAgIH0KKworICBpZiAocHJvcG9zZWRfcmVjaXBpZW50ICE9IE5VTEwpCisgICAgcHJvcG9zZWRfcmVjaXBpZW50X2xvZ2luZm8gPSBidXNfY29ubmVjdGlvbl9nZXRfbG9naW5mbyAocHJvcG9zZWRfcmVjaXBpZW50KTsKKyAgZWxzZQorICAgIHByb3Bvc2VkX3JlY2lwaWVudF9sb2dpbmZvID0gImJ1cyI7CisKKyAgZGJ1c19zZXRfZXJyb3IgKCZzdGFja19lcnJvciwgZXJyb3JfbmFtZSwKKyAgICAgICIlcywgJWQgbWF0Y2hlZCBydWxlczsgdHlwZT1cIiVzXCIsIHNlbmRlcj1cIiVzXCIgKCVzKSAiCisgICAgICAiaW50ZXJmYWNlPVwiJXNcIiBtZW1iZXI9XCIlc1wiIGVycm9yIG5hbWU9XCIlc1wiICIKKyAgICAgICJyZXF1ZXN0ZWRfcmVwbHk9XCIlZFwiIGRlc3RpbmF0aW9uPVwiJXNcIiAoJXMpIiwKKyAgICAgIGNvbXBsYWludCwKKyAgICAgIG1hdGNoZWRfcnVsZXMsCisgICAgICBkYnVzX21lc3NhZ2VfdHlwZV90b19zdHJpbmcgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkpLAorICAgICAgc2VuZGVyX25hbWUsCisgICAgICBzZW5kZXJfbG9naW5mbywKKyAgICAgIG5vbm51bGwgKGRidXNfbWVzc2FnZV9nZXRfaW50ZXJmYWNlIChtZXNzYWdlKSwgIih1bnNldCkiKSwKKyAgICAgIG5vbm51bGwgKGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKSwgIih1bnNldCkiKSwKKyAgICAgIG5vbm51bGwgKGRidXNfbWVzc2FnZV9nZXRfZXJyb3JfbmFtZSAobWVzc2FnZSksICIodW5zZXQpIiksCisgICAgICByZXF1ZXN0ZWRfcmVwbHksCisgICAgICBub25udWxsIChkYnVzX21lc3NhZ2VfZ2V0X2Rlc3RpbmF0aW9uIChtZXNzYWdlKSwgREJVU19TRVJWSUNFX0RCVVMpLAorICAgICAgcHJvcG9zZWRfcmVjaXBpZW50X2xvZ2luZm8pOworCisgIC8qIElmIHdlIGhpdCBPT00gd2hpbGUgc2V0dGluZyB0aGUgZXJyb3IsIHRoaXMgd2lsbCBzeXNsb2cgIm91dCBvZiBtZW1vcnkiCisgICAqIHdoaWNoIGlzIGl0c2VsZiBhbiBpbmRpY2F0aW9uIHRoYXQgc29tZXRoaW5nIGlzIHNlcmlvdXNseSB3cm9uZyAqLworICBpZiAobG9nKQorICAgIGJ1c19jb250ZXh0X2xvZ19saXRlcmFsIChjb250ZXh0LCBEQlVTX1NZU1RFTV9MT0dfU0VDVVJJVFksCisgICAgICAgIHN0YWNrX2Vycm9yLm1lc3NhZ2UpOworCisgIGRidXNfbW92ZV9lcnJvciAoJnN0YWNrX2Vycm9yLCBlcnJvcik7Cit9CisKKy8qCisgKiBhZGRyZXNzZWRfcmVjaXBpZW50IGlzIHRoZSByZWNpcGllbnQgc3BlY2lmaWVkIGluIHRoZSBtZXNzYWdlLgorICoKKyAqIHByb3Bvc2VkX3JlY2lwaWVudCBpcyB0aGUgcmVjaXBpZW50IHdlJ3JlIGNvbnNpZGVyaW5nIHNlbmRpbmcKKyAqIHRvIHJpZ2h0IHRoaXMgc2Vjb25kLCBhbmQgbWF5IGJlIGFuIGVhdmVzZHJvcHBlci4KKyAqCisgKiBzZW5kZXIgaXMgdGhlIHNlbmRlciBvZiB0aGUgbWVzc2FnZS4KKyAqCisgKiBOVUxMIGZvciBzZW5kZXIgZGVmaW5pdGVseSBtZWFucyB0aGUgYnVzIGRyaXZlci4KKyAqCisgKiBOVUxMIGZvciBwcm9wb3NlZF9yZWNpcGllbnQgbWF5IG1lYW4gdGhlIGJ1cyBkcml2ZXIsIG9yIG1heSBtZWFuCisgKiB3ZSBhcmUgY2hlY2tpbmcgd2hldGhlciBzZXJ2aWNlLWFjdGl2YXRpb24gaXMgYWxsb3dlZCBhcyBhIGZpcnN0CisgKiBwYXNzIGJlZm9yZSBhbGwgZGV0YWlscyBvZiB0aGUgYWN0aXZhdGVkIHNlcnZpY2UgYXJlIGtub3duLgorICoKKyAqIE5VTEwgZm9yIGFkZHJlc3NlZF9yZWNpcGllbnQgbWF5IG1lYW4gdGhlIGJ1cyBkcml2ZXIsIG9yIG1heSBtZWFuCisgKiBubyBkZXN0aW5hdGlvbiB3YXMgc3BlY2lmaWVkIGluIHRoZSBtZXNzYWdlIChlLmcuIGEgc2lnbmFsKS4KKyAqLworZGJ1c19ib29sX3QKK2J1c19jb250ZXh0X2NoZWNrX3NlY3VyaXR5X3BvbGljeSAoQnVzQ29udGV4dCAgICAgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKnNlbmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmFkZHJlc3NlZF9yZWNpcGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpwcm9wb3NlZF9yZWNpcGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNBY3RpdmF0aW9uRW50cnkgKmFjdGl2YXRpb25fZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgY29uc3QgY2hhciAqc3JjLCAqZGVzdDsKKyAgQnVzQ2xpZW50UG9saWN5ICpzZW5kZXJfcG9saWN5OworICBCdXNDbGllbnRQb2xpY3kgKnJlY2lwaWVudF9wb2xpY3k7CisgIGRidXNfaW50MzJfdCB0b2dnbGVzOworICBkYnVzX2Jvb2xfdCBsb2c7CisgIGludCB0eXBlOworICBkYnVzX2Jvb2xfdCByZXF1ZXN0ZWRfcmVwbHk7CisKKyAgdHlwZSA9IGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSk7CisgIHNyYyA9IGRidXNfbWVzc2FnZV9nZXRfc2VuZGVyIChtZXNzYWdlKTsKKyAgZGVzdCA9IGRidXNfbWVzc2FnZV9nZXRfZGVzdGluYXRpb24gKG1lc3NhZ2UpOworCisgIC8qIGRpc3BhdGNoLmMgd2FzIHN1cHBvc2VkIHRvIGVuc3VyZSB0aGVzZSBpbnZhcmlhbnRzICovCisgIF9kYnVzX2Fzc2VydCAoZGVzdCAhPSBOVUxMIHx8CisgICAgICAgICAgICAgICAgdHlwZSA9PSBEQlVTX01FU1NBR0VfVFlQRV9TSUdOQUwgfHwKKyAgICAgICAgICAgICAgICAoc2VuZGVyID09IE5VTEwgJiYgIWJ1c19jb25uZWN0aW9uX2lzX2FjdGl2ZSAocHJvcG9zZWRfcmVjaXBpZW50KSkpOworICBfZGJ1c19hc3NlcnQgKHR5cGUgPT0gREJVU19NRVNTQUdFX1RZUEVfU0lHTkFMIHx8CisgICAgICAgICAgICAgICAgYWRkcmVzc2VkX3JlY2lwaWVudCAhPSBOVUxMIHx8CisgICAgICAgICAgICAgICAgYWN0aXZhdGlvbl9lbnRyeSAhPSBOVUxMIHx8CisgICAgICAgICAgICAgICAgc3RyY21wIChkZXN0LCBEQlVTX1NFUlZJQ0VfREJVUykgPT0gMCk7CisKKyAgc3dpdGNoICh0eXBlKQorICAgIHsKKyAgICBjYXNlIERCVVNfTUVTU0FHRV9UWVBFX01FVEhPRF9DQUxMOgorICAgIGNhc2UgREJVU19NRVNTQUdFX1RZUEVfU0lHTkFMOgorICAgIGNhc2UgREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX1JFVFVSTjoKKyAgICBjYXNlIERCVVNfTUVTU0FHRV9UWVBFX0VSUk9SOgorICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgX2RidXNfdmVyYm9zZSAoInNlY3VyaXR5IGNoZWNrIGRpc2FsbG93aW5nIG1lc3NhZ2Ugb2YgdW5rbm93biB0eXBlICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgdHlwZSk7CisKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9BQ0NFU1NfREVOSUVELAorICAgICAgICAgICAgICAgICAgICAgICJNZXNzYWdlIGJ1cyB3aWxsIG5vdCBhY2NlcHQgbWVzc2FnZXMgb2YgdW5rbm93biB0eXBlXG4iKTsKKworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICByZXF1ZXN0ZWRfcmVwbHkgPSBGQUxTRTsKKworICBpZiAoc2VuZGVyICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKGJ1c19jb25uZWN0aW9uX2lzX2FjdGl2ZSAoc2VuZGVyKSkKKyAgICAgICAgeworICAgICAgICAgIHNlbmRlcl9wb2xpY3kgPSBidXNfY29ubmVjdGlvbl9nZXRfcG9saWN5IChzZW5kZXIpOworICAgICAgICAgIF9kYnVzX2Fzc2VydCAoc2VuZGVyX3BvbGljeSAhPSBOVUxMKTsKKworICAgICAgICAgIC8qIEZpbGwgaW4gcmVxdWVzdGVkX3JlcGx5IHZhcmlhYmxlIHdpdGggVFJVRSBpZiB0aGlzIGlzIGEKKyAgICAgICAgICAgKiByZXBseSBhbmQgdGhlIHJlcGx5IHdhcyBwZW5kaW5nLgorICAgICAgICAgICAqLworICAgICAgICAgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X3JlcGx5X3NlcmlhbCAobWVzc2FnZSkgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKHByb3Bvc2VkX3JlY2lwaWVudCAhPSBOVUxMIC8qIG5vdCB0byB0aGUgYnVzIGRyaXZlciAqLyAmJgorICAgICAgICAgICAgICAgICAgYWRkcmVzc2VkX3JlY2lwaWVudCA9PSBwcm9wb3NlZF9yZWNpcGllbnQgLyogbm90IGVhdmVzZHJvcHBpbmcgKi8pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yIGVycm9yMjsKKworICAgICAgICAgICAgICAgICAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IyKTsKKyAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZF9yZXBseSA9IGJ1c19jb25uZWN0aW9uc19jaGVja19yZXBseSAoYnVzX2Nvbm5lY3Rpb25fZ2V0X2Nvbm5lY3Rpb25zIChzZW5kZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZGVyLCBhZGRyZXNzZWRfcmVjaXBpZW50LCBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IyKTsKKyAgICAgICAgICAgICAgICAgIGlmIChkYnVzX2Vycm9yX2lzX3NldCAoJmVycm9yMikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICBkYnVzX21vdmVfZXJyb3IgKCZlcnJvcjIsIGVycm9yKTsKKyAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHNlbmRlcl9wb2xpY3kgPSBOVUxMOworICAgICAgICB9CisKKyAgICAgIC8qIEZpcnN0IHZlcmlmeSB0aGUgU0VMaW51eCBhY2Nlc3MgY29udHJvbHMuICBJZiBhbGxvd2VkIHRoZW4KKyAgICAgICAqIGdvIG9uIHdpdGggdGhlIHN0YW5kYXJkIGNoZWNrcy4KKyAgICAgICAqLworICAgICAgaWYgKCFidXNfc2VsaW51eF9hbGxvd3Nfc2VuZCAoc2VuZGVyLCBwcm9wb3NlZF9yZWNpcGllbnQsCisJCQkJICAgIGRidXNfbWVzc2FnZV90eXBlX3RvX3N0cmluZyAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlKSksCisJCQkJICAgIGRidXNfbWVzc2FnZV9nZXRfaW50ZXJmYWNlIChtZXNzYWdlKSwKKwkJCQkgICAgZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKG1lc3NhZ2UpLAorCQkJCSAgICBkYnVzX21lc3NhZ2VfZ2V0X2Vycm9yX25hbWUgKG1lc3NhZ2UpLAorCQkJCSAgICBkZXN0ID8gZGVzdCA6IERCVVNfU0VSVklDRV9EQlVTLAorCQkJCSAgICBhY3RpdmF0aW9uX2VudHJ5LAorCQkJCSAgICBlcnJvcikpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoZXJyb3IgIT0gTlVMTCAmJiAhZGJ1c19lcnJvcl9pc19zZXQgKGVycm9yKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogZG9uJ3Qgc3lzbG9nIHRoaXMsIGp1c3Qgc2V0IHRoZSBlcnJvcjogYXZjX2hhc19wZXJtIHNob3VsZAorICAgICAgICAgICAgICAgKiBoYXZlIGFscmVhZHkgd3JpdHRlbiB0byBlaXRoZXIgdGhlIGF1ZGl0IGxvZyBvciBzeXNsb2cgKi8KKyAgICAgICAgICAgICAgY29tcGxhaW5fYWJvdXRfbWVzc2FnZSAoY29udGV4dCwgREJVU19FUlJPUl9BQ0NFU1NfREVOSUVELAorICAgICAgICAgICAgICAgICAgIkFuIFNFTGludXggcG9saWN5IHByZXZlbnRzIHRoaXMgc2VuZGVyIGZyb20gc2VuZGluZyB0aGlzICIKKyAgICAgICAgICAgICAgICAgICJtZXNzYWdlIHRvIHRoaXMgcmVjaXBpZW50IiwKKyAgICAgICAgICAgICAgICAgIDAsIG1lc3NhZ2UsIHNlbmRlciwgcHJvcG9zZWRfcmVjaXBpZW50LCBGQUxTRSwgRkFMU0UsIGVycm9yKTsKKyAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIlNFTGludXggc2VjdXJpdHkgY2hlY2sgZGVueWluZyBzZW5kIHRvIHNlcnZpY2VcbiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIC8qIG5leHQgdmVyaWZ5IEFwcEFybW9yIGFjY2VzcyBjb250cm9scy4gIElmIGFsbG93ZWQgdGhlbgorICAgICAgICogZ28gb24gd2l0aCB0aGUgc3RhbmRhcmQgY2hlY2tzLgorICAgICAgICovCisgICAgICBpZiAoIWJ1c19hcHBhcm1vcl9hbGxvd3Nfc2VuZCAoc2VuZGVyLCBwcm9wb3NlZF9yZWNpcGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkX3JlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1c19jb250ZXh0X2dldF90eXBlIChjb250ZXh0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKG1lc3NhZ2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfcGF0aCAobWVzc2FnZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG1lc3NhZ2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X2Vycm9yX25hbWUgKG1lc3NhZ2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3QgPyBkZXN0IDogREJVU19TRVJWSUNFX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjID8gc3JjIDogREJVU19TRVJWSUNFX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZhdGlvbl9lbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgaWYgKCFidXNfY29ubmVjdGlvbl9pc19hY3RpdmUgKHNlbmRlcikpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBQb2xpY3kgZm9yIGluYWN0aXZlIGNvbm5lY3Rpb25zIGlzIHRoYXQgdGhleSBjYW4gb25seSBzZW5kCisgICAgICAgICAgICogdGhlIGhlbGxvIG1lc3NhZ2UgdG8gdGhlIGJ1cyBkcml2ZXIKKyAgICAgICAgICAgKi8KKyAgICAgICAgICBpZiAocHJvcG9zZWRfcmVjaXBpZW50ID09IE5VTEwgJiYKKyAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2lzX21ldGhvZF9jYWxsIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSU5URVJGQUNFX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlbGxvIikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJzZWN1cml0eSBjaGVjayBhbGxvd2luZyAlcyBtZXNzYWdlXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVsbG8iKTsKKyAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgic2VjdXJpdHkgY2hlY2sgZGlzYWxsb3dpbmcgbm9uLSVzIG1lc3NhZ2VcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWxsbyIpOworCisgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9BQ0NFU1NfREVOSUVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNsaWVudCB0cmllZCB0byBzZW5kIGEgbWVzc2FnZSBvdGhlciB0aGFuICVzIHdpdGhvdXQgYmVpbmcgcmVnaXN0ZXJlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVsbG8iKTsKKworICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBzZW5kZXJfcG9saWN5ID0gTlVMTDsKKworICAgICAgLyogSWYgdGhlIHNlbmRlciBpcyB0aGUgYnVzIGRyaXZlciwgd2UgYXNzdW1lIGFueSByZXBseSB3YXMgYQorICAgICAgICogcmVxdWVzdGVkIHJlcGx5IGFzIGJ1cyBkcml2ZXIgd29uJ3Qgc2VuZCBib2d1cyBvbmVzCisgICAgICAgKi8KKyAgICAgIGlmIChhZGRyZXNzZWRfcmVjaXBpZW50ID09IHByb3Bvc2VkX3JlY2lwaWVudCAvKiBub3QgZWF2ZXNkcm9wcGluZyAqLyAmJgorICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfcmVwbHlfc2VyaWFsIChtZXNzYWdlKSAhPSAwKQorICAgICAgICByZXF1ZXN0ZWRfcmVwbHkgPSBUUlVFOworICAgIH0KKworICBfZGJ1c19hc3NlcnQgKChzZW5kZXIgIT0gTlVMTCAmJiBzZW5kZXJfcG9saWN5ICE9IE5VTEwpIHx8CisgICAgICAgICAgICAgICAgKHNlbmRlciA9PSBOVUxMICYmIHNlbmRlcl9wb2xpY3kgPT0gTlVMTCkpOworCisgIGlmIChwcm9wb3NlZF9yZWNpcGllbnQgIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBvbmx5IHRoZSBidXMgZHJpdmVyIGNhbiBzZW5kIHRvIGFuIGluYWN0aXZlIHJlY2lwaWVudCAoYXMgaXQKKyAgICAgICAqIG93bnMgbm8gc2VydmljZXMsIHNvIG90aGVyIGFwcHMgY2FuJ3QgYWRkcmVzcyBpdCkuIEluYWN0aXZlCisgICAgICAgKiByZWNpcGllbnRzIGNhbiByZWNlaXZlIGFueSBtZXNzYWdlLgorICAgICAgICovCisgICAgICBpZiAoYnVzX2Nvbm5lY3Rpb25faXNfYWN0aXZlIChwcm9wb3NlZF9yZWNpcGllbnQpKQorICAgICAgICB7CisgICAgICAgICAgcmVjaXBpZW50X3BvbGljeSA9IGJ1c19jb25uZWN0aW9uX2dldF9wb2xpY3kgKHByb3Bvc2VkX3JlY2lwaWVudCk7CisgICAgICAgICAgX2RidXNfYXNzZXJ0IChyZWNpcGllbnRfcG9saWN5ICE9IE5VTEwpOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChzZW5kZXIgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJzZWN1cml0eSBjaGVjayB1c2luZyBOVUxMIHJlY2lwaWVudCBwb2xpY3kgZm9yIG1lc3NhZ2UgZnJvbSBidXNcbiIpOworICAgICAgICAgIHJlY2lwaWVudF9wb2xpY3kgPSBOVUxMOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJhIG1lc3NhZ2Ugd2FzIHNvbWVob3cgc2VudCB0byBhbiBpbmFjdGl2ZSByZWNpcGllbnQgZnJvbSBhIHNvdXJjZSBvdGhlciB0aGFuIHRoZSBtZXNzYWdlIGJ1cyIpOworICAgICAgICAgIHJlY2lwaWVudF9wb2xpY3kgPSBOVUxMOworICAgICAgICB9CisgICAgfQorICBlbHNlCisgICAgcmVjaXBpZW50X3BvbGljeSA9IE5VTEw7CisKKyAgX2RidXNfYXNzZXJ0ICgocHJvcG9zZWRfcmVjaXBpZW50ICE9IE5VTEwgJiYgcmVjaXBpZW50X3BvbGljeSAhPSBOVUxMKSB8fAorICAgICAgICAgICAgICAgIChwcm9wb3NlZF9yZWNpcGllbnQgIT0gTlVMTCAmJiBzZW5kZXIgPT0gTlVMTCAmJiByZWNpcGllbnRfcG9saWN5ID09IE5VTEwpIHx8CisgICAgICAgICAgICAgICAgKHByb3Bvc2VkX3JlY2lwaWVudCA9PSBOVUxMICYmIHJlY2lwaWVudF9wb2xpY3kgPT0gTlVMTCkpOworCisgIGxvZyA9IEZBTFNFOworICBpZiAoc2VuZGVyX3BvbGljeSAmJgorICAgICAgIWJ1c19jbGllbnRfcG9saWN5X2NoZWNrX2Nhbl9zZW5kIChzZW5kZXJfcG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5yZWdpc3RyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkX3JlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wb3NlZF9yZWNpcGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsICZ0b2dnbGVzLCAmbG9nKSkKKyAgICB7CisgICAgICBjb21wbGFpbl9hYm91dF9tZXNzYWdlIChjb250ZXh0LCBEQlVTX0VSUk9SX0FDQ0VTU19ERU5JRUQsCisgICAgICAgICAgIlJlamVjdGVkIHNlbmQgbWVzc2FnZSIsIHRvZ2dsZXMsCisgICAgICAgICAgbWVzc2FnZSwgc2VuZGVyLCBwcm9wb3NlZF9yZWNpcGllbnQsIHJlcXVlc3RlZF9yZXBseSwKKyAgICAgICAgICAoYWRkcmVzc2VkX3JlY2lwaWVudCA9PSBwcm9wb3NlZF9yZWNpcGllbnQpLCBlcnJvcik7CisgICAgICBfZGJ1c192ZXJib3NlICgic2VjdXJpdHkgcG9saWN5IGRpc2FsbG93aW5nIG1lc3NhZ2UgZHVlIHRvIHNlbmRlciBwb2xpY3lcbiIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAobG9nKQorICAgIHsKKyAgICAgIC8qIFdlIHdhbnQgdG8gZHJvcCB0aGlzIG1lc3NhZ2UsIGFuZCBhcmUgb25seSBub3QgZG9pbmcgc28gZm9yIGJhY2t3YXJkcworICAgICAgICogY29tcGF0aWJpbGl0eS4gKi8KKyAgICAgIGNvbXBsYWluX2Fib3V0X21lc3NhZ2UgKGNvbnRleHQsIERCVVNfRVJST1JfQUNDRVNTX0RFTklFRCwKKyAgICAgICAgICAiV291bGQgcmVqZWN0IG1lc3NhZ2UiLCB0b2dnbGVzLAorICAgICAgICAgIG1lc3NhZ2UsIHNlbmRlciwgcHJvcG9zZWRfcmVjaXBpZW50LCByZXF1ZXN0ZWRfcmVwbHksCisgICAgICAgICAgVFJVRSwgTlVMTCk7CisgICAgfQorCisgIGlmIChyZWNpcGllbnRfcG9saWN5ICYmCisgICAgICAhYnVzX2NsaWVudF9wb2xpY3lfY2hlY2tfY2FuX3JlY2VpdmUgKHJlY2lwaWVudF9wb2xpY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQtPnJlZ2lzdHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRfcmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc2VkX3JlY2lwaWVudCwgcHJvcG9zZWRfcmVjaXBpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLCAmdG9nZ2xlcykpCisgICAgeworICAgICAgY29tcGxhaW5fYWJvdXRfbWVzc2FnZSAoY29udGV4dCwgREJVU19FUlJPUl9BQ0NFU1NfREVOSUVELAorICAgICAgICAgICJSZWplY3RlZCByZWNlaXZlIG1lc3NhZ2UiLCB0b2dnbGVzLAorICAgICAgICAgIG1lc3NhZ2UsIHNlbmRlciwgcHJvcG9zZWRfcmVjaXBpZW50LCByZXF1ZXN0ZWRfcmVwbHksCisgICAgICAgICAgKGFkZHJlc3NlZF9yZWNpcGllbnQgPT0gcHJvcG9zZWRfcmVjaXBpZW50KSwgZXJyb3IpOworICAgICAgX2RidXNfdmVyYm9zZSAoInNlY3VyaXR5IHBvbGljeSBkaXNhbGxvd2luZyBtZXNzYWdlIGR1ZSB0byByZWNpcGllbnQgcG9saWN5XG4iKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgLyogU2VlIGlmIGxpbWl0cyBvbiBzaXplIGhhdmUgYmVlbiBleGNlZWRlZCAqLworICBpZiAocHJvcG9zZWRfcmVjaXBpZW50ICYmCisgICAgICAoKGRidXNfY29ubmVjdGlvbl9nZXRfb3V0Z29pbmdfc2l6ZSAocHJvcG9zZWRfcmVjaXBpZW50KSA+IGNvbnRleHQtPmxpbWl0cy5tYXhfb3V0Z29pbmdfYnl0ZXMpIHx8CisgICAgICAgKGRidXNfY29ubmVjdGlvbl9nZXRfb3V0Z29pbmdfdW5peF9mZHMgKHByb3Bvc2VkX3JlY2lwaWVudCkgPiBjb250ZXh0LT5saW1pdHMubWF4X291dGdvaW5nX3VuaXhfZmRzKSkpCisgICAgeworICAgICAgY29tcGxhaW5fYWJvdXRfbWVzc2FnZSAoY29udGV4dCwgREJVU19FUlJPUl9MSU1JVFNfRVhDRUVERUQsCisgICAgICAgICAgIlJlamVjdGVkOiBkZXN0aW5hdGlvbiBoYXMgYSBmdWxsIG1lc3NhZ2UgcXVldWUiLAorICAgICAgICAgIDAsIG1lc3NhZ2UsIHNlbmRlciwgcHJvcG9zZWRfcmVjaXBpZW50LCByZXF1ZXN0ZWRfcmVwbHksIFRSVUUsCisgICAgICAgICAgZXJyb3IpOworICAgICAgX2RidXNfdmVyYm9zZSAoInNlY3VyaXR5IHBvbGljeSBkaXNhbGxvd2luZyBtZXNzYWdlIGR1ZSB0byBmdWxsIG1lc3NhZ2UgcXVldWVcbiIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAvKiBSZWNvcmQgdGhhdCB3ZSB3aWxsIGFsbG93IGEgcmVwbHkgaGVyZSBpbiB0aGUgZnV0dXJlIChkb24ndAorICAgKiBib3RoZXIgaWYgdGhlIHJlY2lwaWVudCBpcyB0aGUgYnVzIG9yIHRoaXMgaXMgYW4gZWF2ZXNkcm9wcGluZworICAgKiBjb25uZWN0aW9uKS4gT25seSB0aGUgYWRkcmVzc2VkIHJlY2lwaWVudCBtYXkgcmVwbHkuCisgICAqCisgICAqIFRoaXMgaXNuJ3QgZG9uZSBmb3IgYWN0aXZhdGlvbiBhdHRlbXB0cyBiZWNhdXNlIHRoZXkgaGF2ZSBubyBhZGRyZXNzZWQKKyAgICogb3IgcHJvcG9zZWQgcmVjaXBpZW50OyB3aGVuIHdlIGNoZWNrIHdoZXRoZXIgdG8gYWN0dWFsbHkgZGVsaXZlciB0aGUKKyAgICogbWVzc2FnZSwgbGF0ZXIsIHdlJ2xsIHJlY29yZCB0aGUgcmVwbHkgZXhwZWN0YXRpb24gYXQgdGhhdCBwb2ludC4KKyAgICovCisgIGlmICh0eXBlID09IERCVVNfTUVTU0FHRV9UWVBFX01FVEhPRF9DQUxMICYmCisgICAgICBzZW5kZXIgJiYKKyAgICAgIGFkZHJlc3NlZF9yZWNpcGllbnQgJiYKKyAgICAgIGFkZHJlc3NlZF9yZWNpcGllbnQgPT0gcHJvcG9zZWRfcmVjaXBpZW50ICYmIC8qIG5vdCBlYXZlc2Ryb3BwaW5nICovCisgICAgICAhYnVzX2Nvbm5lY3Rpb25zX2V4cGVjdF9yZXBseSAoYnVzX2Nvbm5lY3Rpb25fZ2V0X2Nvbm5lY3Rpb25zIChzZW5kZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRlciwgYWRkcmVzc2VkX3JlY2lwaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLCBlcnJvcikpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIkZhaWxlZCB0byByZWNvcmQgcmVwbHkgZXhwZWN0YXRpb24gb3IgcHJvYmxlbSB3aXRoIHRoZSBtZXNzYWdlIGV4cGVjdGluZyBhIHJlcGx5XG4iKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgX2RidXNfdmVyYm9zZSAoInNlY3VyaXR5IHBvbGljeSBhbGxvd2luZyBtZXNzYWdlXG4iKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3ZvaWQKK2J1c19jb250ZXh0X2NoZWNrX2FsbF93YXRjaGVzIChCdXNDb250ZXh0ICpjb250ZXh0KQoreworICBEQnVzTGlzdCAqbGluazsKKyAgZGJ1c19ib29sX3QgZW5hYmxlZCA9IFRSVUU7CisKKyAgaWYgKGJ1c19jb25uZWN0aW9uc19nZXRfbl9pbmNvbXBsZXRlIChjb250ZXh0LT5jb25uZWN0aW9ucykgPj0KKyAgICAgIGJ1c19jb250ZXh0X2dldF9tYXhfaW5jb21wbGV0ZV9jb25uZWN0aW9ucyAoY29udGV4dCkpCisgICAgeworICAgICAgZW5hYmxlZCA9IEZBTFNFOworICAgIH0KKworICBpZiAoY29udGV4dC0+d2F0Y2hlc19lbmFibGVkID09IGVuYWJsZWQpCisgICAgcmV0dXJuOworCisgIGNvbnRleHQtPndhdGNoZXNfZW5hYmxlZCA9IGVuYWJsZWQ7CisKKyAgZm9yIChsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJmNvbnRleHQtPnNlcnZlcnMpOworICAgICAgIGxpbmsgIT0gTlVMTDsKKyAgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmY29udGV4dC0+c2VydmVycywgbGluaykpCisgICAgeworICAgICAgLyogQSBCdXNDb250ZXh0IG1pZ2h0IGNvbnRhaW5zIHNldmVyYWwgREJ1c1NlcnZlciAoaWYgdGhlcmUgYXJlCisgICAgICAgKiBzZXZlcmFsIDxsaXN0ZW4+IGNvbmZpZ3VyYXRpb24gaXRlbXMpIGFuZCBhIERCdXNTZXJ2ZXIgbWlnaHQKKyAgICAgICAqIGNvbnRhaW4gc2V2ZXJhbCBEQnVzV2F0Y2ggaW4gaXRzIERCdXNXYXRjaExpc3QgKGlmIGdldGFkZHJpbmZvCisgICAgICAgKiByZXR1cm5zIHNldmVyYWwgYWRkcmVzc2VzIG9uIGEgZHVhbCBJUHY0LUlQdjYgc3RhY2sgb3IgaWYKKyAgICAgICAqIHN5c3RlbWQgcGFzc2VzIHNldmVyYWwgZmRzKS4KKyAgICAgICAqIFdlIHdhbnQgdG8gZW5hYmxlL2Rpc2FibGUgdGhlbSBhbGwuCisgICAgICAgKi8KKyAgICAgIERCdXNTZXJ2ZXIgKnNlcnZlciA9IGxpbmstPmRhdGE7CisgICAgICBfZGJ1c19zZXJ2ZXJfdG9nZ2xlX2FsbF93YXRjaGVzIChzZXJ2ZXIsIGVuYWJsZWQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2J1cy9idXMuaCBiL2J1cy9idXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTBkZTgyCi0tLSAvZGV2L251bGwKKysrIGIvYnVzL2J1cy5oCkBAIC0wLDAgKzEsMTQ5IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGJ1cy5oICBtZXNzYWdlIGJ1cyBjb250ZXh0IG9iamVjdAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaWZuZGVmIEJVU19CVVNfSAorI2RlZmluZSBCVVNfQlVTX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zdHJpbmcuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbWFpbmxvb3AuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtcGlwZS5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zeXNkZXBzLmg+CisKK3R5cGVkZWYgc3RydWN0IEJ1c0FjdGl2YXRpb24gICAgQnVzQWN0aXZhdGlvbjsKK3R5cGVkZWYgc3RydWN0IEJ1c0Nvbm5lY3Rpb25zICAgQnVzQ29ubmVjdGlvbnM7Cit0eXBlZGVmIHN0cnVjdCBCdXNDb250ZXh0ICAgICAgIEJ1c0NvbnRleHQ7Cit0eXBlZGVmIHN0cnVjdCBCdXNQb2xpY3kgICAgICAgIEJ1c1BvbGljeTsKK3R5cGVkZWYgc3RydWN0IEJ1c0NsaWVudFBvbGljeSAgQnVzQ2xpZW50UG9saWN5OwordHlwZWRlZiBzdHJ1Y3QgQnVzUG9saWN5UnVsZSAgICBCdXNQb2xpY3lSdWxlOwordHlwZWRlZiBzdHJ1Y3QgQnVzUmVnaXN0cnkgICAgICBCdXNSZWdpc3RyeTsKK3R5cGVkZWYgc3RydWN0IEJ1c1NFTGludXhJRCAgICAgQnVzU0VMaW51eElEOwordHlwZWRlZiBzdHJ1Y3QgQnVzQXBwQXJtb3JDb25maW5lbWVudCBCdXNBcHBBcm1vckNvbmZpbmVtZW50OwordHlwZWRlZiBzdHJ1Y3QgQnVzU2VydmljZSAgICAgICBCdXNTZXJ2aWNlOwordHlwZWRlZiBzdHJ1Y3QgQnVzT3duZXIJCUJ1c093bmVyOwordHlwZWRlZiBzdHJ1Y3QgQnVzVHJhbnNhY3Rpb24gICBCdXNUcmFuc2FjdGlvbjsKK3R5cGVkZWYgc3RydWN0IEJ1c01hdGNobWFrZXIgICAgQnVzTWF0Y2htYWtlcjsKK3R5cGVkZWYgc3RydWN0IEJ1c01hdGNoUnVsZSAgICAgQnVzTWF0Y2hSdWxlOwordHlwZWRlZiBzdHJ1Y3QgQnVzQWN0aXZhdGlvbkVudHJ5IEJ1c0FjdGl2YXRpb25FbnRyeTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgbG9uZyBtYXhfaW5jb21pbmdfYnl0ZXM7ICAgICAgICAgIC8qKjwgSG93IG1hbnkgaW5jb21pbmcgbWVzc2FnZSBieXRlcyBmb3IgYSBzaW5nbGUgY29ubmVjdGlvbiAqLworICBsb25nIG1heF9pbmNvbWluZ191bml4X2ZkczsgICAgICAgLyoqPCBIb3cgbWFueSBpbmNvbWluZyBtZXNzYWdlIHVuaXggZmRzIGZvciBhIHNpbmdsZSBjb25uZWN0aW9uICovCisgIGxvbmcgbWF4X291dGdvaW5nX2J5dGVzOyAgICAgICAgICAvKio8IEhvdyBtYW55IG91dGdvaW5nIGJ5dGVzIGNhbiBiZSBxdWV1ZWQgZm9yIGEgc2luZ2xlIGNvbm5lY3Rpb24gKi8KKyAgbG9uZyBtYXhfb3V0Z29pbmdfdW5peF9mZHM7ICAgICAgIC8qKjwgSG93IG1hbnkgb3V0Z29pbmcgdW5peCBmZHMgY2FuIGJlIHF1ZXVlZCBmb3IgYSBzaW5nbGUgY29ubmVjdGlvbiAqLworICBsb25nIG1heF9tZXNzYWdlX3NpemU7ICAgICAgICAgICAgLyoqPCBNYXggc2l6ZSBvZiBhIHNpbmdsZSBtZXNzYWdlIGluIGJ5dGVzICovCisgIGxvbmcgbWF4X21lc3NhZ2VfdW5peF9mZHM7ICAgICAgICAvKio8IE1heCBudW1iZXIgb2YgdW5peCBmZHMgb2YgYSBzaW5nbGUgbWVzc2FnZSovCisgIGludCBhY3RpdmF0aW9uX3RpbWVvdXQ7ICAgICAgICAgICAvKio8IEhvdyBsb25nIHRvIHdhaXQgZm9yIGFuIGFjdGl2YXRpb24gdG8gdGltZSBvdXQgKi8KKyAgaW50IGF1dGhfdGltZW91dDsgICAgICAgICAgICAgICAgIC8qKjwgSG93IGxvbmcgdG8gd2FpdCBmb3IgYW4gYXV0aGVudGljYXRpb24gdG8gdGltZSBvdXQgKi8KKyAgaW50IHBlbmRpbmdfZmRfdGltZW91dDsgICAgICAgICAgIC8qKjwgSG93IGxvbmcgdG8gd2FpdCBmb3IgYSBELUJ1cyBtZXNzYWdlIHdpdGggYSBmZCB0byB0aW1lIG91dCAqLworICBpbnQgbWF4X2NvbXBsZXRlZF9jb25uZWN0aW9uczsgICAgLyoqPCBNYXggbnVtYmVyIG9mIGF1dGhvcml6ZWQgY29ubmVjdGlvbnMgKi8KKyAgaW50IG1heF9pbmNvbXBsZXRlX2Nvbm5lY3Rpb25zOyAgIC8qKjwgTWF4IG51bWJlciBvZiBpbmNvbXBsZXRlIGNvbm5lY3Rpb25zICovCisgIGludCBtYXhfY29ubmVjdGlvbnNfcGVyX3VzZXI7ICAgICAvKio8IE1heCBudW1iZXIgb2YgY29ubmVjdGlvbnMgYXV0aCdkIGFzIHNhbWUgdXNlciAqLworICBpbnQgbWF4X3BlbmRpbmdfYWN0aXZhdGlvbnM7ICAgICAgLyoqPCBNYXggbnVtYmVyIG9mIHBlbmRpbmcgYWN0aXZhdGlvbnMgZm9yIHRoZSBlbnRpcmUgYnVzICovCisgIGludCBtYXhfc2VydmljZXNfcGVyX2Nvbm5lY3Rpb247ICAvKio8IE1heCBudW1iZXIgb2Ygb3duZWQgc2VydmljZXMgZm9yIGEgc2luZ2xlIGNvbm5lY3Rpb24gKi8KKyAgaW50IG1heF9tYXRjaF9ydWxlc19wZXJfY29ubmVjdGlvbjsgLyoqPCBNYXggbnVtYmVyIG9mIG1hdGNoIHJ1bGVzIGZvciBhIHNpbmdsZSBjb25uZWN0aW9uICovCisgIGludCBtYXhfcmVwbGllc19wZXJfY29ubmVjdGlvbjsgICAgIC8qKjwgTWF4IG51bWJlciBvZiByZXBsaWVzIHRoYXQgY2FuIGJlIHBlbmRpbmcgZm9yIGVhY2ggY29ubmVjdGlvbiAqLworICBpbnQgcmVwbHlfdGltZW91dDsgICAgICAgICAgICAgICAgICAvKio8IEhvdyBsb25nIHRvIHdhaXQgYmVmb3JlIHRpbWluZyBvdXQgYSByZXBseSAqLworfSBCdXNMaW1pdHM7CisKK3R5cGVkZWYgZW51bQoreworICBCVVNfQ09OVEVYVF9GTEFHX05PTkUgPSAwLAorICBCVVNfQ09OVEVYVF9GTEFHX0ZPUktfQUxXQVlTID0gKDEgPDwgMSksCisgIEJVU19DT05URVhUX0ZMQUdfRk9SS19ORVZFUiA9ICgxIDw8IDIpLAorICBCVVNfQ09OVEVYVF9GTEFHX1dSSVRFX1BJRF9GSUxFID0gKDEgPDwgMyksCisgIEJVU19DT05URVhUX0ZMQUdfU1lTVEVNRF9BQ1RJVkFUSU9OID0gKDEgPDwgNCksCisgIEJVU19DT05URVhUX0ZMQUdfU1lTTE9HX0FMV0FZUyA9ICgxIDw8IDUpLAorICBCVVNfQ09OVEVYVF9GTEFHX1NZU0xPR19ORVZFUiA9ICgxIDw8IDYpLAorICBCVVNfQ09OVEVYVF9GTEFHX1NZU0xPR19PTkxZID0gKDEgPDwgNykKK30gQnVzQ29udGV4dEZsYWdzOworCitCdXNDb250ZXh0KiAgICAgICBidXNfY29udGV4dF9uZXcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBEQnVzU3RyaW5nICpjb25maWdfZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c0NvbnRleHRGbGFncyAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1BpcGUgICAgICAgICAqcHJpbnRfYWRkcl9waXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1BpcGUgICAgICAgICAqcHJpbnRfcGlkX3BpcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICphZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpOworZGJ1c19ib29sX3QgICAgICAgYnVzX2NvbnRleHRfcmVsb2FkX2NvbmZpZyAgICAgICAgICAgICAgICAgICAgICAoQnVzQ29udGV4dCAgICAgICAqY29udGV4dCwKKwkJCQkJCQkJICBEQnVzRXJyb3IgICAgICAgICplcnJvcik7Cit2b2lkICAgICAgICAgICAgICBidXNfY29udGV4dF9zaHV0ZG93biAgICAgICAgICAgICAgICAgICAgICAgICAgIChCdXNDb250ZXh0ICAgICAgICpjb250ZXh0KTsKK0J1c0NvbnRleHQqICAgICAgIGJ1c19jb250ZXh0X3JlZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJ1c0NvbnRleHQgICAgICAgKmNvbnRleHQpOwordm9pZCAgICAgICAgICAgICAgYnVzX2NvbnRleHRfdW5yZWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQnVzQ29udGV4dCAgICAgICAqY29udGV4dCk7CitkYnVzX2Jvb2xfdCAgICAgICBidXNfY29udGV4dF9nZXRfaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCdXNDb250ZXh0ICAgICAgICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAqdXVpZCk7Citjb25zdCBjaGFyKiAgICAgICBidXNfY29udGV4dF9nZXRfdHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgIChCdXNDb250ZXh0ICAgICAgICpjb250ZXh0KTsKK2NvbnN0IGNoYXIqICAgICAgIGJ1c19jb250ZXh0X2dldF9hZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgKEJ1c0NvbnRleHQgICAgICAgKmNvbnRleHQpOworY29uc3QgY2hhciogICAgICAgYnVzX2NvbnRleHRfZ2V0X3NlcnZpY2VoZWxwZXIgICAgICAgICAgICAgICAgICAoQnVzQ29udGV4dCAgICAgICAqY29udGV4dCk7CitkYnVzX2Jvb2xfdCAgICAgICBidXNfY29udGV4dF9nZXRfc3lzdGVtZF9hY3RpdmF0aW9uICAgICAgICAgICAgIChCdXNDb250ZXh0ICAgICAgICpjb250ZXh0KTsKK0J1c1JlZ2lzdHJ5KiAgICAgIGJ1c19jb250ZXh0X2dldF9yZWdpc3RyeSAgICAgICAgICAgICAgICAgICAgICAgKEJ1c0NvbnRleHQgICAgICAgKmNvbnRleHQpOworQnVzQ29ubmVjdGlvbnMqICAgYnVzX2NvbnRleHRfZ2V0X2Nvbm5lY3Rpb25zICAgICAgICAgICAgICAgICAgICAoQnVzQ29udGV4dCAgICAgICAqY29udGV4dCk7CitCdXNBY3RpdmF0aW9uKiAgICBidXNfY29udGV4dF9nZXRfYWN0aXZhdGlvbiAgICAgICAgICAgICAgICAgICAgIChCdXNDb250ZXh0ICAgICAgICpjb250ZXh0KTsKK0J1c01hdGNobWFrZXIqICAgIGJ1c19jb250ZXh0X2dldF9tYXRjaG1ha2VyICAgICAgICAgICAgICAgICAgICAgKEJ1c0NvbnRleHQgICAgICAgKmNvbnRleHQpOworREJ1c0xvb3AqICAgICAgICAgYnVzX2NvbnRleHRfZ2V0X2xvb3AgICAgICAgICAgICAgICAgICAgICAgICAgICAoQnVzQ29udGV4dCAgICAgICAqY29udGV4dCk7CitkYnVzX2Jvb2xfdCAgICAgICBidXNfY29udGV4dF9hbGxvd191bml4X3VzZXIgICAgICAgICAgICAgICAgICAgIChCdXNDb250ZXh0ICAgICAgICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgICAgdWlkKTsKK2RidXNfYm9vbF90ICAgICAgIGJ1c19jb250ZXh0X2FsbG93X3dpbmRvd3NfdXNlciAgICAgICAgICAgICAgICAgKEJ1c0NvbnRleHQgICAgICAgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICp3aW5kb3dzX3NpZCk7CitCdXNQb2xpY3kqICAgICAgICBidXNfY29udGV4dF9nZXRfcG9saWN5ICAgICAgICAgICAgICAgICAgICAgICAgIChCdXNDb250ZXh0ICAgICAgICpjb250ZXh0KTsKKworQnVzQ2xpZW50UG9saWN5KiAgYnVzX2NvbnRleHRfY3JlYXRlX2NsaWVudF9wb2xpY3kgICAgICAgICAgICAgICAoQnVzQ29udGV4dCAgICAgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcik7CitpbnQgICAgICAgICAgICAgICBidXNfY29udGV4dF9nZXRfYWN0aXZhdGlvbl90aW1lb3V0ICAgICAgICAgICAgIChCdXNDb250ZXh0ICAgICAgICpjb250ZXh0KTsKK2ludCAgICAgICAgICAgICAgIGJ1c19jb250ZXh0X2dldF9hdXRoX3RpbWVvdXQgICAgICAgICAgICAgICAgICAgKEJ1c0NvbnRleHQgICAgICAgKmNvbnRleHQpOworaW50ICAgICAgICAgICAgICAgYnVzX2NvbnRleHRfZ2V0X3BlbmRpbmdfZmRfdGltZW91dCAgICAgICAgICAgICAoQnVzQ29udGV4dCAgICAgICAqY29udGV4dCk7CitpbnQgICAgICAgICAgICAgICBidXNfY29udGV4dF9nZXRfbWF4X2NvbXBsZXRlZF9jb25uZWN0aW9ucyAgICAgIChCdXNDb250ZXh0ICAgICAgICpjb250ZXh0KTsKK2ludCAgICAgICAgICAgICAgIGJ1c19jb250ZXh0X2dldF9tYXhfaW5jb21wbGV0ZV9jb25uZWN0aW9ucyAgICAgKEJ1c0NvbnRleHQgICAgICAgKmNvbnRleHQpOworaW50ICAgICAgICAgICAgICAgYnVzX2NvbnRleHRfZ2V0X21heF9jb25uZWN0aW9uc19wZXJfdXNlciAgICAgICAoQnVzQ29udGV4dCAgICAgICAqY29udGV4dCk7CitpbnQgICAgICAgICAgICAgICBidXNfY29udGV4dF9nZXRfbWF4X3BlbmRpbmdfYWN0aXZhdGlvbnMgICAgICAgIChCdXNDb250ZXh0ICAgICAgICpjb250ZXh0KTsKK2ludCAgICAgICAgICAgICAgIGJ1c19jb250ZXh0X2dldF9tYXhfc2VydmljZXNfcGVyX2Nvbm5lY3Rpb24gICAgKEJ1c0NvbnRleHQgICAgICAgKmNvbnRleHQpOworaW50ICAgICAgICAgICAgICAgYnVzX2NvbnRleHRfZ2V0X21heF9tYXRjaF9ydWxlc19wZXJfY29ubmVjdGlvbiAoQnVzQ29udGV4dCAgICAgICAqY29udGV4dCk7CitpbnQgICAgICAgICAgICAgICBidXNfY29udGV4dF9nZXRfbWF4X3JlcGxpZXNfcGVyX2Nvbm5lY3Rpb24gICAgIChCdXNDb250ZXh0ICAgICAgICpjb250ZXh0KTsKK2ludCAgICAgICAgICAgICAgIGJ1c19jb250ZXh0X2dldF9yZXBseV90aW1lb3V0ICAgICAgICAgICAgICAgICAgKEJ1c0NvbnRleHQgICAgICAgKmNvbnRleHQpOworREJ1c1JMaW1pdCAqICAgICAgYnVzX2NvbnRleHRfZ2V0X2luaXRpYWxfZmRfbGltaXQgICAgICAgICAgICAgICAoQnVzQ29udGV4dCAgICAgICAqY29udGV4dCk7CitkYnVzX2Jvb2xfdCAgICAgICBidXNfY29udGV4dF9nZXRfdXNpbmdfc3lzbG9nICAgICAgICAgICAgICAgICAgIChCdXNDb250ZXh0ICAgICAgICpjb250ZXh0KTsKK3ZvaWQgICAgICAgICAgICAgIGJ1c19jb250ZXh0X2xvZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJ1c0NvbnRleHQgICAgICAgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3lzdGVtTG9nU2V2ZXJpdHkgc2V2ZXJpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICptc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4pIF9EQlVTX0dOVUNfUFJJTlRGICgzLCA0KTsKK3ZvaWQgICAgICAgICAgICAgIGJ1c19jb250ZXh0X2xvZ19saXRlcmFsICAgICAgICAgICAgICAgICAgICAgICAgKEJ1c0NvbnRleHQgICAgICAgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3lzdGVtTG9nU2V2ZXJpdHkgc2V2ZXJpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICptc2cpOwordm9pZCAgICAgICAgICAgICAgYnVzX2NvbnRleHRfbG9nX2FuZF9zZXRfZXJyb3IgICAgICAgICAgICAgICAgICAoQnVzQ29udGV4dCAgICAgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTeXN0ZW1Mb2dTZXZlcml0eSBzZXZlcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKm1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLikgX0RCVVNfR05VQ19QUklOVEYgKDUsIDYpOworZGJ1c19ib29sX3QgICAgICAgYnVzX2NvbnRleHRfY2hlY2tfc2VjdXJpdHlfcG9saWN5ICAgICAgICAgICAgICAoQnVzQ29udGV4dCAgICAgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1RyYW5zYWN0aW9uICAgKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gICAqc2VuZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gICAqYWRkcmVzc2VkX3JlY2lwaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICAgKnByb3Bvc2VkX3JlY2lwaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNBY3RpdmF0aW9uRW50cnkgKmFjdGl2YXRpb25fZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcik7Cit2b2lkICAgICAgICAgICAgICBidXNfY29udGV4dF9jaGVja19hbGxfd2F0Y2hlcyAgICAgICAgICAgICAgICAgIChCdXNDb250ZXh0ICAgICAgICpjb250ZXh0KTsKKworI2VuZGlmIC8qIEJVU19CVVNfSCAqLwpkaWZmIC0tZ2l0IGEvYnVzL2NvbmZpZy1sb2FkZXItZXhwYXQuYyBiL2J1cy9jb25maWctbG9hZGVyLWV4cGF0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNiZDM3ZQotLS0gL2Rldi9udWxsCisrKyBiL2J1cy9jb25maWctbG9hZGVyLWV4cGF0LmMKQEAgLTAsMCArMSwzMTEgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogY29uZmlnLWxvYWRlci1leHBhdC5jICBleHBhdCBYTUwgbG9hZGVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzIFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJjb25maWctcGFyc2VyLmgiCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWludGVybmFscy5oPgorI2luY2x1ZGUgPGV4cGF0Lmg+CisKK3N0YXRpYyBYTUxfTWVtb3J5X0hhbmRsaW5nX1N1aXRlIG1lbXN1aXRlOworCit0eXBlZGVmIHN0cnVjdAoreworICBCdXNDb25maWdQYXJzZXIgKnBhcnNlcjsKKyAgY29uc3QgY2hhciAqZmlsZW5hbWU7CisgIERCdXNTdHJpbmcgY29udGVudDsKKyAgREJ1c0Vycm9yICplcnJvcjsKKyAgZGJ1c19ib29sX3QgZmFpbGVkOworfSBFeHBhdFBhcnNlQ29udGV4dDsKKworc3RhdGljIGRidXNfYm9vbF90Citwcm9jZXNzX2NvbnRlbnQgKEV4cGF0UGFyc2VDb250ZXh0ICpjb250ZXh0KQoreworICBpZiAoY29udGV4dC0+ZmFpbGVkKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZjb250ZXh0LT5jb250ZW50KSA+IDApCisgICAgeworICAgICAgaWYgKCFidXNfY29uZmlnX3BhcnNlcl9jb250ZW50IChjb250ZXh0LT5wYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb250ZXh0LT5jb250ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5lcnJvcikpCisgICAgICAgIHsKKyAgICAgICAgICBjb250ZXh0LT5mYWlsZWQgPSBUUlVFOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKCZjb250ZXh0LT5jb250ZW50LCAwKTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitleHBhdF9TdGFydEVsZW1lbnRIYW5kbGVyICh2b2lkICAgICAgICAgICAgKnVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKiphdHRzKQoreworICBFeHBhdFBhcnNlQ29udGV4dCAqY29udGV4dCA9IHVzZXJEYXRhOworICBpbnQgaTsKKyAgY2hhciAqKm5hbWVzOworICBjaGFyICoqdmFsdWVzOworCisgIC8qIEV4cGF0IHNlZW1zIHRvIHN1Y2sgYW5kIGNhbid0IGFib3J0IHRoZSBwYXJzZSBpZiB3ZQorICAgKiB0aHJvdyBhbiBlcnJvci4gRXhwYXQgMi4wIGlzIHN1cHBvc2VkIHRvIGZpeCB0aGlzLgorICAgKi8KKyAgaWYgKGNvbnRleHQtPmZhaWxlZCkKKyAgICByZXR1cm47CisKKyAgaWYgKCFwcm9jZXNzX2NvbnRlbnQgKGNvbnRleHQpKQorICAgIHJldHVybjsKKworICAvKiAiYXR0cyIgaXMga2V5LCB2YWx1ZSwga2V5LCB2YWx1ZSwgTlVMTCAqLworICBmb3IgKGkgPSAwOyBhdHRzW2ldICE9IE5VTEw7ICsraSkKKyAgICA7IC8qIG5vdGhpbmcgKi8KKworICBfZGJ1c19hc3NlcnQgKGkgJSAyID09IDApOworICBuYW1lcyA9IGRidXNfbmV3MCAoY2hhciAqLCBpIC8gMiArIDEpOworICB2YWx1ZXMgPSBkYnVzX25ldzAgKGNoYXIgKiwgaSAvIDIgKyAxKTsKKworICBpZiAobmFtZXMgPT0gTlVMTCB8fCB2YWx1ZXMgPT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoY29udGV4dC0+ZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgIGNvbnRleHQtPmZhaWxlZCA9IFRSVUU7CisgICAgICBkYnVzX2ZyZWUgKG5hbWVzKTsKKyAgICAgIGRidXNfZnJlZSAodmFsdWVzKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaSA9IDA7CisgIHdoaWxlIChhdHRzW2ldICE9IE5VTEwpCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0IChpICUgMiA9PSAwKTsKKyAgICAgIG5hbWVzIFtpIC8gMl0gPSAoY2hhciopIGF0dHNbaV07CisgICAgICB2YWx1ZXNbaSAvIDJdID0gKGNoYXIqKSBhdHRzW2krMV07CisKKyAgICAgIGkgKz0gMjsKKyAgICB9CisKKyAgaWYgKCFidXNfY29uZmlnX3BhcnNlcl9zdGFydF9lbGVtZW50IChjb250ZXh0LT5wYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciAqKikgbmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKiopIHZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5lcnJvcikpCisgICAgeworICAgICAgZGJ1c19mcmVlIChuYW1lcyk7CisgICAgICBkYnVzX2ZyZWUgKHZhbHVlcyk7CisgICAgICBjb250ZXh0LT5mYWlsZWQgPSBUUlVFOworICAgICAgcmV0dXJuOworICAgIH0KKworICBkYnVzX2ZyZWUgKG5hbWVzKTsKKyAgZGJ1c19mcmVlICh2YWx1ZXMpOworfQorCitzdGF0aWMgdm9pZAorZXhwYXRfRW5kRWxlbWVudEhhbmRsZXIgKHZvaWQgICAgICAgICAgICp1c2VyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqbmFtZSkKK3sKKyAgRXhwYXRQYXJzZUNvbnRleHQgKmNvbnRleHQgPSB1c2VyRGF0YTsKKworICBpZiAoIXByb2Nlc3NfY29udGVudCAoY29udGV4dCkpCisgICAgcmV0dXJuOworCisgIGlmICghYnVzX2NvbmZpZ19wYXJzZXJfZW5kX2VsZW1lbnQgKGNvbnRleHQtPnBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC0+ZXJyb3IpKQorICAgIHsKKyAgICAgIGNvbnRleHQtPmZhaWxlZCA9IFRSVUU7CisgICAgICByZXR1cm47CisgICAgfQorfQorCisvKiBzIGlzIG5vdCAwIHRlcm1pbmF0ZWQuICovCitzdGF0aWMgdm9pZAorZXhwYXRfQ2hhcmFjdGVyRGF0YUhhbmRsZXIgKHZvaWQgICAgICAgICAgICp1c2VyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgbGVuKQoreworICBFeHBhdFBhcnNlQ29udGV4dCAqY29udGV4dCA9IHVzZXJEYXRhOworICBpZiAoY29udGV4dC0+ZmFpbGVkKQorICAgIHJldHVybjsKKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfbGVuICgmY29udGV4dC0+Y29udGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcywgbGVuKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoY29udGV4dC0+ZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgIGNvbnRleHQtPmZhaWxlZCA9IFRSVUU7CisgICAgICByZXR1cm47CisgICAgfQorfQorCisKK0J1c0NvbmZpZ1BhcnNlcioKK2J1c19jb25maWdfbG9hZCAoY29uc3QgREJ1c1N0cmluZyAgICAgICpmaWxlLAorICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICAgICAgIGlzX3RvcGxldmVsLAorICAgICAgICAgICAgICAgICBjb25zdCBCdXNDb25maWdQYXJzZXIgKnBhcmVudCwKKyAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgICAgICplcnJvcikKK3sKKyAgWE1MX1BhcnNlciBleHBhdDsKKyAgY29uc3QgY2hhciAqZmlsZW5hbWU7CisgIEJ1c0NvbmZpZ1BhcnNlciAqcGFyc2VyOworICBFeHBhdFBhcnNlQ29udGV4dCBjb250ZXh0OworICBEQnVzU3RyaW5nIGRpcm5hbWU7CisgIAorICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBwYXJzZXIgPSBOVUxMOworICBleHBhdCA9IE5VTEw7CisgIGNvbnRleHQuZXJyb3IgPSBlcnJvcjsKKyAgY29udGV4dC5mYWlsZWQgPSBGQUxTRTsKKworICBmaWxlbmFtZSA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoZmlsZSk7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmNvbnRleHQuY29udGVudCkpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmRpcm5hbWUpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZjb250ZXh0LmNvbnRlbnQpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIG1lbXN1aXRlLm1hbGxvY19mY24gPSBkYnVzX21hbGxvYzsKKyAgbWVtc3VpdGUucmVhbGxvY19mY24gPSBkYnVzX3JlYWxsb2M7CisgIG1lbXN1aXRlLmZyZWVfZmNuID0gZGJ1c19mcmVlOworCisgIGV4cGF0ID0gWE1MX1BhcnNlckNyZWF0ZV9NTSAoIlVURi04IiwgJm1lbXN1aXRlLCBOVUxMKTsKKyAgaWYgKGV4cGF0ID09IE5VTEwpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgLyogV2UgZG8gbm90IG5lZWQgcHJvdGVjdGlvbiBhZ2FpbnN0IGhhc2ggY29sbGlzaW9ucyAoQ1ZFLTIwMTItMDg3NikKKyAgICogYmVjYXVzZSB3ZSBhcmUgb25seSBwYXJzaW5nIHRydXN0ZWQgWE1MOyBhbmQgaWYgd2UgbGV0IEV4cGF0IGJsb2NrCisgICAqIHdhaXRpbmcgZm9yIHRoZSBDU1BSTkcgdG8gYmUgaW5pdGlhbGl6ZWQsIGFzIGl0IGRvZXMgYnkgZGVmYXVsdCB0bworICAgKiBkZWZlYXQgQ1ZFLTIwMTItMDg3NiwgaXQgY2FuIGNhdXNlIHRpbWVvdXRzIGR1cmluZyBlYXJseSBib290IG9uCisgICAqIGVudHJvcHktc3RhcnZlZCBlbWJlZGRlZCBkZXZpY2VzLgorICAgKgorICAgKiBUT0RPOiBXaGVuIEV4cGF0IGdldHMgYSBtb3JlIGV4cGxpY2l0IEFQSSBmb3IgdGhpcyB0aGFuCisgICAqIFhNTF9TZXRIYXNoU2FsdCwgY2hlY2sgZm9yIHRoYXQgdG9vLCBhbmQgdXNlIGl0IHByZWZlcmVudGlhbGx5LgorICAgKiBodHRwczovL2dpdGh1Yi5jb20vbGliZXhwYXQvbGliZXhwYXQvaXNzdWVzLzkxICovCisjaWYgZGVmaW5lZChIQVZFX1hNTF9TRVRIQVNIU0FMVCkKKyAgLyogQW55IG5vbnplcm8gbnVtYmVyIHdpbGwgZG8uIGh0dHBzOi8veGtjZC5jb20vMjIxLyAqLworICBYTUxfU2V0SGFzaFNhbHQgKGV4cGF0LCA0KTsKKyNlbmRpZgorCisgIGlmICghX2RidXNfc3RyaW5nX2dldF9kaXJuYW1lIChmaWxlLCAmZGlybmFtZSkpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisgIAorICBwYXJzZXIgPSBidXNfY29uZmlnX3BhcnNlcl9uZXcgKCZkaXJuYW1lLCBpc190b3BsZXZlbCwgcGFyZW50KTsKKyAgaWYgKHBhcnNlciA9PSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorICBjb250ZXh0LnBhcnNlciA9IHBhcnNlcjsKKworICBYTUxfU2V0VXNlckRhdGEgKGV4cGF0LCAmY29udGV4dCk7CisgIFhNTF9TZXRFbGVtZW50SGFuZGxlciAoZXhwYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgZXhwYXRfU3RhcnRFbGVtZW50SGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBleHBhdF9FbmRFbGVtZW50SGFuZGxlcik7CisgIFhNTF9TZXRDaGFyYWN0ZXJEYXRhSGFuZGxlciAoZXhwYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwYXRfQ2hhcmFjdGVyRGF0YUhhbmRsZXIpOworCisgIHsKKyAgICBEQnVzU3RyaW5nIGRhdGE7CisgICAgY29uc3QgY2hhciAqZGF0YV9zdHI7CisKKyAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZGF0YSkpCisgICAgICB7CisgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgIH0KKworICAgIGlmICghX2RidXNfZmlsZV9nZXRfY29udGVudHMgKCZkYXRhLCBmaWxlLCBlcnJvcikpCisgICAgICB7CisgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmZGF0YSk7CisgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgfQorCisgICAgZGF0YV9zdHIgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZkYXRhKTsKKworICAgIGlmIChYTUxfUGFyc2UgKGV4cGF0LCBkYXRhX3N0ciwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZkYXRhKSwgVFJVRSkgPT0gWE1MX1NUQVRVU19FUlJPUikKKyAgICAgIHsKKyAgICAgICAgaWYgKGNvbnRleHQuZXJyb3IgIT0gTlVMTCAmJgorICAgICAgICAgICAgIWRidXNfZXJyb3JfaXNfc2V0IChjb250ZXh0LmVycm9yKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBlbnVtIFhNTF9FcnJvciBlOworCisgICAgICAgICAgICBlID0gWE1MX0dldEVycm9yQ29kZSAoZXhwYXQpOworICAgICAgICAgICAgaWYgKGUgPT0gWE1MX0VSUk9SX05PX01FTU9SWSkKKyAgICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IgaW4gZmlsZSAlcywgbGluZSAlbHUsIGNvbHVtbiAlbHU6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgWE1MX1NpemUgdHlwZSB2YXJpZXMgYWNjb3JkaW5nIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBidWlsZCBvcHRpb25zLCBzbyBjYXN0IHRvIHNvbWV0aGluZyB3ZSBjYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGNvcGUgd2l0aC4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBYTUxfR2V0Q3VycmVudExpbmVOdW1iZXIgKGV4cGF0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBYTUxfR2V0Q3VycmVudENvbHVtbk51bWJlciAoZXhwYXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MX0Vycm9yU3RyaW5nIChlKSk7CisgICAgICAgICAgfQorCisgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmZGF0YSk7CisgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgfQorCisgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZkYXRhKTsKKworICAgIGlmIChjb250ZXh0LmZhaWxlZCkKKyAgICAgIGdvdG8gZmFpbGVkOworICB9CisKKyAgaWYgKCFidXNfY29uZmlnX3BhcnNlcl9maW5pc2hlZCAocGFyc2VyLCBlcnJvcikpCisgICAgZ290byBmYWlsZWQ7CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZkaXJuYW1lKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZjb250ZXh0LmNvbnRlbnQpOworICBYTUxfUGFyc2VyRnJlZSAoZXhwYXQpOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworICByZXR1cm4gcGFyc2VyOworCisgZmFpbGVkOgorICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZkaXJuYW1lKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZjb250ZXh0LmNvbnRlbnQpOworICBpZiAoZXhwYXQpCisgICAgWE1MX1BhcnNlckZyZWUgKGV4cGF0KTsKKyAgaWYgKHBhcnNlcikKKyAgICBidXNfY29uZmlnX3BhcnNlcl91bnJlZiAocGFyc2VyKTsKKyAgcmV0dXJuIE5VTEw7Cit9CmRpZmYgLS1naXQgYS9idXMvY29uZmlnLXBhcnNlci1jb21tb24uYyBiL2J1cy9jb25maWctcGFyc2VyLWNvbW1vbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxYzQxOTEKLS0tIC9kZXYvbnVsbAorKysgYi9idXMvY29uZmlnLXBhcnNlci1jb21tb24uYwpAQCAtMCwwICsxLDE5NSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBjb25maWctcGFyc2VyLWNvbW1vbi5jICBDb21tb24gZGVmaW5lcyBhbmQgcm91dGluZXMgZm9yIGNvbmZpZyBmaWxlIHBhcnNpbmcKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKyAKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtaW50ZXJuYWxzLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJjb25maWctcGFyc2VyLWNvbW1vbi5oIgorI2luY2x1ZGUgInV0aWxzLmgiCisKK0VsZW1lbnRUeXBlCitidXNfY29uZmlnX3BhcnNlcl9lbGVtZW50X25hbWVfdG9fdHlwZSAoY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgaWYgKHN0cmNtcCAobmFtZSwgIm5vbmUiKSA9PSAwKQorICAgIHsKKyAgICAgIHJldHVybiBFTEVNRU5UX05PTkU7CisgICAgfQorICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJidXNjb25maWciKSA9PSAwKQorICAgIHsKKyAgICAgIHJldHVybiBFTEVNRU5UX0JVU0NPTkZJRzsKKyAgICB9CisgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgInVzZXIiKSA9PSAwKQorICAgIHsKKyAgICAgIHJldHVybiBFTEVNRU5UX1VTRVI7CisgICAgfQorICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJhdXRoIikgPT0gMCkKKyAgICB7CisgICAgICByZXR1cm4gRUxFTUVOVF9BVVRIOworICAgIH0KKyAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAidHlwZSIpID09IDApCisgICAgeworICAgICAgcmV0dXJuIEVMRU1FTlRfQ09ORklHVFlQRTsKKyAgICB9CisgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgImZvcmsiKSA9PSAwKQorICAgIHsKKyAgICAgIHJldHVybiBFTEVNRU5UX0ZPUks7CisgICAgfQorICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJwaWRmaWxlIikgPT0gMCkKKyAgICB7CisgICAgICByZXR1cm4gRUxFTUVOVF9QSURGSUxFOworICAgIH0KKyAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAibGlzdGVuIikgPT0gMCkKKyAgICB7CisgICAgICByZXR1cm4gRUxFTUVOVF9MSVNURU47CisgICAgfQorICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJhdXRoIikgPT0gMCkKKyAgICB7CisgICAgICByZXR1cm4gRUxFTUVOVF9BVVRIOworICAgIH0KKyAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiYWxsb3ciKSA9PSAwKQorICAgIHsKKyAgICAgIHJldHVybiBFTEVNRU5UX0FMTE9XOworICAgIH0KKyAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiZGVueSIpID09IDApCisgICAgeworICAgICAgcmV0dXJuIEVMRU1FTlRfREVOWTsKKyAgICB9CisgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgInNlcnZpY2VoZWxwZXIiKSA9PSAwKQorICAgIHsKKyAgICAgIHJldHVybiBFTEVNRU5UX1NFUlZJQ0VIRUxQRVI7CisgICAgfQorICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJpbmNsdWRlZGlyIikgPT0gMCkKKyAgICB7CisgICAgICByZXR1cm4gRUxFTUVOVF9JTkNMVURFRElSOworICAgIH0KKyAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAic3RhbmRhcmRfc2Vzc2lvbl9zZXJ2aWNlZGlycyIpID09IDApCisgICAgeworICAgICAgcmV0dXJuIEVMRU1FTlRfU1RBTkRBUkRfU0VTU0lPTl9TRVJWSUNFRElSUzsKKyAgICB9CisgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgInN0YW5kYXJkX3N5c3RlbV9zZXJ2aWNlZGlycyIpID09IDApCisgICAgeworICAgICAgcmV0dXJuIEVMRU1FTlRfU1RBTkRBUkRfU1lTVEVNX1NFUlZJQ0VESVJTOworICAgIH0KKyAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAic2VydmljZWRpciIpID09IDApCisgICAgeworICAgICAgcmV0dXJuIEVMRU1FTlRfU0VSVklDRURJUjsKKyAgICB9CisgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgImluY2x1ZGUiKSA9PSAwKQorICAgIHsKKyAgICAgIHJldHVybiBFTEVNRU5UX0lOQ0xVREU7CisgICAgfQorICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJwb2xpY3kiKSA9PSAwKQorICAgIHsKKyAgICAgIHJldHVybiBFTEVNRU5UX1BPTElDWTsKKyAgICB9CisgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgImxpbWl0IikgPT0gMCkKKyAgICB7CisgICAgICByZXR1cm4gRUxFTUVOVF9MSU1JVDsKKyAgICB9CisgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgInNlbGludXgiKSA9PSAwKQorICAgIHsKKyAgICAgIHJldHVybiBFTEVNRU5UX1NFTElOVVg7CisgICAgfQorICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJhc3NvY2lhdGUiKSA9PSAwKQorICAgIHsKKyAgICAgIHJldHVybiBFTEVNRU5UX0FTU09DSUFURTsKKyAgICB9CisgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgInN5c2xvZyIpID09IDApCisgICAgeworICAgICAgcmV0dXJuIEVMRU1FTlRfU1lTTE9HOworICAgIH0KKyAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAia2VlcF91bWFzayIpID09IDApCisgICAgeworICAgICAgcmV0dXJuIEVMRU1FTlRfS0VFUF9VTUFTSzsKKyAgICB9CisgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgImFsbG93X2Fub255bW91cyIpID09IDApCisgICAgeworICAgICAgcmV0dXJuIEVMRU1FTlRfQUxMT1dfQU5PTllNT1VTOworICAgIH0KKyAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiYXBwYXJtb3IiKSA9PSAwKQorICAgIHsKKyAgICAgIHJldHVybiBFTEVNRU5UX0FQUEFSTU9SOworICAgIH0KKyAgcmV0dXJuIEVMRU1FTlRfTk9ORTsKK30KKworY29uc3QgY2hhcioKK2J1c19jb25maWdfcGFyc2VyX2VsZW1lbnRfdHlwZV90b19uYW1lIChFbGVtZW50VHlwZSB0eXBlKQoreworICBzd2l0Y2ggKHR5cGUpCisgICAgeworICAgIGNhc2UgRUxFTUVOVF9OT05FOgorICAgICAgcmV0dXJuIE5VTEw7CisgICAgY2FzZSBFTEVNRU5UX0JVU0NPTkZJRzoKKyAgICAgIHJldHVybiAiYnVzY29uZmlnIjsKKyAgICBjYXNlIEVMRU1FTlRfSU5DTFVERToKKyAgICAgIHJldHVybiAiaW5jbHVkZSI7CisgICAgY2FzZSBFTEVNRU5UX1VTRVI6CisgICAgICByZXR1cm4gInVzZXIiOworICAgIGNhc2UgRUxFTUVOVF9MSVNURU46CisgICAgICByZXR1cm4gImxpc3RlbiI7CisgICAgY2FzZSBFTEVNRU5UX0FVVEg6CisgICAgICByZXR1cm4gImF1dGgiOworICAgIGNhc2UgRUxFTUVOVF9QT0xJQ1k6CisgICAgICByZXR1cm4gInBvbGljeSI7CisgICAgY2FzZSBFTEVNRU5UX0xJTUlUOgorICAgICAgcmV0dXJuICJsaW1pdCI7CisgICAgY2FzZSBFTEVNRU5UX0FMTE9XOgorICAgICAgcmV0dXJuICJhbGxvdyI7CisgICAgY2FzZSBFTEVNRU5UX0RFTlk6CisgICAgICByZXR1cm4gImRlbnkiOworICAgIGNhc2UgRUxFTUVOVF9GT1JLOgorICAgICAgcmV0dXJuICJmb3JrIjsKKyAgICBjYXNlIEVMRU1FTlRfUElERklMRToKKyAgICAgIHJldHVybiAicGlkZmlsZSI7CisgICAgY2FzZSBFTEVNRU5UX1NUQU5EQVJEX1NFU1NJT05fU0VSVklDRURJUlM6CisgICAgICByZXR1cm4gInN0YW5kYXJkX3Nlc3Npb25fc2VydmljZWRpcnMiOworICAgIGNhc2UgRUxFTUVOVF9TVEFOREFSRF9TWVNURU1fU0VSVklDRURJUlM6CisgICAgICByZXR1cm4gInN0YW5kYXJkX3N5c3RlbV9zZXJ2aWNlZGlycyI7CisgICAgY2FzZSBFTEVNRU5UX1NFUlZJQ0VESVI6CisgICAgICByZXR1cm4gInNlcnZpY2VkaXIiOworICAgIGNhc2UgRUxFTUVOVF9TRVJWSUNFSEVMUEVSOgorICAgICAgcmV0dXJuICJzZXJ2aWNlaGVscGVyIjsKKyAgICBjYXNlIEVMRU1FTlRfSU5DTFVERURJUjoKKyAgICAgIHJldHVybiAiaW5jbHVkZWRpciI7CisgICAgY2FzZSBFTEVNRU5UX0NPTkZJR1RZUEU6CisgICAgICByZXR1cm4gInR5cGUiOworICAgIGNhc2UgRUxFTUVOVF9TRUxJTlVYOgorICAgICAgcmV0dXJuICJzZWxpbnV4IjsKKyAgICBjYXNlIEVMRU1FTlRfQVNTT0NJQVRFOgorICAgICAgcmV0dXJuICJhc3NvY2lhdGUiOworICAgIGNhc2UgRUxFTUVOVF9TWVNMT0c6CisgICAgICByZXR1cm4gInN5c2xvZyI7CisgICAgY2FzZSBFTEVNRU5UX0tFRVBfVU1BU0s6CisgICAgICByZXR1cm4gImtlZXBfdW1hc2siOworICAgIGNhc2UgRUxFTUVOVF9BTExPV19BTk9OWU1PVVM6CisgICAgICByZXR1cm4gImFsbG93X2Fub255bW91cyI7CisgICAgY2FzZSBFTEVNRU5UX0FQUEFSTU9SOgorICAgICAgcmV0dXJuICJhcHBhcm1vciI7CisgICAgZGVmYXVsdDoKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImJhZCBlbGVtZW50IHR5cGUiKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvYnVzL2NvbmZpZy1wYXJzZXItY29tbW9uLmggYi9idXMvY29uZmlnLXBhcnNlci1jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODJhMDE0Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzL2NvbmZpZy1wYXJzZXItY29tbW9uLmgKQEAgLTAsMCArMSw2MCBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBjb25maWctcGFyc2VyLWNvbW1vbi5oICBDb21tb24gZGVmaW5lcyBhbmQgcm91dGluZXMgZm9yIGNvbmZpZyBmaWxlIHBhcnNpbmcKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaWZuZGVmIEJVU19DT05GSUdfUEFSU0VSX0NPTU1PTl9ICisjZGVmaW5lIEJVU19DT05GSUdfUEFSU0VSX0NPTU1PTl9ICisKK3R5cGVkZWYgZW51bQoreworICBFTEVNRU5UX05PTkUsCisgIEVMRU1FTlRfQlVTQ09ORklHLAorICBFTEVNRU5UX0lOQ0xVREUsCisgIEVMRU1FTlRfVVNFUiwKKyAgRUxFTUVOVF9MSVNURU4sCisgIEVMRU1FTlRfQVVUSCwKKyAgRUxFTUVOVF9QT0xJQ1ksCisgIEVMRU1FTlRfTElNSVQsCisgIEVMRU1FTlRfQUxMT1csCisgIEVMRU1FTlRfREVOWSwKKyAgRUxFTUVOVF9GT1JLLAorICBFTEVNRU5UX1BJREZJTEUsCisgIEVMRU1FTlRfU0VSVklDRURJUiwKKyAgRUxFTUVOVF9TRVJWSUNFSEVMUEVSLAorICBFTEVNRU5UX0lOQ0xVREVESVIsCisgIC8qIHRoaXMgaXMgcmVhbGx5IDx0eXBlPiwgYnV0IHdpbmlvY3RsLmggZGVmaW5lcyBFTEVNRU5UX1RZUEUgKi8KKyAgRUxFTUVOVF9DT05GSUdUWVBFLAorICBFTEVNRU5UX1NFTElOVVgsCisgIEVMRU1FTlRfQVNTT0NJQVRFLAorICBFTEVNRU5UX1NUQU5EQVJEX1NFU1NJT05fU0VSVklDRURJUlMsCisgIEVMRU1FTlRfU1RBTkRBUkRfU1lTVEVNX1NFUlZJQ0VESVJTLAorICBFTEVNRU5UX0tFRVBfVU1BU0ssCisgIEVMRU1FTlRfU1lTTE9HLAorICBFTEVNRU5UX0FMTE9XX0FOT05ZTU9VUywKKyAgRUxFTUVOVF9BUFBBUk1PUgorfSBFbGVtZW50VHlwZTsKKworRWxlbWVudFR5cGUgYnVzX2NvbmZpZ19wYXJzZXJfZWxlbWVudF9uYW1lX3RvX3R5cGUgKGNvbnN0IGNoYXIgKmVsZW1lbnRfbmFtZSk7Citjb25zdCBjaGFyKiBidXNfY29uZmlnX3BhcnNlcl9lbGVtZW50X3R5cGVfdG9fbmFtZSAoRWxlbWVudFR5cGUgdHlwZSk7CisKKyNlbmRpZiAvKiBCVVNfQ09ORklHX1BBUlNFUl9DT01NT05fSCAqLworCmRpZmYgLS1naXQgYS9idXMvY29uZmlnLXBhcnNlci10cml2aWFsLmMgYi9idXMvY29uZmlnLXBhcnNlci10cml2aWFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ2NWM2ZAotLS0gL2Rldi9udWxsCisrKyBiL2J1cy9jb25maWctcGFyc2VyLXRyaXZpYWwuYwpAQCAtMCwwICsxLDc3MSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBjb25maWctcGFyc2VyLXRyaXZpYWwuYyAgWE1MLWxpYnJhcnktYWdub3N0aWMgY29uZmlndXJhdGlvbiBmaWxlIHBhcnNlcgorICogICAgICAgICAgICAgICAgICBEb2VzIG5vdCBkbyBpbmNsdWRlcyBvciBhbnl0aGluZyByZW1vdGVseSBjb21wbGljYXRlZC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQsIDIwMDcgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKyAKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJjb25maWctcGFyc2VyLWNvbW1vbi5oIgorI2luY2x1ZGUgImNvbmZpZy1wYXJzZXItdHJpdmlhbC5oIgorI2luY2x1ZGUgInV0aWxzLmgiCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWxpc3QuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtaW50ZXJuYWxzLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKy8qKgorICogVFJJVklBTCBwYXJzZXIgZm9yIGJ1cyBjb25maWd1cmF0aW9uIGZpbGUuCisgKi8KK3N0cnVjdCBCdXNDb25maWdQYXJzZXIKK3sKKyAgRWxlbWVudFR5cGUgdHlwZTsKKyAgREJ1c1N0cmluZyB1c2VyOyAgICAgICAgICAgICAgICAgIC8qKjwgVXNlciB0aGUgZGJ1cy1kYWVtb24gcnVucyBhcyAqLworICBEQnVzU3RyaW5nIGJ1c190eXBlOyAgICAgICAgICAgICAgLyoqPCBNZXNzYWdlIGJ1cyB0eXBlICovCisgIERCdXNTdHJpbmcgc2VydmljZV9oZWxwZXI7ICAgICAgICAvKio8IExvY2F0aW9uIG9mIHRoZSBzZXR1aWQgaGVscGVyICovCisgIERCdXNMaXN0ICpzZXJ2aWNlX2RpcnM7ICAgICAgICAgICAvKio8IERpcmVjdG9yaWVzIHRvIGxvb2sgZm9yIHNlcnZpY2VzIGluICovCit9OworCitzdGF0aWMgZGJ1c19ib29sX3QKK3NlcnZpY2VfZGlyc19maW5kX2RpciAoREJ1c0xpc3QgKipzZXJ2aWNlX2RpcnMsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRpcikKK3sKKyAgREJ1c0xpc3QgKmxpbms7CisKKyAgX2RidXNfYXNzZXJ0IChkaXIgIT0gTlVMTCk7CisKKyAgZm9yIChsaW5rID0gKnNlcnZpY2VfZGlyczsgbGluazsgbGluayA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayhzZXJ2aWNlX2RpcnMsIGxpbmspKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKmxpbmtfZGlyOworCisgICAgICBsaW5rX2RpciA9IChjb25zdCBjaGFyICopbGluay0+ZGF0YTsKKyAgICAgIGlmIChzdHJjbXAgKGRpciwgbGlua19kaXIpID09IDApCisgICAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyB2b2lkCitzZXJ2aWNlX2RpcnNfYXBwZW5kX2xpbmtfdW5pcXVlX29yX2ZyZWUgKERCdXNMaXN0ICoqc2VydmljZV9kaXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAqZGlyX2xpbmspCit7CisgIGlmICghc2VydmljZV9kaXJzX2ZpbmRfZGlyIChzZXJ2aWNlX2RpcnMsIGRpcl9saW5rLT5kYXRhKSkKKyAgICB7CisgICAgICBfZGJ1c19saXN0X2FwcGVuZF9saW5rIChzZXJ2aWNlX2RpcnMsIGRpcl9saW5rKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBkYnVzX2ZyZWUgKGRpcl9saW5rLT5kYXRhKTsKKyAgICAgIF9kYnVzX2xpc3RfZnJlZV9saW5rIChkaXJfbGluayk7CisgICAgfQorfQorCitCdXNDb25maWdQYXJzZXIqCitidXNfY29uZmlnX3BhcnNlcl9uZXcgKGNvbnN0IERCdXNTdHJpbmcgICAgICAgICAgICAgKmJhc2VkaXIsCisgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgICAgICAgICAgICAgIGlzX3RvcGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCdXNDb25maWdQYXJzZXIgICAgICAgICpwYXJlbnQpCit7CisgIEJ1c0NvbmZpZ1BhcnNlciAqcGFyc2VyOworCisgIHBhcnNlciA9IGRidXNfbmV3MCAoQnVzQ29uZmlnUGFyc2VyLCAxKTsKKyAgaWYgKHBhcnNlciA9PSBOVUxMKQorICAgIGdvdG8gZmFpbGVkOworCisgIHBhcnNlci0+dHlwZSA9IEVMRU1FTlRfTk9ORTsKKworICAvKiBpbml0IHRoZSBsaXN0cyAqLworICBwYXJzZXItPnNlcnZpY2VfZGlycyA9IE5VTEw7CisKKyAgLyogaW5pdCB0aGUgc3RyaW5ncyAqLworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmcGFyc2VyLT51c2VyKSkKKyAgICBnb3RvIGZhaWxlZF9wYXJzZXI7CisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZwYXJzZXItPmJ1c190eXBlKSkKKyAgICBnb3RvIGZhaWxlZF90eXBlOworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmcGFyc2VyLT5zZXJ2aWNlX2hlbHBlcikpCisgICAgZ290byBmYWlsZWRfaGVscGVyOworCisgIC8qIHdvb3QhICovCisgIHJldHVybiBwYXJzZXI7CisKKy8qIGFyZ2guIHdlIGhhdmUgZG8gZG8gdGhpcyBjYXJlZnVsbHkgYmVjYXVzZSBvZiBPT00gKi8KK2ZhaWxlZF9oZWxwZXI6CisgIF9kYnVzX3N0cmluZ19mcmVlICgmcGFyc2VyLT5idXNfdHlwZSk7CitmYWlsZWRfdHlwZToKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwYXJzZXItPnVzZXIpOworZmFpbGVkX3BhcnNlcjoKKyAgZGJ1c19mcmVlIChwYXJzZXIpOworZmFpbGVkOgorICByZXR1cm4gTlVMTDsKK30KKwordm9pZAorYnVzX2NvbmZpZ19wYXJzZXJfdW5yZWYgKEJ1c0NvbmZpZ1BhcnNlciAqcGFyc2VyKQoreworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnBhcnNlci0+dXNlcik7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmcGFyc2VyLT5zZXJ2aWNlX2hlbHBlcik7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmcGFyc2VyLT5idXNfdHlwZSk7CisKKyAgX2RidXNfbGlzdF9mb3JlYWNoICgmcGFyc2VyLT5zZXJ2aWNlX2RpcnMsCisgICAgICAgICAgICAgICAgICAgICAgKERCdXNGb3JlYWNoRnVuY3Rpb24pIGRidXNfZnJlZSwKKyAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICBfZGJ1c19saXN0X2NsZWFyICgmcGFyc2VyLT5zZXJ2aWNlX2RpcnMpOworCisgIGRidXNfZnJlZSAocGFyc2VyKTsKK30KKworZGJ1c19ib29sX3QKK2J1c19jb25maWdfcGFyc2VyX2NoZWNrX2RvY3R5cGUgKEJ1c0NvbmZpZ1BhcnNlciAgICpwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAqZG9jdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICplcnJvcikKK3sKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgaWYgKHN0cmNtcCAoZG9jdHlwZSwgImJ1c2NvbmZpZyIpICE9IDApCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJDb25maWd1cmF0aW9uIGZpbGUgaGFzIHRoZSB3cm9uZyBkb2N1bWVudCB0eXBlICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBkb2N0eXBlKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4gVFJVRTsKK30KKworZGJ1c19ib29sX3QKK2J1c19jb25maWdfcGFyc2VyX3N0YXJ0X2VsZW1lbnQgKEJ1c0NvbmZpZ1BhcnNlciAgICpwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAqZWxlbWVudF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqKmF0dHJpYnV0ZV9uYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKiphdHRyaWJ1dGVfdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgKmVycm9yKQoreworICAvKiB3ZSBkb24ndCBkbyBwcm9jZXNzaW5nIG9mIGF0dHJpYnV0ZSBuYW1lcywgd2UgZG9uJ3QgbmVlZCB0byAqLworICBwYXJzZXItPnR5cGUgPSBidXNfY29uZmlnX3BhcnNlcl9lbGVtZW50X25hbWVfdG9fdHlwZSAoZWxlbWVudF9uYW1lKTsKKworICBzd2l0Y2ggKHBhcnNlci0+dHlwZSkKKyAgICB7CisgICAgY2FzZSBFTEVNRU5UX1NFUlZJQ0VESVI6CisgICAgY2FzZSBFTEVNRU5UX1NFUlZJQ0VIRUxQRVI6CisgICAgY2FzZSBFTEVNRU5UX1VTRVI6CisgICAgY2FzZSBFTEVNRU5UX0NPTkZJR1RZUEU6CisgICAgICAvKiBjb250ZW50IGFib3V0IHRvIGJlIGhhbmRsZWQgKi8KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBFTEVNRU5UX1NUQU5EQVJEX1NZU1RFTV9TRVJWSUNFRElSUzoKKyAgICAgIHsKKyAgICAgICAgREJ1c0xpc3QgKmxpbms7CisgICAgICAgIERCdXNMaXN0ICpkaXJzOworICAgICAgICBkaXJzID0gTlVMTDsKKworICAgICAgICBpZiAoIV9kYnVzX2dldF9zdGFuZGFyZF9zeXN0ZW1fc2VydmljZWRpcnMgKCZkaXJzKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgIH0KKworICAgICAgICAgIHdoaWxlICgobGluayA9IF9kYnVzX2xpc3RfcG9wX2ZpcnN0X2xpbmsgKCZkaXJzKSkpCisgICAgICAgICAgICBzZXJ2aWNlX2RpcnNfYXBwZW5kX2xpbmtfdW5pcXVlX29yX2ZyZWUgKCZwYXJzZXItPnNlcnZpY2VfZGlycywgbGluayk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgY2FzZSBFTEVNRU5UX05PTkU6CisgICAgY2FzZSBFTEVNRU5UX0JVU0NPTkZJRzoKKyAgICBjYXNlIEVMRU1FTlRfSU5DTFVERToKKyAgICBjYXNlIEVMRU1FTlRfTElTVEVOOgorICAgIGNhc2UgRUxFTUVOVF9BVVRIOgorICAgIGNhc2UgRUxFTUVOVF9QT0xJQ1k6CisgICAgY2FzZSBFTEVNRU5UX0xJTUlUOgorICAgIGNhc2UgRUxFTUVOVF9BTExPVzoKKyAgICBjYXNlIEVMRU1FTlRfREVOWToKKyAgICBjYXNlIEVMRU1FTlRfRk9SSzoKKyAgICBjYXNlIEVMRU1FTlRfUElERklMRToKKyAgICBjYXNlIEVMRU1FTlRfSU5DTFVERURJUjoKKyAgICBjYXNlIEVMRU1FTlRfU0VMSU5VWDoKKyAgICBjYXNlIEVMRU1FTlRfQVNTT0NJQVRFOgorICAgIGNhc2UgRUxFTUVOVF9TVEFOREFSRF9TRVNTSU9OX1NFUlZJQ0VESVJTOgorICAgIGNhc2UgRUxFTUVOVF9LRUVQX1VNQVNLOgorICAgIGNhc2UgRUxFTUVOVF9TWVNMT0c6CisgICAgY2FzZSBFTEVNRU5UX0FMTE9XX0FOT05ZTU9VUzoKKyAgICBjYXNlIEVMRU1FTlRfQVBQQVJNT1I6CisgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICBkZWZhdWx0OgorICAgICAgeworICAgICAgICAvKiB3ZSByZWFsbHkgZG9uJ3QgY2FyZSBhYm91dCB0aGUgb3RoZXJzLi4uICovCisgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgU1RBUlQgV2UgZG9uJ3QgY2FyZSBhYm91dCAnJXMnIHR5cGUgJyVpJ1xuIiwgZWxlbWVudF9uYW1lLCBwYXJzZXItPnR5cGUpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIHJldHVybiBUUlVFOworfQorCitkYnVzX2Jvb2xfdAorYnVzX2NvbmZpZ19wYXJzZXJfZW5kX2VsZW1lbnQgKEJ1c0NvbmZpZ1BhcnNlciAgICpwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgICAgICAgICplbGVtZW50X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgICAgICAgICplcnJvcikKK3sKKyAgLyogd2UgZG9uJ3QgY2FyZSAqLworICByZXR1cm4gVFJVRTsKK30KKworZGJ1c19ib29sX3QKK2J1c19jb25maWdfcGFyc2VyX2NvbnRlbnQgKEJ1c0NvbmZpZ1BhcnNlciAgICpwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICAqY29udGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICplcnJvcikKK3sKKyAgREJ1c1N0cmluZyBjb250ZW50X3NhbmU7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKworICByZXR2YWwgPSBGQUxTRTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmY29udGVudF9zYW5lKSkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgZ290byBvdXQ7CisgICAgfQorICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5IChjb250ZW50LCAwLCAmY29udGVudF9zYW5lLCAwKSkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgZ290byBvdXRfY29udGVudDsKKyAgICB9CisKKyAgLyogcmlwIG91dCB3aGl0ZSBzcGFjZSAqLworICBfZGJ1c19zdHJpbmdfY2hvcF93aGl0ZSAoJmNvbnRlbnRfc2FuZSk7CisgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmNvbnRlbnRfc2FuZSkgPT0gMCkKKyAgICB7CisgICAgICAvKiBvcHRpbWlzZSwgdGhlcmUgaXMgbm8gY29udGVudCAqLworICAgICAgcmV0dmFsID0gVFJVRTsKKyAgICAgIGdvdG8gb3V0X2NvbnRlbnQ7CisgICAgfQorCisgIHN3aXRjaCAocGFyc2VyLT50eXBlKQorICAgIHsKKyAgICBjYXNlIEVMRU1FTlRfU0VSVklDRURJUjoKKyAgICAgIHsKKyAgICAgIAljaGFyICpjcGF0aDsKKworICAgICAgICAvKiBjb3B5IHRoZSBzYW5lIGRhdGEgaW50byBhIGNoYXIgYXJyYXkgKi8KKyAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfY29weV9kYXRhKCZjb250ZW50X3NhbmUsICZjcGF0aCkpCisgICAgICAgICAgeworICAgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICAgIGdvdG8gb3V0X2NvbnRlbnQ7CisgICAgICAgICAgfQorCisgICAgICAgIC8qIGFwcGVuZCB0aGUgZHluYW1pYyBjaGFyIHN0cmluZyB0byBzZXJ2aWNlIGRpcnMgKi8KKyAgICAgICAgaWYgKCFfZGJ1c19saXN0X2FwcGVuZCAoJnBhcnNlci0+c2VydmljZV9kaXJzLCBjcGF0aCkpCisgICAgICAgICAgeworICAgICAgICAgICAgZGJ1c19mcmVlIChjcGF0aCk7CisgICAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgICAgZ290byBvdXRfY29udGVudDsKKyAgICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgRUxFTUVOVF9TRVJWSUNFSEVMUEVSOgorICAgICAgeworICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5ICgmY29udGVudF9zYW5lLCAwLCAmcGFyc2VyLT5zZXJ2aWNlX2hlbHBlciwgMCkpCisgICAgICAgICAgeworICAgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICAgIGdvdG8gb3V0X2NvbnRlbnQ7CisgICAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEVMRU1FTlRfVVNFUjoKKyAgICAgIHsKKyAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAoJmNvbnRlbnRfc2FuZSwgMCwgJnBhcnNlci0+dXNlciwgMCkpCisgICAgICAgICAgeworICAgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICAgIGdvdG8gb3V0X2NvbnRlbnQ7CisgICAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEVMRU1FTlRfQ09ORklHVFlQRToKKyAgICAgIHsKKyAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAoJmNvbnRlbnRfc2FuZSwgMCwgJnBhcnNlci0+YnVzX3R5cGUsIDApKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgICBnb3RvIG91dF9jb250ZW50OworICAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBFTEVNRU5UX05PTkU6CisgICAgY2FzZSBFTEVNRU5UX0JVU0NPTkZJRzoKKyAgICBjYXNlIEVMRU1FTlRfSU5DTFVERToKKyAgICBjYXNlIEVMRU1FTlRfTElTVEVOOgorICAgIGNhc2UgRUxFTUVOVF9BVVRIOgorICAgIGNhc2UgRUxFTUVOVF9QT0xJQ1k6CisgICAgY2FzZSBFTEVNRU5UX0xJTUlUOgorICAgIGNhc2UgRUxFTUVOVF9BTExPVzoKKyAgICBjYXNlIEVMRU1FTlRfREVOWToKKyAgICBjYXNlIEVMRU1FTlRfRk9SSzoKKyAgICBjYXNlIEVMRU1FTlRfUElERklMRToKKyAgICBjYXNlIEVMRU1FTlRfSU5DTFVERURJUjoKKyAgICBjYXNlIEVMRU1FTlRfU0VMSU5VWDoKKyAgICBjYXNlIEVMRU1FTlRfQVNTT0NJQVRFOgorICAgIGNhc2UgRUxFTUVOVF9TVEFOREFSRF9TRVNTSU9OX1NFUlZJQ0VESVJTOgorICAgIGNhc2UgRUxFTUVOVF9TVEFOREFSRF9TWVNURU1fU0VSVklDRURJUlM6CisgICAgY2FzZSBFTEVNRU5UX0tFRVBfVU1BU0s6CisgICAgY2FzZSBFTEVNRU5UX1NZU0xPRzoKKyAgICBjYXNlIEVMRU1FTlRfQUxMT1dfQU5PTllNT1VTOgorICAgIGNhc2UgRUxFTUVOVF9BUFBBUk1PUjoKKyAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLworICAgIGRlZmF1bHQ6CisgICAgICB7CisgICAgICAgIC8qIHdlIGRvbid0IGNhcmUgYWJvdXQgdGhlIG90aGVycy4uLiByZWFsbHkgKi8KKyAgICAgICAgX2RidXNfdmVyYm9zZSAoIiBDT05URU5UUyBXZSBkb24ndCBjYXJlIGFib3V0ICclcycgdHlwZSAnJWknXG4iLCBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZjb250ZW50X3NhbmUpLCBwYXJzZXItPnR5cGUpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisKKyAgLyogd29vdCEgKi8KKyAgcmV0dmFsID0gVFJVRTsKKworb3V0X2NvbnRlbnQ6CisgIF9kYnVzX3N0cmluZ19mcmVlICgmY29udGVudF9zYW5lKTsKK291dDoKKyAgcmV0dXJuIHJldHZhbDsKK30KKworZGJ1c19ib29sX3QKK2J1c19jb25maWdfcGFyc2VyX2ZpbmlzaGVkIChCdXNDb25maWdQYXJzZXIgICAqcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICplcnJvcikKK3sKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisgIF9kYnVzX3ZlcmJvc2UgKCJmaW5pc2hlZCBzY2FubmluZyFcbiIpOworICByZXR1cm4gVFJVRTsKK30KKworY29uc3QgY2hhcioKK2J1c19jb25maWdfcGFyc2VyX2dldF91c2VyIChCdXNDb25maWdQYXJzZXIgKnBhcnNlcikKK3sKKyAgcmV0dXJuIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJnBhcnNlci0+dXNlcik7Cit9CisKK2NvbnN0IGNoYXIqCitidXNfY29uZmlnX3BhcnNlcl9nZXRfdHlwZSAoQnVzQ29uZmlnUGFyc2VyICpwYXJzZXIpCit7CisgIHJldHVybiBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZwYXJzZXItPmJ1c190eXBlKTsKK30KKworLyoKKyAqIEByZXR1cm5zIEEgbGlzdCBvZiBzdHJpbmdzLCBvd25lZCBieSB0aGUgQnVzQ29uZmlnUGFyc2VyCisgKi8KK0RCdXNMaXN0KioKK2J1c19jb25maWdfcGFyc2VyX2dldF9zZXJ2aWNlX3BhdGhzIChCdXNDb25maWdQYXJzZXIgKnBhcnNlcikKK3sKKyAgcmV0dXJuICZwYXJzZXItPnNlcnZpY2VfZGlyczsKK30KKworI2lmZGVmIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJ0ZXN0LmgiCisKK3R5cGVkZWYgZW51bQoreworICBWQUxJRCwKKyAgSU5WQUxJRCwKKyAgVU5LTk9XTgorfSBWYWxpZGl0eTsKKworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19yZXR1cm5fdmFsdWVzIChjb25zdCBEQnVzU3RyaW5nICpmdWxsX3BhdGgpCit7CisgIEJ1c0NvbmZpZ1BhcnNlciAqcGFyc2VyOworICBEQnVzRXJyb3IgZXJyb3I7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgY29uc3QgY2hhciAqdXNlcjsKKyAgY29uc3QgY2hhciAqdHlwZTsKKyAgREJ1c0xpc3QgKipkaXJzOworCisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKyAgcmV0dmFsID0gRkFMU0U7CisKKyAgcHJpbnRmICgiVGVzdGluZyB2YWx1ZXMgZnJvbTogJXNcbiIsIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoZnVsbF9wYXRoKSk7CisKKyAgcGFyc2VyID0gYnVzX2NvbmZpZ19sb2FkIChmdWxsX3BhdGgsIFRSVUUsIE5VTEwsICZlcnJvcik7CisgIGlmIChwYXJzZXIgPT0gTlVMTCkKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUICgmZXJyb3IpOworICAgICAgaWYgKGRidXNfZXJyb3JfaGFzX25hbWUgKCZlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlkpKQorICAgICAgICBfZGJ1c192ZXJib3NlICgiRmFpbGVkIHRvIGxvYWQgdmFsaWQgZmlsZSBkdWUgdG8gT09NXG4iKTsKKyAgICAgIGdvdG8gZmluaXNoOworICAgIH0KKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSICgmZXJyb3IpOworCisgIC8qIGNoZWNrIHVzZXIgcmV0dXJuIHZhbHVlIGlzIG9rYXkgKi8KKyAgdXNlciA9IGJ1c19jb25maWdfcGFyc2VyX2dldF91c2VyIChwYXJzZXIpOworICBpZiAodXNlciA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJVc2VyIHdhcyBOVUxMISIpOworICAgICAgZ290byBmaW5pc2g7CisgICAgfQorI2lmIDAKKyAgLyogdGhlIHVzZXJuYW1lIGNhbiBiZSBjb25maWd1cmVkIGluIGNvbmZpZ3VyZS5pbiBzbyB0aGlzIHRlc3QgZG9lc24ndCB3b3JrICovCisgIGlmIChzdHJjbXAgKHVzZXIsICJkYnVzIikgIT0gMCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiVXNlciB3YXMgaW52YWxpZDsgJyVzJyEiLCB1c2VyKTsKKyAgICAgIGdvdG8gZmluaXNoOworICAgIH0KKyAgcHJpbnRmICgiICAgIDx1c2VyPmRidXM8L3VzZXI+IE9LQVkhXG4iKTsgIAorI2VuZGlmCisgIAorICAvKiBjaGVjayB0eXBlIHJldHVybiB2YWx1ZSBpcyBva2F5ICovCisgIHR5cGUgPSBidXNfY29uZmlnX3BhcnNlcl9nZXRfdHlwZSAocGFyc2VyKTsKKyAgaWYgKHR5cGUgPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiVHlwZSB3YXMgTlVMTCEiKTsKKyAgICAgIGdvdG8gZmluaXNoOworICAgIH0KKyAgaWYgKHN0cmNtcCAodHlwZSwgInN5c3RlbSIpICE9IDApCisgICAgeworICAgICAgX2RidXNfd2FybiAoIlR5cGUgd2FzIGludmFsaWQ7ICclcychIiwgdXNlcik7CisgICAgICBnb3RvIGZpbmlzaDsKKyAgICB9CisgIHByaW50ZiAoIiAgICA8dHlwZT5zeXN0ZW08L3R5cGU+IE9LQVkhXG4iKTsKKworICAvKiBjaGVjayBkaXJzIHJldHVybiB2YWx1ZSBpcyBva2F5ICovCisgIGRpcnMgPSBidXNfY29uZmlnX3BhcnNlcl9nZXRfc2VydmljZV9wYXRocyAocGFyc2VyKTsKKyAgaWYgKGRpcnMgPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiU2VydmljZSBkaXJzIGFyZSBOVUxMISIpOworICAgICAgZ290byBmaW5pc2g7CisgICAgfQorICBwcmludGYgKCIgICAgPHN0YW5kYXJkX3N5c3RlbV9zZXJ2aWNlX2RpcnMvPiBPS0FZIVxuIik7CisgIC8qIE5PVEU6IFdlIHRlc3RlZCB0aGUgc3BlY2lmaWMgcmV0dXJuIHZhbHVlcyBpbiB0aGUgY29uZmlnLXBhcnNlciB0ZXN0cyAqLworCisgIC8qIHdvb2hvbyEgKi8KKyAgcmV0dmFsID0gVFJVRTsKK2ZpbmlzaDoKKyAgaWYgKHBhcnNlciAhPSBOVUxMKQorICAgIGJ1c19jb25maWdfcGFyc2VyX3VucmVmIChwYXJzZXIpOworICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZG9fbG9hZCAoY29uc3QgREJ1c1N0cmluZyAqZnVsbF9wYXRoLAorICAgICAgICAgVmFsaWRpdHkgICAgICAgICAgdmFsaWRpdHksCisgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICBvb21fcG9zc2libGUpCit7CisgIEJ1c0NvbmZpZ1BhcnNlciAqcGFyc2VyOworICBEQnVzRXJyb3IgZXJyb3I7CisKKyAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworCisgIHBhcnNlciA9IGJ1c19jb25maWdfbG9hZCAoZnVsbF9wYXRoLCBUUlVFLCBOVUxMLCAmZXJyb3IpOworICBpZiAocGFyc2VyID09IE5VTEwpCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoJmVycm9yKTsKKworICAgICAgaWYgKG9vbV9wb3NzaWJsZSAmJgorICAgICAgICAgIGRidXNfZXJyb3JfaGFzX25hbWUgKCZlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlkpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkZhaWxlZCB0byBsb2FkIHZhbGlkIGZpbGUgZHVlIHRvIE9PTVxuIik7CisgICAgICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICB9CisgICAgICBlbHNlIGlmICh2YWxpZGl0eSA9PSBWQUxJRCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJGYWlsZWQgdG8gbG9hZCB2YWxpZCBmaWxlIGJ1dCBzdGlsbCBoYWQgbWVtb3J5OiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgZXJyb3IubWVzc2FnZSk7CisKKyAgICAgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKCZlcnJvcik7CisKKyAgICAgIGJ1c19jb25maWdfcGFyc2VyX3VucmVmIChwYXJzZXIpOworCisgICAgICBpZiAodmFsaWRpdHkgPT0gSU5WQUxJRCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJBY2NlcHRlZCBpbnZhbGlkIGZpbGUiKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorfQorCit0eXBlZGVmIHN0cnVjdAoreworICBjb25zdCBEQnVzU3RyaW5nICpmdWxsX3BhdGg7CisgIFZhbGlkaXR5ICAgICAgICAgIHZhbGlkaXR5OworfSBMb2FkZXJPb21EYXRhOworCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX2xvYWRlcl9vb21fZnVuYyAodm9pZCAqZGF0YSkKK3sKKyAgTG9hZGVyT29tRGF0YSAqZCA9IGRhdGE7CisKKyAgcmV0dXJuIGRvX2xvYWQgKGQtPmZ1bGxfcGF0aCwgZC0+dmFsaWRpdHksIFRSVUUpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3Byb2Nlc3NfdGVzdF92YWxpZF9zdWJkaXIgKGNvbnN0IERCdXNTdHJpbmcgKnRlc3RfYmFzZV9kaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICpzdWJkaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGl0eSAgICAgICAgICB2YWxpZGl0eSkKK3sKKyAgREJ1c1N0cmluZyB0ZXN0X2RpcmVjdG9yeTsKKyAgREJ1c1N0cmluZyBmaWxlbmFtZTsKKyAgREJ1c0Rpckl0ZXIgKmRpcjsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICBEQnVzRXJyb3IgZXJyb3I7CisKKyAgcmV0dmFsID0gRkFMU0U7CisgIGRpciA9IE5VTEw7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnRlc3RfZGlyZWN0b3J5KSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJkaWRuJ3QgYWxsb2NhdGUgdGVzdF9kaXJlY3RvcnkiKTsKKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJmZpbGVuYW1lLCBzdWJkaXIpOworCisgIGlmICghX2RidXNfc3RyaW5nX2NvcHkgKHRlc3RfYmFzZV9kaXIsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZXN0X2RpcmVjdG9yeSwgMCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGRuJ3QgY29weSB0ZXN0X2Jhc2VfZGlyIHRvIHRlc3RfZGlyZWN0b3J5Iik7CisKKyAgaWYgKCFfZGJ1c19jb25jYXRfZGlyX2FuZF9maWxlICgmdGVzdF9kaXJlY3RvcnksICZmaWxlbmFtZSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGRuJ3QgYWxsb2NhdGUgZnVsbCBwYXRoIik7CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmaWxlbmFtZSk7CisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZmaWxlbmFtZSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZGlkbid0IGFsbG9jYXRlIGZpbGVuYW1lIHN0cmluZyIpOworCisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKyAgZGlyID0gX2RidXNfZGlyZWN0b3J5X29wZW4gKCZ0ZXN0X2RpcmVjdG9yeSwgJmVycm9yKTsKKyAgaWYgKGRpciA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJDb3VsZCBub3Qgb3BlbiAlczogJXMiLAorICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmdGVzdF9kaXJlY3RvcnkpLAorICAgICAgICAgICAgICAgICAgZXJyb3IubWVzc2FnZSk7CisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgaWYgKHZhbGlkaXR5ID09IFZBTElEKQorICAgIHByaW50ZiAoIlRlc3RpbmcgdmFsaWQgZmlsZXM6XG4iKTsKKyAgZWxzZSBpZiAodmFsaWRpdHkgPT0gSU5WQUxJRCkKKyAgICBwcmludGYgKCJUZXN0aW5nIGludmFsaWQgZmlsZXM6XG4iKTsKKyAgZWxzZQorICAgIHByaW50ZiAoIlRlc3RpbmcgdW5rbm93biBmaWxlczpcbiIpOworCisgbmV4dDoKKyAgd2hpbGUgKF9kYnVzX2RpcmVjdG9yeV9nZXRfbmV4dF9maWxlIChkaXIsICZmaWxlbmFtZSwgJmVycm9yKSkKKyAgICB7CisgICAgICBEQnVzU3RyaW5nIGZ1bGxfcGF0aDsKKyAgICAgIExvYWRlck9vbURhdGEgZDsKKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmZ1bGxfcGF0aCkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkbid0IGluaXQgc3RyaW5nIik7CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2NvcHkgKCZ0ZXN0X2RpcmVjdG9yeSwgMCwgJmZ1bGxfcGF0aCwgMCkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkbid0IGNvcHkgZGlyIHRvIGZ1bGxfcGF0aCIpOworCisgICAgICBpZiAoIV9kYnVzX2NvbmNhdF9kaXJfYW5kX2ZpbGUgKCZmdWxsX3BhdGgsICZmaWxlbmFtZSkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkbid0IGNvbmNhdCBmaWxlIHRvIGRpciIpOworCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19lbmRzX3dpdGhfY19zdHIgKCZmdWxsX3BhdGgsICIuY29uZiIpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIlNraXBwaW5nIG5vbi0uY29uZiBmaWxlICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmZpbGVuYW1lKSk7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmdWxsX3BhdGgpOworICAgICAgICAgIGdvdG8gbmV4dDsKKyAgICAgICAgfQorCisgICAgICBwcmludGYgKCIgICAgJXNcbiIsIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmZpbGVuYW1lKSk7CisKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgZXhwZWN0aW5nICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgdmFsaWRpdHkgPT0gVkFMSUQgPyAidmFsaWQiIDoKKyAgICAgICAgICAgICAgICAgICAgICh2YWxpZGl0eSA9PSBJTlZBTElEID8gImludmFsaWQiIDoKKyAgICAgICAgICAgICAgICAgICAgICAodmFsaWRpdHkgPT0gVU5LTk9XTiA/ICJ1bmtub3duIiA6ICI/Pz8iKSkpOworCisgICAgICBkLmZ1bGxfcGF0aCA9ICZmdWxsX3BhdGg7CisgICAgICBkLnZhbGlkaXR5ID0gdmFsaWRpdHk7CisKKyAgICAgIC8qIEZJWE1FIGhhY2thcm91bmQgZm9yIGFuIGV4cGF0IHByb2JsZW0sIHNlZQorICAgICAgICogaHR0cHM6Ly9idWd6aWxsYS5yZWRoYXQuY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD0xMjQ3NDcKKyAgICAgICAqIGh0dHA6Ly9mcmVlZGVza3RvcC5vcmcvcGlwZXJtYWlsL2RidXMvMjAwNC1NYXkvMDAxMTUzLmh0bWwKKyAgICAgICAqLworICAgICAgLyogaWYgKCFfZGJ1c190ZXN0X29vbV9oYW5kbGluZyAoImNvbmZpZy1sb2FkZXIiLCBjaGVja19sb2FkZXJfb29tX2Z1bmMsICZkKSkgKi8KKyAgICAgIGlmICghY2hlY2tfbG9hZGVyX29vbV9mdW5jICgmZCkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInRlc3QgZmFpbGVkIik7CisgICAgICAKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmZnVsbF9wYXRoKTsKKyAgICB9CisKKyAgaWYgKGRidXNfZXJyb3JfaXNfc2V0ICgmZXJyb3IpKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJDb3VsZCBub3QgZ2V0IG5leHQgZmlsZSBpbiAlczogJXMiLAorICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmdGVzdF9kaXJlY3RvcnkpLAorICAgICAgICAgICAgICAgICAgZXJyb3IubWVzc2FnZSk7CisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgcmV0dmFsID0gVFJVRTsKKworIGZhaWxlZDoKKworICBpZiAoZGlyKQorICAgIF9kYnVzX2RpcmVjdG9yeV9jbG9zZSAoZGlyKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ0ZXN0X2RpcmVjdG9yeSk7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmZmlsZW5hbWUpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKKy8qIGNvbnZlbmllbmNlIGZ1bmN0aW9uLCBkbyBub3QgcmV1c2Ugb3V0c2lkZSBvZiBURVNUICovCitzdGF0aWMgZGJ1c19ib29sX3QKK21ha2VfZnVsbF9wYXRoIChjb25zdCBEQnVzU3RyaW5nICp0ZXN0X2RhdGFfZGlyLAorCQkJICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKnN1YmRpciwKKwkJCSAgICAgICAgICBjb25zdCBjaGFyICAgICAgICpmaWxlLAorCQkJICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgKmZ1bGxfcGF0aCkKK3sKKyAgREJ1c1N0cmluZyBmaWxlbmFtZTsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworCisgIHJldHZhbCA9IEZBTFNFOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKGZ1bGxfcGF0aCkpCisgICAgeworICAgICAgX2RidXNfd2FybiAoImNvdWxkbid0IGFsbG9jYXRlIGZ1bGwgcGF0aCIpOworICAgICAgZ290byBmaW5pc2g7CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX2NvcHkgKHRlc3RfZGF0YV9kaXIsIDAsIGZ1bGxfcGF0aCwgMCkpCisgICAgeworICAgICAgX2RidXNfd2FybiAoImNvdWxkbid0IGFsbG9jYXRlIGZ1bGwgcGF0aCIpOworICAgICAgZ290byBmaW5pc2g7CisgICAgfQorCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmZmlsZW5hbWUsIHN1YmRpcik7CisgIGlmICghX2RidXNfY29uY2F0X2Rpcl9hbmRfZmlsZSAoZnVsbF9wYXRoLCAmZmlsZW5hbWUpKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJjb3VsZG4ndCBhbGxvY2F0ZSBmdWxsIHBhdGgiKTsKKyAgICAgIGdvdG8gZmluaXNoOworICAgIH0KKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmaWxlbmFtZSk7CisKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZmaWxlbmFtZSwgZmlsZSk7CisgIGlmICghX2RidXNfY29uY2F0X2Rpcl9hbmRfZmlsZSAoZnVsbF9wYXRoLCAmZmlsZW5hbWUpKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJjb3VsZG4ndCBhbGxvY2F0ZSBmdWxsIHBhdGgiKTsKKyAgICAgIGdvdG8gZmluaXNoOworICAgIH0KKworICAvKiB3b290ISAqLworICByZXR2YWwgPSBUUlVFOworCitmaW5pc2g6CisgIF9kYnVzX3N0cmluZ19mcmVlICgmZmlsZW5hbWUpOworICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX2ZpbGVfdmFsaWQgKERCdXNTdHJpbmcgKmZ1bGxfcGF0aCwKKwkJCSAgICAgICAgICAgIFZhbGlkaXR5ICAgIHZhbGlkaXR5KQoreworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisKKyAgaWYgKHZhbGlkaXR5ID09IFZBTElEKQorICAgIHByaW50ZiAoIlRlc3RpbmcgdmFsaWQgZmlsZTpcbiIpOworICBlbHNlIGlmICh2YWxpZGl0eSA9PSBJTlZBTElEKQorICAgIHByaW50ZiAoIlRlc3RpbmcgaW52YWxpZCBmaWxlOlxuIik7CisgIGVsc2UKKyAgICBwcmludGYgKCJUZXN0aW5nIHVua25vd24gZmlsZTpcbiIpOworCisgIC8qIHByaW50IHRoZSBmaWxlbmFtZSwganVzdCBzbyB3ZSBtYXRjaCB0aGUgb3RoZXIgb3V0cHV0ICovCisgIHByaW50ZiAoIiAgICAlc1xuIiwgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChmdWxsX3BhdGgpKTsKKworICAvKiBvbmx5IHRlc3Qgb25lIGZpbGUgKi8KKyAgcmV0dmFsID0gZG9fbG9hZCAoZnVsbF9wYXRoLCB2YWxpZGl0eSwgVFJVRSk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworZGJ1c19ib29sX3QKK2J1c19jb25maWdfcGFyc2VyX3RyaXZpYWxfdGVzdCAoY29uc3QgREJ1c1N0cmluZyAqdGVzdF9kYXRhX2RpcikKK3sKKyAgREJ1c1N0cmluZyBmdWxsX3BhdGg7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKworICByZXR2YWwgPSBGQUxTRTsKKworICBpZiAodGVzdF9kYXRhX2RpciA9PSBOVUxMIHx8CisgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAodGVzdF9kYXRhX2RpcikgPT0gMCkKKyAgICB7CisgICAgICBwcmludGYgKCJObyB0ZXN0IGRhdGFcbiIpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICAKKyAgLyogV2UgYWxyZWFkeSB0ZXN0IGRlZmF1bHRfc2Vzc2lvbl9zZXJ2aWNlZGlycyBhbmQgZGVmYXVsdF9zeXN0ZW1fc2VydmljZWRpcnMKKyAgICogaW4gYnVzX2NvbmZpZ19wYXJzZXJfdGVzdCgpICovCisgIGlmICghcHJvY2Vzc190ZXN0X3ZhbGlkX3N1YmRpciAodGVzdF9kYXRhX2RpciwgInZhbGlkLWNvbmZpZy1maWxlcyIsIFZBTElEKSkKKyAgICBnb3RvIGZpbmlzaDsKKworI2lmbmRlZiBEQlVTX1dJTgorICAvKiBXZSBhbHJlYWR5IHRlc3QgZGVmYXVsdF9zZXNzaW9uX3NlcnZpY2VkaXJzIGFuZCBkZWZhdWx0X3N5c3RlbV9zZXJ2aWNlZGlycworICAgKiBpbiBidXNfY29uZmlnX3BhcnNlcl90ZXN0KCkgKi8KKyAgaWYgKCFwcm9jZXNzX3Rlc3RfdmFsaWRfc3ViZGlyICh0ZXN0X2RhdGFfZGlyLCAidmFsaWQtY29uZmlnLWZpbGVzLXN5c3RlbSIsIFZBTElEKSkKKyAgICBnb3RvIGZpbmlzaDsKKyNlbmRpZgorCisgIC8qIHdlIGRvbid0IHByb2Nlc3MgYWxsIHRoZSBpbnZhbGlkIGZpbGVzLCBhcyB0aGUgdHJpdmlhbCBwYXJzZXIgY2FuJ3QgaG9wZQorICAgKiB0byB2YWxpZGF0ZSB0aGVtIGFsbCBmb3IgYWxsIGRpZmZlcmVudCBzeW50YXhlcy4gV2UganVzdCBjaGVjayBvbmUgYnJva2VuCisgICAqIGZpbGUgdG8gc2VlIGlmIGp1bmsgaXMgcmVjZWl2ZWQgKi8KKyAgaWYgKCFtYWtlX2Z1bGxfcGF0aCAodGVzdF9kYXRhX2RpciwgImludmFsaWQtY29uZmlnLWZpbGVzIiwgIm5vdC13ZWxsLWZvcm1lZC5jb25mIiwgJmZ1bGxfcGF0aCkpCisgICAgZ290byBmaW5pc2g7CisgIGlmICghY2hlY2tfZmlsZV92YWxpZCAoJmZ1bGxfcGF0aCwgSU5WQUxJRCkpCisgICAgZ290byBmaW5pc2g7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmZnVsbF9wYXRoKTsKKworI2lmbmRlZiBEQlVTX1dJTgorICAvKiBqdXN0IHRlc3QgaWYgdGhlIGNoZWNrX2ZpbGVfdmFsaWQgd29ya3Mgb2theSBhbmQgd2UgZ290IHNhbmUgdmFsdWVzICovCisgIGlmICghbWFrZV9mdWxsX3BhdGggKHRlc3RfZGF0YV9kaXIsICJ2YWxpZC1jb25maWctZmlsZXMtc3lzdGVtIiwgInN5c3RlbS5jb25mIiwgJmZ1bGxfcGF0aCkpCisgICAgZ290byBmaW5pc2g7CisgIGlmICghY2hlY2tfZmlsZV92YWxpZCAoJmZ1bGxfcGF0aCwgVkFMSUQpKQorICAgIGdvdG8gZmluaXNoOworICAvKiBjaGVjayB0byBzZWUgaWYgd2UgZ290IHRoZSBjb3JyZWN0IHZhbHVlcyBmcm9tIHRoZSBwYXJzZXIgKi8KKyAgaWYgKCFjaGVja19yZXR1cm5fdmFsdWVzICgmZnVsbF9wYXRoKSkKKyAgICBnb3RvIGZpbmlzaDsKKyNlbmRpZgorCisgIC8qIHdvb3QhICovCisgIHJldHZhbCA9IFRSVUU7CisKK2ZpbmlzaDoKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmdWxsX3BhdGgpOworCisgIC8qIHdlIGRvbid0IHByb2Nlc3MgZXF1aXYtY29uZmlnLWZpbGVzIGFzIHdlIGRvbid0IGhhbmRsZSA8aW5jbHVkZT4gKi8KKyAgcmV0dXJuIHJldHZhbDsKK30KKworI2VuZGlmIC8qIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTICovCisKZGlmZiAtLWdpdCBhL2J1cy9jb25maWctcGFyc2VyLXRyaXZpYWwuaCBiL2J1cy9jb25maWctcGFyc2VyLXRyaXZpYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmU0MWZkCi0tLSAvZGV2L251bGwKKysrIGIvYnVzL2NvbmZpZy1wYXJzZXItdHJpdmlhbC5oCkBAIC0wLDAgKzEsNzIgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogY29uZmlnLXBhcnNlci10cml2aWFsLmggIFhNTC1saWJyYXJ5LWFnbm9zdGljIGNvbmZpZ3VyYXRpb24gZmlsZSBwYXJzZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaWZuZGVmIEJVU19DT05GSUdfUEFSU0VSX1RSSVZJQUxfSAorI2RlZmluZSBCVVNfQ09ORklHX1BBUlNFUl9UUklWSUFMX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zdHJpbmcuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbGlzdC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1oYXNoLmg+CisKKy8qIFdoYXRldmVyIFhNTCBsaWJyYXJ5IHdlJ3JlIHVzaW5nIGp1c3QgcHVzaGVzIGRhdGEgaW50byB0aGlzIEFQSSAqLworCit0eXBlZGVmIHN0cnVjdCBCdXNDb25maWdQYXJzZXIgQnVzQ29uZmlnUGFyc2VyOworCitCdXNDb25maWdQYXJzZXIqIGJ1c19jb25maWdfcGFyc2VyX25ldyAoY29uc3QgREJ1c1N0cmluZyAgICAgICpiYXNlZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgICAgICAgaXNfdG9wbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnVzQ29uZmlnUGFyc2VyICpwYXJlbnQpOworCitCdXNDb25maWdQYXJzZXIqIGJ1c19jb25maWdfcGFyc2VyX3JlZiAgICAgICAgICAgKEJ1c0NvbmZpZ1BhcnNlciAgICpwYXJzZXIpOwordm9pZCAgICAgICAgICAgICBidXNfY29uZmlnX3BhcnNlcl91bnJlZiAgICAgICAgIChCdXNDb25maWdQYXJzZXIgICAqcGFyc2VyKTsKK2RidXNfYm9vbF90ICAgICAgYnVzX2NvbmZpZ19wYXJzZXJfY2hlY2tfZG9jdHlwZSAoQnVzQ29uZmlnUGFyc2VyICAgKnBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgKmRvY3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICplcnJvcik7CitkYnVzX2Jvb2xfdCAgICAgIGJ1c19jb25maWdfcGFyc2VyX3N0YXJ0X2VsZW1lbnQgKEJ1c0NvbmZpZ1BhcnNlciAgICpwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICplbGVtZW50X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKiphdHRyaWJ1dGVfbmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKiphdHRyaWJ1dGVfdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAqZXJyb3IpOworZGJ1c19ib29sX3QgICAgICBidXNfY29uZmlnX3BhcnNlcl9lbmRfZWxlbWVudCAgIChCdXNDb25maWdQYXJzZXIgICAqcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAqZWxlbWVudF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAqZXJyb3IpOworZGJ1c19ib29sX3QgICAgICBidXNfY29uZmlnX3BhcnNlcl9jb250ZW50ICAgICAgIChCdXNDb25maWdQYXJzZXIgICAqcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICAqY29udGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgKmVycm9yKTsKK2RidXNfYm9vbF90ICAgICAgYnVzX2NvbmZpZ19wYXJzZXJfZmluaXNoZWQgICAgICAoQnVzQ29uZmlnUGFyc2VyICAgKnBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgKmVycm9yKTsKKworLyogRnVuY3Rpb25zIGZvciBleHRyYWN0aW5nIHRoZSBwYXJzZSByZXN1bHRzICovCitjb25zdCBjaGFyKiBidXNfY29uZmlnX3BhcnNlcl9nZXRfdXNlciAgICAgICAgIChCdXNDb25maWdQYXJzZXIgKnBhcnNlcik7Citjb25zdCBjaGFyKiBidXNfY29uZmlnX3BhcnNlcl9nZXRfdHlwZSAgICAgICAgIChCdXNDb25maWdQYXJzZXIgKnBhcnNlcik7CitEQnVzTGlzdCoqICBidXNfY29uZmlnX3BhcnNlcl9nZXRfc2VydmljZV9wYXRocyAoQnVzQ29uZmlnUGFyc2VyICpwYXJzZXIpOworCisvKiBMb2FkZXIgZnVuY3Rpb25zIChiYWNrZW5kZWQgb2ZmIG9uZSBvZiB0aGUgWE1MIHBhcnNlcnMpLiAgUmV0dXJucyBhCisgKiBmaW5pc2hlZCBDb25maWdQYXJzZXIuCisgKi8KK0J1c0NvbmZpZ1BhcnNlciogYnVzX2NvbmZpZ19sb2FkIChjb25zdCBEQnVzU3RyaW5nICAgICAgKmZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgICAgICBpc190b3BsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCdXNDb25maWdQYXJzZXIgKnBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAgICAgKmVycm9yKTsKKworI2VuZGlmIC8qIEJVU19DT05GSUdfUEFSU0VSX1RSSVZJQUxfSCAqLwpkaWZmIC0tZ2l0IGEvYnVzL2NvbmZpZy1wYXJzZXIuYyBiL2J1cy9jb25maWctcGFyc2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmUyN2QzOAotLS0gL2Rldi9udWxsCisrKyBiL2J1cy9jb25maWctcGFyc2VyLmMKQEAgLTAsMCArMSw0MDUwIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGNvbmZpZy1wYXJzZXIuYyAgWE1MLWxpYnJhcnktYWdub3N0aWMgY29uZmlndXJhdGlvbiBmaWxlIHBhcnNlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiY29uZmlnLXBhcnNlci1jb21tb24uaCIKKyNpbmNsdWRlICJjb25maWctcGFyc2VyLmgiCisjaW5jbHVkZSAidGVzdC5oIgorI2luY2x1ZGUgInV0aWxzLmgiCisjaW5jbHVkZSAicG9saWN5LmgiCisjaW5jbHVkZSAic2VsaW51eC5oIgorI2luY2x1ZGUgImFwcGFybW9yLmgiCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWxpc3QuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtaW50ZXJuYWxzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLW1pc2MuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc3lzZGVwcy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCit0eXBlZGVmIGVudW0KK3sKKyAgLyogd2UgaWdub3JlIHBvbGljaWVzIGZvciB1bmtub3duIGdyb3Vwcy91c2VycyAqLworICBQT0xJQ1lfSUdOT1JFRCwKKworICAvKiBub24taWdub3JlZCAqLworICBQT0xJQ1lfREVGQVVMVCwKKyAgUE9MSUNZX01BTkRBVE9SWSwKKyAgUE9MSUNZX1VTRVIsCisgIFBPTElDWV9HUk9VUCwKKyAgUE9MSUNZX0NPTlNPTEUKK30gUG9saWN5VHlwZTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgRWxlbWVudFR5cGUgdHlwZTsKKworICB1bnNpZ25lZCBpbnQgaGFkX2NvbnRlbnQgOiAxOworCisgIHVuaW9uCisgIHsKKyAgICBzdHJ1Y3QKKyAgICB7CisgICAgICB1bnNpZ25lZCBpbnQgaWdub3JlX21pc3NpbmcgOiAxOworICAgICAgdW5zaWduZWQgaW50IGlmX3NlbGludXhfZW5hYmxlZCA6IDE7CisgICAgICB1bnNpZ25lZCBpbnQgc2VsaW51eF9yb290X3JlbGF0aXZlIDogMTsKKyAgICB9IGluY2x1ZGU7CisKKyAgICBzdHJ1Y3QKKyAgICB7CisgICAgICBQb2xpY3lUeXBlIHR5cGU7CisgICAgICB1bnNpZ25lZCBsb25nIGdpZF91aWRfb3JfYXRfY29uc29sZTsgICAgICAKKyAgICB9IHBvbGljeTsKKworICAgIHN0cnVjdAorICAgIHsKKyAgICAgIGNoYXIgKm5hbWU7CisgICAgICBsb25nIHZhbHVlOworICAgIH0gbGltaXQ7CisgICAgCisgIH0gZDsKKworfSBFbGVtZW50OworCisvKioKKyAqIFBhcnNlciBmb3IgYnVzIGNvbmZpZ3VyYXRpb24gZmlsZS4gCisgKi8KK3N0cnVjdCBCdXNDb25maWdQYXJzZXIKK3sKKyAgaW50IHJlZmNvdW50OyAgICAgICAgLyoqPCBSZWZlcmVuY2UgY291bnQgKi8KKworICBEQnVzU3RyaW5nIGJhc2VkaXI7ICAvKio8IERpcmVjdG9yeSB3ZSByZXNvbHZlIHBhdGhzIHJlbGF0aXZlIHRvICovCisgIAorICBEQnVzTGlzdCAqc3RhY2s7ICAgICAvKio8IHN0YWNrIG9mIEVsZW1lbnQgKi8KKworICBjaGFyICp1c2VyOyAgICAgICAgICAvKio8IHVzZXIgdG8gcnVuIGFzICovCisKKyAgY2hhciAqc2VydmljZWhlbHBlcjsgLyoqPCBsb2NhdGlvbiBvZiB0aGUgc2V0dWlkIGhlbHBlciAqLworCisgIGNoYXIgKmJ1c190eXBlOyAgICAgICAgICAvKio8IE1lc3NhZ2UgYnVzIHR5cGUgKi8KKyAgCisgIERCdXNMaXN0ICpsaXN0ZW5fb247IC8qKjwgTGlzdCBvZiBhZGRyZXNzZXMgdG8gbGlzdGVuIHRvICovCisKKyAgREJ1c0xpc3QgKm1lY2hhbmlzbXM7IC8qKjwgQXV0aCBtZWNoYW5pc21zICovCisKKyAgREJ1c0xpc3QgKnNlcnZpY2VfZGlyczsgLyoqPCBCdXNDb25maWdTZXJ2aWNlRGlycyB0byBsb29rIGZvciBzZXNzaW9uIHNlcnZpY2VzIGluICovCisKKyAgREJ1c0xpc3QgKmNvbmZfZGlyczsgICAvKio8IERpcmVjdG9yaWVzIHRvIGxvb2sgZm9yIHBvbGljeSBjb25maWd1cmF0aW9uIGluICovCisKKyAgQnVzUG9saWN5ICpwb2xpY3k7ICAgICAvKio8IFNlY3VyaXR5IHBvbGljeSAqLworCisgIEJ1c0xpbWl0cyBsaW1pdHM7ICAgICAgLyoqPCBMaW1pdHMgKi8KKworICBjaGFyICpwaWRmaWxlOyAgICAgICAgIC8qKjwgUElEIGZpbGUgKi8KKworICBEQnVzTGlzdCAqaW5jbHVkZWRfZmlsZXM7ICAvKio8IEluY2x1ZGVkIGZpbGVzIHN0YWNrICovCisKKyAgREJ1c0hhc2hUYWJsZSAqc2VydmljZV9jb250ZXh0X3RhYmxlOyAvKio8IE1hcCBzZXJ2aWNlIG5hbWVzIHRvIFNFTGludXggY29udGV4dHMgKi8KKworICB1bnNpZ25lZCBpbnQgZm9yayA6IDE7IC8qKjwgVFJVRSB0byBmb3JrIGludG8gZGFlbW9uIG1vZGUgKi8KKworICB1bnNpZ25lZCBpbnQgc3lzbG9nIDogMTsgLyoqPCBUUlVFIHRvIGVuYWJsZSBzeXNsb2cgKi8KKyAgdW5zaWduZWQgaW50IGtlZXBfdW1hc2sgOiAxOyAvKio8IFRSVUUgdG8ga2VlcCBvcmlnaW5hbCB1bWFzayB3aGVuIGZvcmtpbmcgKi8KKworICB1bnNpZ25lZCBpbnQgaXNfdG9wbGV2ZWwgOiAxOyAvKio8IEZBTFNFIGlmIHdlIGFyZSBhIHN1Yi1jb25maWctZmlsZSBpbnNpZGUgYW5vdGhlciBvbmUgKi8KKworICB1bnNpZ25lZCBpbnQgYWxsb3dfYW5vbnltb3VzIDogMTsgLyoqPCBUUlVFIHRvIGFsbG93IGFub255bW91cyBjb25uZWN0aW9ucyAqLworfTsKKworc3RhdGljIEVsZW1lbnQqCitwdXNoX2VsZW1lbnQgKEJ1c0NvbmZpZ1BhcnNlciAqcGFyc2VyLAorICAgICAgICAgICAgICBFbGVtZW50VHlwZSAgICAgIHR5cGUpCit7CisgIEVsZW1lbnQgKmU7CisKKyAgX2RidXNfYXNzZXJ0ICh0eXBlICE9IEVMRU1FTlRfTk9ORSk7CisgIAorICBlID0gZGJ1c19uZXcwIChFbGVtZW50LCAxKTsKKyAgaWYgKGUgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBpZiAoIV9kYnVzX2xpc3RfYXBwZW5kICgmcGFyc2VyLT5zdGFjaywgZSkpCisgICAgeworICAgICAgZGJ1c19mcmVlIChlKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgCisgIGUtPnR5cGUgPSB0eXBlOworCisgIHJldHVybiBlOworfQorCitzdGF0aWMgdm9pZAorZWxlbWVudF9mcmVlIChFbGVtZW50ICplKQoreworICBpZiAoZS0+dHlwZSA9PSBFTEVNRU5UX0xJTUlUKQorICAgIGRidXNfZnJlZSAoZS0+ZC5saW1pdC5uYW1lKTsKKyAgCisgIGRidXNfZnJlZSAoZSk7Cit9CisKK3N0YXRpYyB2b2lkCitwb3BfZWxlbWVudCAoQnVzQ29uZmlnUGFyc2VyICpwYXJzZXIpCit7CisgIEVsZW1lbnQgKmU7CisKKyAgZSA9IF9kYnVzX2xpc3RfcG9wX2xhc3QgKCZwYXJzZXItPnN0YWNrKTsKKyAgCisgIGVsZW1lbnRfZnJlZSAoZSk7Cit9CisKK3N0YXRpYyBFbGVtZW50KgorcGVla19lbGVtZW50IChCdXNDb25maWdQYXJzZXIgKnBhcnNlcikKK3sKKyAgRWxlbWVudCAqZTsKKworICBlID0gX2RidXNfbGlzdF9nZXRfbGFzdCAoJnBhcnNlci0+c3RhY2spOworCisgIHJldHVybiBlOworfQorCitzdGF0aWMgRWxlbWVudFR5cGUKK3RvcF9lbGVtZW50X3R5cGUgKEJ1c0NvbmZpZ1BhcnNlciAqcGFyc2VyKQoreworICBFbGVtZW50ICplOworCisgIGUgPSBfZGJ1c19saXN0X2dldF9sYXN0ICgmcGFyc2VyLT5zdGFjayk7CisKKyAgaWYgKGUpCisgICAgcmV0dXJuIGUtPnR5cGU7CisgIGVsc2UKKyAgICByZXR1cm4gRUxFTUVOVF9OT05FOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK21lcmdlX3NlcnZpY2VfY29udGV4dF9oYXNoIChEQnVzSGFzaFRhYmxlICpkZXN0LAorCQkJICAgIERCdXNIYXNoVGFibGUgKmZyb20pCit7CisgIERCdXNIYXNoSXRlciBpdGVyOworICBjaGFyICpzZXJ2aWNlX2NvcHk7CisgIGNoYXIgKmNvbnRleHRfY29weTsKKworICBzZXJ2aWNlX2NvcHkgPSBOVUxMOworICBjb250ZXh0X2NvcHkgPSBOVUxMOworCisgIF9kYnVzX2hhc2hfaXRlcl9pbml0IChmcm9tLCAmaXRlcik7CisgIHdoaWxlIChfZGJ1c19oYXNoX2l0ZXJfbmV4dCAoJml0ZXIpKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKnNlcnZpY2UgPSBfZGJ1c19oYXNoX2l0ZXJfZ2V0X3N0cmluZ19rZXkgKCZpdGVyKTsKKyAgICAgIGNvbnN0IGNoYXIgKmNvbnRleHQgPSBfZGJ1c19oYXNoX2l0ZXJfZ2V0X3ZhbHVlICgmaXRlcik7CisKKyAgICAgIHNlcnZpY2VfY29weSA9IF9kYnVzX3N0cmR1cCAoc2VydmljZSk7CisgICAgICBpZiAoc2VydmljZV9jb3B5ID09IE5VTEwpCisgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgIGNvbnRleHRfY29weSA9IF9kYnVzX3N0cmR1cCAoY29udGV4dCk7CisgICAgICBpZiAoY29udGV4dF9jb3B5ID09IE5VTEwpCisgICAgICAgIGdvdG8gZmFpbDsgCisgICAgICAKKyAgICAgIGlmICghX2RidXNfaGFzaF90YWJsZV9pbnNlcnRfc3RyaW5nIChkZXN0LCBzZXJ2aWNlX2NvcHksIGNvbnRleHRfY29weSkpCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgICAgc2VydmljZV9jb3B5ID0gTlVMTDsKKyAgICAgIGNvbnRleHRfY29weSA9IE5VTEw7ICAgIAorICAgIH0KKworICByZXR1cm4gVFJVRTsKKworIGZhaWw6CisgIGlmIChzZXJ2aWNlX2NvcHkpCisgICAgZGJ1c19mcmVlIChzZXJ2aWNlX2NvcHkpOworCisgIGlmIChjb250ZXh0X2NvcHkpCisgICAgZGJ1c19mcmVlIChjb250ZXh0X2NvcHkpOworCisgIHJldHVybiBGQUxTRTsKK30KKworLyoKKyAqIENyZWF0ZSBhIG5ldyBCdXNDb25maWdTZXJ2aWNlRGlyLiBUYWtlcyBvd25lcnNoaXAgb2YgcGF0aCBpZiAjVFJVRSBpcyByZXR1cm5lZC4KKyAqCisgKiBAcmV0dXJucyAjRkFMU0Ugb24gT09NCisgKi8KK3N0YXRpYyBCdXNDb25maWdTZXJ2aWNlRGlyICoKK2J1c19jb25maWdfc2VydmljZV9kaXJfbmV3X3Rha2UgKGNoYXIgKnBhdGgsCisgICAgQnVzU2VydmljZURpckZsYWdzIGZsYWdzKQoreworICBCdXNDb25maWdTZXJ2aWNlRGlyICpzZWxmID0gZGJ1c19uZXcwIChCdXNDb25maWdTZXJ2aWNlRGlyLCAxKTsKKworICBpZiAoc2VsZiA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIHNlbGYtPnBhdGggPSBwYXRoOyAvKiB0YWtlIG93bmVyc2hpcCAqLworICBzZWxmLT5mbGFncyA9IGZsYWdzOworICByZXR1cm4gc2VsZjsKK30KKworc3RhdGljIHZvaWQKK2J1c19jb25maWdfc2VydmljZV9kaXJfZnJlZSAoQnVzQ29uZmlnU2VydmljZURpciAqc2VsZikKK3sKKyAgZGJ1c19mcmVlIChzZWxmLT5wYXRoKTsKKyAgZGJ1c19mcmVlIChzZWxmKTsKK30KKworc3RhdGljIEJ1c0NvbmZpZ1NlcnZpY2VEaXIgKgorc2VydmljZV9kaXJzX2ZpbmRfZGlyIChEQnVzTGlzdCAqKnNlcnZpY2VfZGlycywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGlyKQoreworICBEQnVzTGlzdCAqbGluazsKKworICBfZGJ1c19hc3NlcnQgKGRpciAhPSBOVUxMKTsKKworICBmb3IgKGxpbmsgPSAqc2VydmljZV9kaXJzOyBsaW5rOyBsaW5rID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rKHNlcnZpY2VfZGlycywgbGluaykpCisgICAgeworICAgICAgQnVzQ29uZmlnU2VydmljZURpciAqbGlua19kaXIgPSBsaW5rLT5kYXRhOworCisgICAgICBpZiAoc3RyY21wIChkaXIsIGxpbmtfZGlyLT5wYXRoKSA9PSAwKQorICAgICAgICByZXR1cm4gbGlua19kaXI7CisgICAgfQorCisgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZAorc2VydmljZV9kaXJzX2FwcGVuZF9saW5rX3VuaXF1ZV9vcl9mcmVlIChEQnVzTGlzdCAqKnNlcnZpY2VfZGlycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgKmRpcl9saW5rKQoreworICBCdXNDb25maWdTZXJ2aWNlRGlyICpkaXIgPSBkaXJfbGluay0+ZGF0YTsKKyAgQnVzQ29uZmlnU2VydmljZURpciAqYWxyZWFkeSA9IHNlcnZpY2VfZGlyc19maW5kX2RpciAoc2VydmljZV9kaXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXItPnBhdGgpOworCisgIGlmIChhbHJlYWR5ID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfbGlzdF9hcHBlbmRfbGluayAoc2VydmljZV9kaXJzLCBkaXJfbGluayk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogQnVzU2VydmljZURpckZsYWdzIGFyZSBjaG9zZW4gc3VjaCB0aGF0IHRoZSBjb21wYXRpYmxlIHRoaW5nIHRvIGRvCisgICAgICAgKiBpcyB0byAiYW5kIiB0aGUgZmxhZ3MuIEZvciBleGFtcGxlLCBpZiBhIGRpcmVjdG9yeSBpcyBleHBsaWNpdGx5CisgICAgICAgKiBhZGRlZCBhcyBhIDxzZXJ2aWNlZGlyPiAod2hpY2ggaXMgd2F0Y2hlZCB3aXRoIGlub3RpZnkpIGFuZCBpcyBhbHNvCisgICAgICAgKiB0aGUgdHJhbnNpZW50IHNlcnZpY2UgZGlyZWN0b3J5ICh3aGljaCBzaG91bGQgbm90IGJlIHdhdGNoZWQpLAorICAgICAgICogdGhlIGNvbXBhdGlibGUgdGhpbmcgdG8gZG8gaXMgdG8gd2F0Y2ggaXQuICovCisgICAgICBhbHJlYWR5LT5mbGFncyAmPSBkaXItPmZsYWdzOworICAgICAgYnVzX2NvbmZpZ19zZXJ2aWNlX2Rpcl9mcmVlIChkaXJfbGluay0+ZGF0YSk7CisgICAgICBfZGJ1c19saXN0X2ZyZWVfbGluayAoZGlyX2xpbmspOworICAgIH0KK30KKworLyoKKyAqIENvbnN1bWUgbGlua3MgZnJvbSBkaXJzIChhIGxpc3Qgb2YgcGF0aHMpLCBjb252ZXJ0aW5nIHRoZW0gaW50byBsaW5rcyBpbgorICogc2VydmljZV9kaXJzIChhIGxpc3Qgb2YgdW5pcXVlIEJ1c1NlcnZpY2VEaXIpLgorICoKKyAqIE9uIHN1Y2Nlc3MsIHJldHVybiBUUlVFLiBkaXJzIHdpbGwgYmUgZW1wdHksIGFuZCBldmVyeSBvcmlnaW5hbCBlbnRyeSBpbgorICogZGlycyB3aWxsIGhhdmUgYSBjb3JyZXNwb25kaW5nIHNlcnZpY2VfZGlycyBlbnRyeS4KKyAqCisgKiBPbiBPT00sIHJldHVybiBGQUxTRS4gRWFjaCBvcmlnaW5hbCBlbnRyeSBvZiBkaXJzIGhhcyBlaXRoZXIgYmVlbgorICogYXBwZW5kZWQgdG8gc2VydmljZV9kaXJzIG9yIGxlZnQgaW4gZGlycy4KKyAqLworc3RhdGljIGRidXNfYm9vbF90CitzZXJ2aWNlX2RpcnNfYWJzb3JiX3N0cmluZ19saXN0IChEQnVzTGlzdCAgICAgICAgICAgKipzZXJ2aWNlX2RpcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAgICAgICAgICAgKipkaXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzU2VydmljZURpckZsYWdzICAgZmxhZ3MpCit7CisgIERCdXNMaXN0ICpsaW5rOworCisgIF9kYnVzX2Fzc2VydCAoc2VydmljZV9kaXJzICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKGRpcnMgIT0gTlVMTCk7CisKKyAgd2hpbGUgKChsaW5rID0gX2RidXNfbGlzdF9wb3BfZmlyc3RfbGluayAoZGlycykpKQorICAgIHsKKyAgICAgIGNoYXIgKnBhdGggPSBsaW5rLT5kYXRhOworICAgICAgQnVzQ29uZmlnU2VydmljZURpciAqZGlyID0gYnVzX2NvbmZpZ19zZXJ2aWNlX2Rpcl9uZXdfdGFrZSAocGF0aCwgZmxhZ3MpOworCisgICAgICBpZiAoZGlyID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBPT00gLSByb2xsIGJhY2sgKHRoaXMgZG9lcyBub3QgbmVlZCB0byBhbGxvY2F0ZSBtZW1vcnkpICovCisgICAgICAgICAgX2RidXNfbGlzdF9wcmVwZW5kX2xpbmsgKHNlcnZpY2VfZGlycywgbGluayk7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIC8qIE93bmVyc2hpcCBvZiBwYXRoIGhhcyBiZWVuIHRha2VuIGJ5IGRpciAqLworICAgICAgbGluay0+ZGF0YSA9IGRpcjsKKyAgICAgIHNlcnZpY2VfZGlyc19hcHBlbmRfbGlua191bmlxdWVfb3JfZnJlZSAoc2VydmljZV9kaXJzLCBsaW5rKTsKKyAgICB9CisKKyAgX2RidXNfYXNzZXJ0ICgqZGlycyA9PSBOVUxMKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorbWVyZ2VfaW5jbHVkZWQgKEJ1c0NvbmZpZ1BhcnNlciAqcGFyc2VyLAorICAgICAgICAgICAgICAgIEJ1c0NvbmZpZ1BhcnNlciAqaW5jbHVkZWQsCisgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICplcnJvcikKK3sKKyAgREJ1c0xpc3QgKmxpbms7CisKKyAgaWYgKCFidXNfcG9saWN5X21lcmdlIChwYXJzZXItPnBvbGljeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlZC0+cG9saWN5KSkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIW1lcmdlX3NlcnZpY2VfY29udGV4dF9oYXNoIChwYXJzZXItPnNlcnZpY2VfY29udGV4dF90YWJsZSwKKwkJCQkgICBpbmNsdWRlZC0+c2VydmljZV9jb250ZXh0X3RhYmxlKSkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgCisgIGlmIChpbmNsdWRlZC0+dXNlciAhPSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfZnJlZSAocGFyc2VyLT51c2VyKTsKKyAgICAgIHBhcnNlci0+dXNlciA9IGluY2x1ZGVkLT51c2VyOworICAgICAgaW5jbHVkZWQtPnVzZXIgPSBOVUxMOworICAgIH0KKworICBpZiAoaW5jbHVkZWQtPmJ1c190eXBlICE9IE5VTEwpCisgICAgeworICAgICAgZGJ1c19mcmVlIChwYXJzZXItPmJ1c190eXBlKTsKKyAgICAgIHBhcnNlci0+YnVzX3R5cGUgPSBpbmNsdWRlZC0+YnVzX3R5cGU7CisgICAgICBpbmNsdWRlZC0+YnVzX3R5cGUgPSBOVUxMOworICAgIH0KKyAgCisgIGlmIChpbmNsdWRlZC0+Zm9yaykKKyAgICBwYXJzZXItPmZvcmsgPSBUUlVFOworCisgIGlmIChpbmNsdWRlZC0+a2VlcF91bWFzaykKKyAgICBwYXJzZXItPmtlZXBfdW1hc2sgPSBUUlVFOworCisgIGlmIChpbmNsdWRlZC0+YWxsb3dfYW5vbnltb3VzKQorICAgIHBhcnNlci0+YWxsb3dfYW5vbnltb3VzID0gVFJVRTsKKworICBpZiAoaW5jbHVkZWQtPnBpZGZpbGUgIT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX2ZyZWUgKHBhcnNlci0+cGlkZmlsZSk7CisgICAgICBwYXJzZXItPnBpZGZpbGUgPSBpbmNsdWRlZC0+cGlkZmlsZTsKKyAgICAgIGluY2x1ZGVkLT5waWRmaWxlID0gTlVMTDsKKyAgICB9CisKKyAgaWYgKGluY2x1ZGVkLT5zZXJ2aWNlaGVscGVyICE9IE5VTEwpCisgICAgeworICAgICAgZGJ1c19mcmVlIChwYXJzZXItPnNlcnZpY2VoZWxwZXIpOworICAgICAgcGFyc2VyLT5zZXJ2aWNlaGVscGVyID0gaW5jbHVkZWQtPnNlcnZpY2VoZWxwZXI7CisgICAgICBpbmNsdWRlZC0+c2VydmljZWhlbHBlciA9IE5VTEw7CisgICAgfQorCisgIHdoaWxlICgobGluayA9IF9kYnVzX2xpc3RfcG9wX2ZpcnN0X2xpbmsgKCZpbmNsdWRlZC0+bGlzdGVuX29uKSkpCisgICAgX2RidXNfbGlzdF9hcHBlbmRfbGluayAoJnBhcnNlci0+bGlzdGVuX29uLCBsaW5rKTsKKworICB3aGlsZSAoKGxpbmsgPSBfZGJ1c19saXN0X3BvcF9maXJzdF9saW5rICgmaW5jbHVkZWQtPm1lY2hhbmlzbXMpKSkKKyAgICBfZGJ1c19saXN0X2FwcGVuZF9saW5rICgmcGFyc2VyLT5tZWNoYW5pc21zLCBsaW5rKTsKKworICB3aGlsZSAoKGxpbmsgPSBfZGJ1c19saXN0X3BvcF9maXJzdF9saW5rICgmaW5jbHVkZWQtPnNlcnZpY2VfZGlycykpKQorICAgIHNlcnZpY2VfZGlyc19hcHBlbmRfbGlua191bmlxdWVfb3JfZnJlZSAoJnBhcnNlci0+c2VydmljZV9kaXJzLCBsaW5rKTsKKworICB3aGlsZSAoKGxpbmsgPSBfZGJ1c19saXN0X3BvcF9maXJzdF9saW5rICgmaW5jbHVkZWQtPmNvbmZfZGlycykpKQorICAgIF9kYnVzX2xpc3RfYXBwZW5kX2xpbmsgKCZwYXJzZXItPmNvbmZfZGlycywgbGluayk7CisgIAorICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitzZWVuX2luY2x1ZGUgKEJ1c0NvbmZpZ1BhcnNlciAgKnBhcnNlciwKKwkgICAgICBjb25zdCBEQnVzU3RyaW5nICpmaWxlKQoreworICBEQnVzTGlzdCAqaXRlcjsKKworICBpdGVyID0gcGFyc2VyLT5pbmNsdWRlZF9maWxlczsKKyAgd2hpbGUgKGl0ZXIgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoISBzdHJjbXAgKF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoZmlsZSksIGl0ZXItPmRhdGEpKQorCXJldHVybiBUUlVFOworCisgICAgICBpdGVyID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmcGFyc2VyLT5pbmNsdWRlZF9maWxlcywgaXRlcik7CisgICAgfQorCisgIHJldHVybiBGQUxTRTsKK30KKworQnVzQ29uZmlnUGFyc2VyKgorYnVzX2NvbmZpZ19wYXJzZXJfbmV3IChjb25zdCBEQnVzU3RyaW5nICAgICAgKmJhc2VkaXIsCisgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgICAgICAgaXNfdG9wbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ1c0NvbmZpZ1BhcnNlciAqcGFyZW50KQoreworICBCdXNDb25maWdQYXJzZXIgKnBhcnNlcjsKKworICBwYXJzZXIgPSBkYnVzX25ldzAgKEJ1c0NvbmZpZ1BhcnNlciwgMSk7CisgIGlmIChwYXJzZXIgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBwYXJzZXItPmlzX3RvcGxldmVsID0gISFpc190b3BsZXZlbDsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZwYXJzZXItPmJhc2VkaXIpKQorICAgIHsKKyAgICAgIGRidXNfZnJlZSAocGFyc2VyKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBpZiAoKChwYXJzZXItPnBvbGljeSA9IGJ1c19wb2xpY3lfbmV3ICgpKSA9PSBOVUxMKSB8fAorICAgICAgIV9kYnVzX3N0cmluZ19jb3B5IChiYXNlZGlyLCAwLCAmcGFyc2VyLT5iYXNlZGlyLCAwKSB8fAorICAgICAgKChwYXJzZXItPnNlcnZpY2VfY29udGV4dF90YWJsZSA9IF9kYnVzX2hhc2hfdGFibGVfbmV3IChEQlVTX0hBU0hfU1RSSU5HLAorCQkJCQkJCSAgICAgIGRidXNfZnJlZSwKKwkJCQkJCQkgICAgICBkYnVzX2ZyZWUpKSA9PSBOVUxMKSkKKyAgICB7CisgICAgICBpZiAocGFyc2VyLT5wb2xpY3kpCisgICAgICAgIGJ1c19wb2xpY3lfdW5yZWYgKHBhcnNlci0+cG9saWN5KTsKKyAgICAgIAorICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwYXJzZXItPmJhc2VkaXIpOworCisgICAgICBkYnVzX2ZyZWUgKHBhcnNlcik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgaWYgKHBhcmVudCAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIEluaXRpYWxpemUgdGhlIHBhcnNlcidzIGxpbWl0cyBmcm9tIHRoZSBwYXJlbnQuICovCisgICAgICBwYXJzZXItPmxpbWl0cyA9IHBhcmVudC0+bGltaXRzOworCisgICAgICAvKiBVc2UgdGhlIHBhcmVudCdzIGxpc3Qgb2YgaW5jbHVkZWRfZmlsZXMgdG8gYXZvaWQKKwkgY2lyY3VsYXIgaW5jbHVzaW9ucy4gKi8KKyAgICAgIHBhcnNlci0+aW5jbHVkZWRfZmlsZXMgPSBwYXJlbnQtPmluY2x1ZGVkX2ZpbGVzOworICAgIH0KKyAgZWxzZQorICAgIHsKKworICAgICAgLyogTWFrZSB1cCBzb21lIG51bWJlcnMhIHdvb3QhICovCisgICAgICBwYXJzZXItPmxpbWl0cy5tYXhfaW5jb21pbmdfYnl0ZXMgPSBfREJVU19PTkVfTUVHQUJZVEUgKiAxMjc7CisgICAgICBwYXJzZXItPmxpbWl0cy5tYXhfb3V0Z29pbmdfYnl0ZXMgPSBfREJVU19PTkVfTUVHQUJZVEUgKiAxMjc7CisgICAgICBwYXJzZXItPmxpbWl0cy5tYXhfbWVzc2FnZV9zaXplID0gX0RCVVNfT05FX01FR0FCWVRFICogMzI7CisKKyAgICAgIC8qIFdlIHNldCByZWxhdGl2ZWx5IGNvbnNlcnZhdGl2ZSB2YWx1ZXMgaGVyZSBzaW5jZSBkdWUgdG8gdGhlCisgICAgICB3YXkgU0NNX1JJR0hUUyB3b3JrcyB3ZSBuZWVkIHRvIHByZWFsbG9jYXRlIGFuIGFycmF5IGZvciB0aGUKKyAgICAgIG1heGltdW0gbnVtYmVyIG9mIGZpbGUgZGVzY3JpcHRvcnMgd2UgY2FuIHJlY2VpdmUuIFBpY2tpbmcgYQorICAgICAgaGlnaCB2YWx1ZSBoZXJlIHRodXMgdHJhbnNsYXRlcyBkaXJlY3RseSB0byBtb3JlIG1lbW9yeQorICAgICAgYWxsb2NhdGlvbi4gKi8KKyAgICAgIHBhcnNlci0+bGltaXRzLm1heF9pbmNvbWluZ191bml4X2ZkcyA9IERCVVNfREVGQVVMVF9NRVNTQUdFX1VOSVhfRkRTKjQ7CisgICAgICBwYXJzZXItPmxpbWl0cy5tYXhfb3V0Z29pbmdfdW5peF9mZHMgPSBEQlVTX0RFRkFVTFRfTUVTU0FHRV9VTklYX0ZEUyo0OworICAgICAgcGFyc2VyLT5saW1pdHMubWF4X21lc3NhZ2VfdW5peF9mZHMgPSBEQlVTX0RFRkFVTFRfTUVTU0FHRV9VTklYX0ZEUzsKKyAgICAgIAorICAgICAgLyogTWFraW5nIHRoaXMgbG9uZyBtZWFucyB0aGUgdXNlciBoYXMgdG8gd2FpdCBsb25nZXIgZm9yIGFuIGVycm9yCisgICAgICAgKiBtZXNzYWdlIGlmIHNvbWV0aGluZyBzY3Jld3MgdXAsIGJ1dCBtYWtpbmcgaXQgdG9vIHNob3J0IG1lYW5zCisgICAgICAgKiB0aGV5IG1pZ2h0IHNlZSBhIGZhbHNlIGZhaWx1cmUuCisgICAgICAgKi8KKyAgICAgIHBhcnNlci0+bGltaXRzLmFjdGl2YXRpb25fdGltZW91dCA9IDI1MDAwOyAvKiAyNSBzZWNvbmRzICovCisKKyAgICAgIC8qIE1ha2luZyB0aGlzIGxvbmcgcmlza3MgbWFraW5nIGEgRE9TIGF0dGFjayBlYXNpZXIsIGJ1dCB0b28gc2hvcnQKKyAgICAgICAqIGFuZCBsZWdpdGltYXRlIGF1dGggd2lsbCBmYWlsLiAgSWYgaW50ZXJhY3RpdmUgYXV0aCAoYXNrIHVzZXIgZm9yCisgICAgICAgKiBwYXNzd29yZCkgaXMgYWxsb3dlZCwgdGhlbiBwb3RlbnRpYWxseSBpdCBoYXMgdG8gYmUgcXVpdGUgbG9uZy4KKyAgICAgICAqLworICAgICAgcGFyc2VyLT5saW1pdHMuYXV0aF90aW1lb3V0ID0gMzAwMDA7IC8qIDMwIHNlY29uZHMgKi8KKworICAgICAgLyogRG8gbm90IGFsbG93IGEgZmQgdG8gc3RheSBmb3JldmVyIGluIGRidXMtZGFlbW9uCisgICAgICAgKiBodHRwczovL2J1Z3MuZnJlZWRlc2t0b3Aub3JnL3Nob3dfYnVnLmNnaT9pZD04MDU1OQorICAgICAgICovCisgICAgICBwYXJzZXItPmxpbWl0cy5wZW5kaW5nX2ZkX3RpbWVvdXQgPSAxNTAwMDA7IC8qIDIuNSBtaW51dGVzICovCisgICAgICAKKyAgICAgIHBhcnNlci0+bGltaXRzLm1heF9pbmNvbXBsZXRlX2Nvbm5lY3Rpb25zID0gNjQ7CisgICAgICBwYXJzZXItPmxpbWl0cy5tYXhfY29ubmVjdGlvbnNfcGVyX3VzZXIgPSAyNTY7CisgICAgICAKKyAgICAgIC8qIE5vdGUgdGhhdCBtYXhfY29tcGxldGVkX2Nvbm5lY3Rpb25zIC8gbWF4X2Nvbm5lY3Rpb25zX3Blcl91c2VyCisgICAgICAgKiBpcyB0aGUgbnVtYmVyIG9mIHVzZXJzIHRoYXQgd291bGQgaGF2ZSB0byB3b3JrIHRvZ2V0aGVyIHRvCisgICAgICAgKiBET1MgYWxsIHRoZSBvdGhlciB1c2Vycy4KKyAgICAgICAqLworICAgICAgcGFyc2VyLT5saW1pdHMubWF4X2NvbXBsZXRlZF9jb25uZWN0aW9ucyA9IDIwNDg7CisgICAgICAKKyAgICAgIHBhcnNlci0+bGltaXRzLm1heF9wZW5kaW5nX2FjdGl2YXRpb25zID0gNTEyOworICAgICAgcGFyc2VyLT5saW1pdHMubWF4X3NlcnZpY2VzX3Blcl9jb25uZWN0aW9uID0gNTEyOworCisgICAgICAvKiBGb3IgdGhpcyBvbmUsIGtlZXAgaW4gbWluZCB0aGF0IGl0IGlzbid0IG9ubHkgdGhlIG1lbW9yeSB1c2VkCisgICAgICAgKiBieSB0aGUgbWF0Y2ggcnVsZXMsIGJ1dCBzbG93ZG93biBmcm9tIGxpbmVhcmx5IHdhbGtpbmcgYSBiaWcKKyAgICAgICAqIGxpc3Qgb2YgdGhlbS4gQSBjbGllbnQgYWRkaW5nIG1vcmUgdGhhbiB0aGlzIGlzIGFsbW9zdAorICAgICAgICogY2VydGFpbmx5IGEgYmFkIGlkZWEgZm9yIHRoYXQgcmVhc29uLCBhbmQgc2hvdWxkIGNoYW5nZSB0byBhCisgICAgICAgKiBzbWFsbGVyIG51bWJlciBvZiB3aWRlci1uZXQgbWF0Y2ggcnVsZXMgLSBnZXR0aW5nIGV2ZXJ5IGxhc3QKKyAgICAgICAqIG1lc3NhZ2UgdG8gdGhlIGJ1cyBpcyBwcm9iYWJseSBiZXR0ZXIgdGhhbiBoYXZpbmcgYSB0aG91c2FuZAorICAgICAgICogbWF0Y2ggcnVsZXMuCisgICAgICAgKi8KKyAgICAgIHBhcnNlci0+bGltaXRzLm1heF9tYXRjaF9ydWxlc19wZXJfY29ubmVjdGlvbiA9IDUxMjsKKyAgICAgIAorICAgICAgcGFyc2VyLT5saW1pdHMucmVwbHlfdGltZW91dCA9IC0xOyAvKiBuZXZlciAqLworCisgICAgICAvKiB0aGlzIGlzIGVmZmVjdGl2ZWx5IGEgbGltaXQgb24gbWVzc2FnZSBxdWV1ZSBzaXplIGZvciBtZXNzYWdlcworICAgICAgICogdGhhdCByZXF1aXJlIGEgcmVwbHkKKyAgICAgICAqLworICAgICAgcGFyc2VyLT5saW1pdHMubWF4X3JlcGxpZXNfcGVyX2Nvbm5lY3Rpb24gPSAxMjg7CisgICAgfQorICAgICAgCisgIHBhcnNlci0+cmVmY291bnQgPSAxOworICAgICAgCisgIHJldHVybiBwYXJzZXI7Cit9CisKK0J1c0NvbmZpZ1BhcnNlciAqCitidXNfY29uZmlnX3BhcnNlcl9yZWYgKEJ1c0NvbmZpZ1BhcnNlciAqcGFyc2VyKQoreworICBfZGJ1c19hc3NlcnQgKHBhcnNlci0+cmVmY291bnQgPiAwKTsKKworICBwYXJzZXItPnJlZmNvdW50ICs9IDE7CisKKyAgcmV0dXJuIHBhcnNlcjsKK30KKwordm9pZAorYnVzX2NvbmZpZ19wYXJzZXJfdW5yZWYgKEJ1c0NvbmZpZ1BhcnNlciAqcGFyc2VyKQoreworICBfZGJ1c19hc3NlcnQgKHBhcnNlci0+cmVmY291bnQgPiAwKTsKKworICBwYXJzZXItPnJlZmNvdW50IC09IDE7CisKKyAgaWYgKHBhcnNlci0+cmVmY291bnQgPT0gMCkKKyAgICB7CisgICAgICB3aGlsZSAocGFyc2VyLT5zdGFjayAhPSBOVUxMKQorICAgICAgICBwb3BfZWxlbWVudCAocGFyc2VyKTsKKworICAgICAgZGJ1c19mcmVlIChwYXJzZXItPnVzZXIpOworICAgICAgZGJ1c19mcmVlIChwYXJzZXItPnNlcnZpY2VoZWxwZXIpOworICAgICAgZGJ1c19mcmVlIChwYXJzZXItPmJ1c190eXBlKTsKKyAgICAgIGRidXNfZnJlZSAocGFyc2VyLT5waWRmaWxlKTsKKyAgICAgIAorICAgICAgX2RidXNfbGlzdF9mb3JlYWNoICgmcGFyc2VyLT5saXN0ZW5fb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIChEQnVzRm9yZWFjaEZ1bmN0aW9uKSBkYnVzX2ZyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworCisgICAgICBfZGJ1c19saXN0X2NsZWFyICgmcGFyc2VyLT5saXN0ZW5fb24pOworCisgICAgICBfZGJ1c19saXN0X2ZvcmVhY2ggKCZwYXJzZXItPnNlcnZpY2VfZGlycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKERCdXNGb3JlYWNoRnVuY3Rpb24pIGJ1c19jb25maWdfc2VydmljZV9kaXJfZnJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgICAgIF9kYnVzX2xpc3RfY2xlYXIgKCZwYXJzZXItPnNlcnZpY2VfZGlycyk7CisKKyAgICAgIF9kYnVzX2xpc3RfZm9yZWFjaCAoJnBhcnNlci0+Y29uZl9kaXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoREJ1c0ZvcmVhY2hGdW5jdGlvbikgZGJ1c19mcmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICAgICAgX2RidXNfbGlzdF9jbGVhciAoJnBhcnNlci0+Y29uZl9kaXJzKTsKKworICAgICAgX2RidXNfbGlzdF9mb3JlYWNoICgmcGFyc2VyLT5tZWNoYW5pc21zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoREJ1c0ZvcmVhY2hGdW5jdGlvbikgZGJ1c19mcmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICAgICAgX2RidXNfbGlzdF9jbGVhciAoJnBhcnNlci0+bWVjaGFuaXNtcyk7CisgICAgICAKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmcGFyc2VyLT5iYXNlZGlyKTsKKworICAgICAgaWYgKHBhcnNlci0+cG9saWN5KQorICAgICAgICBidXNfcG9saWN5X3VucmVmIChwYXJzZXItPnBvbGljeSk7CisKKyAgICAgIGlmIChwYXJzZXItPnNlcnZpY2VfY29udGV4dF90YWJsZSkKKyAgICAgICAgX2RidXNfaGFzaF90YWJsZV91bnJlZiAocGFyc2VyLT5zZXJ2aWNlX2NvbnRleHRfdGFibGUpOworICAgICAgCisgICAgICBkYnVzX2ZyZWUgKHBhcnNlcik7CisgICAgfQorfQorCitkYnVzX2Jvb2xfdAorYnVzX2NvbmZpZ19wYXJzZXJfY2hlY2tfZG9jdHlwZSAoQnVzQ29uZmlnUGFyc2VyICAgKnBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICpkb2N0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgKmVycm9yKQoreworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBpZiAoc3RyY21wIChkb2N0eXBlLCAiYnVzY29uZmlnIikgIT0gMCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgIkNvbmZpZ3VyYXRpb24gZmlsZSBoYXMgdGhlIHdyb25nIGRvY3VtZW50IHR5cGUgJXMiLAorICAgICAgICAgICAgICAgICAgICAgIGRvY3R5cGUpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgZWxzZQorICAgIHJldHVybiBUUlVFOworfQorCit0eXBlZGVmIHN0cnVjdAoreworICBjb25zdCBjaGFyICAqbmFtZTsKKyAgY29uc3QgY2hhciAqKnJldGxvYzsKK30gTG9jYXRlQXR0cjsKKworc3RhdGljIGRidXNfYm9vbF90Citsb2NhdGVfYXR0cmlidXRlcyAoQnVzQ29uZmlnUGFyc2VyICAqcGFyc2VyLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKmVsZW1lbnRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgKiphdHRyaWJ1dGVfbmFtZXMsCisgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICoqYXR0cmlidXRlX3ZhbHVlcywKKyAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvciwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICpmaXJzdF9hdHRyaWJ1dGVfbmFtZSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgKipmaXJzdF9hdHRyaWJ1dGVfcmV0bG9jLAorICAgICAgICAgICAgICAgICAgIC4uLikKK3sKKyAgdmFfbGlzdCBhcmdzOworICBjb25zdCBjaGFyICpuYW1lOworICBjb25zdCBjaGFyICoqcmV0bG9jOworICBpbnQgbl9hdHRyczsKKyNkZWZpbmUgTUFYX0FUVFJTIDI0CisgIExvY2F0ZUF0dHIgYXR0cnNbTUFYX0FUVFJTXTsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICBpbnQgaTsKKworICBfZGJ1c19hc3NlcnQgKGZpcnN0X2F0dHJpYnV0ZV9uYW1lICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKGZpcnN0X2F0dHJpYnV0ZV9yZXRsb2MgIT0gTlVMTCk7CisKKyAgcmV0dmFsID0gVFJVRTsKKworICBuX2F0dHJzID0gMTsKKyAgYXR0cnNbMF0ubmFtZSA9IGZpcnN0X2F0dHJpYnV0ZV9uYW1lOworICBhdHRyc1swXS5yZXRsb2MgPSBmaXJzdF9hdHRyaWJ1dGVfcmV0bG9jOworICAqZmlyc3RfYXR0cmlidXRlX3JldGxvYyA9IE5VTEw7CisKKyAgdmFfc3RhcnQgKGFyZ3MsIGZpcnN0X2F0dHJpYnV0ZV9yZXRsb2MpOworCisgIG5hbWUgPSB2YV9hcmcgKGFyZ3MsIGNvbnN0IGNoYXIqKTsKKyAgcmV0bG9jID0gdmFfYXJnIChhcmdzLCBjb25zdCBjaGFyKiopOworCisgIHdoaWxlIChuYW1lICE9IE5VTEwpCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0IChyZXRsb2MgIT0gTlVMTCk7CisgICAgICBfZGJ1c19hc3NlcnQgKG5fYXR0cnMgPCBNQVhfQVRUUlMpOworCisgICAgICBhdHRyc1tuX2F0dHJzXS5uYW1lID0gbmFtZTsKKyAgICAgIGF0dHJzW25fYXR0cnNdLnJldGxvYyA9IHJldGxvYzsKKyAgICAgIG5fYXR0cnMgKz0gMTsKKyAgICAgICpyZXRsb2MgPSBOVUxMOworCisgICAgICBuYW1lID0gdmFfYXJnIChhcmdzLCBjb25zdCBjaGFyKik7CisgICAgICByZXRsb2MgPSB2YV9hcmcgKGFyZ3MsIGNvbnN0IGNoYXIqKik7CisgICAgfQorCisgIHZhX2VuZCAoYXJncyk7CisKKyAgaSA9IDA7CisgIHdoaWxlIChhdHRyaWJ1dGVfbmFtZXNbaV0pCisgICAgeworICAgICAgaW50IGo7CisgICAgICBkYnVzX2Jvb2xfdCBmb3VuZDsKKyAgICAgIAorICAgICAgZm91bmQgPSBGQUxTRTsKKyAgICAgIGogPSAwOworICAgICAgd2hpbGUgKGogPCBuX2F0dHJzKQorICAgICAgICB7CisgICAgICAgICAgaWYgKHN0cmNtcCAoYXR0cnNbal0ubmFtZSwgYXR0cmlidXRlX25hbWVzW2ldKSA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICByZXRsb2MgPSBhdHRyc1tqXS5yZXRsb2M7CisKKyAgICAgICAgICAgICAgaWYgKCpyZXRsb2MgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBdHRyaWJ1dGUgXCIlc1wiIHJlcGVhdGVkIHR3aWNlIG9uIHRoZSBzYW1lIDwlcz4gZWxlbWVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnNbal0ubmFtZSwgZWxlbWVudF9uYW1lKTsKKyAgICAgICAgICAgICAgICAgIHJldHZhbCA9IEZBTFNFOworICAgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICpyZXRsb2MgPSBhdHRyaWJ1dGVfdmFsdWVzW2ldOworICAgICAgICAgICAgICBmb3VuZCA9IFRSVUU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICArK2o7CisgICAgICAgIH0KKworICAgICAgaWYgKCFmb3VuZCkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJBdHRyaWJ1dGUgXCIlc1wiIGlzIGludmFsaWQgb24gPCVzPiBlbGVtZW50IGluIHRoaXMgY29udGV4dCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZV9uYW1lc1tpXSwgZWxlbWVudF9uYW1lKTsKKyAgICAgICAgICByZXR2YWwgPSBGQUxTRTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICArK2k7CisgICAgfQorCisgb3V0OgorICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX25vX2F0dHJpYnV0ZXMgKEJ1c0NvbmZpZ1BhcnNlciAgKnBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKmVsZW1lbnRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAqKmF0dHJpYnV0ZV9uYW1lcywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAqKmF0dHJpYnV0ZV92YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgaWYgKGF0dHJpYnV0ZV9uYW1lc1swXSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgIkF0dHJpYnV0ZSBcIiVzXCIgaXMgaW52YWxpZCBvbiA8JXM+IGVsZW1lbnQgaW4gdGhpcyBjb250ZXh0IiwKKyAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVfbmFtZXNbMF0sIGVsZW1lbnRfbmFtZSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3N0YXJ0X2J1c2NvbmZpZ19jaGlsZCAoQnVzQ29uZmlnUGFyc2VyICAgKnBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgKmVsZW1lbnRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqKmF0dHJpYnV0ZV9uYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqKmF0dHJpYnV0ZV92YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICplcnJvcikKK3sKKyAgRWxlbWVudFR5cGUgZWxlbWVudF90eXBlOworCisgIGVsZW1lbnRfdHlwZSA9IGJ1c19jb25maWdfcGFyc2VyX2VsZW1lbnRfbmFtZV90b190eXBlIChlbGVtZW50X25hbWUpOworCisgIGlmIChlbGVtZW50X3R5cGUgPT0gRUxFTUVOVF9VU0VSKQorICAgIHsKKyAgICAgIGlmICghY2hlY2tfbm9fYXR0cmlidXRlcyAocGFyc2VyLCAidXNlciIsIGF0dHJpYnV0ZV9uYW1lcywgYXR0cmlidXRlX3ZhbHVlcywgZXJyb3IpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIGlmIChwdXNoX2VsZW1lbnQgKHBhcnNlciwgRUxFTUVOVF9VU0VSKSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICBlbHNlIGlmIChlbGVtZW50X3R5cGUgPT0gRUxFTUVOVF9DT05GSUdUWVBFKQorICAgIHsKKyAgICAgIGlmICghY2hlY2tfbm9fYXR0cmlidXRlcyAocGFyc2VyLCAidHlwZSIsIGF0dHJpYnV0ZV9uYW1lcywgYXR0cmlidXRlX3ZhbHVlcywgZXJyb3IpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIGlmIChwdXNoX2VsZW1lbnQgKHBhcnNlciwgRUxFTUVOVF9DT05GSUdUWVBFKSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICBlbHNlIGlmIChlbGVtZW50X3R5cGUgPT0gRUxFTUVOVF9GT1JLKQorICAgIHsKKyAgICAgIGlmICghY2hlY2tfbm9fYXR0cmlidXRlcyAocGFyc2VyLCAiZm9yayIsIGF0dHJpYnV0ZV9uYW1lcywgYXR0cmlidXRlX3ZhbHVlcywgZXJyb3IpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIGlmIChwdXNoX2VsZW1lbnQgKHBhcnNlciwgRUxFTUVOVF9GT1JLKSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgcGFyc2VyLT5mb3JrID0gVFJVRTsKKyAgICAgIAorICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICBlbHNlIGlmIChlbGVtZW50X3R5cGUgPT0gRUxFTUVOVF9TWVNMT0cpCisgICAgeworICAgICAgaWYgKCFjaGVja19ub19hdHRyaWJ1dGVzIChwYXJzZXIsICJzeXNsb2ciLCBhdHRyaWJ1dGVfbmFtZXMsIGF0dHJpYnV0ZV92YWx1ZXMsIGVycm9yKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICBpZiAocHVzaF9lbGVtZW50IChwYXJzZXIsIEVMRU1FTlRfU1lTTE9HKSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgcGFyc2VyLT5zeXNsb2cgPSBUUlVFOworICAgICAgCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIGVsc2UgaWYgKGVsZW1lbnRfdHlwZSA9PSBFTEVNRU5UX0tFRVBfVU1BU0spCisgICAgeworICAgICAgaWYgKCFjaGVja19ub19hdHRyaWJ1dGVzIChwYXJzZXIsICJrZWVwX3VtYXNrIiwgYXR0cmlidXRlX25hbWVzLCBhdHRyaWJ1dGVfdmFsdWVzLCBlcnJvcikpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgaWYgKHB1c2hfZWxlbWVudCAocGFyc2VyLCBFTEVNRU5UX0tFRVBfVU1BU0spID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICBwYXJzZXItPmtlZXBfdW1hc2sgPSBUUlVFOworICAgICAgCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIGVsc2UgaWYgKGVsZW1lbnRfdHlwZSA9PSBFTEVNRU5UX1BJREZJTEUpCisgICAgeworICAgICAgaWYgKCFjaGVja19ub19hdHRyaWJ1dGVzIChwYXJzZXIsICJwaWRmaWxlIiwgYXR0cmlidXRlX25hbWVzLCBhdHRyaWJ1dGVfdmFsdWVzLCBlcnJvcikpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgaWYgKHB1c2hfZWxlbWVudCAocGFyc2VyLCBFTEVNRU5UX1BJREZJTEUpID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIGVsc2UgaWYgKGVsZW1lbnRfdHlwZSA9PSBFTEVNRU5UX0xJU1RFTikKKyAgICB7CisgICAgICBpZiAoIWNoZWNrX25vX2F0dHJpYnV0ZXMgKHBhcnNlciwgImxpc3RlbiIsIGF0dHJpYnV0ZV9uYW1lcywgYXR0cmlidXRlX3ZhbHVlcywgZXJyb3IpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIGlmIChwdXNoX2VsZW1lbnQgKHBhcnNlciwgRUxFTUVOVF9MSVNURU4pID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIGVsc2UgaWYgKGVsZW1lbnRfdHlwZSA9PSBFTEVNRU5UX0FVVEgpCisgICAgeworICAgICAgaWYgKCFjaGVja19ub19hdHRyaWJ1dGVzIChwYXJzZXIsICJhdXRoIiwgYXR0cmlidXRlX25hbWVzLCBhdHRyaWJ1dGVfdmFsdWVzLCBlcnJvcikpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgaWYgKHB1c2hfZWxlbWVudCAocGFyc2VyLCBFTEVNRU5UX0FVVEgpID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIGVsc2UgaWYgKGVsZW1lbnRfdHlwZSA9PSBFTEVNRU5UX1NFUlZJQ0VIRUxQRVIpCisgICAgeworICAgICAgaWYgKCFjaGVja19ub19hdHRyaWJ1dGVzIChwYXJzZXIsICJzZXJ2aWNlaGVscGVyIiwgYXR0cmlidXRlX25hbWVzLCBhdHRyaWJ1dGVfdmFsdWVzLCBlcnJvcikpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgaWYgKHB1c2hfZWxlbWVudCAocGFyc2VyLCBFTEVNRU5UX1NFUlZJQ0VIRUxQRVIpID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIGVsc2UgaWYgKGVsZW1lbnRfdHlwZSA9PSBFTEVNRU5UX0lOQ0xVREVESVIpCisgICAgeworICAgICAgaWYgKCFjaGVja19ub19hdHRyaWJ1dGVzIChwYXJzZXIsICJpbmNsdWRlZGlyIiwgYXR0cmlidXRlX25hbWVzLCBhdHRyaWJ1dGVfdmFsdWVzLCBlcnJvcikpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgaWYgKHB1c2hfZWxlbWVudCAocGFyc2VyLCBFTEVNRU5UX0lOQ0xVREVESVIpID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIGVsc2UgaWYgKGVsZW1lbnRfdHlwZSA9PSBFTEVNRU5UX1NUQU5EQVJEX1NFU1NJT05fU0VSVklDRURJUlMpCisgICAgeworICAgICAgREJ1c0Vycm9yIGxvY2FsX2Vycm9yID0gREJVU19FUlJPUl9JTklUOworICAgICAgREJ1c0xpc3QgKmRpcnMgPSBOVUxMOworCisgICAgICBpZiAoIWNoZWNrX25vX2F0dHJpYnV0ZXMgKHBhcnNlciwgInN0YW5kYXJkX3Nlc3Npb25fc2VydmljZWRpcnMiLCBhdHRyaWJ1dGVfbmFtZXMsIGF0dHJpYnV0ZV92YWx1ZXMsIGVycm9yKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICBpZiAocHVzaF9lbGVtZW50IChwYXJzZXIsIEVMRU1FTlRfU1RBTkRBUkRfU0VTU0lPTl9TRVJWSUNFRElSUykgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIGlmIChfZGJ1c19zZXRfdXBfdHJhbnNpZW50X3Nlc3Npb25fc2VydmljZWRpcnMgKCZkaXJzLCAmbG9jYWxfZXJyb3IpKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCFzZXJ2aWNlX2RpcnNfYWJzb3JiX3N0cmluZ19saXN0ICgmcGFyc2VyLT5zZXJ2aWNlX2RpcnMsICZkaXJzLAorICAgICAgICAgICAgICAgIEJVU19TRVJWSUNFX0RJUl9GTEFHU19OT19XQVRDSCB8CisgICAgICAgICAgICAgICAgQlVTX1NFUlZJQ0VfRElSX0ZMQUdTX1NUUklDVF9OQU1JTkcpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgICAgICBfZGJ1c19saXN0X2ZvcmVhY2ggKCZkaXJzLCAoREJ1c0ZvcmVhY2hGdW5jdGlvbikgZGJ1c19mcmVlLAorICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgICAgICAgIF9kYnVzX2xpc3RfY2xlYXIgKCZkaXJzKTsKKyAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvKiBGYWlsaW5nIHRvIHNldCB0aGVzZSB1cCBpc24ndCBmYXRhbCAqLworICAgICAgICAgIF9kYnVzX3dhcm4gKCJVbmFibGUgdG8gc2V0IHVwIHRyYW5zaWVudCBzZXJ2aWNlIGRpcmVjdG9yeTogJXMiLAorICAgICAgICAgICAgICAgICAgICAgIGxvY2FsX2Vycm9yLm1lc3NhZ2UpOworICAgICAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmxvY2FsX2Vycm9yKTsKKyAgICAgICAgfQorCisgICAgICBfZGJ1c19hc3NlcnQgKGRpcnMgPT0gTlVMTCk7CisKKyAgICAgIGlmICghX2RidXNfZ2V0X3N0YW5kYXJkX3Nlc3Npb25fc2VydmljZWRpcnMgKCZkaXJzKSkKKyAgICAgICAgeworICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIC8qIFdlIGhhdmUgdHJhZGl0aW9uYWxseSB3YXRjaGVkIHRoZSBzdGFuZGFyZCBzZXNzaW9uIHNlcnZpY2UKKyAgICAgICAqIGRpcmVjdG9yaWVzIHdpdGggaW5vdGlmeSwgYW5kIGFsbG93ZWQgc2VydmljZSBmaWxlcyB3aG9zZSBuYW1lcyBkbyBub3QKKyAgICAgICAqIG1hdGNoIHRoZSBidXMgbmFtZSAqLworICAgICAgaWYgKCFzZXJ2aWNlX2RpcnNfYWJzb3JiX3N0cmluZ19saXN0ICgmcGFyc2VyLT5zZXJ2aWNlX2RpcnMsICZkaXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVVNfU0VSVklDRV9ESVJfRkxBR1NfTk9ORSkpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIF9kYnVzX2xpc3RfZm9yZWFjaCAoJmRpcnMsIChEQnVzRm9yZWFjaEZ1bmN0aW9uKSBkYnVzX2ZyZWUsCisgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICAgIF9kYnVzX2xpc3RfY2xlYXIgKCZkaXJzKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgX2RidXNfYXNzZXJ0IChkaXJzID09IE5VTEwpOworCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIGVsc2UgaWYgKGVsZW1lbnRfdHlwZSA9PSBFTEVNRU5UX1NUQU5EQVJEX1NZU1RFTV9TRVJWSUNFRElSUykKKyAgICB7CisgICAgICBEQnVzTGlzdCAqZGlyczsKKyAgICAgIGRpcnMgPSBOVUxMOworCisgICAgICBpZiAoIWNoZWNrX25vX2F0dHJpYnV0ZXMgKHBhcnNlciwgInN0YW5kYXJkX3N5c3RlbV9zZXJ2aWNlZGlycyIsIGF0dHJpYnV0ZV9uYW1lcywgYXR0cmlidXRlX3ZhbHVlcywgZXJyb3IpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIGlmIChwdXNoX2VsZW1lbnQgKHBhcnNlciwgRUxFTUVOVF9TVEFOREFSRF9TWVNURU1fU0VSVklDRURJUlMpID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICBpZiAoIV9kYnVzX2dldF9zdGFuZGFyZF9zeXN0ZW1fc2VydmljZWRpcnMgKCZkaXJzKSkKKyAgICAgICAgeworICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIC8qIFdlIGhhdmUgdHJhZGl0aW9uYWxseSB3YXRjaGVkIHRoZSBzdGFuZGFyZCBzeXN0ZW0gc2VydmljZQorICAgICAgICogZGlyZWN0b3JpZXMgd2l0aCBpbm90aWZ5LCBhbmQgYWxsb3dlZCBzZXJ2aWNlIGZpbGVzIHdob3NlIG5hbWVzIGRvIG5vdAorICAgICAgICogbWF0Y2ggdGhlIGJ1cyBuYW1lICh0aGUgc2VydmljZWhlbHBlciB3b24ndCBzdWNjZXNzZnVsbHkgYWN0aXZhdGUKKyAgICAgICAqIHRoZW0sIGJ1dCB3ZSBkbyBzdGlsbCBwYXJzZSB0aGVtKSAqLworICAgICAgaWYgKCFzZXJ2aWNlX2RpcnNfYWJzb3JiX3N0cmluZ19saXN0ICgmcGFyc2VyLT5zZXJ2aWNlX2RpcnMsICZkaXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVVNfU0VSVklDRV9ESVJfRkxBR1NfTk9ORSkpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIF9kYnVzX2xpc3RfZm9yZWFjaCAoJmRpcnMsIChEQnVzRm9yZWFjaEZ1bmN0aW9uKSBkYnVzX2ZyZWUsCisgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICAgIF9kYnVzX2xpc3RfY2xlYXIgKCZkaXJzKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICBlbHNlIGlmIChlbGVtZW50X3R5cGUgPT0gRUxFTUVOVF9BTExPV19BTk9OWU1PVVMpCisgICAgeworICAgICAgaWYgKCFjaGVja19ub19hdHRyaWJ1dGVzIChwYXJzZXIsICJhbGxvd19hbm9ueW1vdXMiLCBhdHRyaWJ1dGVfbmFtZXMsIGF0dHJpYnV0ZV92YWx1ZXMsIGVycm9yKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICBpZiAocHVzaF9lbGVtZW50IChwYXJzZXIsIEVMRU1FTlRfQUxMT1dfQU5PTllNT1VTKSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgcGFyc2VyLT5hbGxvd19hbm9ueW1vdXMgPSBUUlVFOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICBlbHNlIGlmIChlbGVtZW50X3R5cGUgPT0gRUxFTUVOVF9TRVJWSUNFRElSKQorICAgIHsKKyAgICAgIGlmICghY2hlY2tfbm9fYXR0cmlidXRlcyAocGFyc2VyLCAic2VydmljZWRpciIsIGF0dHJpYnV0ZV9uYW1lcywgYXR0cmlidXRlX3ZhbHVlcywgZXJyb3IpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIGlmIChwdXNoX2VsZW1lbnQgKHBhcnNlciwgRUxFTUVOVF9TRVJWSUNFRElSKSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICBlbHNlIGlmIChlbGVtZW50X3R5cGUgPT0gRUxFTUVOVF9JTkNMVURFKQorICAgIHsKKyAgICAgIEVsZW1lbnQgKmU7CisgICAgICBjb25zdCBjaGFyICppZl9zZWxpbnV4X2VuYWJsZWQ7CisgICAgICBjb25zdCBjaGFyICppZ25vcmVfbWlzc2luZzsKKyAgICAgIGNvbnN0IGNoYXIgKnNlbGludXhfcm9vdF9yZWxhdGl2ZTsKKworICAgICAgaWYgKChlID0gcHVzaF9lbGVtZW50IChwYXJzZXIsIEVMRU1FTlRfSU5DTFVERSkpID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICBlLT5kLmluY2x1ZGUuaWdub3JlX21pc3NpbmcgPSBGQUxTRTsKKyAgICAgIGUtPmQuaW5jbHVkZS5pZl9zZWxpbnV4X2VuYWJsZWQgPSBGQUxTRTsKKyAgICAgIGUtPmQuaW5jbHVkZS5zZWxpbnV4X3Jvb3RfcmVsYXRpdmUgPSBGQUxTRTsKKworICAgICAgaWYgKCFsb2NhdGVfYXR0cmlidXRlcyAocGFyc2VyLCAiaW5jbHVkZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVfbmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVfdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaWdub3JlX21pc3NpbmciLCAmaWdub3JlX21pc3NpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaWZfc2VsaW51eF9lbmFibGVkIiwgJmlmX3NlbGludXhfZW5hYmxlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZWxpbnV4X3Jvb3RfcmVsYXRpdmUiLCAmc2VsaW51eF9yb290X3JlbGF0aXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgaWYgKGlnbm9yZV9taXNzaW5nICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoc3RyY21wIChpZ25vcmVfbWlzc2luZywgInllcyIpID09IDApCisgICAgICAgICAgICBlLT5kLmluY2x1ZGUuaWdub3JlX21pc3NpbmcgPSBUUlVFOworICAgICAgICAgIGVsc2UgaWYgKHN0cmNtcCAoaWdub3JlX21pc3NpbmcsICJubyIpID09IDApCisgICAgICAgICAgICBlLT5kLmluY2x1ZGUuaWdub3JlX21pc3NpbmcgPSBGQUxTRTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaWdub3JlX21pc3NpbmcgYXR0cmlidXRlIG11c3QgaGF2ZSB2YWx1ZSBcInllc1wiIG9yIFwibm9cIiIpOworICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgaWYgKGlmX3NlbGludXhfZW5hYmxlZCAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgaWYgKHN0cmNtcCAoaWZfc2VsaW51eF9lbmFibGVkLCAieWVzIikgPT0gMCkKKyAgICAgICAgICAgIGUtPmQuaW5jbHVkZS5pZl9zZWxpbnV4X2VuYWJsZWQgPSBUUlVFOworICAgICAgICAgIGVsc2UgaWYgKHN0cmNtcCAoaWZfc2VsaW51eF9lbmFibGVkLCAibm8iKSA9PSAwKQorICAgICAgICAgICAgZS0+ZC5pbmNsdWRlLmlmX3NlbGludXhfZW5hYmxlZCA9IEZBTFNFOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpZl9zZWxpbnV4X2VuYWJsZWQgYXR0cmlidXRlIG11c3QgaGF2ZSB2YWx1ZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgXCJ5ZXNcIiBvciBcIm5vXCIiKTsKKyAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworCSAgICB9CisgICAgICAgIH0KKyAgICAgIAorICAgICAgaWYgKHNlbGludXhfcm9vdF9yZWxhdGl2ZSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgaWYgKHN0cmNtcCAoc2VsaW51eF9yb290X3JlbGF0aXZlLCAieWVzIikgPT0gMCkKKyAgICAgICAgICAgIGUtPmQuaW5jbHVkZS5zZWxpbnV4X3Jvb3RfcmVsYXRpdmUgPSBUUlVFOworICAgICAgICAgIGVsc2UgaWYgKHN0cmNtcCAoc2VsaW51eF9yb290X3JlbGF0aXZlLCAibm8iKSA9PSAwKQorICAgICAgICAgICAgZS0+ZC5pbmNsdWRlLnNlbGludXhfcm9vdF9yZWxhdGl2ZSA9IEZBTFNFOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZWxpbnV4X3Jvb3RfcmVsYXRpdmUgYXR0cmlidXRlIG11c3QgaGF2ZSB2YWx1ZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgXCJ5ZXNcIiBvciBcIm5vXCIiKTsKKyAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworCSAgICB9CisgICAgICAgIH0KKworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICBlbHNlIGlmIChlbGVtZW50X3R5cGUgPT0gRUxFTUVOVF9QT0xJQ1kpCisgICAgeworICAgICAgRWxlbWVudCAqZTsKKyAgICAgIGNvbnN0IGNoYXIgKmNvbnRleHQ7CisgICAgICBjb25zdCBjaGFyICp1c2VyOworICAgICAgY29uc3QgY2hhciAqZ3JvdXA7CisgICAgICBjb25zdCBjaGFyICphdF9jb25zb2xlOworCisgICAgICBpZiAoKGUgPSBwdXNoX2VsZW1lbnQgKHBhcnNlciwgRUxFTUVOVF9QT0xJQ1kpKSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgZS0+ZC5wb2xpY3kudHlwZSA9IFBPTElDWV9JR05PUkVEOworICAgICAgCisgICAgICBpZiAoIWxvY2F0ZV9hdHRyaWJ1dGVzIChwYXJzZXIsICJwb2xpY3kiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlX25hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlX3ZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRleHQiLCAmY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2VyIiwgJnVzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3JvdXAiLCAmZ3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXRfY29uc29sZSIsICZhdF9jb25zb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgaWYgKCgoY29udGV4dCAmJiB1c2VyKSB8fAorICAgICAgICAgICAoY29udGV4dCAmJiBncm91cCkgfHwKKyAgICAgICAgICAgKGNvbnRleHQgJiYgYXRfY29uc29sZSkpIHx8CisgICAgICAgICAgICgodXNlciAmJiBncm91cCkgfHwKKyAgICAgICAgICAgKHVzZXIgJiYgYXRfY29uc29sZSkpIHx8CisgICAgICAgICAgIChncm91cCAmJiBhdF9jb25zb2xlKSB8fAorICAgICAgICAgICEoY29udGV4dCB8fCB1c2VyIHx8IGdyb3VwIHx8IGF0X2NvbnNvbGUpKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIjxwb2xpY3k+IGVsZW1lbnQgbXVzdCBoYXZlIGV4YWN0bHkgb25lIG9mIChjb250ZXh0fHVzZXJ8Z3JvdXB8YXRfY29uc29sZSkgYXR0cmlidXRlcyIpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICBpZiAoY29udGV4dCAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgaWYgKHN0cmNtcCAoY29udGV4dCwgImRlZmF1bHQiKSA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBlLT5kLnBvbGljeS50eXBlID0gUE9MSUNZX0RFRkFVTFQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZSBpZiAoc3RyY21wIChjb250ZXh0LCAibWFuZGF0b3J5IikgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZS0+ZC5wb2xpY3kudHlwZSA9IFBPTElDWV9NQU5EQVRPUlk7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRleHQgYXR0cmlidXRlIG9uIDxwb2xpY3k+IG11c3QgaGF2ZSB0aGUgdmFsdWUgXCJkZWZhdWx0XCIgb3IgXCJtYW5kYXRvcnlcIiwgbm90IFwiJXNcIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0KTsKKyAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBlbHNlIGlmICh1c2VyICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBEQnVzU3RyaW5nIHVzZXJuYW1lOworICAgICAgICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmdXNlcm5hbWUsIHVzZXIpOworCisgICAgICAgICAgaWYgKF9kYnVzX3BhcnNlX3VuaXhfdXNlcl9mcm9tX2NvbmZpZyAoJnVzZXJuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlLT5kLnBvbGljeS5naWRfdWlkX29yX2F0X2NvbnNvbGUpKQorICAgICAgICAgICAgZS0+ZC5wb2xpY3kudHlwZSA9IFBPTElDWV9VU0VSOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJVbmtub3duIHVzZXJuYW1lIFwiJXNcIiBpbiBtZXNzYWdlIGJ1cyBjb25maWd1cmF0aW9uIGZpbGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgdXNlcik7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKGdyb3VwICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBEQnVzU3RyaW5nIGdyb3VwX25hbWU7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZncm91cF9uYW1lLCBncm91cCk7CisKKyAgICAgICAgICBpZiAoX2RidXNfcGFyc2VfdW5peF9ncm91cF9mcm9tX2NvbmZpZyAoJmdyb3VwX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlLT5kLnBvbGljeS5naWRfdWlkX29yX2F0X2NvbnNvbGUpKQorICAgICAgICAgICAgZS0+ZC5wb2xpY3kudHlwZSA9IFBPTElDWV9HUk9VUDsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBfZGJ1c193YXJuICgiVW5rbm93biBncm91cCBcIiVzXCIgaW4gbWVzc2FnZSBidXMgY29uZmlndXJhdGlvbiBmaWxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwKTsgICAgICAgICAgCisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKGF0X2NvbnNvbGUgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICBkYnVzX2Jvb2xfdCB0OworICAgICAgICAgICB0ID0gKHN0cmNtcCAoYXRfY29uc29sZSwgInRydWUiKSA9PSAwKTsKKyAgICAgICAgICAgaWYgKHQgfHwgc3RyY21wIChhdF9jb25zb2xlLCAiZmFsc2UiKSA9PSAwKQorICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGUtPmQucG9saWN5LmdpZF91aWRfb3JfYXRfY29uc29sZSA9IHQ7IAorICAgICAgICAgICAgICAgZS0+ZC5wb2xpY3kudHlwZSA9IFBPTElDWV9DT05TT0xFOworICAgICAgICAgICAgIH0gIAorICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmtub3duIHZhbHVlIFwiJXNcIiBmb3IgYXRfY29uc29sZSBpbiBtZXNzYWdlIGJ1cyBjb25maWd1cmF0aW9uIGZpbGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXRfY29uc29sZSk7CisKKyAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImFsbCA8cG9saWN5PiBhdHRyaWJ1dGVzIG51bGwgYW5kIHdlIGRpZG4ndCBzZXQgZXJyb3IiKTsKKyAgICAgICAgfQorICAgICAgCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIGVsc2UgaWYgKGVsZW1lbnRfdHlwZSA9PSBFTEVNRU5UX0xJTUlUKQorICAgIHsKKyAgICAgIEVsZW1lbnQgKmU7CisgICAgICBjb25zdCBjaGFyICpuYW1lOworCisgICAgICBpZiAoKGUgPSBwdXNoX2VsZW1lbnQgKHBhcnNlciwgRUxFTUVOVF9MSU1JVCkpID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgCisgICAgICBpZiAoIWxvY2F0ZV9hdHRyaWJ1dGVzIChwYXJzZXIsICJsaW1pdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVfbmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVfdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSIsICZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgaWYgKG5hbWUgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICI8bGltaXQ+IGVsZW1lbnQgbXVzdCBoYXZlIGEgXCJuYW1lXCIgYXR0cmlidXRlIik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIGUtPmQubGltaXQubmFtZSA9IF9kYnVzX3N0cmR1cCAobmFtZSk7CisgICAgICBpZiAoZS0+ZC5saW1pdC5uYW1lID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIGVsc2UgaWYgKGVsZW1lbnRfdHlwZSA9PSBFTEVNRU5UX1NFTElOVVgpCisgICAgeworICAgICAgaWYgKCFjaGVja19ub19hdHRyaWJ1dGVzIChwYXJzZXIsICJzZWxpbnV4IiwgYXR0cmlidXRlX25hbWVzLCBhdHRyaWJ1dGVfdmFsdWVzLCBlcnJvcikpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgaWYgKHB1c2hfZWxlbWVudCAocGFyc2VyLCBFTEVNRU5UX1NFTElOVVgpID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIGVsc2UgaWYgKGVsZW1lbnRfdHlwZSA9PSBFTEVNRU5UX0FQUEFSTU9SKQorICAgIHsKKyAgICAgIEVsZW1lbnQgKmU7CisgICAgICBjb25zdCBjaGFyICptb2RlOworCisgICAgICBpZiAoKGUgPSBwdXNoX2VsZW1lbnQgKHBhcnNlciwgRUxFTUVOVF9BUFBBUk1PUikpID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICBpZiAoIWxvY2F0ZV9hdHRyaWJ1dGVzIChwYXJzZXIsICJhcHBhcm1vciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVfbmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVfdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibW9kZSIsICZtb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgcmV0dXJuIGJ1c19hcHBhcm1vcl9zZXRfbW9kZV9mcm9tX2NvbmZpZyAobW9kZSwgZXJyb3IpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgIkVsZW1lbnQgPCVzPiBub3QgYWxsb3dlZCBpbnNpZGUgPCVzPiBpbiBjb25maWd1cmF0aW9uIGZpbGUiLAorICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRfbmFtZSwgImJ1c2NvbmZpZyIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KK30KKworLyoKKyAqIFBhcnNlIGFuIGF0dHJpYnV0ZSBuYW1lZCBuYW1lLCB3aG9zZSBjb250ZW50IGlzIGNvbnRlbnQsIG9yIE5VTEwgaWYKKyAqIG1pc3NpbmcuIEl0IGlzIG1lYW50IHRvIGJlIGEgKGxvbmcpIGludGVnZXIgYmV0d2VlbiBtaW4gYW5kIG1heCBpbmNsdXNpdmUuCisgKiBJZiBpdCBpcyBtaXNzaW5nLCB1c2UgZGVmIGFzIHRoZSBkZWZhdWx0IHZhbHVlICh3aGljaCBkb2VzIG5vdAorICogbmVjZXNzYXJpbHkgbmVlZCB0byBiZSBiZXR3ZWVuIG1pbiBhbmQgbWF4KS4KKyAqLworc3RhdGljIGRidXNfYm9vbF90CitwYXJzZV9pbnRfYXR0cmlidXRlIChjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqY29udGVudCwKKyAgICAgICAgICAgICAgICAgICAgIGxvbmcgICAgICAgIG1pbiwKKyAgICAgICAgICAgICAgICAgICAgIGxvbmcgICAgICAgIG1heCwKKyAgICAgICAgICAgICAgICAgICAgIGxvbmcgICAgICAgIGRlZiwKKyAgICAgICAgICAgICAgICAgICAgIGxvbmcgICAgICAgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAqZXJyb3IpCit7CisgIERCdXNTdHJpbmcgcGFyc2Vfc3RyaW5nOworCisgICp2YWx1ZSA9IGRlZjsKKworICBpZiAoY29udGVudCA9PSBOVUxMKQorICAgIHJldHVybiBUUlVFOworCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmcGFyc2Vfc3RyaW5nLCBjb250ZW50KTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19wYXJzZV9pbnQgKCZwYXJzZV9zdHJpbmcsIDAsIHZhbHVlLCBOVUxMKSB8fAorICAgICAgKnZhbHVlIDwgbWluIHx8ICp2YWx1ZSA+IG1heCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJCYWQgdmFsdWUgXCIlc1wiIGZvciAlcyBhdHRyaWJ1dGUsIG11c3QgYmUgYW4gIgorICAgICAgICAgICAgICAgICAgICAgICJpbnRlZ2VyIGluIHJhbmdlICVsZCB0byAlbGQgaW5jbHVzaXZlIiwKKyAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LCBuYW1lLCBtaW4sIG1heCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2FwcGVuZF9ydWxlX2Zyb21fZWxlbWVudCAoQnVzQ29uZmlnUGFyc2VyICAgKnBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgKmVsZW1lbnRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqKmF0dHJpYnV0ZV9uYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqKmF0dHJpYnV0ZV92YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgICBhbGxvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgKmVycm9yKQoreworICBjb25zdCBjaGFyICpsb2c7CisKKyAgLyogR3JvdXA6IHNlbmRfIGF0dHJpYnV0ZXMgKi8KKyAgY29uc3QgY2hhciAqc2VuZF9pbnRlcmZhY2U7CisgIGNvbnN0IGNoYXIgKnNlbmRfbWVtYmVyOworICBjb25zdCBjaGFyICpzZW5kX2Vycm9yOworICBjb25zdCBjaGFyICpzZW5kX2Rlc3RpbmF0aW9uOworICBjb25zdCBjaGFyICpzZW5kX3BhdGg7CisgIGNvbnN0IGNoYXIgKnNlbmRfdHlwZTsKKyAgY29uc3QgY2hhciAqc2VuZF9yZXF1ZXN0ZWRfcmVwbHk7CisgIGNvbnN0IGNoYXIgKnNlbmRfYnJvYWRjYXN0OworICAvKiBUUlVFIGlmIGFueSBzZW5kXyBhdHRyaWJ1dGUgaXMgcHJlc2VudCAqLworICBkYnVzX2Jvb2xfdCBhbnlfc2VuZF9hdHRyaWJ1dGU7CisKKyAgLyogR3JvdXA6IHJlY2VpdmVfIGF0dHJpYnV0ZXMgKi8KKyAgY29uc3QgY2hhciAqcmVjZWl2ZV9pbnRlcmZhY2U7CisgIGNvbnN0IGNoYXIgKnJlY2VpdmVfbWVtYmVyOworICBjb25zdCBjaGFyICpyZWNlaXZlX2Vycm9yOworICBjb25zdCBjaGFyICpyZWNlaXZlX3NlbmRlcjsKKyAgY29uc3QgY2hhciAqcmVjZWl2ZV9wYXRoOworICBjb25zdCBjaGFyICpyZWNlaXZlX3R5cGU7CisgIGNvbnN0IGNoYXIgKnJlY2VpdmVfcmVxdWVzdGVkX3JlcGx5OworICAvKiBUUlVFIGlmIGFueSByZWNlaXZlXyBhdHRyaWJ1dGUgaXMgcHJlc2VudCAqLworICBkYnVzX2Jvb2xfdCBhbnlfcmVjZWl2ZV9hdHRyaWJ1dGU7CisKKyAgLyogR3JvdXA6IG1lc3NhZ2UtbWF0Y2hpbmcgbW9kaWZpZXJzIHRoYXQgY2FuIGdvIG9uIHNlbmRfIG9yIHJlY2VpdmVfICovCisgIGNvbnN0IGNoYXIgKmVhdmVzZHJvcDsKKyAgY29uc3QgY2hhciAqbWF4X2Zkc19hdHRyOworICBsb25nIG1heF9mZHMgPSBEQlVTX01BWElNVU1fTUVTU0FHRV9VTklYX0ZEUzsKKyAgY29uc3QgY2hhciAqbWluX2Zkc19hdHRyOworICBsb25nIG1pbl9mZHMgPSAwOworICAvKiBUUlVFIGlmIGFueSBtZXNzYWdlLW1hdGNoaW5nIG1vZGlmaWVyIGlzIHByZXNlbnQgKi8KKyAgZGJ1c19ib29sX3QgYW55X21lc3NhZ2VfYXR0cmlidXRlOworCisgIC8qIE5vbi1tZXNzYWdlLXJlbGF0ZWQgYXR0cmlidXRlcyAqLworICBjb25zdCBjaGFyICpvd247CisgIGNvbnN0IGNoYXIgKm93bl9wcmVmaXg7CisgIGNvbnN0IGNoYXIgKnVzZXI7CisgIGNvbnN0IGNoYXIgKmdyb3VwOworCisgIEJ1c1BvbGljeVJ1bGUgKnJ1bGU7CisKKyAgaWYgKCFsb2NhdGVfYXR0cmlidXRlcyAocGFyc2VyLCBlbGVtZW50X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZV9uYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlX3ZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJzZW5kX2ludGVyZmFjZSIsICZzZW5kX2ludGVyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInNlbmRfbWVtYmVyIiwgJnNlbmRfbWVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAic2VuZF9lcnJvciIsICZzZW5kX2Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAic2VuZF9kZXN0aW5hdGlvbiIsICZzZW5kX2Rlc3RpbmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAic2VuZF9wYXRoIiwgJnNlbmRfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInNlbmRfdHlwZSIsICZzZW5kX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJzZW5kX2Jyb2FkY2FzdCIsICZzZW5kX2Jyb2FkY2FzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInJlY2VpdmVfaW50ZXJmYWNlIiwgJnJlY2VpdmVfaW50ZXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAicmVjZWl2ZV9tZW1iZXIiLCAmcmVjZWl2ZV9tZW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWNlaXZlX2Vycm9yIiwgJnJlY2VpdmVfZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWNlaXZlX3NlbmRlciIsICZyZWNlaXZlX3NlbmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInJlY2VpdmVfcGF0aCIsICZyZWNlaXZlX3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWNlaXZlX3R5cGUiLCAmcmVjZWl2ZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiZWF2ZXNkcm9wIiwgJmVhdmVzZHJvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIm1heF9mZHMiLCAmbWF4X2Zkc19hdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAibWluX2ZkcyIsICZtaW5fZmRzX2F0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJzZW5kX3JlcXVlc3RlZF9yZXBseSIsICZzZW5kX3JlcXVlc3RlZF9yZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInJlY2VpdmVfcmVxdWVzdGVkX3JlcGx5IiwgJnJlY2VpdmVfcmVxdWVzdGVkX3JlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAib3duIiwgJm93biwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIm93bl9wcmVmaXgiLCAmb3duX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInVzZXIiLCAmdXNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImdyb3VwIiwgJmdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAibG9nIiwgJmxvZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGFueV9zZW5kX2F0dHJpYnV0ZSA9IChzZW5kX2Rlc3RpbmF0aW9uICE9IE5VTEwgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRfYnJvYWRjYXN0ICE9IE5VTEwgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRfcGF0aCAhPSBOVUxMIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBzZW5kX3R5cGUgIT0gTlVMTCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgc2VuZF9pbnRlcmZhY2UgIT0gTlVMTCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgc2VuZF9tZW1iZXIgIT0gTlVMTCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgc2VuZF9lcnJvciAhPSBOVUxMIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBzZW5kX3JlcXVlc3RlZF9yZXBseSAhPSBOVUxMKTsKKyAgYW55X3JlY2VpdmVfYXR0cmlidXRlID0gKHJlY2VpdmVfc2VuZGVyICE9IE5VTEwgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVfcGF0aCAhPSBOVUxMIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlX3R5cGUgIT0gTlVMTCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZV9pbnRlcmZhY2UgIT0gTlVMTCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZV9tZW1iZXIgIT0gTlVMTCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZV9lcnJvciAhPSBOVUxMIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlX3JlcXVlc3RlZF9yZXBseSAhPSBOVUxMIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA8YWxsb3cgZWF2ZXNkcm9wPSJ0cnVlIi8+IG1lYW5zIHRoZSBzYW1lIGFzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiA8YWxsb3cgcmVjZWl2ZV9zZW5kZXI9IioiIGVhdmVzZHJvcD0idHJ1ZSIvPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGJ1dCA8YWxsb3cgc2VuZF9hbnl0aGluZz0iYW55dGhpbmciLz4gY2FuIGFsc28KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHRha2UgdGhlIGVhdmVzZHJvcCBhdHRyaWJ1dGUgYW5kIHN0aWxsIGNvdW50cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYXMgYSBzZW5kIHJ1bGUuICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoIWFueV9zZW5kX2F0dHJpYnV0ZSAmJiBlYXZlc2Ryb3AgIT0gTlVMTCkpOworICBhbnlfbWVzc2FnZV9hdHRyaWJ1dGUgPSAoYW55X3NlbmRfYXR0cmlidXRlIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICBhbnlfcmVjZWl2ZV9hdHRyaWJ1dGUgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVhdmVzZHJvcCAhPSBOVUxMIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfZmRzX2F0dHIgIT0gTlVMTCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluX2Zkc19hdHRyICE9IE5VTEwpOworCisgIGlmICghKGFueV9zZW5kX2F0dHJpYnV0ZSB8fAorICAgICAgICBhbnlfcmVjZWl2ZV9hdHRyaWJ1dGUgfHwKKyAgICAgICAgb3duIHx8IG93bl9wcmVmaXggfHwgdXNlciB8fCBncm91cCkpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiRWxlbWVudCA8JXM+IG11c3QgaGF2ZSBvbmUgb3IgbW9yZSBhdHRyaWJ1dGVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50X25hbWUpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoKHNlbmRfbWVtYmVyICYmIChzZW5kX2ludGVyZmFjZSA9PSBOVUxMICYmIHNlbmRfcGF0aCA9PSBOVUxMKSkgfHwKKyAgICAgIChyZWNlaXZlX21lbWJlciAmJiAocmVjZWl2ZV9pbnRlcmZhY2UgPT0gTlVMTCAmJiByZWNlaXZlX3BhdGggPT0gTlVMTCkpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgIk9uIGVsZW1lbnQgPCVzPiwgaWYgeW91IHNwZWNpZnkgYSBtZW1iZXIgeW91IG11c3Qgc3BlY2lmeSBhbiBpbnRlcmZhY2Ugb3IgYSBwYXRoLiBLZWVwIGluIG1pbmQgdGhhdCBub3QgYWxsIG1lc3NhZ2VzIGhhdmUgYW4gaW50ZXJmYWNlIGZpZWxkLiIsCisgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudF9uYW1lKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIAorICAvKiBBbGxvd2VkIGNvbWJpbmF0aW9ucyBvZiBlbGVtZW50cyBhcmU6CisgICAqCisgICAqICAgYmFzZSwgbXVzdCBiZSBhbGwgc2VuZCBvciBhbGwgcmVjZWl2ZToKKyAgICogICAgIG5vdGhpbmcKKyAgICogICAgIGludGVyZmFjZQorICAgKiAgICAgaW50ZXJmYWNlICsgbWVtYmVyCisgICAqICAgICBlcnJvcgorICAgKiAKKyAgICogICBiYXNlIHNlbmRfIGNhbiBjb21iaW5lIHdpdGggc2VuZF9kZXN0aW5hdGlvbiwgc2VuZF9wYXRoLCBzZW5kX3R5cGUsIHNlbmRfcmVxdWVzdGVkX3JlcGx5LCBzZW5kX2Jyb2FkY2FzdCwgZWF2ZXNkcm9wCisgICAqICAgYmFzZSByZWNlaXZlXyB3aXRoIHJlY2VpdmVfc2VuZGVyLCByZWNlaXZlX3BhdGgsIHJlY2VpdmVfdHlwZSwgcmVjZWl2ZV9yZXF1ZXN0ZWRfcmVwbHksIGVhdmVzZHJvcAorICAgKgorICAgKiAgIHVzZXIsIGdyb3VwLCBvd24sIG93bl9wcmVmaXggbXVzdCBvY2N1ciBhbG9uZQorICAgKi8KKworICBpZiAoYW55X21lc3NhZ2VfYXR0cmlidXRlICsKKyAgICAgICgob3duICE9IE5VTEwpICsKKyAgICAgICAob3duX3ByZWZpeCAhPSBOVUxMKSArCisgICAgICAgKHVzZXIgIT0gTlVMTCkgKworICAgICAgIChncm91cCAhPSBOVUxMKSkgPiAxKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgY29tYmluYXRpb24gb2YgYXR0cmlidXRlcyBvbiBlbGVtZW50IDwlcz46ICIKKyAgICAgICAgICAgICAgICAgICAgICAib3duLCBvd25fcHJlZml4LCB1c2VyLCBncm91cCBhbmQgdGhlIG1lc3NhZ2UtcmVsYXRlZCAiCisgICAgICAgICAgICAgICAgICAgICAgImF0dHJpYnV0ZXMgY2Fubm90IGJlIGNvbWJpbmVkIiwKKyAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50X25hbWUpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoYW55X3NlbmRfYXR0cmlidXRlICYmIGFueV9yZWNlaXZlX2F0dHJpYnV0ZSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGNvbWJpbmF0aW9uIG9mIGF0dHJpYnV0ZXMgb24gZWxlbWVudCA8JXM+OiAiCisgICAgICAgICAgICAgICAgICAgICAgInNlbmQgYW5kIHJlY2VpdmUgYXR0cmlidXRlcyBjYW5ub3QgYmUgY29tYmluZWQiLAorICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRfbmFtZSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICgoc2VuZF9tZW1iZXIgIT0gTlVMTCB8fCBzZW5kX2ludGVyZmFjZSAhPSBOVUxMKSAmJiBzZW5kX2Vycm9yICE9IE5VTEwpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBjb21iaW5hdGlvbiBvZiBhdHRyaWJ1dGVzIG9uIGVsZW1lbnQgPCVzPjogIgorICAgICAgICAgICAgICAgICAgICAgICJzZW5kX2Vycm9yIGNhbm5vdCBiZSBjb21iaW5lZCB3aXRoIHNlbmRfbWVtYmVyIG9yICIKKyAgICAgICAgICAgICAgICAgICAgICAic2VuZF9pbnRlcmZhY2UiLAorICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRfbmFtZSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICgocmVjZWl2ZV9tZW1iZXIgIT0gTlVMTCB8fCByZWNlaXZlX2ludGVyZmFjZSAhPSBOVUxMKSAmJgorICAgICAgcmVjZWl2ZV9lcnJvciAhPSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgY29tYmluYXRpb24gb2YgYXR0cmlidXRlcyBvbiBlbGVtZW50IDwlcz46ICIKKyAgICAgICAgICAgICAgICAgICAgICAicmVjZWl2ZV9lcnJvciBjYW5ub3QgYmUgY29tYmluZWQgd2l0aCByZWNlaXZlX21lbWJlciAiCisgICAgICAgICAgICAgICAgICAgICAgIm9yIHJlY2VpdmVfaW50ZXJmYWNlIiwKKyAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50X25hbWUpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBydWxlID0gTlVMTDsKKworICAvKiBJbiBCdXNQb2xpY3lSdWxlLCBOVUxMIHJlcHJlc2VudHMgd2lsZGNhcmQuCisgICAqIEluIHRoZSBjb25maWcgZmlsZSwgJyonIHJlcHJlc2VudHMgaXQuCisgICAqLworI2RlZmluZSBJU19XSUxEQ0FSRChzdHIpICgoc3RyKSAmJiAoKHN0cilbMF0pID09ICcqJyAmJiAoKHN0cilbMV0pID09ICdcMCcpCisKKyAgaWYgKGFueV9zZW5kX2F0dHJpYnV0ZSkKKyAgICB7CisgICAgICBpbnQgbWVzc2FnZV90eXBlOworICAgICAgCisgICAgICBpZiAoSVNfV0lMRENBUkQgKHNlbmRfaW50ZXJmYWNlKSkKKyAgICAgICAgc2VuZF9pbnRlcmZhY2UgPSBOVUxMOworICAgICAgaWYgKElTX1dJTERDQVJEIChzZW5kX21lbWJlcikpCisgICAgICAgIHNlbmRfbWVtYmVyID0gTlVMTDsKKyAgICAgIGlmIChJU19XSUxEQ0FSRCAoc2VuZF9lcnJvcikpCisgICAgICAgIHNlbmRfZXJyb3IgPSBOVUxMOworICAgICAgaWYgKElTX1dJTERDQVJEIChzZW5kX2Rlc3RpbmF0aW9uKSkKKyAgICAgICAgc2VuZF9kZXN0aW5hdGlvbiA9IE5VTEw7CisgICAgICBpZiAoSVNfV0lMRENBUkQgKHNlbmRfcGF0aCkpCisgICAgICAgIHNlbmRfcGF0aCA9IE5VTEw7CisgICAgICBpZiAoSVNfV0lMRENBUkQgKHNlbmRfdHlwZSkpCisgICAgICAgIHNlbmRfdHlwZSA9IE5VTEw7CisKKyAgICAgIG1lc3NhZ2VfdHlwZSA9IERCVVNfTUVTU0FHRV9UWVBFX0lOVkFMSUQ7CisgICAgICBpZiAoc2VuZF90eXBlICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBtZXNzYWdlX3R5cGUgPSBkYnVzX21lc3NhZ2VfdHlwZV9mcm9tX3N0cmluZyAoc2VuZF90eXBlKTsKKyAgICAgICAgICBpZiAobWVzc2FnZV90eXBlID09IERCVVNfTUVTU0FHRV9UWVBFX0lOVkFMSUQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmFkIG1lc3NhZ2UgdHlwZSBcIiVzXCIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZF90eXBlKTsKKyAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgIGlmIChlYXZlc2Ryb3AgJiYKKyAgICAgICAgICAhKHN0cmNtcCAoZWF2ZXNkcm9wLCAidHJ1ZSIpID09IDAgfHwKKyAgICAgICAgICAgIHN0cmNtcCAoZWF2ZXNkcm9wLCAiZmFsc2UiKSA9PSAwKSkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJCYWQgdmFsdWUgXCIlc1wiIGZvciAlcyBhdHRyaWJ1dGUsIG11c3QgYmUgdHJ1ZSBvciBmYWxzZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJlYXZlc2Ryb3AiLCBlYXZlc2Ryb3ApOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICBpZiAoc2VuZF9icm9hZGNhc3QgJiYKKyAgICAgICAgICAhKHN0cmNtcCAoc2VuZF9icm9hZGNhc3QsICJ0cnVlIikgPT0gMCB8fAorICAgICAgICAgICAgc3RyY21wIChzZW5kX2Jyb2FkY2FzdCwgImZhbHNlIikgPT0gMCkpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAiQmFkIHZhbHVlIFwiJXNcIiBmb3IgJXMgYXR0cmlidXRlLCBtdXN0IGJlIHRydWUgb3IgZmFsc2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kX2Jyb2FkY2FzdCwgInNlbmRfYnJvYWRjYXN0Iik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIGlmIChzZW5kX2Rlc3RpbmF0aW9uICE9IE5VTEwgJiYKKyAgICAgICAgICBzZW5kX2Jyb2FkY2FzdCAhPSBOVUxMICYmCisgICAgICAgICAgc3RyY21wIChzZW5kX2Jyb2FkY2FzdCwgInRydWUiKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgLyogQnJvYWRjYXN0IG1lc3NhZ2VzIGhhdmUgbm8gZGVzdGluYXRpb24sIHNvIHRoaXMgY2Fubm90CisgICAgICAgICAgICogcG9zc2libHkgbWF0Y2ggKi8KKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAiUnVsZSB3aXRoIHNlbmRfYnJvYWRjYXN0PVwidHJ1ZVwiIGFuZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJzZW5kX2Rlc3RpbmF0aW9uPVwiJXNcIiBjYW5ub3QgbWF0Y2ggYW55dGhpbmciLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kX2Rlc3RpbmF0aW9uKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgaWYgKHNlbmRfcmVxdWVzdGVkX3JlcGx5ICYmCisgICAgICAgICAgIShzdHJjbXAgKHNlbmRfcmVxdWVzdGVkX3JlcGx5LCAidHJ1ZSIpID09IDAgfHwKKyAgICAgICAgICAgIHN0cmNtcCAoc2VuZF9yZXF1ZXN0ZWRfcmVwbHksICJmYWxzZSIpID09IDApKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkJhZCB2YWx1ZSBcIiVzXCIgZm9yICVzIGF0dHJpYnV0ZSwgbXVzdCBiZSB0cnVlIG9yIGZhbHNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInNlbmRfcmVxdWVzdGVkX3JlcGx5Iiwgc2VuZF9yZXF1ZXN0ZWRfcmVwbHkpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICAvKiBNYXRjaGluZyBvbmx5IG1lc3NhZ2VzIHdpdGggREJVU19NQVhJTVVNX01FU1NBR0VfVU5JWF9GRFMgb3IgZmV3ZXIKKyAgICAgICAqIGZkcyBpcyB0aGUgc2FtZSBhcyBtYXRjaGluZyBhbGwgbWVzc2FnZXMsIHNvIHdlIGFsd2F5cyBzZXQgYSBtYXhpbXVtLAorICAgICAgICogYnV0IHBlcmhhcHMgYW4gdW5yZWFsaXN0aWNhbGx5IGhpZ2ggb25lLiAqLworICAgICAgaWYgKCFwYXJzZV9pbnRfYXR0cmlidXRlICgibWF4X2ZkcyIsIG1heF9mZHNfYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgREJVU19NQVhJTVVNX01FU1NBR0VfVU5JWF9GRFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfTUFYSU1VTV9NRVNTQUdFX1VOSVhfRkRTLCAmbWF4X2ZkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpIHx8CisgICAgICAgICAgIXBhcnNlX2ludF9hdHRyaWJ1dGUgKCJtaW5fZmRzIiwgbWluX2Zkc19hdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBEQlVTX01BWElNVU1fTUVTU0FHRV9VTklYX0ZEUywgMCwgJm1pbl9mZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICBydWxlID0gYnVzX3BvbGljeV9ydWxlX25ldyAoQlVTX1BPTElDWV9SVUxFX1NFTkQsIGFsbG93KTsgCisgICAgICBpZiAocnVsZSA9PSBOVUxMKQorICAgICAgICBnb3RvIG5vbWVtOworICAgICAgCisgICAgICBpZiAoZWF2ZXNkcm9wKQorICAgICAgICBydWxlLT5kLnNlbmQuZWF2ZXNkcm9wID0gKHN0cmNtcCAoZWF2ZXNkcm9wLCAidHJ1ZSIpID09IDApOworCisgICAgICBpZiAobG9nKQorICAgICAgICBydWxlLT5kLnNlbmQubG9nID0gKHN0cmNtcCAobG9nLCAidHJ1ZSIpID09IDApOworCisgICAgICBpZiAoc2VuZF9yZXF1ZXN0ZWRfcmVwbHkpCisgICAgICAgIHJ1bGUtPmQuc2VuZC5yZXF1ZXN0ZWRfcmVwbHkgPSAoc3RyY21wIChzZW5kX3JlcXVlc3RlZF9yZXBseSwgInRydWUiKSA9PSAwKTsKKworICAgICAgaWYgKHNlbmRfYnJvYWRjYXN0KQorICAgICAgICB7CisgICAgICAgICAgaWYgKHN0cmNtcCAoc2VuZF9icm9hZGNhc3QsICJ0cnVlIikgPT0gMCkKKyAgICAgICAgICAgIHJ1bGUtPmQuc2VuZC5icm9hZGNhc3QgPSBCVVNfUE9MSUNZX1RSSVNUQVRFX1RSVUU7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgcnVsZS0+ZC5zZW5kLmJyb2FkY2FzdCA9IEJVU19QT0xJQ1lfVFJJU1RBVEVfRkFMU0U7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHJ1bGUtPmQuc2VuZC5icm9hZGNhc3QgPSBCVVNfUE9MSUNZX1RSSVNUQVRFX0FOWTsKKyAgICAgICAgfQorCisgICAgICBydWxlLT5kLnNlbmQubWVzc2FnZV90eXBlID0gbWVzc2FnZV90eXBlOworICAgICAgcnVsZS0+ZC5zZW5kLnBhdGggPSBfZGJ1c19zdHJkdXAgKHNlbmRfcGF0aCk7CisgICAgICBydWxlLT5kLnNlbmQuaW50ZXJmYWNlID0gX2RidXNfc3RyZHVwIChzZW5kX2ludGVyZmFjZSk7CisgICAgICBydWxlLT5kLnNlbmQubWVtYmVyID0gX2RidXNfc3RyZHVwIChzZW5kX21lbWJlcik7CisgICAgICBydWxlLT5kLnNlbmQuZXJyb3IgPSBfZGJ1c19zdHJkdXAgKHNlbmRfZXJyb3IpOworICAgICAgcnVsZS0+ZC5zZW5kLmRlc3RpbmF0aW9uID0gX2RidXNfc3RyZHVwIChzZW5kX2Rlc3RpbmF0aW9uKTsKKyAgICAgIHJ1bGUtPmQuc2VuZC5tYXhfZmRzID0gbWF4X2ZkczsKKyAgICAgIHJ1bGUtPmQuc2VuZC5taW5fZmRzID0gbWluX2ZkczsKKworICAgICAgaWYgKHNlbmRfcGF0aCAmJiBydWxlLT5kLnNlbmQucGF0aCA9PSBOVUxMKQorICAgICAgICBnb3RvIG5vbWVtOworICAgICAgaWYgKHNlbmRfaW50ZXJmYWNlICYmIHJ1bGUtPmQuc2VuZC5pbnRlcmZhY2UgPT0gTlVMTCkKKyAgICAgICAgZ290byBub21lbTsKKyAgICAgIGlmIChzZW5kX21lbWJlciAmJiBydWxlLT5kLnNlbmQubWVtYmVyID09IE5VTEwpCisgICAgICAgIGdvdG8gbm9tZW07CisgICAgICBpZiAoc2VuZF9lcnJvciAmJiBydWxlLT5kLnNlbmQuZXJyb3IgPT0gTlVMTCkKKyAgICAgICAgZ290byBub21lbTsKKyAgICAgIGlmIChzZW5kX2Rlc3RpbmF0aW9uICYmIHJ1bGUtPmQuc2VuZC5kZXN0aW5hdGlvbiA9PSBOVUxMKQorICAgICAgICBnb3RvIG5vbWVtOworICAgIH0KKyAgZWxzZSBpZiAoYW55X3JlY2VpdmVfYXR0cmlidXRlKQorICAgIHsKKyAgICAgIGludCBtZXNzYWdlX3R5cGU7CisgICAgICAKKyAgICAgIGlmIChJU19XSUxEQ0FSRCAocmVjZWl2ZV9pbnRlcmZhY2UpKQorICAgICAgICByZWNlaXZlX2ludGVyZmFjZSA9IE5VTEw7CisgICAgICBpZiAoSVNfV0lMRENBUkQgKHJlY2VpdmVfbWVtYmVyKSkKKyAgICAgICAgcmVjZWl2ZV9tZW1iZXIgPSBOVUxMOworICAgICAgaWYgKElTX1dJTERDQVJEIChyZWNlaXZlX2Vycm9yKSkKKyAgICAgICAgcmVjZWl2ZV9lcnJvciA9IE5VTEw7CisgICAgICBpZiAoSVNfV0lMRENBUkQgKHJlY2VpdmVfc2VuZGVyKSkKKyAgICAgICAgcmVjZWl2ZV9zZW5kZXIgPSBOVUxMOworICAgICAgaWYgKElTX1dJTERDQVJEIChyZWNlaXZlX3BhdGgpKQorICAgICAgICByZWNlaXZlX3BhdGggPSBOVUxMOworICAgICAgaWYgKElTX1dJTERDQVJEIChyZWNlaXZlX3R5cGUpKQorICAgICAgICByZWNlaXZlX3R5cGUgPSBOVUxMOworCisgICAgICBtZXNzYWdlX3R5cGUgPSBEQlVTX01FU1NBR0VfVFlQRV9JTlZBTElEOworICAgICAgaWYgKHJlY2VpdmVfdHlwZSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgbWVzc2FnZV90eXBlID0gZGJ1c19tZXNzYWdlX3R5cGVfZnJvbV9zdHJpbmcgKHJlY2VpdmVfdHlwZSk7CisgICAgICAgICAgaWYgKG1lc3NhZ2VfdHlwZSA9PSBEQlVTX01FU1NBR0VfVFlQRV9JTlZBTElEKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJhZCBtZXNzYWdlIHR5cGUgXCIlc1wiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVfdHlwZSk7CisgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICAgIGlmIChlYXZlc2Ryb3AgJiYKKyAgICAgICAgICAhKHN0cmNtcCAoZWF2ZXNkcm9wLCAidHJ1ZSIpID09IDAgfHwKKyAgICAgICAgICAgIHN0cmNtcCAoZWF2ZXNkcm9wLCAiZmFsc2UiKSA9PSAwKSkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJCYWQgdmFsdWUgXCIlc1wiIGZvciAlcyBhdHRyaWJ1dGUsIG11c3QgYmUgdHJ1ZSBvciBmYWxzZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJlYXZlc2Ryb3AiLCBlYXZlc2Ryb3ApOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICBpZiAocmVjZWl2ZV9yZXF1ZXN0ZWRfcmVwbHkgJiYKKyAgICAgICAgICAhKHN0cmNtcCAocmVjZWl2ZV9yZXF1ZXN0ZWRfcmVwbHksICJ0cnVlIikgPT0gMCB8fAorICAgICAgICAgICAgc3RyY21wIChyZWNlaXZlX3JlcXVlc3RlZF9yZXBseSwgImZhbHNlIikgPT0gMCkpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAiQmFkIHZhbHVlIFwiJXNcIiBmb3IgJXMgYXR0cmlidXRlLCBtdXN0IGJlIHRydWUgb3IgZmFsc2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAicmVjZWl2ZV9yZXF1ZXN0ZWRfcmVwbHkiLCByZWNlaXZlX3JlcXVlc3RlZF9yZXBseSk7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIGlmICghcGFyc2VfaW50X2F0dHJpYnV0ZSAoIm1heF9mZHMiLCBtYXhfZmRzX2F0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIERCVVNfTUFYSU1VTV9NRVNTQUdFX1VOSVhfRkRTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX01BWElNVU1fTUVTU0FHRV9VTklYX0ZEUywgJm1heF9mZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSB8fAorICAgICAgICAgICFwYXJzZV9pbnRfYXR0cmlidXRlICgibWluX2ZkcyIsIG1pbl9mZHNfYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgREJVU19NQVhJTVVNX01FU1NBR0VfVU5JWF9GRFMsIDAsICZtaW5fZmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgcnVsZSA9IGJ1c19wb2xpY3lfcnVsZV9uZXcgKEJVU19QT0xJQ1lfUlVMRV9SRUNFSVZFLCBhbGxvdyk7IAorICAgICAgaWYgKHJ1bGUgPT0gTlVMTCkKKyAgICAgICAgZ290byBub21lbTsKKworICAgICAgaWYgKGVhdmVzZHJvcCkKKyAgICAgICAgcnVsZS0+ZC5yZWNlaXZlLmVhdmVzZHJvcCA9IChzdHJjbXAgKGVhdmVzZHJvcCwgInRydWUiKSA9PSAwKTsKKworICAgICAgaWYgKHJlY2VpdmVfcmVxdWVzdGVkX3JlcGx5KQorICAgICAgICBydWxlLT5kLnJlY2VpdmUucmVxdWVzdGVkX3JlcGx5ID0gKHN0cmNtcCAocmVjZWl2ZV9yZXF1ZXN0ZWRfcmVwbHksICJ0cnVlIikgPT0gMCk7CisgICAgICAKKyAgICAgIHJ1bGUtPmQucmVjZWl2ZS5tZXNzYWdlX3R5cGUgPSBtZXNzYWdlX3R5cGU7CisgICAgICBydWxlLT5kLnJlY2VpdmUucGF0aCA9IF9kYnVzX3N0cmR1cCAocmVjZWl2ZV9wYXRoKTsKKyAgICAgIHJ1bGUtPmQucmVjZWl2ZS5pbnRlcmZhY2UgPSBfZGJ1c19zdHJkdXAgKHJlY2VpdmVfaW50ZXJmYWNlKTsKKyAgICAgIHJ1bGUtPmQucmVjZWl2ZS5tZW1iZXIgPSBfZGJ1c19zdHJkdXAgKHJlY2VpdmVfbWVtYmVyKTsKKyAgICAgIHJ1bGUtPmQucmVjZWl2ZS5lcnJvciA9IF9kYnVzX3N0cmR1cCAocmVjZWl2ZV9lcnJvcik7CisgICAgICBydWxlLT5kLnJlY2VpdmUub3JpZ2luID0gX2RidXNfc3RyZHVwIChyZWNlaXZlX3NlbmRlcik7CisgICAgICBydWxlLT5kLnJlY2VpdmUubWF4X2ZkcyA9IG1heF9mZHM7CisgICAgICBydWxlLT5kLnJlY2VpdmUubWluX2ZkcyA9IG1pbl9mZHM7CisKKyAgICAgIGlmIChyZWNlaXZlX3BhdGggJiYgcnVsZS0+ZC5yZWNlaXZlLnBhdGggPT0gTlVMTCkKKyAgICAgICAgZ290byBub21lbTsKKyAgICAgIGlmIChyZWNlaXZlX2ludGVyZmFjZSAmJiBydWxlLT5kLnJlY2VpdmUuaW50ZXJmYWNlID09IE5VTEwpCisgICAgICAgIGdvdG8gbm9tZW07CisgICAgICBpZiAocmVjZWl2ZV9tZW1iZXIgJiYgcnVsZS0+ZC5yZWNlaXZlLm1lbWJlciA9PSBOVUxMKQorICAgICAgICBnb3RvIG5vbWVtOworICAgICAgaWYgKHJlY2VpdmVfZXJyb3IgJiYgcnVsZS0+ZC5yZWNlaXZlLmVycm9yID09IE5VTEwpCisgICAgICAgIGdvdG8gbm9tZW07CisgICAgICBpZiAocmVjZWl2ZV9zZW5kZXIgJiYgcnVsZS0+ZC5yZWNlaXZlLm9yaWdpbiA9PSBOVUxMKQorICAgICAgICBnb3RvIG5vbWVtOworICAgIH0KKyAgZWxzZSBpZiAob3duIHx8IG93bl9wcmVmaXgpCisgICAgeworICAgICAgcnVsZSA9IGJ1c19wb2xpY3lfcnVsZV9uZXcgKEJVU19QT0xJQ1lfUlVMRV9PV04sIGFsbG93KTsgCisgICAgICBpZiAocnVsZSA9PSBOVUxMKQorICAgICAgICBnb3RvIG5vbWVtOworCisgICAgICBpZiAob3duKQorICAgICAgICB7CisgICAgICAgICAgaWYgKElTX1dJTERDQVJEIChvd24pKQorICAgICAgICAgICAgb3duID0gTlVMTDsKKyAgICAgIAorICAgICAgICAgIHJ1bGUtPmQub3duLnByZWZpeCA9IDA7CisgICAgICAgICAgcnVsZS0+ZC5vd24uc2VydmljZV9uYW1lID0gX2RidXNfc3RyZHVwIChvd24pOworICAgICAgICAgIGlmIChvd24gJiYgcnVsZS0+ZC5vd24uc2VydmljZV9uYW1lID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIG5vbWVtOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBydWxlLT5kLm93bi5wcmVmaXggPSAxOworICAgICAgICAgIHJ1bGUtPmQub3duLnNlcnZpY2VfbmFtZSA9IF9kYnVzX3N0cmR1cCAob3duX3ByZWZpeCk7CisgICAgICAgICAgaWYgKHJ1bGUtPmQub3duLnNlcnZpY2VfbmFtZSA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBub21lbTsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZSBpZiAodXNlcikKKyAgICB7ICAgICAgCisgICAgICBpZiAoSVNfV0lMRENBUkQgKHVzZXIpKQorICAgICAgICB7CisgICAgICAgICAgcnVsZSA9IGJ1c19wb2xpY3lfcnVsZV9uZXcgKEJVU19QT0xJQ1lfUlVMRV9VU0VSLCBhbGxvdyk7IAorICAgICAgICAgIGlmIChydWxlID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIG5vbWVtOworCisgICAgICAgICAgcnVsZS0+ZC51c2VyLnVpZCA9IERCVVNfVUlEX1VOU0VUOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBEQnVzU3RyaW5nIHVzZXJuYW1lOworICAgICAgICAgIGRidXNfdWlkX3QgdWlkOworICAgICAgICAgIAorICAgICAgICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmdXNlcm5hbWUsIHVzZXIpOworICAgICAgCisgICAgICAgICAgaWYgKF9kYnVzX3BhcnNlX3VuaXhfdXNlcl9mcm9tX2NvbmZpZyAoJnVzZXJuYW1lLCAmdWlkKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcnVsZSA9IGJ1c19wb2xpY3lfcnVsZV9uZXcgKEJVU19QT0xJQ1lfUlVMRV9VU0VSLCBhbGxvdyk7IAorICAgICAgICAgICAgICBpZiAocnVsZSA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGdvdG8gbm9tZW07CisKKyAgICAgICAgICAgICAgcnVsZS0+ZC51c2VyLnVpZCA9IHVpZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJVbmtub3duIHVzZXJuYW1lIFwiJXNcIiBvbiBlbGVtZW50IDwlcz4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLCBlbGVtZW50X25hbWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICBlbHNlIGlmIChncm91cCkKKyAgICB7CisgICAgICBpZiAoSVNfV0lMRENBUkQgKGdyb3VwKSkKKyAgICAgICAgeworICAgICAgICAgIHJ1bGUgPSBidXNfcG9saWN5X3J1bGVfbmV3IChCVVNfUE9MSUNZX1JVTEVfR1JPVVAsIGFsbG93KTsgCisgICAgICAgICAgaWYgKHJ1bGUgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gbm9tZW07CisKKyAgICAgICAgICBydWxlLT5kLmdyb3VwLmdpZCA9IERCVVNfR0lEX1VOU0VUOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBEQnVzU3RyaW5nIGdyb3VwbmFtZTsKKyAgICAgICAgICBkYnVzX2dpZF90IGdpZDsKKyAgICAgICAgICAKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJmdyb3VwbmFtZSwgZ3JvdXApOworICAgICAgICAgIAorICAgICAgICAgIGlmIChfZGJ1c19wYXJzZV91bml4X2dyb3VwX2Zyb21fY29uZmlnICgmZ3JvdXBuYW1lLCAmZ2lkKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcnVsZSA9IGJ1c19wb2xpY3lfcnVsZV9uZXcgKEJVU19QT0xJQ1lfUlVMRV9HUk9VUCwgYWxsb3cpOyAKKyAgICAgICAgICAgICAgaWYgKHJ1bGUgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBnb3RvIG5vbWVtOworCisgICAgICAgICAgICAgIHJ1bGUtPmQuZ3JvdXAuZ2lkID0gZ2lkOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfd2FybiAoIlVua25vd24gZ3JvdXAgXCIlc1wiIG9uIGVsZW1lbnQgPCVzPiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwLCBlbGVtZW50X25hbWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICBlbHNlCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiRGlkIG5vdCBoYW5kbGUgc29tZSBjb21iaW5hdGlvbiBvZiBhdHRyaWJ1dGVzIG9uIDxhbGxvdz4gb3IgPGRlbnk+Iik7CisKKyAgaWYgKHJ1bGUgIT0gTlVMTCkKKyAgICB7CisgICAgICBFbGVtZW50ICpwZTsKKyAgICAgIAorICAgICAgcGUgPSBwZWVrX2VsZW1lbnQgKHBhcnNlcik7ICAgICAgCisgICAgICBfZGJ1c19hc3NlcnQgKHBlICE9IE5VTEwpOworICAgICAgX2RidXNfYXNzZXJ0IChwZS0+dHlwZSA9PSBFTEVNRU5UX1BPTElDWSk7CisKKyAgICAgIHN3aXRjaCAocGUtPmQucG9saWN5LnR5cGUpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBQT0xJQ1lfSUdOT1JFRDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAvKiBkcm9wIHRoZSBydWxlIG9uIHRoZSBmbG9vciAqLworICAgICAgICAgIGJyZWFrOworICAgICAgICAgIAorICAgICAgICBjYXNlIFBPTElDWV9ERUZBVUxUOgorICAgICAgICAgIGlmICghYnVzX3BvbGljeV9hcHBlbmRfZGVmYXVsdF9ydWxlIChwYXJzZXItPnBvbGljeSwgcnVsZSkpCisgICAgICAgICAgICBnb3RvIG5vbWVtOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFBPTElDWV9NQU5EQVRPUlk6CisgICAgICAgICAgaWYgKCFidXNfcG9saWN5X2FwcGVuZF9tYW5kYXRvcnlfcnVsZSAocGFyc2VyLT5wb2xpY3ksIHJ1bGUpKQorICAgICAgICAgICAgZ290byBub21lbTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQT0xJQ1lfVVNFUjoKKyAgICAgICAgICBpZiAoIUJVU19QT0xJQ1lfUlVMRV9JU19QRVJfQ0xJRU5UIChydWxlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8JXM+IHJ1bGUgY2Fubm90IGJlIHBlci11c2VyIGJlY2F1c2UgaXQgaGFzIGJ1cy1nbG9iYWwgc2VtYW50aWNzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRfbmFtZSk7CisgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgfQorICAgICAgICAgIAorICAgICAgICAgIGlmICghYnVzX3BvbGljeV9hcHBlbmRfdXNlcl9ydWxlIChwYXJzZXItPnBvbGljeSwgcGUtPmQucG9saWN5LmdpZF91aWRfb3JfYXRfY29uc29sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZSkpCisgICAgICAgICAgICBnb3RvIG5vbWVtOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFBPTElDWV9HUk9VUDoKKyAgICAgICAgICBpZiAoIUJVU19QT0xJQ1lfUlVMRV9JU19QRVJfQ0xJRU5UIChydWxlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8JXM+IHJ1bGUgY2Fubm90IGJlIHBlci1ncm91cCBiZWNhdXNlIGl0IGhhcyBidXMtZ2xvYmFsIHNlbWFudGljcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50X25hbWUpOworICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgICAgICBpZiAoIWJ1c19wb2xpY3lfYXBwZW5kX2dyb3VwX3J1bGUgKHBhcnNlci0+cG9saWN5LCBwZS0+ZC5wb2xpY3kuZ2lkX3VpZF9vcl9hdF9jb25zb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZSkpCisgICAgICAgICAgICBnb3RvIG5vbWVtOworICAgICAgICAgIGJyZWFrOworICAgICAgICAKKworICAgICAgICBjYXNlIFBPTElDWV9DT05TT0xFOgorICAgICAgICAgIGlmICghYnVzX3BvbGljeV9hcHBlbmRfY29uc29sZV9ydWxlIChwYXJzZXItPnBvbGljeSwgcGUtPmQucG9saWN5LmdpZF91aWRfb3JfYXRfY29uc29sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZSkpCisgICAgICAgICAgICBnb3RvIG5vbWVtOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgCisgICAgICBidXNfcG9saWN5X3J1bGVfdW5yZWYgKHJ1bGUpOworICAgICAgcnVsZSA9IE5VTEw7CisgICAgfQorICAKKyAgcmV0dXJuIFRSVUU7CisKKyBub21lbToKKyAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyBmYWlsZWQ6CisgIGlmIChydWxlKQorICAgIGJ1c19wb2xpY3lfcnVsZV91bnJlZiAocnVsZSk7CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitzdGFydF9wb2xpY3lfY2hpbGQgKEJ1c0NvbmZpZ1BhcnNlciAgICpwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICplbGVtZW50X25hbWUsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKiphdHRyaWJ1dGVfbmFtZXMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKiphdHRyaWJ1dGVfdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAqZXJyb3IpCit7CisgIGlmIChzdHJjbXAgKGVsZW1lbnRfbmFtZSwgImFsbG93IikgPT0gMCkKKyAgICB7CisgICAgICBpZiAoIWFwcGVuZF9ydWxlX2Zyb21fZWxlbWVudCAocGFyc2VyLCBlbGVtZW50X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlX25hbWVzLCBhdHRyaWJ1dGVfdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUsIGVycm9yKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgCisgICAgICBpZiAocHVzaF9lbGVtZW50IChwYXJzZXIsIEVMRU1FTlRfQUxMT1cpID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIGVsc2UgaWYgKHN0cmNtcCAoZWxlbWVudF9uYW1lLCAiZGVueSIpID09IDApCisgICAgeworICAgICAgaWYgKCFhcHBlbmRfcnVsZV9mcm9tX2VsZW1lbnQgKHBhcnNlciwgZWxlbWVudF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZV9uYW1lcywgYXR0cmlidXRlX3ZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSwgZXJyb3IpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAKKyAgICAgIGlmIChwdXNoX2VsZW1lbnQgKHBhcnNlciwgRUxFTUVOVF9ERU5ZKSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiRWxlbWVudCA8JXM+IG5vdCBhbGxvd2VkIGluc2lkZSA8JXM+IGluIGNvbmZpZ3VyYXRpb24gZmlsZSIsCisgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudF9uYW1lLCAicG9saWN5Iik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3N0YXJ0X3NlbGludXhfY2hpbGQgKEJ1c0NvbmZpZ1BhcnNlciAgICpwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAqZWxlbWVudF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqKmF0dHJpYnV0ZV9uYW1lcywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKiphdHRyaWJ1dGVfdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgKmVycm9yKQoreworICBjaGFyICpvd25fY29weTsKKyAgY2hhciAqY29udGV4dF9jb3B5OworCisgIG93bl9jb3B5ID0gTlVMTDsKKyAgY29udGV4dF9jb3B5ID0gTlVMTDsKKworICBpZiAoc3RyY21wIChlbGVtZW50X25hbWUsICJhc3NvY2lhdGUiKSA9PSAwKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKm93bjsKKyAgICAgIGNvbnN0IGNoYXIgKmNvbnRleHQ7CisgICAgICAKKyAgICAgIGlmICghbG9jYXRlX2F0dHJpYnV0ZXMgKHBhcnNlciwgImFzc29jaWF0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVfbmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVfdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3duIiwgJm93biwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb250ZXh0IiwgJmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgCisgICAgICBpZiAocHVzaF9lbGVtZW50IChwYXJzZXIsIEVMRU1FTlRfQVNTT0NJQVRFKSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgaWYgKG93biA9PSBOVUxMIHx8IGNvbnRleHQgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJFbGVtZW50IDxhc3NvY2lhdGU+IG11c3QgaGF2ZSBhdHRyaWJ1dGVzIG93bj1cIjxzZXJ2aWNlbmFtZT5cIiBhbmQgY29udGV4dD1cIjxzZWxpbnV4IGNvbnRleHQ+XCIiKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgb3duX2NvcHkgPSBfZGJ1c19zdHJkdXAgKG93bik7CisgICAgICBpZiAob3duX2NvcHkgPT0gTlVMTCkKKyAgICAgICAgZ290byBvb207CisgICAgICBjb250ZXh0X2NvcHkgPSBfZGJ1c19zdHJkdXAgKGNvbnRleHQpOworICAgICAgaWYgKGNvbnRleHRfY29weSA9PSBOVUxMKQorICAgICAgICBnb3RvIG9vbTsKKworICAgICAgaWYgKCFfZGJ1c19oYXNoX3RhYmxlX2luc2VydF9zdHJpbmcgKHBhcnNlci0+c2VydmljZV9jb250ZXh0X3RhYmxlLAorCQkJCQkgICBvd25fY29weSwgY29udGV4dF9jb3B5KSkKKyAgICAgICAgZ290byBvb207CisKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgIkVsZW1lbnQgPCVzPiBub3QgYWxsb3dlZCBpbnNpZGUgPCVzPiBpbiBjb25maWd1cmF0aW9uIGZpbGUiLAorICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRfbmFtZSwgInNlbGludXgiKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyBvb206CisgIGlmIChvd25fY29weSkKKyAgICBkYnVzX2ZyZWUgKG93bl9jb3B5KTsKKworICBpZiAoY29udGV4dF9jb3B5KSAgCisgICAgZGJ1c19mcmVlIChjb250ZXh0X2NvcHkpOworCisgIEJVU19TRVRfT09NIChlcnJvcik7CisgIHJldHVybiBGQUxTRTsKK30KKworZGJ1c19ib29sX3QKK2J1c19jb25maWdfcGFyc2VyX3N0YXJ0X2VsZW1lbnQgKEJ1c0NvbmZpZ1BhcnNlciAgICpwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAqZWxlbWVudF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqKmF0dHJpYnV0ZV9uYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKiphdHRyaWJ1dGVfdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgKmVycm9yKQoreworICBFbGVtZW50VHlwZSB0OworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIC8qIHByaW50ZiAoIlNUQVJUOiAlc1xuIiwgZWxlbWVudF9uYW1lKTsgKi8KKyAgCisgIHQgPSB0b3BfZWxlbWVudF90eXBlIChwYXJzZXIpOworCisgIGlmICh0ID09IEVMRU1FTlRfTk9ORSkKKyAgICB7CisgICAgICBpZiAoc3RyY21wIChlbGVtZW50X25hbWUsICJidXNjb25maWciKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCFjaGVja19ub19hdHRyaWJ1dGVzIChwYXJzZXIsICJidXNjb25maWciLCBhdHRyaWJ1dGVfbmFtZXMsIGF0dHJpYnV0ZV92YWx1ZXMsIGVycm9yKSkKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAKKyAgICAgICAgICBpZiAocHVzaF9lbGVtZW50IChwYXJzZXIsIEVMRU1FTlRfQlVTQ09ORklHKSA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlVua25vd24gZWxlbWVudCA8JXM+IGF0IHJvb3Qgb2YgY29uZmlndXJhdGlvbiBmaWxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudF9uYW1lKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UgaWYgKHQgPT0gRUxFTUVOVF9CVVNDT05GSUcpCisgICAgeworICAgICAgcmV0dXJuIHN0YXJ0X2J1c2NvbmZpZ19jaGlsZCAocGFyc2VyLCBlbGVtZW50X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVfbmFtZXMsIGF0dHJpYnV0ZV92YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7CisgICAgfQorICBlbHNlIGlmICh0ID09IEVMRU1FTlRfUE9MSUNZKQorICAgIHsKKyAgICAgIHJldHVybiBzdGFydF9wb2xpY3lfY2hpbGQgKHBhcnNlciwgZWxlbWVudF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlX25hbWVzLCBhdHRyaWJ1dGVfdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworICAgIH0KKyAgZWxzZSBpZiAodCA9PSBFTEVNRU5UX1NFTElOVVgpCisgICAgeworICAgICAgcmV0dXJuIHN0YXJ0X3NlbGludXhfY2hpbGQgKHBhcnNlciwgZWxlbWVudF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZV9uYW1lcywgYXR0cmlidXRlX3ZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiRWxlbWVudCA8JXM+IGlzIG5vdCBhbGxvd2VkIGluIHRoaXMgY29udGV4dCIsCisgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudF9uYW1lKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9ICAKK30KKworc3RhdGljIGRidXNfYm9vbF90CitzZXRfbGltaXQgKEJ1c0NvbmZpZ1BhcnNlciAqcGFyc2VyLAorICAgICAgICAgICBjb25zdCBjaGFyICAgICAgKm5hbWUsCisgICAgICAgICAgIGxvbmcgICAgICAgICAgICAgdmFsdWUsCisgICAgICAgICAgIERCdXNFcnJvciAgICAgICAqZXJyb3IpCit7CisgIGRidXNfYm9vbF90IG11c3RfYmVfcG9zaXRpdmU7CisgIGRidXNfYm9vbF90IG11c3RfYmVfaW50OworCisgIG11c3RfYmVfaW50ID0gRkFMU0U7CisgIG11c3RfYmVfcG9zaXRpdmUgPSBGQUxTRTsKKyAgCisgIGlmIChzdHJjbXAgKG5hbWUsICJtYXhfaW5jb21pbmdfYnl0ZXMiKSA9PSAwKQorICAgIHsKKyAgICAgIG11c3RfYmVfcG9zaXRpdmUgPSBUUlVFOworICAgICAgcGFyc2VyLT5saW1pdHMubWF4X2luY29taW5nX2J5dGVzID0gdmFsdWU7CisgICAgfQorICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJtYXhfaW5jb21pbmdfdW5peF9mZHMiKSA9PSAwKQorICAgIHsKKyAgICAgIG11c3RfYmVfcG9zaXRpdmUgPSBUUlVFOworICAgICAgcGFyc2VyLT5saW1pdHMubWF4X2luY29taW5nX3VuaXhfZmRzID0gdmFsdWU7CisgICAgfQorICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJtYXhfb3V0Z29pbmdfYnl0ZXMiKSA9PSAwKQorICAgIHsKKyAgICAgIG11c3RfYmVfcG9zaXRpdmUgPSBUUlVFOworICAgICAgcGFyc2VyLT5saW1pdHMubWF4X291dGdvaW5nX2J5dGVzID0gdmFsdWU7CisgICAgfQorICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJtYXhfb3V0Z29pbmdfdW5peF9mZHMiKSA9PSAwKQorICAgIHsKKyAgICAgIG11c3RfYmVfcG9zaXRpdmUgPSBUUlVFOworICAgICAgcGFyc2VyLT5saW1pdHMubWF4X291dGdvaW5nX3VuaXhfZmRzID0gdmFsdWU7CisgICAgfQorICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJtYXhfbWVzc2FnZV9zaXplIikgPT0gMCkKKyAgICB7CisgICAgICBtdXN0X2JlX3Bvc2l0aXZlID0gVFJVRTsKKyAgICAgIHBhcnNlci0+bGltaXRzLm1heF9tZXNzYWdlX3NpemUgPSB2YWx1ZTsKKyAgICB9CisgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIm1heF9tZXNzYWdlX3VuaXhfZmRzIikgPT0gMCkKKyAgICB7CisgICAgICBtdXN0X2JlX3Bvc2l0aXZlID0gVFJVRTsKKyAgICAgIHBhcnNlci0+bGltaXRzLm1heF9tZXNzYWdlX3VuaXhfZmRzID0gdmFsdWU7CisgICAgfQorICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJzZXJ2aWNlX3N0YXJ0X3RpbWVvdXQiKSA9PSAwKQorICAgIHsKKyAgICAgIG11c3RfYmVfcG9zaXRpdmUgPSBUUlVFOworICAgICAgbXVzdF9iZV9pbnQgPSBUUlVFOworICAgICAgcGFyc2VyLT5saW1pdHMuYWN0aXZhdGlvbl90aW1lb3V0ID0gdmFsdWU7CisgICAgfQorICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJhdXRoX3RpbWVvdXQiKSA9PSAwKQorICAgIHsKKyAgICAgIG11c3RfYmVfcG9zaXRpdmUgPSBUUlVFOworICAgICAgbXVzdF9iZV9pbnQgPSBUUlVFOworICAgICAgcGFyc2VyLT5saW1pdHMuYXV0aF90aW1lb3V0ID0gdmFsdWU7CisgICAgfQorICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJwZW5kaW5nX2ZkX3RpbWVvdXQiKSA9PSAwKQorICAgIHsKKyAgICAgIG11c3RfYmVfcG9zaXRpdmUgPSBUUlVFOworICAgICAgbXVzdF9iZV9pbnQgPSBUUlVFOworICAgICAgcGFyc2VyLT5saW1pdHMucGVuZGluZ19mZF90aW1lb3V0ID0gdmFsdWU7CisgICAgfQorICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJyZXBseV90aW1lb3V0IikgPT0gMCkKKyAgICB7CisgICAgICBtdXN0X2JlX3Bvc2l0aXZlID0gVFJVRTsKKyAgICAgIG11c3RfYmVfaW50ID0gVFJVRTsKKyAgICAgIHBhcnNlci0+bGltaXRzLnJlcGx5X3RpbWVvdXQgPSB2YWx1ZTsKKyAgICB9CisgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIm1heF9jb21wbGV0ZWRfY29ubmVjdGlvbnMiKSA9PSAwKQorICAgIHsKKyAgICAgIG11c3RfYmVfcG9zaXRpdmUgPSBUUlVFOworICAgICAgbXVzdF9iZV9pbnQgPSBUUlVFOworICAgICAgcGFyc2VyLT5saW1pdHMubWF4X2NvbXBsZXRlZF9jb25uZWN0aW9ucyA9IHZhbHVlOworICAgIH0KKyAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAibWF4X2luY29tcGxldGVfY29ubmVjdGlvbnMiKSA9PSAwKQorICAgIHsKKyAgICAgIG11c3RfYmVfcG9zaXRpdmUgPSBUUlVFOworICAgICAgbXVzdF9iZV9pbnQgPSBUUlVFOworICAgICAgcGFyc2VyLT5saW1pdHMubWF4X2luY29tcGxldGVfY29ubmVjdGlvbnMgPSB2YWx1ZTsKKyAgICB9CisgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIm1heF9jb25uZWN0aW9uc19wZXJfdXNlciIpID09IDApCisgICAgeworICAgICAgbXVzdF9iZV9wb3NpdGl2ZSA9IFRSVUU7CisgICAgICBtdXN0X2JlX2ludCA9IFRSVUU7CisgICAgICBwYXJzZXItPmxpbWl0cy5tYXhfY29ubmVjdGlvbnNfcGVyX3VzZXIgPSB2YWx1ZTsKKyAgICB9CisgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIm1heF9wZW5kaW5nX3NlcnZpY2Vfc3RhcnRzIikgPT0gMCkKKyAgICB7CisgICAgICBtdXN0X2JlX3Bvc2l0aXZlID0gVFJVRTsKKyAgICAgIG11c3RfYmVfaW50ID0gVFJVRTsKKyAgICAgIHBhcnNlci0+bGltaXRzLm1heF9wZW5kaW5nX2FjdGl2YXRpb25zID0gdmFsdWU7CisgICAgfQorICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJtYXhfbmFtZXNfcGVyX2Nvbm5lY3Rpb24iKSA9PSAwKQorICAgIHsKKyAgICAgIG11c3RfYmVfcG9zaXRpdmUgPSBUUlVFOworICAgICAgbXVzdF9iZV9pbnQgPSBUUlVFOworICAgICAgcGFyc2VyLT5saW1pdHMubWF4X3NlcnZpY2VzX3Blcl9jb25uZWN0aW9uID0gdmFsdWU7CisgICAgfQorICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJtYXhfbWF0Y2hfcnVsZXNfcGVyX2Nvbm5lY3Rpb24iKSA9PSAwKQorICAgIHsKKyAgICAgIG11c3RfYmVfcG9zaXRpdmUgPSBUUlVFOworICAgICAgbXVzdF9iZV9pbnQgPSBUUlVFOworICAgICAgcGFyc2VyLT5saW1pdHMubWF4X21hdGNoX3J1bGVzX3Blcl9jb25uZWN0aW9uID0gdmFsdWU7CisgICAgfQorICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJtYXhfcmVwbGllc19wZXJfY29ubmVjdGlvbiIpID09IDApCisgICAgeworICAgICAgbXVzdF9iZV9wb3NpdGl2ZSA9IFRSVUU7CisgICAgICBtdXN0X2JlX2ludCA9IFRSVUU7CisgICAgICBwYXJzZXItPmxpbWl0cy5tYXhfcmVwbGllc19wZXJfY29ubmVjdGlvbiA9IHZhbHVlOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgIlRoZXJlIGlzIG5vIGxpbWl0IGNhbGxlZCBcIiVzXCJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAKKyAgaWYgKG11c3RfYmVfcG9zaXRpdmUgJiYgdmFsdWUgPCAwKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgIjxsaW1pdCBuYW1lPVwiJXNcIj4gbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlclxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKG11c3RfYmVfaW50ICYmCisgICAgICAodmFsdWUgPCBfREJVU19JTlRfTUlOIHx8IHZhbHVlID4gX0RCVVNfSU5UX01BWCkpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiPGxpbWl0IG5hbWU9XCIlc1wiPiB2YWx1ZSBpcyB0b28gbGFyZ2VcbiIsCisgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHJldHVybiBUUlVFOyAgCit9CisKK2RidXNfYm9vbF90CitidXNfY29uZmlnX3BhcnNlcl9lbmRfZWxlbWVudCAoQnVzQ29uZmlnUGFyc2VyICAgKnBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAqZWxlbWVudF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICplcnJvcikKK3sKKyAgRWxlbWVudFR5cGUgdDsKKyAgY29uc3QgY2hhciAqbjsKKyAgRWxlbWVudCAqZTsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICAvKiBwcmludGYgKCJFTkQ6ICVzXG4iLCBlbGVtZW50X25hbWUpOyAqLworICAKKyAgdCA9IHRvcF9lbGVtZW50X3R5cGUgKHBhcnNlcik7CisKKyAgaWYgKHQgPT0gRUxFTUVOVF9OT05FKQorICAgIHsKKyAgICAgIC8qIHNob3VsZCBwcm9iYWJseSBiZSBhbiBhc3NlcnRpb24gZmFpbHVyZSBidXQKKyAgICAgICAqIGJlaW5nIHBhcmFub2lkIGFib3V0IFhNTCBwYXJzZXJzCisgICAgICAgKi8KKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgIlhNTCBwYXJzZXIgZW5kZWQgZWxlbWVudCB3aXRoIG5vIGVsZW1lbnQgb24gdGhlIHN0YWNrIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIG4gPSBidXNfY29uZmlnX3BhcnNlcl9lbGVtZW50X3R5cGVfdG9fbmFtZSAodCk7CisgIF9kYnVzX2Fzc2VydCAobiAhPSBOVUxMKTsKKyAgaWYgKHN0cmNtcCAobiwgZWxlbWVudF9uYW1lKSAhPSAwKQorICAgIHsKKyAgICAgIC8qIHNob3VsZCBwcm9iYWJseSBiZSBhbiBhc3NlcnRpb24gZmFpbHVyZSBidXQKKyAgICAgICAqIGJlaW5nIHBhcmFub2lkIGFib3V0IFhNTCBwYXJzZXJzCisgICAgICAgKi8KKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgIlhNTCBlbGVtZW50IDwlcz4gZW5kZWQgYnV0IHRvcG1vc3QgZWxlbWVudCBvbiB0aGUgc3RhY2sgd2FzIDwlcz4iLAorICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRfbmFtZSwgbik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGUgPSBwZWVrX2VsZW1lbnQgKHBhcnNlcik7CisgIF9kYnVzX2Fzc2VydCAoZSAhPSBOVUxMKTsKKworICBzd2l0Y2ggKGUtPnR5cGUpCisgICAgeworICAgIGNhc2UgRUxFTUVOVF9OT05FOgorICAgIGRlZmF1bHQ6CisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJlbGVtZW50IGluIHN0YWNrIGhhcyBubyB0eXBlIik7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRUxFTUVOVF9JTkNMVURFOgorICAgIGNhc2UgRUxFTUVOVF9VU0VSOgorICAgIGNhc2UgRUxFTUVOVF9DT05GSUdUWVBFOgorICAgIGNhc2UgRUxFTUVOVF9MSVNURU46CisgICAgY2FzZSBFTEVNRU5UX1BJREZJTEU6CisgICAgY2FzZSBFTEVNRU5UX0FVVEg6CisgICAgY2FzZSBFTEVNRU5UX1NFUlZJQ0VESVI6CisgICAgY2FzZSBFTEVNRU5UX1NFUlZJQ0VIRUxQRVI6CisgICAgY2FzZSBFTEVNRU5UX0lOQ0xVREVESVI6CisgICAgY2FzZSBFTEVNRU5UX0xJTUlUOgorICAgICAgaWYgKCFlLT5oYWRfY29udGVudCkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJYTUwgZWxlbWVudCA8JXM+IHdhcyBleHBlY3RlZCB0byBoYXZlIGNvbnRlbnQgaW5zaWRlIGl0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYnVzX2NvbmZpZ19wYXJzZXJfZWxlbWVudF90eXBlX3RvX25hbWUgKGUtPnR5cGUpKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgaWYgKGUtPnR5cGUgPT0gRUxFTUVOVF9MSU1JVCkKKyAgICAgICAgeworICAgICAgICAgIGlmICghc2V0X2xpbWl0IChwYXJzZXIsIGUtPmQubGltaXQubmFtZSwgZS0+ZC5saW1pdC52YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgRUxFTUVOVF9CVVNDT05GSUc6CisgICAgY2FzZSBFTEVNRU5UX1BPTElDWToKKyAgICBjYXNlIEVMRU1FTlRfQUxMT1c6CisgICAgY2FzZSBFTEVNRU5UX0RFTlk6CisgICAgY2FzZSBFTEVNRU5UX0ZPUks6CisgICAgY2FzZSBFTEVNRU5UX1NZU0xPRzoKKyAgICBjYXNlIEVMRU1FTlRfS0VFUF9VTUFTSzoKKyAgICBjYXNlIEVMRU1FTlRfU0VMSU5VWDoKKyAgICBjYXNlIEVMRU1FTlRfQVNTT0NJQVRFOgorICAgIGNhc2UgRUxFTUVOVF9TVEFOREFSRF9TRVNTSU9OX1NFUlZJQ0VESVJTOgorICAgIGNhc2UgRUxFTUVOVF9TVEFOREFSRF9TWVNURU1fU0VSVklDRURJUlM6CisgICAgY2FzZSBFTEVNRU5UX0FMTE9XX0FOT05ZTU9VUzoKKyAgICBjYXNlIEVMRU1FTlRfQVBQQVJNT1I6CisgICAgICBicmVhazsKKyAgICB9CisKKyAgcG9wX2VsZW1lbnQgKHBhcnNlcik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYWxsX3doaXRlc3BhY2UgKGNvbnN0IERCdXNTdHJpbmcgKnN0cikKK3sKKyAgaW50IGk7CisKKyAgX2RidXNfc3RyaW5nX3NraXBfd2hpdGUgKHN0ciwgMCwgJmkpOworCisgIHJldHVybiBpID09IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChzdHIpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK21ha2VfZnVsbF9wYXRoIChjb25zdCBEQnVzU3RyaW5nICpiYXNlZGlyLAorICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmZpbGVuYW1lLAorICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgKmZ1bGxfcGF0aCkKK3sKKyAgaWYgKF9kYnVzX3BhdGhfaXNfYWJzb2x1dGUgKGZpbGVuYW1lKSkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5IChmaWxlbmFtZSwgMCwgZnVsbF9wYXRoLCAwKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2NvcHkgKGJhc2VkaXIsIDAsIGZ1bGxfcGF0aCwgMCkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIAorICAgICAgaWYgKCFfZGJ1c19jb25jYXRfZGlyX2FuZF9maWxlIChmdWxsX3BhdGgsIGZpbGVuYW1lKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIV9kYnVzX3JlcGxhY2VfaW5zdGFsbF9wcmVmaXggKGZ1bGxfcGF0aCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2luY2x1ZGVfZmlsZSAoQnVzQ29uZmlnUGFyc2VyICAgKnBhcnNlciwKKyAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAgKmZpbGVuYW1lLAorICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICAgaWdub3JlX21pc3NpbmcsCisgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICplcnJvcikKK3sKKyAgLyogRklYTUUgZ29vZCB0ZXN0IGNhc2UgZm9yIHRoaXMgd291bGQgbG9hZCBlYWNoIGNvbmZpZyBmaWxlIGluIHRoZQorICAgKiB0ZXN0IHN1aXRlIGJvdGggYWxvbmUsIGFuZCBhcyBhbiBpbmNsdWRlLCBhbmQgY2hlY2sKKyAgICogdGhhdCB0aGUgcmVzdWx0IGlzIHRoZSBzYW1lCisgICAqLworICBCdXNDb25maWdQYXJzZXIgKmluY2x1ZGVkOworICBjb25zdCBjaGFyICpmaWxlbmFtZV9zdHI7CisgIERCdXNFcnJvciB0bXBfZXJyb3I7CisgICAgICAgIAorICBkYnVzX2Vycm9yX2luaXQgKCZ0bXBfZXJyb3IpOworCisgIGZpbGVuYW1lX3N0ciA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoZmlsZW5hbWUpOworCisgIC8qIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGlzIGZpbGUgaGFzbid0IGFscmVhZHkgYmVlbiBpbmNsdWRlZC4gKi8KKyAgaWYgKHNlZW5faW5jbHVkZSAocGFyc2VyLCBmaWxlbmFtZSkpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKwkJICAgICAgIkNpcmN1bGFyIGluY2x1c2lvbiBvZiBmaWxlICclcyciLAorCQkgICAgICBmaWxlbmFtZV9zdHIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgCisgIGlmICghIF9kYnVzX2xpc3RfYXBwZW5kICgmcGFyc2VyLT5pbmNsdWRlZF9maWxlcywgKHZvaWQgKikgZmlsZW5hbWVfc3RyKSkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAvKiBTaW5jZSBwYXJzZXIgaXMgcGFzc2VkIGluIGFzIHRoZSBwYXJlbnQsIGluY2x1ZGVkCisgICAgIGluaGVyaXRzIHBhcnNlcidzIGxpbWl0cy4gKi8KKyAgaW5jbHVkZWQgPSBidXNfY29uZmlnX2xvYWQgKGZpbGVuYW1lLCBGQUxTRSwgcGFyc2VyLCAmdG1wX2Vycm9yKTsKKworICBfZGJ1c19saXN0X3BvcF9sYXN0ICgmcGFyc2VyLT5pbmNsdWRlZF9maWxlcyk7CisKKyAgaWYgKGluY2x1ZGVkID09IE5VTEwpCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoJnRtcF9lcnJvcik7CisKKyAgICAgIGlmIChkYnVzX2Vycm9yX2hhc19uYW1lICgmdG1wX2Vycm9yLCBEQlVTX0VSUk9SX0ZJTEVfTk9UX0ZPVU5EKSAmJgorICAgICAgICAgIGlnbm9yZV9taXNzaW5nKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19lcnJvcl9mcmVlICgmdG1wX2Vycm9yKTsKKyAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19tb3ZlX2Vycm9yICgmdG1wX2Vycm9yLCBlcnJvcik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSICgmdG1wX2Vycm9yKTsKKworICAgICAgaWYgKCFtZXJnZV9pbmNsdWRlZCAocGFyc2VyLCBpbmNsdWRlZCwgZXJyb3IpKQorICAgICAgICB7CisgICAgICAgICAgYnVzX2NvbmZpZ19wYXJzZXJfdW5yZWYgKGluY2x1ZGVkKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgLyogQ29weSBpbmNsdWRlZCdzIGxpbWl0cyBiYWNrIHRvIHBhcnNlci4gKi8KKyAgICAgIHBhcnNlci0+bGltaXRzID0gaW5jbHVkZWQtPmxpbWl0czsKKworICAgICAgYnVzX2NvbmZpZ19wYXJzZXJfdW5yZWYgKGluY2x1ZGVkKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KK30KKworc3RhdGljIGRidXNfYm9vbF90CitzZXJ2aWNlaGVscGVyX3BhdGggKEJ1c0NvbmZpZ1BhcnNlciAgICpwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgKmVycm9yKQoreworICBjb25zdCBjaGFyICpmaWxlbmFtZV9zdHI7CisgIGNoYXIgKnNlcnZpY2VoZWxwZXI7CisKKyAgZmlsZW5hbWVfc3RyID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChmaWxlbmFtZSk7CisKKyAgLyogY29weSB0byBhdm9pZCBvdmVyd3JpdGluZyB3aXRoIE5VTEwgb24gT09NICovCisgIHNlcnZpY2VoZWxwZXIgPSBfZGJ1c19zdHJkdXAgKGZpbGVuYW1lX3N0cik7CisKKyAgLyogY2hlY2sgZm9yIE9PTSAqLworICBpZiAoc2VydmljZWhlbHBlciA9PSBOVUxMKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIC8qIHNhdmUgdGhlIGxhdGVzdCBzZXJ2aWNlaGVscGVyIG9ubHkgaWYgbm90IE9PTSAqLworICBkYnVzX2ZyZWUgKHBhcnNlci0+c2VydmljZWhlbHBlcik7CisgIHBhcnNlci0+c2VydmljZWhlbHBlciA9IHNlcnZpY2VoZWxwZXI7CisKKyAgLyogV2UgZG9uJ3QgY2hlY2sgd2hldGhlciB0aGUgaGVscGVyIGV4aXN0czsgaW5zdGVhZCB3ZQorICAgKiB3b3VsZCBqdXN0IGZhaWwgdG8gZXZlciBhY3RpdmF0ZSBhbnl0aGluZyBpZiBpdCBkb2Vzbid0LgorICAgKiBUaGlzIGFsbG93cyBhbiBhZG1pbiB0byBmaXggdGhlIHByb2JsZW0gaWYgaXQgZG9lc24ndCBleGlzdC4KKyAgICogSXQgYWxzbyBhbGxvd3MgdGhlIHBhcnNlciB0ZXN0IHN1aXRlIHRvIHN1Y2Nlc3NmdWxseSBwYXJzZQorICAgKiB0ZXN0IGNhc2VzIHdpdGhvdXQgaW5zdGFsbGluZyB0aGUgaGVscGVyLiA7LSkKKyAgICovCisgIAorICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitpbmNsdWRlX2RpciAoQnVzQ29uZmlnUGFyc2VyICAgKnBhcnNlciwKKyAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICAqZGlybmFtZSwKKyAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAqZXJyb3IpCit7CisgIERCdXNTdHJpbmcgZmlsZW5hbWU7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgREJ1c0Vycm9yIHRtcF9lcnJvcjsKKyAgREJ1c0Rpckl0ZXIgKmRpcjsKKyAgY2hhciAqczsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZmaWxlbmFtZSkpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgcmV0dmFsID0gRkFMU0U7CisgIAorICBkaXIgPSBfZGJ1c19kaXJlY3Rvcnlfb3BlbiAoZGlybmFtZSwgZXJyb3IpOworCisgIGlmIChkaXIgPT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoZGJ1c19lcnJvcl9oYXNfbmFtZSAoZXJyb3IsIERCVVNfRVJST1JfRklMRV9OT1RfRk9VTkQpKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19lcnJvcl9mcmVlIChlcnJvcik7CisgICAgICAgICAgZ290byBzdWNjZXNzOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICBkYnVzX2Vycm9yX2luaXQgKCZ0bXBfZXJyb3IpOworICB3aGlsZSAoX2RidXNfZGlyZWN0b3J5X2dldF9uZXh0X2ZpbGUgKGRpciwgJmZpbGVuYW1lLCAmdG1wX2Vycm9yKSkKKyAgICB7CisgICAgICBEQnVzU3RyaW5nIGZ1bGxfcGF0aDsKKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmZ1bGxfcGF0aCkpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICB9CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2NvcHkgKGRpcm5hbWUsIDAsICZmdWxsX3BhdGgsIDApKQorICAgICAgICB7CisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZ1bGxfcGF0aCk7CisgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgIH0gICAgICAKKworICAgICAgaWYgKCFfZGJ1c19jb25jYXRfZGlyX2FuZF9maWxlICgmZnVsbF9wYXRoLCAmZmlsZW5hbWUpKQorICAgICAgICB7CisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZ1bGxfcGF0aCk7CisgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgaWYgKF9kYnVzX3N0cmluZ19lbmRzX3dpdGhfY19zdHIgKCZmdWxsX3BhdGgsICIuY29uZiIpKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCFpbmNsdWRlX2ZpbGUgKHBhcnNlciwgJmZ1bGxfcGF0aCwgVFJVRSwgZXJyb3IpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoZGJ1c19lcnJvcl9pc19zZXQgKGVycm9yKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAvKiBXZSB1c2UgYm90aCBzeXNsb2cgYW5kIHN0ZGVyciBoZXJlLCBiZWNhdXNlIHRoaXMgaXMKKyAgICAgICAgICAgICAgICAgICAqIHRoZSBjb25maWd1cmF0aW9uIHBhcnNlciwgc28gd2UgZG9uJ3QgeWV0IGtub3cgd2hldGhlcgorICAgICAgICAgICAgICAgICAgICogdGhpcyBidXMgaXMgZ29pbmcgdG8gd2FudCB0byB3cml0ZSB0byBzeXNsb2chIEVyciBvbgorICAgICAgICAgICAgICAgICAgICogdGhlIHNpZGUgb2YgbWFraW5nIHN1cmUgdGhlIG1lc3NhZ2UgZ2V0cyB0byB0aGUgc3lzYWRtaW4KKyAgICAgICAgICAgICAgICAgICAqIHNvbWVob3cuICovCisgICAgICAgICAgICAgICAgICBfZGJ1c19pbml0X3N5c3RlbV9sb2cgKCJkYnVzLWRhZW1vbiIsCisgICAgICAgICAgICAgICAgICAgICAgREJVU19MT0dfRkxBR1NfU1RERVJSIHwgREJVU19MT0dfRkxBR1NfU1lTVEVNX0xPRyk7CisgICAgICAgICAgICAgICAgICBfZGJ1c19sb2cgKERCVVNfU1lTVEVNX0xPR19JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRW5jb3VudGVyZWQgZXJyb3IgJyVzJyB3aGlsZSBwYXJzaW5nICclcyciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvci0+bWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmZnVsbF9wYXRoKSk7CisgICAgICAgICAgICAgICAgICBkYnVzX2Vycm9yX2ZyZWUgKGVycm9yKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmdWxsX3BhdGgpOworICAgIH0KKworICBpZiAoZGJ1c19lcnJvcl9pc19zZXQgKCZ0bXBfZXJyb3IpKQorICAgIHsKKyAgICAgIGRidXNfbW92ZV9lcnJvciAoJnRtcF9lcnJvciwgZXJyb3IpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weV9kYXRhIChkaXJuYW1lLCAmcykpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICBpZiAoIV9kYnVzX2xpc3RfYXBwZW5kICgmcGFyc2VyLT5jb25mX2RpcnMsIHMpKQorICAgIHsKKyAgICAgIGRidXNfZnJlZSAocyk7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgc3VjY2VzczoKKyAgcmV0dmFsID0gVFJVRTsKKyAgCisgZmFpbGVkOgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZpbGVuYW1lKTsKKyAgCisgIGlmIChkaXIpCisgICAgX2RidXNfZGlyZWN0b3J5X2Nsb3NlIChkaXIpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKK2RidXNfYm9vbF90CitidXNfY29uZmlnX3BhcnNlcl9jb250ZW50IChCdXNDb25maWdQYXJzZXIgICAqcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAgKmNvbnRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAqZXJyb3IpCit7CisgIEVsZW1lbnQgKmU7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyNpZiAwCisgIHsKKyAgICBjb25zdCBjaGFyICpjX3N0cjsKKyAgICAKKyAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKGNvbnRlbnQsICZjX3N0cik7CisKKyAgICBwcmludGYgKCJDT05URU5UICVkIGJ5dGVzOiAlc1xuIiwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGNvbnRlbnQpLCBjX3N0cik7CisgIH0KKyNlbmRpZgorICAKKyAgZSA9IHBlZWtfZWxlbWVudCAocGFyc2VyKTsKKyAgaWYgKGUgPT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJUZXh0IGNvbnRlbnQgb3V0c2lkZSBvZiBhbnkgWE1MIGVsZW1lbnQgaW4gY29uZmlndXJhdGlvbiBmaWxlIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICBlbHNlIGlmIChlLT5oYWRfY29udGVudCkKKyAgICB7CisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJFbGVtZW50IGhhZCBtdWx0aXBsZSBjb250ZW50IGJsb2NrcyIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBzd2l0Y2ggKHRvcF9lbGVtZW50X3R5cGUgKHBhcnNlcikpCisgICAgeworICAgIGNhc2UgRUxFTUVOVF9OT05FOgorICAgIGRlZmF1bHQ6CisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJlbGVtZW50IGF0IHRvcCBvZiBzdGFjayBoYXMgbm8gdHlwZSIpOworICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgY2FzZSBFTEVNRU5UX0JVU0NPTkZJRzoKKyAgICBjYXNlIEVMRU1FTlRfUE9MSUNZOgorICAgIGNhc2UgRUxFTUVOVF9BTExPVzoKKyAgICBjYXNlIEVMRU1FTlRfREVOWToKKyAgICBjYXNlIEVMRU1FTlRfRk9SSzoKKyAgICBjYXNlIEVMRU1FTlRfU1lTTE9HOgorICAgIGNhc2UgRUxFTUVOVF9LRUVQX1VNQVNLOgorICAgIGNhc2UgRUxFTUVOVF9TVEFOREFSRF9TRVNTSU9OX1NFUlZJQ0VESVJTOiAgICAKKyAgICBjYXNlIEVMRU1FTlRfU1RBTkRBUkRfU1lTVEVNX1NFUlZJQ0VESVJTOiAgICAKKyAgICBjYXNlIEVMRU1FTlRfQUxMT1dfQU5PTllNT1VTOgorICAgIGNhc2UgRUxFTUVOVF9TRUxJTlVYOgorICAgIGNhc2UgRUxFTUVOVF9BU1NPQ0lBVEU6CisgICAgY2FzZSBFTEVNRU5UX0FQUEFSTU9SOgorICAgICAgaWYgKGFsbF93aGl0ZXNwYWNlIChjb250ZW50KSkKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAiTm8gdGV4dCBjb250ZW50IGV4cGVjdGVkIGluc2lkZSBYTUwgZWxlbWVudCAlcyBpbiBjb25maWd1cmF0aW9uIGZpbGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBidXNfY29uZmlnX3BhcnNlcl9lbGVtZW50X3R5cGVfdG9fbmFtZSAodG9wX2VsZW1lbnRfdHlwZSAocGFyc2VyKSkpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgY2FzZSBFTEVNRU5UX1BJREZJTEU6CisgICAgICB7CisgICAgICAgIGNoYXIgKnM7CisKKyAgICAgICAgZS0+aGFkX2NvbnRlbnQgPSBUUlVFOworICAgICAgICAKKyAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfY29weV9kYXRhIChjb250ZW50LCAmcykpCisgICAgICAgICAgZ290byBub21lbTsKKyAgICAgICAgICAKKyAgICAgICAgZGJ1c19mcmVlIChwYXJzZXItPnBpZGZpbGUpOworICAgICAgICBwYXJzZXItPnBpZGZpbGUgPSBzOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEVMRU1FTlRfSU5DTFVERToKKyAgICAgIHsKKyAgICAgICAgREJ1c1N0cmluZyBmdWxsX3BhdGgsIHNlbGludXhfcG9saWN5X3Jvb3Q7CisKKyAgICAgICAgZS0+aGFkX2NvbnRlbnQgPSBUUlVFOworCisJaWYgKGUtPmQuaW5jbHVkZS5pZl9zZWxpbnV4X2VuYWJsZWQKKwkgICAgJiYgIWJ1c19zZWxpbnV4X2VuYWJsZWQgKCkpCisJICBicmVhazsKKworICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZnVsbF9wYXRoKSkKKyAgICAgICAgICBnb3RvIG5vbWVtOworCisgICAgICAgIGlmIChlLT5kLmluY2x1ZGUuc2VsaW51eF9yb290X3JlbGF0aXZlKQorCSAgeworICAgICAgICAgICAgaWYgKCFidXNfc2VsaW51eF9nZXRfcG9saWN5X3Jvb3QgKCkpCisJICAgICAgeworCQlkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorCQkJCSJDb3VsZCBub3QgZGV0ZXJtaW5lIFNFTGludXggcG9saWN5IHJvb3QgZm9yIHJlbGF0aXZlIGluY2x1c2lvbiIpOworCQlfZGJ1c19zdHJpbmdfZnJlZSAoJmZ1bGxfcGF0aCk7CisJCXJldHVybiBGQUxTRTsKKwkgICAgICB9CisgICAgICAgICAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnNlbGludXhfcG9saWN5X3Jvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVzX3NlbGludXhfZ2V0X3BvbGljeV9yb290ICgpKTsKKyAgICAgICAgICAgIGlmICghbWFrZV9mdWxsX3BhdGggKCZzZWxpbnV4X3BvbGljeV9yb290LCBjb250ZW50LCAmZnVsbF9wYXRoKSkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmZnVsbF9wYXRoKTsKKyAgICAgICAgICAgICAgICBnb3RvIG5vbWVtOworICAgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICBlbHNlIGlmICghbWFrZV9mdWxsX3BhdGggKCZwYXJzZXItPmJhc2VkaXIsIGNvbnRlbnQsICZmdWxsX3BhdGgpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmZnVsbF9wYXRoKTsKKyAgICAgICAgICAgIGdvdG8gbm9tZW07CisgICAgICAgICAgfQorCisgICAgICAgIGlmICghaW5jbHVkZV9maWxlIChwYXJzZXIsICZmdWxsX3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlLT5kLmluY2x1ZGUuaWdub3JlX21pc3NpbmcsIGVycm9yKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZ1bGxfcGF0aCk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgfQorCisgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmZnVsbF9wYXRoKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBFTEVNRU5UX1NFUlZJQ0VIRUxQRVI6CisgICAgICB7CisgICAgICAgIERCdXNTdHJpbmcgZnVsbF9wYXRoOworICAgICAgICAKKyAgICAgICAgZS0+aGFkX2NvbnRlbnQgPSBUUlVFOworCisgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZmdWxsX3BhdGgpKQorICAgICAgICAgIGdvdG8gbm9tZW07CisgICAgICAgIAorICAgICAgICBpZiAoIW1ha2VfZnVsbF9wYXRoICgmcGFyc2VyLT5iYXNlZGlyLCBjb250ZW50LCAmZnVsbF9wYXRoKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZ1bGxfcGF0aCk7CisgICAgICAgICAgICBnb3RvIG5vbWVtOworICAgICAgICAgIH0KKworICAgICAgICBpZiAoIXNlcnZpY2VoZWxwZXJfcGF0aCAocGFyc2VyLCAmZnVsbF9wYXRoLCBlcnJvcikpCisgICAgICAgICAgeworICAgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmdWxsX3BhdGgpOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgIH0KKworICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZ1bGxfcGF0aCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICAgIAorICAgIGNhc2UgRUxFTUVOVF9JTkNMVURFRElSOgorICAgICAgeworICAgICAgICBEQnVzU3RyaW5nIGZ1bGxfcGF0aDsKKyAgICAgICAgCisgICAgICAgIGUtPmhhZF9jb250ZW50ID0gVFJVRTsKKworICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZnVsbF9wYXRoKSkKKyAgICAgICAgICBnb3RvIG5vbWVtOworICAgICAgICAKKyAgICAgICAgaWYgKCFtYWtlX2Z1bGxfcGF0aCAoJnBhcnNlci0+YmFzZWRpciwgY29udGVudCwgJmZ1bGxfcGF0aCkpCisgICAgICAgICAgeworICAgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmdWxsX3BhdGgpOworICAgICAgICAgICAgZ290byBub21lbTsKKyAgICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoIWluY2x1ZGVfZGlyIChwYXJzZXIsICZmdWxsX3BhdGgsIGVycm9yKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZ1bGxfcGF0aCk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgfQorCisgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmZnVsbF9wYXRoKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgICAgCisgICAgY2FzZSBFTEVNRU5UX1VTRVI6CisgICAgICB7CisgICAgICAgIGNoYXIgKnM7CisKKyAgICAgICAgZS0+aGFkX2NvbnRlbnQgPSBUUlVFOworICAgICAgICAKKyAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfY29weV9kYXRhIChjb250ZW50LCAmcykpCisgICAgICAgICAgZ290byBub21lbTsKKyAgICAgICAgICAKKyAgICAgICAgZGJ1c19mcmVlIChwYXJzZXItPnVzZXIpOworICAgICAgICBwYXJzZXItPnVzZXIgPSBzOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEVMRU1FTlRfQ09ORklHVFlQRToKKyAgICAgIHsKKyAgICAgICAgY2hhciAqczsKKworICAgICAgICBlLT5oYWRfY29udGVudCA9IFRSVUU7CisKKyAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfY29weV9kYXRhIChjb250ZW50LCAmcykpCisgICAgICAgICAgZ290byBub21lbTsKKyAgICAgICAgCisgICAgICAgIGRidXNfZnJlZSAocGFyc2VyLT5idXNfdHlwZSk7CisgICAgICAgIHBhcnNlci0+YnVzX3R5cGUgPSBzOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgICAKKyAgICBjYXNlIEVMRU1FTlRfTElTVEVOOgorICAgICAgeworICAgICAgICBjaGFyICpzOworCisgICAgICAgIGUtPmhhZF9jb250ZW50ID0gVFJVRTsKKyAgICAgICAgCisgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2NvcHlfZGF0YSAoY29udGVudCwgJnMpKQorICAgICAgICAgIGdvdG8gbm9tZW07CisKKyAgICAgICAgaWYgKCFfZGJ1c19saXN0X2FwcGVuZCAoJnBhcnNlci0+bGlzdGVuX29uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBkYnVzX2ZyZWUgKHMpOworICAgICAgICAgICAgZ290byBub21lbTsKKyAgICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgRUxFTUVOVF9BVVRIOgorICAgICAgeworICAgICAgICBjaGFyICpzOworICAgICAgICAKKyAgICAgICAgZS0+aGFkX2NvbnRlbnQgPSBUUlVFOworCisgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2NvcHlfZGF0YSAoY29udGVudCwgJnMpKQorICAgICAgICAgIGdvdG8gbm9tZW07CisKKyAgICAgICAgaWYgKCFfZGJ1c19saXN0X2FwcGVuZCAoJnBhcnNlci0+bWVjaGFuaXNtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcykpCisgICAgICAgICAgeworICAgICAgICAgICAgZGJ1c19mcmVlIChzKTsKKyAgICAgICAgICAgIGdvdG8gbm9tZW07CisgICAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEVMRU1FTlRfU0VSVklDRURJUjoKKyAgICAgIHsKKyAgICAgICAgY2hhciAqczsKKyAgICAgICAgQnVzQ29uZmlnU2VydmljZURpciAqZGlyOworICAgICAgICBEQnVzU3RyaW5nIGZ1bGxfcGF0aDsKKyAgICAgICAgREJ1c0xpc3QgKmxpbms7CisKKyAgICAgICAgZS0+aGFkX2NvbnRlbnQgPSBUUlVFOworCisgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZmdWxsX3BhdGgpKQorICAgICAgICAgIGdvdG8gbm9tZW07CisgICAgICAgIAorICAgICAgICBpZiAoIW1ha2VfZnVsbF9wYXRoICgmcGFyc2VyLT5iYXNlZGlyLCBjb250ZW50LCAmZnVsbF9wYXRoKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZ1bGxfcGF0aCk7CisgICAgICAgICAgICBnb3RvIG5vbWVtOworICAgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2NvcHlfZGF0YSAoJmZ1bGxfcGF0aCwgJnMpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmZnVsbF9wYXRoKTsKKyAgICAgICAgICAgIGdvdG8gbm9tZW07CisgICAgICAgICAgfQorCisgICAgICAgIC8qIDxzZXJ2aWNlZGlyLz4gaGFzIHRyYWRpdGlvbmFsbHkgaW1wbGllZCB0aGF0IHdlIHdhdGNoIHRoZQorICAgICAgICAgKiBkaXJlY3Rvcnkgd2l0aCBpbm90aWZ5LCBhbmQgYWxsb3cgc2VydmljZSBmaWxlcyB3aG9zZSBuYW1lcyBkbyBub3QKKyAgICAgICAgICogbWF0Y2ggdGhlIGJ1cyBuYW1lICovCisgICAgICAgIGRpciA9IGJ1c19jb25maWdfc2VydmljZV9kaXJfbmV3X3Rha2UgKHMsIEJVU19TRVJWSUNFX0RJUl9GTEFHU19OT05FKTsKKworICAgICAgICBpZiAoZGlyID09IE5VTEwpCisgICAgICAgICAgeworICAgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmdWxsX3BhdGgpOworICAgICAgICAgICAgZGJ1c19mcmVlIChzKTsKKyAgICAgICAgICAgIGdvdG8gbm9tZW07CisgICAgICAgICAgfQorCisgICAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2FsbG9jX2xpbmsgKGRpcik7CisKKyAgICAgICAgaWYgKGxpbmsgPT0gTlVMTCkKKyAgICAgICAgICB7CisgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZ1bGxfcGF0aCk7CisgICAgICAgICAgICBidXNfY29uZmlnX3NlcnZpY2VfZGlyX2ZyZWUgKGRpcik7CisgICAgICAgICAgICBnb3RvIG5vbWVtOworICAgICAgICAgIH0KKworICAgICAgICAvKiBjYW5ub3QgZmFpbCAqLworICAgICAgICBzZXJ2aWNlX2RpcnNfYXBwZW5kX2xpbmtfdW5pcXVlX29yX2ZyZWUgKCZwYXJzZXItPnNlcnZpY2VfZGlycywgbGluayk7CisgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmZnVsbF9wYXRoKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBFTEVNRU5UX0xJTUlUOgorICAgICAgeworICAgICAgICBsb25nIHZhbDsKKworICAgICAgICBlLT5oYWRfY29udGVudCA9IFRSVUU7CisKKyAgICAgICAgdmFsID0gMDsKKyAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfcGFyc2VfaW50IChjb250ZW50LCAwLCAmdmFsLCBOVUxMKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8bGltaXQgbmFtZT1cIiVzXCI+IGVsZW1lbnQgaGFzIGludmFsaWQgdmFsdWUgKGNvdWxkIG5vdCBwYXJzZSBhcyBpbnRlZ2VyKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS0+ZC5saW1pdC5uYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICB9CisKKyAgICAgICAgZS0+ZC5saW1pdC52YWx1ZSA9IHZhbDsKKworICAgICAgICBfZGJ1c192ZXJib3NlICgiTG9hZGVkIHZhbHVlICVsZCBmb3IgbGltaXQgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGUtPmQubGltaXQudmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgIGUtPmQubGltaXQubmFtZSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisgIHJldHVybiBUUlVFOworCisgbm9tZW06CisgIEJVU19TRVRfT09NIChlcnJvcik7CisgIHJldHVybiBGQUxTRTsKK30KKworZGJ1c19ib29sX3QKK2J1c19jb25maWdfcGFyc2VyX2ZpbmlzaGVkIChCdXNDb25maWdQYXJzZXIgICAqcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICplcnJvcikKK3sKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgaWYgKHBhcnNlci0+c3RhY2sgIT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJFbGVtZW50IDwlcz4gd2FzIG5vdCBjbG9zZWQgaW4gY29uZmlndXJhdGlvbiBmaWxlIiwKKyAgICAgICAgICAgICAgICAgICAgICBidXNfY29uZmlnX3BhcnNlcl9lbGVtZW50X3R5cGVfdG9fbmFtZSAodG9wX2VsZW1lbnRfdHlwZSAocGFyc2VyKSkpOworCisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmIChwYXJzZXItPmlzX3RvcGxldmVsICYmIHBhcnNlci0+bGlzdGVuX29uID09IE5VTEwpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiQ29uZmlndXJhdGlvbiBmaWxlIG5lZWRzIG9uZSBvciBtb3JlIDxsaXN0ZW4+IGVsZW1lbnRzIGdpdmluZyBhZGRyZXNzZXMiKTsgCisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2NvbnN0IGNoYXIqCitidXNfY29uZmlnX3BhcnNlcl9nZXRfdXNlciAoQnVzQ29uZmlnUGFyc2VyICpwYXJzZXIpCit7CisgIHJldHVybiBwYXJzZXItPnVzZXI7Cit9CisKK2NvbnN0IGNoYXIqCitidXNfY29uZmlnX3BhcnNlcl9nZXRfdHlwZSAoQnVzQ29uZmlnUGFyc2VyICpwYXJzZXIpCit7CisgIHJldHVybiBwYXJzZXItPmJ1c190eXBlOworfQorCitEQnVzTGlzdCoqCitidXNfY29uZmlnX3BhcnNlcl9nZXRfYWRkcmVzc2VzIChCdXNDb25maWdQYXJzZXIgKnBhcnNlcikKK3sKKyAgcmV0dXJuICZwYXJzZXItPmxpc3Rlbl9vbjsKK30KKworREJ1c0xpc3QqKgorYnVzX2NvbmZpZ19wYXJzZXJfZ2V0X21lY2hhbmlzbXMgKEJ1c0NvbmZpZ1BhcnNlciAqcGFyc2VyKQoreworICByZXR1cm4gJnBhcnNlci0+bWVjaGFuaXNtczsKK30KKworREJ1c0xpc3QqKgorYnVzX2NvbmZpZ19wYXJzZXJfZ2V0X3NlcnZpY2VfZGlycyAoQnVzQ29uZmlnUGFyc2VyICpwYXJzZXIpCit7CisgIHJldHVybiAmcGFyc2VyLT5zZXJ2aWNlX2RpcnM7Cit9CisKK0RCdXNMaXN0KioKK2J1c19jb25maWdfcGFyc2VyX2dldF9jb25mX2RpcnMgKEJ1c0NvbmZpZ1BhcnNlciAqcGFyc2VyKQoreworICByZXR1cm4gJnBhcnNlci0+Y29uZl9kaXJzOworfQorCitkYnVzX2Jvb2xfdAorYnVzX2NvbmZpZ19wYXJzZXJfZ2V0X2ZvcmsgKEJ1c0NvbmZpZ1BhcnNlciAgICpwYXJzZXIpCit7CisgIHJldHVybiBwYXJzZXItPmZvcms7Cit9CisKK2RidXNfYm9vbF90CitidXNfY29uZmlnX3BhcnNlcl9nZXRfc3lzbG9nIChCdXNDb25maWdQYXJzZXIgICAqcGFyc2VyKQoreworICByZXR1cm4gcGFyc2VyLT5zeXNsb2c7Cit9CisKK2RidXNfYm9vbF90CitidXNfY29uZmlnX3BhcnNlcl9nZXRfa2VlcF91bWFzayAoQnVzQ29uZmlnUGFyc2VyICAgKnBhcnNlcikKK3sKKyAgcmV0dXJuIHBhcnNlci0+a2VlcF91bWFzazsKK30KKworZGJ1c19ib29sX3QKK2J1c19jb25maWdfcGFyc2VyX2dldF9hbGxvd19hbm9ueW1vdXMgKEJ1c0NvbmZpZ1BhcnNlciAgICpwYXJzZXIpCit7CisgIHJldHVybiBwYXJzZXItPmFsbG93X2Fub255bW91czsKK30KKworY29uc3QgY2hhciAqCitidXNfY29uZmlnX3BhcnNlcl9nZXRfcGlkZmlsZSAoQnVzQ29uZmlnUGFyc2VyICAgKnBhcnNlcikKK3sKKyAgcmV0dXJuIHBhcnNlci0+cGlkZmlsZTsKK30KKworY29uc3QgY2hhciAqCitidXNfY29uZmlnX3BhcnNlcl9nZXRfc2VydmljZWhlbHBlciAoQnVzQ29uZmlnUGFyc2VyICAgKnBhcnNlcikKK3sKKyAgcmV0dXJuIHBhcnNlci0+c2VydmljZWhlbHBlcjsKK30KKworQnVzUG9saWN5KgorYnVzX2NvbmZpZ19wYXJzZXJfc3RlYWxfcG9saWN5IChCdXNDb25maWdQYXJzZXIgKnBhcnNlcikKK3sKKyAgQnVzUG9saWN5ICpwb2xpY3k7CisKKyAgX2RidXNfYXNzZXJ0IChwYXJzZXItPnBvbGljeSAhPSBOVUxMKTsgLyogY2FuIG9ubHkgc3RlYWwgdGhlIHBvbGljeSAxIHRpbWUgKi8KKyAgCisgIHBvbGljeSA9IHBhcnNlci0+cG9saWN5OworCisgIHBhcnNlci0+cG9saWN5ID0gTlVMTDsKKworICByZXR1cm4gcG9saWN5OworfQorCisvKiBPdmVyd3JpdGUgYW55IGxpbWl0cyB0aGF0IHdlcmUgc2V0IGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgKi8KK3ZvaWQKK2J1c19jb25maWdfcGFyc2VyX2dldF9saW1pdHMgKEJ1c0NvbmZpZ1BhcnNlciAqcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzTGltaXRzICAgICAgICpsaW1pdHMpCit7CisgICpsaW1pdHMgPSBwYXJzZXItPmxpbWl0czsKK30KKworREJ1c0hhc2hUYWJsZSoKK2J1c19jb25maWdfcGFyc2VyX3N0ZWFsX3NlcnZpY2VfY29udGV4dF90YWJsZSAoQnVzQ29uZmlnUGFyc2VyICpwYXJzZXIpCit7CisgIERCdXNIYXNoVGFibGUgKnRhYmxlOworCisgIF9kYnVzX2Fzc2VydCAocGFyc2VyLT5zZXJ2aWNlX2NvbnRleHRfdGFibGUgIT0gTlVMTCk7IC8qIGNhbiBvbmx5IHN0ZWFsIG9uY2UgKi8KKworICB0YWJsZSA9IHBhcnNlci0+c2VydmljZV9jb250ZXh0X3RhYmxlOworCisgIHBhcnNlci0+c2VydmljZV9jb250ZXh0X3RhYmxlID0gTlVMTDsKKworICByZXR1cm4gdGFibGU7Cit9CisKKy8qCisgKiBSZXR1cm4gYSBsaXN0IG9mIHRoZSBkaXJlY3RvcmllcyB0aGF0IHNob3VsZCBiZSB3YXRjaGVkIHdpdGggaW5vdGlmeSwKKyAqIGFzIHN0cmluZ3MuIFRoZSBsaXN0IG1pZ2h0IGJlIGVtcHR5IGFuZCBpcyBpbiBhcmJpdHJhcnkgb3JkZXIuCisgKgorICogVGhlIGxpc3QgbXVzdCBiZSBlbXB0eSBvbiBlbnRyeS4gT24gc3VjY2VzcywgdGhlIGxpbmtzIGFyZSBvd25lZCBieSB0aGUKKyAqIGNhbGxlciBhbmQgbXVzdCBiZSBmcmVlZCwgYnV0IHRoZSBkYXRhIGluIGVhY2ggbGluayByZW1haW5zIG93bmVkIGJ5CisgKiB0aGUgQnVzQ29uZmlnUGFyc2VyIGFuZCBtdXN0IG5vdCBiZSBmcmVlZDogaW4gR09iamVjdC1JbnRyb3NwZWN0aW9uCisgKiBub3RhdGlvbiwgaXQgaXMgKHRyYW5zZmVyIGNvbnRhaW5lcikuCisgKi8KK2RidXNfYm9vbF90CitidXNfY29uZmlnX3BhcnNlcl9nZXRfd2F0Y2hlZF9kaXJzIChCdXNDb25maWdQYXJzZXIgKnBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNMaXN0ICoqd2F0Y2hlZF9kaXJzKQoreworICBEQnVzTGlzdCAqbGluazsKKworICBfZGJ1c19hc3NlcnQgKCp3YXRjaGVkX2RpcnMgPT0gTlVMTCk7CisKKyAgZm9yIChsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJnBhcnNlci0+Y29uZl9kaXJzKTsKKyAgICAgICBsaW5rICE9IE5VTEw7CisgICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJnBhcnNlci0+Y29uZl9kaXJzLCBsaW5rKSkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX2xpc3RfYXBwZW5kICh3YXRjaGVkX2RpcnMsIGxpbmstPmRhdGEpKQorICAgICAgICBnb3RvIG9vbTsKKyAgICB9CisKKyAgZm9yIChsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJnBhcnNlci0+c2VydmljZV9kaXJzKTsKKyAgICAgICBsaW5rICE9IE5VTEw7CisgICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJnBhcnNlci0+c2VydmljZV9kaXJzLCBsaW5rKSkKKyAgICB7CisgICAgICBCdXNDb25maWdTZXJ2aWNlRGlyICpkaXIgPSBsaW5rLT5kYXRhOworCisgICAgICBpZiAoZGlyLT5mbGFncyAmIEJVU19TRVJWSUNFX0RJUl9GTEFHU19OT19XQVRDSCkKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIGlmICghX2RidXNfbGlzdF9hcHBlbmQgKHdhdGNoZWRfZGlycywgZGlyLT5wYXRoKSkKKyAgICAgICAgZ290byBvb207CisgICAgfQorCisgIHJldHVybiBUUlVFOworCitvb206CisgIF9kYnVzX2xpc3RfY2xlYXIgKHdhdGNoZWRfZGlycyk7CisgIHJldHVybiBGQUxTRTsKK30KKworI2lmZGVmIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTCisjaW5jbHVkZSA8c3RkaW8uaD4KKwordHlwZWRlZiBlbnVtCit7CisgIFZBTElELAorICBJTlZBTElELAorICBVTktOT1dOCit9IFZhbGlkaXR5OworCitzdGF0aWMgZGJ1c19ib29sX3QKK2RvX2NoZWNrX293bl9ydWxlcyAoQnVzUG9saWN5ICAqcG9saWN5KQoreworICBjb25zdCBzdHJ1Y3QgeworICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgZGJ1c19ib29sX3QgYWxsb3dlZDsKKyAgfSBjaGVja3NbXSA9IHsKKyAgICB7Im9yZy5mcmVlZGVza3RvcCIsIEZBTFNFfSwKKyAgICB7Im9yZy5mcmVlZGVza3RvcC5NYW55U3lzdGVtIiwgRkFMU0V9LAorICAgIHsib3JnLmZyZWVkZXNrdG9wLk1hbnlTeXN0ZW1zIiwgVFJVRX0sCisgICAgeyJvcmcuZnJlZWRlc2t0b3AuTWFueVN5c3RlbXMuZm9vIiwgVFJVRX0sCisgICAgeyJvcmcuZnJlZWRlc2t0b3AuTWFueVN5c3RlbXMuZm9vLmJhciIsIFRSVUV9LAorICAgIHsib3JnLmZyZWVkZXNrdG9wLk1hbnlTeXN0ZW1zMiIsIEZBTFNFfSwKKyAgICB7Im9yZy5mcmVlZGVza3RvcC5NYW55U3lzdGVtczIuZm9vIiwgRkFMU0V9LAorICAgIHsib3JnLmZyZWVkZXNrdG9wLk1hbnlTeXN0ZW1zMi5mb28uYmFyIiwgRkFMU0V9LAorICAgIHtOVUxMLCBGQUxTRX0KKyAgfTsKKyAgaW50IGkgPSAwOworCisgIHdoaWxlIChjaGVja3NbaV0ubmFtZSkKKyAgICB7CisgICAgICBEQnVzU3RyaW5nIHNlcnZpY2VfbmFtZTsKKyAgICAgIGRidXNfYm9vbF90IHJldDsKKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnNlcnZpY2VfbmFtZSkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkbid0IGluaXQgc3RyaW5nIik7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZzZXJ2aWNlX25hbWUsIGNoZWNrc1tpXS5uYW1lKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGRuJ3QgYXBwZW5kIHN0cmluZyIpOworCisgICAgICByZXQgPSBidXNfcG9saWN5X2NoZWNrX2Nhbl9vd24gKHBvbGljeSwgJnNlcnZpY2VfbmFtZSk7CisgICAgICBwcmludGYgKCIgICAgICAgIENoZWNrIG5hbWUgJXM6ICVzXG4iLCBjaGVja3NbaV0ubmFtZSwKKyAgICAgICAgICAgICAgcmV0ID8gImFsbG93ZWQiIDogIm5vdCBhbGxvd2VkIik7CisgICAgICBpZiAoY2hlY2tzW2ldLmFsbG93ZWQgJiYgIXJldCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJDYW5ub3Qgb3duICVzIiwgY2hlY2tzW2ldLm5hbWUpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgaWYgKCFjaGVja3NbaV0uYWxsb3dlZCAmJiByZXQpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgiQ2FuIG93biAlcyIsIGNoZWNrc1tpXS5uYW1lKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmc2VydmljZV9uYW1lKTsKKworICAgICAgaSsrOworICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90Citkb19sb2FkIChjb25zdCBEQnVzU3RyaW5nICpmdWxsX3BhdGgsCisgICAgICAgICBWYWxpZGl0eSAgICAgICAgICB2YWxpZGl0eSwKKyAgICAgICAgIGRidXNfYm9vbF90ICAgICAgIG9vbV9wb3NzaWJsZSwKKyAgICAgICAgIGRidXNfYm9vbF90ICAgICAgIGNoZWNrX293bl9ydWxlcykKK3sKKyAgQnVzQ29uZmlnUGFyc2VyICpwYXJzZXI7CisgIERCdXNFcnJvciBlcnJvcjsKKworICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisKKyAgcGFyc2VyID0gYnVzX2NvbmZpZ19sb2FkIChmdWxsX3BhdGgsIFRSVUUsIE5VTEwsICZlcnJvcik7CisgIGlmIChwYXJzZXIgPT0gTlVMTCkKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUICgmZXJyb3IpOworCisgICAgICBpZiAob29tX3Bvc3NpYmxlICYmCisgICAgICAgICAgZGJ1c19lcnJvcl9oYXNfbmFtZSAoJmVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiRmFpbGVkIHRvIGxvYWQgdmFsaWQgZmlsZSBkdWUgdG8gT09NXG4iKTsKKyAgICAgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHZhbGlkaXR5ID09IFZBTElEKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoIkZhaWxlZCB0byBsb2FkIHZhbGlkIGZpbGUgYnV0IHN0aWxsIGhhZCBtZW1vcnk6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBlcnJvci5tZXNzYWdlKTsKKworICAgICAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoJmVycm9yKTsKKworICAgICAgaWYgKGNoZWNrX293bl9ydWxlcyAmJiBkb19jaGVja19vd25fcnVsZXMgKHBhcnNlci0+cG9saWN5KSA9PSBGQUxTRSkKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICBidXNfY29uZmlnX3BhcnNlcl91bnJlZiAocGFyc2VyKTsKKworICAgICAgaWYgKHZhbGlkaXR5ID09IElOVkFMSUQpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgiQWNjZXB0ZWQgaW52YWxpZCBmaWxlIik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KK30KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgY29uc3QgREJ1c1N0cmluZyAqZnVsbF9wYXRoOworICBWYWxpZGl0eSAgICAgICAgICB2YWxpZGl0eTsKKyAgZGJ1c19ib29sX3QgICAgICAgY2hlY2tfb3duX3J1bGVzOworfSBMb2FkZXJPb21EYXRhOworCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX2xvYWRlcl9vb21fZnVuYyAodm9pZCAqZGF0YSkKK3sKKyAgTG9hZGVyT29tRGF0YSAqZCA9IGRhdGE7CisKKyAgcmV0dXJuIGRvX2xvYWQgKGQtPmZ1bGxfcGF0aCwgZC0+dmFsaWRpdHksIFRSVUUsIGQtPmNoZWNrX293bl9ydWxlcyk7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorcHJvY2Vzc190ZXN0X3ZhbGlkX3N1YmRpciAoY29uc3QgREJ1c1N0cmluZyAqdGVzdF9iYXNlX2RpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKnN1YmRpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkaXR5ICAgICAgICAgIHZhbGlkaXR5KQoreworICBEQnVzU3RyaW5nIHRlc3RfZGlyZWN0b3J5OworICBEQnVzU3RyaW5nIGZpbGVuYW1lOworICBEQnVzRGlySXRlciAqZGlyOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIERCdXNFcnJvciBlcnJvcjsKKworICByZXR2YWwgPSBGQUxTRTsKKyAgZGlyID0gTlVMTDsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmdGVzdF9kaXJlY3RvcnkpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImRpZG4ndCBhbGxvY2F0ZSB0ZXN0X2RpcmVjdG9yeSIpOworCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmZmlsZW5hbWUsIHN1YmRpcik7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAodGVzdF9iYXNlX2RpciwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRlc3RfZGlyZWN0b3J5LCAwKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZG4ndCBjb3B5IHRlc3RfYmFzZV9kaXIgdG8gdGVzdF9kaXJlY3RvcnkiKTsKKworICBpZiAoIV9kYnVzX2NvbmNhdF9kaXJfYW5kX2ZpbGUgKCZ0ZXN0X2RpcmVjdG9yeSwgJmZpbGVuYW1lKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZG4ndCBhbGxvY2F0ZSBmdWxsIHBhdGgiKTsKKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZpbGVuYW1lKTsKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmZpbGVuYW1lKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJkaWRuJ3QgYWxsb2NhdGUgZmlsZW5hbWUgc3RyaW5nIik7CisKKyAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworICBkaXIgPSBfZGJ1c19kaXJlY3Rvcnlfb3BlbiAoJnRlc3RfZGlyZWN0b3J5LCAmZXJyb3IpOworICBpZiAoZGlyID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkNvdWxkIG5vdCBvcGVuICVzOiAlcyIsCisgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZ0ZXN0X2RpcmVjdG9yeSksCisgICAgICAgICAgICAgICAgICBlcnJvci5tZXNzYWdlKTsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICBpZiAodmFsaWRpdHkgPT0gVkFMSUQpCisgICAgcHJpbnRmICgiVGVzdGluZyB2YWxpZCBmaWxlczpcbiIpOworICBlbHNlIGlmICh2YWxpZGl0eSA9PSBJTlZBTElEKQorICAgIHByaW50ZiAoIlRlc3RpbmcgaW52YWxpZCBmaWxlczpcbiIpOworICBlbHNlCisgICAgcHJpbnRmICgiVGVzdGluZyB1bmtub3duIGZpbGVzOlxuIik7CisKKyBuZXh0OgorICB3aGlsZSAoX2RidXNfZGlyZWN0b3J5X2dldF9uZXh0X2ZpbGUgKGRpciwgJmZpbGVuYW1lLCAmZXJyb3IpKQorICAgIHsKKyAgICAgIERCdXNTdHJpbmcgZnVsbF9wYXRoOworICAgICAgTG9hZGVyT29tRGF0YSBkOworCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZnVsbF9wYXRoKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGRuJ3QgaW5pdCBzdHJpbmciKTsKKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAoJnRlc3RfZGlyZWN0b3J5LCAwLCAmZnVsbF9wYXRoLCAwKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGRuJ3QgY29weSBkaXIgdG8gZnVsbF9wYXRoIik7CisKKyAgICAgIGlmICghX2RidXNfY29uY2F0X2Rpcl9hbmRfZmlsZSAoJmZ1bGxfcGF0aCwgJmZpbGVuYW1lKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGRuJ3QgY29uY2F0IGZpbGUgdG8gZGlyIik7CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2VuZHNfd2l0aF9jX3N0ciAoJmZ1bGxfcGF0aCwgIi5jb25mIikpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiU2tpcHBpbmcgbm9uLS5jb25mIGZpbGUgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmZmlsZW5hbWUpKTsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZ1bGxfcGF0aCk7CisgICAgICAgICAgZ290byBuZXh0OworICAgICAgICB9CisKKyAgICAgIHByaW50ZiAoIiAgICAlc1xuIiwgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmZmlsZW5hbWUpKTsKKworICAgICAgX2RidXNfdmVyYm9zZSAoIiBleHBlY3RpbmcgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICB2YWxpZGl0eSA9PSBWQUxJRCA/ICJ2YWxpZCIgOgorICAgICAgICAgICAgICAgICAgICAgKHZhbGlkaXR5ID09IElOVkFMSUQgPyAiaW52YWxpZCIgOgorICAgICAgICAgICAgICAgICAgICAgICh2YWxpZGl0eSA9PSBVTktOT1dOID8gInVua25vd24iIDogIj8/PyIpKSk7CisKKyAgICAgIGQuZnVsbF9wYXRoID0gJmZ1bGxfcGF0aDsKKyAgICAgIGQudmFsaWRpdHkgPSB2YWxpZGl0eTsKKyAgICAgIGQuY2hlY2tfb3duX3J1bGVzID0gX2RidXNfc3RyaW5nX2VuZHNfd2l0aF9jX3N0ciAoJmZ1bGxfcGF0aCwKKyAgICAgICAgICAiY2hlY2stb3duLXJ1bGVzLmNvbmYiKTsKKworICAgICAgLyogRklYTUUgaGFja2Fyb3VuZCBmb3IgYW4gZXhwYXQgcHJvYmxlbSwgc2VlCisgICAgICAgKiBodHRwczovL2J1Z3ppbGxhLnJlZGhhdC5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTEyNDc0NworICAgICAgICogaHR0cDovL2ZyZWVkZXNrdG9wLm9yZy9waXBlcm1haWwvZGJ1cy8yMDA0LU1heS8wMDExNTMuaHRtbAorICAgICAgICovCisgICAgICAvKiBpZiAoIV9kYnVzX3Rlc3Rfb29tX2hhbmRsaW5nICgiY29uZmlnLWxvYWRlciIsIGNoZWNrX2xvYWRlcl9vb21fZnVuYywgJmQpKSAqLworICAgICAgaWYgKCFjaGVja19sb2FkZXJfb29tX2Z1bmMgKCZkKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgidGVzdCBmYWlsZWQiKTsKKyAgICAgIAorICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmdWxsX3BhdGgpOworICAgIH0KKworICBpZiAoZGJ1c19lcnJvcl9pc19zZXQgKCZlcnJvcikpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkNvdWxkIG5vdCBnZXQgbmV4dCBmaWxlIGluICVzOiAlcyIsCisgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZ0ZXN0X2RpcmVjdG9yeSksCisgICAgICAgICAgICAgICAgICBlcnJvci5tZXNzYWdlKTsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICByZXR2YWwgPSBUUlVFOworCisgZmFpbGVkOgorCisgIGlmIChkaXIpCisgICAgX2RidXNfZGlyZWN0b3J5X2Nsb3NlIChkaXIpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnRlc3RfZGlyZWN0b3J5KTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmaWxlbmFtZSk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGRidXNfYm9vbF90Citib29sc19lcXVhbCAoZGJ1c19ib29sX3QgYSwKKwkgICAgIGRidXNfYm9vbF90IGIpCit7CisgIHJldHVybiBhID8gYiA6ICFiOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3N0cmluZ3NfZXF1YWxfb3JfYm90aF9udWxsIChjb25zdCBjaGFyICphLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmIpCit7CisgIGlmIChhID09IE5VTEwgfHwgYiA9PSBOVUxMKQorICAgIHJldHVybiBhID09IGI7CisgIGVsc2UKKyAgICByZXR1cm4gIXN0cmNtcCAoYSwgYik7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZWxlbWVudHNfZXF1YWwgKGNvbnN0IEVsZW1lbnQgKmEsCisJCWNvbnN0IEVsZW1lbnQgKmIpCit7CisgIGlmIChhLT50eXBlICE9IGItPnR5cGUpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghYm9vbHNfZXF1YWwgKGEtPmhhZF9jb250ZW50LCBiLT5oYWRfY29udGVudCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHN3aXRjaCAoYS0+dHlwZSkKKyAgICB7CisKKyAgICBjYXNlIEVMRU1FTlRfSU5DTFVERToKKyAgICAgIGlmICghYm9vbHNfZXF1YWwgKGEtPmQuaW5jbHVkZS5pZ25vcmVfbWlzc2luZywKKwkJCWItPmQuaW5jbHVkZS5pZ25vcmVfbWlzc2luZykpCisJcmV0dXJuIEZBTFNFOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEVMRU1FTlRfUE9MSUNZOgorICAgICAgaWYgKGEtPmQucG9saWN5LnR5cGUgIT0gYi0+ZC5wb2xpY3kudHlwZSkKKwlyZXR1cm4gRkFMU0U7CisgICAgICBpZiAoYS0+ZC5wb2xpY3kuZ2lkX3VpZF9vcl9hdF9jb25zb2xlICE9IGItPmQucG9saWN5LmdpZF91aWRfb3JfYXRfY29uc29sZSkKKwlyZXR1cm4gRkFMU0U7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRUxFTUVOVF9MSU1JVDoKKyAgICAgIGlmIChzdHJjbXAgKGEtPmQubGltaXQubmFtZSwgYi0+ZC5saW1pdC5uYW1lKSkKKwlyZXR1cm4gRkFMU0U7CisgICAgICBpZiAoYS0+ZC5saW1pdC52YWx1ZSAhPSBiLT5kLmxpbWl0LnZhbHVlKQorCXJldHVybiBGQUxTRTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBFTEVNRU5UX05PTkU6CisgICAgY2FzZSBFTEVNRU5UX0JVU0NPTkZJRzoKKyAgICBjYXNlIEVMRU1FTlRfVVNFUjoKKyAgICBjYXNlIEVMRU1FTlRfTElTVEVOOgorICAgIGNhc2UgRUxFTUVOVF9BVVRIOgorICAgIGNhc2UgRUxFTUVOVF9BTExPVzoKKyAgICBjYXNlIEVMRU1FTlRfREVOWToKKyAgICBjYXNlIEVMRU1FTlRfRk9SSzoKKyAgICBjYXNlIEVMRU1FTlRfUElERklMRToKKyAgICBjYXNlIEVMRU1FTlRfU0VSVklDRURJUjoKKyAgICBjYXNlIEVMRU1FTlRfU0VSVklDRUhFTFBFUjoKKyAgICBjYXNlIEVMRU1FTlRfSU5DTFVERURJUjoKKyAgICBjYXNlIEVMRU1FTlRfQ09ORklHVFlQRToKKyAgICBjYXNlIEVMRU1FTlRfU0VMSU5VWDoKKyAgICBjYXNlIEVMRU1FTlRfQVNTT0NJQVRFOgorICAgIGNhc2UgRUxFTUVOVF9TVEFOREFSRF9TRVNTSU9OX1NFUlZJQ0VESVJTOgorICAgIGNhc2UgRUxFTUVOVF9TVEFOREFSRF9TWVNURU1fU0VSVklDRURJUlM6CisgICAgY2FzZSBFTEVNRU5UX0tFRVBfVU1BU0s6CisgICAgY2FzZSBFTEVNRU5UX1NZU0xPRzoKKyAgICBjYXNlIEVMRU1FTlRfQUxMT1dfQU5PTllNT1VTOgorICAgIGNhc2UgRUxFTUVOVF9BUFBBUk1PUjoKKyAgICBkZWZhdWx0OgorICAgICAgLyogZG8gbm90aGluZzogbm90aGluZyBpbiB0aGUgRWxlbWVudCBzdHJ1Y3QgZm9yIHRoZXNlIHR5cGVzICovCisgICAgICBicmVhazsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7CisKK30KKworc3RhdGljIGRidXNfYm9vbF90CitsaXN0c19vZl9lbGVtZW50c19lcXVhbCAoREJ1c0xpc3QgKmEsCisJCQkgREJ1c0xpc3QgKmIpCit7CisgIERCdXNMaXN0ICppYTsKKyAgREJ1c0xpc3QgKmliOworCisgIGlhID0gYTsKKyAgaWIgPSBiOworICAKKyAgd2hpbGUgKGlhICE9IE5VTEwgJiYgaWIgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoZWxlbWVudHNfZXF1YWwgKGlhLT5kYXRhLCBpYi0+ZGF0YSkpCisJcmV0dXJuIEZBTFNFOworICAgICAgaWEgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZhLCBpYSk7CisgICAgICBpYiA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJmIsIGliKTsKKyAgICB9CisKKyAgcmV0dXJuIGlhID09IE5VTEwgJiYgaWIgPT0gTlVMTDsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitsaXN0c19vZl9jX3N0cmluZ3NfZXF1YWwgKERCdXNMaXN0ICphLAorCQkJICBEQnVzTGlzdCAqYikKK3sKKyAgREJ1c0xpc3QgKmlhOworICBEQnVzTGlzdCAqaWI7CisKKyAgaWEgPSBhOworICBpYiA9IGI7CisgIAorICB3aGlsZSAoaWEgIT0gTlVMTCAmJiBpYiAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChzdHJjbXAgKGlhLT5kYXRhLCBpYi0+ZGF0YSkpCisJcmV0dXJuIEZBTFNFOworICAgICAgaWEgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZhLCBpYSk7CisgICAgICBpYiA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJmIsIGliKTsKKyAgICB9CisKKyAgcmV0dXJuIGlhID09IE5VTEwgJiYgaWIgPT0gTlVMTDsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitsaXN0c19vZl9zZXJ2aWNlX2RpcnNfZXF1YWwgKERCdXNMaXN0ICphLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAqYikKK3sKKyAgREJ1c0xpc3QgKmlhOworICBEQnVzTGlzdCAqaWI7CisKKyAgaWEgPSBhOworICBpYiA9IGI7CisKKyAgd2hpbGUgKGlhICE9IE5VTEwgJiYgaWIgIT0gTlVMTCkKKyAgICB7CisgICAgICBCdXNDb25maWdTZXJ2aWNlRGlyICpkYSA9IGlhLT5kYXRhOworICAgICAgQnVzQ29uZmlnU2VydmljZURpciAqZGIgPSBpYi0+ZGF0YTsKKworICAgICAgaWYgKHN0cmNtcCAoZGEtPnBhdGgsIGRiLT5wYXRoKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICBpZiAoZGEtPmZsYWdzICE9IGRiLT5mbGFncykKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICBpYSA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJmEsIGlhKTsKKyAgICAgIGliID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmYiwgaWIpOworICAgIH0KKworICByZXR1cm4gaWEgPT0gTlVMTCAmJiBpYiA9PSBOVUxMOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2xpbWl0c19lcXVhbCAoY29uc3QgQnVzTGltaXRzICphLAorCSAgICAgIGNvbnN0IEJ1c0xpbWl0cyAqYikKK3sKKyAgcmV0dXJuCisgICAgKGEtPm1heF9pbmNvbWluZ19ieXRlcyA9PSBiLT5tYXhfaW5jb21pbmdfYnl0ZXMKKyAgICAgfHwgYS0+bWF4X2luY29taW5nX3VuaXhfZmRzID09IGItPm1heF9pbmNvbWluZ191bml4X2ZkcworICAgICB8fCBhLT5tYXhfb3V0Z29pbmdfYnl0ZXMgPT0gYi0+bWF4X291dGdvaW5nX2J5dGVzCisgICAgIHx8IGEtPm1heF9vdXRnb2luZ191bml4X2ZkcyA9PSBiLT5tYXhfb3V0Z29pbmdfdW5peF9mZHMKKyAgICAgfHwgYS0+bWF4X21lc3NhZ2Vfc2l6ZSA9PSBiLT5tYXhfbWVzc2FnZV9zaXplCisgICAgIHx8IGEtPm1heF9tZXNzYWdlX3VuaXhfZmRzID09IGItPm1heF9tZXNzYWdlX3VuaXhfZmRzCisgICAgIHx8IGEtPmFjdGl2YXRpb25fdGltZW91dCA9PSBiLT5hY3RpdmF0aW9uX3RpbWVvdXQKKyAgICAgfHwgYS0+YXV0aF90aW1lb3V0ID09IGItPmF1dGhfdGltZW91dAorICAgICB8fCBhLT5wZW5kaW5nX2ZkX3RpbWVvdXQgPT0gYi0+cGVuZGluZ19mZF90aW1lb3V0CisgICAgIHx8IGEtPm1heF9jb21wbGV0ZWRfY29ubmVjdGlvbnMgPT0gYi0+bWF4X2NvbXBsZXRlZF9jb25uZWN0aW9ucworICAgICB8fCBhLT5tYXhfaW5jb21wbGV0ZV9jb25uZWN0aW9ucyA9PSBiLT5tYXhfaW5jb21wbGV0ZV9jb25uZWN0aW9ucworICAgICB8fCBhLT5tYXhfY29ubmVjdGlvbnNfcGVyX3VzZXIgPT0gYi0+bWF4X2Nvbm5lY3Rpb25zX3Blcl91c2VyCisgICAgIHx8IGEtPm1heF9wZW5kaW5nX2FjdGl2YXRpb25zID09IGItPm1heF9wZW5kaW5nX2FjdGl2YXRpb25zCisgICAgIHx8IGEtPm1heF9zZXJ2aWNlc19wZXJfY29ubmVjdGlvbiA9PSBiLT5tYXhfc2VydmljZXNfcGVyX2Nvbm5lY3Rpb24KKyAgICAgfHwgYS0+bWF4X21hdGNoX3J1bGVzX3Blcl9jb25uZWN0aW9uID09IGItPm1heF9tYXRjaF9ydWxlc19wZXJfY29ubmVjdGlvbgorICAgICB8fCBhLT5tYXhfcmVwbGllc19wZXJfY29ubmVjdGlvbiA9PSBiLT5tYXhfcmVwbGllc19wZXJfY29ubmVjdGlvbgorICAgICB8fCBhLT5yZXBseV90aW1lb3V0ID09IGItPnJlcGx5X3RpbWVvdXQpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2NvbmZpZ19wYXJzZXJzX2VxdWFsIChjb25zdCBCdXNDb25maWdQYXJzZXIgKmEsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnVzQ29uZmlnUGFyc2VyICpiKQoreworICBpZiAoIV9kYnVzX3N0cmluZ19lcXVhbCAoJmEtPmJhc2VkaXIsICZiLT5iYXNlZGlyKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFsaXN0c19vZl9lbGVtZW50c19lcXVhbCAoYS0+c3RhY2ssIGItPnN0YWNrKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFzdHJpbmdzX2VxdWFsX29yX2JvdGhfbnVsbCAoYS0+dXNlciwgYi0+dXNlcikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghbGlzdHNfb2ZfY19zdHJpbmdzX2VxdWFsIChhLT5saXN0ZW5fb24sIGItPmxpc3Rlbl9vbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghbGlzdHNfb2ZfY19zdHJpbmdzX2VxdWFsIChhLT5tZWNoYW5pc21zLCBiLT5tZWNoYW5pc21zKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFsaXN0c19vZl9zZXJ2aWNlX2RpcnNfZXF1YWwgKGEtPnNlcnZpY2VfZGlycywgYi0+c2VydmljZV9kaXJzKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIAorICAvKiBGSVhNRTogY29tcGFyZSBwb2xpY3kgKi8KKworICAvKiBGSVhNRTogY29tcGFyZSBzZXJ2aWNlIHNlbGludXggSUQgdGFibGUgKi8KKworICBpZiAoISBsaW1pdHNfZXF1YWwgKCZhLT5saW1pdHMsICZiLT5saW1pdHMpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIXN0cmluZ3NfZXF1YWxfb3JfYm90aF9udWxsIChhLT5waWRmaWxlLCBiLT5waWRmaWxlKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCEgYm9vbHNfZXF1YWwgKGEtPmZvcmssIGItPmZvcmspKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoISBib29sc19lcXVhbCAoYS0+a2VlcF91bWFzaywgYi0+a2VlcF91bWFzaykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghIGJvb2xzX2VxdWFsIChhLT5pc190b3BsZXZlbCwgYi0+aXNfdG9wbGV2ZWwpKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CithbGxfYXJlX2VxdWl2IChjb25zdCBEQnVzU3RyaW5nICp0YXJnZXRfZGlyZWN0b3J5KQoreworICBEQnVzU3RyaW5nIGZpbGVuYW1lOworICBEQnVzRGlySXRlciAqZGlyOworICBCdXNDb25maWdQYXJzZXIgKmZpcnN0X3BhcnNlcjsKKyAgQnVzQ29uZmlnUGFyc2VyICpwYXJzZXI7CisgIERCdXNFcnJvciBlcnJvcjsKKyAgZGJ1c19ib29sX3QgZXF1YWw7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKworICBkaXIgPSBOVUxMOworICBmaXJzdF9wYXJzZXIgPSBOVUxMOworICBwYXJzZXIgPSBOVUxMOworICByZXR2YWwgPSBGQUxTRTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZmlsZW5hbWUpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImRpZG4ndCBhbGxvY2F0ZSBmaWxlbmFtZSBzdHJpbmciKTsKKworICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisgIGRpciA9IF9kYnVzX2RpcmVjdG9yeV9vcGVuICh0YXJnZXRfZGlyZWN0b3J5LCAmZXJyb3IpOworICBpZiAoZGlyID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkNvdWxkIG5vdCBvcGVuICVzOiAlcyIsCisJCSAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICh0YXJnZXRfZGlyZWN0b3J5KSwKKwkJICBlcnJvci5tZXNzYWdlKTsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgIGdvdG8gZmluaXNoZWQ7CisgICAgfQorCisgIHByaW50ZiAoIkNvbXBhcmluZyBlcXVpdmFsZW50IGZpbGVzOlxuIik7CisKKyBuZXh0OgorICB3aGlsZSAoX2RidXNfZGlyZWN0b3J5X2dldF9uZXh0X2ZpbGUgKGRpciwgJmZpbGVuYW1lLCAmZXJyb3IpKQorICAgIHsKKyAgICAgIERCdXNTdHJpbmcgZnVsbF9wYXRoOworCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZnVsbF9wYXRoKSkKKwlfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZG4ndCBpbml0IHN0cmluZyIpOworCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5ICh0YXJnZXRfZGlyZWN0b3J5LCAwLCAmZnVsbF9wYXRoLCAwKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGRuJ3QgY29weSBkaXIgdG8gZnVsbF9wYXRoIik7CisKKyAgICAgIGlmICghX2RidXNfY29uY2F0X2Rpcl9hbmRfZmlsZSAoJmZ1bGxfcGF0aCwgJmZpbGVuYW1lKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGRuJ3QgY29uY2F0IGZpbGUgdG8gZGlyIik7CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2VuZHNfd2l0aF9jX3N0ciAoJmZ1bGxfcGF0aCwgIi5jb25mIikpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiU2tpcHBpbmcgbm9uLS5jb25mIGZpbGUgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmZmlsZW5hbWUpKTsKKwkgIF9kYnVzX3N0cmluZ19mcmVlICgmZnVsbF9wYXRoKTsKKyAgICAgICAgICBnb3RvIG5leHQ7CisgICAgICAgIH0KKworICAgICAgcHJpbnRmICgiICAgICVzXG4iLCBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZmaWxlbmFtZSkpOworCisgICAgICBwYXJzZXIgPSBidXNfY29uZmlnX2xvYWQgKCZmdWxsX3BhdGgsIFRSVUUsIE5VTEwsICZlcnJvcik7CisKKyAgICAgIGlmIChwYXJzZXIgPT0gTlVMTCkKKwl7CisJICBfZGJ1c193YXJuICgiQ291bGQgbm90IGxvYWQgZmlsZSAlczogJXMiLAorCQkgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZmdWxsX3BhdGgpLAorCQkgICAgICBlcnJvci5tZXNzYWdlKTsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZ1bGxfcGF0aCk7CisJICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisJICBnb3RvIGZpbmlzaGVkOworCX0KKyAgICAgIGVsc2UgaWYgKGZpcnN0X3BhcnNlciA9PSBOVUxMKQorCXsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZ1bGxfcGF0aCk7CisJICBmaXJzdF9wYXJzZXIgPSBwYXJzZXI7CisJfQorICAgICAgZWxzZQorCXsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZ1bGxfcGF0aCk7CisJICBlcXVhbCA9IGNvbmZpZ19wYXJzZXJzX2VxdWFsIChmaXJzdF9wYXJzZXIsIHBhcnNlcik7CisJICBidXNfY29uZmlnX3BhcnNlcl91bnJlZiAocGFyc2VyKTsKKwkgIGlmICghIGVxdWFsKQorCSAgICBnb3RvIGZpbmlzaGVkOworCX0KKyAgICB9CisKKyAgcmV0dmFsID0gVFJVRTsKKworIGZpbmlzaGVkOgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZpbGVuYW1lKTsKKyAgaWYgKGZpcnN0X3BhcnNlcikKKyAgICBidXNfY29uZmlnX3BhcnNlcl91bnJlZiAoZmlyc3RfcGFyc2VyKTsKKyAgaWYgKGRpcikKKyAgICBfZGJ1c19kaXJlY3RvcnlfY2xvc2UgKGRpcik7CisKKyAgcmV0dXJuIHJldHZhbDsKKyAgCit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorcHJvY2Vzc190ZXN0X2VxdWl2X3N1YmRpciAoY29uc3QgREJ1c1N0cmluZyAqdGVzdF9iYXNlX2RpciwKKwkJCSAgIGNvbnN0IGNoYXIgICAgICAgKnN1YmRpcikKK3sKKyAgREJ1c1N0cmluZyB0ZXN0X2RpcmVjdG9yeTsKKyAgREJ1c1N0cmluZyBmaWxlbmFtZTsKKyAgREJ1c0Rpckl0ZXIgKmRpcjsKKyAgREJ1c0Vycm9yIGVycm9yOworICBkYnVzX2Jvb2xfdCBlcXVhbDsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworCisgIGRpciA9IE5VTEw7CisgIHJldHZhbCA9IEZBTFNFOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZ0ZXN0X2RpcmVjdG9yeSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZGlkbid0IGFsbG9jYXRlIHRlc3RfZGlyZWN0b3J5Iik7CisKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZmaWxlbmFtZSwgc3ViZGlyKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5ICh0ZXN0X2Jhc2VfZGlyLCAwLAorCQkJICAmdGVzdF9kaXJlY3RvcnksIDApKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkbid0IGNvcHkgdGVzdF9iYXNlX2RpciB0byB0ZXN0X2RpcmVjdG9yeSIpOworCisgIGlmICghX2RidXNfY29uY2F0X2Rpcl9hbmRfZmlsZSAoJnRlc3RfZGlyZWN0b3J5LCAmZmlsZW5hbWUpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkbid0IGFsbG9jYXRlIGZ1bGwgcGF0aCIpOworCisgIF9kYnVzX3N0cmluZ19mcmVlICgmZmlsZW5hbWUpOworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZmlsZW5hbWUpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImRpZG4ndCBhbGxvY2F0ZSBmaWxlbmFtZSBzdHJpbmciKTsKKworICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisgIGRpciA9IF9kYnVzX2RpcmVjdG9yeV9vcGVuICgmdGVzdF9kaXJlY3RvcnksICZlcnJvcik7CisgIGlmIChkaXIgPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiQ291bGQgbm90IG9wZW4gJXM6ICVzIiwKKwkJICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZ0ZXN0X2RpcmVjdG9yeSksCisJCSAgZXJyb3IubWVzc2FnZSk7CisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICBnb3RvIGZpbmlzaGVkOworICAgIH0KKworICB3aGlsZSAoX2RidXNfZGlyZWN0b3J5X2dldF9uZXh0X2ZpbGUgKGRpciwgJmZpbGVuYW1lLCAmZXJyb3IpKQorICAgIHsKKyAgICAgIERCdXNTdHJpbmcgZnVsbF9wYXRoOworCisgICAgICAvKiBTa2lwIENWUydzIG1hZ2ljIGRpcmVjdG9yaWVzISAqLworICAgICAgaWYgKF9kYnVzX3N0cmluZ19lcXVhbF9jX3N0ciAoJmZpbGVuYW1lLCAiQ1ZTIikpCisJY29udGludWU7CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZmdWxsX3BhdGgpKQorCV9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkbid0IGluaXQgc3RyaW5nIik7CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2NvcHkgKCZ0ZXN0X2RpcmVjdG9yeSwgMCwgJmZ1bGxfcGF0aCwgMCkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkbid0IGNvcHkgZGlyIHRvIGZ1bGxfcGF0aCIpOworCisgICAgICBpZiAoIV9kYnVzX2NvbmNhdF9kaXJfYW5kX2ZpbGUgKCZmdWxsX3BhdGgsICZmaWxlbmFtZSkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkbid0IGNvbmNhdCBmaWxlIHRvIGRpciIpOworICAgICAgCisgICAgICBlcXVhbCA9IGFsbF9hcmVfZXF1aXYgKCZmdWxsX3BhdGgpOworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmdWxsX3BhdGgpOworCisgICAgICBpZiAoIWVxdWFsKQorCWdvdG8gZmluaXNoZWQ7CisgICAgfQorCisgIHJldHZhbCA9IFRSVUU7CisKKyBmaW5pc2hlZDoKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ0ZXN0X2RpcmVjdG9yeSk7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmZmlsZW5hbWUpOworICBpZiAoZGlyKQorICAgIF9kYnVzX2RpcmVjdG9yeV9jbG9zZSAoZGlyKTsKKworICByZXR1cm4gcmV0dmFsOworICAKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKnRlc3Rfc2Vzc2lvbl9zZXJ2aWNlX2Rpcl9tYXRjaGVzW10gPSAKKyAgICAgICAgeworLyogd2lsbCBiZSBmaWxsZWQgaW4gdGVzdF9kZWZhdWx0X3Nlc3Npb25fc2VydmljZWRpcnMoKSAqLworI2lmZGVmIERCVVNfV0lOCisgICAgICAgICBOVUxMLCAvKiBpbnN0YWxsIHJvb3QtYmFzZWQgKi8KKyAgICAgICAgIE5VTEwsIC8qIENvbW1vblByb2dyYW1GaWxlcy1iYXNlZCAqLworI2Vsc2UKKyAgICAgICAgIE5VTEwsIC8qIFhER19SVU5USU1FX0RJUi1iYXNlZCAqLworICAgICAgICAgTlVMTCwgLyogWERHX0RBVEFfSE9NRS1iYXNlZCAqLworICAgICAgICAgTlVMTCwgLyogWERHX0RBVEFfRElSUy1iYXNlZCAqLworICAgICAgICAgTlVMTCwgLyogWERHX0RBVEFfRElSUy1iYXNlZCAqLworICAgICAgICAgREJVU19EQVRBRElSICIvZGJ1cy0xL3NlcnZpY2VzIiwKKyNlbmRpZgorICAgICAgICAgTlVMTAorICAgICAgICB9OworCitzdGF0aWMgZGJ1c19ib29sX3QKK3Rlc3RfZGVmYXVsdF9zZXNzaW9uX3NlcnZpY2VkaXJzIChjb25zdCBEQnVzU3RyaW5nICp0ZXN0X2Jhc2VfZGlyKQoreworICBCdXNDb25maWdQYXJzZXIgKnBhcnNlciA9IE5VTEw7CisgIERCdXNFcnJvciBlcnJvciA9IERCVVNfRVJST1JfSU5JVDsKKyAgREJ1c0xpc3QgKipkaXJzOworICBEQnVzTGlzdCAqd2F0Y2hlZF9kaXJzID0gTlVMTDsKKyAgREJ1c0xpc3QgKmxpbms7CisgIERCdXNTdHJpbmcgdG1wOworICBEQnVzU3RyaW5nIGZ1bGxfcGF0aDsKKyAgREJ1c1N0cmluZyBwcm9nczsKKyAgREJ1c1N0cmluZyBpbnN0YWxsX3Jvb3RfYmFzZWQ7CisgIERCdXNTdHJpbmcgcnVudGltZV9kaXJfYmFzZWQ7CisgIERCdXNTdHJpbmcgZGF0YV9ob21lX2Jhc2VkOworICBEQnVzU3RyaW5nIGRhdGFfZGlyc19iYXNlZDsKKyAgREJ1c1N0cmluZyBkYXRhX2RpcnNfYmFzZWQyOworICBpbnQgaTsKKyAgZGJ1c19ib29sX3QgcmV0ID0gRkFMU0U7CisjaWZkZWYgREJVU19XSU4KKyAgY29uc3QgY2hhciAqY29tbW9uX3Byb2dzOworI2Vsc2UKKyAgY29uc3QgY2hhciAqZGJ1c190ZXN0X2J1aWxkZGlyOworICBjb25zdCBjaGFyICp4ZGdfZGF0YV9ob21lOworICBjb25zdCBjaGFyICp4ZGdfcnVudGltZV9kaXI7CisjZW5kaWYKKworICAvKiBPbiBlYWNoIHBsYXRmb3JtIHdlIGRvbid0IGFjdHVhbGx5IHVzZSBhbGwgb2YgdGhlc2UsIGJ1dCBpdCdzIGVhc2llciB0bworICAgKiBoYW5kbGUgdGhlIGRlYWxsb2NhdGlvbiBpZiB3ZSBhbHdheXMgYWxsb2NhdGUgdGhlbSwgd2hldGhlciBuZWVkZWQgb3IKKyAgICogbm90ICovCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZmdWxsX3BhdGgpIHx8CisgICAgICAhX2RidXNfc3RyaW5nX2luaXQgKCZwcm9ncykgfHwKKyAgICAgICFfZGJ1c19zdHJpbmdfaW5pdCAoJmluc3RhbGxfcm9vdF9iYXNlZCkgfHwKKyAgICAgICFfZGJ1c19zdHJpbmdfaW5pdCAoJnJ1bnRpbWVfZGlyX2Jhc2VkKSB8fAorICAgICAgIV9kYnVzX3N0cmluZ19pbml0ICgmZGF0YV9ob21lX2Jhc2VkKSB8fAorICAgICAgIV9kYnVzX3N0cmluZ19pbml0ICgmZGF0YV9kaXJzX2Jhc2VkKSB8fAorICAgICAgIV9kYnVzX3N0cmluZ19pbml0ICgmZGF0YV9kaXJzX2Jhc2VkMikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiT09NIGFsbG9jYXRpbmcgc3RyaW5ncyIpOworCisgIGlmICghX2RidXNfc3RyaW5nX2NvcHkgKHRlc3RfYmFzZV9kaXIsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmdWxsX3BhdGgsIDApKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkbid0IGNvcHkgdGVzdF9iYXNlX2RpciB0byBmdWxsX3BhdGgiKTsKKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnRtcCwgInZhbGlkLWNvbmZpZy1maWxlcyIpOworCisgIGlmICghX2RidXNfY29uY2F0X2Rpcl9hbmRfZmlsZSAoJmZ1bGxfcGF0aCwgJnRtcCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGRuJ3QgYWxsb2NhdGUgZnVsbCBwYXRoIik7CisKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZ0bXAsICJzdGFuZGFyZC1zZXNzaW9uLWRpcnMuY29uZiIpOworCisgIGlmICghX2RidXNfY29uY2F0X2Rpcl9hbmRfZmlsZSAoJmZ1bGxfcGF0aCwgJnRtcCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGRuJ3QgYWxsb2NhdGUgZnVsbCBwYXRoIik7CisKKyNpZmRlZiBEQlVTX1dJTgorICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZpbnN0YWxsX3Jvb3RfYmFzZWQsIERCVVNfREFUQURJUikgfHwKKyAgICAgICFfZGJ1c19zdHJpbmdfYXBwZW5kICgmaW5zdGFsbF9yb290X2Jhc2VkLCAiL2RidXMtMS9zZXJ2aWNlcyIpIHx8CisgICAgICAhX2RidXNfcmVwbGFjZV9pbnN0YWxsX3ByZWZpeCAoJmluc3RhbGxfcm9vdF9iYXNlZCkpCisgICAgZ290byBvdXQ7CisKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19wYXRoX2lzX2Fic29sdXRlICgmaW5zdGFsbF9yb290X2Jhc2VkKSk7CisKKyAgdGVzdF9zZXNzaW9uX3NlcnZpY2VfZGlyX21hdGNoZXNbMF0gPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKAorICAgICAgJmluc3RhbGxfcm9vdF9iYXNlZCk7CisKKyAgY29tbW9uX3Byb2dzID0gX2RidXNfZ2V0ZW52ICgiQ29tbW9uUHJvZ3JhbUZpbGVzIik7CisKKyAgaWYgKGNvbW1vbl9wcm9ncykgCisgICAgeworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmcHJvZ3MsIGNvbW1vbl9wcm9ncykpIAorICAgICAgICBnb3RvIG91dDsKKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmcHJvZ3MsICIvZGJ1cy0xL3NlcnZpY2VzIikpIAorICAgICAgICBnb3RvIG91dDsKKworICAgICAgdGVzdF9zZXNzaW9uX3NlcnZpY2VfZGlyX21hdGNoZXNbMV0gPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEoJnByb2dzKTsKKyAgICB9CisjZWxzZQorICBkYnVzX3Rlc3RfYnVpbGRkaXIgPSBfZGJ1c19nZXRlbnYgKCJEQlVTX1RFU1RfQlVJTERESVIiKTsKKyAgeGRnX2RhdGFfaG9tZSA9IF9kYnVzX2dldGVudiAoIlhER19EQVRBX0hPTUUiKTsKKyAgeGRnX3J1bnRpbWVfZGlyID0gX2RidXNfZ2V0ZW52ICgiWERHX1JVTlRJTUVfRElSIik7CisKKyAgaWYgKGRidXNfdGVzdF9idWlsZGRpciA9PSBOVUxMIHx8IHhkZ19kYXRhX2hvbWUgPT0gTlVMTCB8fAorICAgICAgeGRnX3J1bnRpbWVfZGlyID09IE5VTEwpCisgICAgeworICAgICAgcHJpbnRmICgiTm90IHRlc3RpbmcgZGVmYXVsdCBzZXNzaW9uIHNlcnZpY2UgZGlyZWN0b3JpZXMgYmVjYXVzZSBhICIKKyAgICAgICAgICAgICAgImJ1aWxkLXRpbWUgdGVzdGluZyBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBub3Qgc2V0OiAiCisgICAgICAgICAgICAgICJzZWUgQU1fVEVTVFNfRU5WSVJPTk1FTlQgaW4gdGVzdHMvTWFrZWZpbGUuYW1cbiIpOworICAgICAgcmV0ID0gVFJVRTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZkYXRhX2RpcnNfYmFzZWQsIGRidXNfdGVzdF9idWlsZGRpcikgfHwKKyAgICAgICFfZGJ1c19zdHJpbmdfYXBwZW5kICgmZGF0YV9kaXJzX2Jhc2VkLCAiL1hER19EQVRBX0RJUlMvZGJ1cy0xL3NlcnZpY2VzIikgfHwKKyAgICAgICFfZGJ1c19zdHJpbmdfYXBwZW5kICgmZGF0YV9kaXJzX2Jhc2VkMiwgZGJ1c190ZXN0X2J1aWxkZGlyKSB8fAorICAgICAgIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZkYXRhX2RpcnNfYmFzZWQyLCAiL1hER19EQVRBX0RJUlMyL2RidXMtMS9zZXJ2aWNlcyIpIHx8CisgICAgICAhX2RidXNfc3RyaW5nX2FwcGVuZCAoJnJ1bnRpbWVfZGlyX2Jhc2VkLCB4ZGdfcnVudGltZV9kaXIpIHx8CisgICAgICAhX2RidXNfc3RyaW5nX2FwcGVuZCAoJmRhdGFfaG9tZV9iYXNlZCwgeGRnX2RhdGFfaG9tZSkgfHwKKyAgICAgICFfZGJ1c19zdHJpbmdfYXBwZW5kICgmZGF0YV9ob21lX2Jhc2VkLCAiL2RidXMtMS9zZXJ2aWNlcyIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm91dCBvZiBtZW1vcnkiKTsKKworICBpZiAoIV9kYnVzX2Vuc3VyZV9kaXJlY3RvcnkgKCZydW50aW1lX2Rpcl9iYXNlZCwgTlVMTCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiVW5hYmxlIHRvIGNyZWF0ZSBmYWtlIFhER19SVU5USU1FX0RJUiIpOworCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnJ1bnRpbWVfZGlyX2Jhc2VkLCAiL2RidXMtMS9zZXJ2aWNlcyIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm91dCBvZiBtZW1vcnkiKTsKKworICAvKiBTYW5pdHkgY2hlY2s6IHRoZSBNYWtlZmlsZSBzZXRzIHRoaXMgdXAuIFdlIGFzc3VtZSB0aGF0IGlmIHRoaXMgaXMKKyAgICogcmlnaHQsIHRoZSBYREdfREFUQV9ESVJTIHdpbGwgYmUgdG9vLiAqLworICBpZiAoIV9kYnVzX3N0cmluZ19zdGFydHNfd2l0aF9jX3N0ciAoJmRhdGFfaG9tZV9iYXNlZCwgZGJ1c190ZXN0X2J1aWxkZGlyKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCIkWERHX0RBVEFfSE9NRSBzaG91bGQgc3RhcnQgd2l0aCAkREJVU19URVNUX0JVSUxERElSIik7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfc3RhcnRzX3dpdGhfY19zdHIgKCZydW50aW1lX2Rpcl9iYXNlZCwgZGJ1c190ZXN0X2J1aWxkZGlyKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCIkWERHX1JVTlRJTUVfRElSIHNob3VsZCBzdGFydCB3aXRoICREQlVTX1RFU1RfQlVJTERESVIiKTsKKworICB0ZXN0X3Nlc3Npb25fc2VydmljZV9kaXJfbWF0Y2hlc1swXSA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoCisgICAgICAmcnVudGltZV9kaXJfYmFzZWQpOworICB0ZXN0X3Nlc3Npb25fc2VydmljZV9kaXJfbWF0Y2hlc1sxXSA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoCisgICAgICAmZGF0YV9ob21lX2Jhc2VkKTsKKyAgdGVzdF9zZXNzaW9uX3NlcnZpY2VfZGlyX21hdGNoZXNbMl0gPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKAorICAgICAgJmRhdGFfZGlyc19iYXNlZCk7CisgIHRlc3Rfc2Vzc2lvbl9zZXJ2aWNlX2Rpcl9tYXRjaGVzWzNdID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgKKyAgICAgICZkYXRhX2RpcnNfYmFzZWQyKTsKKyNlbmRpZgorCisgIHBhcnNlciA9IGJ1c19jb25maWdfbG9hZCAoJmZ1bGxfcGF0aCwgVFJVRSwgTlVMTCwgJmVycm9yKTsKKworICBpZiAocGFyc2VyID09IE5VTEwpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkIChlcnJvci5tZXNzYWdlKTsKKworICBkaXJzID0gYnVzX2NvbmZpZ19wYXJzZXJfZ2V0X3NlcnZpY2VfZGlycyAocGFyc2VyKTsKKworICBmb3IgKGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rIChkaXJzKSwgaSA9IDA7CisgICAgICAgbGluayAhPSBOVUxMOworICAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKGRpcnMsIGxpbmspLCBpKyspCisgICAgeworICAgICAgQnVzQ29uZmlnU2VydmljZURpciAqZGlyID0gbGluay0+ZGF0YTsKKyAgICAgIEJ1c1NlcnZpY2VEaXJGbGFncyBleHBlY3RlZCA9IEJVU19TRVJWSUNFX0RJUl9GTEFHU19OT05FOworCisgICAgICBwcmludGYgKCIgICAgdGVzdCBzZXJ2aWNlIGRpcjogJyVzJ1xuIiwgZGlyLT5wYXRoKTsKKyAgICAgIHByaW50ZiAoIiAgICBjdXJyZW50IHN0YW5kYXJkIHNlcnZpY2UgZGlyOiAnJXMnXG4iLCB0ZXN0X3Nlc3Npb25fc2VydmljZV9kaXJfbWF0Y2hlc1tpXSk7CisgICAgICBpZiAodGVzdF9zZXNzaW9uX3NlcnZpY2VfZGlyX21hdGNoZXNbaV0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIHByaW50ZiAoIm1vcmUgZGlyZWN0b3JpZXMgcGFyc2VkIHRoYW4gaW4gbWF0Y2ggc2V0XG4iKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorIAorICAgICAgaWYgKHN0cmNtcCAodGVzdF9zZXNzaW9uX3NlcnZpY2VfZGlyX21hdGNoZXNbaV0sIGRpci0+cGF0aCkgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgIHByaW50ZiAoIiclcycgZGlyZWN0b3J5IGRvZXMgbm90IG1hdGNoICclcycgaW4gdGhlIG1hdGNoIHNldFxuIiwKKyAgICAgICAgICAgICAgICAgIGRpci0+cGF0aCwgdGVzdF9zZXNzaW9uX3NlcnZpY2VfZGlyX21hdGNoZXNbaV0pOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyNpZm5kZWYgREJVU19XSU4KKyAgICAgIC8qIE9uIFVuaXggd2UgZXhwZWN0IHRoZSBmaXJzdCBkaXJlY3RvcnkgaW4gdGhlIHNlYXJjaCBwYXRoIHRvIGJlCisgICAgICAgKiBpbiB0aGUgWERHX1JVTlRJTUVfRElSLCBhbmQgd2UgZXhwZWN0IGl0IHRvIGhhdmUgc3BlY2lhbCBmbGFncyAqLworICAgICAgaWYgKGkgPT0gMCkKKyAgICAgICAgZXhwZWN0ZWQgPSAoQlVTX1NFUlZJQ0VfRElSX0ZMQUdTX05PX1dBVENIIHwKKyAgICAgICAgICAgICAgICAgICAgQlVTX1NFUlZJQ0VfRElSX0ZMQUdTX1NUUklDVF9OQU1JTkcpOworI2VuZGlmCisKKyAgICAgIGlmIChkaXItPmZsYWdzICE9IGV4cGVjdGVkKQorICAgICAgICB7CisgICAgICAgICAgcHJpbnRmICgiJyVzJyBkaXJlY3RvcnkgaGFzIGZsYWdzIDB4JXgsIHNob3VsZCBiZSAweCV4XG4iLAorICAgICAgICAgICAgICAgICAgZGlyLT5wYXRoLCBkaXItPmZsYWdzLCBleHBlY3RlZCk7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICB9CisgIAorICBpZiAodGVzdF9zZXNzaW9uX3NlcnZpY2VfZGlyX21hdGNoZXNbaV0gIT0gTlVMTCkKKyAgICB7CisgICAgICBwcmludGYgKCJleHRyYSBkYXRhICVzIGluIHRoZSBtYXRjaCBzZXQgd2FzIG5vdCBtYXRjaGVkXG4iLAorICAgICAgICAgICAgICB0ZXN0X3Nlc3Npb25fc2VydmljZV9kaXJfbWF0Y2hlc1tpXSk7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgaWYgKCFidXNfY29uZmlnX3BhcnNlcl9nZXRfd2F0Y2hlZF9kaXJzIChwYXJzZXIsICZ3YXRjaGVkX2RpcnMpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm91dCBvZiBtZW1vcnkiKTsKKworI2lmZGVmIERCVVNfV0lOCisgIC8qIFdlIGV4cGVjdCBhbGwgZGlyZWN0b3JpZXMgdG8gYmUgd2F0Y2hlZCAobm90IHRoYXQgaXQgbWF0dGVycyBvbiBXaW5kb3dzLAorICAgKiBiZWNhdXNlIHdlIGRvbid0IGtub3cgaG93KSAqLworICBpID0gMDsKKyNlbHNlCisgIC8qIFdlIGV4cGVjdCBhbGwgZGlyZWN0b3JpZXMgZXhjZXB0IHRoZSBmaXJzdCB0byBiZSB3YXRjaGVkLCBiZWNhdXNlCisgICAqIHRoZSBmaXJzdCBvbmUgaXMgdHJhbnNpZW50ICovCisgIGkgPSAxOworI2VuZGlmCisKKyAgZm9yIChsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJndhdGNoZWRfZGlycyk7CisgICAgICAgbGluayAhPSBOVUxMOworICAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZ3YXRjaGVkX2RpcnMsIGxpbmspLCBpKyspCisgICAgeworICAgICAgcHJpbnRmICgiICAgIHdhdGNoZWQgc2VydmljZSBkaXI6ICclcydcbiIsIChjb25zdCBjaGFyICopIGxpbmstPmRhdGEpOworICAgICAgcHJpbnRmICgiICAgIGN1cnJlbnQgc3RhbmRhcmQgc2VydmljZSBkaXI6ICclcydcbiIsCisgICAgICAgICAgICAgIHRlc3Rfc2Vzc2lvbl9zZXJ2aWNlX2Rpcl9tYXRjaGVzW2ldKTsKKworICAgICAgaWYgKHRlc3Rfc2Vzc2lvbl9zZXJ2aWNlX2Rpcl9tYXRjaGVzW2ldID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBwcmludGYgKCJtb3JlIGRpcmVjdG9yaWVzIHBhcnNlZCB0aGFuIGluIG1hdGNoIHNldFxuIik7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgICAgaWYgKHN0cmNtcCAodGVzdF9zZXNzaW9uX3NlcnZpY2VfZGlyX21hdGNoZXNbaV0sCisgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciAqKSBsaW5rLT5kYXRhKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgcHJpbnRmICgiJyVzJyBkaXJlY3RvcnkgZG9lcyBub3QgbWF0Y2ggJyVzJyBpbiB0aGUgbWF0Y2ggc2V0XG4iLAorICAgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKikgbGluay0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgIHRlc3Rfc2Vzc2lvbl9zZXJ2aWNlX2Rpcl9tYXRjaGVzW2ldKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgIH0KKworICBpZiAodGVzdF9zZXNzaW9uX3NlcnZpY2VfZGlyX21hdGNoZXNbaV0gIT0gTlVMTCkKKyAgICB7CisgICAgICBwcmludGYgKCJleHRyYSBkYXRhICVzIGluIHRoZSBtYXRjaCBzZXQgd2FzIG5vdCBtYXRjaGVkXG4iLAorICAgICAgICAgICAgICB0ZXN0X3Nlc3Npb25fc2VydmljZV9kaXJfbWF0Y2hlc1tpXSk7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgcmV0ID0gVFJVRTsKKworb3V0OgorICBpZiAocGFyc2VyICE9IE5VTEwpCisgICAgYnVzX2NvbmZpZ19wYXJzZXJfdW5yZWYgKHBhcnNlcik7CisKKyAgX2RidXNfbGlzdF9jbGVhciAoJndhdGNoZWRfZGlycyk7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmZnVsbF9wYXRoKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZpbnN0YWxsX3Jvb3RfYmFzZWQpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnByb2dzKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZydW50aW1lX2Rpcl9iYXNlZCk7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmZGF0YV9ob21lX2Jhc2VkKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZkYXRhX2RpcnNfYmFzZWQpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmRhdGFfZGlyc19iYXNlZDIpOworICByZXR1cm4gcmV0OworfQorCisjaWZuZGVmIERCVVNfV0lOCitzdGF0aWMgY29uc3QgY2hhciAqdGVzdF9zeXN0ZW1fc2VydmljZV9kaXJfbWF0Y2hlc1tdID0gCisgICAgICAgIHsKKyAgICAgICAgICIvdXNyL2xvY2FsL3NoYXJlL2RidXMtMS9zeXN0ZW0tc2VydmljZXMiLAorICAgICAgICAgIi91c3Ivc2hhcmUvZGJ1cy0xL3N5c3RlbS1zZXJ2aWNlcyIsCisgICAgICAgICBEQlVTX0RBVEFESVIiL2RidXMtMS9zeXN0ZW0tc2VydmljZXMiLAorICAgICAgICAgIi9saWIvZGJ1cy0xL3N5c3RlbS1zZXJ2aWNlcyIsCisgICAgICAgICBOVUxMCisgICAgICAgIH07CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAordGVzdF9kZWZhdWx0X3N5c3RlbV9zZXJ2aWNlZGlycyAodm9pZCkKK3sKKyAgREJ1c0xpc3QgKmRpcnM7CisgIERCdXNMaXN0ICpsaW5rOworICBpbnQgaTsKKworICBkaXJzID0gTlVMTDsKKworICBpZiAoIV9kYnVzX2dldF9zdGFuZGFyZF9zeXN0ZW1fc2VydmljZWRpcnMgKCZkaXJzKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZG4ndCBnZXQgc3RhcmRhcmQgZGlycyIpOworCisgIC8qIG1ha2Ugc3VyZSB3ZSByZWFkIGFuZCBwYXJzZSB0aGUgZW52IHZhcmlhYmxlIGNvcnJlY3RseSAqLworICBpID0gMDsKKyAgd2hpbGUgKChsaW5rID0gX2RidXNfbGlzdF9wb3BfZmlyc3RfbGluayAoJmRpcnMpKSkKKyAgICB7CisgICAgICBwcmludGYgKCIgICAgdGVzdCBzZXJ2aWNlIGRpcjogJXNcbiIsIChjaGFyICopbGluay0+ZGF0YSk7CisgICAgICBpZiAodGVzdF9zeXN0ZW1fc2VydmljZV9kaXJfbWF0Y2hlc1tpXSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgcHJpbnRmICgibW9yZSBkaXJlY3RvcmllcyBwYXJzZWQgdGhhbiBpbiBtYXRjaCBzZXRcbiIpOworICAgICAgICAgIGRidXNfZnJlZSAobGluay0+ZGF0YSk7CisgICAgICAgICAgX2RidXNfbGlzdF9mcmVlX2xpbmsgKGxpbmspOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorIAorICAgICAgaWYgKHN0cmNtcCAodGVzdF9zeXN0ZW1fc2VydmljZV9kaXJfbWF0Y2hlc1tpXSwgCisgICAgICAgICAgICAgICAgICAoY2hhciAqKWxpbmstPmRhdGEpICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICBwcmludGYgKCIlcyBkaXJlY3RvcnkgZG9lcyBub3QgbWF0Y2ggJXMgaW4gdGhlIG1hdGNoIHNldFxuIiwgCisgICAgICAgICAgICAgICAgICAoY2hhciAqKWxpbmstPmRhdGEsCisgICAgICAgICAgICAgICAgICB0ZXN0X3N5c3RlbV9zZXJ2aWNlX2Rpcl9tYXRjaGVzW2ldKTsKKyAgICAgICAgICBkYnVzX2ZyZWUgKGxpbmstPmRhdGEpOworICAgICAgICAgIF9kYnVzX2xpc3RfZnJlZV9saW5rIChsaW5rKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgKytpOworCisgICAgICBkYnVzX2ZyZWUgKGxpbmstPmRhdGEpOworICAgICAgX2RidXNfbGlzdF9mcmVlX2xpbmsgKGxpbmspOworICAgIH0KKyAgCisgIGlmICh0ZXN0X3N5c3RlbV9zZXJ2aWNlX2Rpcl9tYXRjaGVzW2ldICE9IE5VTEwpCisgICAgeworICAgICAgcHJpbnRmICgiZXh0cmEgZGF0YSAlcyBpbiB0aGUgbWF0Y2ggc2V0IHdhcyBub3QgbWF0Y2hlZFxuIiwKKyAgICAgICAgICAgICAgdGVzdF9zeXN0ZW1fc2VydmljZV9kaXJfbWF0Y2hlc1tpXSk7CisKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgCisgIHJldHVybiBUUlVFOworfQorI2VuZGlmCisJCSAgIAorZGJ1c19ib29sX3QKK2J1c19jb25maWdfcGFyc2VyX3Rlc3QgKGNvbnN0IERCdXNTdHJpbmcgKnRlc3RfZGF0YV9kaXIpCit7CisgIGlmICh0ZXN0X2RhdGFfZGlyID09IE5VTEwgfHwKKyAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICh0ZXN0X2RhdGFfZGlyKSA9PSAwKQorICAgIHsKKyAgICAgIHByaW50ZiAoIk5vIHRlc3QgZGF0YVxuIik7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgaWYgKCF0ZXN0X2RlZmF1bHRfc2Vzc2lvbl9zZXJ2aWNlZGlycyAodGVzdF9kYXRhX2RpcikpCisgICAgcmV0dXJuIEZBTFNFOworCisjaWZkZWYgREJVU19XSU4KKyAgcHJpbnRmKCJkZWZhdWx0IHN5c3RlbSBzZXJ2aWNlIGRpciBza2lwcGVkXG4iKTsKKyNlbHNlCisgIGlmICghdGVzdF9kZWZhdWx0X3N5c3RlbV9zZXJ2aWNlZGlycygpKQorICAgIHJldHVybiBGQUxTRTsKKyNlbmRpZgorCisgIGlmICghcHJvY2Vzc190ZXN0X3ZhbGlkX3N1YmRpciAodGVzdF9kYXRhX2RpciwgInZhbGlkLWNvbmZpZy1maWxlcyIsIFZBTElEKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyNpZm5kZWYgREJVU19XSU4KKyAgaWYgKCFwcm9jZXNzX3Rlc3RfdmFsaWRfc3ViZGlyICh0ZXN0X2RhdGFfZGlyLCAidmFsaWQtY29uZmlnLWZpbGVzLXN5c3RlbSIsIFZBTElEKSkKKyAgICByZXR1cm4gRkFMU0U7CisjZW5kaWYKKworICBpZiAoIXByb2Nlc3NfdGVzdF92YWxpZF9zdWJkaXIgKHRlc3RfZGF0YV9kaXIsICJpbnZhbGlkLWNvbmZpZy1maWxlcyIsIElOVkFMSUQpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIXByb2Nlc3NfdGVzdF9lcXVpdl9zdWJkaXIgKHRlc3RfZGF0YV9kaXIsICJlcXVpdi1jb25maWctZmlsZXMiKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKyNlbmRpZiAvKiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUyAqLworCmRpZmYgLS1naXQgYS9idXMvY29uZmlnLXBhcnNlci5oIGIvYnVzL2NvbmZpZy1wYXJzZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjRlNzRiCi0tLSAvZGV2L251bGwKKysrIGIvYnVzL2NvbmZpZy1wYXJzZXIuaApAQCAtMCwwICsxLDEwOCBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBjb25maWctcGFyc2VyLmggIFhNTC1saWJyYXJ5LWFnbm9zdGljIGNvbmZpZ3VyYXRpb24gZmlsZSBwYXJzZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaWZuZGVmIEJVU19DT05GSUdfUEFSU0VSX0gKKyNkZWZpbmUgQlVTX0NPTkZJR19QQVJTRVJfSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXN0cmluZy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1saXN0Lmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWhhc2guaD4KKyNpbmNsdWRlICJidXMuaCIKKworLyogV2hhdGV2ZXIgWE1MIGxpYnJhcnkgd2UncmUgdXNpbmcganVzdCBwdXNoZXMgZGF0YSBpbnRvIHRoaXMgQVBJICovCisKK3R5cGVkZWYgc3RydWN0IEJ1c0NvbmZpZ1BhcnNlciBCdXNDb25maWdQYXJzZXI7CisKK0J1c0NvbmZpZ1BhcnNlciogYnVzX2NvbmZpZ19wYXJzZXJfbmV3IChjb25zdCBEQnVzU3RyaW5nICAgICAgKmJhc2VkaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgICAgICBpc190b3BsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCdXNDb25maWdQYXJzZXIgKnBhcmVudCk7CisKK0J1c0NvbmZpZ1BhcnNlciogYnVzX2NvbmZpZ19wYXJzZXJfcmVmICAgICAgICAgICAoQnVzQ29uZmlnUGFyc2VyICAgKnBhcnNlcik7Cit2b2lkICAgICAgICAgICAgIGJ1c19jb25maWdfcGFyc2VyX3VucmVmICAgICAgICAgKEJ1c0NvbmZpZ1BhcnNlciAgICpwYXJzZXIpOworZGJ1c19ib29sX3QgICAgICBidXNfY29uZmlnX3BhcnNlcl9jaGVja19kb2N0eXBlIChCdXNDb25maWdQYXJzZXIgICAqcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAqZG9jdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgKmVycm9yKTsKK2RidXNfYm9vbF90ICAgICAgYnVzX2NvbmZpZ19wYXJzZXJfc3RhcnRfZWxlbWVudCAoQnVzQ29uZmlnUGFyc2VyICAgKnBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgKmVsZW1lbnRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqKmF0dHJpYnV0ZV9uYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqKmF0dHJpYnV0ZV92YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICplcnJvcik7CitkYnVzX2Jvb2xfdCAgICAgIGJ1c19jb25maWdfcGFyc2VyX2VuZF9lbGVtZW50ICAgKEJ1c0NvbmZpZ1BhcnNlciAgICpwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICplbGVtZW50X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICplcnJvcik7CitkYnVzX2Jvb2xfdCAgICAgIGJ1c19jb25maWdfcGFyc2VyX2NvbnRlbnQgICAgICAgKEJ1c0NvbmZpZ1BhcnNlciAgICpwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICpjb250ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAqZXJyb3IpOworZGJ1c19ib29sX3QgICAgICBidXNfY29uZmlnX3BhcnNlcl9maW5pc2hlZCAgICAgIChCdXNDb25maWdQYXJzZXIgICAqcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAqZXJyb3IpOworCisvKiBGdW5jdGlvbnMgZm9yIGV4dHJhY3RpbmcgdGhlIHBhcnNlIHJlc3VsdHMgKi8KK2NvbnN0IGNoYXIqIGJ1c19jb25maWdfcGFyc2VyX2dldF91c2VyICAgICAgICAgKEJ1c0NvbmZpZ1BhcnNlciAqcGFyc2VyKTsKK2NvbnN0IGNoYXIqIGJ1c19jb25maWdfcGFyc2VyX2dldF90eXBlICAgICAgICAgKEJ1c0NvbmZpZ1BhcnNlciAqcGFyc2VyKTsKK0RCdXNMaXN0KiogIGJ1c19jb25maWdfcGFyc2VyX2dldF9hZGRyZXNzZXMgICAgKEJ1c0NvbmZpZ1BhcnNlciAqcGFyc2VyKTsKK0RCdXNMaXN0KiogIGJ1c19jb25maWdfcGFyc2VyX2dldF9tZWNoYW5pc21zICAgKEJ1c0NvbmZpZ1BhcnNlciAqcGFyc2VyKTsKK2RidXNfYm9vbF90IGJ1c19jb25maWdfcGFyc2VyX2dldF9mb3JrICAgICAgICAgKEJ1c0NvbmZpZ1BhcnNlciAqcGFyc2VyKTsKK2RidXNfYm9vbF90IGJ1c19jb25maWdfcGFyc2VyX2dldF9hbGxvd19hbm9ueW1vdXMgKEJ1c0NvbmZpZ1BhcnNlciAqcGFyc2VyKTsKK2RidXNfYm9vbF90IGJ1c19jb25maWdfcGFyc2VyX2dldF9zeXNsb2cgICAgICAgKEJ1c0NvbmZpZ1BhcnNlciAqcGFyc2VyKTsKK2RidXNfYm9vbF90IGJ1c19jb25maWdfcGFyc2VyX2dldF9rZWVwX3VtYXNrICAgKEJ1c0NvbmZpZ1BhcnNlciAqcGFyc2VyKTsKK2NvbnN0IGNoYXIqIGJ1c19jb25maWdfcGFyc2VyX2dldF9waWRmaWxlICAgICAgKEJ1c0NvbmZpZ1BhcnNlciAqcGFyc2VyKTsKK2NvbnN0IGNoYXIqIGJ1c19jb25maWdfcGFyc2VyX2dldF9zZXJ2aWNlaGVscGVyIChCdXNDb25maWdQYXJzZXIgKnBhcnNlcik7CitEQnVzTGlzdCoqICBidXNfY29uZmlnX3BhcnNlcl9nZXRfc2VydmljZV9kaXJzIChCdXNDb25maWdQYXJzZXIgKnBhcnNlcik7CitEQnVzTGlzdCoqICBidXNfY29uZmlnX3BhcnNlcl9nZXRfY29uZl9kaXJzICAgIChCdXNDb25maWdQYXJzZXIgKnBhcnNlcik7CitCdXNQb2xpY3kqICBidXNfY29uZmlnX3BhcnNlcl9zdGVhbF9wb2xpY3kgICAgIChCdXNDb25maWdQYXJzZXIgKnBhcnNlcik7Cit2b2lkICAgICAgICBidXNfY29uZmlnX3BhcnNlcl9nZXRfbGltaXRzICAgICAgIChCdXNDb25maWdQYXJzZXIgKnBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c0xpbWl0cyAgICAgICAqbGltaXRzKTsKK2RidXNfYm9vbF90IGJ1c19jb25maWdfcGFyc2VyX2dldF93YXRjaGVkX2RpcnMgKEJ1c0NvbmZpZ1BhcnNlciAgKnBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNMaXN0ICAgICAgICAqKndhdGNoZWRfZGlycyk7CisKK0RCdXNIYXNoVGFibGUqIGJ1c19jb25maWdfcGFyc2VyX3N0ZWFsX3NlcnZpY2VfY29udGV4dF90YWJsZSAoQnVzQ29uZmlnUGFyc2VyICpwYXJzZXIpOworCisvKiBMb2FkZXIgZnVuY3Rpb25zIChiYWNrZW5kZWQgb2ZmIG9uZSBvZiB0aGUgWE1MIHBhcnNlcnMpLiAgUmV0dXJucyBhCisgKiBmaW5pc2hlZCBDb25maWdQYXJzZXIuCisgKi8KK0J1c0NvbmZpZ1BhcnNlciogYnVzX2NvbmZpZ19sb2FkIChjb25zdCBEQnVzU3RyaW5nICAgICAgKmZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgICAgICBpc190b3BsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCdXNDb25maWdQYXJzZXIgKnBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAgICAgKmVycm9yKTsKKworLyoKKyAqIFRoZXNlIGFyZSBjaG9zZW4gc3VjaCB0aGF0IGlmIHdlIGNvbmZpZ3VyZSBhIGRpcmVjdG9yeSB0d2ljZSB3aXRoIGRpZmZlcmVudAorICogZmxhZ3MsIHdlIGhhdmUgdG8gZG8gYW4gImFuZCIgb3BlcmF0aW9uIG9uIHRoZSBmbGFncyAtIHRoZSBjb21wYXRpYmxlCisgKiB0aGluZyB0byBkbyBpcyB0byBoYXZlIG5vIGZsYWdzLgorICovCit0eXBlZGVmIGVudW0KK3sKKyAgQlVTX1NFUlZJQ0VfRElSX0ZMQUdTX05PX1dBVENIID0gKDEgPDwgMCksCisgIEJVU19TRVJWSUNFX0RJUl9GTEFHU19TVFJJQ1RfTkFNSU5HID0gKDEgPDwgMSksCisgIC8qIEtlZXAgdGhpcyBvbmUgYXQgdGhlIGVuZCB0byByZWR1Y2UgZGlmZnMgd2hlbiBhZGRpbmcgbmV3IGVudHJpZXMgKi8KKyAgQlVTX1NFUlZJQ0VfRElSX0ZMQUdTX05PTkUgPSAwCit9IEJ1c1NlcnZpY2VEaXJGbGFnczsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgQnVzU2VydmljZURpckZsYWdzIGZsYWdzOworICBjaGFyICpwYXRoOworfSBCdXNDb25maWdTZXJ2aWNlRGlyOworCisjZW5kaWYgLyogQlVTX0NPTkZJR19QQVJTRVJfSCAqLwpkaWZmIC0tZ2l0IGEvYnVzL2Nvbm5lY3Rpb24uYyBiL2J1cy9jb25uZWN0aW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM1ODM0MwotLS0gL2Rldi9udWxsCisrKyBiL2J1cy9jb25uZWN0aW9uLmMKQEAgLTAsMCArMSwyODg0IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGNvbm5lY3Rpb24uYyAgQ2xpZW50IGNvbm5lY3Rpb25zCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzICBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJjb25uZWN0aW9uLmgiCisjaW5jbHVkZSAiZGlzcGF0Y2guaCIKKyNpbmNsdWRlICJwb2xpY3kuaCIKKyNpbmNsdWRlICJzZXJ2aWNlcy5oIgorI2luY2x1ZGUgInV0aWxzLmgiCisjaW5jbHVkZSAic2lnbmFscy5oIgorI2luY2x1ZGUgImV4cGlyZWxpc3QuaCIKKyNpbmNsdWRlICJzZWxpbnV4LmgiCisjaW5jbHVkZSAiYXBwYXJtb3IuaCIKKyNpbmNsdWRlIDxkYnVzL2RidXMtbGlzdC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1oYXNoLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXRpbWVvdXQuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtY29ubmVjdGlvbi1pbnRlcm5hbC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1pbnRlcm5hbHMuaD4KKworLyogVHJpbSBleGVjdXRlZCBjb21tYW5kcyB0byB0aGlzIGxlbmd0aDsgd2Ugd2FudCB0byBrZWVwIGxvZ3MgcmVhZGFibGUgKi8KKyNkZWZpbmUgTUFYX0xPR19DT01NQU5EX0xFTiA1MAorCitzdGF0aWMgdm9pZCBidXNfY29ubmVjdGlvbl9yZW1vdmVfdHJhbnNhY3Rpb25zIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbik7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEJ1c0V4cGlyZUl0ZW0gZXhwaXJlX2l0ZW07CisKKyAgREJ1c0Nvbm5lY3Rpb24gKndpbGxfZ2V0X3JlcGx5OworICBEQnVzQ29ubmVjdGlvbiAqd2lsbF9zZW5kX3JlcGx5OworCisgIGRidXNfdWludDMyX3QgcmVwbHlfc2VyaWFsOworICAKK30gQnVzUGVuZGluZ1JlcGx5OworCitzdHJ1Y3QgQnVzQ29ubmVjdGlvbnMKK3sKKyAgaW50IHJlZmNvdW50OworICBEQnVzTGlzdCAqY29tcGxldGVkOyAgLyoqPCBMaXN0IG9mIGFsbCBjb21wbGV0ZWQgY29ubmVjdGlvbnMgKi8KKyAgaW50IG5fY29tcGxldGVkOyAgICAgIC8qKjwgTGVuZ3RoIG9mIGNvbXBsZXRlZCBsaXN0ICovCisgIERCdXNMaXN0ICppbmNvbXBsZXRlOyAvKio8IExpc3Qgb2YgYWxsIG5vdC15ZXQtYWN0aXZlIGNvbm5lY3Rpb25zICovCisgIGludCBuX2luY29tcGxldGU7ICAgICAvKio8IExlbmd0aCBvZiBpbmNvbXBsZXRlIGxpc3QgKi8KKyAgQnVzQ29udGV4dCAqY29udGV4dDsKKyAgREJ1c0hhc2hUYWJsZSAqY29tcGxldGVkX2J5X3VzZXI7IC8qKjwgTnVtYmVyIG9mIGNvbXBsZXRlZCBjb25uZWN0aW9ucyBmb3IgZWFjaCBVSUQgKi8KKyAgREJ1c1RpbWVvdXQgKmV4cGlyZV90aW1lb3V0OyAvKio8IFRpbWVvdXQgZm9yIGV4cGlyaW5nIGluY29tcGxldGUgY29ubmVjdGlvbnMuICovCisgIGludCBzdGFtcDsgICAgICAgICAgICAgICAgICAgLyoqPCBJbmNyZW1lbnRpbmcgbnVtYmVyICovCisgIEJ1c0V4cGlyZUxpc3QgKnBlbmRpbmdfcmVwbGllczsgLyoqPCBMaXN0IG9mIHBlbmRpbmcgcmVwbGllcyAqLworCisgIC8qKiBMaXN0IG9mIGFsbCBtb25pdG9yaW5nIGNvbm5lY3Rpb25zLCBhIHN1YnNldCBvZiBjb21wbGV0ZWQuCisgICAqIEVhY2ggbWVtYmVyIGlzIGEgI0RCdXNDb25uZWN0aW9uLiAqLworICBEQnVzTGlzdCAqbW9uaXRvcnM7CisgIEJ1c01hdGNobWFrZXIgKm1vbml0b3JfbWF0Y2htYWtlcjsKKworI2lmZGVmIERCVVNfRU5BQkxFX1NUQVRTCisgIGludCB0b3RhbF9tYXRjaF9ydWxlczsKKyAgaW50IHBlYWtfbWF0Y2hfcnVsZXM7CisgIGludCBwZWFrX21hdGNoX3J1bGVzX3Blcl9jb25uOworCisgIGludCB0b3RhbF9idXNfbmFtZXM7CisgIGludCBwZWFrX2J1c19uYW1lczsKKyAgaW50IHBlYWtfYnVzX25hbWVzX3Blcl9jb25uOworI2VuZGlmCit9OworCitzdGF0aWMgZGJ1c19pbnQzMl90IGNvbm5lY3Rpb25fZGF0YV9zbG90ID0gLTE7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEJ1c0Nvbm5lY3Rpb25zICpjb25uZWN0aW9uczsKKyAgREJ1c0xpc3QgKmxpbmtfaW5fY29ubmVjdGlvbl9saXN0OworICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKyAgREJ1c0xpc3QgKnNlcnZpY2VzX293bmVkOworICBpbnQgbl9zZXJ2aWNlc19vd25lZDsKKyAgREJ1c0xpc3QgKm1hdGNoX3J1bGVzOworICBpbnQgbl9tYXRjaF9ydWxlczsKKyAgY2hhciAqbmFtZTsKKyAgREJ1c0xpc3QgKnRyYW5zYWN0aW9uX21lc3NhZ2VzOyAvKio8IFN0dWZmIHdlIG5lZWQgdG8gc2VuZCBhcyBwYXJ0IG9mIGEgdHJhbnNhY3Rpb24gKi8KKyAgREJ1c01lc3NhZ2UgKm9vbV9tZXNzYWdlOworICBEQnVzUHJlYWxsb2NhdGVkU2VuZCAqb29tX3ByZWFsbG9jYXRlZDsKKyAgQnVzQ2xpZW50UG9saWN5ICpwb2xpY3k7CisKKyAgY2hhciAqY2FjaGVkX2xvZ2luZm9fc3RyaW5nOworICBCdXNTRUxpbnV4SUQgKnNlbGludXhfaWQ7CisgIEJ1c0FwcEFybW9yQ29uZmluZW1lbnQgKmFwcGFybW9yX2NvbmZpbmVtZW50OworCisgIGxvbmcgY29ubmVjdGlvbl90dl9zZWM7ICAvKio8IFRpbWUgd2hlbiB3ZSBjb25uZWN0ZWQgKHNlY29uZHMgY29tcG9uZW50KSAqLworICBsb25nIGNvbm5lY3Rpb25fdHZfdXNlYzsgLyoqPCBUaW1lIHdoZW4gd2UgY29ubmVjdGVkIChtaWNyb3NlYyBjb21wb25lbnQpICovCisgIGludCBzdGFtcDsgICAgICAgICAgICAgICAvKio8IGNvbm5lY3Rpb25zLT5zdGFtcCBsYXN0IHRpbWUgd2Ugd2VyZSB0cmF2ZXJzZWQgKi8KKworI2lmZGVmIERCVVNfRU5BQkxFX1NUQVRTCisgIGludCBwZWFrX21hdGNoX3J1bGVzOworICBpbnQgcGVha19idXNfbmFtZXM7CisjZW5kaWYKKyAgaW50IG5fcGVuZGluZ191bml4X2ZkczsKKyAgREJ1c1RpbWVvdXQgKnBlbmRpbmdfdW5peF9mZHNfdGltZW91dDsKKworICAvKiogbm9uLU5VTEwgaWYgYW5kIG9ubHkgaWYgdGhpcyBpcyBhIG1vbml0b3IgKi8KKyAgREJ1c0xpc3QgKmxpbmtfaW5fbW9uaXRvcnM7Cit9IEJ1c0Nvbm5lY3Rpb25EYXRhOworCitzdGF0aWMgZGJ1c19ib29sX3QgYnVzX3BlbmRpbmdfcmVwbHlfZXhwaXJlZCAoQnVzRXhwaXJlTGlzdCAqbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAgICAgICpsaW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKmRhdGEpOworCitzdGF0aWMgdm9pZCBidXNfY29ubmVjdGlvbl9kcm9wX3BlbmRpbmdfcmVwbGllcyAoQnVzQ29ubmVjdGlvbnMgICpjb25uZWN0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAgKmNvbm5lY3Rpb24pOworCitzdGF0aWMgZGJ1c19ib29sX3QgZXhwaXJlX2luY29tcGxldGVfdGltZW91dCAodm9pZCAqZGF0YSk7CisKKyNkZWZpbmUgQlVTX0NPTk5FQ1RJT05fREFUQShjb25uZWN0aW9uKSAoZGJ1c19jb25uZWN0aW9uX2dldF9kYXRhICgoY29ubmVjdGlvbiksIGNvbm5lY3Rpb25fZGF0YV9zbG90KSkKKworc3RhdGljIERCdXNMb29wKgorY29ubmVjdGlvbl9nZXRfbG9vcCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIEJ1c0Nvbm5lY3Rpb25EYXRhICpkOworCisgIGQgPSBCVVNfQ09OTkVDVElPTl9EQVRBIChjb25uZWN0aW9uKTsKKyAgX2RidXNfYXNzZXJ0KGQgIT0gTlVMTCk7CisKKyAgcmV0dXJuIGJ1c19jb250ZXh0X2dldF9sb29wIChkLT5jb25uZWN0aW9ucy0+Y29udGV4dCk7Cit9CisKKworc3RhdGljIGludAorZ2V0X2Nvbm5lY3Rpb25zX2Zvcl91aWQgKEJ1c0Nvbm5lY3Rpb25zICpjb25uZWN0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpZF90ICAgICAgdWlkKQoreworICB2b2lkICp2YWw7CisgIGludCBjdXJyZW50X2NvdW50OworCisgIC8qIHZhbCBpcyBOVUxMIGlzIDAgd2hlbiBpdCBpc24ndCBpbiB0aGUgaGFzaCB5ZXQgKi8KKyAgCisgIHZhbCA9IF9kYnVzX2hhc2hfdGFibGVfbG9va3VwX3VpbnRwdHIgKGNvbm5lY3Rpb25zLT5jb21wbGV0ZWRfYnlfdXNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZCk7CisKKyAgY3VycmVudF9jb3VudCA9IF9EQlVTX1BPSU5URVJfVE9fSU5UICh2YWwpOworCisgIHJldHVybiBjdXJyZW50X2NvdW50OworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2FkanVzdF9jb25uZWN0aW9uc19mb3JfdWlkIChCdXNDb25uZWN0aW9ucyAqY29ubmVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aWRfdCAgICAgIHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgYWRqdXN0bWVudCkKK3sKKyAgaW50IGN1cnJlbnRfY291bnQ7CisKKyAgY3VycmVudF9jb3VudCA9IGdldF9jb25uZWN0aW9uc19mb3JfdWlkIChjb25uZWN0aW9ucywgdWlkKTsKKworICBfZGJ1c192ZXJib3NlICgiQWRqdXN0aW5nIGNvbm5lY3Rpb24gY291bnQgZm9yIFVJRCAiIERCVVNfVUlEX0ZPUk1BVAorICAgICAgICAgICAgICAgICAiOiB3YXMgJWQgYWRqdXN0bWVudCAlZCBtYWtpbmcgJWRcbiIsCisgICAgICAgICAgICAgICAgIHVpZCwgY3VycmVudF9jb3VudCwgYWRqdXN0bWVudCwgY3VycmVudF9jb3VudCArIGFkanVzdG1lbnQpOworICAKKyAgX2RidXNfYXNzZXJ0IChjdXJyZW50X2NvdW50ID49IDApOworICAKKyAgY3VycmVudF9jb3VudCArPSBhZGp1c3RtZW50OworCisgIF9kYnVzX2Fzc2VydCAoY3VycmVudF9jb3VudCA+PSAwKTsKKworICBpZiAoY3VycmVudF9jb3VudCA9PSAwKQorICAgIHsKKyAgICAgIF9kYnVzX2hhc2hfdGFibGVfcmVtb3ZlX3VpbnRwdHIgKGNvbm5lY3Rpb25zLT5jb21wbGV0ZWRfYnlfdXNlciwgdWlkKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgICAgIAorICAgICAgcmV0dmFsID0gX2RidXNfaGFzaF90YWJsZV9pbnNlcnRfdWludHB0ciAoY29ubmVjdGlvbnMtPmNvbXBsZXRlZF9ieV91c2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZCwgX0RCVVNfSU5UX1RPX1BPSU5URVIgKGN1cnJlbnRfY291bnQpKTsKKworICAgICAgLyogb25seSBwb3NpdGl2ZSBhZGp1c3RtZW50IGNhbiBmYWlsIGFzIG90aGVyd2lzZQorICAgICAgICogYSBoYXNoIGVudHJ5IHNob3VsZCBhbHJlYWR5IGV4aXN0CisgICAgICAgKi8KKyAgICAgIF9kYnVzX2Fzc2VydCAoYWRqdXN0bWVudCA+IDAgfHwKKyAgICAgICAgICAgICAgICAgICAgKGFkanVzdG1lbnQgPD0gMCAmJiByZXR2YWwpKTsKKworICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICB9Cit9CisKK3ZvaWQKK2J1c19jb25uZWN0aW9uX2Rpc2Nvbm5lY3RlZCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIEJ1c0Nvbm5lY3Rpb25EYXRhICpkOworICBCdXNTZXJ2aWNlICpzZXJ2aWNlOworICBCdXNNYXRjaG1ha2VyICptYXRjaG1ha2VyOworICAKKyAgZCA9IEJVU19DT05ORUNUSU9OX0RBVEEgKGNvbm5lY3Rpb24pOworICBfZGJ1c19hc3NlcnQgKGQgIT0gTlVMTCk7CisKKyAgX2RidXNfdmVyYm9zZSAoIiVzIGRpc2Nvbm5lY3RlZCwgZHJvcHBpbmcgYWxsIHNlcnZpY2Ugb3duZXJzaGlwIGFuZCByZWxlYXNpbmdcbiIsCisgICAgICAgICAgICAgICAgIGQtPm5hbWUgPyBkLT5uYW1lIDogIihpbmFjdGl2ZSkiKTsKKworICAvKiBEZWxldGUgb3VyIG1hdGNoIHJ1bGVzICovCisgIGlmIChkLT5uX21hdGNoX3J1bGVzID4gMCkKKyAgICB7CisgICAgICBtYXRjaG1ha2VyID0gYnVzX2NvbnRleHRfZ2V0X21hdGNobWFrZXIgKGQtPmNvbm5lY3Rpb25zLT5jb250ZXh0KTsKKyAgICAgIGJ1c19tYXRjaG1ha2VyX2Rpc2Nvbm5lY3RlZCAobWF0Y2htYWtlciwgY29ubmVjdGlvbik7CisgICAgfQorICAKKyAgLyogRHJvcCBhbnkgc2VydmljZSBvd25lcnNoaXAuIFVuZm9ydHVuYXRlbHksIHRoaXMgcmVxdWlyZXMKKyAgICogbWVtb3J5IGFsbG9jYXRpb24gYW5kIHRoZXJlIGRvZXNuJ3Qgc2VlbSB0byBiZSBhIGdvb2Qgd2F5IHRvCisgICAqIGhhbmRsZSBpdCBvdGhlciB0aGFuIHNsZWVwaW5nOyB3ZSBjYW4ndCAiZmFpbCIgdGhlIG9wZXJhdGlvbiBvZgorICAgKiBkaXNjb25uZWN0aW5nIGEgY2xpZW50LCBhbmQgcHJlYWxsb2NhdGluZyBhIGJyb2FkY2FzdCAic2VydmljZSBpcworICAgKiBub3cgZ29uZSIgbWVzc2FnZSBmb3IgZXZlcnkgY2xpZW50LXNlcnZpY2UgcGFpciBzZWVtcyBraW5kIG9mCisgICAqIGludm9sdmVkLgorICAgKi8KKyAgd2hpbGUgKChzZXJ2aWNlID0gX2RidXNfbGlzdF9nZXRfbGFzdCAoJmQtPnNlcnZpY2VzX293bmVkKSkpCisgICAgeworICAgICAgQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uOworICAgICAgREJ1c0Vycm9yIGVycm9yOworCisgICAgcmV0cnk6CisgICAgICAKKyAgICAgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKyAgICAgICAgCisgICAgICB3aGlsZSAoKHRyYW5zYWN0aW9uID0gYnVzX3RyYW5zYWN0aW9uX25ldyAoZC0+Y29ubmVjdGlvbnMtPmNvbnRleHQpKSA9PSBOVUxMKQorICAgICAgICBfZGJ1c193YWl0X2Zvcl9tZW1vcnkgKCk7CisgICAgICAgIAorICAgICAgaWYgKCFidXNfc2VydmljZV9yZW1vdmVfb3duZXIgKHNlcnZpY2UsIGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb24sICZlcnJvcikpCisgICAgICAgIHsKKyAgICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUICgmZXJyb3IpOworICAgICAgICAgIAorICAgICAgICAgIGlmIChkYnVzX2Vycm9yX2hhc19uYW1lICgmZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgICAgICAgICBidXNfdHJhbnNhY3Rpb25fY2FuY2VsX2FuZF9mcmVlICh0cmFuc2FjdGlvbik7CisgICAgICAgICAgICAgIF9kYnVzX3dhaXRfZm9yX21lbW9yeSAoKTsKKyAgICAgICAgICAgICAgZ290byByZXRyeTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJGYWlsZWQgdG8gcmVtb3ZlIHNlcnZpY2Ugb3duZXI6ICVzICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvci5uYW1lLCBlcnJvci5tZXNzYWdlKTsKKyAgICAgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiUmVtb3Zpbmcgc2VydmljZSBvd25lciBmYWlsZWQgZm9yIG5vbi1tZW1vcnktcmVsYXRlZCByZWFzb24iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgIGJ1c190cmFuc2FjdGlvbl9leGVjdXRlX2FuZF9mcmVlICh0cmFuc2FjdGlvbik7CisgICAgfQorCisgIGJ1c19kaXNwYXRjaF9yZW1vdmVfY29ubmVjdGlvbiAoY29ubmVjdGlvbik7CisgIAorICAvKiBubyBtb3JlIHdhdGNoaW5nICovCisgIGlmICghZGJ1c19jb25uZWN0aW9uX3NldF93YXRjaF9mdW5jdGlvbnMgKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInNldHRpbmcgd2F0Y2ggZnVuY3Rpb25zIHRvIE5VTEwgZmFpbGVkIik7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2V0X3RpbWVvdXRfZnVuY3Rpb25zIChjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJzZXR0aW5nIHRpbWVvdXQgZnVuY3Rpb25zIHRvIE5VTEwgZmFpbGVkIik7CisgIAorICBkYnVzX2Nvbm5lY3Rpb25fc2V0X3VuaXhfdXNlcl9mdW5jdGlvbiAoY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwpOworICBkYnVzX2Nvbm5lY3Rpb25fc2V0X3dpbmRvd3NfdXNlcl9mdW5jdGlvbiAoY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwpOworICAKKyAgZGJ1c19jb25uZWN0aW9uX3NldF9kaXNwYXRjaF9zdGF0dXNfZnVuY3Rpb24gKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMKTsKKworICBpZiAoZC0+cGVuZGluZ191bml4X2Zkc190aW1lb3V0KQorICAgIHsKKyAgICAgIF9kYnVzX2xvb3BfcmVtb3ZlX3RpbWVvdXQgKGJ1c19jb250ZXh0X2dldF9sb29wIChkLT5jb25uZWN0aW9ucy0+Y29udGV4dCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLT5wZW5kaW5nX3VuaXhfZmRzX3RpbWVvdXQpOworICAgICAgX2RidXNfdGltZW91dF91bnJlZiAoZC0+cGVuZGluZ191bml4X2Zkc190aW1lb3V0KTsKKyAgICB9CisgIGQtPnBlbmRpbmdfdW5peF9mZHNfdGltZW91dCA9IE5VTEw7CisgIF9kYnVzX2Nvbm5lY3Rpb25fc2V0X3BlbmRpbmdfZmRzX2Z1bmN0aW9uIChjb25uZWN0aW9uLCBOVUxMLCBOVUxMKTsKKyAgCisgIGJ1c19jb25uZWN0aW9uX3JlbW92ZV90cmFuc2FjdGlvbnMgKGNvbm5lY3Rpb24pOworCisgIGlmIChkLT5saW5rX2luX21vbml0b3JzICE9IE5VTEwpCisgICAgeworICAgICAgQnVzTWF0Y2htYWtlciAqbW0gPSBkLT5jb25uZWN0aW9ucy0+bW9uaXRvcl9tYXRjaG1ha2VyOworCisgICAgICBpZiAobW0gIT0gTlVMTCkKKyAgICAgICAgYnVzX21hdGNobWFrZXJfZGlzY29ubmVjdGVkIChtbSwgY29ubmVjdGlvbik7CisKKyAgICAgIF9kYnVzX2xpc3RfcmVtb3ZlX2xpbmsgKCZkLT5jb25uZWN0aW9ucy0+bW9uaXRvcnMsIGQtPmxpbmtfaW5fbW9uaXRvcnMpOworICAgICAgZC0+bGlua19pbl9tb25pdG9ycyA9IE5VTEw7CisgICAgfQorCisgIGlmIChkLT5saW5rX2luX2Nvbm5lY3Rpb25fbGlzdCAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChkLT5uYW1lICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICB1bnNpZ25lZCBsb25nIHVpZDsKKyAgICAgICAgICAKKyAgICAgICAgICBfZGJ1c19saXN0X3JlbW92ZV9saW5rICgmZC0+Y29ubmVjdGlvbnMtPmNvbXBsZXRlZCwgZC0+bGlua19pbl9jb25uZWN0aW9uX2xpc3QpOworICAgICAgICAgIGQtPmxpbmtfaW5fY29ubmVjdGlvbl9saXN0ID0gTlVMTDsKKyAgICAgICAgICBkLT5jb25uZWN0aW9ucy0+bl9jb21wbGV0ZWQgLT0gMTsKKworICAgICAgICAgIGlmIChkYnVzX2Nvbm5lY3Rpb25fZ2V0X3VuaXhfdXNlciAoY29ubmVjdGlvbiwgJnVpZCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmICghYWRqdXN0X2Nvbm5lY3Rpb25zX2Zvcl91aWQgKGQtPmNvbm5lY3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWQsIC0xKSkKKyAgICAgICAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJhZGp1c3RpbmcgZG93bndhcmQgc2hvdWxkIG5ldmVyIGZhaWwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfbGlzdF9yZW1vdmVfbGluayAoJmQtPmNvbm5lY3Rpb25zLT5pbmNvbXBsZXRlLCBkLT5saW5rX2luX2Nvbm5lY3Rpb25fbGlzdCk7CisgICAgICAgICAgZC0+bGlua19pbl9jb25uZWN0aW9uX2xpc3QgPSBOVUxMOworICAgICAgICAgIGQtPmNvbm5lY3Rpb25zLT5uX2luY29tcGxldGUgLT0gMTsKKworICAgICAgICAgIC8qIElmIHdlIGhhdmUgZHJvcHBlZCBiZWxvdyB0aGUgbWF4LiBudW1iZXIgb2YgaW5jb21wbGV0ZQorICAgICAgICAgICAqIGNvbm5lY3Rpb25zLCBzdGFydCBhY2NlcHQoKWluZyBhZ2FpbiAqLworICAgICAgICAgIGJ1c19jb250ZXh0X2NoZWNrX2FsbF93YXRjaGVzIChkLT5jb25uZWN0aW9ucy0+Y29udGV4dCk7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgX2RidXNfYXNzZXJ0IChkLT5jb25uZWN0aW9ucy0+bl9pbmNvbXBsZXRlID49IDApOworICAgICAgX2RidXNfYXNzZXJ0IChkLT5jb25uZWN0aW9ucy0+bl9jb21wbGV0ZWQgPj0gMCk7CisgICAgfQorCisgIGJ1c19jb25uZWN0aW9uX2Ryb3BfcGVuZGluZ19yZXBsaWVzIChkLT5jb25uZWN0aW9ucywgY29ubmVjdGlvbik7CisgIAorICAvKiBmcmVlcyAiZCIgYXMgc2lkZSBlZmZlY3QgKi8KKyAgZGJ1c19jb25uZWN0aW9uX3NldF9kYXRhIChjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25fZGF0YV9zbG90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwpOworICAKKyAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChjb25uZWN0aW9uKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CithZGRfY29ubmVjdGlvbl93YXRjaCAoREJ1c1dhdGNoICAgICAgKndhdGNoLAorICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICpkYXRhKQoreworICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IGRhdGE7CisKKyAgcmV0dXJuIF9kYnVzX2xvb3BfYWRkX3dhdGNoIChjb25uZWN0aW9uX2dldF9sb29wIChjb25uZWN0aW9uKSwgd2F0Y2gpOworfQorCitzdGF0aWMgdm9pZAorcmVtb3ZlX2Nvbm5lY3Rpb25fd2F0Y2ggKERCdXNXYXRjaCAgICAgICp3YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAqZGF0YSkKK3sKKyAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBkYXRhOworICAKKyAgX2RidXNfbG9vcF9yZW1vdmVfd2F0Y2ggKGNvbm5lY3Rpb25fZ2V0X2xvb3AgKGNvbm5lY3Rpb24pLCB3YXRjaCk7Cit9CisKK3N0YXRpYyB2b2lkCit0b2dnbGVfY29ubmVjdGlvbl93YXRjaCAoREJ1c1dhdGNoICAgICAgKndhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICpkYXRhKQoreworICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IGRhdGE7CisKKyAgX2RidXNfbG9vcF90b2dnbGVfd2F0Y2ggKGNvbm5lY3Rpb25fZ2V0X2xvb3AgKGNvbm5lY3Rpb24pLCB3YXRjaCk7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYWRkX2Nvbm5lY3Rpb25fdGltZW91dCAoREJ1c1RpbWVvdXQgICAgKnRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAqZGF0YSkKK3sKKyAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBkYXRhOworICAKKyAgcmV0dXJuIF9kYnVzX2xvb3BfYWRkX3RpbWVvdXQgKGNvbm5lY3Rpb25fZ2V0X2xvb3AgKGNvbm5lY3Rpb24pLCB0aW1lb3V0KTsKK30KKworc3RhdGljIHZvaWQKK3JlbW92ZV9jb25uZWN0aW9uX3RpbWVvdXQgKERCdXNUaW1lb3V0ICAgICp0aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgKmRhdGEpCit7CisgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uID0gZGF0YTsKKyAgCisgIF9kYnVzX2xvb3BfcmVtb3ZlX3RpbWVvdXQgKGNvbm5lY3Rpb25fZ2V0X2xvb3AgKGNvbm5lY3Rpb24pLCB0aW1lb3V0KTsKK30KKworc3RhdGljIHZvaWQKK2Rpc3BhdGNoX3N0YXR1c19mdW5jdGlvbiAoREJ1c0Nvbm5lY3Rpb24gICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNEaXNwYXRjaFN0YXR1cyBuZXdfc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAqZGF0YSkKK3sKKyAgREJ1c0xvb3AgKmxvb3AgPSBkYXRhOworICAKKyAgaWYgKG5ld19zdGF0dXMgIT0gREJVU19ESVNQQVRDSF9DT01QTEVURSkKKyAgICB7CisgICAgICB3aGlsZSAoIV9kYnVzX2xvb3BfcXVldWVfZGlzcGF0Y2ggKGxvb3AsIGNvbm5lY3Rpb24pKQorICAgICAgICBfZGJ1c193YWl0X2Zvcl9tZW1vcnkgKCk7CisgICAgfQorfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2FsbG93X3VuaXhfdXNlcl9mdW5jdGlvbiAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgICB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICpkYXRhKQoreworICBCdXNDb25uZWN0aW9uRGF0YSAqZDsKKyAgICAKKyAgZCA9IEJVU19DT05ORUNUSU9OX0RBVEEgKGNvbm5lY3Rpb24pOworCisgIF9kYnVzX2Fzc2VydCAoZCAhPSBOVUxMKTsKKyAgCisgIHJldHVybiBidXNfY29udGV4dF9hbGxvd191bml4X3VzZXIgKGQtPmNvbm5lY3Rpb25zLT5jb250ZXh0LCB1aWQpOworfQorCitzdGF0aWMgdm9pZAorZnJlZV9jb25uZWN0aW9uX2RhdGEgKHZvaWQgKmRhdGEpCit7CisgIEJ1c0Nvbm5lY3Rpb25EYXRhICpkID0gZGF0YTsKKworICAvKiBzZXJ2aWNlc19vd25lZCBzaG91bGQgYmUgTlVMTCBzaW5jZSB3ZSBzaG91bGQgYmUgZGlzY29ubmVjdGVkICovCisgIF9kYnVzX2Fzc2VydCAoZC0+c2VydmljZXNfb3duZWQgPT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAoZC0+bl9zZXJ2aWNlc19vd25lZCA9PSAwKTsKKyAgLyogc2ltaWxhcmx5ICovCisgIF9kYnVzX2Fzc2VydCAoZC0+dHJhbnNhY3Rpb25fbWVzc2FnZXMgPT0gTlVMTCk7CisKKyAgaWYgKGQtPm9vbV9wcmVhbGxvY2F0ZWQpCisgICAgZGJ1c19jb25uZWN0aW9uX2ZyZWVfcHJlYWxsb2NhdGVkX3NlbmQgKGQtPmNvbm5lY3Rpb24sIGQtPm9vbV9wcmVhbGxvY2F0ZWQpOworCisgIGlmIChkLT5vb21fbWVzc2FnZSkKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKGQtPm9vbV9tZXNzYWdlKTsKKworICBpZiAoZC0+cG9saWN5KQorICAgIGJ1c19jbGllbnRfcG9saWN5X3VucmVmIChkLT5wb2xpY3kpOworCisgIGlmIChkLT5hcHBhcm1vcl9jb25maW5lbWVudCkKKyAgICBidXNfYXBwYXJtb3JfY29uZmluZW1lbnRfdW5yZWYgKGQtPmFwcGFybW9yX2NvbmZpbmVtZW50KTsKKyAgCisgIGRidXNfZnJlZSAoZC0+Y2FjaGVkX2xvZ2luZm9fc3RyaW5nKTsKKyAgCisgIGRidXNfZnJlZSAoZC0+bmFtZSk7CisgIAorICBkYnVzX2ZyZWUgKGQpOworfQorCitCdXNDb25uZWN0aW9ucyoKK2J1c19jb25uZWN0aW9uc19uZXcgKEJ1c0NvbnRleHQgKmNvbnRleHQpCit7CisgIEJ1c0Nvbm5lY3Rpb25zICpjb25uZWN0aW9uczsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9hbGxvY2F0ZV9kYXRhX3Nsb3QgKCZjb25uZWN0aW9uX2RhdGFfc2xvdCkpCisgICAgZ290byBmYWlsZWRfMDsKKworICBjb25uZWN0aW9ucyA9IGRidXNfbmV3MCAoQnVzQ29ubmVjdGlvbnMsIDEpOworICBpZiAoY29ubmVjdGlvbnMgPT0gTlVMTCkKKyAgICBnb3RvIGZhaWxlZF8xOworCisgIGNvbm5lY3Rpb25zLT5jb21wbGV0ZWRfYnlfdXNlciA9IF9kYnVzX2hhc2hfdGFibGVfbmV3IChEQlVTX0hBU0hfVUlOVFBUUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwpOworICBpZiAoY29ubmVjdGlvbnMtPmNvbXBsZXRlZF9ieV91c2VyID09IE5VTEwpCisgICAgZ290byBmYWlsZWRfMjsKKworICBjb25uZWN0aW9ucy0+ZXhwaXJlX3RpbWVvdXQgPSBfZGJ1c190aW1lb3V0X25ldyAoMTAwLCAvKiBpcnJlbGV2YW50ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBpcmVfaW5jb21wbGV0ZV90aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbnMsIE5VTEwpOworICBpZiAoY29ubmVjdGlvbnMtPmV4cGlyZV90aW1lb3V0ID09IE5VTEwpCisgICAgZ290byBmYWlsZWRfMzsKKworICBfZGJ1c190aW1lb3V0X2Rpc2FibGUgKGNvbm5lY3Rpb25zLT5leHBpcmVfdGltZW91dCk7CisKKyAgY29ubmVjdGlvbnMtPnBlbmRpbmdfcmVwbGllcyA9IGJ1c19leHBpcmVfbGlzdF9uZXcgKGJ1c19jb250ZXh0X2dldF9sb29wIChjb250ZXh0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1c19jb250ZXh0X2dldF9yZXBseV90aW1lb3V0IChjb250ZXh0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1c19wZW5kaW5nX3JlcGx5X2V4cGlyZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9ucyk7CisgIGlmIChjb25uZWN0aW9ucy0+cGVuZGluZ19yZXBsaWVzID09IE5VTEwpCisgICAgZ290byBmYWlsZWRfNDsKKyAgCisgIGlmICghX2RidXNfbG9vcF9hZGRfdGltZW91dCAoYnVzX2NvbnRleHRfZ2V0X2xvb3AgKGNvbnRleHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25zLT5leHBpcmVfdGltZW91dCkpCisgICAgZ290byBmYWlsZWRfNTsKKyAgCisgIGNvbm5lY3Rpb25zLT5yZWZjb3VudCA9IDE7CisgIGNvbm5lY3Rpb25zLT5jb250ZXh0ID0gY29udGV4dDsKKyAgCisgIHJldHVybiBjb25uZWN0aW9uczsKKworIGZhaWxlZF81OgorICBidXNfZXhwaXJlX2xpc3RfZnJlZSAoY29ubmVjdGlvbnMtPnBlbmRpbmdfcmVwbGllcyk7CisgZmFpbGVkXzQ6CisgIF9kYnVzX3RpbWVvdXRfdW5yZWYgKGNvbm5lY3Rpb25zLT5leHBpcmVfdGltZW91dCk7CisgZmFpbGVkXzM6CisgIF9kYnVzX2hhc2hfdGFibGVfdW5yZWYgKGNvbm5lY3Rpb25zLT5jb21wbGV0ZWRfYnlfdXNlcik7CisgZmFpbGVkXzI6CisgIGRidXNfZnJlZSAoY29ubmVjdGlvbnMpOworIGZhaWxlZF8xOgorICBkYnVzX2Nvbm5lY3Rpb25fZnJlZV9kYXRhX3Nsb3QgKCZjb25uZWN0aW9uX2RhdGFfc2xvdCk7CisgZmFpbGVkXzA6CisgIHJldHVybiBOVUxMOworfQorCitCdXNDb25uZWN0aW9ucyAqCitidXNfY29ubmVjdGlvbnNfcmVmIChCdXNDb25uZWN0aW9ucyAqY29ubmVjdGlvbnMpCit7CisgIF9kYnVzX2Fzc2VydCAoY29ubmVjdGlvbnMtPnJlZmNvdW50ID4gMCk7CisgIGNvbm5lY3Rpb25zLT5yZWZjb3VudCArPSAxOworCisgIHJldHVybiBjb25uZWN0aW9uczsKK30KKwordm9pZAorYnVzX2Nvbm5lY3Rpb25zX3VucmVmIChCdXNDb25uZWN0aW9ucyAqY29ubmVjdGlvbnMpCit7CisgIF9kYnVzX2Fzc2VydCAoY29ubmVjdGlvbnMtPnJlZmNvdW50ID4gMCk7CisgIGNvbm5lY3Rpb25zLT5yZWZjb3VudCAtPSAxOworICBpZiAoY29ubmVjdGlvbnMtPnJlZmNvdW50ID09IDApCisgICAgeworICAgICAgLyogZHJvcCBhbGwgaW5jb21wbGV0ZSAqLworICAgICAgd2hpbGUgKGNvbm5lY3Rpb25zLT5pbmNvbXBsZXRlICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKworICAgICAgICAgIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9ucy0+aW5jb21wbGV0ZS0+ZGF0YTsKKworICAgICAgICAgIGRidXNfY29ubmVjdGlvbl9yZWYgKGNvbm5lY3Rpb24pOworICAgICAgICAgIGRidXNfY29ubmVjdGlvbl9jbG9zZSAoY29ubmVjdGlvbik7CisgICAgICAgICAgYnVzX2Nvbm5lY3Rpb25fZGlzY29ubmVjdGVkIChjb25uZWN0aW9uKTsKKyAgICAgICAgICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGNvbm5lY3Rpb24pOworICAgICAgICB9CisKKyAgICAgIF9kYnVzX2Fzc2VydCAoY29ubmVjdGlvbnMtPm5faW5jb21wbGV0ZSA9PSAwKTsKKworICAgICAgLyogZHJvcCBhbGwgcmVhbCBjb25uZWN0aW9ucyAqLworICAgICAgd2hpbGUgKGNvbm5lY3Rpb25zLT5jb21wbGV0ZWQgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uOworCisgICAgICAgICAgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb25zLT5jb21wbGV0ZWQtPmRhdGE7CisKKyAgICAgICAgICBkYnVzX2Nvbm5lY3Rpb25fcmVmIChjb25uZWN0aW9uKTsKKyAgICAgICAgICBkYnVzX2Nvbm5lY3Rpb25fY2xvc2UgKGNvbm5lY3Rpb24pOworICAgICAgICAgIGJ1c19jb25uZWN0aW9uX2Rpc2Nvbm5lY3RlZCAoY29ubmVjdGlvbik7CisgICAgICAgICAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChjb25uZWN0aW9uKTsKKyAgICAgICAgfQorCisgICAgICBfZGJ1c19hc3NlcnQgKGNvbm5lY3Rpb25zLT5uX2NvbXBsZXRlZCA9PSAwKTsKKworICAgICAgLyogZGlzY29ubmVjdGluZyBhbGwgdGhlIGNvbm5lY3Rpb25zIHNob3VsZCBoYXZlIGVtcHRpZWQgdGhlIGxpc3Qgb2YKKyAgICAgICAqIG1vbml0b3JzIChlYWNoIGxpbmsgaXMgcmVtb3ZlZCBpbiBidXNfY29ubmVjdGlvbl9kaXNjb25uZWN0ZWQpICovCisgICAgICBfZGJ1c19hc3NlcnQgKGNvbm5lY3Rpb25zLT5tb25pdG9ycyA9PSBOVUxMKTsKKworICAgICAgYnVzX2V4cGlyZV9saXN0X2ZyZWUgKGNvbm5lY3Rpb25zLT5wZW5kaW5nX3JlcGxpZXMpOworICAgICAgCisgICAgICBfZGJ1c19sb29wX3JlbW92ZV90aW1lb3V0IChidXNfY29udGV4dF9nZXRfbG9vcCAoY29ubmVjdGlvbnMtPmNvbnRleHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbnMtPmV4cGlyZV90aW1lb3V0KTsKKyAgICAgIAorICAgICAgX2RidXNfdGltZW91dF91bnJlZiAoY29ubmVjdGlvbnMtPmV4cGlyZV90aW1lb3V0KTsKKyAgICAgIAorICAgICAgX2RidXNfaGFzaF90YWJsZV91bnJlZiAoY29ubmVjdGlvbnMtPmNvbXBsZXRlZF9ieV91c2VyKTsKKworICAgICAgaWYgKGNvbm5lY3Rpb25zLT5tb25pdG9yX21hdGNobWFrZXIgIT0gTlVMTCkKKyAgICAgICAgYnVzX21hdGNobWFrZXJfdW5yZWYgKGNvbm5lY3Rpb25zLT5tb25pdG9yX21hdGNobWFrZXIpOworCisgICAgICBkYnVzX2ZyZWUgKGNvbm5lY3Rpb25zKTsKKworICAgICAgZGJ1c19jb25uZWN0aW9uX2ZyZWVfZGF0YV9zbG90ICgmY29ubmVjdGlvbl9kYXRhX3Nsb3QpOworICAgIH0KK30KKworLyogVXNlZCBmb3IgbG9nZ2luZyAqLworc3RhdGljIGRidXNfYm9vbF90CitjYWNoZV9wZWVyX2xvZ2luZm9fc3RyaW5nIChCdXNDb25uZWN0aW9uRGF0YSAqZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAgICAqY29ubmVjdGlvbikKK3sKKyAgREJ1c1N0cmluZyBsb2dpbmZvX2J1ZjsKKyAgdW5zaWduZWQgbG9uZyB1aWQ7CisgIHVuc2lnbmVkIGxvbmcgcGlkOworICBjaGFyICp3aW5kb3dzX3NpZCA9IE5VTEwsICpzZWN1cml0eV9sYWJlbCA9IE5VTEw7CisgIGRidXNfYm9vbF90IHByZXZfYWRkZWQ7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmxvZ2luZm9fYnVmKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIAorICBwcmV2X2FkZGVkID0gRkFMU0U7CisgIGlmIChkYnVzX2Nvbm5lY3Rpb25fZ2V0X3VuaXhfdXNlciAoY29ubmVjdGlvbiwgJnVpZCkpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX3ByaW50ZiAoJmxvZ2luZm9fYnVmLCAidWlkPSVsZCIsIHVpZCkpCisgICAgICAgIGdvdG8gb29tOworICAgICAgZWxzZQorICAgICAgICBwcmV2X2FkZGVkID0gVFJVRTsKKyAgICB9CisKKyAgaWYgKGRidXNfY29ubmVjdGlvbl9nZXRfdW5peF9wcm9jZXNzX2lkIChjb25uZWN0aW9uLCAmcGlkKSkKKyAgICB7CisgICAgICBpZiAocHJldl9hZGRlZCkKKyAgICAgICAgeworICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlICgmbG9naW5mb19idWYsICcgJykpCisgICAgICAgICAgICBnb3RvIG9vbTsKKyAgICAgICAgfQorICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX3ByaW50ZiAoJmxvZ2luZm9fYnVmLCAicGlkPSVsZCBjb21tPVwiIiwgcGlkKSkKKyAgICAgICAgZ290byBvb207CisgICAgICAvKiBJZ25vcmUgZXJyb3JzIGhlcmU7IHdlIG1heSBub3QgaGF2ZSBwZXJtaXNzaW9ucyB0byByZWFkIHRoZQorICAgICAgICogcHJvYyBmaWxlLiAqLworICAgICAgX2RidXNfY29tbWFuZF9mb3JfcGlkIChwaWQsICZsb2dpbmZvX2J1ZiwgTUFYX0xPR19DT01NQU5EX0xFTiwgTlVMTCk7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfYnl0ZSAoJmxvZ2luZm9fYnVmLCAnIicpKQorICAgICAgICBnb3RvIG9vbTsKKyAgICAgIGVsc2UKKyAgICAgICAgcHJldl9hZGRlZCA9IFRSVUU7CisgICAgfQorCisgIGlmIChkYnVzX2Nvbm5lY3Rpb25fZ2V0X3dpbmRvd3NfdXNlciAoY29ubmVjdGlvbiwgJndpbmRvd3Nfc2lkKSkKKyAgICB7CisgICAgICBkYnVzX2Jvb2xfdCBkaWRfYXBwZW5kOworCisgICAgICBpZiAocHJldl9hZGRlZCkKKyAgICAgICAgeworICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlICgmbG9naW5mb19idWYsICcgJykpCisgICAgICAgICAgICBnb3RvIG9vbTsKKyAgICAgICAgfQorCisgICAgICBkaWRfYXBwZW5kID0gX2RidXNfc3RyaW5nX2FwcGVuZF9wcmludGYgKCZsb2dpbmZvX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNpZD1cIiVzXCIiLCB3aW5kb3dzX3NpZCk7CisgICAgICBkYnVzX2ZyZWUgKHdpbmRvd3Nfc2lkKTsKKyAgICAgIHdpbmRvd3Nfc2lkID0gTlVMTDsKKyAgICAgIGlmICghZGlkX2FwcGVuZCkKKyAgICAgICAgZ290byBvb207CisgICAgICBlbHNlCisgICAgICAgIHByZXZfYWRkZWQgPSBUUlVFOworICAgIH0KKworICBpZiAoX2RidXNfY29ubmVjdGlvbl9nZXRfbGludXhfc2VjdXJpdHlfbGFiZWwgKGNvbm5lY3Rpb24sICZzZWN1cml0eV9sYWJlbCkpCisgICAgeworICAgICAgZGJ1c19ib29sX3QgZGlkX2FwcGVuZDsKKworICAgICAgaWYgKHByZXZfYWRkZWQpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfYnl0ZSAoJmxvZ2luZm9fYnVmLCAnICcpKQorICAgICAgICAgICAgZ290byBvb207CisgICAgICAgIH0KKworICAgICAgZGlkX2FwcGVuZCA9IF9kYnVzX3N0cmluZ19hcHBlbmRfcHJpbnRmICgmbG9naW5mb19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsYWJlbD1cIiVzXCIiLCBzZWN1cml0eV9sYWJlbCk7CisgICAgICBkYnVzX2ZyZWUgKHNlY3VyaXR5X2xhYmVsKTsKKyAgICAgIHNlY3VyaXR5X2xhYmVsID0gTlVMTDsKKyAgICAgIGlmICghZGlkX2FwcGVuZCkKKyAgICAgICAgZ290byBvb207CisgICAgICBlbHNlCisgICAgICAgIHByZXZfYWRkZWQgPSBUUlVFOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19zdGVhbF9kYXRhICgmbG9naW5mb19idWYsICYoZC0+Y2FjaGVkX2xvZ2luZm9fc3RyaW5nKSkpCisgICAgZ290byBvb207CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZsb2dpbmZvX2J1Zik7IAorCisgIHJldHVybiBUUlVFOworb29tOgorICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZsb2dpbmZvX2J1Zik7CisgICBpZiAoc2VjdXJpdHlfbGFiZWwgIT0gTlVMTCkKKyAgICAgZGJ1c19mcmVlIChzZWN1cml0eV9sYWJlbCk7CisgICBpZiAod2luZG93c19zaWQgIT0gTlVMTCkKKyAgICAgZGJ1c19mcmVlICh3aW5kb3dzX3NpZCk7CisKKyAgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIHZvaWQKK2NoZWNrX3BlbmRpbmdfZmRzX2NiIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgQnVzQ29ubmVjdGlvbkRhdGEgKmQgPSBCVVNfQ09OTkVDVElPTl9EQVRBIChjb25uZWN0aW9uKTsKKyAgaW50IG5fcGVuZGluZ191bml4X2Zkc19vbGQ7CisgIGludCBuX3BlbmRpbmdfdW5peF9mZHNfbmV3OworCisgIF9kYnVzX2Fzc2VydChkICE9IE5VTEwpOworCisgIG5fcGVuZGluZ191bml4X2Zkc19vbGQgPSBkLT5uX3BlbmRpbmdfdW5peF9mZHM7CisgIG5fcGVuZGluZ191bml4X2Zkc19uZXcgPSBfZGJ1c19jb25uZWN0aW9uX2dldF9wZW5kaW5nX2Zkc19jb3VudCAoY29ubmVjdGlvbik7CisKKyAgX2RidXNfdmVyYm9zZSAoIlBlbmRpbmcgZmRzIGNvdW50IGNoYW5nZWQgb24gY29ubmVjdGlvbiAlcDogJWQgLT4gJWRcbiIsCisgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24sIG5fcGVuZGluZ191bml4X2Zkc19vbGQsIG5fcGVuZGluZ191bml4X2Zkc19uZXcpOworCisgIGlmIChuX3BlbmRpbmdfdW5peF9mZHNfb2xkID09IDAgJiYgbl9wZW5kaW5nX3VuaXhfZmRzX25ldyA+IDApCisgICAgeworICAgICAgX2RidXNfdGltZW91dF9yZXN0YXJ0IChkLT5wZW5kaW5nX3VuaXhfZmRzX3RpbWVvdXQsCisgICAgICAgICAgICAgIGJ1c19jb250ZXh0X2dldF9wZW5kaW5nX2ZkX3RpbWVvdXQgKGQtPmNvbm5lY3Rpb25zLT5jb250ZXh0KSk7CisgICAgfQorCisgIGlmIChuX3BlbmRpbmdfdW5peF9mZHNfb2xkID4gMCAmJiBuX3BlbmRpbmdfdW5peF9mZHNfbmV3ID09IDApCisgICAgeworICAgICAgX2RidXNfdGltZW91dF9kaXNhYmxlIChkLT5wZW5kaW5nX3VuaXhfZmRzX3RpbWVvdXQpOworICAgIH0KKworCisgIGQtPm5fcGVuZGluZ191bml4X2ZkcyA9IG5fcGVuZGluZ191bml4X2Zkc19uZXc7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorcGVuZGluZ191bml4X2Zkc190aW1lb3V0X2NiICh2b2lkICpkYXRhKQoreworICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IGRhdGE7CisgIEJ1c0Nvbm5lY3Rpb25EYXRhICpkID0gQlVTX0NPTk5FQ1RJT05fREFUQSAoY29ubmVjdGlvbik7CisgIGludCBsaW1pdDsKKworICBfZGJ1c19hc3NlcnQgKGQgIT0gTlVMTCk7CisgIGxpbWl0ID0gYnVzX2NvbnRleHRfZ2V0X3BlbmRpbmdfZmRfdGltZW91dCAoZC0+Y29ubmVjdGlvbnMtPmNvbnRleHQpOworICBidXNfY29udGV4dF9sb2cgKGQtPmNvbm5lY3Rpb25zLT5jb250ZXh0LCBEQlVTX1NZU1RFTV9MT0dfV0FSTklORywKKyAgICAgICJDb25uZWN0aW9uIFwiJXNcIiAoJXMpIGhhcyBoYWQgVW5peCBmZHMgcGVuZGluZyBmb3IgdG9vIGxvbmcsICIKKyAgICAgICJjbG9zaW5nIGl0IChwZW5kaW5nX2ZkX3RpbWVvdXQ9JWQgbXMpIiwKKyAgICAgIGQtPm5hbWUgIT0gTlVMTCA/IGQtPm5hbWUgOiAiKG51bGwpIiwKKyAgICAgIGJ1c19jb25uZWN0aW9uX2dldF9sb2dpbmZvIChjb25uZWN0aW9uKSwKKyAgICAgIGxpbWl0KTsKKworICBkYnVzX2Nvbm5lY3Rpb25fY2xvc2UgKGNvbm5lY3Rpb24pOworICByZXR1cm4gVFJVRTsKK30KKworZGJ1c19ib29sX3QKK2J1c19jb25uZWN0aW9uc19zZXR1cF9jb25uZWN0aW9uIChCdXNDb25uZWN0aW9ucyAqY29ubmVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisKKyAgQnVzQ29ubmVjdGlvbkRhdGEgKmQgPSBOVUxMOworICBEQnVzRXJyb3IgZXJyb3I7CisKKyAgZCA9IGRidXNfbmV3MCAoQnVzQ29ubmVjdGlvbkRhdGEsIDEpOworICAKKyAgaWYgKGQgPT0gTlVMTCkKKyAgICBnb3RvIG9vbTsKKworICBkLT5jb25uZWN0aW9ucyA9IGNvbm5lY3Rpb25zOworICBkLT5jb25uZWN0aW9uID0gY29ubmVjdGlvbjsKKyAgCisgIF9kYnVzX2dldF9tb25vdG9uaWNfdGltZSAoJmQtPmNvbm5lY3Rpb25fdHZfc2VjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkLT5jb25uZWN0aW9uX3R2X3VzZWMpOworICAKKyAgX2RidXNfYXNzZXJ0IChjb25uZWN0aW9uX2RhdGFfc2xvdCA+PSAwKTsKKyAgCisgIGlmICghZGJ1c19jb25uZWN0aW9uX3NldF9kYXRhIChjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbl9kYXRhX3Nsb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLCBmcmVlX2Nvbm5lY3Rpb25fZGF0YSkpCisgICAgeworICAgICAgLyogV2UgaGF2ZSB0byBmcmVlIGQgZXhwbGljaXRseSwgYmVjYXVzZSB0aGlzIGlzIHRoZSBvbmx5IGNvZGUKKyAgICAgICAqIHBhdGggd2hlcmUgaXQncyBub24tTlVMTCBidXQgZGJ1c19jb25uZWN0aW9uX3NldF9kYXRhKCkgaGFzbid0CisgICAgICAgKiB0YWtlbiByZXNwb25zaWJpbGl0eSBmb3IgZnJlZWluZyBpdC4gKi8KKyAgICAgIGRidXNfZnJlZSAoZCk7CisgICAgICBkID0gTlVMTDsKKyAgICAgIGdvdG8gb29tOworICAgIH0KKworICBkYnVzX2Nvbm5lY3Rpb25fc2V0X3JvdXRlX3BlZXJfbWVzc2FnZXMgKGNvbm5lY3Rpb24sIFRSVUUpOworCisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKyAgZC0+c2VsaW51eF9pZCA9IGJ1c19zZWxpbnV4X2luaXRfY29ubmVjdGlvbl9pZCAoY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKTsKKyAgaWYgKGRidXNfZXJyb3JfaXNfc2V0ICgmZXJyb3IpKQorICAgIHsKKyAgICAgIGJ1c19jb250ZXh0X2xvZyAoY29ubmVjdGlvbnMtPmNvbnRleHQsIERCVVNfU1lTVEVNX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIHNldCB1cCBuZXcgY29ubmVjdGlvbjogJXMiLCBlcnJvci5tZXNzYWdlKTsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgIGQtPmFwcGFybW9yX2NvbmZpbmVtZW50ID0gYnVzX2FwcGFybW9yX2luaXRfY29ubmVjdGlvbl9jb25maW5lbWVudCAoY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpOworICBpZiAoZGJ1c19lcnJvcl9pc19zZXQgKCZlcnJvcikpCisgICAgeworICAgICAgYnVzX2NvbnRleHRfbG9nIChjb25uZWN0aW9ucy0+Y29udGV4dCwgREJVU19TWVNURU1fTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gc2V0IHVwIG5ldyBjb25uZWN0aW9uOiAlcyIsIGVycm9yLm1lc3NhZ2UpOworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2V0X3dhdGNoX2Z1bmN0aW9ucyAoY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkX2Nvbm5lY3Rpb25fd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZV9jb25uZWN0aW9uX3dhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2dnbGVfY29ubmVjdGlvbl93YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpCisgICAgZ290byBvb207CisgIAorICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZXRfdGltZW91dF9mdW5jdGlvbnMgKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkX2Nvbm5lY3Rpb25fdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVfY29ubmVjdGlvbl90aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiwgTlVMTCkpCisgICAgZ290byBvb207CisKKyAgLyogRm9yIG5vdyB3ZSBkb24ndCBuZWVkIHRvIHNldCBhIFdpbmRvd3MgdXNlciBmdW5jdGlvbiBiZWNhdXNlCisgICAqIHRoZXJlIGFyZSBubyBwb2xpY2llcyBpbiB0aGUgY29uZmlnIGZpbGUgY29udHJvbGxpbmcgd2hhdAorICAgKiBXaW5kb3dzIHVzZXJzIGNhbiBjb25uZWN0LiBUaGUgZGVmYXVsdCAnc2FtZSB1c2VyIHRoYXQgb3ducyB0aGUKKyAgICogYnVzIGNhbiBjb25uZWN0JyBiZWhhdmlvciBvZiBEQnVzQ29ubmVjdGlvbiBpcyBmaW5lIG9uIFdpbmRvd3MuCisgICAqLworICBkYnVzX2Nvbm5lY3Rpb25fc2V0X3VuaXhfdXNlcl9mdW5jdGlvbiAoY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3VuaXhfdXNlcl9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwpOworCisgIGRidXNfY29ubmVjdGlvbl9zZXRfZGlzcGF0Y2hfc3RhdHVzX2Z1bmN0aW9uIChjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2hfc3RhdHVzX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVzX2NvbnRleHRfZ2V0X2xvb3AgKGNvbm5lY3Rpb25zLT5jb250ZXh0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworCisgIGQtPmxpbmtfaW5fY29ubmVjdGlvbl9saXN0ID0gX2RidXNfbGlzdF9hbGxvY19saW5rIChjb25uZWN0aW9uKTsKKyAgaWYgKGQtPmxpbmtfaW5fY29ubmVjdGlvbl9saXN0ID09IE5VTEwpCisgICAgZ290byBvb207CisgIAorICAvKiBTZXR1cCB0aGUgY29ubmVjdGlvbiB3aXRoIHRoZSBkaXNwYXRjaGVyICovCisgIGlmICghYnVzX2Rpc3BhdGNoX2FkZF9jb25uZWN0aW9uIChjb25uZWN0aW9uKSkKKyAgICBnb3RvIG9vbTsKKworICBpZiAoZGJ1c19jb25uZWN0aW9uX2dldF9kaXNwYXRjaF9zdGF0dXMgKGNvbm5lY3Rpb24pICE9IERCVVNfRElTUEFUQ0hfQ09NUExFVEUpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19sb29wX3F1ZXVlX2Rpc3BhdGNoIChidXNfY29udGV4dF9nZXRfbG9vcCAoY29ubmVjdGlvbnMtPmNvbnRleHQpLCBjb25uZWN0aW9uKSkKKyAgICAgICAgeworICAgICAgICAgIGJ1c19kaXNwYXRjaF9yZW1vdmVfY29ubmVjdGlvbiAoY29ubmVjdGlvbik7CisgICAgICAgICAgZ290byBvb207CisgICAgICAgIH0KKyAgICB9CisKKyAgLyogU2V0dXAgcGVuZGluZyBmZHMgdGltZW91dCAoc2VlICM4MDU1OSkgKi8KKyAgZC0+cGVuZGluZ191bml4X2Zkc190aW1lb3V0ID0gX2RidXNfdGltZW91dF9uZXcgKDEwMCwgLyogaXJyZWxldmFudCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ191bml4X2Zkc190aW1lb3V0X2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiwgTlVMTCk7CisgIGlmIChkLT5wZW5kaW5nX3VuaXhfZmRzX3RpbWVvdXQgPT0gTlVMTCkKKyAgICBnb3RvIG9vbTsKKworICBfZGJ1c190aW1lb3V0X2Rpc2FibGUgKGQtPnBlbmRpbmdfdW5peF9mZHNfdGltZW91dCk7CisgIGlmICghX2RidXNfbG9vcF9hZGRfdGltZW91dCAoYnVzX2NvbnRleHRfZ2V0X2xvb3AgKGNvbm5lY3Rpb25zLT5jb250ZXh0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLT5wZW5kaW5nX3VuaXhfZmRzX3RpbWVvdXQpKQorICAgIGdvdG8gb29tOworCisgIF9kYnVzX2Nvbm5lY3Rpb25fc2V0X3BlbmRpbmdfZmRzX2Z1bmN0aW9uIChjb25uZWN0aW9uLAorICAgICAgICAgIChEQnVzUGVuZGluZ0Zkc0NoYW5nZUZ1bmN0aW9uKSBjaGVja19wZW5kaW5nX2Zkc19jYiwKKyAgICAgICAgICBjb25uZWN0aW9uKTsKKworICBfZGJ1c19saXN0X2FwcGVuZF9saW5rICgmY29ubmVjdGlvbnMtPmluY29tcGxldGUsIGQtPmxpbmtfaW5fY29ubmVjdGlvbl9saXN0KTsKKyAgY29ubmVjdGlvbnMtPm5faW5jb21wbGV0ZSArPSAxOworICAKKyAgZGJ1c19jb25uZWN0aW9uX3JlZiAoY29ubmVjdGlvbik7CisKKyAgYnVzX2Nvbm5lY3Rpb25zX2V4cGlyZV9pbmNvbXBsZXRlIChjb25uZWN0aW9ucyk7CisgIAorICAvKiBUaGUgbGlzdGVuaW5nIHNvY2tldCBpcyByZW1vdmVkIGZyb20gdGhlIG1haW4gbG9vcCwKKyAgICogaS5lLiBkb2VzIG5vdCBhY2NlcHQoKSwgd2hpbGUgbl9pbmNvbXBsZXRlIGlzIGF0IGl0cworICAgKiBtYXhpbXVtIHZhbHVlOyBzbyB3ZSBzaG91bGRuJ3QgZ2V0IGhlcmUgaW4gdGhhdCBjYXNlICovCisgIF9kYnVzX2Fzc2VydCAoY29ubmVjdGlvbnMtPm5faW5jb21wbGV0ZSA8PQorICAgICAgYnVzX2NvbnRleHRfZ2V0X21heF9pbmNvbXBsZXRlX2Nvbm5lY3Rpb25zIChjb25uZWN0aW9ucy0+Y29udGV4dCkpOworCisgIC8qIElmIHdlIGhhdmUgdGhlIG1heGltdW0gbnVtYmVyIG9mIGluY29tcGxldGUgY29ubmVjdGlvbnMsCisgICAqIHN0b3AgYWNjZXB0KClpbmcgYW55IG1vcmUsIHRvIGF2ZXJ0IGEgRG9TLiBTZWUgZmQubyAjODA5MTkgKi8KKyAgYnVzX2NvbnRleHRfY2hlY2tfYWxsX3dhdGNoZXMgKGQtPmNvbm5lY3Rpb25zLT5jb250ZXh0KTsKKyAgCisgIHJldHVybiBUUlVFOworCitvb206CisgIGJ1c19jb250ZXh0X2xvZyAoY29ubmVjdGlvbnMtPmNvbnRleHQsIERCVVNfU1lTVEVNX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICJObyBtZW1vcnkgdG8gc2V0IHVwIG5ldyBjb25uZWN0aW9uIik7CisgIC8qIGZhbGwgdGhyb3VnaCAqLworZXJyb3I6CisgIGlmIChkICE9IE5VTEwpCisgICAgeworICAgICAgZC0+c2VsaW51eF9pZCA9IE5VTEw7CisKKyAgICAgIGlmIChkLT5hcHBhcm1vcl9jb25maW5lbWVudCkKKyAgICAgICAgYnVzX2FwcGFybW9yX2NvbmZpbmVtZW50X3VucmVmIChkLT5hcHBhcm1vcl9jb25maW5lbWVudCk7CisgICAgICBkLT5hcHBhcm1vcl9jb25maW5lbWVudCA9IE5VTEw7CisgICAgICAKKyAgICAgIGlmICghZGJ1c19jb25uZWN0aW9uX3NldF93YXRjaF9mdW5jdGlvbnMgKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJzZXR0aW5nIHdhdGNoIGZ1bmN0aW9ucyB0byBOVUxMIGZhaWxlZCIpOworICAgICAgCisgICAgICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZXRfdGltZW91dF9mdW5jdGlvbnMgKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJzZXR0aW5nIHRpbWVvdXQgZnVuY3Rpb25zIHRvIE5VTEwgZmFpbGVkIik7CisKKyAgICAgIGRidXNfY29ubmVjdGlvbl9zZXRfdW5peF91c2VyX2Z1bmN0aW9uIChjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwpOworCisgICAgICBkYnVzX2Nvbm5lY3Rpb25fc2V0X3dpbmRvd3NfdXNlcl9mdW5jdGlvbiAoY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICAgIAorICAgICAgZGJ1c19jb25uZWN0aW9uX3NldF9kaXNwYXRjaF9zdGF0dXNfZnVuY3Rpb24gKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCk7CisKKyAgICAgIGlmIChkLT5wZW5kaW5nX3VuaXhfZmRzX3RpbWVvdXQpCisgICAgICAgIF9kYnVzX3RpbWVvdXRfdW5yZWYgKGQtPnBlbmRpbmdfdW5peF9mZHNfdGltZW91dCk7CisKKyAgICAgIGQtPnBlbmRpbmdfdW5peF9mZHNfdGltZW91dCA9IE5VTEw7CisKKyAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fc2V0X3BlbmRpbmdfZmRzX2Z1bmN0aW9uIChjb25uZWN0aW9uLCBOVUxMLCBOVUxMKTsKKworICAgICAgaWYgKGQtPmxpbmtfaW5fY29ubmVjdGlvbl9saXN0ICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19hc3NlcnQgKGQtPmxpbmtfaW5fY29ubmVjdGlvbl9saXN0LT5uZXh0ID09IE5VTEwpOworICAgICAgICAgIF9kYnVzX2Fzc2VydCAoZC0+bGlua19pbl9jb25uZWN0aW9uX2xpc3QtPnByZXYgPT0gTlVMTCk7CisgICAgICAgICAgX2RidXNfbGlzdF9mcmVlX2xpbmsgKGQtPmxpbmtfaW5fY29ubmVjdGlvbl9saXN0KTsKKyAgICAgICAgICBkLT5saW5rX2luX2Nvbm5lY3Rpb25fbGlzdCA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2V0X2RhdGEgKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbl9kYXRhX3Nsb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImZhaWxlZCB0byBzZXQgY29ubmVjdGlvbiBkYXRhIHRvIG51bGwiKTsKKworICAgICAgLyogImQiIGhhcyBub3cgYmVlbiBmcmVlZCAqLworICAgIH0KKyAgCisgIHJldHVybiBGQUxTRTsKK30KKwordm9pZAorYnVzX2Nvbm5lY3Rpb25zX2V4cGlyZV9pbmNvbXBsZXRlIChCdXNDb25uZWN0aW9ucyAqY29ubmVjdGlvbnMpCit7ICAgIAorICBpbnQgbmV4dF9pbnRlcnZhbDsKKworICBuZXh0X2ludGVydmFsID0gLTE7CisgIAorICBpZiAoY29ubmVjdGlvbnMtPmluY29tcGxldGUgIT0gTlVMTCkKKyAgICB7CisgICAgICBsb25nIHR2X3NlYywgdHZfdXNlYzsKKyAgICAgIERCdXNMaXN0ICpsaW5rOworICAgICAgaW50IGF1dGhfdGltZW91dDsKKyAgICAgIAorICAgICAgX2RidXNfZ2V0X21vbm90b25pY190aW1lICgmdHZfc2VjLCAmdHZfdXNlYyk7CisgICAgICBhdXRoX3RpbWVvdXQgPSBidXNfY29udGV4dF9nZXRfYXV0aF90aW1lb3V0IChjb25uZWN0aW9ucy0+Y29udGV4dCk7CisgIAorICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZjb25uZWN0aW9ucy0+aW5jb21wbGV0ZSk7CisgICAgICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgREJ1c0xpc3QgKm5leHQgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZjb25uZWN0aW9ucy0+aW5jb21wbGV0ZSwgbGluayk7CisgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisgICAgICAgICAgQnVzQ29ubmVjdGlvbkRhdGEgKmQ7CisgICAgICAgICAgZG91YmxlIGVsYXBzZWQ7CisgICAgICAKKyAgICAgICAgICBjb25uZWN0aW9uID0gbGluay0+ZGF0YTsKKyAgICAgIAorICAgICAgICAgIGQgPSBCVVNfQ09OTkVDVElPTl9EQVRBIChjb25uZWN0aW9uKTsKKyAgICAgIAorICAgICAgICAgIF9kYnVzX2Fzc2VydCAoZCAhPSBOVUxMKTsKKyAgICAgIAorICAgICAgICAgIGVsYXBzZWQgPSBFTEFQU0VEX01JTExJU0VDT05EU19TSU5DRSAoZC0+Y29ubmVjdGlvbl90dl9zZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLT5jb25uZWN0aW9uX3R2X3VzZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dl9zZWMsIHR2X3VzZWMpOworCisgICAgICAgICAgaWYgKGVsYXBzZWQgPj0gKGRvdWJsZSkgYXV0aF90aW1lb3V0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvKiBVbmZvcnR1bmF0ZWx5LCB3ZSBjYW4ndCBpZGVudGlmeSB0aGUgY29ubmVjdGlvbjogaXQgZG9lc24ndAorICAgICAgICAgICAgICAgKiBoYXZlIGEgdW5pcXVlIG5hbWUgeWV0LCB3ZSBkb24ndCBrbm93IGl0cyB1aWQvcGlkIHlldCwKKyAgICAgICAgICAgICAgICogYW5kIHNvIG9uLiAqLworICAgICAgICAgICAgICBidXNfY29udGV4dF9sb2cgKGNvbm5lY3Rpb25zLT5jb250ZXh0LCBEQlVTX1NZU1RFTV9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICJDb25uZWN0aW9uIGhhcyBub3QgYXV0aGVudGljYXRlZCBzb29uIGVub3VnaCwgY2xvc2luZyBpdCAiCisgICAgICAgICAgICAgICAgICAiKGF1dGhfdGltZW91dD0lZG1zLCBlbGFwc2VkOiAlLjBmbXMpIiwKKyAgICAgICAgICAgICAgICAgIGF1dGhfdGltZW91dCwgZWxhcHNlZCk7CisKKyAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIlRpbWluZyBvdXQgYXV0aGVudGljYXRpb24gZm9yIGNvbm5lY3Rpb24gJXBcbiIsIGNvbm5lY3Rpb24pOworICAgICAgICAgICAgICBkYnVzX2Nvbm5lY3Rpb25fY2xvc2UgKGNvbm5lY3Rpb24pOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogV2UgY2FuIGVuZCB0aGUgbG9vcCwgc2luY2UgdGhlIGNvbm5lY3Rpb25zIGFyZSBpbiBvbGRlc3QtZmlyc3Qgb3JkZXIgKi8KKyAgICAgICAgICAgICAgbmV4dF9pbnRlcnZhbCA9ICgoZG91YmxlKWF1dGhfdGltZW91dCkgLSBlbGFwc2VkOworICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiQ29ubmVjdGlvbiAlcCBhdXRoZW50aWNhdGlvbiBleHBpcmVzIGluICVkIG1pbGxpc2Vjb25kc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiwgbmV4dF9pbnRlcnZhbCk7CisgICAgICAgICAgCisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgCisgICAgICAgICAgbGluayA9IG5leHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgYnVzX2V4cGlyZV90aW1lb3V0X3NldF9pbnRlcnZhbCAoY29ubmVjdGlvbnMtPmV4cGlyZV90aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0X2ludGVydmFsKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitleHBpcmVfaW5jb21wbGV0ZV90aW1lb3V0ICh2b2lkICpkYXRhKQoreworICBCdXNDb25uZWN0aW9ucyAqY29ubmVjdGlvbnMgPSBkYXRhOworCisgIF9kYnVzX3ZlcmJvc2UgKCJSdW5uaW5nXG4iKTsKKyAgCisgIC8qIG5vdGUgdGhhdCB0aGlzIG1heSByZW1vdmUgdGhlIHRpbWVvdXQgKi8KKyAgYnVzX2Nvbm5lY3Rpb25zX2V4cGlyZV9pbmNvbXBsZXRlIChjb25uZWN0aW9ucyk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2RidXNfYm9vbF90CitidXNfY29ubmVjdGlvbl9nZXRfdW5peF9ncm91cHMgIChEQnVzQ29ubmVjdGlvbiAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgICoqZ3JvdXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAqbl9ncm91cHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgdW5zaWduZWQgbG9uZyB1aWQ7CisKKyAgKmdyb3VwcyA9IE5VTEw7CisgICpuX2dyb3VwcyA9IDA7CisKKyAgaWYgKGRidXNfY29ubmVjdGlvbl9nZXRfdW5peF91c2VyIChjb25uZWN0aW9uLCAmdWlkKSkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX3VuaXhfZ3JvdXBzX2Zyb21fdWlkICh1aWQsIGdyb3Vwcywgbl9ncm91cHMpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkRpZCBub3QgZ2V0IGFueSBncm91cHMgZm9yIFVJRCAlbHVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWlkKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJHb3QgJWQgZ3JvdXBzIGZvciBVSUQgJWx1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICpuX2dyb3VwcywgdWlkKTsKKyAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHJldHVybiBUUlVFOyAvKiBzdWNjZXNzZnVsbHkgZ290IDAgZ3JvdXBzICovCit9CisKK2RidXNfYm9vbF90CitidXNfY29ubmVjdGlvbl9pc19pbl91bml4X2dyb3VwIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgICBnaWQpCit7CisgIGludCBpOworICB1bnNpZ25lZCBsb25nICpncm91cF9pZHM7CisgIGludCBuX2dyb3VwX2lkczsKKworICBpZiAoIWJ1c19jb25uZWN0aW9uX2dldF91bml4X2dyb3VwcyAoY29ubmVjdGlvbiwgJmdyb3VwX2lkcywgJm5fZ3JvdXBfaWRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGkgPSAwOworICB3aGlsZSAoaSA8IG5fZ3JvdXBfaWRzKQorICAgIHsKKyAgICAgIGlmIChncm91cF9pZHNbaV0gPT0gZ2lkKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19mcmVlIChncm91cF9pZHMpOworICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICB9CisgICAgICArK2k7CisgICAgfQorCisgIGRidXNfZnJlZSAoZ3JvdXBfaWRzKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCitjb25zdCBjaGFyICoKK2J1c19jb25uZWN0aW9uX2dldF9sb2dpbmZvIChEQnVzQ29ubmVjdGlvbiAgICAgICAgKmNvbm5lY3Rpb24pCit7CisgIEJ1c0Nvbm5lY3Rpb25EYXRhICpkOworICAgIAorICBkID0gQlVTX0NPTk5FQ1RJT05fREFUQSAoY29ubmVjdGlvbik7CisgIF9kYnVzX2Fzc2VydChkICE9IE5VTEwpOworCisgIGlmICghYnVzX2Nvbm5lY3Rpb25faXNfYWN0aXZlIChjb25uZWN0aW9uKSkKKyAgICByZXR1cm4gImluYWN0aXZlIjsKKyAgcmV0dXJuIGQtPmNhY2hlZF9sb2dpbmZvX3N0cmluZzsgIAorfQorCitCdXNDbGllbnRQb2xpY3kqCitidXNfY29ubmVjdGlvbl9nZXRfcG9saWN5IChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgQnVzQ29ubmVjdGlvbkRhdGEgKmQ7CisgICAgCisgIGQgPSBCVVNfQ09OTkVDVElPTl9EQVRBIChjb25uZWN0aW9uKTsKKworICBfZGJ1c19hc3NlcnQgKGQgIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAoZC0+cG9saWN5ICE9IE5VTEwpOworICAKKyAgcmV0dXJuIGQtPnBvbGljeTsKK30KKworc3RhdGljIGRidXNfYm9vbF90Citmb3JlYWNoX2FjdGl2ZSAoQnVzQ29ubmVjdGlvbnMgICAgICAgICAgICAgICAqY29ubmVjdGlvbnMsCisgICAgICAgICAgICAgICAgQnVzQ29ubmVjdGlvbkZvcmVhY2hGdW5jdGlvbiAgZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSkKK3sKKyAgREJ1c0xpc3QgKmxpbms7CisgIAorICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJmNvbm5lY3Rpb25zLT5jb21wbGV0ZWQpOworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uID0gbGluay0+ZGF0YTsKKyAgICAgIERCdXNMaXN0ICpuZXh0ID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmY29ubmVjdGlvbnMtPmNvbXBsZXRlZCwgbGluayk7CisKKyAgICAgIGlmICghKCogZnVuY3Rpb24pIChjb25uZWN0aW9uLCBkYXRhKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgCisgICAgICBsaW5rID0gbmV4dDsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZm9yZWFjaF9pbmFjdGl2ZSAoQnVzQ29ubmVjdGlvbnMgICAgICAgICAgICAgICAqY29ubmVjdGlvbnMsCisgICAgICAgICAgICAgICAgICBCdXNDb25uZWN0aW9uRm9yZWFjaEZ1bmN0aW9uICBmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEpCit7CisgIERCdXNMaXN0ICpsaW5rOworICAKKyAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZjb25uZWN0aW9ucy0+aW5jb21wbGV0ZSk7CisgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgeworICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBsaW5rLT5kYXRhOworICAgICAgREJ1c0xpc3QgKm5leHQgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZjb25uZWN0aW9ucy0+aW5jb21wbGV0ZSwgbGluayk7CisKKyAgICAgIGlmICghKCogZnVuY3Rpb24pIChjb25uZWN0aW9uLCBkYXRhKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgCisgICAgICBsaW5rID0gbmV4dDsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogQ2FsbHMgZnVuY3Rpb24gb24gZWFjaCBhY3RpdmUgY29ubmVjdGlvbjsgaWYgdGhlIGZ1bmN0aW9uIHJldHVybnMKKyAqICNGQUxTRSwgc3RvcHMgaXRlcmF0aW5nLiBBY3RpdmUgY29ubmVjdGlvbnMgYXJlIGF1dGhlbnRpY2F0ZWQKKyAqIGFuZCBoYXZlIHNlbnQgYSBIZWxsbyBtZXNzYWdlLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9ucyB0aGUgY29ubmVjdGlvbnMgb2JqZWN0CisgKiBAcGFyYW0gZnVuY3Rpb24gdGhlIGZ1bmN0aW9uCisgKiBAcGFyYW0gZGF0YSBkYXRhIHRvIHBhc3MgdG8gaXQgYXMgYSBzZWNvbmQgYXJnCisgKi8KK3ZvaWQKK2J1c19jb25uZWN0aW9uc19mb3JlYWNoX2FjdGl2ZSAoQnVzQ29ubmVjdGlvbnMgICAgICAgICAgICAgICAqY29ubmVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c0Nvbm5lY3Rpb25Gb3JlYWNoRnVuY3Rpb24gIGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhKQoreworICBmb3JlYWNoX2FjdGl2ZSAoY29ubmVjdGlvbnMsIGZ1bmN0aW9uLCBkYXRhKTsKK30KKworLyoqCisgKiBDYWxscyBmdW5jdGlvbiBvbiBlYWNoIGNvbm5lY3Rpb247IGlmIHRoZSBmdW5jdGlvbiByZXR1cm5zCisgKiAjRkFMU0UsIHN0b3BzIGl0ZXJhdGluZy4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbnMgdGhlIGNvbm5lY3Rpb25zIG9iamVjdAorICogQHBhcmFtIGZ1bmN0aW9uIHRoZSBmdW5jdGlvbgorICogQHBhcmFtIGRhdGEgZGF0YSB0byBwYXNzIHRvIGl0IGFzIGEgc2Vjb25kIGFyZworICovCit2b2lkCitidXNfY29ubmVjdGlvbnNfZm9yZWFjaCAoQnVzQ29ubmVjdGlvbnMgICAgICAgICAgICAgICAqY29ubmVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgQnVzQ29ubmVjdGlvbkZvcmVhY2hGdW5jdGlvbiAgZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSkKK3sKKyAgaWYgKCFmb3JlYWNoX2FjdGl2ZSAoY29ubmVjdGlvbnMsIGZ1bmN0aW9uLCBkYXRhKSkKKyAgICByZXR1cm47CisKKyAgZm9yZWFjaF9pbmFjdGl2ZSAoY29ubmVjdGlvbnMsIGZ1bmN0aW9uLCBkYXRhKTsKK30KKworQnVzQ29udGV4dCoKK2J1c19jb25uZWN0aW9uc19nZXRfY29udGV4dCAoQnVzQ29ubmVjdGlvbnMgKmNvbm5lY3Rpb25zKQoreworICByZXR1cm4gY29ubmVjdGlvbnMtPmNvbnRleHQ7Cit9CisKKy8qCisgKiBUaGlzIGlzIHVzZWQgdG8gYXZvaWQgY292ZXJpbmcgdGhlIHNhbWUgY29ubmVjdGlvbiB0d2ljZSB3aGVuCisgKiB0cmF2ZXJzaW5nIGNvbm5lY3Rpb25zLiBOb3RlIHRoYXQgaXQgYXNzdW1lcyB3ZSB3aWxsCisgKiBidXNfY29ubmVjdGlvbl9tYXJrX3N0YW1wKCkgZWFjaCBjb25uZWN0aW9uIGF0IGxlYXN0IG9uY2UgcGVyCisgKiBJTlRfTUFYIGluY3JlbWVudHMgb2YgdGhlIGdsb2JhbCBzdGFtcCwgb3Igd3JhcGFyb3VuZCB3b3VsZCBicmVhaworICogdGhpbmdzLgorICovCit2b2lkCitidXNfY29ubmVjdGlvbnNfaW5jcmVtZW50X3N0YW1wIChCdXNDb25uZWN0aW9ucyAqY29ubmVjdGlvbnMpCit7CisgIGNvbm5lY3Rpb25zLT5zdGFtcCArPSAxOworfQorCisvKiBNYXJrIGNvbm5lY3Rpb24gd2l0aCBjdXJyZW50IHN0YW1wLCByZXR1cm4gVFJVRSBpZiBpdAorICogZGlkbid0IGFscmVhZHkgaGF2ZSB0aGF0IHN0YW1wCisgKi8KK2RidXNfYm9vbF90CitidXNfY29ubmVjdGlvbl9tYXJrX3N0YW1wIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgQnVzQ29ubmVjdGlvbkRhdGEgKmQ7CisgIAorICBkID0gQlVTX0NPTk5FQ1RJT05fREFUQSAoY29ubmVjdGlvbik7CisgIAorICBfZGJ1c19hc3NlcnQgKGQgIT0gTlVMTCk7CisKKyAgaWYgKGQtPnN0YW1wID09IGQtPmNvbm5lY3Rpb25zLT5zdGFtcCkKKyAgICByZXR1cm4gRkFMU0U7CisgIGVsc2UKKyAgICB7CisgICAgICBkLT5zdGFtcCA9IGQtPmNvbm5lY3Rpb25zLT5zdGFtcDsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KK30KKworQnVzQ29udGV4dCoKK2J1c19jb25uZWN0aW9uX2dldF9jb250ZXh0IChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgQnVzQ29ubmVjdGlvbkRhdGEgKmQ7CisKKyAgZCA9IEJVU19DT05ORUNUSU9OX0RBVEEgKGNvbm5lY3Rpb24pOworCisgIF9kYnVzX2Fzc2VydCAoZCAhPSBOVUxMKTsKKworICByZXR1cm4gZC0+Y29ubmVjdGlvbnMtPmNvbnRleHQ7Cit9CisKK0J1c0Nvbm5lY3Rpb25zKgorYnVzX2Nvbm5lY3Rpb25fZ2V0X2Nvbm5lY3Rpb25zIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgQnVzQ29ubmVjdGlvbkRhdGEgKmQ7CisgICAgCisgIGQgPSBCVVNfQ09OTkVDVElPTl9EQVRBIChjb25uZWN0aW9uKTsKKworICBfZGJ1c19hc3NlcnQgKGQgIT0gTlVMTCk7CisKKyAgcmV0dXJuIGQtPmNvbm5lY3Rpb25zOworfQorCitCdXNSZWdpc3RyeSoKK2J1c19jb25uZWN0aW9uX2dldF9yZWdpc3RyeSAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIEJ1c0Nvbm5lY3Rpb25EYXRhICpkOworCisgIGQgPSBCVVNfQ09OTkVDVElPTl9EQVRBIChjb25uZWN0aW9uKTsKKworICBfZGJ1c19hc3NlcnQgKGQgIT0gTlVMTCk7CisKKyAgcmV0dXJuIGJ1c19jb250ZXh0X2dldF9yZWdpc3RyeSAoZC0+Y29ubmVjdGlvbnMtPmNvbnRleHQpOworfQorCitCdXNBY3RpdmF0aW9uKgorYnVzX2Nvbm5lY3Rpb25fZ2V0X2FjdGl2YXRpb24gKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBCdXNDb25uZWN0aW9uRGF0YSAqZDsKKworICBkID0gQlVTX0NPTk5FQ1RJT05fREFUQSAoY29ubmVjdGlvbik7CisKKyAgX2RidXNfYXNzZXJ0IChkICE9IE5VTEwpOworCisgIHJldHVybiBidXNfY29udGV4dF9nZXRfYWN0aXZhdGlvbiAoZC0+Y29ubmVjdGlvbnMtPmNvbnRleHQpOworfQorCitCdXNNYXRjaG1ha2VyKgorYnVzX2Nvbm5lY3Rpb25fZ2V0X21hdGNobWFrZXIgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBCdXNDb25uZWN0aW9uRGF0YSAqZDsKKworICBkID0gQlVTX0NPTk5FQ1RJT05fREFUQSAoY29ubmVjdGlvbik7CisKKyAgX2RidXNfYXNzZXJ0IChkICE9IE5VTEwpOworCisgIHJldHVybiBidXNfY29udGV4dF9nZXRfbWF0Y2htYWtlciAoZC0+Y29ubmVjdGlvbnMtPmNvbnRleHQpOworfQorCitCdXNTRUxpbnV4SUQqCitidXNfY29ubmVjdGlvbl9nZXRfc2VsaW51eF9pZCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIEJ1c0Nvbm5lY3Rpb25EYXRhICpkOworCisgIGQgPSBCVVNfQ09OTkVDVElPTl9EQVRBIChjb25uZWN0aW9uKTsKKworICBfZGJ1c19hc3NlcnQgKGQgIT0gTlVMTCk7CisKKyAgcmV0dXJuIGQtPnNlbGludXhfaWQ7Cit9CisKK0J1c0FwcEFybW9yQ29uZmluZW1lbnQqCitidXNfY29ubmVjdGlvbl9kdXBfYXBwYXJtb3JfY29uZmluZW1lbnQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBCdXNDb25uZWN0aW9uRGF0YSAqZDsKKworICBkID0gQlVTX0NPTk5FQ1RJT05fREFUQSAoY29ubmVjdGlvbik7CisKKyAgX2RidXNfYXNzZXJ0IChkICE9IE5VTEwpOworCisgIGJ1c19hcHBhcm1vcl9jb25maW5lbWVudF9yZWYgKGQtPmFwcGFybW9yX2NvbmZpbmVtZW50KTsKKyAgcmV0dXJuIGQtPmFwcGFybW9yX2NvbmZpbmVtZW50OworfQorCisvKioKKyAqIENoZWNrcyB3aGV0aGVyIHRoZSBjb25uZWN0aW9uIGlzIHJlZ2lzdGVyZWQgd2l0aCB0aGUgbWVzc2FnZSBidXMuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm5zICNUUlVFIGlmIHdlJ3JlIGFuIGFjdGl2ZSBtZXNzYWdlIGJ1cyBwYXJ0aWNpcGFudAorICovCitkYnVzX2Jvb2xfdAorYnVzX2Nvbm5lY3Rpb25faXNfYWN0aXZlIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgQnVzQ29ubmVjdGlvbkRhdGEgKmQ7CisKKyAgZCA9IEJVU19DT05ORUNUSU9OX0RBVEEgKGNvbm5lY3Rpb24pOworICBfZGJ1c19hc3NlcnQoZCAhPSBOVUxMKTsKKyAgCisgIHJldHVybiBkLT5uYW1lICE9IE5VTEw7Cit9CisKK2RidXNfYm9vbF90CitidXNfY29ubmVjdGlvbl9wcmVhbGxvY2F0ZV9vb21fZXJyb3IgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBEQnVzTWVzc2FnZSAqbWVzc2FnZTsKKyAgREJ1c1ByZWFsbG9jYXRlZFNlbmQgKnByZWFsbG9jYXRlZDsKKyAgQnVzQ29ubmVjdGlvbkRhdGEgKmQ7CisKKyAgZCA9IEJVU19DT05ORUNUSU9OX0RBVEEgKGNvbm5lY3Rpb24pOyAgCisKKyAgX2RidXNfYXNzZXJ0IChkICE9IE5VTEwpOworCisgIGlmIChkLT5vb21fcHJlYWxsb2NhdGVkICE9IE5VTEwpCisgICAgcmV0dXJuIFRSVUU7CisgIAorICBwcmVhbGxvY2F0ZWQgPSBkYnVzX2Nvbm5lY3Rpb25fcHJlYWxsb2NhdGVfc2VuZCAoY29ubmVjdGlvbik7CisgIGlmIChwcmVhbGxvY2F0ZWQgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXcgKERCVVNfTUVTU0FHRV9UWVBFX0VSUk9SKTsKKworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfY29ubmVjdGlvbl9mcmVlX3ByZWFsbG9jYXRlZF9zZW5kIChjb25uZWN0aW9uLCBwcmVhbGxvY2F0ZWQpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAvKiBkLT5uYW1lIG1heSBiZSBOVUxMLCBidXQgdGhhdCBpcyBPSyAqLworICBpZiAoIWRidXNfbWVzc2FnZV9zZXRfZXJyb3JfbmFtZSAobWVzc2FnZSwgREJVU19FUlJPUl9OT19NRU1PUlkpIHx8CisgICAgICAhZGJ1c19tZXNzYWdlX3NldF9kZXN0aW5hdGlvbiAobWVzc2FnZSwgZC0+bmFtZSkgfHwKKyAgICAgICFkYnVzX21lc3NhZ2Vfc2V0X3NlbmRlciAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19TRVJWSUNFX0RCVVMpKQorICAgIHsKKyAgICAgIGRidXNfY29ubmVjdGlvbl9mcmVlX3ByZWFsbG9jYXRlZF9zZW5kIChjb25uZWN0aW9uLCBwcmVhbGxvY2F0ZWQpOworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIAorICAvKiBzZXQgcmVwbHkgc2VyaWFsIHRvIHBsYWNlaG9sZGVyIHZhbHVlIGp1c3Qgc28gc3BhY2UgaXMgYWxyZWFkeSBhbGxvY2F0ZWQKKyAgICogZm9yIGl0LgorICAgKi8KKyAgaWYgKCFkYnVzX21lc3NhZ2Vfc2V0X3JlcGx5X3NlcmlhbCAobWVzc2FnZSwgMTQpKQorICAgIHsKKyAgICAgIGRidXNfY29ubmVjdGlvbl9mcmVlX3ByZWFsbG9jYXRlZF9zZW5kIChjb25uZWN0aW9uLCBwcmVhbGxvY2F0ZWQpOworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgZC0+b29tX21lc3NhZ2UgPSBtZXNzYWdlOworICBkLT5vb21fcHJlYWxsb2NhdGVkID0gcHJlYWxsb2NhdGVkOworICAKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3ZvaWQKK2J1c19jb25uZWN0aW9uX3NlbmRfb29tX2Vycm9yIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAqaW5fcmVwbHlfdG8pCit7CisgIEJ1c0Nvbm5lY3Rpb25EYXRhICpkOworCisgIGQgPSBCVVNfQ09OTkVDVElPTl9EQVRBIChjb25uZWN0aW9uKTsgIAorCisgIF9kYnVzX2Fzc2VydCAoZCAhPSBOVUxMKTsgIAorICBfZGJ1c19hc3NlcnQgKGQtPm9vbV9tZXNzYWdlICE9IE5VTEwpOworCisgIGJ1c19jb250ZXh0X2xvZyAoZC0+Y29ubmVjdGlvbnMtPmNvbnRleHQsIERCVVNfU1lTVEVNX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICJkYnVzLWRhZW1vbiB0cmFuc2FjdGlvbiBmYWlsZWQgKE9PTSksIHNlbmRpbmcgZXJyb3IgdG8gIgorICAgICAgICAgICAgICAgICAgICJzZW5kZXIgJXMiLCBidXNfY29ubmVjdGlvbl9nZXRfbG9naW5mbyAoY29ubmVjdGlvbikpOworCisgIC8qIHNob3VsZCBhbHdheXMgc3VjY2VlZCBzaW5jZSB3ZSBzZXQgaXQgdG8gYSBwbGFjZWhvbGRlciBlYXJsaWVyICovCisgIGlmICghZGJ1c19tZXNzYWdlX3NldF9yZXBseV9zZXJpYWwgKGQtPm9vbV9tZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3NlcmlhbCAoaW5fcmVwbHlfdG8pKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJGYWlsZWQgdG8gc2V0IHJlcGx5IHNlcmlhbCBmb3IgcHJlYWxsb2NhdGVkIG9vbSBtZXNzYWdlIik7CisKKyAgX2RidXNfYXNzZXJ0IChkYnVzX21lc3NhZ2VfZ2V0X3NlbmRlciAoZC0+b29tX21lc3NhZ2UpICE9IE5VTEwpOworICAKKyAgZGJ1c19jb25uZWN0aW9uX3NlbmRfcHJlYWxsb2NhdGVkIChjb25uZWN0aW9uLCBkLT5vb21fcHJlYWxsb2NhdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQtPm9vbV9tZXNzYWdlLCBOVUxMKTsKKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKGQtPm9vbV9tZXNzYWdlKTsKKyAgZC0+b29tX21lc3NhZ2UgPSBOVUxMOworICBkLT5vb21fcHJlYWxsb2NhdGVkID0gTlVMTDsKK30KKworI2lmZGVmIERCVVNfRU5BQkxFX1NUQVRTCitzdGF0aWMgdm9pZAordXBkYXRlX3BlYWsgKGludCAqcGVhaywKKyAgICAgICAgICAgICBpbnQgbikKK3sKKyAgaWYgKCpwZWFrIDwgbikKKyAgICAqcGVhayA9IG47Cit9CisjZW5kaWYKKwordm9pZAorYnVzX2Nvbm5lY3Rpb25fYWRkX21hdGNoX3J1bGVfbGluayAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAgICAgICAqbGluaykKK3sKKyAgQnVzQ29ubmVjdGlvbkRhdGEgKmQ7CisKKyAgZCA9IEJVU19DT05ORUNUSU9OX0RBVEEgKGNvbm5lY3Rpb24pOworICBfZGJ1c19hc3NlcnQgKGQgIT0gTlVMTCk7CisKKyAgX2RidXNfbGlzdF9hcHBlbmRfbGluayAoJmQtPm1hdGNoX3J1bGVzLCBsaW5rKTsKKworICBkLT5uX21hdGNoX3J1bGVzICs9IDE7CisKKyNpZmRlZiBEQlVTX0VOQUJMRV9TVEFUUworICB1cGRhdGVfcGVhayAoJmQtPnBlYWtfbWF0Y2hfcnVsZXMsIGQtPm5fbWF0Y2hfcnVsZXMpOworICB1cGRhdGVfcGVhayAoJmQtPmNvbm5lY3Rpb25zLT5wZWFrX21hdGNoX3J1bGVzX3Blcl9jb25uLCBkLT5uX21hdGNoX3J1bGVzKTsKKworICBkLT5jb25uZWN0aW9ucy0+dG90YWxfbWF0Y2hfcnVsZXMgKz0gMTsKKyAgdXBkYXRlX3BlYWsgKCZkLT5jb25uZWN0aW9ucy0+cGVha19tYXRjaF9ydWxlcywKKyAgICAgICAgICAgICAgIGQtPmNvbm5lY3Rpb25zLT50b3RhbF9tYXRjaF9ydWxlcyk7CisjZW5kaWYKK30KKworZGJ1c19ib29sX3QKK2J1c19jb25uZWN0aW9uX2FkZF9tYXRjaF9ydWxlIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNNYXRjaFJ1bGUgICAqcnVsZSkKK3sKKyAgICBEQnVzTGlzdCAqbGluazsKKworICBsaW5rID0gX2RidXNfbGlzdF9hbGxvY19saW5rIChydWxlKTsKKworICBpZiAobGluayA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKworICBidXNfY29ubmVjdGlvbl9hZGRfbWF0Y2hfcnVsZV9saW5rIChjb25uZWN0aW9uLCBsaW5rKTsKKworICByZXR1cm4gVFJVRTsKK30KKwordm9pZAorYnVzX2Nvbm5lY3Rpb25fcmVtb3ZlX21hdGNoX3J1bGUgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c01hdGNoUnVsZSAgICpydWxlKQoreworICBCdXNDb25uZWN0aW9uRGF0YSAqZDsKKworICBkID0gQlVTX0NPTk5FQ1RJT05fREFUQSAoY29ubmVjdGlvbik7CisgIF9kYnVzX2Fzc2VydCAoZCAhPSBOVUxMKTsKKworICBfZGJ1c19saXN0X3JlbW92ZV9sYXN0ICgmZC0+bWF0Y2hfcnVsZXMsIHJ1bGUpOworCisgIGQtPm5fbWF0Y2hfcnVsZXMgLT0gMTsKKyAgX2RidXNfYXNzZXJ0IChkLT5uX21hdGNoX3J1bGVzID49IDApOworCisjaWZkZWYgREJVU19FTkFCTEVfU1RBVFMKKyAgZC0+Y29ubmVjdGlvbnMtPnRvdGFsX21hdGNoX3J1bGVzIC09IDE7CisjZW5kaWYKK30KKworaW50CitidXNfY29ubmVjdGlvbl9nZXRfbl9tYXRjaF9ydWxlcyAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIEJ1c0Nvbm5lY3Rpb25EYXRhICpkOworCisgIGQgPSBCVVNfQ09OTkVDVElPTl9EQVRBIChjb25uZWN0aW9uKTsKKyAgX2RidXNfYXNzZXJ0IChkICE9IE5VTEwpOworICAKKyAgcmV0dXJuIGQtPm5fbWF0Y2hfcnVsZXM7Cit9CisKK3ZvaWQKK2J1c19jb25uZWN0aW9uX2FkZF9vd25lZF9zZXJ2aWNlX2xpbmsgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICAgICAgKmxpbmspCit7CisgIEJ1c0Nvbm5lY3Rpb25EYXRhICpkOworCisgIGQgPSBCVVNfQ09OTkVDVElPTl9EQVRBIChjb25uZWN0aW9uKTsKKyAgX2RidXNfYXNzZXJ0IChkICE9IE5VTEwpOworCisgIF9kYnVzX2xpc3RfYXBwZW5kX2xpbmsgKCZkLT5zZXJ2aWNlc19vd25lZCwgbGluayk7CisKKyAgZC0+bl9zZXJ2aWNlc19vd25lZCArPSAxOworCisjaWZkZWYgREJVU19FTkFCTEVfU1RBVFMKKyAgdXBkYXRlX3BlYWsgKCZkLT5wZWFrX2J1c19uYW1lcywgZC0+bl9zZXJ2aWNlc19vd25lZCk7CisgIHVwZGF0ZV9wZWFrICgmZC0+Y29ubmVjdGlvbnMtPnBlYWtfYnVzX25hbWVzX3Blcl9jb25uLAorICAgICAgICAgICAgICAgZC0+bl9zZXJ2aWNlc19vd25lZCk7CisKKyAgZC0+Y29ubmVjdGlvbnMtPnRvdGFsX2J1c19uYW1lcyArPSAxOworICB1cGRhdGVfcGVhayAoJmQtPmNvbm5lY3Rpb25zLT5wZWFrX2J1c19uYW1lcywKKyAgICAgICAgICAgICAgIGQtPmNvbm5lY3Rpb25zLT50b3RhbF9idXNfbmFtZXMpOworI2VuZGlmCit9CisKK2RidXNfYm9vbF90CitidXNfY29ubmVjdGlvbl9hZGRfb3duZWRfc2VydmljZSAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzU2VydmljZSAgICAgKnNlcnZpY2UpCit7CisgIERCdXNMaXN0ICpsaW5rOworCisgIGxpbmsgPSBfZGJ1c19saXN0X2FsbG9jX2xpbmsgKHNlcnZpY2UpOworCisgIGlmIChsaW5rID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGJ1c19jb25uZWN0aW9uX2FkZF9vd25lZF9zZXJ2aWNlX2xpbmsgKGNvbm5lY3Rpb24sIGxpbmspOworCisgIHJldHVybiBUUlVFOworfQorCit2b2lkCitidXNfY29ubmVjdGlvbl9yZW1vdmVfb3duZWRfc2VydmljZSAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzU2VydmljZSAgICAgKnNlcnZpY2UpCit7CisgIEJ1c0Nvbm5lY3Rpb25EYXRhICpkOworCisgIGQgPSBCVVNfQ09OTkVDVElPTl9EQVRBIChjb25uZWN0aW9uKTsKKyAgX2RidXNfYXNzZXJ0IChkICE9IE5VTEwpOworCisgIF9kYnVzX2xpc3RfcmVtb3ZlX2xhc3QgKCZkLT5zZXJ2aWNlc19vd25lZCwgc2VydmljZSk7CisKKyAgZC0+bl9zZXJ2aWNlc19vd25lZCAtPSAxOworICBfZGJ1c19hc3NlcnQgKGQtPm5fc2VydmljZXNfb3duZWQgPj0gMCk7CisKKyNpZmRlZiBEQlVTX0VOQUJMRV9TVEFUUworICBkLT5jb25uZWN0aW9ucy0+dG90YWxfYnVzX25hbWVzIC09IDE7CisjZW5kaWYKK30KKworaW50CitidXNfY29ubmVjdGlvbl9nZXRfbl9zZXJ2aWNlc19vd25lZCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIEJ1c0Nvbm5lY3Rpb25EYXRhICpkOworCisgIGQgPSBCVVNfQ09OTkVDVElPTl9EQVRBIChjb25uZWN0aW9uKTsKKyAgX2RidXNfYXNzZXJ0IChkICE9IE5VTEwpOworICAKKyAgcmV0dXJuIGQtPm5fc2VydmljZXNfb3duZWQ7Cit9CisKK2RidXNfYm9vbF90CitidXNfY29ubmVjdGlvbl9jb21wbGV0ZSAoREJ1c0Nvbm5lY3Rpb24gICAqY29ubmVjdGlvbiwKKwkJCSBjb25zdCBEQnVzU3RyaW5nICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICBCdXNDb25uZWN0aW9uRGF0YSAqZDsKKyAgdW5zaWduZWQgbG9uZyB1aWQ7CisgIAorICBkID0gQlVTX0NPTk5FQ1RJT05fREFUQSAoY29ubmVjdGlvbik7CisgIF9kYnVzX2Fzc2VydCAoZCAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChkLT5uYW1lID09IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKGQtPnBvbGljeSA9PSBOVUxMKTsKKworICBfZGJ1c19hc3NlcnQgKCFidXNfY29ubmVjdGlvbl9pc19hY3RpdmUgKGNvbm5lY3Rpb24pKTsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2NvcHlfZGF0YSAobmFtZSwgJmQtPm5hbWUpKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIF9kYnVzX2Fzc2VydCAoZC0+bmFtZSAhPSBOVUxMKTsKKyAgCisgIF9kYnVzX3ZlcmJvc2UgKCJOYW1lICVzIGFzc2lnbmVkIHRvICVwXG4iLCBkLT5uYW1lLCBjb25uZWN0aW9uKTsKKworICBkLT5wb2xpY3kgPSBidXNfY29udGV4dF9jcmVhdGVfY2xpZW50X3BvbGljeSAoZC0+Y29ubmVjdGlvbnMtPmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworCisgIC8qIHdlIG1heSBoYXZlIGEgTlVMTCBwb2xpY3kgb24gT09NIG9yIGVycm9yIGdldHRpbmcgbGlzdCBvZgorICAgKiBncm91cHMgZm9yIGEgdXNlci4gSW4gdGhlIGxhdHRlciBjYXNlIHdlIGRvbid0IGhhbmRsZSBpdCBzbworICAgKiB3ZWxsIGN1cnJlbnRseSwgYXMgaXQgd2lsbCBqdXN0IGtlZXAgZmFpbGluZyBvdmVyIGFuZCBvdmVyLgorICAgKi8KKworICBpZiAoZC0+cG9saWN5ID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIkZhaWxlZCB0byBjcmVhdGUgc2VjdXJpdHkgcG9saWN5IGZvciBjb25uZWN0aW9uICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbik7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICBkYnVzX2ZyZWUgKGQtPm5hbWUpOworICAgICAgZC0+bmFtZSA9IE5VTEw7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAKKyAgaWYgKGRidXNfY29ubmVjdGlvbl9nZXRfdW5peF91c2VyIChjb25uZWN0aW9uLCAmdWlkKSkKKyAgICB7CisgICAgICBpZiAoIWFkanVzdF9jb25uZWN0aW9uc19mb3JfdWlkIChkLT5jb25uZWN0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZCwgMSkpCisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgLyogQ3JlYXRlIGFuZCBjYWNoZSBhIHN0cmluZyB3aGljaCBob2xkcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgCisgICAqIHBlZXIgcHJvY2VzczsgdXNlZCBmb3IgbG9nZ2luZyBwdXJwb3Nlcy4KKyAgICovCisgIGlmICghY2FjaGVfcGVlcl9sb2dpbmZvX3N0cmluZyAoZCwgY29ubmVjdGlvbikpCisgICAgZ290byBmYWlsOworCisgIC8qIE5vdyB0aGUgY29ubmVjdGlvbiBpcyBhY3RpdmUsIG1vdmUgaXQgYmV0d2VlbiBsaXN0cyAqLworICBfZGJ1c19saXN0X3VubGluayAoJmQtPmNvbm5lY3Rpb25zLT5pbmNvbXBsZXRlLAorICAgICAgICAgICAgICAgICAgICAgZC0+bGlua19pbl9jb25uZWN0aW9uX2xpc3QpOworICBkLT5jb25uZWN0aW9ucy0+bl9pbmNvbXBsZXRlIC09IDE7CisgIF9kYnVzX2xpc3RfYXBwZW5kX2xpbmsgKCZkLT5jb25uZWN0aW9ucy0+Y29tcGxldGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkLT5saW5rX2luX2Nvbm5lY3Rpb25fbGlzdCk7CisgIGQtPmNvbm5lY3Rpb25zLT5uX2NvbXBsZXRlZCArPSAxOworCisgIF9kYnVzX2Fzc2VydCAoZC0+Y29ubmVjdGlvbnMtPm5faW5jb21wbGV0ZSA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChkLT5jb25uZWN0aW9ucy0+bl9jb21wbGV0ZWQgPiAwKTsKKworICAvKiBJZiB3ZSBoYXZlIGRyb3BwZWQgYmVsb3cgdGhlIG1heC4gbnVtYmVyIG9mIGluY29tcGxldGUKKyAgICogY29ubmVjdGlvbnMsIHN0YXJ0IGFjY2VwdCgpaW5nIGFnYWluICovCisgIGJ1c19jb250ZXh0X2NoZWNrX2FsbF93YXRjaGVzIChkLT5jb25uZWN0aW9ucy0+Y29udGV4dCk7CisKKyAgLyogU2VlIGlmIHdlIGNhbiByZW1vdmUgdGhlIHRpbWVvdXQgKi8KKyAgYnVzX2Nvbm5lY3Rpb25zX2V4cGlyZV9pbmNvbXBsZXRlIChkLT5jb25uZWN0aW9ucyk7CisKKyAgX2RidXNfYXNzZXJ0IChidXNfY29ubmVjdGlvbl9pc19hY3RpdmUgKGNvbm5lY3Rpb24pKTsKKyAgCisgIHJldHVybiBUUlVFOworZmFpbDoKKyAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgZGJ1c19mcmVlIChkLT5uYW1lKTsKKyAgZC0+bmFtZSA9IE5VTEw7CisgIGlmIChkLT5wb2xpY3kpCisgICAgYnVzX2NsaWVudF9wb2xpY3lfdW5yZWYgKGQtPnBvbGljeSk7CisgIGQtPnBvbGljeSA9IE5VTEw7CisgIHJldHVybiBGQUxTRTsKK30KKworZGJ1c19ib29sX3QKK2J1c19jb25uZWN0aW9uc19yZWxvYWRfcG9saWN5IChCdXNDb25uZWN0aW9ucyAqY29ubmVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBCdXNDb25uZWN0aW9uRGF0YSAqZDsKKyAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisgIERCdXNMaXN0ICpsaW5rOworCisgIF9kYnVzX2Fzc2VydCAoY29ubmVjdGlvbnMgIT0gTlVMTCk7CisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIGZvciAobGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCYoY29ubmVjdGlvbnMtPmNvbXBsZXRlZCkpOworICAgICAgIGxpbms7CisgICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJihjb25uZWN0aW9ucy0+Y29tcGxldGVkKSwgbGluaykpCisgICAgeworICAgICAgY29ubmVjdGlvbiA9IGxpbmstPmRhdGE7CisgICAgICBkID0gQlVTX0NPTk5FQ1RJT05fREFUQSAoY29ubmVjdGlvbik7CisgICAgICBfZGJ1c19hc3NlcnQgKGQgIT0gTlVMTCk7CisgICAgICBfZGJ1c19hc3NlcnQgKGQtPnBvbGljeSAhPSBOVUxMKTsKKworICAgICAgYnVzX2NsaWVudF9wb2xpY3lfdW5yZWYgKGQtPnBvbGljeSk7CisgICAgICBkLT5wb2xpY3kgPSBidXNfY29udGV4dF9jcmVhdGVfY2xpZW50X3BvbGljeSAoY29ubmVjdGlvbnMtPmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7CisgICAgICBpZiAoZC0+cG9saWN5ID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiRmFpbGVkIHRvIGNyZWF0ZSBzZWN1cml0eSBwb2xpY3kgZm9yIGNvbm5lY3Rpb24gJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbik7CisgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworY29uc3QgY2hhciAqCitidXNfY29ubmVjdGlvbl9nZXRfbmFtZSAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIEJ1c0Nvbm5lY3Rpb25EYXRhICpkOworICAKKyAgZCA9IEJVU19DT05ORUNUSU9OX0RBVEEgKGNvbm5lY3Rpb24pOworICBfZGJ1c19hc3NlcnQgKGQgIT0gTlVMTCk7CisgIAorICByZXR1cm4gZC0+bmFtZTsKK30KKworLyoqCisgKiBDaGVjayB3aGV0aGVyIGNvbXBsZXRpbmcgdGhlIHBhc3NlZC1pbiBjb25uZWN0aW9uIHdvdWxkCisgKiBleGNlZWQgbGltaXRzLCBhbmQgaWYgc28gc2V0IGVycm9yIGFuZCByZXR1cm4gI0ZBTFNFCisgKi8KK2RidXNfYm9vbF90CitidXNfY29ubmVjdGlvbnNfY2hlY2tfbGltaXRzIChCdXNDb25uZWN0aW9ucyAgKmNvbm5lY3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gICpyZXF1ZXN0aW5nX2NvbXBsZXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqKmxpbWl0X25hbWVfb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICpsaW1pdF9vdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgKmVycm9yKQoreworICB1bnNpZ25lZCBsb25nIHVpZDsKKyAgaW50IGxpbWl0OworCisgIGxpbWl0ID0gYnVzX2NvbnRleHRfZ2V0X21heF9jb21wbGV0ZWRfY29ubmVjdGlvbnMgKGNvbm5lY3Rpb25zLT5jb250ZXh0KTsKKworICBpZiAoY29ubmVjdGlvbnMtPm5fY29tcGxldGVkID49IGxpbWl0KQorICAgIHsKKyAgICAgIGlmIChsaW1pdF9uYW1lX291dCAhPSBOVUxMKQorICAgICAgICAqbGltaXRfbmFtZV9vdXQgPSAibWF4X2NvbXBsZXRlZF9jb25uZWN0aW9ucyI7CisKKyAgICAgIGlmIChsaW1pdF9vdXQgIT0gTlVMTCkKKyAgICAgICAgKmxpbWl0X291dCA9IGxpbWl0OworCisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTElNSVRTX0VYQ0VFREVELAorICAgICAgICAgICAgICAgICAgICAgICJUaGUgbWF4aW11bSBudW1iZXIgb2YgYWN0aXZlIGNvbm5lY3Rpb25zIGhhcyBiZWVuIHJlYWNoZWQiKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIAorICBpZiAoZGJ1c19jb25uZWN0aW9uX2dldF91bml4X3VzZXIgKHJlcXVlc3RpbmdfY29tcGxldGlvbiwgJnVpZCkpCisgICAgeworICAgICAgbGltaXQgPSBidXNfY29udGV4dF9nZXRfbWF4X2Nvbm5lY3Rpb25zX3Blcl91c2VyIChjb25uZWN0aW9ucy0+Y29udGV4dCk7CisKKyAgICAgIGlmIChnZXRfY29ubmVjdGlvbnNfZm9yX3VpZCAoY29ubmVjdGlvbnMsIHVpZCkgPj0gbGltaXQpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAobGltaXRfbmFtZV9vdXQgIT0gTlVMTCkKKyAgICAgICAgICAgICpsaW1pdF9uYW1lX291dCA9ICJtYXhfY29ubmVjdGlvbnNfcGVyX3VzZXIiOworCisgICAgICAgICAgaWYgKGxpbWl0X291dCAhPSBOVUxMKQorICAgICAgICAgICAgKmxpbWl0X291dCA9IGxpbWl0OworCisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0xJTUlUU19FWENFRURFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSBtYXhpbXVtIG51bWJlciBvZiBhY3RpdmUgY29ubmVjdGlvbnMgZm9yIFVJRCAlbHUgaGFzIGJlZW4gcmVhY2hlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZCk7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgfQorICAKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitidXNfcGVuZGluZ19yZXBseV9mcmVlIChCdXNQZW5kaW5nUmVwbHkgKnBlbmRpbmcpCit7CisgIF9kYnVzX3ZlcmJvc2UgKCJGcmVlaW5nIHBlbmRpbmcgcmVwbHkgJXAsIHJlcGxpZXIgJXAgcmVjZWl2ZXIgJXAgc2VyaWFsICV1XG4iLAorICAgICAgICAgICAgICAgICBwZW5kaW5nLAorICAgICAgICAgICAgICAgICBwZW5kaW5nLT53aWxsX3NlbmRfcmVwbHksCisgICAgICAgICAgICAgICAgIHBlbmRpbmctPndpbGxfZ2V0X3JlcGx5LAorICAgICAgICAgICAgICAgICBwZW5kaW5nLT5yZXBseV9zZXJpYWwpOworCisgIGRidXNfZnJlZSAocGVuZGluZyk7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYnVzX3BlbmRpbmdfcmVwbHlfc2VuZF9ub19yZXBseSAoQnVzQ29ubmVjdGlvbnMgICpjb25uZWN0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1RyYW5zYWN0aW9uICAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNQZW5kaW5nUmVwbHkgKnBlbmRpbmcpCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworICBEQnVzTWVzc2FnZUl0ZXIgaXRlcjsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICBjb25zdCBjaGFyICplcnJtc2c7CisKKyAgcmV0dmFsID0gRkFMU0U7CisgIAorICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ldyAoREJVU19NRVNTQUdFX1RZUEVfRVJST1IpOworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKyAgCisgIGRidXNfbWVzc2FnZV9zZXRfbm9fcmVwbHkgKG1lc3NhZ2UsIFRSVUUpOworICAKKyAgaWYgKCFkYnVzX21lc3NhZ2Vfc2V0X3JlcGx5X3NlcmlhbCAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZy0+cmVwbHlfc2VyaWFsKSkKKyAgICBnb3RvIG91dDsKKworICBpZiAoIWRidXNfbWVzc2FnZV9zZXRfZXJyb3JfbmFtZSAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfTk9fUkVQTFkpKQorICAgIGdvdG8gb3V0OworCisgIC8qIElmIHlvdSBjaGFuZ2UgdGhlc2UgbWVzc2FnZXMsIGFkanVzdCB0ZXN0L2RidXMtZGFlbW9uLmMgdG8gbWF0Y2ggKi8KKyAgaWYgKHBlbmRpbmctPndpbGxfc2VuZF9yZXBseSA9PSBOVUxMKQorICAgIGVycm1zZyA9ICJNZXNzYWdlIHJlY2lwaWVudCBkaXNjb25uZWN0ZWQgZnJvbSBtZXNzYWdlIGJ1cyB3aXRob3V0IHJlcGx5aW5nIjsKKyAgZWxzZQorICAgIGVycm1zZyA9ICJNZXNzYWdlIGRpZCBub3QgcmVjZWl2ZSBhIHJlcGx5ICh0aW1lb3V0IGJ5IG1lc3NhZ2UgYnVzKSI7CisKKyAgZGJ1c19tZXNzYWdlX2l0ZXJfaW5pdF9hcHBlbmQgKG1lc3NhZ2UsICZpdGVyKTsKKyAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfYmFzaWMgKCZpdGVyLCBEQlVTX1RZUEVfU1RSSU5HLCAmZXJybXNnKSkKKyAgICBnb3RvIG91dDsKKyAgICAKKyAgaWYgKCFidXNfdHJhbnNhY3Rpb25fc2VuZF9mcm9tX2RyaXZlciAodHJhbnNhY3Rpb24sIHBlbmRpbmctPndpbGxfZ2V0X3JlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlKSkKKyAgICBnb3RvIG91dDsKKworICByZXR2YWwgPSBUUlVFOworCisgb3V0OgorICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2J1c19wZW5kaW5nX3JlcGx5X2V4cGlyZWQgKEJ1c0V4cGlyZUxpc3QgKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAgICAgICpsaW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqZGF0YSkKK3sKKyAgQnVzUGVuZGluZ1JlcGx5ICpwZW5kaW5nID0gbGluay0+ZGF0YTsKKyAgQnVzQ29ubmVjdGlvbnMgKmNvbm5lY3Rpb25zID0gZGF0YTsKKyAgQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uOworICAKKyAgLyogTm8gcmVwbHkgaXMgZm9ydGhjb21pbmcuIFNvIG51a2UgaXQgaWYgd2UgY2FuLiBJZiBub3QsCisgICAqIGxlYXZlIGl0IGluIHRoZSBsaXN0IHRvIHRyeSBleHBpcmluZyBhZ2FpbiBsYXRlciB3aGVuIHdlCisgICAqIGdldCBtb3JlIG1lbW9yeS4KKyAgICovCisKKyAgX2RidXNfdmVyYm9zZSAoIkV4cGlyaW5nIHBlbmRpbmcgcmVwbHkgJXAsIHJlcGxpZXIgJXAgcmVjZWl2ZXIgJXAgc2VyaWFsICV1XG4iLAorICAgICAgICAgICAgICAgICBwZW5kaW5nLAorICAgICAgICAgICAgICAgICBwZW5kaW5nLT53aWxsX3NlbmRfcmVwbHksCisgICAgICAgICAgICAgICAgIHBlbmRpbmctPndpbGxfZ2V0X3JlcGx5LAorICAgICAgICAgICAgICAgICBwZW5kaW5nLT5yZXBseV9zZXJpYWwpOworICAKKyAgdHJhbnNhY3Rpb24gPSBidXNfdHJhbnNhY3Rpb25fbmV3IChjb25uZWN0aW9ucy0+Y29udGV4dCk7CisgIGlmICh0cmFuc2FjdGlvbiA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKyAgCisgIGlmICghYnVzX3BlbmRpbmdfcmVwbHlfc2VuZF9ub19yZXBseSAoY29ubmVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZykpCisgICAgeworICAgICAgYnVzX3RyYW5zYWN0aW9uX2NhbmNlbF9hbmRfZnJlZSAodHJhbnNhY3Rpb24pOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBidXNfZXhwaXJlX2xpc3RfcmVtb3ZlX2xpbmsgKGNvbm5lY3Rpb25zLT5wZW5kaW5nX3JlcGxpZXMsIGxpbmspOworCisgIGJ1c19wZW5kaW5nX3JlcGx5X2ZyZWUgKHBlbmRpbmcpOworICBidXNfdHJhbnNhY3Rpb25fZXhlY3V0ZV9hbmRfZnJlZSAodHJhbnNhY3Rpb24pOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorYnVzX2Nvbm5lY3Rpb25fZHJvcF9wZW5kaW5nX3JlcGxpZXMgKEJ1c0Nvbm5lY3Rpb25zICAqY29ubmVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gICpjb25uZWN0aW9uKQoreworICAvKiBUaGUgREJ1c0Nvbm5lY3Rpb24gaXMgYWxtb3N0IDEwMCUgZmluYWxpemVkIGhlcmUsIHNvIHlvdSBjYW4ndAorICAgKiBkbyBhbnl0aGluZyB3aXRoIGl0IGV4Y2VwdCBjaGVjayBmb3IgcG9pbnRlciBlcXVhbGl0eQorICAgKi8KKyAgREJ1c0xpc3QgKmxpbms7CisKKyAgX2RidXNfdmVyYm9zZSAoIkRyb3BwaW5nIHBlbmRpbmcgcmVwbGllcyB0aGF0IGludm9sdmUgY29ubmVjdGlvbiAlcFxuIiwKKyAgICAgICAgICAgICAgICAgY29ubmVjdGlvbik7CisgIAorICBsaW5rID0gYnVzX2V4cGlyZV9saXN0X2dldF9maXJzdF9saW5rIChjb25uZWN0aW9ucy0+cGVuZGluZ19yZXBsaWVzKTsKKyAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBEQnVzTGlzdCAqbmV4dDsKKyAgICAgIEJ1c1BlbmRpbmdSZXBseSAqcGVuZGluZzsKKworICAgICAgbmV4dCA9IGJ1c19leHBpcmVfbGlzdF9nZXRfbmV4dF9saW5rIChjb25uZWN0aW9ucy0+cGVuZGluZ19yZXBsaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rKTsKKyAgICAgIHBlbmRpbmcgPSBsaW5rLT5kYXRhOworCisgICAgICBpZiAocGVuZGluZy0+d2lsbF9nZXRfcmVwbHkgPT0gY29ubmVjdGlvbikKKyAgICAgICAgeworICAgICAgICAgIC8qIFdlIGRvbid0IG5lZWQgdG8gdHJhY2sgdGhpcyBwZW5kaW5nIHJlcGx5IGFueW1vcmUgKi8KKworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJEcm9wcGluZyBwZW5kaW5nIHJlcGx5ICVwLCByZXBsaWVyICVwIHJlY2VpdmVyICVwIHNlcmlhbCAldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmctPndpbGxfc2VuZF9yZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nLT53aWxsX2dldF9yZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nLT5yZXBseV9zZXJpYWwpOworICAgICAgICAgIAorICAgICAgICAgIGJ1c19leHBpcmVfbGlzdF9yZW1vdmVfbGluayAoY29ubmVjdGlvbnMtPnBlbmRpbmdfcmVwbGllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmspOworICAgICAgICAgIGJ1c19wZW5kaW5nX3JlcGx5X2ZyZWUgKHBlbmRpbmcpOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChwZW5kaW5nLT53aWxsX3NlbmRfcmVwbHkgPT0gY29ubmVjdGlvbikKKyAgICAgICAgeworICAgICAgICAgIC8qIFRoZSByZXBseSBpc24ndCBnb2luZyB0byBiZSBzZW50LCBzbyBzZXQgdGhpbmdzCisgICAgICAgICAgICogdXAgc28gaXQgd2lsbCBiZSBleHBpcmVkIHJpZ2h0IGF3YXkKKyAgICAgICAgICAgKi8KKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiV2lsbCBleHBpcmUgcGVuZGluZyByZXBseSAlcCwgcmVwbGllciAlcCByZWNlaXZlciAlcCBzZXJpYWwgJXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nLT53aWxsX3NlbmRfcmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZy0+d2lsbF9nZXRfcmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZy0+cmVwbHlfc2VyaWFsKTsKKyAgICAgICAgICAKKyAgICAgICAgICBwZW5kaW5nLT53aWxsX3NlbmRfcmVwbHkgPSBOVUxMOworICAgICAgICAgIHBlbmRpbmctPmV4cGlyZV9pdGVtLmFkZGVkX3R2X3NlYyA9IDA7CisgICAgICAgICAgcGVuZGluZy0+ZXhwaXJlX2l0ZW0uYWRkZWRfdHZfdXNlYyA9IDA7CisKKyAgICAgICAgICBidXNfZXhwaXJlX2xpc3RfcmVjaGVja19pbW1lZGlhdGVseSAoY29ubmVjdGlvbnMtPnBlbmRpbmdfcmVwbGllcyk7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgbGluayA9IG5leHQ7CisgICAgfQorfQorCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEJ1c1BlbmRpbmdSZXBseSAqcGVuZGluZzsKKyAgQnVzQ29ubmVjdGlvbnMgICpjb25uZWN0aW9uczsKK30gQ2FuY2VsUGVuZGluZ1JlcGx5RGF0YTsKKworc3RhdGljIHZvaWQKK2NhbmNlbF9wZW5kaW5nX3JlcGx5ICh2b2lkICpkYXRhKQoreworICBDYW5jZWxQZW5kaW5nUmVwbHlEYXRhICpkID0gZGF0YTsKKworICBfZGJ1c192ZXJib3NlICgiZCA9ICVwXG4iLCBkKTsKKyAgCisgIGlmICghYnVzX2V4cGlyZV9saXN0X3JlbW92ZSAoZC0+Y29ubmVjdGlvbnMtPnBlbmRpbmdfcmVwbGllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZC0+cGVuZGluZy0+ZXhwaXJlX2l0ZW0pKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInBlbmRpbmcgcmVwbHkgZGlkIG5vdCBleGlzdCB0byBiZSBjYW5jZWxsZWQiKTsKKworICBidXNfcGVuZGluZ19yZXBseV9mcmVlIChkLT5wZW5kaW5nKTsgLyogc2luY2UgaXQncyBiZWVuIGNhbmNlbGxlZCAqLworfQorCitzdGF0aWMgdm9pZAorY2FuY2VsX3BlbmRpbmdfcmVwbHlfZGF0YV9mcmVlICh2b2lkICpkYXRhKQoreworICBDYW5jZWxQZW5kaW5nUmVwbHlEYXRhICpkID0gZGF0YTsKKworICBfZGJ1c192ZXJib3NlICgiZCA9ICVwXG4iLCBkKTsKKyAgCisgIC8qIGQtPnBlbmRpbmcgc2hvdWxkIGJlIGVpdGhlciBmcmVlZCBvciBzdGlsbAorICAgKiBpbiB0aGUgbGlzdCBvZiBwZW5kaW5nIHJlcGxpZXMgKG93bmVkIGJ5IHNvbWVvbmUKKyAgICogZWxzZSkKKyAgICovCisgIAorICBkYnVzX2ZyZWUgKGQpOworfQorCisvKgorICogUmVjb3JkIHRoYXQgYSByZXBseSBpcyBhbGxvd2VkOyByZXR1cm4gVFJVRSBvbiBzdWNjZXNzLgorICovCitkYnVzX2Jvb2xfdAorYnVzX2Nvbm5lY3Rpb25zX2V4cGVjdF9yZXBseSAoQnVzQ29ubmVjdGlvbnMgICpjb25uZWN0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1RyYW5zYWN0aW9uICAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAgKndpbGxfZ2V0X3JlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gICp3aWxsX3NlbmRfcmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgKnJlcGx5X3RvX3RoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgKmVycm9yKQoreworICBCdXNQZW5kaW5nUmVwbHkgKnBlbmRpbmc7CisgIGRidXNfdWludDMyX3QgcmVwbHlfc2VyaWFsOworICBEQnVzTGlzdCAqbGluazsKKyAgQ2FuY2VsUGVuZGluZ1JlcGx5RGF0YSAqY3ByZDsKKyAgaW50IGNvdW50OworICBpbnQgbGltaXQ7CisKKyAgX2RidXNfYXNzZXJ0ICh3aWxsX2dldF9yZXBseSAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0ICh3aWxsX3NlbmRfcmVwbHkgIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAocmVwbHlfdG9fdGhpcyAhPSBOVUxMKTsKKyAgCisgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X25vX3JlcGx5IChyZXBseV90b190aGlzKSkKKyAgICByZXR1cm4gVFJVRTsgLyogd2Ugd29uJ3QgYWxsb3cgYSByZXBseSwgc2luY2UgY2xpZW50IGRvZXNuJ3QgY2FyZSBmb3Igb25lLiAqLworICAKKyAgcmVwbHlfc2VyaWFsID0gZGJ1c19tZXNzYWdlX2dldF9zZXJpYWwgKHJlcGx5X3RvX3RoaXMpOworCisgIGxpbmsgPSBidXNfZXhwaXJlX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKGNvbm5lY3Rpb25zLT5wZW5kaW5nX3JlcGxpZXMpOworICBjb3VudCA9IDA7CisgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgeworICAgICAgcGVuZGluZyA9IGxpbmstPmRhdGE7CisKKyAgICAgIGlmIChwZW5kaW5nLT5yZXBseV9zZXJpYWwgPT0gcmVwbHlfc2VyaWFsICYmCisgICAgICAgICAgcGVuZGluZy0+d2lsbF9nZXRfcmVwbHkgPT0gd2lsbF9nZXRfcmVwbHkgJiYKKyAgICAgICAgICBwZW5kaW5nLT53aWxsX3NlbmRfcmVwbHkgPT0gd2lsbF9zZW5kX3JlcGx5KQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0FDQ0VTU19ERU5JRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJNZXNzYWdlIGhhcyB0aGUgc2FtZSByZXBseSBzZXJpYWwgYXMgYSBjdXJyZW50bHktb3V0c3RhbmRpbmcgZXhpc3RpbmcgbWV0aG9kIGNhbGwiKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgbGluayA9IGJ1c19leHBpcmVfbGlzdF9nZXRfbmV4dF9saW5rIChjb25uZWN0aW9ucy0+cGVuZGluZ19yZXBsaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rKTsKKyAgICAgIGlmIChwZW5kaW5nLT53aWxsX2dldF9yZXBseSA9PSB3aWxsX2dldF9yZXBseSkKKyAgICAgICAgKytjb3VudDsKKyAgICB9CisKKyAgbGltaXQgPSBidXNfY29udGV4dF9nZXRfbWF4X3JlcGxpZXNfcGVyX2Nvbm5lY3Rpb24gKGNvbm5lY3Rpb25zLT5jb250ZXh0KTsKKworICBpZiAoY291bnQgPj0gbGltaXQpCisgICAgeworICAgICAgYnVzX2NvbnRleHRfbG9nIChjb25uZWN0aW9ucy0+Y29udGV4dCwgREJVU19TWVNURU1fTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICJUaGUgbWF4aW11bSBudW1iZXIgb2YgcGVuZGluZyByZXBsaWVzIGZvciAiCisgICAgICAgICAgICAgICAgICAgICAgICJcIiVzXCIgKCVzKSBoYXMgYmVlbiByZWFjaGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgIihtYXhfcmVwbGllc19wZXJfY29ubmVjdGlvbj0lZCkiLAorICAgICAgICAgICAgICAgICAgICAgICBidXNfY29ubmVjdGlvbl9nZXRfbmFtZSAod2lsbF9nZXRfcmVwbHkpLAorICAgICAgICAgICAgICAgICAgICAgICBidXNfY29ubmVjdGlvbl9nZXRfbG9naW5mbyAod2lsbF9nZXRfcmVwbHkpLAorICAgICAgICAgICAgICAgICAgICAgICBsaW1pdCk7CisKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9MSU1JVFNfRVhDRUVERUQsCisJCSAgICAgICJUaGUgbWF4aW11bSBudW1iZXIgb2YgcGVuZGluZyByZXBsaWVzIHBlciBjb25uZWN0aW9uIGhhcyBiZWVuIHJlYWNoZWQiKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgcGVuZGluZyA9IGRidXNfbmV3MCAoQnVzUGVuZGluZ1JlcGx5LCAxKTsKKyAgaWYgKHBlbmRpbmcgPT0gTlVMTCkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworI2lmZGVmIERCVVNfRU5BQkxFX1ZFUkJPU0VfTU9ERQorICAvKiBzbyB3ZSBjYW4gc2VlIGEgbm90LXlldC1hZGRlZCBwZW5kaW5nIHJlcGx5ICovCisgIHBlbmRpbmctPmV4cGlyZV9pdGVtLmFkZGVkX3R2X3NlYyA9IDE7CisgIHBlbmRpbmctPmV4cGlyZV9pdGVtLmFkZGVkX3R2X3VzZWMgPSAxOworI2VuZGlmCisKKyAgcGVuZGluZy0+d2lsbF9nZXRfcmVwbHkgPSB3aWxsX2dldF9yZXBseTsKKyAgcGVuZGluZy0+d2lsbF9zZW5kX3JlcGx5ID0gd2lsbF9zZW5kX3JlcGx5OworICBwZW5kaW5nLT5yZXBseV9zZXJpYWwgPSByZXBseV9zZXJpYWw7CisgIAorICBjcHJkID0gZGJ1c19uZXcwIChDYW5jZWxQZW5kaW5nUmVwbHlEYXRhLCAxKTsKKyAgaWYgKGNwcmQgPT0gTlVMTCkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgYnVzX3BlbmRpbmdfcmVwbHlfZnJlZSAocGVuZGluZyk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAKKyAgaWYgKCFidXNfZXhwaXJlX2xpc3RfYWRkIChjb25uZWN0aW9ucy0+cGVuZGluZ19yZXBsaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwZW5kaW5nLT5leHBpcmVfaXRlbSkpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGRidXNfZnJlZSAoY3ByZCk7CisgICAgICBidXNfcGVuZGluZ19yZXBseV9mcmVlIChwZW5kaW5nKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFidXNfdHJhbnNhY3Rpb25fYWRkX2NhbmNlbF9ob29rICh0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxfcGVuZGluZ19yZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcHJkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbF9wZW5kaW5nX3JlcGx5X2RhdGFfZnJlZSkpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGJ1c19leHBpcmVfbGlzdF9yZW1vdmUgKGNvbm5lY3Rpb25zLT5wZW5kaW5nX3JlcGxpZXMsICZwZW5kaW5nLT5leHBpcmVfaXRlbSk7CisgICAgICBkYnVzX2ZyZWUgKGNwcmQpOworICAgICAgYnVzX3BlbmRpbmdfcmVwbHlfZnJlZSAocGVuZGluZyk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBjcHJkLT5wZW5kaW5nID0gcGVuZGluZzsKKyAgY3ByZC0+Y29ubmVjdGlvbnMgPSBjb25uZWN0aW9uczsKKyAgCisgIF9kYnVzX2dldF9tb25vdG9uaWNfdGltZSAoJnBlbmRpbmctPmV4cGlyZV9pdGVtLmFkZGVkX3R2X3NlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGVuZGluZy0+ZXhwaXJlX2l0ZW0uYWRkZWRfdHZfdXNlYyk7CisKKyAgX2RidXNfdmVyYm9zZSAoIkFkZGVkIHBlbmRpbmcgcmVwbHkgJXAsIHJlcGxpZXIgJXAgcmVjZWl2ZXIgJXAgc2VyaWFsICV1XG4iLAorICAgICAgICAgICAgICAgICBwZW5kaW5nLAorICAgICAgICAgICAgICAgICBwZW5kaW5nLT53aWxsX3NlbmRfcmVwbHksCisgICAgICAgICAgICAgICAgIHBlbmRpbmctPndpbGxfZ2V0X3JlcGx5LAorICAgICAgICAgICAgICAgICBwZW5kaW5nLT5yZXBseV9zZXJpYWwpOworICAKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIERCdXNMaXN0ICAgICAgICAqbGluazsKKyAgQnVzQ29ubmVjdGlvbnMgICpjb25uZWN0aW9uczsKK30gQ2hlY2tQZW5kaW5nUmVwbHlEYXRhOworCitzdGF0aWMgdm9pZAorY2FuY2VsX2NoZWNrX3BlbmRpbmdfcmVwbHkgKHZvaWQgKmRhdGEpCit7CisgIENoZWNrUGVuZGluZ1JlcGx5RGF0YSAqZCA9IGRhdGE7CisKKyAgX2RidXNfdmVyYm9zZSAoImQgPSAlcFxuIixkKTsKKworICBidXNfZXhwaXJlX2xpc3RfYWRkX2xpbmsgKGQtPmNvbm5lY3Rpb25zLT5wZW5kaW5nX3JlcGxpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC0+bGluayk7CisgIGQtPmxpbmsgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZAorY2hlY2tfcGVuZGluZ19yZXBseV9kYXRhX2ZyZWUgKHZvaWQgKmRhdGEpCit7CisgIENoZWNrUGVuZGluZ1JlcGx5RGF0YSAqZCA9IGRhdGE7CisKKyAgX2RidXNfdmVyYm9zZSAoImQgPSAlcFxuIixkKTsKKyAgCisgIGlmIChkLT5saW5rICE9IE5VTEwpCisgICAgeworICAgICAgQnVzUGVuZGluZ1JlcGx5ICpwZW5kaW5nID0gZC0+bGluay0+ZGF0YTsKKyAgICAgIAorICAgICAgX2RidXNfYXNzZXJ0ICghYnVzX2V4cGlyZV9saXN0X2NvbnRhaW5zX2l0ZW0gKGQtPmNvbm5lY3Rpb25zLT5wZW5kaW5nX3JlcGxpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBlbmRpbmctPmV4cGlyZV9pdGVtKSk7CisgICAgICAKKyAgICAgIGJ1c19wZW5kaW5nX3JlcGx5X2ZyZWUgKHBlbmRpbmcpOworICAgICAgX2RidXNfbGlzdF9mcmVlX2xpbmsgKGQtPmxpbmspOworICAgIH0KKyAgCisgIGRidXNfZnJlZSAoZCk7Cit9CisKKy8qCisgKiBDaGVjayB3aGV0aGVyIGEgcmVwbHkgaXMgYWxsb3dlZCwgcmVtb3ZlIEJ1c1BlbmRpbmdSZXBseQorICogaWYgc28sIHJldHVybiBUUlVFIGlmIHNvLgorICovCitkYnVzX2Jvb2xfdAorYnVzX2Nvbm5lY3Rpb25zX2NoZWNrX3JlcGx5IChCdXNDb25uZWN0aW9ucyAqY29ubmVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKnNlbmRpbmdfcmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpyZWNlaXZpbmdfcmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICpyZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBDaGVja1BlbmRpbmdSZXBseURhdGEgKmNwcmQ7CisgIERCdXNMaXN0ICpsaW5rOworICBkYnVzX3VpbnQzMl90IHJlcGx5X3NlcmlhbDsKKyAgCisgIF9kYnVzX2Fzc2VydCAoc2VuZGluZ19yZXBseSAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChyZWNlaXZpbmdfcmVwbHkgIT0gTlVMTCk7CisKKyAgcmVwbHlfc2VyaWFsID0gZGJ1c19tZXNzYWdlX2dldF9yZXBseV9zZXJpYWwgKHJlcGx5KTsKKworICBsaW5rID0gYnVzX2V4cGlyZV9saXN0X2dldF9maXJzdF9saW5rIChjb25uZWN0aW9ucy0+cGVuZGluZ19yZXBsaWVzKTsKKyAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBCdXNQZW5kaW5nUmVwbHkgKnBlbmRpbmcgPSBsaW5rLT5kYXRhOworCisgICAgICBpZiAocGVuZGluZy0+cmVwbHlfc2VyaWFsID09IHJlcGx5X3NlcmlhbCAmJgorICAgICAgICAgIHBlbmRpbmctPndpbGxfZ2V0X3JlcGx5ID09IHJlY2VpdmluZ19yZXBseSAmJgorICAgICAgICAgIHBlbmRpbmctPndpbGxfc2VuZF9yZXBseSA9PSBzZW5kaW5nX3JlcGx5KQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkZvdW5kIHBlbmRpbmcgcmVwbHkgd2l0aCBzZXJpYWwgJXVcbiIsIHJlcGx5X3NlcmlhbCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgbGluayA9IGJ1c19leHBpcmVfbGlzdF9nZXRfbmV4dF9saW5rIChjb25uZWN0aW9ucy0+cGVuZGluZ19yZXBsaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rKTsKKyAgICB9CisKKyAgaWYgKGxpbmsgPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiTm8gcGVuZGluZyByZXBseSBleHBlY3RlZFxuIik7CisKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgY3ByZCA9IGRidXNfbmV3MCAoQ2hlY2tQZW5kaW5nUmVwbHlEYXRhLCAxKTsKKyAgaWYgKGNwcmQgPT0gTlVMTCkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgCisgIGlmICghYnVzX3RyYW5zYWN0aW9uX2FkZF9jYW5jZWxfaG9vayAodHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsX2NoZWNrX3BlbmRpbmdfcmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3ByZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja19wZW5kaW5nX3JlcGx5X2RhdGFfZnJlZSkpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGRidXNfZnJlZSAoY3ByZCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGNwcmQtPmxpbmsgPSBsaW5rOworICBjcHJkLT5jb25uZWN0aW9ucyA9IGNvbm5lY3Rpb25zOworICAKKyAgYnVzX2V4cGlyZV9saXN0X3VubGluayAoY29ubmVjdGlvbnMtPnBlbmRpbmdfcmVwbGllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGluayk7CisgIAorICBfZGJ1c19hc3NlcnQgKCFidXNfZXhwaXJlX2xpc3RfY29udGFpbnNfaXRlbSAoY29ubmVjdGlvbnMtPnBlbmRpbmdfcmVwbGllcywgbGluay0+ZGF0YSkpOworCisgIHJldHVybiBUUlVFOworfQorCisvKgorICogVHJhbnNhY3Rpb25zCisgKgorICogTm90ZSB0aGF0IHRoaXMgaXMgZmFpcmx5IGZyYWdpbGU7IGluIHBhcnRpY3VsYXIsIGRvbid0IHRyeSB0byB1c2UKKyAqIG9uZSB0cmFuc2FjdGlvbiBhY3Jvc3MgYW55IG1haW4gbG9vcCBpdGVyYXRpb25zLgorICovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbjsKKyAgREJ1c01lc3NhZ2UgICAgKm1lc3NhZ2U7CisgIERCdXNQcmVhbGxvY2F0ZWRTZW5kICpwcmVhbGxvY2F0ZWQ7Cit9IE1lc3NhZ2VUb1NlbmQ7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEJ1c1RyYW5zYWN0aW9uQ2FuY2VsRnVuY3Rpb24gY2FuY2VsX2Z1bmN0aW9uOworICBEQnVzRnJlZUZ1bmN0aW9uIGZyZWVfZGF0YV9mdW5jdGlvbjsKKyAgdm9pZCAqZGF0YTsKK30gQ2FuY2VsSG9vazsKKworc3RydWN0IEJ1c1RyYW5zYWN0aW9uCit7CisgIERCdXNMaXN0ICpjb25uZWN0aW9uczsKKyAgQnVzQ29udGV4dCAqY29udGV4dDsKKyAgREJ1c0xpc3QgKmNhbmNlbF9ob29rczsKK307CisKK3N0YXRpYyB2b2lkCittZXNzYWdlX3RvX3NlbmRfZnJlZSAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZVRvU2VuZCAgKnRvX3NlbmQpCit7CisgIGlmICh0b19zZW5kLT5tZXNzYWdlKQorICAgIGRidXNfbWVzc2FnZV91bnJlZiAodG9fc2VuZC0+bWVzc2FnZSk7CisKKyAgaWYgKHRvX3NlbmQtPnByZWFsbG9jYXRlZCkKKyAgICBkYnVzX2Nvbm5lY3Rpb25fZnJlZV9wcmVhbGxvY2F0ZWRfc2VuZCAoY29ubmVjdGlvbiwgdG9fc2VuZC0+cHJlYWxsb2NhdGVkKTsKKworICBkYnVzX2ZyZWUgKHRvX3NlbmQpOworfQorCitzdGF0aWMgdm9pZAorY2FuY2VsX2hvb2tfY2FuY2VsICh2b2lkICplbGVtZW50LAorICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhKQoreworICBDYW5jZWxIb29rICpjaCA9IGVsZW1lbnQ7CisKKyAgX2RidXNfdmVyYm9zZSAoIlJ1bm5pbmcgdHJhbnNhY3Rpb24gY2FuY2VsIGhvb2tcbiIpOworICAKKyAgaWYgKGNoLT5jYW5jZWxfZnVuY3Rpb24pCisgICAgKCogY2gtPmNhbmNlbF9mdW5jdGlvbikgKGNoLT5kYXRhKTsgIAorfQorCitzdGF0aWMgdm9pZAorY2FuY2VsX2hvb2tfZnJlZSAodm9pZCAqZWxlbWVudCwKKyAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEpCit7CisgIENhbmNlbEhvb2sgKmNoID0gZWxlbWVudDsKKworICBpZiAoY2gtPmZyZWVfZGF0YV9mdW5jdGlvbikKKyAgICAoKiBjaC0+ZnJlZV9kYXRhX2Z1bmN0aW9uKSAoY2gtPmRhdGEpOworCisgIGRidXNfZnJlZSAoY2gpOworfQorCitzdGF0aWMgdm9pZAorZnJlZV9jYW5jZWxfaG9va3MgKEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbikKK3sKKyAgX2RidXNfbGlzdF9mb3JlYWNoICgmdHJhbnNhY3Rpb24tPmNhbmNlbF9ob29rcywKKyAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxfaG9va19mcmVlLCBOVUxMKTsKKyAgCisgIF9kYnVzX2xpc3RfY2xlYXIgKCZ0cmFuc2FjdGlvbi0+Y2FuY2VsX2hvb2tzKTsKK30KKworQnVzVHJhbnNhY3Rpb24qCitidXNfdHJhbnNhY3Rpb25fbmV3IChCdXNDb250ZXh0ICpjb250ZXh0KQoreworICBCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb247CisKKyAgdHJhbnNhY3Rpb24gPSBkYnVzX25ldzAgKEJ1c1RyYW5zYWN0aW9uLCAxKTsKKyAgaWYgKHRyYW5zYWN0aW9uID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgdHJhbnNhY3Rpb24tPmNvbnRleHQgPSBjb250ZXh0OworICAKKyAgcmV0dXJuIHRyYW5zYWN0aW9uOworfQorCitCdXNDb250ZXh0KgorYnVzX3RyYW5zYWN0aW9uX2dldF9jb250ZXh0IChCdXNUcmFuc2FjdGlvbiAgKnRyYW5zYWN0aW9uKQoreworICByZXR1cm4gdHJhbnNhY3Rpb24tPmNvbnRleHQ7Cit9CisKKy8qKgorICogUmVzZXJ2ZSBlbm91Z2ggbWVtb3J5IHRvIGNhcHR1cmUgdGhlIGdpdmVuIG1lc3NhZ2UgaWYgdGhlCisgKiB0cmFuc2FjdGlvbiBnb2VzIHRocm91Z2guCisgKi8KK2RidXNfYm9vbF90CitidXNfdHJhbnNhY3Rpb25fY2FwdHVyZSAoQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpzZW5kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmFkZHJlc3NlZF9yZWNpcGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgKm1lc3NhZ2UpCit7CisgIEJ1c0Nvbm5lY3Rpb25zICpjb25uZWN0aW9uczsKKyAgQnVzTWF0Y2htYWtlciAqbW07CisgIERCdXNMaXN0ICpsaW5rOworICBEQnVzTGlzdCAqcmVjaXBpZW50cyA9IE5VTEw7CisgIGRidXNfYm9vbF90IHJldCA9IEZBTFNFOworCisgIGNvbm5lY3Rpb25zID0gYnVzX2NvbnRleHRfZ2V0X2Nvbm5lY3Rpb25zICh0cmFuc2FjdGlvbi0+Y29udGV4dCk7CisKKyAgLyogc2hvcnRjdXQ6IGRvbid0IGNvbXBvc2UgdGhlIG1lc3NhZ2UgdW5sZXNzIHNvbWVvbmUgd2FudHMgaXQgKi8KKyAgaWYgKGNvbm5lY3Rpb25zLT5tb25pdG9ycyA9PSBOVUxMKQorICAgIHJldHVybiBUUlVFOworCisgIG1tID0gY29ubmVjdGlvbnMtPm1vbml0b3JfbWF0Y2htYWtlcjsKKyAgLyogVGhpcyBpcyBub24tbnVsbCBpZiB0aGVyZSBoYXMgZXZlciBiZWVuIGEgbW9uaXRvciAtIHdlIGRvbid0IEdDIGl0LgorICAgKiBUaGVyZSdzIGxpdHRsZSBwb2ludCwgc2luY2UgdGhlcmUgaXMgdXAgdG8gMSBwZXIgcHJvY2Vzcy4gKi8KKyAgX2RidXNfYXNzZXJ0IChtbSAhPSBOVUxMKTsKKworICBpZiAoIWJ1c19tYXRjaG1ha2VyX2dldF9yZWNpcGllbnRzIChtbSwgY29ubmVjdGlvbnMsIHNlbmRlciwKKyAgICAgICAgYWRkcmVzc2VkX3JlY2lwaWVudCwgbWVzc2FnZSwgJnJlY2lwaWVudHMpKQorICAgIGdvdG8gb3V0OworCisgIGZvciAobGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZyZWNpcGllbnRzKTsKKyAgICAgIGxpbmsgIT0gTlVMTDsKKyAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZyZWNpcGllbnRzLCBsaW5rKSkKKyAgICB7CisgICAgICBEQnVzQ29ubmVjdGlvbiAqcmVjaXBpZW50ID0gbGluay0+ZGF0YTsKKworICAgICAgaWYgKCFidXNfdHJhbnNhY3Rpb25fc2VuZCAodHJhbnNhY3Rpb24sIHJlY2lwaWVudCwgbWVzc2FnZSkpCisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICByZXQgPSBUUlVFOworCitvdXQ6CisgIF9kYnVzX2xpc3RfY2xlYXIgKCZyZWNpcGllbnRzKTsKKyAgcmV0dXJuIHJldDsKK30KKworZGJ1c19ib29sX3QKK2J1c190cmFuc2FjdGlvbl9jYXB0dXJlX2Vycm9yX3JlcGx5IChCdXNUcmFuc2FjdGlvbiAgKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICAqYWRkcmVzc2VkX3JlY2lwaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzRXJyb3IgKmVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICAqaW5fcmVwbHlfdG8pCit7CisgIEJ1c0Nvbm5lY3Rpb25zICpjb25uZWN0aW9uczsKKyAgREJ1c01lc3NhZ2UgKnJlcGx5OworICBkYnVzX2Jvb2xfdCByZXQgPSBGQUxTRTsKKworICBfZGJ1c19hc3NlcnQgKGVycm9yICE9IE5VTEwpOworICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisKKyAgY29ubmVjdGlvbnMgPSBidXNfY29udGV4dF9nZXRfY29ubmVjdGlvbnMgKHRyYW5zYWN0aW9uLT5jb250ZXh0KTsKKworICAvKiBzaG9ydGN1dDogZG9uJ3QgY29tcG9zZSB0aGUgbWVzc2FnZSB1bmxlc3Mgc29tZW9uZSB3YW50cyBpdCAqLworICBpZiAoY29ubmVjdGlvbnMtPm1vbml0b3JzID09IE5VTEwpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgcmVwbHkgPSBkYnVzX21lc3NhZ2VfbmV3X2Vycm9yIChpbl9yZXBseV90bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvci0+bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvci0+bWVzc2FnZSk7CisKKyAgaWYgKHJlcGx5ID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZGJ1c19tZXNzYWdlX3NldF9zZW5kZXIgKHJlcGx5LCBEQlVTX1NFUlZJQ0VfREJVUykpCisgICAgZ290byBvdXQ7CisKKyAgcmV0ID0gYnVzX3RyYW5zYWN0aW9uX2NhcHR1cmUgKHRyYW5zYWN0aW9uLCBOVUxMLCBhZGRyZXNzZWRfcmVjaXBpZW50LCByZXBseSk7CisKK291dDoKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgIHJldHVybiByZXQ7Cit9CisKK2RidXNfYm9vbF90CitidXNfdHJhbnNhY3Rpb25fc2VuZF9mcm9tX2RyaXZlciAoQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICptZXNzYWdlKQoreworICBEQnVzRXJyb3IgZXJyb3IgPSBEQlVTX0VSUk9SX0lOSVQ7CisKKyAgLyogV2UgaGF2ZSB0byBzZXQgdGhlIHNlbmRlciB0byB0aGUgZHJpdmVyLCBhbmQgaGF2ZQorICAgKiB0byBjaGVjayBzZWN1cml0eSBwb2xpY3kgc2luY2UgaXQgd2FzIG5vdCBkb25lIGluCisgICAqIGRpc3BhdGNoLmMKKyAgICovCisgIF9kYnVzX3ZlcmJvc2UgKCJTZW5kaW5nICVzICVzICVzIGZyb20gZHJpdmVyXG4iLAorICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAobWVzc2FnZSkgPworICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAobWVzc2FnZSkgOiAiKG5vIGludGVyZmFjZSkiLAorICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X21lbWJlciAobWVzc2FnZSkgPworICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X21lbWJlciAobWVzc2FnZSkgOiAiKG5vIG1lbWJlcikiLAorICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X2Vycm9yX25hbWUgKG1lc3NhZ2UpID8KKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9lcnJvcl9uYW1lIChtZXNzYWdlKSA6ICIobm8gZXJyb3IgbmFtZSkiKTsKKyAgICAgICAgICAgICAgICAgCisgIGlmICghZGJ1c19tZXNzYWdlX3NldF9zZW5kZXIgKG1lc3NhZ2UsIERCVVNfU0VSVklDRV9EQlVTKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKGJ1c19jb25uZWN0aW9uX2lzX2FjdGl2ZSAoY29ubmVjdGlvbikpCisgICAgeworICAgICAgaWYgKCFkYnVzX21lc3NhZ2Vfc2V0X2Rlc3RpbmF0aW9uIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXNfY29ubmVjdGlvbl9nZXRfbmFtZSAoY29ubmVjdGlvbikpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAKKyAgLyogYnVzIGRyaXZlciBuZXZlciB3YW50cyBhIHJlcGx5ICovCisgIGRidXNfbWVzc2FnZV9zZXRfbm9fcmVwbHkgKG1lc3NhZ2UsIFRSVUUpOworCisgIC8qIENhcHR1cmUgaXQgZm9yIG1vbml0b3JzLCBldmVuIGlmIHRoZSByZWFsIHJlY2lwaWVudCdzIHJlY2VpdmUgcG9saWN5CisgICAqIGRvZXMgbm90IGFsbG93IGl0IHRvIHJlY2VpdmUgdGhpcyBtZXNzYWdlIGZyb20gdXMgKHdoaWNoIHdvdWxkIGJlIG9kZCkuCisgICAqLworICBpZiAoIWJ1c190cmFuc2FjdGlvbl9jYXB0dXJlICh0cmFuc2FjdGlvbiwgTlVMTCwgY29ubmVjdGlvbiwgbWVzc2FnZSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIC8qIElmIHNlY3VyaXR5IHBvbGljeSBkb2Vzbid0IGFsbG93IHRoZSBtZXNzYWdlLCB3ZSB3b3VsZCBzaWxlbnRseQorICAgKiBlYXQgaXQ7IHRoZSBkcml2ZXIgZG9lc24ndCBjYXJlIGFib3V0IGdldHRpbmcgYSByZXBseS4gSG93ZXZlciwKKyAgICogaWYgd2UncmUgYWN0aXZlbHkgY2FwdHVyaW5nIG1lc3NhZ2VzLCBpdCdzIG5pY2UgdG8gbG9nIHRoYXQgd2UKKyAgICogdHJpZWQgdG8gc2VuZCBpdCBhbmQgZGlkIG5vdCBhbGxvdyBvdXJzZWx2ZXMgdG8gZG8gc28uCisgICAqLworICBpZiAoIWJ1c19jb250ZXh0X2NoZWNrX3NlY3VyaXR5X3BvbGljeSAoYnVzX3RyYW5zYWN0aW9uX2dldF9jb250ZXh0ICh0cmFuc2FjdGlvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIGNvbm5lY3Rpb24sIGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLCBOVUxMLCAmZXJyb3IpKQorICAgIHsKKyAgICAgIGlmICghYnVzX3RyYW5zYWN0aW9uX2NhcHR1cmVfZXJyb3JfcmVwbHkgKHRyYW5zYWN0aW9uLCBjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yLCBtZXNzYWdlKSkKKyAgICAgICAgeworICAgICAgICAgIGJ1c19jb250ZXh0X2xvZyAodHJhbnNhY3Rpb24tPmNvbnRleHQsIERCVVNfU1lTVEVNX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1lc3NhZ2UgZnJvbSBkYnVzLWRhZW1vbiByZWplY3RlZCBidXQgbm90IGVub3VnaCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAibWVtb3J5IHRvIGNhcHR1cmUgaXQiKTsKKyAgICAgICAgfQorCisgICAgICAvKiBUaGlzIGlzIG5vdCBmYXRhbCB0byB0aGUgdHJhbnNhY3Rpb24gc28gc2lsZW50bHkgZWF0IHRoZSBkaXNhbGxvd2VkCisgICAgICAgKiBtZXNzYWdlIChzZWUgcmVhc29uaW5nIGFib3ZlKSAqLworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIHJldHVybiBidXNfdHJhbnNhY3Rpb25fc2VuZCAodHJhbnNhY3Rpb24sIGNvbm5lY3Rpb24sIG1lc3NhZ2UpOworfQorCitkYnVzX2Jvb2xfdAorYnVzX3RyYW5zYWN0aW9uX3NlbmQgKEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAqbWVzc2FnZSkKK3sKKyAgTWVzc2FnZVRvU2VuZCAqdG9fc2VuZDsKKyAgQnVzQ29ubmVjdGlvbkRhdGEgKmQ7CisgIERCdXNMaXN0ICpsaW5rOworCisgIF9kYnVzX3ZlcmJvc2UgKCIgIHRyeWluZyB0byBhZGQgJXMgaW50ZXJmYWNlPSVzIG1lbWJlcj0lcyBlcnJvcj0lcyB0byB0cmFuc2FjdGlvbiVzXG4iLAorICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKG1lc3NhZ2UpID09IERCVVNfTUVTU0FHRV9UWVBFX0VSUk9SID8gImVycm9yIiA6CisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfcmVwbHlfc2VyaWFsIChtZXNzYWdlKSAhPSAwID8gInJlcGx5IiA6CisgICAgICAgICAgICAgICAgICJtZXNzYWdlIiwKKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG1lc3NhZ2UpID8KKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG1lc3NhZ2UpIDogIih1bnNldCkiLAorICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X21lbWJlciAobWVzc2FnZSkgPworICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X21lbWJlciAobWVzc2FnZSkgOiAiKHVuc2V0KSIsCisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfZXJyb3JfbmFtZSAobWVzc2FnZSkgPworICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X2Vycm9yX25hbWUgKG1lc3NhZ2UpIDogIih1bnNldCkiLAorICAgICAgICAgICAgICAgICBkYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Nvbm5lY3RlZCAoY29ubmVjdGlvbikgPworICAgICAgICAgICAgICAgICAiIiA6ICIgKGRpc2Nvbm5lY3RlZCkiKTsKKworICBfZGJ1c19hc3NlcnQgKGRidXNfbWVzc2FnZV9nZXRfc2VuZGVyIChtZXNzYWdlKSAhPSBOVUxMKTsKKyAgCisgIGlmICghZGJ1c19jb25uZWN0aW9uX2dldF9pc19jb25uZWN0ZWQgKGNvbm5lY3Rpb24pKQorICAgIHJldHVybiBUUlVFOyAvKiBzaWxlbnRseSBpZ25vcmUgZGlzY29ubmVjdGVkIGNvbm5lY3Rpb25zICovCisgIAorICBkID0gQlVTX0NPTk5FQ1RJT05fREFUQSAoY29ubmVjdGlvbik7CisgIF9kYnVzX2Fzc2VydCAoZCAhPSBOVUxMKTsKKyAgCisgIHRvX3NlbmQgPSBkYnVzX25ldyAoTWVzc2FnZVRvU2VuZCwgMSk7CisgIGlmICh0b19zZW5kID09IE5VTEwpCisgICAgeworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICB0b19zZW5kLT5wcmVhbGxvY2F0ZWQgPSBkYnVzX2Nvbm5lY3Rpb25fcHJlYWxsb2NhdGVfc2VuZCAoY29ubmVjdGlvbik7CisgIGlmICh0b19zZW5kLT5wcmVhbGxvY2F0ZWQgPT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX2ZyZWUgKHRvX3NlbmQpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0gIAorICAKKyAgZGJ1c19tZXNzYWdlX3JlZiAobWVzc2FnZSk7CisgIHRvX3NlbmQtPm1lc3NhZ2UgPSBtZXNzYWdlOworICB0b19zZW5kLT50cmFuc2FjdGlvbiA9IHRyYW5zYWN0aW9uOworCisgIF9kYnVzX3ZlcmJvc2UgKCJhYm91dCB0byBwcmVwZW5kIG1lc3NhZ2VcbiIpOworICAKKyAgaWYgKCFfZGJ1c19saXN0X3ByZXBlbmQgKCZkLT50cmFuc2FjdGlvbl9tZXNzYWdlcywgdG9fc2VuZCkpCisgICAgeworICAgICAgbWVzc2FnZV90b19zZW5kX2ZyZWUgKGNvbm5lY3Rpb24sIHRvX3NlbmQpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBfZGJ1c192ZXJib3NlICgicHJlcGVuZGVkIG1lc3NhZ2VcbiIpOworICAKKyAgLyogU2VlIGlmIHdlIGFscmVhZHkgaGFkIHRoaXMgY29ubmVjdGlvbiBpbiB0aGUgbGlzdAorICAgKiBmb3IgdGhpcyB0cmFuc2FjdGlvbi4gSWYgd2UgaGF2ZSBhIHBlbmRpbmcgbWVzc2FnZSwKKyAgICogdGhlbiB3ZSBzaG91bGQgYWxyZWFkeSBiZSBpbiB0cmFuc2FjdGlvbi0+Y29ubmVjdGlvbnMKKyAgICovCisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmZC0+dHJhbnNhY3Rpb25fbWVzc2FnZXMpOworICBfZGJ1c19hc3NlcnQgKGxpbmstPmRhdGEgPT0gdG9fc2VuZCk7CisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZkLT50cmFuc2FjdGlvbl9tZXNzYWdlcywgbGluayk7CisgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgeworICAgICAgTWVzc2FnZVRvU2VuZCAqbSA9IGxpbmstPmRhdGE7CisgICAgICBEQnVzTGlzdCAqbmV4dCA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJmQtPnRyYW5zYWN0aW9uX21lc3NhZ2VzLCBsaW5rKTsKKyAgICAgIAorICAgICAgaWYgKG0tPnRyYW5zYWN0aW9uID09IHRyYW5zYWN0aW9uKQorICAgICAgICBicmVhazsKKyAgICAgICAgCisgICAgICBsaW5rID0gbmV4dDsKKyAgICB9CisKKyAgaWYgKGxpbmsgPT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX2xpc3RfcHJlcGVuZCAoJnRyYW5zYWN0aW9uLT5jb25uZWN0aW9ucywgY29ubmVjdGlvbikpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19saXN0X3JlbW92ZSAoJmQtPnRyYW5zYWN0aW9uX21lc3NhZ2VzLCB0b19zZW5kKTsKKyAgICAgICAgICBtZXNzYWdlX3RvX3NlbmRfZnJlZSAoY29ubmVjdGlvbiwgdG9fc2VuZCk7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAordHJhbnNhY3Rpb25fZnJlZSAoQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uKQoreworICBfZGJ1c19hc3NlcnQgKHRyYW5zYWN0aW9uLT5jb25uZWN0aW9ucyA9PSBOVUxMKTsKKworICBmcmVlX2NhbmNlbF9ob29rcyAodHJhbnNhY3Rpb24pOworCisgIGRidXNfZnJlZSAodHJhbnNhY3Rpb24pOworfQorCitzdGF0aWMgdm9pZAorY29ubmVjdGlvbl9jYW5jZWxfdHJhbnNhY3Rpb24gKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbikKK3sKKyAgREJ1c0xpc3QgKmxpbms7CisgIEJ1c0Nvbm5lY3Rpb25EYXRhICpkOworICAKKyAgZCA9IEJVU19DT05ORUNUSU9OX0RBVEEgKGNvbm5lY3Rpb24pOworICBfZGJ1c19hc3NlcnQgKGQgIT0gTlVMTCk7CisgIAorICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJmQtPnRyYW5zYWN0aW9uX21lc3NhZ2VzKTsKKyAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBNZXNzYWdlVG9TZW5kICptID0gbGluay0+ZGF0YTsKKyAgICAgIERCdXNMaXN0ICpuZXh0ID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmZC0+dHJhbnNhY3Rpb25fbWVzc2FnZXMsIGxpbmspOworICAgICAgCisgICAgICBpZiAobS0+dHJhbnNhY3Rpb24gPT0gdHJhbnNhY3Rpb24pCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19saXN0X3JlbW92ZV9saW5rICgmZC0+dHJhbnNhY3Rpb25fbWVzc2FnZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluayk7CisgICAgICAgICAgCisgICAgICAgICAgbWVzc2FnZV90b19zZW5kX2ZyZWUgKGNvbm5lY3Rpb24sIG0pOworICAgICAgICB9CisgICAgICAgIAorICAgICAgbGluayA9IG5leHQ7CisgICAgfQorfQorCit2b2lkCitidXNfdHJhbnNhY3Rpb25fY2FuY2VsX2FuZF9mcmVlIChCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24pCit7CisgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uOworCisgIF9kYnVzX3ZlcmJvc2UgKCJUUkFOU0FDVElPTjogY2FuY2VsbGVkXG4iKTsKKyAgCisgIHdoaWxlICgoY29ubmVjdGlvbiA9IF9kYnVzX2xpc3RfcG9wX2ZpcnN0ICgmdHJhbnNhY3Rpb24tPmNvbm5lY3Rpb25zKSkpCisgICAgY29ubmVjdGlvbl9jYW5jZWxfdHJhbnNhY3Rpb24gKGNvbm5lY3Rpb24sIHRyYW5zYWN0aW9uKTsKKworICBfZGJ1c19saXN0X2ZvcmVhY2ggKCZ0cmFuc2FjdGlvbi0+Y2FuY2VsX2hvb2tzLAorICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbF9ob29rX2NhbmNlbCwgTlVMTCk7CisKKyAgdHJhbnNhY3Rpb25fZnJlZSAodHJhbnNhY3Rpb24pOworfQorCitzdGF0aWMgdm9pZAorY29ubmVjdGlvbl9leGVjdXRlX3RyYW5zYWN0aW9uIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uKQoreworICBEQnVzTGlzdCAqbGluazsKKyAgQnVzQ29ubmVjdGlvbkRhdGEgKmQ7CisgIAorICBkID0gQlVTX0NPTk5FQ1RJT05fREFUQSAoY29ubmVjdGlvbik7CisgIF9kYnVzX2Fzc2VydCAoZCAhPSBOVUxMKTsKKworICAvKiBTZW5kIHRoZSBxdWV1ZSBpbiBvcmRlciAoRklGTykgKi8KKyAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2xhc3RfbGluayAoJmQtPnRyYW5zYWN0aW9uX21lc3NhZ2VzKTsKKyAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBNZXNzYWdlVG9TZW5kICptID0gbGluay0+ZGF0YTsKKyAgICAgIERCdXNMaXN0ICpwcmV2ID0gX2RidXNfbGlzdF9nZXRfcHJldl9saW5rICgmZC0+dHJhbnNhY3Rpb25fbWVzc2FnZXMsIGxpbmspOworICAgICAgCisgICAgICBpZiAobS0+dHJhbnNhY3Rpb24gPT0gdHJhbnNhY3Rpb24pCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19saXN0X3JlbW92ZV9saW5rICgmZC0+dHJhbnNhY3Rpb25fbWVzc2FnZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluayk7CisKKyAgICAgICAgICBfZGJ1c19hc3NlcnQgKGRidXNfbWVzc2FnZV9nZXRfc2VuZGVyIChtLT5tZXNzYWdlKSAhPSBOVUxMKTsKKyAgICAgICAgICAKKyAgICAgICAgICBkYnVzX2Nvbm5lY3Rpb25fc2VuZF9wcmVhbGxvY2F0ZWQgKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLT5wcmVhbGxvY2F0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLT5tZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgICAgICAgICBtLT5wcmVhbGxvY2F0ZWQgPSBOVUxMOyAvKiBzbyB3ZSBkb24ndCBkb3VibGUtZnJlZSBpdCAqLworICAgICAgICAgIAorICAgICAgICAgIG1lc3NhZ2VfdG9fc2VuZF9mcmVlIChjb25uZWN0aW9uLCBtKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgIGxpbmsgPSBwcmV2OworICAgIH0KK30KKwordm9pZAorYnVzX3RyYW5zYWN0aW9uX2V4ZWN1dGVfYW5kX2ZyZWUgKEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbikKK3sKKyAgLyogRm9yIGVhY2ggY29ubmVjdGlvbiBpbiB0cmFuc2FjdGlvbi0+Y29ubmVjdGlvbnMKKyAgICogc2VuZCB0aGUgbWVzc2FnZXMKKyAgICovCisgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uOworCisgIF9kYnVzX3ZlcmJvc2UgKCJUUkFOU0FDVElPTjogZXhlY3V0aW5nXG4iKTsKKyAgCisgIHdoaWxlICgoY29ubmVjdGlvbiA9IF9kYnVzX2xpc3RfcG9wX2ZpcnN0ICgmdHJhbnNhY3Rpb24tPmNvbm5lY3Rpb25zKSkpCisgICAgY29ubmVjdGlvbl9leGVjdXRlX3RyYW5zYWN0aW9uIChjb25uZWN0aW9uLCB0cmFuc2FjdGlvbik7CisKKyAgdHJhbnNhY3Rpb25fZnJlZSAodHJhbnNhY3Rpb24pOworfQorCitzdGF0aWMgdm9pZAorYnVzX2Nvbm5lY3Rpb25fcmVtb3ZlX3RyYW5zYWN0aW9ucyAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIE1lc3NhZ2VUb1NlbmQgKnRvX3NlbmQ7CisgIEJ1c0Nvbm5lY3Rpb25EYXRhICpkOworICAKKyAgZCA9IEJVU19DT05ORUNUSU9OX0RBVEEgKGNvbm5lY3Rpb24pOworICBfZGJ1c19hc3NlcnQgKGQgIT0gTlVMTCk7CisgIAorICB3aGlsZSAoKHRvX3NlbmQgPSBfZGJ1c19saXN0X2dldF9maXJzdCAoJmQtPnRyYW5zYWN0aW9uX21lc3NhZ2VzKSkpCisgICAgeworICAgICAgLyogb25seSBoYXMgYW4gZWZmZWN0IGZvciB0aGUgZmlyc3QgTWVzc2FnZVRvU2VuZCBsaXN0aW5nIHRoaXMgdHJhbnNhY3Rpb24gKi8KKyAgICAgIF9kYnVzX2xpc3RfcmVtb3ZlICgmdG9fc2VuZC0+dHJhbnNhY3Rpb24tPmNvbm5lY3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24pOworCisgICAgICBfZGJ1c19saXN0X3JlbW92ZSAoJmQtPnRyYW5zYWN0aW9uX21lc3NhZ2VzLCB0b19zZW5kKTsKKyAgICAgIG1lc3NhZ2VfdG9fc2VuZF9mcmVlIChjb25uZWN0aW9uLCB0b19zZW5kKTsKKyAgICB9Cit9CisKKy8qKgorICogQ29udmVydHMgdGhlIERCdXNFcnJvciB0byBhIG1lc3NhZ2UgcmVwbHkKKyAqLworZGJ1c19ib29sX3QKK2J1c190cmFuc2FjdGlvbl9zZW5kX2Vycm9yX3JlcGx5IChCdXNUcmFuc2FjdGlvbiAgKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzRXJyb3IgKmVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICAqaW5fcmVwbHlfdG8pCit7CisgIERCdXNNZXNzYWdlICpyZXBseTsKKyAgCisgIF9kYnVzX2Fzc2VydCAoZXJyb3IgIT0gTlVMTCk7CisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgCisgIF9kYnVzX3ZlcmJvc2UgKCJTZW5kaW5nIGVycm9yIHJlcGx5ICVzIFwiJXNcIlxuIiwKKyAgICAgICAgICAgICAgICAgZXJyb3ItPm5hbWUsIGVycm9yLT5tZXNzYWdlKTsKKworICByZXBseSA9IGRidXNfbWVzc2FnZV9uZXdfZXJyb3IgKGluX3JlcGx5X3RvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLT5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLT5tZXNzYWdlKTsKKyAgaWYgKHJlcGx5ID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghYnVzX3RyYW5zYWN0aW9uX3NlbmRfZnJvbV9kcml2ZXIgKHRyYW5zYWN0aW9uLCBjb25uZWN0aW9uLCByZXBseSkpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworICAKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2RidXNfYm9vbF90CitidXNfdHJhbnNhY3Rpb25fYWRkX2NhbmNlbF9ob29rIChCdXNUcmFuc2FjdGlvbiAgICAgICAgICAgICAgICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1RyYW5zYWN0aW9uQ2FuY2VsRnVuY3Rpb24gIGNhbmNlbF9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRnJlZUZ1bmN0aW9uICAgICAgICAgICAgICBmcmVlX2RhdGFfZnVuY3Rpb24pCit7CisgIENhbmNlbEhvb2sgKmNoOworCisgIGNoID0gZGJ1c19uZXcgKENhbmNlbEhvb2ssIDEpOworICBpZiAoY2ggPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgX2RidXNfdmVyYm9zZSAoIiAgICAgYWRkaW5nIGNhbmNlbCBob29rIGZ1bmN0aW9uID0gJXAgZGF0YSA9ICVwXG4iLAorICAgICAgICAgICAgICAgICBjYW5jZWxfZnVuY3Rpb24sIGRhdGEpOworICAKKyAgY2gtPmNhbmNlbF9mdW5jdGlvbiA9IGNhbmNlbF9mdW5jdGlvbjsKKyAgY2gtPmRhdGEgPSBkYXRhOworICBjaC0+ZnJlZV9kYXRhX2Z1bmN0aW9uID0gZnJlZV9kYXRhX2Z1bmN0aW9uOworCisgIC8qIEl0J3MgaW1wb3J0YW50IHRoYXQgdGhlIGhvb2tzIGdldCBydW4gaW4gcmV2ZXJzZSBvcmRlciB0aGF0IHRoZXkKKyAgICogd2VyZSBhZGRlZAorICAgKi8KKyAgaWYgKCFfZGJ1c19saXN0X3ByZXBlbmQgKCZ0cmFuc2FjdGlvbi0+Y2FuY2VsX2hvb2tzLCBjaCkpCisgICAgeworICAgICAgZGJ1c19mcmVlIChjaCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCitpbnQKK2J1c19jb25uZWN0aW9uc19nZXRfbl9hY3RpdmUgKEJ1c0Nvbm5lY3Rpb25zICpjb25uZWN0aW9ucykKK3sKKyAgcmV0dXJuIGNvbm5lY3Rpb25zLT5uX2NvbXBsZXRlZDsKK30KKworaW50CitidXNfY29ubmVjdGlvbnNfZ2V0X25faW5jb21wbGV0ZSAoQnVzQ29ubmVjdGlvbnMgKmNvbm5lY3Rpb25zKQoreworICByZXR1cm4gY29ubmVjdGlvbnMtPm5faW5jb21wbGV0ZTsKK30KKworI2lmZGVmIERCVVNfRU5BQkxFX1NUQVRTCitpbnQKK2J1c19jb25uZWN0aW9uc19nZXRfdG90YWxfbWF0Y2hfcnVsZXMgKEJ1c0Nvbm5lY3Rpb25zICpjb25uZWN0aW9ucykKK3sKKyAgcmV0dXJuIGNvbm5lY3Rpb25zLT50b3RhbF9tYXRjaF9ydWxlczsKK30KKworaW50CitidXNfY29ubmVjdGlvbnNfZ2V0X3BlYWtfbWF0Y2hfcnVsZXMgKEJ1c0Nvbm5lY3Rpb25zICpjb25uZWN0aW9ucykKK3sKKyAgcmV0dXJuIGNvbm5lY3Rpb25zLT5wZWFrX21hdGNoX3J1bGVzOworfQorCitpbnQKK2J1c19jb25uZWN0aW9uc19nZXRfcGVha19tYXRjaF9ydWxlc19wZXJfY29ubiAoQnVzQ29ubmVjdGlvbnMgKmNvbm5lY3Rpb25zKQoreworICByZXR1cm4gY29ubmVjdGlvbnMtPnBlYWtfbWF0Y2hfcnVsZXNfcGVyX2Nvbm47Cit9CisKK2ludAorYnVzX2Nvbm5lY3Rpb25zX2dldF90b3RhbF9idXNfbmFtZXMgKEJ1c0Nvbm5lY3Rpb25zICpjb25uZWN0aW9ucykKK3sKKyAgcmV0dXJuIGNvbm5lY3Rpb25zLT50b3RhbF9idXNfbmFtZXM7Cit9CisKK2ludAorYnVzX2Nvbm5lY3Rpb25zX2dldF9wZWFrX2J1c19uYW1lcyAoQnVzQ29ubmVjdGlvbnMgKmNvbm5lY3Rpb25zKQoreworICByZXR1cm4gY29ubmVjdGlvbnMtPnBlYWtfYnVzX25hbWVzOworfQorCitpbnQKK2J1c19jb25uZWN0aW9uc19nZXRfcGVha19idXNfbmFtZXNfcGVyX2Nvbm4gKEJ1c0Nvbm5lY3Rpb25zICpjb25uZWN0aW9ucykKK3sKKyAgcmV0dXJuIGNvbm5lY3Rpb25zLT5wZWFrX2J1c19uYW1lc19wZXJfY29ubjsKK30KKworaW50CitidXNfY29ubmVjdGlvbl9nZXRfcGVha19tYXRjaF9ydWxlcyAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIEJ1c0Nvbm5lY3Rpb25EYXRhICpkOworCisgIGQgPSBCVVNfQ09OTkVDVElPTl9EQVRBIChjb25uZWN0aW9uKTsKKyAgX2RidXNfYXNzZXJ0KGQgIT0gTlVMTCk7CisKKyAgcmV0dXJuIGQtPnBlYWtfbWF0Y2hfcnVsZXM7Cit9CisKK2ludAorYnVzX2Nvbm5lY3Rpb25fZ2V0X3BlYWtfYnVzX25hbWVzIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgQnVzQ29ubmVjdGlvbkRhdGEgKmQ7CisKKyAgZCA9IEJVU19DT05ORUNUSU9OX0RBVEEgKGNvbm5lY3Rpb24pOworICBfZGJ1c19hc3NlcnQoZCAhPSBOVUxMKTsKKworICByZXR1cm4gZC0+cGVha19idXNfbmFtZXM7Cit9CisjZW5kaWYgLyogREJVU19FTkFCTEVfU1RBVFMgKi8KKworZGJ1c19ib29sX3QKK2J1c19jb25uZWN0aW9uX2lzX21vbml0b3IgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBCdXNDb25uZWN0aW9uRGF0YSAqZDsKKworICBkID0gQlVTX0NPTk5FQ1RJT05fREFUQSAoY29ubmVjdGlvbik7CisgIF9kYnVzX2Fzc2VydChkICE9IE5VTEwpOworCisgIHJldHVybiBkLT5saW5rX2luX21vbml0b3JzICE9IE5VTEw7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYmNkX2FkZF9tb25pdG9yX3J1bGVzIChCdXNDb25uZWN0aW9uRGF0YSAgKmQsCisgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICAgICAgICAgKipydWxlcykKK3sKKyAgQnVzTWF0Y2htYWtlciAqbW0gPSBkLT5jb25uZWN0aW9ucy0+bW9uaXRvcl9tYXRjaG1ha2VyOworICBEQnVzTGlzdCAqaXRlcjsKKworICBpZiAobW0gPT0gTlVMTCkKKyAgICB7CisgICAgICBtbSA9IGJ1c19tYXRjaG1ha2VyX25ldyAoKTsKKworICAgICAgaWYgKG1tID09IE5VTEwpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgZC0+Y29ubmVjdGlvbnMtPm1vbml0b3JfbWF0Y2htYWtlciA9IG1tOworICAgIH0KKworICBmb3IgKGl0ZXIgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rIChydWxlcyk7CisgICAgICBpdGVyICE9IE5VTEw7CisgICAgICBpdGVyID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rIChydWxlcywgaXRlcikpCisgICAgeworICAgICAgaWYgKCFidXNfbWF0Y2htYWtlcl9hZGRfcnVsZSAobW0sIGl0ZXItPmRhdGEpKQorICAgICAgICB7CisgICAgICAgICAgYnVzX21hdGNobWFrZXJfZGlzY29ubmVjdGVkIChtbSwgY29ubmVjdGlvbik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorYmNkX2Ryb3BfbW9uaXRvcl9ydWxlcyAoQnVzQ29ubmVjdGlvbkRhdGEgKmQsCisgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgQnVzTWF0Y2htYWtlciAqbW0gPSBkLT5jb25uZWN0aW9ucy0+bW9uaXRvcl9tYXRjaG1ha2VyOworCisgIGlmIChtbSAhPSBOVUxMKQorICAgIGJ1c19tYXRjaG1ha2VyX2Rpc2Nvbm5lY3RlZCAobW0sIGNvbm5lY3Rpb24pOworfQorCitkYnVzX2Jvb2xfdAorYnVzX2Nvbm5lY3Rpb25fYmVfbW9uaXRvciAoREJ1c0Nvbm5lY3Rpb24gICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzVHJhbnNhY3Rpb24gICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNMaXN0ICAgICAgICoqcnVsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgKmVycm9yKQoreworICBCdXNDb25uZWN0aW9uRGF0YSAqZDsKKyAgREJ1c0xpc3QgKmxpbms7CisgIERCdXNMaXN0ICp0bXA7CisgIERCdXNMaXN0ICppdGVyOworCisgIGQgPSBCVVNfQ09OTkVDVElPTl9EQVRBIChjb25uZWN0aW9uKTsKKyAgX2RidXNfYXNzZXJ0IChkICE9IE5VTEwpOworCisgIGxpbmsgPSBfZGJ1c19saXN0X2FsbG9jX2xpbmsgKGNvbm5lY3Rpb24pOworCisgIGlmIChsaW5rID09IE5VTEwpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFiY2RfYWRkX21vbml0b3JfcnVsZXMgKGQsIGNvbm5lY3Rpb24sIHJ1bGVzKSkKKyAgICB7CisgICAgICBfZGJ1c19saXN0X2ZyZWVfbGluayAobGluayk7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAvKiByZWxlYXNlIGFsbCBpdHMgbmFtZXMgKi8KKyAgaWYgKCFfZGJ1c19saXN0X2NvcHkgKCZkLT5zZXJ2aWNlc19vd25lZCwgJnRtcCkpCisgICAgeworICAgICAgYmNkX2Ryb3BfbW9uaXRvcl9ydWxlcyAoZCwgY29ubmVjdGlvbik7CisgICAgICBfZGJ1c19saXN0X2ZyZWVfbGluayAobGluayk7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBmb3IgKGl0ZXIgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmdG1wKTsKKyAgICAgIGl0ZXIgIT0gTlVMTDsKKyAgICAgIGl0ZXIgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZ0bXAsIGl0ZXIpKQorICAgIHsKKyAgICAgIEJ1c1NlcnZpY2UgKnNlcnZpY2UgPSBpdGVyLT5kYXRhOworCisgICAgICAvKiBUaGlzIGNhbGwgaXMgdHJhbnNhY3Rpb25hbDogaWYgdGhlcmUgaXNuJ3QgZW5vdWdoIG1lbW9yeSB0bworICAgICAgICogZG8gZXZlcnl0aGluZywgdGhlbiB0aGUgc2VydmljZSBnZXRzIGFsbCBpdHMgbmFtZXMgYmFjayB3aGVuCisgICAgICAgKiB0aGUgdHJhbnNhY3Rpb24gaXMgY2FuY2VsbGVkIGR1ZSB0byBPT00uICovCisgICAgICBpZiAoIWJ1c19zZXJ2aWNlX3JlbW92ZV9vd25lciAoc2VydmljZSwgY29ubmVjdGlvbiwgdHJhbnNhY3Rpb24sIGVycm9yKSkKKyAgICAgICAgeworICAgICAgICAgIGJjZF9kcm9wX21vbml0b3JfcnVsZXMgKGQsIGNvbm5lY3Rpb24pOworICAgICAgICAgIF9kYnVzX2xpc3RfZnJlZV9saW5rIChsaW5rKTsKKyAgICAgICAgICBfZGJ1c19saXN0X2NsZWFyICgmdG1wKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgLyogV2UgaGF2ZSBub3cgZG9uZSBldmVyeXRoaW5nIHRoYXQgY2FuIGZhaWwsIHNvIHRoZXJlIGlzIG5vIHByb2JsZW0KKyAgICogd2l0aCBkb2luZyB0aGUgaXJyZXZvY2FibGUgc3R1ZmYuICovCisKKyAgX2RidXNfbGlzdF9jbGVhciAoJnRtcCk7CisKKyAgYnVzX2NvbnRleHRfbG9nICh0cmFuc2FjdGlvbi0+Y29udGV4dCwgREJVU19TWVNURU1fTE9HX0lORk8sCisgICAgICAgICAgICAgICAgICAgIkNvbm5lY3Rpb24gJXMgKCVzKSBiZWNhbWUgYSBtb25pdG9yLiIsIGQtPm5hbWUsCisgICAgICAgICAgICAgICAgICAgZC0+Y2FjaGVkX2xvZ2luZm9fc3RyaW5nKTsKKworICBpZiAoZC0+bl9tYXRjaF9ydWxlcyA+IDApCisgICAgeworICAgICAgQnVzTWF0Y2htYWtlciAqbW07CisKKyAgICAgIG1tID0gYnVzX2NvbnRleHRfZ2V0X21hdGNobWFrZXIgKGQtPmNvbm5lY3Rpb25zLT5jb250ZXh0KTsKKyAgICAgIGJ1c19tYXRjaG1ha2VyX2Rpc2Nvbm5lY3RlZCAobW0sIGNvbm5lY3Rpb24pOworICAgIH0KKworICAvKiBmbGFnIGl0IGFzIGEgbW9uaXRvciAqLworICBkLT5saW5rX2luX21vbml0b3JzID0gbGluazsKKyAgX2RidXNfbGlzdF9hcHBlbmRfbGluayAoJmQtPmNvbm5lY3Rpb25zLT5tb25pdG9ycywgbGluayk7CisKKyAgLyogaXQgaXNuJ3QgYWxsb3dlZCB0byByZXBseSwgYW5kIGl0IGlzIG5vIGxvbmdlciByZWxldmFudCB3aGV0aGVyIGl0CisgICAqIHJlY2VpdmVzIHJlcGxpZXMgKi8KKyAgYnVzX2Nvbm5lY3Rpb25fZHJvcF9wZW5kaW5nX3JlcGxpZXMgKGQtPmNvbm5lY3Rpb25zLCBjb25uZWN0aW9uKTsKKworICByZXR1cm4gVFJVRTsKK30KZGlmZiAtLWdpdCBhL2J1cy9jb25uZWN0aW9uLmggYi9idXMvY29ubmVjdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllMjUzYWUKLS0tIC9kZXYvbnVsbAorKysgYi9idXMvY29ubmVjdGlvbi5oCkBAIC0wLDAgKzEsMTczIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGNvbm5lY3Rpb24uaCAgQ2xpZW50IGNvbm5lY3Rpb25zCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0ICBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpZm5kZWYgQlVTX0NPTk5FQ1RJT05fSAorI2RlZmluZSBCVVNfQ09OTkVDVElPTl9ICisKKyNpbmNsdWRlIDxkYnVzL2RidXMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbGlzdC5oPgorI2luY2x1ZGUgImJ1cy5oIgorCit0eXBlZGVmIGRidXNfYm9vbF90ICgqIEJ1c0Nvbm5lY3Rpb25Gb3JlYWNoRnVuY3Rpb24pIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAqZGF0YSk7CisKKworQnVzQ29ubmVjdGlvbnMqIGJ1c19jb25uZWN0aW9uc19uZXcgICAgICAgICAgICAgICAoQnVzQ29udGV4dCAgICAgICAgICAgICAgICAgICAqY29udGV4dCk7CitCdXNDb25uZWN0aW9ucyogYnVzX2Nvbm5lY3Rpb25zX3JlZiAgICAgICAgICAgICAgIChCdXNDb25uZWN0aW9ucyAgICAgICAgICAgICAgICpjb25uZWN0aW9ucyk7Cit2b2lkICAgICAgICAgICAgYnVzX2Nvbm5lY3Rpb25zX3VucmVmICAgICAgICAgICAgIChCdXNDb25uZWN0aW9ucyAgICAgICAgICAgICAgICpjb25uZWN0aW9ucyk7CitkYnVzX2Jvb2xfdCAgICAgYnVzX2Nvbm5lY3Rpb25zX3NldHVwX2Nvbm5lY3Rpb24gIChCdXNDb25uZWN0aW9ucyAgICAgICAgICAgICAgICpjb25uZWN0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICAgKmNvbm5lY3Rpb24pOwordm9pZCAgICAgICAgICAgIGJ1c19jb25uZWN0aW9uc19mb3JlYWNoICAgICAgICAgICAoQnVzQ29ubmVjdGlvbnMgICAgICAgICAgICAgICAqY29ubmVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNDb25uZWN0aW9uRm9yZWFjaEZ1bmN0aW9uICBmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEpOwordm9pZCAgICAgICAgICAgIGJ1c19jb25uZWN0aW9uc19mb3JlYWNoX2FjdGl2ZSAgICAoQnVzQ29ubmVjdGlvbnMgICAgICAgICAgICAgICAqY29ubmVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNDb25uZWN0aW9uRm9yZWFjaEZ1bmN0aW9uICBmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEpOworQnVzQ29udGV4dCogICAgIGJ1c19jb25uZWN0aW9uc19nZXRfY29udGV4dCAgICAgICAoQnVzQ29ubmVjdGlvbnMgICAgICAgICAgICAgICAqY29ubmVjdGlvbnMpOwordm9pZCAgICAgICAgICAgIGJ1c19jb25uZWN0aW9uc19pbmNyZW1lbnRfc3RhbXAgICAoQnVzQ29ubmVjdGlvbnMgICAgICAgICAgICAgICAqY29ubmVjdGlvbnMpOworZGJ1c19ib29sX3QgICAgIGJ1c19jb25uZWN0aW9uc19yZWxvYWRfcG9saWN5ICAgICAoQnVzQ29ubmVjdGlvbnMgICAgICAgICAgICAgICAqY29ubmVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAgICAgICAgICAgICplcnJvcik7CitCdXNDb250ZXh0KiAgICAgYnVzX2Nvbm5lY3Rpb25fZ2V0X2NvbnRleHQgICAgICAgIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAgICpjb25uZWN0aW9uKTsKK0J1c0Nvbm5lY3Rpb25zKiBidXNfY29ubmVjdGlvbl9nZXRfY29ubmVjdGlvbnMgICAgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICAgKmNvbm5lY3Rpb24pOworQnVzUmVnaXN0cnkqICAgIGJ1c19jb25uZWN0aW9uX2dldF9yZWdpc3RyeSAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgICAqY29ubmVjdGlvbik7CitCdXNBY3RpdmF0aW9uKiAgYnVzX2Nvbm5lY3Rpb25fZ2V0X2FjdGl2YXRpb24gICAgIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAgICpjb25uZWN0aW9uKTsKK0J1c01hdGNobWFrZXIqICBidXNfY29ubmVjdGlvbl9nZXRfbWF0Y2htYWtlciAgICAgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICAgKmNvbm5lY3Rpb24pOworY29uc3QgY2hhciAqICAgIGJ1c19jb25uZWN0aW9uX2dldF9sb2dpbmZvICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICpjb25uZWN0aW9uKTsKK0J1c1NFTGludXhJRCogICBidXNfY29ubmVjdGlvbl9nZXRfc2VsaW51eF9pZCAgICAgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICAgKmNvbm5lY3Rpb24pOworQnVzQXBwQXJtb3JDb25maW5lbWVudCogYnVzX2Nvbm5lY3Rpb25fZHVwX2FwcGFybW9yX2NvbmZpbmVtZW50IChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbik7CitkYnVzX2Jvb2xfdCAgICAgYnVzX2Nvbm5lY3Rpb25zX2NoZWNrX2xpbWl0cyAgICAgIChCdXNDb25uZWN0aW9ucyAgICAgICAgICAgICAgICpjb25uZWN0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICAgKnJlcXVlc3RpbmdfY29tcGxldGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICAgICAgICAgICAqKmxpbWl0X25hbWVfb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAqbGltaXRfb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgICAgICAgICAgICAqZXJyb3IpOwordm9pZCAgICAgICAgICAgIGJ1c19jb25uZWN0aW9uc19leHBpcmVfaW5jb21wbGV0ZSAoQnVzQ29ubmVjdGlvbnMgICAgICAgICAgICAgICAqY29ubmVjdGlvbnMpOworCitkYnVzX2Jvb2xfdCAgICAgYnVzX2Nvbm5lY3Rpb25zX2V4cGVjdF9yZXBseSAgICAgIChCdXNDb25uZWN0aW9ucyAgICAgICAgICAgICAgICpjb25uZWN0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1RyYW5zYWN0aW9uICAgICAgICAgICAgICAgKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgICAqd2lsbF9nZXRfcmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAgICp3aWxsX3NlbmRfcmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgICAgICAgICAgICAgICpyZXBseV90b190aGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgICAgICAgICAgICAqZXJyb3IpOworZGJ1c19ib29sX3QgICAgIGJ1c19jb25uZWN0aW9uc19jaGVja19yZXBseSAgICAgICAoQnVzQ29ubmVjdGlvbnMgICAgICAgICAgICAgICAqY29ubmVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNUcmFuc2FjdGlvbiAgICAgICAgICAgICAgICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICAgKnNlbmRpbmdfcmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAgICpyZWNlaXZpbmdfcmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgICAgICAgICAgICAgICpyZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICAgICAgICAgICAgKmVycm9yKTsKKworZGJ1c19ib29sX3QgICAgIGJ1c19jb25uZWN0aW9uX21hcmtfc3RhbXAgICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgICAqY29ubmVjdGlvbik7CisKK2RidXNfYm9vbF90IGJ1c19jb25uZWN0aW9uX2lzX2FjdGl2ZSAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOworY29uc3QgY2hhciAqYnVzX2Nvbm5lY3Rpb25fZ2V0X25hbWUgIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbik7CisKK2RidXNfYm9vbF90IGJ1c19jb25uZWN0aW9uX3ByZWFsbG9jYXRlX29vbV9lcnJvciAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOwordm9pZCAgICAgICAgYnVzX2Nvbm5lY3Rpb25fc2VuZF9vb21fZXJyb3IgICAgICAgIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgKmluX3JlcGx5X3RvKTsKKworLyogY2FsbGVkIGJ5IHNpZ25hbHMuYyAqLworZGJ1c19ib29sX3QgYnVzX2Nvbm5lY3Rpb25fYWRkX21hdGNoX3J1bGUgICAgICAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNNYXRjaFJ1bGUgICAqcnVsZSk7Cit2b2lkICAgICAgICBidXNfY29ubmVjdGlvbl9hZGRfbWF0Y2hfcnVsZV9saW5rIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNMaXN0ICAgICAgICpsaW5rKTsKK3ZvaWQgICAgICAgIGJ1c19jb25uZWN0aW9uX3JlbW92ZV9tYXRjaF9ydWxlICAgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzTWF0Y2hSdWxlICAgKnJ1bGUpOworaW50ICAgICAgICAgYnVzX2Nvbm5lY3Rpb25fZ2V0X25fbWF0Y2hfcnVsZXMgICAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOworCisKKy8qIGNhbGxlZCBieSBzZXJ2aWNlcy5jICovCitkYnVzX2Jvb2xfdCBidXNfY29ubmVjdGlvbl9hZGRfb3duZWRfc2VydmljZSAgICAgIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1NlcnZpY2UgICAgICpzZXJ2aWNlKTsKK3ZvaWQgICAgICAgIGJ1c19jb25uZWN0aW9uX3JlbW92ZV9vd25lZF9zZXJ2aWNlICAgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzU2VydmljZSAgICAgKnNlcnZpY2UpOwordm9pZCAgICAgICAgYnVzX2Nvbm5lY3Rpb25fYWRkX293bmVkX3NlcnZpY2VfbGluayAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAgICAgICAqbGluayk7CitpbnQgICAgICAgICBidXNfY29ubmVjdGlvbl9nZXRfbl9zZXJ2aWNlc19vd25lZCAgIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbik7CisKKy8qIGNhbGxlZCBieSBkcml2ZXIuYyAqLworZGJ1c19ib29sX3QgYnVzX2Nvbm5lY3Rpb25fY29tcGxldGUgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICAgKmNvbm5lY3Rpb24sCisJCQkJICAgICBjb25zdCBEQnVzU3RyaW5nICAgICAgICAgICAgICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICAgICAgICAgICAgKmVycm9yKTsKKworLyogY2FsbGVkIGJ5IGRpc3BhdGNoLmMgd2hlbiB0aGUgY29ubmVjdGlvbiBpcyBkcm9wcGVkICovCit2b2lkICAgICAgICBidXNfY29ubmVjdGlvbl9kaXNjb25uZWN0ZWQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKTsKKworZGJ1c19ib29sX3QgICAgICBidXNfY29ubmVjdGlvbl9pc19pbl91bml4X2dyb3VwIChEQnVzQ29ubmVjdGlvbiAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgICAgICAgIGdpZCk7CitkYnVzX2Jvb2xfdCAgICAgIGJ1c19jb25uZWN0aW9uX2dldF91bml4X2dyb3VwcyAgKERCdXNDb25uZWN0aW9uICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgICAgICoqZ3JvdXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAqbl9ncm91cHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICAgICplcnJvcik7CitCdXNDbGllbnRQb2xpY3kqIGJ1c19jb25uZWN0aW9uX2dldF9wb2xpY3kgIChEQnVzQ29ubmVjdGlvbiAgICAgICAqY29ubmVjdGlvbik7CisKK2RidXNfYm9vbF90IGJ1c19jb25uZWN0aW9uX2lzX21vbml0b3IgKERCdXNDb25uZWN0aW9uICAqY29ubmVjdGlvbik7CitkYnVzX2Jvb2xfdCBidXNfY29ubmVjdGlvbl9iZV9tb25pdG9yIChEQnVzQ29ubmVjdGlvbiAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNUcmFuc2FjdGlvbiAgKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICAgICAgKipydWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAqZXJyb3IpOworCisvKiB0cmFuc2FjdGlvbiBBUEkgc28gd2UgY2FuIHNlbmQgb3Igbm90IHNlbmQgYSBibG9jayBvZiBtZXNzYWdlcyBhcyBhIHdob2xlICovCisKK3R5cGVkZWYgdm9pZCAoKiBCdXNUcmFuc2FjdGlvbkNhbmNlbEZ1bmN0aW9uKSAodm9pZCAqZGF0YSk7CisKK0J1c1RyYW5zYWN0aW9uKiBidXNfdHJhbnNhY3Rpb25fbmV3ICAgICAgICAgICAgICAoQnVzQ29udGV4dCAgICAgICAgICAgICAgICAgICAqY29udGV4dCk7CitCdXNDb250ZXh0KiAgICAgYnVzX3RyYW5zYWN0aW9uX2dldF9jb250ZXh0ICAgICAgKEJ1c1RyYW5zYWN0aW9uICAgICAgICAgICAgICAgKnRyYW5zYWN0aW9uKTsKK2RidXNfYm9vbF90ICAgICBidXNfdHJhbnNhY3Rpb25fc2VuZCAgICAgICAgICAgICAoQnVzVHJhbnNhY3Rpb24gICAgICAgICAgICAgICAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICAgICAgICAgICAgICAgKm1lc3NhZ2UpOworZGJ1c19ib29sX3QgICAgIGJ1c190cmFuc2FjdGlvbl9jYXB0dXJlICAgICAgICAgIChCdXNUcmFuc2FjdGlvbiAgICAgICAgICAgICAgICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgICAqYWRkcmVzc2VkX3JlY2lwaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICAgICAgICAgICAgICAqbWVzc2FnZSk7CitkYnVzX2Jvb2xfdCAgICAgYnVzX3RyYW5zYWN0aW9uX2NhcHR1cmVfZXJyb3JfcmVwbHkgKEJ1c1RyYW5zYWN0aW9uICAgICAgICAgICAgKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAgICphZGRyZXNzZWRfcmVjaXBpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzRXJyb3IgICAgICAgICAgICAgICplcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICAgICAgICAgICAgICAqaW5fcmVwbHlfdG8pOworZGJ1c19ib29sX3QgICAgIGJ1c190cmFuc2FjdGlvbl9zZW5kX2Zyb21fZHJpdmVyIChCdXNUcmFuc2FjdGlvbiAgICAgICAgICAgICAgICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICAgICAgICAgICAgICAqbWVzc2FnZSk7CitkYnVzX2Jvb2xfdCAgICAgYnVzX3RyYW5zYWN0aW9uX3NlbmRfZXJyb3JfcmVwbHkgKEJ1c1RyYW5zYWN0aW9uICAgICAgICAgICAgICAgKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzRXJyb3IgICAgICAgICAgICAgICplcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICAgICAgICAgICAgICAqaW5fcmVwbHlfdG8pOwordm9pZCAgICAgICAgICAgIGJ1c190cmFuc2FjdGlvbl9jYW5jZWxfYW5kX2ZyZWUgIChCdXNUcmFuc2FjdGlvbiAgICAgICAgICAgICAgICp0cmFuc2FjdGlvbik7Cit2b2lkICAgICAgICAgICAgYnVzX3RyYW5zYWN0aW9uX2V4ZWN1dGVfYW5kX2ZyZWUgKEJ1c1RyYW5zYWN0aW9uICAgICAgICAgICAgICAgKnRyYW5zYWN0aW9uKTsKK2RidXNfYm9vbF90ICAgICBidXNfdHJhbnNhY3Rpb25fYWRkX2NhbmNlbF9ob29rICAoQnVzVHJhbnNhY3Rpb24gICAgICAgICAgICAgICAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1RyYW5zYWN0aW9uQ2FuY2VsRnVuY3Rpb24gIGNhbmNlbF9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgICAgICAgICAgICAgZnJlZV9kYXRhX2Z1bmN0aW9uKTsKKworaW50IGJ1c19jb25uZWN0aW9uc19nZXRfbl9hY3RpdmUgICAgICAgICAgICAgICAgICAoQnVzQ29ubmVjdGlvbnMgKmNvbm5lY3Rpb25zKTsKK2ludCBidXNfY29ubmVjdGlvbnNfZ2V0X25faW5jb21wbGV0ZSAgICAgICAgICAgICAgKEJ1c0Nvbm5lY3Rpb25zICpjb25uZWN0aW9ucyk7CisKKy8qIGNhbGxlZCBieSBzdGF0cy5jLCBvbmx5IHByZXNlbnQgaWYgREJVU19FTkFCTEVfU1RBVFMgKi8KK2ludCBidXNfY29ubmVjdGlvbnNfZ2V0X3RvdGFsX21hdGNoX3J1bGVzICAgICAgICAgKEJ1c0Nvbm5lY3Rpb25zICpjb25uZWN0aW9ucyk7CitpbnQgYnVzX2Nvbm5lY3Rpb25zX2dldF9wZWFrX21hdGNoX3J1bGVzICAgICAgICAgIChCdXNDb25uZWN0aW9ucyAqY29ubmVjdGlvbnMpOworaW50IGJ1c19jb25uZWN0aW9uc19nZXRfcGVha19tYXRjaF9ydWxlc19wZXJfY29ubiAoQnVzQ29ubmVjdGlvbnMgKmNvbm5lY3Rpb25zKTsKK2ludCBidXNfY29ubmVjdGlvbnNfZ2V0X3RvdGFsX2J1c19uYW1lcyAgICAgICAgICAgKEJ1c0Nvbm5lY3Rpb25zICpjb25uZWN0aW9ucyk7CitpbnQgYnVzX2Nvbm5lY3Rpb25zX2dldF9wZWFrX2J1c19uYW1lcyAgICAgICAgICAgIChCdXNDb25uZWN0aW9ucyAqY29ubmVjdGlvbnMpOworaW50IGJ1c19jb25uZWN0aW9uc19nZXRfcGVha19idXNfbmFtZXNfcGVyX2Nvbm4gICAoQnVzQ29ubmVjdGlvbnMgKmNvbm5lY3Rpb25zKTsKKworaW50IGJ1c19jb25uZWN0aW9uX2dldF9wZWFrX21hdGNoX3J1bGVzICAgICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOworaW50IGJ1c19jb25uZWN0aW9uX2dldF9wZWFrX2J1c19uYW1lcyAgICAgICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOworCisjZW5kaWYgLyogQlVTX0NPTk5FQ1RJT05fSCAqLwpkaWZmIC0tZ2l0IGEvYnVzL2RidXMuc2VydmljZS5pbiBiL2J1cy9kYnVzLnNlcnZpY2UuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2EwYjdlOQotLS0gL2Rldi9udWxsCisrKyBiL2J1cy9kYnVzLnNlcnZpY2UuaW4KQEAgLTAsMCArMSw5IEBACitbVW5pdF0KK0Rlc2NyaXB0aW9uPUQtQnVzIFN5c3RlbSBNZXNzYWdlIEJ1cworRG9jdW1lbnRhdGlvbj1tYW46ZGJ1cy1kYWVtb24oMSkKK1JlcXVpcmVzPWRidXMuc29ja2V0CisKK1tTZXJ2aWNlXQorRXhlY1N0YXJ0PUBFWFBBTkRFRF9CSU5ESVJAL2RidXMtZGFlbW9uIC0tc3lzdGVtIC0tYWRkcmVzcz1zeXN0ZW1kOiAtLW5vZm9yayAtLW5vcGlkZmlsZSAtLXN5c3RlbWQtYWN0aXZhdGlvbiAtLXN5c2xvZy1vbmx5CitFeGVjUmVsb2FkPUBFWFBBTkRFRF9CSU5ESVJAL2RidXMtc2VuZCAtLXByaW50LXJlcGx5IC0tc3lzdGVtIC0tdHlwZT1tZXRob2RfY2FsbCAtLWRlc3Q9b3JnLmZyZWVkZXNrdG9wLkRCdXMgLyBvcmcuZnJlZWRlc2t0b3AuREJ1cy5SZWxvYWRDb25maWcKK09PTVNjb3JlQWRqdXN0PS05MDAKZGlmZiAtLWdpdCBhL2J1cy9kYnVzLnNvY2tldC5pbiBiL2J1cy9kYnVzLnNvY2tldC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGNiZTU4Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzL2RidXMuc29ja2V0LmluCkBAIC0wLDAgKzEsNSBAQAorW1VuaXRdCitEZXNjcmlwdGlvbj1ELUJ1cyBTeXN0ZW0gTWVzc2FnZSBCdXMgU29ja2V0CisKK1tTb2NrZXRdCitMaXN0ZW5TdHJlYW09QERCVVNfU1lTVEVNX1NPQ0tFVEAKZGlmZiAtLWdpdCBhL2J1cy9kZXNrdG9wLWZpbGUuYyBiL2J1cy9kZXNrdG9wLWZpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDRmMGQzCi0tLSAvZGV2L251bGwKKysrIGIvYnVzL2Rlc2t0b3AtZmlsZS5jCkBAIC0wLDAgKzEsODEyIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRlc2t0b3AtZmlsZS5jICAuZGVza3RvcCBmaWxlIHBhcnNlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgQ29kZUZhY3RvcnkgQUIKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc3lzZGVwcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1pbnRlcm5hbHMuaD4KKyNpbmNsdWRlICJkZXNrdG9wLWZpbGUuaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorCit0eXBlZGVmIHN0cnVjdAoreworICBjaGFyICprZXk7CisgIGNoYXIgKnZhbHVlOworfSBCdXNEZXNrdG9wRmlsZUxpbmU7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGNoYXIgKnNlY3Rpb25fbmFtZTsKKyAgCisgIGludCBuX2xpbmVzOworICBCdXNEZXNrdG9wRmlsZUxpbmUgKmxpbmVzOworICBpbnQgbl9hbGxvY2F0ZWRfbGluZXM7ICAKK30gQnVzRGVza3RvcEZpbGVTZWN0aW9uOworCitzdHJ1Y3QgQnVzRGVza3RvcEZpbGUKK3sKKyAgaW50IG5fc2VjdGlvbnM7CisgIEJ1c0Rlc2t0b3BGaWxlU2VjdGlvbiAqc2VjdGlvbnM7CisgIGludCBuX2FsbG9jYXRlZF9zZWN0aW9uczsKK307CisKKy8qKgorICogUGFyc2VyIGZvciBzZXJ2aWNlIGZpbGVzLgorICovCit0eXBlZGVmIHN0cnVjdAoreworICBEQnVzU3RyaW5nIGRhdGE7IC8qKjwgVGhlIGRhdGEgZnJvbSB0aGUgZmlsZSAqLworCisgIEJ1c0Rlc2t0b3BGaWxlICpkZXNrdG9wX2ZpbGU7IC8qKjwgVGhlIHJlc3VsdGluZyBvYmplY3QgKi8KKyAgaW50IGN1cnJlbnRfc2VjdGlvbjsgICAgLyoqPCBUaGUgY3VycmVudCBzZWN0aW9uIGJlaW5nIHBhcnNlZCAqLworICAKKyAgaW50IHBvczsgICAgICAgICAgLyoqPCBDdXJyZW50IHBvc2l0aW9uICovCisgIGludCBsZW47ICAgICAgICAgIC8qKjwgTGVuZ3RoICovCisgIGludCBsaW5lX251bTsgICAgIC8qKjwgQ3VycmVudCBsaW5lIG51bWJlciAqLworICAKK30gQnVzRGVza3RvcEZpbGVQYXJzZXI7CisKKyNkZWZpbmUgVkFMSURfS0VZX0NIQVIgMQorI2RlZmluZSBWQUxJRF9MT0NBTEVfQ0hBUiAyCitzdGF0aWMgdW5zaWduZWQgY2hhciB2YWxpZFsyNTZdID0geyAKKyAgIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIAorICAgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgCisgICAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDMgLCAweDIgLCAweDAgLCAKKyAgIDB4MyAsIDB4MyAsIDB4MyAsIDB4MyAsIDB4MyAsIDB4MyAsIDB4MyAsIDB4MyAsIDB4MyAsIDB4MyAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIAorICAgMHgwICwgMHgzICwgMHgzICwgMHgzICwgMHgzICwgMHgzICwgMHgzICwgMHgzICwgMHgzICwgMHgzICwgMHgzICwgMHgzICwgMHgzICwgMHgzICwgMHgzICwgMHgzICwgCisgICAweDMgLCAweDMgLCAweDMgLCAweDMgLCAweDMgLCAweDMgLCAweDMgLCAweDMgLCAweDMgLCAweDMgLCAweDMgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDIgLCAKKyAgIDB4MCAsIDB4MyAsIDB4MyAsIDB4MyAsIDB4MyAsIDB4MyAsIDB4MyAsIDB4MyAsIDB4MyAsIDB4MyAsIDB4MyAsIDB4MyAsIDB4MyAsIDB4MyAsIDB4MyAsIDB4MyAsIAorICAgMHgzICwgMHgzICwgMHgzICwgMHgzICwgMHgzICwgMHgzICwgMHgzICwgMHgzICwgMHgzICwgMHgzICwgMHgzICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgCisgICAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAKKyAgIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIAorICAgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgCisgICAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAKKyAgIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIAorICAgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgMHgwICwgCisgICAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAweDAgLCAKKyAgIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIDB4MCAsIAorfTsKKworc3RhdGljIHZvaWQgcmVwb3J0X2Vycm9yIChCdXNEZXNrdG9wRmlsZVBhcnNlciAqcGFyc2VyLAorCQkJICBjb25zdCBjaGFyICAgICAgICAgICAqbWVzc2FnZSwKKwkJCSAgY29uc3QgY2hhciAgICAgICAgICAgKmVycm9yX25hbWUsCisJCQkgIERCdXNFcnJvciAgICAgICAgICAgICplcnJvcik7CisKK3N0YXRpYyB2b2lkCitwYXJzZXJfZnJlZSAoQnVzRGVza3RvcEZpbGVQYXJzZXIgKnBhcnNlcikKK3sKKyAgYnVzX2Rlc2t0b3BfZmlsZV9mcmVlIChwYXJzZXItPmRlc2t0b3BfZmlsZSk7CisgIAorICBfZGJ1c19zdHJpbmdfZnJlZSAoJnBhcnNlci0+ZGF0YSk7Cit9CisKK3N0YXRpYyB2b2lkCitidXNfZGVza3RvcF9maWxlX2xpbmVfZnJlZSAoQnVzRGVza3RvcEZpbGVMaW5lICpsaW5lKQoreworICBkYnVzX2ZyZWUgKGxpbmUtPmtleSk7CisgIGRidXNfZnJlZSAobGluZS0+dmFsdWUpOworfQorCitzdGF0aWMgdm9pZAorYnVzX2Rlc2t0b3BfZmlsZV9zZWN0aW9uX2ZyZWUgKEJ1c0Rlc2t0b3BGaWxlU2VjdGlvbiAqc2VjdGlvbikKK3sKKyAgaW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IHNlY3Rpb24tPm5fbGluZXM7IGkrKykKKyAgICBidXNfZGVza3RvcF9maWxlX2xpbmVfZnJlZSAoJnNlY3Rpb24tPmxpbmVzW2ldKTsKKworICBkYnVzX2ZyZWUgKHNlY3Rpb24tPmxpbmVzKTsKKyAgZGJ1c19mcmVlIChzZWN0aW9uLT5zZWN0aW9uX25hbWUpOworfQorCit2b2lkCitidXNfZGVza3RvcF9maWxlX2ZyZWUgKEJ1c0Rlc2t0b3BGaWxlICpkZXNrdG9wX2ZpbGUpCit7CisgIGludCBpOworCisgIGZvciAoaSA9IDA7IGkgPCBkZXNrdG9wX2ZpbGUtPm5fc2VjdGlvbnM7IGkrKykKKyAgICBidXNfZGVza3RvcF9maWxlX3NlY3Rpb25fZnJlZSAoJmRlc2t0b3BfZmlsZS0+c2VjdGlvbnNbaV0pOworICBkYnVzX2ZyZWUgKGRlc2t0b3BfZmlsZS0+c2VjdGlvbnMpOworCisgIGRidXNfZnJlZSAoZGVza3RvcF9maWxlKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90Citncm93X2xpbmVzX2luX3NlY3Rpb24gKEJ1c0Rlc2t0b3BGaWxlU2VjdGlvbiAqc2VjdGlvbikKK3sKKyAgQnVzRGVza3RvcEZpbGVMaW5lICpsaW5lczsKKyAgCisgIGludCBuZXdfbl9saW5lczsKKworICBpZiAoc2VjdGlvbi0+bl9hbGxvY2F0ZWRfbGluZXMgPT0gMCkKKyAgICBuZXdfbl9saW5lcyA9IDE7CisgIGVsc2UKKyAgICBuZXdfbl9saW5lcyA9IHNlY3Rpb24tPm5fYWxsb2NhdGVkX2xpbmVzKjI7CisKKyAgbGluZXMgPSBkYnVzX3JlYWxsb2MgKHNlY3Rpb24tPmxpbmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mIChCdXNEZXNrdG9wRmlsZUxpbmUpICogbmV3X25fbGluZXMpOworCisgIGlmIChsaW5lcyA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKyAgCisgIHNlY3Rpb24tPmxpbmVzID0gbGluZXM7CisgIHNlY3Rpb24tPm5fYWxsb2NhdGVkX2xpbmVzID0gbmV3X25fbGluZXM7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZ3Jvd19zZWN0aW9ucyAoQnVzRGVza3RvcEZpbGUgKmRlc2t0b3BfZmlsZSkKK3sKKyAgaW50IG5ld19uX3NlY3Rpb25zOworICBCdXNEZXNrdG9wRmlsZVNlY3Rpb24gKnNlY3Rpb25zOworICAKKyAgaWYgKGRlc2t0b3BfZmlsZS0+bl9hbGxvY2F0ZWRfc2VjdGlvbnMgPT0gMCkKKyAgICBuZXdfbl9zZWN0aW9ucyA9IDE7CisgIGVsc2UKKyAgICBuZXdfbl9zZWN0aW9ucyA9IGRlc2t0b3BfZmlsZS0+bl9hbGxvY2F0ZWRfc2VjdGlvbnMqMjsKKworICBzZWN0aW9ucyA9IGRidXNfcmVhbGxvYyAoZGVza3RvcF9maWxlLT5zZWN0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiAoQnVzRGVza3RvcEZpbGVTZWN0aW9uKSAqIG5ld19uX3NlY3Rpb25zKTsKKyAgaWYgKHNlY3Rpb25zID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworICAKKyAgZGVza3RvcF9maWxlLT5zZWN0aW9ucyA9IHNlY3Rpb25zOworICAKKyAgZGVza3RvcF9maWxlLT5uX2FsbG9jYXRlZF9zZWN0aW9ucyA9IG5ld19uX3NlY3Rpb25zOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgY2hhciAqCit1bmVzY2FwZV9zdHJpbmcgKEJ1c0Rlc2t0b3BGaWxlUGFyc2VyICpwYXJzZXIsCisgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICAgICpzdHIsCisgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICBwb3MsCisgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICBlbmRfcG9zLAorICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAgICAqZXJyb3IpCit7CisgIGNoYXIgKnJldHZhbCwgKnE7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisgIAorICAvKiBsZW4gKyAxIGlzIGVub3VnaCwgYmVjYXVzZSB1bmVzY2FwaW5nIG5ldmVyIG1ha2VzIHRoZQorICAgKiBzdHJpbmcgbG9uZ2VyCisgICAqLworICByZXR2YWwgPSBkYnVzX21hbGxvYyAoZW5kX3BvcyAtIHBvcyArIDEpOworICBpZiAocmV0dmFsID09IE5VTEwpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBxID0gcmV0dmFsOworICAKKyAgd2hpbGUgKHBvcyA8IGVuZF9wb3MpCisgICAgeworICAgICAgaWYgKF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoc3RyLCBwb3MpID09IDApCisJeworCSAgLyogRm91bmQgYW4gZW1iZWRkZWQgbnVsbCAqLworCSAgZGJ1c19mcmVlIChyZXR2YWwpOworICAgICAgICAgIHJlcG9ydF9lcnJvciAocGFyc2VyLCAiVGV4dCB0byBiZSB1bmVzY2FwZWQgY29udGFpbnMgZW1iZWRkZWQgbnVsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJVU19ERVNLVE9QX1BBUlNFX0VSUk9SX0lOVkFMSURfRVNDQVBFUywgZXJyb3IpOworCSAgcmV0dXJuIE5VTEw7CisJfQorCisgICAgICBpZiAoX2RidXNfc3RyaW5nX2dldF9ieXRlIChzdHIsIHBvcykgPT0gJ1xcJykKKwl7CisJICBwb3MgKys7CisKKwkgIGlmIChwb3MgPj0gZW5kX3BvcykKKwkgICAgeworCSAgICAgIC8qIEVzY2FwZSBhdCBlbmQgb2Ygc3RyaW5nICovCisJICAgICAgZGJ1c19mcmVlIChyZXR2YWwpOworICAgICAgICAgICAgICByZXBvcnRfZXJyb3IgKHBhcnNlciwgIlRleHQgdG8gYmUgdW5lc2NhcGVkIGVuZGVkIGluIFxcIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVVNfREVTS1RPUF9QQVJTRV9FUlJPUl9JTlZBTElEX0VTQ0FQRVMsIGVycm9yKTsKKwkgICAgICByZXR1cm4gTlVMTDsKKwkgICAgfQorCisJICBzd2l0Y2ggKF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoc3RyLCBwb3MpKQorCSAgICB7CisJICAgIGNhc2UgJ3MnOgorICAgICAgICAgICAgICAqcSsrID0gJyAnOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgY2FzZSAndCc6CisgICAgICAgICAgICAgICpxKysgPSAnXHQnOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgY2FzZSAnbic6CisgICAgICAgICAgICAgICpxKysgPSAnXG4nOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgY2FzZSAncic6CisgICAgICAgICAgICAgICpxKysgPSAnXHInOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgY2FzZSAnXFwnOgorICAgICAgICAgICAgICAqcSsrID0gJ1xcJzsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgIGRlZmF1bHQ6CisJICAgICAvKiBJbnZhbGlkIGVzY2FwZSBjb2RlICovCisJICAgICBkYnVzX2ZyZWUgKHJldHZhbCk7CisgICAgICAgICAgICAgcmVwb3J0X2Vycm9yIChwYXJzZXIsICJUZXh0IHRvIGJlIHVuZXNjYXBlZCBoYWQgaW52YWxpZCBlc2NhcGUgc2VxdWVuY2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQlVTX0RFU0tUT1BfUEFSU0VfRVJST1JfSU5WQUxJRF9FU0NBUEVTLCBlcnJvcik7CisgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisJICAgIH0KKwkgIHBvcysrOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAqcSsrID1fZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKHN0ciwgcG9zKTsKKworCSAgcG9zKys7CisJfQorICAgIH0KKworICAqcSA9IDA7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIEJ1c0Rlc2t0b3BGaWxlU2VjdGlvbiogCituZXdfc2VjdGlvbiAoQnVzRGVza3RvcEZpbGUgKmRlc2t0b3BfZmlsZSwKKyAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqbmFtZSkKK3sKKyAgaW50IG47CisgIGNoYXIgKm5hbWVfY29weTsKKyAgCisgIGlmIChkZXNrdG9wX2ZpbGUtPm5fYWxsb2NhdGVkX3NlY3Rpb25zID09IGRlc2t0b3BfZmlsZS0+bl9zZWN0aW9ucykKKyAgICB7CisgICAgICBpZiAoIWdyb3dfc2VjdGlvbnMgKGRlc2t0b3BfZmlsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBuYW1lX2NvcHkgPSBfZGJ1c19zdHJkdXAgKG5hbWUpOworICBpZiAobmFtZV9jb3B5ID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgbiA9IGRlc2t0b3BfZmlsZS0+bl9zZWN0aW9uczsKKyAgZGVza3RvcF9maWxlLT5zZWN0aW9uc1tuXS5zZWN0aW9uX25hbWUgPSBuYW1lX2NvcHk7CisKKyAgZGVza3RvcF9maWxlLT5zZWN0aW9uc1tuXS5uX2xpbmVzID0gMDsKKyAgZGVza3RvcF9maWxlLT5zZWN0aW9uc1tuXS5saW5lcyA9IE5VTEw7CisgIGRlc2t0b3BfZmlsZS0+c2VjdGlvbnNbbl0ubl9hbGxvY2F0ZWRfbGluZXMgPSAwOworCisgIGlmICghZ3Jvd19saW5lc19pbl9zZWN0aW9uICgmZGVza3RvcF9maWxlLT5zZWN0aW9uc1tuXSkpCisgICAgeworICAgICAgZGJ1c19mcmVlIChkZXNrdG9wX2ZpbGUtPnNlY3Rpb25zW25dLnNlY3Rpb25fbmFtZSk7CisgICAgICBkZXNrdG9wX2ZpbGUtPnNlY3Rpb25zW25dLnNlY3Rpb25fbmFtZSA9IE5VTEw7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgZGVza3RvcF9maWxlLT5uX3NlY3Rpb25zICs9IDE7CisgIAorICByZXR1cm4gJmRlc2t0b3BfZmlsZS0+c2VjdGlvbnNbbl07ICAKK30KKworc3RhdGljIEJ1c0Rlc2t0b3BGaWxlU2VjdGlvbiogCitvcGVuX3NlY3Rpb24gKEJ1c0Rlc2t0b3BGaWxlUGFyc2VyICpwYXJzZXIsCisgICAgICAgICAgICAgIGNoYXIgICAgICAgICAgICAgICAgICpuYW1lKQoreyAgCisgIEJ1c0Rlc2t0b3BGaWxlU2VjdGlvbiAqc2VjdGlvbjsKKworICBzZWN0aW9uID0gbmV3X3NlY3Rpb24gKHBhcnNlci0+ZGVza3RvcF9maWxlLCBuYW1lKTsKKyAgaWYgKHNlY3Rpb24gPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKyAgCisgIHBhcnNlci0+Y3VycmVudF9zZWN0aW9uID0gcGFyc2VyLT5kZXNrdG9wX2ZpbGUtPm5fc2VjdGlvbnMgLSAxOworICBfZGJ1c19hc3NlcnQgKCZwYXJzZXItPmRlc2t0b3BfZmlsZS0+c2VjdGlvbnNbcGFyc2VyLT5jdXJyZW50X3NlY3Rpb25dID09IHNlY3Rpb24pOworICAKKyAgcmV0dXJuIHNlY3Rpb247Cit9CisKK3N0YXRpYyBCdXNEZXNrdG9wRmlsZUxpbmUgKgorbmV3X2xpbmUgKEJ1c0Rlc2t0b3BGaWxlUGFyc2VyICpwYXJzZXIpCit7CisgIEJ1c0Rlc2t0b3BGaWxlU2VjdGlvbiAqc2VjdGlvbjsKKyAgQnVzRGVza3RvcEZpbGVMaW5lICpsaW5lOworICAKKyAgc2VjdGlvbiA9ICZwYXJzZXItPmRlc2t0b3BfZmlsZS0+c2VjdGlvbnNbcGFyc2VyLT5jdXJyZW50X3NlY3Rpb25dOworCisgIGlmIChzZWN0aW9uLT5uX2FsbG9jYXRlZF9saW5lcyA9PSBzZWN0aW9uLT5uX2xpbmVzKQorICAgIHsKKyAgICAgIGlmICghZ3Jvd19saW5lc19pbl9zZWN0aW9uIChzZWN0aW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIGxpbmUgPSAmc2VjdGlvbi0+bGluZXNbc2VjdGlvbi0+bl9saW5lcysrXTsKKworICBfREJVU19aRVJPKCpsaW5lKTsKKyAgICAKKyAgcmV0dXJuIGxpbmU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAoraXNfYmxhbmtfbGluZSAoQnVzRGVza3RvcEZpbGVQYXJzZXIgKnBhcnNlcikKK3sKKyAgaW50IHA7CisgIGNoYXIgYzsKKyAgCisgIHAgPSBwYXJzZXItPnBvczsKKworICBjID0gX2RidXNfc3RyaW5nX2dldF9ieXRlICgmcGFyc2VyLT5kYXRhLCBwKTsKKworICB3aGlsZSAoYyAmJiBjICE9ICdcbicpCisgICAgeworICAgICAgaWYgKCEoYyA9PSAnICcgfHwgYyA9PSAnXHQnIHx8IGMgPT0gJ1xuJyB8fCBjID09ICdccicgfHwgYyA9PSAnXGYnKSkKKwlyZXR1cm4gRkFMU0U7CisgICAgICAKKyAgICAgIHArKzsKKyAgICAgIGMgPSBfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKCZwYXJzZXItPmRhdGEsIHApOworICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK3BhcnNlX2NvbW1lbnRfb3JfYmxhbmsgKEJ1c0Rlc2t0b3BGaWxlUGFyc2VyICpwYXJzZXIpCit7CisgIGludCBsaW5lX2VuZCwgZW9sX2xlbjsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2ZpbmRfZW9sICgmcGFyc2VyLT5kYXRhLCBwYXJzZXItPnBvcywgJmxpbmVfZW5kLCAmZW9sX2xlbikpCisgICAgbGluZV9lbmQgPSBwYXJzZXItPmxlbjsKKworICBpZiAobGluZV9lbmQgPT0gcGFyc2VyLT5sZW4pCisgICAgcGFyc2VyLT5wb3MgPSBwYXJzZXItPmxlbjsKKyAgZWxzZQorICAgIHBhcnNlci0+cG9zID0gbGluZV9lbmQgKyBlb2xfbGVuOworICAKKyAgcGFyc2VyLT5saW5lX251bSArPSAxOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2lzX3ZhbGlkX3NlY3Rpb25fbmFtZSAoY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgLyogNS4gR3JvdXAgbmFtZXMgbWF5IGNvbnRhaW4gYWxsIEFTQ0lJIGNoYXJhY3RlcnMgZXhjZXB0IGZvciBjb250cm9sIGNoYXJhY3RlcnMgYW5kICdbJyBhbmQgJ10nLgorICAgKgorICAgKiBXZSBkb24ndCB1c2UgaXNwcmludCgpIGhlcmUgYmVjYXVzZSBpdCdzIGxvY2FsZS1kZXBlbmRlbnQuIEFTQ0lJCisgICAqIGNoYXJhY3RlcnMgPD0gMHgxZiBhbmQgMHg3ZiBhcmUgY29udHJvbCBjaGFyYWN0ZXJzLCBhbmQgYnl0ZXMgd2l0aAorICAgKiB2YWx1ZXMgPj0gMHg4MCBhcmVuJ3QgQVNDSUkuIDB4MjAgaXMgYSBzcGFjZSwgd2hpY2ggd2UgbXVzdCBhbGxvdywKKyAgICogbm90IGxlYXN0IGJlY2F1c2UgREJVU19TRVJWSUNFX1NFQ1RJT04gY29udGFpbnMgb25lLiAqLworCisgIHdoaWxlICgqbmFtZSkKKyAgICB7CisgICAgICBpZiAoKm5hbWUgPD0gMHgxZiB8fCAqbmFtZSA+PSAweDdmIHx8ICpuYW1lICA9PSAnWycgfHwgKm5hbWUgPT0gJ10nKQorCXJldHVybiBGQUxTRTsKKyAgICAgIAorICAgICAgbmFtZSsrOworICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitwYXJzZV9zZWN0aW9uX3N0YXJ0IChCdXNEZXNrdG9wRmlsZVBhcnNlciAqcGFyc2VyLCBEQnVzRXJyb3IgKmVycm9yKQoreworICBpbnQgbGluZV9lbmQsIGVvbF9sZW47CisgIGNoYXIgKnNlY3Rpb25fbmFtZTsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfZmluZF9lb2wgKCZwYXJzZXItPmRhdGEsIHBhcnNlci0+cG9zLCAmbGluZV9lbmQsICZlb2xfbGVuKSkKKyAgICBsaW5lX2VuZCA9IHBhcnNlci0+bGVuOworICAKKyAgaWYgKGxpbmVfZW5kIC0gcGFyc2VyLT5wb3MgPD0gMiB8fAorICAgICAgX2RidXNfc3RyaW5nX2dldF9ieXRlICgmcGFyc2VyLT5kYXRhLCBsaW5lX2VuZCAtIDEpICE9ICddJykKKyAgICB7CisgICAgICByZXBvcnRfZXJyb3IgKHBhcnNlciwgIkludmFsaWQgc3ludGF4IGZvciBzZWN0aW9uIGhlYWRlciIsIEJVU19ERVNLVE9QX1BBUlNFX0VSUk9SX0lOVkFMSURfU1lOVEFYLCBlcnJvcik7CisgICAgICBwYXJzZXJfZnJlZSAocGFyc2VyKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgc2VjdGlvbl9uYW1lID0gdW5lc2NhcGVfc3RyaW5nIChwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNlci0+ZGF0YSwgcGFyc2VyLT5wb3MgKyAxLCBsaW5lX2VuZCAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworCisgIGlmIChzZWN0aW9uX25hbWUgPT0gTlVMTCkKKyAgICB7CisgICAgICBwYXJzZXJfZnJlZSAocGFyc2VyKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFpc192YWxpZF9zZWN0aW9uX25hbWUgKHNlY3Rpb25fbmFtZSkpCisgICAgeworICAgICAgcmVwb3J0X2Vycm9yIChwYXJzZXIsICJJbnZhbGlkIGNoYXJhY3RlcnMgaW4gc2VjdGlvbiBuYW1lIiwgQlVTX0RFU0tUT1BfUEFSU0VfRVJST1JfSU5WQUxJRF9DSEFSUywgZXJyb3IpOworICAgICAgcGFyc2VyX2ZyZWUgKHBhcnNlcik7CisgICAgICBkYnVzX2ZyZWUgKHNlY3Rpb25fbmFtZSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmIChvcGVuX3NlY3Rpb24gKHBhcnNlciwgc2VjdGlvbl9uYW1lKSA9PSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfZnJlZSAoc2VjdGlvbl9uYW1lKTsKKyAgICAgIHBhcnNlcl9mcmVlIChwYXJzZXIpOworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKGxpbmVfZW5kID09IHBhcnNlci0+bGVuKQorICAgIHBhcnNlci0+cG9zID0gcGFyc2VyLT5sZW47CisgIGVsc2UKKyAgICBwYXJzZXItPnBvcyA9IGxpbmVfZW5kICsgZW9sX2xlbjsKKyAgCisgIHBhcnNlci0+bGluZV9udW0gKz0gMTsKKworICBkYnVzX2ZyZWUgKHNlY3Rpb25fbmFtZSk7CisgIAorICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitwYXJzZV9rZXlfdmFsdWUgKEJ1c0Rlc2t0b3BGaWxlUGFyc2VyICpwYXJzZXIsIERCdXNFcnJvciAqZXJyb3IpCit7CisgIGludCBsaW5lX2VuZCwgZW9sX2xlbjsKKyAgaW50IGtleV9zdGFydCwga2V5X2VuZDsKKyAgaW50IHZhbHVlX3N0YXJ0OworICBpbnQgcDsKKyAgY2hhciAqdmFsdWUsICp0bXA7CisgIERCdXNTdHJpbmcga2V5OworICBCdXNEZXNrdG9wRmlsZUxpbmUgKmxpbmU7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19maW5kX2VvbCAoJnBhcnNlci0+ZGF0YSwgcGFyc2VyLT5wb3MsICZsaW5lX2VuZCwgJmVvbF9sZW4pKQorICAgIGxpbmVfZW5kID0gcGFyc2VyLT5sZW47CisgIAorICBwID0gcGFyc2VyLT5wb3M7CisgIGtleV9zdGFydCA9IHA7CisgIHdoaWxlIChwIDwgbGluZV9lbmQgJiYKKwkgKHZhbGlkW19kYnVzX3N0cmluZ19nZXRfYnl0ZSAoJnBhcnNlci0+ZGF0YSwgcCldICYgVkFMSURfS0VZX0NIQVIpKQorICAgIHArKzsKKyAga2V5X2VuZCA9IHA7CisgIAorICBpZiAoa2V5X3N0YXJ0ID09IGtleV9lbmQpCisgICAgeworICAgICAgcmVwb3J0X2Vycm9yIChwYXJzZXIsICJFbXB0eSBrZXkgbmFtZSIsIEJVU19ERVNLVE9QX1BBUlNFX0VSUk9SX0lOVkFMSURfU1lOVEFYLCBlcnJvcik7CisgICAgICBwYXJzZXJfZnJlZSAocGFyc2VyKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgLyogV2UgaWdub3JlIGxvY2FsZXMgZm9yIG5vdyAqLworICBpZiAocCA8IGxpbmVfZW5kICYmIF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoJnBhcnNlci0+ZGF0YSwgcCkgPT0gJ1snKQorICAgIHsKKyAgICAgIGlmIChsaW5lX2VuZCA9PSBwYXJzZXItPmxlbikKKwlwYXJzZXItPnBvcyA9IHBhcnNlci0+bGVuOworICAgICAgZWxzZQorCXBhcnNlci0+cG9zID0gbGluZV9lbmQgKyBlb2xfbGVuOworCSAgCisgICAgICBwYXJzZXItPmxpbmVfbnVtICs9IDE7CisKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgCisgIC8qIFNraXAgc3BhY2UgYmVmb3JlICc9JyAqLworICB3aGlsZSAocCA8IGxpbmVfZW5kICYmIF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoJnBhcnNlci0+ZGF0YSwgcCkgPT0gJyAnKQorICAgIHArKzsKKworICBpZiAocCA8IGxpbmVfZW5kICYmIF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoJnBhcnNlci0+ZGF0YSwgcCkgIT0gJz0nKQorICAgIHsKKyAgICAgIHJlcG9ydF9lcnJvciAocGFyc2VyLCAiSW52YWxpZCBjaGFyYWN0ZXJzIGluIGtleSBuYW1lIiwgQlVTX0RFU0tUT1BfUEFSU0VfRVJST1JfSU5WQUxJRF9DSEFSUywgZXJyb3IpOworICAgICAgcGFyc2VyX2ZyZWUgKHBhcnNlcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmIChwID09IGxpbmVfZW5kKQorICAgIHsKKyAgICAgIHJlcG9ydF9lcnJvciAocGFyc2VyLCAiTm8gJz0nIGluIGtleS92YWx1ZSBwYWlyIiwgQlVTX0RFU0tUT1BfUEFSU0VfRVJST1JfSU5WQUxJRF9TWU5UQVgsIGVycm9yKTsKKyAgICAgIHBhcnNlcl9mcmVlIChwYXJzZXIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAvKiBTa2lwIHRoZSAnPScgKi8KKyAgcCsrOworCisgIC8qIFNraXAgc3BhY2UgYWZ0ZXIgJz0nICovCisgIHdoaWxlIChwIDwgbGluZV9lbmQgJiYgX2RidXNfc3RyaW5nX2dldF9ieXRlICgmcGFyc2VyLT5kYXRhLCBwKSA9PSAnICcpCisgICAgcCsrOworCisgIHZhbHVlX3N0YXJ0ID0gcDsKKyAgCisgIHZhbHVlID0gdW5lc2NhcGVfc3RyaW5nIChwYXJzZXIsICZwYXJzZXItPmRhdGEsIHZhbHVlX3N0YXJ0LCBsaW5lX2VuZCwgZXJyb3IpOworICBpZiAodmFsdWUgPT0gTlVMTCkKKyAgICB7CisgICAgICBwYXJzZXJfZnJlZSAocGFyc2VyKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgbGluZSA9IG5ld19saW5lIChwYXJzZXIpOworICBpZiAobGluZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfZnJlZSAodmFsdWUpOworICAgICAgcGFyc2VyX2ZyZWUgKHBhcnNlcik7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZrZXkpKQorICAgIHsKKyAgICAgIGRidXNfZnJlZSAodmFsdWUpOworICAgICAgcGFyc2VyX2ZyZWUgKHBhcnNlcik7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2NvcHlfbGVuICgmcGFyc2VyLT5kYXRhLCBrZXlfc3RhcnQsIGtleV9lbmQgLSBrZXlfc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5LCAwKSkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmtleSk7CisgICAgICBkYnVzX2ZyZWUgKHZhbHVlKTsKKyAgICAgIHBhcnNlcl9mcmVlIChwYXJzZXIpOworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19zdGVhbF9kYXRhICgma2V5LCAmdG1wKSkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmtleSk7CisgICAgICBkYnVzX2ZyZWUgKHZhbHVlKTsKKyAgICAgIHBhcnNlcl9mcmVlIChwYXJzZXIpOworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIAorICBfZGJ1c19zdHJpbmdfZnJlZSAoJmtleSk7CisgIAorICBsaW5lLT5rZXkgPSB0bXA7CisgIGxpbmUtPnZhbHVlID0gdmFsdWU7CisKKyAgaWYgKGxpbmVfZW5kID09IHBhcnNlci0+bGVuKQorICAgIHBhcnNlci0+cG9zID0gcGFyc2VyLT5sZW47CisgIGVsc2UKKyAgICBwYXJzZXItPnBvcyA9IGxpbmVfZW5kICsgZW9sX2xlbjsKKyAgCisgIHBhcnNlci0+bGluZV9udW0gKz0gMTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK3JlcG9ydF9lcnJvciAoQnVzRGVza3RvcEZpbGVQYXJzZXIgKnBhcnNlciwKKwkgICAgICBjb25zdCBjaGFyICAgICAgICAgICAqbWVzc2FnZSwKKwkgICAgICBjb25zdCBjaGFyICAgICAgICAgICAqZXJyb3JfbmFtZSwKKwkgICAgICBEQnVzRXJyb3IgICAgICAgICAgICAqZXJyb3IpCit7CisgIGNvbnN0IGNoYXIgKnNlY3Rpb25fbmFtZSA9IE5VTEw7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisgIAorICBpZiAocGFyc2VyLT5jdXJyZW50X3NlY3Rpb24gIT0gLTEpCisgICAgc2VjdGlvbl9uYW1lID0gcGFyc2VyLT5kZXNrdG9wX2ZpbGUtPnNlY3Rpb25zW3BhcnNlci0+Y3VycmVudF9zZWN0aW9uXS5zZWN0aW9uX25hbWU7CisKKyAgaWYgKHNlY3Rpb25fbmFtZSkKKyAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIGVycm9yX25hbWUsCisgICAgICAgICAgICAgICAgICAgICJFcnJvciBpbiBzZWN0aW9uICVzIGF0IGxpbmUgJWQ6ICVzXG4iLCBzZWN0aW9uX25hbWUsIHBhcnNlci0+bGluZV9udW0sIG1lc3NhZ2UpOworICBlbHNlCisgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBlcnJvcl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAiRXJyb3IgYXQgbGluZSAlZDogJXNcbiIsIHBhcnNlci0+bGluZV9udW0sIG1lc3NhZ2UpOworfQorCisjaWYgMAorc3RhdGljIHZvaWQKK2R1bXBfZGVza3RvcF9maWxlIChCdXNEZXNrdG9wRmlsZSAqZmlsZSkKK3sKKyAgaW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IGZpbGUtPm5fc2VjdGlvbnM7IGkrKykKKyAgICB7CisgICAgICBpbnQgajsKKyAgICAgIAorICAgICAgcHJpbnRmICgiWyVzXVxuIiwgZmlsZS0+c2VjdGlvbnNbaV0uc2VjdGlvbl9uYW1lKTsKKworICAgICAgZm9yIChqID0gMDsgaiA8IGZpbGUtPnNlY3Rpb25zW2ldLm5fbGluZXM7IGorKykKKwl7CisJICBwcmludGYgKCIlcz0lc1xuIiwgZmlsZS0+c2VjdGlvbnNbaV0ubGluZXNbal0ua2V5LAorCQkgIGZpbGUtPnNlY3Rpb25zW2ldLmxpbmVzW2pdLnZhbHVlKTsKKwl9CisgICAgfQorfQorI2VuZGlmCisKK0J1c0Rlc2t0b3BGaWxlKgorYnVzX2Rlc2t0b3BfZmlsZV9sb2FkIChEQnVzU3RyaW5nICpmaWxlbmFtZSwKKwkJICAgICAgIERCdXNFcnJvciAgKmVycm9yKQoreworICBEQnVzU3RyaW5nIHN0cjsKKyAgQnVzRGVza3RvcEZpbGVQYXJzZXIgcGFyc2VyOworICBEQnVzU3RhdCBzYjsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgCisgIC8qIENsZWFybHkgdGhlcmUncyBhIHJhY2UgaGVyZSwgYnV0IGl0J3MganVzdCB0byBtYWtlIGl0IHVubGlrZWx5CisgICAqIHRoYXQgd2UgZG8gc29tZXRoaW5nIHNpbGx5LCB3ZSBzdGlsbCBoYW5kbGUgZG9pbmcgaXQgYmVsb3cuCisgICAqLworICBpZiAoIV9kYnVzX3N0YXQgKGZpbGVuYW1lLCAmc2IsIGVycm9yKSkKKyAgICByZXR1cm4gTlVMTDsKKworICBpZiAoc2Iuc2l6ZSA+IF9EQlVTX09ORV9LSUxPQllURSAqIDEyOCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJEZXNrdG9wIGZpbGUgc2l6ZSAoJWxkIGJ5dGVzKSBpcyB0b28gbGFyZ2UiLCAobG9uZykgc2Iuc2l6ZSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmc3RyKSkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAKKyAgaWYgKCFfZGJ1c19maWxlX2dldF9jb250ZW50cyAoJnN0ciwgZmlsZW5hbWUsIGVycm9yKSkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnN0cik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfdmFsaWRhdGVfdXRmOCAoJnN0ciwgMCwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpKSkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnN0cik7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIFVURi04Iik7ICAgCisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIAorICBwYXJzZXIuZGVza3RvcF9maWxlID0gZGJ1c19uZXcwIChCdXNEZXNrdG9wRmlsZSwgMSk7CisgIGlmIChwYXJzZXIuZGVza3RvcF9maWxlID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZzdHIpOworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgCisgIHBhcnNlci5kYXRhID0gc3RyOworICBwYXJzZXIubGluZV9udW0gPSAxOworICBwYXJzZXIucG9zID0gMDsKKyAgcGFyc2VyLmxlbiA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmcGFyc2VyLmRhdGEpOworICBwYXJzZXIuY3VycmVudF9zZWN0aW9uID0gLTE7CisKKyAgd2hpbGUgKHBhcnNlci5wb3MgPCBwYXJzZXIubGVuKQorICAgIHsKKyAgICAgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKCZwYXJzZXIuZGF0YSwgcGFyc2VyLnBvcykgPT0gJ1snKQorCXsKKwkgIGlmICghcGFyc2Vfc2VjdGlvbl9zdGFydCAoJnBhcnNlciwgZXJyb3IpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKwl9CisgICAgICBlbHNlIGlmIChpc19ibGFua19saW5lICgmcGFyc2VyKSB8fAorCSAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKCZwYXJzZXIuZGF0YSwgcGFyc2VyLnBvcykgPT0gJyMnKQorCXBhcnNlX2NvbW1lbnRfb3JfYmxhbmsgKCZwYXJzZXIpOworICAgICAgZWxzZSBpZiAocGFyc2VyLmN1cnJlbnRfc2VjdGlvbiA8IDApCisJeworICAgICAgICAgICBkYnVzX3NldF9lcnJvcihlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIHNlcnZpY2UgZmlsZToga2V5PXZhbHVlIGJlZm9yZSBbU2VjdGlvbl0iKTsKKyAgICAgICAgICAgcmV0dXJuIE5VTEw7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGlmICghcGFyc2Vfa2V5X3ZhbHVlICgmcGFyc2VyLCBlcnJvcikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorCX0KKyAgICB9CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwYXJzZXIuZGF0YSk7CisKKyAgcmV0dXJuIHBhcnNlci5kZXNrdG9wX2ZpbGU7Cit9CisKK3N0YXRpYyBCdXNEZXNrdG9wRmlsZVNlY3Rpb24gKgorbG9va3VwX3NlY3Rpb24gKEJ1c0Rlc2t0b3BGaWxlICpkZXNrdG9wX2ZpbGUsCisJCWNvbnN0IGNoYXIgICAgICpzZWN0aW9uX25hbWUpCit7CisgIEJ1c0Rlc2t0b3BGaWxlU2VjdGlvbiAqc2VjdGlvbjsKKyAgaW50IGk7CisgIAorICBpZiAoc2VjdGlvbl9uYW1lID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisgIAorICBmb3IgKGkgPSAwOyBpIDwgZGVza3RvcF9maWxlLT5uX3NlY3Rpb25zOyBpICsrKQorICAgIHsKKyAgICAgIHNlY3Rpb24gPSAmZGVza3RvcF9maWxlLT5zZWN0aW9uc1tpXTsKKworICAgICAgaWYgKHN0cmNtcCAoc2VjdGlvbi0+c2VjdGlvbl9uYW1lLCBzZWN0aW9uX25hbWUpID09IDApCisJcmV0dXJuIHNlY3Rpb247CisgICAgfQorICAKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBCdXNEZXNrdG9wRmlsZUxpbmUgKgorbG9va3VwX2xpbmUgKEJ1c0Rlc2t0b3BGaWxlICAgICAgICAqZGVza3RvcF9maWxlLAorCSAgICAgQnVzRGVza3RvcEZpbGVTZWN0aW9uICpzZWN0aW9uLAorCSAgICAgY29uc3QgY2hhciAgICAgICAgICAgICprZXluYW1lKQoreworICBCdXNEZXNrdG9wRmlsZUxpbmUgKmxpbmU7CisgIGludCBpOworCisgIGZvciAoaSA9IDA7IGkgPCBzZWN0aW9uLT5uX2xpbmVzOyBpKyspCisgICAgeworICAgICAgbGluZSA9ICZzZWN0aW9uLT5saW5lc1tpXTsKKyAgICAgIAorICAgICAgaWYgKHN0cmNtcCAobGluZS0+a2V5LCBrZXluYW1lKSA9PSAwKQorCXJldHVybiBsaW5lOworICAgIH0KKyAgCisgIHJldHVybiBOVUxMOworfQorCitkYnVzX2Jvb2xfdAorYnVzX2Rlc2t0b3BfZmlsZV9nZXRfcmF3IChCdXNEZXNrdG9wRmlsZSAgKmRlc2t0b3BfZmlsZSwKKwkJCSAgY29uc3QgY2hhciAgICAgICpzZWN0aW9uX25hbWUsCisJCQkgIGNvbnN0IGNoYXIgICAgICAqa2V5bmFtZSwKKwkJCSAgY29uc3QgY2hhciAgICAgKip2YWwpCit7CisgIEJ1c0Rlc2t0b3BGaWxlU2VjdGlvbiAqc2VjdGlvbjsKKyAgQnVzRGVza3RvcEZpbGVMaW5lICpsaW5lOworCisgICp2YWwgPSBOVUxMOworCisgIHNlY3Rpb24gPSBsb29rdXBfc2VjdGlvbiAoZGVza3RvcF9maWxlLCBzZWN0aW9uX25hbWUpOworICAKKyAgaWYgKCFzZWN0aW9uKQorICAgIHJldHVybiBGQUxTRTsKKworICBsaW5lID0gbG9va3VwX2xpbmUgKGRlc2t0b3BfZmlsZSwKKwkJICAgICAgc2VjdGlvbiwKKwkJICAgICAga2V5bmFtZSk7CisKKyAgaWYgKCFsaW5lKQorICAgIHJldHVybiBGQUxTRTsKKyAgCisgICp2YWwgPSBsaW5lLT52YWx1ZTsKKyAgCisgIHJldHVybiBUUlVFOworfQorCitkYnVzX2Jvb2xfdAorYnVzX2Rlc2t0b3BfZmlsZV9nZXRfc3RyaW5nIChCdXNEZXNrdG9wRmlsZSAgKmRlc2t0b3BfZmlsZSwKKwkJCSAgICAgY29uc3QgY2hhciAgICAgICpzZWN0aW9uLAorCQkJICAgICBjb25zdCBjaGFyICAgICAgKmtleW5hbWUsCisJCQkgICAgIGNoYXIgICAgICAgICAgICoqdmFsLAorCQkJICAgICBEQnVzRXJyb3IgICAgICAgKmVycm9yKQoreworICBjb25zdCBjaGFyICpyYXc7CisgCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgICp2YWwgPSBOVUxMOworICAKKyAgaWYgKCFidXNfZGVza3RvcF9maWxlX2dldF9yYXcgKGRlc2t0b3BfZmlsZSwgc2VjdGlvbiwga2V5bmFtZSwgJnJhdykpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiTm8gXCIlc1wiIGtleSBpbiAuc2VydmljZSBmaWxlXG4iLCBrZXluYW1lKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgKnZhbCA9IF9kYnVzX3N0cmR1cCAocmF3KTsKKworICBpZiAoKnZhbCA9PSBOVUxMKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAKKyAgcmV0dXJuIFRSVUU7Cit9CmRpZmYgLS1naXQgYS9idXMvZGVza3RvcC1maWxlLmggYi9idXMvZGVza3RvcC1maWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ0NzczOAotLS0gL2Rldi9udWxsCisrKyBiL2J1cy9kZXNrdG9wLWZpbGUuaApAQCAtMCwwICsxLDU3IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRlc2t0b3AtZmlsZS5oICAuZGVza3RvcCBmaWxlIHBhcnNlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgQ29kZUZhY3RvcnkgQUIKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaWZuZGVmIEJVU19ERVNLVE9QX0ZJTEVfSAorI2RlZmluZSBCVVNfREVTS1RPUF9GSUxFX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zdHJpbmcuaD4KKworI2RlZmluZSBCVVNfREVTS1RPUF9QQVJTRV9FUlJPUl9JTlZBTElEX1NZTlRBWCAgIm9yZy5mcmVlZGVza3RvcC5EQnVzLkRlc2t0b3BQYXJzZUVycm9yLkludmFsaWRTeW50YXgiCisjZGVmaW5lIEJVU19ERVNLVE9QX1BBUlNFX0VSUk9SX0lOVkFMSURfRVNDQVBFUyAib3JnLmZyZWVkZXNrdG9wLkRCdXMuRGVza3RvcFBhcnNlRXJyb3IuSW52YWxpZEVzY2FwZXMiCisjZGVmaW5lIEJVU19ERVNLVE9QX1BBUlNFX0VSUk9SX0lOVkFMSURfQ0hBUlMgICAib3JnLmZyZWVkZXNrdG9wLkRCdXMuRGVza3RvcFBhcnNlRXJyb3IuSW52YWxpZENoYXJzIgorCisjZGVmaW5lIERCVVNfU0VSVklDRV9TRUNUSU9OICAiRC1CVVMgU2VydmljZSIKKyNkZWZpbmUgREJVU19TRVJWSUNFX05BTUUgICAgICJOYW1lIgorI2RlZmluZSBEQlVTX1NFUlZJQ0VfRVhFQyAgICAgIkV4ZWMiCisjZGVmaW5lIERCVVNfU0VSVklDRV9VU0VSICAgICAiVXNlciIKKyNkZWZpbmUgREJVU19TRVJWSUNFX1NZU1RFTURfU0VSVklDRSAiU3lzdGVtZFNlcnZpY2UiCisjZGVmaW5lIERCVVNfU0VSVklDRV9BU1NVTUVEX0FQUEFSTU9SX0xBQkVMICJBc3N1bWVkQXBwQXJtb3JMYWJlbCIKKwordHlwZWRlZiBzdHJ1Y3QgQnVzRGVza3RvcEZpbGUgQnVzRGVza3RvcEZpbGU7CisKK0J1c0Rlc2t0b3BGaWxlICpidXNfZGVza3RvcF9maWxlX2xvYWQgKERCdXNTdHJpbmcgICAgICpmaWxlbmFtZSwKKwkJCQkgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKTsKK3ZvaWQgICAgICAgICAgICBidXNfZGVza3RvcF9maWxlX2ZyZWUgKEJ1c0Rlc2t0b3BGaWxlICpmaWxlKTsKKworZGJ1c19ib29sX3QgYnVzX2Rlc2t0b3BfZmlsZV9nZXRfcmF3ICAgIChCdXNEZXNrdG9wRmlsZSAgKmRlc2t0b3BfZmlsZSwKKwkJCQkJIGNvbnN0IGNoYXIgICAgICAqc2VjdGlvbl9uYW1lLAorCQkJCQkgY29uc3QgY2hhciAgICAgICprZXluYW1lLAorCQkJCQkgY29uc3QgY2hhciAgICAgKip2YWwpOworZGJ1c19ib29sX3QgYnVzX2Rlc2t0b3BfZmlsZV9nZXRfc3RyaW5nIChCdXNEZXNrdG9wRmlsZSAgKmRlc2t0b3BfZmlsZSwKKwkJCQkJIGNvbnN0IGNoYXIgICAgICAqc2VjdGlvbiwKKwkJCQkJIGNvbnN0IGNoYXIgICAgICAqa2V5bmFtZSwKKwkJCQkJIGNoYXIgICAgICAgICAgICoqdmFsLAorCQkJCQkgREJ1c0Vycm9yICAgICAgICplcnJvcik7CisKKworI2VuZGlmIC8qIEJVU19ERVNLVE9QX0ZJTEVfSCAqLwpkaWZmIC0tZ2l0IGEvYnVzL2Rpci13YXRjaC1kZWZhdWx0LmMgYi9idXMvZGlyLXdhdGNoLWRlZmF1bHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTM2MWIxCi0tLSAvZGV2L251bGwKKysrIGIvYnVzL2Rpci13YXRjaC1kZWZhdWx0LmMKQEAgLTAsMCArMSwzNSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkaXItd2F0Y2gtZGVmYXVsdC5jICBPUyBzcGVjaWZpYyBkaXJlY3RvcnkgY2hhbmdlIG5vdGlmaWNhdGlvbiBmb3IgbWVzc2FnZSBidXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisKKyNpbmNsdWRlIDxkYnVzL2RidXMtaW50ZXJuYWxzLmg+CisjaW5jbHVkZSAiZGlyLXdhdGNoLmgiCisKKworLyogTm9PcCAqLworCit2b2lkCitidXNfc2V0X3dhdGNoZWRfZGlycyAoQnVzQ29udGV4dCAqY29udGV4dCwgREJ1c0xpc3QgKipkaXJlY3RvcmllcykKK3sKK30KZGlmZiAtLWdpdCBhL2J1cy9kaXItd2F0Y2gtaW5vdGlmeS5jIGIvYnVzL2Rpci13YXRjaC1pbm90aWZ5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ3ZGMyZAotLS0gL2Rldi9udWxsCisrKyBiL2J1cy9kaXItd2F0Y2gtaW5vdGlmeS5jCkBAIC0wLDAgKzEsMjg5IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IiAtKi0gKi8KKy8qIGRpci13YXRjaC1pbm90aWZ5LmMgIE9TIHNwZWNpZmljIGRpcmVjdG9yeSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGZvciBtZXNzYWdlIGJ1cworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBSZWQgSGF0LCBJbmMuCisgKiAgICAgICAgICAgKGMpIDIwMDYgTWFuZHJpdmEKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworLyogQmUgY2FyZWZ1bCwgdGhpcyBmaWxlIGlzIG5vdCBMaW51eC1vbmx5OiBRTlggYWxzbyB1c2VzIGl0ICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisvKiBRTlgncyBpbm90aWZ5IGlzIGJyb2tlbiwgYW5kIHJlcXVpcmVzIHN0ZGludC5oIHRvIGJlIG1hbnVhbGx5IGluY2x1ZGVkIGZpcnN0ICovCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3lzL2lub3RpZnkuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWludGVybmFscy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1saXN0Lmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXN5c2RlcHMtdW5peC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy13YXRjaC5oPgorI2luY2x1ZGUgImRpci13YXRjaC5oIgorCisjZGVmaW5lIE1BWF9ESVJTX1RPX1dBVENIIDEyOAorI2RlZmluZSBJTk9USUZZX0VWRU5UX1NJWkUgKHNpemVvZihzdHJ1Y3QgaW5vdGlmeV9ldmVudCkpCisjZGVmaW5lIElOT1RJRllfQlVGX0xFTiAoMTAyNCAqIChJTk9USUZZX0VWRU5UX1NJWkUgKyAxNikpCisKKy8qIHVzZSBhIHN0YXRpYyBhcnJheSB0byBhdm9pZCBoYW5kbGluZyBPT00gKi8KK3N0YXRpYyBpbnQgd2RzW01BWF9ESVJTX1RPX1dBVENIXTsKK3N0YXRpYyBjaGFyICpkaXJzW01BWF9ESVJTX1RPX1dBVENIXTsKK3N0YXRpYyBpbnQgbnVtX3dkcyA9IDA7CitzdGF0aWMgaW50IGlub3RpZnlfZmQgPSAtMTsKK3N0YXRpYyBEQnVzV2F0Y2ggKndhdGNoID0gTlVMTDsKK3N0YXRpYyBEQnVzTG9vcCAqbG9vcCA9IE5VTEw7CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorX2hhbmRsZV9pbm90aWZ5X3dhdGNoIChEQnVzV2F0Y2ggKnBhc3NlZF93YXRjaCwgdW5zaWduZWQgaW50IGZsYWdzLCB2b2lkICpkYXRhKQoreworICBjaGFyIGJ1ZmZlcltJTk9USUZZX0JVRl9MRU5dOworICBzc2l6ZV90IHJldCA9IDA7CisjaWZkZWYgREJVU19FTkFCTEVfVkVSQk9TRV9NT0RFCisgIGludCBpID0gMDsKKyNlbmRpZgorCisgIHJldCA9IHJlYWQgKGlub3RpZnlfZmQsIGJ1ZmZlciwgSU5PVElGWV9CVUZfTEVOKTsKKyAgaWYgKHJldCA8IDApCisgICAgX2RidXNfdmVyYm9zZSAoIkVycm9yIHJlYWRpbmcgaW5vdGlmeSBldmVudDogJyVzJ1xuIiwgX2RidXNfc3RyZXJyb3IoZXJybm8pKTsKKyAgZWxzZSBpZiAoIXJldCkKKyAgICBfZGJ1c192ZXJib3NlICgiRXJyb3IgcmVhZGluZyBpbm90aWZ5IGV2ZW50OiBidWZmZXIgdG9vIHNtYWxsXG4iKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJTZW5kaW5nIFNJR0hVUCBzaWduYWwgb24gcmVjZXB0aW9uIG9mICVsZCBpbm90aWZ5IGV2ZW50KHMpXG4iLCAobG9uZykgcmV0KTsKKyAgICAgICh2b2lkKSBraWxsIChfZGJ1c19nZXRwaWQgKCksIFNJR0hVUCk7CisgICAgfQorCisjaWZkZWYgREJVU19FTkFCTEVfVkVSQk9TRV9NT0RFCisgIHdoaWxlIChpIDwgcmV0KQorICAgIHsKKyAgICAgIHN0cnVjdCBpbm90aWZ5X2V2ZW50ICpldjsKKworICAgICAgZXYgPSAoc3RydWN0IGlub3RpZnlfZXZlbnQgKikgJmJ1ZmZlcltpXTsKKyAgICAgIGkgKz0gSU5PVElGWV9FVkVOVF9TSVpFICsgZXYtPmxlbjsKKyAgICAgIGlmIChldi0+bGVuKQorICAgICAgICBfZGJ1c192ZXJib3NlICgiZXZlbnQgbmFtZTogJyVzJ1xuIiwgZXYtPm5hbWUpOworICAgICAgX2RidXNfdmVyYm9zZSAoImlub3RpZnkgZXZlbnQ6IHdkPSVkIG1hc2s9JXUgY29va2llPSV1IGxlbj0ldVxuIiwgZXYtPndkLCBldi0+bWFzaywgZXYtPmNvb2tpZSwgZXYtPmxlbik7CisgICAgfQorI2VuZGlmCisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKyNpbmNsdWRlIDxzdGRpby5oPgorCitzdGF0aWMgdm9pZAorX3NldF93YXRjaGVkX2RpcnNfaW50ZXJuYWwgKERCdXNMaXN0ICoqZGlyZWN0b3JpZXMpCit7CisgIGludCBuZXdfd2RzW01BWF9ESVJTX1RPX1dBVENIXTsKKyAgY2hhciAqbmV3X2RpcnNbTUFYX0RJUlNfVE9fV0FUQ0hdOworICBEQnVzTGlzdCAqbGluazsKKyAgaW50IGksIGosIHdkOworCisgIGZvciAoaSA9IDA7IGkgPCBNQVhfRElSU19UT19XQVRDSDsgaSsrKQorICAgIHsKKyAgICAgIG5ld193ZHNbaV0gPSAtMTsKKyAgICAgIG5ld19kaXJzW2ldID0gTlVMTDsKKyAgICB9CisKKyAgaSA9IDA7CisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rIChkaXJlY3Rvcmllcyk7CisgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgeworICAgICAgbmV3X2RpcnNbaSsrXSA9IChjaGFyICopbGluay0+ZGF0YTsKKyAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKGRpcmVjdG9yaWVzLCBsaW5rKTsKKyAgICB9CisKKyAgLyogTG9vayBmb3IgZGlyZWN0b3JpZXMgaW4gYm90aCB0aGUgb2xkIGFuZCBuZXcgc2V0cywgaWYKKyAgICogd2UgZmluZCBvbmUsIG1vdmUgaXRzIGRhdGEgaW50byB0aGUgbmV3IHNldC4KKyAgICovCisgIGZvciAoaSA9IDA7IG5ld19kaXJzW2ldOyBpKyspCisgICAgeworICAgICAgZm9yIChqID0gMDsgaiA8IG51bV93ZHM7IGorKykKKyAgICAgICAgeworICAgICAgICAgIGlmIChkaXJzW2pdICYmIHN0cmNtcCAobmV3X2RpcnNbaV0sIGRpcnNbal0pID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIG5ld193ZHNbaV0gPSB3ZHNbal07CisgICAgICAgICAgICAgIG5ld19kaXJzW2ldID0gZGlyc1tqXTsKKyAgICAgICAgICAgICAgd2RzW2pdID0gLTE7CisgICAgICAgICAgICAgIGRpcnNbal0gPSBOVUxMOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAvKiBBbnkgZGlyZWN0b3JpZXMgd2UgZmluZCBpbiAid2RzIiB3aXRoIGEgbm9uemVybyBmZCBtdXN0CisgICAqIG5vdCBiZSBpbiB0aGUgbmV3IHNldCwgc28gcGVyZm9ybSBjbGVhbnVwIG5vdy4KKyAgICovCisgIGZvciAoaiA9IDA7IGogPCBudW1fd2RzOyBqKyspCisgICAgeworICAgICAgaWYgKHdkc1tqXSAhPSAtMSkKKyAgICAgICAgeworICAgICAgICAgIGlub3RpZnlfcm1fd2F0Y2ggKGlub3RpZnlfZmQsIHdkc1tqXSk7CisgICAgICAgICAgZGJ1c19mcmVlIChkaXJzW2pdKTsKKyAgICAgICAgICB3ZHNbal0gPSAtMTsKKyAgICAgICAgICBkaXJzW2pdID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICBmb3IgKGkgPSAwOyBuZXdfZGlyc1tpXTsgaSsrKQorICAgIHsKKyAgICAgIGlmIChuZXdfd2RzW2ldID09IC0xKQorICAgICAgICB7CisgICAgICAgICAgLyogRklYTUUgLSBsZXNzIGxhbWUgZXJyb3IgaGFuZGxpbmcgZm9yIGZhaWxpbmcgdG8gYWRkIGEgd2F0Y2g7IHdlIG1heSBuZWVkIHRvIHNsZWVwLiAqLworICAgICAgICAgIHdkID0gaW5vdGlmeV9hZGRfd2F0Y2ggKGlub3RpZnlfZmQsIG5ld19kaXJzW2ldLCBJTl9DTE9TRV9XUklURSB8IElOX0RFTEVURSB8IElOX01PVkVEX1RPIHwgSU5fTU9WRURfRlJPTSk7CisgICAgICAgICAgaWYgKHdkIDwgMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogTm90IGFsbCBzZXJ2aWNlIGRpcmVjdG9yaWVzIG5lZWQgdG8gZXhpc3QuICovCisgICAgICAgICAgICAgIGlmIChlcnJubyAhPSBFTk9FTlQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgX2RidXNfd2FybiAoIkNhbm5vdCBzZXR1cCBpbm90aWZ5IGZvciAnJXMnOyBlcnJvciAnJXMnIiwgbmV3X2RpcnNbaV0sIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgbmV3X3dkc1tpXSA9IC0xOworICAgICAgICAgICAgICAgICAgbmV3X2RpcnNbaV0gPSBOVUxMOworICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIG5ld193ZHNbaV0gPSB3ZDsKKyAgICAgICAgICBuZXdfZGlyc1tpXSA9IF9kYnVzX3N0cmR1cCAobmV3X2RpcnNbaV0pOworICAgICAgICAgIGlmICghbmV3X2RpcnNbaV0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8qIEZJWE1FIGhhdmUgbGVzcyBsYW1lIGhhbmRsaW5nIGZvciBPT00sIHdlIGp1c3Qgc2lsZW50bHkgZmFpbCB0bworICAgICAgICAgICAgICAgKiB3YXRjaC4gIChJbiByZWFsaXR5IHRob3VnaCwgdGhlIHdob2xlIE9PTSBoYW5kbGluZyBpbiBkYnVzIGlzIHN0dXBpZAorICAgICAgICAgICAgICAgKiBidXQgd2Ugd29uJ3QgZ28gaW50byB0aGF0IGluIHRoaXMgY29tbWVudCA9KSApCisgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICBpbm90aWZ5X3JtX3dhdGNoIChpbm90aWZ5X2ZkLCB3ZCk7CisgICAgICAgICAgICAgIG5ld193ZHNbaV0gPSAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICBudW1fd2RzID0gaTsKKworICBmb3IgKGkgPSAwOyBpIDwgTUFYX0RJUlNfVE9fV0FUQ0g7IGkrKykKKyAgICB7CisgICAgICB3ZHNbaV0gPSBuZXdfd2RzW2ldOworICAgICAgZGlyc1tpXSA9IG5ld19kaXJzW2ldOworICAgIH0KKworIG91dDo7Cit9CisKKyNpbmNsdWRlIDxzdGRpby5oPgorc3RhdGljIHZvaWQKK19zaHV0ZG93bl9pbm90aWZ5ICh2b2lkICpkYXRhKQoreworICBEQnVzTGlzdCAqZW1wdHkgPSBOVUxMOworCisgIGlmIChpbm90aWZ5X2ZkID09IC0xKQorICAgIHJldHVybjsKKworICBfc2V0X3dhdGNoZWRfZGlyc19pbnRlcm5hbCAoJmVtcHR5KTsKKworICBpZiAod2F0Y2ggIT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c19sb29wX3JlbW92ZV93YXRjaCAobG9vcCwgd2F0Y2gpOworICAgICAgX2RidXNfd2F0Y2hfaW52YWxpZGF0ZSAod2F0Y2gpOworICAgICAgX2RidXNfd2F0Y2hfdW5yZWYgKHdhdGNoKTsKKyAgICAgIF9kYnVzX2xvb3BfdW5yZWYgKGxvb3ApOworICAgIH0KKyAgd2F0Y2ggPSBOVUxMOworICBsb29wID0gTlVMTDsKKworICBjbG9zZSAoaW5vdGlmeV9mZCk7CisgIGlub3RpZnlfZmQgPSAtMTsKK30KKworc3RhdGljIGludAorX2luaXRfaW5vdGlmeSAoQnVzQ29udGV4dCAqY29udGV4dCkKK3sKKyAgaW50IHJldCA9IDA7CisKKyAgaWYgKGlub3RpZnlfZmQgPT0gLTEpCisgICAgeworI2lmZGVmIEhBVkVfSU5PVElGWV9JTklUMQorICAgICAgaW5vdGlmeV9mZCA9IGlub3RpZnlfaW5pdDEgKElOX0NMT0VYRUMpOworICAgICAgLyogVGhpcyBlbnN1cmVzIHdlIHN0aWxsIHJ1biBvbiBvbGRlciBMaW51eCBrZXJuZWxzLgorICAgICAgICogaHR0cHM6Ly9idWdzLmZyZWVkZXNrdG9wLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjM5NTcKKyAgICAgICAqLworICAgICAgaWYgKGlub3RpZnlfZmQgPCAwKQorICAgICAgICBpbm90aWZ5X2ZkID0gaW5vdGlmeV9pbml0ICgpOworI2Vsc2UKKyAgICAgIGlub3RpZnlfZmQgPSBpbm90aWZ5X2luaXQgKCk7CisjZW5kaWYKKyAgICAgIGlmIChpbm90aWZ5X2ZkIDw9IDApCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgiQ2Fubm90IGluaXRpYWxpemUgaW5vdGlmeSIpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgIC8qIEluIHRoZSBpbm90aWZ5X2luaXQxIGNhc2UgdGhpcyBpcyB1bm5lY2Vzc2FyeSBidXQgaGFybWxlc3MsCisgICAgICAgKiBpbiB0aGUgb3RoZXIgY2FzZXMgaXQncyBuZWNlc3NhcnkgKi8KKyAgICAgIF9kYnVzX2ZkX3NldF9jbG9zZV9vbl9leGVjIChpbm90aWZ5X2ZkKTsKKworICAgICAgbG9vcCA9IGJ1c19jb250ZXh0X2dldF9sb29wIChjb250ZXh0KTsKKyAgICAgIF9kYnVzX2xvb3BfcmVmIChsb29wKTsKKworICAgICAgd2F0Y2ggPSBfZGJ1c193YXRjaF9uZXcgKGlub3RpZnlfZmQsIERCVVNfV0FUQ0hfUkVBREFCTEUsIFRSVUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2hhbmRsZV9pbm90aWZ5X3dhdGNoLCBOVUxMLCBOVUxMKTsKKworICAgICAgaWYgKHdhdGNoID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgiVW5hYmxlIHRvIGNyZWF0ZSBpbm90aWZ5IHdhdGNoIik7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgICAgaWYgKCFfZGJ1c19sb29wX2FkZF93YXRjaCAobG9vcCwgd2F0Y2gpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoIlVuYWJsZSB0byBhZGQgcmVsb2FkIHdhdGNoIHRvIG1haW4gbG9vcCIpOworICAgICAgICAgIF9kYnVzX3dhdGNoX3VucmVmICh3YXRjaCk7CisgICAgICAgICAgd2F0Y2ggPSBOVUxMOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgIGlmICghX2RidXNfcmVnaXN0ZXJfc2h1dGRvd25fZnVuYyAoX3NodXRkb3duX2lub3RpZnksIE5VTEwpKQorICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJVbmFibGUgdG8gcmVnaXN0ZXIgc2h1dGRvd24gZnVuYyIpOworICAgICAgICAgIF9kYnVzX3dhdGNoX3VucmVmICh3YXRjaCk7CisgICAgICAgICAgd2F0Y2ggPSBOVUxMOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgfQorICAgIH0KKworICByZXQgPSAxOworCitvdXQ6CisgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQKK2J1c19zZXRfd2F0Y2hlZF9kaXJzIChCdXNDb250ZXh0ICpjb250ZXh0LCBEQnVzTGlzdCAqKmRpcmVjdG9yaWVzKQoreworICBpZiAoIV9pbml0X2lub3RpZnkgKGNvbnRleHQpKQorICAgIHJldHVybjsKKworICBfc2V0X3dhdGNoZWRfZGlyc19pbnRlcm5hbCAoZGlyZWN0b3JpZXMpOworfQpkaWZmIC0tZ2l0IGEvYnVzL2Rpci13YXRjaC1rcXVldWUuYyBiL2J1cy9kaXItd2F0Y2gta3F1ZXVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWIxNzg0ZQotLS0gL2Rldi9udWxsCisrKyBiL2J1cy9kaXItd2F0Y2gta3F1ZXVlLmMKQEAgLTAsMCArMSwzMjkgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGlyLXdhdGNoLWtxdWV1ZS5jICBPUyBzcGVjaWZpYyBkaXJlY3RvcnkgY2hhbmdlIG5vdGlmaWNhdGlvbiBmb3IgbWVzc2FnZSBidXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvZXZlbnQuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaWZkZWYgSEFWRV9FUlJOT19ICisjaW5jbHVkZSA8ZXJybm8uaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiYnVzLmgiCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXdhdGNoLmg+CisKKyNpbmNsdWRlIDxkYnVzL2RidXMtaW50ZXJuYWxzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWxpc3QuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc3lzZGVwcy11bml4Lmg+CisjaW5jbHVkZSAiZGlyLXdhdGNoLmgiCisKKyNkZWZpbmUgTUFYX0RJUlNfVE9fV0FUQ0ggMTI4CisKK3N0YXRpYyBpbnQga3EgPSAtMTsKK3N0YXRpYyBpbnQgZmRzW01BWF9ESVJTX1RPX1dBVENIXTsKK3N0YXRpYyBjaGFyICpkaXJzW01BWF9ESVJTX1RPX1dBVENIXTsKK3N0YXRpYyBpbnQgbnVtX2ZkcyA9IDA7CitzdGF0aWMgREJ1c1dhdGNoICp3YXRjaCA9IE5VTEw7CitzdGF0aWMgREJ1c0xvb3AgKmxvb3AgPSBOVUxMOworCitzdGF0aWMgZGJ1c19ib29sX3QKK19oYW5kbGVfa3F1ZXVlX3dhdGNoIChEQnVzV2F0Y2ggKndhdGNoLCB1bnNpZ25lZCBpbnQgZmxhZ3MsIHZvaWQgKmRhdGEpCit7CisgIHN0cnVjdCBrZXZlbnQgZXY7CisgIHN0cnVjdCB0aW1lc3BlYyBudWxsdHMgPSB7IDAsIDAgfTsKKyAgaW50IHJlczsKKyAgcGlkX3QgcGlkOworCisgIHJlcyA9IGtldmVudCAoa3EsIE5VTEwsIDAsICZldiwgMSwgJm51bGx0cyk7CisKKyAgLyogU2xlZXAgZm9yIGhhbGYgYSBzZWNvbmQgdG8gYXZvaWQgYSByYWNlIHdoZW4gZmlsZXMgYXJlIGluc3RhbGwoMSknZAorICAgKiB0byBzeXN0ZW0uZC4gKi8KKyAgdXNsZWVwKDUwMDAwMCk7CisKKyAgaWYgKHJlcyA+IDApCisgICAgeworICAgICAgcGlkID0gZ2V0cGlkICgpOworICAgICAgX2RidXNfdmVyYm9zZSAoIlNlbmRpbmcgU0lHSFVQIHNpZ25hbCBvbiByZWNlcHRpb24gb2YgYSBrZXZlbnRcbiIpOworICAgICAgKHZvaWQpIGtpbGwgKHBpZCwgU0lHSFVQKTsKKyAgICB9CisgIGVsc2UgaWYgKHJlcyA8IDAgJiYgZXJybm8gPT0gRUJBREYpCisgICAgeworICAgICAga3EgPSAtMTsKKyAgICAgIGlmICh3YXRjaCAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfbG9vcF9yZW1vdmVfd2F0Y2ggKGxvb3AsIHdhdGNoKTsKKyAgICAgICAgICBfZGJ1c193YXRjaF9pbnZhbGlkYXRlICh3YXRjaCk7CisgICAgICAgICAgX2RidXNfd2F0Y2hfdW5yZWYgKHdhdGNoKTsKKyAgICAgICAgICB3YXRjaCA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgIHBpZCA9IGdldHBpZCAoKTsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJTZW5kaW5nIFNJR0hVUCBzaWduYWwgc2luY2Uga3F1ZXVlIGhhcyBiZWVuIGNsb3NlZFxuIik7CisgICAgICAodm9pZCkga2lsbCAocGlkLCBTSUdIVVApOworICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQgX3NodXRkb3duX2txdWV1ZSAodm9pZCAqZGF0YSkKK3sKKyAgaW50IGk7CisKKyAgaWYgKGtxIDwgMCkKKyAgICByZXR1cm47CisKKyAgZm9yIChpID0gMDsgaSA8IE1BWF9ESVJTX1RPX1dBVENIOyBpKyspCisgICAgeworICAgICAgaWYgKGZkc1tpXSA+PSAwKQorICAgICAgICB7CisgICAgICAgICAgY2xvc2UgKGZkc1tpXSk7CisgICAgICAgICAgZmRzW2ldID0gLTE7CisgICAgICAgIH0KKyAgICAgIGlmIChkaXJzW2ldICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBkYnVzX2ZyZWUoKSBpcyBuZWNlc3NhcnkgdG8gcGFzcyBtZW1sZWFrIGNoZWNrICovCisgICAgICAgICAgZGJ1c19mcmVlIChkaXJzW2ldKTsKKyAgICAgICAgICBkaXJzW2ldID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICBpZiAobG9vcCkKKyAgICB7CisgICAgICBfZGJ1c19sb29wX3JlbW92ZV93YXRjaCAobG9vcCwgd2F0Y2gpOworICAgICAgX2RidXNfbG9vcF91bnJlZiAobG9vcCk7CisgICAgICBsb29wID0gTlVMTDsKKyAgICB9CisKKyAgaWYgKHdhdGNoKQorICAgIHsKKyAgICAgIF9kYnVzX3dhdGNoX2ludmFsaWRhdGUgKHdhdGNoKTsKKyAgICAgIF9kYnVzX3dhdGNoX3VucmVmICh3YXRjaCk7CisgICAgICB3YXRjaCA9IE5VTEw7CisgICAgfQorCisgICAgY2xvc2UgKGtxKTsKKyAgICBrcSA9IC0xOworfQorCitzdGF0aWMgaW50CitfaW5pdF9rcXVldWUgKEJ1c0NvbnRleHQgKmNvbnRleHQpCit7CisgIGlmIChrcSA8IDApCisgICAgeworCisgICAgICBrcSA9IGtxdWV1ZSAoKTsKKyAgICAgIGlmIChrcSA8IDApCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgiQ2Fubm90IGNyZWF0ZSBrcXVldWU7IGVycm9yICclcyciLCBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICBsb29wID0gYnVzX2NvbnRleHRfZ2V0X2xvb3AgKGNvbnRleHQpOworICAgICAgX2RidXNfbG9vcF9yZWYgKGxvb3ApOworCisgICAgICB3YXRjaCA9IF9kYnVzX3dhdGNoX25ldyAoa3EsIERCVVNfV0FUQ0hfUkVBREFCTEUsIFRSVUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2hhbmRsZV9rcXVldWVfd2F0Y2gsIE5VTEwsIE5VTEwpOworCisgICAgICBpZiAod2F0Y2ggPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJVbmFibGUgdG8gY3JlYXRlIGtxdWV1ZSB3YXRjaCIpOworICAgICAgICAgIGdvdG8gb3V0MTsKKyAgICAgICAgfQorCisgICAgICBpZiAoIV9kYnVzX2xvb3BfYWRkX3dhdGNoIChsb29wLCB3YXRjaCkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgiVW5hYmxlIHRvIGFkZCByZWxvYWQgd2F0Y2ggdG8gbWFpbiBsb29wIik7CisgICAgICAgICAgZ290byBvdXQyOworICAgICAgICB9CisKKyAgICAgIGlmICghX2RidXNfcmVnaXN0ZXJfc2h1dGRvd25fZnVuYyAoX3NodXRkb3duX2txdWV1ZSwgTlVMTCkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgiVW5hYmxlIHRvIHJlZ2lzdGVyIHNodXRkb3duIGZ1bmN0aW9uIik7CisgICAgICAgICAgZ290byBvdXQzOworICAgICAgICB9CisgICAgfQorCisgIHJldHVybiAxOworCitvdXQzOgorICBfZGJ1c19sb29wX3JlbW92ZV93YXRjaCAobG9vcCwgd2F0Y2gpOworCitvdXQyOgorICBpZiAod2F0Y2gpCisgICAgeworICAgICAgX2RidXNfd2F0Y2hfaW52YWxpZGF0ZSAod2F0Y2gpOworICAgICAgX2RidXNfd2F0Y2hfdW5yZWYgKHdhdGNoKTsKKyAgICAgIHdhdGNoID0gTlVMTDsKKyAgICB9CisKK291dDE6CisgIGlmIChrcSA+PSAwKQorICAgIHsKKyAgICAgIGNsb3NlIChrcSk7CisgICAgICBrcSA9IC0xOworICAgIH0KKyAgaWYgKGxvb3ApCisgICAgeworICAgICAgX2RidXNfbG9vcF91bnJlZiAobG9vcCk7CisgICAgICBsb29wID0gTlVMTDsKKyAgICB9CisKK291dDoKKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQKK2J1c19zZXRfd2F0Y2hlZF9kaXJzIChCdXNDb250ZXh0ICpjb250ZXh0LCBEQnVzTGlzdCAqKmRpcmVjdG9yaWVzKQoreworICBpbnQgbmV3X2Zkc1tNQVhfRElSU19UT19XQVRDSF07CisgIGNoYXIgKm5ld19kaXJzW01BWF9ESVJTX1RPX1dBVENIXTsKKyAgREJ1c0xpc3QgKmxpbms7CisgIGludCBpLCBqLCBmZDsKKyAgc3RydWN0IGtldmVudCBldjsKKyNpZmRlZiBPX0NMT0VYRUMKKyAgZGJ1c19ib29sX3QgY2xvZXhlY19kb25lID0gMDsKKyNlbmRpZgorCisgIGlmICghX2luaXRfa3F1ZXVlIChjb250ZXh0KSkKKyAgICBnb3RvIG91dDsKKworICBmb3IgKGkgPSAwOyBpIDwgTUFYX0RJUlNfVE9fV0FUQ0g7IGkrKykKKyAgICB7CisgICAgICBuZXdfZmRzW2ldID0gLTE7CisgICAgICBuZXdfZGlyc1tpXSA9IE5VTEw7CisgICAgfQorCisgIGkgPSAwOworICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoZGlyZWN0b3JpZXMpOworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIG5ld19kaXJzW2krK10gPSAoY2hhciAqKWxpbmstPmRhdGE7CisgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rIChkaXJlY3RvcmllcywgbGluayk7CisgICAgfQorCisgIC8qIExvb2sgZm9yIGRpcmVjdG9yaWVzIGluIGJvdGggdGhlIG9sZCBhbmQgbmV3IHNldHMsIGlmCisgICAqIHdlIGZpbmQgb25lLCBtb3ZlIGl0cyBkYXRhIGludG8gdGhlIG5ldyBzZXQuCisgICAqLworICBmb3IgKGkgPSAwOyBuZXdfZGlyc1tpXTsgaSsrKQorICAgIHsKKyAgICAgIGZvciAoaiA9IDA7IGogPCBudW1fZmRzOyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoZGlyc1tqXSAmJiBzdHJjbXAgKG5ld19kaXJzW2ldLCBkaXJzW2pdKSA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBuZXdfZmRzW2ldID0gZmRzW2pdOworICAgICAgICAgICAgICBuZXdfZGlyc1tpXSA9IGRpcnNbal07CisgICAgICAgICAgICAgIGZkc1tqXSA9IC0xOworICAgICAgICAgICAgICBkaXJzW2pdID0gTlVMTDsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgLyogQW55IGRpcmVjdG9yeSB3ZSBmaW5kIGluICJmZHMiIHdpdGggYSBub256ZXJvIGZkIG11c3QKKyAgICogbm90IGJlIGluIHRoZSBuZXcgc2V0LCBzbyBwZXJmb3JtIGNsZWFudXAgbm93LgorICAgKi8KKyAgZm9yIChqID0gMDsgaiA8IG51bV9mZHM7IGorKykKKyAgICB7CisgICAgICBpZiAoZmRzW2pdICE9IC0xKQorICAgICAgICB7CisgICAgICAgICAgY2xvc2UgKGZkc1tqXSk7CisgICAgICAgICAgZGJ1c19mcmVlIChkaXJzW2pdKTsKKyAgICAgICAgICBmZHNbal0gPSAtMTsKKyAgICAgICAgICBkaXJzW2pdID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICBmb3IgKGkgPSAwOyBuZXdfZGlyc1tpXTsgaSsrKQorICAgIHsKKyAgICAgIGlmIChuZXdfZmRzW2ldID09IC0xKQorICAgICAgICB7CisgICAgICAgICAgLyogRklYTUUgLSBsZXNzIGxhbWUgZXJyb3IgaGFuZGxpbmcgZm9yIGZhaWxpbmcgdG8gYWRkIGEgd2F0Y2g7CisgICAgICAgICAgICogd2UgbWF5IG5lZWQgdG8gc2xlZXAuCisgICAgICAgICAgICovCisjaWZkZWYgT19DTE9FWEVDCisgICAgICAgICAgZmQgPSBvcGVuIChuZXdfZGlyc1tpXSwgT19SRE9OTFkgfCBPX0NMT0VYRUMpOworICAgICAgICAgIGNsb2V4ZWNfZG9uZSA9IChmZCA+PSAwKTsKKworICAgICAgICAgIGlmIChmZCA8IDAgJiYgZXJybm8gPT0gRUlOVkFMKQorI2VuZGlmCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGZkID0gb3BlbiAobmV3X2RpcnNbaV0sIE9fUkRPTkxZKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoZmQgPCAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoZXJybm8gIT0gRU5PRU5UKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJDYW5ub3Qgb3BlbiBkaXJlY3RvcnkgJyVzJzsgZXJyb3IgJyVzJyIsIG5ld19kaXJzW2ldLCBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIG5ld19mZHNbaV0gPSAtMTsKKyAgICAgICAgICAgICAgICAgIG5ld19kaXJzW2ldID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyNpZmRlZiBPX0NMT0VYRUMKKyAgICAgICAgICBpZiAoIWNsb2V4ZWNfZG9uZSkKKyNlbmRpZgorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c19mZF9zZXRfY2xvc2Vfb25fZXhlYyAoZmQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgRVZfU0VUICgmZXYsIGZkLCBFVkZJTFRfVk5PREUsIEVWX0FERCB8IEVWX0VOQUJMRSB8IEVWX0NMRUFSLAorICAgICAgICAgICAgICAgICAgTk9URV9ERUxFVEUgfCBOT1RFX0VYVEVORCB8IE5PVEVfV1JJVEUgfCBOT1RFX1JFTkFNRSwgMCwgMCk7CisgICAgICAgICAgaWYgKGtldmVudCAoa3EsICZldiwgMSwgTlVMTCwgMCwgTlVMTCkgPT0gLTEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJDYW5ub3Qgc2V0dXAgYSBrZXZlbnQgZm9yICclcyc7IGVycm9yICclcyciLCBuZXdfZGlyc1tpXSwgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICAgICAgICAgIGNsb3NlIChmZCk7CisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgbmV3X2Zkc1tpXSA9IGZkOworICAgICAgICAgIG5ld19kaXJzW2ldID0gX2RidXNfc3RyZHVwIChuZXdfZGlyc1tpXSk7CisgICAgICAgICAgaWYgKCFuZXdfZGlyc1tpXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogRklYTUUgaGF2ZSBsZXNzIGxhbWUgaGFuZGxpbmcgZm9yIE9PTSwgd2UganVzdCBzaWxlbnRseSBmYWlsIHRvCisgICAgICAgICAgICAgICAqIHdhdGNoLiAgKEluIHJlYWxpdHkgdGhvdWdoLCB0aGUgd2hvbGUgT09NIGhhbmRsaW5nIGluIGRidXMgaXMKKyAgICAgICAgICAgICAgICogc3R1cGlkIGJ1dCB3ZSB3b24ndCBnbyBpbnRvIHRoYXQgaW4gdGhpcyBjb21tZW50ID0pICkKKyAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgIGNsb3NlIChmZCk7CisgICAgICAgICAgICAgIG5ld19mZHNbaV0gPSAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICBudW1fZmRzID0gaTsKKworICBmb3IgKGkgPSAwOyBpIDwgTUFYX0RJUlNfVE9fV0FUQ0g7IGkrKykKKyAgICB7CisgICAgICBmZHNbaV0gPSBuZXdfZmRzW2ldOworICAgICAgZGlyc1tpXSA9IG5ld19kaXJzW2ldOworICAgIH0KKworIG91dDoKKyAgOworfQpkaWZmIC0tZ2l0IGEvYnVzL2Rpci13YXRjaC5oIGIvYnVzL2Rpci13YXRjaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0NDUyOWUKLS0tIC9kZXYvbnVsbAorKysgYi9idXMvZGlyLXdhdGNoLmgKQEAgLTAsMCArMSw0MCBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkaXItd2F0Y2guaCAgV2F0Y2ggZGlyZWN0b3JpZXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSAiYnVzLmgiCisKKyNpZm5kZWYgRElSX1dBVENIX0gKKyNkZWZpbmUgRElSX1dBVENIX0gKKworLyoqCisgKiBVcGRhdGUgdGhlIHNldCBvZiBkaXJlY3RvcmllcyB0byBtb25pdG9yIGZvciBjaGFuZ2VzLiAgVGhlCisgKiBvcGVyYXRpbmctc3lzdGVtLXNwZWNpZmljIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZnVuY3Rpb24gc2hvdWxkCisgKiBhdm9pZCBjcmVhdGluZyBhIHdpbmRvdyB3aGVyZSBhIGRpcmVjdG9yeSBpbiBib3RoIHRoZQorICogb2xkIGFuZCBuZXcgc2V0IGlzbid0IG1vbml0b3JlZC4KKyAqCisgKiBAcGFyYW0gY29udGV4dCBUaGUgYnVzIGNvbnRleHQKKyAqIEBwYXJhbSBkaXJzIExpc3Qgb2Ygc3RyaW5ncyB3aGljaCBhcmUgZGlyZWN0b3J5IHBhdGhzCisgKi8KK3ZvaWQgYnVzX3NldF93YXRjaGVkX2RpcnMgKEJ1c0NvbnRleHQgKmNvbnRleHQsIERCdXNMaXN0ICoqZGlycyk7CisKKyNlbmRpZiAvKiBESVJfV0FUQ0hfSCAqLwpkaWZmIC0tZ2l0IGEvYnVzL2Rpc3BhdGNoLmMgYi9idXMvZGlzcGF0Y2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTIyOGJlCi0tLSAvZGV2L251bGwKKysrIGIvYnVzL2Rpc3BhdGNoLmMKQEAgLTAsMCArMSw1MjU5IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRpc3BhdGNoLmMgIE1lc3NhZ2UgZGlzcGF0Y2hlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgQ29kZUZhY3RvcnkgQUIKKyAqIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCwgMjAwNSAgUmVkIEhhdCwgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDA0ICBJbWVuZGlvIEhCCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiZGlzcGF0Y2guaCIKKyNpbmNsdWRlICJjb25uZWN0aW9uLmgiCisjaW5jbHVkZSAiZHJpdmVyLmgiCisjaW5jbHVkZSAic2VydmljZXMuaCIKKyNpbmNsdWRlICJhY3RpdmF0aW9uLmgiCisjaW5jbHVkZSAidXRpbHMuaCIKKyNpbmNsdWRlICJidXMuaCIKKyNpbmNsdWRlICJzaWduYWxzLmgiCisjaW5jbHVkZSAidGVzdC5oIgorI2luY2x1ZGUgPGRidXMvZGJ1cy1pbnRlcm5hbHMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbWlzYy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaWZkZWYgSEFWRV9VTklYX0ZEX1BBU1NJTkcKKyNpbmNsdWRlIDxkYnVzL2RidXMtc3lzZGVwcy11bml4Lmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKworLyogVGhpcyBpcyBoYXJkLWNvZGVkIGluIHRoZSBmaWxlcyBpbiB2YWxpZC1jb25maWctZmlsZXMtKi4gV2UgaGF2ZSB0byB1c2UKKyAqIHRoZSBkZWJ1Zy1waXBlIHRyYW5zcG9ydCBiZWNhdXNlIHRoZSB0ZXN0cyBpbiB0aGlzIGZpbGUgcmVxdWlyZSB0aGF0CisgKiBkYnVzX2Nvbm5lY3Rpb25fb3Blbl9wcml2YXRlKCkgZG9lcyBub3QgYmxvY2suICovCisjZGVmaW5lIFRFU1RfREVCVUdfUElQRSAiZGVidWctcGlwZTpuYW1lPXRlc3Qtc2VydmVyIgorCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKgorbm9ubnVsbCAoY29uc3QgY2hhciAqbWF5YmVfbnVsbCwKKyAgICAgICAgIGNvbnN0IGNoYXIgKmlmX251bGwpCit7CisgIHJldHVybiAobWF5YmVfbnVsbCA/IG1heWJlX251bGwgOiBpZl9udWxsKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitzZW5kX29uZV9tZXNzYWdlIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgIEJ1c0NvbnRleHQgICAgICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKnNlbmRlciwKKyAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICphZGRyZXNzZWRfcmVjaXBpZW50LAorICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICBCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIERCdXNFcnJvciBzdGFja19lcnJvciA9IERCVVNfRVJST1JfSU5JVDsKKworICBpZiAoIWJ1c19jb250ZXh0X2NoZWNrX3NlY3VyaXR5X3BvbGljeSAoY29udGV4dCwgdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzZWRfcmVjaXBpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YWNrX2Vycm9yKSkKKyAgICB7CisgICAgICBpZiAoIWJ1c190cmFuc2FjdGlvbl9jYXB0dXJlX2Vycm9yX3JlcGx5ICh0cmFuc2FjdGlvbiwgc2VuZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YWNrX2Vycm9yLCBtZXNzYWdlKSkKKyAgICAgICAgeworICAgICAgICAgIGJ1c19jb250ZXh0X2xvZyAoY29udGV4dCwgREJVU19TWVNURU1fTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnJvYWRjYXN0IHJlamVjdGVkLCBidXQgbm90IGVub3VnaCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAibWVtb3J5IHRvIHRlbGwgbW9uaXRvcnMiKTsKKyAgICAgICAgfQorCisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZzdGFja19lcnJvcik7CisgICAgICByZXR1cm4gVFJVRTsgLyogZG9uJ3Qgc2VuZCBpdCBidXQgZG9uJ3QgcmV0dXJuIGFuIGVycm9yIGVpdGhlciAqLworICAgIH0KKworICBpZiAoZGJ1c19tZXNzYWdlX2NvbnRhaW5zX3VuaXhfZmRzKG1lc3NhZ2UpICYmCisgICAgICAhZGJ1c19jb25uZWN0aW9uX2Nhbl9zZW5kX3R5cGUoY29ubmVjdGlvbiwgREJVU19UWVBFX1VOSVhfRkQpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yICgmc3RhY2tfZXJyb3IsIERCVVNfRVJST1JfTk9UX1NVUFBPUlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiYnJvYWRjYXN0IGNhbm5vdCBiZSBkZWxpdmVyZWQgdG8gJXMgKCVzKSBiZWNhdXNlICIKKyAgICAgICAgICAgICAgICAgICAgICAiaXQgZG9lcyBub3Qgc3VwcG9ydCByZWNlaXZpbmcgVW5peCBmZHMiLAorICAgICAgICAgICAgICAgICAgICAgIGJ1c19jb25uZWN0aW9uX2dldF9uYW1lIChjb25uZWN0aW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICBidXNfY29ubmVjdGlvbl9nZXRfbG9naW5mbyAoY29ubmVjdGlvbikpOworCisgICAgICBpZiAoIWJ1c190cmFuc2FjdGlvbl9jYXB0dXJlX2Vycm9yX3JlcGx5ICh0cmFuc2FjdGlvbiwgc2VuZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YWNrX2Vycm9yLCBtZXNzYWdlKSkKKyAgICAgICAgeworICAgICAgICAgIGJ1c19jb250ZXh0X2xvZyAoY29udGV4dCwgREJVU19TWVNURU1fTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnJvYWRjYXN0IHdpdGggVW5peCBmZCBub3QgZGVsaXZlcmVkLCBidXQgbm90ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbm91Z2ggbWVtb3J5IHRvIHRlbGwgbW9uaXRvcnMiKTsKKyAgICAgICAgfQorCisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZzdGFja19lcnJvcik7CisgICAgICByZXR1cm4gVFJVRTsgLyogZG9uJ3Qgc2VuZCBpdCBidXQgZG9uJ3QgcmV0dXJuIGFuIGVycm9yIGVpdGhlciAqLworICAgIH0KKworICBpZiAoIWJ1c190cmFuc2FjdGlvbl9zZW5kICh0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSkpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2RidXNfYm9vbF90CitidXNfZGlzcGF0Y2hfbWF0Y2hlcyAoQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpzZW5kZXIsCisgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmFkZHJlc3NlZF9yZWNpcGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBEQnVzRXJyb3IgdG1wX2Vycm9yOworICBCdXNDb25uZWN0aW9ucyAqY29ubmVjdGlvbnM7CisgIERCdXNMaXN0ICpyZWNpcGllbnRzOworICBCdXNNYXRjaG1ha2VyICptYXRjaG1ha2VyOworICBEQnVzTGlzdCAqbGluazsKKyAgQnVzQ29udGV4dCAqY29udGV4dDsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICAvKiBzZW5kZXIgYW5kIHJlY2lwaWVudCBjYW4gYm90aCBiZSBOVUxMIGZvciB0aGUgYnVzIGRyaXZlciwKKyAgICogb3IgZm9yIHNpZ25hbHMgd2l0aCBubyBwYXJ0aWN1bGFyIHJlY2lwaWVudAorICAgKi8KKworICBfZGJ1c19hc3NlcnQgKHNlbmRlciA9PSBOVUxMIHx8IGJ1c19jb25uZWN0aW9uX2lzX2FjdGl2ZSAoc2VuZGVyKSk7CisgIF9kYnVzX2Fzc2VydCAoZGJ1c19tZXNzYWdlX2dldF9zZW5kZXIgKG1lc3NhZ2UpICE9IE5VTEwpOworCisgIGNvbnRleHQgPSBidXNfdHJhbnNhY3Rpb25fZ2V0X2NvbnRleHQgKHRyYW5zYWN0aW9uKTsKKworICAvKiBGaXJzdCwgc2VuZCB0aGUgbWVzc2FnZSB0byB0aGUgYWRkcmVzc2VkX3JlY2lwaWVudCwgaWYgdGhlcmUgaXMgb25lLiAqLworICBpZiAoYWRkcmVzc2VkX3JlY2lwaWVudCAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmICghYnVzX2NvbnRleHRfY2hlY2tfc2VjdXJpdHlfcG9saWN5IChjb250ZXh0LCB0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kZXIsIGFkZHJlc3NlZF9yZWNpcGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc2VkX3JlY2lwaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLCBOVUxMLCBlcnJvcikpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgaWYgKGRidXNfbWVzc2FnZV9jb250YWluc191bml4X2ZkcyAobWVzc2FnZSkgJiYKKyAgICAgICAgICAhZGJ1c19jb25uZWN0aW9uX2Nhbl9zZW5kX3R5cGUgKGFkZHJlc3NlZF9yZWNpcGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfVU5JWF9GRCkpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfTk9UX1NVUFBPUlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlRyaWVkIHRvIHNlbmQgbWVzc2FnZSB3aXRoIFVuaXggZmlsZSBkZXNjcmlwdG9ycyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInRvIGEgY2xpZW50IHRoYXQgZG9lc24ndCBzdXBwb3J0IHRoYXQuIik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQorCisgICAgICAvKiBEaXNwYXRjaCB0aGUgbWVzc2FnZSAqLworICAgICAgaWYgKCFidXNfdHJhbnNhY3Rpb25fc2VuZCAodHJhbnNhY3Rpb24sIGFkZHJlc3NlZF9yZWNpcGllbnQsIG1lc3NhZ2UpKQorICAgICAgICB7CisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgLyogTm93IGRpc3BhdGNoIHRvIG90aGVycyB3aG8gbG9vayBpbnRlcmVzdGVkIGluIHRoaXMgbWVzc2FnZSAqLworICBjb25uZWN0aW9ucyA9IGJ1c19jb250ZXh0X2dldF9jb25uZWN0aW9ucyAoY29udGV4dCk7CisgIGRidXNfZXJyb3JfaW5pdCAoJnRtcF9lcnJvcik7CisgIG1hdGNobWFrZXIgPSBidXNfY29udGV4dF9nZXRfbWF0Y2htYWtlciAoY29udGV4dCk7CisKKyAgcmVjaXBpZW50cyA9IE5VTEw7CisgIGlmICghYnVzX21hdGNobWFrZXJfZ2V0X3JlY2lwaWVudHMgKG1hdGNobWFrZXIsIGNvbm5lY3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kZXIsIGFkZHJlc3NlZF9yZWNpcGllbnQsIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWNpcGllbnRzKSkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJnJlY2lwaWVudHMpOworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIERCdXNDb25uZWN0aW9uICpkZXN0OworCisgICAgICBkZXN0ID0gbGluay0+ZGF0YTsKKworICAgICAgaWYgKCFzZW5kX29uZV9tZXNzYWdlIChkZXN0LCBjb250ZXh0LCBzZW5kZXIsIGFkZHJlc3NlZF9yZWNpcGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsIHRyYW5zYWN0aW9uLCAmdG1wX2Vycm9yKSkKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZyZWNpcGllbnRzLCBsaW5rKTsKKyAgICB9CisKKyAgX2RidXNfbGlzdF9jbGVhciAoJnJlY2lwaWVudHMpOworCisgIGlmIChkYnVzX2Vycm9yX2lzX3NldCAoJnRtcF9lcnJvcikpCisgICAgeworICAgICAgZGJ1c19tb3ZlX2Vycm9yICgmdG1wX2Vycm9yLCBlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICBlbHNlCisgICAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBEQnVzSGFuZGxlclJlc3VsdAorYnVzX2Rpc3BhdGNoIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgKm1lc3NhZ2UpCit7CisgIGNvbnN0IGNoYXIgKnNlbmRlciwgKnNlcnZpY2VfbmFtZTsKKyAgREJ1c0Vycm9yIGVycm9yOworICBCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb247CisgIEJ1c0NvbnRleHQgKmNvbnRleHQ7CisgIERCdXNIYW5kbGVyUmVzdWx0IHJlc3VsdDsKKyAgREJ1c0Nvbm5lY3Rpb24gKmFkZHJlc3NlZF9yZWNpcGllbnQ7CisKKyAgcmVzdWx0ID0gREJVU19IQU5ETEVSX1JFU1VMVF9IQU5ETEVEOworCisgIHRyYW5zYWN0aW9uID0gTlVMTDsKKyAgYWRkcmVzc2VkX3JlY2lwaWVudCA9IE5VTEw7CisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKworICBjb250ZXh0ID0gYnVzX2Nvbm5lY3Rpb25fZ2V0X2NvbnRleHQgKGNvbm5lY3Rpb24pOworICBfZGJ1c19hc3NlcnQgKGNvbnRleHQgIT0gTlVMTCk7CisKKyAgLyogSWYgd2UgY2FuJ3QgZXZlbiBhbGxvY2F0ZSBhbiBPT00gZXJyb3IsIHdlIGp1c3QgZ28gdG8gc2xlZXAKKyAgICogdW50aWwgd2UgY2FuLgorICAgKi8KKyAgd2hpbGUgKCFidXNfY29ubmVjdGlvbl9wcmVhbGxvY2F0ZV9vb21fZXJyb3IgKGNvbm5lY3Rpb24pKQorICAgIF9kYnVzX3dhaXRfZm9yX21lbW9yeSAoKTsKKworICAvKiBSZWYgY29ubmVjdGlvbiBpbiBjYXNlIHdlIGRpc2Nvbm5lY3QgaXQgYXQgc29tZSBwb2ludCBpbiBoZXJlICovCisgIGRidXNfY29ubmVjdGlvbl9yZWYgKGNvbm5lY3Rpb24pOworCisgIC8qIE1vbml0b3JzIGFyZW4ndCBtZWFudCB0byBzZW5kIG1lc3NhZ2VzIHRvIHVzLiAqLworICBpZiAoYnVzX2Nvbm5lY3Rpb25faXNfbW9uaXRvciAoY29ubmVjdGlvbikpCisgICAgeworICAgICAgc2VuZGVyID0gYnVzX2Nvbm5lY3Rpb25fZ2V0X25hbWUgKGNvbm5lY3Rpb24pOworCisgICAgICAvKiBzaG91bGQgbmV2ZXIgaGFwcGVuICovCisgICAgICBpZiAoc2VuZGVyID09IE5VTEwpCisgICAgICAgIHNlbmRlciA9ICIodW5rbm93bikiOworCisgICAgICBpZiAoZGJ1c19tZXNzYWdlX2lzX3NpZ25hbCAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0lOVEVSRkFDRV9MT0NBTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGlzY29ubmVjdGVkIikpCisgICAgICAgIHsKKyAgICAgICAgICBidXNfY29udGV4dF9sb2cgKGNvbnRleHQsIERCVVNfU1lTVEVNX0xPR19JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1vbml0b3JpbmcgY29ubmVjdGlvbiAlcyBjbG9zZWQuIiwgc2VuZGVyKTsKKyAgICAgICAgICBidXNfY29ubmVjdGlvbl9kaXNjb25uZWN0ZWQgKGNvbm5lY3Rpb24pOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvKiBNb25pdG9ycyBhcmUgbm90IGFsbG93ZWQgdG8gc2VuZCBtZXNzYWdlcywgYmVjYXVzZSB0aGF0CisgICAgICAgICAgICogcHJvYmFibHkgaW5kaWNhdGVzIHRoYXQgdGhlIG1vbml0b3IgaXMgaW5jb3JyZWN0bHkgcmVwbHlpbmcKKyAgICAgICAgICAgKiB0byBpdHMgZWF2ZXNkcm9wcGVkIG1lc3NhZ2VzLCBhbmQgd2Ugd2FudCB0aGUgYXV0aG9ycyBvZgorICAgICAgICAgICAqIHN1Y2ggbW9uaXRvcnMgdG8gZml4IHRoZW0uCisgICAgICAgICAgICovCisgICAgICAgICAgYnVzX2NvbnRleHRfbG9nIChjb250ZXh0LCBEQlVTX1NZU1RFTV9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJNb25pdG9yaW5nIGNvbm5lY3Rpb24gJXMgKCVzKSBpcyBub3QgYWxsb3dlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAidG8gc2VuZCBtZXNzYWdlczsgY2xvc2luZyBpdC4gUGxlYXNlIGZpeCB0aGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1vbml0b3IgdG8gbm90IGRvIHRoYXQuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIobWVzc2FnZSB0eXBlPVwiJXNcIiBpbnRlcmZhY2U9XCIlc1wiICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZW1iZXI9XCIlc1wiIGVycm9yIG5hbWU9XCIlc1wiICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXN0aW5hdGlvbj1cIiVzXCIpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRlciwgYnVzX2Nvbm5lY3Rpb25fZ2V0X2xvZ2luZm8gKGNvbm5lY3Rpb24pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX3R5cGVfdG9fc3RyaW5nICgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBub25udWxsIChkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAobWVzc2FnZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKHVuc2V0KSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ubnVsbCAoZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKG1lc3NhZ2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIih1bnNldCkiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbm51bGwgKGRidXNfbWVzc2FnZV9nZXRfZXJyb3JfbmFtZSAobWVzc2FnZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKHVuc2V0KSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ubnVsbCAoZGJ1c19tZXNzYWdlX2dldF9kZXN0aW5hdGlvbiAobWVzc2FnZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1NFUlZJQ0VfREJVUykpOworICAgICAgICAgIGRidXNfY29ubmVjdGlvbl9jbG9zZSAoY29ubmVjdGlvbik7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgc2VydmljZV9uYW1lID0gZGJ1c19tZXNzYWdlX2dldF9kZXN0aW5hdGlvbiAobWVzc2FnZSk7CisKKyNpZmRlZiBEQlVTX0VOQUJMRV9WRVJCT1NFX01PREUKKyAgeworICAgIGNvbnN0IGNoYXIgKmludGVyZmFjZV9uYW1lLCAqbWVtYmVyX25hbWUsICplcnJvcl9uYW1lOworCisgICAgaW50ZXJmYWNlX25hbWUgPSBkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAobWVzc2FnZSk7CisgICAgbWVtYmVyX25hbWUgPSBkYnVzX21lc3NhZ2VfZ2V0X21lbWJlciAobWVzc2FnZSk7CisgICAgZXJyb3JfbmFtZSA9IGRidXNfbWVzc2FnZV9nZXRfZXJyb3JfbmFtZSAobWVzc2FnZSk7CisKKyAgICBfZGJ1c192ZXJib3NlICgiRElTUEFUQ0g6ICVzICVzICVzIHRvICVzXG4iLAorICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9uYW1lID8gaW50ZXJmYWNlX25hbWUgOiAiKG5vIGludGVyZmFjZSkiLAorICAgICAgICAgICAgICAgICAgIG1lbWJlcl9uYW1lID8gbWVtYmVyX25hbWUgOiAiKG5vIG1lbWJlcikiLAorICAgICAgICAgICAgICAgICAgIGVycm9yX25hbWUgPyBlcnJvcl9uYW1lIDogIihubyBlcnJvciBuYW1lKSIsCisgICAgICAgICAgICAgICAgICAgc2VydmljZV9uYW1lID8gc2VydmljZV9uYW1lIDogInBlZXIiKTsKKyAgfQorI2VuZGlmIC8qIERCVVNfRU5BQkxFX1ZFUkJPU0VfTU9ERSAqLworCisgIC8qIElmIHNlcnZpY2VfbmFtZSBpcyBOVUxMLCBpZiBpdCdzIGEgc2lnbmFsIHdlIHNlbmQgaXQgdG8gYWxsCisgICAqIGNvbm5lY3Rpb25zIHdpdGggYSBtYXRjaCBydWxlLiBJZiBpdCdzIG5vdCBhIHNpZ25hbCwgdGhlcmUKKyAgICogYXJlIHNvbWUgc3BlY2lhbCBjYXNlcyBoZXJlIGJ1dCBtb3N0bHkgd2UganVzdCBiYWlsIG91dC4KKyAgICovCisgIGlmIChzZXJ2aWNlX25hbWUgPT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoZGJ1c19tZXNzYWdlX2lzX3NpZ25hbCAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0lOVEVSRkFDRV9MT0NBTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGlzY29ubmVjdGVkIikpCisgICAgICAgIHsKKyAgICAgICAgICBidXNfY29ubmVjdGlvbl9kaXNjb25uZWN0ZWQgKGNvbm5lY3Rpb24pOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKG1lc3NhZ2UpICE9IERCVVNfTUVTU0FHRV9UWVBFX1NJR05BTCkKKyAgICAgICAgeworICAgICAgICAgIC8qIERCdXNDb25uZWN0aW9uIGFsc28gaGFuZGxlcyBzb21lIG9mIHRoZXNlIGF1dG9tYXRpY2FsbHksIHdlIGxlYXZlCisgICAgICAgICAgICogaXQgdG8gZG8gc28uCisgICAgICAgICAgICoKKyAgICAgICAgICAgKiBGSVhNRTogdGhpcyBtZWFucyBtb25pdG9ycyB3b24ndCBnZXQgdGhlIG9wcG9ydHVuaXR5IHRvIHNlZQorICAgICAgICAgICAqIG5vbi1zaWduYWxzIHdpdGggTlVMTCBkZXN0aW5hdGlvbiwgb3IgdGhlaXIgcmVwbGllcyAod2hpY2ggaW4KKyAgICAgICAgICAgKiBwcmFjdGljZSBhcmUgVW5rbm93bk1ldGhvZCBlcnJvcnMpCisgICAgICAgICAgICovCisgICAgICAgICAgcmVzdWx0ID0gREJVU19IQU5ETEVSX1JFU1VMVF9OT1RfWUVUX0hBTkRMRUQ7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgLyogQ3JlYXRlIG91ciB0cmFuc2FjdGlvbiAqLworICB0cmFuc2FjdGlvbiA9IGJ1c190cmFuc2FjdGlvbl9uZXcgKGNvbnRleHQpOworICBpZiAodHJhbnNhY3Rpb24gPT0gTlVMTCkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoJmVycm9yKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAvKiBBc3NpZ24gYSBzZW5kZXIgdG8gdGhlIG1lc3NhZ2UgKi8KKyAgaWYgKGJ1c19jb25uZWN0aW9uX2lzX2FjdGl2ZSAoY29ubmVjdGlvbikpCisgICAgeworICAgICAgc2VuZGVyID0gYnVzX2Nvbm5lY3Rpb25fZ2V0X25hbWUgKGNvbm5lY3Rpb24pOworICAgICAgX2RidXNfYXNzZXJ0IChzZW5kZXIgIT0gTlVMTCk7CisKKyAgICAgIGlmICghZGJ1c19tZXNzYWdlX3NldF9zZW5kZXIgKG1lc3NhZ2UsIHNlbmRlcikpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoJmVycm9yKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIEZvciBtb25pdG9ycycgYmVuZWZpdDogd2UgZG9uJ3Qgd2FudCB0aGUgc2VuZGVyIHRvIGJlIGFibGUgdG8KKyAgICAgICAqIHRyaWNrIHRoZSBtb25pdG9yIGJ5IHN1cHBseWluZyBhIGZvcmdlZCBzZW5kZXIsIGFuZCB3ZSBhbHNvCisgICAgICAgKiBkb24ndCB3YW50IHRoZSBtZXNzYWdlIHRvIGhhdmUgbm8gc2VuZGVyIGF0IGFsbC4gKi8KKyAgICAgIGlmICghZGJ1c19tZXNzYWdlX3NldF9zZW5kZXIgKG1lc3NhZ2UsICI6bm90LmFjdGl2ZS55ZXQiKSkKKyAgICAgICAgeworICAgICAgICAgIEJVU19TRVRfT09NICgmZXJyb3IpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgfQorCisgIC8qIFdlIG5lZWQgdG8gcmVmZXRjaCB0aGUgc2VydmljZSBuYW1lIGhlcmUsIGJlY2F1c2UKKyAgICogZGJ1c19tZXNzYWdlX3NldF9zZW5kZXIgY2FuIGNhdXNlIHRoZSBoZWFkZXIgdG8gYmUKKyAgICogcmVhbGxvY2F0ZWQsIGFuZCB0aHVzIHRoZSBzZXJ2aWNlX25hbWUgcG9pbnRlciB3aWxsIGJlY29tZQorICAgKiBpbnZhbGlkLgorICAgKi8KKyAgc2VydmljZV9uYW1lID0gZGJ1c19tZXNzYWdlX2dldF9kZXN0aW5hdGlvbiAobWVzc2FnZSk7CisKKyAgaWYgKHNlcnZpY2VfbmFtZSAmJgorICAgICAgc3RyY21wIChzZXJ2aWNlX25hbWUsIERCVVNfU0VSVklDRV9EQlVTKSA9PSAwKSAvKiB0byBidXMgZHJpdmVyICovCisgICAgeworICAgICAgaWYgKCFidXNfdHJhbnNhY3Rpb25fY2FwdHVyZSAodHJhbnNhY3Rpb24sIGNvbm5lY3Rpb24sIE5VTEwsIG1lc3NhZ2UpKQorICAgICAgICB7CisgICAgICAgICAgQlVTX1NFVF9PT00gKCZlcnJvcik7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgICAgaWYgKCFidXNfY29udGV4dF9jaGVja19zZWN1cml0eV9wb2xpY3kgKGNvbnRleHQsIHRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24sIE5VTEwsIE5VTEwsIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgJmVycm9yKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJTZWN1cml0eSBwb2xpY3kgcmVqZWN0ZWQgbWVzc2FnZVxuIik7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgICAgX2RidXNfdmVyYm9zZSAoIkdpdmluZyBtZXNzYWdlIHRvICVzXG4iLCBEQlVTX1NFUlZJQ0VfREJVUyk7CisgICAgICBpZiAoIWJ1c19kcml2ZXJfaGFuZGxlX21lc3NhZ2UgKGNvbm5lY3Rpb24sIHRyYW5zYWN0aW9uLCBtZXNzYWdlLCAmZXJyb3IpKQorICAgICAgICBnb3RvIG91dDsKKyAgICB9CisgIGVsc2UgaWYgKCFidXNfY29ubmVjdGlvbl9pc19hY3RpdmUgKGNvbm5lY3Rpb24pKSAvKiBjbGllbnRzIG11c3QgdGFsayB0byBidXMgZHJpdmVyIGZpcnN0ICovCisgICAgeworICAgICAgaWYgKCFidXNfdHJhbnNhY3Rpb25fY2FwdHVyZSAodHJhbnNhY3Rpb24sIGNvbm5lY3Rpb24sIE5VTEwsIG1lc3NhZ2UpKQorICAgICAgICB7CisgICAgICAgICAgQlVTX1NFVF9PT00gKCZlcnJvcik7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgICAgX2RidXNfdmVyYm9zZSAoIlJlY2VpdmVkIG1lc3NhZ2UgZnJvbSBub24tcmVnaXN0ZXJlZCBjbGllbnQuIERpc2Nvbm5lY3RpbmcuXG4iKTsKKyAgICAgIGRidXNfY29ubmVjdGlvbl9jbG9zZSAoY29ubmVjdGlvbik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisgIGVsc2UgaWYgKHNlcnZpY2VfbmFtZSAhPSBOVUxMKSAvKiByb3V0ZSB0byBuYW1lZCBzZXJ2aWNlICovCisgICAgeworICAgICAgREJ1c1N0cmluZyBzZXJ2aWNlX3N0cmluZzsKKyAgICAgIEJ1c1NlcnZpY2UgKnNlcnZpY2U7CisgICAgICBCdXNSZWdpc3RyeSAqcmVnaXN0cnk7CisKKyAgICAgIF9kYnVzX2Fzc2VydCAoc2VydmljZV9uYW1lICE9IE5VTEwpOworCisgICAgICByZWdpc3RyeSA9IGJ1c19jb25uZWN0aW9uX2dldF9yZWdpc3RyeSAoY29ubmVjdGlvbik7CisKKyAgICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmc2VydmljZV9zdHJpbmcsIHNlcnZpY2VfbmFtZSk7CisgICAgICBzZXJ2aWNlID0gYnVzX3JlZ2lzdHJ5X2xvb2t1cCAocmVnaXN0cnksICZzZXJ2aWNlX3N0cmluZyk7CisKKyAgICAgIGlmIChzZXJ2aWNlID09IE5VTEwgJiYgZGJ1c19tZXNzYWdlX2dldF9hdXRvX3N0YXJ0IChtZXNzYWdlKSkKKyAgICAgICAgeworICAgICAgICAgIEJ1c0FjdGl2YXRpb24gKmFjdGl2YXRpb247CisKKyAgICAgICAgICBpZiAoIWJ1c190cmFuc2FjdGlvbl9jYXB0dXJlICh0cmFuc2FjdGlvbiwgY29ubmVjdGlvbiwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgQlVTX1NFVF9PT00gKCZlcnJvcik7CisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgYWN0aXZhdGlvbiA9IGJ1c19jb25uZWN0aW9uX2dldF9hY3RpdmF0aW9uIChjb25uZWN0aW9uKTsKKworICAgICAgICAgIC8qIFRoaXMgd2lsbCBkbyBhcyBtdWNoIG9mIGEgc2VjdXJpdHkgcG9saWN5IGNoZWNrIGFzIGl0IGNhbi4KKyAgICAgICAgICAgKiBXZSBjYW4ndCBkbyB0aGUgZnVsbCBzZWN1cml0eSBwb2xpY3kgY2hlY2sgaGVyZSwgc2luY2UgdGhlCisgICAgICAgICAgICogYWRkcmVzc2VkIHJlY2lwaWVudCBzZXJ2aWNlIGRvZXNuJ3QgZXhpc3QgeWV0LiBXZSBkbyBpdCBiZWZvcmUKKyAgICAgICAgICAgKiBzZW5kaW5nIHRoZSBtZXNzYWdlIGFmdGVyIHRoZSBzZXJ2aWNlIGhhcyBiZWVuIGNyZWF0ZWQuCisgICAgICAgICAgICovCisgICAgICAgICAgaWYgKCFidXNfYWN0aXZhdGlvbl9hY3RpdmF0ZV9zZXJ2aWNlIChhY3RpdmF0aW9uLCBjb25uZWN0aW9uLCB0cmFuc2FjdGlvbiwgVFJVRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsIHNlcnZpY2VfbmFtZSwgJmVycm9yKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoJmVycm9yKTsKKyAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoImJ1c19hY3RpdmF0aW9uX2FjdGl2YXRlX3NlcnZpY2UoKSBmYWlsZWQ6ICVzXG4iLCBlcnJvci5uYW1lKTsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoc2VydmljZSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCFidXNfdHJhbnNhY3Rpb25fY2FwdHVyZSAodHJhbnNhY3Rpb24sIGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgbWVzc2FnZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIEJVU19TRVRfT09NICgmZXJyb3IpOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGRidXNfc2V0X2Vycm9yICgmZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfTkFNRV9IQVNfTk9fT1dORVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJOYW1lIFwiJXNcIiBkb2VzIG5vdCBleGlzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfbmFtZSk7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGFkZHJlc3NlZF9yZWNpcGllbnQgPSBidXNfc2VydmljZV9nZXRfcHJpbWFyeV9vd25lcnNfY29ubmVjdGlvbiAoc2VydmljZSk7CisgICAgICAgICAgX2RidXNfYXNzZXJ0IChhZGRyZXNzZWRfcmVjaXBpZW50ICE9IE5VTEwpOworCisgICAgICAgICAgaWYgKCFidXNfdHJhbnNhY3Rpb25fY2FwdHVyZSAodHJhbnNhY3Rpb24sIGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc2VkX3JlY2lwaWVudCwgbWVzc2FnZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIEJVU19TRVRfT09NICgmZXJyb3IpOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgZWxzZSAvKiBzZXJ2aWNlX25hbWUgPT0gTlVMTCAqLworICAgIHsKKyAgICAgIGlmICghYnVzX3RyYW5zYWN0aW9uX2NhcHR1cmUgKHRyYW5zYWN0aW9uLCBjb25uZWN0aW9uLCBOVUxMLCBtZXNzYWdlKSkKKyAgICAgICAgeworICAgICAgICAgIEJVU19TRVRfT09NICgmZXJyb3IpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgfQorCisgIC8qIE5vdyBzZW5kIHRoZSBtZXNzYWdlIHRvIGl0cyBkZXN0aW5hdGlvbiAob3Igbm90LCBpZgorICAgKiBhZGRyZXNzZWRfcmVjaXBpZW50ID09IE5VTEwpLCBhbmQgbWF0Y2ggaXQgYWdhaW5zdCBvdGhlciBjb25uZWN0aW9ucycKKyAgICogbWF0Y2ggcnVsZXMuCisgICAqLworICBpZiAoIWJ1c19kaXNwYXRjaF9tYXRjaGVzICh0cmFuc2FjdGlvbiwgY29ubmVjdGlvbiwgYWRkcmVzc2VkX3JlY2lwaWVudCwgbWVzc2FnZSwgJmVycm9yKSkKKyAgICBnb3RvIG91dDsKKworIG91dDoKKyAgaWYgKGRidXNfZXJyb3JfaXNfc2V0ICgmZXJyb3IpKQorICAgIHsKKyAgICAgIC8qIEV2ZW4gaWYgd2UgZGlzY29ubmVjdGVkIGl0LCBwcmV0ZW5kIHRvIHNlbmQgaXQgYW55IHBlbmRpbmcgZXJyb3IKKyAgICAgICAqIG1lc3NhZ2VzIHNvIHRoYXQgbW9uaXRvcnMgY2FuIG9ic2VydmUgdGhlbS4KKyAgICAgICAqLworICAgICAgaWYgKGRidXNfZXJyb3JfaGFzX25hbWUgKCZlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlkpKQorICAgICAgICB7CisgICAgICAgICAgYnVzX2Nvbm5lY3Rpb25fc2VuZF9vb21fZXJyb3IgKGNvbm5lY3Rpb24sIG1lc3NhZ2UpOworCisgICAgICAgICAgLyogY2FuY2VsIHRyYW5zYWN0aW9uIGR1ZSB0byBPT00gKi8KKyAgICAgICAgICBpZiAodHJhbnNhY3Rpb24gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgYnVzX3RyYW5zYWN0aW9uX2NhbmNlbF9hbmRfZnJlZSAodHJhbnNhY3Rpb24pOworICAgICAgICAgICAgICB0cmFuc2FjdGlvbiA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8qIFRyeSB0byBzZW5kIHRoZSByZWFsIGVycm9yLCBpZiBubyBtZW0gdG8gZG8gdGhhdCwgc2VuZAorICAgICAgICAgICAqIHRoZSBPT00gZXJyb3IKKyAgICAgICAgICAgKi8KKyAgICAgICAgICBfZGJ1c19hc3NlcnQgKHRyYW5zYWN0aW9uICE9IE5VTEwpOworICAgICAgICAgIGlmICghYnVzX3RyYW5zYWN0aW9uX3NlbmRfZXJyb3JfcmVwbHkgKHRyYW5zYWN0aW9uLCBjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvciwgbWVzc2FnZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGJ1c19jb25uZWN0aW9uX3NlbmRfb29tX2Vycm9yIChjb25uZWN0aW9uLCBtZXNzYWdlKTsKKworICAgICAgICAgICAgICAvKiBjYW5jZWwgdHJhbnNhY3Rpb24gZHVlIHRvIE9PTSAqLworICAgICAgICAgICAgICBpZiAodHJhbnNhY3Rpb24gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBidXNfdHJhbnNhY3Rpb25fY2FuY2VsX2FuZF9mcmVlICh0cmFuc2FjdGlvbik7CisgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbiA9IE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgIH0KKworICBpZiAodHJhbnNhY3Rpb24gIT0gTlVMTCkKKyAgICB7CisgICAgICBidXNfdHJhbnNhY3Rpb25fZXhlY3V0ZV9hbmRfZnJlZSAodHJhbnNhY3Rpb24pOworICAgIH0KKworICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGNvbm5lY3Rpb24pOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBEQnVzSGFuZGxlclJlc3VsdAorYnVzX2Rpc3BhdGNoX21lc3NhZ2VfZmlsdGVyIChEQnVzQ29ubmVjdGlvbiAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICp1c2VyX2RhdGEpCit7CisgIHJldHVybiBidXNfZGlzcGF0Y2ggKGNvbm5lY3Rpb24sIG1lc3NhZ2UpOworfQorCitkYnVzX2Jvb2xfdAorYnVzX2Rpc3BhdGNoX2FkZF9jb25uZWN0aW9uIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fYWRkX2ZpbHRlciAoY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVzX2Rpc3BhdGNoX21lc3NhZ2VfZmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3ZvaWQKK2J1c19kaXNwYXRjaF9yZW1vdmVfY29ubmVjdGlvbiAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIC8qIEhlcmUgd2UgdGVsbCB0aGUgYnVzIGRyaXZlciB0aGF0IHdlIHdhbnQgdG8gZ2V0IG9mZi4gKi8KKyAgYnVzX2RyaXZlcl9yZW1vdmVfY29ubmVjdGlvbiAoY29ubmVjdGlvbik7CisKKyAgZGJ1c19jb25uZWN0aW9uX3JlbW92ZV9maWx0ZXIgKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXNfZGlzcGF0Y2hfbWVzc2FnZV9maWx0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKK30KKworI2lmZGVmIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAic3RhdHMuaCIKKworLyogVGhpcyBpcyB1c2VkIHRvIGtub3cgd2hldGhlciB3ZSBuZWVkIHRvIGJsb2NrIGluIG9yZGVyIHRvIGZpbmlzaAorICogc2VuZGluZyBhIG1lc3NhZ2UsIG9yIHdoZXRoZXIgdGhlIGluaXRpYWwgZGJ1c19jb25uZWN0aW9uX3NlbmQoKQorICogYWxyZWFkeSBmbHVzaGVkIHRoZSBxdWV1ZS4KKyAqLworI2RlZmluZSBTRU5EX1BFTkRJTkcoY29ubmVjdGlvbikgKGRidXNfY29ubmVjdGlvbl9oYXNfbWVzc2FnZXNfdG9fc2VuZCAoY29ubmVjdGlvbikpCisKK3R5cGVkZWYgZGJ1c19ib29sX3QgKCogQ2hlY2sxRnVuYykgKEJ1c0NvbnRleHQgICAgICpjb250ZXh0KTsKK3R5cGVkZWYgZGJ1c19ib29sX3QgKCogQ2hlY2syRnVuYykgKEJ1c0NvbnRleHQgICAgICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOworCitzdGF0aWMgZGJ1c19ib29sX3QgY2hlY2tfbm9fbGVmdG92ZXJzIChCdXNDb250ZXh0ICpjb250ZXh0KTsKKworc3RhdGljIHZvaWQKK2Jsb2NrX2Nvbm5lY3Rpb25fdW50aWxfbWVzc2FnZV9mcm9tX2J1cyAoQnVzQ29udGV4dCAgICAgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqd2hhdF9pc19leHBlY3RlZCkKK3sKKyAgX2RidXNfdmVyYm9zZSAoImV4cGVjdGluZzogJXNcbiIsIHdoYXRfaXNfZXhwZWN0ZWQpOworCisgIHdoaWxlIChkYnVzX2Nvbm5lY3Rpb25fZ2V0X2Rpc3BhdGNoX3N0YXR1cyAoY29ubmVjdGlvbikgPT0KKyAgICAgICAgIERCVVNfRElTUEFUQ0hfQ09NUExFVEUgJiYKKyAgICAgICAgIGRidXNfY29ubmVjdGlvbl9nZXRfaXNfY29ubmVjdGVkIChjb25uZWN0aW9uKSkKKyAgICB7CisgICAgICBidXNfdGVzdF9ydW5fYnVzX2xvb3AgKGNvbnRleHQsIFRSVUUpOworICAgICAgYnVzX3Rlc3RfcnVuX2NsaWVudHNfbG9vcCAoRkFMU0UpOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK3NwaW5fY29ubmVjdGlvbl91bnRpbF9hdXRoZW50aWNhdGVkIChCdXNDb250ZXh0ICAgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgX2RidXNfdmVyYm9zZSAoIlNwaW5uaW5nIHRvIGF1dGggY29ubmVjdGlvbiAlcFxuIiwgY29ubmVjdGlvbik7CisgIHdoaWxlICghZGJ1c19jb25uZWN0aW9uX2dldF9pc19hdXRoZW50aWNhdGVkIChjb25uZWN0aW9uKSAmJgorICAgICAgICAgZGJ1c19jb25uZWN0aW9uX2dldF9pc19jb25uZWN0ZWQgKGNvbm5lY3Rpb24pKQorICAgIHsKKyAgICAgIGJ1c190ZXN0X3J1bl9idXNfbG9vcCAoY29udGV4dCwgRkFMU0UpOworICAgICAgYnVzX3Rlc3RfcnVuX2NsaWVudHNfbG9vcCAoRkFMU0UpOworICAgIH0KKyAgX2RidXNfdmVyYm9zZSAoIiAuLi4gZG9uZSBzcGlubmluZyB0byBhdXRoIGNvbm5lY3Rpb24gJXBcbiIsIGNvbm5lY3Rpb24pOworfQorCisvKiBjb21wZW5zYXRlIGZvciBmYWN0IHRoYXQgcG9wX21lc3NhZ2UoKSBjYW4gcmV0dXJuICNOVUxMIGR1ZSB0byBPT00gKi8KK3N0YXRpYyBEQnVzTWVzc2FnZSoKK3BvcF9tZXNzYWdlX3dhaXRpbmdfZm9yX21lbW9yeSAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIHdoaWxlIChkYnVzX2Nvbm5lY3Rpb25fZ2V0X2Rpc3BhdGNoX3N0YXR1cyAoY29ubmVjdGlvbikgPT0KKyAgICAgICAgIERCVVNfRElTUEFUQ0hfTkVFRF9NRU1PUlkpCisgICAgX2RidXNfd2FpdF9mb3JfbWVtb3J5ICgpOworCisgIHJldHVybiBkYnVzX2Nvbm5lY3Rpb25fcG9wX21lc3NhZ2UgKGNvbm5lY3Rpb24pOworfQorCitzdGF0aWMgREJ1c01lc3NhZ2UqCitib3Jyb3dfbWVzc2FnZV93YWl0aW5nX2Zvcl9tZW1vcnkgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICB3aGlsZSAoZGJ1c19jb25uZWN0aW9uX2dldF9kaXNwYXRjaF9zdGF0dXMgKGNvbm5lY3Rpb24pID09CisgICAgICAgICBEQlVTX0RJU1BBVENIX05FRURfTUVNT1JZKQorICAgIF9kYnVzX3dhaXRfZm9yX21lbW9yeSAoKTsKKworICByZXR1cm4gZGJ1c19jb25uZWN0aW9uX2JvcnJvd19tZXNzYWdlIChjb25uZWN0aW9uKTsKK30KKworc3RhdGljIHZvaWQKK3dhcm5fdW5leHBlY3RlZF9yZWFsIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKmZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBsaW5lKQoreworICBpZiAobWVzc2FnZSkKKyAgICBfZGJ1c193YXJuICgiJXM6JWQgcmVjZWl2ZWQgbWVzc2FnZSBpbnRlcmZhY2UgXCIlc1wiIG1lbWJlciBcIiVzXCIgZXJyb3IgbmFtZSBcIiVzXCIgb24gJXAsIGV4cGVjdGluZyAlcyIsCisgICAgICAgICAgICAgICAgZnVuY3Rpb24sIGxpbmUsCisgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG1lc3NhZ2UpID8KKyAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAobWVzc2FnZSkgOiAiKHVuc2V0KSIsCisgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKG1lc3NhZ2UpID8KKyAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X21lbWJlciAobWVzc2FnZSkgOiAiKHVuc2V0KSIsCisgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9lcnJvcl9uYW1lIChtZXNzYWdlKSA/CisgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9lcnJvcl9uYW1lIChtZXNzYWdlKSA6ICIodW5zZXQpIiwKKyAgICAgICAgICAgICAgICBjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgIGV4cGVjdGVkKTsKKyAgZWxzZQorICAgIF9kYnVzX3dhcm4gKCIlczolZCByZWNlaXZlZCBubyBtZXNzYWdlIG9uICVwLCBleHBlY3RpbmcgJXMiLAorICAgICAgICAgICAgICAgIGZ1bmN0aW9uLCBsaW5lLCBjb25uZWN0aW9uLCBleHBlY3RlZCk7Cit9CisKKyNkZWZpbmUgd2Fybl91bmV4cGVjdGVkKGNvbm5lY3Rpb24sIG1lc3NhZ2UsIGV4cGVjdGVkKSBcCisgIHdhcm5fdW5leHBlY3RlZF9yZWFsIChjb25uZWN0aW9uLCBtZXNzYWdlLCBleHBlY3RlZCwgX0RCVVNfRlVOQ1RJT05fTkFNRSwgX19MSU5FX18pCisKK3N0YXRpYyB2b2lkCit2ZXJib3NlX21lc3NhZ2VfcmVjZWl2ZWQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAqbWVzc2FnZSkKK3sKKyAgX2RidXNfdmVyYm9zZSAoIlJlY2VpdmVkIG1lc3NhZ2UgaW50ZXJmYWNlIFwiJXNcIiBtZW1iZXIgXCIlc1wiIGVycm9yIG5hbWUgXCIlc1wiIG9uICVwXG4iLAorICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAobWVzc2FnZSkgPworICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAobWVzc2FnZSkgOiAiKHVuc2V0KSIsCisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKSA/CisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKSA6ICIodW5zZXQpIiwKKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9lcnJvcl9uYW1lIChtZXNzYWdlKSA/CisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfZXJyb3JfbmFtZSAobWVzc2FnZSkgOiAiKHVuc2V0KSIsCisgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24pOworfQorCit0eXBlZGVmIGVudW0KK3sKKyAgU0VSVklDRV9DUkVBVEVELAorICBPV05FUl9DSEFOR0VELAorICBTRVJWSUNFX0RFTEVURUQKK30gU2VydmljZUluZm9LaW5kOworCit0eXBlZGVmIHN0cnVjdAoreworICBTZXJ2aWNlSW5mb0tpbmQgZXhwZWN0ZWRfa2luZDsKKyAgY29uc3QgY2hhciAqZXhwZWN0ZWRfc2VydmljZV9uYW1lOworICBkYnVzX2Jvb2xfdCBmYWlsZWQ7CisgIERCdXNDb25uZWN0aW9uICpza2lwX2Nvbm5lY3Rpb247CisgIEJ1c0NvbnRleHQgKmNvbnRleHQ7Cit9IENoZWNrU2VydmljZU93bmVyQ2hhbmdlZERhdGE7CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorY2hlY2tfc2VydmljZV9vd25lcl9jaGFuZ2VkX2ZvcmVhY2ggKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICpkYXRhKQoreworICBDaGVja1NlcnZpY2VPd25lckNoYW5nZWREYXRhICpkID0gZGF0YTsKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisgIERCdXNFcnJvciBlcnJvcjsKKyAgY29uc3QgY2hhciAqc2VydmljZV9uYW1lLCAqb2xkX293bmVyLCAqbmV3X293bmVyOworCisgIGlmIChkLT5leHBlY3RlZF9raW5kID09IFNFUlZJQ0VfQ1JFQVRFRAorICAgICAgJiYgY29ubmVjdGlvbiA9PSBkLT5za2lwX2Nvbm5lY3Rpb24pCisgICAgcmV0dXJuIFRSVUU7CisKKyAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworICBkLT5mYWlsZWQgPSBUUlVFOworCisgIG1lc3NhZ2UgPSBwb3BfbWVzc2FnZV93YWl0aW5nX2Zvcl9tZW1vcnkgKGNvbm5lY3Rpb24pOworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIGJsb2NrX2Nvbm5lY3Rpb25fdW50aWxfbWVzc2FnZV9mcm9tX2J1cyAoZC0+Y29udGV4dCwgY29ubmVjdGlvbiwgIk5hbWVPd25lckNoYW5nZWQiKTsKKyAgICAgIG1lc3NhZ2UgPSBwb3BfbWVzc2FnZV93YWl0aW5nX2Zvcl9tZW1vcnkgKGNvbm5lY3Rpb24pOworICAgICAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJEaWQgbm90IHJlY2VpdmUgYSBtZXNzYWdlIG9uICVwLCBleHBlY3RpbmcgJXMiLAorICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24sICJOYW1lT3duZXJDaGFuZ2VkIik7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UgaWYgKCFkYnVzX21lc3NhZ2VfaXNfc2lnbmFsIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19JTlRFUkZBQ0VfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOYW1lT3duZXJDaGFuZ2VkIikpCisgICAgeworICAgICAgd2Fybl91bmV4cGVjdGVkIChjb25uZWN0aW9uLCBtZXNzYWdlLCAiTmFtZU93bmVyQ2hhbmdlZCIpOworCisgICAgICBnb3RvIG91dDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgcmVnZXRfc2VydmljZV9pbmZvX2RhdGE6CisgICAgICBzZXJ2aWNlX25hbWUgPSBOVUxMOworICAgICAgb2xkX293bmVyID0gTlVMTDsKKyAgICAgIG5ld19vd25lciA9IE5VTEw7CisKKyAgICAgIGRidXNfbWVzc2FnZV9nZXRfYXJncyAobWVzc2FnZSwgJmVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmc2VydmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmb2xkX293bmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmbmV3X293bmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCk7CisKKyAgICAgIGlmIChkYnVzX2Vycm9yX2lzX3NldCAoJmVycm9yKSkKKyAgICAgICAgeworICAgICAgICAgIGlmIChkYnVzX2Vycm9yX2hhc19uYW1lICgmZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgICAgICAgICBfZGJ1c193YWl0X2Zvcl9tZW1vcnkgKCk7CisgICAgICAgICAgICAgIGdvdG8gcmVnZXRfc2VydmljZV9pbmZvX2RhdGE7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c193YXJuICgiRGlkIG5vdCBnZXQgdGhlIGV4cGVjdGVkIGFyZ3VtZW50cyIpOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICBpZiAoKGQtPmV4cGVjdGVkX2tpbmQgPT0gU0VSVklDRV9DUkVBVEVEICAgICYmICggb2xkX293bmVyWzBdIHx8ICFuZXdfb3duZXJbMF0pKQorICAgICAgICAgIHx8IChkLT5leHBlY3RlZF9raW5kID09IE9XTkVSX0NIQU5HRUQgICAmJiAoIW9sZF9vd25lclswXSB8fCAhbmV3X293bmVyWzBdKSkKKyAgICAgICAgICB8fCAoZC0+ZXhwZWN0ZWRfa2luZCA9PSBTRVJWSUNFX0RFTEVURUQgJiYgKCFvbGRfb3duZXJbMF0gfHwgIG5ld19vd25lclswXSkpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoImluY29uc2lzdGVudCBOYW1lT3duZXJDaGFuZ2VkIGFyZ3VtZW50cyIpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgIGlmIChzdHJjbXAgKHNlcnZpY2VfbmFtZSwgZC0+ZXhwZWN0ZWRfc2VydmljZV9uYW1lKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoImV4cGVjdGVkIGluZm8gb24gc2VydmljZSAlcywgZ290IGluZm8gb24gJXMiLAorICAgICAgICAgICAgICAgICAgICAgIGQtPmV4cGVjdGVkX3NlcnZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlX25hbWUpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgIGlmICgqc2VydmljZV9uYW1lID09ICc6JyAmJiBuZXdfb3duZXJbMF0KKyAgICAgICAgICAmJiBzdHJjbXAgKHNlcnZpY2VfbmFtZSwgbmV3X293bmVyKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoImluY29uc2lzdGVudCBTZXJ2aWNlT3duZWRDaGFuZ2VkIG1lc3NhZ2UgKFwiJXNcIiBbICVzIC0+ICVzIF0pIiwKKyAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlX25hbWUsIG9sZF9vd25lciwgbmV3X293bmVyKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgIH0KKworICBkLT5mYWlsZWQgPSBGQUxTRTsKKworIG91dDoKKyAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworCisgIGlmIChtZXNzYWdlKQorICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisKKyAgcmV0dXJuICFkLT5mYWlsZWQ7Cit9CisKKworc3RhdGljIHZvaWQKK2tpbGxfY2xpZW50X2Nvbm5lY3Rpb24gKEJ1c0NvbnRleHQgICAgICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIGNoYXIgKmJhc2Vfc2VydmljZTsKKyAgY29uc3QgY2hhciAqczsKKyAgQ2hlY2tTZXJ2aWNlT3duZXJDaGFuZ2VkRGF0YSBzb2NkOworCisgIF9kYnVzX3ZlcmJvc2UgKCJraWxsaW5nIGNvbm5lY3Rpb24gJXBcbiIsIGNvbm5lY3Rpb24pOworCisgIHMgPSBkYnVzX2J1c19nZXRfdW5pcXVlX25hbWUgKGNvbm5lY3Rpb24pOworICBfZGJ1c19hc3NlcnQgKHMgIT0gTlVMTCk7CisKKyAgd2hpbGUgKChiYXNlX3NlcnZpY2UgPSBfZGJ1c19zdHJkdXAgKHMpKSA9PSBOVUxMKQorICAgIF9kYnVzX3dhaXRfZm9yX21lbW9yeSAoKTsKKworICBkYnVzX2Nvbm5lY3Rpb25fcmVmIChjb25uZWN0aW9uKTsKKworICAvKiBraWNrIGluIHRoZSBkaXNjb25uZWN0IGhhbmRsZXIgdGhhdCB1bnJlZnMgdGhlIGNvbm5lY3Rpb24gKi8KKyAgZGJ1c19jb25uZWN0aW9uX2Nsb3NlIChjb25uZWN0aW9uKTsKKworICBidXNfdGVzdF9ydW5fZXZlcnl0aGluZyAoY29udGV4dCk7CisKKyAgX2RidXNfYXNzZXJ0IChidXNfdGVzdF9jbGllbnRfbGlzdGVkIChjb25uZWN0aW9uKSk7CisKKyAgLyogUnVuIGRpc2Nvbm5lY3QgaGFuZGxlciBpbiB0ZXN0LmMgKi8KKyAgaWYgKGJ1c19jb25uZWN0aW9uX2Rpc3BhdGNoX29uZV9tZXNzYWdlIChjb25uZWN0aW9uKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJzb21ldGhpbmcgcmVjZWl2ZWQgb24gY29ubmVjdGlvbiBiZWluZyBraWxsZWQgb3RoZXIgdGhhbiB0aGUgZGlzY29ubmVjdCIpOworCisgIF9kYnVzX2Fzc2VydCAoIWRidXNfY29ubmVjdGlvbl9nZXRfaXNfY29ubmVjdGVkIChjb25uZWN0aW9uKSk7CisgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoY29ubmVjdGlvbik7CisgIGNvbm5lY3Rpb24gPSBOVUxMOworICBfZGJ1c19hc3NlcnQgKCFidXNfdGVzdF9jbGllbnRfbGlzdGVkIChjb25uZWN0aW9uKSk7CisKKyAgc29jZC5leHBlY3RlZF9raW5kID0gU0VSVklDRV9ERUxFVEVEOworICBzb2NkLmV4cGVjdGVkX3NlcnZpY2VfbmFtZSA9IGJhc2Vfc2VydmljZTsKKyAgc29jZC5mYWlsZWQgPSBGQUxTRTsKKyAgc29jZC5za2lwX2Nvbm5lY3Rpb24gPSBOVUxMOworICBzb2NkLmNvbnRleHQgPSBjb250ZXh0OworCisgIGJ1c190ZXN0X2NsaWVudHNfZm9yZWFjaCAoY2hlY2tfc2VydmljZV9vd25lcl9jaGFuZ2VkX2ZvcmVhY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNvY2QpOworCisgIGRidXNfZnJlZSAoYmFzZV9zZXJ2aWNlKTsKKworICBpZiAoc29jZC5mYWlsZWQpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZGlkbid0IGdldCB0aGUgZXhwZWN0ZWQgTmFtZU93bmVyQ2hhbmdlZCAoZGVsZXRpb24pIG1lc3NhZ2VzIik7CisKKyAgaWYgKCFjaGVja19ub19sZWZ0b3ZlcnMgKGNvbnRleHQpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInN0dWZmIGxlZnQgaW4gbWVzc2FnZSBxdWV1ZXMgYWZ0ZXIgZGlzY29ubmVjdGluZyBhIGNsaWVudCIpOworfQorCitzdGF0aWMgdm9pZAora2lsbF9jbGllbnRfY29ubmVjdGlvbl91bmNoZWNrZWQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICAvKiBUaGlzIGtpbGxzIHRoZSBjb25uZWN0aW9uIHdpdGhvdXQgZXhwZWN0aW5nIGl0IHRvIGFmZmVjdAorICAgKiB0aGUgcmVzdCBvZiB0aGUgYnVzLgorICAgKi8KKyAgX2RidXNfdmVyYm9zZSAoIlVuY2hlY2tlZCBraWxsIG9mIGNvbm5lY3Rpb24gJXBcbiIsIGNvbm5lY3Rpb24pOworCisgIGRidXNfY29ubmVjdGlvbl9yZWYgKGNvbm5lY3Rpb24pOworICBkYnVzX2Nvbm5lY3Rpb25fY2xvc2UgKGNvbm5lY3Rpb24pOworICAvKiBkaXNwYXRjaGluZyBkaXNjb25uZWN0IGhhbmRsZXIgd2lsbCB1bnJlZiBvbmNlICovCisgIGlmIChidXNfY29ubmVjdGlvbl9kaXNwYXRjaF9vbmVfbWVzc2FnZSAoY29ubmVjdGlvbikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibWVzc2FnZSBvdGhlciB0aGFuIGRpc2Nvbm5lY3QgZGlzcGF0Y2hlZCBhZnRlciBmYWlsdXJlIHRvIHJlZ2lzdGVyIik7CisKKyAgX2RidXNfYXNzZXJ0ICghYnVzX3Rlc3RfY2xpZW50X2xpc3RlZCAoY29ubmVjdGlvbikpOworICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGNvbm5lY3Rpb24pOworfQorCit0eXBlZGVmIHN0cnVjdAoreworICBkYnVzX2Jvb2xfdCBmYWlsZWQ7Cit9IENoZWNrTm9NZXNzYWdlc0RhdGE7CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorY2hlY2tfbm9fbWVzc2FnZXNfZm9yZWFjaCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAqZGF0YSkKK3sKKyAgQ2hlY2tOb01lc3NhZ2VzRGF0YSAqZCA9IGRhdGE7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworCisgIG1lc3NhZ2UgPSBwb3BfbWVzc2FnZV93YWl0aW5nX2Zvcl9tZW1vcnkgKGNvbm5lY3Rpb24pOworICBpZiAobWVzc2FnZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIHdhcm5fdW5leHBlY3RlZCAoY29ubmVjdGlvbiwgbWVzc2FnZSwgIm5vIG1lc3NhZ2VzIik7CisKKyAgICAgIGQtPmZhaWxlZCA9IFRSVUU7CisgICAgfQorCisgIGlmIChtZXNzYWdlKQorICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIHJldHVybiAhZC0+ZmFpbGVkOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX25vX2xlZnRvdmVycyAoQnVzQ29udGV4dCAqY29udGV4dCkKK3sKKyAgQ2hlY2tOb01lc3NhZ2VzRGF0YSBubWQ7CisKKyAgbm1kLmZhaWxlZCA9IEZBTFNFOworICBidXNfdGVzdF9jbGllbnRzX2ZvcmVhY2ggKGNoZWNrX25vX21lc3NhZ2VzX2ZvcmVhY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5tZCk7CisKKyAgaWYgKG5tZC5mYWlsZWQpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoImxlZnRvdmVyIG1lc3NhZ2UgZm91bmRcbiIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgZWxzZQorICAgIHJldHVybiBUUlVFOworfQorCisvKiByZXR1cm5zIFRSVUUgaWYgdGhlIGNvcnJlY3QgdGhpbmcgaGFwcGVucywKKyAqIGJ1dCB0aGUgY29ycmVjdCB0aGluZyBtYXkgaW5jbHVkZSBPT00gZXJyb3JzLgorICovCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX2hlbGxvX21lc3NhZ2UgKEJ1c0NvbnRleHQgICAgICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworICBEQnVzTWVzc2FnZSAqbmFtZV9tZXNzYWdlOworICBkYnVzX3VpbnQzMl90IHNlcmlhbDsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICBEQnVzRXJyb3IgZXJyb3I7CisgIGNvbnN0IGNoYXIgKm5hbWU7CisgIGNvbnN0IGNoYXIgKmFjcXVpcmVkOworCisgIHJldHZhbCA9IEZBTFNFOworICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisgIG5hbWUgPSBOVUxMOworICBhY3F1aXJlZCA9IE5VTEw7CisgIG1lc3NhZ2UgPSBOVUxMOworICBuYW1lX21lc3NhZ2UgPSBOVUxMOworCisgIF9kYnVzX3ZlcmJvc2UgKCJjaGVja19oZWxsb19tZXNzYWdlIGZvciAlcFxuIiwgY29ubmVjdGlvbik7CisKKyAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKERCVVNfU0VSVklDRV9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19QQVRIX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0lOVEVSRkFDRV9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlbGxvIik7CisKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICByZXR1cm4gVFJVRTsKKworICBkYnVzX2Nvbm5lY3Rpb25fcmVmIChjb25uZWN0aW9uKTsgLyogYmVjYXVzZSB3ZSBtYXkgZ2V0IGRpc2Nvbm5lY3RlZCAqLworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX3NlbmQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsICZzZXJpYWwpKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGNvbm5lY3Rpb24pOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIF9kYnVzX2Fzc2VydCAoZGJ1c19tZXNzYWdlX2hhc19zaWduYXR1cmUgKG1lc3NhZ2UsICIiKSk7CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgbWVzc2FnZSA9IE5VTEw7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Nvbm5lY3RlZCAoY29ubmVjdGlvbikpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoImNvbm5lY3Rpb24gd2FzIGRpc2Nvbm5lY3RlZCAocHJlc3VtYWJseSBhdXRoIGZhaWxlZClcbiIpOworCisgICAgICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGNvbm5lY3Rpb24pOworCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgLyogc2VuZCBvdXIgbWVzc2FnZSAqLworICBidXNfdGVzdF9ydW5fY2xpZW50c19sb29wIChTRU5EX1BFTkRJTkcgKGNvbm5lY3Rpb24pKTsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9nZXRfaXNfY29ubmVjdGVkIChjb25uZWN0aW9uKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiY29ubmVjdGlvbiB3YXMgZGlzY29ubmVjdGVkIChwcmVzdW1hYmx5IGF1dGggZmFpbGVkKVxuIik7CisKKyAgICAgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoY29ubmVjdGlvbik7CisKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICBibG9ja19jb25uZWN0aW9uX3VudGlsX21lc3NhZ2VfZnJvbV9idXMgKGNvbnRleHQsIGNvbm5lY3Rpb24sICJyZXBseSB0byBIZWxsbyIpOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX2dldF9pc19jb25uZWN0ZWQgKGNvbm5lY3Rpb24pKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJjb25uZWN0aW9uIHdhcyBkaXNjb25uZWN0ZWQgKHByZXN1bWFibHkgYXV0aCBmYWlsZWQpXG4iKTsKKworICAgICAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChjb25uZWN0aW9uKTsKKworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIG1lc3NhZ2UgPSBwb3BfbWVzc2FnZV93YWl0aW5nX2Zvcl9tZW1vcnkgKGNvbm5lY3Rpb24pOworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJEaWQgbm90IHJlY2VpdmUgYSByZXBseSB0byAlcyAlZCBvbiAlcCIsCisgICAgICAgICAgICAgICAgICAiSGVsbG8iLCBzZXJpYWwsIGNvbm5lY3Rpb24pOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIHZlcmJvc2VfbWVzc2FnZV9yZWNlaXZlZCAoY29ubmVjdGlvbiwgbWVzc2FnZSk7CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfaGFzX3NlbmRlciAobWVzc2FnZSwgREJVU19TRVJWSUNFX0RCVVMpKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJNZXNzYWdlIGhhcyB3cm9uZyBzZW5kZXIgJXMiLAorICAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9zZW5kZXIgKG1lc3NhZ2UpID8KKyAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfc2VuZGVyIChtZXNzYWdlKSA6ICIobm9uZSkiKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlKSA9PSBEQlVTX01FU1NBR0VfVFlQRV9FUlJPUikKKyAgICB7CisgICAgICBpZiAoZGJ1c19tZXNzYWdlX2lzX2Vycm9yIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9OT19NRU1PUlkpKQorICAgICAgICB7CisgICAgICAgICAgOyAvKiBnb29kLCB0aGlzIGlzIGEgdmFsaWQgcmVzcG9uc2UgKi8KKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgd2Fybl91bmV4cGVjdGVkIChjb25uZWN0aW9uLCBtZXNzYWdlLCAibm90IHRoaXMgZXJyb3IiKTsKKworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgQ2hlY2tTZXJ2aWNlT3duZXJDaGFuZ2VkRGF0YSBzb2NkOworCisgICAgICBpZiAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlKSA9PSBEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfUkVUVVJOKQorICAgICAgICB7CisgICAgICAgICAgOyAvKiBnb29kLCBleHBlY3RlZCAqLworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICB3YXJuX3VuZXhwZWN0ZWQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsICJtZXRob2QgcmV0dXJuIGZvciBIZWxsbyIpOworCisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgIHJldHJ5X2dldF9oZWxsb19uYW1lOgorICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MgKG1lc3NhZ2UsICZlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoZGJ1c19lcnJvcl9oYXNfbmFtZSAoJmVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJubyBtZW1vcnkgdG8gZ2V0IHNlcnZpY2UgbmFtZSBhcmcgZnJvbSBoZWxsb1xuIik7CisgICAgICAgICAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgICAgICAgICAgX2RidXNfd2FpdF9mb3JfbWVtb3J5ICgpOworICAgICAgICAgICAgICBnb3RvIHJldHJ5X2dldF9oZWxsb19uYW1lOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfYXNzZXJ0IChkYnVzX2Vycm9yX2lzX3NldCAoJmVycm9yKSk7CisgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJEaWQgbm90IGdldCB0aGUgZXhwZWN0ZWQgc2luZ2xlIHN0cmluZyBhcmd1bWVudCB0byBoZWxsbyIpOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICBfZGJ1c192ZXJib3NlICgiR290IGhlbGxvIG5hbWU6ICVzXG4iLCBuYW1lKTsKKworICAgICAgd2hpbGUgKCFkYnVzX2J1c19zZXRfdW5pcXVlX25hbWUgKGNvbm5lY3Rpb24sIG5hbWUpKQorICAgICAgICBfZGJ1c193YWl0X2Zvcl9tZW1vcnkgKCk7CisKKyAgICAgIHNvY2QuZXhwZWN0ZWRfa2luZCA9IFNFUlZJQ0VfQ1JFQVRFRDsKKyAgICAgIHNvY2QuZXhwZWN0ZWRfc2VydmljZV9uYW1lID0gbmFtZTsKKyAgICAgIHNvY2QuZmFpbGVkID0gRkFMU0U7CisgICAgICBzb2NkLnNraXBfY29ubmVjdGlvbiA9IGNvbm5lY3Rpb247IC8qIHdlIGhhdmVuJ3QgZG9uZSBBZGRNYXRjaCBzbyB3b24ndCBnZXQgaXQgb3Vyc2VsdmVzICovCisgICAgICBzb2NkLmNvbnRleHQgPSBjb250ZXh0OworCisgICAgICBidXNfdGVzdF9jbGllbnRzX2ZvcmVhY2ggKGNoZWNrX3NlcnZpY2Vfb3duZXJfY2hhbmdlZF9mb3JlYWNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc29jZCk7CisKKyAgICAgIGlmIChzb2NkLmZhaWxlZCkKKyAgICAgICAgZ290byBvdXQ7CisKKyAgICAgIG5hbWVfbWVzc2FnZSA9IG1lc3NhZ2U7CisgICAgICAvKiBDbGllbnQgc2hvdWxkIGFsc28gaGF2ZSBnb3R0ZW4gU2VydmljZUFjcXVpcmVkICovCisKKyAgICAgIG1lc3NhZ2UgPSBwb3BfbWVzc2FnZV93YWl0aW5nX2Zvcl9tZW1vcnkgKGNvbm5lY3Rpb24pOworICAgICAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGJsb2NrX2Nvbm5lY3Rpb25fdW50aWxfbWVzc2FnZV9mcm9tX2J1cyAoY29udGV4dCwgY29ubmVjdGlvbiwgInNpZ25hbCBOYW1lQWNxdWlyZWQiKTsKKyAgICAgICAgICBtZXNzYWdlID0gcG9wX21lc3NhZ2Vfd2FpdGluZ19mb3JfbWVtb3J5IChjb25uZWN0aW9uKTsKKyAgICAgICAgICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c193YXJuICgiRXhwZWN0aW5nICVzLCBnb3Qgbm90aGluZyIsCisgICAgICAgICAgICAgICAgICAgICAgIk5hbWVBY3F1aXJlZCIpOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgaWYgKCEgZGJ1c19tZXNzYWdlX2lzX3NpZ25hbCAobWVzc2FnZSwgREJVU19JTlRFUkZBQ0VfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOYW1lQWNxdWlyZWQiKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJFeHBlY3RpbmcgJXMsIGdvdCBzbXRoZyBlbHNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAiTmFtZUFjcXVpcmVkIik7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgIHJldHJ5X2dldF9hY3F1aXJlZF9uYW1lOgorICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MgKG1lc3NhZ2UsICZlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmYWNxdWlyZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGRidXNfZXJyb3JfaGFzX25hbWUgKCZlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgibm8gbWVtb3J5IHRvIGdldCBzZXJ2aWNlIG5hbWUgYXJnIGZyb20gYWNxdWlyZWRcbiIpOworICAgICAgICAgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICAgICAgICAgIF9kYnVzX3dhaXRfZm9yX21lbW9yeSAoKTsKKyAgICAgICAgICAgICAgZ290byByZXRyeV9nZXRfYWNxdWlyZWRfbmFtZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX2Fzc2VydCAoZGJ1c19lcnJvcl9pc19zZXQgKCZlcnJvcikpOworICAgICAgICAgICAgICBfZGJ1c193YXJuICgiRGlkIG5vdCBnZXQgdGhlIGV4cGVjdGVkIHNpbmdsZSBzdHJpbmcgYXJndW1lbnQgdG8gU2VydmljZUFjcXVpcmVkIik7CisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJHb3QgYWNxdWlyZWQgbmFtZTogJXNcbiIsIGFjcXVpcmVkKTsKKworICAgICAgaWYgKHN0cmNtcCAoYWNxdWlyZWQsIG5hbWUpICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgiQWNxdWlyZWQgbmFtZSBpcyAlcyBidXQgZXhwZWN0ZWQgJXMiLAorICAgICAgICAgICAgICAgICAgICAgIGFjcXVpcmVkLCBuYW1lKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgICAgYWNxdWlyZWQgPSBOVUxMOworICAgIH0KKworICBpZiAoIWNoZWNrX25vX2xlZnRvdmVycyAoY29udGV4dCkpCisgICAgZ290byBvdXQ7CisKKyAgcmV0dmFsID0gVFJVRTsKKworIG91dDoKKyAgX2RidXNfdmVyYm9zZSAoImVuZGluZyAtIHJldHZhbCA9ICVkXG4iLCByZXR2YWwpOworCisgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKworICBpZiAobWVzc2FnZSkKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworCisgIGlmIChuYW1lX21lc3NhZ2UpCisgICAgZGJ1c19tZXNzYWdlX3VucmVmIChuYW1lX21lc3NhZ2UpOworCisgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoY29ubmVjdGlvbik7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyogcmV0dXJucyBUUlVFIGlmIHRoZSBjb3JyZWN0IHRoaW5nIGhhcHBlbnMsCisgKiBidXQgdGhlIGNvcnJlY3QgdGhpbmcgbWF5IGluY2x1ZGUgT09NIGVycm9ycy4KKyAqLworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19kb3VibGVfaGVsbG9fbWVzc2FnZSAoQnVzQ29udGV4dCAgICAgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworICBkYnVzX3VpbnQzMl90IHNlcmlhbDsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICBEQnVzRXJyb3IgZXJyb3I7CisKKyAgcmV0dmFsID0gRkFMU0U7CisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKyAgbWVzc2FnZSA9IE5VTEw7CisKKyAgX2RidXNfdmVyYm9zZSAoImNoZWNrX2RvdWJsZV9oZWxsb19tZXNzYWdlIGZvciAlcFxuIiwgY29ubmVjdGlvbik7CisKKyAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKERCVVNfU0VSVklDRV9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19QQVRIX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0lOVEVSRkFDRV9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlbGxvIik7CisKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICByZXR1cm4gVFJVRTsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZW5kIChjb25uZWN0aW9uLCBtZXNzYWdlLCAmc2VyaWFsKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIG1lc3NhZ2UgPSBOVUxMOworCisgIC8qIHNlbmQgb3VyIG1lc3NhZ2UgKi8KKyAgYnVzX3Rlc3RfcnVuX2NsaWVudHNfbG9vcCAoU0VORF9QRU5ESU5HIChjb25uZWN0aW9uKSk7CisKKyAgZGJ1c19jb25uZWN0aW9uX3JlZiAoY29ubmVjdGlvbik7IC8qIGJlY2F1c2Ugd2UgbWF5IGdldCBkaXNjb25uZWN0ZWQgKi8KKyAgYmxvY2tfY29ubmVjdGlvbl91bnRpbF9tZXNzYWdlX2Zyb21fYnVzIChjb250ZXh0LCBjb25uZWN0aW9uLCAicmVwbHkgdG8gSGVsbG8iKTsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9nZXRfaXNfY29ubmVjdGVkIChjb25uZWN0aW9uKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiY29ubmVjdGlvbiB3YXMgZGlzY29ubmVjdGVkXG4iKTsKKworICAgICAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChjb25uZWN0aW9uKTsKKworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoY29ubmVjdGlvbik7CisKKyAgbWVzc2FnZSA9IHBvcF9tZXNzYWdlX3dhaXRpbmdfZm9yX21lbW9yeSAoY29ubmVjdGlvbik7CisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkRpZCBub3QgcmVjZWl2ZSBhIHJlcGx5IHRvICVzICVkIG9uICVwIiwKKyAgICAgICAgICAgICAgICAgICJIZWxsbyIsIHNlcmlhbCwgY29ubmVjdGlvbik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgdmVyYm9zZV9tZXNzYWdlX3JlY2VpdmVkIChjb25uZWN0aW9uLCBtZXNzYWdlKTsKKworICBpZiAoIWRidXNfbWVzc2FnZV9oYXNfc2VuZGVyIChtZXNzYWdlLCBEQlVTX1NFUlZJQ0VfREJVUykpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIk1lc3NhZ2UgaGFzIHdyb25nIHNlbmRlciAlcyIsCisgICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3NlbmRlciAobWVzc2FnZSkgPworICAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9zZW5kZXIgKG1lc3NhZ2UpIDogIihub25lKSIpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKG1lc3NhZ2UpICE9IERCVVNfTUVTU0FHRV9UWVBFX0VSUk9SKQorICAgIHsKKyAgICAgIHdhcm5fdW5leHBlY3RlZCAoY29ubmVjdGlvbiwgbWVzc2FnZSwgIm1ldGhvZCByZXR1cm4gZm9yIEhlbGxvIik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgaWYgKCFjaGVja19ub19sZWZ0b3ZlcnMgKGNvbnRleHQpKQorICAgIGdvdG8gb3V0OworCisgIHJldHZhbCA9IFRSVUU7CisKKyBvdXQ6CisgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKworICBpZiAobWVzc2FnZSkKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKKy8qIHJldHVybnMgVFJVRSBpZiB0aGUgY29ycmVjdCB0aGluZyBoYXBwZW5zLAorICogYnV0IHRoZSBjb3JyZWN0IHRoaW5nIG1heSBpbmNsdWRlIE9PTSBlcnJvcnMuCisgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAorY2hlY2tfZ2V0X2Nvbm5lY3Rpb25fdW5peF91c2VyIChCdXNDb250ZXh0ICAgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworICBkYnVzX3VpbnQzMl90IHNlcmlhbDsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICBEQnVzRXJyb3IgZXJyb3I7CisgIGNvbnN0IGNoYXIgKmJhc2Vfc2VydmljZV9uYW1lOworICBkYnVzX3VpbnQzMl90IHVpZDsKKworICByZXR2YWwgPSBGQUxTRTsKKyAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworICBtZXNzYWdlID0gTlVMTDsKKworICBfZGJ1c192ZXJib3NlICgiY2hlY2tfZ2V0X2Nvbm5lY3Rpb25fdW5peF91c2VyIGZvciAlcFxuIiwgY29ubmVjdGlvbik7CisKKyAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKERCVVNfU0VSVklDRV9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19QQVRIX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0lOVEVSRkFDRV9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdldENvbm5lY3Rpb25Vbml4VXNlciIpOworCisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgYmFzZV9zZXJ2aWNlX25hbWUgPSBkYnVzX2J1c19nZXRfdW5pcXVlX25hbWUgKGNvbm5lY3Rpb24pOworCisgIGlmICghZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJmJhc2Vfc2VydmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoY29ubmVjdGlvbiwgbWVzc2FnZSwgJnNlcmlhbCkpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICAvKiBzZW5kIG91ciBtZXNzYWdlICovCisgIGJ1c190ZXN0X3J1bl9jbGllbnRzX2xvb3AgKFNFTkRfUEVORElORyAoY29ubmVjdGlvbikpOworCisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIG1lc3NhZ2UgPSBOVUxMOworCisgIGRidXNfY29ubmVjdGlvbl9yZWYgKGNvbm5lY3Rpb24pOyAvKiBiZWNhdXNlIHdlIG1heSBnZXQgZGlzY29ubmVjdGVkICovCisgIGJsb2NrX2Nvbm5lY3Rpb25fdW50aWxfbWVzc2FnZV9mcm9tX2J1cyAoY29udGV4dCwgY29ubmVjdGlvbiwgInJlcGx5IHRvIEdldENvbm5lY3Rpb25Vbml4VXNlciIpOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX2dldF9pc19jb25uZWN0ZWQgKGNvbm5lY3Rpb24pKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJjb25uZWN0aW9uIHdhcyBkaXNjb25uZWN0ZWRcbiIpOworCisgICAgICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGNvbm5lY3Rpb24pOworCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChjb25uZWN0aW9uKTsKKworICBtZXNzYWdlID0gcG9wX21lc3NhZ2Vfd2FpdGluZ19mb3JfbWVtb3J5IChjb25uZWN0aW9uKTsKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiRGlkIG5vdCByZWNlaXZlIGEgcmVwbHkgdG8gJXMgJWQgb24gJXAiLAorICAgICAgICAgICAgICAgICAgIkdldENvbm5lY3Rpb25Vbml4VXNlciIsIHNlcmlhbCwgY29ubmVjdGlvbik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgdmVyYm9zZV9tZXNzYWdlX3JlY2VpdmVkIChjb25uZWN0aW9uLCBtZXNzYWdlKTsKKworICBpZiAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlKSA9PSBEQlVTX01FU1NBR0VfVFlQRV9FUlJPUikKKyAgICB7CisgICAgICBpZiAoZGJ1c19tZXNzYWdlX2lzX2Vycm9yIChtZXNzYWdlLCBEQlVTX0VSUk9SX05PX01FTU9SWSkpCisgICAgICAgIHsKKyAgICAgICAgICA7IC8qIGdvb2QsIHRoaXMgaXMgYSB2YWxpZCByZXNwb25zZSAqLworICAgICAgICB9CisjaWZkZWYgREJVU19XSU4KKyAgICAgIGVsc2UgaWYgKGRidXNfbWVzc2FnZV9pc19lcnJvciAobWVzc2FnZSwgREJVU19FUlJPUl9GQUlMRUQpKQorICAgICAgICB7CisgICAgICAgICAgLyogdGhpcyBpcyBPSywgVW5peCB1aWRzIGFyZW4ndCBtZWFuaW5nZnVsIG9uIFdpbmRvd3MgKi8KKyAgICAgICAgfQorI2VuZGlmCisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICB3YXJuX3VuZXhwZWN0ZWQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsICJub3QgdGhpcyBlcnJvciIpOworCisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlKSA9PSBEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfUkVUVVJOKQorICAgICAgICB7CisgICAgICAgICAgOyAvKiBnb29kLCBleHBlY3RlZCAqLworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICB3YXJuX3VuZXhwZWN0ZWQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAibWV0aG9kX3JldHVybiBmb3IgR2V0Q29ubmVjdGlvblVuaXhVc2VyIik7CisKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgcmV0cnlfZ2V0X3Byb3BlcnR5OgorCisgICAgICBpZiAoIWRidXNfbWVzc2FnZV9nZXRfYXJncyAobWVzc2FnZSwgJmVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9VSU5UMzIsICZ1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGRidXNfZXJyb3JfaGFzX25hbWUgKCZlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgibm8gbWVtb3J5IHRvIGdldCB1aWQgYnkgR2V0Q29ubmVjdGlvblVuaXhVc2VyXG4iKTsKKyAgICAgICAgICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgICAgICAgICBfZGJ1c193YWl0X2Zvcl9tZW1vcnkgKCk7CisgICAgICAgICAgICAgIGdvdG8gcmV0cnlfZ2V0X3Byb3BlcnR5OworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfYXNzZXJ0IChkYnVzX2Vycm9yX2lzX3NldCAoJmVycm9yKSk7CisgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJEaWQgbm90IGdldCB0aGUgZXhwZWN0ZWQgREJVU19UWVBFX1VJTlQzMiBmcm9tIEdldENvbm5lY3Rpb25Vbml4VXNlciIpOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICBpZiAoIWNoZWNrX25vX2xlZnRvdmVycyAoY29udGV4dCkpCisgICAgZ290byBvdXQ7CisKKyAgcmV0dmFsID0gVFJVRTsKKworIG91dDoKKyAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworCisgIGlmIChtZXNzYWdlKQorICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyogcmV0dXJucyBUUlVFIGlmIHRoZSBjb3JyZWN0IHRoaW5nIGhhcHBlbnMsCisgKiBidXQgdGhlIGNvcnJlY3QgdGhpbmcgbWF5IGluY2x1ZGUgT09NIGVycm9ycy4KKyAqLworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19nZXRfY29ubmVjdGlvbl91bml4X3Byb2Nlc3NfaWQgKEJ1c0NvbnRleHQgICAgICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisgIGRidXNfdWludDMyX3Qgc2VyaWFsOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIERCdXNFcnJvciBlcnJvcjsKKyAgY29uc3QgY2hhciAqYmFzZV9zZXJ2aWNlX25hbWU7CisjaWZkZWYgREJVU19VTklYCisgIGRidXNfdWludDMyX3QgcGlkOworI2VuZGlmCisKKyAgcmV0dmFsID0gRkFMU0U7CisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKyAgbWVzc2FnZSA9IE5VTEw7CisKKyAgX2RidXNfdmVyYm9zZSAoImNoZWNrX2dldF9jb25uZWN0aW9uX3VuaXhfcHJvY2Vzc19pZCBmb3IgJXBcbiIsIGNvbm5lY3Rpb24pOworCisgIG1lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsIChEQlVTX1NFUlZJQ0VfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfUEFUSF9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19JTlRFUkZBQ0VfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHZXRDb25uZWN0aW9uVW5peFByb2Nlc3NJRCIpOworCisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgYmFzZV9zZXJ2aWNlX25hbWUgPSBkYnVzX2J1c19nZXRfdW5pcXVlX25hbWUgKGNvbm5lY3Rpb24pOworCisgIGlmICghZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJmJhc2Vfc2VydmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoY29ubmVjdGlvbiwgbWVzc2FnZSwgJnNlcmlhbCkpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICAvKiBzZW5kIG91ciBtZXNzYWdlICovCisgIGJ1c190ZXN0X3J1bl9jbGllbnRzX2xvb3AgKFNFTkRfUEVORElORyAoY29ubmVjdGlvbikpOworCisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIG1lc3NhZ2UgPSBOVUxMOworCisgIGRidXNfY29ubmVjdGlvbl9yZWYgKGNvbm5lY3Rpb24pOyAvKiBiZWNhdXNlIHdlIG1heSBnZXQgZGlzY29ubmVjdGVkICovCisgIGJsb2NrX2Nvbm5lY3Rpb25fdW50aWxfbWVzc2FnZV9mcm9tX2J1cyAoY29udGV4dCwgY29ubmVjdGlvbiwgInJlcGx5IHRvIEdldENvbm5lY3Rpb25Vbml4UHJvY2Vzc0lEIik7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Nvbm5lY3RlZCAoY29ubmVjdGlvbikpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoImNvbm5lY3Rpb24gd2FzIGRpc2Nvbm5lY3RlZFxuIik7CisKKyAgICAgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoY29ubmVjdGlvbik7CisKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGNvbm5lY3Rpb24pOworCisgIG1lc3NhZ2UgPSBwb3BfbWVzc2FnZV93YWl0aW5nX2Zvcl9tZW1vcnkgKGNvbm5lY3Rpb24pOworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJEaWQgbm90IHJlY2VpdmUgYSByZXBseSB0byAlcyAlZCBvbiAlcCIsCisgICAgICAgICAgICAgICAgICAiR2V0Q29ubmVjdGlvblVuaXhQcm9jZXNzSUQiLCBzZXJpYWwsIGNvbm5lY3Rpb24pOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIHZlcmJvc2VfbWVzc2FnZV9yZWNlaXZlZCAoY29ubmVjdGlvbiwgbWVzc2FnZSk7CisKKyAgaWYgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkgPT0gREJVU19NRVNTQUdFX1RZUEVfRVJST1IpCisgICAgeworICAgICAgaWYgKGRidXNfbWVzc2FnZV9pc19lcnJvciAobWVzc2FnZSwgREJVU19FUlJPUl9OT19NRU1PUlkpKQorICAgICAgICB7CisgICAgICAgICAgOyAvKiBnb29kLCB0aGlzIGlzIGEgdmFsaWQgcmVzcG9uc2UgKi8KKyAgICAgICAgfQorI2lmZGVmIERCVVNfV0lOCisgICAgICBlbHNlIGlmIChkYnVzX21lc3NhZ2VfaXNfZXJyb3IgKG1lc3NhZ2UsIERCVVNfRVJST1JfVU5JWF9QUk9DRVNTX0lEX1VOS05PV04pKQorICAgICAgICB7CisgICAgICAgICAgLyogV2UgYXJlIGV4cGVjdGluZyB0aGlzIGVycm9yLCBzaW5jZSB3ZSBrbm93IGluIHRoZSB0ZXN0IHN1aXRlIHdlIGFyZW4ndAorICAgICAgICAgICAqIHRhbGtpbmcgdG8gYSBjbGllbnQgcnVubmluZyBvbiBVTklYCisgICAgICAgICAgICovCisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIldpbmRvd3MgY29ycmVjdGx5IGRvZXMgbm90IHN1cHBvcnQgR2V0Q29ubmVjdGlvblVuaXhQcm9jZXNzSURcbiIpOworICAgICAgICB9CisjZW5kaWYKKyAgICAgIGVsc2UKKyAgICAgICAgeworI2lmIGRlZmluZWQoX19GcmVlQlNEX18pIHx8IGRlZmluZWQoX19GcmVlQlNEX2tlcm5lbF9fKSB8fCBcCisgICAgICAgICAgZGVmaW5lZChfX2xpbnV4X18pIHx8IFwKKyAgICAgICAgICBkZWZpbmVkKF9fT3BlbkJTRF9fKQorICAgICAgICAgIC8qIEluIHByaW5jaXBsZSBOZXRCU0Qgc2hvdWxkIGFsc28gYmUgaW4gdGhhdCBsaXN0LCBidXQKKyAgICAgICAgICAgKiBpdHMgaW1wbGVtZW50YXRpb24gb2YgUElELXBhc3NpbmcgZG9lc24ndCB3b3JrCisgICAgICAgICAgICogb3ZlciBhIHNvY2tldHBhaXIoKSBhcyB1c2VkIGluIHRoZSBkZWJ1Zy1waXBlIHRyYW5zcG9ydC4KKyAgICAgICAgICAgKiBXZSB0ZXN0IHRoaXMgZnVuY3Rpb25hbGl0eSBpbiBhIG1vcmUgcmVhbGlzdGljIHNpdHVhdGlvbgorICAgICAgICAgICAqIGluIHRlc3QvZGJ1cy1kYWVtb24uYy4gKi8KKyAgICAgICAgICB3YXJuX3VuZXhwZWN0ZWQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsICJub3QgdGhpcyBlcnJvciIpOworCisgICAgICAgICAgZ290byBvdXQ7CisjZWxzZQorICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJkb2VzIG5vdCBzdXBwb3J0IEdldENvbm5lY3Rpb25Vbml4UHJvY2Vzc0lEIGJ1dCBwZXJoYXBzIHRoYXQncyBPSz9cbiIpOworI2VuZGlmCisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICB7CisjaWZkZWYgREJVU19XSU4KKyAgICAgIHdhcm5fdW5leHBlY3RlZCAoY29ubmVjdGlvbiwgbWVzc2FnZSwgIkdldENvbm5lY3Rpb25Vbml4UHJvY2Vzc0lEIHRvIGZhaWwgb24gV2luZG93cyIpOworICAgICAgZ290byBvdXQ7CisjZWxzZQorICAgICAgaWYgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkgPT0gREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX1JFVFVSTikKKyAgICAgICAgeworICAgICAgICAgIDsgLyogZ29vZCwgZXhwZWN0ZWQgKi8KKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgd2Fybl91bmV4cGVjdGVkIChjb25uZWN0aW9uLCBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1ldGhvZF9yZXR1cm4gZm9yIEdldENvbm5lY3Rpb25Vbml4UHJvY2Vzc0lEIik7CisKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgcmV0cnlfZ2V0X3Byb3BlcnR5OgorCisgICAgICBpZiAoIWRidXNfbWVzc2FnZV9nZXRfYXJncyAobWVzc2FnZSwgJmVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9VSU5UMzIsICZwaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGRidXNfZXJyb3JfaGFzX25hbWUgKCZlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgibm8gbWVtb3J5IHRvIGdldCBwaWQgYnkgR2V0Q29ubmVjdGlvblVuaXhQcm9jZXNzSURcbiIpOworICAgICAgICAgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICAgICAgICAgIF9kYnVzX3dhaXRfZm9yX21lbW9yeSAoKTsKKyAgICAgICAgICAgICAgZ290byByZXRyeV9nZXRfcHJvcGVydHk7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c19hc3NlcnQgKGRidXNfZXJyb3JfaXNfc2V0ICgmZXJyb3IpKTsKKyAgICAgICAgICAgICAgX2RidXNfd2FybiAoIkRpZCBub3QgZ2V0IHRoZSBleHBlY3RlZCBEQlVTX1RZUEVfVUlOVDMyIGZyb20gR2V0Q29ubmVjdGlvblVuaXhQcm9jZXNzSUQiKTsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8qIHRlc3QgaWYgcmV0dXJuZWQgcGlkIGlzIHRoZSBzYW1lIGFzIG91ciBvd24gcGlkCisgICAgICAgICAgICoKKyAgICAgICAgICAgKiBAdG9kbyBJdCB3b3VsZCBwcm9iYWJseSBiZSBnb29kIHRvIHJlc3RydWN0dXJlIHRoZSB0ZXN0cworICAgICAgICAgICAqICAgICAgIGluIGEgd2F5IHNvIG91ciBwYXJlbnQgaXMgdGhlIGJ1cyB0aGF0IHdlJ3JlIHRlc3RpbmcKKyAgICAgICAgICAgKiAgICAgICBjYXVzZSB0aGVuIHdlIGNhbiB0ZXN0IHRoYXQgdGhlIHBpZCByZXR1cm5lZCBtYXRjaGVzCisgICAgICAgICAgICogICAgICAgZ2V0cHBpZCgpCisgICAgICAgICAgICovCisgICAgICAgICAgaWYgKHBpZCAhPSAoZGJ1c191aW50MzJfdCkgX2RidXNfZ2V0cGlkICgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c19hc3NlcnQgKGRidXNfZXJyb3JfaXNfc2V0ICgmZXJyb3IpKTsKKyAgICAgICAgICAgICAgX2RidXNfd2FybiAoIlJlc3VsdCBmcm9tIEdldENvbm5lY3Rpb25Vbml4UHJvY2Vzc0lEIGlzIG5vdCBvdXIgb3duIHBpZCIpOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmIC8qICFEQlVTX1dJTiAqLworICAgIH0KKworICBpZiAoIWNoZWNrX25vX2xlZnRvdmVycyAoY29udGV4dCkpCisgICAgZ290byBvdXQ7CisKKyAgcmV0dmFsID0gVFJVRTsKKworIG91dDoKKyAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworCisgIGlmIChtZXNzYWdlKQorICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyogcmV0dXJucyBUUlVFIGlmIHRoZSBjb3JyZWN0IHRoaW5nIGhhcHBlbnMsCisgKiBidXQgdGhlIGNvcnJlY3QgdGhpbmcgbWF5IGluY2x1ZGUgT09NIGVycm9ycy4KKyAqLworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19hZGRfbWF0Y2ggKEJ1c0NvbnRleHQgICAgICpjb250ZXh0LAorICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKnJ1bGUpCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIGRidXNfdWludDMyX3Qgc2VyaWFsOworICBEQnVzRXJyb3IgZXJyb3I7CisKKyAgcmV0dmFsID0gRkFMU0U7CisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKyAgbWVzc2FnZSA9IE5VTEw7CisKKyAgX2RidXNfdmVyYm9zZSAoImNoZWNrX2FkZF9tYXRjaCBmb3IgY29ubmVjdGlvbiAlcCwgcnVsZSAlc1xuIiwKKyAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiwgcnVsZSk7CisKKyAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKERCVVNfU0VSVklDRV9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19QQVRIX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0lOVEVSRkFDRV9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFkZE1hdGNoIik7CisKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICByZXR1cm4gVFJVRTsKKworICBpZiAoIWRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAobWVzc2FnZSwgREJVU19UWVBFX1NUUklORywgJnJ1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZW5kIChjb25uZWN0aW9uLCBtZXNzYWdlLCAmc2VyaWFsKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIG1lc3NhZ2UgPSBOVUxMOworCisgIGRidXNfY29ubmVjdGlvbl9yZWYgKGNvbm5lY3Rpb24pOyAvKiBiZWNhdXNlIHdlIG1heSBnZXQgZGlzY29ubmVjdGVkICovCisKKyAgLyogc2VuZCBvdXIgbWVzc2FnZSAqLworICBidXNfdGVzdF9ydW5fY2xpZW50c19sb29wIChTRU5EX1BFTkRJTkcgKGNvbm5lY3Rpb24pKTsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9nZXRfaXNfY29ubmVjdGVkIChjb25uZWN0aW9uKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiY29ubmVjdGlvbiB3YXMgZGlzY29ubmVjdGVkXG4iKTsKKworICAgICAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChjb25uZWN0aW9uKTsKKworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGJsb2NrX2Nvbm5lY3Rpb25fdW50aWxfbWVzc2FnZV9mcm9tX2J1cyAoY29udGV4dCwgY29ubmVjdGlvbiwgInJlcGx5IHRvIEFkZE1hdGNoIik7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Nvbm5lY3RlZCAoY29ubmVjdGlvbikpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoImNvbm5lY3Rpb24gd2FzIGRpc2Nvbm5lY3RlZFxuIik7CisKKyAgICAgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoY29ubmVjdGlvbik7CisKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGNvbm5lY3Rpb24pOworCisgIG1lc3NhZ2UgPSBwb3BfbWVzc2FnZV93YWl0aW5nX2Zvcl9tZW1vcnkgKGNvbm5lY3Rpb24pOworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJEaWQgbm90IHJlY2VpdmUgYSByZXBseSB0byAlcyAlZCBvbiAlcCIsCisgICAgICAgICAgICAgICAgICAiQWRkTWF0Y2giLCBzZXJpYWwsIGNvbm5lY3Rpb24pOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIHZlcmJvc2VfbWVzc2FnZV9yZWNlaXZlZCAoY29ubmVjdGlvbiwgbWVzc2FnZSk7CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfaGFzX3NlbmRlciAobWVzc2FnZSwgREJVU19TRVJWSUNFX0RCVVMpKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJNZXNzYWdlIGhhcyB3cm9uZyBzZW5kZXIgJXMiLAorICAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9zZW5kZXIgKG1lc3NhZ2UpID8KKyAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfc2VuZGVyIChtZXNzYWdlKSA6ICIobm9uZSkiKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlKSA9PSBEQlVTX01FU1NBR0VfVFlQRV9FUlJPUikKKyAgICB7CisgICAgICBpZiAoZGJ1c19tZXNzYWdlX2lzX2Vycm9yIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9OT19NRU1PUlkpKQorICAgICAgICB7CisgICAgICAgICAgOyAvKiBnb29kLCB0aGlzIGlzIGEgdmFsaWQgcmVzcG9uc2UgKi8KKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgd2Fybl91bmV4cGVjdGVkIChjb25uZWN0aW9uLCBtZXNzYWdlLCAibm90IHRoaXMgZXJyb3IiKTsKKworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkgPT0gREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX1JFVFVSTikKKyAgICAgICAgeworICAgICAgICAgIDsgLyogZ29vZCwgZXhwZWN0ZWQgKi8KKyAgICAgICAgICBfZGJ1c19hc3NlcnQgKGRidXNfbWVzc2FnZV9nZXRfcmVwbHlfc2VyaWFsIChtZXNzYWdlKSA9PSBzZXJpYWwpOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICB3YXJuX3VuZXhwZWN0ZWQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsICJtZXRob2QgcmV0dXJuIGZvciBBZGRNYXRjaCIpOworCisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgaWYgKCFjaGVja19ub19sZWZ0b3ZlcnMgKGNvbnRleHQpKQorICAgIGdvdG8gb3V0OworCisgIHJldHZhbCA9IFRSVUU7CisKKyBvdXQ6CisgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKworICBpZiAobWVzc2FnZSkKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKKyNpZmRlZiBEQlVTX0VOQUJMRV9TVEFUUworLyogcmV0dXJucyBUUlVFIGlmIHRoZSBjb3JyZWN0IHRoaW5nIGhhcHBlbnMsCisgKiBidXQgdGhlIGNvcnJlY3QgdGhpbmcgbWF5IGluY2x1ZGUgT09NIGVycm9ycy4KKyAqLworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19nZXRfYWxsX21hdGNoX3J1bGVzIChCdXNDb250ZXh0ICAgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBEQnVzTWVzc2FnZSAqbWVzc2FnZTsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICBkYnVzX3VpbnQzMl90IHNlcmlhbDsKKyAgREJ1c0Vycm9yIGVycm9yOworCisgIHJldHZhbCA9IEZBTFNFOworICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisgIG1lc3NhZ2UgPSBOVUxMOworCisgIF9kYnVzX3ZlcmJvc2UgKCJjaGVja19nZXRfYWxsX21hdGNoX3J1bGVzIGZvciBjb25uZWN0aW9uICVwXG4iLAorICAgICAgICAgICAgICAgICBjb25uZWN0aW9uKTsKKworICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoREJVU19TRVJWSUNFX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1BBVEhfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJVU19JTlRFUkZBQ0VfU1RBVFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR2V0QWxsTWF0Y2hSdWxlcyIpOworCisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoY29ubmVjdGlvbiwgbWVzc2FnZSwgJnNlcmlhbCkpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICBtZXNzYWdlID0gTlVMTDsKKworICBkYnVzX2Nvbm5lY3Rpb25fcmVmIChjb25uZWN0aW9uKTsgLyogYmVjYXVzZSB3ZSBtYXkgZ2V0IGRpc2Nvbm5lY3RlZCAqLworCisgIC8qIHNlbmQgb3VyIG1lc3NhZ2UgKi8KKyAgYnVzX3Rlc3RfcnVuX2NsaWVudHNfbG9vcCAoU0VORF9QRU5ESU5HIChjb25uZWN0aW9uKSk7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Nvbm5lY3RlZCAoY29ubmVjdGlvbikpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoImNvbm5lY3Rpb24gd2FzIGRpc2Nvbm5lY3RlZFxuIik7CisKKyAgICAgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoY29ubmVjdGlvbik7CisKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICBibG9ja19jb25uZWN0aW9uX3VudGlsX21lc3NhZ2VfZnJvbV9idXMgKGNvbnRleHQsIGNvbm5lY3Rpb24sICJyZXBseSB0byBBZGRNYXRjaCIpOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX2dldF9pc19jb25uZWN0ZWQgKGNvbm5lY3Rpb24pKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJjb25uZWN0aW9uIHdhcyBkaXNjb25uZWN0ZWRcbiIpOworCisgICAgICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGNvbm5lY3Rpb24pOworCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChjb25uZWN0aW9uKTsKKworICBtZXNzYWdlID0gcG9wX21lc3NhZ2Vfd2FpdGluZ19mb3JfbWVtb3J5IChjb25uZWN0aW9uKTsKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiRGlkIG5vdCByZWNlaXZlIGEgcmVwbHkgdG8gJXMgJWQgb24gJXAiLAorICAgICAgICAgICAgICAgICAgIkFkZE1hdGNoIiwgc2VyaWFsLCBjb25uZWN0aW9uKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICB2ZXJib3NlX21lc3NhZ2VfcmVjZWl2ZWQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UpOworCisgIGlmICghZGJ1c19tZXNzYWdlX2hhc19zZW5kZXIgKG1lc3NhZ2UsIERCVVNfU0VSVklDRV9EQlVTKSkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiTWVzc2FnZSBoYXMgd3Jvbmcgc2VuZGVyICVzIiwKKyAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfc2VuZGVyIChtZXNzYWdlKSA/CisgICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3NlbmRlciAobWVzc2FnZSkgOiAiKG5vbmUpIik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgaWYgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkgPT0gREJVU19NRVNTQUdFX1RZUEVfRVJST1IpCisgICAgeworICAgICAgaWYgKGRidXNfbWVzc2FnZV9pc19lcnJvciAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfTk9fTUVNT1JZKSkKKyAgICAgICAgeworICAgICAgICAgIDsgLyogZ29vZCwgdGhpcyBpcyBhIHZhbGlkIHJlc3BvbnNlICovCisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHdhcm5fdW5leHBlY3RlZCAoY29ubmVjdGlvbiwgbWVzc2FnZSwgIm5vdCB0aGlzIGVycm9yIik7CisKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKG1lc3NhZ2UpID09IERCVVNfTUVTU0FHRV9UWVBFX01FVEhPRF9SRVRVUk4pCisgICAgICAgIHsKKyAgICAgICAgICA7IC8qIGdvb2QsIGV4cGVjdGVkICovCisgICAgICAgICAgX2RidXNfYXNzZXJ0IChkYnVzX21lc3NhZ2VfZ2V0X3JlcGx5X3NlcmlhbCAobWVzc2FnZSkgPT0gc2VyaWFsKTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgd2Fybl91bmV4cGVjdGVkIChjb25uZWN0aW9uLCBtZXNzYWdlLCAibWV0aG9kIHJldHVybiBmb3IgQWRkTWF0Y2giKTsKKworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgfQorCisgIGlmICghY2hlY2tfbm9fbGVmdG92ZXJzIChjb250ZXh0KSkKKyAgICBnb3RvIG91dDsKKworICByZXR2YWwgPSBUUlVFOworCisgb3V0OgorICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisKKyAgaWYgKG1lc3NhZ2UpCisgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKworICByZXR1cm4gcmV0dmFsOworfQorI2VuZGlmCisKKy8qIHJldHVybnMgVFJVRSBpZiB0aGUgY29ycmVjdCB0aGluZyBoYXBwZW5zLAorICogYnV0IHRoZSBjb3JyZWN0IHRoaW5nIG1heSBpbmNsdWRlIE9PTSBlcnJvcnMuCisgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAorY2hlY2tfaGVsbG9fY29ubmVjdGlvbiAoQnVzQ29udGV4dCAqY29udGV4dCkKK3sKKyAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisgIERCdXNFcnJvciBlcnJvcjsKKworICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisKKyAgY29ubmVjdGlvbiA9IGRidXNfY29ubmVjdGlvbl9vcGVuX3ByaXZhdGUgKFRFU1RfREVCVUdfUElQRSwgJmVycm9yKTsKKyAgaWYgKGNvbm5lY3Rpb24gPT0gTlVMTCkKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUICgmZXJyb3IpOworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGlmICghYnVzX3NldHVwX2RlYnVnX2NsaWVudCAoY29ubmVjdGlvbikpCisgICAgeworICAgICAgZGJ1c19jb25uZWN0aW9uX2Nsb3NlIChjb25uZWN0aW9uKTsKKyAgICAgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoY29ubmVjdGlvbik7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgc3Bpbl9jb25uZWN0aW9uX3VudGlsX2F1dGhlbnRpY2F0ZWQgKGNvbnRleHQsIGNvbm5lY3Rpb24pOworCisgIGlmICghY2hlY2tfaGVsbG9fbWVzc2FnZSAoY29udGV4dCwgY29ubmVjdGlvbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmIChkYnVzX2J1c19nZXRfdW5pcXVlX25hbWUgKGNvbm5lY3Rpb24pID09IE5VTEwpCisgICAgeworICAgICAgLyogV2UgZGlkbid0IHN1Y2Nlc3NmdWxseSByZWdpc3Rlciwgc28gd2UgY2FuJ3QKKyAgICAgICAqIGRvIHRoZSB1c3VhbCBraWxsX2NsaWVudF9jb25uZWN0aW9uKCkgY2hlY2tzCisgICAgICAgKi8KKyAgICAgIGtpbGxfY2xpZW50X2Nvbm5lY3Rpb25fdW5jaGVja2VkIChjb25uZWN0aW9uKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoIWNoZWNrX2FkZF9tYXRjaCAoY29udGV4dCwgY29ubmVjdGlvbiwgIiIpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIGtpbGxfY2xpZW50X2Nvbm5lY3Rpb24gKGNvbnRleHQsIGNvbm5lY3Rpb24pOworICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworI2RlZmluZSBOT05FWElTVEVOVF9TRVJWSUNFX05BTUUgInRlc3QudGhpcy5zZXJ2aWNlLmRvZXMubm90LmV4aXN0LmV3dW9pdXJqZGZ4Y3ZuIgorCisvKiByZXR1cm5zIFRSVUUgaWYgdGhlIGNvcnJlY3QgdGhpbmcgaGFwcGVucywKKyAqIGJ1dCB0aGUgY29ycmVjdCB0aGluZyBtYXkgaW5jbHVkZSBPT00gZXJyb3JzLgorICovCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX25vbmV4aXN0ZW50X3NlcnZpY2Vfbm9fYXV0b19zdGFydCAoQnVzQ29udGV4dCAgICAgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBEQnVzTWVzc2FnZSAqbWVzc2FnZTsKKyAgZGJ1c191aW50MzJfdCBzZXJpYWw7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgY29uc3QgY2hhciAqbm9uZXhpc3RlbnQgPSBOT05FWElTVEVOVF9TRVJWSUNFX05BTUU7CisgIGRidXNfdWludDMyX3QgZmxhZ3M7CisKKyAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKERCVVNfU0VSVklDRV9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19QQVRIX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0lOVEVSRkFDRV9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN0YXJ0U2VydmljZUJ5TmFtZSIpOworCisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgZGJ1c19tZXNzYWdlX3NldF9hdXRvX3N0YXJ0IChtZXNzYWdlLCBGQUxTRSk7CisKKyAgZmxhZ3MgPSAwOworICBpZiAoIWRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZub25leGlzdGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9VSU5UMzIsICZmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGlmICghZGJ1c19jb25uZWN0aW9uX3NlbmQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsICZzZXJpYWwpKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgbWVzc2FnZSA9IE5VTEw7CisKKyAgYnVzX3Rlc3RfcnVuX2V2ZXJ5dGhpbmcgKGNvbnRleHQpOworICBibG9ja19jb25uZWN0aW9uX3VudGlsX21lc3NhZ2VfZnJvbV9idXMgKGNvbnRleHQsIGNvbm5lY3Rpb24sICJyZXBseSB0byBBY3RpdmF0ZVNlcnZpY2Ugb24gbm9uZXhpc3RlbnQiKTsKKyAgYnVzX3Rlc3RfcnVuX2V2ZXJ5dGhpbmcgKGNvbnRleHQpOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX2dldF9pc19jb25uZWN0ZWQgKGNvbm5lY3Rpb24pKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJjb25uZWN0aW9uIHdhcyBkaXNjb25uZWN0ZWRcbiIpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIHJldHZhbCA9IEZBTFNFOworCisgIG1lc3NhZ2UgPSBwb3BfbWVzc2FnZV93YWl0aW5nX2Zvcl9tZW1vcnkgKGNvbm5lY3Rpb24pOworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJEaWQgbm90IHJlY2VpdmUgYSByZXBseSB0byAlcyAlZCBvbiAlcCIsCisgICAgICAgICAgICAgICAgICAiU3RhcnRTZXJ2aWNlQnlOYW1lIiwgc2VyaWFsLCBjb25uZWN0aW9uKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICB2ZXJib3NlX21lc3NhZ2VfcmVjZWl2ZWQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UpOworCisgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKG1lc3NhZ2UpID09IERCVVNfTUVTU0FHRV9UWVBFX0VSUk9SKQorICAgIHsKKyAgICAgIGlmICghZGJ1c19tZXNzYWdlX2hhc19zZW5kZXIgKG1lc3NhZ2UsIERCVVNfU0VSVklDRV9EQlVTKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJNZXNzYWdlIGhhcyB3cm9uZyBzZW5kZXIgJXMiLAorICAgICAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfc2VuZGVyIChtZXNzYWdlKSA/CisgICAgICAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9zZW5kZXIgKG1lc3NhZ2UpIDogIihub25lKSIpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgIGlmIChkYnVzX21lc3NhZ2VfaXNfZXJyb3IgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0VSUk9SX05PX01FTU9SWSkpCisgICAgICAgIHsKKyAgICAgICAgICA7IC8qIGdvb2QsIHRoaXMgaXMgYSB2YWxpZCByZXNwb25zZSAqLworICAgICAgICB9CisgICAgICBlbHNlIGlmIChkYnVzX21lc3NhZ2VfaXNfZXJyb3IgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfU0VSVklDRV9VTktOT1dOKSkKKyAgICAgICAgeworICAgICAgICAgIDsgLyogZ29vZCwgdGhpcyBpcyBleHBlY3RlZCBhbHNvICovCisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHdhcm5fdW5leHBlY3RlZCAoY29ubmVjdGlvbiwgbWVzc2FnZSwgIm5vdCB0aGlzIGVycm9yIik7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiRGlkIG5vdCBleHBlY3QgdG8gc3VjY2Vzc2Z1bGx5IGFjdGl2YXRlICVzIiwKKyAgICAgICAgICAgICAgICAgIE5PTkVYSVNURU5UX1NFUlZJQ0VfTkFNRSk7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgcmV0dmFsID0gVFJVRTsKKworIG91dDoKKyAgaWYgKG1lc3NhZ2UpCisgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCisvKiByZXR1cm5zIFRSVUUgaWYgdGhlIGNvcnJlY3QgdGhpbmcgaGFwcGVucywKKyAqIGJ1dCB0aGUgY29ycmVjdCB0aGluZyBtYXkgaW5jbHVkZSBPT00gZXJyb3JzLgorICovCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX25vbmV4aXN0ZW50X3NlcnZpY2VfYXV0b19zdGFydCAoQnVzQ29udGV4dCAgICAgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBEQnVzTWVzc2FnZSAqbWVzc2FnZTsKKyAgZGJ1c191aW50MzJfdCBzZXJpYWw7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKworICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoTk9ORVhJU1RFTlRfU0VSVklDRV9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9vcmcvZnJlZWRlc2t0b3AvVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFY2hvIik7CisKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICByZXR1cm4gVFJVRTsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZW5kIChjb25uZWN0aW9uLCBtZXNzYWdlLCAmc2VyaWFsKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIG1lc3NhZ2UgPSBOVUxMOworCisgIGJ1c190ZXN0X3J1bl9ldmVyeXRoaW5nIChjb250ZXh0KTsKKyAgYmxvY2tfY29ubmVjdGlvbl91bnRpbF9tZXNzYWdlX2Zyb21fYnVzIChjb250ZXh0LCBjb25uZWN0aW9uLCAicmVwbHkgdG8gRWNobyIpOworICBidXNfdGVzdF9ydW5fZXZlcnl0aGluZyAoY29udGV4dCk7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Nvbm5lY3RlZCAoY29ubmVjdGlvbikpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoImNvbm5lY3Rpb24gd2FzIGRpc2Nvbm5lY3RlZFxuIik7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgcmV0dmFsID0gRkFMU0U7CisKKyAgbWVzc2FnZSA9IHBvcF9tZXNzYWdlX3dhaXRpbmdfZm9yX21lbW9yeSAoY29ubmVjdGlvbik7CisKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiRGlkIG5vdCByZWNlaXZlIGEgcmVwbHkgdG8gJXMgJWQgb24gJXAiLAorICAgICAgICAgICAgICAgICAgIkVjaG8gbWVzc2FnZSAoYXV0byBhY3RpdmF0aW9uKSIsIHNlcmlhbCwgY29ubmVjdGlvbik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgdmVyYm9zZV9tZXNzYWdlX3JlY2VpdmVkIChjb25uZWN0aW9uLCBtZXNzYWdlKTsKKworICBpZiAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlKSA9PSBEQlVTX01FU1NBR0VfVFlQRV9FUlJPUikKKyAgICB7CisgICAgICBpZiAoIWRidXNfbWVzc2FnZV9oYXNfc2VuZGVyIChtZXNzYWdlLCBEQlVTX1NFUlZJQ0VfREJVUykpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgiTWVzc2FnZSBoYXMgd3Jvbmcgc2VuZGVyICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3NlbmRlciAobWVzc2FnZSkgPworICAgICAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfc2VuZGVyIChtZXNzYWdlKSA6ICIobm9uZSkiKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICBpZiAoZGJ1c19tZXNzYWdlX2lzX2Vycm9yIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9OT19NRU1PUlkpKQorICAgICAgICB7CisgICAgICAgICAgOyAvKiBnb29kLCB0aGlzIGlzIGEgdmFsaWQgcmVzcG9uc2UgKi8KKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoZGJ1c19tZXNzYWdlX2lzX2Vycm9yIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0VSUk9SX1NFUlZJQ0VfVU5LTk9XTikpCisgICAgICAgIHsKKyAgICAgICAgICA7IC8qIGdvb2QsIHRoaXMgaXMgZXhwZWN0ZWQgYWxzbyAqLworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICB3YXJuX3VuZXhwZWN0ZWQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsICJub3QgdGhpcyBlcnJvciIpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkRpZCBub3QgZXhwZWN0IHRvIHN1Y2Nlc3NmdWxseSBhY3RpdmF0ZSAlcyIsCisgICAgICAgICAgICAgICAgICBOT05FWElTVEVOVF9TRVJWSUNFX05BTUUpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIHJldHZhbCA9IFRSVUU7CisKKyBvdXQ6CisgIGlmIChtZXNzYWdlKQorICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19iYXNlX3NlcnZpY2VfYWN0aXZhdGVkIChCdXNDb250ZXh0ICAgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgKmluaXRpYWxfbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgKipiYXNlX3NlcnZpY2VfcCkKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgREJ1c0Vycm9yIGVycm9yOworICBjb25zdCBjaGFyICpiYXNlX3NlcnZpY2UsICpiYXNlX3NlcnZpY2VfZnJvbV9idXMsICpvbGRfb3duZXI7CisKKyAgcmV0dmFsID0gRkFMU0U7CisKKyAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworICBiYXNlX3NlcnZpY2UgPSBOVUxMOworICBvbGRfb3duZXIgPSBOVUxMOworICBiYXNlX3NlcnZpY2VfZnJvbV9idXMgPSBOVUxMOworCisgIG1lc3NhZ2UgPSBpbml0aWFsX21lc3NhZ2U7CisgIGRidXNfbWVzc2FnZV9yZWYgKG1lc3NhZ2UpOworCisgIGlmIChkYnVzX21lc3NhZ2VfaXNfc2lnbmFsIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19JTlRFUkZBQ0VfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOYW1lT3duZXJDaGFuZ2VkIikpCisgICAgeworICAgICAgQ2hlY2tTZXJ2aWNlT3duZXJDaGFuZ2VkRGF0YSBzb2NkOworCisgICAgcmVnZXRfc2VydmljZV9uYW1lX2FyZzoKKyAgICAgIGJhc2Vfc2VydmljZSA9IE5VTEw7CisgICAgICBvbGRfb3duZXIgPSBOVUxMOworICAgICAgYmFzZV9zZXJ2aWNlX2Zyb21fYnVzID0gTlVMTDsKKworICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MgKG1lc3NhZ2UsICZlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmYmFzZV9zZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZvbGRfb3duZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJmJhc2Vfc2VydmljZV9mcm9tX2J1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoZGJ1c19lcnJvcl9oYXNfbmFtZSAoJmVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgICAgICAgICAgX2RidXNfd2FpdF9mb3JfbWVtb3J5ICgpOworICAgICAgICAgICAgICBnb3RvIHJlZ2V0X3NlcnZpY2VfbmFtZV9hcmc7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c193YXJuICgiTWVzc2FnZSAlcyBkb2Vzbid0IGhhdmUgYSBzZXJ2aWNlIG5hbWU6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIk5hbWVPd25lckNoYW5nZWQgKGNyZWF0aW9uKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLm1lc3NhZ2UpOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICBpZiAoKmJhc2Vfc2VydmljZSAhPSAnOicpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgiRXhwZWN0ZWQgYmFzZSBzZXJ2aWNlIGFjdGl2YXRpb24sIGdvdCBcIiVzXCIgaW5zdGVhZCIsCisgICAgICAgICAgICAgICAgICAgICAgYmFzZV9zZXJ2aWNlKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICBpZiAoc3RyY21wIChiYXNlX3NlcnZpY2UsIGJhc2Vfc2VydmljZV9mcm9tX2J1cykgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJFeHBlY3RlZCBiYXNlIHNlcnZpY2UgYWN0aXZhdGlvbiwgZ290IFwiJXNcIiBpbnN0ZWFkIHdpdGggb3duZXIgXCIlc1wiIiwKKyAgICAgICAgICAgICAgICAgICAgICBiYXNlX3NlcnZpY2UsIGJhc2Vfc2VydmljZV9mcm9tX2J1cyk7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgICAgaWYgKG9sZF9vd25lclswXSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJSZWNlaXZlZCBhbiBvbGRfb3duZXIgYXJndW1lbnQgZHVyaW5nIGJhc2Ugc2VydmljZSBhY3RpdmF0aW9uLCBcIiVzXCIiLAorICAgICAgICAgICAgICAgICAgICAgIG9sZF9vd25lcik7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgICAgc29jZC5leHBlY3RlZF9raW5kID0gU0VSVklDRV9DUkVBVEVEOworICAgICAgc29jZC5leHBlY3RlZF9zZXJ2aWNlX25hbWUgPSBiYXNlX3NlcnZpY2U7CisgICAgICBzb2NkLmZhaWxlZCA9IEZBTFNFOworICAgICAgc29jZC5za2lwX2Nvbm5lY3Rpb24gPSBjb25uZWN0aW9uOworICAgICAgc29jZC5jb250ZXh0ID0gY29udGV4dDsKKworICAgICAgYnVzX3Rlc3RfY2xpZW50c19mb3JlYWNoIChjaGVja19zZXJ2aWNlX293bmVyX2NoYW5nZWRfZm9yZWFjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNvY2QpOworCisgICAgICBpZiAoc29jZC5mYWlsZWQpCisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHdhcm5fdW5leHBlY3RlZCAoY29ubmVjdGlvbiwgbWVzc2FnZSwgIk5hbWVPd25lckNoYW5nZWQgKGNyZWF0aW9uKSBmb3IgYmFzZSBzZXJ2aWNlIik7CisKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAoYmFzZV9zZXJ2aWNlX3ApCisgICAgKmJhc2Vfc2VydmljZV9wID0gYmFzZV9zZXJ2aWNlOworCisgIHJldHZhbCA9IFRSVUU7CisKKyBvdXQ6CisgIGlmIChtZXNzYWdlKQorICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX3NlcnZpY2VfYWN0aXZhdGVkIChCdXNDb250ZXh0ICAgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqYWN0aXZhdGVkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKmJhc2Vfc2VydmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICppbml0aWFsX21lc3NhZ2UpCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIERCdXNFcnJvciBlcnJvcjsKKyAgZGJ1c191aW50MzJfdCBhY3RpdmF0aW9uX3Jlc3VsdDsKKworICByZXR2YWwgPSBGQUxTRTsKKworICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisKKyAgbWVzc2FnZSA9IGluaXRpYWxfbWVzc2FnZTsKKyAgZGJ1c19tZXNzYWdlX3JlZiAobWVzc2FnZSk7CisKKyAgaWYgKGRidXNfbWVzc2FnZV9pc19zaWduYWwgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0lOVEVSRkFDRV9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5hbWVPd25lckNoYW5nZWQiKSkKKyAgICB7CisgICAgICBDaGVja1NlcnZpY2VPd25lckNoYW5nZWREYXRhIHNvY2Q7CisgICAgICBjb25zdCBjaGFyICpzZXJ2aWNlX25hbWUsICpiYXNlX3NlcnZpY2VfZnJvbV9idXMsICpvbGRfb3duZXI7CisKKyAgICByZWdldF9zZXJ2aWNlX25hbWVfYXJnOgorICAgICAgc2VydmljZV9uYW1lID0gTlVMTDsKKyAgICAgIG9sZF9vd25lciA9IE5VTEw7CisgICAgICBiYXNlX3NlcnZpY2VfZnJvbV9idXMgPSBOVUxMOworCisgICAgICBpZiAoIWRidXNfbWVzc2FnZV9nZXRfYXJncyAobWVzc2FnZSwgJmVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZzZXJ2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZvbGRfb3duZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJmJhc2Vfc2VydmljZV9mcm9tX2J1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoZGJ1c19lcnJvcl9oYXNfbmFtZSAoJmVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgICAgICAgICAgX2RidXNfd2FpdF9mb3JfbWVtb3J5ICgpOworICAgICAgICAgICAgICBnb3RvIHJlZ2V0X3NlcnZpY2VfbmFtZV9hcmc7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c193YXJuICgiTWVzc2FnZSAlcyBkb2Vzbid0IGhhdmUgYSBzZXJ2aWNlIG5hbWU6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIk5hbWVPd25lckNoYW5nZWQgKGNyZWF0aW9uKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLm1lc3NhZ2UpOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICBpZiAoc3RyY21wIChzZXJ2aWNlX25hbWUsIGFjdGl2YXRlZF9uYW1lKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoIkV4cGVjdGVkIHRvIHNlZSBzZXJ2aWNlICVzIGNyZWF0ZWQsIHNhdyAlcyBpbnN0ZWFkIiwKKyAgICAgICAgICAgICAgICAgICAgICBhY3RpdmF0ZWRfbmFtZSwgc2VydmljZV9uYW1lKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICBpZiAoc3RyY21wIChiYXNlX3NlcnZpY2VfbmFtZSwgYmFzZV9zZXJ2aWNlX2Zyb21fYnVzKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoIk5hbWVPd25lckNoYW5nZWQgcmVwb3J0cyB3cm9uZyBiYXNlIHNlcnZpY2U6ICVzIG93bmVyLCBleHBlY3RlZCAlcyBpbnN0ZWFkIiwKKyAgICAgICAgICAgICAgICAgICAgICBiYXNlX3NlcnZpY2VfZnJvbV9idXMsIGJhc2Vfc2VydmljZV9uYW1lKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICBpZiAob2xkX293bmVyWzBdKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoImV4cGVjdGVkIGEgJXMsIGdvdCBhICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAiTmFtZU93bmVyQ2hhbmdlZCAoY3JlYXRpb24pIiwKKyAgICAgICAgICAgICAgICAgICAgICAiTmFtZU93bmVyQ2hhbmdlZCAoY2hhbmdlKSIpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgIHNvY2QuZXhwZWN0ZWRfa2luZCA9IFNFUlZJQ0VfQ1JFQVRFRDsKKyAgICAgIHNvY2Quc2tpcF9jb25uZWN0aW9uID0gY29ubmVjdGlvbjsKKyAgICAgIHNvY2QuZmFpbGVkID0gRkFMU0U7CisgICAgICBzb2NkLmV4cGVjdGVkX3NlcnZpY2VfbmFtZSA9IHNlcnZpY2VfbmFtZTsKKyAgICAgIHNvY2QuY29udGV4dCA9IGNvbnRleHQ7CisKKyAgICAgIGJ1c190ZXN0X2NsaWVudHNfZm9yZWFjaCAoY2hlY2tfc2VydmljZV9vd25lcl9jaGFuZ2VkX2ZvcmVhY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzb2NkKTsKKworICAgICAgaWYgKHNvY2QuZmFpbGVkKQorICAgICAgICBnb3RvIG91dDsKKworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIHNlcnZpY2VfbmFtZSA9IE5VTEw7CisgICAgICBvbGRfb3duZXIgPSBOVUxMOworICAgICAgYmFzZV9zZXJ2aWNlX2Zyb21fYnVzID0gTlVMTDsKKworICAgICAgbWVzc2FnZSA9IHBvcF9tZXNzYWdlX3dhaXRpbmdfZm9yX21lbW9yeSAoY29ubmVjdGlvbik7CisgICAgICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoIkV4cGVjdGVkIGEgcmVwbHkgdG8gJXMsIGdvdCBub3RoaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAiU3RhcnRTZXJ2aWNlQnlOYW1lIik7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICB3YXJuX3VuZXhwZWN0ZWQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsICJOYW1lT3duZXJDaGFuZ2VkIGZvciB0aGUgYWN0aXZhdGVkIG5hbWUiKTsKKworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKG1lc3NhZ2UpICE9IERCVVNfTUVTU0FHRV9UWVBFX01FVEhPRF9SRVRVUk4pCisgICAgeworICAgICAgd2Fybl91bmV4cGVjdGVkIChjb25uZWN0aW9uLCBtZXNzYWdlLCAicmVwbHkgdG8gU3RhcnRTZXJ2aWNlQnlOYW1lIik7CisKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBhY3RpdmF0aW9uX3Jlc3VsdCA9IDA7CisgIGlmICghZGJ1c19tZXNzYWdlX2dldF9hcmdzIChtZXNzYWdlLCAmZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfVUlOVDMyLCAmYWN0aXZhdGlvbl9yZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgeworICAgICAgaWYgKCFkYnVzX2Vycm9yX2hhc19uYW1lICgmZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJEaWQgbm90IGhhdmUgYWN0aXZhdGlvbiByZXN1bHQgZmlyc3QgYXJndW1lbnQgdG8gJXM6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAiU3RhcnRTZXJ2aWNlQnlOYW1lIiwgZXJyb3IubWVzc2FnZSk7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmIChhY3RpdmF0aW9uX3Jlc3VsdCA9PSBEQlVTX1NUQVJUX1JFUExZX1NVQ0NFU1MpCisgICAgICAgIDsgLyogR29vZCAqLworICAgICAgZWxzZSBpZiAoYWN0aXZhdGlvbl9yZXN1bHQgPT0gREJVU19TVEFSVF9SRVBMWV9BTFJFQURZX1JVTk5JTkcpCisgICAgICAgIDsgLyogR29vZCBhbHNvICovCisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgiQWN0aXZhdGlvbiByZXN1bHQgd2FzICV1LCBubyBnb29kLiIsCisgICAgICAgICAgICAgICAgICAgICAgYWN0aXZhdGlvbl9yZXN1bHQpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgfQorCisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIG1lc3NhZ2UgPSBOVUxMOworCisgIGlmICghY2hlY2tfbm9fbGVmdG92ZXJzIChjb250ZXh0KSkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiTWVzc2FnZXMgd2VyZSBsZWZ0IG92ZXIgYWZ0ZXIgdmVyaWZ5aW5nIGV4aXN0ZW50IGFjdGl2YXRpb24gcmVzdWx0cyIpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIHJldHZhbCA9IFRSVUU7CisKKyBvdXQ6CisgIGlmIChtZXNzYWdlKQorICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX3NlcnZpY2VfYXV0b19hY3RpdmF0ZWQgKEJ1c0NvbnRleHQgICAgICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqYWN0aXZhdGVkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqYmFzZV9zZXJ2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAqaW5pdGlhbF9tZXNzYWdlKQoreworICBEQnVzTWVzc2FnZSAqbWVzc2FnZTsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICBEQnVzRXJyb3IgZXJyb3I7CisKKyAgcmV0dmFsID0gRkFMU0U7CisKKyAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworCisgIG1lc3NhZ2UgPSBpbml0aWFsX21lc3NhZ2U7CisgIGRidXNfbWVzc2FnZV9yZWYgKG1lc3NhZ2UpOworCisgIGlmIChkYnVzX21lc3NhZ2VfaXNfc2lnbmFsIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19JTlRFUkZBQ0VfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOYW1lT3duZXJDaGFuZ2VkIikpCisgICAgeworICAgICAgY29uc3QgY2hhciAqc2VydmljZV9uYW1lOworICAgICAgQ2hlY2tTZXJ2aWNlT3duZXJDaGFuZ2VkRGF0YSBzb2NkOworCisgICAgcmVnZXRfc2VydmljZV9uYW1lX2FyZzoKKyAgICAgIGlmICghZGJ1c19tZXNzYWdlX2dldF9hcmdzIChtZXNzYWdlLCAmZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJnNlcnZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoZGJ1c19lcnJvcl9oYXNfbmFtZSAoJmVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgICAgICAgICAgX2RidXNfd2FpdF9mb3JfbWVtb3J5ICgpOworICAgICAgICAgICAgICBnb3RvIHJlZ2V0X3NlcnZpY2VfbmFtZV9hcmc7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c193YXJuICgiTWVzc2FnZSAlcyBkb2Vzbid0IGhhdmUgYSBzZXJ2aWNlIG5hbWU6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIk5hbWVPd25lckNoYW5nZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvci5tZXNzYWdlKTsKKyAgICAgICAgICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICBpZiAoc3RyY21wIChzZXJ2aWNlX25hbWUsIGFjdGl2YXRlZF9uYW1lKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoIkV4cGVjdGVkIHRvIHNlZSBzZXJ2aWNlICVzIGNyZWF0ZWQsIHNhdyAlcyBpbnN0ZWFkIiwKKyAgICAgICAgICAgICAgICAgICAgICBhY3RpdmF0ZWRfbmFtZSwgc2VydmljZV9uYW1lKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICBzb2NkLmV4cGVjdGVkX2tpbmQgPSBTRVJWSUNFX0NSRUFURUQ7CisgICAgICBzb2NkLmV4cGVjdGVkX3NlcnZpY2VfbmFtZSA9IHNlcnZpY2VfbmFtZTsKKyAgICAgIHNvY2QuZmFpbGVkID0gRkFMU0U7CisgICAgICBzb2NkLnNraXBfY29ubmVjdGlvbiA9IGNvbm5lY3Rpb247CisgICAgICBzb2NkLmNvbnRleHQgPSBjb250ZXh0OworCisgICAgICBidXNfdGVzdF9jbGllbnRzX2ZvcmVhY2ggKGNoZWNrX3NlcnZpY2Vfb3duZXJfY2hhbmdlZF9mb3JlYWNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc29jZCk7CisKKyAgICAgIGlmIChzb2NkLmZhaWxlZCkKKyAgICAgICAgZ290byBvdXQ7CisKKyAgICAgIC8qIE5vdGUgdGhhdCB0aGlzIGRpZmZlcnMgZnJvbSByZWd1bGFyIGFjdGl2YXRpb24gaW4gdGhhdCB3ZSBkb24ndCBnZXQgYQorICAgICAgICogcmVwbHkgdG8gQWN0aXZhdGVTZXJ2aWNlIGhlcmUuCisgICAgICAgKi8KKworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIG1lc3NhZ2UgPSBOVUxMOworICAgICAgc2VydmljZV9uYW1lID0gTlVMTDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICB3YXJuX3VuZXhwZWN0ZWQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsICJOYW1lT3duZXJDaGFuZ2VkIGZvciB0aGUgYWN0aXZhdGVkIG5hbWUiKTsKKworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIHJldHZhbCA9IFRSVUU7CisKKyBvdXQ6CisgIGlmIChtZXNzYWdlKQorICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19zZXJ2aWNlX2RlYWN0aXZhdGVkIChCdXNDb250ZXh0ICAgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKmFjdGl2YXRlZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKmJhc2Vfc2VydmljZSkKK3sKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICBDaGVja1NlcnZpY2VPd25lckNoYW5nZWREYXRhIHNvY2Q7CisKKyAgcmV0dmFsID0gRkFMU0U7CisKKyAgLyogTm93IHdlIGFyZSBleHBlY3RpbmcgU2VydmljZU93bmVyQ2hhbmdlZCAoZGVsZXRpb24pIG1lc3NhZ2VzIGZvciB0aGUgYmFzZQorICAgKiBzZXJ2aWNlIGFuZCB0aGUgYWN0aXZhdGVkX25hbWUuICBUaGUgYmFzZSBzZXJ2aWNlCisgICAqIG5vdGlmaWNhdGlvbiBpcyByZXF1aXJlZCB0byBjb21lIGxhc3QuCisgICAqLworICBzb2NkLmV4cGVjdGVkX2tpbmQgPSBTRVJWSUNFX0RFTEVURUQ7CisgIHNvY2QuZXhwZWN0ZWRfc2VydmljZV9uYW1lID0gYWN0aXZhdGVkX25hbWU7CisgIHNvY2QuZmFpbGVkID0gRkFMU0U7CisgIHNvY2Quc2tpcF9jb25uZWN0aW9uID0gTlVMTDsKKyAgc29jZC5jb250ZXh0ID0gY29udGV4dDsKKworICBidXNfdGVzdF9jbGllbnRzX2ZvcmVhY2ggKGNoZWNrX3NlcnZpY2Vfb3duZXJfY2hhbmdlZF9mb3JlYWNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzb2NkKTsKKworICBpZiAoc29jZC5mYWlsZWQpCisgICAgZ290byBvdXQ7CisKKyAgc29jZC5leHBlY3RlZF9raW5kID0gU0VSVklDRV9ERUxFVEVEOworICBzb2NkLmV4cGVjdGVkX3NlcnZpY2VfbmFtZSA9IGJhc2Vfc2VydmljZTsKKyAgc29jZC5mYWlsZWQgPSBGQUxTRTsKKyAgc29jZC5za2lwX2Nvbm5lY3Rpb24gPSBOVUxMOworICBzb2NkLmNvbnRleHQgPSBjb250ZXh0OworCisgIGJ1c190ZXN0X2NsaWVudHNfZm9yZWFjaCAoY2hlY2tfc2VydmljZV9vd25lcl9jaGFuZ2VkX2ZvcmVhY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNvY2QpOworCisgIGlmIChzb2NkLmZhaWxlZCkKKyAgICBnb3RvIG91dDsKKworICByZXR2YWwgPSBUUlVFOworCisgb3V0OgorICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX3NlbmRfZXhpdF90b19zZXJ2aWNlIChCdXNDb250ZXh0ICAgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqc2VydmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpiYXNlX3NlcnZpY2UpCit7CisgIGRidXNfYm9vbF90IGdvdF9lcnJvcjsKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisgIGRidXNfdWludDMyX3Qgc2VyaWFsOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisKKyAgX2RidXNfdmVyYm9zZSAoIlNlbmRpbmcgZXhpdCBtZXNzYWdlIHRvIHRoZSB0ZXN0IHNlcnZpY2VcbiIpOworCisgIHJldHZhbCA9IEZBTFNFOworCisgIC8qIEtpbGwgb2ZmIHRoZSB0ZXN0IHNlcnZpY2UgYnkgc2VuZGluZyBpdCBhIHF1aXQgbWVzc2FnZSAqLworICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoc2VydmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9vcmcvZnJlZWRlc2t0b3AvVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeGl0Iik7CisKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBEbyB0aGlzIGFnYWluOyB3ZSBzdGlsbCBuZWVkIHRoZSBzZXJ2aWNlIHRvIGV4aXQuLi4gKi8KKyAgICAgIGlmICghY2hlY2tfc2VuZF9leGl0X3RvX3NlcnZpY2UgKGNvbnRleHQsIGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlX25hbWUsIGJhc2Vfc2VydmljZSkpCisgICAgICAgIGdvdG8gb3V0OworCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoY29ubmVjdGlvbiwgbWVzc2FnZSwgJnNlcmlhbCkpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKworICAgICAgLyogRG8gdGhpcyBhZ2Fpbjsgd2Ugc3RpbGwgbmVlZCB0aGUgc2VydmljZSB0byBleGl0Li4uICovCisgICAgICBpZiAoIWNoZWNrX3NlbmRfZXhpdF90b19zZXJ2aWNlIChjb250ZXh0LCBjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZV9uYW1lLCBiYXNlX3NlcnZpY2UpKQorICAgICAgICBnb3RvIG91dDsKKworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIG1lc3NhZ2UgPSBOVUxMOworCisgIC8qIHNlbmQgbWVzc2FnZSAqLworICBidXNfdGVzdF9ydW5fY2xpZW50c19sb29wIChTRU5EX1BFTkRJTkcgKGNvbm5lY3Rpb24pKTsKKworICAvKiByZWFkIGl0IGluIGFuZCB3cml0ZSBpdCBvdXQgdG8gdGVzdCBzZXJ2aWNlICovCisgIGJ1c190ZXN0X3J1bl9idXNfbG9vcCAoY29udGV4dCwgRkFMU0UpOworCisgIC8qIHNlZSBpZiB3ZSBnb3QgYW4gZXJyb3IgZHVyaW5nIG1lc3NhZ2UgYnVzIGRpc3BhdGNoaW5nICovCisgIGJ1c190ZXN0X3J1bl9jbGllbnRzX2xvb3AgKEZBTFNFKTsKKyAgbWVzc2FnZSA9IGJvcnJvd19tZXNzYWdlX3dhaXRpbmdfZm9yX21lbW9yeSAoY29ubmVjdGlvbik7CisgIGdvdF9lcnJvciA9IG1lc3NhZ2UgIT0gTlVMTCAmJiBkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKG1lc3NhZ2UpID09IERCVVNfTUVTU0FHRV9UWVBFX0VSUk9SOworICBpZiAobWVzc2FnZSkKKyAgICB7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fcmV0dXJuX21lc3NhZ2UgKGNvbm5lY3Rpb24sIG1lc3NhZ2UpOworICAgICAgbWVzc2FnZSA9IE5VTEw7CisgICAgfQorCisgIGlmICghZ290X2Vycm9yKQorICAgIHsKKyAgICAgIC8qIElmIG5vIGVycm9yLCB3YWl0IGZvciB0aGUgdGVzdCBzZXJ2aWNlIHRvIGV4aXQgKi8KKyAgICAgIGJsb2NrX2Nvbm5lY3Rpb25fdW50aWxfbWVzc2FnZV9mcm9tX2J1cyAoY29udGV4dCwgY29ubmVjdGlvbiwgInRlc3Qgc2VydmljZSB0byBleGl0Iik7CisKKyAgICAgIGJ1c190ZXN0X3J1bl9ldmVyeXRoaW5nIChjb250ZXh0KTsKKyAgICB9CisKKyAgaWYgKGdvdF9lcnJvcikKKyAgICB7CisgICAgICBtZXNzYWdlID0gcG9wX21lc3NhZ2Vfd2FpdGluZ19mb3JfbWVtb3J5IChjb25uZWN0aW9uKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAobWVzc2FnZSAhPSBOVUxMKTsKKworICAgICAgaWYgKGRidXNfbWVzc2FnZV9nZXRfcmVwbHlfc2VyaWFsIChtZXNzYWdlKSAhPSBzZXJpYWwpCisgICAgICAgIHsKKyAgICAgICAgICB3YXJuX3VuZXhwZWN0ZWQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXJyb3Igd2l0aCB0aGUgY29ycmVjdCByZXBseSBzZXJpYWwiKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICBpZiAoIWRidXNfbWVzc2FnZV9pc19lcnJvciAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0VSUk9SX05PX01FTU9SWSkpCisgICAgICAgIHsKKyAgICAgICAgICB3YXJuX3VuZXhwZWN0ZWQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiYSBubyBtZW1vcnkgZXJyb3IgZnJvbSBhc2tpbmcgdGVzdCBzZXJ2aWNlIHRvIGV4aXQiKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICBfZGJ1c192ZXJib3NlICgiR290IGVycm9yICVzIHdoZW4gYXNraW5nIHRlc3Qgc2VydmljZSB0byBleGl0XG4iLAorICAgICAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9lcnJvcl9uYW1lIChtZXNzYWdlKSk7CisKKyAgICAgIC8qIERvIHRoaXMgYWdhaW47IHdlIHN0aWxsIG5lZWQgdGhlIHNlcnZpY2UgdG8gZXhpdC4uLiAqLworICAgICAgaWYgKCFjaGVja19zZW5kX2V4aXRfdG9fc2VydmljZSAoY29udGV4dCwgY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfbmFtZSwgYmFzZV9zZXJ2aWNlKSkKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKCFjaGVja19zZXJ2aWNlX2RlYWN0aXZhdGVkIChjb250ZXh0LCBjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlX25hbWUsIGJhc2Vfc2VydmljZSkpCisgICAgICAgIGdvdG8gb3V0OworCisgICAgICAvKiBTaG91bGQgbm93IGhhdmUgYSBOb1JlcGx5IGVycm9yIGZyb20gdGhlIEV4aXQoKSBtZXRob2QKKyAgICAgICAqIGNhbGw7IGl0IHNob3VsZCBoYXZlIGNvbWUgYWZ0ZXIgYWxsIHRoZSBkZWFjdGl2YXRpb24KKyAgICAgICAqIHN0dWZmLgorICAgICAgICovCisgICAgICBtZXNzYWdlID0gcG9wX21lc3NhZ2Vfd2FpdGluZ19mb3JfbWVtb3J5IChjb25uZWN0aW9uKTsKKworICAgICAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIHdhcm5fdW5leHBlY3RlZCAoY29ubmVjdGlvbiwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXBseSB0byBFeGl0KCkgbWV0aG9kIGNhbGwiKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfaXNfZXJyb3IgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9OT19SRVBMWSkpCisgICAgICAgIHsKKyAgICAgICAgICB3YXJuX3VuZXhwZWN0ZWQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm9SZXBseSBlcnJvciBmcm9tIEV4aXQoKSBtZXRob2QgY2FsbCIpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X3JlcGx5X3NlcmlhbCAobWVzc2FnZSkgIT0gc2VyaWFsKQorICAgICAgICB7CisgICAgICAgICAgd2Fybl91bmV4cGVjdGVkIChjb25uZWN0aW9uLCBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgImVycm9yIHdpdGggdGhlIGNvcnJlY3QgcmVwbHkgc2VyaWFsIik7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgICAgX2RidXNfdmVyYm9zZSAoIkdvdCBlcnJvciAlcyBhZnRlciB0ZXN0IHNlcnZpY2UgZXhpdGVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9lcnJvcl9uYW1lIChtZXNzYWdlKSk7CisKKyAgICAgIGlmICghY2hlY2tfbm9fbGVmdG92ZXJzIChjb250ZXh0KSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJNZXNzYWdlcyB3ZXJlIGxlZnQgb3ZlciBhZnRlciAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgX0RCVVNfRlVOQ1RJT05fTkFNRSk7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgcmV0dmFsID0gVFJVRTsKKworIG91dDoKKyAgaWYgKG1lc3NhZ2UpCisgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX2dvdF9lcnJvciAoQnVzQ29udGV4dCAgICAgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqZmlyc3RfZXJyb3JfbmFtZSwKKyAgICAgICAgICAgICAgICAgLi4uKQoreworICBEQnVzTWVzc2FnZSAqbWVzc2FnZTsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICB2YV9saXN0IGFwOworICBkYnVzX2Jvb2xfdCBlcnJvcl9mb3VuZDsKKyAgY29uc3QgY2hhciAqZXJyb3JfbmFtZTsKKworICByZXR2YWwgPSBGQUxTRTsKKworICBtZXNzYWdlID0gcG9wX21lc3NhZ2Vfd2FpdGluZ19mb3JfbWVtb3J5IChjb25uZWN0aW9uKTsKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiRGlkIG5vdCBnZXQgYW4gZXhwZWN0ZWQgZXJyb3IiKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlKSAhPSBEQlVTX01FU1NBR0VfVFlQRV9FUlJPUikKKyAgICB7CisgICAgICB3YXJuX3VuZXhwZWN0ZWQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsICJhbiBlcnJvciIpOworCisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgZXJyb3JfZm91bmQgPSBGQUxTRTsKKworICB2YV9zdGFydCAoYXAsIGZpcnN0X2Vycm9yX25hbWUpOworICBlcnJvcl9uYW1lID0gZmlyc3RfZXJyb3JfbmFtZTsKKyAgd2hpbGUgKGVycm9yX25hbWUgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoZGJ1c19tZXNzYWdlX2lzX2Vycm9yIChtZXNzYWdlLCBlcnJvcl9uYW1lKSkKKyAgICAgICAgeworICAgICAgICAgIGVycm9yX2ZvdW5kID0gVFJVRTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgZXJyb3JfbmFtZSA9IHZhX2FyZyAoYXAsIGNoYXIqKTsKKyAgICB9CisgIHZhX2VuZCAoYXApOworCisgIGlmICghZXJyb3JfZm91bmQpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkV4cGVjdGVkIGVycm9yICVzIG9yIG90aGVyLCBnb3QgJXMgaW5zdGVhZCIsCisgICAgICAgICAgICAgICAgICBmaXJzdF9lcnJvcl9uYW1lLAorICAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9lcnJvcl9uYW1lIChtZXNzYWdlKSk7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgcmV0dmFsID0gVFJVRTsKKworIG91dDoKKyAgaWYgKG1lc3NhZ2UpCisgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCit0eXBlZGVmIGVudW0KK3sKKyAgR09UX1NFUlZJQ0VfQ1JFQVRFRCwKKyAgR09UX1NFUlZJQ0VfREVMRVRFRCwKKyAgR09UX0VSUk9SLAorICBHT1RfU09NRVRISU5HX0VMU0UKK30gR290U2VydmljZUluZm87CisKK3N0YXRpYyBHb3RTZXJ2aWNlSW5mbworY2hlY2tfZ290X3NlcnZpY2VfaW5mbyAoREJ1c01lc3NhZ2UgKm1lc3NhZ2UpCit7CisgIEdvdFNlcnZpY2VJbmZvIG1lc3NhZ2Vfa2luZDsKKworICBpZiAoZGJ1c19tZXNzYWdlX2lzX3NpZ25hbCAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSU5URVJGQUNFX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTmFtZU93bmVyQ2hhbmdlZCIpKQorICAgIHsKKyAgICAgIERCdXNFcnJvciBlcnJvcjsKKyAgICAgIGNvbnN0IGNoYXIgKnNlcnZpY2VfbmFtZSwgKm9sZF9vd25lciwgKm5ld19vd25lcjsKKyAgICAgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKworICAgIHJlZ2V0X3NlcnZpY2VfaW5mb19kYXRhOgorICAgICAgc2VydmljZV9uYW1lID0gTlVMTDsKKyAgICAgIG9sZF9vd25lciA9IE5VTEw7CisgICAgICBuZXdfb3duZXIgPSBOVUxMOworCisgICAgICBkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MgKG1lc3NhZ2UsICZlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJnNlcnZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJm9sZF9vd25lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJm5ld19vd25lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpOworICAgICAgaWYgKGRidXNfZXJyb3JfaXNfc2V0ICgmZXJyb3IpKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGRidXNfZXJyb3JfaGFzX25hbWUgKCZlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICAgICAgICAgIGdvdG8gcmVnZXRfc2VydmljZV9pbmZvX2RhdGE7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c193YXJuICgidW5leHBlY3RlZCBhcmd1bWVudHMgZm9yIE5hbWVPd25lckNoYW5nZWQgbWVzc2FnZSIpOworICAgICAgICAgICAgICBtZXNzYWdlX2tpbmQgPSBHT1RfU09NRVRISU5HX0VMU0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKCFvbGRfb3duZXJbMF0pCisgICAgICAgIG1lc3NhZ2Vfa2luZCA9IEdPVF9TRVJWSUNFX0NSRUFURUQ7CisgICAgICBlbHNlIGlmICghbmV3X293bmVyWzBdKQorICAgICAgICBtZXNzYWdlX2tpbmQgPSBHT1RfU0VSVklDRV9ERUxFVEVEOworICAgICAgZWxzZQorICAgICAgICBtZXNzYWdlX2tpbmQgPSBHT1RfU09NRVRISU5HX0VMU0U7CisKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICB9CisgIGVsc2UgaWYgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkgPT0gREJVU19NRVNTQUdFX1RZUEVfRVJST1IpCisgICAgbWVzc2FnZV9raW5kID0gR09UX0VSUk9SOworICBlbHNlCisgICAgbWVzc2FnZV9raW5kID0gR09UX1NPTUVUSElOR19FTFNFOworCisgIHJldHVybiBtZXNzYWdlX2tpbmQ7Cit9CisKKyNkZWZpbmUgRVhJU1RFTlRfU0VSVklDRV9OQU1FICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVFY2hvU2VydmljZSIKKworLyogcmV0dXJucyBUUlVFIGlmIHRoZSBjb3JyZWN0IHRoaW5nIGhhcHBlbnMsCisgKiBidXQgdGhlIGNvcnJlY3QgdGhpbmcgbWF5IGluY2x1ZGUgT09NIGVycm9ycy4KKyAqLworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19leGlzdGVudF9zZXJ2aWNlX25vX2F1dG9fc3RhcnQgKEJ1c0NvbnRleHQgICAgICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisgIERCdXNNZXNzYWdlICpiYXNlX3NlcnZpY2VfbWVzc2FnZTsKKyAgY29uc3QgY2hhciAqYmFzZV9zZXJ2aWNlOworICBkYnVzX3VpbnQzMl90IHNlcmlhbDsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICBjb25zdCBjaGFyICpleGlzdGVudCA9IEVYSVNURU5UX1NFUlZJQ0VfTkFNRTsKKyAgZGJ1c191aW50MzJfdCBmbGFnczsKKworICBiYXNlX3NlcnZpY2VfbWVzc2FnZSA9IE5VTEw7CisKKyAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKERCVVNfU0VSVklDRV9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19QQVRIX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0lOVEVSRkFDRV9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN0YXJ0U2VydmljZUJ5TmFtZSIpOworCisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgZGJ1c19tZXNzYWdlX3NldF9hdXRvX3N0YXJ0IChtZXNzYWdlLCBGQUxTRSk7CisKKyAgZmxhZ3MgPSAwOworICBpZiAoIWRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZleGlzdGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9VSU5UMzIsICZmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGlmICghZGJ1c19jb25uZWN0aW9uX3NlbmQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsICZzZXJpYWwpKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgbWVzc2FnZSA9IE5VTEw7CisKKyAgYnVzX3Rlc3RfcnVuX2V2ZXJ5dGhpbmcgKGNvbnRleHQpOworCisgIC8qIG5vdyB3YWl0IGZvciB0aGUgbWVzc2FnZSBidXMgdG8gaGVhciBiYWNrIGZyb20gdGhlIGFjdGl2YXRlZAorICAgKiBzZXJ2aWNlLgorICAgKi8KKyAgYmxvY2tfY29ubmVjdGlvbl91bnRpbF9tZXNzYWdlX2Zyb21fYnVzIChjb250ZXh0LCBjb25uZWN0aW9uLCAiYWN0aXZhdGVkIHNlcnZpY2UgdG8gY29ubmVjdCIpOworCisgIGJ1c190ZXN0X3J1bl9ldmVyeXRoaW5nIChjb250ZXh0KTsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9nZXRfaXNfY29ubmVjdGVkIChjb25uZWN0aW9uKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiY29ubmVjdGlvbiB3YXMgZGlzY29ubmVjdGVkXG4iKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICByZXR2YWwgPSBGQUxTRTsKKworICBtZXNzYWdlID0gcG9wX21lc3NhZ2Vfd2FpdGluZ19mb3JfbWVtb3J5IChjb25uZWN0aW9uKTsKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiRGlkIG5vdCByZWNlaXZlIGFueSBtZXNzYWdlcyBhZnRlciAlcyAlZCBvbiAlcCIsCisgICAgICAgICAgICAgICAgICAiU3RhcnRTZXJ2aWNlQnlOYW1lIiwgc2VyaWFsLCBjb25uZWN0aW9uKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICB2ZXJib3NlX21lc3NhZ2VfcmVjZWl2ZWQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UpOworICBfZGJ1c192ZXJib3NlICgiICAoYWZ0ZXIgc2VuZGluZyAlcylcbiIsICJTdGFydFNlcnZpY2VCeU5hbWUiKTsKKworICBpZiAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlKSA9PSBEQlVTX01FU1NBR0VfVFlQRV9FUlJPUikKKyAgICB7CisgICAgICBpZiAoIWRidXNfbWVzc2FnZV9oYXNfc2VuZGVyIChtZXNzYWdlLCBEQlVTX1NFUlZJQ0VfREJVUykpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgiTWVzc2FnZSBoYXMgd3Jvbmcgc2VuZGVyICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3NlbmRlciAobWVzc2FnZSkgPworICAgICAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfc2VuZGVyIChtZXNzYWdlKSA6ICIobm9uZSkiKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICBpZiAoZGJ1c19tZXNzYWdlX2lzX2Vycm9yIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9OT19NRU1PUlkpKQorICAgICAgICB7CisgICAgICAgICAgOyAvKiBnb29kLCB0aGlzIGlzIGEgdmFsaWQgcmVzcG9uc2UgKi8KKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoZGJ1c19tZXNzYWdlX2lzX2Vycm9yIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0VSUk9SX1NQQVdOX0NISUxEX0VYSVRFRCkgfHwKKyAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9pc19lcnJvciAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9TUEFXTl9DSElMRF9TSUdOQUxFRCkgfHwKKyAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9pc19lcnJvciAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9TUEFXTl9FWEVDX0ZBSUxFRCkpCisgICAgICAgIHsKKyAgICAgICAgICA7IC8qIGdvb2QsIHRoaXMgaXMgZXhwZWN0ZWQgYWxzbyAqLworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgiRGlkIG5vdCBleHBlY3QgZXJyb3IgJXMiLAorICAgICAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfZXJyb3JfbmFtZSAobWVzc2FnZSkpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgR290U2VydmljZUluZm8gbWVzc2FnZV9raW5kOworCisgICAgICBpZiAoIWNoZWNrX2Jhc2Vfc2VydmljZV9hY3RpdmF0ZWQgKGNvbnRleHQsIGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsICZiYXNlX3NlcnZpY2UpKQorICAgICAgICBnb3RvIG91dDsKKworICAgICAgYmFzZV9zZXJ2aWNlX21lc3NhZ2UgPSBtZXNzYWdlOworICAgICAgbWVzc2FnZSA9IE5VTEw7CisKKyAgICAgIC8qIFdlIG1heSBuZWVkIHRvIGJsb2NrIGhlcmUgZm9yIHRoZSB0ZXN0IHNlcnZpY2UgdG8gZXhpdCBvciBmaW5pc2ggdXAgKi8KKyAgICAgIGJsb2NrX2Nvbm5lY3Rpb25fdW50aWxfbWVzc2FnZV9mcm9tX2J1cyAoY29udGV4dCwgY29ubmVjdGlvbiwgInRlc3Qgc2VydmljZSB0byBleGl0IG9yIGZpbmlzaCB1cCIpOworCisgICAgICBtZXNzYWdlID0gZGJ1c19jb25uZWN0aW9uX2JvcnJvd19tZXNzYWdlIChjb25uZWN0aW9uKTsKKyAgICAgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgiRGlkIG5vdCByZWNlaXZlIGFueSBtZXNzYWdlcyBhZnRlciBiYXNlIHNlcnZpY2UgY3JlYXRpb24gbm90aWZpY2F0aW9uIik7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgICAgbWVzc2FnZV9raW5kID0gY2hlY2tfZ290X3NlcnZpY2VfaW5mbyAobWVzc2FnZSk7CisKKyAgICAgIGRidXNfY29ubmVjdGlvbl9yZXR1cm5fbWVzc2FnZSAoY29ubmVjdGlvbiwgbWVzc2FnZSk7CisgICAgICBtZXNzYWdlID0gTlVMTDsKKworICAgICAgc3dpdGNoIChtZXNzYWdlX2tpbmQpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBHT1RfU09NRVRISU5HX0VMU0U6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgX2RidXNfd2FybiAoIlVuZXhwZWN0ZWQgbWVzc2FnZSBhZnRlciBBY3RpdmF0ZVNlcnZpY2UgIgorICAgICAgICAgICAgICAgICAgICAgICIoc2hvdWxkIGJlIGFuIGVycm9yIG9yIGEgc2VydmljZSBhbm5vdW5jZW1lbnQiKTsKKyAgICAgICAgICBnb3RvIG91dDsKKworICAgICAgICBjYXNlIEdPVF9FUlJPUjoKKyAgICAgICAgICBpZiAoIWNoZWNrX2dvdF9lcnJvciAoY29udGV4dCwgY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9TUEFXTl9DSElMRF9FWElURUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfTk9fTUVNT1JZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkKKyAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgIC8qIEEgc2VydmljZSBkZWxldGVkIHNob3VsZCBiZSBjb21pbmcgYWxvbmcgbm93IGFmdGVyIHRoaXMgZXJyb3IuCisgICAgICAgICAgICogV2UgY2FuIGFsc28gZ2V0IHRoZSBlcnJvciAqYWZ0ZXIqIHRoZSBzZXJ2aWNlIGRlbGV0ZWQuCisgICAgICAgICAgICovCisKKyAgICAgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KKworICAgICAgICBjYXNlIEdPVF9TRVJWSUNFX0RFTEVURUQ6CisgICAgICAgICAgeworICAgICAgICAgICAgLyogVGhlIHNlcnZpY2Ugc3RhcnRlZCB1cCBhbmQgZ290IGEgYmFzZSBhZGRyZXNzLCBidXQgdGhlbgorICAgICAgICAgICAgICogZmFpbGVkIHRvIHJlZ2lzdGVyIHVuZGVyIEVYSVNURU5UX1NFUlZJQ0VfTkFNRQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBDaGVja1NlcnZpY2VPd25lckNoYW5nZWREYXRhIHNvY2Q7CisKKyAgICAgICAgICAgIHNvY2QuZXhwZWN0ZWRfa2luZCA9IFNFUlZJQ0VfREVMRVRFRDsKKyAgICAgICAgICAgIHNvY2QuZXhwZWN0ZWRfc2VydmljZV9uYW1lID0gYmFzZV9zZXJ2aWNlOworICAgICAgICAgICAgc29jZC5mYWlsZWQgPSBGQUxTRTsKKyAgICAgICAgICAgIHNvY2Quc2tpcF9jb25uZWN0aW9uID0gTlVMTDsKKyAgICAgICAgICAgIHNvY2QuY29udGV4dCA9IGNvbnRleHQ7CisKKyAgICAgICAgICAgIGJ1c190ZXN0X2NsaWVudHNfZm9yZWFjaCAoY2hlY2tfc2VydmljZV9vd25lcl9jaGFuZ2VkX2ZvcmVhY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzb2NkKTsKKworICAgICAgICAgICAgaWYgKHNvY2QuZmFpbGVkKQorICAgICAgICAgICAgICBnb3RvIG91dDsKKworICAgICAgICAgICAgLyogTm93IHdlIHNob3VsZCBnZXQgYW4gZXJyb3IgYWJvdXQgdGhlIHNlcnZpY2UgZXhpdGluZworICAgICAgICAgICAgICogaWYgd2UgZGlkbid0IGdldCBpdCBiZWZvcmUuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChtZXNzYWdlX2tpbmQgIT0gR09UX0VSUk9SKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmxvY2tfY29ubmVjdGlvbl91bnRpbF9tZXNzYWdlX2Zyb21fYnVzIChjb250ZXh0LCBjb25uZWN0aW9uLCAiZXJyb3IgYWJvdXQgc2VydmljZSBleGl0aW5nIik7CisKKyAgICAgICAgICAgICAgICAvKiBhbmQgcHJvY2VzcyBldmVyeXRoaW5nIGFnYWluICovCisgICAgICAgICAgICAgICAgYnVzX3Rlc3RfcnVuX2V2ZXJ5dGhpbmcgKGNvbnRleHQpOworCisgICAgICAgICAgICAgICAgaWYgKCFjaGVja19nb3RfZXJyb3IgKGNvbnRleHQsIGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfU1BBV05fQ0hJTERfRVhJVEVELAorCQkJCSAgICAgIERCVVNfRVJST1JfTk9fTUVNT1JZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkKKyAgICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBHT1RfU0VSVklDRV9DUkVBVEVEOgorICAgICAgICAgIG1lc3NhZ2UgPSBwb3BfbWVzc2FnZV93YWl0aW5nX2Zvcl9tZW1vcnkgKGNvbm5lY3Rpb24pOworICAgICAgICAgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJGYWlsZWQgdG8gcG9wIG1lc3NhZ2Ugd2UganVzdCBwdXQgYmFjayEgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAic2hvdWxkIGhhdmUgYmVlbiBhIE5hbWVPd25lckNoYW5nZWQgKGNyZWF0aW9uKSIpOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGlmICghY2hlY2tfc2VydmljZV9hY3RpdmF0ZWQgKGNvbnRleHQsIGNvbm5lY3Rpb24sIEVYSVNURU5UX1NFUlZJQ0VfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlX3NlcnZpY2UsIG1lc3NhZ2UpKQorICAgICAgICAgICAgZ290byBvdXQ7CisKKyAgICAgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgICAgIG1lc3NhZ2UgPSBOVUxMOworCisgICAgICAgICAgaWYgKCFjaGVja19ub19sZWZ0b3ZlcnMgKGNvbnRleHQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c193YXJuICgiTWVzc2FnZXMgd2VyZSBsZWZ0IG92ZXIgYWZ0ZXIgc3VjY2Vzc2Z1bCBhY3RpdmF0aW9uIik7CisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorCisJICBpZiAoIWNoZWNrX3NlbmRfZXhpdF90b19zZXJ2aWNlIChjb250ZXh0LCBjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYSVNURU5UX1NFUlZJQ0VfTkFNRSwgYmFzZV9zZXJ2aWNlKSkKKwkgICAgZ290byBvdXQ7CisKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICByZXR2YWwgPSBUUlVFOworCisgb3V0OgorICBpZiAobWVzc2FnZSkKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworCisgIGlmIChiYXNlX3NlcnZpY2VfbWVzc2FnZSkKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKGJhc2Vfc2VydmljZV9tZXNzYWdlKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCisvKiByZXR1cm5zIFRSVUUgaWYgdGhlIGNvcnJlY3QgdGhpbmcgaGFwcGVucywKKyAqIGJ1dCB0aGUgY29ycmVjdCB0aGluZyBtYXkgaW5jbHVkZSBPT00gZXJyb3JzLgorICovCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX3NlZ2ZhdWx0X3NlcnZpY2Vfbm9fYXV0b19zdGFydCAoQnVzQ29udGV4dCAgICAgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBEQnVzTWVzc2FnZSAqbWVzc2FnZTsKKyAgZGJ1c191aW50MzJfdCBzZXJpYWw7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgY29uc3QgY2hhciAqc2Vndl9zZXJ2aWNlOworICBkYnVzX3VpbnQzMl90IGZsYWdzOworCisgIG1lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsIChEQlVTX1NFUlZJQ0VfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfUEFUSF9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19JTlRFUkZBQ0VfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTdGFydFNlcnZpY2VCeU5hbWUiKTsKKworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHJldHVybiBUUlVFOworCisgIGRidXNfbWVzc2FnZV9zZXRfYXV0b19zdGFydCAobWVzc2FnZSwgRkFMU0UpOworCisgIHNlZ3Zfc2VydmljZSA9ICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVTZWdmYXVsdFNlcnZpY2UiOworICBmbGFncyA9IDA7CisgIGlmICghZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJnNlZ3Zfc2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9VSU5UMzIsICZmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGlmICghZGJ1c19jb25uZWN0aW9uX3NlbmQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsICZzZXJpYWwpKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgbWVzc2FnZSA9IE5VTEw7CisKKyAgYnVzX3Rlc3RfcnVuX2V2ZXJ5dGhpbmcgKGNvbnRleHQpOworICBibG9ja19jb25uZWN0aW9uX3VudGlsX21lc3NhZ2VfZnJvbV9idXMgKGNvbnRleHQsIGNvbm5lY3Rpb24sICJyZXBseSB0byBhY3RpdmF0aW5nIHNlZ2ZhdWx0IHNlcnZpY2UiKTsKKyAgYnVzX3Rlc3RfcnVuX2V2ZXJ5dGhpbmcgKGNvbnRleHQpOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX2dldF9pc19jb25uZWN0ZWQgKGNvbm5lY3Rpb24pKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJjb25uZWN0aW9uIHdhcyBkaXNjb25uZWN0ZWRcbiIpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIHJldHZhbCA9IEZBTFNFOworCisgIG1lc3NhZ2UgPSBwb3BfbWVzc2FnZV93YWl0aW5nX2Zvcl9tZW1vcnkgKGNvbm5lY3Rpb24pOworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJEaWQgbm90IHJlY2VpdmUgYSByZXBseSB0byAlcyAlZCBvbiAlcCIsCisgICAgICAgICAgICAgICAgICAiU3RhcnRTZXJ2aWNlQnlOYW1lIiwgc2VyaWFsLCBjb25uZWN0aW9uKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICB2ZXJib3NlX21lc3NhZ2VfcmVjZWl2ZWQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UpOworCisgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKG1lc3NhZ2UpID09IERCVVNfTUVTU0FHRV9UWVBFX0VSUk9SKQorICAgIHsKKyAgICAgIGlmICghZGJ1c19tZXNzYWdlX2hhc19zZW5kZXIgKG1lc3NhZ2UsIERCVVNfU0VSVklDRV9EQlVTKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJNZXNzYWdlIGhhcyB3cm9uZyBzZW5kZXIgJXMiLAorICAgICAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfc2VuZGVyIChtZXNzYWdlKSA/CisgICAgICAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9zZW5kZXIgKG1lc3NhZ2UpIDogIihub25lKSIpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgIGlmIChkYnVzX21lc3NhZ2VfaXNfZXJyb3IgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0VSUk9SX05PX01FTU9SWSkpCisgICAgICAgIHsKKyAgICAgICAgICA7IC8qIGdvb2QsIHRoaXMgaXMgYSB2YWxpZCByZXNwb25zZSAqLworICAgICAgICB9CisgICAgICBlbHNlIGlmIChkYnVzX21lc3NhZ2VfaXNfZXJyb3IgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfRkFJTEVEKSkKKyAgICAgICAgeworICAgICAgICAgIGNvbnN0IGNoYXIgKnNlcnZpY2VoZWxwZXI7CisgICAgICAgICAgc2VydmljZWhlbHBlciA9IGJ1c19jb250ZXh0X2dldF9zZXJ2aWNlaGVscGVyIChjb250ZXh0KTsKKyAgICAgICAgICAvKiBtYWtlIHN1cmUgdGhpcyBvbmx5IGhhcHBlbnMgd2l0aCB0aGUgbGF1bmNoIGhlbHBlciAqLworICAgICAgICAgIF9kYnVzX2Fzc2VydCAoc2VydmljZWhlbHBlciAhPSBOVUxMKTsKKyAgICAgICAgfQorI2lmZGVmIERCVVNfV0lOCisgICAgICBlbHNlIGlmIChkYnVzX21lc3NhZ2VfaXNfZXJyb3IgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfU1BBV05fQ0hJTERfRVhJVEVEKSkKKyAgICAgICAgeworICAgICAgICAgIC8qIHVuaGFuZGxlZCBleGNlcHRpb25zIGFyZSBub3JtYWwgZXhpdCBjb2RlcyAqLworICAgICAgICB9CisjZWxzZQorICAgICAgZWxzZSBpZiAoZGJ1c19tZXNzYWdlX2lzX2Vycm9yIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0VSUk9SX1NQQVdOX0NISUxEX1NJR05BTEVEKSkKKyAgICAgICAgeworICAgICAgICAgIDsgLyogZ29vZCwgdGhpcyBpcyBleHBlY3RlZCBhbHNvICovCisgICAgICAgIH0KKyNlbmRpZgorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgd2Fybl91bmV4cGVjdGVkIChjb25uZWN0aW9uLCBtZXNzYWdlLCAibm90IHRoaXMgZXJyb3IiKTsKKworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkRpZCBub3QgZXhwZWN0IHRvIHN1Y2Nlc3NmdWxseSBhY3RpdmF0ZSBzZWdmYXVsdCBzZXJ2aWNlIik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgcmV0dmFsID0gVFJVRTsKKworIG91dDoKKyAgaWYgKG1lc3NhZ2UpCisgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCisKKy8qIHJldHVybnMgVFJVRSBpZiB0aGUgY29ycmVjdCB0aGluZyBoYXBwZW5zLAorICogYnV0IHRoZSBjb3JyZWN0IHRoaW5nIG1heSBpbmNsdWRlIE9PTSBlcnJvcnMuCisgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAorY2hlY2tfc2VnZmF1bHRfc2VydmljZV9hdXRvX3N0YXJ0IChCdXNDb250ZXh0ICAgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworICBkYnVzX3VpbnQzMl90IHNlcmlhbDsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworCisgIG1lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsICgib3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlU2VnZmF1bHRTZXJ2aWNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvb3JnL2ZyZWVkZXNrdG9wL1Rlc3RTdWl0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLlRlc3RTdWl0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRWNobyIpOworCisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoY29ubmVjdGlvbiwgbWVzc2FnZSwgJnNlcmlhbCkpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICBtZXNzYWdlID0gTlVMTDsKKworICBidXNfdGVzdF9ydW5fZXZlcnl0aGluZyAoY29udGV4dCk7CisgIGJsb2NrX2Nvbm5lY3Rpb25fdW50aWxfbWVzc2FnZV9mcm9tX2J1cyAoY29udGV4dCwgY29ubmVjdGlvbiwgInJlcGx5IHRvIEVjaG8gb24gc2VnZmF1bHQgc2VydmljZSIpOworICBidXNfdGVzdF9ydW5fZXZlcnl0aGluZyAoY29udGV4dCk7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Nvbm5lY3RlZCAoY29ubmVjdGlvbikpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoImNvbm5lY3Rpb24gd2FzIGRpc2Nvbm5lY3RlZFxuIik7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgcmV0dmFsID0gRkFMU0U7CisKKyAgbWVzc2FnZSA9IHBvcF9tZXNzYWdlX3dhaXRpbmdfZm9yX21lbW9yeSAoY29ubmVjdGlvbik7CisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkRpZCBub3QgcmVjZWl2ZSBhIHJlcGx5IHRvICVzICVkIG9uICVwIiwKKyAgICAgICAgICAgICAgICAgICJFY2hvIG1lc3NhZ2UgKGF1dG8gYWN0aXZhdGlvbikiLCBzZXJpYWwsIGNvbm5lY3Rpb24pOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIHZlcmJvc2VfbWVzc2FnZV9yZWNlaXZlZCAoY29ubmVjdGlvbiwgbWVzc2FnZSk7CisKKyAgaWYgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkgPT0gREJVU19NRVNTQUdFX1RZUEVfRVJST1IpCisgICAgeworICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfaGFzX3NlbmRlciAobWVzc2FnZSwgREJVU19TRVJWSUNFX0RCVVMpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoIk1lc3NhZ2UgaGFzIHdyb25nIHNlbmRlciAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9zZW5kZXIgKG1lc3NhZ2UpID8KKyAgICAgICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3NlbmRlciAobWVzc2FnZSkgOiAiKG5vbmUpIik7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgICAgaWYgKGRidXNfbWVzc2FnZV9pc19lcnJvciAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfTk9fTUVNT1JZKSkKKyAgICAgICAgeworICAgICAgICAgIDsgLyogZ29vZCwgdGhpcyBpcyBhIHZhbGlkIHJlc3BvbnNlICovCisgICAgICAgIH0KKyNpZmRlZiBEQlVTX1dJTgorICAgICAgZWxzZSBpZiAoZGJ1c19tZXNzYWdlX2lzX2Vycm9yIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0VSUk9SX1NQQVdOX0NISUxEX0VYSVRFRCkpCisgICAgICAgIHsKKyAgICAgICAgICAvKiB1bmhhbmRsZWQgZXhjZXB0aW9ucyBhcmUgbm9ybWFsIGV4aXQgY29kZXMgKi8KKyAgICAgICAgfQorI2Vsc2UKKyAgICAgIGVsc2UgaWYgKGRidXNfbWVzc2FnZV9pc19lcnJvciAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9TUEFXTl9DSElMRF9TSUdOQUxFRCkpCisgICAgICAgIHsKKyAgICAgICAgICA7IC8qIGdvb2QsIHRoaXMgaXMgZXhwZWN0ZWQgYWxzbyAqLworICAgICAgICB9CisjZW5kaWYKKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHdhcm5fdW5leHBlY3RlZCAoY29ubmVjdGlvbiwgbWVzc2FnZSwgIm5vdCB0aGlzIGVycm9yIik7CisKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJEaWQgbm90IGV4cGVjdCB0byBzdWNjZXNzZnVsbHkgYWN0aXZhdGUgc2VnZmF1bHQgc2VydmljZSIpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIHJldHZhbCA9IFRSVUU7CisKKyBvdXQ6CisgIGlmIChtZXNzYWdlKQorICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworI2RlZmluZSBURVNUX0VDSE9fTUVTU0FHRSAiVGVzdCBlY2hvIG1lc3NhZ2UiCisjZGVmaW5lIFRFU1RfUlVOX0hFTExPX0ZST01fU0VMRl9NRVNTQUdFICJUZXN0IHNlbmRpbmcgbWVzc2FnZSB0byBzZWxmIgorCisvKiByZXR1cm5zIFRSVUUgaWYgdGhlIGNvcnJlY3QgdGhpbmcgaGFwcGVucywKKyAqIGJ1dCB0aGUgY29ycmVjdCB0aGluZyBtYXkgaW5jbHVkZSBPT00gZXJyb3JzLgorICovCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX2V4aXN0ZW50X2hlbGxvX2Zyb21fc2VsZiAoQnVzQ29udGV4dCAgICAgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBEQnVzTWVzc2FnZSAqbWVzc2FnZTsKKyAgZGJ1c191aW50MzJfdCBzZXJpYWw7CisgIGNvbnN0IGNoYXIgKnRleHQ7CisKKyAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKEVYSVNURU5UX1NFUlZJQ0VfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvb3JnL2ZyZWVkZXNrdG9wL1Rlc3RTdWl0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLlRlc3RTdWl0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUnVuSGVsbG9Gcm9tU2VsZiIpOworCisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgdGV4dCA9IFRFU1RfUlVOX0hFTExPX0ZST01fU0VMRl9NRVNTQUdFOworICBpZiAoIWRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZ0ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoY29ubmVjdGlvbiwgbWVzc2FnZSwgJnNlcmlhbCkpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICBtZXNzYWdlID0gTlVMTDsKKworICBidXNfdGVzdF9ydW5fZXZlcnl0aGluZyAoY29udGV4dCk7CisKKyAgLyogTm90ZTogaWYgdGhpcyB0ZXN0IGlzIHJ1biBpbiBPT00gbW9kZSwgaXQgd2lsbCBibG9jayB3aGVuIHRoZSBidXMKKyAgICogZG9lc24ndCBzZW5kIGEgcmVwbHkgZHVlIHRvIE9PTS4KKyAgICovCisgIGJsb2NrX2Nvbm5lY3Rpb25fdW50aWxfbWVzc2FnZV9mcm9tX2J1cyAoY29udGV4dCwgY29ubmVjdGlvbiwgInJlcGx5IGZyb20gcnVubmluZyBoZWxsbyBmcm9tIHNlbGYiKTsKKworICBtZXNzYWdlID0gcG9wX21lc3NhZ2Vfd2FpdGluZ19mb3JfbWVtb3J5IChjb25uZWN0aW9uKTsKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiRmFpbGVkIHRvIHBvcCBtZXNzYWdlISBTaG91bGQgaGF2ZSBiZWVuIHJlcGx5IGZyb20gUnVuSGVsbG9Gcm9tU2VsZiBtZXNzYWdlIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X3JlcGx5X3NlcmlhbCAobWVzc2FnZSkgIT0gc2VyaWFsKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJXcm9uZyByZXBseSBzZXJpYWwiKTsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIG1lc3NhZ2UgPSBOVUxMOworCisgIHJldHVybiBUUlVFOworfQorCisvKiByZXR1cm5zIFRSVUUgaWYgdGhlIGNvcnJlY3QgdGhpbmcgaGFwcGVucywKKyAqIGJ1dCB0aGUgY29ycmVjdCB0aGluZyBtYXkgaW5jbHVkZSBPT00gZXJyb3JzLgorICovCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX2V4aXN0ZW50X3BpbmcgKEJ1c0NvbnRleHQgICAgICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworICBkYnVzX3VpbnQzMl90IHNlcmlhbDsKKyAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKEVYSVNURU5UX1NFUlZJQ0VfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvb3JnL2ZyZWVkZXNrdG9wL1Rlc3RTdWl0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLkRCdXMuUGVlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGluZyIpOworCisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoY29ubmVjdGlvbiwgbWVzc2FnZSwgJnNlcmlhbCkpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICBtZXNzYWdlID0gTlVMTDsKKworICBidXNfdGVzdF9ydW5fZXZlcnl0aGluZyAoY29udGV4dCk7CisKKyAgLyogTm90ZTogaWYgdGhpcyB0ZXN0IGlzIHJ1biBpbiBPT00gbW9kZSwgaXQgd2lsbCBibG9jayB3aGVuIHRoZSBidXMKKyAgICogZG9lc24ndCBzZW5kIGEgcmVwbHkgZHVlIHRvIE9PTS4KKyAgICovCisgIGJsb2NrX2Nvbm5lY3Rpb25fdW50aWxfbWVzc2FnZV9mcm9tX2J1cyAoY29udGV4dCwgY29ubmVjdGlvbiwgInJlcGx5IGZyb20gcnVubmluZyBQaW5nIik7CisKKyAgbWVzc2FnZSA9IHBvcF9tZXNzYWdlX3dhaXRpbmdfZm9yX21lbW9yeSAoY29ubmVjdGlvbik7CisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkZhaWxlZCB0byBwb3AgbWVzc2FnZSEgU2hvdWxkIGhhdmUgYmVlbiByZXBseSBmcm9tIFBpbmcgbWVzc2FnZSIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoZGJ1c19tZXNzYWdlX2dldF9yZXBseV9zZXJpYWwgKG1lc3NhZ2UpICE9IHNlcmlhbCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiV3JvbmcgcmVwbHkgc2VyaWFsIik7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlKSAhPSBEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfUkVUVVJOKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJVbmV4cGVjdGVkIG1lc3NhZ2UgcmV0dXJuIGR1cmluZyBQaW5nIik7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICBtZXNzYWdlID0gTlVMTDsKKworICByZXR1cm4gVFJVRTsKK30KKworLyogcmV0dXJucyBUUlVFIGlmIHRoZSBjb3JyZWN0IHRoaW5nIGhhcHBlbnMsCisgKiBidXQgdGhlIGNvcnJlY3QgdGhpbmcgbWF5IGluY2x1ZGUgT09NIGVycm9ycy4KKyAqLworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19leGlzdGVudF9nZXRfbWFjaGluZV9pZCAoQnVzQ29udGV4dCAgICAgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIERCdXNFcnJvciBlcnJvciA9IERCVVNfRVJST1JfSU5JVDsKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisgIGRidXNfdWludDMyX3Qgc2VyaWFsOworICBEQnVzR1VJRCB1dWlkOworICBjb25zdCBjaGFyICptYWNoaW5lX2lkOworCisgIGlmICghX2RidXNfcmVhZF9sb2NhbF9tYWNoaW5lX3V1aWQgKCZ1dWlkLCBGQUxTRSwgJmVycm9yKSkKKyAgICB7CisgICAgICAvKiBVbmFibGUgdG8gdGVzdCBmdXJ0aGVyOiBlaXRoZXIgd2UgcmFuIG91dCBvZiBtZW1vcnksIG9yIG5laXRoZXIKKyAgICAgICAqIGRidXMgbm9yIHN5c3RlbWQgd2FzIGV2ZXIgY29ycmVjdGx5IGluc3RhbGxlZCBvbiB0aGlzIG1hY2hpbmUgKi8KKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJNYWNoaW5lIFVVSUQgbm90IGF2YWlsYWJsZTogJXMiLCBlcnJvci5tZXNzYWdlKTsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoRVhJU1RFTlRfU0VSVklDRV9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9vcmcvZnJlZWRlc2t0b3AvVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5QZWVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHZXRNYWNoaW5lSWQiKTsKKworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHJldHVybiBUUlVFOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX3NlbmQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsICZzZXJpYWwpKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgbWVzc2FnZSA9IE5VTEw7CisKKyAgYnVzX3Rlc3RfcnVuX2V2ZXJ5dGhpbmcgKGNvbnRleHQpOworCisgIC8qIE5vdGU6IGlmIHRoaXMgdGVzdCBpcyBydW4gaW4gT09NIG1vZGUsIGl0IHdpbGwgYmxvY2sgd2hlbiB0aGUgYnVzCisgICAqIGRvZXNuJ3Qgc2VuZCBhIHJlcGx5IGR1ZSB0byBPT00uCisgICAqLworICBibG9ja19jb25uZWN0aW9uX3VudGlsX21lc3NhZ2VfZnJvbV9idXMgKGNvbnRleHQsIGNvbm5lY3Rpb24sICJyZXBseSBmcm9tIHJ1bm5pbmcgR2V0TWFjaGluZUlkIik7CisKKyAgbWVzc2FnZSA9IHBvcF9tZXNzYWdlX3dhaXRpbmdfZm9yX21lbW9yeSAoY29ubmVjdGlvbik7CisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkZhaWxlZCB0byBwb3AgbWVzc2FnZSEgU2hvdWxkIGhhdmUgYmVlbiByZXBseSBmcm9tIEdldE1hY2hpbmVJZCBtZXNzYWdlIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X3JlcGx5X3NlcmlhbCAobWVzc2FnZSkgIT0gc2VyaWFsKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJXcm9uZyByZXBseSBzZXJpYWwiKTsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKG1lc3NhZ2UpICE9IERCVVNfTUVTU0FHRV9UWVBFX01FVEhPRF9SRVRVUk4pCisgICAgeworICAgICAgX2RidXNfd2FybiAoIlVuZXhwZWN0ZWQgbWVzc2FnZSByZXR1cm4gZHVyaW5nIEdldE1hY2hpbmVJZCIpOworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgbWFjaGluZV9pZCA9IE5VTEw7CisgIGlmICghZGJ1c19tZXNzYWdlX2dldF9hcmdzIChtZXNzYWdlLCBOVUxMLCBEQlVTX1RZUEVfU1RSSU5HLCAmbWFjaGluZV9pZCwgREJVU19UWVBFX0lOVkFMSUQpKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJEaWQgbm90IGdldCBhIG1hY2hpbmUgSUQgaW4gcmVwbHkgdG8gR2V0TWFjaGluZUlkIik7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAobWFjaGluZV9pZCA9PSBOVUxMIHx8IHN0cmxlbiAobWFjaGluZV9pZCkgIT0gMzIpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIk1hY2hpbmUgaWQgbG9va3MgYm9ndXM6ICclcyciLCBtYWNoaW5lX2lkID8gbWFjaGluZV9pZCA6ICJudWxsIik7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAvKiBXZSBjYW4ndCBjaGVjayB0aGF0IHRoZSBtYWNoaW5lIGlkIGlzIGNvcnJlY3QgYmVjYXVzZSBkdXJpbmcgbWFrZSBjaGVjayBpdCBpcworICAgKiBqdXN0IG1hZGUgdXAgZm9yIGVhY2ggcHJvY2VzcyBzZXBhcmF0ZWx5CisgICAqLworCisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIG1lc3NhZ2UgPSBOVUxMOworCisgIHJldHVybiBUUlVFOworfQorCisvKiByZXR1cm5zIFRSVUUgaWYgdGhlIGNvcnJlY3QgdGhpbmcgaGFwcGVucywKKyAqIGJ1dCB0aGUgY29ycmVjdCB0aGluZyBtYXkgaW5jbHVkZSBPT00gZXJyb3JzLgorICovCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX2V4aXN0ZW50X3NlcnZpY2VfYXV0b19zdGFydCAoQnVzQ29udGV4dCAgICAgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBEQnVzTWVzc2FnZSAqbWVzc2FnZTsKKyAgREJ1c01lc3NhZ2UgKmJhc2Vfc2VydmljZV9tZXNzYWdlOworICBkYnVzX3VpbnQzMl90IHNlcmlhbDsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICBjb25zdCBjaGFyICpiYXNlX3NlcnZpY2U7CisgIGNvbnN0IGNoYXIgKnRleHQ7CisKKyAgYmFzZV9zZXJ2aWNlX21lc3NhZ2UgPSBOVUxMOworCisgIG1lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsIChFWElTVEVOVF9TRVJWSUNFX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiL29yZy9mcmVlZGVza3RvcC9UZXN0U3VpdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5UZXN0U3VpdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVjaG8iKTsKKworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHJldHVybiBUUlVFOworCisgIHRleHQgPSBURVNUX0VDSE9fTUVTU0FHRTsKKyAgaWYgKCFkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGlmICghZGJ1c19jb25uZWN0aW9uX3NlbmQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsICZzZXJpYWwpKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgbWVzc2FnZSA9IE5VTEw7CisKKyAgYnVzX3Rlc3RfcnVuX2V2ZXJ5dGhpbmcgKGNvbnRleHQpOworCisgIC8qIG5vdyB3YWl0IGZvciB0aGUgbWVzc2FnZSBidXMgdG8gaGVhciBiYWNrIGZyb20gdGhlIGFjdGl2YXRlZAorICAgKiBzZXJ2aWNlLgorICAgKi8KKyAgYmxvY2tfY29ubmVjdGlvbl91bnRpbF9tZXNzYWdlX2Zyb21fYnVzIChjb250ZXh0LCBjb25uZWN0aW9uLCAicmVwbHkgdG8gRWNobyBvbiBleGlzdGVudCBzZXJ2aWNlIik7CisgIGJ1c190ZXN0X3J1bl9ldmVyeXRoaW5nIChjb250ZXh0KTsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9nZXRfaXNfY29ubmVjdGVkIChjb25uZWN0aW9uKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiY29ubmVjdGlvbiB3YXMgZGlzY29ubmVjdGVkXG4iKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICByZXR2YWwgPSBGQUxTRTsKKworICBtZXNzYWdlID0gcG9wX21lc3NhZ2Vfd2FpdGluZ19mb3JfbWVtb3J5IChjb25uZWN0aW9uKTsKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiRGlkIG5vdCByZWNlaXZlIGFueSBtZXNzYWdlcyBhZnRlciBhdXRvIHN0YXJ0ICVkIG9uICVwIiwKKyAgICAgICAgICAgICAgICAgIHNlcmlhbCwgY29ubmVjdGlvbik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgdmVyYm9zZV9tZXNzYWdlX3JlY2VpdmVkIChjb25uZWN0aW9uLCBtZXNzYWdlKTsKKyAgX2RidXNfdmVyYm9zZSAoIiAgKGFmdGVyIHNlbmRpbmcgJXMpXG4iLCAiYXV0byBzdGFydCIpOworCisgIC8qIHdlIHNob3VsZCBnZXQgemVybyBvciB0d28gU2VydmljZU93bmVyQ2hhbmdlZCBzaWduYWxzICovCisgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKG1lc3NhZ2UpID09IERCVVNfTUVTU0FHRV9UWVBFX1NJR05BTCkKKyAgICB7CisgICAgICBHb3RTZXJ2aWNlSW5mbyBtZXNzYWdlX2tpbmQ7CisKKyAgICAgIGlmICghY2hlY2tfYmFzZV9zZXJ2aWNlX2FjdGl2YXRlZCAoY29udGV4dCwgY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwgJmJhc2Vfc2VydmljZSkpCisgICAgICAgIGdvdG8gb3V0OworCisgICAgICBiYXNlX3NlcnZpY2VfbWVzc2FnZSA9IG1lc3NhZ2U7CisgICAgICBtZXNzYWdlID0gTlVMTDsKKworICAgICAgLyogV2UgbWF5IG5lZWQgdG8gYmxvY2sgaGVyZSBmb3IgdGhlIHRlc3Qgc2VydmljZSB0byBleGl0IG9yIGZpbmlzaCB1cCAqLworICAgICAgYmxvY2tfY29ubmVjdGlvbl91bnRpbF9tZXNzYWdlX2Zyb21fYnVzIChjb250ZXh0LCBjb25uZWN0aW9uLCAic2VydmljZSB0byBleGl0Iik7CisKKyAgICAgIC8qIFNob3VsZCBnZXQgYSBzZXJ2aWNlIGNyZWF0aW9uIG5vdGlmaWNhdGlvbiBmb3IgdGhlIGFjdGl2YXRlZAorICAgICAgICogc2VydmljZSBuYW1lLCBvciBhIHNlcnZpY2UgZGVsZXRpb24gb24gdGhlIGJhc2Ugc2VydmljZSBuYW1lCisgICAgICAgKi8KKyAgICAgIG1lc3NhZ2UgPSBkYnVzX2Nvbm5lY3Rpb25fYm9ycm93X21lc3NhZ2UgKGNvbm5lY3Rpb24pOworICAgICAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJObyBtZXNzYWdlIGFmdGVyIGF1dG8gYWN0aXZhdGlvbiAiCisgICAgICAgICAgICAgICAgICAgICAgIihzaG91bGQgYmUgYSBzZXJ2aWNlIGFubm91bmNlbWVudCkiKTsKKyAgICAgICAgICBkYnVzX2Nvbm5lY3Rpb25fcmV0dXJuX21lc3NhZ2UgKGNvbm5lY3Rpb24sIG1lc3NhZ2UpOworICAgICAgICAgIG1lc3NhZ2UgPSBOVUxMOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgIG1lc3NhZ2Vfa2luZCA9IGNoZWNrX2dvdF9zZXJ2aWNlX2luZm8gKG1lc3NhZ2UpOworCisgICAgICBkYnVzX2Nvbm5lY3Rpb25fcmV0dXJuX21lc3NhZ2UgKGNvbm5lY3Rpb24sIG1lc3NhZ2UpOworICAgICAgbWVzc2FnZSA9IE5VTEw7CisKKyAgICAgIHN3aXRjaCAobWVzc2FnZV9raW5kKQorICAgICAgICB7CisgICAgICAgIGNhc2UgR09UX1NFUlZJQ0VfQ1JFQVRFRDoKKyAgICAgICAgICBtZXNzYWdlID0gcG9wX21lc3NhZ2Vfd2FpdGluZ19mb3JfbWVtb3J5IChjb25uZWN0aW9uKTsKKyAgICAgICAgICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c193YXJuICgiRmFpbGVkIHRvIHBvcCBtZXNzYWdlIHdlIGp1c3QgcHV0IGJhY2shICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInNob3VsZCBoYXZlIGJlZW4gYSBOYW1lT3duZXJDaGFuZ2VkIChjcmVhdGlvbikiKTsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAvKiBDaGVjayB0aGF0IFNlcnZpY2VPd25lckNoYW5nZWQgKGNyZWF0aW9uKSB3YXMgY29ycmVjdGx5IHJlY2VpdmVkICovCisgICAgICAgICAgaWYgKCFjaGVja19zZXJ2aWNlX2F1dG9fYWN0aXZhdGVkIChjb250ZXh0LCBjb25uZWN0aW9uLCBFWElTVEVOVF9TRVJWSUNFX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlX3NlcnZpY2UsIG1lc3NhZ2UpKQorICAgICAgICAgICAgZ290byBvdXQ7CisKKyAgICAgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgICAgIG1lc3NhZ2UgPSBOVUxMOworCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBHT1RfU0VSVklDRV9ERUxFVEVEOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFRoZSBzZXJ2aWNlIHN0YXJ0ZWQgdXAgYW5kIGdvdCBhIGJhc2UgYWRkcmVzcywgYnV0IHRoZW4KKyAgICAgICAgICAgICAqIGZhaWxlZCB0byByZWdpc3RlciB1bmRlciBFWElTVEVOVF9TRVJWSUNFX05BTUUKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgQ2hlY2tTZXJ2aWNlT3duZXJDaGFuZ2VkRGF0YSBzb2NkOworCisgICAgICAgICAgICBzb2NkLmV4cGVjdGVkX2tpbmQgPSBTRVJWSUNFX0RFTEVURUQ7CisgICAgICAgICAgICBzb2NkLmV4cGVjdGVkX3NlcnZpY2VfbmFtZSA9IGJhc2Vfc2VydmljZTsKKyAgICAgICAgICAgIHNvY2QuZmFpbGVkID0gRkFMU0U7CisgICAgICAgICAgICBzb2NkLnNraXBfY29ubmVjdGlvbiA9IE5VTEw7CisgICAgICAgICAgICBzb2NkLmNvbnRleHQgPSBjb250ZXh0OworCisgICAgICAgICAgICBidXNfdGVzdF9jbGllbnRzX2ZvcmVhY2ggKGNoZWNrX3NlcnZpY2Vfb3duZXJfY2hhbmdlZF9mb3JlYWNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc29jZCk7CisKKyAgICAgICAgICAgIGlmIChzb2NkLmZhaWxlZCkKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEdPVF9FUlJPUjoKKyAgICAgICAgY2FzZSBHT1RfU09NRVRISU5HX0VMU0U6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgX2RidXNfd2FybiAoIlVuZXhwZWN0ZWQgbWVzc2FnZSBhZnRlciBhdXRvIGFjdGl2YXRpb24iKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgIH0KKworICAvKiBPSywgbm93IHdlJ3ZlIGRlYWx0IHdpdGggU2VydmljZU93bmVyQ2hhbmdlZCBzaWduYWxzLCBub3cgc2hvdWxkCisgICAqIGNvbWUgdGhlIG1ldGhvZCByZXBseSAob3IgZXJyb3IpIGZyb20gdGhlIGluaXRpYWwgbWV0aG9kIGNhbGwKKyAgICovCisKKyAgLyogTm90ZTogaWYgdGhpcyB0ZXN0IGlzIHJ1biBpbiBPT00gbW9kZSwgaXQgd2lsbCBibG9jayB3aGVuIHRoZSBidXMKKyAgICogZG9lc24ndCBzZW5kIGEgcmVwbHkgZHVlIHRvIE9PTS4KKyAgICovCisgIGJsb2NrX2Nvbm5lY3Rpb25fdW50aWxfbWVzc2FnZV9mcm9tX2J1cyAoY29udGV4dCwgY29ubmVjdGlvbiwgInJlcGx5IGZyb20gZWNobyBtZXNzYWdlIGFmdGVyIGF1dG8tYWN0aXZhdGlvbiIpOworCisgIG1lc3NhZ2UgPSBwb3BfbWVzc2FnZV93YWl0aW5nX2Zvcl9tZW1vcnkgKGNvbm5lY3Rpb24pOworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJGYWlsZWQgdG8gcG9wIG1lc3NhZ2UhIFNob3VsZCBoYXZlIGJlZW4gcmVwbHkgZnJvbSBlY2hvIG1lc3NhZ2UiKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAoZGJ1c19tZXNzYWdlX2dldF9yZXBseV9zZXJpYWwgKG1lc3NhZ2UpICE9IHNlcmlhbCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiV3JvbmcgcmVwbHkgc2VyaWFsIik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgbWVzc2FnZSA9IE5VTEw7CisKKyAgaWYgKCFjaGVja19leGlzdGVudF9waW5nIChjb250ZXh0LCBjb25uZWN0aW9uKSkKKyAgICBnb3RvIG91dDsKKworICBpZiAoIWNoZWNrX2V4aXN0ZW50X2dldF9tYWNoaW5lX2lkIChjb250ZXh0LCBjb25uZWN0aW9uKSkKKyAgICBnb3RvIG91dDsKKworICBpZiAoIWNoZWNrX2V4aXN0ZW50X2hlbGxvX2Zyb21fc2VsZiAoY29udGV4dCwgY29ubmVjdGlvbikpCisgICAgZ290byBvdXQ7CisKKyAgaWYgKCFjaGVja19zZW5kX2V4aXRfdG9fc2VydmljZSAoY29udGV4dCwgY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhJU1RFTlRfU0VSVklDRV9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlX3NlcnZpY2UpKQorICAgIGdvdG8gb3V0OworCisgIHJldHZhbCA9IFRSVUU7CisKKyBvdXQ6CisgIGlmIChtZXNzYWdlKQorICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisKKyAgaWYgKGJhc2Vfc2VydmljZV9tZXNzYWdlKQorICAgIGRidXNfbWVzc2FnZV91bnJlZiAoYmFzZV9zZXJ2aWNlX21lc3NhZ2UpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKKyNkZWZpbmUgU0VSVklDRV9GSUxFX01JU1NJTkdfTkFNRSAib3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlRWNob1NlcnZpY2VEb3RTZXJ2aWNlRmlsZURvZXNOb3RFeGlzdCIKKworLyogcmV0dXJucyBUUlVFIGlmIHRoZSBjb3JyZWN0IHRoaW5nIGhhcHBlbnMsCisgKiBidXQgdGhlIGNvcnJlY3QgdGhpbmcgbWF5IGluY2x1ZGUgT09NIGVycm9ycy4KKyAqLworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19sYXVuY2hfc2VydmljZV9maWxlX21pc3NpbmcgKEJ1c0NvbnRleHQgICAgICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisgIGRidXNfdWludDMyX3Qgc2VyaWFsOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisKKyAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKFNFUlZJQ0VfRklMRV9NSVNTSU5HX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiL29yZy9mcmVlZGVza3RvcC9UZXN0U3VpdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5UZXN0U3VpdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVjaG8iKTsKKworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHJldHVybiBUUlVFOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX3NlbmQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsICZzZXJpYWwpKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgbWVzc2FnZSA9IE5VTEw7CisKKyAgYnVzX3Rlc3RfcnVuX2V2ZXJ5dGhpbmcgKGNvbnRleHQpOworICBibG9ja19jb25uZWN0aW9uX3VudGlsX21lc3NhZ2VfZnJvbV9idXMgKGNvbnRleHQsIGNvbm5lY3Rpb24sICJyZXBseSB0byBzZXJ2aWNlIGZpbGUgbWlzc2luZyBzaG91bGQgZmFpbCB0byBhdXRvLXN0YXJ0Iik7CisgIGJ1c190ZXN0X3J1bl9ldmVyeXRoaW5nIChjb250ZXh0KTsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9nZXRfaXNfY29ubmVjdGVkIChjb25uZWN0aW9uKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiY29ubmVjdGlvbiB3YXMgZGlzY29ubmVjdGVkXG4iKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICByZXR2YWwgPSBGQUxTRTsKKworICBtZXNzYWdlID0gcG9wX21lc3NhZ2Vfd2FpdGluZ19mb3JfbWVtb3J5IChjb25uZWN0aW9uKTsKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiRGlkIG5vdCByZWNlaXZlIGEgcmVwbHkgdG8gJXMgJWQgb24gJXAiLAorICAgICAgICAgICAgICAgICAgIkVjaG8gbWVzc2FnZSAoYXV0byBhY3RpdmF0aW9uKSIsIHNlcmlhbCwgY29ubmVjdGlvbik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgdmVyYm9zZV9tZXNzYWdlX3JlY2VpdmVkIChjb25uZWN0aW9uLCBtZXNzYWdlKTsKKworICBpZiAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlKSA9PSBEQlVTX01FU1NBR0VfVFlQRV9FUlJPUikKKyAgICB7CisgICAgICBpZiAoIWRidXNfbWVzc2FnZV9oYXNfc2VuZGVyIChtZXNzYWdlLCBEQlVTX1NFUlZJQ0VfREJVUykpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgiTWVzc2FnZSBoYXMgd3Jvbmcgc2VuZGVyICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3NlbmRlciAobWVzc2FnZSkgPworICAgICAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfc2VuZGVyIChtZXNzYWdlKSA6ICIobm9uZSkiKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICBpZiAoZGJ1c19tZXNzYWdlX2lzX2Vycm9yIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9OT19NRU1PUlkpKQorICAgICAgICB7CisgICAgICAgICAgOyAvKiBnb29kLCB0aGlzIGlzIGEgdmFsaWQgcmVzcG9uc2UgKi8KKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoZGJ1c19tZXNzYWdlX2lzX2Vycm9yIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0VSUk9SX1NFUlZJQ0VfVU5LTk9XTikpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlKCJnb3Qgc2VydmljZSB1bmtub3duXG4iKTsKKyAgICAgICAgICA7IC8qIGdvb2QsIHRoaXMgaXMgZXhwZWN0ZWQgKG9ubHkgdmFsaWQgd2hlbiB1c2luZyBsYXVuY2ggaGVscGVyKSAqLworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICB3YXJuX3VuZXhwZWN0ZWQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsICJub3QgdGhpcyBlcnJvciIpOworCisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiRGlkIG5vdCBleHBlY3QgdG8gc3VjY2Vzc2Z1bGx5IGF1dG8tc3RhcnQgbWlzc2luZyBzZXJ2aWNlIik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgcmV0dmFsID0gVFJVRTsKKworIG91dDoKKyAgaWYgKG1lc3NhZ2UpCisgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCisjaWZuZGVmIERCVVNfV0lOCisKKyNkZWZpbmUgU0VSVklDRV9VU0VSX01JU1NJTkdfTkFNRSAib3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlTm9Vc2VyIgorCisvKiByZXR1cm5zIFRSVUUgaWYgdGhlIGNvcnJlY3QgdGhpbmcgaGFwcGVucywKKyAqIGJ1dCB0aGUgY29ycmVjdCB0aGluZyBtYXkgaW5jbHVkZSBPT00gZXJyb3JzLgorICovCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX2xhdW5jaF9zZXJ2aWNlX3VzZXJfbWlzc2luZyAoQnVzQ29udGV4dCAgICAgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBEQnVzTWVzc2FnZSAqbWVzc2FnZTsKKyAgZGJ1c191aW50MzJfdCBzZXJpYWw7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKworICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoU0VSVklDRV9VU0VSX01JU1NJTkdfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvb3JnL2ZyZWVkZXNrdG9wL1Rlc3RTdWl0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLlRlc3RTdWl0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRWNobyIpOworCisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoY29ubmVjdGlvbiwgbWVzc2FnZSwgJnNlcmlhbCkpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICBtZXNzYWdlID0gTlVMTDsKKworICBidXNfdGVzdF9ydW5fZXZlcnl0aGluZyAoY29udGV4dCk7CisgIGJsb2NrX2Nvbm5lY3Rpb25fdW50aWxfbWVzc2FnZV9mcm9tX2J1cyAoY29udGV4dCwgY29ubmVjdGlvbiwKKyAgCQkJCQkgICAicmVwbHkgdG8gc2VydmljZSB3aGljaCBzaG91bGQgZmFpbCB0byBhdXRvLXN0YXJ0IChtaXNzaW5nIFVzZXIpIik7CisgIGJ1c190ZXN0X3J1bl9ldmVyeXRoaW5nIChjb250ZXh0KTsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9nZXRfaXNfY29ubmVjdGVkIChjb25uZWN0aW9uKSkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiY29ubmVjdGlvbiB3YXMgZGlzY29ubmVjdGVkIik7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgcmV0dmFsID0gRkFMU0U7CisKKyAgbWVzc2FnZSA9IHBvcF9tZXNzYWdlX3dhaXRpbmdfZm9yX21lbW9yeSAoY29ubmVjdGlvbik7CisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkRpZCBub3QgcmVjZWl2ZSBhIHJlcGx5IHRvICVzICVkIG9uICVwIiwKKyAgICAgICAgICAgICAgICAgICJFY2hvIG1lc3NhZ2UgKGF1dG8gYWN0aXZhdGlvbikiLCBzZXJpYWwsIGNvbm5lY3Rpb24pOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIHZlcmJvc2VfbWVzc2FnZV9yZWNlaXZlZCAoY29ubmVjdGlvbiwgbWVzc2FnZSk7CisKKyAgaWYgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkgPT0gREJVU19NRVNTQUdFX1RZUEVfRVJST1IpCisgICAgeworICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfaGFzX3NlbmRlciAobWVzc2FnZSwgREJVU19TRVJWSUNFX0RCVVMpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoIk1lc3NhZ2UgaGFzIHdyb25nIHNlbmRlciAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9zZW5kZXIgKG1lc3NhZ2UpID8KKyAgICAgICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3NlbmRlciAobWVzc2FnZSkgOiAiKG5vbmUpIik7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgICAgaWYgKGRidXNfbWVzc2FnZV9pc19lcnJvciAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfTk9fTUVNT1JZKSkKKyAgICAgICAgeworICAgICAgICAgIDsgLyogZ29vZCwgdGhpcyBpcyBhIHZhbGlkIHJlc3BvbnNlICovCisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKGRidXNfbWVzc2FnZV9pc19lcnJvciAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9TUEFXTl9GSUxFX0lOVkFMSUQpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSgiZ290IHNlcnZpY2UgZmlsZSBpbnZhbGlkXG4iKTsKKyAgICAgICAgICA7IC8qIGdvb2QsIHRoaXMgaXMgZXhwZWN0ZWQgKG9ubHkgdmFsaWQgd2hlbiB1c2luZyBsYXVuY2ggaGVscGVyKSAqLworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICB3YXJuX3VuZXhwZWN0ZWQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsICJub3QgdGhpcyBlcnJvciIpOworCisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiRGlkIG5vdCBleHBlY3QgdG8gc3VjY2Vzc2Z1bGx5IGF1dG8tc3RhcnQgbWlzc2luZyBzZXJ2aWNlIik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgcmV0dmFsID0gVFJVRTsKKworIG91dDoKKyAgaWYgKG1lc3NhZ2UpCisgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCisjZGVmaW5lIFNFUlZJQ0VfRVhFQ19NSVNTSU5HX05BTUUgIm9yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZU5vRXhlYyIKKworLyogcmV0dXJucyBUUlVFIGlmIHRoZSBjb3JyZWN0IHRoaW5nIGhhcHBlbnMsCisgKiBidXQgdGhlIGNvcnJlY3QgdGhpbmcgbWF5IGluY2x1ZGUgT09NIGVycm9ycy4KKyAqLworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19sYXVuY2hfc2VydmljZV9leGVjX21pc3NpbmcgKEJ1c0NvbnRleHQgICAgICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisgIGRidXNfdWludDMyX3Qgc2VyaWFsOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisKKyAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKFNFUlZJQ0VfRVhFQ19NSVNTSU5HX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiL29yZy9mcmVlZGVza3RvcC9UZXN0U3VpdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5UZXN0U3VpdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVjaG8iKTsKKworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHJldHVybiBUUlVFOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX3NlbmQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsICZzZXJpYWwpKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgbWVzc2FnZSA9IE5VTEw7CisKKyAgYnVzX3Rlc3RfcnVuX2V2ZXJ5dGhpbmcgKGNvbnRleHQpOworICBibG9ja19jb25uZWN0aW9uX3VudGlsX21lc3NhZ2VfZnJvbV9idXMgKGNvbnRleHQsIGNvbm5lY3Rpb24sCisgIAkJCQkJICAgInJlcGx5IHRvIHNlcnZpY2Ugd2hpY2ggc2hvdWxkIGZhaWwgdG8gYXV0by1zdGFydCAobWlzc2luZyBFeGVjKSIpOworICBidXNfdGVzdF9ydW5fZXZlcnl0aGluZyAoY29udGV4dCk7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Nvbm5lY3RlZCAoY29ubmVjdGlvbikpCisgICAgeworICAgICAgX2RidXNfd2FybiAoImNvbm5lY3Rpb24gd2FzIGRpc2Nvbm5lY3RlZCIpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIHJldHZhbCA9IEZBTFNFOworCisgIG1lc3NhZ2UgPSBwb3BfbWVzc2FnZV93YWl0aW5nX2Zvcl9tZW1vcnkgKGNvbm5lY3Rpb24pOworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJEaWQgbm90IHJlY2VpdmUgYSByZXBseSB0byAlcyAlZCBvbiAlcCIsCisgICAgICAgICAgICAgICAgICAiRWNobyBtZXNzYWdlIChhdXRvIGFjdGl2YXRpb24pIiwgc2VyaWFsLCBjb25uZWN0aW9uKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICB2ZXJib3NlX21lc3NhZ2VfcmVjZWl2ZWQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UpOworCisgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKG1lc3NhZ2UpID09IERCVVNfTUVTU0FHRV9UWVBFX0VSUk9SKQorICAgIHsKKyAgICAgIGlmICghZGJ1c19tZXNzYWdlX2hhc19zZW5kZXIgKG1lc3NhZ2UsIERCVVNfU0VSVklDRV9EQlVTKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJNZXNzYWdlIGhhcyB3cm9uZyBzZW5kZXIgJXMiLAorICAgICAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfc2VuZGVyIChtZXNzYWdlKSA/CisgICAgICAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9zZW5kZXIgKG1lc3NhZ2UpIDogIihub25lKSIpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgIGlmIChkYnVzX21lc3NhZ2VfaXNfZXJyb3IgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0VSUk9SX05PX01FTU9SWSkpCisgICAgICAgIHsKKyAgICAgICAgICA7IC8qIGdvb2QsIHRoaXMgaXMgYSB2YWxpZCByZXNwb25zZSAqLworICAgICAgICB9CisgICAgICBlbHNlIGlmIChkYnVzX21lc3NhZ2VfaXNfZXJyb3IgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfU0VSVklDRV9VTktOT1dOKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UoImNvdWxkIG5vdCBhY3RpdmF0ZSBhcyBpbnZhbGlkIHNlcnZpY2UgZmlsZSB3YXMgbm90IGFkZGVkXG4iKTsKKyAgICAgICAgICA7IC8qIGdvb2QsIHRoaXMgaXMgZXhwZWN0ZWQgYXMgd2Ugc2hvdWxkbid0IGhhdmUgYmVlbiBhZGRlZCB0bworICAgICAgICAgICAgICogdGhlIGFjdGl2YXRpb24gbGlzdCB3aXRoIGEgbWlzc2luZyBFeGVjIGtleSAqLworICAgICAgICB9CisgICAgICBlbHNlIGlmIChkYnVzX21lc3NhZ2VfaXNfZXJyb3IgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfU1BBV05fRklMRV9JTlZBTElEKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UoImdvdCBzZXJ2aWNlIGZpbGUgaW52YWxpZFxuIik7CisgICAgICAgICAgOyAvKiBnb29kLCB0aGlzIGlzIGFsbG93ZWQsIGFuZCBpcyB0aGUgbWVzc2FnZSBwYXNzZWQgYmFjayBmcm9tIHRoZQorICAgICAgICAgICAgICogbGF1bmNoIGhlbHBlciAqLworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICB3YXJuX3VuZXhwZWN0ZWQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsICJub3QgdGhpcyBlcnJvciIpOworCisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiRGlkIG5vdCBleHBlY3QgdG8gc3VjY2Vzc2Z1bGx5IGF1dG8tc3RhcnQgbWlzc2luZyBzZXJ2aWNlIik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgcmV0dmFsID0gVFJVRTsKKworIG91dDoKKyAgaWYgKG1lc3NhZ2UpCisgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCisjZGVmaW5lIFNFUlZJQ0VfU0VSVklDRV9NSVNTSU5HX05BTUUgIm9yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZU5vU2VydmljZSIKKworLyogcmV0dXJucyBUUlVFIGlmIHRoZSBjb3JyZWN0IHRoaW5nIGhhcHBlbnMsCisgKiBidXQgdGhlIGNvcnJlY3QgdGhpbmcgbWF5IGluY2x1ZGUgT09NIGVycm9ycy4KKyAqLworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19sYXVuY2hfc2VydmljZV9zZXJ2aWNlX21pc3NpbmcgKEJ1c0NvbnRleHQgICAgICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisgIGRidXNfdWludDMyX3Qgc2VyaWFsOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisKKyAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKFNFUlZJQ0VfU0VSVklDRV9NSVNTSU5HX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiL29yZy9mcmVlZGVza3RvcC9UZXN0U3VpdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5UZXN0U3VpdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVjaG8iKTsKKworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHJldHVybiBUUlVFOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX3NlbmQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsICZzZXJpYWwpKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgbWVzc2FnZSA9IE5VTEw7CisKKyAgYnVzX3Rlc3RfcnVuX2V2ZXJ5dGhpbmcgKGNvbnRleHQpOworICBibG9ja19jb25uZWN0aW9uX3VudGlsX21lc3NhZ2VfZnJvbV9idXMgKGNvbnRleHQsIGNvbm5lY3Rpb24sCisgIAkJCQkJICAgInJlcGx5IHRvIHNlcnZpY2Ugd2hpY2ggc2hvdWxkIGZhaWwgdG8gYXV0by1zdGFydCAobWlzc2luZyBTZXJ2aWNlKSIpOworICBidXNfdGVzdF9ydW5fZXZlcnl0aGluZyAoY29udGV4dCk7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Nvbm5lY3RlZCAoY29ubmVjdGlvbikpCisgICAgeworICAgICAgX2RidXNfd2FybiAoImNvbm5lY3Rpb24gd2FzIGRpc2Nvbm5lY3RlZCIpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIHJldHZhbCA9IEZBTFNFOworCisgIG1lc3NhZ2UgPSBwb3BfbWVzc2FnZV93YWl0aW5nX2Zvcl9tZW1vcnkgKGNvbm5lY3Rpb24pOworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJEaWQgbm90IHJlY2VpdmUgYSByZXBseSB0byAlcyAlZCBvbiAlcCIsCisgICAgICAgICAgICAgICAgICAiRWNobyBtZXNzYWdlIChhdXRvIGFjdGl2YXRpb24pIiwgc2VyaWFsLCBjb25uZWN0aW9uKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICB2ZXJib3NlX21lc3NhZ2VfcmVjZWl2ZWQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UpOworCisgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKG1lc3NhZ2UpID09IERCVVNfTUVTU0FHRV9UWVBFX0VSUk9SKQorICAgIHsKKyAgICAgIGlmICghZGJ1c19tZXNzYWdlX2hhc19zZW5kZXIgKG1lc3NhZ2UsIERCVVNfU0VSVklDRV9EQlVTKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJNZXNzYWdlIGhhcyB3cm9uZyBzZW5kZXIgJXMiLAorICAgICAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfc2VuZGVyIChtZXNzYWdlKSA/CisgICAgICAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9zZW5kZXIgKG1lc3NhZ2UpIDogIihub25lKSIpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgIGlmIChkYnVzX21lc3NhZ2VfaXNfZXJyb3IgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0VSUk9SX05PX01FTU9SWSkpCisgICAgICAgIHsKKyAgICAgICAgICA7IC8qIGdvb2QsIHRoaXMgaXMgYSB2YWxpZCByZXNwb25zZSAqLworICAgICAgICB9CisgICAgICBlbHNlIGlmIChkYnVzX21lc3NhZ2VfaXNfZXJyb3IgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfU0VSVklDRV9VTktOT1dOKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UoImNvdWxkIG5vdCBhY3RpdmF0ZSBhcyBpbnZhbGlkIHNlcnZpY2UgZmlsZSB3YXMgbm90IGFkZGVkXG4iKTsKKyAgICAgICAgICA7IC8qIGdvb2QsIHRoaXMgaXMgZXhwZWN0ZWQgYXMgd2Ugc2hvdWxkbid0IGhhdmUgYmVlbiBhZGRlZCB0bworICAgICAgICAgICAgICogdGhlIGFjdGl2YXRpb24gbGlzdCB3aXRoIGEgbWlzc2luZyBFeGVjIGtleSAqLworICAgICAgICB9CisgICAgICBlbHNlIGlmIChkYnVzX21lc3NhZ2VfaXNfZXJyb3IgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfU1BBV05fRklMRV9JTlZBTElEKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UoImdvdCBzZXJ2aWNlIGZpbGUgaW52YWxpZFxuIik7CisgICAgICAgICAgOyAvKiBnb29kLCB0aGlzIGlzIGFsbG93ZWQsIGFuZCBpcyB0aGUgbWVzc2FnZSBwYXNzZWQgYmFjayBmcm9tIHRoZQorICAgICAgICAgICAgICogbGF1bmNoIGhlbHBlciAqLworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICB3YXJuX3VuZXhwZWN0ZWQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsICJub3QgdGhpcyBlcnJvciIpOworCisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiRGlkIG5vdCBleHBlY3QgdG8gc3VjY2Vzc2Z1bGx5IGF1dG8tc3RhcnQgbWlzc2luZyBzZXJ2aWNlIik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgcmV0dmFsID0gVFJVRTsKKworIG91dDoKKyAgaWYgKG1lc3NhZ2UpCisgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKworICByZXR1cm4gcmV0dmFsOworfQorI2VuZGlmCisKKyNkZWZpbmUgU0hFTExfRkFJTF9TRVJWSUNFX05BTUUgIm9yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZVNoZWxsRWNob1NlcnZpY2VGYWlsIgorCisvKiByZXR1cm5zIFRSVUUgaWYgdGhlIGNvcnJlY3QgdGhpbmcgaGFwcGVucywKKyAqIGJ1dCB0aGUgY29ycmVjdCB0aGluZyBtYXkgaW5jbHVkZSBPT00gZXJyb3JzLgorICovCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX3NoZWxsX2ZhaWxfc2VydmljZV9hdXRvX3N0YXJ0IChCdXNDb250ZXh0ICAgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisgIGRidXNfdWludDMyX3Qgc2VyaWFsOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisKKyAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKFNIRUxMX0ZBSUxfU0VSVklDRV9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9vcmcvZnJlZWRlc2t0b3AvVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFY2hvIik7CisKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICByZXR1cm4gVFJVRTsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZW5kIChjb25uZWN0aW9uLCBtZXNzYWdlLCAmc2VyaWFsKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIG1lc3NhZ2UgPSBOVUxMOworCisgIGJ1c190ZXN0X3J1bl9ldmVyeXRoaW5nIChjb250ZXh0KTsKKyAgYmxvY2tfY29ubmVjdGlvbl91bnRpbF9tZXNzYWdlX2Zyb21fYnVzIChjb250ZXh0LCBjb25uZWN0aW9uLCAicmVwbHkgdG8gc2hlbGwgRWNobyBvbiBzZXJ2aWNlIHdoaWNoIHNob3VsZCBmYWlsIHRvIGF1dG8tc3RhcnQiKTsKKyAgYnVzX3Rlc3RfcnVuX2V2ZXJ5dGhpbmcgKGNvbnRleHQpOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX2dldF9pc19jb25uZWN0ZWQgKGNvbm5lY3Rpb24pKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJjb25uZWN0aW9uIHdhcyBkaXNjb25uZWN0ZWRcbiIpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIHJldHZhbCA9IEZBTFNFOworCisgIG1lc3NhZ2UgPSBwb3BfbWVzc2FnZV93YWl0aW5nX2Zvcl9tZW1vcnkgKGNvbm5lY3Rpb24pOworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJEaWQgbm90IHJlY2VpdmUgYSByZXBseSB0byAlcyAlZCBvbiAlcCIsCisgICAgICAgICAgICAgICAgICAiRWNobyBtZXNzYWdlIChhdXRvIGFjdGl2YXRpb24pIiwgc2VyaWFsLCBjb25uZWN0aW9uKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICB2ZXJib3NlX21lc3NhZ2VfcmVjZWl2ZWQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UpOworCisgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKG1lc3NhZ2UpID09IERCVVNfTUVTU0FHRV9UWVBFX0VSUk9SKQorICAgIHsKKyAgICAgIGlmICghZGJ1c19tZXNzYWdlX2hhc19zZW5kZXIgKG1lc3NhZ2UsIERCVVNfU0VSVklDRV9EQlVTKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJNZXNzYWdlIGhhcyB3cm9uZyBzZW5kZXIgJXMiLAorICAgICAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfc2VuZGVyIChtZXNzYWdlKSA/CisgICAgICAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9zZW5kZXIgKG1lc3NhZ2UpIDogIihub25lKSIpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgIGlmIChkYnVzX21lc3NhZ2VfaXNfZXJyb3IgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0VSUk9SX05PX01FTU9SWSkpCisgICAgICAgIHsKKyAgICAgICAgICA7IC8qIGdvb2QsIHRoaXMgaXMgYSB2YWxpZCByZXNwb25zZSAqLworICAgICAgICB9CisgICAgICBlbHNlIGlmIChkYnVzX21lc3NhZ2VfaXNfZXJyb3IgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfSU5WQUxJRF9BUkdTKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UoImdvdCBpbnZhbGlkIGFyZ3NcbiIpOworICAgICAgICAgIDsgLyogZ29vZCwgdGhpcyBpcyBleHBlY3RlZCBhbHNvICovCisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHdhcm5fdW5leHBlY3RlZCAoY29ubmVjdGlvbiwgbWVzc2FnZSwgIm5vdCB0aGlzIGVycm9yIik7CisKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJEaWQgbm90IGV4cGVjdCB0byBzdWNjZXNzZnVsbHkgYXV0by1zdGFydCBzaGVsbCBmYWlsIHNlcnZpY2UiKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICByZXR2YWwgPSBUUlVFOworCisgb3V0OgorICBpZiAobWVzc2FnZSkKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKKyNkZWZpbmUgU0hFTExfU1VDQ0VTU19TRVJWSUNFX05BTUUgIm9yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZVNoZWxsRWNob1NlcnZpY2VTdWNjZXNzIgorCisvKiByZXR1cm5zIFRSVUUgaWYgdGhlIGNvcnJlY3QgdGhpbmcgaGFwcGVucywKKyAqIGJ1dCB0aGUgY29ycmVjdCB0aGluZyBtYXkgaW5jbHVkZSBPT00gZXJyb3JzLgorICovCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX3NoZWxsX3NlcnZpY2Vfc3VjY2Vzc19hdXRvX3N0YXJ0IChCdXNDb250ZXh0ICAgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisgIERCdXNNZXNzYWdlICpiYXNlX3NlcnZpY2VfbWVzc2FnZTsKKyAgZGJ1c191aW50MzJfdCBzZXJpYWw7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgY29uc3QgY2hhciAqYmFzZV9zZXJ2aWNlOworICBjb25zdCBjaGFyICphcmd2WzddID0ge05VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEx9OworCisgIGJhc2Vfc2VydmljZV9tZXNzYWdlID0gTlVMTDsKKworICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoU0hFTExfU1VDQ0VTU19TRVJWSUNFX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiL29yZy9mcmVlZGVza3RvcC9UZXN0U3VpdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5UZXN0U3VpdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVjaG8iKTsKKworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHJldHVybiBUUlVFOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX3NlbmQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsICZzZXJpYWwpKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgbWVzc2FnZSA9IE5VTEw7CisKKyAgYnVzX3Rlc3RfcnVuX2V2ZXJ5dGhpbmcgKGNvbnRleHQpOworCisgIC8qIG5vdyB3YWl0IGZvciB0aGUgbWVzc2FnZSBidXMgdG8gaGVhciBiYWNrIGZyb20gdGhlIGFjdGl2YXRlZAorICAgKiBzZXJ2aWNlLgorICAgKi8KKyAgYmxvY2tfY29ubmVjdGlvbl91bnRpbF9tZXNzYWdlX2Zyb21fYnVzIChjb250ZXh0LCBjb25uZWN0aW9uLCAicmVwbHkgdG8gRWNobyBvbiBzaGVsbCBzdWNjZXNzIHNlcnZpY2UiKTsKKyAgYnVzX3Rlc3RfcnVuX2V2ZXJ5dGhpbmcgKGNvbnRleHQpOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX2dldF9pc19jb25uZWN0ZWQgKGNvbm5lY3Rpb24pKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJjb25uZWN0aW9uIHdhcyBkaXNjb25uZWN0ZWRcbiIpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIHJldHZhbCA9IEZBTFNFOworCisgIG1lc3NhZ2UgPSBwb3BfbWVzc2FnZV93YWl0aW5nX2Zvcl9tZW1vcnkgKGNvbm5lY3Rpb24pOworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJEaWQgbm90IHJlY2VpdmUgYW55IG1lc3NhZ2VzIGFmdGVyIGF1dG8gc3RhcnQgJWQgb24gJXAiLAorICAgICAgICAgICAgICAgICAgc2VyaWFsLCBjb25uZWN0aW9uKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICB2ZXJib3NlX21lc3NhZ2VfcmVjZWl2ZWQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UpOworICBfZGJ1c192ZXJib3NlICgiICAoYWZ0ZXIgc2VuZGluZyAlcylcbiIsICJhdXRvIHN0YXJ0Iik7CisKKyAgLyogd2Ugc2hvdWxkIGdldCB6ZXJvIG9yIHR3byBTZXJ2aWNlT3duZXJDaGFuZ2VkIHNpZ25hbHMgKi8KKyAgaWYgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkgPT0gREJVU19NRVNTQUdFX1RZUEVfU0lHTkFMKQorICAgIHsKKyAgICAgIEdvdFNlcnZpY2VJbmZvIG1lc3NhZ2Vfa2luZDsKKworICAgICAgaWYgKCFjaGVja19iYXNlX3NlcnZpY2VfYWN0aXZhdGVkIChjb250ZXh0LCBjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLCAmYmFzZV9zZXJ2aWNlKSkKKyAgICAgICAgZ290byBvdXQ7CisKKyAgICAgIGJhc2Vfc2VydmljZV9tZXNzYWdlID0gbWVzc2FnZTsKKyAgICAgIG1lc3NhZ2UgPSBOVUxMOworCisgICAgICAvKiBXZSBtYXkgbmVlZCB0byBibG9jayBoZXJlIGZvciB0aGUgdGVzdCBzZXJ2aWNlIHRvIGV4aXQgb3IgZmluaXNoIHVwICovCisgICAgICBibG9ja19jb25uZWN0aW9uX3VudGlsX21lc3NhZ2VfZnJvbV9idXMgKGNvbnRleHQsIGNvbm5lY3Rpb24sICJzZXJ2aWNlIHRvIGV4aXQiKTsKKworICAgICAgLyogU2hvdWxkIGdldCBhIHNlcnZpY2UgY3JlYXRpb24gbm90aWZpY2F0aW9uIGZvciB0aGUgYWN0aXZhdGVkCisgICAgICAgKiBzZXJ2aWNlIG5hbWUsIG9yIGEgc2VydmljZSBkZWxldGlvbiBvbiB0aGUgYmFzZSBzZXJ2aWNlIG5hbWUKKyAgICAgICAqLworICAgICAgbWVzc2FnZSA9IGRidXNfY29ubmVjdGlvbl9ib3Jyb3dfbWVzc2FnZSAoY29ubmVjdGlvbik7CisgICAgICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoIk5vIG1lc3NhZ2UgYWZ0ZXIgYXV0byBhY3RpdmF0aW9uICIKKyAgICAgICAgICAgICAgICAgICAgICAiKHNob3VsZCBiZSBhIHNlcnZpY2UgYW5ub3VuY2VtZW50KSIpOworICAgICAgICAgIGRidXNfY29ubmVjdGlvbl9yZXR1cm5fbWVzc2FnZSAoY29ubmVjdGlvbiwgbWVzc2FnZSk7CisgICAgICAgICAgbWVzc2FnZSA9IE5VTEw7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgICAgbWVzc2FnZV9raW5kID0gY2hlY2tfZ290X3NlcnZpY2VfaW5mbyAobWVzc2FnZSk7CisKKyAgICAgIGRidXNfY29ubmVjdGlvbl9yZXR1cm5fbWVzc2FnZSAoY29ubmVjdGlvbiwgbWVzc2FnZSk7CisgICAgICBtZXNzYWdlID0gTlVMTDsKKworICAgICAgc3dpdGNoIChtZXNzYWdlX2tpbmQpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBHT1RfU0VSVklDRV9DUkVBVEVEOgorICAgICAgICAgIG1lc3NhZ2UgPSBwb3BfbWVzc2FnZV93YWl0aW5nX2Zvcl9tZW1vcnkgKGNvbm5lY3Rpb24pOworICAgICAgICAgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJGYWlsZWQgdG8gcG9wIG1lc3NhZ2Ugd2UganVzdCBwdXQgYmFjayEgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAic2hvdWxkIGhhdmUgYmVlbiBhIE5hbWVPd25lckNoYW5nZWQgKGNyZWF0aW9uKSIpOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIC8qIENoZWNrIHRoYXQgU2VydmljZU93bmVyQ2hhbmdlZCAoY3JlYXRpb24pIHdhcyBjb3JyZWN0bHkgcmVjZWl2ZWQgKi8KKyAgICAgICAgICBpZiAoIWNoZWNrX3NlcnZpY2VfYXV0b19hY3RpdmF0ZWQgKGNvbnRleHQsIGNvbm5lY3Rpb24sIFNIRUxMX1NVQ0NFU1NfU0VSVklDRV9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZV9zZXJ2aWNlLCBtZXNzYWdlKSkKKyAgICAgICAgICAgIGdvdG8gb3V0OworCisgICAgICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgICAgICBtZXNzYWdlID0gTlVMTDsKKworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgR09UX1NFUlZJQ0VfREVMRVRFRDoKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBUaGUgc2VydmljZSBzdGFydGVkIHVwIGFuZCBnb3QgYSBiYXNlIGFkZHJlc3MsIGJ1dCB0aGVuCisgICAgICAgICAgICAgKiBmYWlsZWQgdG8gcmVnaXN0ZXIgdW5kZXIgU0hFTExfU1VDQ0VTU19TRVJWSUNFX05BTUUKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgQ2hlY2tTZXJ2aWNlT3duZXJDaGFuZ2VkRGF0YSBzb2NkOworCisgICAgICAgICAgICBzb2NkLmV4cGVjdGVkX2tpbmQgPSBTRVJWSUNFX0RFTEVURUQ7CisgICAgICAgICAgICBzb2NkLmV4cGVjdGVkX3NlcnZpY2VfbmFtZSA9IGJhc2Vfc2VydmljZTsKKyAgICAgICAgICAgIHNvY2QuZmFpbGVkID0gRkFMU0U7CisgICAgICAgICAgICBzb2NkLnNraXBfY29ubmVjdGlvbiA9IE5VTEw7CisgICAgICAgICAgICBzb2NkLmNvbnRleHQgPSBjb250ZXh0OworCisgICAgICAgICAgICBidXNfdGVzdF9jbGllbnRzX2ZvcmVhY2ggKGNoZWNrX3NlcnZpY2Vfb3duZXJfY2hhbmdlZF9mb3JlYWNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc29jZCk7CisKKyAgICAgICAgICAgIGlmIChzb2NkLmZhaWxlZCkKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEdPVF9FUlJPUjoKKyAgICAgICAgY2FzZSBHT1RfU09NRVRISU5HX0VMU0U6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgX2RidXNfd2FybiAoIlVuZXhwZWN0ZWQgbWVzc2FnZSBhZnRlciBhdXRvIGFjdGl2YXRpb24iKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgIH0KKworICAvKiBPSywgbm93IHdlJ3ZlIGRlYWx0IHdpdGggU2VydmljZU93bmVyQ2hhbmdlZCBzaWduYWxzLCBub3cgc2hvdWxkCisgICAqIGNvbWUgdGhlIG1ldGhvZCByZXBseSAob3IgZXJyb3IpIGZyb20gdGhlIGluaXRpYWwgbWV0aG9kIGNhbGwKKyAgICovCisKKyAgLyogTm90ZTogaWYgdGhpcyB0ZXN0IGlzIHJ1biBpbiBPT00gbW9kZSwgaXQgd2lsbCBibG9jayB3aGVuIHRoZSBidXMKKyAgICogZG9lc24ndCBzZW5kIGEgcmVwbHkgZHVlIHRvIE9PTS4KKyAgICovCisgIGJsb2NrX2Nvbm5lY3Rpb25fdW50aWxfbWVzc2FnZV9mcm9tX2J1cyAoY29udGV4dCwgY29ubmVjdGlvbiwgInJlcGx5IGZyb20gZWNobyBtZXNzYWdlIGFmdGVyIGF1dG8tYWN0aXZhdGlvbiIpOworCisgIG1lc3NhZ2UgPSBwb3BfbWVzc2FnZV93YWl0aW5nX2Zvcl9tZW1vcnkgKGNvbm5lY3Rpb24pOworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJGYWlsZWQgdG8gcG9wIG1lc3NhZ2UhIFNob3VsZCBoYXZlIGJlZW4gcmVwbHkgZnJvbSBlY2hvIG1lc3NhZ2UiKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAoZGJ1c19tZXNzYWdlX2dldF9yZXBseV9zZXJpYWwgKG1lc3NhZ2UpICE9IHNlcmlhbCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiV3JvbmcgcmVwbHkgc2VyaWFsIik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MgKG1lc3NhZ2UsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmYXJndlswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZhcmd2WzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJmFyZ3ZbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmYXJndlszXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZhcmd2WzRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJmFyZ3ZbNV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmYXJndls2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiRXJyb3IgZ2V0dGluZyBhcmd1bWVudHMgZnJvbSByZXR1cm4iKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAgLyogZG9uJ3Qgd29ycnkgYWJvdXQgYXJnWzBdIGFzIGl0IG1heSBiZSBkaWZmZXJlbnQKKyAgICAgIGRlcGVuZGluZyBvbiB0aGUgcGF0aCB0byB0aGUgdGVzdHMKKyAgICovCisgIGlmIChzdHJjbXAoIi10ZXN0IiwgYXJndlsxXSkgIT0gMCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiVW5leHBlY3RlZCBhcmd2WzFdIGluIHNoZWxsIHN1Y2Nlc3Mgc2VydmljZSB0ZXN0IChleHBlY3RlZDogJXMsIGdvdDogJXMpIiwKKyAgICAgICAgICAgICAgICAgICItdGVzdCIsIGFyZ3ZbMV0pOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIGlmIChzdHJjbXAoInRoYXQiLCBhcmd2WzJdKSAhPSAwKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJVbmV4cGVjdGVkIGFyZ3ZbMl0gaW4gc2hlbGwgc3VjY2VzcyBzZXJ2aWNlIHRlc3QgKGV4cGVjdGVkOiAlcywgZ290OiAlcykiLAorICAgICAgICAgICAgICAgICAgICJ0aGF0IiwgYXJndlsyXSk7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgaWYgKHN0cmNtcCgid2UgZ2V0IiwgYXJndlszXSkgIT0gMCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiVW5leHBlY3RlZCBhcmd2WzNdIGluIHNoZWxsIHN1Y2Nlc3Mgc2VydmljZSB0ZXN0IChleHBlY3RlZDogJXMsIGdvdDogJXMpIiwKKyAgICAgICAgICAgICAgICAgICAid2UgZ2V0IiwgYXJndlszXSk7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgaWYgKHN0cmNtcCgiYmFjayIsIGFyZ3ZbNF0pICE9IDApCisgICAgeworICAgICAgX2RidXNfd2FybiAoIlVuZXhwZWN0ZWQgYXJndls0XSBpbiBzaGVsbCBzdWNjZXNzIHNlcnZpY2UgdGVzdCAoZXhwZWN0ZWQ6ICVzLCBnb3Q6ICVzKSIsCisgICAgICAgICAgICAgICAgICAgImJhY2siLCBhcmd2WzRdKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAoc3RyY21wKCItLXdoYXQiLCBhcmd2WzVdKSAhPSAwKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJVbmV4cGVjdGVkIGFyZ3ZbNV0gaW4gc2hlbGwgc3VjY2VzcyBzZXJ2aWNlIHRlc3QgKGV4cGVjdGVkOiAlcywgZ290OiAlcykiLAorICAgICAgICAgICAgICAgICAgICItLXdoYXQiLCBhcmd2WzVdKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAoc3RyY21wKCJ3ZSBwdXQgaW4iLCBhcmd2WzZdKSAhPSAwKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJVbmV4cGVjdGVkIGFyZ3ZbNl0gaW4gc2hlbGwgc3VjY2VzcyBzZXJ2aWNlIHRlc3QgKGV4cGVjdGVkOiAlcywgZ290OiAlcykiLAorICAgICAgICAgICAgICAgICAgICJ3ZSBwdXQgaW4iLCBhcmd2WzZdKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICBtZXNzYWdlID0gTlVMTDsKKworICBpZiAoIWNoZWNrX3NlbmRfZXhpdF90b19zZXJ2aWNlIChjb250ZXh0LCBjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSEVMTF9TVUNDRVNTX1NFUlZJQ0VfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZV9zZXJ2aWNlKSkKKyAgICBnb3RvIG91dDsKKworICByZXR2YWwgPSBUUlVFOworCisgb3V0OgorICBpZiAobWVzc2FnZSkKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworCisgIGlmIChiYXNlX3NlcnZpY2VfbWVzc2FnZSkKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKGJhc2Vfc2VydmljZV9tZXNzYWdlKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCit0eXBlZGVmIHN0cnVjdAoreworICBDaGVjazFGdW5jIGZ1bmM7CisgIEJ1c0NvbnRleHQgKmNvbnRleHQ7Cit9IENoZWNrMURhdGE7CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorY2hlY2tfb29tX2NoZWNrMV9mdW5jICh2b2lkICpkYXRhKQoreworICBDaGVjazFEYXRhICpkID0gZGF0YTsKKworICBpZiAoISAoKiBkLT5mdW5jKSAoZC0+Y29udGV4dCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghY2hlY2tfbm9fbGVmdG92ZXJzIChkLT5jb250ZXh0KSkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiTWVzc2FnZXMgd2VyZSBsZWZ0IG92ZXIsIHNob3VsZCBiZSBjb3ZlcmVkIGJ5IHRlc3Qgc3VpdGUiKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitjaGVjazFfdHJ5X2l0ZXJhdGlvbnMgKEJ1c0NvbnRleHQgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRlc2NyaXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICBDaGVjazFGdW5jICBmdW5jKQoreworICBDaGVjazFEYXRhIGQ7CisKKyAgZC5mdW5jID0gZnVuYzsKKyAgZC5jb250ZXh0ID0gY29udGV4dDsKKworICBpZiAoIV9kYnVzX3Rlc3Rfb29tX2hhbmRsaW5nIChkZXNjcmlwdGlvbiwgY2hlY2tfb29tX2NoZWNrMV9mdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgidGVzdCBmYWlsZWQiKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19nZXRfc2VydmljZXMgKEJ1c0NvbnRleHQgICAgICpjb250ZXh0LAorCQkgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCSAgICBjb25zdCBjaGFyICAgICAqbWV0aG9kLAorCQkgICAgY2hhciAgICAgICAgICoqKnNlcnZpY2VzLAorCQkgICAgaW50ICAgICAgICAgICAgKmxlbikKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisgIGRidXNfdWludDMyX3Qgc2VyaWFsOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIERCdXNFcnJvciBlcnJvcjsKKyAgY2hhciAqKnNydnM7CisgIGludCBsOworCisgIHJldHZhbCA9IEZBTFNFOworICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisgIG1lc3NhZ2UgPSBOVUxMOworCisgIG1lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsIChEQlVTX1NFUlZJQ0VfREJVUywKKwkJCQkJICBEQlVTX1BBVEhfREJVUywKKwkJCQkJICBEQlVTX0lOVEVSRkFDRV9EQlVTLAorCQkJCQkgIG1ldGhvZCk7CisKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICByZXR1cm4gVFJVRTsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZW5kIChjb25uZWN0aW9uLCBtZXNzYWdlLCAmc2VyaWFsKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIC8qIHNlbmQgb3VyIG1lc3NhZ2UgKi8KKyAgYnVzX3Rlc3RfcnVuX2NsaWVudHNfbG9vcCAoU0VORF9QRU5ESU5HIChjb25uZWN0aW9uKSk7CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgbWVzc2FnZSA9IE5VTEw7CisKKyAgZGJ1c19jb25uZWN0aW9uX3JlZiAoY29ubmVjdGlvbik7IC8qIGJlY2F1c2Ugd2UgbWF5IGdldCBkaXNjb25uZWN0ZWQgKi8KKyAgYmxvY2tfY29ubmVjdGlvbl91bnRpbF9tZXNzYWdlX2Zyb21fYnVzIChjb250ZXh0LCBjb25uZWN0aW9uLCAicmVwbHkgdG8gTGlzdEFjdGl2YXRhYmxlTmFtZXMvTGlzdE5hbWVzIik7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Nvbm5lY3RlZCAoY29ubmVjdGlvbikpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoImNvbm5lY3Rpb24gd2FzIGRpc2Nvbm5lY3RlZFxuIik7CisKKyAgICAgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoY29ubmVjdGlvbik7CisKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGNvbm5lY3Rpb24pOworCisgIG1lc3NhZ2UgPSBwb3BfbWVzc2FnZV93YWl0aW5nX2Zvcl9tZW1vcnkgKGNvbm5lY3Rpb24pOworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJEaWQgbm90IHJlY2VpdmUgYSByZXBseSB0byAlcyAlZCBvbiAlcCIsCisJCSAgbWV0aG9kLCBzZXJpYWwsIGNvbm5lY3Rpb24pOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIHZlcmJvc2VfbWVzc2FnZV9yZWNlaXZlZCAoY29ubmVjdGlvbiwgbWVzc2FnZSk7CisKKyAgaWYgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkgPT0gREJVU19NRVNTQUdFX1RZUEVfRVJST1IpCisgICAgeworICAgICAgaWYgKGRidXNfbWVzc2FnZV9pc19lcnJvciAobWVzc2FnZSwgREJVU19FUlJPUl9OT19NRU1PUlkpKQorCXsKKwkgIDsgLyogZ29vZCwgdGhpcyBpcyBhIHZhbGlkIHJlc3BvbnNlICovCisJfQorICAgICAgZWxzZQorCXsKKwkgIHdhcm5fdW5leHBlY3RlZCAoY29ubmVjdGlvbiwgbWVzc2FnZSwgIm5vdCB0aGlzIGVycm9yIik7CisKKwkgIGdvdG8gb3V0OworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlKSA9PSBEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfUkVUVVJOKQorCXsKKwkgIDsgLyogZ29vZCwgZXhwZWN0ZWQgKi8KKwl9CisgICAgICBlbHNlCisJeworCSAgd2Fybl91bmV4cGVjdGVkIChjb25uZWN0aW9uLCBtZXNzYWdlLAorCQkJICAgIm1ldGhvZF9yZXR1cm4gZm9yIExpc3RBY3RpdmF0YWJsZU5hbWVzL0xpc3ROYW1lcyIpOworCisJICBnb3RvIG91dDsKKwl9CisKKyAgICByZXRyeV9nZXRfcHJvcGVydHk6CisKKyAgICAgIGlmICghZGJ1c19tZXNzYWdlX2dldF9hcmdzIChtZXNzYWdlLCAmZXJyb3IsCisJCQkJICBEQlVTX1RZUEVfQVJSQVksCisJCQkJICBEQlVTX1RZUEVfU1RSSU5HLAorCQkJCSAgJnNydnMsICZsLAorCQkJCSAgREJVU19UWVBFX0lOVkFMSUQpKQorCXsKKwkgIGlmIChkYnVzX2Vycm9yX2hhc19uYW1lICgmZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZKSkKKwkgICAgeworCSAgICAgIF9kYnVzX3ZlcmJvc2UgKCJubyBtZW1vcnkgdG8gbGlzdCBzZXJ2aWNlcyBieSAlc1xuIiwgbWV0aG9kKTsKKwkgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisJICAgICAgX2RidXNfd2FpdF9mb3JfbWVtb3J5ICgpOworCSAgICAgIGdvdG8gcmV0cnlfZ2V0X3Byb3BlcnR5OworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBfZGJ1c19hc3NlcnQgKGRidXNfZXJyb3JfaXNfc2V0ICgmZXJyb3IpKTsKKwkgICAgICBfZGJ1c193YXJuICgiRGlkIG5vdCBnZXQgdGhlIGV4cGVjdGVkIERCVVNfVFlQRV9BUlJBWSBmcm9tICVzIiwgbWV0aG9kKTsKKwkgICAgICBnb3RvIG91dDsKKwkgICAgfQorCX0gZWxzZSB7CisJICAqc2VydmljZXMgPSBzcnZzOworCSAgKmxlbiA9IGw7CisJfQorICAgIH0KKworICBpZiAoIWNoZWNrX25vX2xlZnRvdmVycyAoY29udGV4dCkpCisgICAgZ290byBvdXQ7CisKKyAgcmV0dmFsID0gVFJVRTsKKworIG91dDoKKyAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworCisgIGlmIChtZXNzYWdlKQorICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyogcmV0dXJucyBUUlVFIGlmIHRoZSBjb3JyZWN0IHRoaW5nIGhhcHBlbnMsCisgKiBidXQgdGhlIGNvcnJlY3QgdGhpbmcgbWF5IGluY2x1ZGUgT09NIGVycm9ycy4KKyAqLworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19saXN0X3NlcnZpY2VzIChCdXNDb250ZXh0ICAgICAqY29udGV4dCwKKwkJICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgREJ1c01lc3NhZ2UgICptZXNzYWdlOworICBEQnVzTWVzc2FnZSAgKmJhc2Vfc2VydmljZV9tZXNzYWdlOworICBjb25zdCBjaGFyICAgKmJhc2Vfc2VydmljZTsKKyAgZGJ1c191aW50MzJfdCBzZXJpYWw7CisgIGRidXNfYm9vbF90ICAgcmV0dmFsOworICBjb25zdCBjaGFyICAgKmV4aXN0ZW50ID0gRVhJU1RFTlRfU0VSVklDRV9OQU1FOworICBkYnVzX3VpbnQzMl90IGZsYWdzOworICBjaGFyICAgICAgICAqKnNlcnZpY2VzOworICBpbnQgICAgICAgICAgIGxlbjsKKworICBfZGJ1c192ZXJib3NlICgiY2hlY2tfbGlzdF9zZXJ2aWNlcyBmb3IgJXBcbiIsIGNvbm5lY3Rpb24pOworCisgIGlmICghY2hlY2tfZ2V0X3NlcnZpY2VzIChjb250ZXh0LCBjb25uZWN0aW9uLCAiTGlzdEFjdGl2YXRhYmxlTmFtZXMiLCAmc2VydmljZXMsICZsZW4pKQorICAgIHsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19hcnJheV9jb250YWlucyAoKGNvbnN0IGNoYXIgKiopc2VydmljZXMsIGV4aXN0ZW50KSkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiRGlkIG5vdCBnZXQgdGhlIGV4cGVjdGVkICVzIGZyb20gTGlzdEFjdGl2YXRhYmxlTmFtZXMiLCBleGlzdGVudCk7CisgICAgICBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5IChzZXJ2aWNlcyk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGRidXNfZnJlZV9zdHJpbmdfYXJyYXkgKHNlcnZpY2VzKTsKKworICBiYXNlX3NlcnZpY2VfbWVzc2FnZSA9IE5VTEw7CisKKyAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKERCVVNfU0VSVklDRV9EQlVTLAorCQkJCQkgIERCVVNfUEFUSF9EQlVTLAorCQkJCQkgIERCVVNfSU5URVJGQUNFX0RCVVMsCisJCQkJCSAgIlN0YXJ0U2VydmljZUJ5TmFtZSIpOworCisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgZGJ1c19tZXNzYWdlX3NldF9hdXRvX3N0YXJ0IChtZXNzYWdlLCBGQUxTRSk7CisKKyAgZmxhZ3MgPSAwOworICBpZiAoIWRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAobWVzc2FnZSwKKwkJCQkgREJVU19UWVBFX1NUUklORywgJmV4aXN0ZW50LAorCQkJCSBEQlVTX1RZUEVfVUlOVDMyLCAmZmxhZ3MsCisJCQkJIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGlmICghZGJ1c19jb25uZWN0aW9uX3NlbmQgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsICZzZXJpYWwpKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgbWVzc2FnZSA9IE5VTEw7CisKKyAgYnVzX3Rlc3RfcnVuX2V2ZXJ5dGhpbmcgKGNvbnRleHQpOworCisgIC8qIG5vdyB3YWl0IGZvciB0aGUgbWVzc2FnZSBidXMgdG8gaGVhciBiYWNrIGZyb20gdGhlIGFjdGl2YXRlZAorICAgKiBzZXJ2aWNlLgorICAgKi8KKyAgYmxvY2tfY29ubmVjdGlvbl91bnRpbF9tZXNzYWdlX2Zyb21fYnVzIChjb250ZXh0LCBjb25uZWN0aW9uLCAiYWN0aXZhdGVkIHNlcnZpY2UgdG8gY29ubmVjdCIpOworCisgIGJ1c190ZXN0X3J1bl9ldmVyeXRoaW5nIChjb250ZXh0KTsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9nZXRfaXNfY29ubmVjdGVkIChjb25uZWN0aW9uKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiY29ubmVjdGlvbiB3YXMgZGlzY29ubmVjdGVkXG4iKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICByZXR2YWwgPSBGQUxTRTsKKworICBtZXNzYWdlID0gcG9wX21lc3NhZ2Vfd2FpdGluZ19mb3JfbWVtb3J5IChjb25uZWN0aW9uKTsKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiRGlkIG5vdCByZWNlaXZlIGFueSBtZXNzYWdlcyBhZnRlciAlcyAlZCBvbiAlcCIsCisJCSAgIlN0YXJ0U2VydmljZUJ5TmFtZSIsIHNlcmlhbCwgY29ubmVjdGlvbik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgdmVyYm9zZV9tZXNzYWdlX3JlY2VpdmVkIChjb25uZWN0aW9uLCBtZXNzYWdlKTsKKyAgX2RidXNfdmVyYm9zZSAoIiAgKGFmdGVyIHNlbmRpbmcgJXMpXG4iLCAiU3RhcnRTZXJ2aWNlQnlOYW1lIik7CisKKyAgaWYgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkgPT0gREJVU19NRVNTQUdFX1RZUEVfRVJST1IpCisgICAgeworICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfaGFzX3NlbmRlciAobWVzc2FnZSwgREJVU19TRVJWSUNFX0RCVVMpKQorCXsKKwkgIF9kYnVzX3dhcm4gKCJNZXNzYWdlIGhhcyB3cm9uZyBzZW5kZXIgJXMiLAorCQkgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3NlbmRlciAobWVzc2FnZSkgPworCQkgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3NlbmRlciAobWVzc2FnZSkgOiAiKG5vbmUpIik7CisJICBnb3RvIG91dDsKKwl9CisKKyAgICAgIGlmIChkYnVzX21lc3NhZ2VfaXNfZXJyb3IgKG1lc3NhZ2UsCisJCQkJIERCVVNfRVJST1JfTk9fTUVNT1JZKSkKKwl7CisJICA7IC8qIGdvb2QsIHRoaXMgaXMgYSB2YWxpZCByZXNwb25zZSAqLworCX0KKyAgICAgIGVsc2UgaWYgKGRidXNfbWVzc2FnZV9pc19lcnJvciAobWVzc2FnZSwKKwkJCQkgICAgICBEQlVTX0VSUk9SX1NQQVdOX0NISUxEX0VYSVRFRCkgfHwKKwkgICAgICAgZGJ1c19tZXNzYWdlX2lzX2Vycm9yIChtZXNzYWdlLAorCQkJCSAgICAgIERCVVNfRVJST1JfU1BBV05fQ0hJTERfU0lHTkFMRUQpIHx8CisJICAgICAgIGRidXNfbWVzc2FnZV9pc19lcnJvciAobWVzc2FnZSwKKwkJCQkgICAgICBEQlVTX0VSUk9SX1NQQVdOX0VYRUNfRkFJTEVEKSkKKwl7CisJICA7IC8qIGdvb2QsIHRoaXMgaXMgZXhwZWN0ZWQgYWxzbyAqLworCX0KKyAgICAgIGVsc2UKKwl7CisJICBfZGJ1c193YXJuICgiRGlkIG5vdCBleHBlY3QgZXJyb3IgJXMiLAorCQkgICAgICBkYnVzX21lc3NhZ2VfZ2V0X2Vycm9yX25hbWUgKG1lc3NhZ2UpKTsKKwkgIGdvdG8gb3V0OworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBHb3RTZXJ2aWNlSW5mbyBtZXNzYWdlX2tpbmQ7CisKKyAgICAgIGlmICghY2hlY2tfYmFzZV9zZXJ2aWNlX2FjdGl2YXRlZCAoY29udGV4dCwgY29ubmVjdGlvbiwKKwkJCQkJIG1lc3NhZ2UsICZiYXNlX3NlcnZpY2UpKQorCWdvdG8gb3V0OworCisgICAgICBiYXNlX3NlcnZpY2VfbWVzc2FnZSA9IG1lc3NhZ2U7CisgICAgICBtZXNzYWdlID0gTlVMTDsKKworICAgICAgLyogV2UgbWF5IG5lZWQgdG8gYmxvY2sgaGVyZSBmb3IgdGhlIHRlc3Qgc2VydmljZSB0byBleGl0IG9yIGZpbmlzaCB1cCAqLworICAgICAgYmxvY2tfY29ubmVjdGlvbl91bnRpbF9tZXNzYWdlX2Zyb21fYnVzIChjb250ZXh0LCBjb25uZWN0aW9uLCAidGVzdCBzZXJ2aWNlIHRvIGV4aXQgb3IgZmluaXNoIHVwIik7CisKKyAgICAgIG1lc3NhZ2UgPSBkYnVzX2Nvbm5lY3Rpb25fYm9ycm93X21lc3NhZ2UgKGNvbm5lY3Rpb24pOworICAgICAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKwl7CisJICBfZGJ1c193YXJuICgiRGlkIG5vdCByZWNlaXZlIGFueSBtZXNzYWdlcyBhZnRlciBiYXNlIHNlcnZpY2UgY3JlYXRpb24gbm90aWZpY2F0aW9uIik7CisJICBnb3RvIG91dDsKKwl9CisKKyAgICAgIG1lc3NhZ2Vfa2luZCA9IGNoZWNrX2dvdF9zZXJ2aWNlX2luZm8gKG1lc3NhZ2UpOworCisgICAgICBkYnVzX2Nvbm5lY3Rpb25fcmV0dXJuX21lc3NhZ2UgKGNvbm5lY3Rpb24sIG1lc3NhZ2UpOworICAgICAgbWVzc2FnZSA9IE5VTEw7CisKKyAgICAgIHN3aXRjaCAobWVzc2FnZV9raW5kKQorCXsKKwljYXNlIEdPVF9TT01FVEhJTkdfRUxTRToKKwljYXNlIEdPVF9FUlJPUjoKKwljYXNlIEdPVF9TRVJWSUNFX0RFTEVURUQ6CisJZGVmYXVsdDoKKwkgIF9kYnVzX3dhcm4gKCJVbmV4cGVjdGVkIG1lc3NhZ2UgYWZ0ZXIgQWN0aXZhdGVTZXJ2aWNlICIKKwkJICAgICAgIihzaG91bGQgYmUgYW4gZXJyb3Igb3IgYSBzZXJ2aWNlIGFubm91bmNlbWVudCkiKTsKKwkgIGdvdG8gb3V0OworCisJY2FzZSBHT1RfU0VSVklDRV9DUkVBVEVEOgorCSAgbWVzc2FnZSA9IHBvcF9tZXNzYWdlX3dhaXRpbmdfZm9yX21lbW9yeSAoY29ubmVjdGlvbik7CisJICBpZiAobWVzc2FnZSA9PSBOVUxMKQorCSAgICB7CisJICAgICAgX2RidXNfd2FybiAoIkZhaWxlZCB0byBwb3AgbWVzc2FnZSB3ZSBqdXN0IHB1dCBiYWNrISAiCisJCQkgICJzaG91bGQgaGF2ZSBiZWVuIGEgTmFtZU93bmVyQ2hhbmdlZCAoY3JlYXRpb24pIik7CisJICAgICAgZ290byBvdXQ7CisJICAgIH0KKworCSAgaWYgKCFjaGVja19zZXJ2aWNlX2FjdGl2YXRlZCAoY29udGV4dCwgY29ubmVjdGlvbiwgRVhJU1RFTlRfU0VSVklDRV9OQU1FLAorCQkJCQliYXNlX3NlcnZpY2UsIG1lc3NhZ2UpKQorCSAgICBnb3RvIG91dDsKKworCSAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKwkgIG1lc3NhZ2UgPSBOVUxMOworCisJICBpZiAoIWNoZWNrX25vX2xlZnRvdmVycyAoY29udGV4dCkpCisJICAgIHsKKwkgICAgICBfZGJ1c193YXJuICgiTWVzc2FnZXMgd2VyZSBsZWZ0IG92ZXIgYWZ0ZXIgc3VjY2Vzc2Z1bCBhY3RpdmF0aW9uIik7CisJICAgICAgZ290byBvdXQ7CisJICAgIH0KKworCSAgYnJlYWs7CisJfQorICAgIH0KKworICBpZiAoIWNoZWNrX2dldF9zZXJ2aWNlcyAoY29udGV4dCwgY29ubmVjdGlvbiwgIkxpc3ROYW1lcyIsICZzZXJ2aWNlcywgJmxlbikpCisgICAgeworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX2FycmF5X2NvbnRhaW5zICgoY29uc3QgY2hhciAqKilzZXJ2aWNlcywgZXhpc3RlbnQpKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJEaWQgbm90IGdldCB0aGUgZXhwZWN0ZWQgJXMgZnJvbSBMaXN0TmFtZXMiLCBleGlzdGVudCk7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgZGJ1c19mcmVlX3N0cmluZ19hcnJheSAoc2VydmljZXMpOworCisgIGlmICghY2hlY2tfc2VuZF9leGl0X3RvX3NlcnZpY2UgKGNvbnRleHQsIGNvbm5lY3Rpb24sCisJCQkJICAgRVhJU1RFTlRfU0VSVklDRV9OQU1FLCBiYXNlX3NlcnZpY2UpKQorICAgIGdvdG8gb3V0OworCisgIHJldHZhbCA9IFRSVUU7CisKKyBvdXQ6CisgIGlmIChtZXNzYWdlKQorICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisKKyAgaWYgKGJhc2Vfc2VydmljZV9tZXNzYWdlKQorICAgIGRidXNfbWVzc2FnZV91bnJlZiAoYmFzZV9zZXJ2aWNlX21lc3NhZ2UpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIENoZWNrMkZ1bmMgZnVuYzsKKyAgQnVzQ29udGV4dCAqY29udGV4dDsKKyAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247Cit9IENoZWNrMkRhdGE7CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorY2hlY2tfb29tX2NoZWNrMl9mdW5jICh2b2lkICpkYXRhKQoreworICBDaGVjazJEYXRhICpkID0gZGF0YTsKKworICBpZiAoISAoKiBkLT5mdW5jKSAoZC0+Y29udGV4dCwgZC0+Y29ubmVjdGlvbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghY2hlY2tfbm9fbGVmdG92ZXJzIChkLT5jb250ZXh0KSkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiTWVzc2FnZXMgd2VyZSBsZWZ0IG92ZXIsIHNob3VsZCBiZSBjb3ZlcmVkIGJ5IHRlc3Qgc3VpdGUiKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitjaGVjazJfdHJ5X2l0ZXJhdGlvbnMgKEJ1c0NvbnRleHQgICAgICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKmRlc2NyaXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICBDaGVjazJGdW5jICAgICAgZnVuYykKK3sKKyAgQ2hlY2syRGF0YSBkOworCisgIGQuZnVuYyA9IGZ1bmM7CisgIGQuY29udGV4dCA9IGNvbnRleHQ7CisgIGQuY29ubmVjdGlvbiA9IGNvbm5lY3Rpb247CisKKyAgaWYgKCFfZGJ1c190ZXN0X29vbV9oYW5kbGluZyAoZGVzY3JpcHRpb24sIGNoZWNrX29vbV9jaGVjazJfZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmQpKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCIlcyBmYWlsZWQgZHVyaW5nIG9vbSIsIGRlc2NyaXB0aW9uKTsKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInRlc3QgZmFpbGVkIik7CisgICAgfQorfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3NldGVudl9URVNUX0xBVU5DSF9IRUxQRVJfQ09ORklHKGNvbnN0IERCdXNTdHJpbmcgKnRlc3RfZGF0YV9kaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICpmaWxlbmFtZSkKK3sKKyAgREJ1c1N0cmluZyBmdWxsOworICBEQnVzU3RyaW5nIGZpbGU7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmZ1bGwpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5ICh0ZXN0X2RhdGFfZGlyLCAwLCAmZnVsbCwgMCkpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmdWxsKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZmaWxlLCBmaWxlbmFtZSk7CisKKyAgaWYgKCFfZGJ1c19jb25jYXRfZGlyX2FuZF9maWxlICgmZnVsbCwgJmZpbGUpKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmZnVsbCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIF9kYnVzX3ZlcmJvc2UgKCJTZXR0aW5nIFRFU1RfTEFVTkNIX0hFTFBFUl9DT05GSUcgdG8gJyVzJ1xuIiwKKyAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmZnVsbCkpOworCisgIGRidXNfc2V0ZW52ICgiVEVTVF9MQVVOQ0hfSEVMUEVSX0NPTkZJRyIsIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmZ1bGwpKTsKKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZ1bGwpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2J1c19kaXNwYXRjaF90ZXN0X2NvbmYgKGNvbnN0IERCdXNTdHJpbmcgKnRlc3RfZGF0YV9kaXIsCisJCSAgICAgICAgY29uc3QgY2hhciAgICAgICAqZmlsZW5hbWUsCisJCSAgICAgICAgZGJ1c19ib29sX3QgICAgICAgdXNlX2xhdW5jaGVyKQoreworICBCdXNDb250ZXh0ICpjb250ZXh0OworICBEQnVzQ29ubmVjdGlvbiAqZm9vOworICBEQnVzQ29ubmVjdGlvbiAqYmFyOworICBEQnVzQ29ubmVjdGlvbiAqYmF6OworICBEQnVzRXJyb3IgZXJyb3I7CisKKyAgLyogc2F2ZSB0aGUgY29uZmlnIG5hbWUgZm9yIHRoZSBhY3RpdmF0aW9uIGhlbHBlciAqLworICBpZiAoIXNldGVudl9URVNUX0xBVU5DSF9IRUxQRVJfQ09ORklHICh0ZXN0X2RhdGFfZGlyLCBmaWxlbmFtZSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5IHNldHRpbmcgVEVTVF9MQVVOQ0hfSEVMUEVSX0NPTkZJRyIpOworCisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKworICBjb250ZXh0ID0gYnVzX2NvbnRleHRfbmV3X3Rlc3QgKHRlc3RfZGF0YV9kaXIsIGZpbGVuYW1lKTsKKyAgaWYgKGNvbnRleHQgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgZm9vID0gZGJ1c19jb25uZWN0aW9uX29wZW5fcHJpdmF0ZSAoVEVTVF9ERUJVR19QSVBFLCAmZXJyb3IpOworICBpZiAoZm9vID09IE5VTEwpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGQgbm90IGFsbG9jIGNvbm5lY3Rpb24iKTsKKworICBpZiAoIWJ1c19zZXR1cF9kZWJ1Z19jbGllbnQgKGZvbykpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGQgbm90IHNldCB1cCBjb25uZWN0aW9uIik7CisKKyAgc3Bpbl9jb25uZWN0aW9uX3VudGlsX2F1dGhlbnRpY2F0ZWQgKGNvbnRleHQsIGZvbyk7CisKKyAgaWYgKCFjaGVja19oZWxsb19tZXNzYWdlIChjb250ZXh0LCBmb28pKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImhlbGxvIG1lc3NhZ2UgZmFpbGVkIik7CisKKyAgaWYgKCFjaGVja19kb3VibGVfaGVsbG9fbWVzc2FnZSAoY29udGV4dCwgZm9vKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJkb3VibGUgaGVsbG8gbWVzc2FnZSBmYWlsZWQiKTsKKworICBpZiAoIWNoZWNrX2FkZF9tYXRjaCAoY29udGV4dCwgZm9vLCAiIikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiQWRkTWF0Y2ggbWVzc2FnZSBmYWlsZWQiKTsKKworICBiYXIgPSBkYnVzX2Nvbm5lY3Rpb25fb3Blbl9wcml2YXRlIChURVNUX0RFQlVHX1BJUEUsICZlcnJvcik7CisgIGlmIChiYXIgPT0gTlVMTCkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZCBub3QgYWxsb2MgY29ubmVjdGlvbiIpOworCisgIGlmICghYnVzX3NldHVwX2RlYnVnX2NsaWVudCAoYmFyKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZCBub3Qgc2V0IHVwIGNvbm5lY3Rpb24iKTsKKworICBzcGluX2Nvbm5lY3Rpb25fdW50aWxfYXV0aGVudGljYXRlZCAoY29udGV4dCwgYmFyKTsKKworICBpZiAoIWNoZWNrX2hlbGxvX21lc3NhZ2UgKGNvbnRleHQsIGJhcikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiaGVsbG8gbWVzc2FnZSBmYWlsZWQiKTsKKworICBpZiAoIWNoZWNrX2FkZF9tYXRjaCAoY29udGV4dCwgYmFyLCAiIikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiQWRkTWF0Y2ggbWVzc2FnZSBmYWlsZWQiKTsKKworICBiYXogPSBkYnVzX2Nvbm5lY3Rpb25fb3Blbl9wcml2YXRlIChURVNUX0RFQlVHX1BJUEUsICZlcnJvcik7CisgIGlmIChiYXogPT0gTlVMTCkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZCBub3QgYWxsb2MgY29ubmVjdGlvbiIpOworCisgIGlmICghYnVzX3NldHVwX2RlYnVnX2NsaWVudCAoYmF6KSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZCBub3Qgc2V0IHVwIGNvbm5lY3Rpb24iKTsKKworICBzcGluX2Nvbm5lY3Rpb25fdW50aWxfYXV0aGVudGljYXRlZCAoY29udGV4dCwgYmF6KTsKKworICBpZiAoIWNoZWNrX2hlbGxvX21lc3NhZ2UgKGNvbnRleHQsIGJheikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiaGVsbG8gbWVzc2FnZSBmYWlsZWQiKTsKKworICBpZiAoIWNoZWNrX2FkZF9tYXRjaCAoY29udGV4dCwgYmF6LCAiIikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiQWRkTWF0Y2ggbWVzc2FnZSBmYWlsZWQiKTsKKworICBpZiAoIWNoZWNrX2FkZF9tYXRjaCAoY29udGV4dCwgYmF6LCAiaW50ZXJmYWNlPSdjb20uZXhhbXBsZSciKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJBZGRNYXRjaCBtZXNzYWdlIGZhaWxlZCIpOworCisjaWZkZWYgREJVU19FTkFCTEVfU1RBVFMKKyAgaWYgKCFjaGVja19nZXRfYWxsX21hdGNoX3J1bGVzIChjb250ZXh0LCBiYXopKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIkdldEFsbE1hdGNoUnVsZXMgbWVzc2FnZSBmYWlsZWQiKTsKKyNlbmRpZgorCisgIGlmICghY2hlY2tfZ2V0X2Nvbm5lY3Rpb25fdW5peF91c2VyIChjb250ZXh0LCBiYXopKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIkdldENvbm5lY3Rpb25Vbml4VXNlciBtZXNzYWdlIGZhaWxlZCIpOworCisjaWZkZWYgREJVU19XSU5fRklYTUUKKyAgX2RidXNfdmVyYm9zZSgiVE9ETzogdGVzdGluZyBvZiBHZXRDb25uZWN0aW9uVW5peFByb2Nlc3NJRCBtZXNzYWdlIHNraXBwZWQgZm9yIG5vd1xuIik7CisjZWxzZQorICBpZiAoIWNoZWNrX2dldF9jb25uZWN0aW9uX3VuaXhfcHJvY2Vzc19pZCAoY29udGV4dCwgYmF6KSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJHZXRDb25uZWN0aW9uVW5peFByb2Nlc3NJRCBtZXNzYWdlIGZhaWxlZCIpOworI2VuZGlmCisKKyAgaWYgKCFjaGVja19saXN0X3NlcnZpY2VzIChjb250ZXh0LCBiYXopKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIkxpc3RBY3RpdmF0YWJsZU5hbWVzIG1lc3NhZ2UgZmFpbGVkIik7CisKKyAgaWYgKCFjaGVja19ub19sZWZ0b3ZlcnMgKGNvbnRleHQpKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJNZXNzYWdlcyB3ZXJlIGxlZnQgb3ZlciBhZnRlciBzZXR0aW5nIHVwIGluaXRpYWwgY29ubmVjdGlvbnMiKTsKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImluaXRpYWwgY29ubmVjdGlvbiBzZXR1cCBmYWlsZWQiKTsKKyAgICB9CisKKyAgY2hlY2sxX3RyeV9pdGVyYXRpb25zIChjb250ZXh0LCAiY3JlYXRlX2FuZF9oZWxsbyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tfaGVsbG9fY29ubmVjdGlvbik7CisKKyAgY2hlY2syX3RyeV9pdGVyYXRpb25zIChjb250ZXh0LCBmb28sICJub25leGlzdGVudF9zZXJ2aWNlX25vX2F1dG9fc3RhcnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX25vbmV4aXN0ZW50X3NlcnZpY2Vfbm9fYXV0b19zdGFydCk7CisKKyAgY2hlY2syX3RyeV9pdGVyYXRpb25zIChjb250ZXh0LCBmb28sICJzZWdmYXVsdF9zZXJ2aWNlX25vX2F1dG9fc3RhcnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX3NlZ2ZhdWx0X3NlcnZpY2Vfbm9fYXV0b19zdGFydCk7CisKKyAgY2hlY2syX3RyeV9pdGVyYXRpb25zIChjb250ZXh0LCBmb28sICJleGlzdGVudF9zZXJ2aWNlX25vX2F1dG9fc3RhcnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX2V4aXN0ZW50X3NlcnZpY2Vfbm9fYXV0b19zdGFydCk7CisKKyAgY2hlY2syX3RyeV9pdGVyYXRpb25zIChjb250ZXh0LCBmb28sICJub25leGlzdGVudF9zZXJ2aWNlX2F1dG9fc3RhcnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX25vbmV4aXN0ZW50X3NlcnZpY2VfYXV0b19zdGFydCk7CisKKyAgLyogb25seSBkbyB0aGUgc2VnZmF1bHQgdGVzdCBpZiB3ZSBhcmUgbm90IHVzaW5nIHRoZSBsYXVuY2hlciAqLworICBjaGVjazJfdHJ5X2l0ZXJhdGlvbnMgKGNvbnRleHQsIGZvbywgInNlZ2ZhdWx0X3NlcnZpY2VfYXV0b19zdGFydCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tfc2VnZmF1bHRfc2VydmljZV9hdXRvX3N0YXJ0KTsKKworICAvKiBvbmx5IGRvIHRoZSBzaGVsbCBmYWlsIHRlc3QgaWYgd2UgYXJlIG5vdCB1c2luZyB0aGUgbGF1bmNoZXIgKi8KKyAgY2hlY2syX3RyeV9pdGVyYXRpb25zIChjb250ZXh0LCBmb28sICJzaGVsbF9mYWlsX3NlcnZpY2VfYXV0b19zdGFydCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tfc2hlbGxfZmFpbF9zZXJ2aWNlX2F1dG9fc3RhcnQpOworCisgIC8qIHNwZWNpZmljIHRvIGxhdW5jaGVyICovCisgIGlmICh1c2VfbGF1bmNoZXIpCisgICAgaWYgKCFjaGVja19sYXVuY2hfc2VydmljZV9maWxlX21pc3NpbmcgKGNvbnRleHQsIGZvbykpCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJkaWQgbm90IGdldCBzZXJ2aWNlIGZpbGUgbm90IGZvdW5kIGVycm9yIik7CisKKyNpZiAwCisgIC8qIE5vdGU6IG5lZWQgdG8gcmVzb2x2ZSBzb21lIGlzc3VlcyB3aXRoIHRoZSB0ZXN0aW5nIGNvZGUgaW4gb3JkZXIgdG8gcnVuCisgICAqIHRoaXMgaW4gb29tIChoYW5kbGUgdGhhdCB3ZSBzb21ldGltZXMgZG9uJ3QgZ2V0IHJlcGxpZXMgYmFjayBmcm9tIHRoZSBidXMKKyAgICogd2hlbiBvb20gaGFwcGVucywgd2l0aG91dCBibG9ja2luZyB0aGUgdGVzdCkuCisgICAqLworICBjaGVjazJfdHJ5X2l0ZXJhdGlvbnMgKGNvbnRleHQsIGZvbywgImV4aXN0ZW50X3NlcnZpY2VfYXV0b19hdXRvX3N0YXJ0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja19leGlzdGVudF9zZXJ2aWNlX2F1dG9fc3RhcnQpOworI2VuZGlmCisKKyAgaWYgKCFjaGVja19leGlzdGVudF9zZXJ2aWNlX2F1dG9fc3RhcnQgKGNvbnRleHQsIGZvbykpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZXhpc3RlbnQgc2VydmljZSBhdXRvIHN0YXJ0IGZhaWxlZCIpOworCisgIGlmICghY2hlY2tfc2hlbGxfc2VydmljZV9zdWNjZXNzX2F1dG9fc3RhcnQgKGNvbnRleHQsIGZvbykpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgic2hlbGwgc3VjY2VzcyBzZXJ2aWNlIGF1dG8gc3RhcnQgZmFpbGVkIik7CisKKyAgX2RidXNfdmVyYm9zZSAoIkRpc2Nvbm5lY3RpbmcgZm9vLCBiYXIsIGFuZCBiYXpcbiIpOworCisgIGtpbGxfY2xpZW50X2Nvbm5lY3Rpb25fdW5jaGVja2VkIChmb28pOworICBraWxsX2NsaWVudF9jb25uZWN0aW9uX3VuY2hlY2tlZCAoYmFyKTsKKyAga2lsbF9jbGllbnRfY29ubmVjdGlvbl91bmNoZWNrZWQgKGJheik7CisKKyAgYnVzX2NvbnRleHRfdW5yZWYgKGNvbnRleHQpOworCisgIHJldHVybiBUUlVFOworfQorCisjaWZuZGVmIERCVVNfV0lOCitzdGF0aWMgZGJ1c19ib29sX3QKK2J1c19kaXNwYXRjaF90ZXN0X2NvbmZfZmFpbCAoY29uc3QgREJ1c1N0cmluZyAqdGVzdF9kYXRhX2RpciwKKwkJICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKmZpbGVuYW1lKQoreworICBCdXNDb250ZXh0ICpjb250ZXh0OworICBEQnVzQ29ubmVjdGlvbiAqZm9vOworICBEQnVzRXJyb3IgZXJyb3I7CisKKyAgLyogc2F2ZSB0aGUgY29uZmlnIG5hbWUgZm9yIHRoZSBhY3RpdmF0aW9uIGhlbHBlciAqLworICBpZiAoIXNldGVudl9URVNUX0xBVU5DSF9IRUxQRVJfQ09ORklHICh0ZXN0X2RhdGFfZGlyLCBmaWxlbmFtZSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5IHNldHRpbmcgVEVTVF9MQVVOQ0hfSEVMUEVSX0NPTkZJRyIpOworCisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKworICBjb250ZXh0ID0gYnVzX2NvbnRleHRfbmV3X3Rlc3QgKHRlc3RfZGF0YV9kaXIsIGZpbGVuYW1lKTsKKyAgaWYgKGNvbnRleHQgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgZm9vID0gZGJ1c19jb25uZWN0aW9uX29wZW5fcHJpdmF0ZSAoVEVTVF9ERUJVR19QSVBFLCAmZXJyb3IpOworICBpZiAoZm9vID09IE5VTEwpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGQgbm90IGFsbG9jIGNvbm5lY3Rpb24iKTsKKworICBpZiAoIWJ1c19zZXR1cF9kZWJ1Z19jbGllbnQgKGZvbykpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGQgbm90IHNldCB1cCBjb25uZWN0aW9uIik7CisKKyAgc3Bpbl9jb25uZWN0aW9uX3VudGlsX2F1dGhlbnRpY2F0ZWQgKGNvbnRleHQsIGZvbyk7CisKKyAgaWYgKCFjaGVja19oZWxsb19tZXNzYWdlIChjb250ZXh0LCBmb28pKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImhlbGxvIG1lc3NhZ2UgZmFpbGVkIik7CisKKyAgaWYgKCFjaGVja19kb3VibGVfaGVsbG9fbWVzc2FnZSAoY29udGV4dCwgZm9vKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJkb3VibGUgaGVsbG8gbWVzc2FnZSBmYWlsZWQiKTsKKworICBpZiAoIWNoZWNrX2FkZF9tYXRjaCAoY29udGV4dCwgZm9vLCAiIikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiQWRkTWF0Y2ggbWVzc2FnZSBmYWlsZWQiKTsKKworICAvKiB0aGlzIG9ubHkgdGVzdHMgdGhlIGFjdGl2YXRpb24uYyB1c2VyIGNoZWNrICovCisgIGlmICghY2hlY2tfbGF1bmNoX3NlcnZpY2VfdXNlcl9taXNzaW5nIChjb250ZXh0LCBmb28pKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInVzZXIgbWlzc2luZyBkaWQgbm90IHRyaWdnZXIgZXJyb3IiKTsKKworICAvKiB0aGlzIG9ubHkgdGVzdHMgdGhlIGRlc2t0b3AuYyBleGVjIGNoZWNrICovCisgIGlmICghY2hlY2tfbGF1bmNoX3NlcnZpY2VfZXhlY19taXNzaW5nIChjb250ZXh0LCBmb28pKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImV4ZWMgbWlzc2luZyBkaWQgbm90IHRyaWdnZXIgZXJyb3IiKTsKKworICAvKiB0aGlzIG9ubHkgdGVzdHMgdGhlIGRlc2t0b3AuYyBzZXJ2aWNlIGNoZWNrICovCisgIGlmICghY2hlY2tfbGF1bmNoX3NlcnZpY2Vfc2VydmljZV9taXNzaW5nIChjb250ZXh0LCBmb28pKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInNlcnZpY2UgbWlzc2luZyBkaWQgbm90IHRyaWdnZXIgZXJyb3IiKTsKKworICBfZGJ1c192ZXJib3NlICgiRGlzY29ubmVjdGluZyBmb29cbiIpOworCisgIGtpbGxfY2xpZW50X2Nvbm5lY3Rpb25fdW5jaGVja2VkIChmb28pOworCisgIGJ1c19jb250ZXh0X3VucmVmIChjb250ZXh0KTsKKworICByZXR1cm4gVFJVRTsKK30KKyNlbmRpZgorCitkYnVzX2Jvb2xfdAorYnVzX2Rpc3BhdGNoX3Rlc3QgKGNvbnN0IERCdXNTdHJpbmcgKnRlc3RfZGF0YV9kaXIpCit7CisgIC8qIHJ1biBub3JtYWwgYWN0aXZhdGlvbiB0ZXN0cyAqLworICBfZGJ1c192ZXJib3NlICgiTm9ybWFsIGFjdGl2YXRpb24gdGVzdHNcbiIpOworICBpZiAoIWJ1c19kaXNwYXRjaF90ZXN0X2NvbmYgKHRlc3RfZGF0YV9kaXIsCisgIAkJCSAgICAgICAidmFsaWQtY29uZmlnLWZpbGVzL2RlYnVnLWFsbG93LWFsbC5jb25mIiwgRkFMU0UpKQorICAgIHJldHVybiBGQUxTRTsKKworI2lmbmRlZiBEQlVTX1dJTgorICAvKiBydW4gbGF1bmNoLWhlbHBlciBhY3RpdmF0aW9uIHRlc3RzICovCisgIF9kYnVzX3ZlcmJvc2UgKCJMYXVuY2ggaGVscGVyIGFjdGl2YXRpb24gdGVzdHNcbiIpOworICBpZiAoIWJ1c19kaXNwYXRjaF90ZXN0X2NvbmYgKHRlc3RfZGF0YV9kaXIsCisgIAkJCSAgICAgICAidmFsaWQtY29uZmlnLWZpbGVzLXN5c3RlbS9kZWJ1Zy1hbGxvdy1hbGwtcGFzcy5jb25mIiwgVFJVRSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIC8qIHJ1biBzZWxlY3QgbGF1bmNoLWhlbHBlciBhY3RpdmF0aW9uIHRlc3RzIG9uIGJyb2tlbiBzZXJ2aWNlIGZpbGVzICovCisgIGlmICghYnVzX2Rpc3BhdGNoX3Rlc3RfY29uZl9mYWlsICh0ZXN0X2RhdGFfZGlyLAorICAJCQkgICAgICAgICAgICAidmFsaWQtY29uZmlnLWZpbGVzLXN5c3RlbS9kZWJ1Zy1hbGxvdy1hbGwtZmFpbC5jb25mIikpCisgICAgcmV0dXJuIEZBTFNFOworI2VuZGlmCisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2RidXNfYm9vbF90CitidXNfZGlzcGF0Y2hfc2hhMV90ZXN0IChjb25zdCBEQnVzU3RyaW5nICp0ZXN0X2RhdGFfZGlyKQoreworICBCdXNDb250ZXh0ICpjb250ZXh0OworICBEQnVzQ29ubmVjdGlvbiAqZm9vOworICBEQnVzRXJyb3IgZXJyb3I7CisKKyAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworCisgIC8qIFRlc3QgU0hBMSBhdXRoZW50aWNhdGlvbiAqLworICBfZGJ1c192ZXJib3NlICgiVGVzdGluZyBTSEExIGNvbnRleHRcbiIpOworCisgIGNvbnRleHQgPSBidXNfY29udGV4dF9uZXdfdGVzdCAodGVzdF9kYXRhX2RpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFsaWQtY29uZmlnLWZpbGVzL2RlYnVnLWFsbG93LWFsbC1zaGExLmNvbmYiKTsKKyAgaWYgKGNvbnRleHQgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgZm9vID0gZGJ1c19jb25uZWN0aW9uX29wZW5fcHJpdmF0ZSAoVEVTVF9ERUJVR19QSVBFLCAmZXJyb3IpOworICBpZiAoZm9vID09IE5VTEwpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGQgbm90IGFsbG9jIGNvbm5lY3Rpb24iKTsKKworICBpZiAoIWJ1c19zZXR1cF9kZWJ1Z19jbGllbnQgKGZvbykpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGQgbm90IHNldCB1cCBjb25uZWN0aW9uIik7CisKKyAgc3Bpbl9jb25uZWN0aW9uX3VudGlsX2F1dGhlbnRpY2F0ZWQgKGNvbnRleHQsIGZvbyk7CisKKyAgaWYgKCFjaGVja19oZWxsb19tZXNzYWdlIChjb250ZXh0LCBmb28pKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImhlbGxvIG1lc3NhZ2UgZmFpbGVkIik7CisKKyAgaWYgKCFjaGVja19hZGRfbWF0Y2ggKGNvbnRleHQsIGZvbywgIiIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImFkZG1hdGNoIG1lc3NhZ2UgZmFpbGVkIik7CisKKyAgaWYgKCFjaGVja19ub19sZWZ0b3ZlcnMgKGNvbnRleHQpKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJNZXNzYWdlcyB3ZXJlIGxlZnQgb3ZlciBhZnRlciBzZXR0aW5nIHVwIGluaXRpYWwgU0hBLTEgY29ubmVjdGlvbiIpOworICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiaW5pdGlhbCBjb25uZWN0aW9uIHNldHVwIGZhaWxlZCIpOworICAgIH0KKworICBjaGVjazFfdHJ5X2l0ZXJhdGlvbnMgKGNvbnRleHQsICJjcmVhdGVfYW5kX2hlbGxvX3NoYTEiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX2hlbGxvX2Nvbm5lY3Rpb24pOworCisgIGtpbGxfY2xpZW50X2Nvbm5lY3Rpb25fdW5jaGVja2VkIChmb28pOworCisgIGJ1c19jb250ZXh0X3VucmVmIChjb250ZXh0KTsKKworICByZXR1cm4gVFJVRTsKK30KKworI2lmZGVmIEhBVkVfVU5JWF9GRF9QQVNTSU5HCisKK2RidXNfYm9vbF90CitidXNfdW5peF9mZHNfcGFzc2luZ190ZXN0KGNvbnN0IERCdXNTdHJpbmcgKnRlc3RfZGF0YV9kaXIpCit7CisgIEJ1c0NvbnRleHQgKmNvbnRleHQ7CisgIERCdXNDb25uZWN0aW9uICpmb28sICpiYXI7CisgIERCdXNFcnJvciBlcnJvcjsKKyAgREJ1c01lc3NhZ2UgKm07CisgIERCdXNTb2NrZXQgb25lWzJdLCB0d29bMl07CisgIGludCB4LCB5LCB6OworICBjaGFyIHI7CisKKyAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworCisgIGNvbnRleHQgPSBidXNfY29udGV4dF9uZXdfdGVzdCAodGVzdF9kYXRhX2RpciwgInZhbGlkLWNvbmZpZy1maWxlcy9kZWJ1Zy1hbGxvdy1hbGwuY29uZiIpOworICBpZiAoY29udGV4dCA9PSBOVUxMKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkIG5vdCBhbGxvYyBjb250ZXh0Iik7CisKKyAgZm9vID0gZGJ1c19jb25uZWN0aW9uX29wZW5fcHJpdmF0ZSAoVEVTVF9ERUJVR19QSVBFLCAmZXJyb3IpOworICBpZiAoZm9vID09IE5VTEwpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGQgbm90IGFsbG9jIGNvbm5lY3Rpb24iKTsKKworICBpZiAoIWJ1c19zZXR1cF9kZWJ1Z19jbGllbnQgKGZvbykpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGQgbm90IHNldCB1cCBjb25uZWN0aW9uIik7CisKKyAgc3Bpbl9jb25uZWN0aW9uX3VudGlsX2F1dGhlbnRpY2F0ZWQgKGNvbnRleHQsIGZvbyk7CisKKyAgaWYgKCFjaGVja19oZWxsb19tZXNzYWdlIChjb250ZXh0LCBmb28pKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImhlbGxvIG1lc3NhZ2UgZmFpbGVkIik7CisKKyAgaWYgKCFjaGVja19hZGRfbWF0Y2ggKGNvbnRleHQsIGZvbywgIiIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIkFkZE1hdGNoIG1lc3NhZ2UgZmFpbGVkIik7CisKKyAgYmFyID0gZGJ1c19jb25uZWN0aW9uX29wZW5fcHJpdmF0ZSAoVEVTVF9ERUJVR19QSVBFLCAmZXJyb3IpOworICBpZiAoYmFyID09IE5VTEwpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGQgbm90IGFsbG9jIGNvbm5lY3Rpb24iKTsKKworICBpZiAoIWJ1c19zZXR1cF9kZWJ1Z19jbGllbnQgKGJhcikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGQgbm90IHNldCB1cCBjb25uZWN0aW9uIik7CisKKyAgc3Bpbl9jb25uZWN0aW9uX3VudGlsX2F1dGhlbnRpY2F0ZWQgKGNvbnRleHQsIGJhcik7CisKKyAgaWYgKCFjaGVja19oZWxsb19tZXNzYWdlIChjb250ZXh0LCBiYXIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImhlbGxvIG1lc3NhZ2UgZmFpbGVkIik7CisKKyAgaWYgKCFjaGVja19hZGRfbWF0Y2ggKGNvbnRleHQsIGJhciwgIiIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIkFkZE1hdGNoIG1lc3NhZ2UgZmFpbGVkIik7CisKKyAgaWYgKCEobSA9IGRidXNfbWVzc2FnZV9uZXdfc2lnbmFsKCIvIiwgImEuYi5jIiwgImQiKSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGQgbm90IGFsbG9jIG1lc3NhZ2UiKTsKKworICBpZiAoIShfZGJ1c19zb2NrZXRwYWlyIChvbmUsIG9uZSsxLCBUUlVFLCAmZXJyb3IpKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQoIkZhaWxlZCB0byBhbGxvY2F0ZSBwaXBlICMxIik7CisKKyAgaWYgKCEoX2RidXNfc29ja2V0cGFpciAodHdvLCB0d28rMSwgVFJVRSwgJmVycm9yKSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkKCJGYWlsZWQgdG8gYWxsb2NhdGUgcGlwZSAjMiIpOworCisgIGlmICghZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzKG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9VTklYX0ZELCBvbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9VTklYX0ZELCB0d28sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9VTklYX0ZELCB0d28sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQoIkZhaWxlZCB0byBhdHRhY2ggZmRzLiIpOworCisgIGlmICghX2RidXNfY2xvc2Vfc29ja2V0IChvbmVbMF0sICZlcnJvcikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkKCJGYWlsZWQgdG8gY2xvc2UgcGlwZSAjMSAiKTsKKyAgaWYgKCFfZGJ1c19jbG9zZV9zb2NrZXQgKHR3b1swXSwgJmVycm9yKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQoIkZhaWxlZCB0byBjbG9zZSBwaXBlICMyICIpOworCisgIGlmICghKGRidXNfY29ubmVjdGlvbl9jYW5fc2VuZF90eXBlKGZvbywgREJVU19UWVBFX1VOSVhfRkQpKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQoIkNvbm5lY3Rpb24gY2Fubm90IGRvIGZkIHBhc3NpbmciKTsKKworICBpZiAoIShkYnVzX2Nvbm5lY3Rpb25fY2FuX3NlbmRfdHlwZShiYXIsIERCVVNfVFlQRV9VTklYX0ZEKSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkKCJDb25uZWN0aW9uIGNhbm5vdCBkbyBmZCBwYXNzaW5nIik7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoZm9vLCBtLCBOVUxMKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQoIkZhaWxlZCB0byBzZW5kIGZkcyIpOworCisgIGRidXNfbWVzc2FnZV91bnJlZihtKTsKKworICBidXNfdGVzdF9ydW5fY2xpZW50c19sb29wIChTRU5EX1BFTkRJTkcgKGZvbykpOworCisgIGJ1c190ZXN0X3J1bl9ldmVyeXRoaW5nIChjb250ZXh0KTsKKworICBibG9ja19jb25uZWN0aW9uX3VudGlsX21lc3NhZ2VfZnJvbV9idXMgKGNvbnRleHQsIGZvbywgInVuaXggZmQgcmVjZXB0aW9uIG9uIGZvbyIpOworCisgIGlmICghKG0gPSBwb3BfbWVzc2FnZV93YWl0aW5nX2Zvcl9tZW1vcnkgKGZvbykpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCgiRmFpbGVkIHRvIHJlY2VpdmUgbXNnIik7CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfaXNfc2lnbmFsKG0sICJhLmIuYyIsICJkIikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkKCJib2d1cyBtZXNzYWdlIHJlY2VpdmVkIik7CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmKG0pOworCisgIGJsb2NrX2Nvbm5lY3Rpb25fdW50aWxfbWVzc2FnZV9mcm9tX2J1cyAoY29udGV4dCwgYmFyLCAidW5peCBmZCByZWNlcHRpb24gb24gYmFyIik7CisKKyAgaWYgKCEobSA9IHBvcF9tZXNzYWdlX3dhaXRpbmdfZm9yX21lbW9yeSAoYmFyKSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkKCJGYWlsZWQgdG8gcmVjZWl2ZSBtc2ciKTsKKworICBpZiAoIWRidXNfbWVzc2FnZV9pc19zaWduYWwobSwgImEuYi5jIiwgImQiKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQoImJvZ3VzIG1lc3NhZ2UgcmVjZWl2ZWQiKTsKKworICBpZiAoIWRidXNfbWVzc2FnZV9nZXRfYXJncyhtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9VTklYX0ZELCAmeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1VOSVhfRkQsICZ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfVU5JWF9GRCwgJnosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQoIkZhaWxlZCB0byBwYXJzZSBmZHMuIik7CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmKG0pOworCisgIGlmICh3cml0ZSh4LCAiWCIsIDEpICE9IDEpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkKCJGYWlsZWQgdG8gd3JpdGUgdG8gcGlwZSAjMSIpOworICBpZiAod3JpdGUoeSwgIlkiLCAxKSAhPSAxKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCgiRmFpbGVkIHRvIHdyaXRlIHRvIHBpcGUgIzIiKTsKKyAgaWYgKHdyaXRlKHosICJaIiwgMSkgIT0gMSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQoIkZhaWxlZCB0byB3cml0ZSB0byBwaXBlICMyLzJuZCBmZCIpOworCisgIGlmICghX2RidXNfY2xvc2UoeCwgJmVycm9yKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQoIkZhaWxlZCB0byBjbG9zZSBwaXBlICMxL290aGVyIHNpZGUgIik7CisgIGlmICghX2RidXNfY2xvc2UoeSwgJmVycm9yKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQoIkZhaWxlZCB0byBjbG9zZSBwaXBlICMyL290aGVyIHNpZGUgIik7CisgIGlmICghX2RidXNfY2xvc2UoeiwgJmVycm9yKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQoIkZhaWxlZCB0byBjbG9zZSBwaXBlICMyL290aGVyIHNpemUgMm5kIGZkICIpOworCisgIGlmIChyZWFkKG9uZVsxXS5mZCwgJnIsIDEpICE9IDEgfHwgciAhPSAnWCcpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkKCJGYWlsZWQgdG8gcmVhZCB2YWx1ZSBmcm9tIHBpcGUuIik7CisgIGlmIChyZWFkKHR3b1sxXS5mZCwgJnIsIDEpICE9IDEgfHwgciAhPSAnWScpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkKCJGYWlsZWQgdG8gcmVhZCB2YWx1ZSBmcm9tIHBpcGUuIik7CisgIGlmIChyZWFkKHR3b1sxXS5mZCwgJnIsIDEpICE9IDEgfHwgciAhPSAnWicpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkKCJGYWlsZWQgdG8gcmVhZCB2YWx1ZSBmcm9tIHBpcGUuIik7CisKKyAgaWYgKCFfZGJ1c19jbG9zZV9zb2NrZXQgKG9uZVsxXSwgJmVycm9yKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQoIkZhaWxlZCB0byBjbG9zZSBwaXBlICMxICIpOworICBpZiAoIV9kYnVzX2Nsb3NlX3NvY2tldCAodHdvWzFdLCAmZXJyb3IpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCgiRmFpbGVkIHRvIGNsb3NlIHBpcGUgIzIgIik7CisKKyAgX2RidXNfdmVyYm9zZSAoIkRpc2Nvbm5lY3RpbmcgZm9vXG4iKTsKKyAga2lsbF9jbGllbnRfY29ubmVjdGlvbl91bmNoZWNrZWQgKGZvbyk7CisKKyAgX2RidXNfdmVyYm9zZSAoIkRpc2Nvbm5lY3RpbmcgYmFyXG4iKTsKKyAga2lsbF9jbGllbnRfY29ubmVjdGlvbl91bmNoZWNrZWQgKGJhcik7CisKKyAgYnVzX2NvbnRleHRfdW5yZWYgKGNvbnRleHQpOworCisgIHJldHVybiBUUlVFOworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUyAqLwpkaWZmIC0tZ2l0IGEvYnVzL2Rpc3BhdGNoLmggYi9idXMvZGlzcGF0Y2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjViYTdhCi0tLSAvZGV2L251bGwKKysrIGIvYnVzL2Rpc3BhdGNoLmgKQEAgLTAsMCArMSwzOCBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkaXNwYXRjaC5oICBNZXNzYWdlIGRpc3BhdGNoZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgIENvZGVGYWN0b3J5IEFCCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpZm5kZWYgQlVTX0RJU1BBVENIX0gKKyNkZWZpbmUgQlVTX0RJU1BBVENIX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy5oPgorI2luY2x1ZGUgImNvbm5lY3Rpb24uaCIKKworZGJ1c19ib29sX3QgYnVzX2Rpc3BhdGNoX2FkZF9jb25uZWN0aW9uICAgIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbik7Cit2b2lkICAgICAgICBidXNfZGlzcGF0Y2hfcmVtb3ZlX2Nvbm5lY3Rpb24gKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKTsKK2RidXNfYm9vbF90IGJ1c19kaXNwYXRjaF9tYXRjaGVzICAgICAgICAgICAoQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqc2VuZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqcmVjaXBpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKTsKKworI2VuZGlmIC8qIEJVU19ESVNQQVRDSF9IICovCmRpZmYgLS1naXQgYS9idXMvZHJpdmVyLmMgYi9idXMvZHJpdmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2QwYTcxNAotLS0gL2Rldi9udWxsCisrKyBiL2J1cy9kcml2ZXIuYwpAQCAtMCwwICsxLDMyNzUgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZHJpdmVyLmMgIEJ1cyBjbGllbnQgKGRyaXZlcikKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgQ29kZUZhY3RvcnkgQUIKKyAqIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCwgMjAwNSBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiYWN0aXZhdGlvbi5oIgorI2luY2x1ZGUgImFwcGFybW9yLmgiCisjaW5jbHVkZSAiY29ubmVjdGlvbi5oIgorI2luY2x1ZGUgImRyaXZlci5oIgorI2luY2x1ZGUgImRpc3BhdGNoLmgiCisjaW5jbHVkZSAic2VydmljZXMuaCIKKyNpbmNsdWRlICJzZWxpbnV4LmgiCisjaW5jbHVkZSAic2lnbmFscy5oIgorI2luY2x1ZGUgInN0YXRzLmgiCisjaW5jbHVkZSAidXRpbHMuaCIKKworI2luY2x1ZGUgPGRidXMvZGJ1cy1hc3YtdXRpbC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1jb25uZWN0aW9uLWludGVybmFsLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXN0cmluZy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1pbnRlcm5hbHMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbWVzc2FnZS5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1tYXJzaGFsLXJlY3Vyc2l2ZS5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1tYXJzaGFsLXZhbGlkYXRlLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqCitub25udWxsIChjb25zdCBjaGFyICptYXliZV9udWxsLAorICAgICAgICAgY29uc3QgY2hhciAqaWZfbnVsbCkKK3sKKyAgcmV0dXJuIChtYXliZV9udWxsID8gbWF5YmVfbnVsbCA6IGlmX251bGwpOworfQorCitzdGF0aWMgREJ1c0Nvbm5lY3Rpb24gKgorYnVzX2RyaXZlcl9nZXRfb3duZXJfb2ZfbmFtZSAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqbmFtZSkKK3sKKyAgQnVzUmVnaXN0cnkgKnJlZ2lzdHJ5OworICBCdXNTZXJ2aWNlICpzZXJ2OworICBEQnVzU3RyaW5nIHN0cjsKKworICByZWdpc3RyeSA9IGJ1c19jb25uZWN0aW9uX2dldF9yZWdpc3RyeSAoY29ubmVjdGlvbik7CisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmc3RyLCBuYW1lKTsKKyAgc2VydiA9IGJ1c19yZWdpc3RyeV9sb29rdXAgKHJlZ2lzdHJ5LCAmc3RyKTsKKworICBpZiAoc2VydiA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIHJldHVybiBidXNfc2VydmljZV9nZXRfcHJpbWFyeV9vd25lcnNfY29ubmVjdGlvbiAoc2Vydik7Cit9CisKK0J1c0RyaXZlckZvdW5kCitidXNfZHJpdmVyX2dldF9jb25uX2hlbHBlciAoREJ1c0Nvbm5lY3Rpb24gICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgKndoYXRfd2Vfd2FudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqKm5hbWVfcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqKnBlZXJfY29ubl9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAqZXJyb3IpCit7CisgIERCdXNDb25uZWN0aW9uICpjb25uOworICBjb25zdCBjaGFyICpuYW1lOworCisgIGlmICghZGJ1c19tZXNzYWdlX2dldF9hcmdzIChtZXNzYWdlLCBlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgIHJldHVybiBCVVNfRFJJVkVSX0ZPVU5EX0VSUk9SOworCisgIF9kYnVzX2Fzc2VydCAobmFtZSAhPSBOVUxMKTsKKyAgX2RidXNfdmVyYm9zZSAoImFza2VkIGZvciAlcyBvZiBjb25uZWN0aW9uICVzXG4iLCB3aGF0X3dlX3dhbnQsIG5hbWUpOworCisgIGlmIChuYW1lX3AgIT0gTlVMTCkKKyAgICAqbmFtZV9wID0gbmFtZTsKKworICBpZiAoc3RyY21wIChuYW1lLCBEQlVTX1NFUlZJQ0VfREJVUykgPT0gMCkKKyAgICByZXR1cm4gQlVTX0RSSVZFUl9GT1VORF9TRUxGOworCisgIGNvbm4gPSBidXNfZHJpdmVyX2dldF9vd25lcl9vZl9uYW1lIChjb25uZWN0aW9uLCBuYW1lKTsKKworICBpZiAoY29ubiA9PSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OQU1FX0hBU19OT19PV05FUiwKKyAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGdldCAlcyBvZiBuYW1lICclcyc6IG5vIHN1Y2ggbmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgd2hhdF93ZV93YW50LCBuYW1lKTsKKyAgICAgIHJldHVybiBCVVNfRFJJVkVSX0ZPVU5EX0VSUk9SOworICAgIH0KKworICBpZiAocGVlcl9jb25uX3AgIT0gTlVMTCkKKyAgICAqcGVlcl9jb25uX3AgPSBjb25uOworCisgIHJldHVybiBCVVNfRFJJVkVSX0ZPVU5EX1BFRVI7Cit9CisKKy8qCisgKiBMb2cgYSBzZWN1cml0eSB3YXJuaW5nIGFuZCBzZXQgZXJyb3IgdW5sZXNzIHRoZSB1aWQgb2YgdGhlIGNvbm5lY3Rpb24KKyAqIGlzIGVpdGhlciB0aGUgdWlkIG9mIHRoaXMgcHJvY2Vzcywgb3Igb24gVW5peCwgdWlkIDAgKHJvb3QpLgorICoKKyAqIFRoaXMgaXMgaW50ZW5kZWQgdG8gYmUgYSBzZWNvbmQgbGluZSBvZiBkZWZlbmNlIGFmdGVyIDxkZW55PiBydWxlcywKKyAqIHRvIG1pdGlnYXRlIGluY29ycmVjdCBzeXN0ZW0gYnVzIHNlY3VyaXR5IHBvbGljeSBjb25maWd1cmF0aW9uIGZpbGVzCisgKiBsaWtlIHRoZSBvbmVzIGluIENWRS0yMDE0LTgxNDggYW5kIENWRS0yMDE0LTgxNTYsIGFuZCAoaWYgcHJlc2VudCkKKyAqIExTTSBydWxlczsgc28gaXQgZG9lc24ndCBuZWVkIHRvIGJlIHBlcmZlY3QsIGJ1dCBhcyBsb25nIGFzIHdlIGhhdmUKKyAqIHBvdGVudGlhbGx5IGRhbmdlcm91cyBmdW5jdGlvbmFsaXR5IGluIHRoZSBzeXN0ZW0gYnVzLCBpdCBkb2VzIG5lZWQKKyAqIHRvIGV4aXN0LgorICovCitzdGF0aWMgZGJ1c19ib29sX3QKK2J1c19kcml2ZXJfY2hlY2tfY2FsbGVyX2lzX3ByaXZpbGVnZWQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisjaWZkZWYgREJVU19VTklYCisgIHVuc2lnbmVkIGxvbmcgdWlkOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX2dldF91bml4X3VzZXIgKGNvbm5lY3Rpb24sICZ1aWQpKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKm1ldGhvZCA9IGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKTsKKworICAgICAgYnVzX2NvbnRleHRfbG9nX2FuZF9zZXRfZXJyb3IgKGJ1c190cmFuc2FjdGlvbl9nZXRfY29udGV4dCAodHJhbnNhY3Rpb24pLAorICAgICAgICAgIERCVVNfU1lTVEVNX0xPR19TRUNVUklUWSwgZXJyb3IsIERCVVNfRVJST1JfQUNDRVNTX0RFTklFRCwKKyAgICAgICAgICAicmVqZWN0ZWQgYXR0ZW1wdCB0byBjYWxsICVzIGJ5IGNvbm5lY3Rpb24gJXMgKCVzKSB3aXRoICIKKyAgICAgICAgICAidW5rbm93biB1aWQiLCBtZXRob2QsCisgICAgICAgICAgbm9ubnVsbCAoYnVzX2Nvbm5lY3Rpb25fZ2V0X25hbWUgKGNvbm5lY3Rpb24pLCAiKGluYWN0aXZlKSIpLAorICAgICAgICAgIGJ1c19jb25uZWN0aW9uX2dldF9sb2dpbmZvIChjb25uZWN0aW9uKSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIC8qIEknbSB3cml0aW5nIGl0IGluIHRoaXMgc2xpZ2h0bHkgc3RyYW5nZSBmb3JtIHNvIHRoYXQgaXQncyBtb3JlCisgICAqIG9idmlvdXMgdGhhdCB0aGlzIHNlY3VyaXR5LXNlbnNpdGl2ZSBjb2RlIGlzIGNvcnJlY3QuCisgICAqLworICBpZiAoX2RidXNfdW5peF91c2VyX2lzX3Byb2Nlc3Nfb3duZXIgKHVpZCkpCisgICAgeworICAgICAgLyogT0sgKi8KKyAgICB9CisgIGVsc2UgaWYgKHVpZCA9PSAwKQorICAgIHsKKyAgICAgIC8qIE9LICovCisgICAgfQorICBlbHNlCisgICAgeworICAgICAgY29uc3QgY2hhciAqbWV0aG9kID0gZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKG1lc3NhZ2UpOworCisgICAgICBidXNfY29udGV4dF9sb2dfYW5kX3NldF9lcnJvciAoYnVzX3RyYW5zYWN0aW9uX2dldF9jb250ZXh0ICh0cmFuc2FjdGlvbiksCisgICAgICAgICAgREJVU19TWVNURU1fTE9HX1NFQ1VSSVRZLCBlcnJvciwgREJVU19FUlJPUl9BQ0NFU1NfREVOSUVELAorICAgICAgICAgICJyZWplY3RlZCBhdHRlbXB0IHRvIGNhbGwgJXMgYnkgY29ubmVjdGlvbiAlcyAoJXMpIHdpdGggIgorICAgICAgICAgICJ1aWQgJWx1IiwgbWV0aG9kLAorICAgICAgICAgIG5vbm51bGwgKGJ1c19jb25uZWN0aW9uX2dldF9uYW1lIChjb25uZWN0aW9uKSwgIihpbmFjdGl2ZSkiKSwKKyAgICAgICAgICBidXNfY29ubmVjdGlvbl9nZXRfbG9naW5mbyAoY29ubmVjdGlvbiksIHVpZCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHJldHVybiBUUlVFOworI2VsaWYgZGVmaW5lZChEQlVTX1dJTikKKyAgY2hhciAqd2luZG93c19zaWQgPSBOVUxMOworICBkYnVzX2Jvb2xfdCByZXQgPSBGQUxTRTsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9nZXRfd2luZG93c191c2VyIChjb25uZWN0aW9uLCAmd2luZG93c19zaWQpKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKm1ldGhvZCA9IGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKTsKKworICAgICAgYnVzX2NvbnRleHRfbG9nX2FuZF9zZXRfZXJyb3IgKGJ1c190cmFuc2FjdGlvbl9nZXRfY29udGV4dCAodHJhbnNhY3Rpb24pLAorICAgICAgICAgIERCVVNfU1lTVEVNX0xPR19TRUNVUklUWSwgZXJyb3IsIERCVVNfRVJST1JfQUNDRVNTX0RFTklFRCwKKyAgICAgICAgICAicmVqZWN0ZWQgYXR0ZW1wdCB0byBjYWxsICVzIGJ5IHVua25vd24gdWlkIiwgbWV0aG9kKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAoIV9kYnVzX3dpbmRvd3NfdXNlcl9pc19wcm9jZXNzX293bmVyICh3aW5kb3dzX3NpZCkpCisgICAgeworICAgICAgY29uc3QgY2hhciAqbWV0aG9kID0gZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKG1lc3NhZ2UpOworCisgICAgICBidXNfY29udGV4dF9sb2dfYW5kX3NldF9lcnJvciAoYnVzX3RyYW5zYWN0aW9uX2dldF9jb250ZXh0ICh0cmFuc2FjdGlvbiksCisgICAgICAgICAgREJVU19TWVNURU1fTE9HX1NFQ1VSSVRZLCBlcnJvciwgREJVU19FUlJPUl9BQ0NFU1NfREVOSUVELAorICAgICAgICAgICJyZWplY3RlZCBhdHRlbXB0IHRvIGNhbGwgJXMgYnkgdWlkICVzIiwgbWV0aG9kLCB3aW5kb3dzX3NpZCk7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgcmV0ID0gVFJVRTsKK291dDoKKyAgZGJ1c19mcmVlICh3aW5kb3dzX3NpZCk7CisgIHJldHVybiByZXQ7CisjZWxzZQorICAvKiBtYWtlIHN1cmUgd2UgZmFpbCBjbG9zZWQgaW4gdGhlIGh5cG90aGV0aWNhbCBjYXNlIHRoYXQgd2UgYXJlIG5laXRoZXIKKyAgICogVW5peCBub3IgV2luZG93cyAqLworICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfQUNDRVNTX0RFTklFRCwKKyAgICAgICJwbGVhc2UgdGVhY2ggYnVzL2RyaXZlci5jIGhvdyB1aWRzIHdvcmsgb24gdGhpcyBwbGF0Zm9ybSIpOworICByZXR1cm4gRkFMU0U7CisjZW5kaWYKK30KKworc3RhdGljIGRidXNfYm9vbF90IGJ1c19kcml2ZXJfc2VuZF93ZWxjb21lX21lc3NhZ2UgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICpoZWxsb19tZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpOworCitkYnVzX2Jvb2xfdAorYnVzX2RyaXZlcl9zZW5kX3NlcnZpY2Vfb3duZXJfY2hhbmdlZCAoY29uc3QgY2hhciAgICAgKnNlcnZpY2VfbmFtZSwKKwkJCQkgICAgICAgY29uc3QgY2hhciAgICAgKm9sZF9vd25lciwKKwkJCQkgICAgICAgY29uc3QgY2hhciAgICAgKm5ld19vd25lciwKKwkJCQkgICAgICAgQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorCQkJCSAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIGNvbnN0IGNoYXIgKm51bGxfc2VydmljZTsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBudWxsX3NlcnZpY2UgPSAiIjsKKyAgX2RidXNfdmVyYm9zZSAoInNlbmRpbmcgbmFtZSBvd25lciBjaGFuZ2VkOiAlcyBbJXMgLT4gJXNdXG4iLAorICAgICAgICAgICAgICAgICBzZXJ2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgIG9sZF9vd25lciA/IG9sZF9vd25lciA6IG51bGxfc2VydmljZSwKKyAgICAgICAgICAgICAgICAgbmV3X293bmVyID8gbmV3X293bmVyIDogbnVsbF9zZXJ2aWNlKTsKKworICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ld19zaWduYWwgKERCVVNfUEFUSF9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSU5URVJGQUNFX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5hbWVPd25lckNoYW5nZWQiKTsKKworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghZGJ1c19tZXNzYWdlX3NldF9zZW5kZXIgKG1lc3NhZ2UsIERCVVNfU0VSVklDRV9EQlVTKSkKKyAgICBnb3RvIG9vbTsKKworICBpZiAoIWRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZzZXJ2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCBvbGRfb3duZXIgPyAmb2xkX293bmVyIDogJm51bGxfc2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsIG5ld19vd25lciA/ICZuZXdfb3duZXIgOiAmbnVsbF9zZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgIGdvdG8gb29tOworCisgIF9kYnVzX2Fzc2VydCAoZGJ1c19tZXNzYWdlX2hhc19zaWduYXR1cmUgKG1lc3NhZ2UsICJzc3MiKSk7CisKKyAgaWYgKCFidXNfdHJhbnNhY3Rpb25fY2FwdHVyZSAodHJhbnNhY3Rpb24sIE5VTEwsIE5VTEwsIG1lc3NhZ2UpKQorICAgIGdvdG8gb29tOworCisgIHJldHZhbCA9IGJ1c19kaXNwYXRjaF9tYXRjaGVzICh0cmFuc2FjdGlvbiwgTlVMTCwgTlVMTCwgbWVzc2FnZSwgZXJyb3IpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworCisgIHJldHVybiByZXR2YWw7CisKKyBvb206CisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIEJVU19TRVRfT09NIChlcnJvcik7CisgIHJldHVybiBGQUxTRTsKK30KKworZGJ1c19ib29sX3QKK2J1c19kcml2ZXJfc2VuZF9zZXJ2aWNlX2xvc3QgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorCQkJICAgICAgY29uc3QgY2hhciAgICAgKnNlcnZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXdfc2lnbmFsIChEQlVTX1BBVEhfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0lOVEVSRkFDRV9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOYW1lTG9zdCIpOworCisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFkYnVzX21lc3NhZ2Vfc2V0X2Rlc3RpbmF0aW9uIChtZXNzYWdlLCBidXNfY29ubmVjdGlvbl9nZXRfbmFtZSAoY29ubmVjdGlvbikpIHx8CisgICAgICAhZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJnNlcnZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFidXNfdHJhbnNhY3Rpb25fc2VuZF9mcm9tX2RyaXZlciAodHJhbnNhY3Rpb24sIGNvbm5lY3Rpb24sIG1lc3NhZ2UpKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9Cit9CisKK2RidXNfYm9vbF90CitidXNfZHJpdmVyX3NlbmRfc2VydmljZV9hY3F1aXJlZCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKnNlcnZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBEQnVzTWVzc2FnZSAqbWVzc2FnZTsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ld19zaWduYWwgKERCVVNfUEFUSF9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSU5URVJGQUNFX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5hbWVBY3F1aXJlZCIpOworCisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFkYnVzX21lc3NhZ2Vfc2V0X2Rlc3RpbmF0aW9uIChtZXNzYWdlLCBidXNfY29ubmVjdGlvbl9nZXRfbmFtZSAoY29ubmVjdGlvbikpIHx8CisgICAgICAhZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJnNlcnZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFidXNfdHJhbnNhY3Rpb25fc2VuZF9mcm9tX2RyaXZlciAodHJhbnNhY3Rpb24sIGNvbm5lY3Rpb24sIG1lc3NhZ2UpKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorY3JlYXRlX3VuaXF1ZV9jbGllbnRfbmFtZSAoQnVzUmVnaXN0cnkgKnJlZ2lzdHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgKnN0cikKK3sKKyAgLyogV2UgbmV2ZXIgd2FudCB0byB1c2UgdGhlIHNhbWUgdW5pcXVlIGNsaWVudCBuYW1lIHR3aWNlLCBiZWNhdXNlCisgICAqIHdlIHdhbnQgdG8gZ3VhcmFudGVlIHRoYXQgaWYgeW91IHNlbmQgYSBtZXNzYWdlIHRvIGEgZ2l2ZW4gdW5pcXVlCisgICAqIG5hbWUsIHlvdSBhbHdheXMgZ2V0IHRoZSBzYW1lIGFwcGxpY2F0aW9uLiBTbyB3ZSB1c2UgdHdvIG51bWJlcnMKKyAgICogZm9yIElOVF9NQVggKiBJTlRfTUFYIGNvbWJpbmF0aW9ucywgc2hvdWxkIGJlIHByZXR0eSBzYWZlIGFnYWluc3QKKyAgICogd3JhcGFyb3VuZC4KKyAgICovCisgIC8qIEZJWE1FIHRoZXNlIHNob3VsZCBiZSBpbiBCdXNSZWdpc3RyeSByYXRoZXIgdGhhbiBzdGF0aWMgdmFycyAqLworICBzdGF0aWMgaW50IG5leHRfbWFqb3JfbnVtYmVyID0gMDsKKyAgc3RhdGljIGludCBuZXh0X21pbm9yX251bWJlciA9IDA7CisgIGludCBsZW47CisKKyAgbGVuID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHN0cik7CisKKyAgd2hpbGUgKFRSVUUpCisgICAgeworICAgICAgLyogc3RhcnQgb3V0IHdpdGggMS0wLCBnbyB0byAxLTEsIDEtMiwgMS0zLAorICAgICAgICogdXAgdG8gMS1NQVhJTlQsIHRoZW4gMi0wLCAyLTEsIGV0Yy4KKyAgICAgICAqLworICAgICAgaWYgKG5leHRfbWlub3JfbnVtYmVyIDw9IDApCisgICAgICAgIHsKKyAgICAgICAgICBuZXh0X21ham9yX251bWJlciArPSAxOworICAgICAgICAgIG5leHRfbWlub3JfbnVtYmVyID0gMDsKKyAgICAgICAgICBpZiAobmV4dF9tYWpvcl9udW1iZXIgPD0gMCkKKyAgICAgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIklOVF9NQVggKiBJTlRfTUFYIGNsaWVudHMgd2VyZSBhZGRlZCIpOworICAgICAgICB9CisKKyAgICAgIF9kYnVzX2Fzc2VydCAobmV4dF9tYWpvcl9udW1iZXIgPiAwKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAobmV4dF9taW5vcl9udW1iZXIgPj0gMCk7CisKKyAgICAgIC8qIGFwcG5hbWU6TUFKT1ItTUlOT1IgKi8KKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kIChzdHIsICI6IikpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX2ludCAoc3RyLCBuZXh0X21ham9yX251bWJlcikpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kIChzdHIsICIuIikpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX2ludCAoc3RyLCBuZXh0X21pbm9yX251bWJlcikpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgbmV4dF9taW5vcl9udW1iZXIgKz0gMTsKKworICAgICAgLyogQ2hlY2sgaWYgYSBjbGllbnQgd2l0aCB0aGUgbmFtZSBleGlzdHMgKi8KKyAgICAgIGlmIChidXNfcmVnaXN0cnlfbG9va3VwIChyZWdpc3RyeSwgc3RyKSA9PSBOVUxMKQorCWJyZWFrOworCisgICAgICAvKiBkcm9wIHRoZSBudW1iZXIgYWdhaW4sIHRyeSB0aGUgbmV4dCBvbmUuICovCisgICAgICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoc3RyLCBsZW4pOworICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitidXNfZHJpdmVyX2hhbmRsZV9oZWxsbyAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgREJ1c1N0cmluZyB1bmlxdWVfbmFtZTsKKyAgQnVzU2VydmljZSAqc2VydmljZTsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICBCdXNSZWdpc3RyeSAqcmVnaXN0cnk7CisgIEJ1c0Nvbm5lY3Rpb25zICpjb25uZWN0aW9uczsKKyAgREJ1c0Vycm9yIHRtcF9lcnJvcjsKKyAgaW50IGxpbWl0OworICBjb25zdCBjaGFyICpsaW1pdF9uYW1lOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIGlmIChidXNfY29ubmVjdGlvbl9pc19hY3RpdmUgKGNvbm5lY3Rpb24pKQorICAgIHsKKyAgICAgIC8qIFdlIGFscmVhZHkgaGFuZGxlZCBhbiBIZWxsbyBtZXNzYWdlIGZvciB0aGlzIGNvbm5lY3Rpb24uICovCisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJBbHJlYWR5IGhhbmRsZWQgYW4gSGVsbG8gbWVzc2FnZSIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAvKiBOb3RlIHRoYXQgd2hlbiB0aGVzZSBsaW1pdHMgYXJlIGV4Y2VlZGVkIHdlIGRvbid0IGRpc2Nvbm5lY3QgdGhlCisgICAqIGNvbm5lY3Rpb247IHdlIGp1c3Qgc29ydCBvZiBsZWF2ZSBpdCBoYW5naW5nIHRoZXJlIHVudGlsIGl0IHRpbWVzCisgICAqIG91dCBvciBkaXNjb25uZWN0cyBpdHNlbGYgb3IgaXMgZHJvcHBlZCBkdWUgdG8gdGhlIG1heCBudW1iZXIgb2YKKyAgICogaW5jb21wbGV0ZSBjb25uZWN0aW9ucy4gSXQncyBldmVuIE9LIGlmIHRoZSBjb25uZWN0aW9uIHdhbnRzIHRvCisgICAqIHJldHJ5IHRoZSBoZWxsbyBtZXNzYWdlLCB3ZSBzdXBwb3J0IHRoYXQuCisgICAqLworICBkYnVzX2Vycm9yX2luaXQgKCZ0bXBfZXJyb3IpOworICBjb25uZWN0aW9ucyA9IGJ1c19jb25uZWN0aW9uX2dldF9jb25uZWN0aW9ucyAoY29ubmVjdGlvbik7CisgIGlmICghYnVzX2Nvbm5lY3Rpb25zX2NoZWNrX2xpbWl0cyAoY29ubmVjdGlvbnMsIGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxpbWl0X25hbWUsICZsaW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1wX2Vycm9yKSkKKyAgICB7CisgICAgICBCdXNDb250ZXh0ICpjb250ZXh0OworCisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUICgmdG1wX2Vycm9yKTsKKyAgICAgIGNvbnRleHQgPSBidXNfY29ubmVjdGlvbl9nZXRfY29udGV4dCAoY29ubmVjdGlvbik7CisgICAgICBidXNfY29udGV4dF9sb2cgKGNvbnRleHQsIERCVVNfU1lTVEVNX0xPR19XQVJOSU5HLCAiJXMgKCVzPSVkKSIsCisgICAgICAgICAgdG1wX2Vycm9yLm1lc3NhZ2UsIGxpbWl0X25hbWUsIGxpbWl0KTsKKyAgICAgIGRidXNfbW92ZV9lcnJvciAoJnRtcF9lcnJvciwgZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmdW5pcXVlX25hbWUpKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHJldHZhbCA9IEZBTFNFOworCisgIHJlZ2lzdHJ5ID0gYnVzX2Nvbm5lY3Rpb25fZ2V0X3JlZ2lzdHJ5IChjb25uZWN0aW9uKTsKKworICBpZiAoIWNyZWF0ZV91bmlxdWVfY2xpZW50X25hbWUgKHJlZ2lzdHJ5LCAmdW5pcXVlX25hbWUpKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBnb3RvIG91dF8wOworICAgIH0KKworICBpZiAoIWJ1c19jb25uZWN0aW9uX2NvbXBsZXRlIChjb25uZWN0aW9uLCAmdW5pcXVlX25hbWUsIGVycm9yKSkKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICBnb3RvIG91dF8wOworICAgIH0KKworICBpZiAoIWRidXNfbWVzc2FnZV9zZXRfc2VuZGVyIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXNfY29ubmVjdGlvbl9nZXRfbmFtZSAoY29ubmVjdGlvbikpKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBnb3RvIG91dF8wOworICAgIH0KKworICBpZiAoIWJ1c19kcml2ZXJfc2VuZF93ZWxjb21lX21lc3NhZ2UgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsIHRyYW5zYWN0aW9uLCBlcnJvcikpCisgICAgZ290byBvdXRfMDsKKworICAvKiBDcmVhdGUgdGhlIHNlcnZpY2UgKi8KKyAgc2VydmljZSA9IGJ1c19yZWdpc3RyeV9lbnN1cmUgKHJlZ2lzdHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVuaXF1ZV9uYW1lLCBjb25uZWN0aW9uLCAwLCB0cmFuc2FjdGlvbiwgZXJyb3IpOworICBpZiAoc2VydmljZSA9PSBOVUxMKQorICAgIGdvdG8gb3V0XzA7CisKKyAgX2RidXNfYXNzZXJ0IChidXNfY29ubmVjdGlvbl9pc19hY3RpdmUgKGNvbm5lY3Rpb24pKTsKKyAgcmV0dmFsID0gVFJVRTsKKworIG91dF8wOgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJnVuaXF1ZV9uYW1lKTsKKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitidXNfZHJpdmVyX3NlbmRfd2VsY29tZV9tZXNzYWdlIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICpoZWxsb19tZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBEQnVzTWVzc2FnZSAqd2VsY29tZTsKKyAgY29uc3QgY2hhciAqbmFtZTsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBuYW1lID0gYnVzX2Nvbm5lY3Rpb25fZ2V0X25hbWUgKGNvbm5lY3Rpb24pOworICBfZGJ1c19hc3NlcnQgKG5hbWUgIT0gTlVMTCk7CisKKyAgd2VsY29tZSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX3JldHVybiAoaGVsbG9fbWVzc2FnZSk7CisgIGlmICh3ZWxjb21lID09IE5VTEwpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKHdlbGNvbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHdlbGNvbWUpOworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgX2RidXNfYXNzZXJ0IChkYnVzX21lc3NhZ2VfaGFzX3NpZ25hdHVyZSAod2VsY29tZSwgREJVU19UWVBFX1NUUklOR19BU19TVFJJTkcpKTsKKworICBpZiAoIWJ1c190cmFuc2FjdGlvbl9zZW5kX2Zyb21fZHJpdmVyICh0cmFuc2FjdGlvbiwgY29ubmVjdGlvbiwgd2VsY29tZSkpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmICh3ZWxjb21lKTsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmICh3ZWxjb21lKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KK30KKworc3RhdGljIGRidXNfYm9vbF90CitidXNfZHJpdmVyX2hhbmRsZV9saXN0X3NlcnZpY2VzIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBEQnVzTWVzc2FnZSAqcmVwbHk7CisgIGludCBsZW47CisgIGNoYXIgKipzZXJ2aWNlczsKKyAgQnVzUmVnaXN0cnkgKnJlZ2lzdHJ5OworICBpbnQgaTsKKyAgREJ1c01lc3NhZ2VJdGVyIGl0ZXI7CisgIERCdXNNZXNzYWdlSXRlciBzdWI7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgcmVnaXN0cnkgPSBidXNfY29ubmVjdGlvbl9nZXRfcmVnaXN0cnkgKGNvbm5lY3Rpb24pOworCisgIHJlcGx5ID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfcmV0dXJuIChtZXNzYWdlKTsKKyAgaWYgKHJlcGx5ID09IE5VTEwpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFidXNfcmVnaXN0cnlfbGlzdF9zZXJ2aWNlcyAocmVnaXN0cnksICZzZXJ2aWNlcywgJmxlbikpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBkYnVzX21lc3NhZ2VfaXRlcl9pbml0X2FwcGVuZCAocmVwbHksICZpdGVyKTsKKworICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX29wZW5fY29udGFpbmVyICgmaXRlciwgREJVU19UWVBFX0FSUkFZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HX0FTX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN1YikpCisgICAgeworICAgICAgZGJ1c19mcmVlX3N0cmluZ19hcnJheSAoc2VydmljZXMpOworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICB7CisgICAgLyogSW5jbHVkZSB0aGUgYnVzIGRyaXZlciBpbiB0aGUgbGlzdCAqLworICAgIGNvbnN0IGNoYXIgKnZfU1RSSU5HID0gREJVU19TRVJWSUNFX0RCVVM7CisgICAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfYmFzaWMgKCZzdWIsIERCVVNfVFlQRV9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2X1NUUklORykpCisgICAgICB7CisgICAgICAgIGRidXNfZnJlZV9zdHJpbmdfYXJyYXkgKHNlcnZpY2VzKTsKKyAgICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgfQorCisgIGkgPSAwOworICB3aGlsZSAoaSA8IGxlbikKKyAgICB7CisgICAgICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYyAoJnN1YiwgREJVU19UWVBFX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VydmljZXNbaV0pKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19mcmVlX3N0cmluZ19hcnJheSAoc2VydmljZXMpOworICAgICAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICArK2k7CisgICAgfQorCisgIGRidXNfZnJlZV9zdHJpbmdfYXJyYXkgKHNlcnZpY2VzKTsKKworICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX2Nsb3NlX2NvbnRhaW5lciAoJml0ZXIsICZzdWIpKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFidXNfdHJhbnNhY3Rpb25fc2VuZF9mcm9tX2RyaXZlciAodHJhbnNhY3Rpb24sIGNvbm5lY3Rpb24sIHJlcGx5KSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYnVzX2RyaXZlcl9oYW5kbGVfbGlzdF9hY3RpdmF0YWJsZV9zZXJ2aWNlcyAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkJCSAgICAgQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorCQkJCQkgICAgIERCdXNNZXNzYWdlICAgICptZXNzYWdlLAorCQkJCQkgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgREJ1c01lc3NhZ2UgKnJlcGx5OworICBpbnQgbGVuOworICBjaGFyICoqc2VydmljZXM7CisgIEJ1c0FjdGl2YXRpb24gKmFjdGl2YXRpb247CisgIGludCBpOworICBEQnVzTWVzc2FnZUl0ZXIgaXRlcjsKKyAgREJ1c01lc3NhZ2VJdGVyIHN1YjsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBhY3RpdmF0aW9uID0gYnVzX2Nvbm5lY3Rpb25fZ2V0X2FjdGl2YXRpb24gKGNvbm5lY3Rpb24pOworCisgIHJlcGx5ID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfcmV0dXJuIChtZXNzYWdlKTsKKyAgaWYgKHJlcGx5ID09IE5VTEwpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFidXNfYWN0aXZhdGlvbl9saXN0X3NlcnZpY2VzIChhY3RpdmF0aW9uLCAmc2VydmljZXMsICZsZW4pKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgZGJ1c19tZXNzYWdlX2l0ZXJfaW5pdF9hcHBlbmQgKHJlcGx5LCAmaXRlcik7CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9vcGVuX2NvbnRhaW5lciAoJml0ZXIsIERCVVNfVFlQRV9BUlJBWSwKKwkJCQkJIERCVVNfVFlQRV9TVFJJTkdfQVNfU1RSSU5HLAorCQkJCQkgJnN1YikpCisgICAgeworICAgICAgZGJ1c19mcmVlX3N0cmluZ19hcnJheSAoc2VydmljZXMpOworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICB7CisgICAgLyogSW5jbHVkZSB0aGUgYnVzIGRyaXZlciBpbiB0aGUgbGlzdCAqLworICAgIGNvbnN0IGNoYXIgKnZfU1RSSU5HID0gREJVU19TRVJWSUNFX0RCVVM7CisgICAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfYmFzaWMgKCZzdWIsIERCVVNfVFlQRV9TVFJJTkcsCisJCQkJCSAmdl9TVFJJTkcpKQorICAgICAgeworCWRidXNfZnJlZV9zdHJpbmdfYXJyYXkgKHNlcnZpY2VzKTsKKwlkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKwlCVVNfU0VUX09PTSAoZXJyb3IpOworCXJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgfQorCisgIGkgPSAwOworICB3aGlsZSAoaSA8IGxlbikKKyAgICB7CisgICAgICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYyAoJnN1YiwgREJVU19UWVBFX1NUUklORywKKwkJCQkJICAgJnNlcnZpY2VzW2ldKSkKKwl7CisJICBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5IChzZXJ2aWNlcyk7CisJICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKwkgIEJVU19TRVRfT09NIChlcnJvcik7CisJICByZXR1cm4gRkFMU0U7CisJfQorICAgICAgKytpOworICAgIH0KKworICBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5IChzZXJ2aWNlcyk7CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9jbG9zZV9jb250YWluZXIgKCZpdGVyLCAmc3ViKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghYnVzX3RyYW5zYWN0aW9uX3NlbmRfZnJvbV9kcml2ZXIgKHRyYW5zYWN0aW9uLCBjb25uZWN0aW9uLCByZXBseSkpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2J1c19kcml2ZXJfaGFuZGxlX2FjcXVpcmVfc2VydmljZSAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgREJ1c01lc3NhZ2UgKnJlcGx5OworICBEQnVzU3RyaW5nIHNlcnZpY2VfbmFtZTsKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgZGJ1c191aW50MzJfdCBzZXJ2aWNlX3JlcGx5OworICBkYnVzX3VpbnQzMl90IGZsYWdzOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIEJ1c1JlZ2lzdHJ5ICpyZWdpc3RyeTsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICByZWdpc3RyeSA9IGJ1c19jb25uZWN0aW9uX2dldF9yZWdpc3RyeSAoY29ubmVjdGlvbik7CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MgKG1lc3NhZ2UsIGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfVUlOVDMyLCAmZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIF9kYnVzX3ZlcmJvc2UgKCJUcnlpbmcgdG8gb3duIG5hbWUgJXMgd2l0aCBmbGFncyAweCV4XG4iLCBuYW1lLCBmbGFncyk7CisKKyAgcmV0dmFsID0gRkFMU0U7CisgIHJlcGx5ID0gTlVMTDsKKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnNlcnZpY2VfbmFtZSwgbmFtZSk7CisKKyAgaWYgKCFidXNfcmVnaXN0cnlfYWNxdWlyZV9zZXJ2aWNlIChyZWdpc3RyeSwgY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VydmljZV9uYW1lLCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VydmljZV9yZXBseSwgdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKQorICAgIGdvdG8gb3V0OworCisgIHJlcGx5ID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfcmV0dXJuIChtZXNzYWdlKTsKKyAgaWYgKHJlcGx5ID09IE5VTEwpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAoIWRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAocmVwbHksIERCVVNfVFlQRV9VSU5UMzIsICZzZXJ2aWNlX3JlcGx5LCBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAoIWJ1c190cmFuc2FjdGlvbl9zZW5kX2Zyb21fZHJpdmVyICh0cmFuc2FjdGlvbiwgY29ubmVjdGlvbiwgcmVwbHkpKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgcmV0dmFsID0gVFJVRTsKKworIG91dDoKKyAgaWYgKHJlcGx5KQorICAgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2J1c19kcml2ZXJfaGFuZGxlX3JlbGVhc2Vfc2VydmljZSAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgREJ1c01lc3NhZ2UgKnJlcGx5OworICBEQnVzU3RyaW5nIHNlcnZpY2VfbmFtZTsKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgZGJ1c191aW50MzJfdCBzZXJ2aWNlX3JlcGx5OworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIEJ1c1JlZ2lzdHJ5ICpyZWdpc3RyeTsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICByZWdpc3RyeSA9IGJ1c19jb25uZWN0aW9uX2dldF9yZWdpc3RyeSAoY29ubmVjdGlvbik7CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MgKG1lc3NhZ2UsIGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIF9kYnVzX3ZlcmJvc2UgKCJUcnlpbmcgdG8gcmVsZWFzZSBuYW1lICVzXG4iLCBuYW1lKTsKKworICByZXR2YWwgPSBGQUxTRTsKKyAgcmVwbHkgPSBOVUxMOworCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmc2VydmljZV9uYW1lLCBuYW1lKTsKKworICBpZiAoIWJ1c19yZWdpc3RyeV9yZWxlYXNlX3NlcnZpY2UgKHJlZ2lzdHJ5LCBjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXJ2aWNlX25hbWUsICZzZXJ2aWNlX3JlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uLCBlcnJvcikpCisgICAgZ290byBvdXQ7CisKKyAgcmVwbHkgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9yZXR1cm4gKG1lc3NhZ2UpOworICBpZiAocmVwbHkgPT0gTlVMTCkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIGlmICghZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChyZXBseSwgREJVU19UWVBFX1VJTlQzMiwgJnNlcnZpY2VfcmVwbHksIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIGlmICghYnVzX3RyYW5zYWN0aW9uX3NlbmRfZnJvbV9kcml2ZXIgKHRyYW5zYWN0aW9uLCBjb25uZWN0aW9uLCByZXBseSkpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICByZXR2YWwgPSBUUlVFOworCisgb3V0OgorICBpZiAocmVwbHkpCisgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYnVzX2RyaXZlcl9oYW5kbGVfc2VydmljZV9leGlzdHMgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIERCdXNNZXNzYWdlICpyZXBseTsKKyAgREJ1c1N0cmluZyBzZXJ2aWNlX25hbWU7CisgIEJ1c1NlcnZpY2UgKnNlcnZpY2U7CisgIGRidXNfYm9vbF90IHNlcnZpY2VfZXhpc3RzOworICBjb25zdCBjaGFyICpuYW1lOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIEJ1c1JlZ2lzdHJ5ICpyZWdpc3RyeTsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICByZWdpc3RyeSA9IGJ1c19jb25uZWN0aW9uX2dldF9yZWdpc3RyeSAoY29ubmVjdGlvbik7CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MgKG1lc3NhZ2UsIGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJldHZhbCA9IEZBTFNFOworCisgIGlmIChzdHJjbXAgKG5hbWUsIERCVVNfU0VSVklDRV9EQlVTKSA9PSAwKQorICAgIHsKKyAgICAgIHNlcnZpY2VfZXhpc3RzID0gVFJVRTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnNlcnZpY2VfbmFtZSwgbmFtZSk7CisgICAgICBzZXJ2aWNlID0gYnVzX3JlZ2lzdHJ5X2xvb2t1cCAocmVnaXN0cnksICZzZXJ2aWNlX25hbWUpOworICAgICAgc2VydmljZV9leGlzdHMgPSBzZXJ2aWNlICE9IE5VTEw7CisgICAgfQorCisgIHJlcGx5ID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfcmV0dXJuIChtZXNzYWdlKTsKKyAgaWYgKHJlcGx5ID09IE5VTEwpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAoIWRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAocmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfQk9PTEVBTiwgJnNlcnZpY2VfZXhpc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCkpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAoIWJ1c190cmFuc2FjdGlvbl9zZW5kX2Zyb21fZHJpdmVyICh0cmFuc2FjdGlvbiwgY29ubmVjdGlvbiwgcmVwbHkpKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgcmV0dmFsID0gVFJVRTsKKworIG91dDoKKyAgaWYgKHJlcGx5KQorICAgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYnVzX2RyaXZlcl9oYW5kbGVfYWN0aXZhdGVfc2VydmljZSAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgZGJ1c191aW50MzJfdCBmbGFnczsKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICBCdXNBY3RpdmF0aW9uICphY3RpdmF0aW9uOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIGFjdGl2YXRpb24gPSBidXNfY29ubmVjdGlvbl9nZXRfYWN0aXZhdGlvbiAoY29ubmVjdGlvbik7CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MgKG1lc3NhZ2UsIGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfVUlOVDMyLCAmZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgX2RidXNfdmVyYm9zZSAoIk5vIG1lbW9yeSB0byBnZXQgYXJndW1lbnRzIHRvIFN0YXJ0U2VydmljZUJ5TmFtZVxuIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHJldHZhbCA9IEZBTFNFOworCisgIGlmICghYnVzX2FjdGl2YXRpb25fYWN0aXZhdGVfc2VydmljZSAoYWN0aXZhdGlvbiwgY29ubmVjdGlvbiwgdHJhbnNhY3Rpb24sIEZBTFNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsIG5hbWUsIGVycm9yKSkKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICBfZGJ1c192ZXJib3NlICgiYnVzX2FjdGl2YXRpb25fYWN0aXZhdGVfc2VydmljZSgpIGZhaWxlZFxuIik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgcmV0dmFsID0gVFJVRTsKKworIG91dDoKKyAgcmV0dXJuIHJldHZhbDsKK30KKworZGJ1c19ib29sX3QKK2J1c19kcml2ZXJfc2VuZF9hY2tfcmVwbHkgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIERCdXNNZXNzYWdlICpyZXBseTsKKworICBpZiAoZGJ1c19tZXNzYWdlX2dldF9ub19yZXBseSAobWVzc2FnZSkpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgcmVwbHkgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9yZXR1cm4gKG1lc3NhZ2UpOworICBpZiAocmVwbHkgPT0gTlVMTCkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIWJ1c190cmFuc2FjdGlvbl9zZW5kX2Zyb21fZHJpdmVyICh0cmFuc2FjdGlvbiwgY29ubmVjdGlvbiwgcmVwbHkpKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgKiBTZW5kIGEgbWVzc2FnZSBmcm9tIHRoZSBkcml2ZXIsIGFjdGl2YXRpbmcgdGhlIGRlc3RpbmF0aW9uIGlmIG5lY2Vzc2FyeS4KKyAqIFRoZSBtZXNzYWdlIG11c3QgYWxyZWFkeSBoYXZlIGEgZGVzdGluYXRpb24gc2V0LgorICovCitzdGF0aWMgZGJ1c19ib29sX3QKK2J1c19kcml2ZXJfc2VuZF9vcl9hY3RpdmF0ZSAoQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBCdXNDb250ZXh0ICpjb250ZXh0OworICBCdXNTZXJ2aWNlICpzZXJ2aWNlOworICBjb25zdCBjaGFyICpzZXJ2aWNlX25hbWU7CisgIERCdXNTdHJpbmcgc2VydmljZV9zdHJpbmc7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgc2VydmljZV9uYW1lID0gZGJ1c19tZXNzYWdlX2dldF9kZXN0aW5hdGlvbiAobWVzc2FnZSk7CisKKyAgX2RidXNfYXNzZXJ0IChzZXJ2aWNlX25hbWUgIT0gTlVMTCk7CisKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZzZXJ2aWNlX3N0cmluZywgc2VydmljZV9uYW1lKTsKKworICBjb250ZXh0ID0gYnVzX3RyYW5zYWN0aW9uX2dldF9jb250ZXh0ICh0cmFuc2FjdGlvbik7CisKKyAgc2VydmljZSA9IGJ1c19yZWdpc3RyeV9sb29rdXAgKGJ1c19jb250ZXh0X2dldF9yZWdpc3RyeSAoY29udGV4dCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VydmljZV9zdHJpbmcpOworCisgIGlmIChzZXJ2aWNlID09IE5VTEwpCisgICAgeworICAgICAgLyogZGVzdGluYXRpb24gaXNuJ3QgY29ubmVjdGVkIHlldDsgcGFzcyB0aGUgbWVzc2FnZSB0byBhY3RpdmF0aW9uICovCisgICAgICBCdXNBY3RpdmF0aW9uICphY3RpdmF0aW9uOworCisgICAgICBhY3RpdmF0aW9uID0gYnVzX2NvbnRleHRfZ2V0X2FjdGl2YXRpb24gKGNvbnRleHQpOworCisgICAgICBpZiAoIWJ1c190cmFuc2FjdGlvbl9jYXB0dXJlICh0cmFuc2FjdGlvbiwgTlVMTCwgTlVMTCwgbWVzc2FnZSkpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJObyBtZW1vcnkgZm9yIGJ1c190cmFuc2FjdGlvbl9jYXB0dXJlKCkiKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgaWYgKCFidXNfYWN0aXZhdGlvbl9hY3RpdmF0ZV9zZXJ2aWNlIChhY3RpdmF0aW9uLCBOVUxMLCB0cmFuc2FjdGlvbiwgVFJVRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwgc2VydmljZV9uYW1lLCBlcnJvcikpCisgICAgICAgIHsKKyAgICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoImJ1c19hY3RpdmF0aW9uX2FjdGl2YXRlX3NlcnZpY2UoKSBmYWlsZWQiKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBEQnVzQ29ubmVjdGlvbiAqc2VydmljZV9jb25uOworCisgICAgICBzZXJ2aWNlX2Nvbm4gPSBidXNfc2VydmljZV9nZXRfcHJpbWFyeV9vd25lcnNfY29ubmVjdGlvbiAoc2VydmljZSk7CisKKyAgICAgIGlmICghYnVzX3RyYW5zYWN0aW9uX3NlbmRfZnJvbV9kcml2ZXIgKHRyYW5zYWN0aW9uLCBzZXJ2aWNlX2Nvbm4sIG1lc3NhZ2UpKQorICAgICAgICB7CisgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiTm8gbWVtb3J5IGZvciBidXNfdHJhbnNhY3Rpb25fc2VuZF9mcm9tX2RyaXZlcigpIik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2J1c19kcml2ZXJfaGFuZGxlX3VwZGF0ZV9hY3RpdmF0aW9uX2Vudmlyb25tZW50IChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIEJ1c0FjdGl2YXRpb24gKmFjdGl2YXRpb247CisgIEJ1c0NvbnRleHQgKmNvbnRleHQ7CisgIERCdXNNZXNzYWdlSXRlciBpdGVyOworICBEQnVzTWVzc2FnZUl0ZXIgZGljdF9pdGVyOworICBEQnVzTWVzc2FnZUl0ZXIgZGljdF9lbnRyeV9pdGVyOworICBpbnQgYXJyYXlfdHlwZTsKKyAgaW50IGtleV90eXBlOworICBEQnVzTGlzdCAqa2V5cywgKmtleV9saW5rOworICBEQnVzTGlzdCAqdmFsdWVzLCAqdmFsdWVfbGluazsKKyAgREJ1c01lc3NhZ2UgKnN5c3RlbWRfbWVzc2FnZTsKKyAgREJ1c01lc3NhZ2VJdGVyIHN5c3RlbWRfaXRlcjsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBjb250ZXh0ID0gYnVzX2Nvbm5lY3Rpb25fZ2V0X2NvbnRleHQgKGNvbm5lY3Rpb24pOworCisgIGlmIChidXNfY29udGV4dF9nZXRfc2VydmljZWhlbHBlciAoY29udGV4dCkgIT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfQUNDRVNTX0RFTklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IGNoYW5nZSBhY3RpdmF0aW9uIGVudmlyb25tZW50ICIKKyAgICAgICAgICAgICAgICAgICAgICAib24gYSBzeXN0ZW0gYnVzLiIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBhY3RpdmF0aW9uID0gYnVzX2Nvbm5lY3Rpb25fZ2V0X2FjdGl2YXRpb24gKGNvbm5lY3Rpb24pOworCisgIGRidXNfbWVzc2FnZV9pdGVyX2luaXQgKG1lc3NhZ2UsICZpdGVyKTsKKworICAvKiBUaGUgbWVzc2FnZSBzaWduYXR1cmUgaGFzIGFscmVhZHkgYmVlbiBjaGVja2VkIGZvciB1cywKKyAgICogc28gbGV0J3MganVzdCBhc3NlcnQgaXQncyByaWdodC4KKyAgICovCisgIF9kYnVzX2Fzc2VydCAoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2FyZ190eXBlICgmaXRlcikgPT0gREJVU19UWVBFX0FSUkFZKTsKKworICBkYnVzX21lc3NhZ2VfaXRlcl9yZWN1cnNlICgmaXRlciwgJmRpY3RfaXRlcik7CisKKyAgcmV0dmFsID0gRkFMU0U7CisgIHN5c3RlbWRfbWVzc2FnZSA9IE5VTEw7CisKKyAgLyogVGhlbiBsb29wIHRocm91Z2ggdGhlIHNlbnQgZGljdGlvbmFyeSwgYWRkIHRoZSBsb2NhdGlvbiBvZgorICAgKiB0aGUgZW52aXJvbm1lbnQga2V5cyBhbmQgdmFsdWVzIHRvIGxpc3RzLiBUaGUgcmVzdWx0IHdpbGwKKyAgICogYmUgaW4gcmV2ZXJzZSBvcmRlciwgc28gd2UgZG9uJ3QgaGF2ZSB0byBjb25zdGFudGx5IHNlYXJjaAorICAgKiBmb3IgdGhlIGVuZCBvZiB0aGUgbGlzdCBpbiBhIGxvb3AuCisgICAqLworICBrZXlzID0gTlVMTDsKKyAgdmFsdWVzID0gTlVMTDsKKyAgd2hpbGUgKChhcnJheV90eXBlID0gZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2FyZ190eXBlICgmZGljdF9pdGVyKSkgPT0gREJVU19UWVBFX0RJQ1RfRU5UUlkpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfcmVjdXJzZSAoJmRpY3RfaXRlciwgJmRpY3RfZW50cnlfaXRlcik7CisKKyAgICAgIHdoaWxlICgoa2V5X3R5cGUgPSBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJnX3R5cGUgKCZkaWN0X2VudHJ5X2l0ZXIpKSA9PSBEQlVTX1RZUEVfU1RSSU5HKQorICAgICAgICB7CisgICAgICAgICAgY2hhciAqa2V5OworICAgICAgICAgIGNoYXIgKnZhbHVlOworICAgICAgICAgIGludCB2YWx1ZV90eXBlOworCisgICAgICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2Jhc2ljICgmZGljdF9lbnRyeV9pdGVyLCAma2V5KTsKKyAgICAgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9uZXh0ICgmZGljdF9lbnRyeV9pdGVyKTsKKworICAgICAgICAgIHZhbHVlX3R5cGUgPSBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJnX3R5cGUgKCZkaWN0X2VudHJ5X2l0ZXIpOworCisgICAgICAgICAgaWYgKHZhbHVlX3R5cGUgIT0gREJVU19UWVBFX1NUUklORykKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2Jhc2ljICgmZGljdF9lbnRyeV9pdGVyLCAmdmFsdWUpOworCisgICAgICAgICAgaWYgKCFfZGJ1c19saXN0X2FwcGVuZCAoJmtleXMsIGtleSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKCFfZGJ1c19saXN0X2FwcGVuZCAoJnZhbHVlcywgdmFsdWUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGRidXNfbWVzc2FnZV9pdGVyX25leHQgKCZkaWN0X2VudHJ5X2l0ZXIpOworICAgICAgICB9CisKKyAgICAgIGlmIChrZXlfdHlwZSAhPSBEQlVTX1RZUEVfSU5WQUxJRCkKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRidXNfbWVzc2FnZV9pdGVyX25leHQgKCZkaWN0X2l0ZXIpOworICAgIH0KKworICBpZiAoYXJyYXlfdHlwZSAhPSBEQlVTX1RZUEVfSU5WQUxJRCkKKyAgICBnb3RvIG91dDsKKworICBfZGJ1c19hc3NlcnQgKF9kYnVzX2xpc3RfZ2V0X2xlbmd0aCAoJmtleXMpID09IF9kYnVzX2xpc3RfZ2V0X2xlbmd0aCAoJnZhbHVlcykpOworCisgIGlmIChidXNfY29udGV4dF9nZXRfc3lzdGVtZF9hY3RpdmF0aW9uIChidXNfY29ubmVjdGlvbl9nZXRfY29udGV4dCAoY29ubmVjdGlvbikpKQorICAgIHsKKyAgICAgIC8qIFByZXBhcmUgYSBjYWxsIHRvIGZvcndhcmQgZW52aXJvbm1lbnQgdXBkYXRlcyB0byBzeXN0ZW1kICovCisgICAgICBzeXN0ZW1kX21lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsICgib3JnLmZyZWVkZXNrdG9wLnN5c3RlbWQxIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvb3JnL2ZyZWVkZXNrdG9wL3N5c3RlbWQxIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3Auc3lzdGVtZDEuTWFuYWdlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2V0RW52aXJvbm1lbnQiKTsKKyAgICAgIGlmIChzeXN0ZW1kX21lc3NhZ2UgPT0gTlVMTCB8fAorICAgICAgICAgICFkYnVzX21lc3NhZ2Vfc2V0X3NlbmRlciAoc3lzdGVtZF9tZXNzYWdlLCBEQlVTX1NFUlZJQ0VfREJVUykpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJObyBtZW1vcnkgdG8gY3JlYXRlIHN5c3RlbWQgbWVzc2FnZVxuIik7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgICAgZGJ1c19tZXNzYWdlX3NldF9ub19yZXBseSAoc3lzdGVtZF9tZXNzYWdlLCBUUlVFKTsKKyAgICAgIGRidXNfbWVzc2FnZV9pdGVyX2luaXRfYXBwZW5kIChzeXN0ZW1kX21lc3NhZ2UsICZpdGVyKTsKKworICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9vcGVuX2NvbnRhaW5lciAoJml0ZXIsIERCVVNfVFlQRV9BUlJBWSwgInMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN5c3RlbWRfaXRlcikpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJObyBtZW1vcnkgdG8gb3BlbiBzeXN0ZW1kIG1lc3NhZ2UgY29udGFpbmVyXG4iKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgIH0KKworICBrZXlfbGluayA9IGtleXM7CisgIHZhbHVlX2xpbmsgPSB2YWx1ZXM7CisgIHdoaWxlIChrZXlfbGluayAhPSBOVUxMKQorICB7CisgICAgICBjb25zdCBjaGFyICprZXk7CisgICAgICBjb25zdCBjaGFyICp2YWx1ZTsKKworICAgICAga2V5ID0ga2V5X2xpbmstPmRhdGE7CisgICAgICB2YWx1ZSA9IHZhbHVlX2xpbmstPmRhdGE7CisKKyAgICAgIGlmICghYnVzX2FjdGl2YXRpb25fc2V0X2Vudmlyb25tZW50X3ZhcmlhYmxlIChhY3RpdmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSwgdmFsdWUsIGVycm9yKSkKKyAgICAgICAgeworICAgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiYnVzX2FjdGl2YXRpb25fc2V0X2Vudmlyb25tZW50X3ZhcmlhYmxlKCkgZmFpbGVkXG4iKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICBpZiAoc3lzdGVtZF9tZXNzYWdlICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBEQnVzU3RyaW5nIGVudmxpbmU7CisgICAgICAgICAgY29uc3QgY2hhciAqczsKKworICAgICAgICAgIC8qIFNldEVudmlyb25tZW50IHdhbnRzIGFuIGFycmF5IG9mIEtFWT1WQUxVRSBzdHJpbmdzICovCisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmVudmxpbmUpIHx8CisgICAgICAgICAgICAgICFfZGJ1c19zdHJpbmdfYXBwZW5kX3ByaW50ZiAoJmVudmxpbmUsICIlcz0lcyIsIGtleSwgdmFsdWUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiTm8gbWVtb3J5IHRvIGZvcm1hdCBzeXN0ZW1kIGVudmlyb25tZW50IGxpbmVcbiIpOworICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmVudmxpbmUpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIHMgPSBfZGJ1c19zdHJpbmdfZ2V0X2RhdGEgKCZlbnZsaW5lKTsKKworICAgICAgICAgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljICgmc3lzdGVtZF9pdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmcykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJObyBtZW1vcnkgdG8gYXBwZW5kIHN5c3RlbWQgZW52aXJvbm1lbnQgbGluZVxuIik7CisgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmZW52bGluZSk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZlbnZsaW5lKTsKKyAgICAgICAgfQorCisgICAgICBrZXlfbGluayA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJmtleXMsIGtleV9saW5rKTsKKyAgICAgIHZhbHVlX2xpbmsgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZ2YWx1ZXMsIHZhbHVlX2xpbmspOworICB9CisKKyAgLyogRklYTUU6IFdlIGNhbiBmYWlsIGVhcmx5IGhhdmluZyBzZXQgb25seSBzb21lIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMsCisgICAqIChiZWNhdXNlIG9mIE9PTSBmYWlsdXJlKS4gIEl0J3Mgc29ydCBvZiBoYXJkIHRvIGZpeCBhbmQgaXQgZG9lc24ndCByZWFsbHkKKyAgICogbWF0dGVyLCBzbyB3ZSdyZSBwdW50aW5nIGZvciBub3cuCisgICAqLworICBpZiAoa2V5X2xpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoc3lzdGVtZF9tZXNzYWdlICE9IE5VTEwpCisgICAgICAgIGRidXNfbWVzc2FnZV9pdGVyX2FiYW5kb25fY29udGFpbmVyICgmaXRlciwgJnN5c3RlbWRfaXRlcik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgaWYgKHN5c3RlbWRfbWVzc2FnZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfY2xvc2VfY29udGFpbmVyICgmaXRlciwgJnN5c3RlbWRfaXRlcikpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJObyBtZW1vcnkgdG8gY2xvc2Ugc3lzdGVtZCBtZXNzYWdlIGNvbnRhaW5lclxuIik7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgICAgaWYgKCFidXNfZHJpdmVyX3NlbmRfb3JfYWN0aXZhdGUgKHRyYW5zYWN0aW9uLCBzeXN0ZW1kX21lc3NhZ2UsIGVycm9yKSkKKyAgICAgICAgeworICAgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiYnVzX2RyaXZlcl9zZW5kX29yX2FjdGl2YXRlKCkgZmFpbGVkXG4iKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgIH0KKworICBpZiAoIWJ1c19kcml2ZXJfc2VuZF9hY2tfcmVwbHkgKGNvbm5lY3Rpb24sIHRyYW5zYWN0aW9uLCBtZXNzYWdlLCBlcnJvcikpCisgICAgZ290byBvdXQ7CisKKyAgcmV0dmFsID0gVFJVRTsKKworIG91dDoKKyAgaWYgKHN5c3RlbWRfbWVzc2FnZSAhPSBOVUxMKQorICAgIGRidXNfbWVzc2FnZV91bnJlZiAoc3lzdGVtZF9tZXNzYWdlKTsKKyAgX2RidXNfbGlzdF9jbGVhciAoJmtleXMpOworICBfZGJ1c19saXN0X2NsZWFyICgmdmFsdWVzKTsKKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitidXNfZHJpdmVyX2hhbmRsZV9hZGRfbWF0Y2ggKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIEJ1c01hdGNoUnVsZSAqcnVsZTsKKyAgY29uc3QgY2hhciAqdGV4dCwgKmJ1c3R5cGU7CisgIERCdXNTdHJpbmcgc3RyOworICBCdXNNYXRjaG1ha2VyICptYXRjaG1ha2VyOworICBpbnQgbGltaXQ7CisgIEJ1c0NvbnRleHQgKmNvbnRleHQ7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgdGV4dCA9IE5VTEw7CisgIHJ1bGUgPSBOVUxMOworCisgIGNvbnRleHQgPSBidXNfdHJhbnNhY3Rpb25fZ2V0X2NvbnRleHQgKHRyYW5zYWN0aW9uKTsKKyAgbGltaXQgPSBidXNfY29udGV4dF9nZXRfbWF4X21hdGNoX3J1bGVzX3Blcl9jb25uZWN0aW9uIChjb250ZXh0KTsKKworICBpZiAoYnVzX2Nvbm5lY3Rpb25fZ2V0X25fbWF0Y2hfcnVsZXMgKGNvbm5lY3Rpb24pID49IGxpbWl0KQorICAgIHsKKyAgICAgIERCdXNFcnJvciB0bXBfZXJyb3I7CisKKyAgICAgIGRidXNfZXJyb3JfaW5pdCAoJnRtcF9lcnJvcik7CisgICAgICBkYnVzX3NldF9lcnJvciAoJnRtcF9lcnJvciwgREJVU19FUlJPUl9MSU1JVFNfRVhDRUVERUQsCisgICAgICAgICAgICAgICAgICAgICAgIkNvbm5lY3Rpb24gXCIlc1wiIGlzIG5vdCBhbGxvd2VkIHRvIGFkZCBtb3JlIG1hdGNoIHJ1bGVzICIKKyAgICAgICAgICAgICAgICAgICAgICAiKGluY3JlYXNlIGxpbWl0cyBpbiBjb25maWd1cmF0aW9uIGZpbGUgaWYgcmVxdWlyZWQ7ICIKKyAgICAgICAgICAgICAgICAgICAgICAibWF4X21hdGNoX3J1bGVzX3Blcl9jb25uZWN0aW9uPSVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgYnVzX2Nvbm5lY3Rpb25faXNfYWN0aXZlIChjb25uZWN0aW9uKSA/CisgICAgICAgICAgICAgICAgICAgICAgYnVzX2Nvbm5lY3Rpb25fZ2V0X25hbWUgKGNvbm5lY3Rpb24pIDoKKyAgICAgICAgICAgICAgICAgICAgICAiKGluYWN0aXZlKSIsCisgICAgICAgICAgICAgICAgICAgICAgbGltaXQpOworICAgICAgYnVzX2NvbnRleHRfbG9nIChjb250ZXh0LCBEQlVTX1NZU1RFTV9MT0dfV0FSTklORywgIiVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgdG1wX2Vycm9yLm1lc3NhZ2UpOworICAgICAgZGJ1c19tb3ZlX2Vycm9yICgmdG1wX2Vycm9yLCBlcnJvcik7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MgKG1lc3NhZ2UsIGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIk5vIG1lbW9yeSB0byBnZXQgYXJndW1lbnRzIHRvIEFkZE1hdGNoXG4iKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnN0ciwgdGV4dCk7CisKKyAgcnVsZSA9IGJ1c19tYXRjaF9ydWxlX3BhcnNlIChjb25uZWN0aW9uLCAmc3RyLCBlcnJvcik7CisgIGlmIChydWxlID09IE5VTEwpCisgICAgZ290byBmYWlsZWQ7CisKKyAgYnVzdHlwZSA9IGJ1c19jb250ZXh0X2dldF90eXBlIChjb250ZXh0KTsKKworICBpZiAoYnVzX21hdGNoX3J1bGVfZ2V0X2NsaWVudF9pc19lYXZlc2Ryb3BwaW5nIChydWxlKSkKKyAgICB7CisgICAgICBpZiAoIWJ1c19kcml2ZXJfY2hlY2tfY2FsbGVyX2lzX3ByaXZpbGVnZWQgKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikgfHwKKyAgICAgICAgICAhYnVzX2FwcGFybW9yX2FsbG93c19lYXZlc2Ryb3BwaW5nIChjb25uZWN0aW9uLCBidXN0eXBlLCBlcnJvcikpCisgICAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICBtYXRjaG1ha2VyID0gYnVzX2Nvbm5lY3Rpb25fZ2V0X21hdGNobWFrZXIgKGNvbm5lY3Rpb24pOworCisgIGlmICghYnVzX21hdGNobWFrZXJfYWRkX3J1bGUgKG1hdGNobWFrZXIsIHJ1bGUpKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgaWYgKCFidXNfZHJpdmVyX3NlbmRfYWNrX3JlcGx5IChjb25uZWN0aW9uLCB0cmFuc2FjdGlvbiwgbWVzc2FnZSwgZXJyb3IpKQorICAgIHsKKyAgICAgIGJ1c19tYXRjaG1ha2VyX3JlbW92ZV9ydWxlIChtYXRjaG1ha2VyLCBydWxlKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICBidXNfbWF0Y2hfcnVsZV91bnJlZiAocnVsZSk7CisKKyAgcmV0dXJuIFRSVUU7CisKKyBmYWlsZWQ6CisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgaWYgKHJ1bGUpCisgICAgYnVzX21hdGNoX3J1bGVfdW5yZWYgKHJ1bGUpOworICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYnVzX2RyaXZlcl9oYW5kbGVfcmVtb3ZlX21hdGNoIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBCdXNNYXRjaFJ1bGUgKnJ1bGU7CisgIGNvbnN0IGNoYXIgKnRleHQ7CisgIERCdXNTdHJpbmcgc3RyOworICBCdXNNYXRjaG1ha2VyICptYXRjaG1ha2VyOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIHRleHQgPSBOVUxMOworICBydWxlID0gTlVMTDsKKworICBpZiAoIWRidXNfbWVzc2FnZV9nZXRfYXJncyAobWVzc2FnZSwgZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiTm8gbWVtb3J5IHRvIGdldCBhcmd1bWVudHMgdG8gUmVtb3ZlTWF0Y2hcbiIpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmc3RyLCB0ZXh0KTsKKworICBydWxlID0gYnVzX21hdGNoX3J1bGVfcGFyc2UgKGNvbm5lY3Rpb24sICZzdHIsIGVycm9yKTsKKyAgaWYgKHJ1bGUgPT0gTlVMTCkKKyAgICBnb3RvIGZhaWxlZDsKKworICAvKiBTZW5kIHRoZSBhY2sgYmVmb3JlIHdlIHJlbW92ZSB0aGUgcnVsZSwgc2luY2UgdGhlIGFjayBpcyB1bmRvbmUKKyAgICogb24gdHJhbnNhY3Rpb24gY2FuY2VsLCBidXQgcnVsZSByZW1vdmFsIGlzbid0LgorICAgKi8KKyAgaWYgKCFidXNfZHJpdmVyX3NlbmRfYWNrX3JlcGx5IChjb25uZWN0aW9uLCB0cmFuc2FjdGlvbiwgbWVzc2FnZSwgZXJyb3IpKQorICAgIGdvdG8gZmFpbGVkOworCisgIG1hdGNobWFrZXIgPSBidXNfY29ubmVjdGlvbl9nZXRfbWF0Y2htYWtlciAoY29ubmVjdGlvbik7CisKKyAgaWYgKCFidXNfbWF0Y2htYWtlcl9yZW1vdmVfcnVsZV9ieV92YWx1ZSAobWF0Y2htYWtlciwgcnVsZSwgZXJyb3IpKQorICAgIGdvdG8gZmFpbGVkOworCisgIGJ1c19tYXRjaF9ydWxlX3VucmVmIChydWxlKTsKKworICByZXR1cm4gVFJVRTsKKworIGZhaWxlZDoKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICBpZiAocnVsZSkKKyAgICBidXNfbWF0Y2hfcnVsZV91bnJlZiAocnVsZSk7CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitidXNfZHJpdmVyX2hhbmRsZV9nZXRfc2VydmljZV9vd25lciAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkJICAgICBCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24sCisJCQkJICAgICBEQnVzTWVzc2FnZSAgICAqbWVzc2FnZSwKKwkJCQkgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgY29uc3QgY2hhciAqdGV4dDsKKyAgY29uc3QgY2hhciAqYmFzZV9uYW1lOworICBEQnVzU3RyaW5nIHN0cjsKKyAgQnVzUmVnaXN0cnkgKnJlZ2lzdHJ5OworICBCdXNTZXJ2aWNlICpzZXJ2aWNlOworICBEQnVzTWVzc2FnZSAqcmVwbHk7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgcmVnaXN0cnkgPSBidXNfY29ubmVjdGlvbl9nZXRfcmVnaXN0cnkgKGNvbm5lY3Rpb24pOworCisgIHRleHQgPSBOVUxMOworICByZXBseSA9IE5VTEw7CisKKyAgaWYgKCEgZGJ1c19tZXNzYWdlX2dldF9hcmdzIChtZXNzYWdlLCBlcnJvciwKKwkJCSAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmdGV4dCwKKwkJCSAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgICBnb3RvIGZhaWxlZDsKKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnN0ciwgdGV4dCk7CisgIHNlcnZpY2UgPSBidXNfcmVnaXN0cnlfbG9va3VwIChyZWdpc3RyeSwgJnN0cik7CisgIGlmIChzZXJ2aWNlID09IE5VTEwgJiYKKyAgICAgIF9kYnVzX3N0cmluZ19lcXVhbF9jX3N0ciAoJnN0ciwgREJVU19TRVJWSUNFX0RCVVMpKQorICAgIHsKKyAgICAgIC8qIE9SR19GUkVFREVTS1RPUF9EQlVTIG93bnMgaXRzZWxmICovCisgICAgICBiYXNlX25hbWUgPSBEQlVTX1NFUlZJQ0VfREJVUzsKKyAgICB9CisgIGVsc2UgaWYgKHNlcnZpY2UgPT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9OQU1FX0hBU19OT19PV05FUiwKKyAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGdldCBvd25lciBvZiBuYW1lICclcyc6IG5vIHN1Y2ggbmFtZSIsIHRleHQpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgYmFzZV9uYW1lID0gYnVzX2Nvbm5lY3Rpb25fZ2V0X25hbWUgKGJ1c19zZXJ2aWNlX2dldF9wcmltYXJ5X293bmVyc19jb25uZWN0aW9uIChzZXJ2aWNlKSk7CisgICAgICBpZiAoYmFzZV9uYW1lID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBGSVhNRSAtIGhvdyBpcyB0aGlzIGVycm9yIHBvc3NpYmxlPyAqLworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgZGV0ZXJtaW5lIHVuaXF1ZSBuYW1lIGZvciAnJXMnIiwgdGV4dCk7CisgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgIH0KKyAgICAgIF9kYnVzX2Fzc2VydCAoKmJhc2VfbmFtZSA9PSAnOicpOworICAgIH0KKworICBfZGJ1c19hc3NlcnQgKGJhc2VfbmFtZSAhPSBOVUxMKTsKKworICByZXBseSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX3JldHVybiAobWVzc2FnZSk7CisgIGlmIChyZXBseSA9PSBOVUxMKQorICAgIGdvdG8gb29tOworCisgIGlmICghIGRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAocmVwbHksCisJCQkJICBEQlVTX1RZUEVfU1RSSU5HLCAmYmFzZV9uYW1lLAorCQkJCSAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgIGdvdG8gb29tOworCisgIGlmICghIGJ1c190cmFuc2FjdGlvbl9zZW5kX2Zyb21fZHJpdmVyICh0cmFuc2FjdGlvbiwgY29ubmVjdGlvbiwgcmVwbHkpKQorICAgIGdvdG8gb29tOworCisgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworCisgIHJldHVybiBUUlVFOworCisgb29tOgorICBCVVNfU0VUX09PTSAoZXJyb3IpOworCisgZmFpbGVkOgorICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgIGlmIChyZXBseSkKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2J1c19kcml2ZXJfaGFuZGxlX2xpc3RfcXVldWVkX293bmVycyAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkJICAgICAgQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorCQkJCSAgICAgIERCdXNNZXNzYWdlICAgICptZXNzYWdlLAorCQkJCSAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgc3RhdGljIGNvbnN0IGNoYXIgZGJ1c19zZXJ2aWNlX25hbWVbXSA9IERCVVNfU0VSVklDRV9EQlVTOworCisgIGNvbnN0IGNoYXIgKnRleHQ7CisgIERCdXNMaXN0ICpiYXNlX25hbWVzOworICBEQnVzTGlzdCAqbGluazsKKyAgREJ1c1N0cmluZyBzdHI7CisgIEJ1c1JlZ2lzdHJ5ICpyZWdpc3RyeTsKKyAgQnVzU2VydmljZSAqc2VydmljZTsKKyAgREJ1c01lc3NhZ2UgKnJlcGx5OworICBEQnVzTWVzc2FnZUl0ZXIgaXRlciwgYXJyYXlfaXRlcjsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICByZWdpc3RyeSA9IGJ1c19jb25uZWN0aW9uX2dldF9yZWdpc3RyeSAoY29ubmVjdGlvbik7CisKKyAgYmFzZV9uYW1lcyA9IE5VTEw7CisgIHRleHQgPSBOVUxMOworICByZXBseSA9IE5VTEw7CisKKyAgaWYgKCEgZGJ1c19tZXNzYWdlX2dldF9hcmdzIChtZXNzYWdlLCBlcnJvciwKKwkJCSAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmdGV4dCwKKwkJCSAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgICBnb3RvIGZhaWxlZDsKKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnN0ciwgdGV4dCk7CisgIHNlcnZpY2UgPSBidXNfcmVnaXN0cnlfbG9va3VwIChyZWdpc3RyeSwgJnN0cik7CisgIGlmIChzZXJ2aWNlID09IE5VTEwgJiYKKyAgICAgIF9kYnVzX3N0cmluZ19lcXVhbF9jX3N0ciAoJnN0ciwgREJVU19TRVJWSUNFX0RCVVMpKQorICAgIHsKKyAgICAgIC8qIE9SR19GUkVFREVTS1RPUF9EQlVTIG93bnMgaXRzZWxmICovCisgICAgICBpZiAoISBfZGJ1c19saXN0X2FwcGVuZCAoJmJhc2VfbmFtZXMsIChjaGFyICopIGRidXNfc2VydmljZV9uYW1lKSkKKyAgICAgICAgZ290byBvb207CisgICAgfQorICBlbHNlIGlmIChzZXJ2aWNlID09IE5VTEwpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfTkFNRV9IQVNfTk9fT1dORVIsCisgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBnZXQgb3duZXJzIG9mIG5hbWUgJyVzJzogbm8gc3VjaCBuYW1lIiwgdGV4dCk7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoIWJ1c19zZXJ2aWNlX2xpc3RfcXVldWVkX293bmVycyAoc2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmFzZV9uYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpCisgICAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICBfZGJ1c19hc3NlcnQgKGJhc2VfbmFtZXMgIT0gTlVMTCk7CisKKyAgcmVwbHkgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9yZXR1cm4gKG1lc3NhZ2UpOworICBpZiAocmVwbHkgPT0gTlVMTCkKKyAgICBnb3RvIG9vbTsKKworICBkYnVzX21lc3NhZ2VfaXRlcl9pbml0X2FwcGVuZCAocmVwbHksICZpdGVyKTsKKyAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9vcGVuX2NvbnRhaW5lciAoJml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9BUlJBWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklOR19BU19TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhcnJheV9pdGVyKSkKKyAgICBnb3RvIG9vbTsKKworICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJmJhc2VfbmFtZXMpOworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIGNoYXIgKnVuYW1lOworCisgICAgICBfZGJ1c19hc3NlcnQgKGxpbmstPmRhdGEgIT0gTlVMTCk7CisgICAgICB1bmFtZSA9IChjaGFyICopbGluay0+ZGF0YTsKKworICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfYmFzaWMgKCZhcnJheV9pdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVuYW1lKSkKKyAgICAgICAgZ290byBvb207CisKKyAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZiYXNlX25hbWVzLCBsaW5rKTsKKyAgICB9CisKKyAgaWYgKCEgZGJ1c19tZXNzYWdlX2l0ZXJfY2xvc2VfY29udGFpbmVyICgmaXRlciwgJmFycmF5X2l0ZXIpKQorICAgIGdvdG8gb29tOworCisKKyAgaWYgKCEgYnVzX3RyYW5zYWN0aW9uX3NlbmRfZnJvbV9kcml2ZXIgKHRyYW5zYWN0aW9uLCBjb25uZWN0aW9uLCByZXBseSkpCisgICAgZ290byBvb207CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisKKyAgcmV0dXJuIFRSVUU7CisKKyBvb206CisgIEJVU19TRVRfT09NIChlcnJvcik7CisKKyBmYWlsZWQ6CisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgaWYgKHJlcGx5KQorICAgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworCisgIGlmIChiYXNlX25hbWVzKQorICAgIF9kYnVzX2xpc3RfY2xlYXIgKCZiYXNlX25hbWVzKTsKKworICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYnVzX2RyaXZlcl9oYW5kbGVfZ2V0X2Nvbm5lY3Rpb25fdW5peF91c2VyIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBEQnVzQ29ubmVjdGlvbiAqY29ubjsKKyAgREJ1c01lc3NhZ2UgKnJlcGx5OworICBkYnVzX3VpZF90IHVpZDsKKyAgZGJ1c191aW50MzJfdCB1aWQzMjsKKyAgY29uc3QgY2hhciAqc2VydmljZTsKKyAgQnVzRHJpdmVyRm91bmQgZm91bmQ7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgcmVwbHkgPSBOVUxMOworCisgIGZvdW5kID0gYnVzX2RyaXZlcl9nZXRfY29ubl9oZWxwZXIgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsICJVSUQiLCAmc2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbm4sIGVycm9yKTsKKyAgc3dpdGNoIChmb3VuZCkKKyAgICB7CisgICAgICBjYXNlIEJVU19EUklWRVJfRk9VTkRfU0VMRjoKKyAgICAgICAgdWlkID0gX2RidXNfZ2V0dWlkICgpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQlVTX0RSSVZFUl9GT1VORF9QRUVSOgorICAgICAgICBpZiAoIWRidXNfY29ubmVjdGlvbl9nZXRfdW5peF91c2VyIChjb25uLCAmdWlkKSkKKyAgICAgICAgICB1aWQgPSBEQlVTX1VJRF9VTlNFVDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEJVU19EUklWRVJfRk9VTkRfRVJST1I6CisgICAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLworICAgICAgZGVmYXVsdDoKKyAgICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIGlmICh1aWQgPT0gREJVU19VSURfVU5TRVQpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgZGV0ZXJtaW5lIFVJRCBmb3IgJyVzJyIsIHNlcnZpY2UpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIHJlcGx5ID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfcmV0dXJuIChtZXNzYWdlKTsKKyAgaWYgKHJlcGx5ID09IE5VTEwpCisgICAgZ290byBvb207CisKKyAgdWlkMzIgPSB1aWQ7CisgIGlmICghIGRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAocmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1VJTlQzMiwgJnVpZDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICBnb3RvIG9vbTsKKworICBpZiAoISBidXNfdHJhbnNhY3Rpb25fc2VuZF9mcm9tX2RyaXZlciAodHJhbnNhY3Rpb24sIGNvbm5lY3Rpb24sIHJlcGx5KSkKKyAgICBnb3RvIG9vbTsKKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKworICByZXR1cm4gVFJVRTsKKworIG9vbToKKyAgQlVTX1NFVF9PT00gKGVycm9yKTsKKworIGZhaWxlZDoKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICBpZiAocmVwbHkpCisgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitidXNfZHJpdmVyX2hhbmRsZV9nZXRfY29ubmVjdGlvbl91bml4X3Byb2Nlc3NfaWQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorCQkJCQkJICBCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24sCisJCQkJCQkgIERCdXNNZXNzYWdlICAgICptZXNzYWdlLAorCQkJCQkJICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIERCdXNDb25uZWN0aW9uICpjb25uOworICBEQnVzTWVzc2FnZSAqcmVwbHk7CisgIGRidXNfcGlkX3QgcGlkOworICBkYnVzX3VpbnQzMl90IHBpZDMyOworICBjb25zdCBjaGFyICpzZXJ2aWNlOworICBCdXNEcml2ZXJGb3VuZCBmb3VuZDsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICByZXBseSA9IE5VTEw7CisKKyAgZm91bmQgPSBidXNfZHJpdmVyX2dldF9jb25uX2hlbHBlciAoY29ubmVjdGlvbiwgbWVzc2FnZSwgIlBJRCIsICZzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29ubiwgZXJyb3IpOworICBzd2l0Y2ggKGZvdW5kKQorICAgIHsKKyAgICAgIGNhc2UgQlVTX0RSSVZFUl9GT1VORF9TRUxGOgorICAgICAgICBwaWQgPSBfZGJ1c19nZXRwaWQgKCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBCVVNfRFJJVkVSX0ZPVU5EX1BFRVI6CisgICAgICAgIGlmICghZGJ1c19jb25uZWN0aW9uX2dldF91bml4X3Byb2Nlc3NfaWQgKGNvbm4sICZwaWQpKQorICAgICAgICAgIHBpZCA9IERCVVNfUElEX1VOU0VUOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQlVTX0RSSVZFUl9GT1VORF9FUlJPUjoKKyAgICAgICAgLyogZmFsbCB0aHJvdWdoICovCisgICAgICBkZWZhdWx0OgorICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgaWYgKHBpZCA9PSBEQlVTX1BJRF9VTlNFVCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9VTklYX1BST0NFU1NfSURfVU5LTk9XTiwKKyAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGRldGVybWluZSBQSUQgZm9yICclcyciLCBzZXJ2aWNlKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICByZXBseSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX3JldHVybiAobWVzc2FnZSk7CisgIGlmIChyZXBseSA9PSBOVUxMKQorICAgIGdvdG8gb29tOworCisgIHBpZDMyID0gcGlkOworICBpZiAoISBkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKHJlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9VSU5UMzIsICZwaWQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgZ290byBvb207CisKKyAgaWYgKCEgYnVzX3RyYW5zYWN0aW9uX3NlbmRfZnJvbV9kcml2ZXIgKHRyYW5zYWN0aW9uLCBjb25uZWN0aW9uLCByZXBseSkpCisgICAgZ290byBvb207CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisKKyAgcmV0dXJuIFRSVUU7CisKKyBvb206CisgIEJVU19TRVRfT09NIChlcnJvcik7CisKKyBmYWlsZWQ6CisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgaWYgKHJlcGx5KQorICAgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYnVzX2RyaXZlcl9oYW5kbGVfZ2V0X2FkdF9hdWRpdF9zZXNzaW9uX2RhdGEgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorCQkJCQkgICAgICBCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24sCisJCQkJCSAgICAgIERCdXNNZXNzYWdlICAgICptZXNzYWdlLAorCQkJCQkgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIERCdXNDb25uZWN0aW9uICpjb25uOworICBEQnVzTWVzc2FnZSAqcmVwbHk7CisgIHZvaWQgKmRhdGEgPSBOVUxMOworICBkYnVzX2ludDMyX3QgZGF0YV9zaXplOworICBjb25zdCBjaGFyICpzZXJ2aWNlOworICBCdXNEcml2ZXJGb3VuZCBmb3VuZDsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICByZXBseSA9IE5VTEw7CisKKyAgZm91bmQgPSBidXNfZHJpdmVyX2dldF9jb25uX2hlbHBlciAoY29ubmVjdGlvbiwgbWVzc2FnZSwgImF1ZGl0IHNlc3Npb24gZGF0YSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXJ2aWNlLCAmY29ubiwgZXJyb3IpOworCisgIGlmIChmb3VuZCA9PSBCVVNfRFJJVkVSX0ZPVU5EX0VSUk9SKQorICAgIGdvdG8gZmFpbGVkOworCisgIHJlcGx5ID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfcmV0dXJuIChtZXNzYWdlKTsKKyAgaWYgKHJlcGx5ID09IE5VTEwpCisgICAgZ290byBvb207CisKKyAgLyogV2UgZG9uJ3Qga25vdyBob3cgdG8gZmluZCAiQURUIGF1ZGl0IHNlc3Npb24gZGF0YSIgZm9yIHRoZSBidXMgZGFlbW9uCisgICAqIGl0c2VsZi4gSXMgdGhhdCBldmVuIG1lYW5pbmdmdWw/CisgICAqIEZJWE1FOiBJbXBsZW1lbnQgdGhpcyBvciBicmllZmx5IG5vdGUgaXQgbWFrZXMgbm8gc2Vuc2UuCisgICAqLworICBpZiAoZm91bmQgIT0gQlVTX0RSSVZFUl9GT1VORF9QRUVSIHx8CisgICAgICAhZGJ1c19jb25uZWN0aW9uX2dldF9hZHRfYXVkaXRfc2Vzc2lvbl9kYXRhIChjb25uLCAmZGF0YSwgJmRhdGFfc2l6ZSkgfHwKKyAgICAgIGRhdGEgPT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9BRFRfQVVESVRfREFUQV9VTktOT1dOLAorICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgZGV0ZXJtaW5lIGF1ZGl0IHNlc3Npb24gZGF0YSBmb3IgJyVzJyIsIHNlcnZpY2UpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIGlmICghIGRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAocmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0FSUkFZLCBEQlVTX1RZUEVfQllURSwgJmRhdGEsIGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgZ290byBvb207CisKKyAgaWYgKCEgYnVzX3RyYW5zYWN0aW9uX3NlbmRfZnJvbV9kcml2ZXIgKHRyYW5zYWN0aW9uLCBjb25uZWN0aW9uLCByZXBseSkpCisgICAgZ290byBvb207CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisKKyAgcmV0dXJuIFRSVUU7CisKKyBvb206CisgIEJVU19TRVRfT09NIChlcnJvcik7CisKKyBmYWlsZWQ6CisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgaWYgKHJlcGx5KQorICAgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYnVzX2RyaXZlcl9oYW5kbGVfZ2V0X2Nvbm5lY3Rpb25fc2VsaW51eF9zZWN1cml0eV9jb250ZXh0IChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCQkJCQkgICBCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24sCisJCQkJCQkJICAgREJ1c01lc3NhZ2UgICAgKm1lc3NhZ2UsCisJCQkJCQkJICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBEQnVzQ29ubmVjdGlvbiAqY29ubjsKKyAgREJ1c01lc3NhZ2UgKnJlcGx5OworICBCdXNTRUxpbnV4SUQgKmNvbnRleHQ7CisgIGNvbnN0IGNoYXIgKnNlcnZpY2U7CisgIEJ1c0RyaXZlckZvdW5kIGZvdW5kOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIHJlcGx5ID0gTlVMTDsKKworICBmb3VuZCA9IGJ1c19kcml2ZXJfZ2V0X2Nvbm5faGVscGVyIChjb25uZWN0aW9uLCBtZXNzYWdlLCAic2VjdXJpdHkgY29udGV4dCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXJ2aWNlLCAmY29ubiwgZXJyb3IpOworCisgIGlmIChmb3VuZCA9PSBCVVNfRFJJVkVSX0ZPVU5EX0VSUk9SKQorICAgIGdvdG8gZmFpbGVkOworCisgIHJlcGx5ID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfcmV0dXJuIChtZXNzYWdlKTsKKyAgaWYgKHJlcGx5ID09IE5VTEwpCisgICAgZ290byBvb207CisKKyAgaWYgKGZvdW5kID09IEJVU19EUklWRVJfRk9VTkRfU0VMRikKKyAgICBjb250ZXh0ID0gYnVzX3NlbGludXhfZ2V0X3NlbGYgKCk7CisgIGVsc2UgaWYgKGZvdW5kID09IEJVU19EUklWRVJfRk9VTkRfUEVFUikKKyAgICBjb250ZXh0ID0gYnVzX2Nvbm5lY3Rpb25fZ2V0X3NlbGludXhfaWQgKGNvbm4pOworICBlbHNlCisgICAgY29udGV4dCA9IE5VTEw7CisKKyAgaWYgKCFjb250ZXh0KQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICBEQlVTX0VSUk9SX1NFTElOVVhfU0VDVVJJVFlfQ09OVEVYVF9VTktOT1dOLAorICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgZGV0ZXJtaW5lIHNlY3VyaXR5IGNvbnRleHQgZm9yICclcyciLCBzZXJ2aWNlKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICBpZiAoISBidXNfc2VsaW51eF9hcHBlbmRfY29udGV4dCAocmVwbHksIGNvbnRleHQsIGVycm9yKSkKKyAgICBnb3RvIGZhaWxlZDsKKworICBpZiAoISBidXNfdHJhbnNhY3Rpb25fc2VuZF9mcm9tX2RyaXZlciAodHJhbnNhY3Rpb24sIGNvbm5lY3Rpb24sIHJlcGx5KSkKKyAgICBnb3RvIG9vbTsKKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKworICByZXR1cm4gVFJVRTsKKworIG9vbToKKyAgQlVTX1NFVF9PT00gKGVycm9yKTsKKworIGZhaWxlZDoKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICBpZiAocmVwbHkpCisgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitidXNfZHJpdmVyX2hhbmRsZV9nZXRfY29ubmVjdGlvbl9jcmVkZW50aWFscyAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgREJ1c0Nvbm5lY3Rpb24gKmNvbm47CisgIERCdXNNZXNzYWdlICpyZXBseTsKKyAgREJ1c01lc3NhZ2VJdGVyIHJlcGx5X2l0ZXI7CisgIERCdXNNZXNzYWdlSXRlciBhcnJheV9pdGVyOworICB1bnNpZ25lZCBsb25nIHVsb25nX3VpZCwgdWxvbmdfcGlkOworICBjaGFyICpzOworICBjb25zdCBjaGFyICpzZXJ2aWNlOworICBCdXNEcml2ZXJGb3VuZCBmb3VuZDsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICByZXBseSA9IE5VTEw7CisKKyAgZm91bmQgPSBidXNfZHJpdmVyX2dldF9jb25uX2hlbHBlciAoY29ubmVjdGlvbiwgbWVzc2FnZSwgImNyZWRlbnRpYWxzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlcnZpY2UsICZjb25uLCBlcnJvcik7CisKKyAgc3dpdGNoIChmb3VuZCkKKyAgICB7CisgICAgICBjYXNlIEJVU19EUklWRVJfRk9VTkRfU0VMRjoKKyAgICAgICAgdWxvbmdfcGlkID0gX2RidXNfZ2V0cGlkICgpOworICAgICAgICB1bG9uZ191aWQgPSBfZGJ1c19nZXR1aWQgKCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEJVU19EUklWRVJfRk9VTkRfUEVFUjoKKyAgICAgICAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fZ2V0X3VuaXhfcHJvY2Vzc19pZCAoY29ubiwgJnVsb25nX3BpZCkpCisgICAgICAgICAgdWxvbmdfcGlkID0gREJVU19QSURfVU5TRVQ7CisgICAgICAgIGlmICghZGJ1c19jb25uZWN0aW9uX2dldF91bml4X3VzZXIgKGNvbm4sICZ1bG9uZ191aWQpKQorICAgICAgICAgIHVsb25nX3VpZCA9IERCVVNfVUlEX1VOU0VUOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQlVTX0RSSVZFUl9GT1VORF9FUlJPUjoKKyAgICAgICAgLyogZmFsbCB0aHJvdWdoICovCisgICAgICBkZWZhdWx0OgorICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgcmVwbHkgPSBfZGJ1c19hc3ZfbmV3X21ldGhvZF9yZXR1cm4gKG1lc3NhZ2UsICZyZXBseV9pdGVyLCAmYXJyYXlfaXRlcik7CisgIGlmIChyZXBseSA9PSBOVUxMKQorICAgIGdvdG8gb29tOworCisgIC8qIHdlIGNhbid0IHJlcHJlc2VudCA+IDMyLWJpdCBwaWRzOyBpZiB5b3VyIHN5c3RlbSBuZWVkcyB0aGVtLCBwbGVhc2UKKyAgICogYWRkIFByb2Nlc3NJRDY0IHRvIHRoZSBzcGVjIG9yIHNvbWV0aGluZyAqLworICBpZiAodWxvbmdfcGlkIDw9IF9EQlVTX1VJTlQzMl9NQVggJiYgdWxvbmdfcGlkICE9IERCVVNfUElEX1VOU0VUICYmCisgICAgICAhX2RidXNfYXN2X2FkZF91aW50MzIgKCZhcnJheV9pdGVyLCAiUHJvY2Vzc0lEIiwgdWxvbmdfcGlkKSkKKyAgICBnb3RvIG9vbTsKKworICAvKiB3ZSBjYW4ndCByZXByZXNlbnQgPiAzMi1iaXQgdWlkczsgaWYgeW91ciBzeXN0ZW0gbmVlZHMgdGhlbSwgcGxlYXNlCisgICAqIGFkZCBVbml4VXNlcklENjQgdG8gdGhlIHNwZWMgb3Igc29tZXRoaW5nICovCisgIGlmICh1bG9uZ191aWQgPD0gX0RCVVNfVUlOVDMyX01BWCAmJiB1bG9uZ191aWQgIT0gREJVU19VSURfVU5TRVQgJiYKKyAgICAgICFfZGJ1c19hc3ZfYWRkX3VpbnQzMiAoJmFycmF5X2l0ZXIsICJVbml4VXNlcklEIiwgdWxvbmdfdWlkKSkKKyAgICBnb3RvIG9vbTsKKworICAvKiBGSVhNRTogT2J0YWluIHRoZSBXaW5kb3dzIHVzZXIgb2YgdGhlIGJ1cyBkYWVtb24gaXRzZWxmICovCisgIGlmIChmb3VuZCA9PSBCVVNfRFJJVkVSX0ZPVU5EX1BFRVIgJiYKKyAgICAgIGRidXNfY29ubmVjdGlvbl9nZXRfd2luZG93c191c2VyIChjb25uLCAmcykpCisgICAgeworICAgICAgREJ1c1N0cmluZyBzdHI7CisgICAgICBkYnVzX2Jvb2xfdCByZXN1bHQ7CisKKyAgICAgIGlmIChzID09IE5VTEwpCisgICAgICAgIGdvdG8gb29tOworCisgICAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnN0ciwgcyk7CisgICAgICByZXN1bHQgPSBfZGJ1c192YWxpZGF0ZV91dGY4ICgmc3RyLCAwLCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikpOworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZzdHIpOworICAgICAgaWYgKHJlc3VsdCkKKyAgICAgICAgeworICAgICAgICAgIGlmICghX2RidXNfYXN2X2FkZF9zdHJpbmcgKCZhcnJheV9pdGVyLCAiV2luZG93c1NJRCIsIHMpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkYnVzX2ZyZWUgKHMpOworICAgICAgICAgICAgICBnb3RvIG9vbTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgZGJ1c19mcmVlIChzKTsKKyAgICB9CisKKyAgLyogRklYTUU6IE9idGFpbiB0aGUgc2VjdXJpdHkgbGFiZWwgZm9yIHRoZSBidXMgZGFlbW9uIGl0c2VsZiAqLworICBpZiAoZm91bmQgPT0gQlVTX0RSSVZFUl9GT1VORF9QRUVSICYmCisgICAgICBfZGJ1c19jb25uZWN0aW9uX2dldF9saW51eF9zZWN1cml0eV9sYWJlbCAoY29ubiwgJnMpKQorICAgIHsKKyAgICAgIGlmIChzID09IE5VTEwpCisgICAgICAgIGdvdG8gb29tOworCisgICAgICAvKiB1c2UgdGhlIEdWYXJpYW50IGJ5dGVzdHJpbmcgY29udmVudGlvbiBmb3Igc3RyaW5ncyBvZiB1bmtub3duCisgICAgICAgKiBlbmNvZGluZzogaW5jbHVkZSB0aGUgXDAgaW4gdGhlIHBheWxvYWQsIGZvciB6ZXJvLWNvcHkgcmVhZGluZyAqLworICAgICAgaWYgKCFfZGJ1c19hc3ZfYWRkX2J5dGVfYXJyYXkgKCZhcnJheV9pdGVyLCAiTGludXhTZWN1cml0eUxhYmVsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLCBzdHJsZW4gKHMpICsgMSkpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX2ZyZWUgKHMpOworICAgICAgICAgIGdvdG8gb29tOworICAgICAgICB9CisKKyAgICAgIGRidXNfZnJlZSAocyk7CisgICAgfQorCisgIGlmICghX2RidXNfYXN2X2Nsb3NlICgmcmVwbHlfaXRlciwgJmFycmF5X2l0ZXIpKQorICAgIGdvdG8gb29tOworCisgIGlmICghIGJ1c190cmFuc2FjdGlvbl9zZW5kX2Zyb21fZHJpdmVyICh0cmFuc2FjdGlvbiwgY29ubmVjdGlvbiwgcmVwbHkpKQorICAgIHsKKyAgICAgIC8qIHRoaXMgdGltZSB3ZSBkb24ndCB3YW50IHRvIGNsb3NlIHRoZSBpdGVyYXRvciBhZ2Fpbiwgc28ganVzdAorICAgICAgICogZ2V0IHJpZCBvZiB0aGUgbWVzc2FnZSAqLworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgICAgICByZXBseSA9IE5VTEw7CisgICAgICBnb3RvIG9vbTsKKyAgICB9CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisKKyAgcmV0dXJuIFRSVUU7CisKKyBvb206CisgIEJVU19TRVRfT09NIChlcnJvcik7CisKKyBmYWlsZWQ6CisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKworICBpZiAocmVwbHkpCisgICAgeworICAgICAgX2RidXNfYXN2X2FiYW5kb24gKCZyZXBseV9pdGVyLCAmYXJyYXlfaXRlcik7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKyAgICB9CisKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2J1c19kcml2ZXJfaGFuZGxlX3JlbG9hZF9jb25maWcgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorCQkJCSBCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24sCisJCQkJIERCdXNNZXNzYWdlICAgICptZXNzYWdlLAorCQkJCSBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIEJ1c0NvbnRleHQgKmNvbnRleHQ7CisgIERCdXNNZXNzYWdlICpyZXBseTsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICByZXBseSA9IE5VTEw7CisKKyAgY29udGV4dCA9IGJ1c19jb25uZWN0aW9uX2dldF9jb250ZXh0IChjb25uZWN0aW9uKTsKKyAgaWYgKCFidXNfY29udGV4dF9yZWxvYWRfY29uZmlnIChjb250ZXh0LCBlcnJvcikpCisgICAgZ290byBmYWlsZWQ7CisKKyAgcmVwbHkgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9yZXR1cm4gKG1lc3NhZ2UpOworICBpZiAocmVwbHkgPT0gTlVMTCkKKyAgICBnb3RvIG9vbTsKKworICBpZiAoISBidXNfdHJhbnNhY3Rpb25fc2VuZF9mcm9tX2RyaXZlciAodHJhbnNhY3Rpb24sIGNvbm5lY3Rpb24sIHJlcGx5KSkKKyAgICBnb3RvIG9vbTsKKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKyAgcmV0dXJuIFRSVUU7CisKKyBvb206CisgIEJVU19TRVRfT09NIChlcnJvcik7CisKKyBmYWlsZWQ6CisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgaWYgKHJlcGx5KQorICAgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworICByZXR1cm4gRkFMU0U7Cit9CisKKyNpZmRlZiBEQlVTX0VOQUJMRV9WRVJCT1NFX01PREUKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYnVzX2RyaXZlcl9oYW5kbGVfZW5hYmxlX3ZlcmJvc2UgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgICAgREJ1c01lc3NhZ2UgKnJlcGx5ID0gTlVMTDsKKworICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgICAgcmVwbHkgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9yZXR1cm4gKG1lc3NhZ2UpOworICAgIGlmIChyZXBseSA9PSBOVUxMKQorICAgICAgZ290byBvb207CisKKyAgICBpZiAoISBidXNfdHJhbnNhY3Rpb25fc2VuZF9mcm9tX2RyaXZlciAodHJhbnNhY3Rpb24sIGNvbm5lY3Rpb24sIHJlcGx5KSkKKyAgICAgIGdvdG8gb29tOworCisgICAgX2RidXNfc2V0X3ZlcmJvc2UoVFJVRSk7CisKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKyAgICByZXR1cm4gVFJVRTsKKworICAgb29tOgorICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKworICAgIGlmIChyZXBseSkKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworICAgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitidXNfZHJpdmVyX2hhbmRsZV9kaXNhYmxlX3ZlcmJvc2UgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgICAgREJ1c01lc3NhZ2UgKnJlcGx5ID0gTlVMTDsKKworICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgICAgcmVwbHkgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9yZXR1cm4gKG1lc3NhZ2UpOworICAgIGlmIChyZXBseSA9PSBOVUxMKQorICAgICAgZ290byBvb207CisKKyAgICBpZiAoISBidXNfdHJhbnNhY3Rpb25fc2VuZF9mcm9tX2RyaXZlciAodHJhbnNhY3Rpb24sIGNvbm5lY3Rpb24sIHJlcGx5KSkKKyAgICAgIGdvdG8gb29tOworCisgICAgX2RidXNfc2V0X3ZlcmJvc2UoRkFMU0UpOworCisgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgICAgcmV0dXJuIFRSVUU7CisKKyAgIG9vbToKKyAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICAgIEJVU19TRVRfT09NIChlcnJvcik7CisKKyAgICBpZiAocmVwbHkpCisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKyAgICByZXR1cm4gRkFMU0U7Cit9CisjZW5kaWYKKworc3RhdGljIGRidXNfYm9vbF90CitidXNfZHJpdmVyX2hhbmRsZV9nZXRfaWQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIEJ1c0NvbnRleHQgKmNvbnRleHQ7CisgIERCdXNNZXNzYWdlICpyZXBseTsKKyAgREJ1c1N0cmluZyB1dWlkOworICBjb25zdCBjaGFyICp2X1NUUklORzsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmdXVpZCkpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgcmVwbHkgPSBOVUxMOworCisgIGNvbnRleHQgPSBidXNfY29ubmVjdGlvbl9nZXRfY29udGV4dCAoY29ubmVjdGlvbik7CisgIGlmICghYnVzX2NvbnRleHRfZ2V0X2lkIChjb250ZXh0LCAmdXVpZCkpCisgICAgZ290byBvb207CisKKyAgcmVwbHkgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9yZXR1cm4gKG1lc3NhZ2UpOworICBpZiAocmVwbHkgPT0gTlVMTCkKKyAgICBnb3RvIG9vbTsKKworICB2X1NUUklORyA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJnV1aWQpOworICBpZiAoIWRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAocmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmdl9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgZ290byBvb207CisKKyAgX2RidXNfYXNzZXJ0IChkYnVzX21lc3NhZ2VfaGFzX3NpZ25hdHVyZSAocmVwbHksICJzIikpOworCisgIGlmICghIGJ1c190cmFuc2FjdGlvbl9zZW5kX2Zyb21fZHJpdmVyICh0cmFuc2FjdGlvbiwgY29ubmVjdGlvbiwgcmVwbHkpKQorICAgIGdvdG8gb29tOworCisgIF9kYnVzX3N0cmluZ19mcmVlICgmdXVpZCk7CisgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworICByZXR1cm4gVFJVRTsKKworIG9vbToKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgQlVTX1NFVF9PT00gKGVycm9yKTsKKworICBpZiAocmVwbHkpCisgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmdXVpZCk7CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitidXNfZHJpdmVyX2hhbmRsZV9iZWNvbWVfbW9uaXRvciAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgY2hhciAqKm1hdGNoX3J1bGVzID0gTlVMTDsKKyAgY29uc3QgY2hhciAqYnVzdHlwZTsKKyAgQnVzQ29udGV4dCAqY29udGV4dDsKKyAgQnVzTWF0Y2hSdWxlICpydWxlOworICBEQnVzTGlzdCAqcnVsZXMgPSBOVUxMOworICBEQnVzTGlzdCAqaXRlcjsKKyAgREJ1c1N0cmluZyBzdHI7CisgIGludCBpOworICBpbnQgbl9tYXRjaF9ydWxlczsKKyAgZGJ1c191aW50MzJfdCBmbGFnczsKKyAgZGJ1c19ib29sX3QgcmV0ID0gRkFMU0U7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgY29udGV4dCA9IGJ1c190cmFuc2FjdGlvbl9nZXRfY29udGV4dCAodHJhbnNhY3Rpb24pOworICBidXN0eXBlID0gY29udGV4dCA/IGJ1c19jb250ZXh0X2dldF90eXBlIChjb250ZXh0KSA6IE5VTEw7CisgIGlmICghYnVzX2FwcGFybW9yX2FsbG93c19lYXZlc2Ryb3BwaW5nIChjb25uZWN0aW9uLCBidXN0eXBlLCBlcnJvcikpCisgICAgZ290byBvdXQ7CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MgKG1lc3NhZ2UsIGVycm9yLAorICAgICAgICBEQlVTX1RZUEVfQVJSQVksIERCVVNfVFlQRV9TVFJJTkcsICZtYXRjaF9ydWxlcywgJm5fbWF0Y2hfcnVsZXMsCisgICAgICAgIERCVVNfVFlQRV9VSU5UMzIsICZmbGFncywKKyAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgIGdvdG8gb3V0OworCisgIGlmIChmbGFncyAhPSAwKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9JTlZBTElEX0FSR1MsCisgICAgICAgICAgIkJlY29tZU1vbml0b3IgZG9lcyBub3Qgc3VwcG9ydCBhbnkgZmxhZ3MgeWV0Iik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgLyogU3BlY2lhbCBjYXNlOiBhIHplcm8tbGVuZ3RoIGFycmF5IGJlY29tZXMgWyIiXSAqLworICBpZiAobl9tYXRjaF9ydWxlcyA9PSAwKQorICAgIHsKKyAgICAgIG1hdGNoX3J1bGVzID0gZGJ1c19tYWxsb2MgKDIgKiBzaXplb2YgKGNoYXIgKikpOworCisgICAgICBpZiAobWF0Y2hfcnVsZXMgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgICAgbWF0Y2hfcnVsZXNbMF0gPSBfZGJ1c19zdHJkdXAgKCIiKTsKKworICAgICAgaWYgKG1hdGNoX3J1bGVzWzBdID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgIG1hdGNoX3J1bGVzWzFdID0gTlVMTDsKKyAgICAgIG5fbWF0Y2hfcnVsZXMgPSAxOworICAgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgbl9tYXRjaF9ydWxlczsgaSsrKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmc3RyLCBtYXRjaF9ydWxlc1tpXSk7CisgICAgICBydWxlID0gYnVzX21hdGNoX3J1bGVfcGFyc2UgKGNvbm5lY3Rpb24sICZzdHIsIGVycm9yKTsKKworICAgICAgaWYgKHJ1bGUgPT0gTlVMTCkKKyAgICAgICAgZ290byBvdXQ7CisKKyAgICAgIC8qIG1vbml0b3JzIGFsd2F5cyBlYXZlc2Ryb3AgKi8KKyAgICAgIGJ1c19tYXRjaF9ydWxlX3NldF9jbGllbnRfaXNfZWF2ZXNkcm9wcGluZyAocnVsZSwgVFJVRSk7CisKKyAgICAgIGlmICghX2RidXNfbGlzdF9hcHBlbmQgKCZydWxlcywgcnVsZSkpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIGJ1c19tYXRjaF9ydWxlX3VucmVmIChydWxlKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgIH0KKworICAvKiBTZW5kIHRoZSBhY2sgYmVmb3JlIHdlIHJlbW92ZSB0aGUgcnVsZSwgc2luY2UgdGhlIGFjayBpcyB1bmRvbmUKKyAgICogb24gdHJhbnNhY3Rpb24gY2FuY2VsLCBidXQgYmVjb21pbmcgYSBtb25pdG9yIGlzbid0LgorICAgKi8KKyAgaWYgKCFidXNfZHJpdmVyX3NlbmRfYWNrX3JlcGx5IChjb25uZWN0aW9uLCB0cmFuc2FjdGlvbiwgbWVzc2FnZSwgZXJyb3IpKQorICAgIGdvdG8gb3V0OworCisgIGlmICghYnVzX2Nvbm5lY3Rpb25fYmVfbW9uaXRvciAoY29ubmVjdGlvbiwgdHJhbnNhY3Rpb24sICZydWxlcywgZXJyb3IpKQorICAgIGdvdG8gb3V0OworCisgIHJldCA9IFRSVUU7CisKK291dDoKKyAgaWYgKHJldCkKKyAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgZWxzZQorICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKworICBmb3IgKGl0ZXIgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmcnVsZXMpOworICAgICAgaXRlciAhPSBOVUxMOworICAgICAgaXRlciA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJnJ1bGVzLCBpdGVyKSkKKyAgICBidXNfbWF0Y2hfcnVsZV91bnJlZiAoaXRlci0+ZGF0YSk7CisKKyAgX2RidXNfbGlzdF9jbGVhciAoJnJ1bGVzKTsKKworICBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5IChtYXRjaF9ydWxlcyk7CisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYnVzX2RyaXZlcl9oYW5kbGVfZ2V0X21hY2hpbmVfaWQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgKmVycm9yKQoreworICBEQnVzTWVzc2FnZSAqcmVwbHkgPSBOVUxMOworICBEQnVzU3RyaW5nIHV1aWQ7CisgIGNvbnN0IGNoYXIgKnN0cjsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmdXVpZCkpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19nZXRfbG9jYWxfbWFjaGluZV91dWlkX2VuY29kZWQgKCZ1dWlkLCBlcnJvcikpCisgICAgZ290byBmYWlsOworCisgIHJlcGx5ID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfcmV0dXJuIChtZXNzYWdlKTsKKworICBpZiAocmVwbHkgPT0gTlVMTCkKKyAgICBnb3RvIG9vbTsKKworICBzdHIgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZ1dWlkKTsKKworICBpZiAoIWRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAocmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgIGdvdG8gb29tOworCisgIF9kYnVzX2Fzc2VydCAoZGJ1c19tZXNzYWdlX2hhc19zaWduYXR1cmUgKHJlcGx5LCAicyIpKTsKKworICBpZiAoIWJ1c190cmFuc2FjdGlvbl9zZW5kX2Zyb21fZHJpdmVyICh0cmFuc2FjdGlvbiwgY29ubmVjdGlvbiwgcmVwbHkpKQorICAgIGdvdG8gb29tOworCisgIF9kYnVzX3N0cmluZ19mcmVlICgmdXVpZCk7CisgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworICByZXR1cm4gVFJVRTsKKworb29tOgorICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBCVVNfU0VUX09PTSAoZXJyb3IpOworCitmYWlsOgorICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisKKyAgaWYgKHJlcGx5ICE9IE5VTEwpCisgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ1dWlkKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2J1c19kcml2ZXJfaGFuZGxlX3BpbmcgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgKmVycm9yKQoreworICByZXR1cm4gYnVzX2RyaXZlcl9zZW5kX2Fja19yZXBseSAoY29ubmVjdGlvbiwgdHJhbnNhY3Rpb24sIG1lc3NhZ2UsIGVycm9yKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90IGJ1c19kcml2ZXJfaGFuZGxlX2dldCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAqZXJyb3IpOworCitzdGF0aWMgZGJ1c19ib29sX3QgYnVzX2RyaXZlcl9oYW5kbGVfZ2V0X2FsbCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAqZXJyb3IpOworCitzdGF0aWMgZGJ1c19ib29sX3QgYnVzX2RyaXZlcl9oYW5kbGVfc2V0IChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICplcnJvcik7CisKK3N0YXRpYyBkYnVzX2Jvb2xfdCBmZWF0dXJlc19nZXR0ZXIgKEJ1c0NvbnRleHQgICAgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlSXRlciAqdmFyaWFudF9pdGVyKTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBpbnRlcmZhY2VzX2dldHRlciAoQnVzQ29udGV4dCAgICAgICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZUl0ZXIgKnZhcmlhbnRfaXRlcik7CisKK3R5cGVkZWYgZW51bQoreworICAvKiBWYXJpb3VzIG9sZGVyIG1ldGhvZHMgd2VyZSBhdmFpbGFibGUgYXQgZXZlcnkgb2JqZWN0IHBhdGguIFdlIGhhdmUgdG8KKyAgICogcHJlc2VydmUgdGhhdCBiZWhhdmlvdXIgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBidXQgd2UgY2FuIGF0IGxlYXN0CisgICAqIHN0b3AgZG9pbmcgdGhhdCBmb3IgbmV3bHkgYWRkZWQgbWV0aG9kcy4KKyAgICogVGhlIHNwZWNpYWwgUGVlciBpbnRlcmZhY2Ugc2hvdWxkIGFsc28gd29yayBhdCBhbnkgb2JqZWN0IHBhdGguCisgICAqIDxodHRwczovL2J1Z3MuZnJlZWRlc2t0b3Aub3JnL3Nob3dfYnVnLmNnaT9pZD0xMDEyNTY+ICovCisgIE1FVEhPRF9GTEFHX0FOWV9QQVRIID0gKDEgPDwgMCksCisKKyAgLyogSWYgc2V0LCBjYWxsZXJzIG11c3QgYmUgcHJpdmlsZWdlZC4gT24gVW5peCwgdGhlIHVpZCBvZiB0aGUgY29ubmVjdGlvbgorICAgKiBtdXN0IGVpdGhlciBiZSB0aGUgdWlkIG9mIHRoaXMgcHJvY2Vzcywgb3IgMCAocm9vdCkuIE9uIFdpbmRvd3MsCisgICAqIHRoZSBTSUQgb2YgdGhlIGNvbm5lY3Rpb24gbXVzdCBiZSB0aGUgU0lEIG9mIHRoaXMgcHJvY2Vzcy4gKi8KKyAgTUVUSE9EX0ZMQUdfUFJJVklMRUdFRCA9ICgxIDw8IDEpLAorCisgIE1FVEhPRF9GTEFHX05PTkUgPSAwCit9IE1ldGhvZEZsYWdzOworCit0eXBlZGVmIHN0cnVjdAoreworICBjb25zdCBjaGFyICpuYW1lOworICBjb25zdCBjaGFyICppbl9hcmdzOworICBjb25zdCBjaGFyICpvdXRfYXJnczsKKyAgZGJ1c19ib29sX3QgKCogaGFuZGxlcikgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpOworICBNZXRob2RGbGFncyBmbGFnczsKK30gTWVzc2FnZUhhbmRsZXI7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGNvbnN0IGNoYXIgKm5hbWU7CisgIGNvbnN0IGNoYXIgKnR5cGU7CisgIGRidXNfYm9vbF90ICgqIGdldHRlcikgKEJ1c0NvbnRleHQgICAgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2VJdGVyICp2YXJpYW50X2l0ZXIpOworfSBQcm9wZXJ0eUhhbmRsZXI7CisKKy8qIEZvciBzcGVlZCBpdCBtaWdodCBiZSB1c2VmdWwgdG8gc29ydCB0aGlzIGluIG9yZGVyIG9mCisgKiBmcmVxdWVuY3kgb2YgdXNlIChidXQgZG9lc24ndCBtYXR0ZXIgd2l0aCBvbmx5IGEgZmV3IGl0ZW1zCisgKiBhbnlob3cpCisgKi8KK3N0YXRpYyBjb25zdCBNZXNzYWdlSGFuZGxlciBkYnVzX21lc3NhZ2VfaGFuZGxlcnNbXSA9IHsKKyAgeyAiSGVsbG8iLAorICAgICIiLAorICAgIERCVVNfVFlQRV9TVFJJTkdfQVNfU1RSSU5HLAorICAgIGJ1c19kcml2ZXJfaGFuZGxlX2hlbGxvLAorICAgIE1FVEhPRF9GTEFHX0FOWV9QQVRIIH0sCisgIHsgIlJlcXVlc3ROYW1lIiwKKyAgICBEQlVTX1RZUEVfU1RSSU5HX0FTX1NUUklORyBEQlVTX1RZUEVfVUlOVDMyX0FTX1NUUklORywKKyAgICBEQlVTX1RZUEVfVUlOVDMyX0FTX1NUUklORywKKyAgICBidXNfZHJpdmVyX2hhbmRsZV9hY3F1aXJlX3NlcnZpY2UsCisgICAgTUVUSE9EX0ZMQUdfQU5ZX1BBVEggfSwKKyAgeyAiUmVsZWFzZU5hbWUiLAorICAgIERCVVNfVFlQRV9TVFJJTkdfQVNfU1RSSU5HLAorICAgIERCVVNfVFlQRV9VSU5UMzJfQVNfU1RSSU5HLAorICAgIGJ1c19kcml2ZXJfaGFuZGxlX3JlbGVhc2Vfc2VydmljZSwKKyAgICBNRVRIT0RfRkxBR19BTllfUEFUSCB9LAorICB7ICJTdGFydFNlcnZpY2VCeU5hbWUiLAorICAgIERCVVNfVFlQRV9TVFJJTkdfQVNfU1RSSU5HIERCVVNfVFlQRV9VSU5UMzJfQVNfU1RSSU5HLAorICAgIERCVVNfVFlQRV9VSU5UMzJfQVNfU1RSSU5HLAorICAgIGJ1c19kcml2ZXJfaGFuZGxlX2FjdGl2YXRlX3NlcnZpY2UsCisgICAgTUVUSE9EX0ZMQUdfQU5ZX1BBVEggfSwKKyAgeyAiVXBkYXRlQWN0aXZhdGlvbkVudmlyb25tZW50IiwKKyAgICBEQlVTX1RZUEVfQVJSQVlfQVNfU1RSSU5HIERCVVNfRElDVF9FTlRSWV9CRUdJTl9DSEFSX0FTX1NUUklORyBEQlVTX1RZUEVfU1RSSU5HX0FTX1NUUklORyBEQlVTX1RZUEVfU1RSSU5HX0FTX1NUUklORyBEQlVTX0RJQ1RfRU5UUllfRU5EX0NIQVJfQVNfU1RSSU5HLAorICAgICIiLAorICAgIGJ1c19kcml2ZXJfaGFuZGxlX3VwZGF0ZV9hY3RpdmF0aW9uX2Vudmlyb25tZW50LAorICAgIE1FVEhPRF9GTEFHX1BSSVZJTEVHRUQgfSwKKyAgeyAiTmFtZUhhc093bmVyIiwKKyAgICBEQlVTX1RZUEVfU1RSSU5HX0FTX1NUUklORywKKyAgICBEQlVTX1RZUEVfQk9PTEVBTl9BU19TVFJJTkcsCisgICAgYnVzX2RyaXZlcl9oYW5kbGVfc2VydmljZV9leGlzdHMsCisgICAgTUVUSE9EX0ZMQUdfQU5ZX1BBVEggfSwKKyAgeyAiTGlzdE5hbWVzIiwKKyAgICAiIiwKKyAgICBEQlVTX1RZUEVfQVJSQVlfQVNfU1RSSU5HIERCVVNfVFlQRV9TVFJJTkdfQVNfU1RSSU5HLAorICAgIGJ1c19kcml2ZXJfaGFuZGxlX2xpc3Rfc2VydmljZXMsCisgICAgTUVUSE9EX0ZMQUdfQU5ZX1BBVEggfSwKKyAgeyAiTGlzdEFjdGl2YXRhYmxlTmFtZXMiLAorICAgICIiLAorICAgIERCVVNfVFlQRV9BUlJBWV9BU19TVFJJTkcgREJVU19UWVBFX1NUUklOR19BU19TVFJJTkcsCisgICAgYnVzX2RyaXZlcl9oYW5kbGVfbGlzdF9hY3RpdmF0YWJsZV9zZXJ2aWNlcywKKyAgICBNRVRIT0RfRkxBR19BTllfUEFUSCB9LAorICB7ICJBZGRNYXRjaCIsCisgICAgREJVU19UWVBFX1NUUklOR19BU19TVFJJTkcsCisgICAgIiIsCisgICAgYnVzX2RyaXZlcl9oYW5kbGVfYWRkX21hdGNoLAorICAgIE1FVEhPRF9GTEFHX0FOWV9QQVRIIH0sCisgIHsgIlJlbW92ZU1hdGNoIiwKKyAgICBEQlVTX1RZUEVfU1RSSU5HX0FTX1NUUklORywKKyAgICAiIiwKKyAgICBidXNfZHJpdmVyX2hhbmRsZV9yZW1vdmVfbWF0Y2gsCisgICAgTUVUSE9EX0ZMQUdfQU5ZX1BBVEggfSwKKyAgeyAiR2V0TmFtZU93bmVyIiwKKyAgICBEQlVTX1RZUEVfU1RSSU5HX0FTX1NUUklORywKKyAgICBEQlVTX1RZUEVfU1RSSU5HX0FTX1NUUklORywKKyAgICBidXNfZHJpdmVyX2hhbmRsZV9nZXRfc2VydmljZV9vd25lciwKKyAgICBNRVRIT0RfRkxBR19BTllfUEFUSCB9LAorICB7ICJMaXN0UXVldWVkT3duZXJzIiwKKyAgICBEQlVTX1RZUEVfU1RSSU5HX0FTX1NUUklORywKKyAgICBEQlVTX1RZUEVfQVJSQVlfQVNfU1RSSU5HIERCVVNfVFlQRV9TVFJJTkdfQVNfU1RSSU5HLAorICAgIGJ1c19kcml2ZXJfaGFuZGxlX2xpc3RfcXVldWVkX293bmVycywKKyAgICBNRVRIT0RfRkxBR19BTllfUEFUSCB9LAorICB7ICJHZXRDb25uZWN0aW9uVW5peFVzZXIiLAorICAgIERCVVNfVFlQRV9TVFJJTkdfQVNfU1RSSU5HLAorICAgIERCVVNfVFlQRV9VSU5UMzJfQVNfU1RSSU5HLAorICAgIGJ1c19kcml2ZXJfaGFuZGxlX2dldF9jb25uZWN0aW9uX3VuaXhfdXNlciwKKyAgICBNRVRIT0RfRkxBR19BTllfUEFUSCB9LAorICB7ICJHZXRDb25uZWN0aW9uVW5peFByb2Nlc3NJRCIsCisgICAgREJVU19UWVBFX1NUUklOR19BU19TVFJJTkcsCisgICAgREJVU19UWVBFX1VJTlQzMl9BU19TVFJJTkcsCisgICAgYnVzX2RyaXZlcl9oYW5kbGVfZ2V0X2Nvbm5lY3Rpb25fdW5peF9wcm9jZXNzX2lkLAorICAgIE1FVEhPRF9GTEFHX0FOWV9QQVRIIH0sCisgIHsgIkdldEFkdEF1ZGl0U2Vzc2lvbkRhdGEiLAorICAgIERCVVNfVFlQRV9TVFJJTkdfQVNfU1RSSU5HLAorICAgIERCVVNfVFlQRV9BUlJBWV9BU19TVFJJTkcgREJVU19UWVBFX0JZVEVfQVNfU1RSSU5HLAorICAgIGJ1c19kcml2ZXJfaGFuZGxlX2dldF9hZHRfYXVkaXRfc2Vzc2lvbl9kYXRhLAorICAgIE1FVEhPRF9GTEFHX0FOWV9QQVRIIH0sCisgIHsgIkdldENvbm5lY3Rpb25TRUxpbnV4U2VjdXJpdHlDb250ZXh0IiwKKyAgICBEQlVTX1RZUEVfU1RSSU5HX0FTX1NUUklORywKKyAgICBEQlVTX1RZUEVfQVJSQVlfQVNfU1RSSU5HIERCVVNfVFlQRV9CWVRFX0FTX1NUUklORywKKyAgICBidXNfZHJpdmVyX2hhbmRsZV9nZXRfY29ubmVjdGlvbl9zZWxpbnV4X3NlY3VyaXR5X2NvbnRleHQsCisgICAgTUVUSE9EX0ZMQUdfQU5ZX1BBVEggfSwKKyAgeyAiUmVsb2FkQ29uZmlnIiwKKyAgICAiIiwKKyAgICAiIiwKKyAgICBidXNfZHJpdmVyX2hhbmRsZV9yZWxvYWRfY29uZmlnLAorICAgIE1FVEhPRF9GTEFHX0FOWV9QQVRIIH0sCisgIHsgIkdldElkIiwKKyAgICAiIiwKKyAgICBEQlVTX1RZUEVfU1RSSU5HX0FTX1NUUklORywKKyAgICBidXNfZHJpdmVyX2hhbmRsZV9nZXRfaWQsCisgICAgTUVUSE9EX0ZMQUdfQU5ZX1BBVEggfSwKKyAgeyAiR2V0Q29ubmVjdGlvbkNyZWRlbnRpYWxzIiwgInMiLCAiYXtzdn0iLAorICAgIGJ1c19kcml2ZXJfaGFuZGxlX2dldF9jb25uZWN0aW9uX2NyZWRlbnRpYWxzLAorICAgIE1FVEhPRF9GTEFHX0FOWV9QQVRIIH0sCisgIHsgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgUHJvcGVydHlIYW5kbGVyIGRidXNfcHJvcGVydHlfaGFuZGxlcnNbXSA9IHsKKyAgeyAiRmVhdHVyZXMiLCAiYXMiLCBmZWF0dXJlc19nZXR0ZXIgfSwKKyAgeyAiSW50ZXJmYWNlcyIsICJhcyIsIGludGVyZmFjZXNfZ2V0dGVyIH0sCisgIHsgTlVMTCwgTlVMTCwgTlVMTCB9Cit9OworCitzdGF0aWMgZGJ1c19ib29sX3QgYnVzX2RyaXZlcl9oYW5kbGVfaW50cm9zcGVjdCAoREJ1c0Nvbm5lY3Rpb24gKiwKKyAgICBCdXNUcmFuc2FjdGlvbiAqLCBEQnVzTWVzc2FnZSAqLCBEQnVzRXJyb3IgKik7CisKK3N0YXRpYyBjb25zdCBNZXNzYWdlSGFuZGxlciBwcm9wZXJ0aWVzX21lc3NhZ2VfaGFuZGxlcnNbXSA9IHsKKyAgeyAiR2V0IiwgInNzIiwgInYiLCBidXNfZHJpdmVyX2hhbmRsZV9nZXQsIE1FVEhPRF9GTEFHX05PTkUgfSwKKyAgeyAiR2V0QWxsIiwgInMiLCAiYXtzdn0iLCBidXNfZHJpdmVyX2hhbmRsZV9nZXRfYWxsLCBNRVRIT0RfRkxBR19OT05FIH0sCisgIHsgIlNldCIsICJzc3YiLCAiIiwgYnVzX2RyaXZlcl9oYW5kbGVfc2V0LCBNRVRIT0RfRkxBR19OT05FIH0sCisgIHsgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgTWVzc2FnZUhhbmRsZXIgaW50cm9zcGVjdGFibGVfbWVzc2FnZV9oYW5kbGVyc1tdID0geworICB7ICJJbnRyb3NwZWN0IiwgIiIsIERCVVNfVFlQRV9TVFJJTkdfQVNfU1RSSU5HLCBidXNfZHJpdmVyX2hhbmRsZV9pbnRyb3NwZWN0LAorICAgIE1FVEhPRF9GTEFHX0FOWV9QQVRIIH0sCisgIHsgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgTWVzc2FnZUhhbmRsZXIgbW9uaXRvcmluZ19tZXNzYWdlX2hhbmRsZXJzW10gPSB7CisgIHsgIkJlY29tZU1vbml0b3IiLCAiYXN1IiwgIiIsIGJ1c19kcml2ZXJfaGFuZGxlX2JlY29tZV9tb25pdG9yLAorICAgIE1FVEhPRF9GTEFHX1BSSVZJTEVHRUQgfSwKKyAgeyBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMIH0KK307CisKKyNpZmRlZiBEQlVTX0VOQUJMRV9WRVJCT1NFX01PREUKK3N0YXRpYyBjb25zdCBNZXNzYWdlSGFuZGxlciB2ZXJib3NlX21lc3NhZ2VfaGFuZGxlcnNbXSA9IHsKKyAgeyAiRW5hYmxlVmVyYm9zZSIsICIiLCAiIiwgYnVzX2RyaXZlcl9oYW5kbGVfZW5hYmxlX3ZlcmJvc2UsCisgICAgTUVUSE9EX0ZMQUdfTk9ORSB9LAorICB7ICJEaXNhYmxlVmVyYm9zZSIsICIiLCAiIiwgYnVzX2RyaXZlcl9oYW5kbGVfZGlzYWJsZV92ZXJib3NlLAorICAgIE1FVEhPRF9GTEFHX05PTkUgfSwKKyAgeyBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMIH0KK307CisjZW5kaWYKKworI2lmZGVmIERCVVNfRU5BQkxFX1NUQVRTCitzdGF0aWMgY29uc3QgTWVzc2FnZUhhbmRsZXIgc3RhdHNfbWVzc2FnZV9oYW5kbGVyc1tdID0geworICB7ICJHZXRTdGF0cyIsICIiLCAiYXtzdn0iLCBidXNfc3RhdHNfaGFuZGxlX2dldF9zdGF0cywKKyAgICBNRVRIT0RfRkxBR19OT05FIH0sCisgIHsgIkdldENvbm5lY3Rpb25TdGF0cyIsICJzIiwgImF7c3Z9IiwgYnVzX3N0YXRzX2hhbmRsZV9nZXRfY29ubmVjdGlvbl9zdGF0cywKKyAgICBNRVRIT0RfRkxBR19OT05FIH0sCisgIHsgIkdldEFsbE1hdGNoUnVsZXMiLCAiIiwgImF7c2FzfSIsIGJ1c19zdGF0c19oYW5kbGVfZ2V0X2FsbF9tYXRjaF9ydWxlcywKKyAgICBNRVRIT0RfRkxBR19OT05FIH0sCisgIHsgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCB9Cit9OworI2VuZGlmCisKK3N0YXRpYyBjb25zdCBNZXNzYWdlSGFuZGxlciBwZWVyX21lc3NhZ2VfaGFuZGxlcnNbXSA9IHsKKyAgeyAiR2V0TWFjaGluZUlkIiwgIiIsICJzIiwgYnVzX2RyaXZlcl9oYW5kbGVfZ2V0X21hY2hpbmVfaWQsCisgICAgTUVUSE9EX0ZMQUdfQU5ZX1BBVEggfSwKKyAgeyAiUGluZyIsICIiLCAiIiwgYnVzX2RyaXZlcl9oYW5kbGVfcGluZywgTUVUSE9EX0ZMQUdfQU5ZX1BBVEggfSwKKyAgeyBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMIH0KK307CisKK3R5cGVkZWYgZW51bQoreworICAvKiBWYXJpb3VzIG9sZGVyIGludGVyZmFjZXMgd2VyZSBhdmFpbGFibGUgYXQgZXZlcnkgb2JqZWN0IHBhdGguIFdlIGhhdmUgdG8KKyAgICogcHJlc2VydmUgdGhhdCBiZWhhdmlvdXIgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBidXQgd2UgY2FuIGF0IGxlYXN0CisgICAqIHN0b3AgZG9pbmcgdGhhdCBmb3IgbmV3bHkgYWRkZWQgaW50ZXJmYWNlczoKKyAgICogPGh0dHBzOi8vYnVncy5mcmVlZGVza3RvcC5vcmcvc2hvd19idWcuY2dpP2lkPTEwMTI1Nj4KKyAgICogSW50cm9zcGVjdGFibGUgYW5kIFBlZXIgYXJlIGFsc28gdXNlZnVsIGF0IGFsbCBvYmplY3QgcGF0aHMuICovCisgIElOVEVSRkFDRV9GTEFHX0FOWV9QQVRIID0gKDEgPDwgMCksCisKKyAgLyogU2V0IHRoaXMgZmxhZyBmb3IgaW50ZXJmYWNlcyB0aGF0IHNob3VsZCBub3Qgc2hvdyB1cCBpbiB0aGUKKyAgICogSW50ZXJmYWNlcyBwcm9wZXJ0eS4gKi8KKyAgSU5URVJGQUNFX0ZMQUdfVU5JTlRFUkVTVElORyA9ICgxIDw8IDEpLAorCisgIElOVEVSRkFDRV9GTEFHX05PTkUgPSAwCit9IEludGVyZmFjZUZsYWdzOworCit0eXBlZGVmIHN0cnVjdCB7CisgIGNvbnN0IGNoYXIgKm5hbWU7CisgIGNvbnN0IE1lc3NhZ2VIYW5kbGVyICptZXNzYWdlX2hhbmRsZXJzOworICBjb25zdCBjaGFyICpleHRyYV9pbnRyb3NwZWN0aW9uOworICBJbnRlcmZhY2VGbGFncyBmbGFnczsKKyAgY29uc3QgUHJvcGVydHlIYW5kbGVyICpwcm9wZXJ0eV9oYW5kbGVyczsKK30gSW50ZXJmYWNlSGFuZGxlcjsKKworLyogVGhlc2Ugc2hvdWxkIGlkZWFsbHkgYmUgc29ydGVkIGJ5IGZyZXF1ZW5jeSBvZiB1c2UsIGFsdGhvdWdoIGl0CisgKiBwcm9iYWJseSBkb2Vzbid0IG1hdHRlciB3aXRoIHRoaXMgZmV3IGl0ZW1zICovCitzdGF0aWMgSW50ZXJmYWNlSGFuZGxlciBpbnRlcmZhY2VfaGFuZGxlcnNbXSA9IHsKKyAgeyBEQlVTX0lOVEVSRkFDRV9EQlVTLCBkYnVzX21lc3NhZ2VfaGFuZGxlcnMsCisgICAgIiAgICA8c2lnbmFsIG5hbWU9XCJOYW1lT3duZXJDaGFuZ2VkXCI+XG4iCisgICAgIiAgICAgIDxhcmcgdHlwZT1cInNcIi8+XG4iCisgICAgIiAgICAgIDxhcmcgdHlwZT1cInNcIi8+XG4iCisgICAgIiAgICAgIDxhcmcgdHlwZT1cInNcIi8+XG4iCisgICAgIiAgICA8L3NpZ25hbD5cbiIKKyAgICAiICAgIDxzaWduYWwgbmFtZT1cIk5hbWVMb3N0XCI+XG4iCisgICAgIiAgICAgIDxhcmcgdHlwZT1cInNcIi8+XG4iCisgICAgIiAgICA8L3NpZ25hbD5cbiIKKyAgICAiICAgIDxzaWduYWwgbmFtZT1cIk5hbWVBY3F1aXJlZFwiPlxuIgorICAgICIgICAgICA8YXJnIHR5cGU9XCJzXCIvPlxuIgorICAgICIgICAgPC9zaWduYWw+XG4iLAorICAgIC8qIE5vdCBpbiB0aGUgSW50ZXJmYWNlcyBwcm9wZXJ0eSBiZWNhdXNlIGlmIHlvdSBjYW4gZ2V0IHRoZSBwcm9wZXJ0aWVzCisgICAgICogb2YgdGhlIG8uZmQuREJ1cyBpbnRlcmZhY2UsIHRoZW4geW91IGNlcnRhaW5seSBoYXZlIHRoZSBvLmZkLkRCdXMKKyAgICAgKiBpbnRlcmZhY2UsIHNvIHRoZXJlIGlzIGxpdHRsZSBwb2ludCBpbiBsaXN0aW5nIGl0IGV4cGxpY2l0bHkuCisgICAgICogUGFydGlhbGx5IGF2YWlsYWJsZSBhdCBhbGwgcGF0aHMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiAqLworICAgIElOVEVSRkFDRV9GTEFHX0FOWV9QQVRIIHwgSU5URVJGQUNFX0ZMQUdfVU5JTlRFUkVTVElORywKKyAgICBkYnVzX3Byb3BlcnR5X2hhbmRsZXJzIH0sCisgIHsgREJVU19JTlRFUkZBQ0VfUFJPUEVSVElFUywgcHJvcGVydGllc19tZXNzYWdlX2hhbmRsZXJzLAorICAgICIgICAgPHNpZ25hbCBuYW1lPVwiUHJvcGVydGllc0NoYW5nZWRcIj5cbiIKKyAgICAiICAgICAgPGFyZyB0eXBlPVwic1wiIG5hbWU9XCJpbnRlcmZhY2VfbmFtZVwiLz5cbiIKKyAgICAiICAgICAgPGFyZyB0eXBlPVwiYXtzdn1cIiBuYW1lPVwiY2hhbmdlZF9wcm9wZXJ0aWVzXCIvPlxuIgorICAgICIgICAgICA8YXJnIHR5cGU9XCJhc1wiIG5hbWU9XCJpbnZhbGlkYXRlZF9wcm9wZXJ0aWVzXCIvPlxuIgorICAgICIgICAgPC9zaWduYWw+XG4iLAorICAgIC8qIE5vdCBpbiB0aGUgSW50ZXJmYWNlcyBwcm9wZXJ0eSBiZWNhdXNlIGlmIHlvdSBjYW4gZ2V0IHRoZSBwcm9wZXJ0aWVzCisgICAgICogb2YgdGhlIG8uZmQuREJ1cyBpbnRlcmZhY2UsIHRoZW4geW91IGNlcnRhaW5seSBoYXZlIFByb3BlcnRpZXMuICovCisgICAgSU5URVJGQUNFX0ZMQUdfVU5JTlRFUkVTVElORyB9LAorICB7IERCVVNfSU5URVJGQUNFX0lOVFJPU1BFQ1RBQkxFLCBpbnRyb3NwZWN0YWJsZV9tZXNzYWdlX2hhbmRsZXJzLCBOVUxMLAorICAgIC8qIE5vdCBpbiB0aGUgSW50ZXJmYWNlcyBwcm9wZXJ0eSBiZWNhdXNlIGludHJvc3BlY3Rpb24gaXNuJ3QgcmVhbGx5IGEKKyAgICAgKiBmZWF0dXJlIGluIHRoZSBzYW1lIHdheSBhcyBlLmcuIE1vbml0b3JpbmcuCisgICAgICogQXZhaWxhYmxlIGF0IGFsbCBwYXRocyBzbyB0b29scyBsaWtlIGQtZmVldCBjYW4gc3RhcnQgZnJvbSAiLyIuICovCisgICAgSU5URVJGQUNFX0ZMQUdfQU5ZX1BBVEggfCBJTlRFUkZBQ0VfRkxBR19VTklOVEVSRVNUSU5HIH0sCisgIHsgREJVU19JTlRFUkZBQ0VfTU9OSVRPUklORywgbW9uaXRvcmluZ19tZXNzYWdlX2hhbmRsZXJzLCBOVUxMLAorICAgIElOVEVSRkFDRV9GTEFHX05PTkUgfSwKKyNpZmRlZiBEQlVTX0VOQUJMRV9WRVJCT1NFX01PREUKKyAgeyBEQlVTX0lOVEVSRkFDRV9WRVJCT1NFLCB2ZXJib3NlX21lc3NhZ2VfaGFuZGxlcnMsIE5VTEwsCisgICAgSU5URVJGQUNFX0ZMQUdfTk9ORSB9LAorI2VuZGlmCisjaWZkZWYgREJVU19FTkFCTEVfU1RBVFMKKyAgeyBCVVNfSU5URVJGQUNFX1NUQVRTLCBzdGF0c19tZXNzYWdlX2hhbmRsZXJzLCBOVUxMLAorICAgIElOVEVSRkFDRV9GTEFHX05PTkUgfSwKKyNlbmRpZgorICB7IERCVVNfSU5URVJGQUNFX1BFRVIsIHBlZXJfbWVzc2FnZV9oYW5kbGVycywgTlVMTCwKKyAgICAvKiBOb3QgaW4gdGhlIEludGVyZmFjZXMgcHJvcGVydHkgYmVjYXVzZSBpdCdzIGEgcHNldWRvLWludGVyZmFjZQorICAgICAqIG9uIGFsbCBvYmplY3QgcGF0aHMgb2YgYWxsIGNvbm5lY3Rpb25zLCByYXRoZXIgdGhhbiBhIGZlYXR1cmUgb2YgdGhlCisgICAgICogYnVzIGRyaXZlciBvYmplY3QuICovCisgICAgSU5URVJGQUNFX0ZMQUdfQU5ZX1BBVEggfCBJTlRFUkZBQ0VfRkxBR19VTklOVEVSRVNUSU5HIH0sCisgIHsgTlVMTCwgTlVMTCwgTlVMTCB9Cit9OworCitzdGF0aWMgZGJ1c19ib29sX3QKK3dyaXRlX2FyZ3NfZm9yX2RpcmVjdGlvbiAoREJ1c1N0cmluZyAqeG1sLAorCQkJICBjb25zdCBjaGFyICpzaWduYXR1cmUsCisJCQkgIGRidXNfYm9vbF90IGluKQoreworICBEQnVzVHlwZVJlYWRlciB0eXBlcmVhZGVyOworICBEQnVzU3RyaW5nIHNpZ3N0cjsKKyAgaW50IGN1cnJlbnRfdHlwZTsKKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnNpZ3N0ciwgc2lnbmF0dXJlKTsKKyAgX2RidXNfdHlwZV9yZWFkZXJfaW5pdF90eXBlc19vbmx5ICgmdHlwZXJlYWRlciwgJnNpZ3N0ciwgMCk7CisKKyAgd2hpbGUgKChjdXJyZW50X3R5cGUgPSBfZGJ1c190eXBlX3JlYWRlcl9nZXRfY3VycmVudF90eXBlICgmdHlwZXJlYWRlcikpICE9IERCVVNfVFlQRV9JTlZBTElEKQorICAgIHsKKyAgICAgIGNvbnN0IERCdXNTdHJpbmcgKnN1YnNpZzsKKyAgICAgIGludCBzdGFydCwgbGVuOworCisgICAgICBfZGJ1c190eXBlX3JlYWRlcl9nZXRfc2lnbmF0dXJlICgmdHlwZXJlYWRlciwgJnN1YnNpZywgJnN0YXJ0LCAmbGVuKTsKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9wcmludGYgKHhtbCwgIiAgICAgIDxhcmcgZGlyZWN0aW9uPVwiJXNcIiB0eXBlPVwiIiwKKwkJCQkgICAgICAgaW4gPyAiaW4iIDogIm91dCIpKQorCWdvdG8gb29tOworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX2xlbiAoeG1sLAorCQkJCSAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKHN1YnNpZykgKyBzdGFydCwKKwkJCQkgICAgbGVuKSkKKwlnb3RvIG9vbTsKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoeG1sLCAiXCIvPlxuIikpCisJZ290byBvb207CisKKyAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX25leHQgKCZ0eXBlcmVhZGVyKTsKKyAgICB9CisgIHJldHVybiBUUlVFOworIG9vbToKKyAgcmV0dXJuIEZBTFNFOworfQorCitkYnVzX2Jvb2xfdAorYnVzX2RyaXZlcl9nZW5lcmF0ZV9pbnRyb3NwZWN0X3N0cmluZyAoREJ1c1N0cmluZyAqeG1sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgaXNfY2Fub25pY2FsX3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAqbWVzc2FnZSkKK3sKKyAgY29uc3QgSW50ZXJmYWNlSGFuZGxlciAqaWg7CisgIGNvbnN0IE1lc3NhZ2VIYW5kbGVyICptaDsKKyAgY29uc3QgUHJvcGVydHlIYW5kbGVyICpwaDsKKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKHhtbCwgREJVU19JTlRST1NQRUNUXzFfMF9YTUxfRE9DVFlQRV9ERUNMX05PREUpKQorICAgIHJldHVybiBGQUxTRTsKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICh4bWwsICI8bm9kZT5cbiIpKQorICAgIHJldHVybiBGQUxTRTsKKworICBmb3IgKGloID0gaW50ZXJmYWNlX2hhbmRsZXJzOyBpaC0+bmFtZSAhPSBOVUxMOyBpaCsrKQorICAgIHsKKyAgICAgIGlmICghKGlzX2Nhbm9uaWNhbF9wYXRoIHx8IChpaC0+ZmxhZ3MgJiBJTlRFUkZBQ0VfRkxBR19BTllfUEFUSCkpKQorICAgICAgICBjb250aW51ZTsKKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX3ByaW50ZiAoeG1sLCAiICA8aW50ZXJmYWNlIG5hbWU9XCIlc1wiPlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGloLT5uYW1lKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICBmb3IgKG1oID0gaWgtPm1lc3NhZ2VfaGFuZGxlcnM7IG1oLT5uYW1lICE9IE5VTEw7IG1oKyspCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfcHJpbnRmICh4bWwsICIgICAgPG1ldGhvZCBuYW1lPVwiJXNcIj5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWgtPm5hbWUpKQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICAgICAgaWYgKCF3cml0ZV9hcmdzX2Zvcl9kaXJlY3Rpb24gKHhtbCwgbWgtPmluX2FyZ3MsIFRSVUUpKQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICAgICAgaWYgKCF3cml0ZV9hcmdzX2Zvcl9kaXJlY3Rpb24gKHhtbCwgbWgtPm91dF9hcmdzLCBGQUxTRSkpCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKHhtbCwgIiAgICA8L21ldGhvZD5cbiIpKQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIGZvciAocGggPSBpaC0+cHJvcGVydHlfaGFuZGxlcnM7IHBoICE9IE5VTEwgJiYgcGgtPm5hbWUgIT0gTlVMTDsgcGgrKykKKyAgICAgICAgeworICAgICAgICAgIC8qIFdlIG9ubHkgaGF2ZSBjb25zdGFudCBwcm9wZXJ0aWVzIHNvIGZhciwgc28gaGFyZC1jb2RlIHRoYXQgYml0ICovCisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX3ByaW50ZiAoeG1sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgPHByb3BlcnR5IG5hbWU9XCIlc1wiIHR5cGU9XCIlc1wiIGFjY2Vzcz1cInJlYWRcIj5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGgtPm5hbWUsIHBoLT50eXBlKSkKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoeG1sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgIDxhbm5vdGF0aW9uIG5hbWU9XCJvcmcuZnJlZWRlc2t0b3AuREJ1cy5Qcm9wZXJ0eS5FbWl0c0NoYW5nZWRTaWduYWxcIiB2YWx1ZT1cImNvbnN0XCIvPlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICA8L3Byb3BlcnR5PlxuIikpCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgaWYgKGloLT5leHRyYV9pbnRyb3NwZWN0aW9uICE9IE5VTEwgJiYKKyAgICAgICAgICAhX2RidXNfc3RyaW5nX2FwcGVuZCAoeG1sLCBpaC0+ZXh0cmFfaW50cm9zcGVjdGlvbikpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICh4bWwsICIgIDwvaW50ZXJmYWNlPlxuIikpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKG1lc3NhZ2UgIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBNYWtlIHRoZSBidXMgZHJpdmVyIG9iamVjdCBwYXRoIGRpc2NvdmVyYWJsZSAqLworICAgICAgaWYgKGRidXNfbWVzc2FnZV9oYXNfcGF0aCAobWVzc2FnZSwgIi8iKSkKKyAgICAgICAgeworICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoeG1sLAorICAgICAgICAgICAgICAgICIgIDxub2RlIG5hbWU9XCJvcmcvZnJlZWRlc2t0b3AvREJ1c1wiLz5cbiIpKQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChkYnVzX21lc3NhZ2VfaGFzX3BhdGggKG1lc3NhZ2UsICIvb3JnIikpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKHhtbCwKKyAgICAgICAgICAgICAgICAiICA8bm9kZSBuYW1lPVwiZnJlZWRlc2t0b3AvREJ1c1wiLz5cbiIpKQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChkYnVzX21lc3NhZ2VfaGFzX3BhdGggKG1lc3NhZ2UsICIvb3JnL2ZyZWVkZXNrdG9wIikpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKHhtbCwgIiAgPG5vZGUgbmFtZT1cIkRCdXNcIi8+XG4iKSkKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKHhtbCwgIjwvbm9kZT5cbiIpKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitidXNfZHJpdmVyX2hhbmRsZV9pbnRyb3NwZWN0IChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBEQnVzU3RyaW5nIHhtbDsKKyAgREJ1c01lc3NhZ2UgKnJlcGx5OworICBjb25zdCBjaGFyICp2X1NUUklORzsKKyAgZGJ1c19ib29sX3QgaXNfY2Fub25pY2FsX3BhdGg7CisKKyAgX2RidXNfdmVyYm9zZSAoIkludHJvc3BlY3QoKSBvbiBidXMgZHJpdmVyXG4iKTsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICByZXBseSA9IE5VTEw7CisKKyAgaWYgKCEgZGJ1c19tZXNzYWdlX2dldF9hcmdzIChtZXNzYWdlLCBlcnJvciwKKwkJCSAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmeG1sKSkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpc19jYW5vbmljYWxfcGF0aCA9IGRidXNfbWVzc2FnZV9oYXNfcGF0aCAobWVzc2FnZSwgREJVU19QQVRIX0RCVVMpOworCisgIGlmICghYnVzX2RyaXZlcl9nZW5lcmF0ZV9pbnRyb3NwZWN0X3N0cmluZyAoJnhtbCwgaXNfY2Fub25pY2FsX3BhdGgsIG1lc3NhZ2UpKQorICAgIGdvdG8gb29tOworCisgIHZfU1RSSU5HID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmeG1sKTsKKworICByZXBseSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX3JldHVybiAobWVzc2FnZSk7CisgIGlmIChyZXBseSA9PSBOVUxMKQorICAgIGdvdG8gb29tOworCisgIGlmICghIGRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAocmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJnZfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICBnb3RvIG9vbTsKKworICBpZiAoISBidXNfdHJhbnNhY3Rpb25fc2VuZF9mcm9tX2RyaXZlciAodHJhbnNhY3Rpb24sIGNvbm5lY3Rpb24sIHJlcGx5KSkKKyAgICBnb3RvIG9vbTsKKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ4bWwpOworCisgIHJldHVybiBUUlVFOworCisgb29tOgorICBCVVNfU0VUX09PTSAoZXJyb3IpOworCisgIGlmIChyZXBseSkKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnhtbCk7CisKKyAgcmV0dXJuIEZBTFNFOworfQorCitkYnVzX2Jvb2xfdAorYnVzX2RyaXZlcl9oYW5kbGVfbWVzc2FnZSAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24sCisJCQkgICBEQnVzTWVzc2FnZSAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgY29uc3QgY2hhciAqbmFtZSwgKmludGVyZmFjZTsKKyAgY29uc3QgSW50ZXJmYWNlSGFuZGxlciAqaWg7CisgIGNvbnN0IE1lc3NhZ2VIYW5kbGVyICptaDsKKyAgZGJ1c19ib29sX3QgZm91bmRfaW50ZXJmYWNlID0gRkFMU0U7CisgIGRidXNfYm9vbF90IGlzX2Nhbm9uaWNhbF9wYXRoOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIGlmIChkYnVzX21lc3NhZ2VfaXNfc2lnbmFsIChtZXNzYWdlLCAib3JnLmZyZWVkZXNrdG9wLnN5c3RlbWQxLkFjdGl2YXRvciIsICJBY3RpdmF0aW9uRmFpbHVyZSIpKQorICAgIHsKKyAgICAgIEJ1c0NvbnRleHQgKmNvbnRleHQ7CisgICAgICBEQnVzQ29ubmVjdGlvbiAqc3lzdGVtZDsKKworICAgICAgLyogVGhpcyBpcyBhIGRpcmVjdGVkIHNpZ25hbCwgbm90IGEgbWV0aG9kIGNhbGwsIHNvIHRoZSBsb2cgbWVzc2FnZQorICAgICAgICogaXMgYSBsaXR0bGUgd2VpcmQgKGl0IHRhbGtzIGFib3V0ICJjYWxsaW5nIiBBY3RpdmF0aW9uRmFpbHVyZSksCisgICAgICAgKiBidXQgaXQncyBjbG9zZSBlbm91Z2ggKi8KKyAgICAgIGlmICghYnVzX2RyaXZlcl9jaGVja19jYWxsZXJfaXNfcHJpdmlsZWdlZCAoY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICBjb250ZXh0ID0gYnVzX2Nvbm5lY3Rpb25fZ2V0X2NvbnRleHQgKGNvbm5lY3Rpb24pOworICAgICAgc3lzdGVtZCA9IGJ1c19kcml2ZXJfZ2V0X293bmVyX29mX25hbWUgKGNvbm5lY3Rpb24sCisgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5zeXN0ZW1kMSIpOworCisgICAgICBpZiAoc3lzdGVtZCAhPSBjb25uZWN0aW9uKQorICAgICAgICB7CisgICAgICAgICAgY29uc3QgY2hhciAqYXR0YWNrZXI7CisKKyAgICAgICAgICBhdHRhY2tlciA9IGJ1c19jb25uZWN0aW9uX2dldF9uYW1lIChjb25uZWN0aW9uKTsKKyAgICAgICAgICBidXNfY29udGV4dF9sb2cgKGNvbnRleHQsIERCVVNfU1lTVEVNX0xPR19TRUNVUklUWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJJZ25vcmluZyBmb3JnZWQgQWN0aXZhdGlvbkZhaWx1cmUgbWVzc2FnZSBmcm9tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb25uZWN0aW9uICVzICglcykiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNrZXIgPyBhdHRhY2tlciA6ICIodW5hdXRoZW50aWNhdGVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBidXNfY29ubmVjdGlvbl9nZXRfbG9naW5mbyAoY29ubmVjdGlvbikpOworICAgICAgICAgIC8qIGlnbm9yZSBpdCAqLworICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICB9CisKKyAgICAgIGlmICghYnVzX2NvbnRleHRfZ2V0X3N5c3RlbWRfYWN0aXZhdGlvbiAoY29udGV4dCkpCisgICAgICAgIHsKKyAgICAgICAgICBidXNfY29udGV4dF9sb2cgKGNvbnRleHQsIERCVVNfU1lTVEVNX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIklnbm9yaW5nIHVuZXhwZWN0ZWQgQWN0aXZhdGlvbkZhaWx1cmUgbWVzc2FnZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAid2hpbGUgbm90IHVzaW5nIHN5c3RlbWQgYWN0aXZhdGlvbiIpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICByZXR1cm4gZGJ1c19hY3RpdmF0aW9uX3N5c3RlbWRfZmFpbHVyZShidXNfY29udGV4dF9nZXRfYWN0aXZhdGlvbihjb250ZXh0KSwgbWVzc2FnZSk7CisgICAgfQorCisgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKG1lc3NhZ2UpICE9IERCVVNfTUVTU0FHRV9UWVBFX01FVEhPRF9DQUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJEcml2ZXIgZ290IGEgbm9uLW1ldGhvZC1jYWxsIG1lc3NhZ2UsIGlnbm9yaW5nXG4iKTsKKyAgICAgIHJldHVybiBUUlVFOyAvKiB3ZSBqdXN0IGlnbm9yZSB0aGlzICovCisgICAgfQorCisgIC8qIG1heSBiZSBOVUxMLCB3aGljaCBtZWFucyAiYW55IGludGVyZmFjZSB3aWxsIGRvIiAqLworICBpbnRlcmZhY2UgPSBkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAobWVzc2FnZSk7CisKKyAgX2RidXNfYXNzZXJ0IChkYnVzX21lc3NhZ2VfZ2V0X21lbWJlciAobWVzc2FnZSkgIT0gTlVMTCk7CisKKyAgbmFtZSA9IGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKTsKKworICBfZGJ1c192ZXJib3NlICgiRHJpdmVyIGdvdCBhIG1ldGhvZCBjYWxsOiAlc1xuIiwgbmFtZSk7CisKKyAgLyogc2VjdXJpdHkgY2hlY2tzIHNob3VsZCBoYXZlIGtlcHQgdGhpcyBmcm9tIGdldHRpbmcgaGVyZSAqLworICBfZGJ1c19hc3NlcnQgKGRidXNfbWVzc2FnZV9nZXRfc2VuZGVyIChtZXNzYWdlKSAhPSBOVUxMIHx8CisgICAgICAgICAgICAgICAgc3RyY21wIChuYW1lLCAiSGVsbG8iKSA9PSAwKTsKKworICBpc19jYW5vbmljYWxfcGF0aCA9IGRidXNfbWVzc2FnZV9oYXNfcGF0aCAobWVzc2FnZSwgREJVU19QQVRIX0RCVVMpOworCisgIGZvciAoaWggPSBpbnRlcmZhY2VfaGFuZGxlcnM7IGloLT5uYW1lICE9IE5VTEw7IGloKyspCisgICAgeworICAgICAgaWYgKCEoaXNfY2Fub25pY2FsX3BhdGggfHwgKGloLT5mbGFncyAmIElOVEVSRkFDRV9GTEFHX0FOWV9QQVRIKSkpCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICBpZiAoaW50ZXJmYWNlICE9IE5VTEwgJiYgc3RyY21wIChpbnRlcmZhY2UsIGloLT5uYW1lKSAhPSAwKQorICAgICAgICBjb250aW51ZTsKKworICAgICAgZm91bmRfaW50ZXJmYWNlID0gVFJVRTsKKworICAgICAgZm9yIChtaCA9IGloLT5tZXNzYWdlX2hhbmRsZXJzOyBtaC0+bmFtZSAhPSBOVUxMOyBtaCsrKQorICAgICAgICB7CisgICAgICAgICAgaWYgKHN0cmNtcCAobWgtPm5hbWUsIG5hbWUpICE9IDApCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJGb3VuZCBkcml2ZXIgaGFuZGxlciBmb3IgJXNcbiIsIG5hbWUpOworCisgICAgICAgICAgaWYgKChtaC0+ZmxhZ3MgJiBNRVRIT0RfRkxBR19QUklWSUxFR0VEKSAmJgorICAgICAgICAgICAgICAhYnVzX2RyaXZlcl9jaGVja19jYWxsZXJfaXNfcHJpdmlsZWdlZCAoY29ubmVjdGlvbiwgdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLCBlcnJvcikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKCEoaXNfY2Fub25pY2FsX3BhdGggfHwgKG1oLT5mbGFncyAmIE1FVEhPRF9GTEFHX0FOWV9QQVRIKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworICAgICAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfQUNDRVNTX0RFTklFRCwKKyAgICAgICAgICAgICAgICAgICJNZXRob2QgJyVzJyBpcyBvbmx5IGF2YWlsYWJsZSBhdCB0aGUgY2Fub25pY2FsIG9iamVjdCBwYXRoICclcyciLAorICAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKG1lc3NhZ2UpLCBEQlVTX1BBVEhfREJVUyk7CisgICAgICAgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfaGFzX3NpZ25hdHVyZSAobWVzc2FnZSwgbWgtPmluX2FyZ3MpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkNhbGwgdG8gJXMgaGFzIHdyb25nIGFyZ3MgKCVzLCBleHBlY3RlZCAlcylcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIGRidXNfbWVzc2FnZV9nZXRfc2lnbmF0dXJlIChtZXNzYWdlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWgtPmluX2FyZ3MpOworCisgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9JTlZBTElEX0FSR1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2FsbCB0byAlcyBoYXMgd3JvbmcgYXJncyAoJXMsIGV4cGVjdGVkICVzKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIGRidXNfbWVzc2FnZV9nZXRfc2lnbmF0dXJlIChtZXNzYWdlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1oLT5pbl9hcmdzKTsKKyAgICAgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoKCogbWgtPmhhbmRsZXIpIChjb25uZWN0aW9uLCB0cmFuc2FjdGlvbiwgbWVzc2FnZSwgZXJyb3IpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkRyaXZlciBoYW5kbGVyIHN1Y2NlZWRlZFxuIik7CisgICAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiRHJpdmVyIGhhbmRsZXIgcmV0dXJuZWQgZmFpbHVyZVxuIik7CisgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICBfZGJ1c192ZXJib3NlICgiTm8gZHJpdmVyIGhhbmRsZXIgZm9yIG1lc3NhZ2UgXCIlc1wiXG4iLAorICAgICAgICAgICAgICAgICBuYW1lKTsKKworICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIGZvdW5kX2ludGVyZmFjZSA/IERCVVNfRVJST1JfVU5LTk9XTl9NRVRIT0QgOiBEQlVTX0VSUk9SX1VOS05PV05fSU5URVJGQUNFLAorICAgICAgICAgICAgICAgICAgIiVzIGRvZXMgbm90IHVuZGVyc3RhbmQgbWVzc2FnZSAlcyIsCisgICAgICAgICAgICAgICAgICBEQlVTX1NFUlZJQ0VfREJVUywgbmFtZSk7CisKKyAgcmV0dXJuIEZBTFNFOworfQorCit2b2lkCitidXNfZHJpdmVyX3JlbW92ZV9jb25uZWN0aW9uIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgLyogRklYTUUgMS4wIERvZXMgbm90aGluZyBmb3Igbm93LCBzaG91bGQgdW5yZWdpc3RlciB0aGUgY29ubmVjdGlvbgorICAgKiB3aXRoIHRoZSBidXMgZHJpdmVyLgorICAgKi8KK30KKworc3RhdGljIGRidXNfYm9vbF90CitmZWF0dXJlc19nZXR0ZXIgKEJ1c0NvbnRleHQgICAgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2VJdGVyICp2YXJpYW50X2l0ZXIpCit7CisgIERCdXNNZXNzYWdlSXRlciBhcnJfaXRlcjsKKworICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX29wZW5fY29udGFpbmVyICh2YXJpYW50X2l0ZXIsIERCVVNfVFlQRV9BUlJBWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklOR19BU19TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhcnJfaXRlcikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmIChidXNfYXBwYXJtb3JfZW5hYmxlZCAoKSkKKyAgICB7CisgICAgICBjb25zdCBjaGFyICpzID0gIkFwcEFybW9yIjsKKworICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfYmFzaWMgKCZhcnJfaXRlciwgREJVU19UWVBFX1NUUklORywgJnMpKQorICAgICAgICBnb3RvIGFiYW5kb247CisgICAgfQorCisgIGlmIChidXNfc2VsaW51eF9lbmFibGVkICgpKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKnMgPSAiU0VMaW51eCI7CisKKyAgICAgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljICgmYXJyX2l0ZXIsIERCVVNfVFlQRV9TVFJJTkcsICZzKSkKKyAgICAgICAgZ290byBhYmFuZG9uOworICAgIH0KKworICBpZiAoYnVzX2NvbnRleHRfZ2V0X3N5c3RlbWRfYWN0aXZhdGlvbiAoY29udGV4dCkpCisgICAgeworICAgICAgY29uc3QgY2hhciAqcyA9ICJTeXN0ZW1kQWN0aXZhdGlvbiI7CisKKyAgICAgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljICgmYXJyX2l0ZXIsIERCVVNfVFlQRV9TVFJJTkcsICZzKSkKKyAgICAgICAgZ290byBhYmFuZG9uOworICAgIH0KKworICByZXR1cm4gZGJ1c19tZXNzYWdlX2l0ZXJfY2xvc2VfY29udGFpbmVyICh2YXJpYW50X2l0ZXIsICZhcnJfaXRlcik7CisKK2FiYW5kb246CisgIGRidXNfbWVzc2FnZV9pdGVyX2FiYW5kb25fY29udGFpbmVyICh2YXJpYW50X2l0ZXIsICZhcnJfaXRlcik7CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitpbnRlcmZhY2VzX2dldHRlciAoQnVzQ29udGV4dCAgICAgICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlSXRlciAqdmFyaWFudF9pdGVyKQoreworICBEQnVzTWVzc2FnZUl0ZXIgYXJyX2l0ZXI7CisgIGNvbnN0IEludGVyZmFjZUhhbmRsZXIgKmloOworCisgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfb3Blbl9jb250YWluZXIgKHZhcmlhbnRfaXRlciwgREJVU19UWVBFX0FSUkFZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HX0FTX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFycl9pdGVyKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgZm9yIChpaCA9IGludGVyZmFjZV9oYW5kbGVyczsgaWgtPm5hbWUgIT0gTlVMTDsgaWgrKykKKyAgICB7CisgICAgICBpZiAoaWgtPmZsYWdzICYgSU5URVJGQUNFX0ZMQUdfVU5JTlRFUkVTVElORykKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljICgmYXJyX2l0ZXIsIERCVVNfVFlQRV9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmloLT5uYW1lKSkKKyAgICAgICAgZ290byBhYmFuZG9uOworICAgIH0KKworICByZXR1cm4gZGJ1c19tZXNzYWdlX2l0ZXJfY2xvc2VfY29udGFpbmVyICh2YXJpYW50X2l0ZXIsICZhcnJfaXRlcik7CisKK2FiYW5kb246CisgIGRidXNfbWVzc2FnZV9pdGVyX2FiYW5kb25fY29udGFpbmVyICh2YXJpYW50X2l0ZXIsICZhcnJfaXRlcik7CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGNvbnN0IEludGVyZmFjZUhhbmRsZXIgKgorYnVzX2RyaXZlcl9maW5kX2ludGVyZmFjZSAoY29uc3QgY2hhciAgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgY2Fub25pY2FsX3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAqZXJyb3IpCit7CisgIGNvbnN0IEludGVyZmFjZUhhbmRsZXIgKmloOworCisgIGZvciAoaWggPSBpbnRlcmZhY2VfaGFuZGxlcnM7IGloLT5uYW1lICE9IE5VTEw7IGloKyspCisgICAgeworICAgICAgaWYgKCEoY2Fub25pY2FsX3BhdGggfHwgKGloLT5mbGFncyAmIElOVEVSRkFDRV9GTEFHX0FOWV9QQVRIKSkpCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICBpZiAoc3RyY21wIChuYW1lLCBpaC0+bmFtZSkgPT0gMCkKKyAgICAgICAgcmV0dXJuIGloOworICAgIH0KKworICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfVU5LTk9XTl9JTlRFUkZBQ0UsCisgICAgICAgICAgICAgICAgICAiSW50ZXJmYWNlIFwiJXNcIiBub3QgZm91bmQiLCBuYW1lKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBjb25zdCBQcm9wZXJ0eUhhbmRsZXIgKgoraW50ZXJmYWNlX2hhbmRsZXJfZmluZF9wcm9wZXJ0eSAoY29uc3QgSW50ZXJmYWNlSGFuZGxlciAqaWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAgICAgICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgICAgICAqZXJyb3IpCit7CisgIGNvbnN0IFByb3BlcnR5SGFuZGxlciAqcGg7CisKKyAgZm9yIChwaCA9IGloLT5wcm9wZXJ0eV9oYW5kbGVyczsgcGggIT0gTlVMTCAmJiBwaC0+bmFtZSAhPSBOVUxMOyBwaCsrKQorICAgIHsKKyAgICAgIGlmIChzdHJjbXAgKG5hbWUsIHBoLT5uYW1lKSA9PSAwKQorICAgICAgICByZXR1cm4gcGg7CisgICAgfQorCisgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9VTktOT1dOX1BST1BFUlRZLAorICAgICAgICAgICAgICAgICAgIlByb3BlcnR5IFwiJXMuJXNcIiBub3QgZm91bmQiLCBpaC0+bmFtZSwgbmFtZSk7CisgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2J1c19kcml2ZXJfaGFuZGxlX2dldCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgIEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgY29uc3QgSW50ZXJmYWNlSGFuZGxlciAqaWg7CisgIGNvbnN0IFByb3BlcnR5SGFuZGxlciAqaGFuZGxlcjsKKyAgY29uc3QgY2hhciAqaWZhY2U7CisgIGNvbnN0IGNoYXIgKnByb3A7CisgIEJ1c0NvbnRleHQgKmNvbnRleHQ7CisgIERCdXNNZXNzYWdlICpyZXBseSA9IE5VTEw7CisgIERCdXNNZXNzYWdlSXRlciBpdGVyOworICBEQnVzTWVzc2FnZUl0ZXIgdmFyX2l0ZXI7CisKKyAgLyogVGhlIG1lc3NhZ2Ugc2lnbmF0dXJlIGhhcyBhbHJlYWR5IGJlZW4gY2hlY2tlZCBmb3IgdXMsCisgICAqIHNvIHRoaXMgc2hvdWxkIGFsd2F5cyBzdWNjZWVkLiAqLworICBpZiAoIWRidXNfbWVzc2FnZV9nZXRfYXJncyAobWVzc2FnZSwgZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmcHJvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgLyogV2Ugb25seSBpbXBsZW1lbnQgUHJvcGVydGllcyBvbiAvb3JnL2ZyZWVkZXNrdG9wL0RCdXMgc28gZmFyLiAqLworICBpaCA9IGJ1c19kcml2ZXJfZmluZF9pbnRlcmZhY2UgKGlmYWNlLCBUUlVFLCBlcnJvcik7CisKKyAgaWYgKGloID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGhhbmRsZXIgPSBpbnRlcmZhY2VfaGFuZGxlcl9maW5kX3Byb3BlcnR5IChpaCwgcHJvcCwgZXJyb3IpOworCisgIGlmIChoYW5kbGVyID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGNvbnRleHQgPSBidXNfdHJhbnNhY3Rpb25fZ2V0X2NvbnRleHQgKHRyYW5zYWN0aW9uKTsKKworICByZXBseSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX3JldHVybiAobWVzc2FnZSk7CisKKyAgaWYgKHJlcGx5ID09IE5VTEwpCisgICAgZ290byBvb207CisKKyAgZGJ1c19tZXNzYWdlX2l0ZXJfaW5pdF9hcHBlbmQgKHJlcGx5LCAmaXRlcik7CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9vcGVuX2NvbnRhaW5lciAoJml0ZXIsIERCVVNfVFlQRV9WQVJJQU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyLT50eXBlLCAmdmFyX2l0ZXIpKQorICAgIGdvdG8gb29tOworCisgIGlmICghaGFuZGxlci0+Z2V0dGVyIChjb250ZXh0LCAmdmFyX2l0ZXIpKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV9pdGVyX2FiYW5kb25fY29udGFpbmVyICgmaXRlciwgJnZhcl9pdGVyKTsKKyAgICAgIGdvdG8gb29tOworICAgIH0KKworICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX2Nsb3NlX2NvbnRhaW5lciAoJml0ZXIsICZ2YXJfaXRlcikpCisgICAgZ290byBvb207CisKKyAgaWYgKCFidXNfdHJhbnNhY3Rpb25fc2VuZF9mcm9tX2RyaXZlciAodHJhbnNhY3Rpb24sIGNvbm5lY3Rpb24sIHJlcGx5KSkKKyAgICBnb3RvIG9vbTsKKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKyAgcmV0dXJuIFRSVUU7CisKK29vbToKKyAgaWYgKHJlcGx5ICE9IE5VTEwpCisgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisKKyAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2J1c19kcml2ZXJfaGFuZGxlX2dldF9hbGwgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIGNvbnN0IEludGVyZmFjZUhhbmRsZXIgKmloOworICBjb25zdCBjaGFyICppZmFjZTsKKyAgY29uc3QgUHJvcGVydHlIYW5kbGVyICpwaDsKKyAgREJ1c01lc3NhZ2VJdGVyIHJlcGx5X2l0ZXI7CisgIERCdXNNZXNzYWdlSXRlciBhcnJheV9pdGVyOworICBCdXNDb250ZXh0ICpjb250ZXh0OworICBEQnVzTWVzc2FnZSAqcmVwbHkgPSBOVUxMOworCisgIC8qIFRoZSBtZXNzYWdlIHNpZ25hdHVyZSBoYXMgYWxyZWFkeSBiZWVuIGNoZWNrZWQgZm9yIHVzLAorICAgKiBzbyB0aGlzIHNob3VsZCBhbHdheXMgc3VjY2VlZC4gKi8KKyAgaWYgKCFkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MgKG1lc3NhZ2UsIGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgIHJldHVybiBGQUxTRTsKKworICAvKiBXZSBvbmx5IGltcGxlbWVudCBQcm9wZXJ0aWVzIG9uIC9vcmcvZnJlZWRlc2t0b3AvREJ1cyBzbyBmYXIuICovCisgIGloID0gYnVzX2RyaXZlcl9maW5kX2ludGVyZmFjZSAoaWZhY2UsIFRSVUUsIGVycm9yKTsKKworICBpZiAoaWggPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgY29udGV4dCA9IGJ1c190cmFuc2FjdGlvbl9nZXRfY29udGV4dCAodHJhbnNhY3Rpb24pOworCisgIHJlcGx5ID0gX2RidXNfYXN2X25ld19tZXRob2RfcmV0dXJuIChtZXNzYWdlLCAmcmVwbHlfaXRlciwgJmFycmF5X2l0ZXIpOworCisgIGlmIChyZXBseSA9PSBOVUxMKQorICAgIGdvdG8gb29tOworCisgIGZvciAocGggPSBpaC0+cHJvcGVydHlfaGFuZGxlcnM7IHBoICE9IE5VTEwgJiYgcGgtPm5hbWUgIT0gTlVMTDsgcGgrKykKKyAgICB7CisgICAgICBEQnVzTWVzc2FnZUl0ZXIgZW50cnlfaXRlcjsKKyAgICAgIERCdXNNZXNzYWdlSXRlciB2YXJfaXRlcjsKKworICAgICAgaWYgKCFfZGJ1c19hc3Zfb3Blbl9lbnRyeSAoJmFycmF5X2l0ZXIsICZlbnRyeV9pdGVyLCBwaC0+bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoLT50eXBlLCAmdmFyX2l0ZXIpKQorICAgICAgICBnb3RvIG9vbV9hYmFuZG9uX21lc3NhZ2U7CisKKyAgICAgIGlmICghcGgtPmdldHRlciAoY29udGV4dCwgJnZhcl9pdGVyKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX2Fzdl9hYmFuZG9uX2VudHJ5ICgmYXJyYXlfaXRlciwgJmVudHJ5X2l0ZXIsICZ2YXJfaXRlcik7CisgICAgICAgICAgZ290byBvb21fYWJhbmRvbl9tZXNzYWdlOworICAgICAgICB9CisKKyAgICAgIGlmICghX2RidXNfYXN2X2Nsb3NlX2VudHJ5ICgmYXJyYXlfaXRlciwgJmVudHJ5X2l0ZXIsICZ2YXJfaXRlcikpCisgICAgICAgIGdvdG8gb29tX2FiYW5kb25fbWVzc2FnZTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19hc3ZfY2xvc2UgKCZyZXBseV9pdGVyLCAmYXJyYXlfaXRlcikpCisgICAgZ290byBvb207CisKKyAgaWYgKCFidXNfdHJhbnNhY3Rpb25fc2VuZF9mcm9tX2RyaXZlciAodHJhbnNhY3Rpb24sIGNvbm5lY3Rpb24sIHJlcGx5KSkKKyAgICBnb3RvIG9vbTsKKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKyAgcmV0dXJuIFRSVUU7CisKK29vbV9hYmFuZG9uX21lc3NhZ2U6CisgIF9kYnVzX2Fzdl9hYmFuZG9uICgmcmVwbHlfaXRlciwgJmFycmF5X2l0ZXIpOworICAvKiBmYWxsIHRocm91Z2ggKi8KK29vbToKKyAgaWYgKHJlcGx5ICE9IE5VTEwpCisgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisKKyAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2J1c19kcml2ZXJfaGFuZGxlX3NldCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgIEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgY29uc3QgSW50ZXJmYWNlSGFuZGxlciAqaWg7CisgIGNvbnN0IGNoYXIgKmlmYWNlOworICBjb25zdCBjaGFyICpwcm9wOworICBjb25zdCBQcm9wZXJ0eUhhbmRsZXIgKmhhbmRsZXI7CisgIERCdXNNZXNzYWdlSXRlciBpdGVyOworCisgIC8qIFdlIGFscmVhZHkgY2hlY2tlZCB0aGlzIGluIGJ1c19kcml2ZXJfaGFuZGxlX21lc3NhZ2UoKSAqLworICBfZGJ1c19hc3NlcnQgKGRidXNfbWVzc2FnZV9oYXNfc2lnbmF0dXJlIChtZXNzYWdlLCAic3N2IikpOworCisgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfaW5pdCAobWVzc2FnZSwgJml0ZXIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIk1lc3NhZ2UgdHlwZSB3YXMgYWxyZWFkeSBjaGVja2VkIHRvIGJlICdzc3YnIik7CisKKyAgZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2Jhc2ljICgmaXRlciwgJmlmYWNlKTsKKworICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX25leHQgKCZpdGVyKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJNZXNzYWdlIHR5cGUgd2FzIGFscmVhZHkgY2hlY2tlZCB0byBiZSAnc3N2JyIpOworCisgIGRidXNfbWVzc2FnZV9pdGVyX2dldF9iYXNpYyAoJml0ZXIsICZwcm9wKTsKKworICAvKiBXZSBvbmx5IGltcGxlbWVudCBQcm9wZXJ0aWVzIG9uIC9vcmcvZnJlZWRlc2t0b3AvREJ1cyBzbyBmYXIuICovCisgIGloID0gYnVzX2RyaXZlcl9maW5kX2ludGVyZmFjZSAoaWZhY2UsIFRSVUUsIGVycm9yKTsKKworICBpZiAoaWggPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaGFuZGxlciA9IGludGVyZmFjZV9oYW5kbGVyX2ZpbmRfcHJvcGVydHkgKGloLCBwcm9wLCBlcnJvcik7CisKKyAgaWYgKGhhbmRsZXIgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgLyogV2UgZG9uJ3QgaW1wbGVtZW50IGFueSBwcm9wZXJ0aWVzIHRoYXQgY2FuIGJlIHNldCB5ZXQuICovCisgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9QUk9QRVJUWV9SRUFEX09OTFksCisgICAgICAgICAgICAgICAgICAiUHJvcGVydHkgJyVzLiVzJyBjYW5ub3QgYmUgc2V0IiwgaWZhY2UsIHByb3ApOworICByZXR1cm4gRkFMU0U7Cit9CmRpZmYgLS1naXQgYS9idXMvZHJpdmVyLmggYi9idXMvZHJpdmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMxMjg5ZAotLS0gL2Rldi9udWxsCisrKyBiL2J1cy9kcml2ZXIuaApAQCAtMCwwICsxLDcwIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRyaXZlci5oICBCdXMgY2xpZW50IChkcml2ZXIpCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzICBDb2RlRmFjdG9yeSBBQgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaWZuZGVmIEJVU19EUklWRVJfSAorI2RlZmluZSBCVVNfRFJJVkVSX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy5oPgorI2luY2x1ZGUgImNvbm5lY3Rpb24uaCIKKwordHlwZWRlZiBlbnVtCit7CisgIEJVU19EUklWRVJfRk9VTkRfU0VMRiwKKyAgQlVTX0RSSVZFUl9GT1VORF9QRUVSLAorICBCVVNfRFJJVkVSX0ZPVU5EX0VSUk9SLAorfSBCdXNEcml2ZXJGb3VuZDsKKwordm9pZCAgICAgICAgYnVzX2RyaXZlcl9yZW1vdmVfY29ubmVjdGlvbiAgICAgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKTsKK2RidXNfYm9vbF90IGJ1c19kcml2ZXJfaGFuZGxlX21lc3NhZ2UgICAgICAgIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKTsKK2RidXNfYm9vbF90IGJ1c19kcml2ZXJfc2VuZF9zZXJ2aWNlX2xvc3QgICAgIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqc2VydmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpOworZGJ1c19ib29sX3QgYnVzX2RyaXZlcl9zZW5kX3NlcnZpY2VfYWNxdWlyZWQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpzZXJ2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcik7CitkYnVzX2Jvb2xfdCBidXNfZHJpdmVyX3NlbmRfc2VydmljZV9vd25lcl9jaGFuZ2VkICAoY29uc3QgY2hhciAgICAgKnNlcnZpY2VfbmFtZSwKKwkJCQkJCSAgICBjb25zdCBjaGFyICAgICAqb2xkX293bmVyLAorCQkJCQkJICAgIGNvbnN0IGNoYXIgICAgICpuZXdfb3duZXIsCisJCQkJCQkgICAgQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorCQkJCQkJICAgIERCdXNFcnJvciAgICAgICplcnJvcik7CitkYnVzX2Jvb2xfdCBidXNfZHJpdmVyX2dlbmVyYXRlX2ludHJvc3BlY3Rfc3RyaW5nICAoREJ1c1N0cmluZyAqeG1sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90IGNhbm9uaWNhbF9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICptZXNzYWdlKTsKKworQnVzRHJpdmVyRm91bmQgYnVzX2RyaXZlcl9nZXRfY29ubl9oZWxwZXIgKERCdXNDb25uZWN0aW9uICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICp3aGF0X3dlX3dhbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKipuYW1lX3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKipwZWVyX2Nvbm5fcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgKmVycm9yKTsKK2RidXNfYm9vbF90IGJ1c19kcml2ZXJfc2VuZF9hY2tfcmVwbHkgICAgIChEQnVzQ29ubmVjdGlvbiAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzVHJhbnNhY3Rpb24gICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICplcnJvcik7CisKKyNlbmRpZiAvKiBCVVNfRFJJVkVSX0ggKi8KZGlmZiAtLWdpdCBhL2J1cy9leGFtcGxlLXNlc3Npb24tZGlzYWJsZS1zdGF0cy5jb25mLmluIGIvYnVzL2V4YW1wbGUtc2Vzc2lvbi1kaXNhYmxlLXN0YXRzLmNvbmYuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg2M2VmMAotLS0gL2Rldi9udWxsCisrKyBiL2J1cy9leGFtcGxlLXNlc3Npb24tZGlzYWJsZS1zdGF0cy5jb25mLmluCkBAIC0wLDAgKzEsMTUgQEAKKzwhRE9DVFlQRSBidXNjb25maWcgUFVCTElDICItLy9mcmVlZGVza3RvcC8vRFREIEQtQlVTIEJ1cyBDb25maWd1cmF0aW9uIDEuMC8vRU4iCisgImh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3N0YW5kYXJkcy9kYnVzLzEuMC9idXNjb25maWcuZHRkIj4KKzxidXNjb25maWc+CisKKyAgPCEtLSBJZiB0aGUgU3RhdHMgaW50ZXJmYWNlIHdhcyBlbmFibGVkIGF0IGNvbXBpbGUtdGltZSwgdXNlcnMgY2FuIHVzZSBpdCBvbgorICAgICAgIHRoZSBzZXNzaW9uIGJ1cyBieSBkZWZhdWx0LiBTeXN0ZW1zIHByb3ZpZGluZyBpc29sYXRpb24gb2YgcHJvY2Vzc2VzCisgICAgICAgd2l0aCBMU01zIG1pZ2h0IHdhbnQgdG8gcmVzdHJpY3QgdGhpcy4gVGhpcyBjYW4gYmUgYWNoaWV2ZWQgYnkgY29weWluZworICAgICAgIHRoaXMgZmlsZSBpbiBARVhQQU5ERURfU1lTQ09ORkRJUkAvZGJ1cy0xL3Nlc3Npb24uZC8gLS0+CisKKyAgPHBvbGljeSBjb250ZXh0PSJkZWZhdWx0Ij4KKyAgICA8ZGVueSBzZW5kX2Rlc3RpbmF0aW9uPSJvcmcuZnJlZWRlc2t0b3AuREJ1cyIKKyAgICAgICAgICBzZW5kX2ludGVyZmFjZT0ib3JnLmZyZWVkZXNrdG9wLkRCdXMuRGVidWcuU3RhdHMiLz4KKyAgPC9wb2xpY3k+CisKKzwvYnVzY29uZmlnPgpkaWZmIC0tZ2l0IGEvYnVzL2V4YW1wbGUtc3lzdGVtLWVuYWJsZS1zdGF0cy5jb25mLmluIGIvYnVzL2V4YW1wbGUtc3lzdGVtLWVuYWJsZS1zdGF0cy5jb25mLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4NWFhODMKLS0tIC9kZXYvbnVsbAorKysgYi9idXMvZXhhbXBsZS1zeXN0ZW0tZW5hYmxlLXN0YXRzLmNvbmYuaW4KQEAgLTAsMCArMSwxNSBAQAorPCFET0NUWVBFIGJ1c2NvbmZpZyBQVUJMSUMgIi0vL2ZyZWVkZXNrdG9wLy9EVEQgRC1CVVMgQnVzIENvbmZpZ3VyYXRpb24gMS4wLy9FTiIKKyAiaHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc3RhbmRhcmRzL2RidXMvMS4wL2J1c2NvbmZpZy5kdGQiPgorPGJ1c2NvbmZpZz4KKworICA8IS0tIElmIHRoZSBTdGF0cyBpbnRlcmZhY2Ugd2FzIGVuYWJsZWQgYXQgY29tcGlsZS10aW1lLCBvbmx5IHJvb3QgbWF5IHVzZSBpdC4KKyAgICAgICBSZXBsYWNlIFVTRVJOQU1FIGFuZCBjb3B5IHRoaXMgZmlsZSBpbiBARVhQQU5ERURfU1lTQ09ORkRJUkAvZGJ1cy0xL3N5c3RlbS5kLworICAgICAgIGlmIHlvdSB3YW50IHRvIGVuYWJsZSBvdGhlciBwcml2aWxlZ2VkIHVzZXJzIHRvIHZpZXcgc3RhdGlzdGljcyBhbmQKKyAgICAgICBkZWJ1ZyBpbmZvIC0tPgorCisgIDxwb2xpY3kgdXNlcj0iVVNFUk5BTUUiPgorICAgIDxhbGxvdyBzZW5kX2Rlc3RpbmF0aW9uPSJvcmcuZnJlZWRlc2t0b3AuREJ1cyIKKyAgICAgICAgICAgc2VuZF9pbnRlcmZhY2U9Im9yZy5mcmVlZGVza3RvcC5EQnVzLkRlYnVnLlN0YXRzIi8+CisgIDwvcG9saWN5PgorCis8L2J1c2NvbmZpZz4KZGlmZiAtLWdpdCBhL2J1cy9leHBpcmVsaXN0LmMgYi9idXMvZXhwaXJlbGlzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhMzk3NTIKLS0tIC9kZXYvbnVsbAorKysgYi9idXMvZXhwaXJlbGlzdC5jCkBAIC0wLDAgKzEsNDAwIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGV4cGlyZWxpc3QuYyAgTGlzdCBvZiBpdGVtcyB0aGF0IGV4cGlyZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgImV4cGlyZWxpc3QuaCIKKyNpbmNsdWRlICJ0ZXN0LmgiCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWludGVybmFscy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1tYWlubG9vcC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy10aW1lb3V0Lmg+CisKK3N0cnVjdCBCdXNFeHBpcmVMaXN0Cit7CisgIERCdXNMaXN0ICAgICAgKml0ZW1zOyAvKio8IExpc3Qgb2YgQnVzRXhwaXJlSXRlbSAqLworICBEQnVzVGltZW91dCAgICp0aW1lb3V0OworICBEQnVzTG9vcCAgICAgICpsb29wOworICBCdXNFeHBpcmVGdW5jICBleHBpcmVfZnVuYzsKKyAgdm9pZCAgICAgICAgICAqZGF0YTsKKyAgaW50ICAgICAgICAgICAgZXhwaXJlX2FmdGVyOyAvKio8IEV4cGlyZSBhZnRlciBtaWxsaXNlY29uZHMgKHRob3VzYW5kdGhzKSAqLworfTsKKworc3RhdGljIGRidXNfYm9vbF90IGV4cGlyZV90aW1lb3V0X2hhbmRsZXIgKHZvaWQgKmRhdGEpOworCitCdXNFeHBpcmVMaXN0KgorYnVzX2V4cGlyZV9saXN0X25ldyAoREJ1c0xvb3AgICAgICAqbG9vcCwKKyAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgIGV4cGlyZV9hZnRlciwKKyAgICAgICAgICAgICAgICAgICAgIEJ1c0V4cGlyZUZ1bmMgIGV4cGlyZV9mdW5jLAorICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqZGF0YSkKK3sKKyAgQnVzRXhwaXJlTGlzdCAqbGlzdDsKKworICBsaXN0ID0gZGJ1c19uZXcwIChCdXNFeHBpcmVMaXN0LCAxKTsKKyAgaWYgKGxpc3QgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBsaXN0LT5leHBpcmVfZnVuYyA9IGV4cGlyZV9mdW5jOworICBsaXN0LT5kYXRhID0gZGF0YTsKKyAgbGlzdC0+bG9vcCA9IGxvb3A7CisgIGxpc3QtPmV4cGlyZV9hZnRlciA9IGV4cGlyZV9hZnRlcjsKKworICBsaXN0LT50aW1lb3V0ID0gX2RidXNfdGltZW91dF9uZXcgKDEwMCwgLyogaXJyZWxldmFudCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGlyZV90aW1lb3V0X2hhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdCwgTlVMTCk7CisgIGlmIChsaXN0LT50aW1lb3V0ID09IE5VTEwpCisgICAgZ290byBmYWlsZWQ7CisKKyAgX2RidXNfdGltZW91dF9kaXNhYmxlIChsaXN0LT50aW1lb3V0KTsKKworICBpZiAoIV9kYnVzX2xvb3BfYWRkX3RpbWVvdXQgKGxpc3QtPmxvb3AsIGxpc3QtPnRpbWVvdXQpKQorICAgIGdvdG8gZmFpbGVkOworCisgIHJldHVybiBsaXN0OworCisgZmFpbGVkOgorICBpZiAobGlzdC0+dGltZW91dCkKKyAgICBfZGJ1c190aW1lb3V0X3VucmVmIChsaXN0LT50aW1lb3V0KTsKKworICBkYnVzX2ZyZWUgKGxpc3QpOworCisgIHJldHVybiBOVUxMOworfQorCit2b2lkCitidXNfZXhwaXJlX2xpc3RfZnJlZSAoQnVzRXhwaXJlTGlzdCAqbGlzdCkKK3sKKyAgX2RidXNfYXNzZXJ0IChsaXN0LT5pdGVtcyA9PSBOVUxMKTsKKworICBfZGJ1c19sb29wX3JlbW92ZV90aW1lb3V0IChsaXN0LT5sb29wLCBsaXN0LT50aW1lb3V0KTsKKworICBfZGJ1c190aW1lb3V0X3VucmVmIChsaXN0LT50aW1lb3V0KTsKKworICBkYnVzX2ZyZWUgKGxpc3QpOworfQorCit2b2lkCitidXNfZXhwaXJlX3RpbWVvdXRfc2V0X2ludGVydmFsIChEQnVzVGltZW91dCAgICp0aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgbmV4dF9pbnRlcnZhbCkKK3sKKyAgaWYgKG5leHRfaW50ZXJ2YWwgPj0gMCkKKyAgICB7CisgICAgICBfZGJ1c190aW1lb3V0X3Jlc3RhcnQgKHRpbWVvdXQsIG5leHRfaW50ZXJ2YWwpOworCisgICAgICBfZGJ1c192ZXJib3NlICgiRW5hYmxlZCBhbiBleHBpcmUgdGltZW91dCB3aXRoIGludGVydmFsICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgbmV4dF9pbnRlcnZhbCk7CisgICAgfQorICBlbHNlIGlmIChkYnVzX3RpbWVvdXRfZ2V0X2VuYWJsZWQgKHRpbWVvdXQpKQorICAgIHsKKyAgICAgIF9kYnVzX3RpbWVvdXRfZGlzYWJsZSAodGltZW91dCk7CisKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJEaXNhYmxlZCBhbiBleHBpcmUgdGltZW91dFxuIik7CisgICAgfQorICBlbHNlCisgICAgX2RidXNfdmVyYm9zZSAoIk5vIG5lZWQgdG8gZGlzYWJsZSB0aGlzIGV4cGlyZSB0aW1lb3V0XG4iKTsKK30KKwordm9pZAorYnVzX2V4cGlyZV9saXN0X3JlY2hlY2tfaW1tZWRpYXRlbHkgKEJ1c0V4cGlyZUxpc3QgKmxpc3QpCit7CisgIF9kYnVzX3ZlcmJvc2UgKCJzZXR0aW5nIGludGVydmFsIG9uIGV4cGlyZSBsaXN0IHRvIDAgZm9yIGltbWVkaWF0ZSByZWNoZWNrXG4iKTsKKworICBidXNfZXhwaXJlX3RpbWVvdXRfc2V0X2ludGVydmFsIChsaXN0LT50aW1lb3V0LCAwKTsKK30KKworc3RhdGljIGludAorZG9fZXhwaXJhdGlvbl93aXRoX21vbm90b25pY190aW1lIChCdXNFeHBpcmVMaXN0ICpsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nICAgICAgICAgICB0dl9zZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgICAgICAgICAgIHR2X3VzZWMpCit7CisgIERCdXNMaXN0ICpsaW5rOworICBpbnQgbmV4dF9pbnRlcnZhbCwgbWluX3dhaXRfdGltZSwgaXRlbXNfdG9fZXhwaXJlOworCisgIG5leHRfaW50ZXJ2YWwgPSAtMTsKKyAgbWluX3dhaXRfdGltZSA9IDM2MDAgKiAxMDAwOyAvKiB0aGlzIGlzIHJlc2V0IGFueXdheSBpZiB1c2VkICovCisgIGl0ZW1zX3RvX2V4cGlyZSA9IDA7CisgIAorICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJmxpc3QtPml0ZW1zKTsKKyAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBEQnVzTGlzdCAqbmV4dCA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJmxpc3QtPml0ZW1zLCBsaW5rKTsKKyAgICAgIGRvdWJsZSBlbGFwc2VkOworICAgICAgQnVzRXhwaXJlSXRlbSAqaXRlbTsKKworICAgICAgaXRlbSA9IGxpbmstPmRhdGE7CisKKyAgICAgIGVsYXBzZWQgPSBFTEFQU0VEX01JTExJU0VDT05EU19TSU5DRSAoaXRlbS0+YWRkZWRfdHZfc2VjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT5hZGRlZF90dl91c2VjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dl9zZWMsIHR2X3VzZWMpOworCisgICAgICBpZiAoKChpdGVtLT5hZGRlZF90dl9zZWMgPT0gMCkgJiYgKGl0ZW0tPmFkZGVkX3R2X3VzZWMgPT0gMCkpIHx8CisgICAgICAgICAgKChsaXN0LT5leHBpcmVfYWZ0ZXIgPiAwKSAmJiAoZWxhcHNlZCA+PSAoZG91YmxlKSBsaXN0LT5leHBpcmVfYWZ0ZXIpKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJFeHBpcmluZyBhbiBpdGVtICVwXG4iLCBpdGVtKTsKKworICAgICAgICAgIC8qIElmIHRoZSBleHBpcmUgZnVuY3Rpb24gZmFpbHMsIHdlIGp1c3QgZW5kIHVwIGV4cGlyaW5nCisgICAgICAgICAgICogdGhpcyBpdGVtIG5leHQgdGltZSB3ZSB3YWxrIHRocm91Z2ggdGhlIGxpc3QuIFRoaXMgd291bGQKKyAgICAgICAgICAgKiBiZSBhbiBpbmRldGVybWluYXRlIHRpbWUgbm9ybWFsbHksIHNvIHdlIHNldCB1cCB0aGUKKyAgICAgICAgICAgKiBuZXh0X2ludGVydmFsIHRvIGJlICJzaG9ydGx5IiAoanVzdCBlbm91Z2ggdG8gYXZvaWQKKyAgICAgICAgICAgKiBhIGJ1c3kgbG9vcCkKKyAgICAgICAgICAgKi8KKyAgICAgICAgICBpZiAoISgqIGxpc3QtPmV4cGlyZV9mdW5jKSAobGlzdCwgbGluaywgbGlzdC0+ZGF0YSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIG5leHRfaW50ZXJ2YWwgPSBfZGJ1c19nZXRfb29tX3dhaXQgKCk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBlbHNlIGlmIChsaXN0LT5leHBpcmVfYWZ0ZXIgPiAwKQorICAgICAgICB7CisgICAgICAgICAgZG91YmxlIHRvX3dhaXQ7CisKKyAgICAgICAgICBpdGVtc190b19leHBpcmUgPSAxOworICAgICAgICAgIHRvX3dhaXQgPSAoZG91YmxlKSBsaXN0LT5leHBpcmVfYWZ0ZXIgLSBlbGFwc2VkOworICAgICAgICAgIGlmIChtaW5fd2FpdF90aW1lID4gdG9fd2FpdCkKKyAgICAgICAgICAgIG1pbl93YWl0X3RpbWUgPSB0b193YWl0OworICAgICAgICB9CisKKyAgICAgIGxpbmsgPSBuZXh0OworICAgIH0KKworICBpZiAobmV4dF9pbnRlcnZhbCA8IDAgJiYgaXRlbXNfdG9fZXhwaXJlKQorICAgIG5leHRfaW50ZXJ2YWwgPSBtaW5fd2FpdF90aW1lOworCisgIHJldHVybiBuZXh0X2ludGVydmFsOworfQorCitzdGF0aWMgdm9pZAorYnVzX2V4cGlyZWxpc3RfZXhwaXJlIChCdXNFeHBpcmVMaXN0ICpsaXN0KQoreworICBpbnQgbmV4dF9pbnRlcnZhbDsKKworICBuZXh0X2ludGVydmFsID0gLTE7CisKKyAgaWYgKGxpc3QtPml0ZW1zICE9IE5VTEwpCisgICAgeworICAgICAgbG9uZyB0dl9zZWMsIHR2X3VzZWM7CisKKyAgICAgIF9kYnVzX2dldF9tb25vdG9uaWNfdGltZSAoJnR2X3NlYywgJnR2X3VzZWMpOworCisgICAgICBuZXh0X2ludGVydmFsID0gZG9fZXhwaXJhdGlvbl93aXRoX21vbm90b25pY190aW1lIChsaXN0LCB0dl9zZWMsIHR2X3VzZWMpOworICAgIH0KKworICBidXNfZXhwaXJlX3RpbWVvdXRfc2V0X2ludGVydmFsIChsaXN0LT50aW1lb3V0LCBuZXh0X2ludGVydmFsKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitleHBpcmVfdGltZW91dF9oYW5kbGVyICh2b2lkICpkYXRhKQoreworICBCdXNFeHBpcmVMaXN0ICpsaXN0ID0gZGF0YTsKKworICBfZGJ1c192ZXJib3NlICgiUnVubmluZ1xuIik7CisKKyAgLyogbm90ZSB0aGF0IHRoaXMgbWF5IHJlbW92ZSB0aGUgdGltZW91dCAqLworICBidXNfZXhwaXJlbGlzdF9leHBpcmUgKGxpc3QpOworCisgIHJldHVybiBUUlVFOworfQorCit2b2lkCitidXNfZXhwaXJlX2xpc3RfcmVtb3ZlX2xpbmsgKEJ1c0V4cGlyZUxpc3QgKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNMaXN0ICAgICAgKmxpbmspCit7CisgIF9kYnVzX2xpc3RfcmVtb3ZlX2xpbmsgKCZsaXN0LT5pdGVtcywgbGluayk7Cit9CisKK2RidXNfYm9vbF90CitidXNfZXhwaXJlX2xpc3RfcmVtb3ZlIChCdXNFeHBpcmVMaXN0ICpsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgQnVzRXhwaXJlSXRlbSAqaXRlbSkKK3sKKyAgcmV0dXJuIF9kYnVzX2xpc3RfcmVtb3ZlICgmbGlzdC0+aXRlbXMsIGl0ZW0pOworfQorCit2b2lkCitidXNfZXhwaXJlX2xpc3RfdW5saW5rIChCdXNFeHBpcmVMaXN0ICpsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICAgICAqbGluaykKK3sKKyAgX2RidXNfbGlzdF91bmxpbmsgKCZsaXN0LT5pdGVtcywgbGluayk7Cit9CisKK2RidXNfYm9vbF90CitidXNfZXhwaXJlX2xpc3RfYWRkIChCdXNFeHBpcmVMaXN0ICpsaXN0LAorICAgICAgICAgICAgICAgICAgICAgQnVzRXhwaXJlSXRlbSAqaXRlbSkKK3sKKyAgZGJ1c19ib29sX3QgcmV0OworCisgIHJldCA9IF9kYnVzX2xpc3RfcHJlcGVuZCAoJmxpc3QtPml0ZW1zLCBpdGVtKTsKKyAgaWYgKHJldCAmJiAhZGJ1c190aW1lb3V0X2dldF9lbmFibGVkIChsaXN0LT50aW1lb3V0KSkKKyAgICBidXNfZXhwaXJlX3RpbWVvdXRfc2V0X2ludGVydmFsIChsaXN0LT50aW1lb3V0LCAwKTsKKworICByZXR1cm4gcmV0OworfQorCit2b2lkCitidXNfZXhwaXJlX2xpc3RfYWRkX2xpbmsgKEJ1c0V4cGlyZUxpc3QgKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNMaXN0ICAgICAgKmxpbmspCit7CisgIF9kYnVzX2Fzc2VydCAobGluay0+ZGF0YSAhPSBOVUxMKTsKKyAgCisgIF9kYnVzX2xpc3RfcHJlcGVuZF9saW5rICgmbGlzdC0+aXRlbXMsIGxpbmspOworCisgIGlmICghZGJ1c190aW1lb3V0X2dldF9lbmFibGVkIChsaXN0LT50aW1lb3V0KSkKKyAgICBidXNfZXhwaXJlX3RpbWVvdXRfc2V0X2ludGVydmFsIChsaXN0LT50aW1lb3V0LCAwKTsKK30KKworREJ1c0xpc3QqCitidXNfZXhwaXJlX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKEJ1c0V4cGlyZUxpc3QgKmxpc3QpCit7CisgIHJldHVybiBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmbGlzdC0+aXRlbXMpOworfQorCitEQnVzTGlzdCoKK2J1c19leHBpcmVfbGlzdF9nZXRfbmV4dF9saW5rIChCdXNFeHBpcmVMaXN0ICpsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNMaXN0ICAgICAgKmxpbmspCit7CisgIHJldHVybiBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZsaXN0LT5pdGVtcywgbGluayk7Cit9CisKK2RidXNfYm9vbF90CitidXNfZXhwaXJlX2xpc3RfY29udGFpbnNfaXRlbSAoQnVzRXhwaXJlTGlzdCAqbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNFeHBpcmVJdGVtICppdGVtKQoreworICByZXR1cm4gX2RidXNfbGlzdF9maW5kX2xhc3QgKCZsaXN0LT5pdGVtcywgaXRlbSkgIT0gTlVMTDsKK30KKworI2lmZGVmIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEJ1c0V4cGlyZUl0ZW0gaXRlbTsKKyAgaW50IGV4cGlyZV9jb3VudDsKK30gVGVzdEV4cGlyZUl0ZW07CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAordGVzdF9leHBpcmVfZnVuYyAoQnVzRXhwaXJlTGlzdCAqbGlzdCwKKyAgICAgICAgICAgICAgICAgIERCdXNMaXN0ICAgICAgKmxpbmssCisgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpkYXRhKQoreworICBUZXN0RXhwaXJlSXRlbSAqdDsKKworICB0ID0gKFRlc3RFeHBpcmVJdGVtKikgbGluay0+ZGF0YTsKKworICB0LT5leHBpcmVfY291bnQgKz0gMTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK3RpbWVfYWRkX21pbGxpc2Vjb25kcyAobG9uZyAqdHZfc2VjLAorICAgICAgICAgICAgICAgICAgICAgICBsb25nICp0dl91c2VjLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgICBtaWxsaXNlY29uZHMpCit7CisgICp0dl9zZWMgPSAqdHZfc2VjICsgbWlsbGlzZWNvbmRzIC8gMTAwMDsKKyAgKnR2X3VzZWMgPSAqdHZfdXNlYyArIG1pbGxpc2Vjb25kcyAqIDEwMDA7CisgIGlmICgqdHZfdXNlYyA+PSAxMDAwMDAwKQorICAgIHsKKyAgICAgICp0dl91c2VjIC09IDEwMDAwMDA7CisgICAgICAqdHZfc2VjICs9IDE7CisgICAgfQorfQorCitkYnVzX2Jvb2xfdAorYnVzX2V4cGlyZV9saXN0X3Rlc3QgKGNvbnN0IERCdXNTdHJpbmcgKnRlc3RfZGF0YV9kaXIpCit7CisgIERCdXNMb29wICpsb29wOworICBCdXNFeHBpcmVMaXN0ICpsaXN0OworICBsb25nIHR2X3NlYywgdHZfdXNlYzsKKyAgbG9uZyB0dl9zZWNfbm90X2V4cGlyZWQsIHR2X3VzZWNfbm90X2V4cGlyZWQ7CisgIGxvbmcgdHZfc2VjX2V4cGlyZWQsIHR2X3VzZWNfZXhwaXJlZDsKKyAgbG9uZyB0dl9zZWNfcGFzdCwgdHZfdXNlY19wYXN0OworICBUZXN0RXhwaXJlSXRlbSAqaXRlbTsKKyAgaW50IG5leHRfaW50ZXJ2YWw7CisgIGRidXNfYm9vbF90IHJlc3VsdCA9IEZBTFNFOworCisKKyAgbG9vcCA9IF9kYnVzX2xvb3BfbmV3ICgpOworICBfZGJ1c19hc3NlcnQgKGxvb3AgIT0gTlVMTCk7CisKKyNkZWZpbmUgRVhQSVJFX0FGVEVSIDEwMAorICAKKyAgbGlzdCA9IGJ1c19leHBpcmVfbGlzdF9uZXcgKGxvb3AsIEVYUElSRV9BRlRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfZXhwaXJlX2Z1bmMsIE5VTEwpOworICBfZGJ1c19hc3NlcnQgKGxpc3QgIT0gTlVMTCk7CisKKyAgX2RidXNfZ2V0X21vbm90b25pY190aW1lICgmdHZfc2VjLCAmdHZfdXNlYyk7CisKKyAgdHZfc2VjX25vdF9leHBpcmVkID0gdHZfc2VjOworICB0dl91c2VjX25vdF9leHBpcmVkID0gdHZfdXNlYzsKKyAgdGltZV9hZGRfbWlsbGlzZWNvbmRzICgmdHZfc2VjX25vdF9leHBpcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICZ0dl91c2VjX25vdF9leHBpcmVkLCBFWFBJUkVfQUZURVIgLSAxKTsKKworICB0dl9zZWNfZXhwaXJlZCA9IHR2X3NlYzsKKyAgdHZfdXNlY19leHBpcmVkID0gdHZfdXNlYzsKKyAgdGltZV9hZGRfbWlsbGlzZWNvbmRzICgmdHZfc2VjX2V4cGlyZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgJnR2X3VzZWNfZXhwaXJlZCwgRVhQSVJFX0FGVEVSKTsKKyAgCisKKyAgdHZfc2VjX3Bhc3QgPSB0dl9zZWMgLSAxOworICB0dl91c2VjX3Bhc3QgPSB0dl91c2VjOworCisgIGl0ZW0gPSBkYnVzX25ldzAgKFRlc3RFeHBpcmVJdGVtLCAxKTsKKworICBpZiAoaXRlbSA9PSBOVUxMKQorICAgIGdvdG8gb29tOworCisgIGl0ZW0tPml0ZW0uYWRkZWRfdHZfc2VjID0gdHZfc2VjOworICBpdGVtLT5pdGVtLmFkZGVkX3R2X3VzZWMgPSB0dl91c2VjOworICBpZiAoIWJ1c19leHBpcmVfbGlzdF9hZGQgKGxpc3QsICZpdGVtLT5pdGVtKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvdXQgb2YgbWVtb3J5Iik7CisKKyAgbmV4dF9pbnRlcnZhbCA9CisgICAgZG9fZXhwaXJhdGlvbl93aXRoX21vbm90b25pY190aW1lIChsaXN0LCB0dl9zZWNfbm90X2V4cGlyZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dl91c2VjX25vdF9leHBpcmVkKTsKKyAgX2RidXNfYXNzZXJ0IChpdGVtLT5leHBpcmVfY291bnQgPT0gMCk7CisgIF9kYnVzX3ZlcmJvc2UgKCJuZXh0X2ludGVydmFsID0gJWRcbiIsIG5leHRfaW50ZXJ2YWwpOworICBfZGJ1c19hc3NlcnQgKG5leHRfaW50ZXJ2YWwgPT0gMSk7CisgIAorICBuZXh0X2ludGVydmFsID0KKyAgICBkb19leHBpcmF0aW9uX3dpdGhfbW9ub3RvbmljX3RpbWUgKGxpc3QsIHR2X3NlY19leHBpcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHZfdXNlY19leHBpcmVkKTsKKyAgX2RidXNfYXNzZXJ0IChpdGVtLT5leHBpcmVfY291bnQgPT0gMSk7CisgIF9kYnVzX3ZlcmJvc2UgKCJuZXh0X2ludGVydmFsID0gJWRcbiIsIG5leHRfaW50ZXJ2YWwpOworICBfZGJ1c19hc3NlcnQgKG5leHRfaW50ZXJ2YWwgPT0gLTEpOworCisgIG5leHRfaW50ZXJ2YWwgPQorICAgIGRvX2V4cGlyYXRpb25fd2l0aF9tb25vdG9uaWNfdGltZSAobGlzdCwgdHZfc2VjX3Bhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dl91c2VjX3Bhc3QpOworICBfZGJ1c19hc3NlcnQgKGl0ZW0tPmV4cGlyZV9jb3VudCA9PSAxKTsKKyAgX2RidXNfdmVyYm9zZSAoIm5leHRfaW50ZXJ2YWwgPSAlZFxuIiwgbmV4dF9pbnRlcnZhbCk7CisgIF9kYnVzX2Fzc2VydCAobmV4dF9pbnRlcnZhbCA9PSAxMDAwICsgRVhQSVJFX0FGVEVSKTsKKworICBidXNfZXhwaXJlX2xpc3RfcmVtb3ZlIChsaXN0LCAmaXRlbS0+aXRlbSk7CisgIGRidXNfZnJlZSAoaXRlbSk7CisgIAorICBidXNfZXhwaXJlX2xpc3RfZnJlZSAobGlzdCk7CisgIF9kYnVzX2xvb3BfdW5yZWYgKGxvb3ApOworICAKKyAgcmVzdWx0ID0gVFJVRTsKKworIG9vbToKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworI2VuZGlmIC8qIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTICovCmRpZmYgLS1naXQgYS9idXMvZXhwaXJlbGlzdC5oIGIvYnVzL2V4cGlyZWxpc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODdjYjk3Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzL2V4cGlyZWxpc3QuaApAQCAtMCwwICsxLDgwIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGV4cGlyZWxpc3QuaCAgTGlzdCBvZiBzdHVmZiB0aGF0IGV4cGlyZXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgIFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpZm5kZWYgQlVTX0VYUElSRV9MSVNUX0gKKyNkZWZpbmUgQlVTX0VYUElSRV9MSVNUX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1saXN0Lmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLW1haW5sb29wLmg+CisKK3R5cGVkZWYgc3RydWN0IEJ1c0V4cGlyZUxpc3QgQnVzRXhwaXJlTGlzdDsKK3R5cGVkZWYgc3RydWN0IEJ1c0V4cGlyZUl0ZW0gQnVzRXhwaXJlSXRlbTsKKwordHlwZWRlZiBkYnVzX2Jvb2xfdCAoKiBCdXNFeHBpcmVGdW5jKSAoQnVzRXhwaXJlTGlzdCAqbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNMaXN0ICAgICAgKmxpbmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpkYXRhKTsKKworCisvKiBlbWJlZCB0aGlzIGluIGEgY2hpbGQgZXhwaXJlIGl0ZW0gc3RydWN0ICovCitzdHJ1Y3QgQnVzRXhwaXJlSXRlbQoreworICBsb25nIGFkZGVkX3R2X3NlYzsgIC8qKjwgVGltZSB3ZSB3ZXJlIGFkZGVkIChzZWNvbmRzIGNvbXBvbmVudCkgKi8KKyAgbG9uZyBhZGRlZF90dl91c2VjOyAvKio8IFRpbWUgd2Ugd2VyZSBhZGRlZCAobWljcm9zZWMgY29tcG9uZW50KSAqLworfTsKKworQnVzRXhwaXJlTGlzdCogYnVzX2V4cGlyZV9saXN0X25ldyAgICAgICAgICAgICAgICAgKERCdXNMb29wICAgICAgKmxvb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgZXhwaXJlX2FmdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c0V4cGlyZUZ1bmMgIGV4cGlyZV9mdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKmRhdGEpOwordm9pZCAgICAgICAgICAgYnVzX2V4cGlyZV9saXN0X2ZyZWUgICAgICAgICAgICAgICAgKEJ1c0V4cGlyZUxpc3QgKmxpc3QpOwordm9pZCAgICAgICAgICAgYnVzX2V4cGlyZV9saXN0X3JlY2hlY2tfaW1tZWRpYXRlbHkgKEJ1c0V4cGlyZUxpc3QgKmxpc3QpOwordm9pZCAgICAgICAgICAgYnVzX2V4cGlyZV9saXN0X3JlbW92ZV9saW5rICAgICAgICAgKEJ1c0V4cGlyZUxpc3QgKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICAgICAqbGluayk7CitkYnVzX2Jvb2xfdCAgICBidXNfZXhwaXJlX2xpc3RfcmVtb3ZlICAgICAgICAgICAgICAoQnVzRXhwaXJlTGlzdCAqbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNFeHBpcmVJdGVtICppdGVtKTsKK0RCdXNMaXN0KiAgICAgIGJ1c19leHBpcmVfbGlzdF9nZXRfZmlyc3RfbGluayAgICAgIChCdXNFeHBpcmVMaXN0ICpsaXN0KTsKK0RCdXNMaXN0KiAgICAgIGJ1c19leHBpcmVfbGlzdF9nZXRfbmV4dF9saW5rICAgICAgIChCdXNFeHBpcmVMaXN0ICpsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNMaXN0ICAgICAgKmxpbmspOworZGJ1c19ib29sX3QgICAgYnVzX2V4cGlyZV9saXN0X2FkZCAgICAgICAgICAgICAgICAgKEJ1c0V4cGlyZUxpc3QgKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzRXhwaXJlSXRlbSAqaXRlbSk7Cit2b2lkICAgICAgICAgICBidXNfZXhwaXJlX2xpc3RfYWRkX2xpbmsgICAgICAgICAgICAoQnVzRXhwaXJlTGlzdCAqbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAgICAgICpsaW5rKTsKK2RidXNfYm9vbF90ICAgIGJ1c19leHBpcmVfbGlzdF9jb250YWluc19pdGVtICAgICAgIChCdXNFeHBpcmVMaXN0ICpsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c0V4cGlyZUl0ZW0gKml0ZW0pOwordm9pZCAgICAgICAgICAgYnVzX2V4cGlyZV9saXN0X3VubGluayAgICAgICAgICAgICAgKEJ1c0V4cGlyZUxpc3QgKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICAgICAqbGluayk7CisKKy8qIHRoaXMgbWFjcm8gYW5kIGZ1bmN0aW9uIGFyZSBzZW1pLXJlbGF0ZWQgdXRpbGl0eSBmdW5jdGlvbnMsIG5vdCByZWFsbHkgcGFydCBvZiB0aGUKKyAqIEJ1c0V4cGlyZUxpc3QgQVBJCisgKi8KKworI2RlZmluZSBFTEFQU0VEX01JTExJU0VDT05EU19TSU5DRShvcmlnX3R2X3NlYywgb3JpZ190dl91c2VjLCAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm93X3R2X3NlYywgbm93X3R2X3VzZWMpICAgICBcCisgKCgoZG91YmxlKSAobm93X3R2X3NlYykgLSAoZG91YmxlKSAob3JpZ190dl9zZWMpKSAqIDEwMDAuMCArICAgXAorICgoZG91YmxlKSAobm93X3R2X3VzZWMpIC0gKGRvdWJsZSkgKG9yaWdfdHZfdXNlYykpIC8gMTAwMC4wKQorCit2b2lkIGJ1c19leHBpcmVfdGltZW91dF9zZXRfaW50ZXJ2YWwgKERCdXNUaW1lb3V0ICAgKnRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgIG5leHRfaW50ZXJ2YWwpOworCisjZW5kaWYgLyogQlVTX0VYUElSRV9MSVNUX0ggKi8KZGlmZiAtLWdpdCBhL2J1cy9sZWdhY3ktY29uZmlnL3Nlc3Npb24uY29uZi5pbiBiL2J1cy9sZWdhY3ktY29uZmlnL3Nlc3Npb24uY29uZi5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzUwMjRlCi0tLSAvZGV2L251bGwKKysrIGIvYnVzL2xlZ2FjeS1jb25maWcvc2Vzc2lvbi5jb25mLmluCkBAIC0wLDAgKzEsMTkgQEAKKzwhLS0KK1RoaXMgY29uZmlndXJhdGlvbiBmaWxlIGlzIG5vIGxvbmdlciByZXF1aXJlZCBhbmQgbWF5IGJlIHJlbW92ZWQuCisKK0luIG9sZGVyIHZlcnNpb25zIG9mIGRidXMsIHRoaXMgZmlsZSBkZWZpbmVkIHRoZSBiZWhhdmlvdXIgb2YgdGhlIHdlbGwta25vd24KK3Nlc3Npb24gYnVzLiBUaGF0IGJlaGF2aW91ciBpcyBub3cgZGV0ZXJtaW5lZCBieQorQERBVEFESVJfRlJPTV9QS0dTWVNDT05GRElSQC9kYnVzLTEvc2Vzc2lvbi5jb25mLCB3aGljaCBzaG91bGQgbm90IGJlIGVkaXRlZC4KKworRm9yIGxvY2FsIGNvbmZpZ3VyYXRpb24gY2hhbmdlcywgY3JlYXRlIGEgZmlsZQorc2Vzc2lvbi1sb2NhbC5jb25mIG9yIGZpbGVzIG1hdGNoaW5nIHNlc3Npb24uZC8qLmNvbmYgaW4gdGhlIHNhbWUgZGlyZWN0b3J5CithcyB0aGlzIG9uZSwgd2l0aCBhIDxidXNjb25maWc+IGVsZW1lbnQgY29udGFpbmluZyBjb25maWd1cmF0aW9uIGRpcmVjdGl2ZXMuCitUaGVzZSBkaXJlY3RpdmVzIGNhbiBvdmVycmlkZSBELUJ1cyBvciBPUyBkZWZhdWx0cy4KKworRm9yIHVwc3RyZWFtIG9yIGRpc3RyaWJ1dGlvbi13aWRlIGRlZmF1bHRzIHRoYXQgY2FuIGJlIG92ZXJyaWRkZW4KK2J5IGEgbG9jYWwgc3lzYWRtaW4sIGNyZWF0ZSBmaWxlcyBtYXRjaGluZworQERBVEFESVJfRlJPTV9QS0dTWVNDT05GRElSQC9kYnVzLTEvc2Vzc2lvbi5kLyouY29uZiBpbnN0ZWFkLgorLS0+Cis8IURPQ1RZUEUgYnVzY29uZmlnIFBVQkxJQyAiLS8vZnJlZWRlc2t0b3AvL0RURCBELUJ1cyBCdXMgQ29uZmlndXJhdGlvbiAxLjAvL0VOIgorICJodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zdGFuZGFyZHMvZGJ1cy8xLjAvYnVzY29uZmlnLmR0ZCI+Cis8YnVzY29uZmlnPjwvYnVzY29uZmlnPgpkaWZmIC0tZ2l0IGEvYnVzL2xlZ2FjeS1jb25maWcvc3lzdGVtLmNvbmYuaW4gYi9idXMvbGVnYWN5LWNvbmZpZy9zeXN0ZW0uY29uZi5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2FiYTA4Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzL2xlZ2FjeS1jb25maWcvc3lzdGVtLmNvbmYuaW4KQEAgLTAsMCArMSwxOSBAQAorPCEtLQorVGhpcyBjb25maWd1cmF0aW9uIGZpbGUgaXMgbm8gbG9uZ2VyIHJlcXVpcmVkIGFuZCBtYXkgYmUgcmVtb3ZlZC4KKworSW4gb2xkZXIgdmVyc2lvbnMgb2YgZGJ1cywgdGhpcyBmaWxlIGRlZmluZWQgdGhlIGJlaGF2aW91ciBvZiB0aGUgd2VsbC1rbm93bgorc3lzdGVtIGJ1cy4gVGhhdCBiZWhhdmlvdXIgaXMgbm93IGRldGVybWluZWQgYnkKK0BEQVRBRElSX0ZST01fUEtHU1lTQ09ORkRJUkAvZGJ1cy0xL3N5c3RlbS5jb25mLCB3aGljaCBzaG91bGQgbm90IGJlIGVkaXRlZC4KKworRm9yIGxvY2FsIGNvbmZpZ3VyYXRpb24gY2hhbmdlcywgY3JlYXRlIGEgZmlsZQorc3lzdGVtLWxvY2FsLmNvbmYgb3IgZmlsZXMgbWF0Y2hpbmcgc3lzdGVtLmQvKi5jb25mIGluIHRoZSBzYW1lIGRpcmVjdG9yeQorYXMgdGhpcyBvbmUsIHdpdGggYSA8YnVzY29uZmlnPiBlbGVtZW50IGNvbnRhaW5pbmcgY29uZmlndXJhdGlvbiBkaXJlY3RpdmVzLgorVGhlc2UgZGlyZWN0aXZlcyBjYW4gb3ZlcnJpZGUgRC1CdXMgb3IgT1MgZGVmYXVsdHMuCisKK0ZvciB1cHN0cmVhbSBvciBkaXN0cmlidXRpb24td2lkZSBkZWZhdWx0cyB0aGF0IGNhbiBiZSBvdmVycmlkZGVuCitieSBhIGxvY2FsIHN5c2FkbWluLCBjcmVhdGUgZmlsZXMgbWF0Y2hpbmcKK0BEQVRBRElSX0ZST01fUEtHU1lTQ09ORkRJUkAvZGJ1cy0xL3N5c3RlbS5kLyouY29uZiBpbnN0ZWFkLgorLS0+Cis8IURPQ1RZUEUgYnVzY29uZmlnIFBVQkxJQyAiLS8vZnJlZWRlc2t0b3AvL0RURCBELUJ1cyBCdXMgQ29uZmlndXJhdGlvbiAxLjAvL0VOIgorICJodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zdGFuZGFyZHMvZGJ1cy8xLjAvYnVzY29uZmlnLmR0ZCI+Cis8YnVzY29uZmlnPjwvYnVzY29uZmlnPgpkaWZmIC0tZ2l0IGEvYnVzL21haW4uYyBiL2J1cy9tYWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVlM2Y3NQotLS0gL2Rldi9udWxsCisrKyBiL2J1cy9tYWluLmMKQEAgLTAsMCArMSw3MjkgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogbWFpbi5jICBtYWluKCkgZm9yIG1lc3NhZ2UgYnVzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzIFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJidXMuaCIKKyNpbmNsdWRlICJkcml2ZXIuaCIKKyNpbmNsdWRlIDxkYnVzL2RidXMtaW50ZXJuYWxzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXdhdGNoLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpZmRlZiBIQVZFX1NJR05BTF9ICisjaW5jbHVkZSA8c2lnbmFsLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX0VSUk5PX0gKKyNpbmNsdWRlIDxlcnJuby5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPiAgICAgLyogZm9yIHdyaXRlKCkgYW5kIFNUREVSUl9GSUxFTk8gKi8KKyNlbmRpZgorI2luY2x1ZGUgInNlbGludXguaCIKKyNpbmNsdWRlICJhcHBhcm1vci5oIgorI2luY2x1ZGUgImF1ZGl0LmgiCisKKyNpZmRlZiBEQlVTX1VOSVgKKyNpbmNsdWRlIDxkYnVzL2RidXMtc3lzZGVwcy11bml4Lmg+CisjZW5kaWYKKworc3RhdGljIEJ1c0NvbnRleHQgKmNvbnRleHQ7CisKKyNpZmRlZiBEQlVTX1VOSVgKKworLyogRGVzcGl0ZSBpdHMgbmFtZSBhbmQgaXRzIHVuaWRpcmVjdGlvbmFsIG5hdHVyZSwgdGhpcyBpcyBhY3R1YWxseQorICogYSBzb2NrZXQgcGFpci4gKi8KK3N0YXRpYyBEQnVzU29ja2V0IHJlbG9hZF9waXBlWzJdOworI2RlZmluZSBSRUxPQURfUkVBRF9FTkQgMAorI2RlZmluZSBSRUxPQURfV1JJVEVfRU5EIDEKKworc3RhdGljIHZvaWQgY2xvc2VfcmVsb2FkX3BpcGUgKERCdXNXYXRjaCAqKik7CisKK3R5cGVkZWYgZW51bQorIHsKKyAgIEFDVElPTl9SRUxPQUQgPSAncicsCisgICBBQ1RJT05fUVVJVCA9ICdxJworIH0gU2lnbmFsQWN0aW9uOworCitzdGF0aWMgdm9pZAorc2lnbmFsX2hhbmRsZXIgKGludCBzaWcpCit7CisgIC8qIFNpZ25hbCBoYW5kbGVycyB0aGF0IG1pZ2h0IHNldCBlcnJubyBtdXN0IHNhdmUgYW5kIHJlc3RvcmUgdGhlIGVycm5vCisgICAqIHRoYXQgdGhlIGludGVycnVwdGVkIGZ1bmN0aW9uIG1pZ2h0IGhhdmUgYmVlbiByZWx5aW5nIG9uLiAqLworICBpbnQgc2F2ZWRfZXJybm8gPSBlcnJubzsKKworICBzd2l0Y2ggKHNpZykKKyAgICB7CisgICAgY2FzZSBTSUdIVVA6CisgICAgICB7CisgICAgICAgIERCdXNTdHJpbmcgc3RyOworICAgICAgICBjaGFyIGFjdGlvblsyXSA9IHsgQUNUSU9OX1JFTE9BRCwgJ1wwJyB9OworCisgICAgICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmc3RyLCBhY3Rpb24pOworICAgICAgICBpZiAoKHJlbG9hZF9waXBlW1JFTE9BRF9XUklURV9FTkRdLmZkID4gMCkgJiYKKyAgICAgICAgICAgICFfZGJ1c193cml0ZV9zb2NrZXQgKHJlbG9hZF9waXBlW1JFTE9BRF9XUklURV9FTkRdLCAmc3RyLCAwLCAxKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBJZiB3ZSByZWNlaXZlIFNJR0hVUCBvZnRlbiBlbm91Z2ggdG8gZmlsbCB0aGUgcGlwZSBidWZmZXIgKDQwOTYKKyAgICAgICAgICAgICAqIHRpbWVzIG9uIG9sZCBMaW51eCwgNjU1MzYgb24gbW9kZXJuIExpbnV4KSBiZWZvcmUgaXQgY2FuIGJlCisgICAgICAgICAgICAgKiBkcmFpbmVkLCBsZXQncyBqdXN0IHdhcm4gYW5kIGlnbm9yZS4gVGhlIGNvbmZpZ3VyYXRpb24gd2lsbCBiZQorICAgICAgICAgICAgICogcmVsb2FkZWQgd2hpbGUgZHJhaW5pbmcgdGhlIHBpcGUgYnVmZmVyLCB3aGljaCBpcyB3aGF0IHdlCisgICAgICAgICAgICAgKiB3YW50ZWQuIEl0J3MgaGFybWxlc3MgdGhhdCBpdCB3aWxsIGJlIHJlbG9hZGVkIGZld2VyIHRpbWVzIHRoYW4KKyAgICAgICAgICAgICAqIHdlIGFza2VkIGZvciwgc2luY2UgdGhlIHJlbG9hZCBpcyBkZWxheWVkIGFueXdheSwgc28gbmV3IGNoYW5nZXMKKyAgICAgICAgICAgICAqIHdpbGwgYmUgcGlja2VkIHVwLgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIFdlIHVzZSB3cml0ZSgpIGJlY2F1c2UgX2RidXNfd2FybiB1c2VzIHZmcHJpbnRmLCB3aGljaCBpc24ndAorICAgICAgICAgICAgICogYXN5bmMtc2lnbmFsLXNhZmUuCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogVGhpcyBpcyBuZWNlc3NhcmlseSBVbml4LXNwZWNpZmljLCBidXQgc28gYXJlIFBPU0lYIHNpZ25hbHMsCisgICAgICAgICAgICAgKiBzby4uLiAqLworICAgICAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgbWVzc2FnZVtdID0KKyAgICAgICAgICAgICAgIlVuYWJsZSB0byB3cml0ZSB0byByZWxvYWQgcGlwZSAtIGJ1ZmZlciBmdWxsP1xuIjsKKworICAgICAgICAgICAgaWYgKHdyaXRlIChTVERFUlJfRklMRU5PLCBtZXNzYWdlLCBzdHJsZW4gKG1lc3NhZ2UpKSAhPQorICAgICAgICAgICAgICAgIChzc2l6ZV90KSBzdHJsZW4gKG1lc3NhZ2UpKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogaWdub3JlIGZhaWx1cmUgdG8gd3JpdGUgb3V0IGEgd2FybmluZyAqLworICAgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFNJR1RFUk06CisgICAgICB7CisgICAgICAgIERCdXNTdHJpbmcgc3RyOworICAgICAgICBjaGFyIGFjdGlvblsyXSA9IHsgQUNUSU9OX1FVSVQsICdcMCcgfTsKKyAgICAgICAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZzdHIsIGFjdGlvbik7CisgICAgICAgIGlmICgocmVsb2FkX3BpcGVbUkVMT0FEX1dSSVRFX0VORF0uZmQgPCAwKSB8fAorICAgICAgICAgICAgIV9kYnVzX3dyaXRlX3NvY2tldCAocmVsb2FkX3BpcGVbUkVMT0FEX1dSSVRFX0VORF0sICZzdHIsIDAsIDEpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIElmIHdlIGNhbid0IHdyaXRlIHRvIHRoZSBzb2NrZXQsIGR5aW5nIHNlZW1zIGEgbW9yZQorICAgICAgICAgICAgICogaW1wb3J0YW50IHJlc3BvbnNlIHRvIFNJR1RFUk0gdGhhbiBjbGVhbmluZyB1cCBzb2NrZXRzLAorICAgICAgICAgICAgICogc28gd2UgZXhpdC4gV2UnZCB1c2UgZXhpdCgpLCBidXQgdGhhdCdzIG5vdCBhc3luYy1zaWduYWwtc2FmZSwKKyAgICAgICAgICAgICAqIHNvIHdlJ2xsIGhhdmUgdG8gcmVzb3J0IHRvIF9leGl0KCkuICovCisgICAgICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBtZXNzYWdlW10gPQorICAgICAgICAgICAgICAiVW5hYmxlIHRvIHdyaXRlIHRlcm1pbmF0aW9uIHNpZ25hbCB0byBwaXBlIC0gYnVmZmVyIGZ1bGw/XG4iCisgICAgICAgICAgICAgICJXaWxsIGV4aXQgaW5zdGVhZC5cbiI7CisKKyAgICAgICAgICAgIGlmICh3cml0ZSAoU1RERVJSX0ZJTEVOTywgbWVzc2FnZSwgc3RybGVuIChtZXNzYWdlKSkgIT0KKyAgICAgICAgICAgICAgICAoc3NpemVfdCkgc3RybGVuIChtZXNzYWdlKSkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIGlnbm9yZSBmYWlsdXJlIHRvIHdyaXRlIG91dCBhIHdhcm5pbmcgKi8KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgX2V4aXQgKDEpOworICAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIC8qIGNhbid0IGhhcHBlbiB1bmxlc3MgdGhpcyBzaWduYWwgaGFuZGxlciBnZXRzIHVzZWQgZm9yIGEgd3JvbmcKKyAgICAgICAqIHNpZ25hbCwgYnV0IGtlZXAgLVdzd2l0Y2gtZGVmYXVsdCBoYXBweSAqLworICAgICAgYnJlYWs7CisgICAgfQorCisgIGVycm5vID0gc2F2ZWRfZXJybm87Cit9CisjZW5kaWYgLyogREJVU19VTklYICovCisKK3N0YXRpYyB2b2lkIHVzYWdlICh2b2lkKSBfREJVU19HTlVDX05PUkVUVVJOOworCitzdGF0aWMgdm9pZAordXNhZ2UgKHZvaWQpCit7CisgIGZwcmludGYgKHN0ZGVyciwKKyAgICAgIERCVVNfREFFTU9OX05BTUUKKyAgICAgICIgWy0tdmVyc2lvbl0iCisgICAgICAiIFstLXNlc3Npb25dIgorICAgICAgIiBbLS1zeXN0ZW1dIgorICAgICAgIiBbLS1jb25maWctZmlsZT1GSUxFXSIKKyAgICAgICIgWy0tcHJpbnQtYWRkcmVzc1s9REVTQ1JJUFRPUl1dIgorICAgICAgIiBbLS1wcmludC1waWRbPURFU0NSSVBUT1JdXSIKKyAgICAgICIgWy0taW50cm9zcGVjdF0iCisgICAgICAiIFstLWFkZHJlc3M9QUREUkVTU10iCisgICAgICAiIFstLW5vcGlkZmlsZV0iCisgICAgICAiIFstLW5vc3lzbG9nXSIKKyAgICAgICIgWy0tc3lzbG9nXSIKKyAgICAgICIgWy0tc3lzbG9nLW9ubHldIgorICAgICAgIiBbLS1ub2ZvcmtdIgorI2lmZGVmIERCVVNfVU5JWAorICAgICAgIiBbLS1mb3JrXSIKKyAgICAgICIgWy0tc3lzdGVtZC1hY3RpdmF0aW9uXSIKKyNlbmRpZgorICAgICAgIlxuIik7CisgIGV4aXQgKDEpOworfQorCitzdGF0aWMgdm9pZCB2ZXJzaW9uICh2b2lkKSBfREJVU19HTlVDX05PUkVUVVJOOworCitzdGF0aWMgdm9pZAordmVyc2lvbiAodm9pZCkKK3sKKyAgcHJpbnRmICgiRC1CdXMgTWVzc2FnZSBCdXMgRGFlbW9uICVzXG4iCisgICAgICAgICAgIkNvcHlyaWdodCAoQykgMjAwMiwgMjAwMyBSZWQgSGF0LCBJbmMuLCBDb2RlRmFjdG9yeSBBQiwgYW5kIG90aGVyc1xuIgorICAgICAgICAgICJUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHNlZSB0aGUgc291cmNlIGZvciBjb3B5aW5nIGNvbmRpdGlvbnMuXG4iCisgICAgICAgICAgIlRoZXJlIGlzIE5PIHdhcnJhbnR5OyBub3QgZXZlbiBmb3IgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLlxuIiwKKyAgICAgICAgICBEQlVTX1ZFUlNJT05fU1RSSU5HKTsKKyAgZXhpdCAoMCk7Cit9CisKK3N0YXRpYyB2b2lkIGludHJvc3BlY3QgKHZvaWQpIF9EQlVTX0dOVUNfTk9SRVRVUk47CisKK3N0YXRpYyB2b2lkCitpbnRyb3NwZWN0ICh2b2lkKQoreworICBEQnVzU3RyaW5nIHhtbDsKKyAgY29uc3QgY2hhciAqdl9TVFJJTkc7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnhtbCkpCisgICAgZ290byBvb207CisKKyAgaWYgKCFidXNfZHJpdmVyX2dlbmVyYXRlX2ludHJvc3BlY3Rfc3RyaW5nICgmeG1sLCBUUlVFLCBOVUxMKSkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnhtbCk7CisgICAgICBnb3RvIG9vbTsKKyAgICB9CisKKyAgdl9TVFJJTkcgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZ4bWwpOworICBwcmludGYgKCIlc1xuIiwgdl9TVFJJTkcpOworCisgIGV4aXQgKDApOworCisgb29tOgorICBfZGJ1c193YXJuICgiQ2FuIG5vdCBpbnRyb3NwZWN0IC0gT3V0IG9mIG1lbW9yeSIpOworICBleGl0ICgxKTsKK30KKworc3RhdGljIHZvaWQKK2NoZWNrX3R3b19jb25maWdfZmlsZXMgKGNvbnN0IERCdXNTdHJpbmcgKmNvbmZpZ19maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqZXh0cmFfYXJnKQoreworICBpZiAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGNvbmZpZ19maWxlKSA+IDApCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiLS0lcyBzcGVjaWZpZWQgYnV0IGNvbmZpZ3VyYXRpb24gZmlsZSAlcyBhbHJlYWR5IHJlcXVlc3RlZFxuIiwKKyAgICAgICAgICAgICAgIGV4dHJhX2FyZywgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChjb25maWdfZmlsZSkpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorY2hlY2tfdHdvX2FkZHJlc3NlcyAoY29uc3QgREJ1c1N0cmluZyAqYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKmV4dHJhX2FyZykKK3sKKyAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChhZGRyZXNzKSA+IDApCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiLS0lcyBzcGVjaWZpZWQgYnV0IGFkZHJlc3MgJXMgYWxyZWFkeSByZXF1ZXN0ZWRcbiIsCisgICAgICAgICAgICAgICBleHRyYV9hcmcsIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoYWRkcmVzcykpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorY2hlY2tfdHdvX2FkZHJfZGVzY3JpcHRvcnMgKGNvbnN0IERCdXNTdHJpbmcgKmFkZHJfZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqZXh0cmFfYXJnKQoreworICBpZiAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGFkZHJfZmQpID4gMCkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICItLSVzIHNwZWNpZmllZCBidXQgcHJpbnRpbmcgYWRkcmVzcyB0byAlcyBhbHJlYWR5IHJlcXVlc3RlZFxuIiwKKyAgICAgICAgICAgICAgIGV4dHJhX2FyZywgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChhZGRyX2ZkKSk7CisgICAgICBleGl0ICgxKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitjaGVja190d29fcGlkX2Rlc2NyaXB0b3JzIChjb25zdCBEQnVzU3RyaW5nICpwaWRfZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICpleHRyYV9hcmcpCit7CisgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAocGlkX2ZkKSA+IDApCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiLS0lcyBzcGVjaWZpZWQgYnV0IHByaW50aW5nIHBpZCB0byAlcyBhbHJlYWR5IHJlcXVlc3RlZFxuIiwKKyAgICAgICAgICAgICAgIGV4dHJhX2FyZywgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChwaWRfZmQpKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KK30KKworI2lmZGVmIERCVVNfVU5JWAorc3RhdGljIGRidXNfYm9vbF90CitoYW5kbGVfcmVsb2FkX3dhdGNoIChEQnVzV2F0Y2ggICAgKndhdGNoLAorCQkgICAgIHVuc2lnbmVkIGludCAgZmxhZ3MsCisJCSAgICAgdm9pZCAgICAgICAgICpkYXRhKQoreworICBEQnVzRXJyb3IgZXJyb3I7CisgIERCdXNTdHJpbmcgc3RyOworICBjaGFyICphY3Rpb25fc3RyOworICBjaGFyIGFjdGlvbiA9ICdcMCc7CisKKyAgd2hpbGUgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnN0cikpCisgICAgX2RidXNfd2FpdF9mb3JfbWVtb3J5ICgpOworCisgIGlmICgocmVsb2FkX3BpcGVbUkVMT0FEX1JFQURfRU5EXS5mZCA+IDApICYmCisgICAgICBfZGJ1c19yZWFkX3NvY2tldCAocmVsb2FkX3BpcGVbUkVMT0FEX1JFQURfRU5EXSwgJnN0ciwgMSkgIT0gMSkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiQ291bGRuJ3QgcmVhZCBmcm9tIHJlbG9hZCBwaXBlLiIpOworICAgICAgY2xvc2VfcmVsb2FkX3BpcGUgKCZ3YXRjaCk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgYWN0aW9uX3N0ciA9IF9kYnVzX3N0cmluZ19nZXRfZGF0YSAoJnN0cik7CisgIGlmIChhY3Rpb25fc3RyICE9IE5VTEwpCisgICAgeworICAgICAgYWN0aW9uID0gYWN0aW9uX3N0clswXTsKKyAgICB9CisgIF9kYnVzX3N0cmluZ19mcmVlICgmc3RyKTsKKworICAvKiB0aGlzIGNhbiBvbmx5IGZhaWwgaWYgd2UgZG9uJ3QgdW5kZXJzdGFuZCB0aGUgY29uZmlnIGZpbGUKKyAgICogb3IgT09NLiAgRWl0aGVyIHdheSB3ZSBzaG91bGQganVzdCBzdGljayB3aXRoIHRoZSBjdXJyZW50bHkKKyAgICogbG9hZGVkIGNvbmZpZy4KKyAgICovCisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKworICBzd2l0Y2ggKGFjdGlvbikKKyAgICB7CisgICAgY2FzZSBBQ1RJT05fUkVMT0FEOgorICAgICAgaWYgKCEgYnVzX2NvbnRleHRfcmVsb2FkX2NvbmZpZyAoY29udGV4dCwgJmVycm9yKSkKKyAgICAgICAgeworICAgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKCZlcnJvcik7CisgICAgICAgICAgX2RidXNfYXNzZXJ0IChkYnVzX2Vycm9yX2hhc19uYW1lICgmZXJyb3IsIERCVVNfRVJST1JfRkFJTEVEKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19lcnJvcl9oYXNfbmFtZSAoJmVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSkpOworICAgICAgICAgIF9kYnVzX3dhcm4gKCJVbmFibGUgdG8gcmVsb2FkIGNvbmZpZ3VyYXRpb246ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBlcnJvci5tZXNzYWdlKTsKKyAgICAgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBBQ1RJT05fUVVJVDoKKyAgICAgIHsKKyAgICAgICAgREJ1c0xvb3AgKmxvb3A7CisgICAgICAgIC8qCisgICAgICAgICAqIE9uIE9TcyB3aXRob3V0IGFic3RyYWN0IHNvY2tldHMsIHdlIHdhbnQgdG8gcXVpdAorICAgICAgICAgKiBncmFjZWZ1bGx5IHJhdGhlciB0aGFuIGJlaW5nIGtpbGxlZCBieSBTSUdURVJNLAorICAgICAgICAgKiBzbyB0aGF0IERCdXNTZXJ2ZXIgZ2V0cyBhIGNoYW5jZSB0byBjbGVhbiB1cCB0aGUKKyAgICAgICAgICogc29ja2V0cyBmcm9tIHRoZSBmaWxlc3lzdGVtLiBmZC5vICMzODY1NgorICAgICAgICAgKi8KKyAgICAgICAgbG9vcCA9IGJ1c19jb250ZXh0X2dldF9sb29wIChjb250ZXh0KTsKKyAgICAgICAgaWYgKGxvb3AgIT0gTlVMTCkKKyAgICAgICAgICB7CisgICAgICAgICAgICBfZGJ1c19sb29wX3F1aXQgKGxvb3ApOworICAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK3NldHVwX3JlbG9hZF9waXBlIChEQnVzTG9vcCAqbG9vcCkKK3sKKyAgREJ1c0Vycm9yIGVycm9yOworICBEQnVzV2F0Y2ggKndhdGNoOworCisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKworICBpZiAoIV9kYnVzX3NvY2tldHBhaXIgKCZyZWxvYWRfcGlwZVswXSwgJnJlbG9hZF9waXBlWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUsICZlcnJvcikpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIlVuYWJsZSB0byBjcmVhdGUgcmVsb2FkIHBpcGU6ICVzIiwKKwkJICBlcnJvci5tZXNzYWdlKTsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICB3YXRjaCA9IF9kYnVzX3dhdGNoX25ldyAoX2RidXNfc29ja2V0X2dldF9wb2xsYWJsZSAocmVsb2FkX3BpcGVbUkVMT0FEX1JFQURfRU5EXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1dBVENIX1JFQURBQkxFLCBUUlVFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlX3JlbG9hZF93YXRjaCwgTlVMTCwgTlVMTCk7CisKKyAgaWYgKHdhdGNoID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIlVuYWJsZSB0byBjcmVhdGUgcmVsb2FkIHdhdGNoOiAlcyIsCisJCSAgZXJyb3IubWVzc2FnZSk7CisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19sb29wX2FkZF93YXRjaCAobG9vcCwgd2F0Y2gpKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJVbmFibGUgdG8gYWRkIHJlbG9hZCB3YXRjaCB0byBtYWluIGxvb3A6ICVzIiwKKwkJICBlcnJvci5tZXNzYWdlKTsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworfQorCitzdGF0aWMgdm9pZAorY2xvc2VfcmVsb2FkX3BpcGUgKERCdXNXYXRjaCAqKndhdGNoKQoreworICAgIF9kYnVzX2xvb3BfcmVtb3ZlX3dhdGNoIChidXNfY29udGV4dF9nZXRfbG9vcCAoY29udGV4dCksICp3YXRjaCk7CisgICAgX2RidXNfd2F0Y2hfaW52YWxpZGF0ZSAoKndhdGNoKTsKKyAgICBfZGJ1c193YXRjaF91bnJlZiAoKndhdGNoKTsKKyAgICAqd2F0Y2ggPSBOVUxMOworCisgICAgX2RidXNfY2xvc2Vfc29ja2V0IChyZWxvYWRfcGlwZVtSRUxPQURfUkVBRF9FTkRdLCBOVUxMKTsKKyAgICBfZGJ1c19zb2NrZXRfaW52YWxpZGF0ZSAoJnJlbG9hZF9waXBlW1JFTE9BRF9SRUFEX0VORF0pOworCisgICAgX2RidXNfY2xvc2Vfc29ja2V0IChyZWxvYWRfcGlwZVtSRUxPQURfV1JJVEVfRU5EXSwgTlVMTCk7CisgICAgX2RidXNfc29ja2V0X2ludmFsaWRhdGUgKCZyZWxvYWRfcGlwZVtSRUxPQURfV1JJVEVfRU5EXSk7Cit9CisjZW5kaWYgLyogREJVU19VTklYICovCisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICBEQnVzRXJyb3IgZXJyb3I7CisgIERCdXNTdHJpbmcgY29uZmlnX2ZpbGU7CisgIERCdXNTdHJpbmcgYWRkcmVzczsKKyAgREJ1c1N0cmluZyBhZGRyX2ZkOworICBEQnVzU3RyaW5nIHBpZF9mZDsKKyAgY29uc3QgY2hhciAqcHJldl9hcmc7CisgIERCdXNQaXBlIHByaW50X2FkZHJfcGlwZTsKKyAgREJ1c1BpcGUgcHJpbnRfcGlkX3BpcGU7CisgIGludCBpOworICBkYnVzX2Jvb2xfdCBwcmludF9hZGRyZXNzOworICBkYnVzX2Jvb2xfdCBwcmludF9waWQ7CisgIEJ1c0NvbnRleHRGbGFncyBmbGFnczsKKyNpZmRlZiBEQlVTX1VOSVgKKyAgY29uc3QgY2hhciAqZXJyb3Jfc3RyOworCisgIC8qIFJlZGlyZWN0IHN0ZGluIGZyb20gL2Rldi9udWxsIHNpbmNlIHdlIHdpbGwgbmV2ZXIgbmVlZCBpdCwgYW5kCisgICAqIHJlZGlyZWN0IHN0ZG91dCBhbmQgc3RkZXJyIHRvIC9kZXYvbnVsbCBpZiBub3QgYWxyZWFkeSBvcGVuLgorICAgKgorICAgKiBXZSBzaG91bGQgZG8gdGhpcyBhcyB0aGUgdmVyeSBmaXJzdCB0aGluZywgdG8gZW5zdXJlIHRoYXQgd2hlbiB3ZQorICAgKiBjcmVhdGUgb3RoZXIgZmlsZSBkZXNjcmlwdG9ycyAoZm9yIGV4YW1wbGUgZm9yIGVwb2xsLCBpbm90aWZ5IG9yCisgICAqIGEgc29ja2V0KSwgdGhleSBuZXZlciBnZXQgYXNzaWduZWQgYXMgZmQgMCwgMSBvciAyLiBJZiB0aGV5IHdlcmUsCisgICAqIHdoaWNoIGNvdWxkIGhhcHBlbiBpZiBvdXIgY2FsbGVyIGhhZCAoaW5jb3JyZWN0bHkpIGNsb3NlZCB0aG9zZQorICAgKiBzdGFuZGFyZCBmZHMsIHRoZXknZCBnZXQgY2xvc2VkIHdoZW4gd2UgZGFlbW9uaXplIC0gZm9yIGV4YW1wbGUsCisgICAqIGNsb3Npbmcgb3VyIGxpc3RlbmluZyBzb2NrZXQgd291bGQgc3RvcCB1cyBsaXN0ZW5pbmcsIGFuZCBjbG9zaW5nCisgICAqIGEgTGludXggZXBvbGwgc29ja2V0IHdvdWxkIGNhdXNlIHRoZSBtYWluIGxvb3AgdG8gZmFpbC4gKi8KKyAgaWYgKCFfZGJ1c19lbnN1cmVfc3RhbmRhcmRfZmRzIChEQlVTX0ZPUkNFX1NURElOX05VTEwsICZlcnJvcl9zdHIpKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwKKyAgICAgICAgICAgICAgICJkYnVzLWRhZW1vbjogZmF0YWwgZXJyb3Igc2V0dGluZyB1cCBzdGFuZGFyZCBmZHM6ICVzOiAlc1xuIiwKKyAgICAgICAgICAgICAgIGVycm9yX3N0ciwgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisjZW5kaWYKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmY29uZmlnX2ZpbGUpKQorICAgIHJldHVybiAxOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZhZGRyZXNzKSkKKyAgICByZXR1cm4gMTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmYWRkcl9mZCkpCisgICAgcmV0dXJuIDE7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnBpZF9mZCkpCisgICAgcmV0dXJuIDE7CisKKyAgcHJpbnRfYWRkcmVzcyA9IEZBTFNFOworICBwcmludF9waWQgPSBGQUxTRTsKKworICBmbGFncyA9IEJVU19DT05URVhUX0ZMQUdfV1JJVEVfUElEX0ZJTEU7CisKKyAgcHJldl9hcmcgPSBOVUxMOworICBpID0gMTsKKyAgd2hpbGUgKGkgPCBhcmdjKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKmFyZyA9IGFyZ3ZbaV07CisKKyAgICAgIGlmIChzdHJjbXAgKGFyZywgIi0taGVscCIpID09IDAgfHwKKyAgICAgICAgICBzdHJjbXAgKGFyZywgIi1oIikgPT0gMCB8fAorICAgICAgICAgIHN0cmNtcCAoYXJnLCAiLT8iKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgdXNhZ2UgKCk7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAiLS12ZXJzaW9uIikgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIHZlcnNpb24gKCk7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAiLS1pbnRyb3NwZWN0IikgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIGludHJvc3BlY3QgKCk7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAiLS1ub3N5c2xvZyIpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICBmbGFncyAmPSB+QlVTX0NPTlRFWFRfRkxBR19TWVNMT0dfQUxXQVlTOworICAgICAgICAgIGZsYWdzIHw9IEJVU19DT05URVhUX0ZMQUdfU1lTTE9HX05FVkVSOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgIi0tc3lzbG9nIikgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIGZsYWdzICY9IH5CVVNfQ09OVEVYVF9GTEFHX1NZU0xPR19ORVZFUjsKKyAgICAgICAgICBmbGFncyB8PSBCVVNfQ09OVEVYVF9GTEFHX1NZU0xPR19BTFdBWVM7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAiLS1zeXNsb2ctb25seSIpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICBmbGFncyAmPSB+QlVTX0NPTlRFWFRfRkxBR19TWVNMT0dfTkVWRVI7CisgICAgICAgICAgZmxhZ3MgfD0gKEJVU19DT05URVhUX0ZMQUdfU1lTTE9HX0FMV0FZU3xCVVNfQ09OVEVYVF9GTEFHX1NZU0xPR19PTkxZKTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICItLW5vZm9yayIpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICBmbGFncyAmPSB+QlVTX0NPTlRFWFRfRkxBR19GT1JLX0FMV0FZUzsKKyAgICAgICAgICBmbGFncyB8PSBCVVNfQ09OVEVYVF9GTEFHX0ZPUktfTkVWRVI7CisgICAgICAgIH0KKyNpZmRlZiBEQlVTX1VOSVgKKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAiLS1mb3JrIikgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIGZsYWdzICY9IH5CVVNfQ09OVEVYVF9GTEFHX0ZPUktfTkVWRVI7CisgICAgICAgICAgZmxhZ3MgfD0gQlVTX0NPTlRFWFRfRkxBR19GT1JLX0FMV0FZUzsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICItLXN5c3RlbWQtYWN0aXZhdGlvbiIpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICBmbGFncyB8PSBCVVNfQ09OVEVYVF9GTEFHX1NZU1RFTURfQUNUSVZBVElPTjsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgIi0tbm9waWRmaWxlIikgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIGZsYWdzICY9IH5CVVNfQ09OVEVYVF9GTEFHX1dSSVRFX1BJRF9GSUxFOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgIi0tc3lzdGVtIikgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIGNoZWNrX3R3b19jb25maWdfZmlsZXMgKCZjb25maWdfZmlsZSwgInN5c3RlbSIpOworCisgICAgICAgICAgaWYgKCFfZGJ1c19nZXRfc3lzdGVtX2NvbmZpZ19maWxlICgmY29uZmlnX2ZpbGUpKQorICAgICAgICAgICAgZXhpdCAoMSk7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAiLS1zZXNzaW9uIikgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIGNoZWNrX3R3b19jb25maWdfZmlsZXMgKCZjb25maWdfZmlsZSwgInNlc3Npb24iKTsKKworICAgICAgICAgIGlmICghX2RidXNfZ2V0X3Nlc3Npb25fY29uZmlnX2ZpbGUgKCZjb25maWdfZmlsZSkpCisgICAgICAgICAgICBleGl0ICgxKTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoc3Ryc3RyIChhcmcsICItLWNvbmZpZy1maWxlPSIpID09IGFyZykKKyAgICAgICAgeworICAgICAgICAgIGNvbnN0IGNoYXIgKmZpbGU7CisKKyAgICAgICAgICBjaGVja190d29fY29uZmlnX2ZpbGVzICgmY29uZmlnX2ZpbGUsICJjb25maWctZmlsZSIpOworCisgICAgICAgICAgZmlsZSA9IHN0cmNociAoYXJnLCAnPScpOworICAgICAgICAgICsrZmlsZTsKKworICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmNvbmZpZ19maWxlLCBmaWxlKSkKKyAgICAgICAgICAgIGV4aXQgKDEpOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChwcmV2X2FyZyAmJgorICAgICAgICAgICAgICAgc3RyY21wIChwcmV2X2FyZywgIi0tY29uZmlnLWZpbGUiKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgY2hlY2tfdHdvX2NvbmZpZ19maWxlcyAoJmNvbmZpZ19maWxlLCAiY29uZmlnLWZpbGUiKTsKKworICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmNvbmZpZ19maWxlLCBhcmcpKQorICAgICAgICAgICAgZXhpdCAoMSk7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAiLS1jb25maWctZmlsZSIpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAvKiB3YWl0IGZvciBuZXh0IGFyZyAqLworICAgICAgICB9CisgICAgICBlbHNlIGlmIChzdHJzdHIgKGFyZywgIi0tYWRkcmVzcz0iKSA9PSBhcmcpCisgICAgICAgIHsKKyAgICAgICAgICBjb25zdCBjaGFyICpmaWxlOworCisgICAgICAgICAgY2hlY2tfdHdvX2FkZHJlc3NlcyAoJmFkZHJlc3MsICJhZGRyZXNzIik7CisKKyAgICAgICAgICBmaWxlID0gc3RyY2hyIChhcmcsICc9Jyk7CisgICAgICAgICAgKytmaWxlOworCisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmYWRkcmVzcywgZmlsZSkpCisgICAgICAgICAgICBleGl0ICgxKTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAocHJldl9hcmcgJiYKKyAgICAgICAgICAgICAgIHN0cmNtcCAocHJldl9hcmcsICItLWFkZHJlc3MiKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgY2hlY2tfdHdvX2FkZHJlc3NlcyAoJmFkZHJlc3MsICJhZGRyZXNzIik7CisKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhZGRyZXNzLCBhcmcpKQorICAgICAgICAgICAgZXhpdCAoMSk7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAiLS1hZGRyZXNzIikgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIC8qIHdhaXQgZm9yIG5leHQgYXJnICovCisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHN0cnN0ciAoYXJnLCAiLS1wcmludC1hZGRyZXNzPSIpID09IGFyZykKKyAgICAgICAgeworICAgICAgICAgIGNvbnN0IGNoYXIgKmRlc2M7CisKKyAgICAgICAgICBjaGVja190d29fYWRkcl9kZXNjcmlwdG9ycyAoJmFkZHJfZmQsICJwcmludC1hZGRyZXNzIik7CisKKyAgICAgICAgICBkZXNjID0gc3RyY2hyIChhcmcsICc9Jyk7CisgICAgICAgICAgKytkZXNjOworCisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmYWRkcl9mZCwgZGVzYykpCisgICAgICAgICAgICBleGl0ICgxKTsKKworICAgICAgICAgIHByaW50X2FkZHJlc3MgPSBUUlVFOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChwcmV2X2FyZyAmJgorICAgICAgICAgICAgICAgc3RyY21wIChwcmV2X2FyZywgIi0tcHJpbnQtYWRkcmVzcyIpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICBjaGVja190d29fYWRkcl9kZXNjcmlwdG9ycyAoJmFkZHJfZmQsICJwcmludC1hZGRyZXNzIik7CisKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhZGRyX2ZkLCBhcmcpKQorICAgICAgICAgICAgZXhpdCAoMSk7CisKKyAgICAgICAgICBwcmludF9hZGRyZXNzID0gVFJVRTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICItLXByaW50LWFkZHJlc3MiKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgcHJpbnRfYWRkcmVzcyA9IFRSVUU7IC8qIGFuZCB3ZSdsbCBnZXQgdGhlIG5leHQgYXJnIGlmIGFwcHJvcHJpYXRlICovCisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHN0cnN0ciAoYXJnLCAiLS1wcmludC1waWQ9IikgPT0gYXJnKQorICAgICAgICB7CisgICAgICAgICAgY29uc3QgY2hhciAqZGVzYzsKKworICAgICAgICAgIGNoZWNrX3R3b19waWRfZGVzY3JpcHRvcnMgKCZwaWRfZmQsICJwcmludC1waWQiKTsKKworICAgICAgICAgIGRlc2MgPSBzdHJjaHIgKGFyZywgJz0nKTsKKyAgICAgICAgICArK2Rlc2M7CisKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZwaWRfZmQsIGRlc2MpKQorICAgICAgICAgICAgZXhpdCAoMSk7CisKKyAgICAgICAgICBwcmludF9waWQgPSBUUlVFOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChwcmV2X2FyZyAmJgorICAgICAgICAgICAgICAgc3RyY21wIChwcmV2X2FyZywgIi0tcHJpbnQtcGlkIikgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIGNoZWNrX3R3b19waWRfZGVzY3JpcHRvcnMgKCZwaWRfZmQsICJwcmludC1waWQiKTsKKworICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnBpZF9mZCwgYXJnKSkKKyAgICAgICAgICAgIGV4aXQgKDEpOworCisgICAgICAgICAgcHJpbnRfcGlkID0gVFJVRTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICItLXByaW50LXBpZCIpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICBwcmludF9waWQgPSBUUlVFOyAvKiBhbmQgd2UnbGwgZ2V0IHRoZSBuZXh0IGFyZyBpZiBhcHByb3ByaWF0ZSAqLworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICB1c2FnZSAoKTsKKyAgICAgICAgfQorCisgICAgICBwcmV2X2FyZyA9IGFyZzsKKworICAgICAgKytpOworICAgIH0KKworICBpZiAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZjb25maWdfZmlsZSkgPT0gMCkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJObyBjb25maWd1cmF0aW9uIGZpbGUgc3BlY2lmaWVkLlxuIik7CisgICAgICB1c2FnZSAoKTsKKyAgICB9CisKKyAgX2RidXNfcGlwZV9pbnZhbGlkYXRlICgmcHJpbnRfYWRkcl9waXBlKTsKKyAgaWYgKHByaW50X2FkZHJlc3MpCisgICAgeworICAgICAgX2RidXNfcGlwZV9pbml0X3N0ZG91dCAoJnByaW50X2FkZHJfcGlwZSk7CisgICAgICBpZiAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZhZGRyX2ZkKSA+IDApCisgICAgICAgIHsKKyAgICAgICAgICBsb25nIHZhbDsKKyAgICAgICAgICBpbnQgZW5kOworICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX3BhcnNlX2ludCAoJmFkZHJfZmQsIDAsICZ2YWwsICZlbmQpIHx8CisgICAgICAgICAgICAgIGVuZCAhPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmFkZHJfZmQpIHx8CisgICAgICAgICAgICAgIHZhbCA8IDAgfHwgdmFsID4gX0RCVVNfSU5UX01BWCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiSW52YWxpZCBmaWxlIGRlc2NyaXB0b3I6IFwiJXNcIlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmYWRkcl9mZCkpOworICAgICAgICAgICAgICBleGl0ICgxKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIF9kYnVzX3BpcGVfaW5pdCAoJnByaW50X2FkZHJfcGlwZSwgdmFsKTsKKyAgICAgICAgfQorICAgIH0KKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZhZGRyX2ZkKTsKKworICBfZGJ1c19waXBlX2ludmFsaWRhdGUgKCZwcmludF9waWRfcGlwZSk7CisgIGlmIChwcmludF9waWQpCisgICAgeworICAgICAgX2RidXNfcGlwZV9pbml0X3N0ZG91dCAoJnByaW50X3BpZF9waXBlKTsKKyAgICAgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnBpZF9mZCkgPiAwKQorICAgICAgICB7CisgICAgICAgICAgbG9uZyB2YWw7CisgICAgICAgICAgaW50IGVuZDsKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19wYXJzZV9pbnQgKCZwaWRfZmQsIDAsICZ2YWwsICZlbmQpIHx8CisgICAgICAgICAgICAgIGVuZCAhPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnBpZF9mZCkgfHwKKyAgICAgICAgICAgICAgdmFsIDwgMCB8fCB2YWwgPiBfREJVU19JTlRfTUFYKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJJbnZhbGlkIGZpbGUgZGVzY3JpcHRvcjogXCIlc1wiXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZwaWRfZmQpKTsKKyAgICAgICAgICAgICAgZXhpdCAoMSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBfZGJ1c19waXBlX2luaXQgKCZwcmludF9waWRfcGlwZSwgdmFsKTsKKyAgICAgICAgfQorICAgIH0KKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwaWRfZmQpOworCisgIGlmICghYnVzX3NlbGludXhfcHJlX2luaXQgKCkpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIlNFTGludXggcHJlLWluaXRpYWxpemF0aW9uIGZhaWxlZCIpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIGlmICghYnVzX2FwcGFybW9yX3ByZV9pbml0ICgpKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJBcHBBcm1vciBwcmUtaW5pdGlhbGl6YXRpb24gZmFpbGVkOiBvdXQgb2YgbWVtb3J5Iik7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworICBjb250ZXh0ID0gYnVzX2NvbnRleHRfbmV3ICgmY29uZmlnX2ZpbGUsIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJpbnRfYWRkcl9waXBlLCAmcHJpbnRfcGlkX3BpcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoKCZhZGRyZXNzKSA+IDAgPyAmYWRkcmVzcyA6IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcik7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmY29uZmlnX2ZpbGUpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmFkZHJlc3MpOworICBpZiAoY29udGV4dCA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJGYWlsZWQgdG8gc3RhcnQgbWVzc2FnZSBidXM6ICVzIiwKKyAgICAgICAgICAgICAgICAgIGVycm9yLm1lc3NhZ2UpOworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIC8qIGJ1c19jb250ZXh0X25ldygpIGNsb3NlcyB0aGUgcHJpbnRfYWRkcl9waXBlIGFuZAorICAgKiBwcmludF9waWRfcGlwZQorICAgKi8KKworI2lmZGVmIERCVVNfVU5JWAorICBzZXR1cF9yZWxvYWRfcGlwZSAoYnVzX2NvbnRleHRfZ2V0X2xvb3AgKGNvbnRleHQpKTsKKworICAvKiBQT1NJWCBzaWduYWxzIGFyZSBVbml4LXNwZWNpZmljLCBhbmQgX2RidXNfc2V0X3NpZ25hbF9oYW5kbGVyIGlzCisgICAqIHVuaW1wbGVtZW50ZWQgKGFuZCBwcm9iYWJseSB1bmltcGxlbWVudGFibGUpIG9uIFdpbmRvd3MsIHNvIHRoZXJlJ3MKKyAgICogbm8gcG9pbnQgaW4gdHJ5aW5nIHRvIG1ha2UgdGhlIGhhbmRsZXIgcG9ydGFibGUgdG8gbm9uLVVuaXguICovCisKKyAgX2RidXNfc2V0X3NpZ25hbF9oYW5kbGVyIChTSUdURVJNLCBzaWduYWxfaGFuZGxlcik7CisgIF9kYnVzX3NldF9zaWduYWxfaGFuZGxlciAoU0lHSFVQLCBzaWduYWxfaGFuZGxlcik7CisjZW5kaWYgLyogREJVU19VTklYICovCisKKyAgX2RidXNfdmVyYm9zZSAoIldlIGFyZSBvbiBELUJ1cy4uLlxuIik7CisgIF9kYnVzX2xvb3BfcnVuIChidXNfY29udGV4dF9nZXRfbG9vcCAoY29udGV4dCkpOworCisgIGJ1c19jb250ZXh0X3NodXRkb3duIChjb250ZXh0KTsKKyAgYnVzX2NvbnRleHRfdW5yZWYgKGNvbnRleHQpOworICBidXNfc2VsaW51eF9zaHV0ZG93biAoKTsKKyAgYnVzX2FwcGFybW9yX3NodXRkb3duICgpOworICBidXNfYXVkaXRfc2h1dGRvd24gKCk7CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9idXMvb3JnLmZyZWVkZXNrdG9wLmRidXMtc2Vzc2lvbi5wbGlzdC5pbiBiL2J1cy9vcmcuZnJlZWRlc2t0b3AuZGJ1cy1zZXNzaW9uLnBsaXN0LmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwZmYzNzAKLS0tIC9kZXYvbnVsbAorKysgYi9idXMvb3JnLmZyZWVkZXNrdG9wLmRidXMtc2Vzc2lvbi5wbGlzdC5pbgpAQCAtMCwwICsxLDMzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCFET0NUWVBFIHBsaXN0IFBVQkxJQyAiLS8vQXBwbGUvL0RURCBQTElTVCAxLjAvL0VOIiAiaHR0cDovL3d3dy5hcHBsZS5jb20vRFREcy9Qcm9wZXJ0eUxpc3QtMS4wLmR0ZCI+Cis8cGxpc3QgdmVyc2lvbj0iMS4wIj4KKzxkaWN0PgorCTxrZXk+TGFiZWw8L2tleT4KKwk8c3RyaW5nPm9yZy5mcmVlZGVza3RvcC5kYnVzLXNlc3Npb248L3N0cmluZz4KKworCTxrZXk+U2VydmljZUlQQzwva2V5PgorCTx0cnVlLz4KKworCTwhLS0gUGxlYXNlIHVuY29tbWVudCBvbiAxMC40OyBPbkRlbWFuZCBkb2Vzbid0IHdvcmsgcHJvcGVybHkgdGhlcmUuIC0tPgorCTwhLS0KKwk8a2V5Pk9uRGVtYW5kPC9rZXk+CisJPGZhbHNlIC8+CisJLS0+CisKKwk8a2V5PlByb2dyYW1Bcmd1bWVudHM8L2tleT4KKwk8YXJyYXk+CisJCTxzdHJpbmc+QERCVVNfREFFTU9ORElSQC9kYnVzLWRhZW1vbjwvc3RyaW5nPgorCQk8c3RyaW5nPi0tbm9mb3JrPC9zdHJpbmc+CisJCTxzdHJpbmc+LS1zZXNzaW9uPC9zdHJpbmc+CisJPC9hcnJheT4KKworCTxrZXk+U29ja2V0czwva2V5PgorCTxkaWN0PgorCQk8a2V5PnVuaXhfZG9tYWluX2xpc3RlbmVyPC9rZXk+CisJCTxkaWN0PgorCQkJPGtleT5TZWN1cmVTb2NrZXRXaXRoS2V5PC9rZXk+CisJCQk8c3RyaW5nPkRCVVNfTEFVTkNIRF9TRVNTSU9OX0JVU19TT0NLRVQ8L3N0cmluZz4KKwkJPC9kaWN0PgorCTwvZGljdD4KKzwvZGljdD4KKzwvcGxpc3Q+CmRpZmYgLS1naXQgYS9idXMvcG9saWN5LmMgYi9idXMvcG9saWN5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM3YmU4MAotLS0gL2Rldi9udWxsCisrKyBiL2J1cy9wb2xpY3kuYwpAQCAtMCwwICsxLDEzNzggQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogcG9saWN5LmMgIEJ1cyBzZWN1cml0eSBwb2xpY3kKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQgIFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgInBvbGljeS5oIgorI2luY2x1ZGUgInNlcnZpY2VzLmgiCisjaW5jbHVkZSAidGVzdC5oIgorI2luY2x1ZGUgInV0aWxzLmgiCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWxpc3QuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtaGFzaC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1pbnRlcm5hbHMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbWVzc2FnZS1pbnRlcm5hbC5oPgorCitCdXNQb2xpY3lSdWxlKgorYnVzX3BvbGljeV9ydWxlX25ldyAoQnVzUG9saWN5UnVsZVR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgIGFsbG93KQoreworICBCdXNQb2xpY3lSdWxlICpydWxlOworCisgIHJ1bGUgPSBkYnVzX25ldzAgKEJ1c1BvbGljeVJ1bGUsIDEpOworICBpZiAocnVsZSA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIHJ1bGUtPnR5cGUgPSB0eXBlOworICBydWxlLT5yZWZjb3VudCA9IDE7CisgIHJ1bGUtPmFsbG93ID0gYWxsb3c7CisKKyAgc3dpdGNoIChydWxlLT50eXBlKQorICAgIHsKKyAgICBjYXNlIEJVU19QT0xJQ1lfUlVMRV9VU0VSOgorICAgICAgcnVsZS0+ZC51c2VyLnVpZCA9IERCVVNfVUlEX1VOU0VUOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCVVNfUE9MSUNZX1JVTEVfR1JPVVA6CisgICAgICBydWxlLT5kLmdyb3VwLmdpZCA9IERCVVNfR0lEX1VOU0VUOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCVVNfUE9MSUNZX1JVTEVfU0VORDoKKyAgICAgIHJ1bGUtPmQuc2VuZC5tZXNzYWdlX3R5cGUgPSBEQlVTX01FU1NBR0VfVFlQRV9JTlZBTElEOworCisgICAgICAvKiBhbGxvdyBydWxlcyBkZWZhdWx0IHRvIFRSVUUgKG9ubHkgcmVxdWVzdGVkIHJlcGxpZXMgYWxsb3dlZCkKKyAgICAgICAqIGRlbnkgcnVsZXMgZGVmYXVsdCB0byBGQUxTRSAob25seSB1bnJlcXVlc3RlZCByZXBsaWVzIGRlbmllZCkKKyAgICAgICAqLworICAgICAgcnVsZS0+ZC5zZW5kLnJlcXVlc3RlZF9yZXBseSA9IHJ1bGUtPmFsbG93OworICAgICAgYnJlYWs7CisgICAgY2FzZSBCVVNfUE9MSUNZX1JVTEVfUkVDRUlWRToKKyAgICAgIHJ1bGUtPmQucmVjZWl2ZS5tZXNzYWdlX3R5cGUgPSBEQlVTX01FU1NBR0VfVFlQRV9JTlZBTElEOworICAgICAgLyogYWxsb3cgcnVsZXMgZGVmYXVsdCB0byBUUlVFIChvbmx5IHJlcXVlc3RlZCByZXBsaWVzIGFsbG93ZWQpCisgICAgICAgKiBkZW55IHJ1bGVzIGRlZmF1bHQgdG8gRkFMU0UgKG9ubHkgdW5yZXF1ZXN0ZWQgcmVwbGllcyBkZW5pZWQpCisgICAgICAgKi8KKyAgICAgIHJ1bGUtPmQucmVjZWl2ZS5yZXF1ZXN0ZWRfcmVwbHkgPSBydWxlLT5hbGxvdzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQlVTX1BPTElDWV9SVUxFX09XTjoKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJpbnZhbGlkIHJ1bGUiKTsKKyAgICB9CisgIAorICByZXR1cm4gcnVsZTsKK30KKworQnVzUG9saWN5UnVsZSAqCitidXNfcG9saWN5X3J1bGVfcmVmIChCdXNQb2xpY3lSdWxlICpydWxlKQoreworICBfZGJ1c19hc3NlcnQgKHJ1bGUtPnJlZmNvdW50ID4gMCk7CisKKyAgcnVsZS0+cmVmY291bnQgKz0gMTsKKworICByZXR1cm4gcnVsZTsKK30KKwordm9pZAorYnVzX3BvbGljeV9ydWxlX3VucmVmIChCdXNQb2xpY3lSdWxlICpydWxlKQoreworICBfZGJ1c19hc3NlcnQgKHJ1bGUtPnJlZmNvdW50ID4gMCk7CisKKyAgcnVsZS0+cmVmY291bnQgLT0gMTsKKyAgCisgIGlmIChydWxlLT5yZWZjb3VudCA9PSAwKQorICAgIHsKKyAgICAgIHN3aXRjaCAocnVsZS0+dHlwZSkKKyAgICAgICAgeworICAgICAgICBjYXNlIEJVU19QT0xJQ1lfUlVMRV9TRU5EOgorICAgICAgICAgIGRidXNfZnJlZSAocnVsZS0+ZC5zZW5kLnBhdGgpOworICAgICAgICAgIGRidXNfZnJlZSAocnVsZS0+ZC5zZW5kLmludGVyZmFjZSk7CisgICAgICAgICAgZGJ1c19mcmVlIChydWxlLT5kLnNlbmQubWVtYmVyKTsKKyAgICAgICAgICBkYnVzX2ZyZWUgKHJ1bGUtPmQuc2VuZC5lcnJvcik7CisgICAgICAgICAgZGJ1c19mcmVlIChydWxlLT5kLnNlbmQuZGVzdGluYXRpb24pOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJVU19QT0xJQ1lfUlVMRV9SRUNFSVZFOgorICAgICAgICAgIGRidXNfZnJlZSAocnVsZS0+ZC5yZWNlaXZlLnBhdGgpOworICAgICAgICAgIGRidXNfZnJlZSAocnVsZS0+ZC5yZWNlaXZlLmludGVyZmFjZSk7CisgICAgICAgICAgZGJ1c19mcmVlIChydWxlLT5kLnJlY2VpdmUubWVtYmVyKTsKKyAgICAgICAgICBkYnVzX2ZyZWUgKHJ1bGUtPmQucmVjZWl2ZS5lcnJvcik7CisgICAgICAgICAgZGJ1c19mcmVlIChydWxlLT5kLnJlY2VpdmUub3JpZ2luKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCVVNfUE9MSUNZX1JVTEVfT1dOOgorICAgICAgICAgIGRidXNfZnJlZSAocnVsZS0+ZC5vd24uc2VydmljZV9uYW1lKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCVVNfUE9MSUNZX1JVTEVfVVNFUjoKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCVVNfUE9MSUNZX1JVTEVfR1JPVVA6CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiaW52YWxpZCBydWxlIik7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgZGJ1c19mcmVlIChydWxlKTsKKyAgICB9Cit9CisKK3N0cnVjdCBCdXNQb2xpY3kKK3sKKyAgaW50IHJlZmNvdW50OworCisgIERCdXNMaXN0ICpkZWZhdWx0X3J1bGVzOyAgICAgICAgIC8qKjwgRGVmYXVsdCBwb2xpY3kgcnVsZXMgKi8KKyAgREJ1c0xpc3QgKm1hbmRhdG9yeV9ydWxlczsgICAgICAgLyoqPCBNYW5kYXRvcnkgcG9saWN5IHJ1bGVzICovCisgIERCdXNIYXNoVGFibGUgKnJ1bGVzX2J5X3VpZDsgICAgIC8qKjwgcGVyLVVJRCBwb2xpY3kgcnVsZXMgKi8KKyAgREJ1c0hhc2hUYWJsZSAqcnVsZXNfYnlfZ2lkOyAgICAgLyoqPCBwZXItR0lEIHBvbGljeSBydWxlcyAqLworICBEQnVzTGlzdCAqYXRfY29uc29sZV90cnVlX3J1bGVzOyAvKio8IGNvbnNvbGUgdXNlciBwb2xpY3kgcnVsZXMgd2hlcmUgYXRfY29uc29sZT0idHJ1ZSIqLworICBEQnVzTGlzdCAqYXRfY29uc29sZV9mYWxzZV9ydWxlczsgLyoqPCBjb25zb2xlIHVzZXIgcG9saWN5IHJ1bGVzIHdoZXJlIGF0X2NvbnNvbGU9ImZhbHNlIiovCit9OworCitzdGF0aWMgdm9pZAorZnJlZV9ydWxlX2Z1bmMgKHZvaWQgKmRhdGEsCisgICAgICAgICAgICAgICAgdm9pZCAqdXNlcl9kYXRhKQoreworICBCdXNQb2xpY3lSdWxlICpydWxlID0gZGF0YTsKKworICBidXNfcG9saWN5X3J1bGVfdW5yZWYgKHJ1bGUpOworfQorCitzdGF0aWMgdm9pZAorZnJlZV9ydWxlX2xpc3RfZnVuYyAodm9pZCAqZGF0YSkKK3sKKyAgREJ1c0xpc3QgKipsaXN0ID0gZGF0YTsKKworICBpZiAobGlzdCA9PSBOVUxMKSAvKiBEQnVzSGFzaFRhYmxlIGlzIG9uIGNyYWNrICovCisgICAgcmV0dXJuOworICAKKyAgX2RidXNfbGlzdF9mb3JlYWNoIChsaXN0LCBmcmVlX3J1bGVfZnVuYywgTlVMTCk7CisgIAorICBfZGJ1c19saXN0X2NsZWFyIChsaXN0KTsKKworICBkYnVzX2ZyZWUgKGxpc3QpOworfQorCitCdXNQb2xpY3kqCitidXNfcG9saWN5X25ldyAodm9pZCkKK3sKKyAgQnVzUG9saWN5ICpwb2xpY3k7CisKKyAgcG9saWN5ID0gZGJ1c19uZXcwIChCdXNQb2xpY3ksIDEpOworICBpZiAocG9saWN5ID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgcG9saWN5LT5yZWZjb3VudCA9IDE7CisgIAorICBwb2xpY3ktPnJ1bGVzX2J5X3VpZCA9IF9kYnVzX2hhc2hfdGFibGVfbmV3IChEQlVTX0hBU0hfVUlOVFBUUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZV9ydWxlX2xpc3RfZnVuYyk7CisgIGlmIChwb2xpY3ktPnJ1bGVzX2J5X3VpZCA9PSBOVUxMKQorICAgIGdvdG8gZmFpbGVkOworCisgIHBvbGljeS0+cnVsZXNfYnlfZ2lkID0gX2RidXNfaGFzaF90YWJsZV9uZXcgKERCVVNfSEFTSF9VSU5UUFRSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlX3J1bGVfbGlzdF9mdW5jKTsKKyAgaWYgKHBvbGljeS0+cnVsZXNfYnlfZ2lkID09IE5VTEwpCisgICAgZ290byBmYWlsZWQ7CisKKyAgcmV0dXJuIHBvbGljeTsKKyAgCisgZmFpbGVkOgorICBidXNfcG9saWN5X3VucmVmIChwb2xpY3kpOworICByZXR1cm4gTlVMTDsKK30KKworQnVzUG9saWN5ICoKK2J1c19wb2xpY3lfcmVmIChCdXNQb2xpY3kgKnBvbGljeSkKK3sKKyAgX2RidXNfYXNzZXJ0IChwb2xpY3ktPnJlZmNvdW50ID4gMCk7CisKKyAgcG9saWN5LT5yZWZjb3VudCArPSAxOworCisgIHJldHVybiBwb2xpY3k7Cit9CisKK3ZvaWQKK2J1c19wb2xpY3lfdW5yZWYgKEJ1c1BvbGljeSAqcG9saWN5KQoreworICBfZGJ1c19hc3NlcnQgKHBvbGljeS0+cmVmY291bnQgPiAwKTsKKworICBwb2xpY3ktPnJlZmNvdW50IC09IDE7CisKKyAgaWYgKHBvbGljeS0+cmVmY291bnQgPT0gMCkKKyAgICB7CisgICAgICBfZGJ1c19saXN0X2ZvcmVhY2ggKCZwb2xpY3ktPmRlZmF1bHRfcnVsZXMsIGZyZWVfcnVsZV9mdW5jLCBOVUxMKTsKKyAgICAgIF9kYnVzX2xpc3RfY2xlYXIgKCZwb2xpY3ktPmRlZmF1bHRfcnVsZXMpOworCisgICAgICBfZGJ1c19saXN0X2ZvcmVhY2ggKCZwb2xpY3ktPm1hbmRhdG9yeV9ydWxlcywgZnJlZV9ydWxlX2Z1bmMsIE5VTEwpOworICAgICAgX2RidXNfbGlzdF9jbGVhciAoJnBvbGljeS0+bWFuZGF0b3J5X3J1bGVzKTsKKworICAgICAgX2RidXNfbGlzdF9mb3JlYWNoICgmcG9saWN5LT5hdF9jb25zb2xlX3RydWVfcnVsZXMsIGZyZWVfcnVsZV9mdW5jLCBOVUxMKTsKKyAgICAgIF9kYnVzX2xpc3RfY2xlYXIgKCZwb2xpY3ktPmF0X2NvbnNvbGVfdHJ1ZV9ydWxlcyk7CisKKyAgICAgIF9kYnVzX2xpc3RfZm9yZWFjaCAoJnBvbGljeS0+YXRfY29uc29sZV9mYWxzZV9ydWxlcywgZnJlZV9ydWxlX2Z1bmMsIE5VTEwpOworICAgICAgX2RidXNfbGlzdF9jbGVhciAoJnBvbGljeS0+YXRfY29uc29sZV9mYWxzZV9ydWxlcyk7CisKKyAgICAgIGlmIChwb2xpY3ktPnJ1bGVzX2J5X3VpZCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX2hhc2hfdGFibGVfdW5yZWYgKHBvbGljeS0+cnVsZXNfYnlfdWlkKTsKKyAgICAgICAgICBwb2xpY3ktPnJ1bGVzX2J5X3VpZCA9IE5VTEw7CisgICAgICAgIH0KKworICAgICAgaWYgKHBvbGljeS0+cnVsZXNfYnlfZ2lkKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfaGFzaF90YWJsZV91bnJlZiAocG9saWN5LT5ydWxlc19ieV9naWQpOworICAgICAgICAgIHBvbGljeS0+cnVsZXNfYnlfZ2lkID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgCisgICAgICBkYnVzX2ZyZWUgKHBvbGljeSk7CisgICAgfQorfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2FkZF9saXN0X3RvX2NsaWVudCAoREJ1c0xpc3QgICAgICAgICoqbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgQnVzQ2xpZW50UG9saWN5ICAqY2xpZW50KQoreworICBEQnVzTGlzdCAqbGluazsKKworICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAobGlzdCk7CisgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgeworICAgICAgQnVzUG9saWN5UnVsZSAqcnVsZSA9IGxpbmstPmRhdGE7CisgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rIChsaXN0LCBsaW5rKTsKKworICAgICAgc3dpdGNoIChydWxlLT50eXBlKQorICAgICAgICB7CisgICAgICAgIGNhc2UgQlVTX1BPTElDWV9SVUxFX1VTRVI6CisgICAgICAgIGNhc2UgQlVTX1BPTElDWV9SVUxFX0dST1VQOgorICAgICAgICAgIC8qIFRoZXNlIGFyZW4ndCBwZXItY29ubmVjdGlvbiBwb2xpY2llcyAqLworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQlVTX1BPTElDWV9SVUxFX09XTjoKKyAgICAgICAgY2FzZSBCVVNfUE9MSUNZX1JVTEVfU0VORDoKKyAgICAgICAgY2FzZSBCVVNfUE9MSUNZX1JVTEVfUkVDRUlWRToKKyAgICAgICAgICAvKiBUaGVzZSBhcmUgcGVyLWNvbm5lY3Rpb24gKi8KKyAgICAgICAgICBpZiAoIWJ1c19jbGllbnRfcG9saWN5X2FwcGVuZF9ydWxlIChjbGllbnQsIHJ1bGUpKQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiaW52YWxpZCBydWxlIik7CisgICAgICAgIH0KKyAgICB9CisgIAorICByZXR1cm4gVFJVRTsKK30KKworQnVzQ2xpZW50UG9saWN5KgorYnVzX3BvbGljeV9jcmVhdGVfY2xpZW50X3BvbGljeSAoQnVzUG9saWN5ICAgICAgKnBvbGljeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBCdXNDbGllbnRQb2xpY3kgKmNsaWVudDsKKyAgZGJ1c191aWRfdCB1aWQ7CisgIGRidXNfYm9vbF90IGF0X2NvbnNvbGU7CisKKyAgX2RidXNfYXNzZXJ0IChkYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2F1dGhlbnRpY2F0ZWQgKGNvbm5lY3Rpb24pKTsKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisgIAorICBjbGllbnQgPSBidXNfY2xpZW50X3BvbGljeV9uZXcgKCk7CisgIGlmIChjbGllbnQgPT0gTlVMTCkKKyAgICBnb3RvIG5vbWVtOworCisgIGlmICghYWRkX2xpc3RfdG9fY2xpZW50ICgmcG9saWN5LT5kZWZhdWx0X3J1bGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50KSkKKyAgICBnb3RvIG5vbWVtOworCisgIC8qIHdlIGF2b2lkIHRoZSBvdmVyaGVhZCBvZiBsb29raW5nIHVwIHVzZXIncyBncm91cHMKKyAgICogaWYgd2UgZG9uJ3QgaGF2ZSBhbnkgZ3JvdXAgcnVsZXMgYW55d2F5CisgICAqLworICBpZiAoX2RidXNfaGFzaF90YWJsZV9nZXRfbl9lbnRyaWVzIChwb2xpY3ktPnJ1bGVzX2J5X2dpZCkgPiAwKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGxvbmcgKmdyb3VwczsKKyAgICAgIGludCBuX2dyb3VwczsKKyAgICAgIGludCBpOworICAgICAgCisgICAgICBpZiAoIWJ1c19jb25uZWN0aW9uX2dldF91bml4X2dyb3VwcyAoY29ubmVjdGlvbiwgJmdyb3VwcywgJm5fZ3JvdXBzLCBlcnJvcikpCisgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgCisgICAgICBpID0gMDsKKyAgICAgIHdoaWxlIChpIDwgbl9ncm91cHMpCisgICAgICAgIHsKKyAgICAgICAgICBEQnVzTGlzdCAqKmxpc3Q7CisgICAgICAgICAgCisgICAgICAgICAgbGlzdCA9IF9kYnVzX2hhc2hfdGFibGVfbG9va3VwX3VpbnRwdHIgKHBvbGljeS0+cnVsZXNfYnlfZ2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBzW2ldKTsKKyAgICAgICAgICAKKyAgICAgICAgICBpZiAobGlzdCAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoIWFkZF9saXN0X3RvX2NsaWVudCAobGlzdCwgY2xpZW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBkYnVzX2ZyZWUgKGdyb3Vwcyk7CisgICAgICAgICAgICAgICAgICBnb3RvIG5vbWVtOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgICAgICArK2k7CisgICAgICAgIH0KKworICAgICAgZGJ1c19mcmVlIChncm91cHMpOworICAgIH0KKyAgCisgIGlmIChkYnVzX2Nvbm5lY3Rpb25fZ2V0X3VuaXhfdXNlciAoY29ubmVjdGlvbiwgJnVpZCkpCisgICAgeworICAgICAgaWYgKF9kYnVzX2hhc2hfdGFibGVfZ2V0X25fZW50cmllcyAocG9saWN5LT5ydWxlc19ieV91aWQpID4gMCkKKyAgICAgICAgeworICAgICAgICAgIERCdXNMaXN0ICoqbGlzdDsKKyAgICAgICAgICAKKyAgICAgICAgICBsaXN0ID0gX2RidXNfaGFzaF90YWJsZV9sb29rdXBfdWludHB0ciAocG9saWN5LT5ydWxlc19ieV91aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWQpOworICAgICAgICAgIAorICAgICAgICAgIGlmIChsaXN0ICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmICghYWRkX2xpc3RfdG9fY2xpZW50IChsaXN0LCBjbGllbnQpKQorICAgICAgICAgICAgICAgIGdvdG8gbm9tZW07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgLyogQWRkIGNvbnNvbGUgcnVsZXMgKi8KKyAgICAgIGF0X2NvbnNvbGUgPSBfZGJ1c191bml4X3VzZXJfaXNfYXRfY29uc29sZSAodWlkLCBlcnJvcik7CisgICAgICAKKyAgICAgIGlmIChhdF9jb25zb2xlKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCFhZGRfbGlzdF90b19jbGllbnQgKCZwb2xpY3ktPmF0X2NvbnNvbGVfdHJ1ZV9ydWxlcywgY2xpZW50KSkKKyAgICAgICAgICAgIGdvdG8gbm9tZW07CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKGRidXNfZXJyb3JfaXNfc2V0IChlcnJvcikgPT0gVFJVRSkKKyAgICAgICAgeworICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICB9CisgICAgICBlbHNlIGlmICghYWRkX2xpc3RfdG9fY2xpZW50ICgmcG9saWN5LT5hdF9jb25zb2xlX2ZhbHNlX3J1bGVzLCBjbGllbnQpKQorICAgICAgICB7CisgICAgICAgICAgZ290byBub21lbTsKKyAgICAgICAgfQorICAgIH0KKworICBpZiAoIWFkZF9saXN0X3RvX2NsaWVudCAoJnBvbGljeS0+bWFuZGF0b3J5X3J1bGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50KSkKKyAgICBnb3RvIG5vbWVtOworCisgIGJ1c19jbGllbnRfcG9saWN5X29wdGltaXplIChjbGllbnQpOworICAKKyAgcmV0dXJuIGNsaWVudDsKKworIG5vbWVtOgorICBCVVNfU0VUX09PTSAoZXJyb3IpOworIGZhaWxlZDoKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICBpZiAoY2xpZW50KQorICAgIGJ1c19jbGllbnRfcG9saWN5X3VucmVmIChjbGllbnQpOworICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitsaXN0X2FsbG93c191c2VyIChkYnVzX2Jvb2xfdCAgICAgICAgICAgZGVmLAorICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICAgICAgICAgICAqKmxpc3QsCisgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgICAgICAgdWlkLAorICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgbG9uZyAgKmdyb3VwX2lkcywKKyAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICBuX2dyb3VwX2lkcykKK3sKKyAgREJ1c0xpc3QgKmxpbms7CisgIGRidXNfYm9vbF90IGFsbG93ZWQ7CisgIAorICBhbGxvd2VkID0gZGVmOworCisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rIChsaXN0KTsKKyAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBCdXNQb2xpY3lSdWxlICpydWxlID0gbGluay0+ZGF0YTsKKyAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKGxpc3QsIGxpbmspOworCisgICAgICBpZiAocnVsZS0+dHlwZSA9PSBCVVNfUE9MSUNZX1JVTEVfVVNFUikKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJMaXN0ICVwIHVzZXIgcnVsZSB1aWQ9IkRCVVNfVUlEX0ZPUk1BVCJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdCwgcnVsZS0+ZC51c2VyLnVpZCk7CisgICAgICAgICAgCisgICAgICAgICAgaWYgKHJ1bGUtPmQudXNlci51aWQgPT0gREJVU19VSURfVU5TRVQpCisgICAgICAgICAgICA7IC8qICcqJyB3aWxkY2FyZCAqLworICAgICAgICAgIGVsc2UgaWYgKHJ1bGUtPmQudXNlci51aWQgIT0gdWlkKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHJ1bGUtPnR5cGUgPT0gQlVTX1BPTElDWV9SVUxFX0dST1VQKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkxpc3QgJXAgZ3JvdXAgcnVsZSBnaWQ9IkRCVVNfR0lEX0ZPUk1BVCJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdCwgcnVsZS0+ZC5ncm91cC5naWQpOworICAgICAgICAgIAorICAgICAgICAgIGlmIChydWxlLT5kLmdyb3VwLmdpZCA9PSBEQlVTX0dJRF9VTlNFVCkKKyAgICAgICAgICAgIDsgIC8qICcqJyB3aWxkY2FyZCAqLworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBpID0gMDsKKyAgICAgICAgICAgICAgd2hpbGUgKGkgPCBuX2dyb3VwX2lkcykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBpZiAocnVsZS0+ZC5ncm91cC5naWQgPT0gZ3JvdXBfaWRzW2ldKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICsraTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBpZiAoaSA9PSBuX2dyb3VwX2lkcykKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBjb250aW51ZTsKKworICAgICAgYWxsb3dlZCA9IHJ1bGUtPmFsbG93OworICAgIH0KKyAgCisgIHJldHVybiBhbGxvd2VkOworfQorCitkYnVzX2Jvb2xfdAorYnVzX3BvbGljeV9hbGxvd191bml4X3VzZXIgKEJ1c1BvbGljeSAgICAgICAgKnBvbGljeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgICB1aWQpCit7CisgIGRidXNfYm9vbF90IGFsbG93ZWQ7CisgIHVuc2lnbmVkIGxvbmcgKmdyb3VwX2lkczsKKyAgaW50IG5fZ3JvdXBfaWRzOworCisgIC8qIE9uIE9PTSBvciBlcnJvciB3ZSBhbHdheXMgcmVqZWN0IHRoZSB1c2VyICovCisgIGlmICghX2RidXNfdW5peF9ncm91cHNfZnJvbV91aWQgKHVpZCwgJmdyb3VwX2lkcywgJm5fZ3JvdXBfaWRzKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiRGlkIG5vdCBnZXQgYW55IGdyb3VwcyBmb3IgVUlEICVsdVxuIiwKKyAgICAgICAgICAgICAgICAgICAgIHVpZCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIC8qIERlZmF1bHQgdG8gInVzZXIgb3duaW5nIGJ1cyIgY2FuIGNvbm5lY3QgKi8KKyAgYWxsb3dlZCA9IF9kYnVzX3VuaXhfdXNlcl9pc19wcm9jZXNzX293bmVyICh1aWQpOworCisgIGFsbG93ZWQgPSBsaXN0X2FsbG93c191c2VyIChhbGxvd2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBvbGljeS0+ZGVmYXVsdF9ydWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwX2lkcywgbl9ncm91cF9pZHMpOworCisgIGFsbG93ZWQgPSBsaXN0X2FsbG93c191c2VyIChhbGxvd2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBvbGljeS0+bWFuZGF0b3J5X3J1bGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBfaWRzLCBuX2dyb3VwX2lkcyk7CisKKyAgZGJ1c19mcmVlIChncm91cF9pZHMpOworCisgIF9kYnVzX3ZlcmJvc2UgKCJVSUQgJWx1IGFsbG93ZWQgPSAlZFxuIiwgdWlkLCBhbGxvd2VkKTsKKyAgCisgIHJldHVybiBhbGxvd2VkOworfQorCisvKiBGb3Igbm93IHRoaXMgaXMgbmV2ZXIgYWN0dWFsbHkgY2FsbGVkIGJlY2F1c2UgdGhlIGRlZmF1bHQKKyAqIERCdXNDb25uZWN0aW9uIGJlaGF2aW9yIG9mICdzYW1lIHVzZXIgdGhhdCBvd25zIHRoZSBidXMgY2FuCisgKiBjb25uZWN0JyBpcyBhbGwgaXQgd291bGQgZG8uIFNldCB0aGUgd2luZG93cyB1c2VyIGZ1bmN0aW9uIGluCisgKiBjb25uZWN0aW9uLmMgaWYgdGhlIGNvbmZpZyBmaWxlIGV2ZXIgc3VwcG9ydHMgZG9pbmcgc29tZXRoaW5nCisgKiBpbnRlcmVzdGluZyBoZXJlLgorICovCitkYnVzX2Jvb2xfdAorYnVzX3BvbGljeV9hbGxvd193aW5kb3dzX3VzZXIgKEJ1c1BvbGljeSAgICAgICAgKnBvbGljeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICp3aW5kb3dzX3NpZCkKK3sKKyAgLyogV2luZG93cyBoYXMgbm8gcG9saWNpZXMgaGVyZSBzaW5jZSBvbmx5IHRoZSBzZXNzaW9uIGJ1cworICAgKiBpcyByZWFsbHkgdXNlZCBmb3Igbm93LCBzbyBqdXN0IGNoZWNraW5nIHRoYXQgdGhlCisgICAqIGNvbm5lY3RpbmcgcGVyc29uIGlzIHRoZSBzYW1lIGFzIHRoZSBidXMgb3duZXIgaXMgZmluZS4KKyAgICovCisgIHJldHVybiBfZGJ1c193aW5kb3dzX3VzZXJfaXNfcHJvY2Vzc19vd25lciAod2luZG93c19zaWQpOworfQorCitkYnVzX2Jvb2xfdAorYnVzX3BvbGljeV9hcHBlbmRfZGVmYXVsdF9ydWxlIChCdXNQb2xpY3kgICAgICAqcG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNQb2xpY3lSdWxlICAqcnVsZSkKK3sKKyAgaWYgKCFfZGJ1c19saXN0X2FwcGVuZCAoJnBvbGljeS0+ZGVmYXVsdF9ydWxlcywgcnVsZSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGJ1c19wb2xpY3lfcnVsZV9yZWYgKHJ1bGUpOworCisgIHJldHVybiBUUlVFOworfQorCitkYnVzX2Jvb2xfdAorYnVzX3BvbGljeV9hcHBlbmRfbWFuZGF0b3J5X3J1bGUgKEJ1c1BvbGljeSAgICAgICpwb2xpY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzUG9saWN5UnVsZSAgKnJ1bGUpCit7CisgIGlmICghX2RidXNfbGlzdF9hcHBlbmQgKCZwb2xpY3ktPm1hbmRhdG9yeV9ydWxlcywgcnVsZSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGJ1c19wb2xpY3lfcnVsZV9yZWYgKHJ1bGUpOworCisgIHJldHVybiBUUlVFOworfQorCisKKworc3RhdGljIERCdXNMaXN0KioKK2dldF9saXN0IChEQnVzSGFzaFRhYmxlICpoYXNoLAorICAgICAgICAgIHVuc2lnbmVkIGxvbmcgIGtleSkKK3sKKyAgREJ1c0xpc3QgKipsaXN0OworCisgIGxpc3QgPSBfZGJ1c19oYXNoX3RhYmxlX2xvb2t1cF91aW50cHRyIChoYXNoLCBrZXkpOworCisgIGlmIChsaXN0ID09IE5VTEwpCisgICAgeworICAgICAgbGlzdCA9IGRidXNfbmV3MCAoREJ1c0xpc3QqLCAxKTsKKyAgICAgIGlmIChsaXN0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgICBpZiAoIV9kYnVzX2hhc2hfdGFibGVfaW5zZXJ0X3VpbnRwdHIgKGhhc2gsIGtleSwgbGlzdCkpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX2ZyZWUgKGxpc3QpOworICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorCisgIHJldHVybiBsaXN0OworfQorCitkYnVzX2Jvb2xfdAorYnVzX3BvbGljeV9hcHBlbmRfdXNlcl9ydWxlIChCdXNQb2xpY3kgICAgICAqcG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpZF90ICAgICAgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNQb2xpY3lSdWxlICAqcnVsZSkKK3sKKyAgREJ1c0xpc3QgKipsaXN0OworCisgIGxpc3QgPSBnZXRfbGlzdCAocG9saWN5LT5ydWxlc19ieV91aWQsIHVpZCk7CisKKyAgaWYgKGxpc3QgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFfZGJ1c19saXN0X2FwcGVuZCAobGlzdCwgcnVsZSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGJ1c19wb2xpY3lfcnVsZV9yZWYgKHJ1bGUpOworCisgIHJldHVybiBUUlVFOworfQorCitkYnVzX2Jvb2xfdAorYnVzX3BvbGljeV9hcHBlbmRfZ3JvdXBfcnVsZSAoQnVzUG9saWN5ICAgICAgKnBvbGljeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfZ2lkX3QgICAgICBnaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNQb2xpY3lSdWxlICAqcnVsZSkKK3sKKyAgREJ1c0xpc3QgKipsaXN0OworCisgIGxpc3QgPSBnZXRfbGlzdCAocG9saWN5LT5ydWxlc19ieV9naWQsIGdpZCk7CisKKyAgaWYgKGxpc3QgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFfZGJ1c19saXN0X2FwcGVuZCAobGlzdCwgcnVsZSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGJ1c19wb2xpY3lfcnVsZV9yZWYgKHJ1bGUpOworCisgIHJldHVybiBUUlVFOworfQorCitkYnVzX2Jvb2xfdAorYnVzX3BvbGljeV9hcHBlbmRfY29uc29sZV9ydWxlIChCdXNQb2xpY3kgICAgICAqcG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgYXRfY29uc29sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzUG9saWN5UnVsZSAgKnJ1bGUpCit7CisgIGlmIChhdF9jb25zb2xlKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfbGlzdF9hcHBlbmQgKCZwb2xpY3ktPmF0X2NvbnNvbGVfdHJ1ZV9ydWxlcywgcnVsZSkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGlmICghX2RidXNfbGlzdF9hcHBlbmQgKCZwb2xpY3ktPmF0X2NvbnNvbGVfZmFsc2VfcnVsZXMsIHJ1bGUpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGJ1c19wb2xpY3lfcnVsZV9yZWYgKHJ1bGUpOworCisgIHJldHVybiBUUlVFOworCit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYXBwZW5kX2NvcHlfb2ZfcG9saWN5X2xpc3QgKERCdXNMaXN0ICoqbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAqKnRvX2FwcGVuZCkKK3sKKyAgREJ1c0xpc3QgKmxpbms7CisgIERCdXNMaXN0ICp0bXBfbGlzdDsKKworICB0bXBfbGlzdCA9IE5VTEw7CisKKyAgLyogUHJlYWxsb2NhdGUgYWxsIG91ciBsaW5rcyAqLworICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAodG9fYXBwZW5kKTsKKyAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX2xpc3RfYXBwZW5kICgmdG1wX2xpc3QsIGxpbmstPmRhdGEpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfbGlzdF9jbGVhciAoJnRtcF9saXN0KTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAodG9fYXBwZW5kLCBsaW5rKTsKKyAgICB9CisKKyAgLyogTm93IGFwcGVuZCB0aGVtICovCisgIHdoaWxlICgobGluayA9IF9kYnVzX2xpc3RfcG9wX2ZpcnN0X2xpbmsgKCZ0bXBfbGlzdCkpKQorICAgIHsKKyAgICAgIGJ1c19wb2xpY3lfcnVsZV9yZWYgKGxpbmstPmRhdGEpOworICAgICAgX2RidXNfbGlzdF9hcHBlbmRfbGluayAobGlzdCwgbGluayk7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK21lcmdlX2lkX2hhc2ggKERCdXNIYXNoVGFibGUgKmRlc3QsCisgICAgICAgICAgICAgICBEQnVzSGFzaFRhYmxlICp0b19hYnNvcmIpCit7CisgIERCdXNIYXNoSXRlciBpdGVyOworICAKKyAgX2RidXNfaGFzaF9pdGVyX2luaXQgKHRvX2Fic29yYiwgJml0ZXIpOworICB3aGlsZSAoX2RidXNfaGFzaF9pdGVyX25leHQgKCZpdGVyKSkKKyAgICB7CisgICAgICB1bnNpZ25lZCBsb25nIGlkID0gX2RidXNfaGFzaF9pdGVyX2dldF91aW50cHRyX2tleSAoJml0ZXIpOworICAgICAgREJ1c0xpc3QgKipsaXN0ID0gX2RidXNfaGFzaF9pdGVyX2dldF92YWx1ZSAoJml0ZXIpOworICAgICAgREJ1c0xpc3QgKip0YXJnZXQgPSBnZXRfbGlzdCAoZGVzdCwgaWQpOworCisgICAgICBpZiAodGFyZ2V0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgaWYgKCFhcHBlbmRfY29weV9vZl9wb2xpY3lfbGlzdCAodGFyZ2V0LCBsaXN0KSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworZGJ1c19ib29sX3QKK2J1c19wb2xpY3lfbWVyZ2UgKEJ1c1BvbGljeSAqcG9saWN5LAorICAgICAgICAgICAgICAgICAgQnVzUG9saWN5ICp0b19hYnNvcmIpCit7CisgIC8qIEZJWE1FIE5vdCBwcm9wZXJseSBhdG9taWMsIGJ1dCBhcyB1c2VkIGZvciBjb25maWd1cmF0aW9uIGZpbGVzIHdlCisgICAqIGRvbid0IHJlbHkgb24gaXQgcXVpdGUgc28gbXVjaC4KKyAgICovCisgIAorICBpZiAoIWFwcGVuZF9jb3B5X29mX3BvbGljeV9saXN0ICgmcG9saWN5LT5kZWZhdWx0X3J1bGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG9fYWJzb3JiLT5kZWZhdWx0X3J1bGVzKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIAorICBpZiAoIWFwcGVuZF9jb3B5X29mX3BvbGljeV9saXN0ICgmcG9saWN5LT5tYW5kYXRvcnlfcnVsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0b19hYnNvcmItPm1hbmRhdG9yeV9ydWxlcykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghYXBwZW5kX2NvcHlfb2ZfcG9saWN5X2xpc3QgKCZwb2xpY3ktPmF0X2NvbnNvbGVfdHJ1ZV9ydWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRvX2Fic29yYi0+YXRfY29uc29sZV90cnVlX3J1bGVzKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFhcHBlbmRfY29weV9vZl9wb2xpY3lfbGlzdCAoJnBvbGljeS0+YXRfY29uc29sZV9mYWxzZV9ydWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRvX2Fic29yYi0+YXRfY29uc29sZV9mYWxzZV9ydWxlcykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghbWVyZ2VfaWRfaGFzaCAocG9saWN5LT5ydWxlc19ieV91aWQsCisgICAgICAgICAgICAgICAgICAgICAgdG9fYWJzb3JiLT5ydWxlc19ieV91aWQpKQorICAgIHJldHVybiBGQUxTRTsKKyAgCisgIGlmICghbWVyZ2VfaWRfaGFzaCAocG9saWN5LT5ydWxlc19ieV9naWQsCisgICAgICAgICAgICAgICAgICAgICAgdG9fYWJzb3JiLT5ydWxlc19ieV9naWQpKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RydWN0IEJ1c0NsaWVudFBvbGljeQoreworICBpbnQgcmVmY291bnQ7CisKKyAgREJ1c0xpc3QgKnJ1bGVzOworfTsKKworQnVzQ2xpZW50UG9saWN5KgorYnVzX2NsaWVudF9wb2xpY3lfbmV3ICh2b2lkKQoreworICBCdXNDbGllbnRQb2xpY3kgKnBvbGljeTsKKworICBwb2xpY3kgPSBkYnVzX25ldzAgKEJ1c0NsaWVudFBvbGljeSwgMSk7CisgIGlmIChwb2xpY3kgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBwb2xpY3ktPnJlZmNvdW50ID0gMTsKKworICByZXR1cm4gcG9saWN5OworfQorCitCdXNDbGllbnRQb2xpY3kgKgorYnVzX2NsaWVudF9wb2xpY3lfcmVmIChCdXNDbGllbnRQb2xpY3kgKnBvbGljeSkKK3sKKyAgX2RidXNfYXNzZXJ0IChwb2xpY3ktPnJlZmNvdW50ID4gMCk7CisKKyAgcG9saWN5LT5yZWZjb3VudCArPSAxOworCisgIHJldHVybiBwb2xpY3k7Cit9CisKK3N0YXRpYyB2b2lkCitydWxlX3VucmVmX2ZvcmVhY2ggKHZvaWQgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJfZGF0YSkKK3sKKyAgQnVzUG9saWN5UnVsZSAqcnVsZSA9IGRhdGE7CisKKyAgYnVzX3BvbGljeV9ydWxlX3VucmVmIChydWxlKTsKK30KKwordm9pZAorYnVzX2NsaWVudF9wb2xpY3lfdW5yZWYgKEJ1c0NsaWVudFBvbGljeSAqcG9saWN5KQoreworICBfZGJ1c19hc3NlcnQgKHBvbGljeS0+cmVmY291bnQgPiAwKTsKKworICBwb2xpY3ktPnJlZmNvdW50IC09IDE7CisKKyAgaWYgKHBvbGljeS0+cmVmY291bnQgPT0gMCkKKyAgICB7CisgICAgICBfZGJ1c19saXN0X2ZvcmVhY2ggKCZwb2xpY3ktPnJ1bGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlX3VucmVmX2ZvcmVhY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworCisgICAgICBfZGJ1c19saXN0X2NsZWFyICgmcG9saWN5LT5ydWxlcyk7CisKKyAgICAgIGRidXNfZnJlZSAocG9saWN5KTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCityZW1vdmVfcnVsZXNfYnlfdHlwZV91cF90byAoQnVzQ2xpZW50UG9saWN5ICAgKnBvbGljeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNQb2xpY3lSdWxlVHlwZSAgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAgICAgICAgICAqdXBfdG8pCit7CisgIERCdXNMaXN0ICpsaW5rOworCisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmcG9saWN5LT5ydWxlcyk7CisgIHdoaWxlIChsaW5rICE9IHVwX3RvKQorICAgIHsKKyAgICAgIEJ1c1BvbGljeVJ1bGUgKnJ1bGUgPSBsaW5rLT5kYXRhOworICAgICAgREJ1c0xpc3QgKm5leHQgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZwb2xpY3ktPnJ1bGVzLCBsaW5rKTsKKworICAgICAgaWYgKHJ1bGUtPnR5cGUgPT0gdHlwZSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX2xpc3RfcmVtb3ZlX2xpbmsgKCZwb2xpY3ktPnJ1bGVzLCBsaW5rKTsKKyAgICAgICAgICBidXNfcG9saWN5X3J1bGVfdW5yZWYgKHJ1bGUpOworICAgICAgICB9CisgICAgICAKKyAgICAgIGxpbmsgPSBuZXh0OworICAgIH0KK30KKwordm9pZAorYnVzX2NsaWVudF9wb2xpY3lfb3B0aW1pemUgKEJ1c0NsaWVudFBvbGljeSAqcG9saWN5KQoreworICBEQnVzTGlzdCAqbGluazsKKworICAvKiBUaGUgaWRlYSBoZXJlIGlzIHRoYXQgaWYgd2UgaGF2ZToKKyAgICogCisgICAqIDxhbGxvdyBzZW5kX2ludGVyZmFjZT0iZm9vLmJhciIvPgorICAgKiA8ZGVueSBzZW5kX2ludGVyZmFjZT0iKiIvPgorICAgKgorICAgKiAoZm9yIGV4YW1wbGUpIHRoZSBkZW55IHdpbGwgYWx3YXlzIG92ZXJyaWRlIHRoZSBhbGxvdy4gIFNvIHdlCisgICAqIGRlbGV0ZSB0aGUgYWxsb3cuIERpdHRvIGZvciBkZW55IGZvbGxvd2VkIGJ5IGFsbG93LCBldGMuIFRoaXMgaXMKKyAgICogYSBkdW1iIHRoaW5nIHRvIHB1dCBpbiBhIGNvbmZpZyBmaWxlLCBidXQgdGhlIDxpbmNsdWRlPiBmZWF0dXJlCisgICAqIG9mIGZpbGVzIGFsbG93cyBmb3IgYW4gImluaGVyaXRhbmNlIGFuZCBvdmVycmlkZSIgcGF0dGVybiB3aGVyZQorICAgKiBpdCBjb3VsZCBtYWtlIHNlbnNlLiBJZiBhbiBpbmNsdWRlZCBmaWxlIHdhbnRzIHRvICJzdGFydCBvdmVyIgorICAgKiB3aXRoIGEgYmxhbmtldCBkZW55LCBubyBwb2ludCBrZWVwaW5nIHRoZSBydWxlcyBmcm9tIHRoZSBwYXJlbnQKKyAgICogZmlsZS4KKyAgICovCisKKyAgX2RidXNfdmVyYm9zZSAoIk9wdGltaXppbmcgcG9saWN5IHdpdGggJWQgcnVsZXNcbiIsCisgICAgICAgICAgICAgICAgIF9kYnVzX2xpc3RfZ2V0X2xlbmd0aCAoJnBvbGljeS0+cnVsZXMpKTsKKyAgCisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmcG9saWN5LT5ydWxlcyk7CisgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgeworICAgICAgQnVzUG9saWN5UnVsZSAqcnVsZTsKKyAgICAgIERCdXNMaXN0ICpuZXh0OworICAgICAgZGJ1c19ib29sX3QgcmVtb3ZlX3ByZWNlZGluZzsKKworICAgICAgbmV4dCA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJnBvbGljeS0+cnVsZXMsIGxpbmspOworICAgICAgcnVsZSA9IGxpbmstPmRhdGE7CisgICAgICAKKyAgICAgIHJlbW92ZV9wcmVjZWRpbmcgPSBGQUxTRTsKKworICAgICAgX2RidXNfYXNzZXJ0IChydWxlICE9IE5VTEwpOworICAgICAgCisgICAgICBzd2l0Y2ggKHJ1bGUtPnR5cGUpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBCVVNfUE9MSUNZX1JVTEVfU0VORDoKKyAgICAgICAgICByZW1vdmVfcHJlY2VkaW5nID0KKyAgICAgICAgICAgIHJ1bGUtPmQuc2VuZC5tZXNzYWdlX3R5cGUgPT0gREJVU19NRVNTQUdFX1RZUEVfSU5WQUxJRCAmJgorICAgICAgICAgICAgcnVsZS0+ZC5zZW5kLnBhdGggPT0gTlVMTCAmJgorICAgICAgICAgICAgcnVsZS0+ZC5zZW5kLmludGVyZmFjZSA9PSBOVUxMICYmCisgICAgICAgICAgICBydWxlLT5kLnNlbmQubWVtYmVyID09IE5VTEwgJiYKKyAgICAgICAgICAgIHJ1bGUtPmQuc2VuZC5lcnJvciA9PSBOVUxMICYmCisgICAgICAgICAgICBydWxlLT5kLnNlbmQuZGVzdGluYXRpb24gPT0gTlVMTDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCVVNfUE9MSUNZX1JVTEVfUkVDRUlWRToKKyAgICAgICAgICByZW1vdmVfcHJlY2VkaW5nID0KKyAgICAgICAgICAgIHJ1bGUtPmQucmVjZWl2ZS5tZXNzYWdlX3R5cGUgPT0gREJVU19NRVNTQUdFX1RZUEVfSU5WQUxJRCAmJgorICAgICAgICAgICAgcnVsZS0+ZC5yZWNlaXZlLnBhdGggPT0gTlVMTCAmJgorICAgICAgICAgICAgcnVsZS0+ZC5yZWNlaXZlLmludGVyZmFjZSA9PSBOVUxMICYmCisgICAgICAgICAgICBydWxlLT5kLnJlY2VpdmUubWVtYmVyID09IE5VTEwgJiYKKyAgICAgICAgICAgIHJ1bGUtPmQucmVjZWl2ZS5lcnJvciA9PSBOVUxMICYmCisgICAgICAgICAgICBydWxlLT5kLnJlY2VpdmUub3JpZ2luID09IE5VTEw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQlVTX1BPTElDWV9SVUxFX09XTjoKKyAgICAgICAgICByZW1vdmVfcHJlY2VkaW5nID0KKyAgICAgICAgICAgIHJ1bGUtPmQub3duLnNlcnZpY2VfbmFtZSA9PSBOVUxMOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIC8qIFRoZSBvdGhlciBydWxlIHR5cGVzIGRvbid0IGFwcGVhciBpbiB0aGlzIGxpc3QgKi8KKyAgICAgICAgY2FzZSBCVVNfUE9MSUNZX1JVTEVfVVNFUjoKKyAgICAgICAgY2FzZSBCVVNfUE9MSUNZX1JVTEVfR1JPVVA6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiaW52YWxpZCBydWxlIik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgaWYgKHJlbW92ZV9wcmVjZWRpbmcpCisgICAgICAgIHJlbW92ZV9ydWxlc19ieV90eXBlX3VwX3RvIChwb2xpY3ksIHJ1bGUtPnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rKTsKKyAgICAgIAorICAgICAgbGluayA9IG5leHQ7CisgICAgfQorCisgIF9kYnVzX3ZlcmJvc2UgKCJBZnRlciBvcHRpbWl6YXRpb24sIHBvbGljeSBoYXMgJWQgcnVsZXNcbiIsCisgICAgICAgICAgICAgICAgIF9kYnVzX2xpc3RfZ2V0X2xlbmd0aCAoJnBvbGljeS0+cnVsZXMpKTsKK30KKworZGJ1c19ib29sX3QKK2J1c19jbGllbnRfcG9saWN5X2FwcGVuZF9ydWxlIChCdXNDbGllbnRQb2xpY3kgKnBvbGljeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNQb2xpY3lSdWxlICAgKnJ1bGUpCit7CisgIF9kYnVzX3ZlcmJvc2UgKCJBcHBlbmRpbmcgcnVsZSAlcCB3aXRoIHR5cGUgJWQgdG8gcG9saWN5ICVwXG4iLAorICAgICAgICAgICAgICAgICBydWxlLCBydWxlLT50eXBlLCBwb2xpY3kpOworICAKKyAgaWYgKCFfZGJ1c19saXN0X2FwcGVuZCAoJnBvbGljeS0+cnVsZXMsIHJ1bGUpKQorICAgIHJldHVybiBGQUxTRTsKKworICBidXNfcG9saWN5X3J1bGVfcmVmIChydWxlKTsKKworICByZXR1cm4gVFJVRTsKK30KKworZGJ1c19ib29sX3QKK2J1c19jbGllbnRfcG9saWN5X2NoZWNrX2Nhbl9zZW5kIChCdXNDbGllbnRQb2xpY3kgKnBvbGljeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNSZWdpc3RyeSAgICAgKnJlZ2lzdHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgcmVxdWVzdGVkX3JlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICAqcmVjZWl2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfaW50MzJfdCAgICAqdG9nZ2xlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgKmxvZykKK3sKKyAgREJ1c0xpc3QgKmxpbms7CisgIGRidXNfYm9vbF90IGFsbG93ZWQ7CisgIAorICAvKiBwb2xpY3ktPnJ1bGVzIGlzIGluIHRoZSBvcmRlciB0aGUgcnVsZXMgYXBwZWFyZWQKKyAgICogaW4gdGhlIGNvbmZpZyBmaWxlLCBpLmUuIGxhc3QgcnVsZSB0aGF0IGFwcGxpZXMgd2lucworICAgKi8KKworICBfZGJ1c192ZXJib3NlICgiICAocG9saWN5KSBjaGVja2luZyBzZW5kIHJ1bGVzXG4iKTsKKyAgKnRvZ2dsZXMgPSAwOworICAKKyAgYWxsb3dlZCA9IEZBTFNFOworICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJnBvbGljeS0+cnVsZXMpOworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIEJ1c1BvbGljeVJ1bGUgKnJ1bGUgPSBsaW5rLT5kYXRhOworCisgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmcG9saWN5LT5ydWxlcywgbGluayk7CisgICAgICAKKyAgICAgIC8qIFJ1bGUgaXMgc2tpcHBlZCBpZiBpdCBzcGVjaWZpZXMgYSBkaWZmZXJlbnQKKyAgICAgICAqIG1lc3NhZ2UgbmFtZSBmcm9tIHRoZSBtZXNzYWdlLCBvciBhIGRpZmZlcmVudAorICAgICAgICogZGVzdGluYXRpb24gZnJvbSB0aGUgbWVzc2FnZQorICAgICAgICovCisgICAgICAKKyAgICAgIGlmIChydWxlLT50eXBlICE9IEJVU19QT0xJQ1lfUlVMRV9TRU5EKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiAgKHBvbGljeSkgc2tpcHBpbmcgbm9uLXNlbmQgcnVsZVxuIik7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgaWYgKHJ1bGUtPmQuc2VuZC5tZXNzYWdlX3R5cGUgIT0gREJVU19NRVNTQUdFX1RZUEVfSU5WQUxJRCkKKyAgICAgICAgeworICAgICAgICAgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKG1lc3NhZ2UpICE9IHJ1bGUtPmQuc2VuZC5tZXNzYWdlX3R5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgIChwb2xpY3kpIHNraXBwaW5nIHJ1bGUgZm9yIGRpZmZlcmVudCBtZXNzYWdlIHR5cGVcbiIpOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAvKiBJZiBpdCdzIGEgcmVwbHksIHRoZSByZXF1ZXN0ZWRfcmVwbHkgZmxhZyBraWNrcyBpbiAqLworICAgICAgaWYgKGRidXNfbWVzc2FnZV9nZXRfcmVwbHlfc2VyaWFsIChtZXNzYWdlKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgLyogZm9yIGFsbG93LCByZXF1ZXN0ZWRfcmVwbHk9dHJ1ZSBtZWFucyB0aGUgcnVsZSBhcHBsaWVzCisgICAgICAgICAgICogb25seSB3aGVuIHJlcGx5IHdhcyByZXF1ZXN0ZWQuIHJlcXVlc3RlZF9yZXBseT1mYWxzZSBtZWFucworICAgICAgICAgICAqIGFsd2F5cyBhbGxvdy4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBpZiAoIXJlcXVlc3RlZF9yZXBseSAmJiBydWxlLT5hbGxvdyAmJiBydWxlLT5kLnNlbmQucmVxdWVzdGVkX3JlcGx5ICYmICFydWxlLT5kLnNlbmQuZWF2ZXNkcm9wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiICAocG9saWN5KSBza2lwcGluZyBhbGxvdyBydWxlIHNpbmNlIGl0IG9ubHkgYXBwbGllcyB0byByZXF1ZXN0ZWQgcmVwbGllcyBhbmQgZG9lcyBub3QgYWxsb3cgZWF2ZXNkcm9wcGluZ1xuIik7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgLyogZm9yIGRlbnksIHJlcXVlc3RlZF9yZXBseT1mYWxzZSBtZWFucyB0aGUgcnVsZSBhcHBsaWVzIG9ubHkKKyAgICAgICAgICAgKiB3aGVuIHRoZSByZXBseSB3YXMgbm90IHJlcXVlc3RlZC4gcmVxdWVzdGVkX3JlcGx5PXRydWUgbWVhbnMgdGhlCisgICAgICAgICAgICogcnVsZSBhbHdheXMgYXBwbGllcy4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBpZiAocmVxdWVzdGVkX3JlcGx5ICYmICFydWxlLT5hbGxvdyAmJiAhcnVsZS0+ZC5zZW5kLnJlcXVlc3RlZF9yZXBseSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiAgKHBvbGljeSkgc2tpcHBpbmcgZGVueSBydWxlIHNpbmNlIGl0IG9ubHkgYXBwbGllcyB0byB1bnJlcXVlc3RlZCByZXBsaWVzXG4iKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIAorICAgICAgaWYgKHJ1bGUtPmQuc2VuZC5wYXRoICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoZGJ1c19tZXNzYWdlX2dldF9wYXRoIChtZXNzYWdlKSAhPSBOVUxMICYmCisgICAgICAgICAgICAgIHN0cmNtcCAoZGJ1c19tZXNzYWdlX2dldF9wYXRoIChtZXNzYWdlKSwKKyAgICAgICAgICAgICAgICAgICAgICBydWxlLT5kLnNlbmQucGF0aCkgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiAgKHBvbGljeSkgc2tpcHBpbmcgcnVsZSBmb3IgZGlmZmVyZW50IHBhdGhcbiIpOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgCisgICAgICBpZiAocnVsZS0+ZC5zZW5kLmludGVyZmFjZSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgLyogVGhlIGludGVyZmFjZSBpcyBvcHRpb25hbCBpbiBtZXNzYWdlcy4gRm9yIGFsbG93IHJ1bGVzLCBpZiB0aGUgbWVzc2FnZQorICAgICAgICAgICAqIGhhcyBubyBpbnRlcmZhY2Ugd2Ugd2FudCB0byBza2lwIHRoZSBydWxlIChhbmQgdGh1cyBub3QgYWxsb3cpOworICAgICAgICAgICAqIGZvciBkZW55IHJ1bGVzLCBpZiB0aGUgbWVzc2FnZSBoYXMgbm8gaW50ZXJmYWNlIHdlIHdhbnQgdG8gdXNlIHRoZQorICAgICAgICAgICAqIHJ1bGUgKGFuZCB0aHVzIGRlbnkpLgorICAgICAgICAgICAqLworICAgICAgICAgIGRidXNfYm9vbF90IG5vX2ludGVyZmFjZTsKKworICAgICAgICAgIG5vX2ludGVyZmFjZSA9IGRidXNfbWVzc2FnZV9nZXRfaW50ZXJmYWNlIChtZXNzYWdlKSA9PSBOVUxMOworICAgICAgICAgIAorICAgICAgICAgIGlmICgobm9faW50ZXJmYWNlICYmIHJ1bGUtPmFsbG93KSB8fAorICAgICAgICAgICAgICAoIW5vX2ludGVyZmFjZSAmJiAKKyAgICAgICAgICAgICAgIHN0cmNtcCAoZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG1lc3NhZ2UpLAorICAgICAgICAgICAgICAgICAgICAgICBydWxlLT5kLnNlbmQuaW50ZXJmYWNlKSAhPSAwKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiAgKHBvbGljeSkgc2tpcHBpbmcgcnVsZSBmb3IgZGlmZmVyZW50IGludGVyZmFjZVxuIik7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgIGlmIChydWxlLT5kLnNlbmQubWVtYmVyICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKG1lc3NhZ2UpICE9IE5VTEwgJiYKKyAgICAgICAgICAgICAgc3RyY21wIChkYnVzX21lc3NhZ2VfZ2V0X21lbWJlciAobWVzc2FnZSksCisgICAgICAgICAgICAgICAgICAgICAgcnVsZS0+ZC5zZW5kLm1lbWJlcikgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiAgKHBvbGljeSkgc2tpcHBpbmcgcnVsZSBmb3IgZGlmZmVyZW50IG1lbWJlclxuIik7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgIGlmIChydWxlLT5kLnNlbmQuZXJyb3IgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X2Vycm9yX25hbWUgKG1lc3NhZ2UpICE9IE5VTEwgJiYKKyAgICAgICAgICAgICAgc3RyY21wIChkYnVzX21lc3NhZ2VfZ2V0X2Vycm9yX25hbWUgKG1lc3NhZ2UpLAorICAgICAgICAgICAgICAgICAgICAgIHJ1bGUtPmQuc2VuZC5lcnJvcikgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiAgKHBvbGljeSkgc2tpcHBpbmcgcnVsZSBmb3IgZGlmZmVyZW50IGVycm9yIG5hbWVcbiIpOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICBpZiAocnVsZS0+ZC5zZW5kLmJyb2FkY2FzdCAhPSBCVVNfUE9MSUNZX1RSSVNUQVRFX0FOWSkKKyAgICAgICAgeworICAgICAgICAgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X2Rlc3RpbmF0aW9uIChtZXNzYWdlKSA9PSBOVUxMICYmCisgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkgPT0gREJVU19NRVNTQUdFX1RZUEVfU0lHTkFMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvKiBpdCdzIGEgYnJvYWRjYXN0ICovCisgICAgICAgICAgICAgIGlmIChydWxlLT5kLnNlbmQuYnJvYWRjYXN0ID09IEJVU19QT0xJQ1lfVFJJU1RBVEVfRkFMU0UpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiAgKHBvbGljeSkgc2tpcHBpbmcgcnVsZSBiZWNhdXNlIG1lc3NhZ2UgaXMgYSBicm9hZGNhc3RcbiIpOworICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIC8qIGVsc2UgaXQgaXNuJ3QgYSBicm9hZGNhc3Q6IHRoZXJlIGlzIHNvbWUgZGVzdGluYXRpb24gKi8KKyAgICAgICAgICBlbHNlIGlmIChydWxlLT5kLnNlbmQuYnJvYWRjYXN0ID09IEJVU19QT0xJQ1lfVFJJU1RBVEVfVFJVRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiAgKHBvbGljeSkgc2tpcHBpbmcgcnVsZSBiZWNhdXNlIG1lc3NhZ2UgaXMgbm90IGEgYnJvYWRjYXN0XG4iKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgaWYgKHJ1bGUtPmQuc2VuZC5kZXN0aW5hdGlvbiAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgLyogcmVjZWl2ZXIgY2FuIGJlIE5VTEwgZm9yIG1lc3NhZ2VzIHRoYXQgYXJlIHNlbnQgdG8gdGhlCisgICAgICAgICAgICogbWVzc2FnZSBidXMgaXRzZWxmLCB3ZSBjaGVjayB0aGUgc3RyaW5ncyBpbiB0aGF0IGNhc2UgYXMKKyAgICAgICAgICAgKiBidWlsdC1pbiBzZXJ2aWNlcyBkb24ndCBoYXZlIGEgREJ1c0Nvbm5lY3Rpb24gYnV0IG1lc3NhZ2VzCisgICAgICAgICAgICogdG8gdGhlbSBoYXZlIGEgZGVzdGluYXRpb24gc2VydmljZSBuYW1lLgorICAgICAgICAgICAqCisgICAgICAgICAgICogU2ltaWxhcmx5LCByZWNlaXZlciBjYW4gYmUgTlVMTCB3aGVuIHdlJ3JlIGRlY2lkaW5nIHdoZXRoZXIKKyAgICAgICAgICAgKiBhY3RpdmF0aW9uIHNob3VsZCBiZSBhbGxvd2VkOyB3ZSBtYWtlIHRoZSBhdXRob3JpemF0aW9uIGRlY2lzaW9uCisgICAgICAgICAgICogb24gdGhlIGFzc3VtcHRpb24gdGhhdCB0aGUgYWN0aXZhdGVkIHNlcnZpY2Ugd2lsbCBoYXZlIHRoZQorICAgICAgICAgICAqIHJlcXVlc3RlZCBuYW1lIGFuZCBubyBvdGhlcnMuCisgICAgICAgICAgICovCisgICAgICAgICAgaWYgKHJlY2VpdmVyID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmICghZGJ1c19tZXNzYWdlX2hhc19kZXN0aW5hdGlvbiAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlLT5kLnNlbmQuZGVzdGluYXRpb24pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgIChwb2xpY3kpIHNraXBwaW5nIHJ1bGUgYmVjYXVzZSBtZXNzYWdlIGRlc3QgaXMgbm90ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZS0+ZC5zZW5kLmRlc3RpbmF0aW9uKTsKKyAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIERCdXNTdHJpbmcgc3RyOworICAgICAgICAgICAgICBCdXNTZXJ2aWNlICpzZXJ2aWNlOworICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZzdHIsIHJ1bGUtPmQuc2VuZC5kZXN0aW5hdGlvbik7CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBzZXJ2aWNlID0gYnVzX3JlZ2lzdHJ5X2xvb2t1cCAocmVnaXN0cnksICZzdHIpOworICAgICAgICAgICAgICBpZiAoc2VydmljZSA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgIChwb2xpY3kpIHNraXBwaW5nIHJ1bGUgYmVjYXVzZSBkZXN0ICVzIGRvZXNuJ3QgZXhpc3RcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlLT5kLnNlbmQuZGVzdGluYXRpb24pOworICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGlmICghYnVzX3NlcnZpY2VfaGFzX293bmVyIChzZXJ2aWNlLCByZWNlaXZlcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiAgKHBvbGljeSkgc2tpcHBpbmcgcnVsZSBiZWNhdXNlIGRlc3QgJXMgaXNuJ3Qgb3duZWQgYnkgcmVjZWl2ZXJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlLT5kLnNlbmQuZGVzdGluYXRpb24pOworICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgIGlmIChydWxlLT5kLnNlbmQubWluX2ZkcyA+IDAgfHwKKyAgICAgICAgICBydWxlLT5kLnNlbmQubWF4X2ZkcyA8IERCVVNfTUFYSU1VTV9NRVNTQUdFX1VOSVhfRkRTKQorICAgICAgICB7CisgICAgICAgICAgdW5zaWduZWQgaW50IG5fZmRzID0gX2RidXNfbWVzc2FnZV9nZXRfbl91bml4X2ZkcyAobWVzc2FnZSk7CisKKyAgICAgICAgICBpZiAobl9mZHMgPCBydWxlLT5kLnNlbmQubWluX2ZkcyB8fCBuX2ZkcyA+IHJ1bGUtPmQuc2VuZC5tYXhfZmRzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiICAocG9saWN5KSBza2lwcGluZyBydWxlIGJlY2F1c2UgbWVzc2FnZSBoYXMgJXUgZmRzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFuZCB0aGF0IGlzIG91dHNpZGUgcmFuZ2UgWyV1LCV1XSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5fZmRzLCBydWxlLT5kLnNlbmQubWluX2ZkcywgcnVsZS0+ZC5zZW5kLm1heF9mZHMpOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAvKiBVc2UgdGhpcyBydWxlICovCisgICAgICBhbGxvd2VkID0gcnVsZS0+YWxsb3c7CisgICAgICAqbG9nID0gcnVsZS0+ZC5zZW5kLmxvZzsKKyAgICAgICgqdG9nZ2xlcykrKzsKKworICAgICAgX2RidXNfdmVyYm9zZSAoIiAgKHBvbGljeSkgdXNlZCBydWxlLCBhbGxvdyBub3cgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgIGFsbG93ZWQpOworICAgIH0KKworICByZXR1cm4gYWxsb3dlZDsKK30KKworLyogU2VlIGRvY3Mgb24gd2hhdCB0aGUgYXJncyBtZWFuIG9uIGJ1c19jb250ZXh0X2NoZWNrX3NlY3VyaXR5X3BvbGljeSgpCisgKiBjb21tZW50CisgKi8KK2RidXNfYm9vbF90CitidXNfY2xpZW50X3BvbGljeV9jaGVja19jYW5fcmVjZWl2ZSAoQnVzQ2xpZW50UG9saWN5ICpwb2xpY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzUmVnaXN0cnkgICAgICpyZWdpc3RyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgIHJlcXVlc3RlZF9yZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAgKnNlbmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAgKmFkZHJlc3NlZF9yZWNpcGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gICpwcm9wb3NlZF9yZWNpcGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfaW50MzJfdCAgICAqdG9nZ2xlcykKK3sKKyAgREJ1c0xpc3QgKmxpbms7CisgIGRidXNfYm9vbF90IGFsbG93ZWQ7CisgIGRidXNfYm9vbF90IGVhdmVzZHJvcHBpbmc7CisKKyAgZWF2ZXNkcm9wcGluZyA9CisgICAgYWRkcmVzc2VkX3JlY2lwaWVudCAhPSBwcm9wb3NlZF9yZWNpcGllbnQgJiYKKyAgICBkYnVzX21lc3NhZ2VfZ2V0X2Rlc3RpbmF0aW9uIChtZXNzYWdlKSAhPSBOVUxMOworICAKKyAgLyogcG9saWN5LT5ydWxlcyBpcyBpbiB0aGUgb3JkZXIgdGhlIHJ1bGVzIGFwcGVhcmVkCisgICAqIGluIHRoZSBjb25maWcgZmlsZSwgaS5lLiBsYXN0IHJ1bGUgdGhhdCBhcHBsaWVzIHdpbnMKKyAgICovCisKKyAgX2RidXNfdmVyYm9zZSAoIiAgKHBvbGljeSkgY2hlY2tpbmcgcmVjZWl2ZSBydWxlcywgZWF2ZXNkcm9wcGluZyA9ICVkXG4iLCBlYXZlc2Ryb3BwaW5nKTsKKyAgKnRvZ2dsZXMgPSAwOworICAKKyAgYWxsb3dlZCA9IEZBTFNFOworICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJnBvbGljeS0+cnVsZXMpOworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIEJ1c1BvbGljeVJ1bGUgKnJ1bGUgPSBsaW5rLT5kYXRhOworCisgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmcG9saWN5LT5ydWxlcywgbGluayk7ICAgICAgCisgICAgICAKKyAgICAgIGlmIChydWxlLT50eXBlICE9IEJVU19QT0xJQ1lfUlVMRV9SRUNFSVZFKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiAgKHBvbGljeSkgc2tpcHBpbmcgbm9uLXJlY2VpdmUgcnVsZVxuIik7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgaWYgKHJ1bGUtPmQucmVjZWl2ZS5tZXNzYWdlX3R5cGUgIT0gREJVU19NRVNTQUdFX1RZUEVfSU5WQUxJRCkKKyAgICAgICAgeworICAgICAgICAgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKG1lc3NhZ2UpICE9IHJ1bGUtPmQucmVjZWl2ZS5tZXNzYWdlX3R5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgIChwb2xpY3kpIHNraXBwaW5nIHJ1bGUgZm9yIGRpZmZlcmVudCBtZXNzYWdlIHR5cGVcbiIpOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAvKiBmb3IgYWxsb3csIGVhdmVzZHJvcD1mYWxzZSBtZWFucyB0aGUgcnVsZSBkb2Vzbid0IGFwcGx5IHdoZW4KKyAgICAgICAqIGVhdmVzZHJvcHBpbmcuIGVhdmVzZHJvcD10cnVlIG1lYW5zIGFsd2F5cyBhbGxvdy4KKyAgICAgICAqLworICAgICAgaWYgKGVhdmVzZHJvcHBpbmcgJiYgcnVsZS0+YWxsb3cgJiYgIXJ1bGUtPmQucmVjZWl2ZS5lYXZlc2Ryb3ApCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiICAocG9saWN5KSBza2lwcGluZyBhbGxvdyBydWxlIHNpbmNlIGl0IGRvZXNuJ3QgYXBwbHkgdG8gZWF2ZXNkcm9wcGluZ1xuIik7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgLyogZm9yIGRlbnksIGVhdmVzZHJvcD10cnVlIG1lYW5zIHRoZSBydWxlIGFwcGxpZXMgb25seSB3aGVuCisgICAgICAgKiBlYXZlc2Ryb3BwaW5nOyBlYXZlc2Ryb3A9ZmFsc2UgbWVhbnMgYWx3YXlzIGRlbnkuCisgICAgICAgKi8KKyAgICAgIGlmICghZWF2ZXNkcm9wcGluZyAmJiAhcnVsZS0+YWxsb3cgJiYgcnVsZS0+ZC5yZWNlaXZlLmVhdmVzZHJvcCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgIChwb2xpY3kpIHNraXBwaW5nIGRlbnkgcnVsZSBzaW5jZSBpdCBvbmx5IGFwcGxpZXMgdG8gZWF2ZXNkcm9wcGluZ1xuIik7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgLyogSWYgaXQncyBhIHJlcGx5LCB0aGUgcmVxdWVzdGVkX3JlcGx5IGZsYWcga2lja3MgaW4gKi8KKyAgICAgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X3JlcGx5X3NlcmlhbCAobWVzc2FnZSkgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgIC8qIGZvciBhbGxvdywgcmVxdWVzdGVkX3JlcGx5PXRydWUgbWVhbnMgdGhlIHJ1bGUgYXBwbGllcworICAgICAgICAgICAqIG9ubHkgd2hlbiByZXBseSB3YXMgcmVxdWVzdGVkLiByZXF1ZXN0ZWRfcmVwbHk9ZmFsc2UgbWVhbnMKKyAgICAgICAgICAgKiBhbHdheXMgYWxsb3cuCisgICAgICAgICAgICovCisgICAgICAgICAgaWYgKCFyZXF1ZXN0ZWRfcmVwbHkgJiYgcnVsZS0+YWxsb3cgJiYgcnVsZS0+ZC5yZWNlaXZlLnJlcXVlc3RlZF9yZXBseSAmJiAhcnVsZS0+ZC5yZWNlaXZlLmVhdmVzZHJvcCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiAgKHBvbGljeSkgc2tpcHBpbmcgYWxsb3cgcnVsZSBzaW5jZSBpdCBvbmx5IGFwcGxpZXMgdG8gcmVxdWVzdGVkIHJlcGxpZXMgYW5kIGRvZXMgbm90IGFsbG93IGVhdmVzZHJvcHBpbmdcbiIpOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIC8qIGZvciBkZW55LCByZXF1ZXN0ZWRfcmVwbHk9ZmFsc2UgbWVhbnMgdGhlIHJ1bGUgYXBwbGllcyBvbmx5CisgICAgICAgICAgICogd2hlbiB0aGUgcmVwbHkgd2FzIG5vdCByZXF1ZXN0ZWQuIHJlcXVlc3RlZF9yZXBseT10cnVlIG1lYW5zIHRoZQorICAgICAgICAgICAqIHJ1bGUgYWx3YXlzIGFwcGxpZXMuCisgICAgICAgICAgICovCisgICAgICAgICAgaWYgKHJlcXVlc3RlZF9yZXBseSAmJiAhcnVsZS0+YWxsb3cgJiYgIXJ1bGUtPmQucmVjZWl2ZS5yZXF1ZXN0ZWRfcmVwbHkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgIChwb2xpY3kpIHNraXBwaW5nIGRlbnkgcnVsZSBzaW5jZSBpdCBvbmx5IGFwcGxpZXMgdG8gdW5yZXF1ZXN0ZWQgcmVwbGllc1xuIik7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAKKyAgICAgIGlmIChydWxlLT5kLnJlY2VpdmUucGF0aCAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGRidXNfbWVzc2FnZV9nZXRfcGF0aCAobWVzc2FnZSkgIT0gTlVMTCAmJgorICAgICAgICAgICAgICBzdHJjbXAgKGRidXNfbWVzc2FnZV9nZXRfcGF0aCAobWVzc2FnZSksCisgICAgICAgICAgICAgICAgICAgICAgcnVsZS0+ZC5yZWNlaXZlLnBhdGgpICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgIChwb2xpY3kpIHNraXBwaW5nIHJ1bGUgZm9yIGRpZmZlcmVudCBwYXRoXG4iKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIAorICAgICAgaWYgKHJ1bGUtPmQucmVjZWl2ZS5pbnRlcmZhY2UgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIC8qIFRoZSBpbnRlcmZhY2UgaXMgb3B0aW9uYWwgaW4gbWVzc2FnZXMuIEZvciBhbGxvdyBydWxlcywgaWYgdGhlIG1lc3NhZ2UKKyAgICAgICAgICAgKiBoYXMgbm8gaW50ZXJmYWNlIHdlIHdhbnQgdG8gc2tpcCB0aGUgcnVsZSAoYW5kIHRodXMgbm90IGFsbG93KTsKKyAgICAgICAgICAgKiBmb3IgZGVueSBydWxlcywgaWYgdGhlIG1lc3NhZ2UgaGFzIG5vIGludGVyZmFjZSB3ZSB3YW50IHRvIHVzZSB0aGUKKyAgICAgICAgICAgKiBydWxlIChhbmQgdGh1cyBkZW55KS4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBkYnVzX2Jvb2xfdCBub19pbnRlcmZhY2U7CisKKyAgICAgICAgICBub19pbnRlcmZhY2UgPSBkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAobWVzc2FnZSkgPT0gTlVMTDsKKyAgICAgICAgICAKKyAgICAgICAgICBpZiAoKG5vX2ludGVyZmFjZSAmJiBydWxlLT5hbGxvdykgfHwKKyAgICAgICAgICAgICAgKCFub19pbnRlcmZhY2UgJiYKKyAgICAgICAgICAgICAgIHN0cmNtcCAoZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG1lc3NhZ2UpLAorICAgICAgICAgICAgICAgICAgICAgICBydWxlLT5kLnJlY2VpdmUuaW50ZXJmYWNlKSAhPSAwKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiAgKHBvbGljeSkgc2tpcHBpbmcgcnVsZSBmb3IgZGlmZmVyZW50IGludGVyZmFjZVxuIik7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9ICAgICAgCisKKyAgICAgIGlmIChydWxlLT5kLnJlY2VpdmUubWVtYmVyICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKG1lc3NhZ2UpICE9IE5VTEwgJiYKKyAgICAgICAgICAgICAgc3RyY21wIChkYnVzX21lc3NhZ2VfZ2V0X21lbWJlciAobWVzc2FnZSksCisgICAgICAgICAgICAgICAgICAgICAgcnVsZS0+ZC5yZWNlaXZlLm1lbWJlcikgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiAgKHBvbGljeSkgc2tpcHBpbmcgcnVsZSBmb3IgZGlmZmVyZW50IG1lbWJlclxuIik7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgIGlmIChydWxlLT5kLnJlY2VpdmUuZXJyb3IgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X2Vycm9yX25hbWUgKG1lc3NhZ2UpICE9IE5VTEwgJiYKKyAgICAgICAgICAgICAgc3RyY21wIChkYnVzX21lc3NhZ2VfZ2V0X2Vycm9yX25hbWUgKG1lc3NhZ2UpLAorICAgICAgICAgICAgICAgICAgICAgIHJ1bGUtPmQucmVjZWl2ZS5lcnJvcikgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiAgKHBvbGljeSkgc2tpcHBpbmcgcnVsZSBmb3IgZGlmZmVyZW50IGVycm9yIG5hbWVcbiIpOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgCisgICAgICBpZiAocnVsZS0+ZC5yZWNlaXZlLm9yaWdpbiAhPSBOVUxMKQorICAgICAgICB7ICAgICAgICAgIAorICAgICAgICAgIC8qIHNlbmRlciBjYW4gYmUgTlVMTCBmb3IgbWVzc2FnZXMgdGhhdCBvcmlnaW5hdGUgZnJvbSB0aGUKKyAgICAgICAgICAgKiBtZXNzYWdlIGJ1cyBpdHNlbGYsIHdlIGNoZWNrIHRoZSBzdHJpbmdzIGluIHRoYXQgY2FzZSBhcworICAgICAgICAgICAqIGJ1aWx0LWluIHNlcnZpY2VzIGRvbid0IGhhdmUgYSBEQnVzQ29ubmVjdGlvbiBidXQgd2lsbAorICAgICAgICAgICAqIHN0aWxsIHNldCB0aGUgc2VuZGVyIG9uIHRoZWlyIG1lc3NhZ2VzLgorICAgICAgICAgICAqLworICAgICAgICAgIGlmIChzZW5kZXIgPT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfaGFzX3NlbmRlciAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZS0+ZC5yZWNlaXZlLm9yaWdpbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiAgKHBvbGljeSkgc2tpcHBpbmcgcnVsZSBiZWNhdXNlIG1lc3NhZ2Ugc2VuZGVyIGlzIG5vdCAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGUtPmQucmVjZWl2ZS5vcmlnaW4pOworICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgQnVzU2VydmljZSAqc2VydmljZTsKKyAgICAgICAgICAgICAgREJ1c1N0cmluZyBzdHI7CisKKyAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZzdHIsIHJ1bGUtPmQucmVjZWl2ZS5vcmlnaW4pOworICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgc2VydmljZSA9IGJ1c19yZWdpc3RyeV9sb29rdXAgKHJlZ2lzdHJ5LCAmc3RyKTsKKyAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIGlmIChzZXJ2aWNlID09IE5VTEwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiAgKHBvbGljeSkgc2tpcHBpbmcgcnVsZSBiZWNhdXNlIG9yaWdpbiAlcyBkb2Vzbid0IGV4aXN0XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZS0+ZC5yZWNlaXZlLm9yaWdpbik7CisgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgaWYgKCFidXNfc2VydmljZV9oYXNfb3duZXIgKHNlcnZpY2UsIHNlbmRlcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiAgKHBvbGljeSkgc2tpcHBpbmcgcnVsZSBiZWNhdXNlIG9yaWdpbiAlcyBpc24ndCBvd25lZCBieSBzZW5kZXJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlLT5kLnJlY2VpdmUub3JpZ2luKTsKKyAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICBpZiAocnVsZS0+ZC5yZWNlaXZlLm1pbl9mZHMgPiAwIHx8CisgICAgICAgICAgcnVsZS0+ZC5yZWNlaXZlLm1heF9mZHMgPCBEQlVTX01BWElNVU1fTUVTU0FHRV9VTklYX0ZEUykKKyAgICAgICAgeworICAgICAgICAgIHVuc2lnbmVkIGludCBuX2ZkcyA9IF9kYnVzX21lc3NhZ2VfZ2V0X25fdW5peF9mZHMgKG1lc3NhZ2UpOworCisgICAgICAgICAgaWYgKG5fZmRzIDwgcnVsZS0+ZC5yZWNlaXZlLm1pbl9mZHMgfHwgbl9mZHMgPiBydWxlLT5kLnJlY2VpdmUubWF4X2ZkcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiAgKHBvbGljeSkgc2tpcHBpbmcgcnVsZSBiZWNhdXNlIG1lc3NhZ2UgaGFzICV1IGZkcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbmQgdGhhdCBpcyBvdXRzaWRlIHJhbmdlIFsldSwldV0iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuX2ZkcywgcnVsZS0+ZC5yZWNlaXZlLm1pbl9mZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGUtPmQucmVjZWl2ZS5tYXhfZmRzKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgLyogVXNlIHRoaXMgcnVsZSAqLworICAgICAgYWxsb3dlZCA9IHJ1bGUtPmFsbG93OworICAgICAgKCp0b2dnbGVzKSsrOworCisgICAgICBfZGJ1c192ZXJib3NlICgiICAocG9saWN5KSB1c2VkIHJ1bGUsIGFsbG93IG5vdyA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZCk7CisgICAgfQorCisgIHJldHVybiBhbGxvd2VkOworfQorCisKKworc3RhdGljIGRidXNfYm9vbF90CitidXNfcnVsZXNfY2hlY2tfY2FuX293biAoREJ1c0xpc3QgKnJ1bGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKnNlcnZpY2VfbmFtZSkKK3sKKyAgREJ1c0xpc3QgKmxpbms7CisgIGRidXNfYm9vbF90IGFsbG93ZWQ7CisgIAorICAvKiBydWxlcyBpcyBpbiB0aGUgb3JkZXIgdGhlIHJ1bGVzIGFwcGVhcmVkCisgICAqIGluIHRoZSBjb25maWcgZmlsZSwgaS5lLiBsYXN0IHJ1bGUgdGhhdCBhcHBsaWVzIHdpbnMKKyAgICovCisKKyAgYWxsb3dlZCA9IEZBTFNFOworICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJnJ1bGVzKTsKKyAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBCdXNQb2xpY3lSdWxlICpydWxlID0gbGluay0+ZGF0YTsKKworICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJnJ1bGVzLCBsaW5rKTsKKyAgICAgIAorICAgICAgLyogUnVsZSBpcyBza2lwcGVkIGlmIGl0IHNwZWNpZmllcyBhIGRpZmZlcmVudCBzZXJ2aWNlIG5hbWUgZnJvbQorICAgICAgICogdGhlIGRlc2lyZWQgb25lLgorICAgICAgICovCisgICAgICAKKyAgICAgIGlmIChydWxlLT50eXBlICE9IEJVU19QT0xJQ1lfUlVMRV9PV04pCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICBpZiAoIXJ1bGUtPmQub3duLnByZWZpeCAmJiBydWxlLT5kLm93bi5zZXJ2aWNlX25hbWUgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2VxdWFsX2Nfc3RyIChzZXJ2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGUtPmQub3duLnNlcnZpY2VfbmFtZSkpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAocnVsZS0+ZC5vd24ucHJlZml4KQorICAgICAgICB7CisgICAgICAgICAgY29uc3QgY2hhciAqZGF0YTsKKyAgICAgICAgICBjaGFyIG5leHRfY2hhcjsKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19zdGFydHNfd2l0aF9jX3N0ciAoc2VydmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlLT5kLm93bi5zZXJ2aWNlX25hbWUpKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICBkYXRhID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChzZXJ2aWNlX25hbWUpOworICAgICAgICAgIG5leHRfY2hhciA9IGRhdGFbc3RybGVuIChydWxlLT5kLm93bi5zZXJ2aWNlX25hbWUpXTsKKyAgICAgICAgICBpZiAobmV4dF9jaGFyICE9ICdcMCcgJiYgbmV4dF9jaGFyICE9ICcuJykKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgIC8qIFVzZSB0aGlzIHJ1bGUgKi8KKyAgICAgIGFsbG93ZWQgPSBydWxlLT5hbGxvdzsKKyAgICB9CisKKyAgcmV0dXJuIGFsbG93ZWQ7Cit9CisKK2RidXNfYm9vbF90CitidXNfY2xpZW50X3BvbGljeV9jaGVja19jYW5fb3duIChCdXNDbGllbnRQb2xpY3kgICpwb2xpY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpzZXJ2aWNlX25hbWUpCit7CisgIHJldHVybiBidXNfcnVsZXNfY2hlY2tfY2FuX293biAocG9saWN5LT5ydWxlcywgc2VydmljZV9uYW1lKTsKK30KKworI2lmZGVmIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTCitkYnVzX2Jvb2xfdAorYnVzX3BvbGljeV9jaGVja19jYW5fb3duIChCdXNQb2xpY3kgICpwb2xpY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKnNlcnZpY2VfbmFtZSkKK3sKKyAgcmV0dXJuIGJ1c19ydWxlc19jaGVja19jYW5fb3duIChwb2xpY3ktPmRlZmF1bHRfcnVsZXMsIHNlcnZpY2VfbmFtZSk7Cit9CisjZW5kaWYgLyogREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMgKi8KKwpkaWZmIC0tZ2l0IGEvYnVzL3BvbGljeS5oIGIvYnVzL3BvbGljeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjNDNmZmEKLS0tIC9kZXYvbnVsbAorKysgYi9idXMvcG9saWN5LmgKQEAgLTAsMCArMSwxODEgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogcG9saWN5LmggIEJ1cyBzZWN1cml0eSBwb2xpY3kKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgIFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBCVVNfUE9MSUNZX0gKKyNkZWZpbmUgQlVTX1BPTElDWV9ICisKKyNpbmNsdWRlIDxkYnVzL2RidXMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc3RyaW5nLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWxpc3QuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc3lzZGVwcy5oPgorI2luY2x1ZGUgImJ1cy5oIgorCit0eXBlZGVmIGVudW0KK3sKKyAgQlVTX1BPTElDWV9SVUxFX1NFTkQsCisgIEJVU19QT0xJQ1lfUlVMRV9SRUNFSVZFLAorICBCVVNfUE9MSUNZX1JVTEVfT1dOLAorICBCVVNfUE9MSUNZX1JVTEVfVVNFUiwKKyAgQlVTX1BPTElDWV9SVUxFX0dST1VQCit9IEJ1c1BvbGljeVJ1bGVUeXBlOworCit0eXBlZGVmIGVudW0KK3sKKyAgQlVTX1BPTElDWV9UUklTVEFURV9BTlkgPSAwLAorICBCVVNfUE9MSUNZX1RSSVNUQVRFX0ZBTFNFLAorICBCVVNfUE9MSUNZX1RSSVNUQVRFX1RSVUUKK30gQnVzUG9saWN5VHJpc3RhdGU7CisKKy8qKiBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHJ1bGUgYWZmZWN0cyBhIGNvbm5lY3Rpb24sIG9yIHNvbWUgZ2xvYmFsIGl0ZW0gKi8KKyNkZWZpbmUgQlVTX1BPTElDWV9SVUxFX0lTX1BFUl9DTElFTlQocnVsZSkgKCEoKHJ1bGUpLT50eXBlID09IEJVU19QT0xJQ1lfUlVMRV9VU0VSIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJ1bGUpLT50eXBlID09IEJVU19QT0xJQ1lfUlVMRV9HUk9VUCkpCisKK3N0cnVjdCBCdXNQb2xpY3lSdWxlCit7CisgIGludCByZWZjb3VudDsKKyAgCisgIEJ1c1BvbGljeVJ1bGVUeXBlIHR5cGU7CisKKyAgdW5zaWduZWQgaW50IGFsbG93IDogMTsgLyoqPCAjVFJVRSBpZiB0aGlzIGFsbG93cywgI0ZBTFNFIGlmIGl0IGRlbmllcyAqLworICAKKyAgdW5pb24KKyAgeworICAgIHN0cnVjdAorICAgIHsKKyAgICAgIC8qIG1lc3NhZ2UgdHlwZSBjYW4gYmUgREJVU19NRVNTQUdFX1RZUEVfSU5WQUxJRCBtZWFuaW5nICJhbnkiICovCisgICAgICBpbnQgICBtZXNzYWdlX3R5cGU7CisgICAgICAvKiBhbnkgb2YgdGhlc2UgY2FuIGJlIE5VTEwgbWVhbmluZyAiYW55IiAqLworICAgICAgY2hhciAqcGF0aDsKKyAgICAgIGNoYXIgKmludGVyZmFjZTsKKyAgICAgIGNoYXIgKm1lbWJlcjsKKyAgICAgIGNoYXIgKmVycm9yOworICAgICAgY2hhciAqZGVzdGluYXRpb247CisgICAgICB1bnNpZ25lZCBpbnQgbWF4X2ZkczsKKyAgICAgIHVuc2lnbmVkIGludCBtaW5fZmRzOworICAgICAgdW5zaWduZWQgaW50IGVhdmVzZHJvcCA6IDE7CisgICAgICB1bnNpZ25lZCBpbnQgcmVxdWVzdGVkX3JlcGx5IDogMTsKKyAgICAgIHVuc2lnbmVkIGludCBsb2cgOiAxOworICAgICAgdW5zaWduZWQgaW50IGJyb2FkY2FzdCA6IDI7IC8qKjwgcmVhbGx5IGEgQnVzUG9saWN5VHJpc3RhdGUgKi8KKyAgICB9IHNlbmQ7CisKKyAgICBzdHJ1Y3QKKyAgICB7CisgICAgICAvKiBtZXNzYWdlIHR5cGUgY2FuIGJlIERCVVNfTUVTU0FHRV9UWVBFX0lOVkFMSUQgbWVhbmluZyAiYW55IiAqLworICAgICAgaW50ICAgbWVzc2FnZV90eXBlOworICAgICAgLyogYW55IG9mIHRoZXNlIGNhbiBiZSBOVUxMIG1lYW5pbmcgImFueSIgKi8KKyAgICAgIGNoYXIgKnBhdGg7CisgICAgICBjaGFyICppbnRlcmZhY2U7CisgICAgICBjaGFyICptZW1iZXI7CisgICAgICBjaGFyICplcnJvcjsKKyAgICAgIGNoYXIgKm9yaWdpbjsKKyAgICAgIHVuc2lnbmVkIGludCBtYXhfZmRzOworICAgICAgdW5zaWduZWQgaW50IG1pbl9mZHM7CisgICAgICB1bnNpZ25lZCBpbnQgZWF2ZXNkcm9wIDogMTsKKyAgICAgIHVuc2lnbmVkIGludCByZXF1ZXN0ZWRfcmVwbHkgOiAxOworICAgIH0gcmVjZWl2ZTsKKworICAgIHN0cnVjdAorICAgIHsKKyAgICAgIC8qIGNhbiBiZSBOVUxMIG1lYW5pbmcgImFueSIgKi8KKyAgICAgIGNoYXIgKnNlcnZpY2VfbmFtZTsKKyAgICAgIC8qIGlmIHByZWZpeCBpcyBzZXQsIGFueSBuYW1lIHN0YXJ0aW5nIHdpdGggc2VydmljZV9uYW1lIGNhbiBiZSBvd25lZCAqLworICAgICAgdW5zaWduZWQgaW50IHByZWZpeCA6IDE7CisgICAgfSBvd247CisKKyAgICBzdHJ1Y3QKKyAgICB7CisgICAgICAvKiBjYW4gYmUgREJVU19VSURfVU5TRVQgbWVhbmluZyAiYW55IiAqLworICAgICAgZGJ1c191aWRfdCB1aWQ7CisgICAgfSB1c2VyOworCisgICAgc3RydWN0CisgICAgeworICAgICAgLyogY2FuIGJlIERCVVNfR0lEX1VOU0VUIG1lYW5pbmcgImFueSIgKi8KKyAgICAgIGRidXNfZ2lkX3QgZ2lkOworICAgIH0gZ3JvdXA7CisKKyAgfSBkOworfTsKKworQnVzUG9saWN5UnVsZSogYnVzX3BvbGljeV9ydWxlX25ldyAgIChCdXNQb2xpY3lSdWxlVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICBhbGxvdyk7CitCdXNQb2xpY3lSdWxlKiBidXNfcG9saWN5X3J1bGVfcmVmICAgKEJ1c1BvbGljeVJ1bGUgICAgKnJ1bGUpOwordm9pZCAgICAgICAgICAgYnVzX3BvbGljeV9ydWxlX3VucmVmIChCdXNQb2xpY3lSdWxlICAgICpydWxlKTsKKworQnVzUG9saWN5KiAgICAgICBidXNfcG9saWN5X25ldyAgICAgICAgICAgICAgICAgICAodm9pZCk7CitCdXNQb2xpY3kqICAgICAgIGJ1c19wb2xpY3lfcmVmICAgICAgICAgICAgICAgICAgIChCdXNQb2xpY3kgICAgICAgICpwb2xpY3kpOwordm9pZCAgICAgICAgICAgICBidXNfcG9saWN5X3VucmVmICAgICAgICAgICAgICAgICAoQnVzUG9saWN5ICAgICAgICAqcG9saWN5KTsKK0J1c0NsaWVudFBvbGljeSogYnVzX3BvbGljeV9jcmVhdGVfY2xpZW50X3BvbGljeSAgKEJ1c1BvbGljeSAgICAgICAgKnBvbGljeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcik7CitkYnVzX2Jvb2xfdCAgICAgIGJ1c19wb2xpY3lfYWxsb3dfdW5peF91c2VyICAgICAgIChCdXNQb2xpY3kgICAgICAgICpwb2xpY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgICB1aWQpOworZGJ1c19ib29sX3QgICAgICBidXNfcG9saWN5X2FsbG93X3dpbmRvd3NfdXNlciAgICAoQnVzUG9saWN5ICAgICAgICAqcG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqd2luZG93c19zaWQpOworZGJ1c19ib29sX3QgICAgICBidXNfcG9saWN5X2FwcGVuZF9kZWZhdWx0X3J1bGUgICAoQnVzUG9saWN5ICAgICAgICAqcG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzUG9saWN5UnVsZSAgICAqcnVsZSk7CitkYnVzX2Jvb2xfdCAgICAgIGJ1c19wb2xpY3lfYXBwZW5kX21hbmRhdG9yeV9ydWxlIChCdXNQb2xpY3kgICAgICAgICpwb2xpY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNQb2xpY3lSdWxlICAgICpydWxlKTsKK2RidXNfYm9vbF90ICAgICAgYnVzX3BvbGljeV9hcHBlbmRfdXNlcl9ydWxlICAgICAgKEJ1c1BvbGljeSAgICAgICAgKnBvbGljeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWlkX3QgICAgICAgIHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1BvbGljeVJ1bGUgICAgKnJ1bGUpOworZGJ1c19ib29sX3QgICAgICBidXNfcG9saWN5X2FwcGVuZF9ncm91cF9ydWxlICAgICAoQnVzUG9saWN5ICAgICAgICAqcG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19naWRfdCAgICAgICAgZ2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzUG9saWN5UnVsZSAgICAqcnVsZSk7CitkYnVzX2Jvb2xfdCAgICAgIGJ1c19wb2xpY3lfYXBwZW5kX2NvbnNvbGVfcnVsZSAgIChCdXNQb2xpY3kgICAgICAgICpwb2xpY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICAgYXRfY29uc29sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1BvbGljeVJ1bGUgICAgKnJ1bGUpOworCitkYnVzX2Jvb2xfdCAgICAgIGJ1c19wb2xpY3lfbWVyZ2UgICAgICAgICAgICAgICAgIChCdXNQb2xpY3kgICAgICAgICpwb2xpY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNQb2xpY3kgICAgICAgICp0b19hYnNvcmIpOworCitCdXNDbGllbnRQb2xpY3kqIGJ1c19jbGllbnRfcG9saWN5X25ldyAgICAgICAgICAgICAgICh2b2lkKTsKK0J1c0NsaWVudFBvbGljeSogYnVzX2NsaWVudF9wb2xpY3lfcmVmICAgICAgICAgICAgICAgKEJ1c0NsaWVudFBvbGljeSAgKnBvbGljeSk7Cit2b2lkICAgICAgICAgICAgIGJ1c19jbGllbnRfcG9saWN5X3VucmVmICAgICAgICAgICAgIChCdXNDbGllbnRQb2xpY3kgICpwb2xpY3kpOworZGJ1c19ib29sX3QgICAgICBidXNfY2xpZW50X3BvbGljeV9jaGVja19jYW5fc2VuZCAgICAoQnVzQ2xpZW50UG9saWN5ICAqcG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzUmVnaXN0cnkgICAgICAqcmVnaXN0cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICByZXF1ZXN0ZWRfcmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAgICpyZWNlaXZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2ludDMyX3QgICAgICp0b2dnbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAqbG9nKTsKK2RidXNfYm9vbF90ICAgICAgYnVzX2NsaWVudF9wb2xpY3lfY2hlY2tfY2FuX3JlY2VpdmUgKEJ1c0NsaWVudFBvbGljeSAgKnBvbGljeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1JlZ2lzdHJ5ICAgICAgKnJlZ2lzdHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgcmVxdWVzdGVkX3JlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gICAqc2VuZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gICAqYWRkcmVzc2VkX3JlY2lwaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICAgKnByb3Bvc2VkX3JlY2lwaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2ludDMyX3QgICAgICp0b2dnbGVzKTsKK2RidXNfYm9vbF90ICAgICAgYnVzX2NsaWVudF9wb2xpY3lfY2hlY2tfY2FuX293biAgICAgKEJ1c0NsaWVudFBvbGljeSAgKnBvbGljeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKnNlcnZpY2VfbmFtZSk7CitkYnVzX2Jvb2xfdCAgICAgIGJ1c19jbGllbnRfcG9saWN5X2FwcGVuZF9ydWxlICAgICAgIChCdXNDbGllbnRQb2xpY3kgICpwb2xpY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNQb2xpY3lSdWxlICAgICpydWxlKTsKK3ZvaWQgICAgICAgICAgICAgYnVzX2NsaWVudF9wb2xpY3lfb3B0aW1pemUgICAgICAgICAgKEJ1c0NsaWVudFBvbGljeSAgKnBvbGljeSk7CisKKyNpZmRlZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworZGJ1c19ib29sX3QgICAgICBidXNfcG9saWN5X2NoZWNrX2Nhbl9vd24gICAgIChCdXNQb2xpY3kgICpwb2xpY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKnNlcnZpY2VfbmFtZSk7CisjZW5kaWYKKworI2VuZGlmIC8qIEJVU19QT0xJQ1lfSCAqLwpkaWZmIC0tZ2l0IGEvYnVzL3NlbGludXguYyBiL2J1cy9zZWxpbnV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA5YWZiNAotLS0gL2Rldi9udWxsCisrKyBiL2J1cy9zZWxpbnV4LmMKQEAgLTAsMCArMSw5ODggQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLQorICogc2VsaW51eC5jICBTRUxpbnV4IHNlY3VyaXR5IGNoZWNrcyBmb3IgRC1CdXMKKyAqCisgKiBBdXRob3I6IE1hdHRoZXcgUmlja2FyZCA8bWpyaWNrYUBlcG9jaC5uY3NjLm1pbD4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1pbnRlcm5hbHMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc3RyaW5nLmg+CisjaWZuZGVmIERCVVNfV0lOCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXVzZXJkYi5oPgorI2VuZGlmCisjaW5jbHVkZSAic2VsaW51eC5oIgorI2luY2x1ZGUgImF1ZGl0LmgiCisjaW5jbHVkZSAic2VydmljZXMuaCIKKyNpbmNsdWRlICJwb2xpY3kuaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorI2luY2x1ZGUgImNvbmZpZy1wYXJzZXIuaCIKKworI2lmZGVmIEhBVkVfRVJSTk9fSAorI2luY2x1ZGUgPGVycm5vLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NFTElOVVgKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjaW5jbHVkZSA8c3lzbG9nLmg+CisjaW5jbHVkZSA8c2VsaW51eC9zZWxpbnV4Lmg+CisjaW5jbHVkZSA8c2VsaW51eC9hdmMuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGdycC5oPgorI2VuZGlmIC8qIEhBVkVfU0VMSU5VWCAqLworI2lmZGVmIEhBVkVfTElCQVVESVQKKyNpbmNsdWRlIDxsaWJhdWRpdC5oPgorI2VuZGlmIC8qIEhBVkVfTElCQVVESVQgKi8KKworI2RlZmluZSBCVVNfU0lEX0ZST01fU0VMSU5VWChzaWQpICAoKEJ1c1NFTGludXhJRCopIChzaWQpKQorI2RlZmluZSBTRUxJTlVYX1NJRF9GUk9NX0JVUyhzaWQpICAoKHNlY3VyaXR5X2lkX3QpIChzaWQpKQorCisjaWZkZWYgSEFWRV9TRUxJTlVYCisvKiBTdG9yZSB0aGUgdmFsdWUgdGVsbGluZyB1cyBpZiBTRUxpbnV4IGlzIGVuYWJsZWQgaW4gdGhlIGtlcm5lbC4gKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdCBzZWxpbnV4X2VuYWJsZWQgPSBGQUxTRTsKKworLyogU3RvcmUgYW4gYXZjX2VudHJ5X3JlZiB0byBzcGVlZCBBVkMgZGVjaXNpb25zLiAqLworc3RhdGljIHN0cnVjdCBhdmNfZW50cnlfcmVmIGFlcmVmOworCisvKiBTdG9yZSB0aGUgU0lEIG9mIHRoZSBidXMgaXRzZWxmIHRvIHVzZSBhcyB0aGUgZGVmYXVsdC4gKi8KK3N0YXRpYyBzZWN1cml0eV9pZF90IGJ1c19zaWQgPSBTRUNTSURfV0lMRDsKKworLyogVGhyZWFkIHRvIGxpc3RlbiBmb3IgU0VMaW51eCBzdGF0dXMgY2hhbmdlcyB2aWEgbmV0bGluay4gKi8KK3N0YXRpYyBwdGhyZWFkX3QgYXZjX25vdGlmeV90aHJlYWQ7CisKKy8qIFByb3RvdHlwZXMgZm9yIEFWQyBjYWxsYmFjayBmdW5jdGlvbnMuICAqLworc3RhdGljIHZvaWQgbG9nX2NhbGxiYWNrIChjb25zdCBjaGFyICpmbXQsIC4uLikgX0RCVVNfR05VQ19QUklOVEYgKDEsIDIpOworc3RhdGljIHZvaWQgbG9nX2F1ZGl0X2NhbGxiYWNrICh2b2lkICpkYXRhLCBzZWN1cml0eV9jbGFzc190IGNsYXNzLCBjaGFyICpidWYsIHNpemVfdCBidWZsZWZ0KTsKK3N0YXRpYyB2b2lkICphdmNfY3JlYXRlX3RocmVhZCAodm9pZCAoKnJ1bikgKHZvaWQpKTsKK3N0YXRpYyB2b2lkIGF2Y19zdG9wX3RocmVhZCAodm9pZCAqdGhyZWFkKTsKK3N0YXRpYyB2b2lkICphdmNfYWxsb2NfbG9jayAodm9pZCk7CitzdGF0aWMgdm9pZCBhdmNfZ2V0X2xvY2sgKHZvaWQgKmxvY2spOworc3RhdGljIHZvaWQgYXZjX3JlbGVhc2VfbG9jayAodm9pZCAqbG9jayk7CitzdGF0aWMgdm9pZCBhdmNfZnJlZV9sb2NrICh2b2lkICpsb2NrKTsKKworLyogQVZDIGNhbGxiYWNrIHN0cnVjdHVyZXMgZm9yIHVzZSBpbiBhdmNfaW5pdC4gICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGF2Y19tZW1vcnlfY2FsbGJhY2sgbWVtX2NiID0KK3sKKyAgLmZ1bmNfbWFsbG9jID0gZGJ1c19tYWxsb2MsCisgIC5mdW5jX2ZyZWUgPSBkYnVzX2ZyZWUKK307CitzdGF0aWMgY29uc3Qgc3RydWN0IGF2Y19sb2dfY2FsbGJhY2sgbG9nX2NiID0KK3sKKyAgLmZ1bmNfbG9nID0gbG9nX2NhbGxiYWNrLAorICAuZnVuY19hdWRpdCA9IGxvZ19hdWRpdF9jYWxsYmFjaworfTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXZjX3RocmVhZF9jYWxsYmFjayB0aHJlYWRfY2IgPQoreworICAuZnVuY19jcmVhdGVfdGhyZWFkID0gYXZjX2NyZWF0ZV90aHJlYWQsCisgIC5mdW5jX3N0b3BfdGhyZWFkID0gYXZjX3N0b3BfdGhyZWFkCit9Oworc3RhdGljIGNvbnN0IHN0cnVjdCBhdmNfbG9ja19jYWxsYmFjayBsb2NrX2NiID0KK3sKKyAgLmZ1bmNfYWxsb2NfbG9jayA9IGF2Y19hbGxvY19sb2NrLAorICAuZnVuY19nZXRfbG9jayA9IGF2Y19nZXRfbG9jaywKKyAgLmZ1bmNfcmVsZWFzZV9sb2NrID0gYXZjX3JlbGVhc2VfbG9jaywKKyAgLmZ1bmNfZnJlZV9sb2NrID0gYXZjX2ZyZWVfbG9jaworfTsKKyNlbmRpZiAvKiBIQVZFX1NFTElOVVggKi8KKworLyoqCisgKiBMb2cgY2FsbGJhY2sgdG8gbG9nIGRlbmlhbCBtZXNzYWdlcyBmcm9tIHRoZSBBVkMuCisgKiBUaGlzIGlzIHVzZWQgaW4gYXZjX2luaXQuICBMb2dzIHRvIGJvdGggc3RhbmRhcmQKKyAqIGVycm9yIGFuZCBzeXNsb2dkLgorICoKKyAqIEBwYXJhbSBmbXQgdGhlIGZvcm1hdCBzdHJpbmcKKyAqIEBwYXJhbSB2YXJpYWJsZSBhcmd1bWVudCBsaXN0CisgKi8KKyNpZmRlZiBIQVZFX1NFTElOVVgKKworc3RhdGljIHZvaWQgCitsb2dfY2FsbGJhY2sgKGNvbnN0IGNoYXIgKmZtdCwgLi4uKSAKK3sKKyAgdmFfbGlzdCBhcDsKKyNpZmRlZiBIQVZFX0xJQkFVRElUCisgIGludCBhdWRpdF9mZDsKKyNlbmRpZgorCisgIHZhX3N0YXJ0KGFwLCBmbXQpOworCisjaWZkZWYgSEFWRV9MSUJBVURJVAorICBhdWRpdF9mZCA9IGJ1c19hdWRpdF9nZXRfZmQgKCk7CisKKyAgaWYgKGF1ZGl0X2ZkID49IDApCisgIHsKKyAgICAvKiBUaGlzIHNob3VsZCByZWFsbHkgYmUgYSBEQnVzU3RyaW5nLCBidXQgREJ1c1N0cmluZyBhbGxvY2F0ZXMKKyAgICAgKiBtZW1vcnkgZHluYW1pY2FsbHk7IGJlZm9yZSBzd2l0Y2hpbmcgaXQsIHdlIG5lZWQgdG8gY2hlY2sgd2l0aAorICAgICAqIFNFTGludXggcGVvcGxlIHRoYXQgaXQgd291bGQgYmUgT0sgZm9yIHRoaXMgdG8gZmFsbCBiYWNrIHRvCisgICAgICogc3lzbG9nIGlmIE9PTSwgbGlrZSB0aGUgZXF1aXZhbGVudCBBcHBBcm1vciBjb2RlIGRvZXMuICovCisgICAgY2hhciBidWZbUEFUSF9NQVgqMl07CisKKyAgICAvKiBGSVhNRTogbmVlZCB0byBjaGFuZ2UgdGhpcyB0byBzaG93IHJlYWwgdXNlciAqLworICAgIHZzbnByaW50ZihidWYsIHNpemVvZihidWYpLCBmbXQsIGFwKTsKKyAgICBhdWRpdF9sb2dfdXNlcl9hdmNfbWVzc2FnZShhdWRpdF9mZCwgQVVESVRfVVNFUl9BVkMsIGJ1ZiwgTlVMTCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgZ2V0dWlkKCkpOworICAgIGdvdG8gb3V0OworICB9CisjZW5kaWYgLyogSEFWRV9MSUJBVURJVCAqLworCisgIHZzeXNsb2cgKExPR19VU0VSIHwgTE9HX0lORk8sIGZtdCwgYXApOworCisjaWZkZWYgSEFWRV9MSUJBVURJVAorb3V0OgorI2VuZGlmCisgIHZhX2VuZChhcCk7Cit9CisKKy8qKgorICogT24gYSBwb2xpY3kgcmVsb2FkIHdlIG5lZWQgdG8gcmVwYXJzZSB0aGUgU0VMaW51eCBjb25maWd1cmF0aW9uIGZpbGUsIHNpbmNlCisgKiB0aGlzIGNvdWxkIGhhdmUgY2hhbmdlZC4gIFNlbmQgYSBTSUdIVVAgdG8gcmVsb2FkIGFsbCBjb25maWdzLgorICovCitzdGF0aWMgaW50Citwb2xpY3lfcmVsb2FkX2NhbGxiYWNrICh1X2ludDMyX3QgZXZlbnQsIHNlY3VyaXR5X2lkX3Qgc3NpZCwgCisgICAgICAgICAgICAgICAgICAgICAgICBzZWN1cml0eV9pZF90IHRzaWQsIHNlY3VyaXR5X2NsYXNzX3QgdGNsYXNzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjY2Vzc192ZWN0b3JfdCBwZXJtcywgYWNjZXNzX3ZlY3Rvcl90ICpvdXRfcmV0YWluZWQpCit7CisgIGlmIChldmVudCA9PSBBVkNfQ0FMTEJBQ0tfUkVTRVQpCisgICAgcmV0dXJuIHJhaXNlIChTSUdIVVApOworICAKKyAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogTG9nIGFueSBhdXhpbGlhcnkgZGF0YSAKKyAqLworc3RhdGljIHZvaWQKK2xvZ19hdWRpdF9jYWxsYmFjayAodm9pZCAqZGF0YSwgc2VjdXJpdHlfY2xhc3NfdCBjbGFzcywgY2hhciAqYnVmLCBzaXplX3QgYnVmbGVmdCkKK3sKKyAgREJ1c1N0cmluZyAqYXVkbXNnID0gZGF0YTsKKworICBpZiAoYnVmbGVmdCA+IChzaXplX3QpIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoKGF1ZG1zZykpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2NvcHlfdG9fYnVmZmVyX3dpdGhfbnVsIChhdWRtc2csIGJ1ZiwgYnVmbGVmdCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgREJ1c1N0cmluZyBzOworCisgICAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCgmcywgIkJ1ZmZlciB0b28gc21hbGwgZm9yIGF1ZGl0IG1lc3NhZ2UiKTsKKworICAgICAgaWYgKGJ1ZmxlZnQgPiAoc2l6ZV90KSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCgmcykpCisgICAgICAgIF9kYnVzX3N0cmluZ19jb3B5X3RvX2J1ZmZlcl93aXRoX251bCAoJnMsIGJ1ZiwgYnVmbGVmdCk7CisgICAgfQorfQorCisvKioKKyAqIENyZWF0ZSB0aHJlYWQgdG8gbm90aWZ5IHRoZSBBVkMgb2YgZW5mb3JjaW5nIGFuZCBwb2xpY3kgcmVsb2FkCisgKiBjaGFuZ2VzIHZpYSBuZXRsaW5rLgorICoKKyAqIEBwYXJhbSBydW4gdGhlIHRocmVhZCBydW4gZnVuY3Rpb24KKyAqIEByZXR1cm4gcG9pbnRlciB0byB0aGUgdGhyZWFkCisgKi8KK3N0YXRpYyB2b2lkICoKK2F2Y19jcmVhdGVfdGhyZWFkICh2b2lkICgqcnVuKSAodm9pZCkpCit7CisgIGludCByYzsKKworICByYyA9IHB0aHJlYWRfY3JlYXRlICgmYXZjX25vdGlmeV90aHJlYWQsIE5VTEwsICh2b2lkICooKikgKHZvaWQgKikpIHJ1biwgTlVMTCk7CisgIGlmIChyYyAhPSAwKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJGYWlsZWQgdG8gc3RhcnQgQVZDIHRocmVhZDogJXMiLCBfZGJ1c19zdHJlcnJvciAocmMpKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKyAgcmV0dXJuICZhdmNfbm90aWZ5X3RocmVhZDsKK30KKworLyogU3RvcCBBVkMgbmV0bGluayB0aHJlYWQuICAqLworc3RhdGljIHZvaWQKK2F2Y19zdG9wX3RocmVhZCAodm9pZCAqdGhyZWFkKQoreworICBwdGhyZWFkX2NhbmNlbCAoKihwdGhyZWFkX3QgKikgdGhyZWFkKTsKK30KKworLyogQWxsb2NhdGUgYSBuZXcgQVZDIGxvY2suICAqLworc3RhdGljIHZvaWQgKgorYXZjX2FsbG9jX2xvY2sgKHZvaWQpCit7CisgIHB0aHJlYWRfbXV0ZXhfdCAqYXZjX211dGV4OworCisgIGF2Y19tdXRleCA9IGRidXNfbmV3IChwdGhyZWFkX211dGV4X3QsIDEpOworICBpZiAoYXZjX211dGV4ID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkNvdWxkIG5vdCBjcmVhdGUgbXV0ZXg6ICVzIiwgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisgIHB0aHJlYWRfbXV0ZXhfaW5pdCAoYXZjX211dGV4LCBOVUxMKTsKKworICByZXR1cm4gYXZjX211dGV4OworfQorCisvKiBBY3F1aXJlIGFuIEFWQyBsb2NrLiAgKi8KK3N0YXRpYyB2b2lkCithdmNfZ2V0X2xvY2sgKHZvaWQgKmxvY2spCit7CisgIHB0aHJlYWRfbXV0ZXhfbG9jayAobG9jayk7Cit9CisKKy8qIFJlbGVhc2UgYW4gQVZDIGxvY2suICAqLworc3RhdGljIHZvaWQKK2F2Y19yZWxlYXNlX2xvY2sgKHZvaWQgKmxvY2spCit7CisgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrIChsb2NrKTsKK30KKworLyogRnJlZSBhbiBBVkMgbG9jay4gICovCitzdGF0aWMgdm9pZAorYXZjX2ZyZWVfbG9jayAodm9pZCAqbG9jaykKK3sKKyAgcHRocmVhZF9tdXRleF9kZXN0cm95IChsb2NrKTsKKyAgZGJ1c19mcmVlIChsb2NrKTsKK30KKyNlbmRpZiAvKiBIQVZFX1NFTElOVVggKi8KKworLyoqCisgKiBSZXR1cm4gd2hldGhlciBvciBub3QgU0VMaW51eCBpcyBlbmFibGVkOyBtdXN0IGJlCisgKiBjYWxsZWQgYWZ0ZXIgYnVzX3NlbGludXhfaW5pdC4KKyAqLworZGJ1c19ib29sX3QKK2J1c19zZWxpbnV4X2VuYWJsZWQgKHZvaWQpCit7CisjaWZkZWYgSEFWRV9TRUxJTlVYCisgIHJldHVybiBzZWxpbnV4X2VuYWJsZWQ7CisjZWxzZQorICByZXR1cm4gRkFMU0U7CisjZW5kaWYgLyogSEFWRV9TRUxJTlVYICovCit9CisKK0J1c1NFTGludXhJRCoKK2J1c19zZWxpbnV4X2dldF9zZWxmICh2b2lkKQoreworI2lmZGVmIEhBVkVfU0VMSU5VWAorICBpZihidXNfc2VsaW51eF9lbmFibGVkICgpKQorICAgIHJldHVybiBCVVNfU0lEX0ZST01fU0VMSU5VWCAoYnVzX3NpZCk7CisgIGVsc2UKKyAgICByZXR1cm4gTlVMTDsKKyNlbHNlCisgIHJldHVybiBOVUxMOworI2VuZGlmIC8qIEhBVkVfU0VMSU5VWCAqLworfQorCisvKioKKyAqIERvIGVhcmx5IGluaXRpYWxpemF0aW9uOyBkZXRlcm1pbmUgd2hldGhlciBTRUxpbnV4IGlzIGVuYWJsZWQuCisgKi8KK2RidXNfYm9vbF90CitidXNfc2VsaW51eF9wcmVfaW5pdCAodm9pZCkKK3sKKyNpZmRlZiBIQVZFX1NFTElOVVgKKyAgaW50IHI7CisgIF9kYnVzX2Fzc2VydCAoYnVzX3NpZCA9PSBTRUNTSURfV0lMRCk7CisgIAorICAvKiBEZXRlcm1pbmUgaWYgd2UgYXJlIHJ1bm5pbmcgYW4gU0VMaW51eCBrZXJuZWwuICovCisgIHIgPSBpc19zZWxpbnV4X2VuYWJsZWQgKCk7CisgIGlmIChyIDwgMCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiQ291bGQgbm90IHRlbGwgaWYgU0VMaW51eCBpcyBlbmFibGVkOiAlcyIsCisgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgc2VsaW51eF9lbmFibGVkID0gciAhPSAwOworICByZXR1cm4gVFJVRTsKKyNlbHNlCisgIHJldHVybiBUUlVFOworI2VuZGlmCit9CisKKy8qCisgKiBQcml2YXRlIEZsYXNrIGRlZmluaXRpb25zOyB0aGUgb3JkZXIgb2YgdGhlc2UgY29uc3RhbnRzIG11c3QKKyAqIGV4YWN0bHkgbWF0Y2ggdGhhdCBvZiB0aGUgc3RydWN0dXJlIGFycmF5IGJlbG93IQorICovCisvKiBzZWN1cml0eSBkYnVzIGNsYXNzIGNvbnN0YW50cyAqLworI2RlZmluZSBTRUNDTEFTU19EQlVTICAgICAgIDEKKworLyogZGJ1cydzIHBlciBhY2Nlc3MgdmVjdG9yIGNvbnN0YW50cyAqLworI2RlZmluZSBEQlVTX19BQ1FVSVJFX1NWQyAgIDEKKyNkZWZpbmUgREJVU19fU0VORF9NU0cgICAgICAyCisKKyNpZmRlZiBIQVZFX1NFTElOVVgKK3N0YXRpYyBzdHJ1Y3Qgc2VjdXJpdHlfY2xhc3NfbWFwcGluZyBkYnVzX21hcFtdID0geworICB7ICJkYnVzIiwgeyAiYWNxdWlyZV9zdmMiLCAic2VuZF9tc2ciLCBOVUxMIH0gfSwKKyAgeyBOVUxMIH0KK307CisjZW5kaWYgLyogSEFWRV9TRUxJTlVYICovCisKKy8qKgorICogRXN0YWJsaXNoIGR5bmFtaWMgb2JqZWN0IGNsYXNzIGFuZCBwZXJtaXNzaW9uIG1hcHBpbmcgYW5kCisgKiBpbml0aWFsaXplIHRoZSB1c2VyIHNwYWNlIGFjY2VzcyB2ZWN0b3IgY2FjaGUgKEFWQykgZm9yIEQtQnVzIGFuZCBzZXQgdXAKKyAqIGxvZ2dpbmcgY2FsbGJhY2tzLgorICovCitkYnVzX2Jvb2xfdAorYnVzX3NlbGludXhfZnVsbF9pbml0ICh2b2lkKQoreworI2lmZGVmIEhBVkVfU0VMSU5VWAorICBjaGFyICpidXNfY29udGV4dDsKKworICBfZGJ1c19hc3NlcnQgKGJ1c19zaWQgPT0gU0VDU0lEX1dJTEQpOworICAKKyAgaWYgKCFzZWxpbnV4X2VuYWJsZWQpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIlNFTGludXggbm90IGVuYWJsZWQgaW4gdGhpcyBrZXJuZWwuXG4iKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICBfZGJ1c192ZXJib3NlICgiU0VMaW51eCBpcyBlbmFibGVkIGluIHRoaXMga2VybmVsLlxuIik7CisKKyAgaWYgKHNlbGludXhfc2V0X21hcHBpbmcgKGRidXNfbWFwKSA8IDApCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkZhaWxlZCB0byBzZXQgdXAgc2VjdXJpdHkgY2xhc3MgbWFwcGluZyAoc2VsaW51eF9zZXRfbWFwcGluZygpOiVzKS4iLAorICAgICAgICAgICAgICAgICAgIHN0cmVycm9yIChlcnJubykpOworICAgICAgcmV0dXJuIEZBTFNFOyAKKyAgICB9CisKKyAgYXZjX2VudHJ5X3JlZl9pbml0ICgmYWVyZWYpOworICBpZiAoYXZjX2luaXQgKCJhdmMiLCAmbWVtX2NiLCAmbG9nX2NiLCAmdGhyZWFkX2NiLCAmbG9ja19jYikgPCAwKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJGYWlsZWQgdG8gc3RhcnQgQWNjZXNzIFZlY3RvciBDYWNoZSAoQVZDKS4iKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiQWNjZXNzIFZlY3RvciBDYWNoZSAoQVZDKSBzdGFydGVkLlxuIik7CisgICAgfQorCisgIGlmIChhdmNfYWRkX2NhbGxiYWNrIChwb2xpY3lfcmVsb2FkX2NhbGxiYWNrLCBBVkNfQ0FMTEJBQ0tfUkVTRVQsCisgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIDAsIDApIDwgMCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiRmFpbGVkIHRvIGFkZCBwb2xpY3kgcmVsb2FkIGNhbGxiYWNrOiAlcyIsCisgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIGF2Y19kZXN0cm95ICgpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBidXNfY29udGV4dCA9IE5VTEw7CisgIGJ1c19zaWQgPSBTRUNTSURfV0lMRDsKKworICBpZiAoZ2V0Y29uICgmYnVzX2NvbnRleHQpIDwgMCkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiRXJyb3IgZ2V0dGluZyBjb250ZXh0IG9mIGJ1czogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgICAKKyAgaWYgKGF2Y19jb250ZXh0X3RvX3NpZCAoYnVzX2NvbnRleHQsICZidXNfc2lkKSA8IDApCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIkVycm9yIGdldHRpbmcgU0lEIGZyb20gYnVzIGNvbnRleHQ6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICBmcmVlY29uIChidXNfY29udGV4dCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGZyZWVjb24gKGJ1c19jb250ZXh0KTsKKyAgCisjZW5kaWYgLyogSEFWRV9TRUxJTlVYICovCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIERldGVybWluZSBpZiB0aGUgU0VMaW51eCBzZWN1cml0eSBwb2xpY3kgYWxsb3dzIHRoZSBnaXZlbiBzZW5kZXIKKyAqIHNlY3VyaXR5IGNvbnRleHQgdG8gZ28gdG8gdGhlIGdpdmVuIHJlY2lwaWVudCBzZWN1cml0eSBjb250ZXh0LgorICogVGhpcyBmdW5jdGlvbiBkZXRlcm1pbmVzIGlmIHRoZSByZXF1ZXN0ZWQgcGVybWlzc2lvbnMgYXJlIHRvIGJlCisgKiBncmFudGVkIGZyb20gdGhlIGNvbm5lY3Rpb24gdG8gdGhlIG1lc3NhZ2UgYnVzIG9yIHRvIGFub3RoZXIKKyAqIG9wdGlvbmFsbHkgc3VwcGxpZWQgc2VjdXJpdHkgaWRlbnRpZmllciAoZS5nLiBmb3IgYSBzZXJ2aWNlCisgKiBjb250ZXh0KS4gIEN1cnJlbnRseSB0aGVzZSBwZXJtaXNzaW9ucyBhcmUgZWl0aGVyIHNlbmRfbXNnIG9yCisgKiBhY3F1aXJlX3N2YyBpbiB0aGUgZGJ1cyBjbGFzcy4KKyAqCisgKiBAcGFyYW0gc2VuZGVyX3NpZCBzb3VyY2Ugc2VjdXJpdHkgY29udGV4dAorICogQHBhcmFtIG92ZXJyaWRlX3NpZCBpcyB0aGUgdGFyZ2V0IHNlY3VyaXR5IGNvbnRleHQuICBJZiBTRUNTSURfV0lMRCB0aGlzIHdpbGwKKyAqICAgICAgICB1c2UgdGhlIGNvbnRleHQgb2YgdGhlIGJ1cyBpdHNlbGYgKGUuZy4gdGhlIGRlZmF1bHQpLgorICogQHBhcmFtIHRhcmdldF9jbGFzcyBpcyB0aGUgdGFyZ2V0IHNlY3VyaXR5IGNsYXNzLgorICogQHBhcmFtIHJlcXVlc3RlZCBpcyB0aGUgcmVxdWVzdGVkIHBlcm1pc3Npb25zLgorICogQHJldHVybnMgI1RSVUUgaWYgc2VjdXJpdHkgcG9saWN5IGFsbG93cyB0aGUgc2VuZC4KKyAqLworI2lmZGVmIEhBVkVfU0VMSU5VWAorc3RhdGljIGRidXNfYm9vbF90CitidXNfc2VsaW51eF9jaGVjayAoQnVzU0VMaW51eElEICAgICAgICAqc2VuZGVyX3NpZCwKKyAgICAgICAgICAgICAgICAgICBCdXNTRUxpbnV4SUQgICAgICAgICpvdmVycmlkZV9zaWQsCisgICAgICAgICAgICAgICAgICAgc2VjdXJpdHlfY2xhc3NfdCAgICAgdGFyZ2V0X2NsYXNzLAorICAgICAgICAgICAgICAgICAgIGFjY2Vzc192ZWN0b3JfdCAgICAgIHJlcXVlc3RlZCwKKwkJICAgREJ1c1N0cmluZyAgICAgICAgICAqYXV4ZGF0YSkKK3sKKyAgaWYgKCFzZWxpbnV4X2VuYWJsZWQpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgLyogTWFrZSB0aGUgc2VjdXJpdHkgY2hlY2suICBBVkMgY2hlY2tzIGVuZm9yY2luZyBtb2RlIGhlcmUgYXMgd2VsbC4gKi8KKyAgaWYgKGF2Y19oYXNfcGVybSAoU0VMSU5VWF9TSURfRlJPTV9CVVMgKHNlbmRlcl9zaWQpLAorICAgICAgICAgICAgICAgICAgICBvdmVycmlkZV9zaWQgPworICAgICAgICAgICAgICAgICAgICBTRUxJTlVYX1NJRF9GUk9NX0JVUyAob3ZlcnJpZGVfc2lkKSA6CisgICAgICAgICAgICAgICAgICAgIGJ1c19zaWQsCisgICAgICAgICAgICAgICAgICAgIHRhcmdldF9jbGFzcywgcmVxdWVzdGVkLCAmYWVyZWYsIGF1eGRhdGEpIDwgMCkKKyAgICB7CisgICAgc3dpdGNoIChlcnJubykKKyAgICAgIHsKKyAgICAgIGNhc2UgRUFDQ0VTOgorICAgICAgICBfZGJ1c192ZXJib3NlICgiU0VMaW51eCBkZW55aW5nIGR1ZSB0byBzZWN1cml0eSBwb2xpY3kuXG4iKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgY2FzZSBFSU5WQUw6CisgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJTRUxpbnV4IGRlbnlpbmcgZHVlIHRvIGludmFsaWQgc2VjdXJpdHkgY29udGV4dC5cbiIpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICBkZWZhdWx0OgorICAgICAgICBfZGJ1c192ZXJib3NlICgiU0VMaW51eCBkZW55aW5nIGR1ZSB0bzogJXNcbiIsIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9CisgICAgfQorICBlbHNlCisgICAgcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYgLyogSEFWRV9TRUxJTlVYICovCisKKy8qKgorICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBjb25uZWN0aW9uIGNhbiBhY3F1aXJlIGEgc2VydmljZSwKKyAqIGFzc3VtaW5nIHRoZSBnaXZlbiBzZWN1cml0eSBJRCBpcyBuZWVkZWQgZm9yIHRoYXQgc2VydmljZS4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiBjb25uZWN0aW9uIHRoYXQgd2FudHMgdG8gb3duIHRoZSBzZXJ2aWNlCisgKiBAcGFyYW0gc2VydmljZV9zaWQgdGhlIFNJRCBvZiB0aGUgc2VydmljZSBmcm9tIHRoZSB0YWJsZQorICogQHJldHVybnMgI1RSVUUgaWYgYWNxdWlyZSBpcyBwZXJtaXR0ZWQuCisgKi8KK2RidXNfYm9vbF90CitidXNfc2VsaW51eF9hbGxvd3NfYWNxdWlyZV9zZXJ2aWNlIChEQnVzQ29ubmVjdGlvbiAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNTRUxpbnV4SUQgICAgICAgKnNlcnZpY2Vfc2lkLAorCQkJCSAgICBjb25zdCBjaGFyICAgICAgICAgKnNlcnZpY2VfbmFtZSwKKwkJCQkgICAgREJ1c0Vycm9yICAgICAgICAgICplcnJvcikKK3sKKyNpZmRlZiBIQVZFX1NFTElOVVgKKyAgQnVzU0VMaW51eElEICpjb25uZWN0aW9uX3NpZDsKKyAgdW5zaWduZWQgbG9uZyBzcGlkOworICBEQnVzU3RyaW5nIGF1eGRhdGE7CisgIGRidXNfYm9vbF90IHJldDsKKyAgCisgIGlmICghc2VsaW51eF9lbmFibGVkKQorICAgIHJldHVybiBUUlVFOworICAKKyAgY29ubmVjdGlvbl9zaWQgPSBidXNfY29ubmVjdGlvbl9nZXRfc2VsaW51eF9pZCAoY29ubmVjdGlvbik7CisgIGlmICghZGJ1c19jb25uZWN0aW9uX2dldF91bml4X3Byb2Nlc3NfaWQgKGNvbm5lY3Rpb24sICZzcGlkKSkKKyAgICBzcGlkID0gMDsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmYXV4ZGF0YSkpCisgICAgZ290byBvb207CisgCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmF1eGRhdGEsICJzZXJ2aWNlPSIpKQorICAgIGdvdG8gb29tOworCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmF1eGRhdGEsIHNlcnZpY2VfbmFtZSkpCisgICAgZ290byBvb207CisKKyAgaWYgKHNwaWQpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmYXV4ZGF0YSwgIiBzcGlkPSIpKQorCWdvdG8gb29tOworCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfdWludCAoJmF1eGRhdGEsIHNwaWQpKQorCWdvdG8gb29tOworICAgIH0KKyAgCisgIHJldCA9IGJ1c19zZWxpbnV4X2NoZWNrIChjb25uZWN0aW9uX3NpZCwKKwkJCSAgIHNlcnZpY2Vfc2lkLAorCQkJICAgU0VDQ0xBU1NfREJVUywKKwkJCSAgIERCVVNfX0FDUVVJUkVfU1ZDLAorCQkJICAgJmF1eGRhdGEpOworCisgIF9kYnVzX3N0cmluZ19mcmVlICgmYXV4ZGF0YSk7CisgIHJldHVybiByZXQ7CisKKyBvb206CisgIF9kYnVzX3N0cmluZ19mcmVlICgmYXV4ZGF0YSk7CisgIEJVU19TRVRfT09NIChlcnJvcik7CisgIHJldHVybiBGQUxTRTsKKworI2Vsc2UKKyAgcmV0dXJuIFRSVUU7CisjZW5kaWYgLyogSEFWRV9TRUxJTlVYICovCit9CisKKy8qKgorICogQ2hlY2sgaWYgU0VMaW51eCBzZWN1cml0eSBjb250cm9scyBhbGxvdyB0aGUgbWVzc2FnZSB0byBiZSBzZW50IHRvIGEKKyAqIHBhcnRpY3VsYXIgY29ubmVjdGlvbiBiYXNlZCBvbiB0aGUgc2VjdXJpdHkgY29udGV4dCBvZiB0aGUgc2VuZGVyIGFuZAorICogdGhhdCBvZiB0aGUgcmVjZWl2ZXIuIFRoZSBkZXN0aW5hdGlvbiBjb25uZWN0aW9uIG5lZWQgbm90IGJlIHRoZQorICogYWRkcmVzc2VkIHJlY2lwaWVudCwgaXQgY291bGQgYmUgYW4gImVhdmVzZHJvcHBlciIKKyAqCisgKiBAcGFyYW0gc2VuZGVyIHRoZSBzZW5kZXIgb2YgdGhlIG1lc3NhZ2UuCisgKiBAcGFyYW0gcHJvcG9zZWRfcmVjaXBpZW50IHRoZSBjb25uZWN0aW9uIHRoZSBtZXNzYWdlIGlzIHRvIGJlIHNlbnQgdG8uCisgKiBAcmV0dXJucyB3aGV0aGVyIHRvIGFsbG93IHRoZSBzZW5kCisgKi8KK2RidXNfYm9vbF90CitidXNfc2VsaW51eF9hbGxvd3Nfc2VuZCAoREJ1c0Nvbm5lY3Rpb24gICAgICpzZW5kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gICAgICpwcm9wb3NlZF9yZWNpcGllbnQsCisJCQkgY29uc3QgY2hhciAgICAgICAgICptc2d0eXBlLAorCQkJIGNvbnN0IGNoYXIgICAgICAgICAqaW50ZXJmYWNlLAorCQkJIGNvbnN0IGNoYXIgICAgICAgICAqbWVtYmVyLAorCQkJIGNvbnN0IGNoYXIgICAgICAgICAqZXJyb3JfbmFtZSwKKwkJCSBjb25zdCBjaGFyICAgICAgICAgKmRlc3RpbmF0aW9uLAorCQkJIEJ1c0FjdGl2YXRpb25FbnRyeSAqYWN0aXZhdGlvbl9lbnRyeSwKKwkJCSBEQnVzRXJyb3IgICAgICAgICAgKmVycm9yKQoreworI2lmZGVmIEhBVkVfU0VMSU5VWAorICBCdXNTRUxpbnV4SUQgKnJlY2lwaWVudF9zaWQ7CisgIEJ1c1NFTGludXhJRCAqc2VuZGVyX3NpZDsKKyAgdW5zaWduZWQgbG9uZyBzcGlkLCB0cGlkOworICBEQnVzU3RyaW5nIGF1eGRhdGE7CisgIGRidXNfYm9vbF90IHJldDsKKyAgZGJ1c19ib29sX3Qgc3RyaW5nX2FsbG9jZWQ7CisKKyAgaWYgKCFzZWxpbnV4X2VuYWJsZWQpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgLyogV2UgZG8gbm90IG1lZGlhdGUgYWN0aXZhdGlvbiBhdHRlbXB0cyB5ZXQuICovCisgIGlmIChhY3RpdmF0aW9uX2VudHJ5KQorICAgIHJldHVybiBUUlVFOworCisgIGlmICghc2VuZGVyIHx8ICFkYnVzX2Nvbm5lY3Rpb25fZ2V0X3VuaXhfcHJvY2Vzc19pZCAoc2VuZGVyLCAmc3BpZCkpCisgICAgc3BpZCA9IDA7CisgIGlmICghcHJvcG9zZWRfcmVjaXBpZW50IHx8ICFkYnVzX2Nvbm5lY3Rpb25fZ2V0X3VuaXhfcHJvY2Vzc19pZCAocHJvcG9zZWRfcmVjaXBpZW50LCAmdHBpZCkpCisgICAgdHBpZCA9IDA7CisKKyAgc3RyaW5nX2FsbG9jZWQgPSBGQUxTRTsKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmF1eGRhdGEpKQorICAgIGdvdG8gb29tOworICBzdHJpbmdfYWxsb2NlZCA9IFRSVUU7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmYXV4ZGF0YSwgIm1zZ3R5cGU9IikpCisgICAgZ290byBvb207CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmYXV4ZGF0YSwgbXNndHlwZSkpCisgICAgZ290byBvb207CisKKyAgaWYgKGludGVyZmFjZSkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhdXhkYXRhLCAiIGludGVyZmFjZT0iKSkKKwlnb3RvIG9vbTsKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmF1eGRhdGEsIGludGVyZmFjZSkpCisJZ290byBvb207CisgICAgfQorCisgIGlmIChtZW1iZXIpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmYXV4ZGF0YSwgIiBtZW1iZXI9IikpCisJZ290byBvb207CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhdXhkYXRhLCBtZW1iZXIpKQorCWdvdG8gb29tOworICAgIH0KKworICBpZiAoZXJyb3JfbmFtZSkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhdXhkYXRhLCAiIGVycm9yX25hbWU9IikpCisJZ290byBvb207CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhdXhkYXRhLCBlcnJvcl9uYW1lKSkKKwlnb3RvIG9vbTsKKyAgICB9CisKKyAgaWYgKGRlc3RpbmF0aW9uKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmF1eGRhdGEsICIgZGVzdD0iKSkKKwlnb3RvIG9vbTsKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmF1eGRhdGEsIGRlc3RpbmF0aW9uKSkKKwlnb3RvIG9vbTsKKyAgICB9CisKKyAgaWYgKHNwaWQpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmYXV4ZGF0YSwgIiBzcGlkPSIpKQorCWdvdG8gb29tOworCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfdWludCAoJmF1eGRhdGEsIHNwaWQpKQorCWdvdG8gb29tOworICAgIH0KKworICBpZiAodHBpZCkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhdXhkYXRhLCAiIHRwaWQ9IikpCisJZ290byBvb207CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF91aW50ICgmYXV4ZGF0YSwgdHBpZCkpCisJZ290byBvb207CisgICAgfQorCisgIHNlbmRlcl9zaWQgPSBidXNfY29ubmVjdGlvbl9nZXRfc2VsaW51eF9pZCAoc2VuZGVyKTsKKworICAvKiBBIE5VTEwgcHJvcG9zZWRfcmVjaXBpZW50IHdpdGggbm8gYWN0aXZhdGlvbiBlbnRyeSBtZWFucyB0aGUgYnVzIGl0c2VsZi4gKi8KKyAgaWYgKHByb3Bvc2VkX3JlY2lwaWVudCkKKyAgICByZWNpcGllbnRfc2lkID0gYnVzX2Nvbm5lY3Rpb25fZ2V0X3NlbGludXhfaWQgKHByb3Bvc2VkX3JlY2lwaWVudCk7CisgIGVsc2UKKyAgICByZWNpcGllbnRfc2lkID0gQlVTX1NJRF9GUk9NX1NFTElOVVggKGJ1c19zaWQpOworCisgIHJldCA9IGJ1c19zZWxpbnV4X2NoZWNrIChzZW5kZXJfc2lkLCAKKwkJCSAgIHJlY2lwaWVudF9zaWQsCisJCQkgICBTRUNDTEFTU19EQlVTLCAKKwkJCSAgIERCVVNfX1NFTkRfTVNHLAorCQkJICAgJmF1eGRhdGEpOworCisgIF9kYnVzX3N0cmluZ19mcmVlICgmYXV4ZGF0YSk7CisKKyAgcmV0dXJuIHJldDsKKworIG9vbToKKyAgaWYgKHN0cmluZ19hbGxvY2VkKQorICAgIF9kYnVzX3N0cmluZ19mcmVlICgmYXV4ZGF0YSk7CisgIEJVU19TRVRfT09NIChlcnJvcik7CisgIHJldHVybiBGQUxTRTsKKyAgCisjZWxzZQorICByZXR1cm4gVFJVRTsKKyNlbmRpZiAvKiBIQVZFX1NFTElOVVggKi8KK30KKworZGJ1c19ib29sX3QKK2J1c19zZWxpbnV4X2FwcGVuZF9jb250ZXh0IChEQnVzTWVzc2FnZSAgICAqbWVzc2FnZSwKKwkJCSAgICBCdXNTRUxpbnV4SUQgICAqc2lkLAorCQkJICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyNpZmRlZiBIQVZFX1NFTElOVVgKKyAgY2hhciAqY29udGV4dDsKKworICBpZiAoYXZjX3NpZF90b19jb250ZXh0IChTRUxJTlVYX1NJRF9GUk9NX0JVUyAoc2lkKSwgJmNvbnRleHQpIDwgMCkKKyAgICB7CisgICAgICBpZiAoZXJybm8gPT0gRU5PTUVNKQorICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgZWxzZQorICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIGdldHRpbmcgY29udGV4dCBmcm9tIFNJRDogJXNcbiIsCisJCQlfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIGlmICghZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChtZXNzYWdlLAorCQkJCSBEQlVTX1RZUEVfQVJSQVksCisJCQkJIERCVVNfVFlQRV9CWVRFLAorCQkJCSAmY29udGV4dCwKKwkJCQkgc3RybGVuIChjb250ZXh0KSwKKwkJCQkgREJVU19UWVBFX0lOVkFMSUQpKQorICAgIHsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIGZyZWVjb24gKGNvbnRleHQpOworICByZXR1cm4gVFJVRTsKKyNlbHNlCisgIHJldHVybiBUUlVFOworI2VuZGlmCit9CisKKy8qKgorICogR2V0cyB0aGUgc2VjdXJpdHkgY29udGV4dCBvZiBhIGNvbm5lY3Rpb24gdG8gdGhlIGJ1cy4gSXQgaXMgdXAgdG8KKyAqIHRoZSBjYWxsZXIgdG8gZnJlZWNvbigpIHdoZW4gdGhleSBhcmUgZG9uZS4gCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24gdG8gZ2V0IHRoZSBjb250ZXh0IG9mLgorICogQHBhcmFtIGNvbiB0aGUgbG9jYXRpb24gdG8gc3RvcmUgdGhlIHNlY3VyaXR5IGNvbnRleHQuCisgKiBAcmV0dXJucyAjVFJVRSBpZiBjb250ZXh0IGlzIHN1Y2Nlc3NmdWxseSBvYnRhaW5lZC4KKyAqLworI2lmZGVmIEhBVkVfU0VMSU5VWAorc3RhdGljIGRidXNfYm9vbF90CitidXNfY29ubmVjdGlvbl9yZWFkX3NlbGludXhfY29udGV4dCAoREJ1c0Nvbm5lY3Rpb24gICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICAgICAgICoqY29uKQoreworICBpbnQgZmQ7CisKKyAgaWYgKCFzZWxpbnV4X2VuYWJsZWQpCisgICAgcmV0dXJuIEZBTFNFOworCisgIF9kYnVzX2Fzc2VydCAoY29ubmVjdGlvbiAhPSBOVUxMKTsKKyAgCisgIGlmICghZGJ1c19jb25uZWN0aW9uX2dldF91bml4X2ZkIChjb25uZWN0aW9uLCAmZmQpKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJGYWlsZWQgdG8gZ2V0IGZpbGUgZGVzY3JpcHRvciBvZiBzb2NrZXQuXG4iKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIAorICBpZiAoZ2V0cGVlcmNvbiAoZmQsIGNvbikgPCAwKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJFcnJvciBnZXR0aW5nIGNvbnRleHQgb2Ygc29ja2V0IHBlZXI6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAKKyAgX2RidXNfdmVyYm9zZSAoIlN1Y2Nlc3NmdWxseSByZWFkIGNvbm5lY3Rpb24gY29udGV4dC5cbiIpOworICByZXR1cm4gVFJVRTsKK30KKyNlbmRpZiAvKiBIQVZFX1NFTElOVVggKi8KKworLyoqCisgKiBSZWFkIHRoZSBTRUxpbnV4IElEIGZyb20gdGhlIGNvbm5lY3Rpb24uCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24gdG8gcmVhZCBmcm9tCisgKiBAcmV0dXJucyB0aGUgU0lEIGlmIHN1Y2Nlc3NmdWxseSBkZXRlcm1pbmVkLCAjTlVMTCBvdGhlcndpc2UuCisgKi8KK0J1c1NFTGludXhJRCoKK2J1c19zZWxpbnV4X2luaXRfY29ubmVjdGlvbl9pZCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyNpZmRlZiBIQVZFX1NFTElOVVgKKyAgY2hhciAqY29uOworICBzZWN1cml0eV9pZF90IHNpZDsKKyAgCisgIGlmICghc2VsaW51eF9lbmFibGVkKQorICAgIHJldHVybiBOVUxMOworCisgIGlmICghYnVzX2Nvbm5lY3Rpb25fcmVhZF9zZWxpbnV4X2NvbnRleHQgKGNvbm5lY3Rpb24sICZjb24pKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byByZWFkIGFuIFNFTGludXggY29udGV4dCBmcm9tIGNvbm5lY3Rpb24iKTsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJFcnJvciBnZXR0aW5nIHBlZXIgY29udGV4dC5cbiIpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIF9kYnVzX3ZlcmJvc2UgKCJDb252ZXJ0aW5nIGNvbnRleHQgdG8gU0lEIHRvIHN0b3JlIG9uIGNvbm5lY3Rpb25cbiIpOworCisgIGlmIChhdmNfY29udGV4dF90b19zaWQgKGNvbiwgJnNpZCkgPCAwKQorICAgIHsKKyAgICAgIGlmIChlcnJubyA9PSBFTk9NRU0pCisgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBlbHNlCisgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IgZ2V0dGluZyBTSUQgZnJvbSBjb250ZXh0IFwiJXNcIjogJXNcbiIsCisJCQljb24sIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgCisgICAgICBfZGJ1c193YXJuICgiRXJyb3IgZ2V0dGluZyBTSUQgZnJvbSBjb250ZXh0IFwiJXNcIjogJXMiLAorCQkgIGNvbiwgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICAKKyAgICAgIGZyZWVjb24gKGNvbik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgCisgIGZyZWVjb24gKGNvbik7IAorICByZXR1cm4gQlVTX1NJRF9GUk9NX1NFTElOVVggKHNpZCk7CisjZWxzZQorICByZXR1cm4gTlVMTDsKKyNlbmRpZiAvKiBIQVZFX1NFTElOVVggKi8KK30KKworLyoqCisgKiBDcmVhdGVzIGEgbmV3IHRhYmxlIG1hcHBpbmcgc2VydmljZSBuYW1lcyB0byBzZWN1cml0eSBJRC4KKyAqIEEgc2VjdXJpdHkgSUQgaXMgYSAiY29tcGlsZWQiIHNlY3VyaXR5IGNvbnRleHQsIGEgc2VjdXJpdHkKKyAqIGNvbnRleHQgaXMganVzdCBhIHN0cmluZy4KKyAqCisgKiBAcmV0dXJucyB0aGUgbmV3IHRhYmxlIG9yICNOVUxMIGlmIG5vIG1lbW9yeQorICovCitEQnVzSGFzaFRhYmxlKgorYnVzX3NlbGludXhfaWRfdGFibGVfbmV3ICh2b2lkKQoreworICByZXR1cm4gX2RidXNfaGFzaF90YWJsZV9uZXcgKERCVVNfSEFTSF9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKERCdXNGcmVlRnVuY3Rpb24pIGRidXNfZnJlZSwgTlVMTCk7Cit9CisKKy8qKiAKKyAqIEhhc2hlcyBhIHNlcnZpY2UgbmFtZSBhbmQgc2VydmljZSBjb250ZXh0IGludG8gdGhlIHNlcnZpY2UgU0lECisgKiB0YWJsZSBhcyBhIHN0cmluZyBhbmQgYSBTSUQuCisgKgorICogQHBhcmFtIHNlcnZpY2VfbmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgc2VydmljZS4KKyAqIEBwYXJhbSBzZXJ2aWNlX2NvbnRleHQgaXMgdGhlIGNvbnRleHQgb2YgdGhlIHNlcnZpY2UuCisgKiBAcGFyYW0gc2VydmljZV90YWJsZSBpcyB0aGUgdGFibGUgdG8gaGFzaCB0aGVtIGludG8uCisgKiBAcmV0dXJuICNGQUxTRSBpZiBub3QgZW5vdWdoIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorYnVzX3NlbGludXhfaWRfdGFibGVfaW5zZXJ0IChEQnVzSGFzaFRhYmxlICpzZXJ2aWNlX3RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICpzZXJ2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgKnNlcnZpY2VfY29udGV4dCkKK3sKKyNpZmRlZiBIQVZFX1NFTElOVVgKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICBzZWN1cml0eV9pZF90IHNpZDsKKyAgY2hhciAqa2V5OworCisgIGlmICghc2VsaW51eF9lbmFibGVkKQorICAgIHJldHVybiBUUlVFOworCisgIHNpZCA9IFNFQ1NJRF9XSUxEOworICByZXR2YWwgPSBGQUxTRTsKKworICBrZXkgPSBfZGJ1c19zdHJkdXAgKHNlcnZpY2VfbmFtZSk7CisgIGlmIChrZXkgPT0gTlVMTCkKKyAgICByZXR1cm4gcmV0dmFsOworICAKKyAgaWYgKGF2Y19jb250ZXh0X3RvX3NpZCAoKGNoYXIgKikgc2VydmljZV9jb250ZXh0LCAmc2lkKSA8IDApCisgICAgeworICAgICAgaWYgKGVycm5vID09IEVOT01FTSkKKyAgICAgICAgeworCSAgZGJ1c19mcmVlIChrZXkpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKwl9CisKKyAgICAgIF9kYnVzX3dhcm4gKCJFcnJvciBnZXR0aW5nIFNJRCBmcm9tIGNvbnRleHQgXCIlc1wiOiAlcyIsCisJCSAgKGNoYXIgKikgc2VydmljZV9jb250ZXh0LAorICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19oYXNoX3RhYmxlX2luc2VydF9zdHJpbmcgKHNlcnZpY2VfdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVVNfU0lEX0ZST01fU0VMSU5VWCAoc2lkKSkpCisgICAgZ290byBvdXQ7CisKKyAgX2RidXNfdmVyYm9zZSAoIlBhcnNlZCBcdHNlcnZpY2U6ICVzIFxuXHRcdGNvbnRleHQ6ICVzXG4iLAorICAgICAgICAgICAgICAgICAga2V5LCAKKyAgICAgICAgICAgICAgICAgIHNpZC0+Y3R4KTsKKworICAvKiBUaGVzZSBhcmUgb3duZWQgYnkgdGhlIGhhc2gsIHNvIGNsZWFyIHRoZW0gdG8gYXZvaWQgdW5yZWYgKi8KKyAga2V5ID0gTlVMTDsKKyAgc2lkID0gU0VDU0lEX1dJTEQ7CisKKyAgcmV0dmFsID0gVFJVRTsKKyAgCisgb3V0OgorICBpZiAoa2V5KQorICAgIGRidXNfZnJlZSAoa2V5KTsKKworICByZXR1cm4gcmV0dmFsOworI2Vsc2UKKyAgcmV0dXJuIFRSVUU7CisjZW5kaWYgLyogSEFWRV9TRUxJTlVYICovCit9CisKKworLyoqCisgKiBGaW5kIHRoZSBzZWN1cml0eSBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCBhIHBhcnRpY3VsYXIgc2VydmljZQorICogbmFtZS4gIFJldHVybiBhIHBvaW50ZXIgdG8gdGhpcyBTSUQsIG9yICNOVUxML1NFQ1NJRF9XSUxEIGlmIHRoZQorICogc2VydmljZSBpcyBub3QgZm91bmQgaW4gdGhlIGhhc2ggdGFibGUuICBUaGlzIHNob3VsZCBiZSBuZWFybHkgYQorICogY29uc3RhbnQgdGltZSBvcGVyYXRpb24uICBJZiBTRUxpbnV4IHN1cHBvcnQgaXMgbm90IGF2YWlsYWJsZSwKKyAqIGFsd2F5cyByZXR1cm4gTlVMTC4KKyAqCisgKiBAcGFyYW0gc2VydmljZV90YWJsZSB0aGUgaGFzaCB0YWJsZSB0byBjaGVjayBmb3Igc2VydmljZSBuYW1lLgorICogQHBhcmFtIHNlcnZpY2VfbmFtZSB0aGUgbmFtZSBvZiB0aGUgc2VydmljZSB0byBsb29rIGZvci4KKyAqIEByZXR1cm5zIHRoZSBTRUxpbnV4IElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2VydmljZQorICovCitCdXNTRUxpbnV4SUQqCitidXNfc2VsaW51eF9pZF90YWJsZV9sb29rdXAgKERCdXNIYXNoVGFibGUgICAgKnNlcnZpY2VfdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKnNlcnZpY2VfbmFtZSkKK3sKKyNpZmRlZiBIQVZFX1NFTElOVVgKKyAgc2VjdXJpdHlfaWRfdCBzaWQ7CisKKyAgc2lkID0gU0VDU0lEX1dJTEQ7ICAgICAvKiBkZWZhdWx0IGNvbnRleHQgKi8KKworICBpZiAoIXNlbGludXhfZW5hYmxlZCkKKyAgICByZXR1cm4gTlVMTDsKKyAgCisgIF9kYnVzX3ZlcmJvc2UgKCJMb29raW5nIHVwIHNlcnZpY2UgU0lEIGZvciAlc1xuIiwKKyAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChzZXJ2aWNlX25hbWUpKTsKKworICBzaWQgPSBfZGJ1c19oYXNoX3RhYmxlX2xvb2t1cF9zdHJpbmcgKHNlcnZpY2VfdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChzZXJ2aWNlX25hbWUpKTsKKworICBpZiAoc2lkID09IFNFQ1NJRF9XSUxEKQorICAgIF9kYnVzX3ZlcmJvc2UgKCJTZXJ2aWNlICVzIG5vdCBmb3VuZFxuIiwgCisgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChzZXJ2aWNlX25hbWUpKTsKKyAgZWxzZQorICAgIF9kYnVzX3ZlcmJvc2UgKCJTZXJ2aWNlICVzIGZvdW5kXG4iLCAKKyAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKHNlcnZpY2VfbmFtZSkpOworCisgIHJldHVybiBCVVNfU0lEX0ZST01fU0VMSU5VWCAoc2lkKTsKKyNlbmRpZiAvKiBIQVZFX1NFTElOVVggKi8KKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogR2V0IHRoZSBTRUxpbnV4IHBvbGljeSByb290LiAgVGhpcyBpcyB1c2VkIHRvIGZpbmQgdGhlIEQtQnVzCisgKiBzcGVjaWZpYyBjb25maWcgZmlsZSB3aXRoaW4gdGhlIHBvbGljeS4KKyAqLworY29uc3QgY2hhciAqCitidXNfc2VsaW51eF9nZXRfcG9saWN5X3Jvb3QgKHZvaWQpCit7CisjaWZkZWYgSEFWRV9TRUxJTlVYCisgIHJldHVybiBzZWxpbnV4X3BvbGljeV9yb290ICgpOworI2Vsc2UKKyAgcmV0dXJuIE5VTEw7CisjZW5kaWYgLyogSEFWRV9TRUxJTlVYICovCit9IAorCisvKioKKyAqIEZvciBkZWJ1Z2dpbmc6ICBQcmludCBvdXQgdGhlIGN1cnJlbnQgaGFzaCB0YWJsZSBvZiBzZXJ2aWNlIFNJRHMuCisgKi8KK3ZvaWQKK2J1c19zZWxpbnV4X2lkX3RhYmxlX3ByaW50IChEQnVzSGFzaFRhYmxlICpzZXJ2aWNlX3RhYmxlKQoreworI2lmIGRlZmluZWQgKERCVVNfRU5BQkxFX1ZFUkJPU0VfTU9ERSkgJiYgZGVmaW5lZCAoSEFWRV9TRUxJTlVYKQorICBEQnVzSGFzaEl0ZXIgaXRlcjsKKworICBpZiAoIXNlbGludXhfZW5hYmxlZCkKKyAgICByZXR1cm47CisgIAorICBfZGJ1c192ZXJib3NlICgiU2VydmljZSBTSUQgVGFibGU6XG4iKTsKKyAgX2RidXNfaGFzaF9pdGVyX2luaXQgKHNlcnZpY2VfdGFibGUsICZpdGVyKTsKKyAgd2hpbGUgKF9kYnVzX2hhc2hfaXRlcl9uZXh0ICgmaXRlcikpCisgICAgeworICAgICAgY29uc3QgY2hhciAqa2V5ID0gX2RidXNfaGFzaF9pdGVyX2dldF9zdHJpbmdfa2V5ICgmaXRlcik7CisgICAgICBzZWN1cml0eV9pZF90IHNpZCA9IF9kYnVzX2hhc2hfaXRlcl9nZXRfdmFsdWUgKCZpdGVyKTsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJUaGUga2V5IGlzICVzXG4iLCBrZXkpOworICAgICAgX2RidXNfdmVyYm9zZSAoIlRoZSBjb250ZXh0IGlzICVzXG4iLCBzaWQtPmN0eCk7CisgICAgICBfZGJ1c192ZXJib3NlICgiVGhlIHJlZmNvdW50IGlzICVkXG4iLCBzaWQtPnJlZmNudCk7CisgICAgfQorI2VuZGlmIC8qIERCVVNfRU5BQkxFX1ZFUkJPU0VfTU9ERSAmJiBIQVZFX1NFTElOVVggKi8KK30KKworCisvKioKKyAqIFByaW50IG91dCBzb21lIEFWQyBzdGF0aXN0aWNzLgorICovCisjaWZkZWYgSEFWRV9TRUxJTlVYCitzdGF0aWMgdm9pZAorYnVzX2F2Y19wcmludF9zdGF0cyAodm9pZCkKK3sKKyNpZmRlZiBEQlVTX0VOQUJMRV9WRVJCT1NFX01PREUKKyAgc3RydWN0IGF2Y19jYWNoZV9zdGF0cyBjc3RhdHM7CisKKyAgaWYgKCFzZWxpbnV4X2VuYWJsZWQpCisgICAgcmV0dXJuOworICAKKyAgX2RidXNfdmVyYm9zZSAoIkFWQyBTdGF0aXN0aWNzOlxuIik7CisgIGF2Y19jYWNoZV9zdGF0cyAoJmNzdGF0cyk7CisgIGF2Y19hdl9zdGF0cyAoKTsKKyAgX2RidXNfdmVyYm9zZSAoIkFWQyBDYWNoZSBTdGF0aXN0aWNzOlxuIik7CisgIF9kYnVzX3ZlcmJvc2UgKCJFbnRyeSBsb29rdXBzOiAlZFxuIiwgY3N0YXRzLmVudHJ5X2xvb2t1cHMpOworICBfZGJ1c192ZXJib3NlICgiRW50cnkgaGl0czogJWRcbiIsIGNzdGF0cy5lbnRyeV9oaXRzKTsKKyAgX2RidXNfdmVyYm9zZSAoIkVudHJ5IG1pc3NlcyAlZFxuIiwgY3N0YXRzLmVudHJ5X21pc3Nlcyk7CisgIF9kYnVzX3ZlcmJvc2UgKCJFbnRyeSBkaXNjYXJkczogJWRcbiIsIGNzdGF0cy5lbnRyeV9kaXNjYXJkcyk7CisgIF9kYnVzX3ZlcmJvc2UgKCJDQVYgbG9va3VwczogJWRcbiIsIGNzdGF0cy5jYXZfbG9va3Vwcyk7CisgIF9kYnVzX3ZlcmJvc2UgKCJDQVYgaGl0czogJWRcbiIsIGNzdGF0cy5jYXZfaGl0cyk7CisgIF9kYnVzX3ZlcmJvc2UgKCJDQVYgcHJvYmVzOiAlZFxuIiwgY3N0YXRzLmNhdl9wcm9iZXMpOworICBfZGJ1c192ZXJib3NlICgiQ0FWIG1pc3NlczogJWRcbiIsIGNzdGF0cy5jYXZfbWlzc2VzKTsKKyNlbmRpZiAvKiBEQlVTX0VOQUJMRV9WRVJCT1NFX01PREUgKi8KK30KKyNlbmRpZiAvKiBIQVZFX1NFTElOVVggKi8KKworLyoqCisgKiBEZXN0cm95IHRoZSBBVkMgYmVmb3JlIHdlIHRlcm1pbmF0ZS4KKyAqLwordm9pZAorYnVzX3NlbGludXhfc2h1dGRvd24gKHZvaWQpCit7CisjaWZkZWYgSEFWRV9TRUxJTlVYCisgIGlmICghc2VsaW51eF9lbmFibGVkKQorICAgIHJldHVybjsKKworICBfZGJ1c192ZXJib3NlICgiQVZDIHNodXRkb3duXG4iKTsKKworICBpZiAoYnVzX3NpZCAhPSBTRUNTSURfV0lMRCkKKyAgICB7CisgICAgICBidXNfc2lkID0gU0VDU0lEX1dJTEQ7CisKKyAgICAgIGJ1c19hdmNfcHJpbnRfc3RhdHMgKCk7CisKKyAgICAgIGF2Y19kZXN0cm95ICgpOworICAgIH0KKyNlbmRpZiAvKiBIQVZFX1NFTElOVVggKi8KK30KZGlmZiAtLWdpdCBhL2J1cy9zZWxpbnV4LmggYi9idXMvc2VsaW51eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwMzgzY2QKLS0tIC9kZXYvbnVsbAorKysgYi9idXMvc2VsaW51eC5oCkBAIC0wLDAgKzEsNjkgQEAKKy8qIHNlbGludXguaCAgU0VMaW51eCBzZWN1cml0eSBjaGVjayBoZWFkZXJzIGZvciBELUJVUworICoKKyAqIEF1dGhvcjogTWF0dGhldyBSaWNrYXJkIDxtanJpY2thQGVwb2NoLm5jc2MubWlsPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaWZuZGVmIEJVU19TRUxJTlVYX0gKKyNkZWZpbmUgQlVTX1NFTElOVVhfSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWhhc2guaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtY29ubmVjdGlvbi5oPgorI2luY2x1ZGUgInNlcnZpY2VzLmgiCisKK2RidXNfYm9vbF90IGJ1c19zZWxpbnV4X3ByZV9pbml0ICh2b2lkKTsKK2RidXNfYm9vbF90IGJ1c19zZWxpbnV4X2Z1bGxfaW5pdCh2b2lkKTsKK3ZvaWQgICAgICAgIGJ1c19zZWxpbnV4X3NodXRkb3duICh2b2lkKTsKKworZGJ1c19ib29sX3QgYnVzX3NlbGludXhfZW5hYmxlZCAgKHZvaWQpOworCitCdXNTRUxpbnV4SUQgKmJ1c19zZWxpbnV4X2dldF9zZWxmICh2b2lkKTsKKworREJ1c0hhc2hUYWJsZSogYnVzX3NlbGludXhfaWRfdGFibGVfbmV3ICAgICh2b2lkKTsKK0J1c1NFTGludXhJRCogIGJ1c19zZWxpbnV4X2lkX3RhYmxlX2xvb2t1cCAoREJ1c0hhc2hUYWJsZSAgICAqc2VydmljZV90YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqc2VydmljZV9uYW1lKTsKK2RidXNfYm9vbF90ICAgIGJ1c19zZWxpbnV4X2lkX3RhYmxlX2luc2VydCAoREJ1c0hhc2hUYWJsZSAgICAqc2VydmljZV90YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqc2VydmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICpzZXJ2aWNlX2NvbnRleHQpOwordm9pZCAgICAgICAgICAgYnVzX3NlbGludXhfaWRfdGFibGVfcHJpbnQgIChEQnVzSGFzaFRhYmxlICAgICpzZXJ2aWNlX3RhYmxlKTsKK2NvbnN0IGNoYXIqICAgIGJ1c19zZWxpbnV4X2dldF9wb2xpY3lfcm9vdCAodm9pZCk7CisKK2RidXNfYm9vbF90ICAgIGJ1c19zZWxpbnV4X2FwcGVuZF9jb250ZXh0ICAgICAgKERCdXNNZXNzYWdlICAgICptZXNzYWdlLAorCQkJCQkJQnVzU0VMaW51eElEICAgKmNvbnRleHQsCisJCQkJCQlEQnVzRXJyb3IgICAgICAqZXJyb3IpOworCitkYnVzX2Jvb2xfdCBidXNfc2VsaW51eF9hbGxvd3NfYWNxdWlyZV9zZXJ2aWNlIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1NFTGludXhJRCAgICpzZXJ2aWNlX3NpZCwKKwkJCQkJCWNvbnN0IGNoYXIgICAgICpzZXJ2aWNlX25hbWUsCisJCQkJCQlEQnVzRXJyb3IgICAgICAqZXJyb3IpOworCitkYnVzX2Jvb2xfdCBidXNfc2VsaW51eF9hbGxvd3Nfc2VuZCAgICAgICAgICAgIChEQnVzQ29ubmVjdGlvbiAqc2VuZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKnByb3Bvc2VkX3JlY2lwaWVudCwKKwkJCQkJCWNvbnN0IGNoYXIgICAgICptc2d0eXBlLCAvKiBTdXBwbGVtZW50YXJ5IGF1ZGl0IGRhdGEgKi8KKwkJCQkJCWNvbnN0IGNoYXIgICAgICppbnRlcmZhY2UsCisJCQkJCQljb25zdCBjaGFyICAgICAqbWVtYmVyLAorCQkJCQkJY29uc3QgY2hhciAgICAgKmVycm9yX25hbWUsCisJCQkJCQljb25zdCBjaGFyICAgICAqZGVzdGluYXRpb24sCisJCQkJCQlCdXNBY3RpdmF0aW9uRW50cnkgKmFjdGl2YXRpb25fZW50cnksCisJCQkJCQlEQnVzRXJyb3IgICAgICAqZXJyb3IpOworCitCdXNTRUxpbnV4SUQqIGJ1c19zZWxpbnV4X2luaXRfY29ubmVjdGlvbl9pZCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKTsKKworI2VuZGlmIC8qIEJVU19TRUxJTlVYX0ggKi8KZGlmZiAtLWdpdCBhL2J1cy9zZXJ2aWNlcy5jIGIvYnVzL3NlcnZpY2VzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI3ZWRkYQotLS0gL2Rldi9udWxsCisrKyBiL2J1cy9zZXJ2aWNlcy5jCkBAIC0wLDAgKzEsMTMyMiBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBzZXJ2aWNlcy5jICBTZXJ2aWNlIG1hbmFnZW1lbnQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgIFJlZCBIYXQsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwMyAgQ29kZUZhY3RvcnkgQUIKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1oYXNoLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWxpc3QuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbWVtcG9vbC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1tYXJzaGFsLXZhbGlkYXRlLmg+CisKKyNpbmNsdWRlICJkcml2ZXIuaCIKKyNpbmNsdWRlICJzZXJ2aWNlcy5oIgorI2luY2x1ZGUgImNvbm5lY3Rpb24uaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorI2luY2x1ZGUgImFjdGl2YXRpb24uaCIKKyNpbmNsdWRlICJwb2xpY3kuaCIKKyNpbmNsdWRlICJidXMuaCIKKyNpbmNsdWRlICJzZWxpbnV4LmgiCisjaW5jbHVkZSAiYXBwYXJtb3IuaCIKKworc3RydWN0IEJ1c1NlcnZpY2UKK3sKKyAgaW50IHJlZmNvdW50OworCisgIEJ1c1JlZ2lzdHJ5ICpyZWdpc3RyeTsKKyAgY2hhciAqbmFtZTsKKyAgREJ1c0xpc3QgKm93bmVyczsKK307CisKK3N0cnVjdCBCdXNPd25lcgoreworICBpbnQgcmVmY291bnQ7CisKKyAgQnVzU2VydmljZSAqc2VydmljZTsKKyAgREJ1c0Nvbm5lY3Rpb24gKmNvbm47CisKKyAgdW5zaWduZWQgaW50IGFsbG93X3JlcGxhY2VtZW50IDogMTsKKyAgdW5zaWduZWQgaW50IGRvX25vdF9xdWV1ZSA6IDE7Cit9OworCitzdHJ1Y3QgQnVzUmVnaXN0cnkKK3sKKyAgaW50IHJlZmNvdW50OworCisgIEJ1c0NvbnRleHQgKmNvbnRleHQ7CisgIAorICBEQnVzSGFzaFRhYmxlICpzZXJ2aWNlX2hhc2g7CisgIERCdXNNZW1Qb29sICAgKnNlcnZpY2VfcG9vbDsKKyAgREJ1c01lbVBvb2wgICAqb3duZXJfcG9vbDsKKworICBEQnVzSGFzaFRhYmxlICpzZXJ2aWNlX3NpZF90YWJsZTsKK307CisKK0J1c1JlZ2lzdHJ5KgorYnVzX3JlZ2lzdHJ5X25ldyAoQnVzQ29udGV4dCAqY29udGV4dCkKK3sKKyAgQnVzUmVnaXN0cnkgKnJlZ2lzdHJ5OworCisgIF9kYnVzX2Fzc2VydCAoY29udGV4dCk7CisgIHJlZ2lzdHJ5ID0gZGJ1c19uZXcwIChCdXNSZWdpc3RyeSwgMSk7CisgIGlmIChyZWdpc3RyeSA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIHJlZ2lzdHJ5LT5yZWZjb3VudCA9IDE7CisgIHJlZ2lzdHJ5LT5jb250ZXh0ID0gY29udGV4dDsKKyAgCisgIHJlZ2lzdHJ5LT5zZXJ2aWNlX2hhc2ggPSBfZGJ1c19oYXNoX3RhYmxlX25ldyAoREJVU19IQVNIX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMKTsKKyAgaWYgKHJlZ2lzdHJ5LT5zZXJ2aWNlX2hhc2ggPT0gTlVMTCkKKyAgICBnb3RvIGZhaWxlZDsKKyAgCisgIHJlZ2lzdHJ5LT5zZXJ2aWNlX3Bvb2wgPSBfZGJ1c19tZW1fcG9vbF9uZXcgKHNpemVvZiAoQnVzU2VydmljZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUpOworCisgIGlmIChyZWdpc3RyeS0+c2VydmljZV9wb29sID09IE5VTEwpCisgICAgZ290byBmYWlsZWQ7CisKKyAgcmVnaXN0cnktPm93bmVyX3Bvb2wgPSBfZGJ1c19tZW1fcG9vbF9uZXcgKHNpemVvZiAoQnVzT3duZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSk7CisKKyAgaWYgKHJlZ2lzdHJ5LT5vd25lcl9wb29sID09IE5VTEwpCisgICAgZ290byBmYWlsZWQ7CisKKyAgcmVnaXN0cnktPnNlcnZpY2Vfc2lkX3RhYmxlID0gTlVMTDsKKyAgCisgIHJldHVybiByZWdpc3RyeTsKKworIGZhaWxlZDoKKyAgYnVzX3JlZ2lzdHJ5X3VucmVmIChyZWdpc3RyeSk7CisgIHJldHVybiBOVUxMOworfQorCitCdXNSZWdpc3RyeSAqCitidXNfcmVnaXN0cnlfcmVmIChCdXNSZWdpc3RyeSAqcmVnaXN0cnkpCit7CisgIF9kYnVzX2Fzc2VydCAocmVnaXN0cnktPnJlZmNvdW50ID4gMCk7CisgIHJlZ2lzdHJ5LT5yZWZjb3VudCArPSAxOworCisgIHJldHVybiByZWdpc3RyeTsKK30KKwordm9pZAorYnVzX3JlZ2lzdHJ5X3VucmVmICAoQnVzUmVnaXN0cnkgKnJlZ2lzdHJ5KQoreworICBfZGJ1c19hc3NlcnQgKHJlZ2lzdHJ5LT5yZWZjb3VudCA+IDApOworICByZWdpc3RyeS0+cmVmY291bnQgLT0gMTsKKworICBpZiAocmVnaXN0cnktPnJlZmNvdW50ID09IDApCisgICAgeworICAgICAgaWYgKHJlZ2lzdHJ5LT5zZXJ2aWNlX2hhc2gpCisgICAgICAgIF9kYnVzX2hhc2hfdGFibGVfdW5yZWYgKHJlZ2lzdHJ5LT5zZXJ2aWNlX2hhc2gpOworICAgICAgaWYgKHJlZ2lzdHJ5LT5zZXJ2aWNlX3Bvb2wpCisgICAgICAgIF9kYnVzX21lbV9wb29sX2ZyZWUgKHJlZ2lzdHJ5LT5zZXJ2aWNlX3Bvb2wpOworICAgICAgaWYgKHJlZ2lzdHJ5LT5vd25lcl9wb29sKQorICAgICAgICBfZGJ1c19tZW1fcG9vbF9mcmVlIChyZWdpc3RyeS0+b3duZXJfcG9vbCk7CisgICAgICBpZiAocmVnaXN0cnktPnNlcnZpY2Vfc2lkX3RhYmxlKQorICAgICAgICBfZGJ1c19oYXNoX3RhYmxlX3VucmVmIChyZWdpc3RyeS0+c2VydmljZV9zaWRfdGFibGUpOworICAgICAgCisgICAgICBkYnVzX2ZyZWUgKHJlZ2lzdHJ5KTsKKyAgICB9Cit9CisKK0J1c1NlcnZpY2UqCitidXNfcmVnaXN0cnlfbG9va3VwIChCdXNSZWdpc3RyeSAgICAgICpyZWdpc3RyeSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKnNlcnZpY2VfbmFtZSkKK3sKKyAgQnVzU2VydmljZSAqc2VydmljZTsKKworICBzZXJ2aWNlID0gX2RidXNfaGFzaF90YWJsZV9sb29rdXBfc3RyaW5nIChyZWdpc3RyeS0+c2VydmljZV9oYXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKHNlcnZpY2VfbmFtZSkpOworCisgIHJldHVybiBzZXJ2aWNlOworfQorCitzdGF0aWMgREJ1c0xpc3QgKgorX2J1c19zZXJ2aWNlX2ZpbmRfb3duZXJfbGluayAoQnVzU2VydmljZSAqc2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBEQnVzTGlzdCAqbGluazsKKyAgCisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmc2VydmljZS0+b3duZXJzKTsKKworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIEJ1c093bmVyICpidXNfb3duZXI7CisKKyAgICAgIGJ1c19vd25lciA9IChCdXNPd25lciAqKSBsaW5rLT5kYXRhOworICAgICAgaWYgKGJ1c19vd25lci0+Y29ubiA9PSBjb25uZWN0aW9uKSAKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZzZXJ2aWNlLT5vd25lcnMsIGxpbmspOworICAgIH0KKworICByZXR1cm4gbGluazsKK30KKworc3RhdGljIHZvaWQKK2J1c19vd25lcl9zZXRfZmxhZ3MgKEJ1c093bmVyICpvd25lciwKKyAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgZmxhZ3MpCit7CisgICBvd25lci0+YWxsb3dfcmVwbGFjZW1lbnQgPSAKKyAgICAgICAgKGZsYWdzICYgREJVU19OQU1FX0ZMQUdfQUxMT1dfUkVQTEFDRU1FTlQpICE9IEZBTFNFOworCisgICBvd25lci0+ZG9fbm90X3F1ZXVlID0KKyAgICAgICAgKGZsYWdzICYgREJVU19OQU1FX0ZMQUdfRE9fTk9UX1FVRVVFKSAhPSBGQUxTRTsKK30KKworc3RhdGljIEJ1c093bmVyICoKK2J1c19vd25lcl9uZXcgKEJ1c1NlcnZpY2UgKnNlcnZpY2UsIAorICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm4sIAorCSAgICAgICBkYnVzX3VpbnQzMl90IGZsYWdzKQoreworICBCdXNPd25lciAqcmVzdWx0OworCisgIHJlc3VsdCA9IF9kYnVzX21lbV9wb29sX2FsbG9jIChzZXJ2aWNlLT5yZWdpc3RyeS0+b3duZXJfcG9vbCk7CisgIGlmIChyZXN1bHQgIT0gTlVMTCkKKyAgICB7CisgICAgICByZXN1bHQtPnJlZmNvdW50ID0gMTsKKyAgICAgIC8qIGRvbid0IHJlZiB0aGUgY29ubmVjdGlvbiBiZWNhdXNlIHdlIGRvbid0IHdhbnQKKyAgICAgICAgIHRvIGJsb2NrIHRoZSBjb25uZWN0aW9uIGZyb20gZ29pbmcgYXdheS4KKyAgICAgICAgIHRyYW5zYWN0aW9ucyB0YWtlIGNhcmUgb2YgcmVmZmluZyB0aGUgY29ubmVjdGlvbgorICAgICAgICAgYnV0IHdlIG5lZWQgdG8gdXNlIHJlZmNvdW50aW5nIG9uIHRoZSBvd25lcgorICAgICAgICAgc28gdGhhdCB0aGUgb3duZXIgZG9lcyBub3QgZ2V0IGZyZWVkIGJlZm9yZQorICAgICAgICAgd2UgY2FuIGRlcmVmIHRoZSBjb25uZWN0aW9uIGluIHRoZSB0cmFuc2FjdGlvbgorICAgICAgICovCisgICAgICByZXN1bHQtPmNvbm4gPSBjb25uOworICAgICAgcmVzdWx0LT5zZXJ2aWNlID0gc2VydmljZTsKKworICAgICAgaWYgKCFidXNfY29ubmVjdGlvbl9hZGRfb3duZWRfc2VydmljZSAoY29ubiwgc2VydmljZSkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19tZW1fcG9vbF9kZWFsbG9jIChzZXJ2aWNlLT5yZWdpc3RyeS0+b3duZXJfcG9vbCwgcmVzdWx0KTsKKyAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgIGJ1c19vd25lcl9zZXRfZmxhZ3MgKHJlc3VsdCwgZmxhZ3MpOworICAgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIEJ1c093bmVyICoKK2J1c19vd25lcl9yZWYgKEJ1c093bmVyICpvd25lcikKK3sKKyAgX2RidXNfYXNzZXJ0IChvd25lci0+cmVmY291bnQgPiAwKTsKKyAgb3duZXItPnJlZmNvdW50ICs9IDE7CisKKyAgcmV0dXJuIG93bmVyOworfQorCitzdGF0aWMgdm9pZAorYnVzX293bmVyX3VucmVmICAoQnVzT3duZXIgKm93bmVyKQoreworICBfZGJ1c19hc3NlcnQgKG93bmVyLT5yZWZjb3VudCA+IDApOworICBvd25lci0+cmVmY291bnQgLT0gMTsKKworICBpZiAob3duZXItPnJlZmNvdW50ID09IDApCisgICAgeworICAgICAgYnVzX2Nvbm5lY3Rpb25fcmVtb3ZlX293bmVkX3NlcnZpY2UgKG93bmVyLT5jb25uLCBvd25lci0+c2VydmljZSk7CisgICAgICBfZGJ1c19tZW1fcG9vbF9kZWFsbG9jIChvd25lci0+c2VydmljZS0+cmVnaXN0cnktPm93bmVyX3Bvb2wsIG93bmVyKTsKKyAgICB9Cit9CisKK0J1c1NlcnZpY2UqCitidXNfcmVnaXN0cnlfZW5zdXJlIChCdXNSZWdpc3RyeSAgICAgICAgICAgICAgICpyZWdpc3RyeSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICAgICAgICAgKnNlcnZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICAgICAgICAgICAgKm93bmVyX2Nvbm5lY3Rpb25faWZfY3JlYXRlZCwKKyAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgICAgICAgICAgICAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgQnVzVHJhbnNhY3Rpb24gICAgICAgICAgICAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAgICAgICAgICplcnJvcikKK3sKKyAgQnVzU2VydmljZSAqc2VydmljZTsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgCisgIF9kYnVzX2Fzc2VydCAob3duZXJfY29ubmVjdGlvbl9pZl9jcmVhdGVkICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKHRyYW5zYWN0aW9uICE9IE5VTEwpOworCisgIHNlcnZpY2UgPSBfZGJ1c19oYXNoX3RhYmxlX2xvb2t1cF9zdHJpbmcgKHJlZ2lzdHJ5LT5zZXJ2aWNlX2hhc2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoc2VydmljZV9uYW1lKSk7CisgIGlmIChzZXJ2aWNlICE9IE5VTEwpCisgICAgcmV0dXJuIHNlcnZpY2U7CisgIAorICBzZXJ2aWNlID0gX2RidXNfbWVtX3Bvb2xfYWxsb2MgKHJlZ2lzdHJ5LT5zZXJ2aWNlX3Bvb2wpOworICBpZiAoc2VydmljZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgc2VydmljZS0+cmVnaXN0cnkgPSByZWdpc3RyeTsgIAorICBzZXJ2aWNlLT5yZWZjb3VudCA9IDE7CisKKyAgX2RidXNfdmVyYm9zZSAoImNvcHlpbmcgc3RyaW5nICVwICclcycgdG8gc2VydmljZS0+bmFtZVxuIiwKKyAgICAgICAgICAgICAgICAgc2VydmljZV9uYW1lLCBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKHNlcnZpY2VfbmFtZSkpOworICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5X2RhdGEgKHNlcnZpY2VfbmFtZSwgJnNlcnZpY2UtPm5hbWUpKQorICAgIHsKKyAgICAgIF9kYnVzX21lbV9wb29sX2RlYWxsb2MgKHJlZ2lzdHJ5LT5zZXJ2aWNlX3Bvb2wsIHNlcnZpY2UpOworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgX2RidXNfdmVyYm9zZSAoImNvcGllZCBzdHJpbmcgJXAgJyVzJyB0byAnJXMnXG4iLAorICAgICAgICAgICAgICAgICBzZXJ2aWNlX25hbWUsIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoc2VydmljZV9uYW1lKSwKKyAgICAgICAgICAgICAgICAgc2VydmljZS0+bmFtZSk7CisKKyAgaWYgKCFidXNfZHJpdmVyX3NlbmRfc2VydmljZV9vd25lcl9jaGFuZ2VkIChzZXJ2aWNlLT5uYW1lLCAKKwkJCQkJICAgICAgTlVMTCwKKwkJCQkJICAgICAgYnVzX2Nvbm5lY3Rpb25fZ2V0X25hbWUgKG93bmVyX2Nvbm5lY3Rpb25faWZfY3JlYXRlZCksCisJCQkJCSAgICAgIHRyYW5zYWN0aW9uLCBlcnJvcikpCisgICAgeworICAgICAgYnVzX3NlcnZpY2VfdW5yZWYgKHNlcnZpY2UpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIGlmICghYnVzX2FjdGl2YXRpb25fc2VydmljZV9jcmVhdGVkIChidXNfY29udGV4dF9nZXRfYWN0aXZhdGlvbiAocmVnaXN0cnktPmNvbnRleHQpLAorCQkJCSAgICAgICBzZXJ2aWNlLT5uYW1lLCB0cmFuc2FjdGlvbiwgZXJyb3IpKQorICAgIHsKKyAgICAgIGJ1c19zZXJ2aWNlX3VucmVmIChzZXJ2aWNlKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgCisgIGlmICghYnVzX3NlcnZpY2VfYWRkX293bmVyIChzZXJ2aWNlLCBvd25lcl9jb25uZWN0aW9uX2lmX2NyZWF0ZWQsIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uLCBlcnJvcikpCisgICAgeworICAgICAgYnVzX3NlcnZpY2VfdW5yZWYgKHNlcnZpY2UpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAKKyAgaWYgKCFfZGJ1c19oYXNoX3RhYmxlX2luc2VydF9zdHJpbmcgKHJlZ2lzdHJ5LT5zZXJ2aWNlX2hhc2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLT5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZSkpCisgICAgeworICAgICAgLyogVGhlIGFkZF9vd25lciBnZXRzIHJldmVydGVkIG9uIHRyYW5zYWN0aW9uIGNhbmNlbCAqLworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgCisgIHJldHVybiBzZXJ2aWNlOworfQorCit2b2lkCitidXNfcmVnaXN0cnlfZm9yZWFjaCAoQnVzUmVnaXN0cnkgICAgICAgICAgICAgICAqcmVnaXN0cnksCisgICAgICAgICAgICAgICAgICAgICAgQnVzU2VydmljZUZvcmVhY2hGdW5jdGlvbiAgZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAqZGF0YSkKK3sKKyAgREJ1c0hhc2hJdGVyIGl0ZXI7CisgIAorICBfZGJ1c19oYXNoX2l0ZXJfaW5pdCAocmVnaXN0cnktPnNlcnZpY2VfaGFzaCwgJml0ZXIpOworICB3aGlsZSAoX2RidXNfaGFzaF9pdGVyX25leHQgKCZpdGVyKSkKKyAgICB7CisgICAgICBCdXNTZXJ2aWNlICpzZXJ2aWNlID0gX2RidXNfaGFzaF9pdGVyX2dldF92YWx1ZSAoJml0ZXIpOworCisgICAgICAoKiBmdW5jdGlvbikgKHNlcnZpY2UsIGRhdGEpOworICAgIH0KK30KKworZGJ1c19ib29sX3QKK2J1c19yZWdpc3RyeV9saXN0X3NlcnZpY2VzIChCdXNSZWdpc3RyeSAqcmVnaXN0cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICoqKmxpc3RwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICphcnJheV9sZW4pCit7CisgIGludCBpLCBqLCBsZW47CisgIGNoYXIgKipyZXR2YWw7CisgIERCdXNIYXNoSXRlciBpdGVyOworICAgCisgIGxlbiA9IF9kYnVzX2hhc2hfdGFibGVfZ2V0X25fZW50cmllcyAocmVnaXN0cnktPnNlcnZpY2VfaGFzaCk7CisgIHJldHZhbCA9IGRidXNfbmV3IChjaGFyICosIGxlbiArIDEpOworCisgIGlmIChyZXR2YWwgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgX2RidXNfaGFzaF9pdGVyX2luaXQgKHJlZ2lzdHJ5LT5zZXJ2aWNlX2hhc2gsICZpdGVyKTsKKyAgaSA9IDA7CisgIHdoaWxlIChfZGJ1c19oYXNoX2l0ZXJfbmV4dCAoJml0ZXIpKQorICAgIHsKKyAgICAgIEJ1c1NlcnZpY2UgKnNlcnZpY2UgPSBfZGJ1c19oYXNoX2l0ZXJfZ2V0X3ZhbHVlICgmaXRlcik7CisKKyAgICAgIHJldHZhbFtpXSA9IF9kYnVzX3N0cmR1cCAoc2VydmljZS0+bmFtZSk7CisgICAgICBpZiAocmV0dmFsW2ldID09IE5VTEwpCisJZ290byBlcnJvcjsKKworICAgICAgaSsrOworICAgIH0KKworICByZXR2YWxbaV0gPSBOVUxMOworICAKKyAgaWYgKGFycmF5X2xlbikKKyAgICAqYXJyYXlfbGVuID0gbGVuOworICAKKyAgKmxpc3RwID0gcmV0dmFsOworICByZXR1cm4gVFJVRTsKKyAgCisgZXJyb3I6CisgIGZvciAoaiA9IDA7IGogPCBpOyBqKyspCisgICAgZGJ1c19mcmVlIChyZXR2YWxbal0pOworICBkYnVzX2ZyZWUgKHJldHZhbCk7CisKKyAgcmV0dXJuIEZBTFNFOworfQorCitkYnVzX2Jvb2xfdAorYnVzX3JlZ2lzdHJ5X2FjcXVpcmVfc2VydmljZSAoQnVzUmVnaXN0cnkgICAgICAqcmVnaXN0cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqc2VydmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90ICAgICpyZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNUcmFuc2FjdGlvbiAgICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIERCdXNDb25uZWN0aW9uICpvbGRfb3duZXJfY29ubjsKKyAgQnVzQ2xpZW50UG9saWN5ICpwb2xpY3k7CisgIEJ1c1NlcnZpY2UgKnNlcnZpY2U7CisgIEJ1c0FjdGl2YXRpb24gICphY3RpdmF0aW9uOworICBCdXNTRUxpbnV4SUQgKnNpZDsKKyAgQnVzT3duZXIgKnByaW1hcnlfb3duZXI7CisgIGludCBsaW1pdDsKKworICByZXR2YWwgPSBGQUxTRTsKKworICBpZiAoIV9kYnVzX3ZhbGlkYXRlX2J1c19uYW1lIChzZXJ2aWNlX25hbWUsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChzZXJ2aWNlX25hbWUpKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfSU5WQUxJRF9BUkdTLAorICAgICAgICAgICAgICAgICAgICAgICJSZXF1ZXN0ZWQgYnVzIG5hbWUgXCIlc1wiIGlzIG5vdCB2YWxpZCIsCisgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChzZXJ2aWNlX25hbWUpKTsKKyAgICAgIAorICAgICAgX2RidXNfdmVyYm9zZSAoIkF0dGVtcHQgdG8gYWNxdWlyZSBpbnZhbGlkIHNlcnZpY2UgbmFtZVxuIik7CisgICAgICAKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgCisgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKHNlcnZpY2VfbmFtZSwgMCkgPT0gJzonKQorICAgIHsKKyAgICAgIC8qIE5vdCBhbGxvd2VkOyBvbmx5IGJhc2Ugc2VydmljZXMgY2FuIHN0YXJ0IHdpdGggJzonICovCisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfSU5WQUxJRF9BUkdTLAorICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgYWNxdWlyZSBhIHNlcnZpY2Ugc3RhcnRpbmcgd2l0aCAnOicgc3VjaCBhcyBcIiVzXCIiLAorICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoc2VydmljZV9uYW1lKSk7CisgICAgICAKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJBdHRlbXB0IHRvIGFjcXVpcmUgaW52YWxpZCBiYXNlIHNlcnZpY2UgbmFtZSBcIiVzXCIiLAorICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChzZXJ2aWNlX25hbWUpKTsKKyAgICAgIAorICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIGlmIChfZGJ1c19zdHJpbmdfZXF1YWxfY19zdHIgKHNlcnZpY2VfbmFtZSwgREJVU19TRVJWSUNFX0RCVVMpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9JTlZBTElEX0FSR1MsCisgICAgICAgICAgICAgICAgICAgICAgIkNvbm5lY3Rpb24gXCIlc1wiIGlzIG5vdCBhbGxvd2VkIHRvIG93biB0aGUgc2VydmljZSBcIiVzXCJiZWNhdXNlICIKKyAgICAgICAgICAgICAgICAgICAgICAiaXQgaXMgcmVzZXJ2ZWQgZm9yIEQtQnVzJyB1c2Ugb25seSIsCisgICAgICAgICAgICAgICAgICAgICAgYnVzX2Nvbm5lY3Rpb25faXNfYWN0aXZlIChjb25uZWN0aW9uKSA/CisgICAgICAgICAgICAgICAgICAgICAgYnVzX2Nvbm5lY3Rpb25fZ2V0X25hbWUgKGNvbm5lY3Rpb24pIDoKKyAgICAgICAgICAgICAgICAgICAgICAiKGluYWN0aXZlKSIsCisgICAgICAgICAgICAgICAgICAgICAgREJVU19TRVJWSUNFX0RCVVMpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIHBvbGljeSA9IGJ1c19jb25uZWN0aW9uX2dldF9wb2xpY3kgKGNvbm5lY3Rpb24pOworICBfZGJ1c19hc3NlcnQgKHBvbGljeSAhPSBOVUxMKTsKKworICAvKiBOb3RlIHRoYXQgaWYgc2lkIGlzICNOVUxMIHRoZW4gdGhlIGJ1cydzIG93biBjb250ZXh0IGdldHMgdXNlZAorICAgKiBpbiBidXNfY29ubmVjdGlvbl9zZWxpbnV4X2FsbG93c19hY3F1aXJlX3NlcnZpY2UoKQorICAgKi8KKyAgc2lkID0gYnVzX3NlbGludXhfaWRfdGFibGVfbG9va3VwIChyZWdpc3RyeS0+c2VydmljZV9zaWRfdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZV9uYW1lKTsKKworICBpZiAoIWJ1c19zZWxpbnV4X2FsbG93c19hY3F1aXJlX3NlcnZpY2UgKGNvbm5lY3Rpb24sIHNpZCwKKwkJCQkJICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChzZXJ2aWNlX25hbWUpLCBlcnJvcikpCisgICAgeworCisgICAgICBpZiAoZGJ1c19lcnJvcl9pc19zZXQgKGVycm9yKSAmJgorCSAgZGJ1c19lcnJvcl9oYXNfbmFtZSAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZKSkKKwl7CisJICBnb3RvIG91dDsKKwl9CisKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9BQ0NFU1NfREVOSUVELAorICAgICAgICAgICAgICAgICAgICAgICJDb25uZWN0aW9uIFwiJXNcIiBpcyBub3QgYWxsb3dlZCB0byBvd24gdGhlIHNlcnZpY2UgXCIlc1wiIGR1ZSAiCisgICAgICAgICAgICAgICAgICAgICAgInRvIFNFTGludXggcG9saWN5IiwKKyAgICAgICAgICAgICAgICAgICAgICBidXNfY29ubmVjdGlvbl9pc19hY3RpdmUgKGNvbm5lY3Rpb24pID8KKyAgICAgICAgICAgICAgICAgICAgICBidXNfY29ubmVjdGlvbl9nZXRfbmFtZSAoY29ubmVjdGlvbikgOgorICAgICAgICAgICAgICAgICAgICAgICIoaW5hY3RpdmUpIiwKKyAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKHNlcnZpY2VfbmFtZSkpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIGlmICghYnVzX2FwcGFybW9yX2FsbG93c19hY3F1aXJlX3NlcnZpY2UgKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1c19jb250ZXh0X2dldF90eXBlIChyZWdpc3RyeS0+Y29udGV4dCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoc2VydmljZV9uYW1lKSwgZXJyb3IpKQorICAgIGdvdG8gb3V0OworICAKKyAgaWYgKCFidXNfY2xpZW50X3BvbGljeV9jaGVja19jYW5fb3duIChwb2xpY3ksIHNlcnZpY2VfbmFtZSkpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0FDQ0VTU19ERU5JRUQsCisgICAgICAgICAgICAgICAgICAgICAgIkNvbm5lY3Rpb24gXCIlc1wiIGlzIG5vdCBhbGxvd2VkIHRvIG93biB0aGUgc2VydmljZSBcIiVzXCIgZHVlICIKKyAgICAgICAgICAgICAgICAgICAgICAidG8gc2VjdXJpdHkgcG9saWNpZXMgaW4gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSIsCisgICAgICAgICAgICAgICAgICAgICAgYnVzX2Nvbm5lY3Rpb25faXNfYWN0aXZlIChjb25uZWN0aW9uKSA/CisgICAgICAgICAgICAgICAgICAgICAgYnVzX2Nvbm5lY3Rpb25fZ2V0X25hbWUgKGNvbm5lY3Rpb24pIDoKKyAgICAgICAgICAgICAgICAgICAgICAiKGluYWN0aXZlKSIsCisgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChzZXJ2aWNlX25hbWUpKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBsaW1pdCA9IGJ1c19jb250ZXh0X2dldF9tYXhfc2VydmljZXNfcGVyX2Nvbm5lY3Rpb24gKHJlZ2lzdHJ5LT5jb250ZXh0KTsKKworICBpZiAoYnVzX2Nvbm5lY3Rpb25fZ2V0X25fc2VydmljZXNfb3duZWQgKGNvbm5lY3Rpb24pID49IGxpbWl0KQorICAgIHsKKyAgICAgIERCdXNFcnJvciB0bXBfZXJyb3I7CisKKyAgICAgIGRidXNfZXJyb3JfaW5pdCAoJnRtcF9lcnJvcik7CisgICAgICBkYnVzX3NldF9lcnJvciAoJnRtcF9lcnJvciwgREJVU19FUlJPUl9MSU1JVFNfRVhDRUVERUQsCisgICAgICAgICAgICAgICAgICAgICAgIkNvbm5lY3Rpb24gXCIlc1wiIGlzIG5vdCBhbGxvd2VkIHRvIG93biBtb3JlIHNlcnZpY2VzICIKKyAgICAgICAgICAgICAgICAgICAgICAiKGluY3JlYXNlIGxpbWl0cyBpbiBjb25maWd1cmF0aW9uIGZpbGUgaWYgcmVxdWlyZWQ7ICIKKyAgICAgICAgICAgICAgICAgICAgICAibWF4X25hbWVzX3Blcl9jb25uZWN0aW9uPSVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgYnVzX2Nvbm5lY3Rpb25faXNfYWN0aXZlIChjb25uZWN0aW9uKSA/CisgICAgICAgICAgICAgICAgICAgICAgYnVzX2Nvbm5lY3Rpb25fZ2V0X25hbWUgKGNvbm5lY3Rpb24pIDoKKyAgICAgICAgICAgICAgICAgICAgICAiKGluYWN0aXZlKSIsCisgICAgICAgICAgICAgICAgICAgICAgbGltaXQpOworICAgICAgYnVzX2NvbnRleHRfbG9nIChyZWdpc3RyeS0+Y29udGV4dCwgREJVU19TWVNURU1fTE9HX1dBUk5JTkcsCisgICAgICAgICAgIiVzIiwgdG1wX2Vycm9yLm1lc3NhZ2UpOworICAgICAgZGJ1c19tb3ZlX2Vycm9yICgmdG1wX2Vycm9yLCBlcnJvcik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisgIAorICBzZXJ2aWNlID0gYnVzX3JlZ2lzdHJ5X2xvb2t1cCAocmVnaXN0cnksIHNlcnZpY2VfbmFtZSk7CisKKyAgaWYgKHNlcnZpY2UgIT0gTlVMTCkKKyAgICB7CisgICAgICBwcmltYXJ5X293bmVyID0gYnVzX3NlcnZpY2VfZ2V0X3ByaW1hcnlfb3duZXIgKHNlcnZpY2UpOworICAgICAgaWYgKHByaW1hcnlfb3duZXIgIT0gTlVMTCkKKyAgICAgICAgb2xkX293bmVyX2Nvbm4gPSBwcmltYXJ5X293bmVyLT5jb25uOworICAgICAgZWxzZQorICAgICAgICBvbGRfb3duZXJfY29ubiA9IE5VTEw7CisgICAgfQorICBlbHNlCisgICAgb2xkX293bmVyX2Nvbm4gPSBOVUxMOworICAgICAgCisgIGlmIChzZXJ2aWNlID09IE5VTEwpCisgICAgeworICAgICAgc2VydmljZSA9IGJ1c19yZWdpc3RyeV9lbnN1cmUgKHJlZ2lzdHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfbmFtZSwgY29ubmVjdGlvbiwgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb24sIGVycm9yKTsKKyAgICAgIGlmIChzZXJ2aWNlID09IE5VTEwpCisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBwcmltYXJ5X293bmVyID0gYnVzX3NlcnZpY2VfZ2V0X3ByaW1hcnlfb3duZXIgKHNlcnZpY2UpOworICBpZiAocHJpbWFyeV9vd25lciA9PSBOVUxMKQorICAgIGdvdG8gb3V0OworCisgIGlmIChvbGRfb3duZXJfY29ubiA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydCAocHJpbWFyeV9vd25lci0+Y29ubiA9PSBjb25uZWN0aW9uKTsKKworICAgICAgKnJlc3VsdCA9IERCVVNfUkVRVUVTVF9OQU1FX1JFUExZX1BSSU1BUllfT1dORVI7ICAgICAgCisgICAgfQorICBlbHNlIGlmIChvbGRfb3duZXJfY29ubiA9PSBjb25uZWN0aW9uKQorICAgIHsKKyAgICAgIGJ1c19vd25lcl9zZXRfZmxhZ3MgKHByaW1hcnlfb3duZXIsIGZsYWdzKTsKKyAgICAgICpyZXN1bHQgPSBEQlVTX1JFUVVFU1RfTkFNRV9SRVBMWV9BTFJFQURZX09XTkVSOworICAgIH0KKyAgZWxzZSBpZiAoKChmbGFncyAmIERCVVNfTkFNRV9GTEFHX0RPX05PVF9RVUVVRSkgJiYKKyAgICAgICAgICAgIShidXNfc2VydmljZV9nZXRfYWxsb3dfcmVwbGFjZW1lbnQgKHNlcnZpY2UpKSkgfHwKKwkgICAoKGZsYWdzICYgREJVU19OQU1FX0ZMQUdfRE9fTk9UX1FVRVVFKSAmJgorICAgICAgICAgICAhKGZsYWdzICYgREJVU19OQU1FX0ZMQUdfUkVQTEFDRV9FWElTVElORykpKSAKKyAgICB7CisgICAgICBEQnVzTGlzdCAqbGluazsKKyAgICAgIEJ1c093bmVyICp0ZW1wX293bmVyOworICAgIC8qIFNpbmNlIHdlIGNhbid0IGJlIHF1ZXVlZCBpZiB3ZSBhcmUgYWxyZWFkeSBpbiB0aGUgcXVldWUKKyAgICAgICByZW1vdmUgdXMgKi8KKworICAgICAgbGluayA9IF9idXNfc2VydmljZV9maW5kX293bmVyX2xpbmsgKHNlcnZpY2UsIGNvbm5lY3Rpb24pOworICAgICAgaWYgKGxpbmsgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX2xpc3RfdW5saW5rICgmc2VydmljZS0+b3duZXJzLCBsaW5rKTsKKyAgICAgICAgICB0ZW1wX293bmVyID0gKEJ1c093bmVyICopbGluay0+ZGF0YTsKKyAgICAgICAgICBidXNfb3duZXJfdW5yZWYgKHRlbXBfb3duZXIpOyAKKyAgICAgICAgICBfZGJ1c19saXN0X2ZyZWVfbGluayAobGluayk7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgKnJlc3VsdCA9IERCVVNfUkVRVUVTVF9OQU1FX1JFUExZX0VYSVNUUzsKKyAgICB9CisgIGVsc2UgaWYgKCEoZmxhZ3MgJiBEQlVTX05BTUVfRkxBR19ET19OT1RfUVVFVUUpICYmCisgICAgICAgICAgICghKGZsYWdzICYgREJVU19OQU1FX0ZMQUdfUkVQTEFDRV9FWElTVElORykgfHwKKwkgICAgIShidXNfc2VydmljZV9nZXRfYWxsb3dfcmVwbGFjZW1lbnQgKHNlcnZpY2UpKSkpCisgICAgeworICAgICAgLyogUXVldWUgdGhlIGNvbm5lY3Rpb24gKi8KKyAgICAgIGlmICghYnVzX3NlcnZpY2VfYWRkX293bmVyIChzZXJ2aWNlLCBjb25uZWN0aW9uLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbiwgZXJyb3IpKQorICAgICAgICBnb3RvIG91dDsKKyAgICAgIAorICAgICAgKnJlc3VsdCA9IERCVVNfUkVRVUVTVF9OQU1FX1JFUExZX0lOX1FVRVVFOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIFJlcGxhY2UgdGhlIGN1cnJlbnQgb3duZXIgKi8KKworICAgICAgLyogV2UgZW5xdWV1ZSB0aGUgbmV3IG93bmVyIGFuZCByZW1vdmUgdGhlIGZpcnN0IG9uZSBiZWNhdXNlCisgICAgICAgKiB0aGF0IHdpbGwgY2F1c2UgTmFtZUFjcXVpcmVkIGFuZCBOYW1lTG9zdCBtZXNzYWdlcyB0bworICAgICAgICogYmUgc2VudC4KKyAgICAgICAqLworICAgICAgCisgICAgICBpZiAoIWJ1c19zZXJ2aWNlX2FkZF9vd25lciAoc2VydmljZSwgY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbiwgZXJyb3IpKQorICAgICAgICBnb3RvIG91dDsKKworICAgICAgaWYgKHByaW1hcnlfb3duZXItPmRvX25vdF9xdWV1ZSkKKyAgICAgICAgeworICAgICAgICAgIGlmICghYnVzX3NlcnZpY2VfcmVtb3ZlX293bmVyIChzZXJ2aWNlLCBvbGRfb3duZXJfY29ubiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb24sIGVycm9yKSkKKyAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIWJ1c19zZXJ2aWNlX3N3YXBfb3duZXIgKHNlcnZpY2UsIG9sZF9vd25lcl9jb25uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb24sIGVycm9yKSkKKyAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgICAgIAorICAgIAorICAgICAgX2RidXNfYXNzZXJ0IChjb25uZWN0aW9uID09IGJ1c19zZXJ2aWNlX2dldF9wcmltYXJ5X293bmVyIChzZXJ2aWNlKS0+Y29ubik7CisgICAgICAqcmVzdWx0ID0gREJVU19SRVFVRVNUX05BTUVfUkVQTFlfUFJJTUFSWV9PV05FUjsKKyAgICB9CisKKyAgYWN0aXZhdGlvbiA9IGJ1c19jb250ZXh0X2dldF9hY3RpdmF0aW9uIChyZWdpc3RyeS0+Y29udGV4dCk7CisgIHJldHZhbCA9IGJ1c19hY3RpdmF0aW9uX3NlbmRfcGVuZGluZ19hdXRvX2FjdGl2YXRpb25fbWVzc2FnZXMgKGFjdGl2YXRpb24sCisJCQkJCQkJCSBzZXJ2aWNlLAorCQkJCQkJCQkgdHJhbnNhY3Rpb24pOworICBpZiAoIXJldHZhbCkKKyAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAKKyBvdXQ6CisgIHJldHVybiByZXR2YWw7Cit9CisKK2RidXNfYm9vbF90CitidXNfcmVnaXN0cnlfcmVsZWFzZV9zZXJ2aWNlIChCdXNSZWdpc3RyeSAgICAgICpyZWdpc3RyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpzZXJ2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90ICAgICpyZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNUcmFuc2FjdGlvbiAgICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIEJ1c1NlcnZpY2UgKnNlcnZpY2U7CisKKyAgcmV0dmFsID0gRkFMU0U7CisKKyAgaWYgKCFfZGJ1c192YWxpZGF0ZV9idXNfbmFtZSAoc2VydmljZV9uYW1lLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoc2VydmljZV9uYW1lKSkpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0lOVkFMSURfQVJHUywKKyAgICAgICAgICAgICAgICAgICAgICAiR2l2ZW4gYnVzIG5hbWUgXCIlc1wiIGlzIG5vdCB2YWxpZCIsCisgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChzZXJ2aWNlX25hbWUpKTsKKworICAgICAgX2RidXNfdmVyYm9zZSAoIkF0dGVtcHQgdG8gcmVsZWFzZSBpbnZhbGlkIHNlcnZpY2UgbmFtZVxuIik7CisKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAoX2RidXNfc3RyaW5nX2dldF9ieXRlIChzZXJ2aWNlX25hbWUsIDApID09ICc6JykKKyAgICB7CisgICAgICAvKiBOb3QgYWxsb3dlZDsgdGhlIGJhc2Ugc2VydmljZSBuYW1lIGNhbm5vdCBiZSBjcmVhdGVkIG9yIHJlbGVhc2VkICovCisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfSU5WQUxJRF9BUkdTLAorICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgcmVsZWFzZSBhIHNlcnZpY2Ugc3RhcnRpbmcgd2l0aCAnOicgc3VjaCBhcyBcIiVzXCIiLAorICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoc2VydmljZV9uYW1lKSk7CisKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJBdHRlbXB0IHRvIHJlbGVhc2UgaW52YWxpZCBiYXNlIHNlcnZpY2UgbmFtZSBcIiVzXCIiLAorICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChzZXJ2aWNlX25hbWUpKTsKKworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICBpZiAoX2RidXNfc3RyaW5nX2VxdWFsX2Nfc3RyIChzZXJ2aWNlX25hbWUsIERCVVNfU0VSVklDRV9EQlVTKSkKKyAgICB7CisgICAgICAvKiBOb3QgYWxsb3dlZDsgdGhlIGJhc2Ugc2VydmljZSBuYW1lIGNhbm5vdCBiZSBjcmVhdGVkIG9yIHJlbGVhc2VkICovCisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfSU5WQUxJRF9BUkdTLAorICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgcmVsZWFzZSB0aGUgJXMgc2VydmljZSBiZWNhdXNlIGl0IGlzIG93bmVkIGJ5IHRoZSBidXMiLAorICAgICAgICAgICAgICAgICAgICAgREJVU19TRVJWSUNFX0RCVVMpOworCisgICAgICBfZGJ1c192ZXJib3NlICgiQXR0ZW1wdCB0byByZWxlYXNlIHNlcnZpY2UgbmFtZSBcIiVzXCIiLAorICAgICAgICAgICAgICAgICAgICAgREJVU19TRVJWSUNFX0RCVVMpOworCisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgc2VydmljZSA9IGJ1c19yZWdpc3RyeV9sb29rdXAgKHJlZ2lzdHJ5LCBzZXJ2aWNlX25hbWUpOworCisgIGlmIChzZXJ2aWNlID09IE5VTEwpCisgICAgeworICAgICAgKnJlc3VsdCA9IERCVVNfUkVMRUFTRV9OQU1FX1JFUExZX05PTl9FWElTVEVOVDsKKyAgICB9CisgIGVsc2UgaWYgKCFidXNfc2VydmljZV9oYXNfb3duZXIgKHNlcnZpY2UsIGNvbm5lY3Rpb24pKQorICAgIHsKKyAgICAgICpyZXN1bHQgPSBEQlVTX1JFTEVBU0VfTkFNRV9SRVBMWV9OT1RfT1dORVI7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKCFidXNfc2VydmljZV9yZW1vdmVfb3duZXIgKHNlcnZpY2UsIGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb24sIGVycm9yKSkKKyAgICAgICAgZ290byBvdXQ7CisKKyAgICAgIF9kYnVzX2Fzc2VydCAoIWJ1c19zZXJ2aWNlX2hhc19vd25lciAoc2VydmljZSwgY29ubmVjdGlvbikpOworICAgICAgKnJlc3VsdCA9IERCVVNfUkVMRUFTRV9OQU1FX1JFUExZX1JFTEVBU0VEOworICAgIH0KKworICByZXR2YWwgPSBUUlVFOworCisgb3V0OgorICByZXR1cm4gcmV0dmFsOworfQorCitkYnVzX2Jvb2xfdAorYnVzX3JlZ2lzdHJ5X3NldF9zZXJ2aWNlX2NvbnRleHRfdGFibGUgKEJ1c1JlZ2lzdHJ5ICAgKnJlZ2lzdHJ5LAorCQkJCQlEQnVzSGFzaFRhYmxlICp0YWJsZSkKK3sKKyAgREJ1c0hhc2hUYWJsZSAqbmV3X3RhYmxlOworICBEQnVzSGFzaEl0ZXIgaXRlcjsKKyAgCisgIG5ld190YWJsZSA9IGJ1c19zZWxpbnV4X2lkX3RhYmxlX25ldyAoKTsKKyAgaWYgKCFuZXdfdGFibGUpCisgICAgcmV0dXJuIEZBTFNFOworCisgIF9kYnVzX2hhc2hfaXRlcl9pbml0ICh0YWJsZSwgJml0ZXIpOworICB3aGlsZSAoX2RidXNfaGFzaF9pdGVyX25leHQgKCZpdGVyKSkKKyAgICB7CisgICAgICBjb25zdCBjaGFyICpzZXJ2aWNlID0gX2RidXNfaGFzaF9pdGVyX2dldF9zdHJpbmdfa2V5ICgmaXRlcik7CisgICAgICBjb25zdCBjaGFyICpjb250ZXh0ID0gX2RidXNfaGFzaF9pdGVyX2dldF92YWx1ZSAoJml0ZXIpOworCisgICAgICBpZiAoIWJ1c19zZWxpbnV4X2lkX3RhYmxlX2luc2VydCAobmV3X3RhYmxlLAorCQkJCQlzZXJ2aWNlLAorCQkJCQljb250ZXh0KSkKKwlyZXR1cm4gRkFMU0U7CisgICAgfQorICAKKyAgaWYgKHJlZ2lzdHJ5LT5zZXJ2aWNlX3NpZF90YWJsZSkKKyAgICBfZGJ1c19oYXNoX3RhYmxlX3VucmVmIChyZWdpc3RyeS0+c2VydmljZV9zaWRfdGFibGUpOworICByZWdpc3RyeS0+c2VydmljZV9zaWRfdGFibGUgPSBuZXdfdGFibGU7CisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorYnVzX3NlcnZpY2VfdW5saW5rX293bmVyIChCdXNTZXJ2aWNlICAgICAgKnNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c093bmVyICAgICAgICAqb3duZXIpCit7CisgIF9kYnVzX2xpc3RfcmVtb3ZlX2xhc3QgKCZzZXJ2aWNlLT5vd25lcnMsIG93bmVyKTsKKyAgYnVzX293bmVyX3VucmVmIChvd25lcik7Cit9CisKK3N0YXRpYyB2b2lkCitidXNfc2VydmljZV91bmxpbmsgKEJ1c1NlcnZpY2UgKnNlcnZpY2UpCit7CisgIF9kYnVzX2Fzc2VydCAoc2VydmljZS0+b3duZXJzID09IE5VTEwpOworCisgIC8qIHRoZSBzZXJ2aWNlIG1heSBub3QgYmUgaW4gdGhlIGhhc2gsIGlmCisgICAqIHRoZSBmYWlsdXJlIGNhdXNpbmcgdHJhbnNhY3Rpb24gY2FuY2VsCisgICAqIHdhcyBpbiB0aGUgcmlnaHQgcGxhY2UsIGJ1dCB0aGF0J3MgT0sKKyAgICovCisgIF9kYnVzX2hhc2hfdGFibGVfcmVtb3ZlX3N0cmluZyAoc2VydmljZS0+cmVnaXN0cnktPnNlcnZpY2VfaGFzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLT5uYW1lKTsKKyAgCisgIGJ1c19zZXJ2aWNlX3VucmVmIChzZXJ2aWNlKTsKK30KKworc3RhdGljIHZvaWQKK2J1c19zZXJ2aWNlX3JlbGluayAoQnVzU2VydmljZSAgICAgICAgICAgKnNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgIERCdXNQcmVhbGxvY2F0ZWRIYXNoICpwcmVhbGxvY2F0ZWQpCit7CisgIF9kYnVzX2Fzc2VydCAoc2VydmljZS0+b3duZXJzID09IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKHByZWFsbG9jYXRlZCAhPSBOVUxMKTsKKworICBfZGJ1c19oYXNoX3RhYmxlX2luc2VydF9zdHJpbmdfcHJlYWxsb2NhdGVkIChzZXJ2aWNlLT5yZWdpc3RyeS0+c2VydmljZV9oYXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVhbGxvY2F0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UtPm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UpOworICAKKyAgYnVzX3NlcnZpY2VfcmVmIChzZXJ2aWNlKTsKK30KKworLyoqCisgKiBEYXRhIHVzZWQgdG8gcmVwcmVzZW50IGFuIG93bmVyc2hpcCBjYW5jZWxsYXRpb24gaW4KKyAqIGEgYnVzIHRyYW5zYWN0aW9uLgorICovCit0eXBlZGVmIHN0cnVjdAoreworICBCdXNPd25lciAqb3duZXI7ICAgICAgICAgICAgLyoqPCB0aGUgb3duZXIgKi8KKyAgQnVzU2VydmljZSAqc2VydmljZTsgICAgICAgIC8qKjwgc2VydmljZSB0byBjYW5jZWwgb3duZXJzaGlwIG9mICovCit9IE93bmVyc2hpcENhbmNlbERhdGE7CisKK3N0YXRpYyB2b2lkCitjYW5jZWxfb3duZXJzaGlwICh2b2lkICpkYXRhKQoreworICBPd25lcnNoaXBDYW5jZWxEYXRhICpkID0gZGF0YTsKKworICAvKiBXZSBkb24ndCBuZWVkIHRvIHNlbmQgbWVzc2FnZXMgbm90aWZ5aW5nIG9mIHRoZXNlCisgICAqIGNoYW5nZXMsIHNpbmNlIHdlJ3JlIHJldmVydGluZyBzb21ldGhpbmcgdGhhdCB3YXMKKyAgICogY2FuY2VsbGVkIChlZmZlY3RpdmVseSBuZXZlciByZWFsbHkgaGFwcGVuZWQpCisgICAqLworICBidXNfc2VydmljZV91bmxpbmtfb3duZXIgKGQtPnNlcnZpY2UsIGQtPm93bmVyKTsKKyAgCisgIGlmIChkLT5zZXJ2aWNlLT5vd25lcnMgPT0gTlVMTCkKKyAgICBidXNfc2VydmljZV91bmxpbmsgKGQtPnNlcnZpY2UpOworfQorCitzdGF0aWMgdm9pZAorZnJlZV9vd25lcnNoaXBfY2FuY2VsX2RhdGEgKHZvaWQgKmRhdGEpCit7CisgIE93bmVyc2hpcENhbmNlbERhdGEgKmQgPSBkYXRhOworCisgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoZC0+b3duZXItPmNvbm4pOworICBidXNfb3duZXJfdW5yZWYgKGQtPm93bmVyKTsKKyAgYnVzX3NlcnZpY2VfdW5yZWYgKGQtPnNlcnZpY2UpOworICAKKyAgZGJ1c19mcmVlIChkKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CithZGRfY2FuY2VsX293bmVyc2hpcF90b190cmFuc2FjdGlvbiAoQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1NlcnZpY2UgICAgICpzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c093bmVyICAgICAgICpvd25lcikKK3sKKyAgT3duZXJzaGlwQ2FuY2VsRGF0YSAqZDsKKworICBkID0gZGJ1c19uZXcgKE93bmVyc2hpcENhbmNlbERhdGEsIDEpOworICBpZiAoZCA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKyAgCisgIGQtPnNlcnZpY2UgPSBzZXJ2aWNlOworICBkLT5vd25lciA9IG93bmVyOworCisgIGlmICghYnVzX3RyYW5zYWN0aW9uX2FkZF9jYW5jZWxfaG9vayAodHJhbnNhY3Rpb24sIGNhbmNlbF9vd25lcnNoaXAsIGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZV9vd25lcnNoaXBfY2FuY2VsX2RhdGEpKQorICAgIHsKKyAgICAgIGRidXNfZnJlZSAoZCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGJ1c19zZXJ2aWNlX3JlZiAoZC0+c2VydmljZSk7CisgIGJ1c19vd25lcl9yZWYgKG93bmVyKTsKKyAgZGJ1c19jb25uZWN0aW9uX3JlZiAoZC0+b3duZXItPmNvbm4pOworIAorICByZXR1cm4gVFJVRTsKK30KKworLyogdGhpcyBmdW5jdGlvbiBpcyBzZWxmLWNhbmNlbGxpbmcgaWYgeW91IGNhbmNlbCB0aGUgdHJhbnNhY3Rpb24gKi8KK2RidXNfYm9vbF90CitidXNfc2VydmljZV9hZGRfb3duZXIgKEJ1c1NlcnZpY2UgICAgICpzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgIEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBCdXNPd25lciAqYnVzX293bmVyOworICBEQnVzTGlzdCAqYnVzX293bmVyX2xpbms7CisgIAorICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgCisgLyogU2VuZCBzZXJ2aWNlIGFjcXVpcmVkIG1lc3NhZ2UgZmlyc3QsIE9PTSB3aWxsIHJlc3VsdAorICAqIGluIGNhbmNlbGxpbmcgdGhlIHRyYW5zYWN0aW9uCisgICovCisgIGlmIChzZXJ2aWNlLT5vd25lcnMgPT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoIWJ1c19kcml2ZXJfc2VuZF9zZXJ2aWNlX2FjcXVpcmVkIChjb25uZWN0aW9uLCBzZXJ2aWNlLT5uYW1lLCB0cmFuc2FjdGlvbiwgZXJyb3IpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAKKyAgYnVzX293bmVyX2xpbmsgPSBfYnVzX3NlcnZpY2VfZmluZF9vd25lcl9saW5rIChzZXJ2aWNlLCBjb25uZWN0aW9uKTsKKyAgCisgIGlmIChidXNfb3duZXJfbGluayA9PSBOVUxMKQorICAgIHsKKyAgICAgIGJ1c19vd25lciA9IGJ1c19vd25lcl9uZXcgKHNlcnZpY2UsIGNvbm5lY3Rpb24sIGZsYWdzKTsKKyAgICAgIGlmIChidXNfb3duZXIgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIGJ1c19vd25lcl9zZXRfZmxhZ3MgKGJ1c19vd25lciwgZmxhZ3MpOworICAgICAgaWYgKCEoZmxhZ3MgJiBEQlVTX05BTUVfRkxBR19SRVBMQUNFX0VYSVNUSU5HKSB8fCBzZXJ2aWNlLT5vd25lcnMgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGlmICghX2RidXNfbGlzdF9hcHBlbmQgKCZzZXJ2aWNlLT5vd25lcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVzX293bmVyKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgYnVzX293bmVyX3VucmVmIChidXNfb3duZXIpOworICAgICAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGlmICghX2RidXNfbGlzdF9pbnNlcnRfYWZ0ZXIgKCZzZXJ2aWNlLT5vd25lcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZzZXJ2aWNlLT5vd25lcnMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXNfb3duZXIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBidXNfb3duZXJfdW5yZWYgKGJ1c19vd25lcik7CisgICAgICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAgICAgIAorICAgIH0gCisgIGVsc2UgCisgICAgeworICAgICAgLyogVXBkYXRlIHRoZSBsaW5rIHNpbmNlIHdlIGFyZSBhbHJlYWR5IGluIHRoZSBxdWV1ZQorICAgICAgICogTm8gbmVlZCBmb3Igb3BlcmF0aW9ucyB0aGF0IGNhbiBwcm9kdWNlIE9PTQorICAgICAgICovCisKKyAgICAgIGJ1c19vd25lciA9IChCdXNPd25lciAqKSBidXNfb3duZXJfbGluay0+ZGF0YTsKKyAgICAgIGlmIChmbGFncyAmIERCVVNfTkFNRV9GTEFHX1JFUExBQ0VfRVhJU1RJTkcpCisgICAgICAgIHsKKwkgIERCdXNMaXN0ICpsaW5rOworICAgICAgICAgIF9kYnVzX2xpc3RfdW5saW5rICgmc2VydmljZS0+b3duZXJzLCBidXNfb3duZXJfbGluayk7CisJICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJnNlcnZpY2UtPm93bmVycyk7CisJICBfZGJ1c19hc3NlcnQgKGxpbmsgIT0gTlVMTCk7CisJICAKKyAgICAgICAgICBfZGJ1c19saXN0X2luc2VydF9hZnRlcl9saW5rICgmc2VydmljZS0+b3duZXJzLCBsaW5rLCBidXNfb3duZXJfbGluayk7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgYnVzX293bmVyX3NldF9mbGFncyAoYnVzX293bmVyLCBmbGFncyk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgaWYgKCFhZGRfY2FuY2VsX293bmVyc2hpcF90b190cmFuc2FjdGlvbiAodHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1c19vd25lcikpCisgICAgeworICAgICAgYnVzX3NlcnZpY2VfdW5saW5rX293bmVyIChzZXJ2aWNlLCBidXNfb3duZXIpOworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEJ1c093bmVyICAgICAgICpvd25lcjsKKyAgQnVzU2VydmljZSAgICAgKnNlcnZpY2U7CisgIEJ1c093bmVyICAgICAgICpiZWZvcmVfb3duZXI7IC8qIHJlc3RvcmUgdG8gcG9zaXRpb24gYmVmb3JlIHRoaXMgY29ubmVjdGlvbiBpbiBvd25lcnMgbGlzdCAqLworICBEQnVzTGlzdCAgICAgICAqb3duZXJfbGluazsKKyAgREJ1c0xpc3QgICAgICAgKnNlcnZpY2VfbGluazsKKyAgREJ1c1ByZWFsbG9jYXRlZEhhc2ggKmhhc2hfZW50cnk7Cit9IE93bmVyc2hpcFJlc3RvcmVEYXRhOworCitzdGF0aWMgdm9pZAorcmVzdG9yZV9vd25lcnNoaXAgKHZvaWQgKmRhdGEpCit7CisgIE93bmVyc2hpcFJlc3RvcmVEYXRhICpkID0gZGF0YTsKKyAgREJ1c0xpc3QgKmxpbms7CisKKyAgX2RidXNfYXNzZXJ0IChkLT5zZXJ2aWNlX2xpbmsgIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAoZC0+b3duZXJfbGluayAhPSBOVUxMKTsKKyAgCisgIGlmIChkLT5zZXJ2aWNlLT5vd25lcnMgPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c19hc3NlcnQgKGQtPmhhc2hfZW50cnkgIT0gTlVMTCk7CisgICAgICBidXNfc2VydmljZV9yZWxpbmsgKGQtPnNlcnZpY2UsIGQtPmhhc2hfZW50cnkpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydCAoZC0+aGFzaF9lbnRyeSA9PSBOVUxMKTsKKyAgICB9CisgIAorICAvKiBXZSBkb24ndCBuZWVkIHRvIHNlbmQgbWVzc2FnZXMgbm90aWZ5aW5nIG9mIHRoZXNlCisgICAqIGNoYW5nZXMsIHNpbmNlIHdlJ3JlIHJldmVydGluZyBzb21ldGhpbmcgdGhhdCB3YXMKKyAgICogY2FuY2VsbGVkIChlZmZlY3RpdmVseSBuZXZlciByZWFsbHkgaGFwcGVuZWQpCisgICAqLworICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJmQtPnNlcnZpY2UtPm93bmVycyk7CisgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKGxpbmstPmRhdGEgPT0gZC0+YmVmb3JlX293bmVyKQorICAgICAgICBicmVhazsKKworICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJmQtPnNlcnZpY2UtPm93bmVycywgbGluayk7CisgICAgfQorICAKKyAgX2RidXNfbGlzdF9pbnNlcnRfYmVmb3JlX2xpbmsgKCZkLT5zZXJ2aWNlLT5vd25lcnMsIGxpbmssIGQtPm93bmVyX2xpbmspOworCisgIC8qIE5vdGUgdGhhdCByZW1vdmluZyB0aGVuIHJlc3RvcmluZyB0aGlzIGNoYW5nZXMgdGhlIG9yZGVyIGluIHdoaWNoCisgICAqIFNlcnZpY2VEZWxldGVkIG1lc3NhZ2VzIGFyZSBzZW50IG9uIGRlc3RydWN0aW9uIG9mIHRoZQorICAgKiBjb25uZWN0aW9uLiAgVGhpcyBzaG91bGQgYmUgT0sgYXMgdGhlIG9ubHkgZ3VhcmFudGVlIHRoZXJlIGlzCisgICAqIHRoYXQgdGhlIGJhc2Ugc2VydmljZSBpcyBkZXN0cm95ZWQgbGFzdCwgYW5kIHdlIG5ldmVyIGV2ZW4KKyAgICogdGVudGF0aXZlbHkgcmVtb3ZlIHRoZSBiYXNlIHNlcnZpY2UuCisgICAqLworICBidXNfY29ubmVjdGlvbl9hZGRfb3duZWRfc2VydmljZV9saW5rIChkLT5vd25lci0+Y29ubiwgZC0+c2VydmljZV9saW5rKTsKKyAgCisgIGQtPmhhc2hfZW50cnkgPSBOVUxMOworICBkLT5zZXJ2aWNlX2xpbmsgPSBOVUxMOworICBkLT5vd25lcl9saW5rID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK2ZyZWVfb3duZXJzaGlwX3Jlc3RvcmVfZGF0YSAodm9pZCAqZGF0YSkKK3sKKyAgT3duZXJzaGlwUmVzdG9yZURhdGEgKmQgPSBkYXRhOworCisgIGlmIChkLT5zZXJ2aWNlX2xpbmspCisgICAgX2RidXNfbGlzdF9mcmVlX2xpbmsgKGQtPnNlcnZpY2VfbGluayk7CisgIGlmIChkLT5vd25lcl9saW5rKQorICAgIF9kYnVzX2xpc3RfZnJlZV9saW5rIChkLT5vd25lcl9saW5rKTsKKyAgaWYgKGQtPmhhc2hfZW50cnkpCisgICAgX2RidXNfaGFzaF90YWJsZV9mcmVlX3ByZWFsbG9jYXRlZF9lbnRyeSAoZC0+c2VydmljZS0+cmVnaXN0cnktPnNlcnZpY2VfaGFzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLT5oYXNoX2VudHJ5KTsKKworICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGQtPm93bmVyLT5jb25uKTsKKyAgYnVzX293bmVyX3VucmVmIChkLT5vd25lcik7CisgIGJ1c19zZXJ2aWNlX3VucmVmIChkLT5zZXJ2aWNlKTsKKyAgCisgIGRidXNfZnJlZSAoZCk7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYWRkX3Jlc3RvcmVfb3duZXJzaGlwX3RvX3RyYW5zYWN0aW9uIChCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1NlcnZpY2UgICAgICpzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNPd25lciAgICAgICAqb3duZXIpCit7CisgIE93bmVyc2hpcFJlc3RvcmVEYXRhICpkOworICBEQnVzTGlzdCAqbGluazsKKworICBkID0gZGJ1c19uZXcgKE93bmVyc2hpcFJlc3RvcmVEYXRhLCAxKTsKKyAgaWYgKGQgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisgIAorICBkLT5zZXJ2aWNlID0gc2VydmljZTsKKyAgZC0+b3duZXIgPSBvd25lcjsKKyAgZC0+c2VydmljZV9saW5rID0gX2RidXNfbGlzdF9hbGxvY19saW5rIChzZXJ2aWNlKTsKKyAgZC0+b3duZXJfbGluayA9IF9kYnVzX2xpc3RfYWxsb2NfbGluayAob3duZXIpOworICBkLT5oYXNoX2VudHJ5ID0gX2RidXNfaGFzaF90YWJsZV9wcmVhbGxvY2F0ZV9lbnRyeSAoc2VydmljZS0+cmVnaXN0cnktPnNlcnZpY2VfaGFzaCk7CisgIAorICBidXNfc2VydmljZV9yZWYgKGQtPnNlcnZpY2UpOworICBidXNfb3duZXJfcmVmIChkLT5vd25lcik7CisgIGRidXNfY29ubmVjdGlvbl9yZWYgKGQtPm93bmVyLT5jb25uKTsKKworICBkLT5iZWZvcmVfb3duZXIgPSBOVUxMOworICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJnNlcnZpY2UtPm93bmVycyk7CisgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKGxpbmstPmRhdGEgPT0gb3duZXIpCisgICAgICAgIHsKKyAgICAgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmc2VydmljZS0+b3duZXJzLCBsaW5rKTsKKworICAgICAgICAgIGlmIChsaW5rKQorICAgICAgICAgICAgZC0+YmVmb3JlX293bmVyID0gbGluay0+ZGF0YTsKKworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAKKyAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZzZXJ2aWNlLT5vd25lcnMsIGxpbmspOworICAgIH0KKyAgCisgIGlmIChkLT5zZXJ2aWNlX2xpbmsgPT0gTlVMTCB8fAorICAgICAgZC0+b3duZXJfbGluayA9PSBOVUxMIHx8CisgICAgICBkLT5oYXNoX2VudHJ5ID09IE5VTEwgfHwKKyAgICAgICFidXNfdHJhbnNhY3Rpb25fYWRkX2NhbmNlbF9ob29rICh0cmFuc2FjdGlvbiwgcmVzdG9yZV9vd25lcnNoaXAsIGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZV9vd25lcnNoaXBfcmVzdG9yZV9kYXRhKSkKKyAgICB7CisgICAgICBmcmVlX293bmVyc2hpcF9yZXN0b3JlX2RhdGEgKGQpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgCisgIHJldHVybiBUUlVFOworfQorCitkYnVzX2Jvb2xfdAorYnVzX3NlcnZpY2Vfc3dhcF9vd25lciAoQnVzU2VydmljZSAgICAgKnNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgREJ1c0xpc3QgKnN3YXBfbGluazsKKyAgQnVzT3duZXIgKnByaW1hcnlfb3duZXI7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgLyogV2Ugc2VuZCBvdXQgbm90aWZpY2F0aW9ucyBiZWZvcmUgd2UgZG8gYW55IHdvcmsgd2UKKyAgICogbWlnaHQgaGF2ZSB0byB1bmRvIGlmIHRoZSBub3RpZmljYXRpb24tc2VuZGluZyBmYWlsZWQKKyAgICovCisgIAorICAvKiBTZW5kIHNlcnZpY2UgbG9zdCBtZXNzYWdlICovCisgIHByaW1hcnlfb3duZXIgPSBidXNfc2VydmljZV9nZXRfcHJpbWFyeV9vd25lciAoc2VydmljZSk7CisgIGlmIChwcmltYXJ5X293bmVyID09IE5VTEwgfHwgcHJpbWFyeV9vd25lci0+Y29ubiAhPSBjb25uZWN0aW9uKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIlRyaWVkIHRvIHN3YXAgYSBub24gcHJpbWFyeSBvd25lciIpOworCisgICAgCisgIGlmICghYnVzX2RyaXZlcl9zZW5kX3NlcnZpY2VfbG9zdCAoY29ubmVjdGlvbiwgc2VydmljZS0+bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbiwgZXJyb3IpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoc2VydmljZS0+b3duZXJzID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiVHJpZWQgdG8gc3dhcCBvd25lciBvZiBhIHNlcnZpY2UgdGhhdCBoYXMgbm8gb3duZXJzIik7CisgICAgfQorICBlbHNlIGlmIChfZGJ1c19saXN0X2xlbmd0aF9pc19vbmUgKCZzZXJ2aWNlLT5vd25lcnMpKQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIlRyaWVkIHRvIHN3YXAgb3duZXIgb2YgYSBzZXJ2aWNlIHRoYXQgaGFzIG5vIG90aGVyIG93bmVycyBpbiB0aGUgcXVldWUiKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBEQnVzTGlzdCAqbGluazsKKyAgICAgIEJ1c093bmVyICpuZXdfb3duZXI7CisgICAgICBEQnVzQ29ubmVjdGlvbiAqbmV3X293bmVyX2Nvbm47CisgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJnNlcnZpY2UtPm93bmVycyk7CisgICAgICBfZGJ1c19hc3NlcnQgKGxpbmsgIT0gTlVMTCk7CisgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmc2VydmljZS0+b3duZXJzLCBsaW5rKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAobGluayAhPSBOVUxMKTsKKworICAgICAgbmV3X293bmVyID0gKEJ1c093bmVyICopbGluay0+ZGF0YTsKKyAgICAgIG5ld19vd25lcl9jb25uID0gbmV3X293bmVyLT5jb25uOworCisgICAgICBpZiAoIWJ1c19kcml2ZXJfc2VuZF9zZXJ2aWNlX293bmVyX2NoYW5nZWQgKHNlcnZpY2UtPm5hbWUsCisgCQkJCQkJICBidXNfY29ubmVjdGlvbl9nZXRfbmFtZSAoY29ubmVjdGlvbiksCisgCQkJCQkJICBidXNfY29ubmVjdGlvbl9nZXRfbmFtZSAobmV3X293bmVyX2Nvbm4pLAorIAkJCQkJCSAgdHJhbnNhY3Rpb24sIGVycm9yKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICAvKiBUaGlzIHdpbGwgYmUgb3VyIG5ldyBvd25lciAqLworICAgICAgaWYgKCFidXNfZHJpdmVyX3NlbmRfc2VydmljZV9hY3F1aXJlZCAobmV3X293bmVyX2Nvbm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLT5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFhZGRfcmVzdG9yZV9vd25lcnNoaXBfdG9fdHJhbnNhY3Rpb24gKHRyYW5zYWN0aW9uLCBzZXJ2aWNlLCBwcmltYXJ5X293bmVyKSkKKyAgICB7CisgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAvKiB1bmxpbmsgdGhlIHByaW1hcnkgYW5kIG1ha2UgaXQgdGhlIHNlY29uZCBsaW5rICovCisgIHN3YXBfbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZzZXJ2aWNlLT5vd25lcnMpOworICBfZGJ1c19saXN0X3VubGluayAoJnNlcnZpY2UtPm93bmVycywgc3dhcF9saW5rKTsKKworICBfZGJ1c19saXN0X2luc2VydF9hZnRlcl9saW5rICgmc2VydmljZS0+b3duZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmc2VydmljZS0+b3duZXJzKSwKKwkJCQlzd2FwX2xpbmspOworCisgIHJldHVybiBUUlVFOworfQorCisvKiB0aGlzIGZ1bmN0aW9uIGlzIHNlbGYtY2FuY2VsbGluZyBpZiB5b3UgY2FuY2VsIHRoZSB0cmFuc2FjdGlvbiAqLworZGJ1c19ib29sX3QKK2J1c19zZXJ2aWNlX3JlbW92ZV9vd25lciAoQnVzU2VydmljZSAgICAgKnNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgQnVzT3duZXIgKnByaW1hcnlfb3duZXI7CisgIAorICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgCisgIC8qIFdlIHNlbmQgb3V0IG5vdGlmaWNhdGlvbnMgYmVmb3JlIHdlIGRvIGFueSB3b3JrIHdlCisgICAqIG1pZ2h0IGhhdmUgdG8gdW5kbyBpZiB0aGUgbm90aWZpY2F0aW9uLXNlbmRpbmcgZmFpbGVkCisgICAqLworICAKKyAgLyogU2VuZCBzZXJ2aWNlIGxvc3QgbWVzc2FnZSAqLworICBwcmltYXJ5X293bmVyID0gYnVzX3NlcnZpY2VfZ2V0X3ByaW1hcnlfb3duZXIgKHNlcnZpY2UpOworICBpZiAocHJpbWFyeV9vd25lciAhPSBOVUxMICYmIHByaW1hcnlfb3duZXItPmNvbm4gPT0gY29ubmVjdGlvbikKKyAgICB7CisgICAgICBpZiAoIWJ1c19kcml2ZXJfc2VuZF9zZXJ2aWNlX2xvc3QgKGNvbm5lY3Rpb24sIHNlcnZpY2UtPm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uLCBlcnJvcikpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBpZiB3ZSBhcmUgbm90IHRoZSBwcmltYXJ5IG93bmVyIHRoZW4ganVzdCByZW1vdmUgdXMgZnJvbSB0aGUgcXVldWUgKi8KKyAgICAgIERCdXNMaXN0ICpsaW5rOworICAgICAgQnVzT3duZXIgKnRlbXBfb3duZXI7CisKKyAgICAgIGxpbmsgPSBfYnVzX3NlcnZpY2VfZmluZF9vd25lcl9saW5rIChzZXJ2aWNlLCBjb25uZWN0aW9uKTsKKyAgICAgIF9kYnVzX2xpc3RfdW5saW5rICgmc2VydmljZS0+b3duZXJzLCBsaW5rKTsKKyAgICAgIHRlbXBfb3duZXIgPSAoQnVzT3duZXIgKilsaW5rLT5kYXRhOworICAgICAgYnVzX293bmVyX3VucmVmICh0ZW1wX293bmVyKTsgCisgICAgICBfZGJ1c19saXN0X2ZyZWVfbGluayAobGluayk7CisKKyAgICAgIHJldHVybiBUUlVFOyAKKyAgICB9CisKKyAgaWYgKHNlcnZpY2UtPm93bmVycyA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIlRyaWVkIHRvIHJlbW92ZSBvd25lciBvZiBhIHNlcnZpY2UgdGhhdCBoYXMgbm8gb3duZXJzIik7CisgICAgfQorICBlbHNlIGlmIChfZGJ1c19saXN0X2xlbmd0aF9pc19vbmUgKCZzZXJ2aWNlLT5vd25lcnMpKQorICAgIHsKKyAgICAgIGlmICghYnVzX2RyaXZlcl9zZW5kX3NlcnZpY2Vfb3duZXJfY2hhbmdlZCAoc2VydmljZS0+bmFtZSwKKyAJCQkJCQkgIGJ1c19jb25uZWN0aW9uX2dldF9uYW1lIChjb25uZWN0aW9uKSwKKyAJCQkJCQkgIE5VTEwsCisgCQkJCQkJICB0cmFuc2FjdGlvbiwgZXJyb3IpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgREJ1c0xpc3QgKmxpbms7CisgICAgICBCdXNPd25lciAqbmV3X293bmVyOworICAgICAgREJ1c0Nvbm5lY3Rpb24gKm5ld19vd25lcl9jb25uOworICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZzZXJ2aWNlLT5vd25lcnMpOworICAgICAgX2RidXNfYXNzZXJ0IChsaW5rICE9IE5VTEwpOworICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJnNlcnZpY2UtPm93bmVycywgbGluayk7CisgICAgICBfZGJ1c19hc3NlcnQgKGxpbmsgIT0gTlVMTCk7CisKKyAgICAgIG5ld19vd25lciA9IChCdXNPd25lciAqKWxpbmstPmRhdGE7CisgICAgICBuZXdfb3duZXJfY29ubiA9IG5ld19vd25lci0+Y29ubjsKKworICAgICAgaWYgKCFidXNfZHJpdmVyX3NlbmRfc2VydmljZV9vd25lcl9jaGFuZ2VkIChzZXJ2aWNlLT5uYW1lLAorIAkJCQkJCSAgYnVzX2Nvbm5lY3Rpb25fZ2V0X25hbWUgKGNvbm5lY3Rpb24pLAorIAkJCQkJCSAgYnVzX2Nvbm5lY3Rpb25fZ2V0X25hbWUgKG5ld19vd25lcl9jb25uKSwKKyAJCQkJCQkgIHRyYW5zYWN0aW9uLCBlcnJvcikpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgLyogVGhpcyB3aWxsIGJlIG91ciBuZXcgb3duZXIgKi8KKyAgICAgIGlmICghYnVzX2RyaXZlcl9zZW5kX3NlcnZpY2VfYWNxdWlyZWQgKG5ld19vd25lcl9jb25uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS0+bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghYWRkX3Jlc3RvcmVfb3duZXJzaGlwX3RvX3RyYW5zYWN0aW9uICh0cmFuc2FjdGlvbiwgc2VydmljZSwgcHJpbWFyeV9vd25lcikpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgCisgIGJ1c19zZXJ2aWNlX3VubGlua19vd25lciAoc2VydmljZSwgcHJpbWFyeV9vd25lcik7CisKKyAgaWYgKHNlcnZpY2UtPm93bmVycyA9PSBOVUxMKQorICAgIGJ1c19zZXJ2aWNlX3VubGluayAoc2VydmljZSk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK0J1c1NlcnZpY2UgKgorYnVzX3NlcnZpY2VfcmVmIChCdXNTZXJ2aWNlICpzZXJ2aWNlKQoreworICBfZGJ1c19hc3NlcnQgKHNlcnZpY2UtPnJlZmNvdW50ID4gMCk7CisgIAorICBzZXJ2aWNlLT5yZWZjb3VudCArPSAxOworCisgIHJldHVybiBzZXJ2aWNlOworfQorCit2b2lkCitidXNfc2VydmljZV91bnJlZiAoQnVzU2VydmljZSAqc2VydmljZSkKK3sKKyAgX2RidXNfYXNzZXJ0IChzZXJ2aWNlLT5yZWZjb3VudCA+IDApOworICAKKyAgc2VydmljZS0+cmVmY291bnQgLT0gMTsKKworICBpZiAoc2VydmljZS0+cmVmY291bnQgPT0gMCkKKyAgICB7CisgICAgICBfZGJ1c19hc3NlcnQgKHNlcnZpY2UtPm93bmVycyA9PSBOVUxMKTsKKyAgICAgIAorICAgICAgZGJ1c19mcmVlIChzZXJ2aWNlLT5uYW1lKTsKKyAgICAgIF9kYnVzX21lbV9wb29sX2RlYWxsb2MgKHNlcnZpY2UtPnJlZ2lzdHJ5LT5zZXJ2aWNlX3Bvb2wsIHNlcnZpY2UpOworICAgIH0KK30KKworREJ1c0Nvbm5lY3Rpb24gKgorYnVzX3NlcnZpY2VfZ2V0X3ByaW1hcnlfb3duZXJzX2Nvbm5lY3Rpb24gKEJ1c1NlcnZpY2UgKnNlcnZpY2UpCit7CisgIEJ1c093bmVyICpvd25lcjsKKworICBvd25lciA9IGJ1c19zZXJ2aWNlX2dldF9wcmltYXJ5X293bmVyIChzZXJ2aWNlKTsKKworICBpZiAob3duZXIgIT0gTlVMTCkKKyAgICByZXR1cm4gb3duZXItPmNvbm47CisgIGVsc2UKKyAgICByZXR1cm4gTlVMTDsKK30KKworQnVzT3duZXIqCitidXNfc2VydmljZV9nZXRfcHJpbWFyeV9vd25lciAoQnVzU2VydmljZSAqc2VydmljZSkKK3sKKyAgcmV0dXJuIF9kYnVzX2xpc3RfZ2V0X2ZpcnN0ICgmc2VydmljZS0+b3duZXJzKTsKK30KKworY29uc3QgY2hhcioKK2J1c19zZXJ2aWNlX2dldF9uYW1lIChCdXNTZXJ2aWNlICpzZXJ2aWNlKQoreworICByZXR1cm4gc2VydmljZS0+bmFtZTsKK30KKworZGJ1c19ib29sX3QKK2J1c19zZXJ2aWNlX2dldF9hbGxvd19yZXBsYWNlbWVudCAoQnVzU2VydmljZSAqc2VydmljZSkKK3sKKyAgQnVzT3duZXIgKm93bmVyOworICBEQnVzTGlzdCAqbGluazsKKyAKKyAgX2RidXNfYXNzZXJ0IChzZXJ2aWNlLT5vd25lcnMgIT0gTlVMTCk7CisKKyAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZzZXJ2aWNlLT5vd25lcnMpOworICBvd25lciA9IChCdXNPd25lciAqKSBsaW5rLT5kYXRhOworCisgIHJldHVybiBvd25lci0+YWxsb3dfcmVwbGFjZW1lbnQ7Cit9CisKK2RidXNfYm9vbF90CitidXNfc2VydmljZV9oYXNfb3duZXIgKEJ1c1NlcnZpY2UgICAgICpzZXJ2aWNlLAorCQkgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIERCdXNMaXN0ICpsaW5rOworCisgIGxpbmsgPSBfYnVzX3NlcnZpY2VfZmluZF9vd25lcl9saW5rIChzZXJ2aWNlLCBjb25uZWN0aW9uKTsKKyAKKyAgaWYgKGxpbmsgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisgIGVsc2UKKyAgICByZXR1cm4gVFJVRTsKK30KKworZGJ1c19ib29sX3QgCitidXNfc2VydmljZV9saXN0X3F1ZXVlZF9vd25lcnMgKEJ1c1NlcnZpY2UgKnNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNMaXN0ICAqKnJldHVybl9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICplcnJvcikKK3sKKyAgREJ1c0xpc3QgKmxpbms7CisKKyAgX2RidXNfYXNzZXJ0ICgqcmV0dXJuX2xpc3QgPT0gTlVMTCk7CisKKyAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZzZXJ2aWNlLT5vd25lcnMpOworICBfZGJ1c19hc3NlcnQgKGxpbmsgIT0gTlVMTCk7CisgIAorICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIEJ1c093bmVyICpvd25lcjsKKyAgICAgIGNvbnN0IGNoYXIgKnVuYW1lOworCisgICAgICBvd25lciA9IChCdXNPd25lciAqKSBsaW5rLT5kYXRhOworICAgICAgdW5hbWUgPSBidXNfY29ubmVjdGlvbl9nZXRfbmFtZSAob3duZXItPmNvbm4pOworCisgICAgICBpZiAoIV9kYnVzX2xpc3RfYXBwZW5kIChyZXR1cm5fbGlzdCwgKGNoYXIgKil1bmFtZSkpCisgICAgICAgIGdvdG8gb29tOworCisgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmc2VydmljZS0+b3duZXJzLCBsaW5rKTsKKyAgICB9CisgIAorICByZXR1cm4gVFJVRTsKKyAgCisgb29tOgorICBfZGJ1c19saXN0X2NsZWFyIChyZXR1cm5fbGlzdCk7CisgIEJVU19TRVRfT09NIChlcnJvcik7CisgIHJldHVybiBGQUxTRTsKK30KZGlmZiAtLWdpdCBhL2J1cy9zZXJ2aWNlcy5oIGIvYnVzL3NlcnZpY2VzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU2ZGQ5ZgotLS0gL2Rldi9udWxsCisrKyBiL2J1cy9zZXJ2aWNlcy5oCkBAIC0wLDAgKzEsOTQgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogc2VydmljZXMuaCAgU2VydmljZSBtYW5hZ2VtZW50CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzICBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpZm5kZWYgQlVTX1NFUlZJQ0VTX0gKKyNkZWZpbmUgQlVTX1NFUlZJQ0VTX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zdHJpbmcuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtaGFzaC5oPgorI2luY2x1ZGUgImNvbm5lY3Rpb24uaCIKKyNpbmNsdWRlICJidXMuaCIKKwordHlwZWRlZiB2b2lkICgqIEJ1c1NlcnZpY2VGb3JlYWNoRnVuY3Rpb24pIChCdXNTZXJ2aWNlICAgICAgICpzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICpkYXRhKTsKKworQnVzUmVnaXN0cnkqIGJ1c19yZWdpc3RyeV9uZXcgICAgICAgICAgICAgKEJ1c0NvbnRleHQgICAgICAgICAgICAgICAgICAqY29udGV4dCk7CitCdXNSZWdpc3RyeSogYnVzX3JlZ2lzdHJ5X3JlZiAgICAgICAgICAgICAoQnVzUmVnaXN0cnkgICAgICAgICAgICAgICAgICpyZWdpc3RyeSk7Cit2b2lkICAgICAgICAgYnVzX3JlZ2lzdHJ5X3VucmVmICAgICAgICAgICAoQnVzUmVnaXN0cnkgICAgICAgICAgICAgICAgICpyZWdpc3RyeSk7CitCdXNTZXJ2aWNlKiAgYnVzX3JlZ2lzdHJ5X2xvb2t1cCAgICAgICAgICAoQnVzUmVnaXN0cnkgICAgICAgICAgICAgICAgICpyZWdpc3RyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICAgICAgICAgICAgKnNlcnZpY2VfbmFtZSk7CitCdXNTZXJ2aWNlKiAgYnVzX3JlZ2lzdHJ5X2Vuc3VyZSAgICAgICAgICAoQnVzUmVnaXN0cnkgICAgICAgICAgICAgICAgICpyZWdpc3RyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICAgICAgICAgICAgKnNlcnZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAgKm93bmVyX2Nvbm5lY3Rpb25faWZfY3JlYXRlZCwKKwkJCQkJICAgZGJ1c191aW50MzJfdCAgICAgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNUcmFuc2FjdGlvbiAgICAgICAgICAgICAgKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICAgICAgICAgICAqZXJyb3IpOwordm9pZCAgICAgICAgIGJ1c19yZWdpc3RyeV9mb3JlYWNoICAgICAgICAgKEJ1c1JlZ2lzdHJ5ICAgICAgICAgICAgICAgICAqcmVnaXN0cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzU2VydmljZUZvcmVhY2hGdW5jdGlvbiAgICBmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEpOworZGJ1c19ib29sX3QgIGJ1c19yZWdpc3RyeV9saXN0X3NlcnZpY2VzICAgKEJ1c1JlZ2lzdHJ5ICAgICAgICAgICAgICAgICAqcmVnaXN0cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAgICAgICAgICAgICAgICAqKipsaXN0cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgKmFycmF5X2xlbik7CitkYnVzX2Jvb2xfdCAgYnVzX3JlZ2lzdHJ5X2FjcXVpcmVfc2VydmljZSAoQnVzUmVnaXN0cnkgICAgICAgICAgICAgICAgICpyZWdpc3RyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAgICAgICAgICAgICpzZXJ2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgICAgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90ICAgICAgICAgICAgICAgKnJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNUcmFuc2FjdGlvbiAgICAgICAgICAgICAgKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICAgICAgICAgICAqZXJyb3IpOworZGJ1c19ib29sX3QgIGJ1c19yZWdpc3RyeV9yZWxlYXNlX3NlcnZpY2UgKEJ1c1JlZ2lzdHJ5ICAgICAgICAgICAgICAgICAqcmVnaXN0cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICAgICAgICAgICAqc2VydmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgICAgICAgICAgICAgICAqcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c1RyYW5zYWN0aW9uICAgICAgICAgICAgICAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgICAgICAgICAgICplcnJvcik7CitkYnVzX2Jvb2xfdCAgYnVzX3JlZ2lzdHJ5X3NldF9zZXJ2aWNlX2NvbnRleHRfdGFibGUgKEJ1c1JlZ2lzdHJ5ICAgICAgICAgICAqcmVnaXN0cnksCisJCQkJCQkgICAgIERCdXNIYXNoVGFibGUgICAgICAgICAqdGFibGUpOworCitCdXNTZXJ2aWNlKiAgICAgYnVzX3NlcnZpY2VfcmVmICAgICAgICAgICAgICAgICAgICAgICAoQnVzU2VydmljZSAgICAgKnNlcnZpY2UpOwordm9pZCAgICAgICAgICAgIGJ1c19zZXJ2aWNlX3VucmVmICAgICAgICAgICAgICAgICAgICAgKEJ1c1NlcnZpY2UgICAgICpzZXJ2aWNlKTsKK2RidXNfYm9vbF90ICAgICBidXNfc2VydmljZV9hZGRfb3duZXIgICAgICAgICAgICAgICAgIChCdXNTZXJ2aWNlICAgICAqc2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCQkJCSAgICAgICBkYnVzX3VpbnQzMl90ICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcik7CitkYnVzX2Jvb2xfdCAgICAgYnVzX3NlcnZpY2Vfc3dhcF9vd25lciAgICAgICAgICAgICAgICAoQnVzU2VydmljZSAgICAgKnNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcik7CitkYnVzX2Jvb2xfdCAgICAgYnVzX3NlcnZpY2VfcmVtb3ZlX293bmVyICAgICAgICAgICAgICAoQnVzU2VydmljZSAgICAgKnNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcik7CitkYnVzX2Jvb2xfdCAgICAgYnVzX3NlcnZpY2VfaGFzX293bmVyICAgICAgICAgICAgICAgICAoQnVzU2VydmljZSAgICAgKnNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOworQnVzT3duZXIqICAgICAgIGJ1c19zZXJ2aWNlX2dldF9wcmltYXJ5X293bmVyICAgICAgICAgKEJ1c1NlcnZpY2UgICAgICpzZXJ2aWNlKTsKK2RidXNfYm9vbF90ICAgICBidXNfc2VydmljZV9nZXRfYWxsb3dfcmVwbGFjZW1lbnQgICAgIChCdXNTZXJ2aWNlICAgICAqc2VydmljZSk7Citjb25zdCBjaGFyKiAgICAgYnVzX3NlcnZpY2VfZ2V0X25hbWUgICAgICAgICAgICAgICAgICAoQnVzU2VydmljZSAgICAgKnNlcnZpY2UpOworZGJ1c19ib29sX3QgICAgIGJ1c19zZXJ2aWNlX2xpc3RfcXVldWVkX293bmVycyAgICAgICAgKEJ1c1NlcnZpY2UgKnNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICoqcmV0dXJuX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAqZXJyb3IpOworCitEQnVzQ29ubmVjdGlvbiogYnVzX3NlcnZpY2VfZ2V0X3ByaW1hcnlfb3duZXJzX2Nvbm5lY3Rpb24gKEJ1c1NlcnZpY2UgICAgICpzZXJ2aWNlKTsKKyNlbmRpZiAvKiBCVVNfU0VSVklDRVNfSCAqLwpkaWZmIC0tZ2l0IGEvYnVzL3Nlc3Npb24uY29uZi5pbiBiL2J1cy9zZXNzaW9uLmNvbmYuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZmYTdmMQotLS0gL2Rldi9udWxsCisrKyBiL2J1cy9zZXNzaW9uLmNvbmYuaW4KQEAgLTAsMCArMSw4MCBAQAorPCEtLSBUaGlzIGNvbmZpZ3VyYXRpb24gZmlsZSBjb250cm9scyB0aGUgcGVyLXVzZXItbG9naW4tc2Vzc2lvbiBtZXNzYWdlIGJ1cy4KKyAgICAgQWRkIGEgc2Vzc2lvbi1sb2NhbC5jb25mIGFuZCBlZGl0IHRoYXQgcmF0aGVyIHRoYW4gY2hhbmdpbmcgdGhpcyAKKyAgICAgZmlsZSBkaXJlY3RseS4gLS0+CisKKzwhRE9DVFlQRSBidXNjb25maWcgUFVCTElDICItLy9mcmVlZGVza3RvcC8vRFREIEQtQnVzIEJ1cyBDb25maWd1cmF0aW9uIDEuMC8vRU4iCisgImh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3N0YW5kYXJkcy9kYnVzLzEuMC9idXNjb25maWcuZHRkIj4KKzxidXNjb25maWc+CisgIDwhLS0gT3VyIHdlbGwta25vd24gYnVzIHR5cGUsIGRvbid0IGNoYW5nZSB0aGlzIC0tPgorICA8dHlwZT5zZXNzaW9uPC90eXBlPgorCisgIDwhLS0gSWYgd2UgZm9yaywga2VlcCB0aGUgdXNlcidzIG9yaWdpbmFsIHVtYXNrIHRvIGF2b2lkIGFmZmVjdGluZworICAgICAgIHRoZSBiZWhhdmlvciBvZiBjaGlsZCBwcm9jZXNzZXMuIC0tPgorICA8a2VlcF91bWFzay8+CisKKyAgPGxpc3Rlbj5AREJVU19TRVNTSU9OX0JVU19MSVNURU5fQUREUkVTU0A8L2xpc3Rlbj4KKworICA8IS0tIE9uIFVuaXggc3lzdGVtcywgdGhlIG1vc3Qgc2VjdXJlIGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbSBpcworICBFWFRFUk5BTCwgd2hpY2ggdXNlcyBjcmVkZW50aWFsLXBhc3Npbmcgb3ZlciBVbml4IHNvY2tldHMuCisKKyAgVGhpcyBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc20gaXMgbm90IGF2YWlsYWJsZSBvbiBXaW5kb3dzLAorICBpcyBub3Qgc3VpdGFibGUgZm9yIHVzZSB3aXRoIHRoZSB0Y3A6IG9yIG5vbmNlLXRjcDogdHJhbnNwb3J0cywKKyAgYW5kIHdpbGwgbm90IHdvcmsgb24gb2JzY3VyZSBmbGF2b3VycyBvZiBVbml4IHRoYXQgZG8gbm90IGhhdmUKKyAgYSBzdXBwb3J0ZWQgY3JlZGVudGlhbHMtcGFzc2luZyBtZWNoYW5pc20uIE9uIHRob3NlIHBsYXRmb3Jtcy90cmFuc3BvcnRzLAorICBjb21tZW50IG91dCB0aGUgPGF1dGg+IGVsZW1lbnQgdG8gYWxsb3cgZmFsbGJhY2sgdG8gREJVU19DT09LSUVfU0hBMS4gLS0+CisgIEBEQlVTX1NFU1NJT05fQ09ORl9NQVlCRV9BVVRIX0VYVEVSTkFMQAorCisgIDxzdGFuZGFyZF9zZXNzaW9uX3NlcnZpY2VkaXJzIC8+CisKKyAgPHBvbGljeSBjb250ZXh0PSJkZWZhdWx0Ij4KKyAgICA8IS0tIEFsbG93IGV2ZXJ5dGhpbmcgdG8gYmUgc2VudCAtLT4KKyAgICA8YWxsb3cgc2VuZF9kZXN0aW5hdGlvbj0iKiIgZWF2ZXNkcm9wPSJ0cnVlIi8+CisgICAgPCEtLSBBbGxvdyBldmVyeXRoaW5nIHRvIGJlIHJlY2VpdmVkIC0tPgorICAgIDxhbGxvdyBlYXZlc2Ryb3A9InRydWUiLz4KKyAgICA8IS0tIEFsbG93IGFueW9uZSB0byBvd24gYW55dGhpbmcgLS0+CisgICAgPGFsbG93IG93bj0iKiIvPgorICA8L3BvbGljeT4KKworICA8IS0tIEluY2x1ZGUgbGVnYWN5IGNvbmZpZ3VyYXRpb24gbG9jYXRpb24gLS0+CisgIDxpbmNsdWRlIGlnbm9yZV9taXNzaW5nPSJ5ZXMiPkBTWVNDT05GRElSX0ZST01fUEtHREFUQURJUkAvZGJ1cy0xL3Nlc3Npb24uY29uZjwvaW5jbHVkZT4KKworICA8IS0tIENvbmZpZyBmaWxlcyBhcmUgcGxhY2VkIGhlcmUgdGhhdCBhbW9uZyBvdGhlciB0aGluZ3MsIAorICAgICAgIGZ1cnRoZXIgcmVzdHJpY3QgdGhlIGFib3ZlIHBvbGljeSBmb3Igc3BlY2lmaWMgc2VydmljZXMuIC0tPgorICA8aW5jbHVkZWRpcj5zZXNzaW9uLmQ8L2luY2x1ZGVkaXI+CisKKyAgPGluY2x1ZGVkaXI+QFNZU0NPTkZESVJfRlJPTV9QS0dEQVRBRElSQC9kYnVzLTEvc2Vzc2lvbi5kPC9pbmNsdWRlZGlyPgorCisgIDwhLS0gVGhpcyBpcyBpbmNsdWRlZCBsYXN0IHNvIGxvY2FsIGNvbmZpZ3VyYXRpb24gY2FuIG92ZXJyaWRlIHdoYXQncyAKKyAgICAgICBpbiB0aGlzIHN0YW5kYXJkIGZpbGUgLS0+CisgIDxpbmNsdWRlIGlnbm9yZV9taXNzaW5nPSJ5ZXMiPkBTWVNDT05GRElSX0ZST01fUEtHREFUQURJUkAvZGJ1cy0xL3Nlc3Npb24tbG9jYWwuY29uZjwvaW5jbHVkZT4KKworICA8aW5jbHVkZSBpZl9zZWxpbnV4X2VuYWJsZWQ9InllcyIgc2VsaW51eF9yb290X3JlbGF0aXZlPSJ5ZXMiPmNvbnRleHRzL2RidXNfY29udGV4dHM8L2luY2x1ZGU+CisKKyAgPCEtLSBGb3IgdGhlIHNlc3Npb24gYnVzLCBvdmVycmlkZSB0aGUgZGVmYXVsdCByZWxhdGl2ZWx5LWxvdyBsaW1pdHMgCisgICAgICAgd2l0aCBlc3NlbnRpYWxseSBpbmZpbml0ZSBsaW1pdHMsIHNpbmNlIHRoZSBidXMgaXMganVzdCBydW5uaW5nIAorICAgICAgIGFzIHRoZSB1c2VyIGFueXdheSwgdXNpbmcgdXAgYnVzIHJlc291cmNlcyBpcyBub3Qgc29tZXRoaW5nIHdlIG5lZWQgCisgICAgICAgdG8gd29ycnkgYWJvdXQuIEluIHNvbWUgY2FzZXMsIHdlIGRvIHNldCB0aGUgbGltaXRzIGxvd2VyIHRoYW4gCisgICAgICAgImFsbCBhdmFpbGFibGUgbWVtb3J5IiBpZiBleGNlZWRpbmcgdGhlIGxpbWl0IGlzIGFsbW9zdCBjZXJ0YWlubHkgYSBidWcsIAorICAgICAgIGhhdmluZyB0aGUgYnVzIGVuZm9yY2UgYSBsaW1pdCBpcyBuaWNlciB0aGFuIGEgaHVnZSBtZW1vcnkgbGVhay4gQnV0IHRoZSAKKyAgICAgICBpbnRlbnQgaXMgdGhhdCB0aGVzZSBsaW1pdHMgc2hvdWxkIG5ldmVyIGJlIGhpdC4gLS0+CisKKyAgPCEtLSB0aGUgbWVtb3J5IGxpbWl0cyBhcmUgMUcgaW5zdGVhZCBvZiBzYXkgNEcgYmVjYXVzZSB0aGV5IGNhbid0IGV4Y2VlZCAzMi1iaXQgc2lnbmVkIGludCBtYXggLS0+CisgIDxsaW1pdCBuYW1lPSJtYXhfaW5jb21pbmdfYnl0ZXMiPjEwMDAwMDAwMDA8L2xpbWl0PgorICA8bGltaXQgbmFtZT0ibWF4X2luY29taW5nX3VuaXhfZmRzIj4yNTAwMDAwMDA8L2xpbWl0PgorICA8bGltaXQgbmFtZT0ibWF4X291dGdvaW5nX2J5dGVzIj4xMDAwMDAwMDAwPC9saW1pdD4KKyAgPGxpbWl0IG5hbWU9Im1heF9vdXRnb2luZ191bml4X2ZkcyI+MjUwMDAwMDAwPC9saW1pdD4KKyAgPGxpbWl0IG5hbWU9Im1heF9tZXNzYWdlX3NpemUiPjEwMDAwMDAwMDA8L2xpbWl0PgorICA8IS0tIFdlIGRvIG5vdCBvdmVycmlkZSBtYXhfbWVzc2FnZV91bml4X2ZkcyBoZXJlIHNpbmNlIHRoZSBpbi1rZXJuZWwKKyAgICAgICBsaW1pdCBpcyBhbHNvIHJlbGF0aXZlbHkgbG93IC0tPgorICA8bGltaXQgbmFtZT0ic2VydmljZV9zdGFydF90aW1lb3V0Ij4xMjAwMDA8L2xpbWl0PiAgCisgIDxsaW1pdCBuYW1lPSJhdXRoX3RpbWVvdXQiPjI0MDAwMDwvbGltaXQ+CisgIDxsaW1pdCBuYW1lPSJwZW5kaW5nX2ZkX3RpbWVvdXQiPjE1MDAwMDwvbGltaXQ+CisgIDxsaW1pdCBuYW1lPSJtYXhfY29tcGxldGVkX2Nvbm5lY3Rpb25zIj4xMDAwMDA8L2xpbWl0PiAgCisgIDxsaW1pdCBuYW1lPSJtYXhfaW5jb21wbGV0ZV9jb25uZWN0aW9ucyI+MTAwMDA8L2xpbWl0PgorICA8bGltaXQgbmFtZT0ibWF4X2Nvbm5lY3Rpb25zX3Blcl91c2VyIj4xMDAwMDA8L2xpbWl0PgorICA8bGltaXQgbmFtZT0ibWF4X3BlbmRpbmdfc2VydmljZV9zdGFydHMiPjEwMDAwPC9saW1pdD4KKyAgPGxpbWl0IG5hbWU9Im1heF9uYW1lc19wZXJfY29ubmVjdGlvbiI+NTAwMDA8L2xpbWl0PgorICA8bGltaXQgbmFtZT0ibWF4X21hdGNoX3J1bGVzX3Blcl9jb25uZWN0aW9uIj41MDAwMDwvbGltaXQ+CisgIDxsaW1pdCBuYW1lPSJtYXhfcmVwbGllc19wZXJfY29ubmVjdGlvbiI+NTAwMDA8L2xpbWl0PgorCis8L2J1c2NvbmZpZz4KZGlmZiAtLWdpdCBhL2J1cy9zaWduYWxzLmMgYi9idXMvc2lnbmFscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiN2E0NjQKLS0tIC9kZXYvbnVsbAorKysgYi9idXMvc2lnbmFscy5jCkBAIC0wLDAgKzEsMjk4NSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBzaWduYWxzLmMgIEJ1cyBzaWduYWwgY29ubmVjdGlvbiBpbXBsZW1lbnRhdGlvbgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMywgMjAwNSAgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJzaWduYWxzLmgiCisjaW5jbHVkZSAic2VydmljZXMuaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorI2luY2x1ZGUgPGRidXMvZGJ1cy1tYXJzaGFsLXZhbGlkYXRlLmg+CisKK3N0cnVjdCBCdXNNYXRjaFJ1bGUKK3sKKyAgaW50IHJlZmNvdW50OyAgICAgICAvKio8IHJlZmVyZW5jZSBjb3VudCAqLworCisgIERCdXNDb25uZWN0aW9uICptYXRjaGVzX2dvX3RvOyAvKio8IE93bmVyIG9mIHRoZSBydWxlICovCisKKyAgdW5zaWduZWQgaW50IGZsYWdzOyAvKio8IEJ1c01hdGNoRmxhZ3MgKi8KKworICBpbnQgICBtZXNzYWdlX3R5cGU7CisgIGNoYXIgKmludGVyZmFjZTsKKyAgY2hhciAqbWVtYmVyOworICBjaGFyICpzZW5kZXI7CisgIGNoYXIgKmRlc3RpbmF0aW9uOworICBjaGFyICpwYXRoOworCisgIHVuc2lnbmVkIGludCAqYXJnX2xlbnM7CisgIGNoYXIgKiphcmdzOworICBpbnQgYXJnc19sZW47Cit9OworCisjZGVmaW5lIEJVU19NQVRDSF9BUkdfTkFNRVNQQUNFICAgMHg0MDAwMDAwdQorI2RlZmluZSBCVVNfTUFUQ0hfQVJHX0lTX1BBVEggIDB4ODAwMDAwMHUKKworI2RlZmluZSBCVVNfTUFUQ0hfQVJHX0ZMQUdTIChCVVNfTUFUQ0hfQVJHX05BTUVTUEFDRSB8IEJVU19NQVRDSF9BUkdfSVNfUEFUSCkKKworQnVzTWF0Y2hSdWxlKgorYnVzX21hdGNoX3J1bGVfbmV3IChEQnVzQ29ubmVjdGlvbiAqbWF0Y2hlc19nb190bykKK3sKKyAgQnVzTWF0Y2hSdWxlICpydWxlOworCisgIHJ1bGUgPSBkYnVzX25ldzAgKEJ1c01hdGNoUnVsZSwgMSk7CisgIGlmIChydWxlID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgcnVsZS0+cmVmY291bnQgPSAxOworICBydWxlLT5tYXRjaGVzX2dvX3RvID0gbWF0Y2hlc19nb190bzsKKworI2lmbmRlZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworICBfZGJ1c19hc3NlcnQgKHJ1bGUtPm1hdGNoZXNfZ29fdG8gIT0gTlVMTCk7CisjZW5kaWYKKyAgCisgIHJldHVybiBydWxlOworfQorCitCdXNNYXRjaFJ1bGUgKgorYnVzX21hdGNoX3J1bGVfcmVmIChCdXNNYXRjaFJ1bGUgKnJ1bGUpCit7CisgIF9kYnVzX2Fzc2VydCAocnVsZS0+cmVmY291bnQgPiAwKTsKKworICBydWxlLT5yZWZjb3VudCArPSAxOworCisgIHJldHVybiBydWxlOworfQorCit2b2lkCitidXNfbWF0Y2hfcnVsZV91bnJlZiAoQnVzTWF0Y2hSdWxlICpydWxlKQoreworICBfZGJ1c19hc3NlcnQgKHJ1bGUtPnJlZmNvdW50ID4gMCk7CisKKyAgcnVsZS0+cmVmY291bnQgLT0gMTsKKyAgaWYgKHJ1bGUtPnJlZmNvdW50ID09IDApCisgICAgeworICAgICAgZGJ1c19mcmVlIChydWxlLT5pbnRlcmZhY2UpOworICAgICAgZGJ1c19mcmVlIChydWxlLT5tZW1iZXIpOworICAgICAgZGJ1c19mcmVlIChydWxlLT5zZW5kZXIpOworICAgICAgZGJ1c19mcmVlIChydWxlLT5kZXN0aW5hdGlvbik7CisgICAgICBkYnVzX2ZyZWUgKHJ1bGUtPnBhdGgpOworICAgICAgZGJ1c19mcmVlIChydWxlLT5hcmdfbGVucyk7CisKKyAgICAgIC8qIGNhbid0IHVzZSBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5KCkgc2luY2UgdGhlcmUKKyAgICAgICAqIGFyZSBlbWJlZGRlZCBOVUxMCisgICAgICAgKi8KKyAgICAgIGlmIChydWxlLT5hcmdzKQorICAgICAgICB7CisgICAgICAgICAgaW50IGk7CisKKyAgICAgICAgICBpID0gMDsKKyAgICAgICAgICB3aGlsZSAoaSA8IHJ1bGUtPmFyZ3NfbGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAocnVsZS0+YXJnc1tpXSkKKyAgICAgICAgICAgICAgICBkYnVzX2ZyZWUgKHJ1bGUtPmFyZ3NbaV0pOworICAgICAgICAgICAgICArK2k7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBkYnVzX2ZyZWUgKHJ1bGUtPmFyZ3MpOworICAgICAgICB9CisgICAgICAKKyAgICAgIGRidXNfZnJlZSAocnVsZSk7CisgICAgfQorfQorCisjaWYgZGVmaW5lZChEQlVTX0VOQUJMRV9WRVJCT1NFX01PREUpIHx8IGRlZmluZWQoREJVU19FTkFCTEVfU1RBVFMpCitzdGF0aWMgZGJ1c19ib29sX3QKK2FwcGVuZF9rZXlfYW5kX2VzY2FwZWRfdmFsdWUgKERCdXNTdHJpbmcgKnN0ciwgY29uc3QgY2hhciAqdG9rZW4sIGNvbnN0IGNoYXIgKnZhbHVlKQoreworICBjb25zdCBjaGFyICpwID0gdmFsdWU7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX3ByaW50ZiAoc3RyLCAiJXM9JyIsIHRva2VuKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgd2hpbGUgKCpwICE9ICdcMCcpCisgICAgeworICAgICAgY29uc3QgY2hhciAqbmV4dCA9IHN0cmNociAocCwgJ1wnJyk7CisKKyAgICAgIGlmIChuZXh0KQorICAgICAgICB7CisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX3ByaW50ZiAoc3RyLCAiJS4qcyIsIChpbnQpIChuZXh0IC0gcCksIHApKQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgIC8qIEhvcnJpYmxlIGVzY2FwZSBzZXF1ZW5jZTogc2luZ2xlIHF1b3RlIGNhbm5vdCBiZSBlc2NhcGVkIGluc2lkZQorICAgICAgICAgICAqIGEgc2luZ2xlIHF1b3RlZCBzdHJpbmcuIFNvIHdlIGNsb3NlIHRoZSBzaW5nbGUgcXVvdGUsIGVzY2FwZSB0aGUKKyAgICAgICAgICAgKiBzaW5nbGUgcXVvdGUsIGFuZCByZW9wZW4gYSBzaW5nbGUgcXVvdGUuCisgICAgICAgICAgICovCisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX3ByaW50ZiAoc3RyLCAiJ1xcJyciKSkKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICBwID0gbmV4dCArIDE7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9wcmludGYgKHN0ciwgIiVzIiwgcCkpCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX2J5dGUgKHN0ciwgJ1wnJykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJldHVybiBUUlVFOworfQorCisvKiByZXR1cm5zIE5VTEwgaWYgbm8gbWVtb3J5ICovCitzdGF0aWMgY2hhcioKK21hdGNoX3J1bGVfdG9fc3RyaW5nIChCdXNNYXRjaFJ1bGUgKnJ1bGUpCit7CisgIERCdXNTdHJpbmcgc3RyOworICBjaGFyICpyZXQ7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmc3RyKSkKKyAgICB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIAorICBpZiAocnVsZS0+ZmxhZ3MgJiBCVVNfTUFUQ0hfTUVTU0FHRV9UWVBFKQorICAgIHsKKyAgICAgIGlmICghYXBwZW5kX2tleV9hbmRfZXNjYXBlZF92YWx1ZSAoJnN0ciwgInR5cGUiLAorICAgICAgICAgICAgZGJ1c19tZXNzYWdlX3R5cGVfdG9fc3RyaW5nIChydWxlLT5tZXNzYWdlX3R5cGUpKSkKKyAgICAgICAgZ290byBub21lbTsKKyAgICB9CisKKyAgaWYgKHJ1bGUtPmZsYWdzICYgQlVTX01BVENIX0lOVEVSRkFDRSkKKyAgICB7CisgICAgICBpZiAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpID4gMCkKKyAgICAgICAgeworICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnN0ciwgIiwiKSkKKyAgICAgICAgICAgIGdvdG8gbm9tZW07CisgICAgICAgIH0KKyAgICAgIAorICAgICAgaWYgKCFhcHBlbmRfa2V5X2FuZF9lc2NhcGVkX3ZhbHVlICgmc3RyLCAiaW50ZXJmYWNlIiwgcnVsZS0+aW50ZXJmYWNlKSkKKyAgICAgICAgZ290byBub21lbTsKKyAgICB9CisKKyAgaWYgKHJ1bGUtPmZsYWdzICYgQlVTX01BVENIX01FTUJFUikKKyAgICB7CisgICAgICBpZiAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpID4gMCkKKyAgICAgICAgeworICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnN0ciwgIiwiKSkKKyAgICAgICAgICAgIGdvdG8gbm9tZW07CisgICAgICAgIH0KKyAgICAgIAorICAgICAgaWYgKCFhcHBlbmRfa2V5X2FuZF9lc2NhcGVkX3ZhbHVlICgmc3RyLCAibWVtYmVyIiwgcnVsZS0+bWVtYmVyKSkKKyAgICAgICAgZ290byBub21lbTsKKyAgICB9CisKKyAgaWYgKHJ1bGUtPmZsYWdzICYgQlVTX01BVENIX1BBVEgpCisgICAgeworICAgICAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSA+IDApCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZzdHIsICIsIikpCisgICAgICAgICAgICBnb3RvIG5vbWVtOworICAgICAgICB9CisgICAgICAKKyAgICAgIGlmICghYXBwZW5kX2tleV9hbmRfZXNjYXBlZF92YWx1ZSAoJnN0ciwgInBhdGgiLCBydWxlLT5wYXRoKSkKKyAgICAgICAgZ290byBub21lbTsKKyAgICB9CisKKyAgaWYgKHJ1bGUtPmZsYWdzICYgQlVTX01BVENIX1BBVEhfTkFNRVNQQUNFKQorICAgIHsKKyAgICAgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikgPiAwKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmc3RyLCAiLCIpKQorICAgICAgICAgICAgZ290byBub21lbTsKKyAgICAgICAgfQorCisgICAgICBpZiAoIWFwcGVuZF9rZXlfYW5kX2VzY2FwZWRfdmFsdWUgKCZzdHIsICJwYXRoX25hbWVzcGFjZSIsIHJ1bGUtPnBhdGgpKQorICAgICAgICBnb3RvIG5vbWVtOworICAgIH0KKworICBpZiAocnVsZS0+ZmxhZ3MgJiBCVVNfTUFUQ0hfU0VOREVSKQorICAgIHsKKyAgICAgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikgPiAwKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmc3RyLCAiLCIpKQorICAgICAgICAgICAgZ290byBub21lbTsKKyAgICAgICAgfQorICAgICAgCisgICAgICBpZiAoIWFwcGVuZF9rZXlfYW5kX2VzY2FwZWRfdmFsdWUgKCZzdHIsICJzZW5kZXIiLCBydWxlLT5zZW5kZXIpKQorICAgICAgICBnb3RvIG5vbWVtOworICAgIH0KKworICBpZiAocnVsZS0+ZmxhZ3MgJiBCVVNfTUFUQ0hfREVTVElOQVRJT04pCisgICAgeworICAgICAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSA+IDApCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZzdHIsICIsIikpCisgICAgICAgICAgICBnb3RvIG5vbWVtOworICAgICAgICB9CisgICAgICAKKyAgICAgIGlmICghYXBwZW5kX2tleV9hbmRfZXNjYXBlZF92YWx1ZSAoJnN0ciwgImRlc3RpbmF0aW9uIiwgcnVsZS0+ZGVzdGluYXRpb24pKQorICAgICAgICBnb3RvIG5vbWVtOworICAgIH0KKworICBpZiAocnVsZS0+ZmxhZ3MgJiBCVVNfTUFUQ0hfQ0xJRU5UX0lTX0VBVkVTRFJPUFBJTkcpCisgICAgeworICAgICAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSA+IDApCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZzdHIsICIsIikpCisgICAgICAgICAgICBnb3RvIG5vbWVtOworICAgICAgICB9CisKKyAgICAgIGlmICghYXBwZW5kX2tleV9hbmRfZXNjYXBlZF92YWx1ZSAoJnN0ciwgImVhdmVzZHJvcCIsCisgICAgICAgICAgICAocnVsZS0+ZmxhZ3MgJiBCVVNfTUFUQ0hfQ0xJRU5UX0lTX0VBVkVTRFJPUFBJTkcpID8KKyAgICAgICAgICAgICJ0cnVlIiA6ICJmYWxzZSIpKQorICAgICAgICBnb3RvIG5vbWVtOworICAgIH0KKworICBpZiAocnVsZS0+ZmxhZ3MgJiBCVVNfTUFUQ0hfQVJHUykKKyAgICB7CisgICAgICBpbnQgaTsKKyAgICAgIAorICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5hcmdzICE9IE5VTEwpOworCisgICAgICBpID0gMDsKKyAgICAgIHdoaWxlIChpIDwgcnVsZS0+YXJnc19sZW4pCisgICAgICAgIHsKKyAgICAgICAgICBpZiAocnVsZS0+YXJnc1tpXSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCBpc19wYXRoLCBpc19uYW1lc3BhY2U7CisKKyAgICAgICAgICAgICAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSA+IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmc3RyLCAiLCIpKQorICAgICAgICAgICAgICAgICAgICBnb3RvIG5vbWVtOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBpc19wYXRoID0gKHJ1bGUtPmFyZ19sZW5zW2ldICYgQlVTX01BVENIX0FSR19JU19QQVRIKSAhPSAwOworICAgICAgICAgICAgICBpc19uYW1lc3BhY2UgPSAocnVsZS0+YXJnX2xlbnNbaV0gJiBCVVNfTUFUQ0hfQVJHX05BTUVTUEFDRSkgIT0gMDsKKyAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9wcmludGYgKCZzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcmclZCVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfcGF0aCA/ICJwYXRoIiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX25hbWVzcGFjZSA/ICJuYW1lc3BhY2UiIDogIiIpKQorICAgICAgICAgICAgICAgIGdvdG8gbm9tZW07CisgICAgICAgICAgICAgIGlmICghYXBwZW5kX2tleV9hbmRfZXNjYXBlZF92YWx1ZSAoJnN0ciwgIiIsIHJ1bGUtPmFyZ3NbaV0pKQorICAgICAgICAgICAgICAgIGdvdG8gbm9tZW07CisgICAgICAgICAgICB9CisgICAgICAgICAgCisgICAgICAgICAgKytpOworICAgICAgICB9CisgICAgfQorICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfc3RlYWxfZGF0YSAoJnN0ciwgJnJldCkpCisgICAgZ290byBub21lbTsKKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnN0cik7CisgIHJldHVybiByZXQ7CisgIAorIG5vbWVtOgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJnN0cik7CisgIHJldHVybiBOVUxMOworfQorI2VuZGlmIC8qIGRlZmluZWQoREJVU19FTkFCTEVfVkVSQk9TRV9NT0RFKSB8fCBkZWZpbmVkKERCVVNfRU5BQkxFX1NUQVRTKSAqLworCitkYnVzX2Jvb2xfdAorYnVzX21hdGNoX3J1bGVfc2V0X21lc3NhZ2VfdHlwZSAoQnVzTWF0Y2hSdWxlICpydWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICB0eXBlKQoreworICBydWxlLT5mbGFncyB8PSBCVVNfTUFUQ0hfTUVTU0FHRV9UWVBFOworCisgIHJ1bGUtPm1lc3NhZ2VfdHlwZSA9IHR5cGU7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2RidXNfYm9vbF90CitidXNfbWF0Y2hfcnVsZV9zZXRfaW50ZXJmYWNlIChCdXNNYXRjaFJ1bGUgKnJ1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgKmludGVyZmFjZSkKK3sKKyAgY2hhciAqbmV3OworCisgIF9kYnVzX2Fzc2VydCAoaW50ZXJmYWNlICE9IE5VTEwpOworCisgIG5ldyA9IF9kYnVzX3N0cmR1cCAoaW50ZXJmYWNlKTsKKyAgaWYgKG5ldyA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKworICBydWxlLT5mbGFncyB8PSBCVVNfTUFUQ0hfSU5URVJGQUNFOworICBkYnVzX2ZyZWUgKHJ1bGUtPmludGVyZmFjZSk7CisgIHJ1bGUtPmludGVyZmFjZSA9IG5ldzsKKworICByZXR1cm4gVFJVRTsKK30KKworZGJ1c19ib29sX3QKK2J1c19tYXRjaF9ydWxlX3NldF9tZW1iZXIgKEJ1c01hdGNoUnVsZSAqcnVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAqbWVtYmVyKQoreworICBjaGFyICpuZXc7CisKKyAgX2RidXNfYXNzZXJ0IChtZW1iZXIgIT0gTlVMTCk7CisKKyAgbmV3ID0gX2RidXNfc3RyZHVwIChtZW1iZXIpOworICBpZiAobmV3ID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJ1bGUtPmZsYWdzIHw9IEJVU19NQVRDSF9NRU1CRVI7CisgIGRidXNfZnJlZSAocnVsZS0+bWVtYmVyKTsKKyAgcnVsZS0+bWVtYmVyID0gbmV3OworCisgIHJldHVybiBUUlVFOworfQorCitkYnVzX2Jvb2xfdAorYnVzX21hdGNoX3J1bGVfc2V0X3NlbmRlciAoQnVzTWF0Y2hSdWxlICpydWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICpzZW5kZXIpCit7CisgIGNoYXIgKm5ldzsKKworICBfZGJ1c19hc3NlcnQgKHNlbmRlciAhPSBOVUxMKTsKKworICBuZXcgPSBfZGJ1c19zdHJkdXAgKHNlbmRlcik7CisgIGlmIChuZXcgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcnVsZS0+ZmxhZ3MgfD0gQlVTX01BVENIX1NFTkRFUjsKKyAgZGJ1c19mcmVlIChydWxlLT5zZW5kZXIpOworICBydWxlLT5zZW5kZXIgPSBuZXc7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2RidXNfYm9vbF90CitidXNfbWF0Y2hfcnVsZV9zZXRfZGVzdGluYXRpb24gKEJ1c01hdGNoUnVsZSAqcnVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICpkZXN0aW5hdGlvbikKK3sKKyAgY2hhciAqbmV3OworCisgIF9kYnVzX2Fzc2VydCAoZGVzdGluYXRpb24gIT0gTlVMTCk7CisKKyAgbmV3ID0gX2RidXNfc3RyZHVwIChkZXN0aW5hdGlvbik7CisgIGlmIChuZXcgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcnVsZS0+ZmxhZ3MgfD0gQlVTX01BVENIX0RFU1RJTkFUSU9OOworICBkYnVzX2ZyZWUgKHJ1bGUtPmRlc3RpbmF0aW9uKTsKKyAgcnVsZS0+ZGVzdGluYXRpb24gPSBuZXc7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3ZvaWQKK2J1c19tYXRjaF9ydWxlX3NldF9jbGllbnRfaXNfZWF2ZXNkcm9wcGluZyAoQnVzTWF0Y2hSdWxlICpydWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCBpc19lYXZlc2Ryb3BwaW5nKQoreworICBpZiAoaXNfZWF2ZXNkcm9wcGluZykKKyAgICBydWxlLT5mbGFncyB8PSBCVVNfTUFUQ0hfQ0xJRU5UX0lTX0VBVkVTRFJPUFBJTkc7CisgIGVsc2UKKyAgICBydWxlLT5mbGFncyAmPSB+KEJVU19NQVRDSF9DTElFTlRfSVNfRUFWRVNEUk9QUElORyk7Cit9CisKK2RidXNfYm9vbF90CitidXNfbWF0Y2hfcnVsZV9nZXRfY2xpZW50X2lzX2VhdmVzZHJvcHBpbmcgKEJ1c01hdGNoUnVsZSAqcnVsZSkKK3sKKyAgaWYgKHJ1bGUtPmZsYWdzICYgQlVTX01BVENIX0NMSUVOVF9JU19FQVZFU0RST1BQSU5HKQorICAgIHJldHVybiBUUlVFOworICBlbHNlCisgICAgcmV0dXJuIEZBTFNFOworfQorCitkYnVzX2Jvb2xfdAorYnVzX21hdGNoX3J1bGVfc2V0X3BhdGggKEJ1c01hdGNoUnVsZSAqcnVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgKnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICBpc19uYW1lc3BhY2UpCit7CisgIGNoYXIgKm5ldzsKKworICBfZGJ1c19hc3NlcnQgKHBhdGggIT0gTlVMTCk7CisKKyAgbmV3ID0gX2RidXNfc3RyZHVwIChwYXRoKTsKKyAgaWYgKG5ldyA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKworICBydWxlLT5mbGFncyAmPSB+KEJVU19NQVRDSF9QQVRIfEJVU19NQVRDSF9QQVRIX05BTUVTUEFDRSk7CisKKyAgaWYgKGlzX25hbWVzcGFjZSkKKyAgICBydWxlLT5mbGFncyB8PSBCVVNfTUFUQ0hfUEFUSF9OQU1FU1BBQ0U7CisgIGVsc2UKKyAgICBydWxlLT5mbGFncyB8PSBCVVNfTUFUQ0hfUEFUSDsKKworICBkYnVzX2ZyZWUgKHJ1bGUtPnBhdGgpOworICBydWxlLT5wYXRoID0gbmV3OworCisgIHJldHVybiBUUlVFOworfQorCitkYnVzX2Jvb2xfdAorYnVzX21hdGNoX3J1bGVfc2V0X2FyZyAoQnVzTWF0Y2hSdWxlICAgICAqcnVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBhcmcsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgIGlzX3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICBpc19uYW1lc3BhY2UpCit7CisgIGludCBsZW5ndGg7CisgIGNoYXIgKm5ldzsKKworICBfZGJ1c19hc3NlcnQgKHZhbHVlICE9IE5VTEwpOworCisgIC8qIGFyZ3NfbGVuIGlzIHRoZSBudW1iZXIgb2YgYXJncyBub3QgaW5jbHVkaW5nIG51bGwgdGVybWluYXRpb24KKyAgICogaW4gdGhlIGNoYXIqKgorICAgKi8KKyAgaWYgKGFyZyA+PSBydWxlLT5hcmdzX2xlbikKKyAgICB7CisgICAgICB1bnNpZ25lZCBpbnQgKm5ld19hcmdfbGVuczsKKyAgICAgIGNoYXIgKipuZXdfYXJnczsKKyAgICAgIGludCBuZXdfYXJnc19sZW47CisgICAgICBpbnQgaTsKKworICAgICAgbmV3X2FyZ3NfbGVuID0gYXJnICsgMTsKKworICAgICAgLyogYWRkIGFub3RoZXIgKyAxIGhlcmUgZm9yIG51bGwgdGVybWluYXRpb24gKi8KKyAgICAgIG5ld19hcmdzID0gZGJ1c19yZWFsbG9jIChydWxlLT5hcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiAoY2hhciAqKSAqIChuZXdfYXJnc19sZW4gKyAxKSk7CisgICAgICBpZiAobmV3X2FyZ3MgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICAvKiBOVUxMIHRoZSBuZXcgc2xvdHMgKi8KKyAgICAgIGkgPSBydWxlLT5hcmdzX2xlbjsKKyAgICAgIHdoaWxlIChpIDw9IG5ld19hcmdzX2xlbikgLyogPD0gZm9yIG51bGwgdGVybWluYXRpb24gKi8KKyAgICAgICAgeworICAgICAgICAgIG5ld19hcmdzW2ldID0gTlVMTDsKKyAgICAgICAgICArK2k7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgcnVsZS0+YXJncyA9IG5ld19hcmdzOworCisgICAgICAvKiBhbmQgbm93IGFkZCB0byB0aGUgbGVuZ3RocyAqLworICAgICAgbmV3X2FyZ19sZW5zID0gZGJ1c19yZWFsbG9jIChydWxlLT5hcmdfbGVucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mIChpbnQpICogKG5ld19hcmdzX2xlbiArIDEpKTsKKworICAgICAgaWYgKG5ld19hcmdfbGVucyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIC8qIHplcm8gdGhlIG5ldyBzbG90cyAqLworICAgICAgaSA9IHJ1bGUtPmFyZ3NfbGVuOworICAgICAgd2hpbGUgKGkgPD0gbmV3X2FyZ3NfbGVuKSAvKiA8PSBmb3IgbnVsbCB0ZXJtaW5hdGlvbiAqLworICAgICAgICB7CisgICAgICAgICAgbmV3X2FyZ19sZW5zW2ldID0gMDsKKyAgICAgICAgICArK2k7CisgICAgICAgIH0KKworICAgICAgcnVsZS0+YXJnX2xlbnMgPSBuZXdfYXJnX2xlbnM7CisgICAgICBydWxlLT5hcmdzX2xlbiA9IG5ld19hcmdzX2xlbjsKKyAgICB9CisKKyAgbGVuZ3RoID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHZhbHVlKTsKKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weV9kYXRhICh2YWx1ZSwgJm5ldykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJ1bGUtPmZsYWdzIHw9IEJVU19NQVRDSF9BUkdTOworCisgIGRidXNfZnJlZSAocnVsZS0+YXJnc1thcmddKTsKKyAgcnVsZS0+YXJnX2xlbnNbYXJnXSA9IGxlbmd0aDsKKyAgcnVsZS0+YXJnc1thcmddID0gbmV3OworCisgIGlmIChpc19wYXRoKQorICAgIHJ1bGUtPmFyZ19sZW5zW2FyZ10gfD0gQlVTX01BVENIX0FSR19JU19QQVRIOworCisgIGlmIChpc19uYW1lc3BhY2UpCisgICAgcnVsZS0+YXJnX2xlbnNbYXJnXSB8PSBCVVNfTUFUQ0hfQVJHX05BTUVTUEFDRTsKKworICAvKiBOVUxMIHRlcm1pbmF0aW9uIGRpZG4ndCBnZXQgYnVzdGVkICovCisgIF9kYnVzX2Fzc2VydCAocnVsZS0+YXJnc1tydWxlLT5hcmdzX2xlbl0gPT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAocnVsZS0+YXJnX2xlbnNbcnVsZS0+YXJnc19sZW5dID09IDApOworCisgIHJldHVybiBUUlVFOworfQorCisjZGVmaW5lIElTV0hJVEUoYykgKCgoYykgPT0gJyAnKSB8fCAoKGMpID09ICdcdCcpIHx8ICgoYykgPT0gJ1xuJykgfHwgKChjKSA9PSAnXHInKSkKKworc3RhdGljIGRidXNfYm9vbF90CitmaW5kX2tleSAoY29uc3QgREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgIGludCAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgKmtleSwKKyAgICAgICAgICBpbnQgICAgICAgICAgICAgICp2YWx1ZV9wb3MsCisgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCit7CisgIGNvbnN0IGNoYXIgKnA7CisgIGNvbnN0IGNoYXIgKnM7CisgIGNvbnN0IGNoYXIgKmtleV9zdGFydDsKKyAgY29uc3QgY2hhciAqa2V5X2VuZDsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgCisgIHMgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKHN0cik7CisKKyAgcCA9IHMgKyBzdGFydDsKKworICB3aGlsZSAoKnAgJiYgSVNXSElURSAoKnApKQorICAgICsrcDsKKworICBrZXlfc3RhcnQgPSBwOworCisgIHdoaWxlICgqcCAmJiAqcCAhPSAnPScgJiYgIUlTV0hJVEUgKCpwKSkKKyAgICArK3A7CisKKyAga2V5X2VuZCA9IHA7CisKKyAgd2hpbGUgKCpwICYmIElTV0hJVEUgKCpwKSkKKyAgICArK3A7CisgIAorICBpZiAoa2V5X3N0YXJ0ID09IGtleV9lbmQpCisgICAgeworICAgICAgLyogRW1wdHkgbWF0Y2ggcnVsZXMgb3IgdHJhaWxpbmcgd2hpdGVzcGFjZSBhcmUgT0sgKi8KKyAgICAgICp2YWx1ZV9wb3MgPSBwIC0gczsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICBpZiAoKnAgIT0gJz0nKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9NQVRDSF9SVUxFX0lOVkFMSUQsCisgICAgICAgICAgICAgICAgICAgICAgIk1hdGNoIHJ1bGUgaGFzIGEga2V5IHdpdGggbm8gc3Vic2VxdWVudCAnPScgY2hhcmFjdGVyIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICArK3A7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfbGVuIChrZXksIGtleV9zdGFydCwga2V5X2VuZCAtIGtleV9zdGFydCkpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgKnZhbHVlX3BvcyA9IHAgLSBzOworICAKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZmluZF92YWx1ZSAoY29uc3QgREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICprZXksCisgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICp2YWx1ZSwKKyAgICAgICAgICAgIGludCAgICAgICAgICAgICAgKnZhbHVlX2VuZCwKKyAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICBjb25zdCBjaGFyICpwOworICBjb25zdCBjaGFyICpzOworICBjaGFyIHF1b3RlX2NoYXI7CisgIGludCBvcmlnX2xlbjsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgCisgIG9yaWdfbGVuID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHZhbHVlKTsKKyAgCisgIHMgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKHN0cik7CisKKyAgcCA9IHMgKyBzdGFydDsKKworICBxdW90ZV9jaGFyID0gJ1wwJzsKKworICB3aGlsZSAoKnApCisgICAgeworICAgICAgaWYgKHF1b3RlX2NoYXIgPT0gJ1wwJykKKyAgICAgICAgeworICAgICAgICAgIHN3aXRjaCAoKnApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlICdcMCc6CisgICAgICAgICAgICAgIGdvdG8gZG9uZTsKKworICAgICAgICAgICAgY2FzZSAnXCcnOgorICAgICAgICAgICAgICBxdW90ZV9jaGFyID0gJ1wnJzsKKyAgICAgICAgICAgICAgZ290byBuZXh0OworICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhc2UgJywnOgorICAgICAgICAgICAgICArK3A7CisgICAgICAgICAgICAgIGdvdG8gZG9uZTsKKworICAgICAgICAgICAgY2FzZSAnXFwnOgorICAgICAgICAgICAgICBxdW90ZV9jaGFyID0gJ1xcJzsKKyAgICAgICAgICAgICAgZ290byBuZXh0OworICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlICh2YWx1ZSwgKnApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHF1b3RlX2NoYXIgPT0gJ1xcJykKKyAgICAgICAgeworICAgICAgICAgIC8qIFwgb25seSBjb3VudHMgYXMgYW4gZXNjYXBlIGlmIGVzY2FwaW5nIGEgcXVvdGUgbWFyayAqLworICAgICAgICAgIGlmICgqcCAhPSAnXCcnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfYnl0ZSAodmFsdWUsICdcXCcpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfYnl0ZSAodmFsdWUsICpwKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgCisgICAgICAgICAgcXVvdGVfY2hhciA9ICdcMCc7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX2Fzc2VydCAocXVvdGVfY2hhciA9PSAnXCcnKTsKKworICAgICAgICAgIGlmICgqcCA9PSAnXCcnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBxdW90ZV9jaGFyID0gJ1wwJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlICh2YWx1ZSwgKnApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIG5leHQ6CisgICAgICArK3A7CisgICAgfQorCisgZG9uZToKKworICBpZiAocXVvdGVfY2hhciA9PSAnXFwnKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlICh2YWx1ZSwgJ1xcJykpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICB9CisgICAgfQorICBlbHNlIGlmIChxdW90ZV9jaGFyID09ICdcJycpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX01BVENIX1JVTEVfSU5WQUxJRCwKKyAgICAgICAgICAgICAgICAgICAgICAiVW5iYWxhbmNlZCBxdW90YXRpb24gbWFya3MgaW4gbWF0Y2ggcnVsZSIpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorICBlbHNlCisgICAgX2RidXNfYXNzZXJ0IChxdW90ZV9jaGFyID09ICdcMCcpOworCisgIC8qIFplcm8tbGVuZ3RoIHZhbHVlcyBhcmUgYWxsb3dlZCAqLworICAKKyAgKnZhbHVlX2VuZCA9IHAgLSBzOworICAKKyAgcmV0dXJuIFRSVUU7CisKKyBmYWlsZWQ6CisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKHZhbHVlLCBvcmlnX2xlbik7CisgIHJldHVybiBGQUxTRTsKK30KKworLyogZHVwbGljYXRlcyBhcmVuJ3QgYWxsb3dlZCBzbyB0aGUgcmVhbCBsZWdpdGltYXRlIG1heCBpcyBvbmx5IDYgb3IKKyAqIHNvLiBMZWF2aW5nIGV4dHJhIHNvIHdlIGRvbid0IGhhdmUgdG8gYm90aGVyIHRvIHVwZGF0ZSBpdC4KKyAqIEZJWE1FIHRoaXMgaXMgc29ydCBvZiBidXN0ZWQgbm93IHdpdGggYXJnIG1hdGNoaW5nLCBidXQgd2UgbGV0CisgKiB5b3UgbWF0Y2ggb24gdXAgdG8gMTAgYXJncyBmb3Igbm93CisgKi8KKyNkZWZpbmUgTUFYX1JVTEVfVE9LRU5TIDE2CisKKy8qIHRoaXMgaXMgc2xpZ2h0bHkgdG9vIGhpZ2ggbGV2ZWwgdG8gYmUgdGVybWVkIGEgInRva2VuIgorICogYnV0IGxldCdzIG5vdCBiZSBwZWRhbnRpYy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgY2hhciAqa2V5OworICBjaGFyICp2YWx1ZTsKK30gUnVsZVRva2VuOworCitzdGF0aWMgZGJ1c19ib29sX3QKK3Rva2VuaXplX3J1bGUgKGNvbnN0IERCdXNTdHJpbmcgKnJ1bGVfdGV4dCwKKyAgICAgICAgICAgICAgIFJ1bGVUb2tlbiAgICAgICAgIHRva2Vuc1tNQVhfUlVMRV9UT0tFTlNdLAorICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpIAoreworICBpbnQgaTsKKyAgaW50IHBvczsKKyAgREJ1c1N0cmluZyBrZXk7CisgIERCdXNTdHJpbmcgdmFsdWU7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKworICByZXR2YWwgPSBGQUxTRTsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZrZXkpKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZ2YWx1ZSkpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZrZXkpOworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaSA9IDA7CisgIHBvcyA9IDA7CisgIHdoaWxlIChpIDwgTUFYX1JVTEVfVE9LRU5TICYmCisgICAgICAgICBwb3MgPCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAocnVsZV90ZXh0KSkKKyAgICB7CisgICAgICBfZGJ1c19hc3NlcnQgKHRva2Vuc1tpXS5rZXkgPT0gTlVMTCk7CisgICAgICBfZGJ1c19hc3NlcnQgKHRva2Vuc1tpXS52YWx1ZSA9PSBOVUxMKTsKKworICAgICAgaWYgKCFmaW5kX2tleSAocnVsZV90ZXh0LCBwb3MsICZrZXksICZwb3MsIGVycm9yKSkKKyAgICAgICAgZ290byBvdXQ7CisKKyAgICAgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmtleSkgPT0gMCkKKyAgICAgICAgZ290byBuZXh0OworICAgICAgCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19zdGVhbF9kYXRhICgma2V5LCAmdG9rZW5zW2ldLmtleSkpCisgICAgICAgIHsKKyAgICAgICAgICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgIGlmICghZmluZF92YWx1ZSAocnVsZV90ZXh0LCBwb3MsIHRva2Vuc1tpXS5rZXksICZ2YWx1ZSwgJnBvcywgZXJyb3IpKQorICAgICAgICBnb3RvIG91dDsKKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfc3RlYWxfZGF0YSAoJnZhbHVlLCAmdG9rZW5zW2ldLnZhbHVlKSkKKyAgICAgICAgeworICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgIG5leHQ6CisgICAgICArK2k7CisgICAgfQorCisgIHJldHZhbCA9IFRSVUU7CisgIAorIG91dDoKKyAgaWYgKCFyZXR2YWwpCisgICAgeworICAgICAgaSA9IDA7CisgICAgICB3aGlsZSAodG9rZW5zW2ldLmtleSB8fCB0b2tlbnNbaV0udmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX2ZyZWUgKHRva2Vuc1tpXS5rZXkpOworICAgICAgICAgIGRidXNfZnJlZSAodG9rZW5zW2ldLnZhbHVlKTsKKyAgICAgICAgICB0b2tlbnNbaV0ua2V5ID0gTlVMTDsKKyAgICAgICAgICB0b2tlbnNbaV0udmFsdWUgPSBOVUxMOworICAgICAgICAgICsraTsKKyAgICAgICAgfQorICAgIH0KKyAgCisgIF9kYnVzX3N0cmluZ19mcmVlICgma2V5KTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ2YWx1ZSk7CisgIAorICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2J1c19tYXRjaF9ydWxlX3BhcnNlX2FyZ19tYXRjaCAoQnVzTWF0Y2hSdWxlICAgICAqcnVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCit7CisgIGRidXNfYm9vbF90IGlzX3BhdGggPSBGQUxTRTsKKyAgZGJ1c19ib29sX3QgaXNfbmFtZXNwYWNlID0gRkFMU0U7CisgIERCdXNTdHJpbmcga2V5X3N0cjsKKyAgdW5zaWduZWQgbG9uZyBhcmc7CisgIGludCBsZW5ndGg7CisgIGludCBlbmQ7CisKKyAgLyogRm9yIG5vdywgYXJnMD0nZm9vJyBhbHdheXMgaW1wbGllcyB0aGF0ICdmb28nIGlzIGEKKyAgICogREJVU19UWVBFX1NUUklORy4gU29tZWRheSB3ZSBjb3VsZCBhZGQgYW4gYXJnMHR5cGU9J2ludDMyJyB0aGluZworICAgKiBpZiB3ZSB3YW50ZWQsIHdoaWNoIHdvdWxkIHNwZWNpZnkgYW5vdGhlciB0eXBlLCBpbiB3aGljaCBjYXNlCisgICAqIGFyZzA9JzUnIHdvdWxkIGhhdmUgdGhlIDUgcGFyc2VkIGFzIGFuIGludCByYXRoZXIgdGhhbiBzdHJpbmcuCisgICAqLworICAKKyAgLyogRmlyc3Qgd2UgbmVlZCB0byBwYXJzZSBhcmcwID0gMCwgYXJnMjcgPSAyNyAqLworCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgma2V5X3N0ciwga2V5KTsKKyAgbGVuZ3RoID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZrZXlfc3RyKTsKKworICBpZiAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZrZXlfc3RyKSA8IDQpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX01BVENIX1JVTEVfSU5WQUxJRCwKKyAgICAgICAgICAgICAgICAgICAgICAiS2V5ICclcycgaW4gbWF0Y2ggcnVsZSBzdGFydHMgd2l0aCAnYXJnJyBidXQgbGFja3MgYW4gYXJnIG51bWJlci4gU2hvdWxkIGJlICdhcmcwJyBvciAnYXJnNycgZm9yIGV4YW1wbGUuXG4iLCBrZXkpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX3BhcnNlX3VpbnQgKCZrZXlfc3RyLCAzLCAmYXJnLCAmZW5kKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTUFUQ0hfUlVMRV9JTlZBTElELAorICAgICAgICAgICAgICAgICAgICAgICJLZXkgJyVzJyBpbiBtYXRjaCBydWxlIHN0YXJ0cyB3aXRoICdhcmcnIGJ1dCBjb3VsZCBub3QgcGFyc2UgYXJnIG51bWJlci4gU2hvdWxkIGJlICdhcmcwJyBvciAnYXJnNycgZm9yIGV4YW1wbGUuXG4iLCBrZXkpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIGlmIChlbmQgIT0gbGVuZ3RoKQorICAgIHsKKyAgICAgIGludCBsZW4xID0gc3RybGVuICgicGF0aCIpOworICAgICAgaWYgKChlbmQgKyBsZW4xKSA9PSBsZW5ndGggJiYKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZW5kc193aXRoX2Nfc3RyICgma2V5X3N0ciwgInBhdGgiKSkKKyAgICAgICAgeworICAgICAgICAgIGlzX3BhdGggPSBUUlVFOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChfZGJ1c19zdHJpbmdfZXF1YWxfY19zdHIgKCZrZXlfc3RyLCAiYXJnMG5hbWVzcGFjZSIpKQorICAgICAgICB7CisgICAgICAgICAgaW50IHZhbHVlX2xlbiA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICh2YWx1ZSk7CisKKyAgICAgICAgICBpc19uYW1lc3BhY2UgPSBUUlVFOworCisgICAgICAgICAgaWYgKCFfZGJ1c192YWxpZGF0ZV9idXNfbmFtZXNwYWNlICh2YWx1ZSwgMCwgdmFsdWVfbGVuKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX01BVENIX1JVTEVfSU5WQUxJRCwKKyAgICAgICAgICAgICAgICAgICJhcmcwbmFtZXNwYWNlPSclcycgaXMgbm90IGEgdmFsaWQgcHJlZml4IG9mIGEgYnVzIG5hbWUiLAorICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICh2YWx1ZSkpOworICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX01BVENIX1JVTEVfSU5WQUxJRCwKKyAgICAgICAgICAgICAgIktleSAnJXMnIGluIG1hdGNoIHJ1bGUgY29udGFpbnMganVuayBhZnRlciBhcmd1bWVudCBudW1iZXIgKCVsdSkuIE9ubHkgJ2FyZyVsdXBhdGgnIChmb3IgZXhhbXBsZSkgb3IgJ2FyZzBuYW1lc3BhY2UnIGFyZSB2YWxpZCIsIGtleSwgYXJnLCBhcmcpOworICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICB9CisgICAgfQorCisgIC8qIElmIHdlIGRpZG4ndCBjaGVjayB0aGlzIHdlIGNvdWxkIGFsbG9jYXRlIGEgaHVnZSBhbW91bnQgb2YgUkFNICovCisgIGlmIChhcmcgPiBEQlVTX01BWElNVU1fTUFUQ0hfUlVMRV9BUkdfTlVNQkVSKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9NQVRDSF9SVUxFX0lOVkFMSUQsCisgICAgICAgICAgICAgICAgICAgICAgIktleSAnJXMnIGluIG1hdGNoIHJ1bGUgaGFzIGFyZyBudW1iZXIgJWx1IGJ1dCB0aGUgbWF4aW11bSBpcyAlZC5cbiIsIGtleSwgKHVuc2lnbmVkIGxvbmcpIGFyZywgREJVU19NQVhJTVVNX01BVENIX1JVTEVfQVJHX05VTUJFUik7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisgIAorICBpZiAoKHJ1bGUtPmZsYWdzICYgQlVTX01BVENIX0FSR1MpICYmCisgICAgICBydWxlLT5hcmdzX2xlbiA+IChpbnQpIGFyZyAmJgorICAgICAgcnVsZS0+YXJnc1thcmddICE9IE5VTEwpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX01BVENIX1JVTEVfSU5WQUxJRCwKKyAgICAgICAgICAgICAgICAgICAgICAiQXJndW1lbnQgJXMgbWF0Y2hlZCBtb3JlIHRoYW4gb25jZSBpbiBtYXRjaCBydWxlXG4iLCBrZXkpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorICAKKyAgaWYgKCFidXNfbWF0Y2hfcnVsZV9zZXRfYXJnIChydWxlLCBhcmcsIHZhbHVlLCBpc19wYXRoLCBpc19uYW1lc3BhY2UpKQorICAgIHsKKyAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7CisKKyBmYWlsZWQ6CisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKgorICogVGhlIGZvcm1hdCBpcyBjb21tYS1zZXBhcmF0ZWQgd2l0aCBzdHJpbmdzIHF1b3RlZCB3aXRoIHNpbmdsZSBxdW90ZXMKKyAqIGFzIGZvciB0aGUgc2hlbGwgKHRvIGVzY2FwZSBhIGxpdGVyYWwgc2luZ2xlIHF1b3RlLCB1c2UgJ1wnJykuCisgKgorICogdHlwZT0nc2lnbmFsJyxzZW5kZXI9J29yZy5mcmVlZGVza3RvcC5EQnVzJyxpbnRlcmZhY2U9J29yZy5mcmVlZGVza3RvcC5EQnVzJyxtZW1iZXI9J0ZvbycsCisgKiBwYXRoPScvYmFyL2ZvbycsZGVzdGluYXRpb249Jzo0NTIzNDUuMzQnCisgKgorICovCitCdXNNYXRjaFJ1bGUqCitidXNfbWF0Y2hfcnVsZV9wYXJzZSAoREJ1c0Nvbm5lY3Rpb24gICAqbWF0Y2hlc19nb190bywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpydWxlX3RleHQsCisgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCit7CisgIEJ1c01hdGNoUnVsZSAqcnVsZTsKKyAgUnVsZVRva2VuIHRva2Vuc1tNQVhfUlVMRV9UT0tFTlMrMV07IC8qIE5VTEwgdGVybWluYXRpb24gKyAxICovCisgIGludCBpOworICAKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChydWxlX3RleHQpID4gREJVU19NQVhJTVVNX01BVENIX1JVTEVfTEVOR1RIKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9MSU1JVFNfRVhDRUVERUQsCisgICAgICAgICAgICAgICAgICAgICAgIk1hdGNoIHJ1bGUgdGV4dCBpcyAlZCBieXRlcywgbWF4aW11bSBpcyAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHJ1bGVfdGV4dCksCisgICAgICAgICAgICAgICAgICAgICAgREJVU19NQVhJTVVNX01BVENIX1JVTEVfTEVOR1RIKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgCisgIG1lbXNldCAodG9rZW5zLCAnXDAnLCBzaXplb2YgKHRva2VucykpOworICAKKyAgcnVsZSA9IGJ1c19tYXRjaF9ydWxlX25ldyAobWF0Y2hlc19nb190byk7CisgIGlmIChydWxlID09IE5VTEwpCisgICAgeworICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKyAgCisgIGlmICghdG9rZW5pemVfcnVsZSAocnVsZV90ZXh0LCB0b2tlbnMsIGVycm9yKSkKKyAgICBnb3RvIGZhaWxlZDsKKyAgCisgIGkgPSAwOworICB3aGlsZSAodG9rZW5zW2ldLmtleSAhPSBOVUxMKQorICAgIHsKKyAgICAgIERCdXNTdHJpbmcgdG1wX3N0cjsKKyAgICAgIGludCBsZW47CisgICAgICBjb25zdCBjaGFyICprZXkgPSB0b2tlbnNbaV0ua2V5OworICAgICAgY29uc3QgY2hhciAqdmFsdWUgPSB0b2tlbnNbaV0udmFsdWU7CisgICAgICAKKyAgICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmdG1wX3N0ciwgdmFsdWUpOworICAgICAgbGVuID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZ0bXBfc3RyKTsKKworICAgICAgaWYgKHN0cmNtcCAoa2V5LCAidHlwZSIpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICBpbnQgdDsKKworICAgICAgICAgIGlmIChydWxlLT5mbGFncyAmIEJVU19NQVRDSF9NRVNTQUdFX1RZUEUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9NQVRDSF9SVUxFX0lOVkFMSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiS2V5ICVzIHNwZWNpZmllZCB0d2ljZSBpbiBtYXRjaCBydWxlXG4iLCBrZXkpOworICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgICAgICB0ID0gZGJ1c19tZXNzYWdlX3R5cGVfZnJvbV9zdHJpbmcgKHZhbHVlKTsKKyAgICAgICAgICAKKyAgICAgICAgICBpZiAodCA9PSBEQlVTX01FU1NBR0VfVFlQRV9JTlZBTElEKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTUFUQ0hfUlVMRV9JTlZBTElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgbWVzc2FnZSB0eXBlICglcykgaW4gbWF0Y2ggcnVsZVxuIiwgdmFsdWUpOworICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGlmICghYnVzX21hdGNoX3J1bGVfc2V0X21lc3NhZ2VfdHlwZSAocnVsZSwgdCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBlbHNlIGlmIChzdHJjbXAgKGtleSwgInNlbmRlciIpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICBpZiAocnVsZS0+ZmxhZ3MgJiBCVVNfTUFUQ0hfU0VOREVSKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTUFUQ0hfUlVMRV9JTlZBTElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIktleSAlcyBzcGVjaWZpZWQgdHdpY2UgaW4gbWF0Y2ggcnVsZVxuIiwga2V5KTsKKyAgICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoIV9kYnVzX3ZhbGlkYXRlX2J1c19uYW1lICgmdG1wX3N0ciwgMCwgbGVuKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX01BVENIX1JVTEVfSU5WQUxJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZW5kZXIgbmFtZSAnJXMnIGlzIGludmFsaWRcbiIsIHZhbHVlKTsKKyAgICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoIWJ1c19tYXRjaF9ydWxlX3NldF9zZW5kZXIgKHJ1bGUsIHZhbHVlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoa2V5LCAiaW50ZXJmYWNlIikgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIGlmIChydWxlLT5mbGFncyAmIEJVU19NQVRDSF9JTlRFUkZBQ0UpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9NQVRDSF9SVUxFX0lOVkFMSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiS2V5ICVzIHNwZWNpZmllZCB0d2ljZSBpbiBtYXRjaCBydWxlXG4iLCBrZXkpOworICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGlmICghX2RidXNfdmFsaWRhdGVfaW50ZXJmYWNlICgmdG1wX3N0ciwgMCwgbGVuKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX01BVENIX1JVTEVfSU5WQUxJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnRlcmZhY2UgbmFtZSAnJXMnIGlzIGludmFsaWRcbiIsIHZhbHVlKTsKKyAgICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoIWJ1c19tYXRjaF9ydWxlX3NldF9pbnRlcmZhY2UgKHJ1bGUsIHZhbHVlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoa2V5LCAibWVtYmVyIikgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIGlmIChydWxlLT5mbGFncyAmIEJVU19NQVRDSF9NRU1CRVIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9NQVRDSF9SVUxFX0lOVkFMSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiS2V5ICVzIHNwZWNpZmllZCB0d2ljZSBpbiBtYXRjaCBydWxlXG4iLCBrZXkpOworICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGlmICghX2RidXNfdmFsaWRhdGVfbWVtYmVyICgmdG1wX3N0ciwgMCwgbGVuKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX01BVENIX1JVTEVfSU5WQUxJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNZW1iZXIgbmFtZSAnJXMnIGlzIGludmFsaWRcbiIsIHZhbHVlKTsKKyAgICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoIWJ1c19tYXRjaF9ydWxlX3NldF9tZW1iZXIgKHJ1bGUsIHZhbHVlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoa2V5LCAicGF0aCIpID09IDAgfHwKKyAgICAgICAgICBzdHJjbXAgKGtleSwgInBhdGhfbmFtZXNwYWNlIikgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfYm9vbF90IGlzX25hbWVzcGFjZSA9IChzdHJjbXAgKGtleSwgInBhdGhfbmFtZXNwYWNlIikgPT0gMCk7CisKKyAgICAgICAgICBpZiAocnVsZS0+ZmxhZ3MgJiAoQlVTX01BVENIX1BBVEggfCBCVVNfTUFUQ0hfUEFUSF9OQU1FU1BBQ0UpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTUFUQ0hfUlVMRV9JTlZBTElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhdGggb3IgcGF0aF9uYW1lc3BhY2Ugc3BlY2lmaWVkIHR3aWNlIGluIG1hdGNoIHJ1bGVcbiIpOworICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGlmICghX2RidXNfdmFsaWRhdGVfcGF0aCAoJnRtcF9zdHIsIDAsIGxlbikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9NQVRDSF9SVUxFX0lOVkFMSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGF0aCAnJXMnIGlzIGludmFsaWRcbiIsIHZhbHVlKTsKKyAgICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoIWJ1c19tYXRjaF9ydWxlX3NldF9wYXRoIChydWxlLCB2YWx1ZSwgaXNfbmFtZXNwYWNlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoa2V5LCAiZGVzdGluYXRpb24iKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgaWYgKHJ1bGUtPmZsYWdzICYgQlVTX01BVENIX0RFU1RJTkFUSU9OKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTUFUQ0hfUlVMRV9JTlZBTElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIktleSAlcyBzcGVjaWZpZWQgdHdpY2UgaW4gbWF0Y2ggcnVsZVxuIiwga2V5KTsKKyAgICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoIV9kYnVzX3ZhbGlkYXRlX2J1c19uYW1lICgmdG1wX3N0ciwgMCwgbGVuKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX01BVENIX1JVTEVfSU5WQUxJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEZXN0aW5hdGlvbiBuYW1lICclcycgaXMgaW52YWxpZFxuIiwgdmFsdWUpOworICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGlmICghYnVzX21hdGNoX3J1bGVfc2V0X2Rlc3RpbmF0aW9uIChydWxlLCB2YWx1ZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIEJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBlbHNlIGlmIChzdHJjbXAgKGtleSwgImVhdmVzZHJvcCIpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAvKiBkbyBub3QgZGV0ZWN0ICJlYXZlc2Ryb3AiIGJlaW5nIHVzZWQgbW9yZSB0aGFuIG9uY2UgaW4gcnVsZToKKyAgICAgICAgICAgKiAxKSBpdCdzIG5vdCBwb3NzaWJsZSwgaXQncyBvbmx5IGluIHRoZSBmbGFncworICAgICAgICAgICAqIDIpIGl0IG1pZ2h0IGJlIHVzZWQgdHdpY2UgdG8gZGlzYWJsZSBlYXZlc2Ryb3BwaW5nIHdoZW4gaXQncworICAgICAgICAgICAqIGF1dG9tYXRpY2FsbHkgYWRkZWQgKGVnIGRidXMtbW9uaXRvci9idXN0bGUpICovCisKKyAgICAgICAgICAvKiB3ZSBhY2NlcHQgb25seSAidHJ1ZXxmYWxzZSIgYXMgcG9zc2libGUgdmFsdWVzICovCisgICAgICAgICAgaWYgKChzdHJjbXAgKHZhbHVlLCAidHJ1ZSIpID09IDApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBidXNfbWF0Y2hfcnVsZV9zZXRfY2xpZW50X2lzX2VhdmVzZHJvcHBpbmcgKHJ1bGUsIFRSVUUpOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgaWYgKHN0cmNtcCAodmFsdWUsICJmYWxzZSIpID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGJ1c19tYXRjaF9ydWxlX3NldF9jbGllbnRfaXNfZWF2ZXNkcm9wcGluZyAocnVsZSwgRkFMU0UpOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX01BVENIX1JVTEVfSU5WQUxJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlYXZlc2Ryb3A9JyVzJyBpcyBpbnZhbGlkLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaXQgc2hvdWxkIGJlICd0cnVlJyBvciAnZmFsc2UnXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUpOworICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoc3RybmNtcCAoa2V5LCAiYXJnIiwgMykgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIGlmICghYnVzX21hdGNoX3J1bGVfcGFyc2VfYXJnX21hdGNoIChydWxlLCBrZXksICZ0bXBfc3RyLCBlcnJvcikpCisgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX01BVENIX1JVTEVfSU5WQUxJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlVua25vd24ga2V5IFwiJXNcIiBpbiBtYXRjaCBydWxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAga2V5KTsKKyAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgfQorCisgICAgICArK2k7CisgICAgfQorICAKKworICBnb3RvIG91dDsKKyAgCisgZmFpbGVkOgorICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgIGlmIChydWxlKQorICAgIHsKKyAgICAgIGJ1c19tYXRjaF9ydWxlX3VucmVmIChydWxlKTsKKyAgICAgIHJ1bGUgPSBOVUxMOworICAgIH0KKworIG91dDoKKyAgCisgIGkgPSAwOworICB3aGlsZSAodG9rZW5zW2ldLmtleSB8fCB0b2tlbnNbaV0udmFsdWUpCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0IChpIDwgTUFYX1JVTEVfVE9LRU5TKTsKKyAgICAgIGRidXNfZnJlZSAodG9rZW5zW2ldLmtleSk7CisgICAgICBkYnVzX2ZyZWUgKHRva2Vuc1tpXS52YWx1ZSk7CisgICAgICArK2k7CisgICAgfQorICAKKyAgcmV0dXJuIHJ1bGU7Cit9CisKK3R5cGVkZWYgc3RydWN0IFJ1bGVQb29sIFJ1bGVQb29sOworc3RydWN0IFJ1bGVQb29sCit7CisgIC8qIE1hcHMgbm9uLU5VTEwgaW50ZXJmYWNlIG5hbWVzIHRvIG5vbi1OVUxMIChEQnVzTGlzdCAqKilzICovCisgIERCdXNIYXNoVGFibGUgKnJ1bGVzX2J5X2lmYWNlOworCisgIC8qIExpc3Qgb2YgQnVzTWF0Y2hSdWxlcyB3aGljaCBkb24ndCBzcGVjaWZ5IGFuIGludGVyZmFjZSAqLworICBEQnVzTGlzdCAqcnVsZXNfd2l0aG91dF9pZmFjZTsKK307CisKK3N0cnVjdCBCdXNNYXRjaG1ha2VyCit7CisgIGludCByZWZjb3VudDsKKworICAvKiBQb29scyBvZiBydWxlcywgZ3JvdXBlZCBieSB0aGUgdHlwZSBvZiBtZXNzYWdlIHRoZXkgbWF0Y2guIDAKKyAgICogKERCVVNfTUVTU0FHRV9UWVBFX0lOVkFMSUQpIHJlcHJlc2VudHMgcnVsZXMgdGhhdCBkbyBub3Qgc3BlY2lmeSBhIG1lc3NhZ2UKKyAgICogdHlwZS4KKyAgICovCisgIFJ1bGVQb29sIHJ1bGVzX2J5X3R5cGVbREJVU19OVU1fTUVTU0FHRV9UWVBFU107Cit9OworCisjaWZkZWYgREJVU19FTkFCTEVfU1RBVFMKK2RidXNfYm9vbF90CitidXNfbWF0Y2hfcnVsZV9kdW1wIChCdXNNYXRjaG1ha2VyICptYXRjaG1ha2VyLAorICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5fZmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2VJdGVyICphcnJfaXRlcikKK3sKKyAgaW50IGk7CisKKyAgZm9yIChpID0gMCA7IGkgPCBEQlVTX05VTV9NRVNTQUdFX1RZUEVTIDsgaSsrKQorICAgIHsKKyAgICAgIERCdXNIYXNoSXRlciBpdGVyOworICAgICAgREJ1c0xpc3QgKipsaXN0OworICAgICAgREJ1c0xpc3QgKmxpbms7CisKKyAgICAgIF9kYnVzX2hhc2hfaXRlcl9pbml0IChtYXRjaG1ha2VyLT5ydWxlc19ieV90eXBlW2ldLnJ1bGVzX2J5X2lmYWNlLCAmaXRlcik7CisgICAgICB3aGlsZSAoX2RidXNfaGFzaF9pdGVyX25leHQgKCZpdGVyKSkKKyAgICAgICAgeworICAgICAgICAgIGxpc3QgPSAgX2RidXNfaGFzaF9pdGVyX2dldF92YWx1ZSAoJml0ZXIpOworICAgICAgICAgIGZvciAobGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKGxpc3QpOworICAgICAgICAgICAgICAgbGluayAhPSBOVUxMOworICAgICAgICAgICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAobGlzdCwgbGluaykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIEJ1c01hdGNoUnVsZSAqcnVsZSA9IGxpbmstPmRhdGE7CisKKyAgICAgICAgICAgICAgaWYgKHJ1bGUtPm1hdGNoZXNfZ29fdG8gPT0gY29ubl9maWx0ZXIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgY2hhciAqcyA9IG1hdGNoX3J1bGVfdG9fc3RyaW5nIChydWxlKTsKKworICAgICAgICAgICAgICAgICAgaWYgKHMgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICAgICAgICAgICAgICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYyAoYXJyX2l0ZXIsIERCVVNfVFlQRV9TVFJJTkcsICZzKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgIGRidXNfZnJlZSAocyk7CisgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBkYnVzX2ZyZWUgKHMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgbGlzdCA9ICZtYXRjaG1ha2VyLT5ydWxlc19ieV90eXBlW2ldLnJ1bGVzX3dpdGhvdXRfaWZhY2U7CisgICAgICBmb3IgKGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rIChsaXN0KTsKKyAgICAgICAgICAgbGluayAhPSBOVUxMOworICAgICAgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rIChsaXN0LCBsaW5rKSkKKyAgICAgICAgeworICAgICAgICAgIEJ1c01hdGNoUnVsZSAqcnVsZSA9IGxpbmstPmRhdGE7CisKKyAgICAgICAgICBpZiAocnVsZS0+bWF0Y2hlc19nb190byA9PSBjb25uX2ZpbHRlcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgY2hhciAqcyA9IG1hdGNoX3J1bGVfdG9fc3RyaW5nIChydWxlKTsKKworICAgICAgICAgICAgICBpZiAocyA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgICAgICAgICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYyAoYXJyX2l0ZXIsIERCVVNfVFlQRV9TVFJJTkcsICZzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBkYnVzX2ZyZWUgKHMpOworICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZGJ1c19mcmVlIChzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZAorcnVsZV9saXN0X2ZyZWUgKERCdXNMaXN0ICoqcnVsZXMpCit7CisgIHdoaWxlICgqcnVsZXMgIT0gTlVMTCkKKyAgICB7CisgICAgICBCdXNNYXRjaFJ1bGUgKnJ1bGU7CisKKyAgICAgIHJ1bGUgPSAoKnJ1bGVzKS0+ZGF0YTsKKyAgICAgIGJ1c19tYXRjaF9ydWxlX3VucmVmIChydWxlKTsKKyAgICAgIF9kYnVzX2xpc3RfcmVtb3ZlX2xpbmsgKHJ1bGVzLCAqcnVsZXMpOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK3J1bGVfbGlzdF9wdHJfZnJlZSAoREJ1c0xpc3QgKipsaXN0KQoreworICAvKiBXZSBoYXZlIHRvIGNvcGUgd2l0aCBOVUxMIGJlY2F1c2UgdGhlIGhhc2ggdGFibGUgZnJlZXMgdGhlICJleGlzdGluZyIKKyAgICogdmFsdWUgKHdoaWNoIGlzIE5VTEwpIHdoZW4gY3JlYXRpbmcgYSBuZXcgdGFibGUgZW50cnkuLi4KKyAgICovCisgIGlmIChsaXN0ICE9IE5VTEwpCisgICAgeworICAgICAgcnVsZV9saXN0X2ZyZWUgKGxpc3QpOworICAgICAgZGJ1c19mcmVlIChsaXN0KTsKKyAgICB9Cit9CisKK0J1c01hdGNobWFrZXIqCitidXNfbWF0Y2htYWtlcl9uZXcgKHZvaWQpCit7CisgIEJ1c01hdGNobWFrZXIgKm1hdGNobWFrZXI7CisgIGludCBpOworCisgIG1hdGNobWFrZXIgPSBkYnVzX25ldzAgKEJ1c01hdGNobWFrZXIsIDEpOworICBpZiAobWF0Y2htYWtlciA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIG1hdGNobWFrZXItPnJlZmNvdW50ID0gMTsKKworICBmb3IgKGkgPSBEQlVTX01FU1NBR0VfVFlQRV9JTlZBTElEOyBpIDwgREJVU19OVU1fTUVTU0FHRV9UWVBFUzsgaSsrKQorICAgIHsKKyAgICAgIFJ1bGVQb29sICpwID0gbWF0Y2htYWtlci0+cnVsZXNfYnlfdHlwZSArIGk7CisKKyAgICAgIHAtPnJ1bGVzX2J5X2lmYWNlID0gX2RidXNfaGFzaF90YWJsZV9uZXcgKERCVVNfSEFTSF9TVFJJTkcsCisgICAgICAgICAgZGJ1c19mcmVlLCAoREJ1c0ZyZWVGdW5jdGlvbikgcnVsZV9saXN0X3B0cl9mcmVlKTsKKworICAgICAgaWYgKHAtPnJ1bGVzX2J5X2lmYWNlID09IE5VTEwpCisgICAgICAgIGdvdG8gbm9tZW07CisgICAgfQorCisgIHJldHVybiBtYXRjaG1ha2VyOworCisgbm9tZW06CisgIGZvciAoaSA9IERCVVNfTUVTU0FHRV9UWVBFX0lOVkFMSUQ7IGkgPCBEQlVTX05VTV9NRVNTQUdFX1RZUEVTOyBpKyspCisgICAgeworICAgICAgUnVsZVBvb2wgKnAgPSBtYXRjaG1ha2VyLT5ydWxlc19ieV90eXBlICsgaTsKKworICAgICAgaWYgKHAtPnJ1bGVzX2J5X2lmYWNlID09IE5VTEwpCisgICAgICAgIGJyZWFrOworICAgICAgZWxzZQorICAgICAgICBfZGJ1c19oYXNoX3RhYmxlX3VucmVmIChwLT5ydWxlc19ieV9pZmFjZSk7CisgICAgfQorICBkYnVzX2ZyZWUgKG1hdGNobWFrZXIpOworCisgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgREJ1c0xpc3QgKioKK2J1c19tYXRjaG1ha2VyX2dldF9ydWxlcyAoQnVzTWF0Y2htYWtlciAqbWF0Y2htYWtlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgbWVzc2FnZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICppbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgIGNyZWF0ZSkKK3sKKyAgUnVsZVBvb2wgKnA7CisKKyAgX2RidXNfYXNzZXJ0IChtZXNzYWdlX3R5cGUgPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAobWVzc2FnZV90eXBlIDwgREJVU19OVU1fTUVTU0FHRV9UWVBFUyk7CisKKyAgX2RidXNfdmVyYm9zZSAoIkxvb2tpbmcgdXAgcnVsZXMgZm9yIG1lc3NhZ2VfdHlwZSAlZCwgaW50ZXJmYWNlICVzXG4iLAorICAgICAgICAgICAgICAgICBtZXNzYWdlX3R5cGUsCisgICAgICAgICAgICAgICAgIGludGVyZmFjZSAhPSBOVUxMID8gaW50ZXJmYWNlIDogIjxudWxsPiIpOworCisgIHAgPSBtYXRjaG1ha2VyLT5ydWxlc19ieV90eXBlICsgbWVzc2FnZV90eXBlOworCisgIGlmIChpbnRlcmZhY2UgPT0gTlVMTCkKKyAgICB7CisgICAgICByZXR1cm4gJnAtPnJ1bGVzX3dpdGhvdXRfaWZhY2U7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgREJ1c0xpc3QgKipsaXN0OworCisgICAgICBsaXN0ID0gX2RidXNfaGFzaF90YWJsZV9sb29rdXBfc3RyaW5nIChwLT5ydWxlc19ieV9pZmFjZSwgaW50ZXJmYWNlKTsKKworICAgICAgaWYgKGxpc3QgPT0gTlVMTCAmJiBjcmVhdGUpCisgICAgICAgIHsKKyAgICAgICAgICBjaGFyICpkdXBwZWRfaW50ZXJmYWNlOworCisgICAgICAgICAgbGlzdCA9IGRidXNfbmV3MCAoREJ1c0xpc3QgKiwgMSk7CisgICAgICAgICAgaWYgKGxpc3QgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworCisgICAgICAgICAgZHVwcGVkX2ludGVyZmFjZSA9IF9kYnVzX3N0cmR1cCAoaW50ZXJmYWNlKTsKKyAgICAgICAgICBpZiAoZHVwcGVkX2ludGVyZmFjZSA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkYnVzX2ZyZWUgKGxpc3QpOworICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJBZGRpbmcgbGlzdCBmb3IgdHlwZSAlZCwgaWZhY2UgJXNcbiIsIG1lc3NhZ2VfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2UpOworCisgICAgICAgICAgaWYgKCFfZGJ1c19oYXNoX3RhYmxlX2luc2VydF9zdHJpbmcgKHAtPnJ1bGVzX2J5X2lmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXBwZWRfaW50ZXJmYWNlLCBsaXN0KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c19mcmVlIChsaXN0KTsKKyAgICAgICAgICAgICAgZGJ1c19mcmVlIChkdXBwZWRfaW50ZXJmYWNlKTsKKyAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgcmV0dXJuIGxpc3Q7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorYnVzX21hdGNobWFrZXJfZ2NfcnVsZXMgKEJ1c01hdGNobWFrZXIgKm1hdGNobWFrZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgbWVzc2FnZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgKmludGVyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAgICAgKipydWxlcykKK3sKKyAgUnVsZVBvb2wgKnA7CisKKyAgaWYgKGludGVyZmFjZSA9PSBOVUxMKQorICAgIHJldHVybjsKKworICBpZiAoKnJ1bGVzICE9IE5VTEwpCisgICAgcmV0dXJuOworCisgIF9kYnVzX3ZlcmJvc2UgKCJHQ2luZyBIVCBlbnRyeSBmb3IgbWVzc2FnZV90eXBlICV1LCBpbnRlcmZhY2UgJXNcbiIsCisgICAgICAgICAgICAgICAgIG1lc3NhZ2VfdHlwZSwgaW50ZXJmYWNlKTsKKworICBwID0gbWF0Y2htYWtlci0+cnVsZXNfYnlfdHlwZSArIG1lc3NhZ2VfdHlwZTsKKworICBfZGJ1c19hc3NlcnQgKF9kYnVzX2hhc2hfdGFibGVfbG9va3VwX3N0cmluZyAocC0+cnVsZXNfYnlfaWZhY2UsIGludGVyZmFjZSkKKyAgICAgID09IHJ1bGVzKTsKKworICBfZGJ1c19oYXNoX3RhYmxlX3JlbW92ZV9zdHJpbmcgKHAtPnJ1bGVzX2J5X2lmYWNlLCBpbnRlcmZhY2UpOworfQorCitCdXNNYXRjaG1ha2VyICoKK2J1c19tYXRjaG1ha2VyX3JlZiAoQnVzTWF0Y2htYWtlciAqbWF0Y2htYWtlcikKK3sKKyAgX2RidXNfYXNzZXJ0IChtYXRjaG1ha2VyLT5yZWZjb3VudCA+IDApOworCisgIG1hdGNobWFrZXItPnJlZmNvdW50ICs9IDE7CisKKyAgcmV0dXJuIG1hdGNobWFrZXI7Cit9CisKK3ZvaWQKK2J1c19tYXRjaG1ha2VyX3VucmVmIChCdXNNYXRjaG1ha2VyICptYXRjaG1ha2VyKQoreworICBfZGJ1c19hc3NlcnQgKG1hdGNobWFrZXItPnJlZmNvdW50ID4gMCk7CisKKyAgbWF0Y2htYWtlci0+cmVmY291bnQgLT0gMTsKKyAgaWYgKG1hdGNobWFrZXItPnJlZmNvdW50ID09IDApCisgICAgeworICAgICAgaW50IGk7CisKKyAgICAgIGZvciAoaSA9IERCVVNfTUVTU0FHRV9UWVBFX0lOVkFMSUQ7IGkgPCBEQlVTX05VTV9NRVNTQUdFX1RZUEVTOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICBSdWxlUG9vbCAqcCA9IG1hdGNobWFrZXItPnJ1bGVzX2J5X3R5cGUgKyBpOworCisgICAgICAgICAgX2RidXNfaGFzaF90YWJsZV91bnJlZiAocC0+cnVsZXNfYnlfaWZhY2UpOworICAgICAgICAgIHJ1bGVfbGlzdF9mcmVlICgmcC0+cnVsZXNfd2l0aG91dF9pZmFjZSk7CisgICAgICAgIH0KKworICAgICAgZGJ1c19mcmVlIChtYXRjaG1ha2VyKTsKKyAgICB9Cit9CisKKy8qIFRoZSBydWxlIGNhbid0IGJlIG1vZGlmaWVkIGFmdGVyIGl0J3MgYWRkZWQuICovCitkYnVzX2Jvb2xfdAorYnVzX21hdGNobWFrZXJfYWRkX3J1bGUgKEJ1c01hdGNobWFrZXIgICAqbWF0Y2htYWtlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBCdXNNYXRjaFJ1bGUgICAgKnJ1bGUpCit7CisgIERCdXNMaXN0ICoqcnVsZXM7CisKKyAgX2RidXNfYXNzZXJ0IChidXNfY29ubmVjdGlvbl9pc19hY3RpdmUgKHJ1bGUtPm1hdGNoZXNfZ29fdG8pKTsKKworICBfZGJ1c192ZXJib3NlICgiQWRkaW5nIHJ1bGUgd2l0aCBtZXNzYWdlX3R5cGUgJWQsIGludGVyZmFjZSAlc1xuIiwKKyAgICAgICAgICAgICAgICAgcnVsZS0+bWVzc2FnZV90eXBlLAorICAgICAgICAgICAgICAgICBydWxlLT5pbnRlcmZhY2UgIT0gTlVMTCA/IHJ1bGUtPmludGVyZmFjZSA6ICI8bnVsbD4iKTsKKworICBydWxlcyA9IGJ1c19tYXRjaG1ha2VyX2dldF9ydWxlcyAobWF0Y2htYWtlciwgcnVsZS0+bWVzc2FnZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZS0+aW50ZXJmYWNlLCBUUlVFKTsKKworICBpZiAocnVsZXMgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFfZGJ1c19saXN0X2FwcGVuZCAocnVsZXMsIHJ1bGUpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWJ1c19jb25uZWN0aW9uX2FkZF9tYXRjaF9ydWxlIChydWxlLT5tYXRjaGVzX2dvX3RvLCBydWxlKSkKKyAgICB7CisgICAgICBfZGJ1c19saXN0X3JlbW92ZV9sYXN0IChydWxlcywgcnVsZSk7CisgICAgICBidXNfbWF0Y2htYWtlcl9nY19ydWxlcyAobWF0Y2htYWtlciwgcnVsZS0+bWVzc2FnZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGUtPmludGVyZmFjZSwgcnVsZXMpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBidXNfbWF0Y2hfcnVsZV9yZWYgKHJ1bGUpOworCisjaWZkZWYgREJVU19FTkFCTEVfVkVSQk9TRV9NT0RFCisgIHsKKyAgICBjaGFyICpzID0gbWF0Y2hfcnVsZV90b19zdHJpbmcgKHJ1bGUpOworCisgICAgX2RidXNfdmVyYm9zZSAoIkFkZGVkIG1hdGNoIHJ1bGUgJXMgdG8gY29ubmVjdGlvbiAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICBzID8gcyA6ICJub21lbSIsIHJ1bGUtPm1hdGNoZXNfZ29fdG8pOworICAgIGRidXNfZnJlZSAocyk7CisgIH0KKyNlbmRpZgorICAKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorbWF0Y2hfcnVsZV9lcXVhbCAoQnVzTWF0Y2hSdWxlICphLAorICAgICAgICAgICAgICAgICAgQnVzTWF0Y2hSdWxlICpiKQoreworICBpZiAoYS0+ZmxhZ3MgIT0gYi0+ZmxhZ3MpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmIChhLT5tYXRjaGVzX2dvX3RvICE9IGItPm1hdGNoZXNfZ29fdG8pCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICgoYS0+ZmxhZ3MgJiBCVVNfTUFUQ0hfTUVTU0FHRV9UWVBFKSAmJgorICAgICAgYS0+bWVzc2FnZV90eXBlICE9IGItPm1lc3NhZ2VfdHlwZSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKChhLT5mbGFncyAmIEJVU19NQVRDSF9NRU1CRVIpICYmCisgICAgICBzdHJjbXAgKGEtPm1lbWJlciwgYi0+bWVtYmVyKSAhPSAwKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoKGEtPmZsYWdzICYgQlVTX01BVENIX1BBVEgpICYmCisgICAgICBzdHJjbXAgKGEtPnBhdGgsIGItPnBhdGgpICE9IDApCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICgoYS0+ZmxhZ3MgJiBCVVNfTUFUQ0hfSU5URVJGQUNFKSAmJgorICAgICAgc3RyY21wIChhLT5pbnRlcmZhY2UsIGItPmludGVyZmFjZSkgIT0gMCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKChhLT5mbGFncyAmIEJVU19NQVRDSF9TRU5ERVIpICYmCisgICAgICBzdHJjbXAgKGEtPnNlbmRlciwgYi0+c2VuZGVyKSAhPSAwKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoKGEtPmZsYWdzICYgQlVTX01BVENIX0RFU1RJTkFUSU9OKSAmJgorICAgICAgc3RyY21wIChhLT5kZXN0aW5hdGlvbiwgYi0+ZGVzdGluYXRpb24pICE9IDApCisgICAgcmV0dXJuIEZBTFNFOworCisgIC8qIHdlIGFscmVhZHkgY29tcGFyZWQgdGhlIHZhbHVlIG9mIGZsYWdzLCBhbmQKKyAgICogQlVTX01BVENIX0NMSUVOVF9JU19FQVZFU0RST1BQSU5HIGRvZXMgbm90IGhhdmUgYW5vdGhlciBzdHJ1Y3QgbWVtYmVyICovCisKKyAgaWYgKGEtPmZsYWdzICYgQlVTX01BVENIX0FSR1MpCisgICAgeworICAgICAgaW50IGk7CisgICAgICAKKyAgICAgIGlmIChhLT5hcmdzX2xlbiAhPSBiLT5hcmdzX2xlbikKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgCisgICAgICBpID0gMDsKKyAgICAgIHdoaWxlIChpIDwgYS0+YXJnc19sZW4pCisgICAgICAgIHsKKyAgICAgICAgICBpbnQgbGVuZ3RoOworCisgICAgICAgICAgaWYgKChhLT5hcmdzW2ldICE9IE5VTEwpICE9IChiLT5hcmdzW2ldICE9IE5VTEwpKQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICAgICAgaWYgKGEtPmFyZ19sZW5zW2ldICE9IGItPmFyZ19sZW5zW2ldKQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICAgICAgbGVuZ3RoID0gYS0+YXJnX2xlbnNbaV0gJiB+QlVTX01BVENIX0FSR19GTEFHUzsKKworICAgICAgICAgIGlmIChhLT5hcmdzW2ldICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX2Fzc2VydCAoYi0+YXJnc1tpXSAhPSBOVUxMKTsKKyAgICAgICAgICAgICAgaWYgKG1lbWNtcCAoYS0+YXJnc1tpXSwgYi0+YXJnc1tpXSwgbGVuZ3RoKSAhPSAwKQorICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgICAgICArK2k7CisgICAgICAgIH0KKyAgICB9CisgIAorICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK2J1c19tYXRjaG1ha2VyX3JlbW92ZV9ydWxlX2xpbmsgKERCdXNMaXN0ICAgICAgICoqcnVsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAgICAgICAgKmxpbmspCit7CisgIEJ1c01hdGNoUnVsZSAqcnVsZSA9IGxpbmstPmRhdGE7CisgIAorICBidXNfY29ubmVjdGlvbl9yZW1vdmVfbWF0Y2hfcnVsZSAocnVsZS0+bWF0Y2hlc19nb190bywgcnVsZSk7CisgIF9kYnVzX2xpc3RfcmVtb3ZlX2xpbmsgKHJ1bGVzLCBsaW5rKTsKKworI2lmZGVmIERCVVNfRU5BQkxFX1ZFUkJPU0VfTU9ERQorICB7CisgICAgY2hhciAqcyA9IG1hdGNoX3J1bGVfdG9fc3RyaW5nIChydWxlKTsKKworICAgIF9kYnVzX3ZlcmJvc2UgKCJSZW1vdmVkIG1hdGNoIHJ1bGUgJXMgZm9yIGNvbm5lY3Rpb24gJXBcbiIsCisgICAgICAgICAgICAgICAgICAgcyA/IHMgOiAibm9tZW0iLCBydWxlLT5tYXRjaGVzX2dvX3RvKTsKKyAgICBkYnVzX2ZyZWUgKHMpOworICB9CisjZW5kaWYKKyAgCisgIGJ1c19tYXRjaF9ydWxlX3VucmVmIChydWxlKTsgIAorfQorCit2b2lkCitidXNfbWF0Y2htYWtlcl9yZW1vdmVfcnVsZSAoQnVzTWF0Y2htYWtlciAgICptYXRjaG1ha2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1c01hdGNoUnVsZSAgICAqcnVsZSkKK3sKKyAgREJ1c0xpc3QgKipydWxlczsKKworICBfZGJ1c192ZXJib3NlICgiUmVtb3ZpbmcgcnVsZSB3aXRoIG1lc3NhZ2VfdHlwZSAlZCwgaW50ZXJmYWNlICVzXG4iLAorICAgICAgICAgICAgICAgICBydWxlLT5tZXNzYWdlX3R5cGUsCisgICAgICAgICAgICAgICAgIHJ1bGUtPmludGVyZmFjZSAhPSBOVUxMID8gcnVsZS0+aW50ZXJmYWNlIDogIjxudWxsPiIpOworCisgIGJ1c19jb25uZWN0aW9uX3JlbW92ZV9tYXRjaF9ydWxlIChydWxlLT5tYXRjaGVzX2dvX3RvLCBydWxlKTsKKworICBydWxlcyA9IGJ1c19tYXRjaG1ha2VyX2dldF9ydWxlcyAobWF0Y2htYWtlciwgcnVsZS0+bWVzc2FnZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZS0+aW50ZXJmYWNlLCBGQUxTRSk7CisKKyAgLyogV2Ugc2hvdWxkIG9ubHkgYmUgYXNrZWQgdG8gcmVtb3ZlIGEgcnVsZSBieSBpZGVudGl0eSByaWdodCBhZnRlciBpdCB3YXMKKyAgICogYWRkZWQsIHNvIHRoZXJlIHNob3VsZCBiZSBhIGxpc3QgZm9yIGl0LgorICAgKi8KKyAgX2RidXNfYXNzZXJ0IChydWxlcyAhPSBOVUxMKTsKKworICBfZGJ1c19saXN0X3JlbW92ZSAocnVsZXMsIHJ1bGUpOworICBidXNfbWF0Y2htYWtlcl9nY19ydWxlcyAobWF0Y2htYWtlciwgcnVsZS0+bWVzc2FnZV90eXBlLCBydWxlLT5pbnRlcmZhY2UsCisgICAgICBydWxlcyk7CisKKyNpZmRlZiBEQlVTX0VOQUJMRV9WRVJCT1NFX01PREUKKyAgeworICAgIGNoYXIgKnMgPSBtYXRjaF9ydWxlX3RvX3N0cmluZyAocnVsZSk7CisKKyAgICBfZGJ1c192ZXJib3NlICgiUmVtb3ZlZCBtYXRjaCBydWxlICVzIGZvciBjb25uZWN0aW9uICVwXG4iLAorICAgICAgICAgICAgICAgICAgIHMgPyBzIDogIm5vbWVtIiwgcnVsZS0+bWF0Y2hlc19nb190byk7CisgICAgZGJ1c19mcmVlIChzKTsKKyAgfQorI2VuZGlmCisgIAorICBidXNfbWF0Y2hfcnVsZV91bnJlZiAocnVsZSk7Cit9CisKKy8qIFJlbW92ZSBhIHNpbmdsZSBydWxlIHdoaWNoIGlzIGVxdWFsIHRvIHRoZSBnaXZlbiBydWxlIGJ5IHZhbHVlICovCitkYnVzX2Jvb2xfdAorYnVzX21hdGNobWFrZXJfcmVtb3ZlX3J1bGVfYnlfdmFsdWUgKEJ1c01hdGNobWFrZXIgICAqbWF0Y2htYWtlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNNYXRjaFJ1bGUgICAgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAqZXJyb3IpCit7CisgIERCdXNMaXN0ICoqcnVsZXM7CisgIERCdXNMaXN0ICpsaW5rID0gTlVMTDsKKworICBfZGJ1c192ZXJib3NlICgiUmVtb3ZpbmcgcnVsZSBieSB2YWx1ZSB3aXRoIG1lc3NhZ2VfdHlwZSAlZCwgaW50ZXJmYWNlICVzXG4iLAorICAgICAgICAgICAgICAgICB2YWx1ZS0+bWVzc2FnZV90eXBlLAorICAgICAgICAgICAgICAgICB2YWx1ZS0+aW50ZXJmYWNlICE9IE5VTEwgPyB2YWx1ZS0+aW50ZXJmYWNlIDogIjxudWxsPiIpOworCisgIHJ1bGVzID0gYnVzX21hdGNobWFrZXJfZ2V0X3J1bGVzIChtYXRjaG1ha2VyLCB2YWx1ZS0+bWVzc2FnZV90eXBlLAorICAgICAgdmFsdWUtPmludGVyZmFjZSwgRkFMU0UpOworCisgIGlmIChydWxlcyAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIHdlIHRyYXZlcnNlIGJhY2t3YXJkIGJlY2F1c2UgYnVzX2Nvbm5lY3Rpb25fcmVtb3ZlX21hdGNoX3J1bGUoKQorICAgICAgICogcmVtb3ZlcyB0aGUgbW9zdC1yZWNlbnRseS1hZGRlZCBydWxlCisgICAgICAgKi8KKyAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9sYXN0X2xpbmsgKHJ1bGVzKTsKKyAgICAgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBCdXNNYXRjaFJ1bGUgKnJ1bGU7CisgICAgICAgICAgREJ1c0xpc3QgKnByZXY7CisKKyAgICAgICAgICBydWxlID0gbGluay0+ZGF0YTsKKyAgICAgICAgICBwcmV2ID0gX2RidXNfbGlzdF9nZXRfcHJldl9saW5rIChydWxlcywgbGluayk7CisKKyAgICAgICAgICBpZiAobWF0Y2hfcnVsZV9lcXVhbCAocnVsZSwgdmFsdWUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBidXNfbWF0Y2htYWtlcl9yZW1vdmVfcnVsZV9saW5rIChydWxlcywgbGluayk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgbGluayA9IHByZXY7CisgICAgICAgIH0KKyAgICB9CisKKyAgaWYgKGxpbmsgPT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTUFUQ0hfUlVMRV9OT1RfRk9VTkQsCisgICAgICAgICAgICAgICAgICAgICAgIlRoZSBnaXZlbiBtYXRjaCBydWxlIHdhc24ndCBmb3VuZCBhbmQgY2FuJ3QgYmUgcmVtb3ZlZCIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBidXNfbWF0Y2htYWtlcl9nY19ydWxlcyAobWF0Y2htYWtlciwgdmFsdWUtPm1lc3NhZ2VfdHlwZSwgdmFsdWUtPmludGVyZmFjZSwKKyAgICAgIHJ1bGVzKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK3J1bGVfbGlzdF9yZW1vdmVfYnlfY29ubmVjdGlvbiAoREJ1c0xpc3QgICAgICAgKipydWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gICpjb25uZWN0aW9uKQoreworICBEQnVzTGlzdCAqbGluazsKKworICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAocnVsZXMpOworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIEJ1c01hdGNoUnVsZSAqcnVsZTsKKyAgICAgIERCdXNMaXN0ICpuZXh0OworCisgICAgICBydWxlID0gbGluay0+ZGF0YTsKKyAgICAgIG5leHQgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKHJ1bGVzLCBsaW5rKTsKKworICAgICAgaWYgKHJ1bGUtPm1hdGNoZXNfZ29fdG8gPT0gY29ubmVjdGlvbikKKyAgICAgICAgeworICAgICAgICAgIGJ1c19tYXRjaG1ha2VyX3JlbW92ZV9ydWxlX2xpbmsgKHJ1bGVzLCBsaW5rKTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoKChydWxlLT5mbGFncyAmIEJVU19NQVRDSF9TRU5ERVIpICYmICpydWxlLT5zZW5kZXIgPT0gJzonKSB8fAorICAgICAgICAgICAgICAgKChydWxlLT5mbGFncyAmIEJVU19NQVRDSF9ERVNUSU5BVElPTikgJiYgKnJ1bGUtPmRlc3RpbmF0aW9uID09ICc6JykpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBUaGUgcnVsZSBtYXRjaGVzIHRvL2Zyb20gYSBiYXNlIHNlcnZpY2UsIHNlZSBpZiBpdCdzIHRoZQorICAgICAgICAgICAqIG9uZSBiZWluZyBkaXNjb25uZWN0ZWQsIHNpbmNlIHdlIGtub3cgdGhpcyBzZXJ2aWNlIG5hbWUKKyAgICAgICAgICAgKiB3aWxsIG5ldmVyIGJlIHJlY3ljbGVkLgorICAgICAgICAgICAqLworICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisKKyAgICAgICAgICBuYW1lID0gYnVzX2Nvbm5lY3Rpb25fZ2V0X25hbWUgKGNvbm5lY3Rpb24pOworICAgICAgICAgIF9kYnVzX2Fzc2VydCAobmFtZSAhPSBOVUxMKTsgLyogYmVjYXVzZSB3ZSdyZSBhbiBhY3RpdmUgY29ubmVjdGlvbiAqLworCisgICAgICAgICAgaWYgKCgocnVsZS0+ZmxhZ3MgJiBCVVNfTUFUQ0hfU0VOREVSKSAmJgorICAgICAgICAgICAgICAgc3RyY21wIChydWxlLT5zZW5kZXIsIG5hbWUpID09IDApIHx8CisgICAgICAgICAgICAgICgocnVsZS0+ZmxhZ3MgJiBCVVNfTUFUQ0hfREVTVElOQVRJT04pICYmCisgICAgICAgICAgICAgICBzdHJjbXAgKHJ1bGUtPmRlc3RpbmF0aW9uLCBuYW1lKSA9PSAwKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgYnVzX21hdGNobWFrZXJfcmVtb3ZlX3J1bGVfbGluayAocnVsZXMsIGxpbmspOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgIGxpbmsgPSBuZXh0OworICAgIH0KK30KKwordm9pZAorYnVzX21hdGNobWFrZXJfZGlzY29ubmVjdGVkIChCdXNNYXRjaG1ha2VyICAgKm1hdGNobWFrZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICAqY29ubmVjdGlvbikKK3sKKyAgaW50IGk7CisKKyAgLyogRklYTUUKKyAgICoKKyAgICogVGhpcyBzY2FucyBhbGwgbWF0Y2ggcnVsZXMgb24gdGhlIGJ1cy4gV2UgY291bGQgYXZvaWQgdGhhdAorICAgKiBmb3IgdGhlIHJ1bGVzIGJlbG9uZ2luZyB0byB0aGUgY29ubmVjdGlvbiwgc2luY2Ugd2Uga2VlcAorICAgKiBhIGxpc3Qgb2YgdGhvc2U7IGJ1dCBmb3IgdGhlIHJ1bGVzIHRoYXQganVzdCByZWZlciB0bworICAgKiB0aGUgY29ubmVjdGlvbiB3ZSdkIG5lZWQgdG8gZG8gc29tZXRoaW5nIG1vcmUgZWxhYm9yYXRlLgorICAgKi8KKworICBfZGJ1c19hc3NlcnQgKGJ1c19jb25uZWN0aW9uX2lzX2FjdGl2ZSAoY29ubmVjdGlvbikpOworCisgIF9kYnVzX3ZlcmJvc2UgKCJSZW1vdmluZyBhbGwgcnVsZXMgZm9yIGNvbm5lY3Rpb24gJXBcbiIsIGNvbm5lY3Rpb24pOworCisgIGZvciAoaSA9IERCVVNfTUVTU0FHRV9UWVBFX0lOVkFMSUQ7IGkgPCBEQlVTX05VTV9NRVNTQUdFX1RZUEVTOyBpKyspCisgICAgeworICAgICAgUnVsZVBvb2wgKnAgPSBtYXRjaG1ha2VyLT5ydWxlc19ieV90eXBlICsgaTsKKyAgICAgIERCdXNIYXNoSXRlciBpdGVyOworCisgICAgICBydWxlX2xpc3RfcmVtb3ZlX2J5X2Nvbm5lY3Rpb24gKCZwLT5ydWxlc193aXRob3V0X2lmYWNlLCBjb25uZWN0aW9uKTsKKworICAgICAgX2RidXNfaGFzaF9pdGVyX2luaXQgKHAtPnJ1bGVzX2J5X2lmYWNlLCAmaXRlcik7CisgICAgICB3aGlsZSAoX2RidXNfaGFzaF9pdGVyX25leHQgKCZpdGVyKSkKKyAgICAgICAgeworICAgICAgICAgIERCdXNMaXN0ICoqaXRlbXMgPSBfZGJ1c19oYXNoX2l0ZXJfZ2V0X3ZhbHVlICgmaXRlcik7CisKKyAgICAgICAgICBydWxlX2xpc3RfcmVtb3ZlX2J5X2Nvbm5lY3Rpb24gKGl0ZW1zLCBjb25uZWN0aW9uKTsKKworICAgICAgICAgIGlmICgqaXRlbXMgPT0gTlVMTCkKKyAgICAgICAgICAgIF9kYnVzX2hhc2hfaXRlcl9yZW1vdmVfZW50cnkgKCZpdGVyKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIGRidXNfYm9vbF90Citjb25uZWN0aW9uX2lzX3ByaW1hcnlfb3duZXIgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqc2VydmljZV9uYW1lKQoreworICBCdXNTZXJ2aWNlICpzZXJ2aWNlOworICBEQnVzU3RyaW5nIHN0cjsKKyAgQnVzUmVnaXN0cnkgKnJlZ2lzdHJ5OworCisgIF9kYnVzX2Fzc2VydCAoY29ubmVjdGlvbiAhPSBOVUxMKTsKKyAgCisgIHJlZ2lzdHJ5ID0gYnVzX2Nvbm5lY3Rpb25fZ2V0X3JlZ2lzdHJ5IChjb25uZWN0aW9uKTsKKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnN0ciwgc2VydmljZV9uYW1lKTsKKyAgc2VydmljZSA9IGJ1c19yZWdpc3RyeV9sb29rdXAgKHJlZ2lzdHJ5LCAmc3RyKTsKKworICBpZiAoc2VydmljZSA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsgLyogU2VydmljZSBkb2Vzbid0IGV4aXN0IHNvIGNvbm5lY3Rpb24gY2FuJ3Qgb3duIGl0LiAqLworCisgIHJldHVybiBidXNfc2VydmljZV9nZXRfcHJpbWFyeV9vd25lcnNfY29ubmVjdGlvbiAoc2VydmljZSkgPT0gY29ubmVjdGlvbjsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitzdHJfaGFzX3ByZWZpeCAoY29uc3QgY2hhciAqc3RyLCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisgIHNpemVfdCBwcmVmaXhfbGVuOworICBwcmVmaXhfbGVuID0gc3RybGVuIChwcmVmaXgpOworICBpZiAoc3RybmNtcCAoc3RyLCBwcmVmaXgsIHByZWZpeF9sZW4pID09IDApCisgICAgcmV0dXJuIFRSVUU7CisgIGVsc2UKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorbWF0Y2hfcnVsZV9tYXRjaGVzIChCdXNNYXRjaFJ1bGUgICAgKnJ1bGUsCisgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICAqc2VuZGVyLAorICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAgKmFkZHJlc3NlZF9yZWNpcGllbnQsCisgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgQnVzTWF0Y2hGbGFncyAgICBhbHJlYWR5X21hdGNoZWQpCit7CisgIGRidXNfYm9vbF90IHdhbnRzX3RvX2VhdmVzZHJvcCA9IEZBTFNFOworICBpbnQgZmxhZ3M7CisKKyAgLyogQWxsIGZlYXR1cmVzIG9mIHRoZSBtYXRjaCBydWxlIGFyZSBBTkQnZCB0b2dldGhlciwKKyAgICogc28gRkFMU0UgaWYgYW55IG9mIHRoZW0gZG9uJ3QgbWF0Y2guCisgICAqLworCisgIC8qIHNlbmRlci9hZGRyZXNzZWRfcmVjaXBpZW50IG9mICNOVUxMIG1heSBtZWFuIGJ1cyBkcml2ZXIsCisgICAqIG9yIGZvciBhZGRyZXNzZWRfcmVjaXBpZW50IG1heSBtZWFuIGEgbWVzc2FnZSB3aXRoIG5vCisgICAqIHNwZWNpZmljIHJlY2lwaWVudCAoaS5lLiBhIHNpZ25hbCkKKyAgICovCisKKyAgLyogRG9uJ3QgYm90aGVyIHJlLW1hdGNoaW5nIGZlYXR1cmVzIHdlJ3ZlIGFscmVhZHkgY2hlY2tlZCBpbXBsaWNpdGx5LiAqLworICBmbGFncyA9IHJ1bGUtPmZsYWdzICYgKH5hbHJlYWR5X21hdGNoZWQpOworCisgIGlmIChmbGFncyAmIEJVU19NQVRDSF9DTElFTlRfSVNfRUFWRVNEUk9QUElORykKKyAgICB3YW50c190b19lYXZlc2Ryb3AgPSBUUlVFOworCisgIGlmIChmbGFncyAmIEJVU19NQVRDSF9NRVNTQUdFX1RZUEUpCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5tZXNzYWdlX3R5cGUgIT0gREJVU19NRVNTQUdFX1RZUEVfSU5WQUxJRCk7CisKKyAgICAgIGlmIChydWxlLT5tZXNzYWdlX3R5cGUgIT0gZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoZmxhZ3MgJiBCVVNfTUFUQ0hfSU5URVJGQUNFKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKmlmYWNlOworCisgICAgICBfZGJ1c19hc3NlcnQgKHJ1bGUtPmludGVyZmFjZSAhPSBOVUxMKTsKKworICAgICAgaWZhY2UgPSBkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAobWVzc2FnZSk7CisgICAgICBpZiAoaWZhY2UgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICBpZiAoc3RyY21wIChpZmFjZSwgcnVsZS0+aW50ZXJmYWNlKSAhPSAwKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmIChmbGFncyAmIEJVU19NQVRDSF9NRU1CRVIpCisgICAgeworICAgICAgY29uc3QgY2hhciAqbWVtYmVyOworCisgICAgICBfZGJ1c19hc3NlcnQgKHJ1bGUtPm1lbWJlciAhPSBOVUxMKTsKKworICAgICAgbWVtYmVyID0gZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKG1lc3NhZ2UpOworICAgICAgaWYgKG1lbWJlciA9PSBOVUxMKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIGlmIChzdHJjbXAgKG1lbWJlciwgcnVsZS0+bWVtYmVyKSAhPSAwKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmIChmbGFncyAmIEJVU19NQVRDSF9TRU5ERVIpCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5zZW5kZXIgIT0gTlVMTCk7CisKKyAgICAgIGlmIChzZW5kZXIgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGlmIChzdHJjbXAgKHJ1bGUtPnNlbmRlciwKKyAgICAgICAgICAgICAgICAgICAgICBEQlVTX1NFUlZJQ0VfREJVUykgIT0gMCkKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgaWYgKCFjb25uZWN0aW9uX2lzX3ByaW1hcnlfb3duZXIgKHNlbmRlciwgcnVsZS0+c2VuZGVyKSkKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAvKiBOb3RlOiB0aGlzIHBhcnQgaXMgcmVsZXZhbnQgZm9yIGVhdmVzZHJvcHBlciBydWxlczoKKyAgICogVHdvIGNhc2VzOgorICAgKiAxKSBydWxlIGhhcyBhIGRlc3RpbmF0aW9uIHRvIGJlIG1hdGNoZWQKKyAgICogICAoZmxhZyBCVVNfTUFUQ0hfREVTVElOQVRJT04gcHJlc2VudCkuIFJ1bGUgd2lsbCBtYXRjaCBpZjoKKyAgICogICAtIHJ1bGUtPmRlc3RpbmF0aW9uIG1hdGNoZXMgdGhlIGFkZHJlc3NlZF9yZWNpcGllbnQKKyAgICogICBBTkQKKyAgICogICAtIHdhbnRzX3RvX2VhdmVzZHJvcD1UUlVFCisgICAqCisgICAqICAgTm90ZTogKHRoZSBjYXNlIGluIHdoaWNoIGFkZHJlc3NlZF9yZWNpcGllbnQgaXMgdGhlIGFjdHVhbCBydWxlIG93bmVyCisgICAqICAgaXMgaGFuZGxlZCBlbHNld2VyZSBpbiBkaXNwYXRjaC5jOmJ1c19kaXNwYXRjaF9tYXRjaGVzKCkuCisgICAqCisgICAqIDIpIHJ1bGUgaGFzIG5vIGRlc3RpbmF0aW9uLiBSdWxlIHdpbGwgbWF0Y2ggaWY6CisgICAqICAgIC0gbWVzc2FnZSBoYXMgbm8gc3BlY2lmaWVkIGRlc3RpbmF0aW9uIChpZSBicm9hZGNhc3RzKQorICAgKiAgICAgIChOb3RlOiB0aGlzIHdpbGwgcnVsZSBvdXQgdW5pY2FzdCBtZXRob2QgY2FsbHMgYW5kIHVuaWNhc3Qgc2lnbmFscywKKyAgICogICAgICBmaXhpbmcgRkRPIzI2OTc0OCkKKyAgICogICAgT1IKKyAgICogICAgLSB3YW50c190b19lYXZlc2Ryb3A9VFJVRSAoZGVzdGluYXRpb24tY2F0Y2gtYWxsIHNpdHVhdGlvbikKKyAgICovCisgIGlmIChmbGFncyAmIEJVU19NQVRDSF9ERVNUSU5BVElPTikKKyAgICB7CisgICAgICBjb25zdCBjaGFyICpkZXN0aW5hdGlvbjsKKworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5kZXN0aW5hdGlvbiAhPSBOVUxMKTsKKworICAgICAgZGVzdGluYXRpb24gPSBkYnVzX21lc3NhZ2VfZ2V0X2Rlc3RpbmF0aW9uIChtZXNzYWdlKTsKKyAgICAgIGlmIChkZXN0aW5hdGlvbiA9PSBOVUxMKQorICAgICAgICAvKiBicm9hZGNhc3QsIGJ1dCB0aGlzIHJ1bGUgc3BlY2lmaWVkIGEgZGVzdGluYXRpb246IG5vIG1hdGNoICovCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgLyogcnVsZSBvd25lciBkb2VzIG5vdCBpbnRlbmQgdG8gZWF2ZXNkcm9wOiB3ZSdsbCBkZWxpdmVyIG9ubHkgbXNncworICAgICAgICogZGlyZWN0ZWQgdG8gaXQsIE5PVCBNQVRDSElORyAqLworICAgICAgaWYgKCF3YW50c190b19lYXZlc2Ryb3ApCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgaWYgKGFkZHJlc3NlZF9yZWNpcGllbnQgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIC8qIElmIHRoZSBtZXNzYWdlIGlzIGdvaW5nIHRvIGJlIGRlbGl2ZXJlZCB0byB0aGUgZGJ1cy1kYWVtb24KKyAgICAgICAgICAgKiBpdHNlbGYsIGl0cyBkZXN0aW5hdGlvbiB3aWxsIGJlICJvcmcuZnJlZWRlc2t0b3AuREJ1cyIsCisgICAgICAgICAgICogd2hpY2ggd2UgYWdhaW4gbWF0Y2ggYWdhaW5zdCB0aGUgcnVsZSAoc2VlIGJ1c19kaXNwYXRjaCgpCisgICAgICAgICAgICogaW4gYnVzL2Rpc3BhdGNoLmMsIHdoaWNoIGNoZWNrcyBmb3Igby5mZC5EQnVzIGZpcnN0KS4KKyAgICAgICAgICAgKgorICAgICAgICAgICAqIElmIHdlIGFyZSBtb25pdG9yaW5nIGFuZCB3ZSBkb24ndCBrbm93IHdobyBpcyBnb2luZyB0byByZWNlaXZlCisgICAgICAgICAgICogdGhlIG1lc3NhZ2UgKGZvciBpbnN0YW5jZSBiZWNhdXNlIHRoZXkgaGF2ZW4ndCBiZWVuIGFjdGl2YXRlZCB5ZXQpLAorICAgICAgICAgICAqIGFzc3VtZSB0aGV5IHdpbGwgb3duIHRoZSByZXF1ZXN0ZWQgZGVzdGluYXRpb24gbmFtZSBhbmQgbm8gb3RoZXIsCisgICAgICAgICAgICogYW5kIG1hdGNoIHRoZSBydWxlJ3MgZGVzdGluYXRpb24gYWdhaW5zdCB0aGF0LgorICAgICAgICAgICAqLworICAgICAgICAgIGlmIChzdHJjbXAgKHJ1bGUtPmRlc3RpbmF0aW9uLCBkZXN0aW5hdGlvbikgIT0gMCkKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgaWYgKCFjb25uZWN0aW9uX2lzX3ByaW1hcnlfb3duZXIgKGFkZHJlc3NlZF9yZWNpcGllbnQsIHJ1bGUtPmRlc3RpbmF0aW9uKSkKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7IC8qIG5vIGRlc3RpbmF0aW9uIGluIHJ1bGUgKi8KKyAgICAgICAgZGJ1c19ib29sX3QgbXNnX2lzX2Jyb2FkY2FzdDsKKworICAgICAgICBfZGJ1c19hc3NlcnQgKHJ1bGUtPmRlc3RpbmF0aW9uID09IE5VTEwpOworCisgICAgICAgIG1zZ19pc19icm9hZGNhc3QgPSAoZGJ1c19tZXNzYWdlX2dldF9kZXN0aW5hdGlvbiAobWVzc2FnZSkgPT0gTlVMTCk7CisKKyAgICAgICAgaWYgKCF3YW50c190b19lYXZlc2Ryb3AgJiYgIW1zZ19pc19icm9hZGNhc3QpCisgICAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICAgIC8qIGlmIHdlIGFyZSBoZXJlIHJ1bGUgb3duZXIgaW50ZW5kcyB0byBlYXZlc2Ryb3AKKyAgICAgICAgICogT1IKKyAgICAgICAgICogbWVzc2FnZSBpcyBiZWluZyBicm9hZGNhc3RlZCAqLworICAgIH0KKworICBpZiAoZmxhZ3MgJiBCVVNfTUFUQ0hfUEFUSCkKKyAgICB7CisgICAgICBjb25zdCBjaGFyICpwYXRoOworCisgICAgICBfZGJ1c19hc3NlcnQgKHJ1bGUtPnBhdGggIT0gTlVMTCk7CisKKyAgICAgIHBhdGggPSBkYnVzX21lc3NhZ2VfZ2V0X3BhdGggKG1lc3NhZ2UpOworICAgICAgaWYgKHBhdGggPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICBpZiAoc3RyY21wIChwYXRoLCBydWxlLT5wYXRoKSAhPSAwKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmIChmbGFncyAmIEJVU19NQVRDSF9QQVRIX05BTUVTUEFDRSkKKyAgICB7CisgICAgICBjb25zdCBjaGFyICpwYXRoOworICAgICAgaW50IGxlbjsKKworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5wYXRoICE9IE5VTEwpOworCisgICAgICBwYXRoID0gZGJ1c19tZXNzYWdlX2dldF9wYXRoIChtZXNzYWdlKTsKKyAgICAgIGlmIChwYXRoID09IE5VTEwpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgaWYgKCFzdHJfaGFzX3ByZWZpeCAocGF0aCwgcnVsZS0+cGF0aCkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgbGVuID0gc3RybGVuIChydWxlLT5wYXRoKTsKKworICAgICAgLyogQ2hlY2sgdGhhdCB0aGUgYWN0dWFsIGFyZ3VtZW50IGlzIHdpdGhpbiB0aGUgZXhwZWN0ZWQKKyAgICAgICAqIG5hbWVzcGFjZSwgcmF0aGVyIHRoYW4ganVzdCBzdGFydGluZyB3aXRoIHRoYXQgc3RyaW5nLAorICAgICAgICogYnkgY2hlY2tpbmcgdGhhdCB0aGUgbWF0Y2hlZCBwcmVmaXggaXMgZm9sbG93ZWQgYnkgYSAnLycKKyAgICAgICAqIG9yIHRoZSBlbmQgb2YgdGhlIHBhdGguCisgICAgICAgKgorICAgICAgICogU3BlY2lhbCBjYXNlOiB0aGUgb25seSB2YWxpZCBwYXRoIG9mIGxlbmd0aCAxLCAiLyIsCisgICAgICAgKiBtYXRjaGVzIGV2ZXJ5dGhpbmcuCisgICAgICAgKi8KKyAgICAgIGlmIChsZW4gPiAxICYmIHBhdGhbbGVuXSAhPSAnXDAnICYmIHBhdGhbbGVuXSAhPSAnLycpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKGZsYWdzICYgQlVTX01BVENIX0FSR1MpCisgICAgeworICAgICAgaW50IGk7CisgICAgICBEQnVzTWVzc2FnZUl0ZXIgaXRlcjsKKyAgICAgIAorICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5hcmdzICE9IE5VTEwpOworCisgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9pbml0IChtZXNzYWdlLCAmaXRlcik7CisgICAgICAKKyAgICAgIGkgPSAwOworICAgICAgd2hpbGUgKGkgPCBydWxlLT5hcmdzX2xlbikKKyAgICAgICAgeworICAgICAgICAgIGludCBjdXJyZW50X3R5cGU7CisgICAgICAgICAgY29uc3QgY2hhciAqZXhwZWN0ZWRfYXJnOworICAgICAgICAgIGludCBleHBlY3RlZF9sZW5ndGg7CisgICAgICAgICAgZGJ1c19ib29sX3QgaXNfcGF0aCwgaXNfbmFtZXNwYWNlOworCisgICAgICAgICAgZXhwZWN0ZWRfYXJnID0gcnVsZS0+YXJnc1tpXTsKKyAgICAgICAgICBleHBlY3RlZF9sZW5ndGggPSBydWxlLT5hcmdfbGVuc1tpXSAmIH5CVVNfTUFUQ0hfQVJHX0ZMQUdTOworICAgICAgICAgIGlzX3BhdGggPSAocnVsZS0+YXJnX2xlbnNbaV0gJiBCVVNfTUFUQ0hfQVJHX0lTX1BBVEgpICE9IDA7CisgICAgICAgICAgaXNfbmFtZXNwYWNlID0gKHJ1bGUtPmFyZ19sZW5zW2ldICYgQlVTX01BVENIX0FSR19OQU1FU1BBQ0UpICE9IDA7CisgICAgICAgICAgCisgICAgICAgICAgY3VycmVudF90eXBlID0gZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2FyZ190eXBlICgmaXRlcik7CisKKyAgICAgICAgICBpZiAoZXhwZWN0ZWRfYXJnICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFjdHVhbF9hcmc7CisgICAgICAgICAgICAgIGludCBhY3R1YWxfbGVuZ3RoOworCisgICAgICAgICAgICAgIGlmIChjdXJyZW50X3R5cGUgIT0gREJVU19UWVBFX1NUUklORyAmJgorICAgICAgICAgICAgICAgICAgKCFpc19wYXRoIHx8IGN1cnJlbnRfdHlwZSAhPSBEQlVTX1RZUEVfT0JKRUNUX1BBVEgpKQorICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgICAgICAgICBhY3R1YWxfYXJnID0gTlVMTDsKKyAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2Jhc2ljICgmaXRlciwgJmFjdHVhbF9hcmcpOworICAgICAgICAgICAgICBfZGJ1c19hc3NlcnQgKGFjdHVhbF9hcmcgIT0gTlVMTCk7CisKKyAgICAgICAgICAgICAgYWN0dWFsX2xlbmd0aCA9IHN0cmxlbiAoYWN0dWFsX2FyZyk7CisKKyAgICAgICAgICAgICAgaWYgKGlzX3BhdGgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgaWYgKGFjdHVhbF9sZW5ndGggPCBleHBlY3RlZF9sZW5ndGggJiYKKyAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxfYXJnW2FjdHVhbF9sZW5ndGggLSAxXSAhPSAnLycpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgICAgICAgICAgICAgaWYgKGV4cGVjdGVkX2xlbmd0aCA8IGFjdHVhbF9sZW5ndGggJiYKKyAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZF9hcmdbZXhwZWN0ZWRfbGVuZ3RoIC0gMV0gIT0gJy8nKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgICAgICAgICAgICAgIGlmIChtZW1jbXAgKGFjdHVhbF9hcmcsIGV4cGVjdGVkX2FyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1JTiAoYWN0dWFsX2xlbmd0aCwgZXhwZWN0ZWRfbGVuZ3RoKSkgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZSBpZiAoaXNfbmFtZXNwYWNlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGlmIChleHBlY3RlZF9sZW5ndGggPiBhY3R1YWxfbGVuZ3RoKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgICAgICAgICAgICAgIC8qIElmIHRoZSBhY3R1YWwgYXJndW1lbnQgZG9lc24ndCBzdGFydCB3aXRoIHRoZSBleHBlY3RlZAorICAgICAgICAgICAgICAgICAgICogbmFtZXNwYWNlLCB0aGVuIHdlIGRvbid0IG1hdGNoLgorICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICBpZiAobWVtY21wIChleHBlY3RlZF9hcmcsIGFjdHVhbF9hcmcsIGV4cGVjdGVkX2xlbmd0aCkgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICAgICAgICAgICAgICBpZiAoZXhwZWN0ZWRfbGVuZ3RoIDwgYWN0dWFsX2xlbmd0aCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgIC8qIENoZWNrIHRoYXQgdGhlIGFjdHVhbCBhcmd1bWVudCBpcyB3aXRoaW4gdGhlIGV4cGVjdGVkCisgICAgICAgICAgICAgICAgICAgICAgICogbmFtZXNwYWNlLCByYXRoZXIgdGhhbiBqdXN0IHN0YXJ0aW5nIHdpdGggdGhhdCBzdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICogYnkgY2hlY2tpbmcgdGhhdCB0aGUgbWF0Y2hlZCBwcmVmaXggZW5kcyBpbiBhICcuJy4KKyAgICAgICAgICAgICAgICAgICAgICAgKgorICAgICAgICAgICAgICAgICAgICAgICAqIFRoaXMgZG9lc24ndCBzdG9wICJmb28uYmFyLiIgbWF0Y2hpbmcgImZvby5iYXIuLmJheiIKKyAgICAgICAgICAgICAgICAgICAgICAgKiB3aGljaCBpcyBhbiBpbnZhbGlkIG5hbWVzcGFjZSwgYnV0IGF0IHNvbWUgcG9pbnQgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICogZGFlbW9uIGNhbid0IGNvdmVyIHVwIGZvciBicm9rZW4gc2VydmljZXMuCisgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdHVhbF9hcmdbZXhwZWN0ZWRfbGVuZ3RoXSAhPSAnLicpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIC8qIG90aGVyd2lzZSB3ZSBoYWQgYW4gZXhhY3QgbWF0Y2guICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgaWYgKGV4cGVjdGVkX2xlbmd0aCAhPSBhY3R1YWxfbGVuZ3RoIHx8CisgICAgICAgICAgICAgICAgICAgICAgbWVtY21wIChleHBlY3RlZF9hcmcsIGFjdHVhbF9hcmcsIGV4cGVjdGVkX2xlbmd0aCkgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorICAgICAgICAgIAorICAgICAgICAgIGlmIChjdXJyZW50X3R5cGUgIT0gREJVU19UWVBFX0lOVkFMSUQpCisgICAgICAgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9uZXh0ICgmaXRlcik7CisKKyAgICAgICAgICArK2k7CisgICAgICAgIH0KKyAgICB9CisgIAorICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitnZXRfcmVjaXBpZW50c19mcm9tX2xpc3QgKERCdXNMaXN0ICAgICAgICoqcnVsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICAqc2VuZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAgKmFkZHJlc3NlZF9yZWNpcGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICAgICAgKipyZWNpcGllbnRzX3ApCit7CisgIERCdXNMaXN0ICpsaW5rOworCisgIGlmIChydWxlcyA9PSBOVUxMKQorICAgIHJldHVybiBUUlVFOworCisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rIChydWxlcyk7CisgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgeworICAgICAgQnVzTWF0Y2hSdWxlICpydWxlOworCisgICAgICBydWxlID0gbGluay0+ZGF0YTsKKworI2lmZGVmIERCVVNfRU5BQkxFX1ZFUkJPU0VfTU9ERQorICAgICAgeworICAgICAgICBjaGFyICpzID0gbWF0Y2hfcnVsZV90b19zdHJpbmcgKHJ1bGUpOworCisgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJDaGVja2luZyB3aGV0aGVyIG1lc3NhZ2UgbWF0Y2hlcyBydWxlICVzIGZvciBjb25uZWN0aW9uICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBzID8gcyA6ICJub21lbSIsIHJ1bGUtPm1hdGNoZXNfZ29fdG8pOworICAgICAgICBkYnVzX2ZyZWUgKHMpOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIGlmIChtYXRjaF9ydWxlX21hdGNoZXMgKHJ1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kZXIsIGFkZHJlc3NlZF9yZWNpcGllbnQsIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVVNfTUFUQ0hfTUVTU0FHRV9UWVBFIHwgQlVTX01BVENIX0lOVEVSRkFDRSkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiUnVsZSBtYXRjaGVkXG4iKTsKKworICAgICAgICAgIC8qIEFwcGVuZCB0byB0aGUgbGlzdCBpZiB3ZSBoYXZlbid0IGFscmVhZHkgKi8KKyAgICAgICAgICBpZiAoYnVzX2Nvbm5lY3Rpb25fbWFya19zdGFtcCAocnVsZS0+bWF0Y2hlc19nb190bykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmICghX2RidXNfbGlzdF9hcHBlbmQgKHJlY2lwaWVudHNfcCwgcnVsZS0+bWF0Y2hlc19nb190bykpCisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkNvbm5lY3Rpb24gYWxyZWFkeSByZWNlaXZpbmcgdGhpcyBtZXNzYWdlLCBzbyBub3QgYWRkaW5nIGFnYWluXG4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rIChydWxlcywgbGluayk7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCitkYnVzX2Jvb2xfdAorYnVzX21hdGNobWFrZXJfZ2V0X3JlY2lwaWVudHMgKEJ1c01hdGNobWFrZXIgICAqbWF0Y2htYWtlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNDb25uZWN0aW9ucyAgKmNvbm5lY3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICAqc2VuZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICAqYWRkcmVzc2VkX3JlY2lwaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICAgICAgKipyZWNpcGllbnRzX3ApCit7CisgIGludCB0eXBlOworICBjb25zdCBjaGFyICppbnRlcmZhY2U7CisgIERCdXNMaXN0ICoqbmVpdGhlciwgKipqdXN0X3R5cGUsICoqanVzdF9pZmFjZSwgKipib3RoOworCisgIF9kYnVzX2Fzc2VydCAoKnJlY2lwaWVudHNfcCA9PSBOVUxMKTsKKworICAvKiBUaGlzIGF2b2lkcyBzZW5kaW5nIHNhbWUgbWVzc2FnZSB0byB0aGUgc2FtZSBjb25uZWN0aW9uIHR3aWNlLgorICAgKiBQdXJwb3NlIG9mIHRoZSBzdGFtcCBpbnN0ZWFkIG9mIGEgYm9vbCBpcyB0byBhdm9pZCBpdGVyYXRpbmcgb3ZlcgorICAgKiBhbGwgY29ubmVjdGlvbnMgcmVzZXR0aW5nIHRoZSBib29sIGVhY2ggdGltZS4KKyAgICovCisgIGJ1c19jb25uZWN0aW9uc19pbmNyZW1lbnRfc3RhbXAgKGNvbm5lY3Rpb25zKTsKKworICAvKiBhZGRyZXNzZWRfcmVjaXBpZW50IGlzIGFscmVhZHkgcmVjZWl2aW5nIHRoZSBtZXNzYWdlLCBkb24ndCBhZGQgdG8gbGlzdC4KKyAgICogTlVMTCBhZGRyZXNzZWRfcmVjaXBpZW50IG1lYW5zIGVpdGhlciBidXMgZHJpdmVyLCBvciB0aGlzIGlzIGEgc2lnbmFsCisgICAqIGFuZCB0aHVzIGxhY2tzIGEgc3BlY2lmaWMgYWRkcmVzc2VkX3JlY2lwaWVudC4KKyAgICovCisgIGlmIChhZGRyZXNzZWRfcmVjaXBpZW50ICE9IE5VTEwpCisgICAgYnVzX2Nvbm5lY3Rpb25fbWFya19zdGFtcCAoYWRkcmVzc2VkX3JlY2lwaWVudCk7CisKKyAgdHlwZSA9IGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSk7CisgIGludGVyZmFjZSA9IGRidXNfbWVzc2FnZV9nZXRfaW50ZXJmYWNlIChtZXNzYWdlKTsKKworICBuZWl0aGVyID0gYnVzX21hdGNobWFrZXJfZ2V0X3J1bGVzIChtYXRjaG1ha2VyLCBEQlVTX01FU1NBR0VfVFlQRV9JTlZBTElELAorICAgICAgTlVMTCwgRkFMU0UpOworICBqdXN0X3R5cGUgPSBqdXN0X2lmYWNlID0gYm90aCA9IE5VTEw7CisKKyAgaWYgKGludGVyZmFjZSAhPSBOVUxMKQorICAgIGp1c3RfaWZhY2UgPSBidXNfbWF0Y2htYWtlcl9nZXRfcnVsZXMgKG1hdGNobWFrZXIsCisgICAgICAgIERCVVNfTUVTU0FHRV9UWVBFX0lOVkFMSUQsIGludGVyZmFjZSwgRkFMU0UpOworCisgIGlmICh0eXBlID4gREJVU19NRVNTQUdFX1RZUEVfSU5WQUxJRCAmJiB0eXBlIDwgREJVU19OVU1fTUVTU0FHRV9UWVBFUykKKyAgICB7CisgICAgICBqdXN0X3R5cGUgPSBidXNfbWF0Y2htYWtlcl9nZXRfcnVsZXMgKG1hdGNobWFrZXIsIHR5cGUsIE5VTEwsIEZBTFNFKTsKKworICAgICAgaWYgKGludGVyZmFjZSAhPSBOVUxMKQorICAgICAgICBib3RoID0gYnVzX21hdGNobWFrZXJfZ2V0X3J1bGVzIChtYXRjaG1ha2VyLCB0eXBlLCBpbnRlcmZhY2UsIEZBTFNFKTsKKyAgICB9CisKKyAgaWYgKCEoZ2V0X3JlY2lwaWVudHNfZnJvbV9saXN0IChuZWl0aGVyLCBzZW5kZXIsIGFkZHJlc3NlZF9yZWNpcGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwgcmVjaXBpZW50c19wKSAmJgorICAgICAgICBnZXRfcmVjaXBpZW50c19mcm9tX2xpc3QgKGp1c3RfaWZhY2UsIHNlbmRlciwgYWRkcmVzc2VkX3JlY2lwaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLCByZWNpcGllbnRzX3ApICYmCisgICAgICAgIGdldF9yZWNpcGllbnRzX2Zyb21fbGlzdCAoanVzdF90eXBlLCBzZW5kZXIsIGFkZHJlc3NlZF9yZWNpcGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwgcmVjaXBpZW50c19wKSAmJgorICAgICAgICBnZXRfcmVjaXBpZW50c19mcm9tX2xpc3QgKGJvdGgsIHNlbmRlciwgYWRkcmVzc2VkX3JlY2lwaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLCByZWNpcGllbnRzX3ApKSkKKyAgICB7CisgICAgICBfZGJ1c19saXN0X2NsZWFyIChyZWNpcGllbnRzX3ApOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworI2lmZGVmIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTCisjaW5jbHVkZSAidGVzdC5oIgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCitzdGF0aWMgQnVzTWF0Y2hSdWxlKgorY2hlY2tfcGFyc2UgKGRidXNfYm9vbF90IHNob3VsZF9zdWNjZWVkLAorICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRleHQpCit7CisgIEJ1c01hdGNoUnVsZSAqcnVsZTsKKyAgREJ1c1N0cmluZyBzdHI7CisgIERCdXNFcnJvciBlcnJvcjsKKworICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZzdHIsIHRleHQpOworICAKKyAgcnVsZSA9IGJ1c19tYXRjaF9ydWxlX3BhcnNlIChOVUxMLCAmc3RyLCAmZXJyb3IpOworICBpZiAoZGJ1c19lcnJvcl9oYXNfbmFtZSAoJmVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSkpCisgICAgeworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIGlmIChzaG91bGRfc3VjY2VlZCAmJiBydWxlID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkZhaWxlZCB0byBwYXJzZTogJXM6ICVzOiBcIiVzXCIiLAorICAgICAgICAgICAgICAgICAgZXJyb3IubmFtZSwgZXJyb3IubWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJnN0cikpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIGlmICghc2hvdWxkX3N1Y2NlZWQgJiYgcnVsZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJGYWlsZWQgdG8gZmFpbCB0byBwYXJzZTogXCIlc1wiIiwKKyAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJnN0cikpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKworICByZXR1cm4gcnVsZTsKK30KKworc3RhdGljIHZvaWQKK2Fzc2VydF9sYXJnZV9ydWxlIChCdXNNYXRjaFJ1bGUgKnJ1bGUpCit7CisgIF9kYnVzX2Fzc2VydCAocnVsZS0+ZmxhZ3MgJiBCVVNfTUFUQ0hfTUVTU0FHRV9UWVBFKTsKKyAgX2RidXNfYXNzZXJ0IChydWxlLT5mbGFncyAmIEJVU19NQVRDSF9TRU5ERVIpOworICBfZGJ1c19hc3NlcnQgKHJ1bGUtPmZsYWdzICYgQlVTX01BVENIX0lOVEVSRkFDRSk7CisgIF9kYnVzX2Fzc2VydCAocnVsZS0+ZmxhZ3MgJiBCVVNfTUFUQ0hfTUVNQkVSKTsKKyAgX2RidXNfYXNzZXJ0IChydWxlLT5mbGFncyAmIEJVU19NQVRDSF9ERVNUSU5BVElPTik7CisgIF9kYnVzX2Fzc2VydCAocnVsZS0+ZmxhZ3MgJiBCVVNfTUFUQ0hfUEFUSCk7CisKKyAgX2RidXNfYXNzZXJ0IChydWxlLT5tZXNzYWdlX3R5cGUgPT0gREJVU19NRVNTQUdFX1RZUEVfU0lHTkFMKTsKKyAgX2RidXNfYXNzZXJ0IChydWxlLT5pbnRlcmZhY2UgIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAocnVsZS0+bWVtYmVyICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKHJ1bGUtPnNlbmRlciAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChydWxlLT5kZXN0aW5hdGlvbiAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChydWxlLT5wYXRoICE9IE5VTEwpOworCisgIF9kYnVzX2Fzc2VydCAoc3RyY21wIChydWxlLT5pbnRlcmZhY2UsICJvcmcuZnJlZWRlc2t0b3AuREJ1c0ludGVyZmFjZSIpID09IDApOworICBfZGJ1c19hc3NlcnQgKHN0cmNtcCAocnVsZS0+c2VuZGVyLCAib3JnLmZyZWVkZXNrdG9wLkRCdXNTZW5kZXIiKSA9PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChzdHJjbXAgKHJ1bGUtPm1lbWJlciwgIkZvbyIpID09IDApOworICBfZGJ1c19hc3NlcnQgKHN0cmNtcCAocnVsZS0+cGF0aCwgIi9iYXIvZm9vIikgPT0gMCk7CisgIF9kYnVzX2Fzc2VydCAoc3RyY21wIChydWxlLT5kZXN0aW5hdGlvbiwgIjo0NTIzNDUuMzQiKSA9PSAwKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90Cit0ZXN0X3BhcnNpbmcgKHZvaWQgKmRhdGEpCit7CisgIEJ1c01hdGNoUnVsZSAqcnVsZTsKKworICBydWxlID0gY2hlY2tfcGFyc2UgKFRSVUUsICJ0eXBlPSdzaWduYWwnLHNlbmRlcj0nb3JnLmZyZWVkZXNrdG9wLkRCdXNTZW5kZXInLGludGVyZmFjZT0nb3JnLmZyZWVkZXNrdG9wLkRCdXNJbnRlcmZhY2UnLG1lbWJlcj0nRm9vJyxwYXRoPScvYmFyL2ZvbycsZGVzdGluYXRpb249Jzo0NTIzNDUuMzQnIik7CisgIGlmIChydWxlICE9IE5VTEwpCisgICAgeworICAgICAgYXNzZXJ0X2xhcmdlX3J1bGUgKHJ1bGUpOworICAgICAgYnVzX21hdGNoX3J1bGVfdW5yZWYgKHJ1bGUpOworICAgIH0KKworICAvKiBXaXRoIGV4dHJhIHdoaXRlc3BhY2UgYW5kIHVzZWxlc3MgcXVvdGVzICovCisgIHJ1bGUgPSBjaGVja19wYXJzZSAoVFJVRSwgIiAgICB0eXBlPSdzaWduYWwnLCAgXHRzZW5kZXI9J29yZy5mcmVlZGVzJydrdG9wLkRCdXNTZW5kZXInLCAgIGludGVyZmFjZT0nb3JnLmZyZWVkZXNrdG9wLkRCdXNJbnRlcmZhY2UnJycnJywgXHRtZW1iZXI9J0ZvbycscGF0aD0nL2Jhci9mb28nLGRlc3RpbmF0aW9uPSc6NDUyMzQ1LjM0JycnJyciKTsKKyAgaWYgKHJ1bGUgIT0gTlVMTCkKKyAgICB7CisgICAgICBhc3NlcnRfbGFyZ2VfcnVsZSAocnVsZSk7CisgICAgICBidXNfbWF0Y2hfcnVsZV91bnJlZiAocnVsZSk7CisgICAgfQorCisKKyAgLyogQSBzaW1wbGUgc2lnbmFsIGNvbm5lY3Rpb24gKi8KKyAgcnVsZSA9IGNoZWNrX3BhcnNlIChUUlVFLCAidHlwZT0nc2lnbmFsJyxwYXRoPScvZm9vJyxpbnRlcmZhY2U9J29yZy5CYXInIik7CisgIGlmIChydWxlICE9IE5VTEwpCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5mbGFncyAmIEJVU19NQVRDSF9NRVNTQUdFX1RZUEUpOworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5mbGFncyAmIEJVU19NQVRDSF9JTlRFUkZBQ0UpOworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5mbGFncyAmIEJVU19NQVRDSF9QQVRIKTsKKworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5tZXNzYWdlX3R5cGUgPT0gREJVU19NRVNTQUdFX1RZUEVfU0lHTkFMKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAocnVsZS0+aW50ZXJmYWNlICE9IE5VTEwpOworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5wYXRoICE9IE5VTEwpOworCisgICAgICBfZGJ1c19hc3NlcnQgKHN0cmNtcCAocnVsZS0+aW50ZXJmYWNlLCAib3JnLkJhciIpID09IDApOworICAgICAgX2RidXNfYXNzZXJ0IChzdHJjbXAgKHJ1bGUtPnBhdGgsICIvZm9vIikgPT0gMCk7CisgIAorICAgICAgYnVzX21hdGNoX3J1bGVfdW5yZWYgKHJ1bGUpOworICAgIH0KKworICAvKiBhcmdOICovCisgIHJ1bGUgPSBjaGVja19wYXJzZSAoVFJVRSwgImFyZzA9J2ZvbyciKTsKKyAgaWYgKHJ1bGUgIT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c19hc3NlcnQgKHJ1bGUtPmZsYWdzID09IEJVU19NQVRDSF9BUkdTKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAocnVsZS0+YXJncyAhPSBOVUxMKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAocnVsZS0+YXJnc19sZW4gPT0gMSk7CisgICAgICBfZGJ1c19hc3NlcnQgKHJ1bGUtPmFyZ3NbMF0gIT0gTlVMTCk7CisgICAgICBfZGJ1c19hc3NlcnQgKHJ1bGUtPmFyZ3NbMV0gPT0gTlVMTCk7CisgICAgICBfZGJ1c19hc3NlcnQgKHN0cmNtcCAocnVsZS0+YXJnc1swXSwgImZvbyIpID09IDApOworCisgICAgICBidXNfbWF0Y2hfcnVsZV91bnJlZiAocnVsZSk7CisgICAgfQorICAKKyAgcnVsZSA9IGNoZWNrX3BhcnNlIChUUlVFLCAiYXJnMT0nZm9vJyIpOworICBpZiAocnVsZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydCAocnVsZS0+ZmxhZ3MgPT0gQlVTX01BVENIX0FSR1MpOworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5hcmdzICE9IE5VTEwpOworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5hcmdzX2xlbiA9PSAyKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAocnVsZS0+YXJnc1swXSA9PSBOVUxMKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAocnVsZS0+YXJnc1sxXSAhPSBOVUxMKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAocnVsZS0+YXJnc1syXSA9PSBOVUxMKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoc3RyY21wIChydWxlLT5hcmdzWzFdLCAiZm9vIikgPT0gMCk7CisKKyAgICAgIGJ1c19tYXRjaF9ydWxlX3VucmVmIChydWxlKTsKKyAgICB9CisKKyAgcnVsZSA9IGNoZWNrX3BhcnNlIChUUlVFLCAiYXJnMj0nZm9vJyIpOworICBpZiAocnVsZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydCAocnVsZS0+ZmxhZ3MgPT0gQlVTX01BVENIX0FSR1MpOworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5hcmdzICE9IE5VTEwpOworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5hcmdzX2xlbiA9PSAzKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAocnVsZS0+YXJnc1swXSA9PSBOVUxMKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAocnVsZS0+YXJnc1sxXSA9PSBOVUxMKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAocnVsZS0+YXJnc1syXSAhPSBOVUxMKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAocnVsZS0+YXJnc1szXSA9PSBOVUxMKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoc3RyY21wIChydWxlLT5hcmdzWzJdLCAiZm9vIikgPT0gMCk7CisKKyAgICAgIGJ1c19tYXRjaF9ydWxlX3VucmVmIChydWxlKTsKKyAgICB9CisgIAorICBydWxlID0gY2hlY2tfcGFyc2UgKFRSVUUsICJhcmc0MD0nZm9vJyIpOworICBpZiAocnVsZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydCAocnVsZS0+ZmxhZ3MgPT0gQlVTX01BVENIX0FSR1MpOworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5hcmdzICE9IE5VTEwpOworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5hcmdzX2xlbiA9PSA0MSk7CisgICAgICBfZGJ1c19hc3NlcnQgKHJ1bGUtPmFyZ3NbMF0gPT0gTlVMTCk7CisgICAgICBfZGJ1c19hc3NlcnQgKHJ1bGUtPmFyZ3NbMV0gPT0gTlVMTCk7CisgICAgICBfZGJ1c19hc3NlcnQgKHJ1bGUtPmFyZ3NbNDBdICE9IE5VTEwpOworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5hcmdzWzQxXSA9PSBOVUxMKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoc3RyY21wIChydWxlLT5hcmdzWzQwXSwgImZvbyIpID09IDApOworCisgICAgICBidXNfbWF0Y2hfcnVsZV91bnJlZiAocnVsZSk7CisgICAgfQorICAKKyAgcnVsZSA9IGNoZWNrX3BhcnNlIChUUlVFLCAiYXJnNjM9J2ZvbyciKTsKKyAgaWYgKHJ1bGUgIT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c19hc3NlcnQgKHJ1bGUtPmZsYWdzID09IEJVU19NQVRDSF9BUkdTKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAocnVsZS0+YXJncyAhPSBOVUxMKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAocnVsZS0+YXJnc19sZW4gPT0gNjQpOworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5hcmdzWzBdID09IE5VTEwpOworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5hcmdzWzFdID09IE5VTEwpOworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5hcmdzWzYzXSAhPSBOVUxMKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAocnVsZS0+YXJnc1s2NF0gPT0gTlVMTCk7CisgICAgICBfZGJ1c19hc3NlcnQgKHN0cmNtcCAocnVsZS0+YXJnc1s2M10sICJmb28iKSA9PSAwKTsKKworICAgICAgYnVzX21hdGNoX3J1bGVfdW5yZWYgKHJ1bGUpOworICAgIH0KKworICBydWxlID0gY2hlY2tfcGFyc2UgKFRSVUUsICJhcmc3cGF0aD0nL2ZvbyciKTsKKyAgaWYgKHJ1bGUgIT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c19hc3NlcnQgKHJ1bGUtPmZsYWdzID09IEJVU19NQVRDSF9BUkdTKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAocnVsZS0+YXJncyAhPSBOVUxMKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAocnVsZS0+YXJnc19sZW4gPT0gOCk7CisgICAgICBfZGJ1c19hc3NlcnQgKHJ1bGUtPmFyZ3NbN10gIT0gTlVMTCk7CisgICAgICBfZGJ1c19hc3NlcnQgKHJ1bGUtPmFyZ3NbOF0gPT0gTlVMTCk7CisgICAgICBfZGJ1c19hc3NlcnQgKHN0cmNtcCAocnVsZS0+YXJnc1s3XSwgIi9mb28iKSA9PSAwKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoKHJ1bGUtPmFyZ19sZW5zWzddICYgQlVTX01BVENIX0FSR19JU19QQVRIKQorICAgICAgICAgID09IEJVU19NQVRDSF9BUkdfSVNfUEFUSCk7CisKKyAgICAgIGJ1c19tYXRjaF9ydWxlX3VucmVmIChydWxlKTsKKyAgICB9CisKKyAgLyogQXJnIDAgbmFtZXNwYWNlIG1hdGNoZXMgKi8KKyAgcnVsZSA9IGNoZWNrX3BhcnNlIChUUlVFLCAiYXJnMG5hbWVzcGFjZT0nZm9vJyIpOworICBpZiAocnVsZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydCAocnVsZS0+ZmxhZ3MgPT0gQlVTX01BVENIX0FSR1MpOworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5hcmdzICE9IE5VTEwpOworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5hcmdzX2xlbiA9PSAxKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoc3RyY21wIChydWxlLT5hcmdzWzBdLCAiZm9vIikgPT0gMCk7CisgICAgICBfZGJ1c19hc3NlcnQgKChydWxlLT5hcmdfbGVuc1swXSAmIEJVU19NQVRDSF9BUkdfTkFNRVNQQUNFKQorICAgICAgICAgID09IEJVU19NQVRDSF9BUkdfTkFNRVNQQUNFKTsKKworICAgICAgYnVzX21hdGNoX3J1bGVfdW5yZWYgKHJ1bGUpOworICAgIH0KKworICBydWxlID0gY2hlY2tfcGFyc2UgKFRSVUUsICJhcmcwbmFtZXNwYWNlPSdmb28uYmFyJyIpOworICBpZiAocnVsZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydCAocnVsZS0+ZmxhZ3MgPT0gQlVTX01BVENIX0FSR1MpOworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5hcmdzICE9IE5VTEwpOworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5hcmdzX2xlbiA9PSAxKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoc3RyY21wIChydWxlLT5hcmdzWzBdLCAiZm9vLmJhciIpID09IDApOworICAgICAgX2RidXNfYXNzZXJ0ICgocnVsZS0+YXJnX2xlbnNbMF0gJiBCVVNfTUFUQ0hfQVJHX05BTUVTUEFDRSkKKyAgICAgICAgICA9PSBCVVNfTUFUQ0hfQVJHX05BTUVTUEFDRSk7CisKKyAgICAgIGJ1c19tYXRjaF9ydWxlX3VucmVmIChydWxlKTsKKyAgICB9CisKKyAgLyogT25seSBhcmcwbmFtZXNwYWNlIGlzIHN1cHBvcnRlZC4gKi8KKyAgcnVsZSA9IGNoZWNrX3BhcnNlIChGQUxTRSwgImFyZzFuYW1lc3BhY2U9J2ZvbyciKTsKKyAgX2RidXNfYXNzZXJ0IChydWxlID09IE5VTEwpOworCisgIC8qIEFuIGVtcHR5IHN0cmluZyBpc24ndCBhIHZhbGlkIG5hbWVzcGFjZSBwcmVmaXggKHlvdSBzaG91bGQganVzdCBub3QKKyAgICogc3BlY2lmeSB0aGlzIGtleSBhdCBhbGwpLgorICAgKi8KKyAgcnVsZSA9IGNoZWNrX3BhcnNlIChGQUxTRSwgImFyZzBuYW1lc3BhY2U9JyciKTsKKyAgX2RidXNfYXNzZXJ0IChydWxlID09IE5VTEwpOworCisgIC8qIFRyYWlsaW5nIHBlcmlvZHMgYXJlbid0IGFsbG93ZWQgKGVhcmxpZXIgdmVyc2lvbnMgb2YgdGhlIGFyZzBuYW1lc3BhY2UKKyAgICogc3BlYyBhbGxvd2VkIGEgc2luZ2xlIHRyYWlsaW5nIHBlcmlvZCwgd2hpY2ggYWx0ZXJlZCB0aGUgc2VtYW50aWNzKSAqLworICBydWxlID0gY2hlY2tfcGFyc2UgKEZBTFNFLCAiYXJnMG5hbWVzcGFjZT0nZm9vLiciKTsKKyAgX2RidXNfYXNzZXJ0IChydWxlID09IE5VTEwpOworCisgIHJ1bGUgPSBjaGVja19wYXJzZSAoRkFMU0UsICJhcmcwbmFtZXNwYWNlPSdmb28uYmFyLiciKTsKKyAgX2RidXNfYXNzZXJ0IChydWxlID09IE5VTEwpOworCisgIHJ1bGUgPSBjaGVja19wYXJzZSAoRkFMU0UsICJhcmcwbmFtZXNwYWNlPSdmb28uLiciKTsKKyAgX2RidXNfYXNzZXJ0IChydWxlID09IE5VTEwpOworCisgIHJ1bGUgPSBjaGVja19wYXJzZSAoRkFMU0UsICJhcmcwbmFtZXNwYWNlPSdmb28uYmFyLi4nIik7CisgIF9kYnVzX2Fzc2VydCAocnVsZSA9PSBOVUxMKTsKKworICAvKiBUb28tbGFyZ2UgYXJnTiAqLworICBydWxlID0gY2hlY2tfcGFyc2UgKEZBTFNFLCAiYXJnMzAwPSdmb28nIik7CisgIF9kYnVzX2Fzc2VydCAocnVsZSA9PSBOVUxMKTsKKyAgcnVsZSA9IGNoZWNrX3BhcnNlIChGQUxTRSwgImFyZzY0PSdmb28nIik7CisgIF9kYnVzX2Fzc2VydCAocnVsZSA9PSBOVUxMKTsKKworICAvKiBObyBOIGluIGFyZ04gKi8KKyAgcnVsZSA9IGNoZWNrX3BhcnNlIChGQUxTRSwgImFyZz0nZm9vJyIpOworICBfZGJ1c19hc3NlcnQgKHJ1bGUgPT0gTlVMTCk7CisgIHJ1bGUgPSBjaGVja19wYXJzZSAoRkFMU0UsICJhcmd2PSdmb28nIik7CisgIF9kYnVzX2Fzc2VydCAocnVsZSA9PSBOVUxMKTsKKyAgcnVsZSA9IGNoZWNrX3BhcnNlIChGQUxTRSwgImFyZzNqdW5rPSdmb28nIik7CisgIF9kYnVzX2Fzc2VydCAocnVsZSA9PSBOVUxMKTsKKyAgcnVsZSA9IGNoZWNrX3BhcnNlIChGQUxTRSwgImFyZ3VtZW50PSdmb28nIik7CisgIF9kYnVzX2Fzc2VydCAocnVsZSA9PSBOVUxMKTsKKyAgCisgIC8qIFJlamVjdCBkdXBsaWNhdGVzICovCisgIHJ1bGUgPSBjaGVja19wYXJzZSAoRkFMU0UsICJ0eXBlPSdzaWduYWwnLHR5cGU9J21ldGhvZF9jYWxsJyIpOworICBfZGJ1c19hc3NlcnQgKHJ1bGUgPT0gTlVMTCk7CisKKyAgcnVsZSA9IGNoZWNrX3BhcnNlIChUUlVFLCAicGF0aF9uYW1lc3BhY2U9Jy9mb28vYmFyJyIpOworICBpZiAocnVsZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydCAocnVsZS0+ZmxhZ3MgPT0gQlVTX01BVENIX1BBVEhfTkFNRVNQQUNFKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAocnVsZS0+cGF0aCAhPSBOVUxMKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoc3RyY21wIChydWxlLT5wYXRoLCAiL2Zvby9iYXIiKSA9PSAwKTsKKworICAgICAgYnVzX21hdGNoX3J1bGVfdW5yZWYgKHJ1bGUpOworICAgIH0KKworICAvKiBBbG1vc3QgYSBkdXBsaWNhdGUgKi8KKyAgcnVsZSA9IGNoZWNrX3BhcnNlIChGQUxTRSwgInBhdGg9Jy9mb28nLHBhdGhfbmFtZXNwYWNlPScvZm9vJyIpOworICBfZGJ1c19hc3NlcnQgKHJ1bGUgPT0gTlVMTCk7CisKKyAgLyogVHJhaWxpbmcgLyB3YXMgc3VwcG9ydGVkIGluIHRoZSBpbml0aWFsIHByb3Bvc2FsLCBidXQgbm93IGlzbid0ICovCisgIHJ1bGUgPSBjaGVja19wYXJzZSAoRkFMU0UsICJwYXRoX25hbWVzcGFjZT0nL2Zvby8nIik7CisgIF9kYnVzX2Fzc2VydCAocnVsZSA9PSBOVUxMKTsKKworICAvKiBEdXBsaWNhdGVzIHdpdGggdGhlIGFyZ04gY29kZSAqLworICBydWxlID0gY2hlY2tfcGFyc2UgKEZBTFNFLCAiYXJnMD0nZm9vJyxhcmcwPSdiYXInIik7CisgIF9kYnVzX2Fzc2VydCAocnVsZSA9PSBOVUxMKTsKKyAgcnVsZSA9IGNoZWNrX3BhcnNlIChGQUxTRSwgImFyZzM9J2ZvbycsYXJnMz0nYmFyJyIpOworICBfZGJ1c19hc3NlcnQgKHJ1bGUgPT0gTlVMTCk7CisgIHJ1bGUgPSBjaGVja19wYXJzZSAoRkFMU0UsICJhcmczMD0nZm9vJyxhcmczMD0nYmFyJyIpOworICBfZGJ1c19hc3NlcnQgKHJ1bGUgPT0gTlVMTCk7CisgIAorICAvKiBSZWplY3QgYnJva2VuIGtleXMgKi8KKyAgcnVsZSA9IGNoZWNrX3BhcnNlIChGQUxTRSwgImJsYWg9J3NpZ25hbCciKTsKKyAgX2RidXNfYXNzZXJ0IChydWxlID09IE5VTEwpOworCisgIC8qIFJlamVjdCBicm9rZW4gdmFsdWVzICovCisgIHJ1bGUgPSBjaGVja19wYXJzZSAoRkFMU0UsICJ0eXBlPSdjaG91aW4nIik7CisgIF9kYnVzX2Fzc2VydCAocnVsZSA9PSBOVUxMKTsKKyAgcnVsZSA9IGNoZWNrX3BhcnNlIChGQUxTRSwgImludGVyZmFjZT0nYWJjQGRlZisrJyIpOworICBfZGJ1c19hc3NlcnQgKHJ1bGUgPT0gTlVMTCk7CisgIHJ1bGUgPSBjaGVja19wYXJzZSAoRkFMU0UsICJzZXJ2aWNlPSd5b3VwaSciKTsKKyAgX2RidXNfYXNzZXJ0IChydWxlID09IE5VTEwpOworCisgIC8qIEFsbG93IGVtcHR5IHJ1bGUgKi8KKyAgcnVsZSA9IGNoZWNrX3BhcnNlIChUUlVFLCAiIik7CisgIGlmIChydWxlICE9IE5VTEwpCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0IChydWxlLT5mbGFncyA9PSAwKTsKKyAgICAgIAorICAgICAgYnVzX21hdGNoX3J1bGVfdW5yZWYgKHJ1bGUpOworICAgIH0KKworICAvKiBBbGwtd2hpdGVzcGFjZSBydWxlIGlzIHRoZSBzYW1lIGFzIGVtcHR5ICovCisgIHJ1bGUgPSBjaGVja19wYXJzZSAoVFJVRSwgIiAgICBcdCIpOworICBpZiAocnVsZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydCAocnVsZS0+ZmxhZ3MgPT0gMCk7CisgICAgICAKKyAgICAgIGJ1c19tYXRjaF9ydWxlX3VucmVmIChydWxlKTsKKyAgICB9CisKKyAgLyogQnV0IHdpdGggbm9uLXdoaXRlc3BhY2UgY2hhcnMgYW5kIG5vID12YWx1ZSwgaXQncyBub3QgT0sgKi8KKyAgcnVsZSA9IGNoZWNrX3BhcnNlIChGQUxTRSwgInR5cGUiKTsKKyAgX2RidXNfYXNzZXJ0IChydWxlID09IE5VTEwpOworICAKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgeworICBjb25zdCBjaGFyICpmaXJzdDsKKyAgY29uc3QgY2hhciAqc2Vjb25kOworfSBlcXVhbGl0eV90ZXN0c1tdID0geworICB7ICJ0eXBlPSdzaWduYWwnIiwgInR5cGU9J3NpZ25hbCciIH0sCisgIHsgInR5cGU9J3NpZ25hbCcsaW50ZXJmYWNlPSdmb28uYmFyJyIsICJpbnRlcmZhY2U9J2Zvby5iYXInLHR5cGU9J3NpZ25hbCciIH0sCisgIHsgInR5cGU9J3NpZ25hbCcsbWVtYmVyPSdiYXInIiwgIm1lbWJlcj0nYmFyJyx0eXBlPSdzaWduYWwnIiB9LAorICB7ICJ0eXBlPSdtZXRob2RfY2FsbCcsc2VuZGVyPSc6MS4wJyIsICJzZW5kZXI9JzoxLjAnLHR5cGU9J21ldGhvZF9jYWxsJyIgfSwKKyAgeyAidHlwZT0nbWV0aG9kX2NhbGwnLGRlc3RpbmF0aW9uPSc6MS4wJyIsICJkZXN0aW5hdGlvbj0nOjEuMCcsdHlwZT0nbWV0aG9kX2NhbGwnIiB9LAorICB7ICJ0eXBlPSdtZXRob2RfY2FsbCcscGF0aD0nL2Zvby9iYXInIiwgInBhdGg9Jy9mb28vYmFyJyx0eXBlPSdtZXRob2RfY2FsbCciIH0sCisgIHsgInR5cGU9J21ldGhvZF9jYWxsJyxhcmcwPSdibGFoJyIsICJhcmcwPSdibGFoJyx0eXBlPSdtZXRob2RfY2FsbCciIH0sCisgIHsgInR5cGU9J21ldGhvZF9jYWxsJyxhcmcwPSdib28nIiwgImFyZzA9J2JvbycsdHlwZT0nbWV0aG9kX2NhbGwnIiB9LAorICB7ICJ0eXBlPSdtZXRob2RfY2FsbCcsYXJnMD0nYmxhaCcsYXJnMT0nYmF6JyIsICJhcmcwPSdibGFoJyxhcmcxPSdiYXonLHR5cGU9J21ldGhvZF9jYWxsJyIgfSwKKyAgeyAidHlwZT0nbWV0aG9kX2NhbGwnLGFyZzM9J2Zvb3NoJyIsICJhcmczPSdmb29zaCcsdHlwZT0nbWV0aG9kX2NhbGwnIiB9LAorICB7ICJhcmczPSdmb29sJyIsICJhcmczPSdmb29sJyIgfSwKKyAgeyAiYXJnMG5hbWVzcGFjZT0nZm9vbCciLCAiYXJnMG5hbWVzcGFjZT0nZm9vbCciIH0sCisgIHsgIm1lbWJlcj0nZm9vZCciLCAibWVtYmVyPSdmb29kJyIgfSwKKyAgeyAibWVtYmVyPWVzY2FwZSIsICJtZW1iZXI9J2VzY2FwZSciIH0sCisgIHsgIm1lbWJlcj1pY2VjcmVhbSIsICJtZW1iZXI9aWNlJ2NyZWFtJyIgfSwKKyAgeyAiYXJnMD0nY29tbWEsdHlwZT1jb21tYScsdHlwZT1zaWduYWwiLCAidHlwZT1zaWduYWwsYXJnMD0nY29tbWEsdHlwZT1jb21tYSciIH0sCisgIHsgImFyZzA9ZXNjYXBcXGUiLCAiYXJnMD0nZXNjYXBcXGUnIiB9LAorICB7ICJhcmcwPVRpbWU6IDggb1xcJ2Nsb2NrIiwgImFyZzA9J1RpbWU6IDggbydcXCcnY2xvY2snIiB9LAorfTsKKworc3RhdGljIHZvaWQKK3Rlc3RfZXF1YWxpdHkgKHZvaWQpCit7CisgIGludCBpOworICAKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgX0RCVVNfTl9FTEVNRU5UUyAoZXF1YWxpdHlfdGVzdHMpKQorICAgIHsKKyAgICAgIEJ1c01hdGNoUnVsZSAqZmlyc3Q7CisgICAgICBCdXNNYXRjaFJ1bGUgKnNlY29uZDsKKyAgICAgIGNoYXIgKmZpcnN0X3N0ciwgKnNlY29uZF9zdHI7CisgICAgICBCdXNNYXRjaFJ1bGUgKmZpcnN0X3JlcGFyc2VkLCAqc2Vjb25kX3JlcGFyc2VkOworICAgICAgaW50IGo7CisgICAgICAKKyAgICAgIGZpcnN0ID0gY2hlY2tfcGFyc2UgKFRSVUUsIGVxdWFsaXR5X3Rlc3RzW2ldLmZpcnN0KTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoZmlyc3QgIT0gTlVMTCk7CisgICAgICBzZWNvbmQgPSBjaGVja19wYXJzZSAoVFJVRSwgZXF1YWxpdHlfdGVzdHNbaV0uc2Vjb25kKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoc2Vjb25kICE9IE5VTEwpOworCisgICAgICBpZiAoIW1hdGNoX3J1bGVfZXF1YWwgKGZpcnN0LCBzZWNvbmQpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoInJ1bGUgJXMgYW5kICVzIHNob3VsZCBoYXZlIGJlZW4gZXF1YWwiLAorICAgICAgICAgICAgICAgICAgICAgIGVxdWFsaXR5X3Rlc3RzW2ldLmZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgIGVxdWFsaXR5X3Rlc3RzW2ldLnNlY29uZCk7CisgICAgICAgICAgZXhpdCAoMSk7CisgICAgICAgIH0KKworICAgICAgLyogQ2hlY2sgbWF0Y2hfcnVsZV90b19zdHJpbmcgKi8KKyAgICAgIGZpcnN0X3N0ciA9IG1hdGNoX3J1bGVfdG9fc3RyaW5nIChmaXJzdCk7CisgICAgICBfZGJ1c19hc3NlcnQgKGZpcnN0X3N0ciAhPSBOVUxMKTsKKyAgICAgIHNlY29uZF9zdHIgPSBtYXRjaF9ydWxlX3RvX3N0cmluZyAoc2Vjb25kKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoc2Vjb25kX3N0ciAhPSBOVUxMKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoc3RyY21wIChmaXJzdF9zdHIsIHNlY29uZF9zdHIpID09IDApOworICAgICAgZmlyc3RfcmVwYXJzZWQgPSBjaGVja19wYXJzZSAoVFJVRSwgZmlyc3Rfc3RyKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoZmlyc3RfcmVwYXJzZWQgIT0gTlVMTCk7CisgICAgICBzZWNvbmRfcmVwYXJzZWQgPSBjaGVja19wYXJzZSAoVFJVRSwgc2Vjb25kX3N0cik7CisgICAgICBfZGJ1c19hc3NlcnQgKHNlY29uZF9yZXBhcnNlZCAhPSBOVUxMKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAobWF0Y2hfcnVsZV9lcXVhbCAoZmlyc3QsIGZpcnN0X3JlcGFyc2VkKSk7CisgICAgICBfZGJ1c19hc3NlcnQgKG1hdGNoX3J1bGVfZXF1YWwgKHNlY29uZCwgc2Vjb25kX3JlcGFyc2VkKSk7CisgICAgICBidXNfbWF0Y2hfcnVsZV91bnJlZiAoZmlyc3RfcmVwYXJzZWQpOworICAgICAgYnVzX21hdGNoX3J1bGVfdW5yZWYgKHNlY29uZF9yZXBhcnNlZCk7CisgICAgICBkYnVzX2ZyZWUgKGZpcnN0X3N0cik7CisgICAgICBkYnVzX2ZyZWUgKHNlY29uZF9zdHIpOworCisgICAgICBidXNfbWF0Y2hfcnVsZV91bnJlZiAoc2Vjb25kKTsKKworICAgICAgLyogQ2hlY2sgdGhhdCB0aGUgcnVsZSBpcyBub3QgZXF1YWwgdG8gYW55IG9mIHRoZQorICAgICAgICogb3RoZXJzIGJlc2lkZXMgaXRzIHBhaXIgbWF0Y2gKKyAgICAgICAqLworICAgICAgaiA9IDA7CisgICAgICB3aGlsZSAoaiA8IF9EQlVTX05fRUxFTUVOVFMgKGVxdWFsaXR5X3Rlc3RzKSkKKyAgICAgICAgeworICAgICAgICAgIGlmIChpICE9IGopCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHNlY29uZCA9IGNoZWNrX3BhcnNlIChUUlVFLCBlcXVhbGl0eV90ZXN0c1tqXS5zZWNvbmQpOworICAgICAgICAgICAgICBfZGJ1c19hc3NlcnQgKHNlY29uZCAhPSBOVUxMKTsKKworICAgICAgICAgICAgICBpZiAobWF0Y2hfcnVsZV9lcXVhbCAoZmlyc3QsIHNlY29uZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgX2RidXNfd2FybiAoInJ1bGUgJXMgYW5kICVzIHNob3VsZCBub3QgaGF2ZSBiZWVuIGVxdWFsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVxdWFsaXR5X3Rlc3RzW2ldLmZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXF1YWxpdHlfdGVzdHNbal0uc2Vjb25kKTsKKyAgICAgICAgICAgICAgICAgIGV4aXQgKDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIGJ1c19tYXRjaF9ydWxlX3VucmVmIChzZWNvbmQpOworICAgICAgICAgICAgfQorICAgICAgICAgIAorICAgICAgICAgICsrajsKKyAgICAgICAgfQorCisgICAgICBidXNfbWF0Y2hfcnVsZV91bnJlZiAoZmlyc3QpOworCisgICAgICArK2k7CisgICAgfQorfQorCitzdGF0aWMgY29uc3QgY2hhcioKK3Nob3VsZF9tYXRjaF9tZXNzYWdlXzFbXSA9IHsKKyAgInR5cGU9J3NpZ25hbCciLAorICAibWVtYmVyPSdGcm9iYXRlZCciLAorICAiYXJnMD0nZm9vYmFyJyIsCisgICJ0eXBlPSdzaWduYWwnLG1lbWJlcj0nRnJvYmF0ZWQnIiwKKyAgInR5cGU9J3NpZ25hbCcsbWVtYmVyPSdGcm9iYXRlZCcsYXJnMD0nZm9vYmFyJyIsCisgICJtZW1iZXI9J0Zyb2JhdGVkJyxhcmcwPSdmb29iYXInIiwKKyAgInR5cGU9J3NpZ25hbCcsYXJnMD0nZm9vYmFyJyIsCisgIC8qIFRoZSBkZWZpbml0aW9uIG9mIGFyZ1hwYXRoIG1hdGNoZXMgc2F5czogIkFzIHdpdGggbm9ybWFsIGFyZ3VtZW50IG1hdGNoZXMsCisgICAqIGlmIHRoZSBhcmd1bWVudCBpcyBleGFjdGx5IGVxdWFsIHRvIHRoZSBzdHJpbmcgZ2l2ZW4gaW4gdGhlIG1hdGNoIHJ1bGUKKyAgICogdGhlbiB0aGUgcnVsZSBpcyBzYXRpc2ZpZWQuIiBTbyB0aGlzIHNob3VsZCBtYXRjaCAoZXZlbiB0aG91Z2ggdGhlCisgICAqIGFyZ3VtZW50IGlzIG5vdCBhIHZhbGlkIHBhdGgpIQorICAgKi8KKyAgImFyZzBwYXRoPSdmb29iYXInIiwKKyAgImFyZzBuYW1lc3BhY2U9J2Zvb2JhciciLAorICBOVUxMCit9OworCitzdGF0aWMgY29uc3QgY2hhcioKK3Nob3VsZF9ub3RfbWF0Y2hfbWVzc2FnZV8xW10gPSB7CisgICJ0eXBlPSdtZXRob2RfY2FsbCciLAorICAidHlwZT0nZXJyb3InIiwKKyAgInR5cGU9J21ldGhvZF9yZXR1cm4nIiwKKyAgInR5cGU9J3NpZ25hbCcsbWVtYmVyPSdPb3BzZWQnIiwKKyAgImFyZzA9J2JsYWgnIiwKKyAgImFyZzE9J2Zvb2JhciciLAorICAiYXJnMj0nZm9vYmFyJyIsCisgICJhcmczPSdmb29iYXInIiwKKyAgImFyZzA9JzMnIiwKKyAgImFyZzE9JzMnIiwKKyAgImFyZzA9J2Zvb2JhcicsYXJnMT0nYWJjZGVmJyIsCisgICJhcmcwPSdmb29iYXInLGFyZzE9J2FiY2RlZicsYXJnMj0nYWJjZGVmZ2hpJyxhcmczPSdhYmNkZWZnaGknLGFyZzQ9J2FiY2RlZmdoaSciLAorICAiYXJnMD0nZm9vYmFyJyxhcmcxPSdhYmNkZWYnLGFyZzQ9J2FiY2RlZmdoaScsYXJnMz0nYWJjZGVmZ2hpJyxhcmcyPSdhYmNkZWZnaGknIiwKKyAgImFyZzBwYXRoPSdmb28nIiwKKyAgImFyZzBwYXRoPSdmb29iYXIvJyIsCisgICJhcmcxcGF0aD0nMyciLAorICAiYXJnMG5hbWVzcGFjZT0nZm9vJyIsCisgICJhcmcwbmFtZXNwYWNlPSdmb28nLGFyZzE9J2FiY2RlZiciLAorICAiYXJnMG5hbWVzcGFjZT0nbW9vJyIsCisgIE5VTEwKK307CisKKyNkZWZpbmUgRVhBTVBMRV9OQU1FICJjb20uZXhhbXBsZS5iYWNrZW5kLmZvbyIKKworc3RhdGljIGNvbnN0IGNoYXIgKgorc2hvdWxkX21hdGNoX21lc3NhZ2VfMltdID0geworICAvKiBFWEFNUExFX05BTUUgaXMgaW4gYWxsIG9mIHRoZXNlIG5hbWVzcGFjZXMgKi8KKyAgImFyZzBuYW1lc3BhY2U9J2NvbS5leGFtcGxlLmJhY2tlbmQnIiwKKyAgImFyZzBuYW1lc3BhY2U9J2NvbS5leGFtcGxlJyIsCisgICJhcmcwbmFtZXNwYWNlPSdjb20nIiwKKworICAvKiBJZiB0aGUgY2xpZW50IHNwZWNpZmllcyB0aGUgbmFtZSBleGFjdGx5LCB3aXRoIG5vIHRyYWlsaW5nIHBlcmlvZCwgdGhlbgorICAgKiBpdCBzaG91bGQgbWF0Y2guCisgICAqLworICAiYXJnMG5hbWVzcGFjZT0nY29tLmV4YW1wbGUuYmFja2VuZC5mb28nIiwKKworICBOVUxMCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqCitzaG91bGRfbm90X21hdGNoX21lc3NhZ2VfMltdID0geworICAvKiBUaGVzZSBhcmUgbm90IGV2ZW4gcHJlZml4ZXMgKi8KKyAgImFyZzBuYW1lc3BhY2U9J2NvbS5leGFtcGxlLmJhY2tlbmQuZm9vLmJhciciLAorICAiYXJnMG5hbWVzcGFjZT0nY29tLmV4YW1wbGUuYmFja2VuZC5mb29iYXInIiwKKworICAvKiBUaGVzZSBhcmUgcHJlZml4ZXMsIGJ1dCB0aGV5J3JlIG5vdCBwYXJlbnQgbmFtZXNwYWNlcy4gKi8KKyAgImFyZzBuYW1lc3BhY2U9J2NvbS5leGFtcGxlLmJhY2tlbmQuZm8nIiwKKyAgImFyZzBuYW1lc3BhY2U9J2NvbS5leGFtcGxlLmJhY2tlbiciLAorICAiYXJnMG5hbWVzcGFjZT0nY29tLmV4YW1wbCciLAorICAiYXJnMG5hbWVzcGFjZT0nY28nIiwKKworICBOVUxMCit9OworCitzdGF0aWMgdm9pZAorY2hlY2tfbWF0Y2hlcyAoZGJ1c19ib29sX3QgIGV4cGVjdGVkX3RvX21hdGNoLAorICAgICAgICAgICAgICAgaW50ICAgICAgICAgIG51bWJlciwKKyAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICptZXNzYWdlLAorICAgICAgICAgICAgICAgY29uc3QgY2hhciAgKnJ1bGVfdGV4dCkKK3sKKyAgQnVzTWF0Y2hSdWxlICpydWxlOworICBkYnVzX2Jvb2xfdCBtYXRjaGVkOworCisgIHJ1bGUgPSBjaGVja19wYXJzZSAoVFJVRSwgcnVsZV90ZXh0KTsKKyAgX2RidXNfYXNzZXJ0IChydWxlICE9IE5VTEwpOworCisgIC8qIFdlIGNhbid0IHRlc3Qgc2VuZGVyL2Rlc3RpbmF0aW9uIHJ1bGVzIHNpbmNlIHdlIHBhc3MgTlVMTCBoZXJlICovCisgIG1hdGNoZWQgPSBtYXRjaF9ydWxlX21hdGNoZXMgKHJ1bGUsIE5VTEwsIE5VTEwsIG1lc3NhZ2UsIDApOworCisgIGlmIChtYXRjaGVkICE9IGV4cGVjdGVkX3RvX21hdGNoKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJFeHBlY3RlZCBydWxlICVzIHRvICVzIG1lc3NhZ2UgJWQsIGZhaWxlZCIsCisgICAgICAgICAgICAgICAgICBydWxlX3RleHQsIGV4cGVjdGVkX3RvX21hdGNoID8KKyAgICAgICAgICAgICAgICAgICJtYXRjaCIgOiAibm90IG1hdGNoIiwgbnVtYmVyKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICBidXNfbWF0Y2hfcnVsZV91bnJlZiAocnVsZSk7Cit9CisKK3N0YXRpYyB2b2lkCitjaGVja19tYXRjaGluZyAoREJ1c01lc3NhZ2UgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgaW50ICAgICAgICAgIG51bWJlciwKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqc2hvdWxkX21hdGNoLAorICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKipzaG91bGRfbm90X21hdGNoKQoreworICBpbnQgaTsKKworICBpID0gMDsKKyAgd2hpbGUgKHNob3VsZF9tYXRjaFtpXSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGNoZWNrX21hdGNoZXMgKFRSVUUsIG51bWJlciwgbWVzc2FnZSwgc2hvdWxkX21hdGNoW2ldKTsKKyAgICAgICsraTsKKyAgICB9CisKKyAgaSA9IDA7CisgIHdoaWxlIChzaG91bGRfbm90X21hdGNoW2ldICE9IE5VTEwpCisgICAgeworICAgICAgY2hlY2tfbWF0Y2hlcyAoRkFMU0UsIG51bWJlciwgbWVzc2FnZSwgc2hvdWxkX25vdF9tYXRjaFtpXSk7CisgICAgICArK2k7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAordGVzdF9tYXRjaGluZyAodm9pZCkKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2UxLCAqbWVzc2FnZTI7CisgIGNvbnN0IGNoYXIgKnZfU1RSSU5HOworICBkYnVzX2ludDMyX3Qgdl9JTlQzMjsKKworICBtZXNzYWdlMSA9IGRidXNfbWVzc2FnZV9uZXcgKERCVVNfTUVTU0FHRV9UWVBFX1NJR05BTCk7CisgIF9kYnVzX2Fzc2VydCAobWVzc2FnZTEgIT0gTlVMTCk7CisgIGlmICghZGJ1c19tZXNzYWdlX3NldF9tZW1iZXIgKG1lc3NhZ2UxLCAiRnJvYmF0ZWQiKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKKworICB2X1NUUklORyA9ICJmb29iYXIiOworICB2X0lOVDMyID0gMzsKKyAgaWYgKCFkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKG1lc3NhZ2UxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJnZfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVDMyLCAmdl9JTlQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm9vbSIpOworICAKKyAgY2hlY2tfbWF0Y2hpbmcgKG1lc3NhZ2UxLCAxLAorICAgICAgICAgICAgICAgICAgc2hvdWxkX21hdGNoX21lc3NhZ2VfMSwKKyAgICAgICAgICAgICAgICAgIHNob3VsZF9ub3RfbWF0Y2hfbWVzc2FnZV8xKTsKKyAgCisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZTEpOworCisgIG1lc3NhZ2UyID0gZGJ1c19tZXNzYWdlX25ldyAoREJVU19NRVNTQUdFX1RZUEVfU0lHTkFMKTsKKyAgX2RidXNfYXNzZXJ0IChtZXNzYWdlMiAhPSBOVUxMKTsKKyAgaWYgKCFkYnVzX21lc3NhZ2Vfc2V0X21lbWJlciAobWVzc2FnZTIsICJOYW1lT3duZXJDaGFuZ2VkIikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisKKyAgLyogT2J2aW91c2x5IHRoaXMgaXNuJ3QgcmVhbGx5IGEgTmFtZU93bmVyQ2hhbmdlZCBzaWduYWwuICovCisgIHZfU1RSSU5HID0gRVhBTVBMRV9OQU1FOworICBpZiAoIWRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAobWVzc2FnZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmdl9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKKworICBjaGVja19tYXRjaGluZyAobWVzc2FnZTIsIDIsCisgICAgICAgICAgICAgICAgICBzaG91bGRfbWF0Y2hfbWVzc2FnZV8yLAorICAgICAgICAgICAgICAgICAgc2hvdWxkX25vdF9tYXRjaF9tZXNzYWdlXzIpOworCisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZTIpOworfQorCisjZGVmaW5lIFBBVEhfTUFUQ0hfUlVMRSAiYXJnMHBhdGg9Jy9hYS9iYi8nIgorCisvKiBUaGlzIGlzIGEgbGlzdCBvZiBwYXRocyB0aGF0IHNob3VsZCBiZSBtYXRjaGVkIGJ5IFBBVEhfTUFUQ0hfUlVMRSwgdGFrZW4KKyAqIGZyb20gdGhlIHNwZWNpZmljYXRpb24uIE5vdGljZSB0aGF0IG5vdCBhbGwgb2YgdGhlbSBhcmUgYWN0dWFsbHkgbGVnYWwgRC1CdXMKKyAqIHBhdGhzLgorICoKKyAqIFRoZSBhdXRob3Igb2YgdGhpcyB0ZXN0IHRha2VzIG5vIHJlc3BvbnNpYmlsaXR5IGZvciB0aGUgc2VtYW50aWNzIG9mCisgKiB0aGlzIG1hdGNoIHJ1bGUga2V5LgorICovCitzdGF0aWMgY29uc3QgY2hhciAqcGF0aHNfdGhhdF9zaG91bGRfYmVfbWF0Y2hlZFtdID0geworICAgICIvYWEvIiwKKyAgICAiL2FhL2JiLyIsCisgICAgIi9hYS9iYi9jYy8iLAorI2RlZmluZSBGSVJTVF9WQUxJRF9QQVRIX1dISUNIX1NIT1VMRF9NQVRDSCAzCisgICAgIi8iLAorICAgICIvYWEvYmIvY2MiLAorICAgIE5VTEwKK307CisKKy8qIFRoZXNlIHBhdGhzIHNob3VsZCBub3QgYmUgbWF0Y2hlZCBieSBQQVRIX01BVENIX1JVTEUuICovCitzdGF0aWMgY29uc3QgY2hhciAqcGF0aHNfdGhhdF9zaG91bGRfbm90X2JlX21hdGNoZWRbXSA9IHsKKyAgICAiL2FhL2IiLAorICAgICIvYWEiLAorICAgIC8qIG9yIGV2ZW4uLi4gKi8KKyAgICAiL2FhL2JiIiwKKyAgICBOVUxMCit9OworCitzdGF0aWMgdm9pZAordGVzdF9wYXRoX21hdGNoIChpbnQgdHlwZSwKKyAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICpwYXRoLAorICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgKnJ1bGVfdGV4dCwKKyAgICAgICAgICAgICAgICAgQnVzTWF0Y2hSdWxlICpydWxlLAorICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgIHNob3VsZF9tYXRjaCkKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfbmV3IChEQlVTX01FU1NBR0VfVFlQRV9TSUdOQUwpOworICBkYnVzX2Jvb2xfdCBtYXRjaGVkOworCisgIF9kYnVzX2Fzc2VydCAobWVzc2FnZSAhPSBOVUxMKTsKKyAgaWYgKCFkYnVzX21lc3NhZ2Vfc2V0X21lbWJlciAobWVzc2FnZSwgIkZvbyIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm9vbSIpOworCisgIGlmICghZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwgJnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKKworICBtYXRjaGVkID0gbWF0Y2hfcnVsZV9tYXRjaGVzIChydWxlLCBOVUxMLCBOVUxMLCBtZXNzYWdlLCAwKTsKKworICBpZiAobWF0Y2hlZCAhPSBzaG91bGRfbWF0Y2gpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkV4cGVjdGVkIHJ1bGUgJXMgdG8gJXMgbWVzc2FnZSAiCisgICAgICAgICAgICAgICAgICAid2l0aCBmaXJzdCBhcmcgJXMgb2YgdHlwZSAnJWMnLCBmYWlsZWQiLAorICAgICAgICAgICAgICAgICAgcnVsZV90ZXh0LAorICAgICAgICAgICAgICAgICAgc2hvdWxkX21hdGNoID8gIm1hdGNoIiA6ICJub3QgbWF0Y2giLAorICAgICAgICAgICAgICAgICAgcGF0aCwKKyAgICAgICAgICAgICAgICAgIChjaGFyKSB0eXBlKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9wYXRoX21hdGNoaW5nICh2b2lkKQoreworICBCdXNNYXRjaFJ1bGUgKnJ1bGU7CisgIGNvbnN0IGNoYXIgKipzOworCisgIHJ1bGUgPSBjaGVja19wYXJzZSAoVFJVRSwgUEFUSF9NQVRDSF9SVUxFKTsKKyAgX2RidXNfYXNzZXJ0IChydWxlICE9IE5VTEwpOworCisgIGZvciAocyA9IHBhdGhzX3RoYXRfc2hvdWxkX2JlX21hdGNoZWQ7ICpzICE9IE5VTEw7IHMrKykKKyAgICB0ZXN0X3BhdGhfbWF0Y2ggKERCVVNfVFlQRV9TVFJJTkcsICpzLCBQQVRIX01BVENIX1JVTEUsIHJ1bGUsIFRSVUUpOworCisgIGZvciAocyA9IHBhdGhzX3RoYXRfc2hvdWxkX2JlX21hdGNoZWQgKyBGSVJTVF9WQUxJRF9QQVRIX1dISUNIX1NIT1VMRF9NQVRDSDsKKyAgICAgICAqcyAhPSBOVUxMOyBzKyspCisgICAgdGVzdF9wYXRoX21hdGNoIChEQlVTX1RZUEVfT0JKRUNUX1BBVEgsICpzLCBQQVRIX01BVENIX1JVTEUsIHJ1bGUsIFRSVUUpOworCisgIGZvciAocyA9IHBhdGhzX3RoYXRfc2hvdWxkX25vdF9iZV9tYXRjaGVkOyAqcyAhPSBOVUxMOyBzKyspCisgICAgeworICAgICAgdGVzdF9wYXRoX21hdGNoIChEQlVTX1RZUEVfU1RSSU5HLCAqcywgUEFUSF9NQVRDSF9SVUxFLCBydWxlLCBGQUxTRSk7CisgICAgICB0ZXN0X3BhdGhfbWF0Y2ggKERCVVNfVFlQRV9PQkpFQ1RfUEFUSCwgKnMsIFBBVEhfTUFUQ0hfUlVMRSwgcnVsZSwgRkFMU0UpOworICAgIH0KKworICBidXNfbWF0Y2hfcnVsZV91bnJlZiAocnVsZSk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyKgorcGF0aF9uYW1lc3BhY2Vfc2hvdWxkX21hdGNoX21lc3NhZ2VfMVtdID0geworICAidHlwZT0nc2lnbmFsJyxwYXRoX25hbWVzcGFjZT0nLyciLAorICAidHlwZT0nc2lnbmFsJyxwYXRoX25hbWVzcGFjZT0nL2ZvbyciLAorICAidHlwZT0nc2lnbmFsJyxwYXRoX25hbWVzcGFjZT0nL2Zvby9UaGVPYmplY3RNYW5hZ2VyJyIsCisgIE5VTEwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyKgorcGF0aF9uYW1lc3BhY2Vfc2hvdWxkX25vdF9tYXRjaF9tZXNzYWdlXzFbXSA9IHsKKyAgInR5cGU9J3NpZ25hbCcscGF0aF9uYW1lc3BhY2U9Jy9iYXInIiwKKyAgInR5cGU9J3NpZ25hbCcscGF0aF9uYW1lc3BhY2U9Jy9iYXIvVGhlT2JqZWN0TWFuYWdlciciLAorICBOVUxMCit9OworCitzdGF0aWMgY29uc3QgY2hhcioKK3BhdGhfbmFtZXNwYWNlX3Nob3VsZF9tYXRjaF9tZXNzYWdlXzJbXSA9IHsKKyAgInR5cGU9J3NpZ25hbCcscGF0aF9uYW1lc3BhY2U9Jy8nIiwKKyAgInR5cGU9J3NpZ25hbCcscGF0aF9uYW1lc3BhY2U9Jy9mb28vVGhlT2JqZWN0TWFuYWdlciciLAorICBOVUxMCit9OworCitzdGF0aWMgY29uc3QgY2hhcioKK3BhdGhfbmFtZXNwYWNlX3Nob3VsZF9ub3RfbWF0Y2hfbWVzc2FnZV8yW10gPSB7CisgIE5VTEwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyKgorcGF0aF9uYW1lc3BhY2Vfc2hvdWxkX21hdGNoX21lc3NhZ2VfM1tdID0geworICAidHlwZT0nc2lnbmFsJyxwYXRoX25hbWVzcGFjZT0nLyciLAorICBOVUxMCit9OworCitzdGF0aWMgY29uc3QgY2hhcioKK3BhdGhfbmFtZXNwYWNlX3Nob3VsZF9ub3RfbWF0Y2hfbWVzc2FnZV8zW10gPSB7CisgICJ0eXBlPSdzaWduYWwnLHBhdGhfbmFtZXNwYWNlPScvZm9vL1RoZU9iamVjdE1hbmFnZXInIiwKKyAgTlVMTAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIqCitwYXRoX25hbWVzcGFjZV9zaG91bGRfbWF0Y2hfbWVzc2FnZV80W10gPSB7CisgICJ0eXBlPSdzaWduYWwnLHBhdGhfbmFtZXNwYWNlPScvJyIsCisgIE5VTEwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyKgorcGF0aF9uYW1lc3BhY2Vfc2hvdWxkX25vdF9tYXRjaF9tZXNzYWdlXzRbXSA9IHsKKyAgInR5cGU9J3NpZ25hbCcscGF0aF9uYW1lc3BhY2U9Jy9mb28vVGhlT2JqZWN0TWFuYWdlciciLAorICBOVUxMCit9OworCitzdGF0aWMgdm9pZAordGVzdF9tYXRjaGluZ19wYXRoX25hbWVzcGFjZSAodm9pZCkKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2UxOworICBEQnVzTWVzc2FnZSAqbWVzc2FnZTI7CisgIERCdXNNZXNzYWdlICptZXNzYWdlMzsKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U0OworCisgIG1lc3NhZ2UxID0gZGJ1c19tZXNzYWdlX25ldyAoREJVU19NRVNTQUdFX1RZUEVfU0lHTkFMKTsKKyAgX2RidXNfYXNzZXJ0IChtZXNzYWdlMSAhPSBOVUxMKTsKKyAgaWYgKCFkYnVzX21lc3NhZ2Vfc2V0X3BhdGggKG1lc3NhZ2UxLCAiL2Zvby9UaGVPYmplY3RNYW5hZ2VyIikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisKKyAgbWVzc2FnZTIgPSBkYnVzX21lc3NhZ2VfbmV3IChEQlVTX01FU1NBR0VfVFlQRV9TSUdOQUwpOworICBfZGJ1c19hc3NlcnQgKG1lc3NhZ2UyICE9IE5VTEwpOworICBpZiAoIWRidXNfbWVzc2FnZV9zZXRfcGF0aCAobWVzc2FnZTIsICIvZm9vL1RoZU9iamVjdE1hbmFnZXIvY2hpbGRfb2JqZWN0IikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisKKyAgbWVzc2FnZTMgPSBkYnVzX21lc3NhZ2VfbmV3IChEQlVTX01FU1NBR0VfVFlQRV9TSUdOQUwpOworICBfZGJ1c19hc3NlcnQgKG1lc3NhZ2UzICE9IE5VTEwpOworICBpZiAoIWRidXNfbWVzc2FnZV9zZXRfcGF0aCAobWVzc2FnZTMsICIvZm9vL1RoZU9iamVjdE1hbmFnZXJPdGhlciIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm9vbSIpOworCisgIG1lc3NhZ2U0ID0gZGJ1c19tZXNzYWdlX25ldyAoREJVU19NRVNTQUdFX1RZUEVfU0lHTkFMKTsKKyAgX2RidXNfYXNzZXJ0IChtZXNzYWdlNCAhPSBOVUxMKTsKKyAgaWYgKCFkYnVzX21lc3NhZ2Vfc2V0X3BhdGggKG1lc3NhZ2U0LCAiLyIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm9vbSIpOworCisgIGNoZWNrX21hdGNoaW5nIChtZXNzYWdlMSwgMSwKKyAgICAgICAgICAgICAgICAgIHBhdGhfbmFtZXNwYWNlX3Nob3VsZF9tYXRjaF9tZXNzYWdlXzEsCisgICAgICAgICAgICAgICAgICBwYXRoX25hbWVzcGFjZV9zaG91bGRfbm90X21hdGNoX21lc3NhZ2VfMSk7CisgIGNoZWNrX21hdGNoaW5nIChtZXNzYWdlMiwgMiwKKyAgICAgICAgICAgICAgICAgIHBhdGhfbmFtZXNwYWNlX3Nob3VsZF9tYXRjaF9tZXNzYWdlXzIsCisgICAgICAgICAgICAgICAgICBwYXRoX25hbWVzcGFjZV9zaG91bGRfbm90X21hdGNoX21lc3NhZ2VfMik7CisgIGNoZWNrX21hdGNoaW5nIChtZXNzYWdlMywgMywKKyAgICAgICAgICAgICAgICAgIHBhdGhfbmFtZXNwYWNlX3Nob3VsZF9tYXRjaF9tZXNzYWdlXzMsCisgICAgICAgICAgICAgICAgICBwYXRoX25hbWVzcGFjZV9zaG91bGRfbm90X21hdGNoX21lc3NhZ2VfMyk7CisgIGNoZWNrX21hdGNoaW5nIChtZXNzYWdlNCwgNCwKKyAgICAgICAgICAgICAgICAgIHBhdGhfbmFtZXNwYWNlX3Nob3VsZF9tYXRjaF9tZXNzYWdlXzQsCisgICAgICAgICAgICAgICAgICBwYXRoX25hbWVzcGFjZV9zaG91bGRfbm90X21hdGNoX21lc3NhZ2VfNCk7CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlNCk7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZTMpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UyKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlMSk7Cit9CisKK2RidXNfYm9vbF90CitidXNfc2lnbmFsc190ZXN0IChjb25zdCBEQnVzU3RyaW5nICp0ZXN0X2RhdGFfZGlyKQoreworICBCdXNNYXRjaG1ha2VyICptYXRjaG1ha2VyOworCisgIG1hdGNobWFrZXIgPSBidXNfbWF0Y2htYWtlcl9uZXcgKCk7CisgIGJ1c19tYXRjaG1ha2VyX3JlZiAobWF0Y2htYWtlcik7CisgIGJ1c19tYXRjaG1ha2VyX3VucmVmIChtYXRjaG1ha2VyKTsKKyAgYnVzX21hdGNobWFrZXJfdW5yZWYgKG1hdGNobWFrZXIpOworCisgIGlmICghX2RidXNfdGVzdF9vb21faGFuZGxpbmcgKCJwYXJzaW5nIG1hdGNoIHJ1bGVzIiwgdGVzdF9wYXJzaW5nLCBOVUxMKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJQYXJzaW5nIG1hdGNoIHJ1bGVzIHRlc3QgZmFpbGVkIik7CisKKyAgdGVzdF9lcXVhbGl0eSAoKTsKKyAgdGVzdF9tYXRjaGluZyAoKTsKKyAgdGVzdF9wYXRoX21hdGNoaW5nICgpOworICB0ZXN0X21hdGNoaW5nX3BhdGhfbmFtZXNwYWNlICgpOworCisgIHJldHVybiBUUlVFOworfQorCisjZW5kaWYgLyogREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMgKi8KKwpkaWZmIC0tZ2l0IGEvYnVzL3NpZ25hbHMuaCBiL2J1cy9zaWduYWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVkZmIwNwotLS0gL2Rldi9udWxsCisrKyBiL2J1cy9zaWduYWxzLmgKQEAgLTAsMCArMSwxMDggQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogc2lnbmFscy5oICBCdXMgc2lnbmFsIGNvbm5lY3Rpb24gaW1wbGVtZW50YXRpb24KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgIFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpZm5kZWYgQlVTX1NJR05BTFNfSAorI2RlZmluZSBCVVNfU0lHTkFMU19ICisKKyNpbmNsdWRlIDxkYnVzL2RidXMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc3RyaW5nLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXN5c2RlcHMuaD4KKyNpbmNsdWRlICJjb25uZWN0aW9uLmgiCisKK3R5cGVkZWYgZW51bQoreworICBCVVNfTUFUQ0hfTUVTU0FHRV9UWVBFICAgICAgICAgICAgPSAxIDw8IDAsCisgIEJVU19NQVRDSF9JTlRFUkZBQ0UgICAgICAgICAgICAgICA9IDEgPDwgMSwKKyAgQlVTX01BVENIX01FTUJFUiAgICAgICAgICAgICAgICAgID0gMSA8PCAyLAorICBCVVNfTUFUQ0hfU0VOREVSICAgICAgICAgICAgICAgICAgPSAxIDw8IDMsCisgIEJVU19NQVRDSF9ERVNUSU5BVElPTiAgICAgICAgICAgICA9IDEgPDwgNCwKKyAgQlVTX01BVENIX1BBVEggICAgICAgICAgICAgICAgICAgID0gMSA8PCA1LAorICBCVVNfTUFUQ0hfQVJHUyAgICAgICAgICAgICAgICAgICAgPSAxIDw8IDYsCisgIEJVU19NQVRDSF9QQVRIX05BTUVTUEFDRSAgICAgICAgICA9IDEgPDwgNywKKyAgQlVTX01BVENIX0NMSUVOVF9JU19FQVZFU0RST1BQSU5HID0gMSA8PCA4Cit9IEJ1c01hdGNoRmxhZ3M7CisKK0J1c01hdGNoUnVsZSogYnVzX21hdGNoX3J1bGVfbmV3ICAgKERCdXNDb25uZWN0aW9uICptYXRjaGVzX2dvX3RvKTsKK0J1c01hdGNoUnVsZSogYnVzX21hdGNoX3J1bGVfcmVmICAgKEJ1c01hdGNoUnVsZSAgICpydWxlKTsKK3ZvaWQgICAgICAgICAgYnVzX21hdGNoX3J1bGVfdW5yZWYgKEJ1c01hdGNoUnVsZSAgICpydWxlKTsKKworZGJ1c19ib29sX3QgYnVzX21hdGNoX3J1bGVfc2V0X21lc3NhZ2VfdHlwZSAoQnVzTWF0Y2hSdWxlICAgICAqcnVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHR5cGUpOworZGJ1c19ib29sX3QgYnVzX21hdGNoX3J1bGVfc2V0X2ludGVyZmFjZSAgICAoQnVzTWF0Y2hSdWxlICAgICAqcnVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKmludGVyZmFjZSk7CitkYnVzX2Jvb2xfdCBidXNfbWF0Y2hfcnVsZV9zZXRfbWVtYmVyICAgICAgIChCdXNNYXRjaFJ1bGUgICAgICpydWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqbWVtYmVyKTsKK2RidXNfYm9vbF90IGJ1c19tYXRjaF9ydWxlX3NldF9zZW5kZXIgICAgICAgKEJ1c01hdGNoUnVsZSAgICAgKnJ1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICpzZW5kZXIpOworZGJ1c19ib29sX3QgYnVzX21hdGNoX3J1bGVfc2V0X2Rlc3RpbmF0aW9uICAoQnVzTWF0Y2hSdWxlICAgICAqcnVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKmRlc3RpbmF0aW9uKTsKK2RidXNfYm9vbF90IGJ1c19tYXRjaF9ydWxlX3NldF9wYXRoICAgICAgICAgKEJ1c01hdGNoUnVsZSAgICAgKnJ1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICpwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgaXNfbmFtZXNwYWNlKTsKK2RidXNfYm9vbF90IGJ1c19tYXRjaF9ydWxlX3NldF9hcmcgICAgICAgICAgKEJ1c01hdGNoUnVsZSAgICAgKnJ1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBhcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgIGlzX3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICBpc19uYW1lc3BhY2UpOworCisvKiBDYWxsaW5nIHRoaXMgbWV0aG9kcyBhIGNsaWVudCBkZWNsYXJlcyB0aGF0IGl0IGlzIGNyZWF0aW5nIGEgcnVsZSB3aGljaAorICogbmVlZHMgdG8gZWF2ZXNkcm9wIChlLmcuLCBkYnVzLW1vbml0b3IpLCBhbnkgb3RoZXIgY3JlYXRlZCBydWxlcyBub3QKKyAqIHNldHRpbmcgdGhlbXNlbHZlcyBhcyBlYXZlc2Ryb3BwaW5nIHdvbid0IHJlY2VpdmUgYW55IG1lc3NhZ2Ugbm90IGFkZHJlc3NlZAorICogdG8gdGhlbSwgd2hlbiBlYXZlZHJvcCBpcyBlbmFibGVkIGluIHRoZSBwb2xpY3kuICBPbiB0aGUgb3RoZXIgaGFuZCwgd2hlbgorICogZWF2ZWRyb3AgaXMgbm90IGVuYWJsZWQgaW4gcG9saWN5LCB0aGlzIG1ldGhvZCB3b24ndCBoYXZlIGFueSBlZmZlY3QgKi8KK3ZvaWQgYnVzX21hdGNoX3J1bGVfc2V0X2NsaWVudF9pc19lYXZlc2Ryb3BwaW5nIChCdXNNYXRjaFJ1bGUgICAgICpydWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90IGlzX2VhdmVzZHJvcHBpbmcpOworCitkYnVzX2Jvb2xfdCBidXNfbWF0Y2hfcnVsZV9nZXRfY2xpZW50X2lzX2VhdmVzZHJvcHBpbmcgKEJ1c01hdGNoUnVsZSAqcnVsZSk7CisKK0J1c01hdGNoUnVsZSogYnVzX21hdGNoX3J1bGVfcGFyc2UgKERCdXNDb25uZWN0aW9uICAgKm1hdGNoZXNfZ29fdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpydWxlX3RleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcik7CisKKyNpZmRlZiBEQlVTX0VOQUJMRV9TVEFUUworZGJ1c19ib29sX3QgYnVzX21hdGNoX3J1bGVfZHVtcCAoQnVzTWF0Y2htYWtlciAqbWF0Y2htYWtlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpjb25uX2ZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlSXRlciAqYXJyX2l0ZXIpOworI2VuZGlmCisKK0J1c01hdGNobWFrZXIqIGJ1c19tYXRjaG1ha2VyX25ldyAgICh2b2lkKTsKK0J1c01hdGNobWFrZXIqIGJ1c19tYXRjaG1ha2VyX3JlZiAgIChCdXNNYXRjaG1ha2VyICptYXRjaG1ha2VyKTsKK3ZvaWQgICAgICAgICAgIGJ1c19tYXRjaG1ha2VyX3VucmVmIChCdXNNYXRjaG1ha2VyICptYXRjaG1ha2VyKTsKKworZGJ1c19ib29sX3QgYnVzX21hdGNobWFrZXJfYWRkX3J1bGUgICAgICAgICAgICAgKEJ1c01hdGNobWFrZXIgICAqbWF0Y2htYWtlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNNYXRjaFJ1bGUgICAgKnJ1bGUpOworZGJ1c19ib29sX3QgYnVzX21hdGNobWFrZXJfcmVtb3ZlX3J1bGVfYnlfdmFsdWUgKEJ1c01hdGNobWFrZXIgICAqbWF0Y2htYWtlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNNYXRjaFJ1bGUgICAgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAqZXJyb3IpOwordm9pZCAgICAgICAgYnVzX21hdGNobWFrZXJfcmVtb3ZlX3J1bGUgICAgICAgICAgKEJ1c01hdGNobWFrZXIgICAqbWF0Y2htYWtlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNNYXRjaFJ1bGUgICAgKnJ1bGUpOwordm9pZCAgICAgICAgYnVzX21hdGNobWFrZXJfZGlzY29ubmVjdGVkICAgICAgICAgKEJ1c01hdGNobWFrZXIgICAqbWF0Y2htYWtlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAgKmNvbm5lY3Rpb24pOworZGJ1c19ib29sX3QgYnVzX21hdGNobWFrZXJfZ2V0X3JlY2lwaWVudHMgICAgICAgKEJ1c01hdGNobWFrZXIgICAqbWF0Y2htYWtlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNDb25uZWN0aW9ucyAgKmNvbm5lY3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICAqc2VuZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICAqYWRkcmVzc2VkX3JlY2lwaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICAgICAgKipyZWNpcGllbnRzX3ApOworCisjZW5kaWYgLyogQlVTX1NJR05BTFNfSCAqLwpkaWZmIC0tZ2l0IGEvYnVzL3N0YXRzLmMgYi9idXMvc3RhdHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTgyMjU1Ci0tLSAvZGV2L251bGwKKysrIGIvYnVzL3N0YXRzLmMKQEAgLTAsMCArMSwzNDAgQEAKKy8qIHN0YXRzLmMgLSBzdGF0aXN0aWNzIGZyb20gdGhlIGJ1cyBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgwqkgMjAxMS0yMDEyIE5va2lhIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgwqkgMjAxMi0yMDEzIENvbGxhYm9yYSBMdGQuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgInN0YXRzLmgiCisKKyNpbmNsdWRlIDxkYnVzL2RidXMtYXN2LXV0aWwuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtaW50ZXJuYWxzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWNvbm5lY3Rpb24taW50ZXJuYWwuaD4KKworI2luY2x1ZGUgImNvbm5lY3Rpb24uaCIKKyNpbmNsdWRlICJkcml2ZXIuaCIKKyNpbmNsdWRlICJzZXJ2aWNlcy5oIgorI2luY2x1ZGUgInNpZ25hbHMuaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorCisjaWZkZWYgREJVU19FTkFCTEVfU1RBVFMKKworZGJ1c19ib29sX3QKK2J1c19zdGF0c19oYW5kbGVfZ2V0X3N0YXRzIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBCdXNDb250ZXh0ICpjb250ZXh0OworICBCdXNDb25uZWN0aW9ucyAqY29ubmVjdGlvbnM7CisgIERCdXNNZXNzYWdlICpyZXBseSA9IE5VTEw7CisgIERCdXNNZXNzYWdlSXRlciBpdGVyLCBhcnJfaXRlcjsKKyAgc3RhdGljIGRidXNfdWludDMyX3Qgc3RhdHNfc2VyaWFsID0gMDsKKyAgZGJ1c191aW50MzJfdCBpbl91c2UsIGluX2ZyZWVfbGlzdCwgYWxsb2NhdGVkOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIGNvbnRleHQgPSBidXNfdHJhbnNhY3Rpb25fZ2V0X2NvbnRleHQgKHRyYW5zYWN0aW9uKTsKKyAgY29ubmVjdGlvbnMgPSBidXNfY29udGV4dF9nZXRfY29ubmVjdGlvbnMgKGNvbnRleHQpOworCisgIHJlcGx5ID0gX2RidXNfYXN2X25ld19tZXRob2RfcmV0dXJuIChtZXNzYWdlLCAmaXRlciwgJmFycl9pdGVyKTsKKworICBpZiAocmVwbHkgPT0gTlVMTCkKKyAgICBnb3RvIG9vbTsKKworICAvKiBHbG9iYWxzICovCisKKyAgX2RidXNfbGlzdF9nZXRfc3RhdHMgKCZpbl91c2UsICZpbl9mcmVlX2xpc3QsICZhbGxvY2F0ZWQpOworCisgIGlmICghX2RidXNfYXN2X2FkZF91aW50MzIgKCZhcnJfaXRlciwgIlNlcmlhbCIsIHN0YXRzX3NlcmlhbCsrKSB8fAorICAgICAgIV9kYnVzX2Fzdl9hZGRfdWludDMyICgmYXJyX2l0ZXIsICJMaXN0TWVtUG9vbFVzZWRCeXRlcyIsIGluX3VzZSkgfHwKKyAgICAgICFfZGJ1c19hc3ZfYWRkX3VpbnQzMiAoJmFycl9pdGVyLCAiTGlzdE1lbVBvb2xDYWNoZWRCeXRlcyIsIGluX2ZyZWVfbGlzdCkgfHwKKyAgICAgICFfZGJ1c19hc3ZfYWRkX3VpbnQzMiAoJmFycl9pdGVyLCAiTGlzdE1lbVBvb2xBbGxvY2F0ZWRCeXRlcyIsIGFsbG9jYXRlZCkpCisgICAgeworICAgICAgX2RidXNfYXN2X2FiYW5kb24gKCZpdGVyLCAmYXJyX2l0ZXIpOworICAgICAgZ290byBvb207CisgICAgfQorCisgIC8qIENvbm5lY3Rpb25zICovCisKKyAgaWYgKCFfZGJ1c19hc3ZfYWRkX3VpbnQzMiAoJmFycl9pdGVyLCAiQWN0aXZlQ29ubmVjdGlvbnMiLAorICAgICAgICBidXNfY29ubmVjdGlvbnNfZ2V0X25fYWN0aXZlIChjb25uZWN0aW9ucykpIHx8CisgICAgICAhX2RidXNfYXN2X2FkZF91aW50MzIgKCZhcnJfaXRlciwgIkluY29tcGxldGVDb25uZWN0aW9ucyIsCisgICAgICAgIGJ1c19jb25uZWN0aW9uc19nZXRfbl9pbmNvbXBsZXRlIChjb25uZWN0aW9ucykpIHx8CisgICAgICAhX2RidXNfYXN2X2FkZF91aW50MzIgKCZhcnJfaXRlciwgIk1hdGNoUnVsZXMiLAorICAgICAgICBidXNfY29ubmVjdGlvbnNfZ2V0X3RvdGFsX21hdGNoX3J1bGVzIChjb25uZWN0aW9ucykpIHx8CisgICAgICAhX2RidXNfYXN2X2FkZF91aW50MzIgKCZhcnJfaXRlciwgIlBlYWtNYXRjaFJ1bGVzIiwKKyAgICAgICAgYnVzX2Nvbm5lY3Rpb25zX2dldF9wZWFrX21hdGNoX3J1bGVzIChjb25uZWN0aW9ucykpIHx8CisgICAgICAhX2RidXNfYXN2X2FkZF91aW50MzIgKCZhcnJfaXRlciwgIlBlYWtNYXRjaFJ1bGVzUGVyQ29ubmVjdGlvbiIsCisgICAgICAgIGJ1c19jb25uZWN0aW9uc19nZXRfcGVha19tYXRjaF9ydWxlc19wZXJfY29ubiAoY29ubmVjdGlvbnMpKSB8fAorICAgICAgIV9kYnVzX2Fzdl9hZGRfdWludDMyICgmYXJyX2l0ZXIsICJCdXNOYW1lcyIsCisgICAgICAgIGJ1c19jb25uZWN0aW9uc19nZXRfdG90YWxfYnVzX25hbWVzIChjb25uZWN0aW9ucykpIHx8CisgICAgICAhX2RidXNfYXN2X2FkZF91aW50MzIgKCZhcnJfaXRlciwgIlBlYWtCdXNOYW1lcyIsCisgICAgICAgIGJ1c19jb25uZWN0aW9uc19nZXRfcGVha19idXNfbmFtZXMgKGNvbm5lY3Rpb25zKSkgfHwKKyAgICAgICFfZGJ1c19hc3ZfYWRkX3VpbnQzMiAoJmFycl9pdGVyLCAiUGVha0J1c05hbWVzUGVyQ29ubmVjdGlvbiIsCisgICAgICAgIGJ1c19jb25uZWN0aW9uc19nZXRfcGVha19idXNfbmFtZXNfcGVyX2Nvbm4gKGNvbm5lY3Rpb25zKSkpCisgICAgeworICAgICAgX2RidXNfYXN2X2FiYW5kb24gKCZpdGVyLCAmYXJyX2l0ZXIpOworICAgICAgZ290byBvb207CisgICAgfQorCisgIC8qIGVuZCAqLworCisgIGlmICghX2RidXNfYXN2X2Nsb3NlICgmaXRlciwgJmFycl9pdGVyKSkKKyAgICBnb3RvIG9vbTsKKworICBpZiAoIWJ1c190cmFuc2FjdGlvbl9zZW5kX2Zyb21fZHJpdmVyICh0cmFuc2FjdGlvbiwgY29ubmVjdGlvbiwgcmVwbHkpKQorICAgIGdvdG8gb29tOworCisgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworICByZXR1cm4gVFJVRTsKKworb29tOgorICBpZiAocmVwbHkgIT0gTlVMTCkKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKworICBCVVNfU0VUX09PTSAoZXJyb3IpOworICByZXR1cm4gRkFMU0U7Cit9CisKK2RidXNfYm9vbF90CitidXNfc3RhdHNfaGFuZGxlX2dldF9jb25uZWN0aW9uX3N0YXRzIChEQnVzQ29ubmVjdGlvbiAqY2FsbGVyX2Nvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgQnVzRHJpdmVyRm91bmQgZm91bmQ7CisgIERCdXNNZXNzYWdlICpyZXBseSA9IE5VTEw7CisgIERCdXNNZXNzYWdlSXRlciBpdGVyLCBhcnJfaXRlcjsKKyAgc3RhdGljIGRidXNfdWludDMyX3Qgc3RhdHNfc2VyaWFsID0gMDsKKyAgZGJ1c191aW50MzJfdCBpbl9tZXNzYWdlcywgaW5fYnl0ZXMsIGluX2ZkcywgaW5fcGVha19ieXRlcywgaW5fcGVha19mZHM7CisgIGRidXNfdWludDMyX3Qgb3V0X21lc3NhZ2VzLCBvdXRfYnl0ZXMsIG91dF9mZHMsIG91dF9wZWFrX2J5dGVzLCBvdXRfcGVha19mZHM7CisgIERCdXNDb25uZWN0aW9uICpzdGF0c19jb25uZWN0aW9uOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIGZvdW5kID0gYnVzX2RyaXZlcl9nZXRfY29ubl9oZWxwZXIgKGNhbGxlcl9jb25uZWN0aW9uLCBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RhdGlzdGljcyIsIE5VTEwsICZzdGF0c19jb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7CisKKyAgc3dpdGNoIChmb3VuZCkKKyAgICB7CisgICAgICBjYXNlIEJVU19EUklWRVJfRk9VTkRfU0VMRjoKKyAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0lOVkFMSURfQVJHUywKKyAgICAgICAgICAgICAgICAgICAgICAgICJHZXRDb25uZWN0aW9uU3RhdHMgaXMgbm90IG1lYW5pbmdmdWwgZm9yIHRoZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSBidXMgXCIlc1wiIGl0c2VsZiIsIERCVVNfU0VSVklDRV9EQlVTKTsKKyAgICAgICAgZ290byBmYWlsZWQ7CisKKyAgICAgIGNhc2UgQlVTX0RSSVZFUl9GT1VORF9QRUVSOgorICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBCVVNfRFJJVkVSX0ZPVU5EX0VSUk9SOgorICAgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICBfZGJ1c19hc3NlcnQgKHN0YXRzX2Nvbm5lY3Rpb24gIT0gTlVMTCk7CisKKyAgcmVwbHkgPSBfZGJ1c19hc3ZfbmV3X21ldGhvZF9yZXR1cm4gKG1lc3NhZ2UsICZpdGVyLCAmYXJyX2l0ZXIpOworCisgIGlmIChyZXBseSA9PSBOVUxMKQorICAgIGdvdG8gb29tOworCisgIC8qIEJ1cyBkYWVtb24gcGVyLWNvbm5lY3Rpb24gc3RhdHMgKi8KKworICBpZiAoIV9kYnVzX2Fzdl9hZGRfdWludDMyICgmYXJyX2l0ZXIsICJTZXJpYWwiLCBzdGF0c19zZXJpYWwrKykgfHwKKyAgICAgICFfZGJ1c19hc3ZfYWRkX3VpbnQzMiAoJmFycl9pdGVyLCAiTWF0Y2hSdWxlcyIsCisgICAgICAgIGJ1c19jb25uZWN0aW9uX2dldF9uX21hdGNoX3J1bGVzIChzdGF0c19jb25uZWN0aW9uKSkgfHwKKyAgICAgICFfZGJ1c19hc3ZfYWRkX3VpbnQzMiAoJmFycl9pdGVyLCAiUGVha01hdGNoUnVsZXMiLAorICAgICAgICBidXNfY29ubmVjdGlvbl9nZXRfcGVha19tYXRjaF9ydWxlcyAoc3RhdHNfY29ubmVjdGlvbikpIHx8CisgICAgICAhX2RidXNfYXN2X2FkZF91aW50MzIgKCZhcnJfaXRlciwgIkJ1c05hbWVzIiwKKyAgICAgICAgYnVzX2Nvbm5lY3Rpb25fZ2V0X25fc2VydmljZXNfb3duZWQgKHN0YXRzX2Nvbm5lY3Rpb24pKSB8fAorICAgICAgIV9kYnVzX2Fzdl9hZGRfdWludDMyICgmYXJyX2l0ZXIsICJQZWFrQnVzTmFtZXMiLAorICAgICAgICBidXNfY29ubmVjdGlvbl9nZXRfcGVha19idXNfbmFtZXMgKHN0YXRzX2Nvbm5lY3Rpb24pKSB8fAorICAgICAgIV9kYnVzX2Fzdl9hZGRfc3RyaW5nICgmYXJyX2l0ZXIsICJVbmlxdWVOYW1lIiwKKyAgICAgICAgYnVzX2Nvbm5lY3Rpb25fZ2V0X25hbWUgKHN0YXRzX2Nvbm5lY3Rpb24pKSkKKyAgICB7CisgICAgICBfZGJ1c19hc3ZfYWJhbmRvbiAoJml0ZXIsICZhcnJfaXRlcik7CisgICAgICBnb3RvIG9vbTsKKyAgICB9CisKKyAgLyogREJ1c0Nvbm5lY3Rpb24gcGVyLWNvbm5lY3Rpb24gc3RhdHMgKi8KKworICBfZGJ1c19jb25uZWN0aW9uX2dldF9zdGF0cyAoc3RhdHNfY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbl9tZXNzYWdlcywgJmluX2J5dGVzLCAmaW5fZmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluX3BlYWtfYnl0ZXMsICZpbl9wZWFrX2ZkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRfbWVzc2FnZXMsICZvdXRfYnl0ZXMsICZvdXRfZmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dF9wZWFrX2J5dGVzLCAmb3V0X3BlYWtfZmRzKTsKKworICBpZiAoIV9kYnVzX2Fzdl9hZGRfdWludDMyICgmYXJyX2l0ZXIsICJJbmNvbWluZ01lc3NhZ2VzIiwgaW5fbWVzc2FnZXMpIHx8CisgICAgICAhX2RidXNfYXN2X2FkZF91aW50MzIgKCZhcnJfaXRlciwgIkluY29taW5nQnl0ZXMiLCBpbl9ieXRlcykgfHwKKyAgICAgICFfZGJ1c19hc3ZfYWRkX3VpbnQzMiAoJmFycl9pdGVyLCAiSW5jb21pbmdGRHMiLCBpbl9mZHMpIHx8CisgICAgICAhX2RidXNfYXN2X2FkZF91aW50MzIgKCZhcnJfaXRlciwgIlBlYWtJbmNvbWluZ0J5dGVzIiwgaW5fcGVha19ieXRlcykgfHwKKyAgICAgICFfZGJ1c19hc3ZfYWRkX3VpbnQzMiAoJmFycl9pdGVyLCAiUGVha0luY29taW5nRkRzIiwgaW5fcGVha19mZHMpIHx8CisgICAgICAhX2RidXNfYXN2X2FkZF91aW50MzIgKCZhcnJfaXRlciwgIk91dGdvaW5nTWVzc2FnZXMiLCBvdXRfbWVzc2FnZXMpIHx8CisgICAgICAhX2RidXNfYXN2X2FkZF91aW50MzIgKCZhcnJfaXRlciwgIk91dGdvaW5nQnl0ZXMiLCBvdXRfYnl0ZXMpIHx8CisgICAgICAhX2RidXNfYXN2X2FkZF91aW50MzIgKCZhcnJfaXRlciwgIk91dGdvaW5nRkRzIiwgb3V0X2ZkcykgfHwKKyAgICAgICFfZGJ1c19hc3ZfYWRkX3VpbnQzMiAoJmFycl9pdGVyLCAiUGVha091dGdvaW5nQnl0ZXMiLCBvdXRfcGVha19ieXRlcykgfHwKKyAgICAgICFfZGJ1c19hc3ZfYWRkX3VpbnQzMiAoJmFycl9pdGVyLCAiUGVha091dGdvaW5nRkRzIiwgb3V0X3BlYWtfZmRzKSkKKyAgICB7CisgICAgICBfZGJ1c19hc3ZfYWJhbmRvbiAoJml0ZXIsICZhcnJfaXRlcik7CisgICAgICBnb3RvIG9vbTsKKyAgICB9CisKKyAgLyogZW5kICovCisKKyAgaWYgKCFfZGJ1c19hc3ZfY2xvc2UgKCZpdGVyLCAmYXJyX2l0ZXIpKQorICAgIGdvdG8gb29tOworCisgIGlmICghYnVzX3RyYW5zYWN0aW9uX3NlbmRfZnJvbV9kcml2ZXIgKHRyYW5zYWN0aW9uLCBjYWxsZXJfY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHkpKQorICAgIGdvdG8gb29tOworCisgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworICByZXR1cm4gVFJVRTsKKworb29tOgorICBCVVNfU0VUX09PTSAoZXJyb3IpOworICAvKiBmYWxsIHRocm91Z2ggKi8KK2ZhaWxlZDoKKyAgaWYgKHJlcGx5ICE9IE5VTEwpCisgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisKKyAgcmV0dXJuIEZBTFNFOworfQorCisKK2RidXNfYm9vbF90CitidXNfc3RhdHNfaGFuZGxlX2dldF9hbGxfbWF0Y2hfcnVsZXMgKERCdXNDb25uZWN0aW9uICpjYWxsZXJfY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzVHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBCdXNDb250ZXh0ICpjb250ZXh0OworICBEQnVzU3RyaW5nIGJ1c19uYW1lX3N0cjsKKyAgREJ1c01lc3NhZ2UgKnJlcGx5ID0gTlVMTDsKKyAgREJ1c01lc3NhZ2VJdGVyIGl0ZXIsIGhhc2hfaXRlciwgZW50cnlfaXRlciwgYXJyX2l0ZXI7CisgIEJ1c1JlZ2lzdHJ5ICpyZWdpc3RyeTsKKyAgY2hhciAqKnNlcnZpY2VzID0gTlVMTDsKKyAgaW50IHNlcnZpY2VzX2xlbjsKKyAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5fZmlsdGVyID0gTlVMTDsKKyAgQnVzTWF0Y2htYWtlciAqbWF0Y2htYWtlcjsKKyAgaW50IGk7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgcmVnaXN0cnkgPSBidXNfY29ubmVjdGlvbl9nZXRfcmVnaXN0cnkgKGNhbGxlcl9jb25uZWN0aW9uKTsKKyAgY29udGV4dCA9IGJ1c190cmFuc2FjdGlvbl9nZXRfY29udGV4dCAodHJhbnNhY3Rpb24pOworICBtYXRjaG1ha2VyID0gYnVzX2NvbnRleHRfZ2V0X21hdGNobWFrZXIgKGNvbnRleHQpOworCisgIGlmICghYnVzX3JlZ2lzdHJ5X2xpc3Rfc2VydmljZXMgKHJlZ2lzdHJ5LCAmc2VydmljZXMsICZzZXJ2aWNlc19sZW4pKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXBseSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX3JldHVybiAobWVzc2FnZSk7CisgIGlmIChyZXBseSA9PSBOVUxMKQorICAgIGdvdG8gb29tOworCisgIGRidXNfbWVzc2FnZV9pdGVyX2luaXRfYXBwZW5kIChyZXBseSwgJml0ZXIpOworCisgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfb3Blbl9jb250YWluZXIgKCZpdGVyLCBEQlVTX1RZUEVfQVJSQVksICJ7c2FzfSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoYXNoX2l0ZXIpKQorICAgIGdvdG8gb29tOworCisgIGZvciAoaSA9IDAgOyBpIDwgc2VydmljZXNfbGVuIDsgaSsrKQorICAgIHsKKyAgICAgIEJ1c1NlcnZpY2UgKnNlcnZpY2U7CisKKyAgICAgIC8qIFRvIGF2b2lkIGR1cGxpY2F0ZSBlbnRyaWVzLCBvbmx5IGxvb2sgZm9yIHVuaXF1ZSBuYW1lcyAqLworICAgICAgaWYgKHNlcnZpY2VzW2ldWzBdICE9ICc6JykKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmYnVzX25hbWVfc3RyLCBzZXJ2aWNlc1tpXSk7CisgICAgICBzZXJ2aWNlID0gYnVzX3JlZ2lzdHJ5X2xvb2t1cCAocmVnaXN0cnksICZidXNfbmFtZV9zdHIpOworICAgICAgX2RidXNfYXNzZXJ0IChzZXJ2aWNlICE9IE5VTEwpOworCisgICAgICBjb25uX2ZpbHRlciA9IGJ1c19zZXJ2aWNlX2dldF9wcmltYXJ5X293bmVyc19jb25uZWN0aW9uIChzZXJ2aWNlKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoY29ubl9maWx0ZXIgIT0gTlVMTCk7CisKKyAgICAgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfb3Blbl9jb250YWluZXIgKCZoYXNoX2l0ZXIsIERCVVNfVFlQRV9ESUNUX0VOVFJZLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVudHJ5X2l0ZXIpKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfYWJhbmRvbl9jb250YWluZXIgKCZpdGVyLCAmaGFzaF9pdGVyKTsKKyAgICAgICAgICBnb3RvIG9vbTsKKyAgICAgICAgfQorCisgICAgICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYyAoJmVudHJ5X2l0ZXIsIERCVVNfVFlQRV9TVFJJTkcsICZzZXJ2aWNlc1tpXSkpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9hYmFuZG9uX2NvbnRhaW5lciAoJmhhc2hfaXRlciwgJmVudHJ5X2l0ZXIpOworICAgICAgICAgIGRidXNfbWVzc2FnZV9pdGVyX2FiYW5kb25fY29udGFpbmVyICgmaXRlciwgJmhhc2hfaXRlcik7CisgICAgICAgICAgZ290byBvb207CisgICAgICAgIH0KKworICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9vcGVuX2NvbnRhaW5lciAoJmVudHJ5X2l0ZXIsIERCVVNfVFlQRV9BUlJBWSwgInMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFycl9pdGVyKSkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfbWVzc2FnZV9pdGVyX2FiYW5kb25fY29udGFpbmVyICgmaGFzaF9pdGVyLCAmZW50cnlfaXRlcik7CisgICAgICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfYWJhbmRvbl9jb250YWluZXIgKCZpdGVyLCAmaGFzaF9pdGVyKTsKKyAgICAgICAgICBnb3RvIG9vbTsKKyAgICAgICAgfQorCisgICAgICBpZiAoIWJ1c19tYXRjaF9ydWxlX2R1bXAgKG1hdGNobWFrZXIsIGNvbm5fZmlsdGVyLCAmYXJyX2l0ZXIpKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfYWJhbmRvbl9jb250YWluZXIgKCZlbnRyeV9pdGVyLCAmYXJyX2l0ZXIpOworICAgICAgICAgIGRidXNfbWVzc2FnZV9pdGVyX2FiYW5kb25fY29udGFpbmVyICgmaGFzaF9pdGVyLCAmZW50cnlfaXRlcik7CisgICAgICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfYWJhbmRvbl9jb250YWluZXIgKCZpdGVyLCAmaGFzaF9pdGVyKTsKKyAgICAgICAgICBnb3RvIG9vbTsKKyAgICAgICAgfQorCisgICAgICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX2Nsb3NlX2NvbnRhaW5lciAoJmVudHJ5X2l0ZXIsICZhcnJfaXRlcikpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9hYmFuZG9uX2NvbnRhaW5lciAoJmhhc2hfaXRlciwgJmVudHJ5X2l0ZXIpOworICAgICAgICAgIGRidXNfbWVzc2FnZV9pdGVyX2FiYW5kb25fY29udGFpbmVyICgmaXRlciwgJmhhc2hfaXRlcik7CisgICAgICAgICAgZ290byBvb207CisgICAgICAgIH0KKyAgICAgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfY2xvc2VfY29udGFpbmVyICgmaGFzaF9pdGVyLCAmZW50cnlfaXRlcikpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9hYmFuZG9uX2NvbnRhaW5lciAoJml0ZXIsICZoYXNoX2l0ZXIpOworICAgICAgICAgIGdvdG8gb29tOworICAgICAgICB9CisgICAgfQorCisgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfY2xvc2VfY29udGFpbmVyICgmaXRlciwgJmhhc2hfaXRlcikpCisgICAgZ290byBvb207CisKKyAgaWYgKCFidXNfdHJhbnNhY3Rpb25fc2VuZF9mcm9tX2RyaXZlciAodHJhbnNhY3Rpb24sIGNhbGxlcl9jb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBseSkpCisgICAgZ290byBvb207CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgIGRidXNfZnJlZV9zdHJpbmdfYXJyYXkgKHNlcnZpY2VzKTsKKyAgcmV0dXJuIFRSVUU7CisKK29vbToKKyAgaWYgKHJlcGx5ICE9IE5VTEwpCisgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisKKyAgZGJ1c19mcmVlX3N0cmluZ19hcnJheSAoc2VydmljZXMpOworCisgIEJVU19TRVRfT09NIChlcnJvcik7CisgIHJldHVybiBGQUxTRTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9idXMvc3RhdHMuaCBiL2J1cy9zdGF0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjYjAyMmMKLS0tIC9kZXYvbnVsbAorKysgYi9idXMvc3RhdHMuaApAQCAtMCwwICsxLDQzIEBACisvKiBzdGF0cy5oIC0gc3RhdGlzdGljcyBmcm9tIHRoZSBidXMgZHJpdmVyCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBCVVNfU1RBVFNfSAorI2RlZmluZSBCVVNfU1RBVFNfSAorCisjaW5jbHVkZSAiYnVzLmgiCisKKyNkZWZpbmUgQlVTX0lOVEVSRkFDRV9TVEFUUyAib3JnLmZyZWVkZXNrdG9wLkRCdXMuRGVidWcuU3RhdHMiCisKK2RidXNfYm9vbF90IGJ1c19zdGF0c19oYW5kbGVfZ2V0X3N0YXRzIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKTsKKworZGJ1c19ib29sX3QgYnVzX3N0YXRzX2hhbmRsZV9nZXRfY29ubmVjdGlvbl9zdGF0cyAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcik7CisKK2RidXNfYm9vbF90IGJ1c19zdGF0c19oYW5kbGVfZ2V0X2FsbF9tYXRjaF9ydWxlcyAoREJ1c0Nvbm5lY3Rpb24gKmNhbGxlcl9jb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXNUcmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpOworCisjZW5kaWYgLyogbXVsdGlwbGUtaW5jbHVzaW9uIGd1YXJkICovCmRpZmYgLS1naXQgYS9idXMvc3lzdGVtLmNvbmYuaW4gYi9idXMvc3lzdGVtLmNvbmYuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjEzOWI1NQotLS0gL2Rldi9udWxsCisrKyBiL2J1cy9zeXN0ZW0uY29uZi5pbgpAQCAtMCwwICsxLDE0MCBAQAorPCEtLSBUaGlzIGNvbmZpZ3VyYXRpb24gZmlsZSBjb250cm9scyB0aGUgc3lzdGVtd2lkZSBtZXNzYWdlIGJ1cy4KKyAgICAgQWRkIGEgc3lzdGVtLWxvY2FsLmNvbmYgYW5kIGVkaXQgdGhhdCByYXRoZXIgdGhhbiBjaGFuZ2luZyB0aGlzIAorICAgICBmaWxlIGRpcmVjdGx5LiAtLT4KKworPCEtLSBOb3RlIHRoYXQgdGhlcmUgYXJlIGFueSBudW1iZXIgb2Ygd2F5cyB5b3UgY2FuIGhvc2UgeW91cnNlbGYKKyAgICAgc2VjdXJpdHktd2lzZSBieSBzY3Jld2luZyB1cCB0aGlzIGZpbGU7IGluIHBhcnRpY3VsYXIsIHlvdQorICAgICBwcm9iYWJseSBkb24ndCB3YW50IHRvIGxpc3RlbiBvbiBhbnkgbW9yZSBhZGRyZXNzZXMsIGFkZCBhbnkgbW9yZQorICAgICBhdXRoIG1lY2hhbmlzbXMsIHJ1biBhcyBhIGRpZmZlcmVudCB1c2VyLCBldGMuIC0tPgorCis8IURPQ1RZUEUgYnVzY29uZmlnIFBVQkxJQyAiLS8vZnJlZWRlc2t0b3AvL0RURCBELUJ1cyBCdXMgQ29uZmlndXJhdGlvbiAxLjAvL0VOIgorICJodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zdGFuZGFyZHMvZGJ1cy8xLjAvYnVzY29uZmlnLmR0ZCI+Cis8YnVzY29uZmlnPgorCisgIDwhLS0gT3VyIHdlbGwta25vd24gYnVzIHR5cGUsIGRvIG5vdCBjaGFuZ2UgdGhpcyAtLT4KKyAgPHR5cGU+c3lzdGVtPC90eXBlPgorCisgIDwhLS0gUnVuIGFzIHNwZWNpYWwgdXNlciAtLT4KKyAgPHVzZXI+QERCVVNfVVNFUkA8L3VzZXI+CisKKyAgPCEtLSBGb3JrIGludG8gZGFlbW9uIG1vZGUgLS0+CisgIDxmb3JrLz4KKworICA8IS0tIFdlIHVzZSBzeXN0ZW0gc2VydmljZSBsYXVuY2hpbmcgdXNpbmcgYSBoZWxwZXIgLS0+CisgIDxzdGFuZGFyZF9zeXN0ZW1fc2VydmljZWRpcnMvPgorCisgIDwhLS0gVGhpcyBpcyBhIHNldHVpZCBoZWxwZXIgdGhhdCBpcyB1c2VkIHRvIGxhdW5jaCBzeXN0ZW0gc2VydmljZXMgLS0+CisgIDxzZXJ2aWNlaGVscGVyPkBEQlVTX0xJQkVYRUNESVJAL2RidXMtZGFlbW9uLWxhdW5jaC1oZWxwZXI8L3NlcnZpY2VoZWxwZXI+CisKKyAgPCEtLSBXcml0ZSBhIHBpZCBmaWxlIC0tPgorICA8cGlkZmlsZT5AREJVU19TWVNURU1fUElEX0ZJTEVAPC9waWRmaWxlPgorCisgIDwhLS0gRW5hYmxlIGxvZ2dpbmcgdG8gc3lzbG9nIC0tPgorICA8c3lzbG9nLz4KKworICA8IS0tIE9ubHkgYWxsb3cgc29ja2V0LWNyZWRlbnRpYWxzLWJhc2VkIGF1dGhlbnRpY2F0aW9uIC0tPgorICA8YXV0aD5FWFRFUk5BTDwvYXV0aD4KKworICA8IS0tIE9ubHkgbGlzdGVuIG9uIGEgbG9jYWwgc29ja2V0LiAoYWJzdHJhY3Q9L3BhdGgvdG8vc29ja2V0IAorICAgICAgIG1lYW5zIHVzZSBhYnN0cmFjdCBuYW1lc3BhY2UsIGRvbid0IHJlYWxseSBjcmVhdGUgZmlsZXN5c3RlbSAKKyAgICAgICBmaWxlOyBvbmx5IExpbnV4IHN1cHBvcnRzIHRoaXMuIFVzZSBwYXRoPS93aGF0ZXZlciBvbiBvdGhlciAKKyAgICAgICBzeXN0ZW1zLikgLS0+CisgIDxsaXN0ZW4+QERCVVNfU1lTVEVNX0JVU19ERUZBVUxUX0FERFJFU1NAPC9saXN0ZW4+CisKKyAgPHBvbGljeSBjb250ZXh0PSJkZWZhdWx0Ij4KKyAgICA8IS0tIEFsbCB1c2VycyBjYW4gY29ubmVjdCB0byBzeXN0ZW0gYnVzIC0tPgorICAgIDxhbGxvdyB1c2VyPSIqIi8+CisKKyAgICA8IS0tIEhvbGVzIG11c3QgYmUgcHVuY2hlZCBpbiBzZXJ2aWNlIGNvbmZpZ3VyYXRpb24gZmlsZXMgZm9yCisgICAgICAgICBuYW1lIG93bmVyc2hpcCBhbmQgc2VuZGluZyBtZXRob2QgY2FsbHMgLS0+CisgICAgPGRlbnkgb3duPSIqIi8+CisgICAgPGRlbnkgc2VuZF90eXBlPSJtZXRob2RfY2FsbCIvPgorCisgICAgPCEtLSBTaWduYWxzIGFuZCByZXBseSBtZXNzYWdlcyAobWV0aG9kIHJldHVybnMsIGVycm9ycykgYXJlIGFsbG93ZWQKKyAgICAgICAgIGJ5IGRlZmF1bHQgLS0+CisgICAgPGFsbG93IHNlbmRfdHlwZT0ic2lnbmFsIi8+CisgICAgPGFsbG93IHNlbmRfcmVxdWVzdGVkX3JlcGx5PSJ0cnVlIiBzZW5kX3R5cGU9Im1ldGhvZF9yZXR1cm4iLz4KKyAgICA8YWxsb3cgc2VuZF9yZXF1ZXN0ZWRfcmVwbHk9InRydWUiIHNlbmRfdHlwZT0iZXJyb3IiLz4KKworICAgIDwhLS0gQWxsIG1lc3NhZ2VzIG1heSBiZSByZWNlaXZlZCBieSBkZWZhdWx0IC0tPgorICAgIDxhbGxvdyByZWNlaXZlX3R5cGU9Im1ldGhvZF9jYWxsIi8+CisgICAgPGFsbG93IHJlY2VpdmVfdHlwZT0ibWV0aG9kX3JldHVybiIvPgorICAgIDxhbGxvdyByZWNlaXZlX3R5cGU9ImVycm9yIi8+CisgICAgPGFsbG93IHJlY2VpdmVfdHlwZT0ic2lnbmFsIi8+CisKKyAgICA8IS0tIEFsbG93IGFueW9uZSB0byB0YWxrIHRvIHRoZSBtZXNzYWdlIGJ1cyAtLT4KKyAgICA8YWxsb3cgc2VuZF9kZXN0aW5hdGlvbj0ib3JnLmZyZWVkZXNrdG9wLkRCdXMiCisgICAgICAgICAgIHNlbmRfaW50ZXJmYWNlPSJvcmcuZnJlZWRlc2t0b3AuREJ1cyIgLz4KKyAgICA8YWxsb3cgc2VuZF9kZXN0aW5hdGlvbj0ib3JnLmZyZWVkZXNrdG9wLkRCdXMiCisgICAgICAgICAgIHNlbmRfaW50ZXJmYWNlPSJvcmcuZnJlZWRlc2t0b3AuREJ1cy5JbnRyb3NwZWN0YWJsZSIvPgorICAgIDxhbGxvdyBzZW5kX2Rlc3RpbmF0aW9uPSJvcmcuZnJlZWRlc2t0b3AuREJ1cyIKKyAgICAgICAgICAgc2VuZF9pbnRlcmZhY2U9Im9yZy5mcmVlZGVza3RvcC5EQnVzLlByb3BlcnRpZXMiLz4KKyAgICA8IS0tIEJ1dCBkaXNhbGxvdyBzb21lIHNwZWNpZmljIGJ1cyBzZXJ2aWNlcyAtLT4KKyAgICA8ZGVueSBzZW5kX2Rlc3RpbmF0aW9uPSJvcmcuZnJlZWRlc2t0b3AuREJ1cyIKKyAgICAgICAgICBzZW5kX2ludGVyZmFjZT0ib3JnLmZyZWVkZXNrdG9wLkRCdXMiCisgICAgICAgICAgc2VuZF9tZW1iZXI9IlVwZGF0ZUFjdGl2YXRpb25FbnZpcm9ubWVudCIvPgorICAgIDxkZW55IHNlbmRfZGVzdGluYXRpb249Im9yZy5mcmVlZGVza3RvcC5EQnVzIgorICAgICAgICAgIHNlbmRfaW50ZXJmYWNlPSJvcmcuZnJlZWRlc2t0b3AuREJ1cy5EZWJ1Zy5TdGF0cyIvPgorICAgIDxkZW55IHNlbmRfZGVzdGluYXRpb249Im9yZy5mcmVlZGVza3RvcC5EQnVzIgorICAgICAgICAgIHNlbmRfaW50ZXJmYWNlPSJvcmcuZnJlZWRlc2t0b3Auc3lzdGVtZDEuQWN0aXZhdG9yIi8+CisgIDwvcG9saWN5PgorCisgIDwhLS0gT25seSBzeXN0ZW1kLCB3aGljaCBydW5zIGFzIHJvb3QsIG1heSByZXBvcnQgYWN0aXZhdGlvbiBmYWlsdXJlcy4gLS0+CisgIDxwb2xpY3kgdXNlcj0icm9vdCI+CisgICAgPGFsbG93IHNlbmRfZGVzdGluYXRpb249Im9yZy5mcmVlZGVza3RvcC5EQnVzIgorICAgICAgICAgICBzZW5kX2ludGVyZmFjZT0ib3JnLmZyZWVkZXNrdG9wLnN5c3RlbWQxLkFjdGl2YXRvciIvPgorICA8L3BvbGljeT4KKworICA8IS0tIHJvb3QgbWF5IG1vbml0b3IgdGhlIHN5c3RlbSBidXMuIC0tPgorICA8cG9saWN5IHVzZXI9InJvb3QiPgorICAgIDxhbGxvdyBzZW5kX2Rlc3RpbmF0aW9uPSJvcmcuZnJlZWRlc2t0b3AuREJ1cyIKKyAgICAgICAgICAgc2VuZF9pbnRlcmZhY2U9Im9yZy5mcmVlZGVza3RvcC5EQnVzLk1vbml0b3JpbmciLz4KKyAgPC9wb2xpY3k+CisKKyAgPCEtLSBJZiB0aGUgU3RhdHMgaW50ZXJmYWNlIHdhcyBlbmFibGVkIGF0IGNvbXBpbGUtdGltZSwgcm9vdCBtYXkgdXNlIGl0LgorICAgICAgIENvcHkgdGhpcyBpbnRvIHN5c3RlbS5sb2NhbC5jb25mIG9yIHN5c3RlbS5kLyouY29uZiBpZiB5b3Ugd2FudCB0bworICAgICAgIGVuYWJsZSBvdGhlciBwcml2aWxlZ2VkIHVzZXJzIHRvIHZpZXcgc3RhdGlzdGljcyBhbmQgZGVidWcgaW5mbyAtLT4KKyAgPHBvbGljeSB1c2VyPSJyb290Ij4KKyAgICA8YWxsb3cgc2VuZF9kZXN0aW5hdGlvbj0ib3JnLmZyZWVkZXNrdG9wLkRCdXMiCisgICAgICAgICAgIHNlbmRfaW50ZXJmYWNlPSJvcmcuZnJlZWRlc2t0b3AuREJ1cy5EZWJ1Zy5TdGF0cyIvPgorICA8L3BvbGljeT4KKworICA8IS0tIEluY2x1ZGUgbGVnYWN5IGNvbmZpZ3VyYXRpb24gbG9jYXRpb24gLS0+CisgIDxpbmNsdWRlIGlnbm9yZV9taXNzaW5nPSJ5ZXMiPkBTWVNDT05GRElSX0ZST01fUEtHREFUQURJUkAvZGJ1cy0xL3N5c3RlbS5jb25mPC9pbmNsdWRlPgorCisgIDwhLS0gVGhlIGRlZmF1bHRzIGZvciB0aGVzZSBsaW1pdHMgYXJlIGhhcmQtY29kZWQgaW4gZGJ1cy1kYWVtb24uCisgICAgICAgU29tZSBjbGFyaWZpY2F0aW9uczoKKyAgICAgICBUaW1lcyBhcmUgaW4gbWlsbGlzZWNvbmRzIChtcyk7IDEwMDBtcyA9IDEgc2Vjb25kCisgICAgICAgMTMzMTY5MTUyIGJ5dGVzID0gMTI3IE1pQgorICAgICAgIDMzNTU0NDMyIGJ5dGVzID0gMzIgTWlCCisgICAgICAgMTUwMDAwbXMgPSAyLjUgbWludXRlcyAtLT4KKyAgPCEtLSA8bGltaXQgbmFtZT0ibWF4X2luY29taW5nX2J5dGVzIj4xMzMxNjkxNTI8L2xpbWl0PiAtLT4KKyAgPCEtLSA8bGltaXQgbmFtZT0ibWF4X2luY29taW5nX3VuaXhfZmRzIj42NDwvbGltaXQ+IC0tPgorICA8IS0tIDxsaW1pdCBuYW1lPSJtYXhfb3V0Z29pbmdfYnl0ZXMiPjEzMzE2OTE1MjwvbGltaXQ+IC0tPgorICA8IS0tIDxsaW1pdCBuYW1lPSJtYXhfb3V0Z29pbmdfdW5peF9mZHMiPjY0PC9saW1pdD4gLS0+CisgIDwhLS0gPGxpbWl0IG5hbWU9Im1heF9tZXNzYWdlX3NpemUiPjMzNTU0NDMyPC9saW1pdD4gLS0+CisgIDwhLS0gPGxpbWl0IG5hbWU9Im1heF9tZXNzYWdlX3VuaXhfZmRzIj4xNjwvbGltaXQ+IC0tPgorICA8IS0tIDxsaW1pdCBuYW1lPSJzZXJ2aWNlX3N0YXJ0X3RpbWVvdXQiPjI1MDAwPC9saW1pdD4gLS0+CisgIDwhLS0gPGxpbWl0IG5hbWU9ImF1dGhfdGltZW91dCI+NTAwMDwvbGltaXQ+IC0tPgorICA8IS0tIDxsaW1pdCBuYW1lPSJwZW5kaW5nX2ZkX3RpbWVvdXQiPjE1MDAwMDwvbGltaXQ+IC0tPgorICA8IS0tIDxsaW1pdCBuYW1lPSJtYXhfY29tcGxldGVkX2Nvbm5lY3Rpb25zIj4yMDQ4PC9saW1pdD4gLS0+CisgIDwhLS0gPGxpbWl0IG5hbWU9Im1heF9pbmNvbXBsZXRlX2Nvbm5lY3Rpb25zIj42NDwvbGltaXQ+IC0tPgorICA8IS0tIDxsaW1pdCBuYW1lPSJtYXhfY29ubmVjdGlvbnNfcGVyX3VzZXIiPjI1NjwvbGltaXQ+IC0tPgorICA8IS0tIDxsaW1pdCBuYW1lPSJtYXhfcGVuZGluZ19zZXJ2aWNlX3N0YXJ0cyI+NTEyPC9saW1pdD4gLS0+CisgIDwhLS0gPGxpbWl0IG5hbWU9Im1heF9uYW1lc19wZXJfY29ubmVjdGlvbiI+NTEyPC9saW1pdD4gLS0+CisgIDwhLS0gPGxpbWl0IG5hbWU9Im1heF9tYXRjaF9ydWxlc19wZXJfY29ubmVjdGlvbiI+NTEyPC9saW1pdD4gLS0+CisgIDwhLS0gPGxpbWl0IG5hbWU9Im1heF9yZXBsaWVzX3Blcl9jb25uZWN0aW9uIj4xMjg8L2xpbWl0PiAtLT4KKworICA8IS0tIENvbmZpZyBmaWxlcyBhcmUgcGxhY2VkIGhlcmUgdGhhdCBhbW9uZyBvdGhlciB0aGluZ3MsIHB1bmNoIAorICAgICAgIGhvbGVzIGluIHRoZSBhYm92ZSBwb2xpY3kgZm9yIHNwZWNpZmljIHNlcnZpY2VzLiAtLT4KKyAgPGluY2x1ZGVkaXI+c3lzdGVtLmQ8L2luY2x1ZGVkaXI+CisKKyAgPGluY2x1ZGVkaXI+QFNZU0NPTkZESVJfRlJPTV9QS0dEQVRBRElSQC9kYnVzLTEvc3lzdGVtLmQ8L2luY2x1ZGVkaXI+CisKKyAgPCEtLSBUaGlzIGlzIGluY2x1ZGVkIGxhc3Qgc28gbG9jYWwgY29uZmlndXJhdGlvbiBjYW4gb3ZlcnJpZGUgd2hhdCdzIAorICAgICAgIGluIHRoaXMgc3RhbmRhcmQgZmlsZSAtLT4KKyAgPGluY2x1ZGUgaWdub3JlX21pc3Npbmc9InllcyI+QFNZU0NPTkZESVJfRlJPTV9QS0dEQVRBRElSQC9kYnVzLTEvc3lzdGVtLWxvY2FsLmNvbmY8L2luY2x1ZGU+CisKKyAgPGluY2x1ZGUgaWZfc2VsaW51eF9lbmFibGVkPSJ5ZXMiIHNlbGludXhfcm9vdF9yZWxhdGl2ZT0ieWVzIj5jb250ZXh0cy9kYnVzX2NvbnRleHRzPC9pbmNsdWRlPgorCis8L2J1c2NvbmZpZz4KZGlmZiAtLWdpdCBhL2J1cy9zeXN0ZW1kLXVzZXIvZGJ1cy5zZXJ2aWNlLmluIGIvYnVzL3N5c3RlbWQtdXNlci9kYnVzLnNlcnZpY2UuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NlZmZiZQotLS0gL2Rldi9udWxsCisrKyBiL2J1cy9zeXN0ZW1kLXVzZXIvZGJ1cy5zZXJ2aWNlLmluCkBAIC0wLDAgKzEsOCBAQAorW1VuaXRdCitEZXNjcmlwdGlvbj1ELUJ1cyBVc2VyIE1lc3NhZ2UgQnVzCitEb2N1bWVudGF0aW9uPW1hbjpkYnVzLWRhZW1vbigxKQorUmVxdWlyZXM9ZGJ1cy5zb2NrZXQKKworW1NlcnZpY2VdCitFeGVjU3RhcnQ9QEVYUEFOREVEX0JJTkRJUkAvZGJ1cy1kYWVtb24gLS1zZXNzaW9uIC0tYWRkcmVzcz1zeXN0ZW1kOiAtLW5vZm9yayAtLW5vcGlkZmlsZSAtLXN5c3RlbWQtYWN0aXZhdGlvbiAtLXN5c2xvZy1vbmx5CitFeGVjUmVsb2FkPUBFWFBBTkRFRF9CSU5ESVJAL2RidXMtc2VuZCAtLXByaW50LXJlcGx5IC0tc2Vzc2lvbiAtLXR5cGU9bWV0aG9kX2NhbGwgLS1kZXN0PW9yZy5mcmVlZGVza3RvcC5EQnVzIC8gb3JnLmZyZWVkZXNrdG9wLkRCdXMuUmVsb2FkQ29uZmlnCmRpZmYgLS1naXQgYS9idXMvc3lzdGVtZC11c2VyL2RidXMuc29ja2V0LmluIGIvYnVzL3N5c3RlbWQtdXNlci9kYnVzLnNvY2tldC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDRhYzQwCi0tLSAvZGV2L251bGwKKysrIGIvYnVzL3N5c3RlbWQtdXNlci9kYnVzLnNvY2tldC5pbgpAQCAtMCwwICsxLDYgQEAKK1tVbml0XQorRGVzY3JpcHRpb249RC1CdXMgVXNlciBNZXNzYWdlIEJ1cyBTb2NrZXQKKworW1NvY2tldF0KK0xpc3RlblN0cmVhbT0ldC9idXMKK0V4ZWNTdGFydFBvc3Q9LUBTWVNURU1DVExAIC0tdXNlciBzZXQtZW52aXJvbm1lbnQgREJVU19TRVNTSU9OX0JVU19BRERSRVNTPXVuaXg6cGF0aD0ldC9idXMKZGlmZiAtLWdpdCBhL2J1cy9zeXN1c2Vycy5kL2RidXMuY29uZi5pbiBiL2J1cy9zeXN1c2Vycy5kL2RidXMuY29uZi5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjM1NzAyCi0tLSAvZGV2L251bGwKKysrIGIvYnVzL3N5c3VzZXJzLmQvZGJ1cy5jb25mLmluCkBAIC0wLDAgKzEsNSBAQAorIyBzeXN1c2Vycy5kIHNuaXBwZXQgZm9yIGNyZWF0aW5nIHRoZSBELUJ1cyBzeXN0ZW0gdXNlciBhdXRvbWF0aWNhbGx5CisjIGF0IGJvb3Qgb24gc3lzdGVtZC1iYXNlZCBzeXN0ZW1zIHRoYXQgc2hpcCB3aXRoIGFuIHVucG9wdWxhdGVkCisjIC9ldGMuIFNlZSBzeXN1c2Vycy5kKDUpIGZvciBkZXRhaWxzLgorCit1IEBEQlVTX1VTRVJAIC0gIlN5c3RlbSBNZXNzYWdlIEJ1cyIKZGlmZiAtLWdpdCBhL2J1cy90ZXN0LWxhdW5jaC1oZWxwZXIuYyBiL2J1cy90ZXN0LWxhdW5jaC1oZWxwZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODcyYWIyCi0tLSAvZGV2L251bGwKKysrIGIvYnVzL3Rlc3QtbGF1bmNoLWhlbHBlci5jCkBAIC0wLDAgKzEsMTQzIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIHRlc3QtbWFpbi5jICBtYWluKCkgZm9yIHRoZSBPT00gY2hlY2sgb2YgdGhlIGxhdW5jaCBoZWxwZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAidGVzdC5oIgorI2luY2x1ZGUgImFjdGl2YXRpb24taGVscGVyLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1pbnRlcm5hbHMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbWlzYy5oPgorCisjaWYgIWRlZmluZWQoREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMpIHx8ICFkZWZpbmVkKERCVVNfVU5JWCkKKyNlcnJvciBUaGlzIGZpbGUgaXMgb25seSByZWxldmFudCBmb3IgdGhlIGVtYmVkZGVkIHRlc3RzIG9uIFVuaXgKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBkaWUgKGNvbnN0IGNoYXIgKmZhaWx1cmUpIF9EQlVTX0dOVUNfTk9SRVRVUk47CisKK3N0YXRpYyB2b2lkCitkaWUgKGNvbnN0IGNoYXIgKmZhaWx1cmUpCit7CisgIGZwcmludGYgKHN0ZGVyciwgIlVuaXQgdGVzdCBmYWlsZWQ6ICVzXG4iLCBmYWlsdXJlKTsKKyAgZXhpdCAoMSk7Cit9CisKK3N0YXRpYyB2b2lkCitjaGVja19tZW1sZWFrcyAoY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgZGJ1c19zaHV0ZG93biAoKTsKKyAgCisgIHByaW50ZiAoIiVzOiBjaGVja2luZyBmb3IgbWVtbGVha3NcbiIsIG5hbWUpOworICBpZiAoX2RidXNfZ2V0X21hbGxvY19ibG9ja3Nfb3V0c3RhbmRpbmcgKCkgIT0gMCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiJWQgZGJ1c19tYWxsb2MgYmxvY2tzIHdlcmUgbm90IGZyZWVkIiwKKyAgICAgICAgICAgICAgICAgIF9kYnVzX2dldF9tYWxsb2NfYmxvY2tzX291dHN0YW5kaW5nICgpKTsKKyAgICAgIGRpZSAoIm1lbWxlYWtzIik7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAordGVzdF9wb3N0X2hvb2sgKGNvbnN0IGNoYXIgKm5hbWUpCit7CisgIGNoZWNrX21lbWxlYWtzIChuYW1lKTsKK30KKworI2lmZGVmIEFDVElWQVRJT05fTEFVTkNIRVJfRE9fT09NCisKKy8qIHJldHVybnMgdHJ1ZSBpZiBnb29kIHRoaW5ncyBoYXBwZW4sIG9yIGlmIHdlIGdldCBPT00gKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAorYnVzX2FjdGl2YXRpb25faGVscGVyX29vbV90ZXN0ICh2b2lkICpkYXRhKQoreworICBjb25zdCBjaGFyICpzZXJ2aWNlOworICBEQnVzRXJyb3IgZXJyb3I7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKworICBzZXJ2aWNlID0gKGNvbnN0IGNoYXIgKikgZGF0YTsKKyAgcmV0dmFsID0gVFJVRTsKKworICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisgIGlmICghcnVuX2xhdW5jaF9oZWxwZXIgKHNlcnZpY2UsICZlcnJvcikpCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoJmVycm9yKTsKKyAgICAgIC8qIHdlIGZhaWxlZCwgYnV0IGEgT09NIGlzIGdvb2QgKi8KKyAgICAgIGlmICghZGJ1c19lcnJvcl9oYXNfbmFtZSAoJmVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgiRkFJTEVEIFNFTEYgVEVTVDogRXJyb3I6ICVzIiwgZXJyb3IubWVzc2FnZSk7CisgICAgICAgICAgcmV0dmFsID0gRkFMU0U7CisgICAgICAgIH0KKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiB3ZSBzdWNjZWVkZWQsIHlheSEgKi8KKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoJmVycm9yKTsKKyAgICB9CisgIHJldHVybiByZXR2YWw7Cit9CisKKyNlbmRpZgorCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgY29uc3QgY2hhciAqZGlyOworICBEQnVzU3RyaW5nIGNvbmZpZ19maWxlOworCisgIGlmIChhcmdjID4gMSAmJiBzdHJjbXAgKGFyZ3ZbMV0sICItLXRhcCIpICE9IDApCisgICAgZGlyID0gYXJndlsxXTsKKyAgZWxzZQorICAgIGRpciA9IF9kYnVzX2dldGVudiAoIkRCVVNfVEVTVF9EQVRBIik7CisKKyAgaWYgKGRpciA9PSBOVUxMKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIk11c3Qgc3BlY2lmeSB0ZXN0IGRhdGEgZGlyZWN0b3J5IGFzIGFyZ3ZbMV0gb3IgaW4gREJVU19URVNUX0RBVEEgZW52IHZhcmlhYmxlXG4iKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICBwcmludGYgKCIlczogUnVubmluZyBsYXVuY2ggaGVscGVyIE9PTSBjaGVja3NcbiIsIGFyZ3ZbMF0pOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZjb25maWdfZmlsZSkpCisgICAgcmV0dXJuIDE7CisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmNvbmZpZ19maWxlLCBkaXIpKQorICAgIHJldHVybiAxOworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZjb25maWdfZmlsZSwgIi92YWxpZC1jb25maWctZmlsZXMtc3lzdGVtL2RlYnVnLWFsbG93LWFsbC1wYXNzLmNvbmYiKSkKKyAgICByZXR1cm4gMTsKKworICAvKiB1c2UgYSBjb25maWcgZmlsZSB0aGF0IHdpbGwgYWN0dWFsbHkgd29yay4uLiAqLworICBkYnVzX3NldGVudiAoIlRFU1RfTEFVTkNIX0hFTFBFUl9DT05GSUciLAorICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmY29uZmlnX2ZpbGUpKTsKKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmNvbmZpZ19maWxlKTsKKworICBpZiAoIV9kYnVzX3Rlc3Rfb29tX2hhbmRsaW5nICgiZGJ1cy1kYWVtb24tbGF1bmNoLWhlbHBlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1c19hY3RpdmF0aW9uX2hlbHBlcl9vb21fdGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikgIm9yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZUVjaG9TZXJ2aWNlIikpCisgICAgZGllICgiT09NIGZhaWxlZCIpOworCisgIHRlc3RfcG9zdF9ob29rIChhcmd2WzBdKTsKKworICBwcmludGYgKCIlczogU3VjY2Vzc1xuIiwgYXJndlswXSk7CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9idXMvdGVzdC1tYWluLmMgYi9idXMvdGVzdC1tYWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQzZGY4NwotLS0gL2Rldi9udWxsCisrKyBiL2J1cy90ZXN0LW1haW4uYwpAQCAtMCwwICsxLDE5NiBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiB0ZXN0LW1haW4uYyAgbWFpbigpIGZvciBtYWtlIGNoZWNrCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzIFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgInRlc3QuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zdHJpbmcuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc3lzZGVwcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1pbnRlcm5hbHMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbWVzc2FnZS1pbnRlcm5hbC5oPgorI2luY2x1ZGUgInNlbGludXguaCIKKworI2lmbmRlZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworI2Vycm9yIFRoaXMgZmlsZSBpcyBvbmx5IHJlbGV2YW50IGZvciB0aGUgZW1iZWRkZWQgdGVzdHMKKyNlbmRpZgorCisjaWZkZWYgREJVU19VTklYCisjIGluY2x1ZGUgPGRidXMvZGJ1cy1zeXNkZXBzLXVuaXguaD4KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBkaWUgKGNvbnN0IGNoYXIgKmZhaWx1cmUpIF9EQlVTX0dOVUNfTk9SRVRVUk47CisKK3N0YXRpYyB2b2lkCitkaWUgKGNvbnN0IGNoYXIgKmZhaWx1cmUpCit7CisgIGZwcmludGYgKHN0ZGVyciwgIlVuaXQgdGVzdCBmYWlsZWQ6ICVzXG4iLCBmYWlsdXJlKTsKKyAgZXhpdCAoMSk7Cit9CisKK3N0YXRpYyB2b2lkCitjaGVja19tZW1sZWFrcyAoY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgZGJ1c19zaHV0ZG93biAoKTsKKyAgCisgIHByaW50ZiAoIiVzOiBjaGVja2luZyBmb3IgbWVtbGVha3NcbiIsIG5hbWUpOworICBpZiAoX2RidXNfZ2V0X21hbGxvY19ibG9ja3Nfb3V0c3RhbmRpbmcgKCkgIT0gMCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiJWQgZGJ1c19tYWxsb2MgYmxvY2tzIHdlcmUgbm90IGZyZWVkIiwKKyAgICAgICAgICAgICAgICAgIF9kYnVzX2dldF9tYWxsb2NfYmxvY2tzX291dHN0YW5kaW5nICgpKTsKKyAgICAgIGRpZSAoIm1lbWxlYWtzIik7CisgICAgfQorfQorCitzdGF0aWMgREJ1c0luaXRpYWxGRHMgKmluaXRpYWxfZmRzID0gTlVMTDsKKworc3RhdGljIHZvaWQKK3Rlc3RfcHJlX2hvb2sgKHZvaWQpCit7CisgIAorICBpZiAoX2RidXNfZ2V0ZW52ICgiREJVU19URVNUX1NFTElOVVgiKQorICAgICAgJiYgKCFidXNfc2VsaW51eF9wcmVfaW5pdCAoKQorCSAgfHwgIWJ1c19zZWxpbnV4X2Z1bGxfaW5pdCAoKSkpCisgICAgZGllICgiY291bGQgbm90IGluaXQgc2VsaW51eCBzdXBwb3J0Iik7CisKKyAgaW5pdGlhbF9mZHMgPSBfZGJ1c19jaGVja19mZGxlYWtzX2VudGVyICgpOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqcHJvZ25hbWUgPSAiIjsKKworc3RhdGljIHZvaWQKK3Rlc3RfcG9zdF9ob29rICh2b2lkKQoreworICBpZiAoX2RidXNfZ2V0ZW52ICgiREJVU19URVNUX1NFTElOVVgiKSkKKyAgICBidXNfc2VsaW51eF9zaHV0ZG93biAoKTsKKyAgY2hlY2tfbWVtbGVha3MgKHByb2duYW1lKTsKKworICBfZGJ1c19jaGVja19mZGxlYWtzX2xlYXZlIChpbml0aWFsX2Zkcyk7CisgIGluaXRpYWxfZmRzID0gTlVMTDsKK30KKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgIGNvbnN0IGNoYXIgKmRpcjsKKyAgY29uc3QgY2hhciAqb25seTsKKyAgREJ1c1N0cmluZyB0ZXN0X2RhdGFfZGlyOworCisgIHByb2duYW1lID0gYXJndlswXTsKKworICBpZiAoYXJnYyA+IDEgJiYgc3RyY21wIChhcmd2WzFdLCAiLS10YXAiKSAhPSAwKQorICAgIGRpciA9IGFyZ3ZbMV07CisgIGVsc2UKKyAgICBkaXIgPSBfZGJ1c19nZXRlbnYgKCJEQlVTX1RFU1RfREFUQSIpOworCisgIGlmIChhcmdjID4gMikKKyAgICBvbmx5ID0gYXJndlsyXTsKKyAgZWxzZQorICAgIG9ubHkgPSBOVUxMOworCisgIGlmIChkaXIgPT0gTlVMTCkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJNdXN0IHNwZWNpZnkgdGVzdCBkYXRhIGRpcmVjdG9yeSBhcyBhcmd2WzFdIG9yIGluIERCVVNfVEVTVF9EQVRBIGVudiB2YXJpYWJsZVxuIik7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZ0ZXN0X2RhdGFfZGlyLCBkaXIpOworCisjaWZkZWYgREJVU19VTklYCisgIC8qIGNsb3NlIGFueSBpbmhlcml0ZWQgZmRzIHNvIGRidXMtc3Bhd24ncyBjaGVjayBmb3IgY2xvc2Utb24tZXhlYyB3b3JrcyAqLworICBfZGJ1c19jbG9zZV9hbGwgKCk7CisjZW5kaWYKKworICBpZiAoIV9kYnVzX3RocmVhZHNfaW5pdF9kZWJ1ZyAoKSkKKyAgICBkaWUgKCJpbml0aWFsaXppbmcgZGVidWcgdGhyZWFkcyIpOworCisgIGlmIChvbmx5ID09IE5VTEwgfHwgc3RyY21wIChvbmx5LCAiZXhwaXJlLWxpc3QiKSA9PSAwKQorICAgIHsKKyAgICAgIHRlc3RfcHJlX2hvb2sgKCk7CisgICAgICBwcmludGYgKCIlczogUnVubmluZyBleHBpcmUgbGlzdCB0ZXN0XG4iLCBhcmd2WzBdKTsKKyAgICAgIGlmICghYnVzX2V4cGlyZV9saXN0X3Rlc3QgKCZ0ZXN0X2RhdGFfZGlyKSkKKyAgICAgICAgZGllICgiZXhwaXJlIGxpc3QiKTsKKyAgICAgIHRlc3RfcG9zdF9ob29rICgpOworICAgIH0KKworICBpZiAob25seSA9PSBOVUxMIHx8IHN0cmNtcCAob25seSwgImNvbmZpZy1wYXJzZXIiKSA9PSAwKQorICAgIHsKKyAgICAgIHRlc3RfcHJlX2hvb2sgKCk7CisgICAgICBwcmludGYgKCIlczogUnVubmluZyBjb25maWcgZmlsZSBwYXJzZXIgdGVzdFxuIiwgYXJndlswXSk7CisgICAgICBpZiAoIWJ1c19jb25maWdfcGFyc2VyX3Rlc3QgKCZ0ZXN0X2RhdGFfZGlyKSkKKyAgICAgICAgZGllICgicGFyc2VyIik7CisgICAgICB0ZXN0X3Bvc3RfaG9vayAoKTsKKyAgICB9CisKKyAgaWYgKG9ubHkgPT0gTlVMTCB8fCBzdHJjbXAgKG9ubHksICJzaWduYWxzIikgPT0gMCkKKyAgICB7CisgICAgICB0ZXN0X3ByZV9ob29rICgpOworICAgICAgcHJpbnRmICgiJXM6IFJ1bm5pbmcgc2lnbmFscyB0ZXN0XG4iLCBhcmd2WzBdKTsKKyAgICAgIGlmICghYnVzX3NpZ25hbHNfdGVzdCAoJnRlc3RfZGF0YV9kaXIpKQorICAgICAgICBkaWUgKCJzaWduYWxzIik7CisgICAgICB0ZXN0X3Bvc3RfaG9vayAoKTsKKyAgICB9CisKKyAgaWYgKG9ubHkgPT0gTlVMTCB8fCBzdHJjbXAgKG9ubHksICJkaXNwYXRjaC1zaGExIikgPT0gMCkKKyAgICB7CisgICAgICB0ZXN0X3ByZV9ob29rICgpOworICAgICAgcHJpbnRmICgiJXM6IFJ1bm5pbmcgU0hBMSBjb25uZWN0aW9uIHRlc3RcbiIsIGFyZ3ZbMF0pOworICAgICAgaWYgKCFidXNfZGlzcGF0Y2hfc2hhMV90ZXN0ICgmdGVzdF9kYXRhX2RpcikpCisgICAgICAgIGRpZSAoInNoYTEiKTsKKyAgICAgIHRlc3RfcG9zdF9ob29rICgpOworICAgIH0KKworICBpZiAob25seSA9PSBOVUxMIHx8IHN0cmNtcCAob25seSwgImRpc3BhdGNoIikgPT0gMCkKKyAgICB7CisgICAgICB0ZXN0X3ByZV9ob29rICgpOworICAgICAgcHJpbnRmICgiJXM6IFJ1bm5pbmcgbWVzc2FnZSBkaXNwYXRjaCB0ZXN0XG4iLCBhcmd2WzBdKTsKKyAgICAgIGlmICghYnVzX2Rpc3BhdGNoX3Rlc3QgKCZ0ZXN0X2RhdGFfZGlyKSkgCisgICAgICAgIGRpZSAoImRpc3BhdGNoIik7CisgICAgICB0ZXN0X3Bvc3RfaG9vayAoKTsKKyAgICB9CisKKyAgaWYgKG9ubHkgPT0gTlVMTCB8fCBzdHJjbXAgKG9ubHksICJhY3RpdmF0aW9uLXNlcnZpY2UtcmVsb2FkIikgPT0gMCkKKyAgICB7CisgICAgICB0ZXN0X3ByZV9ob29rICgpOworICAgICAgcHJpbnRmICgiJXM6IFJ1bm5pbmcgc2VydmljZSBmaWxlcyByZWxvYWRpbmcgdGVzdFxuIiwgYXJndlswXSk7CisgICAgICBpZiAoIWJ1c19hY3RpdmF0aW9uX3NlcnZpY2VfcmVsb2FkX3Rlc3QgKCZ0ZXN0X2RhdGFfZGlyKSkKKyAgICAgICAgZGllICgic2VydmljZSByZWxvYWQiKTsKKyAgICAgIHRlc3RfcG9zdF9ob29rICgpOworICAgIH0KKworI2lmZGVmIEhBVkVfVU5JWF9GRF9QQVNTSU5HCisgIGlmIChvbmx5ID09IE5VTEwgfHwgc3RyY21wIChvbmx5LCAidW5peC1mZHMtcGFzc2luZyIpID09IDApCisgICAgeworICAgICAgdGVzdF9wcmVfaG9vayAoKTsKKyAgICAgIHByaW50ZiAoIiVzOiBSdW5uaW5nIHVuaXggZmQgcGFzc2luZyB0ZXN0XG4iLCBhcmd2WzBdKTsKKyAgICAgIGlmICghYnVzX3VuaXhfZmRzX3Bhc3NpbmdfdGVzdCAoJnRlc3RfZGF0YV9kaXIpKQorICAgICAgICBkaWUgKCJ1bml4IGZkIHBhc3NpbmciKTsKKyAgICAgIHRlc3RfcG9zdF9ob29rICgpOworICAgIH0KKyNlbmRpZgorCisgIHByaW50ZiAoIiVzOiBTdWNjZXNzXG4iLCBhcmd2WzBdKTsKKworICAKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9idXMvdGVzdC1zeXN0ZW0uYyBiL2J1cy90ZXN0LXN5c3RlbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlMWYwMDMKLS0tIC9kZXYvbnVsbAorKysgYi9idXMvdGVzdC1zeXN0ZW0uYwpAQCAtMCwwICsxLDEwNCBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSIgLSotICovCisvKiB0ZXN0LW1haW4uYyAgbWFpbigpIGZvciBtYWtlIGNoZWNrCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzIFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJ0ZXN0LmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc3RyaW5nLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXN5c2RlcHMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtaW50ZXJuYWxzLmg+CisKKyNpZiAhZGVmaW5lZChEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUykgfHwgIWRlZmluZWQoREJVU19VTklYKQorI2Vycm9yIFRoaXMgZmlsZSBpcyBvbmx5IHJlbGV2YW50IGZvciB0aGUgZW1iZWRkZWQgdGVzdHMgb24gVW5peAorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGRpZSAoY29uc3QgY2hhciAqZmFpbHVyZSkgX0RCVVNfR05VQ19OT1JFVFVSTjsKKworc3RhdGljIHZvaWQKK2RpZSAoY29uc3QgY2hhciAqZmFpbHVyZSkKK3sKKyAgZnByaW50ZiAoc3RkZXJyLCAiVW5pdCB0ZXN0IGZhaWxlZDogJXNcbiIsIGZhaWx1cmUpOworICBleGl0ICgxKTsKK30KKworc3RhdGljIHZvaWQKK2NoZWNrX21lbWxlYWtzIChjb25zdCBjaGFyICpuYW1lKQoreworICBkYnVzX3NodXRkb3duICgpOworCisgIHByaW50ZiAoIiVzOiBjaGVja2luZyBmb3IgbWVtbGVha3NcbiIsIG5hbWUpOworICBpZiAoX2RidXNfZ2V0X21hbGxvY19ibG9ja3Nfb3V0c3RhbmRpbmcgKCkgIT0gMCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiJWQgZGJ1c19tYWxsb2MgYmxvY2tzIHdlcmUgbm90IGZyZWVkIiwKKyAgICAgICAgICAgICAgICAgIF9kYnVzX2dldF9tYWxsb2NfYmxvY2tzX291dHN0YW5kaW5nICgpKTsKKyAgICAgIGRpZSAoIm1lbWxlYWtzIik7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAordGVzdF9wcmVfaG9vayAodm9pZCkKK3sKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKnByb2duYW1lID0gIiI7CitzdGF0aWMgdm9pZAordGVzdF9wb3N0X2hvb2sgKHZvaWQpCit7CisgIGNoZWNrX21lbWxlYWtzIChwcm9nbmFtZSk7Cit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICBjb25zdCBjaGFyICpkaXI7CisgIERCdXNTdHJpbmcgdGVzdF9kYXRhX2RpcjsKKworICBwcm9nbmFtZSA9IGFyZ3ZbMF07CisKKyAgaWYgKGFyZ2MgPiAxICYmIHN0cmNtcCAoYXJndlsxXSwgIi0tdGFwIikgIT0gMCkKKyAgICBkaXIgPSBhcmd2WzFdOworICBlbHNlCisgICAgZGlyID0gX2RidXNfZ2V0ZW52ICgiREJVU19URVNUX0RBVEEiKTsKKworICBpZiAoZGlyID09IE5VTEwpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiTXVzdCBzcGVjaWZ5IHRlc3QgZGF0YSBkaXJlY3RvcnkgYXMgYXJndlsxXSBvciBpbiBEQlVTX1RFU1RfREFUQSBlbnYgdmFyaWFibGVcbiIpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmdGVzdF9kYXRhX2RpciwgZGlyKTsKKworICBpZiAoIV9kYnVzX3RocmVhZHNfaW5pdF9kZWJ1ZyAoKSkKKyAgICBkaWUgKCJpbml0aWFsaXppbmcgZGVidWcgdGhyZWFkcyIpOworCisgIHRlc3RfcHJlX2hvb2sgKCk7CisgIHByaW50ZiAoIiVzOiBSdW5uaW5nIGNvbmZpZyBmaWxlIHBhcnNlciAodHJpdmlhbCkgdGVzdFxuIiwgYXJndlswXSk7CisgIGlmICghYnVzX2NvbmZpZ19wYXJzZXJfdHJpdmlhbF90ZXN0ICgmdGVzdF9kYXRhX2RpcikpCisgICAgZGllICgicGFyc2VyIik7CisgIHRlc3RfcG9zdF9ob29rICgpOworCisgIHByaW50ZiAoIiVzOiBTdWNjZXNzXG4iLCBhcmd2WzBdKTsKKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2J1cy90ZXN0LmMgYi9idXMvdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2OTYwYTMKLS0tIC9kZXYvbnVsbAorKysgYi9idXMvdGVzdC5jCkBAIC0wLDAgKzEsMzE1IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIHRlc3QuYyAgdW5pdCB0ZXN0IHJvdXRpbmVzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzIFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKworI2lmZGVmIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTCisjaW5jbHVkZSAidGVzdC5oIgorI2luY2x1ZGUgPGRidXMvZGJ1cy1pbnRlcm5hbHMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbGlzdC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zeXNkZXBzLmg+CisKKy8qIFRoZSAiZGVidWcgY2xpZW50IiB3YXRjaC90aW1lb3V0IGhhbmRsZXJzIGRvbid0IGRpc3BhdGNoIG1lc3NhZ2VzLAorICogYXMgd2UgbWFudWFsbHkgcHVsbCB0aGVtIGluIG9yZGVyIHRvIHZlcmlmeSB0aGVtLiBUaGlzIGlzIHdoeSB0aGV5CisgKiBhcmUgZGlmZmVyZW50IGZyb20gdGhlIHJlYWwgaGFuZGxlcnMgaW4gY29ubmVjdGlvbi5jCisgKi8KK3N0YXRpYyBEQnVzTGlzdCAqY2xpZW50cyA9IE5VTEw7CitzdGF0aWMgREJ1c0xvb3AgKmNsaWVudF9sb29wID0gTlVMTDsKKworc3RhdGljIGRidXNfYm9vbF90CithZGRfY2xpZW50X3dhdGNoIChEQnVzV2F0Y2ggICAgICAqd2F0Y2gsCisgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAqZGF0YSkKK3sKKyAgcmV0dXJuIF9kYnVzX2xvb3BfYWRkX3dhdGNoIChjbGllbnRfbG9vcCwgd2F0Y2gpOworfQorCitzdGF0aWMgdm9pZAorcmVtb3ZlX2NsaWVudF93YXRjaCAoREJ1c1dhdGNoICAgICAgKndhdGNoLAorICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgKmRhdGEpCit7CisgIF9kYnVzX2xvb3BfcmVtb3ZlX3dhdGNoIChjbGllbnRfbG9vcCwgd2F0Y2gpOworfQorCitzdGF0aWMgdm9pZAordG9nZ2xlX2NsaWVudF93YXRjaCAoREJ1c1dhdGNoICAgICAgKndhdGNoLAorICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgKmRhdGEpCit7CisgIF9kYnVzX2xvb3BfdG9nZ2xlX3dhdGNoIChjbGllbnRfbG9vcCwgd2F0Y2gpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2FkZF9jbGllbnRfdGltZW91dCAoREJ1c1RpbWVvdXQgICAgKnRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICpkYXRhKQoreworICByZXR1cm4gX2RidXNfbG9vcF9hZGRfdGltZW91dCAoY2xpZW50X2xvb3AsIHRpbWVvdXQpOworfQorCitzdGF0aWMgdm9pZAorcmVtb3ZlX2NsaWVudF90aW1lb3V0IChEQnVzVGltZW91dCAgICAqdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgKmRhdGEpCit7CisgIF9kYnVzX2xvb3BfcmVtb3ZlX3RpbWVvdXQgKGNsaWVudF9sb29wLCB0aW1lb3V0KTsKK30KKworc3RhdGljIERCdXNIYW5kbGVyUmVzdWx0CitjbGllbnRfZGlzY29ubmVjdF9maWx0ZXIgKERCdXNDb25uZWN0aW9uICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgKnVzZXJfZGF0YSkKK3sKKyAgaWYgKCFkYnVzX21lc3NhZ2VfaXNfc2lnbmFsIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSU5URVJGQUNFX0xPQ0FMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEaXNjb25uZWN0ZWQiKSkKKyAgICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9OT1RfWUVUX0hBTkRMRUQ7CisKKyAgX2RidXNfdmVyYm9zZSAoIlJlbW92aW5nIGNsaWVudCAlcCBpbiBkaXNjb25uZWN0IGhhbmRsZXJcbiIsCisgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24pOworCisgIF9kYnVzX2xpc3RfcmVtb3ZlICgmY2xpZW50cywgY29ubmVjdGlvbik7CisKKyAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChjb25uZWN0aW9uKTsKKworICBpZiAoY2xpZW50cyA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX2xvb3BfdW5yZWYgKGNsaWVudF9sb29wKTsKKyAgICAgIGNsaWVudF9sb29wID0gTlVMTDsKKyAgICB9CisKKyAgcmV0dXJuIERCVVNfSEFORExFUl9SRVNVTFRfSEFORExFRDsKK30KKworZGJ1c19ib29sX3QKK2J1c19zZXR1cF9kZWJ1Z19jbGllbnQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fYWRkX2ZpbHRlciAoY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50X2Rpc2Nvbm5lY3RfZmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dmFsID0gRkFMU0U7CisKKyAgaWYgKGNsaWVudF9sb29wID09IE5VTEwpCisgICAgeworICAgICAgY2xpZW50X2xvb3AgPSBfZGJ1c19sb29wX25ldyAoKTsKKyAgICAgIGlmIChjbGllbnRfbG9vcCA9PSBOVUxMKQorICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2V0X3dhdGNoX2Z1bmN0aW9ucyAoY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkX2NsaWVudF93YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlX2NsaWVudF93YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9nZ2xlX2NsaWVudF93YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpCisgICAgZ290byBvdXQ7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2V0X3RpbWVvdXRfZnVuY3Rpb25zIChjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZF9jbGllbnRfdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVfY2xpZW50X3RpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLCBOVUxMKSkKKyAgICBnb3RvIG91dDsKKworICBpZiAoIV9kYnVzX2xpc3RfYXBwZW5kICgmY2xpZW50cywgY29ubmVjdGlvbikpCisgICAgZ290byBvdXQ7CisKKyAgcmV0dmFsID0gVFJVRTsKKworIG91dDoKKyAgaWYgKCFyZXR2YWwpCisgICAgeworICAgICAgZGJ1c19jb25uZWN0aW9uX3JlbW92ZV9maWx0ZXIgKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50X2Rpc2Nvbm5lY3RfZmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworCisgICAgICBkYnVzX2Nvbm5lY3Rpb25fc2V0X3dhdGNoX2Z1bmN0aW9ucyAoY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICAgIGRidXNfY29ubmVjdGlvbl9zZXRfdGltZW91dF9mdW5jdGlvbnMgKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKKworICAgICAgX2RidXNfbGlzdF9yZW1vdmVfbGFzdCAoJmNsaWVudHMsIGNvbm5lY3Rpb24pOworCisgICAgICBpZiAoY2xpZW50cyA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfbG9vcF91bnJlZiAoY2xpZW50X2xvb3ApOworICAgICAgICAgIGNsaWVudF9sb29wID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICByZXR1cm4gcmV0dmFsOworfQorCit2b2lkCitidXNfdGVzdF9jbGllbnRzX2ZvcmVhY2ggKEJ1c0Nvbm5lY3Rpb25Gb3JlYWNoRnVuY3Rpb24gIGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhKQoreworICBEQnVzTGlzdCAqbGluazsKKworICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJmNsaWVudHMpOworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uID0gbGluay0+ZGF0YTsKKyAgICAgIERCdXNMaXN0ICpuZXh0ID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmY2xpZW50cywgbGluayk7CisKKyAgICAgIGlmICghKCogZnVuY3Rpb24pIChjb25uZWN0aW9uLCBkYXRhKSkKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGxpbmsgPSBuZXh0OworICAgIH0KK30KKworZGJ1c19ib29sX3QKK2J1c190ZXN0X2NsaWVudF9saXN0ZWQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBEQnVzTGlzdCAqbGluazsKKworICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJmNsaWVudHMpOworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIERCdXNDb25uZWN0aW9uICpjID0gbGluay0+ZGF0YTsKKyAgICAgIERCdXNMaXN0ICpuZXh0ID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmY2xpZW50cywgbGluayk7CisKKyAgICAgIGlmIChjID09IGNvbm5lY3Rpb24pCisgICAgICAgIHJldHVybiBUUlVFOworCisgICAgICBsaW5rID0gbmV4dDsKKyAgICB9CisKKyAgcmV0dXJuIEZBTFNFOworfQorCit2b2lkCitidXNfdGVzdF9ydW5fY2xpZW50c19sb29wIChkYnVzX2Jvb2xfdCBibG9ja19vbmNlKQoreworICBpZiAoY2xpZW50X2xvb3AgPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAgX2RidXNfdmVyYm9zZSAoIi0tLT4gRGlzcGF0Y2hpbmcgb24gXCJjbGllbnQgc2lkZVwiXG4iKTsKKworICAvKiBkaXNwYXRjaCBiZWZvcmUgd2UgYmxvY2sgc28gcGVuZGluZyBkaXNwYXRjaGVzCisgICAqIHdvbid0IG1ha2Ugb3VyIGJsb2NrIHJldHVybiBlYXJseQorICAgKi8KKyAgX2RidXNfbG9vcF9kaXNwYXRjaCAoY2xpZW50X2xvb3ApOworCisgIC8qIERvIG9uZSBibG9ja2luZyB3YWl0LCBzaW5jZSB3ZSdyZSBleHBlY3RpbmcgZGF0YSAqLworICBpZiAoYmxvY2tfb25jZSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiLS0tPiBibG9ja2luZyBvbiBcImNsaWVudCBzaWRlXCJcbiIpOworICAgICAgX2RidXNfbG9vcF9pdGVyYXRlIChjbGllbnRfbG9vcCwgVFJVRSk7CisgICAgfQorCisgIC8qIFRoZW4gbW9wIGV2ZXJ5dGhpbmcgdXAgKi8KKyAgd2hpbGUgKF9kYnVzX2xvb3BfaXRlcmF0ZSAoY2xpZW50X2xvb3AsIEZBTFNFKSkKKyAgICA7CisKKyAgX2RidXNfdmVyYm9zZSAoIi0tLT4gRG9uZSBkaXNwYXRjaGluZyBvbiBcImNsaWVudCBzaWRlXCJcbiIpOworfQorCit2b2lkCitidXNfdGVzdF9ydW5fYnVzX2xvb3AgKEJ1c0NvbnRleHQgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90IGJsb2NrX29uY2UpCit7CisgIF9kYnVzX3ZlcmJvc2UgKCItLS0+IERpc3BhdGNoaW5nIG9uIFwic2VydmVyIHNpZGVcIlxuIik7CisKKyAgLyogZGlzcGF0Y2ggYmVmb3JlIHdlIGJsb2NrIHNvIHBlbmRpbmcgZGlzcGF0Y2hlcworICAgKiB3b24ndCBtYWtlIG91ciBibG9jayByZXR1cm4gZWFybHkKKyAgICovCisgIF9kYnVzX2xvb3BfZGlzcGF0Y2ggKGJ1c19jb250ZXh0X2dldF9sb29wIChjb250ZXh0KSk7CisKKyAgLyogRG8gb25lIGJsb2NraW5nIHdhaXQsIHNpbmNlIHdlJ3JlIGV4cGVjdGluZyBkYXRhICovCisgIGlmIChibG9ja19vbmNlKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCItLS0+IGJsb2NraW5nIG9uIFwic2VydmVyIHNpZGVcIlxuIik7CisgICAgICBfZGJ1c19sb29wX2l0ZXJhdGUgKGJ1c19jb250ZXh0X2dldF9sb29wIChjb250ZXh0KSwgVFJVRSk7CisgICAgfQorCisgIC8qIFRoZW4gbW9wIGV2ZXJ5dGhpbmcgdXAgKi8KKyAgd2hpbGUgKF9kYnVzX2xvb3BfaXRlcmF0ZSAoYnVzX2NvbnRleHRfZ2V0X2xvb3AgKGNvbnRleHQpLCBGQUxTRSkpCisgICAgOworCisgIF9kYnVzX3ZlcmJvc2UgKCItLS0+IERvbmUgZGlzcGF0Y2hpbmcgb24gXCJzZXJ2ZXIgc2lkZVwiXG4iKTsKK30KKwordm9pZAorYnVzX3Rlc3RfcnVuX2V2ZXJ5dGhpbmcgKEJ1c0NvbnRleHQgKmNvbnRleHQpCit7CisgIHdoaWxlIChfZGJ1c19sb29wX2l0ZXJhdGUgKGJ1c19jb250ZXh0X2dldF9sb29wIChjb250ZXh0KSwgRkFMU0UpIHx8CisgICAgICAgICAoY2xpZW50X2xvb3AgPT0gTlVMTCB8fCBfZGJ1c19sb29wX2l0ZXJhdGUgKGNsaWVudF9sb29wLCBGQUxTRSkpKQorICAgIDsKK30KKworQnVzQ29udGV4dCoKK2J1c19jb250ZXh0X25ld190ZXN0IChjb25zdCBEQnVzU3RyaW5nICp0ZXN0X2RhdGFfZGlyLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKmZpbGVuYW1lKQoreworICBEQnVzRXJyb3IgZXJyb3I7CisgIERCdXNTdHJpbmcgY29uZmlnX2ZpbGU7CisgIERCdXNTdHJpbmcgcmVsYXRpdmU7CisgIEJ1c0NvbnRleHQgKmNvbnRleHQ7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmNvbmZpZ19maWxlKSkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiTm8gbWVtb3J5Iik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAodGVzdF9kYXRhX2RpciwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbmZpZ19maWxlLCAwKSkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiTm8gbWVtb3J5Iik7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmNvbmZpZ19maWxlKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnJlbGF0aXZlLCBmaWxlbmFtZSk7CisKKyAgaWYgKCFfZGJ1c19jb25jYXRfZGlyX2FuZF9maWxlICgmY29uZmlnX2ZpbGUsICZyZWxhdGl2ZSkpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIk5vIG1lbW9yeSIpOworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZjb25maWdfZmlsZSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworICBjb250ZXh0ID0gYnVzX2NvbnRleHRfbmV3ICgmY29uZmlnX2ZpbGUsIEJVU19DT05URVhUX0ZMQUdfTk9ORSwgTlVMTCwgTlVMTCwgTlVMTCwgJmVycm9yKTsKKyAgaWYgKGNvbnRleHQgPT0gTlVMTCkKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUICgmZXJyb3IpOworCisgICAgICBfZGJ1c193YXJuICgiRmFpbGVkIHRvIGNyZWF0ZSBkZWJ1ZyBidXMgY29udGV4dCBmcm9tIGNvbmZpZ3VyYXRpb24gZmlsZSAlczogJXMiLAorICAgICAgICAgICAgICAgICAgZmlsZW5hbWUsIGVycm9yLm1lc3NhZ2UpOworCisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmY29uZmlnX2ZpbGUpOworCisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZjb25maWdfZmlsZSk7CisKKyAgcmV0dXJuIGNvbnRleHQ7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYnVzL3Rlc3QuaCBiL2J1cy90ZXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhiNzRlOAotLS0gL2Rldi9udWxsCisrKyBiL2J1cy90ZXN0LmgKQEAgLTAsMCArMSw1NyBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiB0ZXN0LmggIHVuaXQgdGVzdCByb3V0aW5lcworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpZm5kZWYgQlVTX1RFU1RfSAorI2RlZmluZSBCVVNfVEVTVF9ICisKKyNpZmRlZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXN0cmluZy5oPgorI2luY2x1ZGUgImNvbm5lY3Rpb24uaCIKKworZGJ1c19ib29sX3QgYnVzX2Rpc3BhdGNoX3Rlc3QgICAgICAgICAoY29uc3QgREJ1c1N0cmluZyAgICAgICAgICAgICAqdGVzdF9kYXRhX2Rpcik7CitkYnVzX2Jvb2xfdCBidXNfZGlzcGF0Y2hfc2hhMV90ZXN0ICAgIChjb25zdCBEQnVzU3RyaW5nICAgICAgICAgICAgICp0ZXN0X2RhdGFfZGlyKTsKK2RidXNfYm9vbF90IGJ1c19jb25maWdfcGFyc2VyX3Rlc3QgICAgKGNvbnN0IERCdXNTdHJpbmcgICAgICAgICAgICAgKnRlc3RfZGF0YV9kaXIpOworZGJ1c19ib29sX3QgYnVzX2NvbmZpZ19wYXJzZXJfdHJpdmlhbF90ZXN0IChjb25zdCBEQnVzU3RyaW5nICAgICAgICAqdGVzdF9kYXRhX2Rpcik7CitkYnVzX2Jvb2xfdCBidXNfc2lnbmFsc190ZXN0ICAgICAgICAgIChjb25zdCBEQnVzU3RyaW5nICAgICAgICAgICAgICp0ZXN0X2RhdGFfZGlyKTsKK2RidXNfYm9vbF90IGJ1c19leHBpcmVfbGlzdF90ZXN0ICAgICAgKGNvbnN0IERCdXNTdHJpbmcgICAgICAgICAgICAgKnRlc3RfZGF0YV9kaXIpOworZGJ1c19ib29sX3QgYnVzX2FjdGl2YXRpb25fc2VydmljZV9yZWxvYWRfdGVzdCAoY29uc3QgREJ1c1N0cmluZyAgICAqdGVzdF9kYXRhX2Rpcik7CitkYnVzX2Jvb2xfdCBidXNfc2V0dXBfZGVidWdfY2xpZW50ICAgIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAgICpjb25uZWN0aW9uKTsKK3ZvaWQgICAgICAgIGJ1c190ZXN0X2NsaWVudHNfZm9yZWFjaCAgKEJ1c0Nvbm5lY3Rpb25Gb3JlYWNoRnVuY3Rpb24gIGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSk7CitkYnVzX2Jvb2xfdCBidXNfdGVzdF9jbGllbnRfbGlzdGVkICAgIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAgICpjb25uZWN0aW9uKTsKK3ZvaWQgICAgICAgIGJ1c190ZXN0X3J1bl9idXNfbG9vcCAgICAgKEJ1c0NvbnRleHQgICAgICAgICAgICAgICAgICAgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICAgICAgICAgICAgICBibG9jayk7Cit2b2lkICAgICAgICBidXNfdGVzdF9ydW5fY2xpZW50c19sb29wIChkYnVzX2Jvb2xfdCAgICAgICAgICAgICAgICAgICBibG9jayk7Cit2b2lkICAgICAgICBidXNfdGVzdF9ydW5fZXZlcnl0aGluZyAgIChCdXNDb250ZXh0ICAgICAgICAgICAgICAgICAgICpjb250ZXh0KTsKK0J1c0NvbnRleHQqIGJ1c19jb250ZXh0X25ld190ZXN0ICAgICAgKGNvbnN0IERCdXNTdHJpbmcgICAgICAgICAgICAgKnRlc3RfZGF0YV9kaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAgICAgICAgICAgICpmaWxlbmFtZSk7CisKKyNpZmRlZiBIQVZFX1VOSVhfRkRfUEFTU0lORworZGJ1c19ib29sX3QgYnVzX3VuaXhfZmRzX3Bhc3NpbmdfdGVzdCAoY29uc3QgREJ1c1N0cmluZyAgICAgICAgICAgICAqdGVzdF9kYXRhX2Rpcik7CisjZW5kaWYKKworI2VuZGlmCisKKyNlbmRpZiAvKiBCVVNfVEVTVF9IICovCmRpZmYgLS1naXQgYS9idXMvdG1wZmlsZXMuZC9kYnVzLmNvbmYuaW4gYi9idXMvdG1wZmlsZXMuZC9kYnVzLmNvbmYuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVjN2RlMAotLS0gL2Rldi9udWxsCisrKyBiL2J1cy90bXBmaWxlcy5kL2RidXMuY29uZi5pbgpAQCAtMCwwICsxLDkgQEAKKyMgRmllbGRzOiB0eXBlOyBwYXRoOyBtb2RlOyB1aWQ7IGdpZDsgYWdlOyBhcmd1bWVudCAoc3ltbGluayB0YXJnZXQpCisKKyMgTWFrZSAke2xvY2Fsc3RhdGVkaXJ9L2xpYi9kYnVzIChyZXF1aXJlZCBmb3Igc3lzdGVtZCA8IDIzNykKKyMgQWRqdXN0IG1vZGUgYW5kIG93bmVyc2hpcCBpZiBpdCBhbHJlYWR5IGV4aXN0cy4KK2QgQEVYUEFOREVEX0xPQ0FMU1RBVEVESVJAL2xpYi9kYnVzIDA3NTUgLSAtIC0KKworIyBNYWtlICR7bG9jYWxzdGF0ZWRpcn0vbGliL2RidXMvbWFjaGluZS1pZCBhIHN5bWxpbmsgdG8gL2V0Yy9tYWNoaW5lLWlkCisjIGlmIGl0IGRvZXMgbm90IGFscmVhZHkgZXhpc3QKK0wgQEVYUEFOREVEX0xPQ0FMU1RBVEVESVJAL2xpYi9kYnVzL21hY2hpbmUtaWQgLSAtIC0gLSAvZXRjL21hY2hpbmUtaWQKZGlmZiAtLWdpdCBhL2J1cy91dGlscy5jIGIvYnVzL3V0aWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2QyNDg3MgotLS0gL2Rldi9udWxsCisrKyBiL2J1cy91dGlscy5jCkBAIC0wLDAgKzEsNDggQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogdXRpbHMuYyAgR2VuZXJhbCB1dGlsaXR5IGZ1bmN0aW9ucworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgQ29kZUZhY3RvcnkgQUIKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAidXRpbHMuaCIKKyNpbmNsdWRlIDxkYnVzL2RidXMtc3lzZGVwcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1tYWlubG9vcC5oPgorCitjb25zdCBjaGFyIGJ1c19ub19tZW1vcnlfbWVzc2FnZVtdID0gIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUgaW4gbWVzc2FnZSBidXMiOworCit2b2lkCitidXNfY29ubmVjdGlvbl9kaXNwYXRjaF9hbGxfbWVzc2FnZXMgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICB3aGlsZSAoYnVzX2Nvbm5lY3Rpb25fZGlzcGF0Y2hfb25lX21lc3NhZ2UgKGNvbm5lY3Rpb24pKQorICAgIDsKK30KKworZGJ1c19ib29sX3QKK2J1c19jb25uZWN0aW9uX2Rpc3BhdGNoX29uZV9tZXNzYWdlICAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIERCdXNEaXNwYXRjaFN0YXR1cyBzdGF0dXM7CisKKyAgd2hpbGUgKChzdGF0dXMgPSBkYnVzX2Nvbm5lY3Rpb25fZGlzcGF0Y2ggKGNvbm5lY3Rpb24pKSA9PSBEQlVTX0RJU1BBVENIX05FRURfTUVNT1JZKQorICAgIF9kYnVzX3dhaXRfZm9yX21lbW9yeSAoKTsKKyAgCisgIHJldHVybiBzdGF0dXMgPT0gREJVU19ESVNQQVRDSF9EQVRBX1JFTUFJTlM7Cit9CmRpZmYgLS1naXQgYS9idXMvdXRpbHMuaCBiL2J1cy91dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1MzM4OTUKLS0tIC9kZXYvbnVsbAorKysgYi9idXMvdXRpbHMuaApAQCAtMCwwICsxLDM2IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIHV0aWxzLmggIEdlbmVyYWwgdXRpbGl0eSBmdW5jdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgIENvZGVGYWN0b3J5IEFCCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgIFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBCVVNfVVRJTFNfSAorI2RlZmluZSBCVVNfVVRJTFNfSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLmg+CisKK2V4dGVybiBjb25zdCBjaGFyIGJ1c19ub19tZW1vcnlfbWVzc2FnZVtdOworI2RlZmluZSBCVVNfU0VUX09PTShlcnJvcikgZGJ1c19zZXRfZXJyb3JfY29uc3QgKChlcnJvciksIERCVVNfRVJST1JfTk9fTUVNT1JZLCBidXNfbm9fbWVtb3J5X21lc3NhZ2UpCisKK3ZvaWQgICAgICAgIGJ1c19jb25uZWN0aW9uX2Rpc3BhdGNoX2FsbF9tZXNzYWdlcyAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOworZGJ1c19ib29sX3QgYnVzX2Nvbm5lY3Rpb25fZGlzcGF0Y2hfb25lX21lc3NhZ2UgIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbik7CisKKyNlbmRpZiAvKiBCVVNfVVRJTFNfSCAqLwpkaWZmIC0tZ2l0IGEvY2xlYW51cC1tYW4tcGFnZXMuc2ggYi9jbGVhbnVwLW1hbi1wYWdlcy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yM2U5OGE2Ci0tLSAvZGV2L251bGwKKysrIGIvY2xlYW51cC1tYW4tcGFnZXMuc2gKQEAgLTAsMCArMSw4NiBAQAorIyEgL2Jpbi9zaAorCisjIyBUaGlzIHNjcmlwdCBjbGVhbnMgdXAgcHJpdmF0ZS9pbnRlcm5hbCBBUEkgZnJvbSB0aGUgbWFuIHBhZ2VzCisjIyBnZW5lcmF0ZWQgYnkgRG94eWdlbi4gIFRoaXMgYnJpbmdzIHRoZSBtYW4gcGFnZXMgZG93biBmcm9tIDcgbWVncworIyMgdG8gMiBtZWdzIGFuZCBhdm9pZHMgbmFtZXNwYWNlLXBvbGx1dGluZyBtYW4gcGFnZXMuICBJdCdzIHByb2JhYmx5CisjIyBwcmV0dHkgc3BlY2lmaWMgdG8gR05VIHV0aWxpdGllcy4gUGF0Y2hlcyBnbGFkbHkgYWNjZXB0ZWQgdG8gbWFrZQorIyMgaXQgd29yayB3aXRob3V0IHRoZW0uCisKKyMjIFlvdSB3b3VsZCBydW4gdGhpcyBhZnRlciBidWlsZGluZyBkYnVzIGFuZCBhZnRlciBydW5uaW5nICJkb3h5Z2VuCisjIyBEb3h5ZmlsZSIKKworZGllKCkgeworICAgIGVjaG8gIiQqIiAxPiYyCisgICAgZXhpdCAxCit9CisKK01BTkRJUj0kMQoraWYgdGVzdCB4IiRNQU5ESVIiID0geCA7IHRoZW4KKyAgICBNQU5ESVI9ZG9jL2FwaS9tYW4vbWFuM2RidXMKK2ZpCisKK2NkICIkTUFORElSIiB8fCBkaWUgIkNvdWxkIG5vdCBjZCB0byAkTUFORElSIgorCit0ZXN0IC1kIGtlZXAgfHwgbWtkaXIga2VlcCB8fCBkaWUgIkNvdWxkIG5vdCBjcmVhdGUgJE1BTkRJUi9rZWVwIGRpcmVjdG9yeSIKK3Rlc3QgLWQgbnVrZSB8fCBta2RpciBudWtlIHx8IGRpZSAiQ291bGQgbm90IGNyZWF0ZSAkTUFORElSL251a2UgZGlyZWN0b3J5IgorCisjIyBibGFja2xpc3QKKyhmaW5kIC4gLW1heGRlcHRoIDEgLW5hbWUgIl8qIiB8IHhhcmdzIC1JIElURU1TIC9iaW4vbXYgSVRFTVMgbnVrZSkgfHwgZGllICJjb3VsZCBub3QgbW92ZSBhbGwgdW5kZXJzY29yZS1wcmVmaXhlZCBpdGVtcyIKKyhmaW5kIC4gLW1heGRlcHRoIDEgLW5hbWUgIkRCdXMqSW50ZXJuYWwqIiB8IHhhcmdzIC1JIElURU1TIC9iaW4vbXYgSVRFTVMgbnVrZSkgfHwgZGllICJjb3VsZCBub3QgbW92ZSBhbGwgaW50ZXJuYWwtY29udGFpbmluZyBpdGVtcyIKKyhmaW5kIC4gLW1heGRlcHRoIDEgLW5hbWUgImRidXNfKl9pbnRlcm5hbF8qIiB8IHhhcmdzIC1JIElURU1TIC9iaW4vbXYgSVRFTVMgbnVrZSkgfHwgZGllICJjb3VsZCBub3QgbW92ZSBhbGwgaW50ZXJuYWwtY29udGFpbmluZyBpdGVtcyIKKworIyMgdGhpcyBpcyBraW5kIG9mIHVubWFpbnRhaW5hYmxlLCBidXQgSSBndWVzcyBpdCdzIG5vIGh1Z2UgZGlzYXN0ZXIgaWYgd2UgbWlzcyBzb21ldGhpbmcuCisjIyB0aGlzIGxpc3Qgc2hvdWxkIG9ubHkgY29udGFpbiBtYW4gcGFnZXMgd2l0aCA+MSBsaW5lLCBpLmUuIHdpdGggcmVhbCBjb250ZW50OyB0aGUgCisjIyBvbmUtbGluZSBjcm9zcy1yZWZlcmVuY2VzIGdldCBjbGVhbmVkIHVwIG5leHQuCitmb3IgSSBpbiBEQnVzQ291bnRlci4qIERCdXNDcmVkZW50aWFscy4qIERCdXNEYXRhU2xvdC4qIERCdXNEYXRhU2xvdEFsbG9jYXRvci4qIERCdXNEYXRhU2xvdExpc3QuKiBcCisgICAgREJ1c0Rpckl0ZXIuKiBEQnVzRmFrZU11dGV4LiogREJ1c0ZyZWVkRWxlbWVudC4qIERCdXNHcm91cEluZm8uKiBEQnVzR1VJRC4qIERCdXNIYXNoRW50cnkuKiBcCisgICAgREJ1c0hhc2hJdGVyLiogREJ1c0hhc2hUYWJsZS4qIERCdXNIZWFkZXIuKiBEQnVzSGVhZGVyRmllbGQuKiBEQnVzS2V5LiogREJ1c0tleXJpbmcuKiBEQnVzTGlzdC4qIFwKKyAgICBEQnVzTWFyc2hhbC4qIERCdXNNRDUqIERCdXNNZW1CbG9jay4qIERCdXNNZW1Qb29sLiogREJ1c01lc3NhZ2VHZW5lcmF0b3IuKiBEQnVzTWVzc2FnZUxvYWRlci4qIFwKKyAgICBEQnVzTWVzc2FnZVJlYWxJdGVyLiogREJ1c09iamVjdFN1YnRyZWUuKiBEQnVzT2JqZWN0VHJlZS4qIERCdXNQb2xsRkQuKiBEQnVzUmVhbCogXAorICAgIERCdXNSZXNvdXJjZXMuKiBEQnVzU2VydmVyRGVidWdQaXBlLiogREJ1c1NlcnZlclNvY2tldC4qIERCdXNTZXJ2ZXJVbml4LiogXAorICAgIERCdXNTZXJ2ZXJWVGFibGUuKiBEQnVzU0hBLiogREJ1c1NIQUNvbnRleHQuKiBEQnVzU2lnbmF0dXJlUmVhbEl0ZXIuKiBEQnVzU3RhdC4qIERCdXNTdHJpbmcuKiBcCisgICAgREJ1c1N5c2RlcHMuKiBEQnVzU3lzZGVwc1VuaXguKiBEQnVzVGltZW91dExpc3QuKiBEQnVzVHJhbnNwb3J0KiBEQnVzVHlwZVJlYWRlciogREJ1c1R5cGVXcml0ZXIqIFwKKyAgICBEQnVzVXNlckluZm8uKiBEQnVzV2F0Y2hMaXN0LiogOyBkbyAKKyAgICBpZiB0ZXN0IC1mICIkSSIgOyB0aGVuCisgICAgICAgIC9iaW4vbXYgIiRJIiBudWtlIHx8IGRpZSAiY291bGQgbm90IG1vdmUgJEkgdG8gJE1BTkRJUi9udWtlIgorICAgIGZpCitkb25lCisKKyMjIG1hbnkgZmlsZXMganVzdCBjb250YWluICIuc28gbWFuM2RidXMvREJ1c1N0cmluZ0ludGVybmFscy4zZGJ1cyIgb3IgdGhlIGxpa2UsIAorIyMgaWYgdGhlc2UgcG9pbnQgdG8gc29tZXRoaW5nIHdlIG51a2VkLCB3ZSB3YW50IHRvIGFsc28gbnVrZSB0aGUgcG9pbnRlci4KK2ZvciBJIGluICogOyBkbworICAgIGlmIHRlc3QgLWYgIiRJIiA7IHRoZW4KKyAgICAgICAgTElORVM9YHdjIC1sICIkSSIgfCBjdXQgLWQgJyAnIC1mIDFgCisgICAgICAgIGlmIHRlc3QgeCIkTElORVMiID0geDEgOyB0aGVuCisgICAgICAgICAgICBSRUZfVE89YGNhdCAiJEkiIHwgc2VkIC1lICdzL1wuc28gbWFuM2RidXNcLy8vZydgCisgICAgICAgICAgICAjIyBlY2hvICIkSSBwb2ludHMgdG8gJFJFRl9UTyIKKyAgICAgICAgICAgIGlmICEgdGVzdCAtZiAiJFJFRl9UTyIgOyB0aGVuCisgICAgICAgICAgICAgICAgL2Jpbi9tdiAiJEkiIG51a2UgfHwgZGllICJjb3VsZCBub3QgbW92ZSAkSSB0byAkTUFORElSL251a2UiCisgICAgICAgICAgICBmaQorICAgICAgICBmaQorICAgIGZpCitkb25lCisKKyMjIHdoaXRlbGlzdAorKGZpbmQgLiAtbWF4ZGVwdGggMSAtbmFtZSAiZGJ1c18qIiB8IHhhcmdzIC1JIElURU1TIC9iaW4vbXYgSVRFTVMga2VlcCkgfHwgZGllICJjb3VsZCBub3QgbW92ZSBhbGwgZGJ1cy1wcmVmaXhlZCBpdGVtcyIKKyhmaW5kIC4gLW1heGRlcHRoIDEgLW5hbWUgIkRCVVNfKiIgfCB4YXJncyAtSSBJVEVNUyAvYmluL212IElURU1TIGtlZXApIHx8IGRpZSAiY291bGQgbm90IG1vdmUgYWxsIERCVVNfLXByZWZpeGVkIGl0ZW1zIgorKGZpbmQgLiAtbWF4ZGVwdGggMSAtbmFtZSAiREJ1cyoiIHwgeGFyZ3MgLUkgSVRFTVMgL2Jpbi9tdiBJVEVNUyBrZWVwKSB8fCBkaWUgImNvdWxkIG5vdCBtb3ZlIGFsbCBEQnVzLXByZWZpeGVkIGl0ZW1zIgorCisjIyBldmVyeXRoaW5nIGVsc2UgaXMgYXNzdW1lZCBpcnJlbGV2YW50LCB0aGlzIGlzIG1vc3RseSBzdHJ1Y3QgZmllbGRzCisjIyBmcm9tIHRoZSBwdWJsaWMgaGVhZGVycworKGZpbmQgLiAtbWF4ZGVwdGggMSAtdHlwZSBmIHwgeGFyZ3MgLUkgSVRFTVMgL2Jpbi9tdiBJVEVNUyBudWtlKSB8fCBkaWUgImNvdWxkIG5vdCBtb3ZlIHJlbWFpbmluZyBpdGVtcyIKKworTlVLRV9DT1VOVD1gZmluZCBudWtlIC10eXBlIGYgLW5hbWUgIioiIHwgd2MgLWxgCitLRUVQX0NPVU5UPWBmaW5kIGtlZXAgLXR5cGUgZiAtbmFtZSAiKiIgfCB3YyAtbGAKK01JU1NJTkdfQ09VTlQ9YGZpbmQgLiAtbWF4ZGVwdGggMSAtdHlwZSBmIC1uYW1lICIqIiB8IHdjIC1sYAorCitlY2hvICIkS0VFUF9DT1VOVCBtYW4gcGFnZXMga2VwdCBhbmQgJE5VS0VfQ09VTlQgbWFuIHBhZ2VzIHRvIHJlbW92ZSIKK2VjaG8gIiRNSVNTSU5HX0NPVU5UIG5vdCBoYW5kbGVkIgorCisoZmluZCBrZWVwIC10eXBlIGYgLW5hbWUgIioiIHwgeGFyZ3MgLUkgSVRFTVMgL2Jpbi9tdiBJVEVNUyAuKSB8fCBkaWUgImNvdWxkIG5vdCBtb3ZlIGtlcHQgaXRlbXMgYmFjayIKKworcm1kaXIga2VlcCB8fCBkaWUgImNvdWxkIG5vdCByZW1vdmUgJE1BTkRJUi9rZWVwIgorCitlY2hvICJNYW4gcGFnZXMgdG8gYmUgaW5zdGFsbGVkIGFyZSBpbiAkTUFORElSIGFuZCBtYW4gcGFnZXMgdG8gaWdub3JlIGFyZSBpbiAkTUFORElSL251a2UiCisKK2V4aXQgMApkaWZmIC0tZ2l0IGEvY21ha2UvQ01ha2VMaXN0cy50eHQgYi9jbWFrZS9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWM3MWE1Ci0tLSAvZGV2L251bGwKKysrIGIvY21ha2UvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw2ODkgQEAKKyMgd2hlcmUgdG8gbG9vayBmaXJzdCBmb3IgY21ha2UgbW9kdWxlcywgYmVmb3JlICR7Q01BS0VfUk9PVH0vTW9kdWxlcy8gaXMgY2hlY2tlZAorbGlzdChBUFBFTkQgQ01BS0VfTU9EVUxFX1BBVEggIiR7Q01BS0VfU09VUkNFX0RJUn0vbW9kdWxlcyIpCisKKyMgd2UgZG8gbm90IG5lZWQgdG8gaGF2ZSBXSU4zMiBkZWZpbmVkCitzZXQoQ01BS0VfTEVHQUNZX0NZR1dJTl9XSU4zMiAwKQorCitwcm9qZWN0KGRidXMpCisKKyMgd2UgbmVlZCB0byBiZSB1cCB0byBkYXRlCitDTUFLRV9NSU5JTVVNX1JFUVVJUkVEKFZFUlNJT04gMy4wLjIgRkFUQUxfRVJST1IpCitpZihDT01NQU5EIGNtYWtlX3BvbGljeSkKKyAgICBjbWFrZV9wb2xpY3koU0VUIENNUDAwMDMgTkVXKQorZW5kaWYoQ09NTUFORCBjbWFrZV9wb2xpY3kpCisKK2lmKENNQUtFX01BSk9SX1ZFUlNJT04gR1JFQVRFUiAyKQorICAgIGNtYWtlX3BvbGljeShTRVQgQ01QMDAyNiBORVcpCisgICAgaWYgKENNQUtFX01BSk9SX1ZFUlNJT04gR1JFQVRFUiA0IE9SIENNQUtFX01JTk9SX1ZFUlNJT04gR1JFQVRFUiAxKQorICAgICAgICBjbWFrZV9wb2xpY3koU0VUIENNUDAwNTMgTkVXKQorICAgICAgICBjbWFrZV9wb2xpY3koU0VUIENNUDAwNTQgTkVXKQorICAgIGVuZGlmKCkKK2VuZGlmKCkKKworIyBkZXRlY3QgdmVyc2lvbgoraW5jbHVkZShNYWNyb3NBdXRvdG9vbHMpCithdXRvaW5pdCguLi9jb25maWd1cmUuYWMpCithdXRvdmVyc2lvbihkYnVzKQorCitpZihFWElTVFMgLi4vY29uZmlnLmguaW4pCisgICAgYXV0b2hlYWRlcmNoZWNrcyguLi9jb25maWcuaC5pbiBDb25maWd1cmVDaGVja3MuY21ha2UgY29uZmlnLmguY21ha2UpCitlbHNlKCkKKyAgICBtZXNzYWdlKFNUQVRVUyAiR2VuZXJhdGUgY29uZmlnLmguaW4gd2l0aCBhdXRvZ2VuLnNoIHRvIGVuYWJsZSBjbWFrZSBoZWFkZXIgZGlmZmVyZW5jZSBjaGVjay4iKQorZW5kaWYoKQorCisjIHVzZWQgYnkgZmlsZSB2ZXJzaW9uIGluZm8KK3NldCAoREJVU19QQVRDSF9WRVJTSU9OICIwIikKKworIyBzZXQgUEFDS0FHRV8uLi4gdmFyaWFibGVzCithdXRvcGFja2FnZSgKKyAgICBkYnVzCisgICAgJHtEQlVTX1ZFUlNJT05fU1RSSU5HfQorICAgICJodHRwOi8vZGJ1cy5mcmVlZGVza3RvcC5vcmciCisgICAgImh0dHBzOi8vYnVncy5mcmVlZGVza3RvcC5vcmcvZW50ZXJfYnVnLmNnaT9wcm9kdWN0PWRidXMiCispCisKK2luY2x1ZGUoTWFjcm9zKQorc3RyaW5nKFRJTUVTVEFNUCBEQlVTX0JVSUxEX1RJTUVTVEFNUCAiJVklbSVkJUglTSIgVVRDKQorCisjIyMjIyMjIyMjIyBiYXNpYyB2YXJzICMjIyMjIyMjIyMjIyMjIworCitpbmNsdWRlKEdOVUluc3RhbGxEaXJzKQorCitpZiAoREJVU0RJUikKKwlzZXQoREJVU19JTlNUQUxMX0RJUiAiJHtEQlVTRElSfSIpCitlbmRpZiAoREJVU0RJUikKK2lmICgkRU5We0RCVVNESVJ9KQorCXNldChEQlVTX0lOU1RBTExfRElSICIkRU5We0RCVVNESVJ9IikKK2VuZGlmICgkRU5We0RCVVNESVJ9KQorCitpZiAoREJVU19JTlNUQUxMX0RJUikKKwlzZXQoQ01BS0VfSU5TVEFMTF9QUkVGSVggIiR7REJVU19JTlNUQUxMX0RJUn0iIENBQ0hFIFBBVEggImluc3RhbGwgcHJlZml4IiBGT1JDRSkKK2Vsc2UgKERCVVNfSU5TVEFMTF9ESVIpCisJc2V0KERCVVNfSU5TVEFMTF9ESVIgIiR7Q01BS0VfSU5TVEFMTF9QUkVGSVh9IikKK2VuZGlmIChEQlVTX0lOU1RBTExfRElSKQorCitzZXQoREJVU19QUkVGSVggJHtEQlVTX0lOU1RBTExfRElSfSkKKworc2V0KHByZWZpeCAgICAgICAgICAgICAgICAgICAke0RCVVNfSU5TVEFMTF9ESVJ9KQorc2V0KGV4ZWNfcHJlZml4ICAgICAgICAgICAgICAke3ByZWZpeH0pCitzZXQoREJVU19NQUNISU5FX1VVSURfRklMRSAgICR7Q01BS0VfSU5TVEFMTF9GVUxMX0xPQ0FMU1RBVEVESVJ9L2xpYi9kYnVzL21hY2hpbmUtaWQpCitzZXQoREJVU19CSU5ESVIgICAgICAgICAgICAgICR7Q01BS0VfSU5TVEFMTF9GVUxMX0JJTkRJUn0pCitzZXQoREJVU19EQUVNT05ESVIgICAgICAgICAgICR7Q01BS0VfSU5TVEFMTF9GVUxMX0JJTkRJUn0pCitzZXQoREJVU19MT0NBTFNUQVRFRElSICAgICAgICR7Q01BS0VfSU5TVEFMTF9GVUxMX0xPQ0FMU1RBVEVESVJ9KQorc2V0KERCVVNfUlVOU1RBVEVESVIgICAgICAgICAke0NNQUtFX0lOU1RBTExfRlVMTF9MT0NBTFNUQVRFRElSfS9ydW4pCisKKyMgT24gV2luZG93cyB0aGlzIGlzIHJlbGF0aXZlIHRvIHdoZXJlIHdlIHB1dCB0aGUgYnVzIHNldHVwLCBpbgorIyAke2RhdGFkaXJ9L2RidXMtMS4gRm9yIHNpbXBsaWNpdHksIHdlIG9ubHkgZG8gdGhpcyBpZgorIyAke3N5c2NvbmZkaXJ9ID0gJHtwcmVmaXh9L2V0YyBhbmQgJHtkYXRhZGlyfSA9ICR7cHJlZml4fS9zaGFyZS4KKyMKKyMgT24gVW5peCwgb3Igb24gV2luZG93cyB3aXRoIHdlaXJkIGluc3RhbGwgbGF5b3V0cywgaXQncyB0aGUgYWJzb2x1dGUgcGF0aC4KK2lmKFdJTjMyIEFORCAke0NNQUtFX0lOU1RBTExfRlVMTF9TWVNDT05GRElSfSBTVFJFUVVBTCAke3ByZWZpeH0vZXRjIEFORCAke0NNQUtFX0lOU1RBTExfRlVMTF9EQVRBRElSfSBTVFJFUVVBTCAke3ByZWZpeH0vc2hhcmUpCitzZXQoU1lTQ09ORkRJUl9GUk9NX1BLR0RBVEFESVIgLi4vLi4vZXRjKQorc2V0KERBVEFESVJfRlJPTV9QS0dTWVNDT05GRElSIC4uLy4uL3NoYXJlKQorZWxzZSgpCitzZXQoU1lTQ09ORkRJUl9GUk9NX1BLR0RBVEFESVIgJHtDTUFLRV9JTlNUQUxMX0ZVTExfU1lTQ09ORkRJUn0pCitzZXQoREFUQURJUl9GUk9NX1BLR1NZU0NPTkZESVIgJHtDTUFLRV9JTlNUQUxMX0ZVTExfREFUQURJUn0pCitlbmRpZigpCisKK29wdGlvbiAoREJVU19SRUxPQ0FUQUJMRSAiQXR0ZW1wdCB0byBtYWtlIG1ldGFkYXRhIHJlbG9jYXRhYmxlIiBPTikKKworIyBGb3Igc2ltcGxpY2l0eSwgd2UncmUgbm90IHJlbG9jYXRhYmxlIGlmIENNQUtFX0lOU1RBTExfTElCRElSCisjIGlzIHNvbWV0aGluZyBtb3JlIGNvbXBsaWNhdGVkIChlLmcuIERlYmlhbiBtdWx0aWFyY2gpOworIyB3ZSBkb24ndCB3YW50IHRvIGhhdmUgdG8gY29tcHV0ZSBob3cgbWFueSAuLi8gdG8gYWRkCitpZihDTUFLRV9JTlNUQUxMX0xJQkRJUiBTVFJFUVVBTCAibGliIiBPUiBDTUFLRV9JTlNUQUxMX0xJQkRJUiBTVFJFUVVBTCAibGliNjQiKQorICAgICMgV2Uga25vdyB3ZSBjYW4gdXNlIC4uLyB0byBnZXQgdG8gdGhlIHByZWZpeC4gRG8gbm90aGluZy4KK2Vsc2VpZihEQlVTX1JFTE9DQVRBQkxFKQorICAgICMgU29ycnksIGl0J3MgdG9vIGhhcmQgdG8gbWFrZSB0aGlzIHBhcnRpY3VsYXIgYnVpbGQgcmVsb2NhdGFibGUKKyAgICBtZXNzYWdlKCJVbnVzdWFsIENNQUtFX0lOU1RBTExfTElCRElSOiB0aGUgZ2VuZXJhdGVkIHBhY2thZ2Ugd2lsbCBub3QgYmUgcmVsb2NhdGFibGUuIikKKyAgICBzZXQoREJVU19SRUxPQ0FUQUJMRSBPRkYpCitlbmRpZigpCisKKyMgdXNlZCBpbiB0aGUgQyBjb2RlCitzZXQoREJVU19MSUJFWEVDRElSICAgICAgICAgICR7Q01BS0VfSU5TVEFMTF9GVUxMX0xJQkVYRUNESVJ9KQorc2V0KERCVVNfREFUQURJUiAgICAgICAgICAgICAke0NNQUtFX0lOU1RBTExfRlVMTF9EQVRBRElSfSkKKworI2VuYWJsZSBidWlsZGluZyBvZiBzaGFyZWQgbGlicmFyeQorU0VUKEJVSUxEX1NIQVJFRF9MSUJTIE9OKQorCitzZXQoSU5TVEFMTF9UQVJHRVRTX0RFRkFVTFRfQVJHUyBFWFBPUlQgREJ1czFUYXJnZXRzIFJVTlRJTUUgREVTVElOQVRJT04gJHtDTUFLRV9JTlNUQUxMX0JJTkRJUn0gTElCUkFSWSBERVNUSU5BVElPTiAke0NNQUtFX0lOU1RBTExfTElCRElSfSBBUkNISVZFIERFU1RJTkFUSU9OICR7Q01BS0VfSU5TVEFMTF9MSUJESVJ9KQorCitpZiAoQ1lHV0lOKQorICAgc2V0IChXSU4zMikKK2VuZGlmIChDWUdXSU4pCisKKyMgc2VhcmNoIGZvciByZXF1aXJlZCBwYWNrYWdlcworaWYgKFdJTjMyKQorICAgICMgaW5jbHVkZSBsb2NhbCBoZWFkZXIgZmlyc3QgdG8gYXZvaWQgdXNpbmcgb2xkIGluc3RhbGxlZCBoZWFkZXIKKyAgICBzZXQgKENNQUtFX0lOQ0xVREVfUEFUSCAke0NNQUtFX0lOQ0xVREVfUEFUSH0gJHtDTUFLRV9TT1VSQ0VfRElSfS8uLikKKwlmaW5kX3BhY2thZ2UoTGliSWNvbnYpCisgICAgaW5jbHVkZShXaW4zMk1hY3JvcykKKyAgICBhZGRFeHBsb3JlcldyYXBwZXIoJHtDTUFLRV9QUk9KRUNUX05BTUV9KQorZW5kaWYgKFdJTjMyKQorCitpZihOT1QgV0lOMzIpCisJc2V0IChDTUFLRV9USFJFQURfUFJFRkVSX1BUSFJFQUQgT04pCisJaW5jbHVkZSAoRmluZFRocmVhZHMpCitlbmRpZihOT1QgV0lOMzIpCisKK29wdGlvbiAoREJVU19ESVNBQkxFX0FTU0VSVCAiRGlzYWJsZSBhc3NlcnRpb24gY2hlY2tpbmciIE9GRikKKworb3B0aW9uIChEQlVTX0VOQUJMRV9TVEFUUyAiZW5hYmxlIGJ1cyBkYWVtb24gdXNhZ2Ugc3RhdGlzdGljcyIgT0ZGKQorCitpZihXSU4zMikKKyAgICBzZXQoRkRfU0VUU0laRSAiODE5MiIgQ0FDSEUgU1RSSU5HICJUaGUgbWF4aW11bSBudW1iZXIgb2YgY29ubmVjdGlvbnMgdGhhdCBjYW4gYmUgaGFuZGxlZCBhdCBvbmNlIikKK2VuZGlmKCkKKworZmluZF9wYWNrYWdlKEVYUEFUKQorZmluZF9wYWNrYWdlKFgxMSkKK2ZpbmRfcGFja2FnZShHTGliMikKK2ZpbmRfcGFja2FnZShHT2JqZWN0KQoraWYoR0xJQjJfRk9VTkQgQU5EIEdPQkpFQ1RfRk9VTkQpCisgICAgb3B0aW9uIChEQlVTX1dJVEhfR0xJQiAiYnVpbGQgd2l0aCBnbGliIiBPTikKK2VuZGlmKCkKKworIyBhbmFsb2dvdXMgdG8gQUNfVVNFX1NZU1RFTV9FWFRFTlNJT05TIGluIGNvbmZpZ3VyZS5hYworYWRkX2RlZmluaXRpb25zKC1EX0dOVV9TT1VSQ0UpCisKKyMgZG8gY29uZmlnIGNoZWNrcworSU5DTFVERShDb25maWd1cmVDaGVja3MuY21ha2UpCisKKyMgQFRPRE86IGhvdyB0byByZW1vdmUgbGFzdCBkaXIgZnJvbSAke0NNQUtFX1NPVVJDRV9ESVJ9ID8KK1NFVChEQlVTX1NPVVJDRV9ESVIgJHtDTUFLRV9TT1VSQ0VfRElSfS8uLikKKworIyBtYWtlIHNvbWUgbW9yZSBtYWNyb3MgYXZhaWxhYmxlCitpbmNsdWRlIChNYWNyb0xpYnJhcnkpCisKK2lmKFZDUykKKwlzZXQoREJVU19WRVJCT1NFX0NfUyAxIENBQ0hFIFNUUklORyAidmVyYm9zZSBtb2RlIiBGT1JDRSkKK2VuZGlmKFZDUykKKworaWYoTVNWQykKKyAgICAjIGNvbnRyb2xsIGZvbGRlcnMgaW4gbXN2YyBwcm9qZWN0cworICAgIGluY2x1ZGUoUHJvamVjdFNvdXJjZUdyb3VwKQorICAgIGlmKE5PVCBHUk9VUF9DT0RFKQorICAgICAgICAjc2V0KEdST1VQX0NPREUgc3BsaXQpICNjbWFrZSBkZWZhdWx0CisgICAgICAgIHNldChHUk9VUF9DT0RFIGZsYXQpCisgICAgZW5kaWYoTk9UIEdST1VQX0NPREUpCisgICAgQUREX0RFRklOSVRJT05TKC1EX0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFIC1EX0NSVF9OT05TVERDX05PX0RFUFJFQ0FURSkKKyAgICBTRVQoQ01BS0VfQ19GTEFHU19ERUJVRyAgICIke0NNQUtFX0NfRkxBR1NfREVCVUd9ICAgL0ZJY29uZmlnLmgiKQorICAgIFNFVChDTUFLRV9DX0ZMQUdTX1JFTEVBU0UgIiR7Q01BS0VfQ19GTEFHU19SRUxFQVNFfSAvRkljb25maWcuaCIpCitlbmRpZigpCisKKyMKKyMgc2V0dXAgd2FybmluZ3MKKyMKK2lmKE1TVkMpCisgICAgIyBVc2UgdGhlIGhpZ2hlc3Qgd2FybmluZyBsZXZlbAorICAgIGlmKFdBTEwpCisgICAgICAgIHNldChXQUxMIDEgQ0FDSEUgU1RSSU5HICJhbGwgd2FybmluZ3MiICBGT1JDRSkKKyAgICAgICAgc2V0KENNQUtFX0NYWF9XQVJOSU5HX0xFVkVMIDQgQ0FDSEUgU1RSSU5HICJ3YXJuaW5nIGxldmVsIiBGT1JDRSkKKyAgICAgICAgaWYoQ01BS0VfQ1hYX0ZMQUdTIE1BVENIRVMgIi9XWzAtNF0iKQorICAgICAgICAgICAgc3RyaW5nKFJFR0VYIFJFUExBQ0UgIi9XWzAtNF0iICIvVzQiIENNQUtFX0NYWF9GTEFHUyAiJHtDTUFLRV9DWFhfRkxBR1N9IikKKyAgICAgICAgZWxzZSgpCisgICAgICAgICAgICBzZXQoQ01BS0VfQ1hYX0ZMQUdTICIke0NNQUtFX0NYWF9GTEFHU30gL1c0IikKKyAgICAgICAgZW5kaWYoKQorCisgICAgICAgIGlmKENNQUtFX0NfRkxBR1MgTUFUQ0hFUyAiL1dbMC00XSIpCisgICAgICAgICAgICBzdHJpbmcoUkVHRVggUkVQTEFDRSAiL1dbMC00XSIgIi9XNCIgQ01BS0VfQ19GTEFHUyAiJHtDTUFLRV9DX0ZMQUdTfSIpCisgICAgICAgIGVsc2UoKQorICAgICAgICAgICAgc2V0KENNQUtFX0NfRkxBR1MgIiR7Q01BS0VfQ19GTEFHU30gL1c0IikKKyAgICAgICAgZW5kaWYoKQorICAgIGVsc2UoKQorICAgICAgICBzZXQoQ01BS0VfQ1hYX1dBUk5JTkdfTEVWRUwgMyBDQUNIRSBTVFJJTkcgIndhcm5pbmcgbGV2ZWwiIEZPUkNFKQorICAgIGVuZGlmKCkKKworICAgICMgc2VlIGh0dHBzOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvejc4NTAzZTYuYXNweAorICAgICMgNDAxOCAnZXhwcmVzc2lvbicgOiBzaWduZWQvdW5zaWduZWQgbWlzbWF0Y2gKKyAgICBzZXQoV0FSTklOR1MgIjQwMTgiKQorICAgICMgNDA5MCAnb3BlcmF0aW9uJyA6IGRpZmZlcmVudCAnbW9kaWZpZXInIHF1YWxpZmllcnMKKyAgICAjIDQxMDEgJ2lkZW50aWZpZXInIDogdW5yZWZlcmVuY2VkIGxvY2FsIHZhcmlhYmxlCisgICAgIyA0MTI3IGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gaXMgY29uc3RhbnQKKyAgICAjIDQyNDQgJ2FyZ3VtZW50JyA6IGNvbnZlcnNpb24gZnJvbSAndHlwZTEnIHRvICd0eXBlMicsIHBvc3NpYmxlIGxvc3Mgb2YgZGF0YQorICAgIHNldChXQVJOSU5HU19ESVNBQkxFRCAiNDA5MCA0MTAxIDQxMjcgNDI0NCIpCisgICAgIyA0MDAyIHRvbyBtYW55IGFjdHVhbCBwYXJhbWV0ZXJzIGZvciBtYWNybyAnaWRlbnRpZmllcicKKyAgICAjIDQwMDMgbm90IGVub3VnaCBhY3R1YWwgcGFyYW1ldGVycyBmb3IgbWFjcm8gJ2lkZW50aWZpZXInCisgICAgIyA0MDEzICdmdW5jdGlvbicgdW5kZWZpbmVkOyBhc3N1bWluZyBleHRlcm4gcmV0dXJuaW5nIGludAorICAgICMgNDAyOCBmb3JtYWwgcGFyYW1ldGVyICdudW1iZXInIGRpZmZlcmVudCBmcm9tIGRlY2xhcmF0aW9uCisgICAgIyA0MDMxIHNlY29uZCBmb3JtYWwgcGFyYW1ldGVyIGxpc3QgbG9uZ2VyIHRoYW4gdGhlIGZpcnN0IGxpc3QKKyAgICAjIDQwNDcgb3BlcmF0b3InIDogJ2lkZW50aWZpZXIxJyBkaWZmZXJzIGluIGxldmVscyBvZiBpbmRpcmVjdGlvbiBmcm9tICdpZGVudGlmaWVyMicKKyAgICAjIDQxMTQgc2FtZSB0eXBlIHF1YWxpZmllciB1c2VkIG1vcmUgdGhhbiBvbmNlCisgICAgIyA0MTMzICd0eXBlJyA6IGluY29tcGF0aWJsZSB0eXBlcyAtIGZyb20gJ3R5cGUxJyB0byAndHlwZTInCisgICAgc2V0KFdBUk5JTkdTX0VSUk9SUyAiNDAwMiA0MDAzIDQwMTMgNDAyOCA0MDMxIDQwNDcgNDExNCA0MTMzIikKK2Vsc2UoKQorICAgIHNldChXQVJOSU5HUyAic2lnbi1jb21wYXJlIikKKyAgICBzZXQoV0FSTklOR1NfRElTQUJMRUQgIiIpCisgICAgc2V0KFdBUk5JTkdTX0VSUk9SUyAiIikKK2VuZGlmKCkKK2dlbmVyYXRlX3dhcm5pbmdfY2ZsYWdzKFdBUk5JTkdTX0NGTEFHUyAiJHtXQVJOSU5HU30iICIke1dBUk5JTkdTX0RJU0FCTEVEfSIgIiR7V0FSTklOR1NfRVJST1JTfSIpCitzZXQoQ01BS0VfQ19GTEFHUyAiJHtDTUFLRV9DX0ZMQUdTfSAke1dBUk5JTkdTX0NGTEFHU30iKQorc2V0KENNQUtFX0NYWF9GTEFHUyAiJHtDTUFLRV9DWFhfRkxBR1N9ICR7V0FSTklOR1NfQ0ZMQUdTfSIpCisKKworaWYgKFVOSVggQU5EIE5PVCBEQlVTX0RJU0FCTEVfQVNTRVJUKQorCSMgcmVxdWlyZWQgZm9yIGJhY2t0cmFjZQorCVNFVChDTUFLRV9DX0ZMQUdTX0RFQlVHICAgIiR7Q01BS0VfQ19GTEFHU19ERUJVR30gICAtV2wsLS1leHBvcnQtZHluYW1pYyIpCisJU0VUKENNQUtFX0NfRkxBR1NfUkVMRUFTRSAiJHtDTUFLRV9DX0ZMQUdTX1JFTEVBU0V9IC1XbCwtLWV4cG9ydC1keW5hbWljIikKKwlhZGRfZGVmaW5pdGlvbnMoLUREQlVTX0JVSUxUX1JfRFlOQU1JQykKK2VuZGlmIChVTklYIEFORCBOT1QgREJVU19ESVNBQkxFX0FTU0VSVCkKKworaWYoREJVU19XSVRIX0dMSUIpCisgICAgYXV0b2RlZmluZShHTElCX1ZFUlNJT05fTUlOX1JFUVVJUkVEKQorICAgIGF1dG9kZWZpbmUoR0xJQl9WRVJTSU9OX01BWF9BTExPV0VEKQorZW5kaWYoKQorCitTRVQoQ01BS0VfQ19GTEFHU19ERUJVRyAiJHtDTUFLRV9DX0ZMQUdTX0RFQlVHfSAgLURfREVCVUciKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFdpbmRvd3MgQ0UgKD49IDUuMC4wKQorIworIyBXaW5DRSBzdXBwb3J0IG5vdyByZWxpZXMgb24gdGhlIHByZXNlbmNlIG9mIHBsYXRmb3JtIGZpbGVzLCBmb3VuZCBpbiBjbWFrZS9tb2R1bGVzL3BsYXRmb3JtCisjIENtYWtlIDIuOC4wIGRvZXNuJ3QgaW5jbHVkZSBXaW5DRSBwbGF0Zm9ybSBmaWxlcyBieSBkZWZhdWx0LCBidXQgd29ya2luZyBvbmVzIGNhbiBiZSBmb3VuZAorIyBvbiBDTWFrZSdzIGJ1Z3RyYWNrZXIgOgorIyBodHRwOi8vcHVibGljLmtpdHdhcmUuY29tL0J1Zy92aWV3LnBocD9pZD03OTE5CisjCisjIGZvciBjbWFrZSAyLjguMCBnZXQgdGhlIGZvbGxvd2luZyBwYXRjaCBvbmx5IDoKKyMgaHR0cDovL3B1YmxpYy5raXR3YXJlLmNvbS9CdWcvZmlsZV9kb3dubG9hZC5waHA/ZmlsZV9pZD0yOTQ0JnR5cGU9YnVnCisjCisjIGFmdGVyIGFwcGx5aW5nIHRoZSBwYXRjaCwgeW91IGNhbiBlbmFibGUgdGhlIFdpbkNFIGJ1aWxkIGJ5IHNwZWNpZnlpbmcgOgorIyBjbWFrZSBbLi4uXSAtRENNQUtFX1NZU1RFTV9OQU1FPVdpbkNFIC1EQ01BS0VfU1lTVEVNX1ZFUlNJT049WC5YWAorIyAod2hlcmUgWC5YWCBpcyB5b3VyIGFjdHVhbCBXaW5DRSB2ZXJzaW9uLCBlLmcuIDUuMDIgZm9yIFdpbmRvd3MgTW9iaWxlIDYpCisjCisjIE5vdGUgdGhhdCB5b3Ugc2hvdWxkIGhhdmUgYSBwcm9wZXIgY3Jvc3MtY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwIHByaW9yIHRvIHJ1bm5pbmcKKyMgY21ha2UsIGllLiB0aGUgUEFUSCwgSU5DTFVERSBhbmQgTElCIGVudiB2YXJzIHBvaW50aW5nIHRvIHlvdXIgQ0UgU0RLL3Rvb2xjaGFpbi4KKyMKK2lmKFdJTkNFKQorCitNRVNTQUdFKCJCdWlsZGluZyBmb3IgV2luQ0UgKCR7Q01BS0VfU1lTVEVNX1ZFUlNJT059KSIpCisKK2VuZGlmKFdJTkNFKQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisKK0VOQUJMRV9URVNUSU5HKCkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBEaXNhbGxvdyBpbi1zb3VyY2UgYnVpbGQKKyNtYWNyb19lbnN1cmVfb3V0X29mX3NvdXJjZV9idWlsZCgiZGJ1cyByZXF1aXJlcyBhbiBvdXQgb2Ygc291cmNlIGJ1aWxkLiBQbGVhc2UgY3JlYXRlIGEgc2VwYXJhdGUgYnVpbGQgZGlyZWN0b3J5IGFuZCBydW4gJ2NtYWtlIHBhdGhfdG9fZGJ1cyBbb3B0aW9uc10nIHRoZXJlLiIpCisKKyMgLi4uIGFuZCB3YXJuIGluIGNhc2Ugb2YgYW4gZWFybGllciBpbi1zb3VyY2UgYnVpbGQKKyNzZXQoZ2VuZXJhdGVkRmlsZUluU291cmNlRGlyIEVYSVNUUyAke2RidXNfU09VUkNFX0RJUn0vY29uZmlnLmgpCisjaWYoJHtnZW5lcmF0ZWRGaWxlSW5Tb3VyY2VEaXJ9KQorIyAgIG1lc3NhZ2UoU1RBVFVTICJjb25maWcuaCBleGlzdHMgaW4geW91ciBzb3VyY2UgZGlyZWN0b3J5LiIpCisjZW5kaWYoJHtnZW5lcmF0ZWRGaWxlSW5Tb3VyY2VEaXJ9KQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitpZiAoV0lOMzIgT1IgQ1lHV0lOKQorCXNldCAoTElCUkFSWV9PVVRQVVRfUEFUSCAgJHtDTUFLRV9CSU5BUllfRElSfS9iaW4pCitlbHNlIChXSU4zMiBPUiBDWUdXSU4pCisJc2V0IChMSUJSQVJZX09VVFBVVF9QQVRIICAke0NNQUtFX0JJTkFSWV9ESVJ9L2xpYikKK2VuZGlmIChXSU4zMiBPUiBDWUdXSU4pCisKK3NldCAoRVhFQ1VUQUJMRV9PVVRQVVRfUEFUSCAke0NNQUtFX0JJTkFSWV9ESVJ9L2JpbikKKworIyBmb3IgaW5jbHVkaW5nIGNvbmZpZy5oIGFuZCBmb3IgaW5jbHVkZXMgbGlrZSA8ZGlyL2Zvby5oPgoraW5jbHVkZV9kaXJlY3RvcmllcyggJHtDTUFLRV9TT1VSQ0VfRElSfS8uLiAke0NNQUtFX0JJTkFSWV9ESVJ9ICR7Q01BS0VfSU5DTFVERV9QQVRIfSApCisKKyMgbGlua2VyIHNlYXJjaCBkaXJlY3RvcmllcworbGlua19kaXJlY3Rvcmllcygke0RCVVNfTElCX0RJUn0gJHtMSUJSQVJZX09VVFBVVF9QQVRIfSApCitpbmNsdWRlX2RpcmVjdG9yaWVzKCAke0NNQUtFX0xJQlJBUllfUEFUSH0gICkKKworc2V0KERCVVNfSU5DTFVERVMpCisKK0VOQUJMRV9URVNUSU5HKCkKKworIyMjIyMjIyMjIyMgY29tbWFuZCBsaW5lIG9wdGlvbnMgIyMjIyMjIyMjIyMjIyMjCisjIFRPRE86IHRha2UgY2hlY2sgZnJvbSBjb25maWd1cmUuaW4KKworb3B0aW9uIChEQlVTX0JVSUxEX1RFU1RTICJlbmFibGUgdW5pdCB0ZXN0IGNvZGUiIE9OKQorIAoraWYoREJVU19CVUlMRF9URVNUUykKKyAgICBzZXQgKERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTIE9OKQorICAgIHNldCAoREJVU19FTkFCTEVfTU9EVUxBUl9URVNUUyBPTikKKyAgICBhZGRfZGVmaW5pdGlvbnMoLUREQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUyAtRERCVVNfRU5BQkxFX01PRFVMQVJfVEVTVFMpCitlbmRpZihEQlVTX0JVSUxEX1RFU1RTKQorCitvcHRpb24gKERCVVNfVVNFX09VVFBVVF9ERUJVR19TVFJJTkcgImVuYWJsZSB3aW4zMiBkZWJ1ZyBwb3J0IGZvciBtZXNzYWdlIG91dHB1dCIgT0ZGKQoraWYoREJVU19VU0VfT1VUUFVUX0RFQlVHX1NUUklORykKKyAgICBhZGRfZGVmaW5pdGlvbnMoLUREQlVTX1VTRV9PVVRQVVRfREVCVUdfU1RSSU5HKQorZW5kaWYoREJVU19VU0VfT1VUUFVUX0RFQlVHX1NUUklORykKKworaWYoV0lOMzIpCisJIyB3aW4zMiBkYnVzIHNlcnZpY2Ugc3VwcG9ydCAtIHRoaXMgc3VwcG9ydCBpcyBub3QgY29tcGxldGUKKwlvcHRpb24gKERCVVNfU0VSVklDRSAiZW5hYmxlIGRidXMgc2VydmljZSBpbnN0YWxsZXIiIE9GRikKK2VuZGlmKFdJTjMyKQorCitvcHRpb24gKERCVVNfRU5BQkxFX0FOU0kgImVuYWJsZSAtYW5zaSAtcGVkYW50aWMgZ2NjIGZsYWdzIiBPRkYpCitpZihEQlVTX0VOQUJMRV9BTlNJKQorICAgaWYoTk9UIE1TVkMpCisgICAgICAgIGFkZF9kZWZpbml0aW9ucygtYW5zaSAtRF9QT1NJWF9DX1NPVVJDRT0xOTkzMDlMIC1EX0JTRF9TT1VSQ0UgLXBlZGFudGljKQorICAgZWxzZShOT1QgTVNWQykKKyAgICAgICAgYWRkX2RlZmluaXRpb25zKC1aYSAtRF9QT1NJWF9DX1NPVVJDRT0xOTkzMDlMIC1EX0JTRF9TT1VSQ0UgLVc0KQorICAgZW5kaWYoTk9UIE1TVkMpCitlbmRpZihEQlVTX0VOQUJMRV9BTlNJKQorCitvcHRpb24gKERCVVNfRU5BQkxFX1ZFUkJPU0VfTU9ERSAic3VwcG9ydCB2ZXJib3NlIGRlYnVnIG1vZGUiIE9OKQorCitvcHRpb24gKERCVVNfRElTQUJMRV9DSEVDS1MgIkRpc2FibGUgcHVibGljIEFQSSBzYW5pdHkgY2hlY2tpbmciIE9GRikKKworaWYoTk9UIE1TVkMpCisgICAgb3B0aW9uIChEQlVTX0dDT1ZfRU5BQkxFRCAiY29tcGlsZSB3aXRoIGNvdmVyYWdlIHByb2ZpbGluZyBpbnN0cnVtZW50YXRpb24gKGdjYyBvbmx5KSIgT0ZGKQorICAgIGlmKERCVVNfR0NPVl9FTkFCTEVEKQorICAgICAgICAgICAgYWRkX2RlZmluaXRpb25zKC1mcHJvZmlsZS1hcmNzIC1mdGVzdC1jb3ZlcmFnZSkKKyAgICAgICAgICAgICMgRklYTUUhISEhCisgICAgICAgICAgICAjIyByZW1vdmUgb3B0aW1pemF0aW9uCisgICAgIyAgICAgICAgQ0ZMQUdTPWBlY2hvICIkQ0ZMQUdTIiB8IHNlZCAtZSAncy8tT1swLTldKi8vZydgCisgICAgZW5kaWYoREJVU19HQ09WX0VOQUJMRUQpCitlbmRpZihOT1QgTVNWQykKKworaWYoIiR7Q01BS0VfU1lTVEVNX05BTUV9IiBTVFJFUVVBTCAiTGludXgiKQorICAgIG9wdGlvbiAoREJVU19CVVNfRU5BQkxFX0lOT1RJRlkgImJ1aWxkIHdpdGggaW5vdGlmeSBzdXBwb3J0IChsaW51eCBvbmx5KSIgT04pCisgICAgaWYoREJVU19CVVNfRU5BQkxFX0lOT1RJRlkpCisgICAgICAgIGlmKE5PVCBIQVZFX1NZU19JTk9USUZZX0gpCisgICAgICAgICAgICBtZXNzYWdlKEZBVEFMX0VSUk9SICJzeXMvaW5vdGlmeS5oIG5vdCBmb3VuZCEiKQorICAgICAgICBlbmRpZihOT1QgSEFWRV9TWVNfSU5PVElGWV9IKQorICAgIGVuZGlmKERCVVNfQlVTX0VOQUJMRV9JTk9USUZZKQorZWxzZWlmKCIke0NNQUtFX1NZU1RFTV9OQU1FfSIgTUFUQ0hFUyAiLipCU0QiKQorICAgIG9wdGlvbiAoREJVU19CVVNfRU5BQkxFX0tRVUVVRSAiYnVpbGQgd2l0aCBrcXVldWUgc3VwcG9ydCAoRnJlZUJTRCBvbmx5KSIgT04pCisgICAgaWYoREJVU19CVVNfRU5BQkxFX0tRVUVVRSkKKyAgICAgICAgaWYoTk9UIEhBVkVfU1lTX0VWRU5UX0gpCisgICAgICAgICAgICBtZXNzYWdlKEZBVEFMX0VSUk9SICJzeXMvZXZlbnQuaCBub3QgZm91bmQhIikKKyAgICAgICAgZW5kaWYoTk9UIEhBVkVfU1lTX0VWRU5UX0gpCisgICAgZW5kaWYoREJVU19CVVNfRU5BQkxFX0tRVUVVRSkKK2VuZGlmKCIke0NNQUtFX1NZU1RFTV9OQU1FfSIgU1RSRVFVQUwgIkxpbnV4IikKKworU1RSSU5HKFRPVVBQRVIgJHtDTUFLRV9TWVNURU1fTkFNRX0gc3lzbmFtZSkKK2lmKCIke3N5c25hbWV9IiBNQVRDSEVTICIuKlNPTEFSSVMuKiIpCisgICAgb3B0aW9uIChIQVZFX0NPTlNPTEVfT1dORVJfRklMRSAiZW5hYmxlIGNvbnNvbGUgb3duZXIgZmlsZSAoc29sYXJpcyBvbmx5KSIgT04pCisgICAgaWYoSEFWRV9DT05TT0xFX09XTkVSX0ZJTEUpCisgICAgICAgIHNldCAoREJVU19DT05TT0xFX09XTkVSX0ZJTEUgIi9kZXYvY29uc29sZSIgQ0FDSEUgU1RSSU5HICJEaXJlY3RvcnkgdG8gY2hlY2sgZm9yIGNvbnNvbGUgb3duZXJoaXAiKQorICAgIGVuZGlmKEhBVkVfQ09OU09MRV9PV05FUl9GSUxFKQorZW5kaWYoIiR7c3lzbmFtZX0iIE1BVENIRVMgIi4qU09MQVJJUy4qIikKKworaWYoTk9UIEVYUEFUX0ZPVU5EKQorICAgIG1lc3NhZ2UoRkFUQUxfRVJST1IgImV4cGF0IG5vdCBmb3VuZCEiKQorZW5kaWYoTk9UIEVYUEFUX0ZPVU5EKQorCisjIGFsbCBtaXNzaW5nIG9yIGhhcmRjb2RlZCBmb3Igbm93CisKKyMgJ2hpZGRlbicgb25lcworc2V0KGF0b21pY19pbnQgT0ZGKQorc2V0KGF0b21pY19pbnQ0ODYgT0ZGKQoraWYoQ01BS0VfQ09NUElMRVJfSVNfR05VQ0MgQU5EIE5PVCBEQlVTX0VOQUJMRV9BTlNJKQorICAgIEZJTkRfUFJPR1JBTShVTkFNRV9FWEVDVVRBQkxFCisgICAgICAgICAgICAgICAgICAgIE5BTUVTIHVuYW1lCisgICAgICAgICAgICAgICAgICAgIFBBVEhTIC9iaW4gL3Vzci9iaW4gL3Vzci9sb2NhbC9iaW4gYzovUHJvZ3JhbW1lL01TeXMvYmluIGQ6L1Byb2dyYW1tZS9NU3lzL2JpbikKKworICAgIGlmKFVOQU1FX0VYRUNVVEFCTEUpCisgICAgICAgIEVYRUNVVEVfUFJPQ0VTUyhDT01NQU5EICR7VU5BTUVfRVhFQ1VUQUJMRX0gIi1tIgorICAgICAgICAgICAgICAgICAgICAgICAgT1VUUFVUX1ZBUklBQkxFIFVOQU1FX09VVFBVVCkKKworICAgICAgICBpZigiVU5BTUVfT1VUUFVUIiBNQVRDSEVTICJeLippWzAxMjNdODYuKiQiKQorICAgICAgICAgICAgc2V0KGF0b21pY19pbnQgT04pCisgICAgICAgIGVsc2UoIlVOQU1FX09VVFBVVCIgTUFUQ0hFUyAiXi4qaVswMTIzXTg2LiokIikKKyAgICAgICAgICAgIGlmKCJVTkFNRV9PVVRQVVQiIE1BVENIRVMgIl4uKmk/ODYuKiQiKQorICAgICAgICAgICAgICAgIHNldChhdG9taWNfaW50IE9OKQorICAgICAgICAgICAgICAgIHNldChhdG9taWNfaW50XzQ4NiBPTikKKyAgICAgICAgICAgIGVuZGlmKCJVTkFNRV9PVVRQVVQiIE1BVENIRVMgIl4uKmk/ODYuKiQiKQorICAgICAgICBlbmRpZigiVU5BTUVfT1VUUFVUIiBNQVRDSEVTICJeLippWzAxMjNdODYuKiQiKQorICAgIGVuZGlmKFVOQU1FX0VYRUNVVEFCTEUpCitlbmRpZihDTUFLRV9DT01QSUxFUl9JU19HTlVDQyBBTkQgTk9UIERCVVNfRU5BQkxFX0FOU0kpCisKK2lmKFgxMV9GT1VORCkKKyAgb3B0aW9uIChEQlVTX0JVSUxEX1gxMSAiQnVpbGQgd2l0aCBYMTEgYXV0b2xhdW5jaCBzdXBwb3J0ICIgT04pCitlbmRpZihYMTFfRk9VTkQpCisKKyMgdGVzdCBiaW5hcnkgbmFtZXMKK2lmIChXSU4zMikKKyAgICAjIGZvbGxvdyBBdXRvbWFrZSdzIG5hbWluZyBjb252ZW50aW9uIHNvIHdlIGNhbiBzaGFyZSAuaW4gZmlsZXMKKyAgICBzZXQgKEVYRUVYVCAke0NNQUtFX0VYRUNVVEFCTEVfU1VGRklYfSkKK2VuZGlmKFdJTjMyKQorCitpZiAoTVNWQ19JREUpCisgICAgaWYoQ01BS0VfQlVJTERfVFlQRSBNQVRDSEVTIERlYnVnKQorCQlzZXQoSURFX0JJTiAvRGVidWcgKQorCQltZXNzYWdlKFNUQVRVUykKKwkJbWVzc2FnZShTVEFUVVMgIlZpc3VhbCBTdHVkaW86IHRlc3QgcHJvZ3JhbXMgd2lsbCBvbmx5IHdvcmsgd2l0aCAnRGVidWcnIGNvbmZpZ3VyYXRpb24hIikKKwkJbWVzc2FnZShTVEFUVVMgIlRvIHJ1biB0ZXN0cyB3aXRoICdSZWxlYXNlJyBjb25maWd1cmF0aW9uIHVzZSAtRENNQUtFX0JVSUxEX1RZUEU9UmVsZWFzZSIpCisJCW1lc3NhZ2UoU1RBVFVTICJBZGQgJy4uXFwuLlxcdGVzdFxcZGF0YScgdG8gdGhlIGNvbW1hbmQgbGluZSBvcHRpb24gb2YgdGhlIHRlc3QgcHJvZ3JhbXMiKQorCQltZXNzYWdlKFNUQVRVUykKKyAgICBlbHNlKENNQUtFX0JVSUxEX1RZUEUgTUFUQ0hFUyBEZWJ1ZykKKwkJc2V0KElERV9CSU4gL1JlbGVhc2UpCisJCW1lc3NhZ2UoU1RBVFVTKQorCQltZXNzYWdlKFNUQVRVUyAiVmlzdWFsIFN0dWRpbzogdGVzdCBwcm9ncmFtcyB3aWxsIG9ubHkgd29yayB3aXRoICdSZWxlYXNlJyBjb25maWd1cmF0aW9uISIpCisJCW1lc3NhZ2UoU1RBVFVTICJUbyBydW4gdGVzdHMgd2l0aCAnRGVidWcnIGNvbmZpZ3VyYXRpb24gdXNlIC1EQ01BS0VfQlVJTERfVFlQRT1EZWJ1ZyIpCisJCW1lc3NhZ2UoU1RBVFVTICJBZGQgJy4uXFwuLlxcdGVzdFxcZGF0YScgdG8gdGhlIGNvbW1hbmQgbGluZSBvcHRpb24gb2YgdGhlIHRlc3QgcHJvZ3JhbXMiKQorCQltZXNzYWdlKFNUQVRVUykKKyAgICBlbmRpZihDTUFLRV9CVUlMRF9UWVBFIE1BVENIRVMgRGVidWcpCisJc2V0IChURVNUX1BBVEhfRk9SQ0UgRk9SQ0UpCisJRklMRShSRU1PVkUgJHtDTUFLRV9CSU5BUllfRElSfS9kYXRhL2RidXMtMS9zZXJ2aWNlcykKK2VuZGlmIChNU1ZDX0lERSkKKworIyMjIyBGaW5kIHNvY2tldCBkaXJlY3RvcmllcworaWYoVU5JWCkKKyAgICBpZihOT1QgJEVOVntUTVBESVJ9IFNUUkVRVUFMICIiKQorICAgICAgICBzZXQoREJVU19TRVNTSU9OX1NPQ0tFVF9ESVIgJEVOVntUTVBESVJ9KQorICAgIGVsc2VpZihOT1QgJEVOVntURU1QfSBTVFJFUVVBTCAiIikKKyAgICAgICAgc2V0KERCVVNfU0VTU0lPTl9TT0NLRVRfRElSICRFTlZ7VEVNUH0pCisgICAgZWxzZWlmKE5PVCAkRU5We1RNUH0gU1RSRVFVQUwgIiIpCisgICAgICAgIHNldChEQlVTX1NFU1NJT05fU09DS0VUX0RJUiAkRU5We1RNUH0pCisgICAgZWxzZSgpCisgICAgICAgIHNldChEQlVTX1NFU1NJT05fU09DS0VUX0RJUiAvdG1wKQorICAgIGVuZGlmKCkKK2VuZGlmKCkKKworICMgTm90IHVzZWQgb24gV2luZG93cywgd2hlcmUgdGhlcmUgaXMgbm8gc3lzdGVtIGJ1cworc2V0IChEQlVTX1NZU1RFTV9QSURfRklMRSAke0RCVVNfUlVOU1RBVEVESVJ9L2RidXMvcGlkKQorCitzZXQgKERCVVNfQ09OU09MRV9BVVRIX0RJUiAiIiBDQUNIRSBTVFJJTkcgIkRpcmVjdG9yeSB0byBjaGVjayBmb3IgcGFtX2NvbnNvbGUvcGFtX2ZvcmVncm91bmQgZmxhZyBmaWxlcywgb3IgZW1wdHkgdG8gaWdub3JlIikKKworIyBUaGlzIHdvbid0IHdvcmsgb24gV2luZG93cy4gSXQncyBub3QgbWVhbnQgdG8gLSB0aGUgc3lzdGVtIGJ1cyBpcworIyBtZWFuaW5nbGVzcyBvbiBXaW5kb3dzIGFueXdheS4KKyMKKyMgVGhpcyBoYXMgdG8gYmUgc3VpdGFibGUgZm9yIGhhcmQtY29kaW5nIGluIGNsaWVudCBsaWJyYXJpZXMgYXMgd2VsbCBhcworIyBpbiB0aGUgZGJ1cy1kYWVtb24ncyBjb25maWd1cmF0aW9uLCBzbyBpdCBoYXMgdG8gYmUgdmFsaWQgdG8gbGlzdGVuIG9uCisjIGFuZCBhbHNvIHRvIGNvbm5lY3QgdG8uIElmIHRoaXMgZXZlciBjaGFuZ2VzLCBpdCdsbCBuZWVkIHRvIGJlIHNwbGl0IGludG8KKyMgdHdvIHZhcmlhYmxlcywgb25lIGZvciB0aGUgbGlzdGVuaW5nIGFkZHJlc3MgYW5kIG9uZSBmb3IgdGhlIGNvbm5lY3RpbmcKKyMgYWRkcmVzcy4KK3NldCAoREJVU19TWVNURU1fQlVTX0RFRkFVTFRfQUREUkVTUyAidW5peDpwYXRoPSR7REJVU19SVU5TVEFURURJUn0vZGJ1cy9zeXN0ZW1fYnVzX3NvY2tldCIgQ0FDSEUgU1RSSU5HICJzeXN0ZW0gYnVzIGRlZmF1bHQgYWRkcmVzcyIpCisKK2lmIChXSU4zMikKKyAgc2V0IChEQlVTX1NFU1NJT05fQlVTX0xJU1RFTl9BRERSRVNTICJhdXRvbGF1bmNoOiIgQ0FDSEUgU1RSSU5HICJzZXNzaW9uIGJ1cyBkZWZhdWx0IGxpc3RlbmluZyBhZGRyZXNzIikKKyAgc2V0IChEQlVTX1NFU1NJT05fQlVTX0NPTk5FQ1RfQUREUkVTUyAiYXV0b2xhdW5jaDoiIENBQ0hFIFNUUklORyAic2Vzc2lvbiBidXMgZmFsbGJhY2sgYWRkcmVzcyBmb3IgY2xpZW50cyIpCisKKyAgc2V0IChEQlVTX1NZU1RFTV9DT05GSUdfRklMRSAic2hhcmUvZGJ1cy0xL3N5c3RlbS5jb25mIikKKyAgc2V0IChEQlVTX1NFU1NJT05fQ09ORklHX0ZJTEUgInNoYXJlL2RidXMtMS9zZXNzaW9uLmNvbmYiKQorICAjIGJ1cy10ZXN0IGV4cGVjdHMgYSBub24gZW1wdHkgc3RyaW5nCisgIHNldCAoREJVU19VU0VSICJBZG1pbmlzdHJhdG9yIikKKyAgc2V0IChEQlVTX1RFU1RfVVNFUiAiZ3Vlc3QiKQorICBzZXQgKERCVVNfU0VTU0lPTl9DT05GX01BWUJFX0FVVEhfRVhURVJOQUwgIjwhLS08YXV0aD5FWFRFUk5BTDwvYXV0aD4tLT4iKQorZWxzZSAoV0lOMzIpCisgIHNldCAoREJVU19TRVNTSU9OX0JVU19MSVNURU5fQUREUkVTUyAidW5peDp0bXBkaXI9JHtEQlVTX1NFU1NJT05fU09DS0VUX0RJUn0iIENBQ0hFIFNUUklORyAic2Vzc2lvbiBidXMgZGVmYXVsdCBsaXN0ZW5pbmcgYWRkcmVzcyIpCisgIHNldCAoREJVU19TRVNTSU9OX0JVU19DT05ORUNUX0FERFJFU1MgImF1dG9sYXVuY2g6IiBDQUNIRSBTVFJJTkcgInNlc3Npb24gYnVzIGZhbGxiYWNrIGFkZHJlc3MgZm9yIGNsaWVudHMiKQorICBzZXQgKHN5c2NvbmZkaXIgIiIpCisgIHNldCAoY29uZmlnZGlyICR7c3lzY29uZmRpcn0vZGJ1cy0xICkKKyAgc2V0IChEQlVTX1NZU1RFTV9DT05GSUdfRklMRSAgJHtjb25maWdkaXJ9L3N5c3RlbS5jb25mKQorICBzZXQgKERCVVNfU0VTU0lPTl9DT05GSUdfRklMRSAke2NvbmZpZ2Rpcn0vc2Vzc2lvbi5jb25mKQorICBzZXQgKERCVVNfVVNFUiAibWVzc2FnZWJ1cyIpCisgIHNldCAoREJVU19URVNUX1VTRVIgIm5vYm9keSIpCisgICMgRm9yIGJlc3Qgc2VjdXJpdHksIGFzc3VtZSB0aGF0IGFsbCBub24tV2luZG93cyBwbGF0Zm9ybXMgY2FuIGRvCisgICMgY3JlZGVudGlhbHMtcGFzc2luZy4KKyAgc2V0IChEQlVTX1NFU1NJT05fQ09ORl9NQVlCRV9BVVRIX0VYVEVSTkFMICI8YXV0aD5FWFRFUk5BTDwvYXV0aD4iKQorZW5kaWYgKFdJTjMyKQorCitzZXQgKERCVVNfREFFTU9OX05BTUUgImRidXMtZGFlbW9uIiBDQUNIRSBTVFJJTkcgIlRoZSBuYW1lIG9mIHRoZSBkYnVzIGRhZW1vbiBleGVjdXRhYmxlIikKKworIyMjIyMjIyMjIyMgY3JlYXRlIGNvbmZpZy5oICMjIyMjIyMjIyMjIyMjIworCisjaW5jbHVkZShDb25maWd1cmVDaGVja3MuY21ha2UpCisKKyMgYmV0dGVyIHVzZSBmbGFncyBmb3IgZ2NjCitpZiAoTUlOR1cpCisJc2V0IChIQVZFX0dOVUNfVkFSQVJHUyAxKQorZW5kaWYoTUlOR1cpCisKKyMgY29tcGlsZXIgZGVmaW5pdGlvbnMKK2FkZF9kZWZpbml0aW9ucygtREhBVkVfQ09ORklHX0g9MSkKK2FkZF9kZWZpbml0aW9ucygke0RCVVNfQlVTX0NGTEFHU30pCisKKworaWYgKERCVVNfQlVJTERfVEVTVFMpCisgICAgIyBzZXQgdmFyaWFibGVzIHVzZWQgZm9yIHRoZSAuaW4gZmlsZXMgKHN1YnN0aXR1dGVkIGJ5IGNvbmZpZ3VyZV9maWxlKSBpbiB0ZXN0L2RhdGE6CisgICAgc2V0KERCVVNfVEVTVF9FWEVDICR7RVhFQ1VUQUJMRV9PVVRQVVRfUEFUSH0ke0lERV9CSU59KQorICAgIHNldChEQlVTX1RFU1RfREFUQSAke0NNQUtFX0JJTkFSWV9ESVJ9L3Rlc3QvZGF0YSkKKyAgICBzZXQoVEVTVF9MQVVOQ0hfSEVMUEVSX0JJTkFSWSAke0VYRUNVVEFCTEVfT1VUUFVUX1BBVEh9L2RidXMtZGFlbW9uLWxhdW5jaC1oZWxwZXItdGVzdCkKKyAgICBpZiAoVU5JWCkKKyAgICAgICAgc2V0KFRFU1RfU09DS0VUX0RJUiAke0RCVVNfU0VTU0lPTl9TT0NLRVRfRElSfSkKKyAgICAgICAgc2V0KFRFU1RfTElTVEVOICJ1bml4OnRtcGRpcj0ke1RFU1RfU09DS0VUX0RJUn0iKQorICAgIGVuZGlmKCkKKyAgICBpZiAoV0lOMzIpCisgICAgICAgIHNldCAoVEVTVF9MSVNURU4gInRjcDpob3N0PWxvY2FsaG9zdCIpCisgICAgZW5kaWYgKFdJTjMyKQorZW5kaWYgIChEQlVTX0JVSUxEX1RFU1RTKQorCitzZXQoREJVU19MSUJSQVJJRVMgZGJ1cy0xKQorc2V0KERCVVNfSU5URVJOQUxfTElCUkFSSUVTIGRidXMtaW50ZXJuYWwpCisKK3NldCAoREJVU19JTlRFUk5BTF9BRERfTElCUkFSWV9PUFRJT05TIFNUQVRJQykKK3NldCAoREJVU19JTlRFUk5BTF9DTElFTlRfREVGSU5JVElPTlMgIi1EREJVU19DT01QSUxBVElPTiIpCisKK2NvbmZpZ3VyZV9maWxlKCR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9jb25maWcuaC5jbWFrZSAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vY29uZmlnLmggKQorCitpZiAoV0lOMzIpCitjb25maWd1cmVfZmlsZSgke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vZGJ1cy1lbnYuYmF0LmNtYWtlICR7Q01BS0VfQklOQVJZX0RJUn0vYmluL2RidXMtZW52LmJhdCApCisgICAgaW5zdGFsbChGSUxFUyAke0NNQUtFX0JJTkFSWV9ESVJ9L2Jpbi9kYnVzLWVudi5iYXQgREVTVElOQVRJT04gYmluKQorZW5kaWYoKQorCithZGRfZGVmaW5pdGlvbnMoLURIQVZFX0NPTkZJR19IPTEpCisKKyMKKyMgY3JlYXRlIGNtYWtlIGZpbmRfcGFja2FnZSByZWxhdGVkIGZpbGVzCisjCitzZXQoSU5TVEFMTF9DTUFLRV9ESVIgJHtDTUFLRV9JTlNUQUxMX0xJQkRJUn0vY21ha2UvREJ1czEpCitpZihXSU4zMikKKyAgIGNvbmZpZ3VyZV9maWxlKERCdXMxQ29uZmlnLmNtYWtlLmluICIke0NNQUtFX0JJTkFSWV9ESVJ9L0RCdXMxQ29uZmlnLmNtYWtlIiBAT05MWSkKK2Vsc2UoKQorICAgY29uZmlndXJlX2ZpbGUoREJ1czFDb25maWcucGtnY29uZmlnLmluICIke0NNQUtFX0JJTkFSWV9ESVJ9L0RCdXMxQ29uZmlnLmNtYWtlIiBAT05MWSkKK2VuZGlmKCkKK2NvbmZpZ3VyZV9maWxlKERCdXMxQ29uZmlnVmVyc2lvbi5jbWFrZS5pbiAiJHtDTUFLRV9CSU5BUllfRElSfS9EQnVzMUNvbmZpZ1ZlcnNpb24uY21ha2UiIEBPTkxZKQoraW5zdGFsbChGSUxFUworICAgICIke0NNQUtFX0JJTkFSWV9ESVJ9L0RCdXMxQ29uZmlnLmNtYWtlIgorICAgICIke0NNQUtFX0JJTkFSWV9ESVJ9L0RCdXMxQ29uZmlnVmVyc2lvbi5jbWFrZSIKKyAgICBERVNUSU5BVElPTiAiJHtJTlNUQUxMX0NNQUtFX0RJUn0iIENPTVBPTkVOVCBkZXYKKykKKworaWYoV0lOMzIpCisgICAgaW5zdGFsbChFWFBPUlQgREJ1czFUYXJnZXRzIERFU1RJTkFUSU9OICIke0lOU1RBTExfQ01BS0VfRElSfSIgQ09NUE9ORU5UIGRldikKK2VuZGlmKCkKKworIyMjIyMjIyMjIyMgc3ViZGlycyAjIyMjIyMjIyMjIyMjIyMKKworYWRkX3N1YmRpcmVjdG9yeSggZGJ1cyApCithZGRfc3ViZGlyZWN0b3J5KCBidXMgKQoraWYgKERCVVNfQlVJTERfVEVTVFMpCisJYWRkX3N1YmRpcmVjdG9yeSggdGVzdCApCisJYWRkX2N1c3RvbV90YXJnZXQoY2hlY2sKKwkJQ09NTUFORCBjdGVzdCAtUiBedGVzdC0uKgorCSkKK2VuZGlmIChEQlVTX0JVSUxEX1RFU1RTKQorYWRkX3N1YmRpcmVjdG9yeSggdG9vbHMgKQorYWRkX3N1YmRpcmVjdG9yeSggZG9jICkKKworCitPUFRJT04oREJVU19JTlNUQUxMX1NZU1RFTV9MSUJTICJpbnN0YWxsIHJlcXVpcmVkIHN5c3RlbSBsaWJyYXJpZXMiIE9GRikKK01FU1NBR0UoIiAiKQorTUVTU0FHRSgic2V0IC1EREJVU19JTlNUQUxMX1NZU1RFTV9MSUJTPTEgdG8gaW5zdGFsbCBydW50aW1lIGxpYnJhcmllcyB0b28iKQorTUVTU0FHRSgic2V0IERCVVNESVIgKGVudmlyb25tZW50IG9yIGNtYWtlIG9wdGlvbikgdG8gb3ZlcndyaXRlIHRoZSBkZWZhdWx0IGluc3RhbGwgZGlyZWN0b3J5ICIpCitNRVNTQUdFKCIgIikKK01FU1NBR0UoIiAiKQorR0VUX0ZJTEVOQU1FX0NPTVBPTkVOVChDX0NPTVBJTEVSICR7Q01BS0VfQ19DT01QSUxFUn0gTkFNRSkKK0dFVF9GSUxFTkFNRV9DT01QT05FTlQoQ1hYX0NPTVBJTEVSICR7Q01BS0VfQ1hYX0NPTVBJTEVSfSBOQU1FKQorCittZXNzYWdlKCIgICAgICAgICAgICAgICAgICBELUJVUyAke0RCVVNfVkVSU0lPTn0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIikKK21lc3NhZ2UoIiAgICAgICAgICAgICAgICAgID09PT09PT09PT09PT0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKQorbWVzc2FnZSgiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpCittZXNzYWdlKCIgICAgICAgIGluc3RhbGwgcHJlZml4OiAgICAgICAgICAgJHtwcmVmaXh9ICAgICAgICAgICAgICAgICAgICAgICAgICAgIikKK21lc3NhZ2UoIiAgICAgICAgaW5zdGFsbCBleGVjX3ByZWZpeDogICAgICAke2V4ZWNfcHJlZml4fSAgICAgICAgICAgICAgICAgICAgICAiKQorbWVzc2FnZSgiICAgICAgICBpbnN0YWxsIGxpYmRpcjogICAgICAgICAgICR7Q01BS0VfSU5TVEFMTF9GVUxMX0xJQkRJUn0gICAgICAgICIpCittZXNzYWdlKCIgICAgICAgIGluc3RhbGwgYmluZGlyOiAgICAgICAgICAgJHtDTUFLRV9JTlNUQUxMX0ZVTExfQklORElSfSAgICAgICAgIikKK21lc3NhZ2UoIiAgICAgICAgaW5zdGFsbCBzeXNjb25mZGlyOiAgICAgICAke0NNQUtFX0lOU1RBTExfRlVMTF9TWVNDT05GRElSfSAgICAiKQorbWVzc2FnZSgiICAgICAgICBpbnN0YWxsIGRhdGFkaXI6ICAgICAgICAgICR7Q01BS0VfSU5TVEFMTF9GVUxMX0RBVEFESVJ9ICAgICAgICIpCittZXNzYWdlKCIgICAgICAgIHNvdXJjZSBjb2RlIGxvY2F0aW9uOiAgICAgJHtEQlVTX1NPVVJDRV9ESVJ9ICAgICAgICAgICAgICAgICAgIikKK21lc3NhZ2UoIiAgICAgICAgYnVpbGQgZGlyOiAgICAgICAgICAgICAgICAke0NNQUtFX0JJTkFSWV9ESVJ9ICAgICAgICAgICAgICAgICAiKQorbWVzc2FnZSgiICAgICAgICBjIGNvbXBpbGVyOiAgICAgICAgICAgICAgICR7Q19DT01QSUxFUn0gICAgICAgICAgICAgICAgICAgICAgICIpCittZXNzYWdlKCIgICAgICAgIGNmbGFnczogICAgICAgICAgICAgICAgICAgJHtDTUFLRV9DX0ZMQUdTfSAgICAgICAgICAgICAgICAgICAgIikKK21lc3NhZ2UoIiAgICAgICAgY2ZsYWdzIGRlYnVnOiAgICAgICAgICAgICAke0NNQUtFX0NfRkxBR1NfREVCVUd9ICAgICAgICAgICAgICAiKQorbWVzc2FnZSgiICAgICAgICBjZmxhZ3MgcmVsZWFzZTogICAgICAgICAgICR7Q01BS0VfQ19GTEFHU19SRUxFQVNFfSAgICAgICAgICAgICIpCittZXNzYWdlKCIgICAgICAgIGN4eCBjb21waWxlcjogICAgICAgICAgICAgJHtDWFhfQ09NUElMRVJ9ICAgICAgICAgICAgICAgICAgICAgIikKK21lc3NhZ2UoIiAgICAgICAgY3h4ZmxhZ3M6ICAgICAgICAgICAgICAgICAke0NNQUtFX0NYWF9GTEFHU30gICAgICAgICAgICAgICAgICAiKQorbWVzc2FnZSgiICAgICAgICBjeHhmbGFncyBkZWJ1ZzogICAgICAgICAgICR7Q01BS0VfQ1hYX0ZMQUdTX0RFQlVHfSAgICAgICAgICAgICIpCittZXNzYWdlKCIgICAgICAgIGN4eGZsYWdzIHJlbGVhc2U6ICAgICAgICAgJHtDTUFLRV9DWFhfRkxBR1NfUkVMRUFTRX0gICAgICAgICAgIikKK21lc3NhZ2UoIiAgICAgICAgNjQtYml0IGludDogICAgICAgICAgICAgICAke0RCVVNfSU5UNjRfVFlQRX0gICAgICAgICAgICAgICAgICAiKQorbWVzc2FnZSgiICAgICAgICAzMi1iaXQgaW50OiAgICAgICAgICAgICAgICR7REJVU19JTlQzMl9UWVBFfSAgICAgICAgICAgICAgICAgICIpCittZXNzYWdlKCIgICAgICAgIDE2LWJpdCBpbnQ6ICAgICAgICAgICAgICAgJHtEQlVTX0lOVDE2X1RZUEV9ICAgICAgICAgICAgICAgICAgIikKK21lc3NhZ2UoIiAgICAgICAgRG94eWdlbjogICAgICAgICAgICAgICAgICAke0RPWFlHRU59ICAgICAgICAgICAgICAgICAgICAgICAgICAiKQorbWVzc2FnZSgiICAgICAgICBEb2Nib29rIEdlbmVyYXRvcjogICAgICAgICR7RE9DQk9PS19HRU5FUkFUT1JfTkFNRX0gICAgICAgICAgICIpCisKKworbWVzc2FnZSgiICAgICAgICBnY2MgY292ZXJhZ2UgcHJvZmlsaW5nOiAgICR7REJVU19HQ09WX0VOQUJMRUR9ICAgICAgICAgICAgICAgICIpCittZXNzYWdlKCIgICAgICAgIEJ1aWxkaW5nIHVuaXQgdGVzdHM6ICAgICAgJHtEQlVTX0JVSUxEX1RFU1RTfSAgICAgICAgICAgICAgICAgIikKK21lc3NhZ2UoIiAgICAgICAgQnVpbGRpbmcgd2l0aCBHTGliOiAgICAgICAke0RCVVNfV0lUSF9HTElCfSAgICAgICAgICAgICAgICAgICAiKQorbWVzc2FnZSgiICAgICAgICBCdWlsZGluZyB2ZXJib3NlIG1vZGU6ICAgICR7REJVU19FTkFCTEVfVkVSQk9TRV9NT0RFfSAgICAgICAgICIpCittZXNzYWdlKCIgICAgICAgIEJ1aWxkaW5nIHcvbyBhc3NlcnRpb25zOiAgJHtEQlVTX0RJU0FCTEVfQVNTRVJUfSAgICAgICAgICAgICAgIikKK21lc3NhZ2UoIiAgICAgICAgQnVpbGRpbmcgdy9vIGNoZWNrczogICAgICAke0RCVVNfRElTQUJMRV9DSEVDS1N9ICAgICAgICAgICAgICAiKQorbWVzc2FnZSgiICAgICAgICBCdWlsZGluZyBidXMgc3RhdHMgQVBJOiAgICR7REJVU19FTkFCTEVfU1RBVFN9ICAgICAgICAgICAgICAgICIpCittZXNzYWdlKCIgICAgICAgIGluc3RhbGxpbmcgc3lzdGVtIGxpYnM6ICAgJHtEQlVTX0lOU1RBTExfU1lTVEVNX0xJQlN9ICAgICAgICAgIikKK21lc3NhZ2UoIiAgICAgICAgQnVpbGRpbmcgaW5vdGlmeSBzdXBwb3J0OiAke0RCVVNfQlVTX0VOQUJMRV9JTk9USUZZfSAgICAgICAgICAiKQorbWVzc2FnZSgiICAgICAgICBCdWlsZGluZyBrcXVldWUgc3VwcG9ydDogICR7REJVU19CVVNfRU5BQkxFX0tRVUVVRX0gICAgICAgICAgICIpCittZXNzYWdlKCIgICAgICAgIEJ1aWxkaW5nIERveHlnZW4gZG9jczogICAgJHtEQlVTX0VOQUJMRV9ET1hZR0VOX0RPQ1N9ICAgICAgICAgIikKK21lc3NhZ2UoIiAgICAgICAgQnVpbGRpbmcgWE1MIGRvY3M6ICAgICAgICAke0RCVVNfRU5BQkxFX1hNTF9ET0NTfSAgICAgICAgICAgICAiKQorbWVzc2FnZSgiICAgICAgICBEYWVtb24gZXhlY3V0YWJsZSBuYW1lOiAgICR7REJVU19EQUVNT05fTkFNRX0iKQoraWYoV0lOMzIpCittZXNzYWdlKCIgICAgICAgIFNlc3Npb24gYnVzIGxpc3RlbnMgb246ICAgJHtEQlVTX1NFU1NJT05fQlVTX0xJU1RFTl9BRERSRVNTfSAgIikKK21lc3NhZ2UoIiAgICAgICAgU2Vzc2lvbiBjbGllbnRzIGNvbm5lY3QgdG86ICR7REJVU19TRVNTSU9OX0JVU19DT05ORUNUX0FERFJFU1N9ICIpCitlbHNlKCkKK21lc3NhZ2UoIiAgICAgICAgU3lzdGVtIGJ1cyBhZGRyZXNzOiAgICAgICAke0RCVVNfU1lTVEVNX0JVU19ERUZBVUxUX0FERFJFU1N9ICAiKQorbWVzc2FnZSgiICAgICAgICBTeXN0ZW0gYnVzIHNvY2tldDogICAgICAgICR7REJVU19TWVNURU1fU09DS0VUfSAgICAgICAgICAgICAgICIpCittZXNzYWdlKCIgICAgICAgIFN5c3RlbSBidXMgUElEIGZpbGU6ICAgICAgJHtEQlVTX1NZU1RFTV9QSURfRklMRX0gICAgICAgICAgICAgIikKK21lc3NhZ2UoIiAgICAgICAgU3lzdGVtIGJ1cyB1c2VyOiAgICAgICAgICAke0RCVVNfVVNFUn0gICAgICAgICAgICAgICAgICAgICAgICAiKQorbWVzc2FnZSgiICAgICAgICBTZXNzaW9uIGJ1cyBzb2NrZXQgZGlyOiAgICR7REJVU19TRVNTSU9OX1NPQ0tFVF9ESVJ9ICAgICAgICAgICIpCisKK2lmKERCVVNfQ09OU09MRV9BVVRIX0RJUikKK21lc3NhZ2UoIiAgICAgICAgcGFtX2NvbnNvbGUgYXV0aCBkaXI6ICAgICAke0RCVVNfQ09OU09MRV9BVVRIX0RJUn0gICAgICAgICAgICAiKQorZWxzZSgpCittZXNzYWdlKCIgICAgICAgIHBhbV9jb25zb2xlIGF1dGggZGlyOiAgICAgKG5vbmUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIikKK2VuZGlmKCkKKworbWVzc2FnZSgiICAgICAgICAnbWFrZSBjaGVjaycgc29ja2V0IGRpcjogICR7VEVTVF9TT0NLRVRfRElSfSAgICAgICAgICAgICAgICAgICIpCitlbmRpZigpCittZXNzYWdlKCIgICAgICAgIFRlc3QgbGlzdGVuIGFkZHJlc3M6ICAgICAgJHtURVNUX0xJU1RFTn0gICAgICAgICAgICAgICAgICAgICAgIikKK2lmIChNU1ZDKQorbWVzc2FnZSgiICAgICAgICBidWlsZCB0aW1lc3RhbXA6ICAgICAgICAgICR7REJVU19CVUlMRF9USU1FU1RBTVB9ICAgICAgICAgICAgICIpCitlbmRpZiAoTVNWQykKKworTUVTU0FHRSgiICIpCitpZiAoREJVU19CVUlMRF9URVNUUykKKyAgICBtZXNzYWdlKCJOT1RFOiBidWlsZGluZyB3aXRoIHVuaXQgdGVzdHMgaW5jcmVhc2VzIHRoZSBzaXplIG9mIHRoZSBpbnN0YWxsZWQgbGlicmFyeSBhbmQgcmVuZGVycyBpdCBpbnNlY3VyZS4iKQorZW5kaWYoREJVU19CVUlMRF9URVNUUykKKworaWYgKERCVVNfQlVJTERfVEVTVFMgQU5EIERCVVNfRElTQUJMRV9BU1NFUlQpCisgICAgbWVzc2FnZSgiTk9URTogYnVpbGRpbmcgd2l0aCB1bml0IHRlc3RzIGJ1dCB3aXRob3V0IGFzc2VydGlvbnMgbWVhbnMgdGVzdHMgbWF5IG5vdCBwcm9wZXJseSByZXBvcnQgZmFpbHVyZXMgKHRoaXMgY29uZmlndXJhdGlvbiBpcyBvbmx5IHVzZWZ1bCB3aGVuIGRvaW5nIHNvbWV0aGluZyBsaWtlIHByb2ZpbGluZyB0aGUgdGVzdHMpIikKK2VuZGlmKERCVVNfQlVJTERfVEVTVFMgQU5EIERCVVNfRElTQUJMRV9BU1NFUlQpCisKK2lmIChEQlVTX0dDT1ZfRU5BQkxFRCkKKyAgICBtZXNzYWdlKCJOT1RFOiBidWlsZGluZyB3aXRoIGNvdmVyYWdlIHByb2ZpbGluZyBpcyBkZWZpbml0ZWx5IGZvciBkZXZlbG9wZXJzIG9ubHkuIikKK2VuZGlmKERCVVNfR0NPVl9FTkFCTEVEKQorCitpZiAoREJVU19FTkFCTEVfVkVSQk9TRV9NT0RFKQorICAgIG1lc3NhZ2UoIk5PVEU6IGJ1aWxkaW5nIHdpdGggdmVyYm9zZSBtb2RlIGluY3JlYXNlcyBsaWJyYXJ5IHNpemUsIG1heSBzbGlnaHRseSBpbmNyZWFzZSBzZWN1cml0eSByaXNrLCBhbmQgZGVjcmVhc2VzIHBlcmZvcm1hbmNlLiIpCitlbmRpZihEQlVTX0VOQUJMRV9WRVJCT1NFX01PREUpCisKK2lmKE5PVCBEQlVTX0RJU0FCTEVfQVNTRVJUKQorICAgIG1lc3NhZ2UoIk5PVEU6IGJ1aWxkaW5nIHdpdGggYXNzZXJ0aW9ucyBpbmNyZWFzZXMgbGlicmFyeSBzaXplIGFuZCBkZWNyZWFzZXMgcGVyZm9ybWFuY2UuIikKK2VuZGlmKE5PVCBEQlVTX0RJU0FCTEVfQVNTRVJUKQorCitpZiAoREJVU19ESVNBQkxFX0NIRUNLUykKKyAgICBtZXNzYWdlKCJOT1RFOiBidWlsZGluZyB3aXRob3V0IGNoZWNrcyBmb3IgYXJndW1lbnRzIHBhc3NlZCB0byBwdWJsaWMgQVBJIG1ha2VzIGl0IGhhcmRlciB0byBkZWJ1ZyBhcHBzIHVzaW5nIEQtQlVTLCBidXQgd2lsbCBzbGlnaHRseSBkZWNyZWFzZSBELUJVUyBsaWJyYXJ5IHNpemUgYW5kIF92ZXJ5XyBzbGlnaHRseSBpbXByb3ZlIHBlcmZvcm1hbmNlLiIpCitlbmRpZihEQlVTX0RJU0FCTEVfQ0hFQ0tTKQorCitmb3JlYWNoKF9ub3RlICR7Rk9PVE5PVEVTfSkKKyAgICBtZXNzYWdlKCR7X25vdGV9KQorZW5kZm9yZWFjaCgpCisKK01FU1NBR0UoIiAiKQorCitJTkNMVURFKG1vZHVsZXMvQ1BhY2tJbnN0YWxsQ29uZmlnLmNtYWtlKQorCithZGRfY3VzdG9tX3RhcmdldChoZWxwLW9wdGlvbnMKKyAgICBjbWFrZSAtTEggCisgICAgV09SS0lOR19ESVJFQ1RPUlkgJHtDTUFLRV9CSU5BUllfRElSfQorKQorCisjCisjIGNyZWF0ZSBwa2djb25maWcgZmlsZQorIworaWYoVU5JWCkKKyAgICBzZXQoUExBVEZPUk1fTElCUyBwdGhyZWFkICR7TElCUlR9KQorICAgIGluY2x1ZGUoRmluZFBrZ0NvbmZpZyBRVUlFVCkKKyAgICBpZihQS0dfQ09ORklHX0ZPVU5EKQorICAgICAgICAjIGNvbnZlcnQgbGlzdHMgb2YgbGluayBsaWJyYXJpZXMgaW50byAtbHN0ZGMrKyAtbG0gZXRjLi4KKyAgICAgICAgZm9yZWFjaChMSUIgJHtDTUFLRV9DX0lNUExJQ0lUX0xJTktfTElCUkFSSUVTfSAke1BMQVRGT1JNX0xJQlN9KQorICAgICAgICAgICAgc2V0KExJQkRCVVNfTElCUyAiJHtMSUJEQlVTX0xJQlN9IC1sJHtMSUJ9IikKKyAgICAgICAgZW5kZm9yZWFjaCgpCisgICAgICAgIHNldChvcmlnaW5hbF9wcmVmaXggIiR7Q01BS0VfSU5TVEFMTF9QUkVGSVh9IikKKyAgICAgICAgaWYoREJVU19SRUxPQ0FUQUJMRSkKKyAgICAgICAgICAgIHNldChwa2djb25maWdfcHJlZml4ICJcJHtwY2ZpbGVkaXJ9Ly4uLy4uLyIpCisgICAgICAgIGVsc2UoKQorICAgICAgICAgICAgc2V0KHBrZ2NvbmZpZ19wcmVmaXggIlwke29yaWdpbmFsX3ByZWZpeH0iKQorICAgICAgICBlbmRpZigpCisgICAgICAgIHNldChleGVjX3ByZWZpeCAiXCR7cHJlZml4fSIpCisgICAgICAgIHNldChiaW5kaXIgIlwke3ByZWZpeH0vJHtDTUFLRV9JTlNUQUxMX0JJTkRJUn0iKQorICAgICAgICBzZXQobGliZGlyICJcJHtwcmVmaXh9LyR7Q01BS0VfSU5TVEFMTF9MSUJESVJ9IikKKyAgICAgICAgc2V0KGluY2x1ZGVkaXIgIlwke3ByZWZpeH0vJHtDTUFLRV9JTlNUQUxMX0lOQ0xVREVESVJ9IikKKyAgICAgICAgc2V0KHN5c2NvbmZkaXIgIlwke3ByZWZpeH0vJHtDTUFLRV9JTlNUQUxMX1NZU0NPTkZESVJ9IikKKyAgICAgICAgc2V0KGRhdGFkaXIgIlwke3ByZWZpeH0vJHtDTUFLRV9JTlNUQUxMX0RBVEFESVJ9IikKKyAgICAgICAgc2V0KGRhdGFyb290ZGlyICJcJHtwcmVmaXh9LyR7Q01BS0VfSU5TVEFMTF9EQVRBRElSfSIpCisgICAgICAgIHNldChkYnVzX2RhZW1vbmRpciAiXCR7cHJlZml4fS8ke0NNQUtFX0lOU1RBTExfQklORElSfSIpCisgICAgICAgIGNvbmZpZ3VyZV9maWxlKC4uL2RidXMtMS5wYy5pbiAke0NNQUtFX0JJTkFSWV9ESVJ9L2RidXMtMS5wYyBAT05MWSkKKyAgICAgICAgaW5zdGFsbChGSUxFUyAke0NNQUtFX0JJTkFSWV9ESVJ9L2RidXMtMS5wYyBERVNUSU5BVElPTiAke0NNQUtFX0lOU1RBTExfTElCRElSfS9wa2djb25maWcpCisgICAgZW5kaWYoKQorZW5kaWYoKQpkaWZmIC0tZ2l0IGEvY21ha2UvQ29uZmlndXJlQ2hlY2tzLmNtYWtlIGIvY21ha2UvQ29uZmlndXJlQ2hlY2tzLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5YTVmYzkKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFrZS9Db25maWd1cmVDaGVja3MuY21ha2UKQEAgLTAsMCArMSwxNzIgQEAKK2luY2x1ZGUoQ2hlY2tJbmNsdWRlRmlsZSkKK2luY2x1ZGUoQ2hlY2tJbmNsdWRlRmlsZXMpCitpbmNsdWRlKENoZWNrU3ltYm9sRXhpc3RzKQoraW5jbHVkZShDaGVja1N0cnVjdE1lbWJlcikKK2luY2x1ZGUoQ2hlY2tUeXBlU2l6ZSkKKworY2hlY2tfaW5jbHVkZV9maWxlKGFsbG9jYS5oICAgICBIQVZFX0FMTE9DQV9IKQorY2hlY2tfaW5jbHVkZV9maWxlKGJ5dGVzd2FwLmggICAgIEhBVkVfQllURVNXQVBfSCkKK2NoZWNrX2luY2x1ZGVfZmlsZShjcnQvZXh0ZXJucy5oICAgICBIQVZFX0NSVF9FWFRFUk5TX0gpCitjaGVja19pbmNsdWRlX2ZpbGUoZGlyZW50LmggICAgIEhBVkVfRElSRU5UX0gpICAjIGRidXMtc3lzZGVwcy11dGlsLmMKK2NoZWNrX2luY2x1ZGVfZmlsZShkbGZjbi5oICAgICBIQVZFX0RMRkNOX0gpCitjaGVja19pbmNsdWRlX2ZpbGUoZXhlY2luZm8uaCAgICAgSEFWRV9FWEVDSU5GT19IKQorY2hlY2tfaW5jbHVkZV9maWxlKGVycm5vLmggICAgIEhBVkVfRVJSTk9fSCkgICAgIyBkYnVzLXN5c2RlcHMuYworY2hlY2tfaW5jbHVkZV9maWxlKGV4cGF0LmggICAgIEhBVkVfRVhQQVRfSCkKK2NoZWNrX2luY2x1ZGVfZmlsZShncnAuaCAgICAgICAgSEFWRV9HUlBfSCkgICAgICMgZGJ1cy1zeXNkZXBzLXV0aWwtd2luLmMKK2NoZWNrX2luY2x1ZGVfZmlsZShpbnR0eXBlcy5oICAgICBIQVZFX0lOVFRZUEVTX0gpICAgIyBkYnVzLXBpcGUuaAorY2hlY2tfaW5jbHVkZV9maWxlKGlvLmggICAgICAgICBIQVZFX0lPX0gpICAgICAgIyBpbnRlcm5hbAorY2hlY2tfaW5jbHVkZV9maWxlKGxvY2FsZS5oICAgICBIQVZFX0xPQ0FMRV9IKQorY2hlY2tfaW5jbHVkZV9maWxlKG1lbW9yeS5oICAgICBIQVZFX01FTU9SWV9IKQorY2hlY2tfaW5jbHVkZV9maWxlKHNpZ25hbC5oICAgICBIQVZFX1NJR05BTF9IKQorY2hlY2tfaW5jbHVkZV9maWxlKHN0ZGludC5oICAgICBIQVZFX1NURElOVF9IKSAgICMgZGJ1cy1waXBlLmgKK2NoZWNrX2luY2x1ZGVfZmlsZShzdGRsaWIuaCAgICAgSEFWRV9TVERMSUJfSCkKK2NoZWNrX2luY2x1ZGVfZmlsZShzdGRpby5oICAgICAgSEFWRV9TVERJT19IKSAgICMgZGJ1cy1zeXNkZXBzLmgKK2NoZWNrX2luY2x1ZGVfZmlsZShzdHJpbmcuaCAgICAgSEFWRV9TVFJJTkdfSCkKK2NoZWNrX2luY2x1ZGVfZmlsZShzdHJpbmdzLmggICAgIEhBVkVfU1RSSU5HU19IKQorY2hlY2tfaW5jbHVkZV9maWxlKHN5c2xvZy5oICAgICBIQVZFX1NZU0xPR19IKQorY2hlY2tfaW5jbHVkZV9maWxlcygic3RkaW50Lmg7c3lzL3R5cGVzLmg7c3lzL2V2ZW50LmgiIEhBVkVfU1lTX0VWRU5UX0gpCitjaGVja19pbmNsdWRlX2ZpbGUoc3lzL2lub3RpZnkuaCAgICAgSEFWRV9TWVNfSU5PVElGWV9IKQorY2hlY2tfaW5jbHVkZV9maWxlKHN5cy9yZXNvdXJjZS5oICAgICBIQVZFX1NZU19SRVNPVVJDRV9IKQorY2hlY2tfaW5jbHVkZV9maWxlKHN5cy9zdGF0LmggICAgIEhBVkVfU1lTX1NUQVRfSCkKK2NoZWNrX2luY2x1ZGVfZmlsZShzeXMvdHlwZXMuaCAgICAgSEFWRV9TWVNfVFlQRVNfSCkKK2NoZWNrX2luY2x1ZGVfZmlsZShzeXMvdWlvLmggICAgIEhBVkVfU1lTX1VJT19IKQorY2hlY2tfaW5jbHVkZV9maWxlKHN5cy9wb2xsLmggICBIQVZFX1BPTEwpICAgICAgIyBkYnVzLXN5c2RlcHMuYywgZGJ1cy1zeXNkZXBzLXdpbi5jCitjaGVja19pbmNsdWRlX2ZpbGUoc3lzL3ByY3RsLmggIEhBVkVfU1lTX1BSQ1RMX0gpCitjaGVja19pbmNsdWRlX2ZpbGUoc3lzL3N5c2xpbWl0cy5oICAgIEhBVkVfU1lTX1NZU0xJTUlUU19IKSAgICMgZGJ1cy1zeXNkZXBzLXVuaXguYworY2hlY2tfaW5jbHVkZV9maWxlKHN5cy90aW1lLmggICBIQVZFX1NZU19USU1FX0gpIyBkYnVzLXN5c2RlcHMtd2luLmMKK2NoZWNrX2luY2x1ZGVfZmlsZShzeXMvd2FpdC5oICAgSEFWRV9TWVNfV0FJVF9IKSMgZGJ1cy1zeXNkZXBzLXdpbi5jCitjaGVja19pbmNsdWRlX2ZpbGUodGltZS5oICAgICAgIEhBVkVfVElNRV9IKSAgICAjIGRidXMtc3lzZGVwcy13aW4uYworY2hlY2tfaW5jbHVkZV9maWxlKHdzMnRjcGlwLmggICBIQVZFX1dTMlRDUElQX0gpIyBkYnVzLXN5c2RlcHMtd2luLmMKK2NoZWNrX2luY2x1ZGVfZmlsZSh1bmlzdGQuaCAgICAgSEFWRV9VTklTVERfSCkgICMgZGJ1cy1zeXNkZXBzLXV0aWwtd2luLmMKKworY2hlY2tfc3ltYm9sX2V4aXN0cyhiYWNrdHJhY2UgICAgImV4ZWNpbmZvLmgiICAgICAgIEhBVkVfQkFDS1RSQUNFKSAgICAgICAgICAjICBkYnVzLXN5c2RlcHMuYywgZGJ1cy1zeXNkZXBzLXdpbi5jCitjaGVja19zeW1ib2xfZXhpc3RzKGdldGdyb3VwbGlzdCAiZ3JwLmgiICAgICAgICAgICAgSEFWRV9HRVRHUk9VUExJU1QpICAgICAgICMgIGRidXMtc3lzZGVwcy5jCitjaGVja19zeW1ib2xfZXhpc3RzKGdldHBlZXJ1Y3JlZCAidWNyZWQuaCIgICAgICAgICAgSEFWRV9HRVRQRUVSVUNSRUQpICAgICAgICMgIGRidXMtc3lzZGVwcy5jLCBkYnVzLXN5c2RlcHMtd2luLmMKK2NoZWNrX3N5bWJvbF9leGlzdHMobmFub3NsZWVwICAgICJ0aW1lLmgiICAgICAgICAgICBIQVZFX05BTk9TTEVFUCkgICAgICAgICAgIyAgZGJ1cy1zeXNkZXBzLmMKK2NoZWNrX3N5bWJvbF9leGlzdHMoZ2V0cHduYW1fciAgICJlcnJuby5oIHB3ZC5oIiAgICBIQVZFX1BPU0lYX0dFVFBXTkFNX1IpICAgIyAgZGJ1cy1zeXNkZXBzLXV0aWwtdW5peC5jCitjaGVja19zeW1ib2xfZXhpc3RzKHNldGVudiAgICAgICAic3RkbGliLmgiICAgICAgICAgSEFWRV9TRVRFTlYpICAgICAgICAgICAgICMgIGRidXMtc3lzZGVwcy5jCitjaGVja19zeW1ib2xfZXhpc3RzKHVuc2V0ZW52ICAgICAic3RkbGliLmgiICAgICAgICAgSEFWRV9VTlNFVEVOVikgICAgICAgICAgICMgIGRidXMtc3lzZGVwcy5jCitjaGVja19zeW1ib2xfZXhpc3RzKGNsZWFyZW52ICAgICAic3RkbGliLmgiICAgICAgICAgSEFWRV9DTEVBUkVOVikgICAgICAgICAgICMgIGRidXMtc3lzZGVwcy5jCitjaGVja19zeW1ib2xfZXhpc3RzKHdyaXRldiAgICAgICAic3lzL3Vpby5oIiAgICAgICAgSEFWRV9XUklURVYpICAgICAgICAgICAgICMgIGRidXMtc3lzZGVwcy5jLCBkYnVzLXN5c2RlcHMtd2luLmMKK2NoZWNrX3N5bWJvbF9leGlzdHMoc2V0cmxpbWl0ICAgICJzeXMvcmVzb3VyY2UuaCIgICBIQVZFX1NFVFJMSU1JVCkgICAgICAgICAgIyAgZGJ1cy1zeXNkZXBzLmMsIGRidXMtc3lzZGVwcy13aW4uYywgdGVzdC90ZXN0LXNlZ2ZhdWx0LmMKK2NoZWNrX3N5bWJvbF9leGlzdHMoc29ja2V0cGFpciAgICJzeXMvc29ja2V0LmgiICAgICBIQVZFX1NPQ0tFVFBBSVIpICAgICAgICAgIyAgZGJ1cy1zeXNkZXBzLmMKK2NoZWNrX3N5bWJvbF9leGlzdHMoc2V0bG9jYWxlICAgICJsb2NhbGUuaCIgICAgICAgICBIQVZFX1NFVExPQ0FMRSkgICAgICAgICAgIyAgZGJ1cy10ZXN0LW1haW4uYworY2hlY2tfc3ltYm9sX2V4aXN0cyhsb2NhbGVjb252ICAgImxvY2FsZS5oIiAgICAgICAgIEhBVkVfTE9DQUxFQ09OVikgICAgICAgICAjICBkYnVzLXN5c2RlcHMuYworY2hlY2tfc3ltYm9sX2V4aXN0cyhzdHJ0b2xsICAgICAgInN0ZGxpYi5oIiAgICAgICAgIEhBVkVfU1RSVE9MTCkgICAgICAgICAgICAjICBkYnVzLXNlbmQuYworY2hlY2tfc3ltYm9sX2V4aXN0cyhzdHJ0b3VsbCAgICAgInN0ZGxpYi5oIiAgICAgICAgIEhBVkVfU1RSVE9VTEwpICAgICAgICAgICAjICBkYnVzLXNlbmQuYworc2V0KENNQUtFX1JFUVVJUkVEX0RFRklOSVRJT05TIC1EX0dOVV9TT1VSQ0UpCitjaGVja19zeW1ib2xfZXhpc3RzKHBpcGUyICAgICAgICAiZmNudGwuaDt1bmlzdGQuaCIgICAgICAgICBIQVZFX1BJUEUyKQorY2hlY2tfc3ltYm9sX2V4aXN0cyhhY2NlcHQ0ICAgICAgInN5cy9zb2NrZXQuaCIgICAgICAgICAgICAgSEFWRV9BQ0NFUFQ0KQorY2hlY2tfc3ltYm9sX2V4aXN0cyhkaXJmZCAgICAgICAgImRpcmVudC5oIiAgICAgICAgICAgICAgICAgSEFWRV9ESVJGRCkKK2NoZWNrX3N5bWJvbF9leGlzdHMoaW5vdGlmeV9pbml0MSAic3lzL2lub3RpZnkuaCIgICAgICAgICAgIEhBVkVfSU5PVElGWV9JTklUMSkKK2NoZWNrX3N5bWJvbF9leGlzdHMoU0NNX1JJR0hUUyAgICAic3lzL3R5cGVzLmg7c3lzL3NvY2tldC5oO3N5cy91bi5oIiBIQVZFX1VOSVhfRkRfUEFTU0lORykKK2NoZWNrX3N5bWJvbF9leGlzdHMocHJjdGwgICAgICAgICJzeXMvcHJjdGwuaCIgICAgICAgICAgICAgIEhBVkVfUFJDVEwpCitjaGVja19zeW1ib2xfZXhpc3RzKHJhaXNlICAgICAgICAic2lnbmFsLmgiICAgICAgICAgICAgICAgICBIQVZFX1JBSVNFKQorY2hlY2tfc3ltYm9sX2V4aXN0cyhnZXRybGltaXQgICAgInN5cy9yZXNvdXJjZS5oO3N5cy90aW1lLmgiIEhBVkVfR0VUUkxJTUlUKQorY2hlY2tfc3ltYm9sX2V4aXN0cyhwcmxpbWl0ICAgICAgInN5cy9yZXNvdXJjZS5oO3N5cy90aW1lLmgiIEhBVkVfUFJMSU1JVCkKK2NoZWNrX3N5bWJvbF9leGlzdHMoc2V0cmxpbWl0ICAgICJzeXMvcmVzb3VyY2UuaDtzeXMvdGltZS5oIiBIQVZFX1NFVFJMSU1JVCkKKworY2hlY2tfc3RydWN0X21lbWJlcihjbXNnY3JlZCBjbWNyZWRfcGlkICJzeXMvdHlwZXMuaCBzeXMvc29ja2V0LmgiIEhBVkVfQ01TR0NSRUQpICAgIyAgZGJ1cy1zeXNkZXBzLmMKKworIyBtaXNzaW5nOgorIyBEQlVTX0hBVkVfR0NDMzNfR0NPVgorCitjaGVja190eXBlX3NpemUoInNob3J0IiAgICAgU0laRU9GX1NIT1JUKQorY2hlY2tfdHlwZV9zaXplKCJpbnQiICAgICAgIFNJWkVPRl9JTlQpCitjaGVja190eXBlX3NpemUoImxvbmciICAgICAgU0laRU9GX0xPTkcpCitjaGVja190eXBlX3NpemUoImxvbmcgbG9uZyIgU0laRU9GX0xPTkdfTE9ORykKK2NoZWNrX3R5cGVfc2l6ZSgiX19pbnQ2NCIgICBTSVpFT0ZfX19JTlQ2NCkKK3NldChDTUFLRV9FWFRSQV9JTkNMVURFX0ZJTEVTICJzeXMvc29ja2V0LmgiKQorY2hlY2tfdHlwZV9zaXplKCJzb2NrbGVuX3QiIFNPQ0tMRU5fVCkgICAgICAgICAgIyAgZGJ1cy1zeXNkZXBzLXVuaXguYworc2V0KENNQUtFX0VYVFJBX0lOQ0xVREVfRklMRVMpCisKKyMgREJVU19JTlQ2NF9UWVBFCitpZihTSVpFT0ZfSU5UIEVRVUFMIDgpCisgICAgc2V0IChEQlVTX0lOVDY0X1RZUEUgImludCIpCisgICAgc2V0IChEQlVTX0lOVDY0X0NPTlNUQU5UICAiKHZhbCkiKQorICAgIHNldCAoREJVU19VSU5UNjRfQ09OU1RBTlQgIih2YWwjI1UpIikKK2Vsc2VpZihTSVpFT0ZfTE9ORyBFUVVBTCA4KQorICAgIHNldCAoREJVU19JTlQ2NF9UWVBFICJsb25nIikKKyAgICBzZXQgKERCVVNfSU5UNjRfQ09OU1RBTlQgICIodmFsIyNMKSIpCisgICAgc2V0IChEQlVTX1VJTlQ2NF9DT05TVEFOVCAiKHZhbCMjVUwpIikKK2Vsc2VpZihTSVpFT0ZfTE9OR19MT05HIEVRVUFMIDgpCisgICAgc2V0IChEQlVTX0lOVDY0X1RZUEUgImxvbmcgbG9uZyIpCisgICAgc2V0IChEQlVTX0lOVDY0X0NPTlNUQU5UICAiKHZhbCMjTEwpIikKKyAgICBzZXQgKERCVVNfVUlOVDY0X0NPTlNUQU5UICIodmFsIyNVTEwpIikKK2Vsc2VpZihTSVpFT0ZfX19JTlQ2NCBFUVVBTCA4KQorICAgIHNldCAoREJVU19JTlQ2NF9UWVBFICJfX2ludDY0IikKKyAgICBzZXQgKERCVVNfSU5UNjRfQ09OU1RBTlQgICIodmFsIyNpNjQpIikKKyAgICBzZXQgKERCVVNfVUlOVDY0X0NPTlNUQU5UICIodmFsIyN1aTY0KSIpCitlbHNlKFNJWkVPRl9JTlQgRVFVQUwgOCkKKyAgICBtZXNzYWdlIChGQVRBTF9FUlJPUiAiQ291bGQgbm90IGZpbmQgYSA2NC1iaXQgaW50ZWdlciB0eXBlIikKK2VuZGlmKFNJWkVPRl9JTlQgRVFVQUwgOCkKKworIyBEQlVTX0lOVDMyX1RZUEUKK2lmKFNJWkVPRl9JTlQgRVFVQUwgNCkKKyAgICBzZXQgKERCVVNfSU5UMzJfVFlQRSAiaW50IikKK2Vsc2VpZihTSVpFT0ZfTE9ORyBFUVVBTCA0KQorICAgIHNldCAoREJVU19JTlQzMl9UWVBFICJsb25nIikKK2Vsc2VpZihTSVpFT0ZfTE9OR19MT05HIEVRVUFMIDQpCisgICAgc2V0IChEQlVTX0lOVDMyX1RZUEUgImxvbmcgbG9uZyIpCitlbmRpZihTSVpFT0ZfSU5UIEVRVUFMIDQpCisKKyMgREJVU19JTlQxNl9UWVBFCitpZihTSVpFT0ZfSU5UIEVRVUFMIDIpCisgICAgc2V0IChEQlVTX0lOVDE2X1RZUEUgImludCIpCitlbHNlaWYoU0laRU9GX1NIT1JUIEVRVUFMIDIpCisgICAgc2V0IChEQlVTX0lOVDE2X1RZUEUgInNob3J0IikKK2VuZGlmKFNJWkVPRl9JTlQgRVFVQUwgMikKKworZmluZF9wcm9ncmFtKERPWFlHRU4gZG94eWdlbikKK2ZpbmRfcHJvZ3JhbShYTUxUTyB4bWx0bykKKworaWYoTVNWQykKKyAgIFNFVChEQlVTX1ZBX0NPUFlfRlVOQyAiX0RCVVNfVkFfQ09QWV9BU1NJR04iKQorZWxzZShNU1ZDKQord3JpdGVfZmlsZSgiJHtDTUFLRV9CSU5BUllfRElSfSR7Q01BS0VfRklMRVNfRElSRUNUT1JZfS9DTWFrZVRtcC9jbWFrZV90cnlfY29tcGlsZS5jIiAiI2luY2x1ZGUgPHN0ZGFyZy5oPgorCSNpbmNsdWRlIDxzdGRsaWIuaD4KKyAgICAgICAgc3RhdGljIHZvaWQgZiAoaW50IGksIC4uLikgeworCXZhX2xpc3QgYXJnczEsIGFyZ3MyOworCXZhX3N0YXJ0IChhcmdzMSwgaSk7CisJdmFfY29weSAoYXJnczIsIGFyZ3MxKTsKKwlpZiAodmFfYXJnIChhcmdzMiwgaW50KSAhPSA0MiB8fCB2YV9hcmcgKGFyZ3MxLCBpbnQpICE9IDQyKQorCSAgZXhpdCAoMSk7CisJdmFfZW5kIChhcmdzMSk7IHZhX2VuZCAoYXJnczIpOworCX0KKwlpbnQgbWFpbigpIHsKKwkgIGYgKDAsIDQyKTsKKwkgIHJldHVybiAwOworCX0KKyIpCit0cnlfY29tcGlsZShEQlVTX0hBVkVfVkFfQ09QWQorICAgICAgICAgICAgJHtDTUFLRV9CSU5BUllfRElSfQorICAgICAgICAgICAgJHtDTUFLRV9CSU5BUllfRElSfSR7Q01BS0VfRklMRVNfRElSRUNUT1JZfS9DTWFrZVRtcC9jbWFrZV90cnlfY29tcGlsZS5jKQorCitpZihEQlVTX0hBVkVfVkFfQ09QWSkKKyAgU0VUKERCVVNfVkFfQ09QWV9GVU5DIHZhX2NvcHkgQ0FDSEUgU1RSSU5HICJ2YV9jb3B5IGZ1bmN0aW9uIikKK2Vsc2UoREJVU19IQVZFX1ZBX0NPUFkpCisgIHdyaXRlX2ZpbGUoIiR7Q01BS0VfQklOQVJZX0RJUn0ke0NNQUtFX0ZJTEVTX0RJUkVDVE9SWX0vQ01ha2VUbXAvY21ha2VfdHJ5X2NvbXBpbGUuYyIgIiNpbmNsdWRlIDxzdGRhcmcuaD4KKyAgICAgICAgICAjaW5jbHVkZSA8c3RkbGliLmg+CisJICBzdGF0aWMgdm9pZCBmIChpbnQgaSwgLi4uKSB7CisJICB2YV9saXN0IGFyZ3MxLCBhcmdzMjsKKwkgIHZhX3N0YXJ0IChhcmdzMSwgaSk7CisJICBfX3ZhX2NvcHkgKGFyZ3MyLCBhcmdzMSk7CisJICBpZiAodmFfYXJnIChhcmdzMiwgaW50KSAhPSA0MiB8fCB2YV9hcmcgKGFyZ3MxLCBpbnQpICE9IDQyKQorCSAgICBleGl0ICgxKTsKKwkgIHZhX2VuZCAoYXJnczEpOyB2YV9lbmQgKGFyZ3MyKTsKKwkgIH0KKwkgIGludCBtYWluKCkgeworCSAgICBmICgwLCA0Mik7CisJICAgIHJldHVybiAwOworCSAgfQorICAiKQorICB0cnlfY29tcGlsZShEQlVTX0hBVkVfX19WQV9DT1BZCisgICAgICAgICAgICAgICR7Q01BS0VfQklOQVJZX0RJUn0KKyAgICAgICAgICAgICAgJHtDTUFLRV9CSU5BUllfRElSfSR7Q01BS0VfRklMRVNfRElSRUNUT1JZfS9DTWFrZVRtcC9jbWFrZV90cnlfY29tcGlsZS5jKQorICBpZihEQlVTX0hBVkVfX19WQV9DT1BZKQorICAgIFNFVChEQlVTX1ZBX0NPUFlfRlVOQyBfX3ZhX2NvcHkgQ0FDSEUgU1RSSU5HICJ2YV9jb3B5IGZ1bmN0aW9uIikKKyAgZWxzZShEQlVTX0hBVkVfX19WQV9DT1BZKQorICAgIFNFVChEQlVTX1ZBX0NPUFlfQVNfQVJSQVkgIjEiIENBQ0hFIFNUUklORyAiJ3ZhX2xpc3RzJyBjYW5ub3QgYmUgY29waWVzIGFzIHZhbHVlcyIpCisgIGVuZGlmKERCVVNfSEFWRV9fX1ZBX0NPUFkpCitlbmRpZihEQlVTX0hBVkVfVkFfQ09QWSkKK2VuZGlmKE1TVkMpICMgX25vdF8gTVNWQwpkaWZmIC0tZ2l0IGEvY21ha2UvREJ1czFDb25maWcuY21ha2UuaW4gYi9jbWFrZS9EQnVzMUNvbmZpZy5jbWFrZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzg5ZDVlCi0tLSAvZGV2L251bGwKKysrIGIvY21ha2UvREJ1czFDb25maWcuY21ha2UuaW4KQEAgLTAsMCArMSwzNyBAQAorIyAtIENvbmZpZyBmaWxlIGZvciB0aGUgREJ1czEgcGFja2FnZQorIyBJdCBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgdmFyaWFibGVzCisjICBEQnVzMV9GT1VORCAtIEZsYWcgZm9yIGluZGljYXRpbmcgdGhhdCBEQnVzMSBwYWNrYWdlIGhhcyBiZWVuIGZvdW5kCisjICBEQnVzMV9ERUZJTklUSU9OUyAgLSBjb21waWxlIGRlZmluaXRpb25zIGZvciBEQnVzMSBbMV0KKyMgIERCdXMxX0lOQ0xVREVfRElSUyAtIGluY2x1ZGUgZGlyZWN0b3JpZXMgZm9yIERCdXMxIFsxXQorIyAgREJ1czFfTElCUkFSSUVTICAgIC0gY21ha2UgdGFyZ2V0cyB0byBsaW5rIGFnYWluc3QKKworIyBbMV0gVGhpcyB2YXJpYWJsZSBpcyBub3QgcmVxdWlyZWQgaWYgREJ1czFfTElCUkFSSUVTIGlzIGFkZGVkCisjICAgICB0byBhIHRhcmdldCB3aXRoIHRhcmdldF9saW5rX2xpYnJhcmllcworCisjIENvbXB1dGUgcGF0aHMKK2lmKEBEQlVTX1JFTE9DQVRBQkxFQCkKKyAgICBnZXRfZmlsZW5hbWVfY29tcG9uZW50KERCdXMxX0lOU1RBTExfRElSICIke0NNQUtFX0NVUlJFTlRfTElTVF9ESVJ9Ly4uLy4uLy4uIiBBQlNPTFVURSkKK2Vsc2UoKQorICAgIHNldChEQnVzMV9JTlNUQUxMX0RJUiAiQERCVVNfUFJFRklYQCIpCitlbmRpZigpCisjIE91ciBsaWJyYXJ5IGRlcGVuZGVuY2llcyAoY29udGFpbnMgZGVmaW5pdGlvbnMgZm9yIElNUE9SVEVEIHRhcmdldHMpCitpZihFWElTVFMgIiR7Q01BS0VfQ1VSUkVOVF9MSVNUX0RJUn0vREJ1czFUYXJnZXRzLmNtYWtlIikKKyAgICAjIGRvIG5vdCBhZGRpdGlvbmFsIHNlYXJjaCBwYXRocyBmb3IgaW1wbGljaXQgbGlicmFyaWVzCisgICAgIyBzZWUgaHR0cHM6Ly9jbWFrZS5vcmcvY21ha2UvaGVscC92My4wL3BvbGljeS9DTVAwMDAzLmh0bWwKKyAgICBpZihDT01NQU5EIGNtYWtlX3BvbGljeSkKKyAgICAgICAgY21ha2VfcG9saWN5KFNFVCBDTVAwMDAzIE5FVykKKyAgICBlbmRpZihDT01NQU5EIGNtYWtlX3BvbGljeSkKKworICAgIGlmKE5PVCBUQVJHRVQgZGJ1cy0xKQorICAgICAgICBpbmNsdWRlKCIke0NNQUtFX0NVUlJFTlRfTElTVF9ESVJ9L0RCdXMxVGFyZ2V0cy5jbWFrZSIpCisgICAgZW5kaWYoKQorCisgICAgc2V0KERCdXMxX0lOQ0xVREVfRElSUyAiJHtEQnVzMV9JTlNUQUxMX0RJUn0vQENNQUtFX0lOU1RBTExfSU5DTFVERURJUkAvZGJ1cy0xLjAiICIke0RCdXMxX0lOU1RBTExfRElSfS9AQ01BS0VfSU5TVEFMTF9MSUJESVJAL2RidXMtMS4wL2luY2x1ZGUiKQorICAgIHNldChEQnVzMV9ERUZJTklUSU9OUykKKyAgICBzZXQoREJ1czFfTElCUkFSSUVTIGRidXMtMSkKKworICAgIHNldF9wcm9wZXJ0eShUQVJHRVQgZGJ1cy0xIFBST1BFUlRZIElOVEVSRkFDRV9JTkNMVURFX0RJUkVDVE9SSUVTICR7REJ1czFfSU5DTFVERV9ESVJTfSkKKyAgICBzZXRfcHJvcGVydHkoVEFSR0VUIGRidXMtMSBQUk9QRVJUWSBJTlRFUkZBQ0VfQ09NUElMRV9ERUZJTklUSU9OUyAke0RCdXMxX0RFRklOSVRJT05TfSkKK2Vsc2UoKQorICAgIG1lc3NhZ2UoRkFUQUxfRVJST1IgIkluY29tcGxldGUgY21ha2Ugc3VwcG9ydCBpbiBEQnVzMSBmaW5kX3BhY2thZ2UgY29uZmlndXJhdGlvbiIpCitlbmRpZigpCmRpZmYgLS1naXQgYS9jbWFrZS9EQnVzMUNvbmZpZy5wa2djb25maWcuaW4gYi9jbWFrZS9EQnVzMUNvbmZpZy5wa2djb25maWcuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMwYTI1ZQotLS0gL2Rldi9udWxsCisrKyBiL2NtYWtlL0RCdXMxQ29uZmlnLnBrZ2NvbmZpZy5pbgpAQCAtMCwwICsxLDc1IEBACisjIC0gQ29uZmlnIGZpbGUgZm9yIHRoZSBEQnVzMSBwYWNrYWdlCisjIEl0IGRlZmluZXMgdGhlIGZvbGxvd2luZyB2YXJpYWJsZXMKKyMgIERCdXMxX0ZPVU5EIC0gRmxhZyBmb3IgaW5kaWNhdGluZyB0aGF0IERCdXMxIHBhY2thZ2UgaGFzIGJlZW4gZm91bmQKKyMgIERCdXMxX0RFRklOSVRJT05TICAtIGNvbXBpbGUgZGVmaW5pdGlvbnMgZm9yIERCdXMxIFsxXQorIyAgREJ1czFfSU5DTFVERV9ESVJTIC0gaW5jbHVkZSBkaXJlY3RvcmllcyBmb3IgREJ1czEgWzFdCisjICBEQnVzMV9MSUJSQVJJRVMgICAgLSBjbWFrZSB0YXJnZXRzIHRvIGxpbmsgYWdhaW5zdAorCisjIFsxXSBUaGlzIHZhcmlhYmxlIGlzIG5vdCByZXF1aXJlZCBpZiBEQnVzMV9MSUJSQVJJRVMgaXMgYWRkZWQKKyMgICAgIHRvIGEgdGFyZ2V0IHdpdGggdGFyZ2V0X2xpbmtfbGlicmFyaWVzCisKK2dldF9maWxlbmFtZV9jb21wb25lbnQoREJ1czFfUEtHQ09ORklHX0RJUiAiJHtDTUFLRV9DVVJSRU5UX0xJU1RfRElSfS8uLi8uLi9wa2djb25maWciIEFCU09MVVRFKQorZmluZF9wYWNrYWdlKFBrZ0NvbmZpZykKK2lmKERFRklORUQgRU5We1BLR19DT05GSUdfRElSfSkKKyAgICBzZXQoX2RidXNfcGtnY29uZmlnX2RpciAiJEVOVntQS0dfQ09ORklHX0RJUn0iKQorZW5kaWYoKQoraWYoREVGSU5FRCBFTlZ7UEtHX0NPTkZJR19QQVRIfSkKKyAgICBzZXQoX2RidXNfcGtnY29uZmlnX3BhdGggIiRFTlZ7UEtHX0NPTkZJR19QQVRIfSIpCitlbmRpZigpCitpZihERUZJTkVEIEVOVntQS0dfQ09ORklHX0xJQkRJUn0pCisgICAgc2V0KF9kYnVzX3BrZ2NvbmZpZ19saWJkaXIgIiRFTlZ7UEtHX0NPTkZJR19MSUJESVJ9IikKK2VuZGlmKCkKK3NldChFTlZ7UEtHX0NPTkZJR19ESVJ9KQorc2V0KEVOVntQS0dfQ09ORklHX1BBVEh9ICR7REJ1czFfUEtHQ09ORklHX0RJUn0pCitzZXQoRU5We1BLR19DT05GSUdfTElCRElSfSAke0RCdXMxX1BLR0NPTkZJR19ESVJ9KQorIyBmb3IgZGVidWdnaW5nCisjc2V0KEVOVntQS0dfQ09ORklHX0RFQlVHX1NQRVd9IDEpCitwa2dfY2hlY2tfbW9kdWxlcyhQQ19EQlVTMSBRVUlFVCBkYnVzLTEpCitpZihERUZJTkVEIF9kYnVzX3BrZ2NvbmZpZ19kaXIpCisgICAgc2V0KEVOVntQS0dfQ09ORklHX0RJUn0gIiR7X2RidXNfcGtnY29uZmlnX2Rpcn0iKQorZWxzZSgpCisgICAgdW5zZXQoRU5We1BLR19DT05GSUdfRElSfSkKK2VuZGlmKCkKK2lmKERFRklORUQgX2RidXNfcGtnY29uZmlnX3BhdGgpCisgICAgc2V0KEVOVntQS0dfQ09ORklHX1BBVEh9ICIke19kYnVzX3BrZ2NvbmZpZ19wYXRofSIpCitlbHNlKCkKKyAgICB1bnNldChFTlZ7UEtHX0NPTkZJR19QQVRIfSkKK2VuZGlmKCkKK2lmKERFRklORUQgX2RidXNfcGtnY29uZmlnX2xpYmRpcikKKyAgICBzZXQoRU5We1BLR19DT05GSUdfTElCRElSfSAiJHtfZGJ1c19wa2djb25maWdfbGliZGlyfSIpCitlbHNlKCkKKyAgICB1bnNldChFTlZ7UEtHX0NPTkZJR19MSUJESVJ9KQorZW5kaWYoKQordW5zZXQoX2RidXNfcGtnY29uZmlnX2RpcikKK3Vuc2V0KF9kYnVzX3BrZ2NvbmZpZ19wYXRoKQordW5zZXQoX2RidXNfcGtnY29uZmlnX2xpYmRpcikKK3NldChEQnVzMV9ERUZJTklUSU9OUyAke1BDX0RCVVMxX0NGTEFHU19PVEhFUn0pCisKKyMgZmluZCB0aGUgcmVhbCBzdHVmZiBhbmQgdXNlIHBrZ2NvbmZpZyB2YXJpYWJsZXMgYXMgaGludHMKKyMgYmVjYXVzZSBjbWFrZSBwcm92aWRlcyBtb3JlIHNlYXJjaCBvcHRpb25zCitmaW5kX3BhdGgoREJ1czFfSU5DTFVERV9ESVIgZGJ1cy9kYnVzLmgKKyAgICBISU5UUyAke1BDX0RCVVMxX0lOQ0xVREVESVJ9ICR7UENfREJVUzFfSU5DTFVERV9ESVJTfQorICAgIFBBVEhfU1VGRklYRVMgZGJ1cy0xLjApCitmaW5kX3BhdGgoREJ1czFfQVJDSF9JTkNMVURFX0RJUiBkYnVzL2RidXMtYXJjaC1kZXBzLmgKKyAgICBISU5UUyAke1BDX0RCVVMxX0lOQ0xVREVfRElSU30KKyAgICBQQVRIX1NVRkZJWEVTIGRidXMtMS4wKQorZmluZF9saWJyYXJ5KERCdXMxX0xJQlJBUlkgTkFNRVMgJHtQQ19EQlVTMV9MSUJSQVJJRVN9CisgICAgSElOVFMgJHtQQ19EQlVTMV9MSUJESVJ9ICR7UENfREJVUzFfTElCUkFSWV9ESVJTfSkKKworaW5jbHVkZShGaW5kUGFja2FnZUhhbmRsZVN0YW5kYXJkQXJncykKKyMgaGFuZGxlIHRoZSBRVUlFVExZIGFuZCBSRVFVSVJFRCBhcmd1bWVudHMgYW5kIHNldCBEQnVzMV9GT1VORCB0byBUUlVFCisjIGlmIGFsbCBsaXN0ZWQgdmFyaWFibGVzIGFyZSBUUlVFCitmaW5kX3BhY2thZ2VfaGFuZGxlX3N0YW5kYXJkX2FyZ3MoREJ1czEgREVGQVVMVF9NU0cKKyAgICBEQnVzMV9MSUJSQVJZIERCdXMxX0lOQ0xVREVfRElSIERCdXMxX0FSQ0hfSU5DTFVERV9ESVIpCisKKyMgbWFrZSB0aGUgbWVudGlvbmVkIHZhcmlhYmxlcyBvbmx5IHZpc2libGUgaW4gY21ha2UgZ3VpIHdpdGggImFkdmFuY2VkIiBlbmFibGVkCittYXJrX2FzX2FkdmFuY2VkKERCdXMxX0lOQ0xVREVfRElSIERCdXMxX0xJQlJBUlkpCisKK3NldChEQnVzMV9MSUJSQVJJRVMgZGJ1cy0xKQorc2V0KERCdXMxX0lOQ0xVREVfRElSUyAiJHtEQnVzMV9JTkNMVURFX0RJUn0iICIke0RCdXMxX0FSQ0hfSU5DTFVERV9ESVJ9IikKKworIyBzZXR1cCBpbXBvcnRlZCB0YXJnZXQKK2FkZF9saWJyYXJ5KGRidXMtMSBTSEFSRUQgSU1QT1JURUQpCitzZXRfcHJvcGVydHkoVEFSR0VUIGRidXMtMSBBUFBFTkQgUFJPUEVSVFkgSU1QT1JURURfTE9DQVRJT04gJHtEQnVzMV9MSUJSQVJZfSkKK3NldF9wcm9wZXJ0eShUQVJHRVQgZGJ1cy0xIEFQUEVORCBQUk9QRVJUWSBJTlRFUkZBQ0VfSU5DTFVERV9ESVJFQ1RPUklFUyAke0RCdXMxX0lOQ0xVREVfRElSU30pCitzZXRfcHJvcGVydHkoVEFSR0VUIGRidXMtMSBBUFBFTkQgUFJPUEVSVFkgSU5URVJGQUNFX0NPTVBJTEVfREVGSU5JVElPTlMgJHtEQnVzMV9ERUZJTklUSU9OU30pCmRpZmYgLS1naXQgYS9jbWFrZS9EQnVzMUNvbmZpZ1ZlcnNpb24uY21ha2UuaW4gYi9jbWFrZS9EQnVzMUNvbmZpZ1ZlcnNpb24uY21ha2UuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM5YmY1OQotLS0gL2Rldi9udWxsCisrKyBiL2NtYWtlL0RCdXMxQ29uZmlnVmVyc2lvbi5jbWFrZS5pbgpAQCAtMCwwICsxLDExIEBACitzZXQoUEFDS0FHRV9WRVJTSU9OIEBEQlVTX1ZFUlNJT05AKQorCisjIENoZWNrIHdoZXRoZXIgdGhlIHJlcXVlc3RlZCBQQUNLQUdFX0ZJTkRfVkVSU0lPTiBpcyBjb21wYXRpYmxlCitpZigiJHtQQUNLQUdFX1ZFUlNJT059IiBWRVJTSU9OX0xFU1MgIiR7UEFDS0FHRV9GSU5EX1ZFUlNJT059IikKKyAgc2V0KFBBQ0tBR0VfVkVSU0lPTl9DT01QQVRJQkxFIEZBTFNFKQorZWxzZSgpCisgIHNldChQQUNLQUdFX1ZFUlNJT05fQ09NUEFUSUJMRSBUUlVFKQorICBpZiAoIiR7UEFDS0FHRV9WRVJTSU9OfSIgVkVSU0lPTl9FUVVBTCAiJHtQQUNLQUdFX0ZJTkRfVkVSU0lPTn0iKQorICAgIHNldChQQUNLQUdFX1ZFUlNJT05fRVhBQ1QgVFJVRSkKKyAgZW5kaWYoKQorZW5kaWYoKQpkaWZmIC0tZ2l0IGEvY21ha2UvYnVzLXRlc3QuYmF0LmNtYWtlIGIvY21ha2UvYnVzLXRlc3QuYmF0LmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxNjg4NzEKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFrZS9idXMtdGVzdC5iYXQuY21ha2UKQEAgLTAsMCArMSwxNCBAQAorOjogYnVzLXRlc3Qgd3JhcHBlcgorQGVjaG8gb2ZmCisKKzo6IHNlc3Npb24gYnVzIGFkZHJlc3MKK3NldCBEQlVTX1NUQVJURVJfQlVTPXRjcDpob3N0PWxvY2FsaG9zdCxwb3J0PTEyMzQKKworaWYgTk9UICIlMSIgPT0gIiIgKAorCVNFVCBEQVRBRElSPSUxCispIGVsc2UgKAorCVNFVCBEQVRBRElSPXRlc3RcZGF0YQorKQorCitiaW5cYnVzLXRlc3QuZXhlIHRlc3RcZGF0YQorCmRpZmYgLS1naXQgYS9jbWFrZS9idXMvQ01ha2VMaXN0cy50eHQgYi9jbWFrZS9idXMvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM1YmRjZgotLS0gL2Rldi9udWxsCisrKyBiL2NtYWtlL2J1cy9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDIwOSBAQAorYWRkX2RlZmluaXRpb25zKC1EREJVU19DT01QSUxBVElPTikKKworU0VUKEVGRU5DRSAiIikKK1NFVChCVVNfRElSICR7Q01BS0VfU09VUkNFX0RJUn0vLi4vYnVzKQorCisjIGNvbmZpZyBmaWxlcyBmb3IgaW5zdGFsbGF0aW9uIAorQ09ORklHVVJFX0ZJTEUoICIke0JVU19ESVJ9L3Nlc3Npb24uY29uZi5pbiIgIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9zZXNzaW9uLmNvbmYiIElNTUVESUFURSBAT05MWSkKK0NPTkZJR1VSRV9GSUxFKCAiJHtCVVNfRElSfS9sZWdhY3ktY29uZmlnL3Nlc3Npb24uY29uZi5pbiIgIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9sZWdhY3ktY29uZmlnL3Nlc3Npb24uY29uZiIgSU1NRURJQVRFIEBPTkxZKQorRklMRShNQUtFX0RJUkVDVE9SWSAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vc2Vzc2lvbi5kKQorCitpZihOT1QgV0lOMzIpCisgICAgQ09ORklHVVJFX0ZJTEUoICIke0JVU19ESVJ9L3N5c3RlbS5jb25mLmluIiAiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3N5c3RlbS5jb25mIiBJTU1FRElBVEUgQE9OTFkpCisgICAgQ09ORklHVVJFX0ZJTEUoICIke0JVU19ESVJ9L2xlZ2FjeS1jb25maWcvc3lzdGVtLmNvbmYuaW4iICIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vbGVnYWN5LWNvbmZpZy9zeXN0ZW0uY29uZiIgSU1NRURJQVRFIEBPTkxZKQorICAgIEZJTEUoTUFLRV9ESVJFQ1RPUlkgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3N5c3RlbS5kKQorZW5kaWYoKQorCisjIGNvcHkgc2VydmljZXMgZm9yIGxvY2FsIGRhZW1vbiBzdGFydCB0byBsb2NhbCBzZXJ2aWNlIGRpciBkYXRhL2RidXMtMS9zZXJ2aWNlcworU0VUIChTRVJWSUNFX0ZJTEVTIHRlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzKQorRklMRShHTE9CIEZJTEVTICIke0NNQUtFX1NPVVJDRV9ESVJ9Ly4uLyR7U0VSVklDRV9GSUxFU30vKi5zZXJ2aWNlLmluIiApCitGT1JFQUNIKEZJTEUgJHtGSUxFU30pCQorCUdFVF9GSUxFTkFNRV9DT01QT05FTlQoRklMRU5BTUUgJHtGSUxFfSBOQU1FX1dFKQorCVNFVCAoVEFSR0VUICR7Q01BS0VfQklOQVJZX0RJUn0vZGF0YS9kYnVzLTEvc2VydmljZXMvJHtGSUxFTkFNRX0uc2VydmljZSkKKwlJRiAoQ09ORklHX1ZFUkJPU0UpCisJCU1FU1NBR0UoIkZST006ICR7RklMRX1cblRPOiAke1RBUkdFVH1cbiIpCisJRU5ESUYgKENPTkZJR19WRVJCT1NFKQorCWNvbmZpZ3VyZV9maWxlKCR7RklMRX0gJHtUQVJHRVR9ICkKK0VOREZPUkVBQ0goRklMRSkKKworCitpZiAoREJVU19CVVNfRU5BQkxFX0lOT1RJRlkpCisgICAgc2V0IChESVJfV0FUQ0hfU09VUkNFICR7QlVTX0RJUn0vZGlyLXdhdGNoLWlub3RpZnkuYykKK2Vsc2VpZiAoREJVU19CVVNfRU5BQkxFX0tRVUVVRSkKKyAgICBzZXQgKERJUl9XQVRDSF9TT1VSQ0UgJHtCVVNfRElSfS9kaXItd2F0Y2gta3F1ZXVlLmMpCitlbHNlIChEQlVTX0JVU19FTkFCTEVfSU5PVElGWSkKKyAgICBzZXQgKERJUl9XQVRDSF9TT1VSQ0UgJHtCVVNfRElSfS9kaXItd2F0Y2gtZGVmYXVsdC5jKQorZW5kaWYgKERCVVNfQlVTX0VOQUJMRV9JTk9USUZZKQorCitzZXQgKEJVU19TT1VSQ0VTIAorCSR7QlVTX0RJUn0vYWN0aXZhdGlvbi5jCQkJCQorCSR7QlVTX0RJUn0vYWN0aXZhdGlvbi5oCQkJCQorCSR7QlVTX0RJUn0vYXBwYXJtb3IuYworCSR7QlVTX0RJUn0vYXBwYXJtb3IuaAorCSR7QlVTX0RJUn0vYXVkaXQuYworCSR7QlVTX0RJUn0vYXVkaXQuaAorCSR7QlVTX0RJUn0vYnVzLmMJCQkJCQorCSR7QlVTX0RJUn0vYnVzLmgJCQkJCQorCSR7QlVTX0RJUn0vY29uZmlnLWxvYWRlci1leHBhdC5jCisJJHtCVVNfRElSfS9jb25maWctcGFyc2VyLmMJCQkJCisJJHtCVVNfRElSfS9jb25maWctcGFyc2VyLmgKKwkke0JVU19ESVJ9L2NvbmZpZy1wYXJzZXItY29tbW9uLmMKKwkke0JVU19ESVJ9L2NvbmZpZy1wYXJzZXItY29tbW9uLmgKKyMgICAgJHtCVVNfRElSfS9jb25maWctcGFyc2VyLXRyaXZpYWwuYworCSR7QlVTX0RJUn0vY29ubmVjdGlvbi5jCisJJHtCVVNfRElSfS9jb25uZWN0aW9uLmgJCQkJCisJJHtCVVNfRElSfS9kZXNrdG9wLWZpbGUuYwkJCQkKKwkke0JVU19ESVJ9L2Rlc2t0b3AtZmlsZS5oCQkJCQorCSR7QlVTX0RJUn0vZGlyLXdhdGNoLmgJCQkJCisJJHtCVVNfRElSfS9kaXNwYXRjaC5jCQkJCQorCSR7QlVTX0RJUn0vZGlzcGF0Y2guaAkJCQkKKwkke0JVU19ESVJ9L2RyaXZlci5jCQkJCQorCSR7QlVTX0RJUn0vZHJpdmVyLmgJCQkJCisJJHtCVVNfRElSfS9leHBpcmVsaXN0LmMJCQkJCisJJHtCVVNfRElSfS9leHBpcmVsaXN0LmgJCQkJCisJJHtCVVNfRElSfS9wb2xpY3kuYwkJCQkKKwkke0JVU19ESVJ9L3BvbGljeS5oCQkJCQorCSR7QlVTX0RJUn0vc2VsaW51eC5oCQkJCQorCSR7QlVTX0RJUn0vc2VsaW51eC5jCQkJCQorCSR7QlVTX0RJUn0vc2VydmljZXMuYwkJCQkKKwkke0JVU19ESVJ9L3NlcnZpY2VzLmgJCQkJCisJJHtCVVNfRElSfS9zaWduYWxzLmMJCQkJCisJJHtCVVNfRElSfS9zaWduYWxzLmgJCQkJCisJJHtCVVNfRElSfS90ZXN0LmMJCQkJCQorCSR7QlVTX0RJUn0vdGVzdC5oCQkJCQkKKwkke0JVU19ESVJ9L3V0aWxzLmMJCQkJCQorCSR7QlVTX0RJUn0vdXRpbHMuaAkJCQkJCisJJHtESVJfV0FUQ0hfU09VUkNFfQorKQoraWYoREJVU19FTkFCTEVfU1RBVFMpCisJbGlzdChBUFBFTkQgQlVTX1NPVVJDRVMKKwkJJHtCVVNfRElSfS9zdGF0cy5jCisJCSR7QlVTX0RJUn0vc3RhdHMuaAorCSkKK2VuZGlmKERCVVNfRU5BQkxFX1NUQVRTKQorCitpbmNsdWRlX2RpcmVjdG9yaWVzKAorCSR7Q01BS0VfQklOQVJZX0RJUn0KKwkke0NNQUtFX1NPVVJDRV9ESVJ9Ly4uCisJJHtFWFBBVF9JTkNMVURFX0RJUn0KKykKKworYWRkX2V4ZWN1dGFibGUoZGJ1cy1kYWVtb24gJHtCVVNfU09VUkNFU30gJHtCVVNfRElSfS9tYWluLmMpCit0YXJnZXRfbGlua19saWJyYXJpZXMoZGJ1cy1kYWVtb24gJHtEQlVTX0lOVEVSTkFMX0xJQlJBUklFU30gJHtFWFBBVF9MSUJSQVJJRVN9KQorc2V0X3RhcmdldF9wcm9wZXJ0aWVzKGRidXMtZGFlbW9uIFBST1BFUlRJRVMgT1VUUFVUX05BTUUgJHtEQlVTX0RBRU1PTl9OQU1FfSkKK3NldF90YXJnZXRfcHJvcGVydGllcyhkYnVzLWRhZW1vbiBQUk9QRVJUSUVTIENPTVBJTEVfRkxBR1MgJHtEQlVTX0lOVEVSTkFMX0NMSUVOVF9ERUZJTklUSU9OU30pCisKK2luc3RhbGwoVEFSR0VUUyBkYnVzLWRhZW1vbiAke0lOU1RBTExfVEFSR0VUU19ERUZBVUxUX0FSR1N9KQoraW5zdGFsbChGSUxFUyAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vc2Vzc2lvbi5jb25mIERFU1RJTkFUSU9OIHNoYXJlL2RidXMtMSkKK2luc3RhbGwoRklMRVMgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2xlZ2FjeS1jb25maWcvc2Vzc2lvbi5jb25mIERFU1RJTkFUSU9OIGV0Yy9kYnVzLTEpCitpbnN0YWxsKERJUkVDVE9SWSBERVNUSU5BVElPTiBzaGFyZS9kYnVzLTEvc2Vzc2lvbi5kKQoraW5zdGFsbChESVJFQ1RPUlkgREVTVElOQVRJT04gc2hhcmUvZGJ1cy0xL3NlcnZpY2VzKQorCitpZihOT1QgV0lOMzIpCisgICAgaW5zdGFsbChGSUxFUyAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vc3lzdGVtLmNvbmYgREVTVElOQVRJT04gc2hhcmUvZGJ1cy0xKQorICAgIGluc3RhbGwoRklMRVMgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2xlZ2FjeS1jb25maWcvc3lzdGVtLmNvbmYgREVTVElOQVRJT04gZXRjL2RidXMtMSkKKyAgICBpbnN0YWxsKERJUkVDVE9SWSBERVNUSU5BVElPTiBzaGFyZS9kYnVzLTEvc3lzdGVtLmQpCisgICAgaW5zdGFsbChESVJFQ1RPUlkgREVTVElOQVRJT04gc2hhcmUvZGJ1cy0xL3N5c3RlbS1zZXJ2aWNlcykKKyAgICBpbnN0YWxsKERJUkVDVE9SWSBERVNUSU5BVElPTiB2YXIvcnVuL2RidXMpCitlbmRpZigpCisKK2lmIChEQlVTX1NFUlZJQ0UpCisJc2V0IChkYnVzX3NlcnZpY2VfU09VUkNFUyAKKwkJJHtCVVNfRElSfS9idXMtc2VydmljZS13aW4uYworCSMgVE9ETzogYWRkIGFkZGl0aW9uYWwgZmlsZXMKKwkjCSR7QlVTX0RJUn0vc2VydmljZS1tYWluLmMKKwkjCSR7QlVTX1NPVVJDRVN9IAorCSkKKworCWFkZF9leGVjdXRhYmxlKGRidXMtc2VydmljZSAke2RidXNfc2VydmljZV9TT1VSQ0VTfSApCisJdGFyZ2V0X2xpbmtfbGlicmFyaWVzKGRidXMtc2VydmljZSAke0RCVVNfSU5URVJOQUxfTElCUkFSSUVTfSAke0VYUEFUX0xJQlJBUklFU30pCisJc2V0X3RhcmdldF9wcm9wZXJ0aWVzKGRidXMtc2VydmljZSBQUk9QRVJUSUVTIENPTVBJTEVfRkxBR1MgJHtEQlVTX0lOVEVSTkFMX0NMSUVOVF9ERUZJTklUSU9OU30pCisJaW5zdGFsbChUQVJHRVRTIGRidXMtc2VydmljZSAke0lOU1RBTExfVEFSR0VUU19ERUZBVUxUX0FSR1N9KQorZW5kaWYgKERCVVNfU0VSVklDRSkKKworc2V0KExBVU5DSF9IRUxQRVJfU09VUkNFUworICAgICR7QlVTX0RJUn0vY29uZmlnLWxvYWRlci1leHBhdC5jCisgICAgJHtCVVNfRElSfS9jb25maWctcGFyc2VyLWNvbW1vbi5jCisgICAgJHtCVVNfRElSfS9jb25maWctcGFyc2VyLXRyaXZpYWwuYworICAgICR7QlVTX0RJUn0vZGVza3RvcC1maWxlLmMKKyAgICAke0JVU19ESVJ9L3V0aWxzLmMKKyAgICAke0JVU19ESVJ9L2FjdGl2YXRpb24taGVscGVyLmMKKykKKworaWYoTk9UIFdJTjMyKQorCWFkZF9leGVjdXRhYmxlKGRidXMtZGFlbW9uLWxhdW5jaC1oZWxwZXIgJHtMQVVOQ0hfSEVMUEVSX1NPVVJDRVN9ICR7QlVTX0RJUn0vYWN0aXZhdGlvbi1oZWxwZXItYmluLmMgKQorCXRhcmdldF9saW5rX2xpYnJhcmllcyhkYnVzLWRhZW1vbi1sYXVuY2gtaGVscGVyICR7REJVU19JTlRFUk5BTF9MSUJSQVJJRVN9ICR7RVhQQVRfTElCUkFSSUVTfSApCitlbmRpZihOT1QgV0lOMzIpCisKK2lmIChEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUykKKwlzZXQoU09VUkNFUyAke0JVU19TT1VSQ0VTfSAke0JVU19ESVJ9L3Rlc3QtbWFpbi5jKQorCWFkZF90ZXN0X2V4ZWN1dGFibGUodGVzdC1idXMgIiR7U09VUkNFU30iICAke0RCVVNfSU5URVJOQUxfTElCUkFSSUVTfSAke0VYUEFUX0xJQlJBUklFU30pCisJc2V0X3RhcmdldF9wcm9wZXJ0aWVzKHRlc3QtYnVzIFBST1BFUlRJRVMgQ09NUElMRV9GTEFHUyAke0RCVVNfSU5URVJOQUxfQ0xJRU5UX0RFRklOSVRJT05TfSkKKwlpZiAoTk9UIFdJTjMyKQorCQlzZXQodGVzdF9idXNfc3lzdGVtX1NPVVJDRVMKKwkJCSR7QlVTX0RJUn0vY29uZmlnLWxvYWRlci1leHBhdC5jCisJCQkke0JVU19ESVJ9L2NvbmZpZy1wYXJzZXItY29tbW9uLmMKKwkJCSR7QlVTX0RJUn0vY29uZmlnLXBhcnNlci10cml2aWFsLmMKKwkJCSR7QlVTX0RJUn0vdXRpbHMuYworCQkJJHtCVVNfRElSfS90ZXN0LXN5c3RlbS5jCisJCSkKKwkJYWRkX3Rlc3RfZXhlY3V0YWJsZSh0ZXN0LWJ1cy1zeXN0ZW0gIiR7dGVzdF9idXNfc3lzdGVtX1NPVVJDRVN9IiAke0RCVVNfSU5URVJOQUxfTElCUkFSSUVTfSAke0VYUEFUX0xJQlJBUklFU30gJHtEQlVTX0JVU19MSUJTfSkKKworCQlhZGRfZXhlY3V0YWJsZShkYnVzLWRhZW1vbi1sYXVuY2gtaGVscGVyLXRlc3QgJHtMQVVOQ0hfSEVMUEVSX1NPVVJDRVN9ICAgICAke0JVU19ESVJ9L2FjdGl2YXRpb24taGVscGVyLWJpbi5jKQorCQlzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoZGJ1cy1kYWVtb24tbGF1bmNoLWhlbHBlci10ZXN0IFBST1BFUlRJRVMgQ09NUElMRV9GTEFHUyAiLURBQ1RJVkFUSU9OX0xBVU5DSEVSX1RFU1QiKQorCQl0YXJnZXRfbGlua19saWJyYXJpZXMoZGJ1cy1kYWVtb24tbGF1bmNoLWhlbHBlci10ZXN0ICR7REJVU19JTlRFUk5BTF9MSUJSQVJJRVN9ICR7RVhQQVRfTElCUkFSSUVTfSApCisKKwkJc2V0IChTT1VSQ0VTICR7TEFVTkNIX0hFTFBFUl9TT1VSQ0VTfSAke0JVU19ESVJ9L3Rlc3QtbGF1bmNoLWhlbHBlci5jKQorCQlhZGRfdGVzdF9leGVjdXRhYmxlKHRlc3QtYnVzLWxhdW5jaC1oZWxwZXIgIiR7U09VUkNFU30iICAke0RCVVNfSU5URVJOQUxfTElCUkFSSUVTfSAke0VYUEFUX0xJQlJBUklFU30pCisJCXNldF90YXJnZXRfcHJvcGVydGllcyh0ZXN0LWJ1cy1sYXVuY2gtaGVscGVyIFBST1BFUlRJRVMgQ09NUElMRV9GTEFHUyAiLURBQ1RJVkFUSU9OX0xBVU5DSEVSX1RFU1QgLURBQ1RJVkFUSU9OX0xBVU5DSEVSX0RPX09PTSIpCisJCWluc3RhbGxfdGFyZ2V0cygvbGliIGRidXMtZGFlbW9uLWxhdW5jaC1oZWxwZXIpCisJZW5kaWYoKQorZW5kaWYgKERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTKQorCitpZihNU1ZDKQorCXByb2plY3Rfc291cmNlX2dyb3VwKCR7R1JPVVBfQ09ERX0gYnVzX3Rlc3RfU09VUkNFUyBkdW1teSkKK2VuZGlmKE1TVkMpCisKKyMjIG1vcCB1cCB0aGUgZ2NvdiBmaWxlcworI2NsZWFuLWxvY2FsOgorIwkvYmluL3JtICouYmIgKi5iYmcgKi5kYSAqLmdjb3YgfHwgdHJ1ZQorCisjaW5zdGFsbC1kYXRhLWhvb2s6CisjCSQobWtpbnN0YWxsZGlycykgJChERVNURElSKS8kKGxvY2Fsc3RhdGVkaXIpL3J1bi9kYnVzCisjCSQobWtpbnN0YWxsZGlycykgJChERVNURElSKS8kKGNvbmZpZ2Rpcikvc3lzdGVtLmQKKyMJJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpLyQoZGF0YWRpcikvZGJ1cy0xL3NlcnZpY2VzCisKKyMjaW5zdGFsbF9maWxlKCR7Y29uZmlnZGlyfS9zeXN0ZW0uZCBGSUxFCisKKyMjIyMgSW5pdCBzY3JpcHRzIGZ1bgorI1NDUklQVF9JTl9GSUxFUz1tZXNzYWdlYnVzLmluCisjCQlyYy5tZXNzYWdlYnVzLmluCisKKyMjIFJlZCBIYXQgc3RhcnQKKyNpZiBEQlVTX0lOSVRfU0NSSVBUU19SRURfSEFUCisKKyNpbml0ZGRpcj0kKHN5c2NvbmZkaXIpL3JjLmQvaW5pdC5kCisKKyNpbml0ZF9TQ1JJUFRTPSAJCisjCW1lc3NhZ2VidXMKKworI2VuZGlmCisjICMjIFJlZCBIYXQgZW5kCisKKyMjIFNsYWNrd2FyZSBzdGFydAorI2lmIERCVVNfSU5JVF9TQ1JJUFRTX1NMQUNLV0FSRQorCisjaW5pdGRkaXI9JChzeXNjb25mZGlyKS9yYy5kLworCisjaW5pdGRfU0NSSVBUUz0gCQorIwlyYy5tZXNzYWdlYnVzCisKKyNlbmRpZgorIyMgU2xhY2t3YXJlIGVuZAorCisjTUFOX0lOX0ZJTEVTPWRidXMtZGFlbW9uLjEuaW4KKyNtYW5fTUFOUyA9IGRidXMtZGFlbW9uLjEKKworIyMjIyBFeHRyYSBkaXN0IAorCisjRVhUUkFfRElTVD0kKENPTkZJR19JTl9GSUxFUykgJChTQ1JJUFRfSU5fRklMRVMpICQobWFuX01BTlMpICQoTUFOX0lOX0ZJTEVTKQpkaWZmIC0tZ2l0IGEvY21ha2UvYnVzL3NlcnZpY2UuY21ha2UgYi9jbWFrZS9idXMvc2VydmljZS5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWQxN2ZmCi0tLSAvZGV2L251bGwKKysrIGIvY21ha2UvYnVzL3NlcnZpY2UuY21ha2UKQEAgLTAsMCArMSwzIEBACitbRC1CVVMgU2VydmljZV0KK05hbWU9b3JnLmZyZWVkZWt0b3AuREJ1cy5TZXJ2aWNlTmFtZQorRXhlYz1ub3RlcGFkCmRpZmYgLS1naXQgYS9jbWFrZS9jb25maWcuaC5jbWFrZSBiL2NtYWtlL2NvbmZpZy5oLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExMTkxODIKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFrZS9jb25maWcuaC5jbWFrZQpAQCAtMCwwICsxLDI3OCBAQAorLyogY29uZmlnLmguIEdlbmVyYXRlZCBieSBjbWFrZSBmcm9tIGNvbmZpZy5oLmNtYWtlICovCisKKyNpZm5kZWYgX0RCVVNfQ09ORklHX0gKKyNkZWZpbmUgX0RCVVNfQ09ORklHX0gKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogaW5kaWNhdGUgdGhhdCB3ZSBhcmUgYnVpbGRpbmcgd2l0aCBjbWFrZSAqLworI2RlZmluZSBEQlVTX0NNQUtFIDEKKworQEFVVE9QQUNLQUdFX0NPTkZJR19IX1RFTVBMQVRFQAorCisvKgorICogVmFyaWFibGVzIGRlZmluZWQgYnkgQUNfREVGSU5FIGluIC4uL2NvbmZpZ3VyZS5hYworICogc2hvdWxkIGJlIHBsYWNlZCBpbiB0aGlzIGZpbGUKKyovCisjY21ha2VkZWZpbmUgSEFWRV9HTlVDX1ZBUkFSR1MgMQorCisjY21ha2VkZWZpbmUgREJVU19DT05TT0xFX0FVVEhfRElSICJAREJVU19DT05TT0xFX0FVVEhfRElSQCIKKyNjbWFrZWRlZmluZSBEQlVTX0RBVEFESVIgICJAREJVU19EQVRBRElSQCIKKyNjbWFrZWRlZmluZSBEQlVTX0JJTkRJUiAgICJAREJVU19CSU5ESVJAIgorI2NtYWtlZGVmaW5lIERCVVNfUFJFRklYICJAREJVU19QUkVGSVhAIgorI2NtYWtlZGVmaW5lIERCVVNfU1lTVEVNX0NPTkZJR19GSUxFICAiQERCVVNfU1lTVEVNX0NPTkZJR19GSUxFQCIKKyNjbWFrZWRlZmluZSBEQlVTX1NFU1NJT05fQ09ORklHX0ZJTEUgIkBEQlVTX1NFU1NJT05fQ09ORklHX0ZJTEVAIgorI2NtYWtlZGVmaW5lIERCVVNfREFFTU9OX05BTUUgIkBEQlVTX0RBRU1PTl9OQU1FQCIKKyNjbWFrZWRlZmluZSBEQlVTX1NZU1RFTV9CVVNfREVGQVVMVF9BRERSRVNTICAiQERCVVNfU1lTVEVNX0JVU19ERUZBVUxUX0FERFJFU1NAIgorI2NtYWtlZGVmaW5lIERCVVNfU0VTU0lPTl9CVVNfQ09OTkVDVF9BRERSRVNTICAiQERCVVNfU0VTU0lPTl9CVVNfQ09OTkVDVF9BRERSRVNTQCIKKyNjbWFrZWRlZmluZSBEQlVTX01BQ0hJTkVfVVVJRF9GSUxFICJAREJVU19NQUNISU5FX1VVSURfRklMRUAiCisjY21ha2VkZWZpbmUgREJVU19EQUVNT05ESVIgIkBEQlVTX0RBRU1PTkRJUkAiCisjY21ha2VkZWZpbmUgREJVU19SVU5TVEFURURJUiAiQERCVVNfUlVOU1RBVEVESVJAIgorCisjY21ha2VkZWZpbmUgREJVU19FTkFCTEVfU1RBVFMKKworI2RlZmluZSBURVNUX0xJU1RFTiAgICAgICAiQFRFU1RfTElTVEVOQCIKKworLy8gdGVzdCBiaW5hcmllcworI2RlZmluZSBEQlVTX0VYRUVYVCAiQEVYRUVYVEAiCisKKy8qIFNvbWUgZGJ1cyBmZWF0dXJlcyAqLworI2NtYWtlZGVmaW5lIERCVVNfRU5BQkxFX0FOU0kgMQorI2NtYWtlZGVmaW5lIERCVVNfRU5BQkxFX1ZFUkJPU0VfTU9ERSAxCisjY21ha2VkZWZpbmUgREJVU19ESVNBQkxFX0FTU0VSVCAxCisjaWZuZGVmIERCVVNfRElTQUJMRV9BU1NFUlQKKyMgIGRlZmluZSBEQlVTX0VOQUJMRV9BU1NFUlQgMQorI2VuZGlmCisjY21ha2VkZWZpbmUgREJVU19ESVNBQkxFX0NIRUNLUyAxCisjaWZuZGVmIERCVVNfRElTQUJMRV9DSEVDS1MKKyMgIGRlZmluZSBEQlVTX0VOQUJMRV9DSEVDS1MgMQorI2VuZGlmCisvKiB4bWxkb2NzICovCisvKiBkb3h5Z2VuICovCisjY21ha2VkZWZpbmUgREJVU19HQ09WX0VOQUJMRUQgMQorCisvKiBzZWxpbnV4ICovCisvKiBrcXVldWUgKi8KKyNjbWFrZWRlZmluZSBIQVZFX0NPTlNPTEVfT1dORVJfRklMRSAxCisjZGVmaW5lIERCVVNfQ09OU09MRV9PV05FUl9GSUxFICJAREJVU19DT05TT0xFX09XTkVSX0ZJTEVAIgorCisjY21ha2VkZWZpbmUgREJVU19CVUlMRF9YMTEgMQorLyogRm9yIHRoZSBtb21lbnQsIHRoZSBjbWFrZSBidWlsZCBzeXN0ZW0gZG9lc24ndCBoYXZlIGFuIGVxdWl2YWxlbnQgb2YKKyAqIHRoZSBhdXRvY29uZiBidWlsZCBzeXN0ZW0ncyAtLWRpc2FibGUteDExLWF1dG9sYXVuY2ggKi8KKyNpZmRlZiBEQlVTX0JVSUxEX1gxMQorIyBkZWZpbmUgREJVU19FTkFCTEVfWDExX0FVVE9MQVVOQ0ggMQorI2VuZGlmCisKKyNkZWZpbmUgX0RCVVNfVkFfQ09QWV9BU1NJR04oYTEsYTIpIHsgYTEgPSBhMjsgfQorCisjY21ha2VkZWZpbmUgREJVU19WQV9DT1BZX0ZVTkMKKyNpZiAoZGVmaW5lZCBEQlVTX1ZBX0NPUFlfRlVOQykKKyMgZGVmaW5lIERCVVNfVkFfQ09QWSBAREJVU19WQV9DT1BZX0ZVTkNACisjZW5kaWYKKworI2lmZGVmIERCVVNfVkFfQ09QWV9GVU5DCisjdW5kZWYgREJVU19WQV9DT1BZX0ZVTkMKKyNlbmRpZgorCisjY21ha2VkZWZpbmUgREJVU19WQV9DT1BZX0FTX0FSUkFZIEBEQlVTX1ZBX0NPUFlfQVNfQVJSQVlACisKKyNjbWFrZWRlZmluZSBEQlVTX1dJVEhfR0xJQiAxCisjY21ha2VkZWZpbmUgR0xJQl9WRVJTSU9OX01JTl9SRVFVSVJFRCBAR0xJQl9WRVJTSU9OX01JTl9SRVFVSVJFREAKKyNjbWFrZWRlZmluZSBHTElCX1ZFUlNJT05fTUFYX0FMTE9XRUQgIEBHTElCX1ZFUlNJT05fTUFYX0FMTE9XRURACisKKy8vIGhlYWRlcnMKKyNjbWFrZWRlZmluZSBIQVZFX0FMTE9DQV9ICisjY21ha2VkZWZpbmUgSEFWRV9CWVRFU1dBUF9ICisjY21ha2VkZWZpbmUgSEFWRV9DUlRfRVhURVJOU19ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIGRpcmVudC5oICovCisjY21ha2VkZWZpbmUgICBIQVZFX0RJUkVOVF9IIDEKKworI2NtYWtlZGVmaW5lIEhBVkVfRExGQ05fSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSBlcnJuby5oICovCisjY21ha2VkZWZpbmUgICBIQVZFX0VSUk5PX0ggMQorCisjY21ha2VkZWZpbmUgSEFWRV9FWEVDSU5GT19ICisjY21ha2VkZWZpbmUgSEFWRV9FWFBBVF9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIGdycC5oICovCisjY21ha2VkZWZpbmUgICBIQVZFX0dSUF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgaW50dHlwZXMuaCAqLworI2NtYWtlZGVmaW5lICAgSEFWRV9JTlRUWVBFU19IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgaW8uaCAqLworI2NtYWtlZGVmaW5lICAgSEFWRV9JT19IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgbG9jYWxlLmggKi8KKyNjbWFrZWRlZmluZSAgIEhBVkVfTE9DQUxFX0ggMQorCisjY21ha2VkZWZpbmUgSEFWRV9NRU1PUllfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSBzeXMvcG9sbC5oICovCisjY21ha2VkZWZpbmUgICAgSEFWRV9QT0xMIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgc2lnbmFsLmggKi8KKyNjbWFrZWRlZmluZSAgIEhBVkVfU0lHTkFMX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSBzdGRpbnQuaCAqLworI2NtYWtlZGVmaW5lICAgSEFWRV9TVERJTlRfSCAxCisKKyNjbWFrZWRlZmluZSBIQVZFX1NURExJQl9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHN0ZGlvLmggKi8KKyNjbWFrZWRlZmluZSAgIEhBVkVfU1RESU9fSCAxCisKKyNjbWFrZWRlZmluZSBIQVZFX1NUUklOR1NfSAorI2NtYWtlZGVmaW5lIEhBVkVfU1RSSU5HX0gKKyNjbWFrZWRlZmluZSBIQVZFX1NZU0xPR19ICisjY21ha2VkZWZpbmUgSEFWRV9TWVNfRVZFTlRTX0gKKyNjbWFrZWRlZmluZSBIQVZFX1NZU19JTk9USUZZX0gKKyNjbWFrZWRlZmluZSBIQVZFX1NZU19QUkNUTF9ICisjY21ha2VkZWZpbmUgSEFWRV9TWVNfUkVTT1VSQ0VfSAorI2NtYWtlZGVmaW5lIEhBVkVfU1lTX1NUQVRfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSBzeXMvc3lzbGltaXRzLmggKi8KKyNjbWFrZWRlZmluZSAgIEhBVkVfU1lTX1NZU0xJTUlUU19IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgc3lzL3RpbWUuaCAqLworI2NtYWtlZGVmaW5lICAgIEhBVkVfU1lTX1RJTUVfSCAxCisKKyNjbWFrZWRlZmluZSBIQVZFX1NZU19UWVBFU19ICisKKyNjbWFrZWRlZmluZSBIQVZFX1NZU19VSU9fSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSBzeXMvd2FpdC5oICovCisjY21ha2VkZWZpbmUgICAgSEFWRV9TWVNfV0FJVF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGltZS5oICovCisjY21ha2VkZWZpbmUgICBIQVZFX1RJTUVfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHVuaXN0ZC5oICovCisjY21ha2VkZWZpbmUgICBIQVZFX1VOSVNURF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgd3MydGNwaXAuaCAqLworI2NtYWtlZGVmaW5lICAgSEFWRV9XUzJUQ1BJUF9ICisKKy8vIHN5bWJvbHMKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIGJhY2t0cmFjZSAqLworI2NtYWtlZGVmaW5lICAgSEFWRV9CQUNLVFJBQ0UgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSBnZXRncm91cGxpc3QgKi8KKyNjbWFrZWRlZmluZSAgIEhBVkVfR0VUR1JPVVBMSVNUIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgZ2V0cGVlcnVjcmVkICovCisjY21ha2VkZWZpbmUgICBIQVZFX0dFVFBFRVJVQ1JFRCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIG5hbm9zbGVlcCAqLworI2NtYWtlZGVmaW5lICAgSEFWRV9OQU5PU0xFRVAgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSBnZXRwd25hbV9yICovCisjY21ha2VkZWZpbmUgICBIQVZFX1BPU0lYX0dFVFBXTkFNX1IgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSBzb2NrZXRwYWlyICovCisjY21ha2VkZWZpbmUgICBIQVZFX1NPQ0tFVFBBSVIgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSBzZXRlbnYgKi8KKyNjbWFrZWRlZmluZSAgIEhBVkVfU0VURU5WIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdW5zZXRlbnYgKi8KKyNjbWFrZWRlZmluZSAgIEhBVkVfVU5TRVRFTlYgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSBjbGVhcmVudiAqLworI2NtYWtlZGVmaW5lICAgSEFWRV9DTEVBUkVOViAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHdyaXRldiAqLworI2NtYWtlZGVmaW5lICAgSEFWRV9XUklURVYgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSBzb2NrbGVuX3QgKi8KKyNjbWFrZWRlZmluZSAgIEhBVkVfU09DS0xFTl9UIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgc2V0bG9jYWxlICovCisjY21ha2VkZWZpbmUgICBIQVZFX1NFVExPQ0FMRSAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIGxvY2FsZWNvbnYgKi8KKyNjbWFrZWRlZmluZSAgIEhBVkVfTE9DQUxFQ09OViAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHN0cnRvbGwgKi8KKyNjbWFrZWRlZmluZSAgIEhBVkVfU1RSVE9MTCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHN0cnRvdWxsICovCisjY21ha2VkZWZpbmUgICBIQVZFX1NUUlRPVUxMIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgcGlwMiAqLworI2NtYWtlZGVmaW5lICAgSEFWRV9QSVBFMgorCisjY21ha2VkZWZpbmUgSEFWRV9BQ0NFUFQ0IDEKKyNjbWFrZWRlZmluZSBIQVZFX0RJUkZEIDEKKyNjbWFrZWRlZmluZSBIQVZFX0lOT1RJRllfSU5JVDEgMQorI2NtYWtlZGVmaW5lIEhBVkVfR0VUUkxJTUlUIDEKKyNjbWFrZWRlZmluZSBIQVZFX1BSTElNSVQgMQorI2NtYWtlZGVmaW5lIEhBVkVfU0VUUkxJTUlUIDEKKyNjbWFrZWRlZmluZSBIQVZFX1VOSVhfRkRfUEFTU0lORyAxCisKKy8vIHN0cnVjdHMKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHN0cnVjdCBjbXNncmVkICovCisjY21ha2VkZWZpbmUgICAgSEFWRV9DTVNHQ1JFRCAxCisKKyNjbWFrZWRlZmluZSBGRF9TRVRTSVpFIEBGRF9TRVRTSVpFQAorCisjY21ha2VkZWZpbmUgREJVU19VU0VSICJAREJVU19VU0VSQCIKKyNjbWFrZWRlZmluZSBEQlVTX1RFU1RfVVNFUiAiQERCVVNfVEVTVF9VU0VSQCIKKworLy8gc3lzdGVtIHR5cGUgZGVmaW5lcworI2lmIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9XSU42NCkgfHwgZGVmaW5lZCAoX1dJTjMyX1dDRSkKKyMgZGVmaW5lIERCVVNfV0lOCisjIGRlZmluZSBEQlVTX1dJTl9GSVhNRSAxCisjIGlmZGVmIF9XSU4zMl9XQ0UKKyMgIGRlZmluZSBEQlVTX1dJTkNFCisjIGVsc2UKKyMgIGRlZmluZSBEQlVTX1dJTjMyCisjIGVuZGlmCisjZWxzZQorIyBkZWZpbmUgREJVU19VTklYCisjZW5kaWYgCisKKyNpZiBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfV0lONjQpCisvLyBtaW5ndyBtb2RlX3QKKyMgaWZkZWYgSEFWRV9TVERJT19ICisjICBpbmNsdWRlIDxzdGRpby5oPgorIyBlbmRpZgorIyBpZm5kZWYgX01TQ19WRVIKKyMgIGRlZmluZSB1aWRfdCBpbnQKKyMgIGRlZmluZSBnaWRfdCBpbnQKKyMgZWxzZQorIyAgZGVmaW5lIHNucHJpbnRmIF9zbnByaW50ZgorICAgdHlwZWRlZiBpbnQgbW9kZV90OworIyAgaWYgIWRlZmluZWQoX1dJTjMyX1dDRSkKKyMgICAgZGVmaW5lIHN0cnRvbGwgX3N0cnRvaTY0CisjICAgIGRlZmluZSBzdHJ0b3VsbCBfc3RydG91aTY0CisjICAgIGRlZmluZSBIQVZFX1NUUlRPTEwgMQorIyAgICBkZWZpbmUgSEFWRV9TVFJUT1VMTCAxCisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCS8vIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9XSU42NCkKKworI2lmZGVmIGludGVyZmFjZQorI3VuZGVmIGludGVyZmFjZQorI2VuZGlmCisKKyNpZm5kZWYgU0lHSFVQCisjZGVmaW5lIFNJR0hVUAkxCisjZW5kaWYKKworI2NtYWtlZGVmaW5lIERCVVNfVkVSQk9TRV9DX1MgMQorI2lmZGVmIERCVVNfVkVSQk9TRV9DX1MKKyNkZWZpbmUgX2RidXNfdmVyYm9zZV9DX1MgcHJpbnRmCisjZWxzZQorI2RlZmluZSBfZGJ1c192ZXJib3NlX0NfUyBfZGJ1c192ZXJib3NlCisjZW5kaWYgCisKKyMgaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgIWRlZmluZWQoaW5saW5lKQorI2RlZmluZSBpbmxpbmUgX19pbmxpbmUKKyNlbmRpZgorCisjaWZkZWYgREJVU19XSU4KKyNkZWZpbmUgRkRfU0VUU0laRSBARkRfU0VUU0laRUAKKyNlbmRpZgorCisjZW5kaWYgIC8vIF9EQlVTX0NPTkZJR19ICmRpZmYgLS1naXQgYS9jbWFrZS9kYnVzLWVudi5iYXQuY21ha2UgYi9jbWFrZS9kYnVzLWVudi5iYXQuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg1OWNlMAotLS0gL2Rldi9udWxsCisrKyBiL2NtYWtlL2RidXMtZW52LmJhdC5jbWFrZQpAQCAtMCwwICsxLDggQEAKKzo6IGVudmlyb25tZW50IHNldHRpbmcgZm9yIGRidXMgY2xpZW50cworQGVjaG8gb2ZmCisKKzo6IHNlc3Npb24gYnVzIGFkZHJlc3MKK3NldCBEQlVTX1NFU1NJT05fQlVTX0FERFJFU1M9QERCVVNfU0VTU0lPTl9CVVNfQ09OTkVDVF9BRERSRVNTQAorCis6OiBzeXN0ZW0gYnVzIGFkZHJlc3MKK3NldCBEQlVTX1NZU1RFTV9CVVNfREVGQVVMVF9BRERSRVNTPUBEQlVTX1NZU1RFTV9CVVNfREVGQVVMVF9BRERSRVNTQApkaWZmIC0tZ2l0IGEvY21ha2UvZGJ1cy9DTWFrZUxpc3RzLnR4dCBiL2NtYWtlL2RidXMvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGEwMWQ5MQotLS0gL2Rldi9udWxsCisrKyBiL2NtYWtlL2RidXMvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwzNDQgQEAKK1NFVChEQlVTX0RJUiAke0NNQUtFX1NPVVJDRV9ESVJ9Ly4uL2RidXMpCisKK2NvbmZpZ3VyZV9maWxlKCR7REJVU19ESVJ9L2RidXMtYXJjaC1kZXBzLmguaW4gJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2RidXMtYXJjaC1kZXBzLmggKQorCithZGRfZGVmaW5pdGlvbnMoLUREQlVTX0NPTVBJTEFUSU9OKQorCitzZXQgKGRidXNpbmNsdWRlX0hFQURFUlMKKwkke0RCVVNfRElSfS9kYnVzLmgKKwkke0RCVVNfRElSfS9kYnVzLWFkZHJlc3MuaAorCSR7REJVU19ESVJ9L2RidXMtYnVzLmgKKwkke0RCVVNfRElSfS9kYnVzLWNvbm5lY3Rpb24uaAorCSR7REJVU19ESVJ9L2RidXMtZXJyb3JzLmgKKwkke0RCVVNfRElSfS9kYnVzLW1hY3Jvcy5oCisJJHtEQlVTX0RJUn0vZGJ1cy1tZW1vcnkuaAorCSR7REJVU19ESVJ9L2RidXMtbWVzc2FnZS5oCisJJHtEQlVTX0RJUn0vZGJ1cy1taXNjLmgKKwkke0RCVVNfRElSfS9kYnVzLXBlbmRpbmctY2FsbC5oCisJJHtEQlVTX0RJUn0vZGJ1cy1wcm90b2NvbC5oCisJJHtEQlVTX0RJUn0vZGJ1cy1zZXJ2ZXIuaAorCSR7REJVU19ESVJ9L2RidXMtc2hhcmVkLmgKKwkke0RCVVNfRElSfS9kYnVzLXNpZ25hdHVyZS5oCisJJHtEQlVTX0RJUn0vZGJ1cy1zeW50YXguaAorCSR7REJVU19ESVJ9L2RidXMtdGhyZWFkcy5oCisJJHtEQlVTX0RJUn0vZGJ1cy10eXBlcy5oCispCitzZXQgKGRidXNpbmNsdWRlX0FSQ0hfSEVBREVSUworCSR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9kYnVzLWFyY2gtZGVwcy5oCispCisKKyMjIyBzb3VyY2UgY29kZSB0aGF0IGdvZXMgaW4gdGhlIGluc3RhbGxlZCBjbGllbnQgbGlicmFyeQorIyMjIGFuZCBpcyBzcGVjaWZpYyB0byBsaWJyYXJ5IGZ1bmN0aW9uYWxpdHkKK3NldCAoREJVU19MSUJfU09VUkNFUworCSR7REJVU19ESVJ9L2RidXMtYWRkcmVzcy5jCisJJHtEQlVTX0RJUn0vZGJ1cy1hdXRoLmMKKwkke0RCVVNfRElSfS9kYnVzLWJ1cy5jCisJJHtEQlVTX0RJUn0vZGJ1cy1jb25uZWN0aW9uLmMKKwkke0RCVVNfRElSfS9kYnVzLWNyZWRlbnRpYWxzLmMKKwkke0RCVVNfRElSfS9kYnVzLWVycm9ycy5jCisJJHtEQlVTX0RJUn0vZGJ1cy1rZXlyaW5nLmMKKwkke0RCVVNfRElSfS9kYnVzLW1hcnNoYWwtaGVhZGVyLmMKKwkke0RCVVNfRElSfS9kYnVzLW1hcnNoYWwtYnl0ZXN3YXAuYworCSR7REJVU19ESVJ9L2RidXMtbWFyc2hhbC1yZWN1cnNpdmUuYworCSR7REJVU19ESVJ9L2RidXMtbWFyc2hhbC12YWxpZGF0ZS5jCisJJHtEQlVTX0RJUn0vZGJ1cy1tZXNzYWdlLmMKKwkke0RCVVNfRElSfS9kYnVzLW1pc2MuYworCSR7REJVU19ESVJ9L2RidXMtbm9uY2UuYworCSR7REJVU19ESVJ9L2RidXMtb2JqZWN0LXRyZWUuYworCSR7REJVU19ESVJ9L2RidXMtcGVuZGluZy1jYWxsLmMKKwkke0RCVVNfRElSfS9kYnVzLXJlc291cmNlcy5jCisJJHtEQlVTX0RJUn0vZGJ1cy1zZXJ2ZXIuYworCSR7REJVU19ESVJ9L2RidXMtc2VydmVyLXNvY2tldC5jCisJJHtEQlVTX0RJUn0vZGJ1cy1zZXJ2ZXItZGVidWctcGlwZS5jCisJJHtEQlVTX0RJUn0vZGJ1cy1zaGEuYworCSR7REJVU19ESVJ9L2RidXMtc2lnbmF0dXJlLmMKKwkke0RCVVNfRElSfS9kYnVzLXN5bnRheC5jCisJJHtEQlVTX0RJUn0vZGJ1cy10aW1lb3V0LmMKKwkke0RCVVNfRElSfS9kYnVzLXRocmVhZHMuYworCSR7REJVU19ESVJ9L2RidXMtdHJhbnNwb3J0LmMKKwkke0RCVVNfRElSfS9kYnVzLXRyYW5zcG9ydC1zb2NrZXQuYworCSR7REJVU19ESVJ9L2RidXMtd2F0Y2guYworKQorCisKK2lmKFVOSVgpCisJc2V0IChEQlVTX0xJQl9TT1VSQ0VTICR7REJVU19MSUJfU09VUkNFU30gCisJCSR7REJVU19ESVJ9L2RidXMtdHJhbnNwb3J0LXVuaXguYworCQkke0RCVVNfRElSfS9kYnVzLXNlcnZlci11bml4LmMKKwkpCitlbHNlKFVOSVgpCisJc2V0IChEQlVTX0xJQl9TT1VSQ0VTICR7REJVU19MSUJfU09VUkNFU30gCisJCSR7REJVU19ESVJ9L2RidXMtdHJhbnNwb3J0LXdpbi5jCisJCSR7REJVU19ESVJ9L2RidXMtc2VydmVyLXdpbi5jCisJKQorZW5kaWYoVU5JWCkKKworc2V0IChEQlVTX0xJQl9IRUFERVJTCisJJHtEQlVTX0RJUn0vZGJ1cy1hdXRoLmgKKwkke0RCVVNfRElSfS9kYnVzLWNvbm5lY3Rpb24taW50ZXJuYWwuaAorCSR7REJVU19ESVJ9L2RidXMtY3JlZGVudGlhbHMuaAorCSR7REJVU19ESVJ9L2RidXMta2V5cmluZy5oCisJJHtEQlVTX0RJUn0vZGJ1cy1tYXJzaGFsLWhlYWRlci5oCisJJHtEQlVTX0RJUn0vZGJ1cy1tYXJzaGFsLWJ5dGVzd2FwLmgKKwkke0RCVVNfRElSfS9kYnVzLW1hcnNoYWwtcmVjdXJzaXZlLmgKKwkke0RCVVNfRElSfS9kYnVzLW1hcnNoYWwtdmFsaWRhdGUuaAorCSR7REJVU19ESVJ9L2RidXMtbWVzc2FnZS1pbnRlcm5hbC5oCisJJHtEQlVTX0RJUn0vZGJ1cy1tZXNzYWdlLXByaXZhdGUuaAorCSR7REJVU19ESVJ9L2RidXMtbWlzYy5oCisJJHtEQlVTX0RJUn0vZGJ1cy1vYmplY3QtdHJlZS5oCisJJHtEQlVTX0RJUn0vZGJ1cy1wcm90b2NvbC5oCisJJHtEQlVTX0RJUn0vZGJ1cy1yZXNvdXJjZXMuaAorCSR7REJVU19ESVJ9L2RidXMtc2VydmVyLWRlYnVnLXBpcGUuaAorCSR7REJVU19ESVJ9L2RidXMtc2VydmVyLXByb3RlY3RlZC5oCisJJHtEQlVTX0RJUn0vZGJ1cy1zZXJ2ZXItdW5peC5oCisJJHtEQlVTX0RJUn0vZGJ1cy1zaGEuaAorCSR7REJVU19ESVJ9L2RidXMtdGltZW91dC5oCisJJHtEQlVTX0RJUn0vZGJ1cy10aHJlYWRzLmgKKwkke0RCVVNfRElSfS9kYnVzLXRocmVhZHMtaW50ZXJuYWwuaAorCSR7REJVU19ESVJ9L2RidXMtdHJhbnNwb3J0LmgKKwkke0RCVVNfRElSfS9kYnVzLXRyYW5zcG9ydC1wcm90ZWN0ZWQuaAorCSR7REJVU19ESVJ9L2RidXMtd2F0Y2guaAorCSR7Q01BS0VfQklOQVJZX0RJUn0vY29uZmlnLmgKKykKK2lmKFVOSVgpCisJc2V0IChEQlVTX0xJQl9IRUFERVJTICR7REJVU19MSUJfSEVBREVSU30gCisJCSR7REJVU19ESVJ9L2RidXMtdHJhbnNwb3J0LXVuaXguaAorCSkKK2Vsc2UoVU5JWCkKKwlzZXQgKERCVVNfTElCX0hFQURFUlMgJHtEQlVTX0xJQl9IRUFERVJTfSAKKwkJJHtEQlVTX0RJUn0vZGJ1cy10cmFuc3BvcnQtd2luLmgKKwkpCitlbmRpZihVTklYKQorCisKKyMjIyBzb3VyY2UgY29kZSB0aGF0IGdvZXMgaW4gdGhlIGluc3RhbGxlZCBjbGllbnQgbGlicmFyeQorIyMjIEFORCBpcyBnZW5lcmljIHV0aWxpdHkgZnVuY3Rpb25hbGl0eSB1c2VkIGJ5IHRoZSAKKyMjIyBkYWVtb24gb3IgdGVzdCBwcm9ncmFtcyAoYWxsIHN5bWJvbHMgaW4gaGVyZSBzaG91bGQgCisjIyMgYmUgdW5kZXJzY29yZS1wcmVmaXhlZCkKK3NldCAoREJVU19TSEFSRURfU09VUkNFUworCSR7REJVU19ESVJ9L2RidXMtZGF0YXNsb3QuYworCSR7REJVU19ESVJ9L2RidXMtZmlsZS5jCisJJHtEQlVTX0RJUn0vZGJ1cy1oYXNoLmMKKwkke0RCVVNfRElSfS9kYnVzLWludGVybmFscy5jCisJJHtEQlVTX0RJUn0vZGJ1cy1saXN0LmMKKwkke0RCVVNfRElSfS9kYnVzLW1hcnNoYWwtYmFzaWMuYworCSR7REJVU19ESVJ9L2RidXMtbWVtb3J5LmMKKwkke0RCVVNfRElSfS9kYnVzLW1lbXBvb2wuYworCSR7REJVU19ESVJ9L2RidXMtc3RyaW5nLmMKKwkke0RCVVNfRElSfS9kYnVzLXN5c2RlcHMuYworCSR7REJVU19ESVJ9L2RidXMtcGlwZS5jCispCisKK3NldCAoREJVU19TSEFSRURfSEVBREVSUworCSR7REJVU19ESVJ9L2RidXMtZGF0YXNsb3QuaAorCSR7REJVU19ESVJ9L2RidXMtZmlsZS5oCisJJHtEQlVTX0RJUn0vZGJ1cy1oYXNoLmgKKwkke0RCVVNfRElSfS9kYnVzLWludGVybmFscy5oCisJJHtEQlVTX0RJUn0vZGJ1cy1saXN0LmgKKwkke0RCVVNfRElSfS9kYnVzLW1hcnNoYWwtYmFzaWMuaAorCSR7REJVU19ESVJ9L2RidXMtbWVtcG9vbC5oCisJJHtEQlVTX0RJUn0vZGJ1cy1zdHJpbmcuaAorCSR7REJVU19ESVJ9L2RidXMtc3RyaW5nLXByaXZhdGUuaAorCSR7REJVU19ESVJ9L2RidXMtcGlwZS5oCisJJHtEQlVTX0RJUn0vZGJ1cy1zeXNkZXBzLmgKKykKKworIyMjIHNvdXJjZSBjb2RlIHRoYXQgaXMgZ2VuZXJpYyB1dGlsaXR5IGZ1bmN0aW9uYWxpdHkgdXNlZAorIyMjIGJ5IHRoZSBidXMgZGFlbW9uIG9yIHRlc3QgYXBwcywgYnV0IGlzIE5PVCBpbmNsdWRlZAorIyMjIGluIHRoZSBELUJVUyBjbGllbnQgbGlicmFyeSAoYWxsIHN5bWJvbHMgaW4gaGVyZSAKKyMjIyBzaG91bGQgYmUgdW5kZXJzY29yZS1wcmVmaXhlZCBidXQgZG9uJ3QgcmVhbGx5IG5lZWQgCisjIyMgdG8gYmUgdW5sZXNzIHRoZXkgbW92ZSB0byBEQlVTX1NIQVJFRF9TT1VSQ0VTIGxhdGVyKQorc2V0IChEQlVTX1VUSUxfU09VUkNFUworCSR7REJVU19ESVJ9L2RidXMtYXN2LXV0aWwuYworCSR7REJVU19ESVJ9L2RidXMtYXV0aC1zY3JpcHQuYworCSR7REJVU19ESVJ9L2RidXMtYXV0aC11dGlsLmMKKwkke0RCVVNfRElSfS9kYnVzLWNyZWRlbnRpYWxzLXV0aWwuYworCSR7REJVU19ESVJ9L2RidXMtbWFpbmxvb3AuYworCSR7REJVU19ESVJ9L2RidXMtbWFyc2hhbC1ieXRlc3dhcC11dGlsLmMKKwkke0RCVVNfRElSfS9kYnVzLW1hcnNoYWwtcmVjdXJzaXZlLXV0aWwuYworCSR7REJVU19ESVJ9L2RidXMtbWFyc2hhbC12YWxpZGF0ZS11dGlsLmMKKwkke0RCVVNfRElSfS9kYnVzLW1lc3NhZ2UtZmFjdG9yeS5jCisJJHtEQlVTX0RJUn0vZGJ1cy1tZXNzYWdlLXV0aWwuYworCSR7REJVU19ESVJ9L2RidXMtc2hlbGwuYworCSR7REJVU19ESVJ9L2RidXMtc29ja2V0LXNldC5jCisJJHtEQlVTX0RJUn0vZGJ1cy1zb2NrZXQtc2V0LXBvbGwuYworCSR7REJVU19ESVJ9L2RidXMtc3RyaW5nLXV0aWwuYworCSR7REJVU19ESVJ9L2RidXMtc3lzZGVwcy11dGlsLmMKKykKKworaWYgKERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTKQorCXNldCAoREJVU19VVElMX1NPVVJDRVMgCisJCSR7REJVU19VVElMX1NPVVJDRVN9CisJCSR7REJVU19ESVJ9L2RidXMtdGVzdC5jCisJCSR7REJVU19ESVJ9L2RidXMtc3Bhd24tdGVzdC5jCisJKQorZW5kaWYgKERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTKQorCitzZXQgKERCVVNfVVRJTF9IRUFERVJTCisJJHtEQlVTX0RJUn0vZGJ1cy1hc3YtdXRpbC5oCisJJHtEQlVTX0RJUn0vZGJ1cy1hdXRoLXNjcmlwdC5oCisJJHtEQlVTX0RJUn0vZGJ1cy1tYWlubG9vcC5oCisJJHtEQlVTX0RJUn0vZGJ1cy1tZXNzYWdlLWZhY3RvcnkuaAorCSR7REJVU19ESVJ9L2RidXMtc2hlbGwuaAorCSR7REJVU19ESVJ9L2RidXMtc29ja2V0LXNldC5oCisJJHtEQlVTX0RJUn0vZGJ1cy1zcGF3bi5oCisJJHtEQlVTX0RJUn0vZGJ1cy10ZXN0LmgKKykKKworIyMjIHBsYXRmb3JtIHNwZWNpZmljIHNldHRpbmdzCitpZiAoV0lOMzIpCisJc2V0IChEQlVTX1NIQVJFRF9TT1VSQ0VTICR7REJVU19TSEFSRURfU09VUkNFU30gCisJCSR7REJVU19ESVJ9L2RidXMtZmlsZS13aW4uYworCQkke0RCVVNfRElSfS9kYnVzLWluaXQtd2luLmNwcAorCQkke0RCVVNfRElSfS9kYnVzLXN5c2RlcHMtd2luLmMKKwkJJHtEQlVTX0RJUn0vZGJ1cy1waXBlLXdpbi5jCisJCSR7REJVU19ESVJ9L2RidXMtc3lzZGVwcy10aHJlYWQtd2luLmMKKwkpCisJc2V0IChEQlVTX1NIQVJFRF9IRUFERVJTICR7REJVU19TSEFSRURfSEVBREVSU30gCisJCSR7REJVU19ESVJ9L2RidXMtc29ja2V0cy13aW4uaAorCQkke0RCVVNfRElSfS9kYnVzLXN5c2RlcHMtd2luLmgKKwkpCisJc2V0IChEQlVTX1VUSUxfU09VUkNFUyAke0RCVVNfVVRJTF9TT1VSQ0VTfQorCQkke0RCVVNfRElSfS9kYnVzLXNwYXduLXdpbi5jCisJCSR7REJVU19ESVJ9L2RidXMtc3lzZGVwcy11dGlsLXdpbi5jCisJKQorCWlmKFdJTkNFKQorCXNldCAoREJVU19TSEFSRURfU09VUkNFUyAke0RCVVNfU0hBUkVEX1NPVVJDRVN9CisJCSR7REJVU19ESVJ9L2RidXMtc3lzZGVwcy13aW5jZS1nbHVlLmMKKwkpCisJc2V0IChEQlVTX1NIQVJFRF9IRUFERVJTICR7REJVU19TSEFSRURfSEVBREVSU30KKwkJJHtEQlVTX0RJUn0vZGJ1cy1zeXNkZXBzLXdpbmNlLWdsdWUuaAorCSkKKwllbmRpZihXSU5DRSkKK2Vsc2UgKFdJTjMyKQorCXNldCAoREJVU19TSEFSRURfU09VUkNFUyAke0RCVVNfU0hBUkVEX1NPVVJDRVN9IAorCQkke0RCVVNfRElSfS9kYnVzLWZpbGUtdW5peC5jCisJCSR7REJVU19ESVJ9L2RidXMtcGlwZS11bml4LmMKKwkJJHtEQlVTX0RJUn0vZGJ1cy1zeXNkZXBzLXVuaXguYworCQkke0RCVVNfRElSfS9kYnVzLXN5c2RlcHMtcHRocmVhZC5jCisJCSR7REJVU19ESVJ9L2RidXMtdXNlcmRiLmMKKwkpCisJc2V0IChEQlVTX1NIQVJFRF9IRUFERVJTICR7REJVU19TSEFSRURfSEVBREVSU30gCisJCSR7REJVU19ESVJ9L2RidXMtc2VydmVyLXVuaXguaAorCQkke0RCVVNfRElSfS9kYnVzLXRyYW5zcG9ydC11bml4LmgKKwkJJHtEQlVTX0RJUn0vZGJ1cy1zeXNkZXBzLXVuaXguaAorCQkke0RCVVNfRElSfS9kYnVzLXVzZXJkYi5oCisJKQorCXNldCAoREJVU19VVElMX1NPVVJDRVMgJHtEQlVTX1VUSUxfU09VUkNFU30KKwkJJHtEQlVTX0RJUn0vZGJ1cy1zcGF3bi5jCisJCSR7REJVU19ESVJ9L2RidXMtdXNlcmRiLXV0aWwuYworCQkke0RCVVNfRElSfS9kYnVzLXN5c2RlcHMtdXRpbC11bml4LmMKKwkpCitlbmRpZiAoV0lOMzIpCisKK3NldChsaWJkYnVzX1NPVVJDRVMKKwkke0RCVVNfTElCX1NPVVJDRVN9CisJJHtEQlVTX1NIQVJFRF9TT1VSQ0VTfQorKQorCitzZXQobGliZGJ1c19IRUFERVJTIAorCSR7REJVU19MSUJfSEVBREVSU30KKwkke0RCVVNfU0hBUkVEX0hFQURFUlN9CispCisKK3NldCAoQlVJTERfRklMRVZFUlNJT04gJHtEQlVTX01BSk9SX1ZFUlNJT059LCR7REJVU19NSU5PUl9WRVJTSU9OfSwke0RCVVNfTUlDUk9fVkVSU0lPTn0sJHtEQlVTX1BBVENIX1ZFUlNJT059KQorc2V0IChCVUlMRF9USU1FU1RBTVAgJHtEQlVTX0JVSUxEX1RJTUVTVEFNUH0pCisKK2NvbmZpZ3VyZV9maWxlKCR7REJVU19ESVJ9L3ZlcnNpb25pbmZvLnJjLmluICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS92ZXJzaW9uaW5mby5yYykKK2xpc3QoQVBQRU5EIGxpYmRidXNfU09VUkNFUyB2ZXJzaW9uaW5mby5yYykKKworaWYoTVNWQ19JREUpCisJcHJvamVjdF9zb3VyY2VfZ3JvdXAoJHtHUk9VUF9DT0RFfSBEQlVTX0xJQl9TT1VSQ0VTIERCVVNfTElCX0hFQURFUlMpCisJcHJvamVjdF9zb3VyY2VfZ3JvdXAoJHtHUk9VUF9DT0RFfSBEQlVTX1NIQVJFRF9TT1VSQ0VTIERCVVNfU0hBUkVEX0hFQURFUlMpCisJcHJvamVjdF9zb3VyY2VfZ3JvdXAoJHtHUk9VUF9DT0RFfSBEQlVTX1VUSUxfU09VUkNFUyBEQlVTX1VUSUxfU09VUkNFUykKK2VuZGlmKE1TVkNfSURFKQorCisjIGZvciBjbG9ja19nZXRyZXMoKSBvbiBlLmcuIEdOVS9MaW51eCAoYnV0IG5vdCBBbmRyb2lkKQorZmluZF9saWJyYXJ5KExJQlJUIHJ0KQorCisjIGZvciBzb2NrZXQoKSBvbiBRTlgKK2ZpbmRfbGlicmFyeShMSUJTT0NLRVQgc29ja2V0KQorCisjIyMgQ2xpZW50IGxpYnJhcnkKK2FkZF9saWJyYXJ5KGRidXMtMSBTSEFSRUQKKwkJCSR7bGliZGJ1c19TT1VSQ0VTfQorCQkJJHtsaWJkYnVzX0hFQURFUlN9CispCitpZihERUZJTkVEIERCVVNfTElCUkFSWV9SRVZJU0lPTikKKyAgICBtYXRoKEVYUFIgREJVU19MSUJSQVJZX01BSk9SICIke0RCVVNfTElCUkFSWV9DVVJSRU5UfSAtICR7REJVU19MSUJSQVJZX0FHRX0iKQorZW5kaWYoKQorCitpZihXSU4zMikKKyAgICBpZihERUZJTkVEIERCVVNfTElCUkFSWV9SRVZJU0lPTikKKyAgICAgICAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKGRidXMtMSBQUk9QRVJUSUVTIFNVRkZJWCAiLSR7REJVU19MSUJSQVJZX01BSk9SfSR7Q01BS0VfU0hBUkVEX0xJQlJBUllfU1VGRklYfSIpCisgICAgICAgIGFkZF9jdXN0b21fY29tbWFuZChUQVJHRVQgZGJ1cy0xIFBPU1RfQlVJTEQKKyAgICAgICAgICAgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSBjb3B5ICIkPFRBUkdFVF9GSUxFOmRidXMtMT4iICIkPFRBUkdFVF9GSUxFX0RJUjpkYnVzLTE+LyR7Q01BS0VfU0hBUkVEX0xJQlJBUllfUFJFRklYfWRidXMtMSR7Q01BS0VfU0hBUkVEX0xJQlJBUllfU1VGRklYfSIKKyAgICAgICAgICAgIENPTU1FTlQgIkNyZWF0ZSBub24gdmVyc2lvbmVkIGRidXMtMSBsaWJyYXJ5IGZvciBsZWdhY3kgYXBwbGljYXRpb25zIgorICAgICAgICApCisgICAgICAgIGluc3RhbGwoRklMRVMgJHtMRUdBQ1lfRklMRV9OQU1FfSBERVNUSU5BVElPTiBiaW4pCisgICAgZW5kaWYoKQorICAgIGlmKFdJTkNFKQorICAgICAgICB0YXJnZXRfbGlua19saWJyYXJpZXMoZGJ1cy0xIHdzMikKKyAgICBlbHNlKFdJTkNFKQorICAgICAgICB0YXJnZXRfbGlua19saWJyYXJpZXMoZGJ1cy0xIHdzMl8zMiBhZHZhcGkzMiBuZXRhcGkzMiBpcGhscGFwaSBkYmdoZWxwKQorICAgIGVuZGlmKFdJTkNFKQorZWxzZShXSU4zMikKKyAgICBpZihERUZJTkVEIERCVVNfTElCUkFSWV9SRVZJU0lPTikKKyAgICAgICAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKGRidXMtMSBQUk9QRVJUSUVTIFZFUlNJT04gJHtEQlVTX0xJQlJBUllfTUFKT1J9LiR7REJVU19MSUJSQVJZX0FHRX0uJHtEQlVTX0xJQlJBUllfUkVWSVNJT059IFNPVkVSU0lPTiAke0RCVVNfTElCUkFSWV9NQUpPUn0pCisgICAgZW5kaWYoKQorICAgIHRhcmdldF9saW5rX2xpYnJhcmllcyhkYnVzLTEgJHtDTUFLRV9USFJFQURfTElCU19JTklUfSkKKyAgICBpZihMSUJSVCkKKyAgICAgICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKGRidXMtMSAke0xJQlJUfSkKKyAgICBlbmRpZigpCisgICAgaWYoTElCU09DS0VUKQorICAgICAgICB0YXJnZXRfbGlua19saWJyYXJpZXMoZGJ1cy0xICR7TElCU09DS0VUfSkKKyAgICBlbmRpZigpCitlbmRpZihXSU4zMikKKworIyBBc3N1bWUgdGhhdCBMaW51eCBoYXMgLVdsLC0tdmVyc2lvbi1zY3JpcHQgYW5kIG90aGVyIHBsYXRmb3JtcyBkbyBub3QKK2lmKCIke0NNQUtFX1NZU1RFTV9OQU1FfSIgU1RSRVFVQUwgIkxpbnV4IikKKyAgICBzZXQoU09WRVJTSU9OICR7REJVU19MSUJSQVJZX01BSk9SfSkKKyAgICBjb25maWd1cmVfZmlsZSgke0RCVVNfRElSfS9WZXJzaW9uLmluICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9WZXJzaW9uKQorICAgIHNldF90YXJnZXRfcHJvcGVydGllcyhkYnVzLTEgUFJPUEVSVElFUyBMSU5LX0ZMQUdTIC1XbCwtLXZlcnNpb24tc2NyaXB0PSR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9WZXJzaW9uKQorZW5kaWYoIiR7Q01BS0VfU1lTVEVNX05BTUV9IiBTVFJFUVVBTCAiTGludXgiKQorCitpbnN0YWxsKFRBUkdFVFMgZGJ1cy0xICR7SU5TVEFMTF9UQVJHRVRTX0RFRkFVTFRfQVJHU30pCitpbnN0YWxsKEZJTEVTICR7ZGJ1c2luY2x1ZGVfSEVBREVSU30gREVTVElOQVRJT04gJHtDTUFLRV9JTlNUQUxMX0lOQ0xVREVESVJ9L2RidXMtMS4wL2RidXMpCitpbnN0YWxsKEZJTEVTICR7ZGJ1c2luY2x1ZGVfQVJDSF9IRUFERVJTfSBERVNUSU5BVElPTiAke0NNQUtFX0lOU1RBTExfTElCRElSfS9kYnVzLTEuMC9pbmNsdWRlL2RidXMpCisKKyMjIyBJbnRlcm5hbCBsaWJyYXJ5LCB1c2VkIGZvciB0aGUgZGFlbW9uLCB0b29scyBhbmQgdGVzdHMsIGNvbXBpbGVkIHN0YXRpY2FsbHkuCisKK2FkZF9saWJyYXJ5KGRidXMtaW50ZXJuYWwgJHtEQlVTX0lOVEVSTkFMX0FERF9MSUJSQVJZX09QVElPTlN9CisJCQkke0RCVVNfVVRJTF9TT1VSQ0VTfQorCQkJJHtEQlVTX1VUSUxfSEVBREVSU30KKykKK3RhcmdldF9saW5rX2xpYnJhcmllcyhkYnVzLWludGVybmFsIGRidXMtMSkKK2lmKFdJTjMyKQorICAgIGlmKFdJTkNFKQorICAgICAgICB0YXJnZXRfbGlua19saWJyYXJpZXMoZGJ1cy1pbnRlcm5hbCB3czIpCisgICAgZWxzZShXSU5DRSkKKyAgICAgICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKGRidXMtaW50ZXJuYWwgd3MyXzMyIGFkdmFwaTMyIG5ldGFwaTMyIGlwaGxwYXBpKQorICAgIGVuZGlmKFdJTkNFKQorZWxzZShXSU4zMikKKyAgICB0YXJnZXRfbGlua19saWJyYXJpZXMoZGJ1cy1pbnRlcm5hbCAke0NNQUtFX1RIUkVBRF9MSUJTX0lOSVR9KQorICAgIGlmKExJQlJUKQorICAgICAgICB0YXJnZXRfbGlua19saWJyYXJpZXMoZGJ1cy1pbnRlcm5hbCAke0xJQlJUfSkKKyAgICBlbmRpZigpCisgICAgaWYoTElCU09DS0VUKQorICAgICAgICB0YXJnZXRfbGlua19saWJyYXJpZXMoZGJ1cy1pbnRlcm5hbCAke0xJQlNPQ0tFVH0pCisgICAgZW5kaWYoKQorZW5kaWYoV0lOMzIpCisKK2lmIChEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUykKKwlhZGRfdGVzdF9leGVjdXRhYmxlKHRlc3QtZGJ1cyAke0NNQUtFX1NPVVJDRV9ESVJ9Ly4uL2RidXMvZGJ1cy10ZXN0LW1haW4uYyAke0RCVVNfSU5URVJOQUxfTElCUkFSSUVTfSkKKwlzZXRfdGFyZ2V0X3Byb3BlcnRpZXModGVzdC1kYnVzIFBST1BFUlRJRVMgQ09NUElMRV9GTEFHUyAke0RCVVNfSU5URVJOQUxfQ0xJRU5UX0RFRklOSVRJT05TfSkKK0VORElGIChEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUykKKworaWYgKFVOSVgpCisjIHNldCB2ZXJzaW9uIGluZm8KK0VORElGIChVTklYKQorCisKKyMjIG1vcCB1cCB0aGUgZ2NvdiBmaWxlcworI2NsZWFuLWxvY2FsOgorIy9iaW4vcm0gKi5iYiAqLmJiZyAqLmRhICouZ2NvdiAubGlicy8qLmRhIC5saWJzLyouYmJnIHx8IHRydWUKZGlmZiAtLWdpdCBhL2NtYWtlL2RvYy9DTWFrZUxpc3RzLnR4dCBiL2NtYWtlL2RvYy9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjFlODRlCi0tLSAvZGV2L251bGwKKysrIGIvY21ha2UvZG9jL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMTc1IEBACitmaW5kX3BhY2thZ2UoRG94eWdlbikKKworaWYoRE9YWUdFTl9FWEVDVVRBQkxFKQorICBPUFRJT04oREJVU19FTkFCTEVfRE9YWUdFTl9ET0NTICJidWlsZCBET1hZR0VOIGRvY3VtZW50YXRpb24gKHJlcXVpcmVzIERveHlnZW4pIiBPTikKK2VuZGlmKERPWFlHRU5fRVhFQ1VUQUJMRSkKKworaWYgKERCVVNfRU5BQkxFX0RPWFlHRU5fRE9DUykKKyAgICBzZXQgKHRvcF9zcmNkaXIgJHtDTUFLRV9TT1VSQ0VfRElSfS8uLikKKyAgICBjb25maWd1cmVfZmlsZSgke0NNQUtFX1NPVVJDRV9ESVJ9Ly4uL0RveHlmaWxlLmluICR7Q01BS0VfQklOQVJZX0RJUn0vRG94eWZpbGUgKQorICAgIGFkZF9jdXN0b21fdGFyZ2V0KGRvYyAKKyAgICAgICAgQ09NTUFORCAke0RPWFlHRU5fRVhFQ1VUQUJMRX0gJHtDTUFLRV9CSU5BUllfRElSfS9Eb3h5ZmlsZQorICAgICAgICBXT1JLSU5HX0RJUkVDVE9SWSAke0NNQUtFX0JJTkFSWV9ESVJ9CisgICAgKQorZW5kaWYgKERCVVNfRU5BQkxFX0RPWFlHRU5fRE9DUykKKworIworIyBmaW5kIGRvY2Jvb2sgZ2VuZXJhdG9yCisjIAorZmluZF9wcm9ncmFtKE1FSU5QUk9DNF9FWEVDVVRBQkxFIG1laW5wcm9jNCkKKworZmluZF9wcm9ncmFtKFhNTFRPX0VYRUNVVEFCTEUgeG1sdG8pCisKK2ZpbmRfcHJvZ3JhbShDWUdQQVRIX0VYRUNVVEFCTEUgY3lncGF0aCkKKworaWYgKE1FSU5QUk9DNF9FWEVDVVRBQkxFIE9SIFhNTFRPX0VYRUNVVEFCTEUpCisgIE9QVElPTihEQlVTX0VOQUJMRV9YTUxfRE9DUyAiYnVpbGQgWE1MICBkb2N1bWVudGF0aW9uIChyZXF1aXJlcyB4bWx0byBvciBtZWlucHJvYzQpIiBPTikKKyAgQUREX0NVU1RPTV9UQVJHRVQoeG1sZG9jIEFMTCkKK2VuZGlmIChNRUlOUFJPQzRfRVhFQ1VUQUJMRSBPUiBYTUxUT19FWEVDVVRBQkxFKQorCitpZiAoWE1MVE9fRVhFQ1VUQUJMRSkKKwlzZXQgKERPQ0JPT0tfR0VORVJBVE9SX05BTUUgInhtbHRvIiBQQVJFTlRfU0NPUEUpCisJc2V0KERCVVNfWE1MX0RPQ1NfRU5BQkxFRCAxKQorCXNldChNRUlOUFJPQzRfRVhFQ1VUQUJMRSAwKQorCU1FU1NBR0UoU1RBVFVTICJ4bWx0byBkb2Nib29rIGdlbmVyYXRvciBmb3VuZCIpCisJc2V0KFNUWUxFU0hFRVRfTUFOICIke0RPQ0JPT0tYU0xfRElSfS9tYW5wYWdlcy9kb2Nib29rLnhzbCIpCisJc2V0KFNUWUxFU0hFRVRfSFRNTCAiJHtET0NCT09LWFNMX0RJUn0vaHRtbC9kb2Nib29rLnhzbCIpCisKK2Vsc2VpZiAoTUVJTlBST0M0X0VYRUNVVEFCTEUpCisJc2V0KERPQ0JPT0tfR0VORVJBVE9SX05BTUUgIm1laW5wcm9jNCIgUEFSRU5UX1NDT1BFKQorCXNldChEQlVTX1hNTF9ET0NTX0VOQUJMRUQgMSkKKwlpZihXSU4zMikKKwkJZ2V0X2ZpbGVuYW1lX2NvbXBvbmVudChfYSAke01FSU5QUk9DNF9FWEVDVVRBQkxFfSBQQVRIKQorCQlnZXRfZmlsZW5hbWVfY29tcG9uZW50KF9tZWlucHJvY19pbnN0YWxsX3BhdGggJHtfYX0gUEFUSCkKKwkJc2V0KFNUWUxFU0hFRVRfSFRNTCAiJHtfbWVpbnByb2NfaW5zdGFsbF9wYXRofS9zaGFyZS9hcHBzL2tzZ21sdG9vbHMyL2RvY2Jvb2sveHNsL2h0bWwvZG9jYm9vay54c2wiKQorCWVsc2UoV0lOMzIpCisJCXNldChTVFlMRVNIRUVUX0hUTUwgZmlsZTovLy91c3Ivc2hhcmUva2RlNC9hcHBzL2tzZ21sdG9vbHMyL2N1c3RvbWl6YXRpb24va2RlLW5vY2h1bmsueHNsKQorCWVuZGlmKFdJTjMyKQorZW5kaWYgKCkKKworaWYgKERCVVNfRU5BQkxFX1hNTF9ET0NTKQorCittYWNybyAoRE9DQk9PSyBfc291cmNlcyBfZm9ybWF0KQorICBnZXRfZmlsZW5hbWVfY29tcG9uZW50KF9pbmZpbGUgJHtfc291cmNlc30gQUJTT0xVVEUpCisgIGdldF9maWxlbmFtZV9jb21wb25lbnQoX25hbWUgJHtfaW5maWxlfSBOQU1FKQorICBzZXQoX2RlcHMgJHtDTUFLRV9TT1VSQ0VfRElSfS9DTWFrZUxpc3RzLnR4dCAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vQ01ha2VMaXN0cy50eHQpCisKKyAgaWYgKCR7X2Zvcm1hdH0gU1RSRVFVQUwgIm1hbiIpCisgICAgc3RyaW5nKFJFUExBQ0UgIi54bWwiICIiIF9vdXRuYW1lICR7X25hbWV9KQorICAgIHNldChTVFlMRVNIRUVUICR7U1RZTEVTSEVFVF9NQU59KQorICBlbHNlKCkKKyAgICBzdHJpbmcoUkVQTEFDRSAiLnhtbCIgIi5odG1sIiBfb3V0bmFtZSAke19uYW1lfSkKKyAgICBzZXQoU1RZTEVTSEVFVCAke1NUWUxFU0hFRVRfSFRNTH0pCisgIGVuZGlmICgpCisKKyAgc2V0KF9vdXRmaWxlICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS8ke19vdXRuYW1lfSkKKyAgaWYgKEVYSVNUUyAke19zb3VyY2VzfSkKKwkgIGlmIChNRUlOUFJPQzRfRVhFQ1VUQUJMRSkKKwkJICAgIEFERF9DVVNUT01fQ09NTUFORCgKKwkJCU9VVFBVVCAke19vdXRmaWxlfQorCQkJQ09NTUFORCAke01FSU5QUk9DNF9FWEVDVVRBQkxFfSAtLXN0eWxlc2hlZXQgJHtTVFlMRVNIRUVUfSAtbyAke19vdXRmaWxlfSAke19pbmZpbGV9CisJCQlERVBFTkRTICR7X2luZmlsZX0gJHtTVFlMRVNIRUVUfSAke19kZXBzfQorCQkJV09SS0lOR19ESVJFQ1RPUlkgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9CisJCSkKKwkgIGVuZGlmICgpCisJICBpZiAoWE1MVE9fRVhFQ1VUQUJMRSkKKwkJICAgIGlmIChNU1lTKQorCQkJaWYgKENZR1BBVEhfRVhFQ1VUQUJMRSkKKwkJCSAgICBleGVjdXRlX3Byb2Nlc3MoCisJCQkJQ09NTUFORCBjeWdwYXRoICR7X2luZmlsZX0KKwkJCQlPVVRQVVRfVkFSSUFCTEUgX2luZmlsZSkKKwkJCWVsc2UgKCkKKwkJCSAgICBleGVjdXRlX3Byb2Nlc3MoQ09NTUFORCBkaXJuYW1lICR7X2luZmlsZX0gIE9VVFBVVF9WQVJJQUJMRSBfcGF0aCkKKwkJCSAgICBzdHJpbmcoU1RSSVAgJHtfcGF0aH0gX3BhdGgpCisJCQkgICAgZXhlY3V0ZV9wcm9jZXNzKENPTU1BTkQgc2ggLWMgImNkICR7X3BhdGh9OyBwd2QgLVciIE9VVFBVVF9WQVJJQUJMRSBfcGF0aCkKKwkJCSAgICBzdHJpbmcoU1RSSVAgJHtfcGF0aH0gX3BhdGgpCisJCQkgICAgc2V0KF9pbmZpbGUgIiR7X3BhdGh9LyR7X25hbWV9IikKKwkJCWVuZGlmKENZR1BBVEhfRVhFQ1VUQUJMRSkKKwkJICAgIGVuZGlmIChNU1lTKQorCQkgICAgQUREX0NVU1RPTV9DT01NQU5EKAorCQkJT1VUUFVUICR7X291dGZpbGV9CisJCQlDT01NQU5EICR7WE1MVE9fRVhFQ1VUQUJMRX0gLXZ2ICR7X2Zvcm1hdH0gJHtfaW5maWxlfQorCQkJREVQRU5EUyAke19pbmZpbGV9ICR7X2RlcHN9CisJCQlXT1JLSU5HX0RJUkVDVE9SWSAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0KKwkJKQorCSAgZW5kaWYgKCkKKwkgIGlmICgke19mb3JtYXR9IFNUUkVRVUFMICJtYW4iKQorCQkgIGluc3RhbGwoRklMRVMgJHtfb3V0ZmlsZX0gREVTVElOQVRJT04gc2hhcmUvbWFuL21hbjEpCisJICBlbHNlICgpCisJCSAgaW5zdGFsbChGSUxFUyAke19vdXRmaWxlfSBERVNUSU5BVElPTiBzaGFyZS9kb2MvZGJ1cykKKwkgIGVuZGlmICgpCisgIGVsc2UgKCkKKwkgIE1FU1NBR0UoU1RBVFVTICJza2lwcGluZyB4bWwgZG9jIGdlbmVyYXRpbmcgZm9yICR7X2luZmlsZX0sIGZpbGUgbm90IGZvdW5kIikKKyAgZW5kaWYgKCkKKyAgQUREX0NVU1RPTV9UQVJHRVQoJHtfb3V0bmFtZX0gREVQRU5EUyAke19vdXRmaWxlfSkKKyAgQUREX0RFUEVOREVOQ0lFUyh4bWxkb2MgJHtfb3V0bmFtZX0pCitlbmRtYWNybyAoRE9DQk9PSykKKworIyMjIGNvcHkgdGVzdHMgdG8gYnVpbGRkaXIgc28gdGhhdCBnZW5lcmF0ZWQgdGVzdHMgYW5kIHN0YXRpYyB0ZXN0cyAKKyMjIyBhcmUgYWxsIGluIG9uZSBwbGFjZS4KKyMjIyB0b2RvIGhvdyB0byBhZGQgbW9yZSBmaWxldHlwZXMgCitNQUNSTyAoQ09QWURJUiBfc3JjIF90eXBlKQorICAgIEZPUkVBQ0goRklMRV9UWVBFICR7X3R5cGV9KQorICAgIAlGT1JFQUNIKERJUiAke19zcmN9KQorICAgIAkJRklMRShHTE9CIEZJTEVTICIke0NNQUtFX1NPVVJDRV9ESVJ9Ly4uLyR7RElSfS8ke0ZJTEVfVFlQRX0iICkKKyAgICAJCUZJTEUoTUFLRV9ESVJFQ1RPUlkgJHtDTUFLRV9CSU5BUllfRElSfS8ke0RJUn0pCisgICAgCQlGT1JFQUNIKEZJTEUgJHtGSUxFU30pCisgICAgCQkJR0VUX0ZJTEVOQU1FX0NPTVBPTkVOVChGSUxFTkFNRSAke0ZJTEV9IE5BTUUpCisgICAgCQkJU0VUIChUQVJHRVQgJHtDTUFLRV9CSU5BUllfRElSfS8ke0RJUn0vJHtGSUxFTkFNRX0pCisgICAgCQkJY29uZmlndXJlX2ZpbGUoJHtGSUxFfSAke1RBUkdFVH0gQ09QWU9OTFkpCisgICAgCQkJSUYgKENPTkZJR19WRVJCT1NFKQorICAgIAkJCQlNRVNTQUdFKCJGUk9NOiAke0ZJTEV9XG5UTzogJHtUQVJHRVR9XG4iKQorICAgIAkJCUVORElGIChDT05GSUdfVkVSQk9TRSkKKyAgICAJCUVOREZPUkVBQ0goRklMRSkKKyAgICAJRU5ERk9SRUFDSChESVIpCisgICAgRU5ERk9SRUFDSChGSUxFX1RZUEUpCitFTkRNQUNSTyAoQ09QWURJUikKKworQ09QWURJUihkb2MgKi5wbmcpCitDT1BZRElSKGRvYyAqLnN2ZykKKworRE9DQk9PSygke0NNQUtFX1NPVVJDRV9ESVJ9Ly4uL2RvYy9kYnVzLXRlc3QtcGxhbi54bWwgaHRtbC1ub2NodW5rcykKK0RPQ0JPT0soJHtDTUFLRV9TT1VSQ0VfRElSfS8uLi9kb2MvZGJ1cy10dXRvcmlhbC54bWwgaHRtbC1ub2NodW5rcykKK0RPQ0JPT0soJHtDTUFLRV9TT1VSQ0VfRElSfS8uLi9kb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLnhtbCBodG1sLW5vY2h1bmtzKQorRE9DQk9PSygke0NNQUtFX1NPVVJDRV9ESVJ9Ly4uL2RvYy9kYnVzLWZhcS54bWwgaHRtbC1ub2NodW5rcykKK2NvbmZpZ3VyZV9maWxlKCR7Q01BS0VfU09VUkNFX0RJUn0vLi4vZG9jL2RidXMtY2xlYW51cC1zb2NrZXRzLjEueG1sLmluICR7Q01BS0VfQklOQVJZX0RJUn0vZG9jL2RidXMtY2xlYW51cC1zb2NrZXRzLjEueG1sKQorY29uZmlndXJlX2ZpbGUoJHtDTUFLRV9TT1VSQ0VfRElSfS8uLi9kb2MvZGJ1cy1kYWVtb24uMS54bWwuaW4gJHtDTUFLRV9CSU5BUllfRElSfS9kb2MvZGJ1cy1kYWVtb24uMS54bWwpCitjb25maWd1cmVfZmlsZSgke0NNQUtFX1NPVVJDRV9ESVJ9Ly4uL2RvYy9kYnVzLWxhdW5jaC4xLnhtbC5pbiAke0NNQUtFX0JJTkFSWV9ESVJ9L2RvYy9kYnVzLWxhdW5jaC4xLnhtbCkKK2NvbmZpZ3VyZV9maWxlKCR7Q01BS0VfU09VUkNFX0RJUn0vLi4vZG9jL2RidXMtbW9uaXRvci4xLnhtbC5pbiAke0NNQUtFX0JJTkFSWV9ESVJ9L2RvYy9kYnVzLW1vbml0b3IuMS54bWwpCitjb25maWd1cmVfZmlsZSgke0NNQUtFX1NPVVJDRV9ESVJ9Ly4uL2RvYy9kYnVzLXNlbmQuMS54bWwuaW4gJHtDTUFLRV9CSU5BUllfRElSfS9kb2MvZGJ1cy1zZW5kLjEueG1sKQorY29uZmlndXJlX2ZpbGUoJHtDTUFLRV9TT1VSQ0VfRElSfS8uLi9kb2MvZGJ1cy10ZXN0LXRvb2wuMS54bWwuaW4gJHtDTUFLRV9CSU5BUllfRElSfS9kb2MvZGJ1cy10ZXN0LXRvb2wuMS54bWwpCitjb25maWd1cmVfZmlsZSgke0NNQUtFX1NPVVJDRV9ESVJ9Ly4uL2RvYy9kYnVzLXVwZGF0ZS1hY3RpdmF0aW9uLWVudmlyb25tZW50LjEueG1sLmluICR7Q01BS0VfQklOQVJZX0RJUn0vZG9jL2RidXMtdXBkYXRlLWFjdGl2YXRpb24tZW52aXJvbm1lbnQuMS54bWwpCitjb25maWd1cmVfZmlsZSgke0NNQUtFX1NPVVJDRV9ESVJ9Ly4uL2RvYy9kYnVzLXV1aWRnZW4uMS54bWwuaW4gJHtDTUFLRV9CSU5BUllfRElSfS9kb2MvZGJ1cy11dWlkZ2VuLjEueG1sKQorRE9DQk9PSygke0NNQUtFX0JJTkFSWV9ESVJ9L2RvYy9kYnVzLWNsZWFudXAtc29ja2V0cy4xLnhtbCBodG1sLW5vY2h1bmtzKQorRE9DQk9PSygke0NNQUtFX0JJTkFSWV9ESVJ9L2RvYy9kYnVzLWRhZW1vbi4xLnhtbCBodG1sLW5vY2h1bmtzKQorRE9DQk9PSygke0NNQUtFX0JJTkFSWV9ESVJ9L2RvYy9kYnVzLWxhdW5jaC4xLnhtbCBodG1sLW5vY2h1bmtzKQorRE9DQk9PSygke0NNQUtFX0JJTkFSWV9ESVJ9L2RvYy9kYnVzLW1vbml0b3IuMS54bWwgaHRtbC1ub2NodW5rcykKK0RPQ0JPT0soJHtDTUFLRV9CSU5BUllfRElSfS9kb2MvZGJ1cy1zZW5kLjEueG1sIGh0bWwtbm9jaHVua3MpCitET0NCT09LKCR7Q01BS0VfQklOQVJZX0RJUn0vZG9jL2RidXMtdGVzdC10b29sLjEueG1sIGh0bWwtbm9jaHVua3MpCitET0NCT09LKCR7Q01BS0VfQklOQVJZX0RJUn0vZG9jL2RidXMtdXVpZGdlbi4xLnhtbCBodG1sLW5vY2h1bmtzKQorRE9DQk9PSygke0NNQUtFX0JJTkFSWV9ESVJ9L2RvYy9kYnVzLXVwZGF0ZS1hY3RpdmF0aW9uLWVudmlyb25tZW50LjEueG1sIGh0bWwtbm9jaHVua3MpCitpZiAoVU5JWCkKKyAgRE9DQk9PSygke0NNQUtFX0JJTkFSWV9ESVJ9L2RvYy9kYnVzLWRhZW1vbi4xLnhtbCBtYW4pCisgIERPQ0JPT0soJHtDTUFLRV9CSU5BUllfRElSfS9kb2MvZGJ1cy1tb25pdG9yLjEueG1sIG1hbikKKyAgRE9DQk9PSygke0NNQUtFX0JJTkFSWV9ESVJ9L2RvYy9kYnVzLXNlbmQuMS54bWwgbWFuKQorICBET0NCT09LKCR7Q01BS0VfQklOQVJZX0RJUn0vZG9jL2RidXMtdGVzdC10b29sLjEueG1sIG1hbikKKyAgRE9DQk9PSygke0NNQUtFX0JJTkFSWV9ESVJ9L2RvYy9kYnVzLWxhdW5jaC4xLnhtbCBtYW4pCisgIERPQ0JPT0soJHtDTUFLRV9CSU5BUllfRElSfS9kb2MvZGJ1cy11dWlkZ2VuLjEueG1sIG1hbikKKyAgRE9DQk9PSygke0NNQUtFX0JJTkFSWV9ESVJ9L2RvYy9kYnVzLWNsZWFudXAtc29ja2V0cy4xLnhtbCBtYW4pCisgIERPQ0JPT0soJHtDTUFLRV9CSU5BUllfRElSfS9kb2MvZGJ1cy11cGRhdGUtYWN0aXZhdGlvbi1lbnZpcm9ubWVudC4xLnhtbCBtYW4pCitlbmRpZigpCisjCisjIGhhbmRsZSBodG1sIGluZGV4IGZpbGUKKyMKK2NvbmZpZ3VyZV9maWxlKCR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9pbmRleC5odG1sLmNtYWtlICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9pbmRleC5odG1sICkKK2luc3RhbGwoRklMRVMgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2luZGV4Lmh0bWwgREVTVElOQVRJT04gc2hhcmUvZG9jL2RidXMpCisKK3NldCAoRVhUUkFfRElTVCAJCisJJHtDTUFLRV9TT1VSQ0VfRElSfS8uLi9kb2MvYnVzY29uZmlnLmR0ZAkJCQorCSR7Q01BS0VfU09VUkNFX0RJUn0vLi4vZG9jL2ludHJvc3BlY3QuZHRkCQkJCisJJHtDTUFLRV9TT1VSQ0VfRElSfS8uLi9kb2MvaW50cm9zcGVjdC54c2wKKykKKworaW5zdGFsbChGSUxFUyAke0VYVFJBX0RJU1R9IERFU1RJTkFUSU9OIHNoYXJlL2RvYy9kYnVzKQorCitlbmRpZihEQlVTX0VOQUJMRV9YTUxfRE9DUykKZGlmZiAtLWdpdCBhL2NtYWtlL2RvYy9pbmRleC5odG1sLmNtYWtlIGIvY21ha2UvZG9jL2luZGV4Lmh0bWwuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdkZDY2MQotLS0gL2Rldi9udWxsCisrKyBiL2NtYWtlL2RvYy9pbmRleC5odG1sLmNtYWtlCkBAIC0wLDAgKzEsNTUgQEAKKzxodG1sPgorPGhlYWQ+Cis8dGl0bGU+RC1CdXMgRG9jdW1lbnRhdGlvbiBJbmRleDwvdGl0bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKzxoMT5ELUJ1cyBEb2N1bWVudGF0aW9uIEluZGV4PC9oMT4KKzxwPlZlcnNpb24gQERCVVNfVkVSU0lPTl9TVFJJTkdAPC9wPgorCis8dGFibGU+CisgPHRyPgorICA8dGggd2lkdGg9MTAlPgorICA8L3RoPgorICA8dGggd2lkdGg9MzAlIGFsaWduPWxlZnQ+CisgICBnZW5lcmljIGRvY3VtZW50YXRpb24KKyAgPC90aD4KKyAgPHRoIHdpZHRoPTMwJSBhbGlnbj1sZWZ0PgorYXBwbGljYXRpb24gbWFudWFscworICA8L3RoPgorIDwvdHI+CisgPHRyPgorICA8dGQgdmFsaWduPXRvcD4KKyAgPC90ZD4KKyAgPHRkIHZhbGlnbj10b3A+Cis8YSBocmVmPSJodHRwOi8vZGJ1cy5mcmVlZGVza3RvcC5vcmciPkQtQnVzIFdlYnNpdGU8L2E+CisgIDxicj4KKyAgPGJyPgorPGEgaHJlZj0iZGJ1cy10dXRvcmlhbC5odG1sIj5ELUJ1cyBUdXRvcmlhbDwvYT4KKyAgPGJyPgorICA8YnI+Cis8YSBocmVmPSJkYnVzLXNwZWNpZmljYXRpb24uaHRtbCI+RC1CdXMgU3BlY2lmaWNhdGlvbjwvYT4KKyAgIDxicj4KKyAgIDxicj4KKzxhIGhyZWY9ImRidXMtZmFxLmh0bWwiPkQtQnVzIEZBUTwvYT4KKyAgIDxicj4KKyAgIDxicj4KKzxhIGhyZWY9ImRidXMtdGVzdC1wbGFuLmh0bWwiPkQtQnVzIFRlc3QgUGxhbjwvYT4KKyAgIDxicj4KKyAgIDxicj4KKyAgPC90ZD4KKyAgPHRkICB2YWxpZ249dG9wPgorPGEgaHJlZj0iZGJ1cy1kYWVtb24uaHRtbCI+RC1CdXMgRGFlbW9uIG1hbnVhbDwvYT4KKyAgIDxicj4KKyAgIDxicj4KKzxhIGhyZWY9ImRidXMtbGF1bmNoLmh0bWwiPkQtQnVzIGxhdW5jaCBtYW51YWw8L2E+CisgICA8YnI+CisgICA8YnI+Cis8YSBocmVmPSJkYnVzLXNlbmQuaHRtbCI+RC1CdXMgc2VuZCB0b29sIG1hbnVhbDwvYT4KKyAgIDxicj4KKyAgIDxicj4KKzxhIGhyZWY9ImRidXMtbW9uaXRvci5odG1sIj5ELUJ1cyBtb25pdG9yIG1hbnVhbDwvYT4KKyAgPC90ZD4KKyA8L3RyPgorPC90YWJsZT4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2NtYWtlL2k2ODYtdzY0LW1pbmd3MzIuY21ha2UgYi9jbWFrZS9pNjg2LXc2NC1taW5ndzMyLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiZTRlNzgKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFrZS9pNjg2LXc2NC1taW5ndzMyLmNtYWtlCkBAIC0wLDAgKzEsMjAgQEAKKyMgVG9vbGNoYWluIGZvciBtaW5ndy13NjQgMzItYml0IGNvbXBpbGVycywgYXMgc2hpcHBlZCBpbiBEZWJpYW4vVWJ1bnR1LgorCitzZXQoR05VX0hPU1QgaTY4Ni13NjQtbWluZ3czMikKK3NldChDTUFLRV9TWVNURU1fUFJPQ0VTU09SICJpNjg2IikKKworc2V0KENPTVBJTEVSX1BSRUZJWCAiJHtHTlVfSE9TVH0tIikKKworc2V0KENNQUtFX1NZU1RFTV9OQU1FICJXaW5kb3dzIikKK3NldChDTUFLRV9DUk9TU0NPTVBJTElORyBUUlVFKQorc2V0KFdJTjMyIFRSVUUpCitzZXQoTUlOR1cgVFJVRSkKKworaW5jbHVkZShDTWFrZUZvcmNlQ29tcGlsZXIpCitjbWFrZV9mb3JjZV9jX2NvbXBpbGVyKCR7Q09NUElMRVJfUFJFRklYfWdjYyBHTlUpCitjbWFrZV9mb3JjZV9jeHhfY29tcGlsZXIoJHtDT01QSUxFUl9QUkVGSVh9ZysrIEdOVSkKK3NldChDTUFLRV9SQ19DT01QSUxFUiAke0NPTVBJTEVSX1BSRUZJWH13aW5kcmVzKQorCitzZXQoQ01BS0VfRklORF9ST09UX1BBVEhfTU9ERV9QUk9HUkFNIE5FVkVSKQorc2V0KENNQUtFX0ZJTkRfUk9PVF9QQVRIX01PREVfTElCUkFSWSBPTkxZKQorc2V0KENNQUtFX0ZJTkRfUk9PVF9QQVRIX01PREVfSU5DTFVERSBPTkxZKQpkaWZmIC0tZ2l0IGEvY21ha2UvbW9kdWxlcy9DT1BZSU5HLUNNQUtFLVNDUklQVFMgYi9jbWFrZS9tb2R1bGVzL0NPUFlJTkctQ01BS0UtU0NSSVBUUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2I2YjcxCi0tLSAvZGV2L251bGwKKysrIGIvY21ha2UvbW9kdWxlcy9DT1BZSU5HLUNNQUtFLVNDUklQVFMKQEAgLTAsMCArMSwyMiBAQAorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cittb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKK2FyZSBtZXQ6CisKKzEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGNvcHlyaWdodAorICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKzMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCitJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCitPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCitOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCitEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKK1RIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyhJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KZGlmZiAtLWdpdCBhL2NtYWtlL21vZHVsZXMvQ1BhY2tJbnN0YWxsQ29uZmlnLmNtYWtlIGIvY21ha2UvbW9kdWxlcy9DUGFja0luc3RhbGxDb25maWcuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZlOGZiNgotLS0gL2Rldi9udWxsCisrKyBiL2NtYWtlL21vZHVsZXMvQ1BhY2tJbnN0YWxsQ29uZmlnLmNtYWtlCkBAIC0wLDAgKzEsMzcgQEAKKworaWYgKERCVVNfSU5TVEFMTF9TWVNURU1fTElCUykKKwlpZiAoTUlOR1cpCisJZWxzZSAoTUlOR1cpCisJCUlOQ0xVREUoSW5zdGFsbFJlcXVpcmVkU3lzdGVtTGlicmFyaWVzKQorCWVuZGlmIChNSU5HVykKKwlpbnN0YWxsKEZJTEVTICR7TElCRVhQQVRfTElCUkFSSUVTfSBERVNUSU5BVElPTiBiaW4pCitlbmRpZiAoREJVU19JTlNUQUxMX1NZU1RFTV9MSUJTKQorCitTRVQoQ1BBQ0tfUEFDS0FHRV9ERVNDUklQVElPTl9TVU1NQVJZICJELUJVUyBGb3IgV2luZG93cyIpCitTRVQoQ1BBQ0tfUEFDS0FHRV9WRU5ET1IgIkQtQlVTIFdpbmRvd3MgVGVhbSIpCitTRVQoQ1BBQ0tfUEFDS0FHRV9ERVNDUklQVElPTl9GSUxFICIke0NNQUtFX1NPVVJDRV9ESVJ9Ly4uL1JFQURNRSIpCitTRVQoQ1BBQ0tfUkVTT1VSQ0VfRklMRV9MSUNFTlNFICIke0NNQUtFX1NPVVJDRV9ESVJ9Ly4uL0NPUFlJTkciKQorIyBkdXBsaWNhdGVkIGZyb20gVkVSU0lPTgorU0VUKENQQUNLX1BBQ0tBR0VfVkVSU0lPTl9NQUpPUiAke1ZFUlNJT05fTUFKT1J9KQorU0VUKENQQUNLX1BBQ0tBR0VfVkVSU0lPTl9NSU5PUiAke1ZFUlNJT05fTUlOT1J9KQorU0VUKENQQUNLX1BBQ0tBR0VfVkVSU0lPTl9QQVRDSCAke1ZFUlNJT05fUEFUQ0h9KQorI1NFVChDUEFDS19QQUNLQUdFX0lOU1RBTExfRElSRUNUT1JZICJkYnVzICR7Q01ha2VfVkVSU0lPTl9NQUpPUn0uJHtDTWFrZV9WRVJTSU9OX01JTk9SfSIpCitTRVQoQ1BBQ0tfUEFDS0FHRV9JTlNUQUxMX0RJUkVDVE9SWSAiZGJ1cyIpCitJRihXSU4zMiBBTkQgTk9UIFVOSVgpCisgIFNFVChDUEFDS19HRU5FUkFUT1IgTlNJUyBaSVApICAgICAjIGNhbiBiZSBOU0lTLCBTVEdaLCBUQloyLCBUR1osIFRaIGFuZCBaSVAKKyAgU0VUKENQQUNLX05TSVNfQ09NUFJFU1NPUiAiL1NPTElEIGx6bWEiKQorICAjIFRoZXJlIGlzIGEgYnVnIGluIE5TSSB0aGF0IGRvZXMgbm90IGhhbmRsZSBmdWxsIHVuaXggcGF0aHMgcHJvcGVybHkuIE1ha2UKKyAgIyBzdXJlIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBzZXQgb2YgZm91ciAoNCkgYmFja2xhc3NoZXMuCisjIFNFVChDUEFDS19QQUNLQUdFX0lDT04gIiR7Q01ha2VfU09VUkNFX0RJUn0vVXRpbGl0aWVzL1JlbGVhc2VcXFxcSW5zdGFsbEljb24uYm1wIikKKyAgU0VUKENQQUNLX05TSVNfSU5TVEFMTEVEX0lDT05fTkFNRSAiYmluXFxcXGRidXMtbGF1bmNoLmJhdCIpCisgIFNFVChDUEFDS19OU0lTX0RJU1BMQVlfTkFNRSAiRC1CdXMgZm9yIFdpbmRvd3MiKQorICBTRVQoQ1BBQ0tfTlNJU19IRUxQX0xJTksgImh0dHA6XFxcXFxcXFxzb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvd2luZGJ1cyIpCisgIFNFVChDUEFDS19OU0lTX1VSTF9JTkZPX0FCT1VUICJodHRwOlxcXFxcXFxcc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL3dpbmRidXMiKQorICBTRVQoQ1BBQ0tfTlNJU19DT05UQUNUICJtZUBteS1wZXJzb25hbC1ob21lLXBhZ2UuY29tIikKKyAgU0VUKENQQUNLX05TSVNfTU9ESUZZX1BBVEggT04pCitFTFNFKFdJTjMyIEFORCBOT1QgVU5JWCkKKyAgU0VUKENQQUNLX1NUUklQX0ZJTEVTICJiaW4vTXlFeGVjdXRhYmxlIikKKyAgU0VUKENQQUNLX1NPVVJDRV9TVFJJUF9GSUxFUyAiIikKK0VORElGKFdJTjMyIEFORCBOT1QgVU5JWCkKK1NFVChDUEFDS19QQUNLQUdFX0VYRUNVVEFCTEVTICJkYnVzLWxhdW5jaCIgIkQtQnVzIERhZW1vbiIpCitJTkNMVURFKENQYWNrKQpkaWZmIC0tZ2l0IGEvY21ha2UvbW9kdWxlcy9DaGVja1Byb3RvdHlwZUV4aXN0cy5jbWFrZSBiL2NtYWtlL21vZHVsZXMvQ2hlY2tQcm90b3R5cGVFeGlzdHMuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGEzMTlmMQotLS0gL2Rldi9udWxsCisrKyBiL2NtYWtlL21vZHVsZXMvQ2hlY2tQcm90b3R5cGVFeGlzdHMuY21ha2UKQEAgLTAsMCArMSwzNSBAQAorIyAtIENoZWNrIGlmIHRoZSBwcm90b3R5cGUgZm9yIGEgZnVuY3Rpb24gZXhpc3RzLgorIyBDSEVDS19QUk9UT1RZUEVfRVhJU1RTIChGVU5DVElPTiBIRUFERVIgVkFSSUFCTEUpCisjCisjICBGVU5DVElPTiAtIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiB5b3UgYXJlIGxvb2tpbmcgZm9yCisjICBIRUFERVIgLSB0aGUgaGVhZGVyKHMpIHdoZXJlIHRoZSBwcm90b3R5cGUgc2hvdWxkIGJlIGRlY2xhcmVkCisjICBWQVJJQUJMRSAtIHZhcmlhYmxlIHRvIHN0b3JlIHRoZSByZXN1bHQKKyMKKyMgVGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgbWF5IGJlIHNldCBiZWZvcmUgY2FsbGluZyB0aGlzIG1hY3JvIHRvCisjIG1vZGlmeSB0aGUgd2F5IHRoZSBjaGVjayBpcyBydW46CisjCisjICBDTUFLRV9SRVFVSVJFRF9GTEFHUyA9IHN0cmluZyBvZiBjb21waWxlIGNvbW1hbmQgbGluZSBmbGFncworIyAgQ01BS0VfUkVRVUlSRURfREVGSU5JVElPTlMgPSBsaXN0IG9mIG1hY3JvcyB0byBkZWZpbmUgKC1ERk9PPWJhcikKKyMgIENNQUtFX1JFUVVJUkVEX0lOQ0xVREVTID0gbGlzdCBvZiBpbmNsdWRlIGRpcmVjdG9yaWVzCisKK0lOQ0xVREUoQ2hlY2tDWFhTb3VyY2VDb21waWxlcykKKworTUFDUk8gKENIRUNLX1BST1RPVFlQRV9FWElTVFMgX1NZTUJPTCBfSEVBREVSIF9SRVNVTFQpCisgICBTRVQoX0lOQ0xVREVfRklMRVMpCisgICBGT1JFQUNIIChpdCAke19IRUFERVJ9KQorICAgICAgU0VUKF9JTkNMVURFX0ZJTEVTICIke19JTkNMVURFX0ZJTEVTfSNpbmNsdWRlIDwke2l0fT5cbiIpCisgICBFTkRGT1JFQUNIIChpdCkKKworICAgU0VUKF9DSEVDS19QUk9UT19FWElTVFNfU09VUkNFX0NPREUgIgorJHtfSU5DTFVERV9GSUxFU30KK2ludCBtYWluKCkKK3sKKyNpZm5kZWYgJHtfU1lNQk9MfQorICAgaW50IGkgPSBzaXplb2YoJiR7X1NZTUJPTH0pOworI2VuZGlmCisgIHJldHVybiAwOworfQorIikKKyAgIENIRUNLX0NYWF9TT1VSQ0VfQ09NUElMRVMoIiR7X0NIRUNLX1BST1RPX0VYSVNUU19TT1VSQ0VfQ09ERX0iICR7X1JFU1VMVH0pCitFTkRNQUNSTyAoQ0hFQ0tfUFJPVE9UWVBFX0VYSVNUUyBfU1lNQk9MIF9IRUFERVIgX1JFU1VMVCkKKwpkaWZmIC0tZ2l0IGEvY21ha2UvbW9kdWxlcy9DaGVja1N0cnVjdE1lbWJlci5jbWFrZSBiL2NtYWtlL21vZHVsZXMvQ2hlY2tTdHJ1Y3RNZW1iZXIuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ1ZDM0NgotLS0gL2Rldi9udWxsCisrKyBiL2NtYWtlL21vZHVsZXMvQ2hlY2tTdHJ1Y3RNZW1iZXIuY21ha2UKQEAgLTAsMCArMSwzNiBAQAorIyAtIENoZWNrIGlmIHRoZSBnaXZlbiBzdHJ1Y3Qgb3IgY2xhc3MgaGFzIHRoZSBzcGVjaWZpZWQgbWVtYmVyIHZhcmlhYmxlCisjIENIRUNLX1NUUlVDVF9NRU1CRVIgKFNUUlVDVCBNRU1CRVIgSEVBREVSIFZBUklBQkxFKQorIworIyAgU1RSVUNUIC0gdGhlIG5hbWUgb2YgdGhlIHN0cnVjdCBvciBjbGFzcyB5b3UgYXJlIGludGVyZXN0ZWQgaW4KKyMgIE1FTUJFUiAtIHRoZSBtZW1iZXIgd2hpY2ggZXhpc3RlbmNlIHlvdSB3YW50IHRvIGNoZWNrCisjICBIRUFERVIgLSB0aGUgaGVhZGVyKHMpIHdoZXJlIHRoZSBwcm90b3R5cGUgc2hvdWxkIGJlIGRlY2xhcmVkCisjICBWQVJJQUJMRSAtIHZhcmlhYmxlIHRvIHN0b3JlIHRoZSByZXN1bHQKKyMKKyMgVGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgbWF5IGJlIHNldCBiZWZvcmUgY2FsbGluZyB0aGlzIG1hY3JvIHRvCisjIG1vZGlmeSB0aGUgd2F5IHRoZSBjaGVjayBpcyBydW46CisjCisjICBDTUFLRV9SRVFVSVJFRF9GTEFHUyA9IHN0cmluZyBvZiBjb21waWxlIGNvbW1hbmQgbGluZSBmbGFncworIyAgQ01BS0VfUkVRVUlSRURfREVGSU5JVElPTlMgPSBsaXN0IG9mIG1hY3JvcyB0byBkZWZpbmUgKC1ERk9PPWJhcikKKyMgIENNQUtFX1JFUVVJUkVEX0lOQ0xVREVTID0gbGlzdCBvZiBpbmNsdWRlIGRpcmVjdG9yaWVzCisKK0lOQ0xVREUoQ2hlY2tDWFhTb3VyY2VDb21waWxlcykKKworTUFDUk8gKENIRUNLX1NUUlVDVF9NRU1CRVIgX1NUUlVDVCBfTUVNQkVSIF9IRUFERVIgX1JFU1VMVCkKKyAgIFNFVChfSU5DTFVERV9GSUxFUykKKyAgIEZPUkVBQ0ggKGl0ICR7X0hFQURFUn0pCisgICAgICBTRVQoX0lOQ0xVREVfRklMRVMgIiR7X0lOQ0xVREVfRklMRVN9I2luY2x1ZGUgPCR7aXR9PlxuIikKKyAgIEVOREZPUkVBQ0ggKGl0KQorCisgICBTRVQoX0NIRUNLX1NUUlVDVF9NRU1CRVJfU09VUkNFX0NPREUgIgorJHtfSU5DTFVERV9GSUxFU30KK2ludCBtYWluKCkKK3sKKyAgICR7X1NUUlVDVH0qIHRtcDsKKyAgIHRtcC0+JHtfTUVNQkVSfTsKKyAgcmV0dXJuIDA7Cit9CisiKQorICAgQ0hFQ0tfQ1hYX1NPVVJDRV9DT01QSUxFUygiJHtfQ0hFQ0tfU1RSVUNUX01FTUJFUl9TT1VSQ0VfQ09ERX0iICR7X1JFU1VMVH0pCisKK0VORE1BQ1JPIChDSEVDS19TVFJVQ1RfTUVNQkVSKQorCmRpZmYgLS1naXQgYS9jbWFrZS9tb2R1bGVzL0ZpbmREb3h5Z2VuLmNtYWtlIGIvY21ha2UvbW9kdWxlcy9GaW5kRG94eWdlbi5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzY3OTAxCi0tLSAvZGV2L251bGwKKysrIGIvY21ha2UvbW9kdWxlcy9GaW5kRG94eWdlbi5jbWFrZQpAQCAtMCwwICsxLDMgQEAKKworZmluZF9wcm9ncmFtKERPWFlHRU5fRVhFQ1VUQUJMRSBOQU1FUyBkb3h5Z2VuIERPQyAiZG94eWdlbiBleGVjdXRhYmxlIikKK21hcmtfYXNfYWR2YW5jZWQoRE9YWUdFTl9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvY21ha2UvbW9kdWxlcy9GaW5kR0xpYjIuY21ha2UgYi9jbWFrZS9tb2R1bGVzL0ZpbmRHTGliMi5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzJiMmEwCi0tLSAvZGV2L251bGwKKysrIGIvY21ha2UvbW9kdWxlcy9GaW5kR0xpYjIuY21ha2UKQEAgLTAsMCArMSw2MCBAQAorIyAtIFRyeSB0byBmaW5kIHRoZSBHTElCMiBsaWJyYXJpZXMKKyMgT25jZSBkb25lIHRoaXMgd2lsbCBkZWZpbmUKKyMKKyMgIEdMSUIyX0ZPVU5EIC0gc3lzdGVtIGhhcyBnbGliMgorIyAgR0xJQjJfSU5DTFVERV9ESVIgLSB0aGUgZ2xpYjIgaW5jbHVkZSBkaXJlY3RvcnkKKyMgIEdMSUIyX0xJQlJBUklFUyAtIGdsaWIyIGxpYnJhcnkKKworIyBDb3B5cmlnaHQgKGMpIDIwMDggTGF1cmVudCBNb250ZWwsIDxtb250ZWxAa2RlLm9yZz4KKyMgQ29weXJpZ2h0IChjKSAyMDEzIFJhbGYgSGFiYWNrZXIsIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaXMgYWxsb3dlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mIHRoZSBCU0QgbGljZW5zZS4KKyMgRm9yIGRldGFpbHMgc2VlIHRoZSBhY2NvbXBhbnlpbmcgQ09QWUlORy1DTUFLRS1TQ1JJUFRTIGZpbGUuCisKKworaWYoR0xJQjJfSU5DTFVERV9ESVIgQU5EIEdMSUIyX0xJQlJBUklFUykKKyAgICAjIEFscmVhZHkgaW4gY2FjaGUsIGJlIHNpbGVudAorICAgIHNldChHTElCMl9GSU5EX1FVSUVUTFkgVFJVRSkKK2VuZGlmKEdMSUIyX0lOQ0xVREVfRElSIEFORCBHTElCMl9MSUJSQVJJRVMpCisKK2lmIChOT1QgV0lOMzIpCisgICAgZmluZF9wYWNrYWdlKFBrZ0NvbmZpZykKKyAgICBwa2dfY2hlY2tfbW9kdWxlcyhQQ19MaWJHTElCMiBRVUlFVCBnbGliLTIuMCkKK2VuZGlmKCkKKworZmluZF9wYXRoKEdMSUIyX01BSU5fSU5DTFVERV9ESVIKKyAgICAgICAgICBOQU1FUyBnbGliLmgKKyAgICAgICAgICBISU5UUyAke1BDX0xpYkdMSUIyX0lOQ0xVREVESVJ9CisgICAgICAgICAgUEFUSF9TVUZGSVhFUyBnbGliLTIuMCkKKworZmluZF9saWJyYXJ5KEdMSUIyX0xJQlJBUlkKKyAgICAgICAgICAgICBOQU1FUyBnbGliLTIuMAorICAgICAgICAgICAgIEhJTlRTICR7UENfTGliR0xJQjJfTElCRElSfQorKQorCitmaW5kX2xpYnJhcnkoR0lPMl9MSUJSQVJZCisgICAgICAgICAgICAgTkFNRVMgZ2lvLTIuMAorICAgICAgICAgICAgIEhJTlRTICR7UENfTGliR0xJQjJfTElCRElSfQorKQorCitzZXQoR0xJQjJfTElCUkFSSUVTICR7R0xJQjJfTElCUkFSWX0gJHtHSU8yX0xJQlJBUll9KQorCisjIHNlYXJjaCB0aGUgZ2xpYmNvbmZpZy5oIGluY2x1ZGUgZGlyIHVuZGVyIHRoZSBzYW1lIHJvb3Qgd2hlcmUgdGhlIGxpYnJhcnkgaXMgZm91bmQKK2dldF9maWxlbmFtZV9jb21wb25lbnQoZ2xpYjJMaWJEaXIgIiR7R0xJQjJfTElCUkFSWX0iIFBBVEgpCisKK2ZpbmRfcGF0aChHTElCMl9JTlRFUk5BTF9JTkNMVURFX0RJUiBnbGliY29uZmlnLmgKKyAgICAgICAgICBQQVRIX1NVRkZJWEVTIGdsaWItMi4wL2luY2x1ZGUKKyAgICAgICAgICBISU5UUyAke1BDX0xpYkdMSUIyX0lOQ0xVREVESVJ9ICIke2dsaWIyTGliRGlyfSIgJHtDTUFLRV9TWVNURU1fTElCUkFSWV9QQVRIfSkKKworc2V0KEdMSUIyX0lOQ0xVREVfRElSICIke0dMSUIyX01BSU5fSU5DTFVERV9ESVJ9IikKKworIyBub3Qgc3VyZSBpZiB0aGlzIGluY2x1ZGUgZGlyIGlzIG9wdGlvbmFsIG9yIHJlcXVpcmVkCisjIGZvciBub3cgaXQgaXMgb3B0aW9uYWwKK2lmKEdMSUIyX0lOVEVSTkFMX0lOQ0xVREVfRElSKQorICBzZXQoR0xJQjJfSU5DTFVERV9ESVIgJHtHTElCMl9JTkNMVURFX0RJUn0gIiR7R0xJQjJfSU5URVJOQUxfSU5DTFVERV9ESVJ9IikKK2VuZGlmKEdMSUIyX0lOVEVSTkFMX0lOQ0xVREVfRElSKQorCitpbmNsdWRlKEZpbmRQYWNrYWdlSGFuZGxlU3RhbmRhcmRBcmdzKQorZmluZF9wYWNrYWdlX2hhbmRsZV9zdGFuZGFyZF9hcmdzKEdMSUIyICBERUZBVUxUX01TRyAgR0xJQjJfTElCUkFSSUVTIEdMSUIyX01BSU5fSU5DTFVERV9ESVIpCisKK21hcmtfYXNfYWR2YW5jZWQoR0xJQjJfSU5DTFVERV9ESVIgR0xJQjJfTElCUkFSSUVTKQpkaWZmIC0tZ2l0IGEvY21ha2UvbW9kdWxlcy9GaW5kR09iamVjdC5jbWFrZSBiL2NtYWtlL21vZHVsZXMvRmluZEdPYmplY3QuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWYwYzlmNwotLS0gL2Rldi9udWxsCisrKyBiL2NtYWtlL21vZHVsZXMvRmluZEdPYmplY3QuY21ha2UKQEAgLTAsMCArMSw1MiBAQAorIyAtIFRyeSB0byBmaW5kIEdPYmplY3QKKyMgT25jZSBkb25lIHRoaXMgd2lsbCBkZWZpbmUKKyMKKyMgIEdPQkpFQ1RfRk9VTkQgLSBzeXN0ZW0gaGFzIEdPYmplY3QKKyMgIEdPQkpFQ1RfSU5DTFVERV9ESVIgLSB0aGUgR09iamVjdCBpbmNsdWRlIGRpcmVjdG9yeQorIyAgR09CSkVDVF9MSUJSQVJJRVMgLSB0aGUgbGlicmFyaWVzIG5lZWRlZCB0byB1c2UgR09iamVjdAorIyAgR09CSkVDVF9ERUZJTklUSU9OUyAtIENvbXBpbGVyIHN3aXRjaGVzIHJlcXVpcmVkIGZvciB1c2luZyBHT2JqZWN0CisKKyMgQ29weXJpZ2h0IChjKSAyMDExLCBSYXBoYWVsIEt1Ym8gZGEgQ29zdGEgPGt1Yml0b0BnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAwNiwgVGltIEJlYXVsZW4gPHRic2NvcGVAZ21haWwuY29tPgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlzIGFsbG93ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZiB0aGUgQlNEIGxpY2Vuc2UuCisjIEZvciBkZXRhaWxzIHNlZSB0aGUgYWNjb21wYW55aW5nIENPUFlJTkctQ01BS0UtU0NSSVBUUyBmaWxlLgorCitGSU5EX1BBQ0tBR0UoUGtnQ29uZmlnKQorUEtHX0NIRUNLX01PRFVMRVMoUENfR09CSkVDVCBnb2JqZWN0LTIuMCkKK1NFVChHT0JKRUNUX0RFRklOSVRJT05TICR7UENfR09CSkVDVF9DRkxBR1NfT1RIRVJ9KQorCitGSU5EX1BBVEgoR09CSkVDVF9JTkNMVURFX0RJUiBnb2JqZWN0LmgKKyAgIEhJTlRTCisgICAke1BDX0dPQkpFQ1RfSU5DTFVERURJUn0KKyAgICR7UENfR09CSkVDVF9JTkNMVURFX0RJUlN9CisgICBQQVRIX1NVRkZJWEVTIGdsaWItMi4wL2dvYmplY3QvCisgICApCisKK0ZJTkRfTElCUkFSWShfR09iamVjdExpYnMgTkFNRVMgZ29iamVjdC0yLjAKKyAgIEhJTlRTCisgICAke1BDX0dPQkpFQ1RfTElCRElSfQorICAgJHtQQ19HT0JKRUNUX0xJQlJBUllfRElSU30KKyAgICkKK0ZJTkRfTElCUkFSWShfR01vZHVsZUxpYnMgTkFNRVMgZ21vZHVsZS0yLjAKKyAgIEhJTlRTCisgICAke1BDX0dPQkpFQ1RfTElCRElSfQorICAgJHtQQ19HT0JKRUNUX0xJQlJBUllfRElSU30KKyAgICkKK0ZJTkRfTElCUkFSWShfR1RocmVhZExpYnMgTkFNRVMgZ3RocmVhZC0yLjAKKyAgIEhJTlRTCisgICAke1BDX0dPQkpFQ1RfTElCRElSfQorICAgJHtQQ19HT0JKRUNUX0xJQlJBUllfRElSU30KKyAgICkKK0ZJTkRfTElCUkFSWShfR0xpYnMgTkFNRVMgZ2xpYi0yLjAKKyAgIEhJTlRTCisgICAke1BDX0dPQkpFQ1RfTElCRElSfQorICAgJHtQQ19HT0JKRUNUX0xJQlJBUllfRElSU30KKyAgICkKKworU0VUKCBHT0JKRUNUX0xJQlJBUklFUyAke19HT2JqZWN0TGlic30gJHtfR01vZHVsZUxpYnN9ICR7X0dUaHJlYWRMaWJzfSAke19HTGlic30gKQorCitJTkNMVURFKEZpbmRQYWNrYWdlSGFuZGxlU3RhbmRhcmRBcmdzKQorRklORF9QQUNLQUdFX0hBTkRMRV9TVEFOREFSRF9BUkdTKEdPQkpFQ1QgREVGQVVMVF9NU0cgR09CSkVDVF9MSUJSQVJJRVMgR09CSkVDVF9JTkNMVURFX0RJUikKKworTUFSS19BU19BRFZBTkNFRChHT0JKRUNUX0lOQ0xVREVfRElSIF9HT2JqZWN0TGlicyBfR01vZHVsZUxpYnMgX0dUaHJlYWRMaWJzIF9HTGlicykKZGlmZiAtLWdpdCBhL2NtYWtlL21vZHVsZXMvRmluZExpYkljb252LmNtYWtlIGIvY21ha2UvbW9kdWxlcy9GaW5kTGliSWNvbnYuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFjNjM0NAotLS0gL2Rldi9udWxsCisrKyBiL2NtYWtlL21vZHVsZXMvRmluZExpYkljb252LmNtYWtlCkBAIC0wLDAgKzEsNTIgQEAKKyMgLSBUcnkgdG8gZmluZCBMaWJJY29udgorIyBPbmNlIGRvbmUgdGhpcyB3aWxsIGRlZmluZQorIworIyAgTElCSUNPTlZfRk9VTkQgLSBzeXN0ZW0gaGFzIExpYkljb252CisjICBMSUJJQ09OVl9JTkNMVURFX0RJUiAtIHRoZSBMaWJJY29udiBpbmNsdWRlIGRpcmVjdG9yeQorIyAgTElCSUNPTlZfTElCUkFSSUVTIC0gdGhlIGxpYnJhcmllcyBuZWVkZWQgdG8gdXNlIExpYkljb252CisjICBMSUJJQ09OVl9ERUZJTklUSU9OUyAtIENvbXBpbGVyIHN3aXRjaGVzIHJlcXVpcmVkIGZvciB1c2luZyBMaWJJY29udgorCitpZiAoTElCSUNPTlZfSU5DTFVERV9ESVIgQU5EIExJQklDT05WX0xJQlJBUklFUykKKworICAgICMgaW4gY2FjaGUgYWxyZWFkeQorICAgIFNFVChMSUJJQ09OVl9GT1VORCBUUlVFKQorCitlbHNlIChMSUJJQ09OVl9JTkNMVURFX0RJUiBBTkQgTElCSUNPTlZfTElCUkFSSUVTKQorCisgICAgSUYgKE5PVCBXSU4zMikKKyAgICAgICAgTUVTU0FHRShGQVRBTF9FUlJPUiAiUGxlYXNlIHNldCB0aGlzIHRvIHRoZSBjb3JyZWN0IHZhbHVlcyEiKQorICAgICAgICAjIHVzZSBwa2ctY29uZmlnIHRvIGdldCB0aGUgZGlyZWN0b3JpZXMgYW5kIHRoZW4gdXNlIHRoZXNlIHZhbHVlcworICAgICAgICAjIGluIHRoZSBGSU5EX1BBVEgoKSBhbmQgRklORF9MSUJSQVJZKCkgY2FsbHMKKyAgICAgICAgSU5DTFVERShVc2VQa2dDb25maWcpCisgICAgICAgIFBLR0NPTkZJRyhsaWJpY29udi0xLjkgX0xpYkljb252SW5jRGlyIF9MaWJJY29udkxpbmtEaXIgX0xpYkljb252TGlua0ZsYWdzIF9MaUljb252Q2ZsYWdzKQorICAgICAgICBTRVQoTElCSUNPTlZfREVGSU5JVElPTlMgJHtfTGliSWNvbnZDZmxhZ3N9KQorICAgIEVORElGIChOT1QgV0lOMzIpCisKKyAgICBGSU5EX1BBVEgoTElCSUNPTlZfSU5DTFVERV9ESVIgaWNvbnYuaAorICAgICAgUEFUSFMKKyAgICAgJHtfTGliSWNvbnZJbmNEaXJ9CisgICAgICBQQVRIX1NVRkZJWEVTIGxpYmljb252CisgICAgKQorCisgICAgRklORF9MSUJSQVJZKExJQklDT05WX0xJQlJBUklFUyBOQU1FUyBpY29udiBsaWJpY29udgorICAgICAgUEFUSFMKKyAgICAgICR7X0xpYkljb252TGlua0Rpcn0KKyAgICApCisKKyAgICBpZiAoTElCSUNPTlZfSU5DTFVERV9ESVIgQU5EIExJQklDT05WX0xJQlJBUklFUykKKyAgICAgICBzZXQoTElCSUNPTlZfRk9VTkQgVFJVRSkKKyAgICBlbmRpZiAoTElCSUNPTlZfSU5DTFVERV9ESVIgQU5EIExJQklDT05WX0xJQlJBUklFUykKKworICAgIGlmIChMSUJJQ09OVl9GT1VORCkKKyAgICAgIGlmIChOT1QgTGliSWNvbnZfRklORF9RVUlFVExZKQorICAgICAgICBtZXNzYWdlKFNUQVRVUyAiRm91bmQgTGliSWNvbnY6ICR7TElCSUNPTlZfTElCUkFSSUVTfSIpCisgICAgICBlbmRpZiAoTk9UIExpYkljb252X0ZJTkRfUVVJRVRMWSkKKyAgICBlbHNlIChMSUJJQ09OVl9GT1VORCkKKyAgICAgIGlmIChMaWJJY29udl9GSU5EX1JFUVVJUkVEKQorICAgICAgICBtZXNzYWdlKFNFTkRfRVJST1IgIkNvdWxkIE5PVCBmaW5kIExpYkljb252IikKKyAgICAgIGVuZGlmIChMaWJJY29udl9GSU5EX1JFUVVJUkVEKQorICAgIGVuZGlmIChMSUJJQ09OVl9GT1VORCkKKworICAgIE1BUktfQVNfQURWQU5DRUQoTElCSUNPTlZfSU5DTFVERV9ESVIgTElCSUNPTlZfTElCUkFSSUVTKQorCitlbmRpZiAoTElCSUNPTlZfSU5DTFVERV9ESVIgQU5EIExJQklDT05WX0xJQlJBUklFUykKZGlmZiAtLWdpdCBhL2NtYWtlL21vZHVsZXMvTWFjcm9HZXRlbnZXaW5QYXRoLmNtYWtlIGIvY21ha2UvbW9kdWxlcy9NYWNyb0dldGVudldpblBhdGguY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE4ZjdmNgotLS0gL2Rldi9udWxsCisrKyBiL2NtYWtlL21vZHVsZXMvTWFjcm9HZXRlbnZXaW5QYXRoLmNtYWtlCkBAIC0wLDAgKzEsNSBAQAorCitNQUNSTyAoTUFDUk9fR0VURU5WX1dJTl9QQVRIIHZhciBuYW1lKQorICAgc2V0KCR7dmFyfSAkRU5WeyR7bmFtZX19KQorICAgU1RSSU5HKFJFR0VYIFJFUExBQ0UgIlxcXFwiICIvIiAke3Zhcn0gIiR7JHt2YXJ9fSIpCitFTkRNQUNSTyAoTUFDUk9fR0VURU5WX1dJTl9QQVRIIHZhciBuYW1lKQpkaWZmIC0tZ2l0IGEvY21ha2UvbW9kdWxlcy9NYWNyb0xpYnJhcnkuY21ha2UgYi9jbWFrZS9tb2R1bGVzL01hY3JvTGlicmFyeS5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTIzNTMwCi0tLSAvZGV2L251bGwKKysrIGIvY21ha2UvbW9kdWxlcy9NYWNyb0xpYnJhcnkuY21ha2UKQEAgLTAsMCArMSw5IEBACisjIC0gaW5jbHVkZSBNYWNyb0xpYnJhcnkgb2ZmZXJzIGEgY29sbGVjdGlvbiBvZiBtYWNyb3Mgd2hpY2ggZXh0ZW5kIHRoZSBidWlsdC1pbiBjbWFrZSBjb21tYW5kcworIyBPUFRJT05BTF9GSU5EX1BBQ0tBR0UoIDxuYW1lPiBbUVVJVF0gKQorCitJTkNMVURFKE1hY3JvT3B0aW9uYWxGaW5kUGFja2FnZSkKKyNJTkNMVURFKE1hY3JvQWRkaXRpb25hbENsZWFuRmlsZXMpCisjSU5DTFVERShNYWNyb0FkZEZpbGVEZXBlbmRlbmNpZXMpCisjSU5DTFVERShNYWNyb0dldGVudldpblBhdGgpCisjSU5DTFVERShNYWNyb0Vuc3VyZU91dE9mU291cmNlQnVpbGQpCisKZGlmZiAtLWdpdCBhL2NtYWtlL21vZHVsZXMvTWFjcm9PcHRpb25hbEZpbmRQYWNrYWdlLmNtYWtlIGIvY21ha2UvbW9kdWxlcy9NYWNyb09wdGlvbmFsRmluZFBhY2thZ2UuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA2ODEzMQotLS0gL2Rldi9udWxsCisrKyBiL2NtYWtlL21vZHVsZXMvTWFjcm9PcHRpb25hbEZpbmRQYWNrYWdlLmNtYWtlCkBAIC0wLDAgKzEsMjIgQEAKKyMgLSBNQUNST19PUFRJT05BTF9GSU5EX1BBQ0tBR0UoKSBjb21iaW5lcyBGSU5EX1BBQ0tBR0UoKSB3aXRoIGFuIE9QVElPTigpCisjIE1BQ1JPX09QVElPTkFMX0ZJTkRfUEFDS0FHRSggPG5hbWU+IFtRVUlUXSApCisjIFRoaXMgbWFjcm8gaXMgYSBjb21iaW5hdGlvbiBvZiBPUFRJT04oKSBhbmQgRklORF9QQUNLQUdFKCksIGl0CisjIHdvcmtzIGxpa2UgRklORF9QQUNLQUdFKCksIGJ1dCBhZGRpdGlvbmFsbHkgaXQgYXV0b21hdGljYWxseSBjcmVhdGVzCisjIGFuIG9wdGlvbiBuYW1lIFdJVEhfPG5hbWU+LCB3aGljaCBjYW4gYmUgZGlzYWJsZWQgdmlhIHRoZSBjbWFrZSBHVUkuCisjIG9yIHZpYSAtRFdJVEhfPG5hbWU+PU9GRgorIyBUaGUgc3RhbmRhcmQgPG5hbWU+X0ZPVU5EIHZhcmlhYmxlcyBjYW4gYmUgdXNlZCBpbiB0aGUgc2FtZSB3YXkKKyMgYXMgd2hlbiB1c2luZyB0aGUgbm9ybWFsIEZJTkRfUEFDS0FHRSgpCisKK01BQ1JPIChNQUNST19PUFRJT05BTF9GSU5EX1BBQ0tBR0UgX25hbWUgKQorICAgT1BUSU9OKFdJVEhfJHtfbmFtZX0gIlNlYXJjaCBmb3IgJHtfbmFtZX0gcGFja2FnZSIgT04pCisgICBpZiAoV0lUSF8ke19uYW1lfSkKKyAgICAgIEZJTkRfUEFDS0FHRSgke19uYW1lfSAke0FSR059KQorICAgZWxzZSAoV0lUSF8ke19uYW1lfSkKKyAgICAgIHNldCgke19uYW1lfV9GT1VORCkKKyAgICAgIHNldCgke19uYW1lfV9JTkNMVURFX0RJUikKKyAgICAgIHNldCgke19uYW1lfV9JTkNMVURFUykKKyAgICAgIHNldCgke19uYW1lfV9MSUJSQVJZKQorICAgICAgc2V0KCR7X25hbWV9X0xJQlJBUklFUykKKyAgIGVuZGlmIChXSVRIXyR7X25hbWV9KQorRU5ETUFDUk8gKE1BQ1JPX09QVElPTkFMX0ZJTkRfUEFDS0FHRSkKKwpkaWZmIC0tZ2l0IGEvY21ha2UvbW9kdWxlcy9NYWNyb3MuY21ha2UgYi9jbWFrZS9tb2R1bGVzL01hY3Jvcy5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2IyMTcxCi0tLSAvZGV2L251bGwKKysrIGIvY21ha2UvbW9kdWxlcy9NYWNyb3MuY21ha2UKQEAgLTAsMCArMSwxMTcgQEAKK2lmKERCVVNfQlVJTERfVEVTVFMgQU5EIENNQUtFX0NST1NTQ09NUElMSU5HIEFORCBDTUFLRV9TWVNURU1fTkFNRSBTVFJFUVVBTCAiV2luZG93cyIpCisgICAgaWYoQ01BS0VfSE9TVF9TWVNURU1fTkFNRSBTVFJFUVVBTCAiTGludXgiKQorICAgICAgICBmaW5kX2ZpbGUoV0lORV9FWEVDVVRBQkxFCisgICAgICAgICAgICBOQU1FUyB3aW5lCisgICAgICAgICAgICBQQVRIUyAvdXNyL2JpbiAvdXNyL2xvY2FsL2JpbgorICAgICAgICAgICAgTk9fQ01BS0VfRklORF9ST09UX1BBVEgKKyAgICAgICAgKQorICAgICAgICBmaW5kX2ZpbGUoQklORk1UX1dJTkVfU1VQUE9SVF9GSUxFCisgICAgICAgICAgICBOQU1FUyBET1NXaW4gd2luZSBXaW5lIHdpbmRvd3MgV2luZG93cworICAgICAgICAgICAgUEFUSFMgL3Byb2Mvc3lzL2ZzL2JpbmZtdF9taXNjCisgICAgICAgICAgICBOT19TWVNURU1fUEFUSCBOT19DTUFLRV9GSU5EX1JPT1RfUEFUSAorICAgICAgICApCisgICAgICAgIGlmKEVYSVNUUyBCSU5GTVRfV0lORV9TVVBQT1JUX0ZJTEUpCisgICAgICAgICAgICBmaWxlKFJFQUQgJHtCSU5GTVRfV0lORV9TVVBQT1JUX0ZJTEV9IENPTlRFTlQpCisgICAgICAgICAgICBpZigke0NPTlRFTlR9IE1BVENIRVMgImVuYWJsZWQiKQorICAgICAgICAgICAgICAgIHNldChIQVZFX0JJTkZNVF9XSU5FX1NVUFBPUlQgMSkKKyAgICAgICAgICAgIGVuZGlmKCkKKyAgICAgICAgZW5kaWYoKQorICAgICAgICBpZihXSU5FX0VYRUNVVEFCTEUpCisgICAgICAgICAgICBsaXN0KEFQUEVORCBGT09UTk9URVMgIk5PVEU6IFRoZSByZXF1aXJlbWVudHMgdG8gcnVuIGNyb3NzIGNvbXBpbGVkIGFwcGxpY2F0aW9ucyBvbiB5b3VyIGhvc3Qgc3lzdGVtIGFyZSBhY2hpZXZlZC4gWW91IG1heSBydW4gJ21ha2UgY2hlY2snLiIpCisgICAgICAgIGVuZGlmKCkKKyAgICAgICAgaWYoTk9UIFdJTkVfRVhFQ1VUQUJMRSkKKyAgICAgICAgICAgIGxpc3QoQVBQRU5EIEZPT1ROT1RFUyAiTk9URTogWW91IG1heSBpbnN0YWxsIHRoZSBXaW5kb3dzIGVtdWxhdG9yICd3aW5lJyB0byBiZSBhYmxlIHRvIHJ1biBjcm9zcyBjb21waWxlZCB0ZXN0IGFwcGxpY2F0aW9ucy4iKQorICAgICAgICBlbmRpZigpCisgICAgICAgIGlmKE5PVCBIQVZFX0JJTkZNVF9XSU5FX1NVUFBPUlQpCisgICAgICAgICAgICBsaXN0KEFQUEVORCBGT09UTk9URVMgIk5PVEU6IFlvdSBtYXkgYWN0aXZhdGUgYmluZm10X21pc2Mgc3VwcG9ydCBmb3Igd2luZSB0byBiZSBhYmxlIHRvIHJ1biBjcm9zcyBjb21waWxlZCB0ZXN0IGFwcGxpY2F0aW9ucyBkaXJlY3RseS4iKQorICAgICAgICBlbmRpZigpCisgICAgZWxzZSgpCisgICAgICAgIGxpc3QoQVBQRU5EIEZPT1ROT1RFUyAiTk9URTogWW91IHdpbGwgbm90IGJlIGFibGUgdG8gcnVuIGNyb3NzIGNvbXBpbGVkIGFwcGxpY2F0aW9ucyBvbiB5b3VyIGhvc3Qgc3lzdGVtLiIpCisgICAgZW5kaWYoKQorZW5kaWYoKQorCittYWNybyhhZGRfdGVzdF9leGVjdXRhYmxlIF90YXJnZXQgX3NvdXJjZSkKKyAgICBhZGRfZXhlY3V0YWJsZSgke190YXJnZXR9ICR7X3NvdXJjZX0pCisgICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKCR7X3RhcmdldH0gJHtBUkdOfSkKKyAgICBpZiAoQ01BS0VfQ1JPU1NDT01QSUxJTkcgQU5EIENNQUtFX1NZU1RFTV9OQU1FIFNUUkVRVUFMICJXaW5kb3dzIikKKyAgICAgICAgIyBydW4gdGVzdHMgd2l0aCBiaW5mbXRfbWlzYworICAgICAgICBzZXQoUFJFRklYICJ6OiIpCisgICAgICAgIHNldChfZW52ICJEQlVTX1RFU1RfREFFTU9OPSR7UFJFRklYfSR7Q01BS0VfQklOQVJZX0RJUn0vYmluL2RidXMtZGFlbW9uJHtFWEVFWFR9IikKKyAgICAgICAgaWYoSEFWRV9CSU5GTVRfV0lORV9TVVBQT1JUKQorICAgICAgICAgICAgYWRkX3Rlc3QoTkFNRSAke190YXJnZXR9IENPTU1BTkQgJDxUQVJHRVRfRklMRToke190YXJnZXR9PiAtLXRhcCkKKyAgICAgICAgZWxzZSgpCisgICAgICAgICAgICBhZGRfdGVzdChOQU1FICR7X3RhcmdldH0gQ09NTUFORCAke1dJTkVfRVhFQ1VUQUJMRX0gJHtQUkVGSVh9JDxUQVJHRVRfRklMRToke190YXJnZXR9PiAtLXRhcCkKKyAgICAgICAgZW5kaWYoKQorICAgIGVsc2UoKQorICAgICAgICBzZXQoUFJFRklYKQorICAgICAgICBzZXQoX2VudiAiREJVU19URVNUX0RBRU1PTj0ke0NNQUtFX0JJTkFSWV9ESVJ9L2Jpbi9kYnVzLWRhZW1vbiR7RVhFRVhUfSIpCisgICAgICAgIGFkZF90ZXN0KE5BTUUgJHtfdGFyZ2V0fSBDT01NQU5EICQ8VEFSR0VUX0ZJTEU6JHtfdGFyZ2V0fT4gLS10YXApCisgICAgZW5kaWYoKQorICAgIGxpc3QoQVBQRU5EIF9lbnYgIkRCVVNfU0VTU0lPTl9CVVNfQUREUkVTUz0iKQorICAgIGxpc3QoQVBQRU5EIF9lbnYgIkRCVVNfRkFUQUxfV0FSTklOR1M9MSIpCisgICAgbGlzdChBUFBFTkQgX2VudiAiREJVU19URVNUX0RBVEE9JHtQUkVGSVh9JHtDTUFLRV9CSU5BUllfRElSfS90ZXN0L2RhdGEiKQorICAgIGxpc3QoQVBQRU5EIF9lbnYgIkRCVVNfVEVTVF9EQlVTX0xBVU5DSD0ke1BSRUZJWH0ke0NNQUtFX0JJTkFSWV9ESVJ9L2Jpbi9kYnVzLWxhdW5jaCR7RVhFRVhUfSIpCisgICAgbGlzdChBUFBFTkQgX2VudiAiREJVU19URVNUX0VYRUM9JHtQUkVGSVh9JHtEQlVTX1RFU1RfRVhFQ30iKQorICAgIGxpc3QoQVBQRU5EIF9lbnYgIkRCVVNfVEVTVF9IT01FRElSPSR7UFJFRklYfSR7Q01BS0VfQklOQVJZX0RJUn0vZGJ1cyIpCisgICAgbGlzdChBUFBFTkQgX2VudiAiREJVU19URVNUX1VOSU5TVEFMTEVEPTEiKQorICAgIHNldF90ZXN0c19wcm9wZXJ0aWVzKCR7X3RhcmdldH0gUFJPUEVSVElFUyBFTlZJUk9OTUVOVCAiJHtfZW52fSIpCitlbmRtYWNybyhhZGRfdGVzdF9leGVjdXRhYmxlKQorCittYWNybyhhZGRfaGVscGVyX2V4ZWN1dGFibGUgX3RhcmdldCBfc291cmNlKQorICAgIGFkZF9leGVjdXRhYmxlKCR7X3RhcmdldH0gJHtfc291cmNlfSkKKyAgICB0YXJnZXRfbGlua19saWJyYXJpZXMoJHtfdGFyZ2V0fSAke0FSR059KQorZW5kbWFjcm8oYWRkX2hlbHBlcl9leGVjdXRhYmxlKQorCisKKyMKKyMgZ2VuZXJhdGUgY29tcGlsZXIgZmxhZ3MgZnJvbSBNU1ZDIHdhcm5pbmcgaWRlbnRpZmllcnMgKGUuZy4gJzQxMTQnKSBvciBnY2Mgd2FybmluZyBrZXlzIChlLmcuICdwb2ludGVyLXNpZ24nKQorIworIyBAcGFyYW0gdGFyZ2V0IHRoZSB2YXJpYWJsZSBuYW1lIHdoaWNoIHdpbGwgY29udGFpbiB0aGUgd2FybmluZ3MgZmxhZ3MKKyMgQHBhcmFtIHdhcm5pbmdzIGEgc3RyaW5nIHdpdGggc3BhY2UgZGVsaW1pdGVkIHdhcm5pbmdzCisjIEBwYXJhbSBkaXNhYmxlZF93YXJuaW5ncyBhIHN0cmluZyB3aXRoIHNwYWNlIGRlbGltaXRlZCBkaXNhYmxlZCB3YXJuaW5ncworIyBAcGFyYW0gZXJyb3Jfd2FybmluZ3MgYSBzdHJpbmcgd2l0aCBzcGFjZSBkZWxpbWl0ZWQgd2FybmluZ3Mgd2hpY2ggc2hvdWxkIHJlc3VsdCBpbnRvIGNvbXBpbGUgZXJyb3JzCisjCittYWNybyhnZW5lcmF0ZV93YXJuaW5nX2NmbGFncyB0YXJnZXQgd2FybmluZ3MgZGlzYWJsZWRfd2FybmluZ3MgZXJyb3Jfd2FybmluZ3MpCisgICAgaWYoREVCVUdfTUFDUk9TKQorICAgICAgICBtZXNzYWdlKCJnZW5lcmF0ZV93YXJuaW5nX2NmbGFncyBnb3Q6ICR7d2FybmluZ3N9IC0gJHtkaXNhYmxlZF93YXJuaW5nc30gLSAke2Vycm9yX3dhcm5pbmdzfSIpCisgICAgZW5kaWYoKQorICAgIGlmKE1TVkMpCisgICAgICAgICMgbGV2ZWwgMSBpcyBkZWZhdWx0CisgICAgICAgIHNldChlbmFibGVkX3ByZWZpeCAiL3cxIikKKyAgICAgICAgc2V0KGVycm9yX3ByZWZpeCAiL3dlIikKKyAgICAgICAgc2V0KGRpc2FibGVkX3ByZWZpeCAiL3dkIikKKyAgICBlbHNlKCkKKyAgICAgICAgc2V0KGVuYWJsZWRfcHJlZml4ICItVyIpCisgICAgICAgIHNldChlcnJvcl9wcmVmaXggIi1XZXJyb3I9IikKKyAgICAgICAgc2V0KGRpc2FibGVkX3ByZWZpeCAiLVduby0iKQorICAgIGVuZGlmKCkKKworICAgIHNldCh0ZW1wKQorICAgIHN0cmluZyhSRVBMQUNFICIgIiAiOyIgd2FybmluZ3NfbGlzdCAiJHt3YXJuaW5nc30iKQorICAgIGZvcmVhY2god2FybmluZyAke3dhcm5pbmdzX2xpc3R9KQorICAgICAgICBzdHJpbmcoU1RSSVAgJHt3YXJuaW5nfSBfd2FybmluZykKKyAgICAgICAgaWYoX3dhcm5pbmcpCisgICAgICAgICAgICBzZXQodGVtcCAiJHt0ZW1wfSAke2VuYWJsZWRfcHJlZml4fSR7X3dhcm5pbmd9IikKKyAgICAgICAgZW5kaWYoKQorICAgIGVuZGZvcmVhY2goKQorCisgICAgc3RyaW5nKFJFUExBQ0UgIiAiICI7IiBkaXNhYmxlZF93YXJuaW5nc19saXN0ICIke2Rpc2FibGVkX3dhcm5pbmdzfSIpCisgICAgZm9yZWFjaCh3YXJuaW5nICR7ZGlzYWJsZWRfd2FybmluZ3NfbGlzdH0pCisgICAgICAgIHN0cmluZyhTVFJJUCAke3dhcm5pbmd9IF93YXJuaW5nKQorICAgICAgICBpZihfd2FybmluZykKKyAgICAgICAgICAgIHNldCh0ZW1wICIke3RlbXB9ICR7ZGlzYWJsZWRfcHJlZml4fSR7X3dhcm5pbmd9IikKKyAgICAgICAgZW5kaWYoKQorICAgIGVuZGZvcmVhY2goKQorCisgICAgc3RyaW5nKFJFUExBQ0UgIiAiICI7IiBlcnJvcl93YXJuaW5nc19saXN0ICIke2Vycm9yX3dhcm5pbmdzfSIpCisgICAgZm9yZWFjaCh3YXJuaW5nICR7ZXJyb3Jfd2FybmluZ3NfbGlzdH0pCisgICAgICAgIHN0cmluZyhTVFJJUCAke3dhcm5pbmd9IF93YXJuaW5nKQorICAgICAgICBpZihfd2FybmluZykKKyAgICAgICAgICAgIHNldCh0ZW1wICIke3RlbXB9ICR7ZXJyb3JfcHJlZml4fSR7X3dhcm5pbmd9IikKKyAgICAgICAgZW5kaWYoKQorICAgIGVuZGZvcmVhY2goKQorICAgIHNldCgke3RhcmdldH0gIiR7dGVtcH0iKQorICAgIGlmKERFQlVHX01BQ1JPUykKKyAgICAgICAgbWVzc2FnZSgiZ2VuZXJhdGVfd2FybmluZ19jZmxhZ3MgcmV0dXJuOiAkeyR7dGFyZ2V0fX0iKQorICAgIGVuZGlmKCkKK2VuZG1hY3JvKCkKZGlmZiAtLWdpdCBhL2NtYWtlL21vZHVsZXMvTWFjcm9zQXV0b3Rvb2xzLmNtYWtlIGIvY21ha2UvbW9kdWxlcy9NYWNyb3NBdXRvdG9vbHMuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg4ZDVlNwotLS0gL2Rldi9udWxsCisrKyBiL2NtYWtlL21vZHVsZXMvTWFjcm9zQXV0b3Rvb2xzLmNtYWtlCkBAIC0wLDAgKzEsMTY4IEBACisjCisjIGNtYWtlIHBhY2thZ2UgZm9yIGF1dG90b29scyBzdXBwb3J0CisjCisjIEBBdXRob3IgUmFsZiBIYWJhY2tlcgorIyAKKworIworIyBsb2FkIGF1dG90b29scyBjb25maWd1cmUgZmlsZSBpbnRvIGFuIGludGVybmFsIGxpc3QgbmFtZWQgX2NvbmZpZ3VyZV9hYworIworbWFjcm8oYXV0b2luaXQgY29uZmlnKQorICAgIHNldChfY29uZmlndXJlX2FjX25hbWUgJHtjb25maWd9KQorICAgIGZpbGUoUkVBRCAke2NvbmZpZ30gX2NvbmZpZ3VyZV9hY19yYXcpCisgICAgIyBDb252ZXJ0IGZpbGUgY29udGVudHMgaW50byBhIENNYWtlIGxpc3QgKHdoZXJlIGVhY2ggZWxlbWVudCBpbiB0aGUgbGlzdAorICAgICMgaXMgb25lIGxpbmUgb2YgdGhlIGZpbGUpCisgICAgU1RSSU5HKFJFR0VYIFJFUExBQ0UgIjsiICJcXFxcOyIgX2NvbmZpZ3VyZV9hYyAiJHtfY29uZmlndXJlX2FjX3Jhd30iKQorICAgIFNUUklORyhSRUdFWCBSRVBMQUNFICJcbiIgIjsiIF9jb25maWd1cmVfYWMgIiR7X2NvbmZpZ3VyZV9hY30iKQorZW5kbWFjcm8oKQorCisjIGV4dHJhY3RzIHZlcnNpb24gaW5mb3JtYXRpb24gZnJvbSBhdXRvY29uZiBjb25maWcgZmlsZQorIyBhbmQgc2V0IHJlbGF0ZWQgY21ha2UgdmFyaWFibGVzCisjIAorIyByZXR1cm5zICAKKyMgICAke3ByZWZpeH1fVkVSU0lPTgorIyAgICR7cHJlZml4fV9WRVJTSU9OX1NUUklORworIyAgICR7cHJlZml4fV9NQUpPUl9WRVJTSU9OCisjICAgJHtwcmVmaXh9X01JTk9SX1ZFUlNJT04KKyMgICAke3ByZWZpeH1fTUlDUk9fVkVSU0lPTgorIyAgICR7cHJlZml4fV9MSUJSQVJZX0FHRQorIyAgICR7cHJlZml4fV9MSUJSQVJZX1JFVklTSU9OCisjICAgJHtwcmVmaXh9X0xJQlJBUllfQ1VSUkVOVAorIyAKK21hY3JvKGF1dG92ZXJzaW9uIHByZWZpeCkKKyAgICBzdHJpbmcoVE9VUFBFUiAke3ByZWZpeH0gcHJlZml4X3VwcGVyKQorICAgIHN0cmluZyAoUkVHRVggUkVQTEFDRSAiLioke3ByZWZpeH1fbWFqb3JfdmVyc2lvbl0sIC4oWzAtOV0rKS4qIiAiXFwxIiAke3ByZWZpeF91cHBlcn1fTUFKT1JfVkVSU0lPTiAke19jb25maWd1cmVfYWNfcmF3fSkKKyAgICBzdHJpbmcgKFJFR0VYIFJFUExBQ0UgIi4qJHtwcmVmaXh9X21pbm9yX3ZlcnNpb25dLCAuKFswLTldKykuKiIgIlxcMSIgJHtwcmVmaXhfdXBwZXJ9X01JTk9SX1ZFUlNJT04gJHtfY29uZmlndXJlX2FjX3Jhd30pCisgICAgc3RyaW5nIChSRUdFWCBSRVBMQUNFICIuKiR7cHJlZml4fV9taWNyb192ZXJzaW9uXSwgLihbMC05XSspLioiICJcXDEiICR7cHJlZml4X3VwcGVyfV9NSUNST19WRVJTSU9OICR7X2NvbmZpZ3VyZV9hY19yYXd9KQorICAgIHNldCAoJHtwcmVmaXhfdXBwZXJ9X1ZFUlNJT04gJHske3ByZWZpeF91cHBlcn1fTUFKT1JfVkVSU0lPTn0uJHske3ByZWZpeF91cHBlcn1fTUlOT1JfVkVSU0lPTn0uJHske3ByZWZpeF91cHBlcn1fTUlDUk9fVkVSU0lPTn0pCisgICAgc2V0ICgke3ByZWZpeF91cHBlcn1fVkVSU0lPTl9TVFJJTkcgIiR7JHtwcmVmaXhfdXBwZXJ9X1ZFUlNJT059IikKKyAgICBzdHJpbmcgKFJFR0VYIFJFUExBQ0UgIi4qTFRfQUdFPShbMC05XSspLioiICJcXDEiICR7cHJlZml4X3VwcGVyfV9MSUJSQVJZX0FHRSAke19jb25maWd1cmVfYWNfcmF3fSkKKyAgICBzdHJpbmcgKFJFR0VYIFJFUExBQ0UgIi4qTFRfQ1VSUkVOVD0oWzAtOV0rKS4qIiAiXFwxIiAke3ByZWZpeF91cHBlcn1fTElCUkFSWV9DVVJSRU5UICR7X2NvbmZpZ3VyZV9hY19yYXd9KQorICAgIHN0cmluZyAoUkVHRVggUkVQTEFDRSAiLipMVF9SRVZJU0lPTj0oWzAtOV0rKS4qIiAiXFwxIiAke3ByZWZpeF91cHBlcn1fTElCUkFSWV9SRVZJU0lPTiAke19jb25maWd1cmVfYWNfcmF3fSkKK2VuZG1hY3JvKCkKKworIworIyBEZWZpbmVzIHBhY2thZ2UgcmVsYXRlZCB2YXJpYWJsZXMgKFBBQ0tBR0VfLi4uLCBQQUNLQUdFIGFuZCBWRVJTSU9OKQorIyBhcyBkb25lIGJ5IGF1dG90b29scy4KKyMKKyMgQWRkaXRpb25hbCBpdCBkZWZpbmVzIGEgY21ha2UgdmFyaWFibGUgbmFtZWQgUEFDS0FHRV9DT05GSUdfSF9URU1QTEFURQorIyB3aGljaCBjb3VsZCBiZSBwbGFjZWQgaW4gY29uZmlnLmggdGVtcGxhdGVzIHRvIGhhdmUgdGhvc2UgdmFyaWFibGVzCisjIGRlZmluZWQgYXQgY29kZSBsZXZlbCBsaWtlIHNob3duIGJlbG93OgorIworIyBjb25maWcuaC50ZW1wbGF0ZQorIyAgIC4uLgorIyAgIEBBVVRPUEFDS0FHRV9DT05GSUdfSF9URU1QTEFURUAKKyMgICAuLi4KKyMKK21hY3JvKGF1dG9wYWNrYWdlIG5hbWUgdmVyc2lvbiB1cmwgc3VwcG9ydF91cmwpCisgICAgIyBEZWZpbmUgdG8gdGhlIGZ1bGwgbmFtZSBvZiB0aGlzIHBhY2thZ2UuCisgICAgc2V0KFBBQ0tBR0VfTkFNRSAke25hbWV9KQorCisgICAgIyBEZWZpbmUgdG8gdGhlIHZlcnNpb24gb2YgdGhpcyBwYWNrYWdlLgorICAgIHNldChQQUNLQUdFX1ZFUlNJT04gJHt2ZXJzaW9ufSkKKworICAgICMgRGVmaW5lIHRvIHRoZSBob21lIHBhZ2UgZm9yIHRoaXMgcGFja2FnZS4KKyAgICBzZXQoUEFDS0FHRV9VUkwgJHt1cmx9KQorCisgICAgIyBEZWZpbmUgdG8gdGhlIGFkZHJlc3Mgd2hlcmUgYnVnIHJlcG9ydHMgZm9yIHRoaXMgcGFja2FnZSBzaG91bGQgYmUgc2VudC4KKyAgICBzZXQoUEFDS0FHRV9CVUdSRVBPUlQgJHtzdXBwb3J0X3VybH0pCisKKyAgICAjIERlZmluZSB0byB0aGUgZnVsbCBuYW1lIGFuZCB2ZXJzaW9uIG9mIHRoaXMgcGFja2FnZS4KKyAgICBzZXQoUEFDS0FHRV9TVFJJTkcgIiR7UEFDS0FHRV9OQU1FfSAke1BBQ0tBR0VfVkVSU0lPTn0iKQorCisgICAgIyBEZWZpbmUgdG8gdGhlIG9uZSBzeW1ib2wgc2hvcnQgbmFtZSBvZiB0aGlzIHBhY2thZ2UuCisgICAgc2V0KFBBQ0tBR0VfVEFSTkFNRSAke1BBQ0tBR0VfTkFNRX0pCisKKyAgICBzZXQoUEFDS0FHRSAke25hbWV9KQorICAgIHNldChWRVJTSU9OICR7REJVU19WRVJTSU9OX1NUUklOR30pCisKKyAgICBzdHJpbmcoQ09ORklHVVJFICIvKiBnZW5lcmF0ZWQgYnkgY21ha2UgbWFjcm8gYXV0b3BhY2thZ2UgKi9cbgorLyogRGVmaW5lIHRvIHRoZSBhZGRyZXNzIHdoZXJlIGJ1ZyByZXBvcnRzIGZvciB0aGlzIHBhY2thZ2Ugc2hvdWxkIGJlIHNlbnQuICovCisjZGVmaW5lIFBBQ0tBR0VfQlVHUkVQT1JUIFwiQFBBQ0tBR0VfQlVHUkVQT1JUQFwiCisKKy8qIERlZmluZSB0byB0aGUgZnVsbCBuYW1lIG9mIHRoaXMgcGFja2FnZS4gKi8KKyNkZWZpbmUgUEFDS0FHRV9OQU1FIFwiQFBBQ0tBR0VfTkFNRUBcIgorCisvKiBEZWZpbmUgdG8gdGhlIGZ1bGwgbmFtZSBhbmQgdmVyc2lvbiBvZiB0aGlzIHBhY2thZ2UuICovCisjZGVmaW5lIFBBQ0tBR0VfU1RSSU5HIFwiQFBBQ0tBR0VfU1RSSU5HQFwiCisKKy8qIERlZmluZSB0byB0aGUgb25lIHN5bWJvbCBzaG9ydCBuYW1lIG9mIHRoaXMgcGFja2FnZS4gKi8KKyNkZWZpbmUgUEFDS0FHRV9UQVJOQU1FIFwiQFBBQ0tBR0VfVEFSTkFNRUBcIgorCisvKiBEZWZpbmUgdG8gdGhlIGhvbWUgcGFnZSBmb3IgdGhpcyBwYWNrYWdlLiAqLworI2RlZmluZSBQQUNLQUdFX1VSTCBcIkBQQUNLQUdFX1VSTEBcIgorCisvKiBEZWZpbmUgdG8gdGhlIHZlcnNpb24gb2YgdGhpcyBwYWNrYWdlLiAqLworI2RlZmluZSBQQUNLQUdFX1ZFUlNJT04gXCJAUEFDS0FHRV9WRVJTSU9OQFwiCisKKy8qIGRlZmluZWQgYnkgYXV0b3Rvb2xzIHBhY2thZ2UgKi8KKyNkZWZpbmUgUEFDS0FHRSBcIkBQQUNLQUdFQFwiCisjZGVmaW5lIFZFUlNJT04gXCJAVkVSU0lPTkBcIgorIiBBVVRPUEFDS0FHRV9DT05GSUdfSF9URU1QTEFURSkKK2VuZG1hY3JvKGF1dG9wYWNrYWdlKQorCisjCisjIGRlZmluZSBhIGNtYWtlIHZhcmlhYmxlIGZyb20gYXV0b3Rvb2xzIEFDX0RFRklORSBzdGF0ZW1lbnQKKyMKK21hY3JvKGF1dG9kZWZpbmUgbmFtZSkKKyAgICBmb3JlYWNoKGxpbmUgJHtfY29uZmlndXJlX2FjfSkKKyAgICAgICAgaWYobGluZSBNQVRDSEVTICIuKkFDX0RFRklORSguKiR7bmFtZX0uKikuKiIpCisgICAgICAgICAgICBzdHJpbmcgKFJFR0VYIFJFUExBQ0UgIi4qQUNfREVGSU5FKC4qKS4qIiAiXFwxIiB2YWx1ZSAke2xpbmV9KQorICAgICAgICAgICAgc3RyaW5nIChSRUdFWCBSRVBMQUNFICJbXltdKlxcW1teXV0qXFxdLCAqXFxbKFteXV0qKVxcXSwuKiIgIlxcMSIgdmFsdWUyICR7dmFsdWV9KQorICAgICAgICAgICAgc3RyaW5nIChSRVBMQUNFICJbIiAiIiB2YWx1ZTMgJHt2YWx1ZTJ9KQorICAgICAgICAgICAgc3RyaW5nIChSRVBMQUNFICJdIiAiIiB2YWx1ZTQgJHt2YWx1ZTN9KQorICAgICAgICAgICAgc2V0KCR7bmFtZX0gJHt2YWx1ZTR9KQorICAgICAgICBlbmRpZigpCisgICAgZW5kZm9yZWFjaCgpCitlbmRtYWNybygpCisKK21hY3JvKGF1dG9oZWFkZXJjaGVja3MgY29uZmlnX2hfaW4gY29uZmlndXJlX2NoZWNrc19maWxlIGNvbmZpZ19oX2NtYWtlKQorICAgIGZpbGUoUkVBRCAke2NvbmZpZ3VyZV9jaGVja3NfZmlsZX0gY29uZmlndXJlX2NoZWNrc19maWxlX3JhdykKKyAgICBmaWxlKFJFQUQgJHtjb25maWdfaF9pbn0gX2NvbmZpZ19oX2luX3JhdykKKyAgICBmaWxlKFJFQUQgJHtjb25maWdfaF9jbWFrZX0gX2NvbmZpZ19oX2NtYWtlX3JhdykKKyAgICBTVFJJTkcoUkVHRVggUkVQTEFDRSAiOyIgIlxcXFw7IiBfY29uZmlnX2hfaW4gIiR7X2NvbmZpZ19oX2luX3Jhd30iKQorICAgIFNUUklORyhSRUdFWCBSRVBMQUNFICJcbiIgIjsiIF9jb25maWdfaF9pbiAiJHtfY29uZmlnX2hfaW59IikKKyAgICBmb3JlYWNoKGxpbmUgJHtfY29uZmlnX2hfaW59KQorICAgICAgICAjbWVzc2FnZShTVEFUVVMgJHtsaW5lfSkKKyAgICAgICAgaWYobGluZSBNQVRDSEVTICIuKkhBVkVfLipfSC4qIikKKyAgICAgICAgICAgIHN0cmluZyAoUkVHRVggUkVQTEFDRSAiLipIQVZFXyguKilfSC4qIiAiXFwxIiBrZXkgJHtsaW5lfSkKKyAgICAgICAgICAgIHNldChmdWxsX2tleSAiSEFWRV8ke2tleX1fSCIpCisgICAgICAgICAgICBpZihrZXkgTUFUQ0hFUyAiLipfLioiKQorICAgICAgICAgICAgICAgIHN0cmluZyhSRUdFWCBNQVRDSCAiXltBLVowLTldKyIgZGlyICR7a2V5fSkKKyAgICAgICAgICAgICAgICBzdHJpbmcoUkVHRVggTUFUQ0ggIltBLVowLTldKyQiIGZpbGUgJHtrZXl9KQorICAgICAgICAgICAgICAgIHN0cmluZyhUT0xPV0VSICR7ZGlyfSBkaXJuYW1lKQorICAgICAgICAgICAgICAgIHN0cmluZyhUT0xPV0VSICR7ZmlsZX0gZmlsZW5hbWUpCisgICAgICAgICAgICAgICAgc2V0KGNoZWNrICJjaGVja19pbmNsdWRlX2ZpbGUoJHtkaXJuYW1lfS8ke2ZpbGVuYW1lfS5oICAgICAke2Z1bGxfa2V5fSkiKQorICAgICAgICAgICAgICAgIHNldChjb25maWdfZGVmaW5lICIjY21ha2VkZWZpbmUgJHtmdWxsX2tleX0iKQorICAgICAgICAgICAgZWxzZSgpCisgICAgICAgICAgICAgICAgc2V0KGZpbGUgJHtrZXl9KQorICAgICAgICAgICAgICAgIHN0cmluZyhUT0xPV0VSICR7ZmlsZX0gZmlsZW5hbWUpCisgICAgICAgICAgICAgICAgc2V0KGNoZWNrICJjaGVja19pbmNsdWRlX2ZpbGUoJHtmaWxlbmFtZX0uaCAgICAgJHtmdWxsX2tleX0pIikKKyAgICAgICAgICAgICAgICBzZXQoY29uZmlnX2RlZmluZSAiI2NtYWtlZGVmaW5lICR7ZnVsbF9rZXl9IikKKyAgICAgICAgICAgIGVuZGlmKCkKKyAgICAgICAgICAgIGlmKE5PVCBjb25maWd1cmVfY2hlY2tzX2ZpbGVfcmF3IE1BVENIRVMgIi4qJHtmdWxsX2tleX0uKiIpCisgICAgICAgICAgICAgICAgbWVzc2FnZSgiJHtjaGVja30iKQorICAgICAgICAgICAgZW5kaWYoKQorICAgICAgICAgICAgaWYoTk9UIF9jb25maWdfaF9jbWFrZV9yYXcgTUFUQ0hFUyAiJHtmdWxsX2tleX0iKQorICAgICAgICAgICAgICAgIG1lc3NhZ2UoIiR7Y29uZmlnX2RlZmluZX0iKQorICAgICAgICAgICAgZW5kaWYoKQorICAgICAgICBlbmRpZigpCisgICAgZW5kZm9yZWFjaCgpCitlbmRtYWNybyhhdXRvaGVhZGVyY2hlY2tzKQorCisjCisjIHBhcnNlcyBjb25maWcuaCB0ZW1wbGF0ZSBhbmQgY3JlYXRlIGNtYWtlIGVxdWl2YWxlbnQgCisjIG5vdCBpbXBsZW1lbnRlZCB5ZXQKKyMgCittYWNybyhhdXRvY29uZmlnIHRlbXBsYXRlIG91dHB1dCkKKwlmaWxlKFJFQUQgJHt0ZW1wbGF0ZX0gY29udGVudHMpCisJIyBDb252ZXJ0IGZpbGUgY29udGVudHMgaW50byBhIENNYWtlIGxpc3QgKHdoZXJlIGVhY2ggZWxlbWVudCBpbiB0aGUgbGlzdAorCSMgaXMgb25lIGxpbmUgb2YgdGhlIGZpbGUpCisJU1RSSU5HKFJFR0VYIFJFUExBQ0UgIjsiICJcXFxcOyIgY29udGVudHMgIiR7Y29udGVudHN9IikKKwlTVFJJTkcoUkVHRVggUkVQTEFDRSAiXG4iICI7IiBjb250ZW50cyAiJHtjb250ZW50c30iKQorCWZvcmVhY2gobGluZSBjb250ZW50cykKKwkJbWVzc2FnZShTVEFUVVMgJHtsaW5lfSkKKwkJIyBmaW5kICN1bmRlZiBsaW5lcworCQkjIGFwcGVuZCB0byBjb25maWcuaCAjZGVmaW5lIDx2YXJpYWJsZS1uYW1lPiA8dmFyaWFibGUtY29udGVudD4KKwllbmRmb3JlYWNoKCkKK2VuZG1hY3JvKCkKZGlmZiAtLWdpdCBhL2NtYWtlL21vZHVsZXMvUHJvamVjdFNvdXJjZUdyb3VwLmNtYWtlIGIvY21ha2UvbW9kdWxlcy9Qcm9qZWN0U291cmNlR3JvdXAuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzEzYTY3YQotLS0gL2Rldi9udWxsCisrKyBiL2NtYWtlL21vZHVsZXMvUHJvamVjdFNvdXJjZUdyb3VwLmNtYWtlCkBAIC0wLDAgKzEsMTggQEAKKyMgZm9sZGVycyBpbiB0aGUgbXN2YyBwcm9qZWN0cworIyBtb2RlPT1mbGF0ICA6IGhlYWRlcnMgYW5kIG91cnNlcyBpbiBubyBmb2xkZXJzCisjIG1vZGU9PXNwbGl0IDogc3RhbmRhcmQgYmVoYXZpb3Igb2YgY21ha2UsIHNwbGl0IGhlYWRlcnMgYW5kIHNvdXJjZXMKKyMgbW9kZT09IDxvdGhlciB2YWx1ZXMiIDogY29kZSBpcyBpbiB0aGlzIGZvbGRlcgorbWFjcm8ocHJvamVjdF9zb3VyY2VfZ3JvdXAgbW9kZSBzb3VyY2VzIGhlYWRlcnMpCisJI21lc3NhZ2UoU1RBVFVTICR7bW9kZX0pCisJI21lc3NhZ2UoU1RBVFVTICR7c291cmNlc30gJHtoZWFkZXJzfSkKKwlpZigke21vZGV9IE1BVENIRVMgImZsYXQiKQorCQlzb3VyY2VfZ3JvdXAoIlNvdXJjZSBGaWxlcyIgRmlsZXMpCisJCXNvdXJjZV9ncm91cCgiSGVhZGVyIEZpbGVzIiBGaWxlcykKKwkJc291cmNlX2dyb3VwKCJjbWFrZSIgRklMRVMgQ01ha2VMaXN0cy50eHQpCisJZWxzZSgke21vZGV9IE1BVENIRVMgImZsYXQiKQorCQlpZihOT1QgJHttb2RlfSBNQVRDSEVTICJzcGxpdCIpCisJCQlzb3VyY2VfZ3JvdXAoIiR7bW9kZX0iIEZJTEVTICR7JHtzb3VyY2VzfX0gJHske2hlYWRlcnN9fSkKKwkJZW5kaWYoTk9UICR7bW9kZX0gTUFUQ0hFUyAic3BsaXQiKQorCWVuZGlmKCR7bW9kZX0gTUFUQ0hFUyAiZmxhdCIpCitlbmRtYWNybyhwcm9qZWN0X3NvdXJjZV9ncm91cCBtb2RlIHNvdXJjZXMgaGVhZGVycykKKwpkaWZmIC0tZ2l0IGEvY21ha2UvbW9kdWxlcy9XaW4zMk1hY3Jvcy5jbWFrZSBiL2NtYWtlL21vZHVsZXMvV2luMzJNYWNyb3MuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM4NWNjOQotLS0gL2Rldi9udWxsCisrKyBiL2NtYWtlL21vZHVsZXMvV2luMzJNYWNyb3MuY21ha2UKQEAgLTAsMCArMSw0NCBAQAorIworIyB3aW4zMiBtYWNyb3MgCisjIAorIyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNywgUmFsZiBIYWJhY2tlcgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlzIGFsbG93ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZiB0aGUgQlNEIGxpY2Vuc2UuCisjCisKK2lmIChXSU4zMikKKyAgICAjCisgICAgIyBhZGRFeHBsb3JlcldyYXBwZXIgY3JlYXRlcyBiYXRjaCBmaWxlcyBmb3IgZmFzdCBhY2Nlc3MgCisgICAgIyB0byB0aGUgYnVpbGQgZW52aXJvbm1lbnQgZnJvbSB0aGUgd2luMzIgZXhwbG9yZXIuIAorICAgICMgCisgICAgIyBGb3IgbWluZ3cgYW5kIG5tYWtlIHByb2plY3RzIGl0J3Mgb3BlbnMgYSBjb21tYW5kIHNoZWxsLAorICAgICMgZm9yIFZpc3VhbCBTdHVkaW8gSURFJ3MgKGF0IGxlYXN0IHRlc3RlZCB3aXRoIFZTIDggMjAwNSkgaXQKKyAgICAjIG9wZW5zIHRoZSByZWxhdGVkIC5zbG4gZmlsZSB3aXRoIHBhdGhzIHNldHRpbmcgc3BlY2lmaWVkIGF0IAorICAgICMgY29uZmlndXJlIHRpbWUuIAorICAgICMKKyAgICBNQUNSTyAoYWRkRXhwbG9yZXJXcmFwcGVyIF9wcm9qZWN0bmFtZSkKKyAgICAgICAgIyB3cml0ZSBleHBsb3JlciB3cmFwcGVycworICAgICAgICBnZXRfZmlsZW5hbWVfY29tcG9uZW50KENNQUtFX0JJTl9QQVRIICR7Q01BS0VfQ09NTUFORH0gUEFUSCkKKyAgICAgICAgc2V0IChBRERfUEFUSCAiJHtDTUFLRV9CSU5fUEFUSH0iKQorCisgICAgICAgIGlmIChRVF9RTUFLRV9FWEVDVVRBQkxFKQorICAgICAgICAgICAgZ2V0X2ZpbGVuYW1lX2NvbXBvbmVudChRVF9CSU5fUEFUSCAke1FUX1FNQUtFX0VYRUNVVEFCTEV9IFBBVEgpCisgICAgICAgICAgICBzZXQgKEFERF9QQVRIICIke0FERF9QQVRIfTske1FUX0JJTl9QQVRIfSIpCisgICAgICAgIGVuZGlmIChRVF9RTUFLRV9FWEVDVVRBQkxFKQorICAgICAgICAKKyAgICAgICAgIyBhZGQgaGVyZSBtb3JlIHBhdGhlcyAKKyAgICAgICAgCisgICAgICAgIGlmIChNSU5HVykKKyAgICAgICAgICAgIGdldF9maWxlbmFtZV9jb21wb25lbnQoTUlOR1dfQklOX1BBVEggJHtDTUFLRV9DWFhfQ09NUElMRVJ9IFBBVEgpCisgICAgICAgICAgICBzZXQgKEFERF9QQVRIICIke0FERF9QQVRIfTske01JTkdXX0JJTl9QQVRIfSIpCisgICAgICAgICAgICB3cml0ZV9maWxlICgke0NNQUtFX0JJTkFSWV9ESVJ9LyR7X3Byb2plY3RuYW1lfS1zaGVsbC5iYXQgInNldCBQQVRIPSR7QUREX1BBVEh9OyVQQVRIJVxuY21kLmV4ZSIpCisgICAgICAgIGVsc2UgKE1JTkdXKQorICAgICAgICAgICAgaWYgKENNQUtFX0JVSUxEX1RPT0wgU1RSRVFVQUwgICJubWFrZSIpCisgICAgICAgICAgICAgICAgZ2V0X2ZpbGVuYW1lX2NvbXBvbmVudChWQ19CSU5fUEFUSCAke0NNQUtFX0NYWF9DT01QSUxFUn0gUEFUSCkKKyAgICAgICAgICAgICAgICB3cml0ZV9maWxlICgke0NNQUtFX0JJTkFSWV9ESVJ9LyR7X3Byb2plY3RuYW1lfS1zaGVsbC5iYXQgInNldCBQQVRIPSR7QUREX1BBVEh9OyVQQVRIJVxuY2FsbCBcIiR7VkNfQklOX1BBVEh9XFx2Y3ZhcnMzMi5iYXRcIlxuY21kLmV4ZSIpCisgICAgICAgICAgICBlbHNlIChDTUFLRV9CVUlMRF9UT09MIFNUUkVRVUFMICAibm1ha2UiKQorICAgICAgICAgICAgICAgIHdyaXRlX2ZpbGUgKCR7Q01BS0VfQklOQVJZX0RJUn0vJHtfcHJvamVjdG5hbWV9LXNsbi5iYXQgInNldCBQQVRIPSR7QUREX1BBVEh9OyVQQVRIJVxuc3RhcnQgJHtfcHJvamVjdG5hbWV9LnNsbiIpCisgICAgICAgICAgICBlbmRpZiAoQ01BS0VfQlVJTERfVE9PTCBTVFJFUVVBTCAgIm5tYWtlIikKKyAgICAgICAgZW5kaWYgKE1JTkdXKQorICAgIEVORE1BQ1JPIChhZGRFeHBsb3JlcldyYXBwZXIpCitlbmRpZihXSU4zMikKZGlmZiAtLWdpdCBhL2NtYWtlL3Rlc3QvQ01ha2VMaXN0cy50eHQgYi9jbWFrZS90ZXN0L0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5ZTZlYjAKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFrZS90ZXN0L0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMTg4IEBACitpbmNsdWRlX2RpcmVjdG9yaWVzKCR7Q01BS0VfU09VUkNFX0RJUn0vLi4vdGVzdCkKKworYWRkX2RlZmluaXRpb25zKCR7REJVU19JTlRFUk5BTF9DTElFTlRfREVGSU5JVElPTlN9KQorCitpbmNsdWRlX2RpcmVjdG9yaWVzKCR7Q01BS0VfU09VUkNFX0RJUn0vLi4vdGVzdCkKKworc2V0KERCVVNfU0VTU0lPTl9CVVNfTElTVEVOX0FERFJFU1MgJHtURVNUX0xJU1RFTn0pCisKK2FkZF9saWJyYXJ5KGRidXMtdGVzdHV0aWxzIFNUQVRJQworICAgICR7Q01BS0VfU09VUkNFX0RJUn0vLi4vdGVzdC90ZXN0LXV0aWxzLmgKKyAgICAke0NNQUtFX1NPVVJDRV9ESVJ9Ly4uL3Rlc3QvdGVzdC11dGlscy5jCispCit0YXJnZXRfbGlua19saWJyYXJpZXMoZGJ1cy10ZXN0dXRpbHMgJHtEQlVTX0lOVEVSTkFMX0xJQlJBUklFU30pCisKK2FkZF9zdWJkaXJlY3RvcnkoIG5hbWUtdGVzdCApCisKK3NldCAobWFudWFsLWRpci1pdGVyX1NPVVJDRVMKKyAgICAke0NNQUtFX1NPVVJDRV9ESVJ9Ly4uL3Rlc3QvbWFudWFsLWRpci1pdGVyLmMKKykKKworc2V0ICh0ZXN0LXNlcnZpY2VfU09VUkNFUworICAgICR7Q01BS0VfU09VUkNFX0RJUn0vLi4vdGVzdC90ZXN0LXNlcnZpY2UuYworKQorCitzZXQgKHRlc3QtbmFtZXNfU09VUkNFUworICAgICR7Q01BS0VfU09VUkNFX0RJUn0vLi4vdGVzdC90ZXN0LW5hbWVzLmMKKykKKworc2V0IChicmVha19sb2FkZXJfU09VUkNFUworICAgICR7Q01BS0VfU09VUkNFX0RJUn0vLi4vdGVzdC9icmVhay1sb2FkZXIuYworKQorCitzZXQgKHRlc3Qtc2hlbGwtc2VydmljZV9TT1VSQ0VTCisgICAgJHtDTUFLRV9TT1VSQ0VfRElSfS8uLi90ZXN0L3Rlc3Qtc2hlbGwtc2VydmljZS5jCispCisKK3NldCAodGVzdC1zaGVsbF9TT1VSQ0VTCisgICAgICAgICR7Q01BS0VfU09VUkNFX0RJUn0vLi4vdGVzdC9zaGVsbC10ZXN0LmMKKykKKworc2V0ICh0ZXN0LXNwYXduX1NPVVJDRVMKKyAgICAke0NNQUtFX1NPVVJDRV9ESVJ9Ly4uL3Rlc3Qvc3Bhd24tdGVzdC5jCispCisKK3NldCAodGVzdC1leGl0X1NPVVJDRVMKKyAgICAke0NNQUtFX1NPVVJDRV9ESVJ9Ly4uL3Rlc3QvdGVzdC1leGl0LmMKKykKKworc2V0ICh0ZXN0LXNlZ2ZhdWx0X1NPVVJDRVMKKyAgICAke0NNQUtFX1NPVVJDRV9ESVJ9Ly4uL3Rlc3QvdGVzdC1zZWdmYXVsdC5jCispCisKK3NldCAodGVzdC1zbGVlcC1mb3JldmVyX1NPVVJDRVMKKyAgICAke0NNQUtFX1NPVVJDRV9ESVJ9Ly4uL3Rlc3QvdGVzdC1zbGVlcC1mb3JldmVyLmMKKykKKworc2V0IChtYW51YWwtdGNwX1NPVVJDRVMKKyAgICAke0NNQUtFX1NPVVJDRV9ESVJ9Ly4uL3Rlc3QvbWFudWFsLXRjcC5jCispCisKK3NldCAobWFudWFsLXBhdGhzX1NPVVJDRVMKKyAgICAke0NNQUtFX1NPVVJDRV9ESVJ9Ly4uL3Rlc3QvbWFudWFsLXBhdGhzLmMKKykKKworYWRkX2hlbHBlcl9leGVjdXRhYmxlKG1hbnVhbC1kaXItaXRlciAke21hbnVhbC1kaXItaXRlcl9TT1VSQ0VTfSAke0RCVVNfSU5URVJOQUxfTElCUkFSSUVTfSkKK2FkZF9oZWxwZXJfZXhlY3V0YWJsZSh0ZXN0LXNlcnZpY2UgJHt0ZXN0LXNlcnZpY2VfU09VUkNFU30gZGJ1cy10ZXN0dXRpbHMpCithZGRfaGVscGVyX2V4ZWN1dGFibGUodGVzdC1uYW1lcyAke3Rlc3QtbmFtZXNfU09VUkNFU30gZGJ1cy10ZXN0dXRpbHMpCithZGRfdGVzdF9leGVjdXRhYmxlKHRlc3Qtc2hlbGwgJHt0ZXN0LXNoZWxsX1NPVVJDRVN9ICR7REJVU19JTlRFUk5BTF9MSUJSQVJJRVN9KQorYWRkX3Rlc3RfZXhlY3V0YWJsZSh0ZXN0LXByaW50ZiAke0NNQUtFX1NPVVJDRV9ESVJ9Ly4uL3Rlc3QvaW50ZXJuYWxzL3ByaW50Zi5jIGRidXMtdGVzdHV0aWxzKQorYWRkX2hlbHBlcl9leGVjdXRhYmxlKHRlc3Qtc2hlbGwtc2VydmljZSAke3Rlc3Qtc2hlbGwtc2VydmljZV9TT1VSQ0VTfSBkYnVzLXRlc3R1dGlscykKK2FkZF9oZWxwZXJfZXhlY3V0YWJsZSh0ZXN0LXNwYXduICR7dGVzdC1zcGF3bl9TT1VSQ0VTfSAke0RCVVNfSU5URVJOQUxfTElCUkFSSUVTfSkKK2FkZF9oZWxwZXJfZXhlY3V0YWJsZSh0ZXN0LWV4aXQgJHt0ZXN0LWV4aXRfU09VUkNFU30gJHtEQlVTX0lOVEVSTkFMX0xJQlJBUklFU30pCithZGRfaGVscGVyX2V4ZWN1dGFibGUodGVzdC1zZWdmYXVsdCAke3Rlc3Qtc2VnZmF1bHRfU09VUkNFU30gJHtEQlVTX0lOVEVSTkFMX0xJQlJBUklFU30pCithZGRfaGVscGVyX2V4ZWN1dGFibGUodGVzdC1zbGVlcC1mb3JldmVyICR7dGVzdC1zbGVlcC1mb3JldmVyX1NPVVJDRVN9ICR7REJVU19JTlRFUk5BTF9MSUJSQVJJRVN9KQorYWRkX2hlbHBlcl9leGVjdXRhYmxlKG1hbnVhbC10Y3AgJHttYW51YWwtdGNwX1NPVVJDRVN9ICR7REJVU19JTlRFUk5BTF9MSUJSQVJJRVN9KQorYWRkX2hlbHBlcl9leGVjdXRhYmxlKG1hbnVhbC1iYWNrdHJhY2UgJHtDTUFLRV9TT1VSQ0VfRElSfS8uLi90ZXN0L21hbnVhbC1iYWNrdHJhY2UuYyBkYnVzLTEpCitpZihXSU4zMikKKyAgICBhZGRfaGVscGVyX2V4ZWN1dGFibGUobWFudWFsLXBhdGhzICR7bWFudWFsLXBhdGhzX1NPVVJDRVN9ICR7REJVU19JTlRFUk5BTF9MSUJSQVJJRVN9KQorZW5kaWYoKQorCitpZihEQlVTX1dJVEhfR0xJQikKKyAgICBtZXNzYWdlKFNUQVRVUyAid2l0aCBnbGliIHRlc3QgYXBwcyIpCisKKyAgICBhZGRfbGlicmFyeShkYnVzLXRlc3R1dGlscy1nbGliIFNUQVRJQworICAgICAgICAke0NNQUtFX1NPVVJDRV9ESVJ9Ly4uL3Rlc3QvdGVzdC11dGlscy1nbGliLmgKKyAgICAgICAgJHtDTUFLRV9TT1VSQ0VfRElSfS8uLi90ZXN0L3Rlc3QtdXRpbHMtZ2xpYi5jCisgICAgKQorICAgIHRhcmdldF9saW5rX2xpYnJhcmllcyhkYnVzLXRlc3R1dGlscy1nbGliIGRidXMtdGVzdHV0aWxzICR7REJVU19JTlRFUk5BTF9MSUJSQVJJRVN9KQorCisgICAgYWRkX2RlZmluaXRpb25zKAorICAgICAgICAke0dMSUIyX0RFRklOSVRJT05TfQorICAgICAgICAke0dPQkpFQ1RfREVGSU5JVElPTlN9CisgICAgKQorICAgIGluY2x1ZGVfZGlyZWN0b3JpZXMoCisgICAgICAgICR7R0xJQjJfSU5DTFVERV9ESVJ9CisgICAgICAgICR7R09CSkVDVF9JTkNMVURFX0RJUn0KKyAgICApCisKKyAgICBzZXQoVEVTVF9MSUJSQVJJRVMgJHtEQlVTX0lOVEVSTkFMX0xJQlJBUklFU30gZGJ1cy10ZXN0dXRpbHMgZGJ1cy10ZXN0dXRpbHMtZ2xpYiAke0dMSUIyX0xJQlJBUklFU30gJHtHT0JKRUNUX0xJQlJBUklFU30pCisKKyAgICBhZGRfdGVzdF9leGVjdXRhYmxlKHRlc3QtY29ycnVwdCAke0NNQUtFX1NPVVJDRV9ESVJ9Ly4uL3Rlc3QvY29ycnVwdC5jICR7VEVTVF9MSUJSQVJJRVN9KQorICAgIGFkZF90ZXN0X2V4ZWN1dGFibGUodGVzdC1kYnVzLWRhZW1vbiAke0NNQUtFX1NPVVJDRV9ESVJ9Ly4uL3Rlc3QvZGJ1cy1kYWVtb24uYyAke1RFU1RfTElCUkFSSUVTfSkKKyAgICBhZGRfdGVzdF9leGVjdXRhYmxlKHRlc3QtZGJ1cy1kYWVtb24tZWF2ZXNkcm9wICR7Q01BS0VfU09VUkNFX0RJUn0vLi4vdGVzdC9kYnVzLWRhZW1vbi1lYXZlc2Ryb3AuYyAke1RFU1RfTElCUkFSSUVTfSkKKyAgICBhZGRfdGVzdF9leGVjdXRhYmxlKHRlc3QtZmRwYXNzICR7Q01BS0VfU09VUkNFX0RJUn0vLi4vdGVzdC9mZHBhc3MuYyAke1RFU1RfTElCUkFSSUVTfSkKKyAgICBhZGRfdGVzdF9leGVjdXRhYmxlKHRlc3QtbG9vcGJhY2sgJHtDTUFLRV9TT1VSQ0VfRElSfS8uLi90ZXN0L2xvb3BiYWNrLmMgJHtURVNUX0xJQlJBUklFU30pCisgICAgYWRkX3Rlc3RfZXhlY3V0YWJsZSh0ZXN0LW1hcnNoYWwgJHtDTUFLRV9TT1VSQ0VfRElSfS8uLi90ZXN0L21hcnNoYWwuYyAke1RFU1RfTElCUkFSSUVTfSkKKyAgICBhZGRfdGVzdF9leGVjdXRhYmxlKHRlc3QtbW9uaXRvciAke0NNQUtFX1NPVVJDRV9ESVJ9Ly4uL3Rlc3QvbW9uaXRvci5jICR7VEVTVF9MSUJSQVJJRVN9KQorICAgIGFkZF90ZXN0X2V4ZWN1dGFibGUodGVzdC1yZWZzICR7Q01BS0VfU09VUkNFX0RJUn0vLi4vdGVzdC9pbnRlcm5hbHMvcmVmcy5jICR7VEVTVF9MSUJSQVJJRVN9KQorICAgIGFkZF90ZXN0X2V4ZWN1dGFibGUodGVzdC1yZWxheSAke0NNQUtFX1NPVVJDRV9ESVJ9Ly4uL3Rlc3QvcmVsYXkuYyAke1RFU1RfTElCUkFSSUVTfSkKKyAgICBhZGRfdGVzdF9leGVjdXRhYmxlKHRlc3Qtc2VydmVyLW9vbSAke0NNQUtFX1NPVVJDRV9ESVJ9Ly4uL3Rlc3QvaW50ZXJuYWxzL3NlcnZlci1vb20uYyAke1RFU1RfTElCUkFSSUVTfSkKKyAgICBhZGRfdGVzdF9leGVjdXRhYmxlKHRlc3Qtc3ludGF4ICR7Q01BS0VfU09VUkNFX0RJUn0vLi4vdGVzdC9zeW50YXguYyAke1RFU1RfTElCUkFSSUVTfSkKKyAgICBhZGRfdGVzdF9leGVjdXRhYmxlKHRlc3Qtc3lzbG9nICR7Q01BS0VfU09VUkNFX0RJUn0vLi4vdGVzdC9pbnRlcm5hbHMvc3lzbG9nLmMgJHtURVNUX0xJQlJBUklFU30pCisgICAgYWRkX3Rlc3RfZXhlY3V0YWJsZSh0ZXN0LXVpZC1wZXJtaXNzaW9ucyAke0NNQUtFX1NPVVJDRV9ESVJ9Ly4uL3Rlc3QvdWlkLXBlcm1pc3Npb25zLmMgJHtURVNUX0xJQlJBUklFU30pCisgICAgYWRkX2hlbHBlcl9leGVjdXRhYmxlKG1hbnVhbC1hdXRoeiAke0NNQUtFX1NPVVJDRV9ESVJ9Ly4uL3Rlc3QvbWFudWFsLWF1dGh6LmMgJHtURVNUX0xJQlJBUklFU30pCisgICAgYWRkX2hlbHBlcl9leGVjdXRhYmxlKG1hbnVhbC10ZXN0LXRocmVhZC1ibG9ja2luZyAke0NNQUtFX1NPVVJDRV9ESVJ9Ly4uL3Rlc3QvdGhyZWFkLWJsb2NraW5nLmMgJHtURVNUX0xJQlJBUklFU30pCitlbmRpZigpCisKKyMjIyBrZWVwIHRoZXNlIGluIGNyZWF0aW9uIG9yZGVyLCBpLmUuIHVwcGVybW9zdCBkaXJzIGZpcnN0IAorc2V0IChURVNURElSUworICAgIHRlc3QvZGF0YQorICAgIHRlc3QvZGF0YS92YWxpZC1tZXNzYWdlcworICAgIHRlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzCisgICAgdGVzdC9kYXRhL2luY29tcGxldGUtbWVzc2FnZXMKKyAgICB0ZXN0L2RhdGEvYXV0aAorICAgIHRlc3QvZGF0YS9zaGEtMQorICAgIHRlc3QvZGF0YS9zeXN0ZW1kLWFjdGl2YXRpb24KKyAgICB0ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzCisgICAgdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9iYXNpYy5kCisgICAgdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9zZXNzaW9uLmQKKyAgICB0ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzLXN5c3RlbQorICAgIHRlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMtc3lzdGVtL3N5c3RlbS5kCisgICAgdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzCisgICAgdGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMKKyAgICB0ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy1zeXN0ZW0KKyAgICB0ZXN0L2RhdGEvaW52YWxpZC1jb25maWctZmlsZXMKKyAgICB0ZXN0L2RhdGEvaW52YWxpZC1jb25maWctZmlsZXMtc3lzdGVtCisgICAgdGVzdC9kYXRhL2ludmFsaWQtbWVzc2FnZXMKKyAgICB0ZXN0L2RhdGEvaW52YWxpZC1zZXJ2aWNlLWZpbGVzLXN5c3RlbQorICAgIHRlc3QvZGF0YS9lcXVpdi1jb25maWctZmlsZXMKKyAgICB0ZXN0L2RhdGEvZXF1aXYtY29uZmlnLWZpbGVzL2Jhc2ljCisgICAgdGVzdC9kYXRhL2VxdWl2LWNvbmZpZy1maWxlcy9iYXNpYy9iYXNpYy5kCisgICAgdGVzdC9kYXRhL2VxdWl2LWNvbmZpZy1maWxlcy9lbnRpdGllcworICAgIHRlc3QvZGF0YS9lcXVpdi1jb25maWctZmlsZXMvZW50aXRpZXMvYmFzaWMuZAorKQorc2V0IChDT05GSUdfVkVSQk9TRSAwKQorCitGT1JFQUNIKERJUiAke1RFU1RESVJTfSkKKyAgICBGSUxFKE1BS0VfRElSRUNUT1JZICR7Q01BS0VfQklOQVJZX0RJUn0vJHtESVJ9KQorRU5ERk9SRUFDSChESVIpCisKKyMjIyBjb3B5IHRlc3RzIHRvIGJ1aWxkZGlyIHNvIHRoYXQgZ2VuZXJhdGVkIHRlc3RzIGFuZCBzdGF0aWMgdGVzdHMgCisjIyMgYXJlIGFsbCBpbiBvbmUgcGxhY2UuCitNRVNTQUdFKFNUQVRVUyAiQ29weWluZyB0ZXN0IGZpbGVzIHRvIHRlc3QgZGlyZWN0b3J5IikKK0ZPUkVBQ0goRklMRV9UWVBFICoubWVzc2FnZSAqLm1lc3NhZ2UtcmF3ICouYXV0aC1zY3JpcHQgKi5zaGExICoudHh0ICouY29uZiAqLnNlcnZpY2UpCisgICAgRk9SRUFDSChESVIgJHtURVNURElSU30pCisgICAgICAgIEZJTEUoR0xPQiBGSUxFUyAiJHtDTUFLRV9TT1VSQ0VfRElSfS8uLi8ke0RJUn0vJHtGSUxFX1RZUEV9IiApCisgICAgICAgIEZPUkVBQ0goRklMRSAke0ZJTEVTfSkKKyAgICAgICAgICAgIEdFVF9GSUxFTkFNRV9DT01QT05FTlQoRklMRU5BTUUgJHtGSUxFfSBOQU1FKQorICAgICAgICAgICAgU0VUIChUQVJHRVQgJHtDTUFLRV9CSU5BUllfRElSfS8ke0RJUn0vJHtGSUxFTkFNRX0pCisgICAgICAgICAgICBjb25maWd1cmVfZmlsZSgke0ZJTEV9ICR7VEFSR0VUfSBDT1BZT05MWSkKKyAgICAgICAgICAgIElGIChDT05GSUdfVkVSQk9TRSkKKyAgICAgICAgICAgICAgICBNRVNTQUdFKCIke0ZJTEV9IikKKyAgICAgICAgICAgIEVORElGIChDT05GSUdfVkVSQk9TRSkKKyAgICAgICAgRU5ERk9SRUFDSChGSUxFKQorICAgIEVOREZPUkVBQ0goRElSKQorRU5ERk9SRUFDSChGSUxFX1RZUEUpCisKKyMjIyBnZW5lcmF0ZSB0ZXN0IGZpbGVzCitNRVNTQUdFKFNUQVRVUyAiR2VuZXJhdGluZyB0ZXN0IGZpbGVzIGZyb20gdGVtcGxhdGVzIGludG8gdGVzdCBkaXJlY3RvcnkiKQorCitGT1JFQUNIKEZJTEVfVFlQRSAqLmNvbmYuaW4gKi5zZXJ2aWNlLmluKQorICBGT1JFQUNIKERJUiAke1RFU1RESVJTfSkKKyAgICBGSUxFKEdMT0IgRklMRVMgIiR7Q01BS0VfU09VUkNFX0RJUn0vLi4vJHtESVJ9LyR7RklMRV9UWVBFfSIgKQorICAgIEZPUkVBQ0goRklMRSAke0ZJTEVTfSkKKyAgICAgIEdFVF9GSUxFTkFNRV9DT01QT05FTlQoRklMRU5BTUUgJHtGSUxFfSBOQU1FKQorICAgICAgU1RSSU5HKFJFR0VYIFJFUExBQ0UgIlxcLmluJCIgIiIgRklMRU5BTUUgJHtGSUxFTkFNRX0pCisgICAgICBTRVQgKFRBUkdFVCAke0NNQUtFX0JJTkFSWV9ESVJ9LyR7RElSfS8ke0ZJTEVOQU1FfSkKKyAgICAgIGNvbmZpZ3VyZV9maWxlKCR7RklMRX0gJHtUQVJHRVR9IEBPTkxZIElNTUVESUFURSkKKyAgICAgIElGIChDT05GSUdfVkVSQk9TRSkKKyAgICAgICAgTUVTU0FHRSgiJHtGSUxFfSIpCisgICAgICBFTkRJRiAoQ09ORklHX1ZFUkJPU0UpCisgICAgRU5ERk9SRUFDSChGSUxFKQorICBFTkRGT1JFQUNIKERJUikKK0VOREZPUkVBQ0goRklMRV9UWVBFKQorCitNRVNTQUdFKFNUQVRVUyAiQ29weWluZyBnZW5lcmF0ZWQgYnVzIGNvbmZpZyBmaWxlcyB0byB0ZXN0IGRpcmVjdG9yeSIpCitjb25maWd1cmVfZmlsZSgiJHtDTUFLRV9TT1VSQ0VfRElSfS8uLi9idXMvc2Vzc2lvbi5jb25mLmluIiAke0NNQUtFX0JJTkFSWV9ESVJ9L3Rlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMvc2Vzc2lvbi5jb25mIEBPTkxZKQorY29uZmlndXJlX2ZpbGUoIiR7Q01BS0VfU09VUkNFX0RJUn0vLi4vYnVzL3N5c3RlbS5jb25mLmluIiAke0NNQUtFX0JJTkFSWV9ESVJ9L3Rlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMtc3lzdGVtL3N5c3RlbS5jb25mIEBPTkxZKQpkaWZmIC0tZ2l0IGEvY21ha2UvdGVzdC9uYW1lLXRlc3QvQ01ha2VMaXN0cy50eHQgYi9jbWFrZS90ZXN0L25hbWUtdGVzdC9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWZiMjhmCi0tLSAvZGV2L251bGwKKysrIGIvY21ha2UvdGVzdC9uYW1lLXRlc3QvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwxNSBAQAoraWYgKERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTKQorCitzZXQgKE5BTUV0ZXN0LURJUiAuLi8uLi8uLi90ZXN0L25hbWUtdGVzdCkKKworYWRkX2RlZmluaXRpb25zKCR7REJVU19JTlRFUk5BTF9DTElFTlRfREVGSU5JVElPTlN9KQorCithZGRfaGVscGVyX2V4ZWN1dGFibGUodGVzdC1wZW5kaW5nLWNhbGwtZGlzcGF0Y2ggJHtOQU1FdGVzdC1ESVJ9L3Rlc3QtcGVuZGluZy1jYWxsLWRpc3BhdGNoLmMgJHtEQlVTX0lOVEVSTkFMX0xJQlJBUklFU30pCithZGRfaGVscGVyX2V4ZWN1dGFibGUodGVzdC1wZW5kaW5nLWNhbGwtdGltZW91dCAke05BTUV0ZXN0LURJUn0vdGVzdC1wZW5kaW5nLWNhbGwtdGltZW91dC5jICR7REJVU19JTlRFUk5BTF9MSUJSQVJJRVN9KQorYWRkX2hlbHBlcl9leGVjdXRhYmxlKHRlc3QtdGhyZWFkLWluaXQgJHtOQU1FdGVzdC1ESVJ9L3Rlc3QtdGhyZWFkcy1pbml0LmMgJHtEQlVTX0lOVEVSTkFMX0xJQlJBUklFU30pCithZGRfaGVscGVyX2V4ZWN1dGFibGUodGVzdC1pZHMgJHtOQU1FdGVzdC1ESVJ9L3Rlc3QtaWRzLmMgJHtEQlVTX0lOVEVSTkFMX0xJQlJBUklFU30pCithZGRfaGVscGVyX2V4ZWN1dGFibGUodGVzdC1zaHV0ZG93biAke05BTUV0ZXN0LURJUn0vdGVzdC1zaHV0ZG93bi5jIGRidXMtdGVzdHV0aWxzKQorYWRkX2hlbHBlcl9leGVjdXRhYmxlKHRlc3QtcHJpdnNlcnZlciAke05BTUV0ZXN0LURJUn0vdGVzdC1wcml2c2VydmVyLmMgZGJ1cy10ZXN0dXRpbHMpCithZGRfaGVscGVyX2V4ZWN1dGFibGUodGVzdC1wcml2c2VydmVyLWNsaWVudCAke05BTUV0ZXN0LURJUn0vdGVzdC1wcml2c2VydmVyLWNsaWVudC5jIGRidXMtdGVzdHV0aWxzKQorYWRkX2hlbHBlcl9leGVjdXRhYmxlKHRlc3QtYXV0b2xhdW5jaCAke05BTUV0ZXN0LURJUn0vdGVzdC1hdXRvbGF1bmNoLmMgZGJ1cy10ZXN0dXRpbHMpCitlbmRpZiAoREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMpCmRpZmYgLS1naXQgYS9jbWFrZS90b29scy9DTWFrZUxpc3RzLnR4dCBiL2NtYWtlL3Rvb2xzL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2NzhiZGQKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFrZS90b29scy9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDkxIEBACithZGRfZGVmaW5pdGlvbnMoIi1EREJVU19DT01QSUxBVElPTiIpCisKK3NldCAoZGJ1c19zZW5kX1NPVVJDRVMKKwkuLi8uLi90b29scy9kYnVzLXByaW50LW1lc3NhZ2UuYwkJCQorCS4uLy4uL3Rvb2xzL2RidXMtcHJpbnQtbWVzc2FnZS5oCQkJCisJLi4vLi4vdG9vbHMvZGJ1cy1zZW5kLmMKKwkuLi8uLi90b29scy90b29sLWNvbW1vbi5jCisJLi4vLi4vdG9vbHMvdG9vbC1jb21tb24uaAorKQorCitzZXQgKGRidXNfbW9uaXRvcl9TT1VSQ0VTCisJLi4vLi4vdG9vbHMvZGJ1cy1tb25pdG9yLmMJCQkJCisJLi4vLi4vdG9vbHMvZGJ1cy1wcmludC1tZXNzYWdlLmMJCQkKKwkuLi8uLi90b29scy9kYnVzLXByaW50LW1lc3NhZ2UuaAorCS4uLy4uL3Rvb2xzL3Rvb2wtY29tbW9uLmMKKwkuLi8uLi90b29scy90b29sLWNvbW1vbi5oCispCisKK3NldCAoZGJ1c190ZXN0X3Rvb2xfU09VUkNFUworCS4uLy4uL3Rvb2xzL2RidXMtZWNoby5jCisJLi4vLi4vdG9vbHMvZGJ1cy1zcGFtLmMKKwkuLi8uLi90b29scy90b29sLWNvbW1vbi5jCisJLi4vLi4vdG9vbHMvdG9vbC1jb21tb24uaAorCS4uLy4uL3Rvb2xzL3Rlc3QtdG9vbC5jCisJLi4vLi4vdG9vbHMvdGVzdC10b29sLmgKKykKKworc2V0IChkYnVzX3VwZGF0ZV9hY3RpdmF0aW9uX2Vudmlyb25tZW50X1NPVVJDRVMKKwkuLi8uLi90b29scy9kYnVzLXVwZGF0ZS1hY3RpdmF0aW9uLWVudmlyb25tZW50LmMKKwkuLi8uLi90b29scy90b29sLWNvbW1vbi5jCisJLi4vLi4vdG9vbHMvdG9vbC1jb21tb24uaAorKQorCitpZiAoV0lOMzIpCitzZXQgKGRidXNfbGF1bmNoX1NPVVJDRVMKKwkuLi8uLi90b29scy9kYnVzLWxhdW5jaC13aW4uYworKQorZWxzZSAoV0lOMzIpCitzZXQgKGRidXNfbGF1bmNoX1NPVVJDRVMKKwkuLi8uLi90b29scy9kYnVzLWxhdW5jaC5jCisJLi4vLi4vdG9vbHMvdG9vbC1jb21tb24uYworCS4uLy4uL3Rvb2xzL3Rvb2wtY29tbW9uLmgKKykKK2VuZGlmIChXSU4zMikKKworaWYgKERCVVNfQlVJTERfWDExKQorc2V0IChkYnVzX2xhdW5jaF9TT1VSQ0VTCisgICAgICR7ZGJ1c19sYXVuY2hfU09VUkNFU30KKyAgICAgLi4vLi4vdG9vbHMvZGJ1cy1sYXVuY2gteDExLmMKKykKK2luY2x1ZGVfZGlyZWN0b3JpZXMoJHtYMTFfSU5DTFVERV9ESVJ9KQorZW5kaWYoREJVU19CVUlMRF9YMTEpCisKK3NldCAoZGJ1c19jbGVhbnVwX3NvY2tldHNfU09VUkNFUworCS4uLy4uL3Rvb2xzL2RidXMtY2xlYW51cC1zb2NrZXRzLmMKKykKKworYWRkX2V4ZWN1dGFibGUoZGJ1cy1zZW5kICR7ZGJ1c19zZW5kX1NPVVJDRVN9KQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKGRidXMtc2VuZCAke0RCVVNfTElCUkFSSUVTfSkKK2luc3RhbGwoVEFSR0VUUyBkYnVzLXNlbmQgJHtJTlNUQUxMX1RBUkdFVFNfREVGQVVMVF9BUkdTfSkKKworYWRkX2V4ZWN1dGFibGUoZGJ1cy10ZXN0LXRvb2wgJHtkYnVzX3Rlc3RfdG9vbF9TT1VSQ0VTfSkKK3RhcmdldF9saW5rX2xpYnJhcmllcyhkYnVzLXRlc3QtdG9vbCAke0RCVVNfTElCUkFSSUVTfSkKK2luc3RhbGwoVEFSR0VUUyBkYnVzLXRlc3QtdG9vbCAke0lOU1RBTExfVEFSR0VUU19ERUZBVUxUX0FSR1N9KQorCitpZihXSU4zMiBBTkQgTk9UIE1TVkMpCisgICAgIyBhdm9pZCBkYnVzLXVwZGF0ZS1hY3RpdmF0aW9uLWVudmlyb25tZW50IHRyaWdnZXJpbmcgVUFDCisgICAgIyAxIGlzIHRoZSByZXNvdXJjZSBJRCwgSURfTUFOSUZFU1QKKyAgICAjIDI0IGlzIHRoZSByZXNvdXJjZSB0eXBlLCBSVF9NQU5JRkVTVAorICAgICMgY29uc3RhbnRzIGFyZSB1c2VkIGJlY2F1c2Ugb2YgYSBidWcgaW4gd2luZHJlcworICAgICMgc2VlIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzMzMDAwMTU4L2VtYmVkLW1hbmlmZXN0LWZpbGUtdG8tcmVxdWlyZS1hZG1pbmlzdHJhdG9yLWV4ZWN1dGlvbi1sZXZlbC13aXRoLW1pbmd3MzIKKyAgICBmaWxlKFdSSVRFICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9kaXNhYmxlLXVhYy5yYyAiMSAyNCBcIiR7Q01BS0VfU09VUkNFX0RJUn0vLi4vdG9vbHMvV2luMzIuTWFuaWZlc3RcIlxuIikKKyAgICBsaXN0KEFQUEVORCBkYnVzX3VwZGF0ZV9hY3RpdmF0aW9uX2Vudmlyb25tZW50X1NPVVJDRVMgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2Rpc2FibGUtdWFjLnJjKQorZW5kaWYoKQorYWRkX2V4ZWN1dGFibGUoZGJ1cy11cGRhdGUtYWN0aXZhdGlvbi1lbnZpcm9ubWVudCAke2RidXNfdXBkYXRlX2FjdGl2YXRpb25fZW52aXJvbm1lbnRfU09VUkNFU30pCit0YXJnZXRfbGlua19saWJyYXJpZXMoZGJ1cy11cGRhdGUtYWN0aXZhdGlvbi1lbnZpcm9ubWVudCAke0RCVVNfTElCUkFSSUVTfSkKK2luc3RhbGwoVEFSR0VUUyBkYnVzLXVwZGF0ZS1hY3RpdmF0aW9uLWVudmlyb25tZW50ICR7SU5TVEFMTF9UQVJHRVRTX0RFRkFVTFRfQVJHU30pCisKK2FkZF9leGVjdXRhYmxlKGRidXMtbGF1bmNoICR7ZGJ1c19sYXVuY2hfU09VUkNFU30pCit0YXJnZXRfbGlua19saWJyYXJpZXMoZGJ1cy1sYXVuY2ggJHtEQlVTX0xJQlJBUklFU30pCitpZiAoREJVU19CVUlMRF9YMTEpCisgIHRhcmdldF9saW5rX2xpYnJhcmllcyhkYnVzLWxhdW5jaCAke1gxMV9MSUJSQVJJRVN9ICkKK2VuZGlmIChEQlVTX0JVSUxEX1gxMSkKK2luc3RhbGwoVEFSR0VUUyBkYnVzLWxhdW5jaCAke0lOU1RBTExfVEFSR0VUU19ERUZBVUxUX0FSR1N9KQorCithZGRfZXhlY3V0YWJsZShkYnVzLW1vbml0b3IgJHtkYnVzX21vbml0b3JfU09VUkNFU30pCit0YXJnZXRfbGlua19saWJyYXJpZXMoZGJ1cy1tb25pdG9yICR7REJVU19MSUJSQVJJRVN9KQoraW5zdGFsbChUQVJHRVRTIGRidXMtbW9uaXRvciAke0lOU1RBTExfVEFSR0VUU19ERUZBVUxUX0FSR1N9KQorCisjIGNyZWF0ZSB0aGUgL3Zhci9saWIvZGJ1cyBkaXJlY3RvcnkgZm9yIGRidXMtdXVpZGdlbgoraW5zdGFsbChESVJFQ1RPUlkgREVTVElOQVRJT04gdmFyL2xpYi9kYnVzKQpkaWZmIC0tZ2l0IGEvY21ha2UveDg2XzY0LXc2NC1taW5ndzMyLmNtYWtlIGIvY21ha2UveDg2XzY0LXc2NC1taW5ndzMyLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2OWJmZGQKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFrZS94ODZfNjQtdzY0LW1pbmd3MzIuY21ha2UKQEAgLTAsMCArMSwxOSBAQAorIyBUb29sY2hhaW4gZm9yIG1pbmd3LXc2NCA2NC1iaXQgY29tcGlsZXJzLCBhcyBzaGlwcGVkIGluIERlYmlhbi9VYnVudHUuCisKK3NldChHTlVfSE9TVCB4ODZfNjQtdzY0LW1pbmd3MzIpCitzZXQoQ01BS0VfU1lTVEVNX1BST0NFU1NPUiAieDg2XzY0IikKKworc2V0KENPTVBJTEVSX1BSRUZJWCAiJHtHTlVfSE9TVH0tIikKKworc2V0KENNQUtFX1NZU1RFTV9OQU1FICJXaW5kb3dzIikKK3NldChDTUFLRV9DUk9TU0NPTVBJTElORyBUUlVFKQorc2V0KFdJTjMyIFRSVUUpCitzZXQoTUlOR1cgVFJVRSkKKworc2V0KENNQUtFX0NfQ09NUElMRVIgJHtDT01QSUxFUl9QUkVGSVh9Z2NjKQorc2V0KENNQUtFX0NYWF9DT01QSUxFUiAke0NPTVBJTEVSX1BSRUZJWH1nKyspCitzZXQoQ01BS0VfUkNfQ09NUElMRVIgJHtDT01QSUxFUl9QUkVGSVh9d2luZHJlcykKKworc2V0KENNQUtFX0ZJTkRfUk9PVF9QQVRIX01PREVfUFJPR1JBTSBORVZFUikKK3NldChDTUFLRV9GSU5EX1JPT1RfUEFUSF9NT0RFX0xJQlJBUlkgT05MWSkKK3NldChDTUFLRV9GSU5EX1JPT1RfUEFUSF9NT0RFX0lOQ0xVREUgT05MWSkKZGlmZiAtLWdpdCBhL2NvbmZpZy5oIGIvY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY1ZTExZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbmZpZy5oCkBAIC0wLDAgKzEsNTM0IEBACisvKiBjb25maWcuaC4gIEdlbmVyYXRlZCBmcm9tIGNvbmZpZy5oLmluIGJ5IGNvbmZpZ3VyZS4gICovCisvKiBjb25maWcuaC5pbi4gIEdlbmVyYXRlZCBmcm9tIGNvbmZpZ3VyZS5hYyBieSBhdXRvaGVhZGVyLiAgKi8KKworLyogRGVmaW5lIGlmIGJ1aWxkaW5nIHVuaXZlcnNhbCAoaW50ZXJuYWwgaGVscGVyIG1hY3JvKSAqLworLyogI3VuZGVmIEFDX0FQUExFX1VOSVZFUlNBTF9CVUlMRCAqLworCisvKiBwb2xsIGRvZXNuJ3Qgd29yayBvbiBkZXZpY2VzICovCisvKiAjdW5kZWYgQlJPS0VOX1BPTEwgKi8KKworLyogRGlyZWN0b3J5IGZvciBpbnN0YWxsaW5nIHRoZSBiaW5hcmllcyAqLworI2RlZmluZSBEQlVTX0JJTkRJUiAiL3N5c3RlbS9iaW4iCisKKy8qIERlZmluZSB0byBidWlsZCBYMTEgZnVuY3Rpb25hbGl0eSAqLworLyogI3VuZGVmIERCVVNfQlVJTERfWDExICovCisKKy8qIHdoZXRoZXIgLWV4cG9ydC1keW5hbWljIHdhcyBwYXNzZWQgdG8gbGlidG9vbCAqLworLyogI3VuZGVmIERCVVNfQlVJTFRfUl9EWU5BTUlDICovCisKKy8qIFVzZSBpbm90aWZ5ICovCisjZGVmaW5lIERCVVNfQlVTX0VOQUJMRV9JTk9USUZZIDEKKworLyogVXNlIGtxdWV1ZSAqLworLyogI3VuZGVmIERCVVNfQlVTX0VOQUJMRV9LUVVFVUUgKi8KKworLyogRGlyZWN0b3J5IHRvIGNoZWNrIGZvciBjb25zb2xlIG93bmVyaGlwICovCisjZGVmaW5lIERCVVNfQ09OU09MRV9BVVRIX0RJUiAiL2V0YyIKKworLyogRmlsZSB0byBjaGVjayBmb3IgY29uc29sZSBvd25lcmhpcCAqLworLyogI3VuZGVmIERCVVNfQ09OU09MRV9PV05FUl9GSUxFICovCisKKy8qIERlZmluZWQgaWYgd2UgcnVuIG9uIGEgY3lnd2luIEFQSSBiYXNlZCBzeXN0ZW0gKi8KKy8qICN1bmRlZiBEQlVTX0NZR1dJTiAqLworCisvKiBEaXJlY3RvcnkgZm9yIGluc3RhbGxpbmcgdGhlIERCVVMgZGFlbW9uICovCisjZGVmaW5lIERCVVNfREFFTU9ORElSICIvc3lzdGVtL2JpbiIKKworLyogTmFtZSBvZiBleGVjdXRhYmxlICovCisjZGVmaW5lIERCVVNfREFFTU9OX05BTUUgImRidXMtZGFlbW9uIgorCisvKiBEaXJlY3RvcnkgZm9yIGluc3RhbGxpbmcgREJVUyBkYXRhIGZpbGVzICovCisjZGVmaW5lIERCVVNfREFUQURJUiAiL2RhdGEiCisKKy8qIERpc2FibGUgYXNzZXJ0aW9uIGNoZWNraW5nICovCisvKiAjdW5kZWYgREJVU19ESVNBQkxFX0FTU0VSVCAqLworCisvKiBEaXNhYmxlIHB1YmxpYyBBUEkgc2FuaXR5IGNoZWNraW5nICovCisvKiAjdW5kZWYgREJVU19ESVNBQkxFX0NIRUNLUyAqLworCisvKiBEZWZpbmUgdG8gYnVpbGQgdGVzdCBjb2RlIGludG8gdGhlIGxpYnJhcnkgYW5kIGJpbmFyaWVzICovCisvKiAjdW5kZWYgREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMgKi8KKworLyogVXNlIGxhdW5jaGQgYXV0b2xhdW5jaCAqLworLyogI3VuZGVmIERCVVNfRU5BQkxFX0xBVU5DSEQgKi8KKworLyogRGVmaW5lIHRvIGJ1aWxkIGluZGVwZW5kZW50IHRlc3QgYmluYXJpZXMgKi8KKy8qICN1bmRlZiBEQlVTX0VOQUJMRV9NT0RVTEFSX1RFU1RTICovCisKKy8qIERlZmluZSB0byBlbmFibGUgYnVzIGRhZW1vbiB1c2FnZSBzdGF0aXN0aWNzICovCisvKiAjdW5kZWYgREJVU19FTkFCTEVfU1RBVFMgKi8KKworLyogU3VwcG9ydCBhIHZlcmJvc2UgbW9kZSAqLworLyogI3VuZGVmIERCVVNfRU5BQkxFX1ZFUkJPU0VfTU9ERSAqLworCisvKiBEZWZpbmUgdG8gZW5hYmxlIFgxMSBhdXRvLWxhdW5jaCAqLworLyogI3VuZGVmIERCVVNfRU5BQkxFX1gxMV9BVVRPTEFVTkNIICovCisKKy8qIEV4dGVuc2lvbiBmb3IgZXhlY3V0YWJsZXMsIHR5cGljYWxseSBlbXB0eSBvciAuZXhlICovCisjZGVmaW5lIERCVVNfRVhFRVhUICIiCisKKy8qIERlZmluZWQgaWYgZ2NvdiBpcyBlbmFibGVkIHRvIGZvcmNlIGEgcmVidWlsZCBkdWUgdG8gY29uZmlnLmggY2hhbmdpbmcgKi8KKy8qICN1bmRlZiBEQlVTX0dDT1ZfRU5BQkxFRCAqLworCisvKiBEZWZpbmUgdG8gdXNlIGVwb2xsKDQpIG9uIExpbnV4ICovCisjZGVmaW5lIERCVVNfSEFWRV9MSU5VWF9FUE9MTCAxCisKKy8qIERlZmluZSB0byBwcmludGYgbW9kaWZpZXIgZm9yIDY0IGJpdCBpbnRlZ2VyIHR5cGUgKi8KKyNkZWZpbmUgREJVU19JTlQ2NF9QUklOVEZfTU9ESUZJRVIgImxsIgorCisvKiBEaXJlY3RvcnkgZm9yIGluc3RhbGxpbmcgdGhlIGxpYmV4ZWMgYmluYXJpZXMgKi8KKyNkZWZpbmUgREJVU19MSUJFWEVDRElSICIvc3lzdGVtL2JpbiIKKworLyogUHJlZml4IGZvciBpbnN0YWxsaW5nIERCVVMgKi8KKyNkZWZpbmUgREJVU19QUkVGSVggIi9zeXN0ZW0iCisKKy8qIEZhbGxiYWNrIGFkZHJlc3MgZm9yIHNlc3Npb24gYnVzIGNsaWVudHMgKi8KKyNkZWZpbmUgREJVU19TRVNTSU9OX0JVU19DT05ORUNUX0FERFJFU1MgImF1dG9sYXVuY2g6IgorCisvKiBXaGVyZSBwZXItc2Vzc2lvbiBidXMgcHV0cyBpdHMgc29ja2V0cyAqLworI2RlZmluZSBEQlVTX1NFU1NJT05fU09DS0VUX0RJUiAiL2RhdGEiCisKKy8qIFRoZSBkZWZhdWx0IEQtQnVzIGFkZHJlc3Mgb2YgdGhlIHN5c3RlbSBidXMgKi8KKyNkZWZpbmUgREJVU19TWVNURU1fQlVTX0RFRkFVTFRfQUREUkVTUyAidW5peDpwYXRoPSJEQlVTX1NZU1RFTV9TT0NLRVQKKworLyogVGhlIG5hbWUgb2YgdGhlIHNvY2tldCB0aGUgc3lzdGVtIGJ1cyBsaXN0ZW5zIG9uIGJ5IGRlZmF1bHQgKi8KKyNkZWZpbmUgREJVU19TWVNURU1fU09DS0VUICIvZGV2L3NvY2tldC9kYnVzIgorCisvKiBGdWxsIHBhdGggdG8gdGhlIGRhZW1vbiBpbiB0aGUgYnVpbGRkaXIgKi8KKyNkZWZpbmUgREJVU19URVNUX0VYRUMgIi9zeXN0ZW0vYmluL2RidXMtdGVzdCIKKworLyogRnVsbCBwYXRoIHRvIHRoZSBsYXVuY2ggaGVscGVyIHRlc3QgcHJvZ3JhbSBpbiB0aGUgYnVpbGRkaXIgKi8KKyNkZWZpbmUgREJVU19URVNUX0xBVU5DSF9IRUxQRVJfQklOQVJZICIvc3lzdGVtL2Jpbi9kYnVzLWRhZW1vbi1sYXVuY2gtaGVscGVyLXRlc3QiCisKKy8qIFdoZXJlIHRvIHB1dCB0ZXN0IHNvY2tldHMgKi8KKyNkZWZpbmUgREJVU19URVNUX1NPQ0tFVF9ESVIgIi9kYXRhIgorCisvKiBVbnByaXZpbGVnZWQgdXNlciB1c2VkIGluIHNvbWUgcmVncmVzc2lvbiB0ZXN0cyAqLworI2RlZmluZSBEQlVTX1RFU1RfVVNFUiAibm9ib2R5IgorCisvKiBEZWZpbmVkIGlmIHdlIHJ1biBvbiBhIFVuaXgtYmFzZWQgc3lzdGVtICovCisjZGVmaW5lIERCVVNfVU5JWCAxCisKKy8qIFVzZXIgZm9yIHJ1bm5pbmcgdGhlIHN5c3RlbSBCVVMgZGFlbW9uICovCisvKiAjdW5kZWYgREJVU19VU0VSICJtZXNzYWdlYnVzIiAqLworCisvKiBVc2UgdGhlIGdjYyBfX3N5bmMgZXh0ZW5zaW9uICovCisjZGVmaW5lIERCVVNfVVNFX1NZTkMgMQorCisvKiBBICd2YV9jb3B5JyBzdHlsZSBmdW5jdGlvbiAqLworI2RlZmluZSBEQlVTX1ZBX0NPUFkgdmFfY29weQorCisvKiAndmFfbGlzdHMnIGNhbm5vdCBiZSBjb3BpZXMgYXMgdmFsdWVzICovCisvKiAjdW5kZWYgREJVU19WQV9DT1BZX0FTX0FSUkFZICovCisKKy8qIERlZmluZWQgaWYgd2UgcnVuIG9uIGEgVzMyIEFQSSBiYXNlZCBzeXN0ZW0gKi8KKy8qICN1bmRlZiBEQlVTX1dJTiAqLworCisvKiBEZWZpbmVkIGlmIHdlIHJ1biBvbiBhIFczMiBDRSBBUEkgYmFzZWQgc3lzdGVtICovCisvKiAjdW5kZWYgREJVU19XSU5DRSAqLworCisvKiBEZWZpbmUgaWYgR0xpYiwgR09iamVjdCwgR0lPIGFyZSBhdmFpbGFibGUgKi8KKy8qICN1bmRlZiBEQlVTX1dJVEhfR0xJQiAqLworCisvKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgY29ubmVjdGlvbnMgdGhhdCBjYW4gYmUgaGFuZGxlZCBhdCBvbmNlICovCisvKiAjdW5kZWYgRkRfU0VUU0laRSAqLworCisvKiBUaGUgbmFtZSBvZiB0aGUgZ2V0dGV4dCBkb21haW4gKi8KKy8qICN1bmRlZiBHRVRURVhUX1BBQ0tBR0UgImRidXMtMSIgKi8KKworLyogUHJldmVudCBwb3N0LTIuMzggQVBJcyAqLworI2RlZmluZSBHTElCX1ZFUlNJT05fTUFYX0FMTE9XRUQgR0xJQl9WRVJTSU9OXzJfMzgKKworLyogSWdub3JlIHBvc3QtMi4zNiBkZXByZWNhdGlvbnMgKi8KKyNkZWZpbmUgR0xJQl9WRVJTSU9OX01JTl9SRVFVSVJFRCBHTElCX1ZFUlNJT05fMl8zNgorCisvKiBEaXNhYmxlIEdMaWIgcHVibGljIEFQSSBzYW5pdHkgY2hlY2tpbmcgKi8KKy8qICN1bmRlZiBHX0RJU0FCTEVfQ0hFQ0tTICovCisKKy8qIEhhdmUgYWJzdHJhY3Qgc29ja2V0IG5hbWVzcGFjZSAqLworI2RlZmluZSBIQVZFX0FCU1RSQUNUX1NPQ0tFVFMgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGFjY2VwdDQnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX0FDQ0VQVDQgMQorCisvKiBBZHQgYXVkaXQgQVBJICovCisvKiAjdW5kZWYgSEFWRV9BRFQgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxhbGxvY2EuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfQUxMT0NBX0ggMQorCisvKiBBcHBBcm1vciBTdXBwb3J0ICovCisvKiAjdW5kZWYgSEFWRV9BUFBBUk1PUiAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSBiYWNrdHJhY2UoKS4gKi8KKy8qICN1bmRlZiBIQVZFX0JBQ0tUUkFDRSAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGJ5dGVzd2FwLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX0JZVEVTV0FQX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGNsZWFyZW52JyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9DTEVBUkVOViAxCisKKy8qIEhhdmUgY21zZ2NyZWQgc3RydWN0dXJlICovCisvKiAjdW5kZWYgSEFWRV9DTVNHQ1JFRCAqLworCisvKiBIYXZlIGNvbnNvbGUgb3duZXIgZmlsZSAqLworLyogI3VuZGVmIEhBVkVfQ09OU09MRV9PV05FUl9GSUxFICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8Y3J0X2V4dGVybnMuaD4gaGVhZGVyIGZpbGUuICovCisvKiAjdW5kZWYgSEFWRV9DUlRfRVhURVJOU19IICovCisKKy8qIEhhdmUgdGhlIGRkZmQgbWVtYmVyIG9mIERJUiAqLworLyogI3VuZGVmIEhBVkVfRERGRCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgZGVjbGFyYXRpb24gb2YgYExPR19QRVJST1InLCBhbmQgdG8gMCBpZiB5b3UKKyAgIGRvbid0LiAqLworI2RlZmluZSBIQVZFX0RFQ0xfTE9HX1BFUlJPUiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBkZWNsYXJhdGlvbiBvZiBgTVNHX05PU0lHTkFMJywgYW5kIHRvIDAgaWYgeW91CisgICBkb24ndC4gKi8KKyNkZWZpbmUgSEFWRV9ERUNMX01TR19OT1NJR05BTCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8ZGlyZW50Lmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX0RJUkVOVF9IIDEKKworLyogSGF2ZSBkaXJmZCBmdW5jdGlvbiAqLworLyogI3VuZGVmIEhBVkVfRElSRkQgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxkbGZjbi5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9ETEZDTl9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxlcnJuby5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9FUlJOT19IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxleGVjaW5mby5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9FWEVDSU5GT19IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxleHBhdC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9FWFBBVF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBmcGF0aGNvbmYnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIEhBVkVfRlBBVEhDT05GICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZ2V0Z3JvdXBsaXN0JyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9HRVRHUk9VUExJU1QgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldHBlZXJlaWQnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIEhBVkVfR0VUUEVFUkVJRCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldHBlZXJ1Y3JlZCcgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgSEFWRV9HRVRQRUVSVUNSRUQgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXRyZXN1aWQnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX0dFVFJFU1VJRCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZ2V0cmxpbWl0JyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9HRVRSTElNSVQgMQorCisvKiBIYXZlIEdOVS1zdHlsZSB2YXJhcmdzIG1hY3JvcyAqLworLyogI3VuZGVmIEhBVkVfR05VQ19WQVJBUkdTICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgaW5vdGlmeV9pbml0MScgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfSU5PVElGWV9JTklUMSAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8aW50dHlwZXMuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfSU5UVFlQRVNfSCAxCisKKy8qIEhhdmUgSVNPIEM5OSB2YXJhcmdzIG1hY3JvcyAqLworI2RlZmluZSBIQVZFX0lTT19WQVJBUkdTIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBpc3NldHVnaWQnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIEhBVkVfSVNTRVRVR0lEICovCisKKy8qIGF1ZGl0IGRhZW1vbiBTRUxpbnV4IHN1cHBvcnQgKi8KKy8qICN1bmRlZiBIQVZFX0xJQkFVRElUICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgbnNsJyBsaWJyYXJ5ICgtbG5zbCkuICovCisvKiAjdW5kZWYgSEFWRV9MSUJOU0wgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBsb2NhbGVjb252JyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9MT0NBTEVDT05WIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxsb2NhbGUuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfTE9DQUxFX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG1lbW9yeS5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9NRU1PUllfSCAxCisKKy8qIERlZmluZSBpZiB3ZSBoYXZlIENMT0NLX01PTk9UT05JQyAqLworI2RlZmluZSBIQVZFX01PTk9UT05JQ19DTE9DSyAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgbmFub3NsZWVwJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9OQU5PU0xFRVAgMQorCisvKiBIYXZlIG5vbi1QT1NJWCBmdW5jdGlvbiBnZXRwd25hbV9yICovCisvKiAjdW5kZWYgSEFWRV9OT05QT1NJWF9HRVRQV05BTV9SICovCisKKy8qIERlZmluZSBpZiB5b3VyIHN5c3RlbSBuZWVkcyBfTlNHZXRFbnZpcm9uIHRvIHNldCB1cCB0aGUgZW52aXJvbm1lbnQgKi8KKy8qICN1bmRlZiBIQVZFX05TR0VURU5WSVJPTiAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHBpcGUyJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9QSVBFMiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgcG9sbCcgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfUE9MTCAxCisKKy8qIEhhdmUgUE9TSVggZnVuY3Rpb24gZ2V0cHduYW1fciAqLworLyogI3VuZGVmIEhBVkVfUE9TSVhfR0VUUFdOQU1fUiAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHByY3RsJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9QUkNUTCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgcmFpc2UnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX1JBSVNFIDEKKworLyogU0VMaW51eCBzdXBwb3J0ICovCisvKiAjdW5kZWYgSEFWRV9TRUxJTlVYICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2V0ZW52JyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9TRVRFTlYgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNldGxvY2FsZScgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfU0VUTE9DQUxFIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzZXRyZXN1aWQnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX1NFVFJFU1VJRCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2V0cmxpbWl0JyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9TRVRSTElNSVQgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHNpZ25hbC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9TSUdOQUxfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc29ja2V0cGFpcicgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfU09DS0VUUEFJUiAxCisKKy8qIEhhdmUgc29ja2xlbl90IHR5cGUgKi8KKyNkZWZpbmUgSEFWRV9TT0NLTEVOX1QgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGludC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9TVERJTlRfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RkbGliLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX1NURExJQl9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmdzLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX1NUUklOR1NfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5nLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX1NUUklOR19IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdHJ0b2xsJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9TVFJUT0xMIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdHJ0b3VsbCcgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfU1RSVE9VTEwgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5c2xvZy5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9TWVNMT0dfSCAxCisKKy8qIEhhdmUgc3lzdGVtZCAqLworLyogI3VuZGVmIEhBVkVfU1lTVEVNRCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9pbm90aWZ5Lmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX1NZU19JTk9USUZZX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9wcmN0bC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9TWVNfUFJDVExfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3Jlc291cmNlLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX1NZU19SRVNPVVJDRV9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvc3RhdC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9TWVNfU1RBVF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvc3lzbGltaXRzLmg+IGhlYWRlciBmaWxlLiAqLworLyogI3VuZGVmIEhBVkVfU1lTX1NZU0xJTUlUU19IICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3R5cGVzLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX1NZU19UWVBFU19IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvdWlvLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX1NZU19VSU9fSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8dW5pc3RkLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX1VOSVNURF9IIDEKKworLyogU3VwcG9ydHMgc2VuZGluZyBVTklYIGZpbGUgZGVzY3JpcHRvcnMgKi8KKyNkZWZpbmUgSEFWRV9VTklYX0ZEX1BBU1NJTkcgMQorCisvKiBIYXZlIHVucGNiaWQgc3RydWN0dXJlICovCisvKiAjdW5kZWYgSEFWRV9VTlBDQklEICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgdW5zZXRlbnYnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX1VOU0VURU5WIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGB1c2xlZXAnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX1VTTEVFUCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgdmFzcHJpbnRmJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9WQVNQUklOVEYgMQorCisvKiBEZWZpbmUgdG8gMSBvciAwLCBkZXBlbmRpbmcgd2hldGhlciB0aGUgY29tcGlsZXIgc3VwcG9ydHMgc2ltcGxlIHZpc2liaWxpdHkKKyAgIGRlY2xhcmF0aW9ucy4gKi8KKyNkZWZpbmUgSEFWRV9WSVNJQklMSVRZIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGB2c25wcmludGYnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX1ZTTlBSSU5URiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgd3JpdGV2JyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9XUklURVYgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHdzMnRjcGlwLmg+IGhlYWRlciBmaWxlLiAqLworLyogI3VuZGVmIEhBVkVfV1MyVENQSVBfSCAqLworCisvKiBEZWZpbmUgdG8gdGhlIHN1Yi1kaXJlY3Rvcnkgd2hlcmUgbGlidG9vbCBzdG9yZXMgdW5pbnN0YWxsZWQgbGlicmFyaWVzLiAqLworI2RlZmluZSBMVF9PQkpESVIgIi5saWJzLyIKKworLyogTmFtZSBvZiBwYWNrYWdlICovCisjZGVmaW5lIFBBQ0tBR0UgImRidXMiCisKKy8qIERlZmluZSB0byB0aGUgYWRkcmVzcyB3aGVyZSBidWcgcmVwb3J0cyBmb3IgdGhpcyBwYWNrYWdlIHNob3VsZCBiZSBzZW50LiAqLworLyogI3VuZGVmIFBBQ0tBR0VfQlVHUkVQT1JUICovCisKKy8qIERlZmluZSB0byB0aGUgZnVsbCBuYW1lIG9mIHRoaXMgcGFja2FnZS4gKi8KKyNkZWZpbmUgUEFDS0FHRV9OQU1FICJkYnVzIgorCisvKiBEZWZpbmUgdG8gdGhlIGZ1bGwgbmFtZSBhbmQgdmVyc2lvbiBvZiB0aGlzIHBhY2thZ2UuICovCisjZGVmaW5lIFBBQ0tBR0VfU1RSSU5HICJkYnVzLTEuMTAuMTIiCisKKy8qIERlZmluZSB0byB0aGUgb25lIHN5bWJvbCBzaG9ydCBuYW1lIG9mIHRoaXMgcGFja2FnZS4gKi8KKy8qICN1bmRlZiBQQUNLQUdFX1RBUk5BTUUgKi8KKworLyogRGVmaW5lIHRvIHRoZSBob21lIHBhZ2UgZm9yIHRoaXMgcGFja2FnZS4gKi8KKyNkZWZpbmUgUEFDS0FHRV9VUkwgIiIKKworLyogRGVmaW5lIHRvIHRoZSB2ZXJzaW9uIG9mIHRoaXMgcGFja2FnZS4gKi8KKyNkZWZpbmUgUEFDS0FHRV9WRVJTSU9OICIxLjEwLjEyIgorCisvKiBUaGUgc2l6ZSBvZiBgY2hhcicsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KKyNkZWZpbmUgU0laRU9GX0NIQVIgMQorCisvKiBUaGUgc2l6ZSBvZiBgaW50JywgYXMgY29tcHV0ZWQgYnkgc2l6ZW9mLiAqLworI2RlZmluZSBTSVpFT0ZfSU5UIDQKKworLyogVGhlIHNpemUgb2YgYGxvbmcnLCBhcyBjb21wdXRlZCBieSBzaXplb2YuICovCisjZGVmaW5lIFNJWkVPRl9MT05HIDQKKworLyogVGhlIHNpemUgb2YgYGxvbmcgbG9uZycsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KKyNkZWZpbmUgU0laRU9GX0xPTkdfTE9ORyA4CisKKy8qIFRoZSBzaXplIG9mIGBzaG9ydCcsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KKyNkZWZpbmUgU0laRU9GX1NIT1JUIDIKKworLyogVGhlIHNpemUgb2YgYHZvaWQgKicsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KKyNkZWZpbmUgU0laRU9GX1ZPSURfUCA0CisKKy8qIFRoZSBzaXplIG9mIGBfX2ludDY0JywgYXMgY29tcHV0ZWQgYnkgc2l6ZW9mLiAqLworI2RlZmluZSBTSVpFT0ZfX19JTlQ2NCA4CisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBBTlNJIEMgaGVhZGVyIGZpbGVzLiAqLworI2RlZmluZSBTVERDX0hFQURFUlMgMQorCisvKiBGdWxsIHBhdGggdG8gdGhlIGRidXMtbGF1bmNoIGluIHRoZSBidWlsZGRpciAqLworI2RlZmluZSBURVNUX0JVU19MQVVOQ0hfQklOQVJZICIvc3lzdGVtL2Jpbi9kYnVzLWxhdW5jaCIKKworLyogTGlzdGVuaW5nIGFkZHJlc3MgZm9yIHJlZ3Jlc3Npb24gdGVzdHMgKi8KKyNkZWZpbmUgVEVTVF9MSVNURU4gInVuaXg6dG1wZGlyPS9kYXRhIgorCisvKiBFbmFibGUgZXh0ZW5zaW9ucyBvbiBBSVggMywgSW50ZXJpeC4gICovCisjaWZuZGVmIF9BTExfU09VUkNFCisjIGRlZmluZSBfQUxMX1NPVVJDRSAxCisjZW5kaWYKKy8qIEVuYWJsZSBHTlUgZXh0ZW5zaW9ucyBvbiBzeXN0ZW1zIHRoYXQgaGF2ZSB0aGVtLiAgKi8KKyNpZm5kZWYgX0dOVV9TT1VSQ0UKKyMgZGVmaW5lIF9HTlVfU09VUkNFIDEKKyNlbmRpZgorLyogRW5hYmxlIHRocmVhZGluZyBleHRlbnNpb25zIG9uIFNvbGFyaXMuICAqLworI2lmbmRlZiBfUE9TSVhfUFRIUkVBRF9TRU1BTlRJQ1MKKyMgZGVmaW5lIF9QT1NJWF9QVEhSRUFEX1NFTUFOVElDUyAxCisjZW5kaWYKKy8qIEVuYWJsZSBleHRlbnNpb25zIG9uIEhQIE5vblN0b3AuICAqLworI2lmbmRlZiBfVEFOREVNX1NPVVJDRQorIyBkZWZpbmUgX1RBTkRFTV9TT1VSQ0UgMQorI2VuZGlmCisvKiBFbmFibGUgZ2VuZXJhbCBleHRlbnNpb25zIG9uIFNvbGFyaXMuICAqLworI2lmbmRlZiBfX0VYVEVOU0lPTlNfXworIyBkZWZpbmUgX19FWFRFTlNJT05TX18gMQorI2VuZGlmCisKKworLyogVmVyc2lvbiBudW1iZXIgb2YgcGFja2FnZSAqLworI2RlZmluZSBWRVJTSU9OICIxLjEwLjEyIgorCisvKiBEZWZpbmUgdG8gYWRkIFZhbGdyaW5kIGluc3RydW1lbnRhdGlvbiAqLworLyogI3VuZGVmIFdJVEhfVkFMR1JJTkQgKi8KKworLyogRGVmaW5lIFdPUkRTX0JJR0VORElBTiB0byAxIGlmIHlvdXIgcHJvY2Vzc29yIHN0b3JlcyB3b3JkcyB3aXRoIHRoZSBtb3N0CisgICBzaWduaWZpY2FudCBieXRlIGZpcnN0IChsaWtlIE1vdG9yb2xhIGFuZCBTUEFSQywgdW5saWtlIEludGVsKS4gKi8KKyNpZiBkZWZpbmVkIEFDX0FQUExFX1VOSVZFUlNBTF9CVUlMRAorIyBpZiBkZWZpbmVkIF9fQklHX0VORElBTl9fCisjICBkZWZpbmUgV09SRFNfQklHRU5ESUFOIDEKKyMgZW5kaWYKKyNlbHNlCisjIGlmbmRlZiBXT1JEU19CSUdFTkRJQU4KKy8qICMgIHVuZGVmIFdPUkRTX0JJR0VORElBTiAqLworIyBlbmRpZgorI2VuZGlmCisKKworCQkJLyogVXNlIHRoZSBjb21waWxlci1wcm92aWRlZCBlbmRpYW5uZXNzIGRlZmluZXMgdG8gYWxsb3cgdW5pdmVyc2FsIGNvbXBpbGluZy4gKi8KKwkJCSNpZiBkZWZpbmVkKF9fQklHX0VORElBTl9fKQorCQkJI2RlZmluZSBXT1JEU19CSUdFTkRJQU4gMQorCQkJI2VuZGlmCisJCQorCisvKiBEZWZpbmUgdG8gMSBpZiB0aGUgWCBXaW5kb3cgU3lzdGVtIGlzIG1pc3Npbmcgb3Igbm90IGJlaW5nIHVzZWQuICovCisjZGVmaW5lIFhfRElTUExBWV9NSVNTSU5HIDEKKworCisjaWYgZGVmaW5lZChIQVZFX05TR0VURU5WSVJPTikgJiYgZGVmaW5lZChIQVZFX0NSVF9FWFRFUk5TX0gpCisjIGluY2x1ZGUgPHN5cy90aW1lLmg+CisjIGluY2x1ZGUgPGNydF9leHRlcm5zLmg+CisjIGRlZmluZSBlbnZpcm9uICgqX05TR2V0RW52aXJvbigpKQorI2VuZGlmCisKKworLyogRW5hYmxlIGxhcmdlIGlub2RlIG51bWJlcnMgb24gTWFjIE9TIFggMTAuNS4gICovCisjaWZuZGVmIF9EQVJXSU5fVVNFXzY0X0JJVF9JTk9ERQorIyBkZWZpbmUgX0RBUldJTl9VU0VfNjRfQklUX0lOT0RFIDEKKyNlbmRpZgorCisvKiBOdW1iZXIgb2YgYml0cyBpbiBhIGZpbGUgb2Zmc2V0LCBvbiBob3N0cyB3aGVyZSB0aGlzIGlzIHNldHRhYmxlLiAqLworI2RlZmluZSBfRklMRV9PRkZTRVRfQklUUyA2NAorCisvKiBEZWZpbmUgZm9yIGxhcmdlIGZpbGVzLCBvbiBBSVgtc3R5bGUgaG9zdHMuICovCisvKiAjdW5kZWYgX0xBUkdFX0ZJTEVTICovCisKKy8qIERlZmluZSB0byAxIGlmIG9uIE1JTklYLiAqLworLyogI3VuZGVmIF9NSU5JWCAqLworCisvKiBEZWZpbmUgdG8gMiBpZiB0aGUgc3lzdGVtIGRvZXMgbm90IHByb3ZpZGUgUE9TSVguMSBmZWF0dXJlcyBleGNlcHQgd2l0aAorICAgdGhpcyBkZWZpbmVkLiAqLworLyogI3VuZGVmIF9QT1NJWF8xX1NPVVJDRSAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgbmVlZCB0byBpbiBvcmRlciBmb3IgYHN0YXQnIGFuZCBvdGhlciB0aGluZ3MgdG8gd29yay4gKi8KKy8qICN1bmRlZiBfUE9TSVhfU09VUkNFICovCisKKy8qIERlZmluZWQgdG8gZ2V0IG5ld2VyIFczMiBDRSBBUElzICovCisvKiAjdW5kZWYgX1dJTjMyX1dDRSAqLworCisvKiBEZWZpbmUgdG8gYF9faW5saW5lX18nIG9yIGBfX2lubGluZScgaWYgdGhhdCdzIHdoYXQgdGhlIEMgY29tcGlsZXIKKyAgIGNhbGxzIGl0LCBvciB0byBub3RoaW5nIGlmICdpbmxpbmUnIGlzIG5vdCBzdXBwb3J0ZWQgdW5kZXIgYW55IG5hbWUuICAqLworI2lmbmRlZiBfX2NwbHVzcGx1cworLyogI3VuZGVmIGlubGluZSAqLworI2VuZGlmCisKKworLyogZXhwbGljaXRseSBkZWZpbmUgdGhlc2UgbWFjcm9zIHRvIGdldCBsZXNzIGNvbmZ1c2luZyBjb25kaXRpb25zICovCisjaWZuZGVmIERCVVNfRElTQUJMRV9BU1NFUlQKKyMgIGRlZmluZSBEQlVTX0VOQUJMRV9BU1NFUlQgMQorI2VuZGlmCisjaWZuZGVmIERCVVNfRElTQUJMRV9DSEVDS1MKKyMgIGRlZmluZSBEQlVTX0VOQUJMRV9DSEVDS1MgMQorI2VuZGlmCmRpZmYgLS1naXQgYS9jb25maWd1cmUuYWMgYi9jb25maWd1cmUuYWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JiOWNjZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbmZpZ3VyZS5hYwpAQCAtMCwwICsxLDE4NjkgQEAKK2RubCAtKi0gbW9kZTogbTQgLSotCitBQ19QUkVSRVEoWzIuNjNdKQorCittNF9kZWZpbmUoW2RidXNfbWFqb3JfdmVyc2lvbl0sIFsxXSkKK200X2RlZmluZShbZGJ1c19taW5vcl92ZXJzaW9uXSwgWzEyXSkKK200X2RlZmluZShbZGJ1c19taWNyb192ZXJzaW9uXSwgWzIwXSkKK200X2RlZmluZShbZGJ1c192ZXJzaW9uXSwKKyAgICAgICAgICBbZGJ1c19tYWpvcl92ZXJzaW9uLmRidXNfbWlub3JfdmVyc2lvbi5kYnVzX21pY3JvX3ZlcnNpb25dKQorQUNfSU5JVChbZGJ1c10sW2RidXNfdmVyc2lvbl0sW2h0dHBzOi8vYnVncy5mcmVlZGVza3RvcC5vcmcvZW50ZXJfYnVnLmNnaT9wcm9kdWN0PWRidXNdLFtkYnVzXSkKKworQUNfQ09ORklHX0FVWF9ESVIoW2J1aWxkLWF1eF0pCisKK200X3BhdHRlcm5fZm9yYmlkKFteQVhfKENIRUNLX0VOQUJMRV9ERUJVR3xDT0RFX0NPVkVSQUdFfENPTVBJTEVSX0ZMQUdTfENPTVBJTEVSX0ZMQUdTXyhDRkxBR1N8Q1hYRkxBR1N8TERGTEFHUykpXGJdLAorICBbVW5leHBhbmRlZCBBWF8gbWFjcm8gZm91bmQuIFBsZWFzZSBpbnN0YWxsIEdOVSBhdXRvY29uZi1hcmNoaXZlXSkKKworQUNfQ0FOT05JQ0FMX0hPU1QKKworQUNfQ09ORklHX0hFQURFUlMoW2NvbmZpZy5oXSkKK0FDX0NPTkZJR19NQUNST19ESVIoW200XSkKKworQU1fSU5JVF9BVVRPTUFLRShbMS4xMyB0YXItdXN0YXIgLVduby1wb3J0YWJpbGl0eSBzdWJkaXItb2JqZWN0c10pCisKK0dFVFRFWFRfUEFDS0FHRT1kYnVzLTEKK0FDX1NVQlNUKEdFVFRFWFRfUEFDS0FHRSkKK0FDX0RFRklORV9VTlFVT1RFRChHRVRURVhUX1BBQ0tBR0UsIiRHRVRURVhUX1BBQ0tBR0UiLFtUaGUgbmFtZSBvZiB0aGUgZ2V0dGV4dCBkb21haW5dKQorCisjIEJ5IGRlZmF1bHQsIHJlYnVpbGQgYXV0b3Rvb2xzIGZpbGVzIG9uIGRlbWFuZDsgb25seSB1c2UgLi9taXNzaW5nIGlmIHRoZQorIyB1c2VyIHNheXMgLS1kaXNhYmxlLW1haW50YWluZXItbW9kZSAoc29tZSBkaXN0cmlidXRpb25zIGxpa2UgdG8gZG8gdGhpcykKK0FNX01BSU5UQUlORVJfTU9ERShbZW5hYmxlXSkKKworbTRfaWZkZWYoW0FNX1NJTEVOVF9SVUxFU10sW0FNX1NJTEVOVF9SVUxFUyhbeWVzXSldKQorCitBQ19ERUZJTkVfVU5RVU9URUQoREJVU19EQUVNT05fTkFNRSwiZGJ1cy1kYWVtb24iLFtOYW1lIG9mIGV4ZWN1dGFibGVdKQorCisjIGxpYnRvb2wgdmVyc2lvbmluZyAtIHRoaXMgYXBwbGllcyB0byBsaWJkYnVzCisjCisjIFNlZSBodHRwOi8vc291cmNlcy5yZWRoYXQuY29tL2F1dG9ib29rL2F1dG9ib29rL2F1dG9ib29rXzkxLmh0bWwjU0VDOTEgZm9yIGRldGFpbHMKKyMKKworIyMgaW5jcmVtZW50IGlmIHRoZSBpbnRlcmZhY2UgaGFzIGFkZGl0aW9ucywgY2hhbmdlcywgcmVtb3ZhbHMuCitMVF9DVVJSRU5UPTIyCisKKyMjIGluY3JlbWVudCBhbnkgdGltZSB0aGUgc291cmNlIGNoYW5nZXM7IHNldCB0bworIyMgIDAgaWYgeW91IGluY3JlbWVudCBDVVJSRU5UCitMVF9SRVZJU0lPTj0xMworCisjIyBpbmNyZW1lbnQgaWYgYW55IGludGVyZmFjZXMgaGF2ZSBiZWVuIGFkZGVkOyBzZXQgdG8gMAorIyMgaWYgYW55IGludGVyZmFjZXMgaGF2ZSBiZWVuIGNoYW5nZWQgb3IgcmVtb3ZlZC4gcmVtb3ZhbCBoYXMKKyMjIHByZWNlZGVuY2Ugb3ZlciBhZGRpbmcsIHNvIHNldCB0byAwIGlmIGJvdGggaGFwcGVuZWQuCitMVF9BR0U9MTkKKworQUNfU1VCU1QoTFRfQ1VSUkVOVCkKK0FDX1NVQlNUKExUX1JFVklTSU9OKQorQUNfU1VCU1QoTFRfQUdFKQorU09WRVJTSU9OPWBleHByICR7TFRfQ1VSUkVOVH0gLSAke0xUX0FHRX1gCitBQ19TVUJTVChbU09WRVJTSU9OXSkKKworREJVU19NQUpPUl9WRVJTSU9OPWRidXNfbWFqb3JfdmVyc2lvbgorREJVU19NSU5PUl9WRVJTSU9OPWRidXNfbWlub3JfdmVyc2lvbgorREJVU19NSUNST19WRVJTSU9OPWRidXNfbWljcm9fdmVyc2lvbgorREJVU19WRVJTSU9OPWRidXNfbWFqb3JfdmVyc2lvbi5kYnVzX21pbm9yX3ZlcnNpb24uZGJ1c19taWNyb192ZXJzaW9uCisKK0FDX1NVQlNUKERCVVNfTUFKT1JfVkVSU0lPTikKK0FDX1NVQlNUKERCVVNfTUlOT1JfVkVSU0lPTikKK0FDX1NVQlNUKERCVVNfTUlDUk9fVkVSU0lPTikKK0FDX1NVQlNUKERCVVNfVkVSU0lPTikKKworZG5sCitkbmwgQnVpbGQgY29uZmlndXJhdGlvbgorZG5sCisKK2RubCBUaGlzIG11c3QgY29tZSBmaXJzdDogb3RoZXIgb3B0aW9ucyB1c2UgdGhpcyB0byBzZXQgdGhlaXIgZGVmYXVsdHMuIERvbid0CitkbmwgZW5hYmxlIGRldmVsb3BlciBtb2RlIG9uIHByb2R1Y3Rpb24gYnVpbGRzLgorQUNfQVJHX0VOQUJMRShbZGV2ZWxvcGVyXSwKKyAgW0FTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1kZXZlbG9wZXJdLAorICAgIFtzZXQgZGVmYXVsdHMgdG8gYmUgYXBwcm9wcmlhdGUgZm9yIGEgRC1CdXMgZGV2ZWxvcGVyIGluc3RlYWQgb2YgYSBkaXN0cmlidXRpb24vZW5kLXVzZXJdKV0sCisgIFtlbmFibGVfZGV2ZWxvcGVyPSRlbmFibGV2YWxdLAorICBbZW5hYmxlX2RldmVsb3Blcj1ub10pCisKK2RubCAnZGlzYWJsZV9kZXZlbG9wZXInIGlzIHRoZSBuZWdhdGlvbiBvZiAnZW5hYmxlX2RldmVsb3BlcicuIElmCitkbmwgJ2VuYWJsZS1kZXZlbG9wZXInIGlzIHNldCB0byAnbm8nICh0aGUgZGVmYXVsdCksIHRoZSB2YWx1ZSBvZgorZG5sICdkaXNhYmxlX2RldmVsb3BlcicgaXMgc2V0IHRvICd5ZXMnLCBhbmQgdmljZSB2ZXJzYS4gSXQncyB1c2VkCitkbmwgZm9yIG1hY3JvcyB0aGF0IHJlcXVpcmUgdGhlIG9wcG9zaXRlIG9mICdlbmFibGVfZGV2ZWxvcGVyJywgc3VjaAorZG5sIGFzIHNldmVyYWwgQVhfIG1hY3Jvcy4KK2RubCBTZWUgaHR0cHM6Ly9idWdzLmZyZWVkZXNrdG9wLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9OTczNTcKK0FTX0lGKFt0ZXN0ICJ4JGVuYWJsZV9kZXZlbG9wZXIiID0gInh5ZXMiXSxbCisgICAgZGlzYWJsZV9kZXZlbG9wZXI9bm8KKyAgXSxbCisgICAgZGlzYWJsZV9kZXZlbG9wZXI9eWVzCisgIF0pCisKKyMgVGhlIGRlYnVnZ2luZyBjaGVjayBtdXN0IHJ1biBiZWZvcmUgdGhlIGNvbXBpbGVyIHRlc3RzLiBPdGhlciBjb21tYW5kLWxpbmUKKyMgb3B0aW9ucyBhbHNvIHVzZSBpdCB0byBzZXQgdGhlaXIgZGVmYXVsdHMuIFdlIGRpc2FibGUgZGVidWdnaW5nIGJ5IGRlZmF1bHQsCisjIGV4Y2VwdCBmb3IgZGV2ZWxvcGVyIGJ1aWxkcy4KK0FYX0NIRUNLX0VOQUJMRV9ERUJVRyhbJGVuYWJsZV9kZXZlbG9wZXJdKQorCitBQ19QUk9HX0NDCitBTV9QUk9HX0NDX0NfTworQUNfUFJPR19DWFgKK0FDX1VTRV9TWVNURU1fRVhURU5TSU9OUworQUNfU1lTX0xBUkdFRklMRQorQUNfSVNDX1BPU0lYCitBQ19IRUFERVJfU1REQworQUNfQ19JTkxJTkUKK0FNX1BST0dfTElCVE9PTAorQUNfUFJPR19NS0RJUl9QCitQS0dfUFJPR19QS0dfQ09ORklHCisKKyMgVEFQIHRlc3QgZHJpdmVyIHN1cHBvcnQKK0FDX1BST0dfQVdLCitBQ19SRVFVSVJFX0FVWF9GSUxFKFt0YXAtZHJpdmVyLnNoXSkKKworIyBUaGlzIG11c3QgY29tZSBiZWZvcmUgd2Ugc2V0IHVwIGNvbXBpbGVyIHdhcm5pbmdzIGJlY2F1c2UgaXQgYXNzdW1lcworIyBub24tdXNlIG9mIC1XZXJyb3I9bWlzc2luZy1wcm90b3R5cGVzCitnbF9WSVNJQklMSVRZCitBTV9DT05ESVRJT05BTChbSEFWRV9WSVNJQklMSVRZXSwgW3Rlc3QgIngkSEFWRV9WSVNJQklMSVRZIiA9IHgxXSkKKworIyBJbml0aWFsaXplIGxpYnRvb2wKK0xUX0lOSVQoW3dpbjMyLWRsbF0pCitMVF9MQU5HKFtXaW5kb3dzIFJlc291cmNlXSkKKworIyBTZXQgc29tZSBpbnRlcm5hbCB2YXJpYWJsZXMgZGVwZW5kaW5nIG9uIHRoZSBwbGF0Zm9ybSBmb3IgbGF0ZXIgdXNlLgorZGJ1c193aW49bm8KK2RidXNfY3lnd2luPW5vCitkYnVzX3VuaXg9bm8KK2Nhc2UgIiR7aG9zdH0iIGluCisgICAgKi1taW5ndzMyY2UqKQorICAgICAgICBkYnVzX3dpbj15ZXMKKyAgICAgICAgZGJ1c193aW5jZT15ZXMKKyAgICAgICAgOzsKKyAgICAqLW1pbmd3MzIqKQorICAgICAgICBkYnVzX3dpbj15ZXMKKyAgICAgICAgOzsKKyAgICAqLWN5Z3dpbiopCisgICAgICAgIGRidXNfY3lnd2luPXllcworICAgICAgICBkYnVzX3VuaXg9eWVzCisgICAgICAgIDs7CisgICAgKikKKyAgICAgICAgZGJ1c191bml4PXllcworICAgICAgIDs7Citlc2FjCisKKyMgU3BlY2lhbCBkZWZpbmVzIGZvciBjZXJ0YWluIHBsYXRmb3JtcworaWYgdGVzdCAiJGRidXNfd2luIiA9IHllczsgdGhlbgorICAgIEFDX0RFRklORShEQlVTX1dJTiwxLFtEZWZpbmVkIGlmIHdlIHJ1biBvbiBhIFczMiBBUEkgYmFzZWQgc3lzdGVtXSkKKyAgICAjIFllcywgb24gV2luZG93cyBpdCByZWFsbHkgZG9lcyB3b3JrIGxpa2UgdGhpcy4KKyAgICAjIGh0dHA6Ly9zdXBwb3J0Lm1pY3Jvc29mdC5jb20va2IvMTExODU1CisgICAgQUNfREVGSU5FKEZEX1NFVFNJWkUsODE5MixbVGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbm5lY3Rpb25zIHRoYXQgY2FuIGJlIGhhbmRsZWQgYXQgb25jZV0pCisgICAgQlVJTERfVElNRVNUQU1QPWBkYXRlIC0taXNvLTg2MDE9bWludXRlc2AKKyAgICBBQ19TVUJTVChCVUlMRF9USU1FU1RBTVApCisgICAgIyBBc3N1bWUgREJVU19WRVJTSU9OIGlzIGFsd2F5cyB0aHJlZSBudW1iZXJzCisgICAgQlVJTERfRklMRVZFUlNJT049YGVjaG8gIiREQlVTX1ZFUlNJT04iIHwgc2VkIC1lICdzL1wuLywvZydgLDAKKyAgICBBQ19TVUJTVChCVUlMRF9GSUxFVkVSU0lPTikKKyAgICBBU19JRihbdGVzdCAteiAiJFJDIl0sCisgICAgICAgIFtBQ19NU0dfRVJST1IoW0FuIGltcGxlbWVudGF0aW9uIG9mIHdpbmRyZXMgaXMgcmVxdWlyZWRdKV0pCisgICAgaWYgdGVzdCAiJGRidXNfd2luY2UiID0geWVzOyB0aGVuCisgICAgICBBQ19ERUZJTkUoREJVU19XSU5DRSwxLFtEZWZpbmVkIGlmIHdlIHJ1biBvbiBhIFczMiBDRSBBUEkgYmFzZWQgc3lzdGVtXSkKKyAgICAgIEFDX0RFRklORShfV0lOMzJfV0NFLCAweDA1MDIsIFtEZWZpbmVkIHRvIGdldCBuZXdlciBXMzIgQ0UgQVBJc10pCisgICAgZmkKK2Vsc2UKKyAgICBBQ19ERUZJTkUoREJVU19VTklYLDEsW0RlZmluZWQgaWYgd2UgcnVuIG9uIGEgVW5peC1iYXNlZCBzeXN0ZW1dKQorZmkKK2lmIHRlc3QgIiRkYnVzX2N5Z3dpbiIgPSB5ZXM7IHRoZW4KKyAgICBBQ19ERUZJTkUoREJVU19DWUdXSU4sMSxbRGVmaW5lZCBpZiB3ZSBydW4gb24gYSBjeWd3aW4gQVBJIGJhc2VkIHN5c3RlbV0pCitmaQorCisjIEZvciBiZXN0IHNlY3VyaXR5LCBhc3N1bWUgdGhhdCBhbGwgbm9uLVdpbmRvd3MgcGxhdGZvcm1zIGNhbiBkbworIyBjcmVkZW50aWFscy1wYXNzaW5nLgorQVNfSUYoW3Rlc3QgIiRkYnVzX3dpbiIgPSB5ZXNdLAorICAgIFtEQlVTX1NFU1NJT05fQ09ORl9NQVlCRV9BVVRIX0VYVEVSTkFMPSI8IS0tPGF1dGg+RVhURVJOQUw8L2F1dGg+LS0+Il0sCisgICAgW0RCVVNfU0VTU0lPTl9DT05GX01BWUJFX0FVVEhfRVhURVJOQUw9IjxhdXRoPkVYVEVSTkFMPC9hdXRoPiJdKQorQUNfU1VCU1QoW0RCVVNfU0VTU0lPTl9DT05GX01BWUJFX0FVVEhfRVhURVJOQUxdKQorCitBTV9DT05ESVRJT05BTChEQlVTX1dJTiwgdGVzdCAiJGRidXNfd2luIiA9IHllcykKK0FNX0NPTkRJVElPTkFMKERCVVNfV0lOQ0UsIHRlc3QgIiRkYnVzX3dpbmNlIiA9IHllcykKK0FNX0NPTkRJVElPTkFMKERCVVNfVU5JWCwgdGVzdCAiJGRidXNfdW5peCIgPSB5ZXMpCitBTV9DT05ESVRJT05BTChEQlVTX0NZR1dJTiwgdGVzdCAiJGRidXNfY3lnd2luIiA9IHllcykKKworREJVU19TVEFUSUNfQlVJTERfQ1BQRkxBR1M9CitpZiB0ZXN0ICJ4JGVuYWJsZV9zaGFyZWQiID0geG5vOyB0aGVuCisgICAgIyBPbiBXaW5kb3dzLCBsaW5raW5nIGFnYWluc3QgdGhlIHN0YXRpYyBsaWJyYXJ5IHJlcXVpcmVzIHNwZWNpYWwgZWZmb3J0CisgICAgIyB0byB0dXJuIG9mZiBETEwgaW1wb3J0L2V4cG9ydCBwcm9jZXNzaW5nLiBXZSBub3JtYWxseSBsaW5rIHNvbWUgdGhpbmdzCisgICAgIyBhZ2FpbnN0IHRoZSBkeW5hbWljIGxpYnJhcnksIGJ1dCBpZiB3ZSdyZSBub3QgYnVpbGRpbmcgdGhhdCwgd2UnbGwKKyAgICAjIGhhdmUgdG8gbGluayBldmVyeXRoaW5nIHN0YXRpY2FsbHkuCisgICAgREJVU19TVEFUSUNfQlVJTERfQ1BQRkxBR1M9LUREQlVTX1NUQVRJQ19CVUlMRAorZmkKK0FDX1NVQlNUKFtEQlVTX1NUQVRJQ19CVUlMRF9DUFBGTEFHU10pCisKK0FDX0FSR19FTkFCTEUoYW5zaSwgQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLWFuc2ldLFtlbmFibGUgLWFuc2kgLXBlZGFudGljIGdjYyBmbGFnc10pLGVuYWJsZV9hbnNpPSRlbmFibGV2YWwsZW5hYmxlX2Fuc2k9bm8pCitBQ19BUkdfRU5BQkxFKHZlcmJvc2UtbW9kZSwgQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLXZlcmJvc2UtbW9kZV0sW3N1cHBvcnQgdmVyYm9zZSBkZWJ1ZyBtb2RlXSksZW5hYmxlX3ZlcmJvc2VfbW9kZT0kZW5hYmxldmFsLGVuYWJsZV92ZXJib3NlX21vZGU9JGVuYWJsZV9kZXZlbG9wZXIpCitBQ19BUkdfRU5BQkxFKGFzc2VydHMsIEFTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1hc3NlcnRzXSxbaW5jbHVkZSBhc3NlcnRpb24gY2hlY2tzXSksZW5hYmxlX2Fzc2VydHM9JGVuYWJsZXZhbCxlbmFibGVfYXNzZXJ0cz0kZW5hYmxlX2RldmVsb3BlcikKK0FDX0FSR19FTkFCTEUoY2hlY2tzLCBBU19IRUxQX1NUUklORyhbLS1lbmFibGUtY2hlY2tzXSxbaW5jbHVkZSBzYW5pdHkgY2hlY2tzIG9uIHB1YmxpYyBBUEldKSxlbmFibGVfY2hlY2tzPSRlbmFibGV2YWwsZW5hYmxlX2NoZWNrcz15ZXMpCitBQ19BUkdfRU5BQkxFKHhtbC1kb2NzLCBBU19IRUxQX1NUUklORyhbLS1lbmFibGUteG1sLWRvY3NdLFtidWlsZCBYTUwgZG9jdW1lbnRhdGlvbiAocmVxdWlyZXMgeG1sdG8pXSksZW5hYmxlX3htbF9kb2NzPSRlbmFibGV2YWwsZW5hYmxlX3htbF9kb2NzPWF1dG8pCitBQ19BUkdfRU5BQkxFKGRveHlnZW4tZG9jcywgQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLWRveHlnZW4tZG9jc10sW2J1aWxkIERPWFlHRU4gZG9jdW1lbnRhdGlvbiAocmVxdWlyZXMgRG94eWdlbildKSxlbmFibGVfZG94eWdlbl9kb2NzPSRlbmFibGV2YWwsZW5hYmxlX2RveHlnZW5fZG9jcz1hdXRvKQorQUNfQVJHX0VOQUJMRShbZHVja3R5cGUtZG9jc10sCisgICAgICAgICAgICAgIEFTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1kdWNrdHlwZS1kb2NzXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2J1aWxkIER1Y2t0eXBlIGRvY3VtZW50YXRpb24gKHJlcXVpcmVzIER1Y2t0eXBlKV0pLAorICAgICAgICAgICAgICBbZW5hYmxlX2R1Y2t0eXBlX2RvY3M9JGVuYWJsZXZhbF0sIFtlbmFibGVfZHVja3R5cGVfZG9jcz1hdXRvXSkKK0FDX0FSR19FTkFCTEUoc2VsaW51eCwgQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLXNlbGludXhdLFtidWlsZCB3aXRoIFNFTGludXggc3VwcG9ydF0pLGVuYWJsZV9zZWxpbnV4PSRlbmFibGV2YWwsZW5hYmxlX3NlbGludXg9YXV0bykKK0FDX0FSR19FTkFCTEUoW2FwcGFybW9yXSwKKyAgW0FTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1hcHBhcm1vcl0sIFtidWlsZCB3aXRoIEFwcEFybW9yIHN1cHBvcnRdKV0sCisgIFtlbmFibGVfYXBwYXJtb3I9JGVuYWJsZXZhbF0sCisgIFtlbmFibGVfYXBwYXJtb3I9YXV0b10pCitBQ19BUkdfRU5BQkxFKGxpYmF1ZGl0LEFTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1saWJhdWRpdF0sW2J1aWxkIGF1ZGl0IGRhZW1vbiBzdXBwb3J0IGZvciBTRUxpbnV4XSksZW5hYmxlX2xpYmF1ZGl0PSRlbmFibGV2YWwsZW5hYmxlX2xpYmF1ZGl0PWF1dG8pCitBQ19BUkdfRU5BQkxFKGlub3RpZnksIEFTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1pbm90aWZ5XSxbYnVpbGQgd2l0aCBpbm90aWZ5IHN1cHBvcnQgKGxpbnV4IG9ubHkpXSksZW5hYmxlX2lub3RpZnk9JGVuYWJsZXZhbCxlbmFibGVfaW5vdGlmeT1hdXRvKQorQUNfQVJHX0VOQUJMRShrcXVldWUsIEFTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1rcXVldWVdLFtidWlsZCB3aXRoIGtxdWV1ZSBzdXBwb3J0XSksZW5hYmxlX2txdWV1ZT0kZW5hYmxldmFsLGVuYWJsZV9rcXVldWU9YXV0bykKK0FDX0FSR19FTkFCTEUoY29uc29sZS1vd25lci1maWxlLCBBU19IRUxQX1NUUklORyhbLS1lbmFibGUtY29uc29sZS1vd25lci1maWxlXSxbZW5hYmxlIGNvbnNvbGUgb3duZXIgZmlsZV0pLGVuYWJsZV9jb25zb2xlX293bmVyX2ZpbGU9JGVuYWJsZXZhbCxlbmFibGVfY29uc29sZV9vd25lcl9maWxlPWF1dG8pCitBQ19BUkdfRU5BQkxFKGxhdW5jaGQsIEFTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1sYXVuY2hkXSxbYnVpbGQgd2l0aCBsYXVuY2hkIGF1dG8tbGF1bmNoIHN1cHBvcnRdKSxlbmFibGVfbGF1bmNoZD0kZW5hYmxldmFsLGVuYWJsZV9sYXVuY2hkPWF1dG8pCitBQ19BUkdfRU5BQkxFKHN5c3RlbWQsIEFTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1zeXN0ZW1kXSxbYnVpbGQgd2l0aCBzeXN0ZW1kIGF0X2NvbnNvbGUgc3VwcG9ydF0pLGVuYWJsZV9zeXN0ZW1kPSRlbmFibGV2YWwsZW5hYmxlX3N5c3RlbWQ9YXV0bykKKworQUNfQVJHX1dJVEgoc2Vzc2lvbi1zb2NrZXQtZGlyLCBBU19IRUxQX1NUUklORyhbLS13aXRoLXNlc3Npb24tc29ja2V0LWRpcj1bZGlybmFtZV1dLFtXaGVyZSB0byBwdXQgc29ja2V0cyBmb3IgdGhlIHBlci1sb2dpbi1zZXNzaW9uIG1lc3NhZ2UgYnVzXSkpCitBQ19BUkdfV0lUSCh0ZXN0LXNvY2tldC1kaXIsIEFTX0hFTFBfU1RSSU5HKFstLXdpdGgtdGVzdC1zb2NrZXQtZGlyPVtkaXJuYW1lXV0sW1doZXJlIHRvIHB1dCBzb2NrZXRzIGZvciBtYWtlIGNoZWNrXSkpCitBQ19BUkdfV0lUSChzeXN0ZW0tcGlkLWZpbGUsIEFTX0hFTFBfU1RSSU5HKFstLXdpdGgtc3lzdGVtLXBpZC1maWxlPVtwaWRmaWxlXV0sW1BJRCBmaWxlIGZvciBzeXN0ZW13aWRlIGRhZW1vbl0pKQorQUNfQVJHX1dJVEgoc3lzdGVtLXNvY2tldCwgQVNfSEVMUF9TVFJJTkcoWy0td2l0aC1zeXN0ZW0tc29ja2V0PVtmaWxlbmFtZV1dLFtVTklYIGRvbWFpbiBzb2NrZXQgZm9yIHN5c3RlbXdpZGUgZGFlbW9uXSkpCitBQ19BUkdfV0lUSChjb25zb2xlLWF1dGgtZGlyLCBBU19IRUxQX1NUUklORyhbLS13aXRoLWNvbnNvbGUtYXV0aC1kaXI9W2Rpcm5hbWVdXSxbZGlyZWN0b3J5IHRvIGNoZWNrIGZvciBjb25zb2xlIG93bmVyaGlwXSkpCitBQ19BUkdfV0lUSChjb25zb2xlLW93bmVyLWZpbGUsIEFTX0hFTFBfU1RSSU5HKFstLXdpdGgtY29uc29sZS1vd25lci1maWxlPVtmaWxlbmFtZV1dLFtmaWxlIHdob3NlIG93bmVyIGRldGVybWluZXMgY3VycmVudCBjb25zb2xlIG93bmVyXSkpCitBQ19BUkdfV0lUSChsYXVuY2hkLWFnZW50LWRpciwgQVNfSEVMUF9TVFJJTkcoWy0td2l0aC1sYXVuY2hkLWFnZW50LWRpcj1bZGlybmFtZV1dLFtkaXJlY3RvcnkgdG8gcHV0IHRoZSBsYXVuY2hkIGFnZW50IChkZWZhdWx0OiAvTGlicmFyeS9MYXVuY2hBZ2VudHMpXSkpCitBQ19BUkdfV0lUSChkYnVzX3VzZXIsIEFTX0hFTFBfU1RSSU5HKFstLXdpdGgtZGJ1cy11c2VyPTx1c2VyPl0sW1VzZXIgZm9yIHJ1bm5pbmcgdGhlIERCVVMgZGFlbW9uIChtZXNzYWdlYnVzKV0pKQorQUNfQVJHX1dJVEgoW3Rlc3RfdXNlcl0sCisgIFtBU19IRUxQX1NUUklORyhbLS13aXRoLXRlc3QtdXNlcj08dXNlcj5dLAorICAgIFtVbnByaXZpbGVnZWQgdXNlciBmb3IgcmVncmVzc2lvbiB0ZXN0cywgb3RoZXIgdGhhbiByb290IGFuZCB0aGUgZGJ1c191c2VyIChkZWZhdWx0OiBub2JvZHkpXSldKQorQUNfQVJHX1dJVEgoZGJ1c19kYWVtb25kaXIsIEFTX0hFTFBfU1RSSU5HKFstLXdpdGgtZGJ1cy1kYWVtb25kaXI9W2Rpcm5hbWVdXSxbRGlyZWN0b3J5IGZvciBpbnN0YWxsaW5nIHRoZSBEQlVTIGRhZW1vbl0pKQorCitBQ19BUkdfRU5BQkxFKFtlbWJlZGRlZC10ZXN0c10sCisgIEFTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1lbWJlZGRlZC10ZXN0c10sCisgICAgW2VuYWJsZSB1bml0IHRlc3QgY29kZSBpbiB0aGUgbGlicmFyeSBhbmQgYmluYXJpZXNdKSwKKyAgW10sIFtlbmFibGVfZW1iZWRkZWRfdGVzdHM9JGVuYWJsZV9kZXZlbG9wZXJdKQorQUNfQVJHX0VOQUJMRShbbW9kdWxhci10ZXN0c10sCisgIEFTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1tb2R1bGFyLXRlc3RzXSwKKyAgICBbZW5hYmxlIG1vZHVsYXIgcmVncmVzc2lvbiB0ZXN0cyAocmVxdWlyZXMgR0xpYildKSwKKyAgW10sIFtlbmFibGVfbW9kdWxhcl90ZXN0cz1hdXRvXSkKKyMgLS1lbmFibGUtdGVzdHMgb3ZlcnJpZGVzIGJvdGggLS1lbmFibGUtZW1iZWRkZWQtdGVzdHMgYW5kCisjIC0tZW5hYmxlLW1vZHVsYXItdGVzdHMKK0FDX0FSR19FTkFCTEUoW3Rlc3RzXSwKKyAgQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLXRlc3RzXSwKKyAgICBbZW5hYmxlL2Rpc2FibGUgYWxsIHRlc3RzLCBvdmVycmlkaW5nIGVtYmVkZGVkLXRlc3RzL21vZHVsYXItdGVzdHNdKSwKKyAgWworICBpZiB0ZXN0ICJ4JGVuYWJsZXZhbCIgPSB4eWVzOyB0aGVuCisgICAgQUNfTVNHX05PVElDRShbRnVsbCB0ZXN0IGNvdmVyYWdlIHdhcyByZXF1ZXN0ZWQgd2l0aCAtLWVuYWJsZS10ZXN0cz15ZXNdKQorICAgIEFDX01TR19OT1RJQ0UoW1RoaXMgaGFzIG1hbnkgZGVwZW5kZW5jaWVzIChHTGliLCBQeXRob24gZXRjLildKQorICBmaQorICBlbmFibGVfZW1iZWRkZWRfdGVzdHM9JGVuYWJsZXZhbAorICBlbmFibGVfbW9kdWxhcl90ZXN0cz0kZW5hYmxldmFsCisgIF0sCisgIFtdKQorCisjIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTIGNvbnRyb2xzIHVuaXQgdGVzdHMgYnVpbHQgaW4gdG8gLmMgZmlsZXMKKyMgYW5kIGFsc28gc29tZSBzdHVmZiBpbiB0aGUgdGVzdC8gc3ViZGlyLgorQU1fQ09ORElUSU9OQUwoW0RCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTXSwKKyAgW3Rlc3QgIngkZW5hYmxlX2VtYmVkZGVkX3Rlc3RzIiA9IHh5ZXNdKQoraWYgdGVzdCAieCRlbmFibGVfZW1iZWRkZWRfdGVzdHMiID0geHllczsgdGhlbgorICAgIEFDX0RFRklORShbREJVU19FTkFCTEVfRU1CRURERURfVEVTVFNdLCBbMV0sCisgICAgICBbRGVmaW5lIHRvIGJ1aWxkIHRlc3QgY29kZSBpbnRvIHRoZSBsaWJyYXJ5IGFuZCBiaW5hcmllc10pCitmaQorCisjIERCVVNfRU5BQkxFX01PRFVMQVJfVEVTVFMgY29udHJvbHMgdGVzdHMgdGhhdCB3b3JrIGJhc2VkIG9uIHB1YmxpYyBBUEkuCisjIFRoZXNlIHVzZSBHVGVzdCwgZnJvbSBHTGliLCBiZWNhdXNlIGxpZmUncyB0b28gc2hvcnQuIFRoZXkncmUgZW5hYmxlZCBieQorIyBkZWZhdWx0ICh1bmxlc3MgeW91IGRvbid0IGhhdmUgR0xpYiksIGJlY2F1c2UgdGhleSBkb24ndCBibG9hdCB0aGUgbGlicmFyeQorIyBvciBiaW5hcmllcy4KKworZG5sIERvbid0IGRvIGFueXRoaW5nIHRvbyBzdWJ0bGUgaGVyZSwgYmVjYXVzZSB0aGUgQ01ha2UgYnVpbGQgc3lzdGVtCitkbmwgcGFyc2VzIHRoZXNlIGxpbmVzIHdpdGggcmVndWxhciBleHByZXNzaW9ucy4gSWYgbmVjZXNzYXJ5LCBhZGp1c3QKK2RubCBjbWFrZS9tb2R1bGVzL01hY3Jvc0F1dG90b29scy5jbWFrZSB0byBjb21wZW5zYXRlLgorQUNfREVGSU5FKFtHTElCX1ZFUlNJT05fTUlOX1JFUVVJUkVEXSwgW0dMSUJfVkVSU0lPTl8yXzQwXSwgW0lnbm9yZSBwb3N0LTIuNDAgZGVwcmVjYXRpb25zXSkKK0FDX0RFRklORShbR0xJQl9WRVJTSU9OX01BWF9BTExPV0VEXSwgW0dfRU5DT0RFX1ZFUlNJT04oMiw0NCldLCBbUHJldmVudCBwb3N0LTIuNDQgQVBJc10pCisKK3dpdGhfZ2xpYj15ZXMKKworQVNfSUYoW3Rlc3QgIngkZW5hYmxlX21vZHVsYXJfdGVzdHMiICE9IHhub10sCisgIFsKKyAgUEtHX0NIRUNLX01PRFVMRVMoW0dMSUJdLCBbZ2xpYi0yLjAgPj0gMi40MCwgZ2lvLTIuMCA+PSAyLjQwXSwKKyAgICBbCisgICAgICBBU19JRihbdGVzdCAieCRkYnVzX3VuaXgiID0geHllc10sCisgICAgICAgIFtQS0dfQ0hFQ0tfTU9EVUxFUyhbR0lPX1VOSVhdLCBbZ2lvLXVuaXgtMi4wXSwKKyAgICAgICAgICAgW0FDX0RFRklORShbSEFWRV9HSU9fVU5JWF0sIFsxXSwgW0RlZmluZSBpZiB5b3UgaGF2ZSBnaW8tdW5peC0yLjBdKV0sIFtdKV0pCisgICAgXSwKKyAgICBbaWYgdGVzdCAieCRlbmFibGVfbW9kdWxhcl90ZXN0cyIgPSB4eWVzOyB0aGVuCisgICAgICBBQ19NU0dfTk9USUNFKFtGdWxsIHRlc3QgY292ZXJhZ2UgKC0tZW5hYmxlLW1vZHVsYXItdGVzdHM9eWVzIG9yIC0tZW5hYmxlLXRlc3RzPXllcykgcmVxdWlyZXMgR0xpYl0pCisgICAgICBBQ19NU0dfRVJST1IoWyRHTElCX0VSUk9SU10pCisgICAgZWxzZSAjIGFzc3VtZWQgdG8gYmUgImF1dG8iCisgICAgICB3aXRoX2dsaWI9bm8KKyAgICBmaV0pCisgIF0sCisgIFt3aXRoX2dsaWI9bm9dKQorCitpZiB0ZXN0ICJ4JGVuYWJsZV9tb2R1bGFyX3Rlc3RzIiAhPSB4bm87IHRoZW4KKyAgQUNfREVGSU5FKFtEQlVTX0VOQUJMRV9NT0RVTEFSX1RFU1RTXSwgWzFdLAorICAgIFtEZWZpbmUgdG8gYnVpbGQgaW5kZXBlbmRlbnQgdGVzdCBiaW5hcmllc10pCitmaQorQU1fQ09ORElUSU9OQUwoW0RCVVNfRU5BQkxFX01PRFVMQVJfVEVTVFNdLAorICBbdGVzdCAieCRlbmFibGVfbW9kdWxhcl90ZXN0cyIgIT0geG5vXSkKKworaWYgdGVzdCAieCR3aXRoX2dsaWIiICE9IHhubzsgdGhlbgorICBBQ19ERUZJTkUoW0RCVVNfV0lUSF9HTElCXSwgWzFdLAorICAgIFtEZWZpbmUgaWYgR0xpYiwgR09iamVjdCwgR0lPIGFyZSBhdmFpbGFibGVdKQorZmkKK0FNX0NPTkRJVElPTkFMKFtEQlVTX1dJVEhfR0xJQl0sIFt0ZXN0ICJ4JHdpdGhfZ2xpYiIgIT0geG5vXSkKKworQUNfQVJHX0VOQUJMRShbaW5zdGFsbGVkLXRlc3RzXSwKKyAgQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLWluc3RhbGxlZC10ZXN0c10sCisgICAgW2VuYWJsZSB1bml0IHRlc3QgY29kZSBpbiB0aGUgbGlicmFyeSBhbmQgYmluYXJpZXNdKSwKKyAgW10sIFtlbmFibGVfaW5zdGFsbGVkX3Rlc3RzPW5vXSkKK0FNX0NPTkRJVElPTkFMKFtEQlVTX0VOQUJMRV9JTlNUQUxMRURfVEVTVFNdLAorICBbdGVzdCAieCRlbmFibGVfaW5zdGFsbGVkX3Rlc3RzIiA9IHh5ZXNdKQorCitpZiB0ZXN0ICJ4JGVuYWJsZV90ZXN0cyIgPSB4eWVzOyB0aGVuCisgICMgZnVsbCB0ZXN0IGNvdmVyYWdlIGlzIHJlcXVpcmVkLCBQeXRob24gaXMgYSBoYXJkIGRlcGVuZGVuY3kKKyAgQUNfTVNHX05PVElDRShbRnVsbCB0ZXN0IGNvdmVyYWdlICgtLWVuYWJsZS10ZXN0cz15ZXMpIHJlcXVpcmVzIFB5dGhvbiwgZGJ1cy1weXRob24sIHB5Z2ldKQorICBBTV9QQVRIX1BZVEhPTihbMi42XSkKKyAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgUHl0aG9uIG1vZHVsZXMgZm9yIGZ1bGwgdGVzdCBjb3ZlcmFnZV0pCisgIGlmICIkUFlUSE9OIiAtYyAiaW1wb3J0IGRidXMsIGdpLnJlcG9zaXRvcnkuR09iamVjdCwgZGJ1cy5tYWlubG9vcC5nbGliIjsgdGhlbgorICAgIEFDX01TR19SRVNVTFQoW3llc10pCisgIGVsc2UKKyAgICBBQ19NU0dfUkVTVUxUKFtub10pCisgICAgQUNfTVNHX0VSUk9SKFtjYW5ub3QgaW1wb3J0IGRidXMsIGdpLnJlcG9zaXRvcnkuR09iamVjdCwgZGJ1cy5tYWlubG9vcC5nbGliIFB5dGhvbiBtb2R1bGVzXSkKKyAgZmkKK2Vsc2UKKyAgIyAtLWVuYWJsZS10ZXN0cyBub3QgZ2l2ZW46IGRvIG5vdCBhYm9ydCBpZiBQeXRob24gaXMgbWlzc2luZworICBBTV9QQVRIX1BZVEhPTihbMi42XSwgW10sIFs6XSkKK2ZpCisKK2lmIHRlc3QgeCRlbmFibGVfdmVyYm9zZV9tb2RlID0geHllczsgdGhlbgorICAgIEFDX0RFRklORShEQlVTX0VOQUJMRV9WRVJCT1NFX01PREUsMSxbU3VwcG9ydCBhIHZlcmJvc2UgbW9kZV0pCitmaQorCitkbmwgSW50ZW50aW9uYWw6CitkbmwgLSAkRElTQUJMRV9XQVJOSU5HUyBkaXNhYmxlcyB1bnVzZWQtbGFiZWwgd2FybmluZ3MgaWYgbm90CitkbmwgICBjaGVja2luZyBvciBub3QgYXNzZXJ0aW5nICh0ZXN0ZWQgZnVydGhlciBiZWxvdykKK2RubCAtIHdlIGFyZSBub3QgZ29pbmcgdG8gc3RvcCB1c2luZyBkZXByZWNhdGVkIGZ1bmN0aW9ucyBvbiBhIHN0YWJsZQorZG5sICAgYnJhbmNoCitkbmwgLSBtaXNzaW5nIGZpZWxkIGluaXRpYWxpemVycyBiZWluZyAwIGlzIGEgQyBmZWF0dXJlLCBub3QgYSBidWcKK2RubCAtIHVudXNlZC1wYXJhbWV0ZXIgaXMgdG8gbWFrZSB3cml0aW5nIGNhbGxiYWNrcyBsZXNzIGFubm95aW5nCitkbmwgLSBjYXN0LWZ1bmN0aW9uLXR5cGUgaXMgZm9yIHRoZQorZG5sICAgZm9yZWFjaChsaXN0LCAoREJ1c0ZvcmVhY2hGdW5jdGlvbikgZnJlZSwgTlVMTCkgaWRpb20gd2hpY2ggd291bGQKK2RubCAgIGJlIHRvbyBpbnRydXNpdmUgdG8gcmVwbGFjZSBpbiBhIHN0YWJsZSBicmFuY2gKK0RJU0FCTEVfV0FSTklOR1M9IiRESVNBQkxFX1dBUk5JTkdTCisgICAgICAgICAgICAgICAgICAtV25vLWRlcHJlY2F0ZWQtZGVjbGFyYXRpb25zCisgICAgICAgICAgICAgICAgICAtV25vLW1pc3NpbmctZmllbGQtaW5pdGlhbGl6ZXJzCisgICAgICAgICAgICAgICAgICAtV25vLXVudXNlZC1wYXJhbWV0ZXIKKyAgICAgICAgICAgICAgICAgIC1Xbm8tY2FzdC1mdW5jdGlvbi10eXBlIgorCitpZiB0ZXN0IHgkZW5hYmxlX2Fzc2VydHMgPSB4bm87IHRoZW4KKyAgICBBQ19ERUZJTkUoREJVU19ESVNBQkxFX0FTU0VSVCwxLFtEaXNhYmxlIGFzc2VydGlvbiBjaGVja2luZ10pCisgICAgRElTQUJMRV9XQVJOSU5HUz0iJERJU0FCTEVfV0FSTklOR1MgLVduby11bnVzZWQtbGFiZWwiCisgICAgUl9EWU5BTUlDX0xERkxBRz0iIgorICAgIGlmIHRlc3QgeCRlbmFibGVfZW1iZWRkZWRfdGVzdHMgPSB4eWVzOyB0aGVuCisgICAgICAgIERJU0FCTEVfV0FSTklOR1M9IiRESVNBQkxFX1dBUk5JTkdTCisgICAgICAgICAgICAgICAgICAgICAgICAgIC1Xbm8tdW51c2VkLWJ1dC1zZXQtdmFyaWFibGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLVduby11bnVzZWQtdmFyaWFibGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLVduby11bnVzZWQtZnVuY3Rpb24iCisgICAgZmkKK2Vsc2UKKyAgICAjIC1yZHluYW1pYyBpcyBuZWVkZWQgZm9yIGdsaWJjJ3MgYmFja3RyYWNlX3N5bWJvbHMgdG8gd29yay4KKyAgICAjIE5vIGNsdWUgaG93IG11Y2ggb3ZlcmhlYWQgdGhpcyBhZGRzLCBidXQgaXQncyB1c2VmdWwKKyAgICAjIHRvIGRvIHRoaXMgb24gYW55IGFzc2VydGlvbiBmYWlsdXJlLAorICAgICMgc28gZm9yIG5vdyBpdCdzIGVuYWJsZWQgYW55dGltZSBhc3NlcnRzIGFyZSAoY3VycmVudGx5IG5vdAorICAgICMgaW4gcHJvZHVjdGlvbiBidWlsZHMpLgorCisgICAgIyBUbyBnZXQgLXJkeW5hbWljIHlvdSBwYXNzIC1leHBvcnQtZHluYW1pYyB0byBsaWJ0b29sLgorICAgIEFDX0RFRklORShEQlVTX0JVSUxUX1JfRFlOQU1JQywxLFt3aGV0aGVyIC1leHBvcnQtZHluYW1pYyB3YXMgcGFzc2VkIHRvIGxpYnRvb2xdKQorICAgIFJfRFlOQU1JQ19MREZMQUc9LWV4cG9ydC1keW5hbWljCitmaQorQUNfU1VCU1QoUl9EWU5BTUlDX0xERkxBRykKKworaWYgdGVzdCB4JGVuYWJsZV9jaGVja3MgPSB4bm87IHRoZW4KKyAgICBBQ19ERUZJTkUoREJVU19ESVNBQkxFX0NIRUNLUywxLFtEaXNhYmxlIHB1YmxpYyBBUEkgc2FuaXR5IGNoZWNraW5nXSkKKyAgICBBQ19ERUZJTkUoR19ESVNBQkxFX0NIRUNLUywxLFtEaXNhYmxlIEdMaWIgcHVibGljIEFQSSBzYW5pdHkgY2hlY2tpbmddKQorICAgIERJU0FCTEVfV0FSTklOR1M9IiRESVNBQkxFX1dBUk5JTkdTIC1Xbm8tdW51c2VkLWxhYmVsIgorZmkKKworQUhfQk9UVE9NKFsKKy8qIGV4cGxpY2l0bHkgZGVmaW5lIHRoZXNlIG1hY3JvcyB0byBnZXQgbGVzcyBjb25mdXNpbmcgY29uZGl0aW9ucyAqLworI2lmbmRlZiBEQlVTX0RJU0FCTEVfQVNTRVJUCisjICBkZWZpbmUgREJVU19FTkFCTEVfQVNTRVJUIDEKKyNlbmRpZgorI2lmbmRlZiBEQlVTX0RJU0FCTEVfQ0hFQ0tTCisjICBkZWZpbmUgREJVU19FTkFCTEVfQ0hFQ0tTIDEKKyNlbmRpZl0pCisKKyMgVGVzdCBmb3IgY29kZS1jb3ZlcmFnZSB0b29scyBpZiAtLWVuYWJsZS1jb2RlLWNvdmVyYWdlCitBWF9DT0RFX0NPVkVSQUdFCisKK0FTX0lGKFt0ZXN0IHgkZW5hYmxlX2NvZGVfY292ZXJhZ2UgPSB4eWVzXSxbCisgICAgQUNfREVGSU5FX1VOUVVPVEVEKAorICAgICAgW0RCVVNfR0NPVl9FTkFCTEVEXSwgWzFdLAorICAgICAgW0RlZmluZWQgaWYgZ2NvdiBpcyBlbmFibGVkIHRvIGZvcmNlIGEgcmVidWlsZCBkdWUgdG8gY29uZmlnLmggY2hhbmdpbmddKQorICBdKQorCisjIyMjIEludGVnZXIgc2l6ZXMKKworQUNfQ0hFQ0tfU0laRU9GKGNoYXIpCitBQ19DSEVDS19TSVpFT0Yoc2hvcnQpCitBQ19DSEVDS19TSVpFT0YobG9uZykKK0FDX0NIRUNLX1NJWkVPRihpbnQpCitBQ19DSEVDS19TSVpFT0Yodm9pZCAqKQorQUNfQ0hFQ0tfU0laRU9GKGxvbmcgbG9uZykKK0FDX0NIRUNLX1NJWkVPRihfX2ludDY0KQorCisjIyMgU2VlIHdoYXQgb3VyIDY0IGJpdCB0eXBlIGlzIGNhbGxlZAorQUNfTVNHX0NIRUNLSU5HKFs2NC1iaXQgaW50ZWdlciB0eXBlXSkKKworY2FzZSA4IGluCiskYWNfY3Zfc2l6ZW9mX2ludCkKKyAgZGJ1c2ludDY0PWludAorICBkYnVzaW50NjRfY29uc3RhbnQ9Jyh2YWwpJworICBkYnVzdWludDY0X2NvbnN0YW50PScodmFsKScKKyAgOzsKKyRhY19jdl9zaXplb2ZfbG9uZykKKyAgZGJ1c2ludDY0PWxvbmcKKyAgZGJ1c2ludDY0X2NvbnN0YW50PScodmFsIyNMKScKKyAgZGJ1c3VpbnQ2NF9jb25zdGFudD0nKHZhbCMjVUwpJworICA7OworJGFjX2N2X3NpemVvZl9sb25nX2xvbmcpCisgIGRidXNpbnQ2ND0nbG9uZyBsb25nJworICBkYnVzaW50NjRfY29uc3RhbnQ9Jyh2YWwjI0xMKScKKyAgZGJ1c3VpbnQ2NF9jb25zdGFudD0nKHZhbCMjVUxMKScKKyAgOzsKKyRhY19jdl9zaXplb2ZfX19pbnQ2NCkKKyAgZGJ1c2ludDY0PV9faW50NjQKKyAgZGJ1c2ludDY0X2NvbnN0YW50PScodmFsIyNpNjQpJworICBkYnVzdWludDY0X2NvbnN0YW50PScodmFsIyN1aTY0KScKKyAgOzsKK2VzYWMKKworQVNfSUYoCisgIFt0ZXN0IC16ICIkZGJ1c2ludDY0Il0sCisgIFtBQ19NU0dfUkVTVUxUKFtub3QgZm91bmRdKQorICBBQ19NU0dfRVJST1IoW0NvdWxkIG5vdCBmaW5kIGEgNjQtYml0IGludGVnZXIgdHlwZS4KKworUGxlYXNlIHJlcG9ydCBhIGJ1ZyBoZXJlIHdpdGggZGV0YWlscyBvZiB5b3VyIHBsYXRmb3JtIGFuZCBjb21waWxlcjoKKworICAgIGh0dHA6Ly9idWdzLmZyZWVkZXNrdG9wLm9yZy9lbnRlcl9idWcuY2dpP3Byb2R1Y3Q9REJ1cyZjb21wb25lbnQ9Y29yZV0pCisgIF0sCisgIGRubCBlbHNlCisgIFsKKyAgICAgICAgREJVU19JTlQ2NF9UWVBFPSIkZGJ1c2ludDY0IgorICAgICAgICBEQlVTX0lOVDY0X0NPTlNUQU5UPSIkZGJ1c2ludDY0X2NvbnN0YW50IgorICAgICAgICBEQlVTX1VJTlQ2NF9DT05TVEFOVD0iJGRidXN1aW50NjRfY29uc3RhbnQiCisgICAgICAgIEFDX01TR19SRVNVTFQoJERCVVNfSU5UNjRfVFlQRSkKKyAgXSkKKworQUNfU1VCU1QoREJVU19JTlQ2NF9UWVBFKQorQUNfU1VCU1QoREJVU19JTlQ2NF9DT05TVEFOVCkKK0FDX1NVQlNUKERCVVNfVUlOVDY0X0NPTlNUQU5UKQorCisjIyMgc2VlIHdoYXQgMzItYml0IGludCBpcyBjYWxsZWQKK0FDX01TR19DSEVDS0lORyhbMzItYml0IGludGVnZXIgdHlwZV0pCisKK2Nhc2UgNCBpbgorJGFjX2N2X3NpemVvZl9zaG9ydCkKKyAgZGJ1c2ludDMyPXNob3J0CisgIDs7CiskYWNfY3Zfc2l6ZW9mX2ludCkKKyAgZGJ1c2ludDMyPWludAorICA7OworJGFjX2N2X3NpemVvZl9sb25nKQorICBkYnVzaW50MzI9bG9uZworICA7OworZXNhYworCitpZiB0ZXN0IC16ICIkZGJ1c2ludDMyIiA7IHRoZW4KKyAgICAgICAgREJVU19JTlQzMl9UWVBFPSJub19pbnQzMl90eXBlX2RldGVjdGVkIgorICAgICAgICBBQ19NU0dfRVJST1IoW05vIDMyLWJpdCBpbnRlZ2VyIHR5cGUgZm91bmRdKQorZWxzZQorICAgICAgICBEQlVTX0lOVDMyX1RZUEU9IiRkYnVzaW50MzIiCisgICAgICAgIEFDX01TR19SRVNVTFQoJERCVVNfSU5UMzJfVFlQRSkKK2ZpCisKK0FDX1NVQlNUKERCVVNfSU5UMzJfVFlQRSkKKworIyMjIHNlZSB3aGF0IDE2LWJpdCBpbnQgaXMgY2FsbGVkCitBQ19NU0dfQ0hFQ0tJTkcoWzE2LWJpdCBpbnRlZ2VyIHR5cGVdKQorCitjYXNlIDIgaW4KKyRhY19jdl9zaXplb2Zfc2hvcnQpCisgIGRidXNpbnQxNj1zaG9ydAorICA7OworJGFjX2N2X3NpemVvZl9pbnQpCisgIGRidXNpbnQxNj1pbnQKKyAgOzsKK2VzYWMKKworaWYgdGVzdCAteiAiJGRidXNpbnQxNiIgOyB0aGVuCisgICAgICAgIERCVVNfSU5UMTZfVFlQRT0ibm9faW50MTZfdHlwZV9kZXRlY3RlZCIKKyAgICAgICAgQUNfTVNHX0VSUk9SKFtObyAxNi1iaXQgaW50ZWdlciB0eXBlIGZvdW5kXSkKK2Vsc2UKKyAgICAgICAgREJVU19JTlQxNl9UWVBFPSIkZGJ1c2ludDE2IgorICAgICAgICBBQ19NU0dfUkVTVUxUKCREQlVTX0lOVDE2X1RZUEUpCitmaQorCitBQ19TVUJTVChEQlVTX0lOVDE2X1RZUEUpCisKKyMjIGJ5dGUgb3JkZXIKK2Nhc2UgJGhvc3Rfb3MgaW4KKwlkYXJ3aW4qKQorCQkjIGNoZWNrIGF0IGNvbXBpbGUtdGltZSwgc28gdGhhdCBpdCBpcyBwb3NzaWJsZSB0byBidWlsZCB1bml2ZXJzYWwKKwkJIyAod2l0aCBtdWx0aXBsZSBhcmNoaXRlY3R1cmVzIGF0IG9uY2Ugb24gdGhlIGNvbXBpbGUgbGluZSkKKwkJQUhfVkVSQkFUSU0oW1dPUkRTX0JJR0VORElBTl9EQVJXSU5dLCBbCisJCQkvKiBVc2UgdGhlIGNvbXBpbGVyLXByb3ZpZGVkIGVuZGlhbm5lc3MgZGVmaW5lcyB0byBhbGxvdyB1bml2ZXJzYWwgY29tcGlsaW5nLiAqLworCQkJI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOX18pCisJCQkjZGVmaW5lIFdPUkRTX0JJR0VORElBTiAxCisJCQkjZW5kaWYKKwkJXSkKKwkJOzsKKwkqKQorCQlBQ19DX0JJR0VORElBTgorCQk7OworZXNhYworCisjIEFzIGEgR05VIGV4dGVuc2lvbiwgZ2xpYmMgZGVjbGFyZXMgZW52aXJvbiBpbiB1bmlzdGQuaCwgd2hpY2ggaXMgb25lIG9mCisjIHRoZSBBQ19JTkNMVURFU19ERUZBVUxULgorQUNfQ0hFQ0tfREVDTFMoW2Vudmlyb25dKQorCitkbmwgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorZG5sICoqKiB2YV9jb3B5IGNoZWNrcyAoZnJvbSBHTGliKSAqKioKK2RubCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitkbmwgd2UgY3VycmVudGx5IGNoZWNrIGZvciBhbGwgdGhyZWUgdmFfY29weSBwb3NzaWJpbGl0aWVzLCBzbyB3ZSBnZXQKK2RubCBhbGwgcmVzdWx0cyBpbiBjb25maWcubG9nIGZvciBidWcgcmVwb3J0cy4KK0FDX0NBQ0hFX0NIRUNLKFtmb3IgYW4gaW1wbGVtZW50YXRpb24gb2YgdmFfY29weSgpXSxkYnVzX2N2X3ZhX2NvcHksWworCUFDX0xJTktfSUZFTFNFKFtBQ19MQU5HX1NPVVJDRShbI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCXN0YXRpYyB2b2lkIGYgKGludCBpLCAuLi4pIHsKKwl2YV9saXN0IGFyZ3MxLCBhcmdzMjsKKwl2YV9zdGFydCAoYXJnczEsIGkpOworCXZhX2NvcHkgKGFyZ3MyLCBhcmdzMSk7CisJaWYgKHZhX2FyZyAoYXJnczIsIGludCkgIT0gNDIgfHwgdmFfYXJnIChhcmdzMSwgaW50KSAhPSA0MikKKwkgIGV4aXQgKDEpOworCXZhX2VuZCAoYXJnczEpOyB2YV9lbmQgKGFyZ3MyKTsKKwl9CisJaW50IG1haW4oKSB7CisJICBmICgwLCA0Mik7CisJICByZXR1cm4gMDsKKwl9XSldLAorCVtkYnVzX2N2X3ZhX2NvcHk9eWVzXSwKKwlbZGJ1c19jdl92YV9jb3B5PW5vXSkKK10pCitBQ19DQUNIRV9DSEVDSyhbZm9yIGFuIGltcGxlbWVudGF0aW9uIG9mIF9fdmFfY29weSgpXSxkYnVzX2N2X19fdmFfY29weSxbCisJQUNfTElOS19JRkVMU0UoW0FDX0xBTkdfU09VUkNFKFsjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisJc3RhdGljIHZvaWQgZiAoaW50IGksIC4uLikgeworCXZhX2xpc3QgYXJnczEsIGFyZ3MyOworCXZhX3N0YXJ0IChhcmdzMSwgaSk7CisJX192YV9jb3B5IChhcmdzMiwgYXJnczEpOworCWlmICh2YV9hcmcgKGFyZ3MyLCBpbnQpICE9IDQyIHx8IHZhX2FyZyAoYXJnczEsIGludCkgIT0gNDIpCisJICBleGl0ICgxKTsKKwl2YV9lbmQgKGFyZ3MxKTsgdmFfZW5kIChhcmdzMik7CisJfQorCWludCBtYWluKCkgeworCSAgZiAoMCwgNDIpOworCSAgcmV0dXJuIDA7CisJfV0pXSwKKwlbZGJ1c19jdl9fX3ZhX2NvcHk9eWVzXSwKKwlbZGJ1c19jdl9fX3ZhX2NvcHk9bm9dKQorXSkKKworaWYgdGVzdCAieCRkYnVzX2N2X3ZhX2NvcHkiID0gInh5ZXMiOyB0aGVuCisgIGRidXNfdmFfY29weV9mdW5jPXZhX2NvcHkKK2Vsc2UgaWYgdGVzdCAieCRkYnVzX2N2X19fdmFfY29weSIgPSAieHllcyI7IHRoZW4KKyAgZGJ1c192YV9jb3B5X2Z1bmM9X192YV9jb3B5CitmaQorZmkKKworaWYgdGVzdCAtbiAiJGRidXNfdmFfY29weV9mdW5jIjsgdGhlbgorICBBQ19ERUZJTkVfVU5RVU9URUQoREJVU19WQV9DT1BZLCRkYnVzX3ZhX2NvcHlfZnVuYyxbQSAndmFfY29weScgc3R5bGUgZnVuY3Rpb25dKQorZmkKKworQUNfTEFOR19QVVNIKEMpCitBQ19DQUNIRV9DSEVDSyhbd2hldGhlciB2YV9saXN0cyBjYW4gYmUgY29waWVkIGJ5IHZhbHVlXSwKKwlkYnVzX2N2X3ZhX3ZhbF9jb3B5LAorCVtBQ19SVU5fSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oCitbWworCSNpbmNsdWRlIDxzdGRhcmcuaD4KKwkjaW5jbHVkZSA8c3RkbGliLmg+CitdXSwKK1tbCisJc3RhdGljIHZvaWQgZiAoaW50IGksIC4uLikgeworCXZhX2xpc3QgYXJnczEsIGFyZ3MyOworCXZhX3N0YXJ0IChhcmdzMSwgaSk7CisJYXJnczIgPSBhcmdzMTsKKwlpZiAodmFfYXJnIChhcmdzMiwgaW50KSAhPSA0MiB8fCB2YV9hcmcgKGFyZ3MxLCBpbnQpICE9IDQyKQorCSAgZXhpdCAoMSk7CisJdmFfZW5kIChhcmdzMSk7IHZhX2VuZCAoYXJnczIpOworCX0KKwlpbnQgbWFpbigpIHsKKwkgIGYgKDAsIDQyKTsKKwkgIHJldHVybiAwOworCX0KK11dKV0sCisJW2RidXNfY3ZfdmFfdmFsX2NvcHk9eWVzXSwKKwlbZGJ1c19jdl92YV92YWxfY29weT1ub10sCisJW2RidXNfY3ZfdmFfdmFsX2NvcHk9eWVzXSkKK10pCitBQ19MQU5HX1BPUChDKQorCitpZiB0ZXN0ICJ4JGRidXNfY3ZfdmFfdmFsX2NvcHkiID0gInhubyI7IHRoZW4KKyAgQUNfREVGSU5FKERCVVNfVkFfQ09QWV9BU19BUlJBWSwxLCBbJ3ZhX2xpc3RzJyBjYW5ub3QgYmUgY29waWVzIGFzIHZhbHVlc10pCitmaQorCisKKyMjIyMgQXRvbWljIGludGVnZXJzCisKK0FDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyICRDQyBrbm93cyBfX3N5bmNfc3ViX2FuZF9mZXRjaCgpXSwKKyAgZGJ1c19jdl9zeW5jX3N1Yl9hbmRfZmV0Y2gsCisgIFtBQ19MSU5LX0lGRUxTRShbCisgICAgIEFDX0xBTkdfUFJPR1JBTShbW11dLCBbW2ludCBhID0gNDsgaW50IGIgPSBfX3N5bmNfc3ViX2FuZF9mZXRjaCgmYSwgNCk7IGV4aXQoYik7IF1dKV0sCisgICAgIFtkYnVzX2N2X3N5bmNfc3ViX2FuZF9mZXRjaD15ZXNdLAorICAgICBbZGJ1c19jdl9zeW5jX3N1Yl9hbmRfZmV0Y2g9bm9dKQorICBdKQorCitpZiB0ZXN0ICJ4JGRidXNfY3Zfc3luY19zdWJfYW5kX2ZldGNoIiA9ICJ4eWVzIiA7IHRoZW4KKyAgIGhhdmVfc3luYz0xCitlbHNlCisgICBoYXZlX3N5bmM9MAorZmkKKworQUNfREVGSU5FX1VOUVVPVEVEKFtEQlVTX1VTRV9TWU5DXSwgWyRoYXZlX3N5bmNdLCBbVXNlIHRoZSBnY2MgX19zeW5jIGV4dGVuc2lvbl0pCisKKyMjIyMgVmFyaW91cyBmdW5jdGlvbnMKK0FDX1NFQVJDSF9MSUJTKHNvY2tldCxbc29ja2V0IG5ldHdvcmtdKQorQUNfQ0hFQ0tfRlVOQyhnZXRob3N0YnluYW1lLCxbQUNfQ0hFQ0tfTElCKG5zbCxnZXRob3N0YnluYW1lKV0pCisKK0FDX0NIRUNLX0ZVTkNTKFt2c25wcmludGYgdmFzcHJpbnRmIG5hbm9zbGVlcCB1c2xlZXAgc2V0ZW52IGNsZWFyZW52IHVuc2V0ZW52IHNvY2tldHBhaXIgZ2V0Z3JvdXBsaXN0IGZwYXRoY29uZiBzZXRybGltaXQgcG9sbCBzZXRsb2NhbGUgbG9jYWxlY29udiBzdHJ0b2xsIHN0cnRvdWxsIGlzc2V0dWdpZCBnZXRyZXN1aWQgc2V0cmVzdWlkIGdldHJsaW1pdCBwcmxpbWl0XSkKKworQUNfQ0hFQ0tfSEVBREVSUyhbc3lzbG9nLmhdKQoraWYgdGVzdCAieCRhY19jdl9oZWFkZXJfc3lzbG9nX2giID0gInh5ZXMiOyB0aGVuCisgIEFDX0NIRUNLX0RFQ0xTKFtMT0dfUEVSUk9SXSwgW10sIFtdLCBbWyNpbmNsdWRlIDxzeXNsb2cuaD5dXSkKK2ZpCisKKyMgRm9yIHRlc3Qtc2VnZmF1bHQuYworQUNfQ0hFQ0tfSEVBREVSU19PTkNFKFtzeXMvcHJjdGwuaF0pCitBQ19DSEVDS19GVU5DU19PTkNFKFtwcmN0bCByYWlzZV0pCisKK0FDX01TR19DSEVDS0lORyhmb3IgZGlyZmQpCitBQ19MSU5LX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8ZGlyZW50Lmg+CitdXSwgW1sKK0RJUiAqZGlycDsKK2RpcnAgPSBvcGVuZGlyKCIuIik7CitkaXJmZChkaXJwKTsKK2Nsb3NlZGlyKGRpcnApOworXV0pXSwKK1tkYnVzX2hhdmVfZGlyZmQ9eWVzXSwKK1tkYnVzX2hhdmVfZGlyZmQ9bm9dKQorQUNfTVNHX1JFU1VMVCgkZGJ1c19oYXZlX2RpcmZkKQoraWYgdGVzdCAiJGRidXNfaGF2ZV9kaXJmZCIgPSB5ZXM7IHRoZW4KKwlBQ19ERUZJTkUoSEFWRV9ESVJGRCwxLFtIYXZlIGRpcmZkIGZ1bmN0aW9uXSkKK2Vsc2UKKwlBQ19NU0dfQ0hFQ0tJTkcoZm9yIERJUiAqZGlycC0+ZGRfZmQpCisJQUNfTElOS19JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGRpcmVudC5oPgorCV1dLCBbWworRElSICpkaXJwOworaW50IGZkOworZGlycCA9IG9wZW5kaXIoIi4iKTsKK2ZkID0gZGlycC0+ZGRfZmQ7CitjbG9zZWRpcihkaXJwKTsKKyAgICAgICAgXV0pXSwKKyAgICAgICAgW2RidXNfaGF2ZV9kZGZkPXllc10sCisgICAgICAgIFtkYnVzX2hhdmVfZGRmZD1ub10pCisJQUNfTVNHX1JFU1VMVCgkZGJ1c19oYXZlX2RkZmQpCisJaWYgdGVzdCAiJGRidXNfaGF2ZV9kZGZkIiA9IHllczsgdGhlbgorCQlBQ19ERUZJTkUoSEFWRV9EREZELDEsW0hhdmUgdGhlIGRkZmQgbWVtYmVyIG9mIERJUl0pCisJZmkKK2ZpCisKK0FDX0NIRUNLX0hFQURFUlMoc3lzL3Jlc291cmNlLmgpCitBQ19DSEVDS19IRUFERVJTKFtzeXMvdGltZS5oXSkKKworQUNfQ0hFQ0tfSEVBREVSUyhkaXJlbnQuaCkKKworQUNfQ0hFQ0tfSEVBREVSUyhbZXhlY2luZm8uaF0sCisJW0FDX1NFQVJDSF9MSUJTKFtiYWNrdHJhY2VdLCBbZXhlY2luZm9dLAorCQlbQUNfREVGSU5FKFtIQVZFX0JBQ0tUUkFDRV0sIFsxXSwKKwkJCVtEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSBiYWNrdHJhY2UoKS5dKV0pXSkKKworQUNfQ0hFQ0tfSEVBREVSUyhlcnJuby5oKQorCitBQ19DSEVDS19IRUFERVJTKHNpZ25hbC5oKQorCitBQ19DSEVDS19IRUFERVJTKGxvY2FsZS5oKQorCitBQ19DSEVDS19IRUFERVJTKGJ5dGVzd2FwLmgpCisKK0FDX0NIRUNLX0hFQURFUlModW5pc3RkLmgpCisKK0FDX0NIRUNLX0hFQURFUlMoW3N0ZGludC5oXSkKKworQUNfQ0hFQ0tfSEVBREVSUyh3czJ0Y3BpcC5oKQorCitBQ19DSEVDS19IRUFERVJTKGFsbG9jYS5oKQorCisjIEFkZCAtRF9QT1NJWF9QVEhSRUFEX1NFTUFOVElDUyBpZiBvbiBTb2xhcmlzCisjCitjYXNlICRob3N0X29zIGluCisgICAgc29sYXJpcyopCisgICAgICAgQ0ZMQUdTPSIkQ0ZMQUdTIC1EX1BPU0lYX1BUSFJFQURfU0VNQU5USUNTIiA7OworZXNhYworCisjIGNoZWNraW5nIGZvciBhIHBvc2l4IHZlcnNpb24gb2YgZ2V0cHduYW1fcgorIyBpZiB3ZSBhcmUgY3Jvc3MgY29tcGlsaW5nIGFuZCBjYW4gbm90IHJ1biB0aGUgdGVzdAorIyBhc3N1bWUgZ2V0cHduYW1fciBpcyB0aGUgcG9zaXggdmVyc2lvbgorIyBpdCBpcyB1cCB0byB0aGUgcGVyc29uIGNyb3NzIGNvbXBpbGluZyB0byBjaGFuZ2UKKyMgdGhpcyBiZWhhdmlvciBpZiBkZXNpcmVkCitBQ19MQU5HX1BVU0goQykKK0FDX0NBQ0hFX0NIRUNLKFtmb3IgcG9zaXggZ2V0cHduYW1fcl0sCisJCWFjX2N2X2Z1bmNfcG9zaXhfZ2V0cHduYW1fciwKKwkJW0FDX1JVTl9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTSgKK1tbCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxwd2QuaD4KK11dLAorW1sKKyAgICBjaGFyIGJ1ZmZlclsxMDAwMF07CisgICAgc3RydWN0IHBhc3N3ZCBwd2QsICpwd3B0ciA9ICZwd2Q7CisgICAgaW50IGVycm9yOworICAgIGVycm5vID0gMDsKKyAgICBlcnJvciA9IGdldHB3bmFtX3IgKCIiLCAmcHdkLCBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgKGJ1ZmZlciksICZwd3B0cik7CisgICByZXR1cm4gKGVycm9yIDwgMCAmJiBlcnJubyA9PSBFTk9TWVMpCisJICAgfHwgZXJyb3IgPT0gRU5PU1lTOworXV0pXSwKKwlbYWNfY3ZfZnVuY19wb3NpeF9nZXRwd25hbV9yPXllc10sCisJW2FjX2N2X2Z1bmNfcG9zaXhfZ2V0cHduYW1fcj1ub10sCisgICAgICAgIFthY19jdl9mdW5jX3Bvc2l4X2dldHB3bmFtX3I9eWVzXQorKV0pCitBQ19MQU5HX1BPUChDKQorCitpZiB0ZXN0ICIkYWNfY3ZfZnVuY19wb3NpeF9nZXRwd25hbV9yIiA9IHllczsgdGhlbgorICAgICAgICBBQ19ERUZJTkUoSEFWRV9QT1NJWF9HRVRQV05BTV9SLDEsCisgICAgICAgICAgICAgICAgW0hhdmUgUE9TSVggZnVuY3Rpb24gZ2V0cHduYW1fcl0pCitlbHNlCisgICAgICAgIEFDX0NBQ0hFX0NIRUNLKFtmb3Igbm9ucG9zaXggZ2V0cHduYW1fcl0sCisgICAgICAgICAgICAgICAgYWNfY3ZfZnVuY19ub25wb3NpeF9nZXRwd25hbV9yLAorICAgICAgICAgICAgICAgIFtBQ19MSU5LX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbI2luY2x1ZGUgPHB3ZC5oPl1dLCBbW2NoYXIgYnVmZmVyWzEwMDAwXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBwYXNzd2QgcHdkOworICAgICAgICAgICAgICAgICAgICAgICAgZ2V0cHduYW1fciAoIiIsICZwd2QsIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgKGJ1ZmZlcikpO11dKV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbYWNfY3ZfZnVuY19ub25wb3NpeF9nZXRwd25hbV9yPXllc10sCisgICAgICAgICAgICAgICAgICAgICAgICBbYWNfY3ZfZnVuY19ub25wb3NpeF9nZXRwd25hbV9yPW5vXSldKQorICAgICAgICAgICAgICAgIGlmIHRlc3QgIiRhY19jdl9mdW5jX25vbnBvc2l4X2dldHB3bmFtX3IiID0geWVzOyB0aGVuCisgICAgICAgICAgICAgICAgQUNfREVGSU5FKEhBVkVfTk9OUE9TSVhfR0VUUFdOQU1fUiwxLAorICAgICAgICAgICAgICAgICAgICAgICAgW0hhdmUgbm9uLVBPU0lYIGZ1bmN0aW9uIGdldHB3bmFtX3JdKQorICAgICAgICBmaQorZmkKKworZG5sIGNoZWNrIGZvciBzb2NrbGVuX3QKK0FDX01TR19DSEVDS0lORyh3aGV0aGVyIHNvY2tsZW5fdCBpcyBkZWZpbmVkKQorQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRkYi5oPgorXV0sIFtbCitzb2NrbGVuX3QgZm9vOworZm9vID0gMTsKK11dKV0sCitbZGJ1c19oYXZlX3NvY2tsZW5fdD15ZXNdLAorW2RidXNfaGF2ZV9zb2NrbGVuX3Q9bm9dKQorQUNfTVNHX1JFU1VMVCgkZGJ1c19oYXZlX3NvY2tsZW5fdCkKKworaWYgdGVzdCAieCRkYnVzX2hhdmVfc29ja2xlbl90IiA9ICJ4eWVzIjsgdGhlbgorICAgIEFDX0RFRklORShIQVZFX1NPQ0tMRU5fVCwxLFtIYXZlIHNvY2tsZW5fdCB0eXBlXSkKK2ZpCisKK2RubCBjaGVjayBmb3Igd3JpdGV2IGhlYWRlciBhbmQgd3JpdGV2IGZ1bmN0aW9uIHNvIHdlJ3JlCitkbmwgZ29vZCB0byBnbyBpZiBIQVZFX1dSSVRFViBnZXRzIGRlZmluZWQuCitBQ19DSEVDS19IRUFERVJTKHN5cy91aW8uaCwgW0FDX0NIRUNLX0ZVTkNTKHdyaXRldildKQorCitkbmwgbmVlZGVkIG9uIGRhcndpbiBmb3IgTkFNRV9NQVgKK0FDX0NIRUNLX0hFQURFUlMoc3lzL3N5c2xpbWl0cy5oKQorCitkbmwgTWFrZSBpdCBlYXN5IHRvIGNoZWNrIGlmIHdlIGhhdmUgTVNHX05PU0lHTkFMIHdpdGhvdXQgYWN0dWFsbHkgaGF2aW5nIHRvIGluY2x1ZGUgc3lzL3NvY2tldC5oCitBQ19DSEVDS19ERUNMUyhbTVNHX05PU0lHTkFMXSwgW10sIFtdLCBbWyAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPiBdXSkKKworZG5sIGNoZWNrIGZvciBmbGF2b3VycyBvZiB2YXJhcmdzIG1hY3JvcyAodGVzdCBmcm9tIEdMaWIpCitBQ19NU0dfQ0hFQ0tJTkcoZm9yIElTTyBDOTkgdmFyYXJncyBtYWNyb3MgaW4gQykKK0FDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1tdXSwgW1sKK2ludCBhKGludCBwMSwgaW50IHAyLCBpbnQgcDMpOworI2RlZmluZSBjYWxsX2EoLi4uKSBhKDEsX19WQV9BUkdTX18pCitjYWxsX2EoMiwzKTsKK11dKV0sCitbZGJ1c19oYXZlX2lzb19jX3ZhcmFyZ3M9eWVzXSwKK1tkYnVzX2hhdmVfaXNvX2NfdmFyYXJncz1ub10pCitBQ19NU0dfUkVTVUxUKCRkYnVzX2hhdmVfaXNvX2NfdmFyYXJncykKKworQUNfTVNHX0NIRUNLSU5HKGZvciBHTlVDIHZhcmFyZ3MgbWFjcm9zKQorQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbW11dLCBbWworaW50IGEoaW50IHAxLCBpbnQgcDIsIGludCBwMyk7CisjZGVmaW5lIGNhbGxfYShwYXJhbXMuLi4pIGEoMSxwYXJhbXMpCitjYWxsX2EoMiwzKTsKK11dKV0sCitbZGJ1c19oYXZlX2dudWNfdmFyYXJncz15ZXNdLAorW2RidXNfaGF2ZV9nbnVjX3ZhcmFyZ3M9bm9dKQorQUNfTVNHX1JFU1VMVCgkZGJ1c19oYXZlX2dudWNfdmFyYXJncykKKworZG5sIE91dHB1dCB2YXJhcmdzIHRlc3RzCitpZiB0ZXN0IHgkZGJ1c19oYXZlX2lzb19jX3ZhcmFyZ3MgPSB4eWVzOyB0aGVuCisgICAgQUNfREVGSU5FKEhBVkVfSVNPX1ZBUkFSR1MsMSxbSGF2ZSBJU08gQzk5IHZhcmFyZ3MgbWFjcm9zXSkKK2ZpCitpZiB0ZXN0IHgkZGJ1c19oYXZlX2dudWNfdmFyYXJncyA9IHh5ZXM7IHRoZW4KKyAgICBBQ19ERUZJTkUoSEFWRV9HTlVDX1ZBUkFSR1MsMSxbSGF2ZSBHTlUtc3R5bGUgdmFyYXJncyBtYWNyb3NdKQorZmkKKworZG5sIENoZWNrIGZvciB2YXJpb3VzIGNyZWRlbnRpYWxzLgorQUNfTVNHX0NIRUNLSU5HKGZvciBzdHJ1Y3QgY21zZ2NyZWQpCitBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorXV0sIFtbCitzdHJ1Y3QgY21zZ2NyZWQgY3JlZDsKKworY3JlZC5jbWNyZWRfcGlkID0gMDsKK11dKV0sCitbZGJ1c19oYXZlX3N0cnVjdF9jbXNnY3JlZD15ZXNdLAorW2RidXNfaGF2ZV9zdHJ1Y3RfY21zZ2NyZWQ9bm9dKQorQUNfTVNHX1JFU1VMVCgkZGJ1c19oYXZlX3N0cnVjdF9jbXNnY3JlZCkKKworaWYgdGVzdCB4JGRidXNfaGF2ZV9zdHJ1Y3RfY21zZ2NyZWQgPSB4eWVzOyB0aGVuCisgICAgQUNfREVGSU5FKEhBVkVfQ01TR0NSRUQsMSxbSGF2ZSBjbXNnY3JlZCBzdHJ1Y3R1cmVdKQorZmkKKworQUNfQ0hFQ0tfTUVNQkVSKFtzdHJ1Y3QgdW5wY2JpZC51bnBfcGlkXSwKKyAgICAgICAgICAgICAgICBbQUNfREVGSU5FKFtIQVZFX1VOUENCSURdLCAxLCBbSGF2ZSB1bnBjYmlkIHN0cnVjdHVyZV0pXSwKKyAgICAgICAgICAgICAgICBbXSwKKyAgICAgICAgICAgICAgICBbWyNpbmNsdWRlIDxzeXMvdW4uaD5dXSkKKworQUNfQ0hFQ0tfRlVOQ1MoZ2V0cGVlcnVjcmVkIGdldHBlZXJlaWQpCisKK0FDX0NIRUNLX0ZVTkNTKHBpcGUyIGFjY2VwdDQpCisKK1BLR19DSEVDS19NT0RVTEVTKFtFWFBBVF0sIFtleHBhdF0pCisKK3NhdmVfY2ZsYWdzPSIkQ0ZMQUdTIgorc2F2ZV9saWJzPSIkTElCUyIKK0NGTEFHUz0iJENGTEFHUyAkRVhQQVRfQ0ZMQUdTIgorTElCUz0iJExJQlMgJEVYUEFUX0xJQlMiCitBQ19DSEVDS19GVU5DUyhbWE1MX1NldEhhc2hTYWx0XSkKK0NGTEFHUz0iJHNhdmVfY2ZsYWdzIgorTElCUz0iJHNhdmVfbGlicyIKKworIyBUaHJlYWQgbGliIGRldGVjdGlvbgorQUNfQVJHX1ZBUihbVEhSRUFEX0xJQlNdKQorc2F2ZV9saWJzPSIkTElCUyIKK0xJQlM9IiRMSUJTICRUSFJFQURfTElCUyIKKworaXNfbWlzc2luZ19wdGhyZWFkX2Z1bmN0aW9uPSJpcyByZXF1aXJlZCB3aGVuIGNvbXBpbGluZyBELUJ1cyBvbiBVbml4IHBsYXRmb3JtcywgYnV0IGlzIG5vdCBpbiB5b3VyIGxpYmMgb3IgbGlicHRocmVhZC4gUGxlYXNlIG9wZW4gYSBidWcgb24gaHR0cHM6Ly9idWdzLmZyZWVkZXNrdG9wLm9yZy9lbnRlcl9idWcuY2dpP3Byb2R1Y3Q9ZGJ1cyB3aXRoIGRldGFpbHMgb2YgeW91ciBwbGF0Zm9ybS4iCisKKyMgRG9uJ3QgZG8gdGhlc2UgYXV0b21hdGljIGNoZWNrcyBpZiB0aGUgdXNlciBzZXQgVEhSRUFEX0xJQlMgb24gdGhlCisjIGNvbmZpZ3VyZSBjb21tYW5kLWxpbmUuIElmIHRoZXkgZGlkLCB3ZSBhc3N1bWUgdGhleSdyZSByaWdodC4KKyMKKyMgV2UgYWxzbyBkb24ndCBkbyB0aGVzZSBjaGVja3Mgb24gV2luZG93cywgYmVjYXVzZSB5b3UgZG9uJ3QgbmVlZCBtYWdpY2FsCisjIGxpbmtlciBmbGFncyB0byBoYXZlIHRocmVhZGluZyBzdXBwb3J0IHRoZXJlLgorQVNfSUYoW3Rlc3QgIngkZGJ1c191bml4IiA9IHh5ZXMgJiYgdGVzdCAieCRUSFJFQURfTElCUyIgPSB4XSwKKyAgWworICAgICMgTWFuZGF0b3J5IHB0aHJlYWQgZnVuY3Rpb25zLiBJbiBwcmluY2lwbGUsIHNvbWUgb2YgdGhlc2UgY291bGQgYmUgbWFkZQorICAgICMgb3B0aW9uYWwgaWYgdGhlcmUgYXJlIHBsYXRmb3JtcyB0aGF0IGRvbid0IGhhdmUgdGhlbS4KKyAgICAjCisgICAgIyBDdXJyZW50bHksIHdlIG9ubHkgbG9vayBpbiAtbHB0aHJlYWQuCisgICAgIyBJbiBwcmluY2lwbGUgd2UgbWlnaHQgbmVlZCB0byBsb29rIGluIC1scHRocmVhZHMsIC1sdGhyZWFkcywgLi4uCisgICAgIyBhcyB3ZWxsIC0gcGxlYXNlIGZpbGUgYSBidWcgaWYgeW91ciBwbGF0Zm9ybSBuZWVkcyB0aGlzLgorICAgIEFDX1NFQVJDSF9MSUJTKFtwdGhyZWFkX2NvbmRfdGltZWR3YWl0XSwKKyAgICAgICAgW3B0aHJlYWRdLAorICAgICAgICBbVEhSRUFEX0xJQlM9IiRMSUJTIl0sCisgICAgICAgIFtBQ19NU0dfRVJST1IoW3B0aHJlYWRfY29uZF90aW1lZHdhaXQgJGlzX21pc3NpbmdfcHRocmVhZF9mdW5jdGlvbl0pXSwKKyAgICAgICAgW10pCisgICAgQUNfU0VBUkNIX0xJQlMoW3B0aHJlYWRfbXV0ZXhhdHRyX2luaXRdLAorICAgICAgICBbcHRocmVhZF0sCisgICAgICAgIFtUSFJFQURfTElCUz0iJExJQlMiXSwKKyAgICAgICAgW0FDX01TR19FUlJPUihbcHRocmVhZF9tdXRleGF0dHJfaW5pdCAkaXNfbWlzc2luZ19wdGhyZWFkX2Z1bmN0aW9uXSldLAorICAgICAgICBbXSkKKyAgICBBQ19TRUFSQ0hfTElCUyhbcHRocmVhZF9tdXRleGF0dHJfc2V0dHlwZV0sCisgICAgICAgIFtwdGhyZWFkXSwKKyAgICAgICAgW1RIUkVBRF9MSUJTPSIkTElCUyJdLAorICAgICAgICBbQUNfTVNHX0VSUk9SKFtwdGhyZWFkX211dGV4YXR0cl9zZXR0eXBlICRpc19taXNzaW5nX3B0aHJlYWRfZnVuY3Rpb25dKV0sCisgICAgICAgIFtdKQorCisgICAgIyBPcHRpb25hbCwgZm9yIG1vbm90b25pYyBjbG9ja3MuIEJlY2F1c2UgaXQncyBvcHRpb25hbCwgdGhpcyBjaGVjaworICAgICMgaXMgbm9uLWZhdGFsIGlmIHdlIGRvbid0IGZpbmQgaXQuCisgICAgQUNfU0VBUkNIX0xJQlMoW3B0aHJlYWRfY29uZGF0dHJfc2V0Y2xvY2tdLAorICAgICAgICBbcHRocmVhZF0sCisgICAgICAgIFtUSFJFQURfTElCUz0iJExJQlMiXSkKKworICAgIEFTX0lGKFt0ZXN0ICJ4JGFjX2N2X3NlYXJjaF9wdGhyZWFkX2NvbmRhdHRyX3NldGNsb2NrIiAhPSB4bm9dLAorICAgICAgWworICAgICAgICBBQ19TRUFSQ0hfTElCUyhbY2xvY2tfZ2V0cmVzXSwgW3J0XSwgW1RIUkVBRF9MSUJTPSIkTElCUyJdKQorICAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBDTE9DS19NT05PVE9OSUNdKQorICAgICAgICBBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKAorW1sjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KK11dLCBbWworc3RydWN0IHRpbWVzcGVjIG1vbm90b25pY190aW1lcjsKK3B0aHJlYWRfY29uZGF0dHJfdCBhdHRyOworcHRocmVhZF9jb25kYXR0cl9pbml0ICgmYXR0cik7CitwdGhyZWFkX2NvbmRhdHRyX3NldGNsb2NrICgmYXR0ciwgQ0xPQ0tfTU9OT1RPTklDKTsKK2Nsb2NrX2dldHJlcyAoQ0xPQ0tfTU9OT1RPTklDLCZtb25vdG9uaWNfdGltZXIpOworXV0pXSwKKyAgICAgICAgICAgIFtoYXZlX2Nsb2NrX21vbm90b25pYz10cnVlXSwKKyAgICAgICAgICAgIFtoYXZlX2Nsb2NrX21vbm90b25pYz1mYWxzZV0pCisgICAgICAgIEFTX0lGKFt0ZXN0IHgkaGF2ZV9jbG9ja19tb25vdG9uaWMgPSB4dHJ1ZV0sCisJICBbCisgICAgICAgICAgICBBQ19NU0dfUkVTVUxUKFtmb3VuZF0pCisgICAgICAgICAgICBBQ19ERUZJTkUoSEFWRV9NT05PVE9OSUNfQ0xPQ0ssIDEsIFtEZWZpbmUgaWYgd2UgaGF2ZSBDTE9DS19NT05PVE9OSUNdKQorCSAgXSwKKyAgICAgICAgICBbQUNfTVNHX1JFU1VMVChbbm90IGZvdW5kXSldKQorICAgICAgXSkgZG5sIGhhdmUgcHRocmVhZF9jb25kYXR0cl9zZXRjbG9jaworICBdKSBkbmwgb24gVW5peAorCitMSUJTPSIkc2F2ZV9saWJzIgorCitBQ19TVUJTVChbVEhSRUFEX0xJQlNdKQorCisjIFNFTGludXggZGV0ZWN0aW9uCitpZiB0ZXN0IHgkZW5hYmxlX3NlbGludXggPSB4bm8gOyB0aGVuCisgICAgaGF2ZV9zZWxpbnV4PW5vOworZWxzZQorICAgICMgU2VlIGlmIHdlIGhhdmUgU0VMaW51eCBsaWJyYXJ5CisgICAgUEtHX0NIRUNLX01PRFVMRVMoW1NFTElOVVhdLCBbbGlic2VsaW51eCA+PSAyLjAuODZdLAorICAgICAgICAgICAgICAgICBbaGF2ZV9zZWxpbnV4PXllc10sIFtoYXZlX3NlbGludXg9bm9dKQorCisgICAgaWYgdGVzdCB4JGVuYWJsZV9zZWxpbnV4ID0geGF1dG8gOyB0aGVuCisgICAgICAgIGlmIHRlc3QgeCRoYXZlX3NlbGludXggPSB4bm8gOyB0aGVuCisgICAgICAgICAgICAgICAgQUNfTVNHX1dBUk4oW1N1ZmZpY2llbnRseSBuZXcgU0VMaW51eCBsaWJyYXJ5IG5vdCBmb3VuZF0pCisgICAgICAgIGZpCisgICAgZWxzZQorICAgICAgICBpZiB0ZXN0IHgkaGF2ZV9zZWxpbnV4ID0geG5vIDsgdGhlbgorICAgICAgICAgICAgICAgIEFDX01TR19FUlJPUihbU0VsaW51eCBleHBsaWNpdGx5IHJlcXVpcmVkLCBhbmQgU0VMaW51eCBsaWJyYXJ5IG5vdCBmb3VuZF0pCisgICAgICAgIGZpCisgICAgZmkKK2ZpCisKK0FNX0NPTkRJVElPTkFMKEhBVkVfU0VMSU5VWCwgdGVzdCB4JGhhdmVfc2VsaW51eCA9IHh5ZXMpCisKK2lmIHRlc3QgeCRoYXZlX3NlbGludXggPSB4eWVzIDsgdGhlbgorICAgICMgdGhlIHNlbGludXggY29kZSBjcmVhdGVzIHRocmVhZHMKKyAgICAjIHdoaWNoIHJlcXVpcmVzIGxpYnB0aHJlYWQgZXZlbiBvbiBsaW51eAorICAgIEFDX0NIRUNLX0ZVTkMocHRocmVhZF9jcmVhdGUsLFtBQ19DSEVDS19MSUIocHRocmVhZCxwdGhyZWFkX2NyZWF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTRUxJTlVYX1RIUkVBRF9MSUJTPSItbHB0aHJlYWQiXSldKQorCisgICAgU0VMSU5VWF9MSUJTPSIkU0VMSU5VWF9MSUJTICRTRUxJTlVYX1RIUkVBRF9MSUJTIgorICAgIEFDX0RFRklORShIQVZFX1NFTElOVVgsMSxbU0VMaW51eCBzdXBwb3J0XSkKK2Vsc2UKKyAgICBTRUxJTlVYX0xJQlM9CitmaQorCisjIEFwcEFybW9yIGRldGVjdGlvbgorQVNfSUYoW3Rlc3QgeCRlbmFibGVfYXBwYXJtb3IgPSB4bm9dLAorICBbaGF2ZV9hcHBhcm1vcj1ub10sCisgIFsKKyAgUEtHX0NIRUNLX01PRFVMRVMoW0FQUEFSTU9SXSwgW2xpYmFwcGFybW9yID49IDIuOC45NV0sCisgICAgICAgICAgICAgICAgICAgIFtoYXZlX2FwcGFybW9yPXllc10sIFtoYXZlX2FwcGFybW9yPW5vXSkKKyAgUEtHX0NIRUNLX01PRFVMRVMoW0FQUEFSTU9SXzJfMTBdLCBbbGliYXBwYXJtb3IgPj0gMi4xMF0sCisgICAgICAgICAgICAgICAgICAgIFtoYXZlX2FwcGFybW9yXzJfMTA9eWVzXSwgW2hhdmVfYXBwYXJtb3JfMl8xMD1ub10pCisKKyAgQVNfSUYoW3Rlc3QgeCRlbmFibGVfYXBwYXJtb3IgPSB4YXV0byAmJiB0ZXN0IHgkaGF2ZV9hcHBhcm1vciA9IHhub10sCisgICAgICAgIFtBQ19NU0dfV0FSTihbU3VmZmljaWVudGx5IG5ldyBBcHBBcm1vciBsaWJyYXJ5IG5vdCBmb3VuZF0pXSkKKyAgQVNfSUYoW3Rlc3QgeCRlbmFibGVfYXBwYXJtb3IgIT0geGF1dG8gJiYgdGVzdCB4JGhhdmVfYXBwYXJtb3IgPSB4bm9dLAorICAgICAgICBbQUNfTVNHX0VSUk9SKFtBcHBBcm1vciBleHBsaWNpdGx5IHJlcXVpcmVkLCBhbmQgQXBwQXJtb3IgbGlicmFyeSBub3QgZm91bmRdKV0pCisgIF0pCisKK0FTX0lGKFt0ZXN0IHgkaGF2ZV9hcHBhcm1vciA9IHh5ZXNdLAorICAgICAgW0FDX0RFRklORShbSEFWRV9BUFBBUk1PUl0sIFsxXSwgW0FwcEFybW9yIFN1cHBvcnRdKV0pCitBU19JRihbdGVzdCB4JGhhdmVfYXBwYXJtb3JfMl8xMCA9IHh5ZXNdLAorICAgICAgW0FDX0RFRklORShbSEFWRV9BUFBBUk1PUl8yXzEwXSwgWzFdLAorICAgICAgICAgICAgICAgICBbRGVmaW5lIGlmIGxpYmFwcGFybW9yIGlzIHZlcnNpb24gMi4xMCBvciBsYXRlcl0pXSkKKworIyBpbm90aWZ5IGNoZWNrcworaWYgdGVzdCB4JGVuYWJsZV9pbm90aWZ5ID0geG5vIDsgdGhlbgorICAgIGhhdmVfaW5vdGlmeT1ubzsKK2Vsc2UKKyAgICBBQ19DSEVDS19IRUFERVJTKHN5cy9pbm90aWZ5LmgsIGhhdmVfaW5vdGlmeT15ZXMsIGhhdmVfaW5vdGlmeT1ubykKK2ZpCisKK2RubCBjaGVjayBpZiBpbm90aWZ5IGJhY2tlbmQgaXMgZW5hYmxlZAoraWYgdGVzdCB4JGhhdmVfaW5vdGlmeSA9IHh5ZXM7IHRoZW4KKyAgIEFDX0RFRklORShEQlVTX0JVU19FTkFCTEVfSU5PVElGWSwxLFtVc2UgaW5vdGlmeV0pCisgICBBQ19DSEVDS19GVU5DUyhpbm90aWZ5X2luaXQxKQorZmkKKworQU1fQ09ORElUSU9OQUwoREJVU19CVVNfRU5BQkxFX0lOT1RJRlksIHRlc3QgeCRoYXZlX2lub3RpZnkgPSB4eWVzKQorCisjIEZvciBzaW1wbGljaXR5LCB3ZSByZXF1aXJlIHRoZSB1c2VybGFuZCBBUEkgZm9yIGVwb2xsX2NyZWF0ZTEgYXQKKyMgY29tcGlsZS10aW1lIChnbGliYyAyLjkpLCBidXQgd2UnbGwgcnVuIG9uIGtlcm5lbHMgdGhhdCB0dXJuIG91dAorIyBub3QgdG8gaGF2ZSBpdCBhdCBydW50aW1lLgorQUNfQVJHX0VOQUJMRShbZXBvbGxdLAorICAgICAgICAgICAgICBbQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLWVwb2xsXSxbdXNlIGVwb2xsKDQpIG9uIExpbnV4XSldLAorICAgICAgICAgICAgICBbZW5hYmxlX2Vwb2xsPSRlbmFibGV2YWxdLCBbZW5hYmxlX2Vwb2xsPWF1dG9dKQoraWYgdGVzdCB4JGVuYWJsZV9lcG9sbCA9IHhubzsgdGhlbgorICAgIGhhdmVfbGludXhfZXBvbGw9bm8KK2Vsc2UKKyAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBMaW51eCBlcG9sbCg0KV0pCisgICAgQUNfTElOS19JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTSgKKyAgICAgICAgWworICAgICAgICAjaWZuZGVmIF9fbGludXhfXworICAgICAgICAjZXJyb3IgVGhpcyBpcyBub3QgTGludXgKKyAgICAgICAgI2VuZGlmCisgICAgICAgICNpbmNsdWRlIDxzeXMvZXBvbGwuaD4KKyAgICAgICAgXSwKKyAgICAgICAgW2Vwb2xsX2NyZWF0ZTEgKEVQT0xMX0NMT0VYRUMpO10pXSwKKyAgICAgICAgW2hhdmVfbGludXhfZXBvbGw9eWVzXSwKKyAgICAgICAgW2hhdmVfbGludXhfZXBvbGw9bm9dKQorICAgIEFDX01TR19SRVNVTFQoWyRoYXZlX2xpbnV4X2Vwb2xsXSkKK2ZpCitpZiB0ZXN0IHgkZW5hYmxlX2Vwb2xsLCRoYXZlX2xpbnV4X2Vwb2xsID0geHllcyxubzsgdGhlbgorICAgIEFDX01TR19FUlJPUihbZXBvbGwgc3VwcG9ydCBleHBsaWNpdGx5IGVuYWJsZWQgYnV0IG5vdCBhdmFpbGFibGVdKQorZmkKK2lmIHRlc3QgeCRoYXZlX2xpbnV4X2Vwb2xsID0geHllczsgdGhlbgorICBBQ19ERUZJTkUoW0RCVVNfSEFWRV9MSU5VWF9FUE9MTF0sIDEsIFtEZWZpbmUgdG8gdXNlIGVwb2xsKDQpIG9uIExpbnV4XSkKK2ZpCitBTV9DT05ESVRJT05BTChbSEFWRV9MSU5VWF9FUE9MTF0sIFt0ZXN0IHgkaGF2ZV9saW51eF9lcG9sbCA9IHh5ZXNdKQorCisjIGtxdWV1ZSBjaGVja3MKK2lmIHRlc3QgeCRlbmFibGVfa3F1ZXVlID0geG5vIDsgdGhlbgorICAgIGhhdmVfa3F1ZXVlPW5vCitlbHNlCisgICAgaGF2ZV9rcXVldWU9eWVzCisgICAgQUNfQ0hFQ0tfSEVBREVSKHN5cy9ldmVudC5oLCAsIGhhdmVfa3F1ZXVlPW5vKQorICAgIEFDX0NIRUNLX0ZVTkMoa3F1ZXVlLCAsIGhhdmVfa3F1ZXVlPW5vKQorCisgICAgaWYgdGVzdCB4JGVuYWJsZV9rcXVldWUgPSB4eWVzIC1hIHgkaGF2ZV9rcXVldWUgPSB4bm87IHRoZW4KKyAgICAgICAgQUNfTVNHX0VSUk9SKGtxdWV1ZSBzdXBwb3J0IGV4cGxpY2l0bHkgZW5hYmxlZCBidXQgbm90IGF2YWlsYWJsZSkKKyAgICBmaQorZmkKKworZG5sIGNoZWNrIGlmIGtxdWV1ZSBiYWNrZW5kIGlzIGVuYWJsZWQKK2lmIHRlc3QgeCRoYXZlX2txdWV1ZSA9IHh5ZXM7IHRoZW4KKyAgIEFDX0RFRklORShEQlVTX0JVU19FTkFCTEVfS1FVRVVFLDEsW1VzZSBrcXVldWVdKQorZmkKKworQU1fQ09ORElUSU9OQUwoREJVU19CVVNfRU5BQkxFX0tRVUVVRSwgdGVzdCB4JGhhdmVfa3F1ZXVlID0geHllcykKKworIyBsYXVuY2hkIGNoZWNrcworaWYgdGVzdCB4JGVuYWJsZV9sYXVuY2hkID0geG5vIDsgdGhlbgorICAgIGhhdmVfbGF1bmNoZD1ubworZWxzZQorICAgIGhhdmVfbGF1bmNoZD15ZXMKKyAgICBBQ19DSEVDS19IRUFERVIoW2xhdW5jaC5oXSwgLCBoYXZlX2xhdW5jaGQ9bm8pCisgICAgQUNfUEFUSF9QUk9HKFtMQVVOQ0hDVExdLCBbbGF1bmNoY3RsXSkKKyAgICBpZiB0ZXN0ICJ4JExBVU5DSENUTCIgPSAieCI7IHRoZW4KKyAgICAgICAgaGF2ZV9sYXVuY2hkPW5vCisgICAgZmkKKworICAgIGlmIHRlc3QgeCRlbmFibGVfbGF1bmNoZCA9IHh5ZXMgJiYgdGVzdCB4JGhhdmVfbGF1bmNoZCA9IHhubyA7IHRoZW4KKyAgICAgICAgQUNfTVNHX0VSUk9SKFtsYXVuY2hkIHN1cHBvcnQgZXhwbGljaXRseSBlbmFibGVkIGJ1dCBub3QgYXZhaWxhYmxlXSkKKyAgICBmaQorZmkKKworZG5sIGNoZWNrIGlmIGxhdW5jaGQgaXMgZW5hYmxlZAoraWYgdGVzdCB4JGhhdmVfbGF1bmNoZCA9IHh5ZXM7IHRoZW4KKyAgICBBQ19ERUZJTkUoREJVU19FTkFCTEVfTEFVTkNIRCwxLFtVc2UgbGF1bmNoZCBhdXRvbGF1bmNoXSkKK2ZpCisKK0FNX0NPTkRJVElPTkFMKERCVVNfRU5BQkxFX0xBVU5DSEQsIHRlc3QgeCRoYXZlX2xhdW5jaGQgPSB4eWVzKQorCisjIyMjIERpcmVjdG9yeSB0byBwbGFjZSBsYXVuY2hkIGFnZW50IGZpbGUKK2lmIHRlc3QgIngkd2l0aF9sYXVuY2hkX2FnZW50X2RpciIgPSAieCI7IHRoZW4KKyAgIExBVU5DSERfQUdFTlRfRElSPSIvTGlicmFyeS9MYXVuY2hBZ2VudHMiCitlbHNlCisgICBMQVVOQ0hEX0FHRU5UX0RJUj0iJHdpdGhfbGF1bmNoZF9hZ2VudF9kaXIiCitmaQorCitBQ19TVUJTVChMQVVOQ0hEX0FHRU5UX0RJUikKKworZG5sIGNvbnNvbGUgb3duZXIgZmlsZQoraWYgdGVzdCB4JGVuYWJsZV9jb25zb2xlX293bmVyX2ZpbGUgPSB4bm8gOyB0aGVuCisgICAgaGF2ZV9jb25zb2xlX293bmVyX2ZpbGU9bm87CitlbHNlCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgIHNvbGFyaXMqKQorICAgICAgICBoYXZlX2NvbnNvbGVfb3duZXJfZmlsZT15ZXM7CisgICAgICAgIEFDX0RFRklORShIQVZFX0NPTlNPTEVfT1dORVJfRklMRSwxLFtIYXZlIGNvbnNvbGUgb3duZXIgZmlsZV0pCisgICAgICAgIDs7CisgICAgKikKKyAgICAgICAgaGF2ZV9jb25zb2xlX293bmVyX2ZpbGU9bm87OworICAgIGVzYWMKK2ZpCisKK0FNX0NPTkRJVElPTkFMKEhBVkVfQ09OU09MRV9PV05FUl9GSUxFLCB0ZXN0IHgkaGF2ZV9jb25zb2xlX293bmVyX2ZpbGUgPSB4eWVzKQorCitkbmwgc3lzdGVtZCBkZXRlY3Rpb24KK2lmIHRlc3QgeCRlbmFibGVfc3lzdGVtZCA9IHhubyA7IHRoZW4KKyAgICBoYXZlX3N5c3RlbWQ9bm87CitlbHNlCisgICAgUEtHX0NIRUNLX01PRFVMRVMoW1NZU1RFTURdLAorICAgICAgICBbbGlic3lzdGVtZCA+PSAyMDldLAorICAgICAgICBbaGF2ZV9zeXN0ZW1kPXllc10sCisgICAgICAgIFtQS0dfQ0hFQ0tfTU9EVUxFUyhbU1lTVEVNRF0sCisgICAgICAgICAgICBbbGlic3lzdGVtZC1sb2dpbiA+PSAzMiwgbGlic3lzdGVtZC1kYWVtb24gPj0gMzIsIGxpYnN5c3RlbWQtam91cm5hbCA+PSAzMl0sCisgICAgICAgICAgICBbaGF2ZV9zeXN0ZW1kPXllc10sCisgICAgICAgICAgICBbaGF2ZV9zeXN0ZW1kPW5vXSldKQorZmkKKworaWYgdGVzdCB4JGhhdmVfc3lzdGVtZCA9IHh5ZXM7IHRoZW4KKyAgICBBQ19ERUZJTkUoSEFWRV9TWVNURU1ELDEsW0hhdmUgc3lzdGVtZF0pCitmaQorCitpZiB0ZXN0IHgkZW5hYmxlX3N5c3RlbWQgPSB4eWVzIC1hIHgkaGF2ZV9zeXN0ZW1kICE9IHh5ZXMgOyB0aGVuCisgICAgQUNfTVNHX0VSUk9SKFtFeHBsaWNpdGx5IHJlcXVlc3RlZCBzeXN0ZW1kIHN1cHBvcnQsIGJ1dCBzeXN0ZW1kIG5vdCBmb3VuZF0pCitmaQorCisjIElmIG5vdCBmb3VuZCBpbiAkUEFUSCwgd2UgbWlnaHQgc3RpbGwgaGF2ZSBzeXN0ZW1kIGFuZCBzeXN0ZW1jdGwgYXQgcnVudGltZQorIyAocGVyaGFwcyBkYnVzIGlzIGJlaW5nIGNvbXBpbGVkIGluIGEgbWluaW1hbCBjaHJvb3Qgd2l0aCBubyBzeXN0ZW1kKS4KKyMgQXNzdW1lIHRoZSB1cHN0cmVhbS1yZWNvbW1lbmRlZCBsb2NhdGlvbi4gRGlzdHJpYnV0b3JzIHdpdGggc3BsaXQgL3VzcgorIyBjYW4gb3ZlcnJpZGUgdGhpcyB3aXRoIC4vY29uZmlndXJlIFNZU1RFTUNUTD0vYmluL3N5c3RlbWN0bAorQUNfUEFUSF9QUk9HKFtTWVNURU1DVExdLCBbc3lzdGVtY3RsXSwgWy91c3IvYmluL3N5c3RlbWN0bF0pCisKKyMgbGliYXVkaXQgZGV0ZWN0aW9uCitpZiB0ZXN0IHgkZW5hYmxlX2xpYmF1ZGl0ID0geG5vIDsgdGhlbgorICAgIGhhdmVfbGliYXVkaXQ9bm87CitlbHNlCisgICAgIyBTZWUgaWYgd2UgaGF2ZSBhdWRpdCBkYWVtb24gJiBjYXBhYmlsaXRpZXMgbGlicmFyeQorICAgIEFDX0NIRUNLX0xJQihhdWRpdCwgYXVkaXRfbG9nX3VzZXJfYXZjX21lc3NhZ2UsCisgICAgICAgICAgICAgICAgIGhhdmVfbGliYXVkaXQ9eWVzLCBoYXZlX2xpYmF1ZGl0PW5vKQorICAgIGlmIHRlc3QgeCRoYXZlX2xpYmF1ZGl0ID0geHllcyA7IHRoZW4KKyAgICAgICAgQUNfQ0hFQ0tfTElCKGNhcC1uZywgY2FwbmdfY2xlYXIsCisgICAgICAgICAgICAgICAgIGhhdmVfbGliYXVkaXQ9eWVzLCBoYXZlX2xpYmF1ZGl0PW5vKQorICAgIGZpCitmaQorCitBTV9DT05ESVRJT05BTChIQVZFX0xJQkFVRElULCB0ZXN0IHgkaGF2ZV9saWJhdWRpdCA9IHh5ZXMpCisKK2lmIHRlc3QgeCRoYXZlX2xpYmF1ZGl0ID0geHllcyA7IHRoZW4KKyAgICBTRUxJTlVYX0xJQlM9IiRTRUxJTlVYX0xJQlMgLWxhdWRpdCAtbGNhcC1uZyIKKyAgICBBQ19ERUZJTkUoSEFWRV9MSUJBVURJVCwxLFthdWRpdCBkYWVtb24gU0VMaW51eCBzdXBwb3J0XSkKK2ZpCisKK0FDX1NVQlNUKFtTRUxJTlVYX0xJQlNdKQorCisjIENoZWNrIGZvciBBRFQgQVBJIChTb2xhcmlzIEJhc2ljIFNlY3VyaXR5IE1vZGUgYXVkaXRpbmcpCitBQ19NU0dfQ0hFQ0tJTkcoZm9yIEFEVCBBUEkpCitBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbCisjaW5jbHVkZSA8YnNtL2FkdC5oPgorYWR0X3VzZXJfY29udGV4dCA9IEFEVF9VU0VSOworXV0sIFtbXV0pXSwgWyBjaGVja19hZHRfYXVkaXQ9eWVzIF0sIFsgY2hlY2tfYWR0X2F1ZGl0PW5vIF0pCisKK2lmIHRlc3QgJHtjaGVja19hZHRfYXVkaXR9ID0geWVzCit0aGVuCisgICBBQ19ERUZJTkUoW0hBVkVfQURUXSwgW10sIFtBZHQgYXVkaXQgQVBJXSkKKyAgIEFEVF9MSUJTPSItbGJzbSIKKyAgIExJQlM9Ii1sYnNtICRMSUJTIgorICAgQUNfTVNHX1JFU1VMVCh5ZXMpCitlbHNlCisgICBBQ19NU0dfUkVTVUxUKG5vKQorZmkKK0FDX1NVQlNUKFtBRFRfTElCU10pCisKKyMgQ2hlY2sgZm9yIFNDTV9SSUdIVFMKK0FDX01TR19DSEVDS0lORyhbZm9yIFNDTV9SSUdIVFNdKQorQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxzeXMvdW4uaD4KK3N0YXRpYyBpbnQgeCA9IFNDTV9SSUdIVFM7CitdXSwgW1tdXSldLAorWyBBQ19NU0dfUkVTVUxUKFtzdXBwb3J0ZWRdKQorICBBQ19ERUZJTkUoW0hBVkVfVU5JWF9GRF9QQVNTSU5HXSwgWzFdLCBbU3VwcG9ydHMgc2VuZGluZyBVTklYIGZpbGUgZGVzY3JpcHRvcnNdKSBdLAorWyBBQ19NU0dfUkVTVUxUKFtub3Qgc3VwcG9ydGVkXSkgXSkKKworTkVUV09SS19saWJzPQoraWYgdGVzdCB4JGRidXNfd2luID0geHllcyA7IHRoZW4KKyAgaWYgdGVzdCB4JGRidXNfd2luY2UgPSB4eWVzIDsgdGhlbgorICAgIE5FVFdPUktfbGlicz0iLWx3czIiCisgIGVsc2UKKyAgICBORVRXT1JLX2xpYnM9Ii1sd3MyXzMyIC1saXBobHBhcGkgLWxkYmdoZWxwIgorICBmaQorZmkKKworQUNfU1VCU1QoW05FVFdPUktfbGlic10pCisKK0FDX0FSR19XSVRIKFt2YWxncmluZF0sCisgIFtBU19IRUxQX1NUUklORyhbLS13aXRoLXZhbGdyaW5kXSwKKyAgICAgW0FkZCBpbnN0cnVtZW50YXRpb24gdG8gaGVscCB2YWxncmluZCB0byB1bmRlcnN0YW5kIG91ciBhbGxvY2F0b3JdKV0sCisgIFtdLAorICBbd2l0aF92YWxncmluZD1ub10pCisKK0FTX0lGKFt0ZXN0ICJ4JHdpdGhfdmFsZ3JpbmQiID0geGF1dG9dLAorICBbUEtHX0NIRUNLX0VYSVNUUyhbdmFsZ3JpbmQgPj0gMy42XSwKKyAgICBbd2l0aF92YWxncmluZD15ZXNdLCBbd2l0aF92YWxncmluZD1ub10pXSkKKworaWYgdGVzdCB4JHdpdGhfdmFsZ3JpbmQgIT0geG5vOyB0aGVuCisgIFBLR19DSEVDS19NT0RVTEVTKFtWQUxHUklORF0sIFt2YWxncmluZCA+PSAzLjZdKQorICBBQ19ERUZJTkUoW1dJVEhfVkFMR1JJTkRdLCBbMV0sIFtEZWZpbmUgdG8gYWRkIFZhbGdyaW5kIGluc3RydW1lbnRhdGlvbl0pCitmaQorCisjIyMjIFNldCB1cCBmaW5hbCBmbGFncworTElCREJVU19MSUJTPSIkVEhSRUFEX0xJQlMgJE5FVFdPUktfbGlicyAkU1lTVEVNRF9MSUJTIgorQUNfU1VCU1QoW0xJQkRCVVNfTElCU10pCisKKyMjIyBYMTEgZGV0ZWN0aW9uCitEQlVTX1hfTElCUz0KK0RCVVNfWF9DRkxBR1M9CisKK0FDX0FSR19FTkFCTEUoW3gxMS1hdXRvbGF1bmNoXSwKKyAgQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLXgxMS1hdXRvbGF1bmNoXSwgW2J1aWxkIHdpdGggWDExIGF1dG8tbGF1bmNoIHN1cHBvcnRdKSwKKyAgW10sIFtlbmFibGVfeDExX2F1dG9sYXVuY2g9YXV0b10pCisKK2lmIHRlc3QgIngkZGJ1c193aW4iID0geHllczsgdGhlbgorICAgIGlmIHRlc3QgIngkZW5hYmxlX3gxMV9hdXRvbGF1bmNoIiA9IHh5ZXM7IHRoZW4KKyAgICAgICAgQUNfTVNHX0VSUk9SKFtYMTEgYXV0by1sYXVuY2ggaXMgbm90IHN1cHBvcnRlZCBvbiBXaW5kb3dzXSkKKyAgICBmaQorCisgICAgZW5hYmxlX3gxMV9hdXRvbGF1bmNoPW5vCisgICAgaGF2ZV94MTE9bm8KK2Vsc2UKKyAgICBBQ19QQVRIX1hUUkEKKworICAgIGlmIHRlc3QgIngkbm9feCIgPSB4eWVzOyB0aGVuCisgICAgICAgIGhhdmVfeDExPW5vCisgICAgZWxzZQorICAgICAgICBoYXZlX3gxMT15ZXMKKyAgICAgICAgREJVU19YX0xJQlM9IiRYX0xJQlMgJFhfUFJFX0xJQlMgLWxYMTEgJFhfRVhUUkFfTElCUyIKKyAgICAgICAgREJVU19YX0NGTEFHUz0iJFhfQ0ZMQUdTIgorICAgIGZpCitmaQorCitpZiB0ZXN0ICJ4JGVuYWJsZV94MTFfYXV0b2xhdW5jaCwkaGF2ZV94MTEiID0geHllcyxubzsgdGhlbgorICAgIEFDX01TR19FUlJPUihbWDExIGF1dG8tbGF1bmNoIHJlcXVpcmVzIFggaGVhZGVycy9saWJyYXJpZXNdKQorZWxzZQorICAgICMgbW92ZSBmcm9tICJhdXRvIiB0byAieWVzIiBvciAibm8iIGlmIG5lY2Vzc2FyeQorICAgIGlmIHRlc3QgIngkZW5hYmxlX3gxMV9hdXRvbGF1bmNoIiAhPSB4bm87IHRoZW4KKyAgICAgICAgZW5hYmxlX3gxMV9hdXRvbGF1bmNoPSIkaGF2ZV94MTEiCisgICAgZmkKK2ZpCisKK2lmIHRlc3QgIngkaGF2ZV94MTEiID0geHllcyA7IHRoZW4KKyAgIEFDX0RFRklORShbREJVU19CVUlMRF9YMTFdLCBbMV0sIFtEZWZpbmUgdG8gYnVpbGQgWDExIGZ1bmN0aW9uYWxpdHldKQorZmkKKworaWYgdGVzdCAieCRlbmFibGVfeDExX2F1dG9sYXVuY2giID0geHllcyA7IHRoZW4KKyAgIEFDX0RFRklORShbREJVU19FTkFCTEVfWDExX0FVVE9MQVVOQ0hdLCBbMV0sIFtEZWZpbmUgdG8gZW5hYmxlIFgxMSBhdXRvLWxhdW5jaF0pCitmaQorQU1fQ09ORElUSU9OQUwoW0RCVVNfRU5BQkxFX1gxMV9BVVRPTEFVTkNIXSwKKyAgW3Rlc3QgIngkZW5hYmxlX3gxMV9hdXRvbGF1bmNoIiA9IHh5ZXNdKQorCitBQ19TVUJTVChbREJVU19YX0NGTEFHU10pCitBQ19TVUJTVChbREJVU19YX0xJQlNdKQorCisjIFdlJ3JlIHRyZWF0aW5nIC1mbm8tY29tbW9uIGxpa2UgYSB3YXJuaW5nOiBpdCBtYWtlcyB0aGUgbGlua2VyIG1vcmUKKyMgc3RyaWN0LCBiZWNhdXNlIG9uIHNvbWUgc3lzdGVtcyB0aGUgbGlua2VyIGlzICphbHdheXMqIHRoaXMgc3RyaWN0CitURVNUX0NGTEFHUz0iJFRFU1RfQ0ZMQUdTIC1mbm8tY29tbW9uIgorCitBU19JRihbdGVzdCAieCRlbmFibGVfYW5zaSIgPSAieHllcyJdLFsKKyAgICBURVNUX0NGTEFHUz0iJFRFU1RfQ0ZMQUdTIC1hbnNpIC1wZWRhbnRpYyIKKyAgICBBQ19ERUZJTkUoW19QT1NJWF9DX1NPVVJDRV0sWzE5OTMwOUxdLFtEZWZpbmUgdG8gZW5hYmxlIFBPU0lYIGZlYXR1cmVzXSkKKyAgICBBQ19ERUZJTkUoW19CU0RfU09VUkNFXSxbMV0sW0RlZmluZSB0byBlbmFibGUgQlNEIGZlYXR1cmVzXSkKKyAgXSkKKworZG5sIFdlIGFyZSBvbmx5IGNhbGxpbmcgdGhpcyBmb3IgaXRzIHNpZGUtZWZmZWN0IG9mIHNldHRpbmcgdXAKK2RubCAtLWVuYWJsZS1jb21waWxlLXdhcm5pbmdzOyB0aGUgV0FSTl9DRkxBR1MsIGV0Yy4gYXJlIGlnbm9yZWQsCitkbmwgdG8gd29yayBhcm91bmQgaHR0cHM6Ly9naXRodWIuY29tL3BldGkvYXV0b2NvbmYtYXJjaGl2ZS9wdWxsLzk2CitBWF9DT01QSUxFUl9GTEFHUyhbXSwgW10sIFskZGlzYWJsZV9kZXZlbG9wZXJdKQorCitkbmwgV29yayBhcm91bmQgaHR0cHM6Ly9naXRodWIuY29tL3BldGkvYXV0b2NvbmYtYXJjaGl2ZS9wdWxsLzk2IGJ5IHVzaW5nCitkbmwgYSBub24tZGVmYXVsdCB2YXJpYWJsZSBuYW1lIGhlcmUgKGluIHBhcnRpY3VsYXIgdGhlcmUgaXMgbm8gd2F5IHRvIHRlbGwKK2RubCBBWF9DT01QSUxFUl9GTEFHUyB0byBub3QgdXNlIFdBUk5fQ1hYRkxBR1MpCitBWF9DT01QSUxFUl9GTEFHU19DRkxBR1MoW0VYVFJBX0NGTEFHU10sCisgICAgICAgICAgICAgICAgICAgICAgICAgWyRkaXNhYmxlX2RldmVsb3Blcl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgWyRURVNUX0NGTEFHU10sCisgICAgICAgICAgICAgICAgICAgICAgICAgWy1XY2hhci1zdWJzY3JpcHRzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLVdmbG9hdC1lcXVhbCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIC1XcG9pbnRlci1zaWduIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJERJU0FCTEVfV0FSTklOR1NdKQorZG5sIGNjMXBsdXM6IHdhcm5pbmc6IGNvbW1hbmQgbGluZSBvcHRpb24g4oCYLVdwb2ludGVyLXNpZ27igJkgaXMgdmFsaWQgZm9yCitkbmwgQy9PYmpDIGJ1dCBub3QgZm9yIEMrKworQVhfQ09NUElMRVJfRkxBR1NfQ1hYRkxBR1MoW0VYVFJBX0NYWEZMQUdTXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFskZGlzYWJsZV9kZXZlbG9wZXJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbLVdjaGFyLXN1YnNjcmlwdHMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1XZmxvYXQtZXF1YWwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICRESVNBQkxFX1dBUk5JTkdTXSkKK0FYX0NPTVBJTEVSX0ZMQUdTX0xERkxBR1MoW0VYVFJBX0xERkxBR1NdLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbJGRpc2FibGVfZGV2ZWxvcGVyXSkKKworZG5sIFRPRE86IEluIHByaW5jaXBsZSB3ZSBzaG91bGQgcHV0IEVYVFJBX0NGTEFHUyBpbiBlYWNoIE1ha2VmaWxlLmFtIGxpa2UKK2RubCB0ZWxlcGF0aHktZ2xpYiBkb2VzLCBzaW5jZSBDRkxBR1MgaXMgbWVhbnQgdG8gYmUgcmVzZXJ2ZWQgZm9yIHRoZSB1c2VyLi4uCitkbmwgYnV0IHByZXBlbmRpbmcgdG8gQ0ZMQUdTIChzbyB0aGUgdXNlciBjYW4gb3ZlcnJpZGUgaXQgd2l0aCBsYXRlciBDRkxBR1MpCitkbmwgaXMgdGhlIG5leHQgYmVzdCB0aGluZy4KK0NGTEFHUz0iJEVYVFJBX0NGTEFHUyAkQ0ZMQUdTIgorQ1hYRkxBR1M9IiRFWFRSQV9DWFhGTEFHUyAkQ1hYRkxBR1MiCitMREZMQUdTPSIkRVhUUkFfTERGTEFHUyAkTERGTEFHUyIKKworY2FzZSAkaG9zdF9vcyBpbgorICAgIHNvbGFyaXMqKQorICAgICAgICAjIFNvbGFyaXMnIEMgbGlicmFyeSBhcHBhcmVudGx5IG5lZWRzIHRoZXNlIHJ1bmVzIHRvIGJlIHRocmVhZHNhZmUuLi4KKyAgICAgICAgQ0ZMQUdTPSIkQ0ZMQUdTIC1EX1BPU0lYX1BUSFJFQURfU0VNQU5USUNTIC1EX1JFRU5UUkFOVCIKKyAgICAgICAgIyAuLi4gdGhpcyBvcHQtaW4gdG8gZ2V0IHNvY2thZGRyX2luNiBhbmQgc29ja2FkZHJfc3RvcmFnZS4uLgorICAgICAgICBDRkxBR1M9IiRDRkxBR1MgLURfX0VYVEVOU0lPTlNfXyIKKyAgICAgICAgIyAuLi4gYW5kIHRoaXMgb3B0LWluIHRvIGdldCBmaWxlIGRlc2NyaXB0b3IgcGFzc2luZyBzdXBwb3J0CisgICAgICAgIENGTEFHUz0iJENGTEFHUyAtRF9YT1BFTl9TT1VSQ0U9NTAwIgorICAgICAgICA7OworZXNhYworCisjIyMgRGV0ZWN0IGlmIGxkIHN1cHBvcnRzIC0tdmVyc2lvbi1zY3JpcHQKKworZ2xfTERfVkVSU0lPTl9TQ1JJUFQKK0FNX0NPTkRJVElPTkFMKFtIQVZFX0xEX1ZFUlNJT05fU0NSSVBUXSwKKyAgICAgICAgICAgICAgIFt0ZXN0ICJ4JGhhdmVfbGRfdmVyc2lvbl9zY3JpcHQiID0geHllc10pCisjIyMgRG94eWdlbiBEb2N1bWVudGF0aW9uCisKK0FDX1BBVEhfUFJPRyhET1hZR0VOLCBkb3h5Z2VuLCBubykKKworQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRvIGJ1aWxkIERveHlnZW4gZG9jdW1lbnRhdGlvbl0pCisKK2lmIHRlc3QgeCRET1hZR0VOID0geG5vIDsgdGhlbgorICAgIGhhdmVfZG94eWdlbj1ubworZWxzZQorICAgIGhhdmVfZG94eWdlbj15ZXMKK2ZpCisKK2lmIHRlc3QgeCRlbmFibGVfZG94eWdlbl9kb2NzID0geGF1dG8gOyB0aGVuCisgICAgaWYgdGVzdCB4JGhhdmVfZG94eWdlbiA9IHhubyA7IHRoZW4KKyAgICAgICAgZW5hYmxlX2RveHlnZW5fZG9jcz1ubworICAgIGVsc2UKKyAgICAgICAgZW5hYmxlX2RveHlnZW5fZG9jcz15ZXMKKyAgICBmaQorZmkKKworaWYgdGVzdCB4JGVuYWJsZV9kb3h5Z2VuX2RvY3MgPSB4eWVzOyB0aGVuCisgICAgaWYgdGVzdCB4JGhhdmVfZG94eWdlbiA9IHhubzsgdGhlbgorCUFDX01TR19FUlJPUihbQnVpbGRpbmcgRG94eWdlbiBkb2NzIGV4cGxpY2l0bHkgcmVxdWlyZWQsIGJ1dCBEb3h5Z2VuIG5vdCBmb3VuZF0pCisgICAgZmkKK2ZpCisKK0FNX0NPTkRJVElPTkFMKERCVVNfRE9YWUdFTl9ET0NTX0VOQUJMRUQsIHRlc3QgeCRlbmFibGVfZG94eWdlbl9kb2NzID0geHllcykKK0FDX01TR19SRVNVTFQoJGVuYWJsZV9kb3h5Z2VuX2RvY3MpCisKK0FDX0NIRUNLX1BST0dTKFtYU0xUUFJPQ10sIFt4c2x0cHJvY10pCitBTV9DT05ESVRJT05BTChbREJVU19IQVZFX1hTTFRQUk9DXSwgW3Rlc3QgIngkWFNMVFBST0MiICE9ICJ4Il0pCisKKyMjIyBEdWNrdHlwZS9ZZWxwIGRvY3VtZW50YXRpb24KKworQUNfUEFUSF9QUk9HKFtEVUNLVFlQRV0sW2R1Y2t0eXBlXSxbbm9dKQorQUNfUEFUSF9QUk9HKFtZRUxQX0JVSUxEXSxbeWVscC1idWlsZF0sW25vXSkKKworQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRvIGJ1aWxkIER1Y2t0eXBlIGRvY3VtZW50YXRpb25dKQorCitBU19JRihbdGVzdCAiJERVQ0tUWVBFIiA9ICJubyJdLFtoYXZlX2R1Y2t0eXBlPW5vXSxbaGF2ZV9kdWNrdHlwZT15ZXNdKQorQVNfSUYoW3Rlc3QgIiRZRUxQX0JVSUxEIiA9ICJubyJdLFtoYXZlX3llbHBfYnVpbGQ9bm9dLFtoYXZlX3llbHBfYnVpbGQ9eWVzXSkKKworQVNfSUYoW3Rlc3QgIiRlbmFibGVfZHVja3R5cGVfZG9jcyIgPSAiYXV0byJdLFsKKyAgICBBU19JRihbdGVzdCAiJGhhdmVfZHVja3R5cGUiID0gIm5vIiB8fCB0ZXN0ICIkaGF2ZV95ZWxwX2J1aWxkIiA9ICJubyJdLFsKKyAgICAgICAgZW5hYmxlX2R1Y2t0eXBlX2RvY3M9bm8KKyAgICBdLFsKKyAgICAgICAgZW5hYmxlX2R1Y2t0eXBlX2RvY3M9eWVzCisgICAgXSkKK10pCisKK0FTX0lGKFt0ZXN0ICIkZW5hYmxlX2R1Y2t0eXBlX2RvY3MiID0gInllcyJdLFsKKyAgICBBU19JRihbdGVzdCAiJGhhdmVfZHVja3R5cGUiID0gIm5vIl0sWworICAgICAgICBBQ19NU0dfRVJST1IoW0J1aWxkaW5nIER1Y2t0eXBlIGRvY3MgZXhwbGljaXRseSByZXF1aXJlZCwgYnV0IGR1Y2t0eXBlIG5vdCBmb3VuZF0pCisgICAgXSkKKyAgICBBU19JRihbdGVzdCAiJGhhdmVfeWVscF9idWlsZCIgPSAibm8iXSxbCisgICAgICAgIEFDX01TR19FUlJPUihbQnVpbGRpbmcgRHVja3R5cGUgZG9jcyBleHBsaWNpdGx5IHJlcXVpcmVkLCBidXQgeWVscC1idWlsZCBub3QgZm91bmRdKQorICAgIF0pCitdKQorCitBTV9DT05ESVRJT05BTChbREJVU19EVUNLVFlQRV9ET0NTX0VOQUJMRURdLFt0ZXN0ICIkZW5hYmxlX2R1Y2t0eXBlX2RvY3MiID0gInllcyJdKQorQUNfTVNHX1JFU1VMVChbJGVuYWJsZV9kdWNrdHlwZV9kb2NzXSkKKworIyMjIFhNTCBEb2N1bWVudGF0aW9uCisKK0FDX1BBVEhfUFJPRyhYTUxUTywgeG1sdG8sIG5vKQorCitBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdG8gYnVpbGQgWE1MIGRvY3VtZW50YXRpb25dKQorCitpZiB0ZXN0IHgkWE1MVE8gPSB4bm8gOyB0aGVuCisgICAgaGF2ZV94bWx0bz1ubworZWxzZQorICAgIGhhdmVfeG1sdG89eWVzCitmaQorCitpZiB0ZXN0IHgkZW5hYmxlX3htbF9kb2NzID0geGF1dG8gOyB0aGVuCisgICAgaWYgdGVzdCB4JGhhdmVfeG1sdG8gPSB4bm8gOyB0aGVuCisgICAgICAgIGVuYWJsZV94bWxfZG9jcz1ubworICAgIGVsc2UKKyAgICAgICAgZW5hYmxlX3htbF9kb2NzPXllcworICAgIGZpCitmaQorCitpZiB0ZXN0IHgkZW5hYmxlX3htbF9kb2NzID0geHllczsgdGhlbgorICAgIGlmIHRlc3QgeCRoYXZlX3htbHRvID0geG5vOyB0aGVuCisJQUNfTVNHX0VSUk9SKFtCdWlsZGluZyBYTUwgZG9jcyBleHBsaWNpdGx5IHJlcXVpcmVkLCBidXQgeG1sdG8gbm90IGZvdW5kXSkKKyAgICBmaQorZmkKKworQU1fQ09ORElUSU9OQUwoREJVU19YTUxfRE9DU19FTkFCTEVELCB0ZXN0IHgkZW5hYmxlX3htbF9kb2NzID0geHllcykKK0FDX01TR19SRVNVTFQoJGVuYWJsZV94bWxfZG9jcykKKworQU1fQ09ORElUSU9OQUwoREJVU19DQU5fVVBMT0FEX0RPQ1MsCisgICAgW3Rlc3QgeCRlbmFibGVfZG94eWdlbl9kb2NzID0geHllcyAmJiB0ZXN0IHgkZW5hYmxlX3htbF9kb2NzID0geHllcyAmJgorICAgICB0ZXN0IHgkZW5hYmxlX2R1Y2t0eXBlX2RvY3MgPSB4eWVzXSkKKworIyBBdXRvY29uZiAyLjcwIHdpbGwgc3VwcG9ydCB0aGlzLCBhbmQgbWFueSBkaXN0cm9zIHBhdGNoIHRoaXMgb3B0aW9uIGluLAorIyBidXQgQXV0b2NvbmYgMi43MCBoYXNuJ3QgYWN0dWFsbHkgYmVlbiByZWxlYXNlZCB5ZXQuCitBU19JRihbdGVzdCAteiAiJHtydW5zdGF0ZWRpcn0iXSwgW3J1bnN0YXRlZGlyPScke2xvY2Fsc3RhdGVkaXJ9L3J1biddKQorQUNfU1VCU1QoW3J1bnN0YXRlZGlyXSkKKworIyMjIyBIYXZlIHRvIGdvICRsb2NhbHN0YXRlZGlyLT4kcHJlZml4L3Zhci0+L3Vzci9sb2NhbC92YXIKKworIyMjIyBmaW5kIHRoZSBhY3R1YWwgdmFsdWUgZm9yICRwcmVmaXggdGhhdCB3ZSdsbCBlbmQgdXAgd2l0aAorIyMgICAoSSBrbm93IHRoaXMgaXMgYnJva2VuIGFuZCBzaG91bGQgYmUgZG9uZSBpbiB0aGUgTWFrZWZpbGUsIGJ1dAorIyMgICAgdGhhdCdzIGEgbWFqb3IgcGFpbiBhbmQgYWxtb3N0IG5vYm9keSBhY3R1YWxseSBzZWVtcyB0byBjYXJlKQorQVNfQUNfRVhQQU5EKEVYUEFOREVEX1BSRUZJWCwgIiRwcmVmaXgiKQorQVNfQUNfRVhQQU5EKEVYUEFOREVEX0xPQ0FMU1RBVEVESVIsICIkbG9jYWxzdGF0ZWRpciIpCitBU19BQ19FWFBBTkQoRVhQQU5ERURfU1lTQ09ORkRJUiwgIiRzeXNjb25mZGlyIikKK0FTX0FDX0VYUEFORChFWFBBTkRFRF9CSU5ESVIsICIkYmluZGlyIikKK0FTX0FDX0VYUEFORChFWFBBTkRFRF9MSUJESVIsICIkbGliZGlyIikKK0FTX0FDX0VYUEFORChFWFBBTkRFRF9MSUJFWEVDRElSLCAiJGxpYmV4ZWNkaXIiKQorQVNfQUNfRVhQQU5EKEVYUEFOREVEX0RBVEFESVIsICIkZGF0YWRpciIpCitBU19BQ19FWFBBTkQoRVhQQU5ERURfUlVOU1RBVEVESVIsICIkcnVuc3RhdGVkaXIiKQorCisjIyMjIyBzeXN0ZW1kIHVuaXQgZmlsZXMKK0FDX0FSR19XSVRIKFtzeXN0ZW1kc3lzdGVtdW5pdGRpcl0sCitBU19IRUxQX1NUUklORyhbLS13aXRoLXN5c3RlbWRzeXN0ZW11bml0ZGlyPURJUl0sIFtEaXJlY3RvcnkgZm9yIHN5c3RlbWQgc2VydmljZSBmaWxlc10pLAorICAgIFtdLAorICAgIFsKKyAgICBQS0dfQ0hFQ0tfRVhJU1RTKFtzeXN0ZW1kXSwKKyAgICAgIFt3aXRoX3N5c3RlbWRzeXN0ZW11bml0ZGlyPSQoJFBLR19DT05GSUcgLS12YXJpYWJsZT1zeXN0ZW1kc3lzdGVtdW5pdGRpciBzeXN0ZW1kKV0sCisgICAgICBbd2l0aF9zeXN0ZW1kc3lzdGVtdW5pdGRpcj1ub10pCisgICAgXSkKK2lmIHRlc3QgIngkd2l0aF9zeXN0ZW1kc3lzdGVtdW5pdGRpciIgIT0geG5vOyB0aGVuCisgICBBQ19TVUJTVChbc3lzdGVtZHN5c3RlbXVuaXRkaXJdLCBbJHdpdGhfc3lzdGVtZHN5c3RlbXVuaXRkaXJdKQorZmkKK0FNX0NPTkRJVElPTkFMKEhBVkVfU1lTVEVNRCwgW3Rlc3QgIngkaGF2ZV9zeXN0ZW1kIiAhPSAieG5vIiAtYSAtbiAiJHdpdGhfc3lzdGVtZHN5c3RlbXVuaXRkaXIiIC1hICJ4JHdpdGhfc3lzdGVtZHN5c3RlbXVuaXRkaXIiICE9IHhubyBdKQorCitBQ19BUkdfV0lUSChbc3lzdGVtZHVzZXJ1bml0ZGlyXSwKK0FTX0hFTFBfU1RSSU5HKFstLXdpdGgtc3lzdGVtZHVzZXJ1bml0ZGlyPURJUl0sIFtEaXJlY3RvcnkgZm9yIHN5c3RlbWQgdXNlciBzZXJ2aWNlIGZpbGVzXSksCisgICAgW10sCisgICAgWworICAgIFBLR19DSEVDS19FWElTVFMoW3N5c3RlbWRdLAorICAgICAgW3dpdGhfc3lzdGVtZHVzZXJ1bml0ZGlyPSQoJFBLR19DT05GSUcgLS12YXJpYWJsZT1zeXN0ZW1kdXNlcnVuaXRkaXIgc3lzdGVtZCldLAorICAgICAgW3dpdGhfc3lzdGVtZHVzZXJ1bml0ZGlyPScke2xpYmRpcn0vc3lzdGVtZC91c2VyJ10pCisgICAgXSkKK0FDX1NVQlNUKFtzeXN0ZW1kdXNlcnVuaXRkaXJdLCBbJHdpdGhfc3lzdGVtZHVzZXJ1bml0ZGlyXSkKKworIyMjIyMgU2V0IHVwIGxvY2F0aW9uIGZvciBzeXN0ZW0gYnVzIHNvY2tldAoraWYgISB0ZXN0IC16ICIkd2l0aF9zeXN0ZW1fc29ja2V0IjsgdGhlbgorICAgREJVU19TWVNURU1fU09DS0VUPSR3aXRoX3N5c3RlbV9zb2NrZXQKK2Vsc2UKKyAgICMgV2UgZG9uJ3QgdXNlIHJ1bnN0YXRlZGlyIGZvciB0aGlzICh5ZXQ/KSwgYmVjYXVzZSAvdmFyL3J1biBoYXMgYmVlbiB0aGUKKyAgICMgaW50ZXJvcGVyYWJsZSBzeXN0ZW0gYnVzIHNvY2tldCBmb3IgMTArIHllYXJzLgorICAgIyBTZWUgaHR0cHM6Ly9idWdzLmZyZWVkZXNrdG9wLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTAxNjI4CisgICBEQlVTX1NZU1RFTV9TT0NLRVQ9JHtFWFBBTkRFRF9MT0NBTFNUQVRFRElSfS9ydW4vZGJ1cy9zeXN0ZW1fYnVzX3NvY2tldAorZmkKKworQUNfU1VCU1QoREJVU19TWVNURU1fU09DS0VUKQorQUNfREVGSU5FX1VOUVVPVEVEKERCVVNfU1lTVEVNX1NPQ0tFVCwiJERCVVNfU1lTVEVNX1NPQ0tFVCIsW1RoZSBuYW1lIG9mIHRoZSBzb2NrZXQgdGhlIHN5c3RlbSBidXMgbGlzdGVucyBvbiBieSBkZWZhdWx0XSkKKworIyMgU3lzdGVtIGJ1cyBvbmx5IGxpc3RlbnMgb24gbG9jYWwgZG9tYWluIHNvY2tldHMsIGFuZCBuZXZlcgorIyMgb24gYW4gYWJzdHJhY3Qgc29ja2V0IChzbyBvbmx5IHJvb3QgY2FuIGNyZWF0ZSB0aGUgc29ja2V0KS4KKyMjCisjIyBUaGlzIHdvbid0IHdvcmsgb24gV2luZG93cy4gSXQncyBub3QgbWVhbnQgdG8gLSB0aGUgc3lzdGVtIGJ1cyBpcworIyMgbWVhbmluZ2xlc3Mgb24gV2luZG93cyBhbnl3YXkuCisjIworIyMgVGhpcyBoYXMgdG8gYmUgc3VpdGFibGUgZm9yIGhhcmQtY29kaW5nIGluIGNsaWVudCBsaWJyYXJpZXMgYXMgd2VsbCBhcworIyMgaW4gdGhlIGRidXMtZGFlbW9uJ3MgY29uZmlndXJhdGlvbiwgc28gaXQgaGFzIHRvIGJlIHZhbGlkIHRvIGxpc3RlbiBvbgorIyMgYW5kIGFsc28gdG8gY29ubmVjdCB0by4gSWYgdGhpcyBldmVyIGNoYW5nZXMsIGl0J2xsIG5lZWQgdG8gYmUgc3BsaXQgaW50bworIyMgdHdvIHZhcmlhYmxlcywgb25lIGZvciB0aGUgbGlzdGVuaW5nIGFkZHJlc3MgYW5kIG9uZSBmb3IgdGhlIGNvbm5lY3RpbmcKKyMjIGFkZHJlc3MuCitEQlVTX1NZU1RFTV9CVVNfREVGQVVMVF9BRERSRVNTPSJ1bml4OnBhdGg9JERCVVNfU1lTVEVNX1NPQ0tFVCIKK0FDX1NVQlNUKERCVVNfU1lTVEVNX0JVU19ERUZBVUxUX0FERFJFU1MpCitBQ19ERUZJTkVfVU5RVU9URUQoREJVU19TWVNURU1fQlVTX0RFRkFVTFRfQUREUkVTUywgIiREQlVTX1NZU1RFTV9CVVNfREVGQVVMVF9BRERSRVNTIixbVGhlIGRlZmF1bHQgRC1CdXMgYWRkcmVzcyBvZiB0aGUgc3lzdGVtIGJ1c10pCisKKyMjIyMgU2V0IHVwIHRoZSBwaWQgZmlsZQoraWYgISB0ZXN0IC16ICIkd2l0aF9zeXN0ZW1fcGlkX2ZpbGUiOyB0aGVuCisgICBEQlVTX1NZU1RFTV9QSURfRklMRT0kd2l0aF9zeXN0ZW1fcGlkX2ZpbGUKK2Vsc2UKKyAgIERCVVNfU1lTVEVNX1BJRF9GSUxFPSIke0VYUEFOREVEX1JVTlNUQVRFRElSfS9kYnVzL3BpZCIKK2ZpCisKK0FDX1NVQlNUKERCVVNfU1lTVEVNX1BJRF9GSUxFKQorCisjIyMjIERpcmVjdG9yeSB0byBjaGVjayBmb3IgY29uc29sZSBvd25lcnNoaXAKK0FTX0lGKFt0ZXN0IC1uICIkd2l0aF9jb25zb2xlX2F1dGhfZGlyIiAmJiB0ZXN0ICJ4JHdpdGhfY29uc29sZV9hdXRoX2RpciIgIT0geG5vXSwKKyAgICBbQUNfREVGSU5FX1VOUVVPVEVEKFtEQlVTX0NPTlNPTEVfQVVUSF9ESVJdLCBbIiR3aXRoX2NvbnNvbGVfYXV0aF9kaXIiXSwKKyAgICAgICAgW0RpcmVjdG9yeSB0byBjaGVjayBmb3IgcGFtX2NvbnNvbGUvcGFtX2ZvcmVncm91bmQgZmxhZyBmaWxlcywgb3IgdW5kZWZpbmVkXSldLAorICAgIFt3aXRoX2NvbnNvbGVfYXV0aF9kaXI9XSkKKworIyMjIyBGaWxlIHRvIGNoZWNrIGZvciBjb25zb2xlIG93bmVyc2hpcAoraWYgdGVzdCB4JGhhdmVfY29uc29sZV9vd25lcl9maWxlID0geHllczsgdGhlbgorICAgaWYgISB0ZXN0IC16ICIkd2l0aF9jb25zb2xlX293bmVyX2ZpbGUiOyB0aGVuCisgICAgICBEQlVTX0NPTlNPTEVfT1dORVJfRklMRT0kd2l0aF9jb25zb2xlX293bmVyX2ZpbGUKKyAgIGVsc2UKKyAgICAgIERCVVNfQ09OU09MRV9PV05FUl9GSUxFPS9kZXYvY29uc29sZQorICAgZmkKK2Vsc2UKKyAgREJVU19DT05TT0xFX09XTkVSX0ZJTEU9CitmaQorCitBQ19TVUJTVChEQlVTX0NPTlNPTEVfT1dORVJfRklMRSkKK0FDX0RFRklORV9VTlFVT1RFRChEQlVTX0NPTlNPTEVfT1dORVJfRklMRSwgIiREQlVTX0NPTlNPTEVfT1dORVJfRklMRSIsIFtGaWxlIHRvIGNoZWNrIGZvciBjb25zb2xlIG93bmVyaGlwXSkKKworIyMjIyBVc2VyIHRvIHN0YXJ0IHRoZSBzeXN0ZW0gYnVzIGFzCitpZiB0ZXN0IC16ICIkd2l0aF9kYnVzX3VzZXIiIDsgdGhlbgorICAgIERCVVNfVVNFUj1tZXNzYWdlYnVzCitlbHNlCisgICAgREJVU19VU0VSPSR3aXRoX2RidXNfdXNlcgorZmkKK0FDX1NVQlNUKERCVVNfVVNFUikKK0FDX0RFRklORV9VTlFVT1RFRChEQlVTX1VTRVIsIiREQlVTX1VTRVIiLCBbVXNlciBmb3IgcnVubmluZyB0aGUgc3lzdGVtIEJVUyBkYWVtb25dKQorCisjIyMjIFVzZXIgZm9yIHJlZ3Jlc3Npb24gdGVzdHMKK0FTX0lGKFt0ZXN0IC16ICIkd2l0aF90ZXN0X3VzZXIiXSwgW3dpdGhfdGVzdF91c2VyPW5vYm9keV0pCitEQlVTX1RFU1RfVVNFUj0iJHdpdGhfdGVzdF91c2VyIgorQUNfU1VCU1QoW0RCVVNfVEVTVF9VU0VSXSkKK0FDX0RFRklORV9VTlFVT1RFRChbREJVU19URVNUX1VTRVJdLCBbIiREQlVTX1RFU1RfVVNFUiJdLAorICBbVW5wcml2aWxlZ2VkIHVzZXIgdXNlZCBpbiBzb21lIHJlZ3Jlc3Npb24gdGVzdHNdKQorCisjIyMjIFByZWZpeCB0byBpbnN0YWxsIGludG8KK0RCVVNfUFJFRklYPSRFWFBBTkRFRF9QUkVGSVgKK0FDX1NVQlNUKERCVVNfUFJFRklYKQorQUNfREVGSU5FX1VOUVVPVEVEKERCVVNfUFJFRklYLCIkREJVU19QUkVGSVgiLCBbUHJlZml4IGZvciBpbnN0YWxsaW5nIERCVVNdKQorCisjIyMjIERpcmVjb3RyeSB0byBpbnN0YWxsIGRhdGEgZmlsZXMgaW50bworREJVU19EQVRBRElSPSRFWFBBTkRFRF9EQVRBRElSCitBQ19TVUJTVChEQlVTX0RBVEFESVIpCitBQ19ERUZJTkVfVU5RVU9URUQoREJVU19EQVRBRElSLCIkREJVU19EQVRBRElSIiwgW0RpcmVjdG9yeSBmb3IgaW5zdGFsbGluZyBEQlVTIGRhdGEgZmlsZXNdKQorCisjIyMjIERpcmVjdG9yeSB0byBpbnN0YWxsIGRidXMtZGFlbW9uCitpZiB0ZXN0IC16ICIkd2l0aF9kYnVzX2RhZW1vbmRpciIgOyB0aGVuCisgICAgREJVU19EQUVNT05ESVI9JEVYUEFOREVEX0JJTkRJUgorICAgIGRidXNfZGFlbW9uZGlyPScke2JpbmRpcn0nCitlbHNlCisgICAgREJVU19EQUVNT05ESVI9JHdpdGhfZGJ1c19kYWVtb25kaXIKKyAgICBkYnVzX2RhZW1vbmRpcj0kd2l0aF9kYnVzX2RhZW1vbmRpcgorZmkKK0FDX1NVQlNUKERCVVNfREFFTU9ORElSKQorQUNfU1VCU1QoZGJ1c19kYWVtb25kaXIpCitBQ19ERUZJTkVfVU5RVU9URUQoREJVU19EQUVNT05ESVIsIiREQlVTX0RBRU1PTkRJUiIsIFtEaXJlY3RvcnkgZm9yIGluc3RhbGxpbmcgdGhlIERCVVMgZGFlbW9uXSkKKworIyMjIyBEaXJlY3RvcnkgdG8gaW5zdGFsbCB0aGUgb3RoZXIgYmluYXJpZXMKK0RCVVNfQklORElSPSIkRVhQQU5ERURfQklORElSIgorQUNfU1VCU1QoREJVU19CSU5ESVIpCitBQ19ERUZJTkVfVU5RVU9URUQoREJVU19CSU5ESVIsIiREQlVTX0JJTkRJUiIsIFtEaXJlY3RvcnkgZm9yIGluc3RhbGxpbmcgdGhlIGJpbmFyaWVzXSkKKworIyMjIyBEaXJlY3RvcnkgdG8gaW5zdGFsbCB0aGUgbGliZXhlYyBiaW5hcmllcworREJVU19MSUJFWEVDRElSPSIkRVhQQU5ERURfTElCRVhFQ0RJUiIKK0FDX1NVQlNUKERCVVNfTElCRVhFQ0RJUikKK0FDX0RFRklORV9VTlFVT1RFRChEQlVTX0xJQkVYRUNESVIsIiREQlVTX0xJQkVYRUNESVIiLCBbRGlyZWN0b3J5IGZvciBpbnN0YWxsaW5nIHRoZSBsaWJleGVjIGJpbmFyaWVzXSkKKworQUNfQVJHX0VOQUJMRShbcmVsb2NhdGlvbl0sCisgIFtBU19IRUxQX1NUUklORyhbLS1lbmFibGUtcmVsb2NhdGlvbls9eWVzL25vL2F1dG9dXSwKKyAgICBbTWFrZSBwa2ctY29uZmlnIG1ldGFkYXRhIHJlbG9jYXRhYmxlIFtkZWZhdWx0PWF1dG9dXSldLAorICBbXSwgW2VuYWJsZV9yZWxvY2F0aW9uPWF1dG9dKQorCitjYW5fcmVsb2NhdGU9eWVzCisKK0FTX0NBU0UoWyIke2V4ZWNfcHJlZml4fSJdLAorICBbJ05PTkUnfCcke3ByZWZpeH0nXSwKKyAgICBbOl0sCisgIFsqXSwKKyAgICBbY2FuX3JlbG9jYXRlPW5vXSkKKworQVNfQ0FTRShbIiR7bGliZGlyfSJdLAorICBbJyR7cHJlZml4fS9saWInfCcke3ByZWZpeH0vbGliNjQnfCcke2V4ZWNfcHJlZml4fS9saWInfCcke2V4ZWNfcHJlZml4fS9saWI2NCddLAorICAgIFs6XSwKKyAgWypdLAorICAgIFtjYW5fcmVsb2NhdGU9bm9dKQorCisjIElmIHRoZSB1c2VyIHNhaWQgLS1lbmFibGUtcmVsb2NhdGlvbiBidXQgd2UgY2FuJ3QgZG8gaXQsIGVycm9yIG91dAorQVNfSUYoW3Rlc3QgIngkY2FuX3JlbG9jYXRlIiA9IHhubyAmJiB0ZXN0ICJ4JGVuYWJsZV9yZWxvY2F0aW9uIiA9IHh5ZXNdLAorICBbQUNfTVNHX0VSUk9SKFtSZWxvY2F0YWJsZSBwa2ctY29uZmlnIG1ldGFkYXRhIHJlcXVpcmVzIC0tZXhlYy1wcmVmaXg9J1wke3ByZWZpeH0nIGFuZCB0aGUgZGVmYXVsdCBsaWJkaXJdKV0pCisKKyMgQnkgZGVmYXVsdCwgb24gV2luZG93cyB3ZSBhcmUgcmVsb2NhdGFibGUgaWYgcG9zc2libGUKK0FTX0lGKFt0ZXN0ICJ4JGVuYWJsZV9yZWxvY2F0aW9uIiA9IHhhdXRvICYmIHRlc3QgIngkZGJ1c193aW4iID0geHllc10sCisgIFtlbmFibGVfcmVsb2NhdGlvbj0iJGNhbl9yZWxvY2F0ZSJdKQorCisjIEJ5IGRlZmF1bHQsIG9uIG5vbi1XaW5kb3dzIHdlIGFyZSBub3QgcmVsb2NhdGFibGUgYmVjYXVzZSBpdCBjYW4gaW50ZXJmZXJlCisjIHdpdGggcGtnLWNvbmZpZydzIGFiaWxpdHkgdG8gZmlsdGVyIG91dCBzeXN0ZW0gaW5jbHVkZSBkaXJlY3RvcmllcywKKyMgcmVzdWx0aW5nIGluIGxpbmtpbmcgYW4gb3V0ZGF0ZWQgc3lzdGVtLXdpZGUgbGlicmFyeSBpbiBwcmVmZXJlbmNlIHRvIGEKKyMgbmV3ZXIgdmVyc2lvbiBpbnN0YWxsZWQgZWxzZXdoZXJlCitBU19JRihbdGVzdCAieCRlbmFibGVfcmVsb2NhdGlvbiIgPSB4YXV0b10sCisgIFtlbmFibGVfcmVsb2NhdGlvbj0ibm8iXSkKKworCitBU19JRihbdGVzdCAieCRlbmFibGVfcmVsb2NhdGlvbiIgPSB4eWVzXSwKKyAgW0FDX1NVQlNUKFtwa2djb25maWdfcHJlZml4XSwgWycke3BjZmlsZWRpcn0vLi4vLi4vJ10pXSwKKyAgW0FDX1NVQlNUKFtwa2djb25maWdfcHJlZml4XSwgWycke29yaWdpbmFsX3ByZWZpeH0nXSldKQorCisjIyMjIERpcmVjdG9yeSB0byBzb3VyY2Ugc3lzY29uZmRpciBjb25maWd1cmF0aW9uIGZyb20KKworIyBPbiBXaW5kb3dzIHRoaXMgaXMgcmVsYXRpdmUgdG8gd2hlcmUgd2UgcHV0IHRoZSBidXMgc2V0dXAsIGluCisjICR7ZGF0YWRpcn0vZGJ1cy0xLiBGb3Igc2ltcGxpY2l0eSwgd2Ugb25seSBkbyB0aGlzIGlmCisjICR7c3lzY29uZmRpcn0gPSAke3ByZWZpeH0vZXRjIGFuZCAke2RhdGFkaXJ9ID0gJHtwcmVmaXh9L3NoYXJlLgorIworIyBPbiBVbml4LCBvciBvbiBXaW5kb3dzIHdpdGggd2VpcmQgaW5zdGFsbCBsYXlvdXRzLCBpdCdzIHRoZSBhYnNvbHV0ZSBwYXRoLgorQVNfSUYoW3Rlc3QgIiR7ZGJ1c193aW59IiA9IHllcyAmJiBcCisgICAgICAgdGVzdCAiJEVYUEFOREVEX1NZU0NPTkZESVIiID0gIiRFWFBBTkRFRF9QUkVGSVgvZXRjIiAmJiBcCisgICAgICAgdGVzdCAiJEVYUEFOREVEX0RBVEFESVIiID0gIiRFWFBBTkRFRF9QUkVGSVgvc2hhcmUiXSwKKyAgICAgIFtTWVNDT05GRElSX0ZST01fUEtHREFUQURJUj0iLi4vLi4vZXRjIgorICAgICAgIERBVEFESVJfRlJPTV9QS0dTWVNDT05GRElSPSIuLi8uLi9zaGFyZSJdLAorICAgICAgW1NZU0NPTkZESVJfRlJPTV9QS0dEQVRBRElSPSIkRVhQQU5ERURfU1lTQ09ORkRJUiIKKyAgICAgICBEQVRBRElSX0ZST01fUEtHU1lTQ09ORkRJUj0iJEVYUEFOREVEX0RBVEFESVIiXSkKK0FDX1NVQlNUKFtTWVNDT05GRElSX0ZST01fUEtHREFUQURJUl0pCitBQ19TVUJTVChbREFUQURJUl9GUk9NX1BLR1NZU0NPTkZESVJdKQorCisjIyMjIFRlbGwgdGVzdHMgd2hlcmUgdG8gZmluZCBjZXJ0YWluIHN0dWZmIGluIGJ1aWxkZGlyCisKK0RCVVNfUFdEPWBwd2RgCisjIFVzZWZ1bCBpbiBhIGNyb3NzLWNvbXBpbGF0aW9uIGVudmlyb25tZW50LCB3aGVyZSB0aGUgdGVzdHMgYXJlIHJ1biBvbiB0aGUgaG9zdCBzeXN0ZW0uCitBQ19BUkdfV0lUSChkYnVzLXRlc3QtZGlyLCBBU19IRUxQX1NUUklORyhbLS13aXRoLWRidXMtdGVzdC1kaXI9W2Rpcm5hbWVdXSxbcGF0aCB3aGVyZSB0aGUgdGVzdHMgdG9vbHMgYXJlIGF2YWlsYWJsZV0pLAorCQkJICAgREJVU19QV0Q9JHdpdGh2YWwpCisKK0RCVVNfVEVTVF9FWEVDPSIkREJVU19QV0QvdGVzdCIKK0RCVVNfVEVTVF9EQVRBPSIkREJVU19QV0QvdGVzdC9kYXRhIgorCitBQ19TVUJTVChbREJVU19URVNUX0RBVEFdKQorQUNfU1VCU1QoW0RCVVNfVEVTVF9FWEVDXSkKKworQUNfREVGSU5FX1VOUVVPVEVEKFtEQlVTX0VYRUVYVF0sIFsiJEVYRUVYVCJdLAorICAgICAgICAgICAgICAgICAgIFtFeHRlbnNpb24gZm9yIGV4ZWN1dGFibGVzLCB0eXBpY2FsbHkgZW1wdHkgb3IgLmV4ZV0pCisKKyMjIEV4cG9ydCB0aGUgbm9uLXNldHVpZCBleHRlcm5hbCBoZWxwZXIKK1RFU1RfTEFVTkNIX0hFTFBFUl9CSU5BUlk9IiREQlVTX1BXRC9idXMvZGJ1cy1kYWVtb24tbGF1bmNoLWhlbHBlci10ZXN0JEVYRUVYVCIKK0FDX1NVQlNUKFRFU1RfTEFVTkNIX0hFTFBFUl9CSU5BUlkpCitBQ19ERUZJTkVfVU5RVU9URUQoREJVU19URVNUX0xBVU5DSF9IRUxQRVJfQklOQVJZLCAiJFRFU1RfTEFVTkNIX0hFTFBFUl9CSU5BUlkiLAorICAgICAgICAgICAgICAgICAgIFtGdWxsIHBhdGggdG8gdGhlIGxhdW5jaCBoZWxwZXIgdGVzdCBwcm9ncmFtIGluIHRoZSBidWlsZGRpcl0pCisKKyMjIyMgRmluZCBzb2NrZXQgZGlyZWN0b3JpZXMKK2lmICEgdGVzdCAteiAiJFRNUERJUiIgOyB0aGVuCisgICBERUZBVUxUX1NPQ0tFVF9ESVI9JFRNUERJUgorZWxpZiAhIHRlc3QgLXogIiRURU1QIiA7IHRoZW4KKyAgIERFRkFVTFRfU09DS0VUX0RJUj0kVEVNUAorZWxpZiAhIHRlc3QgLXogIiRUTVAiIDsgdGhlbgorICAgREVGQVVMVF9TT0NLRVRfRElSPSRUTVAKK2Vsc2UKKyAgIERFRkFVTFRfU09DS0VUX0RJUj0vdG1wCitmaQorCitERUZBVUxUX1NPQ0tFVF9ESVI9YGVjaG8gJERFRkFVTFRfU09DS0VUX0RJUiB8IHNlZCAncy8rLyUyQi9nJ2AKKworaWYgISB0ZXN0IC16ICIkd2l0aF90ZXN0X3NvY2tldF9kaXIiIDsgdGhlbgorICAgVEVTVF9TT0NLRVRfRElSPSIkd2l0aF90ZXN0X3NvY2tldF9kaXIiCitlbHNlCisgICBURVNUX1NPQ0tFVF9ESVI9JERFRkFVTFRfU09DS0VUX0RJUgorZmkKK0FDX1NVQlNUKFRFU1RfU09DS0VUX0RJUikKK0FDX0RFRklORV9VTlFVT1RFRChEQlVTX1RFU1RfU09DS0VUX0RJUiwgIiRURVNUX1NPQ0tFVF9ESVIiLCBbV2hlcmUgdG8gcHV0IHRlc3Qgc29ja2V0c10pCisKK2lmIHRlc3QgIngkZGJ1c191bml4IiA9IHh5ZXM7IHRoZW4KKyAgVEVTVF9MSVNURU49InVuaXg6dG1wZGlyPSRURVNUX1NPQ0tFVF9ESVIiCitlbHNlCisgIFRFU1RfTElTVEVOPSJ0Y3A6aG9zdD1sb2NhbGhvc3QiCitmaQorQUNfU1VCU1QoW1RFU1RfTElTVEVOXSkKK0FDX0RFRklORV9VTlFVT1RFRChbVEVTVF9MSVNURU5dLCBbIiRURVNUX0xJU1RFTiJdLAorICBbTGlzdGVuaW5nIGFkZHJlc3MgZm9yIHJlZ3Jlc3Npb24gdGVzdHNdKQorCitpZiAhIHRlc3QgLXogIiR3aXRoX3Nlc3Npb25fc29ja2V0X2RpciIgOyB0aGVuCisgICBEQlVTX1NFU1NJT05fU09DS0VUX0RJUj0iJHdpdGhfc2Vzc2lvbl9zb2NrZXRfZGlyIgorZWxzZQorICAgREJVU19TRVNTSU9OX1NPQ0tFVF9ESVI9JERFRkFVTFRfU09DS0VUX0RJUgorZmkKK0FDX0RFRklORV9VTlFVT1RFRChEQlVTX1NFU1NJT05fU09DS0VUX0RJUiwgIiREQlVTX1NFU1NJT05fU09DS0VUX0RJUiIsIFtXaGVyZSBwZXItc2Vzc2lvbiBidXMgcHV0cyBpdHMgc29ja2V0c10pCitBQ19TVUJTVChEQlVTX1NFU1NJT05fU09DS0VUX0RJUikKKworIyBUaGlzIG11c3QgYmUgYSBsaXN0ZW5pbmcgYWRkcmVzcy4gSXQgZG9lc24ndCBuZWNlc3NhcmlseSBuZWVkIHRvIGJlIGFuCisjIGFkZHJlc3MgeW91IGNhbiBjb25uZWN0IHRvIC0gaXQgY2FuIGJlIHNvbWV0aGluZyB2YWd1ZSBsaWtlCisjICJub25jZS10Y3A6Ii4KKyMKKyMgVGhlIGRlZmF1bHQgdmFyaWVzIGJ5IHBsYXRmb3JtLgorQUNfQVJHX1dJVEgoW2RidXNfc2Vzc2lvbl9idXNfbGlzdGVuX2FkZHJlc3NdLAorICAgICAgICAgICAgQVNfSEVMUF9TVFJJTkcoWy0td2l0aC1kYnVzLXNlc3Npb24tYnVzLWxpc3Rlbi1hZGRyZXNzPVtBRERSRVNTXV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGVmYXVsdCBhZGRyZXNzIGZvciBhIHNlc3Npb24gYnVzIHRvIGxpc3RlbiBvbiAoc2VlIGNvbmZpZ3VyZS5hYyldKSwKKyAgICAgICAgICAgIFt3aXRoX2RidXNfc2Vzc2lvbl9idXNfbGlzdGVuX2FkZHJlc3M9JHdpdGh2YWxdLAorICAgICAgICAgICAgW3dpdGhfZGJ1c19zZXNzaW9uX2J1c19saXN0ZW5fYWRkcmVzcz1dKQorCitpZiB0ZXN0ICJ4JHdpdGhfZGJ1c19zZXNzaW9uX2J1c19saXN0ZW5fYWRkcmVzcyIgIT0gIngiOyB0aGVuCisgICAgICAgICMgdGhlIHVzZXIgc3BlY2lmaWVkIHNvbWV0aGluZywgdHJ1c3QgdGhlbQorICAgICAgICBEQlVTX1NFU1NJT05fQlVTX0xJU1RFTl9BRERSRVNTPSIkd2l0aF9kYnVzX3Nlc3Npb25fYnVzX2xpc3Rlbl9hZGRyZXNzIgorZWxpZiB0ZXN0IHgkZGJ1c193aW4gPSB4eWVzOyB0aGVuCisgICAgICAgICMgT24gV2luZG93cywgeW91IGNhbiAoYW5kIHNob3VsZCkgbGlzdGVuIG9uIGF1dG9sYXVuY2ggYWRkcmVzc2VzLAorICAgICAgICAjIGJlY2F1c2UgYXV0b2xhdW5jaGluZyBpcyBkaWZmZXJlbnQuCisgICAgICAgICMgU2VlIGh0dHBzOi8vYnVncy5mcmVlZGVza3RvcC5vcmcvc2hvd19idWcuY2dpP2lkPTM4MjAxCisgICAgICAgIERCVVNfU0VTU0lPTl9CVVNfTElTVEVOX0FERFJFU1M9ImF1dG9sYXVuY2g6IgorZWxpZiB0ZXN0IHgkaGF2ZV9sYXVuY2hkID0geHllczsgdGhlbgorICAgICAgICAjIE1hYyBPUyBYIGRlZmF1bHQgaXMgdG8gdXNlIGxhdW5jaGQKKyAgICAgICAgREJVU19TRVNTSU9OX0JVU19MSVNURU5fQUREUkVTUz0ibGF1bmNoZDplbnY9REJVU19MQVVOQ0hEX1NFU1NJT05fQlVTX1NPQ0tFVCIKK2Vsc2UKKyAgICAgICAgIyBUaGUgZGVmYXVsdCBvbiBhbGwgb3RoZXIgVW5peCBwbGF0Zm9ybXMgKG5vdGFibHkgTGludXgpCisgICAgICAgICMgaXMgdG8gY3JlYXRlIGEgcmFuZG9tbHkgbmFtZWQgc29ja2V0IGluIC90bXAgb3Igc2ltaWxhcgorICAgICAgICBEQlVTX1NFU1NJT05fQlVTX0xJU1RFTl9BRERSRVNTPSJ1bml4OnRtcGRpcj0kREJVU19TRVNTSU9OX1NPQ0tFVF9ESVIiCitmaQorQUNfU1VCU1QoW0RCVVNfU0VTU0lPTl9CVVNfTElTVEVOX0FERFJFU1NdKQorCisjIFRoaXMgbXVzdCBiZSBhbiBhZGRyZXNzIHlvdSBjYW4gY29ubmVjdCB0by4gSXQgZG9lc24ndCBuZWNlc3NhcmlseQorIyBuZWVkIHRvIGJlIGFuIGFkZHJlc3MgeW91IGNhbiBsaXN0ZW4gb24gLSBpdCBjYW4gYmUgImF1dG9sYXVuY2g6IiwKKyMgZXZlbiBvbiBVbml4LgorIworIyBUaGUgZGVmYXVsdCB2YXJpZXMgYnkgcGxhdGZvcm0uCitBQ19BUkdfV0lUSChbZGJ1c19zZXNzaW9uX2J1c19jb25uZWN0X2FkZHJlc3NdLAorICAgICAgICAgICAgQVNfSEVMUF9TVFJJTkcoWy0td2l0aC1kYnVzLXNlc3Npb24tYnVzLWNvbm5lY3QtYWRkcmVzcz1bQUREUkVTU11dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZhbGxiYWNrIGFkZHJlc3MgZm9yIGEgc2Vzc2lvbiBidXMgY2xpZW50IHRvIGNvbm5lY3QgdG8gKHNlZSBjb25maWd1cmUuYWMpXSksCisgICAgICAgICAgICBbd2l0aF9kYnVzX3Nlc3Npb25fYnVzX2Nvbm5lY3RfYWRkcmVzcz0kd2l0aHZhbF0sCisgICAgICAgICAgICBbd2l0aF9kYnVzX3Nlc3Npb25fYnVzX2Nvbm5lY3RfYWRkcmVzcz1dKQorCitpZiB0ZXN0ICJ4JHdpdGhfZGJ1c19zZXNzaW9uX2J1c19jb25uZWN0X2FkZHJlc3MiICE9ICJ4IjsgdGhlbgorICAgICAgICAjIHRoZSB1c2VyIHNwZWNpZmllZCBzb21ldGhpbmcsIHRydXN0IHRoZW0KKyAgICAgICAgREJVU19TRVNTSU9OX0JVU19DT05ORUNUX0FERFJFU1M9IiR3aXRoX2RidXNfc2Vzc2lvbl9idXNfY29ubmVjdF9hZGRyZXNzIgorZWxpZiB0ZXN0IHgkZGJ1c193aW4gPSB4eWVzOyB0aGVuCisgICAgICAgICMgV2luZG93cyBhdXRvbGF1bmNoaW5nIGlzIGEgYml0IGRpZmZlcmVudDsgbGVhdmluZyBpdCBpbiBpdHMgb3duCisgICAgICAgICMgYnJhbmNoIG9mIHRoZSBjb25kaXRpb25hbCBiZWNhdXNlIHRoZSBkZWZhdWx0IG1pZ2h0IGNvbmNlaXZhYmx5CisgICAgICAgICMgY2hhbmdlIChzZWUgIzM4MjAxKQorICAgICAgICBEQlVTX1NFU1NJT05fQlVTX0NPTk5FQ1RfQUREUkVTUz0iYXV0b2xhdW5jaDoiCitlbHNlCisgICAgICAgICMgVGhlIGRlZmF1bHQgb24gYWxsIG90aGVyIFVuaXggcGxhdGZvcm1zIChub3RhYmx5IExpbnV4KQorICAgICAgICAjIGlzIHRvIHVzZSBhdXRvLWxhdW5jaGluZyAtIHRoaXMgd29ya3MgYSBiaXQgZGlmZmVyZW50bHkgb24gTWFjIE9TIFgKKyAgICAgICAgIyBidXQgY29tZXMgb3V0IGJhc2ljYWxseSB0aGUgc2FtZSBpbiB0aGUgZW5kCisgICAgICAgIERCVVNfU0VTU0lPTl9CVVNfQ09OTkVDVF9BRERSRVNTPSJhdXRvbGF1bmNoOiIKK2ZpCitBQ19TVUJTVChbREJVU19TRVNTSU9OX0JVU19DT05ORUNUX0FERFJFU1NdKQorQUNfREVGSU5FX1VOUVVPVEVEKFtEQlVTX1NFU1NJT05fQlVTX0NPTk5FQ1RfQUREUkVTU10sCisgIFsiJERCVVNfU0VTU0lPTl9CVVNfQ09OTkVDVF9BRERSRVNTIl0sCisgIFtGYWxsYmFjayBhZGRyZXNzIGZvciBzZXNzaW9uIGJ1cyBjbGllbnRzXSkKKworIyBkYXJ3aW4gbmVlZHMgdGhpcyB0byBpbml0aWFsaXplIHRoZSBlbnZpcm9ubWVudAorQUNfQ0hFQ0tfSEVBREVSUyhjcnRfZXh0ZXJucy5oKQorQUNfQ0hFQ0tfRlVOQyhfTlNHZXRFbnZpcm9uLCBbQUNfREVGSU5FKEhBVkVfTlNHRVRFTlZJUk9OLCAxLCBbRGVmaW5lIGlmIHlvdXIgc3lzdGVtIG5lZWRzIF9OU0dldEVudmlyb24gdG8gc2V0IHVwIHRoZSBlbnZpcm9ubWVudF0pXSkKK0FIX1ZFUkJBVElNKF9EQVJXSU5fRU5WSVJPTiwKK1sKKyNpZiBkZWZpbmVkKEhBVkVfTlNHRVRFTlZJUk9OKSAmJiBkZWZpbmVkKEhBVkVfQ1JUX0VYVEVSTlNfSCkKKyMgaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyMgaW5jbHVkZSA8Y3J0X2V4dGVybnMuaD4KKyMgZGVmaW5lIGVudmlyb24gKCpfTlNHZXRFbnZpcm9uKCkpCisjZW5kaWYKK10pCisKK0FDX0FSR19FTkFCTEUoW3N0YXRzXSwKKyAgW0FTX0hFTFBfU1RSSU5HKFstLWRpc2FibGUtc3RhdHNdLAorICAgIFtkaXNhYmxlIGJ1cyBkYWVtb24gdXNhZ2Ugc3RhdGlzdGljc10pXSwKKyAgW10sIFtlbmFibGVfc3RhdHM9eWVzXSkKK2lmIHRlc3QgIngkZW5hYmxlX3N0YXRzIiA9IHh5ZXM7IHRoZW4KKyAgQUNfREVGSU5FKFtEQlVTX0VOQUJMRV9TVEFUU10sIFsxXSwKKyAgICBbRGVmaW5lIHRvIGVuYWJsZSBidXMgZGFlbW9uIHVzYWdlIHN0YXRpc3RpY3NdKQorZmkKKworQUNfQVJHX0VOQUJMRShbdXNlci1zZXNzaW9uXSwKKyAgW0FTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS11c2VyLXNlc3Npb25dLAorICAgIFtlbmFibGUgdXNlci1zZXNzaW9uIHNlbWFudGljcyBmb3Igc2Vzc2lvbiBidXMgdW5kZXIgc3lzdGVtZF0pXSwKKyAgW10sIFtlbmFibGVfdXNlcl9zZXNzaW9uPW5vXSkKK0FNX0NPTkRJVElPTkFMKFtEQlVTX0VOQUJMRV9VU0VSX1NFU1NJT05dLAorICBbdGVzdCAieCRlbmFibGVfdXNlcl9zZXNzaW9uIiA9IHh5ZXNdKQorCitBQ19DT05GSUdfRklMRVMoWworRG94eWZpbGUKK2RidXMvVmVyc2lvbgorZGJ1cy92ZXJzaW9uaW5mby5yYworZGJ1cy9kYnVzLWFyY2gtZGVwcy5oCitidXMvc3lzdGVtLmNvbmYKK2J1cy9zZXNzaW9uLmNvbmYKK2J1cy9sZWdhY3ktY29uZmlnL3N5c3RlbS5jb25mCitidXMvbGVnYWN5LWNvbmZpZy9zZXNzaW9uLmNvbmYKK2J1cy9leGFtcGxlLXN5c3RlbS1lbmFibGUtc3RhdHMuY29uZgorYnVzL2V4YW1wbGUtc2Vzc2lvbi1kaXNhYmxlLXN0YXRzLmNvbmYKK2J1cy9vcmcuZnJlZWRlc2t0b3AuZGJ1cy1zZXNzaW9uLnBsaXN0CitidXMvZGJ1cy5zZXJ2aWNlCitidXMvZGJ1cy5zb2NrZXQKK2J1cy9zeXN0ZW1kLXVzZXIvZGJ1cy5zZXJ2aWNlCitidXMvc3lzdGVtZC11c2VyL2RidXMuc29ja2V0CitidXMvc3lzdXNlcnMuZC9kYnVzLmNvbmYKK2J1cy90bXBmaWxlcy5kL2RidXMuY29uZgorTWFrZWZpbGUKK2RidXMvTWFrZWZpbGUKK2J1cy9NYWtlZmlsZQordG9vbHMvTWFrZWZpbGUKK3Rlc3QvTWFrZWZpbGUKK3Rlc3QvbmFtZS10ZXN0L01ha2VmaWxlCitkb2MvTWFrZWZpbGUKK2RvYy9kYnVzLWNsZWFudXAtc29ja2V0cy4xLnhtbAorZG9jL2RidXMtZGFlbW9uLjEueG1sCitkb2MvZGJ1cy1sYXVuY2guMS54bWwKK2RvYy9kYnVzLW1vbml0b3IuMS54bWwKK2RvYy9kYnVzLXJ1bi1zZXNzaW9uLjEueG1sCitkb2MvZGJ1cy1zZW5kLjEueG1sCitkb2MvZGJ1cy10ZXN0LXRvb2wuMS54bWwKK2RvYy9kYnVzLXVwZGF0ZS1hY3RpdmF0aW9uLWVudmlyb25tZW50LjEueG1sCitkb2MvZGJ1cy11dWlkZ2VuLjEueG1sCitkYnVzLTEucGMKK2RidXMtMS11bmluc3RhbGxlZC5wYworY21ha2UvREJ1czFDb25maWcuY21ha2U6Y21ha2UvREJ1czFDb25maWcucGtnY29uZmlnLmluCitjbWFrZS9EQnVzMUNvbmZpZ1ZlcnNpb24uY21ha2UKK10pCitBQ19PVVRQVVQKKworZG5sID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitlY2hvICIKKyAgICAgICAgICAgICAgICAgICAgRC1CdXMgJFZFUlNJT04KKyAgICAgICAgICAgICAgICAgID09PT09PT09PT09PT09CisKKwlwcmVmaXg6ICAgICAgICAgICAgICAgICAgICR7RVhQQU5ERURfUFJFRklYfQorCWV4ZWNfcHJlZml4OiAgICAgICAgICAgICAgJHtleGVjX3ByZWZpeH0KKyAgICAgICAgbGliZGlyOiAgICAgICAgICAgICAgICAgICAke0VYUEFOREVEX0xJQkRJUn0KKyAgICAgICAgbGliZXhlY2RpcjogICAgICAgICAgICAgICAke0VYUEFOREVEX0xJQkVYRUNESVJ9CisgICAgICAgIGJpbmRpcjogICAgICAgICAgICAgICAgICAgJHtFWFBBTkRFRF9CSU5ESVJ9CisgICAgICAgIHN5c2NvbmZkaXI6ICAgICAgICAgICAgICAgJHtFWFBBTkRFRF9TWVNDT05GRElSfQorICAgICAgICBsb2NhbHN0YXRlZGlyOiAgICAgICAgICAgICR7RVhQQU5ERURfTE9DQUxTVEFURURJUn0KKyAgICAgICAgcnVuc3RhdGVkaXI6ICAgICAgICAgICAgICAke0VYUEFOREVEX1JVTlNUQVRFRElSfQorCWRhdGFkaXI6ICAgICAgICAgICAgICAgICAgJHtFWFBBTkRFRF9EQVRBRElSfQorCXNvdXJjZSBjb2RlIGxvY2F0aW9uOgkgICR7c3JjZGlyfQorCWNvbXBpbGVyOgkJICAke0NDfQorCWNmbGFnczoJCSAgICAgICAgICAke0NGTEFHU30KKwljcHBmbGFnczoJCSAgJHtDUFBGTEFHU30KKwljeHhmbGFnczoJCSAgJHtDWFhGTEFHU30KKwlsZGZsYWdzOgkJICAke0xERkxBR1N9CisJNjQtYml0IGludDoJCSAgJHtEQlVTX0lOVDY0X1RZUEV9CisJMzItYml0IGludDoJCSAgJHtEQlVTX0lOVDMyX1RZUEV9CisJMTYtYml0IGludDoJCSAgJHtEQlVTX0lOVDE2X1RZUEV9CisgICAgICAgIERveHlnZW46ICAgICAgICAgICAgICAgICAgJHtET1hZR0VOOi1ub3QgZm91bmR9CisgICAgICAgIHhtbHRvOiAgICAgICAgICAgICAgICAgICAgJHtYTUxUTzotbm90IGZvdW5kfQorICAgICAgICBkdWNrdHlwZTogICAgICAgICAgICAgICAgICR7RFVDS1RZUEU6LW5vdCBmb3VuZH0KKyAgICAgICAgeWVscC1idWlsZDogICAgICAgICAgICAgICAke1lFTFBfQlVJTEQ6LW5vdCBmb3VuZH0iCisKK2VjaG8gIgorICAgICAgICBSZWJ1aWxkaW5nIGdlbmVyYXRlZCBmaWxlczogJHtVU0VfTUFJTlRBSU5FUl9NT0RFfQorICAgICAgICBnY2MgY292ZXJhZ2UgcHJvZmlsaW5nOiAgICR7ZW5hYmxlX2NvZGVfY292ZXJhZ2V9CisgICAgICAgIEJ1aWxkaW5nIGVtYmVkZGVkIHRlc3RzOiAgJHtlbmFibGVfZW1iZWRkZWRfdGVzdHN9CisgICAgICAgIEJ1aWxkaW5nIG1vZHVsYXIgdGVzdHM6ICAgJHtlbmFibGVfbW9kdWxhcl90ZXN0c30KKyAgICAgICAgICAgIC0gd2l0aCBHTGliOiAgICAgICAgICAke3dpdGhfZ2xpYn0KKyAgICAgICAgSW5zdGFsbGluZyB0ZXN0czogICAgICAgICAke2VuYWJsZV9pbnN0YWxsZWRfdGVzdHN9CisgICAgICAgIEJ1aWxkaW5nIHZlcmJvc2UgbW9kZTogICAgJHtlbmFibGVfdmVyYm9zZV9tb2RlfQorICAgICAgICBCdWlsZGluZyBhc3NlcnRpb25zOiAgICAgICR7ZW5hYmxlX2Fzc2VydHN9CisgICAgICAgIEJ1aWxkaW5nIGNoZWNrczogICAgICAgICAgJHtlbmFibGVfY2hlY2tzfQorICAgICAgICBCdWlsZGluZyBidXMgc3RhdHMgQVBJOiAgICR7ZW5hYmxlX3N0YXRzfQorICAgICAgICBCdWlsZGluZyBTRUxpbnV4IHN1cHBvcnQ6ICR7aGF2ZV9zZWxpbnV4fQorICAgICAgICBCdWlsZGluZyBBcHBBcm1vciBzdXBwb3J0OiAke2hhdmVfYXBwYXJtb3J9CisgICAgICAgIEJ1aWxkaW5nIGlub3RpZnkgc3VwcG9ydDogJHtoYXZlX2lub3RpZnl9CisgICAgICAgIEJ1aWxkaW5nIGtxdWV1ZSBzdXBwb3J0OiAgJHtoYXZlX2txdWV1ZX0KKyAgICAgICAgQnVpbGRpbmcgc3lzdGVtZCBzdXBwb3J0OiAke2hhdmVfc3lzdGVtZH0KKyAgICAgICAgQnVpbGRpbmcgWDExIGNvZGU6ICAgICAgICAke2hhdmVfeDExfQorICAgICAgICBCdWlsZGluZyBEb3h5Z2VuIGRvY3M6ICAgICR7ZW5hYmxlX2RveHlnZW5fZG9jc30KKyAgICAgICAgQnVpbGRpbmcgRHVja3R5cGUgZG9jczogICAke2VuYWJsZV9kdWNrdHlwZV9kb2NzfQorICAgICAgICBCdWlsZGluZyBYTUwgZG9jczogICAgICAgICR7ZW5hYmxlX3htbF9kb2NzfQorICAgICAgICBCdWlsZGluZyBsYXVuY2hkIHN1cHBvcnQ6ICR7aGF2ZV9sYXVuY2hkfQorICAgICAgICBTeXN0ZW0gYnVzIHNvY2tldDogICAgICAgICR7REJVU19TWVNURU1fU09DS0VUfQorICAgICAgICBTeXN0ZW0gYnVzIGFkZHJlc3M6ICAgICAgICR7REJVU19TWVNURU1fQlVTX0RFRkFVTFRfQUREUkVTU30KKyAgICAgICAgU3lzdGVtIGJ1cyBQSUQgZmlsZTogICAgICAke0RCVVNfU1lTVEVNX1BJRF9GSUxFfQorICAgICAgICBTZXNzaW9uIGJ1cyBsaXN0ZW5zIG9uOiAgICR7REJVU19TRVNTSU9OX0JVU19MSVNURU5fQUREUkVTU30KKyAgICAgICAgU2Vzc2lvbiBjbGllbnRzIGNvbm5lY3QgdG86ICR7REJVU19TRVNTSU9OX0JVU19DT05ORUNUX0FERFJFU1N9CisgICAgICAgIHBhbV9jb25zb2xlIGF1dGggZGlyOiAgICAgJHt3aXRoX2NvbnNvbGVfYXV0aF9kaXI6LShub25lKX0KKyAgICAgICAgQ29uc29sZSBvd25lciBmaWxlOiAgICAgICAke2hhdmVfY29uc29sZV9vd25lcl9maWxlfQorICAgICAgICBDb25zb2xlIG93bmVyIGZpbGUgcGF0aDogICR7REJVU19DT05TT0xFX09XTkVSX0ZJTEV9CisJU3lzdGVtIGJ1cyB1c2VyOiAgICAgICAgICAke0RCVVNfVVNFUn0KKwlTZXNzaW9uIGJ1cyBzZXJ2aWNlcyBkaXI6ICR7RVhQQU5ERURfREFUQURJUn0vZGJ1cy0xL3NlcnZpY2VzCisgICAgICAgICdtYWtlIGNoZWNrJyBzb2NrZXQgZGlyOiAgJHtURVNUX1NPQ0tFVF9ESVJ9CisiCitpZiB0ZXN0IHgkaGF2ZV9sYXVuY2hkID0geHllczsgdGhlbgorICAgICAgICBlY2hvICIgICAgICAgIGxhdW5jaGQgYWdlbnQgZGlyOiAgICAgICAgJHtMQVVOQ0hEX0FHRU5UX0RJUn0iCitmaQorZWNobworCitpZiB0ZXN0IHgkZW5hYmxlX2VtYmVkZGVkX3Rlc3RzID0geHllczsgdGhlbgorICAgICAgICBlY2hvICJOT1RFOiBidWlsZGluZyB3aXRoIHVuaXQgdGVzdHMgaW5jcmVhc2VzIHRoZSBzaXplIG9mIHRoZSBpbnN0YWxsZWQgbGlicmFyeSBhbmQgcmVuZGVycyBpdCBpbnNlY3VyZS4iCitmaQoraWYgdGVzdCB4JGVuYWJsZV9lbWJlZGRlZF90ZXN0cyA9IHh5ZXMgLWEgeCRlbmFibGVfYXNzZXJ0cyA9IHhubzsgdGhlbgorICAgICAgICBlY2hvICJOT1RFOiBidWlsZGluZyB3aXRoIGVtYmVkZGVkIHRlc3RzIGJ1dCB3aXRob3V0IGFzc2VydGlvbnMgbWVhbnMgdGVzdHMgbWF5IG5vdCBwcm9wZXJseSByZXBvcnQgZmFpbHVyZXMgKHRoaXMgY29uZmlndXJhdGlvbiBpcyBvbmx5IHVzZWZ1bCB3aGVuIGRvaW5nIHNvbWV0aGluZyBsaWtlIHByb2ZpbGluZyB0aGUgdGVzdHMpIgorZmkKK0FTX0lGKFt0ZXN0IHgkZW5hYmxlX2NvZGVfY292ZXJhZ2UgPSB4eWVzXSxbCisgICAgQUNfTVNHX1dBUk4oW0J1aWxkaW5nIHdpdGggY292ZXJhZ2UgcHJvZmlsaW5nIGlzIGRlZmluaXRlbHkgZm9yIGRldmVsb3BlcnMgb25seS5dKQorICBdKQoraWYgdGVzdCB4JGVuYWJsZV92ZXJib3NlX21vZGUgPSB4eWVzOyB0aGVuCisgICAgICAgIGVjaG8gIk5PVEU6IGJ1aWxkaW5nIHdpdGggdmVyYm9zZSBtb2RlIGluY3JlYXNlcyBsaWJyYXJ5IHNpemUsIG1heSBzbGlnaHRseSBpbmNyZWFzZSBzZWN1cml0eSByaXNrLCBhbmQgZGVjcmVhc2VzIHBlcmZvcm1hbmNlLiIKK2ZpCitpZiB0ZXN0IHgkZW5hYmxlX2Fzc2VydHMgPSB4eWVzOyB0aGVuCisgICAgICAgIGVjaG8gIk5PVEU6IGJ1aWxkaW5nIHdpdGggYXNzZXJ0aW9ucyBpbmNyZWFzZXMgbGlicmFyeSBzaXplIGFuZCBkZWNyZWFzZXMgcGVyZm9ybWFuY2UuIgorZmkKK2lmIHRlc3QgeCRlbmFibGVfY2hlY2tzID0geG5vOyB0aGVuCisgICAgICAgIGVjaG8gIk5PVEU6IGJ1aWxkaW5nIHdpdGhvdXQgY2hlY2tzIGZvciBhcmd1bWVudHMgcGFzc2VkIHRvIHB1YmxpYyBBUEkgbWFrZXMgaXQgaGFyZGVyIHRvIGRlYnVnIGFwcHMgdXNpbmcgRC1CdXMsIGJ1dCB3aWxsIHNsaWdodGx5IGRlY3JlYXNlIEQtQnVzIGxpYnJhcnkgc2l6ZSBhbmQgX3ZlcnlfIHNsaWdodGx5IGltcHJvdmUgcGVyZm9ybWFuY2UuIgorZmkKZGlmZiAtLWdpdCBhL2RidXMtMS11bmluc3RhbGxlZC5wYy5pbiBiL2RidXMtMS11bmluc3RhbGxlZC5wYy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjZhZDJmCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy0xLXVuaW5zdGFsbGVkLnBjLmluCkBAIC0wLDAgKzEsMjAgQEAKK2Fic190b3BfYnVpbGRkaXI9QGFic190b3BfYnVpbGRkaXJACithYnNfdG9wX3NyY2Rpcj1AYWJzX3RvcF9zcmNkaXJACitwcmVmaXg9CitleGVjX3ByZWZpeD0KK2JpbmRpcj1AYmluZGlyQAorc3lzdGVtX2J1c19kZWZhdWx0X2FkZHJlc3M9QERCVVNfU1lTVEVNX0JVU19ERUZBVUxUX0FERFJFU1NACitkYXRhcm9vdGRpcj1AZGF0YXJvb3RkaXJACitkYXRhZGlyPUBkYXRhZGlyQAorc3lzY29uZmRpcj1Ac3lzY29uZmRpckAKK3Nlc3Npb25fYnVzX3NlcnZpY2VzX2Rpcj0ke2RhdGFkaXJ9L2RidXMtMS9zZXJ2aWNlcworc3lzdGVtX2J1c19zZXJ2aWNlc19kaXI9JHtkYXRhZGlyfS9kYnVzLTEvc3lzdGVtLXNlcnZpY2VzCitpbnRlcmZhY2VzX2Rpcj0ke2RhdGFkaXJ9L2RidXMtMS9pbnRlcmZhY2VzCitkYWVtb25kaXI9QGRidXNfZGFlbW9uZGlyQAorCitOYW1lOiBkYnVzCitEZXNjcmlwdGlvbjogRnJlZSBkZXNrdG9wIG1lc3NhZ2UgYnVzICh1bmluc3RhbGxlZCBjb3B5KQorVmVyc2lvbjogQFZFUlNJT05ACitMaWJzOiAke2Fic190b3BfYnVpbGRkaXJ9L2RidXMvbGliZGJ1cy0xLmxhCitMaWJzLnByaXZhdGU6IEBMSUJEQlVTX0xJQlNACitDZmxhZ3M6IC1JJHthYnNfdG9wX3NyY2Rpcn0gQERCVVNfU1RBVElDX0JVSUxEX0NQUEZMQUdTQApkaWZmIC0tZ2l0IGEvZGJ1cy0xLnBjLmluIGIvZGJ1cy0xLnBjLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1ODFiZTYKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzLTEucGMuaW4KQEAgLTAsMCArMSwyMSBAQAorb3JpZ2luYWxfcHJlZml4PUBwcmVmaXhACitwcmVmaXg9QHBrZ2NvbmZpZ19wcmVmaXhACitleGVjX3ByZWZpeD1AZXhlY19wcmVmaXhACitiaW5kaXI9QGJpbmRpckAKK2xpYmRpcj1AbGliZGlyQAoraW5jbHVkZWRpcj1AaW5jbHVkZWRpckAKK3N5c3RlbV9idXNfZGVmYXVsdF9hZGRyZXNzPUBEQlVTX1NZU1RFTV9CVVNfREVGQVVMVF9BRERSRVNTQAorZGF0YXJvb3RkaXI9QGRhdGFyb290ZGlyQAorZGF0YWRpcj1AZGF0YWRpckAKK3N5c2NvbmZkaXI9QHN5c2NvbmZkaXJACitzZXNzaW9uX2J1c19zZXJ2aWNlc19kaXI9JHtkYXRhZGlyfS9kYnVzLTEvc2VydmljZXMKK3N5c3RlbV9idXNfc2VydmljZXNfZGlyPSR7ZGF0YWRpcn0vZGJ1cy0xL3N5c3RlbS1zZXJ2aWNlcworaW50ZXJmYWNlc19kaXI9JHtkYXRhZGlyfS9kYnVzLTEvaW50ZXJmYWNlcworZGFlbW9uZGlyPUBkYnVzX2RhZW1vbmRpckAKKworTmFtZTogZGJ1cworRGVzY3JpcHRpb246IEZyZWUgZGVza3RvcCBtZXNzYWdlIGJ1cworVmVyc2lvbjogQFZFUlNJT05ACitMaWJzOiAtTCR7bGliZGlyfSAtbGRidXMtMQorTGlicy5wcml2YXRlOiBATElCREJVU19MSUJTQAorQ2ZsYWdzOiAtSSR7aW5jbHVkZWRpcn0vZGJ1cy0xLjAgLUkke2xpYmRpcn0vZGJ1cy0xLjAvaW5jbHVkZSBAREJVU19TVEFUSUNfQlVJTERfQ1BQRkxBR1NACmRpZmYgLS1naXQgYS9kYnVzLy5naXRpZ25vcmUgYi9kYnVzLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ5MWNjZQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvLmdpdGlnbm9yZQpAQCAtMCwwICsxLDE3IEBACisuZGVwcworLmxpYnMKK01ha2VmaWxlCitNYWtlZmlsZS5pbgorKi5sbworKi5sYQordGVzdC1kYnVzCisqLmJiCisqLmJiZworKi5nY292CisqLmRhCitkYnVzLWFyY2gtZGVwcy5oCisuZGJ1cy1rZXlyaW5ncworZGJ1cy1nbGliLWVycm9yLWVudW0uaAorKi5nY25vCisqLmdjZGEKK3ZlcnNpb25pbmZvLnJjCmRpZmYgLS1naXQgYS9kYnVzL0FuZHJvaWQubWsgYi9kYnVzL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhmYjhiNgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvQW5kcm9pZC5tawpAQCAtMCwwICsxLDExNCBAQAorIyBTZXQgdG8gdHJ1ZSB0byB3cml0ZSBsaWJkYnVzIGxvZ3MgdG8gbG9nY2F0IGluc3RlYWQgb2Ygc3RkZXJyCisjIFNlZSBhbHNvIGNvbmZpZy5oIHRvIHR1cm4gb24gdmVyYm9zZSBsb2dzCitMT0dfVE9fQU5EUk9JRF9MT0dDQVQgOj0gdHJ1ZQorCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVM6PSBcCisgICAgICAgIGRidXMtYWRkcmVzcy5jIFwKKyAgICAgICAgZGJ1cy1hc3YtdXRpbC5jIFwKKyAgICAgICAgZGJ1cy1hdXRoLmMgXAorICAgICAgICBkYnVzLWJ1cy5jIFwKKyAgICAgICAgZGJ1cy1jb25uZWN0aW9uLmMgXAorICAgICAgICBkYnVzLWNyZWRlbnRpYWxzLmMgXAorICAgICAgICBkYnVzLWRhdGFzbG90LmMgXAorICAgICAgICBkYnVzLWVycm9ycy5jIFwKKyAgICAgICAgZGJ1cy1maWxlLmMgXAorICAgICAgICBkYnVzLWZpbGUtdW5peC5jIFwKKyAgICAgICAgZGJ1cy1oYXNoLmMgXAorICAgICAgICBkYnVzLWludGVybmFscy5jIFwKKyAgICAgICAgZGJ1cy1rZXlyaW5nLmMgXAorICAgICAgICBkYnVzLWxpc3QuYyBcCisgICAgICAgIGRidXMtbWFpbmxvb3AuYyBcCisgICAgICAgIGRidXMtbWFyc2hhbC1iYXNpYy5jIFwKKyAgICAgICAgZGJ1cy1tYXJzaGFsLWJ5dGVzd2FwLmMgXAorICAgICAgICBkYnVzLW1hcnNoYWwtaGVhZGVyLmMgXAorICAgICAgICBkYnVzLW1hcnNoYWwtcmVjdXJzaXZlLmMgXAorICAgICAgICBkYnVzLW1hcnNoYWwtdmFsaWRhdGUuYyBcCisgICAgICAgIGRidXMtbWVtb3J5LmMgXAorICAgICAgICBkYnVzLW1lbXBvb2wuYyBcCisgICAgICAgIGRidXMtbWVzc2FnZS5jIFwKKyAgICAgICAgZGJ1cy1tZXNzYWdlLXV0aWwuYyBcCisgICAgICAgIGRidXMtbWlzYy5jIFwKKyAgICAgICAgZGJ1cy1ub25jZS5jIFwKKyAgICAgICAgZGJ1cy1vYmplY3QtdHJlZS5jIFwKKyAgICAgICAgZGJ1cy1wZW5kaW5nLWNhbGwuYyBcCisgICAgICAgIGRidXMtcGlwZS5jIFwKKyAgICAgICAgZGJ1cy1waXBlLXVuaXguYyBcCisgICAgICAgIGRidXMtcmVzb3VyY2VzLmMgXAorICAgICAgICBkYnVzLXNlcnZlci5jIFwKKyAgICAgICAgZGJ1cy1zZXJ2ZXItZGVidWctcGlwZS5jIFwKKyAgICAgICAgZGJ1cy1zZXJ2ZXItbGF1bmNoZC5jIFwKKyAgICAgICAgZGJ1cy1zZXJ2ZXItc29ja2V0LmMgXAorICAgICAgICBkYnVzLXNlcnZlci11bml4LmMgXAorICAgICAgICBkYnVzLXNoYS5jIFwKKyAgICAgICAgZGJ1cy1zaGVsbC5jIFwKKyAgICAgICAgZGJ1cy1zaWduYXR1cmUuYyBcCisgICAgICAgIGRidXMtc29ja2V0LXNldC5jIFwKKyAgICAgICAgZGJ1cy1zb2NrZXQtc2V0LWVwb2xsLmMgXAorICAgICAgICBkYnVzLXNvY2tldC1zZXQtcG9sbC5jIFwKKyAgICAgICAgZGJ1cy1zcGF3bi5jIFwKKyAgICAgICAgZGJ1cy1zdHJpbmcuYyBcCisgICAgICAgIGRidXMtc3RyaW5nLXV0aWwuYyBcCisgICAgICAgIGRidXMtc3ludGF4LmMgXAorICAgICAgICBkYnVzLXN5c2RlcHMuYyBcCisgICAgICAgIGRidXMtc3lzZGVwcy1wdGhyZWFkLmMgXAorICAgICAgICBkYnVzLXN5c2RlcHMtdW5peC5jIFwKKyAgICAgICAgZGJ1cy1zeXNkZXBzLXV0aWwuYyBcCisgICAgICAgIGRidXMtc3lzZGVwcy11dGlsLXVuaXguYyBcCisgICAgICAgIGRidXMtdGhyZWFkcy5jIFwKKyAgICAgICAgZGJ1cy10aW1lb3V0LmMgXAorICAgICAgICBkYnVzLXRyYW5zcG9ydC5jIFwKKyAgICAgICAgZGJ1cy10cmFuc3BvcnQtc29ja2V0LmMgXAorICAgICAgICBkYnVzLXRyYW5zcG9ydC11bml4LmMgXAorICAgICAgICBkYnVzLXVzZXJkYi5jIFwKKyAgICAgICAgZGJ1cy11c2VyZGItdXRpbC5jIFwKKyAgICAgICAgZGJ1cy11dWlkZ2VuLmMgXAorICAgICAgICBkYnVzLXdhdGNoLmMKKworTE9DQUxfQ19JTkNMVURFUys9ICQoTE9DQUxfUEFUSCkvLi4KKworTE9DQUxfTU9EVUxFOj1saWJkYnVzCisKK0xPQ0FMX0VYUE9SVF9DX0lOQ0xVREVfRElSUyA6PSAkKExPQ0FMX1BBVEgpLy4uCisKK0xPQ0FMX0NGTEFHUys9IFwKKwktRERCVVNfQ09NUElMQVRJT04gXAorCS1ESEFWRV9NT05PVE9OSUNfQ0xPQ0sgXAorCS1EREJVU19NQUNISU5FX1VVSURfRklMRT1cIi9ldGMvbWFjaGluZS1pZFwiIFwKKwktRERCVVNfU1lTVEVNX0NPTkZJR19GSUxFPVwiL2V0Yy9kYnVzLTEvc3lzdGVtLmNvbmZcIiBcCisJLUREQlVTX1NFU1NJT05fQ09ORklHX0ZJTEU9XCIvZXRjL2RidXMtMS9zZXNzaW9uLmNvbmZcIiBcCisJLVduby1lbXB0eS1ib2R5IFwKKwktV25vLW1pc3NpbmctZmllbGQtaW5pdGlhbGl6ZXJzIFwKKwktV25vLXBvaW50ZXItc2lnbiBcCisJLVduby1zaWduLWNvbXBhcmUgXAorCS1Xbm8tdGF1dG9sb2dpY2FsLWNvbXBhcmUgXAorCS1Xbm8tdHlwZS1saW1pdHMgXAorCS1Xbm8tdW51c2VkLXBhcmFtZXRlcgorCitMT0NBTF9DTEFORyA6PSB0cnVlCisKK2lmZXEgKCQoTE9HX1RPX0FORFJPSURfTE9HQ0FUKSx0cnVlKQoraWZuZXEgKCQoVEFSR0VUX0FSQ0gpLCB4ODYtNjQpCitMT0NBTF9DRkxBR1MrPSBcCisJLUREQlVTX0FORFJPSURfTE9HIFwKKwktREFORFJPSURfTUFOQUdFRF9TT0NLRVQKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUys9IGxpYmN1dGlscyBsaWJsb2cKK2VuZGlmCitlbmRpZgorCitpZmVxICgkKFRBUkdFVF9BUkNIKSwgeDg2LTY0KQorTE9DQUxfQ0ZMQUdTKz0gLURfR05VX1NPVVJDRQorZW5kaWYKKworaWZlcSAoJChCVUlMRF9FVVJFS0EpLHRydWUpCisjIENvcHkgdGhlIGhlYWRlcnMgdG8gdGhlIGJ1aWxkIHN5c3Jvb3QgZGlyZWN0b3J5LgoraW5jbHVkZV9kaXIgOj0gJChMT0NBTF9QQVRIKS8uLgoraW5jbHVkZV9maWxlcyA6PSAkKHNoZWxsIGZpbmQgJChpbmNsdWRlX2RpcikgLXR5cGUgZiAtbmFtZSAnKi5oJykKK0xPQ0FMX1RPT0xDSEFJTl9QUkVCVUlMVFMgOj0gXAorCSQoam9pbiAkKGluY2x1ZGVfZmlsZXMpLFwKKwkkKHBhdHN1YnN0ICQoaW5jbHVkZV9kaXIpLyUsOnVzci9pbmNsdWRlLyUsJChpbmNsdWRlX2ZpbGVzKSkpCitlbmRpZgoraW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvZGJ1cy9CVUlMRC5nbiBiL2RidXMvQlVJTEQuZ24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQxMTgyZgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvQlVJTEQuZ24KQEAgLTAsMCArMSw4MCBAQAorCitpbXBvcnQoIi8vY2hyb21lY2FzdC9pbnRlcm5hbC9jaHJvbWVjYXN0X2ludGVybmFsLmduaSIpCisKK3NvdXJjZV9zZXQoImRidXMiKSB7CisgIGNmbGFnc19jID0gWworICAgICItV25vLXVucmVhY2hhYmxlLWNvZGUiLAorICAgICItV25vLWdudS1mb2xkaW5nLWNvbnN0YW50IiwKKyAgXQorCisgIGRlZmluZXMgPSBbCisgICAgIkRCVVNfQ09NUElMQVRJT04iLAorICAgICJIQVZFX01PTk9UT05JQ19DTE9DSyIsCisgICAgIkRCVVNfTUFDSElORV9VVUlEX0ZJTEU9XCIvZXRjL21hY2hpbmUtaWRcIiIsCisgICAgIkRCVVNfU1lTVEVNX0NPTkZJR19GSUxFPVwiL2V0Yy9kYnVzLTEvc3lzdGVtLmNvbmZcIiIsCisgICAgIkRCVVNfU0VTU0lPTl9DT05GSUdfRklMRT1cIi9ldGMvZGJ1cy0xL3Nlc3Npb24uY29uZlwiIgorICBdCisKKyAgc291cmNlcyA9IFsKKyAgICAiZGJ1cy1hZGRyZXNzLmMiLAorICAgICJkYnVzLWFzdi11dGlsLmMiLAorICAgICJkYnVzLWF1dGguYyIsCisgICAgImRidXMtYnVzLmMiLAorICAgICJkYnVzLWNvbm5lY3Rpb24uYyIsCisgICAgImRidXMtY3JlZGVudGlhbHMuYyIsCisgICAgImRidXMtZGF0YXNsb3QuYyIsCisgICAgImRidXMtZXJyb3JzLmMiLAorICAgICJkYnVzLWZpbGUuYyIsCisgICAgImRidXMtZmlsZS11bml4LmMiLAorICAgICJkYnVzLWhhc2guYyIsCisgICAgImRidXMtaW50ZXJuYWxzLmMiLAorICAgICJkYnVzLWtleXJpbmcuYyIsCisgICAgImRidXMtbGlzdC5jIiwKKyAgICAiZGJ1cy1tYWlubG9vcC5jIiwKKyAgICAiZGJ1cy1tYXJzaGFsLWJhc2ljLmMiLAorICAgICJkYnVzLW1hcnNoYWwtYnl0ZXN3YXAuYyIsCisgICAgImRidXMtbWFyc2hhbC1oZWFkZXIuYyIsCisgICAgImRidXMtbWFyc2hhbC1yZWN1cnNpdmUuYyIsCisgICAgImRidXMtbWFyc2hhbC12YWxpZGF0ZS5jIiwKKyAgICAiZGJ1cy1tZW1vcnkuYyIsCisgICAgImRidXMtbWVtcG9vbC5jIiwKKyAgICAiZGJ1cy1tZXNzYWdlLmMiLAorICAgICJkYnVzLW1lc3NhZ2UtdXRpbC5jIiwKKyAgICAiZGJ1cy1taXNjLmMiLAorICAgICJkYnVzLW5vbmNlLmMiLAorICAgICJkYnVzLW9iamVjdC10cmVlLmMiLAorICAgICJkYnVzLXBlbmRpbmctY2FsbC5jIiwKKyAgICAiZGJ1cy1waXBlLmMiLAorICAgICJkYnVzLXBpcGUtdW5peC5jIiwKKyAgICAiZGJ1cy1yZXNvdXJjZXMuYyIsCisgICAgImRidXMtc2VydmVyLmMiLAorICAgICJkYnVzLXNlcnZlci1kZWJ1Zy1waXBlLmMiLAorICAgICJkYnVzLXNlcnZlci1sYXVuY2hkLmMiLAorICAgICJkYnVzLXNlcnZlci1zb2NrZXQuYyIsCisgICAgImRidXMtc2VydmVyLXVuaXguYyIsCisgICAgImRidXMtc2hhLmMiLAorICAgICJkYnVzLXNoZWxsLmMiLAorICAgICJkYnVzLXNpZ25hdHVyZS5jIiwKKyAgICAiZGJ1cy1zb2NrZXQtc2V0LmMiLAorICAgICJkYnVzLXNvY2tldC1zZXQtZXBvbGwuYyIsCisgICAgImRidXMtc29ja2V0LXNldC1wb2xsLmMiLAorICAgICJkYnVzLXNwYXduLmMiLAorICAgICJkYnVzLXN0cmluZy5jIiwKKyAgICAiZGJ1cy1zdHJpbmctdXRpbC5jIiwKKyAgICAiZGJ1cy1zeW50YXguYyIsCisgICAgImRidXMtc3lzZGVwcy5jIiwKKyAgICAiZGJ1cy1zeXNkZXBzLXB0aHJlYWQuYyIsCisgICAgImRidXMtc3lzZGVwcy11bml4LmMiLAorICAgICJkYnVzLXN5c2RlcHMtdXRpbC5jIiwKKyAgICAiZGJ1cy1zeXNkZXBzLXV0aWwtdW5peC5jIiwKKyAgICAiZGJ1cy10aHJlYWRzLmMiLAorICAgICJkYnVzLXRpbWVvdXQuYyIsCisgICAgImRidXMtdHJhbnNwb3J0LmMiLAorICAgICJkYnVzLXRyYW5zcG9ydC1zb2NrZXQuYyIsCisgICAgImRidXMtdHJhbnNwb3J0LXVuaXguYyIsCisgICAgImRidXMtdXNlcmRiLmMiLAorICAgICJkYnVzLXVzZXJkYi11dGlsLmMiLAorICAgICJkYnVzLXV1aWRnZW4uYyIsCisgICAgImRidXMtd2F0Y2guYyIsCisgIF0KK30KZGlmZiAtLWdpdCBhL2RidXMvTWFrZWZpbGUuYW0gYi9kYnVzL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjOGUyYTUKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMzM1IEBACisKK2RidXNkYXRhZGlyPSQoZGF0YWRpcikvZGJ1cy0xCisKK0FNX0NQUEZMQUdTID0gXAorCSQoQ09ERV9DT1ZFUkFHRV9DUFBGTEFHUykgXAorCS1JJCh0b3BfYnVpbGRkaXIpIFwKKwktSSQodG9wX3NyY2RpcikgXAorCSQoREJVU19TVEFUSUNfQlVJTERfQ1BQRkxBR1MpIFwKKwkkKFNZU1RFTURfQ0ZMQUdTKSBcCisJJChWQUxHUklORF9DRkxBR1MpIFwKKwktRERCVVNfQ09NUElMQVRJT04gXAorCS1EREJVU19NQUNISU5FX1VVSURfRklMRT1cIiIkKGxvY2Fsc3RhdGVkaXIpL2xpYi9kYnVzL21hY2hpbmUtaWQiXCIgXAorCS1EREJVU19TWVNURU1fQ09ORklHX0ZJTEU9XCIiJChkYnVzZGF0YWRpcikvc3lzdGVtLmNvbmYiXCIgXAorCS1EREJVU19TRVNTSU9OX0NPTkZJR19GSUxFPVwiIiQoZGJ1c2RhdGFkaXIpL3Nlc3Npb24uY29uZiJcIiBcCisJLUREQlVTX1JVTlNUQVRFRElSPVwiIiQocnVuc3RhdGVkaXIpIlwiIFwKKwkkKE5VTEwpCisKK0FNX0NGTEFHUyA9IFwKKwkkKENPREVfQ09WRVJBR0VfQ0ZMQUdTKSBcCisJJChOVUxMKQorCitpZiBIQVZFX1ZJU0lCSUxJVFkKK2lmICFEQlVTX1dJTgorQU1fQ0ZMQUdTICs9ICQoQ0ZMQUdfVklTSUJJTElUWSkKK0FNX0NQUEZMQUdTICs9IFwKKwktRERCVVNfRVhQT1JUPSdfX2F0dHJpYnV0ZV9fKChfX3Zpc2liaWxpdHlfXygiZGVmYXVsdCIpKSknIFwKKwktRERCVVNfUFJJVkFURV9FWFBPUlQ9J19fYXR0cmlidXRlX18oKF9fdmlzaWJpbGl0eV9fKCJkZWZhdWx0IikpKScgXAorCSQoTlVMTCkKK2VuZGlmCitlbmRpZgorCisjIGlmIGFzc2VydGlvbnMgYXJlIGVuYWJsZWQsIGltcHJvdmUgYmFja3RyYWNlcworQU1fTERGTEFHUyA9IEBSX0RZTkFNSUNfTERGTEFHQAorCitkYnVzaW5jbHVkZWRpcj0kKGluY2x1ZGVkaXIpL2RidXMtMS4wL2RidXMKK2RidXNhcmNoaW5jbHVkZWRpcj0kKGxpYmRpcikvZGJ1cy0xLjAvaW5jbHVkZS9kYnVzCisKK2xpYl9MVExJQlJBUklFUz1saWJkYnVzLTEubGEKKworIyBJbml0aWFsaXplIHRvIGVtcHR5IHNvIHRoYXQgd2UgY2FuIGFwcGVuZCBsYXRlcgorbm9kaXN0X2xpYmRidXNfMV9sYV9TT1VSQ0VTID0KKworIworIyBEZWFsIHdpdGggVzMyIC5kZWYgYW5kIHZlcnNpb24taW5mby5yYyBzdHVmZgorIworaWYgREJVU19XSU4KKworU1VGRklYRVMgPSAucmMKKworLnJjLmxvOgorCSQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1SQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1jb21waWxlICQoUkMpICQ8IC1vICRACisKK2VuZGlmCisKKworIworIyBQbGF0Zm9ybS1kZXBlbmRlbnQgc291cmNlczoKKyMKK2lmIERCVVNfV0lOCitEQlVTX0xJQl9hcmNoX3NvdXJjZXMgPSAJCQlcCisJZGJ1cy1zZXJ2ZXItd2luLmMgCQkJXAorCWRidXMtc2VydmVyLXdpbi5oCQkJXAorCSQoTlVMTCkKKworbm9kaXN0X2xpYmRidXNfMV9sYV9TT1VSQ0VTICs9IFwKKwl2ZXJzaW9uaW5mby5yYyBcCisJJChOVUxMKQorCitpZiBEQlVTX1dJTkNFCit3aW5jZV9zb3VyY2UgPSBkYnVzLXN5c2RlcHMtd2luY2UtZ2x1ZS5oIGRidXMtc3lzZGVwcy13aW5jZS1nbHVlLmMKK2Vsc2UKK3dpbmNlX3NvdXJjZSA9CitlbmRpZgorCitEQlVTX1NIQVJFRF9hcmNoX3NvdXJjZXMgPSAJCQlcCisJJCh3aW5jZV9zb3VyY2UpCQkJCVwKKwlkYnVzLWZpbGUtd2luLmMgCQkJXAorCWRidXMtcGlwZS13aW4uYyAJCQlcCisJZGJ1cy1zb2NrZXRzLXdpbi5oCQkJXAorCWRidXMtc3lzZGVwcy13aW4uYyAJCQlcCisJZGJ1cy1zeXNkZXBzLXdpbi5oCQkJXAorCWRidXMtc3lzZGVwcy10aHJlYWQtd2luLmMJCVwKKwlkYnVzLXRyYW5zcG9ydC13aW4uYwkJCVwKKwlkYnVzLXRyYW5zcG9ydC13aW4uaAorCitEQlVTX1VUSUxfYXJjaF9zb3VyY2VzID0JCQlcCisJZGJ1cy1zeXNkZXBzLXV0aWwtd2luLmMJCQlcCisJZGJ1cy1zcGF3bi13aW4uYworZWxzZQorCitpZiBEQlVTX0VOQUJMRV9MQVVOQ0hECitsYXVuY2hkX3NvdXJjZSA9IGRidXMtc2VydmVyLWxhdW5jaGQuaCBkYnVzLXNlcnZlci1sYXVuY2hkLmMKK2Vsc2UKK2xhdW5jaGRfc291cmNlID0KK2VuZGlmCisKK0RCVVNfTElCX2FyY2hfc291cmNlcyA9IAkJCVwKKwlkYnVzLXV1aWRnZW4uYwkJCQlcCisJZGJ1cy11dWlkZ2VuLmgJCQkJXAorCWRidXMtc2VydmVyLXVuaXguYyAJCQlcCisJZGJ1cy1zZXJ2ZXItdW5peC5oCisKK0RCVVNfU0hBUkVEX2FyY2hfc291cmNlcyA9IAkJCVwKKwkkKGxhdW5jaGRfc291cmNlKQkJCVwKKwlkYnVzLWZpbGUtdW5peC5jIAkJCVwKKwlkYnVzLXBpcGUtdW5peC5jIAkJCVwKKwlkYnVzLXN5c2RlcHMtdW5peC5jIAkJCVwKKwlkYnVzLXN5c2RlcHMtdW5peC5oCQkJXAorCWRidXMtc3lzZGVwcy1wdGhyZWFkLmMJCQlcCisJZGJ1cy10cmFuc3BvcnQtdW5peC5jCQkJXAorCWRidXMtdHJhbnNwb3J0LXVuaXguaAkJCVwKKwlkYnVzLXVzZXJkYi5jCQkJCVwKKwlkYnVzLXVzZXJkYi5oIAkJCQlcCisJJChOVUxMKQorCitEQlVTX1VUSUxfYXJjaF9zb3VyY2VzID0gCQkJXAorCWRidXMtc3lzZGVwcy11dGlsLXVuaXguYwkJXAorCWRidXMtdXNlcmRiLXV0aWwuYwkJCVwKKwlkYnVzLXNwYXduLmMKK2VuZGlmCisKK2lmIEhBVkVfTElOVVhfRVBPTEwKK0RCVVNfVVRJTF9hcmNoX3NvdXJjZXMgKz0gZGJ1cy1zb2NrZXQtc2V0LWVwb2xsLmMKK2VuZGlmCisKK2RidXNpbmNsdWRlX0hFQURFUlM9CQkJCVwKKwlkYnVzLmgJCQkJCVwKKwlkYnVzLWFkZHJlc3MuaAkJCQlcCisJZGJ1cy1idXMuaAkJCQlcCisJZGJ1cy1jb25uZWN0aW9uLmgJCQlcCisJZGJ1cy1lcnJvcnMuaAkJCQlcCisJZGJ1cy1tYWNyb3MuaAkJCQlcCisJZGJ1cy1tZW1vcnkuaAkJCQlcCisJZGJ1cy1tZXNzYWdlLmgJCQkJXAorCWRidXMtbWlzYy5oCQkJCVwKKwlkYnVzLXBlbmRpbmctY2FsbC5oCQkJXAorCWRidXMtcHJvdG9jb2wuaAkJCQlcCisJZGJ1cy1zZXJ2ZXIuaAkJCQlcCisJZGJ1cy1zaGFyZWQuaAkJCQlcCisJZGJ1cy1zaWduYXR1cmUuaAkJCVwKKwlkYnVzLXN5bnRheC5oCQkJCVwKKwlkYnVzLXRocmVhZHMuaAkJCQlcCisJZGJ1cy10eXBlcy5oCisKKworbm9kaXN0X2RidXNhcmNoaW5jbHVkZV9IRUFERVJTPQkJCVwKKwlkYnVzLWFyY2gtZGVwcy5oCisKKyMjIyBzb3VyY2UgY29kZSB0aGF0IGdvZXMgaW4gdGhlIGluc3RhbGxlZCBjbGllbnQgbGlicmFyeQorIyMjIGFuZCBpcyBzcGVjaWZpYyB0byBsaWJyYXJ5IGZ1bmN0aW9uYWxpdHkKK0RCVVNfTElCX1NPVVJDRVM9CQkJCVwKKwlkYnVzLWFkZHJlc3MuYwkJCQlcCisJZGJ1cy1hdXRoLmMJCQkJXAorCWRidXMtYXV0aC5oCQkJCVwKKwlkYnVzLWJ1cy5jCQkJCVwKKwlkYnVzLWNvbm5lY3Rpb24uYwkJCVwKKwlkYnVzLWNvbm5lY3Rpb24taW50ZXJuYWwuaAkJXAorCWRidXMtY3JlZGVudGlhbHMuYwkJCVwKKwlkYnVzLWNyZWRlbnRpYWxzLmgJCQlcCisJZGJ1cy1lcnJvcnMuYwkJCQlcCisJZGJ1cy1rZXlyaW5nLmMJCQkJXAorCWRidXMta2V5cmluZy5oCQkJCVwKKwlkYnVzLW1hcnNoYWwtaGVhZGVyLmMJCQlcCisJZGJ1cy1tYXJzaGFsLWhlYWRlci5oCQkJXAorCWRidXMtbWFyc2hhbC1ieXRlc3dhcC5jCQkJXAorCWRidXMtbWFyc2hhbC1ieXRlc3dhcC5oCQkJXAorCWRidXMtbWFyc2hhbC1yZWN1cnNpdmUuYwkJXAorCWRidXMtbWFyc2hhbC1yZWN1cnNpdmUuaAkJXAorCWRidXMtbWFyc2hhbC12YWxpZGF0ZS5jCQkJXAorCWRidXMtbWFyc2hhbC12YWxpZGF0ZS5oCQkJXAorCWRidXMtbWVzc2FnZS5jCQkJCVwKKwlkYnVzLW1lc3NhZ2UtaW50ZXJuYWwuaAkJCVwKKwlkYnVzLW1lc3NhZ2UtcHJpdmF0ZS5oCQkJXAorCWRidXMtbWlzYy5jCQkJCVwKKwlkYnVzLW5vbmNlLmgJCQkJXAorCWRidXMtbm9uY2UuYwkJCQlcCisJZGJ1cy1vYmplY3QtdHJlZS5jCQkJXAorCWRidXMtb2JqZWN0LXRyZWUuaAkJCVwKKwlkYnVzLXBlbmRpbmctY2FsbC5jCQkJXAorCWRidXMtcGVuZGluZy1jYWxsLWludGVybmFsLmgJCVwKKwlkYnVzLXJlc291cmNlcy5jCQkJXAorCWRidXMtcmVzb3VyY2VzLmgJCQlcCisJZGJ1cy1zZXJ2ZXIuYwkJCQlcCisJZGJ1cy1zZXJ2ZXItZGVidWctcGlwZS5jCQlcCisJZGJ1cy1zZXJ2ZXItZGVidWctcGlwZS5oCQlcCisJZGJ1cy1zZXJ2ZXItcHJvdGVjdGVkLmgJCQlcCisJZGJ1cy1zZXJ2ZXItc29ja2V0LmMJCQlcCisJZGJ1cy1zZXJ2ZXItc29ja2V0LmgJCQlcCisJJChEQlVTX0xJQl9hcmNoX3NvdXJjZXMpCQlcCisJZGJ1cy1zaGEuYwkJCQlcCisJZGJ1cy1zaGEuaAkJCQlcCisJZGJ1cy1zaWduYXR1cmUuYwkJCVwKKwlkYnVzLXN5bnRheC5jCQkJCVwKKwlkYnVzLXRpbWVvdXQuYwkJCQlcCisJZGJ1cy10aW1lb3V0LmgJCQkJXAorCWRidXMtdGhyZWFkcy1pbnRlcm5hbC5oCQkJXAorCWRidXMtdGhyZWFkcy5jCQkJCVwKKwlkYnVzLXRyYW5zcG9ydC5jCQkJXAorCWRidXMtdHJhbnNwb3J0LmgJCQlcCisJZGJ1cy10cmFuc3BvcnQtcHJvdGVjdGVkLmgJCVwKKwlkYnVzLXRyYW5zcG9ydC1zb2NrZXQuYwkJCVwKKwlkYnVzLXRyYW5zcG9ydC1zb2NrZXQuaAkJCVwKKwlkYnVzLXdhdGNoLmMJCQkJXAorCWRidXMtd2F0Y2guaAorCisjIyMgc291cmNlIGNvZGUgdGhhdCBnb2VzIGluIHRoZSBpbnN0YWxsZWQgY2xpZW50IGxpYnJhcnkKKyMjIyBBTkQgaXMgZ2VuZXJpYyB1dGlsaXR5IGZ1bmN0aW9uYWxpdHkgdXNlZCBieSB0aGUKKyMjIyBkYWVtb24gb3IgdGVzdCBwcm9ncmFtcyAoYWxsIHN5bWJvbHMgaW4gaGVyZSBzaG91bGQKKyMjIyBiZSB1bmRlcnNjb3JlLXByZWZpeGVkKQorREJVU19TSEFSRURfU09VUkNFUz0JCQkJXAorCWRidXMtZGF0YXNsb3QuYwkJCQlcCisJZGJ1cy1kYXRhc2xvdC5oCQkJCVwKKwlkYnVzLWZpbGUuYyAgICAgICAgICAgICAgICAgXAorCWRidXMtZmlsZS5oICAgICAgICAgICAgICAgICBcCisJZGJ1cy1oYXNoLmMJCQkJXAorCWRidXMtaGFzaC5oCQkJCVwKKwlkYnVzLWludGVybmFscy5jCQkJXAorCWRidXMtaW50ZXJuYWxzLmgJCQlcCisJZGJ1cy1saXN0LmMJCQkJXAorCWRidXMtbGlzdC5oCQkJCVwKKwlkYnVzLW1hcnNoYWwtYmFzaWMuYwkJCVwKKwlkYnVzLW1hcnNoYWwtYmFzaWMuaAkJCVwKKwlkYnVzLW1lbW9yeS5jCQkJCVwKKwlkYnVzLW1lbXBvb2wuYwkJCQlcCisJZGJ1cy1tZW1wb29sLmgJCQkJXAorCWRidXMtcGlwZS5jICAgICAgICAgICAgICAgICBcCisJZGJ1cy1waXBlLmggICAgICAgICAgICAgICAgIFwKKwlkYnVzLXN0cmluZy5jCQkJCVwKKwlkYnVzLXN0cmluZy5oCQkJCVwKKwlkYnVzLXN0cmluZy1wcml2YXRlLmgJCQlcCisJJChEQlVTX1NIQVJFRF9hcmNoX3NvdXJjZXMpCQlcCisJZGJ1cy1zeXNkZXBzLmMJCQkJXAorCWRidXMtc3lzZGVwcy5oCQkJCVwKKwlkYnVzLXZhbGdyaW5kLWludGVybmFsLmgKKworIyMjIHNvdXJjZSBjb2RlIHRoYXQgaXMgZ2VuZXJpYyB1dGlsaXR5IGZ1bmN0aW9uYWxpdHkgdXNlZAorIyMjIGJ5IHRoZSBidXMgZGFlbW9uIG9yIHRlc3QgYXBwcywgYnV0IGlzIE5PVCBpbmNsdWRlZAorIyMjIGluIHRoZSBELUJ1cyBjbGllbnQgbGlicmFyeSAoYWxsIHN5bWJvbHMgaW4gaGVyZQorIyMjIHNob3VsZCBiZSB1bmRlcnNjb3JlLXByZWZpeGVkIGJ1dCBkb24ndCByZWFsbHkgbmVlZAorIyMjIHRvIGJlIHVubGVzcyB0aGV5IG1vdmUgdG8gREJVU19TSEFSRURfU09VUkNFUyBsYXRlcikKK0RCVVNfVVRJTF9TT1VSQ0VTPQkJCQlcCisJZGJ1cy1hc3YtdXRpbC5jCQkJCVwKKwlkYnVzLWFzdi11dGlsLmgJCQkJXAorCWRidXMtYXV0aC1zY3JpcHQuYwkJCVwKKwlkYnVzLWF1dGgtc2NyaXB0LmgJCQlcCisJZGJ1cy1hdXRoLXV0aWwuYwkJCVwKKwlkYnVzLWNyZWRlbnRpYWxzLXV0aWwuYwkJCVwKKwlkYnVzLW1haW5sb29wLmMJCQkJXAorCWRidXMtbWFpbmxvb3AuaAkJCQlcCisJZGJ1cy1tYXJzaGFsLWJ5dGVzd2FwLXV0aWwuYwkJXAorCWRidXMtbWFyc2hhbC1yZWN1cnNpdmUtdXRpbC5jCQlcCisJZGJ1cy1tYXJzaGFsLXZhbGlkYXRlLXV0aWwuYwkJXAorCWRidXMtbWVzc2FnZS1mYWN0b3J5LmMJCQlcCisJZGJ1cy1tZXNzYWdlLWZhY3RvcnkuaAkJCVwKKwlkYnVzLW1lc3NhZ2UtdXRpbC5jCQkJXAorCWRidXMtc2hlbGwuYwkJCQlcCisJZGJ1cy1zaGVsbC5oCQkJCVwKKwkkKERCVVNfVVRJTF9hcmNoX3NvdXJjZXMpCQlcCisJZGJ1cy1zb2NrZXQtc2V0LmgJCQlcCisJZGJ1cy1zb2NrZXQtc2V0LmMJCQlcCisJZGJ1cy1zb2NrZXQtc2V0LXBvbGwuYwkJCVwKKwlkYnVzLXNwYXduLmgJCQkJXAorCWRidXMtc3RyaW5nLXV0aWwuYwkJCVwKKwlkYnVzLXN5c2RlcHMtdXRpbC5jCQkJXAorCWRidXMtdGVzdC5jCQkJCVwKKwlkYnVzLXRlc3QuaAorCitpZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworREJVU19VVElMX1NPVVJDRVMgKz0gZGJ1cy1zcGF3bi10ZXN0LmMKK2VuZGlmCisKK2xpYmRidXNfMV9sYV9TT1VSQ0VTPQkJCQlcCisJJChEQlVTX0xJQl9TT1VSQ0VTKQkJCVwKKwkkKERCVVNfU0hBUkVEX1NPVVJDRVMpCisKK2xpYmRidXNfaW50ZXJuYWxfbGFfU09VUkNFUz0JCQlcCisJJChEQlVTX1VUSUxfU09VUkNFUykKKworQlVJTFRfU09VUkNFUz0kKG5vZGlzdF9kYnVzYXJjaGluY2x1ZGVfSEVBREVSUykKK0VYVFJBX0RJU1Q9ZGJ1cy1hcmNoLWRlcHMuaC5pbgorCitub2luc3RfTFRMSUJSQVJJRVM9bGliZGJ1cy1pbnRlcm5hbC5sYQorCitsaWJkYnVzXzFfbGFfQ1BQRkxBR1MgPSBcCisJJChBTV9DUFBGTEFHUykgXAorCS1EZGJ1c18xX0VYUE9SVFMgXAorCSQoTlVMTCkKKworaWYgSEFWRV9MRF9WRVJTSU9OX1NDUklQVAorU1lNQk9MX0VYUE9SVF9MREZMQUdTPS1XbCwtLXZlcnNpb24tc2NyaXB0PVZlcnNpb24KK2Vsc2UKK1NZTUJPTF9FWFBPUlRfTERGTEFHUz0KK2VuZGlmCisKK2xpYmRidXNfMV9sYV9MSUJBREQ9ICQoTElCREJVU19MSUJTKQorbGliZGJ1c18xX2xhX0xERkxBR1MgPSBcCisJJChBTV9MREZMQUdTKSBcCisJLXZlcnNpb24taW5mbyAkKExUX0NVUlJFTlQpOiQoTFRfUkVWSVNJT04pOiQoTFRfQUdFKSBcCisJJChTWU1CT0xfRVhQT1JUX0xERkxBR1MpIFwKKwktbm8tdW5kZWZpbmVkIFwKKwkkKE5VTEwpCisKK2xpYmRidXNfaW50ZXJuYWxfbGFfTElCQUREPSQoTElCREJVU19MSUJTKSBsaWJkYnVzLTEubGEKKworaWYgREJVU19XSU4KK0FNX0NYWEZMQUdTID0gXAorCSQoQ09ERV9DT1ZFUkFHRV9DWFhGTEFHUykgXAorCSQoTlVMTCkKKworIyBUaGlzIG11c3QgYmUgYSBzZXBhcmF0ZSBjb252ZW5pZW5jZSBsaWJyYXJ5LCBvdGhlcndpc2UgbGlidG9vbCBub3RpY2VzCisjIHRoYXQgbGliZGJ1cy0xIG1pZ2h0IGNvbnRhaW4gQysrLCBsaW5rcyBpdCB3aXRoIGcrKyBhbmQgbGlua3MgaW4gbGlic3RkYysrLAorIyBldmVuIG9uIFVuaXggd2hlcmUgaW4gZmFjdCBpdCBkb2Vzbid0IGNvbnRhaW4gYW55IEMrKy4gRm9yIFdpbmRvd3MsIHdoZXJlCisjIHRoaXMgY29kZSBpcyB1c2VkLCB3ZSBkb24ndCBhY3R1YWxseSBuZWVkIGxpYnN0ZGMrKy4KK25vaW5zdF9MVExJQlJBUklFUyArPSBsaWJkYnVzLWluaXQtd2luLmxhCitsaWJkYnVzX2luaXRfd2luX2xhX1NPVVJDRVMgPSBkYnVzLWluaXQtd2luLmNwcAorbGliZGJ1c18xX2xhX0xJQkFERCArPSBsaWJkYnVzLWluaXQtd2luLmxhCitlbmRpZgorCitub2luc3RfUFJPR1JBTVMgPQorCitpZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworIyBXZSBjYW4ndCBhY3R1YWxseSBydW4gdGhpcyB0aWwgd2UndmUgcmVhY2hlZCB0ZXN0Lworbm9pbnN0X1BST0dSQU1TICs9IHRlc3QtZGJ1cworZW5kaWYKKwordGVzdF9kYnVzX1NPVVJDRVM9CQkJCVwKKwlkYnVzLXRlc3QtbWFpbi5jCisKK3Rlc3RfZGJ1c19MREFERCA9IGxpYmRidXMtaW50ZXJuYWwubGEKKworIyBBZGQgcnVsZXMgZm9yIGNvZGUtY292ZXJhZ2UgdGVzdGluZywgYXMgZGVmaW5lZCBieSBBWF9DT0RFX0NPVkVSQUdFCitpbmNsdWRlICQodG9wX3NyY2RpcikvYW1pbmNsdWRlX3N0YXRpYy5hbQorCitjbGVhbi1sb2NhbDoKKwkkKEFNX1ZfYXQpcm0gLWZyIC4vLmRidXMta2V5cmluZ3MKZGlmZiAtLWdpdCBhL2RidXMvTk9USUNFIGIvZGJ1cy9OT1RJQ0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTkxY2ExZAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvTk9USUNFCkBAIC0wLDAgKzEsNTUxIEBACitELUJ1cyBpcyBsaWNlbnNlZCB0byB5b3UgdW5kZXIgeW91ciBjaG9pY2Ugb2YgdGhlIEFjYWRlbWljIEZyZWUKK0xpY2Vuc2UgdmVyc2lvbiAyLjEsIG9yIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuCitCb3RoIGxpY2Vuc2VzIGFyZSBpbmNsdWRlZCBoZXJlLiBTb21lIG9mIHRoZSBzdGFuZGFsb25lIGJpbmFyaWVzIGFyZQordW5kZXIgdGhlIEdQTCBvbmx5OyBpbiBwYXJ0aWN1bGFyLCBidXQgbm90IGxpbWl0ZWQgdG8sCit0b29scy9kYnVzLWNsZWFudXAtc29ja2V0cy5jIGFuZCB0ZXN0L2RlY29kZS1nY292LmMuIEVhY2ggc291cmNlIGNvZGUKK2ZpbGUgaXMgbWFya2VkIHdpdGggdGhlIHByb3BlciBjb3B5cmlnaHQgaW5mb3JtYXRpb24gLSBpZiB5b3UgZmluZCBhCitmaWxlIHRoYXQgaXNuJ3QgbWFya2VkIHBsZWFzZSBicmluZyBpdCB0byBvdXIgYXR0ZW50aW9uLgorCisKK1RoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UKK3YuIDIuMQorCitUaGlzIEFjYWRlbWljIEZyZWUgTGljZW5zZSAodGhlICJMaWNlbnNlIikgYXBwbGllcyB0byBhbnkgb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwICh0aGUgIk9yaWdpbmFsIFdvcmsiKSB3aG9zZSBvd25lciAodGhlICJMaWNlbnNvciIpIGhhcyBwbGFjZWQgdGhlIGZvbGxvd2luZyBub3RpY2UgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciB0aGUgT3JpZ2luYWwgV29yazoKKworTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorCisxKSBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gTGljZW5zb3IgaGVyZWJ5IGdyYW50cyBZb3UgYQord29ybGQtd2lkZSwgcm95YWx0eS1mcmVlLCBub24tZXhjbHVzaXZlLCBwZXJwZXR1YWwsIHN1YmxpY2Vuc2VhYmxlCitsaWNlbnNlIHRvIGRvIHRoZSBmb2xsb3dpbmc6CisKK2EpIHRvIHJlcHJvZHVjZSB0aGUgT3JpZ2luYWwgV29yayBpbiBjb3BpZXM7CisKK2IpIHRvIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyAoIkRlcml2YXRpdmUgV29ya3MiKSBiYXNlZCB1cG9uIHRoZSBPcmlnaW5hbCBXb3JrOworCitjKSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgT3JpZ2luYWwgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0byB0aGUgcHVibGljOworCitkKSB0byBwZXJmb3JtIHRoZSBPcmlnaW5hbCBXb3JrIHB1YmxpY2x5OyBhbmQKKworZSkgdG8gZGlzcGxheSB0aGUgT3JpZ2luYWwgV29yayBwdWJsaWNseS4KKworMikgR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIExpY2Vuc29yIGhlcmVieSBncmFudHMgWW91IGEgd29ybGQtd2lkZSwKK3JveWFsdHktZnJlZSwgbm9uLWV4Y2x1c2l2ZSwgcGVycGV0dWFsLCBzdWJsaWNlbnNlYWJsZSBsaWNlbnNlLCB1bmRlcgorcGF0ZW50IGNsYWltcyBvd25lZCBvciBjb250cm9sbGVkIGJ5IHRoZSBMaWNlbnNvciB0aGF0IGFyZSBlbWJvZGllZCBpbgordGhlIE9yaWdpbmFsIFdvcmsgYXMgZnVybmlzaGVkIGJ5IHRoZSBMaWNlbnNvciwgdG8gbWFrZSwgdXNlLCBzZWxsIGFuZAorb2ZmZXIgZm9yIHNhbGUgdGhlIE9yaWdpbmFsIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MuCisKKzMpIEdyYW50IG9mIFNvdXJjZSBDb2RlIExpY2Vuc2UuIFRoZSB0ZXJtICJTb3VyY2UgQ29kZSIgbWVhbnMgdGhlCitwcmVmZXJyZWQgZm9ybSBvZiB0aGUgT3JpZ2luYWwgV29yayBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQgYW5kCithbGwgYXZhaWxhYmxlIGRvY3VtZW50YXRpb24gZGVzY3JpYmluZyBob3cgdG8gbW9kaWZ5IHRoZSBPcmlnaW5hbAorV29yay4gTGljZW5zb3IgaGVyZWJ5IGFncmVlcyB0byBwcm92aWRlIGEgbWFjaGluZS1yZWFkYWJsZSBjb3B5IG9mIHRoZQorU291cmNlIENvZGUgb2YgdGhlIE9yaWdpbmFsIFdvcmsgYWxvbmcgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIE9yaWdpbmFsCitXb3JrIHRoYXQgTGljZW5zb3IgZGlzdHJpYnV0ZXMuIExpY2Vuc29yIHJlc2VydmVzIHRoZSByaWdodCB0byBzYXRpc2Z5Cit0aGlzIG9ibGlnYXRpb24gYnkgcGxhY2luZyBhIG1hY2hpbmUtcmVhZGFibGUgY29weSBvZiB0aGUgU291cmNlIENvZGUKK2luIGFuIGluZm9ybWF0aW9uIHJlcG9zaXRvcnkgcmVhc29uYWJseSBjYWxjdWxhdGVkIHRvIHBlcm1pdAoraW5leHBlbnNpdmUgYW5kIGNvbnZlbmllbnQgYWNjZXNzIGJ5IFlvdSBmb3IgYXMgbG9uZyBhcyBMaWNlbnNvcgorY29udGludWVzIHRvIGRpc3RyaWJ1dGUgdGhlIE9yaWdpbmFsIFdvcmssIGFuZCBieSBwdWJsaXNoaW5nIHRoZQorYWRkcmVzcyBvZiB0aGF0IGluZm9ybWF0aW9uIHJlcG9zaXRvcnkgaW4gYSBub3RpY2UgaW1tZWRpYXRlbHkKK2ZvbGxvd2luZyB0aGUgY29weXJpZ2h0IG5vdGljZSB0aGF0IGFwcGxpZXMgdG8gdGhlIE9yaWdpbmFsIFdvcmsuCisKKzQpIEV4Y2x1c2lvbnMgRnJvbSBMaWNlbnNlIEdyYW50LiBOZWl0aGVyIHRoZSBuYW1lcyBvZiBMaWNlbnNvciwgbm9yCit0aGUgbmFtZXMgb2YgYW55IGNvbnRyaWJ1dG9ycyB0byB0aGUgT3JpZ2luYWwgV29yaywgbm9yIGFueSBvZiB0aGVpcgordHJhZGVtYXJrcyBvciBzZXJ2aWNlIG1hcmtzLCBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKK3Byb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIE9yaWdpbmFsIFdvcmsgd2l0aG91dCBleHByZXNzIHByaW9yIHdyaXR0ZW4KK3Blcm1pc3Npb24gb2YgdGhlIExpY2Vuc29yLiBOb3RoaW5nIGluIHRoaXMgTGljZW5zZSBzaGFsbCBiZSBkZWVtZWQgdG8KK2dyYW50IGFueSByaWdodHMgdG8gdHJhZGVtYXJrcywgY29weXJpZ2h0cywgcGF0ZW50cywgdHJhZGUgc2VjcmV0cyBvcgorYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBMaWNlbnNvciBleGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAoraGVyZWluLiBObyBwYXRlbnQgbGljZW5zZSBpcyBncmFudGVkIHRvIG1ha2UsIHVzZSwgc2VsbCBvciBvZmZlciB0bworc2VsbCBlbWJvZGltZW50cyBvZiBhbnkgcGF0ZW50IGNsYWltcyBvdGhlciB0aGFuIHRoZSBsaWNlbnNlZCBjbGFpbXMKK2RlZmluZWQgaW4gU2VjdGlvbiAyLiBObyByaWdodCBpcyBncmFudGVkIHRvIHRoZSB0cmFkZW1hcmtzIG9mCitMaWNlbnNvciBldmVuIGlmIHN1Y2ggbWFya3MgYXJlIGluY2x1ZGVkIGluIHRoZSBPcmlnaW5hbCBXb3JrLiBOb3RoaW5nCitpbiB0aGlzIExpY2Vuc2Ugc2hhbGwgYmUgaW50ZXJwcmV0ZWQgdG8gcHJvaGliaXQgTGljZW5zb3IgZnJvbQorbGljZW5zaW5nIHVuZGVyIGRpZmZlcmVudCB0ZXJtcyBmcm9tIHRoaXMgTGljZW5zZSBhbnkgT3JpZ2luYWwgV29yawordGhhdCBMaWNlbnNvciBvdGhlcndpc2Ugd291bGQgaGF2ZSBhIHJpZ2h0IHRvIGxpY2Vuc2UuCisKKzUpIFRoaXMgc2VjdGlvbiBpbnRlbnRpb25hbGx5IG9taXR0ZWQuCisKKzYpIEF0dHJpYnV0aW9uIFJpZ2h0cy4gWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIENvZGUgb2YgYW55CitEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGNyZWF0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50IG9yIHRyYWRlbWFyaworbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgQ29kZSBvZiB0aGUgT3JpZ2luYWwgV29yaywgYXMgd2VsbCBhcyBhbnkKK25vdGljZXMgb2YgbGljZW5zaW5nIGFuZCBhbnkgZGVzY3JpcHRpdmUgdGV4dCBpZGVudGlmaWVkIHRoZXJlaW4gYXMgYW4KKyJBdHRyaWJ1dGlvbiBOb3RpY2UuIiBZb3UgbXVzdCBjYXVzZSB0aGUgU291cmNlIENvZGUgZm9yIGFueQorRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBjcmVhdGUgdG8gY2FycnkgYSBwcm9taW5lbnQgQXR0cmlidXRpb24KK05vdGljZSByZWFzb25hYmx5IGNhbGN1bGF0ZWQgdG8gaW5mb3JtIHJlY2lwaWVudHMgdGhhdCBZb3UgaGF2ZQorbW9kaWZpZWQgdGhlIE9yaWdpbmFsIFdvcmsuCisKKzcpIFdhcnJhbnR5IG9mIFByb3ZlbmFuY2UgYW5kIERpc2NsYWltZXIgb2YgV2FycmFudHkuIExpY2Vuc29yCit3YXJyYW50cyB0aGF0IHRoZSBjb3B5cmlnaHQgaW4gYW5kIHRvIHRoZSBPcmlnaW5hbCBXb3JrIGFuZCB0aGUgcGF0ZW50CityaWdodHMgZ3JhbnRlZCBoZXJlaW4gYnkgTGljZW5zb3IgYXJlIG93bmVkIGJ5IHRoZSBMaWNlbnNvciBvciBhcmUKK3N1YmxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIHdpdGggdGhlIHBlcm1pc3Npb24KK29mIHRoZSBjb250cmlidXRvcihzKSBvZiB0aG9zZSBjb3B5cmlnaHRzIGFuZCBwYXRlbnQgcmlnaHRzLiBFeGNlcHQgYXMKK2V4cHJlc3NseSBzdGF0ZWQgaW4gdGhlIGltbWVkaWF0ZWx5IHByb2NlZWRpbmcgc2VudGVuY2UsIHRoZSBPcmlnaW5hbAorV29yayBpcyBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2Ugb24gYW4gIkFTIElTIiBCQVNJUyBhbmQgV0lUSE9VVAorV0FSUkFOVFksIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLAordGhlIHdhcnJhbnRpZXMgb2YgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKK1BBUlRJQ1VMQVIgUFVSUE9TRS4gVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIE9GIFRIRSBPUklHSU5BTAorV09SSyBJUyBXSVRIIFlPVS4gVGhpcyBESVNDTEFJTUVSIE9GIFdBUlJBTlRZIGNvbnN0aXR1dGVzIGFuIGVzc2VudGlhbAorcGFydCBvZiB0aGlzIExpY2Vuc2UuIE5vIGxpY2Vuc2UgdG8gT3JpZ2luYWwgV29yayBpcyBncmFudGVkIGhlcmV1bmRlcgorZXhjZXB0IHVuZGVyIHRoaXMgZGlzY2xhaW1lci4KKworOCkgTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIFVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgYW5kIHVuZGVyIG5vIGxlZ2FsCit0aGVvcnksIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3IKK290aGVyd2lzZSwgc2hhbGwgdGhlIExpY2Vuc29yIGJlIGxpYWJsZSB0byBhbnkgcGVyc29uIGZvciBhbnkgZGlyZWN0LAoraW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkKK2NoYXJhY3RlciBhcmlzaW5nIGFzIGEgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciB0aGUgdXNlIG9mIHRoZQorT3JpZ2luYWwgV29yayBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgZGFtYWdlcyBmb3IgbG9zcyBvZgorZ29vZHdpbGwsIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQKK2FsbCBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzLiBUaGlzIGxpbWl0YXRpb24gb2YgbGlhYmlsaXR5CitzaGFsbCBub3QgYXBwbHkgdG8gbGlhYmlsaXR5IGZvciBkZWF0aCBvciBwZXJzb25hbCBpbmp1cnkgcmVzdWx0aW5nCitmcm9tIExpY2Vuc29yJ3MgbmVnbGlnZW5jZSB0byB0aGUgZXh0ZW50IGFwcGxpY2FibGUgbGF3IHByb2hpYml0cyBzdWNoCitsaW1pdGF0aW9uLiBTb21lIGp1cmlzZGljdGlvbnMgZG8gbm90IGFsbG93IHRoZSBleGNsdXNpb24gb3IKK2xpbWl0YXRpb24gb2YgaW5jaWRlbnRhbCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHNvIHRoaXMgZXhjbHVzaW9uCithbmQgbGltaXRhdGlvbiBtYXkgbm90IGFwcGx5IHRvIFlvdS4KKworOSkgQWNjZXB0YW5jZSBhbmQgVGVybWluYXRpb24uIElmIFlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKK09yaWdpbmFsIFdvcmsgb3IgYSBEZXJpdmF0aXZlIFdvcmssIFlvdSBtdXN0IG1ha2UgYSByZWFzb25hYmxlIGVmZm9ydAordW5kZXIgdGhlIGNpcmN1bXN0YW5jZXMgdG8gb2J0YWluIHRoZSBleHByZXNzIGFzc2VudCBvZiByZWNpcGllbnRzIHRvCit0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLiBOb3RoaW5nIGVsc2UgYnV0IHRoaXMgTGljZW5zZSAob3IgYW5vdGhlcgord3JpdHRlbiBhZ3JlZW1lbnQgYmV0d2VlbiBMaWNlbnNvciBhbmQgWW91KSBncmFudHMgWW91IHBlcm1pc3Npb24gdG8KK2NyZWF0ZSBEZXJpdmF0aXZlIFdvcmtzIGJhc2VkIHVwb24gdGhlIE9yaWdpbmFsIFdvcmsgb3IgdG8gZXhlcmNpc2UKK2FueSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQgaW4gU2VjdGlvbiAxIGhlcmVpbiwgYW5kIGFueSBhdHRlbXB0IHRvIGRvCitzbyBleGNlcHQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSAob3IgYW5vdGhlciB3cml0dGVuCithZ3JlZW1lbnQgYmV0d2VlbiBMaWNlbnNvciBhbmQgWW91KSBpcyBleHByZXNzbHkgcHJvaGliaXRlZCBieQorVS5TLiBjb3B5cmlnaHQgbGF3LCB0aGUgZXF1aXZhbGVudCBsYXdzIG9mIG90aGVyIGNvdW50cmllcywgYW5kIGJ5CitpbnRlcm5hdGlvbmFsIHRyZWF0eS4gVGhlcmVmb3JlLCBieSBleGVyY2lzaW5nIGFueSBvZiB0aGUgcmlnaHRzCitncmFudGVkIHRvIFlvdSBpbiBTZWN0aW9uIDEgaGVyZWluLCBZb3UgaW5kaWNhdGUgWW91ciBhY2NlcHRhbmNlIG9mCit0aGlzIExpY2Vuc2UgYW5kIGFsbCBvZiBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMuCisKKzEwKSBUZXJtaW5hdGlvbiBmb3IgUGF0ZW50IEFjdGlvbi4gVGhpcyBMaWNlbnNlIHNoYWxsIHRlcm1pbmF0ZQorYXV0b21hdGljYWxseSBhbmQgWW91IG1heSBubyBsb25nZXIgZXhlcmNpc2UgYW55IG9mIHRoZSByaWdodHMgZ3JhbnRlZAordG8gWW91IGJ5IHRoaXMgTGljZW5zZSBhcyBvZiB0aGUgZGF0ZSBZb3UgY29tbWVuY2UgYW4gYWN0aW9uLAoraW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltLCBhZ2FpbnN0IExpY2Vuc29yIG9yIGFueQorbGljZW5zZWUgYWxsZWdpbmcgdGhhdCB0aGUgT3JpZ2luYWwgV29yayBpbmZyaW5nZXMgYSBwYXRlbnQuIFRoaXMKK3Rlcm1pbmF0aW9uIHByb3Zpc2lvbiBzaGFsbCBub3QgYXBwbHkgZm9yIGFuIGFjdGlvbiBhbGxlZ2luZyBwYXRlbnQKK2luZnJpbmdlbWVudCBieSBjb21iaW5hdGlvbnMgb2YgdGhlIE9yaWdpbmFsIFdvcmsgd2l0aCBvdGhlciBzb2Z0d2FyZQorb3IgaGFyZHdhcmUuCisKKzExKSBKdXJpc2RpY3Rpb24sIFZlbnVlIGFuZCBHb3Zlcm5pbmcgTGF3LiBBbnkgYWN0aW9uIG9yIHN1aXQgcmVsYXRpbmcKK3RvIHRoaXMgTGljZW5zZSBtYXkgYmUgYnJvdWdodCBvbmx5IGluIHRoZSBjb3VydHMgb2YgYSBqdXJpc2RpY3Rpb24KK3doZXJlaW4gdGhlIExpY2Vuc29yIHJlc2lkZXMgb3IgaW4gd2hpY2ggTGljZW5zb3IgY29uZHVjdHMgaXRzIHByaW1hcnkKK2J1c2luZXNzLCBhbmQgdW5kZXIgdGhlIGxhd3Mgb2YgdGhhdCBqdXJpc2RpY3Rpb24gZXhjbHVkaW5nIGl0cworY29uZmxpY3Qtb2YtbGF3IHByb3Zpc2lvbnMuIFRoZSBhcHBsaWNhdGlvbiBvZiB0aGUgVW5pdGVkIE5hdGlvbnMKK0NvbnZlbnRpb24gb24gQ29udHJhY3RzIGZvciB0aGUgSW50ZXJuYXRpb25hbCBTYWxlIG9mIEdvb2RzIGlzCitleHByZXNzbHkgZXhjbHVkZWQuIEFueSB1c2Ugb2YgdGhlIE9yaWdpbmFsIFdvcmsgb3V0c2lkZSB0aGUgc2NvcGUgb2YKK3RoaXMgTGljZW5zZSBvciBhZnRlciBpdHMgdGVybWluYXRpb24gc2hhbGwgYmUgc3ViamVjdCB0byB0aGUKK3JlcXVpcmVtZW50cyBhbmQgcGVuYWx0aWVzIG9mIHRoZSBVLlMuIENvcHlyaWdodCBBY3QsIDE3IFUuUy5DLiDDgsKnIDEwMQorZXQgc2VxLiwgdGhlIGVxdWl2YWxlbnQgbGF3cyBvZiBvdGhlciBjb3VudHJpZXMsIGFuZCBpbnRlcm5hdGlvbmFsCit0cmVhdHkuIFRoaXMgc2VjdGlvbiBzaGFsbCBzdXJ2aXZlIHRoZSB0ZXJtaW5hdGlvbiBvZiB0aGlzIExpY2Vuc2UuCisKKzEyKSBBdHRvcm5leXMgRmVlcy4gSW4gYW55IGFjdGlvbiB0byBlbmZvcmNlIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UKK29yIHNlZWtpbmcgZGFtYWdlcyByZWxhdGluZyB0aGVyZXRvLCB0aGUgcHJldmFpbGluZyBwYXJ0eSBzaGFsbCBiZQorZW50aXRsZWQgdG8gcmVjb3ZlciBpdHMgY29zdHMgYW5kIGV4cGVuc2VzLCBpbmNsdWRpbmcsIHdpdGhvdXQKK2xpbWl0YXRpb24sIHJlYXNvbmFibGUgYXR0b3JuZXlzJyBmZWVzIGFuZCBjb3N0cyBpbmN1cnJlZCBpbgorY29ubmVjdGlvbiB3aXRoIHN1Y2ggYWN0aW9uLCBpbmNsdWRpbmcgYW55IGFwcGVhbCBvZiBzdWNoIGFjdGlvbi4gVGhpcworc2VjdGlvbiBzaGFsbCBzdXJ2aXZlIHRoZSB0ZXJtaW5hdGlvbiBvZiB0aGlzIExpY2Vuc2UuCisKKzEzKSBNaXNjZWxsYW5lb3VzLiBUaGlzIExpY2Vuc2UgcmVwcmVzZW50cyB0aGUgY29tcGxldGUgYWdyZWVtZW50Citjb25jZXJuaW5nIHRoZSBzdWJqZWN0IG1hdHRlciBoZXJlb2YuIElmIGFueSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlCitpcyBoZWxkIHRvIGJlIHVuZW5mb3JjZWFibGUsIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIG9ubHkgdG8KK3RoZSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2UgaXQgZW5mb3JjZWFibGUuCisKKzE0KSBEZWZpbml0aW9uIG9mICJZb3UiIGluIFRoaXMgTGljZW5zZS4gIllvdSIgdGhyb3VnaG91dCB0aGlzCitMaWNlbnNlLCB3aGV0aGVyIGluIHVwcGVyIG9yIGxvd2VyIGNhc2UsIG1lYW5zIGFuIGluZGl2aWR1YWwgb3IgYQorbGVnYWwgZW50aXR5IGV4ZXJjaXNpbmcgcmlnaHRzIHVuZGVyLCBhbmQgY29tcGx5aW5nIHdpdGggYWxsIG9mIHRoZQordGVybXMgb2YsIHRoaXMgTGljZW5zZS4gRm9yIGxlZ2FsIGVudGl0aWVzLCAiWW91IiBpbmNsdWRlcyBhbnkgZW50aXR5Cit0aGF0IGNvbnRyb2xzLCBpcyBjb250cm9sbGVkIGJ5LCBvciBpcyB1bmRlciBjb21tb24gY29udHJvbCB3aXRoCit5b3UuIEZvciBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLAorZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaAorZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkKK3BlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsCitvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCisKKzE1KSBSaWdodCB0byBVc2UuIFlvdSBtYXkgdXNlIHRoZSBPcmlnaW5hbCBXb3JrIGluIGFsbCB3YXlzIG5vdAorb3RoZXJ3aXNlIHJlc3RyaWN0ZWQgb3IgY29uZGl0aW9uZWQgYnkgdGhpcyBMaWNlbnNlIG9yIGJ5IGxhdywgYW5kCitMaWNlbnNvciBwcm9taXNlcyBub3QgdG8gaW50ZXJmZXJlIHdpdGggb3IgYmUgcmVzcG9uc2libGUgZm9yIHN1Y2gKK3VzZXMgYnkgWW91LgorCitUaGlzIGxpY2Vuc2UgaXMgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDQgTGF3cmVuY2UgRS4gUm9zZW4uIEFsbCByaWdodHMKK3Jlc2VydmVkLiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhpcworbGljZW5zZSB3aXRob3V0IG1vZGlmaWNhdGlvbi4gVGhpcyBsaWNlbnNlIG1heSBub3QgYmUgbW9kaWZpZWQgd2l0aG91dAordGhlIGV4cHJlc3Mgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIGl0cyBjb3B5cmlnaHQgb3duZXIuCisKKworLS0gCitFTkQgT0YgQUNBREVNSUMgRlJFRSBMSUNFTlNFLiBUaGUgZm9sbG93aW5nIGlzIGludGVuZGVkIHRvIGRlc2NyaWJlIHRoZSBlc3NlbnRpYWwgCitkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgKEFGTCkgdmVyc2lvbiAxLjAgYW5kIG90aGVyIAorb3BlbiBzb3VyY2UgbGljZW5zZXM6CisKK1RoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgaXMgc2ltaWxhciB0byB0aGUgQlNELCBNSVQsIFVvSS9OQ1NBIGFuZCBBcGFjaGUgCitsaWNlbnNlcyBpbiBtYW55IHJlc3BlY3RzIGJ1dCBpdCBpcyBpbnRlbmRlZCB0byBzb2x2ZSBhIGZldyBwcm9ibGVtcyB3aXRoIAordGhvc2UgbGljZW5zZXMuCisgICAgCisqIFRoZSBBRkwgaXMgd3JpdHRlbiBzbyBhcyB0byBtYWtlIGl0IGNsZWFyIHdoYXQgc29mdHdhcmUgaXMgYmVpbmcgCitsaWNlbnNlZCAoYnkgdGhlIGluY2x1c2lvbiBvZiBhIHN0YXRlbWVudCBmb2xsb3dpbmcgdGhlIGNvcHlyaWdodCBub3RpY2UgCitpbiB0aGUgc29mdHdhcmUpLiBUaGlzIHdheSwgdGhlIGxpY2Vuc2UgZnVuY3Rpb25zIGJldHRlciB0aGFuIGEgdGVtcGxhdGUgCitsaWNlbnNlLiBUaGUgQlNELCBNSVQgYW5kIFVvSS9OQ1NBIGxpY2Vuc2VzIGFwcGx5IHRvIHVuaWRlbnRpZmllZCBzb2Z0d2FyZS4KKyAgICAKKyogVGhlIEFGTCBjb250YWlucyBhIGNvbXBsZXRlIGNvcHlyaWdodCBncmFudCB0byB0aGUgc29mdHdhcmUuIFRoZSBCU0QgCithbmQgQXBhY2hlIGxpY2Vuc2VzIGFyZSB2YWd1ZSBhbmQgaW5jb21wbGV0ZSBpbiB0aGF0IHJlc3BlY3QuCisgICAgCisqIFRoZSBBRkwgY29udGFpbnMgYSBjb21wbGV0ZSBwYXRlbnQgZ3JhbnQgdG8gdGhlIHNvZnR3YXJlLiBUaGUgQlNELCBNSVQsIAorVW9JL05DU0EgYW5kIEFwYWNoZSBsaWNlbnNlcyByZWx5IG9uIGFuIGltcGxpZWQgcGF0ZW50IGxpY2Vuc2UgYW5kIGNvbnRhaW4gCitubyBleHBsaWNpdCBwYXRlbnQgZ3JhbnQuCisgICAgCisqIFRoZSBBRkwgbWFrZXMgaXQgY2xlYXIgdGhhdCBubyB0cmFkZW1hcmsgcmlnaHRzIGFyZSBncmFudGVkIHRvIHRoZSAKK2xpY2Vuc29yJ3MgdHJhZGVtYXJrcy4gVGhlIEFwYWNoZSBsaWNlbnNlIGNvbnRhaW5zIHN1Y2ggYSBwcm92aXNpb24sIGJ1dCB0aGUgCitCU0QsIE1JVCBhbmQgVW9JL05DU0EgbGljZW5zZXMgZG8gbm90LgorICAgIAorKiBUaGUgQUZMIGluY2x1ZGVzIHRoZSB3YXJyYW50eSBieSB0aGUgbGljZW5zb3IgdGhhdCBpdCBlaXRoZXIgb3ducyB0aGUgCitjb3B5cmlnaHQgb3IgdGhhdCBpdCBpcyBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlIHVuZGVyIGEgbGljZW5zZS4gTm9uZSBvZiAKK3RoZSBvdGhlciBsaWNlbnNlcyBjb250YWluIHRoYXQgd2FycmFudHkuIEFsbCBvdGhlciB3YXJyYW50aWVzIGFyZSBkaXNjbGFpbWVkLCAKK2FzIGlzIHRoZSBjYXNlIGZvciB0aGUgb3RoZXIgbGljZW5zZXMuCisKKyogVGhlIEFGTCBpcyBpdHNlbGYgY29weXJpZ2h0ZWQgKHdpdGggdGhlIHJpZ2h0IGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSAKK3dpdGhvdXQgbW9kaWZpY2F0aW9uKS4gVGhpcyBlbnN1cmVzIHRoYXQgdGhlIG93bmVyIG9mIHRoZSBjb3B5cmlnaHQgdG8gdGhlIAorbGljZW5zZSB3aWxsIGNvbnRyb2wgY2hhbmdlcy4gVGhlIEFwYWNoZSBsaWNlbnNlIGNvbnRhaW5zIGEgY29weXJpZ2h0IG5vdGljZSwgCitidXQgdGhlIEJTRCwgTUlUIGFuZCBVb0kvTkNTQSBsaWNlbnNlcyBkbyBub3QuIAorLS0KK1NUQVJUIE9GIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCistLQorCisJCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorCQkgICAgICAgVmVyc2lvbiAyLCBKdW5lIDE5OTEKKworIENvcHlyaWdodCAoQykgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKKyBFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMKKyBvZiB0aGlzIGxpY2Vuc2UgZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KKworCQkJICAgIFByZWFtYmxlCisKKyAgVGhlIGxpY2Vuc2VzIGZvciBtb3N0IHNvZnR3YXJlIGFyZSBkZXNpZ25lZCB0byB0YWtlIGF3YXkgeW91cgorZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGl0LiAgQnkgY29udHJhc3QsIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZ3VhcmFudGVlIHlvdXIgZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGZyZWUKK3NvZnR3YXJlLS10byBtYWtlIHN1cmUgdGhlIHNvZnR3YXJlIGlzIGZyZWUgZm9yIGFsbCBpdHMgdXNlcnMuICBUaGlzCitHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgdG8gbW9zdCBvZiB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbidzIHNvZnR3YXJlIGFuZCB0byBhbnkgb3RoZXIgcHJvZ3JhbSB3aG9zZSBhdXRob3JzIGNvbW1pdCB0bwordXNpbmcgaXQuICAoU29tZSBvdGhlciBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gc29mdHdhcmUgaXMgY292ZXJlZCBieQordGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaW5zdGVhZC4pICBZb3UgY2FuIGFwcGx5IGl0IHRvCit5b3VyIHByb2dyYW1zLCB0b28uCisKKyAgV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20sIG5vdAorcHJpY2UuICBPdXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdQoraGF2ZSB0aGUgZnJlZWRvbSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiBmcmVlIHNvZnR3YXJlIChhbmQgY2hhcmdlIGZvcgordGhpcyBzZXJ2aWNlIGlmIHlvdSB3aXNoKSwgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBjYW4gZ2V0IGl0CitpZiB5b3Ugd2FudCBpdCwgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgc29mdHdhcmUgb3IgdXNlIHBpZWNlcyBvZiBpdAoraW4gbmV3IGZyZWUgcHJvZ3JhbXM7IGFuZCB0aGF0IHlvdSBrbm93IHlvdSBjYW4gZG8gdGhlc2UgdGhpbmdzLgorCisgIFRvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gbWFrZSByZXN0cmljdGlvbnMgdGhhdCBmb3JiaWQKK2FueW9uZSB0byBkZW55IHlvdSB0aGVzZSByaWdodHMgb3IgdG8gYXNrIHlvdSB0byBzdXJyZW5kZXIgdGhlIHJpZ2h0cy4KK1RoZXNlIHJlc3RyaWN0aW9ucyB0cmFuc2xhdGUgdG8gY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGZvciB5b3UgaWYgeW91CitkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgc29mdHdhcmUsIG9yIGlmIHlvdSBtb2RpZnkgaXQuCisKKyAgRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiBzdWNoIGEgcHJvZ3JhbSwgd2hldGhlcgorZ3JhdGlzIG9yIGZvciBhIGZlZSwgeW91IG11c3QgZ2l2ZSB0aGUgcmVjaXBpZW50cyBhbGwgdGhlIHJpZ2h0cyB0aGF0Cit5b3UgaGF2ZS4gIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZXksIHRvbywgcmVjZWl2ZSBvciBjYW4gZ2V0IHRoZQorc291cmNlIGNvZGUuICBBbmQgeW91IG11c3Qgc2hvdyB0aGVtIHRoZXNlIHRlcm1zIHNvIHRoZXkga25vdyB0aGVpcgorcmlnaHRzLgorCisgIFdlIHByb3RlY3QgeW91ciByaWdodHMgd2l0aCB0d28gc3RlcHM6ICgxKSBjb3B5cmlnaHQgdGhlIHNvZnR3YXJlLCBhbmQKKygyKSBvZmZlciB5b3UgdGhpcyBsaWNlbnNlIHdoaWNoIGdpdmVzIHlvdSBsZWdhbCBwZXJtaXNzaW9uIHRvIGNvcHksCitkaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgdGhlIHNvZnR3YXJlLgorCisgIEFsc28sIGZvciBlYWNoIGF1dGhvcidzIHByb3RlY3Rpb24gYW5kIG91cnMsIHdlIHdhbnQgdG8gbWFrZSBjZXJ0YWluCit0aGF0IGV2ZXJ5b25lIHVuZGVyc3RhbmRzIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoaXMgZnJlZQorc29mdHdhcmUuICBJZiB0aGUgc29mdHdhcmUgaXMgbW9kaWZpZWQgYnkgc29tZW9uZSBlbHNlIGFuZCBwYXNzZWQgb24sIHdlCit3YW50IGl0cyByZWNpcGllbnRzIHRvIGtub3cgdGhhdCB3aGF0IHRoZXkgaGF2ZSBpcyBub3QgdGhlIG9yaWdpbmFsLCBzbwordGhhdCBhbnkgcHJvYmxlbXMgaW50cm9kdWNlZCBieSBvdGhlcnMgd2lsbCBub3QgcmVmbGVjdCBvbiB0aGUgb3JpZ2luYWwKK2F1dGhvcnMnIHJlcHV0YXRpb25zLgorCisgIEZpbmFsbHksIGFueSBmcmVlIHByb2dyYW0gaXMgdGhyZWF0ZW5lZCBjb25zdGFudGx5IGJ5IHNvZnR3YXJlCitwYXRlbnRzLiAgV2Ugd2lzaCB0byBhdm9pZCB0aGUgZGFuZ2VyIHRoYXQgcmVkaXN0cmlidXRvcnMgb2YgYSBmcmVlCitwcm9ncmFtIHdpbGwgaW5kaXZpZHVhbGx5IG9idGFpbiBwYXRlbnQgbGljZW5zZXMsIGluIGVmZmVjdCBtYWtpbmcgdGhlCitwcm9ncmFtIHByb3ByaWV0YXJ5LiAgVG8gcHJldmVudCB0aGlzLCB3ZSBoYXZlIG1hZGUgaXQgY2xlYXIgdGhhdCBhbnkKK3BhdGVudCBtdXN0IGJlIGxpY2Vuc2VkIGZvciBldmVyeW9uZSdzIGZyZWUgdXNlIG9yIG5vdCBsaWNlbnNlZCBhdCBhbGwuCisKKyAgVGhlIHByZWNpc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQKK21vZGlmaWNhdGlvbiBmb2xsb3cuCisMCisJCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIENPUFlJTkcsIERJU1RSSUJVVElPTiBBTkQgTU9ESUZJQ0FUSU9OCisKKyAgMC4gVGhpcyBMaWNlbnNlIGFwcGxpZXMgdG8gYW55IHByb2dyYW0gb3Igb3RoZXIgd29yayB3aGljaCBjb250YWlucworYSBub3RpY2UgcGxhY2VkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyIHNheWluZyBpdCBtYXkgYmUgZGlzdHJpYnV0ZWQKK3VuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGUgIlByb2dyYW0iLCBiZWxvdywKK3JlZmVycyB0byBhbnkgc3VjaCBwcm9ncmFtIG9yIHdvcmssIGFuZCBhICJ3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtIgorbWVhbnMgZWl0aGVyIHRoZSBQcm9ncmFtIG9yIGFueSBkZXJpdmF0aXZlIHdvcmsgdW5kZXIgY29weXJpZ2h0IGxhdzoKK3RoYXQgaXMgdG8gc2F5LCBhIHdvcmsgY29udGFpbmluZyB0aGUgUHJvZ3JhbSBvciBhIHBvcnRpb24gb2YgaXQsCitlaXRoZXIgdmVyYmF0aW0gb3Igd2l0aCBtb2RpZmljYXRpb25zIGFuZC9vciB0cmFuc2xhdGVkIGludG8gYW5vdGhlcgorbGFuZ3VhZ2UuICAoSGVyZWluYWZ0ZXIsIHRyYW5zbGF0aW9uIGlzIGluY2x1ZGVkIHdpdGhvdXQgbGltaXRhdGlvbiBpbgordGhlIHRlcm0gIm1vZGlmaWNhdGlvbiIuKSAgRWFjaCBsaWNlbnNlZSBpcyBhZGRyZXNzZWQgYXMgInlvdSIuCisKK0FjdGl2aXRpZXMgb3RoZXIgdGhhbiBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kIG1vZGlmaWNhdGlvbiBhcmUgbm90Citjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZTsgdGhleSBhcmUgb3V0c2lkZSBpdHMgc2NvcGUuICBUaGUgYWN0IG9mCitydW5uaW5nIHRoZSBQcm9ncmFtIGlzIG5vdCByZXN0cmljdGVkLCBhbmQgdGhlIG91dHB1dCBmcm9tIHRoZSBQcm9ncmFtCitpcyBjb3ZlcmVkIG9ubHkgaWYgaXRzIGNvbnRlbnRzIGNvbnN0aXR1dGUgYSB3b3JrIGJhc2VkIG9uIHRoZQorUHJvZ3JhbSAoaW5kZXBlbmRlbnQgb2YgaGF2aW5nIGJlZW4gbWFkZSBieSBydW5uaW5nIHRoZSBQcm9ncmFtKS4KK1doZXRoZXIgdGhhdCBpcyB0cnVlIGRlcGVuZHMgb24gd2hhdCB0aGUgUHJvZ3JhbSBkb2VzLgorCisgIDEuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhlIFByb2dyYW0ncworc291cmNlIGNvZGUgYXMgeW91IHJlY2VpdmUgaXQsIGluIGFueSBtZWRpdW0sIHByb3ZpZGVkIHRoYXQgeW91Citjb25zcGljdW91c2x5IGFuZCBhcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuIGFwcHJvcHJpYXRlCitjb3B5cmlnaHQgbm90aWNlIGFuZCBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5OyBrZWVwIGludGFjdCBhbGwgdGhlCitub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlIGFuZCB0byB0aGUgYWJzZW5jZSBvZiBhbnkgd2FycmFudHk7CithbmQgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgUHJvZ3JhbSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlCithbG9uZyB3aXRoIHRoZSBQcm9ncmFtLgorCitZb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LCBhbmQKK3lvdSBtYXkgYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYSBmZWUuCisKKyAgMi4gWW91IG1heSBtb2RpZnkgeW91ciBjb3B5IG9yIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSBvciBhbnkgcG9ydGlvbgorb2YgaXQsIHRodXMgZm9ybWluZyBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0sIGFuZCBjb3B5IGFuZAorZGlzdHJpYnV0ZSBzdWNoIG1vZGlmaWNhdGlvbnMgb3Igd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiAxCithYm92ZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0IGFsbCBvZiB0aGVzZSBjb25kaXRpb25zOgorCisgICAgYSkgWW91IG11c3QgY2F1c2UgdGhlIG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBmaWxlcyBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4KKworICAgIGIpIFlvdSBtdXN0IGNhdXNlIGFueSB3b3JrIHRoYXQgeW91IGRpc3RyaWJ1dGUgb3IgcHVibGlzaCwgdGhhdCBpbgorICAgIHdob2xlIG9yIGluIHBhcnQgY29udGFpbnMgb3IgaXMgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtIG9yIGFueQorICAgIHBhcnQgdGhlcmVvZiwgdG8gYmUgbGljZW5zZWQgYXMgYSB3aG9sZSBhdCBubyBjaGFyZ2UgdG8gYWxsIHRoaXJkCisgICAgcGFydGllcyB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgorCisgICAgYykgSWYgdGhlIG1vZGlmaWVkIHByb2dyYW0gbm9ybWFsbHkgcmVhZHMgY29tbWFuZHMgaW50ZXJhY3RpdmVseQorICAgIHdoZW4gcnVuLCB5b3UgbXVzdCBjYXVzZSBpdCwgd2hlbiBzdGFydGVkIHJ1bm5pbmcgZm9yIHN1Y2gKKyAgICBpbnRlcmFjdGl2ZSB1c2UgaW4gdGhlIG1vc3Qgb3JkaW5hcnkgd2F5LCB0byBwcmludCBvciBkaXNwbGF5IGFuCisgICAgYW5ub3VuY2VtZW50IGluY2x1ZGluZyBhbiBhcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCBhCisgICAgbm90aWNlIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgKG9yIGVsc2UsIHNheWluZyB0aGF0IHlvdSBwcm92aWRlCisgICAgYSB3YXJyYW50eSkgYW5kIHRoYXQgdXNlcnMgbWF5IHJlZGlzdHJpYnV0ZSB0aGUgcHJvZ3JhbSB1bmRlcgorICAgIHRoZXNlIGNvbmRpdGlvbnMsIGFuZCB0ZWxsaW5nIHRoZSB1c2VyIGhvdyB0byB2aWV3IGEgY29weSBvZiB0aGlzCisgICAgTGljZW5zZS4gIChFeGNlcHRpb246IGlmIHRoZSBQcm9ncmFtIGl0c2VsZiBpcyBpbnRlcmFjdGl2ZSBidXQKKyAgICBkb2VzIG5vdCBub3JtYWxseSBwcmludCBzdWNoIGFuIGFubm91bmNlbWVudCwgeW91ciB3b3JrIGJhc2VkIG9uCisgICAgdGhlIFByb2dyYW0gaXMgbm90IHJlcXVpcmVkIHRvIHByaW50IGFuIGFubm91bmNlbWVudC4pCisMCitUaGVzZSByZXF1aXJlbWVudHMgYXBwbHkgdG8gdGhlIG1vZGlmaWVkIHdvcmsgYXMgYSB3aG9sZS4gIElmCitpZGVudGlmaWFibGUgc2VjdGlvbnMgb2YgdGhhdCB3b3JrIGFyZSBub3QgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtLAorYW5kIGNhbiBiZSByZWFzb25hYmx5IGNvbnNpZGVyZWQgaW5kZXBlbmRlbnQgYW5kIHNlcGFyYXRlIHdvcmtzIGluCit0aGVtc2VsdmVzLCB0aGVuIHRoaXMgTGljZW5zZSwgYW5kIGl0cyB0ZXJtcywgZG8gbm90IGFwcGx5IHRvIHRob3NlCitzZWN0aW9ucyB3aGVuIHlvdSBkaXN0cmlidXRlIHRoZW0gYXMgc2VwYXJhdGUgd29ya3MuICBCdXQgd2hlbiB5b3UKK2Rpc3RyaWJ1dGUgdGhlIHNhbWUgc2VjdGlvbnMgYXMgcGFydCBvZiBhIHdob2xlIHdoaWNoIGlzIGEgd29yayBiYXNlZAorb24gdGhlIFByb2dyYW0sIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHdob2xlIG11c3QgYmUgb24gdGhlIHRlcm1zIG9mCit0aGlzIExpY2Vuc2UsIHdob3NlIHBlcm1pc3Npb25zIGZvciBvdGhlciBsaWNlbnNlZXMgZXh0ZW5kIHRvIHRoZQorZW50aXJlIHdob2xlLCBhbmQgdGh1cyB0byBlYWNoIGFuZCBldmVyeSBwYXJ0IHJlZ2FyZGxlc3Mgb2Ygd2hvIHdyb3RlIGl0LgorCitUaHVzLCBpdCBpcyBub3QgdGhlIGludGVudCBvZiB0aGlzIHNlY3Rpb24gdG8gY2xhaW0gcmlnaHRzIG9yIGNvbnRlc3QKK3lvdXIgcmlnaHRzIHRvIHdvcmsgd3JpdHRlbiBlbnRpcmVseSBieSB5b3U7IHJhdGhlciwgdGhlIGludGVudCBpcyB0bworZXhlcmNpc2UgdGhlIHJpZ2h0IHRvIGNvbnRyb2wgdGhlIGRpc3RyaWJ1dGlvbiBvZiBkZXJpdmF0aXZlIG9yCitjb2xsZWN0aXZlIHdvcmtzIGJhc2VkIG9uIHRoZSBQcm9ncmFtLgorCitJbiBhZGRpdGlvbiwgbWVyZSBhZ2dyZWdhdGlvbiBvZiBhbm90aGVyIHdvcmsgbm90IGJhc2VkIG9uIHRoZSBQcm9ncmFtCit3aXRoIHRoZSBQcm9ncmFtIChvciB3aXRoIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSkgb24gYSB2b2x1bWUgb2YKK2Egc3RvcmFnZSBvciBkaXN0cmlidXRpb24gbWVkaXVtIGRvZXMgbm90IGJyaW5nIHRoZSBvdGhlciB3b3JrIHVuZGVyCit0aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLgorCisgIDMuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYSB3b3JrIGJhc2VkIG9uIGl0LAordW5kZXIgU2VjdGlvbiAyKSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gdW5kZXIgdGhlIHRlcm1zIG9mCitTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gZG8gb25lIG9mIHRoZSBmb2xsb3dpbmc6CisKKyAgICBhKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZyBtYWNoaW5lLXJlYWRhYmxlCisgICAgc291cmNlIGNvZGUsIHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zCisgICAgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCisKKyAgICBiKSBBY2NvbXBhbnkgaXQgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdCBsZWFzdCB0aHJlZQorICAgIHllYXJzLCB0byBnaXZlIGFueSB0aGlyZCBwYXJ0eSwgZm9yIGEgY2hhcmdlIG5vIG1vcmUgdGhhbiB5b3VyCisgICAgY29zdCBvZiBwaHlzaWNhbGx5IHBlcmZvcm1pbmcgc291cmNlIGRpc3RyaWJ1dGlvbiwgYSBjb21wbGV0ZQorICAgIG1hY2hpbmUtcmVhZGFibGUgY29weSBvZiB0aGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZSwgdG8gYmUKKyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bQorICAgIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKKworICAgIGMpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBpbmZvcm1hdGlvbiB5b3UgcmVjZWl2ZWQgYXMgdG8gdGhlIG9mZmVyCisgICAgdG8gZGlzdHJpYnV0ZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLiAgKFRoaXMgYWx0ZXJuYXRpdmUgaXMKKyAgICBhbGxvd2VkIG9ubHkgZm9yIG5vbmNvbW1lcmNpYWwgZGlzdHJpYnV0aW9uIGFuZCBvbmx5IGlmIHlvdQorICAgIHJlY2VpdmVkIHRoZSBwcm9ncmFtIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB3aXRoIHN1Y2gKKyAgICBhbiBvZmZlciwgaW4gYWNjb3JkIHdpdGggU3Vic2VjdGlvbiBiIGFib3ZlLikKKworVGhlIHNvdXJjZSBjb2RlIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvcgorbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQuICBGb3IgYW4gZXhlY3V0YWJsZSB3b3JrLCBjb21wbGV0ZSBzb3VyY2UKK2NvZGUgbWVhbnMgYWxsIHRoZSBzb3VyY2UgY29kZSBmb3IgYWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMgYW55Cithc3NvY2lhdGVkIGludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzLCBwbHVzIHRoZSBzY3JpcHRzIHVzZWQgdG8KK2NvbnRyb2wgY29tcGlsYXRpb24gYW5kIGluc3RhbGxhdGlvbiBvZiB0aGUgZXhlY3V0YWJsZS4gIEhvd2V2ZXIsIGFzIGEKK3NwZWNpYWwgZXhjZXB0aW9uLCB0aGUgc291cmNlIGNvZGUgZGlzdHJpYnV0ZWQgbmVlZCBub3QgaW5jbHVkZQorYW55dGhpbmcgdGhhdCBpcyBub3JtYWxseSBkaXN0cmlidXRlZCAoaW4gZWl0aGVyIHNvdXJjZSBvciBiaW5hcnkKK2Zvcm0pIHdpdGggdGhlIG1ham9yIGNvbXBvbmVudHMgKGNvbXBpbGVyLCBrZXJuZWwsIGFuZCBzbyBvbikgb2YgdGhlCitvcGVyYXRpbmcgc3lzdGVtIG9uIHdoaWNoIHRoZSBleGVjdXRhYmxlIHJ1bnMsIHVubGVzcyB0aGF0IGNvbXBvbmVudAoraXRzZWxmIGFjY29tcGFuaWVzIHRoZSBleGVjdXRhYmxlLgorCitJZiBkaXN0cmlidXRpb24gb2YgZXhlY3V0YWJsZSBvciBvYmplY3QgY29kZSBpcyBtYWRlIGJ5IG9mZmVyaW5nCithY2Nlc3MgdG8gY29weSBmcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgdGhlbiBvZmZlcmluZyBlcXVpdmFsZW50CithY2Nlc3MgdG8gY29weSB0aGUgc291cmNlIGNvZGUgZnJvbSB0aGUgc2FtZSBwbGFjZSBjb3VudHMgYXMKK2Rpc3RyaWJ1dGlvbiBvZiB0aGUgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdAorY29tcGVsbGVkIHRvIGNvcHkgdGhlIHNvdXJjZSBhbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS4KKwwKKyAgNC4gWW91IG1heSBub3QgY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCitleGNlcHQgYXMgZXhwcmVzc2x5IHByb3ZpZGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gIEFueSBhdHRlbXB0CitvdGhlcndpc2UgdG8gY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaXMKK3ZvaWQsIGFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIHlvdXIgcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZS4KK0hvd2V2ZXIsIHBhcnRpZXMgd2hvIGhhdmUgcmVjZWl2ZWQgY29waWVzLCBvciByaWdodHMsIGZyb20geW91IHVuZGVyCit0aGlzIExpY2Vuc2Ugd2lsbCBub3QgaGF2ZSB0aGVpciBsaWNlbnNlcyB0ZXJtaW5hdGVkIHNvIGxvbmcgYXMgc3VjaAorcGFydGllcyByZW1haW4gaW4gZnVsbCBjb21wbGlhbmNlLgorCisgIDUuIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UsIHNpbmNlIHlvdSBoYXZlIG5vdAorc2lnbmVkIGl0LiAgSG93ZXZlciwgbm90aGluZyBlbHNlIGdyYW50cyB5b3UgcGVybWlzc2lvbiB0byBtb2RpZnkgb3IKK2Rpc3RyaWJ1dGUgdGhlIFByb2dyYW0gb3IgaXRzIGRlcml2YXRpdmUgd29ya3MuICBUaGVzZSBhY3Rpb25zIGFyZQorcHJvaGliaXRlZCBieSBsYXcgaWYgeW91IGRvIG5vdCBhY2NlcHQgdGhpcyBMaWNlbnNlLiAgVGhlcmVmb3JlLCBieQorbW9kaWZ5aW5nIG9yIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtKSwgeW91IGluZGljYXRlIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGlzIExpY2Vuc2UgdG8gZG8gc28sIGFuZAorYWxsIGl0cyB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW5nIG9yIG1vZGlmeWluZwordGhlIFByb2dyYW0gb3Igd29ya3MgYmFzZWQgb24gaXQuCisKKyAgNi4gRWFjaCB0aW1lIHlvdSByZWRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQorUHJvZ3JhbSksIHRoZSByZWNpcGllbnQgYXV0b21hdGljYWxseSByZWNlaXZlcyBhIGxpY2Vuc2UgZnJvbSB0aGUKK29yaWdpbmFsIGxpY2Vuc29yIHRvIGNvcHksIGRpc3RyaWJ1dGUgb3IgbW9kaWZ5IHRoZSBQcm9ncmFtIHN1YmplY3QgdG8KK3RoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgWW91IG1heSBub3QgaW1wb3NlIGFueSBmdXJ0aGVyCityZXN0cmljdGlvbnMgb24gdGhlIHJlY2lwaWVudHMnIGV4ZXJjaXNlIG9mIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJlaW4uCitZb3UgYXJlIG5vdCByZXNwb25zaWJsZSBmb3IgZW5mb3JjaW5nIGNvbXBsaWFuY2UgYnkgdGhpcmQgcGFydGllcyB0bwordGhpcyBMaWNlbnNlLgorCisgIDcuIElmLCBhcyBhIGNvbnNlcXVlbmNlIG9mIGEgY291cnQganVkZ21lbnQgb3IgYWxsZWdhdGlvbiBvZiBwYXRlbnQKK2luZnJpbmdlbWVudCBvciBmb3IgYW55IG90aGVyIHJlYXNvbiAobm90IGxpbWl0ZWQgdG8gcGF0ZW50IGlzc3VlcyksCitjb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yCitvdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90CitleGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiAgSWYgeW91IGNhbm5vdAorZGlzdHJpYnV0ZSBzbyBhcyB0byBzYXRpc2Z5IHNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcworTGljZW5zZSBhbmQgYW55IG90aGVyIHBlcnRpbmVudCBvYmxpZ2F0aW9ucywgdGhlbiBhcyBhIGNvbnNlcXVlbmNlIHlvdQorbWF5IG5vdCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGF0IGFsbC4gIEZvciBleGFtcGxlLCBpZiBhIHBhdGVudAorbGljZW5zZSB3b3VsZCBub3QgcGVybWl0IHJveWFsdHktZnJlZSByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBieQorYWxsIHRob3NlIHdobyByZWNlaXZlIGNvcGllcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2ggeW91LCB0aGVuCit0aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCBpdCBhbmQgdGhpcyBMaWNlbnNlIHdvdWxkIGJlIHRvCityZWZyYWluIGVudGlyZWx5IGZyb20gZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtLgorCitJZiBhbnkgcG9ydGlvbiBvZiB0aGlzIHNlY3Rpb24gaXMgaGVsZCBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIKK2FueSBwYXJ0aWN1bGFyIGNpcmN1bXN0YW5jZSwgdGhlIGJhbGFuY2Ugb2YgdGhlIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8KK2FwcGx5IGFuZCB0aGUgc2VjdGlvbiBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFwcGx5IGluIG90aGVyCitjaXJjdW1zdGFuY2VzLgorCitJdCBpcyBub3QgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzZWN0aW9uIHRvIGluZHVjZSB5b3UgdG8gaW5mcmluZ2UgYW55CitwYXRlbnRzIG9yIG90aGVyIHByb3BlcnR5IHJpZ2h0IGNsYWltcyBvciB0byBjb250ZXN0IHZhbGlkaXR5IG9mIGFueQorc3VjaCBjbGFpbXM7IHRoaXMgc2VjdGlvbiBoYXMgdGhlIHNvbGUgcHVycG9zZSBvZiBwcm90ZWN0aW5nIHRoZQoraW50ZWdyaXR5IG9mIHRoZSBmcmVlIHNvZnR3YXJlIGRpc3RyaWJ1dGlvbiBzeXN0ZW0sIHdoaWNoIGlzCitpbXBsZW1lbnRlZCBieSBwdWJsaWMgbGljZW5zZSBwcmFjdGljZXMuICBNYW55IHBlb3BsZSBoYXZlIG1hZGUKK2dlbmVyb3VzIGNvbnRyaWJ1dGlvbnMgdG8gdGhlIHdpZGUgcmFuZ2Ugb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQKK3Rocm91Z2ggdGhhdCBzeXN0ZW0gaW4gcmVsaWFuY2Ugb24gY29uc2lzdGVudCBhcHBsaWNhdGlvbiBvZiB0aGF0CitzeXN0ZW07IGl0IGlzIHVwIHRvIHRoZSBhdXRob3IvZG9ub3IgdG8gZGVjaWRlIGlmIGhlIG9yIHNoZSBpcyB3aWxsaW5nCit0byBkaXN0cmlidXRlIHNvZnR3YXJlIHRocm91Z2ggYW55IG90aGVyIHN5c3RlbSBhbmQgYSBsaWNlbnNlZSBjYW5ub3QKK2ltcG9zZSB0aGF0IGNob2ljZS4KKworVGhpcyBzZWN0aW9uIGlzIGludGVuZGVkIHRvIG1ha2UgdGhvcm91Z2hseSBjbGVhciB3aGF0IGlzIGJlbGlldmVkIHRvCitiZSBhIGNvbnNlcXVlbmNlIG9mIHRoZSByZXN0IG9mIHRoaXMgTGljZW5zZS4KKwwKKyAgOC4gSWYgdGhlIGRpc3RyaWJ1dGlvbiBhbmQvb3IgdXNlIG9mIHRoZSBQcm9ncmFtIGlzIHJlc3RyaWN0ZWQgaW4KK2NlcnRhaW4gY291bnRyaWVzIGVpdGhlciBieSBwYXRlbnRzIG9yIGJ5IGNvcHlyaWdodGVkIGludGVyZmFjZXMsIHRoZQorb3JpZ2luYWwgY29weXJpZ2h0IGhvbGRlciB3aG8gcGxhY2VzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgTGljZW5zZQorbWF5IGFkZCBhbiBleHBsaWNpdCBnZW9ncmFwaGljYWwgZGlzdHJpYnV0aW9uIGxpbWl0YXRpb24gZXhjbHVkaW5nCit0aG9zZSBjb3VudHJpZXMsIHNvIHRoYXQgZGlzdHJpYnV0aW9uIGlzIHBlcm1pdHRlZCBvbmx5IGluIG9yIGFtb25nCitjb3VudHJpZXMgbm90IHRodXMgZXhjbHVkZWQuICBJbiBzdWNoIGNhc2UsIHRoaXMgTGljZW5zZSBpbmNvcnBvcmF0ZXMKK3RoZSBsaW1pdGF0aW9uIGFzIGlmIHdyaXR0ZW4gaW4gdGhlIGJvZHkgb2YgdGhpcyBMaWNlbnNlLgorCisgIDkuIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3IHZlcnNpb25zCitvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4gIFN1Y2ggbmV3IHZlcnNpb25zIHdpbGwKK2JlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sIGJ1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0bworYWRkcmVzcyBuZXcgcHJvYmxlbXMgb3IgY29uY2VybnMuCisKK0VhY2ggdmVyc2lvbiBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgSWYgdGhlIFByb2dyYW0KK3NwZWNpZmllcyBhIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgTGljZW5zZSB3aGljaCBhcHBsaWVzIHRvIGl0IGFuZCAiYW55CitsYXRlciB2ZXJzaW9uIiwgeW91IGhhdmUgdGhlIG9wdGlvbiBvZiBmb2xsb3dpbmcgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCitlaXRoZXIgb2YgdGhhdCB2ZXJzaW9uIG9yIG9mIGFueSBsYXRlciB2ZXJzaW9uIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbi4gIElmIHRoZSBQcm9ncmFtIGRvZXMgbm90IHNwZWNpZnkgYSB2ZXJzaW9uIG51bWJlciBvZgordGhpcyBMaWNlbnNlLCB5b3UgbWF5IGNob29zZSBhbnkgdmVyc2lvbiBldmVyIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbi4KKworICAxMC4gSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgdGhlIFByb2dyYW0gaW50byBvdGhlciBmcmVlCitwcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgZGlmZmVyZW50LCB3cml0ZSB0byB0aGUgYXV0aG9yCit0byBhc2sgZm9yIHBlcm1pc3Npb24uICBGb3Igc29mdHdhcmUgd2hpY2ggaXMgY29weXJpZ2h0ZWQgYnkgdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24sIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHdlIHNvbWV0aW1lcworbWFrZSBleGNlcHRpb25zIGZvciB0aGlzLiAgT3VyIGRlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMKK29mIHByZXNlcnZpbmcgdGhlIGZyZWUgc3RhdHVzIG9mIGFsbCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZSBzb2Z0d2FyZSBhbmQKK29mIHByb21vdGluZyB0aGUgc2hhcmluZyBhbmQgcmV1c2Ugb2Ygc29mdHdhcmUgZ2VuZXJhbGx5LgorCisJCQkgICAgTk8gV0FSUkFOVFkKKworICAxMS4gQkVDQVVTRSBUSEUgUFJPR1JBTSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8gV0FSUkFOVFkKK0ZPUiBUSEUgUFJPR1JBTSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuICBFWENFUFQgV0hFTgorT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQvT1IgT1RIRVIgUEFSVElFUworUFJPVklERSBUSEUgUFJPR1JBTSAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQKK09SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCitNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTCitUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIFBST0dSQU0gSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFCitQUk9HUkFNIFBST1ZFIERFRkVDVElWRSwgWU9VIEFTU1VNRSBUSEUgQ09TVCBPRiBBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywKK1JFUEFJUiBPUiBDT1JSRUNUSU9OLgorCisgIDEyLiBJTiBOTyBFVkVOVCBVTkxFU1MgUkVRVUlSRUQgQlkgQVBQTElDQUJMRSBMQVcgT1IgQUdSRUVEIFRPIElOIFdSSVRJTkcKK1dJTEwgQU5ZIENPUFlSSUdIVCBIT0xERVIsIE9SIEFOWSBPVEhFUiBQQVJUWSBXSE8gTUFZIE1PRElGWSBBTkQvT1IKK1JFRElTVFJJQlVURSBUSEUgUFJPR1JBTSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UgRk9SIERBTUFHRVMsCitJTkNMVURJTkcgQU5ZIEdFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcKK09VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIFBST0dSQU0gKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQKK1RPIExPU1MgT0YgREFUQSBPUiBEQVRBIEJFSU5HIFJFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWQorWU9VIE9SIFRISVJEIFBBUlRJRVMgT1IgQSBGQUlMVVJFIE9GIFRIRSBQUk9HUkFNIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIKK1BST0dSQU1TKSwgRVZFTiBJRiBTVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRQorUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorCisJCSAgICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisMCisJICAgIEhvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBQcm9ncmFtcworCisgIElmIHlvdSBkZXZlbG9wIGEgbmV3IHByb2dyYW0sIGFuZCB5b3Ugd2FudCBpdCB0byBiZSBvZiB0aGUgZ3JlYXRlc3QKK3Bvc3NpYmxlIHVzZSB0byB0aGUgcHVibGljLCB0aGUgYmVzdCB3YXkgdG8gYWNoaWV2ZSB0aGlzIGlzIHRvIG1ha2UgaXQKK2ZyZWUgc29mdHdhcmUgd2hpY2ggZXZlcnlvbmUgY2FuIHJlZGlzdHJpYnV0ZSBhbmQgY2hhbmdlIHVuZGVyIHRoZXNlIHRlcm1zLgorCisgIFRvIGRvIHNvLCBhdHRhY2ggdGhlIGZvbGxvd2luZyBub3RpY2VzIHRvIHRoZSBwcm9ncmFtLiAgSXQgaXMgc2FmZXN0Cit0byBhdHRhY2ggdGhlbSB0byB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgZmlsZSB0byBtb3N0IGVmZmVjdGl2ZWx5Citjb252ZXkgdGhlIGV4Y2x1c2lvbiBvZiB3YXJyYW50eTsgYW5kIGVhY2ggZmlsZSBzaG91bGQgaGF2ZSBhdCBsZWFzdAordGhlICJjb3B5cmlnaHQiIGxpbmUgYW5kIGEgcG9pbnRlciB0byB3aGVyZSB0aGUgZnVsbCBub3RpY2UgaXMgZm91bmQuCisKKyAgICA8b25lIGxpbmUgdG8gZ2l2ZSB0aGUgcHJvZ3JhbSdzIG5hbWUgYW5kIGEgYnJpZWYgaWRlYSBvZiB3aGF0IGl0IGRvZXMuPgorICAgIENvcHlyaWdodCAoQykgPHllYXI+ICA8bmFtZSBvZiBhdXRob3I+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKKworQWxzbyBhZGQgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRhY3QgeW91IGJ5IGVsZWN0cm9uaWMgYW5kIHBhcGVyIG1haWwuCisKK0lmIHRoZSBwcm9ncmFtIGlzIGludGVyYWN0aXZlLCBtYWtlIGl0IG91dHB1dCBhIHNob3J0IG5vdGljZSBsaWtlIHRoaXMKK3doZW4gaXQgc3RhcnRzIGluIGFuIGludGVyYWN0aXZlIG1vZGU6CisKKyAgICBHbm9tb3Zpc2lvbiB2ZXJzaW9uIDY5LCBDb3B5cmlnaHQgKEMpIHllYXIgbmFtZSBvZiBhdXRob3IKKyAgICBHbm9tb3Zpc2lvbiBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFk7IGZvciBkZXRhaWxzIHR5cGUgYHNob3cgdycuCisgICAgVGhpcyBpcyBmcmVlIHNvZnR3YXJlLCBhbmQgeW91IGFyZSB3ZWxjb21lIHRvIHJlZGlzdHJpYnV0ZSBpdAorICAgIHVuZGVyIGNlcnRhaW4gY29uZGl0aW9uczsgdHlwZSBgc2hvdyBjJyBmb3IgZGV0YWlscy4KKworVGhlIGh5cG90aGV0aWNhbCBjb21tYW5kcyBgc2hvdyB3JyBhbmQgYHNob3cgYycgc2hvdWxkIHNob3cgdGhlIGFwcHJvcHJpYXRlCitwYXJ0cyBvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIE9mIGNvdXJzZSwgdGhlIGNvbW1hbmRzIHlvdSB1c2UgbWF5CitiZSBjYWxsZWQgc29tZXRoaW5nIG90aGVyIHRoYW4gYHNob3cgdycgYW5kIGBzaG93IGMnOyB0aGV5IGNvdWxkIGV2ZW4gYmUKK21vdXNlLWNsaWNrcyBvciBtZW51IGl0ZW1zLS13aGF0ZXZlciBzdWl0cyB5b3VyIHByb2dyYW0uCisKK1lvdSBzaG91bGQgYWxzbyBnZXQgeW91ciBlbXBsb3llciAoaWYgeW91IHdvcmsgYXMgYSBwcm9ncmFtbWVyKSBvciB5b3VyCitzY2hvb2wsIGlmIGFueSwgdG8gc2lnbiBhICJjb3B5cmlnaHQgZGlzY2xhaW1lciIgZm9yIHRoZSBwcm9ncmFtLCBpZgorbmVjZXNzYXJ5LiAgSGVyZSBpcyBhIHNhbXBsZTsgYWx0ZXIgdGhlIG5hbWVzOgorCisgIFlveW9keW5lLCBJbmMuLCBoZXJlYnkgZGlzY2xhaW1zIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlIHByb2dyYW0KKyAgYEdub21vdmlzaW9uJyAod2hpY2ggbWFrZXMgcGFzc2VzIGF0IGNvbXBpbGVycykgd3JpdHRlbiBieSBKYW1lcyBIYWNrZXIuCisKKyAgPHNpZ25hdHVyZSBvZiBUeSBDb29uPiwgMSBBcHJpbCAxOTg5CisgIFR5IENvb24sIFByZXNpZGVudCBvZiBWaWNlCisKK1RoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBkb2VzIG5vdCBwZXJtaXQgaW5jb3Jwb3JhdGluZyB5b3VyIHByb2dyYW0gaW50bworcHJvcHJpZXRhcnkgcHJvZ3JhbXMuICBJZiB5b3VyIHByb2dyYW0gaXMgYSBzdWJyb3V0aW5lIGxpYnJhcnksIHlvdSBtYXkKK2NvbnNpZGVyIGl0IG1vcmUgdXNlZnVsIHRvIHBlcm1pdCBsaW5raW5nIHByb3ByaWV0YXJ5IGFwcGxpY2F0aW9ucyB3aXRoIHRoZQorbGlicmFyeS4gIElmIHRoaXMgaXMgd2hhdCB5b3Ugd2FudCB0byBkbywgdXNlIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZS4KZGlmZiAtLWdpdCBhL2RidXMvVmVyc2lvbiBiL2RidXMvVmVyc2lvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjhiYzNlCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9WZXJzaW9uCkBAIC0wLDAgKzEsMTAgQEAKK0xJQkRCVVNfMV8zIHsKKyAgZ2xvYmFsOgorICAgIGRidXNfKjsKKyAgbG9jYWw6CisgICAgKjsKK307CitMSUJEQlVTX1BSSVZBVEVfMS4xMi4yMCB7CisgIGdsb2JhbDoKKyAgICBfZGJ1c18qOworfTsKZGlmZiAtLWdpdCBhL2RidXMvVmVyc2lvbi5pbiBiL2RidXMvVmVyc2lvbi5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmNjMzY3Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9WZXJzaW9uLmluCkBAIC0wLDAgKzEsMTAgQEAKK0xJQkRCVVNfMV9AU09WRVJTSU9OQCB7CisgIGdsb2JhbDoKKyAgICBkYnVzXyo7CisgIGxvY2FsOgorICAgICo7Cit9OworTElCREJVU19QUklWQVRFX0BEQlVTX1ZFUlNJT05AIHsKKyAgZ2xvYmFsOgorICAgIF9kYnVzXyo7Cit9OwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLWFkZHJlc3MuYyBiL2RidXMvZGJ1cy1hZGRyZXNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZiMjZkNQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1hZGRyZXNzLmMKQEAgLTAsMCArMSw4MjggQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1hZGRyZXNzLmMgIFNlcnZlciBhZGRyZXNzIHBhcnNlci4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgIENvZGVGYWN0b3J5IEFCCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQsMjAwNSAgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiZGJ1cy1hZGRyZXNzLmgiCisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKyNpbmNsdWRlICJkYnVzLWxpc3QuaCIKKyNpbmNsdWRlICJkYnVzLXN0cmluZy5oIgorI2luY2x1ZGUgImRidXMtcHJvdG9jb2wuaCIKKworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c0FkZHJlc3NJbnRlcm5hbHMgQWRkcmVzcyBwYXJzaW5nCisgKiBAaW5ncm91cCAgREJ1c0ludGVybmFscworICogQGJyaWVmIEltcGxlbWVudGF0aW9uIG9mIHBhcnNpbmcgYWRkcmVzc2VzIG9mIEQtQnVzIHNlcnZlcnMuCisgKgorICogQHsKKyAqLworCisvKioKKyAqIEludGVybmFscyBvZiBEQnVzQWRkcmVzc0VudHJ5IAorICovCitzdHJ1Y3QgREJ1c0FkZHJlc3NFbnRyeQoreworICBEQnVzU3RyaW5nIG1ldGhvZDsgLyoqPCBUaGUgYWRkcmVzcyB0eXBlICh1bml4LCB0Y3AsIGV0Yy4pICovCisKKyAgREJ1c0xpc3QgKmtleXM7ICAgIC8qKjwgTGlzdCBvZiBrZXlzICovCisgIERCdXNMaXN0ICp2YWx1ZXM7ICAvKio8IExpc3Qgb2YgdmFsdWVzICovCit9OworCisKKy8qKgorICoKKyAqIFNldHMgI0RCVVNfRVJST1JfQkFEX0FERFJFU1MuCisgKiBJZiBhZGRyZXNzX3Byb2JsZW1fdHlwZSBhbmQgYWRkcmVzc19wcm9ibGVtX2ZpZWxkIGFyZSBub3QgI05VTEwsCisgKiBzZXRzIGFuIGVycm9yIG1lc3NhZ2UgYWJvdXQgaG93IHRoZSBmaWVsZCBpcyBubyBnb29kLiBPdGhlcndpc2UsIHNldHMKKyAqIGFkZHJlc3NfcHJvYmxlbV9vdGhlciBhcyB0aGUgZXJyb3IgbWVzc2FnZS4KKyAqIAorICogQHBhcmFtIGVycm9yIHRoZSBlcnJvciB0byBzZXQKKyAqIEBwYXJhbSBhZGRyZXNzX3Byb2JsZW1fdHlwZSB0aGUgYWRkcmVzcyB0eXBlIG9mIHRoZSBiYWQgYWRkcmVzcyBvciAjTlVMTAorICogQHBhcmFtIGFkZHJlc3NfcHJvYmxlbV9maWVsZCB0aGUgbWlzc2luZyBmaWVsZCBvZiB0aGUgYmFkIGFkZHJlc3Mgb3IgI05VTEwKKyAqIEBwYXJhbSBhZGRyZXNzX3Byb2JsZW1fb3RoZXIgYW55IG90aGVyIGVycm9yIG1lc3NhZ2Ugb3IgI05VTEwKKyAqLwordm9pZAorX2RidXNfc2V0X2JhZF9hZGRyZXNzIChEQnVzRXJyb3IgICplcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzc19wcm9ibGVtX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3NfcHJvYmxlbV9maWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzc19wcm9ibGVtX290aGVyKQoreworICBpZiAoYWRkcmVzc19wcm9ibGVtX3R5cGUgIT0gTlVMTCkKKyAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfQkFEX0FERFJFU1MsCisgICAgICAgICAgICAgICAgICAgICJTZXJ2ZXIgYWRkcmVzcyBvZiB0eXBlICVzIHdhcyBtaXNzaW5nIGFyZ3VtZW50ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgYWRkcmVzc19wcm9ibGVtX3R5cGUsIGFkZHJlc3NfcHJvYmxlbV9maWVsZCk7CisgIGVsc2UKKyAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfQkFEX0FERFJFU1MsCisgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgcGFyc2Ugc2VydmVyIGFkZHJlc3M6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgYWRkcmVzc19wcm9ibGVtX290aGVyKTsKK30KKworLyoqCisgKiAjVFJVRSBpZiB0aGUgYnl0ZSBuZWVkIG5vdCBiZSBlc2NhcGVkIHdoZW4gZm91bmQgaW4gYSBkYnVzIGFkZHJlc3MuCisgKiBBbGwgb3RoZXIgYnl0ZXMgYXJlIHJlcXVpcmVkIHRvIGJlIGVzY2FwZWQgaW4gYSB2YWxpZCBhZGRyZXNzLgorICovCisjZGVmaW5lIF9EQlVTX0FERFJFU1NfT1BUSU9OQUxMWV9FU0NBUEVEX0JZVEUoYikgICAgICAgIFwKKyAgICAgICAgICgoKGIpID49ICdhJyAmJiAoYikgPD0gJ3onKSB8fCAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICgoYikgPj0gJ0EnICYmIChiKSA8PSAnWicpIHx8ICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKChiKSA+PSAnMCcgJiYgKGIpIDw9ICc5JykgfHwgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoYikgPT0gJy0nIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChiKSA9PSAnXycgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKGIpID09ICcvJyB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoYikgPT0gJ1xcJyB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChiKSA9PSAnKicgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoYikgPT0gJy4nKQorCisvKioKKyAqIEFwcGVuZHMgYW4gZXNjYXBlZCB2ZXJzaW9uIG9mIG9uZSBzdHJpbmcgdG8gYW5vdGhlciBzdHJpbmcsCisgKiB1c2luZyB0aGUgRC1CdXMgYWRkcmVzcyBlc2NhcGluZyBtZWNoYW5pc20KKyAqCisgKiBAcGFyYW0gZXNjYXBlZCB0aGUgc3RyaW5nIHRvIGFwcGVuZCB0bworICogQHBhcmFtIHVuZXNjYXBlZCB0aGUgc3RyaW5nIHRvIGVzY2FwZQorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfYWRkcmVzc19hcHBlbmRfZXNjYXBlZCAoREJ1c1N0cmluZyAgICAgICAqZXNjYXBlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKnVuZXNjYXBlZCkKK3sKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqcDsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqZW5kOworICBkYnVzX2Jvb2xfdCByZXQ7CisgIGludCBvcmlnX2xlbjsKKworICByZXQgPSBGQUxTRTsKKworICBvcmlnX2xlbiA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChlc2NhcGVkKTsKKyAgcCA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfdWRhdGEgKHVuZXNjYXBlZCk7CisgIGVuZCA9IHAgKyBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAodW5lc2NhcGVkKTsKKyAgd2hpbGUgKHAgIT0gZW5kKQorICAgIHsKKyAgICAgIGlmIChfREJVU19BRERSRVNTX09QVElPTkFMTFlfRVNDQVBFRF9CWVRFICgqcCkpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfYnl0ZSAoZXNjYXBlZCwgKnApKQorICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlIChlc2NhcGVkLCAnJScpKQorICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX2J5dGVfYXNfaGV4IChlc2NhcGVkLCAqcCkpCisgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgICAgCisgICAgICArK3A7CisgICAgfQorCisgIHJldCA9IFRSVUU7CisgIAorIG91dDoKKyAgaWYgKCFyZXQpCisgICAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKGVzY2FwZWQsIG9yaWdfbGVuKTsKKyAgcmV0dXJuIHJldDsKK30KKworLyoqIEB9ICovIC8qIEVuZCBvZiBpbnRlcm5hbHMgKi8KKworc3RhdGljIHZvaWQKK2RidXNfYWRkcmVzc19lbnRyeV9mcmVlIChEQnVzQWRkcmVzc0VudHJ5ICplbnRyeSkKK3sKKyAgREJ1c0xpc3QgKmxpbms7CisgIAorICBfZGJ1c19zdHJpbmdfZnJlZSAoJmVudHJ5LT5tZXRob2QpOworCisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmZW50cnktPmtleXMpOworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlIChsaW5rLT5kYXRhKTsKKyAgICAgIGRidXNfZnJlZSAobGluay0+ZGF0YSk7CisgICAgICAKKyAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZlbnRyeS0+a2V5cywgbGluayk7CisgICAgfQorICBfZGJ1c19saXN0X2NsZWFyICgmZW50cnktPmtleXMpOworICAKKyAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZlbnRyeS0+dmFsdWVzKTsKKyAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAobGluay0+ZGF0YSk7CisgICAgICBkYnVzX2ZyZWUgKGxpbmstPmRhdGEpOworICAgICAgCisgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmZW50cnktPnZhbHVlcywgbGluayk7CisgICAgfQorICBfZGJ1c19saXN0X2NsZWFyICgmZW50cnktPnZhbHVlcyk7CisgIAorICBkYnVzX2ZyZWUgKGVudHJ5KTsKK30KKworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c0FkZHJlc3MgQWRkcmVzcyBwYXJzaW5nCisgKiBAaW5ncm91cCAgREJ1cworICogQGJyaWVmIFBhcnNpbmcgYWRkcmVzc2VzIG9mIEQtQnVzIHNlcnZlcnMuCisgKgorICogQHsKKyAqLworCisvKioKKyAqIEZyZWVzIGEgI05VTEwtdGVybWluYXRlZCBhcnJheSBvZiBhZGRyZXNzIGVudHJpZXMuCisgKgorICogQHBhcmFtIGVudHJpZXMgdGhlIGFycmF5LgorICovCit2b2lkCitkYnVzX2FkZHJlc3NfZW50cmllc19mcmVlIChEQnVzQWRkcmVzc0VudHJ5ICoqZW50cmllcykKK3sKKyAgaW50IGk7CisgIAorICBmb3IgKGkgPSAwOyBlbnRyaWVzW2ldICE9IE5VTEw7IGkrKykKKyAgICBkYnVzX2FkZHJlc3NfZW50cnlfZnJlZSAoZW50cmllc1tpXSk7CisgIGRidXNfZnJlZSAoZW50cmllcyk7Cit9CisKK3N0YXRpYyBEQnVzQWRkcmVzc0VudHJ5ICoKK2NyZWF0ZV9lbnRyeSAodm9pZCkKK3sKKyAgREJ1c0FkZHJlc3NFbnRyeSAqZW50cnk7CisKKyAgZW50cnkgPSBkYnVzX25ldzAgKERCdXNBZGRyZXNzRW50cnksIDEpOworCisgIGlmIChlbnRyeSA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZlbnRyeS0+bWV0aG9kKSkKKyAgICB7CisgICAgICBkYnVzX2ZyZWUgKGVudHJ5KTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICByZXR1cm4gZW50cnk7Cit9CisKKy8qKgorICogUmV0dXJucyB0aGUgbWV0aG9kIHN0cmluZyBvZiBhbiBhZGRyZXNzIGVudHJ5LiAgRm9yIGV4YW1wbGUsIGdpdmVuCisgKiB0aGUgYWRkcmVzcyBlbnRyeSAidGNwOmhvc3Q9ZXhhbXBsZS5jb20iIGl0IHdvdWxkIHJldHVybiB0aGUgc3RyaW5nCisgKiAidGNwIgorICoKKyAqIEBwYXJhbSBlbnRyeSB0aGUgZW50cnkuCisgKiBAcmV0dXJucyBhIHN0cmluZyBkZXNjcmliaW5nIHRoZSBtZXRob2QuIFRoaXMgc3RyaW5nCisgKiBtdXN0IG5vdCBiZSBmcmVlZC4KKyAqLworY29uc3QgY2hhciAqCitkYnVzX2FkZHJlc3NfZW50cnlfZ2V0X21ldGhvZCAoREJ1c0FkZHJlc3NFbnRyeSAqZW50cnkpCit7CisgIHJldHVybiBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZlbnRyeS0+bWV0aG9kKTsKK30KKworLyoqCisgKiBSZXR1cm5zIGEgdmFsdWUgZnJvbSBhIGtleSBvZiBhbiBlbnRyeS4gRm9yIGV4YW1wbGUsCisgKiBnaXZlbiB0aGUgYWRkcmVzcyAidGNwOmhvc3Q9ZXhhbXBsZS5jb20scG9ydD04MDczIiBpZiB5b3UgYXNrZWQKKyAqIGZvciB0aGUga2V5ICJob3N0IiB5b3Ugd291bGQgZ2V0IHRoZSB2YWx1ZSAiZXhhbXBsZS5jb20iCisgKgorICogVGhlIHJldHVybmVkIHZhbHVlIGlzIGFscmVhZHkgdW5lc2NhcGVkLgorICogCisgKiBAcGFyYW0gZW50cnkgdGhlIGVudHJ5LgorICogQHBhcmFtIGtleSB0aGUga2V5LgorICogQHJldHVybnMgdGhlIGtleSB2YWx1ZS4gVGhpcyBzdHJpbmcgbXVzdCBub3QgYmUgZnJlZWQuCisgKi8KK2NvbnN0IGNoYXIgKgorZGJ1c19hZGRyZXNzX2VudHJ5X2dldF92YWx1ZSAoREJ1c0FkZHJlc3NFbnRyeSAqZW50cnksCisJCQkgICAgICBjb25zdCBjaGFyICAgICAgICprZXkpCit7CisgIERCdXNMaXN0ICp2YWx1ZXMsICprZXlzOworCisgIGtleXMgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmZW50cnktPmtleXMpOworICB2YWx1ZXMgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmZW50cnktPnZhbHVlcyk7CisKKyAgd2hpbGUgKGtleXMgIT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c19hc3NlcnQgKHZhbHVlcyAhPSBOVUxMKTsKKworICAgICAgaWYgKF9kYnVzX3N0cmluZ19lcXVhbF9jX3N0ciAoa2V5cy0+ZGF0YSwga2V5KSkKKyAgICAgICAgcmV0dXJuIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAodmFsdWVzLT5kYXRhKTsKKworICAgICAga2V5cyA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJmVudHJ5LT5rZXlzLCBrZXlzKTsKKyAgICAgIHZhbHVlcyA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJmVudHJ5LT52YWx1ZXMsIHZhbHVlcyk7CisgICAgfQorICAKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYXBwZW5kX3VuZXNjYXBlZF92YWx1ZSAoREJ1c1N0cmluZyAgICAgICAqdW5lc2NhcGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqZXNjYXBlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGVzY2FwZWRfc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBlc2NhcGVkX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICBjb25zdCBjaGFyICpwOworICBjb25zdCBjaGFyICplbmQ7CisgIGRidXNfYm9vbF90IHJldDsKKyAgCisgIHJldCA9IEZBTFNFOworCisgIHAgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKGVzY2FwZWQpICsgZXNjYXBlZF9zdGFydDsKKyAgZW5kID0gcCArIGVzY2FwZWRfbGVuOworICB3aGlsZSAocCAhPSBlbmQpCisgICAgeworICAgICAgaWYgKF9EQlVTX0FERFJFU1NfT1BUSU9OQUxMWV9FU0NBUEVEX0JZVEUgKCpwKSkKKyAgICAgICAgeworICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlICh1bmVzY2FwZWQsICpwKSkKKyAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgICBlbHNlIGlmICgqcCA9PSAnJScpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBFZmZpY2llbmN5IGlzIGtpbmcgKi8KKyAgICAgICAgICBjaGFyIGJ1ZlszXTsKKyAgICAgICAgICBEQnVzU3RyaW5nIGhleDsKKyAgICAgICAgICBpbnQgaGV4X2VuZDsKKyAgICAgICAgICAKKyAgICAgICAgICArK3A7CisKKyAgICAgICAgICBpZiAoKHAgKyAyKSA+IGVuZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0JBRF9BRERSRVNTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluIEQtQnVzIGFkZHJlc3MsIHBlcmNlbnQgY2hhcmFjdGVyIHdhcyBub3QgZm9sbG93ZWQgYnkgdHdvIGhleCBkaWdpdHMiKTsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICBidWZbMF0gPSAqcDsKKyAgICAgICAgICArK3A7CisgICAgICAgICAgYnVmWzFdID0gKnA7CisgICAgICAgICAgYnVmWzJdID0gJ1wwJzsKKworICAgICAgICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmaGV4LCBidWYpOworCisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaGV4X2RlY29kZSAoJmhleCwgMCwgJmhleF9lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5lc2NhcGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICh1bmVzY2FwZWQpKSkKKyAgICAgICAgICAgIGdvdG8gb3V0OworCisgICAgICAgICAgaWYgKGhleF9lbmQgIT0gMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0JBRF9BRERSRVNTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluIEQtQnVzIGFkZHJlc3MsIHBlcmNlbnQgY2hhcmFjdGVyIHdhcyBmb2xsb3dlZCBieSBjaGFyYWN0ZXJzIG90aGVyIHRoYW4gaGV4IGRpZ2l0cyIpOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgLyogRXJyb3IsIHNob3VsZCBoYXZlIGJlZW4gZXNjYXBlZCAqLworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9CQURfQUREUkVTUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkluIEQtQnVzIGFkZHJlc3MsIGNoYXJhY3RlciAnJWMnIHNob3VsZCBoYXZlIGJlZW4gZXNjYXBlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKnApOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgICAKKyAgICAgICsrcDsKKyAgICB9CisKKyAgcmV0ID0gVFJVRTsKKyAgCisgb3V0OgorICBpZiAoIXJldCAmJiBlcnJvciAmJiAhZGJ1c19lcnJvcl9pc19zZXQgKGVycm9yKSkKKyAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisKKyAgX2RidXNfYXNzZXJ0IChyZXQgfHwgZXJyb3IgPT0gTlVMTCB8fCBkYnVzX2Vycm9yX2lzX3NldCAoZXJyb3IpKTsKKyAgCisgIHJldHVybiByZXQ7Cit9CisKKy8qKgorICogUGFyc2VzIGFuIGFkZHJlc3Mgc3RyaW5nIG9mIHRoZSBmb3JtOgorICoKKyAqIG1ldGhvZDprZXk9dmFsdWUsa2V5PXZhbHVlO21ldGhvZDprZXk9dmFsdWUKKyAqCisgKiBTZWUgdGhlIEQtQnVzIHNwZWNpZmljYXRpb24gZm9yIGNvbXBsZXRlIGRvY3Mgb24gdGhlIGZvcm1hdC4KKyAqCisgKiBXaGVuIGNvbm5lY3RpbmcgdG8gYW4gYWRkcmVzcywgdGhlIGZpcnN0IGFkZHJlc3MgZW50cmllcworICogaW4gdGhlIHNlbWljb2xvbi1zZXBhcmF0ZWQgbGlzdCBzaG91bGQgYmUgdHJpZWQgZmlyc3QuCisgKiAKKyAqIEBwYXJhbSBhZGRyZXNzIHRoZSBhZGRyZXNzLgorICogQHBhcmFtIGVudHJ5X3Jlc3VsdCByZXR1cm4gbG9jYXRpb24gdG8gYW4gYXJyYXkgb2YgZW50cmllcy4KKyAqIEBwYXJhbSBhcnJheV9sZW4gcmV0dXJuIGxvY2F0aW9uIGZvciBhcnJheSBsZW5ndGguCisgKiBAcGFyYW0gZXJyb3IgYWRkcmVzcyB3aGVyZSBhbiBlcnJvciBjYW4gYmUgcmV0dXJuZWQuCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzLCAjRkFMU0Ugb3RoZXJ3aXNlLgorICovCitkYnVzX2Jvb2xfdAorZGJ1c19wYXJzZV9hZGRyZXNzIChjb25zdCBjaGFyICAgICAgICAgKmFkZHJlc3MsCisJCSAgICBEQnVzQWRkcmVzc0VudHJ5ICoqKmVudHJ5X3Jlc3VsdCwKKwkJICAgIGludCAgICAgICAgICAgICAgICAqYXJyYXlfbGVuLAorICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAgKmVycm9yKQoreworICBEQnVzU3RyaW5nIHN0cjsKKyAgaW50IHBvcywgZW5kX3BvcywgbGVuLCBpOworICBEQnVzTGlzdCAqZW50cmllcywgKmxpbms7CisgIERCdXNBZGRyZXNzRW50cnkgKiplbnRyeV9hcnJheTsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmc3RyLCBhZGRyZXNzKTsKKworICBlbnRyaWVzID0gTlVMTDsKKyAgcG9zID0gMDsKKyAgbGVuID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpOworCisgIGlmIChsZW4gPT0gMCkKKyAgeworICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9CQURfQUREUkVTUywKKyAgICAgICAgICAgICAgICAgICAgIkVtcHR5IGFkZHJlc3MgJyVzJyIsIGFkZHJlc3MpOworICAgIGdvdG8gZXJyb3I7CisgIH0KKyAgCisgIHdoaWxlIChwb3MgPCBsZW4pCisgICAgeworICAgICAgREJ1c0FkZHJlc3NFbnRyeSAqZW50cnk7CisKKyAgICAgIGludCBmb3VuZF9wb3M7CisKKyAgICAgIGVudHJ5ID0gY3JlYXRlX2VudHJ5ICgpOworICAgICAgaWYgKCFlbnRyeSkKKwl7CisJICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKworCSAgZ290byBlcnJvcjsKKwl9CisgICAgICAKKyAgICAgIC8qIEFwcGVuZCB0aGUgZW50cnkgKi8KKyAgICAgIGlmICghX2RidXNfbGlzdF9hcHBlbmQgKCZlbnRyaWVzLCBlbnRyeSkpCisJeworCSAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisJICBkYnVzX2FkZHJlc3NfZW50cnlfZnJlZSAoZW50cnkpOworCSAgZ290byBlcnJvcjsKKwl9CisgICAgICAKKyAgICAgIC8qIExvb2sgZm9yIGEgc2VtaS1jb2xvbiAqLworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfZmluZCAoJnN0ciwgcG9zLCAiOyIsICZlbmRfcG9zKSkKKwllbmRfcG9zID0gbGVuOworICAgICAgCisgICAgICAvKiBMb29rIGZvciB0aGUgY29sb24gOiAqLworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfZmluZF90byAoJnN0ciwgcG9zLCBlbmRfcG9zLCAiOiIsICZmb3VuZF9wb3MpKQorCXsKKwkgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9CQURfQUREUkVTUywgIkFkZHJlc3MgZG9lcyBub3QgY29udGFpbiBhIGNvbG9uIik7CisJICBnb3RvIGVycm9yOworCX0KKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfY29weV9sZW4gKCZzdHIsIHBvcywgZm91bmRfcG9zIC0gcG9zLCAmZW50cnktPm1ldGhvZCwgMCkpCisJeworCSAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisJICBnb3RvIGVycm9yOworCX0KKwkgIAorICAgICAgcG9zID0gZm91bmRfcG9zICsgMTsKKworICAgICAgd2hpbGUgKHBvcyA8IGVuZF9wb3MpCisJeworCSAgaW50IGNvbW1hX3BvcywgZXF1YWxzX3BvczsKKworCSAgaWYgKCFfZGJ1c19zdHJpbmdfZmluZF90byAoJnN0ciwgcG9zLCBlbmRfcG9zLCAiLCIsICZjb21tYV9wb3MpKQorCSAgICBjb21tYV9wb3MgPSBlbmRfcG9zOworCSAgCisJICBpZiAoIV9kYnVzX3N0cmluZ19maW5kX3RvICgmc3RyLCBwb3MsIGNvbW1hX3BvcywgIj0iLCAmZXF1YWxzX3BvcykgfHwKKwkgICAgICBlcXVhbHNfcG9zID09IHBvcyB8fCBlcXVhbHNfcG9zICsgMSA9PSBjb21tYV9wb3MpCisJICAgIHsKKwkgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfQkFEX0FERFJFU1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJz0nIGNoYXJhY3RlciBub3QgZm91bmQgb3IgaGFzIG5vIHZhbHVlIGZvbGxvd2luZyBpdCIpOworICAgICAgICAgICAgICBnb3RvIGVycm9yOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBEQnVzU3RyaW5nICprZXk7CisJICAgICAgREJ1c1N0cmluZyAqdmFsdWU7CisKKwkgICAgICBrZXkgPSBkYnVzX25ldzAgKERCdXNTdHJpbmcsIDEpOworCisJICAgICAgaWYgKCFrZXkpCisJCXsKKwkJICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsJCSAgCisJCSAgZ290byBlcnJvcjsKKwkJfQorCisJICAgICAgdmFsdWUgPSBkYnVzX25ldzAgKERCdXNTdHJpbmcsIDEpOworCSAgICAgIGlmICghdmFsdWUpCisJCXsKKwkJICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKwkJICBkYnVzX2ZyZWUgKGtleSk7CisJCSAgZ290byBlcnJvcjsKKwkJfQorCSAgICAgIAorCSAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKGtleSkpCisJCXsKKwkJICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKwkJICBkYnVzX2ZyZWUgKGtleSk7CisJCSAgZGJ1c19mcmVlICh2YWx1ZSk7CisJCSAgCisJCSAgZ290byBlcnJvcjsKKwkJfQorCSAgICAgIAorCSAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKHZhbHVlKSkKKwkJeworCQkgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworCQkgIF9kYnVzX3N0cmluZ19mcmVlIChrZXkpOworCisJCSAgZGJ1c19mcmVlIChrZXkpOworCQkgIGRidXNfZnJlZSAodmFsdWUpOwkJICAKKwkJICBnb3RvIGVycm9yOworCQl9CisKKwkgICAgICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5X2xlbiAoJnN0ciwgcG9zLCBlcXVhbHNfcG9zIC0gcG9zLCBrZXksIDApKQorCQl7CisJCSAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisJCSAgX2RidXNfc3RyaW5nX2ZyZWUgKGtleSk7CisJCSAgX2RidXNfc3RyaW5nX2ZyZWUgKHZhbHVlKTsKKworCQkgIGRidXNfZnJlZSAoa2V5KTsKKwkJICBkYnVzX2ZyZWUgKHZhbHVlKTsJCSAgCisJCSAgZ290byBlcnJvcjsKKwkJfQorCisJICAgICAgaWYgKCFhcHBlbmRfdW5lc2NhcGVkX3ZhbHVlICh2YWx1ZSwgJnN0ciwgZXF1YWxzX3BvcyArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFfcG9zIC0gZXF1YWxzX3BvcyAtIDEsIGVycm9yKSkKKwkJeworICAgICAgICAgICAgICAgICAgX2RidXNfYXNzZXJ0IChlcnJvciA9PSBOVUxMIHx8IGRidXNfZXJyb3JfaXNfc2V0IChlcnJvcikpOworCQkgIF9kYnVzX3N0cmluZ19mcmVlIChrZXkpOworCQkgIF9kYnVzX3N0cmluZ19mcmVlICh2YWx1ZSk7CisKKwkJICBkYnVzX2ZyZWUgKGtleSk7CisJCSAgZGJ1c19mcmVlICh2YWx1ZSk7CQkgIAorCQkgIGdvdG8gZXJyb3I7CisJCX0KKworCSAgICAgIGlmICghX2RidXNfbGlzdF9hcHBlbmQgKCZlbnRyeS0+a2V5cywga2V5KSkKKwkJeworCQkgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOwkJICAKKwkJICBfZGJ1c19zdHJpbmdfZnJlZSAoa2V5KTsKKwkJICBfZGJ1c19zdHJpbmdfZnJlZSAodmFsdWUpOworCisJCSAgZGJ1c19mcmVlIChrZXkpOworCQkgIGRidXNfZnJlZSAodmFsdWUpOwkJICAKKwkJICBnb3RvIGVycm9yOworCQl9CisKKwkgICAgICBpZiAoIV9kYnVzX2xpc3RfYXBwZW5kICgmZW50cnktPnZhbHVlcywgdmFsdWUpKQorCQl7CisJCSAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CQkgIAorCQkgIF9kYnVzX3N0cmluZ19mcmVlICh2YWx1ZSk7CisKKwkJICBkYnVzX2ZyZWUgKHZhbHVlKTsKKwkJICBnb3RvIGVycm9yOwkJICAKKwkJfQorCSAgICB9CisKKwkgIHBvcyA9IGNvbW1hX3BvcyArIDE7CisJfQorCisgICAgICBwb3MgPSBlbmRfcG9zICsgMTsKKyAgICB9CisKKyAgKmFycmF5X2xlbiA9IF9kYnVzX2xpc3RfZ2V0X2xlbmd0aCAoJmVudHJpZXMpOworICAKKyAgZW50cnlfYXJyYXkgPSBkYnVzX25ldyAoREJ1c0FkZHJlc3NFbnRyeSAqLCAqYXJyYXlfbGVuICsgMSk7CisKKyAgaWYgKCFlbnRyeV9hcnJheSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgIAorICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgIAorICBlbnRyeV9hcnJheSBbKmFycmF5X2xlbl0gPSBOVUxMOworCisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmZW50cmllcyk7CisgIGkgPSAwOworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIGVudHJ5X2FycmF5W2ldID0gbGluay0+ZGF0YTsKKyAgICAgIGkrKzsKKyAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZlbnRyaWVzLCBsaW5rKTsKKyAgICB9CisKKyAgX2RidXNfbGlzdF9jbGVhciAoJmVudHJpZXMpOworICAqZW50cnlfcmVzdWx0ID0gZW50cnlfYXJyYXk7CisKKyAgcmV0dXJuIFRSVUU7CisKKyBlcnJvcjoKKyAgCisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmZW50cmllcyk7CisgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgeworICAgICAgZGJ1c19hZGRyZXNzX2VudHJ5X2ZyZWUgKGxpbmstPmRhdGEpOworICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJmVudHJpZXMsIGxpbmspOworICAgIH0KKworICBfZGJ1c19saXN0X2NsZWFyICgmZW50cmllcyk7CisgIAorICByZXR1cm4gRkFMU0U7CisgIAorfQorCisvKioKKyAqIEVzY2FwZXMgdGhlIGdpdmVuIHN0cmluZyBhcyBhIHZhbHVlIGluIGEga2V5PXZhbHVlIHBhaXIKKyAqIGZvciBhIEQtQnVzIGFkZHJlc3MuCisgKgorICogQHBhcmFtIHZhbHVlIHRoZSB1bmVzY2FwZWQgdmFsdWUKKyAqIEByZXR1cm5zIG5ld2x5LWFsbG9jYXRlZCBlc2NhcGVkIHZhbHVlIG9yICNOVUxMIGlmIG5vIG1lbW9yeQorICovCitjaGFyKgorZGJ1c19hZGRyZXNzX2VzY2FwZV92YWx1ZSAoY29uc3QgY2hhciAqdmFsdWUpCit7CisgIERCdXNTdHJpbmcgZXNjYXBlZDsKKyAgREJ1c1N0cmluZyB1bmVzY2FwZWQ7CisgIGNoYXIgKnJldDsKKworICByZXQgPSBOVUxMOworCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmdW5lc2NhcGVkLCB2YWx1ZSk7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZXNjYXBlZCkpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaWYgKCFfZGJ1c19hZGRyZXNzX2FwcGVuZF9lc2NhcGVkICgmZXNjYXBlZCwgJnVuZXNjYXBlZCkpCisgICAgZ290byBvdXQ7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19zdGVhbF9kYXRhICgmZXNjYXBlZCwgJnJldCkpCisgICAgZ290byBvdXQ7CisKKyBvdXQ6CisgIF9kYnVzX3N0cmluZ19mcmVlICgmZXNjYXBlZCk7CisgIHJldHVybiByZXQ7Cit9CisKKy8qKgorICogVW5lc2NhcGVzIHRoZSBnaXZlbiBzdHJpbmcgYXMgYSB2YWx1ZSBpbiBhIGtleT12YWx1ZSBwYWlyCisgKiBmb3IgYSBELUJ1cyBhZGRyZXNzLiBOb3RlIHRoYXQgZGJ1c19hZGRyZXNzX2VudHJ5X2dldF92YWx1ZSgpCisgKiByZXR1cm5zIGFuIGFscmVhZHktdW5lc2NhcGVkIHZhbHVlLgorICoKKyAqIEBwYXJhbSB2YWx1ZSB0aGUgZXNjYXBlZCB2YWx1ZQorICogQHBhcmFtIGVycm9yIGVycm9yIHRvIHNldCBpZiB0aGUgdW5lc2NhcGluZyBmYWlscworICogQHJldHVybnMgbmV3bHktYWxsb2NhdGVkIHVuZXNjYXBlZCB2YWx1ZSBvciAjTlVMTCBpZiBubyBtZW1vcnkKKyAqLworY2hhcioKK2RidXNfYWRkcmVzc191bmVzY2FwZV92YWx1ZSAoY29uc3QgY2hhciAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgKmVycm9yKQoreworICBEQnVzU3RyaW5nIHVuZXNjYXBlZDsKKyAgREJ1c1N0cmluZyBlc2NhcGVkOworICBjaGFyICpyZXQ7CisgIAorICByZXQgPSBOVUxMOworCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmZXNjYXBlZCwgdmFsdWUpOworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnVuZXNjYXBlZCkpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaWYgKCFhcHBlbmRfdW5lc2NhcGVkX3ZhbHVlICgmdW5lc2NhcGVkLCAmZXNjYXBlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmVzY2FwZWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkKKyAgICBnb3RvIG91dDsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX3N0ZWFsX2RhdGEgKCZ1bmVzY2FwZWQsICZyZXQpKQorICAgIGdvdG8gb3V0OworCisgb3V0OgorICBpZiAocmV0ID09IE5VTEwgJiYgZXJyb3IgJiYgIWRidXNfZXJyb3JfaXNfc2V0IChlcnJvcikpCisgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworCisgIF9kYnVzX2Fzc2VydCAocmV0ICE9IE5VTEwgfHwgZXJyb3IgPT0gTlVMTCB8fCBkYnVzX2Vycm9yX2lzX3NldCAoZXJyb3IpKTsKKyAgCisgIF9kYnVzX3N0cmluZ19mcmVlICgmdW5lc2NhcGVkKTsKKyAgcmV0dXJuIHJldDsKK30KKworLyoqIEB9ICovIC8qIEVuZCBvZiBwdWJsaWMgQVBJICovCisKKyNpZmRlZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworCisjaWZuZGVmIERPWFlHRU5fU0hPVUxEX1NLSVBfVEhJUworCisjaW5jbHVkZSAiZGJ1cy10ZXN0LmgiCisjaW5jbHVkZSA8c3RkbGliLmg+CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGNvbnN0IGNoYXIgKmVzY2FwZWQ7CisgIGNvbnN0IGNoYXIgKnVuZXNjYXBlZDsKK30gRXNjYXBlVGVzdDsKKworc3RhdGljIGNvbnN0IEVzY2FwZVRlc3QgZXNjYXBlX3Rlc3RzW10gPSB7CisgIHsgImFiY2RlIiwgImFiY2RlIiB9LAorICB7ICIiLCAiIiB9LAorICB7ICIlMjAlMjAiLCAiICAiIH0sCisgIHsgIiUyNCIsICIkIiB9LAorICB7ICIlMjUiLCAiJSIgfSwKKyAgeyAiYWJjJTI0IiwgImFiYyQiIH0sCisgIHsgIiUyNGFiYyIsICIkYWJjIiB9LAorICB7ICJhYmMlMjRhYmMiLCAiYWJjJGFiYyIgfSwKKyAgeyAiLyIsICIvIiB9LAorICB7ICItIiwgIi0iIH0sCisgIHsgIl8iLCAiXyIgfSwKKyAgeyAiQSIsICJBIiB9LAorICB7ICJJIiwgIkkiIH0sCisgIHsgIloiLCAiWiIgfSwKKyAgeyAiYSIsICJhIiB9LAorICB7ICJpIiwgImkiIH0sCisgIHsgInoiLCAieiIgfSwKKyAgLyogQnVnOiBodHRwczovL2J1Z3MuZnJlZWRlc2t0b3Aub3JnL3Nob3dfYnVnLmNnaT9pZD01MzQ5OSAqLworICB7ICIlYzMlYjYiLCAiXHhjM1x4YjYiIH0KK307CisKK3N0YXRpYyBjb25zdCBjaGFyKiBpbnZhbGlkX2VzY2FwZWRfdmFsdWVzW10gPSB7CisgICIlYSIsCisgICIlcSIsCisgICIlYXoiLAorICAiJSUiLAorICAiJSQkIiwKKyAgImFiYyVhIiwKKyAgIiVheHl6IiwKKyAgIiUiLAorICAiJCIsCisgICIgIiwKK307CisKK2RidXNfYm9vbF90CitfZGJ1c19hZGRyZXNzX3Rlc3QgKHZvaWQpCit7CisgIERCdXNBZGRyZXNzRW50cnkgKiplbnRyaWVzOworICBpbnQgbGVuOworICBEQnVzRXJyb3IgZXJyb3IgPSBEQlVTX0VSUk9SX0lOSVQ7CisgIGludCBpOworCisgIGkgPSAwOworICB3aGlsZSAoaSA8IF9EQlVTX05fRUxFTUVOVFMgKGVzY2FwZV90ZXN0cykpCisgICAgeworICAgICAgY29uc3QgRXNjYXBlVGVzdCAqdGVzdCA9ICZlc2NhcGVfdGVzdHNbaV07CisgICAgICBjaGFyICplc2NhcGVkOworICAgICAgY2hhciAqdW5lc2NhcGVkOworCisgICAgICBlc2NhcGVkID0gZGJ1c19hZGRyZXNzX2VzY2FwZV92YWx1ZSAodGVzdC0+dW5lc2NhcGVkKTsKKyAgICAgIGlmIChlc2NhcGVkID09IE5VTEwpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm9vbSIpOworCisgICAgICBpZiAoc3RyY21wIChlc2NhcGVkLCB0ZXN0LT5lc2NhcGVkKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoIkVzY2FwZWQgJyVzJyBhcyAnJXMnIHNob3VsZCBoYXZlIGJlZW4gJyVzJyIsCisgICAgICAgICAgICAgICAgICAgICAgdGVzdC0+dW5lc2NhcGVkLCBlc2NhcGVkLCB0ZXN0LT5lc2NhcGVkKTsKKyAgICAgICAgICBleGl0ICgxKTsKKyAgICAgICAgfQorICAgICAgZGJ1c19mcmVlIChlc2NhcGVkKTsKKworICAgICAgdW5lc2NhcGVkID0gZGJ1c19hZGRyZXNzX3VuZXNjYXBlX3ZhbHVlICh0ZXN0LT5lc2NhcGVkLCAmZXJyb3IpOworICAgICAgaWYgKHVuZXNjYXBlZCA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoIkZhaWxlZCB0byB1bmVzY2FwZSAnJXMnOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgdGVzdC0+ZXNjYXBlZCwgZXJyb3IubWVzc2FnZSk7CisgICAgICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgICAgIGV4aXQgKDEpOworICAgICAgICB9CisKKyAgICAgIGlmIChzdHJjbXAgKHVuZXNjYXBlZCwgdGVzdC0+dW5lc2NhcGVkKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoIlVuZXNjYXBlZCAnJXMnIGFzICclcycgc2hvdWxkIGhhdmUgYmVlbiAnJXMnIiwKKyAgICAgICAgICAgICAgICAgICAgICB0ZXN0LT5lc2NhcGVkLCB1bmVzY2FwZWQsIHRlc3QtPnVuZXNjYXBlZCk7CisgICAgICAgICAgZXhpdCAoMSk7CisgICAgICAgIH0KKyAgICAgIGRidXNfZnJlZSAodW5lc2NhcGVkKTsKKyAgICAgIAorICAgICAgKytpOworICAgIH0KKworICBpID0gMDsKKyAgd2hpbGUgKGkgPCBfREJVU19OX0VMRU1FTlRTIChpbnZhbGlkX2VzY2FwZWRfdmFsdWVzKSkKKyAgICB7CisgICAgICBjaGFyICp1bmVzY2FwZWQ7CisKKyAgICAgIHVuZXNjYXBlZCA9IGRidXNfYWRkcmVzc191bmVzY2FwZV92YWx1ZSAoaW52YWxpZF9lc2NhcGVkX3ZhbHVlc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKTsKKyAgICAgIGlmICh1bmVzY2FwZWQgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJTaG91bGQgbm90IGhhdmUgc3VjY2Vzc2Z1bGx5IHVuZXNjYXBlZCAnJXMnIHRvICclcyciLAorICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRfZXNjYXBlZF92YWx1ZXNbaV0sIHVuZXNjYXBlZCk7CisgICAgICAgICAgZGJ1c19mcmVlICh1bmVzY2FwZWQpOworICAgICAgICAgIGV4aXQgKDEpOworICAgICAgICB9CisKKyAgICAgIF9kYnVzX2Fzc2VydCAoZGJ1c19lcnJvcl9pc19zZXQgKCZlcnJvcikpOworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworCisgICAgICArK2k7CisgICAgfQorICAKKyAgaWYgKCFkYnVzX3BhcnNlX2FkZHJlc3MgKCJ1bml4OnBhdGg9L3RtcC9mb287ZGVidWc6bmFtZT10ZXN0LHNsaWZmPXNsb2ZmOyIsCisJCQkgICAmZW50cmllcywgJmxlbiwgJmVycm9yKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZCBub3QgcGFyc2UgYWRkcmVzcyIpOworICBfZGJ1c19hc3NlcnQgKGxlbiA9PSAyKTsKKyAgX2RidXNfYXNzZXJ0IChzdHJjbXAgKGRidXNfYWRkcmVzc19lbnRyeV9nZXRfdmFsdWUgKGVudHJpZXNbMF0sICJwYXRoIiksICIvdG1wL2ZvbyIpID09IDApOworICBfZGJ1c19hc3NlcnQgKHN0cmNtcCAoZGJ1c19hZGRyZXNzX2VudHJ5X2dldF92YWx1ZSAoZW50cmllc1sxXSwgIm5hbWUiKSwgInRlc3QiKSA9PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChzdHJjbXAgKGRidXNfYWRkcmVzc19lbnRyeV9nZXRfdmFsdWUgKGVudHJpZXNbMV0sICJzbGlmZiIpLCAic2xvZmYiKSA9PSAwKTsKKyAgCisgIGRidXNfYWRkcmVzc19lbnRyaWVzX2ZyZWUgKGVudHJpZXMpOworCisgIC8qIERpZmZlcmVudCBwb3NzaWJsZSBlcnJvcnMgKi8KKyAgaWYgKGRidXNfcGFyc2VfYWRkcmVzcyAoIiIsICZlbnRyaWVzLCAmbGVuLCAmZXJyb3IpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIlBhcnNlZCBpbmNvcnJlY3QgYWRkcmVzcy4iKTsKKyAgZWxzZQorICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKworICBpZiAoZGJ1c19wYXJzZV9hZGRyZXNzICgiZm9vIiwgJmVudHJpZXMsICZsZW4sICZlcnJvcikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiUGFyc2VkIGluY29ycmVjdCBhZGRyZXNzLiIpOworICBlbHNlCisgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAKKyAgaWYgKGRidXNfcGFyc2VfYWRkcmVzcyAoImZvbzpiYXIiLCAmZW50cmllcywgJmxlbiwgJmVycm9yKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJQYXJzZWQgaW5jb3JyZWN0IGFkZHJlc3MuIik7CisgIGVsc2UKKyAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgIAorICBpZiAoZGJ1c19wYXJzZV9hZGRyZXNzICgiZm9vOmJhcixiYXoiLCAmZW50cmllcywgJmxlbiwgJmVycm9yKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJQYXJzZWQgaW5jb3JyZWN0IGFkZHJlc3MuIik7CisgIGVsc2UKKyAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgIAorICBpZiAoZGJ1c19wYXJzZV9hZGRyZXNzICgiZm9vOmJhcj1mb28sYmF6IiwgJmVudHJpZXMsICZsZW4sICZlcnJvcikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiUGFyc2VkIGluY29ycmVjdCBhZGRyZXNzLiIpOworICBlbHNlCisgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAKKyAgaWYgKGRidXNfcGFyc2VfYWRkcmVzcyAoImZvbzpiYXI9Zm9vO2JheiIsICZlbnRyaWVzLCAmbGVuLCAmZXJyb3IpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIlBhcnNlZCBpbmNvcnJlY3QgYWRkcmVzcy4iKTsKKyAgZWxzZQorICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgCisgIGlmIChkYnVzX3BhcnNlX2FkZHJlc3MgKCJmb286PWZvbyIsICZlbnRyaWVzLCAmbGVuLCAmZXJyb3IpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIlBhcnNlZCBpbmNvcnJlY3QgYWRkcmVzcy4iKTsKKyAgZWxzZQorICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgCisgIGlmIChkYnVzX3BhcnNlX2FkZHJlc3MgKCJmb286Zm9vPSIsICZlbnRyaWVzLCAmbGVuLCAmZXJyb3IpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIlBhcnNlZCBpbmNvcnJlY3QgYWRkcmVzcy4iKTsKKyAgZWxzZQorICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKworICBpZiAoZGJ1c19wYXJzZV9hZGRyZXNzICgiZm9vOmZvbyxiYXI9YmF6IiwgJmVudHJpZXMsICZsZW4sICZlcnJvcikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiUGFyc2VkIGluY29ycmVjdCBhZGRyZXNzLiIpOworICBlbHNlCisgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworCisgIHJldHVybiBUUlVFOworfQorCisjZW5kaWYgLyogIURPWFlHRU5fU0hPVUxEX1NLSVBfVEhJUyAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1hZGRyZXNzLmggYi9kYnVzL2RidXMtYWRkcmVzcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlZmIzMjAKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtYWRkcmVzcy5oCkBAIC0wLDAgKzEsODYgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1hZGRyZXNzLmggIFNlcnZlciBhZGRyZXNzIHBhcnNlci4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgIENvZGVGYWN0b3J5IEFCCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaWYgIWRlZmluZWQgKERCVVNfSU5TSURFX0RCVVNfSCkgJiYgIWRlZmluZWQgKERCVVNfQ09NUElMQVRJT04pCisjZXJyb3IgIk9ubHkgPGRidXMvZGJ1cy5oPiBjYW4gYmUgaW5jbHVkZWQgZGlyZWN0bHksIHRoaXMgZmlsZSBtYXkgZGlzYXBwZWFyIG9yIGNoYW5nZSBjb250ZW50cy4iCisjZW5kaWYKKworI2lmbmRlZiBEQlVTX0FERFJFU1NfSAorI2RlZmluZSBEQlVTX0FERFJFU1NfSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXR5cGVzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWVycm9ycy5oPgorCitEQlVTX0JFR0lOX0RFQ0xTCisKKy8qKgorICogQGFkZHRvZ3JvdXAgREJ1c0FkZHJlc3MKKyAqIEB7CisgKi8KKworLyoqIE9wYXF1ZSB0eXBlIHJlcHJlc2VudGluZyBvbmUgb2YgdGhlIHNlbWljb2xvbi1zZXBhcmF0ZWQgaXRlbXMgaW4gYW4gYWRkcmVzcyAqLwordHlwZWRlZiBzdHJ1Y3QgREJ1c0FkZHJlc3NFbnRyeSBEQnVzQWRkcmVzc0VudHJ5OworCitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgZGJ1c19wYXJzZV9hZGRyZXNzICAgICAgICAgICAgKGNvbnN0IGNoYXIgICAgICAgICAqYWRkcmVzcywKKwkJCQkJICAgREJ1c0FkZHJlc3NFbnRyeSAqKiplbnRyeV9yZXN1bHQsCisJCQkJCSAgIGludCAgICAgICAgICAgICAgICAqYXJyYXlfbGVuLAorCQkJCQkgICBEQnVzRXJyb3IgICAgICAgICAgKmVycm9yKTsKK0RCVVNfRVhQT1JUCitjb25zdCBjaGFyICpkYnVzX2FkZHJlc3NfZW50cnlfZ2V0X3ZhbHVlICAoREJ1c0FkZHJlc3NFbnRyeSAgICplbnRyeSwKKwkJCQkJICAgY29uc3QgY2hhciAgICAgICAgICprZXkpOworREJVU19FWFBPUlQKK2NvbnN0IGNoYXIgKmRidXNfYWRkcmVzc19lbnRyeV9nZXRfbWV0aG9kIChEQnVzQWRkcmVzc0VudHJ5ICAgKmVudHJ5KTsKK0RCVVNfRVhQT1JUCit2b2lkICAgICAgICBkYnVzX2FkZHJlc3NfZW50cmllc19mcmVlICAgICAoREJ1c0FkZHJlc3NFbnRyeSAgKiplbnRyaWVzKTsKKworREJVU19FWFBPUlQKK2NoYXIqIGRidXNfYWRkcmVzc19lc2NhcGVfdmFsdWUgICAoY29uc3QgY2hhciAqdmFsdWUpOworREJVU19FWFBPUlQKK2NoYXIqIGRidXNfYWRkcmVzc191bmVzY2FwZV92YWx1ZSAoY29uc3QgY2hhciAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgKmVycm9yKTsKKworLyoqCisgKiBDbGVhciBhIHZhcmlhYmxlIG9yIHN0cnVjdCBtZW1iZXIgdGhhdCBjb250YWlucyBhbiBhcnJheSBvZiAjREJ1c0FkZHJlc3NFbnRyeS4KKyAqIElmIGl0IGRvZXMgbm90IGNvbnRhaW4gI05VTEwsIHRoZSBlbnRyaWVzIHRoYXQgd2VyZSBwcmV2aW91c2x5CisgKiB0aGVyZSBhcmUgZnJlZWQgd2l0aCBkYnVzX2FkZHJlc3NfZW50cmllc19mcmVlKCkuCisgKgorICogVGhpcyBpcyBzaW1pbGFyIHRvIGRidXNfY2xlYXJfY29ubmVjdGlvbigpOiBzZWUgdGhhdCBmdW5jdGlvbgorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBAcGFyYW0gcG9pbnRlcl90b19lbnRyaWVzIEEgcG9pbnRlciB0byBhIHZhcmlhYmxlIG9yIHN0cnVjdCBtZW1iZXIuCisgKiBwb2ludGVyX3RvX2VudHJpZXMgbXVzdCBub3QgYmUgI05VTEwsIGJ1dCAqcG9pbnRlcl90b19lbnRyaWVzCisgKiBtYXkgYmUgI05VTEwuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorZGJ1c19jbGVhcl9hZGRyZXNzX2VudHJpZXMgKERCdXNBZGRyZXNzRW50cnkgKioqcG9pbnRlcl90b19lbnRyaWVzKQoreworICBfZGJ1c19jbGVhcl9wb2ludGVyX2ltcGwgKERCdXNBZGRyZXNzRW50cnkgKiwgcG9pbnRlcl90b19lbnRyaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYWRkcmVzc19lbnRyaWVzX2ZyZWUpOworfQorCisvKiogQH0gKi8KKworREJVU19FTkRfREVDTFMKKworI2VuZGlmIC8qIERCVVNfQUREUkVTU19IICovCisKZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1hcmNoLWRlcHMuaCBiL2RidXMvZGJ1cy1hcmNoLWRlcHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZThjNGU3Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLWFyY2gtZGVwcy5oCkBAIC0wLDAgKzEsNjEgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiIC0qLSAqLworLyogZGJ1cy1hcmNoLWRlcHMuaCBIZWFkZXIgd2l0aCBhcmNoaXRlY3R1cmUvY29tcGlsZXIgc3BlY2lmaWMgaW5mb3JtYXRpb24sIGluc3RhbGxlZCB0byBsaWJkaXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjAKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworI2lmICFkZWZpbmVkIChEQlVTX0lOU0lERV9EQlVTX0gpICYmICFkZWZpbmVkIChEQlVTX0NPTVBJTEFUSU9OKQorI2Vycm9yICJPbmx5IDxkYnVzL2RidXMuaD4gY2FuIGJlIGluY2x1ZGVkIGRpcmVjdGx5LCB0aGlzIGZpbGUgbWF5IGRpc2FwcGVhciBvciBjaGFuZ2UgY29udGVudHMuIgorI2VuZGlmCisKKyNpZm5kZWYgREJVU19BUkNIX0RFUFNfSAorI2RlZmluZSBEQlVTX0FSQ0hfREVQU19ICisKKyNpbmNsdWRlIDxkYnVzL2RidXMtbWFjcm9zLmg+CisKK0RCVVNfQkVHSU5fREVDTFMKKworLyogRC1CdXMgbm8gbG9uZ2VyIHN1cHBvcnRzIHBsYXRmb3JtcyB3aXRoIG5vIDY0LWJpdCBpbnRlZ2VyIHR5cGUuICovCisjZGVmaW5lIERCVVNfSEFWRV9JTlQ2NCAxCitfREJVU19HTlVDX0VYVEVOU0lPTiB0eXBlZGVmIGxvbmcgbG9uZyBkYnVzX2ludDY0X3Q7CitfREJVU19HTlVDX0VYVEVOU0lPTiB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBkYnVzX3VpbnQ2NF90OworCisjZGVmaW5lIERCVVNfSU5UNjRfQ09OU1RBTlQodmFsKSAgKF9EQlVTX0dOVUNfRVhURU5TSU9OICh2YWwjI0wpKQorI2RlZmluZSBEQlVTX1VJTlQ2NF9DT05TVEFOVCh2YWwpIChfREJVU19HTlVDX0VYVEVOU0lPTiAodmFsIyNVTCkpCisKK3R5cGVkZWYgaW50IGRidXNfaW50MzJfdDsKK3R5cGVkZWYgdW5zaWduZWQgaW50IGRidXNfdWludDMyX3Q7CisKK3R5cGVkZWYgc2hvcnQgZGJ1c19pbnQxNl90OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBkYnVzX3VpbnQxNl90OworCisvKiBUaGlzIGlzIG5vdCByZWFsbHkgYXJjaC1kZXBlbmRlbnQsIGJ1dCBpdCdzIG5vdCB3b3J0aAorICogY3JlYXRpbmcgYW4gYWRkaXRpb25hbCBnZW5lcmF0ZWQgaGVhZGVyIGp1c3QgZm9yIHRoaXMKKyAqLworI2RlZmluZSBEQlVTX01BSk9SX1ZFUlNJT04gMQorI2RlZmluZSBEQlVTX01JTk9SX1ZFUlNJT04gMTIKKyNkZWZpbmUgREJVU19NSUNST19WRVJTSU9OIDIwCisKKyNkZWZpbmUgREJVU19WRVJTSU9OX1NUUklORyAiMS4xMi4yMCIKKworI2RlZmluZSBEQlVTX1ZFUlNJT04gKCgxIDw8IDE2KSB8ICgxMiA8PCA4KSB8ICgyMCkpCisKK0RCVVNfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBEQlVTX0FSQ0hfREVQU19IICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtYXJjaC1kZXBzLmguaW4gYi9kYnVzL2RidXMtYXJjaC1kZXBzLmguaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZjMzU4OQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1hcmNoLWRlcHMuaC5pbgpAQCAtMCwwICsxLDYxIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IiAtKi0gKi8KKy8qIGRidXMtYXJjaC1kZXBzLmggSGVhZGVyIHdpdGggYXJjaGl0ZWN0dXJlL2NvbXBpbGVyIHNwZWNpZmljIGluZm9ybWF0aW9uLCBpbnN0YWxsZWQgdG8gbGliZGlyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzIFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4wCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKyNpZiAhZGVmaW5lZCAoREJVU19JTlNJREVfREJVU19IKSAmJiAhZGVmaW5lZCAoREJVU19DT01QSUxBVElPTikKKyNlcnJvciAiT25seSA8ZGJ1cy9kYnVzLmg+IGNhbiBiZSBpbmNsdWRlZCBkaXJlY3RseSwgdGhpcyBmaWxlIG1heSBkaXNhcHBlYXIgb3IgY2hhbmdlIGNvbnRlbnRzLiIKKyNlbmRpZgorCisjaWZuZGVmIERCVVNfQVJDSF9ERVBTX0gKKyNkZWZpbmUgREJVU19BUkNIX0RFUFNfSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLW1hY3Jvcy5oPgorCitEQlVTX0JFR0lOX0RFQ0xTCisKKy8qIEQtQnVzIG5vIGxvbmdlciBzdXBwb3J0cyBwbGF0Zm9ybXMgd2l0aCBubyA2NC1iaXQgaW50ZWdlciB0eXBlLiAqLworI2RlZmluZSBEQlVTX0hBVkVfSU5UNjQgMQorX0RCVVNfR05VQ19FWFRFTlNJT04gdHlwZWRlZiBAREJVU19JTlQ2NF9UWVBFQCBkYnVzX2ludDY0X3Q7CitfREJVU19HTlVDX0VYVEVOU0lPTiB0eXBlZGVmIHVuc2lnbmVkIEBEQlVTX0lOVDY0X1RZUEVAIGRidXNfdWludDY0X3Q7CisKKyNkZWZpbmUgREJVU19JTlQ2NF9DT05TVEFOVCh2YWwpICAoX0RCVVNfR05VQ19FWFRFTlNJT04gQERCVVNfSU5UNjRfQ09OU1RBTlRAKQorI2RlZmluZSBEQlVTX1VJTlQ2NF9DT05TVEFOVCh2YWwpIChfREJVU19HTlVDX0VYVEVOU0lPTiBAREJVU19VSU5UNjRfQ09OU1RBTlRAKQorCit0eXBlZGVmIEBEQlVTX0lOVDMyX1RZUEVAIGRidXNfaW50MzJfdDsKK3R5cGVkZWYgdW5zaWduZWQgQERCVVNfSU5UMzJfVFlQRUAgZGJ1c191aW50MzJfdDsKKwordHlwZWRlZiBAREJVU19JTlQxNl9UWVBFQCBkYnVzX2ludDE2X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIEBEQlVTX0lOVDE2X1RZUEVAIGRidXNfdWludDE2X3Q7CisKKy8qIFRoaXMgaXMgbm90IHJlYWxseSBhcmNoLWRlcGVuZGVudCwgYnV0IGl0J3Mgbm90IHdvcnRoCisgKiBjcmVhdGluZyBhbiBhZGRpdGlvbmFsIGdlbmVyYXRlZCBoZWFkZXIganVzdCBmb3IgdGhpcworICovCisjZGVmaW5lIERCVVNfTUFKT1JfVkVSU0lPTiBAREJVU19NQUpPUl9WRVJTSU9OQAorI2RlZmluZSBEQlVTX01JTk9SX1ZFUlNJT04gQERCVVNfTUlOT1JfVkVSU0lPTkAKKyNkZWZpbmUgREJVU19NSUNST19WRVJTSU9OIEBEQlVTX01JQ1JPX1ZFUlNJT05ACisKKyNkZWZpbmUgREJVU19WRVJTSU9OX1NUUklORyAiQERCVVNfVkVSU0lPTkAiCisKKyNkZWZpbmUgREJVU19WRVJTSU9OICgoQERCVVNfTUFKT1JfVkVSU0lPTkAgPDwgMTYpIHwgKEBEQlVTX01JTk9SX1ZFUlNJT05AIDw8IDgpIHwgKEBEQlVTX01JQ1JPX1ZFUlNJT05AKSkgCisKK0RCVVNfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBEQlVTX0FSQ0hfREVQU19IICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtYXN2LXV0aWwuYyBiL2RidXMvZGJ1cy1hc3YtdXRpbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiYjJlNTEKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtYXN2LXV0aWwuYwpAQCAtMCwwICsxLDMxNCBAQAorLyogZGJ1cy1hc3YtdXRpbC5jIC0gdXRpbGl0eSBmdW5jdGlvbnMgZm9yIGF7c3Z9CisgKgorICogQ29weXJpZ2h0IMKpIDIwMTEtMjAxMiBOb2tpYSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IMKpIDIwMTItMjAxMyBDb2xsYWJvcmEgTHRkLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKworI2luY2x1ZGUgPGRidXMvZGJ1cy5oPgorCisjaW5jbHVkZSAiZGJ1cy9kYnVzLWFzdi11dGlsLmgiCisKKy8qKgorICogQ29udmVuaWVuY2UgZnVuY3Rpb24gdG8gY3JlYXRlIGEgbWV0aG9kLWNhbGwgcmVwbHkgd2hvc2UgdHlwZSBpcyBhe3N2fQorICogKG1hcCBmcm9tIHN0cmluZyB0byB2YXJpYW50KS4KKyAqCisgKiBBcHBlbmQgdmFsdWVzIHdpdGggMCBvciBtb3JlIHNlcXVlbmNlcyBvZiBfZGJ1c19hc3Zfb3Blbl9lbnRyeSgpLAorICogYXBwZW5kaW5nIGEgdmFsdWUgdG8gdmFyX2l0ZXIsIGFuZCBfZGJ1c19hc3ZfY2xvc2VfZW50cnkoKSwKKyAqIHRoZW4gY2xvc2UgdGhlIGF7c3Z9IHdpdGggX2RidXNfYXN2X2Nsb3NlKCkgb3IgX2RidXNfYXN2X2FiYW5kb24oKS4KKyAqCisgKiBUaGlzIG11c3QgYmUgcGFpcmVkIHdpdGggYSBjYWxsIHRvIF9kYnVzX2Fzdl9jbG9zZSgpIG9yIF9kYnVzX2Fzdl9hYmFuZG9uKCkuCisgKgorICogQHBhcmFtIG1lc3NhZ2UgYSBtZXRob2QgY2FsbCBtZXNzYWdlCisgKiBAcGFyYW0gaXRlciBhbiBpdGVyYXRvciB3aGljaCB3aWxsIGJlIGluaXRpYWxpemVkIHRvIGFwcGVuZCB0byB0aGUgbWVzc2FnZQorICogQHBhcmFtIGFycl9pdGVyIGFuIGl0ZXJhdG9yIHdoaWNoIHdpbGwgYmUgaW5pdGlhbGl6ZWQgdG8gYXBwZW5kIHRvIHRoZSBhcnJheQorICogQHJldHVybnMgYSBuZXcgbWVzc2FnZSwgb3IgI05VTEwgaWYgbm90IGVub3VnaCBtZW1vcnkKKyAqLworREJ1c01lc3NhZ2UgKgorX2RidXNfYXN2X25ld19tZXRob2RfcmV0dXJuIChEQnVzTWVzc2FnZSAgICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZUl0ZXIgICppdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZUl0ZXIgICphcnJfaXRlcikKK3sKKyAgREJ1c01lc3NhZ2UgKnJlcGx5ID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfcmV0dXJuIChtZXNzYWdlKTsKKworICBpZiAocmVwbHkgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBkYnVzX21lc3NhZ2VfaXRlcl9pbml0X2FwcGVuZCAocmVwbHksIGl0ZXIpOworCisgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfb3Blbl9jb250YWluZXIgKGl0ZXIsIERCVVNfVFlQRV9BUlJBWSwgIntzdn0iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJfaXRlcikpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgcmV0dXJuIHJlcGx5OworfQorCisvKgorICogT3BlbiBhIG5ldyBlbnRyeSBpbiBhbiBhe3N2fSAobWFwIGZyb20gc3RyaW5nIHRvIHZhcmlhbnQpLgorICoKKyAqIFRoaXMgbXVzdCBiZSBwYWlyZWQgd2l0aCBhIGNhbGwgdG8gZWl0aGVyIF9kYnVzX2Fzdl9jbG9zZV9lbnRyeSgpCisgKiBvciBfZGJ1c19hc3ZfYWJhbmRvbl9lbnRyeSgpLgorICoKKyAqIElmIHRoaXMgZnVuY3Rpb24gZmFpbHMsIHRoZSBhe3N2fSBtdXN0IGJlIGFiYW5kb25lZCwgZm9yIGluc3RhbmNlCisgKiB3aXRoIF9kYnVzX2Fzdl9hYmFuZG9uKCkuCisgKgorICogQHBhcmFtIGFycl9pdGVyIHRoZSBpdGVyYXRvciB3aGljaCBpcyBhcHBlbmRpbmcgdG8gdGhlIGFycmF5CisgKiBAcGFyYW0gZW50cnlfaXRlciB3aWxsIGJlIGluaXRpYWxpemVkIHRvIGFwcGVuZCB0byB0aGUgZGljdC1lbnRyeQorICogQHBhcmFtIGtleSBhIFVURi04IGtleSBmb3IgdGhlIG1hcAorICogQHBhcmFtIHR5cGUgdGhlIHR5cGUgb2YgdGhlIHZhcmlhbnQgdmFsdWUsIGUuZy4gREJVU19UWVBFX1NUUklOR19BU19TVFJJTkcKKyAqIEBwYXJhbSB2YXJfaXRlciB3aWxsIGJlIGluaXRpYWxpemVkIHRvIGFwcGVuZCAoaS5lLiB3cml0ZSkgdG8gdGhlIHZhcmlhbnQKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MsIG9yICNGQUxTRSBpZiBub3QgZW5vdWdoIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfYXN2X29wZW5fZW50cnkgKERCdXNNZXNzYWdlSXRlciAqYXJyX2l0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2VJdGVyICplbnRyeV9pdGVyLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAqdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZUl0ZXIgKnZhcl9pdGVyKQoreworICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX29wZW5fY29udGFpbmVyIChhcnJfaXRlciwgREJVU19UWVBFX0RJQ1RfRU5UUlksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIGVudHJ5X2l0ZXIpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYyAoZW50cnlfaXRlciwgREJVU19UWVBFX1NUUklORywgJmtleSkpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfYWJhbmRvbl9jb250YWluZXIgKGFycl9pdGVyLCBlbnRyeV9pdGVyKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9vcGVuX2NvbnRhaW5lciAoZW50cnlfaXRlciwgREJVU19UWVBFX1ZBUklBTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsIHZhcl9pdGVyKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9hYmFuZG9uX2NvbnRhaW5lciAoYXJyX2l0ZXIsIGVudHJ5X2l0ZXIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAqIENsb3NlcyBhbiBhe3N2fSBlbnRyeSBhZnRlciBzdWNjZXNzZnVsbHkgYXBwZW5kaW5nIHRoZSB2YWx1ZS4KKyAqCisgKiBJZiB0aGlzIGZ1bmN0aW9uIGZhaWxzLCB0aGUgYXtzdn0gbXVzdCBiZSBhYmFuZG9uZWQsIGZvciBpbnN0YW5jZQorICogd2l0aCBfZGJ1c19hc3ZfYWJhbmRvbigpLgorICoKKyAqIEBwYXJhbSBhcnJfaXRlciB0aGUgaXRlcmF0b3Igd2hpY2ggaXMgYXBwZW5kaW5nIHRvIHRoZSBhcnJheQorICogQHBhcmFtIGVudHJ5X2l0ZXIgdGhlIGl0ZXJhdG9yIGFwcGVuZGluZyB0byB0aGUgZGljdC1lbnRyeSwgd2lsbCBiZSBjbG9zZWQKKyAqIEBwYXJhbSB2YXJfaXRlciB0aGUgaXRlcmF0b3IgYXBwZW5kaW5nIHRvIHRoZSB2YXJpYW50LCB3aWxsIGJlIGNsb3NlZAorICogQHJldHVybnMgI1RSVUUgb24gc3VjY2Vzcywgb3IgI0ZBTFNFIGlmIG5vdCBlbm91Z2ggbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19hc3ZfY2xvc2VfZW50cnkgKERCdXNNZXNzYWdlSXRlciAqYXJyX2l0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlSXRlciAqZW50cnlfaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2VJdGVyICp2YXJfaXRlcikKK3sKKyAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9jbG9zZV9jb250YWluZXIgKGVudHJ5X2l0ZXIsIHZhcl9pdGVyKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9hYmFuZG9uX2NvbnRhaW5lciAoYXJyX2l0ZXIsIGVudHJ5X2l0ZXIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX2Nsb3NlX2NvbnRhaW5lciAoYXJyX2l0ZXIsIGVudHJ5X2l0ZXIpKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBDbG9zZXMgYW4gYXtzdn0gYWZ0ZXIgc3VjY2Vzc2Z1bGx5IGFwcGVuZGluZyBhbGwgdmFsdWVzLgorICoKKyAqIElmIHRoaXMgZnVuY3Rpb24gZmFpbHMsIHlvdSBtdXN0IGFiYW5kb24gaXRlciBhbmQgd2hhdGV2ZXIKKyAqIGxhcmdlciBkYXRhIHN0cnVjdHVyZSAobWVzc2FnZSwgZXRjLikgdGhlIGF7c3Z9IHdhcyBlbWJlZGRlZCBpbi4KKyAqCisgKiBAcGFyYW0gaXRlciB0aGUgaXRlcmF0b3Igd2hpY2ggaXMgYXBwZW5kaW5nIHRvIHRoZSBtZXNzYWdlIG9yIG90aGVyIGRhdGEgc3RydWN0dXJlIGNvbnRhaW5pbmcgdGhlIGF7c3Z9CisgKiBAcGFyYW0gYXJyX2l0ZXIgdGhlIGl0ZXJhdG9yIGFwcGVuZGluZyB0byB0aGUgYXJyYXksIHdpbGwgYmUgY2xvc2VkCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzLCBvciAjRkFMU0UgaWYgbm90IGVub3VnaCBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2Fzdl9jbG9zZSAoREJ1c01lc3NhZ2VJdGVyICppdGVyLAorICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZUl0ZXIgKmFycl9pdGVyKQoreworICByZXR1cm4gZGJ1c19tZXNzYWdlX2l0ZXJfY2xvc2VfY29udGFpbmVyIChpdGVyLCBhcnJfaXRlcik7Cit9CisKKy8qCisgKiBDbG9zZXMgYW4gYXtzdn0gZW50cnkgYWZ0ZXIgdW5zdWNjZXNzZnVsbHkgYXBwZW5kaW5nIGEgdmFsdWUuCisgKiBZb3UgbXVzdCBhbHNvIGFiYW5kb24gdGhlIGF7c3Z9IGl0c2VsZiAoZm9yIGluc3RhbmNlIHdpdGgKKyAqIF9kYnVzX2Fzdl9hYmFuZG9uKCkpLCBhbmQgYWJhbmRvbiB3aGF0ZXZlciBsYXJnZXIgZGF0YSBzdHJ1Y3R1cmUKKyAqIHRoZSBhe3N2fSB3YXMgZW1iZWRkZWQgaW4uCisgKgorICogQHBhcmFtIGl0ZXIgdGhlIGl0ZXJhdG9yIHdoaWNoIGlzIGFwcGVuZGluZyB0byB0aGUgbWVzc2FnZSBvciBvdGhlciBkYXRhIHN0cnVjdHVyZSBjb250YWluaW5nIHRoZSBhe3N2fQorICogQHBhcmFtIGFycl9pdGVyIHRoZSBpdGVyYXRvciBhcHBlbmRpbmcgdG8gdGhlIGFycmF5LCB3aWxsIGJlIGNsb3NlZAorICogQHJldHVybnMgI1RSVUUgb24gc3VjY2Vzcywgb3IgI0ZBTFNFIGlmIG5vdCBlbm91Z2ggbWVtb3J5CisgKi8KK3ZvaWQKK19kYnVzX2Fzdl9hYmFuZG9uX2VudHJ5IChEQnVzTWVzc2FnZUl0ZXIgKmFycl9pdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlSXRlciAqZW50cnlfaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZUl0ZXIgKnZhcl9pdGVyKQoreworICBkYnVzX21lc3NhZ2VfaXRlcl9hYmFuZG9uX2NvbnRhaW5lciAoZW50cnlfaXRlciwgdmFyX2l0ZXIpOworICBkYnVzX21lc3NhZ2VfaXRlcl9hYmFuZG9uX2NvbnRhaW5lciAoYXJyX2l0ZXIsIGVudHJ5X2l0ZXIpOworfQorCisvKioKKyAqIENsb3NlcyBhbiBhe3N2fSBhZnRlciB1bnN1Y2Nlc3NmdWxseSBhcHBlbmRpbmcgYSB2YWx1ZS4KKyAqCisgKiBZb3UgbXVzdCBhbHNvIGFiYW5kb24gd2hhdGV2ZXIgbGFyZ2VyIGRhdGEgc3RydWN0dXJlIChtZXNzYWdlLCBldGMuKQorICogdGhlIGF7c3Z9IHdhcyBlbWJlZGRlZCBpbi4KKyAqCisgKiBAcGFyYW0gaXRlciB0aGUgaXRlcmF0b3Igd2hpY2ggaXMgYXBwZW5kaW5nIHRvIHRoZSBtZXNzYWdlIG9yIG90aGVyIGRhdGEgc3RydWN0dXJlIGNvbnRhaW5pbmcgdGhlIGF7c3Z9CisgKiBAcGFyYW0gYXJyX2l0ZXIgdGhlIGl0ZXJhdG9yIGFwcGVuZGluZyB0byB0aGUgYXJyYXksIHdpbGwgYmUgY2xvc2VkCisgKi8KK3ZvaWQKK19kYnVzX2Fzdl9hYmFuZG9uIChEQnVzTWVzc2FnZUl0ZXIgKml0ZXIsCisgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2VJdGVyICphcnJfaXRlcikKK3sKKyAgZGJ1c19tZXNzYWdlX2l0ZXJfYWJhbmRvbl9jb250YWluZXIgKGl0ZXIsIGFycl9pdGVyKTsKK30KKworLyoqCisgKiBDcmVhdGUgYSBuZXcgZW50cnkgaW4gYW4gYXtzdn0gKG1hcCBmcm9tIHN0cmluZyB0byB2YXJpYW50KQorICogd2l0aCBhIDMyLWJpdCB1bnNpZ25lZCBpbnRlZ2VyIHZhbHVlLgorICoKKyAqIElmIHRoaXMgZnVuY3Rpb24gZmFpbHMsIHRoZSBhe3N2fSBtdXN0IGJlIGFiYW5kb25lZCwgZm9yIGluc3RhbmNlCisgKiB3aXRoIF9kYnVzX2Fzdl9hYmFuZG9uKCkuCisgKgorICogQHBhcmFtIGFycl9pdGVyIHRoZSBpdGVyYXRvciB3aGljaCBpcyBhcHBlbmRpbmcgdG8gdGhlIGFycmF5CisgKiBAcGFyYW0ga2V5IGEgVVRGLTgga2V5IGZvciB0aGUgbWFwCisgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzLCBvciAjRkFMU0UgaWYgbm90IGVub3VnaCBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2Fzdl9hZGRfdWludDMyIChEQnVzTWVzc2FnZUl0ZXIgKmFycl9pdGVyLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmtleSwKKyAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90IHZhbHVlKQoreworICBEQnVzTWVzc2FnZUl0ZXIgZW50cnlfaXRlciwgdmFyX2l0ZXI7CisKKyAgaWYgKCFfZGJ1c19hc3Zfb3Blbl9lbnRyeSAoYXJyX2l0ZXIsICZlbnRyeV9pdGVyLCBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9VSU5UMzJfQVNfU1RSSU5HLCAmdmFyX2l0ZXIpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYyAoJnZhcl9pdGVyLCBEQlVTX1RZUEVfVUlOVDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKSkKKyAgICB7CisgICAgICBfZGJ1c19hc3ZfYWJhbmRvbl9lbnRyeSAoYXJyX2l0ZXIsICZlbnRyeV9pdGVyLCAmdmFyX2l0ZXIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIV9kYnVzX2Fzdl9jbG9zZV9lbnRyeSAoYXJyX2l0ZXIsICZlbnRyeV9pdGVyLCAmdmFyX2l0ZXIpKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBDcmVhdGUgYSBuZXcgZW50cnkgaW4gYW4gYXtzdn0gKG1hcCBmcm9tIHN0cmluZyB0byB2YXJpYW50KQorICogd2l0aCBhIFVURi04IHN0cmluZyB2YWx1ZS4KKyAqCisgKiBJZiB0aGlzIGZ1bmN0aW9uIGZhaWxzLCB0aGUgYXtzdn0gbXVzdCBiZSBhYmFuZG9uZWQsIGZvciBpbnN0YW5jZQorICogd2l0aCBfZGJ1c19hc3ZfYWJhbmRvbigpLgorICoKKyAqIEBwYXJhbSBhcnJfaXRlciB0aGUgaXRlcmF0b3Igd2hpY2ggaXMgYXBwZW5kaW5nIHRvIHRoZSBhcnJheQorICogQHBhcmFtIGtleSBhIFVURi04IGtleSBmb3IgdGhlIG1hcAorICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZQorICogQHJldHVybnMgI1RSVUUgb24gc3VjY2Vzcywgb3IgI0ZBTFNFIGlmIG5vdCBlbm91Z2ggbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19hc3ZfYWRkX3N0cmluZyAoREJ1c01lc3NhZ2VJdGVyICphcnJfaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICprZXksCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdmFsdWUpCit7CisgIERCdXNNZXNzYWdlSXRlciBlbnRyeV9pdGVyLCB2YXJfaXRlcjsKKworICBpZiAoIV9kYnVzX2Fzdl9vcGVuX2VudHJ5IChhcnJfaXRlciwgJmVudHJ5X2l0ZXIsIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklOR19BU19TVFJJTkcsICZ2YXJfaXRlcikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljICgmdmFyX2l0ZXIsIERCVVNfVFlQRV9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpKQorICAgIHsKKyAgICAgIF9kYnVzX2Fzdl9hYmFuZG9uX2VudHJ5IChhcnJfaXRlciwgJmVudHJ5X2l0ZXIsICZ2YXJfaXRlcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghX2RidXNfYXN2X2Nsb3NlX2VudHJ5IChhcnJfaXRlciwgJmVudHJ5X2l0ZXIsICZ2YXJfaXRlcikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIENyZWF0ZSBhIG5ldyBlbnRyeSBpbiBhbiBhe3N2fSAobWFwIGZyb20gc3RyaW5nIHRvIHZhcmlhbnQpCisgKiB3aXRoIGEgYnl0ZSBhcnJheSB2YWx1ZS4KKyAqCisgKiBJZiB0aGlzIGZ1bmN0aW9uIGZhaWxzLCB0aGUgYXtzdn0gbXVzdCBiZSBhYmFuZG9uZWQsIGZvciBpbnN0YW5jZQorICogd2l0aCBfZGJ1c19hc3ZfYWJhbmRvbigpLgorICoKKyAqIEBwYXJhbSBhcnJfaXRlciB0aGUgaXRlcmF0b3Igd2hpY2ggaXMgYXBwZW5kaW5nIHRvIHRoZSBhcnJheQorICogQHBhcmFtIGtleSBhIFVURi04IGtleSBmb3IgdGhlIG1hcAorICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZQorICogQHBhcmFtIG5fZWxlbWVudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyB0byBhcHBlbmQKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MsIG9yICNGQUxTRSBpZiBub3QgZW5vdWdoIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfYXN2X2FkZF9ieXRlX2FycmF5IChEQnVzTWVzc2FnZUl0ZXIgKmFycl9pdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgKmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAgICAgICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICBuX2VsZW1lbnRzKQoreworICBEQnVzTWVzc2FnZUl0ZXIgZW50cnlfaXRlcjsKKyAgREJ1c01lc3NhZ2VJdGVyIHZhcl9pdGVyOworICBEQnVzTWVzc2FnZUl0ZXIgYnl0ZV9hcnJheV9pdGVyOworCisgIGlmICghX2RidXNfYXN2X29wZW5fZW50cnkgKGFycl9pdGVyLCAmZW50cnlfaXRlciwga2V5LCAiYXkiLCAmdmFyX2l0ZXIpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX29wZW5fY29udGFpbmVyICgmdmFyX2l0ZXIsIERCVVNfVFlQRV9BUlJBWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0JZVEVfQVNfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnl0ZV9hcnJheV9pdGVyKSkKKyAgICB7CisgICAgICBfZGJ1c19hc3ZfYWJhbmRvbl9lbnRyeSAoYXJyX2l0ZXIsICZlbnRyeV9pdGVyLCAmdmFyX2l0ZXIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9maXhlZF9hcnJheSAoJmJ5dGVfYXJyYXlfaXRlciwgREJVU19UWVBFX0JZVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUsIG5fZWxlbWVudHMpKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV9pdGVyX2FiYW5kb25fY29udGFpbmVyICgmdmFyX2l0ZXIsICZieXRlX2FycmF5X2l0ZXIpOworICAgICAgX2RidXNfYXN2X2FiYW5kb25fZW50cnkgKGFycl9pdGVyLCAmZW50cnlfaXRlciwgJnZhcl9pdGVyKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9jbG9zZV9jb250YWluZXIgKCZ2YXJfaXRlciwgJmJ5dGVfYXJyYXlfaXRlcikpCisgICAgeworICAgICAgX2RidXNfYXN2X2FiYW5kb25fZW50cnkgKGFycl9pdGVyLCAmZW50cnlfaXRlciwgJnZhcl9pdGVyKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19hc3ZfY2xvc2VfZW50cnkgKGFycl9pdGVyLCAmZW50cnlfaXRlciwgJnZhcl9pdGVyKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dXJuIFRSVUU7Cit9CmRpZmYgLS1naXQgYS9kYnVzL2RidXMtYXN2LXV0aWwuaCBiL2RidXMvZGJ1cy1hc3YtdXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MzkwMDgKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtYXN2LXV0aWwuaApAQCAtMCwwICsxLDYxIEBACisvKiBkYnVzLWFzdi11dGlsLmggLSB1dGlsaXR5IGZ1bmN0aW9ucyBmb3IgYXtzdn0KKyAqCisgKiBDb3B5cmlnaHQgwqkgMjAxMS0yMDEyIE5va2lhIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgwqkgMjAxMi0yMDEzIENvbGxhYm9yYSBMdGQuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBEQlVTX0FTVl9VVElMX0gKKyNkZWZpbmUgREJVU19BU1ZfVVRJTF9ICisKKyNpbmNsdWRlIDxkYnVzL2RidXMtaW50ZXJuYWxzLmg+CisKK0RCVVNfQkVHSU5fREVDTFMKKworREJ1c01lc3NhZ2UgKl9kYnVzX2Fzdl9uZXdfbWV0aG9kX3JldHVybiAoREJ1c01lc3NhZ2UgICAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlSXRlciAgKml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZUl0ZXIgICphcnJfaXRlcik7CitkYnVzX2Jvb2xfdCAgX2RidXNfYXN2X2Nsb3NlICAgICAgICAgICAgIChEQnVzTWVzc2FnZUl0ZXIgKml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZUl0ZXIgKmFycl9pdGVyKTsKK3ZvaWQgICAgICAgICBfZGJ1c19hc3ZfYWJhbmRvbiAgICAgICAgICAgKERCdXNNZXNzYWdlSXRlciAqaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlSXRlciAqYXJyX2l0ZXIpOworCitkYnVzX2Jvb2xfdCAgX2RidXNfYXN2X2FkZF91aW50MzIgICAgICAgIChEQnVzTWVzc2FnZUl0ZXIgKmFycl9pdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICprZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90ICAgIHZhbHVlKTsKK2RidXNfYm9vbF90ICBfZGJ1c19hc3ZfYWRkX3N0cmluZyAgICAgICAgKERCdXNNZXNzYWdlSXRlciAqYXJyX2l0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgKmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAqdmFsdWUpOworZGJ1c19ib29sX3QgIF9kYnVzX2Fzdl9hZGRfYnl0ZV9hcnJheSAgICAoREJ1c01lc3NhZ2VJdGVyICphcnJfaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAgICAgICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgbl9lbGVtZW50cyk7CitkYnVzX2Jvb2xfdCAgX2RidXNfYXN2X29wZW5fZW50cnkgICAgICAgIChEQnVzTWVzc2FnZUl0ZXIgKmFycl9pdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2VJdGVyICplbnRyeV9pdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICprZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgKnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZUl0ZXIgKnZhcl9pdGVyKTsKK2RidXNfYm9vbF90ICBfZGJ1c19hc3ZfY2xvc2VfZW50cnkgICAgICAgKERCdXNNZXNzYWdlSXRlciAqYXJyX2l0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZUl0ZXIgKmVudHJ5X2l0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZUl0ZXIgKnZhcl9pdGVyKTsKK3ZvaWQgICAgICAgICBfZGJ1c19hc3ZfYWJhbmRvbl9lbnRyeSAgICAgKERCdXNNZXNzYWdlSXRlciAqYXJyX2l0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZUl0ZXIgKmVudHJ5X2l0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZUl0ZXIgKnZhcl9pdGVyKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtYXV0aC1zY3JpcHQuYyBiL2RidXMvZGJ1cy1hdXRoLXNjcmlwdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3NTAwNGIKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtYXV0aC1zY3JpcHQuYwpAQCAtMCwwICsxLDg5NiBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLWF1dGgtc2NyaXB0LmMgVGVzdCBEQnVzQXV0aCB1c2luZyBhIHNwZWNpYWwgc2NyaXB0IGZpbGUgKGludGVybmFsIHRvIEQtQnVzIGltcGxlbWVudGF0aW9uKQorICogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworI2luY2x1ZGUgPGNvbmZpZy5oPgorCisjaWZkZWYgREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMKKworI2luY2x1ZGUgImRidXMtYXV0aC1zY3JpcHQuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJkYnVzLWF1dGguaCIKKyNpbmNsdWRlICJkYnVzLXN0cmluZy5oIgorI2luY2x1ZGUgImRidXMtaGFzaC5oIgorI2luY2x1ZGUgImRidXMtY3JlZGVudGlhbHMuaCIKKyNpbmNsdWRlICJkYnVzLWludGVybmFscy5oIgorCisjaW5jbHVkZSAidGVzdC90ZXN0LXV0aWxzLmgiCisKKy8qKgorICogQGRlZmdyb3VwIERCdXNBdXRoU2NyaXB0IGNvZGUgZm9yIHJ1bm5pbmcgdW5pdCB0ZXN0IHNjcmlwdHMgZm9yIERCdXNBdXRoCisgKiBAaW5ncm91cCAgREJ1c0ludGVybmFscworICogQGJyaWVmIERCdXNBdXRoIHVuaXQgdGVzdCBzY3JpcHRpbmcKKyAqCisgKiBUaGUgY29kZSBpbiBoZXJlIGlzIHVzZWQgZm9yIHVuaXQgdGVzdGluZywgaXQgbG9hZHMKKyAqIHVwIGEgc2NyaXB0IHRoYXQgdGVzdHMgREJ1c0F1dGguCisgKgorICogQHsKKyAqLworCisvKiB0aGlzIGlzIHNsaWdodGx5IGRpZmZlcmVudCBmcm9tIHRoZSBvdGhlciBhcHBlbmRfcXVvdGVkX3N0cmluZworICogaW4gZGJ1cy1tZXNzYWdlLWJ1aWxkZXIuYworICovCitzdGF0aWMgZGJ1c19ib29sX3QKK2FwcGVuZF9xdW90ZWRfc3RyaW5nIChEQnVzU3RyaW5nICAgICAgICpkZXN0LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKnF1b3RlZCkKK3sKKyAgZGJ1c19ib29sX3QgaW5fcXVvdGVzID0gRkFMU0U7CisgIGRidXNfYm9vbF90IGluX2JhY2tzbGFzaCA9IEZBTFNFOworICBpbnQgaTsKKworICBpID0gMDsKKyAgd2hpbGUgKGkgPCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAocXVvdGVkKSkKKyAgICB7CisgICAgICB1bnNpZ25lZCBjaGFyIGI7CisKKyAgICAgIGIgPSBfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKHF1b3RlZCwgaSk7CisKKyAgICAgIGlmIChpbl9iYWNrc2xhc2gpCisgICAgICAgIHsKKyAgICAgICAgICB1bnNpZ25lZCBjaGFyIGE7CisgICAgICAgICAgCisgICAgICAgICAgaWYgKGIgPT0gJ3InKQorICAgICAgICAgICAgYSA9ICdccic7CisgICAgICAgICAgZWxzZSBpZiAoYiA9PSAnbicpCisgICAgICAgICAgICBhID0gJ1xuJzsKKyAgICAgICAgICBlbHNlIGlmIChiID09ICdcXCcpCisgICAgICAgICAgICBhID0gJ1xcJzsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJiYWQgYmFja3NsYXNoZWQgYnl0ZSAlYyIsIGIpOworICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfYnl0ZSAoZGVzdCwgYSkpCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgCisgICAgICAgICAgaW5fYmFja3NsYXNoID0gRkFMU0U7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKGIgPT0gJ1xcJykKKyAgICAgICAgeworICAgICAgICAgIGluX2JhY2tzbGFzaCA9IFRSVUU7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKGluX3F1b3RlcykKKyAgICAgICAgeworICAgICAgICAgIGlmIChiID09ICdcJycpCisgICAgICAgICAgICBpbl9xdW90ZXMgPSBGQUxTRTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlIChkZXN0LCBiKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGlmIChiID09ICdcJycpCisgICAgICAgICAgICBpbl9xdW90ZXMgPSBUUlVFOworICAgICAgICAgIGVsc2UgaWYgKGIgPT0gJyAnIHx8IGIgPT0gJ1xuJyB8fCBiID09ICdcdCcpCisgICAgICAgICAgICBicmVhazsgLyogZW5kIG9uIHdoaXRlc3BhY2UgaWYgbm90IHF1b3RlZCAqLworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX2J5dGUgKGRlc3QsIGIpKQorICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgCisgICAgICArK2k7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3NhbWVfZmlyc3Rfd29yZCAoY29uc3QgREJ1c1N0cmluZyAqYSwKKyAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqYikKK3sKKyAgaW50IGZpcnN0X2FfYmxhbmssIGZpcnN0X2JfYmxhbms7CisKKyAgX2RidXNfc3RyaW5nX2ZpbmRfYmxhbmsgKGEsIDAsICZmaXJzdF9hX2JsYW5rKTsKKyAgX2RidXNfc3RyaW5nX2ZpbmRfYmxhbmsgKGIsIDAsICZmaXJzdF9iX2JsYW5rKTsKKworICBpZiAoZmlyc3RfYV9ibGFuayAhPSBmaXJzdF9iX2JsYW5rKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gX2RidXNfc3RyaW5nX2VxdWFsX2xlbiAoYSwgYiwgZmlyc3RfYV9ibGFuayk7Cit9CisKK3N0YXRpYyBEQnVzQXV0aFN0YXRlCithdXRoX3N0YXRlX2Zyb21fc3RyaW5nIChjb25zdCBEQnVzU3RyaW5nICpzdHIpCit7IAorICBpZiAoX2RidXNfc3RyaW5nX3N0YXJ0c193aXRoX2Nfc3RyIChzdHIsICJXQUlUSU5HX0ZPUl9JTlBVVCIpKQorICAgIHJldHVybiBEQlVTX0FVVEhfU1RBVEVfV0FJVElOR19GT1JfSU5QVVQ7CisgIGVsc2UgaWYgKF9kYnVzX3N0cmluZ19zdGFydHNfd2l0aF9jX3N0ciAoc3RyLCAiV0FJVElOR19GT1JfTUVNT1JZIikpCisgICAgcmV0dXJuIERCVVNfQVVUSF9TVEFURV9XQUlUSU5HX0ZPUl9NRU1PUlk7CisgIGVsc2UgaWYgKF9kYnVzX3N0cmluZ19zdGFydHNfd2l0aF9jX3N0ciAoc3RyLCAiSEFWRV9CWVRFU19UT19TRU5EIikpCisgICAgcmV0dXJuIERCVVNfQVVUSF9TVEFURV9IQVZFX0JZVEVTX1RPX1NFTkQ7CisgIGVsc2UgaWYgKF9kYnVzX3N0cmluZ19zdGFydHNfd2l0aF9jX3N0ciAoc3RyLCAiTkVFRF9ESVNDT05ORUNUIikpCisgICAgcmV0dXJuIERCVVNfQVVUSF9TVEFURV9ORUVEX0RJU0NPTk5FQ1Q7CisgIGVsc2UgaWYgKF9kYnVzX3N0cmluZ19zdGFydHNfd2l0aF9jX3N0ciAoc3RyLCAiQVVUSEVOVElDQVRFRCIpKQorICAgIHJldHVybiBEQlVTX0FVVEhfU1RBVEVfQVVUSEVOVElDQVRFRDsKKyAgZWxzZQorICAgIHJldHVybiBEQlVTX0FVVEhfU1RBVEVfSU5WQUxJRDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIqCithdXRoX3N0YXRlX3RvX3N0cmluZyAoREJ1c0F1dGhTdGF0ZSBzdGF0ZSkKK3sKKyAgc3dpdGNoIChzdGF0ZSkKKyAgICB7CisgICAgY2FzZSBEQlVTX0FVVEhfU1RBVEVfV0FJVElOR19GT1JfSU5QVVQ6CisgICAgICByZXR1cm4gIldBSVRJTkdfRk9SX0lOUFVUIjsKKyAgICBjYXNlIERCVVNfQVVUSF9TVEFURV9XQUlUSU5HX0ZPUl9NRU1PUlk6CisgICAgICByZXR1cm4gIldBSVRJTkdfRk9SX01FTU9SWSI7CisgICAgY2FzZSBEQlVTX0FVVEhfU1RBVEVfSEFWRV9CWVRFU19UT19TRU5EOgorICAgICAgcmV0dXJuICJIQVZFX0JZVEVTX1RPX1NFTkQiOworICAgIGNhc2UgREJVU19BVVRIX1NUQVRFX05FRURfRElTQ09OTkVDVDoKKyAgICAgIHJldHVybiAiTkVFRF9ESVNDT05ORUNUIjsKKyAgICBjYXNlIERCVVNfQVVUSF9TVEFURV9BVVRIRU5USUNBVEVEOgorICAgICAgcmV0dXJuICJBVVRIRU5USUNBVEVEIjsKKyAgICBjYXNlIERCVVNfQVVUSF9TVEFURV9JTlZBTElEOgorICAgICAgcmV0dXJuICJJTlZBTElEIjsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgICAgfQorCisgIHJldHVybiAidW5rbm93biI7Cit9CisKK3N0YXRpYyBjaGFyICoqCitzcGxpdF9zdHJpbmcgKERCdXNTdHJpbmcgKnN0cikKK3sKKyAgaW50IGksIGosIGssIGNvdW50LCBlbmQ7CisgIGNoYXIgKiphcnJheTsKKworICBlbmQgPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoc3RyKTsKKworICBpID0gMDsKKyAgX2RidXNfc3RyaW5nX3NraXBfYmxhbmsgKHN0ciwgaSwgJmkpOworICBmb3IgKGNvdW50ID0gMDsgaSA8IGVuZDsgY291bnQrKykKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfZmluZF9ibGFuayAoc3RyLCBpLCAmaSk7CisgICAgICBfZGJ1c19zdHJpbmdfc2tpcF9ibGFuayAoc3RyLCBpLCAmaSk7CisgICAgfQorCisgIGFycmF5ID0gZGJ1c19uZXcwIChjaGFyICosIGNvdW50ICsgMSk7CisgIGlmIChhcnJheSA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIGkgPSAwOworICBfZGJ1c19zdHJpbmdfc2tpcF9ibGFuayAoc3RyLCBpLCAmaSk7CisgIGZvciAoayA9IDA7IGsgPCBjb3VudDsgaysrKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19maW5kX2JsYW5rIChzdHIsIGksICZqKTsKKworICAgICAgYXJyYXlba10gPSBkYnVzX21hbGxvYyAoaiAtIGkgKyAxKTsKKyAgICAgIGlmIChhcnJheVtrXSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19mcmVlX3N0cmluZ19hcnJheSAoYXJyYXkpOworICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICBtZW1jcHkgKGFycmF5W2tdLAorICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuIChzdHIsIGksIGogLSBpKSwgaiAtIGkpOworICAgICAgYXJyYXlba11baiAtIGldID0gJ1wwJzsKKworICAgICAgX2RidXNfc3RyaW5nX3NraXBfYmxhbmsgKHN0ciwgaiwgJmkpOworICAgIH0KKyAgYXJyYXlba10gPSBOVUxMOworCisgIHJldHVybiBhcnJheTsKK30KKworc3RhdGljIHZvaWQKK2F1dGhfc2V0X3VuaXhfY3JlZGVudGlhbHMoREJ1c0F1dGggICphdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpZF90IHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19waWRfdCBwaWQpCit7CisgIERCdXNDcmVkZW50aWFscyAqY3JlZGVudGlhbHM7CisKKyAgY3JlZGVudGlhbHMgPSBfZGJ1c19jcmVkZW50aWFsc19uZXcgKCk7CisgIGlmIChjcmVkZW50aWFscyA9PSBOVUxMKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOworCisgIGlmICh1aWQgIT0gREJVU19VSURfVU5TRVQpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19jcmVkZW50aWFsc19hZGRfdW5peF91aWQgKGNyZWRlbnRpYWxzLCB1aWQpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkiKTsKKyAgICB9CisgIGlmIChwaWQgIT0gREJVU19QSURfVU5TRVQpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19jcmVkZW50aWFsc19hZGRfcGlkIChjcmVkZW50aWFscywgcGlkKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5Iik7CisgICAgfQorICBfZGJ1c19hdXRoX3NldF9jcmVkZW50aWFscyAoYXV0aCwgY3JlZGVudGlhbHMpOworCisgIF9kYnVzX2NyZWRlbnRpYWxzX3VucmVmIChjcmVkZW50aWFscyk7Cit9CisKKy8qKgorICogUnVucyBhbiAiYXV0aCBzY3JpcHQiIHdoaWNoIGlzIGEgc2NyaXB0IGZvciB0ZXN0aW5nIHRoZQorICogYXV0aGVudGljYXRpb24gcHJvdG9jb2wuIFNjcmlwdHMgc2VuZCBhbmQgcmVjZWl2ZSBkYXRhLCBhbmQgdGhlbgorICogaW5jbHVkZSBhc3NlcnRpb25zIGFib3V0IHRoZSBzdGF0ZSBvZiBib3RoIGVuZHMgb2YgdGhlIGNvbm5lY3Rpb24KKyAqIGFmdGVyIHByb2Nlc3NpbmcgdGhlIGRhdGEuIEEgc2NyaXB0IHN1Y2NlZWRzIGlmIHRoZXNlIGFzc2VydGlvbnMKKyAqIGhvbGQuCisgKgorICogQHBhcmFtIGZpbGVuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIHNjcmlwdCB0byBydW4KKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSBzY3JpcHQgc3VjY2VlZHMsICNGQUxTRSBvdGhlcndpc2UKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2F1dGhfc2NyaXB0X3J1biAoY29uc3QgREJ1c1N0cmluZyAqZmlsZW5hbWUpCit7CisgIERCdXNTdHJpbmcgZmlsZTsKKyAgREJ1c0Vycm9yIGVycm9yID0gREJVU19FUlJPUl9JTklUOworICBEQnVzU3RyaW5nIGxpbmU7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgaW50IGxpbmVfbm87CisgIERCdXNBdXRoICphdXRoOworICBEQnVzU3RyaW5nIGZyb21fYXV0aDsKKyAgREJ1c0F1dGhTdGF0ZSBzdGF0ZTsKKyAgREJ1c1N0cmluZyBjb250ZXh0OworICBEQnVzU3RyaW5nIGd1aWQ7CisgIAorICByZXR2YWwgPSBGQUxTRTsKKyAgYXV0aCA9IE5VTEw7CisKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZndWlkLCAiNWZhMDFmNDIwMmNkODM3NzA5YTMyNzRjYTBkZjlkMDAiKTsKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZjb250ZXh0LCAib3JnX2ZyZWVkZXNrdG9wX3Rlc3QiKTsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZmaWxlKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmxpbmUpKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmZmlsZSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZmcm9tX2F1dGgpKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmZmlsZSk7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmxpbmUpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIV9kYnVzX2ZpbGVfZ2V0X2NvbnRlbnRzICgmZmlsZSwgZmlsZW5hbWUsICZlcnJvcikpICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJHZXR0aW5nIGNvbnRlbnRzIG9mICVzIGZhaWxlZDogJXMiLAorICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChmaWxlbmFtZSksIGVycm9yLm1lc3NhZ2UpOworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIHN0YXRlID0gREJVU19BVVRIX1NUQVRFX05FRURfRElTQ09OTkVDVDsKKyAgbGluZV9ubyA9IDA7CisKKyBuZXh0X2l0ZXJhdGlvbjoKKyAgd2hpbGUgKF9kYnVzX3N0cmluZ19wb3BfbGluZSAoJmZpbGUsICZsaW5lKSkKKyAgICB7ICAgICAgCisgICAgICBsaW5lX25vICs9IDE7CisKKyAgICAgIC8qIF9kYnVzX3dhcm4gKCIlcyIsIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmxpbmUpKTsgKi8KKyAgICAgIAorICAgICAgX2RidXNfc3RyaW5nX2RlbGV0ZV9sZWFkaW5nX2JsYW5rcyAoJmxpbmUpOworCisgICAgICBpZiAoYXV0aCAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgd2hpbGUgKChzdGF0ZSA9IF9kYnVzX2F1dGhfZG9fd29yayAoYXV0aCkpID09CisgICAgICAgICAgICAgICAgIERCVVNfQVVUSF9TVEFURV9IQVZFX0JZVEVTX1RPX1NFTkQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKnRtcDsKKyAgICAgICAgICAgICAgaWYgKF9kYnVzX2F1dGhfZ2V0X2J5dGVzX3RvX3NlbmQgKGF1dGgsICZ0bXApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGludCBjb3VudCA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICh0bXApOworCisgICAgICAgICAgICAgICAgICBpZiAoX2RidXNfc3RyaW5nX2NvcHkgKHRtcCwgMCwgJmZyb21fYXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZmcm9tX2F1dGgpKSkKKyAgICAgICAgICAgICAgICAgICAgX2RidXNfYXV0aF9ieXRlc19zZW50IChhdXRoLCBjb3VudCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAKKyAgICAgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmxpbmUpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAvKiBlbXB0eSBsaW5lICovCisgICAgICAgICAgZ290byBuZXh0X2l0ZXJhdGlvbjsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoX2RidXNfc3RyaW5nX3N0YXJ0c193aXRoX2Nfc3RyICgmbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiMiKSkKKyAgICAgICAgeworICAgICAgICAgIC8qIElnbm9yZSB0aGlzIGNvbW1lbnQgKi8KKyAgICAgICAgICBnb3RvIG5leHRfaXRlcmF0aW9uOworICAgICAgICB9CisjaWZkZWYgREJVU19XSU4KKyAgICAgIGVsc2UgaWYgKF9kYnVzX3N0cmluZ19zdGFydHNfd2l0aF9jX3N0ciAoJmxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXSU5fT05MWSIpKQorICAgICAgICB7CisgICAgICAgICAgLyogSWdub3JlIHRoaXMgbGluZSAqLworICAgICAgICAgIGdvdG8gbmV4dF9pdGVyYXRpb247CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKF9kYnVzX3N0cmluZ19zdGFydHNfd2l0aF9jX3N0ciAoJmxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVTklYX09OTFkiKSkKKyAgICAgICAgeworICAgICAgICAgIC8qIHNraXAgdGhpcyBmaWxlICovCisgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAic2tpcHBpbmcgdW5peCBvbmx5IGF1dGggc2NyaXB0XG4iKTsKKyAgICAgICAgICByZXR2YWwgPSBUUlVFOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisjZW5kaWYKKyNpZmRlZiBEQlVTX1VOSVgKKyAgICAgIGVsc2UgaWYgKF9kYnVzX3N0cmluZ19zdGFydHNfd2l0aF9jX3N0ciAoJmxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVTklYX09OTFkiKSkKKyAgICAgICAgeworICAgICAgICAgIC8qIElnbm9yZSB0aGlzIGxpbmUgKi8KKyAgICAgICAgICBnb3RvIG5leHRfaXRlcmF0aW9uOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChfZGJ1c19zdHJpbmdfc3RhcnRzX3dpdGhfY19zdHIgKCZsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV0lOX09OTFkiKSkKKyAgICAgICAgeworICAgICAgICAgIC8qIHNraXAgdGhpcyBmaWxlICovCisgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAic2tpcHBpbmcgd2luZG93cyBvbmx5IGF1dGggc2NyaXB0XG4iKTsKKyAgICAgICAgICByZXR2YWwgPSBUUlVFOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisjZW5kaWYKKyAgICAgIGVsc2UgaWYgKF9kYnVzX3N0cmluZ19zdGFydHNfd2l0aF9jX3N0ciAoJmxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDTElFTlQiKSkKKyAgICAgICAgeworICAgICAgICAgIERCdXNDcmVkZW50aWFscyAqY3JlZHM7CisgICAgICAgICAgCisgICAgICAgICAgaWYgKGF1dGggIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfd2FybiAoImFscmVhZHkgY3JlYXRlZCBhIERCdXNBdXRoIChDTElFTlQgb3IgU0VSVkVSIGdpdmVuIHR3aWNlKSIpOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGF1dGggPSBfZGJ1c19hdXRoX2NsaWVudF9uZXcgKCk7CisgICAgICAgICAgaWYgKGF1dGggPT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfd2FybiAoIm5vIG1lbW9yeSB0byBjcmVhdGUgREJ1c0F1dGgiKTsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAvKiB0ZXN0IHJlZi91bnJlZiAqLworICAgICAgICAgIF9kYnVzX2F1dGhfcmVmIChhdXRoKTsKKyAgICAgICAgICBfZGJ1c19hdXRoX3VucmVmIChhdXRoKTsKKworICAgICAgICAgIGNyZWRzID0gX2RidXNfY3JlZGVudGlhbHNfbmV3X2Zyb21fY3VycmVudF9wcm9jZXNzICgpOworICAgICAgICAgIGlmIChjcmVkcyA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c193YXJuICgibm8gbWVtb3J5IGZvciBjcmVkZW50aWFscyIpOworICAgICAgICAgICAgICBfZGJ1c19hdXRoX3VucmVmIChhdXRoKTsKKyAgICAgICAgICAgICAgYXV0aCA9IE5VTEw7CisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgICAKKyAgICAgICAgICBpZiAoIV9kYnVzX2F1dGhfc2V0X2NyZWRlbnRpYWxzIChhdXRoLCBjcmVkcykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJubyBtZW1vcnkgZm9yIHNldHRpbmcgY3JlZGVudGlhbHMiKTsKKyAgICAgICAgICAgICAgX2RidXNfYXV0aF91bnJlZiAoYXV0aCk7CisgICAgICAgICAgICAgIGF1dGggPSBOVUxMOworICAgICAgICAgICAgICBfZGJ1c19jcmVkZW50aWFsc191bnJlZiAoY3JlZHMpOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgICAgICBfZGJ1c19jcmVkZW50aWFsc191bnJlZiAoY3JlZHMpOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChfZGJ1c19zdHJpbmdfc3RhcnRzX3dpdGhfY19zdHIgKCZsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU0VSVkVSIikpCisgICAgICAgIHsKKyAgICAgICAgICBEQnVzQ3JlZGVudGlhbHMgKmNyZWRzOworICAgICAgICAgIAorICAgICAgICAgIGlmIChhdXRoICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJhbHJlYWR5IGNyZWF0ZWQgYSBEQnVzQXV0aCAoQ0xJRU5UIG9yIFNFUlZFUiBnaXZlbiB0d2ljZSkiKTsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBhdXRoID0gX2RidXNfYXV0aF9zZXJ2ZXJfbmV3ICgmZ3VpZCk7CisgICAgICAgICAgaWYgKGF1dGggPT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfd2FybiAoIm5vIG1lbW9yeSB0byBjcmVhdGUgREJ1c0F1dGgiKTsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAvKiB0ZXN0IHJlZi91bnJlZiAqLworICAgICAgICAgIF9kYnVzX2F1dGhfcmVmIChhdXRoKTsKKyAgICAgICAgICBfZGJ1c19hdXRoX3VucmVmIChhdXRoKTsKKworICAgICAgICAgIGNyZWRzID0gX2RidXNfY3JlZGVudGlhbHNfbmV3X2Zyb21fY3VycmVudF9wcm9jZXNzICgpOworICAgICAgICAgIGlmIChjcmVkcyA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c193YXJuICgibm8gbWVtb3J5IGZvciBjcmVkZW50aWFscyIpOworICAgICAgICAgICAgICBfZGJ1c19hdXRoX3VucmVmIChhdXRoKTsKKyAgICAgICAgICAgICAgYXV0aCA9IE5VTEw7CisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgICAKKyAgICAgICAgICBpZiAoIV9kYnVzX2F1dGhfc2V0X2NyZWRlbnRpYWxzIChhdXRoLCBjcmVkcykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJubyBtZW1vcnkgZm9yIHNldHRpbmcgY3JlZGVudGlhbHMiKTsKKyAgICAgICAgICAgICAgX2RidXNfYXV0aF91bnJlZiAoYXV0aCk7CisgICAgICAgICAgICAgIGF1dGggPSBOVUxMOworICAgICAgICAgICAgICBfZGJ1c19jcmVkZW50aWFsc191bnJlZiAoY3JlZHMpOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgICAgICBfZGJ1c19jcmVkZW50aWFsc191bnJlZiAoY3JlZHMpOworCisgICAgICAgICAgX2RidXNfYXV0aF9zZXRfY29udGV4dCAoYXV0aCwgJmNvbnRleHQpOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChhdXRoID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgibXVzdCBzcGVjaWZ5IENMSUVOVCBvciBTRVJWRVIiKTsKKyAgICAgICAgICBnb3RvIG91dDsKKworICAgICAgICB9CisgICAgICBlbHNlIGlmIChfZGJ1c19zdHJpbmdfc3RhcnRzX3dpdGhfY19zdHIgKCZsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTk9fQ1JFREVOVElBTFMiKSkKKyAgICAgICAgeworICAgICAgICAgIGF1dGhfc2V0X3VuaXhfY3JlZGVudGlhbHMgKGF1dGgsIERCVVNfVUlEX1VOU0VULCBEQlVTX1BJRF9VTlNFVCk7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKF9kYnVzX3N0cmluZ19zdGFydHNfd2l0aF9jX3N0ciAoJmxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJST09UX0NSRURFTlRJQUxTIikpCisgICAgICAgIHsKKyAgICAgICAgICBhdXRoX3NldF91bml4X2NyZWRlbnRpYWxzIChhdXRoLCAwLCBEQlVTX1BJRF9VTlNFVCk7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKF9kYnVzX3N0cmluZ19zdGFydHNfd2l0aF9jX3N0ciAoJmxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTSUxMWV9DUkVERU5USUFMUyIpKQorICAgICAgICB7CisgICAgICAgICAgYXV0aF9zZXRfdW5peF9jcmVkZW50aWFscyAoYXV0aCwgNDMxMiwgREJVU19QSURfVU5TRVQpOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChfZGJ1c19zdHJpbmdfc3RhcnRzX3dpdGhfY19zdHIgKCZsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQUxMT1dFRF9NRUNIUyIpKQorICAgICAgICB7CisgICAgICAgICAgY2hhciAqKm1lY2hzOworCisgICAgICAgICAgX2RidXNfc3RyaW5nX2RlbGV0ZV9maXJzdF93b3JkICgmbGluZSk7CisgICAgICAgICAgbWVjaHMgPSBzcGxpdF9zdHJpbmcgKCZsaW5lKTsKKyAgICAgICAgICBfZGJ1c19hdXRoX3NldF9tZWNoYW5pc21zIChhdXRoLCAoY29uc3QgY2hhciAqKikgbWVjaHMpOworICAgICAgICAgIGRidXNfZnJlZV9zdHJpbmdfYXJyYXkgKG1lY2hzKTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoX2RidXNfc3RyaW5nX3N0YXJ0c193aXRoX2Nfc3RyICgmbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNFTkQiKSkKKyAgICAgICAgeworICAgICAgICAgIERCdXNTdHJpbmcgdG9fc2VuZDsKKyAgICAgICAgICAKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZGVsZXRlX2ZpcnN0X3dvcmQgKCZsaW5lKTsKKworICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZ0b19zZW5kKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfd2FybiAoIm5vIG1lbW9yeSB0byBhbGxvY2F0ZSBzdHJpbmciKTsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoIWFwcGVuZF9xdW90ZWRfc3RyaW5nICgmdG9fc2VuZCwgJmxpbmUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c193YXJuICgiZmFpbGVkIHRvIGFwcGVuZCBxdW90ZWQgc3RyaW5nIGxpbmUgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lX25vKTsKKyAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ0b19zZW5kKTsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiU2VuZGluZyAnJXMnXG4iLCBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZ0b19zZW5kKSk7CisgICAgICAgICAgCisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmdG9fc2VuZCwgIlxyXG4iKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfd2FybiAoImZhaWxlZCB0byBhcHBlbmQgXFxyXFxuIGZyb20gbGluZSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVfbm8pOworICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnRvX3NlbmQpOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIC8qIFJlcGxhY2UgVVNFUklEX0hFWCB3aXRoIG91ciB1c2VybmFtZSBpbiBoZXggKi8KKyAgICAgICAgICB7CisgICAgICAgICAgICBpbnQgd2hlcmU7CisKKyAgICAgICAgICAgIGlmIChfZGJ1c19zdHJpbmdfZmluZCAoJnRvX3NlbmQsIDAsICJXUk9OR19VU0VSSURfSEVYIiwgJndoZXJlKSkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIFRoaXMgbXVzdCBiZSBjaGVja2VkIGZvciBiZWZvcmUgVVNFUklEX0hFWCwgYmVjYXVzZQorICAgICAgICAgICAgICAgICAqIHRoYXQncyBhIHN1YnN0cmluZy4gKi8KKyAgICAgICAgICAgICAgICBEQnVzU3RyaW5nIHVpZDsKKworICAgICAgICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZ1aWQpKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfZGJ1c193YXJuICgibm8gbWVtb3J5IGZvciB1aWQiKTsKKyAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ0b19zZW5kKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIV9kYnVzX3Rlc3RfYXBwZW5kX2RpZmZlcmVudF91aWQgKCZ1aWQpKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfZGJ1c193YXJuICgibm8gbWVtb3J5IGZvciB1aWQiKTsKKyAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ0b19zZW5kKTsKKyAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ1aWQpOworICAgICAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19kZWxldGUgKCZ0b19zZW5kLCB3aGVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSBzdHJsZW4gKCJXUk9OR19VU0VSSURfSEVYIikpOworCisgICAgICAgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaGV4X2VuY29kZSAoJnVpZCwgMCwgJnRvX3NlbmQsIHdoZXJlKSkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2RidXNfd2FybiAoIm5vIG1lbW9yeSB0byBzdWJzdCBXUk9OR19VU0VSSURfSEVYIik7CisgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmdG9fc2VuZCk7CisgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmdWlkKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnVpZCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKF9kYnVzX3N0cmluZ19maW5kICgmdG9fc2VuZCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVVNFUklEX0hFWCIsICZ3aGVyZSkpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQnVzU3RyaW5nIHVzZXJuYW1lOworCisgICAgICAgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnVzZXJuYW1lKSkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2RidXNfd2FybiAoIm5vIG1lbW9yeSBmb3IgdXNlcmlkIik7CisgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmdG9fc2VuZCk7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFfZGJ1c19hcHBlbmRfdXNlcl9mcm9tX2N1cnJlbnRfcHJvY2VzcyAoJnVzZXJuYW1lKSkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2RidXNfd2FybiAoIm5vIG1lbW9yeSBmb3IgdXNlcmlkIik7CisgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmdXNlcm5hbWUpOworICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnRvX3NlbmQpOworICAgICAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19kZWxldGUgKCZ0b19zZW5kLCB3aGVyZSwgKGludCkgc3RybGVuICgiVVNFUklEX0hFWCIpKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19oZXhfZW5jb2RlICgmdXNlcm5hbWUsIDAsCisJCQkJCSAgICAgICZ0b19zZW5kLCB3aGVyZSkpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJubyBtZW1vcnkgdG8gc3Vic3QgVVNFUklEX0hFWCIpOworICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnVzZXJuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ0b19zZW5kKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnVzZXJuYW1lKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoX2RidXNfc3RyaW5nX2ZpbmQgKCZ0b19zZW5kLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXUk9OR19VU0VSTkFNRV9IRVgiLCAmd2hlcmUpKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogVGhpcyBtdXN0IGJlIGNoZWNrZWQgZm9yIGJlZm9yZSBVU0VSTkFNRV9IRVgsIGJlY2F1c2UKKyAgICAgICAgICAgICAgICAgKiB0aGF0J3MgYSBzdWJzdHJpbmcuICovCisjaWZkZWYgREJVU19VTklYCisgICAgICAgICAgICAgICAgREJ1c1N0cmluZyB1c2VybmFtZTsKKworICAgICAgICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZ1c2VybmFtZSkpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJubyBtZW1vcnkgZm9yIHVzZXJuYW1lIik7CisgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmdG9fc2VuZCk7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFfZGJ1c190ZXN0X2FwcGVuZF9kaWZmZXJlbnRfdXNlcm5hbWUgKCZ1c2VybmFtZSkpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJubyBtZW1vcnkgZm9yIHVzZXJuYW1lIik7CisgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmdG9fc2VuZCk7CisgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmdXNlcm5hbWUpOworICAgICAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19kZWxldGUgKCZ0b19zZW5kLCB3aGVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSBzdHJsZW4gKCJXUk9OR19VU0VSTkFNRV9IRVgiKSk7CisKKyAgICAgICAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19oZXhfZW5jb2RlICgmdXNlcm5hbWUsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRvX3NlbmQsIHdoZXJlKSkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2RidXNfd2FybiAoIm5vIG1lbW9yeSB0byBzdWJzdCBXUk9OR19VU0VSTkFNRV9IRVgiKTsKKyAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ0b19zZW5kKTsKKyAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ1c2VybmFtZSk7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ1c2VybmFtZSk7CisjZWxzZQorICAgICAgICAgICAgICAgIC8qIE5vIGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbSB1c2VzIHRoZSBsb2dpbiBuYW1lIG9uCisgICAgICAgICAgICAgICAgICogV2luZG93cywgc28gdGhlcmUncyBubyBwb2ludCBpbiBpdCBhcHBlYXJpbmcgaW4gYW4KKyAgICAgICAgICAgICAgICAgKiBhdXRoIHNjcmlwdCB0aGF0IGlzIG5vdCBVTklYX09OTFkuICovCisgICAgICAgICAgICAgICAgX2RidXNfd2FybiAoIldST05HX1VTRVJOQU1FX0hFWCBjYW5ub3QgYmUgdXNlZCBvbiBXaW5kb3dzIik7CisgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ0b19zZW5kKTsKKyAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyNlbmRpZgorICAgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChfZGJ1c19zdHJpbmdfZmluZCAoJnRvX3NlbmQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVTRVJOQU1FX0hFWCIsICZ3aGVyZSkpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQnVzU3RyaW5nIHVzZXJuYW1lOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZ1c2VybmFtZSkpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJubyBtZW1vcnkgZm9yIHVzZXJuYW1lIik7CisgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmdG9fc2VuZCk7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFfZGJ1c19hcHBlbmRfdXNlcl9mcm9tX2N1cnJlbnRfcHJvY2VzcyAoJnVzZXJuYW1lKSkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2RidXNfd2FybiAoIm5vIG1lbW9yeSBmb3IgdXNlcm5hbWUiKTsKKyAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ1c2VybmFtZSk7CisgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmdG9fc2VuZCk7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2RlbGV0ZSAoJnRvX3NlbmQsIHdoZXJlLCAoaW50KSBzdHJsZW4gKCJVU0VSTkFNRV9IRVgiKSk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaGV4X2VuY29kZSAoJnVzZXJuYW1lLCAwLAorCQkJCQkgICAgICAmdG9fc2VuZCwgd2hlcmUpKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfZGJ1c193YXJuICgibm8gbWVtb3J5IHRvIHN1YnN0IFVTRVJOQU1FX0hFWCIpOworICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnVzZXJuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ0b19zZW5kKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnVzZXJuYW1lKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIHsKKyAgICAgICAgICAgIERCdXNTdHJpbmcgKmJ1ZmZlcjsKKworICAgICAgICAgICAgX2RidXNfYXV0aF9nZXRfYnVmZmVyIChhdXRoLCAmYnVmZmVyKTsKKyAgICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2NvcHkgKCZ0b19zZW5kLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoYnVmZmVyKSkpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfZGJ1c193YXJuICgibm90IGVub3VnaCBtZW1vcnkgdG8gY2FsbCBieXRlc19yZWNlaXZlZCwgb3IgY2FuJ3QgYWRkIGJ5dGVzIHRvIGF1dGggb2JqZWN0IGFscmVhZHkgaW4gZW5kIHN0YXRlIik7CisgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ0b19zZW5kKTsKKyAgICAgICAgICAgICAgICBfZGJ1c19hdXRoX3JldHVybl9idWZmZXIgKGF1dGgsIGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgX2RidXNfYXV0aF9yZXR1cm5fYnVmZmVyIChhdXRoLCBidWZmZXIpOworICAgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnRvX3NlbmQpOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChfZGJ1c19zdHJpbmdfc3RhcnRzX3dpdGhfY19zdHIgKCZsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRVhQRUNUX1NUQVRFIikpCisgICAgICAgIHsKKyAgICAgICAgICBEQnVzQXV0aFN0YXRlIGV4cGVjdGVkOworICAgICAgICAgIAorICAgICAgICAgIF9kYnVzX3N0cmluZ19kZWxldGVfZmlyc3Rfd29yZCAoJmxpbmUpOworCisgICAgICAgICAgZXhwZWN0ZWQgPSBhdXRoX3N0YXRlX2Zyb21fc3RyaW5nICgmbGluZSk7CisgICAgICAgICAgaWYgKGV4cGVjdGVkIDwgMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfd2FybiAoImJhZCBhdXRoIHN0YXRlIGdpdmVuIHRvIEVYUEVDVF9TVEFURSIpOworICAgICAgICAgICAgICBnb3RvIHBhcnNlX2ZhaWxlZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChleHBlY3RlZCAhPSBzdGF0ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfd2FybiAoImV4cGVjdGVkIGF1dGggc3RhdGUgJXMgYnV0IGdvdCAlcyBvbiBsaW5lICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aF9zdGF0ZV90b19zdHJpbmcgKGV4cGVjdGVkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aF9zdGF0ZV90b19zdHJpbmcgKHN0YXRlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZV9ubyk7CisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBlbHNlIGlmIChfZGJ1c19zdHJpbmdfc3RhcnRzX3dpdGhfY19zdHIgKCZsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRVhQRUNUX0NPTU1BTkQiKSkKKyAgICAgICAgeworICAgICAgICAgIERCdXNTdHJpbmcgcmVjZWl2ZWQ7CisgICAgICAgICAgCisgICAgICAgICAgX2RidXNfc3RyaW5nX2RlbGV0ZV9maXJzdF93b3JkICgmbGluZSk7CisKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmcmVjZWl2ZWQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c193YXJuICgibm8gbWVtIHRvIGFsbG9jYXRlIHN0cmluZyByZWNlaXZlZCIpOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX3BvcF9saW5lICgmZnJvbV9hdXRoLCAmcmVjZWl2ZWQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c193YXJuICgibm8gbGluZSBwb3BwZWQgZnJvbSB0aGUgREJ1c0F1dGggYmVpbmcgdGVzdGVkLCBleHBlY3RlZCBjb21tYW5kICVzIG9uIGxpbmUgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZsaW5lKSwgbGluZV9ubyk7CisgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmcmVjZWl2ZWQpOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGlmICghc2FtZV9maXJzdF93b3JkICgmcmVjZWl2ZWQsICZsaW5lKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfd2FybiAoImxpbmUgJWQgZXhwZWN0ZWQgY29tbWFuZCAnJXMnIGFuZCBnb3QgJyVzJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVfbm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmxpbmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZyZWNlaXZlZCkpOworICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnJlY2VpdmVkKTsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgCisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZyZWNlaXZlZCk7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKF9kYnVzX3N0cmluZ19zdGFydHNfd2l0aF9jX3N0ciAoJmxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFWFBFQ1RfVU5VU0VEIikpCisgICAgICAgIHsKKyAgICAgICAgICBEQnVzU3RyaW5nIGV4cGVjdGVkOworICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKnVudXNlZDsKKyAgICAgICAgICAKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZGVsZXRlX2ZpcnN0X3dvcmQgKCZsaW5lKTsKKworICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZleHBlY3RlZCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJubyBtZW0gdG8gYWxsb2NhdGUgc3RyaW5nIGV4cGVjdGVkIik7CisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKCFhcHBlbmRfcXVvdGVkX3N0cmluZyAoJmV4cGVjdGVkLCAmbGluZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJmYWlsZWQgdG8gYXBwZW5kIHF1b3RlZCBzdHJpbmcgbGluZSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVfbm8pOworICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmV4cGVjdGVkKTsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBfZGJ1c19hdXRoX2dldF91bnVzZWRfYnl0ZXMgKGF1dGgsICZ1bnVzZWQpOworICAgICAgICAgIAorICAgICAgICAgIGlmIChfZGJ1c19zdHJpbmdfZXF1YWwgKCZleHBlY3RlZCwgdW51c2VkKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfYXV0aF9kZWxldGVfdW51c2VkX2J5dGVzIChhdXRoKTsKKyAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZleHBlY3RlZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c193YXJuICgiRXhwZWN0ZWQgdW51c2VkIGJ5dGVzICclcycgYW5kIGhhdmUgJyVzJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmV4cGVjdGVkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICh1bnVzZWQpKTsKKyAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZleHBlY3RlZCk7CisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBlbHNlIGlmIChfZGJ1c19zdHJpbmdfc3RhcnRzX3dpdGhfY19zdHIgKCZsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRVhQRUNUX0hBVkVfTk9fQ1JFREVOVElBTFMiKSkKKyAgICAgICAgeworICAgICAgICAgIERCdXNDcmVkZW50aWFscyAqYXV0aG9yaXplZF9pZGVudGl0eTsKKyAgICAgICAgICAKKyAgICAgICAgICBhdXRob3JpemVkX2lkZW50aXR5ID0gX2RidXNfYXV0aF9nZXRfaWRlbnRpdHkgKGF1dGgpOworICAgICAgICAgIGlmICghX2RidXNfY3JlZGVudGlhbHNfYXJlX2Fub255bW91cyAoYXV0aG9yaXplZF9pZGVudGl0eSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJFeHBlY3RlZCBhbm9ueW1vdXMgbG9naW4gb3IgZmFpbGVkIGxvZ2luLCBidXQgc29tZSBjcmVkZW50aWFscyB3ZXJlIGF1dGhvcml6ZWQiKTsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKF9kYnVzX3N0cmluZ19zdGFydHNfd2l0aF9jX3N0ciAoJmxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFWFBFQ1RfSEFWRV9TT01FX0NSRURFTlRJQUxTIikpCisgICAgICAgIHsKKyAgICAgICAgICBEQnVzQ3JlZGVudGlhbHMgKmF1dGhvcml6ZWRfaWRlbnRpdHk7CisgICAgICAgICAgCisgICAgICAgICAgYXV0aG9yaXplZF9pZGVudGl0eSA9IF9kYnVzX2F1dGhfZ2V0X2lkZW50aXR5IChhdXRoKTsKKyAgICAgICAgICBpZiAoX2RidXNfY3JlZGVudGlhbHNfYXJlX2Fub255bW91cyAoYXV0aG9yaXplZF9pZGVudGl0eSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJFeHBlY3RlZCB0byBoYXZlIHNvbWUgY3JlZGVudGlhbHMsIGJ1dCB3ZSBkb24ndCIpOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoX2RidXNfc3RyaW5nX3N0YXJ0c193aXRoX2Nfc3RyICgmbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVYUEVDVCIpKQorICAgICAgICB7CisgICAgICAgICAgREJ1c1N0cmluZyBleHBlY3RlZDsKKyAgICAgICAgICAKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZGVsZXRlX2ZpcnN0X3dvcmQgKCZsaW5lKTsKKworICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZleHBlY3RlZCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJubyBtZW0gdG8gYWxsb2NhdGUgc3RyaW5nIGV4cGVjdGVkIik7CisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKCFhcHBlbmRfcXVvdGVkX3N0cmluZyAoJmV4cGVjdGVkLCAmbGluZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJmYWlsZWQgdG8gYXBwZW5kIHF1b3RlZCBzdHJpbmcgbGluZSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVfbm8pOworICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmV4cGVjdGVkKTsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoX2RidXNfc3RyaW5nX2VxdWFsX2xlbiAoJmV4cGVjdGVkLCAmZnJvbV9hdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmV4cGVjdGVkKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19kZWxldGUgKCZmcm9tX2F1dGgsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmZXhwZWN0ZWQpKTsKKyAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZleHBlY3RlZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c193YXJuICgiRXhwZWN0ZWQgZXhhY3Qgc3RyaW5nICclcycgYW5kIGhhdmUgJyVzJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmV4cGVjdGVkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmZnJvbV9hdXRoKSk7CisgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmZXhwZWN0ZWQpOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBnb3RvIHBhcnNlX2ZhaWxlZDsKKworICAgICAgZ290byBuZXh0X2l0ZXJhdGlvbjsgLyogc2tpcCBwYXJzZV9mYWlsZWQgKi8KKyAgICAgIAorICAgIHBhcnNlX2ZhaWxlZDoKKyAgICAgIHsKKyAgICAgICAgX2RidXNfd2FybiAoImNvdWxkbid0IHByb2Nlc3MgbGluZSAlZCBcIiVzXCIiLAorICAgICAgICAgICAgICAgICAgICBsaW5lX25vLCBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZsaW5lKSk7CisgICAgICAgIGdvdG8gb3V0OworICAgICAgfQorICAgIH0KKworICBpZiAoYXV0aCA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJBdXRoIHNjcmlwdCBpcyBib2d1cywgZGlkIG5vdCBldmVuIGhhdmUgQ0xJRU5UIG9yIFNFUlZFUiIpOworICAgICAgZ290byBvdXQ7CisgICAgfQorICBlbHNlIGlmIChzdGF0ZSA9PSBEQlVTX0FVVEhfU1RBVEVfQVVUSEVOVElDQVRFRCkKKyAgICB7CisgICAgICBjb25zdCBEQnVzU3RyaW5nICp1bnVzZWQ7CisKKyAgICAgIF9kYnVzX2F1dGhfZ2V0X3VudXNlZF9ieXRlcyAoYXV0aCwgJnVudXNlZCk7CisKKyAgICAgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAodW51c2VkKSA+IDApCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgiZGlkIG5vdCBleHBlY3QgdW51c2VkIGJ5dGVzIChzY3JpcHRzIG11c3Qgc3BlY2lmeSBleHBsaWNpdGx5IGlmIHRoZXkgYXJlIGV4cGVjdGVkKSIpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgfQorCisgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmZyb21fYXV0aCkgPiAwKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJzY3JpcHQgZGlkIG5vdCBoYXZlIEVYUEVDVF8gc3RhdGVtZW50cyBmb3IgYWxsIHRoZSBkYXRhIHJlY2VpdmVkIGZyb20gdGhlIERCdXNBdXRoIik7CisgICAgICBfZGJ1c193YXJuICgiTGVmdG92ZXIgZGF0YTogJXMiLCBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZmcm9tX2F1dGgpKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgCisgIHJldHZhbCA9IFRSVUU7CisgIAorIG91dDoKKyAgaWYgKGF1dGgpCisgICAgX2RidXNfYXV0aF91bnJlZiAoYXV0aCk7CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmaWxlKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZsaW5lKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmcm9tX2F1dGgpOworICAKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyoqIEB9ICovCisjZW5kaWYgLyogREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMgKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1hdXRoLXNjcmlwdC5oIGIvZGJ1cy9kYnVzLWF1dGgtc2NyaXB0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzllNmM3YwotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1hdXRoLXNjcmlwdC5oCkBAIC0wLDAgKzEsMzcgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1hdXRoLXNjcmlwdC5oIFRlc3QgREJ1c0F1dGggdXNpbmcgYSBzcGVjaWFsIHNjcmlwdCBmaWxlIChpbnRlcm5hbCB0byBELUJ1cyBpbXBsZW1lbnRhdGlvbikKKyAqIAorICogQ29weXJpZ2h0IChDKSAyMDAzIFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBEQlVTX0FVVEhfU0NSSVBUX0gKKyNkZWZpbmUgREJVU19BVVRIX1NDUklQVF9ICisKKyNpbmNsdWRlIDxkYnVzL2RidXMtbWVtb3J5Lmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXR5cGVzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXN0cmluZy5oPgorCitEQlVTX0JFR0lOX0RFQ0xTCisKK2RidXNfYm9vbF90IF9kYnVzX2F1dGhfc2NyaXB0X3J1biAoY29uc3QgREJ1c1N0cmluZyAqZmlsZW5hbWUpOworCitEQlVTX0VORF9ERUNMUworCisjZW5kaWYgLyogREJVU19BVVRIX1NDUklQVF9IICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtYXV0aC11dGlsLmMgYi9kYnVzL2RidXMtYXV0aC11dGlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFhNWVlNAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1hdXRoLXV0aWwuYwpAQCAtMCwwICsxLDE2OSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLWF1dGgtdXRpbC5jIFdvdWxkIGJlIGluIGRidXMtYXV0aC5jLCBidXQgb25seSB1c2VkIGZvciB0ZXN0cy9idXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMsIDIwMDQgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLWludGVybmFscy5oIgorI2luY2x1ZGUgImRidXMtdGVzdC5oIgorI2luY2x1ZGUgImRidXMtYXV0aC5oIgorCisvKioKKyAqIEBhZGR0b2dyb3VwIERCdXNBdXRoCisgKiBAeworICovCisKKy8qKiBAfSAqLworCisjaWZkZWYgREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMKKyNpbmNsdWRlICJkYnVzLWF1dGgtc2NyaXB0LmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKworc3RhdGljIGRidXNfYm9vbF90Citwcm9jZXNzX3Rlc3Rfc3ViZGlyIChjb25zdCBEQnVzU3RyaW5nICAgICAgICAgICp0ZXN0X2Jhc2VfZGlyLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgICAgICAgICAqc3ViZGlyKQoreworICBEQnVzU3RyaW5nIHRlc3RfZGlyZWN0b3J5OworICBEQnVzU3RyaW5nIGZpbGVuYW1lOworICBEQnVzRGlySXRlciAqZGlyOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIERCdXNFcnJvciBlcnJvciA9IERCVVNfRVJST1JfSU5JVDsKKworICByZXR2YWwgPSBGQUxTRTsKKyAgZGlyID0gTlVMTDsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZ0ZXN0X2RpcmVjdG9yeSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZGlkbid0IGFsbG9jYXRlIHRlc3RfZGlyZWN0b3J5Iik7CisKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZmaWxlbmFtZSwgc3ViZGlyKTsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2NvcHkgKHRlc3RfYmFzZV9kaXIsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZXN0X2RpcmVjdG9yeSwgMCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGRuJ3QgY29weSB0ZXN0X2Jhc2VfZGlyIHRvIHRlc3RfZGlyZWN0b3J5Iik7CisgIAorICBpZiAoIV9kYnVzX2NvbmNhdF9kaXJfYW5kX2ZpbGUgKCZ0ZXN0X2RpcmVjdG9yeSwgJmZpbGVuYW1lKSkgICAgCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGRuJ3QgYWxsb2NhdGUgZnVsbCBwYXRoIik7CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmaWxlbmFtZSk7CisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZmaWxlbmFtZSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZGlkbid0IGFsbG9jYXRlIGZpbGVuYW1lIHN0cmluZyIpOworCisgIGRpciA9IF9kYnVzX2RpcmVjdG9yeV9vcGVuICgmdGVzdF9kaXJlY3RvcnksICZlcnJvcik7CisgIGlmIChkaXIgPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiQ291bGQgbm90IG9wZW4gJXM6ICVzIiwKKyAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJnRlc3RfZGlyZWN0b3J5KSwKKyAgICAgICAgICAgICAgICAgIGVycm9yLm1lc3NhZ2UpOworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIHByaW50ZiAoIlRlc3RpbmcgJXM6XG4iLCBzdWJkaXIpOworICAKKyBuZXh0OgorICB3aGlsZSAoX2RidXNfZGlyZWN0b3J5X2dldF9uZXh0X2ZpbGUgKGRpciwgJmZpbGVuYW1lLCAmZXJyb3IpKQorICAgIHsKKyAgICAgIERCdXNTdHJpbmcgZnVsbF9wYXRoOworICAgICAgCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZnVsbF9wYXRoKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGRuJ3QgaW5pdCBzdHJpbmciKTsKKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAoJnRlc3RfZGlyZWN0b3J5LCAwLCAmZnVsbF9wYXRoLCAwKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGRuJ3QgY29weSBkaXIgdG8gZnVsbF9wYXRoIik7CisKKyAgICAgIGlmICghX2RidXNfY29uY2F0X2Rpcl9hbmRfZmlsZSAoJmZ1bGxfcGF0aCwgJmZpbGVuYW1lKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGRuJ3QgY29uY2F0IGZpbGUgdG8gZGlyIik7CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2VuZHNfd2l0aF9jX3N0ciAoJmZpbGVuYW1lLCAiLmF1dGgtc2NyaXB0IikpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiU2tpcHBpbmcgbm9uLS5hdXRoLXNjcmlwdCBmaWxlICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmZpbGVuYW1lKSk7CisJICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZ1bGxfcGF0aCk7CisgICAgICAgICAgZ290byBuZXh0OworICAgICAgICB9CisKKyAgICAgIHByaW50ZiAoIiAgICAlc1xuIiwgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmZmlsZW5hbWUpKTsKKyAgICAgIAorICAgICAgaWYgKCFfZGJ1c19hdXRoX3NjcmlwdF9ydW4gKCZmdWxsX3BhdGgpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmdWxsX3BhdGgpOworICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmZnVsbF9wYXRoKTsKKyAgICB9CisKKyAgaWYgKGRidXNfZXJyb3JfaXNfc2V0ICgmZXJyb3IpKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJDb3VsZCBub3QgZ2V0IG5leHQgZmlsZSBpbiAlczogJXMiLAorICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmdGVzdF9kaXJlY3RvcnkpLCBlcnJvci5tZXNzYWdlKTsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKyAgICAKKyAgcmV0dmFsID0gVFJVRTsKKyAgCisgZmFpbGVkOgorCisgIGlmIChkaXIpCisgICAgX2RidXNfZGlyZWN0b3J5X2Nsb3NlIChkaXIpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnRlc3RfZGlyZWN0b3J5KTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmaWxlbmFtZSk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGRidXNfYm9vbF90Citwcm9jZXNzX3Rlc3RfZGlycyAoY29uc3QgY2hhciAqdGVzdF9kYXRhX2RpcikKK3sKKyAgREJ1c1N0cmluZyB0ZXN0X2RpcmVjdG9yeTsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworCisgIHJldHZhbCA9IEZBTFNFOworICAKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZ0ZXN0X2RpcmVjdG9yeSwgdGVzdF9kYXRhX2Rpcik7CisKKyAgaWYgKCFwcm9jZXNzX3Rlc3Rfc3ViZGlyICgmdGVzdF9kaXJlY3RvcnksICJhdXRoIikpCisgICAgZ290byBmYWlsZWQ7CisKKyAgcmV0dmFsID0gVFJVRTsKKyAgCisgZmFpbGVkOgorCisgIF9kYnVzX3N0cmluZ19mcmVlICgmdGVzdF9kaXJlY3RvcnkpOworICAKKyAgcmV0dXJuIHJldHZhbDsKK30KKworZGJ1c19ib29sX3QKK19kYnVzX2F1dGhfdGVzdCAoY29uc3QgY2hhciAqdGVzdF9kYXRhX2RpcikKK3sKKyAgCisgIGlmICh0ZXN0X2RhdGFfZGlyID09IE5VTEwpCisgICAgcmV0dXJuIFRSVUU7CisgIAorICBpZiAoIXByb2Nlc3NfdGVzdF9kaXJzICh0ZXN0X2RhdGFfZGlyKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKyNlbmRpZiAvKiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUyAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLWF1dGguYyBiL2RidXMvZGJ1cy1hdXRoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM5MGE5ZAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1hdXRoLmMKQEAgLTAsMCArMSwyOTE2IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtYXV0aC5jIEF1dGhlbnRpY2F0aW9uCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzLCAyMDA0IFJlZCBIYXQgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiZGJ1cy1hdXRoLmgiCisjaW5jbHVkZSAiZGJ1cy1zdHJpbmcuaCIKKyNpbmNsdWRlICJkYnVzLWxpc3QuaCIKKyNpbmNsdWRlICJkYnVzLWludGVybmFscy5oIgorI2luY2x1ZGUgImRidXMta2V5cmluZy5oIgorI2luY2x1ZGUgImRidXMtc2hhLmgiCisjaW5jbHVkZSAiZGJ1cy1wcm90b2NvbC5oIgorI2luY2x1ZGUgImRidXMtY3JlZGVudGlhbHMuaCIKKworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c0F1dGggQXV0aGVudGljYXRpb24KKyAqIEBpbmdyb3VwICBEQnVzSW50ZXJuYWxzCisgKiBAYnJpZWYgREJ1c0F1dGggb2JqZWN0CisgKgorICogREJ1c0F1dGggbWFuYWdlcyB0aGUgYXV0aGVudGljYXRpb24gbmVnb3RpYXRpb24gd2hlbiBhIGNvbm5lY3Rpb24KKyAqIGlzIGZpcnN0IGVzdGFibGlzaGVkLCBhbmQgYWxzbyBtYW5hZ2VzIGFueSBlbmNyeXB0aW9uIHVzZWQgb3ZlciBhCisgKiBjb25uZWN0aW9uLgorICoKKyAqIEB0b2RvIHNvbWUgU0FTTCBwcm9maWxlcyByZXF1aXJlIHNlbmRpbmcgdGhlIGVtcHR5IHN0cmluZyBhcyBhCisgKiBjaGFsbGVuZ2UvcmVzcG9uc2UsIGJ1dCB3ZSBkb24ndCBjdXJyZW50bHkgYWxsb3cgdGhhdCBpbiBvdXIKKyAqIHByb3RvY29sLgorICoKKyAqIEB0b2RvIHJpZ2h0IG5vdyBzb21ldGltZXMgYm90aCBlbmRzIHdpbGwgYmxvY2sgd2FpdGluZyBmb3IgaW5wdXQKKyAqIGZyb20gdGhlIG90aGVyIGVuZCwgZS5nLiBpZiB0aGVyZSdzIGFuIGVycm9yIGR1cmluZworICogREJVU19DT09LSUVfU0hBMS4KKyAqCisgKiBAdG9kbyB0aGUgY29va2llIGtleXJpbmcgbmVlZHMgdG8gYmUgY2FjaGVkIGdsb2JhbGx5IG5vdCBqdXN0CisgKiBwZXItYXV0aCAod2hpY2ggcmFpc2VzIHRocmVhZHNhZmV0eSBpc3N1ZXMgdG9vKQorICogCisgKiBAdG9kbyBncmVwIEZJWE1FIGluIGRidXMtYXV0aC5jCisgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c0F1dGhJbnRlcm5hbHMgQXV0aGVudGljYXRpb24gaW1wbGVtZW50YXRpb24gZGV0YWlscworICogQGluZ3JvdXAgIERCdXNJbnRlcm5hbHMKKyAqIEBicmllZiBEQnVzQXV0aCBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzCisgKgorICogUHJpdmF0ZSBkZXRhaWxzIG9mIGF1dGhlbnRpY2F0aW9uIGNvZGUuCisgKgorICogQHsKKyAqLworCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gYXBwZW5kcyBhbiBpbml0aWFsIGNsaWVudCByZXNwb25zZSB0byB0aGUgZ2l2ZW4gc3RyaW5nCisgKi8KK3R5cGVkZWYgZGJ1c19ib29sX3QgKCogREJ1c0luaXRpYWxSZXNwb25zZUZ1bmN0aW9uKSAgKERCdXNBdXRoICAgICAgICAgKmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICpyZXNwb25zZSk7CisKKy8qKgorICogVGhpcyBmdW5jdGlvbiBwcm9jZXNzZXMgYSBibG9jayBvZiBkYXRhIHJlY2VpdmVkIGZyb20gdGhlIHBlZXIuCisgKiBpLmUuIGhhbmRsZXMgYSBEQVRBIGNvbW1hbmQuCisgKi8KK3R5cGVkZWYgZGJ1c19ib29sX3QgKCogREJ1c0F1dGhEYXRhRnVuY3Rpb24pICAgICAoREJ1c0F1dGggICAgICAgICAqYXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqZGF0YSk7CisKKy8qKgorICogVGhpcyBmdW5jdGlvbiBlbmNvZGVzIGEgYmxvY2sgb2YgZGF0YSBmcm9tIHRoZSBwZWVyLgorICovCit0eXBlZGVmIGRidXNfYm9vbF90ICgqIERCdXNBdXRoRW5jb2RlRnVuY3Rpb24pICAgKERCdXNBdXRoICAgICAgICAgKmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgKmVuY29kZWQpOworCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gZGVjb2RlcyBhIGJsb2NrIG9mIGRhdGEgZnJvbSB0aGUgcGVlci4KKyAqLwordHlwZWRlZiBkYnVzX2Jvb2xfdCAoKiBEQnVzQXV0aERlY29kZUZ1bmN0aW9uKSAgIChEQnVzQXV0aCAgICAgICAgICphdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICpkZWNvZGVkKTsKKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSBtZWNoYW5pc20gaXMgYWJhbmRvbmVkLgorICovCit0eXBlZGVmIHZvaWQgICAgICAgICgqIERCdXNBdXRoU2h1dGRvd25GdW5jdGlvbikgKERCdXNBdXRoICAgICAgICphdXRoKTsKKworLyoqCisgKiBWaXJ0dWFsIHRhYmxlIHJlcHJlc2VudGluZyBhIHBhcnRpY3VsYXIgYXV0aCBtZWNoYW5pc20uCisgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIGNvbnN0IGNoYXIgKm1lY2hhbmlzbTsgLyoqPCBOYW1lIG9mIHRoZSBtZWNoYW5pc20gKi8KKyAgREJ1c0F1dGhEYXRhRnVuY3Rpb24gc2VydmVyX2RhdGFfZnVuYzsgLyoqPCBGdW5jdGlvbiBvbiBzZXJ2ZXIgc2lkZSBmb3IgREFUQSAqLworICBEQnVzQXV0aEVuY29kZUZ1bmN0aW9uIHNlcnZlcl9lbmNvZGVfZnVuYzsgLyoqPCBGdW5jdGlvbiBvbiBzZXJ2ZXIgc2lkZSB0byBlbmNvZGUgKi8KKyAgREJ1c0F1dGhEZWNvZGVGdW5jdGlvbiBzZXJ2ZXJfZGVjb2RlX2Z1bmM7IC8qKjwgRnVuY3Rpb24gb24gc2VydmVyIHNpZGUgdG8gZGVjb2RlICovCisgIERCdXNBdXRoU2h1dGRvd25GdW5jdGlvbiBzZXJ2ZXJfc2h1dGRvd25fZnVuYzsgLyoqPCBGdW5jdGlvbiBvbiBzZXJ2ZXIgc2lkZSB0byBzaHV0IGRvd24gKi8KKyAgREJ1c0luaXRpYWxSZXNwb25zZUZ1bmN0aW9uIGNsaWVudF9pbml0aWFsX3Jlc3BvbnNlX2Z1bmM7IC8qKjwgRnVuY3Rpb24gb24gY2xpZW50IHNpZGUgdG8gaGFuZGxlIGluaXRpYWwgcmVzcG9uc2UgKi8KKyAgREJ1c0F1dGhEYXRhRnVuY3Rpb24gY2xpZW50X2RhdGFfZnVuYzsgLyoqPCBGdW5jdGlvbiBvbiBjbGllbnQgc2lkZSBmb3IgREFUQSAqLworICBEQnVzQXV0aEVuY29kZUZ1bmN0aW9uIGNsaWVudF9lbmNvZGVfZnVuYzsgLyoqPCBGdW5jdGlvbiBvbiBjbGllbnQgc2lkZSBmb3IgZW5jb2RlICovCisgIERCdXNBdXRoRGVjb2RlRnVuY3Rpb24gY2xpZW50X2RlY29kZV9mdW5jOyAvKio8IEZ1bmN0aW9uIG9uIGNsaWVudCBzaWRlIGZvciBkZWNvZGUgKi8KKyAgREJ1c0F1dGhTaHV0ZG93bkZ1bmN0aW9uIGNsaWVudF9zaHV0ZG93bl9mdW5jOyAvKio8IEZ1bmN0aW9uIG9uIGNsaWVudCBzaWRlIGZvciBzaHV0ZG93biAqLworfSBEQnVzQXV0aE1lY2hhbmlzbUhhbmRsZXI7CisKKy8qKgorICogRW51bWVyYXRpb24gZm9yIHRoZSBrbm93biBhdXRoZW50aWNhdGlvbiBjb21tYW5kcy4KKyAqLwordHlwZWRlZiBlbnVtIHsKKyAgREJVU19BVVRIX0NPTU1BTkRfQVVUSCwKKyAgREJVU19BVVRIX0NPTU1BTkRfQ0FOQ0VMLAorICBEQlVTX0FVVEhfQ09NTUFORF9EQVRBLAorICBEQlVTX0FVVEhfQ09NTUFORF9CRUdJTiwKKyAgREJVU19BVVRIX0NPTU1BTkRfUkVKRUNURUQsCisgIERCVVNfQVVUSF9DT01NQU5EX09LLAorICBEQlVTX0FVVEhfQ09NTUFORF9FUlJPUiwKKyAgREJVU19BVVRIX0NPTU1BTkRfVU5LTk9XTiwKKyAgREJVU19BVVRIX0NPTU1BTkRfTkVHT1RJQVRFX1VOSVhfRkQsCisgIERCVVNfQVVUSF9DT01NQU5EX0FHUkVFX1VOSVhfRkQKK30gREJ1c0F1dGhDb21tYW5kOworCisvKioKKyAqIEF1dGggc3RhdGUgZnVuY3Rpb24sIGRldGVybWluZXMgdGhlIHJlYWN0aW9uIHRvIGluY29taW5nIGV2ZW50cyBmb3IKKyAqIGEgcGFydGljdWxhciBzdGF0ZS4gUmV0dXJucyB3aGV0aGVyIHdlIGhhZCBlbm91Z2ggbWVtb3J5IHRvCisgKiBjb21wbGV0ZSB0aGUgb3BlcmF0aW9uLgorICovCit0eXBlZGVmIGRidXNfYm9vbF90ICgqIERCdXNBdXRoU3RhdGVGdW5jdGlvbikgKERCdXNBdXRoICAgICAgICAgKmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNBdXRoQ29tbWFuZCAgIGNvbW1hbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmFyZ3MpOworCisvKioKKyAqIEluZm9ybWF0aW9uIGFib3V0IGEgYXV0aCBzdGF0ZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgY29uc3QgY2hhciAqbmFtZTsgICAgICAgICAgICAgICAvKio8IE5hbWUgb2YgdGhlIHN0YXRlICovCisgIERCdXNBdXRoU3RhdGVGdW5jdGlvbiBoYW5kbGVyOyAgLyoqPCBTdGF0ZSBmdW5jdGlvbiBmb3IgdGhpcyBzdGF0ZSAqLworfSBEQnVzQXV0aFN0YXRlRGF0YTsKKworLyoqCisgKiBJbnRlcm5hbCBtZW1iZXJzIG9mIERCdXNBdXRoLgorICovCitzdHJ1Y3QgREJ1c0F1dGgKK3sKKyAgaW50IHJlZmNvdW50OyAgICAgICAgICAgLyoqPCByZWZlcmVuY2UgY291bnQgKi8KKyAgY29uc3QgY2hhciAqc2lkZTsgICAgICAgLyoqPCBDbGllbnQgb3Igc2VydmVyICovCisKKyAgREJ1c1N0cmluZyBpbmNvbWluZzsgICAgLyoqPCBJbmNvbWluZyBkYXRhIGJ1ZmZlciAqLworICBEQnVzU3RyaW5nIG91dGdvaW5nOyAgICAvKio8IE91dGdvaW5nIGRhdGEgYnVmZmVyICovCisgIAorICBjb25zdCBEQnVzQXV0aFN0YXRlRGF0YSAqc3RhdGU7ICAgICAgICAgLyoqPCBDdXJyZW50IHByb3RvY29sIHN0YXRlICovCisKKyAgY29uc3QgREJ1c0F1dGhNZWNoYW5pc21IYW5kbGVyICptZWNoOyAgIC8qKjwgQ3VycmVudCBhdXRoIG1lY2hhbmlzbSAqLworCisgIERCdXNTdHJpbmcgaWRlbnRpdHk7ICAgICAgICAgICAgICAgICAgIC8qKjwgQ3VycmVudCBpZGVudGl0eSB3ZSdyZSBhdXRob3JpemluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIGFzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgCisgIERCdXNDcmVkZW50aWFscyAqY3JlZGVudGlhbHM7ICAgICAgICAgIC8qKjwgQ3JlZGVudGlhbHMgcmVhZCBmcm9tIHNvY2tldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICBEQnVzQ3JlZGVudGlhbHMgKmF1dGhvcml6ZWRfaWRlbnRpdHk7IC8qKjwgQ3JlZGVudGlhbHMgdGhhdCBhcmUgYXV0aG9yaXplZCAqLworCisgIERCdXNDcmVkZW50aWFscyAqZGVzaXJlZF9pZGVudGl0eTsgICAgLyoqPCBJZGVudGl0eSBjbGllbnQgaGFzIHJlcXVlc3RlZCAqLworICAKKyAgREJ1c1N0cmluZyBjb250ZXh0OyAgICAgICAgICAgICAgIC8qKjwgQ29va2llIHNjb3BlICovCisgIERCdXNLZXlyaW5nICprZXlyaW5nOyAgICAgICAgICAgICAvKio8IEtleXJpbmcgZm9yIGNvb2tpZSBtZWNoYW5pc20uICovCisgIGludCBjb29raWVfaWQ7ICAgICAgICAgICAgICAgICAgICAvKio8IElEIG9mIGNvb2tpZSB0byB1c2UgKi8KKyAgREJ1c1N0cmluZyBjaGFsbGVuZ2U7ICAgICAgICAgICAgIC8qKjwgQ2hhbGxlbmdlIHNlbnQgdG8gY2xpZW50ICovCisKKyAgY2hhciAqKmFsbG93ZWRfbWVjaHM7ICAgICAgICAgICAgIC8qKjwgTWVjaGFuaXNtcyB3ZSdyZSBhbGxvd2VkIHRvIHVzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG9yICNOVUxMIGlmIHdlIGNhbiB1c2UgYW55CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgCisgIHVuc2lnbmVkIGludCBuZWVkZWRfbWVtb3J5IDogMTsgICAvKio8IFdlIG5lZWRlZCBtZW1vcnkgdG8gY29udGludWUgc2luY2UgbGFzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc3VjY2Vzc2Z1bCBnZXR0aW5nIHNvbWV0aGluZyBkb25lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdW5zaWduZWQgaW50IGFscmVhZHlfZ290X21lY2hhbmlzbXMgOiAxOyAgICAgICAvKio8IENsaWVudCBhbHJlYWR5IGdvdCBtZWNoIGxpc3QgKi8KKyAgdW5zaWduZWQgaW50IGFscmVhZHlfYXNrZWRfZm9yX2luaXRpYWxfcmVzcG9uc2UgOiAxOyAvKio8IEFscmVhZHkgc2VudCBhIGJsYW5rIGNoYWxsZW5nZSB0byBnZXQgYW4gaW5pdGlhbCByZXNwb25zZSAqLworICB1bnNpZ25lZCBpbnQgYnVmZmVyX291dHN0YW5kaW5nIDogMTsgLyoqPCBCdWZmZXIgaXMgImNoZWNrZWQgb3V0IiBmb3IgcmVhZGluZyBkYXRhIGludG8gKi8KKworICB1bnNpZ25lZCBpbnQgdW5peF9mZF9wb3NzaWJsZSA6IDE7ICAvKio8IFRoaXMgc2lkZSBjb3VsZCBkbyB1bml4IGZkIHBhc3NpbmcgKi8KKyAgdW5zaWduZWQgaW50IHVuaXhfZmRfbmVnb3RpYXRlZCA6IDE7IC8qKjwgVW5peCBmZCB3YXMgc3VjY2Vzc2Z1bGx5IG5lZ290aWF0ZWQgKi8KK307CisKKy8qKgorICogIlN1YmNsYXNzIiBvZiBEQnVzQXV0aCBmb3IgY2xpZW50IHNpZGUKKyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgREJ1c0F1dGggYmFzZTsgICAgLyoqPCBQYXJlbnQgY2xhc3MgKi8KKworICBEQnVzTGlzdCAqbWVjaHNfdG9fdHJ5OyAvKio8IE1lY2hhbmlzbXMgd2UgZ290IGZyb20gdGhlIHNlcnZlciB0aGF0IHdlJ3JlIGdvaW5nIHRvIHRyeSB1c2luZyAqLworCisgIERCdXNTdHJpbmcgZ3VpZF9mcm9tX3NlcnZlcjsgLyoqPCBHVUlEIHJlY2VpdmVkIGZyb20gc2VydmVyICovCisgIAorfSBEQnVzQXV0aENsaWVudDsKKworLyoqCisgKiAiU3ViY2xhc3MiIG9mIERCdXNBdXRoIGZvciBzZXJ2ZXIgc2lkZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgREJ1c0F1dGggYmFzZTsgICAgLyoqPCBQYXJlbnQgY2xhc3MgKi8KKworICBpbnQgZmFpbHVyZXM7ICAgICAvKio8IE51bWJlciBvZiB0aW1lcyBjbGllbnQgaGFzIGJlZW4gcmVqZWN0ZWQgKi8KKyAgaW50IG1heF9mYWlsdXJlczsgLyoqPCBOdW1iZXIgb2YgdGltZXMgd2UgcmVqZWN0IGJlZm9yZSBkaXNjb25uZWN0ICovCisKKyAgREJ1c1N0cmluZyBndWlkOyAgLyoqPCBPdXIgZ2xvYmFsbHkgdW5pcXVlIElEIGluIGhleCBlbmNvZGluZyAqLworICAKK30gREJ1c0F1dGhTZXJ2ZXI7CisKK3N0YXRpYyB2b2lkICAgICAgICBnb3RvX3N0YXRlICAgICAgICAgICAgICAgIChEQnVzQXV0aCAgICAgICAgICAgICAgICAgICAgICAgKmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c0F1dGhTdGF0ZURhdGEgICAgICAgICpuZXdfc3RhdGUpOworc3RhdGljIGRidXNfYm9vbF90IHNlbmRfYXV0aCAgICAgICAgICAgICAgICAgKERCdXNBdXRoICphdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNBdXRoTWVjaGFuaXNtSGFuZGxlciAqbWVjaCk7CitzdGF0aWMgZGJ1c19ib29sX3Qgc2VuZF9kYXRhICAgICAgICAgICAgICAgICAoREJ1c0F1dGggKmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAqZGF0YSk7CitzdGF0aWMgZGJ1c19ib29sX3Qgc2VuZF9yZWplY3RlZCAgICAgICAgICAgICAoREJ1c0F1dGggKmF1dGgpOworc3RhdGljIGRidXNfYm9vbF90IHNlbmRfZXJyb3IgICAgICAgICAgICAgICAgKERCdXNBdXRoICphdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1lc3NhZ2UpOworc3RhdGljIGRidXNfYm9vbF90IHNlbmRfb2sgICAgICAgICAgICAgICAgICAgKERCdXNBdXRoICphdXRoKTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBzZW5kX2JlZ2luICAgICAgICAgICAgICAgIChEQnVzQXV0aCAqYXV0aCk7CitzdGF0aWMgZGJ1c19ib29sX3Qgc2VuZF9jYW5jZWwgICAgICAgICAgICAgICAoREJ1c0F1dGggKmF1dGgpOworc3RhdGljIGRidXNfYm9vbF90IHNlbmRfbmVnb3RpYXRlX3VuaXhfZmQgICAgKERCdXNBdXRoICphdXRoKTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBzZW5kX2FncmVlX3VuaXhfZmQgICAgICAgIChEQnVzQXV0aCAqYXV0aCk7CisKKy8qKgorICogQ2xpZW50IHN0YXRlcworICovCisgCitzdGF0aWMgZGJ1c19ib29sX3QgaGFuZGxlX3NlcnZlcl9zdGF0ZV93YWl0aW5nX2Zvcl9hdXRoICAoREJ1c0F1dGggICAgICAgICAqYXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQXV0aENvbW1hbmQgICBjb21tYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmFyZ3MpOworc3RhdGljIGRidXNfYm9vbF90IGhhbmRsZV9zZXJ2ZXJfc3RhdGVfd2FpdGluZ19mb3JfZGF0YSAgKERCdXNBdXRoICAgICAgICAgKmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0F1dGhDb21tYW5kICAgY29tbWFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICphcmdzKTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBoYW5kbGVfc2VydmVyX3N0YXRlX3dhaXRpbmdfZm9yX2JlZ2luIChEQnVzQXV0aCAgICAgICAgICphdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNBdXRoQ29tbWFuZCAgIGNvbW1hbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqYXJncyk7CisgIAorc3RhdGljIGNvbnN0IERCdXNBdXRoU3RhdGVEYXRhIHNlcnZlcl9zdGF0ZV93YWl0aW5nX2Zvcl9hdXRoID0geworICAiV2FpdGluZ0ZvckF1dGgiLCBoYW5kbGVfc2VydmVyX3N0YXRlX3dhaXRpbmdfZm9yX2F1dGgKK307CitzdGF0aWMgY29uc3QgREJ1c0F1dGhTdGF0ZURhdGEgc2VydmVyX3N0YXRlX3dhaXRpbmdfZm9yX2RhdGEgPSB7CisgICJXYWl0aW5nRm9yRGF0YSIsIGhhbmRsZV9zZXJ2ZXJfc3RhdGVfd2FpdGluZ19mb3JfZGF0YQorfTsKK3N0YXRpYyBjb25zdCBEQnVzQXV0aFN0YXRlRGF0YSBzZXJ2ZXJfc3RhdGVfd2FpdGluZ19mb3JfYmVnaW4gPSB7CisgICJXYWl0aW5nRm9yQmVnaW4iLCBoYW5kbGVfc2VydmVyX3N0YXRlX3dhaXRpbmdfZm9yX2JlZ2luCit9OworICAKKy8qKgorICogQ2xpZW50IHN0YXRlcworICovCisgCitzdGF0aWMgZGJ1c19ib29sX3QgaGFuZGxlX2NsaWVudF9zdGF0ZV93YWl0aW5nX2Zvcl9kYXRhICAgKERCdXNBdXRoICAgICAgICAgKmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNBdXRoQ29tbWFuZCAgIGNvbW1hbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmFyZ3MpOworc3RhdGljIGRidXNfYm9vbF90IGhhbmRsZV9jbGllbnRfc3RhdGVfd2FpdGluZ19mb3Jfb2sgICAgIChEQnVzQXV0aCAgICAgICAgICphdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQXV0aENvbW1hbmQgICBjb21tYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICphcmdzKTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBoYW5kbGVfY2xpZW50X3N0YXRlX3dhaXRpbmdfZm9yX3JlamVjdCAoREJ1c0F1dGggICAgICAgICAqYXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0F1dGhDb21tYW5kICAgY29tbWFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqYXJncyk7CitzdGF0aWMgZGJ1c19ib29sX3QgaGFuZGxlX2NsaWVudF9zdGF0ZV93YWl0aW5nX2Zvcl9hZ3JlZV91bml4X2ZkIChEQnVzQXV0aCAgICAgICAgICphdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQXV0aENvbW1hbmQgICBjb21tYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICphcmdzKTsKKworc3RhdGljIGNvbnN0IERCdXNBdXRoU3RhdGVEYXRhIGNsaWVudF9zdGF0ZV9uZWVkX3NlbmRfYXV0aCA9IHsKKyAgIk5lZWRTZW5kQXV0aCIsIE5VTEwKK307CitzdGF0aWMgY29uc3QgREJ1c0F1dGhTdGF0ZURhdGEgY2xpZW50X3N0YXRlX3dhaXRpbmdfZm9yX2RhdGEgPSB7CisgICJXYWl0aW5nRm9yRGF0YSIsIGhhbmRsZV9jbGllbnRfc3RhdGVfd2FpdGluZ19mb3JfZGF0YQorfTsKKy8qIFRoZSBXYWl0aW5nRm9yT0sgc3RhdGUgZG9lc24ndCBhcHBlYXIgdG8gYmUgdXNlZC4KKyAqIFNlZSBodHRwczovL2J1Z3MuZnJlZWRlc2t0b3Aub3JnL3Nob3dfYnVnLmNnaT9pZD05NzI5OCAqLworX0RCVVNfR05VQ19VTlVTRUQKK3N0YXRpYyBjb25zdCBEQnVzQXV0aFN0YXRlRGF0YSBjbGllbnRfc3RhdGVfd2FpdGluZ19mb3Jfb2sgPSB7CisgICJXYWl0aW5nRm9yT0siLCBoYW5kbGVfY2xpZW50X3N0YXRlX3dhaXRpbmdfZm9yX29rCit9Oworc3RhdGljIGNvbnN0IERCdXNBdXRoU3RhdGVEYXRhIGNsaWVudF9zdGF0ZV93YWl0aW5nX2Zvcl9yZWplY3QgPSB7CisgICJXYWl0aW5nRm9yUmVqZWN0IiwgaGFuZGxlX2NsaWVudF9zdGF0ZV93YWl0aW5nX2Zvcl9yZWplY3QKK307CitzdGF0aWMgY29uc3QgREJ1c0F1dGhTdGF0ZURhdGEgY2xpZW50X3N0YXRlX3dhaXRpbmdfZm9yX2FncmVlX3VuaXhfZmQgPSB7CisgICJXYWl0aW5nRm9yQWdyZWVVbml4RkQiLCBoYW5kbGVfY2xpZW50X3N0YXRlX3dhaXRpbmdfZm9yX2FncmVlX3VuaXhfZmQKK307CisKKy8qKgorICogQ29tbW9uIHRlcm1pbmFsIHN0YXRlcy4gIFRlcm1pbmFsIHN0YXRlcyBoYXZlIGhhbmRsZXIgPT0gTlVMTC4KKyAqLworCitzdGF0aWMgY29uc3QgREJ1c0F1dGhTdGF0ZURhdGEgY29tbW9uX3N0YXRlX2F1dGhlbnRpY2F0ZWQgPSB7CisgICJBdXRoZW50aWNhdGVkIiwgIE5VTEwKK307CisKK3N0YXRpYyBjb25zdCBEQnVzQXV0aFN0YXRlRGF0YSBjb21tb25fc3RhdGVfbmVlZF9kaXNjb25uZWN0ID0geworICAiTmVlZERpc2Nvbm5lY3QiLCAgTlVMTAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgYXV0aF9zaWRlX2NsaWVudFtdID0gImNsaWVudCI7CitzdGF0aWMgY29uc3QgY2hhciBhdXRoX3NpZGVfc2VydmVyW10gPSAic2VydmVyIjsKKy8qKgorICogQHBhcmFtIGF1dGggdGhlIGF1dGggY29udmVyc2F0aW9uCisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGUgY29udmVyc2F0aW9uIGlzIHRoZSBzZXJ2ZXIgc2lkZQorICovCisjZGVmaW5lIERCVVNfQVVUSF9JU19TRVJWRVIoYXV0aCkgKChhdXRoKS0+c2lkZSA9PSBhdXRoX3NpZGVfc2VydmVyKQorLyoqCisgKiBAcGFyYW0gYXV0aCB0aGUgYXV0aCBjb252ZXJzYXRpb24KKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSBjb252ZXJzYXRpb24gaXMgdGhlIGNsaWVudCBzaWRlCisgKi8KKyNkZWZpbmUgREJVU19BVVRIX0lTX0NMSUVOVChhdXRoKSAoKGF1dGgpLT5zaWRlID09IGF1dGhfc2lkZV9jbGllbnQpCisvKioKKyAqIEBwYXJhbSBhdXRoIHRoZSBhdXRoIGNvbnZlcnNhdGlvbgorICogQHJldHVybnMgYXV0aCBjYXN0IHRvIERCdXNBdXRoQ2xpZW50CisgKi8KKyNkZWZpbmUgREJVU19BVVRIX0NMSUVOVChhdXRoKSAgICAoKERCdXNBdXRoQ2xpZW50KikoYXV0aCkpCisvKioKKyAqIEBwYXJhbSBhdXRoIHRoZSBhdXRoIGNvbnZlcnNhdGlvbgorICogQHJldHVybnMgYXV0aCBjYXN0IHRvIERCdXNBdXRoU2VydmVyCisgKi8KKyNkZWZpbmUgREJVU19BVVRIX1NFUlZFUihhdXRoKSAgICAoKERCdXNBdXRoU2VydmVyKikoYXV0aCkpCisKKy8qKgorICogVGhlIG5hbWUgb2YgdGhlIGF1dGggKCJjbGllbnQiIG9yICJzZXJ2ZXIiKQorICogQHBhcmFtIGF1dGggdGhlIGF1dGggY29udmVyc2F0aW9uCisgKiBAcmV0dXJucyBhIHN0cmluZworICovCisjZGVmaW5lIERCVVNfQVVUSF9OQU1FKGF1dGgpICAgICAgKChhdXRoKS0+c2lkZSkKKworc3RhdGljIERCdXNBdXRoKgorX2RidXNfYXV0aF9uZXcgKGludCBzaXplKQoreworICBEQnVzQXV0aCAqYXV0aDsKKyAgCisgIGF1dGggPSBkYnVzX21hbGxvYzAgKHNpemUpOworICBpZiAoYXV0aCA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworICAKKyAgYXV0aC0+cmVmY291bnQgPSAxOworICAKKyAgYXV0aC0+a2V5cmluZyA9IE5VTEw7CisgIGF1dGgtPmNvb2tpZV9pZCA9IC0xOworICAKKyAgLyogbm90ZSB0aGF0IHdlIGRvbid0IHVzZSB0aGUgbWF4IHN0cmluZyBsZW5ndGggZmVhdHVyZSwKKyAgICogYmVjYXVzZSB5b3UgY2FuJ3QgdXNlIHRoYXQgZmVhdHVyZSBpZiB5b3UncmUgZ29pbmcgdG8KKyAgICogdHJ5IHRvIHJlY292ZXIgZnJvbSBvdXQtb2YtbWVtb3J5IChpdCBjcmVhdGVzCisgICAqIHdoYXQgbG9va3MgbGlrZSB1bnJlY292ZXJhYmxlIGluYWJpbGl0eSB0byBhbGxvYworICAgKiBtb3JlIHNwYWNlIGluIHRoZSBzdHJpbmcpLiBCdXQgd2UgZG8gaGFuZGxlCisgICAqIG92ZXJsb25nIGJ1ZmZlcnMgaW4gX2RidXNfYXV0aF9kb193b3JrKCkuCisgICAqLworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmF1dGgtPmluY29taW5nKSkKKyAgICBnb3RvIGVub21lbV8wOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZhdXRoLT5vdXRnb2luZykpCisgICAgZ290byBlbm9tZW1fMTsKKyAgICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmF1dGgtPmlkZW50aXR5KSkKKyAgICBnb3RvIGVub21lbV8yOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZhdXRoLT5jb250ZXh0KSkKKyAgICBnb3RvIGVub21lbV8zOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZhdXRoLT5jaGFsbGVuZ2UpKQorICAgIGdvdG8gZW5vbWVtXzQ7CisKKyAgLyogZGVmYXVsdCBjb250ZXh0IGlmIG5vbmUgaXMgc3BlY2lmaWVkICovCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmF1dGgtPmNvbnRleHQsICJvcmdfZnJlZWRlc2t0b3BfZ2VuZXJhbCIpKQorICAgIGdvdG8gZW5vbWVtXzU7CisKKyAgYXV0aC0+Y3JlZGVudGlhbHMgPSBfZGJ1c19jcmVkZW50aWFsc19uZXcgKCk7CisgIGlmIChhdXRoLT5jcmVkZW50aWFscyA9PSBOVUxMKQorICAgIGdvdG8gZW5vbWVtXzY7CisgIAorICBhdXRoLT5hdXRob3JpemVkX2lkZW50aXR5ID0gX2RidXNfY3JlZGVudGlhbHNfbmV3ICgpOworICBpZiAoYXV0aC0+YXV0aG9yaXplZF9pZGVudGl0eSA9PSBOVUxMKQorICAgIGdvdG8gZW5vbWVtXzc7CisKKyAgYXV0aC0+ZGVzaXJlZF9pZGVudGl0eSA9IF9kYnVzX2NyZWRlbnRpYWxzX25ldyAoKTsKKyAgaWYgKGF1dGgtPmRlc2lyZWRfaWRlbnRpdHkgPT0gTlVMTCkKKyAgICBnb3RvIGVub21lbV84OworICAKKyAgcmV0dXJuIGF1dGg7CisKKyNpZiAwCisgZW5vbWVtXzk6CisgIF9kYnVzX2NyZWRlbnRpYWxzX3VucmVmIChhdXRoLT5kZXNpcmVkX2lkZW50aXR5KTsKKyNlbmRpZgorIGVub21lbV84OgorICBfZGJ1c19jcmVkZW50aWFsc191bnJlZiAoYXV0aC0+YXV0aG9yaXplZF9pZGVudGl0eSk7CisgZW5vbWVtXzc6CisgIF9kYnVzX2NyZWRlbnRpYWxzX3VucmVmIChhdXRoLT5jcmVkZW50aWFscyk7CisgZW5vbWVtXzY6CisgLyogbGFzdCBhbGxvYyB3YXMgYW4gYXBwZW5kIHRvIGNvbnRleHQsIHdoaWNoIGlzIGZyZWVkIGFscmVhZHkgYmVsb3cgKi8gOworIGVub21lbV81OgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJmF1dGgtPmNoYWxsZW5nZSk7CisgZW5vbWVtXzQ6CisgIF9kYnVzX3N0cmluZ19mcmVlICgmYXV0aC0+Y29udGV4dCk7CisgZW5vbWVtXzM6CisgIF9kYnVzX3N0cmluZ19mcmVlICgmYXV0aC0+aWRlbnRpdHkpOworIGVub21lbV8yOgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJmF1dGgtPm91dGdvaW5nKTsKKyBlbm9tZW1fMToKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZhdXRoLT5pbmNvbWluZyk7CisgZW5vbWVtXzA6CisgIGRidXNfZnJlZSAoYXV0aCk7CisgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZAorc2h1dGRvd25fbWVjaCAoREJ1c0F1dGggKmF1dGgpCit7CisgIC8qIENhbmNlbCBhbnkgYXV0aCAqLworICBhdXRoLT5hbHJlYWR5X2Fza2VkX2Zvcl9pbml0aWFsX3Jlc3BvbnNlID0gRkFMU0U7CisgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoICgmYXV0aC0+aWRlbnRpdHksIDApOworCisgIF9kYnVzX2NyZWRlbnRpYWxzX2NsZWFyIChhdXRoLT5hdXRob3JpemVkX2lkZW50aXR5KTsKKyAgX2RidXNfY3JlZGVudGlhbHNfY2xlYXIgKGF1dGgtPmRlc2lyZWRfaWRlbnRpdHkpOworICAKKyAgaWYgKGF1dGgtPm1lY2ggIT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiJXM6IFNodXR0aW5nIGRvd24gbWVjaGFuaXNtICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgREJVU19BVVRIX05BTUUgKGF1dGgpLCBhdXRoLT5tZWNoLT5tZWNoYW5pc20pOworICAgICAgCisgICAgICBpZiAoREJVU19BVVRIX0lTX0NMSUVOVCAoYXV0aCkpCisgICAgICAgICgqIGF1dGgtPm1lY2gtPmNsaWVudF9zaHV0ZG93bl9mdW5jKSAoYXV0aCk7CisgICAgICBlbHNlCisgICAgICAgICgqIGF1dGgtPm1lY2gtPnNlcnZlcl9zaHV0ZG93bl9mdW5jKSAoYXV0aCk7CisgICAgICAKKyAgICAgIGF1dGgtPm1lY2ggPSBOVUxMOworICAgIH0KK30KKworLyoKKyAqIERCVVNfQ09PS0lFX1NIQTEgbWVjaGFuaXNtCisgKi8KKworLyogUmV0dXJucyBUUlVFIGJ1dCB3aXRoIGFuIGVtcHR5IHN0cmluZyBoYXNoIGlmIHRoZQorICogY29va2llX2lkIGlzbid0IGtub3duLiBBcyB3aXRoIGFsbCB0aGlzIGNvZGUKKyAqIFRSVUUganVzdCBtZWFucyB3ZSBoYWQgZW5vdWdoIG1lbW9yeS4KKyAqLworc3RhdGljIGRidXNfYm9vbF90CitzaGExX2NvbXB1dGVfaGFzaCAoREJ1c0F1dGggICAgICAgICAqYXV0aCwKKyAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBjb29raWVfaWQsCisgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqc2VydmVyX2NoYWxsZW5nZSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpjbGllbnRfY2hhbGxlbmdlLAorICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgKmhhc2gpCit7CisgIERCdXNTdHJpbmcgY29va2llOworICBEQnVzU3RyaW5nIHRvX2hhc2g7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgCisgIF9kYnVzX2Fzc2VydCAoYXV0aC0+a2V5cmluZyAhPSBOVUxMKTsKKworICByZXR2YWwgPSBGQUxTRTsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZjb29raWUpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIV9kYnVzX2tleXJpbmdfZ2V0X2hleF9rZXkgKGF1dGgtPmtleXJpbmcsIGNvb2tpZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29va2llKSkKKyAgICBnb3RvIG91dF8wOworCisgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmNvb2tpZSkgPT0gMCkKKyAgICB7CisgICAgICByZXR2YWwgPSBUUlVFOworICAgICAgZ290byBvdXRfMDsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnRvX2hhc2gpKQorICAgIGdvdG8gb3V0XzA7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5IChzZXJ2ZXJfY2hhbGxlbmdlLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdG9faGFzaCwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZ0b19oYXNoKSkpCisgICAgZ290byBvdXRfMTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZ0b19oYXNoLCAiOiIpKQorICAgIGdvdG8gb3V0XzE7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5IChjbGllbnRfY2hhbGxlbmdlLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdG9faGFzaCwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZ0b19oYXNoKSkpCisgICAgZ290byBvdXRfMTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZ0b19oYXNoLCAiOiIpKQorICAgIGdvdG8gb3V0XzE7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAoJmNvb2tpZSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRvX2hhc2gsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmdG9faGFzaCkpKQorICAgIGdvdG8gb3V0XzE7CisKKyAgaWYgKCFfZGJ1c19zaGFfY29tcHV0ZSAoJnRvX2hhc2gsIGhhc2gpKQorICAgIGdvdG8gb3V0XzE7CisgIAorICByZXR2YWwgPSBUUlVFOworCisgb3V0XzE6CisgIF9kYnVzX3N0cmluZ196ZXJvICgmdG9faGFzaCk7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmdG9faGFzaCk7Cisgb3V0XzA6CisgIF9kYnVzX3N0cmluZ196ZXJvICgmY29va2llKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZjb29raWUpOworICByZXR1cm4gcmV0dmFsOworfQorCisvKiogaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMjgzMS50eHQgc3VnZ2VzdHMgYXQgbGVhc3QgNjQgYml0cyBvZgorICogZW50cm9weSwgd2UgdXNlIDEyOC4gVGhpcyBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSByYW5kb20KKyAqIGNoYWxsZW5nZS4KKyAqLworI2RlZmluZSBOX0NIQUxMRU5HRV9CWVRFUyAoMTI4LzgpCisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorc2hhMV9oYW5kbGVfZmlyc3RfY2xpZW50X3Jlc3BvbnNlIChEQnVzQXV0aCAgICAgICAgICphdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpkYXRhKQoreworICAvKiBXZSBoYXZlbid0IHNlbnQgYSBjaGFsbGVuZ2UgeWV0LCB3ZSdyZSBleHBlY3RpbmcgYSBkZXNpcmVkCisgICAqIHVzZXJuYW1lIGZyb20gdGhlIGNsaWVudC4KKyAgICovCisgIERCdXNTdHJpbmcgdG1wOworICBEQnVzU3RyaW5nIHRtcDI7CisgIGRidXNfYm9vbF90IHJldHZhbCA9IEZBTFNFOworICBEQnVzRXJyb3IgZXJyb3IgPSBEQlVTX0VSUk9SX0lOSVQ7CisgIERCdXNDcmVkZW50aWFscyAqbXlzZWxmID0gTlVMTDsKKworICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoJmF1dGgtPmNoYWxsZW5nZSwgMCk7CisgIAorICBpZiAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGRhdGEpID4gMCkKKyAgICB7CisgICAgICBpZiAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZhdXRoLT5pZGVudGl0eSkgPiAwKQorICAgICAgICB7CisgICAgICAgICAgLyogVHJpZWQgdG8gc2VuZCB0d28gYXV0aCBpZGVudGl0aWVzLCB3dGYgKi8KKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiJXM6IGNsaWVudCB0cmllZCB0byBzZW5kIGF1dGggaWRlbnRpdHksIGJ1dCB3ZSBhbHJlYWR5IGhhdmUgb25lXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfQVVUSF9OQU1FIChhdXRoKSk7CisgICAgICAgICAgcmV0dXJuIHNlbmRfcmVqZWN0ZWQgKGF1dGgpOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvKiB0aGlzIGlzIG91ciBhdXRoIGlkZW50aXR5ICovCisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAoZGF0YSwgMCwgJmF1dGgtPmlkZW50aXR5LCAwKSkKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKyAgICAgIAorICBpZiAoIV9kYnVzX2NyZWRlbnRpYWxzX2FkZF9mcm9tX3VzZXIgKGF1dGgtPmRlc2lyZWRfaWRlbnRpdHksIGRhdGEpKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCIlczogRGlkIG5vdCBnZXQgYSB2YWxpZCB1c2VybmFtZSBmcm9tIGNsaWVudFxuIiwKKyAgICAgICAgICAgICAgICAgICAgIERCVVNfQVVUSF9OQU1FIChhdXRoKSk7CisgICAgICByZXR1cm4gc2VuZF9yZWplY3RlZCAoYXV0aCk7CisgICAgfQorICAgICAgCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZ0bXApKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmdG1wMikpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ0bXApOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBteXNlbGYgPSBfZGJ1c19jcmVkZW50aWFsc19uZXdfZnJvbV9jdXJyZW50X3Byb2Nlc3MgKCk7CisKKyAgaWYgKG15c2VsZiA9PSBOVUxMKQorICAgIGdvdG8gb3V0OworCisgIGlmICghX2RidXNfY3JlZGVudGlhbHNfc2FtZV91c2VyIChteXNlbGYsIGF1dGgtPmRlc2lyZWRfaWRlbnRpdHkpKQorICAgIHsKKyAgICAgIC8qCisgICAgICAgKiBEQlVTX0NPT0tJRV9TSEExIGlzIG5vdCBzdWl0YWJsZSBmb3IgYXV0aGVudGljYXRpbmcgdGhhdCB0aGUKKyAgICAgICAqIGNsaWVudCBpcyBhbnlvbmUgb3RoZXIgdGhhbiB0aGUgdXNlciBvd25pbmcgdGhlIHByb2Nlc3MKKyAgICAgICAqIGNvbnRhaW5pbmcgdGhlIERCdXNTZXJ2ZXI6IHdlIHByb2JhYmx5IGFyZW4ndCBhbGxvd2VkIHRvIHdyaXRlCisgICAgICAgKiB0byBvdGhlciB1c2VycycgaG9tZSBkaXJlY3Rvcmllcy4gRXZlbiBpZiB3ZSBjYW4gKGZvciBleGFtcGxlCisgICAgICAgKiB1aWQgMCBvbiB0cmFkaXRpb25hbCBVbml4IG9yIENBUF9EQUNfT1ZFUlJJREUgb24gTGludXgpLCB3ZQorICAgICAgICogbXVzdCBub3QsIGJlY2F1c2UgdGhlIG90aGVyIHVzZXIgY29udHJvbHMgdGhlaXIgaG9tZSBkaXJlY3RvcnksCisgICAgICAgKiBhbmQgY291bGQgY2Fycnkgb3V0IHN5bWxpbmsgYXR0YWNrcyB0byBtYWtlIHVzIHJlYWQgZnJvbSBvcgorICAgICAgICogd3JpdGUgdG8gdW5pbnRlbmRlZCBsb2NhdGlvbnMuIEl0J3MgZGlmZmljdWx0IHRvIGF2b2lkIHN5bWxpbmsKKyAgICAgICAqIGF0dGFja3MgaW4gYSBwb3J0YWJsZSB3YXksIHNvIHdlIGp1c3QgZG9uJ3QgdHJ5LiBUaGlzIGlzbid0IGEKKyAgICAgICAqIHJlZ3Jlc3Npb24sIGJlY2F1c2UgREJVU19DT09LSUVfU0hBMSBuZXZlciB3b3JrZWQgZm9yIG90aGVyCisgICAgICAgKiB1c2VycyBhbnl3YXkuCisgICAgICAgKi8KKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCIlczogY2xpZW50IHRyaWVkIHRvIGF1dGhlbnRpY2F0ZSBhcyBcIiVzXCIsICIKKyAgICAgICAgICAgICAgICAgICAgICJidXQgdGhhdCBkb2Vzbid0IG1hdGNoIHRoaXMgcHJvY2VzcyIsCisgICAgICAgICAgICAgICAgICAgICBEQlVTX0FVVEhfTkFNRSAoYXV0aCksCisgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKGRhdGEpKTsKKyAgICAgIHJldHZhbCA9IHNlbmRfcmVqZWN0ZWQgKGF1dGgpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIC8qIHdlIGNhY2hlIHRoZSBrZXlyaW5nIGZvciBzcGVlZCwgc28gaGVyZSB3ZSBkcm9wIGl0IGlmIGl0J3MgdGhlCisgICAqIHdyb25nIG9uZS4gRklYTUUgY2FjaGluZyB0aGUga2V5cmluZyBoZXJlIGlzIHVzZWxlc3Mgc2luY2Ugd2UgdXNlCisgICAqIGEgZGlmZmVyZW50IERCdXNBdXRoIGZvciBldmVyeSBjb25uZWN0aW9uLgorICAgKi8KKyAgaWYgKGF1dGgtPmtleXJpbmcgJiYKKyAgICAgICFfZGJ1c19rZXlyaW5nX2lzX2Zvcl9jcmVkZW50aWFscyAoYXV0aC0+a2V5cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aC0+ZGVzaXJlZF9pZGVudGl0eSkpCisgICAgeworICAgICAgX2RidXNfa2V5cmluZ191bnJlZiAoYXV0aC0+a2V5cmluZyk7CisgICAgICBhdXRoLT5rZXlyaW5nID0gTlVMTDsKKyAgICB9CisgIAorICBpZiAoYXV0aC0+a2V5cmluZyA9PSBOVUxMKQorICAgIHsKKyAgICAgIGF1dGgtPmtleXJpbmcgPSBfZGJ1c19rZXlyaW5nX25ld19mb3JfY3JlZGVudGlhbHMgKGF1dGgtPmRlc2lyZWRfaWRlbnRpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXV0aC0+Y29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcik7CisKKyAgICAgIGlmIChhdXRoLT5rZXlyaW5nID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoZGJ1c19lcnJvcl9oYXNfbmFtZSAoJmVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0VSUk9SX05PX01FTU9SWSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUICgmZXJyb3IpOworICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiJXM6IEVycm9yIGxvYWRpbmcga2V5cmluZzogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfQVVUSF9OQU1FIChhdXRoKSwgZXJyb3IubWVzc2FnZSk7CisgICAgICAgICAgICAgIGlmIChzZW5kX3JlamVjdGVkIChhdXRoKSkKKyAgICAgICAgICAgICAgICByZXR2YWwgPSBUUlVFOyAvKiByZXR2YWwgaXMgb25seSBhYm91dCBtZW0gKi8KKyAgICAgICAgICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfYXNzZXJ0ICghZGJ1c19lcnJvcl9pc19zZXQgKCZlcnJvcikpOworICAgICAgICB9CisgICAgfQorCisgIF9kYnVzX2Fzc2VydCAoYXV0aC0+a2V5cmluZyAhPSBOVUxMKTsKKworICBhdXRoLT5jb29raWVfaWQgPSBfZGJ1c19rZXlyaW5nX2dldF9iZXN0X2tleSAoYXV0aC0+a2V5cmluZywgJmVycm9yKTsKKyAgaWYgKGF1dGgtPmNvb2tpZV9pZCA8IDApCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoJmVycm9yKTsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCIlczogQ291bGQgbm90IGdldCBhIGNvb2tpZSBJRCB0byBzZW5kIHRvIGNsaWVudDogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICBEQlVTX0FVVEhfTkFNRSAoYXV0aCksIGVycm9yLm1lc3NhZ2UpOworICAgICAgaWYgKHNlbmRfcmVqZWN0ZWQgKGF1dGgpKQorICAgICAgICByZXR2YWwgPSBUUlVFOworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgZ290byBvdXQ7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0ICghZGJ1c19lcnJvcl9pc19zZXQgKCZlcnJvcikpOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5ICgmYXV0aC0+Y29udGV4dCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRtcDIsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmdG1wMikpKQorICAgIGdvdG8gb3V0OworCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnRtcDIsICIgIikpCisgICAgZ290byBvdXQ7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX2ludCAoJnRtcDIsIGF1dGgtPmNvb2tpZV9pZCkpCisgICAgZ290byBvdXQ7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmdG1wMiwgIiAiKSkKKyAgICBnb3RvIG91dDsgIAorICAKKyAgaWYgKCFfZGJ1c19nZW5lcmF0ZV9yYW5kb21fYnl0ZXMgKCZ0bXAsIE5fQ0hBTExFTkdFX0JZVEVTLCAmZXJyb3IpKQorICAgIHsKKyAgICAgIGlmIChkYnVzX2Vycm9yX2hhc19uYW1lICgmZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZKSkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoJmVycm9yKTsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiJXM6IEVycm9yIGdlbmVyYXRpbmcgY2hhbGxlbmdlOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0FVVEhfTkFNRSAoYXV0aCksIGVycm9yLm1lc3NhZ2UpOworICAgICAgICAgIGlmIChzZW5kX3JlamVjdGVkIChhdXRoKSkKKyAgICAgICAgICAgIHJldHZhbCA9IFRSVUU7IC8qIHJldHZhbCBpcyBvbmx5IGFib3V0IG1lbSAqLworCisgICAgICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgfQorCisgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoICgmYXV0aC0+Y2hhbGxlbmdlLCAwKTsKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaGV4X2VuY29kZSAoJnRtcCwgMCwgJmF1dGgtPmNoYWxsZW5nZSwgMCkpCisgICAgZ290byBvdXQ7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19oZXhfZW5jb2RlICgmdG1wLCAwLCAmdG1wMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZ0bXAyKSkpCisgICAgZ290byBvdXQ7CisKKyAgaWYgKCFzZW5kX2RhdGEgKGF1dGgsICZ0bXAyKSkKKyAgICBnb3RvIG91dDsKKyAgICAgIAorICBnb3RvX3N0YXRlIChhdXRoLCAmc2VydmVyX3N0YXRlX3dhaXRpbmdfZm9yX2RhdGEpOworICByZXR2YWwgPSBUUlVFOworICAKKyBvdXQ6CisgIF9kYnVzX3N0cmluZ196ZXJvICgmdG1wKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ0bXApOworICBfZGJ1c19zdHJpbmdfemVybyAoJnRtcDIpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnRtcDIpOworCisgIGlmIChteXNlbGYgIT0gTlVMTCkKKyAgICBfZGJ1c19jcmVkZW50aWFsc191bnJlZiAobXlzZWxmKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3NoYTFfaGFuZGxlX3NlY29uZF9jbGllbnRfcmVzcG9uc2UgKERCdXNBdXRoICAgICAgICAgKmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpkYXRhKQoreworICAvKiBXZSBhcmUgZXhwZWN0aW5nIGEgcmVzcG9uc2Ugd2hpY2ggaXMgdGhlIGhleC1lbmNvZGVkIGNsaWVudAorICAgKiBjaGFsbGVuZ2UsIHNwYWNlLCB0aGVuIFNIQS0xIGhhc2ggb2YgdGhlIGNvbmNhdGVuYXRpb24gb2Ygb3VyCisgICAqIGNoYWxsZW5nZSwgIjoiLCBjbGllbnQgY2hhbGxlbmdlLCAiOiIsIHNlY3JldCBrZXksIGFsbAorICAgKiBoZXgtZW5jb2RlZC4KKyAgICovCisgIGludCBpOworICBEQnVzU3RyaW5nIGNsaWVudF9jaGFsbGVuZ2U7CisgIERCdXNTdHJpbmcgY2xpZW50X2hhc2g7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgREJ1c1N0cmluZyBjb3JyZWN0X2hhc2g7CisgIAorICByZXR2YWwgPSBGQUxTRTsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2ZpbmRfYmxhbmsgKGRhdGEsIDAsICZpKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiJXM6IG5vIHNwYWNlIHNlcGFyYXRvciBpbiBjbGllbnQgcmVzcG9uc2VcbiIsCisgICAgICAgICAgICAgICAgICAgICBEQlVTX0FVVEhfTkFNRSAoYXV0aCkpOworICAgICAgcmV0dXJuIHNlbmRfcmVqZWN0ZWQgKGF1dGgpOworICAgIH0KKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZjbGllbnRfY2hhbGxlbmdlKSkKKyAgICBnb3RvIG91dF8wOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZjbGllbnRfaGFzaCkpCisgICAgZ290byBvdXRfMTsgIAorCisgIGlmICghX2RidXNfc3RyaW5nX2NvcHlfbGVuIChkYXRhLCAwLCBpLCAmY2xpZW50X2NoYWxsZW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApKQorICAgIGdvdG8gb3V0XzI7CisKKyAgX2RidXNfc3RyaW5nX3NraXBfYmxhbmsgKGRhdGEsIGksICZpKTsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2NvcHlfbGVuIChkYXRhLCBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGRhdGEpIC0gaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjbGllbnRfaGFzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApKQorICAgIGdvdG8gb3V0XzI7CisKKyAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmY2xpZW50X2NoYWxsZW5nZSkgPT0gMCB8fAorICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZjbGllbnRfaGFzaCkgPT0gMCkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiJXM6IHplcm8tbGVuZ3RoIGNsaWVudCBjaGFsbGVuZ2Ugb3IgaGFzaFxuIiwKKyAgICAgICAgICAgICAgICAgICAgIERCVVNfQVVUSF9OQU1FIChhdXRoKSk7CisgICAgICBpZiAoc2VuZF9yZWplY3RlZCAoYXV0aCkpCisgICAgICAgIHJldHZhbCA9IFRSVUU7CisgICAgICBnb3RvIG91dF8yOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmY29ycmVjdF9oYXNoKSkKKyAgICBnb3RvIG91dF8yOworCisgIGlmICghc2hhMV9jb21wdXRlX2hhc2ggKGF1dGgsIGF1dGgtPmNvb2tpZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmF1dGgtPmNoYWxsZW5nZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjbGllbnRfY2hhbGxlbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY29ycmVjdF9oYXNoKSkKKyAgICBnb3RvIG91dF8zOworCisgIC8qIGlmIGNvb2tpZV9pZCB3YXMgaW52YWxpZCwgdGhlbiB3ZSBnZXQgYW4gZW1wdHkgaGFzaCAqLworICBpZiAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZjb3JyZWN0X2hhc2gpID09IDApCisgICAgeworICAgICAgaWYgKHNlbmRfcmVqZWN0ZWQgKGF1dGgpKQorICAgICAgICByZXR2YWwgPSBUUlVFOworICAgICAgZ290byBvdXRfMzsKKyAgICB9CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19lcXVhbCAoJmNsaWVudF9oYXNoLCAmY29ycmVjdF9oYXNoKSkKKyAgICB7CisgICAgICBpZiAoc2VuZF9yZWplY3RlZCAoYXV0aCkpCisgICAgICAgIHJldHZhbCA9IFRSVUU7CisgICAgICBnb3RvIG91dF8zOworICAgIH0KKworICBpZiAoIV9kYnVzX2NyZWRlbnRpYWxzX2FkZF9jcmVkZW50aWFscyAoYXV0aC0+YXV0aG9yaXplZF9pZGVudGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGgtPmRlc2lyZWRfaWRlbnRpdHkpKQorICAgIGdvdG8gb3V0XzM7CisKKyAgLyogQ29weSBwcm9jZXNzIElEIGZyb20gdGhlIHNvY2tldCBjcmVkZW50aWFscyBpZiBpdCdzIHRoZXJlCisgICAqLworICBpZiAoIV9kYnVzX2NyZWRlbnRpYWxzX2FkZF9jcmVkZW50aWFsIChhdXRoLT5hdXRob3JpemVkX2lkZW50aXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0NSRURFTlRJQUxfVU5JWF9QUk9DRVNTX0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRoLT5jcmVkZW50aWFscykpCisgICAgZ290byBvdXRfMzsKKyAgCisgIGlmICghc2VuZF9vayAoYXV0aCkpCisgICAgZ290byBvdXRfMzsKKworICBfZGJ1c192ZXJib3NlICgiJXM6IGF1dGhlbnRpY2F0ZWQgY2xpZW50IHVzaW5nIERCVVNfQ09PS0lFX1NIQTFcbiIsCisgICAgICAgICAgICAgICAgIERCVVNfQVVUSF9OQU1FIChhdXRoKSk7CisgIAorICByZXR2YWwgPSBUUlVFOworICAKKyBvdXRfMzoKKyAgX2RidXNfc3RyaW5nX3plcm8gKCZjb3JyZWN0X2hhc2gpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmNvcnJlY3RfaGFzaCk7Cisgb3V0XzI6CisgIF9kYnVzX3N0cmluZ196ZXJvICgmY2xpZW50X2hhc2gpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmNsaWVudF9oYXNoKTsKKyBvdXRfMToKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZjbGllbnRfY2hhbGxlbmdlKTsKKyBvdXRfMDoKKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitoYW5kbGVfc2VydmVyX2RhdGFfY29va2llX3NoYTFfbWVjaCAoREJ1c0F1dGggICAgICAgICAqYXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpkYXRhKQoreworICBpZiAoYXV0aC0+Y29va2llX2lkIDwgMCkKKyAgICByZXR1cm4gc2hhMV9oYW5kbGVfZmlyc3RfY2xpZW50X3Jlc3BvbnNlIChhdXRoLCBkYXRhKTsKKyAgZWxzZQorICAgIHJldHVybiBzaGExX2hhbmRsZV9zZWNvbmRfY2xpZW50X3Jlc3BvbnNlIChhdXRoLCBkYXRhKTsKK30KKworc3RhdGljIHZvaWQKK2hhbmRsZV9zZXJ2ZXJfc2h1dGRvd25fY29va2llX3NoYTFfbWVjaCAoREJ1c0F1dGggKmF1dGgpCit7CisgIGF1dGgtPmNvb2tpZV9pZCA9IC0xOyAgCisgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoICgmYXV0aC0+Y2hhbGxlbmdlLCAwKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitoYW5kbGVfY2xpZW50X2luaXRpYWxfcmVzcG9uc2VfY29va2llX3NoYTFfbWVjaCAoREJ1c0F1dGggICAqYXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICpyZXNwb25zZSkKK3sKKyAgREJ1c1N0cmluZyB1c2VybmFtZTsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworCisgIHJldHZhbCA9IEZBTFNFOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZ1c2VybmFtZSkpCisgICAgcmV0dXJuIEZBTFNFOworICAKKyAgaWYgKCFfZGJ1c19hcHBlbmRfdXNlcl9mcm9tX2N1cnJlbnRfcHJvY2VzcyAoJnVzZXJuYW1lKSkKKyAgICBnb3RvIG91dF8wOworCisgIGlmICghX2RidXNfc3RyaW5nX2hleF9lbmNvZGUgKCZ1c2VybmFtZSwgMCwKKwkJCQlyZXNwb25zZSwKKwkJCQlfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAocmVzcG9uc2UpKSkKKyAgICBnb3RvIG91dF8wOworCisgIHJldHZhbCA9IFRSVUU7CisgIAorIG91dF8wOgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJnVzZXJuYW1lKTsKKyAgCisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAoraGFuZGxlX2NsaWVudF9kYXRhX2Nvb2tpZV9zaGExX21lY2ggKERCdXNBdXRoICAgICAgICAgKmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqZGF0YSkKK3sKKyAgLyogVGhlIGRhdGEgd2UgZ2V0IGZyb20gdGhlIHNlcnZlciBzaG91bGQgYmUgdGhlIGNvb2tpZSBjb250ZXh0CisgICAqIG5hbWUsIHRoZSBjb29raWUgSUQsIGFuZCB0aGUgc2VydmVyIGNoYWxsZW5nZSwgc2VwYXJhdGVkIGJ5CisgICAqIHNwYWNlcy4gV2Ugc2VuZCBiYWNrIG91ciBjaGFsbGVuZ2Ugc3RyaW5nIGFuZCB0aGUgY29ycmVjdCBoYXNoLgorICAgKi8KKyAgZGJ1c19ib29sX3QgcmV0dmFsID0gRkFMU0U7CisgIERCdXNTdHJpbmcgY29udGV4dDsKKyAgREJ1c1N0cmluZyBjb29raWVfaWRfc3RyOworICBEQnVzU3RyaW5nIHNlcnZlcl9jaGFsbGVuZ2U7CisgIERCdXNTdHJpbmcgY2xpZW50X2NoYWxsZW5nZTsKKyAgREJ1c1N0cmluZyBjb3JyZWN0X2hhc2g7CisgIERCdXNTdHJpbmcgdG1wOworICBpbnQgaSwgajsKKyAgbG9uZyB2YWw7CisgIERCdXNFcnJvciBlcnJvciA9IERCVVNfRVJST1JfSU5JVDsKKworICBpZiAoIV9kYnVzX3N0cmluZ19maW5kX2JsYW5rIChkYXRhLCAwLCAmaSkpCisgICAgeworICAgICAgaWYgKHNlbmRfZXJyb3IgKGF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgIlNlcnZlciBkaWQgbm90IHNlbmQgY29udGV4dC9JRC9jaGFsbGVuZ2UgcHJvcGVybHkiKSkKKyAgICAgICAgcmV0dmFsID0gVFJVRTsKKyAgICAgIGdvdG8gb3V0XzA7CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZjb250ZXh0KSkKKyAgICBnb3RvIG91dF8wOworCisgIGlmICghX2RidXNfc3RyaW5nX2NvcHlfbGVuIChkYXRhLCAwLCBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbnRleHQsIDApKQorICAgIGdvdG8gb3V0XzE7CisgIAorICBfZGJ1c19zdHJpbmdfc2tpcF9ibGFuayAoZGF0YSwgaSwgJmkpOworICBpZiAoIV9kYnVzX3N0cmluZ19maW5kX2JsYW5rIChkYXRhLCBpLCAmaikpCisgICAgeworICAgICAgaWYgKHNlbmRfZXJyb3IgKGF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgIlNlcnZlciBkaWQgbm90IHNlbmQgY29udGV4dC9JRC9jaGFsbGVuZ2UgcHJvcGVybHkiKSkKKyAgICAgICAgcmV0dmFsID0gVFJVRTsKKyAgICAgIGdvdG8gb3V0XzE7CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZjb29raWVfaWRfc3RyKSkKKyAgICBnb3RvIG91dF8xOworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weV9sZW4gKGRhdGEsIGksIGogLSBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvb2tpZV9pZF9zdHIsIDApKQorICAgIGdvdG8gb3V0XzI7ICAKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmc2VydmVyX2NoYWxsZW5nZSkpCisgICAgZ290byBvdXRfMjsKKworICBpID0gajsKKyAgX2RidXNfc3RyaW5nX3NraXBfYmxhbmsgKGRhdGEsIGksICZpKTsKKyAgaiA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChkYXRhKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5X2xlbiAoZGF0YSwgaSwgaiAtIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VydmVyX2NoYWxsZW5nZSwgMCkpCisgICAgZ290byBvdXRfMzsKKworICBpZiAoIV9kYnVzX2tleXJpbmdfdmFsaWRhdGVfY29udGV4dCAoJmNvbnRleHQpKQorICAgIHsKKyAgICAgIGlmIChzZW5kX2Vycm9yIChhdXRoLCAiU2VydmVyIHNlbnQgaW52YWxpZCBjb29raWUgY29udGV4dCIpKQorICAgICAgICByZXR2YWwgPSBUUlVFOworICAgICAgZ290byBvdXRfMzsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfcGFyc2VfaW50ICgmY29va2llX2lkX3N0ciwgMCwgJnZhbCwgTlVMTCkpCisgICAgeworICAgICAgaWYgKHNlbmRfZXJyb3IgKGF1dGgsICJDb3VsZCBub3QgcGFyc2UgY29va2llIElEIGFzIGFuIGludGVnZXIiKSkKKyAgICAgICAgcmV0dmFsID0gVFJVRTsKKyAgICAgIGdvdG8gb3V0XzM7CisgICAgfQorCisgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnNlcnZlcl9jaGFsbGVuZ2UpID09IDApCisgICAgeworICAgICAgaWYgKHNlbmRfZXJyb3IgKGF1dGgsICJFbXB0eSBzZXJ2ZXIgY2hhbGxlbmdlIHN0cmluZyIpKQorICAgICAgICByZXR2YWwgPSBUUlVFOworICAgICAgZ290byBvdXRfMzsKKyAgICB9CisKKyAgaWYgKGF1dGgtPmtleXJpbmcgPT0gTlVMTCkKKyAgICB7CisgICAgICBhdXRoLT5rZXlyaW5nID0gX2RidXNfa2V5cmluZ19uZXdfZm9yX2NyZWRlbnRpYWxzIChOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpOworCisgICAgICBpZiAoYXV0aC0+a2V5cmluZyA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGRidXNfZXJyb3JfaGFzX25hbWUgKCZlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9OT19NRU1PUlkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICAgICAgICAgIGdvdG8gb3V0XzM7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUICgmZXJyb3IpOworCisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIlczogRXJyb3IgbG9hZGluZyBrZXlyaW5nOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19BVVRIX05BTUUgKGF1dGgpLCBlcnJvci5tZXNzYWdlKTsKKyAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIGlmIChzZW5kX2Vycm9yIChhdXRoLCAiQ291bGQgbm90IGxvYWQgY29va2llIGZpbGUiKSkKKyAgICAgICAgICAgICAgICByZXR2YWwgPSBUUlVFOyAvKiByZXR2YWwgaXMgb25seSBhYm91dCBtZW0gKi8KKyAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgICAgICAgICAgZ290byBvdXRfMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfYXNzZXJ0ICghZGJ1c19lcnJvcl9pc19zZXQgKCZlcnJvcikpOworICAgICAgICB9CisgICAgfQorICAKKyAgX2RidXNfYXNzZXJ0IChhdXRoLT5rZXlyaW5nICE9IE5VTEwpOworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnRtcCkpCisgICAgZ290byBvdXRfMzsKKworICBpZiAoIV9kYnVzX2dlbmVyYXRlX3JhbmRvbV9ieXRlcyAoJnRtcCwgTl9DSEFMTEVOR0VfQllURVMsICZlcnJvcikpCisgICAgeworICAgICAgaWYgKGRidXNfZXJyb3JfaGFzX25hbWUgKCZlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlkpKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgICAgIGdvdG8gb3V0XzQ7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKCZlcnJvcik7CisKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiJXM6IEZhaWxlZCB0byBnZW5lcmF0ZSBjaGFsbGVuZ2U6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfQVVUSF9OQU1FIChhdXRoKSwgZXJyb3IubWVzc2FnZSk7CisKKyAgICAgICAgICBpZiAoc2VuZF9lcnJvciAoYXV0aCwgIkZhaWxlZCB0byBnZW5lcmF0ZSBjaGFsbGVuZ2UiKSkKKyAgICAgICAgICAgIHJldHZhbCA9IFRSVUU7IC8qIHJldHZhbCBpcyBvbmx5IGFib3V0IG1lbSAqLworCisgICAgICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgICAgIGdvdG8gb3V0XzQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmNsaWVudF9jaGFsbGVuZ2UpKQorICAgIGdvdG8gb3V0XzQ7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaGV4X2VuY29kZSAoJnRtcCwgMCwgJmNsaWVudF9jaGFsbGVuZ2UsIDApKQorICAgIGdvdG8gb3V0XzU7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmNvcnJlY3RfaGFzaCkpCisgICAgZ290byBvdXRfNTsKKyAgCisgIGlmICghc2hhMV9jb21wdXRlX2hhc2ggKGF1dGgsIHZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlcnZlcl9jaGFsbGVuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjbGllbnRfY2hhbGxlbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY29ycmVjdF9oYXNoKSkKKyAgICBnb3RvIG91dF82OworCisgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmNvcnJlY3RfaGFzaCkgPT0gMCkKKyAgICB7CisgICAgICAvKiBjb3VsZG4ndCBmaW5kIHRoZSBjb29raWUgSUQgb3Igc29tZXRoaW5nICovCisgICAgICBpZiAoc2VuZF9lcnJvciAoYXV0aCwgIkRvbid0IGhhdmUgdGhlIHJlcXVlc3RlZCBjb29raWUgSUQiKSkKKyAgICAgICAgcmV0dmFsID0gVFJVRTsKKyAgICAgIGdvdG8gb3V0XzY7CisgICAgfQorICAKKyAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKCZ0bXAsIDApOworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAoJmNsaWVudF9jaGFsbGVuZ2UsIDAsICZ0bXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmdG1wKSkpCisgICAgZ290byBvdXRfNjsKKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZ0bXAsICIgIikpCisgICAgZ290byBvdXRfNjsKKworICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5ICgmY29ycmVjdF9oYXNoLCAwLCAmdG1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnRtcCkpKQorICAgIGdvdG8gb3V0XzY7CisKKyAgaWYgKCFzZW5kX2RhdGEgKGF1dGgsICZ0bXApKQorICAgIGdvdG8gb3V0XzY7CisKKyAgcmV0dmFsID0gVFJVRTsKKworIG91dF82OgorICBfZGJ1c19zdHJpbmdfemVybyAoJmNvcnJlY3RfaGFzaCk7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmY29ycmVjdF9oYXNoKTsKKyBvdXRfNToKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZjbGllbnRfY2hhbGxlbmdlKTsKKyBvdXRfNDoKKyAgX2RidXNfc3RyaW5nX3plcm8gKCZ0bXApOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnRtcCk7Cisgb3V0XzM6CisgIF9kYnVzX3N0cmluZ19mcmVlICgmc2VydmVyX2NoYWxsZW5nZSk7Cisgb3V0XzI6CisgIF9kYnVzX3N0cmluZ19mcmVlICgmY29va2llX2lkX3N0cik7Cisgb3V0XzE6CisgIF9kYnVzX3N0cmluZ19mcmVlICgmY29udGV4dCk7Cisgb3V0XzA6CisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkCitoYW5kbGVfY2xpZW50X3NodXRkb3duX2Nvb2tpZV9zaGExX21lY2ggKERCdXNBdXRoICphdXRoKQoreworICBhdXRoLT5jb29raWVfaWQgPSAtMTsgIAorICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoJmF1dGgtPmNoYWxsZW5nZSwgMCk7Cit9CisKKy8qCisgKiBFWFRFUk5BTCBtZWNoYW5pc20KKyAqLworCitzdGF0aWMgZGJ1c19ib29sX3QKK2hhbmRsZV9zZXJ2ZXJfZGF0YV9leHRlcm5hbF9tZWNoIChEQnVzQXV0aCAgICAgICAgICphdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmRhdGEpCit7CisgIGlmIChfZGJ1c19jcmVkZW50aWFsc19hcmVfYW5vbnltb3VzIChhdXRoLT5jcmVkZW50aWFscykpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIiVzOiBubyBjcmVkZW50aWFscywgbWVjaGFuaXNtIEVYVEVSTkFMIGNhbid0IGF1dGhlbnRpY2F0ZVxuIiwKKyAgICAgICAgICAgICAgICAgICAgIERCVVNfQVVUSF9OQU1FIChhdXRoKSk7CisgICAgICByZXR1cm4gc2VuZF9yZWplY3RlZCAoYXV0aCk7CisgICAgfQorICAKKyAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChkYXRhKSA+IDApCisgICAgeworICAgICAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmYXV0aC0+aWRlbnRpdHkpID4gMCkKKyAgICAgICAgeworICAgICAgICAgIC8qIFRyaWVkIHRvIHNlbmQgdHdvIGF1dGggaWRlbnRpdGllcywgd3RmICovCisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiVzOiBjbGllbnQgdHJpZWQgdG8gc2VuZCBhdXRoIGlkZW50aXR5LCBidXQgd2UgYWxyZWFkeSBoYXZlIG9uZVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0FVVEhfTkFNRSAoYXV0aCkpOworICAgICAgICAgIHJldHVybiBzZW5kX3JlamVjdGVkIChhdXRoKTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgLyogdGhpcyBpcyBvdXIgYXV0aCBpZGVudGl0eSAqLworICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2NvcHkgKGRhdGEsIDAsICZhdXRoLT5pZGVudGl0eSwgMCkpCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgLyogUG9rZSBjbGllbnQgZm9yIGFuIGF1dGggaWRlbnRpdHksIGlmIG5vbmUgZ2l2ZW4gKi8KKyAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmYXV0aC0+aWRlbnRpdHkpID09IDAgJiYKKyAgICAgICFhdXRoLT5hbHJlYWR5X2Fza2VkX2Zvcl9pbml0aWFsX3Jlc3BvbnNlKQorICAgIHsKKyAgICAgIGlmIChzZW5kX2RhdGEgKGF1dGgsIE5VTEwpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiVzOiBzZW5kaW5nIGVtcHR5IGNoYWxsZW5nZSBhc2tpbmcgY2xpZW50IGZvciBhdXRoIGlkZW50aXR5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfQVVUSF9OQU1FIChhdXRoKSk7CisgICAgICAgICAgYXV0aC0+YWxyZWFkeV9hc2tlZF9mb3JfaW5pdGlhbF9yZXNwb25zZSA9IFRSVUU7CisgICAgICAgICAgZ290b19zdGF0ZSAoYXV0aCwgJnNlcnZlcl9zdGF0ZV93YWl0aW5nX2Zvcl9kYXRhKTsKKyAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIF9kYnVzX2NyZWRlbnRpYWxzX2NsZWFyIChhdXRoLT5kZXNpcmVkX2lkZW50aXR5KTsKKyAgCisgIC8qIElmIGF1dGgtPmlkZW50aXR5IGlzIHN0aWxsIGVtcHR5IGhlcmUsIHRoZW4gY2xpZW50CisgICAqIHJlc3BvbmRlZCB3aXRoIGFuIGVtcHR5IHN0cmluZyBhZnRlciB3ZSBwb2tlZCBpdCBmb3IKKyAgICogYW4gaW5pdGlhbCByZXNwb25zZS4gVGhpcyBtZWFucyB0byB0cnkgdG8gYXV0aCB0aGUKKyAgICogaWRlbnRpdHkgcHJvdmlkZWQgaW4gdGhlIGNyZWRlbnRpYWxzLgorICAgKi8KKyAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmYXV0aC0+aWRlbnRpdHkpID09IDApCisgICAgeworICAgICAgaWYgKCFfZGJ1c19jcmVkZW50aWFsc19hZGRfY3JlZGVudGlhbHMgKGF1dGgtPmRlc2lyZWRfaWRlbnRpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aC0+Y3JlZGVudGlhbHMpKQorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOyAvKiBPT00gKi8KKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmICghX2RidXNfY3JlZGVudGlhbHNfYWRkX2Zyb21fdXNlciAoYXV0aC0+ZGVzaXJlZF9pZGVudGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmF1dGgtPmlkZW50aXR5KSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIlczogY291bGQgbm90IGdldCBjcmVkZW50aWFscyBmcm9tIHVpZCBzdHJpbmdcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19BVVRIX05BTUUgKGF1dGgpKTsKKyAgICAgICAgICByZXR1cm4gc2VuZF9yZWplY3RlZCAoYXV0aCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgaWYgKF9kYnVzX2NyZWRlbnRpYWxzX2FyZV9hbm9ueW1vdXMgKGF1dGgtPmRlc2lyZWRfaWRlbnRpdHkpKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCIlczogZGVzaXJlZCB1c2VyICVzIGlzIG5vIGdvb2RcbiIsCisgICAgICAgICAgICAgICAgICAgICBEQlVTX0FVVEhfTkFNRSAoYXV0aCksCisgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZhdXRoLT5pZGVudGl0eSkpOworICAgICAgcmV0dXJuIHNlbmRfcmVqZWN0ZWQgKGF1dGgpOworICAgIH0KKyAgCisgIGlmIChfZGJ1c19jcmVkZW50aWFsc19hcmVfc3VwZXJzZXQgKGF1dGgtPmNyZWRlbnRpYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRoLT5kZXNpcmVkX2lkZW50aXR5KSkKKyAgICB7CisgICAgICAvKiBjbGllbnQgaGFzIGF1dGhlbnRpY2F0ZWQgKi8KKyAgICAgIGlmICghX2RidXNfY3JlZGVudGlhbHNfYWRkX2NyZWRlbnRpYWxzIChhdXRoLT5hdXRob3JpemVkX2lkZW50aXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGgtPmRlc2lyZWRfaWRlbnRpdHkpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIC8qIGFsc28gY29weSBtaXNjIHByb2Nlc3MgaW5mbyBmcm9tIHRoZSBzb2NrZXQgY3JlZGVudGlhbHMKKyAgICAgICAqLworICAgICAgaWYgKCFfZGJ1c19jcmVkZW50aWFsc19hZGRfY3JlZGVudGlhbCAoYXV0aC0+YXV0aG9yaXplZF9pZGVudGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfQ1JFREVOVElBTF9VTklYX1BST0NFU1NfSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRoLT5jcmVkZW50aWFscykpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgaWYgKCFfZGJ1c19jcmVkZW50aWFsc19hZGRfY3JlZGVudGlhbCAoYXV0aC0+YXV0aG9yaXplZF9pZGVudGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfQ1JFREVOVElBTF9BRFRfQVVESVRfREFUQV9JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGgtPmNyZWRlbnRpYWxzKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICBpZiAoIV9kYnVzX2NyZWRlbnRpYWxzX2FkZF9jcmVkZW50aWFsIChhdXRoLT5hdXRob3JpemVkX2lkZW50aXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19DUkVERU5USUFMX0xJTlVYX1NFQ1VSSVRZX0xBQkVMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aC0+Y3JlZGVudGlhbHMpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIGlmICghc2VuZF9vayAoYXV0aCkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgX2RidXNfdmVyYm9zZSAoIiVzOiBhdXRoZW50aWNhdGVkIGNsaWVudCBiYXNlZCBvbiBzb2NrZXQgY3JlZGVudGlhbHNcbiIsCisgICAgICAgICAgICAgICAgICAgICBEQlVTX0FVVEhfTkFNRSAoYXV0aCkpOworCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiJXM6IGRlc2lyZWQgaWRlbnRpdHkgbm90IGZvdW5kIGluIHNvY2tldCBjcmVkZW50aWFsc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgIERCVVNfQVVUSF9OQU1FIChhdXRoKSk7CisgICAgICByZXR1cm4gc2VuZF9yZWplY3RlZCAoYXV0aCk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAoraGFuZGxlX3NlcnZlcl9zaHV0ZG93bl9leHRlcm5hbF9tZWNoIChEQnVzQXV0aCAqYXV0aCkKK3sKKworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2hhbmRsZV9jbGllbnRfaW5pdGlhbF9yZXNwb25zZV9leHRlcm5hbF9tZWNoIChEQnVzQXV0aCAgICAgICAgICphdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgKnJlc3BvbnNlKQoreworICAvKiBXZSBhbHdheXMgYXBwZW5kIG91ciBVSUQgYXMgYW4gaW5pdGlhbCByZXNwb25zZSwgc28gdGhlIHNlcnZlcgorICAgKiBkb2Vzbid0IGhhdmUgdG8gc2VuZCBiYWNrIGFuIGVtcHR5IGNoYWxsZW5nZSB0byBjaGVjayB3aGV0aGVyIHdlCisgICAqIHdhbnQgdG8gc3BlY2lmeSBhbiBpZGVudGl0eS4gaS5lLiB0aGlzIGF2b2lkcyBhIHJvdW5kIHRyaXAgdGhhdAorICAgKiB0aGUgc3BlYyBmb3IgdGhlIEVYVEVSTkFMIG1lY2hhbmlzbSBvdGhlcndpc2UgcmVxdWlyZXMuCisgICAqLworICBEQnVzU3RyaW5nIHBsYWludGV4dDsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmcGxhaW50ZXh0KSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFfZGJ1c19hcHBlbmRfdXNlcl9mcm9tX2N1cnJlbnRfcHJvY2VzcyAoJnBsYWludGV4dCkpCisgICAgZ290byBmYWlsZWQ7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaGV4X2VuY29kZSAoJnBsYWludGV4dCwgMCwKKwkJCQlyZXNwb25zZSwKKwkJCQlfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAocmVzcG9uc2UpKSkKKyAgICBnb3RvIGZhaWxlZDsKKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnBsYWludGV4dCk7CisgIAorICByZXR1cm4gVFJVRTsKKworIGZhaWxlZDoKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwbGFpbnRleHQpOworICByZXR1cm4gRkFMU0U7ICAKK30KKworc3RhdGljIGRidXNfYm9vbF90CitoYW5kbGVfY2xpZW50X2RhdGFfZXh0ZXJuYWxfbWVjaCAoREJ1c0F1dGggICAgICAgICAqYXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpkYXRhKQoreworICAKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitoYW5kbGVfY2xpZW50X3NodXRkb3duX2V4dGVybmFsX21lY2ggKERCdXNBdXRoICphdXRoKQoreworCit9CisKKy8qCisgKiBBTk9OWU1PVVMgbWVjaGFuaXNtCisgKi8KKworc3RhdGljIGRidXNfYm9vbF90CitoYW5kbGVfc2VydmVyX2RhdGFfYW5vbnltb3VzX21lY2ggKERCdXNBdXRoICAgICAgICAgKmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmRhdGEpCit7ICAKKyAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChkYXRhKSA+IDApCisgICAgeworICAgICAgLyogQ2xpZW50IGlzIGFsbG93ZWQgdG8gc2VuZCAidHJhY2UiIGRhdGEsIHRoZSBvbmx5IGRlZmluZWQKKyAgICAgICAqIG1lYW5pbmcgaXMgdGhhdCBpZiBpdCBjb250YWlucyAnQCcgaXQgaXMgYW4gZW1haWwgYWRkcmVzcywKKyAgICAgICAqIGFuZCBvdGhlcndpc2UgaXQgaXMgYW55dGhpbmcgZWxzZSwgYW5kIGl0J3Mgc3VwcG9zZWQgdG8gYmUKKyAgICAgICAqIFVURi04CisgICAgICAgKi8KKyAgICAgIGlmICghX2RidXNfc3RyaW5nX3ZhbGlkYXRlX3V0ZjggKGRhdGEsIDAsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChkYXRhKSkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiJXM6IFJlY2VpdmVkIGludmFsaWQgVVRGLTggdHJhY2UgZGF0YSBmcm9tIEFOT05ZTU9VUyBjbGllbnRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19BVVRIX05BTUUgKGF1dGgpKTsKKyAgICAgICAgICByZXR1cm4gc2VuZF9yZWplY3RlZCAoYXV0aCk7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgX2RidXNfdmVyYm9zZSAoIiVzOiBBTk9OWU1PVVMgY2xpZW50IHNlbnQgdHJhY2Ugc3RyaW5nOiAnJXMnXG4iLAorICAgICAgICAgICAgICAgICAgICAgREJVU19BVVRIX05BTUUgKGF1dGgpLAorICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChkYXRhKSk7CisgICAgfQorCisgIC8qIFdlIHdhbnQgdG8gYmUgYW5vbnltb3VzIChjbGVhciBpbiBjYXNlIHNvbWUgb3RoZXIgcHJvdG9jb2wgZ290IG1pZHdheSB0aHJvdWdoIEkgZ3Vlc3MpICovCisgIF9kYnVzX2NyZWRlbnRpYWxzX2NsZWFyIChhdXRoLT5kZXNpcmVkX2lkZW50aXR5KTsKKworICAvKiBDb3B5IHByb2Nlc3MgSUQgZnJvbSB0aGUgc29ja2V0IGNyZWRlbnRpYWxzCisgICAqLworICBpZiAoIV9kYnVzX2NyZWRlbnRpYWxzX2FkZF9jcmVkZW50aWFsIChhdXRoLT5hdXRob3JpemVkX2lkZW50aXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0NSRURFTlRJQUxfVU5JWF9QUk9DRVNTX0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRoLT5jcmVkZW50aWFscykpCisgICAgcmV0dXJuIEZBTFNFOworICAKKyAgLyogQW5vbnltb3VzIGlzIGFsd2F5cyBhbGxvd2VkICovCisgIGlmICghc2VuZF9vayAoYXV0aCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIF9kYnVzX3ZlcmJvc2UgKCIlczogYXV0aGVudGljYXRlZCBjbGllbnQgYXMgYW5vbnltb3VzXG4iLAorICAgICAgICAgICAgICAgICBEQlVTX0FVVEhfTkFNRSAoYXV0aCkpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAoraGFuZGxlX3NlcnZlcl9zaHV0ZG93bl9hbm9ueW1vdXNfbWVjaCAoREJ1c0F1dGggKmF1dGgpCit7CisgIAorfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2hhbmRsZV9jbGllbnRfaW5pdGlhbF9yZXNwb25zZV9hbm9ueW1vdXNfbWVjaCAoREJ1c0F1dGggICAgICAgICAqYXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAqcmVzcG9uc2UpCit7CisgIC8qIE91ciBpbml0aWFsIHJlc3BvbnNlIGlzIGEgInRyYWNlIiBzdHJpbmcgd2hpY2ggbXVzdCBiZSB2YWxpZCBVVEYtOAorICAgKiBhbmQgbXVzdCBiZSBhbiBlbWFpbCBhZGRyZXNzIGlmIGl0IGNvbnRhaW5zICdAJy4KKyAgICogV2UganVzdCBzZW5kIHRoZSBkYnVzIGltcGxlbWVudGF0aW9uIGluZm8sIGxpa2UgYSB1c2VyLWFnZW50IG9yCisgICAqIHNvbWV0aGluZywgYmVjYXVzZS4uLiB3aHkgbm90LiBUaGVyZSdzIG5vdGhpbmcgZ3VhcmFudGVlZCBoZXJlCisgICAqIHRob3VnaCwgd2UgY291bGQgY2hhbmdlIGl0IGxhdGVyLgorICAgKi8KKyAgREJ1c1N0cmluZyBwbGFpbnRleHQ7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnBsYWludGV4dCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnBsYWludGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGliZGJ1cyAiIERCVVNfVkVSU0lPTl9TVFJJTkcpKQorICAgIGdvdG8gZmFpbGVkOworCisgIGlmICghX2RidXNfc3RyaW5nX2hleF9lbmNvZGUgKCZwbGFpbnRleHQsIDAsCisJCQkJcmVzcG9uc2UsCisJCQkJX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHJlc3BvbnNlKSkpCisgICAgZ290byBmYWlsZWQ7CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwbGFpbnRleHQpOworICAKKyAgcmV0dXJuIFRSVUU7CisKKyBmYWlsZWQ6CisgIF9kYnVzX3N0cmluZ19mcmVlICgmcGxhaW50ZXh0KTsKKyAgcmV0dXJuIEZBTFNFOyAgCit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAoraGFuZGxlX2NsaWVudF9kYXRhX2Fub255bW91c19tZWNoIChEQnVzQXV0aCAgICAgICAgICphdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmRhdGEpCit7CisgIAorICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK2hhbmRsZV9jbGllbnRfc2h1dGRvd25fYW5vbnltb3VzX21lY2ggKERCdXNBdXRoICphdXRoKQoreworICAKK30KKworLyogUHV0IG1lY2hhbmlzbXMgaGVyZSBpbiBvcmRlciBvZiBwcmVmZXJlbmNlLgorICogUmlnaHQgbm93IHdlIGhhdmU6CisgKgorICogLSBFWFRFUk5BTCBjaGVja3Mgc29ja2V0IGNyZWRlbnRpYWxzIChvciBpbiB0aGUgZnV0dXJlLCBvdGhlciBpbmZvIGZyb20gdGhlIE9TKQorICogLSBEQlVTX0NPT0tJRV9TSEExIHVzZXMgYSBjb29raWUgaW4gdGhlIGhvbWUgZGlyZWN0b3J5LCBsaWtlIHhhdXRoIG9yIElDRQorICogLSBBTk9OWU1PVVMgY2hlY2tzIG5vdGhpbmcgYnV0IGRvZXNuJ3QgYXV0aCB0aGUgcGVyc29uIGFzIGEgdXNlcgorICoKKyAqIFdlIG1pZ2h0IGlkZWFsbHkgYWRkIGEgbWVjaGFuaXNtIHRvIGNoYWluIHRvIEN5cnVzIFNBU0wgc28gd2UgY2FuCisgKiB1c2UgaXRzIG1lY2hhbmlzbXMgYXMgd2VsbC4KKyAqIAorICovCitzdGF0aWMgY29uc3QgREJ1c0F1dGhNZWNoYW5pc21IYW5kbGVyCithbGxfbWVjaGFuaXNtc1tdID0geworICB7ICJFWFRFUk5BTCIsCisgICAgaGFuZGxlX3NlcnZlcl9kYXRhX2V4dGVybmFsX21lY2gsCisgICAgTlVMTCwgTlVMTCwKKyAgICBoYW5kbGVfc2VydmVyX3NodXRkb3duX2V4dGVybmFsX21lY2gsCisgICAgaGFuZGxlX2NsaWVudF9pbml0aWFsX3Jlc3BvbnNlX2V4dGVybmFsX21lY2gsCisgICAgaGFuZGxlX2NsaWVudF9kYXRhX2V4dGVybmFsX21lY2gsCisgICAgTlVMTCwgTlVMTCwKKyAgICBoYW5kbGVfY2xpZW50X3NodXRkb3duX2V4dGVybmFsX21lY2ggfSwKKyAgeyAiREJVU19DT09LSUVfU0hBMSIsCisgICAgaGFuZGxlX3NlcnZlcl9kYXRhX2Nvb2tpZV9zaGExX21lY2gsCisgICAgTlVMTCwgTlVMTCwKKyAgICBoYW5kbGVfc2VydmVyX3NodXRkb3duX2Nvb2tpZV9zaGExX21lY2gsCisgICAgaGFuZGxlX2NsaWVudF9pbml0aWFsX3Jlc3BvbnNlX2Nvb2tpZV9zaGExX21lY2gsCisgICAgaGFuZGxlX2NsaWVudF9kYXRhX2Nvb2tpZV9zaGExX21lY2gsCisgICAgTlVMTCwgTlVMTCwKKyAgICBoYW5kbGVfY2xpZW50X3NodXRkb3duX2Nvb2tpZV9zaGExX21lY2ggfSwKKyAgeyAiQU5PTllNT1VTIiwKKyAgICBoYW5kbGVfc2VydmVyX2RhdGFfYW5vbnltb3VzX21lY2gsCisgICAgTlVMTCwgTlVMTCwKKyAgICBoYW5kbGVfc2VydmVyX3NodXRkb3duX2Fub255bW91c19tZWNoLAorICAgIGhhbmRsZV9jbGllbnRfaW5pdGlhbF9yZXNwb25zZV9hbm9ueW1vdXNfbWVjaCwKKyAgICBoYW5kbGVfY2xpZW50X2RhdGFfYW5vbnltb3VzX21lY2gsCisgICAgTlVMTCwgTlVMTCwKKyAgICBoYW5kbGVfY2xpZW50X3NodXRkb3duX2Fub255bW91c19tZWNoIH0sICAKKyAgeyBOVUxMLCBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBEQnVzQXV0aE1lY2hhbmlzbUhhbmRsZXIqCitmaW5kX21lY2ggKGNvbnN0IERCdXNTdHJpbmcgICpuYW1lLAorICAgICAgICAgICBjaGFyICAgICAgICAgICAgICoqYWxsb3dlZF9tZWNocykKK3sKKyAgaW50IGk7CisgIAorICBpZiAoYWxsb3dlZF9tZWNocyAhPSBOVUxMICYmCisgICAgICAhX2RidXNfc3RyaW5nX2FycmF5X2NvbnRhaW5zICgoY29uc3QgY2hhcioqKSBhbGxvd2VkX21lY2hzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChuYW1lKSkpCisgICAgcmV0dXJuIE5VTEw7CisgIAorICBpID0gMDsKKyAgd2hpbGUgKGFsbF9tZWNoYW5pc21zW2ldLm1lY2hhbmlzbSAhPSBOVUxMKQorICAgIHsgICAgICAKKyAgICAgIGlmIChfZGJ1c19zdHJpbmdfZXF1YWxfY19zdHIgKG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxfbWVjaGFuaXNtc1tpXS5tZWNoYW5pc20pKQorCisgICAgICAgIHJldHVybiAmYWxsX21lY2hhbmlzbXNbaV07CisgICAgICAKKyAgICAgICsraTsKKyAgICB9CisgIAorICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitzZW5kX2F1dGggKERCdXNBdXRoICphdXRoLCBjb25zdCBEQnVzQXV0aE1lY2hhbmlzbUhhbmRsZXIgKm1lY2gpCit7CisgIERCdXNTdHJpbmcgYXV0aF9jb21tYW5kOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZhdXRoX2NvbW1hbmQpKQorICAgIHJldHVybiBGQUxTRTsKKyAgICAgIAorICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhdXRoX2NvbW1hbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFVVEggIikpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZhdXRoX2NvbW1hbmQpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0gIAorICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmYXV0aF9jb21tYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lY2gtPm1lY2hhbmlzbSkpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZhdXRoX2NvbW1hbmQpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAobWVjaC0+Y2xpZW50X2luaXRpYWxfcmVzcG9uc2VfZnVuYyAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmF1dGhfY29tbWFuZCwgIiAiKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmYXV0aF9jb21tYW5kKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgaWYgKCEoKiBtZWNoLT5jbGllbnRfaW5pdGlhbF9yZXNwb25zZV9mdW5jKSAoYXV0aCwgJmF1dGhfY29tbWFuZCkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmF1dGhfY29tbWFuZCk7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgfQorICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmYXV0aF9jb21tYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcclxuIikpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZhdXRoX2NvbW1hbmQpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5ICgmYXV0aF9jb21tYW5kLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYXV0aC0+b3V0Z29pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmYXV0aC0+b3V0Z29pbmcpKSkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmF1dGhfY29tbWFuZCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIF9kYnVzX3N0cmluZ19mcmVlICgmYXV0aF9jb21tYW5kKTsKKyAgc2h1dGRvd25fbWVjaCAoYXV0aCk7CisgIGF1dGgtPm1lY2ggPSBtZWNoOyAgICAgIAorICBnb3RvX3N0YXRlIChhdXRoLCAmY2xpZW50X3N0YXRlX3dhaXRpbmdfZm9yX2RhdGEpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3NlbmRfZGF0YSAoREJ1c0F1dGggKmF1dGgsIERCdXNTdHJpbmcgKmRhdGEpCit7CisgIGludCBvbGRfbGVuOworCisgIGlmIChkYXRhID09IE5VTEwgfHwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGRhdGEpID09IDApCisgICAgcmV0dXJuIF9kYnVzX3N0cmluZ19hcHBlbmQgKCZhdXRoLT5vdXRnb2luZywgIkRBVEFcclxuIik7CisgIGVsc2UKKyAgICB7CisgICAgICBvbGRfbGVuID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZhdXRoLT5vdXRnb2luZyk7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhdXRoLT5vdXRnb2luZywgIkRBVEEgIikpCisgICAgICAgIGdvdG8gb3V0OworCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19oZXhfZW5jb2RlIChkYXRhLCAwLCAmYXV0aC0+b3V0Z29pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmF1dGgtPm91dGdvaW5nKSkpCisgICAgICAgIGdvdG8gb3V0OworCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhdXRoLT5vdXRnb2luZywgIlxyXG4iKSkKKyAgICAgICAgZ290byBvdXQ7CisKKyAgICAgIHJldHVybiBUUlVFOworCisgICAgb3V0OgorICAgICAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKCZhdXRoLT5vdXRnb2luZywgb2xkX2xlbik7CisKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorc2VuZF9yZWplY3RlZCAoREJ1c0F1dGggKmF1dGgpCit7CisgIERCdXNTdHJpbmcgY29tbWFuZDsKKyAgREJ1c0F1dGhTZXJ2ZXIgKnNlcnZlcl9hdXRoOworICBpbnQgaTsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZjb21tYW5kKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZjb21tYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSRUpFQ1RFRCIpKQorICAgIGdvdG8gbm9tZW07CisKKyAgZm9yIChpID0gMDsgYWxsX21lY2hhbmlzbXNbaV0ubWVjaGFuaXNtICE9IE5VTEw7IGkrKykKKyAgICB7CisgICAgICAvKiBza2lwIG1lY2hhbmlzbXMgdGhhdCBhcmVuJ3QgYWxsb3dlZCAqLworICAgICAgaWYgKGF1dGgtPmFsbG93ZWRfbWVjaHMgIT0gTlVMTCAmJgorICAgICAgICAgICFfZGJ1c19zdHJpbmdfYXJyYXlfY29udGFpbnMgKChjb25zdCBjaGFyKiopYXV0aC0+YWxsb3dlZF9tZWNocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxfbWVjaGFuaXNtc1tpXS5tZWNoYW5pc20pKQorICAgICAgICBjb250aW51ZTsKKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmY29tbWFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAiKSkKKyAgICAgICAgZ290byBub21lbTsKKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmY29tbWFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsX21lY2hhbmlzbXNbaV0ubWVjaGFuaXNtKSkKKyAgICAgICAgZ290byBub21lbTsKKyAgICB9CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZjb21tYW5kLCAiXHJcbiIpKQorICAgIGdvdG8gbm9tZW07CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAoJmNvbW1hbmQsIDAsICZhdXRoLT5vdXRnb2luZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZhdXRoLT5vdXRnb2luZykpKQorICAgIGdvdG8gbm9tZW07CisKKyAgc2h1dGRvd25fbWVjaCAoYXV0aCk7CisgIAorICBfZGJ1c19hc3NlcnQgKERCVVNfQVVUSF9JU19TRVJWRVIgKGF1dGgpKTsKKyAgc2VydmVyX2F1dGggPSBEQlVTX0FVVEhfU0VSVkVSIChhdXRoKTsKKyAgc2VydmVyX2F1dGgtPmZhaWx1cmVzICs9IDE7CisKKyAgaWYgKHNlcnZlcl9hdXRoLT5mYWlsdXJlcyA+PSBzZXJ2ZXJfYXV0aC0+bWF4X2ZhaWx1cmVzKQorICAgIGdvdG9fc3RhdGUgKGF1dGgsICZjb21tb25fc3RhdGVfbmVlZF9kaXNjb25uZWN0KTsKKyAgZWxzZQorICAgIGdvdG9fc3RhdGUgKGF1dGgsICZzZXJ2ZXJfc3RhdGVfd2FpdGluZ19mb3JfYXV0aCk7CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZjb21tYW5kKTsKKyAgCisgIHJldHVybiBUUlVFOworCisgbm9tZW06CisgIF9kYnVzX3N0cmluZ19mcmVlICgmY29tbWFuZCk7CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitzZW5kX2Vycm9yIChEQnVzQXV0aCAqYXV0aCwgY29uc3QgY2hhciAqbWVzc2FnZSkKK3sKKyAgcmV0dXJuIF9kYnVzX3N0cmluZ19hcHBlbmRfcHJpbnRmICgmYXV0aC0+b3V0Z29pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVSUk9SIFwiJXNcIlxyXG4iLCBtZXNzYWdlKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitzZW5kX29rIChEQnVzQXV0aCAqYXV0aCkKK3sKKyAgaW50IG9yaWdfbGVuOworCisgIG9yaWdfbGVuID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZhdXRoLT5vdXRnb2luZyk7CisgIAorICBpZiAoX2RidXNfc3RyaW5nX2FwcGVuZCAoJmF1dGgtPm91dGdvaW5nLCAiT0sgIikgJiYKKyAgICAgIF9kYnVzX3N0cmluZ19jb3B5ICgmIERCVVNfQVVUSF9TRVJWRVIgKGF1dGgpLT5ndWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgJmF1dGgtPm91dGdvaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmYXV0aC0+b3V0Z29pbmcpKSAmJgorICAgICAgX2RidXNfc3RyaW5nX2FwcGVuZCAoJmF1dGgtPm91dGdvaW5nLCAiXHJcbiIpKQorICAgIHsKKyAgICAgIGdvdG9fc3RhdGUgKGF1dGgsICZzZXJ2ZXJfc3RhdGVfd2FpdGluZ19mb3JfYmVnaW4pOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKCZhdXRoLT5vdXRnb2luZywgb3JpZ19sZW4pOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KK30KKworc3RhdGljIGRidXNfYm9vbF90CitzZW5kX2JlZ2luIChEQnVzQXV0aCAgICAgICAgICphdXRoKQoreworCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmF1dGgtPm91dGdvaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCRUdJTlxyXG4iKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgZ290b19zdGF0ZSAoYXV0aCwgJmNvbW1vbl9zdGF0ZV9hdXRoZW50aWNhdGVkKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorcHJvY2Vzc19vayhEQnVzQXV0aCAqYXV0aCwKKyAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICphcmdzX2Zyb21fb2spIHsKKworICBpbnQgZW5kX29mX2hleDsKKyAgCisgIC8qICJhcmdzX2Zyb21fb2siIHNob3VsZCBiZSB0aGUgR1VJRCwgd2hpdGVzcGFjZSBhbHJlYWR5IHB1bGxlZCBvZmYgdGhlIGZyb250ICovCisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCYgREJVU19BVVRIX0NMSUVOVCAoYXV0aCktPmd1aWRfZnJvbV9zZXJ2ZXIpID09IDApOworCisgIC8qIFdlIGRlY29kZSB0aGUgaGV4IHN0cmluZyB0byBiaW5hcnksIHVzaW5nIGd1aWRfZnJvbV9zZXJ2ZXIgYXMgc2NyYXRjaC4uLiAqLworICAKKyAgZW5kX29mX2hleCA9IDA7CisgIGlmICghX2RidXNfc3RyaW5nX2hleF9kZWNvZGUgKGFyZ3NfZnJvbV9vaywgMCwgJmVuZF9vZl9oZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgREJVU19BVVRIX0NMSUVOVCAoYXV0aCktPmd1aWRfZnJvbV9zZXJ2ZXIsIDApKQorICAgIHJldHVybiBGQUxTRTsKKworICAvKiBub3cgY2xlYXIgb3V0IHRoZSBzY3JhdGNoICovCisgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoICgmIERCVVNfQVVUSF9DTElFTlQgKGF1dGgpLT5ndWlkX2Zyb21fc2VydmVyLCAwKTsKKyAgCisgIGlmIChlbmRfb2ZfaGV4ICE9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChhcmdzX2Zyb21fb2spIHx8CisgICAgICBlbmRfb2ZfaGV4ID09IDApCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIkJhZCBHVUlEIGZyb20gc2VydmVyLCBwYXJzZWQgJWQgYnl0ZXMgYW5kIGhhZCAlZCBieXRlcyBmcm9tIHNlcnZlclxuIiwKKyAgICAgICAgICAgICAgICAgICAgIGVuZF9vZl9oZXgsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChhcmdzX2Zyb21fb2spKTsKKyAgICAgIGdvdG9fc3RhdGUgKGF1dGgsICZjb21tb25fc3RhdGVfbmVlZF9kaXNjb25uZWN0KTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5IChhcmdzX2Zyb21fb2ssIDAsICZEQlVTX0FVVEhfQ0xJRU5UIChhdXRoKS0+Z3VpZF9mcm9tX3NlcnZlciwgMCkpIHsKKyAgICAgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoICgmIERCVVNfQVVUSF9DTElFTlQgKGF1dGgpLT5ndWlkX2Zyb21fc2VydmVyLCAwKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIF9kYnVzX3ZlcmJvc2UgKCJHb3QgR1VJRCAnJXMnIGZyb20gdGhlIHNlcnZlclxuIiwKKyAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmIERCVVNfQVVUSF9DTElFTlQgKGF1dGgpLT5ndWlkX2Zyb21fc2VydmVyKSk7CisKKyAgaWYgKGF1dGgtPnVuaXhfZmRfcG9zc2libGUpCisgICAgcmV0dXJuIHNlbmRfbmVnb3RpYXRlX3VuaXhfZmQoYXV0aCk7CisKKyAgX2RidXNfdmVyYm9zZSgiTm90IG5lZ290aWF0aW5nIHVuaXggZmQgcGFzc2luZywgc2luY2Ugbm90IHBvc3NpYmxlXG4iKTsKKyAgcmV0dXJuIHNlbmRfYmVnaW4gKGF1dGgpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3NlbmRfY2FuY2VsIChEQnVzQXV0aCAqYXV0aCkKK3sKKyAgaWYgKF9kYnVzX3N0cmluZ19hcHBlbmQgKCZhdXRoLT5vdXRnb2luZywgIkNBTkNFTFxyXG4iKSkKKyAgICB7CisgICAgICBnb3RvX3N0YXRlIChhdXRoLCAmY2xpZW50X3N0YXRlX3dhaXRpbmdfZm9yX3JlamVjdCk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorcHJvY2Vzc19kYXRhIChEQnVzQXV0aCAgICAgICAgICAgICAqYXV0aCwKKyAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAgICAgKmFyZ3MsCisgICAgICAgICAgICAgIERCdXNBdXRoRGF0YUZ1bmN0aW9uICBkYXRhX2Z1bmMpCit7CisgIGludCBlbmQ7CisgIERCdXNTdHJpbmcgZGVjb2RlZDsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZGVjb2RlZCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghX2RidXNfc3RyaW5nX2hleF9kZWNvZGUgKGFyZ3MsIDAsICZlbmQsICZkZWNvZGVkLCAwKSkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmRlY29kZWQpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGFyZ3MpICE9IGVuZCkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmRlY29kZWQpOworICAgICAgaWYgKCFzZW5kX2Vycm9yIChhdXRoLCAiSW52YWxpZCBoZXggZW5jb2RpbmciKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyNpZmRlZiBEQlVTX0VOQUJMRV9WRVJCT1NFX01PREUKKyAgaWYgKF9kYnVzX3N0cmluZ192YWxpZGF0ZV9hc2NpaSAoJmRlY29kZWQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmZGVjb2RlZCkpKQorICAgIF9kYnVzX3ZlcmJvc2UgKCIlczogZGF0YTogJyVzJ1xuIiwKKyAgICAgICAgICAgICAgICAgICBEQlVTX0FVVEhfTkFNRSAoYXV0aCksCisgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmZGVjb2RlZCkpOworI2VuZGlmCisgICAgICAKKyAgaWYgKCEoKiBkYXRhX2Z1bmMpIChhdXRoLCAmZGVjb2RlZCkpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZkZWNvZGVkKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZkZWNvZGVkKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorc2VuZF9uZWdvdGlhdGVfdW5peF9mZCAoREJ1c0F1dGggKmF1dGgpCit7CisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmF1dGgtPm91dGdvaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJORUdPVElBVEVfVU5JWF9GRFxyXG4iKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgZ290b19zdGF0ZSAoYXV0aCwgJmNsaWVudF9zdGF0ZV93YWl0aW5nX2Zvcl9hZ3JlZV91bml4X2ZkKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorc2VuZF9hZ3JlZV91bml4X2ZkIChEQnVzQXV0aCAqYXV0aCkKK3sKKyAgX2RidXNfYXNzZXJ0KGF1dGgtPnVuaXhfZmRfcG9zc2libGUpOworCisgIGF1dGgtPnVuaXhfZmRfbmVnb3RpYXRlZCA9IFRSVUU7CisgIF9kYnVzX3ZlcmJvc2UoIkFncmVlZCB0byBVTklYIEZEIHBhc3NpbmdcbiIpOworCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmF1dGgtPm91dGdvaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBR1JFRV9VTklYX0ZEXHJcbiIpKQorICAgIHJldHVybiBGQUxTRTsKKworICBnb3RvX3N0YXRlIChhdXRoLCAmc2VydmVyX3N0YXRlX3dhaXRpbmdfZm9yX2JlZ2luKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAoraGFuZGxlX2F1dGggKERCdXNBdXRoICphdXRoLCBjb25zdCBEQnVzU3RyaW5nICphcmdzKQoreworICBpZiAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGFyZ3MpID09IDApCisgICAgeworICAgICAgLyogTm8gYXJncyB0byB0aGUgYXV0aCwgc2VuZCBtZWNoYW5pc21zICovCisgICAgICBpZiAoIXNlbmRfcmVqZWN0ZWQgKGF1dGgpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGludCBpOworICAgICAgREJ1c1N0cmluZyBtZWNoOworICAgICAgREJ1c1N0cmluZyBoZXhfcmVzcG9uc2U7CisgICAgICAKKyAgICAgIF9kYnVzX3N0cmluZ19maW5kX2JsYW5rIChhcmdzLCAwLCAmaSk7CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZtZWNoKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmaGV4X3Jlc3BvbnNlKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmbWVjaCk7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2NvcHlfbGVuIChhcmdzLCAwLCBpLCAmbWVjaCwgMCkpCisgICAgICAgIGdvdG8gZmFpbGVkOworCisgICAgICBfZGJ1c19zdHJpbmdfc2tpcF9ibGFuayAoYXJncywgaSwgJmkpOworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAoYXJncywgaSwgJmhleF9yZXNwb25zZSwgMCkpCisgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAKKyAgICAgIGF1dGgtPm1lY2ggPSBmaW5kX21lY2ggKCZtZWNoLCBhdXRoLT5hbGxvd2VkX21lY2hzKTsKKyAgICAgIGlmIChhdXRoLT5tZWNoICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiJXM6IFRyeWluZyBtZWNoYW5pc20gJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19BVVRIX05BTUUgKGF1dGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGgtPm1lY2gtPm1lY2hhbmlzbSk7CisgICAgICAgICAgCisgICAgICAgICAgaWYgKCFwcm9jZXNzX2RhdGEgKGF1dGgsICZoZXhfcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGgtPm1lY2gtPnNlcnZlcl9kYXRhX2Z1bmMpKQorICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8qIFVuc3VwcG9ydGVkIG1lY2hhbmlzbSAqLworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIlczogVW5zdXBwb3J0ZWQgbWVjaGFuaXNtICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfQVVUSF9OQU1FIChhdXRoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZtZWNoKSk7CisgICAgICAgICAgCisgICAgICAgICAgaWYgKCFzZW5kX3JlamVjdGVkIChhdXRoKSkKKyAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICB9CisKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmbWVjaCk7ICAgICAgCisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmhleF9yZXNwb25zZSk7CisKKyAgICAgIHJldHVybiBUUlVFOworICAgICAgCisgICAgZmFpbGVkOgorICAgICAgYXV0aC0+bWVjaCA9IE5VTEw7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJm1lY2gpOworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZoZXhfcmVzcG9uc2UpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KK30KKworc3RhdGljIGRidXNfYm9vbF90CitoYW5kbGVfc2VydmVyX3N0YXRlX3dhaXRpbmdfZm9yX2F1dGggIChEQnVzQXV0aCAgICAgICAgICphdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0F1dGhDb21tYW5kICAgY29tbWFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmFyZ3MpCit7CisgIHN3aXRjaCAoY29tbWFuZCkKKyAgICB7CisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9BVVRIOgorICAgICAgcmV0dXJuIGhhbmRsZV9hdXRoIChhdXRoLCBhcmdzKTsKKworICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfQ0FOQ0VMOgorICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfREFUQToKKyAgICAgIHJldHVybiBzZW5kX2Vycm9yIChhdXRoLCAiTm90IGN1cnJlbnRseSBpbiBhbiBhdXRoIGNvbnZlcnNhdGlvbiIpOworCisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9CRUdJTjoKKyAgICAgIGdvdG9fc3RhdGUgKGF1dGgsICZjb21tb25fc3RhdGVfbmVlZF9kaXNjb25uZWN0KTsKKyAgICAgIHJldHVybiBUUlVFOworCisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9FUlJPUjoKKyAgICAgIHJldHVybiBzZW5kX3JlamVjdGVkIChhdXRoKTsKKworICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfTkVHT1RJQVRFX1VOSVhfRkQ6CisgICAgICByZXR1cm4gc2VuZF9lcnJvciAoYXV0aCwgIk5lZWQgdG8gYXV0aGVudGljYXRlIGZpcnN0Iik7CisKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX1JFSkVDVEVEOgorICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfT0s6CisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9VTktOT1dOOgorICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfQUdSRUVfVU5JWF9GRDoKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIHNlbmRfZXJyb3IgKGF1dGgsICJVbmtub3duIGNvbW1hbmQiKTsKKyAgICB9Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAoraGFuZGxlX3NlcnZlcl9zdGF0ZV93YWl0aW5nX2Zvcl9kYXRhICAoREJ1c0F1dGggICAgICAgICAqYXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNBdXRoQ29tbWFuZCAgIGNvbW1hbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICphcmdzKQoreworICBzd2l0Y2ggKGNvbW1hbmQpCisgICAgeworICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfQVVUSDoKKyAgICAgIHJldHVybiBzZW5kX2Vycm9yIChhdXRoLCAiU2VudCBBVVRIIHdoaWxlIGFub3RoZXIgQVVUSCBpbiBwcm9ncmVzcyIpOworCisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9DQU5DRUw6CisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9FUlJPUjoKKyAgICAgIHJldHVybiBzZW5kX3JlamVjdGVkIChhdXRoKTsKKworICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfREFUQToKKyAgICAgIHJldHVybiBwcm9jZXNzX2RhdGEgKGF1dGgsIGFyZ3MsIGF1dGgtPm1lY2gtPnNlcnZlcl9kYXRhX2Z1bmMpOworCisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9CRUdJTjoKKyAgICAgIGdvdG9fc3RhdGUgKGF1dGgsICZjb21tb25fc3RhdGVfbmVlZF9kaXNjb25uZWN0KTsKKyAgICAgIHJldHVybiBUUlVFOworCisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9ORUdPVElBVEVfVU5JWF9GRDoKKyAgICAgIHJldHVybiBzZW5kX2Vycm9yIChhdXRoLCAiTmVlZCB0byBhdXRoZW50aWNhdGUgZmlyc3QiKTsKKworICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfUkVKRUNURUQ6CisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9PSzoKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX1VOS05PV046CisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9BR1JFRV9VTklYX0ZEOgorICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gc2VuZF9lcnJvciAoYXV0aCwgIlVua25vd24gY29tbWFuZCIpOworICAgIH0KK30KKworc3RhdGljIGRidXNfYm9vbF90CitoYW5kbGVfc2VydmVyX3N0YXRlX3dhaXRpbmdfZm9yX2JlZ2luIChEQnVzQXV0aCAgICAgICAgICphdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0F1dGhDb21tYW5kICAgY29tbWFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmFyZ3MpCit7CisgIHN3aXRjaCAoY29tbWFuZCkKKyAgICB7CisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9BVVRIOgorICAgICAgcmV0dXJuIHNlbmRfZXJyb3IgKGF1dGgsICJTZW50IEFVVEggd2hpbGUgZXhwZWN0aW5nIEJFR0lOIik7CisKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX0RBVEE6CisgICAgICByZXR1cm4gc2VuZF9lcnJvciAoYXV0aCwgIlNlbnQgREFUQSB3aGlsZSBleHBlY3RpbmcgQkVHSU4iKTsKKworICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfQkVHSU46CisgICAgICBnb3RvX3N0YXRlIChhdXRoLCAmY29tbW9uX3N0YXRlX2F1dGhlbnRpY2F0ZWQpOworICAgICAgcmV0dXJuIFRSVUU7CisKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX05FR09USUFURV9VTklYX0ZEOgorICAgICAgaWYgKGF1dGgtPnVuaXhfZmRfcG9zc2libGUpCisgICAgICAgIHJldHVybiBzZW5kX2FncmVlX3VuaXhfZmQoYXV0aCk7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBzZW5kX2Vycm9yKGF1dGgsICJVbml4IEZEIHBhc3Npbmcgbm90IHN1cHBvcnRlZCwgbm90IGF1dGhlbnRpY2F0ZWQgb3Igb3RoZXJ3aXNlIG5vdCBwb3NzaWJsZSIpOworCisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9SRUpFQ1RFRDoKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX09LOgorICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfVU5LTk9XTjoKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX0FHUkVFX1VOSVhfRkQ6CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBzZW5kX2Vycm9yIChhdXRoLCAiVW5rbm93biBjb21tYW5kIik7CisKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX0NBTkNFTDoKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX0VSUk9SOgorICAgICAgcmV0dXJuIHNlbmRfcmVqZWN0ZWQgKGF1dGgpOworICAgIH0KK30KKworLyogcmV0dXJuIEZBTFNFIGlmIG5vIG1lbW9yeSwgVFJVRSBpZiBhbGwgT0sgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAorZ2V0X3dvcmQgKGNvbnN0IERCdXNTdHJpbmcgKnN0ciwKKyAgICAgICAgICBpbnQgICAgICAgICAgICAgICpzdGFydCwKKyAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICp3b3JkKQoreworICBpbnQgaTsKKworICBfZGJ1c19zdHJpbmdfc2tpcF9ibGFuayAoc3RyLCAqc3RhcnQsIHN0YXJ0KTsKKyAgX2RidXNfc3RyaW5nX2ZpbmRfYmxhbmsgKHN0ciwgKnN0YXJ0LCAmaSk7CisgIAorICBpZiAoaSA+ICpzdGFydCkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5X2xlbiAoc3RyLCAqc3RhcnQsIGkgLSAqc3RhcnQsIHdvcmQsIDApKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAKKyAgICAgICpzdGFydCA9IGk7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3JlY29yZF9tZWNoYW5pc21zIChEQnVzQXV0aCAgICAgICAgICphdXRoLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmFyZ3MpCit7CisgIGludCBuZXh0OworICBpbnQgbGVuOworCisgIGlmIChhdXRoLT5hbHJlYWR5X2dvdF9tZWNoYW5pc21zKQorICAgIHJldHVybiBUUlVFOworICAKKyAgbGVuID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGFyZ3MpOworICAKKyAgbmV4dCA9IDA7CisgIHdoaWxlIChuZXh0IDwgbGVuKQorICAgIHsKKyAgICAgIERCdXNTdHJpbmcgbTsKKyAgICAgIGNvbnN0IERCdXNBdXRoTWVjaGFuaXNtSGFuZGxlciAqbWVjaDsKKyAgICAgIAorICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJm0pKQorICAgICAgICBnb3RvIG5vbWVtOworICAgICAgCisgICAgICBpZiAoIWdldF93b3JkIChhcmdzLCAmbmV4dCwgJm0pKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZtKTsKKyAgICAgICAgICBnb3RvIG5vbWVtOworICAgICAgICB9CisKKyAgICAgIG1lY2ggPSBmaW5kX21lY2ggKCZtLCBhdXRoLT5hbGxvd2VkX21lY2hzKTsKKworICAgICAgaWYgKG1lY2ggIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIC8qIEZJWE1FIHJpZ2h0IG5vdyB3ZSB0cnkgbWVjaGFuaXNtcyBpbiB0aGUgb3JkZXIKKyAgICAgICAgICAgKiB0aGUgc2VydmVyIGxpc3RzIHRoZW07IHNob3VsZCB3ZSBkbyB0aGVtIGluCisgICAgICAgICAgICogc29tZSBtb3JlIGRldGVybWluaXN0aWMgb3JkZXI/CisgICAgICAgICAgICoKKyAgICAgICAgICAgKiBQcm9iYWJseSBpbiBhbGxfbWVjaGFuaXNtcyBvcmRlciwgb3VyIG9yZGVyIG9mCisgICAgICAgICAgICogcHJlZmVyZW5jZS4gT2YgY291cnNlIHdoZW4gdGhlIHNlcnZlciBpcyB1cywKKyAgICAgICAgICAgKiBpdCBsaXN0cyB0aGluZ3MgaW4gdGhhdCBvcmRlciBhbnlob3cuCisgICAgICAgICAgICovCisKKyAgICAgICAgICBpZiAobWVjaCAhPSAmYWxsX21lY2hhbmlzbXNbMF0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIlczogQWRkaW5nIG1lY2hhbmlzbSAlcyB0byBsaXN0IHdlIHdpbGwgdHJ5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0FVVEhfTkFNRSAoYXV0aCksIG1lY2gtPm1lY2hhbmlzbSk7CisgICAgICAgICAgCisgICAgICAgICAgICAgIGlmICghX2RidXNfbGlzdF9hcHBlbmQgKCYgREJVU19BVVRIX0NMSUVOVCAoYXV0aCktPm1lY2hzX3RvX3RyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKSBtZWNoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJm0pOworICAgICAgICAgICAgICAgICAgZ290byBub21lbTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiJXM6IEFscmVhZHkgdHJpZWQgbWVjaGFuaXNtICVzOyBub3QgYWRkaW5nIHRvIGxpc3Qgd2Ugd2lsbCB0cnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfQVVUSF9OQU1FIChhdXRoKSwgbWVjaC0+bWVjaGFuaXNtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiVzOiBTZXJ2ZXIgb2ZmZXJlZCBtZWNoYW5pc20gXCIlc1wiIHRoYXQgd2UgZG9uJ3Qga25vdyBob3cgdG8gdXNlXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfQVVUSF9OQU1FIChhdXRoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZtKSk7CisgICAgICAgIH0KKworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZtKTsKKyAgICB9CisgIAorICBhdXRoLT5hbHJlYWR5X2dvdF9tZWNoYW5pc21zID0gVFJVRTsKKyAgCisgIHJldHVybiBUUlVFOworCisgbm9tZW06CisgIF9kYnVzX2xpc3RfY2xlYXIgKCYgREJVU19BVVRIX0NMSUVOVCAoYXV0aCktPm1lY2hzX3RvX3RyeSk7CisgIAorICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorcHJvY2Vzc19yZWplY3RlZCAoREJ1c0F1dGggKmF1dGgsIGNvbnN0IERCdXNTdHJpbmcgKmFyZ3MpCit7CisgIGNvbnN0IERCdXNBdXRoTWVjaGFuaXNtSGFuZGxlciAqbWVjaDsKKyAgREJ1c0F1dGhDbGllbnQgKmNsaWVudDsKKworICBjbGllbnQgPSBEQlVTX0FVVEhfQ0xJRU5UIChhdXRoKTsKKworICBpZiAoIWF1dGgtPmFscmVhZHlfZ290X21lY2hhbmlzbXMpCisgICAgeworICAgICAgaWYgKCFyZWNvcmRfbWVjaGFuaXNtcyAoYXV0aCwgYXJncykpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIAorICBpZiAoREJVU19BVVRIX0NMSUVOVCAoYXV0aCktPm1lY2hzX3RvX3RyeSAhPSBOVUxMKQorICAgIHsKKyAgICAgIG1lY2ggPSBjbGllbnQtPm1lY2hzX3RvX3RyeS0+ZGF0YTsKKworICAgICAgaWYgKCFzZW5kX2F1dGggKGF1dGgsIG1lY2gpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIF9kYnVzX2xpc3RfcG9wX2ZpcnN0ICgmY2xpZW50LT5tZWNoc190b190cnkpOworCisgICAgICBfZGJ1c192ZXJib3NlICgiJXM6IFRyeWluZyBtZWNoYW5pc20gJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICBEQlVTX0FVVEhfTkFNRSAoYXV0aCksCisgICAgICAgICAgICAgICAgICAgICBtZWNoLT5tZWNoYW5pc20pOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIEdpdmUgdXAgKi8KKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCIlczogRGlzY29ubmVjdGluZyBiZWNhdXNlIHdlIGFyZSBvdXQgb2YgbWVjaGFuaXNtcyB0byB0cnkgdXNpbmdcbiIsCisgICAgICAgICAgICAgICAgICAgICBEQlVTX0FVVEhfTkFNRSAoYXV0aCkpOworICAgICAgZ290b19zdGF0ZSAoYXV0aCwgJmNvbW1vbl9zdGF0ZV9uZWVkX2Rpc2Nvbm5lY3QpOworICAgIH0KKyAgCisgIHJldHVybiBUUlVFOworfQorCisKK3N0YXRpYyBkYnVzX2Jvb2xfdAoraGFuZGxlX2NsaWVudF9zdGF0ZV93YWl0aW5nX2Zvcl9kYXRhIChEQnVzQXV0aCAgICAgICAgICphdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQXV0aENvbW1hbmQgICBjb21tYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICphcmdzKQoreworICBfZGJ1c19hc3NlcnQgKGF1dGgtPm1lY2ggIT0gTlVMTCk7CisgCisgIHN3aXRjaCAoY29tbWFuZCkKKyAgICB7CisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9EQVRBOgorICAgICAgcmV0dXJuIHByb2Nlc3NfZGF0YSAoYXV0aCwgYXJncywgYXV0aC0+bWVjaC0+Y2xpZW50X2RhdGFfZnVuYyk7CisKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX1JFSkVDVEVEOgorICAgICAgcmV0dXJuIHByb2Nlc3NfcmVqZWN0ZWQgKGF1dGgsIGFyZ3MpOworCisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9PSzoKKyAgICAgIHJldHVybiBwcm9jZXNzX29rKGF1dGgsIGFyZ3MpOworCisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9FUlJPUjoKKyAgICAgIHJldHVybiBzZW5kX2NhbmNlbCAoYXV0aCk7CisKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX0FVVEg6CisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9DQU5DRUw6CisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9CRUdJTjoKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX1VOS05PV046CisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9ORUdPVElBVEVfVU5JWF9GRDoKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX0FHUkVFX1VOSVhfRkQ6CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBzZW5kX2Vycm9yIChhdXRoLCAiVW5rbm93biBjb21tYW5kIik7CisgICAgfQorfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2hhbmRsZV9jbGllbnRfc3RhdGVfd2FpdGluZ19mb3Jfb2sgKERCdXNBdXRoICAgICAgICAgKmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQXV0aENvbW1hbmQgICBjb21tYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqYXJncykKK3sKKyAgc3dpdGNoIChjb21tYW5kKQorICAgIHsKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX1JFSkVDVEVEOgorICAgICAgcmV0dXJuIHByb2Nlc3NfcmVqZWN0ZWQgKGF1dGgsIGFyZ3MpOworCisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9PSzoKKyAgICAgIHJldHVybiBwcm9jZXNzX29rKGF1dGgsIGFyZ3MpOworCisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9EQVRBOgorICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfRVJST1I6CisgICAgICByZXR1cm4gc2VuZF9jYW5jZWwgKGF1dGgpOworCisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9BVVRIOgorICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfQ0FOQ0VMOgorICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfQkVHSU46CisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9VTktOT1dOOgorICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfTkVHT1RJQVRFX1VOSVhfRkQ6CisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9BR1JFRV9VTklYX0ZEOgorICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gc2VuZF9lcnJvciAoYXV0aCwgIlVua25vd24gY29tbWFuZCIpOworICAgIH0KK30KKworc3RhdGljIGRidXNfYm9vbF90CitoYW5kbGVfY2xpZW50X3N0YXRlX3dhaXRpbmdfZm9yX3JlamVjdCAoREJ1c0F1dGggICAgICAgICAqYXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQXV0aENvbW1hbmQgICBjb21tYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmFyZ3MpCit7CisgIHN3aXRjaCAoY29tbWFuZCkKKyAgICB7CisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9SRUpFQ1RFRDoKKyAgICAgIHJldHVybiBwcm9jZXNzX3JlamVjdGVkIChhdXRoLCBhcmdzKTsKKyAgICAgIAorICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfQVVUSDoKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX0NBTkNFTDoKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX0RBVEE6CisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9CRUdJTjoKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX09LOgorICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfRVJST1I6CisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9VTktOT1dOOgorICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfTkVHT1RJQVRFX1VOSVhfRkQ6CisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9BR1JFRV9VTklYX0ZEOgorICAgIGRlZmF1bHQ6CisgICAgICBnb3RvX3N0YXRlIChhdXRoLCAmY29tbW9uX3N0YXRlX25lZWRfZGlzY29ubmVjdCk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAoraGFuZGxlX2NsaWVudF9zdGF0ZV93YWl0aW5nX2Zvcl9hZ3JlZV91bml4X2ZkKERCdXNBdXRoICAgICAgICAgKmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0F1dGhDb21tYW5kICAgY29tbWFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICphcmdzKQoreworICBzd2l0Y2ggKGNvbW1hbmQpCisgICAgeworICAgIGNhc2UgREJVU19BVVRIX0NPTU1BTkRfQUdSRUVfVU5JWF9GRDoKKyAgICAgIF9kYnVzX2Fzc2VydChhdXRoLT51bml4X2ZkX3Bvc3NpYmxlKTsKKyAgICAgIGF1dGgtPnVuaXhfZmRfbmVnb3RpYXRlZCA9IFRSVUU7CisgICAgICBfZGJ1c192ZXJib3NlKCJTdWNjZXNzZnVsbHkgbmVnb3RpYXRlZCBVTklYIEZEIHBhc3NpbmdcbiIpOworICAgICAgcmV0dXJuIHNlbmRfYmVnaW4gKGF1dGgpOworCisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9FUlJPUjoKKyAgICAgIF9kYnVzX2Fzc2VydChhdXRoLT51bml4X2ZkX3Bvc3NpYmxlKTsKKyAgICAgIGF1dGgtPnVuaXhfZmRfbmVnb3RpYXRlZCA9IEZBTFNFOworICAgICAgX2RidXNfdmVyYm9zZSgiRmFpbGVkIHRvIG5lZ290aWF0ZSBVTklYIEZEIHBhc3NpbmdcbiIpOworICAgICAgcmV0dXJuIHNlbmRfYmVnaW4gKGF1dGgpOworCisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9PSzoKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX0RBVEE6CisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9SRUpFQ1RFRDoKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX0FVVEg6CisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9DQU5DRUw6CisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9CRUdJTjoKKyAgICBjYXNlIERCVVNfQVVUSF9DT01NQU5EX1VOS05PV046CisgICAgY2FzZSBEQlVTX0FVVEhfQ09NTUFORF9ORUdPVElBVEVfVU5JWF9GRDoKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIHNlbmRfZXJyb3IgKGF1dGgsICJVbmtub3duIGNvbW1hbmQiKTsKKyAgICB9Cit9CisKKy8qKgorICogTWFwcGluZyBmcm9tIGNvbW1hbmQgbmFtZSB0byBlbnVtCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgY29uc3QgY2hhciAqbmFtZTsgICAgICAgIC8qKjwgTmFtZSBvZiB0aGUgY29tbWFuZCAqLworICBEQnVzQXV0aENvbW1hbmQgY29tbWFuZDsgLyoqPCBDb3JyZXNwb25kaW5nIGVudW0gKi8KK30gREJ1c0F1dGhDb21tYW5kTmFtZTsKKworc3RhdGljIGNvbnN0IERCdXNBdXRoQ29tbWFuZE5hbWUgYXV0aF9jb21tYW5kX25hbWVzW10gPSB7CisgIHsgIkFVVEgiLCAgICAgICAgICAgICAgREJVU19BVVRIX0NPTU1BTkRfQVVUSCB9LAorICB7ICJDQU5DRUwiLCAgICAgICAgICAgIERCVVNfQVVUSF9DT01NQU5EX0NBTkNFTCB9LAorICB7ICJEQVRBIiwgICAgICAgICAgICAgIERCVVNfQVVUSF9DT01NQU5EX0RBVEEgfSwKKyAgeyAiQkVHSU4iLCAgICAgICAgICAgICBEQlVTX0FVVEhfQ09NTUFORF9CRUdJTiB9LAorICB7ICJSRUpFQ1RFRCIsICAgICAgICAgIERCVVNfQVVUSF9DT01NQU5EX1JFSkVDVEVEIH0sCisgIHsgIk9LIiwgICAgICAgICAgICAgICAgREJVU19BVVRIX0NPTU1BTkRfT0sgfSwKKyAgeyAiRVJST1IiLCAgICAgICAgICAgICBEQlVTX0FVVEhfQ09NTUFORF9FUlJPUiB9LAorICB7ICJORUdPVElBVEVfVU5JWF9GRCIsIERCVVNfQVVUSF9DT01NQU5EX05FR09USUFURV9VTklYX0ZEIH0sCisgIHsgIkFHUkVFX1VOSVhfRkQiLCAgICAgREJVU19BVVRIX0NPTU1BTkRfQUdSRUVfVU5JWF9GRCB9Cit9OworCitzdGF0aWMgREJ1c0F1dGhDb21tYW5kCitsb29rdXBfY29tbWFuZF9mcm9tX25hbWUgKERCdXNTdHJpbmcgKmNvbW1hbmQpCit7CisgIGludCBpOworCisgIGZvciAoaSA9IDA7IGkgPCBfREJVU19OX0VMRU1FTlRTIChhdXRoX2NvbW1hbmRfbmFtZXMpOyBpKyspCisgICAgeworICAgICAgaWYgKF9kYnVzX3N0cmluZ19lcXVhbF9jX3N0ciAoY29tbWFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhfY29tbWFuZF9uYW1lc1tpXS5uYW1lKSkKKyAgICAgICAgcmV0dXJuIGF1dGhfY29tbWFuZF9uYW1lc1tpXS5jb21tYW5kOworICAgIH0KKworICByZXR1cm4gREJVU19BVVRIX0NPTU1BTkRfVU5LTk9XTjsKK30KKworc3RhdGljIHZvaWQKK2dvdG9fc3RhdGUgKERCdXNBdXRoICphdXRoLAorICAgICAgICAgICAgY29uc3QgREJ1c0F1dGhTdGF0ZURhdGEgKnN0YXRlKQoreworICBfZGJ1c192ZXJib3NlICgiJXM6IGdvaW5nIGZyb20gc3RhdGUgJXMgdG8gc3RhdGUgJXNcbiIsCisgICAgICAgICAgICAgICAgIERCVVNfQVVUSF9OQU1FIChhdXRoKSwKKyAgICAgICAgICAgICAgICAgYXV0aC0+c3RhdGUtPm5hbWUsCisgICAgICAgICAgICAgICAgIHN0YXRlLT5uYW1lKTsKKworICBhdXRoLT5zdGF0ZSA9IHN0YXRlOworfQorCisvKiByZXR1cm5zIHdoZXRoZXIgdG8gY2FsbCBpdCBhZ2FpbiByaWdodCBhd2F5ICovCitzdGF0aWMgZGJ1c19ib29sX3QKK3Byb2Nlc3NfY29tbWFuZCAoREJ1c0F1dGggKmF1dGgpCit7CisgIERCdXNBdXRoQ29tbWFuZCBjb21tYW5kOworICBEQnVzU3RyaW5nIGxpbmU7CisgIERCdXNTdHJpbmcgYXJnczsKKyAgaW50IGVvbDsKKyAgaW50IGksIGo7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKworICAvKiBfZGJ1c192ZXJib3NlICgiJXM6ICAgdHJ5aW5nIHByb2Nlc3NfY29tbWFuZCgpXG4iKTsgKi8KKyAgCisgIHJldHZhbCA9IEZBTFNFOworICAKKyAgZW9sID0gMDsKKyAgaWYgKCFfZGJ1c19zdHJpbmdfZmluZCAoJmF1dGgtPmluY29taW5nLCAwLCAiXHJcbiIsICZlb2wpKQorICAgIHJldHVybiBGQUxTRTsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZsaW5lKSkKKyAgICB7CisgICAgICBhdXRoLT5uZWVkZWRfbWVtb3J5ID0gVFJVRTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmFyZ3MpKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmbGluZSk7CisgICAgICBhdXRoLT5uZWVkZWRfbWVtb3J5ID0gVFJVRTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5X2xlbiAoJmF1dGgtPmluY29taW5nLCAwLCBlb2wsICZsaW5lLCAwKSkKKyAgICBnb3RvIG91dDsKKworICBpZiAoIV9kYnVzX3N0cmluZ192YWxpZGF0ZV9hc2NpaSAoJmxpbmUsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmxpbmUpKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiJXM6IENvbW1hbmQgY29udGFpbmVkIG5vbi1BU0NJSSBjaGFycyBvciBlbWJlZGRlZCBudWxcbiIsCisgICAgICAgICAgICAgICAgICAgICBEQlVTX0FVVEhfTkFNRSAoYXV0aCkpOworICAgICAgaWYgKCFzZW5kX2Vycm9yIChhdXRoLCAiQ29tbWFuZCBjb250YWluZWQgbm9uLUFTQ0lJIikpCisgICAgICAgIGdvdG8gb3V0OworICAgICAgZWxzZQorICAgICAgICBnb3RvIG5leHRfY29tbWFuZDsKKyAgICB9CisgIAorICBfZGJ1c192ZXJib3NlICgiJXM6IGdvdCBjb21tYW5kIFwiJXNcIlxuIiwKKyAgICAgICAgICAgICAgICAgREJVU19BVVRIX05BTUUgKGF1dGgpLAorICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZsaW5lKSk7CisgIAorICBfZGJ1c19zdHJpbmdfZmluZF9ibGFuayAoJmxpbmUsIDAsICZpKTsKKyAgX2RidXNfc3RyaW5nX3NraXBfYmxhbmsgKCZsaW5lLCBpLCAmaik7CisKKyAgaWYgKGogPiBpKQorICAgIF9kYnVzX3N0cmluZ19kZWxldGUgKCZsaW5lLCBpLCBqIC0gaSk7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19tb3ZlICgmbGluZSwgaSwgJmFyZ3MsIDApKQorICAgIGdvdG8gb3V0OworCisgIC8qIEZJWE1FIDEuMCB3ZSBzaG91bGQgcHJvYmFibHkgdmFsaWRhdGUgdGhhdCBvbmx5IHRoZSBhbGxvd2VkCisgICAqIGNoYXJzIGFyZSBpbiB0aGUgY29tbWFuZCBuYW1lCisgICAqLworICAKKyAgY29tbWFuZCA9IGxvb2t1cF9jb21tYW5kX2Zyb21fbmFtZSAoJmxpbmUpOworICBpZiAoISgqIGF1dGgtPnN0YXRlLT5oYW5kbGVyKSAoYXV0aCwgY29tbWFuZCwgJmFyZ3MpKQorICAgIGdvdG8gb3V0OworCisgbmV4dF9jb21tYW5kOgorICAKKyAgLyogV2UndmUgc3VjY2VlZGVkIGluIHByb2Nlc3NpbmcgdGhlIHdob2xlIGNvbW1hbmQgc28gZHJvcCBpdCBvdXQKKyAgICogb2YgdGhlIGluY29taW5nIGJ1ZmZlciBhbmQgcmV0dXJuIFRSVUUgdG8gdHJ5IGFub3RoZXIgY29tbWFuZC4KKyAgICovCisKKyAgX2RidXNfc3RyaW5nX2RlbGV0ZSAoJmF1dGgtPmluY29taW5nLCAwLCBlb2wpOworICAKKyAgLyoga2lsbCB0aGUgXHJcbiAqLworICBfZGJ1c19zdHJpbmdfZGVsZXRlICgmYXV0aC0+aW5jb21pbmcsIDAsIDIpOworCisgIHJldHZhbCA9IFRSVUU7CisgIAorIG91dDoKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZhcmdzKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZsaW5lKTsKKworICBpZiAoIXJldHZhbCkKKyAgICBhdXRoLT5uZWVkZWRfbWVtb3J5ID0gVFJVRTsKKyAgZWxzZQorICAgIGF1dGgtPm5lZWRlZF9tZW1vcnkgPSBGQUxTRTsKKyAgCisgIHJldHVybiByZXR2YWw7Cit9CisKKworLyoqIEB9ICovCisKKy8qKgorICogQGFkZHRvZ3JvdXAgREJ1c0F1dGgKKyAqIEB7CisgKi8KKworLyoqCisgKiBDcmVhdGVzIGEgbmV3IGF1dGggY29udmVyc2F0aW9uIG9iamVjdCBmb3IgdGhlIHNlcnZlciBzaWRlLgorICogU2VlIGh0dHA6Ly9kYnVzLmZyZWVkZXNrdG9wLm9yZy9kb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLmh0bWwjYXV0aC1wcm90b2NvbAorICogZm9yIGZ1bGwgZGV0YWlscyBvbiB3aGF0IHRoaXMgb2JqZWN0IGRvZXMuCisgKgorICogQHJldHVybnMgdGhlIG5ldyBvYmplY3Qgb3IgI05VTEwgaWYgbm8gbWVtb3J5CisgKi8KK0RCdXNBdXRoKgorX2RidXNfYXV0aF9zZXJ2ZXJfbmV3IChjb25zdCBEQnVzU3RyaW5nICpndWlkKQoreworICBEQnVzQXV0aCAqYXV0aDsKKyAgREJ1c0F1dGhTZXJ2ZXIgKnNlcnZlcl9hdXRoOworICBEQnVzU3RyaW5nIGd1aWRfY29weTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZ3VpZF9jb3B5KSkKKyAgICByZXR1cm4gTlVMTDsKKworICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5IChndWlkLCAwLCAmZ3VpZF9jb3B5LCAwKSkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmd1aWRfY29weSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgYXV0aCA9IF9kYnVzX2F1dGhfbmV3IChzaXplb2YgKERCdXNBdXRoU2VydmVyKSk7CisgIGlmIChhdXRoID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZndWlkX2NvcHkpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAKKyAgYXV0aC0+c2lkZSA9IGF1dGhfc2lkZV9zZXJ2ZXI7CisgIGF1dGgtPnN0YXRlID0gJnNlcnZlcl9zdGF0ZV93YWl0aW5nX2Zvcl9hdXRoOworCisgIHNlcnZlcl9hdXRoID0gREJVU19BVVRIX1NFUlZFUiAoYXV0aCk7CisKKyAgc2VydmVyX2F1dGgtPmd1aWQgPSBndWlkX2NvcHk7CisgIAorICAvKiBwZXJoYXBzIHRoaXMgc2hvdWxkIGJlIHBlci1tZWNoYW5pc20gd2l0aCBhIGxvd2VyCisgICAqIG1heAorICAgKi8KKyAgc2VydmVyX2F1dGgtPmZhaWx1cmVzID0gMDsKKyAgc2VydmVyX2F1dGgtPm1heF9mYWlsdXJlcyA9IDY7CisgIAorICByZXR1cm4gYXV0aDsKK30KKworLyoqCisgKiBDcmVhdGVzIGEgbmV3IGF1dGggY29udmVyc2F0aW9uIG9iamVjdCBmb3IgdGhlIGNsaWVudCBzaWRlLgorICogU2VlIGh0dHA6Ly9kYnVzLmZyZWVkZXNrdG9wLm9yZy9kb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLmh0bWwjYXV0aC1wcm90b2NvbAorICogZm9yIGZ1bGwgZGV0YWlscyBvbiB3aGF0IHRoaXMgb2JqZWN0IGRvZXMuCisgKgorICogQHJldHVybnMgdGhlIG5ldyBvYmplY3Qgb3IgI05VTEwgaWYgbm8gbWVtb3J5CisgKi8KK0RCdXNBdXRoKgorX2RidXNfYXV0aF9jbGllbnRfbmV3ICh2b2lkKQoreworICBEQnVzQXV0aCAqYXV0aDsKKyAgREJ1c1N0cmluZyBndWlkX3N0cjsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZ3VpZF9zdHIpKQorICAgIHJldHVybiBOVUxMOworCisgIGF1dGggPSBfZGJ1c19hdXRoX25ldyAoc2l6ZW9mIChEQnVzQXV0aENsaWVudCkpOworICBpZiAoYXV0aCA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmZ3VpZF9zdHIpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIERCVVNfQVVUSF9DTElFTlQgKGF1dGgpLT5ndWlkX2Zyb21fc2VydmVyID0gZ3VpZF9zdHI7CisKKyAgYXV0aC0+c2lkZSA9IGF1dGhfc2lkZV9jbGllbnQ7CisgIGF1dGgtPnN0YXRlID0gJmNsaWVudF9zdGF0ZV9uZWVkX3NlbmRfYXV0aDsKKworICAvKiBTdGFydCB0aGUgYXV0aCBjb252ZXJzYXRpb24gYnkgc2VuZGluZyBBVVRIIGZvciBvdXIgZGVmYXVsdAorICAgKiBtZWNoYW5pc20gKi8KKyAgaWYgKCFzZW5kX2F1dGggKGF1dGgsICZhbGxfbWVjaGFuaXNtc1swXSkpCisgICAgeworICAgICAgX2RidXNfYXV0aF91bnJlZiAoYXV0aCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIAorICByZXR1cm4gYXV0aDsKK30KKworLyoqCisgKiBJbmNyZW1lbnRzIHRoZSByZWZjb3VudCBvZiBhbiBhdXRoIG9iamVjdC4KKyAqCisgKiBAcGFyYW0gYXV0aCB0aGUgYXV0aCBjb252ZXJzYXRpb24KKyAqIEByZXR1cm5zIHRoZSBhdXRoIGNvbnZlcnNhdGlvbgorICovCitEQnVzQXV0aCAqCitfZGJ1c19hdXRoX3JlZiAoREJ1c0F1dGggKmF1dGgpCit7CisgIF9kYnVzX2Fzc2VydCAoYXV0aCAhPSBOVUxMKTsKKyAgCisgIGF1dGgtPnJlZmNvdW50ICs9IDE7CisgIAorICByZXR1cm4gYXV0aDsKK30KKworLyoqCisgKiBEZWNyZW1lbnRzIHRoZSByZWZjb3VudCBvZiBhbiBhdXRoIG9iamVjdC4KKyAqCisgKiBAcGFyYW0gYXV0aCB0aGUgYXV0aCBjb252ZXJzYXRpb24KKyAqLwordm9pZAorX2RidXNfYXV0aF91bnJlZiAoREJ1c0F1dGggKmF1dGgpCit7CisgIF9kYnVzX2Fzc2VydCAoYXV0aCAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChhdXRoLT5yZWZjb3VudCA+IDApOworCisgIGF1dGgtPnJlZmNvdW50IC09IDE7CisgIGlmIChhdXRoLT5yZWZjb3VudCA9PSAwKQorICAgIHsKKyAgICAgIHNodXRkb3duX21lY2ggKGF1dGgpOworCisgICAgICBpZiAoREJVU19BVVRIX0lTX0NMSUVOVCAoYXV0aCkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJiBEQlVTX0FVVEhfQ0xJRU5UIChhdXRoKS0+Z3VpZF9mcm9tX3NlcnZlcik7CisgICAgICAgICAgX2RidXNfbGlzdF9jbGVhciAoJiBEQlVTX0FVVEhfQ0xJRU5UIChhdXRoKS0+bWVjaHNfdG9fdHJ5KTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfYXNzZXJ0IChEQlVTX0FVVEhfSVNfU0VSVkVSIChhdXRoKSk7CisKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJiBEQlVTX0FVVEhfU0VSVkVSIChhdXRoKS0+Z3VpZCk7CisgICAgICAgIH0KKworICAgICAgaWYgKGF1dGgtPmtleXJpbmcpCisgICAgICAgIF9kYnVzX2tleXJpbmdfdW5yZWYgKGF1dGgtPmtleXJpbmcpOworCisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmF1dGgtPmNvbnRleHQpOworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZhdXRoLT5jaGFsbGVuZ2UpOworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZhdXRoLT5pZGVudGl0eSk7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmF1dGgtPmluY29taW5nKTsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmYXV0aC0+b3V0Z29pbmcpOworCisgICAgICBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5IChhdXRoLT5hbGxvd2VkX21lY2hzKTsKKworICAgICAgX2RidXNfY3JlZGVudGlhbHNfdW5yZWYgKGF1dGgtPmNyZWRlbnRpYWxzKTsKKyAgICAgIF9kYnVzX2NyZWRlbnRpYWxzX3VucmVmIChhdXRoLT5hdXRob3JpemVkX2lkZW50aXR5KTsKKyAgICAgIF9kYnVzX2NyZWRlbnRpYWxzX3VucmVmIChhdXRoLT5kZXNpcmVkX2lkZW50aXR5KTsKKyAgICAgIAorICAgICAgZGJ1c19mcmVlIChhdXRoKTsKKyAgICB9Cit9CisKKy8qKgorICogU2V0cyBhbiBhcnJheSBvZiBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc20gbmFtZXMKKyAqIHRoYXQgd2UgYXJlIHdpbGxpbmcgdG8gdXNlLgorICoKKyAqIEBwYXJhbSBhdXRoIHRoZSBhdXRoIGNvbnZlcnNhdGlvbgorICogQHBhcmFtIG1lY2hhbmlzbXMgI05VTEwtdGVybWluYXRlZCBhcnJheSBvZiBtZWNoYW5pc20gbmFtZXMKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBubyBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2F1dGhfc2V0X21lY2hhbmlzbXMgKERCdXNBdXRoICAgICphdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKm1lY2hhbmlzbXMpCit7CisgIGNoYXIgKipjb3B5OworCisgIGlmIChtZWNoYW5pc21zICE9IE5VTEwpCisgICAgeworICAgICAgY29weSA9IF9kYnVzX2R1cF9zdHJpbmdfYXJyYXkgKG1lY2hhbmlzbXMpOworICAgICAgaWYgKGNvcHkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgZWxzZQorICAgIGNvcHkgPSBOVUxMOworICAKKyAgZGJ1c19mcmVlX3N0cmluZ19hcnJheSAoYXV0aC0+YWxsb3dlZF9tZWNocyk7CisKKyAgYXV0aC0+YWxsb3dlZF9tZWNocyA9IGNvcHk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogQHBhcmFtIGF1dGggdGhlIGF1dGggY29udmVyc2F0aW9uIG9iamVjdAorICogQHJldHVybnMgI1RSVUUgaWYgd2UncmUgaW4gYSBmaW5hbCBzdGF0ZQorICovCisjZGVmaW5lIERCVVNfQVVUSF9JTl9FTkRfU1RBVEUoYXV0aCkgKChhdXRoKS0+c3RhdGUtPmhhbmRsZXIgPT0gTlVMTCkKKworLyoqCisgKiBBbmFseXplcyBidWZmZXJlZCBpbnB1dCBhbmQgbW92ZXMgdGhlIGF1dGggY29udmVyc2F0aW9uIGZvcndhcmQsCisgKiByZXR1cm5pbmcgdGhlIG5ldyBzdGF0ZSBvZiB0aGUgYXV0aCBjb252ZXJzYXRpb24uCisgKgorICogQHBhcmFtIGF1dGggdGhlIGF1dGggY29udmVyc2F0aW9uCisgKiBAcmV0dXJucyB0aGUgbmV3IHN0YXRlCisgKi8KK0RCdXNBdXRoU3RhdGUKK19kYnVzX2F1dGhfZG9fd29yayAoREJ1c0F1dGggKmF1dGgpCit7CisgIGF1dGgtPm5lZWRlZF9tZW1vcnkgPSBGQUxTRTsKKworICAvKiBNYXggYW1vdW50IHdlJ2xsIGJ1ZmZlciB1cCBiZWZvcmUgZGVjaWRpbmcgc29tZW9uZSdzIG9uIGNyYWNrICovCisjZGVmaW5lIE1BWF9CVUZGRVIgKDE2ICogX0RCVVNfT05FX0tJTE9CWVRFKQorCisgIGRvCisgICAgeworICAgICAgaWYgKERCVVNfQVVUSF9JTl9FTkRfU1RBVEUgKGF1dGgpKQorICAgICAgICBicmVhazsKKyAgICAgIAorICAgICAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmYXV0aC0+aW5jb21pbmcpID4gTUFYX0JVRkZFUiB8fAorICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmYXV0aC0+b3V0Z29pbmcpID4gTUFYX0JVRkZFUikKKyAgICAgICAgeworICAgICAgICAgIGdvdG9fc3RhdGUgKGF1dGgsICZjb21tb25fc3RhdGVfbmVlZF9kaXNjb25uZWN0KTsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiJXM6IERpc2Nvbm5lY3RpbmcgZHVlIHRvIGV4Y2Vzc2l2ZSBkYXRhIGJ1ZmZlcmVkIGluIGF1dGggcGhhc2VcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19BVVRIX05BTUUgKGF1dGgpKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgd2hpbGUgKHByb2Nlc3NfY29tbWFuZCAoYXV0aCkpOworCisgIGlmIChhdXRoLT5uZWVkZWRfbWVtb3J5KQorICAgIHJldHVybiBEQlVTX0FVVEhfU1RBVEVfV0FJVElOR19GT1JfTUVNT1JZOworICBlbHNlIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmF1dGgtPm91dGdvaW5nKSA+IDApCisgICAgcmV0dXJuIERCVVNfQVVUSF9TVEFURV9IQVZFX0JZVEVTX1RPX1NFTkQ7CisgIGVsc2UgaWYgKGF1dGgtPnN0YXRlID09ICZjb21tb25fc3RhdGVfbmVlZF9kaXNjb25uZWN0KQorICAgIHJldHVybiBEQlVTX0FVVEhfU1RBVEVfTkVFRF9ESVNDT05ORUNUOworICBlbHNlIGlmIChhdXRoLT5zdGF0ZSA9PSAmY29tbW9uX3N0YXRlX2F1dGhlbnRpY2F0ZWQpCisgICAgcmV0dXJuIERCVVNfQVVUSF9TVEFURV9BVVRIRU5USUNBVEVEOworICBlbHNlIHJldHVybiBEQlVTX0FVVEhfU1RBVEVfV0FJVElOR19GT1JfSU5QVVQ7Cit9CisKKy8qKgorICogR2V0cyBieXRlcyB0aGF0IG5lZWQgdG8gYmUgc2VudCB0byB0aGUgcGVlciB3ZSdyZSBjb252ZXJzaW5nIHdpdGguCisgKiBBZnRlciB3cml0aW5nIHNvbWUgYnl0ZXMsIF9kYnVzX2F1dGhfYnl0ZXNfc2VudCgpIG11c3QgYmUgY2FsbGVkCisgKiB0byBub3RpZnkgdGhlIGF1dGggb2JqZWN0IHRoYXQgdGhleSB3ZXJlIHdyaXR0ZW4uCisgKgorICogQHBhcmFtIGF1dGggdGhlIGF1dGggY29udmVyc2F0aW9uCisgKiBAcGFyYW0gc3RyIHJldHVybiBsb2NhdGlvbiBmb3IgYSByZWYgdG8gdGhlIGJ1ZmZlciB0byBzZW5kCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm90aGluZyB0byBzZW5kCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19hdXRoX2dldF9ieXRlc190b19zZW5kIChEQnVzQXV0aCAgICAgICAgICAqYXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKipzdHIpCit7CisgIF9kYnVzX2Fzc2VydCAoYXV0aCAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChzdHIgIT0gTlVMTCk7CisKKyAgKnN0ciA9IE5VTEw7CisgIAorICBpZiAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZhdXRoLT5vdXRnb2luZykgPT0gMCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgKnN0ciA9ICZhdXRoLT5vdXRnb2luZzsKKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBOb3RpZmllcyB0aGUgYXV0aCBjb252ZXJzYXRpb24gb2JqZWN0IHRoYXQKKyAqIHRoZSBnaXZlbiBudW1iZXIgb2YgYnl0ZXMgb2YgdGhlIG91dGdvaW5nIGJ1ZmZlcgorICogaGF2ZSBiZWVuIHdyaXR0ZW4gb3V0LgorICoKKyAqIEBwYXJhbSBhdXRoIHRoZSBhdXRoIGNvbnZlcnNhdGlvbgorICogQHBhcmFtIGJ5dGVzX3NlbnQgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gb3V0CisgKi8KK3ZvaWQKK19kYnVzX2F1dGhfYnl0ZXNfc2VudCAoREJ1c0F1dGggKmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBieXRlc19zZW50KQoreworICBfZGJ1c192ZXJib3NlICgiJXM6IFNlbnQgJWQgYnl0ZXMgb2Y6ICVzXG4iLAorICAgICAgICAgICAgICAgICBEQlVTX0FVVEhfTkFNRSAoYXV0aCksCisgICAgICAgICAgICAgICAgIGJ5dGVzX3NlbnQsCisgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmF1dGgtPm91dGdvaW5nKSk7CisgIAorICBfZGJ1c19zdHJpbmdfZGVsZXRlICgmYXV0aC0+b3V0Z29pbmcsCisgICAgICAgICAgICAgICAgICAgICAgIDAsIGJ5dGVzX3NlbnQpOworfQorCisvKioKKyAqIEdldCBhIGJ1ZmZlciB0byBiZSB1c2VkIGZvciByZWFkaW5nIGJ5dGVzIGZyb20gdGhlIHBlZXIgd2UncmUgY29udmVyc2luZworICogd2l0aC4gQnl0ZXMgc2hvdWxkIGJlIGFwcGVuZGVkIHRvIHRoaXMgYnVmZmVyLgorICoKKyAqIEBwYXJhbSBhdXRoIHRoZSBhdXRoIGNvbnZlcnNhdGlvbgorICogQHBhcmFtIGJ1ZmZlciByZXR1cm4gbG9jYXRpb24gZm9yIGJ1ZmZlciB0byBhcHBlbmQgYnl0ZXMgdG8KKyAqLwordm9pZAorX2RidXNfYXV0aF9nZXRfYnVmZmVyIChEQnVzQXV0aCAgICAgKmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgKipidWZmZXIpCit7CisgIF9kYnVzX2Fzc2VydCAoYXV0aCAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0ICghYXV0aC0+YnVmZmVyX291dHN0YW5kaW5nKTsKKyAgCisgICpidWZmZXIgPSAmYXV0aC0+aW5jb21pbmc7CisKKyAgYXV0aC0+YnVmZmVyX291dHN0YW5kaW5nID0gVFJVRTsKK30KKworLyoqCisgKiBSZXR1cm5zIGEgYnVmZmVyIHdpdGggbmV3IGRhdGEgcmVhZCBpbnRvIGl0LgorICoKKyAqIEBwYXJhbSBhdXRoIHRoZSBhdXRoIGNvbnZlcnNhdGlvbgorICogQHBhcmFtIGJ1ZmZlciB0aGUgYnVmZmVyIGJlaW5nIHJldHVybmVkCisgKi8KK3ZvaWQKK19kYnVzX2F1dGhfcmV0dXJuX2J1ZmZlciAoREJ1c0F1dGggICAgICAgICAgICAgICAqYXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAgICAgICAqYnVmZmVyKQoreworICBfZGJ1c19hc3NlcnQgKGJ1ZmZlciA9PSAmYXV0aC0+aW5jb21pbmcpOworICBfZGJ1c19hc3NlcnQgKGF1dGgtPmJ1ZmZlcl9vdXRzdGFuZGluZyk7CisKKyAgYXV0aC0+YnVmZmVyX291dHN0YW5kaW5nID0gRkFMU0U7Cit9CisKKy8qKgorICogUmV0dXJucyBsZWZ0b3ZlciBieXRlcyB0aGF0IHdlcmUgbm90IHVzZWQgYXMgcGFydCBvZiB0aGUgYXV0aAorICogY29udmVyc2F0aW9uLiAgVGhlc2UgYnl0ZXMgd2lsbCBiZSBwYXJ0IG9mIHRoZSBtZXNzYWdlIHN0cmVhbQorICogaW5zdGVhZC4gVGhpcyBmdW5jdGlvbiBtYXkgbm90IGJlIGNhbGxlZCB1bnRpbCBhdXRoZW50aWNhdGlvbiBoYXMKKyAqIHN1Y2NlZWRlZC4KKyAqCisgKiBAcGFyYW0gYXV0aCB0aGUgYXV0aCBjb252ZXJzYXRpb24KKyAqIEBwYXJhbSBzdHIgcmV0dXJuIGxvY2F0aW9uIGZvciBwb2ludGVyIHRvIHN0cmluZyBvZiB1bnVzZWQgYnl0ZXMKKyAqLwordm9pZAorX2RidXNfYXV0aF9nZXRfdW51c2VkX2J5dGVzIChEQnVzQXV0aCAgICAgICAgICAgKmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKipzdHIpCit7CisgIGlmICghREJVU19BVVRIX0lOX0VORF9TVEFURSAoYXV0aCkpCisgICAgcmV0dXJuOworCisgICpzdHIgPSAmYXV0aC0+aW5jb21pbmc7Cit9CisKKworLyoqCisgKiBHZXRzIHJpZCBvZiB1bnVzZWQgYnl0ZXMgcmV0dXJuZWQgYnkgX2RidXNfYXV0aF9nZXRfdW51c2VkX2J5dGVzKCkKKyAqIGFmdGVyIHdlJ3ZlIGdvdHRlbiB0aGVtIGFuZCBzdWNjZXNzZnVsbHkgbW92ZWQgdGhlbSBlbHNld2hlcmUuCisgKgorICogQHBhcmFtIGF1dGggdGhlIGF1dGggY29udmVyc2F0aW9uCisgKi8KK3ZvaWQKK19kYnVzX2F1dGhfZGVsZXRlX3VudXNlZF9ieXRlcyAoREJ1c0F1dGggKmF1dGgpCit7CisgIGlmICghREJVU19BVVRIX0lOX0VORF9TVEFURSAoYXV0aCkpCisgICAgcmV0dXJuOworCisgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoICgmYXV0aC0+aW5jb21pbmcsIDApOworfQorCisvKioKKyAqIENhbGxlZCBwb3N0LWF1dGhlbnRpY2F0aW9uLCBpbmRpY2F0ZXMgd2hldGhlciB3ZSBuZWVkIHRvIGVuY29kZQorICogdGhlIG1lc3NhZ2Ugc3RyZWFtIHdpdGggX2RidXNfYXV0aF9lbmNvZGVfZGF0YSgpIHByaW9yIHRvCisgKiBzZW5kaW5nIGl0IHRvIHRoZSBwZWVyLgorICoKKyAqIEBwYXJhbSBhdXRoIHRoZSBhdXRoIGNvbnZlcnNhdGlvbgorICogQHJldHVybnMgI1RSVUUgaWYgd2UgbmVlZCB0byBlbmNvZGUgdGhlIHN0cmVhbQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfYXV0aF9uZWVkc19lbmNvZGluZyAoREJ1c0F1dGggKmF1dGgpCit7CisgIGlmIChhdXRoLT5zdGF0ZSAhPSAmY29tbW9uX3N0YXRlX2F1dGhlbnRpY2F0ZWQpCisgICAgcmV0dXJuIEZBTFNFOworICAKKyAgaWYgKGF1dGgtPm1lY2ggIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoREJVU19BVVRIX0lTX0NMSUVOVCAoYXV0aCkpCisgICAgICAgIHJldHVybiBhdXRoLT5tZWNoLT5jbGllbnRfZW5jb2RlX2Z1bmMgIT0gTlVMTDsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGF1dGgtPm1lY2gtPnNlcnZlcl9lbmNvZGVfZnVuYyAhPSBOVUxMOworICAgIH0KKyAgZWxzZQorICAgIHJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBDYWxsZWQgcG9zdC1hdXRoZW50aWNhdGlvbiwgZW5jb2RlcyBhIGJsb2NrIG9mIGJ5dGVzIGZvciBzZW5kaW5nIHRvCisgKiB0aGUgcGVlci4gSWYgbm8gZW5jb2Rpbmcgd2FzIG5lZ290aWF0ZWQsIGp1c3QgY29waWVzIHRoZSBieXRlcworICogKHlvdSBjYW4gYXZvaWQgdGhpcyBieSBjaGVja2luZyBfZGJ1c19hdXRoX25lZWRzX2VuY29kaW5nKCkpLgorICoKKyAqIEBwYXJhbSBhdXRoIHRoZSBhdXRoIGNvbnZlcnNhdGlvbgorICogQHBhcmFtIHBsYWludGV4dCB0aGUgcGxhaW4gdGV4dCBkYXRhCisgKiBAcGFyYW0gZW5jb2RlZCBpbml0aWFsaXplZCBzdHJpbmcgdG8gd2hlcmUgZW5jb2RlZCBkYXRhIGlzIGFwcGVuZGVkCisgKiBAcmV0dXJucyAjVFJVRSBpZiB3ZSBoYWQgZW5vdWdoIG1lbW9yeSBhbmQgc3VjY2Vzc2Z1bGx5IGVuY29kZWQKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2F1dGhfZW5jb2RlX2RhdGEgKERCdXNBdXRoICAgICAgICAgKmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpwbGFpbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICplbmNvZGVkKQoreworICBfZGJ1c19hc3NlcnQgKHBsYWludGV4dCAhPSBlbmNvZGVkKTsKKyAgCisgIGlmIChhdXRoLT5zdGF0ZSAhPSAmY29tbW9uX3N0YXRlX2F1dGhlbnRpY2F0ZWQpCisgICAgcmV0dXJuIEZBTFNFOworICAKKyAgaWYgKF9kYnVzX2F1dGhfbmVlZHNfZW5jb2RpbmcgKGF1dGgpKQorICAgIHsKKyAgICAgIGlmIChEQlVTX0FVVEhfSVNfQ0xJRU5UIChhdXRoKSkKKyAgICAgICAgcmV0dXJuICgqIGF1dGgtPm1lY2gtPmNsaWVudF9lbmNvZGVfZnVuYykgKGF1dGgsIHBsYWludGV4dCwgZW5jb2RlZCk7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiAoKiBhdXRoLT5tZWNoLT5zZXJ2ZXJfZW5jb2RlX2Z1bmMpIChhdXRoLCBwbGFpbnRleHQsIGVuY29kZWQpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHJldHVybiBfZGJ1c19zdHJpbmdfY29weSAocGxhaW50ZXh0LCAwLCBlbmNvZGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoZW5jb2RlZCkpOworICAgIH0KK30KKworLyoqCisgKiBDYWxsZWQgcG9zdC1hdXRoZW50aWNhdGlvbiwgaW5kaWNhdGVzIHdoZXRoZXIgd2UgbmVlZCB0byBkZWNvZGUKKyAqIHRoZSBtZXNzYWdlIHN0cmVhbSB3aXRoIF9kYnVzX2F1dGhfZGVjb2RlX2RhdGEoKSBhZnRlcgorICogcmVjZWl2aW5nIGl0IGZyb20gdGhlIHBlZXIuCisgKgorICogQHBhcmFtIGF1dGggdGhlIGF1dGggY29udmVyc2F0aW9uCisgKiBAcmV0dXJucyAjVFJVRSBpZiB3ZSBuZWVkIHRvIGVuY29kZSB0aGUgc3RyZWFtCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19hdXRoX25lZWRzX2RlY29kaW5nIChEQnVzQXV0aCAqYXV0aCkKK3sKKyAgaWYgKGF1dGgtPnN0YXRlICE9ICZjb21tb25fc3RhdGVfYXV0aGVudGljYXRlZCkKKyAgICByZXR1cm4gRkFMU0U7CisgICAgCisgIGlmIChhdXRoLT5tZWNoICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKERCVVNfQVVUSF9JU19DTElFTlQgKGF1dGgpKQorICAgICAgICByZXR1cm4gYXV0aC0+bWVjaC0+Y2xpZW50X2RlY29kZV9mdW5jICE9IE5VTEw7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBhdXRoLT5tZWNoLT5zZXJ2ZXJfZGVjb2RlX2Z1bmMgIT0gTlVMTDsKKyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKworLyoqCisgKiBDYWxsZWQgcG9zdC1hdXRoZW50aWNhdGlvbiwgZGVjb2RlcyBhIGJsb2NrIG9mIGJ5dGVzIHJlY2VpdmVkIGZyb20KKyAqIHRoZSBwZWVyLiBJZiBubyBlbmNvZGluZyB3YXMgbmVnb3RpYXRlZCwganVzdCBjb3BpZXMgdGhlIGJ5dGVzICh5b3UKKyAqIGNhbiBhdm9pZCB0aGlzIGJ5IGNoZWNraW5nIF9kYnVzX2F1dGhfbmVlZHNfZGVjb2RpbmcoKSkuCisgKgorICogQHRvZG8gMS4wPyBXZSBuZWVkIHRvIGJlIGFibGUgdG8gZGlzdGluZ3Vpc2ggIm91dCBvZiBtZW1vcnkiIGVycm9yCisgKiBmcm9tICJ0aGUgZGF0YSBpcyBob3NlZCIgZXJyb3IuCisgKgorICogQHBhcmFtIGF1dGggdGhlIGF1dGggY29udmVyc2F0aW9uCisgKiBAcGFyYW0gZW5jb2RlZCB0aGUgZW5jb2RlZCBkYXRhCisgKiBAcGFyYW0gcGxhaW50ZXh0IGluaXRpYWxpemVkIHN0cmluZyB3aGVyZSBkZWNvZGVkIGRhdGEgaXMgYXBwZW5kZWQKKyAqIEByZXR1cm5zICNUUlVFIGlmIHdlIGhhZCBlbm91Z2ggbWVtb3J5IGFuZCBzdWNjZXNzZnVsbHkgZGVjb2RlZAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfYXV0aF9kZWNvZGVfZGF0YSAoREJ1c0F1dGggICAgICAgICAqYXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmVuY29kZWQsCisgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICpwbGFpbnRleHQpCit7CisgIF9kYnVzX2Fzc2VydCAocGxhaW50ZXh0ICE9IGVuY29kZWQpOworICAKKyAgaWYgKGF1dGgtPnN0YXRlICE9ICZjb21tb25fc3RhdGVfYXV0aGVudGljYXRlZCkKKyAgICByZXR1cm4gRkFMU0U7CisgIAorICBpZiAoX2RidXNfYXV0aF9uZWVkc19kZWNvZGluZyAoYXV0aCkpCisgICAgeworICAgICAgaWYgKERCVVNfQVVUSF9JU19DTElFTlQgKGF1dGgpKQorICAgICAgICByZXR1cm4gKCogYXV0aC0+bWVjaC0+Y2xpZW50X2RlY29kZV9mdW5jKSAoYXV0aCwgZW5jb2RlZCwgcGxhaW50ZXh0KTsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuICgqIGF1dGgtPm1lY2gtPnNlcnZlcl9kZWNvZGVfZnVuYykgKGF1dGgsIGVuY29kZWQsIHBsYWludGV4dCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgcmV0dXJuIF9kYnVzX3N0cmluZ19jb3B5IChlbmNvZGVkLCAwLCBwbGFpbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChwbGFpbnRleHQpKTsKKyAgICB9Cit9CisKKy8qKgorICogU2V0cyBjcmVkZW50aWFscyByZWNlaXZlZCB2aWEgcmVsaWFibGUgbWVhbnMgZnJvbSB0aGUgb3BlcmF0aW5nCisgKiBzeXN0ZW0uCisgKgorICogQHBhcmFtIGF1dGggdGhlIGF1dGggY29udmVyc2F0aW9uCisgKiBAcGFyYW0gY3JlZGVudGlhbHMgdGhlIGNyZWRlbnRpYWxzIHJlY2VpdmVkCisgKiBAcmV0dXJucyAjRkFMU0Ugb24gT09NCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19hdXRoX3NldF9jcmVkZW50aWFscyAoREJ1c0F1dGggICAgICAgICAgICAgICAqYXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ3JlZGVudGlhbHMgICAgICAgICpjcmVkZW50aWFscykKK3sKKyAgX2RidXNfY3JlZGVudGlhbHNfY2xlYXIgKGF1dGgtPmNyZWRlbnRpYWxzKTsKKyAgcmV0dXJuIF9kYnVzX2NyZWRlbnRpYWxzX2FkZF9jcmVkZW50aWFscyAoYXV0aC0+Y3JlZGVudGlhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWRlbnRpYWxzKTsKK30KKworLyoqCisgKiBHZXRzIHRoZSBpZGVudGl0eSB3ZSBhdXRob3JpemVkIHRoZSBjbGllbnQgYXMuICBBcHBzIG1heSBoYXZlCisgKiBkaWZmZXJlbnQgcG9saWNpZXMgYXMgdG8gd2hhdCBpZGVudGl0aWVzIHRoZXkgYWxsb3cuCisgKgorICogUmV0dXJuZWQgY3JlZGVudGlhbHMgYXJlIG5vdCBhIGNvcHkgYW5kIHNob3VsZCBub3QgYmUgbW9kaWZpZWQKKyAqCisgKiBAcGFyYW0gYXV0aCB0aGUgYXV0aCBjb252ZXJzYXRpb24KKyAqIEByZXR1cm5zIHRoZSBjcmVkZW50aWFscyB3ZSd2ZSBhdXRob3JpemVkIEJZIFJFRkVSRU5DRSBkbyBub3QgbW9kaWZ5CisgKi8KK0RCdXNDcmVkZW50aWFscyoKK19kYnVzX2F1dGhfZ2V0X2lkZW50aXR5IChEQnVzQXV0aCAgICAgICAgICAgICAgICphdXRoKQoreworICBpZiAoYXV0aC0+c3RhdGUgPT0gJmNvbW1vbl9zdGF0ZV9hdXRoZW50aWNhdGVkKQorICAgIHsKKyAgICAgIHJldHVybiBhdXRoLT5hdXRob3JpemVkX2lkZW50aXR5OworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIEZJWE1FIGluc3RlYWQgb2YgdGhpcywga2VlcCBhbiBlbXB0eSBjcmVkZW50aWFsIGFyb3VuZCB0aGF0CisgICAgICAgKiBkb2Vzbid0IHJlcXVpcmUgYWxsb2NhdGlvbiBvciBzb21ldGhpbmcKKyAgICAgICAqLworICAgICAgLyogcmV0dXJuIGVtcHR5IGNyZWRlbnRpYWxzICovCisgICAgICBfZGJ1c19hc3NlcnQgKF9kYnVzX2NyZWRlbnRpYWxzX2FyZV9lbXB0eSAoYXV0aC0+YXV0aG9yaXplZF9pZGVudGl0eSkpOworICAgICAgcmV0dXJuIGF1dGgtPmF1dGhvcml6ZWRfaWRlbnRpdHk7CisgICAgfQorfQorCisvKioKKyAqIEdldHMgdGhlIEdVSUQgZnJvbSB0aGUgc2VydmVyIGlmIHdlJ3ZlIGF1dGhlbnRpY2F0ZWQ7IGdldHMKKyAqICNOVUxMIG90aGVyd2lzZS4KKyAqIEBwYXJhbSBhdXRoIHRoZSBhdXRoIG9iamVjdAorICogQHJldHVybnMgdGhlIEdVSUQgaW4gQVNDSUkgaGV4IGZvcm1hdAorICovCitjb25zdCBjaGFyKgorX2RidXNfYXV0aF9nZXRfZ3VpZF9mcm9tX3NlcnZlciAoREJ1c0F1dGggKmF1dGgpCit7CisgIF9kYnVzX2Fzc2VydCAoREJVU19BVVRIX0lTX0NMSUVOVCAoYXV0aCkpOworICAKKyAgaWYgKGF1dGgtPnN0YXRlID09ICZjb21tb25fc3RhdGVfYXV0aGVudGljYXRlZCkKKyAgICByZXR1cm4gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmIERCVVNfQVVUSF9DTElFTlQgKGF1dGgpLT5ndWlkX2Zyb21fc2VydmVyKTsKKyAgZWxzZQorICAgIHJldHVybiBOVUxMOworfQorCisvKioKKyAqIFNldHMgdGhlICJhdXRoZW50aWNhdGlvbiBjb250ZXh0IiB3aGljaCBzY29wZXMgY29va2llcworICogd2l0aCB0aGUgREJVU19DT09LSUVfU0hBMSBhdXRoIG1lY2hhbmlzbSBmb3IgZXhhbXBsZS4KKyAqCisgKiBAcGFyYW0gYXV0aCB0aGUgYXV0aCBjb252ZXJzYXRpb24KKyAqIEBwYXJhbSBjb250ZXh0IHRoZSBjb250ZXh0CisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm8gbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19hdXRoX3NldF9jb250ZXh0IChEQnVzQXV0aCAgICAgICAgICAgICAgICphdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAgICAgICAqY29udGV4dCkKK3sKKyAgcmV0dXJuIF9kYnVzX3N0cmluZ19yZXBsYWNlX2xlbiAoY29udGV4dCwgMCwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGNvbnRleHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXV0aC0+Y29udGV4dCwgMCwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGNvbnRleHQpKTsKK30KKworLyoqCisgKiBTZXRzIHdoZXRoZXIgdW5peCBmZCBwYXNzaW5nIGlzIHBvdGVudGlhbGx5IG9uIHRoZSB0cmFuc3BvcnQgYW5kCisgKiBoZW5jZSBzaGFsbCBiZSBuZWdvdGlhdGVkLgorICoKKyAqIEBwYXJhbSBhdXRoIHRoZSBhdXRoIGNvbnZlcnNhdGlvbgorICogQHBhcmFtIGIgVFJVRSB3aGVuIHVuaXggZmQgcGFzc2luZyBzaGFsbCBiZSBuZWdvdGlhdGVkLCBvdGhlcndpc2UgRkFMU0UKKyAqLwordm9pZAorX2RidXNfYXV0aF9zZXRfdW5peF9mZF9wb3NzaWJsZShEQnVzQXV0aCAqYXV0aCwgZGJ1c19ib29sX3QgYikKK3sKKyAgYXV0aC0+dW5peF9mZF9wb3NzaWJsZSA9IGI7Cit9CisKKy8qKgorICogUXVlcmllcyB3aGV0aGVyIHVuaXggZmQgcGFzc2luZyB3YXMgc3VjY2Vzc2Z1bGx5IG5lZ290aWF0ZWQuCisgKgorICogQHBhcmFtIGF1dGggdGhlIGF1dGggY29udmVyc2lvbgorICogQHJldHVybnMgI1RSVUUgd2hlbiB1bml4IGZkIHBhc3Npbmcgd2FzIG5lZ290aWF0ZWQuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19hdXRoX2dldF91bml4X2ZkX25lZ290aWF0ZWQoREJ1c0F1dGggKmF1dGgpCit7CisgIHJldHVybiBhdXRoLT51bml4X2ZkX25lZ290aWF0ZWQ7Cit9CisKKy8qKgorICogUXVlcmllcyB3aGV0aGVyIHRoZSBnaXZlbiBhdXRoIG1lY2hhbmlzbSBpcyBzdXBwb3J0ZWQuCisgKgorICogQHBhcmFtIGF1dGggdGhlIGF1dGggbWVjaGFuaXNtIHRvIHF1ZXJ5IGZvcgorICogQHJldHVybnMgI1RSVUUgd2hlbiBhdXRoIG1lY2hhbmlzbSBpcyBzdXBwb3J0ZWQKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2F1dGhfaXNfc3VwcG9ydGVkX21lY2hhbmlzbSAoREJ1c1N0cmluZyAqbmFtZSkKK3sKKyAgX2RidXNfYXNzZXJ0IChuYW1lICE9IE5VTEwpOworCisgIHJldHVybiBmaW5kX21lY2ggKG5hbWUsIE5VTEwpICE9IE5VTEw7Cit9CisKKy8qKgorICogUmV0dXJuIGEgaHVtYW4tcmVhZGFibGUgc3RyaW5nIGNvbnRhaW5pbmcgYWxsIHN1cHBvcnRlZCBhdXRoIG1lY2hhbmlzbXMuCisgKgorICogQHBhcmFtIHN0cmluZyB0byBob2xkIHRoZSBzdXBwb3J0ZWQgYXV0aCBtZWNoYW5pc21zCisgKiBAcmV0dXJucyAjRkFMU0Ugb24gb29tCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19hdXRoX2R1bXBfc3VwcG9ydGVkX21lY2hhbmlzbXMgKERCdXNTdHJpbmcgKmJ1ZmZlcikKK3sKKyAgdW5zaWduZWQgaW50IGk7CisgIF9kYnVzX2Fzc2VydCAoYnVmZmVyICE9IE5VTEwpOworCisgIGZvciAoaSA9IDA7IGFsbF9tZWNoYW5pc21zW2ldLm1lY2hhbmlzbSAhPSBOVUxMOyBpKyspCisgICAgeworICAgICAgaWYgKGkgPiAwKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kIChidWZmZXIsICIsICIpKQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKGJ1ZmZlciwgYWxsX21lY2hhbmlzbXNbaV0ubWVjaGFuaXNtKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKiBAfSAqLworCisvKiB0ZXN0cyBpbiBkYnVzLWF1dGgtdXRpbC5jICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtYXV0aC5oIGIvZGJ1cy9kYnVzLWF1dGguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGMwYzFlCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLWF1dGguaApAQCAtMCwwICsxLDEwMiBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLWF1dGguaCBBdXRoZW50aWNhdGlvbgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiAgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaWZuZGVmIERCVVNfQVVUSF9ICisjZGVmaW5lIERCVVNfQVVUSF9ICisKKyNpbmNsdWRlIDxkYnVzL2RidXMtbWFjcm9zLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWVycm9ycy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zdHJpbmcuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc3lzZGVwcy5oPgorCitEQlVTX0JFR0lOX0RFQ0xTCisKK3R5cGVkZWYgc3RydWN0IERCdXNBdXRoIERCdXNBdXRoOworCit0eXBlZGVmIGVudW0KK3sKKyAgREJVU19BVVRIX1NUQVRFX1dBSVRJTkdfRk9SX0lOUFVULAorICBEQlVTX0FVVEhfU1RBVEVfV0FJVElOR19GT1JfTUVNT1JZLAorICBEQlVTX0FVVEhfU1RBVEVfSEFWRV9CWVRFU19UT19TRU5ELAorICBEQlVTX0FVVEhfU1RBVEVfTkVFRF9ESVNDT05ORUNULAorICBEQlVTX0FVVEhfU1RBVEVfQVVUSEVOVElDQVRFRCwKKyAgREJVU19BVVRIX1NUQVRFX0lOVkFMSUQgPSAtMQorfSBEQnVzQXV0aFN0YXRlOworCitEQlVTX1BSSVZBVEVfRVhQT1JUCitEQnVzQXV0aCogICAgIF9kYnVzX2F1dGhfc2VydmVyX25ldyAgICAgICAgICAoY29uc3QgREJ1c1N0cmluZyAgICAgICAqZ3VpZCk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitEQnVzQXV0aCogICAgIF9kYnVzX2F1dGhfY2xpZW50X25ldyAgICAgICAgICAodm9pZCk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitEQnVzQXV0aCogICAgIF9kYnVzX2F1dGhfcmVmICAgICAgICAgICAgICAgICAoREJ1c0F1dGggICAgICAgICAgICAgICAqYXV0aCk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCit2b2lkICAgICAgICAgIF9kYnVzX2F1dGhfdW5yZWYgICAgICAgICAgICAgICAoREJ1c0F1dGggICAgICAgICAgICAgICAqYXV0aCk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCAgIF9kYnVzX2F1dGhfc2V0X21lY2hhbmlzbXMgICAgICAoREJ1c0F1dGggICAgICAgICAgICAgICAqYXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAgICAgKiptZWNoYW5pc21zKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK0RCdXNBdXRoU3RhdGUgX2RidXNfYXV0aF9kb193b3JrICAgICAgICAgICAgIChEQnVzQXV0aCAgICAgICAgICAgICAgICphdXRoKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90ICAgX2RidXNfYXV0aF9nZXRfYnl0ZXNfdG9fc2VuZCAgIChEQnVzQXV0aCAgICAgICAgICAgICAgICphdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICAgICAqKnN0cik7CitEQlVTX1BSSVZBVEVfRVhQT1JUCit2b2lkICAgICAgICAgIF9kYnVzX2F1dGhfYnl0ZXNfc2VudCAgICAgICAgICAoREJ1c0F1dGggICAgICAgICAgICAgICAqYXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBieXRlc19zZW50KTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK3ZvaWQgICAgICAgICAgX2RidXNfYXV0aF9nZXRfYnVmZmVyICAgICAgICAgIChEQnVzQXV0aCAgICAgICAgICAgICAgICphdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgICAgICAqKmJ1ZmZlcik7CitEQlVTX1BSSVZBVEVfRVhQT1JUCit2b2lkICAgICAgICAgIF9kYnVzX2F1dGhfcmV0dXJuX2J1ZmZlciAgICAgICAoREJ1c0F1dGggICAgICAgICAgICAgICAqYXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICAgICAgICpidWZmZXIpOworREJVU19QUklWQVRFX0VYUE9SVAordm9pZCAgICAgICAgICBfZGJ1c19hdXRoX2dldF91bnVzZWRfYnl0ZXMgICAgKERCdXNBdXRoICAgICAgICAgICAgICAgKmF1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAgICAgICoqc3RyKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK3ZvaWQgICAgICAgICAgX2RidXNfYXV0aF9kZWxldGVfdW51c2VkX2J5dGVzIChEQnVzQXV0aCAgICAgICAgICAgICAgICphdXRoKTsKK2RidXNfYm9vbF90ICAgX2RidXNfYXV0aF9uZWVkc19lbmNvZGluZyAgICAgIChEQnVzQXV0aCAgICAgICAgICAgICAgICphdXRoKTsKK2RidXNfYm9vbF90ICAgX2RidXNfYXV0aF9lbmNvZGVfZGF0YSAgICAgICAgIChEQnVzQXV0aCAgICAgICAgICAgICAgICphdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICAgICAgKnBsYWludGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICAgICAgICplbmNvZGVkKTsKK2RidXNfYm9vbF90ICAgX2RidXNfYXV0aF9uZWVkc19kZWNvZGluZyAgICAgIChEQnVzQXV0aCAgICAgICAgICAgICAgICphdXRoKTsKK2RidXNfYm9vbF90ICAgX2RidXNfYXV0aF9kZWNvZGVfZGF0YSAgICAgICAgIChEQnVzQXV0aCAgICAgICAgICAgICAgICphdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICAgICAgKmVuY29kZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAgICAgICAqcGxhaW50ZXh0KTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90ICAgX2RidXNfYXV0aF9zZXRfY3JlZGVudGlhbHMgICAgIChEQnVzQXV0aCAgICAgICAgICAgICAgICphdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDcmVkZW50aWFscyAgICAgICAgKmNyZWRlbnRpYWxzKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK0RCdXNDcmVkZW50aWFscyogX2RidXNfYXV0aF9nZXRfaWRlbnRpdHkgICAgIChEQnVzQXV0aCAgICAgICAgICAgICAgICphdXRoKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90ICAgX2RidXNfYXV0aF9zZXRfY29udGV4dCAgICAgICAgIChEQnVzQXV0aCAgICAgICAgICAgICAgICphdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICAgICAgKmNvbnRleHQpOworY29uc3QgY2hhciogICBfZGJ1c19hdXRoX2dldF9ndWlkX2Zyb21fc2VydmVyKERCdXNBdXRoICAgICAgICAgICAgICAgKmF1dGgpOworCit2b2lkICAgICAgICAgIF9kYnVzX2F1dGhfc2V0X3VuaXhfZmRfcG9zc2libGUoREJ1c0F1dGggICAgICAgICAgICAgICAqYXV0aCwgZGJ1c19ib29sX3QgYik7CitkYnVzX2Jvb2xfdCAgIF9kYnVzX2F1dGhfZ2V0X3VuaXhfZmRfbmVnb3RpYXRlZChEQnVzQXV0aCAgICAgICAgICAgICAqYXV0aCk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCAgIF9kYnVzX2F1dGhfaXNfc3VwcG9ydGVkX21lY2hhbmlzbShEQnVzU3RyaW5nICAgICAgICAgICAqbmFtZSk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCAgIF9kYnVzX2F1dGhfZHVtcF9zdXBwb3J0ZWRfbWVjaGFuaXNtcyhEQnVzU3RyaW5nICAgICAgICAqYnVmZmVyKTsKKworREJVU19FTkRfREVDTFMKKworI2VuZGlmIC8qIERCVVNfQVVUSF9IICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtYnVzLmMgYi9kYnVzL2RidXMtYnVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFkZWNhNwotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1idXMuYwpAQCAtMCwwICsxLDE2MDIgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1idXMuYyAgQ29udmVuaWVuY2UgZnVuY3Rpb25zIGZvciBjb21tdW5pY2F0aW5nIHdpdGggdGhlIGJ1cy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgIENvZGVGYWN0b3J5IEFCCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgIFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgImRidXMtYnVzLmgiCisjaW5jbHVkZSAiZGJ1cy1wcm90b2NvbC5oIgorI2luY2x1ZGUgImRidXMtaW50ZXJuYWxzLmgiCisjaW5jbHVkZSAiZGJ1cy1tZXNzYWdlLmgiCisjaW5jbHVkZSAiZGJ1cy1tYXJzaGFsLXZhbGlkYXRlLmgiCisjaW5jbHVkZSAiZGJ1cy1taXNjLmgiCisjaW5jbHVkZSAiZGJ1cy10aHJlYWRzLWludGVybmFsLmgiCisjaW5jbHVkZSAiZGJ1cy1jb25uZWN0aW9uLWludGVybmFsLmgiCisjaW5jbHVkZSAiZGJ1cy1zdHJpbmcuaCIKKworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c0J1cyBNZXNzYWdlIGJ1cyBBUElzCisgKiBAaW5ncm91cCBEQnVzCisgKiBAYnJpZWYgRnVuY3Rpb25zIGZvciBjb21tdW5pY2F0aW5nIHdpdGggdGhlIG1lc3NhZ2UgYnVzCisgKgorICogZGJ1c19idXNfZ2V0KCkgYWxsb3dzIGFsbCBtb2R1bGVzIGFuZCBsaWJyYXJpZXMgaW4gYSBnaXZlbgorICogcHJvY2VzcyB0byBzaGFyZSB0aGUgc2FtZSBjb25uZWN0aW9uIHRvIHRoZSBidXMgZGFlbW9uIGJ5IHN0b3JpbmcKKyAqIHRoZSBjb25uZWN0aW9uIGdsb2JhbGx5LgorICoKKyAqIEFsbCBvdGhlciBmdW5jdGlvbnMgaW4gdGhpcyBtb2R1bGUgYXJlIGp1c3QgY29udmVuaWVuY2UgZnVuY3Rpb25zOworICogbW9zdCBvZiB0aGVtIGludm9rZSBtZXRob2RzIG9uIHRoZSBidXMgZGFlbW9uLCBieSBzZW5kaW5nIG1ldGhvZAorICogY2FsbCBtZXNzYWdlcyB0byAjREJVU19TRVJWSUNFX0RCVVMuIFRoZXNlIGNvbnZlbmllbmNlIGZ1bmN0aW9ucworICogb2Z0ZW4gbWFrZSBibG9ja2luZyBtZXRob2QgY2FsbHMuIElmIHlvdSBkb24ndCB3YW50IHRvIGJsb2NrLAorICogeW91IGNhbiBzZW5kIHRoZSBtZXRob2QgY2FsbCBtZXNzYWdlcyBtYW51YWxseSBpbiB0aGUgc2FtZSB3YXkKKyAqIHlvdSB3b3VsZCBhbnkgb3RoZXIgbWV0aG9kIGNhbGwgbWVzc2FnZS4KKyAqCisgKiBUaGlzIG1vZHVsZSBpcyB0aGUgb25seSBvbmUgaW4gbGliZGJ1cyB0aGF0J3Mgc3BlY2lmaWMgdG8KKyAqIGNvbW11bmljYXRpbmcgd2l0aCB0aGUgbWVzc2FnZSBidXMgZGFlbW9uLiBUaGUgcmVzdCBvZiB0aGUgQVBJIGNhbgorICogYWxzbyBiZSB1c2VkIGZvciBjb25uZWN0aW5nIHRvIGFub3RoZXIgYXBwbGljYXRpb24gZGlyZWN0bHkuCisgKiAKKyAqIEB0b2RvIHJpZ2h0IG5vdyB0aGUgZGVmYXVsdCBhZGRyZXNzIG9mIHRoZSBzeXN0ZW0gYnVzIGlzIGhhcmRjb2RlZCwKKyAqIHNvIGlmIHlvdSBjaGFuZ2UgaXQgaW4gdGhlIGdsb2JhbCBjb25maWcgZmlsZSBzdWRkZW5seSB5b3UgaGF2ZSB0bworICogc2V0IERCVVNfU1lTVEVNX0JVU19BRERSRVNTIGVudiB2YXJpYWJsZS4gIE1pZ2h0IGJlIG5pY2UgaWYgdGhlCisgKiBjbGllbnQgbGliIHNvbWVob3cgcmVhZCB0aGUgY29uZmlnIGZpbGUsIG9yIGlmIHRoZSBidXMgb24gc3RhcnR1cAorICogc29tZWhvdyB3cm90ZSBvdXQgaXRzIGFkZHJlc3MgdG8gYSB3ZWxsLWtub3duIHNwb3QsIGJ1dCBtaWdodCBhbHNvCisgKiBub3QgYmUgd29ydGggaXQuCisgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c0J1c0ludGVybmFscyBNZXNzYWdlIGJ1cyBBUElzIGludGVybmFscworICogQGluZ3JvdXAgREJ1c0ludGVybmFscworICogQGJyaWVmIEludGVybmFscyBvZiBmdW5jdGlvbnMgZm9yIGNvbW11bmljYXRpbmcgd2l0aCB0aGUgbWVzc2FnZSBidXMKKyAqCisgKiBAeworICovCisKKy8qKgorICogQmxvY2sgb2YgbWVzc2FnZS1idXMtcmVsYXRlZCBkYXRhIHdlIGF0dGFjaCB0byBlYWNoCisgKiAjREJ1c0Nvbm5lY3Rpb24gdXNlZCB3aXRoIHRoZXNlIGNvbnZlbmllbmNlIGZ1bmN0aW9ucy4KKyAqCisgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uOyAvKio8IENvbm5lY3Rpb24gd2UncmUgYXNzb2NpYXRlZCB3aXRoICovCisgIGNoYXIgKnVuaXF1ZV9uYW1lOyAvKio8IFVuaXF1ZSBuYW1lIG9mIHRoaXMgY29ubmVjdGlvbiAqLworCisgIHVuc2lnbmVkIGludCBpc193ZWxsX2tub3duIDogMTsgLyoqPCBJcyBvbmUgb2YgdGhlIHdlbGwta25vd24gY29ubmVjdGlvbnMgaW4gb3VyIGdsb2JhbCBhcnJheSAqLworfSBCdXNEYXRhOworCisvKiogVGhlIHNsb3Qgd2UgaGF2ZSByZXNlcnZlZCB0byBzdG9yZSBCdXNEYXRhLgorICovCitzdGF0aWMgZGJ1c19pbnQzMl90IGJ1c19kYXRhX3Nsb3QgPSAtMTsKKworLyoqIE51bWJlciBvZiBidXMgdHlwZXMgKi8KKyNkZWZpbmUgTl9CVVNfVFlQRVMgMworCitzdGF0aWMgREJ1c0Nvbm5lY3Rpb24gKmJ1c19jb25uZWN0aW9uc1tOX0JVU19UWVBFU107CitzdGF0aWMgY2hhciAqYnVzX2Nvbm5lY3Rpb25fYWRkcmVzc2VzW05fQlVTX1RZUEVTXSA9IHsgTlVMTCwgTlVMTCwgTlVMTCB9OworCitzdGF0aWMgREJ1c0J1c1R5cGUgYWN0aXZhdGlvbl9idXNfdHlwZSA9IERCVVNfQlVTX1NUQVJURVI7CisKK3N0YXRpYyBkYnVzX2Jvb2xfdCBpbml0aWFsaXplZCA9IEZBTFNFOworCitzdGF0aWMgdm9pZAorYWRkcmVzc2VzX3NodXRkb3duX2Z1bmMgKHZvaWQgKmRhdGEpCit7CisgIGludCBpOworCisgIGkgPSAwOworICB3aGlsZSAoaSA8IE5fQlVTX1RZUEVTKQorICAgIHsKKyAgICAgIGlmIChidXNfY29ubmVjdGlvbnNbaV0gIT0gTlVMTCkKKyAgICAgICAgX2RidXNfd2Fybl9jaGVja19mYWlsZWQgKCJkYnVzX3NodXRkb3duKCkgY2FsbGVkIGJ1dCBjb25uZWN0aW9ucyB3ZXJlIHN0aWxsIGxpdmUuIFRoaXMgcHJvYmFibHkgbWVhbnMgdGhlIGFwcGxpY2F0aW9uIGRpZCBub3QgZHJvcCBhbGwgaXRzIHJlZmVyZW5jZXMgdG8gYnVzIGNvbm5lY3Rpb25zLiIpOworICAgICAgCisgICAgICBkYnVzX2ZyZWUgKGJ1c19jb25uZWN0aW9uX2FkZHJlc3Nlc1tpXSk7CisgICAgICBidXNfY29ubmVjdGlvbl9hZGRyZXNzZXNbaV0gPSBOVUxMOworICAgICAgKytpOworICAgIH0KKworICBhY3RpdmF0aW9uX2J1c190eXBlID0gREJVU19CVVNfU1RBUlRFUjsKKworICBpbml0aWFsaXplZCA9IEZBTFNFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2dldF9mcm9tX2VudiAoY2hhciAgICAgICAgICAgKipjb25uZWN0aW9uX3AsCisgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAqZW52X3ZhcikKK3sKKyAgY29uc3QgY2hhciAqczsKKyAgCisgIF9kYnVzX2Fzc2VydCAoKmNvbm5lY3Rpb25fcCA9PSBOVUxMKTsKKyAgCisgIHMgPSBfZGJ1c19nZXRlbnYgKGVudl92YXIpOworICBpZiAocyA9PSBOVUxMIHx8ICpzID09ICdcMCcpCisgICAgcmV0dXJuIFRSVUU7IC8qIHN1Y2Nlc3NmdWxseSBkaWRuJ3QgdXNlIHRoZSBlbnYgdmFyICovCisgIGVsc2UKKyAgICB7CisgICAgICAqY29ubmVjdGlvbl9wID0gX2RidXNfc3RyZHVwIChzKTsKKyAgICAgIHJldHVybiAqY29ubmVjdGlvbl9wICE9IE5VTEw7CisgICAgfQorfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2luaXRfc2Vzc2lvbl9hZGRyZXNzICh2b2lkKQoreworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgCisgIHJldHZhbCA9IEZBTFNFOworCisgIC8qIEZpcnN0LCBsb29rIGluIHRoZSBlbnZpcm9ubWVudC4gIFRoaXMgaXMgdGhlIG5vcm1hbCBjYXNlIG9uIAorICAgKiBmcmVlZGVza3RvcC5vcmcvVW5peCBzeXN0ZW1zLiAqLworICBnZXRfZnJvbV9lbnYgKCZidXNfY29ubmVjdGlvbl9hZGRyZXNzZXNbREJVU19CVVNfU0VTU0lPTl0sCisgICAgICAgICAgICAgICAgICAgICAiREJVU19TRVNTSU9OX0JVU19BRERSRVNTIik7CisgIGlmIChidXNfY29ubmVjdGlvbl9hZGRyZXNzZXNbREJVU19CVVNfU0VTU0lPTl0gPT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX2Jvb2xfdCBzdXBwb3J0ZWQ7CisgICAgICBEQnVzU3RyaW5nIGFkZHI7CisgICAgICBEQnVzRXJyb3IgZXJyb3IgPSBEQlVTX0VSUk9SX0lOSVQ7CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZhZGRyKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICBzdXBwb3J0ZWQgPSBGQUxTRTsKKyAgICAgIC8qIFNvIGl0J3Mgbm90IGluIHRoZSBlbnZpcm9ubWVudCAtIGxldCdzIHRyeSBhIHBsYXRmb3JtLXNwZWNpZmljIG1ldGhvZC4KKyAgICAgICAqIE9uIE1hY09TLCB0aGlzIGludm9sdmVzIGFza2luZyBsYXVuY2hkLiAgT24gV2luZG93cyAobm90IHNwZWNpZmllZCB5ZXQpCisgICAgICAgKiB3ZSBtaWdodCBkbyBhIENPTSBsb29rdXAuCisgICAgICAgKiBJZ25vcmUgZXJyb3JzIC0gaWYgd2UgZmFpbGVkLCBmYWxsIGJhY2sgdG8gYXV0b2xhdW5jaC4gKi8KKyAgICAgIHJldHZhbCA9IF9kYnVzX2xvb2t1cF9zZXNzaW9uX2FkZHJlc3MgKCZzdXBwb3J0ZWQsICZhZGRyLCAmZXJyb3IpOworICAgICAgaWYgKHN1cHBvcnRlZCAmJiByZXR2YWwpCisgICAgICAgIHsKKyAgICAgICAgICByZXR2YWwgPV9kYnVzX3N0cmluZ19zdGVhbF9kYXRhICgmYWRkciwgJmJ1c19jb25uZWN0aW9uX2FkZHJlc3Nlc1tEQlVTX0JVU19TRVNTSU9OXSk7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHN1cHBvcnRlZCAmJiAhcmV0dmFsKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGRidXNfZXJyb3JfaXNfc2V0KCZlcnJvcikpCisgICAgICAgICAgICBfZGJ1c193YXJuICgiRHluYW1pYyBzZXNzaW9uIGxvb2t1cCBzdXBwb3J0ZWQgYnV0IGZhaWxlZDogJXMiLCBlcnJvci5tZXNzYWdlKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBfZGJ1c193YXJuICgiRHluYW1pYyBzZXNzaW9uIGxvb2t1cCBzdXBwb3J0ZWQgYnV0IGZhaWxlZCBzaWxlbnRseSIpOworICAgICAgICB9CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmFkZHIpOworICAgIH0KKyAgZWxzZQorICAgIHJldHZhbCA9IFRSVUU7CisKKyAgaWYgKCFyZXR2YWwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIC8qIFdlIGhhdmUgYSBoYXJkLWNvZGVkIChidXQgY29tcGlsZS10aW1lLWNvbmZpZ3VyYWJsZSkgZmFsbGJhY2sgYWRkcmVzcyBmb3IKKyAgICogdGhlIHNlc3Npb24gYnVzLiAqLworICBpZiAoYnVzX2Nvbm5lY3Rpb25fYWRkcmVzc2VzW0RCVVNfQlVTX1NFU1NJT05dID09IE5VTEwpCisgICAgYnVzX2Nvbm5lY3Rpb25fYWRkcmVzc2VzW0RCVVNfQlVTX1NFU1NJT05dID0KKyAgICAgIF9kYnVzX3N0cmR1cCAoREJVU19TRVNTSU9OX0JVU19DT05ORUNUX0FERFJFU1MpOworCisgIGlmIChidXNfY29ubmVjdGlvbl9hZGRyZXNzZXNbREJVU19CVVNfU0VTU0lPTl0gPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAoraW5pdF9jb25uZWN0aW9uc191bmxvY2tlZCAodm9pZCkKK3sKKyAgaWYgKCFpbml0aWFsaXplZCkKKyAgICB7CisgICAgICBjb25zdCBjaGFyICpzOworICAgICAgaW50IGk7CisKKyAgICAgIGkgPSAwOworICAgICAgd2hpbGUgKGkgPCBOX0JVU19UWVBFUykKKyAgICAgICAgeworICAgICAgICAgIGJ1c19jb25uZWN0aW9uc1tpXSA9IE5VTEw7CisgICAgICAgICAgKytpOworICAgICAgICB9CisKKyAgICAgIC8qIERvbid0IGluaXQgdGhlc2UgdHdpY2UsIHdlIG1heSBydW4gdGhpcyBjb2RlIHR3aWNlIGlmCisgICAgICAgKiBpbml0X2Nvbm5lY3Rpb25zX3VubG9ja2VkKCkgZmFpbHMgbWlkd2F5IHRocm91Z2guCisgICAgICAgKiBJbiBwcmFjdGljZSwgZWFjaCBibG9jayBiZWxvdyBzaG91bGQgY29udGFpbiBvbmx5IG9uZQorICAgICAgICogInJldHVybiBGQUxTRSIgb3IgcnVubmluZyB0aHJvdWdoIHR3aWNlIG1heSBub3QKKyAgICAgICAqIHdvcmsgcmlnaHQuCisgICAgICAgKi8KKyAgICAgIAorICAgICAgIGlmIChidXNfY29ubmVjdGlvbl9hZGRyZXNzZXNbREJVU19CVVNfU1lTVEVNXSA9PSBOVUxMKQorICAgICAgICAgeworICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiRmlsbGluZyBpbiBzeXN0ZW0gYnVzIGFkZHJlc3MuLi5cbiIpOworICAgICAgICAgICAKKyAgICAgICAgICAgaWYgKCFnZXRfZnJvbV9lbnYgKCZidXNfY29ubmVjdGlvbl9hZGRyZXNzZXNbREJVU19CVVNfU1lTVEVNXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEQlVTX1NZU1RFTV9CVVNfQUREUkVTUyIpKQorICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgCisgICAgICAgaWYgKGJ1c19jb25uZWN0aW9uX2FkZHJlc3Nlc1tEQlVTX0JVU19TWVNURU1dID09IE5VTEwpCisgICAgICAgICB7CisgICAgICAgICAgIC8qIFVzZSBkZWZhdWx0IHN5c3RlbSBidXMgYWRkcmVzcyBpZiBub25lIHNldCBpbiBlbnZpcm9ubWVudCAqLworICAgICAgICAgICBidXNfY29ubmVjdGlvbl9hZGRyZXNzZXNbREJVU19CVVNfU1lTVEVNXSA9CisgICAgICAgICAgICAgX2RidXNfc3RyZHVwIChEQlVTX1NZU1RFTV9CVVNfREVGQVVMVF9BRERSRVNTKTsKKworICAgICAgICAgICBpZiAoYnVzX2Nvbm5lY3Rpb25fYWRkcmVzc2VzW0RCVVNfQlVTX1NZU1RFTV0gPT0gTlVMTCkKKyAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgIAorICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiICB1c2VkIGRlZmF1bHQgc3lzdGVtIGJ1cyBcIiVzXCJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1c19jb25uZWN0aW9uX2FkZHJlc3Nlc1tEQlVTX0JVU19TWVNURU1dKTsKKyAgICAgICAgIH0KKyAgICAgICBlbHNlCisgICAgICAgICBfZGJ1c192ZXJib3NlICgiICB1c2VkIGVudiB2YXIgc3lzdGVtIGJ1cyBcIiVzXCJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBidXNfY29ubmVjdGlvbl9hZGRyZXNzZXNbREJVU19CVVNfU1lTVEVNXSk7CisgICAgICAgICAgCisgICAgICBpZiAoYnVzX2Nvbm5lY3Rpb25fYWRkcmVzc2VzW0RCVVNfQlVTX1NFU1NJT05dID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiRmlsbGluZyBpbiBzZXNzaW9uIGJ1cyBhZGRyZXNzLi4uXG4iKTsKKyAgICAgICAgICAKKyAgICAgICAgICBpZiAoIWluaXRfc2Vzc2lvbl9hZGRyZXNzICgpKQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiAgXCIlc1wiXG4iLCBidXNfY29ubmVjdGlvbl9hZGRyZXNzZXNbREJVU19CVVNfU0VTU0lPTl0gPworICAgICAgICAgICAgICAgICAgICAgICAgIGJ1c19jb25uZWN0aW9uX2FkZHJlc3Nlc1tEQlVTX0JVU19TRVNTSU9OXSA6ICJub25lIHNldCIpOworICAgICAgICB9CisKKyAgICAgIGlmIChidXNfY29ubmVjdGlvbl9hZGRyZXNzZXNbREJVU19CVVNfU1RBUlRFUl0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJGaWxsaW5nIGluIGFjdGl2YXRpb24gYnVzIGFkZHJlc3MuLi5cbiIpOworICAgICAgICAgIAorICAgICAgICAgIGlmICghZ2V0X2Zyb21fZW52ICgmYnVzX2Nvbm5lY3Rpb25fYWRkcmVzc2VzW0RCVVNfQlVTX1NUQVJURVJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiREJVU19TVEFSVEVSX0FERFJFU1MiKSkKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiICBcIiVzXCJcbiIsIGJ1c19jb25uZWN0aW9uX2FkZHJlc3Nlc1tEQlVTX0JVU19TVEFSVEVSXSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgYnVzX2Nvbm5lY3Rpb25fYWRkcmVzc2VzW0RCVVNfQlVTX1NUQVJURVJdIDogIm5vbmUgc2V0Iik7CisgICAgICAgIH0KKworCisgICAgICBpZiAoYnVzX2Nvbm5lY3Rpb25fYWRkcmVzc2VzW0RCVVNfQlVTX1NUQVJURVJdICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBzID0gX2RidXNfZ2V0ZW52ICgiREJVU19TVEFSVEVSX0JVU19UWVBFIik7CisgICAgICAgICAgICAgIAorICAgICAgICAgIGlmIChzICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJCdXMgYWN0aXZhdGlvbiB0eXBlIHdhcyBzZXQgdG8gXCIlc1wiXG4iLCBzKTsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBpZiAoc3RyY21wIChzLCAic3lzdGVtIikgPT0gMCkKKyAgICAgICAgICAgICAgICBhY3RpdmF0aW9uX2J1c190eXBlID0gREJVU19CVVNfU1lTVEVNOworICAgICAgICAgICAgICBlbHNlIGlmIChzdHJjbXAgKHMsICJzZXNzaW9uIikgPT0gMCkKKyAgICAgICAgICAgICAgICBhY3RpdmF0aW9uX2J1c190eXBlID0gREJVU19CVVNfU0VTU0lPTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgLyogRGVmYXVsdCB0byB0aGUgc2Vzc2lvbiBidXMgaW5zdGVhZCBpZiBhdmFpbGFibGUgKi8KKyAgICAgICAgICBpZiAoYnVzX2Nvbm5lY3Rpb25fYWRkcmVzc2VzW0RCVVNfQlVTX1NFU1NJT05dICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGJ1c19jb25uZWN0aW9uX2FkZHJlc3Nlc1tEQlVTX0JVU19TVEFSVEVSXSA9CisgICAgICAgICAgICAgICAgX2RidXNfc3RyZHVwIChidXNfY29ubmVjdGlvbl9hZGRyZXNzZXNbREJVU19CVVNfU0VTU0lPTl0pOworICAgICAgICAgICAgICBpZiAoYnVzX2Nvbm5lY3Rpb25fYWRkcmVzc2VzW0RCVVNfQlVTX1NUQVJURVJdID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAKKyAgICAgIC8qIElmIHdlIHJldHVybiBGQUxTRSB3ZSBoYXZlIHRvIGJlIHN1cmUgdGhhdCByZXN0YXJ0aW5nCisgICAgICAgKiB0aGUgYWJvdmUgY29kZSB3aWxsIHdvcmsgcmlnaHQKKyAgICAgICAqLworICAgICAgCisgICAgICBpZiAoIV9kYnVzX3JlZ2lzdGVyX3NodXRkb3duX2Z1bmMgKGFkZHJlc3Nlc19zaHV0ZG93bl9mdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgCisgICAgICBpbml0aWFsaXplZCA9IFRSVUU7CisgICAgfQorCisgIHJldHVybiBpbml0aWFsaXplZDsKK30KKworc3RhdGljIHZvaWQKK2J1c19kYXRhX2ZyZWUgKHZvaWQgKmRhdGEpCit7CisgIEJ1c0RhdGEgKmJkID0gZGF0YTsKKyAgCisgIGlmIChiZC0+aXNfd2VsbF9rbm93bikKKyAgICB7CisgICAgICBpbnQgaTsKKworICAgICAgaWYgKCFfREJVU19MT0NLIChidXMpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJnbG9iYWwgbG9ja3Mgc2hvdWxkIGhhdmUgYmVlbiBpbml0aWFsaXplZCAiCisgICAgICAgICAgICAid2hlbiB3ZSBhdHRhY2hlZCBidXMgZGF0YSIpOworCisgICAgICAvKiBXZSBtYXkgYmUgc3RvcmVkIGluIG1vcmUgdGhhbiBvbmUgc2xvdCAqLworICAgICAgLyogVGhpcyBzaG91bGQgbm93IGJlIGltcG9zc2libGUgLSB0aGVzZSBzbG90cyBhcmUgc3VwcG9zZWQgdG8KKyAgICAgICAqIGJlIGNsZWFyZWQgb24gZGlzY29ubmVjdCwgc28gc2hvdWxkIG5vdCBuZWVkIHRvIGJlIGNsZWFyZWQgb24KKyAgICAgICAqIGZpbmFsaXplCisgICAgICAgKi8KKyAgICAgIGkgPSAwOworICAgICAgd2hpbGUgKGkgPCBOX0JVU19UWVBFUykKKyAgICAgICAgeworICAgICAgICAgIGlmIChidXNfY29ubmVjdGlvbnNbaV0gPT0gYmQtPmNvbm5lY3Rpb24pCisgICAgICAgICAgICBidXNfY29ubmVjdGlvbnNbaV0gPSBOVUxMOworICAgICAgICAgIAorICAgICAgICAgICsraTsKKyAgICAgICAgfQorICAgICAgX0RCVVNfVU5MT0NLIChidXMpOworICAgIH0KKyAgCisgIGRidXNfZnJlZSAoYmQtPnVuaXF1ZV9uYW1lKTsKKyAgZGJ1c19mcmVlIChiZCk7CisKKyAgZGJ1c19jb25uZWN0aW9uX2ZyZWVfZGF0YV9zbG90ICgmYnVzX2RhdGFfc2xvdCk7Cit9CisKK3N0YXRpYyBCdXNEYXRhKgorZW5zdXJlX2J1c19kYXRhIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgQnVzRGF0YSAqYmQ7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fYWxsb2NhdGVfZGF0YV9zbG90ICgmYnVzX2RhdGFfc2xvdCkpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgYmQgPSBkYnVzX2Nvbm5lY3Rpb25fZ2V0X2RhdGEgKGNvbm5lY3Rpb24sIGJ1c19kYXRhX3Nsb3QpOworICBpZiAoYmQgPT0gTlVMTCkKKyAgICB7ICAgICAgCisgICAgICBiZCA9IGRidXNfbmV3MCAoQnVzRGF0YSwgMSk7CisgICAgICBpZiAoYmQgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfY29ubmVjdGlvbl9mcmVlX2RhdGFfc2xvdCAoJmJ1c19kYXRhX3Nsb3QpOworICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgIGJkLT5jb25uZWN0aW9uID0gY29ubmVjdGlvbjsKKyAgICAgIAorICAgICAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2V0X2RhdGEgKGNvbm5lY3Rpb24sIGJ1c19kYXRhX3Nsb3QsIGJkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1c19kYXRhX2ZyZWUpKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19mcmVlIChiZCk7CisgICAgICAgICAgZGJ1c19jb25uZWN0aW9uX2ZyZWVfZGF0YV9zbG90ICgmYnVzX2RhdGFfc2xvdCk7CisgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgLyogRGF0YSBzbG90IHJlZmNvdW50IG5vdyBoZWxkIGJ5IHRoZSBCdXNEYXRhICovCisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZGJ1c19jb25uZWN0aW9uX2ZyZWVfZGF0YV9zbG90ICgmYnVzX2RhdGFfc2xvdCk7CisgICAgfQorCisgIHJldHVybiBiZDsKK30KKworLyoqCisgKiBJbnRlcm5hbCBmdW5jdGlvbiB0aGF0IGNoZWNrcyB0byBzZWUgaWYgdGhpcworICogaXMgYSBzaGFyZWQgY29ubmVjdGlvbiBvd25lZCBieSB0aGUgYnVzIGFuZCBpZiBpdCBpcyB1bnJlZiBpdC4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiBhIGNvbm5lY3Rpb24gdGhhdCBoYXMgYmVlbiBkaXNjb25uZWN0ZWQuCisgKi8KK3ZvaWQKK19kYnVzX2J1c19ub3RpZnlfc2hhcmVkX2Nvbm5lY3Rpb25fZGlzY29ubmVjdGVkX3VubG9ja2VkIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgaW50IGk7CisKKyAgaWYgKCFfREJVU19MT0NLIChidXMpKQorICAgIHsKKyAgICAgIC8qIElmIGl0IHdhcyBpbiBidXNfY29ubmVjdGlvbnMsIHdlIHdvdWxkIGhhdmUgaW5pdGlhbGl6ZWQgZ2xvYmFsIGxvY2tzCisgICAgICAgKiB3aGVuIHdlIGFkZGVkIGl0LiBTbywgaXQgY2FuJ3QgYmUuICovCisgICAgICByZXR1cm47CisgICAgfQorCisgIC8qIFdlIGFyZSBleHBlY3RpbmcgdG8gaGF2ZSB0aGUgY29ubmVjdGlvbiBzYXZlZCBpbiBvbmx5IG9uZSBvZiB0aGVzZQorICAgKiBzbG90cywgYnV0IHNvbWVvbmUgY291bGQgaW4gYSBwYXRob2xvZ2ljYWwgY2FzZSBzZXQgc3lzdGVtIGFuZCBzZXNzaW9uCisgICAqIGJ1cyB0byB0aGUgc2FtZSBidXMgb3Igc29tZXRoaW5nLiBPciBzZXQgb25lIG9mIHRoZW0gdG8gdGhlIHN0YXJ0ZXIKKyAgICogYnVzIHdpdGhvdXQgc2V0dGluZyB0aGUgc3RhcnRlciBidXMgdHlwZSBpbiB0aGUgZW52IHZhcmlhYmxlLgorICAgKiBTbyB3ZSBkb24ndCBicmVhayB0aGUgbG9vcCBhcyBzb29uIGFzIHdlIGZpbmQgYSBtYXRjaC4KKyAgICovCisgIGZvciAoaSA9IDA7IGkgPCBOX0JVU19UWVBFUzsgKytpKQorICAgIHsKKyAgICAgIGlmIChidXNfY29ubmVjdGlvbnNbaV0gPT0gY29ubmVjdGlvbikKKyAgICAgICAgeworICAgICAgICAgIGJ1c19jb25uZWN0aW9uc1tpXSA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgX0RCVVNfVU5MT0NLIChidXMpOworfQorCitzdGF0aWMgREJ1c0Nvbm5lY3Rpb24gKgoraW50ZXJuYWxfYnVzX2dldCAoREJ1c0J1c1R5cGUgIHR5cGUsCisgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgcHJpdmF0ZSwKKyAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICplcnJvcikKK3sKKyAgY29uc3QgY2hhciAqYWRkcmVzczsKKyAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisgIEJ1c0RhdGEgKmJkOworICBEQnVzQnVzVHlwZSBhZGRyZXNzX3R5cGU7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsICh0eXBlID49IDAgJiYgdHlwZSA8IE5fQlVTX1RZUEVTLCBOVUxMKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9lcnJvcl9pc19zZXQgKGVycm9yLCBOVUxMKTsKKworICBjb25uZWN0aW9uID0gTlVMTDsKKworICBpZiAoIV9EQlVTX0xPQ0sgKGJ1cykpCisgICAgeworICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgLyogZG8gbm90ICJnb3RvIG91dCIsIHRoYXQgd291bGQgdHJ5IHRvIHVubG9jayAqLworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIGlmICghaW5pdF9jb25uZWN0aW9uc191bmxvY2tlZCAoKSkKKyAgICB7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgLyogV2Ugd2FudCB0byB1c2UgdGhlIGFjdGl2YXRpb24gYWRkcmVzcyBldmVuIGlmIHRoZQorICAgKiBhY3RpdmF0aW5nIGJ1cyBpcyB0aGUgc2Vzc2lvbiBvciBzeXN0ZW0gYnVzLAorICAgKiBwZXIgdGhlIHNwZWMuCisgICAqLworICBhZGRyZXNzX3R5cGUgPSB0eXBlOworICAKKyAgLyogVXNlIHRoZSByZWFsIHR5cGUgb2YgdGhlIGFjdGl2YXRpb24gYnVzIGZvciBnZXR0aW5nIGl0cworICAgKiBjb25uZWN0aW9uLCBidXQgb25seSBpZiB0aGUgcmVhbCB0eXBlJ3MgYWRkcmVzcyBpcyBhdmFpbGFibGUuIChJZgorICAgKiB0aGUgYWN0aXZhdGluZyBidXMgaXNuJ3QgYSB3ZWxsLWtub3duIGJ1cyB0aGVuCisgICAqIGFjdGl2YXRpb25fYnVzX3R5cGUgPT0gREJVU19CVVNfU1RBUlRFUikKKyAgICovCisgIGlmICh0eXBlID09IERCVVNfQlVTX1NUQVJURVIgJiYKKyAgICAgIGJ1c19jb25uZWN0aW9uX2FkZHJlc3Nlc1thY3RpdmF0aW9uX2J1c190eXBlXSAhPSBOVUxMKQorICAgIHR5cGUgPSBhY3RpdmF0aW9uX2J1c190eXBlOworICAKKyAgaWYgKCFwcml2YXRlICYmIGJ1c19jb25uZWN0aW9uc1t0eXBlXSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGNvbm5lY3Rpb24gPSBidXNfY29ubmVjdGlvbnNbdHlwZV07CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fcmVmIChjb25uZWN0aW9uKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBhZGRyZXNzID0gYnVzX2Nvbm5lY3Rpb25fYWRkcmVzc2VzW2FkZHJlc3NfdHlwZV07CisgIGlmIChhZGRyZXNzID09IE5VTEwpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIGRldGVybWluZSB0aGUgYWRkcmVzcyBvZiB0aGUgbWVzc2FnZSBidXMgKHRyeSAnbWFuIGRidXMtbGF1bmNoJyBhbmQgJ21hbiBkYnVzLWRhZW1vbicgZm9yIGhlbHApIik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgaWYgKHByaXZhdGUpCisgICAgY29ubmVjdGlvbiA9IGRidXNfY29ubmVjdGlvbl9vcGVuX3ByaXZhdGUgKGFkZHJlc3MsIGVycm9yKTsKKyAgZWxzZQorICAgIGNvbm5lY3Rpb24gPSBkYnVzX2Nvbm5lY3Rpb25fb3BlbiAoYWRkcmVzcywgZXJyb3IpOworICAKKyAgaWYgKCFjb25uZWN0aW9uKQorICAgIHsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAoIWRidXNfYnVzX3JlZ2lzdGVyIChjb25uZWN0aW9uLCBlcnJvcikpCisgICAgeworICAgICAgX2RidXNfY29ubmVjdGlvbl9jbG9zZV9wb3NzaWJseV9zaGFyZWQgKGNvbm5lY3Rpb24pOworICAgICAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChjb25uZWN0aW9uKTsKKyAgICAgIGNvbm5lY3Rpb24gPSBOVUxMOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIGlmICghcHJpdmF0ZSkKKyAgICB7CisgICAgICAvKiBzdG9yZSBhIHdlYWsgcmVmIHRvIHRoZSBjb25uZWN0aW9uIChkYnVzLWNvbm5lY3Rpb24uYyBpcworICAgICAgICogc3VwcG9zZWQgdG8gaGF2ZSBhIHN0cm9uZyByZWYgdGhhdCBpdCBkcm9wcyBvbiBkaXNjb25uZWN0LAorICAgICAgICogc2luY2UgdGhpcyBpcyBhIHNoYXJlZCBjb25uZWN0aW9uKQorICAgICAgICovCisgICAgICBidXNfY29ubmVjdGlvbnNbdHlwZV0gPSBjb25uZWN0aW9uOworICAgIH0KKworICAvKiBCeSBkZWZhdWx0IHdlJ3JlIGJvdW5kIHRvIHRoZSBsaWZlY3ljbGUgb2YKKyAgICogdGhlIG1lc3NhZ2UgYnVzLgorICAgKi8KKyAgZGJ1c19jb25uZWN0aW9uX3NldF9leGl0X29uX2Rpc2Nvbm5lY3QgKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFKTsKKworICBpZiAoIV9EQlVTX0xPQ0sgKGJ1c19kYXRhcykpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZ2xvYmFsIGxvY2tzIHdlcmUgaW5pdGlhbGl6ZWQgYWxyZWFkeSIpOworCisgIGJkID0gZW5zdXJlX2J1c19kYXRhIChjb25uZWN0aW9uKTsKKyAgX2RidXNfYXNzZXJ0IChiZCAhPSBOVUxMKTsgLyogaXQgc2hvdWxkIGhhdmUgYmVlbiBjcmVhdGVkIG9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyLCBzbyBPT00gbm90IHBvc3NpYmxlICovCisgIGJkLT5pc193ZWxsX2tub3duID0gVFJVRTsKKyAgX0RCVVNfVU5MT0NLIChidXNfZGF0YXMpOworCitvdXQ6CisgIC8qIFJldHVybiBhIHJlZmVyZW5jZSB0byB0aGUgY2FsbGVyLCBvciBOVUxMIHdpdGggZXJyb3Igc2V0LiAqLworICBpZiAoY29ubmVjdGlvbiA9PSBOVUxMKQorICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKworICBfREJVU19VTkxPQ0sgKGJ1cyk7CisgIHJldHVybiBjb25uZWN0aW9uOworfQorCisKKy8qKiBAfSAqLyAvKiBlbmQgb2YgaW1wbGVtZW50YXRpb24gZGV0YWlscyBkb2NzICovCisKKy8qKgorICogQGFkZHRvZ3JvdXAgREJ1c0J1cworICogQHsKKyAqLworCisvKioKKyAqIENvbm5lY3RzIHRvIGEgYnVzIGRhZW1vbiBhbmQgcmVnaXN0ZXJzIHRoZSBjbGllbnQgd2l0aCBpdC4gIElmIGEKKyAqIGNvbm5lY3Rpb24gdG8gdGhlIGJ1cyBhbHJlYWR5IGV4aXN0cywgdGhlbiB0aGF0IGNvbm5lY3Rpb24gaXMKKyAqIHJldHVybmVkLiAgVGhlIGNhbGxlciBvZiB0aGlzIGZ1bmN0aW9uIG93bnMgYSByZWZlcmVuY2UgdG8gdGhlIGJ1cy4KKyAqCisgKiBUaGUgY2FsbGVyIG1heSBOT1QgY2FsbCBkYnVzX2Nvbm5lY3Rpb25fY2xvc2UoKSBvbiB0aGlzIGNvbm5lY3Rpb247CisgKiBzZWUgZGJ1c19jb25uZWN0aW9uX29wZW4oKSBhbmQgZGJ1c19jb25uZWN0aW9uX2Nsb3NlKCkgZm9yIGRldGFpbHMKKyAqIG9uIHRoYXQuCisgKgorICogSWYgdGhpcyBmdW5jdGlvbiBvYnRhaW5zIGEgbmV3IGNvbm5lY3Rpb24gb2JqZWN0IG5ldmVyIGJlZm9yZQorICogcmV0dXJuZWQgZnJvbSBkYnVzX2J1c19nZXQoKSwgaXQgd2lsbCBjYWxsCisgKiBkYnVzX2Nvbm5lY3Rpb25fc2V0X2V4aXRfb25fZGlzY29ubmVjdCgpLCBzbyB0aGUgYXBwbGljYXRpb24KKyAqIHdpbGwgZXhpdCBpZiB0aGUgY29ubmVjdGlvbiBjbG9zZXMuIFlvdSBjYW4gdW5kbyB0aGlzCisgKiBieSBjYWxsaW5nIGRidXNfY29ubmVjdGlvbl9zZXRfZXhpdF9vbl9kaXNjb25uZWN0KCkgeW91cnNlbGYKKyAqIGFmdGVyIHlvdSBnZXQgdGhlIGNvbm5lY3Rpb24uCisgKgorICogZGJ1c19idXNfZ2V0KCkgY2FsbHMgZGJ1c19idXNfcmVnaXN0ZXIoKSBmb3IgeW91LgorICogCisgKiBJZiByZXR1cm5pbmcgYSBuZXdseS1jcmVhdGVkIGNvbm5lY3Rpb24sIHRoaXMgZnVuY3Rpb24gd2lsbCBibG9jaworICogdW50aWwgYXV0aGVudGljYXRpb24gYW5kIGJ1cyByZWdpc3RyYXRpb24gYXJlIGNvbXBsZXRlLgorICogCisgKiBAcGFyYW0gdHlwZSBidXMgdHlwZQorICogQHBhcmFtIGVycm9yIGFkZHJlc3Mgd2hlcmUgYW4gZXJyb3IgY2FuIGJlIHJldHVybmVkLgorICogQHJldHVybnMgYSAjREJ1c0Nvbm5lY3Rpb24gd2l0aCBuZXcgcmVmIG9yICNOVUxMIG9uIGVycm9yCisgKi8KK0RCdXNDb25uZWN0aW9uICoKK2RidXNfYnVzX2dldCAoREJ1c0J1c1R5cGUgIHR5cGUsCisJICAgICAgREJ1c0Vycm9yICAgKmVycm9yKQoreworICByZXR1cm4gaW50ZXJuYWxfYnVzX2dldCAodHlwZSwgRkFMU0UsIGVycm9yKTsKK30KKworLyoqCisgKiBDb25uZWN0cyB0byBhIGJ1cyBkYWVtb24gYW5kIHJlZ2lzdGVycyB0aGUgY2xpZW50IHdpdGggaXQgYXMgd2l0aAorICogZGJ1c19idXNfcmVnaXN0ZXIoKS4gIFVubGlrZSBkYnVzX2J1c19nZXQoKSwgYWx3YXlzIGNyZWF0ZXMgYSBuZXcKKyAqIGNvbm5lY3Rpb24uIFRoaXMgY29ubmVjdGlvbiB3aWxsIG5vdCBiZSBzYXZlZCBvciByZWN5Y2xlZCBieQorICogbGliZGJ1cy4gQ2FsbGVyIG93bnMgYSByZWZlcmVuY2UgdG8gdGhlIGJ1cyBhbmQgbXVzdCBlaXRoZXIgY2xvc2UKKyAqIGl0IG9yIGtub3cgaXQgdG8gYmUgY2xvc2VkIHByaW9yIHRvIHJlbGVhc2luZyB0aGlzIHJlZmVyZW5jZS4KKyAqCisgKiBTZWUgZGJ1c19jb25uZWN0aW9uX29wZW5fcHJpdmF0ZSgpIGZvciBtb3JlIGRldGFpbHMgb24gd2hlbiB0bworICogY2xvc2UgYW5kIHVucmVmIHRoaXMgY29ubmVjdGlvbi4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNhbGxzCisgKiBkYnVzX2Nvbm5lY3Rpb25fc2V0X2V4aXRfb25fZGlzY29ubmVjdCgpIG9uIHRoZSBuZXcgY29ubmVjdGlvbiwgc28gdGhlIGFwcGxpY2F0aW9uCisgKiB3aWxsIGV4aXQgaWYgdGhlIGNvbm5lY3Rpb24gY2xvc2VzLiBZb3UgY2FuIHVuZG8gdGhpcworICogYnkgY2FsbGluZyBkYnVzX2Nvbm5lY3Rpb25fc2V0X2V4aXRfb25fZGlzY29ubmVjdCgpIHlvdXJzZWxmCisgKiBhZnRlciB5b3UgZ2V0IHRoZSBjb25uZWN0aW9uLgorICoKKyAqIGRidXNfYnVzX2dldF9wcml2YXRlKCkgY2FsbHMgZGJ1c19idXNfcmVnaXN0ZXIoKSBmb3IgeW91LgorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBibG9jayB1bnRpbCBhdXRoZW50aWNhdGlvbiBhbmQgYnVzIHJlZ2lzdHJhdGlvbgorICogYXJlIGNvbXBsZXRlLgorICoKKyAqIEBwYXJhbSB0eXBlIGJ1cyB0eXBlCisgKiBAcGFyYW0gZXJyb3IgYWRkcmVzcyB3aGVyZSBhbiBlcnJvciBjYW4gYmUgcmV0dXJuZWQuCisgKiBAcmV0dXJucyBhIERCdXNDb25uZWN0aW9uIHdpdGggbmV3IHJlZgorICovCitEQnVzQ29ubmVjdGlvbiAqCitkYnVzX2J1c19nZXRfcHJpdmF0ZSAoREJ1c0J1c1R5cGUgIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgKmVycm9yKQoreworICByZXR1cm4gaW50ZXJuYWxfYnVzX2dldCAodHlwZSwgVFJVRSwgZXJyb3IpOworfQorCisvKioKKyAqIFJlZ2lzdGVycyBhIGNvbm5lY3Rpb24gd2l0aCB0aGUgYnVzLiBUaGlzIG11c3QgYmUgdGhlIGZpcnN0CisgKiB0aGluZyBhbiBhcHBsaWNhdGlvbiBkb2VzIHdoZW4gY29ubmVjdGluZyB0byB0aGUgbWVzc2FnZSBidXMuCisgKiBJZiByZWdpc3RyYXRpb24gc3VjY2VlZHMsIHRoZSB1bmlxdWUgbmFtZSB3aWxsIGJlIHNldCwKKyAqIGFuZCBjYW4gYmUgb2J0YWluZWQgdXNpbmcgZGJ1c19idXNfZ2V0X3VuaXF1ZV9uYW1lKCkuCisgKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGJsb2NrIHVudGlsIHJlZ2lzdHJhdGlvbiBpcyBjb21wbGV0ZS4KKyAqCisgKiBJZiB0aGUgY29ubmVjdGlvbiBoYXMgYWxyZWFkeSByZWdpc3RlcmVkIHdpdGggdGhlIGJ1cworICogKGRldGVybWluZWQgYnkgY2hlY2tpbmcgd2hldGhlciBkYnVzX2J1c19nZXRfdW5pcXVlX25hbWUoKQorICogcmV0dXJucyBhIG5vbi0jTlVMTCB2YWx1ZSksIHRoZW4gdGhpcyBmdW5jdGlvbiBkb2VzIG5vdGhpbmcuCisgKgorICogSWYgeW91IHVzZSBkYnVzX2J1c19nZXQoKSBvciBkYnVzX2J1c19nZXRfcHJpdmF0ZSgpIHRoaXMKKyAqIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGZvciB5b3UuCisgKiAKKyAqIEBub3RlIEp1c3QgdXNlIGRidXNfYnVzX2dldCgpIG9yIGRidXNfYnVzX2dldF9wcml2YXRlKCkgaW5zdGVhZCBvZgorICogZGJ1c19idXNfcmVnaXN0ZXIoKSBhbmQgc2F2ZSB5b3Vyc2VsZiBzb21lIHBhaW4uIFVzaW5nCisgKiBkYnVzX2J1c19yZWdpc3RlcigpIG1hbnVhbGx5IGlzIG9ubHkgdXNlZnVsIGlmIHlvdSBoYXZlIHlvdXIKKyAqIG93biBjdXN0b20gbWVzc2FnZSBidXMgbm90IGZvdW5kIGluICNEQnVzQnVzVHlwZS4KKyAqCisgKiBJZiB5b3Ugb3BlbiBhIGJ1cyBjb25uZWN0aW9uIHdpdGggZGJ1c19jb25uZWN0aW9uX29wZW4oKSBvcgorICogZGJ1c19jb25uZWN0aW9uX29wZW5fcHJpdmF0ZSgpIHlvdSB3aWxsIGhhdmUgdG8gZGJ1c19idXNfcmVnaXN0ZXIoKQorICogeW91cnNlbGYsIG9yIG1ha2UgdGhlIGFwcHJvcHJpYXRlIHJlZ2lzdHJhdGlvbiBtZXRob2QgY2FsbHMKKyAqIHlvdXJzZWxmLiBJZiB5b3Ugc2VuZCB0aGUgbWV0aG9kIGNhbGxzIHlvdXJzZWxmLCBjYWxsCisgKiBkYnVzX2J1c19zZXRfdW5pcXVlX25hbWUoKSB3aXRoIHRoZSB1bmlxdWUgYnVzIG5hbWUgeW91IGdldCBmcm9tCisgKiB0aGUgYnVzLgorICoKKyAqIEZvciBzaGFyZWQgY29ubmVjdGlvbnMgKGNyZWF0ZWQgd2l0aCBkYnVzX2Nvbm5lY3Rpb25fb3BlbigpKSBpbiBhCisgKiBtdWx0aXRocmVhZGVkIGFwcGxpY2F0aW9uLCB5b3UgY2FuJ3QgcmVhbGx5IG1ha2UgdGhlIHJlZ2lzdHJhdGlvbgorICogY2FsbHMgeW91cnNlbGYsIGJlY2F1c2UgeW91IGRvbid0IGtub3cgd2hldGhlciBzb21lIG90aGVyIHRocmVhZCBpcworICogYWxzbyByZWdpc3RlcmluZywgYW5kIHRoZSBidXMgd2lsbCBraWNrIHlvdSBvZmYgaWYgeW91IHNlbmQgdHdvCisgKiByZWdpc3RyYXRpb24gbWVzc2FnZXMuCisgKgorICogSWYgeW91IHVzZSBkYnVzX2J1c19yZWdpc3RlcigpIGhvd2V2ZXIsIHRoZXJlIGlzIGEgbG9jayB0aGF0CisgKiBrZWVwcyBib3RoIGFwcHMgZnJvbSByZWdpc3RlcmluZyBhdCB0aGUgc2FtZSB0aW1lLgorICoKKyAqIFRoZSBydWxlIGluIGEgbXVsdGl0aHJlYWRlZCBhcHAsIHRoZW4sIGlzIHRoYXQgZGJ1c19idXNfcmVnaXN0ZXIoKQorICogbXVzdCBiZSB1c2VkIHRvIHJlZ2lzdGVyLCBvciB5b3UgbmVlZCB0byBoYXZlIHlvdXIgb3duIGxvY2tzIHRoYXQKKyAqIGFsbCB0aHJlYWRzIGluIHRoZSBhcHAgd2lsbCByZXNwZWN0LgorICoKKyAqIEluIGEgc2luZ2xlLXRocmVhZGVkIGFwcGxpY2F0aW9uIHlvdSBjYW4gcmVnaXN0ZXIgYnkgaGFuZCBpbnN0ZWFkCisgKiBvZiB1c2luZyBkYnVzX2J1c19yZWdpc3RlcigpLCBhcyBsb25nIGFzIHlvdSBjaGVjaworICogZGJ1c19idXNfZ2V0X3VuaXF1ZV9uYW1lKCkgdG8gc2VlIGlmIGEgdW5pcXVlIG5hbWUgaGFzIGFscmVhZHkgYmVlbgorICogc3RvcmVkIGJ5IGFub3RoZXIgdGhyZWFkIGJlZm9yZSB5b3Ugc2VuZCB0aGUgcmVnaXN0cmF0aW9uIG1lc3NhZ2VzLgorICogCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHBhcmFtIGVycm9yIHBsYWNlIHRvIHN0b3JlIGVycm9ycworICogQHJldHVybnMgI1RSVUUgb24gc3VjY2VzcworICovCitkYnVzX2Jvb2xfdAorZGJ1c19idXNfcmVnaXN0ZXIgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2UsICpyZXBseTsKKyAgY2hhciAqbmFtZTsKKyAgQnVzRGF0YSAqYmQ7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2Vycm9yX2lzX3NldCAoZXJyb3IsIEZBTFNFKTsKKworICByZXR2YWwgPSBGQUxTRTsKKyAgbWVzc2FnZSA9IE5VTEw7CisgIHJlcGx5ID0gTlVMTDsKKworICBpZiAoIV9EQlVTX0xPQ0sgKGJ1c19kYXRhcykpCisgICAgeworICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgLyogZG8gbm90ICJnb3RvIG91dCIsIHRoYXQgd291bGQgdHJ5IHRvIHVubG9jayAqLworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBiZCA9IGVuc3VyZV9idXNfZGF0YSAoY29ubmVjdGlvbik7CisgIGlmIChiZCA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAoYmQtPnVuaXF1ZV9uYW1lICE9IE5VTEwpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIklnbm9yaW5nIGF0dGVtcHQgdG8gcmVnaXN0ZXIgdGhlIHNhbWUgREJ1c0Nvbm5lY3Rpb24gJXMgd2l0aCB0aGUgbWVzc2FnZSBidXMgYSBzZWNvbmQgdGltZS5cbiIsCisgICAgICAgICAgICAgICAgICAgICBiZC0+dW5pcXVlX25hbWUpOworICAgICAgLyogU3VjY2VzcyEgKi8KKyAgICAgIHJldHZhbCA9IFRSVUU7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisgIAorICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoREJVU19TRVJWSUNFX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1BBVEhfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSU5URVJGQUNFX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVsbG8iKTsgCisKKyAgaWYgKCFtZXNzYWdlKQorICAgIHsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgCisgIHJlcGx5ID0gZGJ1c19jb25uZWN0aW9uX3NlbmRfd2l0aF9yZXBseV9hbmRfYmxvY2sgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsIC0xLCBlcnJvcik7CisKKyAgaWYgKHJlcGx5ID09IE5VTEwpCisgICAgZ290byBvdXQ7CisgIGVsc2UgaWYgKGRidXNfc2V0X2Vycm9yX2Zyb21fbWVzc2FnZSAoZXJyb3IsIHJlcGx5KSkKKyAgICBnb3RvIG91dDsKKyAgZWxzZSBpZiAoIWRidXNfbWVzc2FnZV9nZXRfYXJncyAocmVwbHksIGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgIGdvdG8gb3V0OworICAKKyAgYmQtPnVuaXF1ZV9uYW1lID0gX2RidXNfc3RyZHVwIChuYW1lKTsKKyAgaWYgKGJkLT51bmlxdWVfbmFtZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgCisgIHJldHZhbCA9IFRSVUU7CisgIAorIG91dDoKKyAgX0RCVVNfVU5MT0NLIChidXNfZGF0YXMpOworCisgIGlmIChtZXNzYWdlKQorICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisKKyAgaWYgKHJlcGx5KQorICAgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworCisgIGlmICghcmV0dmFsKQorICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCisKKy8qKgorICogU2V0cyB0aGUgdW5pcXVlIG5hbWUgb2YgdGhlIGNvbm5lY3Rpb24sIGFzIGFzc2lnbmVkIGJ5IHRoZSBtZXNzYWdlCisgKiBidXMuICBDYW4gb25seSBiZSB1c2VkIGlmIHlvdSByZWdpc3RlcmVkIHdpdGggdGhlIGJ1cyBtYW51YWxseQorICogKGkuZS4gaWYgeW91IGRpZCBub3QgY2FsbCBkYnVzX2J1c19yZWdpc3RlcigpKS4gQ2FuIG9ubHkgYmUgY2FsbGVkCisgKiBvbmNlIHBlciBjb25uZWN0aW9uLiAgQWZ0ZXIgdGhlIHVuaXF1ZSBuYW1lIGlzIHNldCwgeW91IGNhbiBnZXQgaXQKKyAqIHdpdGggZGJ1c19idXNfZ2V0X3VuaXF1ZV9uYW1lKCkuCisgKgorICogVGhlIG9ubHkgcmVhc29uIHRvIHVzZSB0aGlzIGZ1bmN0aW9uIGlzIHRvIHJlLWltcGxlbWVudCB0aGUKKyAqIGVxdWl2YWxlbnQgb2YgZGJ1c19idXNfcmVnaXN0ZXIoKSB5b3Vyc2VsZi4gT25lIChwcm9iYWJseSB1bnVzdWFsKQorICogcmVhc29uIHRvIGRvIHRoYXQgbWlnaHQgYmUgdG8gZG8gdGhlIGJ1cyByZWdpc3RyYXRpb24gY2FsbAorICogYXN5bmNocm9ub3VzbHkgaW5zdGVhZCBvZiBzeW5jaHJvbm91c2x5LgorICoKKyAqIEBub3RlIEp1c3QgdXNlIGRidXNfYnVzX2dldCgpIG9yIGRidXNfYnVzX2dldF9wcml2YXRlKCksIG9yIHdvcnN0CisgKiBjYXNlIGRidXNfYnVzX3JlZ2lzdGVyKCksIGluc3RlYWQgb2YgbWVzc2luZyB3aXRoIHRoaXMKKyAqIGZ1bmN0aW9uLiBUaGVyZSdzIHJlYWxseSBubyBwb2ludCBjcmVhdGluZyBwYWluIGZvciB5b3Vyc2VsZiBieQorICogZG9pbmcgdGhpbmdzIG1hbnVhbGx5LgorICoKKyAqIEl0J3MgaGFyZCB0byB1c2UgdGhpcyBmdW5jdGlvbiBzYWZlbHkgb24gc2hhcmVkIGNvbm5lY3Rpb25zCisgKiAoY3JlYXRlZCBieSBkYnVzX2Nvbm5lY3Rpb25fb3BlbigpKSBpbiBhIG11bHRpdGhyZWFkZWQgYXBwbGljYXRpb24sCisgKiBiZWNhdXNlIG9ubHkgb25lIHJlZ2lzdHJhdGlvbiBhdHRlbXB0IGNhbiBiZSBzZW50IHRvIHRoZSBidXMuIElmCisgKiB0d28gdGhyZWFkcyBhcmUgYm90aCBzZW5kaW5nIHRoZSByZWdpc3RyYXRpb24gbWVzc2FnZSwgdGhlcmUgaXMgbm8KKyAqIG1lY2hhbmlzbSBpbiBsaWJkYnVzIGl0c2VsZiB0byBhdm9pZCBzZW5kaW5nIGl0IHR3aWNlLgorICoKKyAqIFRodXMsIHlvdSBuZWVkIGEgd2F5IHRvIGNvb3JkaW5hdGUgd2hpY2ggdGhyZWFkIHNlbmRzIHRoZQorICogcmVnaXN0cmF0aW9uIGF0dGVtcHQ7IHdoaWNoIGFsc28gbWVhbnMgeW91IGtub3cgd2hpY2ggdGhyZWFkCisgKiB3aWxsIGNhbGwgZGJ1c19idXNfc2V0X3VuaXF1ZV9uYW1lKCkuIElmIHlvdSBkb24ndCBrbm93CisgKiBhYm91dCBhbGwgdGhyZWFkcyBpbiB0aGUgYXBwIChmb3IgZXhhbXBsZSwgaWYgc29tZSBsaWJyYXJpZXMKKyAqIHlvdSdyZSB1c2luZyBtaWdodCBzdGFydCBsaWJkYnVzLXVzaW5nIHRocmVhZHMpLCB0aGVuIHlvdQorICogbmVlZCB0byBhdm9pZCB1c2luZyB0aGlzIGZ1bmN0aW9uIG9uIHNoYXJlZCBjb25uZWN0aW9ucy4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHBhcmFtIHVuaXF1ZV9uYW1lIHRoZSB1bmlxdWUgbmFtZQorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vdCBlbm91Z2ggbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitkYnVzX2J1c19zZXRfdW5pcXVlX25hbWUgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqdW5pcXVlX25hbWUpCit7CisgIEJ1c0RhdGEgKmJkOworICBkYnVzX2Jvb2xfdCBzdWNjZXNzID0gRkFMU0U7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsICh1bmlxdWVfbmFtZSAhPSBOVUxMLCBGQUxTRSk7CisKKyAgaWYgKCFfREJVU19MT0NLIChidXNfZGF0YXMpKQorICAgIHsKKyAgICAgIC8qIGRvIG5vdCAiZ290byBvdXQiLCB0aGF0IHdvdWxkIHRyeSB0byB1bmxvY2sgKi8KKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgYmQgPSBlbnN1cmVfYnVzX2RhdGEgKGNvbm5lY3Rpb24pOworICBpZiAoYmQgPT0gTlVMTCkKKyAgICBnb3RvIG91dDsKKworICBfZGJ1c19hc3NlcnQgKGJkLT51bmlxdWVfbmFtZSA9PSBOVUxMKTsKKyAgCisgIGJkLT51bmlxdWVfbmFtZSA9IF9kYnVzX3N0cmR1cCAodW5pcXVlX25hbWUpOworICBzdWNjZXNzID0gYmQtPnVuaXF1ZV9uYW1lICE9IE5VTEw7CisKK291dDoKKyAgX0RCVVNfVU5MT0NLIChidXNfZGF0YXMpOworICAKKyAgcmV0dXJuIHN1Y2Nlc3M7Cit9CisKKy8qKgorICogR2V0cyB0aGUgdW5pcXVlIG5hbWUgb2YgdGhlIGNvbm5lY3Rpb24gYXMgYXNzaWduZWQgYnkgdGhlIG1lc3NhZ2UKKyAqIGJ1cy4gT25seSBwb3NzaWJsZSBhZnRlciB0aGUgY29ubmVjdGlvbiBoYXMgYmVlbiByZWdpc3RlcmVkIHdpdGgKKyAqIHRoZSBtZXNzYWdlIGJ1cy4gQWxsIGNvbm5lY3Rpb25zIHJldHVybmVkIGJ5IGRidXNfYnVzX2dldCgpIG9yCisgKiBkYnVzX2J1c19nZXRfcHJpdmF0ZSgpIGhhdmUgYmVlbiBzdWNjZXNzZnVsbHkgcmVnaXN0ZXJlZC4KKyAqCisgKiBUaGUgbmFtZSByZW1haW5zIHZhbGlkIHVudGlsIHRoZSBjb25uZWN0aW9uIGlzIGZyZWVkLCBhbmQKKyAqIHNob3VsZCBub3QgYmUgZnJlZWQgYnkgdGhlIGNhbGxlci4KKyAqCisgKiBPdGhlciB0aGFuIGRidXNfYnVzX2dldCgpLCB0aGVyZSBhcmUgdHdvIHdheXMgdG8gc2V0IHRoZSB1bmlxdWUKKyAqIG5hbWU7IG9uZSBpcyBkYnVzX2J1c19yZWdpc3RlcigpLCB0aGUgb3RoZXIgaXMKKyAqIGRidXNfYnVzX3NldF91bmlxdWVfbmFtZSgpLiAgWW91IGFyZSByZXNwb25zaWJsZSBmb3IgY2FsbGluZworICogZGJ1c19idXNfc2V0X3VuaXF1ZV9uYW1lKCkgaWYgeW91IHJlZ2lzdGVyIGJ5IGhhbmQgaW5zdGVhZCBvZiB1c2luZworICogZGJ1c19idXNfcmVnaXN0ZXIoKS4KKyAqIAorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm5zIHRoZSB1bmlxdWUgbmFtZSBvciAjTlVMTCBvbiBlcnJvcgorICovCitjb25zdCBjaGFyKgorZGJ1c19idXNfZ2V0X3VuaXF1ZV9uYW1lIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgQnVzRGF0YSAqYmQ7CisgIGNvbnN0IGNoYXIgKnVuaXF1ZV9uYW1lID0gTlVMTDsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCwgTlVMTCk7CisKKyAgaWYgKCFfREJVU19MT0NLIChidXNfZGF0YXMpKQorICAgIHsKKyAgICAgIC8qIFdlJ2QgaGF2ZSBpbml0aWFsaXplZCBsb2NrcyB3aGVuIHdlIGdhdmUgaXQgaXRzIHVuaXF1ZSBuYW1lLCBpZiBpdAorICAgICAgICogaGFkIG9uZS4gRG9uJ3QgImdvdG8gb3V0IiwgdGhhdCB3b3VsZCB0cnkgdG8gdW5sb2NrLiAqLworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIGJkID0gZW5zdXJlX2J1c19kYXRhIChjb25uZWN0aW9uKTsKKyAgaWYgKGJkID09IE5VTEwpCisgICAgZ290byBvdXQ7CisKKyAgdW5pcXVlX25hbWUgPSBiZC0+dW5pcXVlX25hbWU7CisKK291dDoKKyAgX0RCVVNfVU5MT0NLIChidXNfZGF0YXMpOworCisgIHJldHVybiB1bmlxdWVfbmFtZTsKK30KKworLyoqCisgKiBBc2tzIHRoZSBidXMgdG8gcmV0dXJuIHRoZSBVSUQgdGhlIG5hbWVkIGNvbm5lY3Rpb24gYXV0aGVudGljYXRlZAorICogYXMsIGlmIGFueS4gIE9ubHkgd29ya3Mgb24gVU5JWDsgb25seSB3b3JrcyBmb3IgY29ubmVjdGlvbnMgb24gdGhlCisgKiBzYW1lIG1hY2hpbmUgYXMgdGhlIGJ1cy4gSWYgeW91IGFyZSBub3Qgb24gdGhlIHNhbWUgbWFjaGluZSBhcyB0aGUKKyAqIGJ1cywgdGhlbiBjYWxsaW5nIHRoaXMgaXMgcHJvYmFibHkgYSBiYWQgaWRlYSwgc2luY2UgdGhlIFVJRCB3aWxsCisgKiBtZWFuIGxpdHRsZSB0byB5b3VyIGFwcGxpY2F0aW9uLgorICoKKyAqIEZvciB0aGUgc3lzdGVtIG1lc3NhZ2UgYnVzIHlvdSdyZSBndWFyYW50ZWVkIHRvIGJlIG9uIHRoZSBzYW1lCisgKiBtYWNoaW5lIHNpbmNlIGl0IG9ubHkgbGlzdGVucyBvbiBhIFVOSVggZG9tYWluIHNvY2tldCAoYXQgbGVhc3QsCisgKiBhcyBzaGlwcGVkIGJ5IGRlZmF1bHQpLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gb25seSB3b3JrcyBmb3IgY29ubmVjdGlvbnMgdGhhdCBhdXRoZW50aWNhdGVkIGFzCisgKiBhIFVOSVggdXNlciwgcmlnaHQgbm93IHRoYXQgaW5jbHVkZXMgYWxsIGJ1cyBjb25uZWN0aW9ucywgYnV0CisgKiBpdCdzIHZlcnkgcG9zc2libGUgdG8gaGF2ZSBjb25uZWN0aW9ucyB3aXRoIG5vIGFzc29jaWF0ZWQgVUlELgorICogU28gY2hlY2sgZm9yIGVycm9ycyBhbmQgZG8gc29tZXRoaW5nIHNlbnNpYmxlIGlmIHRoZXkgaGFwcGVuLgorICogCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgYWx3YXlzIHJldHVybiBhbiBlcnJvciBvbiBXaW5kb3dzLgorICogCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHBhcmFtIG5hbWUgYSBuYW1lIG93bmVkIGJ5IHRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gZXJyb3IgbG9jYXRpb24gdG8gc3RvcmUgdGhlIGVycm9yCisgKiBAcmV0dXJucyB0aGUgdW5peCB1c2VyIGlkLCBvciAoKHVuc2lnbmVkKS0xKSBpZiBlcnJvciBpcyBzZXQKKyAqLyAKK3Vuc2lnbmVkIGxvbmcKK2RidXNfYnVzX2dldF91bml4X3VzZXIgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlLCAqcmVwbHk7CisgIGRidXNfdWludDMyX3QgdWlkOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMLCBEQlVTX1VJRF9VTlNFVCk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAobmFtZSAhPSBOVUxMLCBEQlVTX1VJRF9VTlNFVCk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoX2RidXNfY2hlY2tfaXNfdmFsaWRfYnVzX25hbWUgKG5hbWUpLCBEQlVTX1VJRF9VTlNFVCk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZXJyb3JfaXNfc2V0IChlcnJvciwgREJVU19VSURfVU5TRVQpOworICAKKyAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKERCVVNfU0VSVklDRV9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19QQVRIX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0lOVEVSRkFDRV9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdldENvbm5lY3Rpb25Vbml4VXNlciIpOworCisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgeworICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIERCVVNfVUlEX1VOU0VUOworICAgIH0KKyAKKyAgaWYgKCFkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKG1lc3NhZ2UsCisJCQkJIERCVVNfVFlQRV9TVFJJTkcsICZuYW1lLAorCQkJCSBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBEQlVTX1VJRF9VTlNFVDsKKyAgICB9CisgIAorICByZXBseSA9IGRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHlfYW5kX2Jsb2NrIChjb25uZWN0aW9uLCBtZXNzYWdlLCAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworICAKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgCisgIGlmIChyZXBseSA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgIHJldHVybiBEQlVTX1VJRF9VTlNFVDsKKyAgICB9ICAKKworICBpZiAoZGJ1c19zZXRfZXJyb3JfZnJvbV9tZXNzYWdlIChlcnJvciwgcmVwbHkpKQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworICAgICAgcmV0dXJuIERCVVNfVUlEX1VOU0VUOworICAgIH0KKyAgCisgIGlmICghZGJ1c19tZXNzYWdlX2dldF9hcmdzIChyZXBseSwgZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfVUlOVDMyLCAmdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworICAgICAgcmV0dXJuIERCVVNfVUlEX1VOU0VUOworICAgIH0KKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKyAgCisgIHJldHVybiAodW5zaWduZWQgbG9uZykgdWlkOworfQorCisvKioKKyAqIEFza3MgdGhlIGJ1cyB0byByZXR1cm4gaXRzIGdsb2JhbGx5IHVuaXF1ZSBJRCwgYXMgZGVzY3JpYmVkIGluIHRoZQorICogRC1CdXMgc3BlY2lmaWNhdGlvbi4gRm9yIHRoZSBzZXNzaW9uIGJ1cywgdGhpcyBpcyB1c2VmdWwgYXMgYSB3YXkKKyAqIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IGVhY2ggdXNlciBzZXNzaW9uLiBGb3IgdGhlIHN5c3RlbSBidXMsCisgKiBwcm9iYWJseSB0aGUgYnVzIElEIGlzIG5vdCB1c2VmdWw7IGluc3RlYWQsIHVzZSB0aGUgbWFjaGluZSBJRAorICogc2luY2UgaXQncyBhY2Nlc3NpYmxlIHdpdGhvdXQgbmVjZXNzYXJpbHkgY29ubmVjdGluZyB0byB0aGUgYnVzIGFuZAorICogbWF5IGJlIHBlcnNpc3RlbnQgYmV5b25kIGEgc2luZ2xlIGJ1cyBpbnN0YW5jZSAoYWNyb3NzIHJlYm9vdHMgZm9yCisgKiBleGFtcGxlKS4gU2VlIGRidXNfdHJ5X2dldF9sb2NhbF9tYWNoaW5lX2lkKCkuCisgKgorICogSW4gYWRkaXRpb24gdG8gYW4gSUQgZm9yIGVhY2ggYnVzIGFuZCBhbiBJRCBmb3IgZWFjaCBtYWNoaW5lLCB0aGVyZSBpcworICogYW4gSUQgZm9yIGVhY2ggYWRkcmVzcyB0aGF0IHRoZSBidXMgaXMgbGlzdGVuaW5nIG9uOyB0aGF0IGNhbgorICogYmUgcmV0cmlldmVkIHdpdGggZGJ1c19jb25uZWN0aW9uX2dldF9zZXJ2ZXJfaWQoKSwgdGhvdWdoIGl0IGlzCisgKiBwcm9iYWJseSBub3QgdmVyeSB1c2VmdWwuCisgKiAKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gZXJyb3IgbG9jYXRpb24gdG8gc3RvcmUgdGhlIGVycm9yCisgKiBAcmV0dXJucyB0aGUgYnVzIElEIG9yICNOVUxMIGlmIGVycm9yIGlzIHNldAorICovIAorY2hhcioKK2RidXNfYnVzX2dldF9pZCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2UsICpyZXBseTsKKyAgY2hhciAqaWQ7CisgIGNvbnN0IGNoYXIgKnZfU1RSSU5HOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMLCBOVUxMKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9lcnJvcl9pc19zZXQgKGVycm9yLCBOVUxMKTsKKyAgCisgIG1lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsIChEQlVTX1NFUlZJQ0VfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfUEFUSF9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19JTlRFUkZBQ0VfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHZXRJZCIpOworICAKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICB7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIAorICByZXBseSA9IGRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHlfYW5kX2Jsb2NrIChjb25uZWN0aW9uLCBtZXNzYWdlLCAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworICAKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgCisgIGlmIChyZXBseSA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0gIAorCisgIGlmIChkYnVzX3NldF9lcnJvcl9mcm9tX21lc3NhZ2UgKGVycm9yLCByZXBseSkpCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgdl9TVFJJTkcgPSBOVUxMOworICBpZiAoIWRidXNfbWVzc2FnZV9nZXRfYXJncyAocmVwbHksIGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJnZfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIGlkID0gX2RidXNfc3RyZHVwICh2X1NUUklORyk7IC8qIG1heSBiZSBOVUxMICovCisgIAorICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKworICBpZiAoaWQgPT0gTlVMTCkKKyAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisKKyAgLyogRklYTUUgaXQgbWlnaHQgYmUgbmljZSB0byBjYWNoZSB0aGUgSUQgbG9jYWxseSAqLworICAKKyAgcmV0dXJuIGlkOworfQorCisvKioKKyAqIEFza3MgdGhlIGJ1cyB0byBhc3NpZ24gdGhlIGdpdmVuIG5hbWUgdG8gdGhpcyBjb25uZWN0aW9uIGJ5IGludm9raW5nCisgKiB0aGUgUmVxdWVzdE5hbWUgbWV0aG9kIG9uIHRoZSBidXMuIFRoaXMgbWV0aG9kIGlzIGZ1bGx5IGRvY3VtZW50ZWQKKyAqIGluIHRoZSBELUJ1cyBzcGVjaWZpY2F0aW9uLiBGb3IgcXVpY2sgcmVmZXJlbmNlLCB0aGUgZmxhZ3MgYW5kCisgKiByZXN1bHQgY29kZXMgYXJlIGRpc2N1c3NlZCBoZXJlLCBidXQgdGhlIHNwZWNpZmljYXRpb24gaXMgdGhlCisgKiBjYW5vbmljYWwgdmVyc2lvbiBvZiB0aGlzIGluZm9ybWF0aW9uLgorICoKKyAqIEZpcnN0IHlvdSBzaG91bGQga25vdyB0aGF0IGZvciBlYWNoIGJ1cyBuYW1lLCB0aGUgYnVzIHN0b3JlcworICogYSBxdWV1ZSBvZiBjb25uZWN0aW9ucyB0aGF0IHdvdWxkIGxpa2UgdG8gb3duIGl0LiBPbmx5CisgKiBvbmUgb3ducyBpdCBhdCBhIHRpbWUgLSBjYWxsZWQgdGhlIHByaW1hcnkgb3duZXIuIElmIHRoZSBwcmltYXJ5CisgKiBvd25lciByZWxlYXNlcyB0aGUgbmFtZSBvciBkaXNjb25uZWN0cywgdGhlbiB0aGUgbmV4dCBvd25lciBpbiB0aGUKKyAqIHF1ZXVlIGF0b21pY2FsbHkgdGFrZXMgb3Zlci4KKyAqCisgKiBTbyBmb3IgZXhhbXBsZSBpZiB5b3UgaGF2ZSBhbiBhcHBsaWNhdGlvbiBvcmcuZnJlZWRlc2t0b3AuVGV4dEVkaXRvcgorICogYW5kIG11bHRpcGxlIGluc3RhbmNlcyBvZiBpdCBjYW4gYmUgcnVuLCB5b3UgY2FuIGhhdmUgYWxsIG9mIHRoZW0KKyAqIHNpdHRpbmcgaW4gdGhlIHF1ZXVlLiBUaGUgZmlyc3Qgb25lIHRvIHN0YXJ0IHVwIHdpbGwgcmVjZWl2ZSBtZXNzYWdlcworICogc2VudCB0byBvcmcuZnJlZWRlc2t0b3AuVGV4dEVkaXRvciwgYnV0IGlmIHRoYXQgb25lIGV4aXRzIGFub3RoZXIKKyAqIHdpbGwgYmVjb21lIHRoZSBwcmltYXJ5IG93bmVyIGFuZCByZWNlaXZlIG1lc3NhZ2VzLgorICoKKyAqIFRoZSBxdWV1ZSBtZWFucyB5b3UgZG9uJ3QgbmVlZCB0byBtYW51YWxseSB3YXRjaCBmb3IgdGhlIGN1cnJlbnQgb3duZXIgdG8KKyAqIGRpc2FwcGVhciBhbmQgdGhlbiByZXF1ZXN0IHRoZSBuYW1lIGFnYWluLgorICoKKyAqIFdoZW4gcmVxdWVzdGluZyBhIG5hbWUsIHlvdSBjYW4gc3BlY2lmeSBzZXZlcmFsIGZsYWdzLgorICogCisgKiAjREJVU19OQU1FX0ZMQUdfQUxMT1dfUkVQTEFDRU1FTlQgYW5kICNEQlVTX05BTUVfRkxBR19ET19OT1RfUVVFVUUKKyAqIGFyZSBwcm9wZXJ0aWVzIHN0b3JlZCBieSB0aGUgYnVzIGZvciB0aGlzIGNvbm5lY3Rpb24gd2l0aCByZXNwZWN0IHRvCisgKiBlYWNoIHJlcXVlc3RlZCBidXMgbmFtZS4gVGhlc2UgcHJvcGVydGllcyBhcmUgc3RvcmVkIGV2ZW4gaWYgdGhlCisgKiBjb25uZWN0aW9uIGlzIHF1ZXVlZCBhbmQgZG9lcyBub3QgYmVjb21lIHRoZSBwcmltYXJ5IG93bmVyLgorICogWW91IGNhbiB1cGRhdGUgdGhlc2UgZmxhZ3MgYnkgY2FsbGluZyBSZXF1ZXN0TmFtZSBhZ2FpbiAoZXZlbiBpZgorICogeW91IGFscmVhZHkgb3duIHRoZSBuYW1lKS4KKyAqCisgKiAjREJVU19OQU1FX0ZMQUdfQUxMT1dfUkVQTEFDRU1FTlQgbWVhbnMgdGhhdCBhbm90aGVyIHJlcXVlc3RvciBvZiB0aGUKKyAqIG5hbWUgY2FuIHRha2UgaXQgYXdheSBmcm9tIHlvdSBieSBzcGVjaWZ5aW5nICNEQlVTX05BTUVfRkxBR19SRVBMQUNFX0VYSVNUSU5HLgorICoKKyAqICNEQlVTX05BTUVfRkxBR19ET19OT1RfUVVFVUUgbWVhbnMgdGhhdCBpZiB5b3UgYXJlbid0IHRoZSBwcmltYXJ5IG93bmVyLAorICogeW91IGRvbid0IHdhbnQgdG8gYmUgcXVldWVkIHVwIC0geW91IG9ubHkgY2FyZSBhYm91dCBiZWluZyB0aGUKKyAqIHByaW1hcnkgb3duZXIuCisgKgorICogVW5saWtlIHRoZSBvdGhlciB0d28gZmxhZ3MsICNEQlVTX05BTUVfRkxBR19SRVBMQUNFX0VYSVNUSU5HIGlzIGEgcHJvcGVydHkKKyAqIG9mIHRoZSBpbmRpdmlkdWFsIFJlcXVlc3ROYW1lIGNhbGwsIGkuZS4gdGhlIGJ1cyBkb2VzIG5vdCBwZXJzaXN0ZW50bHkKKyAqIGFzc29jaWF0ZSBpdCB3aXRoIHRoZSBjb25uZWN0aW9uLW5hbWUgcGFpci4gSWYgYSBSZXF1ZXN0TmFtZSBjYWxsIGluY2x1ZGVzCisgKiB0aGUgI0RCVVNfTkFNRV9GTEFHX1JFUExBQ0VfRVhJU1RJTkcgZmxhZywgYW5kIHRoZSBjdXJyZW50IHByaW1hcnkKKyAqIG93bmVyIGhhcyAjREJVU19OQU1FX0ZMQUdfQUxMT1dfUkVQTEFDRU1FTlQgc2V0LCB0aGVuIHRoZSBjdXJyZW50IHByaW1hcnkKKyAqIG93bmVyIHdpbGwgYmUga2lja2VkIG9mZi4KKyAqCisgKiBJZiBubyBmbGFncyBhcmUgZ2l2ZW4sIGFuIGFwcGxpY2F0aW9uIHdpbGwgcmVjZWl2ZSB0aGUgcmVxdWVzdGVkCisgKiBuYW1lIG9ubHkgaWYgdGhlIG5hbWUgaXMgY3VycmVudGx5IHVub3duZWQ7IGFuZCBpdCB3aWxsIE5PVCBnaXZlCisgKiB1cCB0aGUgbmFtZSBpZiBhbm90aGVyIGFwcGxpY2F0aW9uIGFza3MgdG8gdGFrZSBpdCBvdmVyIHVzaW5nCisgKiAjREJVU19OQU1FX0ZMQUdfUkVQTEFDRV9FWElTVElORy4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSByZXN1bHQgY29kZS4gVGhlIHBvc3NpYmxlIHJlc3VsdCBjb2RlcworICogYXJlIGFzIGZvbGxvd3MuCisgKiAKKyAqICNEQlVTX1JFUVVFU1RfTkFNRV9SRVBMWV9QUklNQVJZX09XTkVSIG1lYW5zIHRoYXQgdGhlIG5hbWUgaGFkIG5vCisgKiBleGlzdGluZyBvd25lciwgYW5kIHRoZSBjYWxsZXIgaXMgbm93IHRoZSBwcmltYXJ5IG93bmVyOyBvciB0aGF0CisgKiB0aGUgbmFtZSBoYWQgYW4gb3duZXIsIGFuZCB0aGUgY2FsbGVyIHNwZWNpZmllZAorICogI0RCVVNfTkFNRV9GTEFHX1JFUExBQ0VfRVhJU1RJTkcsIGFuZCB0aGUgY3VycmVudCBvd25lcgorICogc3BlY2lmaWVkICNEQlVTX05BTUVfRkxBR19BTExPV19SRVBMQUNFTUVOVC4KKyAqCisgKiAjREJVU19SRVFVRVNUX05BTUVfUkVQTFlfSU5fUVVFVUUgaGFwcGVucyBvbmx5IGlmIHRoZSBjYWxsZXIgZG9lcyBOT1QKKyAqIHNwZWNpZnkgI0RCVVNfTkFNRV9GTEFHX0RPX05PVF9RVUVVRSBhbmQgZWl0aGVyIHRoZSBjdXJyZW50IG93bmVyCisgKiBkaWQgTk9UIHNwZWNpZnkgI0RCVVNfTkFNRV9GTEFHX0FMTE9XX1JFUExBQ0VNRU5UIG9yIHRoZSBjYWxsZXIgZGlkIE5PVAorICogc3BlY2lmeSAjREJVU19OQU1FX0ZMQUdfUkVQTEFDRV9FWElTVElORy4gSW4gdGhpcyBjYXNlIHRoZSBjYWxsZXIgZW5kcyB1cCAKKyAqIGluIGEgcXVldWUgdG8gb3duIHRoZSBuYW1lIGFmdGVyIHRoZSBjdXJyZW50IG93bmVyIGdpdmVzIGl0IHVwLgorICoKKyAqICNEQlVTX1JFUVVFU1RfTkFNRV9SRVBMWV9FWElTVFMgaGFwcGVucyBpZiB0aGUgbmFtZSBoYXMgYW4gb3duZXIKKyAqIGFscmVhZHkgYW5kIHRoZSBjYWxsZXIgc3BlY2lmaWVzICNEQlVTX05BTUVfRkxBR19ET19OT1RfUVVFVUUKKyAqIGFuZCBlaXRoZXIgdGhlIGN1cnJlbnQgb3duZXIgaGFzIE5PVCBzcGVjaWZpZWQgCisgKiAjREJVU19OQU1FX0ZMQUdfQUxMT1dfUkVQTEFDRU1FTlQgb3IgdGhlIGNhbGxlciBkaWQgTk9UIHNwZWNpZnkgCisgKiAjREJVU19OQU1FX0ZMQUdfUkVQTEFDRV9FWElTVElORy4KKyAqCisgKiAjREJVU19SRVFVRVNUX05BTUVfUkVQTFlfQUxSRUFEWV9PV05FUiBoYXBwZW5zIGlmIGFuIGFwcGxpY2F0aW9uCisgKiByZXF1ZXN0cyBhIG5hbWUgaXQgYWxyZWFkeSBvd25zLiAoUmUtcmVxdWVzdGluZyBhIG5hbWUgaXMgdXNlZnVsIGlmCisgKiB5b3Ugd2FudCB0byBjaGFuZ2UgdGhlICNEQlVTX05BTUVfRkxBR19BTExPV19SRVBMQUNFTUVOVCBvcgorICogI0RCVVNfTkFNRV9GTEFHX0RPX05PVF9RVUVVRSBzZXR0aW5ncy4pCisgKgorICogV2hlbiBhIHNlcnZpY2UgcmVwcmVzZW50cyBhbiBhcHBsaWNhdGlvbiwgc2F5ICJ0ZXh0IGVkaXRvciwiIHRoZW4KKyAqIGl0IHNob3VsZCBzcGVjaWZ5ICNEQlVTX05BTUVfRkxBR19BTExPV19SRVBMQUNFTUVOVCBpZiBpdCB3YW50cworICogdGhlIGxhc3QgZWRpdG9yIHN0YXJ0ZWQgdG8gYmUgdGhlIHVzZXIncyBlZGl0b3IgdnMuIHRoZSBmaXJzdCBvbmUKKyAqIHN0YXJ0ZWQuICBUaGVuIGFueSBlZGl0b3IgdGhhdCBjYW4gYmUgdGhlIHVzZXIncyBlZGl0b3Igc2hvdWxkCisgKiBzcGVjaWZ5ICNEQlVTX05BTUVfRkxBR19SRVBMQUNFX0VYSVNUSU5HIHRvIGVpdGhlciB0YWtlIG92ZXIKKyAqIChsYXN0LXN0YXJ0ZWQtd2lucykgb3IgYmUgcXVldWVkIHVwIChmaXJzdC1zdGFydGVkLXdpbnMpIGFjY29yZGluZworICogdG8gd2hldGhlciAjREJVU19OQU1FX0ZMQUdfQUxMT1dfUkVQTEFDRU1FTlQgd2FzIGdpdmVuLgorICoKKyAqIENvbnZlbnRpb25hbGx5LCBzaW5nbGUtaW5zdGFuY2UgYXBwbGljYXRpb25zIG9mdGVuIG9mZmVyIGEgY29tbWFuZAorICogbGluZSBvcHRpb24gY2FsbGVkIC0tcmVwbGFjZSB3aGljaCBtZWFucyB0byByZXBsYWNlIHRoZSBjdXJyZW50CisgKiBpbnN0YW5jZS4gIFRvIGltcGxlbWVudCB0aGlzLCBhbHdheXMgc2V0CisgKiAjREJVU19OQU1FX0ZMQUdfQUxMT1dfUkVQTEFDRU1FTlQgd2hlbiB5b3UgcmVxdWVzdCB5b3VyCisgKiBhcHBsaWNhdGlvbidzIGJ1cyBuYW1lLiAgV2hlbiB5b3UgbG9zZSBvd25lcnNoaXAgb2YgeW91ciBidXMgbmFtZSwKKyAqIHlvdSBuZWVkIHRvIGV4aXQuICBMb29rIGZvciB0aGUgc2lnbmFsICJOYW1lTG9zdCIgZnJvbQorICogI0RCVVNfU0VSVklDRV9EQlVTIGFuZCAjREJVU19JTlRFUkZBQ0VfREJVUyAodGhlIHNpZ25hbCdzIGZpcnN0CisgKiBhcmd1bWVudCBpcyB0aGUgYnVzIG5hbWUgdGhhdCB3YXMgbG9zdCkuICBJZiBzdGFydGluZyB1cCB3aXRob3V0CisgKiAtLXJlcGxhY2UsIGRvIG5vdCBzcGVjaWZ5ICNEQlVTX05BTUVfRkxBR19SRVBMQUNFX0VYSVNUSU5HLCBhbmQKKyAqIGV4aXQgaWYgeW91IGZhaWwgdG8gYmVjb21lIHRoZSBidXMgbmFtZSBvd25lci4gSWYgLS1yZXBsYWNlIGlzCisgKiBnaXZlbiwgYXNrIHRvIHJlcGxhY2UgdGhlIG9sZCBvd25lci4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgdG8gcmVxdWVzdAorICogQHBhcmFtIGZsYWdzIGZsYWdzCisgKiBAcGFyYW0gZXJyb3IgbG9jYXRpb24gdG8gc3RvcmUgdGhlIGVycm9yCisgKiBAcmV0dXJucyBhIHJlc3VsdCBjb2RlLCAtMSBpZiBlcnJvciBpcyBzZXQKKyAqLyAKK2ludAorZGJ1c19idXNfcmVxdWVzdF9uYW1lIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBEQnVzTWVzc2FnZSAqbWVzc2FnZSwgKnJlcGx5OworICBkYnVzX3VpbnQzMl90IHJlc3VsdDsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCwgMCk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAobmFtZSAhPSBOVUxMLCAwKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChfZGJ1c19jaGVja19pc192YWxpZF9idXNfbmFtZSAobmFtZSksIDApOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2Vycm9yX2lzX3NldCAoZXJyb3IsIDApOworICAKKyAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKERCVVNfU0VSVklDRV9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19QQVRIX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0lOVEVSRkFDRV9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlcXVlc3ROYW1lIik7CisKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICB7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorIAorICBpZiAoIWRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAobWVzc2FnZSwKKwkJCQkgREJVU19UWVBFX1NUUklORywgJm5hbWUsCisJCQkJIERCVVNfVFlQRV9VSU5UMzIsICZmbGFncywKKwkJCQkgREJVU19UWVBFX0lOVkFMSUQpKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAKKyAgcmVwbHkgPSBkYnVzX2Nvbm5lY3Rpb25fc2VuZF93aXRoX3JlcGx5X2FuZF9ibG9jayAoY29ubmVjdGlvbiwgbWVzc2FnZSwgLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKKyAgCisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIAorICBpZiAocmVwbHkgPT0gTlVMTCkKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICByZXR1cm4gLTE7CisgICAgfSAgCisKKyAgaWYgKGRidXNfc2V0X2Vycm9yX2Zyb21fbWVzc2FnZSAoZXJyb3IsIHJlcGx5KSkKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgIAorICBpZiAoIWRidXNfbWVzc2FnZV9nZXRfYXJncyAocmVwbHksIGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1VJTlQzMiwgJnJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgIAorICByZXR1cm4gcmVzdWx0OworfQorCisKKy8qKgorICogQXNrcyB0aGUgYnVzIHRvIHVuYXNzaWduIHRoZSBnaXZlbiBuYW1lIGZyb20gdGhpcyBjb25uZWN0aW9uIGJ5CisgKiBpbnZva2luZyB0aGUgUmVsZWFzZU5hbWUgbWV0aG9kIG9uIHRoZSBidXMuIFRoZSAiUmVsZWFzZU5hbWUiCisgKiBtZXRob2QgaXMgY2Fub25pY2FsbHkgZG9jdW1lbnRlZCBpbiB0aGUgRC1CdXMgc3BlY2lmaWNhdGlvbi4KKyAqCisgKiBQb3NzaWJsZSByZXN1bHRzIGFyZTogI0RCVVNfUkVMRUFTRV9OQU1FX1JFUExZX1JFTEVBU0VECisgKiB3aGljaCBtZWFucyB5b3Ugb3duZWQgdGhlIG5hbWUgb3Igd2VyZSBpbiB0aGUgcXVldWUgdG8gb3duIGl0LAorICogYW5kIGFuZCBub3cgeW91IGRvbid0IG93biBpdCBhbmQgYXJlbid0IGluIHRoZSBxdWV1ZS4KKyAqICNEQlVTX1JFTEVBU0VfTkFNRV9SRVBMWV9OT1RfT1dORVIgd2hpY2ggbWVhbnMgc29tZW9uZSBlbHNlCisgKiBvd25zIHRoZSBuYW1lIHNvIHlvdSBjYW4ndCByZWxlYXNlIGl0LgorICogI0RCVVNfUkVMRUFTRV9OQU1FX1JFUExZX05PTl9FWElTVEVOVAorICogd2hpY2ggbWVhbnMgbm9ib2R5IG93bmVkIHRoZSBuYW1lLgorICogCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgdG8gcmVtb3ZlIAorICogQHBhcmFtIGVycm9yIGxvY2F0aW9uIHRvIHN0b3JlIHRoZSBlcnJvcgorICogQHJldHVybnMgYSByZXN1bHQgY29kZSwgLTEgaWYgZXJyb3IgaXMgc2V0CisgKi8gCitpbnQKK2RidXNfYnVzX3JlbGVhc2VfbmFtZSAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlLCAqcmVwbHk7CisgIGRidXNfdWludDMyX3QgcmVzdWx0OworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMLCAwKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChuYW1lICE9IE5VTEwsIDApOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKF9kYnVzX2NoZWNrX2lzX3ZhbGlkX2J1c19uYW1lIChuYW1lKSwgMCk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZXJyb3JfaXNfc2V0IChlcnJvciwgMCk7CisKKyAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKERCVVNfU0VSVklDRV9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19QQVRIX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0lOVEVSRkFDRV9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlbGVhc2VOYW1lIik7CisKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICB7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIGlmICghZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgcmVwbHkgPSBkYnVzX2Nvbm5lY3Rpb25fc2VuZF93aXRoX3JlcGx5X2FuZF9ibG9jayAoY29ubmVjdGlvbiwgbWVzc2FnZSwgLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworCisgIGlmIChyZXBseSA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgaWYgKGRidXNfc2V0X2Vycm9yX2Zyb21fbWVzc2FnZSAoZXJyb3IsIHJlcGx5KSkKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MgKHJlcGx5LCBlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9VSU5UMzIsICZyZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogQXNrcyB0aGUgYnVzIHdoZXRoZXIgYSBjZXJ0YWluIG5hbWUgaGFzIGFuIG93bmVyLgorICoKKyAqIFVzaW5nIHRoaXMgY2FuIGVhc2lseSByZXN1bHQgaW4gYSByYWNlIGNvbmRpdGlvbiwKKyAqIHNpbmNlIGFuIG93bmVyIGNhbiBhcHBlYXIgb3IgZGlzYXBwZWFyIGFmdGVyIHlvdQorICogY2FsbCB0aGlzLgorICoKKyAqIElmIHlvdSB3YW50IHRvIHJlcXVlc3QgYSBuYW1lLCBqdXN0IHJlcXVlc3QgaXQ7CisgKiBpZiB5b3Ugd2FudCB0byBhdm9pZCByZXBsYWNpbmcgYSBjdXJyZW50IG93bmVyLAorICogZG9uJ3Qgc3BlY2lmeSAjREJVU19OQU1FX0ZMQUdfUkVQTEFDRV9FWElTVElORyBhbmQKKyAqIHlvdSB3aWxsIGdldCBhbiBlcnJvciBpZiB0aGVyZSdzIGFscmVhZHkgYW4gb3duZXIuCisgKiAKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZQorICogQHBhcmFtIGVycm9yIGxvY2F0aW9uIHRvIHN0b3JlIGFueSBlcnJvcnMKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSBuYW1lIGV4aXN0cywgI0ZBTFNFIGlmIG5vdCBvciBvbiBlcnJvcgorICovCitkYnVzX2Jvb2xfdAorZGJ1c19idXNfbmFtZV9oYXNfb3duZXIgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorCQkJIGNvbnN0IGNoYXIgICAgICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2UsICpyZXBseTsKKyAgZGJ1c19ib29sX3QgZXhpc3RzOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAobmFtZSAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoX2RidXNfY2hlY2tfaXNfdmFsaWRfYnVzX25hbWUgKG5hbWUpLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZXJyb3JfaXNfc2V0IChlcnJvciwgRkFMU0UpOworICAKKyAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKERCVVNfU0VSVklDRV9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19QQVRIX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0lOVEVSRkFDRV9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5hbWVIYXNPd25lciIpOworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIAorICBpZiAoIWRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAobWVzc2FnZSwKKwkJCQkgREJVU19UWVBFX1NUUklORywgJm5hbWUsCisJCQkJIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgCisgIHJlcGx5ID0gZGJ1c19jb25uZWN0aW9uX3NlbmRfd2l0aF9yZXBseV9hbmRfYmxvY2sgKGNvbm5lY3Rpb24sIG1lc3NhZ2UsIC0xLCBlcnJvcik7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisKKyAgaWYgKHJlcGx5ID09IE5VTEwpCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIWRidXNfbWVzc2FnZV9nZXRfYXJncyAocmVwbHksIGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0JPT0xFQU4sICZleGlzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgIHJldHVybiBleGlzdHM7Cit9CisKKy8qKgorICogU3RhcnRzIGEgc2VydmljZSB0aGF0IHdpbGwgcmVxdWVzdCBvd25lcnNoaXAgb2YgdGhlIGdpdmVuIG5hbWUuCisgKiBUaGUgcmV0dXJuZWQgcmVzdWx0IHdpbGwgYmUgb25lIG9mIGJlIG9uZSBvZgorICogI0RCVVNfU1RBUlRfUkVQTFlfU1VDQ0VTUyBvciAjREJVU19TVEFSVF9SRVBMWV9BTFJFQURZX1JVTk5JTkcgaWYKKyAqIHN1Y2Nlc3NmdWwuICBQYXNzICNOVUxMIGlmIHlvdSBkb24ndCBjYXJlIGFib3V0IHRoZSByZXN1bHQuCisgKiAKKyAqIFRoZSBmbGFncyBwYXJhbWV0ZXIgaXMgZm9yIGZ1dHVyZSBleHBhbnNpb24sIGN1cnJlbnRseSB5b3Ugc2hvdWxkCisgKiBzcGVjaWZ5IDAuCisgKgorICogSXQncyBvZnRlbiBlYXNpZXIgdG8gYXZvaWQgZXhwbGljaXRseSBzdGFydGluZyBzZXJ2aWNlcywgYW5kCisgKiBqdXN0IHNlbmQgYSBtZXRob2QgY2FsbCB0byB0aGUgc2VydmljZSdzIGJ1cyBuYW1lIGluc3RlYWQuCisgKiBNZXRob2QgY2FsbHMgc3RhcnQgYSBzZXJ2aWNlIHRvIGhhbmRsZSB0aGVtIGJ5IGRlZmF1bHQKKyAqIHVubGVzcyB5b3UgY2FsbCBkYnVzX21lc3NhZ2Vfc2V0X2F1dG9fc3RhcnQoKSB0byBkaXNhYmxlIHRoaXMKKyAqIGJlaGF2aW9yLgorICogCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgd2Ugd2FudCB0aGUgbmV3IHNlcnZpY2UgdG8gcmVxdWVzdAorICogQHBhcmFtIGZsYWdzIHRoZSBmbGFncyAoc2hvdWxkIGFsd2F5cyBiZSAwIGZvciBub3cpCisgKiBAcGFyYW0gcmVzdWx0IGEgcGxhY2UgdG8gc3RvcmUgdGhlIHJlc3VsdCBvciAjTlVMTAorICogQHBhcmFtIGVycm9yIGxvY2F0aW9uIHRvIHN0b3JlIGFueSBlcnJvcnMKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSBhY3RpdmF0aW9uIHN1Y2NlZWRlZCwgI0ZBTFNFIGlmIG5vdAorICovCitkYnVzX2Jvb2xfdAorZGJ1c19idXNfc3RhcnRfc2VydmljZV9ieV9uYW1lIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgKnJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBEQnVzTWVzc2FnZSAqbXNnOworICBEQnVzTWVzc2FnZSAqcmVwbHk7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChfZGJ1c19jaGVja19pc192YWxpZF9idXNfbmFtZSAobmFtZSksIEZBTFNFKTsKKyAgCisgIG1zZyA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKERCVVNfU0VSVklDRV9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1BBVEhfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19JTlRFUkZBQ0VfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN0YXJ0U2VydmljZUJ5TmFtZSIpOworCisgIGlmICghZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChtc2csIERCVVNfVFlQRV9TVFJJTkcsICZuYW1lLAorCQkJICAJIERCVVNfVFlQRV9VSU5UMzIsICZmbGFncywgREJVU19UWVBFX0lOVkFMSUQpKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobXNnKTsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgcmVwbHkgPSBkYnVzX2Nvbm5lY3Rpb25fc2VuZF93aXRoX3JlcGx5X2FuZF9ibG9jayAoY29ubmVjdGlvbiwgbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSwgZXJyb3IpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1zZyk7CisKKyAgaWYgKHJlcGx5ID09IE5VTEwpCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoZGJ1c19zZXRfZXJyb3JfZnJvbV9tZXNzYWdlIChlcnJvciwgcmVwbHkpKQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAocmVzdWx0ICE9IE5VTEwgJiYKKyAgICAgICFkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MgKHJlcGx5LCBlcnJvciwgREJVU19UWVBFX1VJTlQzMiwKKwkgICAgICAJCSAgICAgIHJlc3VsdCwgREJVU19UWVBFX0lOVkFMSUQpKQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgCisgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK3NlbmRfbm9fcmV0dXJuX3ZhbHVlcyAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICptc2csCisgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgaWYgKGVycm9yKQorICAgIHsKKyAgICAgIC8qIEJsb2NrIHRvIGNoZWNrIHN1Y2Nlc3MgY29kZXBhdGggKi8KKyAgICAgIERCdXNNZXNzYWdlICpyZXBseTsKKyAgICAgIAorICAgICAgcmVwbHkgPSBkYnVzX2Nvbm5lY3Rpb25fc2VuZF93aXRoX3JlcGx5X2FuZF9ibG9jayAoY29ubmVjdGlvbiwgbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEsIGVycm9yKTsKKyAgICAgIAorICAgICAgaWYgKHJlcGx5ID09IE5VTEwpCisgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgIGVsc2UKKyAgICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogU2lsZW50bHktZmFpbCBub25ibG9ja2luZyBjb2RlcGF0aCAqLworICAgICAgZGJ1c19tZXNzYWdlX3NldF9ub19yZXBseSAobXNnLCBUUlVFKTsKKyAgICAgIGRidXNfY29ubmVjdGlvbl9zZW5kIChjb25uZWN0aW9uLCBtc2csIE5VTEwpOworICAgIH0KK30KKworLyoqCisgKiBBZGRzIGEgbWF0Y2ggcnVsZSB0byBtYXRjaCBtZXNzYWdlcyBnb2luZyB0aHJvdWdoIHRoZSBtZXNzYWdlIGJ1cy4KKyAqIFRoZSAicnVsZSIgYXJndW1lbnQgaXMgdGhlIHN0cmluZyBmb3JtIG9mIGEgbWF0Y2ggcnVsZS4KKyAqCisgKiBJZiB5b3UgcGFzcyAjTlVMTCBmb3IgdGhlIGVycm9yLCB0aGlzIGZ1bmN0aW9uIHdpbGwgbm90CisgKiBibG9jazsgdGhlIG1hdGNoIHRodXMgd29uJ3QgYmUgYWRkZWQgdW50aWwgeW91IGZsdXNoIHRoZQorICogY29ubmVjdGlvbiwgYW5kIGlmIHRoZXJlJ3MgYW4gZXJyb3IgYWRkaW5nIHRoZSBtYXRjaAorICogeW91IHdvbid0IGZpbmQgb3V0IGFib3V0IGl0LiBUaGlzIGlzIGdlbmVyYWxseSBhY2NlcHRhYmxlLCBzaW5jZSB0aGUKKyAqIHBvc3NpYmxlIGVycm9ycyAoaW5jbHVkaW5nIGEgbGFjayBvZiByZXNvdXJjZXMgaW4gdGhlIGJ1cywgdGhlIGNvbm5lY3Rpb24KKyAqIGhhdmluZyBleGNlZWRlZCBpdHMgcXVvdGEgb2YgYWN0aXZlIG1hdGNoIHJ1bGVzLCBvciB0aGUgbWF0Y2ggcnVsZSBiZWluZworICogdW5wYXJzZWFibGUpIGFyZSBnZW5lcmFsbHkgdW5yZWNvdmVyYWJsZS4KKyAqCisgKiBJZiB5b3UgcGFzcyBub24tI05VTEwgZm9yIHRoZSBlcnJvciB0aGlzIGZ1bmN0aW9uIHdpbGwKKyAqIGJsb2NrIHVudGlsIGl0IGdldHMgYSByZXBseS4gVGhpcyBtYXkgYmUgdXNlZnVsIHdoZW4gdXNpbmcgbWF0Y2ggcnVsZSBrZXlzCisgKiBpbnRyb2R1Y2VkIGluIHJlY2VudCB2ZXJzaW9ucyBvZiBELUJ1cywgbGlrZSAnYXJnMG5hbWVzcGFjZScsIHRvIGFsbG93IHRoZQorICogYXBwbGljYXRpb24gdG8gZmFsbCBiYWNrIHRvIGxlc3MgZWZmaWNpZW50IG1hdGNoIHJ1bGVzIHN1cHBvcnRlZCBieSBvbGRlcgorICogdmVyc2lvbnMgb2YgdGhlIGRhZW1vbiBpZiB0aGUgcnVubmluZyB2ZXJzaW9uIGlzIG5vdCBuZXcgZW5vdWdoOyBvciB3aGVuCisgKiB1c2luZyB1c2VyLXN1cHBsaWVkIHJ1bGVzIHJhdGhlciB0aGFuIHJ1bGVzIGhhcmQtY29kZWQgYXQgY29tcGlsZSB0aW1lLgorICoKKyAqIE5vcm1hbCBBUEkgY29udmVudGlvbnMgd291bGQgaGF2ZSB0aGUgZnVuY3Rpb24gcmV0dXJuCisgKiBhIGJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBlcnJvciB3YXMgc2V0LAorICogYnV0IHRoYXQgd291bGQgcmVxdWlyZSBibG9ja2luZyBhbHdheXMgdG8gZGV0ZXJtaW5lCisgKiB0aGUgcmV0dXJuIHZhbHVlLgorICoKKyAqIFRoZSBBZGRNYXRjaCBtZXRob2QgaXMgZnVsbHkgZG9jdW1lbnRlZCBpbiB0aGUgRC1CdXMgCisgKiBzcGVjaWZpY2F0aW9uLiBGb3IgcXVpY2sgcmVmZXJlbmNlLCB0aGUgZm9ybWF0IG9mIHRoZSAKKyAqIG1hdGNoIHJ1bGVzIGlzIGRpc2N1c3NlZCBoZXJlLCBidXQgdGhlIHNwZWNpZmljYXRpb24gCisgKiBpcyB0aGUgY2Fub25pY2FsIHZlcnNpb24gb2YgdGhpcyBpbmZvcm1hdGlvbi4KKyAqCisgKiBSdWxlcyBhcmUgc3BlY2lmaWVkIGFzIGEgc3RyaW5nIG9mIGNvbW1hIHNlcGFyYXRlZCAKKyAqIGtleS92YWx1ZSBwYWlycy4gQW4gZXhhbXBsZSBpcyAKKyAqICJ0eXBlPSdzaWduYWwnLHNlbmRlcj0nb3JnLmZyZWVkZXNrdG9wLkRCdXMnLAorICogaW50ZXJmYWNlPSdvcmcuZnJlZWRlc2t0b3AuREJ1cycsbWVtYmVyPSdGb28nLAorICogcGF0aD0nL2Jhci9mb28nLGRlc3RpbmF0aW9uPSc6NDUyMzQ1LjM0JyIKKyAqCisgKiBQb3NzaWJsZSBrZXlzIHlvdSBjYW4gbWF0Y2ggb24gYXJlIHR5cGUsIHNlbmRlciwgCisgKiBpbnRlcmZhY2UsIG1lbWJlciwgcGF0aCwgZGVzdGluYXRpb24gYW5kIG51bWJlcmVkCisgKiBrZXlzIHRvIG1hdGNoIG1lc3NhZ2UgYXJncyAoa2V5cyBhcmUgJ2FyZzAnLCAnYXJnMScsIGV0Yy4pLgorICogT21pdHRpbmcgYSBrZXkgZnJvbSB0aGUgcnVsZSBpbmRpY2F0ZXMgCisgKiBhIHdpbGRjYXJkIG1hdGNoLiAgRm9yIGluc3RhbmNlIG9taXR0aW5nCisgKiB0aGUgbWVtYmVyIGZyb20gYSBtYXRjaCBydWxlIGJ1dCBhZGRpbmcgYSBzZW5kZXIgd291bGQKKyAqIGxldCBhbGwgbWVzc2FnZXMgZnJvbSB0aGF0IHNlbmRlciB0aHJvdWdoIHJlZ2FyZGxlc3Mgb2YKKyAqIHRoZSBtZW1iZXIuCisgKgorICogTWF0Y2hlcyBhcmUgaW5jbHVzaXZlIG5vdCBleGNsdXNpdmUgc28gYXMgbG9uZyBhcyBvbmUgCisgKiBydWxlIG1hdGNoZXMgdGhlIG1lc3NhZ2Ugd2lsbCBnZXQgdGhyb3VnaC4gIEl0IGlzIGltcG9ydGFudAorICogdG8gbm90ZSB0aGlzIGJlY2F1c2UgZXZlcnkgdGltZSBhIG1lc3NhZ2UgaXMgcmVjZWl2ZWQgdGhlIAorICogYXBwbGljYXRpb24gd2lsbCBiZSBwYWdlZCBpbnRvIG1lbW9yeSB0byBwcm9jZXNzIGl0LiAgVGhpcworICogY2FuIGNhdXNlIHBlcmZvcm1hbmNlIHByb2JsZW1zIHN1Y2ggYXMgZHJhaW5pbmcgYmF0dGVyaWVzCisgKiBvbiBlbWJlZGRlZCBwbGF0Zm9ybXMuCisgKgorICogSWYgeW91IG1hdGNoIG1lc3NhZ2UgYXJncyAoJ2FyZzAnLCAnYXJnMScsIGFuZCBzbyBmb3J0aCkKKyAqIG9ubHkgc3RyaW5nIGFyZ3VtZW50cyB3aWxsIG1hdGNoLiBUaGF0IGlzLCBhcmcwPSc1JyBtZWFucworICogbWF0Y2ggdGhlIHN0cmluZyAiNSIgbm90IHRoZSBpbnRlZ2VyIDUuCisgKgorICogQ3VycmVudGx5IHRoZXJlIGlzIG5vIHdheSB0byBtYXRjaCBhZ2FpbnN0IG5vbi1zdHJpbmcgYXJndW1lbnRzLgorICoKKyAqIEEgc3BlY2lhbGlzZWQgZm9ybSBvZiB3aWxkY2FyZCBtYXRjaGluZyBvbiBhcmd1bWVudHMgaXMKKyAqIHN1cHBvcnRlZCBmb3IgcGF0aC1saWtlIG5hbWVzcGFjZXMuICBJZiB5b3VyIGFyZ3VtZW50IG1hdGNoIGhhcworICogYSAncGF0aCcgc3VmZml4IChlZzogImFyZzBwYXRoPScvc29tZS9wYXRoLyciKSB0aGVuIGl0IGlzCisgKiBjb25zaWRlcmVkIGEgbWF0Y2ggaWYgdGhlIGFyZ3VtZW50IGV4YWN0bHkgbWF0Y2hlcyB0aGUgZ2l2ZW4KKyAqIHN0cmluZyBvciBpZiBvbmUgb2YgdGhlbSBlbmRzIGluIGEgJy8nIGFuZCBpcyBhIHByZWZpeCBvZiB0aGUKKyAqIG90aGVyLgorICoKKyAqIE1hdGNoaW5nIG9uIGludGVyZmFjZSBpcyB0cmlja3kgYmVjYXVzZSBtZXRob2QgY2FsbAorICogbWVzc2FnZXMgb25seSBvcHRpb25hbGx5IHNwZWNpZnkgdGhlIGludGVyZmFjZS4KKyAqIElmIGEgbWVzc2FnZSBvbWl0cyB0aGUgaW50ZXJmYWNlLCB0aGVuIGl0IHdpbGwgTk9UIG1hdGNoCisgKiBpZiB0aGUgcnVsZSBzcGVjaWZpZXMgYW4gaW50ZXJmYWNlIG5hbWUuIFRoaXMgbWVhbnMgbWF0Y2gKKyAqIHJ1bGVzIG9uIG1ldGhvZCBjYWxscyBzaG91bGQgbm90IHVzdWFsbHkgZ2l2ZSBhbiBpbnRlcmZhY2UuCisgKgorICogSG93ZXZlciwgc2lnbmFsIG1lc3NhZ2VzIGFyZSByZXF1aXJlZCB0byBpbmNsdWRlIHRoZSBpbnRlcmZhY2UKKyAqIHNvIHdoZW4gbWF0Y2hpbmcgc2lnbmFscyB1c3VhbGx5IHlvdSBzaG91bGQgc3BlY2lmeSB0aGUgaW50ZXJmYWNlCisgKiBpbiB0aGUgbWF0Y2ggcnVsZS4KKyAqIAorICogRm9yIHNlY3VyaXR5IHJlYXNvbnMsIHlvdSBjYW4gbWF0Y2ggYXJndW1lbnRzIG9ubHkgdXAgdG8KKyAqICNEQlVTX01BWElNVU1fTUFUQ0hfUlVMRV9BUkdfTlVNQkVSLgorICoKKyAqIE1hdGNoIHJ1bGVzIGhhdmUgYSBtYXhpbXVtIGxlbmd0aCBvZiAjREJVU19NQVhJTVVNX01BVENIX1JVTEVfTEVOR1RICisgKiBieXRlcy4KKyAqCisgKiBCb3RoIG9mIHRoZXNlIG1heGltdW1zIGFyZSBtdWNoIGhpZ2hlciB0aGFuIHlvdSdyZSBsaWtlbHkgdG8gbmVlZCwKKyAqIHRoZXkgb25seSBleGlzdCBiZWNhdXNlIHRoZSBELUJ1cyBidXMgZGFlbW9uIGhhcyBmaXhlZCBsaW1pdHMgb24KKyAqIGFsbCByZXNvdXJjZSB1c2FnZS4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiBjb25uZWN0aW9uIHRvIHRoZSBtZXNzYWdlIGJ1cworICogQHBhcmFtIHJ1bGUgdGV4dHVhbCBmb3JtIG9mIG1hdGNoIHJ1bGUKKyAqIEBwYXJhbSBlcnJvciBsb2NhdGlvbiB0byBzdG9yZSBhbnkgZXJyb3JzCisgKi8KK3ZvaWQKK2RidXNfYnVzX2FkZF9tYXRjaCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpydWxlLAorICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIERCdXNNZXNzYWdlICptc2c7CisKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKHJ1bGUgIT0gTlVMTCk7CisKKyAgbXNnID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoREJVU19TRVJWSUNFX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfUEFUSF9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0lOVEVSRkFDRV9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWRkTWF0Y2giKTsKKworICBpZiAobXNnID09IE5VTEwpCisgICAgeworICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAoIWRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAobXNnLCBEQlVTX1RZUEVfU1RSSU5HLCAmcnVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1zZyk7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm47CisgICAgfQorCisgIHNlbmRfbm9fcmV0dXJuX3ZhbHVlcyAoY29ubmVjdGlvbiwgbXNnLCBlcnJvcik7CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtc2cpOworfQorCisvKioKKyAqIFJlbW92ZXMgYSBwcmV2aW91c2x5LWFkZGVkIG1hdGNoIHJ1bGUgImJ5IHZhbHVlIiAodGhlIG1vc3QKKyAqIHJlY2VudGx5LWFkZGVkIGlkZW50aWNhbCBydWxlIGdldHMgcmVtb3ZlZCkuICBUaGUgInJ1bGUiIGFyZ3VtZW50CisgKiBpcyB0aGUgc3RyaW5nIGZvcm0gb2YgYSBtYXRjaCBydWxlLgorICoKKyAqIFRoZSBidXMgY29tcGFyZXMgbWF0Y2ggcnVsZXMgc2VtYW50aWNhbGx5LCBub3QgdGV4dHVhbGx5LCBzbworICogd2hpdGVzcGFjZSBhbmQgb3JkZXJpbmcgZG9uJ3QgaGF2ZSB0byBiZSBpZGVudGljYWwgdG8KKyAqIHRoZSBydWxlIHlvdSBwYXNzZWQgdG8gZGJ1c19idXNfYWRkX21hdGNoKCkuCisgKiAKKyAqIElmIHlvdSBwYXNzICNOVUxMIGZvciB0aGUgZXJyb3IsIHRoaXMgZnVuY3Rpb24gd2lsbCBub3QKKyAqIGJsb2NrOyBvdGhlcndpc2UgaXQgd2lsbC4gU2VlIGRldGFpbGVkIGV4cGxhbmF0aW9uIGluCisgKiBkb2NzIGZvciBkYnVzX2J1c19hZGRfbWF0Y2goKS4KKyAqIAorICogQHBhcmFtIGNvbm5lY3Rpb24gY29ubmVjdGlvbiB0byB0aGUgbWVzc2FnZSBidXMKKyAqIEBwYXJhbSBydWxlIHRleHR1YWwgZm9ybSBvZiBtYXRjaCBydWxlCisgKiBAcGFyYW0gZXJyb3IgbG9jYXRpb24gdG8gc3RvcmUgYW55IGVycm9ycworICovCit2b2lkCitkYnVzX2J1c19yZW1vdmVfbWF0Y2ggKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqcnVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBEQnVzTWVzc2FnZSAqbXNnOworCisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChydWxlICE9IE5VTEwpOworICAKKyAgbXNnID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoREJVU19TRVJWSUNFX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfUEFUSF9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0lOVEVSRkFDRV9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVtb3ZlTWF0Y2giKTsKKworICBpZiAoIWRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAobXNnLCBEQlVTX1RZUEVfU1RSSU5HLCAmcnVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1zZyk7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm47CisgICAgfQorCisgIHNlbmRfbm9fcmV0dXJuX3ZhbHVlcyAoY29ubmVjdGlvbiwgbXNnLCBlcnJvcik7CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtc2cpOworfQorCisvKiogQH0gKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1idXMuaCBiL2RidXMvZGJ1cy1idXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmE5NTcxCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLWJ1cy5oCkBAIC0wLDAgKzEsOTUgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1idXMuaCAgQ29udmVuaWVuY2UgZnVuY3Rpb25zIGZvciBjb21tdW5pY2F0aW5nIHdpdGggdGhlIGJ1cy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgIENvZGVGYWN0b3J5IEFCCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaWYgIWRlZmluZWQgKERCVVNfSU5TSURFX0RCVVNfSCkgJiYgIWRlZmluZWQgKERCVVNfQ09NUElMQVRJT04pCisjZXJyb3IgIk9ubHkgPGRidXMvZGJ1cy5oPiBjYW4gYmUgaW5jbHVkZWQgZGlyZWN0bHksIHRoaXMgZmlsZSBtYXkgZGlzYXBwZWFyIG9yIGNoYW5nZSBjb250ZW50cy4iCisjZW5kaWYKKworI2lmbmRlZiBEQlVTX0JVU19ICisjZGVmaW5lIERCVVNfQlVTX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy1jb25uZWN0aW9uLmg+CisKK0RCVVNfQkVHSU5fREVDTFMKKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzQnVzCisgKiBAeworICovCisKK0RCVVNfRVhQT1JUCitEQnVzQ29ubmVjdGlvbiAqZGJ1c19idXNfZ2V0ICAgICAgICAgICAgICAoREJ1c0J1c1R5cGUgICAgIHR5cGUsCisJCQkJCSAgIERCdXNFcnJvciAgICAgICplcnJvcik7CitEQlVTX0VYUE9SVAorREJ1c0Nvbm5lY3Rpb24gKmRidXNfYnVzX2dldF9wcml2YXRlICAgICAgKERCdXNCdXNUeXBlICAgICB0eXBlLAorCQkJCQkgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpOworCitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgICAgIGRidXNfYnVzX3JlZ2lzdGVyICAgICAgICAgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorCQkJCQkgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90ICAgICBkYnVzX2J1c19zZXRfdW5pcXVlX25hbWUgIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCQkJICAgY29uc3QgY2hhciAgICAgKnVuaXF1ZV9uYW1lKTsKK0RCVVNfRVhQT1JUCitjb25zdCBjaGFyKiAgICAgZGJ1c19idXNfZ2V0X3VuaXF1ZV9uYW1lICAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOworREJVU19FWFBPUlQKK3Vuc2lnbmVkIGxvbmcgICBkYnVzX2J1c19nZXRfdW5peF91c2VyICAgIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCSAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpOworREJVU19FWFBPUlQKK2NoYXIqICAgICAgICAgICBkYnVzX2J1c19nZXRfaWQgICAgICAgICAgIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpOworREJVU19FWFBPUlQKK2ludCAgICAgICAgICAgICBkYnVzX2J1c19yZXF1ZXN0X25hbWUgICAgIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCQkJICAgY29uc3QgY2hhciAgICAgKm5hbWUsCisJCQkJCSAgIHVuc2lnbmVkIGludCAgICBmbGFncywKKwkJCQkJICAgREJ1c0Vycm9yICAgICAgKmVycm9yKTsKK0RCVVNfRVhQT1JUCitpbnQgICAgICAgICAgICAgZGJ1c19idXNfcmVsZWFzZV9uYW1lICAgICAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkJCSAgIGNvbnN0IGNoYXIgICAgICpuYW1lLAorCQkJCQkgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90ICAgICBkYnVzX2J1c19uYW1lX2hhc19vd25lciAgIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCQkJICAgY29uc3QgY2hhciAgICAgKm5hbWUsCisJCQkJCSAgIERCdXNFcnJvciAgICAgICplcnJvcik7CisKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCAgICAgZGJ1c19idXNfc3RhcnRfc2VydmljZV9ieV9uYW1lIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgKnJlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKTsKKworREJVU19FWFBPUlQKK3ZvaWQgICAgICAgICAgICBkYnVzX2J1c19hZGRfbWF0Y2ggICAgICAgIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqcnVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpOworREJVU19FWFBPUlQKK3ZvaWQgICAgICAgICAgICBkYnVzX2J1c19yZW1vdmVfbWF0Y2ggICAgIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqcnVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpOworCisvKiogQH0gKi8KKworREJVU19FTkRfREVDTFMKKworI2VuZGlmIC8qIERCVVNfQlVTX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1jb25uZWN0aW9uLWludGVybmFsLmggYi9kYnVzL2RidXMtY29ubmVjdGlvbi1pbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4MzU3MzIKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtY29ubmVjdGlvbi1pbnRlcm5hbC5oCkBAIC0wLDAgKzEsMTU0IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtY29ubmVjdGlvbi1pbnRlcm5hbC5oIERCdXNDb25uZWN0aW9uIGludGVybmFsIGludGVyZmFjZXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgIFJlZCBIYXQgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworI2lmbmRlZiBEQlVTX0NPTk5FQ1RJT05fSU5URVJOQUxfSAorI2RlZmluZSBEQlVTX0NPTk5FQ1RJT05fSU5URVJOQUxfSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWludGVybmFscy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1jb25uZWN0aW9uLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLW1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXJlc291cmNlcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1saXN0Lmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXRpbWVvdXQuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtZGF0YXNsb3QuaD4KKworREJVU19CRUdJTl9ERUNMUworCit0eXBlZGVmIGVudW0KK3sKKyAgREJVU19JVEVSQVRJT05fRE9fV1JJVElORyA9IDEgPDwgMCwgLyoqPCBXcml0ZSBtZXNzYWdlcyBvdXQuICovCisgIERCVVNfSVRFUkFUSU9OX0RPX1JFQURJTkcgPSAxIDw8IDEsIC8qKjwgUmVhZCBtZXNzYWdlcyBpbi4gKi8KKyAgREJVU19JVEVSQVRJT05fQkxPQ0sgICAgICA9IDEgPDwgMiAgLyoqPCBCbG9jayBpZiBub3RoaW5nIHRvIGRvLiAqLworfSBEQnVzSXRlcmF0aW9uRmxhZ3M7CisKKy8qKiBkZWZhdWx0IHRpbWVvdXQgdmFsdWUgd2hlbiB3YWl0aW5nIGZvciBhIG1lc3NhZ2UgcmVwbHksIDI1IHNlY29uZHMgKi8KKyNkZWZpbmUgX0RCVVNfREVGQVVMVF9USU1FT1VUX1ZBTFVFICgyNSAqIDEwMDApCisKK3R5cGVkZWYgdm9pZCAoKiBEQnVzUGVuZGluZ0Zkc0NoYW5nZUZ1bmN0aW9uKSAodm9pZCAqZGF0YSk7CisKK0RCVVNfUFJJVkFURV9FWFBPUlQKK3ZvaWQgICAgICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fbG9jayAgICAgICAgICAgICAgICAgICAgICAgIChEQnVzQ29ubmVjdGlvbiAgICAgKmNvbm5lY3Rpb24pOworREJVU19QUklWQVRFX0VYUE9SVAordm9pZCAgICAgICAgICAgICAgX2RidXNfY29ubmVjdGlvbl91bmxvY2sgICAgICAgICAgICAgICAgICAgICAgKERCdXNDb25uZWN0aW9uICAgICAqY29ubmVjdGlvbik7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitEQnVzQ29ubmVjdGlvbiAqICBfZGJ1c19jb25uZWN0aW9uX3JlZl91bmxvY2tlZCAgICAgICAgICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICpjb25uZWN0aW9uKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK3ZvaWQgICAgICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fdW5yZWZfdW5sb2NrZWQgICAgICAgICAgICAgIChEQnVzQ29ubmVjdGlvbiAgICAgKmNvbm5lY3Rpb24pOwordm9pZCAgICAgICAgICAgICAgX2RidXNfY29ubmVjdGlvbl9xdWV1ZV9yZWNlaXZlZF9tZXNzYWdlX2xpbmsgKERCdXNDb25uZWN0aW9uICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAgICAgICAgICAgKmxpbmspOworZGJ1c19ib29sX3QgICAgICAgX2RidXNfY29ubmVjdGlvbl9oYXNfbWVzc2FnZXNfdG9fc2VuZF91bmxvY2tlZCAoREJ1c0Nvbm5lY3Rpb24gICAgICpjb25uZWN0aW9uKTsKK0RCdXNNZXNzYWdlKiAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fZ2V0X21lc3NhZ2VfdG9fc2VuZCAgICAgICAgIChEQnVzQ29ubmVjdGlvbiAgICAgKmNvbm5lY3Rpb24pOwordm9pZCAgICAgICAgICAgICAgX2RidXNfY29ubmVjdGlvbl9tZXNzYWdlX3NlbnRfdW5sb2NrZWQgICAgICAgKERCdXNDb25uZWN0aW9uICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgICAgKm1lc3NhZ2UpOworZGJ1c19ib29sX3QgICAgICAgX2RidXNfY29ubmVjdGlvbl9hZGRfd2F0Y2hfdW5sb2NrZWQgICAgICAgICAgKERCdXNDb25uZWN0aW9uICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzV2F0Y2ggICAgICAgICAgKndhdGNoKTsKK3ZvaWQgICAgICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fcmVtb3ZlX3dhdGNoX3VubG9ja2VkICAgICAgIChEQnVzQ29ubmVjdGlvbiAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1dhdGNoICAgICAgICAgICp3YXRjaCk7Cit2b2lkICAgICAgICAgICAgICBfZGJ1c19jb25uZWN0aW9uX3RvZ2dsZV93YXRjaF91bmxvY2tlZCAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNXYXRjaCAgICAgICAgICAqd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgICBlbmFibGVkKTsKK2RidXNfYm9vbF90ICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25faGFuZGxlX3dhdGNoICAgICAgICAgICAgICAgIChEQnVzV2F0Y2ggICAgICAgICAgKndhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgICAgICAgY29uZGl0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAqZGF0YSk7CitkYnVzX2Jvb2xfdCAgICAgICBfZGJ1c19jb25uZWN0aW9uX2FkZF90aW1lb3V0X3VubG9ja2VkICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUaW1lb3V0ICAgICAgICAqdGltZW91dCk7Cit2b2lkICAgICAgICAgICAgICBfZGJ1c19jb25uZWN0aW9uX3JlbW92ZV90aW1lb3V0X3VubG9ja2VkICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUaW1lb3V0ICAgICAgICAqdGltZW91dCk7Cit2b2lkICAgICAgICAgICAgICBfZGJ1c19jb25uZWN0aW9uX3RvZ2dsZV90aW1lb3V0X3VubG9ja2VkICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUaW1lb3V0ICAgICAgICAqdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICAgIGVuYWJsZWQpOworREJ1c0Nvbm5lY3Rpb24qICAgX2RidXNfY29ubmVjdGlvbl9uZXdfZm9yX3RyYW5zcG9ydCAgICAgICAgICAgKERCdXNUcmFuc3BvcnQgICAgICAqdHJhbnNwb3J0KTsKK3ZvaWQgICAgICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fZG9faXRlcmF0aW9uX3VubG9ja2VkICAgICAgIChEQnVzQ29ubmVjdGlvbiAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1BlbmRpbmdDYWxsICAgICpwZW5kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgICAgICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICB0aW1lb3V0X21pbGxpc2Vjb25kcyk7Cit2b2lkICAgICAgICAgICAgICBfZGJ1c19jb25uZWN0aW9uX2Nsb3NlX3Bvc3NpYmx5X3NoYXJlZCAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICpjb25uZWN0aW9uKTsKK3ZvaWQgICAgICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fY2xvc2VfaWZfb25seV9vbmVfcmVmICAgICAgIChEQnVzQ29ubmVjdGlvbiAgICAgKmNvbm5lY3Rpb24pOworCitEQnVzUGVuZGluZ0NhbGwqICBfZGJ1c19wZW5kaW5nX2NhbGxfbmV3ICAgICAgICAgICAgICAgICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgdGltZW91dF9taWxsaXNlY29uZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1RpbWVvdXRIYW5kbGVyICB0aW1lb3V0X2hhbmRsZXIpOwordm9pZCAgICAgICAgICAgICAgX2RidXNfcGVuZGluZ19jYWxsX25vdGlmeSAgICAgICAgICAgICAgICAgICAgKERCdXNQZW5kaW5nQ2FsbCAgICAqcGVuZGluZyk7Cit2b2lkICAgICAgICAgICAgICBfZGJ1c19jb25uZWN0aW9uX3JlbW92ZV9wZW5kaW5nX2NhbGwgICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNQZW5kaW5nQ2FsbCAgICAqcGVuZGluZyk7Cit2b2lkICAgICAgICAgICAgICBfZGJ1c19jb25uZWN0aW9uX2Jsb2NrX3BlbmRpbmdfY2FsbCAgICAgICAgICAoREJ1c1BlbmRpbmdDYWxsICAgICpwZW5kaW5nKTsKK3ZvaWQgICAgICAgICAgICAgIF9kYnVzX3BlbmRpbmdfY2FsbF9jb21wbGV0ZV9hbmRfdW5sb2NrICAgICAgIChEQnVzUGVuZGluZ0NhbGwgICAgKnBlbmRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICAgICptZXNzYWdlKTsKK2RidXNfYm9vbF90ICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fc2VuZF9hbmRfdW5sb2NrICAgICAgICAgICAgIChEQnVzQ29ubmVjdGlvbiAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgICAgICAqY2xpZW50X3NlcmlhbCk7CisKK3ZvaWQgICAgICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fcXVldWVfc3ludGhlc2l6ZWRfbWVzc2FnZV9saW5rIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCQkJCSAgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAqbGluayk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCit2b2lkICAgICAgICAgICAgICBfZGJ1c19jb25uZWN0aW9uX3Rlc3RfZ2V0X2xvY2tzICAgICAgICAgICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gKmNvbm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c011dGV4ICoqbXV0ZXhfbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNdXRleCAqKmRpc3BhdGNoX211dGV4X2xvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTXV0ZXggKippb19wYXRoX211dGV4X2xvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29uZFZhciAqKmRpc3BhdGNoX2NvbmRfbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25kVmFyICoqaW9fcGF0aF9jb25kX2xvYyk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitpbnQgICAgICAgICAgICAgICBfZGJ1c19jb25uZWN0aW9uX2dldF9wZW5kaW5nX2Zkc19jb3VudCAgICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOworREJVU19QUklWQVRFX0VYUE9SVAordm9pZCAgICAgICAgICAgICAgX2RidXNfY29ubmVjdGlvbl9zZXRfcGVuZGluZ19mZHNfZnVuY3Rpb24gICAgICAgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNQZW5kaW5nRmRzQ2hhbmdlRnVuY3Rpb24gY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSk7CisKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90ICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fZ2V0X2xpbnV4X3NlY3VyaXR5X2xhYmVsICAgICAgIChEQnVzQ29ubmVjdGlvbiAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAgICAgKipsYWJlbF9wKTsKKworLyogaWYgREJVU19FTkFCTEVfU1RBVFMgKi8KK0RCVVNfUFJJVkFURV9FWFBPUlQKK3ZvaWQgX2RidXNfY29ubmVjdGlvbl9nZXRfc3RhdHMgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgKmluX21lc3NhZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgKmluX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgKmluX2ZkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgICppbl9wZWFrX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgKmluX3BlYWtfZmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgKm91dF9tZXNzYWdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgICpvdXRfYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90ICAqb3V0X2ZkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgICpvdXRfcGVha19ieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgICpvdXRfcGVha19mZHMpOworCisKKy8qIGlmIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTICovCitjb25zdCBjaGFyKiBfZGJ1c19jb25uZWN0aW9uX2dldF9hZGRyZXNzIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbik7CisKKy8qIFRoaXMgX2RidXNfYnVzXyogc3R1ZmYgZG9lc24ndCByZWFsbHkgYmVsb25nIGhlcmUsIGJ1dCBkYnVzLWJ1cy1pbnRlcm5hbC5oIHNlZW1zCisgKiBzaWxseSBmb3Igb25lIGZ1bmN0aW9uCisgKi8KKy8qKgorICogQGFkZHRvZ3JvdXAgREJ1c0J1c0ludGVybmFscworICogQHsKKyAqLworCit2b2lkICAgICAgICAgICBfZGJ1c19idXNfbm90aWZ5X3NoYXJlZF9jb25uZWN0aW9uX2Rpc2Nvbm5lY3RlZF91bmxvY2tlZCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOworCisvKiogQH0gKi8KKworCitEQlVTX0VORF9ERUNMUworCisjZW5kaWYgLyogREJVU19DT05ORUNUSU9OX0lOVEVSTkFMX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1jb25uZWN0aW9uLmMgYi9kYnVzL2RidXMtY29ubmVjdGlvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1MjViNmQKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtY29ubmVjdGlvbi5jCkBAIC0wLDAgKzEsNjM4MCBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLWNvbm5lY3Rpb24uYyBEQnVzQ29ubmVjdGlvbiBvYmplY3QKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNiAgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLXNoYXJlZC5oIgorI2luY2x1ZGUgImRidXMtY29ubmVjdGlvbi5oIgorI2luY2x1ZGUgImRidXMtbGlzdC5oIgorI2luY2x1ZGUgImRidXMtdGltZW91dC5oIgorI2luY2x1ZGUgImRidXMtdHJhbnNwb3J0LmgiCisjaW5jbHVkZSAiZGJ1cy13YXRjaC5oIgorI2luY2x1ZGUgImRidXMtY29ubmVjdGlvbi1pbnRlcm5hbC5oIgorI2luY2x1ZGUgImRidXMtcGVuZGluZy1jYWxsLWludGVybmFsLmgiCisjaW5jbHVkZSAiZGJ1cy1saXN0LmgiCisjaW5jbHVkZSAiZGJ1cy1oYXNoLmgiCisjaW5jbHVkZSAiZGJ1cy1tZXNzYWdlLWludGVybmFsLmgiCisjaW5jbHVkZSAiZGJ1cy1tZXNzYWdlLXByaXZhdGUuaCIKKyNpbmNsdWRlICJkYnVzLXRocmVhZHMuaCIKKyNpbmNsdWRlICJkYnVzLXByb3RvY29sLmgiCisjaW5jbHVkZSAiZGJ1cy1kYXRhc2xvdC5oIgorI2luY2x1ZGUgImRidXMtc3RyaW5nLmgiCisjaW5jbHVkZSAiZGJ1cy1zaWduYXR1cmUuaCIKKyNpbmNsdWRlICJkYnVzLXBlbmRpbmctY2FsbC5oIgorI2luY2x1ZGUgImRidXMtb2JqZWN0LXRyZWUuaCIKKyNpbmNsdWRlICJkYnVzLXRocmVhZHMtaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJkYnVzLWJ1cy5oIgorI2luY2x1ZGUgImRidXMtbWFyc2hhbC1iYXNpYy5oIgorCisjaWZkZWYgREJVU19ESVNBQkxFX0NIRUNLUworI2RlZmluZSBUT09LX0xPQ0tfQ0hFQ0soY29ubmVjdGlvbikKKyNkZWZpbmUgUkVMRUFTSU5HX0xPQ0tfQ0hFQ0soY29ubmVjdGlvbikKKyNkZWZpbmUgSEFWRV9MT0NLX0NIRUNLKGNvbm5lY3Rpb24pCisjZWxzZQorI2RlZmluZSBUT09LX0xPQ0tfQ0hFQ0soY29ubmVjdGlvbikgZG8geyAgICAgICAgICAgICAgICBcCisgICAgX2RidXNfYXNzZXJ0ICghKGNvbm5lY3Rpb24pLT5oYXZlX2Nvbm5lY3Rpb25fbG9jayk7IFwKKyAgICAoY29ubmVjdGlvbiktPmhhdmVfY29ubmVjdGlvbl9sb2NrID0gVFJVRTsgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorI2RlZmluZSBSRUxFQVNJTkdfTE9DS19DSEVDSyhjb25uZWN0aW9uKSBkbyB7ICAgICAgICAgICAgXAorICAgIF9kYnVzX2Fzc2VydCAoKGNvbm5lY3Rpb24pLT5oYXZlX2Nvbm5lY3Rpb25fbG9jayk7ICAgXAorICAgIChjb25uZWN0aW9uKS0+aGF2ZV9jb25uZWN0aW9uX2xvY2sgPSBGQUxTRTsgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorI2RlZmluZSBIQVZFX0xPQ0tfQ0hFQ0soY29ubmVjdGlvbikgICAgICAgIF9kYnVzX2Fzc2VydCAoKGNvbm5lY3Rpb24pLT5oYXZlX2Nvbm5lY3Rpb25fbG9jaykKKy8qIEEgIkRPX05PVF9IQVZFX0xPQ0tfQ0hFQ0siIGlzIGltcG9zc2libGUgc2luY2Ugd2UgbmVlZCB0aGUgbG9jayB0byBjaGVjayB0aGUgZmxhZyAqLworI2VuZGlmCisKKyNkZWZpbmUgVFJBQ0VfTE9DS1MgMQorCisjZGVmaW5lIENPTk5FQ1RJT05fTE9DSyhjb25uZWN0aW9uKSAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoVFJBQ0VfTE9DS1MpIHsgX2RidXNfdmVyYm9zZSAoIkxPQ0tcbiIpOyB9ICAgXAorICAgIF9kYnVzX3JtdXRleF9sb2NrICgoY29ubmVjdGlvbiktPm11dGV4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVE9PS19MT0NLX0NIRUNLIChjb25uZWN0aW9uKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBDT05ORUNUSU9OX1VOTE9DSyhjb25uZWN0aW9uKSBfZGJ1c19jb25uZWN0aW9uX3VubG9jayAoY29ubmVjdGlvbikKKworI2RlZmluZSBTTE9UU19MT0NLKGNvbm5lY3Rpb24pIGRvIHsgICAgICAgICAgICAgICAgICAgICBcCisgICAgX2RidXNfcm11dGV4X2xvY2sgKChjb25uZWN0aW9uKS0+c2xvdF9tdXRleCk7ICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBTTE9UU19VTkxPQ0soY29ubmVjdGlvbikgZG8geyAgICAgICAgICAgICAgICAgICBcCisgICAgX2RidXNfcm11dGV4X3VubG9jayAoKGNvbm5lY3Rpb24pLT5zbG90X211dGV4KTsgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBESVNQQVRDSF9TVEFUVVNfTkFNRShzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgKChzKSA9PSBEQlVTX0RJU1BBVENIX0NPTVBMRVRFID8gImNvbXBsZXRlIiA6ICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIChzKSA9PSBEQlVTX0RJU1BBVENIX0RBVEFfUkVNQUlOUyA/ICJkYXRhIHJlbWFpbnMiIDogXAorICAgICAgICAgICAgICAgICAgICAgIChzKSA9PSBEQlVTX0RJU1BBVENIX05FRURfTUVNT1JZID8gIm5lZWQgbWVtb3J5IiA6ICAgXAorICAgICAgICAgICAgICAgICAgICAgICI/Pz8iKQorCisvKioKKyAqIEBkZWZncm91cCBEQnVzQ29ubmVjdGlvbiBEQnVzQ29ubmVjdGlvbgorICogQGluZ3JvdXAgIERCdXMKKyAqIEBicmllZiBDb25uZWN0aW9uIHRvIGFub3RoZXIgYXBwbGljYXRpb24KKyAqCisgKiBBIERCdXNDb25uZWN0aW9uIHJlcHJlc2VudHMgYSBjb25uZWN0aW9uIHRvIGFub3RoZXIKKyAqIGFwcGxpY2F0aW9uLiBNZXNzYWdlcyBjYW4gYmUgc2VudCBhbmQgcmVjZWl2ZWQgdmlhIHRoaXMgY29ubmVjdGlvbi4KKyAqIFRoZSBvdGhlciBhcHBsaWNhdGlvbiBtYXkgYmUgYSBtZXNzYWdlIGJ1czsgZm9yIGNvbnZlbmllbmNlLCB0aGUKKyAqIGZ1bmN0aW9uIGRidXNfYnVzX2dldCgpIGlzIHByb3ZpZGVkIHRvIGF1dG9tYXRpY2FsbHkgb3BlbiBhCisgKiBjb25uZWN0aW9uIHRvIHRoZSB3ZWxsLWtub3duIG1lc3NhZ2UgYnVzZXMuCisgKiAKKyAqIEluIGJyaWVmIGEgREJ1c0Nvbm5lY3Rpb24gaXMgYSBtZXNzYWdlIHF1ZXVlIGFzc29jaWF0ZWQgd2l0aCBzb21lCisgKiBtZXNzYWdlIHRyYW5zcG9ydCBtZWNoYW5pc20gc3VjaCBhcyBhIHNvY2tldC4gIFRoZSBjb25uZWN0aW9uCisgKiBtYWludGFpbnMgYSBxdWV1ZSBvZiBpbmNvbWluZyBtZXNzYWdlcyBhbmQgYSBxdWV1ZSBvZiBvdXRnb2luZworICogbWVzc2FnZXMuCisgKgorICogU2V2ZXJhbCBmdW5jdGlvbnMgdXNlIHRoZSBmb2xsb3dpbmcgdGVybXM6CisgKiA8dWw+CisgKiA8bGk+PGI+cmVhZDwvYj4gbWVhbnMgdG8gZmlsbCB0aGUgaW5jb21pbmcgbWVzc2FnZSBxdWV1ZSBieSByZWFkaW5nIGZyb20gdGhlIHNvY2tldDwvbGk+CisgKiA8bGk+PGI+d3JpdGU8L2I+IG1lYW5zIHRvIGRyYWluIHRoZSBvdXRnb2luZyBxdWV1ZSBieSB3cml0aW5nIHRvIHRoZSBzb2NrZXQ8L2xpPgorICogPGxpPjxiPmRpc3BhdGNoPC9iPiBtZWFucyB0byBkcmFpbiB0aGUgaW5jb21pbmcgcXVldWUgYnkgaW52b2tpbmcgYXBwbGljYXRpb24tcHJvdmlkZWQgbWVzc2FnZSBoYW5kbGVyczwvbGk+CisgKiA8L3VsPgorICoKKyAqIFRoZSBmdW5jdGlvbiBkYnVzX2Nvbm5lY3Rpb25fcmVhZF93cml0ZV9kaXNwYXRjaCgpIGZvciBleGFtcGxlIGRvZXMgYWxsCisgKiB0aHJlZSBvZiB0aGVzZSB0aGluZ3MsIG9mZmVyaW5nIGEgc2ltcGxlIGFsdGVybmF0aXZlIHRvIGEgbWFpbiBsb29wLgorICoKKyAqIEluIGFuIGFwcGxpY2F0aW9uIHdpdGggYSBtYWluIGxvb3AsIHRoZSByZWFkL3dyaXRlL2Rpc3BhdGNoCisgKiBvcGVyYXRpb25zIGFyZSB1c3VhbGx5IHNlcGFyYXRlLgorICoKKyAqIFRoZSBjb25uZWN0aW9uIHByb3ZpZGVzICNEQnVzV2F0Y2ggYW5kICNEQnVzVGltZW91dCBvYmplY3RzIHRvCisgKiB0aGUgbWFpbiBsb29wLiBUaGVzZSBhcmUgdXNlZCB0byBrbm93IHdoZW4gcmVhZGluZywgd3JpdGluZywgb3IKKyAqIGRpc3BhdGNoaW5nIHNob3VsZCBiZSBwZXJmb3JtZWQuCisgKiAKKyAqIEluY29taW5nIG1lc3NhZ2VzIGFyZSBwcm9jZXNzZWQKKyAqIGJ5IGNhbGxpbmcgZGJ1c19jb25uZWN0aW9uX2Rpc3BhdGNoKCkuIGRidXNfY29ubmVjdGlvbl9kaXNwYXRjaCgpCisgKiBydW5zIGFueSBoYW5kbGVycyByZWdpc3RlcmVkIGZvciB0aGUgdG9wbW9zdCBtZXNzYWdlIGluIHRoZSBtZXNzYWdlCisgKiBxdWV1ZSwgdGhlbiBkaXNjYXJkcyB0aGUgbWVzc2FnZSwgdGhlbiByZXR1cm5zLgorICogCisgKiBkYnVzX2Nvbm5lY3Rpb25fZ2V0X2Rpc3BhdGNoX3N0YXR1cygpIGluZGljYXRlcyB3aGV0aGVyCisgKiBtZXNzYWdlcyBhcmUgY3VycmVudGx5IGluIHRoZSBxdWV1ZSB0aGF0IG5lZWQgZGlzcGF0Y2hpbmcuCisgKiBkYnVzX2Nvbm5lY3Rpb25fc2V0X2Rpc3BhdGNoX3N0YXR1c19mdW5jdGlvbigpIGFsbG93cworICogeW91IHRvIHNldCBhIGZ1bmN0aW9uIHRvIGJlIHVzZWQgdG8gbW9uaXRvciB0aGUgZGlzcGF0Y2ggc3RhdHVzLgorICogCisgKiBJZiB5b3UncmUgdXNpbmcgR0xpYiBvciBRdCBhZGQtb24gbGlicmFyaWVzIGZvciBELUJ1cywgdGhlcmUgYXJlCisgKiBzcGVjaWFsIGNvbnZlbmllbmNlIEFQSXMgaW4gdGhvc2UgbGlicmFyaWVzIHRoYXQgaGlkZQorICogYWxsIHRoZSBkZXRhaWxzIG9mIGRpc3BhdGNoIGFuZCB3YXRjaC90aW1lb3V0IG1vbml0b3JpbmcuCisgKiBGb3IgZXhhbXBsZSwgZGJ1c19jb25uZWN0aW9uX3NldHVwX3dpdGhfZ19tYWluKCkuCisgKgorICogSWYgeW91IGFyZW4ndCB1c2luZyB0aGVzZSBhZGQtb24gbGlicmFyaWVzLCBidXQgd2FudCB0byBwcm9jZXNzCisgKiBtZXNzYWdlcyBhc3luY2hyb25vdXNseSwgeW91IG11c3QgbWFudWFsbHkgY2FsbAorICogZGJ1c19jb25uZWN0aW9uX3NldF9kaXNwYXRjaF9zdGF0dXNfZnVuY3Rpb24oKSwKKyAqIGRidXNfY29ubmVjdGlvbl9zZXRfd2F0Y2hfZnVuY3Rpb25zKCksCisgKiBkYnVzX2Nvbm5lY3Rpb25fc2V0X3RpbWVvdXRfZnVuY3Rpb25zKCkgcHJvdmlkaW5nIGFwcHJvcHJpYXRlCisgKiBmdW5jdGlvbnMgdG8gaW50ZWdyYXRlIHRoZSBjb25uZWN0aW9uIHdpdGggeW91ciBhcHBsaWNhdGlvbidzIG1haW4KKyAqIGxvb3AuIFRoaXMgY2FuIGJlIHRyaWNreSB0byBnZXQgcmlnaHQ7IG1haW4gbG9vcHMgYXJlIG5vdCBzaW1wbGUuCisgKgorICogSWYgeW91IGRvbid0IG5lZWQgdG8gYmUgYXN5bmNocm9ub3VzLCB5b3UgY2FuIGlnbm9yZSAjREJ1c1dhdGNoLAorICogI0RCdXNUaW1lb3V0LCBhbmQgZGJ1c19jb25uZWN0aW9uX2Rpc3BhdGNoKCkuICBJbnN0ZWFkLAorICogZGJ1c19jb25uZWN0aW9uX3JlYWRfd3JpdGVfZGlzcGF0Y2goKSBjYW4gYmUgdXNlZC4KKyAqCisgKiBPciwgaW4gPGVtPnZlcnk8L2VtPiBzaW1wbGUgYXBwbGljYXRpb25zLAorICogZGJ1c19jb25uZWN0aW9uX3BvcF9tZXNzYWdlKCkgbWF5IGJlIGFsbCB5b3UgbmVlZCwgYWxsb3dpbmcgeW91IHRvCisgKiBhdm9pZCBzZXR0aW5nIHVwIGFueSBoYW5kbGVyIGZ1bmN0aW9ucyAoc2VlCisgKiBkYnVzX2Nvbm5lY3Rpb25fYWRkX2ZpbHRlcigpLAorICogZGJ1c19jb25uZWN0aW9uX3JlZ2lzdGVyX29iamVjdF9wYXRoKCkgZm9yIG1vcmUgb24gaGFuZGxlcnMpLgorICogCisgKiBXaGVuIHlvdSB1c2UgZGJ1c19jb25uZWN0aW9uX3NlbmQoKSBvciBvbmUgb2YgaXRzIHZhcmlhbnRzIHRvIHNlbmQKKyAqIGEgbWVzc2FnZSwgdGhlIG1lc3NhZ2UgaXMgYWRkZWQgdG8gdGhlIG91dGdvaW5nIHF1ZXVlLiAgSXQncworICogYWN0dWFsbHkgd3JpdHRlbiB0byB0aGUgbmV0d29yayBsYXRlcjsgZWl0aGVyIGluCisgKiBkYnVzX3dhdGNoX2hhbmRsZSgpIGludm9rZWQgYnkgeW91ciBtYWluIGxvb3AsIG9yIGluCisgKiBkYnVzX2Nvbm5lY3Rpb25fZmx1c2goKSB3aGljaCBibG9ja3MgdW50aWwgaXQgY2FuIHdyaXRlIG91dCB0aGUKKyAqIGVudGlyZSBvdXRnb2luZyBxdWV1ZS4gVGhlIEdMaWIvUXQgYWRkLW9uIGxpYnJhcmllcyBhZ2FpbgorICogaGFuZGxlIHRoZSBkZXRhaWxzIGhlcmUgZm9yIHlvdSBieSBzZXR0aW5nIHVwIHdhdGNoIGZ1bmN0aW9ucy4KKyAqCisgKiBXaGVuIGEgY29ubmVjdGlvbiBpcyBkaXNjb25uZWN0ZWQsIHlvdSBhcmUgZ3VhcmFudGVlZCB0byBnZXQgYQorICogc2lnbmFsICJEaXNjb25uZWN0ZWQiIGZyb20gdGhlIGludGVyZmFjZQorICogI0RCVVNfSU5URVJGQUNFX0xPQ0FMLCBwYXRoCisgKiAjREJVU19QQVRIX0xPQ0FMLgorICoKKyAqIFlvdSBtYXkgbm90IGRyb3AgdGhlIGxhc3QgcmVmZXJlbmNlIHRvIGEgI0RCdXNDb25uZWN0aW9uCisgKiB1bnRpbCB0aGF0IGNvbm5lY3Rpb24gaGFzIGJlZW4gZGlzY29ubmVjdGVkLgorICoKKyAqIFlvdSBtYXkgZGlzcGF0Y2ggdGhlIHVucHJvY2Vzc2VkIGluY29taW5nIG1lc3NhZ2UgcXVldWUgZXZlbiBpZiB0aGUKKyAqIGNvbm5lY3Rpb24gaXMgZGlzY29ubmVjdGVkLiBIb3dldmVyLCAiRGlzY29ubmVjdGVkIiB3aWxsIGFsd2F5cyBiZQorICogdGhlIGxhc3QgbWVzc2FnZSBpbiB0aGUgcXVldWUgKG9idmlvdXNseSBubyBtZXNzYWdlcyBhcmUgcmVjZWl2ZWQKKyAqIGFmdGVyIGRpc2Nvbm5lY3Rpb24pLgorICoKKyAqIEFmdGVyIGNhbGxpbmcgZGJ1c190aHJlYWRzX2luaXQoKSwgI0RCdXNDb25uZWN0aW9uIGhhcyB0aHJlYWQKKyAqIGxvY2tzIGFuZCBkcm9wcyB0aGVtIHdoZW4gaW52b2tpbmcgdXNlciBjYWxsYmFja3MsIHNvIGluIGdlbmVyYWwgaXMKKyAqIHRyYW5zcGFyZW50bHkgdGhyZWFkc2FmZS4gSG93ZXZlciwgI0RCdXNNZXNzYWdlIGRvZXMgTk9UIGhhdmUKKyAqIHRocmVhZCBsb2NrczsgeW91IG11c3Qgbm90IHNlbmQgdGhlIHNhbWUgbWVzc2FnZSB0byBtdWx0aXBsZQorICogI0RCdXNDb25uZWN0aW9uIGlmIHRob3NlIGNvbm5lY3Rpb25zIHdpbGwgYmUgdXNlZCBmcm9tIGRpZmZlcmVudCB0aHJlYWRzLAorICogZm9yIGV4YW1wbGUuCisgKgorICogQWxzbywgaWYgeW91IGRpc3BhdGNoIG9yIHBvcCBtZXNzYWdlcyBmcm9tIG11bHRpcGxlIHRocmVhZHMsIGl0CisgKiBtYXkgd29yayBpbiB0aGUgc2Vuc2UgdGhhdCBpdCB3b24ndCBjcmFzaCwgYnV0IGl0J3MgdG91Z2ggdG8gaW1hZ2luZQorICogc2FuZSByZXN1bHRzOyBpdCB3aWxsIGJlIGNvbXBsZXRlbHkgdW5wcmVkaWN0YWJsZSB3aGljaCBtZXNzYWdlcworICogZ28gdG8gd2hpY2ggdGhyZWFkcy4KKyAqCisgKiBJdCdzIHJlY29tbWVuZGVkIHRvIGRpc3BhdGNoIGZyb20gYSBzaW5nbGUgdGhyZWFkLgorICoKKyAqIFRoZSBtb3N0IHVzZWZ1bCBmdW5jdGlvbiB0byBjYWxsIGZyb20gbXVsdGlwbGUgdGhyZWFkcyBhdCBvbmNlCisgKiBpcyBkYnVzX2Nvbm5lY3Rpb25fc2VuZF93aXRoX3JlcGx5X2FuZF9ibG9jaygpLiBUaGF0IGlzLAorICogbXVsdGlwbGUgdGhyZWFkcyBjYW4gbWFrZSBtZXRob2QgY2FsbHMgYXQgdGhlIHNhbWUgdGltZS4KKyAqCisgKiBJZiB5b3UgYXJlbid0IHVzaW5nIHRocmVhZHMsIHlvdSBjYW4gdXNlIGEgbWFpbiBsb29wIGFuZAorICogZGJ1c19wZW5kaW5nX2NhbGxfc2V0X25vdGlmeSgpIHRvIGFjaGlldmUgYSBzaW1pbGFyIHJlc3VsdC4KKyAqLworCisvKioKKyAqIEBkZWZncm91cCBEQnVzQ29ubmVjdGlvbkludGVybmFscyBEQnVzQ29ubmVjdGlvbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzCisgKiBAaW5ncm91cCAgREJ1c0ludGVybmFscworICogQGJyaWVmIEltcGxlbWVudGF0aW9uIGRldGFpbHMgb2YgREJ1c0Nvbm5lY3Rpb24KKyAqCisgKiBAeworICovCisKK3N0YXRpYyB2b2lkCitfZGJ1c19jb25uZWN0aW9uX3RyYWNlX3JlZiAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgaW50IG9sZF9yZWZjb3VudCwKKyAgICBpbnQgbmV3X3JlZmNvdW50LAorICAgIGNvbnN0IGNoYXIgKndoeSkKK3sKKyNpZmRlZiBEQlVTX0VOQUJMRV9WRVJCT1NFX01PREUKKyAgc3RhdGljIGludCBlbmFibGVkID0gLTE7CisKKyAgX2RidXNfdHJhY2VfcmVmICgiREJ1c0Nvbm5lY3Rpb24iLCBjb25uZWN0aW9uLCBvbGRfcmVmY291bnQsIG5ld19yZWZjb3VudCwKKyAgICAgIHdoeSwgIkRCVVNfQ09OTkVDVElPTl9UUkFDRSIsICZlbmFibGVkKTsKKyNlbmRpZgorfQorCisvKioKKyAqIEludGVybmFsIHN0cnVjdCByZXByZXNlbnRpbmcgYSBtZXNzYWdlIGZpbHRlciBmdW5jdGlvbiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgREJ1c01lc3NhZ2VGaWx0ZXIgREJ1c01lc3NhZ2VGaWx0ZXI7CisKKy8qKgorICogSW50ZXJuYWwgc3RydWN0IHJlcHJlc2VudGluZyBhIG1lc3NhZ2UgZmlsdGVyIGZ1bmN0aW9uIAorICovCitzdHJ1Y3QgREJ1c01lc3NhZ2VGaWx0ZXIKK3sKKyAgREJ1c0F0b21pYyByZWZjb3VudDsgLyoqPCBSZWZlcmVuY2UgY291bnQgKi8KKyAgREJ1c0hhbmRsZU1lc3NhZ2VGdW5jdGlvbiBmdW5jdGlvbjsgLyoqPCBGdW5jdGlvbiB0byBjYWxsIHRvIGZpbHRlciAqLworICB2b2lkICp1c2VyX2RhdGE7IC8qKjwgVXNlciBkYXRhIGZvciB0aGUgZnVuY3Rpb24gKi8KKyAgREJ1c0ZyZWVGdW5jdGlvbiBmcmVlX3VzZXJfZGF0YV9mdW5jdGlvbjsgLyoqPCBGdW5jdGlvbiB0byBmcmVlIHRoZSB1c2VyIGRhdGEgKi8KK307CisKKworLyoqCisgKiBJbnRlcm5hbHMgb2YgREJ1c1ByZWFsbG9jYXRlZFNlbmQKKyAqLworc3RydWN0IERCdXNQcmVhbGxvY2F0ZWRTZW5kCit7CisgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uOyAvKio8IENvbm5lY3Rpb24gd2UnZCBzZW5kIHRoZSBtZXNzYWdlIHRvICovCisgIERCdXNMaXN0ICpxdWV1ZV9saW5rOyAgICAgICAvKio8IFByZWFsbG9jYXRlZCBsaW5rIGluIHRoZSBxdWV1ZSAqLworICBEQnVzTGlzdCAqY291bnRlcl9saW5rOyAgICAgLyoqPCBQcmVhbGxvY2F0ZWQgbGluayBpbiB0aGUgcmVzb3VyY2UgY291bnRlciAqLworfTsKKworI2lmIEhBVkVfREVDTF9NU0dfTk9TSUdOQUwKK3N0YXRpYyBkYnVzX2Jvb2xfdCBfZGJ1c19tb2RpZnlfc2lncGlwZSA9IEZBTFNFOworI2Vsc2UKK3N0YXRpYyBkYnVzX2Jvb2xfdCBfZGJ1c19tb2RpZnlfc2lncGlwZSA9IFRSVUU7CisjZW5kaWYKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBkZXRhaWxzIG9mIERCdXNDb25uZWN0aW9uLiBBbGwgZmllbGRzIGFyZSBwcml2YXRlLgorICovCitzdHJ1Y3QgREJ1c0Nvbm5lY3Rpb24KK3sKKyAgREJ1c0F0b21pYyByZWZjb3VudDsgLyoqPCBSZWZlcmVuY2UgY291bnQuICovCisKKyAgREJ1c1JNdXRleCAqbXV0ZXg7IC8qKjwgTG9jayBvbiB0aGUgZW50aXJlIERCdXNDb25uZWN0aW9uICovCisKKyAgREJ1c0NNdXRleCAqZGlzcGF0Y2hfbXV0ZXg7ICAgICAvKio8IFByb3RlY3RzIGRpc3BhdGNoX2FjcXVpcmVkICovCisgIERCdXNDb25kVmFyICpkaXNwYXRjaF9jb25kOyAgICAvKio8IE5vdGlmeSB3aGVuIGRpc3BhdGNoX2FjcXVpcmVkIGlzIGF2YWlsYWJsZSAqLworICBEQnVzQ011dGV4ICppb19wYXRoX211dGV4OyAgICAgIC8qKjwgUHJvdGVjdHMgaW9fcGF0aF9hY3F1aXJlZCAqLworICBEQnVzQ29uZFZhciAqaW9fcGF0aF9jb25kOyAgICAgLyoqPCBOb3RpZnkgd2hlbiBpb19wYXRoX2FjcXVpcmVkIGlzIGF2YWlsYWJsZSAqLworICAKKyAgREJ1c0xpc3QgKm91dGdvaW5nX21lc3NhZ2VzOyAvKio8IFF1ZXVlIG9mIG1lc3NhZ2VzIHdlIG5lZWQgdG8gc2VuZCwgc2VuZCB0aGUgZW5kIG9mIHRoZSBsaXN0IGZpcnN0LiAqLworICBEQnVzTGlzdCAqaW5jb21pbmdfbWVzc2FnZXM7IC8qKjwgUXVldWUgb2YgbWVzc2FnZXMgd2UgaGF2ZSByZWNlaXZlZCwgZW5kIG9mIHRoZSBsaXN0IHJlY2VpdmVkIG1vc3QgcmVjZW50bHkuICovCisgIERCdXNMaXN0ICpleHBpcmVkX21lc3NhZ2VzOyAgLyoqPCBNZXNzYWdlcyB0aGF0IHdpbGwgYmUgcmVsZWFzZWQgd2hlbiB3ZSBuZXh0IHVubG9jay4gKi8KKworICBEQnVzTWVzc2FnZSAqbWVzc2FnZV9ib3Jyb3dlZDsgLyoqPCBGaWxsZWQgaW4gaWYgdGhlIGZpcnN0IGluY29taW5nIG1lc3NhZ2UgaGFzIGJlZW4gYm9ycm93ZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIGRpc3BhdGNoX2FjcXVpcmVkIHdpbGwgYmUgc2V0IGJ5IHRoZSBib3Jyb3dlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIAorICBpbnQgbl9vdXRnb2luZzsgICAgICAgICAgICAgIC8qKjwgTGVuZ3RoIG9mIG91dGdvaW5nIHF1ZXVlLiAqLworICBpbnQgbl9pbmNvbWluZzsgICAgICAgICAgICAgIC8qKjwgTGVuZ3RoIG9mIGluY29taW5nIHF1ZXVlLiAqLworCisgIERCdXNDb3VudGVyICpvdXRnb2luZ19jb3VudGVyOyAvKio8IENvdW50cyBzaXplIG9mIG91dGdvaW5nIG1lc3NhZ2VzLiAqLworICAKKyAgREJ1c1RyYW5zcG9ydCAqdHJhbnNwb3J0OyAgICAvKio8IE9iamVjdCB0aGF0IHNlbmRzL3JlY2VpdmVzIG1lc3NhZ2VzIG92ZXIgbmV0d29yay4gKi8KKyAgREJ1c1dhdGNoTGlzdCAqd2F0Y2hlczsgICAgICAvKio8IFN0b3JlcyBhY3RpdmUgd2F0Y2hlcy4gKi8KKyAgREJ1c1RpbWVvdXRMaXN0ICp0aW1lb3V0czsgICAvKio8IFN0b3JlcyBhY3RpdmUgdGltZW91dHMuICovCisgIAorICBEQnVzTGlzdCAqZmlsdGVyX2xpc3Q7ICAgICAgICAvKio8IExpc3Qgb2YgZmlsdGVycy4gKi8KKworICBEQnVzUk11dGV4ICpzbG90X211dGV4OyAgICAgICAgLyoqPCBMb2NrIG9uIHNsb3RfbGlzdCBzbyBvdmVyYWxsIGNvbm5lY3Rpb24gbG9jayBuZWVkIG5vdCBiZSB0YWtlbiAqLworICBEQnVzRGF0YVNsb3RMaXN0IHNsb3RfbGlzdDsgICAvKio8IERhdGEgc3RvcmVkIGJ5IGFsbG9jYXRlZCBpbnRlZ2VyIElEICovCisKKyAgREJ1c0hhc2hUYWJsZSAqcGVuZGluZ19yZXBsaWVzOyAgLyoqPCBIYXNoIG9mIG1lc3NhZ2Ugc2VyaWFscyB0byAjREJ1c1BlbmRpbmdDYWxsLiAqLyAgCisgIAorICBkYnVzX3VpbnQzMl90IGNsaWVudF9zZXJpYWw7ICAgICAgIC8qKjwgQ2xpZW50IHNlcmlhbC4gSW5jcmVtZW50cyBlYWNoIHRpbWUgYSBtZXNzYWdlIGlzIHNlbnQgICovCisgIERCdXNMaXN0ICpkaXNjb25uZWN0X21lc3NhZ2VfbGluazsgLyoqPCBQcmVhbGxvY2F0ZWQgbGlzdCBub2RlIGZvciBxdWV1ZWluZyB0aGUgZGlzY29ubmVjdGlvbiBtZXNzYWdlICovCisKKyAgREJ1c1dha2V1cE1haW5GdW5jdGlvbiB3YWtldXBfbWFpbl9mdW5jdGlvbjsgLyoqPCBGdW5jdGlvbiB0byB3YWtlIHVwIHRoZSBtYWlubG9vcCAgKi8KKyAgdm9pZCAqd2FrZXVwX21haW5fZGF0YTsgLyoqPCBBcHBsaWNhdGlvbiBkYXRhIGZvciB3YWtldXBfbWFpbl9mdW5jdGlvbiAqLworICBEQnVzRnJlZUZ1bmN0aW9uIGZyZWVfd2FrZXVwX21haW5fZGF0YTsgLyoqPCBmcmVlIHdha2V1cF9tYWluX2RhdGEgKi8KKworICBEQnVzRGlzcGF0Y2hTdGF0dXNGdW5jdGlvbiBkaXNwYXRjaF9zdGF0dXNfZnVuY3Rpb247IC8qKjwgRnVuY3Rpb24gb24gZGlzcGF0Y2ggc3RhdHVzIGNoYW5nZXMgICovCisgIHZvaWQgKmRpc3BhdGNoX3N0YXR1c19kYXRhOyAvKio8IEFwcGxpY2F0aW9uIGRhdGEgZm9yIGRpc3BhdGNoX3N0YXR1c19mdW5jdGlvbiAqLworICBEQnVzRnJlZUZ1bmN0aW9uIGZyZWVfZGlzcGF0Y2hfc3RhdHVzX2RhdGE7IC8qKjwgZnJlZSBkaXNwYXRjaF9zdGF0dXNfZGF0YSAqLworCisgIERCdXNEaXNwYXRjaFN0YXR1cyBsYXN0X2Rpc3BhdGNoX3N0YXR1czsgLyoqPCBUaGUgbGFzdCBkaXNwYXRjaCBzdGF0dXMgd2UgcmVwb3J0ZWQgdG8gdGhlIGFwcGxpY2F0aW9uLiAqLworCisgIERCdXNPYmplY3RUcmVlICpvYmplY3RzOyAvKio8IE9iamVjdCBwYXRoIGhhbmRsZXJzIHJlZ2lzdGVyZWQgd2l0aCB0aGlzIGNvbm5lY3Rpb24gKi8KKworICBjaGFyICpzZXJ2ZXJfZ3VpZDsgLyoqPCBHVUlEIG9mIHNlcnZlciBpZiB3ZSBhcmUgaW4gc2hhcmVkX2Nvbm5lY3Rpb25zLCAjTlVMTCBpZiBzZXJ2ZXIgR1VJRCBpcyB1bmtub3duIG9yIGNvbm5lY3Rpb24gaXMgcHJpdmF0ZSAqLworCisgIC8qIFRoZXNlIHR3byBNVVNUIGJlIGJvb2xzIGFuZCBub3QgYml0ZmllbGRzLCBiZWNhdXNlIHRoZXkgYXJlIHByb3RlY3RlZCBieSBhIHNlcGFyYXRlIGxvY2sKKyAgICogZnJvbSBjb25uZWN0aW9uLT5tdXRleCBhbmQgYWxsIGJpdGZpZWxkcyBpbiBhIHdvcmQgaGF2ZSB0byBiZSByZWFkL3dyaXR0ZW4gdG9nZXRoZXIuCisgICAqIFNvIHlvdSBjYW4ndCBoYXZlIGEgZGlmZmVyZW50IGxvY2sgZm9yIGRpZmZlcmVudCBiaXRmaWVsZHMgaW4gdGhlIHNhbWUgd29yZC4KKyAgICovCisgIGRidXNfYm9vbF90IGRpc3BhdGNoX2FjcXVpcmVkOyAvKio8IFNvbWVvbmUgaGFzIGRpc3BhdGNoIHBhdGggKGNhbiBkcmFpbiBpbmNvbWluZyBxdWV1ZSkgKi8KKyAgZGJ1c19ib29sX3QgaW9fcGF0aF9hY3F1aXJlZDsgIC8qKjwgU29tZW9uZSBoYXMgdHJhbnNwb3J0IGlvIHBhdGggKGNhbiB1c2UgdGhlIHRyYW5zcG9ydCB0byByZWFkL3dyaXRlIG1lc3NhZ2VzKSAqLworICAKKyAgdW5zaWduZWQgaW50IHNoYXJlYWJsZSA6IDE7IC8qKjwgI1RSVUUgaWYgbGliZGJ1cyBvd25zIGEgcmVmZXJlbmNlIHRvIHRoZSBjb25uZWN0aW9uIGFuZCBjYW4gcmV0dXJuIGl0IGZyb20gZGJ1c19jb25uZWN0aW9uX29wZW4oKSBtb3JlIHRoYW4gb25jZSAqLworICAKKyAgdW5zaWduZWQgaW50IGV4aXRfb25fZGlzY29ubmVjdCA6IDE7IC8qKjwgSWYgI1RSVUUsIGV4aXQgYWZ0ZXIgaGFuZGxpbmcgZGlzY29ubmVjdCBzaWduYWwgKi8KKworICB1bnNpZ25lZCBpbnQgcm91dGVfcGVlcl9tZXNzYWdlcyA6IDE7IC8qKjwgSWYgI1RSVUUsIGlmIG9yZy5mcmVlZGVza3RvcC5EQnVzLlBlZXIgbWVzc2FnZXMgaGF2ZSBhIGJ1cyBuYW1lLCBkb24ndCBoYW5kbGUgdGhlbSBhdXRvbWF0aWNhbGx5ICovCisKKyAgdW5zaWduZWQgaW50IGRpc2Nvbm5lY3RlZF9tZXNzYWdlX2Fycml2ZWQgOiAxOyAgIC8qKjwgV2UgcG9wcGVkIG9yIGFyZSBkaXNwYXRjaGluZyB0aGUgZGlzY29ubmVjdGVkIG1lc3NhZ2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBpZiB0aGUgZGlzY29ubmVjdF9tZXNzYWdlX2xpbmsgaXMgTlVMTCB0aGVuIHdlIHF1ZXVlZCBpdCwgYnV0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB0aGlzIGZsYWcgaXMgd2hldGhlciBpdCBnb3QgdG8gdGhlIGhlYWQgb2YgdGhlIHF1ZXVlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHVuc2lnbmVkIGludCBkaXNjb25uZWN0ZWRfbWVzc2FnZV9wcm9jZXNzZWQgOiAxOyAvKio8IFdlIGRpZCBvdXIgZGVmYXVsdCBoYW5kbGluZyBvZiB0aGUgZGlzY29ubmVjdGVkIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzdWNoIGFzIGNsb3NpbmcgdGhlIGNvbm5lY3Rpb24uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgCisjaWZuZGVmIERCVVNfRElTQUJMRV9DSEVDS1MKKyAgdW5zaWduZWQgaW50IGhhdmVfY29ubmVjdGlvbl9sb2NrIDogMTsgLyoqPCBVc2VkIHRvIGNoZWNrIGxvY2tpbmcgKi8KKyNlbmRpZgorCisjaWYgZGVmaW5lZChEQlVTX0VOQUJMRV9DSEVDS1MpIHx8IGRlZmluZWQoREJVU19FTkFCTEVfQVNTRVJUKQorICBpbnQgZ2VuZXJhdGlvbjsgLyoqPCBfZGJ1c19jdXJyZW50X2dlbmVyYXRpb24gdGhhdCBzaG91bGQgY29ycmVzcG9uZCB0byB0aGlzIGNvbm5lY3Rpb24gKi8KKyNlbmRpZiAKK307CisKK3N0YXRpYyBEQnVzRGlzcGF0Y2hTdGF0dXMgX2RidXNfY29ubmVjdGlvbl9nZXRfZGlzcGF0Y2hfc3RhdHVzX3VubG9ja2VkICAgICAgKERCdXNDb25uZWN0aW9uICAgICAqY29ubmVjdGlvbik7CitzdGF0aWMgdm9pZCAgICAgICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fdXBkYXRlX2Rpc3BhdGNoX3N0YXR1c19hbmRfdW5sb2NrIChEQnVzQ29ubmVjdGlvbiAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRGlzcGF0Y2hTdGF0dXMgIG5ld19zdGF0dXMpOworc3RhdGljIHZvaWQgICAgICAgICAgICAgICBfZGJ1c19jb25uZWN0aW9uX2xhc3RfdW5yZWYgICAgICAgICAgICAgICAgICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICpjb25uZWN0aW9uKTsKK3N0YXRpYyB2b2lkICAgICAgICAgICAgICAgX2RidXNfY29ubmVjdGlvbl9hY3F1aXJlX2Rpc3BhdGNoICAgICAgICAgICAgICAgICAgKERCdXNDb25uZWN0aW9uICAgICAqY29ubmVjdGlvbik7CitzdGF0aWMgdm9pZCAgICAgICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fcmVsZWFzZV9kaXNwYXRjaCAgICAgICAgICAgICAgICAgIChEQnVzQ29ubmVjdGlvbiAgICAgKmNvbm5lY3Rpb24pOworc3RhdGljIERCdXNEaXNwYXRjaFN0YXR1cyBfZGJ1c19jb25uZWN0aW9uX2ZsdXNoX3VubG9ja2VkICAgICAgICAgICAgICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICpjb25uZWN0aW9uKTsKK3N0YXRpYyB2b2lkICAgICAgICAgICAgICAgX2RidXNfY29ubmVjdGlvbl9jbG9zZV9wb3NzaWJseV9zaGFyZWRfYW5kX3VubG9jayAgKERCdXNDb25uZWN0aW9uICAgICAqY29ubmVjdGlvbik7CitzdGF0aWMgZGJ1c19ib29sX3QgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Nvbm5lY3RlZF91bmxvY2tlZCAgICAgICAgIChEQnVzQ29ubmVjdGlvbiAgICAgKmNvbm5lY3Rpb24pOworc3RhdGljIGRidXNfYm9vbF90ICAgICAgICBfZGJ1c19jb25uZWN0aW9uX3BlZWtfZm9yX3JlcGx5X3VubG9ja2VkICAgICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgICAgICBjbGllbnRfc2VyaWFsKTsKKworc3RhdGljIERCdXNNZXNzYWdlRmlsdGVyICoKK19kYnVzX21lc3NhZ2VfZmlsdGVyX3JlZiAoREJ1c01lc3NhZ2VGaWx0ZXIgKmZpbHRlcikKK3sKKyNpZmRlZiBEQlVTX0RJU0FCTEVfQVNTRVJUCisgIF9kYnVzX2F0b21pY19pbmMgKCZmaWx0ZXItPnJlZmNvdW50KTsKKyNlbHNlCisgIGRidXNfaW50MzJfdCBvbGRfdmFsdWU7CisKKyAgb2xkX3ZhbHVlID0gX2RidXNfYXRvbWljX2luYyAoJmZpbHRlci0+cmVmY291bnQpOworICBfZGJ1c19hc3NlcnQgKG9sZF92YWx1ZSA+IDApOworI2VuZGlmCisKKyAgcmV0dXJuIGZpbHRlcjsKK30KKworc3RhdGljIHZvaWQKK19kYnVzX21lc3NhZ2VfZmlsdGVyX3VucmVmIChEQnVzTWVzc2FnZUZpbHRlciAqZmlsdGVyKQoreworICBkYnVzX2ludDMyX3Qgb2xkX3ZhbHVlOworCisgIG9sZF92YWx1ZSA9IF9kYnVzX2F0b21pY19kZWMgKCZmaWx0ZXItPnJlZmNvdW50KTsKKyAgX2RidXNfYXNzZXJ0IChvbGRfdmFsdWUgPiAwKTsKKworICBpZiAob2xkX3ZhbHVlID09IDEpCisgICAgeworICAgICAgaWYgKGZpbHRlci0+ZnJlZV91c2VyX2RhdGFfZnVuY3Rpb24pCisgICAgICAgICgqIGZpbHRlci0+ZnJlZV91c2VyX2RhdGFfZnVuY3Rpb24pIChmaWx0ZXItPnVzZXJfZGF0YSk7CisgICAgICAKKyAgICAgIGRidXNfZnJlZSAoZmlsdGVyKTsKKyAgICB9Cit9CisKKy8qKgorICogQWNxdWlyZXMgdGhlIGNvbm5lY3Rpb24gbG9jay4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbi4KKyAqLwordm9pZAorX2RidXNfY29ubmVjdGlvbl9sb2NrIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKK30KKworLyoqCisgKiBSZWxlYXNlcyB0aGUgY29ubmVjdGlvbiBsb2NrLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uLgorICovCit2b2lkCitfZGJ1c19jb25uZWN0aW9uX3VubG9jayAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIERCdXNMaXN0ICpleHBpcmVkX21lc3NhZ2VzOworICBEQnVzTGlzdCAqaXRlcjsKKworICBpZiAoVFJBQ0VfTE9DS1MpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIlVOTE9DS1xuIik7CisgICAgfQorCisgIC8qIElmIHdlIGhhZCBtZXNzYWdlcyB0aGF0IGV4cGlyZWQgKGZlbGwgb2ZmIHRoZSBpbmNvbWluZyBvciBvdXRnb2luZworICAgKiBxdWV1ZXMpIHdoaWxlIHdlIHdlcmUgbG9ja2VkLCBhY3R1YWxseSByZWxlYXNlIHRoZW0gbm93ICovCisgIGV4cGlyZWRfbWVzc2FnZXMgPSBjb25uZWN0aW9uLT5leHBpcmVkX21lc3NhZ2VzOworICBjb25uZWN0aW9uLT5leHBpcmVkX21lc3NhZ2VzID0gTlVMTDsKKworICBSRUxFQVNJTkdfTE9DS19DSEVDSyAoY29ubmVjdGlvbik7CisgIF9kYnVzX3JtdXRleF91bmxvY2sgKGNvbm5lY3Rpb24tPm11dGV4KTsKKworICBmb3IgKGl0ZXIgPSBfZGJ1c19saXN0X3BvcF9maXJzdF9saW5rICgmZXhwaXJlZF9tZXNzYWdlcyk7CisgICAgICBpdGVyICE9IE5VTEw7CisgICAgICBpdGVyID0gX2RidXNfbGlzdF9wb3BfZmlyc3RfbGluayAoJmV4cGlyZWRfbWVzc2FnZXMpKQorICAgIHsKKyAgICAgIERCdXNNZXNzYWdlICptZXNzYWdlID0gaXRlci0+ZGF0YTsKKworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIF9kYnVzX2xpc3RfZnJlZV9saW5rIChpdGVyKTsKKyAgICB9Cit9CisKKy8qKgorICogV2FrZXMgdXAgdGhlIG1haW4gbG9vcCBpZiBpdCBpcyBzbGVlcGluZworICogTmVlZGVkIGlmIHdlJ3JlIGUuZy4gcXVldWVpbmcgb3V0Z29pbmcgbWVzc2FnZXMKKyAqIG9uIGEgdGhyZWFkIHdoaWxlIHRoZSBtYWlubG9vcCBzbGVlcHMuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24uCisgKi8KK3N0YXRpYyB2b2lkCitfZGJ1c19jb25uZWN0aW9uX3dha2V1cF9tYWlubG9vcCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIGlmIChjb25uZWN0aW9uLT53YWtldXBfbWFpbl9mdW5jdGlvbikKKyAgICAoKmNvbm5lY3Rpb24tPndha2V1cF9tYWluX2Z1bmN0aW9uKSAoY29ubmVjdGlvbi0+d2FrZXVwX21haW5fZGF0YSk7Cit9CisKKyNpZmRlZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworLyoqCisgKiBHZXRzIHRoZSBsb2NrcyBzbyB3ZSBjYW4gZXhhbWluZSB0aGVtCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24uCisgKiBAcGFyYW0gbXV0ZXhfbG9jIHJldHVybiBmb3IgdGhlIGxvY2F0aW9uIG9mIHRoZSBtYWluIG11dGV4IHBvaW50ZXIKKyAqIEBwYXJhbSBkaXNwYXRjaF9tdXRleF9sb2MgcmV0dXJuIGxvY2F0aW9uIG9mIHRoZSBkaXNwYXRjaCBtdXRleCBwb2ludGVyCisgKiBAcGFyYW0gaW9fcGF0aF9tdXRleF9sb2MgcmV0dXJuIGxvY2F0aW9uIG9mIHRoZSBpb19wYXRoIG11dGV4IHBvaW50ZXIKKyAqIEBwYXJhbSBkaXNwYXRjaF9jb25kX2xvYyByZXR1cm4gbG9jYXRpb24gb2YgdGhlIGRpc3BhdGNoIGNvbmRpdGlvbmFsIAorICogICAgICAgIHZhcmlhYmxlIHBvaW50ZXIKKyAqIEBwYXJhbSBpb19wYXRoX2NvbmRfbG9jIHJldHVybiBsb2NhdGlvbiBvZiB0aGUgaW9fcGF0aCBjb25kaXRpb25hbCAKKyAqICAgICAgICB2YXJpYWJsZSBwb2ludGVyCisgKi8gCit2b2lkIAorX2RidXNfY29ubmVjdGlvbl90ZXN0X2dldF9sb2NrcyAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTXV0ZXggICAgICoqbXV0ZXhfbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c011dGV4ICAgICAqKmRpc3BhdGNoX211dGV4X2xvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNdXRleCAgICAgKippb19wYXRoX211dGV4X2xvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25kVmFyICAgKipkaXNwYXRjaF9jb25kX2xvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25kVmFyICAgKippb19wYXRoX2NvbmRfbG9jKQoreworICAqbXV0ZXhfbG9jID0gKERCdXNNdXRleCAqKSBjb25uZWN0aW9uLT5tdXRleDsKKyAgKmRpc3BhdGNoX211dGV4X2xvYyA9IChEQnVzTXV0ZXggKikgY29ubmVjdGlvbi0+ZGlzcGF0Y2hfbXV0ZXg7CisgICppb19wYXRoX211dGV4X2xvYyA9IChEQnVzTXV0ZXggKikgY29ubmVjdGlvbi0+aW9fcGF0aF9tdXRleDsKKyAgKmRpc3BhdGNoX2NvbmRfbG9jID0gY29ubmVjdGlvbi0+ZGlzcGF0Y2hfY29uZDsKKyAgKmlvX3BhdGhfY29uZF9sb2MgPSBjb25uZWN0aW9uLT5pb19wYXRoX2NvbmQ7Cit9CisjZW5kaWYKKworLyoqCisgKiBBZGRzIGEgbWVzc2FnZS1jb250YWluaW5nIGxpc3QgbGluayB0byB0aGUgaW5jb21pbmcgbWVzc2FnZSBxdWV1ZSwKKyAqIHRha2luZyBvd25lcnNoaXAgb2YgdGhlIGxpbmsgYW5kIHRoZSBtZXNzYWdlJ3MgY3VycmVudCByZWZjb3VudC4KKyAqIENhbm5vdCBmYWlsIGR1ZSB0byBsYWNrIG9mIG1lbW9yeS4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbi4KKyAqIEBwYXJhbSBsaW5rIHRoZSBtZXNzYWdlIGxpbmsgdG8gcXVldWUuCisgKi8KK3ZvaWQKK19kYnVzX2Nvbm5lY3Rpb25fcXVldWVfcmVjZWl2ZWRfbWVzc2FnZV9saW5rIChEQnVzQ29ubmVjdGlvbiAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICAgICAgICpsaW5rKQoreworICBEQnVzUGVuZGluZ0NhbGwgKnBlbmRpbmc7CisgIGRidXNfdWludDMyX3QgcmVwbHlfc2VyaWFsOworICBEQnVzTWVzc2FnZSAqbWVzc2FnZTsKKworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3RyYW5zcG9ydF9wZWVrX2lzX2F1dGhlbnRpY2F0ZWQgKGNvbm5lY3Rpb24tPnRyYW5zcG9ydCkpOworCisgIF9kYnVzX2xpc3RfYXBwZW5kX2xpbmsgKCZjb25uZWN0aW9uLT5pbmNvbWluZ19tZXNzYWdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGluayk7CisgIG1lc3NhZ2UgPSBsaW5rLT5kYXRhOworCisgIC8qIElmIHRoaXMgaXMgYSByZXBseSB3ZSdyZSB3YWl0aW5nIG9uLCByZW1vdmUgdGltZW91dCBmb3IgaXQgKi8KKyAgcmVwbHlfc2VyaWFsID0gZGJ1c19tZXNzYWdlX2dldF9yZXBseV9zZXJpYWwgKG1lc3NhZ2UpOworICBpZiAocmVwbHlfc2VyaWFsICE9IDApCisgICAgeworICAgICAgcGVuZGluZyA9IF9kYnVzX2hhc2hfdGFibGVfbG9va3VwX2ludCAoY29ubmVjdGlvbi0+cGVuZGluZ19yZXBsaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHlfc2VyaWFsKTsKKyAgICAgIGlmIChwZW5kaW5nICE9IE5VTEwpCisJeworCSAgaWYgKF9kYnVzX3BlbmRpbmdfY2FsbF9pc190aW1lb3V0X2FkZGVkX3VubG9ja2VkIChwZW5kaW5nKSkKKyAgICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fcmVtb3ZlX3RpbWVvdXRfdW5sb2NrZWQgKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19wZW5kaW5nX2NhbGxfZ2V0X3RpbWVvdXRfdW5sb2NrZWQgKHBlbmRpbmcpKTsKKworCSAgX2RidXNfcGVuZGluZ19jYWxsX3NldF90aW1lb3V0X2FkZGVkX3VubG9ja2VkIChwZW5kaW5nLCBGQUxTRSk7CisJfQorICAgIH0KKyAgCisgIAorCisgIGNvbm5lY3Rpb24tPm5faW5jb21pbmcgKz0gMTsKKworICBfZGJ1c19jb25uZWN0aW9uX3dha2V1cF9tYWlubG9vcCAoY29ubmVjdGlvbik7CisgIAorICBfZGJ1c192ZXJib3NlICgiTWVzc2FnZSAlcCAoJXMgJXMgJXMgJXMgJyVzJyByZXBseSB0byAldSkgYWRkZWQgdG8gaW5jb21pbmcgcXVldWUgJXAsICVkIGluY29taW5nXG4iLAorICAgICAgICAgICAgICAgICBtZXNzYWdlLAorICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfdHlwZV90b19zdHJpbmcgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkpLAorICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3BhdGggKG1lc3NhZ2UpID8KKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9wYXRoIChtZXNzYWdlKSA6CisgICAgICAgICAgICAgICAgICJubyBwYXRoIiwKKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG1lc3NhZ2UpID8KKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG1lc3NhZ2UpIDoKKyAgICAgICAgICAgICAgICAgIm5vIGludGVyZmFjZSIsCisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKSA/CisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKSA6CisgICAgICAgICAgICAgICAgICJubyBtZW1iZXIiLAorICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3NpZ25hdHVyZSAobWVzc2FnZSksCisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfcmVwbHlfc2VyaWFsIChtZXNzYWdlKSwKKyAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi0+bl9pbmNvbWluZyk7CisKKyAgX2RidXNfbWVzc2FnZV90cmFjZV9yZWYgKG1lc3NhZ2UsIC0xLCAtMSwKKyAgICAgICJfZGJ1c19jb25lY3Rpb25fcXVldWVfcmVjZWl2ZWRfbWVzc2FnZV9saW5rIik7Cit9CisKKy8qKgorICogQWRkcyBhIGxpbmsgKyBtZXNzYWdlIHRvIHRoZSBpbmNvbWluZyBtZXNzYWdlIHF1ZXVlLgorICogQ2FuJ3QgZmFpbC4gVGFrZXMgb3duZXJzaGlwIG9mIGJvdGggbGluayBhbmQgbWVzc2FnZS4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbi4KKyAqIEBwYXJhbSBsaW5rIHRoZSBsaXN0IG5vZGUgYW5kIG1lc3NhZ2UgdG8gcXVldWUuCisgKgorICovCit2b2lkCitfZGJ1c19jb25uZWN0aW9uX3F1ZXVlX3N5bnRoZXNpemVkX21lc3NhZ2VfbGluayAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkJCQkgREJ1c0xpc3QgKmxpbmspCit7CisgIEhBVkVfTE9DS19DSEVDSyAoY29ubmVjdGlvbik7CisgIAorICBfZGJ1c19saXN0X2FwcGVuZF9saW5rICgmY29ubmVjdGlvbi0+aW5jb21pbmdfbWVzc2FnZXMsIGxpbmspOworCisgIGNvbm5lY3Rpb24tPm5faW5jb21pbmcgKz0gMTsKKworICBfZGJ1c19jb25uZWN0aW9uX3dha2V1cF9tYWlubG9vcCAoY29ubmVjdGlvbik7CisKKyAgX2RidXNfbWVzc2FnZV90cmFjZV9yZWYgKGxpbmstPmRhdGEsIC0xLCAtMSwKKyAgICAgICJfZGJ1c19jb25uZWN0aW9uX3F1ZXVlX3N5bnRoZXNpemVkX21lc3NhZ2VfbGluayIpOworCisgIF9kYnVzX3ZlcmJvc2UgKCJTeW50aGVzaXplZCBtZXNzYWdlICVwIGFkZGVkIHRvIGluY29taW5nIHF1ZXVlICVwLCAlZCBpbmNvbWluZ1xuIiwKKyAgICAgICAgICAgICAgICAgbGluay0+ZGF0YSwgY29ubmVjdGlvbiwgY29ubmVjdGlvbi0+bl9pbmNvbWluZyk7Cit9CisKKworLyoqCisgKiBDaGVja3Mgd2hldGhlciB0aGVyZSBhcmUgbWVzc2FnZXMgaW4gdGhlIG91dGdvaW5nIG1lc3NhZ2UgcXVldWUuCisgKiBDYWxsZWQgd2l0aCBjb25uZWN0aW9uIGxvY2sgaGVsZC4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbi4KKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSBvdXRnb2luZyBxdWV1ZSBpcyBub24tZW1wdHkuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19jb25uZWN0aW9uX2hhc19tZXNzYWdlc190b19zZW5kX3VubG9ja2VkIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgSEFWRV9MT0NLX0NIRUNLIChjb25uZWN0aW9uKTsKKyAgcmV0dXJuIGNvbm5lY3Rpb24tPm91dGdvaW5nX21lc3NhZ2VzICE9IE5VTEw7Cit9CisKKy8qKgorICogQ2hlY2tzIHdoZXRoZXIgdGhlcmUgYXJlIG1lc3NhZ2VzIGluIHRoZSBvdXRnb2luZyBtZXNzYWdlIHF1ZXVlLgorICogVXNlIGRidXNfY29ubmVjdGlvbl9mbHVzaCgpIHRvIGJsb2NrIHVudGlsIGFsbCBvdXRnb2luZworICogbWVzc2FnZXMgaGF2ZSBiZWVuIHdyaXR0ZW4gdG8gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0CisgKiAoc3VjaCBhcyBhIHNvY2tldCkuCisgKiAKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uLgorICogQHJldHVybnMgI1RSVUUgaWYgdGhlIG91dGdvaW5nIHF1ZXVlIGlzIG5vbi1lbXB0eS4KKyAqLworZGJ1c19ib29sX3QKK2RidXNfY29ubmVjdGlvbl9oYXNfbWVzc2FnZXNfdG9fc2VuZCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIGRidXNfYm9vbF90IHY7CisgIAorICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCwgRkFMU0UpOworCisgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisgIHYgPSBfZGJ1c19jb25uZWN0aW9uX2hhc19tZXNzYWdlc190b19zZW5kX3VubG9ja2VkIChjb25uZWN0aW9uKTsKKyAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworCisgIHJldHVybiB2OworfQorCisvKioKKyAqIEdldHMgdGhlIG5leHQgb3V0Z29pbmcgbWVzc2FnZS4gVGhlIG1lc3NhZ2UgcmVtYWlucyBpbiB0aGUKKyAqIHF1ZXVlLCBhbmQgdGhlIGNhbGxlciBkb2VzIG5vdCBvd24gYSByZWZlcmVuY2UgdG8gaXQuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24uCisgKiBAcmV0dXJucyB0aGUgbWVzc2FnZSB0byBiZSBzZW50LgorICovIAorREJ1c01lc3NhZ2UqCitfZGJ1c19jb25uZWN0aW9uX2dldF9tZXNzYWdlX3RvX3NlbmQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBIQVZFX0xPQ0tfQ0hFQ0sgKGNvbm5lY3Rpb24pOworICAKKyAgcmV0dXJuIF9kYnVzX2xpc3RfZ2V0X2xhc3QgKCZjb25uZWN0aW9uLT5vdXRnb2luZ19tZXNzYWdlcyk7Cit9CisKKy8qKgorICogTm90aWZpZXMgdGhlIGNvbm5lY3Rpb24gdGhhdCBhIG1lc3NhZ2UgaGFzIGJlZW4gc2VudCwgc28gdGhlCisgKiBtZXNzYWdlIGNhbiBiZSByZW1vdmVkIGZyb20gdGhlIG91dGdvaW5nIHF1ZXVlLgorICogQ2FsbGVkIHdpdGggdGhlIGNvbm5lY3Rpb24gbG9jayBoZWxkLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uLgorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgdGhhdCB3YXMgc2VudC4KKyAqLwordm9pZAorX2RidXNfY29ubmVjdGlvbl9tZXNzYWdlX3NlbnRfdW5sb2NrZWQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICptZXNzYWdlKQoreworICBEQnVzTGlzdCAqbGluazsKKworICBIQVZFX0xPQ0tfQ0hFQ0sgKGNvbm5lY3Rpb24pOworICAKKyAgLyogVGhpcyBjYW4gYmUgY2FsbGVkIGJlZm9yZSB3ZSBldmVuIGNvbXBsZXRlIGF1dGhlbnRpY2F0aW9uLCBzaW5jZQorICAgKiBpdCdzIGNhbGxlZCBvbiBkaXNjb25uZWN0IHRvIGNsZWFuIHVwIHRoZSBvdXRnb2luZyBxdWV1ZS4KKyAgICogSXQncyBhbHNvIGNhbGxlZCBhcyB3ZSBzdWNjZXNzZnVsbHkgc2VuZCBlYWNoIG1lc3NhZ2UuCisgICAqLworICAKKyAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2xhc3RfbGluayAoJmNvbm5lY3Rpb24tPm91dGdvaW5nX21lc3NhZ2VzKTsKKyAgX2RidXNfYXNzZXJ0IChsaW5rICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKGxpbmstPmRhdGEgPT0gbWVzc2FnZSk7CisKKyAgX2RidXNfbGlzdF91bmxpbmsgKCZjb25uZWN0aW9uLT5vdXRnb2luZ19tZXNzYWdlcywKKyAgICAgICAgICAgICAgICAgICAgIGxpbmspOworICBfZGJ1c19saXN0X3ByZXBlbmRfbGluayAoJmNvbm5lY3Rpb24tPmV4cGlyZWRfbWVzc2FnZXMsIGxpbmspOworCisgIGNvbm5lY3Rpb24tPm5fb3V0Z29pbmcgLT0gMTsKKworICBfZGJ1c192ZXJib3NlICgiTWVzc2FnZSAlcCAoJXMgJXMgJXMgJXMgJyVzJykgcmVtb3ZlZCBmcm9tIG91dGdvaW5nIHF1ZXVlICVwLCAlZCBsZWZ0IHRvIHNlbmRcbiIsCisgICAgICAgICAgICAgICAgIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV90eXBlX3RvX3N0cmluZyAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlKSksCisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfcGF0aCAobWVzc2FnZSkgPworICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3BhdGggKG1lc3NhZ2UpIDoKKyAgICAgICAgICAgICAgICAgIm5vIHBhdGgiLAorICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAobWVzc2FnZSkgPworICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAobWVzc2FnZSkgOgorICAgICAgICAgICAgICAgICAibm8gaW50ZXJmYWNlIiwKKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKG1lc3NhZ2UpID8KKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKG1lc3NhZ2UpIDoKKyAgICAgICAgICAgICAgICAgIm5vIG1lbWJlciIsCisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfc2lnbmF0dXJlIChtZXNzYWdlKSwKKyAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiwgY29ubmVjdGlvbi0+bl9vdXRnb2luZyk7CisKKyAgLyogSXQncyBPSyB0aGF0IGluIHByaW5jaXBsZSB3ZSBjYWxsIHRoZSBub3RpZnkgZnVuY3Rpb24sIGJlY2F1c2UgZm9yIHRoZQorICAgKiBvdXRnb2luZyBsaW1pdCwgdGhlcmUgaXNuJ3Qgb25lICovCisgIF9kYnVzX21lc3NhZ2VfcmVtb3ZlX2NvdW50ZXIgKG1lc3NhZ2UsIGNvbm5lY3Rpb24tPm91dGdvaW5nX2NvdW50ZXIpOworCisgIC8qIFRoZSBtZXNzYWdlIHdpbGwgYWN0dWFsbHkgYmUgdW5yZWZmZWQgd2hlbiB3ZSB1bmxvY2sgKi8KK30KKworLyoqIEZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBpbiBwcm90ZWN0ZWRfY2hhbmdlX3dhdGNoKCkgd2l0aCByZWZjb3VudCBoZWxkICovCit0eXBlZGVmIGRidXNfYm9vbF90ICgqIERCdXNXYXRjaEFkZEZ1bmN0aW9uKSAgICAgKERCdXNXYXRjaExpc3QgKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNXYXRjaCAgICAgKndhdGNoKTsKKy8qKiBGdW5jdGlvbiB0byBiZSBjYWxsZWQgaW4gcHJvdGVjdGVkX2NoYW5nZV93YXRjaCgpIHdpdGggcmVmY291bnQgaGVsZCAqLwordHlwZWRlZiB2b2lkICAgICAgICAoKiBEQnVzV2F0Y2hSZW1vdmVGdW5jdGlvbikgIChEQnVzV2F0Y2hMaXN0ICpsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzV2F0Y2ggICAgICp3YXRjaCk7CisvKiogRnVuY3Rpb24gdG8gYmUgY2FsbGVkIGluIHByb3RlY3RlZF9jaGFuZ2Vfd2F0Y2goKSB3aXRoIHJlZmNvdW50IGhlbGQgKi8KK3R5cGVkZWYgdm9pZCAgICAgICAgKCogREJ1c1dhdGNoVG9nZ2xlRnVuY3Rpb24pICAoREJ1c1dhdGNoTGlzdCAqbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1dhdGNoICAgICAqd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgIGVuYWJsZWQpOworCitzdGF0aWMgZGJ1c19ib29sX3QKK3Byb3RlY3RlZF9jaGFuZ2Vfd2F0Y2ggKERCdXNDb25uZWN0aW9uICAgICAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBEQnVzV2F0Y2ggICAgICAgICAgICAgICp3YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgIERCdXNXYXRjaEFkZEZ1bmN0aW9uICAgIGFkZF9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIERCdXNXYXRjaFJlbW92ZUZ1bmN0aW9uIHJlbW92ZV9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIERCdXNXYXRjaFRvZ2dsZUZ1bmN0aW9uIHRvZ2dsZV9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgICAgICAgIGVuYWJsZWQpCit7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKworICBIQVZFX0xPQ0tfQ0hFQ0sgKGNvbm5lY3Rpb24pOworCisgIC8qIFRoZSBvcmlnaW5hbCBwdXJwb3NlIG9mIHByb3RlY3RlZF9jaGFuZ2Vfd2F0Y2goKSB3YXMgdG8gaG9sZCBhCisgICAqIHJlZiBvbiB0aGUgY29ubmVjdGlvbiB3aGlsZSBkcm9wcGluZyB0aGUgY29ubmVjdGlvbiBsb2NrLCB0aGVuCisgICAqIGNhbGxpbmcgb3V0IHRvIHRoZSBhcHAuICBUaGlzIHdhcyBhIGJyb2tlbiBoYWNrIHRoYXQgZGlkIG5vdAorICAgKiB3b3JrLCBzaW5jZSB0aGUgY29ubmVjdGlvbiB3YXMgaW4gYSBob3NlZCBzdGF0ZSAobm8gV2F0Y2hMaXN0CisgICAqIGZpZWxkKSB3aGlsZSBjYWxsaW5nIG91dC4KKyAgICoKKyAgICogU28gZm9yIG5vdyB3ZSdsbCBqdXN0IGtlZXAgdGhlIGxvY2sgd2hpbGUgY2FsbGluZyBvdXQuIFRoaXMgbWVhbnMKKyAgICogYXBwcyBhcmUgbm90IGFsbG93ZWQgdG8gY2FsbCBEQnVzQ29ubmVjdGlvbiBtZXRob2RzIGluc2lkZSBhCisgICAqIHdhdGNoIGZ1bmN0aW9uIG9yIHRoZXkgd2lsbCBkZWFkbG9jay4KKyAgICoKKyAgICogVGhlICJyZWFsIGZpeCIgaXMgdG8gdXNlIHRoZSBfYW5kX3VubG9jaygpIHBhdHRlcm4gZm91bmQKKyAgICogZWxzZXdoZXJlIGluIHRoZSBjb2RlLCB0byBkZWZlciBjYWxsaW5nIG91dCB0byB0aGUgYXBwIHVudGlsCisgICAqIHdlJ3JlIGFib3V0IHRvIGRyb3AgbG9ja3MgYW5kIHJldHVybiBmbG93IG9mIGNvbnRyb2wgdG8gdGhlIGFwcAorICAgKiBhbnl3YXkuCisgICAqCisgICAqIFNlZSBodHRwOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL2FyY2hpdmVzL2RidXMvMjAwNy1KdWx5L3RocmVhZC5odG1sIzgxNDQKKyAgICovCisKKyAgaWYgKGNvbm5lY3Rpb24tPndhdGNoZXMpCisgICAgeworICAgICAgaWYgKGFkZF9mdW5jdGlvbikKKyAgICAgICAgcmV0dmFsID0gKCogYWRkX2Z1bmN0aW9uKSAoY29ubmVjdGlvbi0+d2F0Y2hlcywgd2F0Y2gpOworICAgICAgZWxzZSBpZiAocmVtb3ZlX2Z1bmN0aW9uKQorICAgICAgICB7CisgICAgICAgICAgcmV0dmFsID0gVFJVRTsKKyAgICAgICAgICAoKiByZW1vdmVfZnVuY3Rpb24pIChjb25uZWN0aW9uLT53YXRjaGVzLCB3YXRjaCk7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHJldHZhbCA9IFRSVUU7CisgICAgICAgICAgKCogdG9nZ2xlX2Z1bmN0aW9uKSAoY29ubmVjdGlvbi0+d2F0Y2hlcywgd2F0Y2gsIGVuYWJsZWQpOworICAgICAgICB9CisgICAgICByZXR1cm4gcmV0dmFsOworICAgIH0KKyAgZWxzZQorICAgIHJldHVybiBGQUxTRTsKK30KKyAgICAgCisKKy8qKgorICogQWRkcyBhIHdhdGNoIHVzaW5nIHRoZSBjb25uZWN0aW9uJ3MgREJ1c0FkZFdhdGNoRnVuY3Rpb24gaWYKKyAqIGF2YWlsYWJsZS4gT3RoZXJ3aXNlIHJlY29yZHMgdGhlIHdhdGNoIHRvIGJlIGFkZGVkIHdoZW4gc2FpZAorICogZnVuY3Rpb24gaXMgYXZhaWxhYmxlLiBBbHNvIHJlLWFkZHMgdGhlIHdhdGNoIGlmIHRoZQorICogREJ1c0FkZFdhdGNoRnVuY3Rpb24gY2hhbmdlcy4gTWF5IGZhaWwgZHVlIHRvIGxhY2sgb2YgbWVtb3J5LgorICogQ29ubmVjdGlvbiBsb2NrIHNob3VsZCBiZSBoZWxkIHdoZW4gY2FsbGluZyB0aGlzLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uLgorICogQHBhcmFtIHdhdGNoIHRoZSB3YXRjaCB0byBhZGQuCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzLgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfY29ubmVjdGlvbl9hZGRfd2F0Y2hfdW5sb2NrZWQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNXYXRjaCAgICAgICp3YXRjaCkKK3sKKyAgcmV0dXJuIHByb3RlY3RlZF9jaGFuZ2Vfd2F0Y2ggKGNvbm5lY3Rpb24sIHdhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfd2F0Y2hfbGlzdF9hZGRfd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBGQUxTRSk7Cit9CisKKy8qKgorICogUmVtb3ZlcyBhIHdhdGNoIHVzaW5nIHRoZSBjb25uZWN0aW9uJ3MgREJ1c1JlbW92ZVdhdGNoRnVuY3Rpb24KKyAqIGlmIGF2YWlsYWJsZS4gSXQncyBhbiBlcnJvciB0byBjYWxsIHRoaXMgZnVuY3Rpb24gb24gYSB3YXRjaAorICogdGhhdCB3YXMgbm90IHByZXZpb3VzbHkgYWRkZWQuCisgKiBDb25uZWN0aW9uIGxvY2sgc2hvdWxkIGJlIGhlbGQgd2hlbiBjYWxsaW5nIHRoaXMuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24uCisgKiBAcGFyYW0gd2F0Y2ggdGhlIHdhdGNoIHRvIHJlbW92ZS4KKyAqLwordm9pZAorX2RidXNfY29ubmVjdGlvbl9yZW1vdmVfd2F0Y2hfdW5sb2NrZWQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNXYXRjaCAgICAgICp3YXRjaCkKK3sKKyAgcHJvdGVjdGVkX2NoYW5nZV93YXRjaCAoY29ubmVjdGlvbiwgd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3dhdGNoX2xpc3RfcmVtb3ZlX3dhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBGQUxTRSk7Cit9CisKKy8qKgorICogVG9nZ2xlcyBhIHdhdGNoIGFuZCBub3RpZmllcyBhcHAgdmlhIGNvbm5lY3Rpb24ncworICogREJ1c1dhdGNoVG9nZ2xlZEZ1bmN0aW9uIGlmIGF2YWlsYWJsZS4gSXQncyBhbiBlcnJvciB0byBjYWxsIHRoaXMKKyAqIGZ1bmN0aW9uIG9uIGEgd2F0Y2ggdGhhdCB3YXMgbm90IHByZXZpb3VzbHkgYWRkZWQuCisgKiBDb25uZWN0aW9uIGxvY2sgc2hvdWxkIGJlIGhlbGQgd2hlbiBjYWxsaW5nIHRoaXMuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24uCisgKiBAcGFyYW0gd2F0Y2ggdGhlIHdhdGNoIHRvIHRvZ2dsZS4KKyAqIEBwYXJhbSBlbmFibGVkIHdoZXRoZXIgdG8gZW5hYmxlIG9yIGRpc2FibGUKKyAqLwordm9pZAorX2RidXNfY29ubmVjdGlvbl90b2dnbGVfd2F0Y2hfdW5sb2NrZWQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNXYXRjaCAgICAgICp3YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgZW5hYmxlZCkKK3sKKyAgX2RidXNfYXNzZXJ0ICh3YXRjaCAhPSBOVUxMKTsKKworICBwcm90ZWN0ZWRfY2hhbmdlX3dhdGNoIChjb25uZWN0aW9uLCB3YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfd2F0Y2hfbGlzdF90b2dnbGVfd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZWQpOworfQorCisvKiogRnVuY3Rpb24gdG8gYmUgY2FsbGVkIGluIHByb3RlY3RlZF9jaGFuZ2VfdGltZW91dCgpIHdpdGggcmVmY291bnQgaGVsZCAqLwordHlwZWRlZiBkYnVzX2Jvb2xfdCAoKiBEQnVzVGltZW91dEFkZEZ1bmN0aW9uKSAgICAoREJ1c1RpbWVvdXRMaXN0ICpsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1RpbWVvdXQgICAgICp0aW1lb3V0KTsKKy8qKiBGdW5jdGlvbiB0byBiZSBjYWxsZWQgaW4gcHJvdGVjdGVkX2NoYW5nZV90aW1lb3V0KCkgd2l0aCByZWZjb3VudCBoZWxkICovCit0eXBlZGVmIHZvaWQgICAgICAgICgqIERCdXNUaW1lb3V0UmVtb3ZlRnVuY3Rpb24pIChEQnVzVGltZW91dExpc3QgKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVGltZW91dCAgICAgKnRpbWVvdXQpOworLyoqIEZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBpbiBwcm90ZWN0ZWRfY2hhbmdlX3RpbWVvdXQoKSB3aXRoIHJlZmNvdW50IGhlbGQgKi8KK3R5cGVkZWYgdm9pZCAgICAgICAgKCogREJ1c1RpbWVvdXRUb2dnbGVGdW5jdGlvbikgKERCdXNUaW1lb3V0TGlzdCAqbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUaW1lb3V0ICAgICAqdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgZW5hYmxlZCk7CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorcHJvdGVjdGVkX2NoYW5nZV90aW1lb3V0IChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUaW1lb3V0ICAgICAgICAgICAgICAqdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1RpbWVvdXRBZGRGdW5jdGlvbiAgICBhZGRfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUaW1lb3V0UmVtb3ZlRnVuY3Rpb24gcmVtb3ZlX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVGltZW91dFRvZ2dsZUZ1bmN0aW9uIHRvZ2dsZV9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgICAgICAgICBlbmFibGVkKQoreworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisKKyAgSEFWRV9MT0NLX0NIRUNLIChjb25uZWN0aW9uKTsKKworICAvKiBUaGUgb3JpZ2luYWwgcHVycG9zZSBvZiBwcm90ZWN0ZWRfY2hhbmdlX3RpbWVvdXQoKSB3YXMgdG8gaG9sZCBhCisgICAqIHJlZiBvbiB0aGUgY29ubmVjdGlvbiB3aGlsZSBkcm9wcGluZyB0aGUgY29ubmVjdGlvbiBsb2NrLCB0aGVuCisgICAqIGNhbGxpbmcgb3V0IHRvIHRoZSBhcHAuICBUaGlzIHdhcyBhIGJyb2tlbiBoYWNrIHRoYXQgZGlkIG5vdAorICAgKiB3b3JrLCBzaW5jZSB0aGUgY29ubmVjdGlvbiB3YXMgaW4gYSBob3NlZCBzdGF0ZSAobm8gVGltZW91dExpc3QKKyAgICogZmllbGQpIHdoaWxlIGNhbGxpbmcgb3V0LgorICAgKgorICAgKiBTbyBmb3Igbm93IHdlJ2xsIGp1c3Qga2VlcCB0aGUgbG9jayB3aGlsZSBjYWxsaW5nIG91dC4gVGhpcyBtZWFucworICAgKiBhcHBzIGFyZSBub3QgYWxsb3dlZCB0byBjYWxsIERCdXNDb25uZWN0aW9uIG1ldGhvZHMgaW5zaWRlIGEKKyAgICogdGltZW91dCBmdW5jdGlvbiBvciB0aGV5IHdpbGwgZGVhZGxvY2suCisgICAqCisgICAqIFRoZSAicmVhbCBmaXgiIGlzIHRvIHVzZSB0aGUgX2FuZF91bmxvY2soKSBwYXR0ZXJuIGZvdW5kCisgICAqIGVsc2V3aGVyZSBpbiB0aGUgY29kZSwgdG8gZGVmZXIgY2FsbGluZyBvdXQgdG8gdGhlIGFwcCB1bnRpbAorICAgKiB3ZSdyZSBhYm91dCB0byBkcm9wIGxvY2tzIGFuZCByZXR1cm4gZmxvdyBvZiBjb250cm9sIHRvIHRoZSBhcHAKKyAgICogYW55d2F5LgorICAgKgorICAgKiBTZWUgaHR0cDovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9hcmNoaXZlcy9kYnVzLzIwMDctSnVseS90aHJlYWQuaHRtbCM4MTQ0CisgICAqLworCisgIGlmIChjb25uZWN0aW9uLT50aW1lb3V0cykKKyAgICB7CisgICAgICBpZiAoYWRkX2Z1bmN0aW9uKQorICAgICAgICByZXR2YWwgPSAoKiBhZGRfZnVuY3Rpb24pIChjb25uZWN0aW9uLT50aW1lb3V0cywgdGltZW91dCk7CisgICAgICBlbHNlIGlmIChyZW1vdmVfZnVuY3Rpb24pCisgICAgICAgIHsKKyAgICAgICAgICByZXR2YWwgPSBUUlVFOworICAgICAgICAgICgqIHJlbW92ZV9mdW5jdGlvbikgKGNvbm5lY3Rpb24tPnRpbWVvdXRzLCB0aW1lb3V0KTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgcmV0dmFsID0gVFJVRTsKKyAgICAgICAgICAoKiB0b2dnbGVfZnVuY3Rpb24pIChjb25uZWN0aW9uLT50aW1lb3V0cywgdGltZW91dCwgZW5hYmxlZCk7CisgICAgICAgIH0KKyAgICAgIHJldHVybiByZXR2YWw7CisgICAgfQorICBlbHNlCisgICAgcmV0dXJuIEZBTFNFOworfQorCisvKioKKyAqIEFkZHMgYSB0aW1lb3V0IHVzaW5nIHRoZSBjb25uZWN0aW9uJ3MgREJ1c0FkZFRpbWVvdXRGdW5jdGlvbiBpZgorICogYXZhaWxhYmxlLiBPdGhlcndpc2UgcmVjb3JkcyB0aGUgdGltZW91dCB0byBiZSBhZGRlZCB3aGVuIHNhaWQKKyAqIGZ1bmN0aW9uIGlzIGF2YWlsYWJsZS4gQWxzbyByZS1hZGRzIHRoZSB0aW1lb3V0IGlmIHRoZQorICogREJ1c0FkZFRpbWVvdXRGdW5jdGlvbiBjaGFuZ2VzLiBNYXkgZmFpbCBkdWUgdG8gbGFjayBvZiBtZW1vcnkuCisgKiBUaGUgdGltZW91dCB3aWxsIGZpcmUgcmVwZWF0ZWRseSB1bnRpbCByZW1vdmVkLgorICogQ29ubmVjdGlvbiBsb2NrIHNob3VsZCBiZSBoZWxkIHdoZW4gY2FsbGluZyB0aGlzLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uLgorICogQHBhcmFtIHRpbWVvdXQgdGhlIHRpbWVvdXQgdG8gYWRkLgorICogQHJldHVybnMgI1RSVUUgb24gc3VjY2Vzcy4KKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2Nvbm5lY3Rpb25fYWRkX3RpbWVvdXRfdW5sb2NrZWQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1RpbWVvdXQgICAgKnRpbWVvdXQpCit7CisgIHJldHVybiBwcm90ZWN0ZWRfY2hhbmdlX3RpbWVvdXQgKGNvbm5lY3Rpb24sIHRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3RpbWVvdXRfbGlzdF9hZGRfdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgRkFMU0UpOworfQorCisvKioKKyAqIFJlbW92ZXMgYSB0aW1lb3V0IHVzaW5nIHRoZSBjb25uZWN0aW9uJ3MgREJ1c1JlbW92ZVRpbWVvdXRGdW5jdGlvbgorICogaWYgYXZhaWxhYmxlLiBJdCdzIGFuIGVycm9yIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiBvbiBhIHRpbWVvdXQKKyAqIHRoYXQgd2FzIG5vdCBwcmV2aW91c2x5IGFkZGVkLgorICogQ29ubmVjdGlvbiBsb2NrIHNob3VsZCBiZSBoZWxkIHdoZW4gY2FsbGluZyB0aGlzLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uLgorICogQHBhcmFtIHRpbWVvdXQgdGhlIHRpbWVvdXQgdG8gcmVtb3ZlLgorICovCit2b2lkCitfZGJ1c19jb25uZWN0aW9uX3JlbW92ZV90aW1lb3V0X3VubG9ja2VkIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUaW1lb3V0ICAgICp0aW1lb3V0KQoreworICBwcm90ZWN0ZWRfY2hhbmdlX3RpbWVvdXQgKGNvbm5lY3Rpb24sIHRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c190aW1lb3V0X2xpc3RfcmVtb3ZlX3RpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgRkFMU0UpOworfQorCisvKioKKyAqIFRvZ2dsZXMgYSB0aW1lb3V0IGFuZCBub3RpZmllcyBhcHAgdmlhIGNvbm5lY3Rpb24ncworICogREJ1c1RpbWVvdXRUb2dnbGVkRnVuY3Rpb24gaWYgYXZhaWxhYmxlLiBJdCdzIGFuIGVycm9yIHRvIGNhbGwgdGhpcworICogZnVuY3Rpb24gb24gYSB0aW1lb3V0IHRoYXQgd2FzIG5vdCBwcmV2aW91c2x5IGFkZGVkLgorICogQ29ubmVjdGlvbiBsb2NrIHNob3VsZCBiZSBoZWxkIHdoZW4gY2FsbGluZyB0aGlzLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uLgorICogQHBhcmFtIHRpbWVvdXQgdGhlIHRpbWVvdXQgdG8gdG9nZ2xlLgorICogQHBhcmFtIGVuYWJsZWQgd2hldGhlciB0byBlbmFibGUgb3IgZGlzYWJsZQorICovCit2b2lkCitfZGJ1c19jb25uZWN0aW9uX3RvZ2dsZV90aW1lb3V0X3VubG9ja2VkIChEQnVzQ29ubmVjdGlvbiAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1RpbWVvdXQgICAgICAqdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgIGVuYWJsZWQpCit7CisgIHByb3RlY3RlZF9jaGFuZ2VfdGltZW91dCAoY29ubmVjdGlvbiwgdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3RpbWVvdXRfbGlzdF90b2dnbGVfdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitfZGJ1c19jb25uZWN0aW9uX2F0dGFjaF9wZW5kaW5nX2NhbGxfdW5sb2NrZWQgKERCdXNDb25uZWN0aW9uICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1BlbmRpbmdDYWxsICpwZW5kaW5nKQoreworICBkYnVzX3VpbnQzMl90IHJlcGx5X3NlcmlhbDsKKyAgREJ1c1RpbWVvdXQgKnRpbWVvdXQ7CisKKyAgSEFWRV9MT0NLX0NIRUNLIChjb25uZWN0aW9uKTsKKworICByZXBseV9zZXJpYWwgPSBfZGJ1c19wZW5kaW5nX2NhbGxfZ2V0X3JlcGx5X3NlcmlhbF91bmxvY2tlZCAocGVuZGluZyk7CisKKyAgX2RidXNfYXNzZXJ0IChyZXBseV9zZXJpYWwgIT0gMCk7CisKKyAgdGltZW91dCA9IF9kYnVzX3BlbmRpbmdfY2FsbF9nZXRfdGltZW91dF91bmxvY2tlZCAocGVuZGluZyk7CisKKyAgaWYgKHRpbWVvdXQpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19jb25uZWN0aW9uX2FkZF90aW1lb3V0X3VubG9ja2VkIChjb25uZWN0aW9uLCB0aW1lb3V0KSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgCisgICAgICBpZiAoIV9kYnVzX2hhc2hfdGFibGVfaW5zZXJ0X2ludCAoY29ubmVjdGlvbi0+cGVuZGluZ19yZXBsaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5X3NlcmlhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fcmVtb3ZlX3RpbWVvdXRfdW5sb2NrZWQgKGNvbm5lY3Rpb24sIHRpbWVvdXQpOworCisgICAgICAgICAgX2RidXNfcGVuZGluZ19jYWxsX3NldF90aW1lb3V0X2FkZGVkX3VubG9ja2VkIChwZW5kaW5nLCBGQUxTRSk7CisgICAgICAgICAgSEFWRV9MT0NLX0NIRUNLIChjb25uZWN0aW9uKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgX2RidXNfcGVuZGluZ19jYWxsX3NldF90aW1lb3V0X2FkZGVkX3VubG9ja2VkIChwZW5kaW5nLCBUUlVFKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX2hhc2hfdGFibGVfaW5zZXJ0X2ludCAoY29ubmVjdGlvbi0+cGVuZGluZ19yZXBsaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5X3NlcmlhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nKSkKKyAgICAgICAgeworICAgICAgICAgIEhBVkVfTE9DS19DSEVDSyAoY29ubmVjdGlvbik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgfQorCisgIF9kYnVzX3BlbmRpbmdfY2FsbF9yZWZfdW5sb2NrZWQgKHBlbmRpbmcpOworCisgIEhBVkVfTE9DS19DSEVDSyAoY29ubmVjdGlvbik7CisgIAorICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK2ZyZWVfcGVuZGluZ19jYWxsX29uX2hhc2hfcmVtb3ZhbCAodm9pZCAqZGF0YSkKK3sKKyAgREJ1c1BlbmRpbmdDYWxsICpwZW5kaW5nOworICBEQnVzQ29ubmVjdGlvbiAgKmNvbm5lY3Rpb247CisgIAorICBpZiAoZGF0YSA9PSBOVUxMKQorICAgIHJldHVybjsKKworICBwZW5kaW5nID0gZGF0YTsKKworICBjb25uZWN0aW9uID0gX2RidXNfcGVuZGluZ19jYWxsX2dldF9jb25uZWN0aW9uX3VubG9ja2VkIChwZW5kaW5nKTsKKworICBIQVZFX0xPQ0tfQ0hFQ0sgKGNvbm5lY3Rpb24pOworICAKKyAgaWYgKF9kYnVzX3BlbmRpbmdfY2FsbF9pc190aW1lb3V0X2FkZGVkX3VubG9ja2VkIChwZW5kaW5nKSkKKyAgICB7CisgICAgICBfZGJ1c19jb25uZWN0aW9uX3JlbW92ZV90aW1lb3V0X3VubG9ja2VkIChjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfcGVuZGluZ19jYWxsX2dldF90aW1lb3V0X3VubG9ja2VkIChwZW5kaW5nKSk7CisgICAgICAKKyAgICAgIF9kYnVzX3BlbmRpbmdfY2FsbF9zZXRfdGltZW91dF9hZGRlZF91bmxvY2tlZCAocGVuZGluZywgRkFMU0UpOworICAgIH0KKworICAvKiBGSVhNRSAxLjA/IHRoaXMgaXMgc29ydCBvZiBkYW5nZXJvdXMgYW5kIHVuZGVzaXJhYmxlIHRvIGRyb3AgdGhlIGxvY2sgCisgICAqIGhlcmUsIGJ1dCB0aGUgcGVuZGluZyBjYWxsIGZpbmFsaXplciBjb3VsZCBpbiBwcmluY2lwbGUgY2FsbCBvdXQgdG8gCisgICAqIGFwcGxpY2F0aW9uIGNvZGUgc28gd2UgcHJldHR5IG11Y2ggaGF2ZSB0by4uLiBzb21lIGxhcmdlciBjb2RlIHJlb3JnIAorICAgKiBtaWdodCBiZSBuZWVkZWQuCisgICAqLworICBfZGJ1c19jb25uZWN0aW9uX3JlZl91bmxvY2tlZCAoY29ubmVjdGlvbik7CisgIF9kYnVzX3BlbmRpbmdfY2FsbF91bnJlZl9hbmRfdW5sb2NrIChwZW5kaW5nKTsKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKyAgX2RidXNfY29ubmVjdGlvbl91bnJlZl91bmxvY2tlZCAoY29ubmVjdGlvbik7Cit9CisKK3N0YXRpYyB2b2lkCitfZGJ1c19jb25uZWN0aW9uX2RldGFjaF9wZW5kaW5nX2NhbGxfdW5sb2NrZWQgKERCdXNDb25uZWN0aW9uICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1BlbmRpbmdDYWxsICpwZW5kaW5nKQoreworICAvKiBUaGlzIGVuZHMgdXAgdW5sb2NraW5nIHRvIGNhbGwgdGhlIHBlbmRpbmcgY2FsbCBmaW5hbGl6ZXIsIHdoaWNoIGlzIHVuZXhwZWN0ZWQgdG8KKyAgICogc2F5IHRoZSBsZWFzdC4KKyAgICovCisgIF9kYnVzX2hhc2hfdGFibGVfcmVtb3ZlX2ludCAoY29ubmVjdGlvbi0+cGVuZGluZ19yZXBsaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3BlbmRpbmdfY2FsbF9nZXRfcmVwbHlfc2VyaWFsX3VubG9ja2VkIChwZW5kaW5nKSk7Cit9CisKK3N0YXRpYyB2b2lkCitfZGJ1c19jb25uZWN0aW9uX2RldGFjaF9wZW5kaW5nX2NhbGxfYW5kX3VubG9jayAoREJ1c0Nvbm5lY3Rpb24gICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNQZW5kaW5nQ2FsbCAqcGVuZGluZykKK3sKKyAgLyogVGhlIGlkZWEgaGVyZSBpcyB0byBhdm9pZCBmaW5hbGl6aW5nIHRoZSBwZW5kaW5nIGNhbGwKKyAgICogd2l0aCB0aGUgbG9jayBoZWxkLCBzaW5jZSB0aGVyZSdzIGEgZGVzdHJveSBub3RpZmllcgorICAgKiBpbiBwZW5kaW5nIGNhbGwgdGhhdCBnb2VzIG91dCB0byBhcHBsaWNhdGlvbiBjb2RlLgorICAgKgorICAgKiBUaGVyZSdzIGFuIGV4dHJhIHVubG9jayBpbnNpZGUgdGhlIGhhc2ggdGFibGUKKyAgICogImZyZWUgcGVuZGluZyBjYWxsIiBmdW5jdGlvbiBGSVhNRS4uLgorICAgKi8KKyAgX2RidXNfcGVuZGluZ19jYWxsX3JlZl91bmxvY2tlZCAocGVuZGluZyk7CisgIF9kYnVzX2hhc2hfdGFibGVfcmVtb3ZlX2ludCAoY29ubmVjdGlvbi0+cGVuZGluZ19yZXBsaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3BlbmRpbmdfY2FsbF9nZXRfcmVwbHlfc2VyaWFsX3VubG9ja2VkIChwZW5kaW5nKSk7CisKKyAgaWYgKF9kYnVzX3BlbmRpbmdfY2FsbF9pc190aW1lb3V0X2FkZGVkX3VubG9ja2VkIChwZW5kaW5nKSkKKyAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fcmVtb3ZlX3RpbWVvdXRfdW5sb2NrZWQgKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgIF9kYnVzX3BlbmRpbmdfY2FsbF9nZXRfdGltZW91dF91bmxvY2tlZCAocGVuZGluZykpOworCisgIF9kYnVzX3BlbmRpbmdfY2FsbF9zZXRfdGltZW91dF9hZGRlZF91bmxvY2tlZCAocGVuZGluZywgRkFMU0UpOworCisgIF9kYnVzX3BlbmRpbmdfY2FsbF91bnJlZl9hbmRfdW5sb2NrIChwZW5kaW5nKTsKK30KKworLyoqCisgKiBSZW1vdmVzIGEgcGVuZGluZyBjYWxsIGZyb20gdGhlIGNvbm5lY3Rpb24sIHN1Y2ggdGhhdAorICogdGhlIHBlbmRpbmcgcmVwbHkgd2lsbCBiZSBpZ25vcmVkLiBNYXkgZHJvcCB0aGUgbGFzdAorICogcmVmZXJlbmNlIHRvIHRoZSBwZW5kaW5nIGNhbGwuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBwZW5kaW5nIHRoZSBwZW5kaW5nIGNhbGwKKyAqLwordm9pZAorX2RidXNfY29ubmVjdGlvbl9yZW1vdmVfcGVuZGluZ19jYWxsIChEQnVzQ29ubmVjdGlvbiAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNQZW5kaW5nQ2FsbCAqcGVuZGluZykKK3sKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKyAgX2RidXNfY29ubmVjdGlvbl9kZXRhY2hfcGVuZGluZ19jYWxsX2FuZF91bmxvY2sgKGNvbm5lY3Rpb24sIHBlbmRpbmcpOworfQorCisvKioKKyAqIEFjcXVpcmUgdGhlIHRyYW5zcG9ydGVyIEkvTyBwYXRoLiBUaGlzIG11c3QgYmUgZG9uZSBiZWZvcmUKKyAqIGRvaW5nIGFueSBJL08gaW4gdGhlIHRyYW5zcG9ydGVyLiBNYXkgc2xlZXAgYW5kIGRyb3AgdGhlCisgKiBJTyBwYXRoIG11dGV4IHdoaWxlIHdhaXRpbmcgZm9yIHRoZSBJL08gcGF0aC4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbi4KKyAqIEBwYXJhbSB0aW1lb3V0X21pbGxpc2Vjb25kcyBtYXhpbXVtIGJsb2NraW5nIHRpbWUsIG9yIC0xIGZvciBubyBsaW1pdC4KKyAqIEByZXR1cm5zIFRSVUUgaWYgdGhlIEkvTyBwYXRoIHdhcyBhY3F1aXJlZC4KKyAqLworc3RhdGljIGRidXNfYm9vbF90CitfZGJ1c19jb25uZWN0aW9uX2FjcXVpcmVfaW9fcGF0aCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkJICBpbnQgICAgICAgICAgICAgdGltZW91dF9taWxsaXNlY29uZHMpCit7CisgIGRidXNfYm9vbF90IHdlX2FjcXVpcmVkOworICAKKyAgSEFWRV9MT0NLX0NIRUNLIChjb25uZWN0aW9uKTsKKworICAvKiBXZSBkb24ndCB3YW50IHRoZSBjb25uZWN0aW9uIHRvIHZhbmlzaCAqLworICBfZGJ1c19jb25uZWN0aW9uX3JlZl91bmxvY2tlZCAoY29ubmVjdGlvbik7CisKKyAgLyogV2Ugd2lsbCBvbmx5IHRvdWNoIGlvX3BhdGhfYWNxdWlyZWQgd2hpY2ggaXMgcHJvdGVjdGVkIGJ5IG91ciBtdXRleCAqLworICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7CisgIAorICBfZGJ1c192ZXJib3NlICgibG9ja2luZyBpb19wYXRoX211dGV4XG4iKTsKKyAgX2RidXNfY211dGV4X2xvY2sgKGNvbm5lY3Rpb24tPmlvX3BhdGhfbXV0ZXgpOworCisgIF9kYnVzX3ZlcmJvc2UgKCJzdGFydCBjb25uZWN0aW9uLT5pb19wYXRoX2FjcXVpcmVkID0gJWQgdGltZW91dCA9ICVkXG4iLAorICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLT5pb19wYXRoX2FjcXVpcmVkLCB0aW1lb3V0X21pbGxpc2Vjb25kcyk7CisKKyAgd2VfYWNxdWlyZWQgPSBGQUxTRTsKKyAgCisgIGlmIChjb25uZWN0aW9uLT5pb19wYXRoX2FjcXVpcmVkKQorICAgIHsKKyAgICAgIGlmICh0aW1lb3V0X21pbGxpc2Vjb25kcyAhPSAtMSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJ3YWl0aW5nICVkIGZvciBJTyBwYXRoIHRvIGJlIGFjcXVpcmFibGVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dF9taWxsaXNlY29uZHMpOworCisgICAgICAgICAgaWYgKCFfZGJ1c19jb25kdmFyX3dhaXRfdGltZW91dCAoY29ubmVjdGlvbi0+aW9fcGF0aF9jb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24tPmlvX3BhdGhfbXV0ZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dF9taWxsaXNlY29uZHMpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvKiBXZSB0aW1lZCBvdXQgYmVmb3JlIGFueW9uZSBzaWduYWxlZC4gKi8KKyAgICAgICAgICAgICAgLyogKHdyaXRpbmcgdGhlIGxvb3AgdG8gaGFuZGxlIHRoZSAhdGltZWRvdXQgY2FzZSBieQorICAgICAgICAgICAgICAgKiB3YWl0aW5nIGxvbmdlciBpZiBuZWVkZWQgaXMgYSBwYWluIHNpbmNlIGRidXMKKyAgICAgICAgICAgICAgICogd3JhcHMgcHRocmVhZF9jb25kX3RpbWVkd2FpdCB0byB0YWtlIGEgcmVsYXRpdmUKKyAgICAgICAgICAgICAgICogdGltZSBpbnN0ZWFkIG9mIGFic29sdXRlLCBzb21ldGhpbmcga2luZCBvZiBzdHVwaWQKKyAgICAgICAgICAgICAgICogb24gb3VyIHBhcnQuIGZvciBub3cgaXQgZG9lc24ndCBtYXR0ZXIsIHdlIHdpbGwganVzdAorICAgICAgICAgICAgICAgKiBlbmQgdXAgYmFjayBoZXJlIGV2ZW50dWFsbHkuKQorICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgd2hpbGUgKGNvbm5lY3Rpb24tPmlvX3BhdGhfYWNxdWlyZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJ3YWl0aW5nIGZvciBJTyBwYXRoIHRvIGJlIGFjcXVpcmFibGVcbiIpOworICAgICAgICAgICAgICBfZGJ1c19jb25kdmFyX3dhaXQgKGNvbm5lY3Rpb24tPmlvX3BhdGhfY29uZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi0+aW9fcGF0aF9tdXRleCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgIAorICBpZiAoIWNvbm5lY3Rpb24tPmlvX3BhdGhfYWNxdWlyZWQpCisgICAgeworICAgICAgd2VfYWNxdWlyZWQgPSBUUlVFOworICAgICAgY29ubmVjdGlvbi0+aW9fcGF0aF9hY3F1aXJlZCA9IFRSVUU7CisgICAgfQorICAKKyAgX2RidXNfdmVyYm9zZSAoImVuZCBjb25uZWN0aW9uLT5pb19wYXRoX2FjcXVpcmVkID0gJWQgd2VfYWNxdWlyZWQgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi0+aW9fcGF0aF9hY3F1aXJlZCwgd2VfYWNxdWlyZWQpOworCisgIF9kYnVzX3ZlcmJvc2UgKCJ1bmxvY2tpbmcgaW9fcGF0aF9tdXRleFxuIik7CisgIF9kYnVzX2NtdXRleF91bmxvY2sgKGNvbm5lY3Rpb24tPmlvX3BhdGhfbXV0ZXgpOworCisgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisgIAorICBIQVZFX0xPQ0tfQ0hFQ0sgKGNvbm5lY3Rpb24pOworCisgIF9kYnVzX2Nvbm5lY3Rpb25fdW5yZWZfdW5sb2NrZWQgKGNvbm5lY3Rpb24pOworICAKKyAgcmV0dXJuIHdlX2FjcXVpcmVkOworfQorCisvKioKKyAqIFJlbGVhc2UgdGhlIEkvTyBwYXRoIHdoZW4geW91J3JlIGRvbmUgd2l0aCBpdC4gT25seSBjYWxsCisgKiBhZnRlciB5b3UndmUgYWNxdWlyZWQgdGhlIEkvTy4gV2FrZXMgdXAgYXQgbW9zdCBvbmUgdGhyZWFkCisgKiBjdXJyZW50bHkgd2FpdGluZyB0byBhY3F1aXJlIHRoZSBJL08gcGF0aC4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbi4KKyAqLworc3RhdGljIHZvaWQKK19kYnVzX2Nvbm5lY3Rpb25fcmVsZWFzZV9pb19wYXRoIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgSEFWRV9MT0NLX0NIRUNLIChjb25uZWN0aW9uKTsKKyAgCisgIF9kYnVzX3ZlcmJvc2UgKCJsb2NraW5nIGlvX3BhdGhfbXV0ZXhcbiIpOworICBfZGJ1c19jbXV0ZXhfbG9jayAoY29ubmVjdGlvbi0+aW9fcGF0aF9tdXRleCk7CisgIAorICBfZGJ1c19hc3NlcnQgKGNvbm5lY3Rpb24tPmlvX3BhdGhfYWNxdWlyZWQpOworCisgIF9kYnVzX3ZlcmJvc2UgKCJzdGFydCBjb25uZWN0aW9uLT5pb19wYXRoX2FjcXVpcmVkID0gJWRcbiIsCisgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24tPmlvX3BhdGhfYWNxdWlyZWQpOworICAKKyAgY29ubmVjdGlvbi0+aW9fcGF0aF9hY3F1aXJlZCA9IEZBTFNFOworICBfZGJ1c19jb25kdmFyX3dha2Vfb25lIChjb25uZWN0aW9uLT5pb19wYXRoX2NvbmQpOworCisgIF9kYnVzX3ZlcmJvc2UgKCJ1bmxvY2tpbmcgaW9fcGF0aF9tdXRleFxuIik7CisgIF9kYnVzX2NtdXRleF91bmxvY2sgKGNvbm5lY3Rpb24tPmlvX3BhdGhfbXV0ZXgpOworfQorCisvKioKKyAqIFF1ZXVlcyBpbmNvbWluZyBtZXNzYWdlcyBhbmQgc2VuZHMgb3V0Z29pbmcgbWVzc2FnZXMgZm9yIHRoaXMKKyAqIGNvbm5lY3Rpb24sIG9wdGlvbmFsbHkgYmxvY2tpbmcgaW4gdGhlIHByb2Nlc3MuIEVhY2ggY2FsbCB0bworICogX2RidXNfY29ubmVjdGlvbl9kb19pdGVyYXRpb25fdW5sb2NrZWQoKSB3aWxsIGNhbGwgc2VsZWN0KCkgb3IgcG9sbCgpIG9uZQorICogdGltZSBhbmQgdGhlbiByZWFkIG9yIHdyaXRlIGRhdGEgaWYgcG9zc2libGUuCisgKgorICogVGhlIHB1cnBvc2Ugb2YgdGhpcyBmdW5jdGlvbiBpcyB0byBiZSBhYmxlIHRvIGZsdXNoIG91dGdvaW5nCisgKiBtZXNzYWdlcyBvciBxdWV1ZSB1cCBpbmNvbWluZyBtZXNzYWdlcyB3aXRob3V0IHJldHVybmluZworICogY29udHJvbCB0byB0aGUgYXBwbGljYXRpb24gYW5kIGNhdXNpbmcgcmVlbnRyYW5jeSB3ZWlyZG5lc3MuCisgKgorICogVGhlIGZsYWdzIHBhcmFtZXRlciBhbGxvd3MgeW91IHRvIHNwZWNpZnkgd2hldGhlciB0bworICogcmVhZCBpbmNvbWluZyBtZXNzYWdlcywgd3JpdGUgb3V0Z29pbmcgbWVzc2FnZXMsIG9yIGJvdGgsCisgKiBhbmQgd2hldGhlciB0byBibG9jayBpZiBubyBpbW1lZGlhdGUgYWN0aW9uIGlzIHBvc3NpYmxlLgorICoKKyAqIFRoZSB0aW1lb3V0X21pbGxpc2Vjb25kcyBwYXJhbWV0ZXIgZG9lcyBub3RoaW5nIHVubGVzcyB0aGUKKyAqIGl0ZXJhdGlvbiBpcyBibG9ja2luZy4KKyAqCisgKiBJZiB0aGVyZSBhcmUgbm8gb3V0Z29pbmcgbWVzc2FnZXMgYW5kIERCVVNfSVRFUkFUSU9OX0RPX1JFQURJTkcKKyAqIHdhc24ndCBzcGVjaWZpZWQsIHRoZW4gaXQncyBpbXBvc3NpYmxlIHRvIGJsb2NrLCBldmVuIGlmCisgKiB5b3Ugc3BlY2lmeSBEQlVTX0lURVJBVElPTl9CTE9DSzsgaW4gdGhhdCBjYXNlIHRoZSBmdW5jdGlvbgorICogcmV0dXJucyBpbW1lZGlhdGVseS4KKyAqCisgKiBJZiBwZW5kaW5nIGlzIG5vdCBOVUxMIHRoZW4gYSBjaGVjayBpcyBtYWRlIGlmIHRoZSBwZW5kaW5nIGNhbGwKKyAqIGlzIGNvbXBsZXRlZCBhZnRlciB0aGUgaW8gcGF0aCBoYXMgYmVlbiByZXF1aXJlZC4gSWYgdGhlIGNhbGwKKyAqIGhhcyBiZWVuIGNvbXBsZXRlZCBub3RoaW5nIGlzIGRvbmUuIFRoaXMgbXVzdCBiZSBkb25lIHNpbmNlCisgKiB0aGUgX2RidXNfY29ubmVjdGlvbl9hY3F1aXJlX2lvX3BhdGggcmVsZWFzZXMgdGhlIGNvbm5lY3Rpb24KKyAqIGxvY2sgZm9yIGEgd2hpbGUuCisgKgorICogQ2FsbGVkIHdpdGggY29ubmVjdGlvbiBsb2NrIGhlbGQuCisgKiAKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uLgorICogQHBhcmFtIHBlbmRpbmcgdGhlIHBlbmRpbmcgY2FsbCB0aGF0IHNob3VsZCBiZSBjaGVja2VkIG9yIE5VTEwKKyAqIEBwYXJhbSBmbGFncyBpdGVyYXRpb24gZmxhZ3MuCisgKiBAcGFyYW0gdGltZW91dF9taWxsaXNlY29uZHMgbWF4aW11bSBibG9ja2luZyB0aW1lLCBvciAtMSBmb3Igbm8gbGltaXQuCisgKi8KK3ZvaWQKK19kYnVzX2Nvbm5lY3Rpb25fZG9faXRlcmF0aW9uX3VubG9ja2VkIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzUGVuZGluZ0NhbGwgKnBlbmRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICB0aW1lb3V0X21pbGxpc2Vjb25kcykKK3sKKyAgX2RidXNfdmVyYm9zZSAoInN0YXJ0XG4iKTsKKyAgCisgIEhBVkVfTE9DS19DSEVDSyAoY29ubmVjdGlvbik7CisgIAorICBpZiAoY29ubmVjdGlvbi0+bl9vdXRnb2luZyA9PSAwKQorICAgIGZsYWdzICY9IH5EQlVTX0lURVJBVElPTl9ET19XUklUSU5HOworCisgIGlmIChfZGJ1c19jb25uZWN0aW9uX2FjcXVpcmVfaW9fcGF0aCAoY29ubmVjdGlvbiwKKwkJCQkJKGZsYWdzICYgREJVU19JVEVSQVRJT05fQkxPQ0spID8gdGltZW91dF9taWxsaXNlY29uZHMgOiAwKSkKKyAgICB7CisgICAgICBIQVZFX0xPQ0tfQ0hFQ0sgKGNvbm5lY3Rpb24pOworICAgICAgCisgICAgICBpZiAoIChwZW5kaW5nICE9IE5VTEwpICYmIF9kYnVzX3BlbmRpbmdfY2FsbF9nZXRfY29tcGxldGVkX3VubG9ja2VkKHBlbmRpbmcpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoInBlbmRpbmcgY2FsbCBjb21wbGV0ZWQgd2hpbGUgYWNxdWlyaW5nIEkvTyBwYXRoIik7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKCAocGVuZGluZyAhPSBOVUxMKSAmJgorICAgICAgICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fcGVla19mb3JfcmVwbHlfdW5sb2NrZWQgKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfcGVuZGluZ19jYWxsX2dldF9yZXBseV9zZXJpYWxfdW5sb2NrZWQgKHBlbmRpbmcpKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJwZW5kaW5nIGNhbGwgY29tcGxldGVkIHdoaWxlIGFjcXVpcmluZyBJL08gcGF0aCAocmVwbHkgZm91bmQgaW4gcXVldWUpIik7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3RyYW5zcG9ydF9kb19pdGVyYXRpb24gKGNvbm5lY3Rpb24tPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywgdGltZW91dF9taWxsaXNlY29uZHMpOworICAgICAgICB9CisKKyAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fcmVsZWFzZV9pb19wYXRoIChjb25uZWN0aW9uKTsKKyAgICB9CisKKyAgSEFWRV9MT0NLX0NIRUNLIChjb25uZWN0aW9uKTsKKworICBfZGJ1c192ZXJib3NlICgiZW5kXG4iKTsKK30KKworLyoqCisgKiBDcmVhdGVzIGEgbmV3IGNvbm5lY3Rpb24gZm9yIHRoZSBnaXZlbiB0cmFuc3BvcnQuICBBIHRyYW5zcG9ydAorICogcmVwcmVzZW50cyBhIG1lc3NhZ2Ugc3RyZWFtIHRoYXQgdXNlcyBzb21lIGNvbmNyZXRlIG1lY2hhbmlzbSwgc3VjaAorICogYXMgVU5JWCBkb21haW4gc29ja2V0cy4gTWF5IHJldHVybiAjTlVMTCBpZiBpbnN1ZmZpY2llbnQKKyAqIG1lbW9yeSBleGlzdHMgdG8gY3JlYXRlIHRoZSBjb25uZWN0aW9uLgorICoKKyAqIEBwYXJhbSB0cmFuc3BvcnQgdGhlIHRyYW5zcG9ydC4KKyAqIEByZXR1cm5zIHRoZSBuZXcgY29ubmVjdGlvbiwgb3IgI05VTEwgb24gZmFpbHVyZS4KKyAqLworREJ1c0Nvbm5lY3Rpb24qCitfZGJ1c19jb25uZWN0aW9uX25ld19mb3JfdHJhbnNwb3J0IChEQnVzVHJhbnNwb3J0ICp0cmFuc3BvcnQpCit7CisgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uOworICBEQnVzV2F0Y2hMaXN0ICp3YXRjaF9saXN0OworICBEQnVzVGltZW91dExpc3QgKnRpbWVvdXRfbGlzdDsKKyAgREJ1c0hhc2hUYWJsZSAqcGVuZGluZ19yZXBsaWVzOworICBEQnVzTGlzdCAqZGlzY29ubmVjdF9saW5rOworICBEQnVzTWVzc2FnZSAqZGlzY29ubmVjdF9tZXNzYWdlOworICBEQnVzQ291bnRlciAqb3V0Z29pbmdfY291bnRlcjsKKyAgREJ1c09iamVjdFRyZWUgKm9iamVjdHM7CisgIAorICB3YXRjaF9saXN0ID0gTlVMTDsKKyAgY29ubmVjdGlvbiA9IE5VTEw7CisgIHBlbmRpbmdfcmVwbGllcyA9IE5VTEw7CisgIHRpbWVvdXRfbGlzdCA9IE5VTEw7CisgIGRpc2Nvbm5lY3RfbGluayA9IE5VTEw7CisgIGRpc2Nvbm5lY3RfbWVzc2FnZSA9IE5VTEw7CisgIG91dGdvaW5nX2NvdW50ZXIgPSBOVUxMOworICBvYmplY3RzID0gTlVMTDsKKyAgCisgIHdhdGNoX2xpc3QgPSBfZGJ1c193YXRjaF9saXN0X25ldyAoKTsKKyAgaWYgKHdhdGNoX2xpc3QgPT0gTlVMTCkKKyAgICBnb3RvIGVycm9yOworCisgIHRpbWVvdXRfbGlzdCA9IF9kYnVzX3RpbWVvdXRfbGlzdF9uZXcgKCk7CisgIGlmICh0aW1lb3V0X2xpc3QgPT0gTlVMTCkKKyAgICBnb3RvIGVycm9yOyAgCisKKyAgcGVuZGluZ19yZXBsaWVzID0KKyAgICBfZGJ1c19oYXNoX3RhYmxlX25ldyAoREJVU19IQVNIX0lOVCwKKwkJCSAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKERCdXNGcmVlRnVuY3Rpb24pZnJlZV9wZW5kaW5nX2NhbGxfb25faGFzaF9yZW1vdmFsKTsKKyAgaWYgKHBlbmRpbmdfcmVwbGllcyA9PSBOVUxMKQorICAgIGdvdG8gZXJyb3I7CisgIAorICBjb25uZWN0aW9uID0gZGJ1c19uZXcwIChEQnVzQ29ubmVjdGlvbiwgMSk7CisgIGlmIChjb25uZWN0aW9uID09IE5VTEwpCisgICAgZ290byBlcnJvcjsKKworICBfZGJ1c19ybXV0ZXhfbmV3X2F0X2xvY2F0aW9uICgmY29ubmVjdGlvbi0+bXV0ZXgpOworICBpZiAoY29ubmVjdGlvbi0+bXV0ZXggPT0gTlVMTCkKKyAgICBnb3RvIGVycm9yOworCisgIF9kYnVzX2NtdXRleF9uZXdfYXRfbG9jYXRpb24gKCZjb25uZWN0aW9uLT5pb19wYXRoX211dGV4KTsKKyAgaWYgKGNvbm5lY3Rpb24tPmlvX3BhdGhfbXV0ZXggPT0gTlVMTCkKKyAgICBnb3RvIGVycm9yOworCisgIF9kYnVzX2NtdXRleF9uZXdfYXRfbG9jYXRpb24gKCZjb25uZWN0aW9uLT5kaXNwYXRjaF9tdXRleCk7CisgIGlmIChjb25uZWN0aW9uLT5kaXNwYXRjaF9tdXRleCA9PSBOVUxMKQorICAgIGdvdG8gZXJyb3I7CisgIAorICBfZGJ1c19jb25kdmFyX25ld19hdF9sb2NhdGlvbiAoJmNvbm5lY3Rpb24tPmRpc3BhdGNoX2NvbmQpOworICBpZiAoY29ubmVjdGlvbi0+ZGlzcGF0Y2hfY29uZCA9PSBOVUxMKQorICAgIGdvdG8gZXJyb3I7CisgIAorICBfZGJ1c19jb25kdmFyX25ld19hdF9sb2NhdGlvbiAoJmNvbm5lY3Rpb24tPmlvX3BhdGhfY29uZCk7CisgIGlmIChjb25uZWN0aW9uLT5pb19wYXRoX2NvbmQgPT0gTlVMTCkKKyAgICBnb3RvIGVycm9yOworCisgIF9kYnVzX3JtdXRleF9uZXdfYXRfbG9jYXRpb24gKCZjb25uZWN0aW9uLT5zbG90X211dGV4KTsKKyAgaWYgKGNvbm5lY3Rpb24tPnNsb3RfbXV0ZXggPT0gTlVMTCkKKyAgICBnb3RvIGVycm9yOworCisgIGRpc2Nvbm5lY3RfbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXdfc2lnbmFsIChEQlVTX1BBVEhfTE9DQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0lOVEVSRkFDRV9MT0NBTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEaXNjb25uZWN0ZWQiKTsKKyAgCisgIGlmIChkaXNjb25uZWN0X21lc3NhZ2UgPT0gTlVMTCkKKyAgICBnb3RvIGVycm9yOworCisgIGRpc2Nvbm5lY3RfbGluayA9IF9kYnVzX2xpc3RfYWxsb2NfbGluayAoZGlzY29ubmVjdF9tZXNzYWdlKTsKKyAgaWYgKGRpc2Nvbm5lY3RfbGluayA9PSBOVUxMKQorICAgIGdvdG8gZXJyb3I7CisKKyAgb3V0Z29pbmdfY291bnRlciA9IF9kYnVzX2NvdW50ZXJfbmV3ICgpOworICBpZiAob3V0Z29pbmdfY291bnRlciA9PSBOVUxMKQorICAgIGdvdG8gZXJyb3I7CisKKyAgb2JqZWN0cyA9IF9kYnVzX29iamVjdF90cmVlX25ldyAoY29ubmVjdGlvbik7CisgIGlmIChvYmplY3RzID09IE5VTEwpCisgICAgZ290byBlcnJvcjsKKyAgCisgIGlmIChfZGJ1c19tb2RpZnlfc2lncGlwZSkKKyAgICBfZGJ1c19kaXNhYmxlX3NpZ3BpcGUgKCk7CisKKyAgLyogaW5pdGlhbGl6ZWQgdG8gMDogdXNlIGF0b21pYyBvcCB0byBhdm9pZCBtaXhpbmcgYXRvbWljIGFuZCBub24tYXRvbWljICovCisgIF9kYnVzX2F0b21pY19pbmMgKCZjb25uZWN0aW9uLT5yZWZjb3VudCk7CisgIGNvbm5lY3Rpb24tPnRyYW5zcG9ydCA9IHRyYW5zcG9ydDsKKyAgY29ubmVjdGlvbi0+d2F0Y2hlcyA9IHdhdGNoX2xpc3Q7CisgIGNvbm5lY3Rpb24tPnRpbWVvdXRzID0gdGltZW91dF9saXN0OworICBjb25uZWN0aW9uLT5wZW5kaW5nX3JlcGxpZXMgPSBwZW5kaW5nX3JlcGxpZXM7CisgIGNvbm5lY3Rpb24tPm91dGdvaW5nX2NvdW50ZXIgPSBvdXRnb2luZ19jb3VudGVyOworICBjb25uZWN0aW9uLT5maWx0ZXJfbGlzdCA9IE5VTEw7CisgIGNvbm5lY3Rpb24tPmxhc3RfZGlzcGF0Y2hfc3RhdHVzID0gREJVU19ESVNQQVRDSF9DT01QTEVURTsgLyogc28gd2UncmUgbm90aWZpZWQgZmlyc3QgdGltZSB0aGVyZSdzIGRhdGEgKi8KKyAgY29ubmVjdGlvbi0+b2JqZWN0cyA9IG9iamVjdHM7CisgIGNvbm5lY3Rpb24tPmV4aXRfb25fZGlzY29ubmVjdCA9IEZBTFNFOworICBjb25uZWN0aW9uLT5zaGFyZWFibGUgPSBGQUxTRTsKKyAgY29ubmVjdGlvbi0+cm91dGVfcGVlcl9tZXNzYWdlcyA9IEZBTFNFOworICBjb25uZWN0aW9uLT5kaXNjb25uZWN0ZWRfbWVzc2FnZV9hcnJpdmVkID0gRkFMU0U7CisgIGNvbm5lY3Rpb24tPmRpc2Nvbm5lY3RlZF9tZXNzYWdlX3Byb2Nlc3NlZCA9IEZBTFNFOworICAKKyNpZiBkZWZpbmVkKERCVVNfRU5BQkxFX0NIRUNLUykgfHwgZGVmaW5lZChEQlVTX0VOQUJMRV9BU1NFUlQpCisgIGNvbm5lY3Rpb24tPmdlbmVyYXRpb24gPSBfZGJ1c19jdXJyZW50X2dlbmVyYXRpb247CisjZW5kaWYKKyAgCisgIF9kYnVzX2RhdGFfc2xvdF9saXN0X2luaXQgKCZjb25uZWN0aW9uLT5zbG90X2xpc3QpOworCisgIGNvbm5lY3Rpb24tPmNsaWVudF9zZXJpYWwgPSAxOworCisgIGNvbm5lY3Rpb24tPmRpc2Nvbm5lY3RfbWVzc2FnZV9saW5rID0gZGlzY29ubmVjdF9saW5rOworCisgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisgIAorICBpZiAoIV9kYnVzX3RyYW5zcG9ydF9zZXRfY29ubmVjdGlvbiAodHJhbnNwb3J0LCBjb25uZWN0aW9uKSkKKyAgICB7CisgICAgICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7CisKKyAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgIF9kYnVzX3RyYW5zcG9ydF9yZWYgKHRyYW5zcG9ydCk7CisKKyAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworCisgIF9kYnVzX2Nvbm5lY3Rpb25fdHJhY2VfcmVmIChjb25uZWN0aW9uLCAwLCAxLCAibmV3X2Zvcl90cmFuc3BvcnQiKTsKKyAgcmV0dXJuIGNvbm5lY3Rpb247CisgIAorIGVycm9yOgorICBpZiAoZGlzY29ubmVjdF9tZXNzYWdlICE9IE5VTEwpCisgICAgZGJ1c19tZXNzYWdlX3VucmVmIChkaXNjb25uZWN0X21lc3NhZ2UpOworICAKKyAgaWYgKGRpc2Nvbm5lY3RfbGluayAhPSBOVUxMKQorICAgIF9kYnVzX2xpc3RfZnJlZV9saW5rIChkaXNjb25uZWN0X2xpbmspOworICAKKyAgaWYgKGNvbm5lY3Rpb24gIT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c19jb25kdmFyX2ZyZWVfYXRfbG9jYXRpb24gKCZjb25uZWN0aW9uLT5pb19wYXRoX2NvbmQpOworICAgICAgX2RidXNfY29uZHZhcl9mcmVlX2F0X2xvY2F0aW9uICgmY29ubmVjdGlvbi0+ZGlzcGF0Y2hfY29uZCk7CisgICAgICBfZGJ1c19ybXV0ZXhfZnJlZV9hdF9sb2NhdGlvbiAoJmNvbm5lY3Rpb24tPm11dGV4KTsKKyAgICAgIF9kYnVzX2NtdXRleF9mcmVlX2F0X2xvY2F0aW9uICgmY29ubmVjdGlvbi0+aW9fcGF0aF9tdXRleCk7CisgICAgICBfZGJ1c19jbXV0ZXhfZnJlZV9hdF9sb2NhdGlvbiAoJmNvbm5lY3Rpb24tPmRpc3BhdGNoX211dGV4KTsKKyAgICAgIF9kYnVzX3JtdXRleF9mcmVlX2F0X2xvY2F0aW9uICgmY29ubmVjdGlvbi0+c2xvdF9tdXRleCk7CisgICAgICBkYnVzX2ZyZWUgKGNvbm5lY3Rpb24pOworICAgIH0KKyAgaWYgKHBlbmRpbmdfcmVwbGllcykKKyAgICBfZGJ1c19oYXNoX3RhYmxlX3VucmVmIChwZW5kaW5nX3JlcGxpZXMpOworICAKKyAgaWYgKHdhdGNoX2xpc3QpCisgICAgX2RidXNfd2F0Y2hfbGlzdF9mcmVlICh3YXRjaF9saXN0KTsKKworICBpZiAodGltZW91dF9saXN0KQorICAgIF9kYnVzX3RpbWVvdXRfbGlzdF9mcmVlICh0aW1lb3V0X2xpc3QpOworCisgIGlmIChvdXRnb2luZ19jb3VudGVyKQorICAgIF9kYnVzX2NvdW50ZXJfdW5yZWYgKG91dGdvaW5nX2NvdW50ZXIpOworCisgIGlmIChvYmplY3RzKQorICAgIF9kYnVzX29iamVjdF90cmVlX3VucmVmIChvYmplY3RzKTsKKyAgCisgIHJldHVybiBOVUxMOworfQorCisvKioKKyAqIEluY3JlbWVudHMgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiBhIERCdXNDb25uZWN0aW9uLgorICogUmVxdWlyZXMgdGhhdCB0aGUgY2FsbGVyIGFscmVhZHkgaG9sZHMgdGhlIGNvbm5lY3Rpb24gbG9jay4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbi4KKyAqIEByZXR1cm5zIHRoZSBjb25uZWN0aW9uLgorICovCitEQnVzQ29ubmVjdGlvbiAqCitfZGJ1c19jb25uZWN0aW9uX3JlZl91bmxvY2tlZCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIGRidXNfaW50MzJfdCBvbGRfcmVmY291bnQ7CisKKyAgX2RidXNfYXNzZXJ0IChjb25uZWN0aW9uICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKGNvbm5lY3Rpb24tPmdlbmVyYXRpb24gPT0gX2RidXNfY3VycmVudF9nZW5lcmF0aW9uKTsKKworICBIQVZFX0xPQ0tfQ0hFQ0sgKGNvbm5lY3Rpb24pOworCisgIG9sZF9yZWZjb3VudCA9IF9kYnVzX2F0b21pY19pbmMgKCZjb25uZWN0aW9uLT5yZWZjb3VudCk7CisgIF9kYnVzX2Nvbm5lY3Rpb25fdHJhY2VfcmVmIChjb25uZWN0aW9uLCBvbGRfcmVmY291bnQsIG9sZF9yZWZjb3VudCArIDEsCisgICAgICAicmVmX3VubG9ja2VkIik7CisKKyAgcmV0dXJuIGNvbm5lY3Rpb247Cit9CisKKy8qKgorICogRGVjcmVtZW50cyB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIGEgREJ1c0Nvbm5lY3Rpb24uCisgKiBSZXF1aXJlcyB0aGF0IHRoZSBjYWxsZXIgYWxyZWFkeSBob2xkcyB0aGUgY29ubmVjdGlvbiBsb2NrLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uLgorICovCit2b2lkCitfZGJ1c19jb25uZWN0aW9uX3VucmVmX3VubG9ja2VkIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgZGJ1c19pbnQzMl90IG9sZF9yZWZjb3VudDsKKworICBIQVZFX0xPQ0tfQ0hFQ0sgKGNvbm5lY3Rpb24pOworCisgIF9kYnVzX2Fzc2VydCAoY29ubmVjdGlvbiAhPSBOVUxMKTsKKworICBvbGRfcmVmY291bnQgPSBfZGJ1c19hdG9taWNfZGVjICgmY29ubmVjdGlvbi0+cmVmY291bnQpOworCisgIF9kYnVzX2Nvbm5lY3Rpb25fdHJhY2VfcmVmIChjb25uZWN0aW9uLCBvbGRfcmVmY291bnQsIG9sZF9yZWZjb3VudCAtIDEsCisgICAgICAidW5yZWZfdW5sb2NrZWQiKTsKKworICBpZiAob2xkX3JlZmNvdW50ID09IDEpCisgICAgX2RidXNfY29ubmVjdGlvbl9sYXN0X3VucmVmIChjb25uZWN0aW9uKTsKK30KKworc3RhdGljIGRidXNfdWludDMyX3QKK19kYnVzX2Nvbm5lY3Rpb25fZ2V0X25leHRfY2xpZW50X3NlcmlhbCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIGRidXNfdWludDMyX3Qgc2VyaWFsOworCisgIHNlcmlhbCA9IGNvbm5lY3Rpb24tPmNsaWVudF9zZXJpYWwrKzsKKworICBpZiAoY29ubmVjdGlvbi0+Y2xpZW50X3NlcmlhbCA9PSAwKQorICAgIGNvbm5lY3Rpb24tPmNsaWVudF9zZXJpYWwgPSAxOworCisgIHJldHVybiBzZXJpYWw7Cit9CisKKy8qKgorICogQSBjYWxsYmFjayBmb3IgdXNlIHdpdGggZGJ1c193YXRjaF9uZXcoKSB0byBjcmVhdGUgYSBEQnVzV2F0Y2guCisgKiAKKyAqIEB0b2RvIFRoaXMgaXMgYmFzaWNhbGx5IGEgaGFjayAtIHdlIGNvdWxkIGRlbGV0ZSBfZGJ1c190cmFuc3BvcnRfaGFuZGxlX3dhdGNoKCkKKyAqIGFuZCB0aGUgdmlydHVhbCBoYW5kbGVfd2F0Y2ggaW4gREJ1c1RyYW5zcG9ydCBpZiB3ZSBnb3QgcmlkIG9mIGl0LgorICogVGhlIHJlYXNvbiB0aGlzIGlzIHNvbWUgd29yayBpcyB0aHJlYWRpbmcsIHNlZSB0aGUgX2RidXNfY29ubmVjdGlvbl9oYW5kbGVfd2F0Y2goKQorICogaW1wbGVtZW50YXRpb24uCisgKgorICogQHBhcmFtIHdhdGNoIHRoZSB3YXRjaC4KKyAqIEBwYXJhbSBjb25kaXRpb24gdGhlIGN1cnJlbnQgY29uZGl0aW9uIG9mIHRoZSBmaWxlIGRlc2NyaXB0b3JzIGJlaW5nIHdhdGNoZWQuCisgKiBAcGFyYW0gZGF0YSBtdXN0IGJlIGEgcG9pbnRlciB0byBhICNEQnVzQ29ubmVjdGlvbgorICogQHJldHVybnMgI0ZBTFNFIGlmIHRoZSBJTyBjb25kaXRpb24gbWF5IG5vdCBoYXZlIGJlZW4gZnVsbHkgaGFuZGxlZCBkdWUgdG8gbGFjayBvZiBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2Nvbm5lY3Rpb25faGFuZGxlX3dhdGNoIChEQnVzV2F0Y2ggICAgICAgICAgICAgICAgICAgKndhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgICAgY29uZGl0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSkKK3sKKyAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgREJ1c0Rpc3BhdGNoU3RhdHVzIHN0YXR1czsKKworICBjb25uZWN0aW9uID0gZGF0YTsKKworICBfZGJ1c192ZXJib3NlICgic3RhcnRcbiIpOworICAKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKworICBpZiAoIV9kYnVzX2Nvbm5lY3Rpb25fYWNxdWlyZV9pb19wYXRoIChjb25uZWN0aW9uLCAxKSkKKyAgICB7CisgICAgICAvKiBhbm90aGVyIHRocmVhZCBpcyBoYW5kbGluZyB0aGUgbWVzc2FnZSAqLworICAgICAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIEhBVkVfTE9DS19DSEVDSyAoY29ubmVjdGlvbik7CisgIHJldHZhbCA9IF9kYnVzX3RyYW5zcG9ydF9oYW5kbGVfd2F0Y2ggKGNvbm5lY3Rpb24tPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2F0Y2gsIGNvbmRpdGlvbik7CisKKyAgX2RidXNfY29ubmVjdGlvbl9yZWxlYXNlX2lvX3BhdGggKGNvbm5lY3Rpb24pOworCisgIEhBVkVfTE9DS19DSEVDSyAoY29ubmVjdGlvbik7CisKKyAgX2RidXNfdmVyYm9zZSAoIm1pZGRsZVxuIik7CisgIAorICBzdGF0dXMgPSBfZGJ1c19jb25uZWN0aW9uX2dldF9kaXNwYXRjaF9zdGF0dXNfdW5sb2NrZWQgKGNvbm5lY3Rpb24pOworCisgIC8qIHRoaXMgY2FsbHMgb3V0IHRvIHVzZXIgY29kZSAqLworICBfZGJ1c19jb25uZWN0aW9uX3VwZGF0ZV9kaXNwYXRjaF9zdGF0dXNfYW5kX3VubG9jayAoY29ubmVjdGlvbiwgc3RhdHVzKTsKKworICBfZGJ1c192ZXJib3NlICgiZW5kXG4iKTsKKyAgCisgIHJldHVybiByZXR2YWw7Cit9CisKKy8qIFByb3RlY3RlZCBieSBfREJVU19MT0NLIChzaGFyZWRfY29ubmVjdGlvbnMpICovCitzdGF0aWMgREJ1c0hhc2hUYWJsZSAqc2hhcmVkX2Nvbm5lY3Rpb25zID0gTlVMTDsKK3N0YXRpYyBEQnVzTGlzdCAqc2hhcmVkX2Nvbm5lY3Rpb25zX25vX2d1aWQgPSBOVUxMOworCitzdGF0aWMgdm9pZAorY2xvc2VfY29ubmVjdGlvbl9vbl9zaHV0ZG93biAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworCisgIGRidXNfY29ubmVjdGlvbl9yZWYgKGNvbm5lY3Rpb24pOworICBfZGJ1c19jb25uZWN0aW9uX2Nsb3NlX3Bvc3NpYmx5X3NoYXJlZCAoY29ubmVjdGlvbik7CisKKyAgLyogQ2h1cm4gdGhyb3VnaCB0byB0aGUgRGlzY29ubmVjdGVkIG1lc3NhZ2UgKi8KKyAgd2hpbGUgKChtZXNzYWdlID0gZGJ1c19jb25uZWN0aW9uX3BvcF9tZXNzYWdlIChjb25uZWN0aW9uKSkpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICB9CisgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoY29ubmVjdGlvbik7Cit9CisKK3N0YXRpYyB2b2lkCitzaGFyZWRfY29ubmVjdGlvbnNfc2h1dGRvd24gKHZvaWQgKmRhdGEpCit7CisgIGludCBuX2VudHJpZXM7CisKKyAgaWYgKCFfREJVU19MT0NLIChzaGFyZWRfY29ubmVjdGlvbnMpKQorICAgIHsKKyAgICAgIC8qIFdlJ2QgaGF2ZSBpbml0aWFsaXplZCBsb2NrcyBiZWZvcmUgYWRkaW5nIGFueXRoaW5nLCBzbyB0aGVyZQorICAgICAgICogY2FuJ3QgYmUgYW55dGhpbmcgdGhlcmUuICovCisgICAgICByZXR1cm47CisgICAgfQorCisgIC8qIFRoaXMgaXMgYSBsaXR0bGUgYml0IHVucGxlYXNhbnQuLi4gYmV0dGVyIGlkZWFzPyAqLworICB3aGlsZSAoKG5fZW50cmllcyA9IF9kYnVzX2hhc2hfdGFibGVfZ2V0X25fZW50cmllcyAoc2hhcmVkX2Nvbm5lY3Rpb25zKSkgPiAwKQorICAgIHsKKyAgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uOworICAgICAgREJ1c0hhc2hJdGVyIGl0ZXI7CisgICAgICAKKyAgICAgIF9kYnVzX2hhc2hfaXRlcl9pbml0IChzaGFyZWRfY29ubmVjdGlvbnMsICZpdGVyKTsKKyAgICAgIF9kYnVzX2hhc2hfaXRlcl9uZXh0ICgmaXRlcik7CisgICAgICAgCisgICAgICBjb25uZWN0aW9uID0gX2RidXNfaGFzaF9pdGVyX2dldF92YWx1ZSAoJml0ZXIpOworCisgICAgICBfREJVU19VTkxPQ0sgKHNoYXJlZF9jb25uZWN0aW9ucyk7CisgICAgICBjbG9zZV9jb25uZWN0aW9uX29uX3NodXRkb3duIChjb25uZWN0aW9uKTsKKyAgICAgIGlmICghX0RCVVNfTE9DSyAoc2hhcmVkX2Nvbm5lY3Rpb25zKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZ2xvYmFsIGxvY2tzIHdlcmUgYWxyZWFkeSBpbml0aWFsaXplZCIpOworCisgICAgICAvKiBUaGUgY29ubmVjdGlvbiBzaG91bGQgbm93IGJlIGRlYWQgYW5kIG5vdCBpbiBvdXIgaGFzaCAuLi4gKi8KKyAgICAgIF9kYnVzX2Fzc2VydCAoX2RidXNfaGFzaF90YWJsZV9nZXRfbl9lbnRyaWVzIChzaGFyZWRfY29ubmVjdGlvbnMpIDwgbl9lbnRyaWVzKTsKKyAgICB9CisKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19oYXNoX3RhYmxlX2dldF9uX2VudHJpZXMgKHNoYXJlZF9jb25uZWN0aW9ucykgPT0gMCk7CisgIAorICBfZGJ1c19oYXNoX3RhYmxlX3VucmVmIChzaGFyZWRfY29ubmVjdGlvbnMpOworICBzaGFyZWRfY29ubmVjdGlvbnMgPSBOVUxMOworCisgIGlmIChzaGFyZWRfY29ubmVjdGlvbnNfbm9fZ3VpZCAhPSBOVUxMKQorICAgIHsKKyAgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uOworICAgICAgY29ubmVjdGlvbiA9IF9kYnVzX2xpc3RfcG9wX2ZpcnN0ICgmc2hhcmVkX2Nvbm5lY3Rpb25zX25vX2d1aWQpOworICAgICAgd2hpbGUgKGNvbm5lY3Rpb24gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIF9EQlVTX1VOTE9DSyAoc2hhcmVkX2Nvbm5lY3Rpb25zKTsKKyAgICAgICAgICBjbG9zZV9jb25uZWN0aW9uX29uX3NodXRkb3duIChjb25uZWN0aW9uKTsKKyAgICAgICAgICBpZiAoIV9EQlVTX0xPQ0sgKHNoYXJlZF9jb25uZWN0aW9ucykpCisgICAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJnbG9iYWwgbG9ja3Mgd2VyZSBhbHJlYWR5IGluaXRpYWxpemVkIik7CisgICAgICAgICAgY29ubmVjdGlvbiA9IF9kYnVzX2xpc3RfcG9wX2ZpcnN0ICgmc2hhcmVkX2Nvbm5lY3Rpb25zX25vX2d1aWQpOworICAgICAgICB9CisgICAgfQorCisgIHNoYXJlZF9jb25uZWN0aW9uc19ub19ndWlkID0gTlVMTDsKKyAgCisgIF9EQlVTX1VOTE9DSyAoc2hhcmVkX2Nvbm5lY3Rpb25zKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90Citjb25uZWN0aW9uX2xvb2t1cF9zaGFyZWQgKERCdXNBZGRyZXNzRW50cnkgICplbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gICAqKnJlc3VsdCkKK3sKKyAgX2RidXNfdmVyYm9zZSAoImNoZWNraW5nIGZvciBleGlzdGluZyBjb25uZWN0aW9uXG4iKTsKKyAgCisgICpyZXN1bHQgPSBOVUxMOworCisgIGlmICghX0RCVVNfTE9DSyAoc2hhcmVkX2Nvbm5lY3Rpb25zKSkKKyAgICB7CisgICAgICAvKiBJZiBpdCB3YXMgc2hhcmVkLCB3ZSdkIGhhdmUgaW5pdGlhbGl6ZWQgZ2xvYmFsIGxvY2tzIHdoZW4gd2UgcHV0CisgICAgICAgKiBpdCBpbiBzaGFyZWRfY29ubmVjdGlvbnMuICovCisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmIChzaGFyZWRfY29ubmVjdGlvbnMgPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiY3JlYXRpbmcgc2hhcmVkX2Nvbm5lY3Rpb25zIGhhc2ggdGFibGVcbiIpOworICAgICAgCisgICAgICBzaGFyZWRfY29ubmVjdGlvbnMgPSBfZGJ1c19oYXNoX3RhYmxlX25ldyAoREJVU19IQVNIX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2ZyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICBpZiAoc2hhcmVkX2Nvbm5lY3Rpb25zID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBfREJVU19VTkxPQ0sgKHNoYXJlZF9jb25uZWN0aW9ucyk7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIGlmICghX2RidXNfcmVnaXN0ZXJfc2h1dGRvd25fZnVuYyAoc2hhcmVkX2Nvbm5lY3Rpb25zX3NodXRkb3duLCBOVUxMKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX2hhc2hfdGFibGVfdW5yZWYgKHNoYXJlZF9jb25uZWN0aW9ucyk7CisgICAgICAgICAgc2hhcmVkX2Nvbm5lY3Rpb25zID0gTlVMTDsKKyAgICAgICAgICBfREJVU19VTkxPQ0sgKHNoYXJlZF9jb25uZWN0aW9ucyk7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgIHN1Y2Nlc3NmdWxseSBjcmVhdGVkIHNoYXJlZF9jb25uZWN0aW9uc1xuIik7CisgICAgICAKKyAgICAgIF9EQlVTX1VOTE9DSyAoc2hhcmVkX2Nvbm5lY3Rpb25zKTsKKyAgICAgIHJldHVybiBUUlVFOyAvKiBubyBwb2ludCBsb29raW5nIHVwIGluIHRoZSBoYXNoIHdlIGp1c3QgbWFkZSAqLworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKmd1aWQ7CisKKyAgICAgIGd1aWQgPSBkYnVzX2FkZHJlc3NfZW50cnlfZ2V0X3ZhbHVlIChlbnRyeSwgImd1aWQiKTsKKyAgICAgIAorICAgICAgaWYgKGd1aWQgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uOworICAgICAgICAgIAorICAgICAgICAgIGNvbm5lY3Rpb24gPSBfZGJ1c19oYXNoX3RhYmxlX2xvb2t1cF9zdHJpbmcgKHNoYXJlZF9jb25uZWN0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWlkKTsKKworICAgICAgICAgIGlmIChjb25uZWN0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvKiBUaGUgREJ1c0Nvbm5lY3Rpb24gY2FuJ3QgYmUgZmluYWxpemVkIHdpdGhvdXQgdGFraW5nCisgICAgICAgICAgICAgICAqIHRoZSBzaGFyZWRfY29ubmVjdGlvbnMgbG9jayB0byByZW1vdmUgaXQgZnJvbSB0aGUKKyAgICAgICAgICAgICAgICogaGFzaC4gIFNvIGl0J3Mgc2FmZSB0byByZWYgdGhlIGNvbm5lY3Rpb24gaGVyZS4KKyAgICAgICAgICAgICAgICogSG93ZXZlciwgaXQgbWF5IGJlIGRpc2Nvbm5lY3RlZCBpZiB0aGUgRGlzY29ubmVjdGVkCisgICAgICAgICAgICAgICAqIG1lc3NhZ2UgaGFzbid0IGJlZW4gcHJvY2Vzc2VkIHlldCwgaW4gd2hpY2ggY2FzZSB3ZQorICAgICAgICAgICAgICAgKiB3YW50IHRvIHByZXRlbmQgaXQgaXNuJ3QgaW4gdGhlIGhhc2ggYW5kIGF2b2lkCisgICAgICAgICAgICAgICAqIHJldHVybmluZyBpdC4KKyAgICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAgICogVGhlIGlkZWEgaXMgdG8gYXZvaWQgZXZlciByZXR1cm5pbmcgYSBkaXNjb25uZWN0ZWQgY29ubmVjdGlvbgorICAgICAgICAgICAgICAgKiBmcm9tIGRidXNfY29ubmVjdGlvbl9vcGVuKCkuIFdlIGNvdWxkIGp1c3Qgc3luY2hyb25vdXNseQorICAgICAgICAgICAgICAgKiBkcm9wIG91ciBzaGFyZWQgcmVmIHRvIHRoZSBjb25uZWN0aW9uIG9uIGNvbm5lY3Rpb24gZGlzY29ubmVjdCwKKyAgICAgICAgICAgICAgICogYW5kIHRoZW4gYXNzZXJ0IGhlcmUgdGhhdCB0aGUgY29ubmVjdGlvbiBpcyBjb25uZWN0ZWQsIGJ1dAorICAgICAgICAgICAgICAgKiB0aGF0IGNhdXNlcyByZWVudHJhbmN5IGhlYWRhY2hlcy4KKyAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisgICAgICAgICAgICAgIGlmIChfZGJ1c19jb25uZWN0aW9uX2dldF9pc19jb25uZWN0ZWRfdW5sb2NrZWQgKGNvbm5lY3Rpb24pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fcmVmX3VubG9ja2VkIChjb25uZWN0aW9uKTsKKyAgICAgICAgICAgICAgICAgICpyZXN1bHQgPSBjb25uZWN0aW9uOworICAgICAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoImxvb2tlZCB1cCBleGlzdGluZyBjb25uZWN0aW9uIHRvIHNlcnZlciBndWlkICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoImxvb2tlZCB1cCBleGlzdGluZyBjb25uZWN0aW9uIHRvIHNlcnZlciBndWlkICVzIGJ1dCBpdCB3YXMgZGlzY29ubmVjdGVkIHNvIGlnbm9yaW5nIGl0XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIAorICAgICAgX0RCVVNfVU5MT0NLIChzaGFyZWRfY29ubmVjdGlvbnMpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2Nvbm5lY3Rpb25fcmVjb3JkX3NoYXJlZF91bmxvY2tlZCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpndWlkKQoreworICBjaGFyICpndWlkX2tleTsKKyAgY2hhciAqZ3VpZF9pbl9jb25uZWN0aW9uOworCisgIEhBVkVfTE9DS19DSEVDSyAoY29ubmVjdGlvbik7CisgIF9kYnVzX2Fzc2VydCAoY29ubmVjdGlvbi0+c2VydmVyX2d1aWQgPT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAoY29ubmVjdGlvbi0+c2hhcmVhYmxlKTsKKworICAvKiBnZXQgYSBoYXJkIHJlZiBvbiB0aGlzIGNvbm5lY3Rpb24sIGV2ZW4gaWYKKyAgICogd2Ugd29uJ3QgaW4gZmFjdCBzdG9yZSBpdCBpbiB0aGUgaGFzaCwgd2Ugc3RpbGwKKyAgICogbmVlZCB0byBob2xkIGEgcmVmIG9uIGl0IHVudGlsIGl0J3MgZGlzY29ubmVjdGVkLgorICAgKi8KKyAgX2RidXNfY29ubmVjdGlvbl9yZWZfdW5sb2NrZWQgKGNvbm5lY3Rpb24pOworCisgIGlmIChndWlkID09IE5VTEwpCisgICAgeworICAgICAgaWYgKCFfREJVU19MT0NLIChzaGFyZWRfY29ubmVjdGlvbnMpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIGlmICghX2RidXNfbGlzdF9wcmVwZW5kICgmc2hhcmVkX2Nvbm5lY3Rpb25zX25vX2d1aWQsIGNvbm5lY3Rpb24pKQorICAgICAgICB7CisgICAgICAgICAgX0RCVVNfVU5MT0NLIChzaGFyZWRfY29ubmVjdGlvbnMpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICBfREJVU19VTkxPQ0sgKHNoYXJlZF9jb25uZWN0aW9ucyk7CisgICAgICByZXR1cm4gVFJVRTsgLyogZG9uJ3Qgc3RvcmUgaW4gdGhlIGhhc2ggKi8KKyAgICB9CisgIAorICAvKiBBIHNlcGFyYXRlIGNvcHkgb2YgdGhlIGtleSBpcyByZXF1aXJlZCBpbiB0aGUgaGFzaCB0YWJsZSwgYmVjYXVzZQorICAgKiB3ZSBkb24ndCBoYXZlIGEgbG9jayBvbiB0aGUgY29ubmVjdGlvbiB3aGVuIHdlIGFyZSBkb2luZyBhIGhhc2gKKyAgICogbG9va3VwLgorICAgKi8KKyAgCisgIGd1aWRfa2V5ID0gX2RidXNfc3RyZHVwIChndWlkKTsKKyAgaWYgKGd1aWRfa2V5ID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGd1aWRfaW5fY29ubmVjdGlvbiA9IF9kYnVzX3N0cmR1cCAoZ3VpZCk7CisgIGlmIChndWlkX2luX2Nvbm5lY3Rpb24gPT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX2ZyZWUgKGd1aWRfa2V5KTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFfREJVU19MT0NLIChzaGFyZWRfY29ubmVjdGlvbnMpKQorICAgIHsKKyAgICAgIGRidXNfZnJlZSAoZ3VpZF9pbl9jb25uZWN0aW9uKTsKKyAgICAgIGRidXNfZnJlZSAoZ3VpZF9rZXkpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBfZGJ1c19hc3NlcnQgKHNoYXJlZF9jb25uZWN0aW9ucyAhPSBOVUxMKTsKKyAgCisgIGlmICghX2RidXNfaGFzaF90YWJsZV9pbnNlcnRfc3RyaW5nIChzaGFyZWRfY29ubmVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWlkX2tleSwgY29ubmVjdGlvbikpCisgICAgeworICAgICAgZGJ1c19mcmVlIChndWlkX2tleSk7CisgICAgICBkYnVzX2ZyZWUgKGd1aWRfaW5fY29ubmVjdGlvbik7CisgICAgICBfREJVU19VTkxPQ0sgKHNoYXJlZF9jb25uZWN0aW9ucyk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGNvbm5lY3Rpb24tPnNlcnZlcl9ndWlkID0gZ3VpZF9pbl9jb25uZWN0aW9uOworCisgIF9kYnVzX3ZlcmJvc2UgKCJzdG9yZWQgY29ubmVjdGlvbiB0byAlcyB0byBiZSBzaGFyZWRcbiIsCisgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24tPnNlcnZlcl9ndWlkKTsKKyAgCisgIF9EQlVTX1VOTE9DSyAoc2hhcmVkX2Nvbm5lY3Rpb25zKTsKKworICBfZGJ1c19hc3NlcnQgKGNvbm5lY3Rpb24tPnNlcnZlcl9ndWlkICE9IE5VTEwpOworICAKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitjb25uZWN0aW9uX2ZvcmdldF9zaGFyZWRfdW5sb2NrZWQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBIQVZFX0xPQ0tfQ0hFQ0sgKGNvbm5lY3Rpb24pOworCisgIGlmICghY29ubmVjdGlvbi0+c2hhcmVhYmxlKQorICAgIHJldHVybjsKKworICBpZiAoIV9EQlVTX0xPQ0sgKHNoYXJlZF9jb25uZWN0aW9ucykpCisgICAgeworICAgICAgLyogSWYgaXQgd2FzIHNoYXJlZCwgd2UnZCBoYXZlIGluaXRpYWxpemVkIGdsb2JhbCBsb2NrcyB3aGVuIHdlIHB1dAorICAgICAgICogaXQgaW4gdGhlIHRhYmxlOyBzbyBpdCBjYW4ndCBiZSB0aGVyZS4gKi8KKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKGNvbm5lY3Rpb24tPnNlcnZlcl9ndWlkICE9IE5VTEwpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoImRyb3BwaW5nIGNvbm5lY3Rpb24gdG8gJXMgb3V0IG9mIHRoZSBzaGFyZWQgdGFibGVcbiIsCisgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLT5zZXJ2ZXJfZ3VpZCk7CisgICAgICAKKyAgICAgIGlmICghX2RidXNfaGFzaF90YWJsZV9yZW1vdmVfc3RyaW5nIChzaGFyZWRfY29ubmVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi0+c2VydmVyX2d1aWQpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb25uZWN0aW9uIHdhcyBub3QgaW4gdGhlIHNoYXJlZCB0YWJsZSIpOworICAgICAgCisgICAgICBkYnVzX2ZyZWUgKGNvbm5lY3Rpb24tPnNlcnZlcl9ndWlkKTsKKyAgICAgIGNvbm5lY3Rpb24tPnNlcnZlcl9ndWlkID0gTlVMTDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfZGJ1c19saXN0X3JlbW92ZSAoJnNoYXJlZF9jb25uZWN0aW9uc19ub19ndWlkLCBjb25uZWN0aW9uKTsKKyAgICB9CisKKyAgX0RCVVNfVU5MT0NLIChzaGFyZWRfY29ubmVjdGlvbnMpOworICAKKyAgLyogcmVtb3ZlIG91ciByZWZlcmVuY2UgaGVsZCBvbiBhbGwgc2hhcmVhYmxlIGNvbm5lY3Rpb25zICovCisgIF9kYnVzX2Nvbm5lY3Rpb25fdW5yZWZfdW5sb2NrZWQgKGNvbm5lY3Rpb24pOworfQorCitzdGF0aWMgREJ1c0Nvbm5lY3Rpb24qCitjb25uZWN0aW9uX3RyeV9mcm9tX2FkZHJlc3NfZW50cnkgKERCdXNBZGRyZXNzRW50cnkgKmVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgREJ1c1RyYW5zcG9ydCAqdHJhbnNwb3J0OworICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKworICB0cmFuc3BvcnQgPSBfZGJ1c190cmFuc3BvcnRfb3BlbiAoZW50cnksIGVycm9yKTsKKworICBpZiAodHJhbnNwb3J0ID09IE5VTEwpCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIGNvbm5lY3Rpb24gPSBfZGJ1c19jb25uZWN0aW9uX25ld19mb3JfdHJhbnNwb3J0ICh0cmFuc3BvcnQpOworCisgIF9kYnVzX3RyYW5zcG9ydF91bnJlZiAodHJhbnNwb3J0KTsKKyAgCisgIGlmIChjb25uZWN0aW9uID09IE5VTEwpCisgICAgeworICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisjaWZuZGVmIERCVVNfRElTQUJMRV9DSEVDS1MKKyAgX2RidXNfYXNzZXJ0ICghY29ubmVjdGlvbi0+aGF2ZV9jb25uZWN0aW9uX2xvY2spOworI2VuZGlmCisgIHJldHVybiBjb25uZWN0aW9uOworfQorCisvKgorICogSWYgdGhlIHNoYXJlZCBwYXJhbWV0ZXIgaXMgdHJ1ZSwgdGhlbiBhbnkgZXhpc3RpbmcgY29ubmVjdGlvbiB3aWxsCisgKiBiZSB1c2VkIChhbmQgaWYgYSBuZXcgY29ubmVjdGlvbiBpcyBjcmVhdGVkLCBpdCB3aWxsIGJlIGF2YWlsYWJsZQorICogZm9yIHVzZSBieSBvdGhlcnMpLiBJZiB0aGUgc2hhcmVkIHBhcmFtZXRlciBpcyBmYWxzZSwgYSBuZXcKKyAqIGNvbm5lY3Rpb24gd2lsbCBhbHdheXMgYmUgY3JlYXRlZCwgYW5kIHRoZSBuZXcgY29ubmVjdGlvbiB3aWxsCisgKiBuZXZlciBiZSByZXR1cm5lZCB0byBvdGhlciBjYWxsZXJzLgorICoKKyAqIEBwYXJhbSBhZGRyZXNzIHRoZSBhZGRyZXNzCisgKiBAcGFyYW0gc2hhcmVkIHdoZXRoZXIgdGhlIGNvbm5lY3Rpb24gaXMgc2hhcmVkIG9yIHByaXZhdGUKKyAqIEBwYXJhbSBlcnJvciBlcnJvciByZXR1cm4KKyAqIEByZXR1cm5zIHRoZSBjb25uZWN0aW9uIG9yICNOVUxMIG9uIGVycm9yCisgKi8KK3N0YXRpYyBEQnVzQ29ubmVjdGlvbioKK19kYnVzX2Nvbm5lY3Rpb25fb3Blbl9pbnRlcm5hbCAoY29uc3QgY2hhciAgICAgKmFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICBzaGFyZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisgIERCdXNBZGRyZXNzRW50cnkgKiplbnRyaWVzOworICBEQnVzRXJyb3IgdG1wX2Vycm9yID0gREJVU19FUlJPUl9JTklUOworICBEQnVzRXJyb3IgZmlyc3RfZXJyb3IgPSBEQlVTX0VSUk9SX0lOSVQ7CisgIGludCBsZW4sIGk7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgX2RidXNfdmVyYm9zZSAoIm9wZW5pbmcgJXMgY29ubmVjdGlvbiB0bzogJXNcbiIsCisgICAgICAgICAgICAgICAgIHNoYXJlZCA/ICJzaGFyZWQiIDogInByaXZhdGUiLCBhZGRyZXNzKTsKKyAgCisgIGlmICghZGJ1c19wYXJzZV9hZGRyZXNzIChhZGRyZXNzLCAmZW50cmllcywgJmxlbiwgZXJyb3IpKQorICAgIHJldHVybiBOVUxMOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworICAKKyAgY29ubmVjdGlvbiA9IE5VTEw7CisKKyAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorICAgIHsKKyAgICAgIGlmIChzaGFyZWQpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIWNvbm5lY3Rpb25fbG9va3VwX3NoYXJlZCAoZW50cmllc1tpXSwgJmNvbm5lY3Rpb24pKQorICAgICAgICAgICAgX0RCVVNfU0VUX09PTSAoJnRtcF9lcnJvcik7CisgICAgICAgIH0KKworICAgICAgaWYgKGNvbm5lY3Rpb24gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uX3RyeV9mcm9tX2FkZHJlc3NfZW50cnkgKGVudHJpZXNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRtcF9lcnJvcik7CisKKyAgICAgICAgICBpZiAoY29ubmVjdGlvbiAhPSBOVUxMICYmIHNoYXJlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgY29uc3QgY2hhciAqZ3VpZDsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBjb25uZWN0aW9uLT5zaGFyZWFibGUgPSBUUlVFOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIC8qIGd1aWQgbWF5IGJlIE5VTEwgKi8KKyAgICAgICAgICAgICAgZ3VpZCA9IGRidXNfYWRkcmVzc19lbnRyeV9nZXRfdmFsdWUgKGVudHJpZXNbaV0sICJndWlkIik7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKyAgICAgICAgICAKKyAgICAgICAgICAgICAgaWYgKCFjb25uZWN0aW9uX3JlY29yZF9zaGFyZWRfdW5sb2NrZWQgKGNvbm5lY3Rpb24sIGd1aWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIF9EQlVTX1NFVF9PT00gKCZ0bXBfZXJyb3IpOworICAgICAgICAgICAgICAgICAgX2RidXNfY29ubmVjdGlvbl9jbG9zZV9wb3NzaWJseV9zaGFyZWRfYW5kX3VubG9jayAoY29ubmVjdGlvbik7CisgICAgICAgICAgICAgICAgICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGNvbm5lY3Rpb24pOworICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiA9IE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAKKyAgICAgIGlmIChjb25uZWN0aW9uKQorICAgICAgICBicmVhazsKKworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoJnRtcF9lcnJvcik7CisgICAgICAKKyAgICAgIGlmIChpID09IDApCisgICAgICAgIGRidXNfbW92ZV9lcnJvciAoJnRtcF9lcnJvciwgJmZpcnN0X2Vycm9yKTsKKyAgICAgIGVsc2UKKyAgICAgICAgZGJ1c19lcnJvcl9mcmVlICgmdG1wX2Vycm9yKTsKKyAgICB9CisgIAorICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSICgmdG1wX2Vycm9yKTsKKyAgCisgIGlmIChjb25uZWN0aW9uID09IE5VTEwpCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoJmZpcnN0X2Vycm9yKTsKKyAgICAgIGRidXNfbW92ZV9lcnJvciAoJmZpcnN0X2Vycm9yLCBlcnJvcik7CisgICAgfQorICBlbHNlCisgICAgZGJ1c19lcnJvcl9mcmVlICgmZmlyc3RfZXJyb3IpOworICAKKyAgZGJ1c19hZGRyZXNzX2VudHJpZXNfZnJlZSAoZW50cmllcyk7CisgIHJldHVybiBjb25uZWN0aW9uOworfQorCisvKioKKyAqIENsb3NlcyBhIHNoYXJlZCBPUiBwcml2YXRlIGNvbm5lY3Rpb24sIHdoaWxlIGRidXNfY29ubmVjdGlvbl9jbG9zZSgpIGNhbgorICogb25seSBiZSB1c2VkIG9uIHByaXZhdGUgY29ubmVjdGlvbnMuIFNob3VsZCBvbmx5IGJlIGNhbGxlZCBieSB0aGUKKyAqIGRidXMgY29kZSB0aGF0IG93bnMgdGhlIGNvbm5lY3Rpb24gLSBhbiBvd25lciBtdXN0IGJlIGtub3duLAorICogdGhlIG9wZW4vY2xvc2Ugc3RhdGUgaXMgbGlrZSBtYWxsb2MvZnJlZSwgbm90IGxpa2UgcmVmL3VucmVmLgorICogCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICovCit2b2lkCitfZGJ1c19jb25uZWN0aW9uX2Nsb3NlX3Bvc3NpYmx5X3NoYXJlZCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIF9kYnVzX2Fzc2VydCAoY29ubmVjdGlvbiAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChjb25uZWN0aW9uLT5nZW5lcmF0aW9uID09IF9kYnVzX2N1cnJlbnRfZ2VuZXJhdGlvbik7CisKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKyAgX2RidXNfY29ubmVjdGlvbl9jbG9zZV9wb3NzaWJseV9zaGFyZWRfYW5kX3VubG9jayAoY29ubmVjdGlvbik7Cit9CisKK3N0YXRpYyBEQnVzUHJlYWxsb2NhdGVkU2VuZCoKK19kYnVzX2Nvbm5lY3Rpb25fcHJlYWxsb2NhdGVfc2VuZF91bmxvY2tlZCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIERCdXNQcmVhbGxvY2F0ZWRTZW5kICpwcmVhbGxvY2F0ZWQ7CisKKyAgSEFWRV9MT0NLX0NIRUNLIChjb25uZWN0aW9uKTsKKyAgCisgIF9kYnVzX2Fzc2VydCAoY29ubmVjdGlvbiAhPSBOVUxMKTsKKyAgCisgIHByZWFsbG9jYXRlZCA9IGRidXNfbmV3IChEQnVzUHJlYWxsb2NhdGVkU2VuZCwgMSk7CisgIGlmIChwcmVhbGxvY2F0ZWQgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBwcmVhbGxvY2F0ZWQtPnF1ZXVlX2xpbmsgPSBfZGJ1c19saXN0X2FsbG9jX2xpbmsgKE5VTEwpOworICBpZiAocHJlYWxsb2NhdGVkLT5xdWV1ZV9saW5rID09IE5VTEwpCisgICAgZ290byBmYWlsZWRfMDsKKworICBwcmVhbGxvY2F0ZWQtPmNvdW50ZXJfbGluayA9IF9kYnVzX2xpc3RfYWxsb2NfbGluayAoY29ubmVjdGlvbi0+b3V0Z29pbmdfY291bnRlcik7CisgIGlmIChwcmVhbGxvY2F0ZWQtPmNvdW50ZXJfbGluayA9PSBOVUxMKQorICAgIGdvdG8gZmFpbGVkXzE7CisKKyAgX2RidXNfY291bnRlcl9yZWYgKHByZWFsbG9jYXRlZC0+Y291bnRlcl9saW5rLT5kYXRhKTsKKworICBwcmVhbGxvY2F0ZWQtPmNvbm5lY3Rpb24gPSBjb25uZWN0aW9uOworICAKKyAgcmV0dXJuIHByZWFsbG9jYXRlZDsKKyAgCisgZmFpbGVkXzE6CisgIF9kYnVzX2xpc3RfZnJlZV9saW5rIChwcmVhbGxvY2F0ZWQtPnF1ZXVlX2xpbmspOworIGZhaWxlZF8wOgorICBkYnVzX2ZyZWUgKHByZWFsbG9jYXRlZCk7CisgIAorICByZXR1cm4gTlVMTDsKK30KKworLyogQ2FsbGVkIHdpdGggbG9jayBoZWxkLCBkb2VzIG5vdCB1cGRhdGUgZGlzcGF0Y2ggc3RhdHVzICovCitzdGF0aWMgdm9pZAorX2RidXNfY29ubmVjdGlvbl9zZW5kX3ByZWFsbG9jYXRlZF91bmxvY2tlZF9ub191cGRhdGUgKERCdXNDb25uZWN0aW9uICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNQcmVhbGxvY2F0ZWRTZW5kICpwcmVhbGxvY2F0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICAgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgICAgICAgKmNsaWVudF9zZXJpYWwpCit7CisgIGRidXNfdWludDMyX3Qgc2VyaWFsOworCisgIHByZWFsbG9jYXRlZC0+cXVldWVfbGluay0+ZGF0YSA9IG1lc3NhZ2U7CisgIF9kYnVzX2xpc3RfcHJlcGVuZF9saW5rICgmY29ubmVjdGlvbi0+b3V0Z29pbmdfbWVzc2FnZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVhbGxvY2F0ZWQtPnF1ZXVlX2xpbmspOworCisgIC8qIEl0J3MgT0sgdGhhdCB3ZSdsbCBuZXZlciBjYWxsIHRoZSBub3RpZnkgZnVuY3Rpb24sIGJlY2F1c2UgZm9yIHRoZQorICAgKiBvdXRnb2luZyBsaW1pdCwgdGhlcmUgaXNuJ3Qgb25lICovCisgIF9kYnVzX21lc3NhZ2VfYWRkX2NvdW50ZXJfbGluayAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVhbGxvY2F0ZWQtPmNvdW50ZXJfbGluayk7CisKKyAgZGJ1c19mcmVlIChwcmVhbGxvY2F0ZWQpOworICBwcmVhbGxvY2F0ZWQgPSBOVUxMOworICAKKyAgZGJ1c19tZXNzYWdlX3JlZiAobWVzc2FnZSk7CisgIAorICBjb25uZWN0aW9uLT5uX291dGdvaW5nICs9IDE7CisKKyAgX2RidXNfdmVyYm9zZSAoIk1lc3NhZ2UgJXAgKCVzICVzICVzICVzICclcycpIGZvciAlcyBhZGRlZCB0byBvdXRnb2luZyBxdWV1ZSAlcCwgJWQgcGVuZGluZyB0byBzZW5kXG4iLAorICAgICAgICAgICAgICAgICBtZXNzYWdlLAorICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfdHlwZV90b19zdHJpbmcgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkpLAorICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3BhdGggKG1lc3NhZ2UpID8KKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9wYXRoIChtZXNzYWdlKSA6CisgICAgICAgICAgICAgICAgICJubyBwYXRoIiwKKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG1lc3NhZ2UpID8KKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG1lc3NhZ2UpIDoKKyAgICAgICAgICAgICAgICAgIm5vIGludGVyZmFjZSIsCisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKSA/CisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKSA6CisgICAgICAgICAgICAgICAgICJubyBtZW1iZXIiLAorICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3NpZ25hdHVyZSAobWVzc2FnZSksCisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfZGVzdGluYXRpb24gKG1lc3NhZ2UpID8KKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9kZXN0aW5hdGlvbiAobWVzc2FnZSkgOgorICAgICAgICAgICAgICAgICAibnVsbCIsCisgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24tPm5fb3V0Z29pbmcpOworCisgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X3NlcmlhbCAobWVzc2FnZSkgPT0gMCkKKyAgICB7CisgICAgICBzZXJpYWwgPSBfZGJ1c19jb25uZWN0aW9uX2dldF9uZXh0X2NsaWVudF9zZXJpYWwgKGNvbm5lY3Rpb24pOworICAgICAgZGJ1c19tZXNzYWdlX3NldF9zZXJpYWwgKG1lc3NhZ2UsIHNlcmlhbCk7CisgICAgICBpZiAoY2xpZW50X3NlcmlhbCkKKyAgICAgICAgKmNsaWVudF9zZXJpYWwgPSBzZXJpYWw7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKGNsaWVudF9zZXJpYWwpCisgICAgICAgICpjbGllbnRfc2VyaWFsID0gZGJ1c19tZXNzYWdlX2dldF9zZXJpYWwgKG1lc3NhZ2UpOworICAgIH0KKworICBfZGJ1c192ZXJib3NlICgiTWVzc2FnZSAlcCBzZXJpYWwgaXMgJXVcbiIsCisgICAgICAgICAgICAgICAgIG1lc3NhZ2UsIGRidXNfbWVzc2FnZV9nZXRfc2VyaWFsIChtZXNzYWdlKSk7CisgIAorICBkYnVzX21lc3NhZ2VfbG9jayAobWVzc2FnZSk7CisKKyAgLyogTm93IHdlIG5lZWQgdG8gcnVuIGFuIGl0ZXJhdGlvbiB0byBob3BlZnVsbHkganVzdCB3cml0ZSB0aGUgbWVzc2FnZXMKKyAgICogb3V0IGltbWVkaWF0ZWx5LCBhbmQgb3RoZXJ3aXNlIGdldCB0aGVtIHF1ZXVlZCB1cAorICAgKi8KKyAgX2RidXNfY29ubmVjdGlvbl9kb19pdGVyYXRpb25fdW5sb2NrZWQgKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19JVEVSQVRJT05fRE9fV1JJVElORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xKTsKKworICAvKiBJZiBzdHVmZiBpcyBzdGlsbCBxdWV1ZWQgdXAsIGJlIHN1cmUgd2Ugd2FrZSB1cCB0aGUgbWFpbiBsb29wICovCisgIGlmIChjb25uZWN0aW9uLT5uX291dGdvaW5nID4gMCkKKyAgICBfZGJ1c19jb25uZWN0aW9uX3dha2V1cF9tYWlubG9vcCAoY29ubmVjdGlvbik7Cit9CisKK3N0YXRpYyB2b2lkCitfZGJ1c19jb25uZWN0aW9uX3NlbmRfcHJlYWxsb2NhdGVkX2FuZF91bmxvY2sgKERCdXNDb25uZWN0aW9uICAgICAgICpjb25uZWN0aW9uLAorCQkJCQkgICAgICAgREJ1c1ByZWFsbG9jYXRlZFNlbmQgKnByZWFsbG9jYXRlZCwKKwkJCQkJICAgICAgIERCdXNNZXNzYWdlICAgICAgICAgICptZXNzYWdlLAorCQkJCQkgICAgICAgZGJ1c191aW50MzJfdCAgICAgICAgKmNsaWVudF9zZXJpYWwpCit7CisgIERCdXNEaXNwYXRjaFN0YXR1cyBzdGF0dXM7CisKKyAgSEFWRV9MT0NLX0NIRUNLIChjb25uZWN0aW9uKTsKKyAgCisgIF9kYnVzX2Nvbm5lY3Rpb25fc2VuZF9wcmVhbGxvY2F0ZWRfdW5sb2NrZWRfbm9fdXBkYXRlIChjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlYWxsb2NhdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwgY2xpZW50X3NlcmlhbCk7CisKKyAgX2RidXNfdmVyYm9zZSAoIm1pZGRsZVxuIik7CisgIHN0YXR1cyA9IF9kYnVzX2Nvbm5lY3Rpb25fZ2V0X2Rpc3BhdGNoX3N0YXR1c191bmxvY2tlZCAoY29ubmVjdGlvbik7CisKKyAgLyogdGhpcyBjYWxscyBvdXQgdG8gdXNlciBjb2RlICovCisgIF9kYnVzX2Nvbm5lY3Rpb25fdXBkYXRlX2Rpc3BhdGNoX3N0YXR1c19hbmRfdW5sb2NrIChjb25uZWN0aW9uLCBzdGF0dXMpOworfQorCisvKioKKyAqIExpa2UgZGJ1c19jb25uZWN0aW9uX3NlbmQoKSwgYnV0IGFzc3VtZXMgdGhlIGNvbm5lY3Rpb24KKyAqIGlzIGFscmVhZHkgbG9ja2VkIG9uIGZ1bmN0aW9uIGVudHJ5LCBhbmQgdW5sb2NrcyBiZWZvcmUgcmV0dXJuaW5nLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB0byBzZW5kCisgKiBAcGFyYW0gY2xpZW50X3NlcmlhbCByZXR1cm4gbG9jYXRpb24gZm9yIGNsaWVudCBzZXJpYWwgb2Ygc2VudCBtZXNzYWdlCisgKiBAcmV0dXJucyAjRkFMU0Ugb24gb3V0LW9mLW1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfY29ubmVjdGlvbl9zZW5kX2FuZF91bmxvY2sgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorCQkJCSAgREJ1c01lc3NhZ2UgICAgKm1lc3NhZ2UsCisJCQkJICBkYnVzX3VpbnQzMl90ICAqY2xpZW50X3NlcmlhbCkKK3sKKyAgREJ1c1ByZWFsbG9jYXRlZFNlbmQgKnByZWFsbG9jYXRlZDsKKworICBfZGJ1c19hc3NlcnQgKGNvbm5lY3Rpb24gIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAobWVzc2FnZSAhPSBOVUxMKTsKKyAgCisgIHByZWFsbG9jYXRlZCA9IF9kYnVzX2Nvbm5lY3Rpb25fcHJlYWxsb2NhdGVfc2VuZF91bmxvY2tlZCAoY29ubmVjdGlvbik7CisgIGlmIChwcmVhbGxvY2F0ZWQgPT0gTlVMTCkKKyAgICB7CisgICAgICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIF9kYnVzX2Nvbm5lY3Rpb25fc2VuZF9wcmVhbGxvY2F0ZWRfYW5kX3VubG9jayAoY29ubmVjdGlvbiwKKwkJCQkJCSBwcmVhbGxvY2F0ZWQsCisJCQkJCQkgbWVzc2FnZSwKKwkJCQkJCSBjbGllbnRfc2VyaWFsKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogVXNlZCBpbnRlcm5hbGx5IHRvIGhhbmRsZSB0aGUgc2VtYW50aWNzIG9mIGRidXNfc2VydmVyX3NldF9uZXdfY29ubmVjdGlvbl9mdW5jdGlvbigpLgorICogSWYgdGhlIG5ldyBjb25uZWN0aW9uIGZ1bmN0aW9uIGRvZXMgbm90IHJlZiB0aGUgY29ubmVjdGlvbiwgd2Ugd2FudCB0byBjbG9zZSBpdC4KKyAqCisgKiBBIGJpdCBvZiBhIGhhY2ssIHByb2JhYmx5IHRoZSBuZXcgY29ubmVjdGlvbiBmdW5jdGlvbiBzaG91bGQgaGF2ZSByZXR1cm5lZCBhIHZhbHVlCisgKiBmb3Igd2hldGhlciB0byBjbG9zZSwgb3Igc2hvdWxkIGhhdmUgaGFkIHRvIGNsb3NlIHRoZSBjb25uZWN0aW9uIGl0c2VsZiBpZiBpdAorICogZGlkbid0IHdhbnQgaXQuCisgKgorICogQnV0LCB0aGlzIHdvcmtzIE9LIGFzIGxvbmcgYXMgdGhlIG5ldyBjb25uZWN0aW9uIGZ1bmN0aW9uIGRvZXNuJ3QgZG8gYW55dGhpbmcKKyAqIGNyYXp5IGxpa2Uga2VlcCB0aGUgY29ubmVjdGlvbiBhcm91bmQgd2l0aG91dCByZWYnaW5nIGl0LgorICoKKyAqIFdlIGhhdmUgdG8gbG9jayB0aGUgY29ubmVjdGlvbiBhY3Jvc3MgcmVmY291bnQgY2hlY2sgYW5kIGNsb3NlIGluIGNhc2UKKyAqIHRoZSBuZXcgY29ubmVjdGlvbiBmdW5jdGlvbiBzcGF3bnMgYSB0aHJlYWQgdGhhdCBjbG9zZXMgYW5kIHVucmVmcy4KKyAqIEluIHRoYXQgY2FzZSwgaWYgdGhlIGFwcCB0aHJlYWQKKyAqIGNsb3NlcyBhbmQgdW5yZWZzIGZpcnN0LCB3ZSdsbCBoYXJtbGVzc2x5IGNsb3NlIGFnYWluOyBpZiB0aGUgYXBwIHRocmVhZAorICogc3RpbGwgaGFzIHRoZSByZWYsIHdlJ2xsIGNsb3NlIGFuZCB0aGVuIHRoZSBhcHAgd2lsbCBjbG9zZSBoYXJtbGVzc2x5LgorICogSWYgdGhlIGFwcCB1bnJlZnMgd2l0aG91dCBjbG9zaW5nLCB0aGUgYXBwIGlzIGJyb2tlbiBzaW5jZSBpZiB0aGUKKyAqIGFwcCByZWZzIGZyb20gdGhlIG5ldyBjb25uZWN0aW9uIGZ1bmN0aW9uIGl0IGlzIHN1cHBvc2VkIHRvIGFsc28gY2xvc2UuCisgKgorICogSWYgd2UgZGlkbid0IGF0b21pY2FsbHkgY2hlY2sgdGhlIHJlZmNvdW50IGFuZCBjbG9zZSB3aXRoIHRoZSBsb2NrIGhlbGQKKyAqIHRob3VnaCwgd2UgY291bGQgc2NyZXcgdGhpcyB1cC4KKyAqIAorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24KKyAqLwordm9pZAorX2RidXNfY29ubmVjdGlvbl9jbG9zZV9pZl9vbmx5X29uZV9yZWYgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBkYnVzX2ludDMyX3QgcmVmY291bnQ7CisKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKworICByZWZjb3VudCA9IF9kYnVzX2F0b21pY19nZXQgKCZjb25uZWN0aW9uLT5yZWZjb3VudCk7CisgIC8qIFRoZSBjYWxsZXIgc2hvdWxkIGhhdmUgYXQgbGVhc3Qgb25lIHJlZiAqLworICBfZGJ1c19hc3NlcnQgKHJlZmNvdW50ID49IDEpOworCisgIGlmIChyZWZjb3VudCA9PSAxKQorICAgIF9kYnVzX2Nvbm5lY3Rpb25fY2xvc2VfcG9zc2libHlfc2hhcmVkX2FuZF91bmxvY2sgKGNvbm5lY3Rpb24pOworICBlbHNlCisgICAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworfQorCisKKy8qKgorICogV2hlbiBhIGZ1bmN0aW9uIHRoYXQgYmxvY2tzIGhhcyBiZWVuIGNhbGxlZCB3aXRoIGEgdGltZW91dCwgYW5kIHdlCisgKiBydW4gb3V0IG9mIG1lbW9yeSwgdGhlIHRpbWUgdG8gd2FpdCBmb3IgbWVtb3J5IGlzIGJhc2VkIG9uIHRoZQorICogdGltZW91dC4gSWYgdGhlIGNhbGxlciB3YXMgd2lsbGluZyB0byBibG9jayBhIGxvbmcgdGltZSB3ZSB3YWl0IGEKKyAqIHJlbGF0aXZlbHkgbG9uZyB0aW1lIGZvciBtZW1vcnksIGlmIHRoZXkgd2VyZSBvbmx5IHdpbGxpbmcgdG8gYmxvY2sKKyAqIGJyaWVmbHkgdGhlbiB3ZSByZXRyeSBmb3IgbWVtb3J5IGF0IGEgcmFwaWQgcmF0ZS4KKyAqCisgKiBAcGFyYW0gdGltZW91dF9taWxsaXNlY29uZHMgdGhlIHRpbWVvdXQgcmVxdWVzdGVkIGZvciBibG9ja2luZworICovCitzdGF0aWMgdm9pZAorX2RidXNfbWVtb3J5X3BhdXNlX2Jhc2VkX29uX3RpbWVvdXQgKGludCB0aW1lb3V0X21pbGxpc2Vjb25kcykKK3sKKyAgaWYgKHRpbWVvdXRfbWlsbGlzZWNvbmRzID09IC0xKQorICAgIF9kYnVzX3NsZWVwX21pbGxpc2Vjb25kcyAoMTAwMCk7CisgIGVsc2UgaWYgKHRpbWVvdXRfbWlsbGlzZWNvbmRzIDwgMTAwKQorICAgIDsgLyoganVzdCBidXN5IGxvb3AgKi8KKyAgZWxzZSBpZiAodGltZW91dF9taWxsaXNlY29uZHMgPD0gMTAwMCkKKyAgICBfZGJ1c19zbGVlcF9taWxsaXNlY29uZHMgKHRpbWVvdXRfbWlsbGlzZWNvbmRzIC8gMyk7CisgIGVsc2UKKyAgICBfZGJ1c19zbGVlcF9taWxsaXNlY29uZHMgKDEwMDApOworfQorCitzdGF0aWMgREJ1c01lc3NhZ2UgKgorZ2VuZXJhdGVfbG9jYWxfZXJyb3JfbWVzc2FnZSAoZGJ1c191aW50MzJfdCBzZXJpYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJvcl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyb3JfbXNnKQoreworICBEQnVzTWVzc2FnZSAqbWVzc2FnZTsKKyAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXcgKERCVVNfTUVTU0FHRV9UWVBFX0VSUk9SKTsKKyAgaWYgKCFtZXNzYWdlKQorICAgIGdvdG8gb3V0OworCisgIGlmICghZGJ1c19tZXNzYWdlX3NldF9lcnJvcl9uYW1lIChtZXNzYWdlLCBlcnJvcl9uYW1lKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgbWVzc2FnZSA9IE5VTEw7CisgICAgICBnb3RvIG91dDsgCisgICAgfQorCisgIGRidXNfbWVzc2FnZV9zZXRfbm9fcmVwbHkgKG1lc3NhZ2UsIFRSVUUpOyAKKworICBpZiAoIWRidXNfbWVzc2FnZV9zZXRfcmVwbHlfc2VyaWFsIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWwpKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICBtZXNzYWdlID0gTlVMTDsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAoZXJyb3JfbXNnICE9IE5VTEwpCisgICAgeworICAgICAgREJ1c01lc3NhZ2VJdGVyIGl0ZXI7CisKKyAgICAgIGRidXNfbWVzc2FnZV9pdGVyX2luaXRfYXBwZW5kIChtZXNzYWdlLCAmaXRlcik7CisgICAgICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYyAoJml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3JfbXNnKSkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICAgICAgbWVzc2FnZSA9IE5VTEw7CisJICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgIH0KKworIG91dDoKKyAgcmV0dXJuIG1lc3NhZ2U7Cit9CisKKy8qCisgKiBQZWVrIHRoZSBpbmNvbWluZyBxdWV1ZSB0byBzZWUgaWYgd2UgZ290IHJlcGx5IGZvciBhIHNwZWNpZmljIHNlcmlhbAorICovCitzdGF0aWMgZGJ1c19ib29sX3QKK19kYnVzX2Nvbm5lY3Rpb25fcGVla19mb3JfcmVwbHlfdW5sb2NrZWQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgIGNsaWVudF9zZXJpYWwpCit7CisgIERCdXNMaXN0ICpsaW5rOworICBIQVZFX0xPQ0tfQ0hFQ0sgKGNvbm5lY3Rpb24pOworCisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmY29ubmVjdGlvbi0+aW5jb21pbmdfbWVzc2FnZXMpOworCisgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgeworICAgICAgREJ1c01lc3NhZ2UgKnJlcGx5ID0gbGluay0+ZGF0YTsKKworICAgICAgaWYgKGRidXNfbWVzc2FnZV9nZXRfcmVwbHlfc2VyaWFsIChyZXBseSkgPT0gY2xpZW50X3NlcmlhbCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIlcyByZXBseSB0byAlZCBmb3VuZCBpbiBxdWV1ZVxuIiwgX0RCVVNfRlVOQ1RJT05fTkFNRSwgY2xpZW50X3NlcmlhbCk7CisgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIH0KKyAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZjb25uZWN0aW9uLT5pbmNvbWluZ19tZXNzYWdlcywgbGluayk7CisgICAgfQorCisgIHJldHVybiBGQUxTRTsKK30KKworLyogVGhpcyBpcyBzbGlnaHRseSBzdHJhbmdlIHNpbmNlIHdlIGNhbiBwb3AgYSBtZXNzYWdlIGhlcmUgd2l0aG91dAorICogdGhlIGRpc3BhdGNoIGxvY2suCisgKi8KK3N0YXRpYyBEQnVzTWVzc2FnZSoKK2NoZWNrX2Zvcl9yZXBseV91bmxvY2tlZCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgICBjbGllbnRfc2VyaWFsKQoreworICBEQnVzTGlzdCAqbGluazsKKworICBIQVZFX0xPQ0tfQ0hFQ0sgKGNvbm5lY3Rpb24pOworICAKKyAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZjb25uZWN0aW9uLT5pbmNvbWluZ19tZXNzYWdlcyk7CisKKyAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBEQnVzTWVzc2FnZSAqcmVwbHkgPSBsaW5rLT5kYXRhOworCisgICAgICBpZiAoZGJ1c19tZXNzYWdlX2dldF9yZXBseV9zZXJpYWwgKHJlcGx5KSA9PSBjbGllbnRfc2VyaWFsKQorCXsKKwkgIF9kYnVzX2xpc3RfcmVtb3ZlX2xpbmsgKCZjb25uZWN0aW9uLT5pbmNvbWluZ19tZXNzYWdlcywgbGluayk7CisJICBjb25uZWN0aW9uLT5uX2luY29taW5nICAtPSAxOworCSAgcmV0dXJuIHJlcGx5OworCX0KKyAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZjb25uZWN0aW9uLT5pbmNvbWluZ19tZXNzYWdlcywgbGluayk7CisgICAgfQorCisgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZAorY29ubmVjdGlvbl90aW1lb3V0X2FuZF9jb21wbGV0ZV9hbGxfcGVuZGluZ19jYWxsc191bmxvY2tlZCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgICAvKiBXZSBjYW4ndCBpdGVyYXRlIG92ZXIgdGhlIGhhc2ggaW4gdGhlIG5vcm1hbCB3YXkgc2luY2Ugd2UnbGwgYmUKKyAgICAqIGRyb3BwaW5nIHRoZSBsb2NrIGZvciBlYWNoIGl0ZW0uIFNvIHdlIHJlc3RhcnQgdGhlCisgICAgKiBpdGVyIGVhY2ggdGltZSBhcyB3ZSBkcmFpbiB0aGUgaGFzaCB0YWJsZS4KKyAgICAqLworICAgCisgICB3aGlsZSAoX2RidXNfaGFzaF90YWJsZV9nZXRfbl9lbnRyaWVzIChjb25uZWN0aW9uLT5wZW5kaW5nX3JlcGxpZXMpID4gMCkKKyAgICB7CisgICAgICBEQnVzUGVuZGluZ0NhbGwgKnBlbmRpbmc7CisgICAgICBEQnVzSGFzaEl0ZXIgaXRlcjsKKyAgICAgIAorICAgICAgX2RidXNfaGFzaF9pdGVyX2luaXQgKGNvbm5lY3Rpb24tPnBlbmRpbmdfcmVwbGllcywgJml0ZXIpOworICAgICAgX2RidXNfaGFzaF9pdGVyX25leHQgKCZpdGVyKTsKKyAgICAgICAKKyAgICAgIHBlbmRpbmcgPSBfZGJ1c19oYXNoX2l0ZXJfZ2V0X3ZhbHVlICgmaXRlcik7CisgICAgICBfZGJ1c19wZW5kaW5nX2NhbGxfcmVmX3VubG9ja2VkIChwZW5kaW5nKTsKKyAgICAgICAKKyAgICAgIF9kYnVzX3BlbmRpbmdfY2FsbF9xdWV1ZV90aW1lb3V0X2Vycm9yX3VubG9ja2VkIChwZW5kaW5nLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uKTsKKworICAgICAgaWYgKF9kYnVzX3BlbmRpbmdfY2FsbF9pc190aW1lb3V0X2FkZGVkX3VubG9ja2VkIChwZW5kaW5nKSkKKyAgICAgICAgICBfZGJ1c19jb25uZWN0aW9uX3JlbW92ZV90aW1lb3V0X3VubG9ja2VkIChjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3BlbmRpbmdfY2FsbF9nZXRfdGltZW91dF91bmxvY2tlZCAocGVuZGluZykpOworICAgICAgX2RidXNfcGVuZGluZ19jYWxsX3NldF90aW1lb3V0X2FkZGVkX3VubG9ja2VkIChwZW5kaW5nLCBGQUxTRSk7ICAgICAgIAorICAgICAgX2RidXNfaGFzaF9pdGVyX3JlbW92ZV9lbnRyeSAoJml0ZXIpOworCisgICAgICBfZGJ1c19wZW5kaW5nX2NhbGxfdW5yZWZfYW5kX3VubG9jayAocGVuZGluZyk7CisgICAgICBDT05ORUNUSU9OX0xPQ0sgKGNvbm5lY3Rpb24pOworICAgIH0KKyAgSEFWRV9MT0NLX0NIRUNLIChjb25uZWN0aW9uKTsKK30KKworc3RhdGljIHZvaWQKK2NvbXBsZXRlX3BlbmRpbmdfY2FsbF9hbmRfdW5sb2NrIChEQnVzQ29ubmVjdGlvbiAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1BlbmRpbmdDYWxsICpwZW5kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICAqbWVzc2FnZSkKK3sKKyAgX2RidXNfcGVuZGluZ19jYWxsX3NldF9yZXBseV91bmxvY2tlZCAocGVuZGluZywgbWVzc2FnZSk7CisgIF9kYnVzX3BlbmRpbmdfY2FsbF9yZWZfdW5sb2NrZWQgKHBlbmRpbmcpOyAvKiBpbiBjYXNlIHRoZXJlJ3Mgbm8gYXBwIHdpdGggYSByZWYgaGVsZCAqLworICBfZGJ1c19wZW5kaW5nX2NhbGxfc3RhcnRfY29tcGxldGlvbl91bmxvY2tlZChwZW5kaW5nKTsKKyAgX2RidXNfY29ubmVjdGlvbl9kZXRhY2hfcGVuZGluZ19jYWxsX2FuZF91bmxvY2sgKGNvbm5lY3Rpb24sIHBlbmRpbmcpOworCisgIC8qIE11c3QgYmUgY2FsbGVkIHVubG9ja2VkIHNpbmNlIGl0IGludm9rZXMgYXBwIGNhbGxiYWNrICovCisgIF9kYnVzX3BlbmRpbmdfY2FsbF9maW5pc2hfY29tcGxldGlvbiAocGVuZGluZyk7CisgIGRidXNfcGVuZGluZ19jYWxsX3VucmVmIChwZW5kaW5nKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19mb3JfcmVwbHlfYW5kX3VwZGF0ZV9kaXNwYXRjaF91bmxvY2tlZCAoREJ1c0Nvbm5lY3Rpb24gICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNQZW5kaW5nQ2FsbCAqcGVuZGluZykKK3sKKyAgREJ1c01lc3NhZ2UgKnJlcGx5OworICBEQnVzRGlzcGF0Y2hTdGF0dXMgc3RhdHVzOworCisgIHJlcGx5ID0gY2hlY2tfZm9yX3JlcGx5X3VubG9ja2VkIChjb25uZWN0aW9uLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3BlbmRpbmdfY2FsbF9nZXRfcmVwbHlfc2VyaWFsX3VubG9ja2VkIChwZW5kaW5nKSk7CisgIGlmIChyZXBseSAhPSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJjaGVja2VkIGZvciByZXBseVxuIik7CisKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJkYnVzX2Nvbm5lY3Rpb25fc2VuZF93aXRoX3JlcGx5X2FuZF9ibG9jaygpOiBnb3QgcmVwbHlcbiIpOworCisgICAgICBjb21wbGV0ZV9wZW5kaW5nX2NhbGxfYW5kX3VubG9jayAoY29ubmVjdGlvbiwgcGVuZGluZywgcmVwbHkpOworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisKKyAgICAgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisgICAgICBzdGF0dXMgPSBfZGJ1c19jb25uZWN0aW9uX2dldF9kaXNwYXRjaF9zdGF0dXNfdW5sb2NrZWQgKGNvbm5lY3Rpb24pOworICAgICAgX2RidXNfY29ubmVjdGlvbl91cGRhdGVfZGlzcGF0Y2hfc3RhdHVzX2FuZF91bmxvY2sgKGNvbm5lY3Rpb24sIHN0YXR1cyk7CisgICAgICBkYnVzX3BlbmRpbmdfY2FsbF91bnJlZiAocGVuZGluZyk7CisKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKgorICogQmxvY2tzIHVudGlsIGEgcGVuZGluZyBjYWxsIHRpbWVzIG91dCBvciBnZXRzIGEgcmVwbHkuCisgKgorICogRG9lcyBub3QgcmUtZW50ZXIgdGhlIG1haW4gbG9vcCBvciBydW4gZmlsdGVyL3BhdGgtcmVnaXN0ZXJlZAorICogY2FsbGJhY2tzLiBUaGUgcmVwbHkgdG8gdGhlIG1lc3NhZ2Ugd2lsbCBub3QgYmUgc2VlbiBieQorICogZmlsdGVyIGNhbGxiYWNrcy4KKyAqCisgKiBSZXR1cm5zIGltbWVkaWF0ZWx5IGlmIHBlbmRpbmcgY2FsbCBhbHJlYWR5IGdvdCBhIHJlcGx5LgorICogCisgKiBAdG9kbyBjb3VsZCB1c2UgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnRzIChpdCBrZWVwcyBzY2FubmluZworICogdGhlIHdob2xlIG1lc3NhZ2UgcXVldWUgZm9yIGV4YW1wbGUpCisgKgorICogQHBhcmFtIHBlbmRpbmcgdGhlIHBlbmRpbmcgY2FsbCB3ZSBibG9jayBmb3IgYSByZXBseSBvbgorICovCit2b2lkCitfZGJ1c19jb25uZWN0aW9uX2Jsb2NrX3BlbmRpbmdfY2FsbCAoREJ1c1BlbmRpbmdDYWxsICpwZW5kaW5nKQoreworICBsb25nIHN0YXJ0X3R2X3NlYywgc3RhcnRfdHZfdXNlYzsKKyAgbG9uZyB0dl9zZWMsIHR2X3VzZWM7CisgIERCdXNEaXNwYXRjaFN0YXR1cyBzdGF0dXM7CisgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uOworICBkYnVzX3VpbnQzMl90IGNsaWVudF9zZXJpYWw7CisgIERCdXNUaW1lb3V0ICp0aW1lb3V0OworICBpbnQgdGltZW91dF9taWxsaXNlY29uZHMsIGVsYXBzZWRfbWlsbGlzZWNvbmRzOworCisgIF9kYnVzX2Fzc2VydCAocGVuZGluZyAhPSBOVUxMKTsKKworICBpZiAoZGJ1c19wZW5kaW5nX2NhbGxfZ2V0X2NvbXBsZXRlZCAocGVuZGluZykpCisgICAgcmV0dXJuOworCisgIGRidXNfcGVuZGluZ19jYWxsX3JlZiAocGVuZGluZyk7IC8qIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZSBjYWxsIGNvdWxkIGJlIGNhbmNlbGVkICovCisKKyAgY29ubmVjdGlvbiA9IF9kYnVzX3BlbmRpbmdfY2FsbF9nZXRfY29ubmVjdGlvbl9hbmRfbG9jayAocGVuZGluZyk7CisgIAorICAvKiBGbHVzaCBtZXNzYWdlIHF1ZXVlIC0gbm90ZSwgY2FuIGFmZmVjdCBkaXNwYXRjaCBzdGF0dXMgKi8KKyAgX2RidXNfY29ubmVjdGlvbl9mbHVzaF91bmxvY2tlZCAoY29ubmVjdGlvbik7CisKKyAgY2xpZW50X3NlcmlhbCA9IF9kYnVzX3BlbmRpbmdfY2FsbF9nZXRfcmVwbHlfc2VyaWFsX3VubG9ja2VkIChwZW5kaW5nKTsKKworICAvKiBub3RlIHRoYXQgdGltZW91dF9taWxsaXNlY29uZHMgaXMgbGltaXRlZCB0byBhIHNtYWxsaXNoIHZhbHVlCisgICAqIGluIF9kYnVzX3BlbmRpbmdfY2FsbF9uZXcoKSBzbyBvdmVyZmxvd3MgYXJlbid0IHBvc3NpYmxlCisgICAqIGJlbG93CisgICAqLworICB0aW1lb3V0ID0gX2RidXNfcGVuZGluZ19jYWxsX2dldF90aW1lb3V0X3VubG9ja2VkIChwZW5kaW5nKTsKKyAgX2RidXNfZ2V0X21vbm90b25pY190aW1lICgmc3RhcnRfdHZfc2VjLCAmc3RhcnRfdHZfdXNlYyk7CisgIGlmICh0aW1lb3V0KQorICAgIHsKKyAgICAgIHRpbWVvdXRfbWlsbGlzZWNvbmRzID0gZGJ1c190aW1lb3V0X2dldF9pbnRlcnZhbCAodGltZW91dCk7CisKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJkYnVzX2Nvbm5lY3Rpb25fc2VuZF93aXRoX3JlcGx5X2FuZF9ibG9jaygpOiB3aWxsIGJsb2NrICVkIG1pbGxpc2Vjb25kcyBmb3IgcmVwbHkgc2VyaWFsICV1IGZyb20gJWxkIHNlYyAlbGQgdXNlY1xuIiwKKyAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXRfbWlsbGlzZWNvbmRzLAorICAgICAgICAgICAgICAgICAgICAgY2xpZW50X3NlcmlhbCwKKyAgICAgICAgICAgICAgICAgICAgIHN0YXJ0X3R2X3NlYywgc3RhcnRfdHZfdXNlYyk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgdGltZW91dF9taWxsaXNlY29uZHMgPSAtMTsKKworICAgICAgX2RidXNfdmVyYm9zZSAoImRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHlfYW5kX2Jsb2NrKCk6IHdpbGwgYmxvY2sgZm9yIHJlcGx5IHNlcmlhbCAldVxuIiwgY2xpZW50X3NlcmlhbCk7CisgICAgfQorCisgIC8qIGNoZWNrIHRvIHNlZSBpZiB3ZSBhbHJlYWR5IGdvdCB0aGUgZGF0YSBvZmYgdGhlIHNvY2tldCAqLworICAvKiBmcm9tIGFub3RoZXIgYmxvY2tlZCBwZW5kaW5nIGNhbGwgKi8KKyAgaWYgKGNoZWNrX2Zvcl9yZXBseV9hbmRfdXBkYXRlX2Rpc3BhdGNoX3VubG9ja2VkIChjb25uZWN0aW9uLCBwZW5kaW5nKSkKKyAgICByZXR1cm47CisKKyAgLyogTm93IHdlIHdhaXQuLi4gKi8KKyAgLyogYWx3YXlzIGJsb2NrIGF0IGxlYXN0IG9uY2UgYXMgd2Uga25vdyB3ZSBkb24ndCBoYXZlIHRoZSByZXBseSB5ZXQgKi8KKyAgX2RidXNfY29ubmVjdGlvbl9kb19pdGVyYXRpb25fdW5sb2NrZWQgKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19JVEVSQVRJT05fRE9fUkVBRElORyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0lURVJBVElPTl9CTE9DSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXRfbWlsbGlzZWNvbmRzKTsKKworIHJlY2hlY2tfc3RhdHVzOgorCisgIF9kYnVzX3ZlcmJvc2UgKCJ0b3Agb2YgcmVjaGVja1xuIik7CisgIAorICBIQVZFX0xPQ0tfQ0hFQ0sgKGNvbm5lY3Rpb24pOworICAKKyAgLyogcXVldWUgbWVzc2FnZXMgYW5kIGdldCBzdGF0dXMgKi8KKworICBzdGF0dXMgPSBfZGJ1c19jb25uZWN0aW9uX2dldF9kaXNwYXRjaF9zdGF0dXNfdW5sb2NrZWQgKGNvbm5lY3Rpb24pOworCisgIC8qIHRoZSBnZXRfY29tcGxldGVkKCkgaXMgaW4gY2FzZSBhIGRpc3BhdGNoKCkgd2hpbGUgd2Ugd2VyZSBibG9ja2luZworICAgKiBnb3QgdGhlIHJlcGx5IGluc3RlYWQgb2YgdXMuCisgICAqLworICBpZiAoX2RidXNfcGVuZGluZ19jYWxsX2dldF9jb21wbGV0ZWRfdW5sb2NrZWQgKHBlbmRpbmcpKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJQZW5kaW5nIGNhbGwgY29tcGxldGVkIGJ5IGRpc3BhdGNoXG4iKTsKKyAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fdXBkYXRlX2Rpc3BhdGNoX3N0YXR1c19hbmRfdW5sb2NrIChjb25uZWN0aW9uLCBzdGF0dXMpOworICAgICAgZGJ1c19wZW5kaW5nX2NhbGxfdW5yZWYgKHBlbmRpbmcpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgCisgIGlmIChzdGF0dXMgPT0gREJVU19ESVNQQVRDSF9EQVRBX1JFTUFJTlMpCisgICAgeworICAgICAgaWYgKGNoZWNrX2Zvcl9yZXBseV9hbmRfdXBkYXRlX2Rpc3BhdGNoX3VubG9ja2VkIChjb25uZWN0aW9uLCBwZW5kaW5nKSkKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgCisgIF9kYnVzX2dldF9tb25vdG9uaWNfdGltZSAoJnR2X3NlYywgJnR2X3VzZWMpOworICBlbGFwc2VkX21pbGxpc2Vjb25kcyA9ICh0dl9zZWMgLSBzdGFydF90dl9zZWMpICogMTAwMCArCisJICAodHZfdXNlYyAtIHN0YXJ0X3R2X3VzZWMpIC8gMTAwMDsKKyAgCisgIGlmICghX2RidXNfY29ubmVjdGlvbl9nZXRfaXNfY29ubmVjdGVkX3VubG9ja2VkIChjb25uZWN0aW9uKSkKKyAgICB7CisgICAgICBEQnVzTWVzc2FnZSAqZXJyb3JfbXNnOworCisgICAgICBlcnJvcl9tc2cgPSBnZW5lcmF0ZV9sb2NhbF9lcnJvcl9tZXNzYWdlIChjbGllbnRfc2VyaWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9ESVNDT05ORUNURUQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvbm5lY3Rpb24gd2FzIGRpc2Nvbm5lY3RlZCBiZWZvcmUgYSByZXBseSB3YXMgcmVjZWl2ZWQiKTsgCisKKyAgICAgIC8qIG9uIE9PTSBlcnJvcl9tc2cgaXMgc2V0IHRvIE5VTEwgKi8KKyAgICAgIGNvbXBsZXRlX3BlbmRpbmdfY2FsbF9hbmRfdW5sb2NrIChjb25uZWN0aW9uLCBwZW5kaW5nLCBlcnJvcl9tc2cpOworICAgICAgaWYgKGVycm9yX21zZyAhPSBOVUxMKQorICAgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKGVycm9yX21zZyk7CisgICAgICBkYnVzX3BlbmRpbmdfY2FsbF91bnJlZiAocGVuZGluZyk7CisgICAgICByZXR1cm47CisgICAgfQorICBlbHNlIGlmIChjb25uZWN0aW9uLT5kaXNjb25uZWN0X21lc3NhZ2VfbGluayA9PSBOVUxMKQorICAgIF9kYnVzX3ZlcmJvc2UgKCJkYnVzX2Nvbm5lY3Rpb25fc2VuZF93aXRoX3JlcGx5X2FuZF9ibG9jaygpOiBkaXNjb25uZWN0ZWRcbiIpOworICBlbHNlIGlmICh0aW1lb3V0ID09IE5VTEwpCisgICAgeworICAgICAgIGlmIChzdGF0dXMgPT0gREJVU19ESVNQQVRDSF9ORUVEX01FTU9SWSkKKyAgICAgICAgeworICAgICAgICAgIC8qIFRyeSBzbGVlcGluZyBhIGJpdCwgYXMgd2UgYXJlbid0IHN1cmUgd2UgbmVlZCB0byBibG9jayBmb3IgcmVhZGluZywKKyAgICAgICAgICAgKiB3ZSBtYXkgYWxyZWFkeSBoYXZlIGEgcmVwbHkgaW4gdGhlIGJ1ZmZlciBhbmQganVzdCBjYW4ndCBwcm9jZXNzCisgICAgICAgICAgICogaXQuCisgICAgICAgICAgICovCisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoImRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHlfYW5kX2Jsb2NrKCkgd2FpdGluZyBmb3IgbW9yZSBtZW1vcnlcbiIpOworCisgICAgICAgICAgX2RidXNfbWVtb3J5X3BhdXNlX2Jhc2VkX29uX3RpbWVvdXQgKHRpbWVvdXRfbWlsbGlzZWNvbmRzIC0gZWxhcHNlZF9taWxsaXNlY29uZHMpOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsgICAgICAgICAgCisgICAgICAgICAgLyogYmxvY2sgYWdhaW4sIHdlIGRvbid0IGhhdmUgdGhlIHJlcGx5IGJ1ZmZlcmVkIHlldC4gKi8KKyAgICAgICAgICBfZGJ1c19jb25uZWN0aW9uX2RvX2l0ZXJhdGlvbl91bmxvY2tlZCAoY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19JVEVSQVRJT05fRE9fUkVBRElORyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSVRFUkFUSU9OX0JMT0NLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0X21pbGxpc2Vjb25kcyAtIGVsYXBzZWRfbWlsbGlzZWNvbmRzKTsKKyAgICAgICAgfQorCisgICAgICBnb3RvIHJlY2hlY2tfc3RhdHVzOworICAgIH0KKyAgZWxzZSBpZiAodHZfc2VjIDwgc3RhcnRfdHZfc2VjKQorICAgIF9kYnVzX3ZlcmJvc2UgKCJkYnVzX2Nvbm5lY3Rpb25fc2VuZF93aXRoX3JlcGx5X2FuZF9ibG9jaygpOiBjbG9jayBzZXQgYmFja3dhcmRcbiIpOworICBlbHNlIGlmIChlbGFwc2VkX21pbGxpc2Vjb25kcyA8IHRpbWVvdXRfbWlsbGlzZWNvbmRzKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJkYnVzX2Nvbm5lY3Rpb25fc2VuZF93aXRoX3JlcGx5X2FuZF9ibG9jaygpOiAlZCBtaWxsaXNlY29uZHMgcmVtYWluXG4iLCB0aW1lb3V0X21pbGxpc2Vjb25kcyAtIGVsYXBzZWRfbWlsbGlzZWNvbmRzKTsKKyAgICAgIAorICAgICAgaWYgKHN0YXR1cyA9PSBEQlVTX0RJU1BBVENIX05FRURfTUVNT1JZKQorICAgICAgICB7CisgICAgICAgICAgLyogVHJ5IHNsZWVwaW5nIGEgYml0LCBhcyB3ZSBhcmVuJ3Qgc3VyZSB3ZSBuZWVkIHRvIGJsb2NrIGZvciByZWFkaW5nLAorICAgICAgICAgICAqIHdlIG1heSBhbHJlYWR5IGhhdmUgYSByZXBseSBpbiB0aGUgYnVmZmVyIGFuZCBqdXN0IGNhbid0IHByb2Nlc3MKKyAgICAgICAgICAgKiBpdC4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiZGJ1c19jb25uZWN0aW9uX3NlbmRfd2l0aF9yZXBseV9hbmRfYmxvY2soKSB3YWl0aW5nIGZvciBtb3JlIG1lbW9yeVxuIik7CisKKyAgICAgICAgICBfZGJ1c19tZW1vcnlfcGF1c2VfYmFzZWRfb25fdGltZW91dCAodGltZW91dF9taWxsaXNlY29uZHMgLSBlbGFwc2VkX21pbGxpc2Vjb25kcyk7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeyAgICAgICAgICAKKyAgICAgICAgICAvKiBibG9jayBhZ2Fpbiwgd2UgZG9uJ3QgaGF2ZSB0aGUgcmVwbHkgYnVmZmVyZWQgeWV0LiAqLworICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fZG9faXRlcmF0aW9uX3VubG9ja2VkIChjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0lURVJBVElPTl9ET19SRUFESU5HIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19JVEVSQVRJT05fQkxPQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXRfbWlsbGlzZWNvbmRzIC0gZWxhcHNlZF9taWxsaXNlY29uZHMpOworICAgICAgICB9CisKKyAgICAgIGdvdG8gcmVjaGVja19zdGF0dXM7CisgICAgfQorCisgIF9kYnVzX3ZlcmJvc2UgKCJkYnVzX2Nvbm5lY3Rpb25fc2VuZF93aXRoX3JlcGx5X2FuZF9ibG9jaygpOiBXYWl0ZWQgJWQgbWlsbGlzZWNvbmRzIGFuZCBnb3Qgbm8gcmVwbHlcbiIsCisgICAgICAgICAgICAgICAgIGVsYXBzZWRfbWlsbGlzZWNvbmRzKTsKKworICBfZGJ1c19hc3NlcnQgKCFfZGJ1c19wZW5kaW5nX2NhbGxfZ2V0X2NvbXBsZXRlZF91bmxvY2tlZCAocGVuZGluZykpOworICAKKyAgLyogdW5sb2NrIGFuZCBjYWxsIHVzZXIgY29kZSAqLworICBjb21wbGV0ZV9wZW5kaW5nX2NhbGxfYW5kX3VubG9jayAoY29ubmVjdGlvbiwgcGVuZGluZywgTlVMTCk7CisKKyAgLyogdXBkYXRlIHVzZXIgY29kZSBvbiBkaXNwYXRjaCBzdGF0dXMgKi8KKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKyAgc3RhdHVzID0gX2RidXNfY29ubmVjdGlvbl9nZXRfZGlzcGF0Y2hfc3RhdHVzX3VubG9ja2VkIChjb25uZWN0aW9uKTsKKyAgX2RidXNfY29ubmVjdGlvbl91cGRhdGVfZGlzcGF0Y2hfc3RhdHVzX2FuZF91bmxvY2sgKGNvbm5lY3Rpb24sIHN0YXR1cyk7CisgIGRidXNfcGVuZGluZ19jYWxsX3VucmVmIChwZW5kaW5nKTsKK30KKworLyoqCisgKiBSZXR1cm4gaG93IG1hbnkgZmlsZSBkZXNjcmlwdG9ycyBhcmUgcGVuZGluZyBpbiB0aGUgbG9hZGVyCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24KKyAqLworaW50CitfZGJ1c19jb25uZWN0aW9uX2dldF9wZW5kaW5nX2Zkc19jb3VudCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIHJldHVybiBfZGJ1c190cmFuc3BvcnRfZ2V0X3BlbmRpbmdfZmRzX2NvdW50IChjb25uZWN0aW9uLT50cmFuc3BvcnQpOworfQorCisvKioKKyAqIFJlZ2lzdGVyIGEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW5ldmVyIHRoZSBudW1iZXIgb2YgcGVuZGluZyBmaWxlCisgKiBkZXNjcmlwdG9ycyBpbiB0aGUgbG9hZGVyIGNoYW5nZS4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHBhcmFtIGNhbGxiYWNrIHRoZSBjYWxsYmFjaworICovCit2b2lkCitfZGJ1c19jb25uZWN0aW9uX3NldF9wZW5kaW5nX2Zkc19mdW5jdGlvbiAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1BlbmRpbmdGZHNDaGFuZ2VGdW5jdGlvbiBjYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhKQoreworICBfZGJ1c190cmFuc3BvcnRfc2V0X3BlbmRpbmdfZmRzX2Z1bmN0aW9uIChjb25uZWN0aW9uLT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLCBkYXRhKTsKK30KKworLyoqIEB9ICovCisKKy8qKgorICogQGFkZHRvZ3JvdXAgREJ1c0Nvbm5lY3Rpb24KKyAqCisgKiBAeworICovCisKKy8qKgorICogR2V0cyBhIGNvbm5lY3Rpb24gdG8gYSByZW1vdGUgYWRkcmVzcy4gSWYgYSBjb25uZWN0aW9uIHRvIHRoZSBnaXZlbgorICogYWRkcmVzcyBhbHJlYWR5IGV4aXN0cywgcmV0dXJucyB0aGUgZXhpc3RpbmcgY29ubmVjdGlvbiB3aXRoIGl0cworICogcmVmZXJlbmNlIGNvdW50IGluY3JlbWVudGVkLiAgT3RoZXJ3aXNlLCByZXR1cm5zIGEgbmV3IGNvbm5lY3Rpb24KKyAqIGFuZCBzYXZlcyB0aGUgbmV3IGNvbm5lY3Rpb24gZm9yIHBvc3NpYmxlIHJlLXVzZSBpZiBhIGZ1dHVyZSBjYWxsCisgKiB0byBkYnVzX2Nvbm5lY3Rpb25fb3BlbigpIGFza3MgdG8gY29ubmVjdCB0byB0aGUgc2FtZSBzZXJ2ZXIuCisgKgorICogVXNlIGRidXNfY29ubmVjdGlvbl9vcGVuX3ByaXZhdGUoKSB0byBnZXQgYSBkZWRpY2F0ZWQgY29ubmVjdGlvbgorICogbm90IHNoYXJlZCB3aXRoIG90aGVyIGNhbGxlcnMgb2YgZGJ1c19jb25uZWN0aW9uX29wZW4oKS4KKyAqCisgKiBJZiB0aGUgb3BlbiBmYWlscywgdGhlIGZ1bmN0aW9uIHJldHVybnMgI05VTEwsIGFuZCBwcm92aWRlcyBhCisgKiByZWFzb24gZm9yIHRoZSBmYWlsdXJlIGluIHRoZSBlcnJvciBwYXJhbWV0ZXIuIFBhc3MgI05VTEwgZm9yIHRoZQorICogZXJyb3IgcGFyYW1ldGVyIGlmIHlvdSBhcmVuJ3QgaW50ZXJlc3RlZCBpbiB0aGUgcmVhc29uIGZvcgorICogZmFpbHVyZS4KKyAqCisgKiBCZWNhdXNlIHRoaXMgY29ubmVjdGlvbiBpcyBzaGFyZWQsIG5vIHVzZXIgb2YgdGhlIGNvbm5lY3Rpb24KKyAqIG1heSBjYWxsIGRidXNfY29ubmVjdGlvbl9jbG9zZSgpLiBIb3dldmVyLCB3aGVuIHlvdSBhcmUgZG9uZSB3aXRoIHRoZQorICogY29ubmVjdGlvbiB5b3Ugc2hvdWxkIGNhbGwgZGJ1c19jb25uZWN0aW9uX3VucmVmKCkuCisgKgorICogQG5vdGUgUHJlZmVyIGRidXNfY29ubmVjdGlvbl9vcGVuKCkgdG8gZGJ1c19jb25uZWN0aW9uX29wZW5fcHJpdmF0ZSgpCisgKiB1bmxlc3MgeW91IGhhdmUgZ29vZCByZWFzb247IGNvbm5lY3Rpb25zIGFyZSBleHBlbnNpdmUgZW5vdWdoCisgKiB0aGF0IGl0J3Mgd2FzdGVmdWwgdG8gY3JlYXRlIGxvdHMgb2YgY29ubmVjdGlvbnMgdG8gdGhlIHNhbWUKKyAqIHNlcnZlci4KKyAqIAorICogQHBhcmFtIGFkZHJlc3MgdGhlIGFkZHJlc3MuCisgKiBAcGFyYW0gZXJyb3IgYWRkcmVzcyB3aGVyZSBhbiBlcnJvciBjYW4gYmUgcmV0dXJuZWQuCisgKiBAcmV0dXJucyBuZXcgY29ubmVjdGlvbiwgb3IgI05VTEwgb24gZmFpbHVyZS4KKyAqLworREJ1c0Nvbm5lY3Rpb24qCitkYnVzX2Nvbm5lY3Rpb25fb3BlbiAoY29uc3QgY2hhciAgICAgKmFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGFkZHJlc3MgIT0gTlVMTCwgTlVMTCk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZXJyb3JfaXNfc2V0IChlcnJvciwgTlVMTCk7CisKKyAgY29ubmVjdGlvbiA9IF9kYnVzX2Nvbm5lY3Rpb25fb3Blbl9pbnRlcm5hbCAoYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworCisgIHJldHVybiBjb25uZWN0aW9uOworfQorCisvKioKKyAqIE9wZW5zIGEgbmV3LCBkZWRpY2F0ZWQgY29ubmVjdGlvbiB0byBhIHJlbW90ZSBhZGRyZXNzLiBVbmxpa2UKKyAqIGRidXNfY29ubmVjdGlvbl9vcGVuKCksIGFsd2F5cyBjcmVhdGVzIGEgbmV3IGNvbm5lY3Rpb24uCisgKiBUaGlzIGNvbm5lY3Rpb24gd2lsbCBub3QgYmUgc2F2ZWQgb3IgcmVjeWNsZWQgYnkgbGliZGJ1cy4KKyAqCisgKiBJZiB0aGUgb3BlbiBmYWlscywgdGhlIGZ1bmN0aW9uIHJldHVybnMgI05VTEwsIGFuZCBwcm92aWRlcyBhCisgKiByZWFzb24gZm9yIHRoZSBmYWlsdXJlIGluIHRoZSBlcnJvciBwYXJhbWV0ZXIuIFBhc3MgI05VTEwgZm9yIHRoZQorICogZXJyb3IgcGFyYW1ldGVyIGlmIHlvdSBhcmVuJ3QgaW50ZXJlc3RlZCBpbiB0aGUgcmVhc29uIGZvcgorICogZmFpbHVyZS4KKyAqCisgKiBXaGVuIHlvdSBhcmUgZG9uZSB3aXRoIHRoaXMgY29ubmVjdGlvbiwgeW91IG11c3QKKyAqIGRidXNfY29ubmVjdGlvbl9jbG9zZSgpIHRvIGRpc2Nvbm5lY3QgaXQsCisgKiBhbmQgZGJ1c19jb25uZWN0aW9uX3VucmVmKCkgdG8gZnJlZSB0aGUgY29ubmVjdGlvbiBvYmplY3QuCisgKiAKKyAqIChUaGUgZGJ1c19jb25uZWN0aW9uX2Nsb3NlKCkgY2FuIGJlIHNraXBwZWQgaWYgdGhlCisgKiBjb25uZWN0aW9uIGlzIGFscmVhZHkga25vd24gdG8gYmUgZGlzY29ubmVjdGVkLCBmb3IgZXhhbXBsZQorICogaWYgeW91IGFyZSBpbnNpZGUgYSBoYW5kbGVyIGZvciB0aGUgRGlzY29ubmVjdGVkIHNpZ25hbC4pCisgKgorICogQG5vdGUgUHJlZmVyIGRidXNfY29ubmVjdGlvbl9vcGVuKCkgdG8gZGJ1c19jb25uZWN0aW9uX29wZW5fcHJpdmF0ZSgpCisgKiB1bmxlc3MgeW91IGhhdmUgZ29vZCByZWFzb247IGNvbm5lY3Rpb25zIGFyZSBleHBlbnNpdmUgZW5vdWdoCisgKiB0aGF0IGl0J3Mgd2FzdGVmdWwgdG8gY3JlYXRlIGxvdHMgb2YgY29ubmVjdGlvbnMgdG8gdGhlIHNhbWUKKyAqIHNlcnZlci4KKyAqCisgKiBAcGFyYW0gYWRkcmVzcyB0aGUgYWRkcmVzcy4KKyAqIEBwYXJhbSBlcnJvciBhZGRyZXNzIHdoZXJlIGFuIGVycm9yIGNhbiBiZSByZXR1cm5lZC4KKyAqIEByZXR1cm5zIG5ldyBjb25uZWN0aW9uLCBvciAjTlVMTCBvbiBmYWlsdXJlLgorICovCitEQnVzQ29ubmVjdGlvbioKK2RidXNfY29ubmVjdGlvbl9vcGVuX3ByaXZhdGUgKGNvbnN0IGNoYXIgICAgICphZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGFkZHJlc3MgIT0gTlVMTCwgTlVMTCk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZXJyb3JfaXNfc2V0IChlcnJvciwgTlVMTCk7CisKKyAgY29ubmVjdGlvbiA9IF9kYnVzX2Nvbm5lY3Rpb25fb3Blbl9pbnRlcm5hbCAoYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKKworICByZXR1cm4gY29ubmVjdGlvbjsKK30KKworLyoqCisgKiBJbmNyZW1lbnRzIHRoZSByZWZlcmVuY2UgY291bnQgb2YgYSBEQnVzQ29ubmVjdGlvbi4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbi4KKyAqIEByZXR1cm5zIHRoZSBjb25uZWN0aW9uLgorICovCitEQnVzQ29ubmVjdGlvbiAqCitkYnVzX2Nvbm5lY3Rpb25fcmVmIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgZGJ1c19pbnQzMl90IG9sZF9yZWZjb3VudDsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCwgTlVMTCk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoY29ubmVjdGlvbi0+Z2VuZXJhdGlvbiA9PSBfZGJ1c19jdXJyZW50X2dlbmVyYXRpb24sIE5VTEwpOworICBvbGRfcmVmY291bnQgPSBfZGJ1c19hdG9taWNfaW5jICgmY29ubmVjdGlvbi0+cmVmY291bnQpOworICBfZGJ1c19jb25uZWN0aW9uX3RyYWNlX3JlZiAoY29ubmVjdGlvbiwgb2xkX3JlZmNvdW50LCBvbGRfcmVmY291bnQgKyAxLAorICAgICAgInJlZiIpOworCisgIHJldHVybiBjb25uZWN0aW9uOworfQorCitzdGF0aWMgdm9pZAorZnJlZV9vdXRnb2luZ19tZXNzYWdlICh2b2lkICplbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhKQoreworICBEQnVzTWVzc2FnZSAqbWVzc2FnZSA9IGVsZW1lbnQ7CisgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uID0gZGF0YTsKKworICBfZGJ1c19tZXNzYWdlX3JlbW92ZV9jb3VudGVyIChtZXNzYWdlLCBjb25uZWN0aW9uLT5vdXRnb2luZ19jb3VudGVyKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKK30KKworLyogVGhpcyBpcyBydW4gd2l0aG91dCB0aGUgbXV0ZXggaGVsZCwgYnV0IGFmdGVyIHRoZSBsYXN0IHJlZmVyZW5jZQorICogdG8gdGhlIGNvbm5lY3Rpb24gaGFzIGJlZW4gZHJvcHBlZCB3ZSBzaG91bGQgaGF2ZSBubyB0aHJlYWQtcmVsYXRlZAorICogcHJvYmxlbXMKKyAqLworc3RhdGljIHZvaWQKK19kYnVzX2Nvbm5lY3Rpb25fbGFzdF91bnJlZiAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIERCdXNMaXN0ICpsaW5rOworCisgIF9kYnVzX3ZlcmJvc2UgKCJGaW5hbGl6aW5nIGNvbm5lY3Rpb24gJXBcbiIsIGNvbm5lY3Rpb24pOworCisgIF9kYnVzX2Fzc2VydCAoX2RidXNfYXRvbWljX2dldCAoJmNvbm5lY3Rpb24tPnJlZmNvdW50KSA9PSAwKTsKKworICAvKiBZb3UgaGF2ZSB0byBkaXNjb25uZWN0IHRoZSBjb25uZWN0aW9uIGJlZm9yZSB1bnJlZjppbmcgaXQuIE90aGVyd2lzZQorICAgKiB5b3Ugd29uJ3QgZ2V0IHRoZSBkaXNjb25uZWN0ZWQgbWVzc2FnZS4KKyAgICovCisgIF9kYnVzX2Fzc2VydCAoIV9kYnVzX3RyYW5zcG9ydF9nZXRfaXNfY29ubmVjdGVkIChjb25uZWN0aW9uLT50cmFuc3BvcnQpKTsKKyAgX2RidXNfYXNzZXJ0IChjb25uZWN0aW9uLT5zZXJ2ZXJfZ3VpZCA9PSBOVUxMKTsKKyAgCisgIC8qIC0tLS0gV2UncmUgZ29pbmcgdG8gY2FsbCB2YXJpb3VzIGFwcGxpY2F0aW9uIGNhbGxiYWNrcyBoZXJlLCBob3BlIGl0IGRvZXNuJ3QgYnJlYWsgYW55dGhpbmcuLi4gKi8KKyAgX2RidXNfb2JqZWN0X3RyZWVfZnJlZV9hbGxfdW5sb2NrZWQgKGNvbm5lY3Rpb24tPm9iamVjdHMpOworICAKKyAgZGJ1c19jb25uZWN0aW9uX3NldF9kaXNwYXRjaF9zdGF0dXNfZnVuY3Rpb24gKGNvbm5lY3Rpb24sIE5VTEwsIE5VTEwsIE5VTEwpOworICBkYnVzX2Nvbm5lY3Rpb25fc2V0X3dha2V1cF9tYWluX2Z1bmN0aW9uIChjb25uZWN0aW9uLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgZGJ1c19jb25uZWN0aW9uX3NldF91bml4X3VzZXJfZnVuY3Rpb24gKGNvbm5lY3Rpb24sIE5VTEwsIE5VTEwsIE5VTEwpOworICBkYnVzX2Nvbm5lY3Rpb25fc2V0X3dpbmRvd3NfdXNlcl9mdW5jdGlvbiAoY29ubmVjdGlvbiwgTlVMTCwgTlVMTCwgTlVMTCk7CisgIAorICBfZGJ1c193YXRjaF9saXN0X2ZyZWUgKGNvbm5lY3Rpb24tPndhdGNoZXMpOworICBjb25uZWN0aW9uLT53YXRjaGVzID0gTlVMTDsKKyAgCisgIF9kYnVzX3RpbWVvdXRfbGlzdF9mcmVlIChjb25uZWN0aW9uLT50aW1lb3V0cyk7CisgIGNvbm5lY3Rpb24tPnRpbWVvdXRzID0gTlVMTDsKKworICBfZGJ1c19kYXRhX3Nsb3RfbGlzdF9mcmVlICgmY29ubmVjdGlvbi0+c2xvdF9saXN0KTsKKyAgCisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmY29ubmVjdGlvbi0+ZmlsdGVyX2xpc3QpOworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIERCdXNNZXNzYWdlRmlsdGVyICpmaWx0ZXIgPSBsaW5rLT5kYXRhOworICAgICAgREJ1c0xpc3QgKm5leHQgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZjb25uZWN0aW9uLT5maWx0ZXJfbGlzdCwgbGluayk7CisKKyAgICAgIGZpbHRlci0+ZnVuY3Rpb24gPSBOVUxMOworICAgICAgX2RidXNfbWVzc2FnZV9maWx0ZXJfdW5yZWYgKGZpbHRlcik7IC8qIGNhbGxzIGFwcCBjYWxsYmFjayAqLworICAgICAgbGluay0+ZGF0YSA9IE5VTEw7CisgICAgICAKKyAgICAgIGxpbmsgPSBuZXh0OworICAgIH0KKyAgX2RidXNfbGlzdF9jbGVhciAoJmNvbm5lY3Rpb24tPmZpbHRlcl9saXN0KTsKKyAgCisgIC8qIC0tLS0gRG9uZSB3aXRoIHN0dWZmIHRoYXQgaW52b2tlcyBhcHBsaWNhdGlvbiBjYWxsYmFja3MgKi8KKworICBfZGJ1c19vYmplY3RfdHJlZV91bnJlZiAoY29ubmVjdGlvbi0+b2JqZWN0cyk7ICAKKworICBfZGJ1c19oYXNoX3RhYmxlX3VucmVmIChjb25uZWN0aW9uLT5wZW5kaW5nX3JlcGxpZXMpOworICBjb25uZWN0aW9uLT5wZW5kaW5nX3JlcGxpZXMgPSBOVUxMOworICAKKyAgX2RidXNfbGlzdF9mb3JlYWNoICgmY29ubmVjdGlvbi0+b3V0Z29pbmdfbWVzc2FnZXMsCisgICAgICAgICAgICAgICAgICAgICAgZnJlZV9vdXRnb2luZ19tZXNzYWdlLAorCQkgICAgICBjb25uZWN0aW9uKTsKKyAgX2RidXNfbGlzdF9jbGVhciAoJmNvbm5lY3Rpb24tPm91dGdvaW5nX21lc3NhZ2VzKTsKKyAgCisgIF9kYnVzX2xpc3RfZm9yZWFjaCAoJmNvbm5lY3Rpb24tPmluY29taW5nX21lc3NhZ2VzLAorCQkgICAgICAoREJ1c0ZvcmVhY2hGdW5jdGlvbikgZGJ1c19tZXNzYWdlX3VucmVmLAorCQkgICAgICBOVUxMKTsKKyAgX2RidXNfbGlzdF9jbGVhciAoJmNvbm5lY3Rpb24tPmluY29taW5nX21lc3NhZ2VzKTsKKworICBfZGJ1c19jb3VudGVyX3VucmVmIChjb25uZWN0aW9uLT5vdXRnb2luZ19jb3VudGVyKTsKKworICBfZGJ1c190cmFuc3BvcnRfdW5yZWYgKGNvbm5lY3Rpb24tPnRyYW5zcG9ydCk7CisKKyAgaWYgKGNvbm5lY3Rpb24tPmRpc2Nvbm5lY3RfbWVzc2FnZV9saW5rKQorICAgIHsKKyAgICAgIERCdXNNZXNzYWdlICptZXNzYWdlID0gY29ubmVjdGlvbi0+ZGlzY29ubmVjdF9tZXNzYWdlX2xpbmstPmRhdGE7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgX2RidXNfbGlzdF9mcmVlX2xpbmsgKGNvbm5lY3Rpb24tPmRpc2Nvbm5lY3RfbWVzc2FnZV9saW5rKTsKKyAgICB9CisKKyAgX2RidXNfY29uZHZhcl9mcmVlX2F0X2xvY2F0aW9uICgmY29ubmVjdGlvbi0+ZGlzcGF0Y2hfY29uZCk7CisgIF9kYnVzX2NvbmR2YXJfZnJlZV9hdF9sb2NhdGlvbiAoJmNvbm5lY3Rpb24tPmlvX3BhdGhfY29uZCk7CisKKyAgX2RidXNfY211dGV4X2ZyZWVfYXRfbG9jYXRpb24gKCZjb25uZWN0aW9uLT5pb19wYXRoX211dGV4KTsKKyAgX2RidXNfY211dGV4X2ZyZWVfYXRfbG9jYXRpb24gKCZjb25uZWN0aW9uLT5kaXNwYXRjaF9tdXRleCk7CisKKyAgX2RidXNfcm11dGV4X2ZyZWVfYXRfbG9jYXRpb24gKCZjb25uZWN0aW9uLT5zbG90X211dGV4KTsKKworICBfZGJ1c19ybXV0ZXhfZnJlZV9hdF9sb2NhdGlvbiAoJmNvbm5lY3Rpb24tPm11dGV4KTsKKyAgCisgIGRidXNfZnJlZSAoY29ubmVjdGlvbik7Cit9CisKKy8qKgorICogRGVjcmVtZW50cyB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIGEgREJ1c0Nvbm5lY3Rpb24sIGFuZCBmaW5hbGl6ZXMKKyAqIGl0IGlmIHRoZSBjb3VudCByZWFjaGVzIHplcm8uCisgKgorICogTm90ZTogaXQgaXMgYSBidWcgdG8gZHJvcCB0aGUgbGFzdCByZWZlcmVuY2UgdG8gYSBjb25uZWN0aW9uIHRoYXQKKyAqIGlzIHN0aWxsIGNvbm5lY3RlZC4KKyAqCisgKiBGb3Igc2hhcmVkIGNvbm5lY3Rpb25zLCBsaWJkYnVzIHdpbGwgb3duIGEgcmVmZXJlbmNlCisgKiBhcyBsb25nIGFzIHRoZSBjb25uZWN0aW9uIGlzIGNvbm5lY3RlZCwgc28geW91IGNhbiBrbm93IHRoYXQgZWl0aGVyCisgKiB5b3UgZG9uJ3QgaGF2ZSB0aGUgbGFzdCByZWZlcmVuY2UsIG9yIGl0J3MgT0sgdG8gZHJvcCB0aGUgbGFzdCByZWZlcmVuY2UuCisgKiBNb3N0IGNvbm5lY3Rpb25zIGFyZSBzaGFyZWQuIGRidXNfY29ubmVjdGlvbl9vcGVuKCkgYW5kIGRidXNfYnVzX2dldCgpCisgKiByZXR1cm4gc2hhcmVkIGNvbm5lY3Rpb25zLgorICoKKyAqIEZvciBwcml2YXRlIGNvbm5lY3Rpb25zLCB0aGUgY3JlYXRvciBvZiB0aGUgY29ubmVjdGlvbiBtdXN0IGFycmFuZ2UgZm9yCisgKiBkYnVzX2Nvbm5lY3Rpb25fY2xvc2UoKSB0byBiZSBjYWxsZWQgcHJpb3IgdG8gZHJvcHBpbmcgdGhlIGxhc3QgcmVmZXJlbmNlLgorICogUHJpdmF0ZSBjb25uZWN0aW9ucyBjb21lIGZyb20gZGJ1c19jb25uZWN0aW9uX29wZW5fcHJpdmF0ZSgpIG9yIGRidXNfYnVzX2dldF9wcml2YXRlKCkuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24uCisgKi8KK3ZvaWQKK2RidXNfY29ubmVjdGlvbl91bnJlZiAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIGRidXNfaW50MzJfdCBvbGRfcmVmY291bnQ7CisKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCk7CisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChjb25uZWN0aW9uLT5nZW5lcmF0aW9uID09IF9kYnVzX2N1cnJlbnRfZ2VuZXJhdGlvbik7CisKKyAgb2xkX3JlZmNvdW50ID0gX2RidXNfYXRvbWljX2RlYyAoJmNvbm5lY3Rpb24tPnJlZmNvdW50KTsKKworICBfZGJ1c19jb25uZWN0aW9uX3RyYWNlX3JlZiAoY29ubmVjdGlvbiwgb2xkX3JlZmNvdW50LCBvbGRfcmVmY291bnQgLSAxLAorICAgICAgInVucmVmIik7CisKKyAgaWYgKG9sZF9yZWZjb3VudCA9PSAxKQorICAgIHsKKyNpZm5kZWYgREJVU19ESVNBQkxFX0NIRUNLUworICAgICAgaWYgKF9kYnVzX3RyYW5zcG9ydF9nZXRfaXNfY29ubmVjdGVkIChjb25uZWN0aW9uLT50cmFuc3BvcnQpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2Fybl9jaGVja19mYWlsZWQgKCJUaGUgbGFzdCByZWZlcmVuY2Ugb24gYSBjb25uZWN0aW9uIHdhcyBkcm9wcGVkIHdpdGhvdXQgY2xvc2luZyB0aGUgY29ubmVjdGlvbi4gVGhpcyBpcyBhIGJ1ZyBpbiBhbiBhcHBsaWNhdGlvbi4gU2VlIGRidXNfY29ubmVjdGlvbl91bnJlZigpIGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMuXG4lcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24tPnNoYXJlYWJsZSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNb3N0IGxpa2VseSwgdGhlIGFwcGxpY2F0aW9uIGNhbGxlZCB1bnJlZigpIHRvbyBtYW55IHRpbWVzIGFuZCByZW1vdmVkIGEgcmVmZXJlbmNlIGJlbG9uZ2luZyB0byBsaWJkYnVzLCBzaW5jZSB0aGlzIGlzIGEgc2hhcmVkIGNvbm5lY3Rpb24uIiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTW9zdCBsaWtlbHksIHRoZSBhcHBsaWNhdGlvbiB3YXMgc3VwcG9zZWQgdG8gY2FsbCBkYnVzX2Nvbm5lY3Rpb25fY2xvc2UoKSwgc2luY2UgdGhpcyBpcyBhIHByaXZhdGUgY29ubmVjdGlvbi4iKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgX2RidXNfY29ubmVjdGlvbl9sYXN0X3VucmVmIChjb25uZWN0aW9uKTsKKyAgICB9Cit9CisKKy8qCisgKiBOb3RlIHRoYXQgdGhlIHRyYW5zcG9ydCBjYW4gZGlzY29ubmVjdCBpdHNlbGYgKG90aGVyIGVuZCBkcm9wcyB1cykKKyAqIGFuZCBpbiB0aGF0IGNhc2UgdGhpcyBmdW5jdGlvbiBuZXZlciBydW5zLiBTbyB0aGlzIGZ1bmN0aW9uIG11c3QKKyAqIG5vdCBkbyBhbnl0aGluZyBtb3JlIHRoYW4gZGlzY29ubmVjdCB0aGUgdHJhbnNwb3J0IGFuZCB1cGRhdGUgdGhlCisgKiBkaXNwYXRjaCBzdGF0dXMuCisgKiAKKyAqIElmIHRoZSB0cmFuc3BvcnQgc2VsZi1kaXNjb25uZWN0cywgdGhlbiB3ZSBhc3N1bWUgc29tZW9uZSB3aWxsCisgKiBkaXNwYXRjaCB0aGUgY29ubmVjdGlvbiB0byBjYXVzZSB0aGUgZGlzcGF0Y2ggc3RhdHVzIHVwZGF0ZS4KKyAqLworc3RhdGljIHZvaWQKK19kYnVzX2Nvbm5lY3Rpb25fY2xvc2VfcG9zc2libHlfc2hhcmVkX2FuZF91bmxvY2sgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBEQnVzRGlzcGF0Y2hTdGF0dXMgc3RhdHVzOworCisgIEhBVkVfTE9DS19DSEVDSyAoY29ubmVjdGlvbik7CisgIAorICBfZGJ1c192ZXJib3NlICgiRGlzY29ubmVjdGluZyAlcFxuIiwgY29ubmVjdGlvbik7CisKKyAgLyogV2UgbmVlZCB0byByZWYgYmVjYXVzZSB1cGRhdGVfZGlzcGF0Y2hfc3RhdHVzX2FuZF91bmxvY2sgd2lsbCB1bnJlZgorICAgKiB0aGUgY29ubmVjdGlvbiBpZiBpdCB3YXMgc2hhcmVkIGFuZCBsaWJkYnVzIHdhcyB0aGUgb25seSByZW1haW5pbmcKKyAgICogcmVmY291bnQgaG9sZGVyLgorICAgKi8KKyAgX2RidXNfY29ubmVjdGlvbl9yZWZfdW5sb2NrZWQgKGNvbm5lY3Rpb24pOworICAKKyAgX2RidXNfdHJhbnNwb3J0X2Rpc2Nvbm5lY3QgKGNvbm5lY3Rpb24tPnRyYW5zcG9ydCk7CisKKyAgLyogVGhpcyBoYXMgdGhlIHNpZGUgZWZmZWN0IG9mIHF1ZXVpbmcgdGhlIGRpc2Nvbm5lY3QgbWVzc2FnZSBsaW5rCisgICAqICh1bmxlc3Mgd2UgZG9uJ3QgaGF2ZSBlbm91Z2ggbWVtb3J5LCBwb3NzaWJseSwgc28gZG9uJ3QgYXNzZXJ0IGl0KS4KKyAgICogQWZ0ZXIgdGhlIGRpc2Nvbm5lY3QgbWVzc2FnZSBsaW5rIGlzIHF1ZXVlZCwgZGJ1c19idXNfZ2V0L2RidXNfY29ubmVjdGlvbl9vcGVuCisgICAqIHNob3VsZCBuZXZlciBhZ2FpbiByZXR1cm4gdGhlIG5ld2x5LWRpc2Nvbm5lY3RlZCBjb25uZWN0aW9uLgorICAgKgorICAgKiBIb3dldmVyLCB3ZSBvbmx5IHVucmVmIHRoZSBzaGFyZWQgY29ubmVjdGlvbiBhbmQgZXhpdF9vbl9kaXNjb25uZWN0IHdoZW4KKyAgICogdGhlIGRpc2Nvbm5lY3QgbWVzc2FnZSByZWFjaGVzIHRoZSBoZWFkIG9mIHRoZSBtZXNzYWdlIHF1ZXVlLAorICAgKiBOT1Qgd2hlbiBpdCdzIGZpcnN0IHF1ZXVlZC4KKyAgICovCisgIHN0YXR1cyA9IF9kYnVzX2Nvbm5lY3Rpb25fZ2V0X2Rpc3BhdGNoX3N0YXR1c191bmxvY2tlZCAoY29ubmVjdGlvbik7CisKKyAgLyogVGhpcyBjYWxscyBvdXQgdG8gdXNlciBjb2RlICovCisgIF9kYnVzX2Nvbm5lY3Rpb25fdXBkYXRlX2Rpc3BhdGNoX3N0YXR1c19hbmRfdW5sb2NrIChjb25uZWN0aW9uLCBzdGF0dXMpOworCisgIC8qIENvdWxkIGFsc28gY2FsbCBvdXQgdG8gdXNlciBjb2RlICovCisgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoY29ubmVjdGlvbik7Cit9CisKKy8qKgorICogQ2xvc2VzIGEgcHJpdmF0ZSBjb25uZWN0aW9uLCBzbyBubyBmdXJ0aGVyIGRhdGEgY2FuIGJlIHNlbnQgb3IgcmVjZWl2ZWQuCisgKiBUaGlzIGRpc2Nvbm5lY3RzIHRoZSB0cmFuc3BvcnQgKHN1Y2ggYXMgYSBzb2NrZXQpIHVuZGVybHlpbmcgdGhlCisgKiBjb25uZWN0aW9uLgorICoKKyAqIEF0dGVtcHRzIHRvIHNlbmQgbWVzc2FnZXMgYWZ0ZXIgY2xvc2luZyBhIGNvbm5lY3Rpb24gYXJlIHNhZmUsIGJ1dCB3aWxsIHJlc3VsdCBpbgorICogZXJyb3IgcmVwbGllcyBnZW5lcmF0ZWQgbG9jYWxseSBpbiBsaWJkYnVzLgorICogCisgKiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGFmZmVjdCB0aGUgY29ubmVjdGlvbidzIHJlZmVyZW5jZSBjb3VudC4gIEl0J3MKKyAqIHNhZmUgdG8gY2xvc2UgYSBjb25uZWN0aW9uIG1vcmUgdGhhbiBvbmNlOyBhbGwgY2FsbHMgYWZ0ZXIgdGhlCisgKiBmaXJzdCBkbyBub3RoaW5nLiBJdCdzIGltcG9zc2libGUgdG8gInJlb3BlbiIgYSBjb25uZWN0aW9uLCBhCisgKiBuZXcgY29ubmVjdGlvbiBtdXN0IGJlIGNyZWF0ZWQuIFRoaXMgZnVuY3Rpb24gbWF5IHJlc3VsdCBpbiBhIGNhbGwKKyAqIHRvIHRoZSBEQnVzRGlzcGF0Y2hTdGF0dXNGdW5jdGlvbiBzZXQgd2l0aAorICogZGJ1c19jb25uZWN0aW9uX3NldF9kaXNwYXRjaF9zdGF0dXNfZnVuY3Rpb24oKSwgYXMgdGhlIGRpc2Nvbm5lY3QKKyAqIG1lc3NhZ2UgaXQgZ2VuZXJhdGVzIG5lZWRzIHRvIGJlIGRpc3BhdGNoZWQuCisgKgorICogSWYgYSBjb25uZWN0aW9uIGlzIGRyb3BwZWQgYnkgdGhlIHJlbW90ZSBhcHBsaWNhdGlvbiwgaXQgd2lsbAorICogY2xvc2UgaXRzZWxmLiAKKyAqIAorICogWW91IG11c3QgY2xvc2UgYSBjb25uZWN0aW9uIHByaW9yIHRvIHJlbGVhc2luZyB0aGUgbGFzdCByZWZlcmVuY2UgdG8KKyAqIHRoZSBjb25uZWN0aW9uLiBJZiB5b3UgZGJ1c19jb25uZWN0aW9uX3VucmVmKCkgZm9yIHRoZSBsYXN0IHRpbWUKKyAqIHdpdGhvdXQgY2xvc2luZyB0aGUgY29ubmVjdGlvbiwgdGhlIHJlc3VsdHMgYXJlIHVuZGVmaW5lZDsgaXQKKyAqIGlzIGEgYnVnIGluIHlvdXIgcHJvZ3JhbSBhbmQgbGliZGJ1cyB3aWxsIHRyeSB0byBwcmludCBhIHdhcm5pbmcuCisgKgorICogWW91IG1heSBub3QgY2xvc2UgYSBzaGFyZWQgY29ubmVjdGlvbi4gQ29ubmVjdGlvbnMgY3JlYXRlZCB3aXRoCisgKiBkYnVzX2Nvbm5lY3Rpb25fb3BlbigpIG9yIGRidXNfYnVzX2dldCgpIGFyZSBzaGFyZWQuCisgKiBUaGVzZSBjb25uZWN0aW9ucyBhcmUgb3duZWQgYnkgbGliZGJ1cywgYW5kIGFwcGxpY2F0aW9ucyBzaG91bGQKKyAqIG9ubHkgdW5yZWYgdGhlbSwgbmV2ZXIgY2xvc2UgdGhlbS4gQXBwbGljYXRpb25zIGNhbiBrbm93IGl0IGlzCisgKiBzYWZlIHRvIHVucmVmIHRoZXNlIGNvbm5lY3Rpb25zIGJlY2F1c2UgbGliZGJ1cyB3aWxsIGJlIGhvbGRpbmcgYQorICogcmVmZXJlbmNlIGFzIGxvbmcgYXMgdGhlIGNvbm5lY3Rpb24gaXMgb3Blbi4gVGh1cywgZWl0aGVyIHRoZQorICogY29ubmVjdGlvbiBpcyBjbG9zZWQgYW5kIGl0IGlzIE9LIHRvIGRyb3AgdGhlIGxhc3QgcmVmZXJlbmNlLAorICogb3IgdGhlIGNvbm5lY3Rpb24gaXMgb3BlbiBhbmQgdGhlIGFwcCBrbm93cyBpdCBkb2VzIG5vdCBoYXZlIHRoZQorICogbGFzdCByZWZlcmVuY2UuCisgKgorICogQ29ubmVjdGlvbnMgY3JlYXRlZCB3aXRoIGRidXNfY29ubmVjdGlvbl9vcGVuX3ByaXZhdGUoKSBvcgorICogZGJ1c19idXNfZ2V0X3ByaXZhdGUoKSBhcmUgbm90IGtlcHQgdHJhY2sgb2Ygb3IgcmVmZXJlbmNlZCBieQorICogbGliZGJ1cy4gVGhlIGNyZWF0b3Igb2YgdGhlc2UgY29ubmVjdGlvbnMgaXMgcmVzcG9uc2libGUgZm9yCisgKiBjYWxsaW5nIGRidXNfY29ubmVjdGlvbl9jbG9zZSgpIHByaW9yIHRvIHJlbGVhc2luZyB0aGUgbGFzdAorICogcmVmZXJlbmNlLCBpZiB0aGUgY29ubmVjdGlvbiBpcyBub3QgYWxyZWFkeSBkaXNjb25uZWN0ZWQuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIHByaXZhdGUgKHVuc2hhcmVkKSBjb25uZWN0aW9uIHRvIGNsb3NlCisgKi8KK3ZvaWQKK2RidXNfY29ubmVjdGlvbl9jbG9zZSAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwpOworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAoY29ubmVjdGlvbi0+Z2VuZXJhdGlvbiA9PSBfZGJ1c19jdXJyZW50X2dlbmVyYXRpb24pOworCisgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisKKyNpZm5kZWYgREJVU19ESVNBQkxFX0NIRUNLUworICBpZiAoY29ubmVjdGlvbi0+c2hhcmVhYmxlKQorICAgIHsKKyAgICAgIENPTk5FQ1RJT05fVU5MT0NLIChjb25uZWN0aW9uKTsKKworICAgICAgX2RidXNfd2Fybl9jaGVja19mYWlsZWQgKCJBcHBsaWNhdGlvbnMgbXVzdCBub3QgY2xvc2Ugc2hhcmVkIGNvbm5lY3Rpb25zIC0gc2VlIGRidXNfY29ubmVjdGlvbl9jbG9zZSgpIGRvY3MuIFRoaXMgaXMgYSBidWcgaW4gdGhlIGFwcGxpY2F0aW9uLiIpOworICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZgorICAKKyAgX2RidXNfY29ubmVjdGlvbl9jbG9zZV9wb3NzaWJseV9zaGFyZWRfYW5kX3VubG9jayAoY29ubmVjdGlvbik7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorX2RidXNfY29ubmVjdGlvbl9nZXRfaXNfY29ubmVjdGVkX3VubG9ja2VkIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgSEFWRV9MT0NLX0NIRUNLIChjb25uZWN0aW9uKTsKKyAgcmV0dXJuIF9kYnVzX3RyYW5zcG9ydF9nZXRfaXNfY29ubmVjdGVkIChjb25uZWN0aW9uLT50cmFuc3BvcnQpOworfQorCisvKioKKyAqIEdldHMgd2hldGhlciB0aGUgY29ubmVjdGlvbiBpcyBjdXJyZW50bHkgb3Blbi4gIEEgY29ubmVjdGlvbiBtYXkKKyAqIGJlY29tZSBkaXNjb25uZWN0ZWQgd2hlbiB0aGUgcmVtb3RlIGFwcGxpY2F0aW9uIGNsb3NlcyBpdHMgZW5kLCBvcgorICogZXhpdHM7IGEgY29ubmVjdGlvbiBtYXkgYWxzbyBiZSBkaXNjb25uZWN0ZWQgd2l0aAorICogZGJ1c19jb25uZWN0aW9uX2Nsb3NlKCkuCisgKiAKKyAqIFRoZXJlIGFyZSBub3Qgc2VwYXJhdGUgc3RhdGVzIGZvciAiY2xvc2VkIiBhbmQgImRpc2Nvbm5lY3RlZCwiIHRoZSB0d28KKyAqIHRlcm1zIGFyZSBzeW5vbnltb3VzLiBUaGlzIGZ1bmN0aW9uIHNob3VsZCByZWFsbHkgYmUgY2FsbGVkCisgKiBnZXRfaXNfb3BlbigpIGJ1dCBmb3IgaGlzdG9yaWNhbCByZWFzb25zIGlzIG5vdC4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbi4KKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSBjb25uZWN0aW9uIGlzIHN0aWxsIGFsaXZlLgorICovCitkYnVzX2Jvb2xfdAorZGJ1c19jb25uZWN0aW9uX2dldF9pc19jb25uZWN0ZWQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBkYnVzX2Jvb2xfdCByZXM7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwsIEZBTFNFKTsKKyAgCisgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisgIHJlcyA9IF9kYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Nvbm5lY3RlZF91bmxvY2tlZCAoY29ubmVjdGlvbik7CisgIENPTk5FQ1RJT05fVU5MT0NLIChjb25uZWN0aW9uKTsKKyAgCisgIHJldHVybiByZXM7Cit9CisKKy8qKgorICogR2V0cyB3aGV0aGVyIHRoZSBjb25uZWN0aW9uIHdhcyBhdXRoZW50aWNhdGVkLiAoTm90ZSB0aGF0CisgKiBpZiB0aGUgY29ubmVjdGlvbiB3YXMgYXV0aGVudGljYXRlZCB0aGVuIGRpc2Nvbm5lY3RlZCwKKyAqIHRoaXMgZnVuY3Rpb24gc3RpbGwgcmV0dXJucyAjVFJVRSkKKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHJldHVybnMgI1RSVUUgaWYgdGhlIGNvbm5lY3Rpb24gd2FzIGV2ZXIgYXV0aGVudGljYXRlZAorICovCitkYnVzX2Jvb2xfdAorZGJ1c19jb25uZWN0aW9uX2dldF9pc19hdXRoZW50aWNhdGVkIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgZGJ1c19ib29sX3QgcmVzOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMLCBGQUxTRSk7CisKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKyAgcmVzID0gX2RidXNfdHJhbnNwb3J0X3RyeV90b19hdXRoZW50aWNhdGUgKGNvbm5lY3Rpb24tPnRyYW5zcG9ydCk7CisgIENPTk5FQ1RJT05fVU5MT0NLIChjb25uZWN0aW9uKTsKKyAgCisgIHJldHVybiByZXM7Cit9CisKKy8qKgorICogR2V0cyB3aGV0aGVyIHRoZSBjb25uZWN0aW9uIGlzIG5vdCBhdXRoZW50aWNhdGVkIGFzIGEgc3BlY2lmaWMKKyAqIHVzZXIuICBJZiB0aGUgY29ubmVjdGlvbiBpcyBub3QgYXV0aGVudGljYXRlZCwgdGhpcyBmdW5jdGlvbgorICogcmV0dXJucyAjVFJVRSwgYW5kIGlmIGl0IGlzIGF1dGhlbnRpY2F0ZWQgYnV0IGFzIGFuIGFub255bW91cyB1c2VyLAorICogaXQgcmV0dXJucyAjVFJVRS4gIElmIGl0IGlzIGF1dGhlbnRpY2F0ZWQgYXMgYSBzcGVjaWZpYyB1c2VyLCB0aGVuCisgKiB0aGlzIHJldHVybnMgI0ZBTFNFLiAoTm90ZSB0aGF0IGlmIHRoZSBjb25uZWN0aW9uIHdhcyBhdXRoZW50aWNhdGVkCisgKiBhcyBhbm9ueW1vdXMgdGhlbiBkaXNjb25uZWN0ZWQsIHRoaXMgZnVuY3Rpb24gc3RpbGwgcmV0dXJucyAjVFJVRS4pCisgKgorICogSWYgdGhlIGNvbm5lY3Rpb24gaXMgbm90IGFub255bW91cywgeW91IGNhbiB1c2UKKyAqIGRidXNfY29ubmVjdGlvbl9nZXRfdW5peF91c2VyKCkgYW5kCisgKiBkYnVzX2Nvbm5lY3Rpb25fZ2V0X3dpbmRvd3NfdXNlcigpIHRvIHNlZSB3aG8gaXQncyBhdXRob3JpemVkIGFzLgorICoKKyAqIElmIHlvdSB3YW50IHRvIHByZXZlbnQgbm9uLWFub255bW91cyBhdXRob3JpemF0aW9uLCB1c2UKKyAqIGRidXNfc2VydmVyX3NldF9hdXRoX21lY2hhbmlzbXMoKSB0byByZW1vdmUgdGhlIG1lY2hhbmlzbXMgdGhhdAorICogYWxsb3cgcHJvdmluZyB1c2VyIGlkZW50aXR5IChpLmUuIG9ubHkgYWxsb3cgdGhlIEFOT05ZTU9VUworICogbWVjaGFuaXNtKS4KKyAqIAorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm5zICNUUlVFIGlmIG5vdCBhdXRoZW50aWNhdGVkIG9yIGF1dGhlbnRpY2F0ZWQgYXMgYW5vbnltb3VzIAorICovCitkYnVzX2Jvb2xfdAorZGJ1c19jb25uZWN0aW9uX2dldF9pc19hbm9ueW1vdXMgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBkYnVzX2Jvb2xfdCByZXM7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwsIEZBTFNFKTsKKyAgCisgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisgIHJlcyA9IF9kYnVzX3RyYW5zcG9ydF9nZXRfaXNfYW5vbnltb3VzIChjb25uZWN0aW9uLT50cmFuc3BvcnQpOworICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7CisgIAorICByZXR1cm4gcmVzOworfQorCisvKioKKyAqIEdldHMgdGhlIElEIG9mIHRoZSBzZXJ2ZXIgYWRkcmVzcyB3ZSBhcmUgYXV0aGVudGljYXRlZCB0bywgaWYgdGhpcworICogY29ubmVjdGlvbiBpcyBvbiB0aGUgY2xpZW50IHNpZGUuIElmIHRoZSBjb25uZWN0aW9uIGlzIG9uIHRoZQorICogc2VydmVyIHNpZGUsIHRoaXMgd2lsbCBhbHdheXMgcmV0dXJuICNOVUxMIC0gdXNlIGRidXNfc2VydmVyX2dldF9pZCgpCisgKiB0byBnZXQgdGhlIElEIG9mIHlvdXIgb3duIHNlcnZlciwgaWYgeW91IGFyZSB0aGUgc2VydmVyIHNpZGUuCisgKiAKKyAqIElmIGEgY2xpZW50LXNpZGUgY29ubmVjdGlvbiBpcyBub3QgYXV0aGVudGljYXRlZCB5ZXQsIHRoZSBJRCBtYXkgYmUKKyAqIGF2YWlsYWJsZSBpZiBpdCB3YXMgaW5jbHVkZWQgaW4gdGhlIHNlcnZlciBhZGRyZXNzLCBidXQgbWF5IG5vdCBiZQorICogYXZhaWxhYmxlLiBUaGUgb25seSB3YXkgdG8gYmUgc3VyZSB0aGUgc2VydmVyIElEIGlzIGF2YWlsYWJsZQorICogaXMgdG8gd2FpdCBmb3IgYXV0aGVudGljYXRpb24gdG8gY29tcGxldGUuCisgKgorICogSW4gZ2VuZXJhbCwgZWFjaCBtb2RlIG9mIGNvbm5lY3RpbmcgdG8gYSBnaXZlbiBzZXJ2ZXIgd2lsbCBoYXZlCisgKiBpdHMgb3duIElELiBTbyBmb3IgZXhhbXBsZSwgaWYgdGhlIHNlc3Npb24gYnVzIGRhZW1vbiBpcyBsaXN0ZW5pbmcKKyAqIG9uIFVOSVggZG9tYWluIHNvY2tldHMgYW5kIG9uIFRDUCwgdGhlbiBlYWNoIG9mIHRob3NlIG1vZGFsaXRpZXMKKyAqIHdpbGwgaGF2ZSBpdHMgb3duIHNlcnZlciBJRC4KKyAqCisgKiBJZiB5b3Ugd2FudCBhbiBJRCB0aGF0IGlkZW50aWZpZXMgYW4gZW50aXJlIHNlc3Npb24gYnVzLCBsb29rIGF0CisgKiBkYnVzX2J1c19nZXRfaWQoKSBpbnN0ZWFkICh3aGljaCBpcyBqdXN0IGEgY29udmVuaWVuY2Ugd3JhcHBlcgorICogYXJvdW5kIHRoZSBvcmcuZnJlZWRlc2t0b3AuREJ1cy5HZXRJZCBtZXRob2QgaW52b2tlZCBvbiB0aGUgYnVzKS4KKyAqCisgKiBZb3UgY2FuIGFsc28gZ2V0IGEgbWFjaGluZSBJRDsgc2VlIGRidXNfdHJ5X2dldF9sb2NhbF9tYWNoaW5lX2lkKCkgdG8KKyAqIGdldCB0aGUgbWFjaGluZSB5b3UgYXJlIG9uLiAgVGhlcmUgaXNuJ3QgYSBjb252ZW5pZW5jZSB3cmFwcGVyLCBidXQKKyAqIHlvdSBjYW4gaW52b2tlIG9yZy5mcmVlZGVza3RvcC5EQnVzLlBlZXIuR2V0TWFjaGluZUlkIG9uIGFueSBwZWVyCisgKiB0byBnZXQgdGhlIG1hY2hpbmUgSUQgb24gdGhlIG90aGVyIGVuZC4KKyAqIAorICogVGhlIEQtQnVzIHNwZWNpZmljYXRpb24gZGVzY3JpYmVzIHRoZSBzZXJ2ZXIgSUQgYW5kIG90aGVyIElEcyBpbiBhCisgKiBiaXQgbW9yZSBkZXRhaWwuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm5zIHRoZSBzZXJ2ZXIgSUQgb3IgI05VTEwgaWYgbm8gbWVtb3J5IG9yIHRoZSBjb25uZWN0aW9uIGlzIHNlcnZlci1zaWRlCisgKi8KK2NoYXIqCitkYnVzX2Nvbm5lY3Rpb25fZ2V0X3NlcnZlcl9pZCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIGNoYXIgKmlkOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMLCBOVUxMKTsKKworICBDT05ORUNUSU9OX0xPQ0sgKGNvbm5lY3Rpb24pOworICBpZCA9IF9kYnVzX3N0cmR1cCAoX2RidXNfdHJhbnNwb3J0X2dldF9zZXJ2ZXJfaWQgKGNvbm5lY3Rpb24tPnRyYW5zcG9ydCkpOworICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7CisKKyAgcmV0dXJuIGlkOworfQorCisvKioKKyAqIFRlc3RzIHdoZXRoZXIgYSBjZXJ0YWluIHR5cGUgY2FuIGJlIHNlbmQgdmlhIHRoZSBjb25uZWN0aW9uLiBUaGlzCisgKiB3aWxsIGFsd2F5cyByZXR1cm4gVFJVRSBmb3IgYWxsIHR5cGVzLCB3aXRoIHRoZSBleGNlcHRpb24gb2YKKyAqIERCVVNfVFlQRV9VTklYX0ZELiBUaGUgZnVuY3Rpb24gd2lsbCByZXR1cm4gVFJVRSBmb3IKKyAqIERCVVNfVFlQRV9VTklYX0ZEIG9ubHkgb24gc3lzdGVtcyB0aGF0IGtub3cgVW5peCBmaWxlIGRlc2NyaXB0b3JzCisgKiBhbmQgY2FuIHNlbmQgdGhlbSB2aWEgdGhlIGNob3NlbiB0cmFuc3BvcnQgYW5kIHdoZW4gdGhlIHJlbW90ZSBzaWRlCisgKiBzdXBwb3J0cyB0aGlzLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gZG8gcnVudGltZSBjaGVja2luZyBmb3IgdHlwZXMgdGhhdAorICogbWlnaHQgYmUgdW5rbm93biB0byB0aGUgc3BlY2lmaWMgRC1CdXMgY2xpZW50IGltcGxlbWVudGF0aW9uCisgKiB2ZXJzaW9uLCBpLmUuIGl0IHdpbGwgcmV0dXJuIEZBTFNFIGZvciBhbGwgdHlwZXMgdGhpcworICogaW1wbGVtZW50YXRpb24gZG9lcyBub3Qga25vdywgaW5jbHVkaW5nIGludmFsaWQgb3IgcmVzZXJ2ZWQgdHlwZXMuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlIHRvIGNoZWNrCisgKiBAcmV0dXJucyBUUlVFIGlmIHRoZSB0eXBlIG1heSBiZSBzZW5kIHZpYSB0aGUgY29ubmVjdGlvbgorICovCitkYnVzX2Jvb2xfdAorZGJ1c19jb25uZWN0aW9uX2Nhbl9zZW5kX3R5cGUoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHR5cGUpCit7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMLCBGQUxTRSk7CisKKyAgaWYgKCFkYnVzX3R5cGVfaXNfdmFsaWQgKHR5cGUpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAodHlwZSAhPSBEQlVTX1RZUEVfVU5JWF9GRCkKKyAgICByZXR1cm4gVFJVRTsKKworI2lmZGVmIEhBVkVfVU5JWF9GRF9QQVNTSU5HCisgIHsKKyAgICBkYnVzX2Jvb2xfdCBiOworCisgICAgQ09OTkVDVElPTl9MT0NLKGNvbm5lY3Rpb24pOworICAgIGIgPSBfZGJ1c190cmFuc3BvcnRfY2FuX3Bhc3NfdW5peF9mZChjb25uZWN0aW9uLT50cmFuc3BvcnQpOworICAgIENPTk5FQ1RJT05fVU5MT0NLKGNvbm5lY3Rpb24pOworCisgICAgcmV0dXJuIGI7CisgIH0KKyNlbmRpZgorCisgIHJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBTZXQgd2hldGhlciBfZXhpdCgpIHNob3VsZCBiZSBjYWxsZWQgd2hlbiB0aGUgY29ubmVjdGlvbiByZWNlaXZlcyBhCisgKiBkaXNjb25uZWN0IHNpZ25hbC4gVGhlIGNhbGwgdG8gX2V4aXQoKSBjb21lcyBhZnRlciBhbnkgaGFuZGxlcnMgZm9yCisgKiB0aGUgZGlzY29ubmVjdCBzaWduYWwgcnVuOyBoYW5kbGVycyBjYW4gY2FuY2VsIHRoZSBleGl0IGJ5IGNhbGxpbmcKKyAqIHRoaXMgZnVuY3Rpb24uCisgKgorICogQnkgZGVmYXVsdCwgZXhpdF9vbl9kaXNjb25uZWN0IGlzICNGQUxTRTsgYnV0IGZvciBtZXNzYWdlIGJ1cworICogY29ubmVjdGlvbnMgcmV0dXJuZWQgZnJvbSBkYnVzX2J1c19nZXQoKSBpdCB3aWxsIGJlIHRvZ2dsZWQgb24KKyAqIGJ5IGRlZmF1bHQuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBleGl0X29uX2Rpc2Nvbm5lY3QgI1RSVUUgaWYgX2V4aXQoKSBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIGEgZGlzY29ubmVjdCBzaWduYWwKKyAqLwordm9pZAorZGJ1c19jb25uZWN0aW9uX3NldF9leGl0X29uX2Rpc2Nvbm5lY3QgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICBleGl0X29uX2Rpc2Nvbm5lY3QpCit7CisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwpOworCisgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisgIGNvbm5lY3Rpb24tPmV4aXRfb25fZGlzY29ubmVjdCA9IGV4aXRfb25fZGlzY29ubmVjdCAhPSBGQUxTRTsKKyAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworfQorCisvKioKKyAqIFByZWFsbG9jYXRlcyByZXNvdXJjZXMgbmVlZGVkIHRvIHNlbmQgYSBtZXNzYWdlLCBhbGxvd2luZyB0aGUgbWVzc2FnZSAKKyAqIHRvIGJlIHNlbnQgd2l0aG91dCB0aGUgcG9zc2liaWxpdHkgb2YgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZS4KKyAqIEFsbG93cyBhcHBzIHRvIGNyZWF0ZSBhIGZ1dHVyZSBndWFyYW50ZWUgdGhhdCB0aGV5IGNhbiBzZW5kCisgKiBhIG1lc3NhZ2UgcmVnYXJkbGVzcyBvZiBtZW1vcnkgc2hvcnRhZ2VzLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uIHdlJ3JlIHByZWFsbG9jYXRpbmcgZm9yLgorICogQHJldHVybnMgdGhlIHByZWFsbG9jYXRlZCByZXNvdXJjZXMsIG9yICNOVUxMCisgKi8KK0RCdXNQcmVhbGxvY2F0ZWRTZW5kKgorZGJ1c19jb25uZWN0aW9uX3ByZWFsbG9jYXRlX3NlbmQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBEQnVzUHJlYWxsb2NhdGVkU2VuZCAqcHJlYWxsb2NhdGVkOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMLCBOVUxMKTsKKworICBDT05ORUNUSU9OX0xPQ0sgKGNvbm5lY3Rpb24pOworICAKKyAgcHJlYWxsb2NhdGVkID0KKyAgICBfZGJ1c19jb25uZWN0aW9uX3ByZWFsbG9jYXRlX3NlbmRfdW5sb2NrZWQgKGNvbm5lY3Rpb24pOworCisgIENPTk5FQ1RJT05fVU5MT0NLIChjb25uZWN0aW9uKTsKKworICByZXR1cm4gcHJlYWxsb2NhdGVkOworfQorCisvKioKKyAqIEZyZWVzIHByZWFsbG9jYXRlZCBtZXNzYWdlLXNlbmRpbmcgcmVzb3VyY2VzIGZyb20KKyAqIGRidXNfY29ubmVjdGlvbl9wcmVhbGxvY2F0ZV9zZW5kKCkuIFNob3VsZCBvbmx5CisgKiBiZSBjYWxsZWQgaWYgdGhlIHByZWFsbG9jYXRlZCByZXNvdXJjZXMgYXJlIG5vdCB1c2VkCisgKiB0byBzZW5kIGEgbWVzc2FnZS4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHBhcmFtIHByZWFsbG9jYXRlZCB0aGUgcmVzb3VyY2VzCisgKi8KK3ZvaWQKK2RidXNfY29ubmVjdGlvbl9mcmVlX3ByZWFsbG9jYXRlZF9zZW5kIChEQnVzQ29ubmVjdGlvbiAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzUHJlYWxsb2NhdGVkU2VuZCAqcHJlYWxsb2NhdGVkKQoreworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMKTsKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKHByZWFsbG9jYXRlZCAhPSBOVUxMKTsgIAorICBfZGJ1c19yZXR1cm5faWZfZmFpbCAoY29ubmVjdGlvbiA9PSBwcmVhbGxvY2F0ZWQtPmNvbm5lY3Rpb24pOworCisgIF9kYnVzX2xpc3RfZnJlZV9saW5rIChwcmVhbGxvY2F0ZWQtPnF1ZXVlX2xpbmspOworICBfZGJ1c19jb3VudGVyX3VucmVmIChwcmVhbGxvY2F0ZWQtPmNvdW50ZXJfbGluay0+ZGF0YSk7CisgIF9kYnVzX2xpc3RfZnJlZV9saW5rIChwcmVhbGxvY2F0ZWQtPmNvdW50ZXJfbGluayk7CisgIGRidXNfZnJlZSAocHJlYWxsb2NhdGVkKTsKK30KKworLyoqCisgKiBTZW5kcyBhIG1lc3NhZ2UgdXNpbmcgcHJlYWxsb2NhdGVkIHJlc291cmNlcy4gVGhpcyBmdW5jdGlvbiBjYW5ub3QgZmFpbC4KKyAqIEl0IHdvcmtzIGlkZW50aWNhbGx5IHRvIGRidXNfY29ubmVjdGlvbl9zZW5kKCkgaW4gb3RoZXIgcmVzcGVjdHMuCisgKiBQcmVhbGxvY2F0ZWQgcmVzb3VyY2VzIGNvbWVzIGZyb20gZGJ1c19jb25uZWN0aW9uX3ByZWFsbG9jYXRlX3NlbmQoKS4KKyAqIFRoaXMgZnVuY3Rpb24gImNvbnN1bWVzIiB0aGUgcHJlYWxsb2NhdGVkIHJlc291cmNlcywgdGhleSBuZWVkIG5vdAorICogYmUgZnJlZWQgc2VwYXJhdGVseS4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHBhcmFtIHByZWFsbG9jYXRlZCB0aGUgcHJlYWxsb2NhdGVkIHJlc291cmNlcworICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgdG8gc2VuZAorICogQHBhcmFtIGNsaWVudF9zZXJpYWwgcmV0dXJuIGxvY2F0aW9uIGZvciBjbGllbnQgc2VyaWFsIGFzc2lnbmVkIHRvIHRoZSBtZXNzYWdlCisgKi8KK3ZvaWQKK2RidXNfY29ubmVjdGlvbl9zZW5kX3ByZWFsbG9jYXRlZCAoREJ1c0Nvbm5lY3Rpb24gICAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNQcmVhbGxvY2F0ZWRTZW5kICpwcmVhbGxvY2F0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICAgICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90ICAgICAgICAqY2xpZW50X3NlcmlhbCkKK3sKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCk7CisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChwcmVhbGxvY2F0ZWQgIT0gTlVMTCk7CisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChtZXNzYWdlICE9IE5VTEwpOworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAocHJlYWxsb2NhdGVkLT5jb25uZWN0aW9uID09IGNvbm5lY3Rpb24pOworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlKSAhPSBEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfQ0FMTCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKG1lc3NhZ2UpICE9IE5VTEwpOworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlKSAhPSBEQlVTX01FU1NBR0VfVFlQRV9TSUdOQUwgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIChkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAobWVzc2FnZSkgIT0gTlVMTCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKSAhPSBOVUxMKSk7CisKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKworI2lmZGVmIEhBVkVfVU5JWF9GRF9QQVNTSU5HCisKKyAgaWYgKCFfZGJ1c190cmFuc3BvcnRfY2FuX3Bhc3NfdW5peF9mZChjb25uZWN0aW9uLT50cmFuc3BvcnQpICYmCisgICAgICBtZXNzYWdlLT5uX3VuaXhfZmRzID4gMCkKKyAgICB7CisgICAgICAvKiBSZWZ1c2UgdG8gc2VuZCBmZHMgb24gYSBjb25uZWN0aW9uIHRoYXQgY2Fubm90IGhhbmRsZQorICAgICAgICAgdGhlbS4gVW5mb3J0dW5hdGVseSB3ZSBjYW5ub3QgcmV0dXJuIGEgcHJvcGVyIGVycm9yIGhlcmUsIHNvCisgICAgICAgICB0aGUgYmVzdCB3ZSBjYW4gaXMganVzdCByZXR1cm4uICovCisgICAgICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7CisgICAgICByZXR1cm47CisgICAgfQorCisjZW5kaWYKKworICBfZGJ1c19jb25uZWN0aW9uX3NlbmRfcHJlYWxsb2NhdGVkX2FuZF91bmxvY2sgKGNvbm5lY3Rpb24sCisJCQkJCQkgcHJlYWxsb2NhdGVkLAorCQkJCQkJIG1lc3NhZ2UsIGNsaWVudF9zZXJpYWwpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK19kYnVzX2Nvbm5lY3Rpb25fc2VuZF91bmxvY2tlZF9ub191cGRhdGUgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90ICAqY2xpZW50X3NlcmlhbCkKK3sKKyAgREJ1c1ByZWFsbG9jYXRlZFNlbmQgKnByZWFsbG9jYXRlZDsKKworICBfZGJ1c19hc3NlcnQgKGNvbm5lY3Rpb24gIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAobWVzc2FnZSAhPSBOVUxMKTsKKyAgCisgIHByZWFsbG9jYXRlZCA9IF9kYnVzX2Nvbm5lY3Rpb25fcHJlYWxsb2NhdGVfc2VuZF91bmxvY2tlZCAoY29ubmVjdGlvbik7CisgIGlmIChwcmVhbGxvY2F0ZWQgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgX2RidXNfY29ubmVjdGlvbl9zZW5kX3ByZWFsbG9jYXRlZF91bmxvY2tlZF9ub191cGRhdGUgKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVhbGxvY2F0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50X3NlcmlhbCk7CisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIEFkZHMgYSBtZXNzYWdlIHRvIHRoZSBvdXRnb2luZyBtZXNzYWdlIHF1ZXVlLiBEb2VzIG5vdCBibG9jayB0bworICogd3JpdGUgdGhlIG1lc3NhZ2UgdG8gdGhlIG5ldHdvcms7IHRoYXQgaGFwcGVucyBhc3luY2hyb25vdXNseS4gVG8KKyAqIGZvcmNlIHRoZSBtZXNzYWdlIHRvIGJlIHdyaXR0ZW4sIGNhbGwgZGJ1c19jb25uZWN0aW9uX2ZsdXNoKCkgaG93ZXZlcgorICogaXQgaXMgbm90IG5lY2Vzc2FyeSB0byBjYWxsIGRidXNfY29ubmVjdGlvbl9mbHVzaCgpIGJ5IGhhbmQ7IHRoZSAKKyAqIG1lc3NhZ2Ugd2lsbCBiZSBzZW50IHRoZSBuZXh0IHRpbWUgdGhlIG1haW4gbG9vcCBpcyBydW4uIAorICogZGJ1c19jb25uZWN0aW9uX2ZsdXNoKCkgc2hvdWxkIG9ubHkgYmUgdXNlZCwgZm9yIGV4YW1wbGUsIGlmCisgKiB0aGUgYXBwbGljYXRpb24gd2FzIGV4cGVjdGVkIHRvIGV4aXQgYmVmb3JlIHJ1bm5pbmcgdGhlIG1haW4gbG9vcC4KKyAqCisgKiBCZWNhdXNlIHRoaXMgb25seSBxdWV1ZXMgdGhlIG1lc3NhZ2UsIHRoZSBvbmx5IHJlYXNvbiBpdCBjYW4KKyAqIGZhaWwgaXMgbGFjayBvZiBtZW1vcnkuIEV2ZW4gaWYgdGhlIGNvbm5lY3Rpb24gaXMgZGlzY29ubmVjdGVkLAorICogbm8gZXJyb3Igd2lsbCBiZSByZXR1cm5lZC4gSWYgdGhlIGZ1bmN0aW9uIGZhaWxzIGR1ZSB0byBsYWNrIG9mIG1lbW9yeSwgCisgKiBpdCByZXR1cm5zICNGQUxTRS4gVGhlIGZ1bmN0aW9uIHdpbGwgbmV2ZXIgZmFpbCBmb3Igb3RoZXIgcmVhc29uczsgZXZlbiAKKyAqIGlmIHRoZSBjb25uZWN0aW9uIGlzIGRpc2Nvbm5lY3RlZCwgeW91IGNhbiBxdWV1ZSBhbiBvdXRnb2luZyBtZXNzYWdlLAorICogdGhvdWdoIG9idmlvdXNseSBpdCB3b24ndCBiZSBzZW50LgorICoKKyAqIFRoZSBtZXNzYWdlIHNlcmlhbCBpcyB1c2VkIGJ5IHRoZSByZW1vdGUgYXBwbGljYXRpb24gdG8gc2VuZCBhCisgKiByZXBseTsgc2VlIGRidXNfbWVzc2FnZV9nZXRfc2VyaWFsKCkgb3IgdGhlIEQtQnVzIHNwZWNpZmljYXRpb24uCisgKgorICogZGJ1c19tZXNzYWdlX3VucmVmKCkgY2FuIGJlIGNhbGxlZCBhcyBzb29uIGFzIHRoaXMgbWV0aG9kIHJldHVybnMKKyAqIGFzIHRoZSBtZXNzYWdlIHF1ZXVlIHdpbGwgaG9sZCBpdHMgb3duIHJlZiB1bnRpbCB0aGUgbWVzc2FnZSBpcyBzZW50LgorICogCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbi4KKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIHRvIHdyaXRlLgorICogQHBhcmFtIHNlcmlhbCByZXR1cm4gbG9jYXRpb24gZm9yIG1lc3NhZ2Ugc2VyaWFsLCBvciAjTlVMTCBpZiB5b3UgZG9uJ3QgY2FyZQorICogQHJldHVybnMgI1RSVUUgb24gc3VjY2Vzcy4KKyAqLworZGJ1c19ib29sX3QKK2RidXNfY29ubmVjdGlvbl9zZW5kIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90ICAqc2VyaWFsKQoreworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG1lc3NhZ2UgIT0gTlVMTCwgRkFMU0UpOworCisgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisKKyNpZmRlZiBIQVZFX1VOSVhfRkRfUEFTU0lORworCisgIGlmICghX2RidXNfdHJhbnNwb3J0X2Nhbl9wYXNzX3VuaXhfZmQoY29ubmVjdGlvbi0+dHJhbnNwb3J0KSAmJgorICAgICAgbWVzc2FnZS0+bl91bml4X2ZkcyA+IDApCisgICAgeworICAgICAgLyogUmVmdXNlIHRvIHNlbmQgZmRzIG9uIGEgY29ubmVjdGlvbiB0aGF0IGNhbm5vdCBoYW5kbGUKKyAgICAgICAgIHRoZW0uIFVuZm9ydHVuYXRlbHkgd2UgY2Fubm90IHJldHVybiBhIHByb3BlciBlcnJvciBoZXJlLCBzbworICAgICAgICAgdGhlIGJlc3Qgd2UgY2FuIGlzIGp1c3QgcmV0dXJuLiAqLworICAgICAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworI2VuZGlmCisKKyAgcmV0dXJuIF9kYnVzX2Nvbm5lY3Rpb25fc2VuZF9hbmRfdW5sb2NrIChjb25uZWN0aW9uLAorCQkJCQkgICBtZXNzYWdlLAorCQkJCQkgICBzZXJpYWwpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3JlcGx5X2hhbmRsZXJfdGltZW91dCAodm9pZCAqZGF0YSkKK3sKKyAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisgIERCdXNEaXNwYXRjaFN0YXR1cyBzdGF0dXM7CisgIERCdXNQZW5kaW5nQ2FsbCAqcGVuZGluZyA9IGRhdGE7CisKKyAgY29ubmVjdGlvbiA9IF9kYnVzX3BlbmRpbmdfY2FsbF9nZXRfY29ubmVjdGlvbl9hbmRfbG9jayAocGVuZGluZyk7CisgIF9kYnVzX2Nvbm5lY3Rpb25fcmVmX3VubG9ja2VkIChjb25uZWN0aW9uKTsKKworICBfZGJ1c19wZW5kaW5nX2NhbGxfcXVldWVfdGltZW91dF9lcnJvcl91bmxvY2tlZCAocGVuZGluZywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uKTsKKyAgX2RidXNfY29ubmVjdGlvbl9yZW1vdmVfdGltZW91dF91bmxvY2tlZCAoY29ubmVjdGlvbiwKKwkJCQkgICAgICAgICAgICBfZGJ1c19wZW5kaW5nX2NhbGxfZ2V0X3RpbWVvdXRfdW5sb2NrZWQgKHBlbmRpbmcpKTsKKyAgX2RidXNfcGVuZGluZ19jYWxsX3NldF90aW1lb3V0X2FkZGVkX3VubG9ja2VkIChwZW5kaW5nLCBGQUxTRSk7CisKKyAgX2RidXNfdmVyYm9zZSAoIm1pZGRsZVxuIik7CisgIHN0YXR1cyA9IF9kYnVzX2Nvbm5lY3Rpb25fZ2V0X2Rpc3BhdGNoX3N0YXR1c191bmxvY2tlZCAoY29ubmVjdGlvbik7CisKKyAgLyogVW5sb2NrcywgYW5kIGNhbGxzIG91dCB0byB1c2VyIGNvZGUgKi8KKyAgX2RidXNfY29ubmVjdGlvbl91cGRhdGVfZGlzcGF0Y2hfc3RhdHVzX2FuZF91bmxvY2sgKGNvbm5lY3Rpb24sIHN0YXR1cyk7CisgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoY29ubmVjdGlvbik7CisgIAorICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBRdWV1ZXMgYSBtZXNzYWdlIHRvIHNlbmQsIGFzIHdpdGggZGJ1c19jb25uZWN0aW9uX3NlbmQoKSwKKyAqIGJ1dCBhbHNvIHJldHVybnMgYSAjREJ1c1BlbmRpbmdDYWxsIHVzZWQgdG8gcmVjZWl2ZSBhIHJlcGx5IHRvIHRoZQorICogbWVzc2FnZS4gSWYgbm8gcmVwbHkgaXMgcmVjZWl2ZWQgaW4gdGhlIGdpdmVuIHRpbWVvdXRfbWlsbGlzZWNvbmRzLAorICogdGhpcyBmdW5jdGlvbiBleHBpcmVzIHRoZSBwZW5kaW5nIHJlcGx5IGFuZCBnZW5lcmF0ZXMgYSBzeW50aGV0aWMKKyAqIGVycm9yIHJlcGx5IChnZW5lcmF0ZWQgaW4tcHJvY2Vzcywgbm90IGJ5IHRoZSByZW1vdGUgYXBwbGljYXRpb24pCisgKiBpbmRpY2F0aW5nIHRoYXQgYSB0aW1lb3V0IG9jY3VycmVkLgorICoKKyAqIEEgI0RCdXNQZW5kaW5nQ2FsbCB3aWxsIHNlZSBhIHJlcGx5IG1lc3NhZ2UgYmVmb3JlIGFueSBmaWx0ZXJzIG9yCisgKiByZWdpc3RlcmVkIG9iamVjdCBwYXRoIGhhbmRsZXJzLiBTZWUgZGJ1c19jb25uZWN0aW9uX2Rpc3BhdGNoKCkgZm9yCisgKiBkZXRhaWxzIG9uIHdoZW4gaGFuZGxlcnMgYXJlIHJ1bi4KKyAqCisgKiBBICNEQnVzUGVuZGluZ0NhbGwgd2lsbCBhbHdheXMgc2VlIGV4YWN0bHkgb25lIHJlcGx5IG1lc3NhZ2UsCisgKiB1bmxlc3MgaXQncyBjYW5jZWxsZWQgd2l0aCBkYnVzX3BlbmRpbmdfY2FsbF9jYW5jZWwoKS4KKyAqIAorICogSWYgI05VTEwgaXMgcGFzc2VkIGZvciB0aGUgcGVuZGluZ19yZXR1cm4sIHRoZSAjREJ1c1BlbmRpbmdDYWxsCisgKiB3aWxsIHN0aWxsIGJlIGdlbmVyYXRlZCBpbnRlcm5hbGx5LCBhbmQgdXNlZCB0byB0cmFjaworICogdGhlIG1lc3NhZ2UgcmVwbHkgdGltZW91dC4gVGhpcyBtZWFucyBhIHRpbWVvdXQgZXJyb3Igd2lsbAorICogb2NjdXIgaWYgbm8gcmVwbHkgYXJyaXZlcywgdW5saWtlIHdpdGggZGJ1c19jb25uZWN0aW9uX3NlbmQoKS4KKyAqCisgKiBJZiAtMSBpcyBwYXNzZWQgZm9yIHRoZSB0aW1lb3V0LCBhIHNhbmUgZGVmYXVsdCB0aW1lb3V0IGlzIHVzZWQuIC0xCisgKiBpcyB0eXBpY2FsbHkgdGhlIGJlc3QgdmFsdWUgZm9yIHRoZSB0aW1lb3V0IGZvciB0aGlzIHJlYXNvbiwgdW5sZXNzCisgKiB5b3Ugd2FudCBhIHZlcnkgc2hvcnQgb3IgdmVyeSBsb25nIHRpbWVvdXQuICBJZiAjREJVU19USU1FT1VUX0lORklOSVRFIGlzCisgKiBwYXNzZWQgZm9yIHRoZSB0aW1lb3V0LCBubyB0aW1lb3V0IHdpbGwgYmUgc2V0IGFuZCB0aGUgY2FsbCB3aWxsIGJsb2NrCisgKiBmb3JldmVyLgorICoKKyAqIEB3YXJuaW5nIGlmIHRoZSBjb25uZWN0aW9uIGlzIGRpc2Nvbm5lY3RlZCBvciB5b3UgdHJ5IHRvIHNlbmQgVW5peAorICogZmlsZSBkZXNjcmlwdG9ycyBvbiBhIGNvbm5lY3Rpb24gdGhhdCBkb2VzIG5vdCBzdXBwb3J0IHRoZW0sIHRoZQorICogI0RCdXNQZW5kaW5nQ2FsbCB3aWxsIGJlIHNldCB0byAjTlVMTCwgc28gYmUgY2FyZWZ1bCB3aXRoIHRoaXMuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIHRvIHNlbmQKKyAqIEBwYXJhbSBwZW5kaW5nX3JldHVybiByZXR1cm4gbG9jYXRpb24gZm9yIGEgI0RCdXNQZW5kaW5nQ2FsbAorICogb2JqZWN0LCBvciAjTlVMTCBpZiBjb25uZWN0aW9uIGlzIGRpc2Nvbm5lY3RlZCBvciB3aGVuIHlvdSB0cnkgdG8KKyAqIHNlbmQgVW5peCBmaWxlIGRlc2NyaXB0b3JzIG9uIGEgY29ubmVjdGlvbiB0aGF0IGRvZXMgbm90IHN1cHBvcnQKKyAqIHRoZW0uCisgKiBAcGFyYW0gdGltZW91dF9taWxsaXNlY29uZHMgdGltZW91dCBpbiBtaWxsaXNlY29uZHMsIC0xIChvcgorICogICNEQlVTX1RJTUVPVVRfVVNFX0RFRkFVTFQpIGZvciBkZWZhdWx0IG9yICNEQlVTX1RJTUVPVVRfSU5GSU5JVEUgZm9yIG5vCisgKiAgdGltZW91dAorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vIG1lbW9yeSwgI1RSVUUgb3RoZXJ3aXNlLgorICoKKyAqLworZGJ1c19ib29sX3QKK2RidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHkgKERCdXNDb25uZWN0aW9uICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNQZW5kaW5nQ2FsbCAgICoqcGVuZGluZ19yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgIHRpbWVvdXRfbWlsbGlzZWNvbmRzKQoreworICBEQnVzUGVuZGluZ0NhbGwgKnBlbmRpbmc7CisgIGRidXNfaW50MzJfdCBzZXJpYWwgPSAtMTsKKyAgREJ1c0Rpc3BhdGNoU3RhdHVzIHN0YXR1czsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG1lc3NhZ2UgIT0gTlVMTCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHRpbWVvdXRfbWlsbGlzZWNvbmRzID49IDAgfHwgdGltZW91dF9taWxsaXNlY29uZHMgPT0gLTEsIEZBTFNFKTsKKworICBpZiAocGVuZGluZ19yZXR1cm4pCisgICAgKnBlbmRpbmdfcmV0dXJuID0gTlVMTDsKKworICBDT05ORUNUSU9OX0xPQ0sgKGNvbm5lY3Rpb24pOworCisjaWZkZWYgSEFWRV9VTklYX0ZEX1BBU1NJTkcKKworICBpZiAoIV9kYnVzX3RyYW5zcG9ydF9jYW5fcGFzc191bml4X2ZkKGNvbm5lY3Rpb24tPnRyYW5zcG9ydCkgJiYKKyAgICAgIG1lc3NhZ2UtPm5fdW5peF9mZHMgPiAwKQorICAgIHsKKyAgICAgIC8qIFJlZnVzZSB0byBzZW5kIGZkcyBvbiBhIGNvbm5lY3Rpb24gdGhhdCBjYW5ub3QgaGFuZGxlCisgICAgICAgICB0aGVtLiBVbmZvcnR1bmF0ZWx5IHdlIGNhbm5vdCByZXR1cm4gYSBwcm9wZXIgZXJyb3IgaGVyZSwgc28KKyAgICAgICAgIHRoZSBiZXN0IHdlIGNhbiBkbyBpcyByZXR1cm4gVFJVRSBidXQgbGVhdmUgKnBlbmRpbmdfcmV0dXJuCisgICAgICAgICBhcyBOVUxMLiAqLworICAgICAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisjZW5kaWYKKworICAgaWYgKCFfZGJ1c19jb25uZWN0aW9uX2dldF9pc19jb25uZWN0ZWRfdW5sb2NrZWQgKGNvbm5lY3Rpb24pKQorICAgIHsKKyAgICAgIENPTk5FQ1RJT05fVU5MT0NLIChjb25uZWN0aW9uKTsKKworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIHBlbmRpbmcgPSBfZGJ1c19wZW5kaW5nX2NhbGxfbmV3X3VubG9ja2VkIChjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dF9taWxsaXNlY29uZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBseV9oYW5kbGVyX3RpbWVvdXQpOworCisgIGlmIChwZW5kaW5nID09IE5VTEwpCisgICAgeworICAgICAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAvKiBBc3NpZ24gYSBzZXJpYWwgdG8gdGhlIG1lc3NhZ2UgKi8KKyAgc2VyaWFsID0gZGJ1c19tZXNzYWdlX2dldF9zZXJpYWwgKG1lc3NhZ2UpOworICBpZiAoc2VyaWFsID09IDApCisgICAgeworICAgICAgc2VyaWFsID0gX2RidXNfY29ubmVjdGlvbl9nZXRfbmV4dF9jbGllbnRfc2VyaWFsIChjb25uZWN0aW9uKTsKKyAgICAgIGRidXNfbWVzc2FnZV9zZXRfc2VyaWFsIChtZXNzYWdlLCBzZXJpYWwpOworICAgIH0KKworICBpZiAoIV9kYnVzX3BlbmRpbmdfY2FsbF9zZXRfdGltZW91dF9lcnJvcl91bmxvY2tlZCAocGVuZGluZywgbWVzc2FnZSwgc2VyaWFsKSkKKyAgICBnb3RvIGVycm9yOworICAgIAorICAvKiBJbnNlcnQgdGhlIHNlcmlhbCBpbiB0aGUgcGVuZGluZyByZXBsaWVzIGhhc2g7CisgICAqIGhhc2ggdGFrZXMgYSByZWZjb3VudCBvbiBEQnVzUGVuZGluZ0NhbGwuCisgICAqIEFsc28sIGFkZCB0aGUgdGltZW91dC4KKyAgICovCisgIGlmICghX2RidXNfY29ubmVjdGlvbl9hdHRhY2hfcGVuZGluZ19jYWxsX3VubG9ja2VkIChjb25uZWN0aW9uLAorCQkJCQkJICAgICAgcGVuZGluZykpCisgICAgZ290byBlcnJvcjsKKyAKKyAgaWYgKCFfZGJ1c19jb25uZWN0aW9uX3NlbmRfdW5sb2NrZWRfbm9fdXBkYXRlIChjb25uZWN0aW9uLCBtZXNzYWdlLCBOVUxMKSkKKyAgICB7CisgICAgICBfZGJ1c19jb25uZWN0aW9uX2RldGFjaF9wZW5kaW5nX2NhbGxfYW5kX3VubG9jayAoY29ubmVjdGlvbiwKKwkJCQkJCSAgICAgICBwZW5kaW5nKTsKKyAgICAgIGdvdG8gZXJyb3JfdW5sb2NrZWQ7CisgICAgfQorCisgIGlmIChwZW5kaW5nX3JldHVybikKKyAgICAqcGVuZGluZ19yZXR1cm4gPSBwZW5kaW5nOyAvKiBoYW5kIG9mZiByZWZjb3VudCAqLworICBlbHNlCisgICAgeworICAgICAgX2RidXNfY29ubmVjdGlvbl9kZXRhY2hfcGVuZGluZ19jYWxsX3VubG9ja2VkIChjb25uZWN0aW9uLCBwZW5kaW5nKTsKKyAgICAgIC8qIHdlIHN0aWxsIGhhdmUgYSByZWYgdG8gdGhlIHBlbmRpbmcgY2FsbCBpbiB0aGlzIGNhc2UsIHdlIHVucmVmCisgICAgICAgKiBhZnRlciB1bmxvY2tpbmcsIGJlbG93CisgICAgICAgKi8KKyAgICB9CisKKyAgc3RhdHVzID0gX2RidXNfY29ubmVjdGlvbl9nZXRfZGlzcGF0Y2hfc3RhdHVzX3VubG9ja2VkIChjb25uZWN0aW9uKTsKKworICAvKiB0aGlzIGNhbGxzIG91dCB0byB1c2VyIGNvZGUgKi8KKyAgX2RidXNfY29ubmVjdGlvbl91cGRhdGVfZGlzcGF0Y2hfc3RhdHVzX2FuZF91bmxvY2sgKGNvbm5lY3Rpb24sIHN0YXR1cyk7CisKKyAgaWYgKHBlbmRpbmdfcmV0dXJuID09IE5VTEwpCisgICAgZGJ1c19wZW5kaW5nX2NhbGxfdW5yZWYgKHBlbmRpbmcpOworICAKKyAgcmV0dXJuIFRSVUU7CisKKyBlcnJvcjoKKyAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworIGVycm9yX3VubG9ja2VkOgorICBkYnVzX3BlbmRpbmdfY2FsbF91bnJlZiAocGVuZGluZyk7CisgIHJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBTZW5kcyBhIG1lc3NhZ2UgYW5kIGJsb2NrcyBhIGNlcnRhaW4gdGltZSBwZXJpb2Qgd2hpbGUgd2FpdGluZyBmb3IKKyAqIGEgcmVwbHkuICBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHJlZW50ZXIgdGhlIG1haW4gbG9vcCwKKyAqIGkuZS4gbWVzc2FnZXMgb3RoZXIgdGhhbiB0aGUgcmVwbHkgYXJlIHF1ZXVlZCB1cCBidXQgbm90CisgKiBwcm9jZXNzZWQuIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBpbnZva2UgbWV0aG9kIGNhbGxzIG9uIGEKKyAqIHJlbW90ZSBvYmplY3QuCisgKiAKKyAqIElmIGEgbm9ybWFsIHJlcGx5IGlzIHJlY2VpdmVkLCBpdCBpcyByZXR1cm5lZCwgYW5kIHJlbW92ZWQgZnJvbSB0aGUKKyAqIGluY29taW5nIG1lc3NhZ2UgcXVldWUuIElmIGl0IGlzIG5vdCByZWNlaXZlZCwgI05VTEwgaXMgcmV0dXJuZWQKKyAqIGFuZCB0aGUgZXJyb3IgaXMgc2V0IHRvICNEQlVTX0VSUk9SX05PX1JFUExZLiAgSWYgYW4gZXJyb3IgcmVwbHkgaXMKKyAqIHJlY2VpdmVkLCBpdCBpcyBjb252ZXJ0ZWQgdG8gYSAjREJ1c0Vycm9yIGFuZCByZXR1cm5lZCBhcyBhbiBlcnJvciwKKyAqIHRoZW4gdGhlIHJlcGx5IG1lc3NhZ2UgaXMgZGVsZXRlZCBhbmQgI05VTEwgaXMgcmV0dXJuZWQuIElmCisgKiBzb21ldGhpbmcgZWxzZSBnb2VzIHdyb25nLCByZXN1bHQgaXMgc2V0IHRvIHdoYXRldmVyIGlzCisgKiBhcHByb3ByaWF0ZSwgc3VjaCBhcyAjREJVU19FUlJPUl9OT19NRU1PUlkgb3IKKyAqICNEQlVTX0VSUk9SX0RJU0NPTk5FQ1RFRC4KKyAqCisgKiBAd2FybmluZyBXaGlsZSB0aGlzIGZ1bmN0aW9uIGJsb2NrcyB0aGUgY2FsbGluZyB0aHJlYWQgd2lsbCBub3QgYmUKKyAqIHByb2Nlc3NpbmcgdGhlIGluY29taW5nIG1lc3NhZ2UgcXVldWUuIFRoaXMgbWVhbnMgeW91IGNhbiBlbmQgdXAKKyAqIGRlYWRsb2NrZWQgaWYgdGhlIGFwcGxpY2F0aW9uIHlvdSdyZSB0YWxraW5nIHRvIG5lZWRzIHlvdSB0byByZXBseQorICogdG8gYSBtZXRob2QuIFRvIHNvbHZlIHRoaXMsIGVpdGhlciBhdm9pZCB0aGUgc2l0dWF0aW9uLCBibG9jayBpbiBhCisgKiBzZXBhcmF0ZSB0aHJlYWQgZnJvbSB0aGUgbWFpbiBjb25uZWN0aW9uLWRpc3BhdGNoaW5nIHRocmVhZCwgb3IgdXNlCisgKiBkYnVzX3BlbmRpbmdfY2FsbF9zZXRfbm90aWZ5KCkgdG8gYXZvaWQgYmxvY2tpbmcuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIHRvIHNlbmQKKyAqIEBwYXJhbSB0aW1lb3V0X21pbGxpc2Vjb25kcyB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcywgLTEgKG9yCisgKiAgI0RCVVNfVElNRU9VVF9VU0VfREVGQVVMVCkgZm9yIGRlZmF1bHQgb3IgI0RCVVNfVElNRU9VVF9JTkZJTklURSBmb3Igbm8KKyAqICB0aW1lb3V0CisgKiBAcGFyYW0gZXJyb3IgcmV0dXJuIGxvY2F0aW9uIGZvciBlcnJvciBtZXNzYWdlCisgKiBAcmV0dXJucyB0aGUgbWVzc2FnZSB0aGF0IGlzIHRoZSByZXBseSBvciAjTlVMTCB3aXRoIGFuIGVycm9yIGNvZGUgaWYgdGhlCisgKiBmdW5jdGlvbiBmYWlscy4KKyAqLworREJ1c01lc3NhZ2UqCitkYnVzX2Nvbm5lY3Rpb25fc2VuZF93aXRoX3JlcGx5X2FuZF9ibG9jayAoREJ1c0Nvbm5lY3Rpb24gICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgIHRpbWVvdXRfbWlsbGlzZWNvbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICAqZXJyb3IpCit7CisgIERCdXNNZXNzYWdlICpyZXBseTsKKyAgREJ1c1BlbmRpbmdDYWxsICpwZW5kaW5nOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMLCBOVUxMKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChtZXNzYWdlICE9IE5VTEwsIE5VTEwpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHRpbWVvdXRfbWlsbGlzZWNvbmRzID49IDAgfHwgdGltZW91dF9taWxsaXNlY29uZHMgPT0gLTEsIE5VTEwpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2Vycm9yX2lzX3NldCAoZXJyb3IsIE5VTEwpOworCisjaWZkZWYgSEFWRV9VTklYX0ZEX1BBU1NJTkcKKworICBDT05ORUNUSU9OX0xPQ0sgKGNvbm5lY3Rpb24pOworICBpZiAoIV9kYnVzX3RyYW5zcG9ydF9jYW5fcGFzc191bml4X2ZkKGNvbm5lY3Rpb24tPnRyYW5zcG9ydCkgJiYKKyAgICAgIG1lc3NhZ2UtPm5fdW5peF9mZHMgPiAwKQorICAgIHsKKyAgICAgIENPTk5FQ1RJT05fVU5MT0NLIChjb25uZWN0aW9uKTsKKyAgICAgIGRidXNfc2V0X2Vycm9yKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwgIkNhbm5vdCBzZW5kIGZpbGUgZGVzY3JpcHRvcnMgb24gdGhpcyBjb25uZWN0aW9uLiIpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7CisKKyNlbmRpZgorCisgIGlmICghZGJ1c19jb25uZWN0aW9uX3NlbmRfd2l0aF9yZXBseSAoY29ubmVjdGlvbiwgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGVuZGluZywgdGltZW91dF9taWxsaXNlY29uZHMpKQorICAgIHsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBpZiAocGVuZGluZyA9PSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9ESVNDT05ORUNURUQsICJDb25uZWN0aW9uIGlzIGNsb3NlZCIpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAKKyAgZGJ1c19wZW5kaW5nX2NhbGxfYmxvY2sgKHBlbmRpbmcpOworCisgIHJlcGx5ID0gZGJ1c19wZW5kaW5nX2NhbGxfc3RlYWxfcmVwbHkgKHBlbmRpbmcpOworICBkYnVzX3BlbmRpbmdfY2FsbF91bnJlZiAocGVuZGluZyk7CisKKyAgLyogY2FsbF9jb21wbGV0ZV9hbmRfdW5sb2NrKCkgY2FsbGVkIGZyb20gcGVuZGluZ19jYWxsX2Jsb2NrKCkgc2hvdWxkCisgICAqIGFsd2F5cyBmaWxsIHRoaXMgaW4uCisgICAqLworICBfZGJ1c19hc3NlcnQgKHJlcGx5ICE9IE5VTEwpOworICAKKyAgIGlmIChkYnVzX3NldF9lcnJvcl9mcm9tX21lc3NhZ2UgKGVycm9yLCByZXBseSkpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4gcmVwbHk7Cit9CisKKy8qKgorICogQmxvY2tzIHVudGlsIHRoZSBvdXRnb2luZyBtZXNzYWdlIHF1ZXVlIGlzIGVtcHR5LgorICogQXNzdW1lcyBjb25uZWN0aW9uIGxvY2sgYWxyZWFkeSBoZWxkLgorICoKKyAqIElmIHlvdSBjYWxsIHRoaXMsIHlvdSBNVVNUIGNhbGwgdXBkYXRlX2Rpc3BhdGNoX3N0YXR1cyBhZnRlcndvcmQuLi4KKyAqIAorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24uCisgKi8KK3N0YXRpYyBEQnVzRGlzcGF0Y2hTdGF0dXMKK19kYnVzX2Nvbm5lY3Rpb25fZmx1c2hfdW5sb2NrZWQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICAvKiBXZSBoYXZlIHRvIHNwZWNpZnkgREJVU19JVEVSQVRJT05fRE9fUkVBRElORyBoZXJlIGJlY2F1c2UKKyAgICogb3RoZXJ3aXNlIHdlIGNvdWxkIGhhdmUgdHdvIGFwcHMgZGVhZGxvY2sgaWYgdGhleSBhcmUgYm90aCBkb2luZworICAgKiBhIGZsdXNoKCksIGFuZCB0aGUga2VybmVsIGJ1ZmZlcnMgZmlsbCB1cC4gVGhpcyBjb3VsZCBjaGFuZ2UgdGhlCisgICAqIGRpc3BhdGNoIHN0YXR1cy4KKyAgICovCisgIERCdXNEaXNwYXRjaFN0YXR1cyBzdGF0dXM7CisKKyAgSEFWRV9MT0NLX0NIRUNLIChjb25uZWN0aW9uKTsKKyAgCisgIHdoaWxlIChjb25uZWN0aW9uLT5uX291dGdvaW5nID4gMCAmJgorICAgICAgICAgX2RidXNfY29ubmVjdGlvbl9nZXRfaXNfY29ubmVjdGVkX3VubG9ja2VkIChjb25uZWN0aW9uKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiZG9pbmcgaXRlcmF0aW9uIGluXG4iKTsKKyAgICAgIEhBVkVfTE9DS19DSEVDSyAoY29ubmVjdGlvbik7CisgICAgICBfZGJ1c19jb25uZWN0aW9uX2RvX2l0ZXJhdGlvbl91bmxvY2tlZCAoY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSVRFUkFUSU9OX0RPX1JFQURJTkcgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSVRFUkFUSU9OX0RPX1dSSVRJTkcgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSVRFUkFUSU9OX0JMT0NLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xKTsKKyAgICB9CisKKyAgSEFWRV9MT0NLX0NIRUNLIChjb25uZWN0aW9uKTsKKyAgX2RidXNfdmVyYm9zZSAoIm1pZGRsZVxuIik7CisgIHN0YXR1cyA9IF9kYnVzX2Nvbm5lY3Rpb25fZ2V0X2Rpc3BhdGNoX3N0YXR1c191bmxvY2tlZCAoY29ubmVjdGlvbik7CisKKyAgSEFWRV9MT0NLX0NIRUNLIChjb25uZWN0aW9uKTsKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBCbG9ja3MgdW50aWwgdGhlIG91dGdvaW5nIG1lc3NhZ2UgcXVldWUgaXMgZW1wdHkuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24uCisgKi8KK3ZvaWQKK2RidXNfY29ubmVjdGlvbl9mbHVzaCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIC8qIFdlIGhhdmUgdG8gc3BlY2lmeSBEQlVTX0lURVJBVElPTl9ET19SRUFESU5HIGhlcmUgYmVjYXVzZQorICAgKiBvdGhlcndpc2Ugd2UgY291bGQgaGF2ZSB0d28gYXBwcyBkZWFkbG9jayBpZiB0aGV5IGFyZSBib3RoIGRvaW5nCisgICAqIGEgZmx1c2goKSwgYW5kIHRoZSBrZXJuZWwgYnVmZmVycyBmaWxsIHVwLiBUaGlzIGNvdWxkIGNoYW5nZSB0aGUKKyAgICogZGlzcGF0Y2ggc3RhdHVzLgorICAgKi8KKyAgREJ1c0Rpc3BhdGNoU3RhdHVzIHN0YXR1czsKKworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMKTsKKyAgCisgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisKKyAgc3RhdHVzID0gX2RidXNfY29ubmVjdGlvbl9mbHVzaF91bmxvY2tlZCAoY29ubmVjdGlvbik7CisgIAorICBIQVZFX0xPQ0tfQ0hFQ0sgKGNvbm5lY3Rpb24pOworICAvKiBVbmxvY2tzIGFuZCBjYWxscyBvdXQgdG8gdXNlciBjb2RlICovCisgIF9kYnVzX2Nvbm5lY3Rpb25fdXBkYXRlX2Rpc3BhdGNoX3N0YXR1c19hbmRfdW5sb2NrIChjb25uZWN0aW9uLCBzdGF0dXMpOworCisgIF9kYnVzX3ZlcmJvc2UgKCJlbmRcbiIpOworfQorCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gaW1wbGVtZW50cyBkYnVzX2Nvbm5lY3Rpb25fcmVhZF93cml0ZV9kaXNwYXRjaCgpIGFuZAorICogZGJ1c19jb25uZWN0aW9uX3JlYWRfd3JpdGUoKSAodGhleSBwYXNzIGEgZGlmZmVyZW50IHZhbHVlIGZvciB0aGUKKyAqIGRpc3BhdGNoIHBhcmFtZXRlcikuCisgKiAKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gdGltZW91dF9taWxsaXNlY29uZHMgbWF4IHRpbWUgdG8gYmxvY2sgb3IgLTEgZm9yIGluZmluaXRlCisgKiBAcGFyYW0gZGlzcGF0Y2ggZGlzcGF0Y2ggbmV3IG1lc3NhZ2VzIG9yIGxlYXZlIHRoZW0gb24gdGhlIGluY29taW5nIHF1ZXVlCisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGUgZGlzY29ubmVjdCBtZXNzYWdlIGhhcyBub3QgYmVlbiBwcm9jZXNzZWQKKyAqLworc3RhdGljIGRidXNfYm9vbF90CitfZGJ1c19jb25uZWN0aW9uX3JlYWRfd3JpdGVfZGlzcGF0Y2ggKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICB0aW1lb3V0X21pbGxpc2Vjb25kcywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgIGRpc3BhdGNoKQoreworICBEQnVzRGlzcGF0Y2hTdGF0dXMgZHN0YXR1czsKKyAgZGJ1c19ib29sX3QgcHJvZ3Jlc3NfcG9zc2libGU7CisKKyAgLyogTmVlZCB0byBncmFiIGEgcmVmIGhlcmUgaW4gY2FzZSB3ZSdyZSBhIHByaXZhdGUgY29ubmVjdGlvbiBhbmQKKyAgICogdGhlIHVzZXIgZHJvcHMgdGhlIGxhc3QgcmVmIGluIGEgaGFuZGxlciB3ZSBjYWxsOyBzZWUgYnVnIAorICAgKiBodHRwczovL2J1Z3MuZnJlZWRlc2t0b3Aub3JnL3Nob3dfYnVnLmNnaT9pZD0xNTYzNQorICAgKi8KKyAgZGJ1c19jb25uZWN0aW9uX3JlZiAoY29ubmVjdGlvbik7CisgIGRzdGF0dXMgPSBkYnVzX2Nvbm5lY3Rpb25fZ2V0X2Rpc3BhdGNoX3N0YXR1cyAoY29ubmVjdGlvbik7CisKKyAgaWYgKGRpc3BhdGNoICYmIGRzdGF0dXMgPT0gREJVU19ESVNQQVRDSF9EQVRBX1JFTUFJTlMpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoImRvaW5nIGRpc3BhdGNoXG4iKTsKKyAgICAgIGRidXNfY29ubmVjdGlvbl9kaXNwYXRjaCAoY29ubmVjdGlvbik7CisgICAgICBDT05ORUNUSU9OX0xPQ0sgKGNvbm5lY3Rpb24pOworICAgIH0KKyAgZWxzZSBpZiAoZHN0YXR1cyA9PSBEQlVTX0RJU1BBVENIX05FRURfTUVNT1JZKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJwYXVzaW5nIGZvciBtZW1vcnlcbiIpOworICAgICAgX2RidXNfbWVtb3J5X3BhdXNlX2Jhc2VkX29uX3RpbWVvdXQgKHRpbWVvdXRfbWlsbGlzZWNvbmRzKTsKKyAgICAgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKyAgICAgIGlmIChfZGJ1c19jb25uZWN0aW9uX2dldF9pc19jb25uZWN0ZWRfdW5sb2NrZWQgKGNvbm5lY3Rpb24pKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoImRvaW5nIGl0ZXJhdGlvblxuIik7CisgICAgICAgICAgX2RidXNfY29ubmVjdGlvbl9kb19pdGVyYXRpb25fdW5sb2NrZWQgKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSVRFUkFUSU9OX0RPX1JFQURJTkcgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0lURVJBVElPTl9ET19XUklUSU5HIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19JVEVSQVRJT05fQkxPQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXRfbWlsbGlzZWNvbmRzKTsKKyAgICAgICAgfQorICAgIH0KKyAgCisgIEhBVkVfTE9DS19DSEVDSyAoY29ubmVjdGlvbik7CisgIC8qIElmIHdlIGNhbiBkaXNwYXRjaCwgd2UgY2FuIG1ha2UgcHJvZ3Jlc3MgdW50aWwgdGhlIERpc2Nvbm5lY3RlZCBtZXNzYWdlCisgICAqIGhhcyBiZWVuIHByb2Nlc3NlZDsgaWYgd2UgY2FuIG9ubHkgcmVhZC93cml0ZSwgd2UgY2FuIG1ha2UgcHJvZ3Jlc3MKKyAgICogYXMgbG9uZyBhcyB0aGUgdHJhbnNwb3J0IGlzIG9wZW4uCisgICAqLworICBpZiAoZGlzcGF0Y2gpCisgICAgcHJvZ3Jlc3NfcG9zc2libGUgPSBjb25uZWN0aW9uLT5uX2luY29taW5nICE9IDAgfHwKKyAgICAgIGNvbm5lY3Rpb24tPmRpc2Nvbm5lY3RfbWVzc2FnZV9saW5rICE9IE5VTEw7CisgIGVsc2UKKyAgICBwcm9ncmVzc19wb3NzaWJsZSA9IF9kYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Nvbm5lY3RlZF91bmxvY2tlZCAoY29ubmVjdGlvbik7CisKKyAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworCisgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoY29ubmVjdGlvbik7CisKKyAgcmV0dXJuIHByb2dyZXNzX3Bvc3NpYmxlOyAvKiBUUlVFIGlmIHdlIGNhbiBtYWtlIG1vcmUgcHJvZ3Jlc3MgKi8KK30KKworCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gaXMgaW50ZW5kZWQgZm9yIHVzZSB3aXRoIGFwcGxpY2F0aW9ucyB0aGF0IGRvbid0IHdhbnQKKyAqIHRvIHdyaXRlIGEgbWFpbiBsb29wIGFuZCBkZWFsIHdpdGggI0RCdXNXYXRjaCBhbmQgI0RCdXNUaW1lb3V0LiBBbgorICogZXhhbXBsZSB1c2FnZSB3b3VsZCBiZToKKyAqIAorICogQGNvZGUKKyAqICAgd2hpbGUgKGRidXNfY29ubmVjdGlvbl9yZWFkX3dyaXRlX2Rpc3BhdGNoIChjb25uZWN0aW9uLCAtMSkpCisgKiAgICAgOyAvLyBlbXB0eSBsb29wIGJvZHkKKyAqIEBlbmRjb2RlCisgKiAKKyAqIEluIHRoaXMgdXNhZ2UgeW91IHdvdWxkIG5vcm1hbGx5IGhhdmUgc2V0IHVwIGEgZmlsdGVyIGZ1bmN0aW9uIHRvIGxvb2sKKyAqIGF0IGVhY2ggbWVzc2FnZSBhcyBpdCBpcyBkaXNwYXRjaGVkLiBUaGUgbG9vcCB0ZXJtaW5hdGVzIHdoZW4gdGhlIGxhc3QKKyAqIG1lc3NhZ2UgZnJvbSB0aGUgY29ubmVjdGlvbiAodGhlIGRpc2Nvbm5lY3RlZCBzaWduYWwpIGlzIHByb2Nlc3NlZC4KKyAqIAorICogSWYgdGhlcmUgYXJlIG1lc3NhZ2VzIHRvIGRpc3BhdGNoLCB0aGlzIGZ1bmN0aW9uIHdpbGwKKyAqIGRidXNfY29ubmVjdGlvbl9kaXNwYXRjaCgpIG9uY2UsIGFuZCByZXR1cm4uIElmIHRoZXJlIGFyZSBubworICogbWVzc2FnZXMgdG8gZGlzcGF0Y2gsIHRoaXMgZnVuY3Rpb24gd2lsbCBibG9jayB1bnRpbCBpdCBjYW4gcmVhZCBvcgorICogd3JpdGUsIHRoZW4gcmVhZCBvciB3cml0ZSwgdGhlbiByZXR1cm4uCisgKgorICogVGhlIHdheSB0byB0aGluayBvZiB0aGlzIGZ1bmN0aW9uIGlzIHRoYXQgaXQgZWl0aGVyIG1ha2VzIHNvbWUgc29ydAorICogb2YgcHJvZ3Jlc3MsIG9yIGl0IGJsb2Nrcy4gTm90ZSB0aGF0LCB3aGlsZSBpdCBpcyBibG9ja2VkIG9uIEkvTywgaXQKKyAqIGNhbm5vdCBiZSBpbnRlcnJ1cHRlZCAoZXZlbiBieSBvdGhlciB0aHJlYWRzKSwgd2hpY2ggbWFrZXMgdGhpcyBmdW5jdGlvbgorICogdW5zdWl0YWJsZSBmb3IgYXBwbGljYXRpb25zIHRoYXQgZG8gbW9yZSB0aGFuIGp1c3QgcmVhY3QgdG8gcmVjZWl2ZWQKKyAqIG1lc3NhZ2VzLgorICoKKyAqIFRoZSByZXR1cm4gdmFsdWUgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGRpc2Nvbm5lY3QgbWVzc2FnZSBoYXMgYmVlbgorICogcHJvY2Vzc2VkLCBOT1Qgd2hldGhlciB0aGUgY29ubmVjdGlvbiBpcyBjb25uZWN0ZWQuIFRoaXMgaXMKKyAqIGltcG9ydGFudCBiZWNhdXNlIGV2ZW4gYWZ0ZXIgZGlzY29ubmVjdGluZywgeW91IHdhbnQgdG8gcHJvY2VzcyBhbnkKKyAqIG1lc3NhZ2VzIHlvdSByZWNlaXZlZCBwcmlvciB0byB0aGUgZGlzY29ubmVjdC4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHBhcmFtIHRpbWVvdXRfbWlsbGlzZWNvbmRzIG1heCB0aW1lIHRvIGJsb2NrIG9yIC0xIGZvciBpbmZpbml0ZQorICogQHJldHVybnMgI1RSVUUgaWYgdGhlIGRpc2Nvbm5lY3QgbWVzc2FnZSBoYXMgbm90IGJlZW4gcHJvY2Vzc2VkCisgKi8KK2RidXNfYm9vbF90CitkYnVzX2Nvbm5lY3Rpb25fcmVhZF93cml0ZV9kaXNwYXRjaCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHRpbWVvdXRfbWlsbGlzZWNvbmRzKQoreworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHRpbWVvdXRfbWlsbGlzZWNvbmRzID49IDAgfHwgdGltZW91dF9taWxsaXNlY29uZHMgPT0gLTEsIEZBTFNFKTsKKyAgIHJldHVybiBfZGJ1c19jb25uZWN0aW9uX3JlYWRfd3JpdGVfZGlzcGF0Y2goY29ubmVjdGlvbiwgdGltZW91dF9taWxsaXNlY29uZHMsIFRSVUUpOworfQorCisvKiogCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGludGVuZGVkIGZvciB1c2Ugd2l0aCBhcHBsaWNhdGlvbnMgdGhhdCBkb24ndCB3YW50IHRvCisgKiB3cml0ZSBhIG1haW4gbG9vcCBhbmQgZGVhbCB3aXRoICNEQnVzV2F0Y2ggYW5kICNEQnVzVGltZW91dC4gU2VlIGFsc28KKyAqIGRidXNfY29ubmVjdGlvbl9yZWFkX3dyaXRlX2Rpc3BhdGNoKCkuCisgKiAKKyAqIEFzIGxvbmcgYXMgdGhlIGNvbm5lY3Rpb24gaXMgb3BlbiwgdGhpcyBmdW5jdGlvbiB3aWxsIGJsb2NrIHVudGlsIGl0IGNhbgorICogcmVhZCBvciB3cml0ZSwgdGhlbiByZWFkIG9yIHdyaXRlLCB0aGVuIHJldHVybiAjVFJVRS4KKyAqCisgKiBJZiB0aGUgY29ubmVjdGlvbiBpcyBjbG9zZWQsIHRoZSBmdW5jdGlvbiByZXR1cm5zICNGQUxTRS4KKyAqCisgKiBUaGUgcmV0dXJuIHZhbHVlIGluZGljYXRlcyB3aGV0aGVyIHJlYWRpbmcgb3Igd3JpdGluZyBpcyBzdGlsbAorICogcG9zc2libGUsIGkuZS4gd2hldGhlciB0aGUgY29ubmVjdGlvbiBpcyBjb25uZWN0ZWQuCisgKgorICogTm90ZSB0aGF0IGV2ZW4gYWZ0ZXIgZGlzY29ubmVjdGlvbiwgbWVzc2FnZXMgbWF5IHJlbWFpbiBpbiB0aGUKKyAqIGluY29taW5nIHF1ZXVlIHRoYXQgbmVlZCB0byBiZQorICogcHJvY2Vzc2VkLiBkYnVzX2Nvbm5lY3Rpb25fcmVhZF93cml0ZV9kaXNwYXRjaCgpIGRpc3BhdGNoZXMKKyAqIGluY29taW5nIG1lc3NhZ2VzIGZvciB5b3U7IHdpdGggZGJ1c19jb25uZWN0aW9uX3JlYWRfd3JpdGUoKSB5b3UKKyAqIGhhdmUgdG8gYXJyYW5nZSB0byBkcmFpbiB0aGUgaW5jb21pbmcgcXVldWUgeW91cnNlbGYuCisgKiAKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uIAorICogQHBhcmFtIHRpbWVvdXRfbWlsbGlzZWNvbmRzIG1heCB0aW1lIHRvIGJsb2NrIG9yIC0xIGZvciBpbmZpbml0ZSAKKyAqIEByZXR1cm5zICNUUlVFIGlmIHN0aWxsIGNvbm5lY3RlZAorICovCitkYnVzX2Jvb2xfdCAKK2RidXNfY29ubmVjdGlvbl9yZWFkX3dyaXRlIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHRpbWVvdXRfbWlsbGlzZWNvbmRzKSAKK3sgCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAodGltZW91dF9taWxsaXNlY29uZHMgPj0gMCB8fCB0aW1lb3V0X21pbGxpc2Vjb25kcyA9PSAtMSwgRkFMU0UpOworICAgcmV0dXJuIF9kYnVzX2Nvbm5lY3Rpb25fcmVhZF93cml0ZV9kaXNwYXRjaChjb25uZWN0aW9uLCB0aW1lb3V0X21pbGxpc2Vjb25kcywgRkFMU0UpOworfQorCisvKiBXZSBuZWVkIHRvIGNhbGwgdGhpcyBhbnl0aW1lIHdlIHBvcCB0aGUgaGVhZCBvZiB0aGUgcXVldWUsIGFuZCB0aGVuCisgKiB1cGRhdGVfZGlzcGF0Y2hfc3RhdHVzX2FuZF91bmxvY2sgbmVlZHMgdG8gYmUgY2FsbGVkIGFmdGVyd2FyZAorICogd2hpY2ggd2lsbCAicHJvY2VzcyIgdGhlIGRpc2Nvbm5lY3RlZCBtZXNzYWdlIGFuZCBzZXQKKyAqIGRpc2Nvbm5lY3RlZF9tZXNzYWdlX3Byb2Nlc3NlZC4KKyAqLworc3RhdGljIHZvaWQKK2NoZWNrX2Rpc2Nvbm5lY3RlZF9tZXNzYWdlX2Fycml2ZWRfdW5sb2NrZWQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgKmhlYWRfb2ZfcXVldWUpCit7CisgIEhBVkVfTE9DS19DSEVDSyAoY29ubmVjdGlvbik7CisKKyAgLyogY2hlY2tpbmcgdGhhdCB0aGUgbGluayBpcyBOVUxMIGlzIGFuIG9wdGltaXphdGlvbiB0byBhdm9pZCB0aGUgaXNfc2lnbmFsIGNhbGwgKi8KKyAgaWYgKGNvbm5lY3Rpb24tPmRpc2Nvbm5lY3RfbWVzc2FnZV9saW5rID09IE5VTEwgJiYKKyAgICAgIGRidXNfbWVzc2FnZV9pc19zaWduYWwgKGhlYWRfb2ZfcXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0lOVEVSRkFDRV9MT0NBTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEaXNjb25uZWN0ZWQiKSkKKyAgICB7CisgICAgICBjb25uZWN0aW9uLT5kaXNjb25uZWN0ZWRfbWVzc2FnZV9hcnJpdmVkID0gVFJVRTsKKyAgICB9Cit9CisKKy8qKgorICogUmV0dXJucyB0aGUgZmlyc3QtcmVjZWl2ZWQgbWVzc2FnZSBmcm9tIHRoZSBpbmNvbWluZyBtZXNzYWdlIHF1ZXVlLAorICogbGVhdmluZyBpdCBpbiB0aGUgcXVldWUuIElmIHRoZSBxdWV1ZSBpcyBlbXB0eSwgcmV0dXJucyAjTlVMTC4KKyAqIAorICogVGhlIGNhbGxlciBkb2VzIG5vdCBvd24gYSByZWZlcmVuY2UgdG8gdGhlIHJldHVybmVkIG1lc3NhZ2UsIGFuZAorICogbXVzdCBlaXRoZXIgcmV0dXJuIGl0IHVzaW5nIGRidXNfY29ubmVjdGlvbl9yZXR1cm5fbWVzc2FnZSgpIG9yCisgKiBrZWVwIGl0IGFmdGVyIGNhbGxpbmcgZGJ1c19jb25uZWN0aW9uX3N0ZWFsX2JvcnJvd2VkX21lc3NhZ2UoKS4gTm8KKyAqIG9uZSBjYW4gZ2V0IGF0IHRoZSBtZXNzYWdlIHdoaWxlIGl0cyBib3Jyb3dlZCwgc28gcmV0dXJuIGl0IGFzCisgKiBxdWlja2x5IGFzIHBvc3NpYmxlIGFuZCBkb24ndCBrZWVwIGEgcmVmZXJlbmNlIHRvIGl0IGFmdGVyCisgKiByZXR1cm5pbmcgaXQuIElmIHlvdSBuZWVkIHRvIGtlZXAgdGhlIG1lc3NhZ2UsIG1ha2UgYSBjb3B5IG9mIGl0LgorICoKKyAqIGRidXNfY29ubmVjdGlvbl9kaXNwYXRjaCgpIHdpbGwgYmxvY2sgaWYgY2FsbGVkIHdoaWxlIGEgYm9ycm93ZWQKKyAqIG1lc3NhZ2UgaXMgb3V0c3RhbmRpbmc7IG9ubHkgb25lIHBpZWNlIG9mIGNvZGUgY2FuIGJlIHBsYXlpbmcgd2l0aAorICogdGhlIGluY29taW5nIHF1ZXVlIGF0IGEgdGltZS4gVGhpcyBmdW5jdGlvbiB3aWxsIGJsb2NrIGlmIGNhbGxlZAorICogZHVyaW5nIGEgZGJ1c19jb25uZWN0aW9uX2Rpc3BhdGNoKCkuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24uCisgKiBAcmV0dXJucyBuZXh0IG1lc3NhZ2UgaW4gdGhlIGluY29taW5nIHF1ZXVlLgorICovCitEQnVzTWVzc2FnZSoKK2RidXNfY29ubmVjdGlvbl9ib3Jyb3dfbWVzc2FnZSAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIERCdXNEaXNwYXRjaFN0YXR1cyBzdGF0dXM7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMLCBOVUxMKTsKKworICBfZGJ1c192ZXJib3NlICgic3RhcnRcbiIpOworICAKKyAgLyogdGhpcyBpcyBjYWxsZWQgZm9yIHRoZSBzaWRlIGVmZmVjdCB0aGF0IGl0IHF1ZXVlcworICAgKiB1cCBhbnkgbWVzc2FnZXMgZnJvbSB0aGUgdHJhbnNwb3J0CisgICAqLworICBzdGF0dXMgPSBkYnVzX2Nvbm5lY3Rpb25fZ2V0X2Rpc3BhdGNoX3N0YXR1cyAoY29ubmVjdGlvbik7CisgIGlmIChzdGF0dXMgIT0gREJVU19ESVNQQVRDSF9EQVRBX1JFTUFJTlMpCisgICAgcmV0dXJuIE5VTEw7CisgIAorICBDT05ORUNUSU9OX0xPQ0sgKGNvbm5lY3Rpb24pOworCisgIF9kYnVzX2Nvbm5lY3Rpb25fYWNxdWlyZV9kaXNwYXRjaCAoY29ubmVjdGlvbik7CisKKyAgLyogV2hpbGUgYSBtZXNzYWdlIGlzIG91dHN0YW5kaW5nLCB0aGUgZGlzcGF0Y2ggbG9jayBpcyBoZWxkICovCisgIF9kYnVzX2Fzc2VydCAoY29ubmVjdGlvbi0+bWVzc2FnZV9ib3Jyb3dlZCA9PSBOVUxMKTsKKworICBjb25uZWN0aW9uLT5tZXNzYWdlX2JvcnJvd2VkID0gX2RidXNfbGlzdF9nZXRfZmlyc3QgKCZjb25uZWN0aW9uLT5pbmNvbWluZ19tZXNzYWdlcyk7CisgIAorICBtZXNzYWdlID0gY29ubmVjdGlvbi0+bWVzc2FnZV9ib3Jyb3dlZDsKKworICBjaGVja19kaXNjb25uZWN0ZWRfbWVzc2FnZV9hcnJpdmVkX3VubG9ja2VkIChjb25uZWN0aW9uLCBtZXNzYWdlKTsKKyAgCisgIC8qIE5vdGUgdGhhdCB3ZSBLRUVQIHRoZSBkaXNwYXRjaCBsb2NrIHVudGlsIHRoZSBtZXNzYWdlIGlzIHJldHVybmVkICovCisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgX2RidXNfY29ubmVjdGlvbl9yZWxlYXNlX2Rpc3BhdGNoIChjb25uZWN0aW9uKTsKKworICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7CisKKyAgX2RidXNfbWVzc2FnZV90cmFjZV9yZWYgKG1lc3NhZ2UsIC0xLCAtMSwgImRidXNfY29ubmVjdGlvbl9ib3Jyb3dfbWVzc2FnZSIpOworCisgIC8qIFdlIGRvbid0IHVwZGF0ZSBkaXNwYXRjaCBzdGF0dXMgdW50aWwgaXQncyByZXR1cm5lZCBvciBzdG9sZW4gKi8KKyAgCisgIHJldHVybiBtZXNzYWdlOworfQorCisvKioKKyAqIFVzZWQgdG8gcmV0dXJuIGEgbWVzc2FnZSBhZnRlciBwZWVraW5nIGF0IGl0IHVzaW5nCisgKiBkYnVzX2Nvbm5lY3Rpb25fYm9ycm93X21lc3NhZ2UoKS4gT25seSBjYWxsZWQgaWYKKyAqIG1lc3NhZ2UgZnJvbSBkYnVzX2Nvbm5lY3Rpb25fYm9ycm93X21lc3NhZ2UoKSB3YXMgbm9uLSNOVUxMLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSBmcm9tIGRidXNfY29ubmVjdGlvbl9ib3Jyb3dfbWVzc2FnZSgpCisgKi8KK3ZvaWQKK2RidXNfY29ubmVjdGlvbl9yZXR1cm5fbWVzc2FnZSAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkJREJ1c01lc3NhZ2UgICAgKm1lc3NhZ2UpCit7CisgIERCdXNEaXNwYXRjaFN0YXR1cyBzdGF0dXM7CisgIAorICBfZGJ1c19yZXR1cm5faWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMKTsKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKG1lc3NhZ2UgIT0gTlVMTCk7CisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChtZXNzYWdlID09IGNvbm5lY3Rpb24tPm1lc3NhZ2VfYm9ycm93ZWQpOworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAoY29ubmVjdGlvbi0+ZGlzcGF0Y2hfYWNxdWlyZWQpOworICAKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKyAgCisgIF9kYnVzX2Fzc2VydCAobWVzc2FnZSA9PSBjb25uZWN0aW9uLT5tZXNzYWdlX2JvcnJvd2VkKTsKKyAgCisgIGNvbm5lY3Rpb24tPm1lc3NhZ2VfYm9ycm93ZWQgPSBOVUxMOworCisgIF9kYnVzX2Nvbm5lY3Rpb25fcmVsZWFzZV9kaXNwYXRjaCAoY29ubmVjdGlvbik7IAorCisgIHN0YXR1cyA9IF9kYnVzX2Nvbm5lY3Rpb25fZ2V0X2Rpc3BhdGNoX3N0YXR1c191bmxvY2tlZCAoY29ubmVjdGlvbik7CisgIF9kYnVzX2Nvbm5lY3Rpb25fdXBkYXRlX2Rpc3BhdGNoX3N0YXR1c19hbmRfdW5sb2NrIChjb25uZWN0aW9uLCBzdGF0dXMpOworCisgIF9kYnVzX21lc3NhZ2VfdHJhY2VfcmVmIChtZXNzYWdlLCAtMSwgLTEsICJkYnVzX2Nvbm5lY3Rpb25fcmV0dXJuX21lc3NhZ2UiKTsKK30KKworLyoqCisgKiBVc2VkIHRvIGtlZXAgYSBtZXNzYWdlIGFmdGVyIHBlZWtpbmcgYXQgaXQgdXNpbmcKKyAqIGRidXNfY29ubmVjdGlvbl9ib3Jyb3dfbWVzc2FnZSgpLiBCZWZvcmUgdXNpbmcgdGhpcyBmdW5jdGlvbiwgc2VlCisgKiB0aGUgY2F2ZWF0cy93YXJuaW5ncyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBmb3IKKyAqIGRidXNfY29ubmVjdGlvbl9wb3BfbWVzc2FnZSgpLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSBmcm9tIGRidXNfY29ubmVjdGlvbl9ib3Jyb3dfbWVzc2FnZSgpCisgKi8KK3ZvaWQKK2RidXNfY29ubmVjdGlvbl9zdGVhbF9ib3Jyb3dlZF9tZXNzYWdlIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCQkJREJ1c01lc3NhZ2UgICAgKm1lc3NhZ2UpCit7CisgIERCdXNNZXNzYWdlICpwb3BfbWVzc2FnZTsKKyAgREJ1c0Rpc3BhdGNoU3RhdHVzIHN0YXR1czsKKworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMKTsKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKG1lc3NhZ2UgIT0gTlVMTCk7CisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChtZXNzYWdlID09IGNvbm5lY3Rpb24tPm1lc3NhZ2VfYm9ycm93ZWQpOworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAoY29ubmVjdGlvbi0+ZGlzcGF0Y2hfYWNxdWlyZWQpOworICAKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKyAKKyAgX2RidXNfYXNzZXJ0IChtZXNzYWdlID09IGNvbm5lY3Rpb24tPm1lc3NhZ2VfYm9ycm93ZWQpOworCisgIHBvcF9tZXNzYWdlID0gX2RidXNfbGlzdF9wb3BfZmlyc3QgKCZjb25uZWN0aW9uLT5pbmNvbWluZ19tZXNzYWdlcyk7CisgIF9kYnVzX2Fzc2VydCAobWVzc2FnZSA9PSBwb3BfbWVzc2FnZSk7CisgICh2b2lkKSBwb3BfbWVzc2FnZTsgLyogdW51c2VkIHVubGVzcyBhc3NlcnRpbmcgKi8KKworICBjb25uZWN0aW9uLT5uX2luY29taW5nIC09IDE7CisgCisgIF9kYnVzX3ZlcmJvc2UgKCJJbmNvbWluZyBtZXNzYWdlICVwIHN0b2xlbiBmcm9tIHF1ZXVlLCAlZCBpbmNvbWluZ1xuIiwKKwkJIG1lc3NhZ2UsIGNvbm5lY3Rpb24tPm5faW5jb21pbmcpOworIAorICBjb25uZWN0aW9uLT5tZXNzYWdlX2JvcnJvd2VkID0gTlVMTDsKKworICBfZGJ1c19jb25uZWN0aW9uX3JlbGVhc2VfZGlzcGF0Y2ggKGNvbm5lY3Rpb24pOworCisgIHN0YXR1cyA9IF9kYnVzX2Nvbm5lY3Rpb25fZ2V0X2Rpc3BhdGNoX3N0YXR1c191bmxvY2tlZCAoY29ubmVjdGlvbik7CisgIF9kYnVzX2Nvbm5lY3Rpb25fdXBkYXRlX2Rpc3BhdGNoX3N0YXR1c19hbmRfdW5sb2NrIChjb25uZWN0aW9uLCBzdGF0dXMpOworICBfZGJ1c19tZXNzYWdlX3RyYWNlX3JlZiAobWVzc2FnZSwgLTEsIC0xLAorICAgICAgImRidXNfY29ubmVjdGlvbl9zdGVhbF9ib3Jyb3dlZF9tZXNzYWdlIik7Cit9CisKKy8qIFNlZSBkYnVzX2Nvbm5lY3Rpb25fcG9wX21lc3NhZ2UsIGJ1dCByZXF1aXJlcyB0aGUgY2FsbGVyIHRvIG93bgorICogdGhlIGxvY2sgYmVmb3JlIGNhbGxpbmcuIE1heSBkcm9wIHRoZSBsb2NrIHdoaWxlIHJ1bm5pbmcuCisgKi8KK3N0YXRpYyBEQnVzTGlzdCoKK19kYnVzX2Nvbm5lY3Rpb25fcG9wX21lc3NhZ2VfbGlua191bmxvY2tlZCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIEhBVkVfTE9DS19DSEVDSyAoY29ubmVjdGlvbik7CisgIAorICBfZGJ1c19hc3NlcnQgKGNvbm5lY3Rpb24tPm1lc3NhZ2VfYm9ycm93ZWQgPT0gTlVMTCk7CisgIAorICBpZiAoY29ubmVjdGlvbi0+bl9pbmNvbWluZyA+IDApCisgICAgeworICAgICAgREJ1c0xpc3QgKmxpbms7CisKKyAgICAgIGxpbmsgPSBfZGJ1c19saXN0X3BvcF9maXJzdF9saW5rICgmY29ubmVjdGlvbi0+aW5jb21pbmdfbWVzc2FnZXMpOworICAgICAgY29ubmVjdGlvbi0+bl9pbmNvbWluZyAtPSAxOworCisgICAgICBfZGJ1c192ZXJib3NlICgiTWVzc2FnZSAlcCAoJXMgJXMgJXMgJXMgc2lnOiclcycgc2VyaWFsOiV1KSByZW1vdmVkIGZyb20gaW5jb21pbmcgcXVldWUgJXAsICVkIGluY29taW5nXG4iLAorICAgICAgICAgICAgICAgICAgICAgbGluay0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV90eXBlX3RvX3N0cmluZyAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChsaW5rLT5kYXRhKSksCisgICAgICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3BhdGggKGxpbmstPmRhdGEpID8KKyAgICAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfcGF0aCAobGluay0+ZGF0YSkgOgorICAgICAgICAgICAgICAgICAgICAgIm5vIHBhdGgiLAorICAgICAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKGxpbmstPmRhdGEpID8KKyAgICAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfaW50ZXJmYWNlIChsaW5rLT5kYXRhKSA6CisgICAgICAgICAgICAgICAgICAgICAibm8gaW50ZXJmYWNlIiwKKyAgICAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChsaW5rLT5kYXRhKSA/CisgICAgICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X21lbWJlciAobGluay0+ZGF0YSkgOgorICAgICAgICAgICAgICAgICAgICAgIm5vIG1lbWJlciIsCisgICAgICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3NpZ25hdHVyZSAobGluay0+ZGF0YSksCisgICAgICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3NlcmlhbCAobGluay0+ZGF0YSksCisgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLCBjb25uZWN0aW9uLT5uX2luY29taW5nKTsKKworICAgICAgX2RidXNfbWVzc2FnZV90cmFjZV9yZWYgKGxpbmstPmRhdGEsIC0xLCAtMSwKKyAgICAgICAgICAiX2RidXNfY29ubmVjdGlvbl9wb3BfbWVzc2FnZV9saW5rX3VubG9ja2VkIik7CisKKyAgICAgIGNoZWNrX2Rpc2Nvbm5lY3RlZF9tZXNzYWdlX2Fycml2ZWRfdW5sb2NrZWQgKGNvbm5lY3Rpb24sIGxpbmstPmRhdGEpOworICAgICAgCisgICAgICByZXR1cm4gbGluazsKKyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4gTlVMTDsKK30KKworLyogU2VlIGRidXNfY29ubmVjdGlvbl9wb3BfbWVzc2FnZSwgYnV0IHJlcXVpcmVzIHRoZSBjYWxsZXIgdG8gb3duCisgKiB0aGUgbG9jayBiZWZvcmUgY2FsbGluZy4gTWF5IGRyb3AgdGhlIGxvY2sgd2hpbGUgcnVubmluZy4KKyAqLworc3RhdGljIERCdXNNZXNzYWdlKgorX2RidXNfY29ubmVjdGlvbl9wb3BfbWVzc2FnZV91bmxvY2tlZCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIERCdXNMaXN0ICpsaW5rOworCisgIEhBVkVfTE9DS19DSEVDSyAoY29ubmVjdGlvbik7CisgIAorICBsaW5rID0gX2RidXNfY29ubmVjdGlvbl9wb3BfbWVzc2FnZV9saW5rX3VubG9ja2VkIChjb25uZWN0aW9uKTsKKworICBpZiAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIERCdXNNZXNzYWdlICptZXNzYWdlOworICAgICAgCisgICAgICBtZXNzYWdlID0gbGluay0+ZGF0YTsKKyAgICAgIAorICAgICAgX2RidXNfbGlzdF9mcmVlX2xpbmsgKGxpbmspOworICAgICAgCisgICAgICByZXR1cm4gbWVzc2FnZTsKKyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK19kYnVzX2Nvbm5lY3Rpb25fcHV0YmFja19tZXNzYWdlX2xpbmtfdW5sb2NrZWQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICAgICAgKm1lc3NhZ2VfbGluaykKK3sKKyAgSEFWRV9MT0NLX0NIRUNLIChjb25uZWN0aW9uKTsKKyAgCisgIF9kYnVzX2Fzc2VydCAobWVzc2FnZV9saW5rICE9IE5VTEwpOworICAvKiBZb3UgY2FuJ3QgYm9ycm93IGEgbWVzc2FnZSB3aGlsZSBhIGxpbmsgaXMgb3V0c3RhbmRpbmcgKi8KKyAgX2RidXNfYXNzZXJ0IChjb25uZWN0aW9uLT5tZXNzYWdlX2JvcnJvd2VkID09IE5VTEwpOworICAvKiBXZSBoYWQgdG8gaGF2ZSB0aGUgZGlzcGF0Y2ggbG9jayBhY3Jvc3MgdGhlIHBvcC9wdXRiYWNrICovCisgIF9kYnVzX2Fzc2VydCAoY29ubmVjdGlvbi0+ZGlzcGF0Y2hfYWNxdWlyZWQpOworCisgIF9kYnVzX2xpc3RfcHJlcGVuZF9saW5rICgmY29ubmVjdGlvbi0+aW5jb21pbmdfbWVzc2FnZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlX2xpbmspOworICBjb25uZWN0aW9uLT5uX2luY29taW5nICs9IDE7CisKKyAgX2RidXNfdmVyYm9zZSAoIk1lc3NhZ2UgJXAgKCVzICVzICVzICclcycpIHB1dCBiYWNrIGludG8gcXVldWUgJXAsICVkIGluY29taW5nXG4iLAorICAgICAgICAgICAgICAgICBtZXNzYWdlX2xpbmstPmRhdGEsCisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV90eXBlX3RvX3N0cmluZyAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlX2xpbmstPmRhdGEpKSwKKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG1lc3NhZ2VfbGluay0+ZGF0YSkgPworICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAobWVzc2FnZV9saW5rLT5kYXRhKSA6CisgICAgICAgICAgICAgICAgICJubyBpbnRlcmZhY2UiLAorICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X21lbWJlciAobWVzc2FnZV9saW5rLT5kYXRhKSA/CisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlX2xpbmstPmRhdGEpIDoKKyAgICAgICAgICAgICAgICAgIm5vIG1lbWJlciIsCisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfc2lnbmF0dXJlIChtZXNzYWdlX2xpbmstPmRhdGEpLAorICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLCBjb25uZWN0aW9uLT5uX2luY29taW5nKTsKKworICBfZGJ1c19tZXNzYWdlX3RyYWNlX3JlZiAobWVzc2FnZV9saW5rLT5kYXRhLCAtMSwgLTEsCisgICAgICAiX2RidXNfY29ubmVjdGlvbl9wdXRiYWNrX21lc3NhZ2VfbGlua191bmxvY2tlZCIpOworfQorCisvKioKKyAqIFJldHVybnMgdGhlIGZpcnN0LXJlY2VpdmVkIG1lc3NhZ2UgZnJvbSB0aGUgaW5jb21pbmcgbWVzc2FnZSBxdWV1ZSwKKyAqIHJlbW92aW5nIGl0IGZyb20gdGhlIHF1ZXVlLiBUaGUgY2FsbGVyIG93bnMgYSByZWZlcmVuY2UgdG8gdGhlCisgKiByZXR1cm5lZCBtZXNzYWdlLiBJZiB0aGUgcXVldWUgaXMgZW1wdHksIHJldHVybnMgI05VTEwuCisgKgorICogVGhpcyBmdW5jdGlvbiBieXBhc3NlcyBhbnkgbWVzc2FnZSBoYW5kbGVycyB0aGF0IGFyZSByZWdpc3RlcmVkLAorICogYW5kIHNvIHVzaW5nIGl0IGlzIHVzdWFsbHkgd3JvbmcuIEluc3RlYWQsIGxldCB0aGUgbWFpbiBsb29wIGludm9rZQorICogZGJ1c19jb25uZWN0aW9uX2Rpc3BhdGNoKCkuIFBvcHBpbmcgbWVzc2FnZXMgbWFudWFsbHkgaXMgb25seQorICogdXNlZnVsIGluIHZlcnkgc2ltcGxlIHByb2dyYW1zIHRoYXQgZG9uJ3Qgc2hhcmUgYSAjREJ1c0Nvbm5lY3Rpb24KKyAqIHdpdGggYW55IGxpYnJhcmllcyBvciBvdGhlciBtb2R1bGVzLgorICoKKyAqIFRoZXJlIGlzIGEgbG9jayB0aGF0IGNvdmVycyBhbGwgd2F5cyBvZiBhY2Nlc3NpbmcgdGhlIGluY29taW5nIG1lc3NhZ2UKKyAqIHF1ZXVlLCBzbyBkYnVzX2Nvbm5lY3Rpb25fZGlzcGF0Y2goKSwgZGJ1c19jb25uZWN0aW9uX3BvcF9tZXNzYWdlKCksCisgKiBkYnVzX2Nvbm5lY3Rpb25fYm9ycm93X21lc3NhZ2UoKSwgZXRjLiB3aWxsIGFsbCBibG9jayB3aGlsZSBvbmUgb2YgdGhlIG90aGVycworICogaW4gdGhlIGdyb3VwIGlzIHJ1bm5pbmcuCisgKiAKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uLgorICogQHJldHVybnMgbmV4dCBtZXNzYWdlIGluIHRoZSBpbmNvbWluZyBxdWV1ZS4KKyAqLworREJ1c01lc3NhZ2UqCitkYnVzX2Nvbm5lY3Rpb25fcG9wX21lc3NhZ2UgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBEQnVzTWVzc2FnZSAqbWVzc2FnZTsKKyAgREJ1c0Rpc3BhdGNoU3RhdHVzIHN0YXR1czsKKworICBfZGJ1c192ZXJib3NlICgic3RhcnRcbiIpOworICAKKyAgLyogdGhpcyBpcyBjYWxsZWQgZm9yIHRoZSBzaWRlIGVmZmVjdCB0aGF0IGl0IHF1ZXVlcworICAgKiB1cCBhbnkgbWVzc2FnZXMgZnJvbSB0aGUgdHJhbnNwb3J0CisgICAqLworICBzdGF0dXMgPSBkYnVzX2Nvbm5lY3Rpb25fZ2V0X2Rpc3BhdGNoX3N0YXR1cyAoY29ubmVjdGlvbik7CisgIGlmIChzdGF0dXMgIT0gREJVU19ESVNQQVRDSF9EQVRBX1JFTUFJTlMpCisgICAgcmV0dXJuIE5VTEw7CisgIAorICBDT05ORUNUSU9OX0xPQ0sgKGNvbm5lY3Rpb24pOworICBfZGJ1c19jb25uZWN0aW9uX2FjcXVpcmVfZGlzcGF0Y2ggKGNvbm5lY3Rpb24pOworICBIQVZFX0xPQ0tfQ0hFQ0sgKGNvbm5lY3Rpb24pOworICAKKyAgbWVzc2FnZSA9IF9kYnVzX2Nvbm5lY3Rpb25fcG9wX21lc3NhZ2VfdW5sb2NrZWQgKGNvbm5lY3Rpb24pOworCisgIF9kYnVzX3ZlcmJvc2UgKCJSZXR1cm5pbmcgcG9wcGVkIG1lc3NhZ2UgJXBcbiIsIG1lc3NhZ2UpOyAgICAKKworICBfZGJ1c19jb25uZWN0aW9uX3JlbGVhc2VfZGlzcGF0Y2ggKGNvbm5lY3Rpb24pOworCisgIHN0YXR1cyA9IF9kYnVzX2Nvbm5lY3Rpb25fZ2V0X2Rpc3BhdGNoX3N0YXR1c191bmxvY2tlZCAoY29ubmVjdGlvbik7CisgIF9kYnVzX2Nvbm5lY3Rpb25fdXBkYXRlX2Rpc3BhdGNoX3N0YXR1c19hbmRfdW5sb2NrIChjb25uZWN0aW9uLCBzdGF0dXMpOworICAKKyAgcmV0dXJuIG1lc3NhZ2U7Cit9CisKKy8qKgorICogQWNxdWlyZSB0aGUgZGlzcGF0Y2hlci4gVGhpcyBpcyBhIHNlcGFyYXRlIGxvY2sgc28gdGhlIG1haW4KKyAqIGNvbm5lY3Rpb24gbG9jayBjYW4gYmUgZHJvcHBlZCB0byBjYWxsIG91dCB0byBhcHBsaWNhdGlvbiBkaXNwYXRjaAorICogaGFuZGxlcnMuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24uCisgKi8KK3N0YXRpYyB2b2lkCitfZGJ1c19jb25uZWN0aW9uX2FjcXVpcmVfZGlzcGF0Y2ggKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBIQVZFX0xPQ0tfQ0hFQ0sgKGNvbm5lY3Rpb24pOworCisgIF9kYnVzX2Nvbm5lY3Rpb25fcmVmX3VubG9ja2VkIChjb25uZWN0aW9uKTsKKyAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworICAKKyAgX2RidXNfdmVyYm9zZSAoImxvY2tpbmcgZGlzcGF0Y2hfbXV0ZXhcbiIpOworICBfZGJ1c19jbXV0ZXhfbG9jayAoY29ubmVjdGlvbi0+ZGlzcGF0Y2hfbXV0ZXgpOworCisgIHdoaWxlIChjb25uZWN0aW9uLT5kaXNwYXRjaF9hY3F1aXJlZCkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgid2FpdGluZyBmb3IgZGlzcGF0Y2ggdG8gYmUgYWNxdWlyYWJsZVxuIik7CisgICAgICBfZGJ1c19jb25kdmFyX3dhaXQgKGNvbm5lY3Rpb24tPmRpc3BhdGNoX2NvbmQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLT5kaXNwYXRjaF9tdXRleCk7CisgICAgfQorICAKKyAgX2RidXNfYXNzZXJ0ICghY29ubmVjdGlvbi0+ZGlzcGF0Y2hfYWNxdWlyZWQpOworCisgIGNvbm5lY3Rpb24tPmRpc3BhdGNoX2FjcXVpcmVkID0gVFJVRTsKKworICBfZGJ1c192ZXJib3NlICgidW5sb2NraW5nIGRpc3BhdGNoX211dGV4XG4iKTsKKyAgX2RidXNfY211dGV4X3VubG9jayAoY29ubmVjdGlvbi0+ZGlzcGF0Y2hfbXV0ZXgpOworICAKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKyAgX2RidXNfY29ubmVjdGlvbl91bnJlZl91bmxvY2tlZCAoY29ubmVjdGlvbik7Cit9CisKKy8qKgorICogUmVsZWFzZSB0aGUgZGlzcGF0Y2hlciB3aGVuIHlvdSdyZSBkb25lIHdpdGggaXQuIE9ubHkgY2FsbAorICogYWZ0ZXIgeW91J3ZlIGFjcXVpcmVkIHRoZSBkaXNwYXRjaGVyLiBXYWtlcyB1cCBhdCBtb3N0IG9uZQorICogdGhyZWFkIGN1cnJlbnRseSB3YWl0aW5nIHRvIGFjcXVpcmUgdGhlIGRpc3BhdGNoZXIuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24uCisgKi8KK3N0YXRpYyB2b2lkCitfZGJ1c19jb25uZWN0aW9uX3JlbGVhc2VfZGlzcGF0Y2ggKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBIQVZFX0xPQ0tfQ0hFQ0sgKGNvbm5lY3Rpb24pOworICAKKyAgX2RidXNfdmVyYm9zZSAoImxvY2tpbmcgZGlzcGF0Y2hfbXV0ZXhcbiIpOworICBfZGJ1c19jbXV0ZXhfbG9jayAoY29ubmVjdGlvbi0+ZGlzcGF0Y2hfbXV0ZXgpOworICAKKyAgX2RidXNfYXNzZXJ0IChjb25uZWN0aW9uLT5kaXNwYXRjaF9hY3F1aXJlZCk7CisKKyAgY29ubmVjdGlvbi0+ZGlzcGF0Y2hfYWNxdWlyZWQgPSBGQUxTRTsKKyAgX2RidXNfY29uZHZhcl93YWtlX29uZSAoY29ubmVjdGlvbi0+ZGlzcGF0Y2hfY29uZCk7CisKKyAgX2RidXNfdmVyYm9zZSAoInVubG9ja2luZyBkaXNwYXRjaF9tdXRleFxuIik7CisgIF9kYnVzX2NtdXRleF91bmxvY2sgKGNvbm5lY3Rpb24tPmRpc3BhdGNoX211dGV4KTsKK30KKworc3RhdGljIHZvaWQKK19kYnVzX2Nvbm5lY3Rpb25fZmFpbGVkX3BvcCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkgICAgIERCdXNMaXN0ICAgICAgICptZXNzYWdlX2xpbmspCit7CisgIF9kYnVzX2xpc3RfcHJlcGVuZF9saW5rICgmY29ubmVjdGlvbi0+aW5jb21pbmdfbWVzc2FnZXMsCisJCQkgICBtZXNzYWdlX2xpbmspOworICBjb25uZWN0aW9uLT5uX2luY29taW5nICs9IDE7Cit9CisKKy8qIE5vdGUgdGhpcyBtYXkgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIHNpbmNlIHdlIGRvbid0IHRyYWNrIHdoZXRoZXIgd2UgYWxyZWFkeSBkaWQgaXQgKi8KK3N0YXRpYyB2b2lkCitub3RpZnlfZGlzY29ubmVjdGVkX3VubG9ja2VkIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgSEFWRV9MT0NLX0NIRUNLIChjb25uZWN0aW9uKTsKKworICAvKiBTZXQgdGhlIHdlYWtyZWYgaW4gZGJ1cy1idXMuYyB0byBOVUxMLCBzbyBub2JvZHkgd2lsbCBnZXQgYSBkaXNjb25uZWN0ZWQKKyAgICogY29ubmVjdGlvbiBmcm9tIGRidXNfYnVzX2dldCgpLiBXZSBtYWtlIHRoZSBzYW1lIGd1YXJhbnRlZSBmb3IKKyAgICogZGJ1c19jb25uZWN0aW9uX29wZW4oKSBidXQgaW4gYSBkaWZmZXJlbnQgd2F5IHNpbmNlIHdlIGRvbid0IHdhbnQgdG8KKyAgICogdW5yZWYgcmlnaHQgaGVyZTsgd2UgaW5zdGVhZCBjaGVjayBmb3IgY29ubmVjdGVkbmVzcyBiZWZvcmUgcmV0dXJuaW5nCisgICAqIHRoZSBjb25uZWN0aW9uIGZyb20gdGhlIGhhc2guCisgICAqLworICBfZGJ1c19idXNfbm90aWZ5X3NoYXJlZF9jb25uZWN0aW9uX2Rpc2Nvbm5lY3RlZF91bmxvY2tlZCAoY29ubmVjdGlvbik7CisKKyAgLyogRHVtcCB0aGUgb3V0Z29pbmcgcXVldWUsIHdlIGFyZW4ndCBnb2luZyB0byBiZSBhYmxlIHRvCisgICAqIHNlbmQgaXQgbm93LCBhbmQgd2UnZCBsaWtlIGFjY2Vzc29ycyBsaWtlCisgICAqIGRidXNfY29ubmVjdGlvbl9nZXRfb3V0Z29pbmdfc2l6ZSgpIHRvIGJlIGFjY3VyYXRlLgorICAgKi8KKyAgaWYgKGNvbm5lY3Rpb24tPm5fb3V0Z29pbmcgPiAwKQorICAgIHsKKyAgICAgIERCdXNMaXN0ICpsaW5rOworICAgICAgCisgICAgICBfZGJ1c192ZXJib3NlICgiRHJvcHBpbmcgJWQgb3V0Z29pbmcgbWVzc2FnZXMgc2luY2Ugd2UncmUgZGlzY29ubmVjdGVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi0+bl9vdXRnb2luZyk7CisgICAgICAKKyAgICAgIHdoaWxlICgobGluayA9IF9kYnVzX2xpc3RfZ2V0X2xhc3RfbGluayAoJmNvbm5lY3Rpb24tPm91dGdvaW5nX21lc3NhZ2VzKSkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19jb25uZWN0aW9uX21lc3NhZ2Vfc2VudF91bmxvY2tlZCAoY29ubmVjdGlvbiwgbGluay0+ZGF0YSk7CisgICAgICAgIH0KKyAgICB9IAorfQorCisvKiBOb3RlIHRoaXMgbWF5IGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBzaW5jZSB3ZSBkb24ndCB0cmFjayB3aGV0aGVyIHdlIGFscmVhZHkgZGlkIGl0ICovCitzdGF0aWMgREJ1c0Rpc3BhdGNoU3RhdHVzCitub3RpZnlfZGlzY29ubmVjdGVkX2FuZF9kaXNwYXRjaF9jb21wbGV0ZV91bmxvY2tlZCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIEhBVkVfTE9DS19DSEVDSyAoY29ubmVjdGlvbik7CisgIAorICBpZiAoY29ubmVjdGlvbi0+ZGlzY29ubmVjdF9tZXNzYWdlX2xpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiU2VuZGluZyBkaXNjb25uZWN0IG1lc3NhZ2VcbiIpOworICAgICAgCisgICAgICAvKiBJZiB3ZSBoYXZlIHBlbmRpbmcgY2FsbHMsIHF1ZXVlIHRoZWlyIHRpbWVvdXRzIC0gd2Ugd2FudCB0aGUgRGlzY29ubmVjdGVkCisgICAgICAgKiB0byBiZSB0aGUgbGFzdCBtZXNzYWdlLCBhZnRlciB0aGVzZSB0aW1lb3V0cy4KKyAgICAgICAqLworICAgICAgY29ubmVjdGlvbl90aW1lb3V0X2FuZF9jb21wbGV0ZV9hbGxfcGVuZGluZ19jYWxsc191bmxvY2tlZCAoY29ubmVjdGlvbik7CisgICAgICAKKyAgICAgIC8qIFdlIGhhdmVuJ3Qgc2VudCB0aGUgZGlzY29ubmVjdCBtZXNzYWdlIGFscmVhZHksCisgICAgICAgKiBhbmQgYWxsIHJlYWwgbWVzc2FnZXMgaGF2ZSBiZWVuIHF1ZXVlZCB1cC4KKyAgICAgICAqLworICAgICAgX2RidXNfY29ubmVjdGlvbl9xdWV1ZV9zeW50aGVzaXplZF9tZXNzYWdlX2xpbmsgKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi0+ZGlzY29ubmVjdF9tZXNzYWdlX2xpbmspOworICAgICAgY29ubmVjdGlvbi0+ZGlzY29ubmVjdF9tZXNzYWdlX2xpbmsgPSBOVUxMOworCisgICAgICByZXR1cm4gREJVU19ESVNQQVRDSF9EQVRBX1JFTUFJTlM7CisgICAgfQorCisgIHJldHVybiBEQlVTX0RJU1BBVENIX0NPTVBMRVRFOworfQorCitzdGF0aWMgREJ1c0Rpc3BhdGNoU3RhdHVzCitfZGJ1c19jb25uZWN0aW9uX2dldF9kaXNwYXRjaF9zdGF0dXNfdW5sb2NrZWQgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBIQVZFX0xPQ0tfQ0hFQ0sgKGNvbm5lY3Rpb24pOworICAKKyAgaWYgKGNvbm5lY3Rpb24tPm5faW5jb21pbmcgPiAwKQorICAgIHJldHVybiBEQlVTX0RJU1BBVENIX0RBVEFfUkVNQUlOUzsKKyAgZWxzZSBpZiAoIV9kYnVzX3RyYW5zcG9ydF9xdWV1ZV9tZXNzYWdlcyAoY29ubmVjdGlvbi0+dHJhbnNwb3J0KSkKKyAgICByZXR1cm4gREJVU19ESVNQQVRDSF9ORUVEX01FTU9SWTsKKyAgZWxzZQorICAgIHsKKyAgICAgIERCdXNEaXNwYXRjaFN0YXR1cyBzdGF0dXM7CisgICAgICBkYnVzX2Jvb2xfdCBpc19jb25uZWN0ZWQ7CisgICAgICAKKyAgICAgIHN0YXR1cyA9IF9kYnVzX3RyYW5zcG9ydF9nZXRfZGlzcGF0Y2hfc3RhdHVzIChjb25uZWN0aW9uLT50cmFuc3BvcnQpOworICAgICAgaXNfY29ubmVjdGVkID0gX2RidXNfdHJhbnNwb3J0X2dldF9pc19jb25uZWN0ZWQgKGNvbm5lY3Rpb24tPnRyYW5zcG9ydCk7CisKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJkaXNwYXRjaCBzdGF0dXMgPSAlcyBpc19jb25uZWN0ZWQgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgIERJU1BBVENIX1NUQVRVU19OQU1FIChzdGF0dXMpLCBpc19jb25uZWN0ZWQpOworICAgICAgCisgICAgICBpZiAoIWlzX2Nvbm5lY3RlZCkKKyAgICAgICAgeworICAgICAgICAgIC8qIEl0J3MgcG9zc2libGUgdGhpcyB3b3VsZCBiZSBiZXR0ZXIgZG9uZSBieSBoYXZpbmcgYW4gZXhwbGljaXQKKyAgICAgICAgICAgKiBub3RpZmljYXRpb24gZnJvbSBfZGJ1c190cmFuc3BvcnRfZGlzY29ubmVjdCgpIHRoYXQgd291bGQKKyAgICAgICAgICAgKiBzeW5jaHJvbm91c2x5IGRvIHRoaXMsIGluc3RlYWQgb2Ygd2FpdGluZyBmb3IgdGhlIG5leHQgZGlzcGF0Y2gKKyAgICAgICAgICAgKiBzdGF0dXMgY2hlY2suIEhvd2V2ZXIsIHByb2JhYmx5IG5vdCBnb29kIHRvIGNoYW5nZSB1bnRpbCBpdCBjYXVzZXMKKyAgICAgICAgICAgKiBhIHByb2JsZW0uCisgICAgICAgICAgICovCisgICAgICAgICAgbm90aWZ5X2Rpc2Nvbm5lY3RlZF91bmxvY2tlZCAoY29ubmVjdGlvbik7CisKKyAgICAgICAgICAvKiBJJ20gbm90IHN1cmUgdGhpcyBpcyBuZWVkZWQ7IHRoZSBpZGVhIGlzIHRoYXQgd2Ugd2FudCB0bworICAgICAgICAgICAqIHF1ZXVlIHRoZSBEaXNjb25uZWN0ZWQgb25seSBhZnRlciB3ZSd2ZSByZWFkIGFsbCB0aGUKKyAgICAgICAgICAgKiBtZXNzYWdlcywgYnV0IGlmIHdlJ3JlIGRpc2Nvbm5lY3RlZCBtYXliZSB3ZSBhcmUgZ3VhcmFudGVlZAorICAgICAgICAgICAqIHRvIGhhdmUgcmVhZCB0aGVtIGFsbCA/CisgICAgICAgICAgICovCisgICAgICAgICAgaWYgKHN0YXR1cyA9PSBEQlVTX0RJU1BBVENIX0NPTVBMRVRFKQorICAgICAgICAgICAgc3RhdHVzID0gbm90aWZ5X2Rpc2Nvbm5lY3RlZF9hbmRfZGlzcGF0Y2hfY29tcGxldGVfdW5sb2NrZWQgKGNvbm5lY3Rpb24pOworICAgICAgICB9CisgICAgICAKKyAgICAgIGlmIChzdGF0dXMgIT0gREJVU19ESVNQQVRDSF9DT01QTEVURSkKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgIGVsc2UgaWYgKGNvbm5lY3Rpb24tPm5faW5jb21pbmcgPiAwKQorICAgICAgICByZXR1cm4gREJVU19ESVNQQVRDSF9EQVRBX1JFTUFJTlM7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBEQlVTX0RJU1BBVENIX0NPTVBMRVRFOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK19kYnVzX2Nvbm5lY3Rpb25fdXBkYXRlX2Rpc3BhdGNoX3N0YXR1c19hbmRfdW5sb2NrIChEQnVzQ29ubmVjdGlvbiAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRGlzcGF0Y2hTdGF0dXMgbmV3X3N0YXR1cykKK3sKKyAgZGJ1c19ib29sX3QgY2hhbmdlZDsKKyAgREJ1c0Rpc3BhdGNoU3RhdHVzRnVuY3Rpb24gZnVuY3Rpb247CisgIHZvaWQgKmRhdGE7CisKKyAgSEFWRV9MT0NLX0NIRUNLIChjb25uZWN0aW9uKTsKKworICBfZGJ1c19jb25uZWN0aW9uX3JlZl91bmxvY2tlZCAoY29ubmVjdGlvbik7CisKKyAgY2hhbmdlZCA9IG5ld19zdGF0dXMgIT0gY29ubmVjdGlvbi0+bGFzdF9kaXNwYXRjaF9zdGF0dXM7CisKKyAgY29ubmVjdGlvbi0+bGFzdF9kaXNwYXRjaF9zdGF0dXMgPSBuZXdfc3RhdHVzOworCisgIGZ1bmN0aW9uID0gY29ubmVjdGlvbi0+ZGlzcGF0Y2hfc3RhdHVzX2Z1bmN0aW9uOworICBkYXRhID0gY29ubmVjdGlvbi0+ZGlzcGF0Y2hfc3RhdHVzX2RhdGE7CisKKyAgaWYgKGNvbm5lY3Rpb24tPmRpc2Nvbm5lY3RlZF9tZXNzYWdlX2Fycml2ZWQgJiYKKyAgICAgICFjb25uZWN0aW9uLT5kaXNjb25uZWN0ZWRfbWVzc2FnZV9wcm9jZXNzZWQpCisgICAgeworICAgICAgY29ubmVjdGlvbi0+ZGlzY29ubmVjdGVkX21lc3NhZ2VfcHJvY2Vzc2VkID0gVFJVRTsKKyAgICAgIAorICAgICAgLyogdGhpcyBkb2VzIGFuIHVucmVmLCBidXQgd2UgaGF2ZSBhIHJlZgorICAgICAgICogc28gd2Ugc2hvdWxkIG5vdCBydW4gdGhlIGZpbmFsaXplciBoZXJlCisgICAgICAgKiBpbnNpZGUgdGhlIGxvY2suCisgICAgICAgKi8KKyAgICAgIGNvbm5lY3Rpb25fZm9yZ2V0X3NoYXJlZF91bmxvY2tlZCAoY29ubmVjdGlvbik7CisKKyAgICAgIGlmIChjb25uZWN0aW9uLT5leGl0X29uX2Rpc2Nvbm5lY3QpCisgICAgICAgIHsKKyAgICAgICAgICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7ICAgICAgICAgICAgCisgICAgICAgICAgCisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkV4aXRpbmcgb24gRGlzY29ubmVjdGVkIHNpZ25hbFxuIik7CisgICAgICAgICAgX2RidXNfZXhpdCAoMSk7CisgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiQ2FsbCB0byBleGl0KCkgcmV0dXJuZWQiKTsKKyAgICAgICAgfQorICAgIH0KKyAgCisgIC8qIFdlIGRyb3AgdGhlIGxvY2sgKi8KKyAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworICAKKyAgaWYgKGNoYW5nZWQgJiYgZnVuY3Rpb24pCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIk5vdGlmeWluZyBvZiBjaGFuZ2UgdG8gZGlzcGF0Y2ggc3RhdHVzIG9mICVwIG5vdyAlZCAoJXMpXG4iLAorICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiwgbmV3X3N0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgIERJU1BBVENIX1NUQVRVU19OQU1FIChuZXdfc3RhdHVzKSk7CisgICAgICAoKiBmdW5jdGlvbikgKGNvbm5lY3Rpb24sIG5ld19zdGF0dXMsIGRhdGEpOyAgICAgIAorICAgIH0KKyAgCisgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoY29ubmVjdGlvbik7Cit9CisKKy8qKgorICogR2V0cyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgaW5jb21pbmcgbWVzc2FnZSBxdWV1ZS4KKyAqICNEQlVTX0RJU1BBVENIX0RBVEFfUkVNQUlOUyBpbmRpY2F0ZXMgdGhhdCB0aGUgbWVzc2FnZSBxdWV1ZQorICogbWF5IGNvbnRhaW4gbWVzc2FnZXMuICNEQlVTX0RJU1BBVENIX0NPTVBMRVRFIGluZGljYXRlcyB0aGF0IHRoZQorICogaW5jb21pbmcgcXVldWUgaXMgZW1wdHkuICNEQlVTX0RJU1BBVENIX05FRURfTUVNT1JZIGluZGljYXRlcyB0aGF0CisgKiB0aGVyZSBjb3VsZCBiZSBkYXRhLCBidXQgd2UgY2FuJ3Qga25vdyBmb3Igc3VyZSB3aXRob3V0IG1vcmUKKyAqIG1lbW9yeS4KKyAqCisgKiBUbyBwcm9jZXNzIHRoZSBpbmNvbWluZyBtZXNzYWdlIHF1ZXVlLCB1c2UgZGJ1c19jb25uZWN0aW9uX2Rpc3BhdGNoKCkKKyAqIG9yIChpbiByYXJlIGNhc2VzKSBkYnVzX2Nvbm5lY3Rpb25fcG9wX21lc3NhZ2UoKS4KKyAqCisgKiBOb3RlLCAjREJVU19ESVNQQVRDSF9EQVRBX1JFTUFJTlMgcmVhbGx5IG1lYW5zIHRoYXQgZWl0aGVyIHdlCisgKiBoYXZlIG1lc3NhZ2VzIGluIHRoZSBxdWV1ZSwgb3Igd2UgaGF2ZSByYXcgYnl0ZXMgYnVmZmVyZWQgdXAKKyAqIHRoYXQgbmVlZCB0byBiZSBwYXJzZWQuIFdoZW4gdGhlc2UgYnl0ZXMgYXJlIHBhcnNlZCwgdGhleQorICogbWF5IG5vdCBhZGQgdXAgdG8gYW4gZW50aXJlIG1lc3NhZ2UuIFRodXMsIGl0J3MgcG9zc2libGUKKyAqIHRvIHNlZSBhIHN0YXR1cyBvZiAjREJVU19ESVNQQVRDSF9EQVRBX1JFTUFJTlMgYnV0IG5vdAorICogaGF2ZSBhIG1lc3NhZ2UgeWV0LgorICoKKyAqIEluIHBhcnRpY3VsYXIgdGhpcyBoYXBwZW5zIG9uIGluaXRpYWwgY29ubmVjdGlvbiwgYmVjYXVzZSBhbGwgc29ydHMKKyAqIG9mIGF1dGhlbnRpY2F0aW9uIHByb3RvY29sIHN0dWZmIGhhcyB0byBiZSBwYXJzZWQgYmVmb3JlIHRoZQorICogZmlyc3QgbWVzc2FnZSBhcnJpdmVzLgorICogCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbi4KKyAqIEByZXR1cm5zIGN1cnJlbnQgZGlzcGF0Y2ggc3RhdHVzCisgKi8KK0RCdXNEaXNwYXRjaFN0YXR1cworZGJ1c19jb25uZWN0aW9uX2dldF9kaXNwYXRjaF9zdGF0dXMgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBEQnVzRGlzcGF0Y2hTdGF0dXMgc3RhdHVzOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMLCBEQlVTX0RJU1BBVENIX0NPTVBMRVRFKTsKKworICBfZGJ1c192ZXJib3NlICgic3RhcnRcbiIpOworICAKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKworICBzdGF0dXMgPSBfZGJ1c19jb25uZWN0aW9uX2dldF9kaXNwYXRjaF9zdGF0dXNfdW5sb2NrZWQgKGNvbm5lY3Rpb24pOworICAKKyAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogRmlsdGVyIGZ1bnRpb24gZm9yIGhhbmRsaW5nIHRoZSBQZWVyIHN0YW5kYXJkIGludGVyZmFjZS4KKyAqLworc3RhdGljIERCdXNIYW5kbGVyUmVzdWx0CitfZGJ1c19jb25uZWN0aW9uX3BlZXJfZmlsdGVyX3VubG9ja2VkX25vX3VwZGF0ZSAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgKm1lc3NhZ2UpCit7CisgIGRidXNfYm9vbF90IHNlbnQgPSBGQUxTRTsKKyAgREJ1c01lc3NhZ2UgKnJldCA9IE5VTEw7CisgIERCdXNMaXN0ICpleHBpcmVfbGluazsKKworICBpZiAoY29ubmVjdGlvbi0+cm91dGVfcGVlcl9tZXNzYWdlcyAmJiBkYnVzX21lc3NhZ2VfZ2V0X2Rlc3RpbmF0aW9uIChtZXNzYWdlKSAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIFRoaXMgbWVhbnMgd2UncmUgbGV0dGluZyB0aGUgYnVzIHJvdXRlIHRoaXMgbWVzc2FnZSAqLworICAgICAgcmV0dXJuIERCVVNfSEFORExFUl9SRVNVTFRfTk9UX1lFVF9IQU5ETEVEOworICAgIH0KKworICBpZiAoIWRidXNfbWVzc2FnZV9oYXNfaW50ZXJmYWNlIChtZXNzYWdlLCBEQlVTX0lOVEVSRkFDRV9QRUVSKSkKKyAgICB7CisgICAgICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9OT1RfWUVUX0hBTkRMRUQ7CisgICAgfQorCisgIC8qIFByZWFsbG9jYXRlIGEgbGlua2VkLWxpc3QgbGluaywgc28gdGhhdCBpZiB3ZSBuZWVkIHRvIGRpc3Bvc2Ugb2YgYQorICAgKiBtZXNzYWdlLCB3ZSBjYW4gYXR0YWNoIGl0IHRvIHRoZSBleHBpcmVkIGxpc3QgKi8KKyAgZXhwaXJlX2xpbmsgPSBfZGJ1c19saXN0X2FsbG9jX2xpbmsgKE5VTEwpOworCisgIGlmICghZXhwaXJlX2xpbmspCisgICAgcmV0dXJuIERCVVNfSEFORExFUl9SRVNVTFRfTkVFRF9NRU1PUlk7CisKKyAgaWYgKGRidXNfbWVzc2FnZV9pc19tZXRob2RfY2FsbCAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19JTlRFUkZBQ0VfUEVFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBpbmciKSkKKyAgICB7CisgICAgICByZXQgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9yZXR1cm4gKG1lc3NhZ2UpOworICAgICAgaWYgKHJldCA9PSBOVUxMKQorICAgICAgICBnb3RvIG91dDsKKworICAgICAgc2VudCA9IF9kYnVzX2Nvbm5lY3Rpb25fc2VuZF91bmxvY2tlZF9ub191cGRhdGUgKGNvbm5lY3Rpb24sIHJldCwgTlVMTCk7CisgICAgfQorICBlbHNlIGlmIChkYnVzX21lc3NhZ2VfaXNfbWV0aG9kX2NhbGwgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19JTlRFUkZBQ0VfUEVFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR2V0TWFjaGluZUlkIikpCisgICAgeworICAgICAgREJ1c1N0cmluZyB1dWlkOworICAgICAgREJ1c0Vycm9yIGVycm9yID0gREJVU19FUlJPUl9JTklUOworCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmdXVpZCkpCisgICAgICAgIGdvdG8gb3V0OworCisgICAgICBpZiAoX2RidXNfZ2V0X2xvY2FsX21hY2hpbmVfdXVpZF9lbmNvZGVkICgmdXVpZCwgJmVycm9yKSkKKyAgICAgICAgeworICAgICAgICAgIGNvbnN0IGNoYXIgKnZfU1RSSU5HOworCisgICAgICAgICAgcmV0ID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfcmV0dXJuIChtZXNzYWdlKTsKKworICAgICAgICAgIGlmIChyZXQgPT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ1dWlkKTsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICB2X1NUUklORyA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJnV1aWQpOworICAgICAgICAgIGlmIChkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKHJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmdl9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBzZW50ID0gX2RidXNfY29ubmVjdGlvbl9zZW5kX3VubG9ja2VkX25vX3VwZGF0ZSAoY29ubmVjdGlvbiwgcmV0LCBOVUxMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoZGJ1c19lcnJvcl9oYXNfbmFtZSAoJmVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSkpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHJldCA9IGRidXNfbWVzc2FnZV9uZXdfZXJyb3IgKG1lc3NhZ2UsIGVycm9yLm5hbWUsIGVycm9yLm1lc3NhZ2UpOworICAgICAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKworICAgICAgICAgIGlmIChyZXQgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gb3V0OworCisgICAgICAgICAgc2VudCA9IF9kYnVzX2Nvbm5lY3Rpb25fc2VuZF91bmxvY2tlZF9ub191cGRhdGUgKGNvbm5lY3Rpb24sIHJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgIH0KKworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ1dWlkKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBXZSBuZWVkIHRvIGJvdW5jZSBhbnl0aGluZyBlbHNlIHdpdGggdGhpcyBpbnRlcmZhY2UsIG90aGVyd2lzZSBhcHBzCisgICAgICAgKiBjb3VsZCBzdGFydCBleHRlbmRpbmcgdGhlIGludGVyZmFjZSBhbmQgd2hlbiB3ZSBhZGRlZCBleHRlbnNpb25zCisgICAgICAgKiBoZXJlIHRvIERCdXNDb25uZWN0aW9uIHdlJ2QgYnJlYWsgdGhvc2UgYXBwcy4KKyAgICAgICAqLworICAgICAgcmV0ID0gZGJ1c19tZXNzYWdlX25ld19lcnJvciAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfVU5LTk9XTl9NRVRIT0QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5rbm93biBtZXRob2QgaW52b2tlZCBvbiBvcmcuZnJlZWRlc2t0b3AuREJ1cy5QZWVyIGludGVyZmFjZSIpOworICAgICAgaWYgKHJldCA9PSBOVUxMKQorICAgICAgICBnb3RvIG91dDsKKworICAgICAgc2VudCA9IF9kYnVzX2Nvbm5lY3Rpb25fc2VuZF91bmxvY2tlZF9ub191cGRhdGUgKGNvbm5lY3Rpb24sIHJldCwgTlVMTCk7CisgICAgfQorCitvdXQ6CisgIGlmIChyZXQgPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c19saXN0X2ZyZWVfbGluayAoZXhwaXJlX2xpbmspOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIEl0J2xsIGJlIHNhZmUgdG8gdW5yZWYgdGhlIHJlcGx5IHdoZW4gd2UgdW5sb2NrICovCisgICAgICBleHBpcmVfbGluay0+ZGF0YSA9IHJldDsKKyAgICAgIF9kYnVzX2xpc3RfcHJlcGVuZF9saW5rICgmY29ubmVjdGlvbi0+ZXhwaXJlZF9tZXNzYWdlcywgZXhwaXJlX2xpbmspOworICAgIH0KKworICBpZiAoIXNlbnQpCisgICAgcmV0dXJuIERCVVNfSEFORExFUl9SRVNVTFRfTkVFRF9NRU1PUlk7CisKKyAgcmV0dXJuIERCVVNfSEFORExFUl9SRVNVTFRfSEFORExFRDsKK30KKworLyoqCisqIFByb2Nlc3NlcyBhbGwgYnVpbHRpbiBmaWx0ZXIgZnVuY3Rpb25zCisqCisqIElmIHRoZSBzcGVjIHNwZWNpZmllcyBhIHN0YW5kYXJkIGludGVyZmFjZQorKiB0aGV5IHNob3VsZCBiZSBwcm9jZXNzZWQgZnJvbSB0aGlzIG1ldGhvZAorKiovCitzdGF0aWMgREJ1c0hhbmRsZXJSZXN1bHQKK19kYnVzX2Nvbm5lY3Rpb25fcnVuX2J1aWx0aW5fZmlsdGVyc191bmxvY2tlZF9ub191cGRhdGUgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAqbWVzc2FnZSkKK3sKKyAgLyogV2UganVzdCBydW4gb25lIGZpbHRlciBmb3Igbm93IGJ1dCBoYXZlIHRoZSBvcHRpb24gdG8gcnVuIG1vcmUKKyAgICAgaWYgdGhlIHNwZWMgY2FsbHMgZm9yIGl0IGluIHRoZSBmdXR1cmUgKi8KKworICByZXR1cm4gX2RidXNfY29ubmVjdGlvbl9wZWVyX2ZpbHRlcl91bmxvY2tlZF9ub191cGRhdGUgKGNvbm5lY3Rpb24sIG1lc3NhZ2UpOworfQorCisvKioKKyAqIFByb2Nlc3NlcyBhbnkgaW5jb21pbmcgZGF0YS4KKyAqCisgKiBJZiB0aGVyZSdzIGluY29taW5nIHJhdyBkYXRhIHRoYXQgaGFzIG5vdCB5ZXQgYmVlbiBwYXJzZWQsIGl0IGlzCisgKiBwYXJzZWQsIHdoaWNoIG1heSBvciBtYXkgbm90IHJlc3VsdCBpbiBhZGRpbmcgbWVzc2FnZXMgdG8gdGhlCisgKiBpbmNvbWluZyBxdWV1ZS4KKyAqCisgKiBUaGUgaW5jb21pbmcgZGF0YSBidWZmZXIgaXMgZmlsbGVkIHdoZW4gdGhlIGNvbm5lY3Rpb24gcmVhZHMgZnJvbQorICogaXRzIHVuZGVybHlpbmcgdHJhbnNwb3J0IChzdWNoIGFzIGEgc29ja2V0KS4gIFJlYWRpbmcgdXN1YWxseQorICogaGFwcGVucyBpbiBkYnVzX3dhdGNoX2hhbmRsZSgpIG9yIGRidXNfY29ubmVjdGlvbl9yZWFkX3dyaXRlKCkuCisgKiAKKyAqIElmIHRoZXJlIGFyZSBjb21wbGV0ZSBtZXNzYWdlcyBpbiB0aGUgaW5jb21pbmcgcXVldWUsCisgKiBkYnVzX2Nvbm5lY3Rpb25fZGlzcGF0Y2goKSByZW1vdmVzIG9uZSBtZXNzYWdlIGZyb20gdGhlIHF1ZXVlIGFuZAorICogcHJvY2Vzc2VzIGl0LiBQcm9jZXNzaW5nIGhhcyB0aHJlZSBzdGVwcy4KKyAqCisgKiBGaXJzdCwgYW55IG1ldGhvZCByZXBsaWVzIGFyZSBwYXNzZWQgdG8gI0RCdXNQZW5kaW5nQ2FsbCBvcgorICogZGJ1c19jb25uZWN0aW9uX3NlbmRfd2l0aF9yZXBseV9hbmRfYmxvY2soKSBpbiBvcmRlciB0bworICogY29tcGxldGUgdGhlIHBlbmRpbmcgbWV0aG9kIGNhbGwuCisgKiAKKyAqIFNlY29uZCwgYW55IGZpbHRlcnMgcmVnaXN0ZXJlZCB3aXRoIGRidXNfY29ubmVjdGlvbl9hZGRfZmlsdGVyKCkKKyAqIGFyZSBydW4uIElmIGFueSBmaWx0ZXIgcmV0dXJucyAjREJVU19IQU5ETEVSX1JFU1VMVF9IQU5ETEVECisgKiB0aGVuIHByb2Nlc3Npbmcgc3RvcHMgYWZ0ZXIgdGhhdCBmaWx0ZXIuCisgKgorICogVGhpcmQsIGlmIHRoZSBtZXNzYWdlIGlzIGEgbWV0aG9kIGNhbGwgaXQgaXMgZm9yd2FyZGVkIHRvCisgKiBhbnkgcmVnaXN0ZXJlZCBvYmplY3QgcGF0aCBoYW5kbGVycyBhZGRlZCB3aXRoCisgKiBkYnVzX2Nvbm5lY3Rpb25fcmVnaXN0ZXJfb2JqZWN0X3BhdGgoKSBvcgorICogZGJ1c19jb25uZWN0aW9uX3JlZ2lzdGVyX2ZhbGxiYWNrKCkuCisgKgorICogQSBzaW5nbGUgY2FsbCB0byBkYnVzX2Nvbm5lY3Rpb25fZGlzcGF0Y2goKSB3aWxsIHByb2Nlc3MgYXQgbW9zdAorICogb25lIG1lc3NhZ2U7IGl0IHdpbGwgbm90IGNsZWFyIHRoZSBlbnRpcmUgbWVzc2FnZSBxdWV1ZS4KKyAqCisgKiBCZSBjYXJlZnVsIGFib3V0IGNhbGxpbmcgZGJ1c19jb25uZWN0aW9uX2Rpc3BhdGNoKCkgZnJvbSBpbnNpZGUgYQorICogbWVzc2FnZSBoYW5kbGVyLCBpLmUuIGNhbGxpbmcgZGJ1c19jb25uZWN0aW9uX2Rpc3BhdGNoKCkKKyAqIHJlY3Vyc2l2ZWx5LiAgSWYgdGhyZWFkcyBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCBhIHJlY3Vyc2l2ZQorICogbXV0ZXggZnVuY3Rpb24sIHRoZW4gdGhpcyB3aWxsIG5vdCBkZWFkbG9jazsgaG93ZXZlciwgaXQgY2FuCisgKiBjZXJ0YWlubHkgY29uZnVzZSB5b3VyIGFwcGxpY2F0aW9uLgorICogCisgKiBAdG9kbyBzb21lIEZJWE1FIGluIGhlcmUgYWJvdXQgaGFuZGxpbmcgREJVU19IQU5ETEVSX1JFU1VMVF9ORUVEX01FTU9SWQorICogCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHJldHVybnMgZGlzcGF0Y2ggc3RhdHVzLCBzZWUgZGJ1c19jb25uZWN0aW9uX2dldF9kaXNwYXRjaF9zdGF0dXMoKQorICovCitEQnVzRGlzcGF0Y2hTdGF0dXMKK2RidXNfY29ubmVjdGlvbl9kaXNwYXRjaCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworICBEQnVzTGlzdCAqbGluaywgKmZpbHRlcl9saXN0X2NvcHksICptZXNzYWdlX2xpbms7CisgIERCdXNIYW5kbGVyUmVzdWx0IHJlc3VsdDsKKyAgREJ1c1BlbmRpbmdDYWxsICpwZW5kaW5nOworICBkYnVzX2ludDMyX3QgcmVwbHlfc2VyaWFsOworICBEQnVzRGlzcGF0Y2hTdGF0dXMgc3RhdHVzOworICBkYnVzX2Jvb2xfdCBmb3VuZF9vYmplY3Q7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwsIERCVVNfRElTUEFUQ0hfQ09NUExFVEUpOworCisgIF9kYnVzX3ZlcmJvc2UgKCJcbiIpOworICAKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKyAgc3RhdHVzID0gX2RidXNfY29ubmVjdGlvbl9nZXRfZGlzcGF0Y2hfc3RhdHVzX3VubG9ja2VkIChjb25uZWN0aW9uKTsKKyAgaWYgKHN0YXR1cyAhPSBEQlVTX0RJU1BBVENIX0RBVEFfUkVNQUlOUykKKyAgICB7CisgICAgICAvKiB1bmxvY2tzIGFuZCBjYWxscyBvdXQgdG8gdXNlciBjb2RlICovCisgICAgICBfZGJ1c19jb25uZWN0aW9uX3VwZGF0ZV9kaXNwYXRjaF9zdGF0dXNfYW5kX3VubG9jayAoY29ubmVjdGlvbiwgc3RhdHVzKTsKKyAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAKKyAgLyogV2UgbmVlZCB0byByZWYgdGhlIGNvbm5lY3Rpb24gc2luY2UgdGhlIGNhbGxiYWNrIGNvdWxkIHBvdGVudGlhbGx5CisgICAqIGRyb3AgdGhlIGxhc3QgcmVmIHRvIGl0CisgICAqLworICBfZGJ1c19jb25uZWN0aW9uX3JlZl91bmxvY2tlZCAoY29ubmVjdGlvbik7CisKKyAgX2RidXNfY29ubmVjdGlvbl9hY3F1aXJlX2Rpc3BhdGNoIChjb25uZWN0aW9uKTsKKyAgSEFWRV9MT0NLX0NIRUNLIChjb25uZWN0aW9uKTsKKworICBtZXNzYWdlX2xpbmsgPSBfZGJ1c19jb25uZWN0aW9uX3BvcF9tZXNzYWdlX2xpbmtfdW5sb2NrZWQgKGNvbm5lY3Rpb24pOworICBpZiAobWVzc2FnZV9saW5rID09IE5VTEwpCisgICAgeworICAgICAgLyogYW5vdGhlciB0aHJlYWQgZGlzcGF0Y2hlZCBvdXIgc3R1ZmYgKi8KKworICAgICAgX2RidXNfdmVyYm9zZSAoImFub3RoZXIgdGhyZWFkIGRpc3BhdGNoZWQgbWVzc2FnZSAoZHVyaW5nIGFjcXVpcmVfZGlzcGF0Y2ggYWJvdmUpXG4iKTsKKyAgICAgIAorICAgICAgX2RidXNfY29ubmVjdGlvbl9yZWxlYXNlX2Rpc3BhdGNoIChjb25uZWN0aW9uKTsKKworICAgICAgc3RhdHVzID0gX2RidXNfY29ubmVjdGlvbl9nZXRfZGlzcGF0Y2hfc3RhdHVzX3VubG9ja2VkIChjb25uZWN0aW9uKTsKKworICAgICAgX2RidXNfY29ubmVjdGlvbl91cGRhdGVfZGlzcGF0Y2hfc3RhdHVzX2FuZF91bmxvY2sgKGNvbm5lY3Rpb24sIHN0YXR1cyk7CisgICAgICAKKyAgICAgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoY29ubmVjdGlvbik7CisgICAgICAKKyAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgIG1lc3NhZ2UgPSBtZXNzYWdlX2xpbmstPmRhdGE7CisKKyAgX2RidXNfdmVyYm9zZSAoIiBkaXNwYXRjaGluZyBtZXNzYWdlICVwICglcyAlcyAlcyAnJXMnKVxuIiwKKyAgICAgICAgICAgICAgICAgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX3R5cGVfdG9fc3RyaW5nIChkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKG1lc3NhZ2UpKSwKKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG1lc3NhZ2UpID8KKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG1lc3NhZ2UpIDoKKyAgICAgICAgICAgICAgICAgIm5vIGludGVyZmFjZSIsCisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKSA/CisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKSA6CisgICAgICAgICAgICAgICAgICJubyBtZW1iZXIiLAorICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3NpZ25hdHVyZSAobWVzc2FnZSkpOworCisgIHJlc3VsdCA9IERCVVNfSEFORExFUl9SRVNVTFRfTk9UX1lFVF9IQU5ETEVEOworICAKKyAgLyogUGVuZGluZyBjYWxsIGhhbmRsaW5nIG11c3QgYmUgZmlyc3QsIGJlY2F1c2UgaWYgeW91IGRvCisgICAqIGRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHlfYW5kX2Jsb2NrKCkgb3IKKyAgICogZGJ1c19wZW5kaW5nX2NhbGxfYmxvY2soKSB0aGVuIG5vIGhhbmRsZXJzL2ZpbHRlcnMgd2lsbCBiZSBydW4gb24KKyAgICogdGhlIHJlcGx5LiBXZSB3YW50IGNvbnNpc3RlbnQgc2VtYW50aWNzIGluIHRoZSBjYXNlIHdoZXJlIHdlCisgICAqIGRidXNfY29ubmVjdGlvbl9kaXNwYXRjaCgpIHRoZSByZXBseS4KKyAgICovCisgIAorICByZXBseV9zZXJpYWwgPSBkYnVzX21lc3NhZ2VfZ2V0X3JlcGx5X3NlcmlhbCAobWVzc2FnZSk7CisgIHBlbmRpbmcgPSBfZGJ1c19oYXNoX3RhYmxlX2xvb2t1cF9pbnQgKGNvbm5lY3Rpb24tPnBlbmRpbmdfcmVwbGllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHlfc2VyaWFsKTsKKyAgaWYgKHBlbmRpbmcpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIkRpc3BhdGNoaW5nIGEgcGVuZGluZyByZXBseVxuIik7CisgICAgICBjb21wbGV0ZV9wZW5kaW5nX2NhbGxfYW5kX3VubG9jayAoY29ubmVjdGlvbiwgcGVuZGluZywgbWVzc2FnZSk7CisgICAgICBwZW5kaW5nID0gTlVMTDsgLyogaXQncyBwcm9iYWJseSB1bnJlZidkICovCisgICAgICAKKyAgICAgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisgICAgICBfZGJ1c192ZXJib3NlICgicGVuZGluZyBjYWxsIGNvbXBsZXRlZCBpbiBkaXNwYXRjaFxuIik7CisgICAgICByZXN1bHQgPSBEQlVTX0hBTkRMRVJfUkVTVUxUX0hBTkRMRUQ7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgcmVzdWx0ID0gX2RidXNfY29ubmVjdGlvbl9ydW5fYnVpbHRpbl9maWx0ZXJzX3VubG9ja2VkX25vX3VwZGF0ZSAoY29ubmVjdGlvbiwgbWVzc2FnZSk7CisgIGlmIChyZXN1bHQgIT0gREJVU19IQU5ETEVSX1JFU1VMVF9OT1RfWUVUX0hBTkRMRUQpCisgICAgZ290byBvdXQ7CisgCisgIGlmICghX2RidXNfbGlzdF9jb3B5ICgmY29ubmVjdGlvbi0+ZmlsdGVyX2xpc3QsICZmaWx0ZXJfbGlzdF9jb3B5KSkKKyAgICB7CisgICAgICBfZGJ1c19jb25uZWN0aW9uX3JlbGVhc2VfZGlzcGF0Y2ggKGNvbm5lY3Rpb24pOworICAgICAgSEFWRV9MT0NLX0NIRUNLIChjb25uZWN0aW9uKTsKKyAgICAgIAorICAgICAgX2RidXNfY29ubmVjdGlvbl9mYWlsZWRfcG9wIChjb25uZWN0aW9uLCBtZXNzYWdlX2xpbmspOworCisgICAgICAvKiB1bmxvY2tzIGFuZCBjYWxscyB1c2VyIGNvZGUgKi8KKyAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fdXBkYXRlX2Rpc3BhdGNoX3N0YXR1c19hbmRfdW5sb2NrIChjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfRElTUEFUQ0hfTkVFRF9NRU1PUlkpOworICAgICAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChjb25uZWN0aW9uKTsKKyAgICAgIAorICAgICAgcmV0dXJuIERCVVNfRElTUEFUQ0hfTkVFRF9NRU1PUlk7CisgICAgfQorICAKKyAgX2RidXNfbGlzdF9mb3JlYWNoICgmZmlsdGVyX2xpc3RfY29weSwKKwkJICAgICAgKERCdXNGb3JlYWNoRnVuY3Rpb24pX2RidXNfbWVzc2FnZV9maWx0ZXJfcmVmLAorCQkgICAgICBOVUxMKTsKKworICAvKiBXZSdyZSBzdGlsbCBwcm90ZWN0ZWQgZnJvbSBkaXNwYXRjaCgpIHJlZW50cmFuY3kgaGVyZQorICAgKiBzaW5jZSB3ZSBhY3F1aXJlZCB0aGUgZGlzcGF0Y2hlcgorICAgKi8KKyAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworICAKKyAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZmaWx0ZXJfbGlzdF9jb3B5KTsKKyAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBEQnVzTWVzc2FnZUZpbHRlciAqZmlsdGVyID0gbGluay0+ZGF0YTsKKyAgICAgIERCdXNMaXN0ICpuZXh0ID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmZmlsdGVyX2xpc3RfY29weSwgbGluayk7CisKKyAgICAgIGlmIChmaWx0ZXItPmZ1bmN0aW9uID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiICBmaWx0ZXIgd2FzIHJlbW92ZWQgaW4gYSBjYWxsYmFjayBmdW5jdGlvblxuIik7CisgICAgICAgICAgbGluayA9IG5leHQ7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgX2RidXNfdmVyYm9zZSAoIiAgcnVubmluZyBmaWx0ZXIgb24gbWVzc2FnZSAlcFxuIiwgbWVzc2FnZSk7CisgICAgICByZXN1bHQgPSAoKiBmaWx0ZXItPmZ1bmN0aW9uKSAoY29ubmVjdGlvbiwgbWVzc2FnZSwgZmlsdGVyLT51c2VyX2RhdGEpOworCisgICAgICBpZiAocmVzdWx0ICE9IERCVVNfSEFORExFUl9SRVNVTFRfTk9UX1lFVF9IQU5ETEVEKQorCWJyZWFrOworCisgICAgICBsaW5rID0gbmV4dDsKKyAgICB9CisKKyAgX2RidXNfbGlzdF9mb3JlYWNoICgmZmlsdGVyX2xpc3RfY29weSwKKwkJICAgICAgKERCdXNGb3JlYWNoRnVuY3Rpb24pX2RidXNfbWVzc2FnZV9maWx0ZXJfdW5yZWYsCisJCSAgICAgIE5VTEwpOworICBfZGJ1c19saXN0X2NsZWFyICgmZmlsdGVyX2xpc3RfY29weSk7CisgIAorICBDT05ORUNUSU9OX0xPQ0sgKGNvbm5lY3Rpb24pOworCisgIGlmIChyZXN1bHQgPT0gREJVU19IQU5ETEVSX1JFU1VMVF9ORUVEX01FTU9SWSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiTm8gbWVtb3J5XG4iKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgZWxzZSBpZiAocmVzdWx0ID09IERCVVNfSEFORExFUl9SRVNVTFRfSEFORExFRCkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiZmlsdGVyIGhhbmRsZWQgbWVzc2FnZSBpbiBkaXNwYXRjaFxuIik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgLyogV2UncmUgc3RpbGwgcHJvdGVjdGVkIGZyb20gZGlzcGF0Y2goKSByZWVudHJhbmN5IGhlcmUKKyAgICogc2luY2Ugd2UgYWNxdWlyZWQgdGhlIGRpc3BhdGNoZXIKKyAgICovCisgIF9kYnVzX3ZlcmJvc2UgKCIgIHJ1bm5pbmcgb2JqZWN0IHBhdGggZGlzcGF0Y2ggb24gbWVzc2FnZSAlcCAoJXMgJXMgJXMgJyVzJylcbiIsCisgICAgICAgICAgICAgICAgIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV90eXBlX3RvX3N0cmluZyAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlKSksCisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfaW50ZXJmYWNlIChtZXNzYWdlKSA/CisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfaW50ZXJmYWNlIChtZXNzYWdlKSA6CisgICAgICAgICAgICAgICAgICJubyBpbnRlcmZhY2UiLAorICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X21lbWJlciAobWVzc2FnZSkgPworICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X21lbWJlciAobWVzc2FnZSkgOgorICAgICAgICAgICAgICAgICAibm8gbWVtYmVyIiwKKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9zaWduYXR1cmUgKG1lc3NhZ2UpKTsKKworICBIQVZFX0xPQ0tfQ0hFQ0sgKGNvbm5lY3Rpb24pOworICByZXN1bHQgPSBfZGJ1c19vYmplY3RfdHJlZV9kaXNwYXRjaF9hbmRfdW5sb2NrIChjb25uZWN0aW9uLT5vYmplY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZm91bmRfb2JqZWN0KTsKKyAgCisgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisKKyAgaWYgKHJlc3VsdCAhPSBEQlVTX0hBTkRMRVJfUkVTVUxUX05PVF9ZRVRfSEFORExFRCkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgib2JqZWN0IHRyZWUgaGFuZGxlZCBtZXNzYWdlIGluIGRpc3BhdGNoXG4iKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlKSA9PSBEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfQ0FMTCkKKyAgICB7CisgICAgICBEQnVzTWVzc2FnZSAqcmVwbHk7CisgICAgICBEQnVzU3RyaW5nIHN0cjsKKyAgICAgIERCdXNQcmVhbGxvY2F0ZWRTZW5kICpwcmVhbGxvY2F0ZWQ7CisgICAgICBEQnVzTGlzdCAqZXhwaXJlX2xpbms7CisKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgIHNlbmRpbmcgZXJyb3IgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICBEQlVTX0VSUk9SX1VOS05PV05fTUVUSE9EKTsKKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnN0cikpCisgICAgICAgIHsKKyAgICAgICAgICByZXN1bHQgPSBEQlVTX0hBTkRMRVJfUkVTVUxUX05FRURfTUVNT1JZOworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJubyBtZW1vcnkgZm9yIGVycm9yIHN0cmluZyBpbiBkaXNwYXRjaFxuIik7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICAgICAgICAgICAgCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfcHJpbnRmICgmc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1ldGhvZCBcIiVzXCIgd2l0aCBzaWduYXR1cmUgXCIlc1wiIG9uIGludGVyZmFjZSBcIiVzXCIgZG9lc24ndCBleGlzdFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfc2lnbmF0dXJlIChtZXNzYWdlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfaW50ZXJmYWNlIChtZXNzYWdlKSkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnN0cik7CisgICAgICAgICAgcmVzdWx0ID0gREJVU19IQU5ETEVSX1JFU1VMVF9ORUVEX01FTU9SWTsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgibm8gbWVtb3J5IGZvciBlcnJvciBzdHJpbmcgaW4gZGlzcGF0Y2hcbiIpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgICAKKyAgICAgIHJlcGx5ID0gZGJ1c19tZXNzYWdlX25ld19lcnJvciAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRfb2JqZWN0ID8gREJVU19FUlJPUl9VTktOT1dOX01FVEhPRCA6IERCVVNfRVJST1JfVU5LTk9XTl9PQkpFQ1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJnN0cikpOworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZzdHIpOworCisgICAgICBpZiAocmVwbHkgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIHJlc3VsdCA9IERCVVNfSEFORExFUl9SRVNVTFRfTkVFRF9NRU1PUlk7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIm5vIG1lbW9yeSBmb3IgZXJyb3IgcmVwbHkgaW4gZGlzcGF0Y2hcbiIpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgIGV4cGlyZV9saW5rID0gX2RidXNfbGlzdF9hbGxvY19saW5rIChyZXBseSk7CisKKyAgICAgIGlmIChleHBpcmVfbGluayA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgICAgICAgICAgcmVzdWx0ID0gREJVU19IQU5ETEVSX1JFU1VMVF9ORUVEX01FTU9SWTsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgibm8gbWVtb3J5IGZvciBlcnJvciBzZW5kIGluIGRpc3BhdGNoXG4iKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICBwcmVhbGxvY2F0ZWQgPSBfZGJ1c19jb25uZWN0aW9uX3ByZWFsbG9jYXRlX3NlbmRfdW5sb2NrZWQgKGNvbm5lY3Rpb24pOworCisgICAgICBpZiAocHJlYWxsb2NhdGVkID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19saXN0X2ZyZWVfbGluayAoZXhwaXJlX2xpbmspOworICAgICAgICAgIC8qIEl0J3MgT0sgdGhhdCB0aGlzIGlzIGZpbmFsaXplZCwgYmVjYXVzZSBpdCBoYXNuJ3QgYmVlbiBzZWVuIGJ5CisgICAgICAgICAgICogYW55dGhpbmcgdGhhdCBjb3VsZCBhdHRhY2ggdXNlciBjYWxsYmFja3MgKi8KKyAgICAgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKyAgICAgICAgICByZXN1bHQgPSBEQlVTX0hBTkRMRVJfUkVTVUxUX05FRURfTUVNT1JZOworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJubyBtZW1vcnkgZm9yIGVycm9yIHNlbmQgaW4gZGlzcGF0Y2hcbiIpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fc2VuZF9wcmVhbGxvY2F0ZWRfdW5sb2NrZWRfbm9fdXBkYXRlIChjb25uZWN0aW9uLCBwcmVhbGxvY2F0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHksIE5VTEwpOworICAgICAgLyogcmVwbHkgd2lsbCBiZSBmcmVlZCB3aGVuIHdlIHJlbGVhc2UgdGhlIGxvY2sgKi8KKyAgICAgIF9kYnVzX2xpc3RfcHJlcGVuZF9saW5rICgmY29ubmVjdGlvbi0+ZXhwaXJlZF9tZXNzYWdlcywgZXhwaXJlX2xpbmspOworCisgICAgICByZXN1bHQgPSBEQlVTX0hBTkRMRVJfUkVTVUxUX0hBTkRMRUQ7CisgICAgfQorICAKKyAgX2RidXNfdmVyYm9zZSAoIiAgZG9uZSBkaXNwYXRjaGluZyAlcCAoJXMgJXMgJXMgJyVzJykgb24gY29ubmVjdGlvbiAlcFxuIiwgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX3R5cGVfdG9fc3RyaW5nIChkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKG1lc3NhZ2UpKSwKKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG1lc3NhZ2UpID8KKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG1lc3NhZ2UpIDoKKyAgICAgICAgICAgICAgICAgIm5vIGludGVyZmFjZSIsCisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKSA/CisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKSA6CisgICAgICAgICAgICAgICAgICJubyBtZW1iZXIiLAorICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3NpZ25hdHVyZSAobWVzc2FnZSksCisgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24pOworICAKKyBvdXQ6CisgIGlmIChyZXN1bHQgPT0gREJVU19IQU5ETEVSX1JFU1VMVF9ORUVEX01FTU9SWSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgib3V0IG9mIG1lbW9yeVxuIik7CisgICAgICAKKyAgICAgIC8qIFB1dCBtZXNzYWdlIGJhY2ssIGFuZCB3ZSdsbCBzdGFydCBvdmVyLgorICAgICAgICogWWVzIHRoaXMgbWVhbnMgaGFuZGxlcnMgbXVzdCBiZSBpZGVtcG90ZW50IGlmIHRoZXkKKyAgICAgICAqIGRvbid0IHJldHVybiBIQU5ETEVEOyBjJ2VzdCBsYSB2aWUuCisgICAgICAgKi8KKyAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fcHV0YmFja19tZXNzYWdlX2xpbmtfdW5sb2NrZWQgKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlX2xpbmspOworICAgICAgLyogbm93IHdlIGRvbid0IHdhbnQgdG8gZnJlZSB0aGVtICovCisgICAgICBtZXNzYWdlX2xpbmsgPSBOVUxMOworICAgICAgbWVzc2FnZSA9IE5VTEw7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIiAuLi4gZG9uZSBkaXNwYXRjaGluZ1xuIik7CisgICAgfQorCisgIF9kYnVzX2Nvbm5lY3Rpb25fcmVsZWFzZV9kaXNwYXRjaCAoY29ubmVjdGlvbik7CisgIEhBVkVfTE9DS19DSEVDSyAoY29ubmVjdGlvbik7CisKKyAgaWYgKG1lc3NhZ2UgIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBXZSBkb24ndCB3YW50IHRoaXMgbWVzc2FnZSB0byBjb3VudCBpbiBtYXhpbXVtIG1lc3NhZ2UgbGltaXRzIHdoZW4KKyAgICAgICAqIGNvbXB1dGluZyB0aGUgZGlzcGF0Y2ggc3RhdHVzLCBiZWxvdy4gV2UgaGF2ZSB0byBkcm9wIHRoZSBsb2NrCisgICAgICAgKiB0ZW1wb3JhcmlseSwgYmVjYXVzZSBmaW5hbGl6aW5nIGEgbWVzc2FnZSBjYW4gdHJpZ2dlciBjYWxsYmFja3MuCisgICAgICAgKgorICAgICAgICogV2UgaGF2ZSBhIHJlZmVyZW5jZSB0byB0aGUgY29ubmVjdGlvbiwgYW5kIHdlIGRvbid0IHVzZSBhbnkgY2FjaGVkCisgICAgICAgKiBwb2ludGVycyB0byB0aGUgY29ubmVjdGlvbidzIGludGVybmFscyBiZWxvdyB0aGlzIHBvaW50LCBzbyBpdCBzaG91bGQKKyAgICAgICAqIGJlIHNhZmUgdG8gZHJvcCB0aGUgbG9jayBhbmQgdGFrZSBpdCBiYWNrLiAqLworICAgICAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisgICAgfQorCisgIGlmIChtZXNzYWdlX2xpbmsgIT0gTlVMTCkKKyAgICBfZGJ1c19saXN0X2ZyZWVfbGluayAobWVzc2FnZV9saW5rKTsKKworICBfZGJ1c192ZXJib3NlICgiYmVmb3JlIGZpbmFsIHN0YXR1cyB1cGRhdGVcbiIpOworICBzdGF0dXMgPSBfZGJ1c19jb25uZWN0aW9uX2dldF9kaXNwYXRjaF9zdGF0dXNfdW5sb2NrZWQgKGNvbm5lY3Rpb24pOworCisgIC8qIHVubG9ja3MgYW5kIGNhbGxzIHVzZXIgY29kZSAqLworICBfZGJ1c19jb25uZWN0aW9uX3VwZGF0ZV9kaXNwYXRjaF9zdGF0dXNfYW5kX3VubG9jayAoY29ubmVjdGlvbiwgc3RhdHVzKTsKKyAgCisgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoY29ubmVjdGlvbik7CisgIAorICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIFNldHMgdGhlIHdhdGNoIGZ1bmN0aW9ucyBmb3IgdGhlIGNvbm5lY3Rpb24uIFRoZXNlIGZ1bmN0aW9ucyBhcmUKKyAqIHJlc3BvbnNpYmxlIGZvciBtYWtpbmcgdGhlIGFwcGxpY2F0aW9uJ3MgbWFpbiBsb29wIGF3YXJlIG9mIGZpbGUKKyAqIGRlc2NyaXB0b3JzIHRoYXQgbmVlZCB0byBiZSBtb25pdG9yZWQgZm9yIGV2ZW50cywgdXNpbmcgc2VsZWN0KCkgb3IKKyAqIHBvbGwoKS4gV2hlbiB1c2luZyBRdCwgdHlwaWNhbGx5IHRoZSBEQnVzQWRkV2F0Y2hGdW5jdGlvbiB3b3VsZAorICogY3JlYXRlIGEgUVNvY2tldE5vdGlmaWVyLiBXaGVuIHVzaW5nIEdMaWIsIHRoZSBEQnVzQWRkV2F0Y2hGdW5jdGlvbgorICogY291bGQgY2FsbCBnX2lvX2FkZF93YXRjaCgpLCBvciBjb3VsZCBiZSB1c2VkIGFzIHBhcnQgb2YgYSBtb3JlCisgKiBlbGFib3JhdGUgR1NvdXJjZS4gTm90ZSB0aGF0IHdoZW4gYSB3YXRjaCBpcyBhZGRlZCwgaXQgbWF5CisgKiBub3QgYmUgZW5hYmxlZC4KKyAqCisgKiBUaGUgREJ1c1dhdGNoVG9nZ2xlZEZ1bmN0aW9uIG5vdGlmaWVzIHRoZSBhcHBsaWNhdGlvbiB0aGF0IHRoZQorICogd2F0Y2ggaGFzIGJlZW4gZW5hYmxlZCBvciBkaXNhYmxlZC4gQ2FsbCBkYnVzX3dhdGNoX2dldF9lbmFibGVkKCkKKyAqIHRvIGNoZWNrIHRoaXMuIEEgZGlzYWJsZWQgd2F0Y2ggc2hvdWxkIGhhdmUgbm8gZWZmZWN0LCBhbmQgZW5hYmxlZAorICogd2F0Y2ggc2hvdWxkIGJlIGFkZGVkIHRvIHRoZSBtYWluIGxvb3AuIFRoaXMgZmVhdHVyZSBpcyB1c2VkCisgKiBpbnN0ZWFkIG9mIHNpbXBseSBhZGRpbmcvcmVtb3ZpbmcgdGhlIHdhdGNoIGJlY2F1c2UKKyAqIGVuYWJsaW5nL2Rpc2FibGluZyBjYW4gYmUgZG9uZSB3aXRob3V0IG1lbW9yeSBhbGxvY2F0aW9uLiAgVGhlCisgKiB0b2dnbGVkIGZ1bmN0aW9uIG1heSBiZSBOVUxMIGlmIGEgbWFpbiBsb29wIHJlLXF1ZXJpZXMKKyAqIGRidXNfd2F0Y2hfZ2V0X2VuYWJsZWQoKSBldmVyeSB0aW1lIGFueXdheS4KKyAqIAorICogVGhlIERCdXNXYXRjaCBjYW4gYmUgcXVlcmllZCBmb3IgdGhlIGZpbGUgZGVzY3JpcHRvciB0byB3YXRjaCB1c2luZworICogZGJ1c193YXRjaF9nZXRfdW5peF9mZCgpIG9yIGRidXNfd2F0Y2hfZ2V0X3NvY2tldCgpLCBhbmQgZm9yIHRoZQorICogZXZlbnRzIHRvIHdhdGNoIGZvciB1c2luZyBkYnVzX3dhdGNoX2dldF9mbGFncygpLiBUaGUgZmxhZ3MKKyAqIHJldHVybmVkIGJ5IGRidXNfd2F0Y2hfZ2V0X2ZsYWdzKCkgd2lsbCBvbmx5IGNvbnRhaW4KKyAqIERCVVNfV0FUQ0hfUkVBREFCTEUgYW5kIERCVVNfV0FUQ0hfV1JJVEFCTEUsIG5ldmVyCisgKiBEQlVTX1dBVENIX0hBTkdVUCBvciBEQlVTX1dBVENIX0VSUk9SOyBhbGwgd2F0Y2hlcyBpbXBsaWNpdGx5CisgKiBpbmNsdWRlIGEgd2F0Y2ggZm9yIGhhbmd1cHMsIGVycm9ycywgYW5kIG90aGVyIGV4Y2VwdGlvbmFsCisgKiBjb25kaXRpb25zLgorICoKKyAqIE9uY2UgYSBmaWxlIGRlc2NyaXB0b3IgYmVjb21lcyByZWFkYWJsZSBvciB3cml0YWJsZSwgb3IgYW4gZXhjZXB0aW9uCisgKiBvY2N1cnMsIGRidXNfd2F0Y2hfaGFuZGxlKCkgc2hvdWxkIGJlIGNhbGxlZCB0bworICogbm90aWZ5IHRoZSBjb25uZWN0aW9uIG9mIHRoZSBmaWxlIGRlc2NyaXB0b3IncyBjb25kaXRpb24uCisgKgorICogZGJ1c193YXRjaF9oYW5kbGUoKSBjYW5ub3QgYmUgY2FsbGVkIGR1cmluZyB0aGUKKyAqIERCdXNBZGRXYXRjaEZ1bmN0aW9uLCBhcyB0aGUgY29ubmVjdGlvbiB3aWxsIG5vdCBiZSByZWFkeSB0byBoYW5kbGUKKyAqIHRoYXQgd2F0Y2ggeWV0LgorICogCisgKiBJdCBpcyBub3QgYWxsb3dlZCB0byByZWZlcmVuY2UgYSBEQnVzV2F0Y2ggYWZ0ZXIgaXQgaGFzIGJlZW4gcGFzc2VkCisgKiB0byByZW1vdmVfZnVuY3Rpb24uCisgKgorICogSWYgI0ZBTFNFIGlzIHJldHVybmVkIGR1ZSB0byBsYWNrIG9mIG1lbW9yeSwgdGhlIGZhaWx1cmUgbWF5IGJlIGR1ZQorICogdG8gYSAjRkFMU0UgcmV0dXJuIGZyb20gdGhlIG5ldyBhZGRfZnVuY3Rpb24uIElmIHNvLCB0aGUKKyAqIGFkZF9mdW5jdGlvbiBtYXkgaGF2ZSBiZWVuIGNhbGxlZCBzdWNjZXNzZnVsbHkgb25lIG9yIG1vcmUgdGltZXMsCisgKiBidXQgdGhlIHJlbW92ZV9mdW5jdGlvbiB3aWxsIGFsc28gaGF2ZSBiZWVuIGNhbGxlZCB0byByZW1vdmUgYW55CisgKiBzdWNjZXNzZnVsIGFkZHMuIGkuZS4gaWYgI0ZBTFNFIGlzIHJldHVybmVkIHRoZSBuZXQgcmVzdWx0CisgKiBzaG91bGQgYmUgdGhhdCBkYnVzX2Nvbm5lY3Rpb25fc2V0X3dhdGNoX2Z1bmN0aW9ucygpIGhhcyBubyBlZmZlY3QsCisgKiBidXQgdGhlIGFkZF9mdW5jdGlvbiBhbmQgcmVtb3ZlX2Z1bmN0aW9uIG1heSBoYXZlIGJlZW4gY2FsbGVkLgorICoKKyAqIEBub3RlIFRoZSB0aHJlYWQgbG9jayBvbiBEQnVzQ29ubmVjdGlvbiBpcyBoZWxkIHdoaWxlCisgKiB3YXRjaCBmdW5jdGlvbnMgYXJlIGludm9rZWQsIHNvIGluc2lkZSB0aGVzZSBmdW5jdGlvbnMgeW91CisgKiBtYXkgbm90IGludm9rZSBhbnkgbWV0aG9kcyBvbiBEQnVzQ29ubmVjdGlvbiBvciBpdCB3aWxsIGRlYWRsb2NrLgorICogU2VlIHRoZSBjb21tZW50cyBpbiB0aGUgY29kZSBvciBodHRwOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL2FyY2hpdmVzL2RidXMvMjAwNy1KdWx5L3RyZWFkLmh0bWwjODE0NAorICogaWYgeW91IGVuY291bnRlciB0aGlzIGlzc3VlIGFuZCB3YW50IHRvIGF0dGVtcHQgd3JpdGluZyBhIHBhdGNoLgorICogCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbi4KKyAqIEBwYXJhbSBhZGRfZnVuY3Rpb24gZnVuY3Rpb24gdG8gYmVnaW4gbW9uaXRvcmluZyBhIG5ldyBkZXNjcmlwdG9yLgorICogQHBhcmFtIHJlbW92ZV9mdW5jdGlvbiBmdW5jdGlvbiB0byBzdG9wIG1vbml0b3JpbmcgYSBkZXNjcmlwdG9yLgorICogQHBhcmFtIHRvZ2dsZWRfZnVuY3Rpb24gZnVuY3Rpb24gdG8gbm90aWZ5IG9mIGVuYWJsZS9kaXNhYmxlCisgKiBAcGFyYW0gZGF0YSBkYXRhIHRvIHBhc3MgdG8gYWRkX2Z1bmN0aW9uIGFuZCByZW1vdmVfZnVuY3Rpb24uCisgKiBAcGFyYW0gZnJlZV9kYXRhX2Z1bmN0aW9uIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB0byBmcmVlIHRoZSBkYXRhLgorICogQHJldHVybnMgI0ZBTFNFIG9uIGZhaWx1cmUgKG5vIG1lbW9yeSkKKyAqLworZGJ1c19ib29sX3QKK2RidXNfY29ubmVjdGlvbl9zZXRfd2F0Y2hfZnVuY3Rpb25zIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0FkZFdhdGNoRnVuY3Rpb24gICAgICAgICBhZGRfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1JlbW92ZVdhdGNoRnVuY3Rpb24gICAgICByZW1vdmVfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1dhdGNoVG9nZ2xlZEZ1bmN0aW9uICAgICB0b2dnbGVkX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRnJlZUZ1bmN0aW9uICAgICAgICAgICAgIGZyZWVfZGF0YV9mdW5jdGlvbikKK3sKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMLCBGQUxTRSk7CisgIAorICBDT05ORUNUSU9OX0xPQ0sgKGNvbm5lY3Rpb24pOworCisgIHJldHZhbCA9IF9kYnVzX3dhdGNoX2xpc3Rfc2V0X2Z1bmN0aW9ucyAoY29ubmVjdGlvbi0+d2F0Y2hlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRfZnVuY3Rpb24sIHJlbW92ZV9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2dnbGVkX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsIGZyZWVfZGF0YV9mdW5jdGlvbik7CisKKyAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworCisgIHJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogU2V0cyB0aGUgdGltZW91dCBmdW5jdGlvbnMgZm9yIHRoZSBjb25uZWN0aW9uLiBUaGVzZSBmdW5jdGlvbnMgYXJlCisgKiByZXNwb25zaWJsZSBmb3IgbWFraW5nIHRoZSBhcHBsaWNhdGlvbidzIG1haW4gbG9vcCBhd2FyZSBvZiB0aW1lb3V0cy4KKyAqIFdoZW4gdXNpbmcgUXQsIHR5cGljYWxseSB0aGUgREJ1c0FkZFRpbWVvdXRGdW5jdGlvbiB3b3VsZCBjcmVhdGUgYQorICogUVRpbWVyLiBXaGVuIHVzaW5nIEdMaWIsIHRoZSBEQnVzQWRkVGltZW91dEZ1bmN0aW9uIHdvdWxkIGNhbGwKKyAqIGdfdGltZW91dF9hZGQuCisgKiAKKyAqIFRoZSBEQnVzVGltZW91dFRvZ2dsZWRGdW5jdGlvbiBub3RpZmllcyB0aGUgYXBwbGljYXRpb24gdGhhdCB0aGUKKyAqIHRpbWVvdXQgaGFzIGJlZW4gZW5hYmxlZCBvciBkaXNhYmxlZC4gQ2FsbAorICogZGJ1c190aW1lb3V0X2dldF9lbmFibGVkKCkgdG8gY2hlY2sgdGhpcy4gQSBkaXNhYmxlZCB0aW1lb3V0IHNob3VsZAorICogaGF2ZSBubyBlZmZlY3QsIGFuZCBlbmFibGVkIHRpbWVvdXQgc2hvdWxkIGJlIGFkZGVkIHRvIHRoZSBtYWluCisgKiBsb29wLiBUaGlzIGZlYXR1cmUgaXMgdXNlZCBpbnN0ZWFkIG9mIHNpbXBseSBhZGRpbmcvcmVtb3ZpbmcgdGhlCisgKiB0aW1lb3V0IGJlY2F1c2UgZW5hYmxpbmcvZGlzYWJsaW5nIGNhbiBiZSBkb25lIHdpdGhvdXQgbWVtb3J5CisgKiBhbGxvY2F0aW9uLiBXaXRoIFF0LCBRVGltZXI6OnN0YXJ0KCkgYW5kIFFUaW1lcjo6c3RvcCgpIGNhbiBiZSB1c2VkCisgKiB0byBlbmFibGUgYW5kIGRpc2FibGUuIFRoZSB0b2dnbGVkIGZ1bmN0aW9uIG1heSBiZSBOVUxMIGlmIGEgbWFpbgorICogbG9vcCByZS1xdWVyaWVzIGRidXNfdGltZW91dF9nZXRfZW5hYmxlZCgpIGV2ZXJ5IHRpbWUgYW55d2F5LgorICogV2hlbmV2ZXIgYSB0aW1lb3V0IGlzIHRvZ2dsZWQsIGl0cyBpbnRlcnZhbCBtYXkgY2hhbmdlLgorICoKKyAqIFRoZSBEQnVzVGltZW91dCBjYW4gYmUgcXVlcmllZCBmb3IgdGhlIHRpbWVyIGludGVydmFsIHVzaW5nCisgKiBkYnVzX3RpbWVvdXRfZ2V0X2ludGVydmFsKCkuIGRidXNfdGltZW91dF9oYW5kbGUoKSBzaG91bGQgYmUgY2FsbGVkCisgKiByZXBlYXRlZGx5LCBlYWNoIHRpbWUgdGhlIGludGVydmFsIGVsYXBzZXMsIHN0YXJ0aW5nIGFmdGVyIGl0IGhhcworICogZWxhcHNlZCBvbmNlLiBUaGUgdGltZW91dCBzdG9wcyBmaXJpbmcgd2hlbiBpdCBpcyByZW1vdmVkIHdpdGggdGhlCisgKiBnaXZlbiByZW1vdmVfZnVuY3Rpb24uICBUaGUgdGltZXIgaW50ZXJ2YWwgbWF5IGNoYW5nZSB3aGVuZXZlciB0aGUKKyAqIHRpbWVvdXQgaXMgYWRkZWQsIHJlbW92ZWQsIG9yIHRvZ2dsZWQuCisgKgorICogQG5vdGUgVGhlIHRocmVhZCBsb2NrIG9uIERCdXNDb25uZWN0aW9uIGlzIGhlbGQgd2hpbGUKKyAqIHRpbWVvdXQgZnVuY3Rpb25zIGFyZSBpbnZva2VkLCBzbyBpbnNpZGUgdGhlc2UgZnVuY3Rpb25zIHlvdQorICogbWF5IG5vdCBpbnZva2UgYW55IG1ldGhvZHMgb24gREJ1c0Nvbm5lY3Rpb24gb3IgaXQgd2lsbCBkZWFkbG9jay4KKyAqIFNlZSB0aGUgY29tbWVudHMgaW4gdGhlIGNvZGUgb3IgaHR0cDovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9hcmNoaXZlcy9kYnVzLzIwMDctSnVseS90aHJlYWQuaHRtbCM4MTQ0CisgKiBpZiB5b3UgZW5jb3VudGVyIHRoaXMgaXNzdWUgYW5kIHdhbnQgdG8gYXR0ZW1wdCB3cml0aW5nIGEgcGF0Y2guCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24uCisgKiBAcGFyYW0gYWRkX2Z1bmN0aW9uIGZ1bmN0aW9uIHRvIGFkZCBhIHRpbWVvdXQuCisgKiBAcGFyYW0gcmVtb3ZlX2Z1bmN0aW9uIGZ1bmN0aW9uIHRvIHJlbW92ZSBhIHRpbWVvdXQuCisgKiBAcGFyYW0gdG9nZ2xlZF9mdW5jdGlvbiBmdW5jdGlvbiB0byBub3RpZnkgb2YgZW5hYmxlL2Rpc2FibGUKKyAqIEBwYXJhbSBkYXRhIGRhdGEgdG8gcGFzcyB0byBhZGRfZnVuY3Rpb24gYW5kIHJlbW92ZV9mdW5jdGlvbi4KKyAqIEBwYXJhbSBmcmVlX2RhdGFfZnVuY3Rpb24gZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHRvIGZyZWUgdGhlIGRhdGEuCisgKiBAcmV0dXJucyAjRkFMU0Ugb24gZmFpbHVyZSAobm8gbWVtb3J5KQorICovCitkYnVzX2Jvb2xfdAorZGJ1c19jb25uZWN0aW9uX3NldF90aW1lb3V0X2Z1bmN0aW9ucyAgIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICpjb25uZWN0aW9uLAorCQkJCQkgREJ1c0FkZFRpbWVvdXRGdW5jdGlvbiAgICAgYWRkX2Z1bmN0aW9uLAorCQkJCQkgREJ1c1JlbW92ZVRpbWVvdXRGdW5jdGlvbiAgcmVtb3ZlX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVGltZW91dFRvZ2dsZWRGdW5jdGlvbiB0b2dnbGVkX2Z1bmN0aW9uLAorCQkJCQkgdm9pZCAgICAgICAgICAgICAgICAgICAgICAqZGF0YSwKKwkJCQkJIERCdXNGcmVlRnVuY3Rpb24gICAgICAgICAgIGZyZWVfZGF0YV9mdW5jdGlvbikKK3sKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMLCBGQUxTRSk7CisgIAorICBDT05ORUNUSU9OX0xPQ0sgKGNvbm5lY3Rpb24pOworCisgIHJldHZhbCA9IF9kYnVzX3RpbWVvdXRfbGlzdF9zZXRfZnVuY3Rpb25zIChjb25uZWN0aW9uLT50aW1lb3V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZF9mdW5jdGlvbiwgcmVtb3ZlX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9nZ2xlZF9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsIGZyZWVfZGF0YV9mdW5jdGlvbik7CisKKyAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworCisgIHJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogU2V0cyB0aGUgbWFpbmxvb3Agd2FrZXVwIGZ1bmN0aW9uIGZvciB0aGUgY29ubmVjdGlvbi4gVGhpcyBmdW5jdGlvbgorICogaXMgcmVzcG9uc2libGUgZm9yIHdha2luZyB1cCB0aGUgbWFpbiBsb29wIChpZiBpdHMgc2xlZXBpbmcgaW4KKyAqIGFub3RoZXIgdGhyZWFkKSB3aGVuIHNvbWUgc29tZSBjaGFuZ2UgaGFzIGhhcHBlbmVkIHRvIHRoZQorICogY29ubmVjdGlvbiB0aGF0IHRoZSBtYWlubG9vcCBuZWVkcyB0byByZWNvbnNpZGVyIChlLmcuIGEgbWVzc2FnZQorICogaGFzIGJlZW4gcXVldWVkIGZvciB3cml0aW5nKS4gIFdoZW4gdXNpbmcgUXQsIHRoaXMgdHlwaWNhbGx5CisgKiByZXN1bHRzIGluIGEgY2FsbCB0byBRRXZlbnRMb29wOjp3YWtlVXAoKS4gIFdoZW4gdXNpbmcgR0xpYiwgaXQKKyAqIHdvdWxkIGNhbGwgZ19tYWluX2NvbnRleHRfd2FrZXVwKCkuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24uCisgKiBAcGFyYW0gd2FrZXVwX21haW5fZnVuY3Rpb24gZnVuY3Rpb24gdG8gd2FrZSB1cCB0aGUgbWFpbmxvb3AKKyAqIEBwYXJhbSBkYXRhIGRhdGEgdG8gcGFzcyB3YWtldXBfbWFpbl9mdW5jdGlvbgorICogQHBhcmFtIGZyZWVfZGF0YV9mdW5jdGlvbiBmdW5jdGlvbiB0byBiZSBjYWxsZWQgdG8gZnJlZSB0aGUgZGF0YS4KKyAqLwordm9pZAorZGJ1c19jb25uZWN0aW9uX3NldF93YWtldXBfbWFpbl9mdW5jdGlvbiAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAqY29ubmVjdGlvbiwKKwkJCQkJICBEQnVzV2FrZXVwTWFpbkZ1bmN0aW9uICAgICB3YWtldXBfbWFpbl9mdW5jdGlvbiwKKwkJCQkJICB2b2lkICAgICAgICAgICAgICAgICAgICAgICpkYXRhLAorCQkJCQkgIERCdXNGcmVlRnVuY3Rpb24gICAgICAgICAgIGZyZWVfZGF0YV9mdW5jdGlvbikKK3sKKyAgdm9pZCAqb2xkX2RhdGE7CisgIERCdXNGcmVlRnVuY3Rpb24gb2xkX2ZyZWVfZGF0YTsKKworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMKTsKKyAgCisgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisgIG9sZF9kYXRhID0gY29ubmVjdGlvbi0+d2FrZXVwX21haW5fZGF0YTsKKyAgb2xkX2ZyZWVfZGF0YSA9IGNvbm5lY3Rpb24tPmZyZWVfd2FrZXVwX21haW5fZGF0YTsKKworICBjb25uZWN0aW9uLT53YWtldXBfbWFpbl9mdW5jdGlvbiA9IHdha2V1cF9tYWluX2Z1bmN0aW9uOworICBjb25uZWN0aW9uLT53YWtldXBfbWFpbl9kYXRhID0gZGF0YTsKKyAgY29ubmVjdGlvbi0+ZnJlZV93YWtldXBfbWFpbl9kYXRhID0gZnJlZV9kYXRhX2Z1bmN0aW9uOworICAKKyAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworCisgIC8qIENhbGxiYWNrIG91dHNpZGUgdGhlIGxvY2sgKi8KKyAgaWYgKG9sZF9mcmVlX2RhdGEpCisgICAgKCpvbGRfZnJlZV9kYXRhKSAob2xkX2RhdGEpOworfQorCisvKioKKyAqIFNldCBhIGZ1bmN0aW9uIHRvIGJlIGludm9rZWQgd2hlbiB0aGUgZGlzcGF0Y2ggc3RhdHVzIGNoYW5nZXMuCisgKiBJZiB0aGUgZGlzcGF0Y2ggc3RhdHVzIGlzICNEQlVTX0RJU1BBVENIX0RBVEFfUkVNQUlOUywgdGhlbgorICogZGJ1c19jb25uZWN0aW9uX2Rpc3BhdGNoKCkgbmVlZHMgdG8gYmUgY2FsbGVkIHRvIHByb2Nlc3MgaW5jb21pbmcKKyAqIG1lc3NhZ2VzLiBIb3dldmVyLCBkYnVzX2Nvbm5lY3Rpb25fZGlzcGF0Y2goKSBNVVNUIE5PVCBCRSBDQUxMRUQKKyAqIGZyb20gaW5zaWRlIHRoZSBEQnVzRGlzcGF0Y2hTdGF0dXNGdW5jdGlvbi4gSW5kZWVkLCBhbG1vc3QKKyAqIGFueSByZWVudHJhbmN5IGluIHRoaXMgZnVuY3Rpb24gaXMgYSBiYWQgaWRlYS4gSW5zdGVhZCwKKyAqIHRoZSBEQnVzRGlzcGF0Y2hTdGF0dXNGdW5jdGlvbiBzaG91bGQgc2ltcGx5IHNhdmUgYW4gaW5kaWNhdGlvbgorICogdGhhdCBtZXNzYWdlcyBzaG91bGQgYmUgZGlzcGF0Y2hlZCBsYXRlciwgd2hlbiB0aGUgbWFpbiBsb29wCisgKiBpcyByZS1lbnRlcmVkLgorICoKKyAqIElmIHlvdSBkb24ndCBzZXQgYSBkaXNwYXRjaCBzdGF0dXMgZnVuY3Rpb24sIHlvdSBoYXZlIHRvIGJlIHN1cmUgdG8KKyAqIGRpc3BhdGNoIG9uIGV2ZXJ5IGl0ZXJhdGlvbiBvZiB5b3VyIG1haW4gbG9vcCwgZXNwZWNpYWxseSBpZgorICogZGJ1c193YXRjaF9oYW5kbGUoKSBvciBkYnVzX3RpbWVvdXRfaGFuZGxlKCkgd2VyZSBjYWxsZWQuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBmdW5jdGlvbiBmdW5jdGlvbiB0byBjYWxsIG9uIGRpc3BhdGNoIHN0YXR1cyBjaGFuZ2VzCisgKiBAcGFyYW0gZGF0YSBkYXRhIGZvciBmdW5jdGlvbgorICogQHBhcmFtIGZyZWVfZGF0YV9mdW5jdGlvbiBmcmVlIHRoZSBmdW5jdGlvbiBkYXRhCisgKi8KK3ZvaWQKK2RidXNfY29ubmVjdGlvbl9zZXRfZGlzcGF0Y2hfc3RhdHVzX2Z1bmN0aW9uIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRGlzcGF0Y2hTdGF0dXNGdW5jdGlvbiAgZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgICAgICAgICAgIGZyZWVfZGF0YV9mdW5jdGlvbikKK3sKKyAgdm9pZCAqb2xkX2RhdGE7CisgIERCdXNGcmVlRnVuY3Rpb24gb2xkX2ZyZWVfZGF0YTsKKworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMKTsKKyAgCisgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisgIG9sZF9kYXRhID0gY29ubmVjdGlvbi0+ZGlzcGF0Y2hfc3RhdHVzX2RhdGE7CisgIG9sZF9mcmVlX2RhdGEgPSBjb25uZWN0aW9uLT5mcmVlX2Rpc3BhdGNoX3N0YXR1c19kYXRhOworCisgIGNvbm5lY3Rpb24tPmRpc3BhdGNoX3N0YXR1c19mdW5jdGlvbiA9IGZ1bmN0aW9uOworICBjb25uZWN0aW9uLT5kaXNwYXRjaF9zdGF0dXNfZGF0YSA9IGRhdGE7CisgIGNvbm5lY3Rpb24tPmZyZWVfZGlzcGF0Y2hfc3RhdHVzX2RhdGEgPSBmcmVlX2RhdGFfZnVuY3Rpb247CisgIAorICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7CisKKyAgLyogQ2FsbGJhY2sgb3V0c2lkZSB0aGUgbG9jayAqLworICBpZiAob2xkX2ZyZWVfZGF0YSkKKyAgICAoKm9sZF9mcmVlX2RhdGEpIChvbGRfZGF0YSk7Cit9CisKKy8qKgorICogR2V0IHRoZSBVTklYIGZpbGUgZGVzY3JpcHRvciBvZiB0aGUgY29ubmVjdGlvbiwgaWYgYW55LiAgVGhpcyBjYW4KKyAqIGJlIHVzZWQgZm9yIFNFTGludXggYWNjZXNzIGNvbnRyb2wgY2hlY2tzIHdpdGggZ2V0cGVlcmNvbigpIGZvcgorICogZXhhbXBsZS4gRE8gTk9UIHJlYWQgb3Igd3JpdGUgdG8gdGhlIGZpbGUgZGVzY3JpcHRvciwgb3IgdHJ5IHRvCisgKiBzZWxlY3QoKSBvbiBpdDsgdXNlIERCdXNXYXRjaCBmb3IgbWFpbiBsb29wIGludGVncmF0aW9uLiBOb3QgYWxsCisgKiBjb25uZWN0aW9ucyB3aWxsIGhhdmUgYSBmaWxlIGRlc2NyaXB0b3IuIFNvIGZvciBhZGRpbmcgZGVzY3JpcHRvcnMKKyAqIHRvIHRoZSBtYWluIGxvb3AsIHVzZSBkYnVzX3dhdGNoX2dldF91bml4X2ZkKCkgYW5kIHNvIGZvcnRoLgorICoKKyAqIElmIHRoZSBjb25uZWN0aW9uIGlzIHNvY2tldC1iYXNlZCwgeW91IGNhbiBhbHNvIHVzZQorICogZGJ1c19jb25uZWN0aW9uX2dldF9zb2NrZXQoKSwgd2hpY2ggd2lsbCB3b3JrIG9uIFdpbmRvd3MgdG9vLgorICogVGhpcyBmdW5jdGlvbiBhbHdheXMgZmFpbHMgb24gV2luZG93cy4KKyAqCisgKiBSaWdodCBub3cgdGhlIHJldHVybmVkIGRlc2NyaXB0b3IgaXMgYWx3YXlzIGEgc29ja2V0LCBidXQKKyAqIHRoYXQgaXMgbm90IGd1YXJhbnRlZWQuCisgKiAKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gZmQgcmV0dXJuIGxvY2F0aW9uIGZvciB0aGUgZmlsZSBkZXNjcmlwdG9yLgorICogQHJldHVybnMgI1RSVUUgaWYgZmQgaXMgc3VjY2Vzc2Z1bGx5IG9idGFpbmVkLgorICovCitkYnVzX2Jvb2xfdAorZGJ1c19jb25uZWN0aW9uX2dldF91bml4X2ZkIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgKmZkKQoreworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGNvbm5lY3Rpb24tPnRyYW5zcG9ydCAhPSBOVUxMLCBGQUxTRSk7CisKKyNpZmRlZiBEQlVTX1dJTgorICAvKiBGSVhNRSBkbyB0aGlzIG9uIGEgbG93ZXIgbGV2ZWwgKi8KKyAgcmV0dXJuIEZBTFNFOworI2VuZGlmCisgIAorICByZXR1cm4gZGJ1c19jb25uZWN0aW9uX2dldF9zb2NrZXQoY29ubmVjdGlvbiwgZmQpOworfQorCisvKioKKyAqIEdldHMgdGhlIHVuZGVybHlpbmcgV2luZG93cyBvciBVTklYIHNvY2tldCBmaWxlIGRlc2NyaXB0b3IKKyAqIG9mIHRoZSBjb25uZWN0aW9uLCBpZiBhbnkuIERPIE5PVCByZWFkIG9yIHdyaXRlIHRvIHRoZSBmaWxlIGRlc2NyaXB0b3IsIG9yIHRyeSB0bworICogc2VsZWN0KCkgb24gaXQ7IHVzZSBEQnVzV2F0Y2ggZm9yIG1haW4gbG9vcCBpbnRlZ3JhdGlvbi4gTm90IGFsbAorICogY29ubmVjdGlvbnMgd2lsbCBoYXZlIGEgc29ja2V0LiBTbyBmb3IgYWRkaW5nIGRlc2NyaXB0b3JzCisgKiB0byB0aGUgbWFpbiBsb29wLCB1c2UgZGJ1c193YXRjaF9nZXRfc29ja2V0KCkgYW5kIHNvIGZvcnRoLgorICoKKyAqIElmIHRoZSBjb25uZWN0aW9uIGlzIG5vdCBzb2NrZXQtYmFzZWQsIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gRkFMU0UsCisgKiBldmVuIGlmIHRoZSBjb25uZWN0aW9uIGRvZXMgaGF2ZSBhIGZpbGUgZGVzY3JpcHRvciBvZiBzb21lIGtpbmQuCisgKiBpLmUuIHRoaXMgZnVuY3Rpb24gYWx3YXlzIHJldHVybnMgc3BlY2lmaWNhbGx5IGEgc29ja2V0IGZpbGUgZGVzY3JpcHRvci4KKyAqIAorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBmZCByZXR1cm4gbG9jYXRpb24gZm9yIHRoZSBmaWxlIGRlc2NyaXB0b3IuCisgKiBAcmV0dXJucyAjVFJVRSBpZiBmZCBpcyBzdWNjZXNzZnVsbHkgb2J0YWluZWQuCisgKi8KK2RidXNfYm9vbF90CitkYnVzX2Nvbm5lY3Rpb25fZ2V0X3NvY2tldChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgKmZkKQoreworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIERCdXNTb2NrZXQgcyA9IERCVVNfU09DS0VUX0lOSVQ7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChjb25uZWN0aW9uLT50cmFuc3BvcnQgIT0gTlVMTCwgRkFMU0UpOworICAKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKyAgCisgIHJldHZhbCA9IF9kYnVzX3RyYW5zcG9ydF9nZXRfc29ja2V0X2ZkIChjb25uZWN0aW9uLT50cmFuc3BvcnQsICZzKTsKKworICBpZiAocmV0dmFsKQorICAgIHsKKyAgICAgICpmZCA9IF9kYnVzX3NvY2tldF9nZXRfaW50IChzKTsKKyAgICB9CisKKyAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworCisgIHJldHVybiByZXR2YWw7Cit9CisKKworLyoqCisgKiBHZXRzIHRoZSBVTklYIHVzZXIgSUQgb2YgdGhlIGNvbm5lY3Rpb24gaWYga25vd24uICBSZXR1cm5zICNUUlVFIGlmCisgKiB0aGUgdWlkIGlzIGZpbGxlZCBpbi4gIEFsd2F5cyByZXR1cm5zICNGQUxTRSBvbiBub24tVU5JWCBwbGF0Zm9ybXMKKyAqIGZvciBub3csIHRob3VnaCBpbiB0aGVvcnkgc29tZW9uZSBjb3VsZCBob29rIFdpbmRvd3MgdG8gTklTIG9yCisgKiBzb21ldGhpbmcuICBBbHdheXMgcmV0dXJucyAjRkFMU0UgcHJpb3IgdG8gYXV0aGVudGljYXRpbmcgdGhlCisgKiBjb25uZWN0aW9uLgorICoKKyAqIFRoZSBVSUQgaXMgb25seSByZWFkIGJ5IHNlcnZlcnMgZnJvbSBjbGllbnRzOyBjbGllbnRzIGNhbid0IHVzdWFsbHkKKyAqIGdldCB0aGUgVUlEIG9mIHNlcnZlcnMsIGJlY2F1c2Ugc2VydmVycyBkbyBub3QgYXV0aGVudGljYXRlIHRvCisgKiBjbGllbnRzLiAgVGhlIHJldHVybmVkIFVJRCBpcyB0aGUgVUlEIHRoZSBjb25uZWN0aW9uIGF1dGhlbnRpY2F0ZWQKKyAqIGFzLgorICoKKyAqIFRoZSBtZXNzYWdlIGJ1cyBpcyBhIHNlcnZlciBhbmQgdGhlIGFwcHMgY29ubmVjdGluZyB0byB0aGUgYnVzCisgKiBhcmUgY2xpZW50cy4KKyAqCisgKiBZb3UgY2FuIGFzayB0aGUgYnVzIHRvIHRlbGwgeW91IHRoZSBVSUQgb2YgYW5vdGhlciBjb25uZWN0aW9uIHRob3VnaAorICogaWYgeW91IGxpa2U7IHRoaXMgaXMgZG9uZSB3aXRoIGRidXNfYnVzX2dldF91bml4X3VzZXIoKS4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHBhcmFtIHVpZCByZXR1cm4gbG9jYXRpb24gZm9yIHRoZSB1c2VyIElECisgKiBAcmV0dXJucyAjVFJVRSBpZiB1aWQgaXMgZmlsbGVkIGluIHdpdGggYSB2YWxpZCB1c2VyIElECisgKi8KK2RidXNfYm9vbF90CitkYnVzX2Nvbm5lY3Rpb25fZ2V0X3VuaXhfdXNlciAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgKnVpZCkKK3sKKyAgZGJ1c19ib29sX3QgcmVzdWx0OworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAodWlkICE9IE5VTEwsIEZBTFNFKTsKKworICBDT05ORUNUSU9OX0xPQ0sgKGNvbm5lY3Rpb24pOworCisgIGlmICghX2RidXNfdHJhbnNwb3J0X3RyeV90b19hdXRoZW50aWNhdGUgKGNvbm5lY3Rpb24tPnRyYW5zcG9ydCkpCisgICAgcmVzdWx0ID0gRkFMU0U7CisgIGVsc2UKKyAgICByZXN1bHQgPSBfZGJ1c190cmFuc3BvcnRfZ2V0X3VuaXhfdXNlciAoY29ubmVjdGlvbi0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWQpOworCisjaWZkZWYgREJVU19XSU4KKyAgX2RidXNfYXNzZXJ0ICghcmVzdWx0KTsKKyNlbmRpZgorICAKKyAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogR2V0cyB0aGUgcHJvY2VzcyBJRCBvZiB0aGUgY29ubmVjdGlvbiBpZiBhbnkuCisgKiBSZXR1cm5zICNUUlVFIGlmIHRoZSBwaWQgaXMgZmlsbGVkIGluLgorICogQWx3YXlzIHJldHVybnMgI0ZBTFNFIHByaW9yIHRvIGF1dGhlbnRpY2F0aW5nIHRoZQorICogY29ubmVjdGlvbi4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHBhcmFtIHBpZCByZXR1cm4gbG9jYXRpb24gZm9yIHRoZSBwcm9jZXNzIElECisgKiBAcmV0dXJucyAjVFJVRSBpZiB1aWQgaXMgZmlsbGVkIGluIHdpdGggYSB2YWxpZCBwcm9jZXNzIElECisgKi8KK2RidXNfYm9vbF90CitkYnVzX2Nvbm5lY3Rpb25fZ2V0X3VuaXhfcHJvY2Vzc19pZCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkJICAgICB1bnNpZ25lZCBsb25nICAqcGlkKQoreworICBkYnVzX2Jvb2xfdCByZXN1bHQ7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChwaWQgIT0gTlVMTCwgRkFMU0UpOworCisgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisKKyAgaWYgKCFfZGJ1c190cmFuc3BvcnRfdHJ5X3RvX2F1dGhlbnRpY2F0ZSAoY29ubmVjdGlvbi0+dHJhbnNwb3J0KSkKKyAgICByZXN1bHQgPSBGQUxTRTsKKyAgZWxzZQorICAgIHJlc3VsdCA9IF9kYnVzX3RyYW5zcG9ydF9nZXRfdW5peF9wcm9jZXNzX2lkIChjb25uZWN0aW9uLT50cmFuc3BvcnQsCisJCQkJCQkgIHBpZCk7CisKKyAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogR2V0cyB0aGUgQURUIGF1ZGl0IGRhdGEgb2YgdGhlIGNvbm5lY3Rpb24gaWYgYW55LgorICogUmV0dXJucyAjVFJVRSBpZiB0aGUgc3RydWN0dXJlIHBvaW50ZXIgaXMgcmV0dXJuZWQuCisgKiBBbHdheXMgcmV0dXJucyAjRkFMU0UgcHJpb3IgdG8gYXV0aGVudGljYXRpbmcgdGhlCisgKiBjb25uZWN0aW9uLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gZGF0YSByZXR1cm4gbG9jYXRpb24gZm9yIGF1ZGl0IGRhdGEKKyAqIEBwYXJhbSBkYXRhX3NpemUgcmV0dXJuIGxvY2F0aW9uIGZvciBsZW5ndGggb2YgYXVkaXQgZGF0YQorICogQHJldHVybnMgI1RSVUUgaWYgYXVkaXQgZGF0YSBpcyBmaWxsZWQgaW4gd2l0aCBhIHZhbGlkIHVjcmVkIHBvaW50ZXIKKyAqLworZGJ1c19ib29sX3QKK2RidXNfY29ubmVjdGlvbl9nZXRfYWR0X2F1ZGl0X3Nlc3Npb25fZGF0YSAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkJCSAgICB2b2lkICAgICAgICAgICoqZGF0YSwKKwkJCQkJICAgIGRidXNfaW50MzJfdCAgICpkYXRhX3NpemUpCit7CisgIGRidXNfYm9vbF90IHJlc3VsdDsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGRhdGEgIT0gTlVMTCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGRhdGFfc2l6ZSAhPSBOVUxMLCBGQUxTRSk7CisKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKworICBpZiAoIV9kYnVzX3RyYW5zcG9ydF90cnlfdG9fYXV0aGVudGljYXRlIChjb25uZWN0aW9uLT50cmFuc3BvcnQpKQorICAgIHJlc3VsdCA9IEZBTFNFOworICBlbHNlCisgICAgcmVzdWx0ID0gX2RidXNfdHJhbnNwb3J0X2dldF9hZHRfYXVkaXRfc2Vzc2lvbl9kYXRhIChjb25uZWN0aW9uLT50cmFuc3BvcnQsCisJCQkJCSAgICAJICAgICAgICAgZGF0YSwKKwkJCSAgCQkJICAgICAgICAgZGF0YV9zaXplKTsKKyAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogU2V0cyBhIHByZWRpY2F0ZSBmdW5jdGlvbiB1c2VkIHRvIGRldGVybWluZSB3aGV0aGVyIGEgZ2l2ZW4gdXNlciBJRAorICogaXMgYWxsb3dlZCB0byBjb25uZWN0LiBXaGVuIGFuIGluY29taW5nIGNvbm5lY3Rpb24gaGFzCisgKiBhdXRoZW50aWNhdGVkIHdpdGggYSBwYXJ0aWN1bGFyIHVzZXIgSUQsIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkOworICogaWYgaXQgcmV0dXJucyAjVFJVRSwgdGhlIGNvbm5lY3Rpb24gaXMgYWxsb3dlZCB0byBwcm9jZWVkLAorICogb3RoZXJ3aXNlIHRoZSBjb25uZWN0aW9uIGlzIGRpc2Nvbm5lY3RlZC4KKyAqCisgKiBJZiB0aGUgZnVuY3Rpb24gaXMgc2V0IHRvICNOVUxMIChhcyBpdCBpcyBieSBkZWZhdWx0KSwgdGhlbgorICogb25seSB0aGUgc2FtZSBVSUQgYXMgdGhlIHNlcnZlciBwcm9jZXNzIHdpbGwgYmUgYWxsb3dlZCB0bworICogY29ubmVjdC4gQWxzbywgcm9vdCBpcyBhbHdheXMgYWxsb3dlZCB0byBjb25uZWN0LgorICoKKyAqIE9uIFdpbmRvd3MsIHRoZSBmdW5jdGlvbiB3aWxsIGJlIHNldCBhbmQgaXRzIGZyZWVfZGF0YV9mdW5jdGlvbiB3aWxsCisgKiBiZSBpbnZva2VkIHdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgZnJlZWQgb3IgYSBuZXcgZnVuY3Rpb24gaXMgc2V0LgorICogSG93ZXZlciwgdGhlIGZ1bmN0aW9uIHdpbGwgbmV2ZXIgYmUgY2FsbGVkLCBiZWNhdXNlIHRoZXJlIGFyZQorICogbm8gVU5JWCB1c2VyIGlkcyB0byBwYXNzIHRvIGl0LCBvciBhdCBsZWFzdCBub25lIG9mIHRoZSBleGlzdGluZworICogYXV0aCBwcm90b2NvbHMgd291bGQgYWxsb3cgYXV0aGVudGljYXRpbmcgYXMgYSBVTklYIHVzZXIgb24gV2luZG93cy4KKyAqIAorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBmdW5jdGlvbiB0aGUgcHJlZGljYXRlCisgKiBAcGFyYW0gZGF0YSBkYXRhIHRvIHBhc3MgdG8gdGhlIHByZWRpY2F0ZQorICogQHBhcmFtIGZyZWVfZGF0YV9mdW5jdGlvbiBmdW5jdGlvbiB0byBmcmVlIHRoZSBkYXRhCisgKi8KK3ZvaWQKK2RidXNfY29ubmVjdGlvbl9zZXRfdW5peF91c2VyX2Z1bmN0aW9uIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQWxsb3dVbml4VXNlckZ1bmN0aW9uICAgZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgICAgICAgICAgIGZyZWVfZGF0YV9mdW5jdGlvbikKK3sKKyAgdm9pZCAqb2xkX2RhdGEgPSBOVUxMOworICBEQnVzRnJlZUZ1bmN0aW9uIG9sZF9mcmVlX2Z1bmN0aW9uID0gTlVMTDsKKworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMKTsKKyAgCisgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisgIF9kYnVzX3RyYW5zcG9ydF9zZXRfdW5peF91c2VyX2Z1bmN0aW9uIChjb25uZWN0aW9uLT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiwgZGF0YSwgZnJlZV9kYXRhX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9sZF9kYXRhLCAmb2xkX2ZyZWVfZnVuY3Rpb24pOworICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7CisKKyAgaWYgKG9sZF9mcmVlX2Z1bmN0aW9uICE9IE5VTEwpCisgICAgKCogb2xkX2ZyZWVfZnVuY3Rpb24pIChvbGRfZGF0YSk7Cit9CisKKy8qIFNhbWUgY2FsbGluZyBjb252ZW50aW9uIGFzIGRidXNfY29ubmVjdGlvbl9nZXRfd2luZG93c191c2VyICovCitkYnVzX2Jvb2xfdAorX2RidXNfY29ubmVjdGlvbl9nZXRfbGludXhfc2VjdXJpdHlfbGFiZWwgKERCdXNDb25uZWN0aW9uICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICAgICAqKmxhYmVsX3ApCit7CisgIGRidXNfYm9vbF90IHJlc3VsdDsKKworICBfZGJ1c19hc3NlcnQgKGNvbm5lY3Rpb24gIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAobGFiZWxfcCAhPSBOVUxMKTsKKworICBDT05ORUNUSU9OX0xPQ0sgKGNvbm5lY3Rpb24pOworCisgIGlmICghX2RidXNfdHJhbnNwb3J0X3RyeV90b19hdXRoZW50aWNhdGUgKGNvbm5lY3Rpb24tPnRyYW5zcG9ydCkpCisgICAgcmVzdWx0ID0gRkFMU0U7CisgIGVsc2UKKyAgICByZXN1bHQgPSBfZGJ1c190cmFuc3BvcnRfZ2V0X2xpbnV4X3NlY3VyaXR5X2xhYmVsIChjb25uZWN0aW9uLT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxfcCk7CisjaWZuZGVmIF9fbGludXhfXworICBfZGJ1c19hc3NlcnQgKCFyZXN1bHQpOworI2VuZGlmCisKKyAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogR2V0cyB0aGUgV2luZG93cyB1c2VyIFNJRCBvZiB0aGUgY29ubmVjdGlvbiBpZiBrbm93bi4gIFJldHVybnMKKyAqICNUUlVFIGlmIHRoZSBJRCBpcyBmaWxsZWQgaW4uICBBbHdheXMgcmV0dXJucyAjRkFMU0Ugb24gbm9uLVdpbmRvd3MKKyAqIHBsYXRmb3JtcyBmb3Igbm93LCB0aG91Z2ggaW4gdGhlb3J5IHNvbWVvbmUgY291bGQgaG9vayBVTklYIHRvCisgKiBBY3RpdmUgRGlyZWN0b3J5IG9yIHNvbWV0aGluZy4gIEFsd2F5cyByZXR1cm5zICNGQUxTRSBwcmlvciB0bworICogYXV0aGVudGljYXRpbmcgdGhlIGNvbm5lY3Rpb24uCisgKgorICogVGhlIHVzZXIgaXMgb25seSByZWFkIGJ5IHNlcnZlcnMgZnJvbSBjbGllbnRzOyBjbGllbnRzIGNhbid0IHVzdWFsbHkKKyAqIGdldCB0aGUgdXNlciBvZiBzZXJ2ZXJzLCBiZWNhdXNlIHNlcnZlcnMgZG8gbm90IGF1dGhlbnRpY2F0ZSB0bworICogY2xpZW50cy4gVGhlIHJldHVybmVkIHVzZXIgaXMgdGhlIHVzZXIgdGhlIGNvbm5lY3Rpb24gYXV0aGVudGljYXRlZAorICogYXMuCisgKgorICogVGhlIG1lc3NhZ2UgYnVzIGlzIGEgc2VydmVyIGFuZCB0aGUgYXBwcyBjb25uZWN0aW5nIHRvIHRoZSBidXMKKyAqIGFyZSBjbGllbnRzLgorICoKKyAqIFRoZSByZXR1cm5lZCB1c2VyIHN0cmluZyBoYXMgdG8gYmUgZnJlZWQgd2l0aCBkYnVzX2ZyZWUoKS4KKyAqCisgKiBUaGUgcmV0dXJuIHZhbHVlIGluZGljYXRlcyB3aGV0aGVyIHRoZSB1c2VyIFNJRCBpcyBhdmFpbGFibGU7CisgKiBpZiBpdCdzIGF2YWlsYWJsZSBidXQgd2UgZG9uJ3QgaGF2ZSB0aGUgbWVtb3J5IHRvIGNvcHkgaXQsCisgKiB0aGVuIHRoZSByZXR1cm4gdmFsdWUgaXMgI1RSVUUgYW5kICNOVUxMIGlzIGdpdmVuIGFzIHRoZSBTSUQuCisgKiAKKyAqIEB0b2RvIFdlIHdvdWxkIGxpa2UgdG8gYmUgYWJsZSB0byBzYXkgIllvdSBjYW4gYXNrIHRoZSBidXMgdG8gdGVsbAorICogeW91IHRoZSB1c2VyIG9mIGFub3RoZXIgY29ubmVjdGlvbiB0aG91Z2ggaWYgeW91IGxpa2U7IHRoaXMgaXMgZG9uZQorICogd2l0aCBkYnVzX2J1c19nZXRfd2luZG93c191c2VyKCkuIiBCdXQgdGhpcyBoYXMgdG8gYmUgaW1wbGVtZW50ZWQKKyAqIGluIGJ1cy9kcml2ZXIuYyBhbmQgZGJ1cy9kYnVzLWJ1cy5jLCBhbmQgaXMgcG9pbnRsZXNzIGFueXdheQorICogc2luY2Ugb24gV2luZG93cyB3ZSBvbmx5IHVzZSB0aGUgc2Vzc2lvbiBidXMgZm9yIG5vdy4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHBhcmFtIHdpbmRvd3Nfc2lkX3AgcmV0dXJuIGxvY2F0aW9uIGZvciBhbiBhbGxvY2F0ZWQgY29weSBvZiB0aGUgdXNlciBJRCwgb3IgI05VTEwgaWYgbm8gbWVtb3J5CisgKiBAcmV0dXJucyAjVFJVRSBpZiB1c2VyIGlzIGF2YWlsYWJsZSAocmV0dXJuZWQgdmFsdWUgbWF5IGJlICNOVUxMIGFueXdheSBpZiBubyBtZW1vcnkpCisgKi8KK2RidXNfYm9vbF90CitkYnVzX2Nvbm5lY3Rpb25fZ2V0X3dpbmRvd3NfdXNlciAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAgICAgICAgICAgICAgICAqKndpbmRvd3Nfc2lkX3ApCit7CisgIGRidXNfYm9vbF90IHJlc3VsdDsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHdpbmRvd3Nfc2lkX3AgIT0gTlVMTCwgRkFMU0UpOworCisgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisKKyAgaWYgKCFfZGJ1c190cmFuc3BvcnRfdHJ5X3RvX2F1dGhlbnRpY2F0ZSAoY29ubmVjdGlvbi0+dHJhbnNwb3J0KSkKKyAgICByZXN1bHQgPSBGQUxTRTsKKyAgZWxzZQorICAgIHJlc3VsdCA9IF9kYnVzX3RyYW5zcG9ydF9nZXRfd2luZG93c191c2VyIChjb25uZWN0aW9uLT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvd3Nfc2lkX3ApOworCisjaWZkZWYgREJVU19VTklYCisgIF9kYnVzX2Fzc2VydCAoIXJlc3VsdCk7CisjZW5kaWYKKyAgCisgIENPTk5FQ1RJT05fVU5MT0NLIChjb25uZWN0aW9uKTsKKworICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIFNldHMgYSBwcmVkaWNhdGUgZnVuY3Rpb24gdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciBhIGdpdmVuIHVzZXIgSUQKKyAqIGlzIGFsbG93ZWQgdG8gY29ubmVjdC4gV2hlbiBhbiBpbmNvbWluZyBjb25uZWN0aW9uIGhhcworICogYXV0aGVudGljYXRlZCB3aXRoIGEgcGFydGljdWxhciB1c2VyIElELCB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZDsKKyAqIGlmIGl0IHJldHVybnMgI1RSVUUsIHRoZSBjb25uZWN0aW9uIGlzIGFsbG93ZWQgdG8gcHJvY2VlZCwKKyAqIG90aGVyd2lzZSB0aGUgY29ubmVjdGlvbiBpcyBkaXNjb25uZWN0ZWQuCisgKgorICogSWYgdGhlIGZ1bmN0aW9uIGlzIHNldCB0byAjTlVMTCAoYXMgaXQgaXMgYnkgZGVmYXVsdCksIHRoZW4KKyAqIG9ubHkgdGhlIHNhbWUgdXNlciBvd25pbmcgdGhlIHNlcnZlciBwcm9jZXNzIHdpbGwgYmUgYWxsb3dlZCB0bworICogY29ubmVjdC4KKyAqCisgKiBPbiBVTklYLCB0aGUgZnVuY3Rpb24gd2lsbCBiZSBzZXQgYW5kIGl0cyBmcmVlX2RhdGFfZnVuY3Rpb24gd2lsbAorICogYmUgaW52b2tlZCB3aGVuIHRoZSBjb25uZWN0aW9uIGlzIGZyZWVkIG9yIGEgbmV3IGZ1bmN0aW9uIGlzIHNldC4KKyAqIEhvd2V2ZXIsIHRoZSBmdW5jdGlvbiB3aWxsIG5ldmVyIGJlIGNhbGxlZCwgYmVjYXVzZSB0aGVyZSBpcyBubworICogd2F5IHJpZ2h0IG5vdyB0byBhdXRoZW50aWNhdGUgYXMgYSBXaW5kb3dzIHVzZXIgb24gVU5JWC4KKyAqIAorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBmdW5jdGlvbiB0aGUgcHJlZGljYXRlCisgKiBAcGFyYW0gZGF0YSBkYXRhIHRvIHBhc3MgdG8gdGhlIHByZWRpY2F0ZQorICogQHBhcmFtIGZyZWVfZGF0YV9mdW5jdGlvbiBmdW5jdGlvbiB0byBmcmVlIHRoZSBkYXRhCisgKi8KK3ZvaWQKK2RidXNfY29ubmVjdGlvbl9zZXRfd2luZG93c191c2VyX2Z1bmN0aW9uIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0FsbG93V2luZG93c1VzZXJGdW5jdGlvbiBmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgICAgICAgICAgICBmcmVlX2RhdGFfZnVuY3Rpb24pCit7CisgIHZvaWQgKm9sZF9kYXRhID0gTlVMTDsKKyAgREJ1c0ZyZWVGdW5jdGlvbiBvbGRfZnJlZV9mdW5jdGlvbiA9IE5VTEw7CisKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCk7CisgIAorICBDT05ORUNUSU9OX0xPQ0sgKGNvbm5lY3Rpb24pOworICBfZGJ1c190cmFuc3BvcnRfc2V0X3dpbmRvd3NfdXNlcl9mdW5jdGlvbiAoY29ubmVjdGlvbi0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24sIGRhdGEsIGZyZWVfZGF0YV9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvbGRfZGF0YSwgJm9sZF9mcmVlX2Z1bmN0aW9uKTsKKyAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworCisgIGlmIChvbGRfZnJlZV9mdW5jdGlvbiAhPSBOVUxMKQorICAgICgqIG9sZF9mcmVlX2Z1bmN0aW9uKSAob2xkX2RhdGEpOworfQorCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgb24gdGhlIHNlcnZlciBzaWRlIG9mIGEgY29ubmVjdGlvbiB3aGVuIHRoZQorICogY29ubmVjdGlvbiBpcyBmaXJzdCBzZWVuIGluIHRoZSAjREJ1c05ld0Nvbm5lY3Rpb25GdW5jdGlvbi4gSWYgc2V0IHRvCisgKiAjVFJVRSAodGhlIGRlZmF1bHQgaXMgI0ZBTFNFKSwgdGhlbiB0aGUgY29ubmVjdGlvbiBjYW4gcHJvY2VlZCBldmVuIGlmCisgKiB0aGUgY2xpZW50IGRvZXMgbm90IGF1dGhlbnRpY2F0ZSBhcyBzb21lIHVzZXIgaWRlbnRpdHksIGkuZS4gY2xpZW50cworICogY2FuIGNvbm5lY3QgYW5vbnltb3VzbHkuCisgKiAKKyAqIFRoaXMgc2V0dGluZyBpbnRlcmFjdHMgd2l0aCB0aGUgYXZhaWxhYmxlIGF1dGhvcml6YXRpb24gbWVjaGFuaXNtcworICogKHNlZSBkYnVzX3NlcnZlcl9zZXRfYXV0aF9tZWNoYW5pc21zKCkpLiBOYW1lbHksIGFuIGF1dGggbWVjaGFuaXNtCisgKiBzdWNoIGFzIEFOT05ZTU9VUyB0aGF0IHN1cHBvcnRzIGFub255bW91cyBhdXRoIG11c3QgYmUgaW5jbHVkZWQgaW4KKyAqIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBtZWNoYW5pc21zIGZvciBhbm9ueW1vdXMgbG9naW4gdG8gd29yay4KKyAqCisgKiBUaGlzIHNldHRpbmcgYWxzbyBjaGFuZ2VzIHRoZSBkZWZhdWx0IHJ1bGUgZm9yIGNvbm5lY3Rpb25zCisgKiBhdXRob3JpemVkIGFzIGEgdXNlcjsgbm9ybWFsbHksIGlmIGEgY29ubmVjdGlvbiBhdXRob3JpemVzIGFzCisgKiBhIHVzZXIgaWRlbnRpdHksIGl0IGlzIHBlcm1pdHRlZCBpZiB0aGUgdXNlciBpZGVudGl0eSBpcworICogcm9vdCBvciB0aGUgdXNlciBpZGVudGl0eSBtYXRjaGVzIHRoZSB1c2VyIGlkZW50aXR5IG9mIHRoZSBzZXJ2ZXIKKyAqIHByb2Nlc3MuIElmIGFub255bW91cyBjb25uZWN0aW9ucyBhcmUgYWxsb3dlZCwgaG93ZXZlciwKKyAqIHRoZW4gYW55IHVzZXIgaWRlbnRpdHkgaXMgYWxsb3dlZC4KKyAqCisgKiBZb3UgY2FuIG92ZXJyaWRlIHRoZSBydWxlcyBmb3IgY29ubmVjdGlvbnMgYXV0aG9yaXplZCBhcyBhCisgKiB1c2VyIGlkZW50aXR5IHdpdGggZGJ1c19jb25uZWN0aW9uX3NldF91bml4X3VzZXJfZnVuY3Rpb24oKQorICogYW5kIGRidXNfY29ubmVjdGlvbl9zZXRfd2luZG93c191c2VyX2Z1bmN0aW9uKCkuCisgKiAKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gdmFsdWUgd2hldGhlciB0byBhbGxvdyBhdXRoZW50aWNhdGlvbiBhcyBhbiBhbm9ueW1vdXMgdXNlcgorICovCit2b2lkCitkYnVzX2Nvbm5lY3Rpb25fc2V0X2FsbG93X2Fub255bW91cyAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgICAgICAgICAgIHZhbHVlKQoreworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMKTsKKyAgCisgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisgIF9kYnVzX3RyYW5zcG9ydF9zZXRfYWxsb3dfYW5vbnltb3VzIChjb25uZWN0aW9uLT50cmFuc3BvcnQsIHZhbHVlKTsKKyAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworfQorCisvKioKKyAqCisgKiBOb3JtYWxseSAjREJ1c0Nvbm5lY3Rpb24gYXV0b21hdGljYWxseSBoYW5kbGVzIGFsbCBtZXNzYWdlcyB0byB0aGUKKyAqIG9yZy5mcmVlZGVza3RvcC5EQnVzLlBlZXIgaW50ZXJmYWNlLiBIb3dldmVyLCB0aGUgbWVzc2FnZSBidXMgd2FudHMKKyAqIHRvIGJlIGFibGUgdG8gcm91dGUgbWV0aG9kcyBvbiB0aGF0IGludGVyZmFjZSB0aHJvdWdoIHRoZSBidXMgYW5kCisgKiB0byBvdGhlciBhcHBsaWNhdGlvbnMuIElmIHJvdXRpbmcgcGVlciBtZXNzYWdlcyBpcyBlbmFibGVkLCB0aGVuCisgKiBtZXNzYWdlcyB3aXRoIHRoZSBvcmcuZnJlZWRlc2t0b3AuREJ1cy5QZWVyIGludGVyZmFjZSB0aGF0IGFsc28KKyAqIGhhdmUgYSBidXMgZGVzdGluYXRpb24gbmFtZSBzZXQgd2lsbCBub3QgYmUgYXV0b21hdGljYWxseQorICogaGFuZGxlZCBieSB0aGUgI0RCdXNDb25uZWN0aW9uIGFuZCBpbnN0ZWFkIHdpbGwgYmUgZGlzcGF0Y2hlZAorICogbm9ybWFsbHkgdG8gdGhlIGFwcGxpY2F0aW9uLgorICoKKyAqIElmIGEgbm9ybWFsIGFwcGxpY2F0aW9uIHNldHMgdGhpcyBmbGFnLCBpdCBjYW4gYnJlYWsgdGhpbmdzIGJhZGx5LgorICogU28gZG9uJ3Qgc2V0IHRoaXMgdW5sZXNzIHlvdSBhcmUgdGhlIG1lc3NhZ2UgYnVzLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gdmFsdWUgI1RSVUUgdG8gcGFzcyB0aHJvdWdoIG9yZy5mcmVlZGVza3RvcC5EQnVzLlBlZXIgbWVzc2FnZXMgd2l0aCBhIGJ1cyBuYW1lIHNldAorICovCit2b2lkCitkYnVzX2Nvbm5lY3Rpb25fc2V0X3JvdXRlX3BlZXJfbWVzc2FnZXMgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICAgICAgICAgICAgdmFsdWUpCit7CisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwpOworICAKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKyAgY29ubmVjdGlvbi0+cm91dGVfcGVlcl9tZXNzYWdlcyA9IHZhbHVlOworICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7Cit9CisKKy8qKgorICogQWRkcyBhIG1lc3NhZ2UgZmlsdGVyLiBGaWx0ZXJzIGFyZSBoYW5kbGVycyB0aGF0IGFyZSBydW4gb24gYWxsCisgKiBpbmNvbWluZyBtZXNzYWdlcywgcHJpb3IgdG8gdGhlIG9iamVjdHMgcmVnaXN0ZXJlZCB3aXRoCisgKiBkYnVzX2Nvbm5lY3Rpb25fcmVnaXN0ZXJfb2JqZWN0X3BhdGgoKS4gIEZpbHRlcnMgYXJlIHJ1biBpbiB0aGUKKyAqIG9yZGVyIHRoYXQgdGhleSB3ZXJlIGFkZGVkLiAgVGhlIHNhbWUgaGFuZGxlciBjYW4gYmUgYWRkZWQgYXMgYQorICogZmlsdGVyIG1vcmUgdGhhbiBvbmNlLCBpbiB3aGljaCBjYXNlIGl0IHdpbGwgYmUgcnVuIG1vcmUgdGhhbiBvbmNlLgorICogRmlsdGVycyBhZGRlZCBkdXJpbmcgYSBmaWx0ZXIgY2FsbGJhY2sgd29uJ3QgYmUgcnVuIG9uIHRoZSBtZXNzYWdlCisgKiBiZWluZyBwcm9jZXNzZWQuCisgKgorICogQHRvZG8gd2UgZG9uJ3QgcnVuIGZpbHRlcnMgb24gbWVzc2FnZXMgd2hpbGUgYmxvY2tpbmcgd2l0aG91dAorICogZW50ZXJpbmcgdGhlIG1haW4gbG9vcCwgc2luY2UgZmlsdGVycyBhcmUgcnVuIGFzIHBhcnQgb2YKKyAqIGRidXNfY29ubmVjdGlvbl9kaXNwYXRjaCgpLiBUaGlzIGlzIHByb2JhYmx5IGEgZmVhdHVyZSwgYXMgZmlsdGVycworICogY291bGQgY3JlYXRlIGFyYml0cmFyeSByZWVudHJhbmN5LiBCdXQga2luZCBvZiBzdWNrcyBpZiB5b3UncmUKKyAqIHRyeWluZyB0byBmaWx0ZXIgTUVUSE9EX1JFVFVSTiBmb3Igc29tZSByZWFzb24uCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBmdW5jdGlvbiBmdW5jdGlvbiB0byBoYW5kbGUgbWVzc2FnZXMKKyAqIEBwYXJhbSB1c2VyX2RhdGEgdXNlciBkYXRhIHRvIHBhc3MgdG8gdGhlIGZ1bmN0aW9uCisgKiBAcGFyYW0gZnJlZV9kYXRhX2Z1bmN0aW9uIGZ1bmN0aW9uIHRvIHVzZSBmb3IgZnJlZWluZyB1c2VyIGRhdGEKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MsICNGQUxTRSBpZiBub3QgZW5vdWdoIG1lbW9yeS4KKyAqLworZGJ1c19ib29sX3QKK2RidXNfY29ubmVjdGlvbl9hZGRfZmlsdGVyIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNIYW5kbGVNZXNzYWdlRnVuY3Rpb24gIGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgKnVzZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRnJlZUZ1bmN0aW9uICAgICAgICAgICBmcmVlX2RhdGFfZnVuY3Rpb24pCit7CisgIERCdXNNZXNzYWdlRmlsdGVyICpmaWx0ZXI7CisgIAorICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGZ1bmN0aW9uICE9IE5VTEwsIEZBTFNFKTsKKworICBmaWx0ZXIgPSBkYnVzX25ldzAgKERCdXNNZXNzYWdlRmlsdGVyLCAxKTsKKyAgaWYgKGZpbHRlciA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKworICBfZGJ1c19hdG9taWNfaW5jICgmZmlsdGVyLT5yZWZjb3VudCk7CisKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKworICBpZiAoIV9kYnVzX2xpc3RfYXBwZW5kICgmY29ubmVjdGlvbi0+ZmlsdGVyX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcikpCisgICAgeworICAgICAgX2RidXNfbWVzc2FnZV9maWx0ZXJfdW5yZWYgKGZpbHRlcik7CisgICAgICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIC8qIEZpbGwgaW4gZmlsdGVyIGFmdGVyIGFsbCBtZW1vcnkgYWxsb2NhdGVkLAorICAgKiBzbyB3ZSBkb24ndCBydW4gdGhlIGZyZWVfdXNlcl9kYXRhX2Z1bmN0aW9uCisgICAqIGlmIHRoZSBhZGRfZmlsdGVyKCkgZmFpbHMKKyAgICovCisgIAorICBmaWx0ZXItPmZ1bmN0aW9uID0gZnVuY3Rpb247CisgIGZpbHRlci0+dXNlcl9kYXRhID0gdXNlcl9kYXRhOworICBmaWx0ZXItPmZyZWVfdXNlcl9kYXRhX2Z1bmN0aW9uID0gZnJlZV9kYXRhX2Z1bmN0aW9uOworICAgICAgICAKKyAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBSZW1vdmVzIGEgcHJldmlvdXNseS1hZGRlZCBtZXNzYWdlIGZpbHRlci4gSXQgaXMgYSBwcm9ncmFtbWluZworICogZXJyb3IgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIGZvciBhIGhhbmRsZXIgdGhhdCBoYXMgbm90IGJlZW4gYWRkZWQKKyAqIGFzIGEgZmlsdGVyLiBJZiB0aGUgZ2l2ZW4gaGFuZGxlciB3YXMgYWRkZWQgbW9yZSB0aGFuIG9uY2UsIG9ubHkKKyAqIG9uZSBpbnN0YW5jZSBvZiBpdCB3aWxsIGJlIHJlbW92ZWQgKHRoZSBtb3N0IHJlY2VudGx5LWFkZGVkCisgKiBpbnN0YW5jZSkuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBmdW5jdGlvbiB0aGUgaGFuZGxlciB0byByZW1vdmUKKyAqIEBwYXJhbSB1c2VyX2RhdGEgdXNlciBkYXRhIGZvciB0aGUgaGFuZGxlciB0byByZW1vdmUKKyAqCisgKi8KK3ZvaWQKK2RidXNfY29ubmVjdGlvbl9yZW1vdmVfZmlsdGVyIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNIYW5kbGVNZXNzYWdlRnVuY3Rpb24gIGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgKnVzZXJfZGF0YSkKK3sKKyAgREJ1c0xpc3QgKmxpbms7CisgIERCdXNNZXNzYWdlRmlsdGVyICpmaWx0ZXI7CisgIAorICBfZGJ1c19yZXR1cm5faWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMKTsKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKGZ1bmN0aW9uICE9IE5VTEwpOworICAKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKworICBmaWx0ZXIgPSBOVUxMOworICAKKyAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2xhc3RfbGluayAoJmNvbm5lY3Rpb24tPmZpbHRlcl9saXN0KTsKKyAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBmaWx0ZXIgPSBsaW5rLT5kYXRhOworCisgICAgICBpZiAoZmlsdGVyLT5mdW5jdGlvbiA9PSBmdW5jdGlvbiAmJgorICAgICAgICAgIGZpbHRlci0+dXNlcl9kYXRhID09IHVzZXJfZGF0YSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX2xpc3RfcmVtb3ZlX2xpbmsgKCZjb25uZWN0aW9uLT5maWx0ZXJfbGlzdCwgbGluayk7CisgICAgICAgICAgZmlsdGVyLT5mdW5jdGlvbiA9IE5VTEw7CisgICAgICAgICAgCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfcHJldl9saW5rICgmY29ubmVjdGlvbi0+ZmlsdGVyX2xpc3QsIGxpbmspOworICAgICAgZmlsdGVyID0gTlVMTDsKKyAgICB9CisgIAorICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7CisKKyNpZm5kZWYgREJVU19ESVNBQkxFX0NIRUNLUworICBpZiAoZmlsdGVyID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfd2Fybl9jaGVja19mYWlsZWQgKCJBdHRlbXB0IHRvIHJlbW92ZSBmaWx0ZXIgZnVuY3Rpb24gJXAgdXNlciBkYXRhICVwLCBidXQgbm8gc3VjaCBmaWx0ZXIgaGFzIGJlZW4gYWRkZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uLCB1c2VyX2RhdGEpOworICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZgorICAKKyAgLyogQ2FsbCBhcHBsaWNhdGlvbiBjb2RlICovCisgIGlmIChmaWx0ZXItPmZyZWVfdXNlcl9kYXRhX2Z1bmN0aW9uKQorICAgICgqIGZpbHRlci0+ZnJlZV91c2VyX2RhdGFfZnVuY3Rpb24pIChmaWx0ZXItPnVzZXJfZGF0YSk7CisKKyAgZmlsdGVyLT5mcmVlX3VzZXJfZGF0YV9mdW5jdGlvbiA9IE5VTEw7CisgIGZpbHRlci0+dXNlcl9kYXRhID0gTlVMTDsKKyAgCisgIF9kYnVzX21lc3NhZ2VfZmlsdGVyX3VucmVmIChmaWx0ZXIpOworfQorCisvKioKKyAqIFJlZ2lzdGVycyBhIGhhbmRsZXIgZm9yIGEgZ2l2ZW4gcGF0aCBvciBzdWJzZWN0aW9uIGluIHRoZSBvYmplY3QKKyAqIGhpZXJhcmNoeS4gVGhlIGdpdmVuIHZ0YWJsZSBoYW5kbGVzIG1lc3NhZ2VzIHNlbnQgdG8gZXhhY3RseSB0aGUKKyAqIGdpdmVuIHBhdGggb3IgYWxzbyBmb3IgcGF0aHMgYmVsbG93IHRoYXQsIGRlcGVuZGluZyBvbiBmYWxsYmFjaworICogcGFyYW1ldGVyLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gZmFsbGJhY2sgd2hldGhlciB0byBoYW5kbGUgbWVzc2FnZXMgYWxzbyBmb3IgInN1YmRpcmVjdG9yeSIKKyAqIEBwYXJhbSBwYXRoIGEgJy8nIGRlbGltaXRlZCBzdHJpbmcgb2YgcGF0aCBlbGVtZW50cworICogQHBhcmFtIHZ0YWJsZSB0aGUgdmlydHVhbCB0YWJsZQorICogQHBhcmFtIHVzZXJfZGF0YSBkYXRhIHRvIHBhc3MgdG8gZnVuY3Rpb25zIGluIHRoZSB2dGFibGUKKyAqIEBwYXJhbSBlcnJvciBhZGRyZXNzIHdoZXJlIGFuIGVycm9yIGNhbiBiZSByZXR1cm5lZAorICogQHJldHVybnMgI0ZBTFNFIGlmIGFuIGVycm9yICgjREJVU19FUlJPUl9OT19NRU1PUlkgb3IKKyAqICAgICNEQlVTX0VSUk9SX09CSkVDVF9QQVRIX0lOX1VTRSkgaXMgcmVwb3J0ZWQKKyAqLworc3RhdGljIGRidXNfYm9vbF90CitfZGJ1c19jb25uZWN0aW9uX3JlZ2lzdGVyX29iamVjdF9wYXRoIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICAgICAgICAgICAgIGZhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgICAgICAgICAgICpwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c09iamVjdFBhdGhWVGFibGUgICp2dGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgKnVzZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICAgICAgICAgICAqZXJyb3IpCit7CisgIGNoYXIgKipkZWNvbXBvc2VkX3BhdGg7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKworICBpZiAoIV9kYnVzX2RlY29tcG9zZV9wYXRoIChwYXRoLCBzdHJsZW4gKHBhdGgpLCAmZGVjb21wb3NlZF9wYXRoLCBOVUxMKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKworICByZXR2YWwgPSBfZGJ1c19vYmplY3RfdHJlZV9yZWdpc3RlciAoY29ubmVjdGlvbi0+b2JqZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKiopIGRlY29tcG9zZWRfcGF0aCwgdnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlcl9kYXRhLCBlcnJvcik7CisKKyAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworCisgIGRidXNfZnJlZV9zdHJpbmdfYXJyYXkgKGRlY29tcG9zZWRfcGF0aCk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBSZWdpc3RlcnMgYSBoYW5kbGVyIGZvciBhIGdpdmVuIHBhdGggaW4gdGhlIG9iamVjdCBoaWVyYXJjaHkuCisgKiBUaGUgZ2l2ZW4gdnRhYmxlIGhhbmRsZXMgbWVzc2FnZXMgc2VudCB0byBleGFjdGx5IHRoZSBnaXZlbiBwYXRoLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gcGF0aCBhICcvJyBkZWxpbWl0ZWQgc3RyaW5nIG9mIHBhdGggZWxlbWVudHMKKyAqIEBwYXJhbSB2dGFibGUgdGhlIHZpcnR1YWwgdGFibGUKKyAqIEBwYXJhbSB1c2VyX2RhdGEgZGF0YSB0byBwYXNzIHRvIGZ1bmN0aW9ucyBpbiB0aGUgdnRhYmxlCisgKiBAcGFyYW0gZXJyb3IgYWRkcmVzcyB3aGVyZSBhbiBlcnJvciBjYW4gYmUgcmV0dXJuZWQKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBhbiBlcnJvciAoI0RCVVNfRVJST1JfTk9fTUVNT1JZIG9yCisgKiAgICAjREJVU19FUlJPUl9PQkpFQ1RfUEFUSF9JTl9VU0UpIGlzIHJlcG9ydGVkCisgKi8KK2RidXNfYm9vbF90CitkYnVzX2Nvbm5lY3Rpb25fdHJ5X3JlZ2lzdGVyX29iamVjdF9wYXRoIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAgICAgICAgICAgKnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzT2JqZWN0UGF0aFZUYWJsZSAgKnZ0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAqdXNlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgICAgICAgICAgICplcnJvcikKK3sKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChwYXRoICE9IE5VTEwsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChwYXRoWzBdID09ICcvJywgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHZ0YWJsZSAhPSBOVUxMLCBGQUxTRSk7CisKKyAgcmV0dXJuIF9kYnVzX2Nvbm5lY3Rpb25fcmVnaXN0ZXJfb2JqZWN0X3BhdGggKGNvbm5lY3Rpb24sIEZBTFNFLCBwYXRoLCB2dGFibGUsIHVzZXJfZGF0YSwgZXJyb3IpOworfQorCisvKioKKyAqIFJlZ2lzdGVycyBhIGhhbmRsZXIgZm9yIGEgZ2l2ZW4gcGF0aCBpbiB0aGUgb2JqZWN0IGhpZXJhcmNoeS4KKyAqIFRoZSBnaXZlbiB2dGFibGUgaGFuZGxlcyBtZXNzYWdlcyBzZW50IHRvIGV4YWN0bHkgdGhlIGdpdmVuIHBhdGguCisgKgorICogSXQgaXMgYSBidWcgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIGZvciBvYmplY3QgcGF0aHMgd2hpY2ggYWxyZWFkeQorICogaGF2ZSBhIGhhbmRsZXIuIFVzZSBkYnVzX2Nvbm5lY3Rpb25fdHJ5X3JlZ2lzdGVyX29iamVjdF9wYXRoKCkgaWYgdGhpcworICogbWlnaHQgYmUgdGhlIGNhc2UuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSBwYXRoIGEgJy8nIGRlbGltaXRlZCBzdHJpbmcgb2YgcGF0aCBlbGVtZW50cworICogQHBhcmFtIHZ0YWJsZSB0aGUgdmlydHVhbCB0YWJsZQorICogQHBhcmFtIHVzZXJfZGF0YSBkYXRhIHRvIHBhc3MgdG8gZnVuY3Rpb25zIGluIHRoZSB2dGFibGUKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBhbiBlcnJvciAoI0RCVVNfRVJST1JfTk9fTUVNT1JZIG9yCisgKiAgICAjREJVU19FUlJPUl9PQkpFQ1RfUEFUSF9JTl9VU0UpIG9jdXJyZWQKKyAqLworZGJ1c19ib29sX3QKK2RidXNfY29ubmVjdGlvbl9yZWdpc3Rlcl9vYmplY3RfcGF0aCAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAgICAgICAgICAgKnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNPYmplY3RQYXRoVlRhYmxlICAqdnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgKnVzZXJfZGF0YSkKK3sKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICBEQnVzRXJyb3IgZXJyb3IgPSBEQlVTX0VSUk9SX0lOSVQ7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChwYXRoICE9IE5VTEwsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChwYXRoWzBdID09ICcvJywgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHZ0YWJsZSAhPSBOVUxMLCBGQUxTRSk7CisKKyAgcmV0dmFsID0gX2RidXNfY29ubmVjdGlvbl9yZWdpc3Rlcl9vYmplY3RfcGF0aCAoY29ubmVjdGlvbiwgRkFMU0UsIHBhdGgsIHZ0YWJsZSwgdXNlcl9kYXRhLCAmZXJyb3IpOworCisgIGlmIChkYnVzX2Vycm9yX2hhc19uYW1lICgmZXJyb3IsIERCVVNfRVJST1JfT0JKRUNUX1BBVEhfSU5fVVNFKSkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiJXMiLCBlcnJvci5tZXNzYWdlKTsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBSZWdpc3RlcnMgYSBmYWxsYmFjayBoYW5kbGVyIGZvciBhIGdpdmVuIHN1YnNlY3Rpb24gb2YgdGhlIG9iamVjdAorICogaGllcmFyY2h5LiAgVGhlIGdpdmVuIHZ0YWJsZSBoYW5kbGVzIG1lc3NhZ2VzIGF0IG9yIGJlbG93IHRoZSBnaXZlbgorICogcGF0aC4gWW91IGNhbiB1c2UgdGhpcyB0byBlc3RhYmxpc2ggYSBkZWZhdWx0IG1lc3NhZ2UgaGFuZGxpbmcKKyAqIHBvbGljeSBmb3IgYSB3aG9sZSAic3ViZGlyZWN0b3J5LiIKKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHBhcmFtIHBhdGggYSAnLycgZGVsaW1pdGVkIHN0cmluZyBvZiBwYXRoIGVsZW1lbnRzCisgKiBAcGFyYW0gdnRhYmxlIHRoZSB2aXJ0dWFsIHRhYmxlCisgKiBAcGFyYW0gdXNlcl9kYXRhIGRhdGEgdG8gcGFzcyB0byBmdW5jdGlvbnMgaW4gdGhlIHZ0YWJsZQorICogQHBhcmFtIGVycm9yIGFkZHJlc3Mgd2hlcmUgYW4gZXJyb3IgY2FuIGJlIHJldHVybmVkCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgYW4gZXJyb3IgKCNEQlVTX0VSUk9SX05PX01FTU9SWSBvcgorICogICAgI0RCVVNfRVJST1JfT0JKRUNUX1BBVEhfSU5fVVNFKSBpcyByZXBvcnRlZAorICovCitkYnVzX2Jvb2xfdAorZGJ1c19jb25uZWN0aW9uX3RyeV9yZWdpc3Rlcl9mYWxsYmFjayAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgICAgICAgICAgICpwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c09iamVjdFBhdGhWVGFibGUgICp2dGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgKnVzZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICAgICAgICAgICAqZXJyb3IpCit7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAocGF0aCAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAocGF0aFswXSA9PSAnLycsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsICh2dGFibGUgIT0gTlVMTCwgRkFMU0UpOworCisgIHJldHVybiBfZGJ1c19jb25uZWN0aW9uX3JlZ2lzdGVyX29iamVjdF9wYXRoIChjb25uZWN0aW9uLCBUUlVFLCBwYXRoLCB2dGFibGUsIHVzZXJfZGF0YSwgZXJyb3IpOworfQorCisvKioKKyAqIFJlZ2lzdGVycyBhIGZhbGxiYWNrIGhhbmRsZXIgZm9yIGEgZ2l2ZW4gc3Vic2VjdGlvbiBvZiB0aGUgb2JqZWN0CisgKiBoaWVyYXJjaHkuICBUaGUgZ2l2ZW4gdnRhYmxlIGhhbmRsZXMgbWVzc2FnZXMgYXQgb3IgYmVsb3cgdGhlIGdpdmVuCisgKiBwYXRoLiBZb3UgY2FuIHVzZSB0aGlzIHRvIGVzdGFibGlzaCBhIGRlZmF1bHQgbWVzc2FnZSBoYW5kbGluZworICogcG9saWN5IGZvciBhIHdob2xlICJzdWJkaXJlY3RvcnkuIgorICoKKyAqIEl0IGlzIGEgYnVnIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiBmb3Igb2JqZWN0IHBhdGhzIHdoaWNoIGFscmVhZHkKKyAqIGhhdmUgYSBoYW5kbGVyLiBVc2UgZGJ1c19jb25uZWN0aW9uX3RyeV9yZWdpc3Rlcl9mYWxsYmFjaygpIGlmIHRoaXMKKyAqIG1pZ2h0IGJlIHRoZSBjYXNlLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gcGF0aCBhICcvJyBkZWxpbWl0ZWQgc3RyaW5nIG9mIHBhdGggZWxlbWVudHMKKyAqIEBwYXJhbSB2dGFibGUgdGhlIHZpcnR1YWwgdGFibGUKKyAqIEBwYXJhbSB1c2VyX2RhdGEgZGF0YSB0byBwYXNzIHRvIGZ1bmN0aW9ucyBpbiB0aGUgdnRhYmxlCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgYW4gZXJyb3IgKCNEQlVTX0VSUk9SX05PX01FTU9SWSBvcgorICogICAgI0RCVVNfRVJST1JfT0JKRUNUX1BBVEhfSU5fVVNFKSBvY2N1cmVkCisgKi8KK2RidXNfYm9vbF90CitkYnVzX2Nvbm5lY3Rpb25fcmVnaXN0ZXJfZmFsbGJhY2sgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgICAgICAgICAgICpwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzT2JqZWN0UGF0aFZUYWJsZSAgKnZ0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICp1c2VyX2RhdGEpCit7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgREJ1c0Vycm9yIGVycm9yID0gREJVU19FUlJPUl9JTklUOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAocGF0aCAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAocGF0aFswXSA9PSAnLycsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsICh2dGFibGUgIT0gTlVMTCwgRkFMU0UpOworCisgIHJldHZhbCA9IF9kYnVzX2Nvbm5lY3Rpb25fcmVnaXN0ZXJfb2JqZWN0X3BhdGggKGNvbm5lY3Rpb24sIFRSVUUsIHBhdGgsIHZ0YWJsZSwgdXNlcl9kYXRhLCAmZXJyb3IpOworCisgIGlmIChkYnVzX2Vycm9yX2hhc19uYW1lICgmZXJyb3IsIERCVVNfRVJST1JfT0JKRUNUX1BBVEhfSU5fVVNFKSkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiJXMiLCBlcnJvci5tZXNzYWdlKTsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBVbnJlZ2lzdGVycyB0aGUgaGFuZGxlciByZWdpc3RlcmVkIHdpdGggZXhhY3RseSB0aGUgZ2l2ZW4gcGF0aC4KKyAqIEl0J3MgYSBidWcgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIGZvciBhIHBhdGggdGhhdCBpc24ndCByZWdpc3RlcmVkLgorICogQ2FuIHVucmVnaXN0ZXIgYm90aCBmYWxsYmFjayBwYXRocyBhbmQgb2JqZWN0IHBhdGhzLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gcGF0aCBhICcvJyBkZWxpbWl0ZWQgc3RyaW5nIG9mIHBhdGggZWxlbWVudHMKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBub3QgZW5vdWdoIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorZGJ1c19jb25uZWN0aW9uX3VucmVnaXN0ZXJfb2JqZWN0X3BhdGggKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAgICAgICAgICAgKnBhdGgpCit7CisgIGNoYXIgKipkZWNvbXBvc2VkX3BhdGg7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChwYXRoICE9IE5VTEwsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChwYXRoWzBdID09ICcvJywgRkFMU0UpOworCisgIGlmICghX2RidXNfZGVjb21wb3NlX3BhdGggKHBhdGgsIHN0cmxlbiAocGF0aCksICZkZWNvbXBvc2VkX3BhdGgsIE5VTEwpKQorICAgICAgcmV0dXJuIEZBTFNFOworCisgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisKKyAgX2RidXNfb2JqZWN0X3RyZWVfdW5yZWdpc3Rlcl9hbmRfdW5sb2NrIChjb25uZWN0aW9uLT5vYmplY3RzLCAoY29uc3QgY2hhciAqKikgZGVjb21wb3NlZF9wYXRoKTsKKworICBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5IChkZWNvbXBvc2VkX3BhdGgpOworCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIEdldHMgdGhlIHVzZXIgZGF0YSBwYXNzZWQgdG8gZGJ1c19jb25uZWN0aW9uX3JlZ2lzdGVyX29iamVjdF9wYXRoKCkKKyAqIG9yIGRidXNfY29ubmVjdGlvbl9yZWdpc3Rlcl9mYWxsYmFjaygpLiBJZiBub3RoaW5nIHdhcyByZWdpc3RlcmVkCisgKiBhdCB0aGlzIHBhdGgsIHRoZSBkYXRhIGlzIGZpbGxlZCBpbiB3aXRoICNOVUxMLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aCB5b3UgcmVnaXN0ZXJlZCB3aXRoCisgKiBAcGFyYW0gZGF0YV9wIGxvY2F0aW9uIHRvIHN0b3JlIHRoZSB1c2VyIGRhdGEsIG9yICNOVUxMCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm90IGVub3VnaCBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK2RidXNfY29ubmVjdGlvbl9nZXRfb2JqZWN0X3BhdGhfZGF0YSAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICoqZGF0YV9wKQoreworICBjaGFyICoqZGVjb21wb3NlZF9wYXRoOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAocGF0aCAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoZGF0YV9wICE9IE5VTEwsIEZBTFNFKTsKKworICAqZGF0YV9wID0gTlVMTDsKKyAgCisgIGlmICghX2RidXNfZGVjb21wb3NlX3BhdGggKHBhdGgsIHN0cmxlbiAocGF0aCksICZkZWNvbXBvc2VkX3BhdGgsIE5VTEwpKQorICAgIHJldHVybiBGQUxTRTsKKyAgCisgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisKKyAgKmRhdGFfcCA9IF9kYnVzX29iamVjdF90cmVlX2dldF91c2VyX2RhdGFfdW5sb2NrZWQgKGNvbm5lY3Rpb24tPm9iamVjdHMsIChjb25zdCBjaGFyKiopIGRlY29tcG9zZWRfcGF0aCk7CisKKyAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworCisgIGRidXNfZnJlZV9zdHJpbmdfYXJyYXkgKGRlY29tcG9zZWRfcGF0aCk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogTGlzdHMgdGhlIHJlZ2lzdGVyZWQgZmFsbGJhY2sgaGFuZGxlcnMgYW5kIG9iamVjdCBwYXRoIGhhbmRsZXJzIGF0CisgKiB0aGUgZ2l2ZW4gcGFyZW50X3BhdGguIFRoZSByZXR1cm5lZCBhcnJheSBzaG91bGQgYmUgZnJlZWQgd2l0aAorICogZGJ1c19mcmVlX3N0cmluZ19hcnJheSgpLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gcGFyZW50X3BhdGggdGhlIHBhdGggdG8gbGlzdCB0aGUgY2hpbGQgaGFuZGxlcnMgb2YKKyAqIEBwYXJhbSBjaGlsZF9lbnRyaWVzIHJldHVybnMgI05VTEwtdGVybWluYXRlZCBhcnJheSBvZiBjaGlsZHJlbgorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vIG1lbW9yeSB0byBhbGxvY2F0ZSB0aGUgY2hpbGQgZW50cmllcworICovCitkYnVzX2Jvb2xfdAorZGJ1c19jb25uZWN0aW9uX2xpc3RfcmVnaXN0ZXJlZCAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgICAgICAgICAgICpwYXJlbnRfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICAgICAgICAgICAgICAgKioqY2hpbGRfZW50cmllcykKK3sKKyAgY2hhciAqKmRlY29tcG9zZWRfcGF0aDsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHBhcmVudF9wYXRoICE9IE5VTEwsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChwYXJlbnRfcGF0aFswXSA9PSAnLycsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChjaGlsZF9lbnRyaWVzICE9IE5VTEwsIEZBTFNFKTsKKworICBpZiAoIV9kYnVzX2RlY29tcG9zZV9wYXRoIChwYXJlbnRfcGF0aCwgc3RybGVuIChwYXJlbnRfcGF0aCksICZkZWNvbXBvc2VkX3BhdGgsIE5VTEwpKQorICAgIHJldHVybiBGQUxTRTsKKworICBDT05ORUNUSU9OX0xPQ0sgKGNvbm5lY3Rpb24pOworCisgIHJldHZhbCA9IF9kYnVzX29iamVjdF90cmVlX2xpc3RfcmVnaXN0ZXJlZF9hbmRfdW5sb2NrIChjb25uZWN0aW9uLT5vYmplY3RzLAorCQkJCQkJCSAoY29uc3QgY2hhciAqKikgZGVjb21wb3NlZF9wYXRoLAorCQkJCQkJCSBjaGlsZF9lbnRyaWVzKTsKKyAgZGJ1c19mcmVlX3N0cmluZ19hcnJheSAoZGVjb21wb3NlZF9wYXRoKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgREJ1c0RhdGFTbG90QWxsb2NhdG9yIHNsb3RfYWxsb2NhdG9yID0KKyAgX0RCVVNfREFUQV9TTE9UX0FMTE9DQVRPUl9JTklUIChfREJVU19MT0NLX05BTUUgKGNvbm5lY3Rpb25fc2xvdHMpKTsKKworLyoqCisgKiBBbGxvY2F0ZXMgYW4gaW50ZWdlciBJRCB0byBiZSB1c2VkIGZvciBzdG9yaW5nIGFwcGxpY2F0aW9uLXNwZWNpZmljCisgKiBkYXRhIG9uIGFueSBEQnVzQ29ubmVjdGlvbi4gVGhlIGFsbG9jYXRlZCBJRCBtYXkgdGhlbiBiZSB1c2VkCisgKiB3aXRoIGRidXNfY29ubmVjdGlvbl9zZXRfZGF0YSgpIGFuZCBkYnVzX2Nvbm5lY3Rpb25fZ2V0X2RhdGEoKS4KKyAqIFRoZSBwYXNzZWQtaW4gc2xvdCBtdXN0IGJlIGluaXRpYWxpemVkIHRvIC0xLCBhbmQgaXMgZmlsbGVkIGluCisgKiB3aXRoIHRoZSBzbG90IElELiBJZiB0aGUgcGFzc2VkLWluIHNsb3QgaXMgbm90IC0xLCBpdCdzIGFzc3VtZWQKKyAqIHRvIGJlIGFscmVhZHkgYWxsb2NhdGVkLCBhbmQgaXRzIHJlZmNvdW50IGlzIGluY3JlbWVudGVkLgorICogCisgKiBUaGUgYWxsb2NhdGVkIHNsb3QgaXMgZ2xvYmFsLCBpLmUuIGFsbCBEQnVzQ29ubmVjdGlvbiBvYmplY3RzIHdpbGwKKyAqIGhhdmUgYSBzbG90IHdpdGggdGhlIGdpdmVuIGludGVnZXIgSUQgcmVzZXJ2ZWQuCisgKgorICogQHBhcmFtIHNsb3RfcCBhZGRyZXNzIG9mIGEgZ2xvYmFsIHZhcmlhYmxlIHN0b3JpbmcgdGhlIHNsb3QKKyAqIEByZXR1cm5zICNGQUxTRSBvbiBmYWlsdXJlIChubyBtZW1vcnkpCisgKi8KK2RidXNfYm9vbF90CitkYnVzX2Nvbm5lY3Rpb25fYWxsb2NhdGVfZGF0YV9zbG90IChkYnVzX2ludDMyX3QgKnNsb3RfcCkKK3sKKyAgcmV0dXJuIF9kYnVzX2RhdGFfc2xvdF9hbGxvY2F0b3JfYWxsb2MgKCZzbG90X2FsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3RfcCk7Cit9CisKKy8qKgorICogRGVhbGxvY2F0ZXMgYSBnbG9iYWwgSUQgZm9yIGNvbm5lY3Rpb24gZGF0YSBzbG90cy4KKyAqIGRidXNfY29ubmVjdGlvbl9nZXRfZGF0YSgpIGFuZCBkYnVzX2Nvbm5lY3Rpb25fc2V0X2RhdGEoKSBtYXkgbm8KKyAqIGxvbmdlciBiZSB1c2VkIHdpdGggdGhpcyBzbG90LiAgRXhpc3RpbmcgZGF0YSBzdG9yZWQgb24gZXhpc3RpbmcKKyAqIERCdXNDb25uZWN0aW9uIG9iamVjdHMgd2lsbCBiZSBmcmVlZCB3aGVuIHRoZSBjb25uZWN0aW9uIGlzCisgKiBmaW5hbGl6ZWQsIGJ1dCBtYXkgbm90IGJlIHJldHJpZXZlZCAoYW5kIG1heSBvbmx5IGJlIHJlcGxhY2VkIGlmCisgKiBzb21lb25lIGVsc2UgcmVhbGxvY2F0ZXMgdGhlIHNsb3QpLiAgV2hlbiB0aGUgcmVmY291bnQgb24gdGhlCisgKiBwYXNzZWQtaW4gc2xvdCByZWFjaGVzIDAsIGl0IGlzIHNldCB0byAtMS4KKyAqCisgKiBAcGFyYW0gc2xvdF9wIGFkZHJlc3Mgc3RvcmluZyB0aGUgc2xvdCB0byBkZWFsbG9jYXRlCisgKi8KK3ZvaWQKK2RidXNfY29ubmVjdGlvbl9mcmVlX2RhdGFfc2xvdCAoZGJ1c19pbnQzMl90ICpzbG90X3ApCit7CisgIF9kYnVzX3JldHVybl9pZl9mYWlsICgqc2xvdF9wID49IDApOworICAKKyAgX2RidXNfZGF0YV9zbG90X2FsbG9jYXRvcl9mcmVlICgmc2xvdF9hbGxvY2F0b3IsIHNsb3RfcCk7Cit9CisKKy8qKgorICogU3RvcmVzIGEgcG9pbnRlciBvbiBhIERCdXNDb25uZWN0aW9uLCBhbG9uZworICogd2l0aCBhbiBvcHRpb25hbCBmdW5jdGlvbiB0byBiZSB1c2VkIGZvciBmcmVlaW5nCisgKiB0aGUgZGF0YSB3aGVuIHRoZSBkYXRhIGlzIHNldCBhZ2Fpbiwgb3Igd2hlbgorICogdGhlIGNvbm5lY3Rpb24gaXMgZmluYWxpemVkLiBUaGUgc2xvdCBudW1iZXIKKyAqIG11c3QgaGF2ZSBiZWVuIGFsbG9jYXRlZCB3aXRoIGRidXNfY29ubmVjdGlvbl9hbGxvY2F0ZV9kYXRhX3Nsb3QoKS4KKyAqCisgKiBAbm90ZSBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHRha2UgdGhlCisgKiBtYWluIHRocmVhZCBsb2NrIG9uIERCdXNDb25uZWN0aW9uLCB3aGljaCBhbGxvd3MgaXQgdG8gYmUKKyAqIHVzZWQgZnJvbSBpbnNpZGUgd2F0Y2ggYW5kIHRpbWVvdXQgZnVuY3Rpb25zLiAoU2VlIHRoZQorICogbm90ZSBpbiBkb2NzIGZvciBkYnVzX2Nvbm5lY3Rpb25fc2V0X3dhdGNoX2Z1bmN0aW9ucygpLikKKyAqIEEgc2lkZSBlZmZlY3Qgb2YgdGhpcyBpcyB0aGF0IHlvdSBuZWVkIHRvIGtub3cgdGhlcmUncworICogYSByZWZlcmVuY2UgaGVsZCBvbiB0aGUgY29ubmVjdGlvbiB3aGlsZSBpbnZva2luZworICogZGJ1c19jb25uZWN0aW9uX3NldF9kYXRhKCksIG9yIHRoZSBjb25uZWN0aW9uIGNvdWxkIGJlCisgKiBmaW5hbGl6ZWQgZHVyaW5nIGRidXNfY29ubmVjdGlvbl9zZXRfZGF0YSgpLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0gc2xvdCB0aGUgc2xvdCBudW1iZXIKKyAqIEBwYXJhbSBkYXRhIHRoZSBkYXRhIHRvIHN0b3JlCisgKiBAcGFyYW0gZnJlZV9kYXRhX2Z1bmMgZmluYWxpemVyIGZ1bmN0aW9uIGZvciB0aGUgZGF0YQorICogQHJldHVybnMgI1RSVUUgaWYgdGhlcmUgd2FzIGVub3VnaCBtZW1vcnkgdG8gc3RvcmUgdGhlIGRhdGEKKyAqLworZGJ1c19ib29sX3QKK2RidXNfY29ubmVjdGlvbl9zZXRfZGF0YSAoREJ1c0Nvbm5lY3Rpb24gICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19pbnQzMl90ICAgICAgc2xvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgZnJlZV9kYXRhX2Z1bmMpCit7CisgIERCdXNGcmVlRnVuY3Rpb24gb2xkX2ZyZWVfZnVuYzsKKyAgdm9pZCAqb2xkX2RhdGE7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHNsb3QgPj0gMCwgRkFMU0UpOworICAKKyAgU0xPVFNfTE9DSyAoY29ubmVjdGlvbik7CisKKyAgcmV0dmFsID0gX2RidXNfZGF0YV9zbG90X2xpc3Rfc2V0ICgmc2xvdF9hbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbm5lY3Rpb24tPnNsb3RfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90LCBkYXRhLCBmcmVlX2RhdGFfZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2xkX2ZyZWVfZnVuYywgJm9sZF9kYXRhKTsKKyAgCisgIFNMT1RTX1VOTE9DSyAoY29ubmVjdGlvbik7CisKKyAgaWYgKHJldHZhbCkKKyAgICB7CisgICAgICAvKiBEbyB0aGUgYWN0dWFsIGZyZWUgb3V0c2lkZSB0aGUgY29ubmVjdGlvbiBsb2NrICovCisgICAgICBpZiAob2xkX2ZyZWVfZnVuYykKKyAgICAgICAgKCogb2xkX2ZyZWVfZnVuYykgKG9sZF9kYXRhKTsKKyAgICB9CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBSZXRyaWV2ZXMgZGF0YSBwcmV2aW91c2x5IHNldCB3aXRoIGRidXNfY29ubmVjdGlvbl9zZXRfZGF0YSgpLgorICogVGhlIHNsb3QgbXVzdCBzdGlsbCBiZSBhbGxvY2F0ZWQgKG11c3Qgbm90IGhhdmUgYmVlbiBmcmVlZCkuCisgKgorICogQG5vdGUgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCB0YWtlIHRoZQorICogbWFpbiB0aHJlYWQgbG9jayBvbiBEQnVzQ29ubmVjdGlvbiwgd2hpY2ggYWxsb3dzIGl0IHRvIGJlCisgKiB1c2VkIGZyb20gaW5zaWRlIHdhdGNoIGFuZCB0aW1lb3V0IGZ1bmN0aW9ucy4gKFNlZSB0aGUKKyAqIG5vdGUgaW4gZG9jcyBmb3IgZGJ1c19jb25uZWN0aW9uX3NldF93YXRjaF9mdW5jdGlvbnMoKS4pCisgKiBBIHNpZGUgZWZmZWN0IG9mIHRoaXMgaXMgdGhhdCB5b3UgbmVlZCB0byBrbm93IHRoZXJlJ3MKKyAqIGEgcmVmZXJlbmNlIGhlbGQgb24gdGhlIGNvbm5lY3Rpb24gd2hpbGUgaW52b2tpbmcKKyAqIGRidXNfY29ubmVjdGlvbl9nZXRfZGF0YSgpLCBvciB0aGUgY29ubmVjdGlvbiBjb3VsZCBiZQorICogZmluYWxpemVkIGR1cmluZyBkYnVzX2Nvbm5lY3Rpb25fZ2V0X2RhdGEoKS4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHBhcmFtIHNsb3QgdGhlIHNsb3QgdG8gZ2V0IGRhdGEgZnJvbQorICogQHJldHVybnMgdGhlIGRhdGEsIG9yICNOVUxMIGlmIG5vdCBmb3VuZAorICovCit2b2lkKgorZGJ1c19jb25uZWN0aW9uX2dldF9kYXRhIChEQnVzQ29ubmVjdGlvbiAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2ludDMyX3QgICAgICBzbG90KQoreworICB2b2lkICpyZXM7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwsIE5VTEwpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHNsb3QgPj0gMCwgTlVMTCk7CisKKyAgU0xPVFNfTE9DSyAoY29ubmVjdGlvbik7CisKKyAgcmVzID0gX2RidXNfZGF0YV9zbG90X2xpc3RfZ2V0ICgmc2xvdF9hbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbm5lY3Rpb24tPnNsb3RfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90KTsKKyAgCisgIFNMT1RTX1VOTE9DSyAoY29ubmVjdGlvbik7CisKKyAgcmV0dXJuIHJlczsKK30KKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIHNldHMgYSBnbG9iYWwgZmxhZyBmb3Igd2hldGhlciBkYnVzX2Nvbm5lY3Rpb25fbmV3KCkKKyAqIHdpbGwgc2V0IFNJR1BJUEUgYmVoYXZpb3IgdG8gU0lHX0lHTi4KKyAqCisgKiBAcGFyYW0gd2lsbF9tb2RpZnlfc2lncGlwZSAjVFJVRSB0byBhbGxvdyBzaWdwaXBlIHRvIGJlIHNldCB0byBTSUdfSUdOCisgKi8KK3ZvaWQKK2RidXNfY29ubmVjdGlvbl9zZXRfY2hhbmdlX3NpZ3BpcGUgKGRidXNfYm9vbF90IHdpbGxfbW9kaWZ5X3NpZ3BpcGUpCit7ICAKKyAgX2RidXNfbW9kaWZ5X3NpZ3BpcGUgPSB3aWxsX21vZGlmeV9zaWdwaXBlICE9IEZBTFNFOworfQorCisvKioKKyAqIFNwZWNpZmllcyB0aGUgbWF4aW11bSBzaXplIG1lc3NhZ2UgdGhpcyBjb25uZWN0aW9uIGlzIGFsbG93ZWQgdG8KKyAqIHJlY2VpdmUuIExhcmdlciBtZXNzYWdlcyB3aWxsIHJlc3VsdCBpbiBkaXNjb25uZWN0aW5nIHRoZQorICogY29ubmVjdGlvbi4KKyAqIAorICogQHBhcmFtIGNvbm5lY3Rpb24gYSAjREJ1c0Nvbm5lY3Rpb24KKyAqIEBwYXJhbSBzaXplIG1heGltdW0gbWVzc2FnZSBzaXplIHRoZSBjb25uZWN0aW9uIGNhbiByZWNlaXZlLCBpbiBieXRlcworICovCit2b2lkCitkYnVzX2Nvbm5lY3Rpb25fc2V0X21heF9tZXNzYWdlX3NpemUgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nICAgICAgICAgICAgc2l6ZSkKK3sKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCk7CisgIAorICBDT05ORUNUSU9OX0xPQ0sgKGNvbm5lY3Rpb24pOworICBfZGJ1c190cmFuc3BvcnRfc2V0X21heF9tZXNzYWdlX3NpemUgKGNvbm5lY3Rpb24tPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplKTsKKyAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworfQorCisvKioKKyAqIEdldHMgdGhlIHZhbHVlIHNldCBieSBkYnVzX2Nvbm5lY3Rpb25fc2V0X21heF9tZXNzYWdlX3NpemUoKS4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHJldHVybnMgdGhlIG1heCBzaXplIG9mIGEgc2luZ2xlIG1lc3NhZ2UKKyAqLworbG9uZworZGJ1c19jb25uZWN0aW9uX2dldF9tYXhfbWVzc2FnZV9zaXplIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgbG9uZyByZXM7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwsIDApOworICAKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKyAgcmVzID0gX2RidXNfdHJhbnNwb3J0X2dldF9tYXhfbWVzc2FnZV9zaXplIChjb25uZWN0aW9uLT50cmFuc3BvcnQpOworICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7CisgIHJldHVybiByZXM7Cit9CisKKy8qKgorICogU3BlY2lmaWVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiB1bml4IGZkcyBhIG1lc3NhZ2Ugb24gdGhpcworICogY29ubmVjdGlvbiBpcyBhbGxvd2VkIHRvIHJlY2VpdmUuIE1lc3NhZ2VzIHdpdGggbW9yZSB1bml4IGZkcyB3aWxsCisgKiByZXN1bHQgaW4gZGlzY29ubmVjdGluZyB0aGUgY29ubmVjdGlvbi4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiBhICNEQnVzQ29ubmVjdGlvbgorICogQHBhcmFtIG4gbWF4aW11bSBtZXNzYWdlIHVuaXggZmRzIHRoZSBjb25uZWN0aW9uIGNhbiByZWNlaXZlCisgKi8KK3ZvaWQKK2RidXNfY29ubmVjdGlvbl9zZXRfbWF4X21lc3NhZ2VfdW5peF9mZHMgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyAgICAgICAgICAgIG4pCit7CisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChjb25uZWN0aW9uICE9IE5VTEwpOworCisgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisgIF9kYnVzX3RyYW5zcG9ydF9zZXRfbWF4X21lc3NhZ2VfdW5peF9mZHMgKGNvbm5lY3Rpb24tPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbik7CisgIENPTk5FQ1RJT05fVU5MT0NLIChjb25uZWN0aW9uKTsKK30KKworLyoqCisgKiBHZXRzIHRoZSB2YWx1ZSBzZXQgYnkgZGJ1c19jb25uZWN0aW9uX3NldF9tYXhfbWVzc2FnZV91bml4X2ZkcygpLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJucyB0aGUgbWF4IG51bWVyIG9mIHVuaXggZmRzIG9mIGEgc2luZ2xlIG1lc3NhZ2UKKyAqLworbG9uZworZGJ1c19jb25uZWN0aW9uX2dldF9tYXhfbWVzc2FnZV91bml4X2ZkcyAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIGxvbmcgcmVzOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMLCAwKTsKKworICBDT05ORUNUSU9OX0xPQ0sgKGNvbm5lY3Rpb24pOworICByZXMgPSBfZGJ1c190cmFuc3BvcnRfZ2V0X21heF9tZXNzYWdlX3VuaXhfZmRzIChjb25uZWN0aW9uLT50cmFuc3BvcnQpOworICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7CisgIHJldHVybiByZXM7Cit9CisKKy8qKgorICogU2V0cyB0aGUgbWF4aW11bSB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgdGhhdCBjYW4gYmUgdXNlZCBmb3IgYWxsIG1lc3NhZ2VzCisgKiByZWNlaXZlZCBvbiB0aGlzIGNvbm5lY3Rpb24uIE1lc3NhZ2VzIGNvdW50IHRvd2FyZCB0aGUgbWF4aW11bSB1bnRpbAorICogdGhleSBhcmUgZmluYWxpemVkLiBXaGVuIHRoZSBtYXhpbXVtIGlzIHJlYWNoZWQsIHRoZSBjb25uZWN0aW9uIHdpbGwKKyAqIG5vdCByZWFkIG1vcmUgZGF0YSB1bnRpbCBzb21lIG1lc3NhZ2VzIGFyZSBmaW5hbGl6ZWQuCisgKgorICogVGhlIHNlbWFudGljcyBvZiB0aGUgbWF4aW11bSBhcmU6IGlmIG91dHN0YW5kaW5nIG1lc3NhZ2VzIGFyZQorICogYWxyZWFkeSBhYm92ZSB0aGUgbWF4aW11bSwgYWRkaXRpb25hbCBtZXNzYWdlcyB3aWxsIG5vdCBiZSByZWFkLgorICogVGhlIHNlbWFudGljcyBhcmUgbm90OiBpZiB0aGUgbmV4dCBtZXNzYWdlIHdvdWxkIGNhdXNlIHVzIHRvIGV4Y2VlZAorICogdGhlIG1heGltdW0sIHdlIGRvbid0IHJlYWQgaXQuIFRoZSByZWFzb24gaXMgdGhhdCB3ZSBkb24ndCBrbm93IHRoZQorICogc2l6ZSBvZiBhIG1lc3NhZ2UgdW50aWwgYWZ0ZXIgd2UgcmVhZCBpdC4KKyAqCisgKiBUaHVzLCB0aGUgbWF4IGxpdmUgbWVzc2FnZXMgc2l6ZSBjYW4gYWN0dWFsbHkgYmUgZXhjZWVkZWQKKyAqIGJ5IHVwIHRvIHRoZSBtYXhpbXVtIHNpemUgb2YgYSBzaW5nbGUgbWVzc2FnZS4KKyAqIAorICogQWxzbywgaWYgd2UgcmVhZCBzYXkgMTAyNCBieXRlcyBvZmYgdGhlIHdpcmUgaW4gYSBzaW5nbGUgcmVhZCgpLAorICogYW5kIHRoYXQgY29udGFpbnMgYSBoYWxmLWRvemVuIHNtYWxsIG1lc3NhZ2VzLCB3ZSBtYXkgZXhjZWVkIHRoZQorICogc2l6ZSBtYXggYnkgdGhhdCBhbW91bnQuIEJ1dCB0aGlzIHNob3VsZCBiZSBpbmNvbnNlcXVlbnRpYWwuCisgKgorICogVGhpcyBkb2VzIGltcGx5IHRoYXQgd2UgY2FuJ3QgY2FsbCByZWFkKCkgd2l0aCBhIGJ1ZmZlciBsYXJnZXIKKyAqIHRoYW4gd2UncmUgd2lsbGluZyB0byBleGNlZWQgdGhpcyBsaW1pdCBieS4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHBhcmFtIHNpemUgdGhlIG1heGltdW0gc2l6ZSBpbiBieXRlcyBvZiBhbGwgb3V0c3RhbmRpbmcgbWVzc2FnZXMKKyAqLwordm9pZAorZGJ1c19jb25uZWN0aW9uX3NldF9tYXhfcmVjZWl2ZWRfc2l6ZSAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nICAgICAgICAgICAgc2l6ZSkKK3sKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCk7CisgIAorICBDT05ORUNUSU9OX0xPQ0sgKGNvbm5lY3Rpb24pOworICBfZGJ1c190cmFuc3BvcnRfc2V0X21heF9yZWNlaXZlZF9zaXplIChjb25uZWN0aW9uLT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUpOworICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7Cit9CisKKy8qKgorICogR2V0cyB0aGUgdmFsdWUgc2V0IGJ5IGRidXNfY29ubmVjdGlvbl9zZXRfbWF4X3JlY2VpdmVkX3NpemUoKS4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHJldHVybnMgdGhlIG1heCBzaXplIG9mIGFsbCBsaXZlIG1lc3NhZ2VzCisgKi8KK2xvbmcKK2RidXNfY29ubmVjdGlvbl9nZXRfbWF4X3JlY2VpdmVkX3NpemUgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBsb25nIHJlczsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCwgMCk7CisgIAorICBDT05ORUNUSU9OX0xPQ0sgKGNvbm5lY3Rpb24pOworICByZXMgPSBfZGJ1c190cmFuc3BvcnRfZ2V0X21heF9yZWNlaXZlZF9zaXplIChjb25uZWN0aW9uLT50cmFuc3BvcnQpOworICBDT05ORUNUSU9OX1VOTE9DSyAoY29ubmVjdGlvbik7CisgIHJldHVybiByZXM7Cit9CisKKy8qKgorICogU2V0cyB0aGUgbWF4aW11bSB0b3RhbCBudW1iZXIgb2YgdW5peCBmZHMgdGhhdCBjYW4gYmUgdXNlZCBmb3IgYWxsIG1lc3NhZ2VzCisgKiByZWNlaXZlZCBvbiB0aGlzIGNvbm5lY3Rpb24uIE1lc3NhZ2VzIGNvdW50IHRvd2FyZCB0aGUgbWF4aW11bSB1bnRpbAorICogdGhleSBhcmUgZmluYWxpemVkLiBXaGVuIHRoZSBtYXhpbXVtIGlzIHJlYWNoZWQsIHRoZSBjb25uZWN0aW9uIHdpbGwKKyAqIG5vdCByZWFkIG1vcmUgZGF0YSB1bnRpbCBzb21lIG1lc3NhZ2VzIGFyZSBmaW5hbGl6ZWQuCisgKgorICogVGhlIHNlbWFudGljcyBhcmUgYW5hbG9nb3VzIHRvIHRob3NlIG9mIGRidXNfY29ubmVjdGlvbl9zZXRfbWF4X3JlY2VpdmVkX3NpemUoKS4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHBhcmFtIG4gdGhlIG1heGltdW0gc2l6ZSBpbiBieXRlcyBvZiBhbGwgb3V0c3RhbmRpbmcgbWVzc2FnZXMKKyAqLwordm9pZAorZGJ1c19jb25uZWN0aW9uX3NldF9tYXhfcmVjZWl2ZWRfdW5peF9mZHMgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgICAgICAgICAgICBuKQoreworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMKTsKKworICBDT05ORUNUSU9OX0xPQ0sgKGNvbm5lY3Rpb24pOworICBfZGJ1c190cmFuc3BvcnRfc2V0X21heF9yZWNlaXZlZF91bml4X2ZkcyAoY29ubmVjdGlvbi0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbik7CisgIENPTk5FQ1RJT05fVU5MT0NLIChjb25uZWN0aW9uKTsKK30KKworLyoqCisgKiBHZXRzIHRoZSB2YWx1ZSBzZXQgYnkgZGJ1c19jb25uZWN0aW9uX3NldF9tYXhfcmVjZWl2ZWRfdW5peF9mZHMoKS4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHJldHVybnMgdGhlIG1heCB1bml4IGZkcyBvZiBhbGwgbGl2ZSBtZXNzYWdlcworICovCitsb25nCitkYnVzX2Nvbm5lY3Rpb25fZ2V0X21heF9yZWNlaXZlZF91bml4X2ZkcyAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIGxvbmcgcmVzOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoY29ubmVjdGlvbiAhPSBOVUxMLCAwKTsKKworICBDT05ORUNUSU9OX0xPQ0sgKGNvbm5lY3Rpb24pOworICByZXMgPSBfZGJ1c190cmFuc3BvcnRfZ2V0X21heF9yZWNlaXZlZF91bml4X2ZkcyAoY29ubmVjdGlvbi0+dHJhbnNwb3J0KTsKKyAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworICByZXR1cm4gcmVzOworfQorCisvKioKKyAqIEdldHMgdGhlIGFwcHJveGltYXRlIHNpemUgaW4gYnl0ZXMgb2YgYWxsIG1lc3NhZ2VzIGluIHRoZSBvdXRnb2luZworICogbWVzc2FnZSBxdWV1ZS4gVGhlIHNpemUgaXMgYXBwcm94aW1hdGUgaW4gdGhhdCB5b3Ugc2hvdWxkbid0IHVzZQorICogaXQgdG8gZGVjaWRlIGhvdyBtYW55IGJ5dGVzIHRvIHJlYWQgb2ZmIHRoZSBuZXR3b3JrIG9yIGFueXRoaW5nCisgKiBvZiB0aGF0IG5hdHVyZSwgYXMgb3B0aW1pemF0aW9ucyBtYXkgY2hvb3NlIHRvIHRlbGwgc21hbGwgd2hpdGUgbGllcworICogdG8gYXZvaWQgcGVyZm9ybWFuY2Ugb3ZlcmhlYWQuCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBoYXZlIGJlZW4gcXVldWVkIHVwIGJ1dCBub3Qgc2VudAorICovCitsb25nCitkYnVzX2Nvbm5lY3Rpb25fZ2V0X291dGdvaW5nX3NpemUgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBsb25nIHJlczsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCwgMCk7CisKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKyAgcmVzID0gX2RidXNfY291bnRlcl9nZXRfc2l6ZV92YWx1ZSAoY29ubmVjdGlvbi0+b3V0Z29pbmdfY291bnRlcik7CisgIENPTk5FQ1RJT05fVU5MT0NLIChjb25uZWN0aW9uKTsKKyAgcmV0dXJuIHJlczsKK30KKworI2lmZGVmIERCVVNfRU5BQkxFX1NUQVRTCit2b2lkCitfZGJ1c19jb25uZWN0aW9uX2dldF9zdGF0cyAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgKmluX21lc3NhZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgICppbl9ieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90ICAqaW5fZmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgICppbl9wZWFrX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgICppbl9wZWFrX2ZkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90ICAqb3V0X21lc3NhZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgICpvdXRfYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgKm91dF9mZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgKm91dF9wZWFrX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgICpvdXRfcGVha19mZHMpCit7CisgIENPTk5FQ1RJT05fTE9DSyAoY29ubmVjdGlvbik7CisKKyAgaWYgKGluX21lc3NhZ2VzICE9IE5VTEwpCisgICAgKmluX21lc3NhZ2VzID0gY29ubmVjdGlvbi0+bl9pbmNvbWluZzsKKworICBfZGJ1c190cmFuc3BvcnRfZ2V0X3N0YXRzIChjb25uZWN0aW9uLT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluX2J5dGVzLCBpbl9mZHMsIGluX3BlYWtfYnl0ZXMsIGluX3BlYWtfZmRzKTsKKworICBpZiAob3V0X21lc3NhZ2VzICE9IE5VTEwpCisgICAgKm91dF9tZXNzYWdlcyA9IGNvbm5lY3Rpb24tPm5fb3V0Z29pbmc7CisKKyAgaWYgKG91dF9ieXRlcyAhPSBOVUxMKQorICAgICpvdXRfYnl0ZXMgPSBfZGJ1c19jb3VudGVyX2dldF9zaXplX3ZhbHVlIChjb25uZWN0aW9uLT5vdXRnb2luZ19jb3VudGVyKTsKKworICBpZiAob3V0X2ZkcyAhPSBOVUxMKQorICAgICpvdXRfZmRzID0gX2RidXNfY291bnRlcl9nZXRfdW5peF9mZF92YWx1ZSAoY29ubmVjdGlvbi0+b3V0Z29pbmdfY291bnRlcik7CisKKyAgaWYgKG91dF9wZWFrX2J5dGVzICE9IE5VTEwpCisgICAgKm91dF9wZWFrX2J5dGVzID0gX2RidXNfY291bnRlcl9nZXRfcGVha19zaXplX3ZhbHVlIChjb25uZWN0aW9uLT5vdXRnb2luZ19jb3VudGVyKTsKKworICBpZiAob3V0X3BlYWtfZmRzICE9IE5VTEwpCisgICAgKm91dF9wZWFrX2ZkcyA9IF9kYnVzX2NvdW50ZXJfZ2V0X3BlYWtfdW5peF9mZF92YWx1ZSAoY29ubmVjdGlvbi0+b3V0Z29pbmdfY291bnRlcik7CisKKyAgQ09OTkVDVElPTl9VTkxPQ0sgKGNvbm5lY3Rpb24pOworfQorI2VuZGlmIC8qIERCVVNfRU5BQkxFX1NUQVRTICovCisKKy8qKgorICogR2V0cyB0aGUgYXBwcm94aW1hdGUgbnVtYmVyIG9mIHVuaSBmZHMgb2YgYWxsIG1lc3NhZ2VzIGluIHRoZQorICogb3V0Z29pbmcgbWVzc2FnZSBxdWV1ZS4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbgorICogQHJldHVybnMgdGhlIG51bWJlciBvZiB1bml4IGZkcyB0aGF0IGhhdmUgYmVlbiBxdWV1ZWQgdXAgYnV0IG5vdCBzZW50CisgKi8KK2xvbmcKK2RidXNfY29ubmVjdGlvbl9nZXRfb3V0Z29pbmdfdW5peF9mZHMgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBsb25nIHJlczsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGNvbm5lY3Rpb24gIT0gTlVMTCwgMCk7CisKKyAgQ09OTkVDVElPTl9MT0NLIChjb25uZWN0aW9uKTsKKyAgcmVzID0gX2RidXNfY291bnRlcl9nZXRfdW5peF9mZF92YWx1ZSAoY29ubmVjdGlvbi0+b3V0Z29pbmdfY291bnRlcik7CisgIENPTk5FQ1RJT05fVU5MT0NLIChjb25uZWN0aW9uKTsKKyAgcmV0dXJuIHJlczsKK30KKworI2lmZGVmIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTCisvKioKKyAqIFJldHVybnMgdGhlIGFkZHJlc3Mgb2YgdGhlIHRyYW5zcG9ydCBvYmplY3Qgb2YgdGhpcyBjb25uZWN0aW9uCisgKgorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24KKyAqIEByZXR1cm5zIHRoZSBhZGRyZXNzIHN0cmluZworICovCitjb25zdCBjaGFyKgorX2RidXNfY29ubmVjdGlvbl9nZXRfYWRkcmVzcyAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisgIHJldHVybiBfZGJ1c190cmFuc3BvcnRfZ2V0X2FkZHJlc3MgKGNvbm5lY3Rpb24tPnRyYW5zcG9ydCk7Cit9CisjZW5kaWYKKworLyoqIEB9ICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtY29ubmVjdGlvbi5oIGIvZGJ1cy9kYnVzLWNvbm5lY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWQ1NDI0Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLWNvbm5lY3Rpb24uaApAQCAtMCwwICsxLDUyNiBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLWNvbm5lY3Rpb24uaCBEQnVzQ29ubmVjdGlvbiBvYmplY3QKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMgIFJlZCBIYXQgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworI2lmICFkZWZpbmVkIChEQlVTX0lOU0lERV9EQlVTX0gpICYmICFkZWZpbmVkIChEQlVTX0NPTVBJTEFUSU9OKQorI2Vycm9yICJPbmx5IDxkYnVzL2RidXMuaD4gY2FuIGJlIGluY2x1ZGVkIGRpcmVjdGx5LCB0aGlzIGZpbGUgbWF5IGRpc2FwcGVhciBvciBjaGFuZ2UgY29udGVudHMuIgorI2VuZGlmCisKKyNpZm5kZWYgREJVU19DT05ORUNUSU9OX0gKKyNkZWZpbmUgREJVU19DT05ORUNUSU9OX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy1lcnJvcnMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbWFjcm9zLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLW1lbW9yeS5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1tZXNzYWdlLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXNoYXJlZC5oPgorCitEQlVTX0JFR0lOX0RFQ0xTCisKKy8qKgorICogQGFkZHRvZ3JvdXAgREJ1c0Nvbm5lY3Rpb24KKyAqIEB7CisgKi8KKworLyogZG9jdW1lbnRlZCBpbiBkYnVzLXdhdGNoLmMgKi8KK3R5cGVkZWYgc3RydWN0IERCdXNXYXRjaCBEQnVzV2F0Y2g7CisvKiBkb2N1bWVudGVkIGluIGRidXMtdGltZW91dC5jICovCit0eXBlZGVmIHN0cnVjdCBEQnVzVGltZW91dCBEQnVzVGltZW91dDsKKy8qKiBPcGFxdWUgdHlwZSByZXByZXNlbnRpbmcgcHJlYWxsb2NhdGVkIHJlc291cmNlcyBzbyBhIG1lc3NhZ2UgY2FuIGJlIHNlbnQgd2l0aG91dCBmdXJ0aGVyIG1lbW9yeSBhbGxvY2F0aW9uLiAqLwordHlwZWRlZiBzdHJ1Y3QgREJ1c1ByZWFsbG9jYXRlZFNlbmQgREJ1c1ByZWFsbG9jYXRlZFNlbmQ7CisvKiogT3BhcXVlIHR5cGUgcmVwcmVzZW50aW5nIGEgbWV0aG9kIGNhbGwgdGhhdCBoYXMgbm90IHlldCByZWNlaXZlZCBhIHJlcGx5LiAqLwordHlwZWRlZiBzdHJ1Y3QgREJ1c1BlbmRpbmdDYWxsIERCdXNQZW5kaW5nQ2FsbDsKKy8qKiBPcGFxdWUgdHlwZSByZXByZXNlbnRpbmcgYSBjb25uZWN0aW9uIHRvIGEgcmVtb3RlIGFwcGxpY2F0aW9uIGFuZCBhc3NvY2lhdGVkIGluY29taW5nL291dGdvaW5nIG1lc3NhZ2UgcXVldWVzLiAqLwordHlwZWRlZiBzdHJ1Y3QgREJ1c0Nvbm5lY3Rpb24gREJ1c0Nvbm5lY3Rpb247CisvKiogU2V0IG9mIGZ1bmN0aW9ucyB0aGF0IG11c3QgYmUgaW1wbGVtZW50ZWQgdG8gaGFuZGxlIG1lc3NhZ2VzIHNlbnQgdG8gYSBwYXJ0aWN1bGFyIG9iamVjdCBwYXRoLiAqLwordHlwZWRlZiBzdHJ1Y3QgREJ1c09iamVjdFBhdGhWVGFibGUgREJ1c09iamVjdFBhdGhWVGFibGU7CisKKy8qKgorICogSW5kaWNhdGVzIHRoZSBzdGF0dXMgb2YgYSAjREJ1c1dhdGNoLgorICovCit0eXBlZGVmIGVudW0KK3sKKyAgREJVU19XQVRDSF9SRUFEQUJMRSA9IDEgPDwgMCwgLyoqPCBBcyBpbiBQT0xMSU4gKi8KKyAgREJVU19XQVRDSF9XUklUQUJMRSA9IDEgPDwgMSwgLyoqPCBBcyBpbiBQT0xMT1VUICovCisgIERCVVNfV0FUQ0hfRVJST1IgICAgPSAxIDw8IDIsIC8qKjwgQXMgaW4gUE9MTEVSUiAoY2FuJ3Qgd2F0Y2ggZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgdGhpcywgYnV0IGNhbiBiZSBwcmVzZW50IGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgY3VycmVudCBzdGF0ZSBwYXNzZWQgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBkYnVzX3dhdGNoX2hhbmRsZSgpKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIERCVVNfV0FUQ0hfSEFOR1VQICAgPSAxIDw8IDMgIC8qKjwgQXMgaW4gUE9MTEhVUCAoY2FuJ3Qgd2F0Y2ggZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgaXQsIGJ1dCBjYW4gYmUgcHJlc2VudCBpbiBjdXJyZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgc3RhdGUgcGFzc2VkIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgZGJ1c193YXRjaF9oYW5kbGUoKSkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBJbnRlcm5hbCB0byBsaWJkYnVzLCB0aGVyZSBpcyBhbHNvIF9EQlVTX1dBVENIX05WQUwgaW4gZGJ1cy13YXRjaC5oICovCit9IERCdXNXYXRjaEZsYWdzOworCisvKioKKyAqIEluZGljYXRlcyB0aGUgc3RhdHVzIG9mIGluY29taW5nIGRhdGEgb24gYSAjREJ1c0Nvbm5lY3Rpb24uIFRoaXMgZGV0ZXJtaW5lcyB3aGV0aGVyCisgKiBkYnVzX2Nvbm5lY3Rpb25fZGlzcGF0Y2goKSBuZWVkcyB0byBiZSBjYWxsZWQuCisgKi8KK3R5cGVkZWYgZW51bQoreworICBEQlVTX0RJU1BBVENIX0RBVEFfUkVNQUlOUywgIC8qKjwgVGhlcmUgaXMgbW9yZSBkYXRhIHRvIHBvdGVudGlhbGx5IGNvbnZlcnQgdG8gbWVzc2FnZXMuICovCisgIERCVVNfRElTUEFUQ0hfQ09NUExFVEUsICAgICAgLyoqPCBBbGwgY3VycmVudGx5IGF2YWlsYWJsZSBkYXRhIGhhcyBiZWVuIHByb2Nlc3NlZC4gKi8KKyAgREJVU19ESVNQQVRDSF9ORUVEX01FTU9SWSAgICAvKio8IE1vcmUgbWVtb3J5IGlzIG5lZWRlZCB0byBjb250aW51ZS4gKi8KK30gREJ1c0Rpc3BhdGNoU3RhdHVzOworCisvKiogQ2FsbGVkIHdoZW4gbGliZGJ1cyBuZWVkcyBhIG5ldyB3YXRjaCB0byBiZSBtb25pdG9yZWQgYnkgdGhlIG1haW4KKyAqIGxvb3AuIFJldHVybnMgI0ZBTFNFIGlmIGl0IGxhY2tzIGVub3VnaCBtZW1vcnkgdG8gYWRkIHRoZQorICogd2F0Y2guIFNldCBieSBkYnVzX2Nvbm5lY3Rpb25fc2V0X3dhdGNoX2Z1bmN0aW9ucygpIG9yCisgKiBkYnVzX3NlcnZlcl9zZXRfd2F0Y2hfZnVuY3Rpb25zKCkuCisgKi8KK3R5cGVkZWYgZGJ1c19ib29sX3QgKCogREJ1c0FkZFdhdGNoRnVuY3Rpb24pICAgICAgIChEQnVzV2F0Y2ggICAgICAqd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgKmRhdGEpOworLyoqIENhbGxlZCB3aGVuIGRidXNfd2F0Y2hfZ2V0X2VuYWJsZWQoKSBtYXkgcmV0dXJuIGEgZGlmZmVyZW50IHZhbHVlCisgKiAgdGhhbiBpdCBkaWQgYmVmb3JlLiAgU2V0IGJ5IGRidXNfY29ubmVjdGlvbl9zZXRfd2F0Y2hfZnVuY3Rpb25zKCkKKyAqICBvciBkYnVzX3NlcnZlcl9zZXRfd2F0Y2hfZnVuY3Rpb25zKCkuCisgKi8KK3R5cGVkZWYgdm9pZCAgICAgICAgKCogREJ1c1dhdGNoVG9nZ2xlZEZ1bmN0aW9uKSAgIChEQnVzV2F0Y2ggICAgICAqd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgKmRhdGEpOworLyoqIENhbGxlZCB3aGVuIGxpYmRidXMgbm8gbG9uZ2VyIG5lZWRzIGEgd2F0Y2ggdG8gYmUgbW9uaXRvcmVkIGJ5IHRoZQorICogbWFpbiBsb29wLiBTZXQgYnkgZGJ1c19jb25uZWN0aW9uX3NldF93YXRjaF9mdW5jdGlvbnMoKSBvcgorICogZGJ1c19zZXJ2ZXJfc2V0X3dhdGNoX2Z1bmN0aW9ucygpLgorICovCit0eXBlZGVmIHZvaWQgICAgICAgICgqIERCdXNSZW1vdmVXYXRjaEZ1bmN0aW9uKSAgICAoREJ1c1dhdGNoICAgICAgKndhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICpkYXRhKTsKKy8qKiBDYWxsZWQgd2hlbiBsaWJkYnVzIG5lZWRzIGEgbmV3IHRpbWVvdXQgdG8gYmUgbW9uaXRvcmVkIGJ5IHRoZSBtYWluCisgKiBsb29wLiBSZXR1cm5zICNGQUxTRSBpZiBpdCBsYWNrcyBlbm91Z2ggbWVtb3J5IHRvIGFkZCB0aGUKKyAqIHdhdGNoLiBTZXQgYnkgZGJ1c19jb25uZWN0aW9uX3NldF90aW1lb3V0X2Z1bmN0aW9ucygpIG9yCisgKiBkYnVzX3NlcnZlcl9zZXRfdGltZW91dF9mdW5jdGlvbnMoKS4KKyAqLwordHlwZWRlZiBkYnVzX2Jvb2xfdCAoKiBEQnVzQWRkVGltZW91dEZ1bmN0aW9uKSAgICAgKERCdXNUaW1lb3V0ICAgICp0aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICpkYXRhKTsKKy8qKiBDYWxsZWQgd2hlbiBkYnVzX3RpbWVvdXRfZ2V0X2VuYWJsZWQoKSBtYXkgcmV0dXJuIGEgZGlmZmVyZW50CisgKiB2YWx1ZSB0aGFuIGl0IGRpZCBiZWZvcmUuCisgKiBTZXQgYnkgZGJ1c19jb25uZWN0aW9uX3NldF90aW1lb3V0X2Z1bmN0aW9ucygpIG9yCisgKiBkYnVzX3NlcnZlcl9zZXRfdGltZW91dF9mdW5jdGlvbnMoKS4KKyAqLwordHlwZWRlZiB2b2lkICAgICAgICAoKiBEQnVzVGltZW91dFRvZ2dsZWRGdW5jdGlvbikgKERCdXNUaW1lb3V0ICAgICp0aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICpkYXRhKTsKKy8qKiBDYWxsZWQgd2hlbiBsaWJkYnVzIG5vIGxvbmdlciBuZWVkcyBhIHRpbWVvdXQgdG8gYmUgbW9uaXRvcmVkIGJ5IHRoZQorICogbWFpbiBsb29wLiBTZXQgYnkgZGJ1c19jb25uZWN0aW9uX3NldF90aW1lb3V0X2Z1bmN0aW9ucygpIG9yCisgKiBkYnVzX3NlcnZlcl9zZXRfdGltZW91dF9mdW5jdGlvbnMoKS4KKyAqLwordHlwZWRlZiB2b2lkICAgICAgICAoKiBEQnVzUmVtb3ZlVGltZW91dEZ1bmN0aW9uKSAgKERCdXNUaW1lb3V0ICAgICp0aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICpkYXRhKTsKKy8qKiBDYWxsZWQgd2hlbiB0aGUgcmV0dXJuIHZhbHVlIG9mIGRidXNfY29ubmVjdGlvbl9nZXRfZGlzcGF0Y2hfc3RhdHVzKCkKKyAqIG1heSBoYXZlIGNoYW5nZWQuIFNldCB3aXRoIGRidXNfY29ubmVjdGlvbl9zZXRfZGlzcGF0Y2hfc3RhdHVzX2Z1bmN0aW9uKCkuCisgKi8KK3R5cGVkZWYgdm9pZCAgICAgICAgKCogREJ1c0Rpc3BhdGNoU3RhdHVzRnVuY3Rpb24pIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRGlzcGF0Y2hTdGF0dXMgbmV3X3N0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAqZGF0YSk7CisvKioKKyAqIENhbGxlZCB3aGVuIHRoZSBtYWluIGxvb3AncyB0aHJlYWQgc2hvdWxkIGJlIG5vdGlmaWVkIHRoYXQgdGhlcmUncyBub3cgd29yaworICogdG8gZG8uIFNldCB3aXRoIGRidXNfY29ubmVjdGlvbl9zZXRfd2FrZXVwX21haW5fZnVuY3Rpb24oKS4KKyAqLwordHlwZWRlZiB2b2lkICAgICAgICAoKiBEQnVzV2FrZXVwTWFpbkZ1bmN0aW9uKSAgICAgKHZvaWQgICAgICAgICAgICpkYXRhKTsKKworLyoqCisgKiBDYWxsZWQgZHVyaW5nIGF1dGhlbnRpY2F0aW9uIHRvIGNoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIFVOSVggdXNlcgorICogSUQgaXMgYWxsb3dlZCB0byBjb25uZWN0LCBpZiB0aGUgY2xpZW50IHRyaWVkIHRvIGF1dGggYXMgYSBVTklYCisgKiB1c2VyIElELiBOb3JtYWxseSBvbiBXaW5kb3dzIHRoaXMgd291bGQgbmV2ZXIgaGFwcGVuLiBTZXQgd2l0aAorICogZGJ1c19jb25uZWN0aW9uX3NldF91bml4X3VzZXJfZnVuY3Rpb24oKS4KKyAqLyAKK3R5cGVkZWYgZGJ1c19ib29sX3QgKCogREJ1c0FsbG93VW5peFVzZXJGdW5jdGlvbikgIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICpkYXRhKTsKKworLyoqCisgKiBDYWxsZWQgZHVyaW5nIGF1dGhlbnRpY2F0aW9uIHRvIGNoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIFdpbmRvd3MgdXNlcgorICogSUQgaXMgYWxsb3dlZCB0byBjb25uZWN0LCBpZiB0aGUgY2xpZW50IHRyaWVkIHRvIGF1dGggYXMgYSBXaW5kb3dzCisgKiB1c2VyIElELiBOb3JtYWxseSBvbiBVTklYIHRoaXMgd291bGQgbmV2ZXIgaGFwcGVuLiBTZXQgd2l0aAorICogZGJ1c19jb25uZWN0aW9uX3NldF93aW5kb3dzX3VzZXJfZnVuY3Rpb24oKS4KKyAqLyAKK3R5cGVkZWYgZGJ1c19ib29sX3QgKCogREJ1c0FsbG93V2luZG93c1VzZXJGdW5jdGlvbikgIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqdXNlcl9zaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgKmRhdGEpOworCisKKy8qKgorICogQ2FsbGVkIHdoZW4gYSBwZW5kaW5nIGNhbGwgbm93IGhhcyBhIHJlcGx5IGF2YWlsYWJsZS4gU2V0IHdpdGgKKyAqIGRidXNfcGVuZGluZ19jYWxsX3NldF9ub3RpZnkoKS4KKyAqLwordHlwZWRlZiB2b2lkICgqIERCdXNQZW5kaW5nQ2FsbE5vdGlmeUZ1bmN0aW9uKSAoREJ1c1BlbmRpbmdDYWxsICpwZW5kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICp1c2VyX2RhdGEpOworCisvKioKKyAqIENhbGxlZCB3aGVuIGEgbWVzc2FnZSBuZWVkcyB0byBiZSBoYW5kbGVkLiBUaGUgcmVzdWx0IGluZGljYXRlcyB3aGV0aGVyIG9yCisgKiBub3QgbW9yZSBoYW5kbGVycyBzaG91bGQgYmUgcnVuLiBTZXQgd2l0aCBkYnVzX2Nvbm5lY3Rpb25fYWRkX2ZpbHRlcigpLgorICovCit0eXBlZGVmIERCdXNIYW5kbGVyUmVzdWx0ICgqIERCdXNIYW5kbGVNZXNzYWdlRnVuY3Rpb24pIChEQnVzQ29ubmVjdGlvbiAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgKnVzZXJfZGF0YSk7CitEQlVTX0VYUE9SVAorREJ1c0Nvbm5lY3Rpb24qICAgIGRidXNfY29ubmVjdGlvbl9vcGVuICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICAgICAgICAgICAgICAgICAqYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgICAgICAgICAgKmVycm9yKTsKK0RCVVNfRVhQT1JUCitEQnVzQ29ubmVjdGlvbiogICAgZGJ1c19jb25uZWN0aW9uX29wZW5fcHJpdmF0ZSAgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgICAgICAgICAgICAgICAgICphZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAgICAgICAgICAqZXJyb3IpOworREJVU19FWFBPUlQKK0RCdXNDb25uZWN0aW9uKiAgICBkYnVzX2Nvbm5lY3Rpb25fcmVmICAgICAgICAgICAgICAgICAgICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgKmNvbm5lY3Rpb24pOworREJVU19FWFBPUlQKK3ZvaWQgICAgICAgICAgICAgICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgICAgICAgICAgICAgICAgICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgKmNvbm5lY3Rpb24pOworREJVU19FWFBPUlQKK3ZvaWQgICAgICAgICAgICAgICBkYnVzX2Nvbm5lY3Rpb25fY2xvc2UgICAgICAgICAgICAgICAgICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgKmNvbm5lY3Rpb24pOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90ICAgICAgICBkYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Nvbm5lY3RlZCAgICAgICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgKmNvbm5lY3Rpb24pOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90ICAgICAgICBkYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2F1dGhlbnRpY2F0ZWQgICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgKmNvbm5lY3Rpb24pOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90ICAgICAgICBkYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Fub255bW91cyAgICAgICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgKmNvbm5lY3Rpb24pOworREJVU19FWFBPUlQKK2NoYXIqICAgICAgICAgICAgICBkYnVzX2Nvbm5lY3Rpb25fZ2V0X3NlcnZlcl9pZCAgICAgICAgICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgKmNvbm5lY3Rpb24pOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90ICAgICAgICBkYnVzX2Nvbm5lY3Rpb25fY2FuX3NlbmRfdHlwZSAgICAgICAgICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlKTsKKworREJVU19FWFBPUlQKK3ZvaWQgICAgICAgICAgICAgICBkYnVzX2Nvbm5lY3Rpb25fc2V0X2V4aXRfb25fZGlzY29ubmVjdCAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgICAgICAgICAgICBleGl0X29uX2Rpc2Nvbm5lY3QpOworREJVU19FWFBPUlQKK3ZvaWQgICAgICAgICAgICAgICBkYnVzX2Nvbm5lY3Rpb25fZmx1c2ggICAgICAgICAgICAgICAgICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgKmNvbm5lY3Rpb24pOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90ICAgICAgICBkYnVzX2Nvbm5lY3Rpb25fcmVhZF93cml0ZV9kaXNwYXRjaCAgICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0X21pbGxpc2Vjb25kcyk7CitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgICAgICAgIGRidXNfY29ubmVjdGlvbl9yZWFkX3dyaXRlICAgICAgICAgICAgICAgICAgIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXRfbWlsbGlzZWNvbmRzKTsKK0RCVVNfRVhQT1JUCitEQnVzTWVzc2FnZSogICAgICAgZGJ1c19jb25uZWN0aW9uX2JvcnJvd19tZXNzYWdlICAgICAgICAgICAgICAgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICpjb25uZWN0aW9uKTsKK0RCVVNfRVhQT1JUCit2b2lkICAgICAgICAgICAgICAgZGJ1c19jb25uZWN0aW9uX3JldHVybl9tZXNzYWdlICAgICAgICAgICAgICAgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgICAgICAgICAgICAqbWVzc2FnZSk7CitEQlVTX0VYUE9SVAordm9pZCAgICAgICAgICAgICAgIGRidXNfY29ubmVjdGlvbl9zdGVhbF9ib3Jyb3dlZF9tZXNzYWdlICAgICAgIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICAgICAgICAgICAgKm1lc3NhZ2UpOworREJVU19FWFBPUlQKK0RCdXNNZXNzYWdlKiAgICAgICBkYnVzX2Nvbm5lY3Rpb25fcG9wX21lc3NhZ2UgICAgICAgICAgICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgKmNvbm5lY3Rpb24pOworREJVU19FWFBPUlQKK0RCdXNEaXNwYXRjaFN0YXR1cyBkYnVzX2Nvbm5lY3Rpb25fZ2V0X2Rpc3BhdGNoX3N0YXR1cyAgICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgKmNvbm5lY3Rpb24pOworREJVU19FWFBPUlQKK0RCdXNEaXNwYXRjaFN0YXR1cyBkYnVzX2Nvbm5lY3Rpb25fZGlzcGF0Y2ggICAgICAgICAgICAgICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgKmNvbm5lY3Rpb24pOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90ICAgICAgICBkYnVzX2Nvbm5lY3Rpb25faGFzX21lc3NhZ2VzX3RvX3NlbmQgICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90ICAgICAgICBkYnVzX2Nvbm5lY3Rpb25fc2VuZCAgICAgICAgICAgICAgICAgICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICAgICAgICAgICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90ICAgICAgICAgICAgICAqY2xpZW50X3NlcmlhbCk7CitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgICAgICAgIGRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHkgICAgICAgICAgICAgIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICAgICAgICAgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNQZW5kaW5nQ2FsbCAgICAgICAgICAgKipwZW5kaW5nX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXRfbWlsbGlzZWNvbmRzKTsKK0RCVVNfRVhQT1JUCitEQnVzTWVzc2FnZSAqICAgICAgZGJ1c19jb25uZWN0aW9uX3NlbmRfd2l0aF9yZXBseV9hbmRfYmxvY2sgICAgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgICAgICAgICAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXRfbWlsbGlzZWNvbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAgICAgICAgICAqZXJyb3IpOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90ICAgICAgICBkYnVzX2Nvbm5lY3Rpb25fc2V0X3dhdGNoX2Z1bmN0aW9ucyAgICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNBZGRXYXRjaEZ1bmN0aW9uICAgICAgICBhZGRfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNSZW1vdmVXYXRjaEZ1bmN0aW9uICAgICByZW1vdmVfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNXYXRjaFRvZ2dsZWRGdW5jdGlvbiAgICB0b2dnbGVkX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgICAgICAgICAgIGZyZWVfZGF0YV9mdW5jdGlvbik7CitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgICAgICAgIGRidXNfY29ubmVjdGlvbl9zZXRfdGltZW91dF9mdW5jdGlvbnMgICAgICAgIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0FkZFRpbWVvdXRGdW5jdGlvbiAgICAgIGFkZF9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1JlbW92ZVRpbWVvdXRGdW5jdGlvbiAgIHJlbW92ZV9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1RpbWVvdXRUb2dnbGVkRnVuY3Rpb24gIHRvZ2dsZWRfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRnJlZUZ1bmN0aW9uICAgICAgICAgICAgZnJlZV9kYXRhX2Z1bmN0aW9uKTsKK0RCVVNfRVhQT1JUCit2b2lkICAgICAgICAgICAgICAgZGJ1c19jb25uZWN0aW9uX3NldF93YWtldXBfbWFpbl9mdW5jdGlvbiAgICAgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzV2FrZXVwTWFpbkZ1bmN0aW9uICAgICAgd2FrZXVwX21haW5fZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRnJlZUZ1bmN0aW9uICAgICAgICAgICAgZnJlZV9kYXRhX2Z1bmN0aW9uKTsKK0RCVVNfRVhQT1JUCit2b2lkICAgICAgICAgICAgICAgZGJ1c19jb25uZWN0aW9uX3NldF9kaXNwYXRjaF9zdGF0dXNfZnVuY3Rpb24gKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRGlzcGF0Y2hTdGF0dXNGdW5jdGlvbiAgZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRnJlZUZ1bmN0aW9uICAgICAgICAgICAgZnJlZV9kYXRhX2Z1bmN0aW9uKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCAgICAgICAgZGJ1c19jb25uZWN0aW9uX2dldF91bml4X3VzZXIgICAgICAgICAgICAgICAgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAqdWlkKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCAgICAgICAgZGJ1c19jb25uZWN0aW9uX2dldF91bml4X3Byb2Nlc3NfaWQgICAgICAgICAgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAqcGlkKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCAgICAgICAgZGJ1c19jb25uZWN0aW9uX2dldF9hZHRfYXVkaXRfc2Vzc2lvbl9kYXRhICAgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICoqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19pbnQzMl90ICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSk7CitEQlVTX0VYUE9SVAordm9pZCAgICAgICAgICAgICAgIGRidXNfY29ubmVjdGlvbl9zZXRfdW5peF91c2VyX2Z1bmN0aW9uICAgICAgIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0FsbG93VW5peFVzZXJGdW5jdGlvbiAgIGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgICAgICAgICAgIGZyZWVfZGF0YV9mdW5jdGlvbik7CitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgICAgICAgIGRidXNfY29ubmVjdGlvbl9nZXRfd2luZG93c191c2VyICAgICAgICAgICAgIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAgICAgICAgICAgICAgICAqKndpbmRvd3Nfc2lkX3ApOyAKK0RCVVNfRVhQT1JUCit2b2lkICAgICAgICAgICAgICAgZGJ1c19jb25uZWN0aW9uX3NldF93aW5kb3dzX3VzZXJfZnVuY3Rpb24gICAgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQWxsb3dXaW5kb3dzVXNlckZ1bmN0aW9uIGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgICAgICAgICAgIGZyZWVfZGF0YV9mdW5jdGlvbik7CitEQlVTX0VYUE9SVAordm9pZCAgICAgICAgICAgICAgIGRidXNfY29ubmVjdGlvbl9zZXRfYWxsb3dfYW5vbnltb3VzICAgICAgICAgIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgICAgICAgICAgIHZhbHVlKTsKK0RCVVNfRVhQT1JUCit2b2lkICAgICAgICAgICAgICAgZGJ1c19jb25uZWN0aW9uX3NldF9yb3V0ZV9wZWVyX21lc3NhZ2VzICAgICAgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICAgICAgICAgICAgdmFsdWUpOworCisKKy8qIEZpbHRlcnMgKi8KKworREJVU19FWFBPUlQKK2RidXNfYm9vbF90IGRidXNfY29ubmVjdGlvbl9hZGRfZmlsdGVyICAgIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNIYW5kbGVNZXNzYWdlRnVuY3Rpb24gIGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgKnVzZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRnJlZUZ1bmN0aW9uICAgICAgICAgICBmcmVlX2RhdGFfZnVuY3Rpb24pOworREJVU19FWFBPUlQKK3ZvaWQgICAgICAgIGRidXNfY29ubmVjdGlvbl9yZW1vdmVfZmlsdGVyIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNIYW5kbGVNZXNzYWdlRnVuY3Rpb24gIGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgKnVzZXJfZGF0YSk7CisKKworLyogT3RoZXIgKi8KK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCBkYnVzX2Nvbm5lY3Rpb25fYWxsb2NhdGVfZGF0YV9zbG90IChkYnVzX2ludDMyX3QgICAgICpzbG90X3ApOworREJVU19FWFBPUlQKK3ZvaWQgICAgICAgIGRidXNfY29ubmVjdGlvbl9mcmVlX2RhdGFfc2xvdCAgICAgKGRidXNfaW50MzJfdCAgICAgKnNsb3RfcCk7CitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgZGJ1c19jb25uZWN0aW9uX3NldF9kYXRhICAgICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfaW50MzJfdCAgICAgIHNsb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgZnJlZV9kYXRhX2Z1bmMpOworREJVU19FWFBPUlQKK3ZvaWQqICAgICAgIGRidXNfY29ubmVjdGlvbl9nZXRfZGF0YSAgICAgICAgICAgKERCdXNDb25uZWN0aW9uICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2ludDMyX3QgICAgICBzbG90KTsKKworREJVU19FWFBPUlQKK3ZvaWQgICAgICAgIGRidXNfY29ubmVjdGlvbl9zZXRfY2hhbmdlX3NpZ3BpcGUgKGRidXNfYm9vbF90ICAgICAgIHdpbGxfbW9kaWZ5X3NpZ3BpcGUpOyAKKworREJVU19FWFBPUlQKK3ZvaWQgZGJ1c19jb25uZWN0aW9uX3NldF9tYXhfbWVzc2FnZV9zaXplICAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgICAgICAgICAgICBzaXplKTsKK0RCVVNfRVhQT1JUCitsb25nIGRidXNfY29ubmVjdGlvbl9nZXRfbWF4X21lc3NhZ2Vfc2l6ZSAgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKTsKK0RCVVNfRVhQT1JUCit2b2lkIGRidXNfY29ubmVjdGlvbl9zZXRfbWF4X3JlY2VpdmVkX3NpemUgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nICAgICAgICAgICAgc2l6ZSk7CitEQlVTX0VYUE9SVAorbG9uZyBkYnVzX2Nvbm5lY3Rpb25fZ2V0X21heF9yZWNlaXZlZF9zaXplIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbik7CisKK0RCVVNfRVhQT1JUCit2b2lkIGRidXNfY29ubmVjdGlvbl9zZXRfbWF4X21lc3NhZ2VfdW5peF9mZHMgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nICAgICAgICAgICAgbik7CitEQlVTX0VYUE9SVAorbG9uZyBkYnVzX2Nvbm5lY3Rpb25fZ2V0X21heF9tZXNzYWdlX3VuaXhfZmRzIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbik7CitEQlVTX0VYUE9SVAordm9pZCBkYnVzX2Nvbm5lY3Rpb25fc2V0X21heF9yZWNlaXZlZF91bml4X2ZkcyhEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyAgICAgICAgICAgIG4pOworREJVU19FWFBPUlQKK2xvbmcgZGJ1c19jb25uZWN0aW9uX2dldF9tYXhfcmVjZWl2ZWRfdW5peF9mZHMoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOworCitEQlVTX0VYUE9SVAorbG9uZyBkYnVzX2Nvbm5lY3Rpb25fZ2V0X291dGdvaW5nX3NpemUgICAgIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbik7CitEQlVTX0VYUE9SVAorbG9uZyBkYnVzX2Nvbm5lY3Rpb25fZ2V0X291dGdvaW5nX3VuaXhfZmRzIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbik7CisKK0RCVVNfRVhQT1JUCitEQnVzUHJlYWxsb2NhdGVkU2VuZCogZGJ1c19jb25uZWN0aW9uX3ByZWFsbG9jYXRlX3NlbmQgICAgICAgKERCdXNDb25uZWN0aW9uICAgICAgICpjb25uZWN0aW9uKTsKK0RCVVNfRVhQT1JUCit2b2lkICAgICAgICAgICAgICAgICAgZGJ1c19jb25uZWN0aW9uX2ZyZWVfcHJlYWxsb2NhdGVkX3NlbmQgKERCdXNDb25uZWN0aW9uICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzUHJlYWxsb2NhdGVkU2VuZCAqcHJlYWxsb2NhdGVkKTsKK0RCVVNfRVhQT1JUCit2b2lkICAgICAgICAgICAgICAgICAgZGJ1c19jb25uZWN0aW9uX3NlbmRfcHJlYWxsb2NhdGVkICAgICAgKERCdXNDb25uZWN0aW9uICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzUHJlYWxsb2NhdGVkU2VuZCAqcHJlYWxsb2NhdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgICAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgICAgICAgKmNsaWVudF9zZXJpYWwpOworCisKKy8qIE9iamVjdCB0cmVlIGZ1bmN0aW9uYWxpdHkgKi8KKworLyoqCisgKiBDYWxsZWQgd2hlbiBhICNEQnVzT2JqZWN0UGF0aFZUYWJsZSBpcyB1bnJlZ2lzdGVyZWQgKG9yIGl0cyBjb25uZWN0aW9uIGlzIGZyZWVkKS4KKyAqIEZvdW5kIGluICNEQnVzT2JqZWN0UGF0aFZUYWJsZS4KKyAqLwordHlwZWRlZiB2b2lkICAgICAgICAgICAgICAoKiBEQnVzT2JqZWN0UGF0aFVucmVnaXN0ZXJGdW5jdGlvbikgKERCdXNDb25uZWN0aW9uICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgKnVzZXJfZGF0YSk7CisvKioKKyAqIENhbGxlZCB3aGVuIGEgbWVzc2FnZSBpcyBzZW50IHRvIGEgcmVnaXN0ZXJlZCBvYmplY3QgcGF0aC4gRm91bmQgaW4KKyAqICNEQnVzT2JqZWN0UGF0aFZUYWJsZSB3aGljaCBpcyByZWdpc3RlcmVkIHdpdGggZGJ1c19jb25uZWN0aW9uX3JlZ2lzdGVyX29iamVjdF9wYXRoKCkKKyAqIG9yIGRidXNfY29ubmVjdGlvbl9yZWdpc3Rlcl9mYWxsYmFjaygpLgorICovCit0eXBlZGVmIERCdXNIYW5kbGVyUmVzdWx0ICgqIERCdXNPYmplY3RQYXRoTWVzc2FnZUZ1bmN0aW9uKSAgICAoREJ1c0Nvbm5lY3Rpb24gICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgKnVzZXJfZGF0YSk7CisKKy8qKgorICogVmlydHVhbCB0YWJsZSB0aGF0IG11c3QgYmUgaW1wbGVtZW50ZWQgdG8gaGFuZGxlIGEgcG9ydGlvbiBvZiB0aGUKKyAqIG9iamVjdCBwYXRoIGhpZXJhcmNoeS4gQXR0YWNoIHRoZSB2dGFibGUgdG8gYSBwYXJ0aWN1bGFyIHBhdGggdXNpbmcKKyAqIGRidXNfY29ubmVjdGlvbl9yZWdpc3Rlcl9vYmplY3RfcGF0aCgpIG9yCisgKiBkYnVzX2Nvbm5lY3Rpb25fcmVnaXN0ZXJfZmFsbGJhY2soKS4KKyAqLworc3RydWN0IERCdXNPYmplY3RQYXRoVlRhYmxlCit7CisgIERCdXNPYmplY3RQYXRoVW5yZWdpc3RlckZ1bmN0aW9uICAgdW5yZWdpc3Rlcl9mdW5jdGlvbjsgLyoqPCBGdW5jdGlvbiB0byB1bnJlZ2lzdGVyIHRoaXMgaGFuZGxlciAqLworICBEQnVzT2JqZWN0UGF0aE1lc3NhZ2VGdW5jdGlvbiAgICAgIG1lc3NhZ2VfZnVuY3Rpb247IC8qKjwgRnVuY3Rpb24gdG8gaGFuZGxlIG1lc3NhZ2VzICovCisgIAorICB2b2lkICgqIGRidXNfaW50ZXJuYWxfcGFkMSkgKHZvaWQgKik7IC8qKjwgUmVzZXJ2ZWQgZm9yIGZ1dHVyZSBleHBhbnNpb24gKi8KKyAgdm9pZCAoKiBkYnVzX2ludGVybmFsX3BhZDIpICh2b2lkICopOyAvKio8IFJlc2VydmVkIGZvciBmdXR1cmUgZXhwYW5zaW9uICovCisgIHZvaWQgKCogZGJ1c19pbnRlcm5hbF9wYWQzKSAodm9pZCAqKTsgLyoqPCBSZXNlcnZlZCBmb3IgZnV0dXJlIGV4cGFuc2lvbiAqLworICB2b2lkICgqIGRidXNfaW50ZXJuYWxfcGFkNCkgKHZvaWQgKik7IC8qKjwgUmVzZXJ2ZWQgZm9yIGZ1dHVyZSBleHBhbnNpb24gKi8KK307CisKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCBkYnVzX2Nvbm5lY3Rpb25fdHJ5X3JlZ2lzdGVyX29iamVjdF9wYXRoIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAgICAgICAgICAgKnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzT2JqZWN0UGF0aFZUYWJsZSAgKnZ0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAqdXNlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgICAgICAgICAgICplcnJvcik7CisKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCBkYnVzX2Nvbm5lY3Rpb25fcmVnaXN0ZXJfb2JqZWN0X3BhdGggICAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICAgICAgICAgICAqcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzT2JqZWN0UGF0aFZUYWJsZSAgKnZ0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgKnVzZXJfZGF0YSk7CisKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCBkYnVzX2Nvbm5lY3Rpb25fdHJ5X3JlZ2lzdGVyX2ZhbGxiYWNrIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAgICAgICAgICAgKnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzT2JqZWN0UGF0aFZUYWJsZSAgKnZ0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAqdXNlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgICAgICAgICAgICplcnJvcik7CisKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCBkYnVzX2Nvbm5lY3Rpb25fcmVnaXN0ZXJfZmFsbGJhY2sgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICAgICAgICAgICAqcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzT2JqZWN0UGF0aFZUYWJsZSAgKnZ0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgKnVzZXJfZGF0YSk7CitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgZGJ1c19jb25uZWN0aW9uX3VucmVnaXN0ZXJfb2JqZWN0X3BhdGggKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAgICAgICAgICAgKnBhdGgpOworCitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgZGJ1c19jb25uZWN0aW9uX2dldF9vYmplY3RfcGF0aF9kYXRhICAgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAgICAgICAgICAgKnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgKipkYXRhX3ApOworCitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgZGJ1c19jb25uZWN0aW9uX2xpc3RfcmVnaXN0ZXJlZCAgICAgICAgKERCdXNDb25uZWN0aW9uICAgICAgICAgICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAgICAgICAgICAgKnBhcmVudF9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICAgICAgICAgICAgICAgKioqY2hpbGRfZW50cmllcyk7CisKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCBkYnVzX2Nvbm5lY3Rpb25fZ2V0X3VuaXhfZmQgICAgICAgICAgICAoREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAqZmQpOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90IGRidXNfY29ubmVjdGlvbl9nZXRfc29ja2V0ICAgICAgICAgICAgIChEQnVzQ29ubmVjdGlvbiAgICAgICAgICAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICpmZCk7CisKKy8qKgorICogQ2xlYXIgYSB2YXJpYWJsZSBvciBzdHJ1Y3QgbWVtYmVyIHRoYXQgY29udGFpbnMgYSAjREJ1c0Nvbm5lY3Rpb24uCisgKiBJZiBpdCBkb2VzIG5vdCBjb250YWluICNOVUxMLCB0aGUgY29ubmVjdGlvbiB0aGF0IHdhcyBwcmV2aW91c2x5CisgKiB0aGVyZSBpcyB1bnJlZmVyZW5jZWQgd2l0aCBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYoKS4KKyAqCisgKiBGb3IgZXhhbXBsZSwgdGhpcyBmdW5jdGlvbiBhbmQgdGhlIHNpbWlsYXIgZnVuY3Rpb25zIGZvcgorICogb3RoZXIgcmVmZXJlbmNlLWNvdW50ZWQgdHlwZXMgY2FuIGJlIHVzZWQgaW4gY29kZSBsaWtlIHRoaXM6CisgKgorICogQGNvZGUKKyAqIERCdXNDb25uZWN0aW9uICpjb25uID0gTlVMTDsKKyAqIHN0cnVjdCB7IC4uLjsgREJ1c01lc3NhZ2UgKm07IC4uLiB9ICpsYXJnZXJfc3RydWN0dXJlID0gLi4uOworICoKKyAqIC4uLiBjb2RlIHRoYXQgbWlnaHQgc2V0IGNvbm4gb3IgbSB0byBiZSBub24tTlVMTCAuLi4KKyAqCisgKiBkYnVzX2NsZWFyX2Nvbm5lY3Rpb24gKCZjb25uKTsKKyAqIGRidXNfY2xlYXJfbWVzc2FnZSAoJmxhcmdlcl9zdHJ1Y3R1cmUtPm0pOworICogQGVuZGNvZGUKKyAqCisgKiBAcGFyYW0gcG9pbnRlcl90b19jb25uZWN0aW9uIEEgcG9pbnRlciB0byBhIHZhcmlhYmxlIG9yIHN0cnVjdCBtZW1iZXIuCisgKiBwb2ludGVyX3RvX2Nvbm5lY3Rpb24gbXVzdCBub3QgYmUgI05VTEwsIGJ1dCAqcG9pbnRlcl90b19jb25uZWN0aW9uCisgKiBtYXkgYmUgI05VTEwuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorZGJ1c19jbGVhcl9jb25uZWN0aW9uIChEQnVzQ29ubmVjdGlvbiAqKnBvaW50ZXJfdG9fY29ubmVjdGlvbikKK3sKKyAgX2RidXNfY2xlYXJfcG9pbnRlcl9pbXBsIChEQnVzQ29ubmVjdGlvbiwgcG9pbnRlcl90b19jb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfY29ubmVjdGlvbl91bnJlZik7Cit9CisKKy8qKiBAfSAqLworCisKKy8qKgorICogQGFkZHRvZ3JvdXAgREJ1c1dhdGNoCisgKiBAeworICovCisKKyNpZm5kZWYgREJVU19ESVNBQkxFX0RFUFJFQ0FURUQKK0RCVVNfRVhQT1JUCitEQlVTX0RFUFJFQ0FURUQgaW50IGRidXNfd2F0Y2hfZ2V0X2ZkICAgICAgKERCdXNXYXRjaCAgICAgICAgKndhdGNoKTsKKyNlbmRpZgorCitEQlVTX0VYUE9SVAoraW50ICAgICAgICAgIGRidXNfd2F0Y2hfZ2V0X3VuaXhfZmQgKERCdXNXYXRjaCAgICAgICAgKndhdGNoKTsKK0RCVVNfRVhQT1JUCitpbnQgICAgICAgICAgZGJ1c193YXRjaF9nZXRfc29ja2V0ICAoREJ1c1dhdGNoICAgICAgICAqd2F0Y2gpOworREJVU19FWFBPUlQKK3Vuc2lnbmVkIGludCBkYnVzX3dhdGNoX2dldF9mbGFncyAgIChEQnVzV2F0Y2ggICAgICAgICp3YXRjaCk7CitEQlVTX0VYUE9SVAordm9pZCogICAgICAgIGRidXNfd2F0Y2hfZ2V0X2RhdGEgICAgKERCdXNXYXRjaCAgICAgICAgKndhdGNoKTsKK0RCVVNfRVhQT1JUCit2b2lkICAgICAgICAgZGJ1c193YXRjaF9zZXRfZGF0YSAgICAoREJ1c1dhdGNoICAgICAgICAqd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRnJlZUZ1bmN0aW9uICBmcmVlX2RhdGFfZnVuY3Rpb24pOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90ICBkYnVzX3dhdGNoX2hhbmRsZSAgICAgIChEQnVzV2F0Y2ggICAgICAgICp3YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgICAgICBmbGFncyk7CitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgIGRidXNfd2F0Y2hfZ2V0X2VuYWJsZWQgKERCdXNXYXRjaCAgICAgICAgKndhdGNoKTsKKworLyoqIEB9ICovCisKKy8qKgorICogQGFkZHRvZ3JvdXAgREJ1c1RpbWVvdXQKKyAqIEB7CisgKi8KKworREJVU19FWFBPUlQKK2ludCAgICAgICAgIGRidXNfdGltZW91dF9nZXRfaW50ZXJ2YWwgKERCdXNUaW1lb3V0ICAgICAgKnRpbWVvdXQpOworREJVU19FWFBPUlQKK3ZvaWQqICAgICAgIGRidXNfdGltZW91dF9nZXRfZGF0YSAgICAgKERCdXNUaW1lb3V0ICAgICAgKnRpbWVvdXQpOworREJVU19FWFBPUlQKK3ZvaWQgICAgICAgIGRidXNfdGltZW91dF9zZXRfZGF0YSAgICAgKERCdXNUaW1lb3V0ICAgICAgKnRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgZnJlZV9kYXRhX2Z1bmN0aW9uKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCBkYnVzX3RpbWVvdXRfaGFuZGxlICAgICAgIChEQnVzVGltZW91dCAgICAgICp0aW1lb3V0KTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCBkYnVzX3RpbWVvdXRfZ2V0X2VuYWJsZWQgIChEQnVzVGltZW91dCAgICAgICp0aW1lb3V0KTsKKworLyoqIEB9ICovCisKK0RCVVNfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBEQlVTX0NPTk5FQ1RJT05fSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLWNyZWRlbnRpYWxzLXV0aWwuYyBiL2RidXMvZGJ1cy1jcmVkZW50aWFscy11dGlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRkNzIwMQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1jcmVkZW50aWFscy11dGlsLmMKQEAgLTAsMCArMSwyMDUgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1jcmVkZW50aWFscy11dGlsLmMgV291bGQgYmUgaW4gZGJ1cy1jcmVkZW50aWFscy5jLCBidXQgb25seSB1c2VkIGZvciB0ZXN0cy9idXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLWludGVybmFscy5oIgorI2luY2x1ZGUgImRidXMtdGVzdC5oIgorI2luY2x1ZGUgImRidXMtY3JlZGVudGlhbHMuaCIKKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzQ3JlZGVudGlhbHMKKyAqIEB7CisgKi8KKworLyoqIEB9ICovCisKKyNpZmRlZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK3N0YXRpYyBEQnVzQ3JlZGVudGlhbHMqCittYWtlX2NyZWRlbnRpYWxzKGRidXNfdWlkX3QgIHVuaXhfdWlkLAorICAgICAgICAgICAgICAgICBkYnVzX3BpZF90ICBwaWQsCisgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKndpbmRvd3Nfc2lkKQoreworICBEQnVzQ3JlZGVudGlhbHMgKmNyZWRlbnRpYWxzOworCisgIGNyZWRlbnRpYWxzID0gX2RidXNfY3JlZGVudGlhbHNfbmV3ICgpOworCisgIGlmICh1bml4X3VpZCAhPSBEQlVTX1VJRF9VTlNFVCkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX2NyZWRlbnRpYWxzX2FkZF91bml4X3VpZCAoY3JlZGVudGlhbHMsIHVuaXhfdWlkKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX2NyZWRlbnRpYWxzX3VucmVmIChjcmVkZW50aWFscyk7CisgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgaWYgKHBpZCAhPSBEQlVTX1BJRF9VTlNFVCkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX2NyZWRlbnRpYWxzX2FkZF9waWQgKGNyZWRlbnRpYWxzLCBwaWQpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfY3JlZGVudGlhbHNfdW5yZWYgKGNyZWRlbnRpYWxzKTsKKyAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICBpZiAod2luZG93c19zaWQgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX2NyZWRlbnRpYWxzX2FkZF93aW5kb3dzX3NpZCAoY3JlZGVudGlhbHMsIHdpbmRvd3Nfc2lkKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX2NyZWRlbnRpYWxzX3VucmVmIChjcmVkZW50aWFscyk7CisgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgcmV0dXJuIGNyZWRlbnRpYWxzOworfQorCisjZGVmaW5lIFNBTVBMRV9TSUQgIndoYXRldmVyIGEgd2luZG93cyBzaWQgbG9va3MgbGlrZSIKKyNkZWZpbmUgT1RIRVJfU0FNUExFX1NJRCAid2hhdGV2ZXIgZWxzZSIKKworZGJ1c19ib29sX3QKK19kYnVzX2NyZWRlbnRpYWxzX3Rlc3QgKGNvbnN0IGNoYXIgKnRlc3RfZGF0YV9kaXIpCit7CisgIERCdXNDcmVkZW50aWFscyAqY3JlZHM7CisgIERCdXNDcmVkZW50aWFscyAqY3JlZHMyOworICAKKyAgaWYgKHRlc3RfZGF0YV9kaXIgPT0gTlVMTCkKKyAgICByZXR1cm4gVFJVRTsKKworICBjcmVkcyA9IG1ha2VfY3JlZGVudGlhbHMgKDEyLCA1MTEsIFNBTVBMRV9TSUQpOworICBpZiAoY3JlZHMgPT0gTlVMTCkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKKworICAvKiB0ZXN0IHJlZmNvdW50aW5nICovCisgIF9kYnVzX2NyZWRlbnRpYWxzX3JlZiAoY3JlZHMpOworICBfZGJ1c19jcmVkZW50aWFsc191bnJlZiAoY3JlZHMpOworICAKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19jcmVkZW50aWFsc19pbmNsdWRlIChjcmVkcywgREJVU19DUkVERU5USUFMX1VOSVhfVVNFUl9JRCkpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX2NyZWRlbnRpYWxzX2luY2x1ZGUgKGNyZWRzLCBEQlVTX0NSRURFTlRJQUxfVU5JWF9QUk9DRVNTX0lEKSk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfY3JlZGVudGlhbHNfaW5jbHVkZSAoY3JlZHMsIERCVVNfQ1JFREVOVElBTF9XSU5ET1dTX1NJRCkpOworCisgIF9kYnVzX2Fzc2VydCAoX2RidXNfY3JlZGVudGlhbHNfZ2V0X3VuaXhfdWlkIChjcmVkcykgPT0gMTIpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX2NyZWRlbnRpYWxzX2dldF9waWQgKGNyZWRzKSA9PSA1MTEpOworICBfZGJ1c19hc3NlcnQgKHN0cmNtcCAoX2RidXNfY3JlZGVudGlhbHNfZ2V0X3dpbmRvd3Nfc2lkIChjcmVkcyksIFNBTVBMRV9TSUQpID09IDApOworCisgIF9kYnVzX2Fzc2VydCAoIV9kYnVzX2NyZWRlbnRpYWxzX2FyZV9lbXB0eSAoY3JlZHMpKTsKKyAgX2RidXNfYXNzZXJ0ICghX2RidXNfY3JlZGVudGlhbHNfYXJlX2Fub255bW91cyAoY3JlZHMpKTsKKworICAvKiBUZXN0IGNvcHkgKi8KKyAgY3JlZHMyID0gX2RidXNfY3JlZGVudGlhbHNfY29weSAoY3JlZHMpOworICBpZiAoY3JlZHMyID09IE5VTEwpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19jcmVkZW50aWFsc19pbmNsdWRlIChjcmVkczIsIERCVVNfQ1JFREVOVElBTF9VTklYX1VTRVJfSUQpKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19jcmVkZW50aWFsc19pbmNsdWRlIChjcmVkczIsIERCVVNfQ1JFREVOVElBTF9VTklYX1BST0NFU1NfSUQpKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19jcmVkZW50aWFsc19pbmNsdWRlIChjcmVkczIsIERCVVNfQ1JFREVOVElBTF9XSU5ET1dTX1NJRCkpOworCisgIF9kYnVzX2Fzc2VydCAoX2RidXNfY3JlZGVudGlhbHNfZ2V0X3VuaXhfdWlkIChjcmVkczIpID09IDEyKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19jcmVkZW50aWFsc19nZXRfcGlkIChjcmVkczIpID09IDUxMSk7CisgIF9kYnVzX2Fzc2VydCAoc3RyY21wIChfZGJ1c19jcmVkZW50aWFsc19nZXRfd2luZG93c19zaWQgKGNyZWRzMiksIFNBTVBMRV9TSUQpID09IDApOyAgCisKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19jcmVkZW50aWFsc19hcmVfc3VwZXJzZXQgKGNyZWRzLCBjcmVkczIpKTsKKyAgCisgIF9kYnVzX2NyZWRlbnRpYWxzX3VucmVmIChjcmVkczIpOworICAKKyAgLyogU2FtZSB1c2VyIGlmIGJvdGggdW5peCBhbmQgd2luZG93cyBhcmUgdGhlIHNhbWUgKi8KKyAgY3JlZHMyID0gbWFrZV9jcmVkZW50aWFscyAoMTIsIERCVVNfUElEX1VOU0VULCBTQU1QTEVfU0lEKTsKKyAgaWYgKGNyZWRzMiA9PSBOVUxMKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm9vbSIpOworCisgIF9kYnVzX2Fzc2VydCAoX2RidXNfY3JlZGVudGlhbHNfc2FtZV91c2VyIChjcmVkcywgY3JlZHMyKSk7CisKKyAgX2RidXNfY3JlZGVudGlhbHNfdW5yZWYgKGNyZWRzMik7CisKKyAgLyogTm90IHRoZSBzYW1lIHVzZXIgaWYgV2luZG93cyBpcyBtaXNzaW5nICovCisgIGNyZWRzMiA9IG1ha2VfY3JlZGVudGlhbHMgKDEyLCBEQlVTX1BJRF9VTlNFVCwgTlVMTCk7CisgIGlmIChjcmVkczIgPT0gTlVMTCkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKKworICBfZGJ1c19hc3NlcnQgKCFfZGJ1c19jcmVkZW50aWFsc19zYW1lX3VzZXIgKGNyZWRzLCBjcmVkczIpKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19jcmVkZW50aWFsc19hcmVfc3VwZXJzZXQgKGNyZWRzLCBjcmVkczIpKTsKKyAgCisgIF9kYnVzX2NyZWRlbnRpYWxzX3VucmVmIChjcmVkczIpOworCisgIC8qIE5vdCB0aGUgc2FtZSB1c2VyIGlmIFdpbmRvd3MgaXMgZGlmZmVyZW50ICovCisgIGNyZWRzMiA9IG1ha2VfY3JlZGVudGlhbHMgKDEyLCBEQlVTX1BJRF9VTlNFVCwgT1RIRVJfU0FNUExFX1NJRCk7CisgIGlmIChjcmVkczIgPT0gTlVMTCkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKKworICBfZGJ1c19hc3NlcnQgKCFfZGJ1c19jcmVkZW50aWFsc19zYW1lX3VzZXIgKGNyZWRzLCBjcmVkczIpKTsKKyAgX2RidXNfYXNzZXJ0ICghX2RidXNfY3JlZGVudGlhbHNfYXJlX3N1cGVyc2V0IChjcmVkcywgY3JlZHMyKSk7CisgIAorICBfZGJ1c19jcmVkZW50aWFsc191bnJlZiAoY3JlZHMyKTsKKworICAvKiBOb3QgdGhlIHNhbWUgdXNlciBpZiBVbml4IGlzIG1pc3NpbmcgKi8KKyAgY3JlZHMyID0gbWFrZV9jcmVkZW50aWFscyAoREJVU19VSURfVU5TRVQsIERCVVNfUElEX1VOU0VULCBTQU1QTEVfU0lEKTsKKyAgaWYgKGNyZWRzMiA9PSBOVUxMKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm9vbSIpOworCisgIF9kYnVzX2Fzc2VydCAoIV9kYnVzX2NyZWRlbnRpYWxzX3NhbWVfdXNlciAoY3JlZHMsIGNyZWRzMikpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX2NyZWRlbnRpYWxzX2FyZV9zdXBlcnNldCAoY3JlZHMsIGNyZWRzMikpOworICAKKyAgX2RidXNfY3JlZGVudGlhbHNfdW5yZWYgKGNyZWRzMik7CisKKyAgLyogTm90IHRoZSBzYW1lIHVzZXIgaWYgVW5peCBpcyBkaWZmZXJlbnQgKi8KKyAgY3JlZHMyID0gbWFrZV9jcmVkZW50aWFscyAoMTUsIERCVVNfUElEX1VOU0VULCBTQU1QTEVfU0lEKTsKKyAgaWYgKGNyZWRzMiA9PSBOVUxMKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm9vbSIpOworCisgIF9kYnVzX2Fzc2VydCAoIV9kYnVzX2NyZWRlbnRpYWxzX3NhbWVfdXNlciAoY3JlZHMsIGNyZWRzMikpOworICBfZGJ1c19hc3NlcnQgKCFfZGJ1c19jcmVkZW50aWFsc19hcmVfc3VwZXJzZXQgKGNyZWRzLCBjcmVkczIpKTsKKyAgCisgIF9kYnVzX2NyZWRlbnRpYWxzX3VucmVmIChjcmVkczIpOworCisgIC8qIE5vdCB0aGUgc2FtZSB1c2VyIGlmIGJvdGggYXJlIG1pc3NpbmcgKi8KKyAgY3JlZHMyID0gbWFrZV9jcmVkZW50aWFscyAoREJVU19VSURfVU5TRVQsIERCVVNfUElEX1VOU0VULCBOVUxMKTsKKyAgaWYgKGNyZWRzMiA9PSBOVUxMKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm9vbSIpOworCisgIF9kYnVzX2Fzc2VydCAoIV9kYnVzX2NyZWRlbnRpYWxzX3NhbWVfdXNlciAoY3JlZHMsIGNyZWRzMikpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX2NyZWRlbnRpYWxzX2FyZV9zdXBlcnNldCAoY3JlZHMsIGNyZWRzMikpOworICAKKyAgX2RidXNfY3JlZGVudGlhbHNfdW5yZWYgKGNyZWRzMik7CisKKyAgLyogQ2xlYXJpbmcgY3JlZGVudGlhbHMgd29ya3MgKi8KKyAgX2RidXNfY3JlZGVudGlhbHNfY2xlYXIgKGNyZWRzKTsKKworICBfZGJ1c19hc3NlcnQgKCFfZGJ1c19jcmVkZW50aWFsc19pbmNsdWRlIChjcmVkcywgREJVU19DUkVERU5USUFMX1VOSVhfVVNFUl9JRCkpOworICBfZGJ1c19hc3NlcnQgKCFfZGJ1c19jcmVkZW50aWFsc19pbmNsdWRlIChjcmVkcywgREJVU19DUkVERU5USUFMX1VOSVhfUFJPQ0VTU19JRCkpOworICBfZGJ1c19hc3NlcnQgKCFfZGJ1c19jcmVkZW50aWFsc19pbmNsdWRlIChjcmVkcywgREJVU19DUkVERU5USUFMX1dJTkRPV1NfU0lEKSk7CisKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19jcmVkZW50aWFsc19nZXRfdW5peF91aWQgKGNyZWRzKSA9PSBEQlVTX1VJRF9VTlNFVCk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfY3JlZGVudGlhbHNfZ2V0X3BpZCAoY3JlZHMpID09IERCVVNfUElEX1VOU0VUKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19jcmVkZW50aWFsc19nZXRfd2luZG93c19zaWQgKGNyZWRzKSA9PSBOVUxMKTsKKworICBfZGJ1c19hc3NlcnQgKF9kYnVzX2NyZWRlbnRpYWxzX2FyZV9lbXB0eSAoY3JlZHMpKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19jcmVkZW50aWFsc19hcmVfYW5vbnltb3VzIChjcmVkcykpOworCisgIF9kYnVzX2NyZWRlbnRpYWxzX3VucmVmIChjcmVkcyk7CisgIAorICByZXR1cm4gVFJVRTsKK30KKworI2VuZGlmIC8qIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtY3JlZGVudGlhbHMuYyBiL2RidXMvZGJ1cy1jcmVkZW50aWFscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmYTc1NGMKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtY3JlZGVudGlhbHMuYwpAQCAtMCwwICsxLDYxOCBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLWNyZWRlbnRpYWxzLmMgQ3JlZGVudGlhbHMgcHJvdmFibGUgdGhyb3VnaCBhdXRoZW50aWNhdGlvbgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0IEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJkYnVzLWNyZWRlbnRpYWxzLmgiCisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c0NyZWRlbnRpYWxzIENyZWRlbnRpYWxzIHByb3ZhYmxlIHRocm91Z2ggYXV0aGVudGljYXRpb24KKyAqIEBpbmdyb3VwICBEQnVzSW50ZXJuYWxzCisgKiBAYnJpZWYgREJ1c0NyZWRlbnRpYWxzIG9iamVjdAorICoKKyAqIENyZWRlbnRpYWxzIGFyZSB3aGF0IHlvdSBoYXZlIHRvIHByb3ZlIHlvdSBoYXZlIGluIG9yZGVyIHRvCisgKiBhdXRoZW50aWNhdGUuICBUaGUgbWFpbiBjcmVkZW50aWFscyByaWdodCBub3cgYXJlIGEgdW5peCB1c2VyCisgKiBhY2NvdW50LCBhIFdpbmRvd3MgdXNlciBhY2NvdW50LCBvciBhIFVOSVggcHJvY2VzcyBJRC4KKyAqLworCisvKioKKyAqIEBkZWZncm91cCBEQnVzQ3JlZGVudGlhbHNJbnRlcm5hbHMgQ3JlZGVudGlhbHMgaW1wbGVtZW50YXRpb24gZGV0YWlscworICogQGluZ3JvdXAgIERCdXNJbnRlcm5hbHMKKyAqIEBicmllZiBEQnVzQ3JlZGVudGlhbHMgaW1wbGVtZW50YXRpb24gZGV0YWlscworICoKKyAqIFByaXZhdGUgZGV0YWlscyBvZiBjcmVkZW50aWFscyBjb2RlLgorICoKKyAqIEB7CisgKi8KKworc3RydWN0IERCdXNDcmVkZW50aWFscyB7CisgIGludCByZWZjb3VudDsKKyAgZGJ1c191aWRfdCB1bml4X3VpZDsKKyAgZGJ1c19waWRfdCBwaWQ7CisgIGNoYXIgKndpbmRvd3Nfc2lkOworICBjaGFyICpsaW51eF9zZWN1cml0eV9sYWJlbDsKKyAgdm9pZCAqYWR0X2F1ZGl0X2RhdGE7CisgIGRidXNfaW50MzJfdCBhZHRfYXVkaXRfZGF0YV9zaXplOworfTsKKworLyoqIEB9ICovCisKKy8qKgorICogQGFkZHRvZ3JvdXAgREJ1c0NyZWRlbnRpYWxzCisgKiBAeworICovCisKKy8qKgorICogQ3JlYXRlcyBhIG5ldyBjcmVkZW50aWFscyBvYmplY3QuCisgKgorICogQHJldHVybnMgdGhlIG5ldyBvYmplY3Qgb3IgI05VTEwgaWYgbm8gbWVtb3J5CisgKi8KK0RCdXNDcmVkZW50aWFscyoKK19kYnVzX2NyZWRlbnRpYWxzX25ldyAodm9pZCkKK3sKKyAgREJ1c0NyZWRlbnRpYWxzICpjcmVkczsKKworICBjcmVkcyA9IGRidXNfbmV3IChEQnVzQ3JlZGVudGlhbHMsIDEpOworICBpZiAoY3JlZHMgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKyAgCisgIGNyZWRzLT5yZWZjb3VudCA9IDE7CisgIGNyZWRzLT51bml4X3VpZCA9IERCVVNfVUlEX1VOU0VUOworICBjcmVkcy0+cGlkID0gREJVU19QSURfVU5TRVQ7CisgIGNyZWRzLT53aW5kb3dzX3NpZCA9IE5VTEw7CisgIGNyZWRzLT5saW51eF9zZWN1cml0eV9sYWJlbCA9IE5VTEw7CisgIGNyZWRzLT5hZHRfYXVkaXRfZGF0YSA9IE5VTEw7CisgIGNyZWRzLT5hZHRfYXVkaXRfZGF0YV9zaXplID0gMDsKKworICByZXR1cm4gY3JlZHM7Cit9CisKKy8qKgorICogQ3JlYXRlcyBhIG5ldyBvYmplY3Qgd2l0aCBjcmVkZW50aWFscyAodXNlciBJRCBhbmQgcHJvY2VzcyBJRCkgZnJvbSB0aGUgY3VycmVudCBwcm9jZXNzLgorICogQHJldHVybnMgdGhlIG5ldyBvYmplY3Qgb3IgI05VTEwgaWYgbm8gbWVtb3J5CisgKi8KK0RCdXNDcmVkZW50aWFscyoKK19kYnVzX2NyZWRlbnRpYWxzX25ld19mcm9tX2N1cnJlbnRfcHJvY2VzcyAodm9pZCkKK3sKKyAgREJ1c0NyZWRlbnRpYWxzICpjcmVkczsKKworICBjcmVkcyA9IF9kYnVzX2NyZWRlbnRpYWxzX25ldyAoKTsKKyAgaWYgKGNyZWRzID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaWYgKCFfZGJ1c19jcmVkZW50aWFsc19hZGRfZnJvbV9jdXJyZW50X3Byb2Nlc3MgKGNyZWRzKSkKKyAgICB7CisgICAgICBfZGJ1c19jcmVkZW50aWFsc191bnJlZiAoY3JlZHMpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAKKyAgcmV0dXJuIGNyZWRzOworfQorCisvKioKKyAqIEluY3JlbWVudCByZWZjb3VudCBvbiBjcmVkZW50aWFscy4KKyAqCisgKiBAcGFyYW0gY3JlZGVudGlhbHMgdGhlIG9iamVjdAorICovCit2b2lkCitfZGJ1c19jcmVkZW50aWFsc19yZWYgKERCdXNDcmVkZW50aWFscyAqY3JlZGVudGlhbHMpCit7CisgIF9kYnVzX2Fzc2VydCAoY3JlZGVudGlhbHMtPnJlZmNvdW50ID4gMCk7CisgIGNyZWRlbnRpYWxzLT5yZWZjb3VudCArPSAxOworfQorCisvKioKKyAqIERlY3JlbWVudCByZWZjb3VudCBvbiBjcmVkZW50aWFscy4KKyAqCisgKiBAcGFyYW0gY3JlZGVudGlhbHMgdGhlIG9iamVjdAorICovCit2b2lkCitfZGJ1c19jcmVkZW50aWFsc191bnJlZiAoREJ1c0NyZWRlbnRpYWxzICAgICpjcmVkZW50aWFscykKK3sKKyAgX2RidXNfYXNzZXJ0IChjcmVkZW50aWFscy0+cmVmY291bnQgPiAwKTsKKworICBjcmVkZW50aWFscy0+cmVmY291bnQgLT0gMTsKKyAgaWYgKGNyZWRlbnRpYWxzLT5yZWZjb3VudCA9PSAwKQorICAgIHsKKyAgICAgIGRidXNfZnJlZSAoY3JlZGVudGlhbHMtPndpbmRvd3Nfc2lkKTsKKyAgICAgIGRidXNfZnJlZSAoY3JlZGVudGlhbHMtPmxpbnV4X3NlY3VyaXR5X2xhYmVsKTsKKyAgICAgIGRidXNfZnJlZSAoY3JlZGVudGlhbHMtPmFkdF9hdWRpdF9kYXRhKTsKKyAgICAgIGRidXNfZnJlZSAoY3JlZGVudGlhbHMpOworICAgIH0KK30KKworLyoqCisgKiBBZGQgYSBVTklYIHByb2Nlc3MgSUQgdG8gdGhlIGNyZWRlbnRpYWxzLgorICoKKyAqIEBwYXJhbSBjcmVkZW50aWFscyB0aGUgb2JqZWN0CisgKiBAcGFyYW0gcGlkIHRoZSBwcm9jZXNzIElECisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm8gbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19jcmVkZW50aWFsc19hZGRfcGlkIChEQnVzQ3JlZGVudGlhbHMgICAgKmNyZWRlbnRpYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19waWRfdCAgICAgICAgICBwaWQpCit7CisgIGNyZWRlbnRpYWxzLT5waWQgPSBwaWQ7CisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIEFkZCBhIFVOSVggdXNlciBJRCB0byB0aGUgY3JlZGVudGlhbHMuCisgKgorICogQHBhcmFtIGNyZWRlbnRpYWxzIHRoZSBvYmplY3QKKyAqIEBwYXJhbSB1aWQgdGhlIHVzZXIgSUQKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBubyBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2NyZWRlbnRpYWxzX2FkZF91bml4X3VpZChEQnVzQ3JlZGVudGlhbHMgICAgKmNyZWRlbnRpYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWlkX3QgICAgICAgICAgdWlkKQoreworICBjcmVkZW50aWFscy0+dW5peF91aWQgPSB1aWQ7CisgIHJldHVybiBUUlVFOworCit9CisKKy8qKgorICogQWRkIGEgV2luZG93cyB1c2VyIFNJRCB0byB0aGUgY3JlZGVudGlhbHMuCisgKgorICogQHBhcmFtIGNyZWRlbnRpYWxzIHRoZSBvYmplY3QKKyAqIEBwYXJhbSB3aW5kb3dzX3NpZCB0aGUgdXNlciBTSUQKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBubyBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2NyZWRlbnRpYWxzX2FkZF93aW5kb3dzX3NpZCAoREJ1c0NyZWRlbnRpYWxzICAgICpjcmVkZW50aWFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgICp3aW5kb3dzX3NpZCkKK3sKKyAgY2hhciAqY29weTsKKworICBjb3B5ID0gX2RidXNfc3RyZHVwICh3aW5kb3dzX3NpZCk7CisgIGlmIChjb3B5ID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGRidXNfZnJlZSAoY3JlZGVudGlhbHMtPndpbmRvd3Nfc2lkKTsKKyAgY3JlZGVudGlhbHMtPndpbmRvd3Nfc2lkID0gY29weTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBBZGQgYSBMaW51eCBzZWN1cml0eSBsYWJlbCwgYXMgdXNlZCBieSBMU01zIHN1Y2ggYXMgU0VMaW51eCwgU21hY2sgYW5kCisgKiBBcHBBcm1vciwgdG8gdGhlIGNyZWRlbnRpYWxzLgorICoKKyAqIEBwYXJhbSBjcmVkZW50aWFscyB0aGUgb2JqZWN0CisgKiBAcGFyYW0gbGFiZWwgdGhlIGxhYmVsCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm8gbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19jcmVkZW50aWFsc19hZGRfbGludXhfc2VjdXJpdHlfbGFiZWwgKERCdXNDcmVkZW50aWFscyAgICAqY3JlZGVudGlhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICAqbGFiZWwpCit7CisgIGNoYXIgKmNvcHk7CisKKyAgY29weSA9IF9kYnVzX3N0cmR1cCAobGFiZWwpOworICBpZiAoY29weSA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKworICBkYnVzX2ZyZWUgKGNyZWRlbnRpYWxzLT5saW51eF9zZWN1cml0eV9sYWJlbCk7CisgIGNyZWRlbnRpYWxzLT5saW51eF9zZWN1cml0eV9sYWJlbCA9IGNvcHk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogQWRkIEFEVCBhdWRpdCBkYXRhIHRvIHRoZSBjcmVkZW50aWFscy4KKyAqCisgKiBAcGFyYW0gY3JlZGVudGlhbHMgdGhlIG9iamVjdAorICogQHBhcmFtIGF1ZGl0X2RhdGEgdGhlIGF1ZGl0IGRhdGEKKyAqIEBwYXJhbSBzaXplIHRoZSBsZW5ndGggb2YgYXVkaXQgZGF0YQorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfY3JlZGVudGlhbHNfYWRkX2FkdF9hdWRpdF9kYXRhIChEQnVzQ3JlZGVudGlhbHMgICAgKmNyZWRlbnRpYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgKmF1ZGl0X2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfaW50MzJfdCAgICAgICAgc2l6ZSkKK3sKKyAgdm9pZCAqY29weTsKKyAgY29weSA9IF9kYnVzX21lbWR1cCAoYXVkaXRfZGF0YSwgc2l6ZSk7CisgIGlmIChjb3B5ID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGRidXNfZnJlZSAoY3JlZGVudGlhbHMtPmFkdF9hdWRpdF9kYXRhKTsKKyAgY3JlZGVudGlhbHMtPmFkdF9hdWRpdF9kYXRhID0gY29weTsKKyAgY3JlZGVudGlhbHMtPmFkdF9hdWRpdF9kYXRhX3NpemUgPSBzaXplOworCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBjcmVkZW50aWFsIGlzIHByZXNlbnQuCisgKgorICogQHBhcmFtIGNyZWRlbnRpYWxzIHRoZSBvYmplY3QKKyAqIEBwYXJhbSB0eXBlIHRoZSBjcmVkZW50aWFsIHRvIGNoZWNrIGZvcgorICogQHJldHVybnMgI1RSVUUgaWYgdGhlIGNyZWRlbnRpYWwgaXMgcHJlc2VudAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfY3JlZGVudGlhbHNfaW5jbHVkZSAoREJ1c0NyZWRlbnRpYWxzICAgICpjcmVkZW50aWFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDcmVkZW50aWFsVHlwZSAgdHlwZSkKK3sKKyAgc3dpdGNoICh0eXBlKQorICAgIHsKKyAgICBjYXNlIERCVVNfQ1JFREVOVElBTF9VTklYX1BST0NFU1NfSUQ6CisgICAgICByZXR1cm4gY3JlZGVudGlhbHMtPnBpZCAhPSBEQlVTX1BJRF9VTlNFVDsKKyAgICBjYXNlIERCVVNfQ1JFREVOVElBTF9VTklYX1VTRVJfSUQ6CisgICAgICByZXR1cm4gY3JlZGVudGlhbHMtPnVuaXhfdWlkICE9IERCVVNfVUlEX1VOU0VUOworICAgIGNhc2UgREJVU19DUkVERU5USUFMX1dJTkRPV1NfU0lEOgorICAgICAgcmV0dXJuIGNyZWRlbnRpYWxzLT53aW5kb3dzX3NpZCAhPSBOVUxMOworICAgIGNhc2UgREJVU19DUkVERU5USUFMX0xJTlVYX1NFQ1VSSVRZX0xBQkVMOgorICAgICAgcmV0dXJuIGNyZWRlbnRpYWxzLT5saW51eF9zZWN1cml0eV9sYWJlbCAhPSBOVUxMOworICAgIGNhc2UgREJVU19DUkVERU5USUFMX0FEVF9BVURJVF9EQVRBX0lEOgorICAgICAgcmV0dXJuIGNyZWRlbnRpYWxzLT5hZHRfYXVkaXRfZGF0YSAhPSBOVUxMOworICAgIGRlZmF1bHQ6CisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJVbmtub3duIGNyZWRlbnRpYWwgZW51bSB2YWx1ZSIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KK30KKworLyoqCisgKiBHZXRzIHRoZSBVTklYIHByb2Nlc3MgSUQgaW4gdGhlIGNyZWRlbnRpYWxzLCBvciAjREJVU19QSURfVU5TRVQgaWYKKyAqIHRoZSBjcmVkZW50aWFscyBvYmplY3QgZG9lc24ndCBjb250YWluIGEgcHJvY2VzcyBJRC4KKyAqCisgKiBAcGFyYW0gY3JlZGVudGlhbHMgdGhlIG9iamVjdAorICogQHJldHVybnMgVU5JWCBwcm9jZXNzIElECisgKi8KK2RidXNfcGlkX3QKK19kYnVzX2NyZWRlbnRpYWxzX2dldF9waWQgKERCdXNDcmVkZW50aWFscyAgICAqY3JlZGVudGlhbHMpCit7CisgIHJldHVybiBjcmVkZW50aWFscy0+cGlkOworfQorCisvKioKKyAqIEdldHMgdGhlIFVOSVggdXNlciBJRCBpbiB0aGUgY3JlZGVudGlhbHMsIG9yICNEQlVTX1VJRF9VTlNFVCBpZgorICogdGhlIGNyZWRlbnRpYWxzIG9iamVjdCBkb2Vzbid0IGNvbnRhaW4gYSB1c2VyIElELgorICoKKyAqIEBwYXJhbSBjcmVkZW50aWFscyB0aGUgb2JqZWN0CisgKiBAcmV0dXJucyBVTklYIHVzZXIgSUQKKyAqLworZGJ1c191aWRfdAorX2RidXNfY3JlZGVudGlhbHNfZ2V0X3VuaXhfdWlkIChEQnVzQ3JlZGVudGlhbHMgICAgKmNyZWRlbnRpYWxzKQoreworICByZXR1cm4gY3JlZGVudGlhbHMtPnVuaXhfdWlkOworfQorCisvKioKKyAqIEdldHMgdGhlIFdpbmRvd3MgdXNlciBTSUQgaW4gdGhlIGNyZWRlbnRpYWxzLCBvciAjTlVMTCBpZgorICogdGhlIGNyZWRlbnRpYWxzIG9iamVjdCBkb2Vzbid0IGNvbnRhaW4gYSBXaW5kb3dzIHVzZXIgU0lELgorICoKKyAqIEBwYXJhbSBjcmVkZW50aWFscyB0aGUgb2JqZWN0CisgKiBAcmV0dXJucyBXaW5kb3dzIHVzZXIgU0lECisgKi8KK2NvbnN0IGNoYXIqCitfZGJ1c19jcmVkZW50aWFsc19nZXRfd2luZG93c19zaWQgKERCdXNDcmVkZW50aWFscyAgICAqY3JlZGVudGlhbHMpCit7CisgIHJldHVybiBjcmVkZW50aWFscy0+d2luZG93c19zaWQ7Cit9CisKKy8qKgorICogR2V0cyB0aGUgTGludXggc2VjdXJpdHkgbGFiZWwgKGFzIHVzZWQgYnkgTFNNcykgZnJvbSB0aGUgY3JlZGVudGlhbHMsCisgKiBvciAjTlVMTCBpZiB0aGUgY3JlZGVudGlhbHMgb2JqZWN0IGRvZXNuJ3QgY29udGFpbiBhIHNlY3VyaXR5IGxhYmVsLgorICoKKyAqIEBwYXJhbSBjcmVkZW50aWFscyB0aGUgb2JqZWN0CisgKiBAcmV0dXJucyB0aGUgc2VjdXJpdHkgbGFiZWwKKyAqLworY29uc3QgY2hhciAqCitfZGJ1c19jcmVkZW50aWFsc19nZXRfbGludXhfc2VjdXJpdHlfbGFiZWwgKERCdXNDcmVkZW50aWFscyAqY3JlZGVudGlhbHMpCit7CisgIHJldHVybiBjcmVkZW50aWFscy0+bGludXhfc2VjdXJpdHlfbGFiZWw7Cit9CisKKy8qKgorICogR2V0cyB0aGUgQURUIGF1ZGl0IGRhdGEgaW4gdGhlIGNyZWRlbnRpYWxzLCBvciAjTlVMTCBpZgorICogdGhlIGNyZWRlbnRpYWxzIG9iamVjdCBkb2Vzbid0IGNvbnRhaW4gQURUIGF1ZGl0IGRhdGEuCisgKgorICogQHBhcmFtIGNyZWRlbnRpYWxzIHRoZSBvYmplY3QKKyAqIEByZXR1cm5zIFNvbGFyaXMgQURUIGF1ZGl0IGRhdGEgCisgKi8KK3ZvaWQgKgorX2RidXNfY3JlZGVudGlhbHNfZ2V0X2FkdF9hdWRpdF9kYXRhIChEQnVzQ3JlZGVudGlhbHMgICAgKmNyZWRlbnRpYWxzKQoreworICByZXR1cm4gY3JlZGVudGlhbHMtPmFkdF9hdWRpdF9kYXRhOworfQorCisvKioKKyAqIEdldHMgdGhlIEFEVCBhdWRpdCBkYXRhIHNpemUgaW4gdGhlIGNyZWRlbnRpYWxzLCBvciAwIGlmCisgKiB0aGUgY3JlZGVudGlhbHMgb2JqZWN0IGRvZXNuJ3QgY29udGFpbiBBRFQgYXVkaXQgZGF0YS4KKyAqCisgKiBAcGFyYW0gY3JlZGVudGlhbHMgdGhlIG9iamVjdAorICogQHJldHVybnMgU29sYXJpcyBBRFQgYXVkaXQgZGF0YSBzaXplCisgKi8KK2RidXNfaW50MzJfdCAKK19kYnVzX2NyZWRlbnRpYWxzX2dldF9hZHRfYXVkaXRfZGF0YV9zaXplIChEQnVzQ3JlZGVudGlhbHMgICAgKmNyZWRlbnRpYWxzKQoreworICByZXR1cm4gY3JlZGVudGlhbHMtPmFkdF9hdWRpdF9kYXRhX3NpemU7Cit9CisKKy8qKgorICogQ2hlY2tzIHdoZXRoZXIgdGhlIGZpcnN0IGNyZWRlbnRpYWxzIG9iamVjdCBjb250YWlucworICogYWxsIHRoZSBjcmVkZW50aWFscyBmb3VuZCBpbiB0aGUgc2Vjb25kIGNyZWRlbnRpYWxzIG9iamVjdC4KKyAqCisgKiBAcGFyYW0gY3JlZGVudGlhbHMgdGhlIG9iamVjdAorICogQHBhcmFtIHBvc3NpYmxlX3N1YnNldCBzZWUgaWYgY3JlZGVudGlhbHMgaW4gaGVyZSBhcmUgYWxzbyBpbiB0aGUgZmlyc3QgYXJnCisgKiBAcmV0dXJucyAjVFJVRSBpZiBzZWNvbmQgYXJnIGlzIGNvbnRhaW5lZCBpbiBmaXJzdAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfY3JlZGVudGlhbHNfYXJlX3N1cGVyc2V0IChEQnVzQ3JlZGVudGlhbHMgICAgKmNyZWRlbnRpYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ3JlZGVudGlhbHMgICAgKnBvc3NpYmxlX3N1YnNldCkKK3sKKyAgcmV0dXJuCisgICAgKHBvc3NpYmxlX3N1YnNldC0+cGlkID09IERCVVNfUElEX1VOU0VUIHx8CisgICAgIHBvc3NpYmxlX3N1YnNldC0+cGlkID09IGNyZWRlbnRpYWxzLT5waWQpICYmCisgICAgKHBvc3NpYmxlX3N1YnNldC0+dW5peF91aWQgPT0gREJVU19VSURfVU5TRVQgfHwKKyAgICAgcG9zc2libGVfc3Vic2V0LT51bml4X3VpZCA9PSBjcmVkZW50aWFscy0+dW5peF91aWQpICYmCisgICAgKHBvc3NpYmxlX3N1YnNldC0+d2luZG93c19zaWQgPT0gTlVMTCB8fAorICAgICAoY3JlZGVudGlhbHMtPndpbmRvd3Nfc2lkICYmIHN0cmNtcCAocG9zc2libGVfc3Vic2V0LT53aW5kb3dzX3NpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWRlbnRpYWxzLT53aW5kb3dzX3NpZCkgPT0gMCkpICYmCisgICAgKHBvc3NpYmxlX3N1YnNldC0+bGludXhfc2VjdXJpdHlfbGFiZWwgPT0gTlVMTCB8fAorICAgICAoY3JlZGVudGlhbHMtPmxpbnV4X3NlY3VyaXR5X2xhYmVsICE9IE5VTEwgJiYKKyAgICAgIHN0cmNtcCAocG9zc2libGVfc3Vic2V0LT5saW51eF9zZWN1cml0eV9sYWJlbCwKKyAgICAgICAgICAgICAgY3JlZGVudGlhbHMtPmxpbnV4X3NlY3VyaXR5X2xhYmVsKSA9PSAwKSkgJiYKKyAgICAocG9zc2libGVfc3Vic2V0LT5hZHRfYXVkaXRfZGF0YSA9PSBOVUxMIHx8CisgICAgIChjcmVkZW50aWFscy0+YWR0X2F1ZGl0X2RhdGEgJiYgbWVtY21wIChwb3NzaWJsZV9zdWJzZXQtPmFkdF9hdWRpdF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlZGVudGlhbHMtPmFkdF9hdWRpdF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlZGVudGlhbHMtPmFkdF9hdWRpdF9kYXRhX3NpemUpID09IDApKTsKK30KKworLyoqCisgKiBDaGVja3Mgd2hldGhlciBhIGNyZWRlbnRpYWxzIG9iamVjdCBjb250YWlucyBhbnl0aGluZy4KKyAqIAorICogQHBhcmFtIGNyZWRlbnRpYWxzIHRoZSBvYmplY3QKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZXJlIGFyZSBubyBjcmVkZW50aWFscyBpbiB0aGUgb2JqZWN0CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19jcmVkZW50aWFsc19hcmVfZW1wdHkgKERCdXNDcmVkZW50aWFscyAgICAqY3JlZGVudGlhbHMpCit7CisgIHJldHVybgorICAgIGNyZWRlbnRpYWxzLT5waWQgPT0gREJVU19QSURfVU5TRVQgJiYKKyAgICBjcmVkZW50aWFscy0+dW5peF91aWQgPT0gREJVU19VSURfVU5TRVQgJiYKKyAgICBjcmVkZW50aWFscy0+d2luZG93c19zaWQgPT0gTlVMTCAmJgorICAgIGNyZWRlbnRpYWxzLT5saW51eF9zZWN1cml0eV9sYWJlbCA9PSBOVUxMICYmCisgICAgY3JlZGVudGlhbHMtPmFkdF9hdWRpdF9kYXRhID09IE5VTEw7Cit9CisKKy8qKgorICogQ2hlY2tzIHdoZXRoZXIgYSBjcmVkZW50aWFscyBvYmplY3QgY29udGFpbnMgYSB1c2VyIGlkZW50aXR5LgorICogCisgKiBAcGFyYW0gY3JlZGVudGlhbHMgdGhlIG9iamVjdAorICogQHJldHVybnMgI1RSVUUgaWYgdGhlcmUgYXJlIG5vIHVzZXIgaWRlbnRpdGllcyBpbiB0aGUgb2JqZWN0CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19jcmVkZW50aWFsc19hcmVfYW5vbnltb3VzIChEQnVzQ3JlZGVudGlhbHMgICAgKmNyZWRlbnRpYWxzKQoreworICByZXR1cm4KKyAgICBjcmVkZW50aWFscy0+dW5peF91aWQgPT0gREJVU19VSURfVU5TRVQgJiYKKyAgICBjcmVkZW50aWFscy0+d2luZG93c19zaWQgPT0gTlVMTDsKK30KKworLyoqCisgKiBNZXJnZSBhbGwgY3JlZGVudGlhbHMgZm91bmQgaW4gdGhlIHNlY29uZCBvYmplY3QgaW50byB0aGUgZmlyc3Qgb2JqZWN0LAorICogb3ZlcndyaXRpbmcgdGhlIGZpcnN0IG9iamVjdCBpZiB0aGVyZSBhcmUgYW55IG92ZXJsYXBzLgorICogCisgKiBAcGFyYW0gY3JlZGVudGlhbHMgdGhlIG9iamVjdAorICogQHBhcmFtIG90aGVyX2NyZWRlbnRpYWxzIGNyZWRlbnRpYWxzIHRvIG1lcmdlCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm8gbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19jcmVkZW50aWFsc19hZGRfY3JlZGVudGlhbHMgKERCdXNDcmVkZW50aWFscyAgICAqY3JlZGVudGlhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDcmVkZW50aWFscyAgICAqb3RoZXJfY3JlZGVudGlhbHMpCit7CisgIHJldHVybgorICAgIF9kYnVzX2NyZWRlbnRpYWxzX2FkZF9jcmVkZW50aWFsIChjcmVkZW50aWFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19DUkVERU5USUFMX1VOSVhfUFJPQ0VTU19JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJfY3JlZGVudGlhbHMpICYmCisgICAgX2RidXNfY3JlZGVudGlhbHNfYWRkX2NyZWRlbnRpYWwgKGNyZWRlbnRpYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0NSRURFTlRJQUxfVU5JWF9VU0VSX0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlcl9jcmVkZW50aWFscykgJiYKKyAgICBfZGJ1c19jcmVkZW50aWFsc19hZGRfY3JlZGVudGlhbCAoY3JlZGVudGlhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfQ1JFREVOVElBTF9BRFRfQVVESVRfREFUQV9JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJfY3JlZGVudGlhbHMpICYmCisgICAgX2RidXNfY3JlZGVudGlhbHNfYWRkX2NyZWRlbnRpYWwgKGNyZWRlbnRpYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0NSRURFTlRJQUxfTElOVVhfU0VDVVJJVFlfTEFCRUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyX2NyZWRlbnRpYWxzKSAmJgorICAgIF9kYnVzX2NyZWRlbnRpYWxzX2FkZF9jcmVkZW50aWFsIChjcmVkZW50aWFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19DUkVERU5USUFMX1dJTkRPV1NfU0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlcl9jcmVkZW50aWFscyk7Cit9CisKKy8qKgorICogTWVyZ2UgdGhlIGdpdmVuIGNyZWRlbnRpYWwgZm91bmQgaW4gdGhlIHNlY29uZCBvYmplY3QgaW50byB0aGUgZmlyc3Qgb2JqZWN0LAorICogb3ZlcndyaXRpbmcgdGhlIGZpcnN0IG9iamVjdCdzIHZhbHVlIGZvciB0aGF0IGNyZWRlbnRpYWwuCisgKgorICogRG9lcyBub3RoaW5nIGlmIHRoZSBzZWNvbmQgb2JqZWN0IGRvZXMgbm90IGNvbnRhaW4gdGhlIHNwZWNpZmllZCBjcmVkZW50aWFsLgorICogaS5lLiwgd2lsbCBuZXZlciBkZWxldGUgYSBjcmVkZW50aWFsIGZyb20gdGhlIGZpcnN0IG9iamVjdC4KKyAqIAorICogQHBhcmFtIGNyZWRlbnRpYWxzIHRoZSBvYmplY3QKKyAqIEBwYXJhbSB3aGljaCB0aGUgY3JlZGVudGlhbCB0byBvdmVyd3JpdGUKKyAqIEBwYXJhbSBvdGhlcl9jcmVkZW50aWFscyBjcmVkZW50aWFscyB0byBtZXJnZQorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfY3JlZGVudGlhbHNfYWRkX2NyZWRlbnRpYWwgKERCdXNDcmVkZW50aWFscyAgICAqY3JlZGVudGlhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0NyZWRlbnRpYWxUeXBlICB3aGljaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ3JlZGVudGlhbHMgICAgKm90aGVyX2NyZWRlbnRpYWxzKQoreworICBpZiAod2hpY2ggPT0gREJVU19DUkVERU5USUFMX1VOSVhfUFJPQ0VTU19JRCAmJgorICAgICAgb3RoZXJfY3JlZGVudGlhbHMtPnBpZCAhPSBEQlVTX1BJRF9VTlNFVCkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX2NyZWRlbnRpYWxzX2FkZF9waWQgKGNyZWRlbnRpYWxzLCBvdGhlcl9jcmVkZW50aWFscy0+cGlkKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgZWxzZSBpZiAod2hpY2ggPT0gREJVU19DUkVERU5USUFMX1VOSVhfVVNFUl9JRCAmJgorICAgICAgICAgICBvdGhlcl9jcmVkZW50aWFscy0+dW5peF91aWQgIT0gREJVU19VSURfVU5TRVQpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19jcmVkZW50aWFsc19hZGRfdW5peF91aWQgKGNyZWRlbnRpYWxzLCBvdGhlcl9jcmVkZW50aWFscy0+dW5peF91aWQpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICBlbHNlIGlmICh3aGljaCA9PSBEQlVTX0NSRURFTlRJQUxfV0lORE9XU19TSUQgJiYKKyAgICAgICAgICAgb3RoZXJfY3JlZGVudGlhbHMtPndpbmRvd3Nfc2lkICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19jcmVkZW50aWFsc19hZGRfd2luZG93c19zaWQgKGNyZWRlbnRpYWxzLCBvdGhlcl9jcmVkZW50aWFscy0+d2luZG93c19zaWQpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfSAKKyAgZWxzZSBpZiAod2hpY2ggPT0gREJVU19DUkVERU5USUFMX0xJTlVYX1NFQ1VSSVRZX0xBQkVMICYmCisgICAgICAgICAgIG90aGVyX2NyZWRlbnRpYWxzLT5saW51eF9zZWN1cml0eV9sYWJlbCAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfY3JlZGVudGlhbHNfYWRkX2xpbnV4X3NlY3VyaXR5X2xhYmVsIChjcmVkZW50aWFscywKKyAgICAgICAgICAgIG90aGVyX2NyZWRlbnRpYWxzLT5saW51eF9zZWN1cml0eV9sYWJlbCkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIGVsc2UgaWYgKHdoaWNoID09IERCVVNfQ1JFREVOVElBTF9BRFRfQVVESVRfREFUQV9JRCAmJgorICAgICAgICAgICBvdGhlcl9jcmVkZW50aWFscy0+YWR0X2F1ZGl0X2RhdGEgIT0gTlVMTCkgCisgICAgeworICAgICAgaWYgKCFfZGJ1c19jcmVkZW50aWFsc19hZGRfYWR0X2F1ZGl0X2RhdGEgKGNyZWRlbnRpYWxzLCBvdGhlcl9jcmVkZW50aWFscy0+YWR0X2F1ZGl0X2RhdGEsIG90aGVyX2NyZWRlbnRpYWxzLT5hZHRfYXVkaXRfZGF0YV9zaXplKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBDbGVhciBhbGwgY3JlZGVudGlhbHMgaW4gdGhlIG9iamVjdC4KKyAqIAorICogQHBhcmFtIGNyZWRlbnRpYWxzIHRoZSBvYmplY3QKKyAqLwordm9pZAorX2RidXNfY3JlZGVudGlhbHNfY2xlYXIgKERCdXNDcmVkZW50aWFscyAgICAqY3JlZGVudGlhbHMpCit7CisgIGNyZWRlbnRpYWxzLT5waWQgPSBEQlVTX1BJRF9VTlNFVDsKKyAgY3JlZGVudGlhbHMtPnVuaXhfdWlkID0gREJVU19VSURfVU5TRVQ7CisgIGRidXNfZnJlZSAoY3JlZGVudGlhbHMtPndpbmRvd3Nfc2lkKTsKKyAgY3JlZGVudGlhbHMtPndpbmRvd3Nfc2lkID0gTlVMTDsKKyAgZGJ1c19mcmVlIChjcmVkZW50aWFscy0+bGludXhfc2VjdXJpdHlfbGFiZWwpOworICBjcmVkZW50aWFscy0+bGludXhfc2VjdXJpdHlfbGFiZWwgPSBOVUxMOworICBkYnVzX2ZyZWUgKGNyZWRlbnRpYWxzLT5hZHRfYXVkaXRfZGF0YSk7CisgIGNyZWRlbnRpYWxzLT5hZHRfYXVkaXRfZGF0YSA9IE5VTEw7CisgIGNyZWRlbnRpYWxzLT5hZHRfYXVkaXRfZGF0YV9zaXplID0gMDsKK30KKworLyoqCisgKiBDb3B5IGEgY3JlZGVudGlhbHMgb2JqZWN0LgorICogCisgKiBAcGFyYW0gY3JlZGVudGlhbHMgdGhlIG9iamVjdAorICogQHJldHVybnMgdGhlIGNvcHkgb3IgI05VTEwKKyAqLworREJ1c0NyZWRlbnRpYWxzKgorX2RidXNfY3JlZGVudGlhbHNfY29weSAoREJ1c0NyZWRlbnRpYWxzICAgICpjcmVkZW50aWFscykKK3sKKyAgREJ1c0NyZWRlbnRpYWxzICpjb3B5OworCisgIGNvcHkgPSBfZGJ1c19jcmVkZW50aWFsc19uZXcgKCk7CisgIGlmIChjb3B5ID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaWYgKCFfZGJ1c19jcmVkZW50aWFsc19hZGRfY3JlZGVudGlhbHMgKGNvcHksIGNyZWRlbnRpYWxzKSkKKyAgICB7CisgICAgICBfZGJ1c19jcmVkZW50aWFsc191bnJlZiAoY29weSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgcmV0dXJuIGNvcHk7Cit9CisKKy8qKgorICogQ2hlY2sgd2hldGhlciB0aGUgdXNlci1pZGVudGlmeWluZyBjcmVkZW50aWFscyBpbiB0d28gY3JlZGVudGlhbHMKKyAqIG9iamVjdHMgYXJlIGlkZW50aWNhbC4gQ3JlZGVudGlhbHMgdGhhdCBhcmUgbm90IHJlbGF0ZWQgdG8gdGhlCisgKiB1c2VyIGFyZSBpZ25vcmVkLCBidXQgYW55IGtpbmQgb2YgdXNlciBJRCBjcmVkZW50aWFscyBtdXN0IGJlIHRoZQorICogc2FtZSAoVU5JWCB1c2VyIElELCBXaW5kb3dzIHVzZXIgU0lELCBldGMuKSBhbmQgcHJlc2VudCBpbiBib3RoCisgKiBvYmplY3RzIGZvciB0aGUgZnVuY3Rpb24gdG8gcmV0dXJuICNUUlVFLgorICogCisgKiBAcGFyYW0gY3JlZGVudGlhbHMgdGhlIG9iamVjdAorICogQHBhcmFtIG90aGVyX2NyZWRlbnRpYWxzIGNyZWRlbnRpYWxzIHRvIGNvbXBhcmUKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSB0d28gY3JlZGVudGlhbHMgcmVmZXIgdG8gdGhlIHNhbWUgdXNlcgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfY3JlZGVudGlhbHNfc2FtZV91c2VyIChEQnVzQ3JlZGVudGlhbHMgICAgKmNyZWRlbnRpYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ3JlZGVudGlhbHMgICAgKm90aGVyX2NyZWRlbnRpYWxzKQoreworICAvKiBib3RoIHdpbmRvd3MgYW5kIHVuaXggdXNlciBtdXN0IGJlIHRoZSBzYW1lICh0aG91Z2ggcHJldHR5IG11Y2gKKyAgICogaW4gYWxsIGNvbmNlaXZhYmxlIGNhc2VzLCBvbmUgd2lsbCBiZSB1bnNldCkKKyAgICovCisgIHJldHVybiBjcmVkZW50aWFscy0+dW5peF91aWQgPT0gb3RoZXJfY3JlZGVudGlhbHMtPnVuaXhfdWlkICYmCisgICAgKCghKGNyZWRlbnRpYWxzLT53aW5kb3dzX3NpZCB8fCBvdGhlcl9jcmVkZW50aWFscy0+d2luZG93c19zaWQpKSB8fAorICAgICAoY3JlZGVudGlhbHMtPndpbmRvd3Nfc2lkICYmIG90aGVyX2NyZWRlbnRpYWxzLT53aW5kb3dzX3NpZCAmJgorICAgICAgc3RyY21wIChjcmVkZW50aWFscy0+d2luZG93c19zaWQsIG90aGVyX2NyZWRlbnRpYWxzLT53aW5kb3dzX3NpZCkgPT0gMCkpOworfQorCisvKioKKyAqIENvbnZlcnQgdGhlIGNyZWRlbnRpYWxzIGluIHRoaXMgb2JqZWN0IHRvIGEgaHVtYW4tcmVhZGFibGUKKyAqIHN0cmluZyBmb3JtYXQsIGFuZCBhcHBlbmQgdG8gdGhlIGdpdmVuIHN0cmluZy4KKyAqCisgKiBAcGFyYW0gY3JlZGVudGlhbHMgdGhlIG9iamVjdAorICogQHBhcmFtIHN0cmluZyBhcHBlbmQgdG8gdGhpcyBzdHJpbmcKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBubyBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2NyZWRlbnRpYWxzX3RvX3N0cmluZ19hcHBlbmQgKERCdXNDcmVkZW50aWFscyAgICAqY3JlZGVudGlhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICAgKnN0cmluZykKK3sKKyAgZGJ1c19ib29sX3Qgam9pbjsKKworICBqb2luID0gRkFMU0U7CisgIGlmIChjcmVkZW50aWFscy0+dW5peF91aWQgIT0gREJVU19VSURfVU5TRVQpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX3ByaW50ZiAoc3RyaW5nLCAidWlkPSIgREJVU19VSURfRk9STUFULCBjcmVkZW50aWFscy0+dW5peF91aWQpKQorICAgICAgICBnb3RvIG9vbTsKKyAgICAgIGpvaW4gPSBUUlVFOworICAgIH0KKyAgaWYgKGNyZWRlbnRpYWxzLT5waWQgIT0gREJVU19QSURfVU5TRVQpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX3ByaW50ZiAoc3RyaW5nLCAiJXNwaWQ9IiBEQlVTX1BJRF9GT1JNQVQsIGpvaW4gPyAiICIgOiAiIiwgY3JlZGVudGlhbHMtPnBpZCkpCisgICAgICAgIGdvdG8gb29tOworICAgICAgam9pbiA9IFRSVUU7CisgICAgfQorICBlbHNlCisgICAgam9pbiA9IEZBTFNFOworICBpZiAoY3JlZGVudGlhbHMtPndpbmRvd3Nfc2lkICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX3ByaW50ZiAoc3RyaW5nLCAiJXNzaWQ9JXMiLCBqb2luID8gIiAiIDogIiIsIGNyZWRlbnRpYWxzLT53aW5kb3dzX3NpZCkpCisgICAgICAgIGdvdG8gb29tOworICAgICAgam9pbiA9IFRSVUU7CisgICAgfQorICBlbHNlCisgICAgam9pbiA9IEZBTFNFOworCisgIGlmIChjcmVkZW50aWFscy0+bGludXhfc2VjdXJpdHlfbGFiZWwgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfcHJpbnRmIChzdHJpbmcsICIlc2xzbT0nJXMnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvaW4gPyAiICIgOiAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWRlbnRpYWxzLT5saW51eF9zZWN1cml0eV9sYWJlbCkpCisgICAgICAgIGdvdG8gb29tOworICAgICAgam9pbiA9IFRSVUU7CisgICAgfQorCisgIHJldHVybiBUUlVFOworb29tOgorICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKiBAfSAqLworCisvKiB0ZXN0cyBpbiBkYnVzLWNyZWRlbnRpYWxzLXV0aWwuYyAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLWNyZWRlbnRpYWxzLmggYi9kYnVzL2RidXMtY3JlZGVudGlhbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmY2YzJiCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLWNyZWRlbnRpYWxzLmgKQEAgLTAsMCArMSwxMDEgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1jcmVkZW50aWFscy5oIENyZWRlbnRpYWxzIHByb3ZhYmxlIHRocm91Z2ggYXV0aGVudGljYXRpb24KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaWZuZGVmIERCVVNfQ1JFREVOVElBTFNfSAorI2RlZmluZSBEQlVTX0NSRURFTlRJQUxTX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy1tYWNyb3MuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtZXJyb3JzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXN0cmluZy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zeXNkZXBzLmg+CisKK0RCVVNfQkVHSU5fREVDTFMKKwordHlwZWRlZiBlbnVtIHsKKyAgREJVU19DUkVERU5USUFMX1VOSVhfUFJPQ0VTU19JRCwKKyAgREJVU19DUkVERU5USUFMX1VOSVhfVVNFUl9JRCwKKyAgREJVU19DUkVERU5USUFMX0FEVF9BVURJVF9EQVRBX0lELAorICBEQlVTX0NSRURFTlRJQUxfTElOVVhfU0VDVVJJVFlfTEFCRUwsCisgIERCVVNfQ1JFREVOVElBTF9XSU5ET1dTX1NJRAorfSBEQnVzQ3JlZGVudGlhbFR5cGU7CisKK0RCVVNfUFJJVkFURV9FWFBPUlQKK0RCdXNDcmVkZW50aWFscyogX2RidXNfY3JlZGVudGlhbHNfbmV3X2Zyb21fY3VycmVudF9wcm9jZXNzICh2b2lkKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK0RCdXNDcmVkZW50aWFscyogX2RidXNfY3JlZGVudGlhbHNfbmV3ICAgICAgICAgICAgICAgICAgICAgICh2b2lkKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK3ZvaWQgICAgICAgICAgICAgX2RidXNfY3JlZGVudGlhbHNfcmVmICAgICAgICAgICAgICAgICAgICAgIChEQnVzQ3JlZGVudGlhbHMgICAgKmNyZWRlbnRpYWxzKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK3ZvaWQgICAgICAgICAgICAgX2RidXNfY3JlZGVudGlhbHNfdW5yZWYgICAgICAgICAgICAgICAgICAgIChEQnVzQ3JlZGVudGlhbHMgICAgKmNyZWRlbnRpYWxzKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90ICAgICAgX2RidXNfY3JlZGVudGlhbHNfYWRkX3BpZCAgICAgICAgICAgICAgICAgIChEQnVzQ3JlZGVudGlhbHMgICAgKmNyZWRlbnRpYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfcGlkX3QgICAgICAgICAgcGlkKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90ICAgICAgX2RidXNfY3JlZGVudGlhbHNfYWRkX3VuaXhfdWlkICAgICAgICAgICAgIChEQnVzQ3JlZGVudGlhbHMgICAgKmNyZWRlbnRpYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWlkX3QgICAgICAgICAgdWlkKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90ICAgICAgX2RidXNfY3JlZGVudGlhbHNfYWRkX3dpbmRvd3Nfc2lkICAgICAgICAgIChEQnVzQ3JlZGVudGlhbHMgICAgKmNyZWRlbnRpYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICAqd2luZG93c19zaWQpOworZGJ1c19ib29sX3QgICAgICBfZGJ1c19jcmVkZW50aWFsc19hZGRfbGludXhfc2VjdXJpdHlfbGFiZWwgKERCdXNDcmVkZW50aWFscyAgICAqY3JlZGVudGlhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgICpsYWJlbCk7CitkYnVzX2Jvb2xfdCAgICAgIF9kYnVzX2NyZWRlbnRpYWxzX2FkZF9hZHRfYXVkaXRfZGF0YSAgICAgICAoREJ1c0NyZWRlbnRpYWxzICAgICpjcmVkZW50aWFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgKmF1ZGl0X2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19pbnQzMl90ICAgICAgICBzaXplKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90ICAgICAgX2RidXNfY3JlZGVudGlhbHNfaW5jbHVkZSAgICAgICAgICAgICAgICAgIChEQnVzQ3JlZGVudGlhbHMgICAgKmNyZWRlbnRpYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDcmVkZW50aWFsVHlwZSAgdHlwZSk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX3BpZF90ICAgICAgIF9kYnVzX2NyZWRlbnRpYWxzX2dldF9waWQgICAgICAgICAgICAgICAgICAoREJ1c0NyZWRlbnRpYWxzICAgICpjcmVkZW50aWFscyk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX3VpZF90ICAgICAgIF9kYnVzX2NyZWRlbnRpYWxzX2dldF91bml4X3VpZCAgICAgICAgICAgICAoREJ1c0NyZWRlbnRpYWxzICAgICpjcmVkZW50aWFscyk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitjb25zdCBjaGFyKiAgICAgIF9kYnVzX2NyZWRlbnRpYWxzX2dldF93aW5kb3dzX3NpZCAgICAgICAgICAoREJ1c0NyZWRlbnRpYWxzICAgICpjcmVkZW50aWFscyk7Citjb25zdCBjaGFyICogICAgIF9kYnVzX2NyZWRlbnRpYWxzX2dldF9saW51eF9zZWN1cml0eV9sYWJlbCAoREJ1c0NyZWRlbnRpYWxzICAgICpjcmVkZW50aWFscyk7Cit2b2lkICogICAgICAgICAgIF9kYnVzX2NyZWRlbnRpYWxzX2dldF9hZHRfYXVkaXRfZGF0YSAgICAgICAoREJ1c0NyZWRlbnRpYWxzICAgICpjcmVkZW50aWFscyk7CitkYnVzX2ludDMyX3QgICAgIF9kYnVzX2NyZWRlbnRpYWxzX2dldF9hZHRfYXVkaXRfZGF0YV9zaXplICAoREJ1c0NyZWRlbnRpYWxzICAgICpjcmVkZW50aWFscyk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCAgICAgIF9kYnVzX2NyZWRlbnRpYWxzX2FyZV9zdXBlcnNldCAgICAgICAgICAgICAoREJ1c0NyZWRlbnRpYWxzICAgICpjcmVkZW50aWFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ3JlZGVudGlhbHMgICAgKnBvc3NpYmxlX3N1YnNldCk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCAgICAgIF9kYnVzX2NyZWRlbnRpYWxzX2FyZV9lbXB0eSAgICAgICAgICAgICAgICAoREJ1c0NyZWRlbnRpYWxzICAgICpjcmVkZW50aWFscyk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCAgICAgIF9kYnVzX2NyZWRlbnRpYWxzX2FyZV9hbm9ueW1vdXMgICAgICAgICAgICAoREJ1c0NyZWRlbnRpYWxzICAgICpjcmVkZW50aWFscyk7CitkYnVzX2Jvb2xfdCAgICAgIF9kYnVzX2NyZWRlbnRpYWxzX2FkZF9jcmVkZW50aWFscyAgICAgICAgICAoREJ1c0NyZWRlbnRpYWxzICAgICpjcmVkZW50aWFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ3JlZGVudGlhbHMgICAgKm90aGVyX2NyZWRlbnRpYWxzKTsKKy8qIG11c3Qgc2lsZW50bHkgYWxsb3cgJ3doaWNoJyB0byBub3QgZXhpc3QgKi8KK2RidXNfYm9vbF90ICAgICAgX2RidXNfY3JlZGVudGlhbHNfYWRkX2NyZWRlbnRpYWwgICAgICAgICAgIChEQnVzQ3JlZGVudGlhbHMgICAgKmNyZWRlbnRpYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDcmVkZW50aWFsVHlwZSAgd2hpY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0NyZWRlbnRpYWxzICAgICpvdGhlcl9jcmVkZW50aWFscyk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCit2b2lkICAgICAgICAgICAgIF9kYnVzX2NyZWRlbnRpYWxzX2NsZWFyICAgICAgICAgICAgICAgICAgICAoREJ1c0NyZWRlbnRpYWxzICAgICpjcmVkZW50aWFscyk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitEQnVzQ3JlZGVudGlhbHMqIF9kYnVzX2NyZWRlbnRpYWxzX2NvcHkgICAgICAgICAgICAgICAgICAgICAoREJ1c0NyZWRlbnRpYWxzICAgICpjcmVkZW50aWFscyk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCAgICAgIF9kYnVzX2NyZWRlbnRpYWxzX3NhbWVfdXNlciAgICAgICAgICAgICAgICAoREJ1c0NyZWRlbnRpYWxzICAgICpjcmVkZW50aWFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ3JlZGVudGlhbHMgICAgKm90aGVyX2NyZWRlbnRpYWxzKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90ICAgICAgX2RidXNfY3JlZGVudGlhbHNfdG9fc3RyaW5nX2FwcGVuZCAgICAgICAgIChEQnVzQ3JlZGVudGlhbHMgICAgKmNyZWRlbnRpYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgICAqc3RyaW5nKTsKKworREJVU19FTkRfREVDTFMKKworI2VuZGlmIC8qIERCVVNfQ1JFREVOVElBTFNfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLWRhdGFzbG90LmMgYi9kYnVzL2RidXMtZGF0YXNsb3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGIzYmZjCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLWRhdGFzbG90LmMKQEAgLTAsMCArMSw0NjIgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1kYXRhc2xvdC5jICBzdG9yaW5nIGRhdGEgb24gb2JqZWN0cworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLWRhdGFzbG90LmgiCisjaW5jbHVkZSAiZGJ1cy10aHJlYWRzLWludGVybmFsLmgiCisKKy8qKgorICogQGRlZmdyb3VwIERCdXNEYXRhU2xvdCBEYXRhIHNsb3RzCisgKiBAaW5ncm91cCAgREJ1c0ludGVybmFscworICogQGJyaWVmIFN0b3JpbmcgZGF0YSBieSBJRAorICoKKyAqIFR5cGVzIGFuZCBmdW5jdGlvbnMgcmVsYXRlZCB0byBzdG9yaW5nIGRhdGEgYnkgYW4KKyAqIGFsbG9jYXRlZCBJRC4gVGhpcyBpcyB1c2VkIGZvciBkYnVzX2Nvbm5lY3Rpb25fc2V0X2RhdGEoKSwKKyAqIGRidXNfc2VydmVyX3NldF9kYXRhKCksIGV0Yy4gCisgKiBAeworICovCisKKy8qKgorICogSW5pdGlhbGl6ZXMgYSBkYXRhIHNsb3QgYWxsb2NhdG9yIG9iamVjdCwgdXNlZCB0byBhc3NpZ24KKyAqIGludGVnZXIgSURzIGZvciBkYXRhIHNsb3RzLgorICoKKyAqIEBwYXJhbSBhbGxvY2F0b3IgdGhlIGFsbG9jYXRvciB0byBpbml0aWFsaXplCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19kYXRhX3Nsb3RfYWxsb2NhdG9yX2luaXQgKERCdXNEYXRhU2xvdEFsbG9jYXRvciAqYWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzR2xvYmFsTG9jayAgICAgICAgIGxvY2spCit7CisgIGFsbG9jYXRvci0+YWxsb2NhdGVkX3Nsb3RzID0gTlVMTDsKKyAgYWxsb2NhdG9yLT5uX2FsbG9jYXRlZF9zbG90cyA9IDA7CisgIGFsbG9jYXRvci0+bl91c2VkX3Nsb3RzID0gMDsKKyAgYWxsb2NhdG9yLT5sb2NrID0gbG9jazsKKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBBbGxvY2F0ZXMgYW4gaW50ZWdlciBJRCB0byBiZSB1c2VkIGZvciBzdG9yaW5nIGRhdGEKKyAqIGluIGEgI0RCdXNEYXRhU2xvdExpc3QuIElmIHRoZSB2YWx1ZSBhdCAqc2xvdF9pZF9wIGlzCisgKiBub3QgLTEsIHRoaXMgZnVuY3Rpb24ganVzdCBpbmNyZW1lbnRzIHRoZSByZWZjb3VudCBmb3IKKyAqIHRoZSBleGlzdGluZyBzbG90IElELiBJZiB0aGUgdmFsdWUgaXMgLTEsIGEgbmV3IHNsb3QgSUQKKyAqIGlzIGFsbG9jYXRlZCBhbmQgc3RvcmVkIGF0ICpzbG90X2lkX3AuCisgKiAKKyAqIEBwYXJhbSBhbGxvY2F0b3IgdGhlIGFsbG9jYXRvcgorICogQHBhcmFtIHNsb3RfaWRfcCBhZGRyZXNzIHRvIGZpbGwgd2l0aCB0aGUgc2xvdCBJRAorICogQHJldHVybnMgI1RSVUUgb24gc3VjY2VzcworICovCitkYnVzX2Jvb2xfdAorX2RidXNfZGF0YV9zbG90X2FsbG9jYXRvcl9hbGxvYyAoREJ1c0RhdGFTbG90QWxsb2NhdG9yICphbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2ludDMyX3QgICAgICAgICAgKnNsb3RfaWRfcCkKK3sKKyAgZGJ1c19pbnQzMl90IHNsb3Q7CisKKyAgaWYgKCFfZGJ1c19sb2NrIChhbGxvY2F0b3ItPmxvY2spKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoKnNsb3RfaWRfcCA+PSAwKQorICAgIHsKKyAgICAgIHNsb3QgPSAqc2xvdF9pZF9wOworICAgICAgCisgICAgICBfZGJ1c19hc3NlcnQgKHNsb3QgPCBhbGxvY2F0b3ItPm5fYWxsb2NhdGVkX3Nsb3RzKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoYWxsb2NhdG9yLT5hbGxvY2F0ZWRfc2xvdHNbc2xvdF0uc2xvdF9pZCA9PSBzbG90KTsKKyAgICAgIAorICAgICAgYWxsb2NhdG9yLT5hbGxvY2F0ZWRfc2xvdHNbc2xvdF0ucmVmY291bnQgKz0gMTsKKworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIF9kYnVzX2Fzc2VydCAoKnNsb3RfaWRfcCA8IDApOworICAKKyAgaWYgKGFsbG9jYXRvci0+bl91c2VkX3Nsb3RzIDwgYWxsb2NhdG9yLT5uX2FsbG9jYXRlZF9zbG90cykKKyAgICB7CisgICAgICBzbG90ID0gMDsKKyAgICAgIHdoaWxlIChzbG90IDwgYWxsb2NhdG9yLT5uX2FsbG9jYXRlZF9zbG90cykKKyAgICAgICAgeworICAgICAgICAgIGlmIChhbGxvY2F0b3ItPmFsbG9jYXRlZF9zbG90c1tzbG90XS5zbG90X2lkIDwgMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgYWxsb2NhdG9yLT5hbGxvY2F0ZWRfc2xvdHNbc2xvdF0uc2xvdF9pZCA9IHNsb3Q7CisgICAgICAgICAgICAgIGFsbG9jYXRvci0+YWxsb2NhdGVkX3Nsb3RzW3Nsb3RdLnJlZmNvdW50ID0gMTsKKyAgICAgICAgICAgICAgYWxsb2NhdG9yLT5uX3VzZWRfc2xvdHMgKz0gMTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgKytzbG90OworICAgICAgICB9CisKKyAgICAgIF9kYnVzX2Fzc2VydCAoc2xvdCA8IGFsbG9jYXRvci0+bl9hbGxvY2F0ZWRfc2xvdHMpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIERCdXNBbGxvY2F0ZWRTbG90ICp0bXA7CisgICAgICAKKyAgICAgIHNsb3QgPSAtMTsKKyAgICAgIHRtcCA9IGRidXNfcmVhbGxvYyAoYWxsb2NhdG9yLT5hbGxvY2F0ZWRfc2xvdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiAoREJ1c0FsbG9jYXRlZFNsb3QpICogKGFsbG9jYXRvci0+bl9hbGxvY2F0ZWRfc2xvdHMgKyAxKSk7CisgICAgICBpZiAodG1wID09IE5VTEwpCisgICAgICAgIGdvdG8gb3V0OworCisgICAgICBhbGxvY2F0b3ItPmFsbG9jYXRlZF9zbG90cyA9IHRtcDsKKyAgICAgIHNsb3QgPSBhbGxvY2F0b3ItPm5fYWxsb2NhdGVkX3Nsb3RzOworICAgICAgYWxsb2NhdG9yLT5uX2FsbG9jYXRlZF9zbG90cyArPSAxOworICAgICAgYWxsb2NhdG9yLT5uX3VzZWRfc2xvdHMgKz0gMTsKKyAgICAgIGFsbG9jYXRvci0+YWxsb2NhdGVkX3Nsb3RzW3Nsb3RdLnNsb3RfaWQgPSBzbG90OworICAgICAgYWxsb2NhdG9yLT5hbGxvY2F0ZWRfc2xvdHNbc2xvdF0ucmVmY291bnQgPSAxOworICAgIH0KKworICBfZGJ1c19hc3NlcnQgKHNsb3QgPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAoc2xvdCA8IGFsbG9jYXRvci0+bl9hbGxvY2F0ZWRfc2xvdHMpOworICBfZGJ1c19hc3NlcnQgKCpzbG90X2lkX3AgPCAwKTsKKyAgX2RidXNfYXNzZXJ0IChhbGxvY2F0b3ItPmFsbG9jYXRlZF9zbG90c1tzbG90XS5zbG90X2lkID09IHNsb3QpOworICBfZGJ1c19hc3NlcnQgKGFsbG9jYXRvci0+YWxsb2NhdGVkX3Nsb3RzW3Nsb3RdLnJlZmNvdW50ID09IDEpOworICAKKyAgKnNsb3RfaWRfcCA9IHNsb3Q7CisgIAorICBfZGJ1c192ZXJib3NlICgiQWxsb2NhdGVkIHNsb3QgJWQgb24gYWxsb2NhdG9yICVwIHRvdGFsICVkIHNsb3RzIGFsbG9jYXRlZCAlZCB1c2VkXG4iLAorICAgICAgICAgICAgICAgICBzbG90LCBhbGxvY2F0b3IsIGFsbG9jYXRvci0+bl9hbGxvY2F0ZWRfc2xvdHMsIGFsbG9jYXRvci0+bl91c2VkX3Nsb3RzKTsKKyAgCisgb3V0OgorICBfZGJ1c191bmxvY2sgKGFsbG9jYXRvci0+bG9jayk7CisgIHJldHVybiBzbG90ID49IDA7Cit9CisKKy8qKgorICogRGVhbGxvY2F0ZXMgYW4gSUQgcHJldmlvdXNseSBhbGxvY2F0ZWQgd2l0aAorICogX2RidXNfZGF0YV9zbG90X2FsbG9jYXRvcl9hbGxvYygpLiAgRXhpc3RpbmcgZGF0YSBzdG9yZWQgb24KKyAqIGV4aXN0aW5nICNEQnVzRGF0YVNsb3RMaXN0IG9iamVjdHMgd2l0aCB0aGlzIElEIHdpbGwgYmUgZnJlZWQgd2hlbiB0aGUKKyAqIGRhdGEgbGlzdCBpcyBmaW5hbGl6ZWQsIGJ1dCBtYXkgbm90IGJlIHJldHJpZXZlZCAoYW5kIG1heSBvbmx5IGJlCisgKiByZXBsYWNlZCBpZiBzb21lb25lIGVsc2UgcmVhbGxvY2F0ZXMgdGhlIHNsb3QpLgorICogVGhlIHNsb3QgdmFsdWUgaXMgcmVzZXQgdG8gLTEgaWYgdGhpcyBpcyB0aGUgbGFzdCB1bnJlZi4KKyAqCisgKiBAcGFyYW0gYWxsb2NhdG9yIHRoZSBhbGxvY2F0b3IKKyAqIEBwYXJhbSBzbG90X2lkX3AgYWRkcmVzcyB3aGVyZSB3ZSBzdG9yZSB0aGUgc2xvdAorICovCit2b2lkCitfZGJ1c19kYXRhX3Nsb3RfYWxsb2NhdG9yX2ZyZWUgKERCdXNEYXRhU2xvdEFsbG9jYXRvciAqYWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2ludDMyX3QgICAgICAgICAgKnNsb3RfaWRfcCkKK3sKKyAgaWYgKCFfZGJ1c19sb2NrIChhbGxvY2F0b3ItPmxvY2spKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIndlIHNob3VsZCBoYXZlIGluaXRpYWxpemVkIGdsb2JhbCBsb2NrcyAiCisgICAgICAgICJiZWZvcmUgd2UgYWxsb2NhdGVkIHRoaXMgc2xvdCIpOworCisgIF9kYnVzX2Fzc2VydCAoKnNsb3RfaWRfcCA8IGFsbG9jYXRvci0+bl9hbGxvY2F0ZWRfc2xvdHMpOworICBfZGJ1c19hc3NlcnQgKGFsbG9jYXRvci0+YWxsb2NhdGVkX3Nsb3RzWypzbG90X2lkX3BdLnNsb3RfaWQgPT0gKnNsb3RfaWRfcCk7CisgIF9kYnVzX2Fzc2VydCAoYWxsb2NhdG9yLT5hbGxvY2F0ZWRfc2xvdHNbKnNsb3RfaWRfcF0ucmVmY291bnQgPiAwKTsKKworICBhbGxvY2F0b3ItPmFsbG9jYXRlZF9zbG90c1sqc2xvdF9pZF9wXS5yZWZjb3VudCAtPSAxOworCisgIGlmIChhbGxvY2F0b3ItPmFsbG9jYXRlZF9zbG90c1sqc2xvdF9pZF9wXS5yZWZjb3VudCA+IDApCisgICAgeworICAgICAgX2RidXNfdW5sb2NrIChhbGxvY2F0b3ItPmxvY2spOworICAgICAgcmV0dXJuOworICAgIH0KKworICAvKiByZWZjb3VudCBpcyAwLCBmcmVlIHRoZSBzbG90ICovCisgIF9kYnVzX3ZlcmJvc2UgKCJGcmVlaW5nIHNsb3QgJWQgb24gYWxsb2NhdG9yICVwIHRvdGFsICVkIGFsbG9jYXRlZCAlZCB1c2VkXG4iLAorICAgICAgICAgICAgICAgICAqc2xvdF9pZF9wLCBhbGxvY2F0b3IsIGFsbG9jYXRvci0+bl9hbGxvY2F0ZWRfc2xvdHMsIGFsbG9jYXRvci0+bl91c2VkX3Nsb3RzKTsKKyAgCisgIGFsbG9jYXRvci0+YWxsb2NhdGVkX3Nsb3RzWypzbG90X2lkX3BdLnNsb3RfaWQgPSAtMTsKKyAgKnNsb3RfaWRfcCA9IC0xOworICAKKyAgYWxsb2NhdG9yLT5uX3VzZWRfc2xvdHMgLT0gMTsKKyAgCisgIGlmIChhbGxvY2F0b3ItPm5fdXNlZF9zbG90cyA9PSAwKQorICAgIHsKKyAgICAgIGRidXNfZnJlZSAoYWxsb2NhdG9yLT5hbGxvY2F0ZWRfc2xvdHMpOworICAgICAgYWxsb2NhdG9yLT5hbGxvY2F0ZWRfc2xvdHMgPSBOVUxMOworICAgICAgYWxsb2NhdG9yLT5uX2FsbG9jYXRlZF9zbG90cyA9IDA7CisgICAgfQorCisgIF9kYnVzX3VubG9jayAoYWxsb2NhdG9yLT5sb2NrKTsKK30KKworLyoqCisgKiBJbml0aWFsaXplcyBhIHNsb3QgbGlzdC4KKyAqIEBwYXJhbSBsaXN0IHRoZSBsaXN0IHRvIGluaXRpYWxpemUuCisgKi8KK3ZvaWQKK19kYnVzX2RhdGFfc2xvdF9saXN0X2luaXQgKERCdXNEYXRhU2xvdExpc3QgKmxpc3QpCit7CisgIGxpc3QtPnNsb3RzID0gTlVMTDsKKyAgbGlzdC0+bl9zbG90cyA9IDA7Cit9CisKKy8qKgorICogU3RvcmVzIGEgcG9pbnRlciBpbiB0aGUgZGF0YSBzbG90IGxpc3QsIGFsb25nIHdpdGggYW4gb3B0aW9uYWwKKyAqIGZ1bmN0aW9uIHRvIGJlIHVzZWQgZm9yIGZyZWVpbmcgdGhlIGRhdGEgd2hlbiB0aGUgZGF0YSBpcyBzZXQKKyAqIGFnYWluLCBvciB3aGVuIHRoZSBzbG90IGxpc3QgaXMgZmluYWxpemVkLiBUaGUgc2xvdCBudW1iZXIgbXVzdAorICogaGF2ZSBiZWVuIGFsbG9jYXRlZCB3aXRoIF9kYnVzX2RhdGFfc2xvdF9hbGxvY2F0b3JfYWxsb2MoKSBmb3IgdGhlCisgKiBzYW1lIGFsbG9jYXRvciBwYXNzZWQgaW4gaGVyZS4gVGhlIHNhbWUgYWxsb2NhdG9yIGhhcyB0byBiZSB1c2VkCisgKiB3aXRoIHRoZSBzbG90IGxpc3QgZXZlcnkgdGltZS4KKyAqCisgKiBAcGFyYW0gYWxsb2NhdG9yIHRoZSBhbGxvY2F0b3IgdG8gdXNlCisgKiBAcGFyYW0gbGlzdCB0aGUgZGF0YSBzbG90IGxpc3QKKyAqIEBwYXJhbSBzbG90IHRoZSBzbG90IG51bWJlcgorICogQHBhcmFtIGRhdGEgdGhlIGRhdGEgdG8gc3RvcmUKKyAqIEBwYXJhbSBmcmVlX2RhdGFfZnVuYyBmaW5hbGl6ZXIgZnVuY3Rpb24gZm9yIHRoZSBkYXRhCisgKiBAcGFyYW0gb2xkX2ZyZWVfZnVuYyBmcmVlIGZ1bmN0aW9uIGZvciBhbnkgcHJldmlvdXNseS1leGlzdGluZyBkYXRhCisgKiBAcGFyYW0gb2xkX2RhdGEgcHJldmlvdXNseS1leGlzdGluZyBkYXRhLCBzaG91bGQgYmUgZnJlZWQgd2l0aCBvbGRfZnJlZV9mdW5jCisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGVyZSB3YXMgZW5vdWdoIG1lbW9yeSB0byBzdG9yZSB0aGUgZGF0YQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfZGF0YV9zbG90X2xpc3Rfc2V0ICAoREJ1c0RhdGFTbG90QWxsb2NhdG9yICphbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRGF0YVNsb3RMaXN0ICAgICAgKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgIHNsb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRnJlZUZ1bmN0aW9uICAgICAgIGZyZWVfZGF0YV9mdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgICAgICpvbGRfZnJlZV9mdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgKipvbGRfZGF0YSkKK3sKKyNpZm5kZWYgREJVU19ESVNBQkxFX0FTU0VSVAorICAvKiBXZSBuZWVkIHRvIHRha2UgdGhlIGFsbG9jYXRvciBsb2NrIGhlcmUsIGJlY2F1c2UgdGhlIGFsbG9jYXRvciBjb3VsZAorICAgKiBiZSBlLmcuIHJlYWxsb2MoKWluZyBhbGxvY2F0ZWRfc2xvdHMuIFdlIGF2b2lkIGRvaW5nIHRoaXMgaWYgYXNzZXJ0cworICAgKiBhcmUgZGlzYWJsZWQsIHNpbmNlIHRoZW4gdGhlIGFzc2VydHMgYXJlIGVtcHR5LgorICAgKi8KKyAgaWYgKCFfZGJ1c19sb2NrIChhbGxvY2F0b3ItPmxvY2spKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIndlIHNob3VsZCBoYXZlIGluaXRpYWxpemVkIGdsb2JhbCBsb2NrcyAiCisgICAgICAgICJiZWZvcmUgd2UgYWxsb2NhdGVkIHRoaXMgc2xvdCIpOworCisgIF9kYnVzX2Fzc2VydCAoc2xvdCA8IGFsbG9jYXRvci0+bl9hbGxvY2F0ZWRfc2xvdHMpOworICBfZGJ1c19hc3NlcnQgKGFsbG9jYXRvci0+YWxsb2NhdGVkX3Nsb3RzW3Nsb3RdLnNsb3RfaWQgPT0gc2xvdCk7CisgIF9kYnVzX3VubG9jayAoYWxsb2NhdG9yLT5sb2NrKTsKKyNlbmRpZgorICAKKyAgaWYgKHNsb3QgPj0gbGlzdC0+bl9zbG90cykKKyAgICB7CisgICAgICBEQnVzRGF0YVNsb3QgKnRtcDsKKyAgICAgIGludCBpOworICAgICAgCisgICAgICB0bXAgPSBkYnVzX3JlYWxsb2MgKGxpc3QtPnNsb3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgKERCdXNEYXRhU2xvdCkgKiAoc2xvdCArIDEpKTsKKyAgICAgIGlmICh0bXAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgCisgICAgICBsaXN0LT5zbG90cyA9IHRtcDsKKyAgICAgIGkgPSBsaXN0LT5uX3Nsb3RzOworICAgICAgbGlzdC0+bl9zbG90cyA9IHNsb3QgKyAxOworICAgICAgd2hpbGUgKGkgPCBsaXN0LT5uX3Nsb3RzKQorICAgICAgICB7CisgICAgICAgICAgbGlzdC0+c2xvdHNbaV0uZGF0YSA9IE5VTEw7CisgICAgICAgICAgbGlzdC0+c2xvdHNbaV0uZnJlZV9kYXRhX2Z1bmMgPSBOVUxMOworICAgICAgICAgICsraTsKKyAgICAgICAgfQorICAgIH0KKworICBfZGJ1c19hc3NlcnQgKHNsb3QgPCBsaXN0LT5uX3Nsb3RzKTsKKworICAqb2xkX2RhdGEgPSBsaXN0LT5zbG90c1tzbG90XS5kYXRhOworICAqb2xkX2ZyZWVfZnVuYyA9IGxpc3QtPnNsb3RzW3Nsb3RdLmZyZWVfZGF0YV9mdW5jOworCisgIGxpc3QtPnNsb3RzW3Nsb3RdLmRhdGEgPSBkYXRhOworICBsaXN0LT5zbG90c1tzbG90XS5mcmVlX2RhdGFfZnVuYyA9IGZyZWVfZGF0YV9mdW5jOworCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIFJldHJpZXZlcyBkYXRhIHByZXZpb3VzbHkgc2V0IHdpdGggX2RidXNfZGF0YV9zbG90X2xpc3Rfc2V0X2RhdGEoKS4KKyAqIFRoZSBzbG90IG11c3Qgc3RpbGwgYmUgYWxsb2NhdGVkIChtdXN0IG5vdCBoYXZlIGJlZW4gZnJlZWQpLgorICoKKyAqIEBwYXJhbSBhbGxvY2F0b3IgdGhlIGFsbG9jYXRvciBzbG90IHdhcyBhbGxvY2F0ZWQgZnJvbQorICogQHBhcmFtIGxpc3QgdGhlIGRhdGEgc2xvdCBsaXN0CisgKiBAcGFyYW0gc2xvdCB0aGUgc2xvdCB0byBnZXQgZGF0YSBmcm9tCisgKiBAcmV0dXJucyB0aGUgZGF0YSwgb3IgI05VTEwgaWYgbm90IGZvdW5kCisgKi8KK3ZvaWQqCitfZGJ1c19kYXRhX3Nsb3RfbGlzdF9nZXQgIChEQnVzRGF0YVNsb3RBbGxvY2F0b3IgKmFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNEYXRhU2xvdExpc3QgICAgICAqbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgc2xvdCkKK3sKKyNpZm5kZWYgREJVU19ESVNBQkxFX0FTU0VSVAorICAvKiBXZSBuZWVkIHRvIHRha2UgdGhlIGFsbG9jYXRvciBsb2NrIGhlcmUsIGJlY2F1c2UgdGhlIGFsbG9jYXRvciBjb3VsZAorICAgKiBiZSBlLmcuIHJlYWxsb2MoKWluZyBhbGxvY2F0ZWRfc2xvdHMuIFdlIGF2b2lkIGRvaW5nIHRoaXMgaWYgYXNzZXJ0cworICAgKiBhcmUgZGlzYWJsZWQsIHNpbmNlIHRoZW4gdGhlIGFzc2VydHMgYXJlIGVtcHR5LgorICAgKi8KKyAgaWYgKCFfZGJ1c19sb2NrIChhbGxvY2F0b3ItPmxvY2spKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIndlIHNob3VsZCBoYXZlIGluaXRpYWxpemVkIGdsb2JhbCBsb2NrcyAiCisgICAgICAgICJiZWZvcmUgd2UgYWxsb2NhdGVkIHRoaXMgc2xvdCIpOworCisgIF9kYnVzX2Fzc2VydCAoc2xvdCA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChzbG90IDwgYWxsb2NhdG9yLT5uX2FsbG9jYXRlZF9zbG90cyk7CisgIF9kYnVzX2Fzc2VydCAoYWxsb2NhdG9yLT5hbGxvY2F0ZWRfc2xvdHNbc2xvdF0uc2xvdF9pZCA9PSBzbG90KTsKKyAgX2RidXNfdW5sb2NrIChhbGxvY2F0b3ItPmxvY2spOworI2VuZGlmCisKKyAgaWYgKHNsb3QgPj0gbGlzdC0+bl9zbG90cykKKyAgICByZXR1cm4gTlVMTDsKKyAgZWxzZQorICAgIHJldHVybiBsaXN0LT5zbG90c1tzbG90XS5kYXRhOworfQorCisvKioKKyAqIEZyZWVzIGFsbCBkYXRhIHNsb3RzIGNvbnRhaW5lZCBpbiB0aGUgbGlzdCwgY2FsbGluZworICogYXBwbGljYXRpb24tcHJvdmlkZWQgZnJlZSBmdW5jdGlvbnMgaWYgdGhleSBleGlzdC4KKyAqCisgKiBAcGFyYW0gbGlzdCB0aGUgbGlzdCB0byBjbGVhcgorICovCit2b2lkCitfZGJ1c19kYXRhX3Nsb3RfbGlzdF9jbGVhciAoREJ1c0RhdGFTbG90TGlzdCAqbGlzdCkKK3sKKyAgaW50IGk7CisKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgbGlzdC0+bl9zbG90cykKKyAgICB7CisgICAgICBpZiAobGlzdC0+c2xvdHNbaV0uZnJlZV9kYXRhX2Z1bmMpCisgICAgICAgICgqIGxpc3QtPnNsb3RzW2ldLmZyZWVfZGF0YV9mdW5jKSAobGlzdC0+c2xvdHNbaV0uZGF0YSk7CisgICAgICBsaXN0LT5zbG90c1tpXS5kYXRhID0gTlVMTDsKKyAgICAgIGxpc3QtPnNsb3RzW2ldLmZyZWVfZGF0YV9mdW5jID0gTlVMTDsKKyAgICAgICsraTsKKyAgICB9Cit9CisKKy8qKgorICogRnJlZXMgdGhlIGRhdGEgc2xvdCBsaXN0IGFuZCBhbGwgZGF0YSBzbG90cyBjb250YWluZWQKKyAqIGluIGl0LCBjYWxsaW5nIGFwcGxpY2F0aW9uLXByb3ZpZGVkIGZyZWUgZnVuY3Rpb25zCisgKiBpZiB0aGV5IGV4aXN0LgorICoKKyAqIEBwYXJhbSBsaXN0IHRoZSBsaXN0IHRvIGZyZWUKKyAqLwordm9pZAorX2RidXNfZGF0YV9zbG90X2xpc3RfZnJlZSAoREJ1c0RhdGFTbG90TGlzdCAqbGlzdCkKK3sKKyAgX2RidXNfZGF0YV9zbG90X2xpc3RfY2xlYXIgKGxpc3QpOworICAKKyAgZGJ1c19mcmVlIChsaXN0LT5zbG90cyk7CisgIGxpc3QtPnNsb3RzID0gTlVMTDsKKyAgbGlzdC0+bl9zbG90cyA9IDA7Cit9CisKKy8qKiBAfSAqLworCisjaWZkZWYgREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMKKyNpbmNsdWRlICJkYnVzLXRlc3QuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorCitzdGF0aWMgaW50IGZyZWVfY291bnRlcjsKKworc3RhdGljIHZvaWQKK3Rlc3RfZnJlZV9zbG90X2RhdGFfZnVuYyAodm9pZCAqZGF0YSkKK3sKKyAgaW50IGkgPSBfREJVU19QT0lOVEVSX1RPX0lOVCAoZGF0YSk7CisKKyAgX2RidXNfYXNzZXJ0IChmcmVlX2NvdW50ZXIgPT0gaSk7CisgICsrZnJlZV9jb3VudGVyOworfQorCisvKioKKyAqIFRlc3QgZnVuY3Rpb24gZm9yIGRhdGEgc2xvdHMKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2RhdGFfc2xvdF90ZXN0ICh2b2lkKQoreworICBEQnVzRGF0YVNsb3RBbGxvY2F0b3IgYWxsb2NhdG9yOworICBEQnVzRGF0YVNsb3RMaXN0IGxpc3Q7CisgIGludCBpOworICBEQnVzRnJlZUZ1bmN0aW9uIG9sZF9mcmVlX2Z1bmM7CisgIHZvaWQgKm9sZF9kYXRhOworCisgIGlmICghX2RidXNfZGF0YV9zbG90X2FsbG9jYXRvcl9pbml0ICgmYWxsb2NhdG9yLCBfREJVU19MT0NLX3NlcnZlcl9zbG90cykpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5IGZvciBhbGxvY2F0b3IiKTsKKworICBfZGJ1c19kYXRhX3Nsb3RfbGlzdF9pbml0ICgmbGlzdCk7CisKKyNkZWZpbmUgTl9TTE9UUyAxMDAKKworICBpID0gMDsKKyAgd2hpbGUgKGkgPCBOX1NMT1RTKQorICAgIHsKKyAgICAgIC8qIHdlIGRvbid0IHJlYWxseSB3YW50IGFwcHMgdG8gcmVseSBvbiB0aGlzIG9yZGVyZWQKKyAgICAgICAqIGFsbG9jYXRpb24sIGJ1dCBpdCBzaW1wbGlmaWVzIHRoaW5ncyB0byByZWx5IG9uIGl0CisgICAgICAgKiBoZXJlLgorICAgICAgICovCisgICAgICBkYnVzX2ludDMyX3QgdG1wID0gLTE7CisKKyAgICAgIF9kYnVzX2RhdGFfc2xvdF9hbGxvY2F0b3JfYWxsb2MgKCZhbGxvY2F0b3IsICZ0bXApOworCisgICAgICBpZiAodG1wICE9IGkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImRpZCBub3QgYWxsb2NhdGUgc2xvdHMgaW4gbnVtZXJpYyBvcmRlciIpOworCisgICAgICArK2k7CisgICAgfQorCisgIGkgPSAwOworICB3aGlsZSAoaSA8IE5fU0xPVFMpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19kYXRhX3Nsb3RfbGlzdF9zZXQgKCZhbGxvY2F0b3IsICZsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0RCVVNfSU5UX1RPX1BPSU5URVIgKGkpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X2ZyZWVfc2xvdF9kYXRhX2Z1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9sZF9mcmVlX2Z1bmMsICZvbGRfZGF0YSkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSB0byBzZXQgZGF0YSIpOworCisgICAgICBfZGJ1c19hc3NlcnQgKG9sZF9mcmVlX2Z1bmMgPT0gTlVMTCk7CisgICAgICBfZGJ1c19hc3NlcnQgKG9sZF9kYXRhID09IE5VTEwpOworCisgICAgICBfZGJ1c19hc3NlcnQgKF9kYnVzX2RhdGFfc2xvdF9saXN0X2dldCAoJmFsbG9jYXRvciwgJmxpc3QsIGkpID09CisgICAgICAgICAgICAgICAgICAgIF9EQlVTX0lOVF9UT19QT0lOVEVSIChpKSk7CisgICAgICAKKyAgICAgICsraTsKKyAgICB9CisKKyAgZnJlZV9jb3VudGVyID0gMDsKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgTl9TTE9UUykKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX2RhdGFfc2xvdF9saXN0X3NldCAoJmFsbG9jYXRvciwgJmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfREJVU19JTlRfVE9fUE9JTlRFUiAoaSksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfZnJlZV9zbG90X2RhdGFfZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2xkX2ZyZWVfZnVuYywgJm9sZF9kYXRhKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5IHRvIHNldCBkYXRhIik7CisKKyAgICAgIF9kYnVzX2Fzc2VydCAob2xkX2ZyZWVfZnVuYyA9PSB0ZXN0X2ZyZWVfc2xvdF9kYXRhX2Z1bmMpOworICAgICAgX2RidXNfYXNzZXJ0IChfREJVU19QT0lOVEVSX1RPX0lOVCAob2xkX2RhdGEpID09IGkpOworCisgICAgICAoKiBvbGRfZnJlZV9mdW5jKSAob2xkX2RhdGEpOworICAgICAgX2RidXNfYXNzZXJ0IChpID09IChmcmVlX2NvdW50ZXIgLSAxKSk7CisKKyAgICAgIF9kYnVzX2Fzc2VydCAoX2RidXNfZGF0YV9zbG90X2xpc3RfZ2V0ICgmYWxsb2NhdG9yLCAmbGlzdCwgaSkgPT0KKyAgICAgICAgICAgICAgICAgICAgX0RCVVNfSU5UX1RPX1BPSU5URVIgKGkpKTsKKyAgICAgIAorICAgICAgKytpOworICAgIH0KKworICBmcmVlX2NvdW50ZXIgPSAwOworICBfZGJ1c19kYXRhX3Nsb3RfbGlzdF9mcmVlICgmbGlzdCk7CisKKyAgX2RidXNfYXNzZXJ0IChOX1NMT1RTID09IGZyZWVfY291bnRlcik7CisKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgTl9TTE9UUykKKyAgICB7CisgICAgICBkYnVzX2ludDMyX3QgdG1wID0gaTsKKyAgICAgIAorICAgICAgX2RidXNfZGF0YV9zbG90X2FsbG9jYXRvcl9mcmVlICgmYWxsb2NhdG9yLCAmdG1wKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAodG1wID09IC0xKTsKKyAgICAgICsraTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKyNlbmRpZiAvKiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUyAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLWRhdGFzbG90LmggYi9kYnVzL2RidXMtZGF0YXNsb3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTA0ZmNiCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLWRhdGFzbG90LmgKQEAgLTAsMCArMSw5OCBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLWRhdGFzbG90LmggIHN0b3JpbmcgZGF0YSBvbiBvYmplY3RzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzIFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKyNpZm5kZWYgREJVU19EQVRBU0xPVF9ICisjZGVmaW5lIERCVVNfREFUQVNMT1RfSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWludGVybmFscy5oPgorCitEQlVTX0JFR0lOX0RFQ0xTCisKK3R5cGVkZWYgc3RydWN0IERCdXNEYXRhU2xvdEFsbG9jYXRvciBEQnVzRGF0YVNsb3RBbGxvY2F0b3I7Cit0eXBlZGVmIHN0cnVjdCBEQnVzRGF0YVNsb3RMaXN0IERCdXNEYXRhU2xvdExpc3Q7CisKKy8qKiBPcGFxdWUgdHlwZWRlZiBmb3IgREJ1c0RhdGFTbG90ICovCit0eXBlZGVmIHN0cnVjdCBEQnVzRGF0YVNsb3QgREJ1c0RhdGFTbG90OworLyoqIERCdXNEYXRhU2xvdCBpcyB1c2VkIHRvIHN0b3JlIGFwcGxpY2F0aW9uIGRhdGEgb24gdGhlIGNvbm5lY3Rpb24gKi8KK3N0cnVjdCBEQnVzRGF0YVNsb3QKK3sKKyAgdm9pZCAqZGF0YTsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUaGUgYXBwbGljYXRpb24gZGF0YSAqLworICBEQnVzRnJlZUZ1bmN0aW9uIGZyZWVfZGF0YV9mdW5jOyAvKio8IEZyZWUgdGhlIGFwcGxpY2F0aW9uIGRhdGEgKi8KK307CisKK3R5cGVkZWYgc3RydWN0IERCdXNBbGxvY2F0ZWRTbG90IERCdXNBbGxvY2F0ZWRTbG90OworCisvKiogQW4gYWxsb2NhdGVkIHNsb3QgZm9yIHN0b3JpbmcgZGF0YQorICovCitzdHJ1Y3QgREJ1c0FsbG9jYXRlZFNsb3QKK3sKKyAgZGJ1c19pbnQzMl90IHNsb3RfaWQ7ICAvKio8IElEIG9mIHRoaXMgc2xvdCAqLworICBpbnQgICAgICAgICAgcmVmY291bnQ7IC8qKjwgTnVtYmVyIG9mIHVzZXMgb2YgdGhlIHNsb3QgKi8KK307CisKKy8qKgorICogQW4gYWxsb2NhdG9yIHRoYXQgdHJhY2tzIGEgc2V0IG9mIHNsb3QgSURzLgorICovCitzdHJ1Y3QgREJ1c0RhdGFTbG90QWxsb2NhdG9yCit7CisgIERCdXNBbGxvY2F0ZWRTbG90ICphbGxvY2F0ZWRfc2xvdHM7IC8qKjwgQWxsb2NhdGVkIHNsb3RzICovCisgIGludCAgbl9hbGxvY2F0ZWRfc2xvdHM7IC8qKjwgbnVtYmVyIG9mIHNsb3RzIG1hbGxvYydkICovCisgIGludCAgbl91c2VkX3Nsb3RzOyAgICAgIC8qKjwgbnVtYmVyIG9mIHNsb3RzIHVzZWQgKi8KKyAgREJ1c0dsb2JhbExvY2sgbG9jazsgICAgLyoqPCBpbmRleCBvZiB0aHJlYWQgbG9jayAqLworfTsKKworI2RlZmluZSBfREJVU19EQVRBX1NMT1RfQUxMT0NBVE9SX0lOSVQoeCkgeyBOVUxMLCAwLCAwLCB4IH0KKworLyoqCisgKiBEYXRhIHN0cnVjdHVyZSB0aGF0IHN0b3JlcyB0aGUgYWN0dWFsIHVzZXIgZGF0YSBzZXQgYXQgYSBnaXZlbgorICogc2xvdC4KKyAqLworc3RydWN0IERCdXNEYXRhU2xvdExpc3QKK3sKKyAgREJ1c0RhdGFTbG90ICpzbG90czsgICAvKio8IERhdGEgc2xvdHMgKi8KKyAgaW50ICAgICAgICAgICBuX3Nsb3RzOyAvKio8IFNsb3RzIHdlIGhhdmUgc3RvcmFnZSBmb3IgaW4gZGF0YV9zbG90cyAqLworfTsKKworZGJ1c19ib29sX3QgX2RidXNfZGF0YV9zbG90X2FsbG9jYXRvcl9pbml0ICAoREJ1c0RhdGFTbG90QWxsb2NhdG9yICAqYWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0dsb2JhbExvY2sgICAgICAgICAgbG9jayk7CitkYnVzX2Jvb2xfdCBfZGJ1c19kYXRhX3Nsb3RfYWxsb2NhdG9yX2FsbG9jIChEQnVzRGF0YVNsb3RBbGxvY2F0b3IgICphbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICpzbG90X2lkX3ApOwordm9pZCAgICAgICAgX2RidXNfZGF0YV9zbG90X2FsbG9jYXRvcl9mcmVlICAoREJ1c0RhdGFTbG90QWxsb2NhdG9yICAqYWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAqc2xvdF9pZF9wKTsKK3ZvaWQgICAgICAgIF9kYnVzX2RhdGFfc2xvdF9saXN0X2luaXQgICAgICAgKERCdXNEYXRhU2xvdExpc3QgICAgICAgKmxpc3QpOworZGJ1c19ib29sX3QgX2RidXNfZGF0YV9zbG90X2xpc3Rfc2V0ICAgICAgICAoREJ1c0RhdGFTbG90QWxsb2NhdG9yICAqYWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0RhdGFTbG90TGlzdCAgICAgICAqbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgIHNsb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgICAgICAgZnJlZV9kYXRhX2Z1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRnJlZUZ1bmN0aW9uICAgICAgICpvbGRfZnJlZV9mdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICoqb2xkX2RhdGEpOwordm9pZCogICAgICAgX2RidXNfZGF0YV9zbG90X2xpc3RfZ2V0ICAgICAgICAoREJ1c0RhdGFTbG90QWxsb2NhdG9yICAqYWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0RhdGFTbG90TGlzdCAgICAgICAqbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgIHNsb3QpOwordm9pZCAgICAgICAgX2RidXNfZGF0YV9zbG90X2xpc3RfY2xlYXIgICAgICAoREJ1c0RhdGFTbG90TGlzdCAgICAgICAqbGlzdCk7Cit2b2lkICAgICAgICBfZGJ1c19kYXRhX3Nsb3RfbGlzdF9mcmVlICAgICAgIChEQnVzRGF0YVNsb3RMaXN0ICAgICAgICpsaXN0KTsKKworCitEQlVTX0VORF9ERUNMUworCisjZW5kaWYgLyogREJVU19EQVRBU0xPVF9IICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtZXJyb3JzLmMgYi9kYnVzL2RidXMtZXJyb3JzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWEzMDVjYQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1lcnJvcnMuYwpAQCAtMCwwICsxLDQzNSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLWVycm9ycy5jIEVycm9yIHJlcG9ydGluZworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwNCAgUmVkIEhhdCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgIENvZGVGYWN0b3J5IEFCCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLWVycm9ycy5oIgorI2luY2x1ZGUgImRidXMtaW50ZXJuYWxzLmgiCisjaW5jbHVkZSAiZGJ1cy1zdHJpbmcuaCIKKyNpbmNsdWRlICJkYnVzLXByb3RvY29sLmgiCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKy8qKgorICogQGRlZmdyb3VwIERCdXNFcnJvckludGVybmFscyBFcnJvciByZXBvcnRpbmcgaW50ZXJuYWxzCisgKiBAaW5ncm91cCAgREJ1c0ludGVybmFscworICogQGJyaWVmIEVycm9yIHJlcG9ydGluZyBpbnRlcm5hbHMKKyAqIEB7CisgKi8KKworLyoqCisgKiBAZGVmIERCVVNfRVJST1JfSU5JVAorICoKKyAqIEV4cGFuZHMgdG8gYSBzdWl0YWJsZSBpbml0aWFsaXplciBmb3IgYSBEQnVzRXJyb3Igb24gdGhlIHN0YWNrLgorICogRGVjbGFyaW5nIGEgREJ1c0Vycm9yIHdpdGg6CisgKgorICogQGNvZGUKKyAqIERCdXNFcnJvciBlcnJvciA9IERCVVNfRVJST1JfSU5JVDsKKyAqCisgKiBkb190aGluZ3Nfd2l0aCAoJmVycm9yKTsKKyAqIEBlbmRjb2RlCisgKgorICogaXMgYSBtb3JlIGNvbmNpc2UgZm9ybSBvZjoKKyAqCisgKiBAY29kZQorICogREJ1c0Vycm9yIGVycm9yOworICoKKyAqIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKyAqIGRvX3RoaW5nc193aXRoICgmZXJyb3IpOworICogQGVuZGNvZGUKKyAqLworCisvKioKKyAqIEludGVybmFscyBvZiBEQnVzRXJyb3IKKyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgY2hhciAqbmFtZTsgLyoqPCBlcnJvciBuYW1lICovCisgIGNoYXIgKm1lc3NhZ2U7IC8qKjwgZXJyb3IgbWVzc2FnZSAqLworCisgIHVuc2lnbmVkIGludCBjb25zdF9tZXNzYWdlIDogMTsgLyoqPCBNZXNzYWdlIGlzIG5vdCBvd25lZCBieSBEQnVzRXJyb3IgKi8KKworICB1bnNpZ25lZCBpbnQgZHVtbXkyIDogMTsgLyoqPCBwbGFjZWhvbGRlciAqLworICB1bnNpZ25lZCBpbnQgZHVtbXkzIDogMTsgLyoqPCBwbGFjZWhvbGRlciAqLworICB1bnNpZ25lZCBpbnQgZHVtbXk0IDogMTsgLyoqPCBwbGFjZWhvbGRlciAqLworICB1bnNpZ25lZCBpbnQgZHVtbXk1IDogMTsgLyoqPCBwbGFjZWhvbGRlciAqLworCisgIHZvaWQgKnBhZGRpbmcxOyAvKio8IHBsYWNlaG9sZGVyICovCisgIAorfSBEQnVzUmVhbEVycm9yOworCitfREJVU19TVEFUSUNfQVNTRVJUIChzaXplb2YgKERCdXNSZWFsRXJyb3IpID09IHNpemVvZiAoREJ1c0Vycm9yKSk7CisKKy8qKgorICogUmV0dXJucyBhIGxvbmdlciBtZXNzYWdlIGRlc2NyaWJpbmcgYW4gZXJyb3IgbmFtZS4KKyAqIElmIHRoZSBlcnJvciBuYW1lIGlzIHVua25vd24sIHJldHVybnMgdGhlIG5hbWUKKyAqIGl0c2VsZi4KKyAqCisgKiBAcGFyYW0gZXJyb3IgdGhlIGVycm9yIHRvIGRlc2NyaWJlCisgKiBAcmV0dXJucyBhIGNvbnN0YW50IHN0cmluZyBkZXNjcmliaW5nIHRoZSBlcnJvci4KKyAqLworc3RhdGljIGNvbnN0IGNoYXIqCittZXNzYWdlX2Zyb21fZXJyb3IgKGNvbnN0IGNoYXIgKmVycm9yKQoreworICBpZiAoc3RyY21wIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQpID09IDApCisgICAgcmV0dXJuICJVbmtub3duIGVycm9yIjsKKyAgZWxzZSBpZiAoc3RyY21wIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlkpID09IDApCisgICAgcmV0dXJuICJOb3QgZW5vdWdoIG1lbW9yeSBhdmFpbGFibGUiOworICBlbHNlIGlmIChzdHJjbXAgKGVycm9yLCBEQlVTX0VSUk9SX0lPX0VSUk9SKSA9PSAwKQorICAgIHJldHVybiAiRXJyb3IgcmVhZGluZyBvciB3cml0aW5nIGRhdGEiOworICBlbHNlIGlmIChzdHJjbXAgKGVycm9yLCBEQlVTX0VSUk9SX0JBRF9BRERSRVNTKSA9PSAwKQorICAgIHJldHVybiAiQ291bGQgbm90IHBhcnNlIGFkZHJlc3MiOworICBlbHNlIGlmIChzdHJjbXAgKGVycm9yLCBEQlVTX0VSUk9SX05PVF9TVVBQT1JURUQpID09IDApCisgICAgcmV0dXJuICJGZWF0dXJlIG5vdCBzdXBwb3J0ZWQiOworICBlbHNlIGlmIChzdHJjbXAgKGVycm9yLCBEQlVTX0VSUk9SX0xJTUlUU19FWENFRURFRCkgPT0gMCkKKyAgICByZXR1cm4gIlJlc291cmNlIGxpbWl0cyBleGNlZWRlZCI7CisgIGVsc2UgaWYgKHN0cmNtcCAoZXJyb3IsIERCVVNfRVJST1JfQUNDRVNTX0RFTklFRCkgPT0gMCkKKyAgICByZXR1cm4gIlBlcm1pc3Npb24gZGVuaWVkIjsKKyAgZWxzZSBpZiAoc3RyY21wIChlcnJvciwgREJVU19FUlJPUl9BVVRIX0ZBSUxFRCkgPT0gMCkKKyAgICByZXR1cm4gIkNvdWxkIG5vdCBhdXRoZW50aWNhdGUgdG8gc2VydmVyIjsKKyAgZWxzZSBpZiAoc3RyY21wIChlcnJvciwgREJVU19FUlJPUl9OT19TRVJWRVIpID09IDApCisgICAgcmV0dXJuICJObyBzZXJ2ZXIgYXZhaWxhYmxlIGF0IGFkZHJlc3MiOworICBlbHNlIGlmIChzdHJjbXAgKGVycm9yLCBEQlVTX0VSUk9SX1RJTUVPVVQpID09IDApCisgICAgcmV0dXJuICJDb25uZWN0aW9uIHRpbWVkIG91dCI7CisgIGVsc2UgaWYgKHN0cmNtcCAoZXJyb3IsIERCVVNfRVJST1JfTk9fTkVUV09SSykgPT0gMCkKKyAgICByZXR1cm4gIk5ldHdvcmsgdW5hdmFpbGFibGUiOworICBlbHNlIGlmIChzdHJjbXAgKGVycm9yLCBEQlVTX0VSUk9SX0FERFJFU1NfSU5fVVNFKSA9PSAwKQorICAgIHJldHVybiAiQWRkcmVzcyBhbHJlYWR5IGluIHVzZSI7CisgIGVsc2UgaWYgKHN0cmNtcCAoZXJyb3IsIERCVVNfRVJST1JfRElTQ09OTkVDVEVEKSA9PSAwKQorICAgIHJldHVybiAiRGlzY29ubmVjdGVkLiI7CisgIGVsc2UgaWYgKHN0cmNtcCAoZXJyb3IsIERCVVNfRVJST1JfSU5WQUxJRF9BUkdTKSA9PSAwKQorICAgIHJldHVybiAiSW52YWxpZCBhcmd1bWVudHMuIjsKKyAgZWxzZSBpZiAoc3RyY21wIChlcnJvciwgREJVU19FUlJPUl9OT19SRVBMWSkgPT0gMCkKKyAgICByZXR1cm4gIkRpZCBub3QgZ2V0IGEgcmVwbHkgbWVzc2FnZS4iOworICBlbHNlIGlmIChzdHJjbXAgKGVycm9yLCBEQlVTX0VSUk9SX0ZJTEVfTk9UX0ZPVU5EKSA9PSAwKQorICAgIHJldHVybiAiRmlsZSBkb2Vzbid0IGV4aXN0LiI7CisgIGVsc2UgaWYgKHN0cmNtcCAoZXJyb3IsIERCVVNfRVJST1JfT0JKRUNUX1BBVEhfSU5fVVNFKSA9PSAwKQorICAgIHJldHVybiAiT2JqZWN0IHBhdGggYWxyZWFkeSBpbiB1c2UiOworICBlbHNlCisgICAgcmV0dXJuIGVycm9yOworfQorCisvKiogQH0gKi8gLyogRW5kIG9mIGludGVybmFscyAqLworCisvKioKKyAqIEBkZWZncm91cCBEQnVzRXJyb3JzIEVycm9yIHJlcG9ydGluZworICogQGluZ3JvdXAgIERCdXMKKyAqIEBicmllZiBFcnJvciByZXBvcnRpbmcKKyAqCisgKiBUeXBlcyBhbmQgZnVuY3Rpb25zIHJlbGF0ZWQgdG8gcmVwb3J0aW5nIGVycm9ycy4KKyAqCisgKgorICogSW4gZXNzZW5jZSBELUJ1cyBlcnJvciByZXBvcnRpbmcgd29ya3MgYXMgZm9sbG93czoKKyAqCisgKiBAY29kZQorICogREJ1c0Vycm9yIGVycm9yOworICogZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworICogZGJ1c19zb21lX2Z1bmN0aW9uIChhcmcxLCBhcmcyLCAmZXJyb3IpOworICogaWYgKGRidXNfZXJyb3JfaXNfc2V0ICgmZXJyb3IpKQorICogICB7CisgKiAgICAgZnByaW50ZiAoc3RkZXJyLCAiYW4gZXJyb3Igb2NjdXJyZWQ6ICVzXG4iLCBlcnJvci5tZXNzYWdlKTsKKyAqICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgKiAgIH0KKyAqIEBlbmRjb2RlCisgKgorICogQnkgY29udmVudGlvbiwgYWxsIGZ1bmN0aW9ucyBhbGxvdyAjTlVMTCBpbnN0ZWFkIG9mIGEgREJ1c0Vycm9yKiwKKyAqIHNvIGNhbGxlcnMgd2hvIGRvbid0IGNhcmUgYWJvdXQgdGhlIGVycm9yIGNhbiBpZ25vcmUgaXQuCisgKiAKKyAqIFRoZXJlIGFyZSBzb21lIHJ1bGVzLiBBbiBlcnJvciBwYXNzZWQgdG8gYSBELUJ1cyBmdW5jdGlvbiBtdXN0CisgKiBhbHdheXMgYmUgdW5zZXQ7IHlvdSBjYW4ndCBwYXNzIGluIGFuIGVycm9yIHRoYXQncyBhbHJlYWR5IHNldC4gIElmCisgKiBhIGZ1bmN0aW9uIGhhcyBhIHJldHVybiBjb2RlIGluZGljYXRpbmcgd2hldGhlciBhbiBlcnJvciBvY2N1cnJlZCwKKyAqIGFuZCBhbHNvIGEgI0RCdXNFcnJvciBwYXJhbWV0ZXIsIHRoZW4gdGhlIGVycm9yIHdpbGwgYWx3YXlzIGJlIHNldAorICogaWYgYW5kIG9ubHkgaWYgdGhlIHJldHVybiBjb2RlIGluZGljYXRlcyBhbiBlcnJvciBvY2N1cnJlZC4gaS5lLgorICogdGhlIHJldHVybiBjb2RlIGFuZCB0aGUgZXJyb3IgYXJlIG5ldmVyIGdvaW5nIHRvIGRpc2FncmVlLgorICoKKyAqIEFuIGVycm9yIG9ubHkgbmVlZHMgdG8gYmUgZnJlZWQgaWYgaXQncyBiZWVuIHNldCwgbm90IGlmCisgKiBpdCdzIG1lcmVseSBiZWVuIGluaXRpYWxpemVkLgorICoKKyAqIFlvdSBjYW4gY2hlY2sgdGhlIHNwZWNpZmljIGVycm9yIHRoYXQgb2NjdXJyZWQgdXNpbmcKKyAqIGRidXNfZXJyb3JfaGFzX25hbWUoKS4KKyAqIAorICogRXJyb3JzIHdpbGwgbm90IGJlIHNldCBmb3IgcHJvZ3JhbW1pbmcgZXJyb3JzLCBzdWNoIGFzIHBhc3NpbmcKKyAqIGludmFsaWQgYXJndW1lbnRzIHRvIHRoZSBsaWJkYnVzIEFQSS4gSW5zdGVhZCwgbGliZGJ1cyB3aWxsIHByaW50CisgKiB3YXJuaW5ncywgZXhpdCBvbiBhIGZhaWxlZCBhc3NlcnRpb24sIG9yIGV2ZW4gY3Jhc2ggaW4gdGhvc2UgY2FzZXMKKyAqIChpbiBvdGhlciB3b3JkcywgaW5jb3JyZWN0IHVzZSBvZiB0aGUgQVBJIHJlc3VsdHMgaW4gdW5kZWZpbmVkCisgKiBiZWhhdmlvciwgcG9zc2libHkgYWNjb21wYW5pZWQgYnkgaGVscGZ1bCBkZWJ1Z2dpbmcgb3V0cHV0IGlmCisgKiB5b3UncmUgbHVja3kpLgorICogCisgKiBAeworICovCisKKy8qKgorICogSW5pdGlhbGl6ZXMgYSBEQnVzRXJyb3Igc3RydWN0dXJlLiBEb2VzIG5vdCBhbGxvY2F0ZSBhbnkgbWVtb3J5OworICogdGhlIGVycm9yIG9ubHkgbmVlZHMgdG8gYmUgZnJlZWQgaWYgaXQgaXMgc2V0IGF0IHNvbWUgcG9pbnQuCisgKgorICogQHBhcmFtIGVycm9yIHRoZSBEQnVzRXJyb3IuCisgKi8KK3ZvaWQKK2RidXNfZXJyb3JfaW5pdCAoREJ1c0Vycm9yICplcnJvcikKK3sKKyAgREJ1c1JlYWxFcnJvciAqcmVhbDsKKworICBfREJVU19TVEFUSUNfQVNTRVJUIChzaXplb2YgKERCdXNFcnJvcikgPT0gc2l6ZW9mIChEQnVzUmVhbEVycm9yKSk7CisKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKGVycm9yICE9IE5VTEwpOworCisgIHJlYWwgPSAoREJ1c1JlYWxFcnJvciAqKWVycm9yOworICAKKyAgcmVhbC0+bmFtZSA9IE5VTEw7ICAKKyAgcmVhbC0+bWVzc2FnZSA9IE5VTEw7CisKKyAgcmVhbC0+Y29uc3RfbWVzc2FnZSA9IFRSVUU7Cit9CisKKy8qKgorICogRnJlZXMgYW4gZXJyb3IgdGhhdCdzIGJlZW4gc2V0IChvciBqdXN0IGluaXRpYWxpemVkKSwKKyAqIHRoZW4gcmVpbml0aWFsaXplcyB0aGUgZXJyb3IgYXMgaW4gZGJ1c19lcnJvcl9pbml0KCkuCisgKgorICogQHBhcmFtIGVycm9yIG1lbW9yeSB3aGVyZSB0aGUgZXJyb3IgaXMgc3RvcmVkLgorICovCit2b2lkCitkYnVzX2Vycm9yX2ZyZWUgKERCdXNFcnJvciAqZXJyb3IpCit7CisgIERCdXNSZWFsRXJyb3IgKnJlYWw7CisKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKGVycm9yICE9IE5VTEwpOworICAKKyAgcmVhbCA9IChEQnVzUmVhbEVycm9yICopZXJyb3I7CisKKyAgaWYgKCFyZWFsLT5jb25zdF9tZXNzYWdlKQorICAgIHsKKyAgICAgIGRidXNfZnJlZSAocmVhbC0+bmFtZSk7CisgICAgICBkYnVzX2ZyZWUgKHJlYWwtPm1lc3NhZ2UpOworICAgIH0KKworICBkYnVzX2Vycm9yX2luaXQgKGVycm9yKTsKK30KKworLyoqCisgKiBBc3NpZ25zIGFuIGVycm9yIG5hbWUgYW5kIG1lc3NhZ2UgdG8gYSBEQnVzRXJyb3IuICBEb2VzIG5vdGhpbmcgaWYKKyAqIGVycm9yIGlzICNOVUxMLiBUaGUgbWVzc2FnZSBtYXkgYmUgI05VTEwsIHdoaWNoIG1lYW5zIGEgZGVmYXVsdAorICogbWVzc2FnZSB3aWxsIGJlIGRlZHVjZWQgZnJvbSB0aGUgbmFtZS4gVGhlIGRlZmF1bHQgbWVzc2FnZSB3aWxsIGJlCisgKiB0b3RhbGx5IHVzZWxlc3MsIHRob3VnaCwgc28gdXNpbmcgYSAjTlVMTCBtZXNzYWdlIGlzIG5vdCByZWNvbW1lbmRlZC4KKyAqCisgKiBCZWNhdXNlIHRoaXMgZnVuY3Rpb24gZG9lcyBub3QgY29weSB0aGUgZXJyb3IgbmFtZSBvciBtZXNzYWdlLCB5b3UKKyAqIG11c3QgZW5zdXJlIHRoZSBuYW1lIGFuZCBtZXNzYWdlIGFyZSBnbG9iYWwgZGF0YSB0aGF0IHdvbid0IGJlCisgKiBmcmVlZC4gWW91IHByb2JhYmx5IHdhbnQgZGJ1c19zZXRfZXJyb3IoKSBpbnN0ZWFkLCBpbiBtb3N0IGNhc2VzLgorICogCisgKiBAcGFyYW0gZXJyb3IgdGhlIGVycm9yIG9yICNOVUxMCisgKiBAcGFyYW0gbmFtZSB0aGUgZXJyb3IgbmFtZSAobm90IGNvcGllZCEhISkKKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBlcnJvciBtZXNzYWdlIChub3QgY29waWVkISEhKQorICovCit2b2lkCitkYnVzX3NldF9lcnJvcl9jb25zdCAoREJ1c0Vycm9yICAqZXJyb3IsCisJCSAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisJCSAgICAgIGNvbnN0IGNoYXIgKm1lc3NhZ2UpCit7CisgIERCdXNSZWFsRXJyb3IgKnJlYWw7CisKKyAgX2RidXNfcmV0dXJuX2lmX2Vycm9yX2lzX3NldCAoZXJyb3IpOworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAobmFtZSAhPSBOVUxMKTsKKyAgCisgIGlmIChlcnJvciA9PSBOVUxMKQorICAgIHJldHVybjsKKworICBfZGJ1c19hc3NlcnQgKGVycm9yLT5uYW1lID09IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKGVycm9yLT5tZXNzYWdlID09IE5VTEwpOworCisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgbWVzc2FnZSA9IG1lc3NhZ2VfZnJvbV9lcnJvciAobmFtZSk7CisgIAorICByZWFsID0gKERCdXNSZWFsRXJyb3IgKillcnJvcjsKKyAgCisgIHJlYWwtPm5hbWUgPSAoY2hhciopIG5hbWU7CisgIHJlYWwtPm1lc3NhZ2UgPSAoY2hhciAqKW1lc3NhZ2U7CisgIHJlYWwtPmNvbnN0X21lc3NhZ2UgPSBUUlVFOworfQorCisvKioKKyAqIE1vdmVzIGFuIGVycm9yIHNyYyBpbnRvIGRlc3QsIGZyZWVpbmcgc3JjIGFuZAorICogb3ZlcndyaXRpbmcgZGVzdC4gQm90aCBzcmMgYW5kIGRlc3QgbXVzdCBiZSBpbml0aWFsaXplZC4KKyAqIHNyYyBpcyByZWluaXRpYWxpemVkIHRvIGFuIGVtcHR5IGVycm9yLiBkZXN0IG1heSBub3QKKyAqIGNvbnRhaW4gYW4gZXhpc3RpbmcgZXJyb3IuIElmIHRoZSBkZXN0aW5hdGlvbiBpcworICogI05VTEwsIGp1c3QgZnJlZXMgYW5kIHJlaW5pdHMgdGhlIHNvdXJjZSBlcnJvci4KKyAqIAorICogQHBhcmFtIHNyYyB0aGUgc291cmNlIGVycm9yCisgKiBAcGFyYW0gZGVzdCB0aGUgZGVzdGluYXRpb24gZXJyb3Igb3IgI05VTEwKKyAqLwordm9pZAorZGJ1c19tb3ZlX2Vycm9yIChEQnVzRXJyb3IgKnNyYywKKyAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICpkZXN0KQoreworICBfZGJ1c19yZXR1cm5faWZfZXJyb3JfaXNfc2V0IChkZXN0KTsKKworICBpZiAoZGVzdCkKKyAgICB7CisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKGRlc3QpOworICAgICAgKmRlc3QgPSAqc3JjOworICAgICAgZGJ1c19lcnJvcl9pbml0IChzcmMpOworICAgIH0KKyAgZWxzZQorICAgIGRidXNfZXJyb3JfZnJlZSAoc3JjKTsKK30KKworLyoqCisgKiBDaGVja3Mgd2hldGhlciB0aGUgZXJyb3IgaXMgc2V0IGFuZCBoYXMgdGhlIGdpdmVuCisgKiBuYW1lLgorICogQHBhcmFtIGVycm9yIHRoZSBlcnJvcgorICogQHBhcmFtIG5hbWUgdGhlIG5hbWUKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSBnaXZlbiBuYW1lZCBlcnJvciBvY2N1cnJlZAorICovCitkYnVzX2Jvb2xfdAorZGJ1c19lcnJvcl9oYXNfbmFtZSAoY29uc3QgREJ1c0Vycm9yICplcnJvciwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAqbmFtZSkKK3sKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChlcnJvciAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAobmFtZSAhPSBOVUxMLCBGQUxTRSk7CisKKyAgX2RidXNfYXNzZXJ0ICgoZXJyb3ItPm5hbWUgIT0gTlVMTCAmJiBlcnJvci0+bWVzc2FnZSAhPSBOVUxMKSB8fAorICAgICAgICAgICAgICAgIChlcnJvci0+bmFtZSA9PSBOVUxMICYmIGVycm9yLT5tZXNzYWdlID09IE5VTEwpKTsKKyAgCisgIGlmIChlcnJvci0+bmFtZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIERCdXNTdHJpbmcgc3RyMSwgc3RyMjsKKyAgICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmc3RyMSwgZXJyb3ItPm5hbWUpOworICAgICAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZzdHIyLCBuYW1lKTsKKyAgICAgIHJldHVybiBfZGJ1c19zdHJpbmdfZXF1YWwgKCZzdHIxLCAmc3RyMik7CisgICAgfQorICBlbHNlCisgICAgcmV0dXJuIEZBTFNFOworfQorCisvKioKKyAqIENoZWNrcyB3aGV0aGVyIGFuIGVycm9yIG9jY3VycmVkICh0aGUgZXJyb3IgaXMgc2V0KS4KKyAqCisgKiBAcGFyYW0gZXJyb3IgdGhlIGVycm9yIG9iamVjdAorICogQHJldHVybnMgI1RSVUUgaWYgYW4gZXJyb3Igb2NjdXJyZWQKKyAqLworZGJ1c19ib29sX3QKK2RidXNfZXJyb3JfaXNfc2V0IChjb25zdCBEQnVzRXJyb3IgKmVycm9yKQoreworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGVycm9yICE9IE5VTEwsIEZBTFNFKTsgIAorICBfZGJ1c19hc3NlcnQgKChlcnJvci0+bmFtZSAhPSBOVUxMICYmIGVycm9yLT5tZXNzYWdlICE9IE5VTEwpIHx8CisgICAgICAgICAgICAgICAgKGVycm9yLT5uYW1lID09IE5VTEwgJiYgZXJyb3ItPm1lc3NhZ2UgPT0gTlVMTCkpOworICByZXR1cm4gZXJyb3ItPm5hbWUgIT0gTlVMTDsKK30KKworLyoqCisgKiBBc3NpZ25zIGFuIGVycm9yIG5hbWUgYW5kIG1lc3NhZ2UgdG8gYSBEQnVzRXJyb3IuCisgKiBEb2VzIG5vdGhpbmcgaWYgZXJyb3IgaXMgI05VTEwuCisgKgorICogVGhlIGZvcm1hdCBtYXkgYmUgI05VTEwsIHdoaWNoIG1lYW5zIGEgKHByZXR0eSBtdWNoIHVzZWxlc3MpCisgKiBkZWZhdWx0IG1lc3NhZ2Ugd2lsbCBiZSBkZWR1Y2VkIGZyb20gdGhlIG5hbWUuIFRoaXMgaXMgbm90IGEgZ29vZAorICogaWRlYSwganVzdCBnbyBhaGVhZCBhbmQgcHJvdmlkZSBhIHVzZWZ1bCBlcnJvciBtZXNzYWdlLiBJdCB3b24ndAorICogaHVydCB5b3UuCisgKgorICogSWYgbm8gbWVtb3J5IGNhbiBiZSBhbGxvY2F0ZWQgZm9yIHRoZSBlcnJvciBtZXNzYWdlLCAKKyAqIGFuIG91dC1vZi1tZW1vcnkgZXJyb3IgbWVzc2FnZSB3aWxsIGJlIHNldCBpbnN0ZWFkLgorICoKKyAqIEBwYXJhbSBlcnJvciB0aGUgZXJyb3Iub3IgI05VTEwKKyAqIEBwYXJhbSBuYW1lIHRoZSBlcnJvciBuYW1lCisgKiBAcGFyYW0gZm9ybWF0IHByaW50Zi1zdHlsZSBmb3JtYXQgc3RyaW5nLgorICovCit2b2lkCitkYnVzX3NldF9lcnJvciAoREJ1c0Vycm9yICAqZXJyb3IsCisJCWNvbnN0IGNoYXIgKm5hbWUsCisJCWNvbnN0IGNoYXIgKmZvcm1hdCwKKwkJLi4uKQoreworICB2YV9saXN0IGFyZ3M7CisgIAorICBpZiAoZXJyb3IgPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAgLyogaXQncyBhIGJ1ZyB0byBwaWxlIHVwIGVycm9ycyAqLworICBfZGJ1c19yZXR1cm5faWZfZXJyb3JfaXNfc2V0IChlcnJvcik7CisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChuYW1lICE9IE5VTEwpOworCisgIHZhX3N0YXJ0IChhcmdzLCBmb3JtYXQpOworICBfZGJ1c19zZXRfZXJyb3JfdmFsaXN0IChlcnJvciwgbmFtZSwgZm9ybWF0LCBhcmdzKTsKKyAgdmFfZW5kIChhcmdzKTsKK30KKwordm9pZAorX2RidXNfc2V0X2Vycm9yX3ZhbGlzdCAoREJ1c0Vycm9yICAqZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCAgICAgYXJncykKK3sKKyAgREJ1c1JlYWxFcnJvciAqcmVhbDsKKyAgREJ1c1N0cmluZyBzdHI7CisKKyAgX2RidXNfYXNzZXJ0IChuYW1lICE9IE5VTEwpOworCisgIGlmIChlcnJvciA9PSBOVUxMKQorICAgIHJldHVybjsKKworICBfZGJ1c19hc3NlcnQgKGVycm9yLT5uYW1lID09IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKGVycm9yLT5tZXNzYWdlID09IE5VTEwpOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZzdHIpKQorICAgIGdvdG8gbm9tZW07CisgIAorICBpZiAoZm9ybWF0ID09IE5VTEwpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlX2Zyb21fZXJyb3IgKG5hbWUpKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmc3RyKTsKKyAgICAgICAgICBnb3RvIG5vbWVtOworICAgICAgICB9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX3ByaW50Zl92YWxpc3QgKCZzdHIsIGZvcm1hdCwgYXJncykpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnN0cik7CisgICAgICAgICAgZ290byBub21lbTsKKyAgICAgICAgfQorICAgIH0KKworICByZWFsID0gKERCdXNSZWFsRXJyb3IgKillcnJvcjsKKworICBpZiAoIV9kYnVzX3N0cmluZ19zdGVhbF9kYXRhICgmc3RyLCAmcmVhbC0+bWVzc2FnZSkpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZzdHIpOworICAgICAgZ290byBub21lbTsKKyAgICB9CisgIF9kYnVzX3N0cmluZ19mcmVlICgmc3RyKTsKKyAgCisgIHJlYWwtPm5hbWUgPSBfZGJ1c19zdHJkdXAgKG5hbWUpOworICBpZiAocmVhbC0+bmFtZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfZnJlZSAocmVhbC0+bWVzc2FnZSk7CisgICAgICByZWFsLT5tZXNzYWdlID0gTlVMTDsKKyAgICAgIGdvdG8gbm9tZW07CisgICAgfQorICByZWFsLT5jb25zdF9tZXNzYWdlID0gRkFMU0U7CisKKyAgcmV0dXJuOworICAKKyBub21lbToKKyAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworfQorCisvKiogQH0gKi8gLyogRW5kIHB1YmxpYyBBUEkgKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1lcnJvcnMuaCBiL2RidXMvZGJ1cy1lcnJvcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODA0MDg1Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLWVycm9ycy5oCkBAIC0wLDAgKzEsOTAgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1lcnJvcnMuaCBFcnJvciByZXBvcnRpbmcKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgIFJlZCBIYXQgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDAzICBDb2RlRmFjdG9yeSBBQgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworI2lmICFkZWZpbmVkIChEQlVTX0lOU0lERV9EQlVTX0gpICYmICFkZWZpbmVkIChEQlVTX0NPTVBJTEFUSU9OKQorI2Vycm9yICJPbmx5IDxkYnVzL2RidXMuaD4gY2FuIGJlIGluY2x1ZGVkIGRpcmVjdGx5LCB0aGlzIGZpbGUgbWF5IGRpc2FwcGVhciBvciBjaGFuZ2UgY29udGVudHMuIgorI2VuZGlmCisKKyNpZm5kZWYgREJVU19FUlJPUl9ICisjZGVmaW5lIERCVVNfRVJST1JfSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLW1hY3Jvcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy10eXBlcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1wcm90b2NvbC5oPgorCitEQlVTX0JFR0lOX0RFQ0xTCisKKy8qKgorICogQGFkZHRvZ3JvdXAgREJ1c0Vycm9ycworICogQHsKKyAqLworCisvKiogTW9zdGx5LW9wYXF1ZSB0eXBlIHJlcHJlc2VudGluZyBhbiBlcnJvciB0aGF0IG9jY3VycmVkICovCit0eXBlZGVmIHN0cnVjdCBEQnVzRXJyb3IgREJ1c0Vycm9yOworCisvKioKKyAqIE9iamVjdCByZXByZXNlbnRpbmcgYW4gZXhjZXB0aW9uLgorICovCitzdHJ1Y3QgREJ1c0Vycm9yCit7CisgIGNvbnN0IGNoYXIgKm5hbWU7ICAgIC8qKjwgcHVibGljIGVycm9yIG5hbWUgZmllbGQgKi8KKyAgY29uc3QgY2hhciAqbWVzc2FnZTsgLyoqPCBwdWJsaWMgZXJyb3IgbWVzc2FnZSBmaWVsZCAqLworCisgIHVuc2lnbmVkIGludCBkdW1teTEgOiAxOyAvKio8IHBsYWNlaG9sZGVyICovCisgIHVuc2lnbmVkIGludCBkdW1teTIgOiAxOyAvKio8IHBsYWNlaG9sZGVyICovCisgIHVuc2lnbmVkIGludCBkdW1teTMgOiAxOyAvKio8IHBsYWNlaG9sZGVyICovCisgIHVuc2lnbmVkIGludCBkdW1teTQgOiAxOyAvKio8IHBsYWNlaG9sZGVyICovCisgIHVuc2lnbmVkIGludCBkdW1teTUgOiAxOyAvKio8IHBsYWNlaG9sZGVyICovCisKKyAgdm9pZCAqcGFkZGluZzE7IC8qKjwgcGxhY2Vob2xkZXIgKi8KK307CisKKyNkZWZpbmUgREJVU19FUlJPUl9JTklUIHsgTlVMTCwgTlVMTCwgVFJVRSwgMCwgMCwgMCwgMCwgTlVMTCB9CisKK0RCVVNfRVhQT1JUCit2b2lkICAgICAgICBkYnVzX2Vycm9yX2luaXQgICAgICAoREJ1c0Vycm9yICAgICAgICplcnJvcik7CitEQlVTX0VYUE9SVAordm9pZCAgICAgICAgZGJ1c19lcnJvcl9mcmVlICAgICAgKERCdXNFcnJvciAgICAgICAqZXJyb3IpOworREJVU19FWFBPUlQKK3ZvaWQgICAgICAgIGRidXNfc2V0X2Vycm9yICAgICAgIChEQnVzRXJyb3IgICAgICAgKmVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKSBfREJVU19HTlVDX1BSSU5URiAoMywgNCk7CitEQlVTX0VYUE9SVAordm9pZCAgICAgICAgZGJ1c19zZXRfZXJyb3JfY29uc3QgKERCdXNFcnJvciAgICAgICAqZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAqbWVzc2FnZSk7CitEQlVTX0VYUE9SVAordm9pZCAgICAgICAgZGJ1c19tb3ZlX2Vycm9yICAgICAgKERCdXNFcnJvciAgICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAqZGVzdCk7CitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgZGJ1c19lcnJvcl9oYXNfbmFtZSAgKGNvbnN0IERCdXNFcnJvciAqZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICpuYW1lKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCBkYnVzX2Vycm9yX2lzX3NldCAgICAoY29uc3QgREJ1c0Vycm9yICplcnJvcik7CisKKy8qKiBAfSAqLworCitEQlVTX0VORF9ERUNMUworCisjZW5kaWYgLyogREJVU19FUlJPUl9IICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtZmlsZS11bml4LmMgYi9kYnVzL2RidXMtZmlsZS11bml4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODMwZDNmZQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1maWxlLXVuaXguYwpAQCAtMCwwICsxLDQxNyBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLWZpbGUtdW5peC5jIHVuaXggcmVsYXRlZCBmaWxlIGltcGxlbWVudGF0aW9uIChpbnRlcm5hbCB0byBELUJ1cyBpbXBsZW1lbnRhdGlvbikKKyAqIAorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzLCAyMDA2ICBSZWQgSGF0LCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgQ29kZUZhY3RvcnkgQUIKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorCisjaW5jbHVkZSAiZGJ1cy1wcm90b2NvbC5oIgorI2luY2x1ZGUgImRidXMtZXJyb3JzLmgiCisjaW5jbHVkZSAiZGJ1cy1maWxlLmgiCisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKyNpbmNsdWRlICJkYnVzLXN5c2RlcHMuaCIKKyNpbmNsdWRlICJkYnVzLXN5c2RlcHMtdW5peC5oIgorCisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2lmbmRlZiBPX0JJTkFSWQorI2RlZmluZSBPX0JJTkFSWSAwCisjZW5kaWYKKworLyoqCisgKiBBcHBlbmRzIHRoZSBjb250ZW50cyBvZiB0aGUgZ2l2ZW4gZmlsZSB0byB0aGUgc3RyaW5nLAorICogcmV0dXJuaW5nIGVycm9yIGNvZGUuIEF0IHRoZSBtb21lbnQsIHdvbid0IG9wZW4gYSBmaWxlCisgKiBtb3JlIHRoYW4gYSBtZWdhYnl0ZSBpbiBzaXplLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZyB0byBhcHBlbmQgdG8KKyAqIEBwYXJhbSBmaWxlbmFtZSBmaWxlbmFtZSB0byBsb2FkCisgKiBAcGFyYW0gZXJyb3IgcGxhY2UgdG8gc2V0IGFuIGVycm9yCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgZXJyb3Igd2FzIHNldAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfZmlsZV9nZXRfY29udGVudHMgKERCdXNTdHJpbmcgICAgICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgaW50IGZkOworICBzdHJ1Y3Qgc3RhdCBzYjsKKyAgaW50IG9yaWdfbGVuOworICBpbnQgdG90YWw7CisgIGNvbnN0IGNoYXIgKmZpbGVuYW1lX2M7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisgIAorICBmaWxlbmFtZV9jID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChmaWxlbmFtZSk7CisgIAorICAvKiBPX0JJTkFSWSB1c2VmdWwgb24gQ3lnd2luICovCisgIGZkID0gb3BlbiAoZmlsZW5hbWVfYywgT19SRE9OTFkgfCBPX0JJTkFSWSk7CisgIGlmIChmZCA8IDApCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBvcGVuIFwiJXNcIjogJXMiLAorICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lX2MsCisgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIF9kYnVzX3ZlcmJvc2UgKCJmaWxlIGZkICVkIG9wZW5lZFxuIiwgZmQpOworICAKKyAgaWYgKGZzdGF0IChmZCwgJnNiKSA8IDApCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBzdGF0IFwiJXNcIjogJXMiLAorICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lX2MsCisgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJmc3RhdCgpIGZhaWxlZDogJXMiLAorICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICAKKyAgICAgIF9kYnVzX2Nsb3NlIChmZCwgTlVMTCk7CisgICAgICAKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKHNiLnN0X3NpemUgPiBfREJVU19PTkVfTUVHQUJZVEUpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiRmlsZSBzaXplICVsdSBvZiBcIiVzXCIgaXMgdG9vIGxhcmdlLiIsCisgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIHNiLnN0X3NpemUsIGZpbGVuYW1lX2MpOworICAgICAgX2RidXNfY2xvc2UgKGZkLCBOVUxMKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIAorICB0b3RhbCA9IDA7CisgIG9yaWdfbGVuID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHN0cik7CisgIGlmIChzYi5zdF9zaXplID4gMCAmJiBTX0lTUkVHIChzYi5zdF9tb2RlKSkKKyAgICB7CisgICAgICBpbnQgYnl0ZXNfcmVhZDsKKworICAgICAgd2hpbGUgKHRvdGFsIDwgKGludCkgc2Iuc3Rfc2l6ZSkKKyAgICAgICAgeworICAgICAgICAgIGJ5dGVzX3JlYWQgPSBfZGJ1c19yZWFkIChmZCwgc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5zdF9zaXplIC0gdG90YWwpOworICAgICAgICAgIGlmIChieXRlc19yZWFkIDw9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIHJlYWRpbmcgXCIlc1wiOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZV9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisKKyAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoInJlYWQoKSBmYWlsZWQ6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBfZGJ1c19jbG9zZSAoZmQsIE5VTEwpOworICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoc3RyLCBvcmlnX2xlbik7CisgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB0b3RhbCArPSBieXRlc19yZWFkOworICAgICAgICB9CisKKyAgICAgIF9kYnVzX2Nsb3NlIChmZCwgTlVMTCk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIGVsc2UgaWYgKHNiLnN0X3NpemUgIT0gMCkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiQ2FuIG9ubHkgb3BlbiByZWd1bGFyIGZpbGVzIGF0IHRoZSBtb21lbnQuXG4iKTsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgIlwiJXNcIiBpcyBub3QgYSByZWd1bGFyIGZpbGUiLAorICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lX2MpOworICAgICAgX2RidXNfY2xvc2UgKGZkLCBOVUxMKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfZGJ1c19jbG9zZSAoZmQsIE5VTEwpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorfQorCisvKioKKyAqIFdyaXRlcyBhIHN0cmluZyBvdXQgdG8gYSBmaWxlLiBJZiB0aGUgZmlsZSBleGlzdHMsCisgKiBpdCB3aWxsIGJlIGF0b21pY2FsbHkgb3ZlcndyaXR0ZW4gYnkgdGhlIG5ldyBkYXRhLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZyB0byB3cml0ZSBvdXQKKyAqIEBwYXJhbSBmaWxlbmFtZSB0aGUgZmlsZSB0byBzYXZlIHN0cmluZyB0bworICogQHBhcmFtIHdvcmxkX3JlYWRhYmxlIElmIHNldCwgZW5zdXJlIHRoZSBmaWxlIGlzIHdvcmxkIHJlYWRhYmxlCisgKiBAcGFyYW0gZXJyb3IgZXJyb3IgdG8gYmUgZmlsbGVkIGluIG9uIGZhaWx1cmUKKyAqIEByZXR1cm5zICNGQUxTRSBvbiBmYWlsdXJlCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zdHJpbmdfc2F2ZV90b19maWxlIChjb25zdCBEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgd29ybGRfcmVhZGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgaW50IGZkOworICBpbnQgYnl0ZXNfdG9fd3JpdGU7CisgIGNvbnN0IGNoYXIgKmZpbGVuYW1lX2M7CisgIERCdXNTdHJpbmcgdG1wX2ZpbGVuYW1lOworICBjb25zdCBjaGFyICp0bXBfZmlsZW5hbWVfYzsKKyAgaW50IHRvdGFsOworICBkYnVzX2Jvb2xfdCBuZWVkX3VubGluazsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworICAKKyAgZmQgPSAtMTsKKyAgcmV0dmFsID0gRkFMU0U7CisgIG5lZWRfdW5saW5rID0gRkFMU0U7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmdG1wX2ZpbGVuYW1lKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAoZmlsZW5hbWUsIDAsICZ0bXBfZmlsZW5hbWUsIDApKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ0bXBfZmlsZW5hbWUpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnRtcF9maWxlbmFtZSwgIi4iKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmdG1wX2ZpbGVuYW1lKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyNkZWZpbmUgTl9UTVBfRklMRU5BTUVfUkFORE9NX0JZVEVTIDgKKyAgaWYgKCFfZGJ1c19nZW5lcmF0ZV9yYW5kb21fYXNjaWkgKCZ0bXBfZmlsZW5hbWUsIE5fVE1QX0ZJTEVOQU1FX1JBTkRPTV9CWVRFUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnRtcF9maWxlbmFtZSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIAorICBmaWxlbmFtZV9jID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChmaWxlbmFtZSk7CisgIHRtcF9maWxlbmFtZV9jID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmdG1wX2ZpbGVuYW1lKTsKKworICBmZCA9IG9wZW4gKHRtcF9maWxlbmFtZV9jLCBPX1dST05MWSB8IE9fQklOQVJZIHwgT19FWENMIHwgT19DUkVBVCwKKyAgICAgICAgICAgICB3b3JsZF9yZWFkYWJsZSA/IDA2NDQgOiAwNjAwKTsKKyAgaWYgKGZkIDwgMCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGNyZWF0ZSAlczogJXMiLCB0bXBfZmlsZW5hbWVfYywKKyAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgaWYgKHdvcmxkX3JlYWRhYmxlKQorICAgIHsKKyAgICAgIC8qIEVuc3VyZSB0aGUgZmlsZSBpcyB3b3JsZCByZWFkYWJsZSBldmVuIGluIHRoZSBwcmVzZW5jZSBvZgorICAgICAgICogcG9zc2libHkgcmVzdHJpY3RpdmUgdW1hc2tzOworICAgICAgICogc2VlIGh0dHA6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvYXJjaGl2ZXMvZGJ1cy8yMDEwLVNlcHRlbWJlci8wMTMzNjcuaHRtbAorICAgICAgICovCisgICAgICBpZiAoZmNobW9kIChmZCwgMDY0NCkgPCAwKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgY2htb2QgJXM6ICVzIiwgdG1wX2ZpbGVuYW1lX2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgfQorCisgIF9kYnVzX3ZlcmJvc2UgKCJ0bXAgZmlsZSBmZCAlZCBvcGVuZWRcbiIsIGZkKTsKKyAgCisgIG5lZWRfdW5saW5rID0gVFJVRTsKKyAgCisgIHRvdGFsID0gMDsKKyAgYnl0ZXNfdG9fd3JpdGUgPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoc3RyKTsKKworICB3aGlsZSAodG90YWwgPCBieXRlc190b193cml0ZSkKKyAgICB7CisgICAgICBpbnQgYnl0ZXNfd3JpdHRlbjsKKworICAgICAgYnl0ZXNfd3JpdHRlbiA9IF9kYnVzX3dyaXRlIChmZCwgc3RyLCB0b3RhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNfdG9fd3JpdGUgLSB0b3RhbCk7CisKKyAgICAgIGlmIChieXRlc193cml0dGVuIDw9IDApCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCB3cml0ZSB0byAlczogJXMiLCB0bXBfZmlsZW5hbWVfYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICAgICAgCisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgICAgdG90YWwgKz0gYnl0ZXNfd3JpdHRlbjsKKyAgICB9CisKKyAgaWYgKGZzeW5jKGZkKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IHN5bmNocm9uaXplIGZpbGUgJXM6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICB0bXBfZmlsZW5hbWVfYywgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisKKyAgICAgIGdvdG8gb3V0OworICB9CisKKyAgaWYgKCFfZGJ1c19jbG9zZSAoZmQsIE5VTEwpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgY2xvc2UgZmlsZSAlczogJXMiLAorICAgICAgICAgICAgICAgICAgICAgIHRtcF9maWxlbmFtZV9jLCBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIGZkID0gLTE7CisgIAorICBpZiAocmVuYW1lICh0bXBfZmlsZW5hbWVfYywgZmlsZW5hbWVfYykgPCAwKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgcmVuYW1lICVzIHRvICVzOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgdG1wX2ZpbGVuYW1lX2MsIGZpbGVuYW1lX2MsCisgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBuZWVkX3VubGluayA9IEZBTFNFOworICAKKyAgcmV0dmFsID0gVFJVRTsKKyAgCisgb3V0OgorICAvKiBjbG9zZSBmaXJzdCwgdGhlbiB1bmxpbmssIHRvIHByZXZlbnQgIi5uZnMzNDIzNDIzNSIgZ2FyYmFnZQorICAgKiBmaWxlcworICAgKi8KKworICBpZiAoZmQgPj0gMCkKKyAgICBfZGJ1c19jbG9zZSAoZmQsIE5VTEwpOworICAgICAgICAKKyAgaWYgKG5lZWRfdW5saW5rICYmIHVubGluayAodG1wX2ZpbGVuYW1lX2MpIDwgMCkKKyAgICBfZGJ1c192ZXJib3NlICgiRmFpbGVkIHRvIHVubGluayB0ZW1wIGZpbGUgJXM6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgIHRtcF9maWxlbmFtZV9jLCBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnRtcF9maWxlbmFtZSk7CisKKyAgaWYgKCFyZXR2YWwpCisgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyoqIE1ha2VzIHRoZSBmaWxlIHJlYWRhYmxlIGJ5IGV2ZXJ5IHVzZXIgaW4gdGhlIHN5c3RlbS4KKyAqCisgKiBAcGFyYW0gZmlsZW5hbWUgdGhlIGZpbGVuYW1lCisgKiBAcGFyYW0gZXJyb3IgZXJyb3IgbG9jYXRpb24KKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSBmaWxlJ3MgcGVybWlzc2lvbnMgY291bGQgYmUgY2hhbmdlZC4KKyAqLworZGJ1c19ib29sX3QKK19kYnVzX21ha2VfZmlsZV93b3JsZF9yZWFkYWJsZShjb25zdCBEQnVzU3RyaW5nICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgKmVycm9yKQoreworICBjb25zdCBjaGFyICpmaWxlbmFtZV9jOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIGZpbGVuYW1lX2MgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKGZpbGVuYW1lKTsKKyAgaWYgKGNobW9kIChmaWxlbmFtZV9jLCAwNjQ0KSA9PSAtMSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBjaGFuZ2UgcGVybWlzc2lvbnMgb2YgZmlsZSAlczogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWVfYywKKyAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIHJldHVybiBUUlVFOworfQorCisvKiogQ3JlYXRlcyB0aGUgZ2l2ZW4gZmlsZSwgZmFpbGluZyBpZiB0aGUgZmlsZSBhbHJlYWR5IGV4aXN0cy4KKyAqCisgKiBAcGFyYW0gZmlsZW5hbWUgdGhlIGZpbGVuYW1lCisgKiBAcGFyYW0gZXJyb3IgZXJyb3IgbG9jYXRpb24KKyAqIEByZXR1cm5zICNUUlVFIGlmIHdlIGNyZWF0ZWQgdGhlIGZpbGUgYW5kIGl0IGRpZG4ndCBleGlzdAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfY3JlYXRlX2ZpbGVfZXhjbHVzaXZlbHkgKGNvbnN0IERCdXNTdHJpbmcgKmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICBpbnQgZmQ7CisgIGNvbnN0IGNoYXIgKmZpbGVuYW1lX2M7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisgIAorICBmaWxlbmFtZV9jID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChmaWxlbmFtZSk7CisgIAorICBmZCA9IG9wZW4gKGZpbGVuYW1lX2MsIE9fV1JPTkxZIHwgT19CSU5BUlkgfCBPX0VYQ0wgfCBPX0NSRUFULAorICAgICAgICAgICAgIDA2MDApOworICBpZiAoZmQgPCAwKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGNyZWF0ZSBmaWxlICVzOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZV9jLAorICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBfZGJ1c192ZXJib3NlICgiZXhjbHVzaXZlIGZpbGUgZmQgJWQgb3BlbmVkXG4iLCBmZCk7CisgIAorICBpZiAoIV9kYnVzX2Nsb3NlIChmZCwgTlVMTCkpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgY2xvc2UgZmlsZSAlczogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWVfYywKKyAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIAorICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBEZWxldGVzIHRoZSBnaXZlbiBmaWxlLgorICoKKyAqIEBwYXJhbSBmaWxlbmFtZSB0aGUgZmlsZW5hbWUKKyAqIEBwYXJhbSBlcnJvciBlcnJvciBsb2NhdGlvbgorICogCisgKiBAcmV0dXJucyAjVFJVRSBpZiB1bmxpbmsoKSBzdWNjZWVkZWQKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2RlbGV0ZV9maWxlIChjb25zdCBEQnVzU3RyaW5nICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgY29uc3QgY2hhciAqZmlsZW5hbWVfYzsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgCisgIGZpbGVuYW1lX2MgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKGZpbGVuYW1lKTsKKworICBpZiAodW5saW5rIChmaWxlbmFtZV9jKSA8IDApCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGRlbGV0ZSBmaWxlICVzOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZV9jLCBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4gVFJVRTsKK30KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1maWxlLXdpbi5jIGIvZGJ1cy9kYnVzLWZpbGUtd2luLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRkMGRjZgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1maWxlLXdpbi5jCkBAIC0wLDAgKzEsNDA3IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtZmlsZS13aW4uYyB3aW5kb3dzIHJlbGF0ZWQgZmlsZSBpbXBsZW1lbnRhdGlvbiAoaW50ZXJuYWwgdG8gRC1CdXMgaW1wbGVtZW50YXRpb24pCisgKiAKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMywgMjAwNiAgUmVkIEhhdCwgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDAzIENvZGVGYWN0b3J5IEFCCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLXByb3RvY29sLmgiCisjaW5jbHVkZSAiZGJ1cy1zdHJpbmcuaCIKKyNpbmNsdWRlICJkYnVzLWludGVybmFscy5oIgorI2luY2x1ZGUgImRidXMtc3lzZGVwcy13aW4uaCIKKyNpbmNsdWRlICJkYnVzLXBpcGUuaCIKKworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworCisvKioKKyAqIFRoaW4gd3JhcHBlciBhcm91bmQgdGhlIHJlYWQoKSBzeXN0ZW0gY2FsbCB0aGF0IGFwcGVuZHMKKyAqIHRoZSBkYXRhIGl0IHJlYWRzIHRvIHRoZSBEQnVzU3RyaW5nIGJ1ZmZlci4gSXQgYXBwZW5kcworICogdXAgdG8gdGhlIGdpdmVuIGNvdW50LgorICogCisgKiBAcGFyYW0gaG5kIHRoZSBIQU5ETEUgdG8gcmVhZCBmcm9tCisgKiBAcGFyYW0gYnVmZmVyIHRoZSBidWZmZXIgdG8gYXBwZW5kIGRhdGEgdG8KKyAqIEBwYXJhbSBjb3VudCB0aGUgYW1vdW50IG9mIGRhdGEgdG8gcmVhZAorICogQHBhcmFtIGVycm9yIHBsYWNlIHRvIHNldCBhbiBlcnJvcgorICogQHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkIG9yIC0xCisgKi8KK3N0YXRpYyBpbnQKK19kYnVzX2ZpbGVfcmVhZCAoSEFORExFICAgICAgICAgICAgaG5kLAorICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICpidWZmZXIsCisgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGNvdW50LAorICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgQk9PTCByZXN1bHQ7CisgIERXT1JEIGJ5dGVzX3JlYWQ7CisgIGludCBzdGFydDsKKyAgY2hhciAqZGF0YTsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBfZGJ1c19hc3NlcnQgKGNvdW50ID49IDApOworCisgIHN0YXJ0ID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGJ1ZmZlcik7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfbGVuZ3RoZW4gKGJ1ZmZlciwgY291bnQpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICBkYXRhID0gX2RidXNfc3RyaW5nX2dldF9kYXRhX2xlbiAoYnVmZmVyLCBzdGFydCwgY291bnQpOworCisgIHJlc3VsdCA9IFJlYWRGaWxlIChobmQsIGRhdGEsIGNvdW50LCAmYnl0ZXNfcmVhZCwgTlVMTCk7CisgIGlmIChyZXN1bHQgPT0gMCkKKyAgICB7CisgICAgICBjaGFyICplbXNnID0gX2RidXNfd2luX2Vycm9yX3N0cmluZyAoR2V0TGFzdEVycm9yICgpKTsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfd2luX2Vycm9yX2Zyb21fbGFzdF9lcnJvciAoKSwKKyAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHJlYWQgZnJvbSAlcDogJXMiLCBobmQsIGVtc2cpOworICAgICAgX2RidXNfd2luX2ZyZWVfZXJyb3Jfc3RyaW5nIChlbXNnKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgaWYgKGJ5dGVzX3JlYWQpCisgICAgeworICAgICAgLyogcHV0IGxlbmd0aCBiYWNrIChkb2Vzbid0IGFjdHVhbGx5IHJlYWxsb2MpICovCisgICAgICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoYnVmZmVyLCBzdGFydCArIGJ5dGVzX3JlYWQpOworCisjaWYgMAorICAgICAgaWYgKGJ5dGVzX3JlYWQgPiAwKQorICAgICAgICBfZGJ1c192ZXJib3NlX2J5dGVzX29mX3N0cmluZyAoYnVmZmVyLCBzdGFydCwgYnl0ZXNfcmVhZCk7CisjZW5kaWYKKyAgICB9CisKKyAgcmV0dXJuIGJ5dGVzX3JlYWQ7Cit9CisKKworLyoqCisgKiBBcHBlbmRzIHRoZSBjb250ZW50cyBvZiB0aGUgZ2l2ZW4gZmlsZSB0byB0aGUgc3RyaW5nLAorICogcmV0dXJuaW5nIGVycm9yIGNvZGUuIEF0IHRoZSBtb21lbnQsIHdvbid0IG9wZW4gYSBmaWxlCisgKiBtb3JlIHRoYW4gYSBtZWdhYnl0ZSBpbiBzaXplLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZyB0byBhcHBlbmQgdG8KKyAqIEBwYXJhbSBmaWxlbmFtZSBmaWxlbmFtZSB0byBsb2FkCisgKiBAcGFyYW0gZXJyb3IgcGxhY2UgdG8gc2V0IGFuIGVycm9yCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgZXJyb3Igd2FzIHNldAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfZmlsZV9nZXRfY29udGVudHMgKERCdXNTdHJpbmcgICAgICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgSEFORExFIGhuZDsKKyAgRFdPUkQgZnNpemU7CisgIERXT1JEIGZzaXplX2hpOworICBpbnQgb3JpZ19sZW47CisgIHVuc2lnbmVkIGludCB0b3RhbDsKKyAgY29uc3QgY2hhciAqZmlsZW5hbWVfYzsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBmaWxlbmFtZV9jID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChmaWxlbmFtZSk7CisKKyAgaG5kID0gQ3JlYXRlRmlsZUEgKGZpbGVuYW1lX2MsIEdFTkVSSUNfUkVBRCwKKyAgICAgICAgICAgICAgICAgICAgRklMRV9TSEFSRV9SRUFEIHwgRklMRV9TSEFSRV9XUklURSwKKyAgICAgICAgICAgICAgICAgICAgTlVMTCwgT1BFTl9FWElTVElORywgRklMRV9BVFRSSUJVVEVfTk9STUFMLCBOVUxMKTsKKyAgaWYgKGhuZCA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkKKyAgICB7CisgICAgICBjaGFyICplbXNnID0gX2RidXNfd2luX2Vycm9yX3N0cmluZyAoR2V0TGFzdEVycm9yICgpKTsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfd2luX2Vycm9yX2Zyb21fbGFzdF9lcnJvciAoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBvcGVuIFwiJXNcIjogJXMiLCBmaWxlbmFtZV9jLCBlbXNnKTsKKyAgICAgIF9kYnVzX3dpbl9mcmVlX2Vycm9yX3N0cmluZyAoZW1zZyk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIF9kYnVzX3ZlcmJvc2UgKCJmaWxlICVzIGhuZCAlcCBvcGVuZWRcbiIsIGZpbGVuYW1lX2MsIGhuZCk7CisgIAorICBmc2l6ZSA9IEdldEZpbGVTaXplIChobmQsICZmc2l6ZV9oaSk7CisgIGlmIChmc2l6ZSA9PSAweEZGRkZGRkZGICYmIEdldExhc3RFcnJvcigpICE9IE5PX0VSUk9SKQorICAgIHsgCisgICAgICBjaGFyICplbXNnID0gX2RidXNfd2luX2Vycm9yX3N0cmluZyAoR2V0TGFzdEVycm9yICgpKTsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfd2luX2Vycm9yX2Zyb21fbGFzdF9lcnJvciAoKSwKKyAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGdldCBmaWxlIHNpemUgZm9yIFwiJXNcIjogJXMiLAorICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lX2MsIGVtc2cpOworICAgICAgX2RidXNfd2luX2ZyZWVfZXJyb3Jfc3RyaW5nIChlbXNnKTsKKworICAgICAgX2RidXNfdmVyYm9zZSAoIkdldEZpbGVTaXplKCkgZmFpbGVkOiAlcyIsIGVtc2cpOworCisgICAgICBDbG9zZUhhbmRsZSAoaG5kKTsKKworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoZnNpemVfaGkgIT0gMCB8fCBmc2l6ZSA+IF9EQlVTX09ORV9NRUdBQllURSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJGaWxlIHNpemUgJWx1LyVsdSBvZiBcIiVzXCIgaXMgdG9vIGxhcmdlLiIsCisgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIGZzaXplX2hpLAorICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBmc2l6ZSwgZmlsZW5hbWVfYyk7CisgICAgICBDbG9zZUhhbmRsZSAoaG5kKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgdG90YWwgPSAwOworICBvcmlnX2xlbiA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChzdHIpOworICBpZiAoZnNpemUgPiAwKQorICAgIHsKKyAgICAgIGludCBieXRlc19yZWFkOworCisgICAgICB3aGlsZSAodG90YWwgPCBmc2l6ZSkKKyAgICAgICAgeworICAgICAgICAgIGJ5dGVzX3JlYWQgPSBfZGJ1c19maWxlX3JlYWQgKGhuZCwgc3RyLCBmc2l6ZSAtIHRvdGFsLCBlcnJvcik7CisgICAgICAgICAgaWYgKGJ5dGVzX3JlYWQgPD0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKGJ5dGVzX3JlYWQgPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcmVtYXR1cmUgRU9GIHJlYWRpbmcgXCIlc1wiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZV9jKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisKKyAgICAgICAgICAgICAgQ2xvc2VIYW5kbGUgKGhuZCk7CisgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoIChzdHIsIG9yaWdfbGVuKTsKKyAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRvdGFsICs9IGJ5dGVzX3JlYWQ7CisgICAgICAgIH0KKworICAgICAgQ2xvc2VIYW5kbGUgKGhuZCk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBDbG9zZUhhbmRsZSAoaG5kKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KK30KKworCisvKioKKyAqIFdyaXRlcyBhIHN0cmluZyBvdXQgdG8gYSBmaWxlLiBJZiB0aGUgZmlsZSBleGlzdHMsCisgKiBpdCB3aWxsIGJlIGF0b21pY2FsbHkgb3ZlcndyaXR0ZW4gYnkgdGhlIG5ldyBkYXRhLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZyB0byB3cml0ZSBvdXQKKyAqIEBwYXJhbSBmaWxlbmFtZSB0aGUgZmlsZSB0byBzYXZlIHN0cmluZyB0bworICogQHBhcmFtIHdvcmxkX3JlYWRhYmxlIGlmIHRydWUsIGVuc3VyZSBmaWxlIGlzIHdvcmxkIHJlYWRhYmxlCisgKiBAcGFyYW0gZXJyb3IgZXJyb3IgdG8gYmUgZmlsbGVkIGluIG9uIGZhaWx1cmUKKyAqIEByZXR1cm5zICNGQUxTRSBvbiBmYWlsdXJlCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zdHJpbmdfc2F2ZV90b19maWxlIChjb25zdCBEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgIHdvcmxkX3JlYWRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCit7CisgIEhBTkRMRSBobmQ7CisgIGludCBieXRlc190b193cml0ZTsKKyAgY29uc3QgY2hhciAqZmlsZW5hbWVfYzsKKyAgREJ1c1N0cmluZyB0bXBfZmlsZW5hbWU7CisgIGNvbnN0IGNoYXIgKnRtcF9maWxlbmFtZV9jOworICBpbnQgdG90YWw7CisgIGNvbnN0IGNoYXIgKnN0cl9jOworICBkYnVzX2Jvb2xfdCBuZWVkX3VubGluazsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIGhuZCA9IElOVkFMSURfSEFORExFX1ZBTFVFOworICByZXR2YWwgPSBGQUxTRTsKKyAgbmVlZF91bmxpbmsgPSBGQUxTRTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmdG1wX2ZpbGVuYW1lKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAoZmlsZW5hbWUsIDAsICZ0bXBfZmlsZW5hbWUsIDApKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ0bXBfZmlsZW5hbWUpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZ0bXBfZmlsZW5hbWUsICIuIikpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnRtcF9maWxlbmFtZSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisjZGVmaW5lIE5fVE1QX0ZJTEVOQU1FX1JBTkRPTV9CWVRFUyA4CisgIGlmICghX2RidXNfZ2VuZXJhdGVfcmFuZG9tX2FzY2lpICgmdG1wX2ZpbGVuYW1lLCBOX1RNUF9GSUxFTkFNRV9SQU5ET01fQllURVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ0bXBfZmlsZW5hbWUpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBmaWxlbmFtZV9jID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChmaWxlbmFtZSk7CisgIHRtcF9maWxlbmFtZV9jID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmdG1wX2ZpbGVuYW1lKTsKKworICAvKiBUT0RPIC0gc3VwcG9ydCB3b3JsZC1yZWFkYWJsZSBpbiBhbiBhdG9taWMgZmFzaGlvbiAqLworICBobmQgPSBDcmVhdGVGaWxlQSAodG1wX2ZpbGVuYW1lX2MsIEdFTkVSSUNfV1JJVEUsCisgICAgICAgICAgICAgICAgICAgICBGSUxFX1NIQVJFX1JFQUQgfCBGSUxFX1NIQVJFX1dSSVRFLAorICAgICAgICAgICAgICAgICAgICAgTlVMTCwgQ1JFQVRFX05FVywgRklMRV9BVFRSSUJVVEVfTk9STUFMLAorICAgICAgICAgICAgICAgICAgICAgSU5WQUxJRF9IQU5ETEVfVkFMVUUpOworICBpZiAoaG5kID09IElOVkFMSURfSEFORExFX1ZBTFVFKQorICAgIHsKKyAgICAgIGNoYXIgKmVtc2cgPSBfZGJ1c193aW5fZXJyb3Jfc3RyaW5nIChHZXRMYXN0RXJyb3IgKCkpOworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c193aW5fZXJyb3JfZnJvbV9sYXN0X2Vycm9yICgpLAorICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGNyZWF0ZSBcIiVzXCI6ICVzIiwgZmlsZW5hbWVfYywgZW1zZyk7CisgICAgICBfZGJ1c193aW5fZnJlZV9lcnJvcl9zdHJpbmcgKGVtc2cpOworICAgICAgZ290byBvdXQ7CisgICAgfQorICBpZiAod29ybGRfcmVhZGFibGUpCisgICAgeworICAgICAgaWYgKCEgX2RidXNfbWFrZV9maWxlX3dvcmxkX3JlYWRhYmxlICgmdG1wX2ZpbGVuYW1lLCBlcnJvcikpCisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBfZGJ1c192ZXJib3NlICgidG1wIGZpbGUgJXMgaG5kICVwIG9wZW5lZFxuIiwgdG1wX2ZpbGVuYW1lX2MsIGhuZCk7CisKKyAgbmVlZF91bmxpbmsgPSBUUlVFOworCisgIHRvdGFsID0gMDsKKyAgYnl0ZXNfdG9fd3JpdGUgPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoc3RyKTsKKyAgc3RyX2MgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKHN0cik7CisKKyAgd2hpbGUgKHRvdGFsIDwgYnl0ZXNfdG9fd3JpdGUpCisgICAgeworICAgICAgRFdPUkQgYnl0ZXNfd3JpdHRlbjsKKyAgICAgIEJPT0wgcmVzOworCisgICAgICByZXMgPSBXcml0ZUZpbGUgKGhuZCwgc3RyX2MgKyB0b3RhbCwgYnl0ZXNfdG9fd3JpdGUgLSB0b3RhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgJmJ5dGVzX3dyaXR0ZW4sIE5VTEwpOworCisgICAgICBpZiAocmVzID09IDAgfHwgYnl0ZXNfd3JpdHRlbiA8PSAwKQorICAgICAgICB7CisgICAgICAgICAgY2hhciAqZW1zZyA9IF9kYnVzX3dpbl9lcnJvcl9zdHJpbmcgKEdldExhc3RFcnJvciAoKSk7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c193aW5fZXJyb3JfZnJvbV9sYXN0X2Vycm9yICgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCB3cml0ZSB0byAlczogJXMiLCB0bXBfZmlsZW5hbWVfYywgZW1zZyk7CisgICAgICAgICAgX2RidXNfd2luX2ZyZWVfZXJyb3Jfc3RyaW5nIChlbXNnKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICB0b3RhbCArPSBieXRlc193cml0dGVuOworICAgIH0KKworICBpZiAoQ2xvc2VIYW5kbGUgKGhuZCkgPT0gMCkKKyAgICB7CisgICAgICBjaGFyICplbXNnID0gX2RidXNfd2luX2Vycm9yX3N0cmluZyAoR2V0TGFzdEVycm9yICgpKTsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfd2luX2Vycm9yX2Zyb21fbGFzdF9lcnJvciAoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBjbG9zZSBmaWxlICVzOiAlcyIsIHRtcF9maWxlbmFtZV9jLCBlbXNnKTsKKyAgICAgIF9kYnVzX3dpbl9mcmVlX2Vycm9yX3N0cmluZyAoZW1zZyk7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgaG5kID0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CisKKyAgLyogVW5saWtlIHJlbmFtZSgpLCBNb3ZlRmlsZUV4KCkgY2FuIHJlcGxhY2UgZXhpc3RpbmcgZmlsZXMgKi8KKyAgaWYgKCFNb3ZlRmlsZUV4QSAodG1wX2ZpbGVuYW1lX2MsIGZpbGVuYW1lX2MsIE1PVkVGSUxFX1JFUExBQ0VfRVhJU1RJTkcpKQorICAgIHsKKyAgICAgIGNoYXIgKmVtc2cgPSBfZGJ1c193aW5fZXJyb3Jfc3RyaW5nIChHZXRMYXN0RXJyb3IgKCkpOworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c193aW5fZXJyb3JfZnJvbV9sYXN0X2Vycm9yICgpLAorICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IHJlbmFtZSAlcyB0byAlczogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICB0bXBfZmlsZW5hbWVfYywgZmlsZW5hbWVfYywgZW1zZyk7CisgICAgICBfZGJ1c193aW5fZnJlZV9lcnJvcl9zdHJpbmcgKGVtc2cpOworCisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgbmVlZF91bmxpbmsgPSBGQUxTRTsKKworICByZXR2YWwgPSBUUlVFOworCisgb3V0OgorICAvKiBjbG9zZSBmaXJzdCwgdGhlbiB1bmxpbmsgKi8KKworICBpZiAoaG5kICE9IElOVkFMSURfSEFORExFX1ZBTFVFKQorICAgIENsb3NlSGFuZGxlIChobmQpOworCisgIGlmIChuZWVkX3VubGluayAmJiBEZWxldGVGaWxlQSAodG1wX2ZpbGVuYW1lX2MpID09IDApCisgICAgeworICAgICAgY2hhciAqZW1zZyA9IF9kYnVzX3dpbl9lcnJvcl9zdHJpbmcgKEdldExhc3RFcnJvciAoKSk7CisgICAgICBfZGJ1c192ZXJib3NlICgiRmFpbGVkIHRvIHVubGluayB0ZW1wIGZpbGUgJXM6ICVzIiwgdG1wX2ZpbGVuYW1lX2MsCisgICAgICAgICAgICAgICAgICAgICBlbXNnKTsKKyAgICAgIF9kYnVzX3dpbl9mcmVlX2Vycm9yX3N0cmluZyAoZW1zZyk7CisgICAgfQorCisgIF9kYnVzX3N0cmluZ19mcmVlICgmdG1wX2ZpbGVuYW1lKTsKKworICBpZiAoIXJldHZhbCkKKyAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworCisvKiogQ3JlYXRlcyB0aGUgZ2l2ZW4gZmlsZSwgZmFpbGluZyBpZiB0aGUgZmlsZSBhbHJlYWR5IGV4aXN0cy4KKyAqCisgKiBAcGFyYW0gZmlsZW5hbWUgdGhlIGZpbGVuYW1lCisgKiBAcGFyYW0gZXJyb3IgZXJyb3IgbG9jYXRpb24KKyAqIEByZXR1cm5zICNUUlVFIGlmIHdlIGNyZWF0ZWQgdGhlIGZpbGUgYW5kIGl0IGRpZG4ndCBleGlzdAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfY3JlYXRlX2ZpbGVfZXhjbHVzaXZlbHkgKGNvbnN0IERCdXNTdHJpbmcgKmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICBIQU5ETEUgaG5kOworICBjb25zdCBjaGFyICpmaWxlbmFtZV9jOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIGZpbGVuYW1lX2MgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKGZpbGVuYW1lKTsKKworICBobmQgPSBDcmVhdGVGaWxlQSAoZmlsZW5hbWVfYywgR0VORVJJQ19XUklURSwKKyAgICAgICAgICAgICAgICAgICAgIEZJTEVfU0hBUkVfUkVBRCB8IEZJTEVfU0hBUkVfV1JJVEUsCisgICAgICAgICAgICAgICAgICAgICBOVUxMLCBDUkVBVEVfTkVXLCBGSUxFX0FUVFJJQlVURV9OT1JNQUwsCisgICAgICAgICAgICAgICAgICAgICBJTlZBTElEX0hBTkRMRV9WQUxVRSk7CisgIGlmIChobmQgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpCisgICAgeworICAgICAgY2hhciAqZW1zZyA9IF9kYnVzX3dpbl9lcnJvcl9zdHJpbmcgKEdldExhc3RFcnJvciAoKSk7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX3dpbl9lcnJvcl9mcm9tX2xhc3RfZXJyb3IgKCksCisgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgY3JlYXRlIGZpbGUgJXM6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWVfYywgZW1zZyk7CisgICAgICBfZGJ1c193aW5fZnJlZV9lcnJvcl9zdHJpbmcgKGVtc2cpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBfZGJ1c192ZXJib3NlICgiZXhjbHVzaXZlIGZpbGUgJXMgaG5kICVwIG9wZW5lZFxuIiwgZmlsZW5hbWVfYywgaG5kKTsKKworICBpZiAoQ2xvc2VIYW5kbGUgKGhuZCkgPT0gMCkKKyAgICB7CisgICAgICBjaGFyICplbXNnID0gX2RidXNfd2luX2Vycm9yX3N0cmluZyAoR2V0TGFzdEVycm9yICgpKTsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfd2luX2Vycm9yX2Zyb21fbGFzdF9lcnJvciAoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBjbG9zZSBmaWxlICVzOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lX2MsIGVtc2cpOworICAgICAgX2RidXNfd2luX2ZyZWVfZXJyb3Jfc3RyaW5nIChlbXNnKTsKKworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLWZpbGUuYyBiL2RidXMvZGJ1cy1maWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUwZmJkOQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1maWxlLmMKQEAgLTAsMCArMSwyOCBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXN5c2RlcHMtdW5peC5jIFdyYXBwZXJzIGFyb3VuZCBVTklYIHN5c3RlbS9saWJjIGZlYXR1cmVzIChpbnRlcm5hbCB0byBELUJ1cyBpbXBsZW1lbnRhdGlvbikKKyAqIAorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzLCAyMDA2ICBSZWQgSGF0LCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgQ29kZUZhY3RvcnkgQUIKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorCisjaW5jbHVkZSAiZGJ1cy1maWxlLmgiCisKZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1maWxlLmggYi9kYnVzL2RidXMtZmlsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmYTMwY2QKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtZmlsZS5oCkBAIC0wLDAgKzEsNjUgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1maWxlLmggZGJ1cyBmaWxlIHJlbGF0ZWQgc3R1ZmYgKGludGVybmFsIHRvIEQtQnVzIGltcGxlbWVudGF0aW9uKQorICogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMgIFJlZCBIYXQsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwMyBDb2RlRmFjdG9yeSBBQgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaWZuZGVmIERCVVNfRklMRV9ICisjZGVmaW5lIERCVVNfRklMRV9ICisKKy8vI2luY2x1ZGUgPGRidXMvZGJ1cy10eXBlcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zdHJpbmcuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtZXJyb3JzLmg+CisKK0RCVVNfQkVHSU5fREVDTFMKKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzRmlsZQorICogQHsKKyAqLworCisvKioKKyAqIEZpbGUgaW50ZXJmYWNlCisgKi8KK2RidXNfYm9vbF90IF9kYnVzX2ZpbGVfZXhpc3RzICAgICAgICAgKGNvbnN0IGNoYXIgICAgICAgKmZpbGUpOworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgX2RidXNfZmlsZV9nZXRfY29udGVudHMgICAoREJ1c1N0cmluZyAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcik7CitkYnVzX2Jvb2xfdCBfZGJ1c19zdHJpbmdfc2F2ZV90b19maWxlIChjb25zdCBEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgIHdvcmxkX3JlYWRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpOworCitkYnVzX2Jvb2xfdCBfZGJ1c19tYWtlX2ZpbGVfd29ybGRfcmVhZGFibGUgICAoY29uc3QgREJ1c1N0cmluZyAqZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICplcnJvcik7CisKK2RidXNfYm9vbF90ICAgIF9kYnVzX2NyZWF0ZV9maWxlX2V4Y2x1c2l2ZWx5IChjb25zdCBEQnVzU3RyaW5nICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcik7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCAgICBfZGJ1c19kZWxldGVfZmlsZSAgICAgICAgICAgICAoY29uc3QgREJ1c1N0cmluZyAqZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLyoqIEB9ICovCisKK0RCVVNfRU5EX0RFQ0xTCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLWhhc2guYyBiL2RidXMvZGJ1cy1oYXNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE1ZTdjYQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1oYXNoLmMKQEAgLTAsMCArMSwxOTgxIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtaGFzaC5jIEdlbmVyaWMgaGFzaCB0YWJsZSB1dGlsaXR5IChpbnRlcm5hbCB0byBELUJ1cyBpbXBsZW1lbnRhdGlvbikKKyAqIAorICogQ29weXJpZ2h0IChDKSAyMDAyICBSZWQgSGF0LCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTEtMTk5MyBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgorICogQ29weXJpZ2h0IChjKSAxOTk0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4KKyAqIAorICogSGFzaCB0YWJsZSBpbXBsZW1lbnRhdGlvbiBiYXNlZCBvbiBnZW5lcmljL3RjbEhhc2guYyBmcm9tIHRoZSBUY2wKKyAqIHNvdXJjZSBjb2RlLiBUaGUgb3JpZ2luYWwgVGNsIGxpY2Vuc2UgYXBwbGllcyB0byBwb3J0aW9ucyBvZiB0aGUKKyAqIGNvZGUgZnJvbSB0Y2xIYXNoLmM7IHRoZSBUY2wgbGljZW5zZSBmb2xsb3dzIHRoaXMgc3RhbmRhZCBELUJ1cyAKKyAqIGxpY2Vuc2UgaW5mb3JtYXRpb24uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisvKiAKKyAqIFRoZSBmb2xsb3dpbmcgY29weXJpZ2h0IGFwcGxpZXMgdG8gY29kZSBmcm9tIHRoZSBUY2wgZGlzdHJpYnV0aW9uLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5MS0xOTkzIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgY29weXJpZ2h0ZWQgYnkgdGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YKKyAqIENhbGlmb3JuaWEsIFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIFNjcmlwdGljcyBDb3Jwb3JhdGlvbiwgYW5kCisgKiBvdGhlciBwYXJ0aWVzLiAgVGhlIGZvbGxvd2luZyB0ZXJtcyBhcHBseSB0byBhbGwgZmlsZXMgYXNzb2NpYXRlZAorICogd2l0aCB0aGUgc29mdHdhcmUgdW5sZXNzIGV4cGxpY2l0bHkgZGlzY2xhaW1lZCBpbiBpbmRpdmlkdWFsIGZpbGVzLgorICogCisgKiBUaGUgYXV0aG9ycyBoZXJlYnkgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwKKyAqIGRpc3RyaWJ1dGUsIGFuZCBsaWNlbnNlIHRoaXMgc29mdHdhcmUgYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkKKyAqIHB1cnBvc2UsIHByb3ZpZGVkIHRoYXQgZXhpc3RpbmcgY29weXJpZ2h0IG5vdGljZXMgYXJlIHJldGFpbmVkIGluCisgKiBhbGwgY29waWVzIGFuZCB0aGF0IHRoaXMgbm90aWNlIGlzIGluY2x1ZGVkIHZlcmJhdGltIGluIGFueQorICogZGlzdHJpYnV0aW9ucy4gTm8gd3JpdHRlbiBhZ3JlZW1lbnQsIGxpY2Vuc2UsIG9yIHJveWFsdHkgZmVlIGlzCisgKiByZXF1aXJlZCBmb3IgYW55IG9mIHRoZSBhdXRob3JpemVkIHVzZXMuICBNb2RpZmljYXRpb25zIHRvIHRoaXMKKyAqIHNvZnR3YXJlIG1heSBiZSBjb3B5cmlnaHRlZCBieSB0aGVpciBhdXRob3JzIGFuZCBuZWVkIG5vdCBmb2xsb3cKKyAqIHRoZSBsaWNlbnNpbmcgdGVybXMgZGVzY3JpYmVkIGhlcmUsIHByb3ZpZGVkIHRoYXQgdGhlIG5ldyB0ZXJtcyBhcmUKKyAqIGNsZWFybHkgaW5kaWNhdGVkIG9uIHRoZSBmaXJzdCBwYWdlIG9mIGVhY2ggZmlsZSB3aGVyZSB0aGV5IGFwcGx5LgorICogCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBESVNUUklCVVRPUlMgQkUgTElBQkxFIFRPIEFOWQorICogUEFSVFkgRk9SIERJUkVDVCwgSU5ESVJFQ1QsIFNQRUNJQUwsIElOQ0lERU5UQUwsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgQVJJU0lORyBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBJVFMgRE9DVU1FTlRBVElPTiwKKyAqIE9SIEFOWSBERVJJVkFUSVZFUyBUSEVSRU9GLCBFVkVOIElGIFRIRSBBVVRIT1JTIEhBVkUgQkVFTiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRIRSBBVVRIT1JTIEFORCBESVNUUklCVVRPUlMgU1BFQ0lGSUNBTExZIERJU0NMQUlNIEFOWSBXQVJSQU5USUVTLAorICogSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEFORAorICogTk9OLUlORlJJTkdFTUVOVC4gIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgT04gQU4gIkFTIElTIiBCQVNJUywKKyAqIEFORCBUSEUgQVVUSE9SUyBBTkQgRElTVFJJQlVUT1JTIEhBVkUgTk8gT0JMSUdBVElPTiBUTyBQUk9WSURFCisgKiBNQUlOVEVOQU5DRSwgU1VQUE9SVCwgVVBEQVRFUywgRU5IQU5DRU1FTlRTLCBPUiBNT0RJRklDQVRJT05TLgorICogCisgKiBHT1ZFUk5NRU5UIFVTRTogSWYgeW91IGFyZSBhY3F1aXJpbmcgdGhpcyBzb2Z0d2FyZSBvbiBiZWhhbGYgb2YgdGhlCisgKiBVLlMuIGdvdmVybm1lbnQsIHRoZSBHb3Zlcm5tZW50IHNoYWxsIGhhdmUgb25seSAiUmVzdHJpY3RlZCBSaWdodHMiCisgKiBpbiB0aGUgc29mdHdhcmUgYW5kIHJlbGF0ZWQgZG9jdW1lbnRhdGlvbiBhcyBkZWZpbmVkIGluIHRoZSBGZWRlcmFsCisgKiBBY3F1aXNpdGlvbiBSZWd1bGF0aW9ucyAoRkFScykgaW4gQ2xhdXNlIDUyLjIyNy4xOSAoYykgKDIpLiAgSWYgeW91CisgKiBhcmUgYWNxdWlyaW5nIHRoZSBzb2Z0d2FyZSBvbiBiZWhhbGYgb2YgdGhlIERlcGFydG1lbnQgb2YgRGVmZW5zZSwKKyAqIHRoZSBzb2Z0d2FyZSBzaGFsbCBiZSBjbGFzc2lmaWVkIGFzICJDb21tZXJjaWFsIENvbXB1dGVyIFNvZnR3YXJlIgorICogYW5kIHRoZSBHb3Zlcm5tZW50IHNoYWxsIGhhdmUgb25seSAiUmVzdHJpY3RlZCBSaWdodHMiIGFzIGRlZmluZWQKKyAqIGluIENsYXVzZSAyNTIuMjI3LTcwMTMgKGMpICgxKSBvZiBERkFScy4gIE5vdHdpdGhzdGFuZGluZyB0aGUKKyAqIGZvcmVnb2luZywgdGhlIGF1dGhvcnMgZ3JhbnQgdGhlIFUuUy4gR292ZXJubWVudCBhbmQgb3RoZXJzIGFjdGluZworICogaW4gaXRzIGJlaGFsZiBwZXJtaXNzaW9uIHRvIHVzZSBhbmQgZGlzdHJpYnV0ZSB0aGUgc29mdHdhcmUgaW4KKyAqIGFjY29yZGFuY2Ugd2l0aCB0aGUgdGVybXMgc3BlY2lmaWVkIGluIHRoaXMgbGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiZGJ1cy1oYXNoLmgiCisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKyNpbmNsdWRlICJkYnVzLW1lbXBvb2wuaCIKKworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c0hhc2hUYWJsZSBIYXNoIHRhYmxlCisgKiBAaW5ncm91cCAgREJ1c0ludGVybmFscworICogQGJyaWVmIERCdXNIYXNoVGFibGUgZGF0YSBzdHJ1Y3R1cmUKKyAqCisgKiBUeXBlcyBhbmQgZnVuY3Rpb25zIHJlbGF0ZWQgdG8gREJ1c0hhc2hUYWJsZS4KKyAqLworCisvKioKKyAqIEBkZWZncm91cCBEQnVzSGFzaFRhYmxlSW50ZXJuYWxzIEhhc2ggdGFibGUgaW1wbGVtZW50YXRpb24gZGV0YWlscworICogQGluZ3JvdXAgIERCdXNJbnRlcm5hbHMKKyAqIEBicmllZiBEQnVzSGFzaFRhYmxlIGltcGxlbWVudGF0aW9uIGRldGFpbHMKKyAqCisgKiBUaGUgZ3V0cyBvZiBEQnVzSGFzaFRhYmxlLgorICoKKyAqIEB7CisgKi8KKworLyoqCisgKiBXaGVuIHRoZXJlIGFyZSB0aGlzIG1hbnkgZW50cmllcyBwZXIgYnVja2V0LCBvbiBhdmVyYWdlLCByZWJ1aWxkCisgKiB0aGUgaGFzaCB0YWJsZSB0byBtYWtlIGl0IGxhcmdlci4KKyAqLworI2RlZmluZSBSRUJVSUxEX01VTFRJUExJRVIgIDMKKworLyoqCisgKiBUYWtlcyBhIHByZWxpbWluYXJ5IGludGVnZXIgaGFzaCB2YWx1ZSBhbmQgcHJvZHVjZXMgYW4gaW5kZXggaW50byBhCisgKiBoYXNoIHRhYmxlcyBidWNrZXQgbGlzdC4gIFRoZSBpZGVhIGlzIHRvIG1ha2UgaXQgc28gdGhhdAorICogcHJlbGltaW5hcnkgdmFsdWVzIHRoYXQgYXJlIGFyYml0cmFyaWx5IHNpbWlsYXIgd2lsbCBlbmQgdXAgaW4KKyAqIGRpZmZlcmVudCBidWNrZXRzLiAgVGhlIGhhc2ggZnVuY3Rpb24gd2FzIHRha2VuIGZyb20gYQorICogcmFuZG9tLW51bWJlciBnZW5lcmF0b3IuIChUaGlzIGlzIHVzZWQgdG8gaGFzaCBpbnRlZ2Vycy4pCisgKgorICogVGhlIGRvd25fc2hpZnQgZHJvcHMgb2ZmIHRoZSBoaWdoIGJpdHMgb2YgdGhlIGhhc2ggaW5kZXgsIGFuZAorICogZGVjcmVhc2VzIGFzIHdlIGluY3JlYXNlIHRoZSBudW1iZXIgb2YgaGFzaCBidWNrZXRzICh0byBrZWVwIG1vcmUKKyAqIHJhbmdlIGluIHRoZSBoYXNoIGluZGV4KS4gVGhlIG1hc2sgYWxzbyBzdHJpcHMgaGlnaCBiaXRzIGFuZCBzdHJpcHMKKyAqIGZld2VyIGhpZ2ggYml0cyBhcyB0aGUgbnVtYmVyIG9mIGhhc2ggYnVja2V0cyBpbmNyZWFzZXMuCisgKiBJIGRvbid0IHVuZGVyc3RhbmQgdHdvIHRoaW5nczogd2h5IGlzIHRoZSBpbml0aWFsIGRvd25zaGlmdCAyOAorICogdG8ga2VlcCA0IGJpdHMgd2hlbiB0aGUgaW5pdGlhbCBtYXNrIGlzIDAxMSB0byBrZWVwIDIgYml0cywKKyAqIGFuZCB3aHkgZG8gd2UgaGF2ZSBib3RoIGEgbWFzayBhbmQgYSBkb3duc2hpZnQ/CisgKiAKKyAqLworI2RlZmluZSBSQU5ET01fSU5ERVgodGFibGUsIGkpIFwKKyAgICAoKCgoKGludHB0cl90KSAoaSkpKjExMDM1MTUyNDUpID4+ICh0YWJsZSktPmRvd25fc2hpZnQpICYgKHRhYmxlKS0+bWFzaykKKworLyoqCisgKiBJbml0aWFsIG51bWJlciBvZiBidWNrZXRzIGluIGhhc2ggdGFibGUgKGhhc2ggdGFibGUgc3RhdGljYWxseQorICogYWxsb2NhdGVzIGl0cyBidWNrZXRzIGZvciB0aGlzIHNpemUgYW5kIGJlbG93KS4KKyAqIFRoZSBpbml0aWFsIG1hc2sgaGFzIHRvIGJlIHN5bmNlZCB0byB0aGlzLgorICovCisjZGVmaW5lIERCVVNfU01BTExfSEFTSF9UQUJMRSA0CisKKy8qKgorICogVHlwZWRlZiBmb3IgREJ1c0hhc2hFbnRyeQorICovCit0eXBlZGVmIHN0cnVjdCBEQnVzSGFzaEVudHJ5IERCdXNIYXNoRW50cnk7CisKKy8qKgorICogQGJyaWVmIEludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIGEgaGFzaCBlbnRyeS4KKyAqIAorICogQSBzaW5nbGUgZW50cnkgKGtleS12YWx1ZSBwYWlyKSBpbiB0aGUgaGFzaCB0YWJsZS4KKyAqIEludGVybmFsIHRvIGhhc2ggdGFibGUgaW1wbGVtZW50YXRpb24uCisgKi8KK3N0cnVjdCBEQnVzSGFzaEVudHJ5Cit7CisgIERCdXNIYXNoRW50cnkgKm5leHQ7ICAgIC8qKjwgUG9pbnRlciB0byBuZXh0IGVudHJ5IGluIHRoaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICogaGFzaCBidWNrZXQsIG9yICNOVUxMIGZvciBlbmQgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICogY2hhaW4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB2b2lkICprZXk7ICAgICAgICAgICAgICAvKio8IEhhc2gga2V5ICovCisgIHZvaWQgKnZhbHVlOyAgICAgICAgICAgIC8qKjwgSGFzaCB2YWx1ZSAqLworfTsKKworLyoqCisgKiBGdW5jdGlvbiB1c2VkIHRvIGZpbmQgYW5kIG9wdGlvbmFsbHkgY3JlYXRlIGEgaGFzaCBlbnRyeS4KKyAqLwordHlwZWRlZiBEQnVzSGFzaEVudHJ5KiAoKiBEQnVzRmluZEVudHJ5RnVuY3Rpb24pIChEQnVzSGFzaFRhYmxlICAgICAgICAqdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICprZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgICAgICBjcmVhdGVfaWZfbm90X2ZvdW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzSGFzaEVudHJ5ICAgICAgKioqYnVja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzUHJlYWxsb2NhdGVkSGFzaCAqcHJlYWxsb2NhdGVkKTsKKworLyoqCisgKiBAYnJpZWYgSW50ZXJuYWxzIG9mIERCdXNIYXNoVGFibGUuCisgKiAKKyAqIEhhc2ggdGFibGUgaW50ZXJuYWxzLiBIYXNoIHRhYmxlcyBhcmUgb3BhcXVlIG9iamVjdHMsIHRoZXkgbXVzdCBiZQorICogdXNlZCB2aWEgYWNjZXNzb3IgZnVuY3Rpb25zLgorICovCitzdHJ1Y3QgREJ1c0hhc2hUYWJsZSB7CisgIGludCByZWZjb3VudDsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgUmVmZXJlbmNlIGNvdW50ICovCisgIAorICBEQnVzSGFzaEVudHJ5ICoqYnVja2V0czsgICAgICAgICAgICAvKio8IFBvaW50ZXIgdG8gYnVja2V0IGFycmF5LiAgRWFjaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBlbGVtZW50IHBvaW50cyB0byBmaXJzdCBlbnRyeSBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBidWNrZXQncyBoYXNoIGNoYWluLCBvciAjTlVMTC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIERCdXNIYXNoRW50cnkgKnN0YXRpY19idWNrZXRzW0RCVVNfU01BTExfSEFTSF9UQUJMRV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEJ1Y2tldCBhcnJheSB1c2VkIGZvciBzbWFsbCB0YWJsZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICh0byBhdm9pZCBtYWxsb2NzIGFuZCBmcmVlcykuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgaW50IG5fYnVja2V0czsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVG90YWwgbnVtYmVyIG9mIGJ1Y2tldHMgYWxsb2NhdGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBhdCAqKmJ1Y2tldHMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgaW50IG5fZW50cmllczsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVG90YWwgbnVtYmVyIG9mIGVudHJpZXMgcHJlc2VudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogaW4gdGFibGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgaW50IGhpX3JlYnVpbGRfc2l6ZTsgICAgICAgICAgICAgICAgIC8qKjwgRW5sYXJnZSB0YWJsZSB3aGVuIG5fZW50cmllcyBnZXRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB0byBiZSB0aGlzIGxhcmdlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIGludCBsb19yZWJ1aWxkX3NpemU7ICAgICAgICAgICAgICAgICAvKio8IFNocmluayB0YWJsZSB3aGVuIG5fZW50cmllcyBnZXRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBiZWxvdyB0aGlzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIGludCBkb3duX3NoaWZ0OyAgICAgICAgICAgICAgICAgICAgICAvKio8IFNoaWZ0IGNvdW50IHVzZWQgaW4gaGFzaGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogZnVuY3Rpb24uICBEZXNpZ25lZCB0byB1c2UgaGlnaC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG9yZGVyIGJpdHMgb2YgcmFuZG9taXplZCBrZXlzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIGludCBtYXNrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE1hc2sgdmFsdWUgdXNlZCBpbiBoYXNoaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBmdW5jdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBEQnVzSGFzaFR5cGUga2V5X3R5cGU7ICAgICAgICAgICAgICAgLyoqPCBUeXBlIG9mIGtleXMgdXNlZCBpbiB0aGlzIHRhYmxlICovCisKKworICBEQnVzRmluZEVudHJ5RnVuY3Rpb24gZmluZF9mdW5jdGlvbjsgLyoqPCBGdW5jdGlvbiBmb3IgZmluZGluZyBlbnRyaWVzICovCisKKyAgREJ1c0ZyZWVGdW5jdGlvbiBmcmVlX2tleV9mdW5jdGlvbjsgICAvKio8IEZ1bmN0aW9uIHRvIGZyZWUga2V5cyAqLworICBEQnVzRnJlZUZ1bmN0aW9uIGZyZWVfdmFsdWVfZnVuY3Rpb247IC8qKjwgRnVuY3Rpb24gdG8gZnJlZSB2YWx1ZXMgKi8KKworICBEQnVzTWVtUG9vbCAqZW50cnlfcG9vbDsgICAgICAgICAgICAgIC8qKjwgTWVtb3J5IHBvb2wgZm9yIGhhc2ggZW50cmllcyAqLworfTsKKworLyoqIAorICogQGJyaWVmIEludGVybmFscyBvZiBEQnVzSGFzaEl0ZXIuCisgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIERCdXNIYXNoVGFibGUgKnRhYmxlOyAgICAgLyoqPCBQb2ludGVyIHRvIHRhYmxlIGNvbnRhaW5pbmcgZW50cnkuICovCisgIERCdXNIYXNoRW50cnkgKipidWNrZXQ7ICAgLyoqPCBQb2ludGVyIHRvIGJ1Y2tldCB0aGF0IHBvaW50cyB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGZpcnN0IGVudHJ5IGluIHRoaXMgZW50cnkncyBjaGFpbjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB1c2VkIGZvciBkZWxldGluZyB0aGUgZW50cnkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIERCdXNIYXNoRW50cnkgKmVudHJ5OyAgICAgIC8qKjwgQ3VycmVudCBoYXNoIGVudHJ5ICovCisgIERCdXNIYXNoRW50cnkgKm5leHRfZW50cnk7IC8qKjwgTmV4dCBlbnRyeSB0byBiZSBpdGVyYXRlZCBvbnRvIGluIGN1cnJlbnQgYnVja2V0ICovCisgIGludCBuZXh0X2J1Y2tldDsgICAgICAgICAgIC8qKjwgaW5kZXggb2YgbmV4dCBidWNrZXQgKi8KKyAgaW50IG5fZW50cmllc19vbl9pbml0OyAgICAgLyoqPCB1c2VkIHRvIGRldGVjdCB0YWJsZSByZXNpemUgc2luY2UgaW5pdGlhbGl6YXRpb24gKi8KK30gREJ1c1JlYWxIYXNoSXRlcjsKKworX0RCVVNfU1RBVElDX0FTU0VSVCAoc2l6ZW9mIChEQnVzUmVhbEhhc2hJdGVyKSA9PSBzaXplb2YgKERCdXNIYXNoSXRlcikpOworCitzdGF0aWMgREJ1c0hhc2hFbnRyeSogZmluZF9kaXJlY3RfZnVuY3Rpb24gICAgICAoREJ1c0hhc2hUYWJsZSAgICAgICAgICAqdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgICAgICAgIGNyZWF0ZV9pZl9ub3RfZm91bmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0hhc2hFbnRyeSAgICAgICAgKioqYnVja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNQcmVhbGxvY2F0ZWRIYXNoICAgKnByZWFsbG9jYXRlZCk7CitzdGF0aWMgREJ1c0hhc2hFbnRyeSogZmluZF9zdHJpbmdfZnVuY3Rpb24gICAgICAoREJ1c0hhc2hUYWJsZSAgICAgICAgICAqdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgICAgICAgIGNyZWF0ZV9pZl9ub3RfZm91bmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0hhc2hFbnRyeSAgICAgICAgKioqYnVja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNQcmVhbGxvY2F0ZWRIYXNoICAgKnByZWFsbG9jYXRlZCk7CitzdGF0aWMgdW5zaWduZWQgaW50ICAgc3RyaW5nX2hhc2ggICAgICAgICAgICAgICAoY29uc3QgY2hhciAgICAgICAgICAgICAqc3RyKTsKK3N0YXRpYyB2b2lkICAgICAgICAgICByZWJ1aWxkX3RhYmxlICAgICAgICAgICAgIChEQnVzSGFzaFRhYmxlICAgICAgICAgICp0YWJsZSk7CitzdGF0aWMgREJ1c0hhc2hFbnRyeSogYWxsb2NfZW50cnkgICAgICAgICAgICAgICAoREJ1c0hhc2hUYWJsZSAgICAgICAgICAqdGFibGUpOworc3RhdGljIHZvaWQgICAgICAgICAgIHJlbW92ZV9lbnRyeSAgICAgICAgICAgICAgKERCdXNIYXNoVGFibGUgICAgICAgICAgKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNIYXNoRW50cnkgICAgICAgICAqKmJ1Y2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzSGFzaEVudHJ5ICAgICAgICAgICplbnRyeSk7CitzdGF0aWMgdm9pZCAgICAgICAgICAgZnJlZV9lbnRyeSAgICAgICAgICAgICAgICAoREJ1c0hhc2hUYWJsZSAgICAgICAgICAqdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0hhc2hFbnRyeSAgICAgICAgICAqZW50cnkpOworc3RhdGljIHZvaWQgICAgICAgICAgIGZyZWVfZW50cnlfZGF0YSAgICAgICAgICAgKERCdXNIYXNoVGFibGUgICAgICAgICAgKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNIYXNoRW50cnkgICAgICAgICAgKmVudHJ5KTsKKworCisvKiogQH0gKi8KKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzSGFzaFRhYmxlCisgKiBAeworICovCisKKy8qKgorICogQHR5cGVkZWYgREJ1c0hhc2hJdGVyCisgKgorICogUHVibGljIG9wYXF1ZSBoYXNoIHRhYmxlIGl0ZXJhdG9yIG9iamVjdC4KKyAqLworCisvKioKKyAqIEB0eXBlZGVmIERCdXNIYXNoVGFibGUKKyAqCisgKiBQdWJsaWMgb3BhcXVlIGhhc2ggdGFibGUgb2JqZWN0LgorICovCisKKy8qKgorICogQHR5cGVkZWYgREJ1c0hhc2hUeXBlCisgKgorICogSW5kaWNhdGVzIHRoZSB0eXBlIG9mIGEga2V5IGluIHRoZSBoYXNoIHRhYmxlLgorICovCisKKy8qKgorICogQ29uc3RydWN0cyBhIG5ldyBoYXNoIHRhYmxlLiBTaG91bGQgYmUgZnJlZWQgd2l0aAorICogX2RidXNfaGFzaF90YWJsZV91bnJlZigpLiBJZiBtZW1vcnkgY2Fubm90IGJlCisgKiBhbGxvY2F0ZWQgZm9yIHRoZSBoYXNoIHRhYmxlLCByZXR1cm5zICNOVUxMLgorICoKKyAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlIG9mIGhhc2gga2V5IHRvIHVzZS4KKyAqIEBwYXJhbSBrZXlfZnJlZV9mdW5jdGlvbiBmdW5jdGlvbiB0byBmcmVlIGhhc2gga2V5cy4KKyAqIEBwYXJhbSB2YWx1ZV9mcmVlX2Z1bmN0aW9uIGZ1bmN0aW9uIHRvIGZyZWUgaGFzaCB2YWx1ZXMuCisgKiBAcmV0dXJucyBhIG5ldyBEQnVzSGFzaFRhYmxlIG9yICNOVUxMIGlmIG5vIG1lbW9yeS4KKyAqLworREJ1c0hhc2hUYWJsZSoKK19kYnVzX2hhc2hfdGFibGVfbmV3IChEQnVzSGFzaFR5cGUgICAgIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiBrZXlfZnJlZV9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICBEQnVzRnJlZUZ1bmN0aW9uIHZhbHVlX2ZyZWVfZnVuY3Rpb24pCit7CisgIERCdXNIYXNoVGFibGUgKnRhYmxlOworICBEQnVzTWVtUG9vbCAqZW50cnlfcG9vbDsKKyAgCisgIHRhYmxlID0gZGJ1c19uZXcwIChEQnVzSGFzaFRhYmxlLCAxKTsKKyAgaWYgKHRhYmxlID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgZW50cnlfcG9vbCA9IF9kYnVzX21lbV9wb29sX25ldyAoc2l6ZW9mIChEQnVzSGFzaEVudHJ5KSwgVFJVRSk7CisgIGlmIChlbnRyeV9wb29sID09IE5VTEwpCisgICAgeworICAgICAgZGJ1c19mcmVlICh0YWJsZSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIAorICB0YWJsZS0+cmVmY291bnQgPSAxOworICB0YWJsZS0+ZW50cnlfcG9vbCA9IGVudHJ5X3Bvb2w7CisgIAorICBfZGJ1c19hc3NlcnQgKERCVVNfU01BTExfSEFTSF9UQUJMRSA9PSBfREJVU19OX0VMRU1FTlRTICh0YWJsZS0+c3RhdGljX2J1Y2tldHMpKTsKKyAgCisgIHRhYmxlLT5idWNrZXRzID0gdGFibGUtPnN0YXRpY19idWNrZXRzOyAgCisgIHRhYmxlLT5uX2J1Y2tldHMgPSBEQlVTX1NNQUxMX0hBU0hfVEFCTEU7CisgIHRhYmxlLT5uX2VudHJpZXMgPSAwOworICB0YWJsZS0+aGlfcmVidWlsZF9zaXplID0gREJVU19TTUFMTF9IQVNIX1RBQkxFICogUkVCVUlMRF9NVUxUSVBMSUVSOworICB0YWJsZS0+bG9fcmVidWlsZF9zaXplID0gMDsKKyAgdGFibGUtPmRvd25fc2hpZnQgPSAyODsKKyAgdGFibGUtPm1hc2sgPSAzOworICB0YWJsZS0+a2V5X3R5cGUgPSB0eXBlOworCisgIF9kYnVzX2Fzc2VydCAodGFibGUtPm1hc2sgPCB0YWJsZS0+bl9idWNrZXRzKTsKKyAgCisgIHN3aXRjaCAodGFibGUtPmtleV90eXBlKQorICAgIHsKKyAgICBjYXNlIERCVVNfSEFTSF9JTlQ6CisgICAgY2FzZSBEQlVTX0hBU0hfVUlOVFBUUjoKKyAgICAgIHRhYmxlLT5maW5kX2Z1bmN0aW9uID0gZmluZF9kaXJlY3RfZnVuY3Rpb247CisgICAgICBicmVhazsKKyAgICBjYXNlIERCVVNfSEFTSF9TVFJJTkc6CisgICAgICB0YWJsZS0+ZmluZF9mdW5jdGlvbiA9IGZpbmRfc3RyaW5nX2Z1bmN0aW9uOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIlVua25vd24gaGFzaCB0YWJsZSB0eXBlIik7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgdGFibGUtPmZyZWVfa2V5X2Z1bmN0aW9uID0ga2V5X2ZyZWVfZnVuY3Rpb247CisgIHRhYmxlLT5mcmVlX3ZhbHVlX2Z1bmN0aW9uID0gdmFsdWVfZnJlZV9mdW5jdGlvbjsKKworICByZXR1cm4gdGFibGU7Cit9CisKKworLyoqCisgKiBJbmNyZW1lbnRzIHRoZSByZWZlcmVuY2UgY291bnQgZm9yIGEgaGFzaCB0YWJsZS4KKyAqCisgKiBAcGFyYW0gdGFibGUgdGhlIGhhc2ggdGFibGUgdG8gYWRkIGEgcmVmZXJlbmNlIHRvLgorICogQHJldHVybnMgdGhlIGhhc2ggdGFibGUuCisgKi8KK0RCdXNIYXNoVGFibGUgKgorX2RidXNfaGFzaF90YWJsZV9yZWYgKERCdXNIYXNoVGFibGUgKnRhYmxlKQoreworICB0YWJsZS0+cmVmY291bnQgKz0gMTsKKyAgCisgIHJldHVybiB0YWJsZTsKK30KKworLyoqCisgKiBEZWNyZW1lbnRzIHRoZSByZWZlcmVuY2UgY291bnQgZm9yIGEgaGFzaCB0YWJsZSwKKyAqIGZyZWVpbmcgdGhlIGhhc2ggdGFibGUgaWYgdGhlIGNvdW50IHJlYWNoZXMgemVyby4KKyAqCisgKiBAcGFyYW0gdGFibGUgdGhlIGhhc2ggdGFibGUgdG8gcmVtb3ZlIGEgcmVmZXJlbmNlIGZyb20uCisgKi8KK3ZvaWQKK19kYnVzX2hhc2hfdGFibGVfdW5yZWYgKERCdXNIYXNoVGFibGUgKnRhYmxlKQoreworICB0YWJsZS0+cmVmY291bnQgLT0gMTsKKworICBpZiAodGFibGUtPnJlZmNvdW50ID09IDApCisgICAgeworI2lmIDAKKyAgICAgIERCdXNIYXNoRW50cnkgKmVudHJ5OworICAgICAgREJ1c0hhc2hFbnRyeSAqbmV4dDsKKyAgICAgIGludCBpOworCisgICAgICAvKiBGcmVlIHRoZSBlbnRyaWVzIGluIHRoZSB0YWJsZS4gKi8KKyAgICAgIGZvciAoaSA9IDA7IGkgPCB0YWJsZS0+bl9idWNrZXRzOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICBlbnRyeSA9IHRhYmxlLT5idWNrZXRzW2ldOworICAgICAgICAgIHdoaWxlIChlbnRyeSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBuZXh0ID0gZW50cnktPm5leHQ7CisKKyAgICAgICAgICAgICAgZnJlZV9lbnRyeSAodGFibGUsIGVudHJ5KTsKKyAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIGVudHJ5ID0gbmV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2Vsc2UKKyAgICAgIERCdXNIYXNoRW50cnkgKmVudHJ5OworICAgICAgaW50IGk7CisKKyAgICAgIC8qIEZyZWUgdGhlIGVudHJpZXMgaW4gdGhlIHRhYmxlLiAqLworICAgICAgZm9yIChpID0gMDsgaSA8IHRhYmxlLT5uX2J1Y2tldHM7IGkrKykKKyAgICAgICAgeworICAgICAgICAgIGVudHJ5ID0gdGFibGUtPmJ1Y2tldHNbaV07CisgICAgICAgICAgd2hpbGUgKGVudHJ5ICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGZyZWVfZW50cnlfZGF0YSAodGFibGUsIGVudHJ5KTsKKyAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIGVudHJ5ID0gZW50cnktPm5leHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIC8qIFdlIGNhbiBkbyB0aGlzIHZlcnkgcXVpY2tseSB3aXRoIG1lbW9yeSBwb29scyA7LSkgKi8KKyAgICAgIF9kYnVzX21lbV9wb29sX2ZyZWUgKHRhYmxlLT5lbnRyeV9wb29sKTsKKyNlbmRpZgorICAgICAgCisgICAgICAvKiBGcmVlIHRoZSBidWNrZXQgYXJyYXksIGlmIGl0IHdhcyBkeW5hbWljYWxseSBhbGxvY2F0ZWQuICovCisgICAgICBpZiAodGFibGUtPmJ1Y2tldHMgIT0gdGFibGUtPnN0YXRpY19idWNrZXRzKQorICAgICAgICBkYnVzX2ZyZWUgKHRhYmxlLT5idWNrZXRzKTsKKworICAgICAgZGJ1c19mcmVlICh0YWJsZSk7CisgICAgfQorfQorCisvKioKKyAqIFJlbW92ZWQgYWxsIGVudHJpZXMgZnJvbSBhIGhhc2ggdGFibGUuCisgKgorICogQHBhcmFtIHRhYmxlIHRoZSBoYXNoIHRhYmxlIHRvIHJlbW92ZSBhbGwgZW50cmllcyBmcm9tLgorICovCit2b2lkCitfZGJ1c19oYXNoX3RhYmxlX3JlbW92ZV9hbGwgKERCdXNIYXNoVGFibGUgKnRhYmxlKQoreworICBEQnVzSGFzaEl0ZXIgaXRlcjsKKyAgX2RidXNfaGFzaF9pdGVyX2luaXQgKHRhYmxlLCAmaXRlcik7CisgIHdoaWxlIChfZGJ1c19oYXNoX2l0ZXJfbmV4dCAoJml0ZXIpKQorICAgIHsKKyAgICAgIF9kYnVzX2hhc2hfaXRlcl9yZW1vdmVfZW50cnkoJml0ZXIpOworICAgIH0KK30KKworc3RhdGljIERCdXNIYXNoRW50cnkqCithbGxvY19lbnRyeSAoREJ1c0hhc2hUYWJsZSAqdGFibGUpCit7CisgIERCdXNIYXNoRW50cnkgKmVudHJ5OworCisgIGVudHJ5ID0gX2RidXNfbWVtX3Bvb2xfYWxsb2MgKHRhYmxlLT5lbnRyeV9wb29sKTsKKyAgCisgIHJldHVybiBlbnRyeTsKK30KKworc3RhdGljIHZvaWQKK2ZyZWVfZW50cnlfZGF0YSAoREJ1c0hhc2hUYWJsZSAgKnRhYmxlLAorCQkgREJ1c0hhc2hFbnRyeSAgKmVudHJ5KQoreworICBpZiAodGFibGUtPmZyZWVfa2V5X2Z1bmN0aW9uKQorICAgICgqIHRhYmxlLT5mcmVlX2tleV9mdW5jdGlvbikgKGVudHJ5LT5rZXkpOworICBpZiAodGFibGUtPmZyZWVfdmFsdWVfZnVuY3Rpb24pCisgICAgKCogdGFibGUtPmZyZWVfdmFsdWVfZnVuY3Rpb24pIChlbnRyeS0+dmFsdWUpOworfQorCitzdGF0aWMgdm9pZAorZnJlZV9lbnRyeSAoREJ1c0hhc2hUYWJsZSAgKnRhYmxlLAorICAgICAgICAgICAgREJ1c0hhc2hFbnRyeSAgKmVudHJ5KQoreworICBmcmVlX2VudHJ5X2RhdGEgKHRhYmxlLCBlbnRyeSk7CisgIF9kYnVzX21lbV9wb29sX2RlYWxsb2MgKHRhYmxlLT5lbnRyeV9wb29sLCBlbnRyeSk7Cit9CisKK3N0YXRpYyB2b2lkCityZW1vdmVfZW50cnkgKERCdXNIYXNoVGFibGUgICp0YWJsZSwKKyAgICAgICAgICAgICAgREJ1c0hhc2hFbnRyeSAqKmJ1Y2tldCwKKyAgICAgICAgICAgICAgREJ1c0hhc2hFbnRyeSAgKmVudHJ5KQoreworICBfZGJ1c19hc3NlcnQgKHRhYmxlICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKGJ1Y2tldCAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0ICgqYnVja2V0ICE9IE5VTEwpOyAgCisgIF9kYnVzX2Fzc2VydCAoZW50cnkgIT0gTlVMTCk7CisgIAorICBpZiAoKmJ1Y2tldCA9PSBlbnRyeSkKKyAgICAqYnVja2V0ID0gZW50cnktPm5leHQ7CisgIGVsc2UKKyAgICB7CisgICAgICBEQnVzSGFzaEVudHJ5ICpwcmV2OworICAgICAgcHJldiA9ICpidWNrZXQ7CisKKyAgICAgIHdoaWxlIChwcmV2LT5uZXh0ICE9IGVudHJ5KQorICAgICAgICBwcmV2ID0gcHJldi0+bmV4dDsgICAgICAKKyAgICAgIAorICAgICAgX2RidXNfYXNzZXJ0IChwcmV2ICE9IE5VTEwpOworCisgICAgICBwcmV2LT5uZXh0ID0gZW50cnktPm5leHQ7CisgICAgfQorICAKKyAgdGFibGUtPm5fZW50cmllcyAtPSAxOworICBmcmVlX2VudHJ5ICh0YWJsZSwgZW50cnkpOworfQorCisvKioKKyAqIEluaXRpYWxpemVzIGEgaGFzaCB0YWJsZSBpdGVyYXRvci4gVG8gaXRlcmF0ZSBvdmVyIGFsbCBlbnRyaWVzIGluIGEKKyAqIGhhc2ggdGFibGUsIHVzZSB0aGUgZm9sbG93aW5nIGNvZGUgKHRoZSBwcmludGYgYXNzdW1lcyBhIGhhc2gKKyAqIGZyb20gc3RyaW5ncyB0byBzdHJpbmdzIG9idmlvdXNseSk6CisgKgorICogQGNvZGUKKyAqIERCdXNIYXNoSXRlciBpdGVyOworICoKKyAqIF9kYnVzX2hhc2hfaXRlcl9pbml0ICh0YWJsZSwgJml0ZXIpOworICogd2hpbGUgKF9kYnVzX2hhc2hfaXRlcl9uZXh0ICgmaXRlcikpCisgKiAgIHsKKyAqICAgICAgcHJpbnRmICgiVGhlIGZpcnN0IGtleSBpcyAlcyBhbmQgdmFsdWUgaXMgJXNcbiIsCisgKiAgICAgICAgICAgICAgX2RidXNfaGFzaF9pdGVyX2dldF9zdHJpbmdfa2V5ICgmaXRlciksCisgKiAgICAgICAgICAgICAgX2RidXNfaGFzaF9pdGVyX2dldF92YWx1ZSAoJml0ZXIpKTsKKyAqICAgfQorICogCisgKiAKKyAqIEBlbmRjb2RlCisgKgorICogVGhlIGl0ZXJhdG9yIGlzIGluaXRpYWxpemVkIHBvaW50aW5nICJvbmUgYmVmb3JlIiB0aGUgZmlyc3QgaGFzaAorICogZW50cnkuIFRoZSBmaXJzdCBjYWxsIHRvIF9kYnVzX2hhc2hfaXRlcl9uZXh0KCkgbW92ZXMgaXQgb250bworICogdGhlIGZpcnN0IHZhbGlkIGVudHJ5IG9yIHJldHVybnMgI0ZBTFNFIGlmIHRoZSBoYXNoIHRhYmxlIGlzCisgKiBlbXB0eS4gU3Vic2VxdWVudCBjYWxscyBtb3ZlIHRvIHRoZSBuZXh0IHZhbGlkIGVudHJ5IG9yIHJldHVybgorICogI0ZBTFNFIGlmIHRoZXJlIGFyZSBubyBtb3JlIGVudHJpZXMuCisgKgorICogTm90ZSB0aGF0IGl0IGlzIGd1YXJhbnRlZWQgdG8gYmUgc2FmZSB0byByZW1vdmUgYSBoYXNoIGVudHJ5IGR1cmluZworICogaXRlcmF0aW9uLCBidXQgaXQgaXMgbm90IHNhZmUgdG8gYWRkIGEgaGFzaCBlbnRyeS4KKyAqIAorICogQHBhcmFtIHRhYmxlIHRoZSBoYXNoIHRhYmxlIHRvIGl0ZXJhdGUgb3Zlci4KKyAqIEBwYXJhbSBpdGVyIHRoZSBpdGVyYXRvciB0byBpbml0aWFsaXplLgorICovCit2b2lkCitfZGJ1c19oYXNoX2l0ZXJfaW5pdCAoREJ1c0hhc2hUYWJsZSAqdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgREJ1c0hhc2hJdGVyICAqaXRlcikKK3sKKyAgREJ1c1JlYWxIYXNoSXRlciAqcmVhbDsKKyAgCisgIF9EQlVTX1NUQVRJQ19BU1NFUlQgKHNpemVvZiAoREJ1c0hhc2hJdGVyKSA9PSBzaXplb2YgKERCdXNSZWFsSGFzaEl0ZXIpKTsKKyAgCisgIHJlYWwgPSAoREJ1c1JlYWxIYXNoSXRlciopIGl0ZXI7CisKKyAgcmVhbC0+dGFibGUgPSB0YWJsZTsKKyAgcmVhbC0+YnVja2V0ID0gTlVMTDsKKyAgcmVhbC0+ZW50cnkgPSBOVUxMOworICByZWFsLT5uZXh0X2VudHJ5ID0gTlVMTDsKKyAgcmVhbC0+bmV4dF9idWNrZXQgPSAwOworICByZWFsLT5uX2VudHJpZXNfb25faW5pdCA9IHRhYmxlLT5uX2VudHJpZXM7Cit9CisKKy8qKgorICogTW92ZSB0aGUgaGFzaCBpdGVyYXRvciBmb3J3YXJkIG9uZSBzdGVwLCB0byB0aGUgbmV4dCBoYXNoIGVudHJ5LgorICogVGhlIGRvY3VtZW50YXRpb24gZm9yIF9kYnVzX2hhc2hfaXRlcl9pbml0KCkgZXhwbGFpbnMgaW4gbW9yZQorICogZGV0YWlsLgorICoKKyAqIEBwYXJhbSBpdGVyIHRoZSBpdGVyYXRvciB0byBtb3ZlIGZvcndhcmQuCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgdGhlcmUgYXJlIG5vIG1vcmUgZW50cmllcyB0byBtb3ZlIHRvLgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfaGFzaF9pdGVyX25leHQgKERCdXNIYXNoSXRlciAgKml0ZXIpCit7CisgIERCdXNSZWFsSGFzaEl0ZXIgKnJlYWw7CisgIAorICBfREJVU19TVEFUSUNfQVNTRVJUIChzaXplb2YgKERCdXNIYXNoSXRlcikgPT0gc2l6ZW9mIChEQnVzUmVhbEhhc2hJdGVyKSk7CisgIAorICByZWFsID0gKERCdXNSZWFsSGFzaEl0ZXIqKSBpdGVyOworCisgIC8qIGlmIHRoaXMgYXNzZXJ0aW9uIGZhaWxlZCBzb21lb25lIHByb2JhYmx5IGFkZGVkIGhhc2ggZW50cmllcworICAgKiBkdXJpbmcgaXRlcmF0aW9uLCB3aGljaCBpcyBiYWQuCisgICAqLworICBfZGJ1c19hc3NlcnQgKHJlYWwtPm5fZW50cmllc19vbl9pbml0ID49IHJlYWwtPnRhYmxlLT5uX2VudHJpZXMpOworICAKKyAgLyogUmVtZW1iZXIgdGhhdCByZWFsLT5lbnRyeSBtYXkgaGF2ZSBiZWVuIGRlbGV0ZWQgKi8KKyAgCisgIHdoaWxlIChyZWFsLT5uZXh0X2VudHJ5ID09IE5VTEwpCisgICAgeworICAgICAgaWYgKHJlYWwtPm5leHRfYnVja2V0ID49IHJlYWwtPnRhYmxlLT5uX2J1Y2tldHMpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBpbnZhbGlkYXRlIGl0ZXIgYW5kIHJldHVybiBmYWxzZSAqLworICAgICAgICAgIHJlYWwtPmVudHJ5ID0gTlVMTDsKKyAgICAgICAgICByZWFsLT50YWJsZSA9IE5VTEw7CisgICAgICAgICAgcmVhbC0+YnVja2V0ID0gTlVMTDsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgcmVhbC0+YnVja2V0ID0gJihyZWFsLT50YWJsZS0+YnVja2V0c1tyZWFsLT5uZXh0X2J1Y2tldF0pOworICAgICAgcmVhbC0+bmV4dF9lbnRyeSA9ICoocmVhbC0+YnVja2V0KTsKKyAgICAgIHJlYWwtPm5leHRfYnVja2V0ICs9IDE7CisgICAgfQorCisgIF9kYnVzX2Fzc2VydCAocmVhbC0+bmV4dF9lbnRyeSAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChyZWFsLT5idWNrZXQgIT0gTlVMTCk7CisgIAorICByZWFsLT5lbnRyeSA9IHJlYWwtPm5leHRfZW50cnk7CisgIHJlYWwtPm5leHRfZW50cnkgPSByZWFsLT5lbnRyeS0+bmV4dDsKKyAgCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIFJlbW92ZXMgdGhlIGN1cnJlbnQgZW50cnkgZnJvbSB0aGUgaGFzaCB0YWJsZS4KKyAqIElmIGEga2V5X2ZyZWVfZnVuY3Rpb24gb3IgdmFsdWVfZnJlZV9mdW5jdGlvbgorICogd2FzIHByb3ZpZGVkIHRvIF9kYnVzX2hhc2hfdGFibGVfbmV3KCksCisgKiBmcmVlcyB0aGUga2V5IGFuZC9vciB2YWx1ZSBmb3IgdGhpcyBlbnRyeS4KKyAqCisgKiBAcGFyYW0gaXRlciB0aGUgaGFzaCB0YWJsZSBpdGVyYXRvci4KKyAqLwordm9pZAorX2RidXNfaGFzaF9pdGVyX3JlbW92ZV9lbnRyeSAoREJ1c0hhc2hJdGVyICppdGVyKQoreworICBEQnVzUmVhbEhhc2hJdGVyICpyZWFsOworCisgIHJlYWwgPSAoREJ1c1JlYWxIYXNoSXRlciopIGl0ZXI7CisKKyAgX2RidXNfYXNzZXJ0IChyZWFsLT50YWJsZSAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChyZWFsLT5lbnRyeSAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChyZWFsLT5idWNrZXQgIT0gTlVMTCk7CisgIAorICByZW1vdmVfZW50cnkgKHJlYWwtPnRhYmxlLCByZWFsLT5idWNrZXQsIHJlYWwtPmVudHJ5KTsKKworICByZWFsLT5lbnRyeSA9IE5VTEw7IC8qIG1ha2UgaXQgY3Jhc2ggaWYgeW91IHRyeSB0byB1c2UgdGhpcyBlbnRyeSAqLworfQorCisvKioKKyAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBjdXJyZW50IGVudHJ5LgorICoKKyAqIEBwYXJhbSBpdGVyIHRoZSBoYXNoIHRhYmxlIGl0ZXJhdG9yLgorICovCit2b2lkKgorX2RidXNfaGFzaF9pdGVyX2dldF92YWx1ZSAoREJ1c0hhc2hJdGVyICppdGVyKQoreworICBEQnVzUmVhbEhhc2hJdGVyICpyZWFsOworCisgIHJlYWwgPSAoREJ1c1JlYWxIYXNoSXRlciopIGl0ZXI7CisKKyAgX2RidXNfYXNzZXJ0IChyZWFsLT50YWJsZSAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChyZWFsLT5lbnRyeSAhPSBOVUxMKTsKKworICByZXR1cm4gcmVhbC0+ZW50cnktPnZhbHVlOworfQorCisvKioKKyAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBjdXJyZW50IGVudHJ5LgorICogSWYgdGhlIGhhc2ggdGFibGUgaGFzIGEgdmFsdWVfZnJlZV9mdW5jdGlvbgorICogaXQgd2lsbCBiZSB1c2VkIHRvIGZyZWUgdGhlIHByZXZpb3VzIHZhbHVlLgorICogVGhlIGhhc2ggdGFibGUgd2lsbCBvd24gdGhlIHBhc3NlZC1pbiB2YWx1ZQorICogKGl0IHdpbGwgbm90IGJlIGNvcGllZCkuCisgKgorICogQHBhcmFtIGl0ZXIgdGhlIGhhc2ggdGFibGUgaXRlcmF0b3IuCisgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZS4KKyAqLwordm9pZAorX2RidXNfaGFzaF9pdGVyX3NldF92YWx1ZSAoREJ1c0hhc2hJdGVyICppdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICp2YWx1ZSkKK3sKKyAgREJ1c1JlYWxIYXNoSXRlciAqcmVhbDsKKworICByZWFsID0gKERCdXNSZWFsSGFzaEl0ZXIqKSBpdGVyOworCisgIF9kYnVzX2Fzc2VydCAocmVhbC0+dGFibGUgIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAocmVhbC0+ZW50cnkgIT0gTlVMTCk7CisKKyAgaWYgKHJlYWwtPnRhYmxlLT5mcmVlX3ZhbHVlX2Z1bmN0aW9uICYmIHZhbHVlICE9IHJlYWwtPmVudHJ5LT52YWx1ZSkgICAgCisgICAgKCogcmVhbC0+dGFibGUtPmZyZWVfdmFsdWVfZnVuY3Rpb24pIChyZWFsLT5lbnRyeS0+dmFsdWUpOworICAKKyAgcmVhbC0+ZW50cnktPnZhbHVlID0gdmFsdWU7Cit9CisKKy8qKgorICogR2V0cyB0aGUga2V5IGZvciB0aGUgY3VycmVudCBlbnRyeS4KKyAqIE9ubHkgd29ya3MgZm9yIGhhc2ggdGFibGVzIG9mIHR5cGUgI0RCVVNfSEFTSF9JTlQuCisgKgorICogQHBhcmFtIGl0ZXIgdGhlIGhhc2ggdGFibGUgaXRlcmF0b3IuCisgKi8KK2ludAorX2RidXNfaGFzaF9pdGVyX2dldF9pbnRfa2V5IChEQnVzSGFzaEl0ZXIgKml0ZXIpCit7CisgIERCdXNSZWFsSGFzaEl0ZXIgKnJlYWw7CisKKyAgcmVhbCA9IChEQnVzUmVhbEhhc2hJdGVyKikgaXRlcjsKKworICBfZGJ1c19hc3NlcnQgKHJlYWwtPnRhYmxlICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKHJlYWwtPmVudHJ5ICE9IE5VTEwpOworCisgIHJldHVybiBfREJVU19QT0lOVEVSX1RPX0lOVCAocmVhbC0+ZW50cnktPmtleSk7Cit9CisKKy8qKgorICogR2V0cyB0aGUga2V5IGZvciB0aGUgY3VycmVudCBlbnRyeS4KKyAqIE9ubHkgd29ya3MgZm9yIGhhc2ggdGFibGVzIG9mIHR5cGUgI0RCVVNfSEFTSF9VSU5UUFRSLgorICoKKyAqIEBwYXJhbSBpdGVyIHRoZSBoYXNoIHRhYmxlIGl0ZXJhdG9yLgorICovCit1aW50cHRyX3QKK19kYnVzX2hhc2hfaXRlcl9nZXRfdWludHB0cl9rZXkgKERCdXNIYXNoSXRlciAqaXRlcikKK3sKKyAgREJ1c1JlYWxIYXNoSXRlciAqcmVhbDsKKworICByZWFsID0gKERCdXNSZWFsSGFzaEl0ZXIqKSBpdGVyOworCisgIF9kYnVzX2Fzc2VydCAocmVhbC0+dGFibGUgIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAocmVhbC0+ZW50cnkgIT0gTlVMTCk7CisKKyAgcmV0dXJuICh1aW50cHRyX3QpIHJlYWwtPmVudHJ5LT5rZXk7Cit9CisKKy8qKgorICogR2V0cyB0aGUga2V5IGZvciB0aGUgY3VycmVudCBlbnRyeS4KKyAqIE9ubHkgd29ya3MgZm9yIGhhc2ggdGFibGVzIG9mIHR5cGUgI0RCVVNfSEFTSF9TVFJJTkcKKyAqIEBwYXJhbSBpdGVyIHRoZSBoYXNoIHRhYmxlIGl0ZXJhdG9yLgorICovCitjb25zdCBjaGFyKgorX2RidXNfaGFzaF9pdGVyX2dldF9zdHJpbmdfa2V5IChEQnVzSGFzaEl0ZXIgKml0ZXIpCit7CisgIERCdXNSZWFsSGFzaEl0ZXIgKnJlYWw7CisKKyAgcmVhbCA9IChEQnVzUmVhbEhhc2hJdGVyKikgaXRlcjsKKworICBfZGJ1c19hc3NlcnQgKHJlYWwtPnRhYmxlICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKHJlYWwtPmVudHJ5ICE9IE5VTEwpOworCisgIHJldHVybiByZWFsLT5lbnRyeS0+a2V5OworfQorCisvKioKKyAqIEEgbG93LWxldmVsIGJ1dCBlZmZpY2llbnQgaW50ZXJmYWNlIGZvciBtYW5pcHVsYXRpbmcgdGhlIGhhc2gKKyAqIHRhYmxlLiAgSXQncyBlZmZpY2llbnQgYmVjYXVzZSB5b3UgY2FuIGdldCwgc2V0LCBhbmQgb3B0aW9uYWxseQorICogY3JlYXRlIHRoZSBoYXNoIGVudHJ5IHdoaWxlIG9ubHkgcnVubmluZyB0aGUgaGFzaCBmdW5jdGlvbiBvbmUKKyAqIHRpbWUuCisgKgorICogTm90ZSB0aGF0IHdoaWxlIGNhbGxpbmcgX2RidXNfaGFzaF9pdGVyX25leHQoKSBvbiB0aGUgaXRlcmF0b3IKKyAqIGZpbGxlZCBpbiBieSB0aGlzIGZ1bmN0aW9uIG1heSB3b3JrLCBpdCdzIGNvbXBsZXRlbHkKKyAqIHVuZGVmaW5lZCB3aGljaCBlbnRyaWVzIGFyZSBhZnRlciB0aGlzIGl0ZXIgYW5kIHdoaWNoCisgKiBhcmUgYmVmb3JlIGl0LiBTbyBpdCB3b3VsZCBiZSBzaWxseSB0byBpdGVyYXRlIHVzaW5nIHRoaXMKKyAqIGl0ZXJhdG9yLgorICoKKyAqIElmIHRoZSBoYXNoIGVudHJ5IGlzIGNyZWF0ZWQsIGl0cyB2YWx1ZSB3aWxsIGJlIGluaXRpYWxpemVkCisgKiB0byBhbGwgYml0cyB6ZXJvLgorICoKKyAqICNGQUxTRSBtYXkgYmUgcmV0dXJuZWQgZHVlIHRvIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUsIG9yCisgKiBiZWNhdXNlIGNyZWF0ZV9pZl9ub3RfZm91bmQgd2FzICNGQUxTRSBhbmQgdGhlIGVudHJ5CisgKiBkaWQgbm90IGV4aXN0LgorICoKKyAqIElmIGNyZWF0ZV9pZl9ub3RfZm91bmQgaXMgI1RSVUUsIHRoZSBoYXNoCisgKiB0YWJsZSB0YWtlcyBvd25lcnNoaXAgb2YgdGhlIGtleSB0aGF0J3MgcGFzc2VkIGluIChlaXRoZXIgdXNpbmcgaXQgdG8gY3JlYXRlCisgKiB0aGUgZW50cnksIG9yIGZyZWVpbmcgaXQgaW1tZWRpYXRlbHkpLgorICoKKyAqIEZvciBhIGhhc2ggdGFibGUgb2YgdHlwZSAjREJVU19IQVNIX0lOVCwgY2FzdCB0aGUgaW50CisgKiBrZXkgdG8gdGhlIGtleSBwYXJhbWV0ZXIgdXNpbmcgI19EQlVTX0lOVF9UT19QT0lOVEVSKCkuCisgKiAKKyAqIEBwYXJhbSB0YWJsZSB0aGUgaGFzaCB0YWJsZS4KKyAqIEBwYXJhbSBrZXkgdGhlIGhhc2gga2V5LgorICogQHBhcmFtIGNyZWF0ZV9pZl9ub3RfZm91bmQgaWYgI1RSVUUsIGNyZWF0ZSB0aGUgZW50cnkgaWYgaXQgZGlkbid0IGV4aXN0LgorICogQHBhcmFtIGl0ZXIgdGhlIGl0ZXJhdG9yIHRvIGluaXRpYWxpemUuCisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGUgaGFzaCBlbnRyeSBub3cgZXhpc3RzIChhbmQgdGhlIGl0ZXJhdG9yIGlzIHRodXMgdmFsaWQpLgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfaGFzaF9pdGVyX2xvb2t1cCAoREJ1c0hhc2hUYWJsZSAqdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICprZXksCisgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICBjcmVhdGVfaWZfbm90X2ZvdW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0hhc2hJdGVyICAqaXRlcikKK3sKKyAgREJ1c1JlYWxIYXNoSXRlciAqcmVhbDsKKyAgREJ1c0hhc2hFbnRyeSAqZW50cnk7CisgIERCdXNIYXNoRW50cnkgKipidWNrZXQ7CisgIAorICBfREJVU19TVEFUSUNfQVNTRVJUIChzaXplb2YgKERCdXNIYXNoSXRlcikgPT0gc2l6ZW9mIChEQnVzUmVhbEhhc2hJdGVyKSk7CisgIAorICByZWFsID0gKERCdXNSZWFsSGFzaEl0ZXIqKSBpdGVyOworCisgIGVudHJ5ID0gKCogdGFibGUtPmZpbmRfZnVuY3Rpb24pICh0YWJsZSwga2V5LCBjcmVhdGVfaWZfbm90X2ZvdW5kLCAmYnVja2V0LCBOVUxMKTsKKworICBpZiAoZW50cnkgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKGNyZWF0ZV9pZl9ub3RfZm91bmQpCisgICAgeworICAgICAgaWYgKHRhYmxlLT5mcmVlX2tleV9mdW5jdGlvbiAmJiBlbnRyeS0+a2V5ICE9IGtleSkKKyAgICAgICAgKCogdGFibGUtPmZyZWVfa2V5X2Z1bmN0aW9uKSAoZW50cnktPmtleSk7CisKKyAgICAgIGVudHJ5LT5rZXkgPSBrZXk7CisgICAgfQorCisgIHJlYWwtPnRhYmxlID0gdGFibGU7CisgIHJlYWwtPmJ1Y2tldCA9IGJ1Y2tldDsKKyAgcmVhbC0+ZW50cnkgPSBlbnRyeTsKKyAgcmVhbC0+bmV4dF9lbnRyeSA9IGVudHJ5LT5uZXh0OworICByZWFsLT5uZXh0X2J1Y2tldCA9IChidWNrZXQgLSB0YWJsZS0+YnVja2V0cykgKyAxOworICByZWFsLT5uX2VudHJpZXNfb25faW5pdCA9IHRhYmxlLT5uX2VudHJpZXM7IAorCisgIF9kYnVzX2Fzc2VydCAoJih0YWJsZS0+YnVja2V0c1tyZWFsLT5uZXh0X2J1Y2tldC0xXSkgPT0gcmVhbC0+YnVja2V0KTsKKyAgCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorYWRkX2FsbG9jYXRlZF9lbnRyeSAoREJ1c0hhc2hUYWJsZSAgICp0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgIERCdXNIYXNoRW50cnkgICAqZW50cnksCisgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgICAgIGlkeCwKKyAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgREJ1c0hhc2hFbnRyeSAqKipidWNrZXQpCit7CisgIERCdXNIYXNoRW50cnkgKipiOyAgCisgIAorICBlbnRyeS0+a2V5ID0ga2V5OworICAKKyAgYiA9ICYodGFibGUtPmJ1Y2tldHNbaWR4XSk7CisgIGVudHJ5LT5uZXh0ID0gKmI7CisgICpiID0gZW50cnk7CisKKyAgaWYgKGJ1Y2tldCkKKyAgICAqYnVja2V0ID0gYjsKKyAgCisgIHRhYmxlLT5uX2VudHJpZXMgKz0gMTsKKworICAvKiBub3RlIHdlIE9OTFkgcmVidWlsZCB3aGVuIEFERElORyAtIGJlY2F1c2UgeW91IGNhbiBpdGVyYXRlIG92ZXIgYQorICAgKiB0YWJsZSBhbmQgcmVtb3ZlIGVudHJpZXMgc2FmZWx5LgorICAgKi8KKyAgaWYgKHRhYmxlLT5uX2VudHJpZXMgPj0gdGFibGUtPmhpX3JlYnVpbGRfc2l6ZSB8fAorICAgICAgdGFibGUtPm5fZW50cmllcyA8IHRhYmxlLT5sb19yZWJ1aWxkX3NpemUpCisgICAgcmVidWlsZF90YWJsZSAodGFibGUpOworfQorCitzdGF0aWMgREJ1c0hhc2hFbnRyeSoKK2FkZF9lbnRyeSAoREJ1c0hhc2hUYWJsZSAgICAgICAgKnRhYmxlLCAKKyAgICAgICAgICAgdW5zaWduZWQgaW50ICAgICAgICAgIGlkeCwKKyAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgKmtleSwKKyAgICAgICAgICAgREJ1c0hhc2hFbnRyeSAgICAgICoqKmJ1Y2tldCwKKyAgICAgICAgICAgREJ1c1ByZWFsbG9jYXRlZEhhc2ggKnByZWFsbG9jYXRlZCkKK3sKKyAgREJ1c0hhc2hFbnRyeSAgKmVudHJ5OworCisgIGlmIChwcmVhbGxvY2F0ZWQgPT0gTlVMTCkKKyAgICB7CisgICAgICBlbnRyeSA9IGFsbG9jX2VudHJ5ICh0YWJsZSk7CisgICAgICBpZiAoZW50cnkgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGlmIChidWNrZXQpCisgICAgICAgICAgICAqYnVja2V0ID0gTlVMTDsKKyAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGVudHJ5ID0gKERCdXNIYXNoRW50cnkqKSBwcmVhbGxvY2F0ZWQ7CisgICAgfQorCisgIGFkZF9hbGxvY2F0ZWRfZW50cnkgKHRhYmxlLCBlbnRyeSwgaWR4LCBrZXksIGJ1Y2tldCk7CisKKyAgcmV0dXJuIGVudHJ5OworfQorCisvKiBUaGlzIGlzIGdfc3RyX2hhc2ggZnJvbSBHTGliIHdoaWNoIHdhcworICogZXh0ZW5zaXZlbHkgZGlzY3Vzc2VkL3Rlc3RlZC9wcm9maWxlZAorICovCitzdGF0aWMgdW5zaWduZWQgaW50CitzdHJpbmdfaGFzaCAoY29uc3QgY2hhciAqc3RyKQoreworICBjb25zdCBjaGFyICpwID0gc3RyOworICB1bnNpZ25lZCBpbnQgaCA9ICpwOworCisgIGlmIChoKQorICAgIGZvciAocCArPSAxOyAqcCAhPSAnXDAnOyBwKyspCisgICAgICBoID0gKGggPDwgNSkgLSBoICsgKnA7CisKKyAgcmV0dXJuIGg7Cit9CisKKy8qKiBLZXkgY29tcGFyaXNvbiBmdW5jdGlvbiAqLwordHlwZWRlZiBpbnQgKCogS2V5Q29tcGFyZUZ1bmMpIChjb25zdCB2b2lkICprZXlfYSwgY29uc3Qgdm9pZCAqa2V5X2IpOworCitzdGF0aWMgREJ1c0hhc2hFbnRyeSoKK2ZpbmRfZ2VuZXJpY19mdW5jdGlvbiAoREJ1c0hhc2hUYWJsZSAgICAgICAgKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgaWR4LAorICAgICAgICAgICAgICAgICAgICAgICBLZXlDb21wYXJlRnVuYyAgICAgICAgY29tcGFyZV9mdW5jLAorICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICAgICAgY3JlYXRlX2lmX25vdF9mb3VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgREJ1c0hhc2hFbnRyeSAgICAgICoqKmJ1Y2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgREJ1c1ByZWFsbG9jYXRlZEhhc2ggKnByZWFsbG9jYXRlZCkKK3sKKyAgREJ1c0hhc2hFbnRyeSAqZW50cnk7CisKKyAgaWYgKGJ1Y2tldCkKKyAgICAqYnVja2V0ID0gTlVMTDsKKworICAvKiBTZWFyY2ggYWxsIG9mIHRoZSBlbnRyaWVzIGluIHRoaXMgYnVja2V0LiAqLworICBlbnRyeSA9IHRhYmxlLT5idWNrZXRzW2lkeF07CisgIHdoaWxlIChlbnRyeSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmICgoY29tcGFyZV9mdW5jID09IE5VTEwgJiYga2V5ID09IGVudHJ5LT5rZXkpIHx8CisgICAgICAgICAgKGNvbXBhcmVfZnVuYyAhPSBOVUxMICYmICgqIGNvbXBhcmVfZnVuYykgKGtleSwgZW50cnktPmtleSkgPT0gMCkpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoYnVja2V0KQorICAgICAgICAgICAgKmJ1Y2tldCA9ICYodGFibGUtPmJ1Y2tldHNbaWR4XSk7CisKKyAgICAgICAgICBpZiAocHJlYWxsb2NhdGVkKQorICAgICAgICAgICAgX2RidXNfaGFzaF90YWJsZV9mcmVlX3ByZWFsbG9jYXRlZF9lbnRyeSAodGFibGUsIHByZWFsbG9jYXRlZCk7CisgICAgICAgICAgCisgICAgICAgICAgcmV0dXJuIGVudHJ5OworICAgICAgICB9CisgICAgICAKKyAgICAgIGVudHJ5ID0gZW50cnktPm5leHQ7CisgICAgfQorCisgIGlmIChjcmVhdGVfaWZfbm90X2ZvdW5kKQorICAgIGVudHJ5ID0gYWRkX2VudHJ5ICh0YWJsZSwgaWR4LCBrZXksIGJ1Y2tldCwgcHJlYWxsb2NhdGVkKTsKKyAgZWxzZSBpZiAocHJlYWxsb2NhdGVkKQorICAgIF9kYnVzX2hhc2hfdGFibGVfZnJlZV9wcmVhbGxvY2F0ZWRfZW50cnkgKHRhYmxlLCBwcmVhbGxvY2F0ZWQpOworICAKKyAgcmV0dXJuIGVudHJ5OworfQorCitzdGF0aWMgREJ1c0hhc2hFbnRyeSoKK2ZpbmRfc3RyaW5nX2Z1bmN0aW9uIChEQnVzSGFzaFRhYmxlICAgICAgICAqdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgKmtleSwKKyAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICAgICAgY3JlYXRlX2lmX25vdF9mb3VuZCwKKyAgICAgICAgICAgICAgICAgICAgICBEQnVzSGFzaEVudHJ5ICAgICAgKioqYnVja2V0LAorICAgICAgICAgICAgICAgICAgICAgIERCdXNQcmVhbGxvY2F0ZWRIYXNoICpwcmVhbGxvY2F0ZWQpCit7CisgIHVuc2lnbmVkIGludCBpZHg7CisgIAorICBpZHggPSBzdHJpbmdfaGFzaCAoa2V5KSAmIHRhYmxlLT5tYXNrOworCisgIHJldHVybiBmaW5kX2dlbmVyaWNfZnVuY3Rpb24gKHRhYmxlLCBrZXksIGlkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEtleUNvbXBhcmVGdW5jKSBzdHJjbXAsIGNyZWF0ZV9pZl9ub3RfZm91bmQsIGJ1Y2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlYWxsb2NhdGVkKTsKK30KKworc3RhdGljIERCdXNIYXNoRW50cnkqCitmaW5kX2RpcmVjdF9mdW5jdGlvbiAoREJ1c0hhc2hUYWJsZSAgICAgICAgKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICprZXksCisgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgICAgIGNyZWF0ZV9pZl9ub3RfZm91bmQsCisgICAgICAgICAgICAgICAgICAgICAgREJ1c0hhc2hFbnRyeSAgICAgICoqKmJ1Y2tldCwKKyAgICAgICAgICAgICAgICAgICAgICBEQnVzUHJlYWxsb2NhdGVkSGFzaCAqcHJlYWxsb2NhdGVkKQoreworICB1bnNpZ25lZCBpbnQgaWR4OworICAKKyAgaWR4ID0gUkFORE9NX0lOREVYICh0YWJsZSwga2V5KSAmIHRhYmxlLT5tYXNrOworCisKKyAgcmV0dXJuIGZpbmRfZ2VuZXJpY19mdW5jdGlvbiAodGFibGUsIGtleSwgaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBjcmVhdGVfaWZfbm90X2ZvdW5kLCBidWNrZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWFsbG9jYXRlZCk7Cit9CisKK3N0YXRpYyB2b2lkCityZWJ1aWxkX3RhYmxlIChEQnVzSGFzaFRhYmxlICp0YWJsZSkKK3sKKyAgaW50IG9sZF9zaXplOworICBpbnQgbmV3X2J1Y2tldHM7CisgIERCdXNIYXNoRW50cnkgKipvbGRfYnVja2V0czsKKyAgREJ1c0hhc2hFbnRyeSAqKm9sZF9jaGFpbjsKKyAgREJ1c0hhc2hFbnRyeSAqZW50cnk7CisgIGRidXNfYm9vbF90IGdyb3dpbmc7CisgIAorICAvKgorICAgKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgbmV3IGJ1Y2tldCBhcnJheSwgYW5kIHNldCB1cAorICAgKiBoYXNoaW5nIGNvbnN0YW50cyBmb3IgbmV3IGFycmF5IHNpemUuCisgICAqLworCisgIGdyb3dpbmcgPSB0YWJsZS0+bl9lbnRyaWVzID49IHRhYmxlLT5oaV9yZWJ1aWxkX3NpemU7CisgIAorICBvbGRfc2l6ZSA9IHRhYmxlLT5uX2J1Y2tldHM7CisgIG9sZF9idWNrZXRzID0gdGFibGUtPmJ1Y2tldHM7CisKKyAgaWYgKGdyb3dpbmcpCisgICAgeworICAgICAgLyogb3ZlcmZsb3cgcGFyYW5vaWEgKi8KKyAgICAgIGlmICh0YWJsZS0+bl9idWNrZXRzIDwgX0RCVVNfSU5UX01BWCAvIDQgJiYKKyAgICAgICAgICB0YWJsZS0+ZG93bl9zaGlmdCA+PSAyKQorICAgICAgICBuZXdfYnVja2V0cyA9IHRhYmxlLT5uX2J1Y2tldHMgKiA0OworICAgICAgZWxzZQorICAgICAgICByZXR1cm47IC8qIGNhbid0IGdyb3cgYW55bW9yZSAqLworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIG5ld19idWNrZXRzID0gdGFibGUtPm5fYnVja2V0cyAvIDQ7CisgICAgICBpZiAobmV3X2J1Y2tldHMgPCBEQlVTX1NNQUxMX0hBU0hfVEFCTEUpCisgICAgICAgIHJldHVybjsgLyogZG9uJ3QgYm90aGVyIHNocmlua2luZyB0aGlzIGZhciAqLworICAgIH0KKworICB0YWJsZS0+YnVja2V0cyA9IGRidXNfbmV3MCAoREJ1c0hhc2hFbnRyeSosIG5ld19idWNrZXRzKTsKKyAgaWYgKHRhYmxlLT5idWNrZXRzID09IE5VTEwpCisgICAgeworICAgICAgLyogb3V0IG9mIG1lbW9yeSwgeWF5IC0ganVzdCBkb24ndCByZWFsbG9jYXRlLCB0aGUgdGFibGUgd2lsbAorICAgICAgICogc3RpbGwgd29yaywgYWxiZWl0IG1vcmUgc2xvd2x5LgorICAgICAgICovCisgICAgICB0YWJsZS0+YnVja2V0cyA9IG9sZF9idWNrZXRzOworICAgICAgcmV0dXJuOworICAgIH0KKworICB0YWJsZS0+bl9idWNrZXRzID0gbmV3X2J1Y2tldHM7CisgIAorICBpZiAoZ3Jvd2luZykKKyAgICB7CisgICAgICB0YWJsZS0+bG9fcmVidWlsZF9zaXplID0gdGFibGUtPmhpX3JlYnVpbGRfc2l6ZTsKKyAgICAgIHRhYmxlLT5oaV9yZWJ1aWxkX3NpemUgKj0gNDsKKyAgICAgIAorICAgICAgdGFibGUtPmRvd25fc2hpZnQgLT0gMjsgICAgICAgICAgICAgICAvKiBrZWVwIDIgbW9yZSBoaWdoIGJpdHMgKi8KKyAgICAgIHRhYmxlLT5tYXNrID0gKHRhYmxlLT5tYXNrIDw8IDIpICsgMzsgLyoga2VlcCAyIG1vcmUgaGlnaCBiaXRzICovCisgICAgfQorICBlbHNlCisgICAgeworICAgICAgdGFibGUtPmhpX3JlYnVpbGRfc2l6ZSA9IHRhYmxlLT5sb19yZWJ1aWxkX3NpemU7CisgICAgICB0YWJsZS0+bG9fcmVidWlsZF9zaXplIC89IDQ7CisKKyAgICAgIHRhYmxlLT5kb3duX3NoaWZ0ICs9IDI7ICAgICAgICAgLyoga2VlcCAyIGZld2VyIGhpZ2ggYml0cyAqLworICAgICAgdGFibGUtPm1hc2sgPSB0YWJsZS0+bWFzayA+PiAyOyAvKiBrZWVwIDIgZmV3ZXIgaGlnaCBiaXRzICovCisgICAgfQorCisjaWYgMAorICBwcmludGYgKCIlcyB0YWJsZSB0byBsbyA9ICVkIGhpID0gJWQgZG93bnNoaWZ0ID0gJWQgbWFzayA9IDB4JXhcbiIsCisgICAgICAgICAgZ3Jvd2luZyA/ICJHUk9XIiA6ICJTSFJJTksiLAorICAgICAgICAgIHRhYmxlLT5sb19yZWJ1aWxkX3NpemUsCisgICAgICAgICAgdGFibGUtPmhpX3JlYnVpbGRfc2l6ZSwKKyAgICAgICAgICB0YWJsZS0+ZG93bl9zaGlmdCwKKyAgICAgICAgICB0YWJsZS0+bWFzayk7CisjZW5kaWYKKyAgCisgIF9kYnVzX2Fzc2VydCAodGFibGUtPmxvX3JlYnVpbGRfc2l6ZSA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0ICh0YWJsZS0+aGlfcmVidWlsZF9zaXplID4gdGFibGUtPmxvX3JlYnVpbGRfc2l6ZSk7CisgIF9kYnVzX2Fzc2VydCAodGFibGUtPmRvd25fc2hpZnQgPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAodGFibGUtPm1hc2sgIT0gMCk7CisgIC8qIHRoZSBtYXNrIGlzIGVzc2VudGlhbGx5IHRoZSBtYXggaW5kZXggKi8KKyAgX2RidXNfYXNzZXJ0ICh0YWJsZS0+bWFzayA8IHRhYmxlLT5uX2J1Y2tldHMpOworICAKKyAgLyoKKyAgICogUmVoYXNoIGFsbCBvZiB0aGUgZXhpc3RpbmcgZW50cmllcyBpbnRvIHRoZSBuZXcgYnVja2V0IGFycmF5LgorICAgKi8KKworICBmb3IgKG9sZF9jaGFpbiA9IG9sZF9idWNrZXRzOyBvbGRfc2l6ZSA+IDA7IG9sZF9zaXplLS0sIG9sZF9jaGFpbisrKQorICAgIHsKKyAgICAgIGZvciAoZW50cnkgPSAqb2xkX2NoYWluOyBlbnRyeSAhPSBOVUxMOyBlbnRyeSA9ICpvbGRfY2hhaW4pCisgICAgICAgIHsKKyAgICAgICAgICB1bnNpZ25lZCBpbnQgaWR4OworICAgICAgICAgIERCdXNIYXNoRW50cnkgKipidWNrZXQ7CisgICAgICAgICAgCisgICAgICAgICAgKm9sZF9jaGFpbiA9IGVudHJ5LT5uZXh0OworICAgICAgICAgIHN3aXRjaCAodGFibGUtPmtleV90eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSBEQlVTX0hBU0hfU1RSSU5HOgorICAgICAgICAgICAgICBpZHggPSBzdHJpbmdfaGFzaCAoZW50cnktPmtleSkgJiB0YWJsZS0+bWFzazsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERCVVNfSEFTSF9JTlQ6CisgICAgICAgICAgICBjYXNlIERCVVNfSEFTSF9VSU5UUFRSOgorICAgICAgICAgICAgICBpZHggPSBSQU5ET01fSU5ERVggKHRhYmxlLCBlbnRyeS0+a2V5KTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICBpZHggPSAwOworICAgICAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJVbmtub3duIGhhc2ggdGFibGUgdHlwZSIpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgICAgICBidWNrZXQgPSAmKHRhYmxlLT5idWNrZXRzW2lkeF0pOworICAgICAgICAgIGVudHJ5LT5uZXh0ID0gKmJ1Y2tldDsKKyAgICAgICAgICAqYnVja2V0ID0gZW50cnk7CisgICAgICAgIH0KKyAgICB9CisgIAorICAvKiBGcmVlIHRoZSBvbGQgYnVja2V0IGFycmF5LCBpZiBpdCB3YXMgZHluYW1pY2FsbHkgYWxsb2NhdGVkLiAqLworCisgIGlmIChvbGRfYnVja2V0cyAhPSB0YWJsZS0+c3RhdGljX2J1Y2tldHMpCisgICAgZGJ1c19mcmVlIChvbGRfYnVja2V0cyk7Cit9CisKKy8qKgorICogTG9va3MgdXAgdGhlIHZhbHVlIGZvciBhIGdpdmVuIHN0cmluZyBpbiBhIGhhc2ggdGFibGUKKyAqIG9mIHR5cGUgI0RCVVNfSEFTSF9TVFJJTkcuIFJldHVybnMgJU5VTEwgaWYgdGhlIHZhbHVlCisgKiBpcyBub3QgcHJlc2VudC4gKEEgbm90LXByZXNlbnQgZW50cnkgaXMgaW5kaXN0aW5ndWlzaGFibGUKKyAqIGZyb20gYW4gZW50cnkgd2l0aCBhIHZhbHVlIG9mICVOVUxMLikKKyAqIEBwYXJhbSB0YWJsZSB0aGUgaGFzaCB0YWJsZS4KKyAqIEBwYXJhbSBrZXkgdGhlIHN0cmluZyB0byBsb29rIHVwLgorICogQHJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBoYXNoIGVudHJ5LgorICovCit2b2lkKgorX2RidXNfaGFzaF90YWJsZV9sb29rdXBfc3RyaW5nIChEQnVzSGFzaFRhYmxlICp0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAqa2V5KQoreworICBEQnVzSGFzaEVudHJ5ICplbnRyeTsKKworICBfZGJ1c19hc3NlcnQgKHRhYmxlLT5rZXlfdHlwZSA9PSBEQlVTX0hBU0hfU1RSSU5HKTsKKyAgCisgIGVudHJ5ID0gKCogdGFibGUtPmZpbmRfZnVuY3Rpb24pICh0YWJsZSwgKGNoYXIqKSBrZXksIEZBTFNFLCBOVUxMLCBOVUxMKTsKKworICBpZiAoZW50cnkpCisgICAgcmV0dXJuIGVudHJ5LT52YWx1ZTsKKyAgZWxzZQorICAgIHJldHVybiBOVUxMOworfQorCisvKioKKyAqIExvb2tzIHVwIHRoZSB2YWx1ZSBmb3IgYSBnaXZlbiBpbnRlZ2VyIGluIGEgaGFzaCB0YWJsZQorICogb2YgdHlwZSAjREJVU19IQVNIX0lOVC4gUmV0dXJucyAlTlVMTCBpZiB0aGUgdmFsdWUKKyAqIGlzIG5vdCBwcmVzZW50LiAoQSBub3QtcHJlc2VudCBlbnRyeSBpcyBpbmRpc3Rpbmd1aXNoYWJsZQorICogZnJvbSBhbiBlbnRyeSB3aXRoIGEgdmFsdWUgb2YgJU5VTEwuKQorICogQHBhcmFtIHRhYmxlIHRoZSBoYXNoIHRhYmxlLgorICogQHBhcmFtIGtleSB0aGUgaW50ZWdlciB0byBsb29rIHVwLgorICogQHJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBoYXNoIGVudHJ5LgorICovCit2b2lkKgorX2RidXNfaGFzaF90YWJsZV9sb29rdXBfaW50IChEQnVzSGFzaFRhYmxlICp0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAga2V5KQoreworICBEQnVzSGFzaEVudHJ5ICplbnRyeTsKKworICBfZGJ1c19hc3NlcnQgKHRhYmxlLT5rZXlfdHlwZSA9PSBEQlVTX0hBU0hfSU5UKTsKKyAgCisgIGVudHJ5ID0gKCogdGFibGUtPmZpbmRfZnVuY3Rpb24pICh0YWJsZSwgX0RCVVNfSU5UX1RPX1BPSU5URVIgKGtleSksIEZBTFNFLCBOVUxMLCBOVUxMKTsKKworICBpZiAoZW50cnkpCisgICAgcmV0dXJuIGVudHJ5LT52YWx1ZTsKKyAgZWxzZQorICAgIHJldHVybiBOVUxMOworfQorCisvKioKKyAqIExvb2tzIHVwIHRoZSB2YWx1ZSBmb3IgYSBnaXZlbiBpbnRlZ2VyIGluIGEgaGFzaCB0YWJsZQorICogb2YgdHlwZSAjREJVU19IQVNIX1VJTlRQVFIuIFJldHVybnMgJU5VTEwgaWYgdGhlIHZhbHVlCisgKiBpcyBub3QgcHJlc2VudC4gKEEgbm90LXByZXNlbnQgZW50cnkgaXMgaW5kaXN0aW5ndWlzaGFibGUKKyAqIGZyb20gYW4gZW50cnkgd2l0aCBhIHZhbHVlIG9mICVOVUxMLikKKyAqIEBwYXJhbSB0YWJsZSB0aGUgaGFzaCB0YWJsZS4KKyAqIEBwYXJhbSBrZXkgdGhlIGludGVnZXIgdG8gbG9vayB1cC4KKyAqIEByZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgaGFzaCBlbnRyeS4KKyAqLwordm9pZCoKK19kYnVzX2hhc2hfdGFibGVfbG9va3VwX3VpbnRwdHIgKERCdXNIYXNoVGFibGUgKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludHB0cl90ICAgICAga2V5KQoreworICBEQnVzSGFzaEVudHJ5ICplbnRyeTsKKworICBfZGJ1c19hc3NlcnQgKHRhYmxlLT5rZXlfdHlwZSA9PSBEQlVTX0hBU0hfVUlOVFBUUik7CisgIAorICBlbnRyeSA9ICgqIHRhYmxlLT5maW5kX2Z1bmN0aW9uKSAodGFibGUsICh2b2lkKikga2V5LCBGQUxTRSwgTlVMTCwgTlVMTCk7CisKKyAgaWYgKGVudHJ5KQorICAgIHJldHVybiBlbnRyeS0+dmFsdWU7CisgIGVsc2UKKyAgICByZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiBSZW1vdmVzIHRoZSBoYXNoIGVudHJ5IGZvciB0aGUgZ2l2ZW4ga2V5LiBJZiBubyBoYXNoIGVudHJ5CisgKiBmb3IgdGhlIGtleSBleGlzdHMsIGRvZXMgbm90aGluZy4KKyAqCisgKiBAcGFyYW0gdGFibGUgdGhlIGhhc2ggdGFibGUuCisgKiBAcGFyYW0ga2V5IHRoZSBoYXNoIGtleS4KKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSBlbnRyeSBleGlzdGVkCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19oYXNoX3RhYmxlX3JlbW92ZV9zdHJpbmcgKERCdXNIYXNoVGFibGUgKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICprZXkpCit7CisgIERCdXNIYXNoRW50cnkgKmVudHJ5OworICBEQnVzSGFzaEVudHJ5ICoqYnVja2V0OworICAKKyAgX2RidXNfYXNzZXJ0ICh0YWJsZS0+a2V5X3R5cGUgPT0gREJVU19IQVNIX1NUUklORyk7CisgIAorICBlbnRyeSA9ICgqIHRhYmxlLT5maW5kX2Z1bmN0aW9uKSAodGFibGUsIChjaGFyKikga2V5LCBGQUxTRSwgJmJ1Y2tldCwgTlVMTCk7CisKKyAgaWYgKGVudHJ5KQorICAgIHsKKyAgICAgIHJlbW92ZV9lbnRyeSAodGFibGUsIGJ1Y2tldCwgZW50cnkpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICBlbHNlCisgICAgcmV0dXJuIEZBTFNFOworfQorCisvKioKKyAqIFJlbW92ZXMgdGhlIGhhc2ggZW50cnkgZm9yIHRoZSBnaXZlbiBrZXkuIElmIG5vIGhhc2ggZW50cnkKKyAqIGZvciB0aGUga2V5IGV4aXN0cywgZG9lcyBub3RoaW5nLgorICoKKyAqIEBwYXJhbSB0YWJsZSB0aGUgaGFzaCB0YWJsZS4KKyAqIEBwYXJhbSBrZXkgdGhlIGhhc2gga2V5LgorICogQHJldHVybnMgI1RSVUUgaWYgdGhlIGVudHJ5IGV4aXN0ZWQKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2hhc2hfdGFibGVfcmVtb3ZlX2ludCAoREJ1c0hhc2hUYWJsZSAqdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgIGtleSkKK3sKKyAgREJ1c0hhc2hFbnRyeSAqZW50cnk7CisgIERCdXNIYXNoRW50cnkgKipidWNrZXQ7CisgIAorICBfZGJ1c19hc3NlcnQgKHRhYmxlLT5rZXlfdHlwZSA9PSBEQlVTX0hBU0hfSU5UKTsKKyAgCisgIGVudHJ5ID0gKCogdGFibGUtPmZpbmRfZnVuY3Rpb24pICh0YWJsZSwgX0RCVVNfSU5UX1RPX1BPSU5URVIgKGtleSksIEZBTFNFLCAmYnVja2V0LCBOVUxMKTsKKyAgCisgIGlmIChlbnRyeSkKKyAgICB7CisgICAgICByZW1vdmVfZW50cnkgKHRhYmxlLCBidWNrZXQsIGVudHJ5KTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgZWxzZQorICAgIHJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBSZW1vdmVzIHRoZSBoYXNoIGVudHJ5IGZvciB0aGUgZ2l2ZW4ga2V5LiBJZiBubyBoYXNoIGVudHJ5CisgKiBmb3IgdGhlIGtleSBleGlzdHMsIGRvZXMgbm90aGluZy4KKyAqCisgKiBAcGFyYW0gdGFibGUgdGhlIGhhc2ggdGFibGUuCisgKiBAcGFyYW0ga2V5IHRoZSBoYXNoIGtleS4KKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSBlbnRyeSBleGlzdGVkCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19oYXNoX3RhYmxlX3JlbW92ZV91aW50cHRyIChEQnVzSGFzaFRhYmxlICp0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnRwdHJfdCAgICAgIGtleSkKK3sKKyAgREJ1c0hhc2hFbnRyeSAqZW50cnk7CisgIERCdXNIYXNoRW50cnkgKipidWNrZXQ7CisgIAorICBfZGJ1c19hc3NlcnQgKHRhYmxlLT5rZXlfdHlwZSA9PSBEQlVTX0hBU0hfVUlOVFBUUik7CisgIAorICBlbnRyeSA9ICgqIHRhYmxlLT5maW5kX2Z1bmN0aW9uKSAodGFibGUsICh2b2lkKikga2V5LCBGQUxTRSwgJmJ1Y2tldCwgTlVMTCk7CisgIAorICBpZiAoZW50cnkpCisgICAgeworICAgICAgcmVtb3ZlX2VudHJ5ICh0YWJsZSwgYnVja2V0LCBlbnRyeSk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKgorICogQ3JlYXRlcyBhIGhhc2ggZW50cnkgd2l0aCB0aGUgZ2l2ZW4ga2V5IGFuZCB2YWx1ZS4KKyAqIFRoZSBrZXkgYW5kIHZhbHVlIGFyZSBub3QgY29waWVkOyB0aGV5IGFyZSBzdG9yZWQKKyAqIGluIHRoZSBoYXNoIHRhYmxlIGJ5IHJlZmVyZW5jZS4gSWYgYW4gZW50cnkgd2l0aCB0aGUKKyAqIGdpdmVuIGtleSBhbHJlYWR5IGV4aXN0cywgdGhlIHByZXZpb3VzIGtleSBhbmQgdmFsdWUKKyAqIGFyZSBvdmVyd3JpdHRlbiAoYW5kIGZyZWVkIGlmIHRoZSBoYXNoIHRhYmxlIGhhcworICogYSBrZXlfZnJlZV9mdW5jdGlvbiBhbmQvb3IgdmFsdWVfZnJlZV9mdW5jdGlvbikuCisgKgorICogUmV0dXJucyAjRkFMU0UgaWYgbWVtb3J5IGZvciB0aGUgbmV3IGhhc2ggZW50cnkKKyAqIGNhbid0IGJlIGFsbG9jYXRlZC4KKyAqIAorICogQHBhcmFtIHRhYmxlIHRoZSBoYXNoIHRhYmxlLgorICogQHBhcmFtIGtleSB0aGUgaGFzaCBlbnRyeSBrZXkuCisgKiBAcGFyYW0gdmFsdWUgdGhlIGhhc2ggZW50cnkgdmFsdWUuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19oYXNoX3RhYmxlX2luc2VydF9zdHJpbmcgKERCdXNIYXNoVGFibGUgKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICAgICprZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnZhbHVlKQoreworICBEQnVzUHJlYWxsb2NhdGVkSGFzaCAqcHJlYWxsb2NhdGVkOworCisgIF9kYnVzX2Fzc2VydCAodGFibGUtPmtleV90eXBlID09IERCVVNfSEFTSF9TVFJJTkcpOworCisgIHByZWFsbG9jYXRlZCA9IF9kYnVzX2hhc2hfdGFibGVfcHJlYWxsb2NhdGVfZW50cnkgKHRhYmxlKTsKKyAgaWYgKHByZWFsbG9jYXRlZCA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKworICBfZGJ1c19oYXNoX3RhYmxlX2luc2VydF9zdHJpbmdfcHJlYWxsb2NhdGVkICh0YWJsZSwgcHJlYWxsb2NhdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXksIHZhbHVlKTsKKyAgCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIENyZWF0ZXMgYSBoYXNoIGVudHJ5IHdpdGggdGhlIGdpdmVuIGtleSBhbmQgdmFsdWUuCisgKiBUaGUga2V5IGFuZCB2YWx1ZSBhcmUgbm90IGNvcGllZDsgdGhleSBhcmUgc3RvcmVkCisgKiBpbiB0aGUgaGFzaCB0YWJsZSBieSByZWZlcmVuY2UuIElmIGFuIGVudHJ5IHdpdGggdGhlCisgKiBnaXZlbiBrZXkgYWxyZWFkeSBleGlzdHMsIHRoZSBwcmV2aW91cyBrZXkgYW5kIHZhbHVlCisgKiBhcmUgb3ZlcndyaXR0ZW4gKGFuZCBmcmVlZCBpZiB0aGUgaGFzaCB0YWJsZSBoYXMKKyAqIGEga2V5X2ZyZWVfZnVuY3Rpb24gYW5kL29yIHZhbHVlX2ZyZWVfZnVuY3Rpb24pLgorICoKKyAqIFJldHVybnMgI0ZBTFNFIGlmIG1lbW9yeSBmb3IgdGhlIG5ldyBoYXNoIGVudHJ5CisgKiBjYW4ndCBiZSBhbGxvY2F0ZWQuCisgKiAKKyAqIEBwYXJhbSB0YWJsZSB0aGUgaGFzaCB0YWJsZS4KKyAqIEBwYXJhbSBrZXkgdGhlIGhhc2ggZW50cnkga2V5LgorICogQHBhcmFtIHZhbHVlIHRoZSBoYXNoIGVudHJ5IHZhbHVlLgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfaGFzaF90YWJsZV9pbnNlcnRfaW50IChEQnVzSGFzaFRhYmxlICp0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICp2YWx1ZSkKK3sKKyAgREJ1c0hhc2hFbnRyeSAqZW50cnk7CisKKyAgX2RidXNfYXNzZXJ0ICh0YWJsZS0+a2V5X3R5cGUgPT0gREJVU19IQVNIX0lOVCk7CisgIAorICBlbnRyeSA9ICgqIHRhYmxlLT5maW5kX2Z1bmN0aW9uKSAodGFibGUsIF9EQlVTX0lOVF9UT19QT0lOVEVSIChrZXkpLCBUUlVFLCBOVUxMLCBOVUxMKTsKKworICBpZiAoZW50cnkgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7IC8qIG5vIG1lbW9yeSAqLworCisgIGlmICh0YWJsZS0+ZnJlZV9rZXlfZnVuY3Rpb24gJiYgZW50cnktPmtleSAhPSBfREJVU19JTlRfVE9fUE9JTlRFUiAoa2V5KSkKKyAgICAoKiB0YWJsZS0+ZnJlZV9rZXlfZnVuY3Rpb24pIChlbnRyeS0+a2V5KTsKKyAgCisgIGlmICh0YWJsZS0+ZnJlZV92YWx1ZV9mdW5jdGlvbiAmJiBlbnRyeS0+dmFsdWUgIT0gdmFsdWUpCisgICAgKCogdGFibGUtPmZyZWVfdmFsdWVfZnVuY3Rpb24pIChlbnRyeS0+dmFsdWUpOworICAKKyAgZW50cnktPmtleSA9IF9EQlVTX0lOVF9UT19QT0lOVEVSIChrZXkpOworICBlbnRyeS0+dmFsdWUgPSB2YWx1ZTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBDcmVhdGVzIGEgaGFzaCBlbnRyeSB3aXRoIHRoZSBnaXZlbiBrZXkgYW5kIHZhbHVlLgorICogVGhlIGtleSBhbmQgdmFsdWUgYXJlIG5vdCBjb3BpZWQ7IHRoZXkgYXJlIHN0b3JlZAorICogaW4gdGhlIGhhc2ggdGFibGUgYnkgcmVmZXJlbmNlLiBJZiBhbiBlbnRyeSB3aXRoIHRoZQorICogZ2l2ZW4ga2V5IGFscmVhZHkgZXhpc3RzLCB0aGUgcHJldmlvdXMga2V5IGFuZCB2YWx1ZQorICogYXJlIG92ZXJ3cml0dGVuIChhbmQgZnJlZWQgaWYgdGhlIGhhc2ggdGFibGUgaGFzCisgKiBhIGtleV9mcmVlX2Z1bmN0aW9uIGFuZC9vciB2YWx1ZV9mcmVlX2Z1bmN0aW9uKS4KKyAqCisgKiBSZXR1cm5zICNGQUxTRSBpZiBtZW1vcnkgZm9yIHRoZSBuZXcgaGFzaCBlbnRyeQorICogY2FuJ3QgYmUgYWxsb2NhdGVkLgorICogCisgKiBAcGFyYW0gdGFibGUgdGhlIGhhc2ggdGFibGUuCisgKiBAcGFyYW0ga2V5IHRoZSBoYXNoIGVudHJ5IGtleS4KKyAqIEBwYXJhbSB2YWx1ZSB0aGUgaGFzaCBlbnRyeSB2YWx1ZS4KKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2hhc2hfdGFibGVfaW5zZXJ0X3VpbnRwdHIgKERCdXNIYXNoVGFibGUgKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludHB0cl90ICAgICAga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqdmFsdWUpCit7CisgIERCdXNIYXNoRW50cnkgKmVudHJ5OworCisgIF9kYnVzX2Fzc2VydCAodGFibGUtPmtleV90eXBlID09IERCVVNfSEFTSF9VSU5UUFRSKTsKKyAgCisgIGVudHJ5ID0gKCogdGFibGUtPmZpbmRfZnVuY3Rpb24pICh0YWJsZSwgKHZvaWQqKSBrZXksIFRSVUUsIE5VTEwsIE5VTEwpOworCisgIGlmIChlbnRyeSA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsgLyogbm8gbWVtb3J5ICovCisKKyAgaWYgKHRhYmxlLT5mcmVlX2tleV9mdW5jdGlvbiAmJiBlbnRyeS0+a2V5ICE9ICh2b2lkKikga2V5KQorICAgICgqIHRhYmxlLT5mcmVlX2tleV9mdW5jdGlvbikgKGVudHJ5LT5rZXkpOworICAKKyAgaWYgKHRhYmxlLT5mcmVlX3ZhbHVlX2Z1bmN0aW9uICYmIGVudHJ5LT52YWx1ZSAhPSB2YWx1ZSkKKyAgICAoKiB0YWJsZS0+ZnJlZV92YWx1ZV9mdW5jdGlvbikgKGVudHJ5LT52YWx1ZSk7CisgIAorICBlbnRyeS0+a2V5ID0gKHZvaWQqKSBrZXk7CisgIGVudHJ5LT52YWx1ZSA9IHZhbHVlOworCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIFByZWFsbG9jYXRlIGFuIG9wYXF1ZSBkYXRhIGJsb2IgdGhhdCBhbGxvd3MgdXMgdG8gaW5zZXJ0IGludG8gdGhlCisgKiBoYXNoIHRhYmxlIGF0IGEgbGF0ZXIgdGltZSB3aXRob3V0IGFsbG9jYXRpbmcgYW55IG1lbW9yeS4KKyAqCisgKiBAcGFyYW0gdGFibGUgdGhlIGhhc2ggdGFibGUKKyAqIEByZXR1cm5zIHRoZSBwcmVhbGxvY2F0ZWQgZGF0YSwgb3IgI05VTEwgaWYgbm8gbWVtb3J5CisgKi8KK0RCdXNQcmVhbGxvY2F0ZWRIYXNoKgorX2RidXNfaGFzaF90YWJsZV9wcmVhbGxvY2F0ZV9lbnRyeSAoREJ1c0hhc2hUYWJsZSAqdGFibGUpCit7CisgIERCdXNIYXNoRW50cnkgKmVudHJ5OworICAKKyAgZW50cnkgPSBhbGxvY19lbnRyeSAodGFibGUpOworCisgIHJldHVybiAoREJ1c1ByZWFsbG9jYXRlZEhhc2gqKSBlbnRyeTsKK30KKworLyoqCisgKiBGcmVlcyBhbiBvcGFxdWUgREJ1c1ByZWFsbG9jYXRlZEhhc2ggdGhhdCB3YXMgKm5vdCogdXNlZAorICogaW4gb3JkZXIgdG8gaW5zZXJ0IGludG8gdGhlIGhhc2ggdGFibGUuCisgKgorICogQHBhcmFtIHRhYmxlIHRoZSBoYXNoIHRhYmxlCisgKiBAcGFyYW0gcHJlYWxsb2NhdGVkIHRoZSBwcmVhbGxvY2F0ZWQgZGF0YQorICovCit2b2lkCitfZGJ1c19oYXNoX3RhYmxlX2ZyZWVfcHJlYWxsb2NhdGVkX2VudHJ5IChEQnVzSGFzaFRhYmxlICAgICAgICAqdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzUHJlYWxsb2NhdGVkSGFzaCAqcHJlYWxsb2NhdGVkKQoreworICBEQnVzSGFzaEVudHJ5ICplbnRyeTsKKworICBfZGJ1c19hc3NlcnQgKHByZWFsbG9jYXRlZCAhPSBOVUxMKTsKKyAgCisgIGVudHJ5ID0gKERCdXNIYXNoRW50cnkqKSBwcmVhbGxvY2F0ZWQ7CisgIAorICAvKiBEb24ndCB1c2UgZnJlZV9lbnRyeSgpLCBzaW5jZSB0aGlzIGVudHJ5IGhhcyBubyBrZXkvZGF0YSAqLworICBfZGJ1c19tZW1fcG9vbF9kZWFsbG9jICh0YWJsZS0+ZW50cnlfcG9vbCwgZW50cnkpOworfQorCisvKioKKyAqIEluc2VydHMgYSBzdHJpbmcta2V5ZWQgZW50cnkgaW50byB0aGUgaGFzaCB0YWJsZSwgdXNpbmcgYQorICogcHJlYWxsb2NhdGVkIGRhdGEgYmxvY2sgZnJvbQorICogX2RidXNfaGFzaF90YWJsZV9wcmVhbGxvY2F0ZV9lbnRyeSgpLiBUaGlzIGZ1bmN0aW9uIGNhbm5vdCBmYWlsIGR1ZQorICogdG8gbGFjayBvZiBtZW1vcnkuIFRoZSBEQnVzUHJlYWxsb2NhdGVkSGFzaCBvYmplY3QgaXMgY29uc3VtZWQgYW5kCisgKiBzaG91bGQgbm90IGJlIHJldXNlZCBvciBmcmVlZC4gT3RoZXJ3aXNlIHRoaXMgZnVuY3Rpb24gd29ya3MKKyAqIGp1c3QgbGlrZSBfZGJ1c19oYXNoX3RhYmxlX2luc2VydF9zdHJpbmcoKS4KKyAqCisgKiBAcGFyYW0gdGFibGUgdGhlIGhhc2ggdGFibGUKKyAqIEBwYXJhbSBwcmVhbGxvY2F0ZWQgdGhlIHByZWFsbG9jYXRlZCBkYXRhCisgKiBAcGFyYW0ga2V5IHRoZSBoYXNoIGtleQorICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSAKKyAqLwordm9pZAorX2RidXNfaGFzaF90YWJsZV9pbnNlcnRfc3RyaW5nX3ByZWFsbG9jYXRlZCAoREJ1c0hhc2hUYWJsZSAgICAgICAgKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1ByZWFsbG9jYXRlZEhhc2ggKnByZWFsbG9jYXRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICAgICAgICAgICprZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAqdmFsdWUpCit7CisgIERCdXNIYXNoRW50cnkgKmVudHJ5OworCisgIF9kYnVzX2Fzc2VydCAodGFibGUtPmtleV90eXBlID09IERCVVNfSEFTSF9TVFJJTkcpOworICBfZGJ1c19hc3NlcnQgKHByZWFsbG9jYXRlZCAhPSBOVUxMKTsKKyAgCisgIGVudHJ5ID0gKCogdGFibGUtPmZpbmRfZnVuY3Rpb24pICh0YWJsZSwga2V5LCBUUlVFLCBOVUxMLCBwcmVhbGxvY2F0ZWQpOworCisgIF9kYnVzX2Fzc2VydCAoZW50cnkgIT0gTlVMTCk7CisgIAorICBpZiAodGFibGUtPmZyZWVfa2V5X2Z1bmN0aW9uICYmIGVudHJ5LT5rZXkgIT0ga2V5KQorICAgICgqIHRhYmxlLT5mcmVlX2tleV9mdW5jdGlvbikgKGVudHJ5LT5rZXkpOworCisgIGlmICh0YWJsZS0+ZnJlZV92YWx1ZV9mdW5jdGlvbiAmJiBlbnRyeS0+dmFsdWUgIT0gdmFsdWUpCisgICAgKCogdGFibGUtPmZyZWVfdmFsdWVfZnVuY3Rpb24pIChlbnRyeS0+dmFsdWUpOworICAgICAgCisgIGVudHJ5LT5rZXkgPSBrZXk7CisgIGVudHJ5LT52YWx1ZSA9IHZhbHVlOworfQorCisvKioKKyAqIEdldHMgdGhlIG51bWJlciBvZiBoYXNoIGVudHJpZXMgaW4gYSBoYXNoIHRhYmxlLgorICoKKyAqIEBwYXJhbSB0YWJsZSB0aGUgaGFzaCB0YWJsZS4KKyAqIEByZXR1cm5zIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgdGFibGUuCisgKi8KK2ludAorX2RidXNfaGFzaF90YWJsZV9nZXRfbl9lbnRyaWVzIChEQnVzSGFzaFRhYmxlICp0YWJsZSkKK3sKKyAgcmV0dXJuIHRhYmxlLT5uX2VudHJpZXM7Cit9CisKKy8qKgorICogSW1wb3J0cyBhIHN0cmluZyBhcnJheSBpbnRvIGEgaGFzaCB0YWJsZQorICogVGhlIGhhc2ggdGFibGUgbmVlZHMgdG8gYmUgaW5pdGlhbGl6ZWQgd2l0aCBzdHJpbmcga2V5cywKKyAqIGFuZCBkYnVzX2ZyZWUoKSBhcyBib3RoIGtleSBhbmQgdmFsdWUgZnJlZS1mdW5jdGlvbi4KKyAqCisgKiBAcGFyYW0gdGFibGUgdGhlIGhhc2ggdGFibGUKKyAqIEBwYXJhbSBhcnJheSB0aGUgc3RyaW5nIGFycmF5IHRvIGltcG9ydAorICogQHBhcmFtIGRlbGltaXRlciB0aGUgZGVsaW1pdGVyIHRvIHNlcGFyYXRlIGtleSBhbmQgdmFsdWUKKyAqIEByZXR1cm4gI1RSVUUgb24gc3VjY2Vzcy4KKyAqIEByZXR1cm4gI0ZBTFNFIGlmIG5vdCBlbm91Z2ggbWVtb3J5LgorICovCisKK2RidXNfYm9vbF90CitfZGJ1c19oYXNoX3RhYmxlX2Zyb21fYXJyYXkgKERCdXNIYXNoVGFibGUgKnRhYmxlLCBjaGFyICoqYXJyYXksIGNoYXIgZGVsaW1pdGVyKQoreworICBEQnVzU3RyaW5nICAga2V5OworICBEQnVzU3RyaW5nICAgdmFsdWU7CisgIGludCAgICAgICAgICBpOworICBkYnVzX2Jvb2xfdCAgcmV0dmFsID0gRkFMU0U7CisKKyAgX2RidXNfYXNzZXJ0ICh0YWJsZSAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChhcnJheSAhPSBOVUxMKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgma2V5KSkKKyAgICB7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnZhbHVlKSkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmtleSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGZvciAoaSA9IDA7IGFycmF5W2ldICE9IE5VTEw7IGkrKykKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZrZXksIGFycmF5W2ldKSkKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGlmIChfZGJ1c19zdHJpbmdfc3BsaXRfb25fYnl0ZSAoJmtleSwgZGVsaW1pdGVyLCAmdmFsdWUpKQorICAgICAgICB7CisgICAgICAgICAgY2hhciAqaGFzaF9rZXksICpoYXNoX3ZhbHVlOworCisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfc3RlYWxfZGF0YSAoJmtleSwgJmhhc2hfa2V5KSkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfc3RlYWxfZGF0YSAoJnZhbHVlLCAmaGFzaF92YWx1ZSkpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGlmICghX2RidXNfaGFzaF90YWJsZV9pbnNlcnRfc3RyaW5nICh0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaF9rZXksIGhhc2hfdmFsdWUpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoICgma2V5LCAwKTsKKyAgICAgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoICgmdmFsdWUsIDApOworICAgIH0KKworICBpZiAoYXJyYXlbaV0gIT0gTlVMTCkKKyAgICBnb3RvIG91dDsKKworICByZXR2YWwgPSBUUlVFOworb3V0OgorCisgIF9kYnVzX3N0cmluZ19mcmVlICgma2V5KTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ2YWx1ZSk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBDcmVhdGVzIGEgc3RyaW5nIGFycmF5IGZyb20gYSBoYXNoIHRhYmxlCisgKgorICogQHBhcmFtIHRhYmxlIHRoZSBoYXNoIHRhYmxlCisgKiBAcGFyYW0gZGVsaW1pdGVyIHRoZSBkZWxpbWl0ZXIgdG8gam9pbiBrZXkgYW5kIHZhbHVlCisgKiBAcmV0dXJuIHBvaW50ZXIgdG8gY3JlYXRlZCBzdHJpbmcgYXJyYXkgKGZyZWUgd2l0aCBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5KQorICogQHJldHVybiAjRkFMU0UgaWYgbm90IGVub3VnaCBtZW1vcnkuCisgKi8KK2NoYXIgKioKK19kYnVzX2hhc2hfdGFibGVfdG9fYXJyYXkgKERCdXNIYXNoVGFibGUgKnRhYmxlLCBjaGFyIGRlbGltaXRlcikKK3sKKyAgaW50IGksIGxlbmd0aDsKKyAgREJ1c1N0cmluZyBlbnRyeTsKKyAgREJ1c0hhc2hJdGVyIGl0ZXI7CisgIGNoYXIgKiphcnJheTsKKworICBfZGJ1c19hc3NlcnQgKHRhYmxlICE9IE5VTEwpOworCisgIGxlbmd0aCA9IF9kYnVzX2hhc2hfdGFibGVfZ2V0X25fZW50cmllcyAodGFibGUpOworCisgIGFycmF5ID0gZGJ1c19uZXcwIChjaGFyICosIGxlbmd0aCArIDEpOworCisgIGlmIChhcnJheSA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIGkgPSAwOworICBfZGJ1c19oYXNoX2l0ZXJfaW5pdCAodGFibGUsICZpdGVyKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZW50cnkpKQorICAgIHsKKyAgICAgIGRidXNfZnJlZV9zdHJpbmdfYXJyYXkgKGFycmF5KTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICB3aGlsZSAoX2RidXNfaGFzaF9pdGVyX25leHQgKCZpdGVyKSkKKyAgICB7CisgICAgICBjb25zdCBjaGFyICprZXksICp2YWx1ZTsKKworICAgICAga2V5ID0gKGNvbnN0IGNoYXIgKikgX2RidXNfaGFzaF9pdGVyX2dldF9zdHJpbmdfa2V5ICgmaXRlcik7CisgICAgICB2YWx1ZSA9IChjb25zdCBjaGFyICopIF9kYnVzX2hhc2hfaXRlcl9nZXRfdmFsdWUgKCZpdGVyKTsKKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX3ByaW50ZiAoJmVudHJ5LCAiJXMlYyVzIiwga2V5LCBkZWxpbWl0ZXIsIHZhbHVlKSkKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX3N0ZWFsX2RhdGEgKCZlbnRyeSwgYXJyYXkgKyBpKSkKKyAgICAgICAgYnJlYWs7CisgICAgICBpKys7CisgICAgfQorCisgIF9kYnVzX3N0cmluZ19mcmVlICgmZW50cnkpOworCisgIGlmIChpICE9IGxlbmd0aCkKKyAgICB7CisgICAgICBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5IChhcnJheSk7CisgICAgICBhcnJheSA9IE5VTEw7CisgICAgfQorCisgIHJldHVybiBhcnJheTsKK30KKworLyoqIEB9ICovCisKKyNpZmRlZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworI2luY2x1ZGUgImRidXMtdGVzdC5oIgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKy8qIElmIHlvdSdyZSB3b25kZXJpbmcgd2h5IHRoZSBoYXNoIHRhYmxlIHRlc3QgdGFrZXMKKyAqIGZvcmV2ZXIgdG8gcnVuLCBpdCdzIGJlY2F1c2Ugd2UgY2FsbCB0aGlzIGZ1bmN0aW9uCisgKiBpbiBpbm5lciBsb29wcyB0aHVzIG1ha2luZyB0aGluZ3MgcXVhZHJhdGljLgorICovCitzdGF0aWMgaW50Citjb3VudF9lbnRyaWVzIChEQnVzSGFzaFRhYmxlICp0YWJsZSkKK3sKKyAgREJ1c0hhc2hJdGVyIGl0ZXI7CisgIGludCBjb3VudDsKKworICBjb3VudCA9IDA7CisgIF9kYnVzX2hhc2hfaXRlcl9pbml0ICh0YWJsZSwgJml0ZXIpOworICB3aGlsZSAoX2RidXNfaGFzaF9pdGVyX25leHQgKCZpdGVyKSkKKyAgICArK2NvdW50OworCisgIF9kYnVzX2Fzc2VydCAoY291bnQgPT0gX2RidXNfaGFzaF90YWJsZV9nZXRfbl9lbnRyaWVzICh0YWJsZSkpOworICAKKyAgcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgKgorc3RlYWwgKHZvaWQgKnB0cikKK3sKKyAgLyogQHB0ciBpcyBwYXNzZWQgaW4gYXMgdm9pZCogdG8gYXZvaWQgY2FzdGluZyBpbiB0aGUgY2FsbCAqLworICB2b2lkICoqX3B0ciA9ICh2b2lkICoqKSBwdHI7CisgIHZvaWQgKnZhbDsKKworICB2YWwgPSAqX3B0cjsKKyAgKl9wdHIgPSBOVUxMOworCisgIHJldHVybiB2YWw7Cit9CisKKy8qKgorICogQGluZ3JvdXAgREJ1c0hhc2hUYWJsZUludGVybmFscworICogVW5pdCB0ZXN0IGZvciBEQnVzSGFzaFRhYmxlCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzLgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfaGFzaF90ZXN0ICh2b2lkKQoreworICBpbnQgaTsKKyAgREJ1c0hhc2hUYWJsZSAqdGFibGUxOworICBEQnVzSGFzaFRhYmxlICp0YWJsZTI7CisgIERCdXNIYXNoVGFibGUgKnRhYmxlMzsKKyAgREJ1c0hhc2hJdGVyIGl0ZXI7CisjZGVmaW5lIE5fSEFTSF9LRVlTIDUwMDAKKyAgY2hhciAqKmtleXM7CisgIGRidXNfYm9vbF90IHJldCA9IEZBTFNFOworICBjaGFyICpzdHJfa2V5ID0gTlVMTDsKKyAgY2hhciAqc3RyX3ZhbHVlID0gTlVMTDsKKworICBrZXlzID0gZGJ1c19uZXcgKGNoYXIgKiwgTl9IQVNIX0tFWVMpOworICBpZiAoa2V5cyA9PSBOVUxMKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOworCisgIGZvciAoaSA9IDA7IGkgPCBOX0hBU0hfS0VZUzsgaSsrKQorICAgIHsKKyAgICAgIGtleXNbaV0gPSBkYnVzX21hbGxvYyAoMTI4KTsKKworICAgICAgaWYgKGtleXNbaV0gPT0gTlVMTCkKKwlfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkiKTsKKyAgICB9CisKKyAgcHJpbnRmICgiQ29tcHV0aW5nIHRlc3QgaGFzaCBrZXlzLi4uXG4iKTsKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgTl9IQVNIX0tFWVMpCisgICAgeworICAgICAgaW50IGxlbjsKKworICAgICAgbGVuID0gc3ByaW50ZiAoa2V5c1tpXSwgIkhhc2gga2V5ICVkIiwgaSk7CisgICAgICBfZGJ1c19hc3NlcnQgKCooa2V5c1tpXSArIGxlbikgPT0gJ1wwJyk7CisgICAgICArK2k7CisgICAgfQorICBwcmludGYgKCIuLi4gZG9uZS5cbiIpOworICAKKyAgdGFibGUxID0gX2RidXNfaGFzaF90YWJsZV9uZXcgKERCVVNfSEFTSF9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2ZyZWUsIGRidXNfZnJlZSk7CisgIGlmICh0YWJsZTEgPT0gTlVMTCkKKyAgICBnb3RvIG91dDsKKworICB0YWJsZTIgPSBfZGJ1c19oYXNoX3RhYmxlX25ldyAoREJVU19IQVNIX0lOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIGRidXNfZnJlZSk7CisgIGlmICh0YWJsZTIgPT0gTlVMTCkKKyAgICBnb3RvIG91dDsKKworICB0YWJsZTMgPSBfZGJ1c19oYXNoX3RhYmxlX25ldyAoREJVU19IQVNIX1VJTlRQVFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBkYnVzX2ZyZWUpOworICBpZiAodGFibGUzID09IE5VTEwpCisgICAgZ290byBvdXQ7CisKKyAgLyogSW5zZXJ0IGFuZCByZW1vdmUgYSBidW5jaCBvZiBzdHVmZiwgY291bnRpbmcgdGhlIHRhYmxlIGluIGJldHdlZW4KKyAgICogdG8gYmUgc3VyZSBpdCdzIG5vdCBicm9rZW4gYW5kIHRoYXQgaXRlcmF0aW9uIHdvcmtzCisgICAqLworICBpID0gMDsKKyAgd2hpbGUgKGkgPCAzMDAwKQorICAgIHsKKyAgICAgIGNvbnN0IHZvaWQgKm91dF92YWx1ZTsKKworICAgICAgc3RyX2tleSA9IF9kYnVzX3N0cmR1cCAoa2V5c1tpXSk7CisgICAgICBpZiAoc3RyX2tleSA9PSBOVUxMKQorICAgICAgICBnb3RvIG91dDsKKyAgICAgIHN0cl92YWx1ZSA9IF9kYnVzX3N0cmR1cCAoIlZhbHVlISIpOworICAgICAgaWYgKHN0cl92YWx1ZSA9PSBOVUxMKQorICAgICAgICBnb3RvIG91dDsKKworICAgICAgaWYgKCFfZGJ1c19oYXNoX3RhYmxlX2luc2VydF9zdHJpbmcgKHRhYmxlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVhbCAoJnN0cl9rZXkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZWFsICgmc3RyX3ZhbHVlKSkpCisgICAgICAgIGdvdG8gb3V0OworCisgICAgICBzdHJfdmFsdWUgPSBfZGJ1c19zdHJkdXAgKGtleXNbaV0pOworICAgICAgaWYgKHN0cl92YWx1ZSA9PSBOVUxMKQorICAgICAgICBnb3RvIG91dDsKKworICAgICAgaWYgKCFfZGJ1c19oYXNoX3RhYmxlX2luc2VydF9pbnQgKHRhYmxlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBzdGVhbCAoJnN0cl92YWx1ZSkpKQorICAgICAgICBnb3RvIG91dDsKKworICAgICAgc3RyX3ZhbHVlID0gX2RidXNfc3RyZHVwIChrZXlzW2ldKTsKKyAgICAgIGlmIChzdHJfdmFsdWUgPT0gTlVMTCkKKyAgICAgICAgZ290byBvdXQ7CisKKyAgICAgIGlmICghX2RidXNfaGFzaF90YWJsZV9pbnNlcnRfdWludHB0ciAodGFibGUzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBzdGVhbCAoJnN0cl92YWx1ZSkpKQorICAgICAgICBnb3RvIG91dDsKKworICAgICAgX2RidXNfYXNzZXJ0IChjb3VudF9lbnRyaWVzICh0YWJsZTEpID09IGkgKyAxKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoY291bnRfZW50cmllcyAodGFibGUyKSA9PSBpICsgMSk7CisgICAgICBfZGJ1c19hc3NlcnQgKGNvdW50X2VudHJpZXMgKHRhYmxlMykgPT0gaSArIDEpOworCisgICAgICBvdXRfdmFsdWUgPSBfZGJ1c19oYXNoX3RhYmxlX2xvb2t1cF9zdHJpbmcgKHRhYmxlMSwga2V5c1tpXSk7CisgICAgICBfZGJ1c19hc3NlcnQgKG91dF92YWx1ZSAhPSBOVUxMKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoc3RyY21wIChvdXRfdmFsdWUsICJWYWx1ZSEiKSA9PSAwKTsKKworICAgICAgb3V0X3ZhbHVlID0gX2RidXNfaGFzaF90YWJsZV9sb29rdXBfaW50ICh0YWJsZTIsIGkpOworICAgICAgX2RidXNfYXNzZXJ0IChvdXRfdmFsdWUgIT0gTlVMTCk7CisgICAgICBfZGJ1c19hc3NlcnQgKHN0cmNtcCAob3V0X3ZhbHVlLCBrZXlzW2ldKSA9PSAwKTsKKworICAgICAgb3V0X3ZhbHVlID0gX2RidXNfaGFzaF90YWJsZV9sb29rdXBfdWludHB0ciAodGFibGUzLCBpKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAob3V0X3ZhbHVlICE9IE5VTEwpOworICAgICAgX2RidXNfYXNzZXJ0IChzdHJjbXAgKG91dF92YWx1ZSwga2V5c1tpXSkgPT0gMCk7CisKKyAgICAgICsraTsKKyAgICB9CisKKyAgLS1pOworICB3aGlsZSAoaSA+PSAwKQorICAgIHsKKyAgICAgIF9kYnVzX2hhc2hfdGFibGVfcmVtb3ZlX3N0cmluZyAodGFibGUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlzW2ldKTsKKworICAgICAgX2RidXNfaGFzaF90YWJsZV9yZW1vdmVfaW50ICh0YWJsZTIsIGkpOworCisgICAgICBfZGJ1c19oYXNoX3RhYmxlX3JlbW92ZV91aW50cHRyICh0YWJsZTMsIGkpOworCisgICAgICBfZGJ1c19hc3NlcnQgKGNvdW50X2VudHJpZXMgKHRhYmxlMSkgPT0gaSk7CisgICAgICBfZGJ1c19hc3NlcnQgKGNvdW50X2VudHJpZXMgKHRhYmxlMikgPT0gaSk7CisgICAgICBfZGJ1c19hc3NlcnQgKGNvdW50X2VudHJpZXMgKHRhYmxlMykgPT0gaSk7CisKKyAgICAgIC0taTsKKyAgICB9CisKKyAgX2RidXNfaGFzaF90YWJsZV9yZWYgKHRhYmxlMSk7CisgIF9kYnVzX2hhc2hfdGFibGVfcmVmICh0YWJsZTIpOworICBfZGJ1c19oYXNoX3RhYmxlX3JlZiAodGFibGUzKTsKKyAgX2RidXNfaGFzaF90YWJsZV91bnJlZiAodGFibGUxKTsKKyAgX2RidXNfaGFzaF90YWJsZV91bnJlZiAodGFibGUyKTsKKyAgX2RidXNfaGFzaF90YWJsZV91bnJlZiAodGFibGUzKTsKKyAgX2RidXNfaGFzaF90YWJsZV91bnJlZiAodGFibGUxKTsKKyAgX2RidXNfaGFzaF90YWJsZV91bnJlZiAodGFibGUyKTsKKyAgX2RidXNfaGFzaF90YWJsZV91bnJlZiAodGFibGUzKTsKKyAgdGFibGUzID0gTlVMTDsKKworICAvKiBJbnNlcnQgYSBidW5jaCBvZiBzdHVmZiB0aGVuIGNoZWNrCisgICAqIHRoYXQgaXRlcmF0aW9uIHdvcmtzIGNvcnJlY3RseSAoZmluZHMgdGhlIHJpZ2h0CisgICAqIHZhbHVlcywgaXRlcl9zZXRfdmFsdWUgd29ya3MsIGV0Yy4pCisgICAqLworICB0YWJsZTEgPSBfZGJ1c19oYXNoX3RhYmxlX25ldyAoREJVU19IQVNIX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfZnJlZSwgZGJ1c19mcmVlKTsKKyAgaWYgKHRhYmxlMSA9PSBOVUxMKQorICAgIGdvdG8gb3V0OworCisgIHRhYmxlMiA9IF9kYnVzX2hhc2hfdGFibGVfbmV3IChEQlVTX0hBU0hfSU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgZGJ1c19mcmVlKTsKKyAgaWYgKHRhYmxlMiA9PSBOVUxMKQorICAgIGdvdG8gb3V0OworCisgIGkgPSAwOworICB3aGlsZSAoaSA8IDUwMDApCisgICAgeworICAgICAgc3RyX2tleSA9IF9kYnVzX3N0cmR1cCAoa2V5c1tpXSk7CisgICAgICBpZiAoc3RyX2tleSA9PSBOVUxMKQorICAgICAgICBnb3RvIG91dDsKKyAgICAgIHN0cl92YWx1ZSA9IF9kYnVzX3N0cmR1cCAoIlZhbHVlISIpOworICAgICAgaWYgKHN0cl92YWx1ZSA9PSBOVUxMKQorICAgICAgICBnb3RvIG91dDsKKworICAgICAgaWYgKCFfZGJ1c19oYXNoX3RhYmxlX2luc2VydF9zdHJpbmcgKHRhYmxlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVhbCAoJnN0cl9rZXkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZWFsICgmc3RyX3ZhbHVlKSkpCisgICAgICAgIGdvdG8gb3V0OworCisgICAgICBzdHJfdmFsdWUgPSBfZGJ1c19zdHJkdXAgKGtleXNbaV0pOworICAgICAgaWYgKHN0cl92YWx1ZSA9PSBOVUxMKQorICAgICAgICBnb3RvIG91dDsKKworICAgICAgaWYgKCFfZGJ1c19oYXNoX3RhYmxlX2luc2VydF9pbnQgKHRhYmxlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBzdGVhbCAoJnN0cl92YWx1ZSkpKQorICAgICAgICBnb3RvIG91dDsKKworICAgICAgX2RidXNfYXNzZXJ0IChjb3VudF9lbnRyaWVzICh0YWJsZTEpID09IGkgKyAxKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoY291bnRfZW50cmllcyAodGFibGUyKSA9PSBpICsgMSk7CisKKyAgICAgICsraTsKKyAgICB9CisKKyAgX2RidXNfaGFzaF9pdGVyX2luaXQgKHRhYmxlMSwgJml0ZXIpOworICB3aGlsZSAoX2RidXNfaGFzaF9pdGVyX25leHQgKCZpdGVyKSkKKyAgICB7CisgICAgICBjb25zdCBjaGFyICprZXk7CisgICAgICBjb25zdCB2b2lkICp2YWx1ZTsKKworICAgICAga2V5ID0gX2RidXNfaGFzaF9pdGVyX2dldF9zdHJpbmdfa2V5ICgmaXRlcik7CisgICAgICB2YWx1ZSA9IF9kYnVzX2hhc2hfaXRlcl9nZXRfdmFsdWUgKCZpdGVyKTsKKworICAgICAgX2RidXNfYXNzZXJ0IChfZGJ1c19oYXNoX3RhYmxlX2xvb2t1cF9zdHJpbmcgKHRhYmxlMSwga2V5KSA9PSB2YWx1ZSk7CisKKyAgICAgIHN0cl92YWx1ZSA9IF9kYnVzX3N0cmR1cCAoIkRpZmZlcmVudCB2YWx1ZSEiKTsKKyAgICAgIGlmIChzdHJfdmFsdWUgPT0gTlVMTCkKKyAgICAgICAgZ290byBvdXQ7CisKKyAgICAgIHZhbHVlID0gc3RyX3ZhbHVlOworICAgICAgX2RidXNfaGFzaF9pdGVyX3NldF92YWx1ZSAoJml0ZXIsIHN0ZWFsICgmc3RyX3ZhbHVlKSk7CisgICAgICBfZGJ1c19hc3NlcnQgKF9kYnVzX2hhc2hfdGFibGVfbG9va3VwX3N0cmluZyAodGFibGUxLCBrZXkpID09IHZhbHVlKTsKKyAgICB9CisKKyAgX2RidXNfaGFzaF9pdGVyX2luaXQgKHRhYmxlMSwgJml0ZXIpOworICB3aGlsZSAoX2RidXNfaGFzaF9pdGVyX25leHQgKCZpdGVyKSkKKyAgICB7CisgICAgICBfZGJ1c19oYXNoX2l0ZXJfcmVtb3ZlX2VudHJ5ICgmaXRlcik7CisgICAgICBfZGJ1c19hc3NlcnQgKGNvdW50X2VudHJpZXMgKHRhYmxlMSkgPT0gaSAtIDEpOworICAgICAgLS1pOworICAgIH0KKworICBfZGJ1c19oYXNoX2l0ZXJfaW5pdCAodGFibGUyLCAmaXRlcik7CisgIHdoaWxlIChfZGJ1c19oYXNoX2l0ZXJfbmV4dCAoJml0ZXIpKQorICAgIHsKKyAgICAgIGludCBrZXk7CisgICAgICBjb25zdCB2b2lkICp2YWx1ZTsKKworICAgICAga2V5ID0gX2RidXNfaGFzaF9pdGVyX2dldF9pbnRfa2V5ICgmaXRlcik7CisgICAgICB2YWx1ZSA9IF9kYnVzX2hhc2hfaXRlcl9nZXRfdmFsdWUgKCZpdGVyKTsKKworICAgICAgX2RidXNfYXNzZXJ0IChfZGJ1c19oYXNoX3RhYmxlX2xvb2t1cF9pbnQgKHRhYmxlMiwga2V5KSA9PSB2YWx1ZSk7CisKKyAgICAgIHN0cl92YWx1ZSA9IF9kYnVzX3N0cmR1cCAoIkRpZmZlcmVudCB2YWx1ZSEiKTsKKyAgICAgIGlmIChzdHJfdmFsdWUgPT0gTlVMTCkKKyAgICAgICAgZ290byBvdXQ7CisKKyAgICAgIHZhbHVlID0gc3RyX3ZhbHVlOworICAgICAgX2RidXNfaGFzaF9pdGVyX3NldF92YWx1ZSAoJml0ZXIsIHN0ZWFsICgmc3RyX3ZhbHVlKSk7CisgICAgICBfZGJ1c19hc3NlcnQgKF9kYnVzX2hhc2hfdGFibGVfbG9va3VwX2ludCAodGFibGUyLCBrZXkpID09IHZhbHVlKTsKKyAgICB9CisKKyAgaSA9IGNvdW50X2VudHJpZXMgKHRhYmxlMik7CisgIF9kYnVzX2hhc2hfaXRlcl9pbml0ICh0YWJsZTIsICZpdGVyKTsKKyAgd2hpbGUgKF9kYnVzX2hhc2hfaXRlcl9uZXh0ICgmaXRlcikpCisgICAgeworICAgICAgX2RidXNfaGFzaF9pdGVyX3JlbW92ZV9lbnRyeSAoJml0ZXIpOworICAgICAgX2RidXNfYXNzZXJ0IChjb3VudF9lbnRyaWVzICh0YWJsZTIpICsgMSA9PSBpKTsKKyAgICAgIC0taTsKKyAgICB9CisKKyAgLyogYWRkL3JlbW92ZSBpbnRlcmxlYXZlZCwgdG8gY2hlY2sgdGhhdCB3ZSBncm93L3NocmluayB0aGUgdGFibGUKKyAgICogYXBwcm9wcmlhdGVseQorICAgKi8KKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgMTAwMCkKKyAgICB7CisgICAgICBzdHJfa2V5ID0gX2RidXNfc3RyZHVwIChrZXlzW2ldKTsKKyAgICAgIGlmIChzdHJfa2V5ID09IE5VTEwpCisgICAgICAgIGdvdG8gb3V0OworCisgICAgICBzdHJfdmFsdWUgPSBfZGJ1c19zdHJkdXAgKCJWYWx1ZSEiKTsKKyAgICAgIGlmIChzdHJfdmFsdWUgPT0gTlVMTCkKKyAgICAgICAgZ290byBvdXQ7CisKKyAgICAgIGlmICghX2RidXNfaGFzaF90YWJsZV9pbnNlcnRfc3RyaW5nICh0YWJsZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlYWwgKCZzdHJfa2V5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVhbCAoJnN0cl92YWx1ZSkpKQorICAgICAgICBnb3RvIG91dDsKKworICAgICAgKytpOworICAgIH0KKworICAtLWk7CisgIHdoaWxlIChpID49IDApCisgICAgeworICAgICAgc3RyX2tleSA9IF9kYnVzX3N0cmR1cCAoa2V5c1tpXSk7CisgICAgICBpZiAoc3RyX2tleSA9PSBOVUxMKQorICAgICAgICBnb3RvIG91dDsKKyAgICAgIHN0cl92YWx1ZSA9IF9kYnVzX3N0cmR1cCAoIlZhbHVlISIpOworICAgICAgaWYgKHN0cl92YWx1ZSA9PSBOVUxMKQorICAgICAgICBnb3RvIG91dDsKKworICAgICAgaWYgKCFfZGJ1c19oYXNoX3RhYmxlX3JlbW92ZV9zdHJpbmcgKHRhYmxlMSwga2V5c1tpXSkpCisgICAgICAgIGdvdG8gb3V0OworCisgICAgICBpZiAoIV9kYnVzX2hhc2hfdGFibGVfaW5zZXJ0X3N0cmluZyAodGFibGUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZWFsICgmc3RyX2tleSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlYWwgKCZzdHJfdmFsdWUpKSkKKyAgICAgICAgZ290byBvdXQ7CisKKyAgICAgIGlmICghX2RidXNfaGFzaF90YWJsZV9yZW1vdmVfc3RyaW5nICh0YWJsZTEsIGtleXNbaV0pKQorICAgICAgICBnb3RvIG91dDsKKyAgICAgIAorICAgICAgX2RidXNfYXNzZXJ0IChfZGJ1c19oYXNoX3RhYmxlX2dldF9uX2VudHJpZXMgKHRhYmxlMSkgPT0gaSk7CisgICAgICAKKyAgICAgIC0taTsKKyAgICB9CisKKyAgLyogbnVrZSB0aGVzZSB0YWJsZXMgKi8KKyAgX2RidXNfaGFzaF90YWJsZV91bnJlZiAodGFibGUxKTsKKyAgX2RidXNfaGFzaF90YWJsZV91bnJlZiAodGFibGUyKTsKKworCisgIC8qIE5vdyBkbyBhIGJ1bmNoIG9mIHRoaW5ncyBhZ2FpbiB1c2luZyBfZGJ1c19oYXNoX2l0ZXJfbG9va3VwKCkgdG8KKyAgICogYmUgc3VyZSB0aGF0IGludGVyZmFjZSB3b3Jrcy4KKyAgICovCisgIHRhYmxlMSA9IF9kYnVzX2hhc2hfdGFibGVfbmV3IChEQlVTX0hBU0hfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19mcmVlLCBkYnVzX2ZyZWUpOworICBpZiAodGFibGUxID09IE5VTEwpCisgICAgZ290byBvdXQ7CisKKyAgdGFibGUyID0gX2RidXNfaGFzaF90YWJsZV9uZXcgKERCVVNfSEFTSF9JTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBkYnVzX2ZyZWUpOworICBpZiAodGFibGUyID09IE5VTEwpCisgICAgZ290byBvdXQ7CisKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgMzAwMCkKKyAgICB7CisgICAgICBjb25zdCB2b2lkICpvdXRfdmFsdWU7CisKKyAgICAgIHN0cl9rZXkgPSBfZGJ1c19zdHJkdXAgKGtleXNbaV0pOworICAgICAgaWYgKHN0cl9rZXkgPT0gTlVMTCkKKyAgICAgICAgZ290byBvdXQ7CisgICAgICBzdHJfdmFsdWUgPSBfZGJ1c19zdHJkdXAgKCJWYWx1ZSEiKTsKKyAgICAgIGlmIChzdHJfdmFsdWUgPT0gTlVMTCkKKyAgICAgICAgZ290byBvdXQ7CisKKyAgICAgIGlmICghX2RidXNfaGFzaF9pdGVyX2xvb2t1cCAodGFibGUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVhbCAoJnN0cl9rZXkpLCBUUlVFLCAmaXRlcikpCisgICAgICAgIGdvdG8gb3V0OworICAgICAgX2RidXNfYXNzZXJ0IChfZGJ1c19oYXNoX2l0ZXJfZ2V0X3ZhbHVlICgmaXRlcikgPT0gTlVMTCk7CisgICAgICBfZGJ1c19oYXNoX2l0ZXJfc2V0X3ZhbHVlICgmaXRlciwgc3RlYWwgKCZzdHJfdmFsdWUpKTsKKworICAgICAgc3RyX3ZhbHVlID0gX2RidXNfc3RyZHVwIChrZXlzW2ldKTsKKyAgICAgIGlmIChzdHJfdmFsdWUgPT0gTlVMTCkKKyAgICAgICAgZ290byBvdXQ7CisKKyAgICAgIGlmICghX2RidXNfaGFzaF9pdGVyX2xvb2t1cCAodGFibGUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfREJVU19JTlRfVE9fUE9JTlRFUiAoaSksIFRSVUUsICZpdGVyKSkKKyAgICAgICAgZ290byBvdXQ7CisgICAgICBfZGJ1c19hc3NlcnQgKF9kYnVzX2hhc2hfaXRlcl9nZXRfdmFsdWUgKCZpdGVyKSA9PSBOVUxMKTsKKyAgICAgIF9kYnVzX2hhc2hfaXRlcl9zZXRfdmFsdWUgKCZpdGVyLCBzdGVhbCAoJnN0cl92YWx1ZSkpOworCisgICAgICBfZGJ1c19hc3NlcnQgKGNvdW50X2VudHJpZXMgKHRhYmxlMSkgPT0gaSArIDEpOworICAgICAgX2RidXNfYXNzZXJ0IChjb3VudF9lbnRyaWVzICh0YWJsZTIpID09IGkgKyAxKTsKKworICAgICAgaWYgKCFfZGJ1c19oYXNoX2l0ZXJfbG9va3VwICh0YWJsZTEsIGtleXNbaV0sIEZBTFNFLCAmaXRlcikpCisgICAgICAgIGdvdG8gb3V0OworCisgICAgICBvdXRfdmFsdWUgPSBfZGJ1c19oYXNoX2l0ZXJfZ2V0X3ZhbHVlICgmaXRlcik7CisgICAgICBfZGJ1c19hc3NlcnQgKG91dF92YWx1ZSAhPSBOVUxMKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoc3RyY21wIChvdXRfdmFsdWUsICJWYWx1ZSEiKSA9PSAwKTsKKworICAgICAgLyogSXRlcmF0ZSBqdXN0IHRvIGJlIHN1cmUgaXQgd29ya3MsIHRob3VnaAorICAgICAgICogaXQncyBhIHN0dXBpZCB0aGluZyB0byBkbworICAgICAgICovCisgICAgICB3aGlsZSAoX2RidXNfaGFzaF9pdGVyX25leHQgKCZpdGVyKSkKKyAgICAgICAgOworCisgICAgICBpZiAoIV9kYnVzX2hhc2hfaXRlcl9sb29rdXAgKHRhYmxlMiwgX0RCVVNfSU5UX1RPX1BPSU5URVIgKGkpLCBGQUxTRSwgJml0ZXIpKQorICAgICAgICBnb3RvIG91dDsKKworICAgICAgb3V0X3ZhbHVlID0gX2RidXNfaGFzaF9pdGVyX2dldF92YWx1ZSAoJml0ZXIpOworICAgICAgX2RidXNfYXNzZXJ0IChvdXRfdmFsdWUgIT0gTlVMTCk7CisgICAgICBfZGJ1c19hc3NlcnQgKHN0cmNtcCAob3V0X3ZhbHVlLCBrZXlzW2ldKSA9PSAwKTsKKworICAgICAgLyogSXRlcmF0ZSBqdXN0IHRvIGJlIHN1cmUgaXQgd29ya3MsIHRob3VnaAorICAgICAgICogaXQncyBhIHN0dXBpZCB0aGluZyB0byBkbworICAgICAgICovCisgICAgICB3aGlsZSAoX2RidXNfaGFzaF9pdGVyX25leHQgKCZpdGVyKSkKKyAgICAgICAgOworICAgICAgCisgICAgICArK2k7CisgICAgfQorCisgIC0taTsKKyAgd2hpbGUgKGkgPj0gMCkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX2hhc2hfaXRlcl9sb29rdXAgKHRhYmxlMSwga2V5c1tpXSwgRkFMU0UsICZpdGVyKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiaGFzaCBlbnRyeSBzaG91bGQgaGF2ZSBleGlzdGVkIik7CisgICAgICBfZGJ1c19oYXNoX2l0ZXJfcmVtb3ZlX2VudHJ5ICgmaXRlcik7CisgICAgICAKKyAgICAgIGlmICghX2RidXNfaGFzaF9pdGVyX2xvb2t1cCAodGFibGUyLCBfREJVU19JTlRfVE9fUE9JTlRFUiAoaSksIEZBTFNFLCAmaXRlcikpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImhhc2ggZW50cnkgc2hvdWxkIGhhdmUgZXhpc3RlZCIpOworICAgICAgX2RidXNfaGFzaF9pdGVyX3JlbW92ZV9lbnRyeSAoJml0ZXIpOworCisgICAgICBfZGJ1c19hc3NlcnQgKGNvdW50X2VudHJpZXMgKHRhYmxlMSkgPT0gaSk7CisgICAgICBfZGJ1c19hc3NlcnQgKGNvdW50X2VudHJpZXMgKHRhYmxlMikgPT0gaSk7CisKKyAgICAgIC0taTsKKyAgICB9CisKKyAgX2RidXNfaGFzaF90YWJsZV91bnJlZiAodGFibGUxKTsKKyAgX2RidXNfaGFzaF90YWJsZV91bnJlZiAodGFibGUyKTsKKworICByZXQgPSBUUlVFOworCisgb3V0OgorICBmb3IgKGkgPSAwOyBpIDwgTl9IQVNIX0tFWVM7IGkrKykKKyAgICBkYnVzX2ZyZWUgKGtleXNbaV0pOworCisgIGRidXNfZnJlZSAoa2V5cyk7CisKKyAgZGJ1c19mcmVlIChzdHJfa2V5KTsKKyAgZGJ1c19mcmVlIChzdHJfdmFsdWUpOworICAKKyAgcmV0dXJuIHJldDsKK30KKworI2VuZGlmIC8qIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtaGFzaC5oIGIvZGJ1cy9kYnVzLWhhc2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWRhYjkxCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLWhhc2guaApAQCAtMCwwICsxLDIyMyBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLWhhc2guaCBHZW5lcmljIGhhc2ggdGFibGUgdXRpbGl0eSAoaW50ZXJuYWwgdG8gRC1CdXMgaW1wbGVtZW50YXRpb24pCisgKiAKKyAqIENvcHlyaWdodCAoQykgMjAwMiAgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaWZuZGVmIERCVVNfSEFTSF9ICisjZGVmaW5lIERCVVNfSEFTSF9ICisKKyNpZmRlZiBIQVZFX1NURElOVF9ICisjaW5jbHVkZSA8c3RkaW50Lmg+CisjZW5kaWYKKworI2lmZGVmIEhBVkVfSU5UVFlQRVNfSAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGRidXMvZGJ1cy1tZW1vcnkuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtdHlwZXMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc3lzZGVwcy5oPgorCitEQlVTX0JFR0lOX0RFQ0xTCisKKy8qKgorICogQGFkZHRvZ3JvdXAgREJ1c0hhc2hUYWJsZQorICogQHsKKyAqLworCisvKiogSGFzaCBpdGVyYXRvciBvYmplY3QuIFRoZSBpdGVyYXRvciBpcyBvbiB0aGUgc3RhY2ssIGJ1dCBpdHMgcmVhbAorICogZmllbGRzIGFyZSBoaWRkZW4gcHJpdmF0ZWx5LgorICovCitzdHJ1Y3QgREJ1c0hhc2hJdGVyCit7CisgIHZvaWQgKmR1bW15MTsgLyoqPCBEbyBub3QgdXNlLiAqLworICB2b2lkICpkdW1teTI7IC8qKjwgRG8gbm90IHVzZS4gKi8KKyAgdm9pZCAqZHVtbXkzOyAvKio8IERvIG5vdCB1c2UuICovCisgIHZvaWQgKmR1bW15NDsgLyoqPCBEbyBub3QgdXNlLiAqLworICBpbnQgICBkdW1teTU7IC8qKjwgRG8gbm90IHVzZS4gKi8KKyAgaW50ICAgZHVtbXk2OyAvKio8IERvIG5vdCB1c2UuICovCit9OworCit0eXBlZGVmIHN0cnVjdCBEQnVzSGFzaFRhYmxlIERCdXNIYXNoVGFibGU7Cit0eXBlZGVmIHN0cnVjdCBEQnVzSGFzaEl0ZXIgIERCdXNIYXNoSXRlcjsKKworLyogQWxsb3dpbmcgYW4gYXJiaXRyYXJ5IGZ1bmN0aW9uIGFzIHdpdGggR0xpYgorICogd291bGQgYmUgbmljZXIgZm9yIGEgcHVibGljIEFQSSwgYnV0IGZvcgorICogYW4gaW50ZXJuYWwgQVBJIHRoaXMgc2F2ZXMgdHlwaW5nLCB3ZSBjYW4gYWRkCisgKiBtb3JlIHdoZW5ldmVyIHdlIGZlZWwgbGlrZSBpdC4KKyAqLwordHlwZWRlZiBlbnVtCit7CisgIERCVVNfSEFTSF9TVFJJTkcsICAgICAgICAvKio8IEhhc2gga2V5cyBhcmUgc3RyaW5ncy4gKi8KKyAgREJVU19IQVNIX0lOVCwgICAgICAgICAgIC8qKjwgSGFzaCBrZXlzIGFyZSBpbnRlZ2Vycy4gKi8KKyAgREJVU19IQVNIX1VJTlRQVFIgICAgICAgIC8qKjwgSGFzaCBrZXlzIGFyZSBpbnRlZ2VyIGNhcGFibGUgdG8gaG9sZCBhIHBvaW50ZXIuICovCit9IERCdXNIYXNoVHlwZTsKKworREJVU19QUklWQVRFX0VYUE9SVAorREJ1c0hhc2hUYWJsZSogX2RidXNfaGFzaF90YWJsZV9uZXcgICAgICAgICAgICAgICAgKERCdXNIYXNoVHlwZSAgICAgIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAga2V5X2ZyZWVfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgdmFsdWVfZnJlZV9mdW5jdGlvbik7CitEQnVzSGFzaFRhYmxlKiBfZGJ1c19oYXNoX3RhYmxlX3JlZiAgICAgICAgICAgICAgICAoREJ1c0hhc2hUYWJsZSAgICAqdGFibGUpOworREJVU19QUklWQVRFX0VYUE9SVAordm9pZCAgICAgICAgICAgX2RidXNfaGFzaF90YWJsZV91bnJlZiAgICAgICAgICAgICAgKERCdXNIYXNoVGFibGUgICAgKnRhYmxlKTsKK3ZvaWQgICAgICAgICAgIF9kYnVzX2hhc2hfdGFibGVfcmVtb3ZlX2FsbCAgICAgICAgIChEQnVzSGFzaFRhYmxlICAgICp0YWJsZSk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCit2b2lkICAgICAgICAgICBfZGJ1c19oYXNoX2l0ZXJfaW5pdCAgICAgICAgICAgICAgICAoREJ1c0hhc2hUYWJsZSAgICAqdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0hhc2hJdGVyICAgICAqaXRlcik7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCAgICBfZGJ1c19oYXNoX2l0ZXJfbmV4dCAgICAgICAgICAgICAgICAoREJ1c0hhc2hJdGVyICAgICAqaXRlcik7CitEQlVTX1BSSVZBVEVfRVhQT1JUCit2b2lkICAgICAgICAgICBfZGJ1c19oYXNoX2l0ZXJfcmVtb3ZlX2VudHJ5ICAgICAgICAoREJ1c0hhc2hJdGVyICAgICAqaXRlcik7CitEQlVTX1BSSVZBVEVfRVhQT1JUCit2b2lkKiAgICAgICAgICBfZGJ1c19oYXNoX2l0ZXJfZ2V0X3ZhbHVlICAgICAgICAgICAoREJ1c0hhc2hJdGVyICAgICAqaXRlcik7Cit2b2lkICAgICAgICAgICBfZGJ1c19oYXNoX2l0ZXJfc2V0X3ZhbHVlICAgICAgICAgICAoREJ1c0hhc2hJdGVyICAgICAqaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICp2YWx1ZSk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitpbnQgICAgICAgICAgICBfZGJ1c19oYXNoX2l0ZXJfZ2V0X2ludF9rZXkgICAgICAgICAoREJ1c0hhc2hJdGVyICAgICAqaXRlcik7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitjb25zdCBjaGFyKiAgICBfZGJ1c19oYXNoX2l0ZXJfZ2V0X3N0cmluZ19rZXkgICAgICAoREJ1c0hhc2hJdGVyICAgICAqaXRlcik7CitEQlVTX1BSSVZBVEVfRVhQT1JUCit1aW50cHRyX3QgICAgICBfZGJ1c19oYXNoX2l0ZXJfZ2V0X3VpbnRwdHJfa2V5ICAgICAoREJ1c0hhc2hJdGVyICAgICAqaXRlcik7CitkYnVzX2Jvb2xfdCAgICBfZGJ1c19oYXNoX2l0ZXJfbG9va3VwICAgICAgICAgICAgICAoREJ1c0hhc2hUYWJsZSAgICAqdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgIGNyZWF0ZV9pZl9ub3RfZm91bmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0hhc2hJdGVyICAgICAqaXRlcik7CitEQlVTX1BSSVZBVEVfRVhQT1JUCit2b2lkKiAgICAgICAgICBfZGJ1c19oYXNoX3RhYmxlX2xvb2t1cF9zdHJpbmcgICAgICAoREJ1c0hhc2hUYWJsZSAgICAqdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqa2V5KTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK3ZvaWQqICAgICAgICAgIF9kYnVzX2hhc2hfdGFibGVfbG9va3VwX2ludCAgICAgICAgIChEQnVzSGFzaFRhYmxlICAgICp0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBrZXkpOworREJVU19QUklWQVRFX0VYUE9SVAordm9pZCogICAgICAgICAgX2RidXNfaGFzaF90YWJsZV9sb29rdXBfdWludHB0ciAgICAgKERCdXNIYXNoVGFibGUgICAgKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnRwdHJfdCAgICAgICAgIGtleSk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCAgICBfZGJ1c19oYXNoX3RhYmxlX3JlbW92ZV9zdHJpbmcgICAgICAoREJ1c0hhc2hUYWJsZSAgICAqdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqa2V5KTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90ICAgIF9kYnVzX2hhc2hfdGFibGVfcmVtb3ZlX2ludCAgICAgICAgIChEQnVzSGFzaFRhYmxlICAgICp0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBrZXkpOworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgICAgX2RidXNfaGFzaF90YWJsZV9yZW1vdmVfdWludHB0ciAgICAgKERCdXNIYXNoVGFibGUgICAgKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnRwdHJfdCAgICAgICAgIGtleSk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCAgICBfZGJ1c19oYXNoX3RhYmxlX2luc2VydF9zdHJpbmcgICAgICAoREJ1c0hhc2hUYWJsZSAgICAqdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAgICAgICAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgKnZhbHVlKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90ICAgIF9kYnVzX2hhc2hfdGFibGVfaW5zZXJ0X2ludCAgICAgICAgIChEQnVzSGFzaFRhYmxlICAgICp0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAqdmFsdWUpOworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgICAgX2RidXNfaGFzaF90YWJsZV9pbnNlcnRfdWludHB0ciAgICAgKERCdXNIYXNoVGFibGUgICAgKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnRwdHJfdCAgICAgICAgIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICp2YWx1ZSk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitpbnQgICAgICAgICAgICBfZGJ1c19oYXNoX3RhYmxlX2dldF9uX2VudHJpZXMgICAgICAoREJ1c0hhc2hUYWJsZSAgICAqdGFibGUpOworCitEQlVTX1BSSVZBVEVfRVhQT1JUCitjaGFyICoqICAgICAgICBfZGJ1c19oYXNoX3RhYmxlX3RvX2FycmF5ICAgICAgICAgICAoREJ1c0hhc2hUYWJsZSAgICAgKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICAgICAgICBkZWxpbWl0ZXIpOworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgICAgX2RidXNfaGFzaF90YWJsZV9mcm9tX2FycmF5ICAgICAgICAgKERCdXNIYXNoVGFibGUgICAgICp0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICAgICAgICoqYXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAgICAgICAgIGRlbGltaXRlcik7CisKKy8qIFByZWFsbG9jYXRpb24gKi8KKworLyoqIEEgcHJlYWxsb2NhdGVkIGhhc2ggZW50cnkgKi8KK3R5cGVkZWYgc3RydWN0IERCdXNQcmVhbGxvY2F0ZWRIYXNoIERCdXNQcmVhbGxvY2F0ZWRIYXNoOworCitEQlVTX1BSSVZBVEVfRVhQT1JUCitEQnVzUHJlYWxsb2NhdGVkSGFzaCAqX2RidXNfaGFzaF90YWJsZV9wcmVhbGxvY2F0ZV9lbnRyeSAgICAgICAgICAoREJ1c0hhc2hUYWJsZSAgICAgICAgKnRhYmxlKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK3ZvaWQgICAgICAgICAgICAgICAgICBfZGJ1c19oYXNoX3RhYmxlX2ZyZWVfcHJlYWxsb2NhdGVkX2VudHJ5ICAgIChEQnVzSGFzaFRhYmxlICAgICAgICAqdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1ByZWFsbG9jYXRlZEhhc2ggKnByZWFsbG9jYXRlZCk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCit2b2lkICAgICAgICAgICAgICAgICAgX2RidXNfaGFzaF90YWJsZV9pbnNlcnRfc3RyaW5nX3ByZWFsbG9jYXRlZCAoREJ1c0hhc2hUYWJsZSAgICAgICAgKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNQcmVhbGxvY2F0ZWRIYXNoICpwcmVhbGxvY2F0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAgICAgICAgICAgKmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAqdmFsdWUpOworCisjaWZkZWYgREJVU19XSU4KKyMgZGVmaW5lIERCVVNfSEFTSF9QT0xMQUJMRSBEQlVTX0hBU0hfVUlOVFBUUgorI2Vsc2UKKyMgZGVmaW5lIERCVVNfSEFTSF9QT0xMQUJMRSBEQlVTX0hBU0hfSU5UCisjZW5kaWYKKworc3RhdGljIGlubGluZSBEQnVzUG9sbGFibGUKK19kYnVzX2hhc2hfaXRlcl9nZXRfcG9sbGFibGVfa2V5IChEQnVzSGFzaEl0ZXIgKml0ZXIpCit7CisjaWZkZWYgREJVU19XSU4KKyAgREJ1c1NvY2tldCBzOworCisgIHMuc29jayA9IF9kYnVzX2hhc2hfaXRlcl9nZXRfdWludHB0cl9rZXkgKGl0ZXIpOworICByZXR1cm4gczsKKyNlbHNlCisgIHJldHVybiBfZGJ1c19oYXNoX2l0ZXJfZ2V0X2ludF9rZXkgKGl0ZXIpOworI2VuZGlmCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqCitfZGJ1c19oYXNoX3RhYmxlX2xvb2t1cF9wb2xsYWJsZSAoREJ1c0hhc2hUYWJsZSAqdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1BvbGxhYmxlICAga2V5KQoreworI2lmZGVmIERCVVNfV0lOCisgIHJldHVybiBfZGJ1c19oYXNoX3RhYmxlX2xvb2t1cF91aW50cHRyICh0YWJsZSwga2V5LnNvY2spOworI2Vsc2UKKyAgcmV0dXJuIF9kYnVzX2hhc2hfdGFibGVfbG9va3VwX2ludCAodGFibGUsIGtleSk7CisjZW5kaWYKK30KKworc3RhdGljIGlubGluZSBkYnVzX2Jvb2xfdAorX2RidXNfaGFzaF90YWJsZV9yZW1vdmVfcG9sbGFibGUgKERCdXNIYXNoVGFibGUgKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNQb2xsYWJsZSAgIGtleSkKK3sKKyNpZmRlZiBEQlVTX1dJTgorICByZXR1cm4gX2RidXNfaGFzaF90YWJsZV9yZW1vdmVfdWludHB0ciAodGFibGUsIGtleS5zb2NrKTsKKyNlbHNlCisgIHJldHVybiBfZGJ1c19oYXNoX3RhYmxlX3JlbW92ZV9pbnQgKHRhYmxlLCBrZXkpOworI2VuZGlmCit9CisKK3N0YXRpYyBpbmxpbmUgZGJ1c19ib29sX3QKK19kYnVzX2hhc2hfdGFibGVfaW5zZXJ0X3BvbGxhYmxlIChEQnVzSGFzaFRhYmxlICp0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzUG9sbGFibGUgICBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqdmFsdWUpCit7CisjaWZkZWYgREJVU19XSU4KKyAgcmV0dXJuIF9kYnVzX2hhc2hfdGFibGVfaW5zZXJ0X3VpbnRwdHIgKHRhYmxlLCBrZXkuc29jaywgdmFsdWUpOworI2Vsc2UKKyAgcmV0dXJuIF9kYnVzX2hhc2hfdGFibGVfaW5zZXJ0X2ludCAodGFibGUsIGtleSwgdmFsdWUpOworI2VuZGlmCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX2RidXNfY2xlYXJfaGFzaF90YWJsZSAoREJ1c0hhc2hUYWJsZSAqKnRhYmxlX3ApCit7CisgIF9kYnVzX2NsZWFyX3BvaW50ZXJfaW1wbCAoREJ1c0hhc2hUYWJsZSwgdGFibGVfcCwgX2RidXNfaGFzaF90YWJsZV91bnJlZik7Cit9CisKKy8qKiBAfSAqLworCitEQlVTX0VORF9ERUNMUworCisjZW5kaWYgLyogREJVU19IQVNIX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1pbml0LXdpbi5jcHAgYi9kYnVzL2RidXMtaW5pdC13aW4uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4N2YyNDgKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtaW5pdC13aW4uY3BwCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBkYnVzLWluaXQtd2luLmNwcCAtIG9uY2UtcGVyLXByb2Nlc3MgaW5pdGlhbGl6YXRpb24KKyAqCisgKiBDb3B5cmlnaHQgwqkgMjAxMyBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorCitleHRlcm4gIkMiCit7CisjaW5jbHVkZSAiZGJ1cy1zeXNkZXBzLXdpbi5oIgorfQorCitjbGFzcyBEQnVzSW50ZXJuYWxJbml0CisgIHsKKyAgICBwdWJsaWM6CisgICAgICBEQnVzSW50ZXJuYWxJbml0ICgpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c190aHJlYWRzX3dpbmRvd3NfaW5pdF9nbG9iYWwgKCk7CisgICAgICAgIH0KKworICAgICAgdm9pZCBtdXN0X25vdF9iZV9vbWl0dGVkICgpCisgICAgICAgIHsKKyAgICAgICAgfQorICB9OworCitzdGF0aWMgREJ1c0ludGVybmFsSW5pdCBpbml0OworCitleHRlcm4gIkMiIHZvaWQKK19kYnVzX3RocmVhZHNfd2luZG93c19lbnN1cmVfY3Rvcl9saW5rZWQgKCkKK3sKKyAgLyogRG8gbm90aGluZyBzaWduaWZpY2FudCwganVzdCBlbnN1cmUgdGhhdCB0aGUgZ2xvYmFsIGluaXRpYWxpemVyIGdldHMKKyAgICogbGlua2VkIGluLiAqLworICBpbml0Lm11c3Rfbm90X2JlX29taXR0ZWQgKCk7Cit9CmRpZmYgLS1naXQgYS9kYnVzL2RidXMtaW50ZXJuYWxzLmMgYi9kYnVzL2RidXMtaW50ZXJuYWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY3YWVmOQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1pbnRlcm5hbHMuYwpAQCAtMCwwICsxLDEwOTUgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1pbnRlcm5hbHMuYyAgcmFuZG9tIHV0aWxpdHkgc3R1ZmYgKGludGVybmFsIHRvIEQtQnVzIGltcGxlbWVudGF0aW9uKQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMyAgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKyNpbmNsdWRlICJkYnVzLXByb3RvY29sLmgiCisjaW5jbHVkZSAiZGJ1cy1tYXJzaGFsLWJhc2ljLmgiCisjaW5jbHVkZSAiZGJ1cy10ZXN0LmgiCisjaW5jbHVkZSAiZGJ1cy12YWxncmluZC1pbnRlcm5hbC5oIgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaWZkZWYgREJVU19VU0VfT1VUUFVUX0RFQlVHX1NUUklORworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRlIDxtYnN0cmluZy5oPgorI2VuZGlmCisKKy8qKgorICogQGRlZmdyb3VwIERCdXNJbnRlcm5hbHMgRC1CdXMgc2VjcmV0IGludGVybmFsIGltcGxlbWVudGF0aW9uIGRldGFpbHMKKyAqIEBicmllZiBEb2N1bWVudGF0aW9uIHVzZWZ1bCB3aGVuIGRldmVsb3Bpbmcgb3IgZGVidWdnaW5nIEQtQnVzIGl0c2VsZi4KKyAqIAorICovCisKKy8qKgorICogQGRlZmdyb3VwIERCdXNJbnRlcm5hbHNVdGlscyBVdGlsaXRpZXMgYW5kIHBvcnRhYmlsaXR5CisgKiBAaW5ncm91cCBEQnVzSW50ZXJuYWxzCisgKiBAYnJpZWYgVXRpbGl0eSBmdW5jdGlvbnMgKF9kYnVzX2Fzc2VydCgpLCBfZGJ1c193YXJuKCksIGV0Yy4pCisgKiBAeworICovCisKKy8qKgorICogQGRlZiBfZGJ1c19hc3NlcnQKKyAqCisgKiBBYm9ydHMgd2l0aCBhbiBlcnJvciBtZXNzYWdlIGlmIHRoZSBjb25kaXRpb24gaXMgZmFsc2UuCisgKiAKKyAqIEBwYXJhbSBjb25kaXRpb24gY29uZGl0aW9uIHdoaWNoIG11c3QgYmUgdHJ1ZS4KKyAqLworCisvKioKKyAqIEBkZWYgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkCisgKgorICogQWJvcnRzIHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpZiBjYWxsZWQuCisgKiBUaGUgZ2l2ZW4gZXhwbGFuYXRpb24gd2lsbCBiZSBwcmludGVkLgorICogCisgKiBAcGFyYW0gZXhwbGFuYXRpb24gZXhwbGFuYXRpb24gb2Ygd2hhdCBoYXBwZW5lZCBpZiB0aGUgY29kZSB3YXMgcmVhY2hlZC4KKyAqLworCisvKioKKyAqIEBkZWYgX0RCVVNfTl9FTEVNRU5UUworICoKKyAqIENvbXB1dGVzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gYSBmaXhlZC1zaXplIGFycmF5IHVzaW5nCisgKiBzaXplb2YoKS4KKyAqCisgKiBAcGFyYW0gYXJyYXkgdGhlIGFycmF5IHRvIGNvdW50IGVsZW1lbnRzIGluLgorICovCisKKy8qKgorICogQGRlZiBfREJVU19QT0lOVEVSX1RPX0lOVAorICoKKyAqIFNhZmVseSBjYXN0cyBhIHZvaWQqIHRvIGFuIGludGVnZXI7IHNob3VsZCBvbmx5IGJlIHVzZWQgb24gdm9pZCoKKyAqIHRoYXQgYWN0dWFsbHkgY29udGFpbiBpbnRlZ2VycywgZm9yIGV4YW1wbGUgb25lIGNyZWF0ZWQgd2l0aAorICogX0RCVVNfSU5UX1RPX1BPSU5URVIuICBPbmx5IGd1YXJhbnRlZWQgdG8gcHJlc2VydmUgMzIgYml0cy4KKyAqIChpLmUuIGl0J3MgdXNlZCB0byBzdG9yZSAzMi1iaXQgaW50cyBpbiBwb2ludGVycywgYnV0CisgKiBjYW4ndCBiZSB1c2VkIHRvIHN0b3JlIDY0LWJpdCBwb2ludGVycyBpbiBpbnRzLikKKyAqCisgKiBAcGFyYW0gcG9pbnRlciBwb2ludGVyIHRvIGV4dHJhY3QgYW4gaW50ZWdlciBmcm9tLgorICovCisvKioKKyAqIEBkZWYgX0RCVVNfSU5UX1RPX1BPSU5URVIKKyAqCisgKiBTYWZlbHkgc3R1ZmZzIGFuIGludGVnZXIgaW50byBhIHBvaW50ZXIsIHRvIGJlIGV4dHJhY3RlZCBsYXRlciB3aXRoCisgKiBfREJVU19QT0lOVEVSX1RPX0lOVC4gT25seSBndWFyYW50ZWVkIHRvIHByZXNlcnZlIDMyIGJpdHMuCisgKgorICogQHBhcmFtIGludGVnZXIgdGhlIGludGVnZXIgdG8gc3R1ZmYgaW50byBhIHBvaW50ZXIuCisgKi8KKy8qKgorICogQGRlZiBfREJVU19aRVJPCisgKgorICogU2V0cyBhbGwgYml0cyBpbiBhbiBvYmplY3QgdG8gemVyby4KKyAqCisgKiBAcGFyYW0gb2JqZWN0IHRoZSBvYmplY3QgdG8gYmUgemVyb2VkLgorICovCisvKioKKyAqIEBkZWYgX0RCVVNfSU5UMTZfTUlOCisgKgorICogTWluaW11bSB2YWx1ZSBvZiB0eXBlICJpbnQxNiIKKyAqLworLyoqCisgKiBAZGVmIF9EQlVTX0lOVDE2X01BWAorICoKKyAqIE1heGltdW0gdmFsdWUgb2YgdHlwZSAiaW50MTYiCisgKi8KKy8qKgorICogQGRlZiBfREJVU19VSU5UMTZfTUFYCisgKgorICogTWF4aW11bSB2YWx1ZSBvZiB0eXBlICJ1aW50MTYiCisgKi8KKworLyoqCisgKiBAZGVmIF9EQlVTX0lOVDMyX01JTgorICoKKyAqIE1pbmltdW0gdmFsdWUgb2YgdHlwZSAiaW50MzIiCisgKi8KKy8qKgorICogQGRlZiBfREJVU19JTlQzMl9NQVgKKyAqCisgKiBNYXhpbXVtIHZhbHVlIG9mIHR5cGUgImludDMyIgorICovCisvKioKKyAqIEBkZWYgX0RCVVNfVUlOVDMyX01BWAorICoKKyAqIE1heGltdW0gdmFsdWUgb2YgdHlwZSAidWludDMyIgorICovCisKKy8qKgorICogQGRlZiBfREJVU19JTlRfTUlOCisgKgorICogTWluaW11bSB2YWx1ZSBvZiB0eXBlICJpbnQiCisgKi8KKy8qKgorICogQGRlZiBfREJVU19JTlRfTUFYCisgKgorICogTWF4aW11bSB2YWx1ZSBvZiB0eXBlICJpbnQiCisgKi8KKy8qKgorICogQGRlZiBfREJVU19VSU5UX01BWAorICoKKyAqIE1heGltdW0gdmFsdWUgb2YgdHlwZSAidWludCIKKyAqLworCisvKioKKyAqIEB0eXBlZGVmIERCdXNGb3JlYWNoRnVuY3Rpb24KKyAqIAorICogVXNlZCB0byBpdGVyYXRlIG92ZXIgZWFjaCBpdGVtIGluIGEgY29sbGVjdGlvbiwgc3VjaCBhcworICogYSBEQnVzTGlzdC4KKyAqLworCisvKioKKyAqIEBkZWYgX0RCVVNfTE9DS19OQU1FCisgKgorICogRXhwYW5kcyB0byBuYW1lIG9mIGEgZ2xvYmFsIGxvY2sgdmFyaWFibGUuCisgKi8KKworLyoqCisgKiBAZGVmIF9EQlVTX0xPQ0sKKyAqCisgKiBMb2NrcyBhIGdsb2JhbCBsb2NrLCBpbml0aWFsaXppbmcgaXQgZmlyc3QgaWYgbmVjZXNzYXJ5LgorICoKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBub3QgZW5vdWdoIG1lbW9yeQorICovCisKKy8qKgorICogQGRlZiBfREJVU19VTkxPQ0sKKyAqCisgKiBVbmxvY2tzIGEgZ2xvYmFsIGxvY2sKKyAqLworCisvKioKKyAqIEZpeGVkICJvdXQgb2YgbWVtb3J5IiBlcnJvciBtZXNzYWdlLCBqdXN0IHRvIGF2b2lkCisgKiBtYWtpbmcgdXAgYSBkaWZmZXJlbnQgc3RyaW5nIGV2ZXJ5IHRpbWUgYW5kIHdhc3RpbmcKKyAqIHNwYWNlLgorICovCitjb25zdCBjaGFyICpfZGJ1c19ub19tZW1vcnlfbWVzc2FnZSA9ICJOb3QgZW5vdWdoIG1lbW9yeSI7CisKK3N0YXRpYyBkYnVzX2Jvb2xfdCB3YXJuX2luaXR0ZWQgPSBGQUxTRTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBmYXRhbF93YXJuaW5ncyA9IEZBTFNFOworc3RhdGljIGRidXNfYm9vbF90IGZhdGFsX3dhcm5pbmdzX29uX2NoZWNrX2ZhaWxlZCA9IFRSVUU7CisKK3N0YXRpYyB2b2lkCitpbml0X3dhcm5pbmdzKHZvaWQpCit7CisgIGlmICghd2Fybl9pbml0dGVkKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKnM7CisgICAgICBzID0gX2RidXNfZ2V0ZW52ICgiREJVU19GQVRBTF9XQVJOSU5HUyIpOworICAgICAgaWYgKHMgJiYgKnMpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoKnMgPT0gJzAnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBmYXRhbF93YXJuaW5ncyA9IEZBTFNFOworICAgICAgICAgICAgICBmYXRhbF93YXJuaW5nc19vbl9jaGVja19mYWlsZWQgPSBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIGlmICgqcyA9PSAnMScpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGZhdGFsX3dhcm5pbmdzID0gVFJVRTsKKyAgICAgICAgICAgICAgZmF0YWxfd2FybmluZ3Nfb25fY2hlY2tfZmFpbGVkID0gVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiREJVU19GQVRBTF9XQVJOSU5HUyBzaG91bGQgYmUgc2V0IHRvIDAgb3IgMSBpZiBzZXQsIG5vdCAnJXMnIiwKKyAgICAgICAgICAgICAgICAgICAgICBzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICB3YXJuX2luaXR0ZWQgPSBUUlVFOworICAgIH0KK30KKworLyoqCisgKiBQcmludHMgYSB3YXJuaW5nIG1lc3NhZ2UgdG8gc3RkZXJyLiBDYW4gb3B0aW9uYWxseSBiZSBtYWRlIHRvIGV4aXQKKyAqIGZhdGFsbHkgYnkgc2V0dGluZyBEQlVTX0ZBVEFMX1dBUk5JTkdTLCBidXQgdGhpcyBpcyByYXJlbHkKKyAqIHVzZWQuIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNvbnNpZGVyZWQgcHJldHR5IG11Y2ggZXF1aXZhbGVudCB0bworICogZnByaW50ZihzdGRlcnIpLiBfZGJ1c193YXJuX2NoZWNrX2ZhaWxlZCgpIG9uIHRoZSBvdGhlciBoYW5kIGlzCisgKiBzdWl0YWJsZSBmb3IgdXNlIHdoZW4gYSBwcm9ncmFtbWluZyBtaXN0YWtlIGhhcyBiZWVuIG1hZGUuCisgKgorICogQHBhcmFtIGZvcm1hdCBwcmludGYtc3R5bGUgZm9ybWF0IHN0cmluZy4KKyAqLwordm9pZAorX2RidXNfd2FybiAoY29uc3QgY2hhciAqZm9ybWF0LAorICAgICAgICAgICAgLi4uKQoreworICBEQnVzU3lzdGVtTG9nU2V2ZXJpdHkgc2V2ZXJpdHkgPSBEQlVTX1NZU1RFTV9MT0dfV0FSTklORzsKKyAgdmFfbGlzdCBhcmdzOworCisgIGlmICghd2Fybl9pbml0dGVkKQorICAgIGluaXRfd2FybmluZ3MgKCk7CisKKyAgaWYgKGZhdGFsX3dhcm5pbmdzKQorICAgIHNldmVyaXR5ID0gREJVU19TWVNURU1fTE9HX0VSUk9SOworCisgIHZhX3N0YXJ0IChhcmdzLCBmb3JtYXQpOworICBfZGJ1c19sb2d2IChzZXZlcml0eSwgZm9ybWF0LCBhcmdzKTsKKyAgdmFfZW5kIChhcmdzKTsKKworICBpZiAoZmF0YWxfd2FybmluZ3MpCisgICAgeworICAgICAgZmZsdXNoIChzdGRlcnIpOworICAgICAgX2RidXNfYWJvcnQgKCk7CisgICAgfQorfQorCisvKioKKyAqIFByaW50cyBhICJjcml0aWNhbCIgd2FybmluZyB0byBzdGRlcnIgd2hlbiBhbiBhc3NlcnRpb24gZmFpbHM7CisgKiBkaWZmZXJzIGZyb20gX2RidXNfd2FybiBwcmltYXJpbHkgaW4gdGhhdCBpdAorICogZGVmYXVsdHMgdG8gZmF0YWwuIFRoaXMgc2hvdWxkIGJlIHVzZWQgb25seSB3aGVuIGEgcHJvZ3JhbW1pbmcKKyAqIGVycm9yIGhhcyBiZWVuIGRldGVjdGVkLiAoTk9UIGZvciB1bmF2b2lkYWJsZSBlcnJvcnMgdGhhdCBhbiBhcHAKKyAqIG1pZ2h0IGhhbmRsZSAtIHRob3NlIHNob3VsZCBiZSByZXR1cm5lZCBhcyBEQnVzRXJyb3IuKSBDYWxsaW5nIHRoaXMKKyAqIG1lYW5zICJ0aGVyZSBpcyBhIGJ1ZyIKKyAqLwordm9pZAorX2RidXNfd2Fybl9jaGVja19mYWlsZWQoY29uc3QgY2hhciAqZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgLi4uKQoreworICBEQnVzU3lzdGVtTG9nU2V2ZXJpdHkgc2V2ZXJpdHkgPSBEQlVTX1NZU1RFTV9MT0dfV0FSTklORzsKKyAgdmFfbGlzdCBhcmdzOworICAKKyAgaWYgKCF3YXJuX2luaXR0ZWQpCisgICAgaW5pdF93YXJuaW5ncyAoKTsKKworICBpZiAoZmF0YWxfd2FybmluZ3Nfb25fY2hlY2tfZmFpbGVkKQorICAgIHNldmVyaXR5ID0gREJVU19TWVNURU1fTE9HX0VSUk9SOworCisgIHZhX3N0YXJ0IChhcmdzLCBmb3JtYXQpOworICBfZGJ1c19sb2d2IChzZXZlcml0eSwgZm9ybWF0LCBhcmdzKTsKKyAgdmFfZW5kIChhcmdzKTsKKworICBpZiAoZmF0YWxfd2FybmluZ3Nfb25fY2hlY2tfZmFpbGVkKQorICAgIHsKKyAgICAgIGZmbHVzaCAoc3RkZXJyKTsKKyAgICAgIF9kYnVzX2Fib3J0ICgpOworICAgIH0KK30KKworI2lmZGVmIERCVVNfRU5BQkxFX1ZFUkJPU0VfTU9ERQorCitzdGF0aWMgZGJ1c19ib29sX3QgdmVyYm9zZV9pbml0dGVkID0gRkFMU0U7CitzdGF0aWMgZGJ1c19ib29sX3QgdmVyYm9zZSA9IFRSVUU7CisKKyNpZmRlZiBEQlVTX1VTRV9PVVRQVVRfREVCVUdfU1RSSU5HCitzdGF0aWMgY2hhciBtb2R1bGVfbmFtZVsxMDI0XTsKKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIHZvaWQKK19kYnVzX3ZlcmJvc2VfaW5pdCAodm9pZCkKK3sKKyAgaWYgKCF2ZXJib3NlX2luaXR0ZWQpCisgICAgeworICAgICAgY29uc3QgY2hhciAqcCA9IF9kYnVzX2dldGVudiAoIkRCVVNfVkVSQk9TRSIpOworICAgICAgdmVyYm9zZSA9IHAgIT0gTlVMTCAmJiAqcCA9PSAnMSc7CisgICAgICB2ZXJib3NlX2luaXR0ZWQgPSBUUlVFOworI2lmZGVmIERCVVNfVVNFX09VVFBVVF9ERUJVR19TVFJJTkcKKyAgICAgIHsKKyAgICAgICAgY2hhciAqbGFzdF9wZXJpb2QsICpsYXN0X3NsYXNoOworICAgICAgICBHZXRNb2R1bGVGaWxlTmFtZSgwLG1vZHVsZV9uYW1lLHNpemVvZihtb2R1bGVfbmFtZSktMSk7CisgICAgICAgIGxhc3RfcGVyaW9kID0gX21ic3JjaHIobW9kdWxlX25hbWUsJy4nKTsKKyAgICAgICAgaWYgKGxhc3RfcGVyaW9kKQorICAgICAgICAgICpsYXN0X3BlcmlvZCA9J1wwJzsKKyAgICAgICAgbGFzdF9zbGFzaCA9IF9tYnNyY2hyKG1vZHVsZV9uYW1lLCdcXCcpOworICAgICAgICBpZiAobGFzdF9zbGFzaCkKKyAgICAgICAgICBzdHJjcHkobW9kdWxlX25hbWUsbGFzdF9zbGFzaCsxKTsKKyAgICAgICAgc3RyY2F0KG1vZHVsZV9uYW1lLCI6ICIpOworICAgICAgfQorI2VuZGlmCisgICAgfQorfQorCisvKiogQGRlZiBEQlVTX0lTX0RJUl9TRVBBUkFUT1IoYykKKyAqIG1hY3JvIGZvciBjaGVja2luZyBpZiBjaGFyYWN0ZXIgYyBpcyBhIHBhdGNoIHNlcGFyYXRvcgorICogCisgKiBAdG9kbyBtb3ZlIHRvIGEgaGVhZGVyIGZpbGUgc28gdGhhdCBvdGhlcnMgY2FuIHVzZSB0aGlzIHRvbworICovCisjaWZkZWYgREJVU19XSU4gCisjZGVmaW5lIERCVVNfSVNfRElSX1NFUEFSQVRPUihjKSAoYyA9PSAnXFwnIHx8IGMgPT0gJy8nKQorI2Vsc2UKKyNkZWZpbmUgREJVU19JU19ESVJfU0VQQVJBVE9SKGMpIChjID09ICcvJykKKyNlbmRpZgorCisvKiogCisgcmVtb3ZlIHNvdXJjZSByb290IGZyb20gZmlsZSBwYXRoIAorIHRoZSBzb3VyY2Ugcm9vdCBpcyBkZXRlcm1pbmVkIGJ5IAorKi8gCitzdGF0aWMgY2hhciAqX2RidXNfZmlsZV9wYXRoX2V4dHJhY3RfZWxlbWVudHNfZnJvbV90YWlsKGNvbnN0IGNoYXIgKmZpbGUsaW50IGxldmVsKQoreworICBpbnQgcHJlZml4ID0gMDsKKyAgY2hhciAqcCA9IChjaGFyICopZmlsZSArIHN0cmxlbihmaWxlKTsKKyAgaW50IGkgPSAwOworCisgIGZvciAoO3AgPj0gZmlsZTtwLS0pCisgICAgeworICAgICAgaWYgKERCVVNfSVNfRElSX1NFUEFSQVRPUigqcCkpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoKytpID49IGxldmVsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBwcmVmaXggPSBwLWZpbGUrMTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgfQorICAgIH0KKworICByZXR1cm4gKGNoYXIgKilmaWxlK3ByZWZpeDsKK30KKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiBkYnVzX2lzX3ZlcmJvc2UoKSBtYWNybyBpZiBidWlsdCB3aXRoIHZlcmJvc2UgbG9nZ2luZworICogZW5hYmxlZC4KKyAqIEByZXR1cm5zIHdoZXRoZXIgdmVyYm9zZSBsb2dnaW5nIGlzIGFjdGl2ZS4KKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2lzX3ZlcmJvc2VfcmVhbCAodm9pZCkKK3sKKyAgX2RidXNfdmVyYm9zZV9pbml0ICgpOworICByZXR1cm4gdmVyYm9zZTsKK30KKwordm9pZCBfZGJ1c19zZXRfdmVyYm9zZSAoZGJ1c19ib29sX3Qgc3RhdGUpCit7CisgICAgdmVyYm9zZSA9IHN0YXRlOworfQorCitkYnVzX2Jvb2xfdCBfZGJ1c19nZXRfdmVyYm9zZSAodm9pZCkKK3sKKyAgICByZXR1cm4gdmVyYm9zZTsKK30KKworLyoqCisgKiBQcmludHMgYSB3YXJuaW5nIG1lc3NhZ2UgdG8gc3RkZXJyCisgKiBpZiB0aGUgdXNlciBoYXMgZW5hYmxlZCB2ZXJib3NlIG1vZGUuCisgKiBUaGlzIGlzIHRoZSByZWFsIGZ1bmN0aW9uIGltcGxlbWVudGF0aW9uLAorICogdXNlIF9kYnVzX3ZlcmJvc2UoKSBtYWNybyBpbiBjb2RlLgorICoKKyAqIEBwYXJhbSBmb3JtYXQgcHJpbnRmLXN0eWxlIGZvcm1hdCBzdHJpbmcuCisgKi8KK3ZvaWQKK19kYnVzX3ZlcmJvc2VfcmVhbCAoCisjaWZkZWYgREJVU19DUFBfU1VQUE9SVFNfVkFSSUFCTEVfTUFDUk9fQVJHVU1FTlRTCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZpbGUsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBsaW5lLCAKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZnVuY3Rpb24sIAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgLi4uKQoreworICB2YV9saXN0IGFyZ3M7CisgIHN0YXRpYyBkYnVzX2Jvb2xfdCBuZWVkX3BpZCA9IFRSVUU7CisgIGludCBsZW47CisgIGxvbmcgc2VjLCB1c2VjOworICAKKyAgLyogdGhpbmdzIGFyZSB3cml0dGVuIGEgYml0IG9kZGx5IGhlcmUgc28gdGhhdAorICAgKiBpbiB0aGUgbm9uLXZlcmJvc2UgY2FzZSB3ZSBqdXN0IGhhdmUgdGhlIG9uZQorICAgKiBjb25kaXRpb25hbCBhbmQgcmV0dXJuIGltbWVkaWF0ZWx5LgorICAgKi8KKyAgaWYgKCFfZGJ1c19pc192ZXJib3NlX3JlYWwoKSkKKyAgICByZXR1cm47CisKKyNpZm5kZWYgREJVU19VU0VfT1VUUFVUX0RFQlVHX1NUUklORworICAvKiBQcmludCBvdXQgcGlkIGJlZm9yZSB0aGUgbGluZSAqLworICBpZiAobmVlZF9waWQpCisgICAgeworICAgICAgX2RidXNfcHJpbnRfdGhyZWFkICgpOworICAgIH0KKyAgX2RidXNfZ2V0X3JlYWxfdGltZSAoJnNlYywgJnVzZWMpOworICBmcHJpbnRmIChzdGRlcnIsICIlbGQuJTA2bGQgIiwgc2VjLCB1c2VjKTsKKyNlbmRpZgorCisgIC8qIE9ubHkgcHJpbnQgcGlkIGFnYWluIGlmIHRoZSBuZXh0IGxpbmUgaXMgYSBuZXcgbGluZSAqLworICBsZW4gPSBzdHJsZW4gKGZvcm1hdCk7CisgIGlmIChmb3JtYXRbbGVuLTFdID09ICdcbicpCisgICAgbmVlZF9waWQgPSBUUlVFOworICBlbHNlCisgICAgbmVlZF9waWQgPSBGQUxTRTsKKworICB2YV9zdGFydCAoYXJncywgZm9ybWF0KTsKKyNpZmRlZiBEQlVTX1VTRV9PVVRQVVRfREVCVUdfU1RSSU5HCisgIHsKKyAgY2hhciBidWZbMTAyNF07CisgIHN0cmNweShidWYsbW9kdWxlX25hbWUpOworI2lmZGVmIERCVVNfQ1BQX1NVUFBPUlRTX1ZBUklBQkxFX01BQ1JPX0FSR1VNRU5UUworICBzcHJpbnRmIChidWYrc3RybGVuKGJ1ZiksICJbJXMoJWQpOiVzXSAiLF9kYnVzX2ZpbGVfcGF0aF9leHRyYWN0X2VsZW1lbnRzX2Zyb21fdGFpbChmaWxlLDIpLGxpbmUsZnVuY3Rpb24pOworI2VuZGlmCisgIHZzcHJpbnRmIChidWYrc3RybGVuKGJ1ZiksZm9ybWF0LCBhcmdzKTsKKyAgdmFfZW5kIChhcmdzKTsKKyAgT3V0cHV0RGVidWdTdHJpbmdBKGJ1Zik7CisgIH0KKyNlbHNlCisjaWZkZWYgREJVU19DUFBfU1VQUE9SVFNfVkFSSUFCTEVfTUFDUk9fQVJHVU1FTlRTCisgIGZwcmludGYgKHN0ZGVyciwgIlslcyglZCk6JXNdICIsX2RidXNfZmlsZV9wYXRoX2V4dHJhY3RfZWxlbWVudHNfZnJvbV90YWlsKGZpbGUsMiksbGluZSxmdW5jdGlvbik7CisjZW5kaWYKKworICB2ZnByaW50ZiAoc3RkZXJyLCBmb3JtYXQsIGFyZ3MpOworICB2YV9lbmQgKGFyZ3MpOworCisgIGZmbHVzaCAoc3RkZXJyKTsKKyNlbmRpZgorfQorCisvKioKKyAqIFJlaW5pdGlhbGl6ZXMgdGhlIHZlcmJvc2UgbG9nZ2luZyBjb2RlLCB1c2VkCisgKiBhcyBhIGhhY2sgaW4gZGJ1cy1zcGF3bi5jIHNvIHRoYXQgYSBjaGlsZAorICogcHJvY2VzcyByZS1yZWFkcyBpdHMgcGlkCisgKgorICovCit2b2lkCitfZGJ1c192ZXJib3NlX3Jlc2V0X3JlYWwgKHZvaWQpCit7CisgIHZlcmJvc2VfaW5pdHRlZCA9IEZBTFNFOworfQorCit2b2lkCitfZGJ1c190cmFjZV9yZWYgKGNvbnN0IGNoYXIgKm9ial9uYW1lLAorICAgICAgICAgICAgICAgICB2b2lkICAgICAgICpvYmosCisgICAgICAgICAgICAgICAgIGludCAgICAgICAgIG9sZF9yZWZjb3VudCwKKyAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgbmV3X3JlZmNvdW50LAorICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp3aHksCisgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVudl92YXIsCisgICAgICAgICAgICAgICAgIGludCAgICAgICAgKmVuYWJsZWQpCit7CisgIF9kYnVzX2Fzc2VydCAob2JqX25hbWUgIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAob2JqICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKG9sZF9yZWZjb3VudCA+PSAtMSk7CisgIF9kYnVzX2Fzc2VydCAobmV3X3JlZmNvdW50ID49IC0xKTsKKworICBpZiAob2xkX3JlZmNvdW50ID09IC0xKQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydCAobmV3X3JlZmNvdW50ID09IC0xKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfZGJ1c19hc3NlcnQgKG5ld19yZWZjb3VudCA+PSAwKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAob2xkX3JlZmNvdW50ID49IDApOworICAgICAgX2RidXNfYXNzZXJ0IChvbGRfcmVmY291bnQgPiAwIHx8IG5ld19yZWZjb3VudCA+IDApOworICAgIH0KKworICBfZGJ1c19hc3NlcnQgKHdoeSAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChlbnZfdmFyICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKGVuYWJsZWQgIT0gTlVMTCk7CisKKyAgaWYgKCplbmFibGVkIDwgMCkKKyAgICB7CisgICAgICBjb25zdCBjaGFyICpzID0gX2RidXNfZ2V0ZW52IChlbnZfdmFyKTsKKworICAgICAgKmVuYWJsZWQgPSBGQUxTRTsKKworICAgICAgaWYgKHMgJiYgKnMpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoKnMgPT0gJzAnKQorICAgICAgICAgICAgKmVuYWJsZWQgPSBGQUxTRTsKKyAgICAgICAgICBlbHNlIGlmICgqcyA9PSAnMScpCisgICAgICAgICAgICAqZW5hYmxlZCA9IFRSVUU7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgX2RidXNfd2FybiAoIiVzIHNob3VsZCBiZSAwIG9yIDEgaWYgc2V0LCBub3QgJyVzJyIsIGVudl92YXIsIHMpOworICAgICAgICB9CisgICAgfQorCisgIGlmICgqZW5hYmxlZCkKKyAgICB7CisgICAgICBpZiAob2xkX3JlZmNvdW50ID09IC0xKQorICAgICAgICB7CisgICAgICAgICAgVkFMR1JJTkRfUFJJTlRGX0JBQ0tUUkFDRSAoIiVzICVwIHJlZiBzdG9sZW4gKCVzKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqX25hbWUsIG9iaiwgd2h5KTsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiJXMgJXAgcmVmIHN0b2xlbiAoJXMpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIG9ial9uYW1lLCBvYmosIHdoeSk7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIFZBTEdSSU5EX1BSSU5URl9CQUNLVFJBQ0UgKCIlcyAlcCAlZCAtPiAlZCByZWZzICglcykiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ial9uYW1lLCBvYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkX3JlZmNvdW50LCBuZXdfcmVmY291bnQsIHdoeSk7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiVzICVwICVkIC0+ICVkIHJlZnMgKCVzKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvYmpfbmFtZSwgb2JqLCBvbGRfcmVmY291bnQsIG5ld19yZWZjb3VudCwgd2h5KTsKKyAgICAgICAgfQorICAgIH0KK30KKworI2VuZGlmIC8qIERCVVNfRU5BQkxFX1ZFUkJPU0VfTU9ERSAqLworCisvKioKKyAqIER1cGxpY2F0ZXMgYSBzdHJpbmcuIFJlc3VsdCBtdXN0IGJlIGZyZWVkIHdpdGgKKyAqIGRidXNfZnJlZSgpLiBSZXR1cm5zICNOVUxMIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICogSWYgdGhlIHN0cmluZyB0byBiZSBkdXBsaWNhdGVkIGlzICNOVUxMLCByZXR1cm5zICNOVUxMLgorICogCisgKiBAcGFyYW0gc3RyIHN0cmluZyB0byBkdXBsaWNhdGUuCisgKiBAcmV0dXJucyBuZXdseS1hbGxvY2F0ZWQgY29weS4KKyAqLworY2hhcioKK19kYnVzX3N0cmR1cCAoY29uc3QgY2hhciAqc3RyKQoreworICBzaXplX3QgbGVuOworICBjaGFyICpjb3B5OworICAKKyAgaWYgKHN0ciA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworICAKKyAgbGVuID0gc3RybGVuIChzdHIpOworCisgIGNvcHkgPSBkYnVzX21hbGxvYyAobGVuICsgMSk7CisgIGlmIChjb3B5ID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgbWVtY3B5IChjb3B5LCBzdHIsIGxlbiArIDEpOworICAKKyAgcmV0dXJuIGNvcHk7Cit9CisKKy8qKgorICogRHVwbGljYXRlcyBhIGJsb2NrIG9mIG1lbW9yeS4gUmV0dXJucworICogI05VTEwgb24gZmFpbHVyZS4KKyAqCisgKiBAcGFyYW0gbWVtIG1lbW9yeSB0byBjb3B5CisgKiBAcGFyYW0gbl9ieXRlcyBudW1iZXIgb2YgYnl0ZXMgdG8gY29weQorICogQHJldHVybnMgdGhlIGNvcHkKKyAqLwordm9pZCoKK19kYnVzX21lbWR1cCAoY29uc3Qgdm9pZCAgKm1lbSwKKyAgICAgICAgICAgICAgc2l6ZV90ICAgICAgIG5fYnl0ZXMpCit7CisgIHZvaWQgKmNvcHk7CisKKyAgY29weSA9IGRidXNfbWFsbG9jIChuX2J5dGVzKTsKKyAgaWYgKGNvcHkgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBtZW1jcHkgKGNvcHksIG1lbSwgbl9ieXRlcyk7CisgIAorICByZXR1cm4gY29weTsKK30KKworLyoqCisgKiBEdXBsaWNhdGVzIGEgc3RyaW5nIGFycmF5LiBSZXN1bHQgbWF5IGJlIGZyZWVkIHdpdGgKKyAqIGRidXNfZnJlZV9zdHJpbmdfYXJyYXkoKS4gUmV0dXJucyAjTlVMTCBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAqIElmIHRoZSBhcnJheSB0byBiZSBkdXBsaWNhdGVkIGlzICNOVUxMLCByZXR1cm5zICNOVUxMLgorICogCisgKiBAcGFyYW0gYXJyYXkgYXJyYXkgdG8gZHVwbGljYXRlLgorICogQHJldHVybnMgbmV3bHktYWxsb2NhdGVkIGNvcHkuCisgKi8KK2NoYXIqKgorX2RidXNfZHVwX3N0cmluZ19hcnJheSAoY29uc3QgY2hhciAqKmFycmF5KQoreworICBpbnQgbGVuOworICBpbnQgaTsKKyAgY2hhciAqKmNvcHk7CisgIAorICBpZiAoYXJyYXkgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBmb3IgKGxlbiA9IDA7IGFycmF5W2xlbl0gIT0gTlVMTDsgKytsZW4pCisgICAgOworCisgIGNvcHkgPSBkYnVzX25ldzAgKGNoYXIqLCBsZW4gKyAxKTsKKyAgaWYgKGNvcHkgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBpID0gMDsKKyAgd2hpbGUgKGkgPCBsZW4pCisgICAgeworICAgICAgY29weVtpXSA9IF9kYnVzX3N0cmR1cCAoYXJyYXlbaV0pOworICAgICAgaWYgKGNvcHlbaV0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfZnJlZV9zdHJpbmdfYXJyYXkgKGNvcHkpOworICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgICsraTsKKyAgICB9CisKKyAgcmV0dXJuIGNvcHk7Cit9CisKKy8qKgorICogQ2hlY2tzIHdoZXRoZXIgYSBzdHJpbmcgYXJyYXkgY29udGFpbnMgdGhlIGdpdmVuIHN0cmluZy4KKyAqIAorICogQHBhcmFtIGFycmF5IGFycmF5IHRvIHNlYXJjaC4KKyAqIEBwYXJhbSBzdHIgc3RyaW5nIHRvIGxvb2sgZm9yCisgKiBAcmV0dXJucyAjVFJVRSBpZiBhcnJheSBjb250YWlucyBzdHJpbmcKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3N0cmluZ19hcnJheV9jb250YWlucyAoY29uc3QgY2hhciAqKmFycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAqc3RyKQoreworICBpbnQgaTsKKworICBpID0gMDsKKyAgd2hpbGUgKGFycmF5W2ldICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKHN0cmNtcCAoYXJyYXlbaV0sIHN0cikgPT0gMCkKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICArK2k7CisgICAgfQorCisgIHJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBSZXR1cm5zIHRoZSBzaXplIG9mIGEgc3RyaW5nIGFycmF5CisgKgorICogQHBhcmFtIGFycmF5IGFycmF5IHRvIHNlYXJjaC4KKyAqIEByZXR1cm5zIHNpemUgb2YgYXJyYXkKKyAqLworc2l6ZV90CitfZGJ1c19zdHJpbmdfYXJyYXlfbGVuZ3RoIChjb25zdCBjaGFyICoqYXJyYXkpCit7CisgIHNpemVfdCBpOworICBmb3IgKGkgPSAwOyBhcnJheVtpXTsgaSsrKSB7fQorICByZXR1cm4gaTsKK30KKworCisvKioKKyAqIEdlbmVyYXRlcyBhIG5ldyBVVUlELiBJZiB5b3UgY2hhbmdlIGhvdyB0aGlzIGlzIGRvbmUsCisgKiB0aGVyZSdzIHNvbWUgdGV4dCBhYm91dCBpdCBpbiB0aGUgc3BlYyB0aGF0IHNob3VsZCBhbHNvIGNoYW5nZS4KKyAqCisgKiBAcGFyYW0gdXVpZCB0aGUgdXVpZCB0byBpbml0aWFsaXplCisgKiBAcGFyYW0gZXJyb3IgbG9jYXRpb24gdG8gc3RvcmUgcmVhc29uIGZvciBmYWlsdXJlCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19nZW5lcmF0ZV91dWlkIChEQnVzR1VJRCAgKnV1aWQsCisgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgKmVycm9yKQoreworICBEQnVzRXJyb3IgcmFuZF9lcnJvcjsKKyAgbG9uZyBub3c7CisKKyAgZGJ1c19lcnJvcl9pbml0ICgmcmFuZF9lcnJvcik7CisKKyAgLyogZG9uJ3QgdXNlIG1vbm90b25pYyB0aW1lIGJlY2F1c2UgdGhlIFVVSUQgbWF5IGJlIHNhdmVkIHRvIGRpc2ssIGUuZy4KKyAgICogaXQgbWF5IHBlcnNpc3QgYWNyb3NzIHJlYm9vdHMKKyAgICovCisgIF9kYnVzX2dldF9yZWFsX3RpbWUgKCZub3csIE5VTEwpOworCisgIHV1aWQtPmFzX3VpbnQzMnNbREJVU19VVUlEX0xFTkdUSF9XT1JEUyAtIDFdID0gREJVU19VSU5UMzJfVE9fQkUgKG5vdyk7CisgIAorICBpZiAoIV9kYnVzX2dlbmVyYXRlX3JhbmRvbV9ieXRlc19idWZmZXIgKHV1aWQtPmFzX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVVVJRF9MRU5HVEhfQllURVMgLSA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyYW5kX2Vycm9yKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIHJhbmRfZXJyb3IubmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGdlbmVyYXRlIFVVSUQ6ICVzIiwgcmFuZF9lcnJvci5tZXNzYWdlKTsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJnJhbmRfZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBIZXgtZW5jb2RlIGEgVVVJRC4KKyAqCisgKiBAcGFyYW0gdXVpZCB0aGUgdXVpZAorICogQHBhcmFtIGVuY29kZWQgc3RyaW5nIHRvIGFwcGVuZCBoZXggdXVpZCB0bworICogQHJldHVybnMgI0ZBTFNFIGlmIG5vIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfdXVpZF9lbmNvZGUgKGNvbnN0IERCdXNHVUlEICp1dWlkLAorICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICplbmNvZGVkKQoreworICBEQnVzU3RyaW5nIGJpbmFyeTsKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3RfbGVuICgmYmluYXJ5LCB1dWlkLT5hc19ieXRlcywgREJVU19VVUlEX0xFTkdUSF9CWVRFUyk7CisgIHJldHVybiBfZGJ1c19zdHJpbmdfaGV4X2VuY29kZSAoJmJpbmFyeSwgMCwgZW5jb2RlZCwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGVuY29kZWQpKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitfZGJ1c19yZWFkX3V1aWRfZmlsZV93aXRob3V0X2NyZWF0aW5nIChjb25zdCBEQnVzU3RyaW5nICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNHVUlEICAgICAgICAgKnV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgREJ1c1N0cmluZyBjb250ZW50czsKKyAgREJ1c1N0cmluZyBkZWNvZGVkOworICBpbnQgZW5kOworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmNvbnRlbnRzKSkKKyAgICB7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZkZWNvZGVkKSkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmNvbnRlbnRzKTsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIAorICBpZiAoIV9kYnVzX2ZpbGVfZ2V0X2NvbnRlbnRzICgmY29udGVudHMsIGZpbGVuYW1lLCBlcnJvcikpCisgICAgZ290byBlcnJvcjsKKworICBfZGJ1c19zdHJpbmdfY2hvcF93aGl0ZSAoJmNvbnRlbnRzKTsKKworICBpZiAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZjb250ZW50cykgIT0gREJVU19VVUlEX0xFTkdUSF9IRVgpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0lOVkFMSURfRklMRV9DT05URU5ULAorICAgICAgICAgICAgICAgICAgICAgICJVVUlEIGZpbGUgJyVzJyBzaG91bGQgY29udGFpbiBhIGhleCBzdHJpbmcgb2YgbGVuZ3RoICVkLCBub3QgbGVuZ3RoICVkLCB3aXRoIG5vIG90aGVyIHRleHQiLAorICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoZmlsZW5hbWUpLAorICAgICAgICAgICAgICAgICAgICAgIERCVVNfVVVJRF9MRU5HVEhfSEVYLAorICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmY29udGVudHMpKTsKKyAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX2hleF9kZWNvZGUgKCZjb250ZW50cywgMCwgJmVuZCwgJmRlY29kZWQsIDApKQorICAgIHsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgIGlmIChlbmQgPT0gMCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfSU5WQUxJRF9GSUxFX0NPTlRFTlQsCisgICAgICAgICAgICAgICAgICAgICAgIlVVSUQgZmlsZSAnJXMnIGNvbnRhaW5zIGludmFsaWQgaGV4IGRhdGEiLAorICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoZmlsZW5hbWUpKTsKKyAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmRlY29kZWQpICE9IERCVVNfVVVJRF9MRU5HVEhfQllURVMpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0lOVkFMSURfRklMRV9DT05URU5ULAorICAgICAgICAgICAgICAgICAgICAgICJVVUlEIGZpbGUgJyVzJyBjb250YWlucyAlZCBieXRlcyBvZiBoZXgtZW5jb2RlZCBkYXRhIGluc3RlYWQgb2YgJWQiLAorICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoZmlsZW5hbWUpLAorICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmZGVjb2RlZCksCisgICAgICAgICAgICAgICAgICAgICAgREJVU19VVUlEX0xFTkdUSF9CWVRFUyk7CisgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICBfZGJ1c19zdHJpbmdfY29weV90b19idWZmZXIgKCZkZWNvZGVkLCB1dWlkLT5hc19ieXRlcywgREJVU19VVUlEX0xFTkdUSF9CWVRFUyk7CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZkZWNvZGVkKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZjb250ZW50cyk7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgcmV0dXJuIFRSVUU7CisgIAorIGVycm9yOgorICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmY29udGVudHMpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmRlY29kZWQpOworICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKgorICogV3JpdGUgdGhlIGdpdmUgVVVJRCB0byBhIGZpbGUuCisgKgorICogQHBhcmFtIGZpbGVuYW1lIHRoZSBmaWxlIHRvIHdyaXRlCisgKiBAcGFyYW0gdXVpZCB0aGUgVVVJRCB0byBzYXZlCisgKiBAcGFyYW0gZXJyb3IgdXNlZCB0byByYWlzZSBhbiBlcnJvcgorICogQHJldHVybnMgI0ZBTFNFIG9uIGVycm9yCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c193cml0ZV91dWlkX2ZpbGUgKGNvbnN0IERCdXNTdHJpbmcgKmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzR1VJRCAgICp1dWlkLAorICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgREJ1c1N0cmluZyBlbmNvZGVkOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZlbmNvZGVkKSkKKyAgICB7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAKKyAgaWYgKCFfZGJ1c191dWlkX2VuY29kZSAodXVpZCwgJmVuY29kZWQpKQorICAgIHsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX2J5dGUgKCZlbmNvZGVkLCAnXG4nKSkKKyAgICB7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgCisgIGlmICghX2RidXNfc3RyaW5nX3NhdmVfdG9fZmlsZSAoJmVuY29kZWQsIGZpbGVuYW1lLCBUUlVFLCBlcnJvcikpCisgICAgZ290byBlcnJvcjsKKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmVuY29kZWQpOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworICByZXR1cm4gVFJVRTsKKyAgCisgZXJyb3I6CisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZlbmNvZGVkKTsKKyAgcmV0dXJuIEZBTFNFOyAgICAgICAgCit9CisKKy8qKgorICogUmVhZHMgKGFuZCBvcHRpb25hbGx5IHdyaXRlcykgYSB1dWlkIHRvIGEgZmlsZS4gSW5pdGlhbGl6ZXMgdGhlIHV1aWQKKyAqIHVubGVzcyBhbiBlcnJvciBpcyByZXR1cm5lZC4KKyAqCisgKiBAcGFyYW0gZmlsZW5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpbGUKKyAqIEBwYXJhbSB1dWlkIHV1aWQgdG8gYmUgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgbG9hZGVkIHV1aWQKKyAqIEBwYXJhbSBjcmVhdGVfaWZfbm90X2ZvdW5kICNUUlVFIHRvIGNyZWF0ZSBhIG5ldyB1dWlkIGFuZCBzYXZlIGl0IGlmIHRoZSBmaWxlIGRvZXNuJ3QgZXhpc3QKKyAqIEBwYXJhbSBlcnJvciB0aGUgZXJyb3IgcmV0dXJuCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgdGhlIGVycm9yIGlzIHNldAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfcmVhZF91dWlkX2ZpbGUgKGNvbnN0IERCdXNTdHJpbmcgKmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgIERCdXNHVUlEICAgICAgICAgKnV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgY3JlYXRlX2lmX25vdF9mb3VuZCwKKyAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgREJ1c0Vycm9yIHJlYWRfZXJyb3IgPSBEQlVTX0VSUk9SX0lOSVQ7CisKKyAgaWYgKF9kYnVzX3JlYWRfdXVpZF9maWxlX3dpdGhvdXRfY3JlYXRpbmcgKGZpbGVuYW1lLCB1dWlkLCAmcmVhZF9lcnJvcikpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgaWYgKCFjcmVhdGVfaWZfbm90X2ZvdW5kKQorICAgIHsKKyAgICAgIGRidXNfbW92ZV9lcnJvciAoJnJlYWRfZXJyb3IsIGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgLyogSWYgdGhlIGZpbGUgZXhpc3RzIGFuZCBjb250YWlucyBqdW5rLCB3ZSB3YW50IHRvIGtlZXAgdGhhdCBlcnJvcgorICAgKiBtZXNzYWdlIGluc3RlYWQgb2Ygb3ZlcndyaXRpbmcgaXQgd2l0aCBhICJmaWxlIGV4aXN0cyIgZXJyb3IKKyAgICogbWVzc2FnZSB3aGVuIHdlIHRyeSB0byB3cml0ZQorICAgKi8KKyAgaWYgKGRidXNfZXJyb3JfaGFzX25hbWUgKCZyZWFkX2Vycm9yLCBEQlVTX0VSUk9SX0lOVkFMSURfRklMRV9DT05URU5UKSkKKyAgICB7CisgICAgICBkYnVzX21vdmVfZXJyb3IgKCZyZWFkX2Vycm9yLCBlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmcmVhZF9lcnJvcik7CisKKyAgICAgIGlmICghX2RidXNfZ2VuZXJhdGVfdXVpZCAodXVpZCwgZXJyb3IpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIHJldHVybiBfZGJ1c193cml0ZV91dWlkX2ZpbGUgKGZpbGVuYW1lLCB1dWlkLCBlcnJvcik7CisgICAgfQorfQorCisvKiBQcm90ZWN0ZWQgYnkgX0RCVVNfTE9DSyAobWFjaGluZV91dWlkKSAqLworc3RhdGljIGludCBtYWNoaW5lX3V1aWRfaW5pdGlhbGl6ZWRfZ2VuZXJhdGlvbiA9IDA7CitzdGF0aWMgREJ1c0dVSUQgbWFjaGluZV91dWlkOworCisvKioKKyAqIEdldHMgdGhlIGhleC1lbmNvZGVkIFVVSUQgb2YgdGhlIG1hY2hpbmUgdGhpcyBmdW5jdGlvbiBpcworICogZXhlY3V0ZWQgb24uIFRoaXMgVVVJRCBpcyBndWFyYW50ZWVkIHRvIGJlIHRoZSBzYW1lIGZvciBhIGdpdmVuCisgKiBtYWNoaW5lIGF0IGxlYXN0IHVudGlsIGl0IG5leHQgcmVib290cywgdGhvdWdoIGl0IGFsc28KKyAqIG1ha2VzIHNvbWUgZWZmb3J0IHRvIGJlIHRoZSBzYW1lIGZvcmV2ZXIsIGl0IG1heSBjaGFuZ2UgaWYgdGhlCisgKiBtYWNoaW5lIGlzIHJlY29uZmlndXJlZCBvciBpdHMgaGFyZHdhcmUgaXMgbW9kaWZpZWQuCisgKiAKKyAqIEBwYXJhbSB1dWlkX3N0ciBzdHJpbmcgdG8gYXBwZW5kIGhleC1lbmNvZGVkIG1hY2hpbmUgdXVpZCB0bworICogQHBhcmFtIGVycm9yIGxvY2F0aW9uIHRvIHN0b3JlIHJlYXNvbiBmb3IgZmFpbHVyZQorICogQHJldHVybnMgI1RSVUUgaWYgc3VjY2Vzc2Z1bAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfZ2V0X2xvY2FsX21hY2hpbmVfdXVpZF9lbmNvZGVkIChEQnVzU3RyaW5nICp1dWlkX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAqZXJyb3IpCit7CisgIGRidXNfYm9vbF90IG9rID0gVFJVRTsKKyAgCisgIGlmICghX0RCVVNfTE9DSyAobWFjaGluZV91dWlkKSkKKyAgICB7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmIChtYWNoaW5lX3V1aWRfaW5pdGlhbGl6ZWRfZ2VuZXJhdGlvbiAhPSBfZGJ1c19jdXJyZW50X2dlbmVyYXRpb24pCisgICAgeworICAgICAgaWYgKCFfZGJ1c19yZWFkX2xvY2FsX21hY2hpbmVfdXVpZCAoJm1hY2hpbmVfdXVpZCwgRkFMU0UsIGVycm9yKSkKKyAgICAgICAgb2sgPSBGQUxTRTsKKyAgICB9CisKKyAgaWYgKG9rKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfdXVpZF9lbmNvZGUgKCZtYWNoaW5lX3V1aWQsIHV1aWRfc3RyKSkKKyAgICAgICAgeworICAgICAgICAgIG9rID0gRkFMU0U7CisgICAgICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICB9CisgICAgfQorCisgIF9EQlVTX1VOTE9DSyAobWFjaGluZV91dWlkKTsKKworICByZXR1cm4gb2s7Cit9CisKKyNpZm5kZWYgREJVU19ESVNBQkxFX0NIRUNLUwordm9pZAorX2RidXNfd2Fybl9yZXR1cm5faWZfZmFpbCAoY29uc3QgY2hhciAqZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICphc3NlcnRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmUpCit7CisgIF9kYnVzX3dhcm5fY2hlY2tfZmFpbGVkICgKKyAgICAgICJhcmd1bWVudHMgdG8gJXMoKSB3ZXJlIGluY29ycmVjdCwgYXNzZXJ0aW9uIFwiJXNcIiBmYWlsZWQgaW4gZmlsZSAlcyBsaW5lICVkLlxuIgorICAgICAgIlRoaXMgaXMgbm9ybWFsbHkgYSBidWcgaW4gc29tZSBhcHBsaWNhdGlvbiB1c2luZyB0aGUgRC1CdXMgbGlicmFyeS5cbiIsCisgICAgICBmdW5jdGlvbiwgYXNzZXJ0aW9uLCBmaWxlLCBsaW5lKTsKK30KKyNlbmRpZgorCisjaWZuZGVmIERCVVNfRElTQUJMRV9BU1NFUlQKKy8qKgorICogSW50ZXJuYWxzIG9mIF9kYnVzX2Fzc2VydCgpOyBpdCdzIGEgZnVuY3Rpb24KKyAqIHJhdGhlciB0aGFuIGEgbWFjcm8gd2l0aCB0aGUgaW5saW5lIGNvZGUgc28KKyAqIHRoYXQgdGhlIGFzc2VydGlvbiBmYWlsdXJlIGJsb2NrcyBkb24ndCBzaG93IHVwCisgKiBpbiB0ZXN0IHN1aXRlIGNvdmVyYWdlLCBhbmQgdG8gc2hyaW5rIGNvZGUgc2l6ZS4KKyAqCisgKiBAcGFyYW0gY29uZGl0aW9uIFRSVUUgaWYgYXNzZXJ0aW9uIHN1Y2NlZWRlZAorICogQHBhcmFtIGNvbmRpdGlvbl90ZXh0IGNvbmRpdGlvbiBhcyBhIHN0cmluZworICogQHBhcmFtIGZpbGUgZmlsZSB0aGUgYXNzZXJ0aW9uIGlzIGluCisgKiBAcGFyYW0gbGluZSBsaW5lIHRoZSBhc3NlcnRpb24gaXMgaW4KKyAqIEBwYXJhbSBmdW5jIGZ1bmN0aW9uIHRoZSBhc3NlcnRpb24gaXMgaW4KKyAqLwordm9pZAorX2RidXNfcmVhbF9hc3NlcnQgKGRidXNfYm9vbF90ICBjb25kaXRpb24sCisgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgKmNvbmRpdGlvbl90ZXh0LAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICpmaWxlLAorICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICBsaW5lLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICpmdW5jKQoreworICBpZiAoX0RCVVNfVU5MSUtFTFkgKCFjb25kaXRpb24pKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJhc3NlcnRpb24gZmFpbGVkIFwiJXNcIiBmaWxlIFwiJXNcIiBsaW5lICVkIGZ1bmN0aW9uICVzIiwKKyAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbl90ZXh0LCBmaWxlLCBsaW5lLCBmdW5jKTsKKyAgICAgIF9kYnVzX2Fib3J0ICgpOworICAgIH0KK30KKworLyoqCisgKiBJbnRlcm5hbHMgb2YgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkKCk7IGl0J3MgYSBmdW5jdGlvbgorICogcmF0aGVyIHRoYW4gYSBtYWNybyB3aXRoIHRoZSBpbmxpbmUgY29kZSBzbworICogdGhhdCB0aGUgYXNzZXJ0aW9uIGZhaWx1cmUgYmxvY2tzIGRvbid0IHNob3cgdXAKKyAqIGluIHRlc3Qgc3VpdGUgY292ZXJhZ2UsIGFuZCB0byBzaHJpbmsgY29kZSBzaXplLgorICoKKyAqIEBwYXJhbSBleHBsYW5hdGlvbiB3aGF0IHdhcyByZWFjaGVkIHRoYXQgc2hvdWxkbid0IGhhdmUgYmVlbgorICogQHBhcmFtIGZpbGUgZmlsZSB0aGUgYXNzZXJ0aW9uIGlzIGluCisgKiBAcGFyYW0gbGluZSBsaW5lIHRoZSBhc3NlcnRpb24gaXMgaW4KKyAqLwordm9pZAorX2RidXNfcmVhbF9hc3NlcnRfbm90X3JlYWNoZWQgKGNvbnN0IGNoYXIgKmV4cGxhbmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgbGluZSkKK3sKKyAgX2RidXNfd2FybiAoIkZpbGUgXCIlc1wiIGxpbmUgJWQgc2hvdWxkIG5vdCBoYXZlIGJlZW4gcmVhY2hlZDogJXMiLAorICAgICAgICAgICAgICBmaWxlLCBsaW5lLCBleHBsYW5hdGlvbik7CisgIF9kYnVzX2Fib3J0ICgpOworfQorI2VuZGlmIC8qIERCVVNfRElTQUJMRV9BU1NFUlQgKi8KKyAgCisjaWZkZWYgREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMKK3N0YXRpYyBkYnVzX2Jvb2xfdAorcnVuX2ZhaWxpbmdfZWFjaF9tYWxsb2MgKGludCAgICAgICAgICAgICAgICAgICAgbl9tYWxsb2NzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICAgICAqZGVzY3JpcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1Rlc3RNZW1vcnlGdW5jdGlvbiBmdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAqZGF0YSkKK3sKKyAgbl9tYWxsb2NzICs9IDEwOyAvKiBmdWRnZSBmYWN0b3IgdG8gZW5zdXJlIHJlYWxsb2NzIGV0Yy4gYXJlIGNvdmVyZWQgKi8KKyAgCisgIHdoaWxlIChuX21hbGxvY3MgPj0gMCkKKyAgICB7ICAgICAgCisgICAgICBfZGJ1c19zZXRfZmFpbF9hbGxvY19jb3VudGVyIChuX21hbGxvY3MpOworCisgICAgICBfZGJ1c192ZXJib3NlICgiXG49PT1cbiVzOiAod2lsbCBmYWlsIG1hbGxvYyAlZCB3aXRoICVkIGZhaWx1cmVzKVxuPT09XG4iLAorICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24sIG5fbWFsbG9jcywKKyAgICAgICAgICAgICAgICAgICAgIF9kYnVzX2dldF9mYWlsX2FsbG9jX2ZhaWx1cmVzICgpKTsKKworICAgICAgaWYgKCEoKiBmdW5jKSAoZGF0YSkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIAorICAgICAgbl9tYWxsb2NzIC09IDE7CisgICAgfQorCisgIF9kYnVzX3NldF9mYWlsX2FsbG9jX2NvdW50ZXIgKF9EQlVTX0lOVF9NQVgpOworCisgIHJldHVybiBUUlVFOworfSAgICAgICAgICAgICAgICAgICAgICAgIAorCisvKioKKyAqIFRlc3RzIGhvdyB3ZWxsIHRoZSBnaXZlbiBmdW5jdGlvbiByZXNwb25kcyB0byBvdXQtb2YtbWVtb3J5CisgKiBzaXR1YXRpb25zLiBDYWxscyB0aGUgZnVuY3Rpb24gcmVwZWF0ZWRseSwgZmFpbGluZyBhIGRpZmZlcmVudAorICogY2FsbCB0byBtYWxsb2MoKSBlYWNoIHRpbWUuIElmIHRoZSBmdW5jdGlvbiBldmVyIHJldHVybnMgI0ZBTFNFLAorICogdGhlIHRlc3QgZmFpbHMuIFRoZSBmdW5jdGlvbiBzaG91bGQgcmV0dXJuICNUUlVFIHdoZW5ldmVyIHNvbWV0aGluZworICogdmFsaWQgKHN1Y2ggYXMgcmV0dXJuaW5nIGFuIGVycm9yLCBvciBzdWNjZWVkaW5nKSBvY2N1cnMsIGFuZCAjRkFMU0UKKyAqIGlmIGl0IGdldHMgY29uZnVzZWQgaW4gc29tZSB3YXkuCisgKgorICogQHBhcmFtIGRlc2NyaXB0aW9uIGRlc2NyaXB0aW9uIG9mIHRoZSB0ZXN0IHVzZWQgaW4gdmVyYm9zZSBvdXRwdXQKKyAqIEBwYXJhbSBmdW5jIGZ1bmN0aW9uIHRvIGNhbGwKKyAqIEBwYXJhbSBkYXRhIGRhdGEgdG8gcGFzcyB0byBmdW5jdGlvbgorICogQHJldHVybnMgI1RSVUUgaWYgdGhlIGZ1bmN0aW9uIG5ldmVyIHJldHVybnMgRkFMU0UKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3Rlc3Rfb29tX2hhbmRsaW5nIChjb25zdCBjaGFyICAgICAgICAgICAgICpkZXNjcmlwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVGVzdE1lbW9yeUZ1bmN0aW9uICBmdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgKmRhdGEpCit7CisgIGludCBhcHByb3hfbWFsbG9jczsKKyAgY29uc3QgY2hhciAqc2V0dGluZzsKKyAgaW50IG1heF9mYWlsdXJlc190b190cnk7CisgIGludCBpOworCisgIC8qIFJ1biBvbmNlIHRvIHNlZSBhYm91dCBob3cgbWFueSBtYWxsb2NzIGFyZSBpbnZvbHZlZCAqLworICAKKyAgX2RidXNfc2V0X2ZhaWxfYWxsb2NfY291bnRlciAoX0RCVVNfSU5UX01BWCk7CisKKyAgX2RidXNfdmVyYm9zZSAoIlJ1bm5pbmcgb25jZSB0byBjb3VudCBtYWxsb2NzXG4iKTsKKyAgCisgIGlmICghKCogZnVuYykgKGRhdGEpKQorICAgIHJldHVybiBGQUxTRTsKKyAgCisgIGFwcHJveF9tYWxsb2NzID0gX0RCVVNfSU5UX01BWCAtIF9kYnVzX2dldF9mYWlsX2FsbG9jX2NvdW50ZXIgKCk7CisKKyAgX2RidXNfdmVyYm9zZSAoIlxuPT09PT09PT09PT09PT09PT1cbiVzOiBhYm91dCAlZCBtYWxsb2NzIHRvdGFsXG49PT09PT09PT09PT09PT09PVxuIiwKKyAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24sIGFwcHJveF9tYWxsb2NzKTsKKworICBzZXR0aW5nID0gX2RidXNfZ2V0ZW52ICgiREJVU19URVNUX01BTExPQ19GQUlMVVJFUyIpOworICBpZiAoc2V0dGluZyAhPSBOVUxMKQorICAgIHsKKyAgICAgIERCdXNTdHJpbmcgc3RyOworICAgICAgbG9uZyB2OworICAgICAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZzdHIsIHNldHRpbmcpOworICAgICAgdiA9IDQ7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19wYXJzZV9pbnQgKCZzdHIsIDAsICZ2LCBOVUxMKSkKKyAgICAgICAgX2RidXNfd2FybiAoImNvdWxkbid0IHBhcnNlICclcycgYXMgaW50ZWdlclxuIiwgc2V0dGluZyk7CisgICAgICBtYXhfZmFpbHVyZXNfdG9fdHJ5ID0gdjsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBtYXhfZmFpbHVyZXNfdG9fdHJ5ID0gNDsKKyAgICB9CisKKyAgaWYgKG1heF9mYWlsdXJlc190b190cnkgPCAxKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJub3QgdGVzdGluZyBPT00gaGFuZGxpbmdcbiIpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGkgPSBzZXR0aW5nID8gbWF4X2ZhaWx1cmVzX3RvX3RyeSAtIDEgOiAxOworICB3aGlsZSAoaSA8IG1heF9mYWlsdXJlc190b190cnkpCisgICAgeworICAgICAgX2RidXNfc2V0X2ZhaWxfYWxsb2NfZmFpbHVyZXMgKGkpOworICAgICAgaWYgKCFydW5fZmFpbGluZ19lYWNoX21hbGxvYyAoYXBwcm94X21hbGxvY3MsIGRlc2NyaXB0aW9uLCBmdW5jLCBkYXRhKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgKytpOworICAgIH0KKyAgCisgIF9kYnVzX3ZlcmJvc2UgKCJcbj09PT09PT09PT09PT09PT09XG4lczogYWxsIGl0ZXJhdGlvbnMgcGFzc2VkXG49PT09PT09PT09PT09PT09PVxuIiwKKyAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24pOworCisgIHJldHVybiBUUlVFOworfQorI2VuZGlmIC8qIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTICovCisKKy8qKiBAfSAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLWludGVybmFscy5oIGIvZGJ1cy9kYnVzLWludGVybmFscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3NjQ5ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtaW50ZXJuYWxzLmgKQEAgLTAsMCArMSw0MjcgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1pbnRlcm5hbHMuaCAgcmFuZG9tIHV0aWxpdHkgc3R1ZmYgKGludGVybmFsIHRvIEQtQnVzIGltcGxlbWVudGF0aW9uKQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMyAgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworI2lmZGVmIERCVVNfSU5TSURFX0RCVVNfSAorI2Vycm9yICJZb3UgY2FuJ3QgaW5jbHVkZSBkYnVzLWludGVybmFscy5oIGluIHRoZSBwdWJsaWMgaGVhZGVyIGRidXMuaCIKKyNlbmRpZgorCisjaWZuZGVmIERCVVNfSU5URVJOQUxTX0gKKyNkZWZpbmUgREJVU19JTlRFUk5BTFNfSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLW1lbW9yeS5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy10eXBlcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1lcnJvcnMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc3lzZGVwcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy10aHJlYWRzLWludGVybmFsLmg+CisKK0RCVVNfQkVHSU5fREVDTFMKKworREJVU19QUklWQVRFX0VYUE9SVAordm9pZCBfZGJ1c193YXJuICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4pIF9EQlVTX0dOVUNfUFJJTlRGICgxLCAyKTsKKworREJVU19QUklWQVRFX0VYUE9SVAordm9pZCBfZGJ1c193YXJuX2NoZWNrX2ZhaWxlZCAgKGNvbnN0IGNoYXIgKmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4pIF9EQlVTX0dOVUNfUFJJTlRGICgxLCAyKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK3ZvaWQgX2RidXNfd2Fybl9yZXR1cm5faWZfZmFpbCAoY29uc3QgY2hhciAqZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFzc2VydGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmUpOworCisjaWYgZGVmaW5lZCAoX19TVERDX1ZFUlNJT05fXykgJiYgKF9fU1REQ19WRVJTSU9OX18gPj0gMTk5OTAxTCkKKyNkZWZpbmUgX0RCVVNfRlVOQ1RJT05fTkFNRSBfX2Z1bmNfXworI2VsaWYgZGVmaW5lZChfX0dOVUNfXykgfHwgZGVmaW5lZChfTVNDX1ZFUikKKyNkZWZpbmUgX0RCVVNfRlVOQ1RJT05fTkFNRSBfX0ZVTkNUSU9OX18KKyNlbHNlCisjZGVmaW5lIF9EQlVTX0ZVTkNUSU9OX05BTUUgInVua25vd24gZnVuY3Rpb24iCisjZW5kaWYKKworLyoKKyAqIChjb2RlIGZyb20gR0xpYikKKyAqIAorICogVGhlIF9EQlVTX0xJS0VMWSBhbmQgX0RCVVNfVU5MSUtFTFkgbWFjcm9zIGxldCB0aGUgcHJvZ3JhbW1lciBnaXZlIGhpbnRzIHRvIAorICogdGhlIGNvbXBpbGVyIGFib3V0IHRoZSBleHBlY3RlZCByZXN1bHQgb2YgYW4gZXhwcmVzc2lvbi4gU29tZSBjb21waWxlcnMKKyAqIGNhbiB1c2UgdGhpcyBpbmZvcm1hdGlvbiBmb3Igb3B0aW1pemF0aW9ucy4KKyAqCisgKiBUaGUgX0RCVVNfQk9PTEVBTl9FWFBSIG1hY3JvIGlzIGludGVuZGVkIHRvIHRyaWdnZXIgYSBnY2Mgd2FybmluZyB3aGVuCisgKiBwdXR0aW5nIGFzc2lnbm1lbnRzIGluIHRoZSBtYWNybyBhcmcKKyAqLworI2lmIGRlZmluZWQoX19HTlVDX18pICYmIChfX0dOVUNfXyA+IDIpICYmIGRlZmluZWQoX19PUFRJTUlaRV9fKQorI2RlZmluZSBfREJVU19CT09MRUFOX0VYUFIoZXhwcikgICAgICAgICAgICAgICAgXAorIF9fZXh0ZW5zaW9uX18gKHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgaW50IF9kYnVzX2Jvb2xlYW5fdmFyXzsgICAgICAgICAgICAgICAgICAgICAgXAorICAgaWYgKGV4cHIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgX2RidXNfYm9vbGVhbl92YXJfID0gMTsgICAgICAgICAgICAgICAgICAgXAorICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgX2RidXNfYm9vbGVhbl92YXJfID0gMDsgICAgICAgICAgICAgICAgICAgXAorICAgX2RidXNfYm9vbGVhbl92YXJfOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSkKKyNkZWZpbmUgX0RCVVNfTElLRUxZKGV4cHIpIChfX2J1aWx0aW5fZXhwZWN0IChfREJVU19CT09MRUFOX0VYUFIoZXhwciksIDEpKQorI2RlZmluZSBfREJVU19VTkxJS0VMWShleHByKSAoX19idWlsdGluX2V4cGVjdCAoX0RCVVNfQk9PTEVBTl9FWFBSKGV4cHIpLCAwKSkKKyNlbHNlCisjZGVmaW5lIF9EQlVTX0xJS0VMWShleHByKSAoZXhwcikKKyNkZWZpbmUgX0RCVVNfVU5MSUtFTFkoZXhwcikgKGV4cHIpCisjZW5kaWYKKworI2lmZGVmIERCVVNfRU5BQkxFX1ZFUkJPU0VfTU9ERQorCisvKgorIGF0IGxlYXN0IGdudSBjYyBhbmQgbXN2YyBjb21waWxlciBhcmUga25vd24gdG8gCisgaGF2ZSBzdXBwb3J0IGZvciB2YXJpYWJsZSBtYWNybyBhcmd1bWVudCBsaXN0cworIGFkZCBvdGhlciBjb21waWxlcnMgaXMgcmVxdWlyZWQKKyovCisjaWYgZGVmaW5lZChfX0dOVUNfXykgfHwgZGVmaW5lZChfTVNDX1ZFUikgCisjZGVmaW5lIERCVVNfQ1BQX1NVUFBPUlRTX1ZBUklBQkxFX01BQ1JPX0FSR1VNRU5UUworI2VuZGlmCisKKyNpZmRlZiBEQlVTX0NQUF9TVVBQT1JUU19WQVJJQUJMRV9NQUNST19BUkdVTUVOVFMKK0RCVVNfUFJJVkFURV9FWFBPUlQKK3ZvaWQgX2RidXNfdmVyYm9zZV9yZWFsICAgICAgIChjb25zdCBjaGFyICpmaWxlLCBjb25zdCBpbnQgbGluZSwgY29uc3QgY2hhciAqZnVuY3Rpb24sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZvcm1hdCwuLi4pIF9EQlVTX0dOVUNfUFJJTlRGICg0LCA1KTsKKyMgIGRlZmluZSBfZGJ1c192ZXJib3NlKGZtdCwuLi4pIF9kYnVzX3ZlcmJvc2VfcmVhbCggX19GSUxFX18sX19MSU5FX18sX19GVU5DVElPTl9fLGZtdCwgIyMgX19WQV9BUkdTX18pCisjZWxzZQorREJVU19QUklWQVRFX0VYUE9SVAordm9pZCBfZGJ1c192ZXJib3NlX3JlYWwgICAgICAgKGNvbnN0IGNoYXIgKmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4pIF9EQlVTX0dOVUNfUFJJTlRGICgxLCAyKTsKKyMgIGRlZmluZSBfZGJ1c192ZXJib3NlIF9kYnVzX3ZlcmJvc2VfcmVhbAorI2VuZGlmCitEQlVTX1BSSVZBVEVfRVhQT1JUCit2b2lkIF9kYnVzX3ZlcmJvc2VfcmVzZXRfcmVhbCAodm9pZCk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCBfZGJ1c19pc192ZXJib3NlX3JlYWwgKHZvaWQpOworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgX2RidXNfZ2V0X3ZlcmJvc2UgKHZvaWQpOworREJVU19QUklWQVRFX0VYUE9SVAordm9pZCBfZGJ1c19zZXRfdmVyYm9zZSAoZGJ1c19ib29sX3Qgc3RhdGUpOworCisjICBkZWZpbmUgX2RidXNfdmVyYm9zZV9yZXNldCBfZGJ1c192ZXJib3NlX3Jlc2V0X3JlYWwKKyMgIGRlZmluZSBfZGJ1c19pc192ZXJib3NlIF9kYnVzX2lzX3ZlcmJvc2VfcmVhbAorI2Vsc2UKKyMgIGlmZGVmIEhBVkVfSVNPX1ZBUkFSR1MKKyMgICAgZGVmaW5lIF9kYnVzX3ZlcmJvc2UoLi4uKSBkbyB7IH0gd2hpbGUgKDApCisjICBlbGlmIGRlZmluZWQgKEhBVkVfR05VQ19WQVJBUkdTKQorIyAgICBkZWZpbmUgX2RidXNfdmVyYm9zZShmb3JtYXQuLi4pIGRvIHsgfSB3aGlsZSAoMCkKKyMgIGVsc2UKK3N0YXRpYyB2b2lkIF9kYnVzX3ZlcmJvc2UoY29uc3QgY2hhciAqIHgsLi4uKSB7O30KKyMgIGVuZGlmCisjICBkZWZpbmUgX2RidXNfdmVyYm9zZV9yZXNldCgpIGRvIHsgfSB3aGlsZSAoMCkKKyMgIGRlZmluZSBfZGJ1c19pc192ZXJib3NlKCkgRkFMU0UgCisjZW5kaWYgLyogIURCVVNfRU5BQkxFX1ZFUkJPU0VfTU9ERSAqLworCitEQlVTX1BSSVZBVEVfRVhQT1JUCit2b2lkIF9kYnVzX3RyYWNlX3JlZiAoY29uc3QgY2hhciAqb2JqX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAqb2JqLAorICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIG9sZF9yZWZjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICBuZXdfcmVmY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqd2h5LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVudl92YXIsCisgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAqZW5hYmxlZCk7CisKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2NvbnN0IGNoYXIqIF9kYnVzX3N0cmVycm9yIChpbnQgZXJyb3JfbnVtYmVyKTsKKworI2lmZGVmIERCVVNfRElTQUJMRV9BU1NFUlQKKyNkZWZpbmUgX2RidXNfYXNzZXJ0KGNvbmRpdGlvbikgZG8geyB9IHdoaWxlICgwKQorI2Vsc2UKK0RCVVNfUFJJVkFURV9FWFBPUlQKK3ZvaWQgX2RidXNfcmVhbF9hc3NlcnQgKGRidXNfYm9vbF90ICBjb25kaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAqY29uZGl0aW9uX3RleHQsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAqZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICBsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgKmZ1bmMpOworI2RlZmluZSBfZGJ1c19hc3NlcnQoY29uZGl0aW9uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfZGJ1c19yZWFsX2Fzc2VydCAoKGNvbmRpdGlvbikgIT0gMCwgI2NvbmRpdGlvbiwgX19GSUxFX18sIF9fTElORV9fLCBfREJVU19GVU5DVElPTl9OQU1FKQorI2VuZGlmIC8qICFEQlVTX0RJU0FCTEVfQVNTRVJUICovCisKKyNpZmRlZiBEQlVTX0RJU0FCTEVfQVNTRVJUCisjZGVmaW5lIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZChleHBsYW5hdGlvbikgZG8geyB9IHdoaWxlICgwKQorI2Vsc2UKK0RCVVNfUFJJVkFURV9FWFBPUlQKK3ZvaWQgX2RidXNfcmVhbF9hc3NlcnRfbm90X3JlYWNoZWQgKGNvbnN0IGNoYXIgKmV4cGxhbmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIGxpbmUpIF9EQlVTX0dOVUNfTk9SRVRVUk47CisjZGVmaW5lIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZChleHBsYW5hdGlvbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX2RidXNfcmVhbF9hc3NlcnRfbm90X3JlYWNoZWQgKGV4cGxhbmF0aW9uLCBfX0ZJTEVfXywgX19MSU5FX18pCisjZW5kaWYgLyogIURCVVNfRElTQUJMRV9BU1NFUlQgKi8KKworI2lmZGVmIERCVVNfRElTQUJMRV9DSEVDS1MKKyNkZWZpbmUgX2RidXNfcmV0dXJuX2lmX2ZhaWwoY29uZGl0aW9uKQorI2RlZmluZSBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwoY29uZGl0aW9uLCB2YWwpCisjZWxzZQorCisjZGVmaW5lIF9kYnVzX3JldHVybl9pZl9mYWlsKGNvbmRpdGlvbikgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIF9kYnVzX2Fzc2VydCAoKCooY29uc3QgY2hhciopX0RCVVNfRlVOQ1RJT05fTkFNRSkgIT0gJ18nKTsgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoIShjb25kaXRpb24pKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX2RidXNfd2Fybl9yZXR1cm5faWZfZmFpbCAoX0RCVVNfRlVOQ1RJT05fTkFNRSwgI2NvbmRpdGlvbiwgX19GSUxFX18sIF9fTElORV9fKTsgXAorICAgIHJldHVybjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gfSB3aGlsZSAoMCkKKworI2RlZmluZSBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwoY29uZGl0aW9uLCB2YWwpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIF9kYnVzX2Fzc2VydCAoKCooY29uc3QgY2hhciopX0RCVVNfRlVOQ1RJT05fTkFNRSkgIT0gJ18nKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmICghKGNvbmRpdGlvbikpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9kYnVzX3dhcm5fcmV0dXJuX2lmX2ZhaWwgKF9EQlVTX0ZVTkNUSU9OX05BTUUsICNjb25kaXRpb24sIF9fRklMRV9fLCBfX0xJTkVfXyk7IFwKKyAgICByZXR1cm4gKHZhbCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gfSB3aGlsZSAoMCkKKworI2VuZGlmIC8qICFEQlVTX0RJU0FCTEVfQVNTRVJUICovCisKKyNkZWZpbmUgX0RCVVNfTl9FTEVNRU5UUyhhcnJheSkgKChpbnQpIChzaXplb2YgKChhcnJheSkpIC8gc2l6ZW9mICgoYXJyYXkpWzBdKSkpCisKKyNkZWZpbmUgX0RCVVNfUE9JTlRFUl9UT19JTlQocG9pbnRlcikgKChpbnRwdHJfdCkocG9pbnRlcikpCisjZGVmaW5lIF9EQlVTX0lOVF9UT19QT0lOVEVSKGludGVnZXIpICgodm9pZCopKChpbnRwdHJfdCkoaW50ZWdlcikpKQorCisjZGVmaW5lIF9EQlVTX1pFUk8ob2JqZWN0KSAobWVtc2V0ICgmKG9iamVjdCksICdcMCcsIHNpemVvZiAoKG9iamVjdCkpKSkKKworI2RlZmluZSBfREJVU19TVFJVQ1RfT0ZGU0VUKHN0cnVjdF90eXBlLCBtZW1iZXIpCVwKKyAgICAoKGludHB0cl90KSAoKHVuc2lnbmVkIGNoYXIqKSAmKChzdHJ1Y3RfdHlwZSopIDApLT5tZW1iZXIpKQorCisjZGVmaW5lIF9EQlVTX0FMSUdOT0YodHlwZSkgXAorICAgIChfREJVU19TVFJVQ1RfT0ZGU0VUIChzdHJ1Y3QgeyBjaGFyIF8xOyB0eXBlIF8yOyB9LCBfMikpCisKKyNpZmRlZiBEQlVTX0RJU0FCTEVfQ0hFQ0tTCisvKiB0aGlzIGlzIGFuIGFzc2VydCBhbmQgbm90IGFuIGVycm9yLCBidXQgaW4gdGhlIHR5cGljYWwgLS1kaXNhYmxlLWNoZWNrcyBjYXNlICh5b3UncmUgdHJ5aW5nCisgKiB0byByZWFsbHkgbWluaW1pemUgY29kZSBzaXplKSwgZGlzYWJsaW5nIHRoZXNlIGFzc2VydGlvbnMgbWFrZXMgc2Vuc2UuCisgKi8KKyNkZWZpbmUgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVChlcnJvcikgZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIoZXJyb3IpIGRvIHsgfSB3aGlsZSAoMCkKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQKK19kYnVzX2Fzc2VydF9lcnJvcl9pc19zZXQgKGNvbnN0IERCdXNFcnJvciAqZXJyb3IpCit7CisgICAgX2RidXNfYXNzZXJ0IChlcnJvciA9PSBOVUxMIHx8IGRidXNfZXJyb3JfaXNfc2V0IChlcnJvcikpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK19kYnVzX2Fzc2VydF9lcnJvcl9pc19jbGVhciAoY29uc3QgREJ1c0Vycm9yICplcnJvcikKK3sKKyAgICBfZGJ1c19hc3NlcnQgKGVycm9yID09IE5VTEwgfHwgIWRidXNfZXJyb3JfaXNfc2V0IChlcnJvcikpOworfQorCisjZGVmaW5lIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQoZXJyb3IpIF9kYnVzX2Fzc2VydF9lcnJvcl9pc19zZXQoZXJyb3IpCisjZGVmaW5lIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUihlcnJvcikgX2RidXNfYXNzZXJ0X2Vycm9yX2lzX2NsZWFyKGVycm9yKQorI2VuZGlmCisKKyNkZWZpbmUgX2RidXNfcmV0dXJuX2lmX2Vycm9yX2lzX3NldChlcnJvcikgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKChlcnJvcikgPT0gTlVMTCB8fCAhZGJ1c19lcnJvcl9pc19zZXQgKChlcnJvcikpKQorI2RlZmluZSBfZGJ1c19yZXR1cm5fdmFsX2lmX2Vycm9yX2lzX3NldChlcnJvciwgdmFsKSBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKChlcnJvcikgPT0gTlVMTCB8fCAhZGJ1c19lcnJvcl9pc19zZXQgKChlcnJvcikpLCAodmFsKSkKKworLyogVGhpcyBhbGlnbm1lbnQgdGhpbmcgaXMgZnJvbSBPUkJpdDIgKi8KKy8qIEFsaWduIGEgdmFsdWUgdXB3YXJkIHRvIGEgYm91bmRhcnksIGV4cHJlc3NlZCBhcyBhIG51bWJlciBvZiBieXRlcy4KKyAqIEUuZy4gYWxpZ24gdG8gYW4gOC1ieXRlIGJvdW5kYXJ5IHdpdGggYXJndW1lbnQgb2YgOC4KKyAqLworCisvKgorICogICAodGhpcyArIGJvdW5kYXJ5IC0gMSkKKyAqICAgICAgICAgICYKKyAqICAgIH4oYm91bmRhcnkgLSAxKQorICovCisKKyNkZWZpbmUgX0RCVVNfQUxJR05fVkFMVUUodGhpcywgYm91bmRhcnkpIFwKKyAgKCggKCh1aW50cHRyX3QpKHRoaXMpKSArICgoKHVpbnRwdHJfdCkoYm91bmRhcnkpKSAtMSkpICYgKH4oKCh1aW50cHRyX3QpKGJvdW5kYXJ5KSktMSkpKQorCisjZGVmaW5lIF9EQlVTX0FMSUdOX0FERFJFU1ModGhpcywgYm91bmRhcnkpIFwKKyAgKCh2b2lkKilfREJVU19BTElHTl9WQUxVRSh0aGlzLCBib3VuZGFyeSkpCisKKworREJVU19QUklWQVRFX0VYUE9SVAorY2hhciogICAgICAgX2RidXNfc3RyZHVwICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICAqc3RyKTsKK3ZvaWQqICAgICAgIF9kYnVzX21lbWR1cCAgICAgICAgICAgICAgICAoY29uc3Qgdm9pZCAgKm1lbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgIG5fYnl0ZXMpOworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgX2RidXNfc3RyaW5nX2FycmF5X2NvbnRhaW5zIChjb25zdCBjaGFyICoqYXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICpzdHIpOworREJVU19QUklWQVRFX0VYUE9SVAorc2l6ZV90ICAgICAgX2RidXNfc3RyaW5nX2FycmF5X2xlbmd0aCAgIChjb25zdCBjaGFyICoqYXJyYXkpOworY2hhcioqICAgICAgX2RidXNfZHVwX3N0cmluZ19hcnJheSAgICAgIChjb25zdCBjaGFyICoqYXJyYXkpOworCisjZGVmaW5lIF9EQlVTX0lOVDE2X01JTgkgKChkYnVzX2ludDE2X3QpIDB4ODAwMCkKKyNkZWZpbmUgX0RCVVNfSU5UMTZfTUFYCSAoKGRidXNfaW50MTZfdCkgMHg3ZmZmKQorI2RlZmluZSBfREJVU19VSU5UMTZfTUFYICgoZGJ1c191aW50MTZfdCkweGZmZmYpCisjZGVmaW5lIF9EQlVTX0lOVDMyX01JTgkgKChkYnVzX2ludDMyX3QpIDB4ODAwMDAwMDApCisjZGVmaW5lIF9EQlVTX0lOVDMyX01BWAkgKChkYnVzX2ludDMyX3QpIDB4N2ZmZmZmZmYpCisjZGVmaW5lIF9EQlVTX1VJTlQzMl9NQVggKChkYnVzX3VpbnQzMl90KTB4ZmZmZmZmZmYpCisvKiB1c2luZyAzMi1iaXQgaGVyZSBpcyBzb3J0IG9mIGJvZ3VzICovCisjZGVmaW5lIF9EQlVTX0lOVF9NSU4JIF9EQlVTX0lOVDMyX01JTgorI2RlZmluZSBfREJVU19JTlRfTUFYCSBfREJVU19JTlQzMl9NQVgKKyNkZWZpbmUgX0RCVVNfVUlOVF9NQVgJIF9EQlVTX1VJTlQzMl9NQVgKKyNkZWZpbmUgX0RCVVNfSU5UNjRfTUFYCSBEQlVTX0lOVDY0X0NPTlNUQU5UICAoMHg3ZmZmZmZmZmZmZmZmZmZmKQorI2RlZmluZSBfREJVU19VSU5UNjRfTUFYIERCVVNfVUlOVDY0X0NPTlNUQU5UICgweGZmZmZmZmZmZmZmZmZmZmYpCisjZGVmaW5lIF9EQlVTX09ORV9LSUxPQllURSAxMDI0CisjZGVmaW5lIF9EQlVTX09ORV9NRUdBQllURSAxMDI0ICogX0RCVVNfT05FX0tJTE9CWVRFCisjZGVmaW5lIF9EQlVTX09ORV9IT1VSX0lOX01JTExJU0VDT05EUyAoMTAwMCAqIDYwICogNjApCisjZGVmaW5lIF9EQlVTX1VTRUNfUEVSX1NFQ09ORCAgICAgICAgICAoMTAwMDAwMCkKKworI3VuZGVmCU1BWAorI2RlZmluZSBNQVgoYSwgYikgICgoKGEpID4gKGIpKSA/IChhKSA6IChiKSkKKworI3VuZGVmCU1JTgorI2RlZmluZSBNSU4oYSwgYikgICgoKGEpIDwgKGIpKSA/IChhKSA6IChiKSkKKworI3VuZGVmCUFCUworI2RlZmluZSBBQlMoYSkJICAgKCgoYSkgPCAwKSA/IC0oYSkgOiAoYSkpCisKKyNkZWZpbmUgX0RCVVNfSVNBU0NJSShjKSAoKGMpICE9ICdcMCcgJiYgKCgoYykgJiB+MHg3ZikgPT0gMCkpCisKK3R5cGVkZWYgdm9pZCAoKiBEQnVzRm9yZWFjaEZ1bmN0aW9uKSAodm9pZCAqZWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSk7CisKK3ZvaWQgX2RidXNfdmVyYm9zZV9ieXRlcyAgICAgICAgICAgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICBvZmZzZXQpOworREJVU19QUklWQVRFX0VYUE9SVAordm9pZCBfZGJ1c192ZXJib3NlX2J5dGVzX29mX3N0cmluZyAoY29uc3QgREJ1c1N0cmluZyAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICBsZW4pOworCitEQlVTX1BSSVZBVEVfRVhQT1JUCitleHRlcm4gY29uc3QgY2hhciAqX2RidXNfbm9fbWVtb3J5X21lc3NhZ2U7CisjZGVmaW5lIF9EQlVTX1NFVF9PT00oZXJyb3IpIGRidXNfc2V0X2Vycm9yX2NvbnN0ICgoZXJyb3IpLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgX2RidXNfbm9fbWVtb3J5X21lc3NhZ2UpCitEQlVTX1BSSVZBVEVfRVhQT1JUCit2b2lkIF9kYnVzX3NldF9lcnJvcl92YWxpc3QgKERCdXNFcnJvciAgKmVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhX2xpc3QgICAgIGFyZ3MpIF9EQlVTX0dOVUNfUFJJTlRGICgzLCAwKTsKKwordHlwZWRlZiBkYnVzX2Jvb2xfdCAoKiBEQnVzVGVzdE1lbW9yeUZ1bmN0aW9uKSAgKHZvaWQgKmRhdGEpOworCisjaWZkZWYgREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMKKy8qIE1lbW9yeSBkZWJ1Z2dpbmcgKi8KK3ZvaWQgICAgICAgIF9kYnVzX3NldF9mYWlsX2FsbG9jX2NvdW50ZXIgICAgICAgIChpbnQgIHVudGlsX25leHRfZmFpbCk7CitpbnQgICAgICAgICBfZGJ1c19nZXRfZmFpbF9hbGxvY19jb3VudGVyICAgICAgICAodm9pZCk7Cit2b2lkICAgICAgICBfZGJ1c19zZXRfZmFpbF9hbGxvY19mYWlsdXJlcyAgICAgICAoaW50ICBmYWlsdXJlc19wZXJfZmFpbHVyZSk7CitpbnQgICAgICAgICBfZGJ1c19nZXRfZmFpbF9hbGxvY19mYWlsdXJlcyAgICAgICAodm9pZCk7CitkYnVzX2Jvb2xfdCBfZGJ1c19kZWNyZW1lbnRfZmFpbF9hbGxvY19jb3VudGVyICAodm9pZCk7CitkYnVzX2Jvb2xfdCBfZGJ1c19kaXNhYmxlX21lbV9wb29scyAgICAgICAgICAgICAodm9pZCk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitpbnQgICAgICAgICBfZGJ1c19nZXRfbWFsbG9jX2Jsb2Nrc19vdXRzdGFuZGluZyAodm9pZCk7CisKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90IF9kYnVzX3Rlc3Rfb29tX2hhbmRsaW5nIChjb25zdCBjaGFyICAgICAgICAgICAgICpkZXNjcmlwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVGVzdE1lbW9yeUZ1bmN0aW9uICBmdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgKmRhdGEpOworI2Vsc2UKKyNkZWZpbmUgX2RidXNfc2V0X2ZhaWxfYWxsb2NfY291bnRlcihuKQorI2RlZmluZSBfZGJ1c19nZXRfZmFpbF9hbGxvY19jb3VudGVyIF9EQlVTX0lOVF9NQVgKKworLyogVGhlc2UgYXJlIGNvbnN0YW50IGV4cHJlc3Npb25zIHNvIHRoYXQgYmxvY2tzCisgKiB0aGV5IHByb3RlY3Qgc2hvdWxkIGJlIG9wdGltaXplZCBhd2F5CisgKi8KKyNkZWZpbmUgX2RidXNfZGVjcmVtZW50X2ZhaWxfYWxsb2NfY291bnRlcigpIChGQUxTRSkKKyNkZWZpbmUgX2RidXNfZGlzYWJsZV9tZW1fcG9vbHMoKSAgICAgICAgICAgIChGQUxTRSkKKyNkZWZpbmUgX2RidXNfZ2V0X21hbGxvY19ibG9ja3Nfb3V0c3RhbmRpbmcoKSAoMCkKKworI2RlZmluZSBfZGJ1c190ZXN0X29vbV9oYW5kbGluZyhkZXNjcmlwdGlvbiwgZnVuYywgZGF0YSkgKCgqZnVuYykgKGRhdGEpKQorI2VuZGlmIC8qICFEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUyAqLworCit0eXBlZGVmIHZvaWQgKCogREJ1c1NodXRkb3duRnVuY3Rpb24pICh2b2lkICpkYXRhKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90IF9kYnVzX3JlZ2lzdGVyX3NodXRkb3duX2Z1bmMgICAgICAgICAgKERCdXNTaHV0ZG93bkZ1bmN0aW9uICBmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICpkYXRhKTsKK2RidXNfYm9vbF90IF9kYnVzX3JlZ2lzdGVyX3NodXRkb3duX2Z1bmNfdW5sb2NrZWQgKERCdXNTaHV0ZG93bkZ1bmN0aW9uICBmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICpkYXRhKTsKKworZXh0ZXJuIGludCBfZGJ1c19jdXJyZW50X2dlbmVyYXRpb247CisKKy8qIFRoZSB3ZWlyZCBjYXNlIGNvbnZlbnRpb24gaXMgdG8gYXZvaWQgaGF2aW5nIHRvIGNoYW5nZSBhbGwgdGhlIGNhbGxlcnMsCisgKiB3aGljaCB3b3VsZCBiZSBxdWl0ZSBhIG1lZ2EtcGF0Y2guICovCit0eXBlZGVmIGVudW0KK3sKKyAgLyogaW5kZXggMC00ICovCisgIF9EQlVTX0xPQ0tfbGlzdCwKKyAgX0RCVVNfTE9DS19jb25uZWN0aW9uX3Nsb3RzLAorICBfREJVU19MT0NLX3BlbmRpbmdfY2FsbF9zbG90cywKKyAgX0RCVVNfTE9DS19zZXJ2ZXJfc2xvdHMsCisgIF9EQlVTX0xPQ0tfbWVzc2FnZV9zbG90cywKKyAgLyogaW5kZXggNS05ICovCisgIF9EQlVTX0xPQ0tfYnVzLAorICBfREJVU19MT0NLX2J1c19kYXRhcywKKyAgX0RCVVNfTE9DS19zaHV0ZG93bl9mdW5jcywKKyAgX0RCVVNfTE9DS19zeXN0ZW1fdXNlcnMsCisgIF9EQlVTX0xPQ0tfbWVzc2FnZV9jYWNoZSwKKyAgLyogaW5kZXggMTAtMTIgKi8KKyAgX0RCVVNfTE9DS19zaGFyZWRfY29ubmVjdGlvbnMsCisgIF9EQlVTX0xPQ0tfbWFjaGluZV91dWlkLAorICBfREJVU19MT0NLX3N5c2RlcHMsCisKKyAgX0RCVVNfTl9HTE9CQUxfTE9DS1MKK30gREJ1c0dsb2JhbExvY2s7CisKK2RidXNfYm9vbF90IF9kYnVzX2xvY2sgICAoREJ1c0dsb2JhbExvY2sgbG9jaykgX0RCVVNfR05VQ19XQVJOX1VOVVNFRF9SRVNVTFQ7Cit2b2lkICAgICAgICBfZGJ1c191bmxvY2sgKERCdXNHbG9iYWxMb2NrIGxvY2spOworCisjZGVmaW5lIF9EQlVTX0xPQ0tfTkFNRShuYW1lKSAgICAgICAgICAgX0RCVVNfTE9DS18jI25hbWUKKyNkZWZpbmUgX0RCVVNfTE9DSyhuYW1lKSAgICAgICAgICAgICAgICBfZGJ1c19sb2NrICAgKF9EQlVTX0xPQ0tfIyNuYW1lKQorI2RlZmluZSBfREJVU19VTkxPQ0sobmFtZSkgICAgICAgICAgICAgIF9kYnVzX3VubG9jayAoX0RCVVNfTE9DS18jI25hbWUpCisKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90IF9kYnVzX3RocmVhZHNfaW5pdF9kZWJ1ZyAodm9pZCk7CisKK2RidXNfYm9vbF90ICAgX2RidXNfYWRkcmVzc19hcHBlbmRfZXNjYXBlZCAoREJ1c1N0cmluZyAgICAgICAqZXNjYXBlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqdW5lc2NhcGVkKTsKKwordm9pZCAgICAgICAgICBfZGJ1c19zZXRfYmFkX2FkZHJlc3MgICAgICAgIChEQnVzRXJyb3IgICAgICAgICAqZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICphZGRyZXNzX3Byb2JsZW1fdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgKmFkZHJlc3NfcHJvYmxlbV9maWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgKmFkZHJlc3NfcHJvYmxlbV9vdGhlcik7CisKKyNkZWZpbmUgREJVU19VVUlEX0xFTkdUSF9CWVRFUyAxNgorI2RlZmluZSBEQlVTX1VVSURfTEVOR1RIX1dPUkRTIChEQlVTX1VVSURfTEVOR1RIX0JZVEVTIC8gNCkKKyNkZWZpbmUgREJVU19VVUlEX0xFTkdUSF9IRVggICAoREJVU19VVUlEX0xFTkdUSF9CWVRFUyAqIDIpCisKKy8qKgorICogQSBnbG9iYWxseSB1bmlxdWUgSUQgOyB3ZSBoYXZlIG9uZSBmb3IgZWFjaCBEQnVzU2VydmVyLCBhbmQgYWxzbyBvbmUgZm9yIGVhY2gKKyAqIG1hY2hpbmUgd2l0aCBsaWJkYnVzIGluc3RhbGxlZCBvbiBpdC4KKyAqLwordW5pb24gREJ1c0dVSUQKK3sKKyAgZGJ1c191aW50MzJfdCBhc191aW50MzJzW0RCVVNfVVVJRF9MRU5HVEhfV09SRFNdOyAgICAgLyoqPCBndWlkIGFzIGZvdXIgdWludDMyIHZhbHVlcyAqLworICBjaGFyIGFzX2J5dGVzW0RCVVNfVVVJRF9MRU5HVEhfQllURVNdOyAgICAgICAgICAgICAgICAvKio8IGd1aWQgYXMgMTYgc2luZ2xlLWJ5dGUgdmFsdWVzICovCit9OworCitEQlVTX1BSSVZBVEVfRVhQT1JUIF9EQlVTX0dOVUNfV0FSTl9VTlVTRURfUkVTVUxUCitkYnVzX2Jvb2xfdCBfZGJ1c19nZW5lcmF0ZV91dWlkICAoREJ1c0dVSUQgICAgICAgICAqdXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcik7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCBfZGJ1c191dWlkX2VuY29kZSAgICAoY29uc3QgREJ1c0dVSUQgICAqdXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICplbmNvZGVkKTsKK2RidXNfYm9vbF90IF9kYnVzX3JlYWRfdXVpZF9maWxlIChjb25zdCBEQnVzU3RyaW5nICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzR1VJRCAgICAgICAgICp1dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgIGNyZWF0ZV9pZl9ub3RfZm91bmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpOworCitkYnVzX2Jvb2xfdCBfZGJ1c193cml0ZV91dWlkX2ZpbGUgKGNvbnN0IERCdXNTdHJpbmcgKmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzR1VJRCAgICp1dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcik7CisKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90IF9kYnVzX2dldF9sb2NhbF9tYWNoaW5lX3V1aWRfZW5jb2RlZCAoREJ1c1N0cmluZyAqdXVpZF9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgKmVycm9yKTsKKworI2RlZmluZSBfREJVU19QQVNURTIoYSwgYikgYSAjIyBiCisjZGVmaW5lIF9EQlVTX1BBU1RFKGEsIGIpIF9EQlVTX1BBU1RFMiAoYSwgYikKKyNkZWZpbmUgX0RCVVNfU1RBVElDX0FTU0VSVChleHByKSBcCisgIHR5cGVkZWYgc3RydWN0IHsgY2hhciBfYXNzZXJ0aW9uWyhleHByKSA/IDEgOiAtMV07IH0gXAorICBfREJVU19QQVNURSAoX0RCVVNfU1RBVElDX0FTU0VSVF8sIF9fTElORV9fKSBfREJVU19HTlVDX1VOVVNFRAorCitEQlVTX0VORF9ERUNMUworCisjZW5kaWYgLyogREJVU19JTlRFUk5BTFNfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLWtleXJpbmcuYyBiL2RidXMvZGJ1cy1rZXlyaW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDlhZGFhNgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1rZXlyaW5nLmMKQEAgLTAsMCArMSwxMTU2IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMta2V5cmluZy5jIFN0b3JlIHNlY3JldCBjb29raWVzIGluIHlvdXIgaG9tZWRpcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCAgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLWtleXJpbmcuaCIKKyNpbmNsdWRlICJkYnVzLXByb3RvY29sLmgiCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXN0cmluZy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1saXN0Lmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXN5c2RlcHMuaD4KKworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c0tleXJpbmcga2V5cmluZyBjbGFzcworICogQGluZ3JvdXAgIERCdXNJbnRlcm5hbHMKKyAqIEBicmllZiBEQnVzS2V5cmluZyBkYXRhIHN0cnVjdHVyZQorICoKKyAqIFR5cGVzIGFuZCBmdW5jdGlvbnMgcmVsYXRlZCB0byBEQnVzS2V5cmluZy4gREJ1c0tleXJpbmcgaXMgaW50ZW5kZWQKKyAqIHRvIG1hbmFnZSBjb29raWVzIHVzZWQgdG8gYXV0aGVudGljYXRlIGNsaWVudHMgdG8gc2VydmVycy4gIFRoaXMgaXMKKyAqIGVzc2VudGlhbGx5IHRoZSAidmVyaWZ5IHRoYXQgY2xpZW50IGNhbiByZWFkIHRoZSB1c2VyJ3MgaG9tZWRpciIKKyAqIGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbS4gIEJvdGggY2xpZW50IGFuZCBzZXJ2ZXIgbXVzdCBoYXZlIGFjY2VzcworICogdG8gdGhlIGhvbWVkaXIuCisgKgorICogVGhlIHNlY3JldCBrZXlzIGFyZSBub3Qga2VwdCBpbiBsb2NrZWQgbWVtb3J5LCBhbmQgYXJlIHdyaXR0ZW4gdG8gYQorICogZmlsZSBpbiB0aGUgdXNlcidzIGhvbWVkaXIuIEhvd2V2ZXIgdGhleSBhcmUgdHJhbnNpZW50IChvbmx5IHVzZWQKKyAqIGJ5IGEgc2luZ2xlIHNlcnZlciBpbnN0YW5jZSBmb3IgYSBmaXhlZCBwZXJpb2Qgb2YgdGltZSwgdGhlbgorICogZGlzY2FyZGVkKS4gQWxzbywgdGhlIGtleXMgYXJlIG5vdCBzZW50IG92ZXIgdGhlIHdpcmUuCisgKgorICogQHRvZG8gdGhlcmUncyBhIG1lbW9yeSBsZWFrIG9uIHNvbWUgY29kZXBhdGggaW4gaGVyZSwgSSBzYXcgaXQgb25jZQorICogd2hlbiBydW5uaW5nIG1ha2UgY2hlY2sgLSBwcm9iYWJseSBzb21lIHNwZWNpZmljIGluaXRpYWwgY29va2llcworICogcHJlc2VudCBpbiB0aGUgY29va2llIGZpbGUsIHRoZW4gZGVwZW5kaW5nIG9uIHdoYXQgd2UgZG8gd2l0aCB0aGVtLgorICovCisKKy8qKgorICogQGRlZmdyb3VwIERCdXNLZXlyaW5nSW50ZXJuYWxzIERCdXNLZXlyaW5nIGltcGxlbWVudGF0aW9uIGRldGFpbHMKKyAqIEBpbmdyb3VwICBEQnVzSW50ZXJuYWxzCisgKiBAYnJpZWYgREJ1c0tleXJpbmcgaW1wbGVtZW50YXRpb24gZGV0YWlscworICoKKyAqIFRoZSBndXRzIG9mIERCdXNLZXlyaW5nLgorICoKKyAqIEB7CisgKi8KKworLyoqIFRoZSBtYXhpbXVtIGFnZSBvZiBhIGtleSBiZWZvcmUgd2UgY3JlYXRlIGEgbmV3IGtleSB0byB1c2UgaW4KKyAqIGNoYWxsZW5nZXMuICBUaGlzIGlzbid0IHN1cGVyLXJlbGlhYmx5IGVuZm9yY2VkLCBzaW5jZSBzeXN0ZW0KKyAqIGNsb2NrcyBjYW4gY2hhbmdlIG9yIGJlIHdyb25nLCBidXQgd2UgbWFrZSBhIGJlc3QgZWZmb3J0IHRvIG9ubHkKKyAqIHVzZSBrZXlzIGZvciBhIHNob3J0IHRpbWUuCisgKi8KKyNkZWZpbmUgTkVXX0tFWV9USU1FT1VUX1NFQ09ORFMgICAgICg2MCo1KQorLyoqCisgKiBUaGUgdGltZSBhZnRlciB3aGljaCB3ZSBkcm9wIGEga2V5IGZyb20gdGhlIHNlY3JldHMgZmlsZS4KKyAqIFRoZSBFWFBJUkVfS0VZU19USU1FT1VUX1NFQ09ORFMgLSBORVdfS0VZX1RJTUVPVVRfU0VDT05EUyBpcyB0aGUgbWluaW11bQorICogdGltZSB3aW5kb3cgYSBjbGllbnQgaGFzIHRvIGNvbXBsZXRlIGF1dGhlbnRpY2F0aW9uLgorICovCisjZGVmaW5lIEVYUElSRV9LRVlTX1RJTUVPVVRfU0VDT05EUyAoTkVXX0tFWV9USU1FT1VUX1NFQ09ORFMgKyAoNjAqMikpCisvKioKKyAqIFRoZSBtYXhpbXVtIGFtb3VudCBvZiB0aW1lIGEga2V5IGNhbiBiZSBpbiB0aGUgZnV0dXJlLgorICovCisjZGVmaW5lIE1BWF9USU1FX1RSQVZFTF9TRUNPTkRTICg2MCo1KQorCisvKioKKyAqIE1heGltdW0gbnVtYmVyIG9mIGtleXMgaW4gdGhlIGtleXJpbmcgYmVmb3JlCisgKiB3ZSBqdXN0IGlnbm9yZSB0aGUgcmVzdAorICovCisjaWZkZWYgREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMKKyNkZWZpbmUgTUFYX0tFWVNfSU5fRklMRSAxMAorI2Vsc2UKKyNkZWZpbmUgTUFYX0tFWVNfSU5fRklMRSAyNTYKKyNlbmRpZgorCisvKioKKyAqIEEgc2luZ2xlIGtleSBmcm9tIHRoZSBjb29raWUgZmlsZQorICovCit0eXBlZGVmIHN0cnVjdAoreworICBkYnVzX2ludDMyX3QgaWQ7IC8qKjwgaWRlbnRpZmllciB1c2VkIHRvIHJlZmVyIHRvIHRoZSBrZXkgKi8KKworICBsb25nIGNyZWF0aW9uX3RpbWU7IC8qKjwgd2hlbiB0aGUga2V5IHdhcyBnZW5lcmF0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICogICBhcyB1bml4IHRpbWVzdGFtcC4gc2lnbmVkIGxvbmcKKyAgICAgICAgICAgICAgICAgICAgICAgKiAgIG1hdGNoZXMgc3RydWN0IHRpbWV2YWwuCisgICAgICAgICAgICAgICAgICAgICAgICovCisgIAorICBEQnVzU3RyaW5nIHNlY3JldDsgLyoqPCB0aGUgYWN0dWFsIGtleSAqLworCit9IERCdXNLZXk7CisKKy8qKgorICogQGJyaWVmIEludGVybmFscyBvZiBEQnVzS2V5cmluZy4KKyAqIAorICogREJ1c0tleXJpbmcgaW50ZXJuYWxzLiBEQnVzS2V5cmluZyBpcyBhbiBvcGFxdWUgb2JqZWN0LCBpdCBtdXN0IGJlCisgKiB1c2VkIHZpYSBhY2Nlc3NvciBmdW5jdGlvbnMuCisgKi8KK3N0cnVjdCBEQnVzS2V5cmluZworeworICBpbnQgcmVmY291bnQ7ICAgICAgICAgICAgIC8qKjwgUmVmZXJlbmNlIGNvdW50ICovCisgIERCdXNTdHJpbmcgZGlyZWN0b3J5OyAgICAgLyoqPCBEaXJlY3RvcnkgdGhlIGJlbG93IHR3byBpdGVtcyBhcmUgaW5zaWRlICovCisgIERCdXNTdHJpbmcgZmlsZW5hbWU7ICAgICAgLyoqPCBLZXlyaW5nIGZpbGVuYW1lICovCisgIERCdXNTdHJpbmcgZmlsZW5hbWVfbG9jazsgLyoqPCBOYW1lIG9mIGxvY2tmaWxlICovCisgIERCdXNLZXkgKmtleXM7IC8qKjwgS2V5cyBsb2FkZWQgZnJvbSB0aGUgZmlsZSAqLworICBpbnQgbl9rZXlzOyAgICAvKio8IE51bWJlciBvZiBrZXlzICovCisgIERCdXNDcmVkZW50aWFscyAqY3JlZGVudGlhbHM7IC8qKjwgQ3JlZGVudGlhbHMgY29udGFpbmluZyB1c2VyIHRoZSBrZXlyaW5nIGlzIGZvciAqLworfTsKKworc3RhdGljIERCdXNLZXlyaW5nKgorX2RidXNfa2V5cmluZ19uZXcgKHZvaWQpCit7CisgIERCdXNLZXlyaW5nICprZXlyaW5nOworCisgIGtleXJpbmcgPSBkYnVzX25ldzAgKERCdXNLZXlyaW5nLCAxKTsKKyAgaWYgKGtleXJpbmcgPT0gTlVMTCkKKyAgICBnb3RvIG91dF8wOworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmtleXJpbmctPmRpcmVjdG9yeSkpCisgICAgZ290byBvdXRfMTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgma2V5cmluZy0+ZmlsZW5hbWUpKQorICAgIGdvdG8gb3V0XzI7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmtleXJpbmctPmZpbGVuYW1lX2xvY2spKQorICAgIGdvdG8gb3V0XzM7CisgIAorICBrZXlyaW5nLT5yZWZjb3VudCA9IDE7CisgIGtleXJpbmctPmtleXMgPSBOVUxMOworICBrZXlyaW5nLT5uX2tleXMgPSAwOworCisgIHJldHVybiBrZXlyaW5nOworCisgb3V0XzM6CisgIF9kYnVzX3N0cmluZ19mcmVlICgma2V5cmluZy0+ZmlsZW5hbWUpOworIG91dF8yOgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJmtleXJpbmctPmRpcmVjdG9yeSk7Cisgb3V0XzE6CisgIGRidXNfZnJlZSAoa2V5cmluZyk7Cisgb3V0XzA6CisgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZAorZnJlZV9rZXlzIChEQnVzS2V5ICprZXlzLAorICAgICAgICAgICBpbnQgICAgICBuX2tleXMpCit7CisgIGludCBpOworCisgIC8qIHNob3VsZCBiZSBzYWZlIGZvciBhcmdzIE5VTEwsIDAgKi8KKyAgCisgIGkgPSAwOworICB3aGlsZSAoaSA8IG5fa2V5cykKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmtleXNbaV0uc2VjcmV0KTsKKyAgICAgICsraTsKKyAgICB9CisKKyAgZGJ1c19mcmVlIChrZXlzKTsKK30KKworLyogT3VyIGxvY2tpbmcgc2NoZW1lIGlzIGhpZ2hseSB1bnJlbGlhYmxlLiAgSG93ZXZlciwgdGhlcmUgaXMKKyAqIHVuZm9ydHVuYXRlbHkgbm8gcmVsaWFibGUgbG9ja2luZyBzY2hlbWUgaW4gdXNlciBob21lIGRpcmVjdG9yaWVzOworICogYmV0d2VlbiBidWdzIGluIExpbnV4IE5GUywgcGVvcGxlIHVzaW5nIFRydTY0IG9yIG90aGVyIHRvdGFsIGNyYXAKKyAqIE5GUywgQUZTLCByYW5kb20tZmlsZS1zeXN0ZW0tb2YtdGhlLXdlZWssIGFuZCBzbyBmb3J0aCwgZmNudGwoKSBpbgorICogaG9tZWRpcnMgc2ltcGx5IGdlbmVyYXRlcyB0b25zIG9mIGJ1ZyByZXBvcnRzLiBUaGlzIGhhcyBiZWVuCisgKiBsZWFybmVkIHRocm91Z2ggaGFyZCBleHBlcmllbmNlIHdpdGggR0NvbmYsIHVuZm9ydHVuYXRlbHkuCisgKgorICogVGhpcyBiYWQgaGFjayBtaWdodCB3b3JrIGJldHRlciBmb3IgdGhlIGtpbmQgb2YgbG9jayB3ZSBoYXZlIGhlcmUsCisgKiB3aGljaCB3ZSBkb24ndCBleHBlY3QgdG8gaG9sZCBmb3IgYW55IGxlbmd0aCBvZiB0aW1lLiAgQ3Jhc2hpbmcKKyAqIHdoaWxlIHdlIGhvbGQgaXQgc2hvdWxkIGJlIHVubGlrZWx5LCBhbmQgdGltaW5nIG91dCBzdWNoIHRoYXQgd2UKKyAqIGRlbGV0ZSBhIHN0YWxlIGxvY2sgc2hvdWxkIGFsc28gYmUgdW5saWtlbHkgZXhjZXB0IHdoZW4gdGhlCisgKiBmaWxlc3lzdGVtIGlzIHJ1bm5pbmcgcmVhbGx5IHNsb3dseS4gIFN0dWZmIG1pZ2h0IGJyZWFrIGluIGNvcm5lcgorICogY2FzZXMgYnV0IGFzIGxvbmcgYXMgaXQncyBub3QgYSBzZWN1cml0eS1sZXZlbCBicmVha2FnZSBpdCBzaG91bGQKKyAqIGJlIE9LLgorICovCisKKy8qKiBNYXhpbXVtIG51bWJlciBvZiB0aW1lb3V0cyB3YWl0aW5nIGZvciBsb2NrIGJlZm9yZSB3ZSBkZWNpZGUgaXQncyBzdGFsZSAqLworI2RlZmluZSBNQVhfTE9DS19USU1FT1VUUyAzMgorLyoqIExlbmd0aCBvZiBlYWNoIHRpbWVvdXQgd2hpbGUgd2FpdGluZyBmb3IgYSBsb2NrICovCisjZGVmaW5lIExPQ0tfVElNRU9VVF9NSUxMSVNFQ09ORFMgMjUwCisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorX2RidXNfa2V5cmluZ19sb2NrIChEQnVzS2V5cmluZyAqa2V5cmluZykKK3sKKyAgaW50IG5fdGltZW91dHM7CisgIAorICBuX3RpbWVvdXRzID0gMDsKKyAgd2hpbGUgKG5fdGltZW91dHMgPCBNQVhfTE9DS19USU1FT1VUUykKKyAgICB7CisgICAgICBEQnVzRXJyb3IgZXJyb3IgPSBEQlVTX0VSUk9SX0lOSVQ7CisKKyAgICAgIGlmIChfZGJ1c19jcmVhdGVfZmlsZV9leGNsdXNpdmVseSAoJmtleXJpbmctPmZpbGVuYW1lX2xvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcikpCisgICAgICAgIGJyZWFrOworCisgICAgICBfZGJ1c192ZXJib3NlICgiRGlkIG5vdCBnZXQgbG9jayBmaWxlLCBzbGVlcGluZyAlZCBtaWxsaXNlY29uZHMgKCVzKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgIExPQ0tfVElNRU9VVF9NSUxMSVNFQ09ORFMsIGVycm9yLm1lc3NhZ2UpOworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworCisgICAgICBfZGJ1c19zbGVlcF9taWxsaXNlY29uZHMgKExPQ0tfVElNRU9VVF9NSUxMSVNFQ09ORFMpOworICAgICAgCisgICAgICArK25fdGltZW91dHM7CisgICAgfQorCisgIGlmIChuX3RpbWVvdXRzID09IE1BWF9MT0NLX1RJTUVPVVRTKQorICAgIHsKKyAgICAgIERCdXNFcnJvciBlcnJvciA9IERCVVNfRVJST1JfSU5JVDsKKworICAgICAgX2RidXNfdmVyYm9zZSAoIkxvY2sgZmlsZSB0aW1lZCBvdXQgJWQgdGltZXMsIGFzc3VtaW5nIHN0YWxlXG4iLAorICAgICAgICAgICAgICAgICAgICAgbl90aW1lb3V0cyk7CisKKyAgICAgIGlmICghX2RidXNfZGVsZXRlX2ZpbGUgKCZrZXlyaW5nLT5maWxlbmFtZV9sb2NrLCAmZXJyb3IpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkNvdWxkbid0IGRlbGV0ZSBvbGQgbG9jayBmaWxlOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvci5tZXNzYWdlKTsKKyAgICAgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIGlmICghX2RidXNfY3JlYXRlX2ZpbGVfZXhjbHVzaXZlbHkgKCZrZXlyaW5nLT5maWxlbmFtZV9sb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJDb3VsZG4ndCBjcmVhdGUgbG9jayBmaWxlIGFmdGVyIGRlbGV0aW5nIHN0YWxlIG9uZTogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IubWVzc2FnZSk7CisgICAgICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKyAgCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorX2RidXNfa2V5cmluZ191bmxvY2sgKERCdXNLZXlyaW5nICprZXlyaW5nKQoreworICBEQnVzRXJyb3IgZXJyb3IgPSBEQlVTX0VSUk9SX0lOSVQ7CisKKyAgaWYgKCFfZGJ1c19kZWxldGVfZmlsZSAoJmtleXJpbmctPmZpbGVuYW1lX2xvY2ssICZlcnJvcikpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkZhaWxlZCB0byBkZWxldGUgbG9jayBmaWxlOiAlcyIsCisgICAgICAgICAgICAgICAgICBlcnJvci5tZXNzYWdlKTsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICB9Cit9CisKK3N0YXRpYyBEQnVzS2V5KgorZmluZF9rZXlfYnlfaWQgKERCdXNLZXkgKmtleXMsCisgICAgICAgICAgICAgICAgaW50ICAgICAgbl9rZXlzLAorICAgICAgICAgICAgICAgIGludCAgICAgIGlkKQoreworICBpbnQgaTsKKworICBpID0gMDsKKyAgd2hpbGUgKGkgPCBuX2tleXMpCisgICAgeworICAgICAgaWYgKGtleXNbaV0uaWQgPT0gaWQpCisgICAgICAgIHJldHVybiAma2V5c1tpXTsKKyAgICAgIAorICAgICAgKytpOworICAgIH0KKworICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGRidXNfYm9vbF90CithZGRfbmV3X2tleSAoREJ1c0tleSAgKiprZXlzX3AsCisgICAgICAgICAgICAgaW50ICAgICAgICpuX2tleXNfcCwKKyAgICAgICAgICAgICBEQnVzRXJyb3IgKmVycm9yKQoreworICBEQnVzS2V5ICpuZXc7CisgIERCdXNTdHJpbmcgYnl0ZXM7CisgIGludCBpZDsKKyAgbG9uZyB0aW1lc3RhbXA7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnM7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgREJ1c0tleSAqa2V5czsKKyAgaW50IG5fa2V5czsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZieXRlcykpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGtleXMgPSAqa2V5c19wOworICBuX2tleXMgPSAqbl9rZXlzX3A7CisgIHJldHZhbCA9IEZBTFNFOworICAgICAgCisgIC8qIEdlbmVyYXRlIGFuIGludGVnZXIgSUQgYW5kIHRoZW4gdGhlIGFjdHVhbCBrZXkuICovCisgcmV0cnk6CisgICAgICAKKyAgaWYgKCFfZGJ1c19nZW5lcmF0ZV9yYW5kb21fYnl0ZXMgKCZieXRlcywgNCwgZXJyb3IpKQorICAgIGdvdG8gb3V0OworCisgIHMgPSAoY29uc3QgdW5zaWduZWQgY2hhciopIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmJ5dGVzKTsKKyAgICAgIAorICBpZCA9IHNbMF0gfCAoc1sxXSA8PCA4KSB8IChzWzJdIDw8IDE2KSB8IChzWzNdIDw8IDI0KTsKKyAgaWYgKGlkIDwgMCkKKyAgICBpZCA9IC0gaWQ7CisgIF9kYnVzX2Fzc2VydCAoaWQgPj0gMCk7CisKKyAgaWYgKGZpbmRfa2V5X2J5X2lkIChrZXlzLCBuX2tleXMsIGlkKSAhPSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoICgmYnl0ZXMsIDApOworICAgICAgX2RidXNfdmVyYm9zZSAoIktleSBJRCAlZCBhbHJlYWR5IGV4aXN0ZWQsIHRyeWluZyBhbm90aGVyIG9uZVxuIiwKKyAgICAgICAgICAgICAgICAgICAgIGlkKTsKKyAgICAgIGdvdG8gcmV0cnk7CisgICAgfQorCisgIF9kYnVzX3ZlcmJvc2UgKCJDcmVhdGluZyBrZXkgd2l0aCBJRCAlZFxuIiwgaWQpOworICAgICAgCisjZGVmaW5lIEtFWV9MRU5HVEhfQllURVMgMjQKKyAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKCZieXRlcywgMCk7CisgIGlmICghX2RidXNfZ2VuZXJhdGVfcmFuZG9tX2J5dGVzICgmYnl0ZXMsIEtFWV9MRU5HVEhfQllURVMsIGVycm9yKSkKKyAgICB7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgbmV3ID0gZGJ1c19yZWFsbG9jIChrZXlzLCBzaXplb2YgKERCdXNLZXkpICogKG5fa2V5cyArIDEpKTsKKyAgaWYgKG5ldyA9PSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIGtleXMgPSBuZXc7CisgICprZXlzX3AgPSBrZXlzOyAvKiBvdGhlcndpc2UgKmtleXNfcCBlbmRzIHVwIGludmFsaWQgKi8KKyAgbl9rZXlzICs9IDE7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmtleXNbbl9rZXlzLTFdLnNlY3JldCkpCisgICAgeworICAgICAgbl9rZXlzIC09IDE7IC8qIHdlIGRvbid0IHdhbnQgdG8gZnJlZSB0aGUgb25lIHdlIGRpZG4ndCBpbml0ICovCisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBfZGJ1c19nZXRfcmVhbF90aW1lICgmdGltZXN0YW1wLCBOVUxMKTsKKyAgICAgIAorICBrZXlzW25fa2V5cy0xXS5pZCA9IGlkOworICBrZXlzW25fa2V5cy0xXS5jcmVhdGlvbl90aW1lID0gdGltZXN0YW1wOworICBpZiAoIV9kYnVzX3N0cmluZ19tb3ZlICgmYnl0ZXMsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXlzW25fa2V5cy0xXS5zZWNyZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIDApKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZrZXlzW25fa2V5cy0xXS5zZWNyZXQpOworICAgICAgbl9rZXlzIC09IDE7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisgIAorICByZXR2YWwgPSBUUlVFOworICAKKyBvdXQ6CisgICpuX2tleXNfcCA9IG5fa2V5czsKKyAgCisgIF9kYnVzX3N0cmluZ19mcmVlICgmYnl0ZXMpOworICByZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIFJlbG9hZHMgdGhlIGtleXJpbmcgZmlsZSwgb3B0aW9uYWxseSBhZGRzIG9uZSBuZXcga2V5IHRvIHRoZSBmaWxlLAorICogcmVtb3ZlcyBhbGwgZXhwaXJlZCBrZXlzIGZyb20gdGhlIGZpbGUgaWZmIGEga2V5IHdhcyBhZGRlZCwgdGhlbgorICogcmVzYXZlcyB0aGUgZmlsZS4gIFN0b3JlcyB0aGUga2V5cyBmcm9tIHRoZSBmaWxlIGluIGtleXJpbmctPmtleXMuCisgKiBOb3RlIHRoYXQgdGhlIGZpbGUgaXMgb25seSByZXNhdmVkICh3cml0dGVuIHRvKSBpZiBhIGtleSBpcyBhZGRlZCwKKyAqIHRoaXMgbWVhbnMgdGhhdCBvbmx5IHNlcnZlcnMgZXZlciB3cml0ZSB0byB0aGUgZmlsZSBhbmQgbmVlZCB0bworICogbG9jayBpdCwgd2hpY2ggYXZvaWRzIGEgbG90IG9mIGxvY2sgY29udGVudGlvbiBhdCBsb2dpbiB0aW1lIGFuZAorICogc3VjaC4KKyAqCisgKiBAcGFyYW0ga2V5cmluZyB0aGUga2V5cmluZworICogQHBhcmFtIGFkZF9uZXcgI1RSVUUgdG8gYWRkIGEgbmV3IGtleSB0byB0aGUgZmlsZSwgZXhwaXJlIGtleXMsIGFuZCByZXNhdmUKKyAqIEBwYXJhbSBlcnJvciByZXR1cm4gbG9jYXRpb24gZm9yIGVycm9ycworICogQHJldHVybnMgI0ZBTFNFIG9uIGZhaWx1cmUKKyAqLworc3RhdGljIGRidXNfYm9vbF90CitfZGJ1c19rZXlyaW5nX3JlbG9hZCAoREJ1c0tleXJpbmcgKmtleXJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgIGFkZF9uZXcsCisgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgKmVycm9yKQoreworICBEQnVzU3RyaW5nIGNvbnRlbnRzOworICBEQnVzU3RyaW5nIGxpbmU7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgZGJ1c19ib29sX3QgaGF2ZV9sb2NrOworICBEQnVzS2V5ICprZXlzOworICBpbnQgbl9rZXlzOworICBpbnQgaTsKKyAgbG9uZyBub3c7CisgIERCdXNFcnJvciB0bXBfZXJyb3I7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisgIAorICBpZiAoIV9kYnVzX2NoZWNrX2Rpcl9pc19wcml2YXRlX3RvX3VzZXIgKCZrZXlyaW5nLT5kaXJlY3RvcnksIGVycm9yKSkKKyAgICByZXR1cm4gRkFMU0U7CisgICAgCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZjb250ZW50cykpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZsaW5lKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmY29udGVudHMpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgIAorICBrZXlzID0gTlVMTDsKKyAgbl9rZXlzID0gMDsKKyAgcmV0dmFsID0gRkFMU0U7CisgIGhhdmVfbG9jayA9IEZBTFNFOworCisgIF9kYnVzX2dldF9yZWFsX3RpbWUgKCZub3csIE5VTEwpOworICAKKyAgaWYgKGFkZF9uZXcpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19rZXlyaW5nX2xvY2sgKGtleXJpbmcpKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBsb2NrIGtleXJpbmcgZmlsZSB0byBhZGQgdG8gaXQiKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICBoYXZlX2xvY2sgPSBUUlVFOworICAgIH0KKworICBkYnVzX2Vycm9yX2luaXQgKCZ0bXBfZXJyb3IpOworICBpZiAoIV9kYnVzX2ZpbGVfZ2V0X2NvbnRlbnRzICgmY29udGVudHMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5cmluZy0+ZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0bXBfZXJyb3IpKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJGYWlsZWQgdG8gbG9hZCBrZXlyaW5nIGZpbGU6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgdG1wX2Vycm9yLm1lc3NhZ2UpOworICAgICAgLyogY29udGludWUgd2l0aCBlbXB0eSBrZXlyaW5nIGZpbGUsIHNvIHdlIHJlY3JlYXRlIGl0ICovCisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZ0bXBfZXJyb3IpOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ192YWxpZGF0ZV9hc2NpaSAoJmNvbnRlbnRzLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZjb250ZW50cykpKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJTZWNyZXQga2V5cmluZyBmaWxlIGNvbnRhaW5zIG5vbi1BU0NJSSEgSWdub3JpbmcgZXhpc3RpbmcgY29udGVudHMiKTsKKyAgICAgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoICgmY29udGVudHMsIDApOworICAgIH0KKworICAvKiBGSVhNRSB0aGlzIGlzIGJhZGx5IGluZWZmaWNpZW50IGZvciBsYXJnZSBrZXlyaW5nIGZpbGVzCisgICAqIChub3QgdGhhdCBsYXJnZSBrZXlyaW5nIGZpbGVzIGV4aXN0IG91dHNpZGUgb2YgdGVzdCBzdWl0ZXMpCisgICAqLworICB3aGlsZSAoX2RidXNfc3RyaW5nX3BvcF9saW5lICgmY29udGVudHMsICZsaW5lKSkKKyAgICB7CisgICAgICBpbnQgbmV4dDsKKyAgICAgIGxvbmcgdmFsOworICAgICAgaW50IGlkOworICAgICAgbG9uZyB0aW1lc3RhbXA7CisgICAgICBpbnQgbGVuOworICAgICAgaW50IGVuZDsKKyAgICAgIERCdXNLZXkgKm5ldzsKKworICAgICAgLyogRG9uJ3QgbG9hZCBtb3JlIHRoYW4gdGhlIG1heC4gKi8KKyAgICAgIGlmIChuX2tleXMgPj0gKGFkZF9uZXcgPyBNQVhfS0VZU19JTl9GSUxFIC0gMSA6IE1BWF9LRVlTX0lOX0ZJTEUpKQorICAgICAgICBicmVhazsKKyAgICAgIAorICAgICAgbmV4dCA9IDA7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19wYXJzZV9pbnQgKCZsaW5lLCAwLCAmdmFsLCAmbmV4dCkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiY291bGQgbm90IHBhcnNlIHNlY3JldCBrZXkgSUQgYXQgc3RhcnQgb2YgbGluZVxuIik7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgaWYgKHZhbCA+IF9EQlVTX0lOVDMyX01BWCB8fCB2YWwgPCAwKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoImludmFsaWQgc2VjcmV0IGtleSBJRCBhdCBzdGFydCBvZiBsaW5lXG4iKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgCisgICAgICBpZCA9IHZhbDsKKworICAgICAgX2RidXNfc3RyaW5nX3NraXBfYmxhbmsgKCZsaW5lLCBuZXh0LCAmbmV4dCk7CisgICAgICAKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX3BhcnNlX2ludCAoJmxpbmUsIG5leHQsICZ0aW1lc3RhbXAsICZuZXh0KSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJjb3VsZCBub3QgcGFyc2Ugc2VjcmV0IGtleSB0aW1lc3RhbXBcbiIpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgIGlmICh0aW1lc3RhbXAgPCAwIHx8CisgICAgICAgICAgKG5vdyArIE1BWF9USU1FX1RSQVZFTF9TRUNPTkRTKSA8IHRpbWVzdGFtcCB8fAorICAgICAgICAgIChub3cgLSBFWFBJUkVfS0VZU19USU1FT1VUX1NFQ09ORFMpID4gdGltZXN0YW1wKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoImRyb3BwaW5nL2lnbm9yaW5nICVsZC1zZWNvbmRzIG9sZCBrZXkgd2l0aCB0aW1lc3RhbXAgJWxkIGFzIGN1cnJlbnQgdGltZSBpcyAlbGRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgbm93IC0gdGltZXN0YW1wLCB0aW1lc3RhbXAsIG5vdyk7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgX2RidXNfc3RyaW5nX3NraXBfYmxhbmsgKCZsaW5lLCBuZXh0LCAmbmV4dCk7CisKKyAgICAgIGxlbiA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmbGluZSk7CisKKyAgICAgIGlmICgobGVuIC0gbmV4dCkgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJubyBzZWNyZXQga2V5IGFmdGVyIElEIGFuZCB0aW1lc3RhbXBcbiIpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAKKyAgICAgIC8qIFdlIGhhdmUgYWxsIHRocmVlIHBhcnRzICovCisgICAgICBuZXcgPSBkYnVzX3JlYWxsb2MgKGtleXMsIHNpemVvZiAoREJ1c0tleSkgKiAobl9rZXlzICsgMSkpOworICAgICAgaWYgKG5ldyA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgICAga2V5cyA9IG5ldzsKKyAgICAgIG5fa2V5cyArPSAxOworCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgma2V5c1tuX2tleXMtMV0uc2VjcmV0KSkKKyAgICAgICAgeworICAgICAgICAgIG5fa2V5cyAtPSAxOyAvKiB3ZSBkb24ndCB3YW50IHRvIGZyZWUgdGhlIG9uZSB3ZSBkaWRuJ3QgaW5pdCAqLworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgICAKKyAgICAgIGtleXNbbl9rZXlzLTFdLmlkID0gaWQ7CisgICAgICBrZXlzW25fa2V5cy0xXS5jcmVhdGlvbl90aW1lID0gdGltZXN0YW1wOworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaGV4X2RlY29kZSAoJmxpbmUsIG5leHQsICZlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5c1tuX2tleXMtMV0uc2VjcmV0LCAwKSkKKwl7CisJICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKwkgIGdvdG8gb3V0OworCX0KKworICAgICAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmbGluZSkgIT0gZW5kKQorCXsKKwkgIF9kYnVzX3ZlcmJvc2UgKCJpbnZhbGlkIGhleCBlbmNvZGluZyBpbiBrZXlyaW5nIGZpbGVcbiIpOworCSAgX2RidXNfc3RyaW5nX2ZyZWUgKCZrZXlzW25fa2V5cyAtIDFdLnNlY3JldCk7CisJICBuX2tleXMgLT0gMTsKKwkgIGNvbnRpbnVlOworCX0KKyAgICB9CisKKyAgX2RidXNfdmVyYm9zZSAoIlN1Y2Nlc3NmdWxseSBsb2FkZWQgJWQgZXhpc3Rpbmcga2V5c1xuIiwKKyAgICAgICAgICAgICAgICAgbl9rZXlzKTsKKworICBpZiAoYWRkX25ldykKKyAgICB7CisgICAgICBpZiAoIWFkZF9uZXdfa2V5ICgma2V5cywgJm5fa2V5cywgZXJyb3IpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkZhaWxlZCB0byBnZW5lcmF0ZSBuZXcga2V5OiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvciA/IGVycm9yLT5tZXNzYWdlIDogIih1bmtub3duKSIpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoICgmY29udGVudHMsIDApOworCisgICAgICBpID0gMDsKKyAgICAgIHdoaWxlIChpIDwgbl9rZXlzKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX2ludCAoJmNvbnRlbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXNbaV0uaWQpKQorICAgICAgICAgICAgZ290byBub21lbTsKKworICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlICgmY29udGVudHMsICcgJykpCisgICAgICAgICAgICBnb3RvIG5vbWVtOworCisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX2ludCAoJmNvbnRlbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXNbaV0uY3JlYXRpb25fdGltZSkpCisgICAgICAgICAgICBnb3RvIG5vbWVtOworCisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX2J5dGUgKCZjb250ZW50cywgJyAnKSkKKyAgICAgICAgICAgIGdvdG8gbm9tZW07CisKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19oZXhfZW5jb2RlICgma2V5c1tpXS5zZWNyZXQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbnRlbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmY29udGVudHMpKSkKKyAgICAgICAgICAgIGdvdG8gbm9tZW07CisKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfYnl0ZSAoJmNvbnRlbnRzLCAnXG4nKSkKKyAgICAgICAgICAgIGdvdG8gbm9tZW07ICAgICAgICAgIAorICAgICAgICAgIAorICAgICAgICAgICsraTsKKyAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBub21lbToKKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgICAgCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19zYXZlX3RvX2ZpbGUgKCZjb250ZW50cywgJmtleXJpbmctPmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSwgZXJyb3IpKQorICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgaWYgKGtleXJpbmctPmtleXMpCisgICAgZnJlZV9rZXlzIChrZXlyaW5nLT5rZXlzLCBrZXlyaW5nLT5uX2tleXMpOworICBrZXlyaW5nLT5rZXlzID0ga2V5czsKKyAga2V5cmluZy0+bl9rZXlzID0gbl9rZXlzOworICBrZXlzID0gTlVMTDsKKyAgbl9rZXlzID0gMDsKKyAgCisgIHJldHZhbCA9IFRSVUU7ICAKKyAgCisgb3V0OgorICBpZiAoaGF2ZV9sb2NrKQorICAgIF9kYnVzX2tleXJpbmdfdW5sb2NrIChrZXlyaW5nKTsKKyAgCisgIGlmICghICgocmV0dmFsID09IFRSVUUgJiYgKGVycm9yID09IE5VTEwgfHwgZXJyb3ItPm5hbWUgPT0gTlVMTCkpIHx8CisgICAgICAgICAocmV0dmFsID09IEZBTFNFICYmIChlcnJvciA9PSBOVUxMIHx8IGVycm9yLT5uYW1lICE9IE5VTEwpKSkpCisgICAgeworICAgICAgaWYgKGVycm9yICYmIGVycm9yLT5uYW1lKQorICAgICAgICBfZGJ1c192ZXJib3NlICgiZXJyb3IgaXMgJXM6ICVzXG4iLCBlcnJvci0+bmFtZSwgZXJyb3ItPm1lc3NhZ2UpOworICAgICAgX2RidXNfd2FybiAoInJldHVybmluZyAlZCBidXQgZXJyb3IgcG9pbnRlciAlcCBuYW1lICVzIiwKKyAgICAgICAgICAgICAgICAgIHJldHZhbCwgZXJyb3IsIGVycm9yLT5uYW1lID8gZXJyb3ItPm5hbWUgOiAiKG5vbmUpIik7CisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJkaWRuJ3QgaGFuZGxlIGVycm9ycyBwcm9wZXJseSIpOworICAgIH0KKyAgCisgIGlmIChrZXlzICE9IE5VTEwpCisgICAgeworICAgICAgaSA9IDA7CisgICAgICB3aGlsZSAoaSA8IG5fa2V5cykKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3N0cmluZ196ZXJvICgma2V5c1tpXS5zZWNyZXQpOworICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgma2V5c1tpXS5zZWNyZXQpOworICAgICAgICAgICsraTsKKyAgICAgICAgfQorCisgICAgICBkYnVzX2ZyZWUgKGtleXMpOworICAgIH0KKyAgCisgIF9kYnVzX3N0cmluZ19mcmVlICgmY29udGVudHMpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmxpbmUpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKKy8qKiBAfSAqLyAvKiBlbmQgb2YgaW50ZXJuYWxzICovCisKKy8qKgorICogQGFkZHRvZ3JvdXAgREJ1c0tleXJpbmcKKyAqCisgKiBAeworICovCisKKy8qKgorICogSW5jcmVtZW50cyByZWZlcmVuY2UgY291bnQgb2YgdGhlIGtleXJpbmcKKyAqCisgKiBAcGFyYW0ga2V5cmluZyB0aGUga2V5cmluZworICogQHJldHVybnMgdGhlIGtleXJpbmcKKyAqLworREJ1c0tleXJpbmcgKgorX2RidXNfa2V5cmluZ19yZWYgKERCdXNLZXlyaW5nICprZXlyaW5nKQoreworICBrZXlyaW5nLT5yZWZjb3VudCArPSAxOworCisgIHJldHVybiBrZXlyaW5nOworfQorCisvKioKKyAqIERlY3JlbWVudHMgcmVmY291bnQgYW5kIGZpbmFsaXplcyBpZiBpdCByZWFjaGVzCisgKiB6ZXJvLgorICoKKyAqIEBwYXJhbSBrZXlyaW5nIHRoZSBrZXlyaW5nCisgKi8KK3ZvaWQKK19kYnVzX2tleXJpbmdfdW5yZWYgKERCdXNLZXlyaW5nICprZXlyaW5nKQoreworICBrZXlyaW5nLT5yZWZjb3VudCAtPSAxOworCisgIGlmIChrZXlyaW5nLT5yZWZjb3VudCA9PSAwKQorICAgIHsKKyAgICAgIGlmIChrZXlyaW5nLT5jcmVkZW50aWFscykKKyAgICAgICAgX2RidXNfY3JlZGVudGlhbHNfdW5yZWYgKGtleXJpbmctPmNyZWRlbnRpYWxzKTsKKworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZrZXlyaW5nLT5maWxlbmFtZSk7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmtleXJpbmctPmZpbGVuYW1lX2xvY2spOworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZrZXlyaW5nLT5kaXJlY3RvcnkpOworICAgICAgZnJlZV9rZXlzIChrZXlyaW5nLT5rZXlzLCBrZXlyaW5nLT5uX2tleXMpOworICAgICAgZGJ1c19mcmVlIChrZXlyaW5nKTsgICAgICAKKyAgICB9Cit9CisKKy8qKgorICogQ3JlYXRlcyBhIG5ldyBrZXlyaW5nIHRoYXQgbGl2ZXMgaW4gdGhlIH4vLmRidXMta2V5cmluZ3MgZGlyZWN0b3J5CisgKiBvZiB0aGUgdXNlciByZXByZXNlbnRlZCBieSBAcCBjcmVkZW50aWFscy4gSWYgdGhlIEBwIGNyZWRlbnRpYWxzIGFyZQorICogI05VTEwgb3IgZW1wdHksIHVzZXMgdGhvc2Ugb2YgdGhlIGN1cnJlbnQgcHJvY2Vzcy4KKyAqCisgKiBAcGFyYW0gY3JlZGVudGlhbHMgYSBzZXQgb2YgY3JlZGVudGlhbHMgcmVwcmVzZW50aW5nIGEgdXNlciBvciAjTlVMTAorICogQHBhcmFtIGNvbnRleHQgd2hpY2gga2V5cmluZyB0byBnZXQKKyAqIEBwYXJhbSBlcnJvciByZXR1cm4gbG9jYXRpb24gZm9yIGVycm9ycworICogQHJldHVybnMgdGhlIGtleXJpbmcgb3IgI05VTEwgb24gZXJyb3IKKyAqLworREJ1c0tleXJpbmcqCitfZGJ1c19rZXlyaW5nX25ld19mb3JfY3JlZGVudGlhbHMgKERCdXNDcmVkZW50aWFscyAgKmNyZWRlbnRpYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgREJ1c1N0cmluZyByaW5nZGlyOworICBEQnVzS2V5cmluZyAqa2V5cmluZzsKKyAgZGJ1c19ib29sX3QgZXJyb3Jfc2V0OworICBEQnVzRXJyb3IgdG1wX2Vycm9yOworICBEQnVzQ3JlZGVudGlhbHMgKm91cl9jcmVkZW50aWFsczsKKyAgCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIGlmIChfZGJ1c19jaGVja19zZXR1aWQgKCkpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3JfY29uc3QgKGVycm9yLCBEQlVTX0VSUk9SX05PVF9TVVBQT1JURUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBjcmVhdGUgREJ1cyBrZXlyaW5nIHdoZW4gc2V0dWlkIik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIAorICBrZXlyaW5nID0gTlVMTDsKKyAgZXJyb3Jfc2V0ID0gRkFMU0U7CisgIG91cl9jcmVkZW50aWFscyA9IE5VTEw7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmcmluZ2RpcikpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgaWYgKGNyZWRlbnRpYWxzICE9IE5VTEwpCisgICAgeworICAgICAgb3VyX2NyZWRlbnRpYWxzID0gX2RidXNfY3JlZGVudGlhbHNfY29weSAoY3JlZGVudGlhbHMpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIG91cl9jcmVkZW50aWFscyA9IF9kYnVzX2NyZWRlbnRpYWxzX25ld19mcm9tX2N1cnJlbnRfcHJvY2VzcyAoKTsKKyAgICB9CisgIAorICBpZiAob3VyX2NyZWRlbnRpYWxzID09IE5VTEwpCisgICAgZ290byBmYWlsZWQ7CisKKyAgaWYgKF9kYnVzX2NyZWRlbnRpYWxzX2FyZV9hbm9ueW1vdXMgKG91cl9jcmVkZW50aWFscykpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19jcmVkZW50aWFsc19hZGRfZnJvbV9jdXJyZW50X3Byb2Nlc3MgKG91cl9jcmVkZW50aWFscykpCisgICAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKyAgCisgIGlmICghX2RidXNfYXBwZW5kX2tleXJpbmdfZGlyZWN0b3J5X2Zvcl9jcmVkZW50aWFscyAoJnJpbmdkaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3VyX2NyZWRlbnRpYWxzKSkKKyAgICBnb3RvIGZhaWxlZDsKKyAgCisgIGtleXJpbmcgPSBfZGJ1c19rZXlyaW5nX25ldyAoKTsKKyAgaWYgKGtleXJpbmcgPT0gTlVMTCkKKyAgICBnb3RvIGZhaWxlZDsKKworICBfZGJ1c19hc3NlcnQgKGtleXJpbmctPmNyZWRlbnRpYWxzID09IE5VTEwpOworICBrZXlyaW5nLT5jcmVkZW50aWFscyA9IG91cl9jcmVkZW50aWFsczsKKyAgb3VyX2NyZWRlbnRpYWxzID0gTlVMTDsgLyogc28gd2UgZG9uJ3QgdW5yZWYgaXQgYWdhaW4gbGF0ZXIgKi8KKyAgCisgIC8qIHNob3VsZCBoYXZlIGJlZW4gdmFsaWRhdGVkIGFscmVhZHksIGJ1dCBwYXJhbm9pYSBjaGVjayBoZXJlICovCisgIGlmICghX2RidXNfa2V5cmluZ192YWxpZGF0ZV9jb250ZXh0IChjb250ZXh0KSkKKyAgICB7CisgICAgICBlcnJvcl9zZXQgPSBUUlVFOworICAgICAgZGJ1c19zZXRfZXJyb3JfY29uc3QgKGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGNvbnRleHQgaW4ga2V5cmluZyBjcmVhdGlvbiIpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIC8qIFNhdmUga2V5cmluZyBkaXIgaW4gdGhlIGtleXJpbmcgb2JqZWN0ICovCisgIGlmICghX2RidXNfc3RyaW5nX2NvcHkgKCZyaW5nZGlyLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5cmluZy0+ZGlyZWN0b3J5LCAwKSkKKyAgICBnb3RvIGZhaWxlZDsgIAorCisgIC8qIENyZWF0ZSBrZXlyaW5nLT5maWxlbmFtZSBiYXNlZCBvbiBrZXlyaW5nIGRpciBhbmQgY29udGV4dCAqLworICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5ICgma2V5cmluZy0+ZGlyZWN0b3J5LCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5cmluZy0+ZmlsZW5hbWUsIDApKQorICAgIGdvdG8gZmFpbGVkOworCisgIGlmICghX2RidXNfY29uY2F0X2Rpcl9hbmRfZmlsZSAoJmtleXJpbmctPmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQpKQorICAgIGdvdG8gZmFpbGVkOworCisgIC8qIENyZWF0ZSBsb2NrZmlsZSBuYW1lICovCisgIGlmICghX2RidXNfc3RyaW5nX2NvcHkgKCZrZXlyaW5nLT5maWxlbmFtZSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleXJpbmctPmZpbGVuYW1lX2xvY2ssIDApKQorICAgIGdvdG8gZmFpbGVkOworCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmtleXJpbmctPmZpbGVuYW1lX2xvY2ssICIubG9jayIpKQorICAgIGdvdG8gZmFpbGVkOworCisgIC8qIFJlbG9hZCBrZXlyaW5nICovCisgIGRidXNfZXJyb3JfaW5pdCAoJnRtcF9lcnJvcik7CisgIGlmICghX2RidXNfa2V5cmluZ19yZWxvYWQgKGtleXJpbmcsIEZBTFNFLCAmdG1wX2Vycm9yKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiZGlkbid0IGxvYWQgYW4gZXhpc3Rpbmcga2V5cmluZzogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICB0bXBfZXJyb3IubWVzc2FnZSk7CisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZ0bXBfZXJyb3IpOworICAgIH0KKyAgCisgIC8qIFdlIGRvbid0IGZhaWwgZmF0YWxseSBpZiB3ZSBjYW4ndCBjcmVhdGUgdGhlIGRpcmVjdG9yeSwKKyAgICogYnV0IHRoZSBrZXlyaW5nIHdpbGwgcHJvYmFibHkgYWx3YXlzIGJlIGVtcHR5CisgICAqIHVubGVzcyBzb21lb25lIGVsc2UgbWFuYWdlcyB0byBjcmVhdGUgaXQKKyAgICovCisgIGRidXNfZXJyb3JfaW5pdCAoJnRtcF9lcnJvcik7CisgIGlmICghX2RidXNfZW5zdXJlX2RpcmVjdG9yeSAoJmtleXJpbmctPmRpcmVjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1wX2Vycm9yKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiQ3JlYXRpbmcga2V5cmluZyBkaXJlY3Rvcnk6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgdG1wX2Vycm9yLm1lc3NhZ2UpOworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmdG1wX2Vycm9yKTsKKyAgICB9CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZyaW5nZGlyKTsKKyAgCisgIHJldHVybiBrZXlyaW5nOworICAKKyBmYWlsZWQ6CisgIGlmICghZXJyb3Jfc2V0KQorICAgIGRidXNfc2V0X2Vycm9yX2NvbnN0IChlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9OT19NRU1PUlksCisgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICBpZiAob3VyX2NyZWRlbnRpYWxzKQorICAgIF9kYnVzX2NyZWRlbnRpYWxzX3VucmVmIChvdXJfY3JlZGVudGlhbHMpOworICBpZiAoa2V5cmluZykKKyAgICBfZGJ1c19rZXlyaW5nX3VucmVmIChrZXlyaW5nKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZyaW5nZGlyKTsKKyAgcmV0dXJuIE5VTEw7CisKK30KKworLyoqCisgKiBDaGVja3Mgd2hldGhlciB0aGUgY29udGV4dCBpcyBhIHZhbGlkIGNvbnRleHQuCisgKiBDb250ZXh0cyB0aGF0IG1pZ2h0IGNhdXNlIGNvbmZ1c2lvbiB3aGVuIHVzZWQKKyAqIGluIGZpbGVuYW1lcyBhcmUgbm90IGFsbG93ZWQgKGNvbnRleHRzIGNhbid0CisgKiBzdGFydCB3aXRoIGEgZG90IG9yIGNvbnRhaW4gZGlyIHNlcGFyYXRvcnMpLgorICoKKyAqIEB0b2RvIHRoaXMgaXMgdGhlIG1vc3QgaW5lZmZpY2llbnQgaW1wbGVtZW50YXRpb24KKyAqIGltYWdpbmFibGUuCisgKgorICogQHBhcmFtIGNvbnRleHQgdGhlIGNvbnRleHQKKyAqIEByZXR1cm5zICNUUlVFIGlmIHZhbGlkCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19rZXlyaW5nX3ZhbGlkYXRlX2NvbnRleHQgKGNvbnN0IERCdXNTdHJpbmcgKmNvbnRleHQpCit7CisgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoY29udGV4dCkgPT0gMCkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiY29udGV4dCBpcyB6ZXJvLWxlbmd0aFxuIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX3ZhbGlkYXRlX2FzY2lpIChjb250ZXh0LCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGNvbnRleHQpKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiY29udGV4dCBub3QgdmFsaWQgYXNjaWlcbiIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgCisgIC8qIG5vIGRpcmVjdG9yeSBzZXBhcmF0b3JzICovICAKKyAgaWYgKF9kYnVzX3N0cmluZ19maW5kIChjb250ZXh0LCAwLCAiLyIsIE5VTEwpKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJjb250ZXh0IGNvbnRhaW5zIGEgc2xhc2hcbiIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoX2RidXNfc3RyaW5nX2ZpbmQgKGNvbnRleHQsIDAsICJcXCIsIE5VTEwpKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJjb250ZXh0IGNvbnRhaW5zIGEgYmFja3NsYXNoXG4iKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgLyogcHJldmVudCBhdHRlbXB0cyB0byB1c2UgZG90ZmlsZXMgb3IgIi4uIiBvciAiLmxvY2siCisgICAqIGFsbCBvZiB3aGljaCBtaWdodCBhbGxvdyBzb21lIGtpbmQgb2YgYXR0YWNrCisgICAqLworICBpZiAoX2RidXNfc3RyaW5nX2ZpbmQgKGNvbnRleHQsIDAsICIuIiwgTlVMTCkpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoImNvbnRleHQgY29udGFpbnMgYSBkb3RcbiIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAvKiBubyBzcGFjZXMvdGFicywgdGhvc2UgYXJlIHVzZWQgZm9yIHNlcGFyYXRvcnMgaW4gdGhlIHByb3RvY29sICovCisgIGlmIChfZGJ1c19zdHJpbmdfZmluZF9ibGFuayAoY29udGV4dCwgMCwgTlVMTCkpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoImNvbnRleHQgY29udGFpbnMgYSBibGFua1xuIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmIChfZGJ1c19zdHJpbmdfZmluZCAoY29udGV4dCwgMCwgIlxuIiwgTlVMTCkpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoImNvbnRleHQgY29udGFpbnMgYSBuZXdsaW5lXG4iKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKF9kYnVzX3N0cmluZ19maW5kIChjb250ZXh0LCAwLCAiXHIiLCBOVUxMKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiY29udGV4dCBjb250YWlucyBhIGNhcnJpYWdlIHJldHVyblxuIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBEQnVzS2V5KgorZmluZF9yZWNlbnRfa2V5IChEQnVzS2V5cmluZyAqa2V5cmluZykKK3sKKyAgaW50IGk7CisgIGxvbmcgdHZfc2VjLCB0dl91c2VjOworCisgIF9kYnVzX2dldF9yZWFsX3RpbWUgKCZ0dl9zZWMsICZ0dl91c2VjKTsKKyAgCisgIGkgPSAwOworICB3aGlsZSAoaSA8IGtleXJpbmctPm5fa2V5cykKKyAgICB7CisgICAgICBEQnVzS2V5ICprZXkgPSAma2V5cmluZy0+a2V5c1tpXTsKKworICAgICAgX2RidXNfdmVyYm9zZSAoIktleSAlZCBpcyAlbGQgc2Vjb25kcyBvbGRcbiIsCisgICAgICAgICAgICAgICAgICAgICBpLCB0dl9zZWMgLSBrZXktPmNyZWF0aW9uX3RpbWUpOworICAgICAgCisgICAgICBpZiAoKHR2X3NlYyAtIE5FV19LRVlfVElNRU9VVF9TRUNPTkRTKSA8IGtleS0+Y3JlYXRpb25fdGltZSkKKyAgICAgICAgcmV0dXJuIGtleTsKKyAgICAgIAorICAgICAgKytpOworICAgIH0KKworICByZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiBHZXRzIGEgcmVjZW50IGtleSB0byB1c2UgZm9yIGF1dGhlbnRpY2F0aW9uLgorICogSWYgbm8gcmVjZW50IGtleSBleGlzdHMsIGNyZWF0ZXMgb25lLiBSZXR1cm5zCisgKiB0aGUga2V5IElELiBJZiBhIGtleSBjYW4ndCBiZSB3cml0dGVuIHRvIHRoZSBrZXlyaW5nCisgKiBmaWxlIHNvIG5vIHJlY2VudCBrZXkgY2FuIGJlIGNyZWF0ZWQsIHJldHVybnMgLTEuCisgKiBBbGwgdmFsaWQga2V5cyBhcmUgPiAwLgorICoKKyAqIEBwYXJhbSBrZXlyaW5nIHRoZSBrZXlyaW5nCisgKiBAcGFyYW0gZXJyb3IgZXJyb3Igb24gZmFpbHVyZQorICogQHJldHVybnMga2V5IElEIHRvIHVzZSBmb3IgYXV0aCwgb3IgLTEgb24gZmFpbHVyZQorICovCitpbnQKK19kYnVzX2tleXJpbmdfZ2V0X2Jlc3Rfa2V5IChEQnVzS2V5cmluZyAgKmtleXJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICplcnJvcikKK3sKKyAgREJ1c0tleSAqa2V5OworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworICAKKyAga2V5ID0gZmluZF9yZWNlbnRfa2V5IChrZXlyaW5nKTsKKyAgaWYgKGtleSkKKyAgICByZXR1cm4ga2V5LT5pZDsKKworICAvKiBBbGwgb3VyIGtleXMgYXJlIHRvbyBvbGQsIG9yIHdlJ3ZlIG5ldmVyIGxvYWRlZCB0aGUKKyAgICoga2V5cmluZy4gQ3JlYXRlIGEgbmV3IG9uZS4KKyAgICovCisgIGlmICghX2RidXNfa2V5cmluZ19yZWxvYWQgKGtleXJpbmcsIFRSVUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkKKyAgICByZXR1cm4gLTE7CisKKyAga2V5ID0gZmluZF9yZWNlbnRfa2V5IChrZXlyaW5nKTsKKyAgaWYgKGtleSkKKyAgICByZXR1cm4ga2V5LT5pZDsKKyAgZWxzZQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yX2NvbnN0IChlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm8gcmVjZW50LWVub3VnaCBrZXkgZm91bmQgaW4ga2V5cmluZywgYW5kIHVuYWJsZSB0byBjcmVhdGUgYSBuZXcga2V5Iik7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorfQorCisvKioKKyAqIENoZWNrcyB3aGV0aGVyIHRoZSBrZXlyaW5nIGlzIGZvciB0aGUgc2FtZSB1c2VyIGFzIHRoZSBnaXZlbiBjcmVkZW50aWFscy4KKyAqCisgKiBAcGFyYW0ga2V5cmluZyB0aGUga2V5cmluZworICogQHBhcmFtIGNyZWRlbnRpYWxzIHRoZSBjcmVkZW50aWFscyB0byBjaGVjaworICoKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSBrZXlyaW5nIGJlbG9uZ3MgdG8gdGhlIGdpdmVuIHVzZXIKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2tleXJpbmdfaXNfZm9yX2NyZWRlbnRpYWxzIChEQnVzS2V5cmluZyAgICAgICAgICAgKmtleXJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0NyZWRlbnRpYWxzICAgICAgICpjcmVkZW50aWFscykKK3sKKyAgcmV0dXJuIF9kYnVzX2NyZWRlbnRpYWxzX3NhbWVfdXNlciAoa2V5cmluZy0+Y3JlZGVudGlhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWRlbnRpYWxzKTsKK30KKworLyoqCisgKiBHZXRzIHRoZSBoZXgtZW5jb2RlZCBzZWNyZXQga2V5IGZvciB0aGUgZ2l2ZW4gSUQuCisgKiBSZXR1cm5zICNGQUxTRSBpZiBub3QgZW5vdWdoIG1lbW9yeS4gUmV0dXJucyAjVFJVRQorICogYnV0IGVtcHR5IGtleSBvbiBhbnkgb3RoZXIgZXJyb3Igc3VjaCBhcyB1bmtub3duCisgKiBrZXkgSUQuCisgKgorICogQHBhcmFtIGtleXJpbmcgdGhlIGtleXJpbmcKKyAqIEBwYXJhbSBrZXlfaWQgdGhlIGtleSBJRAorICogQHBhcmFtIGhleF9rZXkgc3RyaW5nIHRvIGFwcGVuZCBoZXgtZW5jb2RlZCBrZXkgdG8KKyAqIEByZXR1cm5zICNUUlVFIGlmIHdlIGhhZCBlbm91Z2ggbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19rZXlyaW5nX2dldF9oZXhfa2V5IChEQnVzS2V5cmluZyAgICAgICAqa2V5cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBrZXlfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICAqaGV4X2tleSkKK3sKKyAgREJ1c0tleSAqa2V5OworCisgIGtleSA9IGZpbmRfa2V5X2J5X2lkIChrZXlyaW5nLT5rZXlzLAorICAgICAgICAgICAgICAgICAgICAgICAga2V5cmluZy0+bl9rZXlzLAorICAgICAgICAgICAgICAgICAgICAgICAga2V5X2lkKTsKKyAgaWYgKGtleSA9PSBOVUxMKQorICAgIHJldHVybiBUUlVFOyAvKiBoYWQgZW5vdWdoIG1lbW9yeSwgc28gVFJVRSAqLworCisgIHJldHVybiBfZGJ1c19zdHJpbmdfaGV4X2VuY29kZSAoJmtleS0+c2VjcmV0LCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhleF9rZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGhleF9rZXkpKTsKK30KKworLyoqIEB9ICovIC8qIGVuZCBvZiBleHBvc2VkIEFQSSAqLworCisjaWZkZWYgREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMKKyNpbmNsdWRlICJkYnVzLXRlc3QuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorCitkYnVzX2Jvb2xfdAorX2RidXNfa2V5cmluZ190ZXN0ICh2b2lkKQoreworICBEQnVzU3RyaW5nIGNvbnRleHQ7CisgIERCdXNLZXlyaW5nICpyaW5nMTsKKyAgREJ1c0tleXJpbmcgKnJpbmcyOworICBpbnQgaWQ7CisgIERCdXNFcnJvciBlcnJvcjsKKyAgaW50IGk7CisKKyAgcmluZzEgPSBOVUxMOworICByaW5nMiA9IE5VTEw7CisgIAorICAvKiBDb250ZXh0IHZhbGlkYXRpb24gKi8KKyAgCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmY29udGV4dCwgImZvbyIpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX2tleXJpbmdfdmFsaWRhdGVfY29udGV4dCAoJmNvbnRleHQpKTsKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZjb250ZXh0LCAib3JnX2ZyZWVkZXNrdG9wX2JsYWgiKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19rZXlyaW5nX3ZhbGlkYXRlX2NvbnRleHQgKCZjb250ZXh0KSk7CisgIAorICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJmNvbnRleHQsICIiKTsKKyAgX2RidXNfYXNzZXJ0ICghX2RidXNfa2V5cmluZ192YWxpZGF0ZV9jb250ZXh0ICgmY29udGV4dCkpOworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJmNvbnRleHQsICIuZm9vIik7CisgIF9kYnVzX2Fzc2VydCAoIV9kYnVzX2tleXJpbmdfdmFsaWRhdGVfY29udGV4dCAoJmNvbnRleHQpKTsKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZjb250ZXh0LCAiYmFyLmZvbyIpOworICBfZGJ1c19hc3NlcnQgKCFfZGJ1c19rZXlyaW5nX3ZhbGlkYXRlX2NvbnRleHQgKCZjb250ZXh0KSk7CisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmY29udGV4dCwgImJhci9mb28iKTsKKyAgX2RidXNfYXNzZXJ0ICghX2RidXNfa2V5cmluZ192YWxpZGF0ZV9jb250ZXh0ICgmY29udGV4dCkpOworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJmNvbnRleHQsICJiYXJcXGZvbyIpOworICBfZGJ1c19hc3NlcnQgKCFfZGJ1c19rZXlyaW5nX3ZhbGlkYXRlX2NvbnRleHQgKCZjb250ZXh0KSk7CisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmY29udGV4dCwgImZvb1x4ZmFceGYwIik7CisgIF9kYnVzX2Fzc2VydCAoIV9kYnVzX2tleXJpbmdfdmFsaWRhdGVfY29udGV4dCAoJmNvbnRleHQpKTsKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZjb250ZXh0LCAiZm9vXHg4MCIpOworICBfZGJ1c19hc3NlcnQgKCFfZGJ1c19rZXlyaW5nX3ZhbGlkYXRlX2NvbnRleHQgKCZjb250ZXh0KSk7CisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmY29udGV4dCwgImZvb1x4N2YiKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19rZXlyaW5nX3ZhbGlkYXRlX2NvbnRleHQgKCZjb250ZXh0KSk7CisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmY29udGV4dCwgImZvbyBiYXIiKTsKKyAgX2RidXNfYXNzZXJ0ICghX2RidXNfa2V5cmluZ192YWxpZGF0ZV9jb250ZXh0ICgmY29udGV4dCkpOworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmNvbnRleHQpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfYnl0ZSAoJmNvbnRleHQsICdcMCcpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOworICBfZGJ1c19hc3NlcnQgKCFfZGJ1c19rZXlyaW5nX3ZhbGlkYXRlX2NvbnRleHQgKCZjb250ZXh0KSk7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmY29udGV4dCk7CisKKyAgLyogTm93IHZlcmlmeSB0aGF0IGlmIHdlIGNyZWF0ZSBhIGtleSBpbiBrZXlyaW5nIDEsCisgICAqIGl0IGlzIHByb3Blcmx5IGxvYWRlZCBpbiBrZXlyaW5nIDIKKyAgICovCisKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZjb250ZXh0LCAib3JnX2ZyZWVkZXNrdG9wX2RidXNfdGVzdHN1aXRlIik7CisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKyAgcmluZzEgPSBfZGJ1c19rZXlyaW5nX25ld19mb3JfY3JlZGVudGlhbHMgKE5VTEwsICZjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKTsKKyAgX2RidXNfYXNzZXJ0IChyaW5nMSAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChlcnJvci5uYW1lID09IE5VTEwpOworCisgIGlkID0gX2RidXNfa2V5cmluZ19nZXRfYmVzdF9rZXkgKHJpbmcxLCAmZXJyb3IpOworICBpZiAoaWQgPCAwKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIkNvdWxkIG5vdCBsb2FkIGtleXJpbmc6ICVzXG4iLCBlcnJvci5tZXNzYWdlKTsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgIGdvdG8gZmFpbHVyZTsKKyAgICB9CisKKyAgcmluZzIgPSBfZGJ1c19rZXlyaW5nX25ld19mb3JfY3JlZGVudGlhbHMgKE5VTEwsICZjb250ZXh0LCAmZXJyb3IpOworICBfZGJ1c19hc3NlcnQgKHJpbmcyICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKGVycm9yLm5hbWUgPT0gTlVMTCk7CisgIAorICBpZiAocmluZzEtPm5fa2V5cyAhPSByaW5nMi0+bl9rZXlzKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIkRpZmZlcmVudCBudW1iZXIgb2Yga2V5cyBpbiBrZXlyaW5nc1xuIik7CisgICAgICBnb3RvIGZhaWx1cmU7CisgICAgfQorCisgIC8qIFdlIGd1YXJhbnRlZSB3ZSBsb2FkIGFuZCBzYXZlIGtlZXBpbmcga2V5cyBpbiBhIGZpeGVkCisgICAqIG9yZGVyCisgICAqLworICBpID0gMDsKKyAgd2hpbGUgKGkgPCByaW5nMS0+bl9rZXlzKQorICAgIHsKKyAgICAgIGlmIChyaW5nMS0+a2V5c1tpXS5pZCAhPSByaW5nMi0+a2V5c1tpXS5pZCkKKyAgICAgICAgeworICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIktleXJpbmcgMSBoYXMgZmlyc3Qga2V5IElEICVkIGFuZCBrZXlyaW5nIDIgaGFzICVkXG4iLAorICAgICAgICAgICAgICAgICAgIHJpbmcxLT5rZXlzW2ldLmlkLCByaW5nMi0+a2V5c1tpXS5pZCk7CisgICAgICAgICAgZ290byBmYWlsdXJlOworICAgICAgICB9ICAgICAgCisKKyAgICAgIGlmIChyaW5nMS0+a2V5c1tpXS5jcmVhdGlvbl90aW1lICE9IHJpbmcyLT5rZXlzW2ldLmNyZWF0aW9uX3RpbWUpCisgICAgICAgIHsKKyAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJLZXlyaW5nIDEgaGFzIGZpcnN0IGtleSB0aW1lICVsZCBhbmQga2V5cmluZyAyIGhhcyAlbGRcbiIsCisgICAgICAgICAgICAgICAgICAgcmluZzEtPmtleXNbaV0uY3JlYXRpb25fdGltZSwgcmluZzItPmtleXNbaV0uY3JlYXRpb25fdGltZSk7CisgICAgICAgICAgZ290byBmYWlsdXJlOworICAgICAgICB9CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2VxdWFsICgmcmluZzEtPmtleXNbaV0uc2VjcmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyaW5nMi0+a2V5c1tpXS5zZWNyZXQpKQorICAgICAgICB7CisgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiS2V5cmluZ3MgMSBhbmQgMiBoYXZlIGRpZmZlcmVudCBzZWNyZXRzIGZvciBzYW1lIElEL3RpbWVzdGFtcFxuIik7CisgICAgICAgICAgZ290byBmYWlsdXJlOworICAgICAgICB9CisgICAgICAKKyAgICAgICsraTsKKyAgICB9CisKKyAgcHJpbnRmICgiICVkIGtleXMgaW4gdGVzdFxuIiwgcmluZzEtPm5fa2V5cyk7CisKKyAgLyogVGVzdCByZWYvdW5yZWYgKi8KKyAgX2RidXNfa2V5cmluZ19yZWYgKHJpbmcxKTsKKyAgX2RidXNfa2V5cmluZ19yZWYgKHJpbmcyKTsKKyAgX2RidXNfa2V5cmluZ191bnJlZiAocmluZzEpOworICBfZGJ1c19rZXlyaW5nX3VucmVmIChyaW5nMik7CisKKworICAvKiByZWFsbHkgdW5yZWYgKi8KKyAgX2RidXNfa2V5cmluZ191bnJlZiAocmluZzEpOworICBfZGJ1c19rZXlyaW5nX3VucmVmIChyaW5nMik7CisgIAorICByZXR1cm4gVFJVRTsKKworIGZhaWx1cmU6CisgIGlmIChyaW5nMSkKKyAgICBfZGJ1c19rZXlyaW5nX3VucmVmIChyaW5nMSk7CisgIGlmIChyaW5nMikKKyAgICBfZGJ1c19rZXlyaW5nX3VucmVmIChyaW5nMik7CisKKyAgcmV0dXJuIEZBTFNFOworfQorCisjZW5kaWYgLyogREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMgKi8KKyAgICAgCmRpZmYgLS1naXQgYS9kYnVzL2RidXMta2V5cmluZy5oIGIvZGJ1cy9kYnVzLWtleXJpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDBlMzFiCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLWtleXJpbmcuaApAQCAtMCwwICsxLDUyIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMta2V5cmluZy5oIFN0b3JlIHNlY3JldCBjb29raWVzIGluIHlvdXIgaG9tZWRpcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaWZuZGVmIERCVVNfS0VZUklOR19ICisjZGVmaW5lIERCVVNfS0VZUklOR19ICisKKyNpbmNsdWRlIDxkYnVzL2RidXMtbWFjcm9zLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWVycm9ycy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zdHJpbmcuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtY3JlZGVudGlhbHMuaD4KKworREJVU19CRUdJTl9ERUNMUworCit0eXBlZGVmIHN0cnVjdCBEQnVzS2V5cmluZyBEQnVzS2V5cmluZzsKKworREJ1c0tleXJpbmcqIF9kYnVzX2tleXJpbmdfbmV3X2Zvcl9jcmVkZW50aWFscyAoREJ1c0NyZWRlbnRpYWxzICAqY3JlZGVudGlhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpOworREJ1c0tleXJpbmcqIF9kYnVzX2tleXJpbmdfcmVmICAgICAgICAgICAgICAgICAoREJ1c0tleXJpbmcgICAgICAqa2V5cmluZyk7Cit2b2lkICAgICAgICAgX2RidXNfa2V5cmluZ191bnJlZiAgICAgICAgICAgICAgIChEQnVzS2V5cmluZyAgICAgICprZXlyaW5nKTsKK2RidXNfYm9vbF90ICBfZGJ1c19rZXlyaW5nX3ZhbGlkYXRlX2NvbnRleHQgICAgKGNvbnN0IERCdXNTdHJpbmcgKmNvbnRleHQpOworaW50ICAgICAgICAgIF9kYnVzX2tleXJpbmdfZ2V0X2Jlc3Rfa2V5ICAgICAgICAoREJ1c0tleXJpbmcgICAgICAqa2V5cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKTsKK2RidXNfYm9vbF90ICBfZGJ1c19rZXlyaW5nX2lzX2Zvcl9jcmVkZW50aWFscyAgKERCdXNLZXlyaW5nICAgICAgKmtleXJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ3JlZGVudGlhbHMgICpjcmVkZW50aWFscyk7CitkYnVzX2Jvb2xfdCAgX2RidXNfa2V5cmluZ19nZXRfaGV4X2tleSAgICAgICAgIChEQnVzS2V5cmluZyAgICAgICprZXlyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAga2V5X2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAqaGV4X2tleSk7CisKKworREJVU19FTkRfREVDTFMKKworI2VuZGlmIC8qIERCVVNfS0VZUklOR19IICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtbGlzdC5jIGIvZGJ1cy9kYnVzLWxpc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTcxM2MwCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLWxpc3QuYwpAQCAtMCwwICsxLDEzNjUgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1saXN0LmMgR2VuZXJpYyBsaW5rZWQgbGlzdCB1dGlsaXR5IChpbnRlcm5hbCB0byBELUJ1cyBpbXBsZW1lbnRhdGlvbikKKyAqIAorICogQ29weXJpZ2h0IChDKSAyMDAyICBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLWludGVybmFscy5oIgorI2luY2x1ZGUgImRidXMtbGlzdC5oIgorI2luY2x1ZGUgImRidXMtbWVtcG9vbC5oIgorI2luY2x1ZGUgImRidXMtdGhyZWFkcy1pbnRlcm5hbC5oIgorCisvKioKKyAqIEBkZWZncm91cCBEQnVzTGlzdCBMaW5rZWQgbGlzdAorICogQGluZ3JvdXAgIERCdXNJbnRlcm5hbHMKKyAqIEBicmllZiBEQnVzTGlzdCBkYXRhIHN0cnVjdHVyZQorICoKKyAqIFR5cGVzIGFuZCBmdW5jdGlvbnMgcmVsYXRlZCB0byBEQnVzTGlzdC4KKyAqLworCisvKiBQcm90ZWN0ZWQgYnkgX0RCVVNfTE9DSyAobGlzdCkgKi8KK3N0YXRpYyBEQnVzTWVtUG9vbCAqbGlzdF9wb29sOworCisvKioKKyAqIEBkZWZncm91cCBEQnVzTGlzdEludGVybmFscyBMaW5rZWQgbGlzdCBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzCisgKiBAaW5ncm91cCAgREJ1c0ludGVybmFscworICogQGJyaWVmIERCdXNMaXN0IGltcGxlbWVudGF0aW9uIGRldGFpbHMKKyAqCisgKiBUaGUgZ3V0cyBvZiBEQnVzTGlzdC4KKyAqCisgKiBAeworICovCisKKy8qIHRoZSBtZW0gcG9vbCBpcyBwcm9iYWJseSBhIHNwZWVkIGhpdCwgd2l0aCB0aGUgdGhyZWFkCisgKiBsb2NrLCB0aG91Z2ggaXQgZG9lcyBzdGlsbCBzYXZlIG1lbW9yeSAtIHVua25vd24uCisgKi8KK3N0YXRpYyBEQnVzTGlzdCoKK2FsbG9jX2xpbmsgKHZvaWQgKmRhdGEpCit7CisgIERCdXNMaXN0ICpsaW5rOworCisgIGlmICghX0RCVVNfTE9DSyAobGlzdCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmIChsaXN0X3Bvb2wgPT0gTlVMTCkKKyAgICB7ICAgICAgCisgICAgICBsaXN0X3Bvb2wgPSBfZGJ1c19tZW1fcG9vbF9uZXcgKHNpemVvZiAoREJ1c0xpc3QpLCBUUlVFKTsKKworICAgICAgaWYgKGxpc3RfcG9vbCA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgX0RCVVNfVU5MT0NLIChsaXN0KTsKKyAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICBsaW5rID0gX2RidXNfbWVtX3Bvb2xfYWxsb2MgKGxpc3RfcG9vbCk7CisgICAgICBpZiAobGluayA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfbWVtX3Bvb2xfZnJlZSAobGlzdF9wb29sKTsKKyAgICAgICAgICBsaXN0X3Bvb2wgPSBOVUxMOworICAgICAgICAgIF9EQlVTX1VOTE9DSyAobGlzdCk7CisgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBsaW5rID0gX2RidXNfbWVtX3Bvb2xfYWxsb2MgKGxpc3RfcG9vbCk7CisgICAgfQorCisgIGlmIChsaW5rKQorICAgIGxpbmstPmRhdGEgPSBkYXRhOworICAKKyAgX0RCVVNfVU5MT0NLIChsaXN0KTsKKworICByZXR1cm4gbGluazsKK30KKworc3RhdGljIHZvaWQKK2ZyZWVfbGluayAoREJ1c0xpc3QgKmxpbmspCit7ICAKKyAgaWYgKCFfREJVU19MT0NLIChsaXN0KSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJ3ZSBzaG91bGQgaGF2ZSBpbml0aWFsaXplZCBnbG9iYWwgbG9ja3MgIgorICAgICAgICAiYmVmb3JlIHdlIGFsbG9jYXRlZCBhIGxpbmtlZC1saXN0IGxpbmsiKTsKKworICBpZiAoX2RidXNfbWVtX3Bvb2xfZGVhbGxvYyAobGlzdF9wb29sLCBsaW5rKSkKKyAgICB7CisgICAgICBfZGJ1c19tZW1fcG9vbF9mcmVlIChsaXN0X3Bvb2wpOworICAgICAgbGlzdF9wb29sID0gTlVMTDsKKyAgICB9CisgIAorICBfREJVU19VTkxPQ0sgKGxpc3QpOworfQorCitzdGF0aWMgdm9pZAorbGlua19iZWZvcmUgKERCdXNMaXN0ICoqbGlzdCwKKyAgICAgICAgICAgICBEQnVzTGlzdCAgKmJlZm9yZV90aGlzX2xpbmssCisgICAgICAgICAgICAgREJ1c0xpc3QgICpsaW5rKQoreworICBpZiAoKmxpc3QgPT0gTlVMTCkKKyAgICB7CisgICAgICBsaW5rLT5wcmV2ID0gbGluazsKKyAgICAgIGxpbmstPm5leHQgPSBsaW5rOworICAgICAgKmxpc3QgPSBsaW5rOworICAgIH0KKyAgZWxzZQorICAgIHsgICAgICAKKyAgICAgIGxpbmstPm5leHQgPSBiZWZvcmVfdGhpc19saW5rOworICAgICAgbGluay0+cHJldiA9IGJlZm9yZV90aGlzX2xpbmstPnByZXY7CisgICAgICBiZWZvcmVfdGhpc19saW5rLT5wcmV2ID0gbGluazsKKyAgICAgIGxpbmstPnByZXYtPm5leHQgPSBsaW5rOworICAgICAgCisgICAgICBpZiAoYmVmb3JlX3RoaXNfbGluayA9PSAqbGlzdCkKKyAgICAgICAgKmxpc3QgPSBsaW5rOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK2xpbmtfYWZ0ZXIgKERCdXNMaXN0ICoqbGlzdCwKKyAgICAgICAgICAgIERCdXNMaXN0ICAqYWZ0ZXJfdGhpc19saW5rLAorICAgICAgICAgICAgREJ1c0xpc3QgICpsaW5rKQoreworICBpZiAoKmxpc3QgPT0gTlVMTCkKKyAgICB7CisgICAgICBsaW5rLT5wcmV2ID0gbGluazsKKyAgICAgIGxpbmstPm5leHQgPSBsaW5rOworICAgICAgKmxpc3QgPSBsaW5rOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGxpbmstPnByZXYgPSBhZnRlcl90aGlzX2xpbms7CisgICAgICBsaW5rLT5uZXh0ID0gYWZ0ZXJfdGhpc19saW5rLT5uZXh0OworICAgICAgYWZ0ZXJfdGhpc19saW5rLT5uZXh0ID0gbGluazsKKyAgICAgIGxpbmstPm5leHQtPnByZXYgPSBsaW5rOworICAgIH0KK30KKworI2lmZGVmIERCVVNfRU5BQkxFX1NUQVRTCit2b2lkCitfZGJ1c19saXN0X2dldF9zdGF0cyAgICAgKGRidXNfdWludDMyX3QgKmluX3VzZV9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90ICppbl9mcmVlX2xpc3RfcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAqYWxsb2NhdGVkX3ApCit7CisgIGlmICghX0RCVVNfTE9DSyAobGlzdCkpCisgICAgeworICAgICAgKmluX3VzZV9wID0gMDsKKyAgICAgICppbl9mcmVlX2xpc3RfcCA9IDA7CisgICAgICAqYWxsb2NhdGVkX3AgPSAwOworICAgICAgcmV0dXJuOworICAgIH0KKworICBfZGJ1c19tZW1fcG9vbF9nZXRfc3RhdHMgKGxpc3RfcG9vbCwgaW5fdXNlX3AsIGluX2ZyZWVfbGlzdF9wLCBhbGxvY2F0ZWRfcCk7CisgIF9EQlVTX1VOTE9DSyAobGlzdCk7Cit9CisjZW5kaWYKKworLyoqIEB9ICovCisKKy8qKgorICogQGFkZHRvZ3JvdXAgREJ1c0xpc3QKKyAqIEB7CisgKi8KKworLyoqCisgKiBAc3RydWN0IERCdXNMaXN0CisgKgorICogQSBub2RlIGluIGEgbGlua2VkIGxpc3QuCisgKgorICogREJ1c0xpc3QgaXMgYSBjaXJjdWxhciBsaXN0OyB0aGF0IGlzLCB0aGUgdGFpbCBvZiB0aGUgbGlzdAorICogcG9pbnRzIGJhY2sgdG8gdGhlIGhlYWQgb2YgdGhlIGxpc3QuIFRoZSBlbXB0eSBsaXN0IGlzCisgKiByZXByZXNlbnRlZCBieSBhICNOVUxMIHBvaW50ZXIuCisgKi8KKworLyoqCisgKiBAZGVmIF9kYnVzX2xpc3RfZ2V0X25leHRfbGluaworICoKKyAqIEdldHMgdGhlIG5leHQgbGluayBpbiB0aGUgbGlzdCwgb3IgI05VTEwgaWYKKyAqIHRoZXJlIGFyZSBubyBtb3JlIGxpbmtzLiBVc2VkIGZvciBpdGVyYXRpb24uCisgKgorICogQGNvZGUKKyAqIERCdXNMaXN0ICpsaW5rOworICogbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZsaXN0KTsKKyAqIHdoaWxlIChsaW5rICE9IE5VTEwpCisgKiAgIHsKKyAqICAgICBwcmludGYgKCJ2YWx1ZSBpcyAlcFxuIiwgbGluay0+ZGF0YSk7CisgKiAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJmxpbmspOworICogICB9CisgKiBAZW5kY29kZQorICoKKyAqIEBwYXJhbSBsaXN0IGFkZHJlc3Mgb2YgdGhlIGxpc3QgaGVhZC4KKyAqIEBwYXJhbSBsaW5rIGN1cnJlbnQgbGluay4KKyAqIEByZXR1cm5zIHRoZSBuZXh0IGxpbmssIG9yICVOVUxMIGlmIG5vbmUuCisgKiAKKyAqLworCisvKioKKyAqIEBkZWYgX2RidXNfbGlzdF9nZXRfcHJldl9saW5rCisgKgorICogR2V0cyB0aGUgcHJldmlvdXMgbGluayBpbiB0aGUgbGlzdCwgb3IgI05VTEwgaWYKKyAqIHRoZXJlIGFyZSBubyBtb3JlIGxpbmtzLiBVc2VkIGZvciBpdGVyYXRpb24uCisgKgorICogQGNvZGUKKyAqIERCdXNMaXN0ICpsaW5rOworICogbGluayA9IF9kYnVzX2xpc3RfZ2V0X2xhc3RfbGluayAoJmxpc3QpOworICogd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAqICAgeworICogICAgIHByaW50ZiAoInZhbHVlIGlzICVwXG4iLCBsaW5rLT5kYXRhKTsKKyAqICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfcHJldl9saW5rICgmbGluayk7CisgKiAgIH0KKyAqIEBlbmRjb2RlCisgKgorICogQHBhcmFtIGxpc3QgYWRkcmVzcyBvZiB0aGUgbGlzdCBoZWFkLgorICogQHBhcmFtIGxpbmsgY3VycmVudCBsaW5rLgorICogQHJldHVybnMgdGhlIHByZXZpb3VzIGxpbmssIG9yICVOVUxMIGlmIG5vbmUuCisgKiAKKyAqLworCisvKioKKyAqIEFsbG9jYXRlcyBhIGxpbmtlZCBsaXN0IG5vZGUuIFVzZWZ1bCBmb3IgcHJlYWxsb2NhdGluZworICogbm9kZXMgYW5kIHVzaW5nIF9kYnVzX2xpc3RfYXBwZW5kX2xpbmsoKSB0byBhdm9pZAorICogYWxsb2NhdGlvbnMuCisgKiAKKyAqIEBwYXJhbSBkYXRhIHRoZSB2YWx1ZSB0byBzdG9yZSBpbiB0aGUgbGluay4KKyAqIEByZXR1cm5zIGEgbmV3bHkgYWxsb2NhdGVkIGxpbmsuCisgKi8KK0RCdXNMaXN0KgorX2RidXNfbGlzdF9hbGxvY19saW5rICh2b2lkICpkYXRhKQoreworICByZXR1cm4gYWxsb2NfbGluayAoZGF0YSk7Cit9CisKKy8qKgorICogRnJlZXMgYSBsaW5rZWQgbGlzdCBub2RlIGFsbG9jYXRlZCB3aXRoIF9kYnVzX2xpc3RfYWxsb2NfbGluay4KKyAqIERvZXMgbm90IGZyZWUgdGhlIGRhdGEgaW4gdGhlIG5vZGUuCisgKgorICogQHBhcmFtIGxpbmsgdGhlIGxpc3Qgbm9kZQorICovCit2b2lkCitfZGJ1c19saXN0X2ZyZWVfbGluayAoREJ1c0xpc3QgKmxpbmspCit7CisgIGZyZWVfbGluayAobGluayk7Cit9CisKKworLyoqCisgKiBBcHBlbmRzIGEgdmFsdWUgdG8gdGhlIGxpc3QuIE1heSByZXR1cm4gI0ZBTFNFCisgKiBpZiBpbnN1ZmZpY2llbnQgbWVtb3J5IGV4aXN0cyB0byBhZGQgYSBsaXN0IGxpbmsuCisgKiBUaGlzIGlzIGEgY29uc3RhbnQtdGltZSBvcGVyYXRpb24uCisgKgorICogQHBhcmFtIGxpc3QgYWRkcmVzcyBvZiB0aGUgbGlzdCBoZWFkLgorICogQHBhcmFtIGRhdGEgdGhlIHZhbHVlIHRvIGFwcGVuZC4KKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19saXN0X2FwcGVuZCAoREJ1c0xpc3QgKipsaXN0LAorICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAqZGF0YSkKK3sKKyAgaWYgKCFfZGJ1c19saXN0X3ByZXBlbmQgKGxpc3QsIGRhdGEpKQorICAgIHJldHVybiBGQUxTRTsKKworICAvKiBOb3cgY3ljbGUgdGhlIGxpc3QgZm9yd2FyZCBvbmUgc28gdGhlIHByZXBlbmRlZCBub2RlIGlzIHRoZSB0YWlsICovCisgICpsaXN0ID0gKCpsaXN0KS0+bmV4dDsKKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBQcmVwZW5kcyBhIHZhbHVlIHRvIHRoZSBsaXN0LiBNYXkgcmV0dXJuICNGQUxTRQorICogaWYgaW5zdWZmaWNpZW50IG1lbW9yeSBleGlzdHMgdG8gYWRkIGEgbGlzdCBsaW5rLgorICogVGhpcyBpcyBhIGNvbnN0YW50LXRpbWUgb3BlcmF0aW9uLgorICoKKyAqIEBwYXJhbSBsaXN0IGFkZHJlc3Mgb2YgdGhlIGxpc3QgaGVhZC4KKyAqIEBwYXJhbSBkYXRhIHRoZSB2YWx1ZSB0byBwcmVwZW5kLgorICogQHJldHVybnMgI1RSVUUgb24gc3VjY2Vzcy4KKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2xpc3RfcHJlcGVuZCAoREJ1c0xpc3QgKipsaXN0LAorICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgKmRhdGEpCit7CisgIERCdXNMaXN0ICpsaW5rOworCisgIGxpbmsgPSBhbGxvY19saW5rIChkYXRhKTsKKyAgaWYgKGxpbmsgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgbGlua19iZWZvcmUgKGxpc3QsICpsaXN0LCBsaW5rKTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBBcHBlbmRzIGEgbGluayB0byB0aGUgbGlzdC4KKyAqIENhbm5vdCBmYWlsIGR1ZSB0byBvdXQgb2YgbWVtb3J5LgorICogVGhpcyBpcyBhIGNvbnN0YW50LXRpbWUgb3BlcmF0aW9uLgorICoKKyAqIEBwYXJhbSBsaXN0IGFkZHJlc3Mgb2YgdGhlIGxpc3QgaGVhZC4KKyAqIEBwYXJhbSBsaW5rIHRoZSBsaW5rIHRvIGFwcGVuZC4KKyAqLwordm9pZAorX2RidXNfbGlzdF9hcHBlbmRfbGluayAoREJ1c0xpc3QgKipsaXN0LAorCQkJREJ1c0xpc3QgKmxpbmspCit7CisgIF9kYnVzX2xpc3RfcHJlcGVuZF9saW5rIChsaXN0LCBsaW5rKTsKKworICAvKiBOb3cgY3ljbGUgdGhlIGxpc3QgZm9yd2FyZCBvbmUgc28gdGhlIHByZXBlbmRlZCBub2RlIGlzIHRoZSB0YWlsICovCisgICpsaXN0ID0gKCpsaXN0KS0+bmV4dDsKK30KKworLyoqCisgKiBQcmVwZW5kcyBhIGxpbmsgdG8gdGhlIGxpc3QuIAorICogQ2Fubm90IGZhaWwgZHVlIHRvIG91dCBvZiBtZW1vcnkuCisgKiBUaGlzIGlzIGEgY29uc3RhbnQtdGltZSBvcGVyYXRpb24uCisgKgorICogQHBhcmFtIGxpc3QgYWRkcmVzcyBvZiB0aGUgbGlzdCBoZWFkLgorICogQHBhcmFtIGxpbmsgdGhlIGxpbmsgdG8gcHJlcGVuZC4KKyAqLwordm9pZAorX2RidXNfbGlzdF9wcmVwZW5kX2xpbmsgKERCdXNMaXN0ICoqbGlzdCwKKwkJCSBEQnVzTGlzdCAqbGluaykKK3sKKyAgbGlua19iZWZvcmUgKGxpc3QsICpsaXN0LCBsaW5rKTsKK30KKworLyoqCisgKiBJbnNlcnRzIGRhdGEgaW50byB0aGUgbGlzdCBhZnRlciB0aGUgZ2l2ZW4gZXhpc3RpbmcgbGluay4KKyAqIAorICogQHBhcmFtIGxpc3QgdGhlIGxpc3QgdG8gbW9kaWZ5CisgKiBAcGFyYW0gYWZ0ZXJfdGhpc19saW5rIGV4aXN0aW5nIGxpbmsgdG8gaW5zZXJ0IGFmdGVyLCBvciAjTlVMTCB0byBwcmVwZW5kCisgKiBAcGFyYW0gZGF0YSB0aGUgdmFsdWUgdG8gaW5zZXJ0CisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzLCAjRkFMU0UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2xpc3RfaW5zZXJ0X2FmdGVyIChEQnVzTGlzdCAqKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICphZnRlcl90aGlzX2xpbmssCisgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICpkYXRhKQoreworICBEQnVzTGlzdCAqbGluazsgIAorCisgIGlmIChhZnRlcl90aGlzX2xpbmsgPT0gTlVMTCkKKyAgICByZXR1cm4gX2RidXNfbGlzdF9wcmVwZW5kIChsaXN0LCBkYXRhKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIGxpbmsgPSBhbGxvY19saW5rIChkYXRhKTsKKyAgICAgIGlmIChsaW5rID09IE5VTEwpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgCisgICAgICBsaW5rX2FmdGVyIChsaXN0LCBhZnRlcl90aGlzX2xpbmssIGxpbmspOworICAgIH0KKyAgCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIEluc2VydHMgYSBsaW5rIGludG8gdGhlIGxpc3QgYmVmb3JlIHRoZSBnaXZlbiBleGlzdGluZyBsaW5rLgorICogCisgKiBAcGFyYW0gbGlzdCB0aGUgbGlzdCB0byBtb2RpZnkKKyAqIEBwYXJhbSBiZWZvcmVfdGhpc19saW5rIGV4aXN0aW5nIGxpbmsgdG8gaW5zZXJ0IGJlZm9yZSwgb3IgI05VTEwgdG8gYXBwZW5kCisgKiBAcGFyYW0gbGluayB0aGUgbGluayB0byBpbnNlcnQKKyAqLwordm9pZAorX2RidXNfbGlzdF9pbnNlcnRfYmVmb3JlX2xpbmsgKERCdXNMaXN0ICoqbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAgKmJlZm9yZV90aGlzX2xpbmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICpsaW5rKQoreworICBpZiAoYmVmb3JlX3RoaXNfbGluayA9PSBOVUxMKQorICAgIF9kYnVzX2xpc3RfYXBwZW5kX2xpbmsgKGxpc3QsIGxpbmspOworICBlbHNlCisgICAgbGlua19iZWZvcmUgKGxpc3QsIGJlZm9yZV90aGlzX2xpbmssIGxpbmspOworfQorCisvKioKKyAqIEluc2VydHMgYSBsaW5rIGludG8gdGhlIGxpc3QgYWZ0ZXIgdGhlIGdpdmVuIGV4aXN0aW5nIGxpbmsuCisgKiAKKyAqIEBwYXJhbSBsaXN0IHRoZSBsaXN0IHRvIG1vZGlmeQorICogQHBhcmFtIGFmdGVyX3RoaXNfbGluayBleGlzdGluZyBsaW5rIHRvIGluc2VydCBhZnRlciwgb3IgI05VTEwgdG8gcHJlcGVuZAorICogQHBhcmFtIGxpbmsgdGhlIGxpbmsgdG8gaW5zZXJ0CisgKi8KK3ZvaWQKK19kYnVzX2xpc3RfaW5zZXJ0X2FmdGVyX2xpbmsgKERCdXNMaXN0ICoqbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNMaXN0ICAqYWZ0ZXJfdGhpc19saW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICpsaW5rKQoreworICBpZiAoYWZ0ZXJfdGhpc19saW5rID09IE5VTEwpCisgICAgX2RidXNfbGlzdF9wcmVwZW5kX2xpbmsgKGxpc3QsIGxpbmspOworICBlbHNlICAKKyAgICBsaW5rX2FmdGVyIChsaXN0LCBhZnRlcl90aGlzX2xpbmssIGxpbmspOworfQorCisvKioKKyAqIFJlbW92ZXMgYSB2YWx1ZSBmcm9tIHRoZSBsaXN0LiBPbmx5IHJlbW92ZXMgdGhlCisgKiBmaXJzdCB2YWx1ZSBlcXVhbCB0byB0aGUgZ2l2ZW4gZGF0YSBwb2ludGVyLAorICogZXZlbiBpZiBtdWx0aXBsZSB2YWx1ZXMgZXhpc3Qgd2hpY2ggbWF0Y2guCisgKiBUaGlzIGlzIGEgbGluZWFyLXRpbWUgb3BlcmF0aW9uLgorICoKKyAqIEBwYXJhbSBsaXN0IGFkZHJlc3Mgb2YgdGhlIGxpc3QgaGVhZC4KKyAqIEBwYXJhbSBkYXRhIHRoZSB2YWx1ZSB0byByZW1vdmUuCisgKiBAcmV0dXJucyAjVFJVRSBpZiBhIHZhbHVlIHdhcyBmb3VuZCB0byByZW1vdmUuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19saXN0X3JlbW92ZSAoREJ1c0xpc3QgKipsaXN0LAorICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAqZGF0YSkKK3sKKyAgREJ1c0xpc3QgKmxpbms7CisKKyAgbGluayA9ICpsaXN0OworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChsaW5rLT5kYXRhID09IGRhdGEpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19saXN0X3JlbW92ZV9saW5rIChsaXN0LCBsaW5rKTsKKyAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgfQorICAgICAgCisgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rIChsaXN0LCBsaW5rKTsKKyAgICB9CisKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKioKKyAqIFJlbW92ZXMgYSB2YWx1ZSBmcm9tIHRoZSBsaXN0LiBPbmx5IHJlbW92ZXMgdGhlCisgKiBsYXN0IHZhbHVlIGVxdWFsIHRvIHRoZSBnaXZlbiBkYXRhIHBvaW50ZXIsCisgKiBldmVuIGlmIG11bHRpcGxlIHZhbHVlcyBleGlzdCB3aGljaCBtYXRjaC4KKyAqIFRoaXMgaXMgYSBsaW5lYXItdGltZSBvcGVyYXRpb24uCisgKgorICogQHBhcmFtIGxpc3QgYWRkcmVzcyBvZiB0aGUgbGlzdCBoZWFkLgorICogQHBhcmFtIGRhdGEgdGhlIHZhbHVlIHRvIHJlbW92ZS4KKyAqIEByZXR1cm5zICNUUlVFIGlmIGEgdmFsdWUgd2FzIGZvdW5kIHRvIHJlbW92ZS4KKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2xpc3RfcmVtb3ZlX2xhc3QgKERCdXNMaXN0ICoqbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAqZGF0YSkKK3sKKyAgREJ1c0xpc3QgKmxpbms7CisKKyAgbGluayA9IF9kYnVzX2xpc3RfZmluZF9sYXN0IChsaXN0LCBkYXRhKTsKKyAgaWYgKGxpbmspCisgICAgeworICAgICAgX2RidXNfbGlzdF9yZW1vdmVfbGluayAobGlzdCwgbGluayk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKgorICogRmluZHMgYSB2YWx1ZSBpbiB0aGUgbGlzdC4gUmV0dXJucyB0aGUgbGFzdCBsaW5rCisgKiB3aXRoIHZhbHVlIGVxdWFsIHRvIHRoZSBnaXZlbiBkYXRhIHBvaW50ZXIuCisgKiBUaGlzIGlzIGEgbGluZWFyLXRpbWUgb3BlcmF0aW9uLgorICogUmV0dXJucyAjTlVMTCBpZiBubyB2YWx1ZSBmb3VuZCB0aGF0IG1hdGNoZXMuCisgKgorICogQHBhcmFtIGxpc3QgYWRkcmVzcyBvZiB0aGUgbGlzdCBoZWFkLgorICogQHBhcmFtIGRhdGEgdGhlIHZhbHVlIHRvIGZpbmQuCisgKiBAcmV0dXJucyB0aGUgbGluayBpZiBmb3VuZAorICovCitEQnVzTGlzdCoKK19kYnVzX2xpc3RfZmluZF9sYXN0IChEQnVzTGlzdCAqKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICpkYXRhKQoreworICBEQnVzTGlzdCAqbGluazsKKworICBsaW5rID0gX2RidXNfbGlzdF9nZXRfbGFzdF9saW5rIChsaXN0KTsKKworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChsaW5rLT5kYXRhID09IGRhdGEpCisgICAgICAgIHJldHVybiBsaW5rOworICAgICAgCisgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfcHJldl9saW5rIChsaXN0LCBsaW5rKTsKKyAgICB9CisKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogUmVtb3ZlcyB0aGUgZ2l2ZW4gbGluayBmcm9tIHRoZSBsaXN0LCBidXQgZG9lc24ndAorICogZnJlZSBpdC4gX2RidXNfbGlzdF9yZW1vdmVfbGluaygpIGJvdGggcmVtb3ZlcyB0aGUKKyAqIGxpbmsgYW5kIGFsc28gZnJlZXMgaXQuCisgKgorICogQHBhcmFtIGxpc3QgdGhlIGxpc3QKKyAqIEBwYXJhbSBsaW5rIHRoZSBsaW5rIGluIHRoZSBsaXN0CisgKi8KK3ZvaWQKK19kYnVzX2xpc3RfdW5saW5rIChEQnVzTGlzdCAqKmxpc3QsCisgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICpsaW5rKQoreworICBpZiAobGluay0+bmV4dCA9PSBsaW5rKQorICAgIHsKKyAgICAgIC8qIG9uZS1lbGVtZW50IGxpc3QgKi8KKyAgICAgICpsaXN0ID0gTlVMTDsKKyAgICB9CisgIGVsc2UKKyAgICB7ICAgICAgCisgICAgICBsaW5rLT5wcmV2LT5uZXh0ID0gbGluay0+bmV4dDsKKyAgICAgIGxpbmstPm5leHQtPnByZXYgPSBsaW5rLT5wcmV2OworICAgICAgCisgICAgICBpZiAoKmxpc3QgPT0gbGluaykKKyAgICAgICAgKmxpc3QgPSBsaW5rLT5uZXh0OworICAgIH0KKworICBsaW5rLT5uZXh0ID0gTlVMTDsKKyAgbGluay0+cHJldiA9IE5VTEw7Cit9CisKKy8qKgorICogUmVtb3ZlcyBhIGxpbmsgZnJvbSB0aGUgbGlzdC4gVGhpcyBpcyBhIGNvbnN0YW50LXRpbWUgb3BlcmF0aW9uLgorICoKKyAqIEBwYXJhbSBsaXN0IGFkZHJlc3Mgb2YgdGhlIGxpc3QgaGVhZC4KKyAqIEBwYXJhbSBsaW5rIHRoZSBsaXN0IGxpbmsgdG8gcmVtb3ZlLgorICovCit2b2lkCitfZGJ1c19saXN0X3JlbW92ZV9saW5rIChEQnVzTGlzdCAqKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAgKmxpbmspCit7CisgIF9kYnVzX2xpc3RfdW5saW5rIChsaXN0LCBsaW5rKTsKKyAgZnJlZV9saW5rIChsaW5rKTsKK30KKworLyoqCisgKiBGcmVlcyBhbGwgbGlua3MgaW4gdGhlIGxpc3QgYW5kIHNldHMgdGhlIGxpc3QgaGVhZCB0byAjTlVMTC4gRG9lcworICogbm90IGZyZWUgdGhlIGRhdGEgaW4gZWFjaCBsaW5rLCBmb3Igb2J2aW91cyByZWFzb25zLiBUaGlzIGlzIGEKKyAqIGxpbmVhci10aW1lIG9wZXJhdGlvbi4KKyAqCisgKiBAcGFyYW0gbGlzdCBhZGRyZXNzIG9mIHRoZSBsaXN0IGhlYWQuCisgKi8KK3ZvaWQKK19kYnVzX2xpc3RfY2xlYXIgKERCdXNMaXN0ICoqbGlzdCkKK3sKKyAgREJ1c0xpc3QgKmxpbms7CisKKyAgbGluayA9ICpsaXN0OworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIERCdXNMaXN0ICpuZXh0ID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rIChsaXN0LCBsaW5rKTsKKyAgICAgIAorICAgICAgZnJlZV9saW5rIChsaW5rKTsKKyAgICAgIAorICAgICAgbGluayA9IG5leHQ7CisgICAgfQorCisgICpsaXN0ID0gTlVMTDsKK30KKworLyoqCisgKiBHZXRzIHRoZSBmaXJzdCBsaW5rIGluIHRoZSBsaXN0LgorICogVGhpcyBpcyBhIGNvbnN0YW50LXRpbWUgb3BlcmF0aW9uLgorICoKKyAqIEBwYXJhbSBsaXN0IGFkZHJlc3Mgb2YgdGhlIGxpc3QgaGVhZC4KKyAqIEByZXR1cm5zIHRoZSBmaXJzdCBsaW5rLCBvciAjTlVMTCBmb3IgYW4gZW1wdHkgbGlzdC4KKyAqLworREJ1c0xpc3QqCitfZGJ1c19saXN0X2dldF9maXJzdF9saW5rIChEQnVzTGlzdCAqKmxpc3QpCit7CisgIHJldHVybiAqbGlzdDsKK30KKworLyoqCisgKiBHZXRzIHRoZSBsYXN0IGxpbmsgaW4gdGhlIGxpc3QuCisgKiBUaGlzIGlzIGEgY29uc3RhbnQtdGltZSBvcGVyYXRpb24uCisgKgorICogQHBhcmFtIGxpc3QgYWRkcmVzcyBvZiB0aGUgbGlzdCBoZWFkLgorICogQHJldHVybnMgdGhlIGxhc3QgbGluaywgb3IgI05VTEwgZm9yIGFuIGVtcHR5IGxpc3QuCisgKi8KK0RCdXNMaXN0KgorX2RidXNfbGlzdF9nZXRfbGFzdF9saW5rIChEQnVzTGlzdCAqKmxpc3QpCit7CisgIGlmICgqbGlzdCA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworICBlbHNlCisgICAgcmV0dXJuICgqbGlzdCktPnByZXY7Cit9CisKKy8qKgorICogR2V0cyB0aGUgbGFzdCBkYXRhIGluIHRoZSBsaXN0LgorICogVGhpcyBpcyBhIGNvbnN0YW50LXRpbWUgb3BlcmF0aW9uLgorICoKKyAqIEBwYXJhbSBsaXN0IGFkZHJlc3Mgb2YgdGhlIGxpc3QgaGVhZC4KKyAqIEByZXR1cm5zIHRoZSBsYXN0IGRhdGEgaW4gdGhlIGxpc3QsIG9yICNOVUxMIGZvciBhbiBlbXB0eSBsaXN0LgorICovCit2b2lkKgorX2RidXNfbGlzdF9nZXRfbGFzdCAoREJ1c0xpc3QgKipsaXN0KQoreworICBpZiAoKmxpc3QgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKyAgZWxzZQorICAgIHJldHVybiAoKmxpc3QpLT5wcmV2LT5kYXRhOworfQorCisvKioKKyAqIEdldHMgdGhlIGZpcnN0IGRhdGEgaW4gdGhlIGxpc3QuCisgKiBUaGlzIGlzIGEgY29uc3RhbnQtdGltZSBvcGVyYXRpb24uCisgKgorICogQHBhcmFtIGxpc3QgYWRkcmVzcyBvZiB0aGUgbGlzdCBoZWFkLgorICogQHJldHVybnMgdGhlIGZpcnN0IGRhdGEgaW4gdGhlIGxpc3QsIG9yICNOVUxMIGZvciBhbiBlbXB0eSBsaXN0LgorICovCit2b2lkKgorX2RidXNfbGlzdF9nZXRfZmlyc3QgKERCdXNMaXN0ICoqbGlzdCkKK3sKKyAgaWYgKCpsaXN0ID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisgIGVsc2UKKyAgICByZXR1cm4gKCpsaXN0KS0+ZGF0YTsKK30KKworLyoqCisgKiBSZW1vdmVzIHRoZSBmaXJzdCBsaW5rIGluIHRoZSBsaXN0IGFuZCByZXR1cm5zIGl0LiAgVGhpcyBpcyBhCisgKiBjb25zdGFudC10aW1lIG9wZXJhdGlvbi4KKyAqCisgKiBAcGFyYW0gbGlzdCBhZGRyZXNzIG9mIHRoZSBsaXN0IGhlYWQuCisgKiBAcmV0dXJucyB0aGUgZmlyc3QgbGluayBpbiB0aGUgbGlzdCwgb3IgI05VTEwgZm9yIGFuIGVtcHR5IGxpc3QuCisgKi8KK0RCdXNMaXN0KgorX2RidXNfbGlzdF9wb3BfZmlyc3RfbGluayAoREJ1c0xpc3QgKipsaXN0KQoreworICBEQnVzTGlzdCAqbGluazsKKyAgCisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rIChsaXN0KTsKKyAgaWYgKGxpbmsgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBfZGJ1c19saXN0X3VubGluayAobGlzdCwgbGluayk7CisKKyAgcmV0dXJuIGxpbms7Cit9CisKKy8qKgorICogUmVtb3ZlcyB0aGUgZmlyc3QgdmFsdWUgaW4gdGhlIGxpc3QgYW5kIHJldHVybnMgaXQuICBUaGlzIGlzIGEKKyAqIGNvbnN0YW50LXRpbWUgb3BlcmF0aW9uLgorICoKKyAqIEBwYXJhbSBsaXN0IGFkZHJlc3Mgb2YgdGhlIGxpc3QgaGVhZC4KKyAqIEByZXR1cm5zIHRoZSBmaXJzdCBkYXRhIGluIHRoZSBsaXN0LCBvciAjTlVMTCBmb3IgYW4gZW1wdHkgbGlzdC4KKyAqLwordm9pZCoKK19kYnVzX2xpc3RfcG9wX2ZpcnN0IChEQnVzTGlzdCAqKmxpc3QpCit7CisgIERCdXNMaXN0ICpsaW5rOworICB2b2lkICpkYXRhOworICAKKyAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKGxpc3QpOworICBpZiAobGluayA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworICAKKyAgZGF0YSA9IGxpbmstPmRhdGE7CisgIF9kYnVzX2xpc3RfcmVtb3ZlX2xpbmsgKGxpc3QsIGxpbmspOworCisgIHJldHVybiBkYXRhOworfQorCisvKioKKyAqIFJlbW92ZXMgdGhlIGxhc3QgdmFsdWUgaW4gdGhlIGxpc3QgYW5kIHJldHVybnMgaXQuICBUaGlzIGlzIGEKKyAqIGNvbnN0YW50LXRpbWUgb3BlcmF0aW9uLgorICoKKyAqIEBwYXJhbSBsaXN0IGFkZHJlc3Mgb2YgdGhlIGxpc3QgaGVhZC4KKyAqIEByZXR1cm5zIHRoZSBsYXN0IGRhdGEgaW4gdGhlIGxpc3QsIG9yICNOVUxMIGZvciBhbiBlbXB0eSBsaXN0LgorICovCit2b2lkKgorX2RidXNfbGlzdF9wb3BfbGFzdCAoREJ1c0xpc3QgKipsaXN0KQoreworICBEQnVzTGlzdCAqbGluazsKKyAgdm9pZCAqZGF0YTsKKyAgCisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9sYXN0X2xpbmsgKGxpc3QpOworICBpZiAobGluayA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworICAKKyAgZGF0YSA9IGxpbmstPmRhdGE7CisgIF9kYnVzX2xpc3RfcmVtb3ZlX2xpbmsgKGxpc3QsIGxpbmspOworCisgIHJldHVybiBkYXRhOworfQorCisvKioKKyAqIENvcGllcyBhIGxpc3QuIFRoaXMgaXMgYSBsaW5lYXItdGltZSBvcGVyYXRpb24uICBJZiB0aGVyZSBpc24ndAorICogZW5vdWdoIG1lbW9yeSB0byBjb3B5IHRoZSBlbnRpcmUgbGlzdCwgdGhlIGRlc3RpbmF0aW9uIGxpc3Qgd2lsbCBiZQorICogc2V0IHRvICNOVUxMLgorICoKKyAqIEBwYXJhbSBsaXN0IGFkZHJlc3Mgb2YgdGhlIGhlYWQgb2YgdGhlIGxpc3QgdG8gY29weS4KKyAqIEBwYXJhbSBkZXN0IGFkZHJlc3Mgd2hlcmUgdGhlIGNvcGllZCBsaXN0IHNob3VsZCBiZSBwbGFjZWQuCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzLCAjRkFMU0UgaWYgbm90IGVub3VnaCBtZW1vcnkuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19saXN0X2NvcHkgKERCdXNMaXN0ICoqbGlzdCwKKyAgICAgICAgICAgICAgICAgREJ1c0xpc3QgKipkZXN0KQoreworICBEQnVzTGlzdCAqbGluazsKKworICBfZGJ1c19hc3NlcnQgKGxpc3QgIT0gZGVzdCk7CisKKyAgKmRlc3QgPSBOVUxMOworICAKKyAgbGluayA9ICpsaXN0OworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfbGlzdF9hcHBlbmQgKGRlc3QsIGxpbmstPmRhdGEpKQorICAgICAgICB7CisgICAgICAgICAgLyogZnJlZSB3aGF0IHdlIGhhdmUgc28gZmFyICovCisgICAgICAgICAgX2RidXNfbGlzdF9jbGVhciAoZGVzdCk7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAKKyAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKGxpc3QsIGxpbmspOworICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBHZXRzIHRoZSBsZW5ndGggb2YgYSBsaXN0LiBUaGlzIGlzIGEgbGluZWFyLXRpbWUKKyAqIG9wZXJhdGlvbi4KKyAqCisgKiBAcGFyYW0gbGlzdCBhZGRyZXNzIG9mIHRoZSBoZWFkIG9mIHRoZSBsaXN0CisgKiBAcmV0dXJucyBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QuCisgKi8KK2ludAorX2RidXNfbGlzdF9nZXRfbGVuZ3RoIChEQnVzTGlzdCAqKmxpc3QpCit7CisgIERCdXNMaXN0ICpsaW5rOworICBpbnQgbGVuZ3RoOworCisgIGxlbmd0aCA9IDA7CisgIAorICBsaW5rID0gKmxpc3Q7CisgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgeworICAgICAgKytsZW5ndGg7CisgICAgICAKKyAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKGxpc3QsIGxpbmspOworICAgIH0KKworICByZXR1cm4gbGVuZ3RoOworfQorCisvKioKKyAqIENhbGxzIHRoZSBnaXZlbiBmdW5jdGlvbiBmb3IgZWFjaCBlbGVtZW50IGluIHRoZSBsaXN0LiAgVGhlCisgKiBmdW5jdGlvbiBpcyBwYXNzZWQgdGhlIGxpc3QgZWxlbWVudCBhcyBpdHMgZmlyc3QgYXJndW1lbnQsIGFuZCB0aGUKKyAqIGdpdmVuIGRhdGEgYXMgaXRzIHNlY29uZCBhcmd1bWVudC4KKyAqCisgKiBAcGFyYW0gbGlzdCBhZGRyZXNzIG9mIHRoZSBoZWFkIG9mIHRoZSBsaXN0LgorICogQHBhcmFtIGZ1bmN0aW9uIGZ1bmN0aW9uIHRvIGNhbGwgZm9yIGVhY2ggZWxlbWVudC4KKyAqIEBwYXJhbSBkYXRhIGV4dHJhIGRhdGEgZm9yIHRoZSBmdW5jdGlvbi4KKyAqIAorICovCit2b2lkCitfZGJ1c19saXN0X2ZvcmVhY2ggKERCdXNMaXN0ICAgICAgICAgICoqbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgREJ1c0ZvcmVhY2hGdW5jdGlvbiBmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICpkYXRhKQoreworICBEQnVzTGlzdCAqbGluazsKKworICBsaW5rID0gKmxpc3Q7CisgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgeworICAgICAgREJ1c0xpc3QgKm5leHQgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKGxpc3QsIGxpbmspOworICAgICAgCisgICAgICAoKiBmdW5jdGlvbikgKGxpbmstPmRhdGEsIGRhdGEpOworICAgICAgCisgICAgICBsaW5rID0gbmV4dDsKKyAgICB9Cit9CisKKy8qKgorICogQ2hlY2sgd2hldGhlciBsZW5ndGggaXMgZXhhY3RseSBvbmUuCisgKgorICogQHBhcmFtIGxpc3QgdGhlIGxpc3QKKyAqIEByZXR1cm5zICNUUlVFIGlmIGxlbmd0aCBpcyBleGFjdGx5IG9uZQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfbGlzdF9sZW5ndGhfaXNfb25lIChEQnVzTGlzdCAqKmxpc3QpCit7CisgIHJldHVybiAoKmxpc3QgIT0gTlVMTCAmJgorICAgICAgICAgICgqbGlzdCktPm5leHQgPT0gKmxpc3QpOworfQorCisvKiogQH0gKi8KKworI2lmZGVmIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTCisjaW5jbHVkZSAiZGJ1cy10ZXN0LmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKworc3RhdGljIHZvaWQKK3ZlcmlmeV9saXN0IChEQnVzTGlzdCAqKmxpc3QpCit7CisgIERCdXNMaXN0ICpsaW5rOworICBpbnQgbGVuZ3RoOworICAKKyAgbGluayA9ICpsaXN0OworCisgIGlmIChsaW5rID09IE5VTEwpCisgICAgcmV0dXJuOworCisgIGlmIChsaW5rLT5uZXh0ID09IGxpbmspCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0IChsaW5rLT5wcmV2ID09IGxpbmspOworICAgICAgX2RidXNfYXNzZXJ0ICgqbGlzdCA9PSBsaW5rKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgbGVuZ3RoID0gMDsKKyAgZG8KKyAgICB7CisgICAgICBsZW5ndGggKz0gMTsKKyAgICAgIF9kYnVzX2Fzc2VydCAobGluay0+cHJldi0+bmV4dCA9PSBsaW5rKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAobGluay0+bmV4dC0+cHJldiA9PSBsaW5rKTsKKyAgICAgIGxpbmsgPSBsaW5rLT5uZXh0OworICAgIH0KKyAgd2hpbGUgKGxpbmsgIT0gKmxpc3QpOworCisgIF9kYnVzX2Fzc2VydCAobGVuZ3RoID09IF9kYnVzX2xpc3RfZ2V0X2xlbmd0aCAobGlzdCkpOworCisgIGlmIChsZW5ndGggPT0gMSkKKyAgICBfZGJ1c19hc3NlcnQgKF9kYnVzX2xpc3RfbGVuZ3RoX2lzX29uZSAobGlzdCkpOworICBlbHNlCisgICAgX2RidXNfYXNzZXJ0ICghX2RidXNfbGlzdF9sZW5ndGhfaXNfb25lIChsaXN0KSk7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAoraXNfYXNjZW5kaW5nX3NlcXVlbmNlIChEQnVzTGlzdCAqKmxpc3QpCit7CisgIERCdXNMaXN0ICpsaW5rOworICBpbnQgcHJldjsKKworICBwcmV2ID0gX0RCVVNfSU5UX01JTjsKKyAgCisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rIChsaXN0KTsKKyAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBpbnQgdiA9IF9EQlVTX1BPSU5URVJfVE9fSU5UIChsaW5rLT5kYXRhKTsKKyAgICAgIAorICAgICAgaWYgKHYgPD0gcHJldikKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICBwcmV2ID0gdjsKKyAgICAgIAorICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAobGlzdCwgbGluayk7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2lzX2Rlc2NlbmRpbmdfc2VxdWVuY2UgKERCdXNMaXN0ICoqbGlzdCkKK3sKKyAgREJ1c0xpc3QgKmxpbms7CisgIGludCBwcmV2OworCisgIHByZXYgPSBfREJVU19JTlRfTUFYOworICAKKyAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKGxpc3QpOworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIGludCB2ID0gX0RCVVNfUE9JTlRFUl9UT19JTlQgKGxpbmstPmRhdGEpOworCisgICAgICBpZiAodiA+PSBwcmV2KQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIHByZXYgPSB2OworICAgICAgCisgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rIChsaXN0LCBsaW5rKTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYWxsX2V2ZW5fdmFsdWVzIChEQnVzTGlzdCAqKmxpc3QpCit7CisgIERCdXNMaXN0ICpsaW5rOworICAKKyAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKGxpc3QpOworICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgIHsKKyAgICAgIGludCB2ID0gX0RCVVNfUE9JTlRFUl9UT19JTlQgKGxpbmstPmRhdGEpOworCisgICAgICBpZiAoKHYgJSAyKSAhPSAwKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAKKyAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKGxpc3QsIGxpbmspOworICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CithbGxfb2RkX3ZhbHVlcyAoREJ1c0xpc3QgKipsaXN0KQoreworICBEQnVzTGlzdCAqbGluazsKKyAgCisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rIChsaXN0KTsKKyAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBpbnQgdiA9IF9EQlVTX1BPSU5URVJfVE9fSU5UIChsaW5rLT5kYXRhKTsKKworICAgICAgaWYgKCh2ICUgMikgPT0gMCkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgCisgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rIChsaXN0LCBsaW5rKTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorbGlzdHNfZXF1YWwgKERCdXNMaXN0ICoqbGlzdDEsCisgICAgICAgICAgICAgREJ1c0xpc3QgKipsaXN0MikKK3sKKyAgREJ1c0xpc3QgKmxpbmsxOworICBEQnVzTGlzdCAqbGluazI7CisgIAorICBsaW5rMSA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKGxpc3QxKTsKKyAgbGluazIgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rIChsaXN0Mik7CisgIHdoaWxlIChsaW5rMSAmJiBsaW5rMikKKyAgICB7CisgICAgICBpZiAobGluazEtPmRhdGEgIT0gbGluazItPmRhdGEpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIAorICAgICAgbGluazEgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKGxpc3QxLCBsaW5rMSk7CisgICAgICBsaW5rMiA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAobGlzdDIsIGxpbmsyKTsKKyAgICB9CisKKyAgaWYgKGxpbmsxIHx8IGxpbmsyKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBAaW5ncm91cCBEQnVzTGlzdEludGVybmFscworICogVW5pdCB0ZXN0IGZvciBEQnVzTGlzdAorICogQHJldHVybnMgI1RSVUUgb24gc3VjY2Vzcy4KKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2xpc3RfdGVzdCAodm9pZCkKK3sKKyAgREJ1c0xpc3QgKmxpc3QxOworICBEQnVzTGlzdCAqbGlzdDI7CisgIERCdXNMaXN0ICpsaW5rMTsKKyAgREJ1c0xpc3QgKmxpbmsyOworICBEQnVzTGlzdCAqY29weTE7CisgIERCdXNMaXN0ICpjb3B5MjsKKyAgaW50IGk7CisgIAorICBsaXN0MSA9IE5VTEw7CisgIGxpc3QyID0gTlVMTDsKKworICAvKiBUZXN0IGFwcGVuZCBhbmQgcHJlcGVuZCAqLworICAKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgMTApCisgICAgeworICAgICAgaWYgKCFfZGJ1c19saXN0X2FwcGVuZCAoJmxpc3QxLCBfREJVU19JTlRfVE9fUE9JTlRFUiAoaSkpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZCBub3QgYWxsb2NhdGUgZm9yIGFwcGVuZCIpOworICAgICAgCisgICAgICBpZiAoIV9kYnVzX2xpc3RfcHJlcGVuZCAoJmxpc3QyLCBfREJVU19JTlRfVE9fUE9JTlRFUiAoaSkpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VudCBub3QgYWxsb2NhdGUgZm9yIHByZXBlbmQiKTsKKyAgICAgICsraTsKKworICAgICAgdmVyaWZ5X2xpc3QgKCZsaXN0MSk7CisgICAgICB2ZXJpZnlfbGlzdCAoJmxpc3QyKTsKKyAgICAgIAorICAgICAgX2RidXNfYXNzZXJ0IChfZGJ1c19saXN0X2dldF9sZW5ndGggKCZsaXN0MSkgPT0gaSk7CisgICAgICBfZGJ1c19hc3NlcnQgKF9kYnVzX2xpc3RfZ2V0X2xlbmd0aCAoJmxpc3QyKSA9PSBpKTsKKyAgICB9CisKKyAgX2RidXNfYXNzZXJ0IChpc19hc2NlbmRpbmdfc2VxdWVuY2UgKCZsaXN0MSkpOworICBfZGJ1c19hc3NlcnQgKGlzX2Rlc2NlbmRpbmdfc2VxdWVuY2UgKCZsaXN0MikpOworCisgIC8qIFRlc3QgbGlzdCBjbGVhciAqLworICBfZGJ1c19saXN0X2NsZWFyICgmbGlzdDEpOworICBfZGJ1c19saXN0X2NsZWFyICgmbGlzdDIpOworCisgIHZlcmlmeV9saXN0ICgmbGlzdDEpOworICB2ZXJpZnlfbGlzdCAoJmxpc3QyKTsKKworICAvKiBUZXN0IGdldF9maXJzdCwgZ2V0X2xhc3QsIHBvcF9maXJzdCwgcG9wX2xhc3QgKi8KKyAgCisgIGkgPSAwOworICB3aGlsZSAoaSA8IDEwKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfbGlzdF9hcHBlbmQgKCZsaXN0MSwgX0RCVVNfSU5UX1RPX1BPSU5URVIgKGkpKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGQgbm90IGFsbG9jYXRlIGZvciBhcHBlbmQiKTsKKyAgICAgIGlmICghX2RidXNfbGlzdF9wcmVwZW5kICgmbGlzdDIsIF9EQlVTX0lOVF9UT19QT0lOVEVSIChpKSkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkIG5vdCBhbGxvY2F0ZSBmb3IgcHJlcGVuZCIpOworICAgICAgKytpOworICAgIH0KKworICAtLWk7CisgIHdoaWxlIChpID49IDApCisgICAgeworICAgICAgdm9pZCAqZ290X2RhdGExOworICAgICAgdm9pZCAqZ290X2RhdGEyOworICAgICAgCisgICAgICB2b2lkICpkYXRhMTsKKyAgICAgIHZvaWQgKmRhdGEyOworCisgICAgICBnb3RfZGF0YTEgPSBfZGJ1c19saXN0X2dldF9sYXN0ICgmbGlzdDEpOworICAgICAgZ290X2RhdGEyID0gX2RidXNfbGlzdF9nZXRfZmlyc3QgKCZsaXN0Mik7CisgICAgICAKKyAgICAgIGRhdGExID0gX2RidXNfbGlzdF9wb3BfbGFzdCAoJmxpc3QxKTsKKyAgICAgIGRhdGEyID0gX2RidXNfbGlzdF9wb3BfZmlyc3QgKCZsaXN0Mik7CisKKyAgICAgIF9kYnVzX2Fzc2VydCAoZ290X2RhdGExID09IGRhdGExKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoZ290X2RhdGEyID09IGRhdGEyKTsKKyAgICAgIAorICAgICAgX2RidXNfYXNzZXJ0IChfREJVU19QT0lOVEVSX1RPX0lOVCAoZGF0YTEpID09IGkpOworICAgICAgX2RidXNfYXNzZXJ0IChfREJVU19QT0lOVEVSX1RPX0lOVCAoZGF0YTIpID09IGkpOworCisgICAgICB2ZXJpZnlfbGlzdCAoJmxpc3QxKTsKKyAgICAgIHZlcmlmeV9saXN0ICgmbGlzdDIpOworCisgICAgICBfZGJ1c19hc3NlcnQgKGlzX2FzY2VuZGluZ19zZXF1ZW5jZSAoJmxpc3QxKSk7CisgICAgICBfZGJ1c19hc3NlcnQgKGlzX2Rlc2NlbmRpbmdfc2VxdWVuY2UgKCZsaXN0MikpOworICAgICAgCisgICAgICAtLWk7CisgICAgfQorCisgIF9kYnVzX2Fzc2VydCAobGlzdDEgPT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAobGlzdDIgPT0gTlVMTCk7CisKKyAgLyogVGVzdCBnZXRfZmlyc3RfbGluaywgZ2V0X2xhc3RfbGluaywgcG9wX2ZpcnN0X2xpbmssIHBvcF9sYXN0X2xpbmsgKi8KKyAgCisgIGkgPSAwOworICB3aGlsZSAoaSA8IDEwKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfbGlzdF9hcHBlbmQgKCZsaXN0MSwgX0RCVVNfSU5UX1RPX1BPSU5URVIgKGkpKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGQgbm90IGFsbG9jYXRlIGZvciBhcHBlbmQiKTsKKyAgICAgIGlmICghX2RidXNfbGlzdF9wcmVwZW5kICgmbGlzdDIsIF9EQlVTX0lOVF9UT19QT0lOVEVSIChpKSkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkIG5vdCBhbGxvY2F0ZSBmb3IgcHJlcGVuZCIpOworICAgICAgKytpOworICAgIH0KKworICAtLWk7CisgIHdoaWxlIChpID49IDApCisgICAgeworICAgICAgREJ1c0xpc3QgKmdvdF9saW5rMTsKKyAgICAgIERCdXNMaXN0ICpnb3RfbGluazI7CisgICAgICAKKyAgICAgIHZvaWQgKmRhdGExX2luZGlyZWN0OworICAgICAgdm9pZCAqZGF0YTE7CisgICAgICB2b2lkICpkYXRhMjsKKyAgICAgIAorICAgICAgZ290X2xpbmsxID0gX2RidXNfbGlzdF9nZXRfbGFzdF9saW5rICgmbGlzdDEpOworICAgICAgZ290X2xpbmsyID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJmxpc3QyKTsKKworICAgICAgbGluazIgPSBfZGJ1c19saXN0X3BvcF9maXJzdF9saW5rICgmbGlzdDIpOworCisgICAgICBfZGJ1c19hc3NlcnQgKGdvdF9saW5rMiA9PSBsaW5rMik7CisKKyAgICAgIGRhdGExX2luZGlyZWN0ID0gZ290X2xpbmsxLT5kYXRhOworICAgICAgLyogdGhpcyBjYWxsIG1ha2VzIGdvdF9saW5rMSBpbnZhbGlkICovCisgICAgICBkYXRhMSA9IF9kYnVzX2xpc3RfcG9wX2xhc3QgKCZsaXN0MSk7CisgICAgICBfZGJ1c19hc3NlcnQgKGRhdGExID09IGRhdGExX2luZGlyZWN0KTsKKyAgICAgIGRhdGEyID0gbGluazItPmRhdGE7CisKKyAgICAgIF9kYnVzX2xpc3RfZnJlZV9saW5rIChsaW5rMik7CisgICAgICAKKyAgICAgIF9kYnVzX2Fzc2VydCAoX0RCVVNfUE9JTlRFUl9UT19JTlQgKGRhdGExKSA9PSBpKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoX0RCVVNfUE9JTlRFUl9UT19JTlQgKGRhdGEyKSA9PSBpKTsKKworICAgICAgdmVyaWZ5X2xpc3QgKCZsaXN0MSk7CisgICAgICB2ZXJpZnlfbGlzdCAoJmxpc3QyKTsKKworICAgICAgX2RidXNfYXNzZXJ0IChpc19hc2NlbmRpbmdfc2VxdWVuY2UgKCZsaXN0MSkpOworICAgICAgX2RidXNfYXNzZXJ0IChpc19kZXNjZW5kaW5nX3NlcXVlbmNlICgmbGlzdDIpKTsKKyAgICAgIAorICAgICAgLS1pOworICAgIH0KKworICBfZGJ1c19hc3NlcnQgKGxpc3QxID09IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKGxpc3QyID09IE5VTEwpOworICAKKyAgLyogVGVzdCBpdGVyYXRpb24gKi8KKworICBpID0gMDsKKyAgd2hpbGUgKGkgPCAxMCkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX2xpc3RfYXBwZW5kICgmbGlzdDEsIF9EQlVTX0lOVF9UT19QT0lOVEVSIChpKSkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkIG5vdCBhbGxvY2F0ZSBmb3IgYXBwZW5kIik7CisgICAgICBpZiAoIV9kYnVzX2xpc3RfcHJlcGVuZCAoJmxpc3QyLCBfREJVU19JTlRfVE9fUE9JTlRFUiAoaSkpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZCBub3QgYWxsb2NhdGUgZm9yIHByZXBlbmQiKTsKKyAgICAgICsraTsKKworICAgICAgdmVyaWZ5X2xpc3QgKCZsaXN0MSk7CisgICAgICB2ZXJpZnlfbGlzdCAoJmxpc3QyKTsKKyAgICAgIAorICAgICAgX2RidXNfYXNzZXJ0IChfZGJ1c19saXN0X2dldF9sZW5ndGggKCZsaXN0MSkgPT0gaSk7CisgICAgICBfZGJ1c19hc3NlcnQgKF9kYnVzX2xpc3RfZ2V0X2xlbmd0aCAoJmxpc3QyKSA9PSBpKTsKKyAgICB9CisKKyAgX2RidXNfYXNzZXJ0IChpc19hc2NlbmRpbmdfc2VxdWVuY2UgKCZsaXN0MSkpOworICBfZGJ1c19hc3NlcnQgKGlzX2Rlc2NlbmRpbmdfc2VxdWVuY2UgKCZsaXN0MikpOworCisgIC0taTsKKyAgbGluazIgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmbGlzdDIpOworICB3aGlsZSAobGluazIgIT0gTlVMTCkKKyAgICB7CisgICAgICB2ZXJpZnlfbGlzdCAoJmxpbmsyKTsgLyogcHJldGVuZCB0aGlzIGxpbmsgaXMgdGhlIGhlYWQgKi8KKyAgICAgIAorICAgICAgX2RidXNfYXNzZXJ0IChfREJVU19QT0lOVEVSX1RPX0lOVCAobGluazItPmRhdGEpID09IGkpOworICAgICAgCisgICAgICBsaW5rMiA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJmxpc3QyLCBsaW5rMik7CisgICAgICAtLWk7CisgICAgfQorCisgIGkgPSAwOworICBsaW5rMSA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZsaXN0MSk7CisgIHdoaWxlIChsaW5rMSAhPSBOVUxMKQorICAgIHsKKyAgICAgIHZlcmlmeV9saXN0ICgmbGluazEpOyAvKiBwcmV0ZW5kIHRoaXMgbGluayBpcyB0aGUgaGVhZCAqLworICAgICAgCisgICAgICBfZGJ1c19hc3NlcnQgKF9EQlVTX1BPSU5URVJfVE9fSU5UIChsaW5rMS0+ZGF0YSkgPT0gaSk7CisgICAgICAKKyAgICAgIGxpbmsxID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmbGlzdDEsIGxpbmsxKTsKKyAgICAgICsraTsKKyAgICB9CisKKyAgLS1pOworICBsaW5rMSA9IF9kYnVzX2xpc3RfZ2V0X2xhc3RfbGluayAoJmxpc3QxKTsKKyAgd2hpbGUgKGxpbmsxICE9IE5VTEwpCisgICAgeworICAgICAgdmVyaWZ5X2xpc3QgKCZsaW5rMSk7IC8qIHByZXRlbmQgdGhpcyBsaW5rIGlzIHRoZSBoZWFkICovCisKKyAgICAgIF9kYnVzX2Fzc2VydCAoX0RCVVNfUE9JTlRFUl9UT19JTlQgKGxpbmsxLT5kYXRhKSA9PSBpKTsKKyAgICAgIAorICAgICAgbGluazEgPSBfZGJ1c19saXN0X2dldF9wcmV2X2xpbmsgKCZsaXN0MSwgbGluazEpOworICAgICAgLS1pOworICAgIH0KKworICBfZGJ1c19saXN0X2NsZWFyICgmbGlzdDEpOworICBfZGJ1c19saXN0X2NsZWFyICgmbGlzdDIpOworCisgIC8qIFRlc3QgcmVtb3ZlICovCisgIAorICBpID0gMDsKKyAgd2hpbGUgKGkgPCAxMCkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX2xpc3RfYXBwZW5kICgmbGlzdDEsIF9EQlVTX0lOVF9UT19QT0lOVEVSIChpKSkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkIG5vdCBhbGxvY2F0ZSBmb3IgYXBwZW5kIik7CisgICAgICBpZiAoIV9kYnVzX2xpc3RfcHJlcGVuZCAoJmxpc3QyLCBfREJVU19JTlRfVE9fUE9JTlRFUiAoaSkpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZCBub3QgYWxsb2NhdGUgZm9yIHByZXBlbmQiKTsKKyAgICAgICsraTsKKyAgICB9CisKKyAgLS1pOworICB3aGlsZSAoaSA+PSAwKQorICAgIHsKKyAgICAgIGlmICgoaSAlIDIpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIV9kYnVzX2xpc3RfcmVtb3ZlICgmbGlzdDEsIF9EQlVTX0lOVF9UT19QT0lOVEVSIChpKSkpCisgICAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJlbGVtZW50IHNob3VsZCBoYXZlIGJlZW4gaW4gbGlzdCIpOworICAgICAgICAgIGlmICghX2RidXNfbGlzdF9yZW1vdmUgKCZsaXN0MiwgX0RCVVNfSU5UX1RPX1BPSU5URVIgKGkpKSkKKyAgICAgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImVsZW1lbnQgc2hvdWxkIGhhdmUgYmVlbiBpbiBsaXN0Iik7CisKKyAgICAgICAgICB2ZXJpZnlfbGlzdCAoJmxpc3QxKTsKKyAgICAgICAgICB2ZXJpZnlfbGlzdCAoJmxpc3QyKTsKKyAgICAgICAgfQorICAgICAgLS1pOworICAgIH0KKworICBfZGJ1c19hc3NlcnQgKGFsbF9vZGRfdmFsdWVzICgmbGlzdDEpKTsKKyAgX2RidXNfYXNzZXJ0IChhbGxfb2RkX3ZhbHVlcyAoJmxpc3QyKSk7CisKKyAgX2RidXNfbGlzdF9jbGVhciAoJmxpc3QxKTsKKyAgX2RidXNfbGlzdF9jbGVhciAoJmxpc3QyKTsKKworICAvKiB0ZXN0IHJlbW92aW5nIHRoZSBvdGhlciBoYWxmIG9mIHRoZSBlbGVtZW50cyAqLworICAKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgMTApCisgICAgeworICAgICAgaWYgKCFfZGJ1c19saXN0X2FwcGVuZCAoJmxpc3QxLCBfREJVU19JTlRfVE9fUE9JTlRFUiAoaSkpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZCBub3QgYWxsb2NhdGUgZm9yIGFwcGVuZCIpOworICAgICAgaWYgKCFfZGJ1c19saXN0X3ByZXBlbmQgKCZsaXN0MiwgX0RCVVNfSU5UX1RPX1BPSU5URVIgKGkpKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGQgbm90IGFsbG9jYXRlIGZvciBwcmVwZW5kIik7CisgICAgICArK2k7CisgICAgfQorCisgIC0taTsKKyAgd2hpbGUgKGkgPj0gMCkKKyAgICB7CisgICAgICBpZiAoKGkgJSAyKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCFfZGJ1c19saXN0X3JlbW92ZSAoJmxpc3QxLCBfREJVU19JTlRfVE9fUE9JTlRFUiAoaSkpKQorICAgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZWxlbWVudCBzaG91bGQgaGF2ZSBiZWVuIGluIGxpc3QiKTsKKyAgICAgICAgICBpZiAoIV9kYnVzX2xpc3RfcmVtb3ZlICgmbGlzdDIsIF9EQlVTX0lOVF9UT19QT0lOVEVSIChpKSkpCisgICAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJlbGVtZW50IHNob3VsZCBoYXZlIGJlZW4gaW4gbGlzdCIpOworCisgICAgICAgICAgdmVyaWZ5X2xpc3QgKCZsaXN0MSk7CisgICAgICAgICAgdmVyaWZ5X2xpc3QgKCZsaXN0Mik7CisgICAgICAgIH0KKyAgICAgIC0taTsKKyAgICB9CisKKyAgX2RidXNfYXNzZXJ0IChhbGxfZXZlbl92YWx1ZXMgKCZsaXN0MSkpOworICBfZGJ1c19hc3NlcnQgKGFsbF9ldmVuX3ZhbHVlcyAoJmxpc3QyKSk7CisKKyAgLyogY2xlYXIgbGlzdCB1c2luZyByZW1vdmVfbGluayAqLworICB3aGlsZSAobGlzdDEgIT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c19saXN0X3JlbW92ZV9saW5rICgmbGlzdDEsIGxpc3QxKTsKKyAgICAgIHZlcmlmeV9saXN0ICgmbGlzdDEpOworICAgIH0KKyAgd2hpbGUgKGxpc3QyICE9IE5VTEwpCisgICAgeworICAgICAgX2RidXNfbGlzdF9yZW1vdmVfbGluayAoJmxpc3QyLCBsaXN0Mik7CisgICAgICB2ZXJpZnlfbGlzdCAoJmxpc3QyKTsKKyAgICB9CisKKyAgLyogVGVzdCByZW1vdmUgbGluayBtb3JlIGdlbmVyYWxseSAqLworICBpID0gMDsKKyAgd2hpbGUgKGkgPCAxMCkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX2xpc3RfYXBwZW5kICgmbGlzdDEsIF9EQlVTX0lOVF9UT19QT0lOVEVSIChpKSkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkIG5vdCBhbGxvY2F0ZSBmb3IgYXBwZW5kIik7CisgICAgICBpZiAoIV9kYnVzX2xpc3RfcHJlcGVuZCAoJmxpc3QyLCBfREJVU19JTlRfVE9fUE9JTlRFUiAoaSkpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZCBub3QgYWxsb2NhdGUgZm9yIHByZXBlbmQiKTsKKyAgICAgICsraTsKKyAgICB9CisKKyAgLS1pOworICBsaW5rMiA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZsaXN0Mik7CisgIHdoaWxlIChsaW5rMiAhPSBOVUxMKQorICAgIHsKKyAgICAgIERCdXNMaXN0ICpuZXh0ID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmbGlzdDIsIGxpbmsyKTsKKyAgICAgIAorICAgICAgX2RidXNfYXNzZXJ0IChfREJVU19QT0lOVEVSX1RPX0lOVCAobGluazItPmRhdGEpID09IGkpOworCisgICAgICBpZiAoKGkgJSAyKSA9PSAwKQorICAgICAgICBfZGJ1c19saXN0X3JlbW92ZV9saW5rICgmbGlzdDIsIGxpbmsyKTsKKworICAgICAgdmVyaWZ5X2xpc3QgKCZsaXN0Mik7CisgICAgICAKKyAgICAgIGxpbmsyID0gbmV4dDsKKyAgICAgIC0taTsKKyAgICB9CisKKyAgX2RidXNfYXNzZXJ0IChhbGxfb2RkX3ZhbHVlcyAoJmxpc3QyKSk7ICAKKyAgX2RidXNfbGlzdF9jbGVhciAoJmxpc3QyKTsKKyAgCisgIGkgPSAwOworICBsaW5rMSA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZsaXN0MSk7CisgIHdoaWxlIChsaW5rMSAhPSBOVUxMKQorICAgIHsKKyAgICAgIERCdXNMaXN0ICpuZXh0ID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmbGlzdDEsIGxpbmsxKTsKKworICAgICAgX2RidXNfYXNzZXJ0IChfREJVU19QT0lOVEVSX1RPX0lOVCAobGluazEtPmRhdGEpID09IGkpOworCisgICAgICBpZiAoKGkgJSAyKSAhPSAwKQorICAgICAgICBfZGJ1c19saXN0X3JlbW92ZV9saW5rICgmbGlzdDEsIGxpbmsxKTsKKworICAgICAgdmVyaWZ5X2xpc3QgKCZsaXN0MSk7CisgICAgICAKKyAgICAgIGxpbmsxID0gbmV4dDsKKyAgICAgICsraTsKKyAgICB9CisKKyAgX2RidXNfYXNzZXJ0IChhbGxfZXZlbl92YWx1ZXMgKCZsaXN0MSkpOworICBfZGJ1c19saXN0X2NsZWFyICgmbGlzdDEpOworCisgIC8qIFRlc3QgY29weWluZyBhIGxpc3QgKi8KKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgMTApCisgICAgeworICAgICAgaWYgKCFfZGJ1c19saXN0X2FwcGVuZCAoJmxpc3QxLCBfREJVU19JTlRfVE9fUE9JTlRFUiAoaSkpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZCBub3QgYWxsb2NhdGUgZm9yIGFwcGVuZCIpOworICAgICAgaWYgKCFfZGJ1c19saXN0X3ByZXBlbmQgKCZsaXN0MiwgX0RCVVNfSU5UX1RPX1BPSU5URVIgKGkpKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGQgbm90IGFsbG9jYXRlIGZvciBwcmVwZW5kIik7CisgICAgICArK2k7CisgICAgfQorCisgIC8qIGJhZCBwb2ludGVycywgYmVjYXVzZSB0aGV5IGFyZSBhbGxvd2VkIGluIHRoZSBjb3B5IGRlc3QgKi8KKyAgY29weTEgPSBfREJVU19JTlRfVE9fUE9JTlRFUiAoMHgzNDIyMzQpOworICBjb3B5MiA9IF9EQlVTX0lOVF9UT19QT0lOVEVSICgyMyk7CisgIAorICBfZGJ1c19saXN0X2NvcHkgKCZsaXN0MSwgJmNvcHkxKTsKKyAgdmVyaWZ5X2xpc3QgKCZsaXN0MSk7CisgIHZlcmlmeV9saXN0ICgmY29weTEpOworICBfZGJ1c19hc3NlcnQgKGxpc3RzX2VxdWFsICgmbGlzdDEsICZjb3B5MSkpOworICAKKyAgX2RidXNfbGlzdF9jb3B5ICgmbGlzdDIsICZjb3B5Mik7CisgIHZlcmlmeV9saXN0ICgmbGlzdDIpOworICB2ZXJpZnlfbGlzdCAoJmNvcHkyKTsKKyAgX2RidXNfYXNzZXJ0IChsaXN0c19lcXVhbCAoJmxpc3QyLCAmY29weTIpKTsKKworICAvKiBOb3cgdGVzdCBjb3B5aW5nIGVtcHR5IGxpc3RzICovCisgIF9kYnVzX2xpc3RfY2xlYXIgKCZsaXN0MSk7CisgIF9kYnVzX2xpc3RfY2xlYXIgKCZsaXN0Mik7CisgIF9kYnVzX2xpc3RfY2xlYXIgKCZjb3B5MSk7CisgIF9kYnVzX2xpc3RfY2xlYXIgKCZjb3B5Mik7CisgIAorICAvKiBiYWQgcG9pbnRlcnMsIGJlY2F1c2UgdGhleSBhcmUgYWxsb3dlZCBpbiB0aGUgY29weSBkZXN0ICovCisgIGNvcHkxID0gX0RCVVNfSU5UX1RPX1BPSU5URVIgKDB4MzQyMjM0KTsKKyAgY29weTIgPSBfREJVU19JTlRfVE9fUE9JTlRFUiAoMjMpOworICAKKyAgX2RidXNfbGlzdF9jb3B5ICgmbGlzdDEsICZjb3B5MSk7CisgIHZlcmlmeV9saXN0ICgmbGlzdDEpOworICB2ZXJpZnlfbGlzdCAoJmNvcHkxKTsKKyAgX2RidXNfYXNzZXJ0IChsaXN0c19lcXVhbCAoJmxpc3QxLCAmY29weTEpKTsKKyAgCisgIF9kYnVzX2xpc3RfY29weSAoJmxpc3QyLCAmY29weTIpOworICB2ZXJpZnlfbGlzdCAoJmxpc3QyKTsKKyAgdmVyaWZ5X2xpc3QgKCZjb3B5Mik7CisgIF9kYnVzX2Fzc2VydCAobGlzdHNfZXF1YWwgKCZsaXN0MiwgJmNvcHkyKSk7CisKKyAgX2RidXNfbGlzdF9jbGVhciAoJmxpc3QxKTsKKyAgX2RidXNfbGlzdF9jbGVhciAoJmxpc3QyKTsKKworICAvKiBpbnNlcnRfYWZ0ZXIgb24gZW1wdHkgbGlzdCAqLworICBfZGJ1c19saXN0X2luc2VydF9hZnRlciAoJmxpc3QxLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX0RCVVNfSU5UX1RPX1BPSU5URVIgKDApKTsKKyAgdmVyaWZ5X2xpc3QgKCZsaXN0MSk7CisKKyAgLyogaW5zZXJ0aW5nIGFmdGVyIGZpcnN0IGVsZW1lbnQgKi8KKyAgX2RidXNfbGlzdF9pbnNlcnRfYWZ0ZXIgKCZsaXN0MSwgbGlzdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfREJVU19JTlRfVE9fUE9JTlRFUiAoMSkpOworICB2ZXJpZnlfbGlzdCAoJmxpc3QxKTsKKyAgX2RidXNfYXNzZXJ0IChpc19hc2NlbmRpbmdfc2VxdWVuY2UgKCZsaXN0MSkpOworCisgIC8qIGluc2VydGluZyBhdCB0aGUgZW5kICovCisgIF9kYnVzX2xpc3RfaW5zZXJ0X2FmdGVyICgmbGlzdDEsIGxpc3QxLT5uZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX0RCVVNfSU5UX1RPX1BPSU5URVIgKDIpKTsKKyAgdmVyaWZ5X2xpc3QgKCZsaXN0MSk7CisgIF9kYnVzX2Fzc2VydCAoaXNfYXNjZW5kaW5nX3NlcXVlbmNlICgmbGlzdDEpKTsKKworICAvKiB1c2luZyBpbnNlcnRfYWZ0ZXIgdG8gcHJlcGVuZCAqLworICBfZGJ1c19saXN0X2luc2VydF9hZnRlciAoJmxpc3QxLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX0RCVVNfSU5UX1RPX1BPSU5URVIgKC0xKSk7CisgIHZlcmlmeV9saXN0ICgmbGlzdDEpOworICBfZGJ1c19hc3NlcnQgKGlzX2FzY2VuZGluZ19zZXF1ZW5jZSAoJmxpc3QxKSk7CisgIAorICBfZGJ1c19saXN0X2NsZWFyICgmbGlzdDEpOworCisgIC8qIHVzaW5nIHJlbW92ZV9sYXN0ICovCisgIGlmICghX2RidXNfbGlzdF9hcHBlbmQgKCZsaXN0MSwgX0RCVVNfSU5UX1RPX1BPSU5URVIgKDIpKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZCBub3QgYWxsb2NhdGUgZm9yIGFwcGVuZCIpOworICBpZiAoIV9kYnVzX2xpc3RfYXBwZW5kICgmbGlzdDEsIF9EQlVTX0lOVF9UT19QT0lOVEVSICgxKSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGQgbm90IGFsbG9jYXRlIGZvciBhcHBlbmQiKTsKKyAgaWYgKCFfZGJ1c19saXN0X2FwcGVuZCAoJmxpc3QxLCBfREJVU19JTlRfVE9fUE9JTlRFUiAoMykpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkIG5vdCBhbGxvY2F0ZSBmb3IgYXBwZW5kIik7CisKKyAgX2RidXNfbGlzdF9yZW1vdmVfbGFzdCAoJmxpc3QxLCBfREJVU19JTlRfVE9fUE9JTlRFUiAoMikpOworICAKKyAgdmVyaWZ5X2xpc3QgKCZsaXN0MSk7CisgIF9kYnVzX2Fzc2VydCAoaXNfYXNjZW5kaW5nX3NlcXVlbmNlICgmbGlzdDEpKTsKKyAgCisgIF9kYnVzX2xpc3RfY2xlYXIgKCZsaXN0MSk7CisgIAorICByZXR1cm4gVFJVRTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtbGlzdC5oIGIvZGJ1cy9kYnVzLWxpc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzUwYTBkCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLWxpc3QuaApAQCAtMCwwICsxLDEyNyBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLWxpc3QuaCBHZW5lcmljIGxpbmtlZCBsaXN0IHV0aWxpdHkgKGludGVybmFsIHRvIEQtQnVzIGltcGxlbWVudGF0aW9uKQorICogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaWZuZGVmIERCVVNfTElTVF9ICisjZGVmaW5lIERCVVNfTElTVF9ICisKKyNpbmNsdWRlIDxkYnVzL2RidXMtaW50ZXJuYWxzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLW1lbW9yeS5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy10eXBlcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zeXNkZXBzLmg+CisKK0RCVVNfQkVHSU5fREVDTFMKKworc3RydWN0IERCdXNMaXN0Cit7CisgIERCdXNMaXN0ICpwcmV2OyAvKio8IFByZXZpb3VzIGxpc3Qgbm9kZS4gKi8KKyAgREJ1c0xpc3QgKm5leHQ7IC8qKjwgTmV4dCBsaXN0IG5vZGUuICovCisgIHZvaWQgICAgICpkYXRhOyAvKio8IERhdGEgc3RvcmVkIGF0IHRoaXMgZWxlbWVudC4gKi8KK307CitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCBfZGJ1c19saXN0X2FwcGVuZCAgICAgICAgICAgICAoREJ1c0xpc3QgKipsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAqZGF0YSk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCBfZGJ1c19saXN0X3ByZXBlbmQgICAgICAgICAgICAoREJ1c0xpc3QgKipsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAqZGF0YSk7CitkYnVzX2Jvb2xfdCBfZGJ1c19saXN0X2luc2VydF9iZWZvcmUgICAgICAoREJ1c0xpc3QgKipsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNMaXN0ICAqYmVmb3JlX3RoaXNfbGluaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgKmRhdGEpOworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgX2RidXNfbGlzdF9pbnNlcnRfYWZ0ZXIgICAgICAgKERCdXNMaXN0ICoqbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAgKmFmdGVyX3RoaXNfbGluaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgKmRhdGEpOworREJVU19QUklWQVRFX0VYUE9SVAordm9pZCAgICAgICAgX2RidXNfbGlzdF9pbnNlcnRfYmVmb3JlX2xpbmsgKERCdXNMaXN0ICoqbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAgKmJlZm9yZV90aGlzX2xpbmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICpsaW5rKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK3ZvaWQgICAgICAgIF9kYnVzX2xpc3RfaW5zZXJ0X2FmdGVyX2xpbmsgIChEQnVzTGlzdCAqKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICphZnRlcl90aGlzX2xpbmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICpsaW5rKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90IF9kYnVzX2xpc3RfcmVtb3ZlICAgICAgICAgICAgIChEQnVzTGlzdCAqKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICpkYXRhKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90IF9kYnVzX2xpc3RfcmVtb3ZlX2xhc3QgICAgICAgIChEQnVzTGlzdCAqKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICpkYXRhKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK3ZvaWQgICAgICAgIF9kYnVzX2xpc3RfcmVtb3ZlX2xpbmsgICAgICAgIChEQnVzTGlzdCAqKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICpsaW5rKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK0RCdXNMaXN0KiAgIF9kYnVzX2xpc3RfZmluZF9sYXN0ICAgICAgICAgIChEQnVzTGlzdCAqKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICpkYXRhKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK3ZvaWQgICAgICAgIF9kYnVzX2xpc3RfY2xlYXIgICAgICAgICAgICAgIChEQnVzTGlzdCAqKmxpc3QpOworREJVU19QUklWQVRFX0VYUE9SVAorREJ1c0xpc3QqICAgX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAgICAgKERCdXNMaXN0ICoqbGlzdCk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitEQnVzTGlzdCogICBfZGJ1c19saXN0X2dldF9sYXN0X2xpbmsgICAgICAoREJ1c0xpc3QgKipsaXN0KTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK3ZvaWQqICAgICAgIF9kYnVzX2xpc3RfZ2V0X2xhc3QgICAgICAgICAgIChEQnVzTGlzdCAqKmxpc3QpOworREJVU19QUklWQVRFX0VYUE9SVAordm9pZCogICAgICAgX2RidXNfbGlzdF9nZXRfZmlyc3QgICAgICAgICAgKERCdXNMaXN0ICoqbGlzdCk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCit2b2lkKiAgICAgICBfZGJ1c19saXN0X3BvcF9maXJzdCAgICAgICAgICAoREJ1c0xpc3QgKipsaXN0KTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK3ZvaWQqICAgICAgIF9kYnVzX2xpc3RfcG9wX2xhc3QgICAgICAgICAgIChEQnVzTGlzdCAqKmxpc3QpOworREJVU19QUklWQVRFX0VYUE9SVAorREJ1c0xpc3QqICAgX2RidXNfbGlzdF9wb3BfZmlyc3RfbGluayAgICAgKERCdXNMaXN0ICoqbGlzdCk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCBfZGJ1c19saXN0X2NvcHkgICAgICAgICAgICAgICAoREJ1c0xpc3QgKipsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNMaXN0ICoqZGVzdCk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitpbnQgICAgICAgICBfZGJ1c19saXN0X2dldF9sZW5ndGggICAgICAgICAoREJ1c0xpc3QgKipsaXN0KTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK0RCdXNMaXN0KiAgIF9kYnVzX2xpc3RfYWxsb2NfbGluayAgICAgICAgICh2b2lkICAgICAgKmRhdGEpOworREJVU19QUklWQVRFX0VYUE9SVAordm9pZCAgICAgICAgX2RidXNfbGlzdF9mcmVlX2xpbmsgICAgICAgICAgKERCdXNMaXN0ICAqbGluayk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCit2b2lkICAgICAgICBfZGJ1c19saXN0X3VubGluayAgICAgICAgICAgICAoREJ1c0xpc3QgKipsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNMaXN0ICAqbGluayk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCit2b2lkICAgICAgICBfZGJ1c19saXN0X2FwcGVuZF9saW5rICAgICAgICAoREJ1c0xpc3QgKipsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNMaXN0ICAqbGluayk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCit2b2lkICAgICAgICBfZGJ1c19saXN0X3ByZXBlbmRfbGluayAgICAgICAoREJ1c0xpc3QgKipsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNMaXN0ICAqbGluayk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCBfZGJ1c19saXN0X2xlbmd0aF9pc19vbmUgICAgICAoREJ1c0xpc3QgKipsaXN0KTsKKworCitEQlVTX1BSSVZBVEVfRVhQT1JUCit2b2lkIF9kYnVzX2xpc3RfZm9yZWFjaCAoREJ1c0xpc3QgICAgICAgICAgICAqKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZvcmVhY2hGdW5jdGlvbiAgIGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICpkYXRhKTsKKworI2RlZmluZSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsobGlzdCwgbGluaykgKChsaW5rKS0+bmV4dCA9PSAqKGxpc3QpID8gTlVMTCA6IChsaW5rKS0+bmV4dCkKKyNkZWZpbmUgX2RidXNfbGlzdF9nZXRfcHJldl9saW5rKGxpc3QsIGxpbmspICgobGluaykgPT0gKihsaXN0KSA/IE5VTEwgOiAobGluayktPnByZXYpCisKKy8qIGlmIERCVVNfRU5BQkxFX1NUQVRTICovCitEQlVTX1BSSVZBVEVfRVhQT1JUCit2b2lkICAgICAgICBfZGJ1c19saXN0X2dldF9zdGF0cyAgICAgICAgICAoZGJ1c191aW50MzJfdCAqaW5fdXNlX3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAqaW5fZnJlZV9saXN0X3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAqYWxsb2NhdGVkX3ApOworCitEQlVTX0VORF9ERUNMUworCisjZW5kaWYgLyogREJVU19MSVNUX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1tYWNyb3MuaCBiL2RidXMvZGJ1cy1tYWNyb3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzg5NTZlCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLW1hY3Jvcy5oCkBAIC0wLDAgKzEsMjQwIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtbWFjcm9zLmggIGdlbmVyaWMgbWFjcm9zCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyICBSZWQgSGF0IEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKyNpZiAhZGVmaW5lZCAoREJVU19JTlNJREVfREJVU19IKSAmJiAhZGVmaW5lZCAoREJVU19DT01QSUxBVElPTikKKyNlcnJvciAiT25seSA8ZGJ1cy9kYnVzLmg+IGNhbiBiZSBpbmNsdWRlZCBkaXJlY3RseSwgdGhpcyBmaWxlIG1heSBkaXNhcHBlYXIgb3IgY2hhbmdlIGNvbnRlbnRzLiIKKyNlbmRpZgorCisjaWZuZGVmIERCVVNfTUFDUk9TX0gKKyNkZWZpbmUgREJVU19NQUNST1NfSAorCisjaWZkZWYgIF9fY3BsdXNwbHVzCisjICBkZWZpbmUgREJVU19CRUdJTl9ERUNMUyAgZXh0ZXJuICJDIiB7CisjICBkZWZpbmUgREJVU19FTkRfREVDTFMgICAgfQorI2Vsc2UKKyMgIGRlZmluZSBEQlVTX0JFR0lOX0RFQ0xTCisjICBkZWZpbmUgREJVU19FTkRfREVDTFMKKyNlbmRpZgorCisjaWZuZGVmIFRSVUUKKyMgIGRlZmluZSBUUlVFIDEKKyNlbmRpZgorI2lmbmRlZiBGQUxTRQorIyAgZGVmaW5lIEZBTFNFIDAKKyNlbmRpZgorCisjaWZuZGVmIE5VTEwKKyMgIGlmZGVmIF9fY3BsdXNwbHVzCisjICAgIGRlZmluZSBOVUxMICAgICAgICAoMEwpCisjICBlbHNlIC8qICFfX2NwbHVzcGx1cyAqLworIyAgICBkZWZpbmUgTlVMTCAgICAgICAgKCh2b2lkKikgMCkKKyMgIGVuZGlmIC8qICFfX2NwbHVzcGx1cyAqLworI2VuZGlmCisKKyNpZiAgX19HTlVDX18gPiAzIHx8IChfX0dOVUNfXyA9PSAzICYmIF9fR05VQ19NSU5PUl9fID49IDEpCisjICBkZWZpbmUgREJVU19ERVBSRUNBVEVEIF9fYXR0cmlidXRlX18gKChfX2RlcHJlY2F0ZWRfXykpCisjZWxpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTMwMCkKKyMgIGRlZmluZSBEQlVTX0RFUFJFQ0FURUQgX19kZWNsc3BlYyhkZXByZWNhdGVkKQorI2Vsc2UKKyMgIGRlZmluZSBEQlVTX0RFUFJFQ0FURUQKKyNlbmRpZgorCisjaWYgX19HTlVDX18gPiAyIHx8IChfX0dOVUNfXyA9PSAyICYmIF9fR05VQ19NSU5PUl9fID49IDgpCisjICBkZWZpbmUgX0RCVVNfR05VQ19FWFRFTlNJT04gX19leHRlbnNpb25fXworI2Vsc2UKKyMgIGRlZmluZSBfREJVU19HTlVDX0VYVEVOU0lPTgorI2VuZGlmCisKKyNpZiAgICAgKF9fR05VQ19fID4gMiB8fCAoX19HTlVDX18gPT0gMiAmJiBfX0dOVUNfTUlOT1JfXyA+IDQpKSB8fCBcCisgICAgICAgICBkZWZpbmVkKF9fY2xhbmdfXykKKyNkZWZpbmUgX0RCVVNfR05VQ19QUklOVEYoIGZvcm1hdF9pZHgsIGFyZ19pZHggKSAgICBcCisgIF9fYXR0cmlidXRlX18oKF9fZm9ybWF0X18gKF9fcHJpbnRmX18sIGZvcm1hdF9pZHgsIGFyZ19pZHgpKSkKKyNkZWZpbmUgX0RCVVNfR05VQ19OT1JFVFVSTiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9fYXR0cmlidXRlX18oKF9fbm9yZXR1cm5fXykpCisjZGVmaW5lIF9EQlVTX0dOVUNfVU5VU0VEICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfX2F0dHJpYnV0ZV9fKChfX3VudXNlZF9fKSkKKyNlbHNlICAgLyogIV9fR05VQ19fICovCisjZGVmaW5lIF9EQlVTX0dOVUNfUFJJTlRGKCBmb3JtYXRfaWR4LCBhcmdfaWR4ICkKKyNkZWZpbmUgX0RCVVNfR05VQ19OT1JFVFVSTgorI2RlZmluZSBfREJVU19HTlVDX1VOVVNFRAorI2VuZGlmICAvKiAhX19HTlVDX18gKi8KKworI2lmICAgIF9fR05VQ19fID4gMiB8fCAoX19HTlVDX18gPT0gMiAmJiBfX0dOVUNfTUlOT1JfXyA+PSA5NikKKyNkZWZpbmUgREJVU19NQUxMT0MgICAgIF9fYXR0cmlidXRlX18oKF9fbWFsbG9jX18pKQorI2Vsc2UKKyNkZWZpbmUgREJVU19NQUxMT0MKKyNlbmRpZgorCisjaWYgICAgIChfX0dOVUNfXyA+IDQpIHx8IChfX0dOVUNfXyA9PSA0ICYmIF9fR05VQ19NSU5PUl9fID49IDMpCisjZGVmaW5lIERCVVNfQUxMT0NfU0laRSh4KSBfX2F0dHJpYnV0ZV9fKChfX2FsbG9jX3NpemVfXyh4KSkpCisjZGVmaW5lIERCVVNfQUxMT0NfU0laRTIoeCx5KSBfX2F0dHJpYnV0ZV9fKChfX2FsbG9jX3NpemVfXyh4LHkpKSkKKyNlbHNlCisjZGVmaW5lIERCVVNfQUxMT0NfU0laRSh4KQorI2RlZmluZSBEQlVTX0FMTE9DX1NJWkUyKHgseSkKKyNlbmRpZgorCisjaWYgICAgKF9fR05VQ19fID4gMykgfHwgKF9fR05VQ19fID09IDMgJiYgX19HTlVDX01JTk9SX18gPj0gNCkKKyNkZWZpbmUgX0RCVVNfR05VQ19XQVJOX1VOVVNFRF9SRVNVTFQgX19hdHRyaWJ1dGVfXygod2Fybl91bnVzZWRfcmVzdWx0KSkKKyNlbHNlCisjZGVmaW5lIF9EQlVTX0dOVUNfV0FSTl9VTlVTRURfUkVTVUxUCisjZW5kaWYKKworLyoqIEBkZWYgX0RCVVNfR05VQ19QUklOVEYKKyAqIHVzZWQgdG8gdGVsbCBnY2MgYWJvdXQgcHJpbnRmIGZvcm1hdCBzdHJpbmdzCisgKi8KKy8qKiBAZGVmIF9EQlVTX0dOVUNfTk9SRVRVUk4KKyAqIHVzZWQgdG8gdGVsbCBnY2MgYWJvdXQgZnVuY3Rpb25zIHRoYXQgbmV2ZXIgcmV0dXJuLCBzdWNoIGFzIF9kYnVzX2Fib3J0KCkKKyAqLworLyoqIEBkZWYgX0RCVVNfR05VQ19XQVJOX1VOVVNFRF9SRVNVTFQKKyAqIHVzZWQgdG8gdGVsbCBnY2MgYWJvdXQgZnVuY3Rpb25zIHdob3NlIHJlc3VsdCBtdXN0IGJlIHVzZWQKKyAqLworCisvKiBOb3JtYWxseSBkb2NzIGFyZSBpbiAuYyBmaWxlcywgYnV0IHRoZXJlIGlzbid0IGEgLmMgZmlsZSBmb3IgdGhpcy4gKi8KKy8qKgorICogQGRlZmdyb3VwIERCdXNNYWNyb3MgVXRpbGl0eSBtYWNyb3MKKyAqIEBpbmdyb3VwICBEQnVzCisgKiBAYnJpZWYgI1RSVUUsICNGQUxTRSwgI05VTEwsIGFuZCBzbyBvbgorICoKKyAqIFV0aWxpdHkgbWFjcm9zLgorICoKKyAqIEB7CisgKi8KKworLyoqCisgKiBAZGVmIERCVVNfQkVHSU5fREVDTFMKKyAqCisgKiBNYWNybyB1c2VkIHByaW9yIHRvIGRlY2xhcmluZyBmdW5jdGlvbnMgaW4gdGhlIEQtQnVzIGhlYWRlcgorICogZmlsZXMuIEV4cGFuZHMgdG8gImV4dGVybiAiQyIiIHdoZW4gdXNpbmcgYSBDKysgY29tcGlsZXIsCisgKiBhbmQgZXhwYW5kcyB0byBub3RoaW5nIHdoZW4gdXNpbmcgYSBDIGNvbXBpbGVyLgorICoKKyAqIFBsZWFzZSBkb24ndCB1c2UgdGhpcyBpbiB5b3VyIG93biBjb2RlLCBjb25zaWRlciBpdAorICogRC1CdXMgaW50ZXJuYWwuCisgKi8KKy8qKgorICogQGRlZiBEQlVTX0VORF9ERUNMUworICoKKyAqIE1hY3JvIHVzZWQgYWZ0ZXIgZGVjbGFyaW5nIGZ1bmN0aW9ucyBpbiB0aGUgRC1CdXMgaGVhZGVyCisgKiBmaWxlcy4gRXhwYW5kcyB0byAifSIgd2hlbiB1c2luZyBhIEMrKyBjb21waWxlciwKKyAqIGFuZCBleHBhbmRzIHRvIG5vdGhpbmcgd2hlbiB1c2luZyBhIEMgY29tcGlsZXIuCisgKgorICogUGxlYXNlIGRvbid0IHVzZSB0aGlzIGluIHlvdXIgb3duIGNvZGUsIGNvbnNpZGVyIGl0CisgKiBELUJ1cyBpbnRlcm5hbC4KKyAqLworLyoqCisgKiBAZGVmIFRSVUUKKyAqCisgKiBFeHBhbmRzIHRvICIxIgorICovCisvKioKKyAqIEBkZWYgRkFMU0UKKyAqCisgKiBFeHBhbmRzIHRvICIwIgorICovCisvKioKKyAqIEBkZWYgTlVMTAorICoKKyAqIEEgbnVsbCBwb2ludGVyLCBkZWZpbmVkIGFwcHJvcHJpYXRlbHkgZm9yIEMgb3IgQysrLgorICovCisvKioKKyAqIEBkZWYgREJVU19ERVBSRUNBVEVECisgKgorICogVGVsbHMgdGhlIGNvbXBpbGVyIHRvIHdhcm4gYWJvdXQgYSBmdW5jdGlvbiBvciB0eXBlIGlmIGl0J3MgdXNlZC4KKyAqIENvZGUgbWFya2VkIGluIHRoaXMgd2F5IHNob3VsZCBhbHNvIGJlIGVuY2xvc2VkIGluCisgKiBAY29kZQorICogI2lmbmRlZiBEQlVTX0RJU0FCTEVfREVQUkVDQVRFRAorICogIGRlcHJlY2F0ZWQgc3R1ZmYgaGVyZQorICogI2VuZGlmCisgKiBAZW5kY29kZQorICoKKyAqIFBsZWFzZSBkb24ndCB1c2UgdGhpcyBpbiB5b3VyIG93biBjb2RlLCBjb25zaWRlciBpdAorICogRC1CdXMgaW50ZXJuYWwuCisgKi8KKy8qKgorICogQGRlZiBfREJVU19HTlVDX0VYVEVOU0lPTgorICoKKyAqIFRlbGxzIGdjYyBub3QgdG8gd2FybiBhYm91dCBleHRlbnNpb25zIHRvIHRoZSBDIHN0YW5kYXJkIGluIHRoZQorICogZm9sbG93aW5nIGV4cHJlc3Npb24sIGV2ZW4gaWYgY29tcGlsaW5nIHdpdGggLXBlZGFudGljLiBEbyBub3QgdXNlCisgKiB0aGlzIG1hY3JvIGluIHlvdXIgb3duIGNvZGU7IHBsZWFzZSBjb25zaWRlciBpdCB0byBiZSBpbnRlcm5hbCB0byBsaWJkYnVzLgorICovCisKKy8qCisgKiBAZGVmIERCVVNfRVhQT1JUCisgKgorICogRGVjbGFyZSB0aGUgZm9sbG93aW5nIHN5bWJvbCBhcyBwdWJsaWMuICBUaGlzIGlzIGN1cnJlbnRseSBhIG5vb3Agb24KKyAqIHBsYXRmb3JtcyBvdGhlciB0aGFuIFdpbmRvd3MuCisgKi8KKworI2lmIGRlZmluZWQoREJVU19FWFBPUlQpCisgIC8qIHZhbHVlIGZvcmNlZCBieSBjb21waWxlciBjb21tYW5kIGxpbmUsIGRvbid0IHJlZGVmaW5lICovCisjZWxpZiBkZWZpbmVkKF9XSU4zMikKKyMgIGlmIGRlZmluZWQoREJVU19TVEFUSUNfQlVJTEQpCisjICBkZWZpbmUgREJVU19FWFBPUlQKKyMgIGVsaWYgZGVmaW5lZChkYnVzXzFfRVhQT1JUUykKKyMgIGRlZmluZSBEQlVTX0VYUE9SVCBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKKyMgIGVsc2UKKyMgIGRlZmluZSBEQlVTX0VYUE9SVCBfX2RlY2xzcGVjKGRsbGltcG9ydCkKKyMgIGVuZGlmCisjZWxpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBfX0dOVUNfXyA+PSA0CisjICBkZWZpbmUgREJVU19FWFBPUlQgX19hdHRyaWJ1dGVfXyAoKF9fdmlzaWJpbGl0eV9fICgiZGVmYXVsdCIpKSkKKyNlbHNlCisjZGVmaW5lIERCVVNfRVhQT1JUCisjZW5kaWYKKworI2lmIGRlZmluZWQoREJVU19QUklWQVRFX0VYUE9SVCkKKyAgLyogdmFsdWUgZm9yY2VkIGJ5IGNvbXBpbGVyIGNvbW1hbmQgbGluZSwgZG9uJ3QgcmVkZWZpbmUgKi8KKyNlbGlmIGRlZmluZWQoX1dJTjMyKQorIyAgaWYgZGVmaW5lZChEQlVTX1NUQVRJQ19CVUlMRCkKKyMgICAgZGVmaW5lIERCVVNfUFJJVkFURV9FWFBPUlQgLyogbm8gZGVjb3JhdGlvbiAqLworIyAgZWxpZiBkZWZpbmVkKGRidXNfMV9FWFBPUlRTKQorIyAgICBkZWZpbmUgREJVU19QUklWQVRFX0VYUE9SVCBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKKyMgIGVsc2UKKyMgICAgZGVmaW5lIERCVVNfUFJJVkFURV9FWFBPUlQgX19kZWNsc3BlYyhkbGxpbXBvcnQpCisjICBlbmRpZgorI2VsaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgX19HTlVDX18gPj0gNAorIyAgZGVmaW5lIERCVVNfUFJJVkFURV9FWFBPUlQgX19hdHRyaWJ1dGVfXyAoKF9fdmlzaWJpbGl0eV9fICgiZGVmYXVsdCIpKSkKKyNlbHNlCisjICBkZWZpbmUgREJVU19QUklWQVRFX0VYUE9SVCAvKiBubyBkZWNvcmF0aW9uICovCisjZW5kaWYKKworLyogSW1wbGVtZW50YXRpb24gZm9yIGRidXNfY2xlYXJfbWVzc2FnZSgpIGV0Yy4gVGhpcyBpcyBub3QgQVBJLAorICogZG8gbm90IHVzZSBpdCBkaXJlY3RseS4KKyAqCisgKiBXZSdyZSB1c2luZyBhIHNwZWNpZmljIHR5cGUgKFQgKiogYW5kIFQgKikgaW5zdGVhZCBvZiB2b2lkICoqIGFuZAorICogdm9pZCAqIHBhcnRseSBmb3IgdHlwZS1zYWZldHksIHBhcnRseSB0byBiZSBzdHJpY3QtYWxpYXNpbmctY29tcGxpYW50LAorICogYW5kIHBhcnRseSB0byBrZWVwIEMrKyBjb21waWxlcnMgaGFwcHkuIFRoaXMgY29kZSBpcyBpbmxpbmVkIGludG8KKyAqIHVzZXJzIG9mIGxpYmRidXMsIHNvIHdlIGNhbid0IHJlbHkgb24gaXQgaGF2aW5nIGRidXMnIG93biBjb21waWxlcgorICogc2V0dGluZ3MuICovCisjZGVmaW5lIF9kYnVzX2NsZWFyX3BvaW50ZXJfaW1wbChULCBwb2ludGVyX3RvX3BvaW50ZXIsIGRlc3Ryb3kpIFwKKyAgZG8geyBcCisgICAgVCAqKl9wcCA9IChwb2ludGVyX3RvX3BvaW50ZXIpOyBcCisgICAgVCAqX3ZhbHVlID0gKl9wcDsgXAorICAgIFwKKyAgICAqX3BwID0gTlVMTDsgXAorICAgIFwKKyAgICBpZiAoX3ZhbHVlICE9IE5VTEwpIFwKKyAgICAgIGRlc3Ryb3kgKF92YWx1ZSk7IFwKKyAgfSB3aGlsZSAoMCkKKy8qIE5vdCAoZGVzdHJveSkgKF92YWx1ZSkgaW4gY2FzZSBkZXN0cm95KCkgaXMgYSBmdW5jdGlvbi1saWtlIG1hY3JvICovCisKKy8qKiBAfSAqLworCisjZW5kaWYgLyogREJVU19NQUNST1NfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLW1haW5sb29wLmMgYi9kYnVzL2RidXMtbWFpbmxvb3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjhhZTBmCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLW1haW5sb29wLmMKQEAgLTAsMCArMSw5MjIgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1tYWlubG9vcC5jICBNYWluIGxvb3AgdXRpbGl0eQorICoKKyAqIENvcHlyaWdodCDCqSAyMDAzLCAyMDA0ICBSZWQgSGF0LCBJbmMuCisgKiBDb3B5cmlnaHQgwqkgMjAxMSBOb2tpYSBDb3Jwb3JhdGlvbgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiZGJ1cy1tYWlubG9vcC5oIgorCisjaWZuZGVmIERPWFlHRU5fU0hPVUxEX1NLSVBfVEhJUworCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWhhc2guaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbGlzdC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zb2NrZXQtc2V0Lmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXRpbWVvdXQuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtd2F0Y2guaD4KKworI2RlZmluZSBNQUlOTE9PUF9TUEVXIDAKKworc3RydWN0IERCdXNMb29wCit7CisgIGludCByZWZjb3VudDsKKyAgLyoqIERCdXNQb2xsYWJsZSA9PiBkYnVzX21hbGxvYydkIERCdXNMaXN0ICoqIG9mIHJlZmVyZW5jZXMgdG8gREJ1c1dhdGNoICovCisgIERCdXNIYXNoVGFibGUgKndhdGNoZXM7CisgIERCdXNTb2NrZXRTZXQgKnNvY2tldF9zZXQ7CisgIERCdXNMaXN0ICp0aW1lb3V0czsKKyAgaW50IGNhbGxiYWNrX2xpc3Rfc2VyaWFsOworICBpbnQgd2F0Y2hfY291bnQ7CisgIGludCB0aW1lb3V0X2NvdW50OworICBpbnQgZGVwdGg7IC8qKjwgbnVtYmVyIG9mIHJlY3Vyc2l2ZSBydW5zICovCisgIERCdXNMaXN0ICpuZWVkX2Rpc3BhdGNoOworICAvKiogVFJVRSBpZiB3ZSB3aWxsIHNraXAgYSB3YXRjaCBuZXh0IHRpbWUgYmVjYXVzZSBpdCB3YXMgT09NOyBiZWNvbWVzCisgICAqIEZBTFNFIGJldHdlZW4gcG9sbGluZywgYW5kIGRlYWxpbmcgd2l0aCB0aGUgcmVzdWx0cyBvZiB0aGUgcG9sbCAqLworICB1bnNpZ25lZCBvb21fd2F0Y2hfcGVuZGluZyA6IDE7Cit9OworCit0eXBlZGVmIHN0cnVjdAoreworICBEQnVzVGltZW91dCAqdGltZW91dDsKKyAgbG9uZyBsYXN0X3R2X3NlYzsKKyAgbG9uZyBsYXN0X3R2X3VzZWM7Cit9IFRpbWVvdXRDYWxsYmFjazsKKworI2RlZmluZSBUSU1FT1VUX0NBTExCQUNLKGNhbGxiYWNrKSAoKFRpbWVvdXRDYWxsYmFjayopY2FsbGJhY2spCisKK3N0YXRpYyBUaW1lb3V0Q2FsbGJhY2sqCit0aW1lb3V0X2NhbGxiYWNrX25ldyAoREJ1c1RpbWVvdXQgICAgICAgICAqdGltZW91dCkKK3sKKyAgVGltZW91dENhbGxiYWNrICpjYjsKKworICBjYiA9IGRidXNfbmV3IChUaW1lb3V0Q2FsbGJhY2ssIDEpOworICBpZiAoY2IgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBjYi0+dGltZW91dCA9IHRpbWVvdXQ7CisgIF9kYnVzX2dldF9tb25vdG9uaWNfdGltZSAoJmNiLT5sYXN0X3R2X3NlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2ItPmxhc3RfdHZfdXNlYyk7CisgIHJldHVybiBjYjsKK30KKworc3RhdGljIHZvaWQKK3RpbWVvdXRfY2FsbGJhY2tfZnJlZSAoVGltZW91dENhbGxiYWNrICpjYikKK3sKKyAgZGJ1c19mcmVlIChjYik7Cit9CisKK3N0YXRpYyB2b2lkCitmcmVlX3dhdGNoX3RhYmxlX2VudHJ5ICh2b2lkICpkYXRhKQoreworICBEQnVzTGlzdCAqKndhdGNoZXMgPSBkYXRhOworICBEQnVzV2F0Y2ggKndhdGNoOworCisgIC8qIERCdXNIYXNoVGFibGUgc29tZXRpbWVzIGNhbGxzIGZyZWVfZnVuY3Rpb24oTlVMTCkgZXZlbiBpZiB5b3UgbmV2ZXIKKyAgICogaGF2ZSBOVUxMIGFzIGEgdmFsdWUgKi8KKyAgaWYgKHdhdGNoZXMgPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAgZm9yICh3YXRjaCA9IF9kYnVzX2xpc3RfcG9wX2ZpcnN0ICh3YXRjaGVzKTsKKyAgICAgIHdhdGNoICE9IE5VTEw7CisgICAgICB3YXRjaCA9IF9kYnVzX2xpc3RfcG9wX2ZpcnN0ICh3YXRjaGVzKSkKKyAgICB7CisgICAgICBfZGJ1c193YXRjaF91bnJlZiAod2F0Y2gpOworICAgIH0KKworICBfZGJ1c19hc3NlcnQgKCp3YXRjaGVzID09IE5VTEwpOworICBkYnVzX2ZyZWUgKHdhdGNoZXMpOworfQorCitEQnVzTG9vcCoKK19kYnVzX2xvb3BfbmV3ICh2b2lkKQoreworICBEQnVzTG9vcCAqbG9vcDsKKworICBsb29wID0gZGJ1c19uZXcwIChEQnVzTG9vcCwgMSk7CisgIGlmIChsb29wID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgbG9vcC0+d2F0Y2hlcyA9IF9kYnVzX2hhc2hfdGFibGVfbmV3IChEQlVTX0hBU0hfUE9MTEFCTEUsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZV93YXRjaF90YWJsZV9lbnRyeSk7CisKKyAgbG9vcC0+c29ja2V0X3NldCA9IF9kYnVzX3NvY2tldF9zZXRfbmV3ICgwKTsKKworICBpZiAobG9vcC0+d2F0Y2hlcyA9PSBOVUxMIHx8IGxvb3AtPnNvY2tldF9zZXQgPT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAobG9vcC0+d2F0Y2hlcyAhPSBOVUxMKQorICAgICAgICBfZGJ1c19oYXNoX3RhYmxlX3VucmVmIChsb29wLT53YXRjaGVzKTsKKworICAgICAgaWYgKGxvb3AtPnNvY2tldF9zZXQgIT0gTlVMTCkKKyAgICAgICAgX2RidXNfc29ja2V0X3NldF9mcmVlIChsb29wLT5zb2NrZXRfc2V0KTsKKworICAgICAgZGJ1c19mcmVlIChsb29wKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBsb29wLT5yZWZjb3VudCA9IDE7CisKKyAgcmV0dXJuIGxvb3A7Cit9CisKK0RCdXNMb29wICoKK19kYnVzX2xvb3BfcmVmIChEQnVzTG9vcCAqbG9vcCkKK3sKKyAgX2RidXNfYXNzZXJ0IChsb29wICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKGxvb3AtPnJlZmNvdW50ID4gMCk7CisKKyAgbG9vcC0+cmVmY291bnQgKz0gMTsKKworICByZXR1cm4gbG9vcDsKK30KKwordm9pZAorX2RidXNfbG9vcF91bnJlZiAoREJ1c0xvb3AgKmxvb3ApCit7CisgIF9kYnVzX2Fzc2VydCAobG9vcCAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChsb29wLT5yZWZjb3VudCA+IDApOworCisgIGxvb3AtPnJlZmNvdW50IC09IDE7CisgIGlmIChsb29wLT5yZWZjb3VudCA9PSAwKQorICAgIHsKKyAgICAgIHdoaWxlIChsb29wLT5uZWVkX2Rpc3BhdGNoKQorICAgICAgICB7CisgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBfZGJ1c19saXN0X3BvcF9maXJzdCAoJmxvb3AtPm5lZWRfZGlzcGF0Y2gpOworCisgICAgICAgICAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChjb25uZWN0aW9uKTsKKyAgICAgICAgfQorCisgICAgICBfZGJ1c19oYXNoX3RhYmxlX3VucmVmIChsb29wLT53YXRjaGVzKTsKKyAgICAgIF9kYnVzX3NvY2tldF9zZXRfZnJlZSAobG9vcC0+c29ja2V0X3NldCk7CisgICAgICBkYnVzX2ZyZWUgKGxvb3ApOworICAgIH0KK30KKworc3RhdGljIERCdXNMaXN0ICoqCitlbnN1cmVfd2F0Y2hfdGFibGVfZW50cnkgKERCdXNMb29wICAgICpsb29wLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzUG9sbGFibGUgZmQpCit7CisgIERCdXNMaXN0ICoqd2F0Y2hlczsKKworICB3YXRjaGVzID0gX2RidXNfaGFzaF90YWJsZV9sb29rdXBfcG9sbGFibGUgKGxvb3AtPndhdGNoZXMsIGZkKTsKKworICBpZiAod2F0Y2hlcyA9PSBOVUxMKQorICAgIHsKKyAgICAgIHdhdGNoZXMgPSBkYnVzX25ldzAgKERCdXNMaXN0ICosIDEpOworCisgICAgICBpZiAod2F0Y2hlcyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gd2F0Y2hlczsKKworICAgICAgaWYgKCFfZGJ1c19oYXNoX3RhYmxlX2luc2VydF9wb2xsYWJsZSAobG9vcC0+d2F0Y2hlcywgZmQsIHdhdGNoZXMpKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19mcmVlICh3YXRjaGVzKTsKKyAgICAgICAgICB3YXRjaGVzID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICByZXR1cm4gd2F0Y2hlczsKK30KKworc3RhdGljIHZvaWQKK2N1bGxfd2F0Y2hlc19mb3JfaW52YWxpZF9mZCAoREJ1c0xvb3AgICAgICpsb29wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzUG9sbGFibGUgIGZkKQoreworICBEQnVzTGlzdCAqbGluazsKKyAgREJ1c0xpc3QgKip3YXRjaGVzOworCisgIF9kYnVzX3dhcm4gKCJpbnZhbGlkIHJlcXVlc3QsIHNvY2tldCBmZCAlIiBEQlVTX1BPTExBQkxFX0ZPUk1BVCAiIG5vdCBvcGVuIiwKKyAgICAgICAgICAgICAgX2RidXNfcG9sbGFibGVfcHJpbnRhYmxlIChmZCkpOworICB3YXRjaGVzID0gX2RidXNfaGFzaF90YWJsZV9sb29rdXBfcG9sbGFibGUgKGxvb3AtPndhdGNoZXMsIGZkKTsKKworICBpZiAod2F0Y2hlcyAhPSBOVUxMKQorICAgIHsKKyAgICAgIGZvciAobGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKHdhdGNoZXMpOworICAgICAgICAgIGxpbmsgIT0gTlVMTDsKKyAgICAgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICh3YXRjaGVzLCBsaW5rKSkKKyAgICAgICAgX2RidXNfd2F0Y2hfaW52YWxpZGF0ZSAobGluay0+ZGF0YSk7CisgICAgfQorCisgIF9kYnVzX2hhc2hfdGFibGVfcmVtb3ZlX3BvbGxhYmxlIChsb29wLT53YXRjaGVzLCBmZCk7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZ2Nfd2F0Y2hfdGFibGVfZW50cnkgKERCdXNMb29wICAgICAgKmxvb3AsCisgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICAgICoqd2F0Y2hlcywKKyAgICAgICAgICAgICAgICAgICAgICBEQnVzUG9sbGFibGUgICBmZCkKK3sKKyAgLyogSWYgd2F0Y2hlcyBpcyBhbHJlYWR5IE5VTEwgd2UgaGF2ZSBub3RoaW5nIHRvIGRvICovCisgIGlmICh3YXRjaGVzID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIC8qIFdlIGNhbid0IEdDIGhhc2ggdGFibGUgZW50cmllcyBpZiB0aGV5J3JlIG5vbi1lbXB0eSBsaXN0cyAqLworICBpZiAoKndhdGNoZXMgIT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgX2RidXNfaGFzaF90YWJsZV9yZW1vdmVfcG9sbGFibGUgKGxvb3AtPndhdGNoZXMsIGZkKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCityZWZyZXNoX3dhdGNoZXNfZm9yX2ZkIChEQnVzTG9vcCAgICAgICpsb29wLAorICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICAgICoqd2F0Y2hlcywKKyAgICAgICAgICAgICAgICAgICAgICAgIERCdXNQb2xsYWJsZSAgIGZkKQoreworICBEQnVzTGlzdCAqbGluazsKKyAgdW5zaWduZWQgaW50IGZsYWdzID0gMDsKKyAgZGJ1c19ib29sX3QgaW50ZXJlc3RlZCA9IEZBTFNFOworCisgIF9kYnVzX2Fzc2VydCAoX2RidXNfcG9sbGFibGVfaXNfdmFsaWQgKGZkKSk7CisKKyAgaWYgKHdhdGNoZXMgPT0gTlVMTCkKKyAgICB3YXRjaGVzID0gX2RidXNfaGFzaF90YWJsZV9sb29rdXBfcG9sbGFibGUgKGxvb3AtPndhdGNoZXMsIGZkKTsKKworICAvKiB3ZSBhbGxvY2F0ZWQgdGhpcyBpbiB0aGUgZmlyc3QgX2RidXNfbG9vcF9hZGRfd2F0Y2ggZm9yIHRoZSBmZCwgYW5kIGtlZXAKKyAgICogaXQgdW50aWwgdGhlcmUgYXJlIG5vbmUgbGVmdCAqLworICBfZGJ1c19hc3NlcnQgKHdhdGNoZXMgIT0gTlVMTCk7CisKKyAgZm9yIChsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAod2F0Y2hlcyk7CisgICAgICBsaW5rICE9IE5VTEw7CisgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICh3YXRjaGVzLCBsaW5rKSkKKyAgICB7CisgICAgICBpZiAoZGJ1c193YXRjaF9nZXRfZW5hYmxlZCAobGluay0+ZGF0YSkgJiYKKyAgICAgICAgICAhX2RidXNfd2F0Y2hfZ2V0X29vbV9sYXN0X3RpbWUgKGxpbmstPmRhdGEpKQorICAgICAgICB7CisgICAgICAgICAgZmxhZ3MgfD0gZGJ1c193YXRjaF9nZXRfZmxhZ3MgKGxpbmstPmRhdGEpOworICAgICAgICAgIGludGVyZXN0ZWQgPSBUUlVFOworICAgICAgICB9CisgICAgfQorCisgIGlmIChpbnRlcmVzdGVkKQorICAgIF9kYnVzX3NvY2tldF9zZXRfZW5hYmxlIChsb29wLT5zb2NrZXRfc2V0LCBmZCwgZmxhZ3MpOworICBlbHNlCisgICAgX2RidXNfc29ja2V0X3NldF9kaXNhYmxlIChsb29wLT5zb2NrZXRfc2V0LCBmZCk7Cit9CisKK2RidXNfYm9vbF90CitfZGJ1c19sb29wX2FkZF93YXRjaCAoREJ1c0xvb3AgICpsb29wLAorICAgICAgICAgICAgICAgICAgICAgIERCdXNXYXRjaCAqd2F0Y2gpCit7CisgIERCdXNQb2xsYWJsZSBmZDsKKyAgREJ1c0xpc3QgKip3YXRjaGVzOworCisgIGZkID0gX2RidXNfd2F0Y2hfZ2V0X3BvbGxhYmxlICh3YXRjaCk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfcG9sbGFibGVfaXNfdmFsaWQgKGZkKSk7CisKKyAgd2F0Y2hlcyA9IGVuc3VyZV93YXRjaF90YWJsZV9lbnRyeSAobG9vcCwgZmQpOworCisgIGlmICh3YXRjaGVzID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghX2RidXNfbGlzdF9hcHBlbmQgKHdhdGNoZXMsIF9kYnVzX3dhdGNoX3JlZiAod2F0Y2gpKSkKKyAgICB7CisgICAgICBfZGJ1c193YXRjaF91bnJlZiAod2F0Y2gpOworICAgICAgZ2Nfd2F0Y2hfdGFibGVfZW50cnkgKGxvb3AsIHdhdGNoZXMsIGZkKTsKKworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoX2RidXNfbGlzdF9sZW5ndGhfaXNfb25lICh3YXRjaGVzKSkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX3NvY2tldF9zZXRfYWRkIChsb29wLT5zb2NrZXRfc2V0LCBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfd2F0Y2hfZ2V0X2ZsYWdzICh3YXRjaCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3dhdGNoX2dldF9lbmFibGVkICh3YXRjaCkpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfaGFzaF90YWJsZV9yZW1vdmVfcG9sbGFibGUgKGxvb3AtPndhdGNoZXMsIGZkKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiB3ZSdyZSBtb2RpZnlpbmcsIG5vdCBhZGRpbmcsIHdoaWNoIGNhbid0IGZhaWwgd2l0aCBPT00gKi8KKyAgICAgIHJlZnJlc2hfd2F0Y2hlc19mb3JfZmQgKGxvb3AsIHdhdGNoZXMsIGZkKTsKKyAgICB9CisKKyAgbG9vcC0+Y2FsbGJhY2tfbGlzdF9zZXJpYWwgKz0gMTsKKyAgbG9vcC0+d2F0Y2hfY291bnQgKz0gMTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3ZvaWQKK19kYnVzX2xvb3BfdG9nZ2xlX3dhdGNoIChEQnVzTG9vcCAgICAgICAgICAqbG9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzV2F0Y2ggICAgICAgICAqd2F0Y2gpCit7CisgIHJlZnJlc2hfd2F0Y2hlc19mb3JfZmQgKGxvb3AsIE5VTEwsIF9kYnVzX3dhdGNoX2dldF9wb2xsYWJsZSAod2F0Y2gpKTsKK30KKwordm9pZAorX2RidXNfbG9vcF9yZW1vdmVfd2F0Y2ggKERCdXNMb29wICAgICAgICAgKmxvb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1dhdGNoICAgICAgICAqd2F0Y2gpCit7CisgIERCdXNMaXN0ICoqd2F0Y2hlczsKKyAgREJ1c0xpc3QgKmxpbms7CisgIERCdXNQb2xsYWJsZSBmZDsKKworICAvKiBUaGlzIHJlbGllcyBvbiBwZW9wbGUgcmVtb3Zpbmcgd2F0Y2hlcyBiZWZvcmUgdGhleSBpbnZhbGlkYXRlIHRoZW0sCisgICAqIHdoaWNoIGhhcyBiZWVuIHNhZmUgc2luY2UgZmQubyAjMzMzMzYgd2FzIGZpeGVkLiBBc3NlcnQgYWJvdXQgaXQKKyAgICogc28gd2UgZG9uJ3QgcmVncmVzcy4gKi8KKyAgZmQgPSBfZGJ1c193YXRjaF9nZXRfcG9sbGFibGUgKHdhdGNoKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19wb2xsYWJsZV9pc192YWxpZCAoZmQpKTsKKworICB3YXRjaGVzID0gX2RidXNfaGFzaF90YWJsZV9sb29rdXBfcG9sbGFibGUgKGxvb3AtPndhdGNoZXMsIGZkKTsKKworICBpZiAod2F0Y2hlcyAhPSBOVUxMKQorICAgIHsKKyAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICh3YXRjaGVzKTsKKyAgICAgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBEQnVzTGlzdCAqbmV4dCA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAod2F0Y2hlcywgbGluayk7CisgICAgICAgICAgREJ1c1dhdGNoICp0aGlzID0gbGluay0+ZGF0YTsKKworICAgICAgICAgIGlmICh0aGlzID09IHdhdGNoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c19saXN0X3JlbW92ZV9saW5rICh3YXRjaGVzLCBsaW5rKTsKKyAgICAgICAgICAgICAgbG9vcC0+Y2FsbGJhY2tfbGlzdF9zZXJpYWwgKz0gMTsKKyAgICAgICAgICAgICAgbG9vcC0+d2F0Y2hfY291bnQgLT0gMTsKKyAgICAgICAgICAgICAgX2RidXNfd2F0Y2hfdW5yZWYgKHRoaXMpOworCisgICAgICAgICAgICAgIC8qIGlmIHRoYXQgd2FzIHRoZSBsYXN0IHdhdGNoIGZvciB0aGF0IGZkLCBkcm9wIHRoZSBoYXNoIHRhYmxlCisgICAgICAgICAgICAgICAqIGVudHJ5LCBhbmQgc3RvcCByZXNlcnZpbmcgc3BhY2UgZm9yIGl0IGluIHRoZSBzb2NrZXQgc2V0ICovCisgICAgICAgICAgICAgIGlmIChnY193YXRjaF90YWJsZV9lbnRyeSAobG9vcCwgd2F0Y2hlcywgZmQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIF9kYnVzX3NvY2tldF9zZXRfcmVtb3ZlIChsb29wLT5zb2NrZXRfc2V0LCBmZCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGxpbmsgPSBuZXh0OworICAgICAgICAgfQorICAgICB9CisKKyAgX2RidXNfd2FybiAoImNvdWxkIG5vdCBmaW5kIHdhdGNoICVwIHRvIHJlbW92ZSIsIHdhdGNoKTsKK30KKworZGJ1c19ib29sX3QKK19kYnVzX2xvb3BfYWRkX3RpbWVvdXQgKERCdXNMb29wICAgICAgICAgICAqbG9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUaW1lb3V0ICAgICAgICAqdGltZW91dCkKK3sKKyAgVGltZW91dENhbGxiYWNrICp0Y2I7CisKKyAgdGNiID0gdGltZW91dF9jYWxsYmFja19uZXcgKHRpbWVvdXQpOworICBpZiAodGNiID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmIChfZGJ1c19saXN0X2FwcGVuZCAoJmxvb3AtPnRpbWVvdXRzLCB0Y2IpKQorICAgIHsKKyAgICAgIGxvb3AtPmNhbGxiYWNrX2xpc3Rfc2VyaWFsICs9IDE7CisgICAgICBsb29wLT50aW1lb3V0X2NvdW50ICs9IDE7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgdGltZW91dF9jYWxsYmFja19mcmVlICh0Y2IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgCisgIHJldHVybiBUUlVFOworfQorCit2b2lkCitfZGJ1c19sb29wX3JlbW92ZV90aW1lb3V0IChEQnVzTG9vcCAgICAgICAgICAgKmxvb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVGltZW91dCAgICAgICAgKnRpbWVvdXQpCit7CisgIERCdXNMaXN0ICpsaW5rOworICAKKyAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZsb29wLT50aW1lb3V0cyk7CisgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgeworICAgICAgREJ1c0xpc3QgKm5leHQgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZsb29wLT50aW1lb3V0cywgbGluayk7CisgICAgICBUaW1lb3V0Q2FsbGJhY2sgKnRoaXMgPSBsaW5rLT5kYXRhOworCisgICAgICBpZiAodGhpcy0+dGltZW91dCA9PSB0aW1lb3V0KQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfbGlzdF9yZW1vdmVfbGluayAoJmxvb3AtPnRpbWVvdXRzLCBsaW5rKTsKKyAgICAgICAgICBsb29wLT5jYWxsYmFja19saXN0X3NlcmlhbCArPSAxOworICAgICAgICAgIGxvb3AtPnRpbWVvdXRfY291bnQgLT0gMTsKKyAgICAgICAgICB0aW1lb3V0X2NhbGxiYWNrX2ZyZWUgKHRoaXMpOworCisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAKKyAgICAgIGxpbmsgPSBuZXh0OworICAgIH0KKworICBfZGJ1c193YXJuICgiY291bGQgbm90IGZpbmQgdGltZW91dCAlcCB0byByZW1vdmUiLCB0aW1lb3V0KTsKK30KKworLyogQ29udm9sdXRpb25zIGZyb20gR0xpYiwgdGhlcmUgcmVhbGx5IG11c3QgYmUgYSBiZXR0ZXIgd2F5CisgKiB0byBkbyB0aGlzLgorICovCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX3RpbWVvdXQgKGxvbmcgICAgICAgICAgICB0dl9zZWMsCisgICAgICAgICAgICAgICBsb25nICAgICAgICAgICAgdHZfdXNlYywKKyAgICAgICAgICAgICAgIFRpbWVvdXRDYWxsYmFjayAqdGNiLAorICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICp0aW1lb3V0KQoreworICBsb25nIHNlY19yZW1haW5pbmc7CisgIGxvbmcgbXNlY19yZW1haW5pbmc7CisgIGxvbmcgZXhwaXJhdGlvbl90dl9zZWM7CisgIGxvbmcgZXhwaXJhdGlvbl90dl91c2VjOworICBsb25nIGludGVydmFsX3NlY29uZHM7CisgIGxvbmcgaW50ZXJ2YWxfbWlsbGlzZWNvbmRzOworICBpbnQgaW50ZXJ2YWw7CisKKyAgLyogSSdtIHByZXR0eSBzdXJlIHRoaXMgZnVuY3Rpb24gY291bGQgc3VjayAoYSBsb3QpIGxlc3MgKi8KKyAgCisgIGludGVydmFsID0gZGJ1c190aW1lb3V0X2dldF9pbnRlcnZhbCAodGNiLT50aW1lb3V0KTsKKyAgCisgIGludGVydmFsX3NlY29uZHMgPSBpbnRlcnZhbCAvIDEwMDBMOworICBpbnRlcnZhbF9taWxsaXNlY29uZHMgPSBpbnRlcnZhbCAlIDEwMDBMOworICAKKyAgZXhwaXJhdGlvbl90dl9zZWMgPSB0Y2ItPmxhc3RfdHZfc2VjICsgaW50ZXJ2YWxfc2Vjb25kczsKKyAgZXhwaXJhdGlvbl90dl91c2VjID0gdGNiLT5sYXN0X3R2X3VzZWMgKyBpbnRlcnZhbF9taWxsaXNlY29uZHMgKiAxMDAwOworICBpZiAoZXhwaXJhdGlvbl90dl91c2VjID49IDEwMDAwMDApCisgICAgeworICAgICAgZXhwaXJhdGlvbl90dl91c2VjIC09IDEwMDAwMDA7CisgICAgICBleHBpcmF0aW9uX3R2X3NlYyArPSAxOworICAgIH0KKyAgCisgIHNlY19yZW1haW5pbmcgPSBleHBpcmF0aW9uX3R2X3NlYyAtIHR2X3NlYzsKKyAgbXNlY19yZW1haW5pbmcgPSAoZXhwaXJhdGlvbl90dl91c2VjIC0gdHZfdXNlYykgLyAxMDAwTDsKKworI2lmIE1BSU5MT09QX1NQRVcKKyAgX2RidXNfdmVyYm9zZSAoIkludGVydmFsIGlzICVsZCBzZWNvbmRzICVsZCBtc2Vjc1xuIiwKKyAgICAgICAgICAgICAgICAgaW50ZXJ2YWxfc2Vjb25kcywKKyAgICAgICAgICAgICAgICAgaW50ZXJ2YWxfbWlsbGlzZWNvbmRzKTsKKyAgX2RidXNfdmVyYm9zZSAoIk5vdyBpcyAgJWx1IHNlY29uZHMgJWx1IHVzZWNzXG4iLAorICAgICAgICAgICAgICAgICB0dl9zZWMsIHR2X3VzZWMpOworICBfZGJ1c192ZXJib3NlICgiTGFzdCBpcyAlbHUgc2Vjb25kcyAlbHUgdXNlY3NcbiIsCisgICAgICAgICAgICAgICAgIHRjYi0+bGFzdF90dl9zZWMsIHRjYi0+bGFzdF90dl91c2VjKTsKKyAgX2RidXNfdmVyYm9zZSAoIkV4cCBpcyAgJWx1IHNlY29uZHMgJWx1IHVzZWNzXG4iLAorICAgICAgICAgICAgICAgICBleHBpcmF0aW9uX3R2X3NlYywgZXhwaXJhdGlvbl90dl91c2VjKTsKKyAgX2RidXNfdmVyYm9zZSAoIlByZS1jb3JyZWN0aW9uLCBzZWNfcmVtYWluaW5nICVsZCBtc2VjX3JlbWFpbmluZyAlbGRcbiIsCisgICAgICAgICAgICAgICAgIHNlY19yZW1haW5pbmcsIG1zZWNfcmVtYWluaW5nKTsKKyNlbmRpZgorICAKKyAgLyogV2UgZG8gdGhlIGZvbGxvd2luZyBpbiBhIHJhdGhlciBjb252b2x1dGVkIGZhc2hpb24gdG8gZGVhbCB3aXRoCisgICAqIHRoZSBmYWN0IHRoYXQgd2UgZG9uJ3QgaGF2ZSBhbiBpbnRlZ3JhbCB0eXBlIGJpZyBlbm91Z2ggdG8gaG9sZAorICAgKiB0aGUgZGlmZmVyZW5jZSBvZiB0d28gdGltZXZhbHMgaW4gbWlsbGlzZWNvbmRzLgorICAgKi8KKyAgaWYgKHNlY19yZW1haW5pbmcgPCAwIHx8IChzZWNfcmVtYWluaW5nID09IDAgJiYgbXNlY19yZW1haW5pbmcgPCAwKSkKKyAgICB7CisgICAgICAqdGltZW91dCA9IDA7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKG1zZWNfcmVtYWluaW5nIDwgMCkKKwl7CisJICBtc2VjX3JlbWFpbmluZyArPSAxMDAwOworCSAgc2VjX3JlbWFpbmluZyAtPSAxOworCX0KKworICAgICAgaWYgKHNlY19yZW1haW5pbmcgPiAoX0RCVVNfSU5UX01BWCAvIDEwMDApIHx8CisgICAgICAgICAgbXNlY19yZW1haW5pbmcgPiBfREJVU19JTlRfTUFYKQorICAgICAgICAqdGltZW91dCA9IF9EQlVTX0lOVF9NQVg7CisgICAgICBlbHNlCisgICAgICAgICp0aW1lb3V0ID0gc2VjX3JlbWFpbmluZyAqIDEwMDAgKyBtc2VjX3JlbWFpbmluZzsgICAgICAgIAorICAgIH0KKworICBpZiAoKnRpbWVvdXQgPiBpbnRlcnZhbCkKKyAgICB7CisgICAgICAvKiBUaGlzIGluZGljYXRlcyB0aGF0IHRoZSBzeXN0ZW0gY2xvY2sgcHJvYmFibHkgbW92ZWQgYmFja3dhcmQgKi8KKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJTeXN0ZW0gY2xvY2sgc2V0IGJhY2t3YXJkISBSZXNldHRpbmcgdGltZW91dC5cbiIpOworICAgICAgCisgICAgICB0Y2ItPmxhc3RfdHZfc2VjID0gdHZfc2VjOworICAgICAgdGNiLT5sYXN0X3R2X3VzZWMgPSB0dl91c2VjOworCisgICAgICAqdGltZW91dCA9IGludGVydmFsOworICAgIH0KKyAgCisjaWYgTUFJTkxPT1BfU1BFVworICBfZGJ1c192ZXJib3NlICgiICB0aW1lb3V0IGV4cGlyZXMgaW4gJWQgbWlsbGlzZWNvbmRzXG4iLCAqdGltZW91dCk7CisjZW5kaWYKKyAgCisgIHJldHVybiAqdGltZW91dCA9PSAwOworfQorCitkYnVzX2Jvb2xfdAorX2RidXNfbG9vcF9kaXNwYXRjaCAoREJ1c0xvb3AgKmxvb3ApCit7CisKKyNpZiBNQUlOTE9PUF9TUEVXCisgIF9kYnVzX3ZlcmJvc2UgKCIgICVkIGNvbm5lY3Rpb25zIHRvIGRpc3BhdGNoXG4iLCBfZGJ1c19saXN0X2dldF9sZW5ndGggKCZsb29wLT5uZWVkX2Rpc3BhdGNoKSk7CisjZW5kaWYKKyAgCisgIGlmIChsb29wLT5uZWVkX2Rpc3BhdGNoID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworICAKKyBuZXh0OgorICB3aGlsZSAobG9vcC0+bmVlZF9kaXNwYXRjaCAhPSBOVUxMKQorICAgIHsKKyAgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uID0gX2RidXNfbGlzdF9wb3BfZmlyc3QgKCZsb29wLT5uZWVkX2Rpc3BhdGNoKTsKKyAgICAgIAorICAgICAgd2hpbGUgKFRSVUUpCisgICAgICAgIHsKKyAgICAgICAgICBEQnVzRGlzcGF0Y2hTdGF0dXMgc3RhdHVzOworICAgICAgICAgIAorICAgICAgICAgIHN0YXR1cyA9IGRidXNfY29ubmVjdGlvbl9kaXNwYXRjaCAoY29ubmVjdGlvbik7CisKKyAgICAgICAgICBpZiAoc3RhdHVzID09IERCVVNfRElTUEFUQ0hfQ09NUExFVEUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoY29ubmVjdGlvbik7CisgICAgICAgICAgICAgIGdvdG8gbmV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gREJVU19ESVNQQVRDSF9ORUVEX01FTU9SWSkKKyAgICAgICAgICAgICAgICBfZGJ1c193YWl0X2Zvcl9tZW1vcnkgKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2RidXNfYm9vbF90CitfZGJ1c19sb29wX3F1ZXVlX2Rpc3BhdGNoIChEQnVzTG9vcCAgICAgICAqbG9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworICBpZiAoX2RidXNfbGlzdF9hcHBlbmQgKCZsb29wLT5uZWVkX2Rpc3BhdGNoLCBjb25uZWN0aW9uKSkKKyAgICB7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fcmVmIChjb25uZWN0aW9uKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgZWxzZQorICAgIHJldHVybiBGQUxTRTsKK30KKworLyogUmV0dXJucyBUUlVFIGlmIHdlIGludm9rZWQgYW55IHRpbWVvdXRzIG9yIGhhdmUgcmVhZHkgZmlsZQorICogZGVzY3JpcHRvcnMsIHdoaWNoIGlzIGp1c3QgdXNlZCBpbiB0ZXN0IGNvZGUgYXMgYSBkZWJ1ZyBoYWNrCisgKi8KKworZGJ1c19ib29sX3QKK19kYnVzX2xvb3BfaXRlcmF0ZSAoREJ1c0xvb3AgICAgICpsb29wLAorICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgIGJsb2NrKQoreyAgCisjZGVmaW5lIE5fU1RBQ0tfREVTQ1JJUFRPUlMgNjQKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICBEQnVzU29ja2V0RXZlbnQgcmVhZHlfZmRzW05fU1RBQ0tfREVTQ1JJUFRPUlNdOworICBpbnQgaTsKKyAgREJ1c0xpc3QgKmxpbms7CisgIGludCBuX3JlYWR5OworICBpbnQgaW5pdGlhbF9zZXJpYWw7CisgIGxvbmcgdGltZW91dDsKKyAgaW50IG9yaWdfZGVwdGg7CisKKyAgcmV0dmFsID0gRkFMU0U7ICAgICAgCisKKyAgb3JpZ19kZXB0aCA9IGxvb3AtPmRlcHRoOworICAKKyNpZiBNQUlOTE9PUF9TUEVXCisgIF9kYnVzX3ZlcmJvc2UgKCJJdGVyYXRpb24gYmxvY2s9JWQgZGVwdGg9JWQgdGltZW91dF9jb3VudD0lZCB3YXRjaF9jb3VudD0lZFxuIiwKKyAgICAgICAgICAgICAgICAgYmxvY2ssIGxvb3AtPmRlcHRoLCBsb29wLT50aW1lb3V0X2NvdW50LCBsb29wLT53YXRjaF9jb3VudCk7CisjZW5kaWYKKworICBpZiAoX2RidXNfaGFzaF90YWJsZV9nZXRfbl9lbnRyaWVzIChsb29wLT53YXRjaGVzKSA9PSAwICYmCisgICAgICBsb29wLT50aW1lb3V0cyA9PSBOVUxMKQorICAgIGdvdG8gbmV4dF9pdGVyYXRpb247CisKKyAgdGltZW91dCA9IC0xOworICBpZiAobG9vcC0+dGltZW91dF9jb3VudCA+IDApCisgICAgeworICAgICAgbG9uZyB0dl9zZWM7CisgICAgICBsb25nIHR2X3VzZWM7CisgICAgICAKKyAgICAgIF9kYnVzX2dldF9tb25vdG9uaWNfdGltZSAoJnR2X3NlYywgJnR2X3VzZWMpOworCisgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJmxvb3AtPnRpbWVvdXRzKTsKKyAgICAgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBEQnVzTGlzdCAqbmV4dCA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJmxvb3AtPnRpbWVvdXRzLCBsaW5rKTsKKyAgICAgICAgICBUaW1lb3V0Q2FsbGJhY2sgKnRjYiA9IGxpbmstPmRhdGE7CisKKyAgICAgICAgICBpZiAoZGJ1c190aW1lb3V0X2dldF9lbmFibGVkICh0Y2ItPnRpbWVvdXQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpbnQgbXNlY3NfcmVtYWluaW5nOworCisgICAgICAgICAgICAgIGlmIChfZGJ1c190aW1lb3V0X25lZWRzX3Jlc3RhcnQgKHRjYi0+dGltZW91dCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgdGNiLT5sYXN0X3R2X3NlYyA9IHR2X3NlYzsKKyAgICAgICAgICAgICAgICAgIHRjYi0+bGFzdF90dl91c2VjID0gdHZfdXNlYzsKKyAgICAgICAgICAgICAgICAgIF9kYnVzX3RpbWVvdXRfcmVzdGFydGVkICh0Y2ItPnRpbWVvdXQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBjaGVja190aW1lb3V0ICh0dl9zZWMsIHR2X3VzZWMsIHRjYiwgJm1zZWNzX3JlbWFpbmluZyk7CisKKyAgICAgICAgICAgICAgaWYgKHRpbWVvdXQgPCAwKQorICAgICAgICAgICAgICAgIHRpbWVvdXQgPSBtc2Vjc19yZW1haW5pbmc7CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB0aW1lb3V0ID0gTUlOIChtc2Vjc19yZW1haW5pbmcsIHRpbWVvdXQpOworCisjaWYgTUFJTkxPT1BfU1BFVworICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiICB0aW1lb3V0IGFkZGVkLCAlZCByZW1haW5pbmcsIGFnZ3JlZ2F0ZSB0aW1lb3V0ICVsZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNlY3NfcmVtYWluaW5nLCB0aW1lb3V0KTsKKyNlbmRpZgorICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgX2RidXNfYXNzZXJ0ICh0aW1lb3V0ID49IDApOworICAgICAgICAgICAgfQorI2lmIE1BSU5MT09QX1NQRVcKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgIHNraXBwaW5nIGRpc2FibGVkIHRpbWVvdXRcbiIpOworICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgCisgICAgICAgICAgbGluayA9IG5leHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgLyogTmV2ZXIgYmxvY2sgaWYgd2UgaGF2ZSBzdHVmZiB0byBkaXNwYXRjaCAqLworICBpZiAoIWJsb2NrIHx8IGxvb3AtPm5lZWRfZGlzcGF0Y2ggIT0gTlVMTCkKKyAgICB7CisgICAgICB0aW1lb3V0ID0gMDsKKyNpZiBNQUlOTE9PUF9TUEVXCisgICAgICBfZGJ1c192ZXJib3NlICgiICB0aW1lb3V0IGlzIDAgYXMgd2UgYXJlbid0IGJsb2NraW5nXG4iKTsKKyNlbmRpZgorICAgIH0KKworICAvKiBpZiBhIHdhdGNoIHdhcyBPT00gbGFzdCB0aW1lLCBkb24ndCB3YWl0IGxvbmdlciB0aGFuIHRoZSBPT00KKyAgICogd2FpdCB0byByZS1lbmFibGUgaXQKKyAgICovCisgIGlmIChsb29wLT5vb21fd2F0Y2hfcGVuZGluZykKKyAgICB0aW1lb3V0ID0gTUlOICh0aW1lb3V0LCBfZGJ1c19nZXRfb29tX3dhaXQgKCkpOworCisjaWYgTUFJTkxPT1BfU1BFVworICBfZGJ1c192ZXJib3NlICgiICBwb2xsaW5nIG9uICVkIGRlc2NyaXB0b3JzIHRpbWVvdXQgJWxkXG4iLCBfREJVU19OX0VMRU1FTlRTIChyZWFkeV9mZHMpLCB0aW1lb3V0KTsKKyNlbmRpZgorCisgIG5fcmVhZHkgPSBfZGJ1c19zb2NrZXRfc2V0X3BvbGwgKGxvb3AtPnNvY2tldF9zZXQsIHJlYWR5X2ZkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0RCVVNfTl9FTEVNRU5UUyAocmVhZHlfZmRzKSwgdGltZW91dCk7CisKKyAgLyogcmUtZW5hYmxlIGFueSB3YXRjaGVzIHdlIHNraXBwZWQgdGhpcyB0aW1lICovCisgIGlmIChsb29wLT5vb21fd2F0Y2hfcGVuZGluZykKKyAgICB7CisgICAgICBEQnVzSGFzaEl0ZXIgaGFzaF9pdGVyOworCisgICAgICBsb29wLT5vb21fd2F0Y2hfcGVuZGluZyA9IEZBTFNFOworCisgICAgICBfZGJ1c19oYXNoX2l0ZXJfaW5pdCAobG9vcC0+d2F0Y2hlcywgJmhhc2hfaXRlcik7CisKKyAgICAgIHdoaWxlIChfZGJ1c19oYXNoX2l0ZXJfbmV4dCAoJmhhc2hfaXRlcikpCisgICAgICAgIHsKKyAgICAgICAgICBEQnVzTGlzdCAqKndhdGNoZXM7CisgICAgICAgICAgREJ1c1BvbGxhYmxlIGZkOworICAgICAgICAgIGRidXNfYm9vbF90IGNoYW5nZWQ7CisKKyAgICAgICAgICBjaGFuZ2VkID0gRkFMU0U7CisgICAgICAgICAgZmQgPSBfZGJ1c19oYXNoX2l0ZXJfZ2V0X3BvbGxhYmxlX2tleSAoJmhhc2hfaXRlcik7CisgICAgICAgICAgd2F0Y2hlcyA9IF9kYnVzX2hhc2hfaXRlcl9nZXRfdmFsdWUgKCZoYXNoX2l0ZXIpOworCisgICAgICAgICAgZm9yIChsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAod2F0Y2hlcyk7CisgICAgICAgICAgICAgIGxpbmsgIT0gTlVMTDsKKyAgICAgICAgICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAod2F0Y2hlcywgbGluaykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIERCdXNXYXRjaCAqd2F0Y2ggPSBsaW5rLT5kYXRhOworCisgICAgICAgICAgICAgIGlmIChfZGJ1c193YXRjaF9nZXRfb29tX2xhc3RfdGltZSAod2F0Y2gpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIF9kYnVzX3dhdGNoX3NldF9vb21fbGFzdF90aW1lICh3YXRjaCwgRkFMU0UpOworICAgICAgICAgICAgICAgICAgY2hhbmdlZCA9IFRSVUU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKGNoYW5nZWQpCisgICAgICAgICAgICByZWZyZXNoX3dhdGNoZXNfZm9yX2ZkIChsb29wLCB3YXRjaGVzLCBmZCk7CisgICAgICAgIH0KKworICAgICAgcmV0dmFsID0gVFJVRTsgLyogcmV0dXJuIFRSVUUgaGVyZSB0byBrZWVwIHRoZSBsb29wIGdvaW5nLAorICAgICAgICAgICAgICAgICAgICAgICogc2luY2Ugd2UgZG9uJ3Qga25vdyB0aGUgd2F0Y2ggd2FzIGluYWN0aXZlICovCisgICAgfQorCisgIGluaXRpYWxfc2VyaWFsID0gbG9vcC0+Y2FsbGJhY2tfbGlzdF9zZXJpYWw7CisKKyAgaWYgKGxvb3AtPnRpbWVvdXRfY291bnQgPiAwKQorICAgIHsKKyAgICAgIGxvbmcgdHZfc2VjOworICAgICAgbG9uZyB0dl91c2VjOworCisgICAgICBfZGJ1c19nZXRfbW9ub3RvbmljX3RpbWUgKCZ0dl9zZWMsICZ0dl91c2VjKTsKKworICAgICAgLyogSXQnZCBiZSBuaWNlIHRvIGF2b2lkIHRoaXMgTyhuKSB0aGluZ3kgaGVyZSAqLworICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZsb29wLT50aW1lb3V0cyk7CisgICAgICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgREJ1c0xpc3QgKm5leHQgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZsb29wLT50aW1lb3V0cywgbGluayk7CisgICAgICAgICAgVGltZW91dENhbGxiYWNrICp0Y2IgPSBsaW5rLT5kYXRhOworCisgICAgICAgICAgaWYgKGluaXRpYWxfc2VyaWFsICE9IGxvb3AtPmNhbGxiYWNrX2xpc3Rfc2VyaWFsKQorICAgICAgICAgICAgZ290byBuZXh0X2l0ZXJhdGlvbjsKKworICAgICAgICAgIGlmIChsb29wLT5kZXB0aCAhPSBvcmlnX2RlcHRoKQorICAgICAgICAgICAgZ290byBuZXh0X2l0ZXJhdGlvbjsKKworICAgICAgICAgIGlmIChkYnVzX3RpbWVvdXRfZ2V0X2VuYWJsZWQgKHRjYi0+dGltZW91dCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGludCBtc2Vjc19yZW1haW5pbmc7CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBpZiAoY2hlY2tfdGltZW91dCAodHZfc2VjLCB0dl91c2VjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNiLCAmbXNlY3NfcmVtYWluaW5nKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAvKiBTYXZlIGxhc3QgY2FsbGJhY2sgdGltZSBhbmQgZmlyZSB0aGlzIHRpbWVvdXQgKi8KKyAgICAgICAgICAgICAgICAgIHRjYi0+bGFzdF90dl9zZWMgPSB0dl9zZWM7CisgICAgICAgICAgICAgICAgICB0Y2ItPmxhc3RfdHZfdXNlYyA9IHR2X3VzZWM7CisKKyNpZiBNQUlOTE9PUF9TUEVXCisgICAgICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiICBpbnZva2luZyB0aW1lb3V0XG4iKTsKKyNlbmRpZgorCisgICAgICAgICAgICAgICAgICAvKiBjYW4gdGhlb3JldGljYWxseSByZXR1cm4gRkFMU0Ugb24gT09NLCBidXQgd2UganVzdAorICAgICAgICAgICAgICAgICAgICogbGV0IGl0IGZpcmUgYWdhaW4gbGF0ZXIgLSBpbiBwcmFjdGljZSB0aGF0J3Mgd2hhdAorICAgICAgICAgICAgICAgICAgICogZXZlcnkgd3JhcHBlciBjYWxsYmFjayBpbiBkYnVzLWRhZW1vbiB1c2VkIHRvIGRvICovCisgICAgICAgICAgICAgICAgICBkYnVzX3RpbWVvdXRfaGFuZGxlICh0Y2ItPnRpbWVvdXQpOworCisgICAgICAgICAgICAgICAgICByZXR2YWwgPSBUUlVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyNpZiBNQUlOTE9PUF9TUEVXCisgICAgICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiICB0aW1lb3V0IGhhcyBub3QgZXhwaXJlZFxuIik7CisjZW5kaWYKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisjaWYgTUFJTkxPT1BfU1BFVworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiAgc2tpcHBpbmcgaW52b2NhdGlvbiBvZiBkaXNhYmxlZCB0aW1lb3V0XG4iKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgICAgbGluayA9IG5leHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgaWYgKG5fcmVhZHkgPiAwKQorICAgIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBuX3JlYWR5OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICBEQnVzTGlzdCAqKndhdGNoZXM7CisgICAgICAgICAgREJ1c0xpc3QgKm5leHQ7CisgICAgICAgICAgdW5zaWduZWQgaW50IGNvbmRpdGlvbjsKKyAgICAgICAgICBkYnVzX2Jvb2xfdCBhbnlfb29tOworCisgICAgICAgICAgLyogRklYTUUgSSB0aGluayB0aGlzICJyZXN0YXJ0IGlmIHdlIGNoYW5nZSB0aGUgd2F0Y2hlcyIKKyAgICAgICAgICAgKiBhcHByb2FjaCBjb3VsZCByZXN1bHQgaW4gc3RhcnZpbmcgd2F0Y2hlcworICAgICAgICAgICAqIHRvd2FyZCB0aGUgZW5kIG9mIHRoZSBsaXN0LgorICAgICAgICAgICAqLworICAgICAgICAgIGlmIChpbml0aWFsX3NlcmlhbCAhPSBsb29wLT5jYWxsYmFja19saXN0X3NlcmlhbCkKKyAgICAgICAgICAgIGdvdG8gbmV4dF9pdGVyYXRpb247CisKKyAgICAgICAgICBpZiAobG9vcC0+ZGVwdGggIT0gb3JpZ19kZXB0aCkKKyAgICAgICAgICAgIGdvdG8gbmV4dF9pdGVyYXRpb247CisKKyAgICAgICAgICBfZGJ1c19hc3NlcnQgKHJlYWR5X2Zkc1tpXS5mbGFncyAhPSAwKTsKKworICAgICAgICAgIGlmIChfREJVU19VTkxJS0VMWSAocmVhZHlfZmRzW2ldLmZsYWdzICYgX0RCVVNfV0FUQ0hfTlZBTCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGN1bGxfd2F0Y2hlc19mb3JfaW52YWxpZF9mZCAobG9vcCwgcmVhZHlfZmRzW2ldLmZkKTsKKyAgICAgICAgICAgICAgZ290byBuZXh0X2l0ZXJhdGlvbjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGNvbmRpdGlvbiA9IHJlYWR5X2Zkc1tpXS5mbGFnczsKKyAgICAgICAgICBfZGJ1c19hc3NlcnQgKChjb25kaXRpb24gJiBfREJVU19XQVRDSF9OVkFMKSA9PSAwKTsKKworICAgICAgICAgIC8qIGNvbmRpdGlvbiBtYXkgc3RpbGwgYmUgMCBpZiB3ZSBnb3Qgc29tZQorICAgICAgICAgICAqIHdlaXJkIFBPTExGT08gdGhpbmcgbGlrZSBQT0xMV1JCQU5ECisgICAgICAgICAgICovCisgICAgICAgICAgaWYgKGNvbmRpdGlvbiA9PSAwKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICB3YXRjaGVzID0gX2RidXNfaGFzaF90YWJsZV9sb29rdXBfcG9sbGFibGUgKGxvb3AtPndhdGNoZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkeV9mZHNbaV0uZmQpOworCisgICAgICAgICAgaWYgKHdhdGNoZXMgPT0gTlVMTCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgYW55X29vbSA9IEZBTFNFOworCisgICAgICAgICAgZm9yIChsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAod2F0Y2hlcyk7CisgICAgICAgICAgICAgIGxpbmsgIT0gTlVMTDsKKyAgICAgICAgICAgICAgbGluayA9IG5leHQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIERCdXNXYXRjaCAqd2F0Y2ggPSBsaW5rLT5kYXRhOworCisgICAgICAgICAgICAgIG5leHQgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKHdhdGNoZXMsIGxpbmspOworCisgICAgICAgICAgICAgIGlmIChkYnVzX3dhdGNoX2dldF9lbmFibGVkICh3YXRjaCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3Qgb29tOworCisgICAgICAgICAgICAgICAgICBvb20gPSAhZGJ1c193YXRjaF9oYW5kbGUgKHdhdGNoLCBjb25kaXRpb24pOworCisgICAgICAgICAgICAgICAgICBpZiAob29tKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgX2RidXNfd2F0Y2hfc2V0X29vbV9sYXN0X3RpbWUgKHdhdGNoLCBUUlVFKTsKKyAgICAgICAgICAgICAgICAgICAgICBsb29wLT5vb21fd2F0Y2hfcGVuZGluZyA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgYW55X29vbSA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIH0KKworI2lmIE1BSU5MT09QX1NQRVcKKyAgICAgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgIEludm9rZWQgd2F0Y2gsIG9vbSA9ICVkXG4iLCBvb20pOworI2VuZGlmCisgICAgICAgICAgICAgICAgICByZXR2YWwgPSBUUlVFOworCisgICAgICAgICAgICAgICAgICAvKiBXZSByZS1jaGVjayB0aGlzIGV2ZXJ5IHRpbWUsIGluIGNhc2UgdGhlIGNhbGxiYWNrCisgICAgICAgICAgICAgICAgICAgKiBhZGRlZC9yZW1vdmVkIHdhdGNoZXMsIHdoaWNoIG1pZ2h0IG1ha2Ugb3VyIHBvc2l0aW9uIGluCisgICAgICAgICAgICAgICAgICAgKiB0aGUgbGlua2VkIGxpc3QgaW52YWxpZC4gU2VlIHRoZSBGSVhNRSBhYm92ZS4gKi8KKyAgICAgICAgICAgICAgICAgIGlmIChpbml0aWFsX3NlcmlhbCAhPSBsb29wLT5jYWxsYmFja19saXN0X3NlcmlhbCB8fAorICAgICAgICAgICAgICAgICAgICAgIGxvb3AtPmRlcHRoICE9IG9yaWdfZGVwdGgpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICBpZiAoYW55X29vbSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hfd2F0Y2hlc19mb3JfZmQgKGxvb3AsIE5VTEwsIHJlYWR5X2Zkc1tpXS5mZCk7CisKKyAgICAgICAgICAgICAgICAgICAgICBnb3RvIG5leHRfaXRlcmF0aW9uOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKGFueV9vb20pCisgICAgICAgICAgICByZWZyZXNoX3dhdGNoZXNfZm9yX2ZkIChsb29wLCB3YXRjaGVzLCByZWFkeV9mZHNbaV0uZmQpOworICAgICAgICB9CisgICAgfQorICAgICAgCisgbmV4dF9pdGVyYXRpb246CisjaWYgTUFJTkxPT1BfU1BFVworICBfZGJ1c192ZXJib3NlICgiICBtb3ZpbmcgdG8gbmV4dCBpdGVyYXRpb25cbiIpOworI2VuZGlmCisKKyAgaWYgKF9kYnVzX2xvb3BfZGlzcGF0Y2ggKGxvb3ApKQorICAgIHJldHZhbCA9IFRSVUU7CisgIAorI2lmIE1BSU5MT09QX1NQRVcKKyAgX2RidXNfdmVyYm9zZSAoIlJldHVybmluZyAlZFxuIiwgcmV0dmFsKTsKKyNlbmRpZgorICAKKyAgcmV0dXJuIHJldHZhbDsKK30KKwordm9pZAorX2RidXNfbG9vcF9ydW4gKERCdXNMb29wICpsb29wKQoreworICBpbnQgb3VyX2V4aXRfZGVwdGg7CisKKyAgX2RidXNfYXNzZXJ0IChsb29wLT5kZXB0aCA+PSAwKTsKKyAgCisgIF9kYnVzX2xvb3BfcmVmIChsb29wKTsKKyAgCisgIG91cl9leGl0X2RlcHRoID0gbG9vcC0+ZGVwdGg7CisgIGxvb3AtPmRlcHRoICs9IDE7CisKKyAgX2RidXNfdmVyYm9zZSAoIlJ1bm5pbmcgbWFpbiBsb29wLCBkZXB0aCAlZCAtPiAlZFxuIiwKKyAgICAgICAgICAgICAgICAgbG9vcC0+ZGVwdGggLSAxLCBsb29wLT5kZXB0aCk7CisgIAorICB3aGlsZSAobG9vcC0+ZGVwdGggIT0gb3VyX2V4aXRfZGVwdGgpCisgICAgX2RidXNfbG9vcF9pdGVyYXRlIChsb29wLCBUUlVFKTsKKworICBfZGJ1c19sb29wX3VucmVmIChsb29wKTsKK30KKwordm9pZAorX2RidXNfbG9vcF9xdWl0IChEQnVzTG9vcCAqbG9vcCkKK3sKKyAgX2RidXNfYXNzZXJ0IChsb29wLT5kZXB0aCA+IDApOyAgCisgIAorICBsb29wLT5kZXB0aCAtPSAxOworCisgIF9kYnVzX3ZlcmJvc2UgKCJRdWl0IG1haW4gbG9vcCwgZGVwdGggJWQgLT4gJWRcbiIsCisgICAgICAgICAgICAgICAgIGxvb3AtPmRlcHRoICsgMSwgbG9vcC0+ZGVwdGgpOworfQorCitpbnQKK19kYnVzX2dldF9vb21fd2FpdCAodm9pZCkKK3sKKyNpZmRlZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworICAvKiBtYWtlIHRlc3RzIGdvIGZhc3QgKi8KKyAgcmV0dXJuIDA7CisjZWxzZQorICByZXR1cm4gNTAwOworI2VuZGlmCit9CisKK3ZvaWQKK19kYnVzX3dhaXRfZm9yX21lbW9yeSAodm9pZCkKK3sKKyAgX2RidXNfdmVyYm9zZSAoIldhaXRpbmcgZm9yIG1vcmUgbWVtb3J5XG4iKTsKKyAgX2RidXNfc2xlZXBfbWlsbGlzZWNvbmRzIChfZGJ1c19nZXRfb29tX3dhaXQgKCkpOworfQorCisjZW5kaWYgLyogIURPWFlHRU5fU0hPVUxEX1NLSVBfVEhJUyAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLW1haW5sb29wLmggYi9kYnVzL2RidXMtbWFpbmxvb3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzZjYjZmCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLW1haW5sb29wLmgKQEAgLTAsMCArMSw2NiBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLW1haW5sb29wLmggIE1haW4gbG9vcCB1dGlsaXR5CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzICBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpZm5kZWYgREJVU19NQUlOTE9PUF9ICisjZGVmaW5lIERCVVNfTUFJTkxPT1BfSAorCisjaWZuZGVmIERPWFlHRU5fU0hPVUxEX1NLSVBfVEhJUworCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLmg+CisKK3R5cGVkZWYgc3RydWN0IERCdXNMb29wIERCdXNMb29wOworCit0eXBlZGVmIGRidXNfYm9vbF90ICgqIERCdXNXYXRjaEZ1bmN0aW9uKSAgIChEQnVzV2F0Y2ggICAgICp3YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgIGNvbmRpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKmRhdGEpOworCitEQnVzTG9vcCogICBfZGJ1c19sb29wX25ldyAgICAgICAgICAgICh2b2lkKTsKK0RCdXNMb29wKiAgIF9kYnVzX2xvb3BfcmVmICAgICAgICAgICAgKERCdXNMb29wICAgICAgICAgICAgKmxvb3ApOwordm9pZCAgICAgICAgX2RidXNfbG9vcF91bnJlZiAgICAgICAgICAoREJ1c0xvb3AgICAgICAgICAgICAqbG9vcCk7CitkYnVzX2Jvb2xfdCBfZGJ1c19sb29wX2FkZF93YXRjaCAgICAgIChEQnVzTG9vcCAgICAgICAgICAgICpsb29wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1dhdGNoICAgICAgICAgICAqd2F0Y2gpOwordm9pZCAgICAgICAgX2RidXNfbG9vcF9yZW1vdmVfd2F0Y2ggICAoREJ1c0xvb3AgICAgICAgICAgICAqbG9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNXYXRjaCAgICAgICAgICAgKndhdGNoKTsKK3ZvaWQgICAgICAgIF9kYnVzX2xvb3BfdG9nZ2xlX3dhdGNoICAgKERCdXNMb29wICAgICAgICAgICAgKmxvb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzV2F0Y2ggICAgICAgICAgICp3YXRjaCk7CitkYnVzX2Jvb2xfdCBfZGJ1c19sb29wX2FkZF90aW1lb3V0ICAgIChEQnVzTG9vcCAgICAgICAgICAgICpsb29wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1RpbWVvdXQgICAgICAgICAqdGltZW91dCk7Cit2b2lkICAgICAgICBfZGJ1c19sb29wX3JlbW92ZV90aW1lb3V0IChEQnVzTG9vcCAgICAgICAgICAgICpsb29wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1RpbWVvdXQgICAgICAgICAqdGltZW91dCk7CisKK2RidXNfYm9vbF90IF9kYnVzX2xvb3BfcXVldWVfZGlzcGF0Y2ggKERCdXNMb29wICAgICAgICAgICAgKmxvb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAgICAgICpjb25uZWN0aW9uKTsKKwordm9pZCAgICAgICAgX2RidXNfbG9vcF9ydW4gICAgICAgICAgICAoREJ1c0xvb3AgICAgICAgICAgICAqbG9vcCk7Cit2b2lkICAgICAgICBfZGJ1c19sb29wX3F1aXQgICAgICAgICAgIChEQnVzTG9vcCAgICAgICAgICAgICpsb29wKTsKK2RidXNfYm9vbF90IF9kYnVzX2xvb3BfaXRlcmF0ZSAgICAgICAgKERCdXNMb29wICAgICAgICAgICAgKmxvb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICAgICBibG9jayk7CitkYnVzX2Jvb2xfdCBfZGJ1c19sb29wX2Rpc3BhdGNoICAgICAgIChEQnVzTG9vcCAgICAgICAgICAgICpsb29wKTsKKworaW50ICBfZGJ1c19nZXRfb29tX3dhaXQgICAgKHZvaWQpOwordm9pZCBfZGJ1c193YWl0X2Zvcl9tZW1vcnkgKHZvaWQpOworCisjZW5kaWYgLyogIURPWFlHRU5fU0hPVUxEX1NLSVBfVEhJUyAqLworCisjZW5kaWYgLyogREJVU19NQUlOTE9PUF9IICovCisKZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1tYXJzaGFsLWJhc2ljLmMgYi9kYnVzL2RidXMtbWFyc2hhbC1iYXNpYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzNTJlNTIKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtbWFyc2hhbC1iYXNpYy5jCkBAIC0wLDAgKzEsMTkyNiBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLW1hcnNoYWwtYmFzaWMuYyAgTWFyc2hhbGxpbmcgcm91dGluZXMgZm9yIGJhc2ljIChwcmltaXRpdmUpIHR5cGVzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyIENvZGVGYWN0b3J5IEFCCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQsIDIwMDUgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgImRidXMtaW50ZXJuYWxzLmgiCisjaW5jbHVkZSAiZGJ1cy1tYXJzaGFsLWJhc2ljLmgiCisjaW5jbHVkZSAiZGJ1cy1zaWduYXR1cmUuaCIKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaWYgIWRlZmluZWQoUFJJeDY0KSAmJiBkZWZpbmVkKERCVVNfV0lOKQorI2RlZmluZSBQUkl4NjQgIkk2NHgiCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19HTlVDX18pICYmIChfX0dOVUNfXyA+PSA0KQorIyBkZWZpbmUgX0RCVVNfQVNTRVJUX0FMSUdOTUVOVCh0eXBlLCBvcCwgdmFsKSBcCisgIF9EQlVTX1NUQVRJQ19BU1NFUlQgKF9fZXh0ZW5zaW9uX18gX19hbGlnbm9mX18gKHR5cGUpIG9wIHZhbCkKKyNlbHNlCisgIC8qIG5vdCBnY2MsIHNvIHByb2JhYmx5IG5vIGFsaWdub2Ygb3BlcmF0b3I6IGp1c3QgdXNlIGEgbm8tb3Agc3RhdGVtZW50CisgICAqIHRoYXQncyB2YWxpZCBpbiB0aGUgc2FtZSBjb250ZXh0cyAqLworIyBkZWZpbmUgX0RCVVNfQVNTRVJUX0FMSUdOTUVOVCh0eXBlLCBvcCwgdmFsKSBcCisgIF9EQlVTX1NUQVRJQ19BU1NFUlQgKFRSVUUpCisjZW5kaWYKKworLyogVHJ1ZSBieSBkZWZpbml0aW9uLCBidXQganVzdCBmb3IgY29tcGxldGVuZXNzLi4uICovCitfREJVU19TVEFUSUNfQVNTRVJUIChzaXplb2YgKGNoYXIpID09IDEpOworX0RCVVNfQVNTRVJUX0FMSUdOTUVOVCAoY2hhciwgPT0sIDEpOworCitfREJVU19TVEFUSUNfQVNTRVJUIChzaXplb2YgKGRidXNfaW50MTZfdCkgPT0gMik7CitfREJVU19BU1NFUlRfQUxJR05NRU5UIChkYnVzX2ludDE2X3QsIDw9LCAyKTsKK19EQlVTX1NUQVRJQ19BU1NFUlQgKHNpemVvZiAoZGJ1c191aW50MTZfdCkgPT0gMik7CitfREJVU19BU1NFUlRfQUxJR05NRU5UIChkYnVzX3VpbnQxNl90LCA8PSwgMik7CisKK19EQlVTX1NUQVRJQ19BU1NFUlQgKHNpemVvZiAoZGJ1c19pbnQzMl90KSA9PSA0KTsKK19EQlVTX0FTU0VSVF9BTElHTk1FTlQgKGRidXNfaW50MzJfdCwgPD0sIDQpOworX0RCVVNfU1RBVElDX0FTU0VSVCAoc2l6ZW9mIChkYnVzX3VpbnQzMl90KSA9PSA0KTsKK19EQlVTX0FTU0VSVF9BTElHTk1FTlQgKGRidXNfdWludDMyX3QsIDw9LCA0KTsKK19EQlVTX1NUQVRJQ19BU1NFUlQgKHNpemVvZiAoZGJ1c19ib29sX3QpID09IDQpOworX0RCVVNfQVNTRVJUX0FMSUdOTUVOVCAoZGJ1c19ib29sX3QsIDw9LCA0KTsKKworX0RCVVNfU1RBVElDX0FTU0VSVCAoc2l6ZW9mIChkb3VibGUpID09IDgpOworX0RCVVNfQVNTRVJUX0FMSUdOTUVOVCAoZG91YmxlLCA8PSwgOCk7CisKK19EQlVTX1NUQVRJQ19BU1NFUlQgKHNpemVvZiAoZGJ1c19pbnQ2NF90KSA9PSA4KTsKK19EQlVTX0FTU0VSVF9BTElHTk1FTlQgKGRidXNfaW50NjRfdCwgPD0sIDgpOworX0RCVVNfU1RBVElDX0FTU0VSVCAoc2l6ZW9mIChkYnVzX3VpbnQ2NF90KSA9PSA4KTsKK19EQlVTX0FTU0VSVF9BTElHTk1FTlQgKGRidXNfdWludDY0X3QsIDw9LCA4KTsKKworX0RCVVNfU1RBVElDX0FTU0VSVCAoc2l6ZW9mIChEQnVzQmFzaWNWYWx1ZSkgPj0gOCk7CisvKiBUaGUgYWxpZ25tZW50IG9mIGEgREJ1c0Jhc2ljVmFsdWUgbWlnaHQgY29uY2VpdmFibHkgYmUgPiA4IGJlY2F1c2Ugb2YgdGhlCisgKiBwb2ludGVyLCBzbyB3ZSBkb24ndCBhc3NlcnQgYWJvdXQgaXQgKi8KKworX0RCVVNfU1RBVElDX0FTU0VSVCAoc2l6ZW9mIChEQnVzOEJ5dGVTdHJ1Y3QpID09IDgpOworX0RCVVNfQVNTRVJUX0FMSUdOTUVOVCAoREJ1czhCeXRlU3RydWN0LCA8PSwgOCk7CisKKy8qKgorICogQGRlZmdyb3VwIERCdXNNYXJzaGFsIG1hcnNoYWxpbmcgYW5kIHVubWFyc2hhbGluZworICogQGluZ3JvdXAgIERCdXNJbnRlcm5hbHMKKyAqIEBicmllZiBmdW5jdGlvbnMgdG8gbWFyc2hhbC91bm1hcnNoYWwgZGF0YSBmcm9tIHRoZSB3aXJlCisgKgorICogVHlwZXMgYW5kIGZ1bmN0aW9ucyByZWxhdGVkIHRvIGNvbnZlcnRpbmcgcHJpbWl0aXZlIGRhdGEgdHlwZXMgZnJvbQorICogd2lyZSBmb3JtYXQgdG8gbmF0aXZlIG1hY2hpbmUgZm9ybWF0LCBhbmQgdmljZSB2ZXJzYS4KKyAqCisgKiBBIHNpZ25hdHVyZSBpcyBqdXN0IGEgc3RyaW5nIHdpdGggbXVsdGlwbGUgdHlwZXMgb25lIGFmdGVyIHRoZSBvdGhlci4KKyAqIGZvciBleGFtcGxlIGEgdHlwZSBpcyAiaSIgb3IgIihpaSkiLCBhIHNpZ25hdHVyZSBpcyAiaShpaSkiCisgKiB3aGVyZSBpIGlzIGludCBhbmQgKGlpKSBpcyBzdHJ1Y3QgeyBpbnQ7IGludDsgfQorICoKKyAqIEB7CisgKi8KKworc3RhdGljIHZvaWQKK3BhY2tfMl9vY3RldHMgKGRidXNfdWludDE2X3QgICB2YWx1ZSwKKyAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAgKmRhdGEpCit7CisgIF9kYnVzX2Fzc2VydCAoX0RCVVNfQUxJR05fQUREUkVTUyAoZGF0YSwgMikgPT0gZGF0YSk7CisKKyAgaWYgKChieXRlX29yZGVyKSA9PSBEQlVTX0xJVFRMRV9FTkRJQU4pCisgICAgKigoZGJ1c191aW50MTZfdCopKGRhdGEpKSA9IERCVVNfVUlOVDE2X1RPX0xFICh2YWx1ZSk7CisgIGVsc2UKKyAgICAqKChkYnVzX3VpbnQxNl90KikoZGF0YSkpID0gREJVU19VSU5UMTZfVE9fQkUgKHZhbHVlKTsKK30KKworc3RhdGljIHZvaWQKK3BhY2tfNF9vY3RldHMgKGRidXNfdWludDMyX3QgICB2YWx1ZSwKKyAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAgKmRhdGEpCit7CisgIF9kYnVzX2Fzc2VydCAoX0RCVVNfQUxJR05fQUREUkVTUyAoZGF0YSwgNCkgPT0gZGF0YSk7CisKKyAgaWYgKChieXRlX29yZGVyKSA9PSBEQlVTX0xJVFRMRV9FTkRJQU4pCisgICAgKigoZGJ1c191aW50MzJfdCopKGRhdGEpKSA9IERCVVNfVUlOVDMyX1RPX0xFICh2YWx1ZSk7CisgIGVsc2UKKyAgICAqKChkYnVzX3VpbnQzMl90KikoZGF0YSkpID0gREJVU19VSU5UMzJfVE9fQkUgKHZhbHVlKTsKK30KKworc3RhdGljIHZvaWQKK3BhY2tfOF9vY3RldHMgKERCdXNCYXNpY1ZhbHVlICAgICB2YWx1ZSwKKyAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAgICAgKmRhdGEpCit7CisgIF9kYnVzX2Fzc2VydCAoX0RCVVNfQUxJR05fQUREUkVTUyAoZGF0YSwgOCkgPT0gZGF0YSk7CisKKyAgaWYgKChieXRlX29yZGVyKSA9PSBEQlVTX0xJVFRMRV9FTkRJQU4pCisgICAgKigoZGJ1c191aW50NjRfdCopKGRhdGEpKSA9IERCVVNfVUlOVDY0X1RPX0xFICh2YWx1ZS51NjQpOworICBlbHNlCisgICAgKigoZGJ1c191aW50NjRfdCopKGRhdGEpKSA9IERCVVNfVUlOVDY0X1RPX0JFICh2YWx1ZS51NjQpOworfQorCisvKioKKyAqIFBhY2tzIGEgMzIgYml0IHVuc2lnbmVkIGludGVnZXIgaW50byBhIGRhdGEgcG9pbnRlci4KKyAqCisgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlCisgKiBAcGFyYW0gYnl0ZV9vcmRlciB0aGUgYnl0ZSBvcmRlciB0byB1c2UKKyAqIEBwYXJhbSBkYXRhIHRoZSBkYXRhIHBvaW50ZXIKKyAqLwordm9pZAorX2RidXNfcGFja191aW50MzIgKGRidXNfdWludDMyX3QgICB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICAqZGF0YSkKK3sKKyAgcGFja180X29jdGV0cyAodmFsdWUsIGJ5dGVfb3JkZXIsIGRhdGEpOworfQorCitzdGF0aWMgdm9pZAorc3dhcF84X29jdGV0cyAoREJ1c0Jhc2ljVmFsdWUgICAgKnZhbHVlLAorICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIpCit7CisgIGlmIChieXRlX29yZGVyICE9IERCVVNfQ09NUElMRVJfQllURV9PUkRFUikKKyAgICB7CisgICAgICB2YWx1ZS0+dTY0ID0gREJVU19VSU5UNjRfU1dBUF9MRV9CRSAodmFsdWUtPnU2NCk7CisgICAgfQorfQorCisjaWZuZGVmIF9kYnVzX3VucGFja191aW50MTYKKy8qKgorICogVW5wYWNrcyBhIDE2IGJpdCB1bnNpZ25lZCBpbnRlZ2VyIGZyb20gYSBkYXRhIHBvaW50ZXIKKyAqCisgKiBAcGFyYW0gYnl0ZV9vcmRlciBUaGUgYnl0ZSBvcmRlciB0byB1c2UKKyAqIEBwYXJhbSBkYXRhIHRoZSBkYXRhIHBvaW50ZXIKKyAqIEByZXR1cm5zIHRoZSBpbnRlZ2VyCisgKi8KK2RidXNfdWludDE2X3QKK19kYnVzX3VucGFja191aW50MTYgKGludCAgICAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhKQoreworICBfZGJ1c19hc3NlcnQgKF9EQlVTX0FMSUdOX0FERFJFU1MgKGRhdGEsIDIpID09IGRhdGEpOworCisgIGlmIChieXRlX29yZGVyID09IERCVVNfTElUVExFX0VORElBTikKKyAgICByZXR1cm4gREJVU19VSU5UMTZfRlJPTV9MRSAoKihkYnVzX3VpbnQxNl90KilkYXRhKTsKKyAgZWxzZQorICAgIHJldHVybiBEQlVTX1VJTlQxNl9GUk9NX0JFICgqKGRidXNfdWludDE2X3QqKWRhdGEpOworfQorI2VuZGlmIC8qIF9kYnVzX3VucGFja191aW50MTYgKi8KKworI2lmbmRlZiBfZGJ1c191bnBhY2tfdWludDMyCisvKioKKyAqIFVucGFja3MgYSAzMiBiaXQgdW5zaWduZWQgaW50ZWdlciBmcm9tIGEgZGF0YSBwb2ludGVyCisgKgorICogQHBhcmFtIGJ5dGVfb3JkZXIgVGhlIGJ5dGUgb3JkZXIgdG8gdXNlCisgKiBAcGFyYW0gZGF0YSB0aGUgZGF0YSBwb2ludGVyCisgKiBAcmV0dXJucyB0aGUgaW50ZWdlcgorICovCitkYnVzX3VpbnQzMl90CitfZGJ1c191bnBhY2tfdWludDMyIChpbnQgICAgICAgICAgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSkKK3sKKyAgX2RidXNfYXNzZXJ0IChfREJVU19BTElHTl9BRERSRVNTIChkYXRhLCA0KSA9PSBkYXRhKTsKKworICBpZiAoYnl0ZV9vcmRlciA9PSBEQlVTX0xJVFRMRV9FTkRJQU4pCisgICAgcmV0dXJuIERCVVNfVUlOVDMyX0ZST01fTEUgKCooZGJ1c191aW50MzJfdCopZGF0YSk7CisgIGVsc2UKKyAgICByZXR1cm4gREJVU19VSU5UMzJfRlJPTV9CRSAoKihkYnVzX3VpbnQzMl90KilkYXRhKTsKK30KKyNlbmRpZiAvKiBfZGJ1c191bnBhY2tfdWludDMyICovCisKK3N0YXRpYyB2b2lkCitzZXRfMl9vY3RldHMgKERCdXNTdHJpbmcgICAgICAgICAgKnN0ciwKKyAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgICAgICAgICAgICBkYnVzX3VpbnQxNl90ICAgICAgICB2YWx1ZSwKKyAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgYnl0ZV9vcmRlcikKK3sKKyAgY2hhciAqZGF0YTsKKworICBfZGJ1c19hc3NlcnQgKGJ5dGVfb3JkZXIgPT0gREJVU19MSVRUTEVfRU5ESUFOIHx8CisgICAgICAgICAgICAgICAgYnl0ZV9vcmRlciA9PSBEQlVTX0JJR19FTkRJQU4pOworCisgIGRhdGEgPSBfZGJ1c19zdHJpbmdfZ2V0X2RhdGFfbGVuIChzdHIsIG9mZnNldCwgMik7CisKKyAgcGFja18yX29jdGV0cyAodmFsdWUsIGJ5dGVfb3JkZXIsICh1bnNpZ25lZCBjaGFyICopIGRhdGEpOworfQorCitzdGF0aWMgdm9pZAorc2V0XzRfb2N0ZXRzIChEQnVzU3RyaW5nICAgICAgICAgICpzdHIsCisgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgICAgICAgdmFsdWUsCisgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIpCit7CisgIGNoYXIgKmRhdGE7CisKKyAgX2RidXNfYXNzZXJ0IChieXRlX29yZGVyID09IERCVVNfTElUVExFX0VORElBTiB8fAorICAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIgPT0gREJVU19CSUdfRU5ESUFOKTsKKworICBkYXRhID0gX2RidXNfc3RyaW5nX2dldF9kYXRhX2xlbiAoc3RyLCBvZmZzZXQsIDQpOworCisgIHBhY2tfNF9vY3RldHMgKHZhbHVlLCBieXRlX29yZGVyLCAodW5zaWduZWQgY2hhciAqKSBkYXRhKTsKK30KKworc3RhdGljIHZvaWQKK3NldF84X29jdGV0cyAoREJ1c1N0cmluZyAgICAgICAgICAqc3RyLAorICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgICAgICAgICAgIERCdXNCYXNpY1ZhbHVlICAgICAgIHZhbHVlLAorICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICBieXRlX29yZGVyKQoreworICBjaGFyICpkYXRhOworCisgIF9kYnVzX2Fzc2VydCAoYnl0ZV9vcmRlciA9PSBEQlVTX0xJVFRMRV9FTkRJQU4gfHwKKyAgICAgICAgICAgICAgICBieXRlX29yZGVyID09IERCVVNfQklHX0VORElBTik7CisKKyAgZGF0YSA9IF9kYnVzX3N0cmluZ19nZXRfZGF0YV9sZW4gKHN0ciwgb2Zmc2V0LCA4KTsKKworICBwYWNrXzhfb2N0ZXRzICh2YWx1ZSwgYnl0ZV9vcmRlciwgKHVuc2lnbmVkIGNoYXIgKikgZGF0YSk7Cit9CisKKy8qKgorICogU2V0cyB0aGUgNCBieXRlcyBhdCB0aGUgZ2l2ZW4gb2Zmc2V0IHRvIGEgbWFyc2hhbGVkIHVuc2lnbmVkCisgKiBpbnRlZ2VyLCByZXBsYWNpbmcgYW55dGhpbmcgZm91bmQgdGhlcmUgcHJldmlvdXNseS4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcgdG8gd3JpdGUgdGhlIG1hcnNoYWxsZWQgaW50IHRvCisgKiBAcGFyYW0gcG9zIHRoZSBieXRlIG9mZnNldCB3aGVyZSBpbnQgc2hvdWxkIGJlIHdyaXR0ZW4KKyAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUKKyAqIEBwYXJhbSBieXRlX29yZGVyIHRoZSBieXRlIG9yZGVyIHRvIHVzZQorICoKKyAqLwordm9pZAorX2RidXNfbWFyc2hhbF9zZXRfdWludDMyIChEQnVzU3RyaW5nICAgICAgICAgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgIHBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgICAgICAgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIpCit7CisgIHNldF80X29jdGV0cyAoc3RyLCBwb3MsIHZhbHVlLCBieXRlX29yZGVyKTsKK30KKworLyoqCisgKiBTZXRzIHRoZSBleGlzdGluZyBtYXJzaGFsZWQgc3RyaW5nIGF0IHRoZSBnaXZlbiBvZmZzZXQgd2l0aAorICogYSBuZXcgbWFyc2hhbGVkIHN0cmluZy4gVGhlIGdpdmVuIG9mZnNldCBtdXN0IHBvaW50IHRvCisgKiBhbiBleGlzdGluZyBzdHJpbmcgb3IgdGhlIHdyb25nIGxlbmd0aCB3aWxsIGJlIGRlbGV0ZWQKKyAqIGFuZCByZXBsYWNlZCB3aXRoIHRoZSBuZXcgc3RyaW5nLgorICoKKyAqIE5vdGU6IG5vIGF0dGVtcHQgaXMgbWFkZSBieSB0aGlzIGZ1bmN0aW9uIHRvIHJlLWFsaWduCisgKiBhbnkgZGF0YSB3aGljaCBoYXMgYmVlbiBhbHJlYWR5IG1hcnNoYWxsZWQgYWZ0ZXIgdGhpcworICogc3RyaW5nLiBVc2Ugd2l0aCBjYXV0aW9uLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZyB0byB3cml0ZSB0aGUgbWFyc2hhbGxlZCBzdHJpbmcgdG8KKyAqIEBwYXJhbSBwb3MgdGhlIHBvc2l0aW9uIG9mIHRoZSBtYXJzaGFsZWQgc3RyaW5nIGxlbmd0aAorICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZQorICogQHBhcmFtIGJ5dGVfb3JkZXIgdGhlIGJ5dGUgb3JkZXIgdG8gdXNlCisgKiBAcGFyYW0gb2xkX2VuZF9wb3MgcGxhY2UgdG8gc3RvcmUgYnl0ZSBhZnRlciB0aGUgbnVsIGJ5dGUgb2YgdGhlIG9sZCB2YWx1ZQorICogQHBhcmFtIG5ld19lbmRfcG9zIHBsYWNlIHRvIHN0b3JlIGJ5dGUgYWZ0ZXIgdGhlIG51bCBieXRlIG9mIHRoZSBuZXcgdmFsdWUKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MsICNGQUxTRSBpZiBubyBtZW1vcnkKKyAqCisgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAorc2V0X3N0cmluZyAoREJ1c1N0cmluZyAgICAgICAgICAqc3RyLAorICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgcG9zLAorICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgICAqdmFsdWUsCisgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAqb2xkX2VuZF9wb3MsCisgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICpuZXdfZW5kX3BvcykKK3sKKyAgaW50IG9sZF9sZW4sIG5ld19sZW47CisgIERCdXNTdHJpbmcgZHN0cjsKKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJmRzdHIsIHZhbHVlKTsKKworICBfZGJ1c19hc3NlcnQgKF9EQlVTX0FMSUdOX1ZBTFVFIChwb3MsIDQpID09ICh1bnNpZ25lZCkgcG9zKTsKKyAgb2xkX2xlbiA9IF9kYnVzX3VucGFja191aW50MzIgKGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X3VkYXRhX2xlbiAoc3RyLCBwb3MsIDQpKTsKKworICBuZXdfbGVuID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZkc3RyKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19yZXBsYWNlX2xlbiAoJmRzdHIsIDAsIG5ld19sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIsIHBvcyArIDQsIG9sZF9sZW4pKQorICAgIHJldHVybiBGQUxTRTsKKworICBfZGJ1c19tYXJzaGFsX3NldF91aW50MzIgKHN0ciwgcG9zLCBuZXdfbGVuLCBieXRlX29yZGVyKTsKKworICBpZiAob2xkX2VuZF9wb3MpCisgICAgKm9sZF9lbmRfcG9zID0gcG9zICsgNCArIG9sZF9sZW4gKyAxOworICBpZiAobmV3X2VuZF9wb3MpCisgICAgKm5ld19lbmRfcG9zID0gcG9zICsgNCArIG5ld19sZW4gKyAxOworCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIFNldHMgdGhlIGV4aXN0aW5nIG1hcnNoYWxlZCBzaWduYXR1cmUgYXQgdGhlIGdpdmVuIG9mZnNldCB0byBhIG5ldworICogbWFyc2hhbGVkIHNpZ25hdHVyZS4gU2FtZSBiYXNpYyBpZGVhcyBhcyBzZXRfc3RyaW5nKCkuCisgKgorICogQHBhcmFtIHN0ciB0aGUgc3RyaW5nIHRvIHdyaXRlIHRoZSBtYXJzaGFsbGVkIHNpZ25hdHVyZSB0bworICogQHBhcmFtIHBvcyB0aGUgcG9zaXRpb24gb2YgdGhlIG1hcnNoYWxlZCBzaWduYXR1cmUgbGVuZ3RoCisgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlCisgKiBAcGFyYW0gYnl0ZV9vcmRlciB0aGUgYnl0ZSBvcmRlciB0byB1c2UKKyAqIEBwYXJhbSBvbGRfZW5kX3BvcyBwbGFjZSB0byBzdG9yZSBieXRlIGFmdGVyIHRoZSBudWwgYnl0ZSBvZiB0aGUgb2xkIHZhbHVlCisgKiBAcGFyYW0gbmV3X2VuZF9wb3MgcGxhY2UgdG8gc3RvcmUgYnl0ZSBhZnRlciB0aGUgbnVsIGJ5dGUgb2YgdGhlIG5ldyB2YWx1ZQorICogQHJldHVybnMgI1RSVUUgb24gc3VjY2VzcywgI0ZBTFNFIGlmIG5vIG1lbW9yeQorICoKKyAqLworc3RhdGljIGRidXNfYm9vbF90CitzZXRfc2lnbmF0dXJlIChEQnVzU3RyaW5nICAgICAgICAgICpzdHIsCisgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICBwb3MsCisgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAgICp2YWx1ZSwKKyAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICpvbGRfZW5kX3BvcywKKyAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgKm5ld19lbmRfcG9zKQoreworICBpbnQgb2xkX2xlbiwgbmV3X2xlbjsKKyAgREJ1c1N0cmluZyBkc3RyOworCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmZHN0ciwgdmFsdWUpOworCisgIG9sZF9sZW4gPSBfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKHN0ciwgcG9zKTsKKyAgbmV3X2xlbiA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmZHN0cik7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfcmVwbGFjZV9sZW4gKCZkc3RyLCAwLCBuZXdfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyLCBwb3MgKyAxLCBvbGRfbGVuKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgX2RidXNfc3RyaW5nX3NldF9ieXRlIChzdHIsIHBvcywgbmV3X2xlbik7CisKKyAgaWYgKG9sZF9lbmRfcG9zKQorICAgICpvbGRfZW5kX3BvcyA9IHBvcyArIDEgKyBvbGRfbGVuICsgMTsKKyAgaWYgKG5ld19lbmRfcG9zKQorICAgICpuZXdfZW5kX3BvcyA9IHBvcyArIDEgKyBuZXdfbGVuICsgMTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBTZXRzIGFuIGV4aXN0aW5nIGJhc2ljIHR5cGUgdmFsdWUgdG8gYSBuZXcgdmFsdWUuCisgKiBBcmd1bWVudHMgd29yayB0aGUgc2FtZSB3YXkgYXMgX2RidXNfbWFyc2hhbF9iYXNpY190eXBlKCkuCisgKgorICogQHBhcmFtIHN0ciB0aGUgc3RyaW5nCisgKiBAcGFyYW0gcG9zIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IHZhbHVlCisgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBvZiB0aGUgY3VycmVudCBhbmQgbmV3IHZhbHVlcworICogQHBhcmFtIHZhbHVlIHRoZSBhZGRyZXNzIG9mIHRoZSBuZXcgdmFsdWUKKyAqIEBwYXJhbSBieXRlX29yZGVyIGJ5dGUgb3JkZXIgZm9yIG1hcnNoYWxpbmcKKyAqIEBwYXJhbSBvbGRfZW5kX3BvcyBsb2NhdGlvbiB0byBzdG9yZSBlbmQgcG9zaXRpb24gb2YgdGhlIG9sZCB2YWx1ZSwgb3IgI05VTEwKKyAqIEBwYXJhbSBuZXdfZW5kX3BvcyBsb2NhdGlvbiB0byBzdG9yZSBlbmQgcG9zaXRpb24gb2YgdGhlIG5ldyB2YWx1ZSwgb3IgI05VTEwKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBubyBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX21hcnNoYWxfc2V0X2Jhc2ljIChEQnVzU3RyaW5nICAgICAgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAgICAgICAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICpvbGRfZW5kX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICpuZXdfZW5kX3BvcykKK3sKKyAgY29uc3QgREJ1c0Jhc2ljVmFsdWUgKnZwOworCisgIHZwID0gdmFsdWU7CisKKyAgc3dpdGNoICh0eXBlKQorICAgIHsKKyAgICBjYXNlIERCVVNfVFlQRV9CWVRFOgorICAgICAgX2RidXNfc3RyaW5nX3NldF9ieXRlIChzdHIsIHBvcywgdnAtPmJ5dCk7CisgICAgICBpZiAob2xkX2VuZF9wb3MpCisgICAgICAgICpvbGRfZW5kX3BvcyA9IHBvcyArIDE7CisgICAgICBpZiAobmV3X2VuZF9wb3MpCisgICAgICAgICpuZXdfZW5kX3BvcyA9IHBvcyArIDE7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgREJVU19UWVBFX0lOVDE2OgorICAgIGNhc2UgREJVU19UWVBFX1VJTlQxNjoKKyAgICAgIHBvcyA9IF9EQlVTX0FMSUdOX1ZBTFVFIChwb3MsIDIpOworICAgICAgc2V0XzJfb2N0ZXRzIChzdHIsIHBvcywgdnAtPnUxNiwgYnl0ZV9vcmRlcik7CisgICAgICBpZiAob2xkX2VuZF9wb3MpCisgICAgICAgICpvbGRfZW5kX3BvcyA9IHBvcyArIDI7CisgICAgICBpZiAobmV3X2VuZF9wb3MpCisgICAgICAgICpuZXdfZW5kX3BvcyA9IHBvcyArIDI7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgREJVU19UWVBFX0JPT0xFQU46CisgICAgY2FzZSBEQlVTX1RZUEVfSU5UMzI6CisgICAgY2FzZSBEQlVTX1RZUEVfVUlOVDMyOgorICAgIGNhc2UgREJVU19UWVBFX1VOSVhfRkQ6CisgICAgICBwb3MgPSBfREJVU19BTElHTl9WQUxVRSAocG9zLCA0KTsKKyAgICAgIHNldF80X29jdGV0cyAoc3RyLCBwb3MsIHZwLT51MzIsIGJ5dGVfb3JkZXIpOworICAgICAgaWYgKG9sZF9lbmRfcG9zKQorICAgICAgICAqb2xkX2VuZF9wb3MgPSBwb3MgKyA0OworICAgICAgaWYgKG5ld19lbmRfcG9zKQorICAgICAgICAqbmV3X2VuZF9wb3MgPSBwb3MgKyA0OworICAgICAgcmV0dXJuIFRSVUU7CisgICAgICBicmVhazsKKyAgICBjYXNlIERCVVNfVFlQRV9JTlQ2NDoKKyAgICBjYXNlIERCVVNfVFlQRV9VSU5UNjQ6CisgICAgY2FzZSBEQlVTX1RZUEVfRE9VQkxFOgorICAgICAgcG9zID0gX0RCVVNfQUxJR05fVkFMVUUgKHBvcywgOCk7CisgICAgICBzZXRfOF9vY3RldHMgKHN0ciwgcG9zLCAqdnAsIGJ5dGVfb3JkZXIpOworICAgICAgaWYgKG9sZF9lbmRfcG9zKQorICAgICAgICAqb2xkX2VuZF9wb3MgPSBwb3MgKyA4OworICAgICAgaWYgKG5ld19lbmRfcG9zKQorICAgICAgICAqbmV3X2VuZF9wb3MgPSBwb3MgKyA4OworICAgICAgcmV0dXJuIFRSVUU7CisgICAgICBicmVhazsKKyAgICBjYXNlIERCVVNfVFlQRV9TVFJJTkc6CisgICAgY2FzZSBEQlVTX1RZUEVfT0JKRUNUX1BBVEg6CisgICAgICBwb3MgPSBfREJVU19BTElHTl9WQUxVRSAocG9zLCA0KTsKKyAgICAgIF9kYnVzX2Fzc2VydCAodnAtPnN0ciAhPSBOVUxMKTsKKyAgICAgIHJldHVybiBzZXRfc3RyaW5nIChzdHIsIHBvcywgdnAtPnN0ciwgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvbGRfZW5kX3BvcywgbmV3X2VuZF9wb3MpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBEQlVTX1RZUEVfU0lHTkFUVVJFOgorICAgICAgX2RidXNfYXNzZXJ0ICh2cC0+c3RyICE9IE5VTEwpOworICAgICAgcmV0dXJuIHNldF9zaWduYXR1cmUgKHN0ciwgcG9zLCB2cC0+c3RyLCBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZF9lbmRfcG9zLCBuZXdfZW5kX3Bvcyk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm90IGEgYmFzaWMgdHlwZSIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgYnJlYWs7CisgICAgfQorfQorCisvKioKKyAqIENvbnZlbmllbmNlIGZ1bmN0aW9uIHRvIGRlbWFyc2hhbCBhIDMyIGJpdCB1bnNpZ25lZCBpbnRlZ2VyLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZyBjb250YWluaW5nIHRoZSBkYXRhCisgKiBAcGFyYW0gYnl0ZV9vcmRlciB0aGUgYnl0ZSBvcmRlcgorICogQHBhcmFtIHBvcyB0aGUgcG9zaXRpb24gaW4gdGhlIHN0cmluZworICogQHBhcmFtIG5ld19wb3MgdGhlIG5ldyBwb3NpdGlvbiBvZiB0aGUgc3RyaW5nCisgKiBAcmV0dXJucyB0aGUgZGVtYXJzaGFsZWQgaW50ZWdlci4KKyAqLworZGJ1c191aW50MzJfdAorX2RidXNfbWFyc2hhbF9yZWFkX3VpbnQzMiAgKGNvbnN0IERCdXNTdHJpbmcgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBwb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICpuZXdfcG9zKQoreworICBwb3MgPSBfREJVU19BTElHTl9WQUxVRSAocG9zLCA0KTsKKworICBpZiAobmV3X3BvcykKKyAgICAqbmV3X3BvcyA9IHBvcyArIDQ7CisKKyAgX2RidXNfYXNzZXJ0IChwb3MgKyA0IDw9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChzdHIpKTsKKyAgCisgIHJldHVybiBfZGJ1c191bnBhY2tfdWludDMyIChieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF91ZGF0YSAoc3RyKSArIHBvcyk7Cit9CisKKy8qKgorICogRGVtYXJzaGFscyBhIGJhc2ljLXR5cGVkIHZhbHVlLiBUaGUgInZhbHVlIiBwb2ludGVyIGlzIGFsd2F5cworICogdGhlIGFkZHJlc3Mgb2YgYSB2YXJpYWJsZSBvZiB0aGUgYmFzaWMgdHlwZS4gU28gZS5nLgorICogaWYgdGhlIGJhc2ljIHR5cGUgaXMgImRvdWJsZSIgdGhlbiB0aGUgcG9pbnRlciBpcworICogYSBkb3VibGUqLCBhbmQgaWYgaXQncyAiY2hhcioiIHRoZW4gdGhlIHBvaW50ZXIgaXMKKyAqIGEgImNoYXIqKiIuCisgKgorICogQSB2YWx1ZSBvZiB0eXBlICNEQnVzQmFzaWNWYWx1ZSBpcyBndWFyYW50ZWVkIHRvIGJlIGxhcmdlIGVub3VnaCB0bworICogaG9sZCBhbnkgb2YgdGhlIHR5cGVzIHRoYXQgbWF5IGJlIHJldHVybmVkLCB3aGljaCBpcyBoYW5keSBpZiB5b3UKKyAqIGFyZSB0cnlpbmcgdG8gZG8gdGhpbmdzIGdlbmVyaWNhbGx5LiBGb3IgZXhhbXBsZSB5b3UgY2FuIHBhc3MKKyAqIGEgREJ1c0Jhc2ljVmFsdWUqIGluIHRvIHRoaXMgZnVuY3Rpb24sIGFuZCB0aGVuIHBhc3MgdGhlIHNhbWUKKyAqIERCdXNCYXNpY1ZhbHVlKiBpbiB0byBfZGJ1c19tYXJzaGFsX2Jhc2ljX3R5cGUoKSBpbiBvcmRlciB0bworICogbW92ZSBhIHZhbHVlIGZyb20gb25lIHBsYWNlIHRvIGFub3RoZXIuCisgKgorICogQHBhcmFtIHN0ciB0aGUgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGRhdGEKKyAqIEBwYXJhbSBwb3MgcG9zaXRpb24gaW4gdGhlIHN0cmluZworICogQHBhcmFtIHR5cGUgdHlwZSBvZiB2YWx1ZSB0byBkZW1hcnNoYWwKKyAqIEBwYXJhbSB2YWx1ZSBwb2ludGVyIHRvIHJldHVybiB2YWx1ZSBkYXRhCisgKiBAcGFyYW0gYnl0ZV9vcmRlciB0aGUgYnl0ZSBvcmRlcgorICogQHBhcmFtIG5ld19wb3MgcG9pbnRlciB0byB1cGRhdGUgd2l0aCBuZXcgcG9zaXRpb24sIG9yICNOVUxMCisgKiovCit2b2lkCitfZGJ1c19tYXJzaGFsX3JlYWRfYmFzaWMgKGNvbnN0IERCdXNTdHJpbmcgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgIHBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAqbmV3X3BvcykKK3sKKyAgY29uc3QgY2hhciAqc3RyX2RhdGE7CisKKyAgX2RidXNfYXNzZXJ0IChkYnVzX3R5cGVfaXNfYmFzaWMgKHR5cGUpKTsKKworICBzdHJfZGF0YSA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoc3RyKTsKKworICAvKiBCZWxvdyB3ZSB2b2xhdGlsZSB0eXBlcyB0byBhdm9pZCBhbGlhc2luZyBpc3N1ZXM7CisgICAqIHNlZSBodHRwOi8vYnVncy5mcmVlZGVza3RvcC5vcmcvc2hvd19idWcuY2dpP2lkPTIwMTM3CisgICAqLworICAKKyAgc3dpdGNoICh0eXBlKQorICAgIHsKKyAgICBjYXNlIERCVVNfVFlQRV9CWVRFOgorICAgICAgeworICAgICAgdm9sYXRpbGUgdW5zaWduZWQgY2hhciAqdnAgPSB2YWx1ZTsKKyAgICAgICp2cCA9ICh1bnNpZ25lZCBjaGFyKSBfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKHN0ciwgcG9zKTsKKyAgICAgIChwb3MpKys7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIERCVVNfVFlQRV9JTlQxNjoKKyAgICBjYXNlIERCVVNfVFlQRV9VSU5UMTY6CisgICAgICB7CisgICAgICB2b2xhdGlsZSBkYnVzX3VpbnQxNl90ICp2cCA9IHZhbHVlOworICAgICAgcG9zID0gX0RCVVNfQUxJR05fVkFMVUUgKHBvcywgMik7CisgICAgICAqdnAgPSAqKGRidXNfdWludDE2X3QgKikoc3RyX2RhdGEgKyBwb3MpOworICAgICAgaWYgKGJ5dGVfb3JkZXIgIT0gREJVU19DT01QSUxFUl9CWVRFX09SREVSKQorCSp2cCA9IERCVVNfVUlOVDE2X1NXQVBfTEVfQkUgKCp2cCk7CisgICAgICBwb3MgKz0gMjsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgREJVU19UWVBFX0lOVDMyOgorICAgIGNhc2UgREJVU19UWVBFX1VJTlQzMjoKKyAgICBjYXNlIERCVVNfVFlQRV9CT09MRUFOOgorICAgIGNhc2UgREJVU19UWVBFX1VOSVhfRkQ6CisgICAgICB7CisgICAgICB2b2xhdGlsZSBkYnVzX3VpbnQzMl90ICp2cCA9IHZhbHVlOworICAgICAgcG9zID0gX0RCVVNfQUxJR05fVkFMVUUgKHBvcywgNCk7CisgICAgICAqdnAgPSAqKGRidXNfdWludDMyX3QgKikoc3RyX2RhdGEgKyBwb3MpOworICAgICAgaWYgKGJ5dGVfb3JkZXIgIT0gREJVU19DT01QSUxFUl9CWVRFX09SREVSKQorCSp2cCA9IERCVVNfVUlOVDMyX1NXQVBfTEVfQkUgKCp2cCk7CisgICAgICBwb3MgKz0gNDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgREJVU19UWVBFX0lOVDY0OgorICAgIGNhc2UgREJVU19UWVBFX1VJTlQ2NDoKKyAgICBjYXNlIERCVVNfVFlQRV9ET1VCTEU6CisgICAgICB7CisgICAgICB2b2xhdGlsZSBkYnVzX3VpbnQ2NF90ICp2cCA9IHZhbHVlOworICAgICAgcG9zID0gX0RCVVNfQUxJR05fVkFMVUUgKHBvcywgOCk7CisgICAgICBpZiAoYnl0ZV9vcmRlciAhPSBEQlVTX0NPTVBJTEVSX0JZVEVfT1JERVIpCisgICAgICAgICp2cCA9IERCVVNfVUlOVDY0X1NXQVBfTEVfQkUgKCooZGJ1c191aW50NjRfdCopKHN0cl9kYXRhICsgcG9zKSk7CisgICAgICBlbHNlCisgICAgICAgICp2cCA9ICooZGJ1c191aW50NjRfdCopKHN0cl9kYXRhICsgcG9zKTsKKyAgICAgIHBvcyArPSA4OworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBEQlVTX1RZUEVfU1RSSU5HOgorICAgIGNhc2UgREJVU19UWVBFX09CSkVDVF9QQVRIOgorICAgICAgeworICAgICAgICBpbnQgbGVuOworICAgICAgICB2b2xhdGlsZSBjaGFyICoqdnAgPSB2YWx1ZTsKKworICAgICAgICBsZW4gPSBfZGJ1c19tYXJzaGFsX3JlYWRfdWludDMyIChzdHIsIHBvcywgYnl0ZV9vcmRlciwgJnBvcyk7CisKKyAgICAgICAgKnZwID0gKGNoYXIqKSBzdHJfZGF0YSArIHBvczsKKworICAgICAgICBwb3MgKz0gbGVuICsgMTsgLyogbGVuZ3RoIHBsdXMgbnVsICovCisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIERCVVNfVFlQRV9TSUdOQVRVUkU6CisgICAgICB7CisgICAgICAgIGludCBsZW47CisgICAgICAgIHZvbGF0aWxlIGNoYXIgKip2cCA9IHZhbHVlOworCisgICAgICAgIGxlbiA9IF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoc3RyLCBwb3MpOworICAgICAgICBwb3MgKz0gMTsKKworICAgICAgICAqdnAgPSAoY2hhciopIHN0cl9kYXRhICsgcG9zOworCisgICAgICAgIHBvcyArPSBsZW4gKyAxOyAvKiBsZW5ndGggcGx1cyBudWwgKi8KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBfZGJ1c193YXJuX2NoZWNrX2ZhaWxlZCAoInR5cGUgJXMgJWQgbm90IGEgYmFzaWMgdHlwZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfdHlwZV90b19zdHJpbmcgKHR5cGUpLCB0eXBlKTsKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vdCBhIGJhc2ljIHR5cGUiKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICBpZiAobmV3X3BvcykKKyAgICAqbmV3X3BvcyA9IHBvczsKK30KKworc3RhdGljIGRidXNfYm9vbF90CittYXJzaGFsXzJfb2N0ZXRzIChEQnVzU3RyaW5nICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgaW5zZXJ0X2F0LAorICAgICAgICAgICAgICAgICAgZGJ1c191aW50MTZfdCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAqcG9zX2FmdGVyKQoreworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIGludCBvcmlnX2xlbjsKKworICBfREJVU19TVEFUSUNfQVNTRVJUIChzaXplb2YgKHZhbHVlKSA9PSAyKTsKKworICBpZiAoYnl0ZV9vcmRlciAhPSBEQlVTX0NPTVBJTEVSX0JZVEVfT1JERVIpCisgICAgdmFsdWUgPSBEQlVTX1VJTlQxNl9TV0FQX0xFX0JFICh2YWx1ZSk7CisKKyAgb3JpZ19sZW4gPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoc3RyKTsKKworICByZXR2YWwgPSBfZGJ1c19zdHJpbmdfaW5zZXJ0XzJfYWxpZ25lZCAoc3RyLCBpbnNlcnRfYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdW5zaWduZWQgY2hhciAqKSZ2YWx1ZSk7CisKKyAgaWYgKHBvc19hZnRlcikKKyAgICB7CisgICAgICAqcG9zX2FmdGVyID0gaW5zZXJ0X2F0ICsgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChzdHIpIC0gb3JpZ19sZW4pOworICAgICAgX2RidXNfYXNzZXJ0ICgqcG9zX2FmdGVyIDw9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChzdHIpKTsKKyAgICB9CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGRidXNfYm9vbF90CittYXJzaGFsXzRfb2N0ZXRzIChEQnVzU3RyaW5nICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgaW5zZXJ0X2F0LAorICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAqcG9zX2FmdGVyKQoreworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIGludCBvcmlnX2xlbjsKKworICBfREJVU19TVEFUSUNfQVNTRVJUIChzaXplb2YgKHZhbHVlKSA9PSA0KTsKKworICBpZiAoYnl0ZV9vcmRlciAhPSBEQlVTX0NPTVBJTEVSX0JZVEVfT1JERVIpCisgICAgdmFsdWUgPSBEQlVTX1VJTlQzMl9TV0FQX0xFX0JFICh2YWx1ZSk7CisKKyAgb3JpZ19sZW4gPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoc3RyKTsKKworICByZXR2YWwgPSBfZGJ1c19zdHJpbmdfaW5zZXJ0XzRfYWxpZ25lZCAoc3RyLCBpbnNlcnRfYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdW5zaWduZWQgY2hhciAqKSZ2YWx1ZSk7CisKKyAgaWYgKHBvc19hZnRlcikKKyAgICB7CisgICAgICAqcG9zX2FmdGVyID0gaW5zZXJ0X2F0ICsgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChzdHIpIC0gb3JpZ19sZW4pOworICAgICAgX2RidXNfYXNzZXJ0ICgqcG9zX2FmdGVyIDw9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChzdHIpKTsKKyAgICB9CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGRidXNfYm9vbF90CittYXJzaGFsXzhfb2N0ZXRzIChEQnVzU3RyaW5nICAgICpzdHIsCisgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICBpbnNlcnRfYXQsCisgICAgICAgICAgICAgICAgICBEQnVzQmFzaWNWYWx1ZSB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICpwb3NfYWZ0ZXIpCit7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgaW50IG9yaWdfbGVuOworCisgIF9EQlVTX1NUQVRJQ19BU1NFUlQgKHNpemVvZiAodmFsdWUpID09IDgpOworCisgIHN3YXBfOF9vY3RldHMgKCZ2YWx1ZSwgYnl0ZV9vcmRlcik7CisKKyAgb3JpZ19sZW4gPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoc3RyKTsKKworICByZXR2YWwgPSBfZGJ1c19zdHJpbmdfaW5zZXJ0XzhfYWxpZ25lZCAoc3RyLCBpbnNlcnRfYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdW5zaWduZWQgY2hhciAqKSZ2YWx1ZSk7CisKKyAgaWYgKHBvc19hZnRlcikKKyAgICAqcG9zX2FmdGVyID0gaW5zZXJ0X2F0ICsgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHN0cikgLSBvcmlnX2xlbjsKKworICByZXR1cm4gcmV0dmFsOworfQorCitlbnVtCisgIHsKKyAgICBNQVJTSEFMX0FTX1NUUklORywKKyAgICBNQVJTSEFMX0FTX1NJR05BVFVSRSwKKyAgICBNQVJTSEFMX0FTX0JZVEVfQVJSQVkKKyAgfTsKKworc3RhdGljIGRidXNfYm9vbF90CittYXJzaGFsX2xlbl9mb2xsb3dlZF9ieV9ieXRlcyAoaW50ICAgICAgICAgICAgICAgICAgbWFyc2hhbF9hcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICAgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgaW5zZXJ0X2F0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgIGRhdGFfbGVuLCAvKiBkb2Vzbid0IGluY2x1ZGUgbnVsIGlmIGFueSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAqcG9zX2FmdGVyKQoreworICBpbnQgcG9zOworICBEQnVzU3RyaW5nIHZhbHVlX3N0cjsKKyAgaW50IHZhbHVlX2xlbjsKKworICBfZGJ1c19hc3NlcnQgKGJ5dGVfb3JkZXIgPT0gREJVU19MSVRUTEVfRU5ESUFOIHx8IGJ5dGVfb3JkZXIgPT0gREJVU19CSUdfRU5ESUFOKTsKKyAgaWYgKGluc2VydF9hdCA+IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChzdHIpKQorICAgIF9kYnVzX3dhcm4gKCJpbnNlcnRfYXQgPSAlZCBzdHJpbmcgbGVuID0gJWQgZGF0YV9sZW4gPSAlZCIsCisgICAgICAgICAgICAgICAgaW5zZXJ0X2F0LCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoc3RyKSwgZGF0YV9sZW4pOworICAKKyAgaWYgKG1hcnNoYWxfYXMgPT0gTUFSU0hBTF9BU19CWVRFX0FSUkFZKQorICAgIHZhbHVlX2xlbiA9IGRhdGFfbGVuOworICBlbHNlCisgICAgdmFsdWVfbGVuID0gZGF0YV9sZW4gKyAxOyAvKiB2YWx1ZSBoYXMgYSBudWwgKi8KKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdF9sZW4gKCZ2YWx1ZV9zdHIsIChjb25zdCBjaGFyICopIHZhbHVlLCB2YWx1ZV9sZW4pOworCisgIHBvcyA9IGluc2VydF9hdDsKKworICBpZiAobWFyc2hhbF9hcyA9PSBNQVJTSEFMX0FTX1NJR05BVFVSRSkKKyAgICB7CisgICAgICBfZGJ1c19hc3NlcnQgKGRhdGFfbGVuIDw9IERCVVNfTUFYSU1VTV9TSUdOQVRVUkVfTEVOR1RIKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoZGF0YV9sZW4gPD0gMjU1KTsgLyogc2FtZSBhcyBtYXggc2lnIGxlbiByaWdodCBub3cgKi8KKyAgICAgIAorICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5zZXJ0X2J5dGUgKHN0ciwgcG9zLCBkYXRhX2xlbikpCisgICAgICAgIGdvdG8gb29tOworCisgICAgICBwb3MgKz0gMTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoIW1hcnNoYWxfNF9vY3RldHMgKHN0ciwgcG9zLCBkYXRhX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwgJnBvcykpCisgICAgICAgIGdvdG8gb29tOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5X2xlbiAoJnZhbHVlX3N0ciwgMCwgdmFsdWVfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyLCBwb3MpKQorICAgIGdvdG8gb29tOworCisjaWYgMAorICAvKiB0b28gZXhwZW5zaXZlICovCisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2VxdWFsX3N1YnN0cmluZyAoJnZhbHVlX3N0ciwgMCwgdmFsdWVfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciwgcG9zKSk7CisgIF9kYnVzX3ZlcmJvc2VfYnl0ZXNfb2Zfc3RyaW5nIChzdHIsIHBvcywgdmFsdWVfbGVuKTsKKyNlbmRpZgorCisgIHBvcyArPSB2YWx1ZV9sZW47CisKKyAgaWYgKHBvc19hZnRlcikKKyAgICAqcG9zX2FmdGVyID0gcG9zOworCisgIHJldHVybiBUUlVFOworCisgb29tOgorICAvKiBEZWxldGUgd2hhdCB3ZSd2ZSBpbnNlcnRlZCAqLworICBfZGJ1c19zdHJpbmdfZGVsZXRlIChzdHIsIGluc2VydF9hdCwgcG9zIC0gaW5zZXJ0X2F0KTsKKworICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorbWFyc2hhbF9zdHJpbmcgKERCdXNTdHJpbmcgICAgKnN0ciwKKyAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICBpbnNlcnRfYXQsCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAqdmFsdWUsCisgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICpwb3NfYWZ0ZXIpCit7CisgIHJldHVybiBtYXJzaGFsX2xlbl9mb2xsb3dlZF9ieV9ieXRlcyAoTUFSU0hBTF9BU19TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyLCBpbnNlcnRfYXQsIChjb25zdCB1bnNpZ25lZCBjaGFyICopIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbiAodmFsdWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIsIHBvc19hZnRlcik7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorbWFyc2hhbF9zaWduYXR1cmUgKERCdXNTdHJpbmcgICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICBpbnNlcnRfYXQsCisgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAqcG9zX2FmdGVyKQoreworICByZXR1cm4gbWFyc2hhbF9sZW5fZm9sbG93ZWRfYnlfYnl0ZXMgKE1BUlNIQUxfQVNfU0lHTkFUVVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciwgaW5zZXJ0X2F0LCAoY29uc3QgdW5zaWduZWQgY2hhciAqKSB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4gKHZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0NPTVBJTEVSX0JZVEVfT1JERVIsIC8qIGlycmVsZXZhbnQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NfYWZ0ZXIpOworfQorCisvKioKKyAqIE1hcnNoYWxzIGEgYmFzaWMtdHlwZWQgdmFsdWUuIFRoZSAidmFsdWUiIHBvaW50ZXIgaXMgYWx3YXlzIHRoZQorICogYWRkcmVzcyBvZiBhIHZhcmlhYmxlIGNvbnRhaW5pbmcgdGhlIGJhc2ljIHR5cGUgdmFsdWUuCisgKiBTbyBmb3IgZXhhbXBsZSBmb3IgaW50MzIgaXQgd2lsbCBiZSBkYnVzX2ludDMyX3QqLCBhbmQKKyAqIGZvciBzdHJpbmcgaXQgd2lsbCBiZSBjb25zdCBjaGFyKiouIFRoaXMgaXMgZm9yIHN5bW1ldHJ5CisgKiB3aXRoIF9kYnVzX21hcnNoYWxfcmVhZF9iYXNpYygpIGFuZCB0byBoYXZlIGEgc2ltcGxlCisgKiBjb25zaXN0ZW50IHJ1bGUuCisgKgorICogQHBhcmFtIHN0ciBzdHJpbmcgdG8gbWFyc2hhbCB0bworICogQHBhcmFtIGluc2VydF9hdCB3aGVyZSB0byBpbnNlcnQgdGhlIHZhbHVlCisgKiBAcGFyYW0gdHlwZSB0eXBlIG9mIHZhbHVlCisgKiBAcGFyYW0gdmFsdWUgcG9pbnRlciB0byBhIHZhcmlhYmxlIGNvbnRhaW5pbmcgdGhlIHZhbHVlCisgKiBAcGFyYW0gYnl0ZV9vcmRlciBieXRlIG9yZGVyCisgKiBAcGFyYW0gcG9zX2FmdGVyICNOVUxMIG9yIHRoZSBwb3NpdGlvbiBhZnRlciB0aGUgdHlwZQorICogQHJldHVybnMgI1RSVUUgb24gc3VjY2VzcworICoqLworZGJ1c19ib29sX3QKK19kYnVzX21hcnNoYWxfd3JpdGVfYmFzaWMgKERCdXNTdHJpbmcgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIGluc2VydF9hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICpwb3NfYWZ0ZXIpCit7CisgIGNvbnN0IERCdXNCYXNpY1ZhbHVlICp2cDsKKworICBfZGJ1c19hc3NlcnQgKGRidXNfdHlwZV9pc19iYXNpYyAodHlwZSkpOworCisgIHZwID0gdmFsdWU7CisKKyAgc3dpdGNoICh0eXBlKQorICAgIHsKKyAgICBjYXNlIERCVVNfVFlQRV9CWVRFOgorICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5zZXJ0X2J5dGUgKHN0ciwgaW5zZXJ0X2F0LCB2cC0+Ynl0KSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgaWYgKHBvc19hZnRlcikKKyAgICAgICAgKnBvc19hZnRlciA9IGluc2VydF9hdCArIDE7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgREJVU19UWVBFX0lOVDE2OgorICAgIGNhc2UgREJVU19UWVBFX1VJTlQxNjoKKyAgICAgIHJldHVybiBtYXJzaGFsXzJfb2N0ZXRzIChzdHIsIGluc2VydF9hdCwgdnAtPnUxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlX29yZGVyLCBwb3NfYWZ0ZXIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBEQlVTX1RZUEVfQk9PTEVBTjoKKyAgICAgIHJldHVybiBtYXJzaGFsXzRfb2N0ZXRzIChzdHIsIGluc2VydF9hdCwgdnAtPnUzMiAhPSBGQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlX29yZGVyLCBwb3NfYWZ0ZXIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBEQlVTX1RZUEVfSU5UMzI6CisgICAgY2FzZSBEQlVTX1RZUEVfVUlOVDMyOgorICAgIGNhc2UgREJVU19UWVBFX1VOSVhfRkQ6CisgICAgICByZXR1cm4gbWFyc2hhbF80X29jdGV0cyAoc3RyLCBpbnNlcnRfYXQsIHZwLT51MzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwgcG9zX2FmdGVyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgREJVU19UWVBFX0lOVDY0OgorICAgIGNhc2UgREJVU19UWVBFX1VJTlQ2NDoKKyAgICBjYXNlIERCVVNfVFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gbWFyc2hhbF84X29jdGV0cyAoc3RyLCBpbnNlcnRfYXQsICp2cCwgYnl0ZV9vcmRlciwgcG9zX2FmdGVyKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBEQlVTX1RZUEVfU1RSSU5HOgorICAgIGNhc2UgREJVU19UWVBFX09CSkVDVF9QQVRIOgorICAgICAgX2RidXNfYXNzZXJ0ICh2cC0+c3RyICE9IE5VTEwpOworICAgICAgcmV0dXJuIG1hcnNoYWxfc3RyaW5nIChzdHIsIGluc2VydF9hdCwgdnAtPnN0ciwgYnl0ZV9vcmRlciwgcG9zX2FmdGVyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgREJVU19UWVBFX1NJR05BVFVSRToKKyAgICAgIF9kYnVzX2Fzc2VydCAodnAtPnN0ciAhPSBOVUxMKTsKKyAgICAgIHJldHVybiBtYXJzaGFsX3NpZ25hdHVyZSAoc3RyLCBpbnNlcnRfYXQsIHZwLT5zdHIsIHBvc19hZnRlcik7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm90IGEgYmFzaWMgdHlwZSIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgYnJlYWs7CisgICAgfQorfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK21hcnNoYWxfMV9vY3RldHNfYXJyYXkgKERCdXNTdHJpbmcgICAgICAgICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgIGluc2VydF9hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgbl9lbGVtZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICpwb3NfYWZ0ZXIpCit7CisgIGludCBwb3M7CisgIERCdXNTdHJpbmcgdmFsdWVfc3RyOworCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0X2xlbiAoJnZhbHVlX3N0ciwgKGNvbnN0IGNoYXIgKikgdmFsdWUsIG5fZWxlbWVudHMpOworCisgIHBvcyA9IGluc2VydF9hdDsKKworICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5X2xlbiAoJnZhbHVlX3N0ciwgMCwgbl9lbGVtZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciwgcG9zKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcG9zICs9IG5fZWxlbWVudHM7CisKKyAgaWYgKHBvc19hZnRlcikKKyAgICAqcG9zX2FmdGVyID0gcG9zOworCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIFN3YXBzIHRoZSBlbGVtZW50cyBvZiBhbiBhcnJheSB0byB0aGUgb3Bwb3NpdGUgYnl0ZSBvcmRlcgorICoKKyAqIEBwYXJhbSBkYXRhIHN0YXJ0IG9mIGFycmF5CisgKiBAcGFyYW0gbl9lbGVtZW50cyBudW1iZXIgb2YgZWxlbWVudHMKKyAqIEBwYXJhbSBhbGlnbm1lbnQgc2l6ZSBvZiBlYWNoIGVsZW1lbnQKKyAqLwordm9pZAorX2RidXNfc3dhcF9hcnJheSAodW5zaWduZWQgY2hhciAqZGF0YSwKKyAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgIG5fZWxlbWVudHMsCisgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICBhbGlnbm1lbnQpCit7CisgIHVuc2lnbmVkIGNoYXIgKmQ7CisgIHVuc2lnbmVkIGNoYXIgKmVuZDsKKworICBfZGJ1c19hc3NlcnQgKF9EQlVTX0FMSUdOX0FERFJFU1MgKGRhdGEsIGFsaWdubWVudCkgPT0gZGF0YSk7CisKKyAgLyogd2UgdXNlIGNvbnN0X2RhdGEgYW5kIGNhc3QgaXQgb2ZmIHNvIERCdXNTdHJpbmcgY2FuIGJlIGEgY29uc3Qgc3RyaW5nCisgICAqIGZvciB0aGUgdW5pdCB0ZXN0cy4gZG9uJ3QgYXNrLgorICAgKi8KKyAgZCA9IGRhdGE7CisgIGVuZCA9IGQgKyAobl9lbGVtZW50cyAqIGFsaWdubWVudCk7CisgIAorICBpZiAoYWxpZ25tZW50ID09IDgpCisgICAgeworICAgICAgd2hpbGUgKGQgIT0gZW5kKQorICAgICAgICB7CisgICAgICAgICAgKigoZGJ1c191aW50NjRfdCopZCkgPSBEQlVTX1VJTlQ2NF9TV0FQX0xFX0JFICgqKChkYnVzX3VpbnQ2NF90KilkKSk7CisgICAgICAgICAgZCArPSA4OworICAgICAgICB9CisgICAgfQorICBlbHNlIGlmIChhbGlnbm1lbnQgPT0gNCkKKyAgICB7CisgICAgICB3aGlsZSAoZCAhPSBlbmQpCisgICAgICAgIHsKKyAgICAgICAgICAqKChkYnVzX3VpbnQzMl90KilkKSA9IERCVVNfVUlOVDMyX1NXQVBfTEVfQkUgKCooKGRidXNfdWludDMyX3QqKWQpKTsKKyAgICAgICAgICBkICs9IDQ7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfZGJ1c19hc3NlcnQgKGFsaWdubWVudCA9PSAyKTsKKyAgICAgIAorICAgICAgd2hpbGUgKGQgIT0gZW5kKQorICAgICAgICB7CisgICAgICAgICAgKigoZGJ1c191aW50MTZfdCopZCkgPSBEQlVTX1VJTlQxNl9TV0FQX0xFX0JFICgqKChkYnVzX3VpbnQxNl90KilkKSk7CisgICAgICAgICAgZCArPSAyOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorc3dhcF9hcnJheSAoREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgaW50ICAgICAgICAgYXJyYXlfc3RhcnQsCisgICAgICAgICAgICBpbnQgICAgICAgICBuX2VsZW1lbnRzLAorICAgICAgICAgICAgaW50ICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgIGludCAgICAgICAgIGFsaWdubWVudCkKK3sKKyAgX2RidXNfYXNzZXJ0IChfREJVU19BTElHTl9WQUxVRSAoYXJyYXlfc3RhcnQsIGFsaWdubWVudCkgPT0gKHVuc2lnbmVkKSBhcnJheV9zdGFydCk7CisKKyAgaWYgKGJ5dGVfb3JkZXIgIT0gREJVU19DT01QSUxFUl9CWVRFX09SREVSKQorICAgIHsKKyAgICAgIC8qIHdlIHVzZSBjb25zdF9kYXRhIGFuZCBjYXN0IGl0IG9mZiBzbyBEQnVzU3RyaW5nIGNhbiBiZSBhIGNvbnN0IHN0cmluZworICAgICAgICogZm9yIHRoZSB1bml0IHRlc3RzLiBkb24ndCBhc2suCisgICAgICAgKi8KKyAgICAgIF9kYnVzX3N3YXBfYXJyYXkgKCh1bnNpZ25lZCBjaGFyKikgKF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoc3RyKSArIGFycmF5X3N0YXJ0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5fZWxlbWVudHMsIGFsaWdubWVudCk7CisgICAgfQorfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK21hcnNoYWxfZml4ZWRfbXVsdGkgKERCdXNTdHJpbmcgICAgICAgICAgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgaW5zZXJ0X2F0LAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c0Jhc2ljVmFsdWUgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgIG5fZWxlbWVudHMsCisgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICBhbGlnbm1lbnQsCisgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAqcG9zX2FmdGVyKQoreworICBpbnQgb2xkX3N0cmluZ19sZW47CisgIGludCBhcnJheV9zdGFydDsKKyAgREJ1c1N0cmluZyB0OworICBpbnQgbGVuX2luX2J5dGVzOworCisgIF9kYnVzX2Fzc2VydCAobl9lbGVtZW50cyA8PSBEQlVTX01BWElNVU1fQVJSQVlfTEVOR1RIIC8gYWxpZ25tZW50KTsKKyAgCisgIG9sZF9zdHJpbmdfbGVuID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHN0cik7CisKKyAgbGVuX2luX2J5dGVzID0gbl9lbGVtZW50cyAqIGFsaWdubWVudDsKKyAgYXJyYXlfc3RhcnQgPSBpbnNlcnRfYXQ7CisgIAorICAvKiBOb3RlIHRoYXQgd2UgZG8gYWxpZ25tZW50IHBhZGRpbmcgdW5jb25kaXRpb25hbGx5CisgICAqIGV2ZW4gaWYgdGhlIGFycmF5IGlzIGVtcHR5OyB0aGlzIG1lYW5zIHRoYXQKKyAgICogcGFkZGluZyArIGxlbiBpcyBhbHdheXMgZXF1YWwgdG8gdGhlIG51bWJlciBvZiBieXRlcworICAgKiBpbiB0aGUgYXJyYXkuCisgICAqLworCisgIGlmICghX2RidXNfc3RyaW5nX2luc2VydF9hbGlnbm1lbnQgKHN0ciwgJmFycmF5X3N0YXJ0LCBhbGlnbm1lbnQpKQorICAgIGdvdG8gZXJyb3I7CisKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3RfbGVuICgmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciAqKSB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5faW5fYnl0ZXMpOworCisgIGlmICghX2RidXNfc3RyaW5nX2NvcHkgKCZ0LCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIsIGFycmF5X3N0YXJ0KSkKKyAgICBnb3RvIGVycm9yOworCisgIHN3YXBfYXJyYXkgKHN0ciwgYXJyYXlfc3RhcnQsIG5fZWxlbWVudHMsIGJ5dGVfb3JkZXIsIGFsaWdubWVudCk7CisKKyAgaWYgKHBvc19hZnRlcikKKyAgICAqcG9zX2FmdGVyID0gYXJyYXlfc3RhcnQgKyBsZW5faW5fYnl0ZXM7CisgIAorICByZXR1cm4gVFJVRTsKKworIGVycm9yOgorICBfZGJ1c19zdHJpbmdfZGVsZXRlIChzdHIsIGluc2VydF9hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHN0cikgLSBvbGRfc3RyaW5nX2xlbik7CisKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKioKKyAqIE1hcnNoYWxzIGEgYmxvY2sgb2YgdmFsdWVzIG9mIGZpeGVkLWxlbmd0aCB0eXBlIGFsbCBhdCBvbmNlLCBhcyBhbgorICogb3B0aW1pemF0aW9uLiAgZGJ1c190eXBlX2lzX2ZpeGVkKCkgcmV0dXJucyAjVFJVRSBmb3IgZml4ZWQtbGVuZ3RoCisgKiB0eXBlcywgd2hpY2ggYXJlIHRoZSBiYXNpYyB0eXBlcyBtaW51cyB0aGUgc3RyaW5nLWxpa2UgdHlwZXMuCisgKgorICogVGhlIHZhbHVlIGFyZ3VtZW50IHNob3VsZCBiZSB0aGUgYWRkZHJlc3Mgb2YgYW4KKyAqIGFycmF5LCBzbyBlLmcuICJjb25zdCBkYnVzX3VpbnQzMl90KioiCisgKgorICogQHBhcmFtIHN0ciBzdHJpbmcgdG8gbWFyc2hhbCB0bworICogQHBhcmFtIGluc2VydF9hdCB3aGVyZSB0byBpbnNlcnQgdGhlIHZhbHVlCisgKiBAcGFyYW0gZWxlbWVudF90eXBlIHR5cGUgb2YgYXJyYXkgZWxlbWVudHMKKyAqIEBwYXJhbSB2YWx1ZSBhZGRyZXNzIG9mIGFuIGFycmF5IHRvIG1hcnNoYWwKKyAqIEBwYXJhbSBuX2VsZW1lbnRzIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgYXJyYXkKKyAqIEBwYXJhbSBieXRlX29yZGVyIGJ5dGUgb3JkZXIKKyAqIEBwYXJhbSBwb3NfYWZ0ZXIgI05VTEwgb3IgdGhlIHBvc2l0aW9uIGFmdGVyIHRoZSB0eXBlCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzCisgKiovCitkYnVzX2Jvb2xfdAorX2RidXNfbWFyc2hhbF93cml0ZV9maXhlZF9tdWx0aSAoREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgaW5zZXJ0X2F0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICBuX2VsZW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgKnBvc19hZnRlcikKK3sKKyAgY29uc3Qgdm9pZCogdnAgPSAqKGNvbnN0IERCdXNCYXNpY1ZhbHVlKiopdmFsdWU7CisgIAorICBfZGJ1c19hc3NlcnQgKGRidXNfdHlwZV9pc19maXhlZCAoZWxlbWVudF90eXBlKSk7CisgIF9kYnVzX2Fzc2VydCAobl9lbGVtZW50cyA+PSAwKTsKKworI2lmIDAKKyAgX2RidXNfdmVyYm9zZSAoIndyaXRpbmcgJWQgZWxlbWVudHMgb2YgJXNcbiIsCisgICAgICAgICAgICAgICAgIG5fZWxlbWVudHMsIF9kYnVzX3R5cGVfdG9fc3RyaW5nIChlbGVtZW50X3R5cGUpKTsKKyNlbmRpZgorICAKKyAgc3dpdGNoIChlbGVtZW50X3R5cGUpCisgICAgeworICAgIGNhc2UgREJVU19UWVBFX0JZVEU6CisgICAgICByZXR1cm4gbWFyc2hhbF8xX29jdGV0c19hcnJheSAoc3RyLCBpbnNlcnRfYXQsIHZwLCBuX2VsZW1lbnRzLCBieXRlX29yZGVyLCBwb3NfYWZ0ZXIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBEQlVTX1RZUEVfSU5UMTY6CisgICAgY2FzZSBEQlVTX1RZUEVfVUlOVDE2OgorICAgICAgcmV0dXJuIG1hcnNoYWxfZml4ZWRfbXVsdGkgKHN0ciwgaW5zZXJ0X2F0LCB2cCwgbl9lbGVtZW50cywgYnl0ZV9vcmRlciwgMiwgcG9zX2FmdGVyKTsKKyAgICBjYXNlIERCVVNfVFlQRV9CT09MRUFOOgorICAgIGNhc2UgREJVU19UWVBFX0lOVDMyOgorICAgIGNhc2UgREJVU19UWVBFX1VJTlQzMjoKKyAgICBjYXNlIERCVVNfVFlQRV9VTklYX0ZEOgorICAgICAgcmV0dXJuIG1hcnNoYWxfZml4ZWRfbXVsdGkgKHN0ciwgaW5zZXJ0X2F0LCB2cCwgbl9lbGVtZW50cywgYnl0ZV9vcmRlciwgNCwgcG9zX2FmdGVyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgREJVU19UWVBFX0lOVDY0OgorICAgIGNhc2UgREJVU19UWVBFX1VJTlQ2NDoKKyAgICBjYXNlIERCVVNfVFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gbWFyc2hhbF9maXhlZF9tdWx0aSAoc3RyLCBpbnNlcnRfYXQsIHZwLCBuX2VsZW1lbnRzLCBieXRlX29yZGVyLCA4LCBwb3NfYWZ0ZXIpOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm9uIGZpeGVkIHR5cGUgaW4gYXJyYXkgd3JpdGUiKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICByZXR1cm4gRkFMU0U7Cit9CisKKworLyoqCisgKiBTa2lwcyBvdmVyIGEgYmFzaWMtdHlwZWQgdmFsdWUsIHJlcG9ydGluZyB0aGUgZm9sbG93aW5nIHBvc2l0aW9uLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZyBjb250YWluaW5nIHRoZSBkYXRhCisgKiBAcGFyYW0gdHlwZSB0eXBlIG9mIHZhbHVlIHRvIHJlYWQKKyAqIEBwYXJhbSBieXRlX29yZGVyIHRoZSBieXRlIG9yZGVyCisgKiBAcGFyYW0gcG9zIHBvaW50ZXIgdG8gcG9zaXRpb24gaW4gdGhlIHN0cmluZywKKyAqICAgICAgICAgICAgdXBkYXRlZCBvbiByZXR1cm4gdG8gbmV3IHBvc2l0aW9uCisgKiovCit2b2lkCitfZGJ1c19tYXJzaGFsX3NraXBfYmFzaWMgKGNvbnN0IERCdXNTdHJpbmcgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICpwb3MpCit7CisgIF9kYnVzX2Fzc2VydCAoYnl0ZV9vcmRlciA9PSBEQlVTX0xJVFRMRV9FTkRJQU4gfHwKKyAgICAgICAgICAgICAgICBieXRlX29yZGVyID09IERCVVNfQklHX0VORElBTik7CisgIAorICBzd2l0Y2ggKHR5cGUpCisgICAgeworICAgIGNhc2UgREJVU19UWVBFX0JZVEU6CisgICAgICAoKnBvcykrKzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgREJVU19UWVBFX0lOVDE2OgorICAgIGNhc2UgREJVU19UWVBFX1VJTlQxNjoKKyAgICAgICpwb3MgPSBfREJVU19BTElHTl9WQUxVRSAoKnBvcywgMik7CisgICAgICAqcG9zICs9IDI7CisgICAgICBicmVhazsKKyAgICBjYXNlIERCVVNfVFlQRV9CT09MRUFOOgorICAgIGNhc2UgREJVU19UWVBFX0lOVDMyOgorICAgIGNhc2UgREJVU19UWVBFX1VJTlQzMjoKKyAgICBjYXNlIERCVVNfVFlQRV9VTklYX0ZEOgorICAgICAgKnBvcyA9IF9EQlVTX0FMSUdOX1ZBTFVFICgqcG9zLCA0KTsKKyAgICAgICpwb3MgKz0gNDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgREJVU19UWVBFX0lOVDY0OgorICAgIGNhc2UgREJVU19UWVBFX1VJTlQ2NDoKKyAgICBjYXNlIERCVVNfVFlQRV9ET1VCTEU6CisgICAgICAqcG9zID0gX0RCVVNfQUxJR05fVkFMVUUgKCpwb3MsIDgpOworICAgICAgKnBvcyArPSA4OworICAgICAgYnJlYWs7CisgICAgY2FzZSBEQlVTX1RZUEVfU1RSSU5HOgorICAgIGNhc2UgREJVU19UWVBFX09CSkVDVF9QQVRIOgorICAgICAgeworICAgICAgICBpbnQgbGVuOworCisgICAgICAgIGxlbiA9IF9kYnVzX21hcnNoYWxfcmVhZF91aW50MzIgKHN0ciwgKnBvcywgYnl0ZV9vcmRlciwgcG9zKTsKKyAgICAgICAgCisgICAgICAgICpwb3MgKz0gbGVuICsgMTsgLyogbGVuZ3RoIHBsdXMgbnVsICovCisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIERCVVNfVFlQRV9TSUdOQVRVUkU6CisgICAgICB7CisgICAgICAgIGludCBsZW47CisKKyAgICAgICAgbGVuID0gX2RidXNfc3RyaW5nX2dldF9ieXRlIChzdHIsICpwb3MpOworCisgICAgICAgICpwb3MgKz0gbGVuICsgMjsgLyogbGVuZ3RoIGJ5dGUgcGx1cyBsZW5ndGggcGx1cyBudWwgKi8KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBfZGJ1c193YXJuICgidHlwZSAlcyBub3QgYSBiYXNpYyB0eXBlIiwKKyAgICAgICAgICAgICAgICAgIF9kYnVzX3R5cGVfdG9fc3RyaW5nICh0eXBlKSk7CisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJub3QgYSBiYXNpYyB0eXBlIik7CisgICAgICBicmVhazsKKyAgICB9Cit9CisKKy8qKgorICogU2tpcHMgYW4gYXJyYXksIHJldHVybmluZyB0aGUgbmV4dCBwb3NpdGlvbi4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcgY29udGFpbmluZyB0aGUgZGF0YQorICogQHBhcmFtIGVsZW1lbnRfdHlwZSB0aGUgdHlwZSBvZiBhcnJheSBlbGVtZW50cworICogQHBhcmFtIGJ5dGVfb3JkZXIgdGhlIGJ5dGUgb3JkZXIKKyAqIEBwYXJhbSBwb3MgcG9pbnRlciB0byBwb3NpdGlvbiBpbiB0aGUgc3RyaW5nLAorICogICAgICAgICAgICB1cGRhdGVkIG9uIHJldHVybiB0byBuZXcgcG9zaXRpb24KKyAqLwordm9pZAorX2RidXNfbWFyc2hhbF9za2lwX2FycmF5IChjb25zdCBEQnVzU3RyaW5nICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgKnBvcykKK3sKKyAgZGJ1c191aW50MzJfdCBhcnJheV9sZW47CisgIGludCBpOworICBpbnQgYWxpZ25tZW50OworCisgIGkgPSBfREJVU19BTElHTl9WQUxVRSAoKnBvcywgNCk7CisKKyAgYXJyYXlfbGVuID0gX2RidXNfbWFyc2hhbF9yZWFkX3VpbnQzMiAoc3RyLCBpLCBieXRlX29yZGVyLCAmaSk7CisKKyAgYWxpZ25tZW50ID0gX2RidXNfdHlwZV9nZXRfYWxpZ25tZW50IChlbGVtZW50X3R5cGUpOworCisgIGkgPSBfREJVU19BTElHTl9WQUxVRSAoaSwgYWxpZ25tZW50KTsKKworICAqcG9zID0gaSArIGFycmF5X2xlbjsKK30KKworLyoqCisgKiBHZXRzIHRoZSBhbGlnbm1lbnQgcmVxdWlyZW1lbnQgZm9yIHRoZSBnaXZlbiB0eXBlOworICogd2lsbCBiZSAxLCA0LCBvciA4LgorICoKKyAqIEBwYXJhbSB0eXBlY29kZSB0aGUgdHlwZQorICogQHJldHVybnMgYWxpZ25tZW50IG9mIDEsIDQsIG9yIDgKKyAqLworaW50CitfZGJ1c190eXBlX2dldF9hbGlnbm1lbnQgKGludCB0eXBlY29kZSkKK3sKKyAgc3dpdGNoICh0eXBlY29kZSkKKyAgICB7CisgICAgY2FzZSBEQlVTX1RZUEVfQllURToKKyAgICBjYXNlIERCVVNfVFlQRV9WQVJJQU5UOgorICAgIGNhc2UgREJVU19UWVBFX1NJR05BVFVSRToKKyAgICAgIHJldHVybiAxOworICAgIGNhc2UgREJVU19UWVBFX0lOVDE2OgorICAgIGNhc2UgREJVU19UWVBFX1VJTlQxNjoKKyAgICAgIHJldHVybiAyOworICAgIGNhc2UgREJVU19UWVBFX0JPT0xFQU46CisgICAgY2FzZSBEQlVTX1RZUEVfSU5UMzI6CisgICAgY2FzZSBEQlVTX1RZUEVfVUlOVDMyOgorICAgIGNhc2UgREJVU19UWVBFX1VOSVhfRkQ6CisgICAgICAvKiB0aGlzIHN0dWZmIGlzIDQgc2luY2UgaXQgc3RhcnRzIHdpdGggYSBsZW5ndGggKi8KKyAgICBjYXNlIERCVVNfVFlQRV9TVFJJTkc6CisgICAgY2FzZSBEQlVTX1RZUEVfT0JKRUNUX1BBVEg6CisgICAgY2FzZSBEQlVTX1RZUEVfQVJSQVk6CisgICAgICByZXR1cm4gNDsKKyAgICBjYXNlIERCVVNfVFlQRV9JTlQ2NDoKKyAgICBjYXNlIERCVVNfVFlQRV9VSU5UNjQ6CisgICAgY2FzZSBEQlVTX1RZUEVfRE9VQkxFOgorICAgICAgLyogc3RydWN0IGlzIDggc2luY2UgaXQgY291bGQgY29udGFpbiBhbiA4LWFsaWduZWQgaXRlbQorICAgICAgICogYW5kIGl0J3Mgc2ltcGxlciB0byBqdXN0IGFsd2F5cyBhbGlnbiBzdHJ1Y3RzIHRvIDg7CisgICAgICAgKiB3ZSB3YW50IHRoZSBhbW91bnQgb2YgcGFkZGluZyBpbiBhIHN0cnVjdCBvZiBhIGdpdmVuCisgICAgICAgKiB0eXBlIHRvIGJlIHByZWRpY3RhYmxlLCBub3QgbG9jYXRpb24tZGVwZW5kZW50LgorICAgICAgICogRElDVF9FTlRSWSBpcyBhbHdheXMgdGhlIHNhbWUgYXMgc3RydWN0LgorICAgICAgICovCisgICAgY2FzZSBEQlVTX1RZUEVfU1RSVUNUOgorICAgIGNhc2UgREJVU19UWVBFX0RJQ1RfRU5UUlk6CisgICAgICByZXR1cm4gODsKKworICAgIGRlZmF1bHQ6CisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJ1bmtub3duIHR5cGVjb2RlIGluIF9kYnVzX3R5cGVfZ2V0X2FsaWdubWVudCgpIik7CisgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CisKKy8qKgorICogUmV0dXJucyBhIHN0cmluZyBkZXNjcmliaW5nIHRoZSBnaXZlbiB0eXBlLgorICoKKyAqIEBwYXJhbSB0eXBlY29kZSB0aGUgdHlwZSB0byBkZXNjcmliZQorICogQHJldHVybnMgYSBjb25zdGFudCBzdHJpbmcgZGVzY3JpYmluZyB0aGUgdHlwZQorICovCitjb25zdCBjaGFyICoKK19kYnVzX3R5cGVfdG9fc3RyaW5nIChpbnQgdHlwZWNvZGUpCit7CisgIHN3aXRjaCAodHlwZWNvZGUpCisgICAgeworICAgIGNhc2UgREJVU19UWVBFX0lOVkFMSUQ6CisgICAgICByZXR1cm4gImludmFsaWQiOworICAgIGNhc2UgREJVU19UWVBFX0JPT0xFQU46CisgICAgICByZXR1cm4gImJvb2xlYW4iOworICAgIGNhc2UgREJVU19UWVBFX0JZVEU6CisgICAgICByZXR1cm4gImJ5dGUiOworICAgIGNhc2UgREJVU19UWVBFX0lOVDE2OgorICAgICAgcmV0dXJuICJpbnQxNiI7CisgICAgY2FzZSBEQlVTX1RZUEVfVUlOVDE2OgorICAgICAgcmV0dXJuICJ1aW50MTYiOworICAgIGNhc2UgREJVU19UWVBFX0lOVDMyOgorICAgICAgcmV0dXJuICJpbnQzMiI7CisgICAgY2FzZSBEQlVTX1RZUEVfVUlOVDMyOgorICAgICAgcmV0dXJuICJ1aW50MzIiOworICAgIGNhc2UgREJVU19UWVBFX0lOVDY0OgorICAgICAgcmV0dXJuICJpbnQ2NCI7CisgICAgY2FzZSBEQlVTX1RZUEVfVUlOVDY0OgorICAgICAgcmV0dXJuICJ1aW50NjQiOyAgICAgIAorICAgIGNhc2UgREJVU19UWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiZG91YmxlIjsKKyAgICBjYXNlIERCVVNfVFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gInN0cmluZyI7CisgICAgY2FzZSBEQlVTX1RZUEVfT0JKRUNUX1BBVEg6CisgICAgICByZXR1cm4gIm9iamVjdF9wYXRoIjsKKyAgICBjYXNlIERCVVNfVFlQRV9TSUdOQVRVUkU6CisgICAgICByZXR1cm4gInNpZ25hdHVyZSI7CisgICAgY2FzZSBEQlVTX1RZUEVfU1RSVUNUOgorICAgICAgcmV0dXJuICJzdHJ1Y3QiOworICAgIGNhc2UgREJVU19UWVBFX0RJQ1RfRU5UUlk6CisgICAgICByZXR1cm4gImRpY3RfZW50cnkiOworICAgIGNhc2UgREJVU19UWVBFX0FSUkFZOgorICAgICAgcmV0dXJuICJhcnJheSI7CisgICAgY2FzZSBEQlVTX1RZUEVfVkFSSUFOVDoKKyAgICAgIHJldHVybiAidmFyaWFudCI7CisgICAgY2FzZSBEQlVTX1NUUlVDVF9CRUdJTl9DSEFSOgorICAgICAgcmV0dXJuICJiZWdpbl9zdHJ1Y3QiOworICAgIGNhc2UgREJVU19TVFJVQ1RfRU5EX0NIQVI6CisgICAgICByZXR1cm4gImVuZF9zdHJ1Y3QiOworICAgIGNhc2UgREJVU19ESUNUX0VOVFJZX0JFR0lOX0NIQVI6CisgICAgICByZXR1cm4gImJlZ2luX2RpY3RfZW50cnkiOworICAgIGNhc2UgREJVU19ESUNUX0VOVFJZX0VORF9DSEFSOgorICAgICAgcmV0dXJuICJlbmRfZGljdF9lbnRyeSI7CisgICAgY2FzZSBEQlVTX1RZUEVfVU5JWF9GRDoKKyAgICAgIHJldHVybiAidW5peF9mZCI7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAidW5rbm93biI7CisgICAgfQorfQorCisvKioKKyAqIElmIGluIHZlcmJvc2UgbW9kZSwgcHJpbnQgYSBibG9jayBvZiBiaW5hcnkgZGF0YS4KKyAqCisgKiBAcGFyYW0gZGF0YSB0aGUgZGF0YQorICogQHBhcmFtIGxlbiB0aGUgbGVuZ3RoIG9mIHRoZSBkYXRhCisgKiBAcGFyYW0gb2Zmc2V0IHdoZXJlIHRvIHN0YXJ0IGNvdW50aW5nIGZvciBieXRlIGluZGV4ZXMKKyAqLwordm9pZAorX2RidXNfdmVyYm9zZV9ieXRlcyAoY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgIG9mZnNldCkKK3sKKyAgaW50IGk7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFsaWduZWQ7CisKKyAgX2RidXNfYXNzZXJ0IChsZW4gPj0gMCk7CisKKyAgaWYgKCFfZGJ1c19pc192ZXJib3NlKCkpCisgICAgcmV0dXJuOworCisgIC8qIFByaW50IGJsYW5rcyBvbiBmaXJzdCByb3cgaWYgYXBwcm9wcmlhdGUgKi8KKyAgYWxpZ25lZCA9IF9EQlVTX0FMSUdOX0FERFJFU1MgKGRhdGEsIDQpOworICBpZiAoYWxpZ25lZCA+IGRhdGEpCisgICAgYWxpZ25lZCAtPSA0OworICBfZGJ1c19hc3NlcnQgKGFsaWduZWQgPD0gZGF0YSk7CisKKyAgaWYgKGFsaWduZWQgIT0gZGF0YSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiJTRsZFx0JXA6ICIsIC0gKGxvbmcpKGRhdGEgLSBhbGlnbmVkKSwgYWxpZ25lZCk7CisgICAgICB3aGlsZSAoYWxpZ25lZCAhPSBkYXRhKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiAgICAiKTsKKyAgICAgICAgICArK2FsaWduZWQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgLyogbm93IHByaW50IHRoZSBieXRlcyAqLworICBpID0gMDsKKyAgd2hpbGUgKGkgPCBsZW4pCisgICAgeworICAgICAgaWYgKF9EQlVTX0FMSUdOX0FERFJFU1MgKCZkYXRhW2ldLCA0KSA9PSAmZGF0YVtpXSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIlNGRcdCVwOiAiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArIGksICZkYXRhW2ldKTsKKyAgICAgICAgfQorCisgICAgICBpZiAoZGF0YVtpXSA+PSAzMiAmJgorICAgICAgICAgIGRhdGFbaV0gPD0gMTI2KQorICAgICAgICBfZGJ1c192ZXJib3NlICgiICclYycgIiwgZGF0YVtpXSk7CisgICAgICBlbHNlCisgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIweCVzJXggIiwKKyAgICAgICAgICAgICAgICAgICAgICAgZGF0YVtpXSA8PSAweGYgPyAiMCIgOiAiIiwgZGF0YVtpXSk7CisKKyAgICAgICsraTsKKworICAgICAgaWYgKF9EQlVTX0FMSUdOX0FERFJFU1MgKCZkYXRhW2ldLCA0KSA9PSAmZGF0YVtpXSkKKyAgICAgICAgeworICAgICAgICAgIGlmIChpID4gMykKKyAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJCRTogJWQgTEU6ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3VucGFja191aW50MzIgKERCVVNfQklHX0VORElBTiwgJmRhdGFbaS00XSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c191bnBhY2tfdWludDMyIChEQlVTX0xJVFRMRV9FTkRJQU4sICZkYXRhW2ktNF0pKTsKKworICAgICAgICAgIGlmIChpID4gNyAmJgorICAgICAgICAgICAgICBfREJVU19BTElHTl9BRERSRVNTICgmZGF0YVtpXSwgOCkgPT0gJmRhdGFbaV0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgdTY0OiAweCUiIFBSSXg2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihkYnVzX3VpbnQ2NF90KikmZGF0YVtpLThdKTsKKyAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiBkYmw6ICVnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihkb3VibGUqKSZkYXRhW2ktOF0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIlxuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgX2RidXNfdmVyYm9zZSAoIlxuIik7Cit9CisKKy8qKgorICogRHVtcCB0aGUgZ2l2ZW4gcGFydCBvZiB0aGUgc3RyaW5nIHRvIHZlcmJvc2UgbG9nLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZworICogQHBhcmFtIHN0YXJ0IHRoZSBzdGFydCBvZiByYW5nZSB0byBkdW1wCisgKiBAcGFyYW0gbGVuIGxlbmd0aCBvZiByYW5nZQorICovCit2b2lkCitfZGJ1c192ZXJib3NlX2J5dGVzX29mX3N0cmluZyAoY29uc3QgREJ1c1N0cmluZyAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgIGxlbikKK3sKKyAgY29uc3QgY2hhciAqZDsKKyAgaW50IHJlYWxfbGVuOworCisgIHJlYWxfbGVuID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHN0cik7CisKKyAgX2RidXNfYXNzZXJ0IChzdGFydCA+PSAwKTsKKworICBpZiAoc3RhcnQgPiByZWFsX2xlbikKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiICBbJWQsJWQpIGlzIG5vdCBpbnNpZGUgc3RyaW5nIG9mIGxlbmd0aCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgIHN0YXJ0LCBsZW4sIHJlYWxfbGVuKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKChzdGFydCArIGxlbikgPiByZWFsX2xlbikKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiICBbJWQsJWQpIGV4dGVuZHMgb3V0c2lkZSBzdHJpbmcgb2YgbGVuZ3RoICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgc3RhcnQsIGxlbiwgcmVhbF9sZW4pOworICAgICAgbGVuID0gcmVhbF9sZW4gLSBzdGFydDsKKyAgICB9CisKKyAgZCA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YV9sZW4gKHN0ciwgc3RhcnQsIGxlbik7CisKKyAgX2RidXNfdmVyYm9zZV9ieXRlcyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgZCwgbGVuLCBzdGFydCk7Cit9CisKK3N0YXRpYyBpbnQKK21hcF90eXBlX2NoYXJfdG9fdHlwZSAoaW50IHQpCit7CisgIGlmICh0ID09IERCVVNfU1RSVUNUX0JFR0lOX0NIQVIpCisgICAgcmV0dXJuIERCVVNfVFlQRV9TVFJVQ1Q7CisgIGVsc2UgaWYgKHQgPT0gREJVU19ESUNUX0VOVFJZX0JFR0lOX0NIQVIpCisgICAgcmV0dXJuIERCVVNfVFlQRV9ESUNUX0VOVFJZOworICBlbHNlCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0ICh0ICE9IERCVVNfU1RSVUNUX0VORF9DSEFSKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAodCAhPSBEQlVTX0RJQ1RfRU5UUllfRU5EX0NIQVIpOworICAgICAgcmV0dXJuIHQ7CisgICAgfQorfQorCisvKioKKyAqIEdldCB0aGUgZmlyc3QgdHlwZSBpbiB0aGUgc2lnbmF0dXJlLiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMKKyAqIGFuZCBqdXN0IGdldHRpbmcgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIHNpZ25hdHVyZSBpcyB0aGF0IHlvdSB3b24ndAorICogZ2V0IERCVVNfU1RSVUNUX0JFR0lOX0NIQVIsIHlvdSdsbCBnZXQgREJVU19UWVBFX1NUUlVDVAorICogaW5zdGVhZC4KKyAqCisgKiBAcGFyYW0gc3RyIHN0cmluZyBjb250YWluaW5nIHNpZ25hdHVyZQorICogQHBhcmFtIHBvcyB3aGVyZSB0aGUgc2lnbmF0dXJlIHN0YXJ0cworICogQHJldHVybnMgdGhlIGZpcnN0IHR5cGUgaW4gdGhlIHNpZ25hdHVyZQorICovCitpbnQKK19kYnVzX2ZpcnN0X3R5cGVfaW5fc2lnbmF0dXJlIChjb25zdCBEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgcG9zKQoreworICByZXR1cm4gbWFwX3R5cGVfY2hhcl90b190eXBlIChfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKHN0ciwgcG9zKSk7Cit9CisKKy8qKgorICogU2ltaWxhciB0byAjX2RidXNfZmlyc3RfdHlwZV9pbl9zaWduYXR1cmUsIGJ1dCBvcGVyYXRlcworICogb24gYSBDIHN0cmluZyBidWZmZXIuCisgKgorICogQHBhcmFtIHN0ciBhIEMgc3RyaW5nIGJ1ZmZlcgorICogQHBhcmFtIHBvcyB3aGVyZSB0aGUgc2lnbmF0dXJlIHN0YXJ0cworICogQHJldHVybnMgdGhlIGZpcnN0IHR5cGUgaW4gdGhlIHNpZ25hdHVyZQorICovCitpbnQKK19kYnVzX2ZpcnN0X3R5cGVfaW5fc2lnbmF0dXJlX2Nfc3RyIChjb25zdCBjaGFyICAgICAgICpzdHIsCisJCQkJICAgICBpbnQgICAgICAgICAgICAgICBwb3MpCit7CisgIHJldHVybiBtYXBfdHlwZV9jaGFyX3RvX3R5cGUgKHN0cltwb3NdKTsKK30KKworLyoqIEB9ICovCisKKyNpZmRlZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworI2luY2x1ZGUgImRidXMtdGVzdC5oIgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKy8qKgorICogUmVhZHMgYSBibG9jayBvZiBmaXhlZC1sZW5ndGggYmFzaWMgdmFsdWVzLCBhcyBhbiBvcHRpbWl6YXRpb24KKyAqIHZzLiByZWFkaW5nIGVhY2ggb25lIGluZGl2aWR1YWxseSBpbnRvIGEgbmV3IGJ1ZmZlci4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGRhdGEgaW4tcGxhY2U7IGl0IGRvZXMgbm90IG1ha2UgYSBjb3B5LAorICogYW5kIGl0IGRvZXMgbm90IHN3YXAgdGhlIGJ5dGVzLgorICoKKyAqIElmIHlvdSBhc2sgZm9yICNEQlVTX1RZUEVfRE9VQkxFIHlvdSB3aWxsIGdldCBhICJjb25zdCBkb3VibGUqIiBiYWNrCisgKiBhbmQgdGhlICJ2YWx1ZSIgYXJndW1lbnQgc2hvdWxkIGJlIGEgImNvbnN0IGRvdWJsZSoqIiBhbmQgc28gb24uCisgKgorICogQHBhcmFtIHN0ciB0aGUgc3RyaW5nIHRvIHJlYWQgZnJvbQorICogQHBhcmFtIHBvcyBwb3NpdGlvbiB0byByZWFkIGZyb20KKyAqIEBwYXJhbSBlbGVtZW50X3R5cGUgdHlwZSBvZiBhcnJheSBlbGVtZW50cworICogQHBhcmFtIHZhbHVlIHBsYWNlIHRvIHJldHVybiB0aGUgYXJyYXkKKyAqIEBwYXJhbSBuX2VsZW1lbnRzIG51bWJlciBvZiBhcnJheSBlbGVtZW50cyB0byByZWFkCisgKiBAcGFyYW0gYnl0ZV9vcmRlciB0aGUgYnl0ZSBvcmRlciwgdXNlZCB0byByZWFkIHRoZSBhcnJheSBsZW5ndGgKKyAqIEBwYXJhbSBuZXdfcG9zICNOVUxMIG9yIGxvY2F0aW9uIHRvIHN0b3JlIGEgcG9zaXRpb24gYWZ0ZXIgdGhlIGVsZW1lbnRzCisgKi8KK3ZvaWQKK19kYnVzX21hcnNoYWxfcmVhZF9maXhlZF9tdWx0aSAgKGNvbnN0IERCdXNTdHJpbmcgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgbl9lbGVtZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICpuZXdfcG9zKQoreworICBpbnQgYXJyYXlfbGVuOworICBpbnQgYWxpZ25tZW50OworCisgIF9kYnVzX2Fzc2VydCAoZGJ1c190eXBlX2lzX2ZpeGVkIChlbGVtZW50X3R5cGUpKTsKKyAgX2RidXNfYXNzZXJ0IChkYnVzX3R5cGVfaXNfYmFzaWMgKGVsZW1lbnRfdHlwZSkpOworCisjaWYgMAorICBfZGJ1c192ZXJib3NlICgicmVhZGluZyAlZCBlbGVtZW50cyBvZiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgbl9lbGVtZW50cywgX2RidXNfdHlwZV90b19zdHJpbmcgKGVsZW1lbnRfdHlwZSkpOworI2VuZGlmCisgIAorICBhbGlnbm1lbnQgPSBfZGJ1c190eXBlX2dldF9hbGlnbm1lbnQgKGVsZW1lbnRfdHlwZSk7CisKKyAgcG9zID0gX0RCVVNfQUxJR05fVkFMVUUgKHBvcywgYWxpZ25tZW50KTsKKyAgCisgIGFycmF5X2xlbiA9IG5fZWxlbWVudHMgKiBhbGlnbm1lbnQ7CisKKyAgKihjb25zdCBEQnVzQmFzaWNWYWx1ZSoqKSB2YWx1ZSA9ICh2b2lkKikgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhX2xlbiAoc3RyLCBwb3MsIGFycmF5X2xlbik7CisgIGlmIChuZXdfcG9zKQorICAgICpuZXdfcG9zID0gcG9zICsgYXJyYXlfbGVuOworfQorCitzdGF0aWMgdm9pZAorc3dhcF90ZXN0X2FycmF5ICh2b2lkICphcnJheSwKKyAgICAgICAgICAgICAgICAgaW50ICAgbGVuX2J5dGVzLAorICAgICAgICAgICAgICAgICBpbnQgICBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICBpbnQgICBhbGlnbm1lbnQpCit7CisgIERCdXNTdHJpbmcgdDsKKworICBpZiAoYWxpZ25tZW50ID09IDEpCisgICAgcmV0dXJuOworICAKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3RfbGVuICgmdCwgYXJyYXksIGxlbl9ieXRlcyk7CisgIHN3YXBfYXJyYXkgKCZ0LCAwLCBsZW5fYnl0ZXMgLyBhbGlnbm1lbnQsIGJ5dGVfb3JkZXIsIGFsaWdubWVudCk7Cit9CisKKyNkZWZpbmUgTUFSU0hBTF9CQVNJQyh0eXBlbmFtZSwgYnl0ZV9vcmRlciwgbGl0ZXJhbCkgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgdl8jI3R5cGVuYW1lID0gbGl0ZXJhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgaWYgKCFfZGJ1c19tYXJzaGFsX3dyaXRlX2Jhc2ljICgmc3RyLCBwb3MsIERCVVNfVFlQRV8jI3R5cGVuYW1lLCAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2XyMjdHlwZW5hbWUsICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIsIE5VTEwpKSAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkiKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgREVNQVJTSEFMX0JBU0lDKHR5cGVuYW1lLCBieXRlX29yZGVyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX2RidXNfbWFyc2hhbF9yZWFkX2Jhc2ljICgmc3RyLCBwb3MsIERCVVNfVFlQRV8jI3R5cGVuYW1lLCAmdl8jI3R5cGVuYW1lLCAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIsICZwb3MpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIERFTUFSU0hBTF9CQVNJQ19BTkRfQ0hFQ0sodHlwZW5hbWUsIGJ5dGVfb3JkZXIsIGxpdGVyYWwpICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBERU1BUlNIQUxfQkFTSUMgKHR5cGVuYW1lLCBieXRlX29yZGVyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGxpdGVyYWwgIT0gdl8jI3R5cGVuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgX2RidXNfdmVyYm9zZV9ieXRlc19vZl9zdHJpbmcgKCZzdHIsIGR1bXBfcG9zLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpIC0gZHVtcF9wb3MpOyAgICAgICAgXAorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJkZW1hcnNoYWxlZCB3cm9uZyB2YWx1ZSIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgTUFSU0hBTF9URVNUKHR5cGVuYW1lLCBieXRlX29yZGVyLCBsaXRlcmFsKSAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE1BUlNIQUxfQkFTSUMgKHR5cGVuYW1lLCBieXRlX29yZGVyLCBsaXRlcmFsKTsgICAgICAgICAgICAgIFwKKyAgICBkdW1wX3BvcyA9IHBvczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgREVNQVJTSEFMX0JBU0lDX0FORF9DSEVDSyAodHlwZW5hbWUsIGJ5dGVfb3JkZXIsIGxpdGVyYWwpOyAgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIE1BUlNIQUxfVEVTVF9TVFJDTVAodHlwZW5hbWUsIGJ5dGVfb3JkZXIsIGxpdGVyYWwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNQVJTSEFMX0JBU0lDICh0eXBlbmFtZSwgYnl0ZV9vcmRlciwgbGl0ZXJhbCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZHVtcF9wb3MgPSBwb3M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIERFTUFSU0hBTF9CQVNJQyAodHlwZW5hbWUsIGJ5dGVfb3JkZXIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoc3RyY21wIChsaXRlcmFsLCB2XyMjdHlwZW5hbWUpICE9IDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBfZGJ1c192ZXJib3NlX2J5dGVzX29mX3N0cmluZyAoJnN0ciwgZHVtcF9wb3MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSAtIGR1bXBfcG9zKTsgICAgICBcCisgICAgICAgIF9kYnVzX3dhcm4gKCJsaXRlcmFsICclcydcbnZhbHVlICAnJXMnIiwgbGl0ZXJhbCwgdl8jI3R5cGVuYW1lKTsgICAgICAgICAgICAgIFwKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZGVtYXJzaGFsZWQgd3JvbmcgdmFsdWUiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIE1BUlNIQUxfRklYRURfQVJSQVkodHlwZW5hbWUsIGJ5dGVfb3JkZXIsIGxpdGVyYWwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIGludCBuZXh0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIHZfVUlOVDMyID0gc2l6ZW9mKGxpdGVyYWwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIGlmICghX2RidXNfbWFyc2hhbF93cml0ZV9iYXNpYyAoJnN0ciwgcG9zLCBEQlVTX1RZUEVfVUlOVDMyLCAmdl9VSU5UMzIsICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwgJm5leHQpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5Iik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIHZfQVJSQVlfIyN0eXBlbmFtZSA9IGxpdGVyYWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIGlmICghX2RidXNfbWFyc2hhbF93cml0ZV9maXhlZF9tdWx0aSAoJnN0ciwgbmV4dCwgREJVU19UWVBFXyMjdHlwZW5hbWUsICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZfQVJSQVlfIyN0eXBlbmFtZSwgX0RCVVNfTl9FTEVNRU5UUyhsaXRlcmFsKSwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwgTlVMTCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5Iik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICB9IHdoaWxlICgwKQorCisjZGVmaW5lIERFTUFSU0hBTF9GSVhFRF9BUlJBWSh0eXBlbmFtZSwgYnl0ZV9vcmRlcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IG5leHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYWxpZ25tZW50ID0gX2RidXNfdHlwZV9nZXRfYWxpZ25tZW50IChEQlVTX1RZUEVfIyN0eXBlbmFtZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdl9VSU5UMzIgPSBfZGJ1c19tYXJzaGFsX3JlYWRfdWludDMyICgmc3RyLCBkdW1wX3BvcywgYnl0ZV9vcmRlciwgJm5leHQpOyAgICAgICAgICAgICAgICAgICBcCisgICAgX2RidXNfbWFyc2hhbF9yZWFkX2ZpeGVkX211bHRpICgmc3RyLCBuZXh0LCBEQlVTX1RZUEVfIyN0eXBlbmFtZSwgJnZfQVJSQVlfIyN0eXBlbmFtZSwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1VJTlQzMi9hbGlnbm1lbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlX29yZGVyLCBOVUxMKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3dhcF90ZXN0X2FycmF5ICh2X0FSUkFZXyMjdHlwZW5hbWUsIHZfVUlOVDMyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICBieXRlX29yZGVyLCBhbGlnbm1lbnQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgREVNQVJTSEFMX0ZJWEVEX0FSUkFZX0FORF9DSEVDSyh0eXBlbmFtZSwgYnl0ZV9vcmRlciwgbGl0ZXJhbCkgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIERFTUFSU0hBTF9GSVhFRF9BUlJBWSAodHlwZW5hbWUsIGJ5dGVfb3JkZXIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAobWVtY21wIChsaXRlcmFsLCB2X0FSUkFZXyMjdHlwZW5hbWUsIHNpemVvZiAobGl0ZXJhbCkpICE9IDApICAgICAgICAgICAgICAgICAgICBcCisgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBfZGJ1c192ZXJib3NlICgiTUFSU0hBTEVEIERBVEFcbiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgX2RidXNfdmVyYm9zZV9ieXRlc19vZl9zdHJpbmcgKCZzdHIsIGR1bXBfcG9zLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSAtIGR1bXBfcG9zKTsgICAgICAgXAorICAgICAgICBfZGJ1c192ZXJib3NlICgiTElURVJBTCBEQVRBXG4iKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgX2RidXNfdmVyYm9zZV9ieXRlcyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgbGl0ZXJhbCwgc2l6ZW9mIChsaXRlcmFsKSwgMCk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgX2RidXNfdmVyYm9zZSAoIlJFQUQgREFUQVxuIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIF9kYnVzX3ZlcmJvc2VfYnl0ZXMgKChjb25zdCB1bnNpZ25lZCBjaGFyICopIHZfQVJSQVlfIyN0eXBlbmFtZSwgc2l6ZW9mIChsaXRlcmFsKSwgMCk7ICAgICAgICAgICBcCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImRlbWFyc2hhbGVkIHdyb25nIGZpeGVkIGFycmF5IHZhbHVlIik7ICAgICAgICAgICAgICAgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBNQVJTSEFMX1RFU1RfRklYRURfQVJSQVkodHlwZW5hbWUsIGJ5dGVfb3JkZXIsIGxpdGVyYWwpICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE1BUlNIQUxfRklYRURfQVJSQVkgKHR5cGVuYW1lLCBieXRlX29yZGVyLCBsaXRlcmFsKTsgICAgICAgICAgICAgICAgXAorICAgIGR1bXBfcG9zID0gcG9zOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIERFTUFSU0hBTF9GSVhFRF9BUlJBWV9BTkRfQ0hFQ0sgKHR5cGVuYW1lLCBieXRlX29yZGVyLCBsaXRlcmFsKTsgICAgXAorICB9IHdoaWxlICgwKQorCitkYnVzX2Jvb2xfdAorX2RidXNfbWFyc2hhbF90ZXN0ICh2b2lkKQoreworICBpbnQgYWxpZ25tZW50OworICBEQnVzU3RyaW5nIHN0cjsKKyAgaW50IHBvcywgZHVtcF9wb3M7CisgIHVuc2lnbmVkIGNoYXIgYXJyYXkxWzVdID0geyAzLCA0LCAwLCAxLCA5IH07CisgIGRidXNfaW50MTZfdCBhcnJheTJbM10gPSB7IDEyNCwgNDU3LCA3ODAgfTsKKyAgZGJ1c191aW50MTZfdCBhcnJheTJ1WzNdID0geyAxMjQsIDQ1NywgNzgwIH07CisgIGRidXNfaW50MzJfdCBhcnJheTRbM10gPSB7IDEyMywgNDU2LCA3ODkgfTsKKyAgZGJ1c191aW50MzJfdCBhcnJheTR1WzNdID0geyAxMjMsIDQ1NiwgNzg5IH07CisgIGRidXNfaW50NjRfdCBhcnJheThbM10gPSB7IERCVVNfSU5UNjRfQ09OU1RBTlQgKDB4MTIzZmZmZmZmZmYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0lOVDY0X0NPTlNUQU5UICgweDQ1NmZmZmZmZmZmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19JTlQ2NF9DT05TVEFOVCAoMHg3ODlmZmZmZmZmZikgfTsKKyAgZGJ1c19pbnQ2NF90ICp2X0FSUkFZX0lOVDY0OworICB1bnNpZ25lZCBjaGFyICp2X0FSUkFZX0JZVEU7CisgIGRidXNfaW50MTZfdCAqdl9BUlJBWV9JTlQxNjsKKyAgZGJ1c191aW50MTZfdCAqdl9BUlJBWV9VSU5UMTY7CisgIGRidXNfaW50MzJfdCAqdl9BUlJBWV9JTlQzMjsKKyAgZGJ1c191aW50MzJfdCAqdl9BUlJBWV9VSU5UMzI7CisgIERCdXNTdHJpbmcgdDsKKyAgZG91YmxlIHZfRE9VQkxFOworICBkb3VibGUgdF9ET1VCTEU7CisgIGRidXNfaW50MTZfdCB2X0lOVDE2OworICBkYnVzX3VpbnQxNl90IHZfVUlOVDE2OworICBkYnVzX2ludDMyX3Qgdl9JTlQzMjsKKyAgZGJ1c191aW50MzJfdCB2X1VJTlQzMjsKKyAgZGJ1c19pbnQ2NF90IHZfSU5UNjQ7CisgIGRidXNfdWludDY0X3Qgdl9VSU5UNjQ7CisgIHVuc2lnbmVkIGNoYXIgdl9CWVRFOworICBkYnVzX2Jvb2xfdCB2X0JPT0xFQU47CisgIGNvbnN0IGNoYXIgKnZfU1RSSU5HOworICBjb25zdCBjaGFyICp2X1NJR05BVFVSRTsKKyAgY29uc3QgY2hhciAqdl9PQkpFQ1RfUEFUSDsKKyAgaW50IGJ5dGVfb3JkZXI7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnN0cikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZmFpbGVkIHRvIGluaXQgc3RyaW5nIik7CisKKyAgcG9zID0gMDsKKworICAvKiBNYXJzaGFsIGRvdWJsZXMgKi8KKyAgTUFSU0hBTF9CQVNJQyAoRE9VQkxFLCBEQlVTX0JJR19FTkRJQU4sIDMuMTQpOworICBERU1BUlNIQUxfQkFTSUMgKERPVUJMRSwgREJVU19CSUdfRU5ESUFOKTsKKyAgdF9ET1VCTEUgPSAzLjE0OworICBpZiAoIV9EQlVTX0RPVUJMRVNfQklUV0lTRV9FUVVBTCAodF9ET1VCTEUsIHZfRE9VQkxFKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJnb3Qgd3JvbmcgZG91YmxlIHZhbHVlIik7CisKKyAgTUFSU0hBTF9CQVNJQyAoRE9VQkxFLCBEQlVTX0xJVFRMRV9FTkRJQU4sIDMuMTQpOworICBERU1BUlNIQUxfQkFTSUMgKERPVUJMRSwgREJVU19MSVRUTEVfRU5ESUFOKTsKKyAgdF9ET1VCTEUgPSAzLjE0OworICBpZiAoIV9EQlVTX0RPVUJMRVNfQklUV0lTRV9FUVVBTCAodF9ET1VCTEUsIHZfRE9VQkxFKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJnb3Qgd3JvbmcgZG91YmxlIHZhbHVlIik7CisKKyAgLyogTWFyc2hhbCBzaWduZWQgMTYgaW50ZWdlcnMgKi8KKyAgTUFSU0hBTF9URVNUIChJTlQxNiwgREJVU19CSUdfRU5ESUFOLCAtMTIzNDUpOworICBNQVJTSEFMX1RFU1QgKElOVDE2LCBEQlVTX0xJVFRMRV9FTkRJQU4sIC0xMjM0NSk7CisKKyAgLyogTWFyc2hhbCB1bnNpZ25lZCAxNiBpbnRlZ2VycyAqLworICBNQVJTSEFMX1RFU1QgKFVJTlQxNiwgREJVU19CSUdfRU5ESUFOLCAweDEyMzQpOworICBNQVJTSEFMX1RFU1QgKFVJTlQxNiwgREJVU19MSVRUTEVfRU5ESUFOLCAweDEyMzQpOworICAKKyAgLyogTWFyc2hhbCBzaWduZWQgaW50ZWdlcnMgKi8KKyAgTUFSU0hBTF9URVNUIChJTlQzMiwgREJVU19CSUdfRU5ESUFOLCAtMTIzNDU2NzgpOworICBNQVJTSEFMX1RFU1QgKElOVDMyLCBEQlVTX0xJVFRMRV9FTkRJQU4sIC0xMjM0NTY3OCk7CisKKyAgLyogTWFyc2hhbCB1bnNpZ25lZCBpbnRlZ2VycyAqLworICBNQVJTSEFMX1RFU1QgKFVJTlQzMiwgREJVU19CSUdfRU5ESUFOLCAweDEyMzQ1Njc4KTsKKyAgTUFSU0hBTF9URVNUIChVSU5UMzIsIERCVVNfTElUVExFX0VORElBTiwgMHgxMjM0NTY3OCk7CisKKyAgLyogTWFyc2hhbCBzaWduZWQgaW50ZWdlcnMgKi8KKyAgTUFSU0hBTF9URVNUIChJTlQ2NCwgREJVU19CSUdfRU5ESUFOLCBEQlVTX0lOVDY0X0NPTlNUQU5UICgtMHgxMjM0NTY3ODlhYmM3KSk7CisgIE1BUlNIQUxfVEVTVCAoSU5UNjQsIERCVVNfTElUVExFX0VORElBTiwgREJVU19JTlQ2NF9DT05TVEFOVCAoLTB4MTIzNDU2Nzg5YWJjNykpOworCisgIC8qIE1hcnNoYWwgdW5zaWduZWQgaW50ZWdlcnMgKi8KKyAgTUFSU0hBTF9URVNUIChVSU5UNjQsIERCVVNfQklHX0VORElBTiwgREJVU19VSU5UNjRfQ09OU1RBTlQgKDB4MTIzNDU2Nzg5YWJjNykpOworICBNQVJTSEFMX1RFU1QgKFVJTlQ2NCwgREJVU19MSVRUTEVfRU5ESUFOLCBEQlVTX1VJTlQ2NF9DT05TVEFOVCAoMHgxMjM0NTY3ODlhYmM3KSk7CisKKyAgLyogTWFyc2hhbCBieXRlICovCisgIE1BUlNIQUxfVEVTVCAoQllURSwgREJVU19CSUdfRU5ESUFOLCA1KTsKKyAgTUFSU0hBTF9URVNUIChCWVRFLCBEQlVTX0xJVFRMRV9FTkRJQU4sIDUpOworCisgIC8qIE1hcnNoYWwgYWxsIHBvc3NpYmxlIGJvb2xzISAqLworICBNQVJTSEFMX1RFU1QgKEJPT0xFQU4sIERCVVNfQklHX0VORElBTiwgRkFMU0UpOworICBNQVJTSEFMX1RFU1QgKEJPT0xFQU4sIERCVVNfTElUVExFX0VORElBTiwgRkFMU0UpOworICBNQVJTSEFMX1RFU1QgKEJPT0xFQU4sIERCVVNfQklHX0VORElBTiwgVFJVRSk7CisgIE1BUlNIQUxfVEVTVCAoQk9PTEVBTiwgREJVU19MSVRUTEVfRU5ESUFOLCBUUlVFKTsKKworICAvKiBNYXJzaGFsIHN0cmluZ3MgKi8KKyAgTUFSU0hBTF9URVNUX1NUUkNNUCAoU1RSSU5HLCBEQlVTX0JJR19FTkRJQU4sICIiKTsKKyAgTUFSU0hBTF9URVNUX1NUUkNNUCAoU1RSSU5HLCBEQlVTX0xJVFRMRV9FTkRJQU4sICIiKTsKKyAgTUFSU0hBTF9URVNUX1NUUkNNUCAoU1RSSU5HLCBEQlVTX0JJR19FTkRJQU4sICJUaGlzIGlzIHRoZSBkYnVzIHRlc3Qgc3RyaW5nIik7CisgIE1BUlNIQUxfVEVTVF9TVFJDTVAgKFNUUklORywgREJVU19MSVRUTEVfRU5ESUFOLCAiVGhpcyBpcyB0aGUgZGJ1cyB0ZXN0IHN0cmluZyIpOworCisgIC8qIG9iamVjdCBwYXRocyAqLworICBNQVJTSEFMX1RFU1RfU1RSQ01QIChPQkpFQ1RfUEFUSCwgREJVU19CSUdfRU5ESUFOLCAiL2EvYi9jIik7CisgIE1BUlNIQUxfVEVTVF9TVFJDTVAgKE9CSkVDVF9QQVRILCBEQlVTX0xJVFRMRV9FTkRJQU4sICIvYS9iL2MiKTsKKworICAvKiBzaWduYXR1cmVzICovCisgIE1BUlNIQUxfVEVTVF9TVFJDTVAgKFNJR05BVFVSRSwgREJVU19CSUdfRU5ESUFOLCAiIik7CisgIE1BUlNIQUxfVEVTVF9TVFJDTVAgKFNJR05BVFVSRSwgREJVU19MSVRUTEVfRU5ESUFOLCAiIik7CisgIE1BUlNIQUxfVEVTVF9TVFJDTVAgKFNJR05BVFVSRSwgREJVU19CSUdfRU5ESUFOLCAiYShpaSkiKTsKKyAgTUFSU0hBTF9URVNUX1NUUkNNUCAoU0lHTkFUVVJFLCBEQlVTX0xJVFRMRV9FTkRJQU4sICJhKGlpKSIpOworCisgIC8qIEFycmF5cyAqLworICBNQVJTSEFMX1RFU1RfRklYRURfQVJSQVkgKElOVDE2LCBEQlVTX0JJR19FTkRJQU4sIGFycmF5Mik7CisgIE1BUlNIQUxfVEVTVF9GSVhFRF9BUlJBWSAoSU5UMTYsIERCVVNfTElUVExFX0VORElBTiwgYXJyYXkyKTsKKyAgTUFSU0hBTF9URVNUX0ZJWEVEX0FSUkFZIChVSU5UMTYsIERCVVNfQklHX0VORElBTiwgYXJyYXkydSk7CisgIE1BUlNIQUxfVEVTVF9GSVhFRF9BUlJBWSAoVUlOVDE2LCBEQlVTX0xJVFRMRV9FTkRJQU4sIGFycmF5MnUpOworICAKKyAgTUFSU0hBTF9URVNUX0ZJWEVEX0FSUkFZIChJTlQzMiwgREJVU19CSUdfRU5ESUFOLCBhcnJheTQpOworICBNQVJTSEFMX1RFU1RfRklYRURfQVJSQVkgKElOVDMyLCBEQlVTX0xJVFRMRV9FTkRJQU4sIGFycmF5NCk7CisgIE1BUlNIQUxfVEVTVF9GSVhFRF9BUlJBWSAoVUlOVDMyLCBEQlVTX0JJR19FTkRJQU4sIGFycmF5NHUpOworICBNQVJTSEFMX1RFU1RfRklYRURfQVJSQVkgKFVJTlQzMiwgREJVU19MSVRUTEVfRU5ESUFOLCBhcnJheTR1KTsKKworICBNQVJTSEFMX1RFU1RfRklYRURfQVJSQVkgKEJZVEUsIERCVVNfQklHX0VORElBTiwgYXJyYXkxKTsKKyAgTUFSU0hBTF9URVNUX0ZJWEVEX0FSUkFZIChCWVRFLCBEQlVTX0xJVFRMRV9FTkRJQU4sIGFycmF5MSk7CisgIAorICBNQVJTSEFMX1RFU1RfRklYRURfQVJSQVkgKElOVDY0LCBEQlVTX0JJR19FTkRJQU4sIGFycmF5OCk7CisgIE1BUlNIQUxfVEVTVF9GSVhFRF9BUlJBWSAoSU5UNjQsIERCVVNfTElUVExFX0VORElBTiwgYXJyYXk4KTsKKworI2lmIDAKKworICAvKgorICAgKiBGSVhNRSByZXN0b3JlIHRoZSBzZXQvcGFjayB0ZXN0cworICAgKi8KKworICAvKiBzZXQvcGFjayA2NC1iaXQgaW50ZWdlcnMgKi8KKyAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKCZzdHIsIDgpOworCisgIC8qIHNpZ25lZCBsaXR0bGUgKi8KKyAgX2RidXNfbWFyc2hhbF9zZXRfaW50NjQgKCZzdHIsIERCVVNfTElUVExFX0VORElBTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIERCVVNfSU5UNjRfQ09OU1RBTlQgKC0weDEyMzQ1Njc4OWFiYzcpKTsKKworICBfZGJ1c19hc3NlcnQgKERCVVNfSU5UNjRfQ09OU1RBTlQgKC0weDEyMzQ1Njc4OWFiYzcpID09CisgICAgICAgICAgICAgICAgX2RidXNfdW5wYWNrX2ludDY0IChEQlVTX0xJVFRMRV9FTkRJQU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZzdHIpKSk7CisKKyAgLyogc2lnbmVkIGJpZyAqLworICBfZGJ1c19tYXJzaGFsX3NldF9pbnQ2NCAoJnN0ciwgREJVU19CSUdfRU5ESUFOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgREJVU19JTlQ2NF9DT05TVEFOVCAoLTB4MTIzNDU2Nzg5YWJjNykpOworCisgIF9kYnVzX2Fzc2VydCAoREJVU19JTlQ2NF9DT05TVEFOVCAoLTB4MTIzNDU2Nzg5YWJjNykgPT0KKyAgICAgICAgICAgICAgICBfZGJ1c191bnBhY2tfaW50NjQgKERCVVNfQklHX0VORElBTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJnN0cikpKTsKKworICAvKiBzaWduZWQgbGl0dGxlIHBhY2sgKi8KKyAgX2RidXNfcGFja19pbnQ2NCAoREJVU19JTlQ2NF9DT05TVEFOVCAoLTB4MTIzNDU2Nzg5YWJjNyksCisgICAgICAgICAgICAgICAgICAgIERCVVNfTElUVExFX0VORElBTiwKKyAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9kYXRhICgmc3RyKSk7CisKKyAgX2RidXNfYXNzZXJ0IChEQlVTX0lOVDY0X0NPTlNUQU5UICgtMHgxMjM0NTY3ODlhYmM3KSA9PQorICAgICAgICAgICAgICAgIF9kYnVzX3VucGFja19pbnQ2NCAoREJVU19MSVRUTEVfRU5ESUFOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmc3RyKSkpOworCisgIC8qIHNpZ25lZCBiaWcgcGFjayAqLworICBfZGJ1c19wYWNrX2ludDY0IChEQlVTX0lOVDY0X0NPTlNUQU5UICgtMHgxMjM0NTY3ODlhYmM3KSwKKyAgICAgICAgICAgICAgICAgICAgREJVU19CSUdfRU5ESUFOLAorICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2RhdGEgKCZzdHIpKTsKKworICBfZGJ1c19hc3NlcnQgKERCVVNfSU5UNjRfQ09OU1RBTlQgKC0weDEyMzQ1Njc4OWFiYzcpID09CisgICAgICAgICAgICAgICAgX2RidXNfdW5wYWNrX2ludDY0IChEQlVTX0JJR19FTkRJQU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZzdHIpKSk7CisKKyAgLyogdW5zaWduZWQgbGl0dGxlICovCisgIF9kYnVzX21hcnNoYWxfc2V0X3VpbnQ2NCAoJnN0ciwgREJVU19MSVRUTEVfRU5ESUFOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIERCVVNfVUlOVDY0X0NPTlNUQU5UICgweDEyMzQ1Njc4OWFiYzcpKTsKKworICBfZGJ1c19hc3NlcnQgKERCVVNfVUlOVDY0X0NPTlNUQU5UICgweDEyMzQ1Njc4OWFiYzcpID09CisgICAgICAgICAgICAgICAgX2RidXNfdW5wYWNrX3VpbnQ2NCAoREJVU19MSVRUTEVfRU5ESUFOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJnN0cikpKTsKKworICAvKiB1bnNpZ25lZCBiaWcgKi8KKyAgX2RidXNfbWFyc2hhbF9zZXRfdWludDY0ICgmc3RyLCBEQlVTX0JJR19FTkRJQU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgREJVU19VSU5UNjRfQ09OU1RBTlQgKDB4MTIzNDU2Nzg5YWJjNykpOworCisgIF9kYnVzX2Fzc2VydCAoREJVU19VSU5UNjRfQ09OU1RBTlQgKDB4MTIzNDU2Nzg5YWJjNykgPT0KKyAgICAgICAgICAgICAgICBfZGJ1c191bnBhY2tfdWludDY0IChEQlVTX0JJR19FTkRJQU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmc3RyKSkpOworCisgIC8qIHVuc2lnbmVkIGxpdHRsZSBwYWNrICovCisgIF9kYnVzX3BhY2tfdWludDY0IChEQlVTX1VJTlQ2NF9DT05TVEFOVCAoMHgxMjM0NTY3ODlhYmM3KSwKKyAgICAgICAgICAgICAgICAgICAgIERCVVNfTElUVExFX0VORElBTiwKKyAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfZGF0YSAoJnN0cikpOworCisgIF9kYnVzX2Fzc2VydCAoREJVU19VSU5UNjRfQ09OU1RBTlQgKDB4MTIzNDU2Nzg5YWJjNykgPT0KKyAgICAgICAgICAgICAgICBfZGJ1c191bnBhY2tfdWludDY0IChEQlVTX0xJVFRMRV9FTkRJQU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmc3RyKSkpOworCisgIC8qIHVuc2lnbmVkIGJpZyBwYWNrICovCisgIF9kYnVzX3BhY2tfdWludDY0IChEQlVTX1VJTlQ2NF9DT05TVEFOVCAoMHgxMjM0NTY3ODlhYmM3KSwKKyAgICAgICAgICAgICAgICAgICAgIERCVVNfQklHX0VORElBTiwKKyAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfZGF0YSAoJnN0cikpOworCisgIF9kYnVzX2Fzc2VydCAoREJVU19VSU5UNjRfQ09OU1RBTlQgKDB4MTIzNDU2Nzg5YWJjNykgPT0KKyAgICAgICAgICAgICAgICBfZGJ1c191bnBhY2tfdWludDY0IChEQlVTX0JJR19FTkRJQU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmc3RyKSkpOworCisgIC8qIHNldC9wYWNrIDMyLWJpdCBpbnRlZ2VycyAqLworICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoJnN0ciwgNCk7CisKKyAgLyogc2lnbmVkIGxpdHRsZSAqLworICBfZGJ1c19tYXJzaGFsX3NldF9pbnQzMiAoJnN0ciwgREJVU19MSVRUTEVfRU5ESUFOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLTB4MTIzNDU2KTsKKworICBfZGJ1c19hc3NlcnQgKC0weDEyMzQ1NiA9PQorICAgICAgICAgICAgICAgIF9kYnVzX3VucGFja19pbnQzMiAoREJVU19MSVRUTEVfRU5ESUFOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmc3RyKSkpOworCisgIC8qIHNpZ25lZCBiaWcgKi8KKyAgX2RidXNfbWFyc2hhbF9zZXRfaW50MzIgKCZzdHIsIERCVVNfQklHX0VORElBTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC0weDEyMzQ1Nik7CisKKyAgX2RidXNfYXNzZXJ0ICgtMHgxMjM0NTYgPT0KKyAgICAgICAgICAgICAgICBfZGJ1c191bnBhY2tfaW50MzIgKERCVVNfQklHX0VORElBTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJnN0cikpKTsKKworICAvKiBzaWduZWQgbGl0dGxlIHBhY2sgKi8KKyAgX2RidXNfcGFja19pbnQzMiAoLTB4MTIzNDU2LAorICAgICAgICAgICAgICAgICAgICBEQlVTX0xJVFRMRV9FTkRJQU4sCisgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfZGF0YSAoJnN0cikpOworCisgIF9kYnVzX2Fzc2VydCAoLTB4MTIzNDU2ID09CisgICAgICAgICAgICAgICAgX2RidXNfdW5wYWNrX2ludDMyIChEQlVTX0xJVFRMRV9FTkRJQU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZzdHIpKSk7CisKKyAgLyogc2lnbmVkIGJpZyBwYWNrICovCisgIF9kYnVzX3BhY2tfaW50MzIgKC0weDEyMzQ1NiwKKyAgICAgICAgICAgICAgICAgICAgREJVU19CSUdfRU5ESUFOLAorICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2RhdGEgKCZzdHIpKTsKKworICBfZGJ1c19hc3NlcnQgKC0weDEyMzQ1NiA9PQorICAgICAgICAgICAgICAgIF9kYnVzX3VucGFja19pbnQzMiAoREJVU19CSUdfRU5ESUFOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmc3RyKSkpOworCisgIC8qIHVuc2lnbmVkIGxpdHRsZSAqLworICBfZGJ1c19tYXJzaGFsX3NldF91aW50MzIgKCZzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMHgxMjM0NTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19MSVRUTEVfRU5ESUFOKTsKKworICBfZGJ1c19hc3NlcnQgKDB4MTIzNDU2ID09CisgICAgICAgICAgICAgICAgX2RidXNfdW5wYWNrX3VpbnQzMiAoREJVU19MSVRUTEVfRU5ESUFOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJnN0cikpKTsKKworICAvKiB1bnNpZ25lZCBiaWcgKi8KKyAgX2RidXNfbWFyc2hhbF9zZXRfdWludDMyICgmc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDB4MTIzNDU2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfQklHX0VORElBTik7CisKKyAgX2RidXNfYXNzZXJ0ICgweDEyMzQ1NiA9PQorICAgICAgICAgICAgICAgIF9kYnVzX3VucGFja191aW50MzIgKERCVVNfQklHX0VORElBTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZzdHIpKSk7CisKKyAgLyogdW5zaWduZWQgbGl0dGxlIHBhY2sgKi8KKyAgX2RidXNfcGFja191aW50MzIgKDB4MTIzNDU2LAorICAgICAgICAgICAgICAgICAgICAgREJVU19MSVRUTEVfRU5ESUFOLAorICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9kYXRhICgmc3RyKSk7CisKKyAgX2RidXNfYXNzZXJ0ICgweDEyMzQ1NiA9PQorICAgICAgICAgICAgICAgIF9kYnVzX3VucGFja191aW50MzIgKERCVVNfTElUVExFX0VORElBTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZzdHIpKSk7CisKKyAgLyogdW5zaWduZWQgYmlnIHBhY2sgKi8KKyAgX2RidXNfcGFja191aW50MzIgKDB4MTIzNDU2LAorICAgICAgICAgICAgICAgICAgICAgREJVU19CSUdfRU5ESUFOLAorICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9kYXRhICgmc3RyKSk7CisKKyAgX2RidXNfYXNzZXJ0ICgweDEyMzQ1NiA9PQorICAgICAgICAgICAgICAgIF9kYnVzX3VucGFja191aW50MzIgKERCVVNfQklHX0VORElBTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZzdHIpKSk7CisKKyNlbmRpZiAvKiBzZXQvcGFjayB0ZXN0cyBmb3IgaW50ZWdlcnMgKi8KKworICAvKiBTdHJpbmdzIGluLXBsYWNlIHNldCAqLworICBieXRlX29yZGVyID0gREJVU19MSVRUTEVfRU5ESUFOOworICB3aGlsZSAoVFJVRSkKKyAgICB7CisgICAgICAvKiBJbml0IGEgc3RyaW5nICovCisgICAgICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoJnN0ciwgMCk7CisKKyAgICAgIC8qIHJlc2V0IHBvcyBmb3IgdGhlIG1hY3JvcyAqLworICAgICAgcG9zID0gMDsKKworICAgICAgTUFSU0hBTF9URVNUX1NUUkNNUCAoU1RSSU5HLCBieXRlX29yZGVyLCAiSGVsbG8gd29ybGQiKTsKKworICAgICAgLyogU2V0IGl0IHRvIHNvbWV0aGluZyBsb25nZXIgKi8KKyAgICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmdCwgIkhlbGxvIHdvcmxkIGZvbyIpOworCisgICAgICB2X1NUUklORyA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJnQpOworICAgICAgX2RidXNfbWFyc2hhbF9zZXRfYmFzaWMgKCZzdHIsIDAsIERCVVNfVFlQRV9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZfU1RSSU5HLCBieXRlX29yZGVyLCBOVUxMLCBOVUxMKTsKKworICAgICAgX2RidXNfbWFyc2hhbF9yZWFkX2Jhc2ljICgmc3RyLCAwLCBEQlVTX1RZUEVfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdl9TVFJJTkcsIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgX2RidXNfYXNzZXJ0IChzdHJjbXAgKHZfU1RSSU5HLCAiSGVsbG8gd29ybGQgZm9vIikgPT0gMCk7CisKKyAgICAgIC8qIFNldCBpdCB0byBzb21ldGhpbmcgc2hvcnRlciAqLworICAgICAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZ0LCAiSGVsbG8iKTsKKworICAgICAgdl9TVFJJTkcgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZ0KTsKKyAgICAgIF9kYnVzX21hcnNoYWxfc2V0X2Jhc2ljICgmc3RyLCAwLCBEQlVTX1RZUEVfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2X1NUUklORywgYnl0ZV9vcmRlciwgTlVMTCwgTlVMTCk7CisgICAgICBfZGJ1c19tYXJzaGFsX3JlYWRfYmFzaWMgKCZzdHIsIDAsIERCVVNfVFlQRV9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2X1NUUklORywgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICBfZGJ1c19hc3NlcnQgKHN0cmNtcCAodl9TVFJJTkcsICJIZWxsbyIpID09IDApOworCisgICAgICAvKiBEbyB0aGUgb3RoZXIgYnl0ZSBvcmRlciAqLworICAgICAgaWYgKGJ5dGVfb3JkZXIgPT0gREJVU19MSVRUTEVfRU5ESUFOKQorICAgICAgICBieXRlX29yZGVyID0gREJVU19CSUdfRU5ESUFOOworICAgICAgZWxzZQorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgLyogQ2xlYW4gdXAgKi8KKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZzdHIpOworCisgIHJldHVybiBUUlVFOworfQorCisjZW5kaWYgLyogREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMgKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1tYXJzaGFsLWJhc2ljLmggYi9kYnVzL2RidXMtbWFyc2hhbC1iYXNpYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjNGU0MTEKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtbWFyc2hhbC1iYXNpYy5oCkBAIC0wLDAgKzEsMjMxIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtbWFyc2hhbC1iYXNpYy5oICBNYXJzaGFsbGluZyByb3V0aW5lcyBmb3IgYmFzaWMgKHByaW1pdGl2ZSkgdHlwZXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgIENvZGVGYWN0b3J5IEFCCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUgIFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpZm5kZWYgREJVU19NQVJTSEFMX0JBU0lDX0gKKyNkZWZpbmUgREJVU19NQVJTSEFMX0JBU0lDX0gKKworI2lmZGVmIEhBVkVfQllURVNXQVBfSAorI2luY2x1ZGUgPGJ5dGVzd2FwLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGRidXMvZGJ1cy1wcm90b2NvbC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy10eXBlcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1hcmNoLWRlcHMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc3RyaW5nLmg+CisKKyNpZmRlZiBXT1JEU19CSUdFTkRJQU4KKyNkZWZpbmUgREJVU19DT01QSUxFUl9CWVRFX09SREVSIERCVVNfQklHX0VORElBTgorI2Vsc2UKKyNkZWZpbmUgREJVU19DT01QSUxFUl9CWVRFX09SREVSIERCVVNfTElUVExFX0VORElBTgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX0JZVEVTV0FQX0gKKyNkZWZpbmUgREJVU19VSU5UMTZfU1dBUF9MRV9CRV9DT05TVEFOVCh2YWwpIGJzd2FwXzE2KHZhbCkKKyNkZWZpbmUgREJVU19VSU5UMzJfU1dBUF9MRV9CRV9DT05TVEFOVCh2YWwpIGJzd2FwXzMyKHZhbCkKKyNlbHNlIC8qIEhBVkVfQllURVNXQVBfSCAqLworCisjZGVmaW5lIERCVVNfVUlOVDE2X1NXQVBfTEVfQkVfQ09OU1RBTlQodmFsKQkoKGRidXNfdWludDE2X3QpICggICAgICBcCisgICAgKGRidXNfdWludDE2X3QpICgoZGJ1c191aW50MTZfdCkgKHZhbCkgPj4gOCkgfCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKGRidXNfdWludDE2X3QpICgoZGJ1c191aW50MTZfdCkgKHZhbCkgPDwgOCkpKQorCisjZGVmaW5lIERCVVNfVUlOVDMyX1NXQVBfTEVfQkVfQ09OU1RBTlQodmFsKQkoKGRidXNfdWludDMyX3QpICggICAgICBcCisgICAgKCgoZGJ1c191aW50MzJfdCkgKHZhbCkgJiAoZGJ1c191aW50MzJfdCkgMHgwMDAwMDBmZlUpIDw8IDI0KSB8ICAgICBcCisgICAgKCgoZGJ1c191aW50MzJfdCkgKHZhbCkgJiAoZGJ1c191aW50MzJfdCkgMHgwMDAwZmYwMFUpIDw8ICA4KSB8ICAgICBcCisgICAgKCgoZGJ1c191aW50MzJfdCkgKHZhbCkgJiAoZGJ1c191aW50MzJfdCkgMHgwMGZmMDAwMFUpID4+ICA4KSB8ICAgICBcCisgICAgKCgoZGJ1c191aW50MzJfdCkgKHZhbCkgJiAoZGJ1c191aW50MzJfdCkgMHhmZjAwMDAwMFUpID4+IDI0KSkpCisKKyNlbmRpZiAvKiBIQVZFX0JZVEVTV0FQX0ggKi8KKworI2lmZGVmIEhBVkVfQllURVNXQVBfSAorI2RlZmluZSBEQlVTX1VJTlQ2NF9TV0FQX0xFX0JFX0NPTlNUQU5UKHZhbCkgYnN3YXBfNjQodmFsKQorI2Vsc2UgLyogSEFWRV9CWVRFU1dBUF9IICovCisKKyNkZWZpbmUgREJVU19VSU5UNjRfU1dBUF9MRV9CRV9DT05TVEFOVCh2YWwpCSgoZGJ1c191aW50NjRfdCkgKCAgICAgICAgICAgICAgXAorICAgICAgKCgoZGJ1c191aW50NjRfdCkgKHZhbCkgJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJKGRidXNfdWludDY0X3QpIERCVVNfVUlOVDY0X0NPTlNUQU5UICgweDAwMDAwMDAwMDAwMDAwZmYpKSA8PCA1NikgfCAgICBcCisgICAgICAoKChkYnVzX3VpbnQ2NF90KSAodmFsKSAmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkoZGJ1c191aW50NjRfdCkgREJVU19VSU5UNjRfQ09OU1RBTlQgKDB4MDAwMDAwMDAwMDAwZmYwMCkpIDw8IDQwKSB8ICAgIFwKKyAgICAgICgoKGRidXNfdWludDY0X3QpICh2YWwpICYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCShkYnVzX3VpbnQ2NF90KSBEQlVTX1VJTlQ2NF9DT05TVEFOVCAoMHgwMDAwMDAwMDAwZmYwMDAwKSkgPDwgMjQpIHwgICAgXAorICAgICAgKCgoZGJ1c191aW50NjRfdCkgKHZhbCkgJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJKGRidXNfdWludDY0X3QpIERCVVNfVUlOVDY0X0NPTlNUQU5UICgweDAwMDAwMDAwZmYwMDAwMDApKSA8PCAgOCkgfCAgICBcCisgICAgICAoKChkYnVzX3VpbnQ2NF90KSAodmFsKSAmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkoZGJ1c191aW50NjRfdCkgREJVU19VSU5UNjRfQ09OU1RBTlQgKDB4MDAwMDAwZmYwMDAwMDAwMCkpID4+ICA4KSB8ICAgIFwKKyAgICAgICgoKGRidXNfdWludDY0X3QpICh2YWwpICYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCShkYnVzX3VpbnQ2NF90KSBEQlVTX1VJTlQ2NF9DT05TVEFOVCAoMHgwMDAwZmYwMDAwMDAwMDAwKSkgPj4gMjQpIHwgICAgXAorICAgICAgKCgoZGJ1c191aW50NjRfdCkgKHZhbCkgJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJKGRidXNfdWludDY0X3QpIERCVVNfVUlOVDY0X0NPTlNUQU5UICgweDAwZmYwMDAwMDAwMDAwMDApKSA+PiA0MCkgfCAgICBcCisgICAgICAoKChkYnVzX3VpbnQ2NF90KSAodmFsKSAmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkoZGJ1c191aW50NjRfdCkgREJVU19VSU5UNjRfQ09OU1RBTlQgKDB4ZmYwMDAwMDAwMDAwMDAwMCkpID4+IDU2KSkpCisKKyNlbmRpZiAvKiBIQVZFX0JZVEVTV0FQX0ggKi8KKworI2RlZmluZSBEQlVTX1VJTlQxNl9TV0FQX0xFX0JFKHZhbCkgKERCVVNfVUlOVDE2X1NXQVBfTEVfQkVfQ09OU1RBTlQgKHZhbCkpCisjZGVmaW5lIERCVVNfSU5UMTZfU1dBUF9MRV9CRSh2YWwpICAoKGRidXNfaW50MTZfdClEQlVTX1VJTlQxNl9TV0FQX0xFX0JFX0NPTlNUQU5UICh2YWwpKQorCisjZGVmaW5lIERCVVNfVUlOVDMyX1NXQVBfTEVfQkUodmFsKSAoREJVU19VSU5UMzJfU1dBUF9MRV9CRV9DT05TVEFOVCAodmFsKSkKKyNkZWZpbmUgREJVU19JTlQzMl9TV0FQX0xFX0JFKHZhbCkgICgoZGJ1c19pbnQzMl90KURCVVNfVUlOVDMyX1NXQVBfTEVfQkVfQ09OU1RBTlQgKHZhbCkpCisKKyNkZWZpbmUgREJVU19VSU5UNjRfU1dBUF9MRV9CRSh2YWwpIChEQlVTX1VJTlQ2NF9TV0FQX0xFX0JFX0NPTlNUQU5UICh2YWwpKQorI2RlZmluZSBEQlVTX0lOVDY0X1NXQVBfTEVfQkUodmFsKSAgKChkYnVzX2ludDY0X3QpREJVU19VSU5UNjRfU1dBUF9MRV9CRV9DT05TVEFOVCAodmFsKSkKKworI2lmZGVmIFdPUkRTX0JJR0VORElBTgorCisjICBkZWZpbmUgREJVU19JTlQxNl9UT19CRSh2YWwpCSgoZGJ1c19pbnQxNl90KSAodmFsKSkKKyMgIGRlZmluZSBEQlVTX1VJTlQxNl9UT19CRSh2YWwpCSgoZGJ1c191aW50MTZfdCkgKHZhbCkpCisjICBkZWZpbmUgREJVU19JTlQxNl9UT19MRSh2YWwpCShEQlVTX0lOVDE2X1NXQVBfTEVfQkUgKHZhbCkpCisjICBkZWZpbmUgREJVU19VSU5UMTZfVE9fTEUodmFsKQkoREJVU19VSU5UMTZfU1dBUF9MRV9CRSAodmFsKSkKKyMgIGRlZmluZSBEQlVTX0lOVDMyX1RPX0JFKHZhbCkJKChkYnVzX2ludDMyX3QpICh2YWwpKQorIyAgZGVmaW5lIERCVVNfVUlOVDMyX1RPX0JFKHZhbCkJKChkYnVzX3VpbnQzMl90KSAodmFsKSkKKyMgIGRlZmluZSBEQlVTX0lOVDMyX1RPX0xFKHZhbCkJKERCVVNfSU5UMzJfU1dBUF9MRV9CRSAodmFsKSkKKyMgIGRlZmluZSBEQlVTX1VJTlQzMl9UT19MRSh2YWwpCShEQlVTX1VJTlQzMl9TV0FQX0xFX0JFICh2YWwpKQorIyAgZGVmaW5lIERCVVNfSU5UNjRfVE9fQkUodmFsKQkoKGRidXNfaW50NjRfdCkgKHZhbCkpCisjICBkZWZpbmUgREJVU19VSU5UNjRfVE9fQkUodmFsKQkoKGRidXNfdWludDY0X3QpICh2YWwpKQorIyAgZGVmaW5lIERCVVNfSU5UNjRfVE9fTEUodmFsKQkoREJVU19JTlQ2NF9TV0FQX0xFX0JFICh2YWwpKQorIyAgZGVmaW5lIERCVVNfVUlOVDY0X1RPX0xFKHZhbCkJKERCVVNfVUlOVDY0X1NXQVBfTEVfQkUgKHZhbCkpCisKKyNlbHNlIC8qIFdPUkRTX0JJR0VORElBTiAqLworCisjICBkZWZpbmUgREJVU19JTlQxNl9UT19MRSh2YWwpCSgoZGJ1c19pbnQxNl90KSAodmFsKSkKKyMgIGRlZmluZSBEQlVTX1VJTlQxNl9UT19MRSh2YWwpCSgoZGJ1c191aW50MTZfdCkgKHZhbCkpCisjICBkZWZpbmUgREJVU19JTlQxNl9UT19CRSh2YWwpCSgoZGJ1c19pbnQxNl90KSBEQlVTX1VJTlQxNl9TV0FQX0xFX0JFICh2YWwpKQorIyAgZGVmaW5lIERCVVNfVUlOVDE2X1RPX0JFKHZhbCkJKERCVVNfVUlOVDE2X1NXQVBfTEVfQkUgKHZhbCkpCisjICBkZWZpbmUgREJVU19JTlQzMl9UT19MRSh2YWwpCSgoZGJ1c19pbnQzMl90KSAodmFsKSkKKyMgIGRlZmluZSBEQlVTX1VJTlQzMl9UT19MRSh2YWwpCSgoZGJ1c191aW50MzJfdCkgKHZhbCkpCisjICBkZWZpbmUgREJVU19JTlQzMl9UT19CRSh2YWwpCSgoZGJ1c19pbnQzMl90KSBEQlVTX1VJTlQzMl9TV0FQX0xFX0JFICh2YWwpKQorIyAgZGVmaW5lIERCVVNfVUlOVDMyX1RPX0JFKHZhbCkJKERCVVNfVUlOVDMyX1NXQVBfTEVfQkUgKHZhbCkpCisjICBkZWZpbmUgREJVU19JTlQ2NF9UT19MRSh2YWwpCSgoZGJ1c19pbnQ2NF90KSAodmFsKSkKKyMgIGRlZmluZSBEQlVTX1VJTlQ2NF9UT19MRSh2YWwpCSgoZGJ1c191aW50NjRfdCkgKHZhbCkpCisjICBkZWZpbmUgREJVU19JTlQ2NF9UT19CRSh2YWwpCSgoZGJ1c19pbnQ2NF90KSBEQlVTX1VJTlQ2NF9TV0FQX0xFX0JFICh2YWwpKQorIyAgZGVmaW5lIERCVVNfVUlOVDY0X1RPX0JFKHZhbCkJKERCVVNfVUlOVDY0X1NXQVBfTEVfQkUgKHZhbCkpCisjZW5kaWYKKworLyogVGhlIHRyYW5zZm9ybWF0aW9uIGlzIHN5bW1ldHJpYywgc28gdGhlIEZST00ganVzdCBtYXBzIHRvIHRoZSBUTy4gKi8KKyNkZWZpbmUgREJVU19JTlQxNl9GUk9NX0xFKHZhbCkJIChEQlVTX0lOVDE2X1RPX0xFICh2YWwpKQorI2RlZmluZSBEQlVTX1VJTlQxNl9GUk9NX0xFKHZhbCkgKERCVVNfVUlOVDE2X1RPX0xFICh2YWwpKQorI2RlZmluZSBEQlVTX0lOVDE2X0ZST01fQkUodmFsKQkgKERCVVNfSU5UMTZfVE9fQkUgKHZhbCkpCisjZGVmaW5lIERCVVNfVUlOVDE2X0ZST01fQkUodmFsKSAoREJVU19VSU5UMTZfVE9fQkUgKHZhbCkpCisjZGVmaW5lIERCVVNfSU5UMzJfRlJPTV9MRSh2YWwpCSAoREJVU19JTlQzMl9UT19MRSAodmFsKSkKKyNkZWZpbmUgREJVU19VSU5UMzJfRlJPTV9MRSh2YWwpIChEQlVTX1VJTlQzMl9UT19MRSAodmFsKSkKKyNkZWZpbmUgREJVU19JTlQzMl9GUk9NX0JFKHZhbCkJIChEQlVTX0lOVDMyX1RPX0JFICh2YWwpKQorI2RlZmluZSBEQlVTX1VJTlQzMl9GUk9NX0JFKHZhbCkgKERCVVNfVUlOVDMyX1RPX0JFICh2YWwpKQorI2RlZmluZSBEQlVTX0lOVDY0X0ZST01fTEUodmFsKQkgKERCVVNfSU5UNjRfVE9fTEUgKHZhbCkpCisjZGVmaW5lIERCVVNfVUlOVDY0X0ZST01fTEUodmFsKSAoREJVU19VSU5UNjRfVE9fTEUgKHZhbCkpCisjZGVmaW5lIERCVVNfSU5UNjRfRlJPTV9CRSh2YWwpCSAoREJVU19JTlQ2NF9UT19CRSAodmFsKSkKKyNkZWZpbmUgREJVU19VSU5UNjRfRlJPTV9CRSh2YWwpIChEQlVTX1VJTlQ2NF9UT19CRSAodmFsKSkKKworI2lmZGVmIERCVVNfRElTQUJMRV9BU1NFUlQKKyNkZWZpbmUgX2RidXNfdW5wYWNrX3VpbnQxNihieXRlX29yZGVyLCBkYXRhKSAgICAgICAgICAgXAorICAgKCgoYnl0ZV9vcmRlcikgPT0gREJVU19MSVRUTEVfRU5ESUFOKSA/ICAgICAgICAgICAgICBcCisgICAgIERCVVNfVUlOVDE2X0ZST01fTEUgKCooZGJ1c191aW50MTZfdCopKGRhdGEpKSA6ICAgIFwKKyAgICAgREJVU19VSU5UMTZfRlJPTV9CRSAoKihkYnVzX3VpbnQxNl90KikoZGF0YSkpKQorCisjZGVmaW5lIF9kYnVzX3VucGFja191aW50MzIoYnl0ZV9vcmRlciwgZGF0YSkgICAgICAgICAgIFwKKyAgICgoKGJ5dGVfb3JkZXIpID09IERCVVNfTElUVExFX0VORElBTikgPyAgICAgICAgICAgICAgXAorICAgICBEQlVTX1VJTlQzMl9GUk9NX0xFICgqKGRidXNfdWludDMyX3QqKShkYXRhKSkgOiAgICBcCisgICAgIERCVVNfVUlOVDMyX0ZST01fQkUgKCooZGJ1c191aW50MzJfdCopKGRhdGEpKSkKKyNlbmRpZgorCisjaWZuZGVmIF9kYnVzX3VucGFja191aW50MTYKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfdWludDE2X3QgX2RidXNfdW5wYWNrX3VpbnQxNiAoaW50ICAgICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSk7CisjZW5kaWYKKwordm9pZCAgICAgICAgICBfZGJ1c19wYWNrX3VpbnQzMiAgIChkYnVzX3VpbnQzMl90ICAgICAgICB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAgICAgICAqZGF0YSk7CisjaWZuZGVmIF9kYnVzX3VucGFja191aW50MzIKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfdWludDMyX3QgX2RidXNfdW5wYWNrX3VpbnQzMiAoaW50ICAgICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSk7CisjZW5kaWYKKworZGJ1c19ib29sX3QgICBfZGJ1c19tYXJzaGFsX3NldF9iYXNpYyAgICAgICAgIChEQnVzU3RyaW5nICAgICAgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAgICAgICAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgKm9sZF9lbmRfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICpuZXdfZW5kX3Bvcyk7CitkYnVzX2Jvb2xfdCAgIF9kYnVzX21hcnNoYWxfd3JpdGVfYmFzaWMgICAgICAgKERCdXNTdHJpbmcgICAgICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgaW5zZXJ0X2F0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICAgICAgICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAqcG9zX2FmdGVyKTsKK2RidXNfYm9vbF90ICAgX2RidXNfbWFyc2hhbF93cml0ZV9maXhlZF9tdWx0aSAoREJ1c1N0cmluZyAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBpbnNlcnRfYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAgICAgICAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIG5fZWxlbWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgKnBvc19hZnRlcik7Cit2b2lkICAgICAgICAgIF9kYnVzX21hcnNoYWxfcmVhZF9iYXNpYyAgICAgICAgKGNvbnN0IERCdXNTdHJpbmcgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAqbmV3X3Bvcyk7Cit2b2lkICAgICAgICAgIF9kYnVzX21hcnNoYWxfcmVhZF9maXhlZF9tdWx0aSAgKGNvbnN0IERCdXNTdHJpbmcgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBlbGVtZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBuX2VsZW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICpuZXdfcG9zKTsKK3ZvaWQgICAgICAgICAgX2RidXNfbWFyc2hhbF9za2lwX2Jhc2ljICAgICAgICAoY29uc3QgREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICpwb3MpOwordm9pZCAgICAgICAgICBfZGJ1c19tYXJzaGFsX3NraXBfYXJyYXkgICAgICAgIChjb25zdCBEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAqcG9zKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK3ZvaWQgICAgICAgICAgX2RidXNfbWFyc2hhbF9zZXRfdWludDMyICAgICAgICAoREJ1c1N0cmluZyAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBwb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgICAgIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBieXRlX29yZGVyKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfdWludDMyX3QgX2RidXNfbWFyc2hhbF9yZWFkX3VpbnQzMiAgICAgICAoY29uc3QgREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBwb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgKm5ld19wb3MpOworaW50ICAgICAgICAgICBfZGJ1c190eXBlX2dldF9hbGlnbm1lbnQgICAgICAgIChpbnQgICAgICAgICAgICAgICB0eXBlY29kZSk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitjb25zdCBjaGFyKiAgIF9kYnVzX3R5cGVfdG9fc3RyaW5nICAgICAgICAgICAgKGludCAgICAgICAgICAgICAgIHR5cGVjb2RlKTsKKworREJVU19QUklWQVRFX0VYUE9SVAoraW50ICAgICAgICAgICBfZGJ1c19maXJzdF90eXBlX2luX3NpZ25hdHVyZSAgIChjb25zdCBEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHBvcyk7CisKK2ludCAgICAgICAgICAgX2RidXNfZmlyc3RfdHlwZV9pbl9zaWduYXR1cmVfY19zdHIgICAoY29uc3QgY2hhciAgICAgICAqc3RyLAorCQkJCQkJICAgICBpbnQgICAgICAgICAgICAgICBwb3MpOworCit2b2lkIF9kYnVzX3N3YXBfYXJyYXkgKHVuc2lnbmVkIGNoYXIgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgIG5fZWxlbWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgIGFsaWdubWVudCk7CisKKyNlbmRpZiAvKiBEQlVTX01BUlNIQUxfQkFTSUNfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLW1hcnNoYWwtYnl0ZXN3YXAtdXRpbC5jIGIvZGJ1cy9kYnVzLW1hcnNoYWwtYnl0ZXN3YXAtdXRpbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwZmMwMTMKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtbWFyc2hhbC1ieXRlc3dhcC11dGlsLmMKQEAgLTAsMCArMSwxMDUgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1tYXJzaGFsLWJ5dGVzd2FwLXV0aWwuYyAgV291bGQgYmUgaW4gZGJ1cy1tYXJzaGFsLWJ5dGVzd2FwLmMgYnV0IHRlc3RzL2J1cyBvbmx5CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKworI2lmZGVmIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTCisjaW5jbHVkZSAiZGJ1cy1tYXJzaGFsLWJ5dGVzd2FwLmgiCisjaW5jbHVkZSAiZGJ1cy10ZXN0LmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKworc3RhdGljIHZvaWQKK2RvX2J5dGVzd2FwX3Rlc3QgKGludCBieXRlX29yZGVyKQoreworICBpbnQgc2VxdWVuY2U7CisgIERCdXNTdHJpbmcgc2lnbmF0dXJlOworICBEQnVzU3RyaW5nIGJvZHk7CisgIGludCBvcHBvc2l0ZV9vcmRlcjsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmc2lnbmF0dXJlKSB8fCAhX2RidXNfc3RyaW5nX2luaXQgKCZib2R5KSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKKworICBvcHBvc2l0ZV9vcmRlciA9IGJ5dGVfb3JkZXIgPT0gREJVU19MSVRUTEVfRU5ESUFOID8gREJVU19CSUdfRU5ESUFOIDogREJVU19MSVRUTEVfRU5ESUFOOworICAKKyAgc2VxdWVuY2UgPSAwOworICB3aGlsZSAoZGJ1c19pbnRlcm5hbF9kb19ub3RfdXNlX2dlbmVyYXRlX2JvZGllcyAoc2VxdWVuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpZ25hdHVyZSwgJmJvZHkpKQorICAgIHsKKyAgICAgIERCdXNTdHJpbmcgY29weTsKKyAgICAgIERCdXNUeXBlUmVhZGVyIGJvZHlfcmVhZGVyOworICAgICAgREJ1c1R5cGVSZWFkZXIgY29weV9yZWFkZXI7CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZjb3B5KSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2NvcHkgKCZib2R5LCAwLCAmY29weSwgMCkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm9vbSIpOworCisgICAgICBfZGJ1c19tYXJzaGFsX2J5dGVzd2FwICgmc2lnbmF0dXJlLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wcG9zaXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvcHksIDApOworCisgICAgICBfZGJ1c190eXBlX3JlYWRlcl9pbml0ICgmYm9keV9yZWFkZXIsIGJ5dGVfb3JkZXIsICZzaWduYXR1cmUsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm9keSwgMCk7CisgICAgICBfZGJ1c190eXBlX3JlYWRlcl9pbml0ICgmY29weV9yZWFkZXIsIG9wcG9zaXRlX29yZGVyLCAmc2lnbmF0dXJlLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvcHksIDApOworICAgICAgCisgICAgICBpZiAoIV9kYnVzX3R5cGVfcmVhZGVyX2VxdWFsX3ZhbHVlcyAoJmJvZHlfcmVhZGVyLCAmY29weV9yZWFkZXIpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZV9ieXRlc19vZl9zdHJpbmcgKCZzaWduYXR1cmUsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc2lnbmF0dXJlKSk7CisgICAgICAgICAgX2RidXNfdmVyYm9zZV9ieXRlc19vZl9zdHJpbmcgKCZib2R5LCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmJvZHkpKTsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlX2J5dGVzX29mX3N0cmluZyAoJmNvcHksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmY29weSkpOworCisgICAgICAgICAgX2RidXNfd2FybiAoIkJ5dGUtc3dhcHBlZCBkYXRhIGRpZCBub3QgaGF2ZSBzYW1lIHZhbHVlcyBhcyBvcmlnaW5hbCBkYXRhIik7CisgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgidGVzdCBmYWlsZWQiKTsKKyAgICAgICAgfQorICAgICAgCisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmNvcHkpOworICAgICAgCisgICAgICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoJnNpZ25hdHVyZSwgMCk7CisgICAgICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoJmJvZHksIDApOworICAgICAgKytzZXF1ZW5jZTsKKyAgICB9CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZzaWduYXR1cmUpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmJvZHkpOworCisgIHByaW50ZiAoIiAgJWQgYmxvY2tzIHN3YXBwZWQgZnJvbSBvcmRlciAnJWMnIHRvICclYydcbiIsCisgICAgICAgICAgc2VxdWVuY2UsIGJ5dGVfb3JkZXIsIG9wcG9zaXRlX29yZGVyKTsKK30KKworZGJ1c19ib29sX3QKK19kYnVzX21hcnNoYWxfYnl0ZXN3YXBfdGVzdCAodm9pZCkKK3sKKyAgZG9fYnl0ZXN3YXBfdGVzdCAoREJVU19MSVRUTEVfRU5ESUFOKTsKKyAgZG9fYnl0ZXN3YXBfdGVzdCAoREJVU19CSUdfRU5ESUFOKTsKKworICByZXR1cm4gVFJVRTsKK30KKworI2VuZGlmIC8qIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtbWFyc2hhbC1ieXRlc3dhcC5jIGIvZGJ1cy9kYnVzLW1hcnNoYWwtYnl0ZXN3YXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzY5NWFhCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLW1hcnNoYWwtYnl0ZXN3YXAuYwpAQCAtMCwwICsxLDI0OCBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLW1hcnNoYWwtYnl0ZXN3YXAuYyAgU3dhcCBhIGJsb2NrIG9mIG1hcnNoYWxlZCBkYXRhCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLW1hcnNoYWwtYnl0ZXN3YXAuaCIKKyNpbmNsdWRlICJkYnVzLW1hcnNoYWwtYmFzaWMuaCIKKyNpbmNsdWRlICJkYnVzLXNpZ25hdHVyZS5oIgorCisvKioKKyAqIEBhZGR0b2dyb3VwIERCdXNNYXJzaGFsCisgKiBAeworICovCisKK3N0YXRpYyB2b2lkCitieXRlc3dhcF9ib2R5X2hlbHBlciAoREJ1c1R5cGVSZWFkZXIgICAgICAgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICAgICAgd2Fsa19yZWFkZXJfdG9fZW5kLAorICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICBvbGRfYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgbmV3X2J5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAgICAgICAgKnAsCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAgICAgICAqKm5ld19wKQoreworICBpbnQgY3VycmVudF90eXBlOworCisgIHdoaWxlICgoY3VycmVudF90eXBlID0gX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2N1cnJlbnRfdHlwZSAocmVhZGVyKSkgIT0gREJVU19UWVBFX0lOVkFMSUQpCisgICAgeworICAgICAgc3dpdGNoIChjdXJyZW50X3R5cGUpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBEQlVTX1RZUEVfQllURToKKyAgICAgICAgICArK3A7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBEQlVTX1RZUEVfSU5UMTY6CisgICAgICAgIGNhc2UgREJVU19UWVBFX1VJTlQxNjoKKyAgICAgICAgICB7CisgICAgICAgICAgICBwID0gX0RCVVNfQUxJR05fQUREUkVTUyAocCwgMik7CisgICAgICAgICAgICAqKChkYnVzX3VpbnQxNl90KilwKSA9IERCVVNfVUlOVDE2X1NXQVBfTEVfQkUgKCooKGRidXNfdWludDE2X3QqKXApKTsKKyAgICAgICAgICAgIHAgKz0gMjsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgCisgICAgICAgIGNhc2UgREJVU19UWVBFX0JPT0xFQU46CisgICAgICAgIGNhc2UgREJVU19UWVBFX0lOVDMyOgorICAgICAgICBjYXNlIERCVVNfVFlQRV9VSU5UMzI6CisgICAgICAgICAgeworICAgICAgICAgICAgcCA9IF9EQlVTX0FMSUdOX0FERFJFU1MgKHAsIDQpOworICAgICAgICAgICAgKigoZGJ1c191aW50MzJfdCopcCkgPSBEQlVTX1VJTlQzMl9TV0FQX0xFX0JFICgqKChkYnVzX3VpbnQzMl90KilwKSk7CisgICAgICAgICAgICBwICs9IDQ7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICAgIAorICAgICAgICBjYXNlIERCVVNfVFlQRV9JTlQ2NDoKKyAgICAgICAgY2FzZSBEQlVTX1RZUEVfVUlOVDY0OgorICAgICAgICBjYXNlIERCVVNfVFlQRV9ET1VCTEU6CisgICAgICAgICAgeworICAgICAgICAgICAgcCA9IF9EQlVTX0FMSUdOX0FERFJFU1MgKHAsIDgpOworICAgICAgICAgICAgKigoZGJ1c191aW50NjRfdCopcCkgPSBEQlVTX1VJTlQ2NF9TV0FQX0xFX0JFICgqKChkYnVzX3VpbnQ2NF90KilwKSk7CisgICAgICAgICAgICBwICs9IDg7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgREJVU19UWVBFX0FSUkFZOgorICAgICAgICBjYXNlIERCVVNfVFlQRV9TVFJJTkc6CisgICAgICAgIGNhc2UgREJVU19UWVBFX09CSkVDVF9QQVRIOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIGRidXNfdWludDMyX3QgYXJyYXlfbGVuOworICAgICAgICAgICAgCisgICAgICAgICAgICBwID0gX0RCVVNfQUxJR05fQUREUkVTUyAocCwgNCk7CisKKyAgICAgICAgICAgIGFycmF5X2xlbiA9IF9kYnVzX3VucGFja191aW50MzIgKG9sZF9ieXRlX29yZGVyLCBwKTsKKworICAgICAgICAgICAgKigoZGJ1c191aW50MzJfdCopcCkgPSBEQlVTX1VJTlQzMl9TV0FQX0xFX0JFICgqKChkYnVzX3VpbnQzMl90KilwKSk7CisgICAgICAgICAgICBwICs9IDQ7CisKKyAgICAgICAgICAgIGlmIChjdXJyZW50X3R5cGUgPT0gREJVU19UWVBFX0FSUkFZKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGVsZW1fdHlwZTsKKyAgICAgICAgICAgICAgICBpbnQgYWxpZ25tZW50OworCisgICAgICAgICAgICAgICAgZWxlbV90eXBlID0gX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2VsZW1lbnRfdHlwZSAocmVhZGVyKTsKKyAgICAgICAgICAgICAgICBhbGlnbm1lbnQgPSBfZGJ1c190eXBlX2dldF9hbGlnbm1lbnQgKGVsZW1fdHlwZSk7CisKKwkJX2RidXNfYXNzZXJ0ICgoYXJyYXlfbGVuIC8gYWxpZ25tZW50KSA8IERCVVNfTUFYSU1VTV9BUlJBWV9MRU5HVEgpOworCisgICAgICAgICAgICAgICAgcCA9IF9EQlVTX0FMSUdOX0FERFJFU1MgKHAsIGFsaWdubWVudCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKGRidXNfdHlwZV9pc19maXhlZCAoZWxlbV90eXBlKSkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFsaWdubWVudCA+IDEpCisJCSAgICAgIF9kYnVzX3N3YXBfYXJyYXkgKHAsIGFycmF5X2xlbiAvIGFsaWdubWVudCwgYWxpZ25tZW50KTsKKwkJICAgIHAgKz0gYXJyYXlfbGVuOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgc3ViOworICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICphcnJheV9lbmQ7CisKKyAgICAgICAgICAgICAgICAgICAgYXJyYXlfZW5kID0gcCArIGFycmF5X2xlbjsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX3JlY3Vyc2UgKHJlYWRlciwgJnN1Yik7CisKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHAgPCBhcnJheV9lbmQpCisgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXN3YXBfYm9keV9oZWxwZXIgKCZzdWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkX2J5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X2J5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCwgJnApOworICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2RidXNfYXNzZXJ0IChjdXJyZW50X3R5cGUgPT0gREJVU19UWVBFX1NUUklORyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF90eXBlID09IERCVVNfVFlQRV9PQkpFQ1RfUEFUSCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgcCArPSAoYXJyYXlfbGVuICsgMSk7IC8qICsgMSBmb3IgbnVsICovCisgICAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBEQlVTX1RZUEVfU0lHTkFUVVJFOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIGRidXNfdWludDMyX3Qgc2lnX2xlbjsKKworICAgICAgICAgICAgc2lnX2xlbiA9ICpwOworICAgICAgICAgICAgCisgICAgICAgICAgICBwICs9IChzaWdfbGVuICsgMik7IC8qICsyIGZvciBsZW4gYW5kIG51bCAqLworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIERCVVNfVFlQRV9WQVJJQU5UOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIDEgYnl0ZSBzaWcgbGVuLCBzaWcgdHlwZWNvZGVzLCBhbGlnbiB0bworICAgICAgICAgICAgICogY29udGFpbmVkLXR5cGUtYm91bmRhcnksIHZhbHVlcy4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgZGJ1c191aW50MzJfdCBzaWdfbGVuOworICAgICAgICAgICAgREJ1c1N0cmluZyBzaWc7CisgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciBzdWI7CisgICAgICAgICAgICBpbnQgY29udGFpbmVkX2FsaWdubWVudDsKKworICAgICAgICAgICAgc2lnX2xlbiA9ICpwOworICAgICAgICAgICAgKytwOworCisgICAgICAgICAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdF9sZW4gKCZzaWcsIChjb25zdCBjaGFyICopIHAsIHNpZ19sZW4pOworCisgICAgICAgICAgICBwICs9IChzaWdfbGVuICsgMSk7IC8qIDEgZm9yIG51bCAqLworCisgICAgICAgICAgICBjb250YWluZWRfYWxpZ25tZW50ID0gX2RidXNfdHlwZV9nZXRfYWxpZ25tZW50IChfZGJ1c19maXJzdF90eXBlX2luX3NpZ25hdHVyZSAoJnNpZywgMCkpOworICAgICAgICAgICAgCisgICAgICAgICAgICBwID0gX0RCVVNfQUxJR05fQUREUkVTUyAocCwgY29udGFpbmVkX2FsaWdubWVudCk7CisKKyAgICAgICAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX2luaXRfdHlwZXNfb25seSAoJnN1YiwgJnNpZywgMCk7CisKKyAgICAgICAgICAgIGJ5dGVzd2FwX2JvZHlfaGVscGVyICgmc3ViLCBGQUxTRSwgb2xkX2J5dGVfb3JkZXIsIG5ld19ieXRlX29yZGVyLCBwLCAmcCk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgREJVU19UWVBFX1NUUlVDVDoKKyAgICAgICAgY2FzZSBEQlVTX1RZUEVfRElDVF9FTlRSWToKKyAgICAgICAgICB7CisgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciBzdWI7CisKKyAgICAgICAgICAgIHAgPSBfREJVU19BTElHTl9BRERSRVNTIChwLCA4KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgX2RidXNfdHlwZV9yZWFkZXJfcmVjdXJzZSAocmVhZGVyLCAmc3ViKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgYnl0ZXN3YXBfYm9keV9oZWxwZXIgKCZzdWIsIFRSVUUsIG9sZF9ieXRlX29yZGVyLCBuZXdfYnl0ZV9vcmRlciwgcCwgJnApOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIERCVVNfVFlQRV9VTklYX0ZEOgorICAgICAgICAgIC8qIGZkcyBjYW4gb25seSBiZSBwYXNzZWQgb24gYSBsb2NhbCBtYWNoaW5lLCBzbyBieXRlIG9yZGVyIG11c3QgYWx3YXlzIG1hdGNoICovCisgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkKCJhdHRlbXB0ZWQgdG8gYnl0ZXN3YXAgdW5peCBmZHMgd2hpY2ggbWFrZXMgbm8gc2Vuc2UiKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImludmFsaWQgdHlwZWNvZGUgaW4gc3VwcG9zZWRseS12YWxpZGF0ZWQgc2lnbmF0dXJlIik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgaWYgKHdhbGtfcmVhZGVyX3RvX2VuZCkKKyAgICAgICAgX2RidXNfdHlwZV9yZWFkZXJfbmV4dCAocmVhZGVyKTsKKyAgICAgIGVsc2UKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgIGlmIChuZXdfcCkKKyAgICAqbmV3X3AgPSBwOworfQorCisvKioKKyAqIEJ5dGVzd2FwcyB0aGUgbWFyc2hhbGVkIGRhdGEgaW4gdGhlIGdpdmVuIHZhbHVlX3N0ci4KKyAqCisgKiBAcGFyYW0gc2lnbmF0dXJlIHRoZSB0eXBlcyBpbiB0aGUgdmFsdWVfc3RyCisgKiBAcGFyYW0gc2lnbmF0dXJlX3N0YXJ0IHdoZXJlIGluIHNpZ25hdHVyZSBpcyB0aGUgc2lnbmF0dXJlCisgKiBAcGFyYW0gb2xkX2J5dGVfb3JkZXIgdGhlIG9sZCBieXRlIG9yZGVyCisgKiBAcGFyYW0gbmV3X2J5dGVfb3JkZXIgdGhlIG5ldyBieXRlIG9yZGVyCisgKiBAcGFyYW0gdmFsdWVfc3RyIHRoZSBzdHJpbmcgY29udGFpbmluZyB0aGUgYm9keQorICogQHBhcmFtIHZhbHVlX3BvcyB3aGVyZSB0aGUgdmFsdWVzIHN0YXJ0CisgKi8KK3ZvaWQKK19kYnVzX21hcnNoYWxfYnl0ZXN3YXAgKGNvbnN0IERCdXNTdHJpbmcgKnNpZ25hdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHNpZ25hdHVyZV9zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIG9sZF9ieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgbmV3X2J5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICp2YWx1ZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICB2YWx1ZV9wb3MpCit7CisgIERCdXNUeXBlUmVhZGVyIHJlYWRlcjsKKworICBfZGJ1c19hc3NlcnQgKHZhbHVlX3BvcyA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0ICh2YWx1ZV9wb3MgPD0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHZhbHVlX3N0cikpOworCisgIGlmIChvbGRfYnl0ZV9vcmRlciA9PSBuZXdfYnl0ZV9vcmRlcikKKyAgICByZXR1cm47CisgIAorICBfZGJ1c190eXBlX3JlYWRlcl9pbml0X3R5cGVzX29ubHkgKCZyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlLCBzaWduYXR1cmVfc3RhcnQpOworCisgIGJ5dGVzd2FwX2JvZHlfaGVscGVyICgmcmVhZGVyLCBUUlVFLAorICAgICAgICAgICAgICAgICAgICAgICAgb2xkX2J5dGVfb3JkZXIsIG5ld19ieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF91ZGF0YV9sZW4gKHZhbHVlX3N0ciwgdmFsdWVfcG9zLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworfQorCisvKiogQH0gKi8KKworLyogVGVzdHMgaW4gZGJ1cy1tYXJzaGFsLWJ5dGVzd2FwLXV0aWwuYyAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLW1hcnNoYWwtYnl0ZXN3YXAuaCBiL2RidXMvZGJ1cy1tYXJzaGFsLWJ5dGVzd2FwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY2ZjJlMgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1tYXJzaGFsLWJ5dGVzd2FwLmgKQEAgLTAsMCArMSwzOCBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLW1hcnNoYWwtYnl0ZXN3YXAuaCAgU3dhcCBhIGJsb2NrIG9mIG1hcnNoYWxlZCBkYXRhCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpZm5kZWYgREJVU19NQVJTSEFMX0JZVEVTV0FQX0gKKyNkZWZpbmUgREJVU19NQVJTSEFMX0JZVEVTV0FQX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy1wcm90b2NvbC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1tYXJzaGFsLXJlY3Vyc2l2ZS5oPgorCitEQlVTX1BSSVZBVEVfRVhQT1JUCit2b2lkIF9kYnVzX21hcnNoYWxfYnl0ZXN3YXAgKGNvbnN0IERCdXNTdHJpbmcgKnNpZ25hdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgc2lnbmF0dXJlX3N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBvbGRfYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgbmV3X2J5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgKnZhbHVlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgdmFsdWVfcG9zKTsKKworI2VuZGlmIC8qIERCVVNfTUFSU0hBTF9CWVRFU1dBUF9IICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtbWFyc2hhbC1oZWFkZXIuYyBiL2RidXMvZGJ1cy1tYXJzaGFsLWhlYWRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0YjM5Y2QKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtbWFyc2hhbC1oZWFkZXIuYwpAQCAtMCwwICsxLDE1MTQgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1tYXJzaGFsLWhlYWRlci5jICBNYW5hZ2luZyBtYXJzaGFsaW5nL2RlbWFyc2hhbGluZyBvZiBtZXNzYWdlIGhlYWRlcnMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgIFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzL2RidXMtc2hhcmVkLmgiCisjaW5jbHVkZSAiZGJ1cy1tYXJzaGFsLWhlYWRlci5oIgorI2luY2x1ZGUgImRidXMtbWFyc2hhbC1yZWN1cnNpdmUuaCIKKyNpbmNsdWRlICJkYnVzLW1hcnNoYWwtYnl0ZXN3YXAuaCIKKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzTWFyc2hhbAorICoKKyAqIEB7CisgKi8KKworCisvKiBOb3QgdGhyZWFkIGxvY2tlZCwgYnV0IHN0cmljdGx5IGNvbnN0L3JlYWQtb25seSBzbyBzaG91bGQgYmUgT0sKKyAqLworLyoqIFN0YXRpYyAjREJ1c1N0cmluZyBjb250YWluaW5nIHRoZSBzaWduYXR1cmUgb2YgYSBtZXNzYWdlIGhlYWRlciAqLworX0RCVVNfU1RSSU5HX0RFRklORV9TVEFUSUMoX2RidXNfaGVhZGVyX3NpZ25hdHVyZV9zdHIsIERCVVNfSEVBREVSX1NJR05BVFVSRSk7CisvKiogU3RhdGljICNEQnVzU3RyaW5nIGNvbnRhaW5pbmcgdGhlIGxvY2FsIGludGVyZmFjZSAqLworX0RCVVNfU1RSSU5HX0RFRklORV9TVEFUSUMoX2RidXNfbG9jYWxfaW50ZXJmYWNlX3N0ciwgIERCVVNfSU5URVJGQUNFX0xPQ0FMKTsKKy8qKiBTdGF0aWMgI0RCdXNTdHJpbmcgY29udGFpbmluZyB0aGUgbG9jYWwgcGF0aCAqLworX0RCVVNfU1RSSU5HX0RFRklORV9TVEFUSUMoX2RidXNfbG9jYWxfcGF0aF9zdHIsICAgICAgIERCVVNfUEFUSF9MT0NBTCk7CisKKy8qKiBPZmZzZXQgZnJvbSBzdGFydCBvZiBfZGJ1c19oZWFkZXJfc2lnbmF0dXJlX3N0ciB0byB0aGUgc2lnbmF0dXJlIG9mIHRoZSBmaWVsZHMgYXJyYXkgKi8KKyNkZWZpbmUgRklFTERTX0FSUkFZX1NJR05BVFVSRV9PRkZTRVQgNgorLyoqIE9mZnNldCBmcm9tIHN0YXJ0IG9mIF9kYnVzX2hlYWRlcl9zaWduYXR1cmVfc3RyIHRvIHRoZSBzaWduYXR1cmUgb2YgYW4gZWxlbWVudCBvZiB0aGUgZmllbGRzIGFycmF5ICovCisjZGVmaW5lIEZJRUxEU19BUlJBWV9FTEVNRU5UX1NJR05BVFVSRV9PRkZTRVQgNworCisKKy8qKiBPZmZzZXQgdG8gYnl0ZSBvcmRlciBmcm9tIHN0YXJ0IG9mIGhlYWRlciAqLworI2RlZmluZSBCWVRFX09SREVSX09GRlNFVCAgICAwCisvKiogT2Zmc2V0IHRvIHR5cGUgZnJvbSBzdGFydCBvZiBoZWFkZXIgKi8KKyNkZWZpbmUgVFlQRV9PRkZTRVQgICAgICAgICAgMQorLyoqIE9mZnNldCB0byBmbGFncyBmcm9tIHN0YXJ0IG9mIGhlYWRlciAqLworI2RlZmluZSBGTEFHU19PRkZTRVQgICAgICAgICAyCisvKiogT2Zmc2V0IHRvIHZlcnNpb24gZnJvbSBzdGFydCBvZiBoZWFkZXIgKi8KKyNkZWZpbmUgVkVSU0lPTl9PRkZTRVQgICAgICAgMworLyoqIE9mZnNldCB0byBib2R5IGxlbmd0aCBmcm9tIHN0YXJ0IG9mIGhlYWRlciAqLworI2RlZmluZSBCT0RZX0xFTkdUSF9PRkZTRVQgNAorLyoqIE9mZnNldCB0byBjbGllbnQgc2VyaWFsIGZyb20gc3RhcnQgb2YgaGVhZGVyICovCisjZGVmaW5lIFNFUklBTF9PRkZTRVQgOAorLyoqIE9mZnNldCB0byBmaWVsZHMgYXJyYXkgbGVuZ3RoIGZyb20gc3RhcnQgb2YgaGVhZGVyICovCisjZGVmaW5lIEZJRUxEU19BUlJBWV9MRU5HVEhfT0ZGU0VUIDEyCisvKiogT2Zmc2V0IHRvIGZpcnN0IGZpZWxkIGluIGhlYWRlciAqLworI2RlZmluZSBGSVJTVF9GSUVMRF9PRkZTRVQgMTYKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdW5zaWduZWQgY2hhciBjb2RlOyAvKio8IHRoZSBmaWVsZCBjb2RlICovCisgIHVuc2lnbmVkIGNoYXIgdHlwZTsgLyoqPCB0aGUgdmFsdWUgdHlwZSAqLworfSBIZWFkZXJGaWVsZFR5cGU7CisKK3N0YXRpYyBjb25zdCBIZWFkZXJGaWVsZFR5cGUKK19kYnVzX2hlYWRlcl9maWVsZF90eXBlc1tEQlVTX0hFQURFUl9GSUVMRF9MQVNUKzFdID0geworICB7IERCVVNfSEVBREVSX0ZJRUxEX0lOVkFMSUQsIERCVVNfVFlQRV9JTlZBTElEIH0sCisgIHsgREJVU19IRUFERVJfRklFTERfUEFUSCwgREJVU19UWVBFX09CSkVDVF9QQVRIIH0sCisgIHsgREJVU19IRUFERVJfRklFTERfSU5URVJGQUNFLCBEQlVTX1RZUEVfU1RSSU5HIH0sCisgIHsgREJVU19IRUFERVJfRklFTERfTUVNQkVSLCBEQlVTX1RZUEVfU1RSSU5HIH0sCisgIHsgREJVU19IRUFERVJfRklFTERfRVJST1JfTkFNRSwgREJVU19UWVBFX1NUUklORyB9LAorICB7IERCVVNfSEVBREVSX0ZJRUxEX1JFUExZX1NFUklBTCwgREJVU19UWVBFX1VJTlQzMiB9LAorICB7IERCVVNfSEVBREVSX0ZJRUxEX0RFU1RJTkFUSU9OLCBEQlVTX1RZUEVfU1RSSU5HIH0sCisgIHsgREJVU19IRUFERVJfRklFTERfU0VOREVSLCBEQlVTX1RZUEVfU1RSSU5HIH0sCisgIHsgREJVU19IRUFERVJfRklFTERfU0lHTkFUVVJFLCBEQlVTX1RZUEVfU0lHTkFUVVJFIH0sCisgIHsgREJVU19IRUFERVJfRklFTERfVU5JWF9GRFMsIERCVVNfVFlQRV9VSU5UMzIgfQorfTsKKworLyoqIE1hY3JvIHRvIGxvb2sgdXAgdGhlIGNvcnJlY3QgdHlwZSBmb3IgYSBmaWVsZCAqLworI2RlZmluZSBFWFBFQ1RFRF9UWVBFX09GX0ZJRUxEKGZpZWxkKSAoX2RidXNfaGVhZGVyX2ZpZWxkX3R5cGVzW2ZpZWxkXS50eXBlKQorCisvKiogVGhlIG1vc3QgcGFkZGluZyB3ZSBjb3VsZCBldmVyIG5lZWQgZm9yIGEgaGVhZGVyICovCisjZGVmaW5lIE1BWF9QT1NTSUJMRV9IRUFERVJfUEFERElORyA3CitzdGF0aWMgZGJ1c19ib29sX3QKK3Jlc2VydmVfaGVhZGVyX3BhZGRpbmcgKERCdXNIZWFkZXIgKmhlYWRlcikKK3sKKyAgX2RidXNfYXNzZXJ0IChoZWFkZXItPnBhZGRpbmcgPD0gTUFYX1BPU1NJQkxFX0hFQURFUl9QQURESU5HKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19sZW5ndGhlbiAoJmhlYWRlci0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9QT1NTSUJMRV9IRUFERVJfUEFERElORyAtIGhlYWRlci0+cGFkZGluZykpCisgICAgcmV0dXJuIEZBTFNFOworICBoZWFkZXItPnBhZGRpbmcgPSBNQVhfUE9TU0lCTEVfSEVBREVSX1BBRERJTkc7CisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorY29ycmVjdF9oZWFkZXJfcGFkZGluZyAoREJ1c0hlYWRlciAqaGVhZGVyKQoreworICBpbnQgdW5wYWRkZWRfbGVuOworCisgIF9kYnVzX2Fzc2VydCAoaGVhZGVyLT5wYWRkaW5nID09IDcpOworCisgIF9kYnVzX3N0cmluZ19zaG9ydGVuICgmaGVhZGVyLT5kYXRhLCBoZWFkZXItPnBhZGRpbmcpOworICB1bnBhZGRlZF9sZW4gPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmhlYWRlci0+ZGF0YSk7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYWxpZ25fbGVuZ3RoICgmaGVhZGVyLT5kYXRhLCA4KSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZG4ndCBwYWQgaGVhZGVyIHRob3VnaCBlbm91Z2ggcGFkZGluZyB3YXMgcHJlYWxsb2NhdGVkIik7CisKKyAgaGVhZGVyLT5wYWRkaW5nID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZoZWFkZXItPmRhdGEpIC0gdW5wYWRkZWRfbGVuOworfQorCisvKiogQ29tcHV0ZSB0aGUgZW5kIG9mIHRoZSBoZWFkZXIsIGlnbm9yaW5nIHBhZGRpbmcgKi8KKyNkZWZpbmUgSEVBREVSX0VORF9CRUZPUkVfUEFERElORyhoZWFkZXIpIFwKKyAgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmKGhlYWRlciktPmRhdGEpIC0gKGhlYWRlciktPnBhZGRpbmcpCisKKy8qKgorICogSW52YWxpZGF0ZXMgYWxsIGZpZWxkcyBpbiB0aGUgY2FjaGUuIFRoaXMgbWF5IGJlIHVzZWQgd2hlbiB0aGUKKyAqIGNhY2hlIGlzIHRvdGFsbHkgdW5pbml0aWFsaXplZCAoY29udGFpbnMganVuaykgc28gc2hvdWxkIG5vdAorICogbG9vayBhdCB3aGF0J3MgaW4gdGhlcmUgbm93LgorICoKKyAqIEBwYXJhbSBoZWFkZXIgdGhlIGhlYWRlcgorICovCitzdGF0aWMgdm9pZAorX2RidXNfaGVhZGVyX2NhY2hlX2ludmFsaWRhdGVfYWxsIChEQnVzSGVhZGVyICpoZWFkZXIpCit7CisgIGludCBpOworCisgIGkgPSAwOworICB3aGlsZSAoaSA8PSBEQlVTX0hFQURFUl9GSUVMRF9MQVNUKQorICAgIHsKKyAgICAgIGhlYWRlci0+ZmllbGRzW2ldLnZhbHVlX3BvcyA9IF9EQlVTX0hFQURFUl9GSUVMRF9WQUxVRV9VTktOT1dOOworICAgICAgKytpOworICAgIH0KK30KKworLyoqCisgKiBDYWNoZXMgb25lIGZpZWxkCisgKgorICogQHBhcmFtIGhlYWRlciB0aGUgaGVhZGVyCisgKiBAcGFyYW0gZmllbGRfY29kZSB0aGUgZmllbGQKKyAqIEBwYXJhbSB2YXJpYW50X3JlYWRlciB0aGUgcmVhZGVyIGZvciB0aGUgdmFyaWFudCBpbiB0aGUgZmllbGQKKyAqLworc3RhdGljIHZvaWQKK19kYnVzX2hlYWRlcl9jYWNoZV9vbmUgKERCdXNIZWFkZXIgICAgICpoZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgZmllbGRfY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICp2YXJpYW50X3JlYWRlcikKK3sKKyAgaGVhZGVyLT5maWVsZHNbZmllbGRfY29kZV0udmFsdWVfcG9zID0KKyAgICBfZGJ1c190eXBlX3JlYWRlcl9nZXRfdmFsdWVfcG9zICh2YXJpYW50X3JlYWRlcik7CisKKyNpZiAwCisgIF9kYnVzX3ZlcmJvc2UgKCJjYWNoZWQgdmFsdWVfcG9zICVkIGZvciBmaWVsZCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgaGVhZGVyLT5maWVsZHNbZmllbGRfY29kZV0udmFsdWVfcG9zLCBmaWVsZF9jb2RlKQorI2VuZGlmCit9CisKKy8qKgorICogUmV0dXJucyB0aGUgaGVhZGVyJ3MgYnl0ZSBvcmRlci4KKyAqCisgKiBAcGFyYW0gaGVhZGVyIHRoZSBoZWFkZXIKKyAqIEByZXR1cm5zIHRoZSBieXRlIG9yZGVyCisgKi8KK2NoYXIKK19kYnVzX2hlYWRlcl9nZXRfYnl0ZV9vcmRlciAoY29uc3QgREJ1c0hlYWRlciAqaGVhZGVyKQoreworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmaGVhZGVyLT5kYXRhKSA+IEJZVEVfT1JERVJfT0ZGU0VUKTsKKworICByZXR1cm4gKGNoYXIpIF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoJmhlYWRlci0+ZGF0YSwgQllURV9PUkRFUl9PRkZTRVQpOworfQorCisvKioKKyAqIFJldmFsaWRhdGVzIHRoZSBmaWVsZHMgY2FjaGUKKyAqCisgKiBAcGFyYW0gaGVhZGVyIHRoZSBoZWFkZXIKKyAqLworc3RhdGljIHZvaWQKK19kYnVzX2hlYWRlcl9jYWNoZV9yZXZhbGlkYXRlIChEQnVzSGVhZGVyICpoZWFkZXIpCit7CisgIERCdXNUeXBlUmVhZGVyIGFycmF5OworICBEQnVzVHlwZVJlYWRlciByZWFkZXI7CisgIGludCBpOworCisgIGkgPSAwOworICB3aGlsZSAoaSA8PSBEQlVTX0hFQURFUl9GSUVMRF9MQVNUKQorICAgIHsKKyAgICAgIGhlYWRlci0+ZmllbGRzW2ldLnZhbHVlX3BvcyA9IF9EQlVTX0hFQURFUl9GSUVMRF9WQUxVRV9OT05FWElTVEVOVDsKKyAgICAgICsraTsKKyAgICB9CisKKyAgX2RidXNfdHlwZV9yZWFkZXJfaW5pdCAoJnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfaGVhZGVyX2dldF9ieXRlX29yZGVyIChoZWFkZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmX2RidXNfaGVhZGVyX3NpZ25hdHVyZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZJRUxEU19BUlJBWV9TSUdOQVRVUkVfT0ZGU0VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaGVhZGVyLT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGSUVMRFNfQVJSQVlfTEVOR1RIX09GRlNFVCk7CisKKyAgX2RidXNfdHlwZV9yZWFkZXJfcmVjdXJzZSAoJnJlYWRlciwgJmFycmF5KTsKKworICB3aGlsZSAoX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2N1cnJlbnRfdHlwZSAoJmFycmF5KSAhPSBEQlVTX1RZUEVfSU5WQUxJRCkKKyAgICB7CisgICAgICBEQnVzVHlwZVJlYWRlciBzdWI7CisgICAgICBEQnVzVHlwZVJlYWRlciB2YXJpYW50OworICAgICAgdW5zaWduZWQgY2hhciBmaWVsZF9jb2RlOworCisgICAgICBfZGJ1c190eXBlX3JlYWRlcl9yZWN1cnNlICgmYXJyYXksICZzdWIpOworCisgICAgICBfZGJ1c19hc3NlcnQgKF9kYnVzX3R5cGVfcmVhZGVyX2dldF9jdXJyZW50X3R5cGUgKCZzdWIpID09IERCVVNfVFlQRV9CWVRFKTsKKyAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX3JlYWRfYmFzaWMgKCZzdWIsICZmaWVsZF9jb2RlKTsKKworICAgICAgLyogVW5rbm93biBmaWVsZHMgc2hvdWxkIGJlIGlnbm9yZWQgKi8KKyAgICAgIGlmIChmaWVsZF9jb2RlID4gREJVU19IRUFERVJfRklFTERfTEFTVCkKKyAgICAgICAgZ290byBuZXh0X2ZpZWxkOworCisgICAgICBfZGJ1c190eXBlX3JlYWRlcl9uZXh0ICgmc3ViKTsKKworICAgICAgX2RidXNfYXNzZXJ0IChfZGJ1c190eXBlX3JlYWRlcl9nZXRfY3VycmVudF90eXBlICgmc3ViKSA9PSBEQlVTX1RZUEVfVkFSSUFOVCk7CisgICAgICBfZGJ1c190eXBlX3JlYWRlcl9yZWN1cnNlICgmc3ViLCAmdmFyaWFudCk7CisKKyAgICAgIF9kYnVzX2hlYWRlcl9jYWNoZV9vbmUgKGhlYWRlciwgZmllbGRfY29kZSwgJnZhcmlhbnQpOworCisgICAgbmV4dF9maWVsZDoKKyAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX25leHQgKCZhcnJheSk7CisgICAgfQorfQorCisvKioKKyAqIENoZWNrcyBmb3IgYSBmaWVsZCwgdXBkYXRpbmcgdGhlIGNhY2hlIGlmIHJlcXVpcmVkLgorICoKKyAqIEBwYXJhbSBoZWFkZXIgdGhlIGhlYWRlcgorICogQHBhcmFtIGZpZWxkIHRoZSBmaWVsZCB0byBjaGVjaworICogQHJldHVybnMgI0ZBTFNFIGlmIHRoZSBmaWVsZCBkb2Vzbid0IGV4aXN0CisgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAorX2RidXNfaGVhZGVyX2NhY2hlX2NoZWNrIChEQnVzSGVhZGVyICAgICpoZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgIGZpZWxkKQoreworICBfZGJ1c19hc3NlcnQgKGZpZWxkIDw9IERCVVNfSEVBREVSX0ZJRUxEX0xBU1QpOworCisgIGlmIChoZWFkZXItPmZpZWxkc1tmaWVsZF0udmFsdWVfcG9zID09IF9EQlVTX0hFQURFUl9GSUVMRF9WQUxVRV9VTktOT1dOKQorICAgIF9kYnVzX2hlYWRlcl9jYWNoZV9yZXZhbGlkYXRlIChoZWFkZXIpOworCisgIGlmIChoZWFkZXItPmZpZWxkc1tmaWVsZF0udmFsdWVfcG9zID09IF9EQlVTX0hFQURFUl9GSUVMRF9WQUxVRV9OT05FWElTVEVOVCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogQ2hlY2tzIHdoZXRoZXIgYSBmaWVsZCBpcyBrbm93biBub3QgdG8gZXhpc3QuIEl0IG1heSBleGlzdAorICogZXZlbiBpZiBpdCdzIG5vdCBrbm93biB0byBleGlzdC4KKyAqCisgKiBAcGFyYW0gaGVhZGVyIHRoZSBoZWFkZXIKKyAqIEBwYXJhbSBmaWVsZCB0aGUgZmllbGQgdG8gY2hlY2sKKyAqIEByZXR1cm5zICNGQUxTRSBpZiB0aGUgZmllbGQgZGVmaW5pdGVseSBkb2Vzbid0IGV4aXN0CisgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAorX2RidXNfaGVhZGVyX2NhY2hlX2tub3duX25vbmV4aXN0ZW50IChEQnVzSGVhZGVyICAgICpoZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgIGZpZWxkKQoreworICBfZGJ1c19hc3NlcnQgKGZpZWxkIDw9IERCVVNfSEVBREVSX0ZJRUxEX0xBU1QpOworCisgIHJldHVybiAoaGVhZGVyLT5maWVsZHNbZmllbGRdLnZhbHVlX3BvcyA9PSBfREJVU19IRUFERVJfRklFTERfVkFMVUVfTk9ORVhJU1RFTlQpOworfQorCisvKioKKyAqIFdyaXRlcyBhIHN0cnVjdCBvZiB7IGJ5dGUsIHZhcmlhbnQgfSB3aXRoIHRoZSBnaXZlbiBiYXNpYyB0eXBlLgorICoKKyAqIEBwYXJhbSB3cml0ZXIgdGhlIHdyaXRlciAoc2hvdWxkIGJlIHJlYWR5IHRvIHdyaXRlIGEgc3RydWN0KQorICogQHBhcmFtIGZpZWxkIHRoZSBoZWFkZXIgZmllbGQKKyAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlIG9mIHRoZSB2YWx1ZQorICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSBhcyBmb3IgX2RidXNfbWFyc2hhbF9zZXRfYmFzaWMoKQorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vIG1lbW9yeQorICovCitzdGF0aWMgZGJ1c19ib29sX3QKK3dyaXRlX2Jhc2ljX2ZpZWxkIChEQnVzVHlwZVdyaXRlciAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgdHlwZSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICAgICAqdmFsdWUpCit7CisgIERCdXNUeXBlV3JpdGVyIHN1YjsKKyAgREJ1c1R5cGVXcml0ZXIgdmFyaWFudDsKKyAgaW50IHN0YXJ0OworICBpbnQgcGFkZGluZzsKKyAgdW5zaWduZWQgY2hhciBmaWVsZF9ieXRlOworICBEQnVzU3RyaW5nIGNvbnRhaW5lZF90eXBlOworICBjaGFyIGJ1ZlsyXTsKKworICBzdGFydCA9IHdyaXRlci0+dmFsdWVfcG9zOworICBwYWRkaW5nID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHdyaXRlci0+dmFsdWVfc3RyKSAtIHN0YXJ0OworCisgIGlmICghX2RidXNfdHlwZV93cml0ZXJfcmVjdXJzZSAod3JpdGVyLCBEQlVTX1RZUEVfU1RSVUNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDAsICZzdWIpKQorICAgIGdvdG8gYXBwZW5kX2ZhaWxlZDsKKworICBmaWVsZF9ieXRlID0gZmllbGQ7CisgIGlmICghX2RidXNfdHlwZV93cml0ZXJfd3JpdGVfYmFzaWMgKCZzdWIsIERCVVNfVFlQRV9CWVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfYnl0ZSkpCisgICAgZ290byBhcHBlbmRfZmFpbGVkOworCisgIGJ1ZlswXSA9IHR5cGU7CisgIGJ1ZlsxXSA9ICdcMCc7CisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0X2xlbiAoJmNvbnRhaW5lZF90eXBlLCBidWYsIDEpOworCisgIGlmICghX2RidXNfdHlwZV93cml0ZXJfcmVjdXJzZSAoJnN1YiwgREJVU19UWVBFX1ZBUklBTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbnRhaW5lZF90eXBlLCAwLCAmdmFyaWFudCkpCisgICAgZ290byBhcHBlbmRfZmFpbGVkOworCisgIGlmICghX2RidXNfdHlwZV93cml0ZXJfd3JpdGVfYmFzaWMgKCZ2YXJpYW50LCB0eXBlLCB2YWx1ZSkpCisgICAgZ290byBhcHBlbmRfZmFpbGVkOworCisgIGlmICghX2RidXNfdHlwZV93cml0ZXJfdW5yZWN1cnNlICgmc3ViLCAmdmFyaWFudCkpCisgICAgZ290byBhcHBlbmRfZmFpbGVkOworCisgIGlmICghX2RidXNfdHlwZV93cml0ZXJfdW5yZWN1cnNlICh3cml0ZXIsICZzdWIpKQorICAgIGdvdG8gYXBwZW5kX2ZhaWxlZDsKKworICByZXR1cm4gVFJVRTsKKworIGFwcGVuZF9mYWlsZWQ6CisgIF9kYnVzX3N0cmluZ19kZWxldGUgKHdyaXRlci0+dmFsdWVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHdyaXRlci0+dmFsdWVfc3RyKSAtIHN0YXJ0IC0gcGFkZGluZyk7CisgIHJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBTZXRzIGEgc3RydWN0IG9mIHsgYnl0ZSwgdmFyaWFudCB9IHdpdGggdGhlIGdpdmVuIGJhc2ljIHR5cGUuCisgKgorICogQHBhcmFtIHJlYWRlciB0aGUgcmVhZGVyIChzaG91bGQgYmUgaXRlcmF0aW5nIG92ZXIgdGhlIGFycmF5IHBvaW50aW5nIGF0IHRoZSBmaWVsZCB0byBzZXQpCisgKiBAcGFyYW0gZmllbGQgdGhlIGhlYWRlciBmaWVsZAorICogQHBhcmFtIHR5cGUgdGhlIHR5cGUgb2YgdGhlIHZhbHVlCisgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIGFzIGZvciBfZGJ1c19tYXJzaGFsX3NldF9iYXNpYygpCisgKiBAcGFyYW0gcmVhbGlnbl9yb290IHdoZXJlIHRvIHJlYWxpZ24gZnJvbQorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vIG1lbW9yeQorICovCitzdGF0aWMgZGJ1c19ib29sX3QKK3NldF9iYXNpY19maWVsZCAoREJ1c1R5cGVSZWFkZXIgICAgICAgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgIGZpZWxkLAorICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgdHlwZSwKKyAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAgICAgICAgICAgKnZhbHVlLAorICAgICAgICAgICAgICAgICBjb25zdCBEQnVzVHlwZVJlYWRlciAqcmVhbGlnbl9yb290KQoreworICBEQnVzVHlwZVJlYWRlciBzdWI7CisgIERCdXNUeXBlUmVhZGVyIHZhcmlhbnQ7CisKKyAgX2RidXNfdHlwZV9yZWFkZXJfcmVjdXJzZSAocmVhZGVyLCAmc3ViKTsKKworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3R5cGVfcmVhZGVyX2dldF9jdXJyZW50X3R5cGUgKCZzdWIpID09IERCVVNfVFlQRV9CWVRFKTsKKyNpZm5kZWYgREJVU19ESVNBQkxFX0FTU0VSVAorIHsKKyAgIHVuc2lnbmVkIGNoYXIgdl9CWVRFOworICAgX2RidXNfdHlwZV9yZWFkZXJfcmVhZF9iYXNpYyAoJnN1YiwgJnZfQllURSk7CisgICBfZGJ1c19hc3NlcnQgKCgoaW50KSB2X0JZVEUpID09IGZpZWxkKTsKKyB9CisjZW5kaWYKKworICBpZiAoIV9kYnVzX3R5cGVfcmVhZGVyX25leHQgKCZzdWIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIHZhcmlhbnQgZmllbGQ/Iik7CisKKyAgX2RidXNfdHlwZV9yZWFkZXJfcmVjdXJzZSAoJnN1YiwgJnZhcmlhbnQpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3R5cGVfcmVhZGVyX2dldF9jdXJyZW50X3R5cGUgKCZ2YXJpYW50KSA9PSB0eXBlKTsKKworICBpZiAoIV9kYnVzX3R5cGVfcmVhZGVyX3NldF9iYXNpYyAoJnZhcmlhbnQsIHZhbHVlLCByZWFsaWduX3Jvb3QpKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBHZXRzIHRoZSB0eXBlIG9mIHRoZSBtZXNzYWdlLgorICoKKyAqIEBwYXJhbSBoZWFkZXIgdGhlIGhlYWRlcgorICogQHJldHVybnMgdGhlIHR5cGUKKyAqLworaW50CitfZGJ1c19oZWFkZXJfZ2V0X21lc3NhZ2VfdHlwZSAoREJ1c0hlYWRlciAqaGVhZGVyKQoreworICBpbnQgdHlwZTsKKworICB0eXBlID0gX2RidXNfc3RyaW5nX2dldF9ieXRlICgmaGVhZGVyLT5kYXRhLCBUWVBFX09GRlNFVCk7CisgIF9kYnVzX2Fzc2VydCAodHlwZSAhPSBEQlVTX01FU1NBR0VfVFlQRV9JTlZBTElEKTsKKworICByZXR1cm4gdHlwZTsKK30KKworLyoqCisgKiBTZXRzIHRoZSBzZXJpYWwgbnVtYmVyIG9mIGEgaGVhZGVyLiAgVGhpcyBjYW4gb25seSBiZSBkb25lIG9uY2Ugb24KKyAqIGEgaGVhZGVyLgorICoKKyAqIEBwYXJhbSBoZWFkZXIgdGhlIGhlYWRlcgorICogQHBhcmFtIHNlcmlhbCB0aGUgc2VyaWFsCisgKi8KK3ZvaWQKK19kYnVzX2hlYWRlcl9zZXRfc2VyaWFsIChEQnVzSGVhZGVyICAgICpoZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgc2VyaWFsKQoreworICAvKiB3ZSB1c2UgdGhpcyBmdW5jdGlvbiB0byBzZXQgdGhlIHNlcmlhbCBvbiBvdXRnb2luZworICAgKiBtZXNzYWdlcywgYW5kIHRvIHJlc2V0IHRoZSBzZXJpYWwgaW4gZGJ1c19tZXNzYWdlX2NvcHk7CisgICAqIHRoaXMgYXNzZXJ0aW9uIHNob3VsZCBjYXRjaCBhIGRvdWJsZS1zZXQgb24gb3V0Z29pbmcuCisgICAqLworICBfZGJ1c19hc3NlcnQgKF9kYnVzX2hlYWRlcl9nZXRfc2VyaWFsIChoZWFkZXIpID09IDAgfHwKKyAgICAgICAgICAgICAgICBzZXJpYWwgPT0gMCk7CisKKyAgX2RidXNfbWFyc2hhbF9zZXRfdWludDMyICgmaGVhZGVyLT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFUklBTF9PRkZTRVQsCisJCQkgICAgc2VyaWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX2hlYWRlcl9nZXRfYnl0ZV9vcmRlciAoaGVhZGVyKSk7Cit9CisKKy8qKgorICogU2VlIGRidXNfbWVzc2FnZV9nZXRfc2VyaWFsKCkKKyAqCisgKiBAcGFyYW0gaGVhZGVyIHRoZSBoZWFkZXIKKyAqIEByZXR1cm5zIHRoZSBjbGllbnQgc2VyaWFsCisgKi8KK2RidXNfdWludDMyX3QKK19kYnVzX2hlYWRlcl9nZXRfc2VyaWFsIChEQnVzSGVhZGVyICpoZWFkZXIpCit7CisgIHJldHVybiBfZGJ1c19tYXJzaGFsX3JlYWRfdWludDMyICgmaGVhZGVyLT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VSSUFMX09GRlNFVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX2hlYWRlcl9nZXRfYnl0ZV9vcmRlciAoaGVhZGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworfQorCisvKioKKyAqIFJlLWluaXRpYWxpemVzIGEgaGVhZGVyIHRoYXQgd2FzIHByZXZpb3VzbHkgaW5pdGlhbGl6ZWQgYW5kIG5ldmVyCisgKiBmcmVlZC4gIEFmdGVyIHRoaXMsIHRvIG1ha2UgdGhlIGhlYWRlciB2YWxpZCB5b3UgaGF2ZSB0byBjYWxsCisgKiBfZGJ1c19oZWFkZXJfY3JlYXRlKCkuCisgKgorICogQHBhcmFtIGhlYWRlciBoZWFkZXIgdG8gcmUtaW5pdGlhbGl6ZQorICovCit2b2lkCitfZGJ1c19oZWFkZXJfcmVpbml0IChEQnVzSGVhZGVyICpoZWFkZXIpCit7CisgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoICgmaGVhZGVyLT5kYXRhLCAwKTsKKworICBoZWFkZXItPnBhZGRpbmcgPSAwOworCisgIF9kYnVzX2hlYWRlcl9jYWNoZV9pbnZhbGlkYXRlX2FsbCAoaGVhZGVyKTsKK30KKworLyoqCisgKiBJbml0aWFsaXplcyBhIGhlYWRlciwgYnV0IGRvZXNuJ3QgcHJlcGFyZSBpdCBmb3IgdXNlOworICogdG8gbWFrZSB0aGUgaGVhZGVyIHZhbGlkLCB5b3UgaGF2ZSB0byBjYWxsIF9kYnVzX2hlYWRlcl9jcmVhdGUoKS4KKyAqCisgKiBAcGFyYW0gaGVhZGVyIGhlYWRlciB0byBpbml0aWFsaXplCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm90IGVub3VnaCBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2hlYWRlcl9pbml0IChEQnVzSGVhZGVyICpoZWFkZXIpCit7CisgIGlmICghX2RidXNfc3RyaW5nX2luaXRfcHJlYWxsb2NhdGVkICgmaGVhZGVyLT5kYXRhLCAzMikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIF9kYnVzX2hlYWRlcl9yZWluaXQgKGhlYWRlcik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogRnJlZXMgYSBoZWFkZXIuCisgKgorICogQHBhcmFtIGhlYWRlciB0aGUgaGVhZGVyCisgKi8KK3ZvaWQKK19kYnVzX2hlYWRlcl9mcmVlIChEQnVzSGVhZGVyICpoZWFkZXIpCit7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmaGVhZGVyLT5kYXRhKTsKK30KKworLyoqCisgKiBJbml0aWFsaXplcyBkZXN0IHdpdGggYSBjb3B5IG9mIHRoZSBnaXZlbiBoZWFkZXIuCisgKiBSZXNldHMgdGhlIG1lc3NhZ2Ugc2VyaWFsIHRvIDAgb24gdGhlIGNvcHkuCisgKgorICogQHBhcmFtIGhlYWRlciBoZWFkZXIgdG8gY29weQorICogQHBhcmFtIGRlc3QgZGVzdGluYXRpb24gZm9yIGNvcHkKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBub3QgZW5vdWdoIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfaGVhZGVyX2NvcHkgKGNvbnN0IERCdXNIZWFkZXIgKmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICBEQnVzSGVhZGVyICAgICAgICpkZXN0KQoreworICAqZGVzdCA9ICpoZWFkZXI7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdF9wcmVhbGxvY2F0ZWQgKCZkZXN0LT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZoZWFkZXItPmRhdGEpKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAoJmhlYWRlci0+ZGF0YSwgMCwgJmRlc3QtPmRhdGEsIDApKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmZGVzdC0+ZGF0YSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIC8qIFJlc2V0IHRoZSBzZXJpYWwgKi8KKyAgX2RidXNfaGVhZGVyX3NldF9zZXJpYWwgKGRlc3QsIDApOworCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIEZpbGxzIGluIHRoZSBwcmltYXJ5IGZpZWxkcyBvZiB0aGUgaGVhZGVyLCBzbyB0aGUgaGVhZGVyIGlzIHJlYWR5CisgKiBmb3IgdXNlLiAjTlVMTCBtYXkgYmUgc3BlY2lmaWVkIGZvciBzb21lIG9yIGFsbCBvZiB0aGUgZmllbGRzIHRvCisgKiBhdm9pZCBhZGRpbmcgdGhvc2UgZmllbGRzLiBTb21lIGNvbWJpbmF0aW9ucyBvZiBmaWVsZHMgZG9uJ3QgbWFrZQorICogc2Vuc2UsIGFuZCBwYXNzaW5nIHRoZW0gaW4gd2lsbCB0cmlnZ2VyIGFuIGFzc2VydGlvbiBmYWlsdXJlLgorICoKKyAqIEBwYXJhbSBoZWFkZXIgdGhlIGhlYWRlcgorICogQHBhcmFtIGJ5dGVfb3JkZXIgYnl0ZSBvcmRlciBvZiB0aGUgaGVhZGVyCisgKiBAcGFyYW0gbWVzc2FnZV90eXBlIHRoZSBtZXNzYWdlIHR5cGUKKyAqIEBwYXJhbSBkZXN0aW5hdGlvbiBkZXN0aW5hdGlvbiBmaWVsZCBvciAjTlVMTAorICogQHBhcmFtIHBhdGggcGF0aCBmaWVsZCBvciAjTlVMTAorICogQHBhcmFtIGludGVyZmFjZSBpbnRlcmZhY2UgZmllbGQgb3IgI05VTEwKKyAqIEBwYXJhbSBtZW1iZXIgbWVtYmVyIGZpZWxkIG9yICNOVUxMCisgKiBAcGFyYW0gZXJyb3JfbmFtZSBlcnJvciBuYW1lIG9yICNOVUxMCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm90IGVub3VnaCBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2hlYWRlcl9jcmVhdGUgKERCdXNIZWFkZXIgICpoZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICBtZXNzYWdlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAqZGVzdGluYXRpb24sCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAqcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICppbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAqbWVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgKmVycm9yX25hbWUpCit7CisgIHVuc2lnbmVkIGNoYXIgdl9CWVRFOworICBkYnVzX3VpbnQzMl90IHZfVUlOVDMyOworICBEQnVzVHlwZVdyaXRlciB3cml0ZXI7CisgIERCdXNUeXBlV3JpdGVyIGFycmF5OworCisgIF9kYnVzX2Fzc2VydCAoYnl0ZV9vcmRlciA9PSBEQlVTX0xJVFRMRV9FTkRJQU4gfHwKKyAgICAgICAgICAgICAgICBieXRlX29yZGVyID09IERCVVNfQklHX0VORElBTik7CisgIF9kYnVzX2Fzc2VydCAoKChpbnRlcmZhY2UgfHwgbWVzc2FnZV90eXBlICE9IERCVVNfTUVTU0FHRV9UWVBFX1NJR05BTCkgJiYgbWVtYmVyKSB8fAorICAgICAgICAgICAgICAgIChlcnJvcl9uYW1lKSB8fAorICAgICAgICAgICAgICAgICEoaW50ZXJmYWNlIHx8IG1lbWJlciB8fCBlcnJvcl9uYW1lKSk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZoZWFkZXItPmRhdGEpID09IDApOworCisgIGlmICghcmVzZXJ2ZV9oZWFkZXJfcGFkZGluZyAoaGVhZGVyKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgX2RidXNfdHlwZV93cml0ZXJfaW5pdF92YWx1ZXNfb25seSAoJndyaXRlciwgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJl9kYnVzX2hlYWRlcl9zaWduYXR1cmVfc3RyLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaGVhZGVyLT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIRUFERVJfRU5EX0JFRk9SRV9QQURESU5HIChoZWFkZXIpKTsKKworICB2X0JZVEUgPSBieXRlX29yZGVyOworICBpZiAoIV9kYnVzX3R5cGVfd3JpdGVyX3dyaXRlX2Jhc2ljICgmd3JpdGVyLCBEQlVTX1RZUEVfQllURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZfQllURSkpCisgICAgZ290byBvb207CisKKyAgdl9CWVRFID0gbWVzc2FnZV90eXBlOworICBpZiAoIV9kYnVzX3R5cGVfd3JpdGVyX3dyaXRlX2Jhc2ljICgmd3JpdGVyLCBEQlVTX1RZUEVfQllURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZfQllURSkpCisgICAgZ290byBvb207CisKKyAgdl9CWVRFID0gMDsgLyogZmxhZ3MgKi8KKyAgaWYgKCFfZGJ1c190eXBlX3dyaXRlcl93cml0ZV9iYXNpYyAoJndyaXRlciwgREJVU19UWVBFX0JZVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2X0JZVEUpKQorICAgIGdvdG8gb29tOworCisgIHZfQllURSA9IERCVVNfTUFKT1JfUFJPVE9DT0xfVkVSU0lPTjsKKyAgaWYgKCFfZGJ1c190eXBlX3dyaXRlcl93cml0ZV9iYXNpYyAoJndyaXRlciwgREJVU19UWVBFX0JZVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2X0JZVEUpKQorICAgIGdvdG8gb29tOworCisgIHZfVUlOVDMyID0gMDsgLyogYm9keSBsZW5ndGggKi8KKyAgaWYgKCFfZGJ1c190eXBlX3dyaXRlcl93cml0ZV9iYXNpYyAoJndyaXRlciwgREJVU19UWVBFX1VJTlQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZfVUlOVDMyKSkKKyAgICBnb3RvIG9vbTsKKworICB2X1VJTlQzMiA9IDA7IC8qIHNlcmlhbCAqLworICBpZiAoIV9kYnVzX3R5cGVfd3JpdGVyX3dyaXRlX2Jhc2ljICgmd3JpdGVyLCBEQlVTX1RZUEVfVUlOVDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdl9VSU5UMzIpKQorICAgIGdvdG8gb29tOworCisgIGlmICghX2RidXNfdHlwZV93cml0ZXJfcmVjdXJzZSAoJndyaXRlciwgREJVU19UWVBFX0FSUkFZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZfZGJ1c19oZWFkZXJfc2lnbmF0dXJlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSUVMRFNfQVJSQVlfU0lHTkFUVVJFX09GRlNFVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXJyYXkpKQorICAgIGdvdG8gb29tOworCisgIC8qIE1hcnNoYWwgYWxsIHRoZSBmaWVsZHMgKE1hcnNoYWxsIEZpZWxkcz8pICovCisKKyAgaWYgKHBhdGggIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoIXdyaXRlX2Jhc2ljX2ZpZWxkICgmYXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0hFQURFUl9GSUVMRF9QQVRILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX09CSkVDVF9QQVRILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhdGgpKQorICAgICAgICBnb3RvIG9vbTsKKyAgICB9CisKKyAgaWYgKGRlc3RpbmF0aW9uICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKCF3cml0ZV9iYXNpY19maWVsZCAoJmFycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19IRUFERVJfRklFTERfREVTVElOQVRJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc3RpbmF0aW9uKSkKKyAgICAgICAgZ290byBvb207CisgICAgfQorCisgIGlmIChpbnRlcmZhY2UgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoIXdyaXRlX2Jhc2ljX2ZpZWxkICgmYXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0hFQURFUl9GSUVMRF9JTlRFUkZBQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmludGVyZmFjZSkpCisgICAgICAgIGdvdG8gb29tOworICAgIH0KKworICBpZiAobWVtYmVyICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKCF3cml0ZV9iYXNpY19maWVsZCAoJmFycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19IRUFERVJfRklFTERfTUVNQkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZW1iZXIpKQorICAgICAgICBnb3RvIG9vbTsKKyAgICB9CisKKyAgaWYgKGVycm9yX25hbWUgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoIXdyaXRlX2Jhc2ljX2ZpZWxkICgmYXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0hFQURFUl9GSUVMRF9FUlJPUl9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcl9uYW1lKSkKKyAgICAgICAgZ290byBvb207CisgICAgfQorCisgIGlmICghX2RidXNfdHlwZV93cml0ZXJfdW5yZWN1cnNlICgmd3JpdGVyLCAmYXJyYXkpKQorICAgIGdvdG8gb29tOworCisgIGNvcnJlY3RfaGVhZGVyX3BhZGRpbmcgKGhlYWRlcik7CisKKyAgcmV0dXJuIFRSVUU7CisKKyBvb206CisgIF9kYnVzX3N0cmluZ19kZWxldGUgKCZoZWFkZXItPmRhdGEsIDAsCisgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmaGVhZGVyLT5kYXRhKSAtIGhlYWRlci0+cGFkZGluZyk7CisgIGNvcnJlY3RfaGVhZGVyX3BhZGRpbmcgKGhlYWRlcik7CisKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKioKKyAqIEdpdmVuIGRhdGEgbG9uZyBlbm91Z2ggdG8gY29udGFpbiB0aGUgbGVuZ3RoIG9mIHRoZSBtZXNzYWdlIGJvZHkKKyAqIGFuZCB0aGUgZmllbGRzIGFycmF5LCBjaGVjayB3aGV0aGVyIHRoZSBkYXRhIGlzIGxvbmcgZW5vdWdoIHRvCisgKiBjb250YWluIHRoZSBlbnRpcmUgbWVzc2FnZSAoYXNzdW1pbmcgdGhlIGNsYWltZWQgbGVuZ3RocyBhcmUKKyAqIGFjY3VyYXRlKS4gQWxzbyBjaGVja3MgdGhhdCB0aGUgbGVuZ3RocyBhcmUgaW4gc2FuaXR5IHBhcmFtZXRlcnMuCisgKgorICogQHBhcmFtIG1heF9tZXNzYWdlX2xlbmd0aCBtYXhpbXVtIGxlbmd0aCBvZiBhIHZhbGlkIG1lc3NhZ2UKKyAqIEBwYXJhbSB2YWxpZGl0eSByZXR1cm4gbG9jYXRpb24gZm9yIHdoeSB0aGUgZGF0YSBpcyBpbnZhbGlkIGlmIGl0IGlzCisgKiBAcGFyYW0gYnl0ZV9vcmRlciByZXR1cm4gbG9jYXRpb24gZm9yIGJ5dGUgb3JkZXIKKyAqIEBwYXJhbSBmaWVsZHNfYXJyYXlfbGVuIHJldHVybiBsb2NhdGlvbiBmb3IgY2xhaW1lZCBmaWVsZHMgYXJyYXkgbGVuZ3RoCisgKiBAcGFyYW0gaGVhZGVyX2xlbiByZXR1cm4gbG9jYXRpb24gZm9yIGNsYWltZWQgaGVhZGVyIGxlbmd0aAorICogQHBhcmFtIGJvZHlfbGVuIHJldHVybiBsb2NhdGlvbiBmb3IgY2xhaW1lZCBib2R5IGxlbmd0aAorICogQHBhcmFtIHN0ciB0aGUgZGF0YQorICogQHBhcmFtIHN0YXJ0IHN0YXJ0IG9mIGRhdGEsIDgtYWxpZ25lZAorICogQHBhcmFtIGxlbiBsZW5ndGggb2YgZGF0YQorICogQHJldHVybnMgI1RSVUUgaWYgdGhlIGRhdGEgaXMgbG9uZyBlbm91Z2ggZm9yIHRoZSBjbGFpbWVkIGxlbmd0aCwgYW5kIHRoZSBsZW5ndGhzIHdlcmUgdmFsaWQKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2hlYWRlcl9oYXZlX21lc3NhZ2VfdW50cnVzdGVkIChpbnQgICAgICAgICAgICAgICAgbWF4X21lc3NhZ2VfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNWYWxpZGl0eSAgICAgICp2YWxpZGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAqYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAqZmllbGRzX2FycmF5X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAqaGVhZGVyX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAqYm9keV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGxlbikKKworeworICBkYnVzX3VpbnQzMl90IGhlYWRlcl9sZW5fdW5zaWduZWQ7CisgIGRidXNfdWludDMyX3QgZmllbGRzX2FycmF5X2xlbl91bnNpZ25lZDsKKyAgZGJ1c191aW50MzJfdCBib2R5X2xlbl91bnNpZ25lZDsKKworICBfZGJ1c19hc3NlcnQgKHN0YXJ0ID49IDApOworICBfZGJ1c19hc3NlcnQgKHN0YXJ0IDwgX0RCVVNfSU5UMzJfTUFYIC8gMik7CisgIF9kYnVzX2Fzc2VydCAobGVuID49IDApOworCisgIF9kYnVzX2Fzc2VydCAoc3RhcnQgPT0gKGludCkgX0RCVVNfQUxJR05fVkFMVUUgKHN0YXJ0LCA4KSk7CisKKyAgKmJ5dGVfb3JkZXIgPSBfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKHN0ciwgc3RhcnQgKyBCWVRFX09SREVSX09GRlNFVCk7CisKKyAgaWYgKCpieXRlX29yZGVyICE9IERCVVNfTElUVExFX0VORElBTiAmJiAqYnl0ZV9vcmRlciAhPSBEQlVTX0JJR19FTkRJQU4pCisgICAgeworICAgICAgKnZhbGlkaXR5ID0gREJVU19JTlZBTElEX0JBRF9CWVRFX09SREVSOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBfZGJ1c19hc3NlcnQgKEZJRUxEU19BUlJBWV9MRU5HVEhfT0ZGU0VUICsgNCA8PSBsZW4pOworICBmaWVsZHNfYXJyYXlfbGVuX3Vuc2lnbmVkID0gX2RidXNfbWFyc2hhbF9yZWFkX3VpbnQzMiAoc3RyLCBzdGFydCArIEZJRUxEU19BUlJBWV9MRU5HVEhfT0ZGU0VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ5dGVfb3JkZXIsIE5VTEwpOworCisgIGlmIChmaWVsZHNfYXJyYXlfbGVuX3Vuc2lnbmVkID4gKHVuc2lnbmVkKSBtYXhfbWVzc2FnZV9sZW5ndGgpCisgICAgeworICAgICAgKnZhbGlkaXR5ID0gREJVU19JTlZBTElEX0lOU0FORV9GSUVMRFNfQVJSQVlfTEVOR1RIOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBfZGJ1c19hc3NlcnQgKEJPRFlfTEVOR1RIX09GRlNFVCArIDQgPCBsZW4pOworICBib2R5X2xlbl91bnNpZ25lZCA9IF9kYnVzX21hcnNoYWxfcmVhZF91aW50MzIgKHN0ciwgc3RhcnQgKyBCT0RZX0xFTkdUSF9PRkZTRVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ5dGVfb3JkZXIsIE5VTEwpOworCisgIGlmIChib2R5X2xlbl91bnNpZ25lZCA+ICh1bnNpZ25lZCkgbWF4X21lc3NhZ2VfbGVuZ3RoKQorICAgIHsKKyAgICAgICp2YWxpZGl0eSA9IERCVVNfSU5WQUxJRF9JTlNBTkVfQk9EWV9MRU5HVEg7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGhlYWRlcl9sZW5fdW5zaWduZWQgPSBGSVJTVF9GSUVMRF9PRkZTRVQgKyBmaWVsZHNfYXJyYXlfbGVuX3Vuc2lnbmVkOworICBoZWFkZXJfbGVuX3Vuc2lnbmVkID0gX0RCVVNfQUxJR05fVkFMVUUgKGhlYWRlcl9sZW5fdW5zaWduZWQsIDgpOworCisgIC8qIG92ZXJmbG93IHNob3VsZCBiZSBpbXBvc3NpYmxlIHNpbmNlIHRoZSBsZW5ndGhzIGFyZW4ndCBhbGxvd2VkIHRvCisgICAqIGJlIGh1Z2UuCisgICAqLworICBfZGJ1c19hc3NlcnQgKG1heF9tZXNzYWdlX2xlbmd0aCA8IF9EQlVTX0lOVDMyX01BWCAvIDIpOworICBpZiAoYm9keV9sZW5fdW5zaWduZWQgKyBoZWFkZXJfbGVuX3Vuc2lnbmVkID4gKHVuc2lnbmVkKSBtYXhfbWVzc2FnZV9sZW5ndGgpCisgICAgeworICAgICAgKnZhbGlkaXR5ID0gREJVU19JTlZBTElEX01FU1NBR0VfVE9PX0xPTkc7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIF9kYnVzX2Fzc2VydCAoYm9keV9sZW5fdW5zaWduZWQgPCAodW5zaWduZWQpIF9EQlVTX0lOVDMyX01BWCk7CisgIF9kYnVzX2Fzc2VydCAoZmllbGRzX2FycmF5X2xlbl91bnNpZ25lZCA8ICh1bnNpZ25lZCkgX0RCVVNfSU5UMzJfTUFYKTsKKyAgX2RidXNfYXNzZXJ0IChoZWFkZXJfbGVuX3Vuc2lnbmVkIDwgKHVuc2lnbmVkKSBfREJVU19JTlQzMl9NQVgpOworCisgICpib2R5X2xlbiA9IGJvZHlfbGVuX3Vuc2lnbmVkOworICAqZmllbGRzX2FycmF5X2xlbiA9IGZpZWxkc19hcnJheV9sZW5fdW5zaWduZWQ7CisgICpoZWFkZXJfbGVuID0gaGVhZGVyX2xlbl91bnNpZ25lZDsKKworICAqdmFsaWRpdHkgPSBEQlVTX1ZBTElEOworCisgIF9kYnVzX3ZlcmJvc2UgKCJoYXZlICVkIGJ5dGVzLCBuZWVkIGJvZHkgJXUgKyBoZWFkZXIgJXUgPSAldVxuIiwKKyAgICAgICAgICAgICAgICAgbGVuLCBib2R5X2xlbl91bnNpZ25lZCwgaGVhZGVyX2xlbl91bnNpZ25lZCwKKyAgICAgICAgICAgICAgICAgYm9keV9sZW5fdW5zaWduZWQgKyBoZWFkZXJfbGVuX3Vuc2lnbmVkKTsKKworICByZXR1cm4gKGJvZHlfbGVuX3Vuc2lnbmVkICsgaGVhZGVyX2xlbl91bnNpZ25lZCkgPD0gKHVuc2lnbmVkKSBsZW47Cit9CisKK3N0YXRpYyBEQnVzVmFsaWRpdHkKK2NoZWNrX21hbmRhdG9yeV9maWVsZHMgKERCdXNIZWFkZXIgKmhlYWRlcikKK3sKKyNkZWZpbmUgUkVRVUlSRV9GSUVMRChuYW1lKSBkbyB7IGlmIChoZWFkZXItPmZpZWxkc1tEQlVTX0hFQURFUl9GSUVMRF8jI25hbWVdLnZhbHVlX3BvcyA8IDApIHJldHVybiBEQlVTX0lOVkFMSURfTUlTU0lOR18jI25hbWU7IH0gd2hpbGUgKDApCisKKyAgc3dpdGNoIChfZGJ1c19oZWFkZXJfZ2V0X21lc3NhZ2VfdHlwZSAoaGVhZGVyKSkKKyAgICB7CisgICAgY2FzZSBEQlVTX01FU1NBR0VfVFlQRV9TSUdOQUw6CisgICAgICBSRVFVSVJFX0ZJRUxEIChJTlRFUkZBQ0UpOworICAgICAgLyogRkFMTCBUSFJVIC0gc2lnbmFscyBhbHNvIHJlcXVpcmUgdGhlIHBhdGggYW5kIG1lbWJlciAqLworICAgIGNhc2UgREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX0NBTEw6CisgICAgICBSRVFVSVJFX0ZJRUxEIChQQVRIKTsKKyAgICAgIFJFUVVJUkVfRklFTEQgKE1FTUJFUik7CisgICAgICBicmVhazsKKyAgICBjYXNlIERCVVNfTUVTU0FHRV9UWVBFX0VSUk9SOgorICAgICAgUkVRVUlSRV9GSUVMRCAoRVJST1JfTkFNRSk7CisgICAgICBSRVFVSVJFX0ZJRUxEIChSRVBMWV9TRVJJQUwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfUkVUVVJOOgorICAgICAgUkVRVUlSRV9GSUVMRCAoUkVQTFlfU0VSSUFMKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAvKiBvdGhlciBtZXNzYWdlIHR5cGVzIGFsbG93ZWQgYnV0IGlnbm9yZWQgKi8KKyAgICAgIGJyZWFrOworICAgIH0KKworICByZXR1cm4gREJVU19WQUxJRDsKK30KKworc3RhdGljIERCdXNWYWxpZGl0eQorbG9hZF9hbmRfdmFsaWRhdGVfZmllbGQgKERCdXNIZWFkZXIgICAgICpoZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICp2YXJpYW50X3JlYWRlcikKK3sKKyAgaW50IHR5cGU7CisgIGludCBleHBlY3RlZF90eXBlOworICBjb25zdCBEQnVzU3RyaW5nICp2YWx1ZV9zdHI7CisgIGludCB2YWx1ZV9wb3M7CisgIGludCBzdHJfZGF0YV9wb3M7CisgIGRidXNfdWludDMyX3Qgdl9VSU5UMzI7CisgIGludCBiYWRfc3RyaW5nX2NvZGU7CisgIGRidXNfYm9vbF90ICgqIHN0cmluZ192YWxpZGF0aW9uX2Z1bmMpIChjb25zdCBEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQsIGludCBsZW4pOworCisgIC8qIFN1cHBvc2VkIHRvIGhhdmUgYmVlbiBjaGVja2VkIGFscmVhZHkgKi8KKyAgX2RidXNfYXNzZXJ0IChmaWVsZCA8PSBEQlVTX0hFQURFUl9GSUVMRF9MQVNUKTsKKyAgX2RidXNfYXNzZXJ0IChmaWVsZCAhPSBEQlVTX0hFQURFUl9GSUVMRF9JTlZBTElEKTsKKworICAvKiBCZWZvcmUgd2UgY2FuIGNhY2hlIGEgZmllbGQsIHdlIG5lZWQgdG8ga25vdyBpdCBoYXMgdGhlIHJpZ2h0IHR5cGUgKi8KKyAgdHlwZSA9IF9kYnVzX3R5cGVfcmVhZGVyX2dldF9jdXJyZW50X3R5cGUgKHZhcmlhbnRfcmVhZGVyKTsKKworICBfZGJ1c19hc3NlcnQgKF9kYnVzX2hlYWRlcl9maWVsZF90eXBlc1tmaWVsZF0uY29kZSA9PSBmaWVsZCk7CisKKyAgZXhwZWN0ZWRfdHlwZSA9IEVYUEVDVEVEX1RZUEVfT0ZfRklFTEQgKGZpZWxkKTsKKyAgaWYgKHR5cGUgIT0gZXhwZWN0ZWRfdHlwZSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiRmllbGQgJWQgc2hvdWxkIGhhdmUgdHlwZSAlZCBidXQgaGFzICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgZmllbGQsIGV4cGVjdGVkX3R5cGUsIHR5cGUpOworICAgICAgcmV0dXJuIERCVVNfSU5WQUxJRF9IRUFERVJfRklFTERfSEFTX1dST05HX1RZUEU7CisgICAgfQorCisgIC8qIElmIHRoZSBmaWVsZCB3YXMgcHJvdmlkZWQgdHdpY2UsIHdlIGFyZW4ndCBoYXBweSAqLworICBpZiAoaGVhZGVyLT5maWVsZHNbZmllbGRdLnZhbHVlX3BvcyA+PSAwKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJIZWFkZXIgZmllbGQgJWQgc2VlbiBhIHNlY29uZCB0aW1lXG4iLCBmaWVsZCk7CisgICAgICByZXR1cm4gREJVU19JTlZBTElEX0hFQURFUl9GSUVMRF9BUFBFQVJTX1RXSUNFOworICAgIH0KKworICAvKiBOb3cgd2UgY2FuIGNhY2hlIGFuZCBsb29rIGF0IHRoZSBmaWVsZCBjb250ZW50ICovCisgIF9kYnVzX3ZlcmJvc2UgKCJpbml0aWFsbHkgY2FjaGluZyBmaWVsZCAlZFxuIiwgZmllbGQpOworICBfZGJ1c19oZWFkZXJfY2FjaGVfb25lIChoZWFkZXIsIGZpZWxkLCB2YXJpYW50X3JlYWRlcik7CisKKyAgc3RyaW5nX3ZhbGlkYXRpb25fZnVuYyA9IE5VTEw7CisKKyAgLyogbWFrZSBjb21waWxlciBoYXBweSB0aGF0IGFsbCB0aGlzIGlzIGluaXRpYWxpemVkICovCisgIHZfVUlOVDMyID0gMDsKKyAgdmFsdWVfc3RyID0gTlVMTDsKKyAgdmFsdWVfcG9zID0gLTE7CisgIHN0cl9kYXRhX3BvcyA9IC0xOworICBiYWRfc3RyaW5nX2NvZGUgPSBEQlVTX1ZBTElEOworCisgIGlmIChleHBlY3RlZF90eXBlID09IERCVVNfVFlQRV9VSU5UMzIpCisgICAgeworICAgICAgX2RidXNfaGVhZGVyX2dldF9maWVsZF9iYXNpYyAoaGVhZGVyLCBmaWVsZCwgZXhwZWN0ZWRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2X1VJTlQzMik7CisgICAgfQorICBlbHNlIGlmIChleHBlY3RlZF90eXBlID09IERCVVNfVFlQRV9TVFJJTkcgfHwKKyAgICAgICAgICAgZXhwZWN0ZWRfdHlwZSA9PSBEQlVTX1RZUEVfT0JKRUNUX1BBVEggfHwKKyAgICAgICAgICAgZXhwZWN0ZWRfdHlwZSA9PSBEQlVTX1RZUEVfU0lHTkFUVVJFKQorICAgIHsKKyAgICAgIF9kYnVzX2hlYWRlcl9nZXRfZmllbGRfcmF3IChoZWFkZXIsIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZV9zdHIsICZ2YWx1ZV9wb3MpOworICAgICAgc3RyX2RhdGFfcG9zID0gX0RCVVNfQUxJR05fVkFMVUUgKHZhbHVlX3BvcywgNCkgKyA0OworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vbmUgb2YgdGhlIGtub3duIGZpZWxkcyBzaG91bGQgaGF2ZSB0aGlzIHR5cGUiKTsKKyAgICB9CisKKyAgc3dpdGNoIChmaWVsZCkKKyAgICB7CisgICAgY2FzZSBEQlVTX0hFQURFUl9GSUVMRF9ERVNUSU5BVElPTjoKKyAgICAgIHN0cmluZ192YWxpZGF0aW9uX2Z1bmMgPSBfZGJ1c192YWxpZGF0ZV9idXNfbmFtZTsKKyAgICAgIGJhZF9zdHJpbmdfY29kZSA9IERCVVNfSU5WQUxJRF9CQURfREVTVElOQVRJT047CisgICAgICBicmVhazsKKyAgICBjYXNlIERCVVNfSEVBREVSX0ZJRUxEX0lOVEVSRkFDRToKKyAgICAgIHN0cmluZ192YWxpZGF0aW9uX2Z1bmMgPSBfZGJ1c192YWxpZGF0ZV9pbnRlcmZhY2U7CisgICAgICBiYWRfc3RyaW5nX2NvZGUgPSBEQlVTX0lOVkFMSURfQkFEX0lOVEVSRkFDRTsKKworICAgICAgaWYgKF9kYnVzX3N0cmluZ19lcXVhbF9zdWJzdHJpbmcgKCZfZGJ1c19sb2NhbF9pbnRlcmZhY2Vfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZfZGJ1c19sb2NhbF9pbnRlcmZhY2Vfc3RyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV9zdHIsIHN0cl9kYXRhX3BvcykpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiTWVzc2FnZSBpcyBvbiB0aGUgbG9jYWwgaW50ZXJmYWNlXG4iKTsKKyAgICAgICAgICByZXR1cm4gREJVU19JTlZBTElEX1VTRVNfTE9DQUxfSU5URVJGQUNFOworICAgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgREJVU19IRUFERVJfRklFTERfTUVNQkVSOgorICAgICAgc3RyaW5nX3ZhbGlkYXRpb25fZnVuYyA9IF9kYnVzX3ZhbGlkYXRlX21lbWJlcjsKKyAgICAgIGJhZF9zdHJpbmdfY29kZSA9IERCVVNfSU5WQUxJRF9CQURfTUVNQkVSOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERCVVNfSEVBREVSX0ZJRUxEX0VSUk9SX05BTUU6CisgICAgICBzdHJpbmdfdmFsaWRhdGlvbl9mdW5jID0gX2RidXNfdmFsaWRhdGVfZXJyb3JfbmFtZTsKKyAgICAgIGJhZF9zdHJpbmdfY29kZSA9IERCVVNfSU5WQUxJRF9CQURfRVJST1JfTkFNRTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBEQlVTX0hFQURFUl9GSUVMRF9TRU5ERVI6CisgICAgICBzdHJpbmdfdmFsaWRhdGlvbl9mdW5jID0gX2RidXNfdmFsaWRhdGVfYnVzX25hbWU7CisgICAgICBiYWRfc3RyaW5nX2NvZGUgPSBEQlVTX0lOVkFMSURfQkFEX1NFTkRFUjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBEQlVTX0hFQURFUl9GSUVMRF9QQVRIOgorICAgICAgLyogT0JKRUNUX1BBVEggd2FzIHZhbGlkYXRlZCBnZW5lcmljYWxseSBkdWUgdG8gaXRzIHR5cGUgKi8KKyAgICAgIHN0cmluZ192YWxpZGF0aW9uX2Z1bmMgPSBOVUxMOworCisgICAgICBpZiAoX2RidXNfc3RyaW5nX2VxdWFsX3N1YnN0cmluZyAoJl9kYnVzX2xvY2FsX3BhdGhfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZfZGJ1c19sb2NhbF9wYXRoX3N0ciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfc3RyLCBzdHJfZGF0YV9wb3MpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIk1lc3NhZ2UgaXMgZnJvbSB0aGUgbG9jYWwgcGF0aFxuIik7CisgICAgICAgICAgcmV0dXJuIERCVVNfSU5WQUxJRF9VU0VTX0xPQ0FMX1BBVEg7CisgICAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBEQlVTX0hFQURFUl9GSUVMRF9SRVBMWV9TRVJJQUw6CisgICAgICAvKiBDYW4ndCBiZSAwICovCisgICAgICBpZiAodl9VSU5UMzIgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiBEQlVTX0lOVkFMSURfQkFEX1NFUklBTDsKKyAgICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERCVVNfSEVBREVSX0ZJRUxEX1VOSVhfRkRTOgorICAgICAgLyogRXZlcnkgdmFsdWUgbWFrZXMgc2Vuc2UgKi8KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBEQlVTX0hFQURFUl9GSUVMRF9TSUdOQVRVUkU6CisgICAgICAvKiBTSUdOQVRVUkUgdmFsaWRhdGVkIGdlbmVyaWNhbGx5IGR1ZSB0byBpdHMgdHlwZSAqLworICAgICAgc3RyaW5nX3ZhbGlkYXRpb25fZnVuYyA9IE5VTEw7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJ1bmtub3duIGZpZWxkIHNob3VsZG4ndCBiZSBzZWVuIGhlcmUiKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICBpZiAoc3RyaW5nX3ZhbGlkYXRpb25fZnVuYykKKyAgICB7CisgICAgICBkYnVzX3VpbnQzMl90IGxlbjsKKworICAgICAgX2RidXNfYXNzZXJ0IChiYWRfc3RyaW5nX2NvZGUgIT0gREJVU19WQUxJRCk7CisKKyAgICAgIGxlbiA9IF9kYnVzX21hcnNoYWxfcmVhZF91aW50MzIgKHZhbHVlX3N0ciwgdmFsdWVfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfaGVhZGVyX2dldF9ieXRlX29yZGVyIChoZWFkZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyNpZiAwCisgICAgICBfZGJ1c192ZXJib3NlICgiVmFsaWRhdGluZyBzdHJpbmcgaGVhZGVyIGZpZWxkOyBjb2RlICVkIGlmIGZhaWxzXG4iLAorICAgICAgICAgICAgICAgICAgICAgYmFkX3N0cmluZ19jb2RlKTsKKyNlbmRpZgorICAgICAgaWYgKCEoKnN0cmluZ192YWxpZGF0aW9uX2Z1bmMpICh2YWx1ZV9zdHIsIHN0cl9kYXRhX3BvcywgbGVuKSkKKyAgICAgICAgcmV0dXJuIGJhZF9zdHJpbmdfY29kZTsKKyAgICB9CisKKyAgcmV0dXJuIERCVVNfVkFMSUQ7Cit9CisKKy8qKgorICogQ3JlYXRlcyBhIG1lc3NhZ2UgaGVhZGVyIGZyb20gcG90ZW50aWFsbHktdW50cnVzdGVkIGRhdGEuIFRoZQorICogcmV0dXJuIHZhbHVlIGlzICNUUlVFIGlmIHRoZXJlIHdhcyBlbm91Z2ggbWVtb3J5IGFuZCB0aGUgZGF0YSB3YXMKKyAqIHZhbGlkLiBJZiBpdCByZXR1cm5zICNUUlVFLCB0aGUgaGVhZGVyIHdpbGwgYmUgY3JlYXRlZC4gSWYgaXQKKyAqIHJldHVybnMgI0ZBTFNFIGFuZCAqdmFsaWRpdHkgPT0gI0RCVVNfVkFMSURJVFlfVU5LTk9XTl9PT01fRVJST1IsIAorICogdGhlbiB0aGVyZSB3YXNuJ3QgZW5vdWdoIG1lbW9yeS4gIElmIGl0IHJldHVybnMgI0ZBTFNFIAorICogYW5kICp2YWxpZGl0eSAhPSAjREJVU19WQUxJRElUWV9VTktOT1dOX09PTV9FUlJPUiB0aGVuIHRoZSBkYXRhIHdhcyAKKyAqIGludmFsaWQuCisgKgorICogVGhlIGJ5dGVfb3JkZXIsIGZpZWxkc19hcnJheV9sZW4sIGFuZCBib2R5X2xlbiBhcmdzIHNob3VsZCBiZSBmcm9tCisgKiBfZGJ1c19oZWFkZXJfaGF2ZV9tZXNzYWdlX3VudHJ1c3RlZCgpLiBWYWxpZGF0aW9uIHBlcmZvcm1lZCBpbgorICogX2RidXNfaGVhZGVyX2hhdmVfbWVzc2FnZV91bnRydXN0ZWQoKSBpcyBhc3N1bWVkIHRvIGhhdmUgYmVlbgorICogYWxyZWFkeSBkb25lLgorICoKKyAqIEBwYXJhbSBoZWFkZXIgdGhlIGhlYWRlciAobXVzdCBiZSBpbml0aWFsaXplZCkKKyAqIEBwYXJhbSBtb2RlIHdoZXRoZXIgdG8gZG8gdmFsaWRhdGlvbgorICogQHBhcmFtIHZhbGlkaXR5IHJldHVybiBsb2NhdGlvbiBmb3IgaW52YWxpZGl0eSByZWFzb24KKyAqIEBwYXJhbSBieXRlX29yZGVyIGJ5dGUgb3JkZXIgZnJvbSBoZWFkZXIKKyAqIEBwYXJhbSBmaWVsZHNfYXJyYXlfbGVuIGNsYWltZWQgbGVuZ3RoIG9mIGZpZWxkcyBhcnJheQorICogQHBhcmFtIGJvZHlfbGVuIGNsYWltZWQgbGVuZ3RoIG9mIGJvZHkKKyAqIEBwYXJhbSBoZWFkZXJfbGVuIGNsYWltZWQgbGVuZ3RoIG9mIGhlYWRlcgorICogQHBhcmFtIHN0ciBhIHN0cmluZworICogQHBhcmFtIHN0YXJ0IHN0YXJ0IG9mIGhlYWRlciwgOC1hbGlnbmVkCisgKiBAcGFyYW0gbGVuIGxlbmd0aCBvZiBzdHJpbmcgdG8gbG9vayBhdAorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vIG1lbW9yeSBvciBkYXRhIHdhcyBpbnZhbGlkLCAjVFJVRSBvdGhlcndpc2UKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2hlYWRlcl9sb2FkIChEQnVzSGVhZGVyICAgICAgICAqaGVhZGVyLAorICAgICAgICAgICAgICAgICAgIERCdXNWYWxpZGF0aW9uTW9kZSBtb2RlLAorICAgICAgICAgICAgICAgICAgIERCdXNWYWxpZGl0eSAgICAgICp2YWxpZGl0eSwKKyAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgZmllbGRzX2FycmF5X2xlbiwKKyAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgaGVhZGVyX2xlbiwKKyAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgYm9keV9sZW4sCisgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGxlbikKK3sKKyAgaW50IGxlZnRvdmVyOworICBEQnVzVmFsaWRpdHkgdjsKKyAgREJ1c1R5cGVSZWFkZXIgcmVhZGVyOworICBEQnVzVHlwZVJlYWRlciBhcnJheV9yZWFkZXI7CisgIHVuc2lnbmVkIGNoYXIgdl9ieXRlOworICBkYnVzX3VpbnQzMl90IHZfdWludDMyOworICBkYnVzX3VpbnQzMl90IHNlcmlhbDsKKyAgaW50IHBhZGRpbmdfc3RhcnQ7CisgIGludCBwYWRkaW5nX2xlbjsKKyAgaW50IGk7CisKKyAgX2RidXNfYXNzZXJ0IChzdGFydCA9PSAoaW50KSBfREJVU19BTElHTl9WQUxVRSAoc3RhcnQsIDgpKTsKKyAgX2RidXNfYXNzZXJ0IChoZWFkZXJfbGVuIDw9IGxlbik7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZoZWFkZXItPmRhdGEpID09IDApOworCisgIGlmICghX2RidXNfc3RyaW5nX2NvcHlfbGVuIChzdHIsIHN0YXJ0LCBoZWFkZXJfbGVuLCAmaGVhZGVyLT5kYXRhLCAwKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiRmFpbGVkIHRvIGNvcHkgYnVmZmVyIGludG8gbmV3IGhlYWRlclxuIik7CisgICAgICAqdmFsaWRpdHkgPSBEQlVTX1ZBTElESVRZX1VOS05PV05fT09NX0VSUk9SOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAobW9kZSA9PSBEQlVTX1ZBTElEQVRJT05fTU9ERV9XRV9UUlVTVF9USElTX0RBVEFfQUJTT0xVVEVMWSkKKyAgICB7CisgICAgICBsZWZ0b3ZlciA9IGxlbiAtIGhlYWRlcl9sZW4gLSBib2R5X2xlbiAtIHN0YXJ0OworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHYgPSBfZGJ1c192YWxpZGF0ZV9ib2R5X3dpdGhfcmVhc29uICgmX2RidXNfaGVhZGVyX3NpZ25hdHVyZV9zdHIsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVmdG92ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyLCBzdGFydCwgbGVuKTsKKyAgICAgIAorICAgICAgaWYgKHYgIT0gREJVU19WQUxJRCkKKyAgICAgICAgeworICAgICAgICAgICp2YWxpZGl0eSA9IHY7CisgICAgICAgICAgZ290byBpbnZhbGlkOworICAgICAgICB9CisgICAgfQorCisgIF9kYnVzX2Fzc2VydCAobGVmdG92ZXIgPCBsZW4pOworCisgIHBhZGRpbmdfbGVuID0gaGVhZGVyX2xlbiAtIChGSVJTVF9GSUVMRF9PRkZTRVQgKyBmaWVsZHNfYXJyYXlfbGVuKTsKKyAgcGFkZGluZ19zdGFydCA9IHN0YXJ0ICsgRklSU1RfRklFTERfT0ZGU0VUICsgZmllbGRzX2FycmF5X2xlbjsKKyAgX2RidXNfYXNzZXJ0IChzdGFydCArIGhlYWRlcl9sZW4gPT0gKGludCkgX0RCVVNfQUxJR05fVkFMVUUgKHBhZGRpbmdfc3RhcnQsIDgpKTsKKyAgX2RidXNfYXNzZXJ0IChzdGFydCArIGhlYWRlcl9sZW4gPT0gcGFkZGluZ19zdGFydCArIHBhZGRpbmdfbGVuKTsKKworICBpZiAobW9kZSAhPSBEQlVTX1ZBTElEQVRJT05fTU9ERV9XRV9UUlVTVF9USElTX0RBVEFfQUJTT0xVVEVMWSkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ192YWxpZGF0ZV9udWwgKHN0ciwgcGFkZGluZ19zdGFydCwgcGFkZGluZ19sZW4pKQorICAgICAgICB7CisgICAgICAgICAgKnZhbGlkaXR5ID0gREJVU19JTlZBTElEX0FMSUdOTUVOVF9QQURESU5HX05PVF9OVUw7CisgICAgICAgICAgZ290byBpbnZhbGlkOworICAgICAgICB9CisgICAgfQorCisgIGhlYWRlci0+cGFkZGluZyA9IHBhZGRpbmdfbGVuOworCisgIGlmIChtb2RlID09IERCVVNfVkFMSURBVElPTl9NT0RFX1dFX1RSVVNUX1RISVNfREFUQV9BQlNPTFVURUxZKQorICAgIHsKKyAgICAgICp2YWxpZGl0eSA9IERCVVNfVkFMSUQ7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgLyogV2Ugbm93IGtub3cgdGhlIGRhdGEgaXMgd2VsbC1mb3JtZWQsIGJ1dCB3ZSBoYXZlIHRvIGNoZWNrIHRoYXQKKyAgICogaXQncyB2YWxpZC4KKyAgICovCisKKyAgX2RidXNfdHlwZV9yZWFkZXJfaW5pdCAoJnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJl9kYnVzX2hlYWRlcl9zaWduYXR1cmVfc3RyLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIsIHN0YXJ0KTsKKworICAvKiBCWVRFIE9SREVSICovCisgIF9kYnVzX2Fzc2VydCAoX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2N1cnJlbnRfdHlwZSAoJnJlYWRlcikgPT0gREJVU19UWVBFX0JZVEUpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3R5cGVfcmVhZGVyX2dldF92YWx1ZV9wb3MgKCZyZWFkZXIpID09IEJZVEVfT1JERVJfT0ZGU0VUKTsKKyAgX2RidXNfdHlwZV9yZWFkZXJfcmVhZF9iYXNpYyAoJnJlYWRlciwgJnZfYnl0ZSk7CisgIF9kYnVzX3R5cGVfcmVhZGVyX25leHQgKCZyZWFkZXIpOworCisgIF9kYnVzX2Fzc2VydCAodl9ieXRlID09IGJ5dGVfb3JkZXIpOworCisgIC8qIE1FU1NBR0UgVFlQRSAqLworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3R5cGVfcmVhZGVyX2dldF9jdXJyZW50X3R5cGUgKCZyZWFkZXIpID09IERCVVNfVFlQRV9CWVRFKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c190eXBlX3JlYWRlcl9nZXRfdmFsdWVfcG9zICgmcmVhZGVyKSA9PSBUWVBFX09GRlNFVCk7CisgIF9kYnVzX3R5cGVfcmVhZGVyX3JlYWRfYmFzaWMgKCZyZWFkZXIsICZ2X2J5dGUpOworICBfZGJ1c190eXBlX3JlYWRlcl9uZXh0ICgmcmVhZGVyKTsKKworICAvKiB1bmtub3duIG1lc3NhZ2UgdHlwZXMgYXJlIHN1cHBvc2VkIHRvIGJlIGlnbm9yZWQsIHNvIG9ubHkgdmFsaWRhdGlvbiBoZXJlIGlzCisgICAqIHRoYXQgaXQgaXNuJ3QgaW52YWxpZAorICAgKi8KKyAgaWYgKHZfYnl0ZSA9PSBEQlVTX01FU1NBR0VfVFlQRV9JTlZBTElEKQorICAgIHsKKyAgICAgICp2YWxpZGl0eSA9IERCVVNfSU5WQUxJRF9CQURfTUVTU0FHRV9UWVBFOworICAgICAgZ290byBpbnZhbGlkOworICAgIH0KKworICAvKiBGTEFHUyAqLworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3R5cGVfcmVhZGVyX2dldF9jdXJyZW50X3R5cGUgKCZyZWFkZXIpID09IERCVVNfVFlQRV9CWVRFKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c190eXBlX3JlYWRlcl9nZXRfdmFsdWVfcG9zICgmcmVhZGVyKSA9PSBGTEFHU19PRkZTRVQpOworICBfZGJ1c190eXBlX3JlYWRlcl9yZWFkX2Jhc2ljICgmcmVhZGVyLCAmdl9ieXRlKTsKKyAgX2RidXNfdHlwZV9yZWFkZXJfbmV4dCAoJnJlYWRlcik7CisKKyAgLyogdW5rbm93biBmbGFncyBzaG91bGQgYmUgaWdub3JlZCAqLworCisgIC8qIFBST1RPQ09MIFZFUlNJT04gKi8KKyAgX2RidXNfYXNzZXJ0IChfZGJ1c190eXBlX3JlYWRlcl9nZXRfY3VycmVudF90eXBlICgmcmVhZGVyKSA9PSBEQlVTX1RZUEVfQllURSk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfdHlwZV9yZWFkZXJfZ2V0X3ZhbHVlX3BvcyAoJnJlYWRlcikgPT0gVkVSU0lPTl9PRkZTRVQpOworICBfZGJ1c190eXBlX3JlYWRlcl9yZWFkX2Jhc2ljICgmcmVhZGVyLCAmdl9ieXRlKTsKKyAgX2RidXNfdHlwZV9yZWFkZXJfbmV4dCAoJnJlYWRlcik7CisKKyAgaWYgKHZfYnl0ZSAhPSBEQlVTX01BSk9SX1BST1RPQ09MX1ZFUlNJT04pCisgICAgeworICAgICAgKnZhbGlkaXR5ID0gREJVU19JTlZBTElEX0JBRF9QUk9UT0NPTF9WRVJTSU9OOworICAgICAgZ290byBpbnZhbGlkOworICAgIH0KKworICAvKiBCT0RZIExFTkdUSCAqLworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3R5cGVfcmVhZGVyX2dldF9jdXJyZW50X3R5cGUgKCZyZWFkZXIpID09IERCVVNfVFlQRV9VSU5UMzIpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3R5cGVfcmVhZGVyX2dldF92YWx1ZV9wb3MgKCZyZWFkZXIpID09IEJPRFlfTEVOR1RIX09GRlNFVCk7CisgIF9kYnVzX3R5cGVfcmVhZGVyX3JlYWRfYmFzaWMgKCZyZWFkZXIsICZ2X3VpbnQzMik7CisgIF9kYnVzX3R5cGVfcmVhZGVyX25leHQgKCZyZWFkZXIpOworCisgIF9kYnVzX2Fzc2VydCAoYm9keV9sZW4gPT0gKHNpZ25lZCkgdl91aW50MzIpOworCisgIC8qIFNFUklBTCAqLworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3R5cGVfcmVhZGVyX2dldF9jdXJyZW50X3R5cGUgKCZyZWFkZXIpID09IERCVVNfVFlQRV9VSU5UMzIpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3R5cGVfcmVhZGVyX2dldF92YWx1ZV9wb3MgKCZyZWFkZXIpID09IFNFUklBTF9PRkZTRVQpOworICBfZGJ1c190eXBlX3JlYWRlcl9yZWFkX2Jhc2ljICgmcmVhZGVyLCAmc2VyaWFsKTsKKyAgX2RidXNfdHlwZV9yZWFkZXJfbmV4dCAoJnJlYWRlcik7CisKKyAgaWYgKHNlcmlhbCA9PSAwKQorICAgIHsKKyAgICAgICp2YWxpZGl0eSA9IERCVVNfSU5WQUxJRF9CQURfU0VSSUFMOworICAgICAgZ290byBpbnZhbGlkOworICAgIH0KKworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3R5cGVfcmVhZGVyX2dldF9jdXJyZW50X3R5cGUgKCZyZWFkZXIpID09IERCVVNfVFlQRV9BUlJBWSk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfdHlwZV9yZWFkZXJfZ2V0X3ZhbHVlX3BvcyAoJnJlYWRlcikgPT0gRklFTERTX0FSUkFZX0xFTkdUSF9PRkZTRVQpOworCisgIF9kYnVzX3R5cGVfcmVhZGVyX3JlY3Vyc2UgKCZyZWFkZXIsICZhcnJheV9yZWFkZXIpOworICB3aGlsZSAoX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2N1cnJlbnRfdHlwZSAoJmFycmF5X3JlYWRlcikgIT0gREJVU19UWVBFX0lOVkFMSUQpCisgICAgeworICAgICAgREJ1c1R5cGVSZWFkZXIgc3RydWN0X3JlYWRlcjsKKyAgICAgIERCdXNUeXBlUmVhZGVyIHZhcmlhbnRfcmVhZGVyOworICAgICAgdW5zaWduZWQgY2hhciBmaWVsZF9jb2RlOworCisgICAgICBfZGJ1c19hc3NlcnQgKF9kYnVzX3R5cGVfcmVhZGVyX2dldF9jdXJyZW50X3R5cGUgKCZhcnJheV9yZWFkZXIpID09IERCVVNfVFlQRV9TVFJVQ1QpOworCisgICAgICBfZGJ1c190eXBlX3JlYWRlcl9yZWN1cnNlICgmYXJyYXlfcmVhZGVyLCAmc3RydWN0X3JlYWRlcik7CisKKyAgICAgIF9kYnVzX2Fzc2VydCAoX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2N1cnJlbnRfdHlwZSAoJnN0cnVjdF9yZWFkZXIpID09IERCVVNfVFlQRV9CWVRFKTsKKyAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX3JlYWRfYmFzaWMgKCZzdHJ1Y3RfcmVhZGVyLCAmZmllbGRfY29kZSk7CisgICAgICBfZGJ1c190eXBlX3JlYWRlcl9uZXh0ICgmc3RydWN0X3JlYWRlcik7CisKKyAgICAgIGlmIChmaWVsZF9jb2RlID09IERCVVNfSEVBREVSX0ZJRUxEX0lOVkFMSUQpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiaW52YWxpZCBoZWFkZXIgZmllbGQgY29kZVxuIik7CisgICAgICAgICAgKnZhbGlkaXR5ID0gREJVU19JTlZBTElEX0hFQURFUl9GSUVMRF9DT0RFOworICAgICAgICAgIGdvdG8gaW52YWxpZDsKKyAgICAgICAgfQorCisgICAgICBpZiAoZmllbGRfY29kZSA+IERCVVNfSEVBREVSX0ZJRUxEX0xBU1QpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgidW5rbm93biBoZWFkZXIgZmllbGQgY29kZSAlZCwgc2tpcHBpbmdcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfY29kZSk7CisgICAgICAgICAgZ290byBuZXh0X2ZpZWxkOworICAgICAgICB9CisKKyAgICAgIF9kYnVzX2Fzc2VydCAoX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2N1cnJlbnRfdHlwZSAoJnN0cnVjdF9yZWFkZXIpID09IERCVVNfVFlQRV9WQVJJQU5UKTsKKyAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX3JlY3Vyc2UgKCZzdHJ1Y3RfcmVhZGVyLCAmdmFyaWFudF9yZWFkZXIpOworCisgICAgICB2ID0gbG9hZF9hbmRfdmFsaWRhdGVfZmllbGQgKGhlYWRlciwgZmllbGRfY29kZSwgJnZhcmlhbnRfcmVhZGVyKTsKKyAgICAgIGlmICh2ICE9IERCVVNfVkFMSUQpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiRmllbGQgJWQgd2FzIGludmFsaWRcbiIsIGZpZWxkX2NvZGUpOworICAgICAgICAgICp2YWxpZGl0eSA9IHY7CisgICAgICAgICAgZ290byBpbnZhbGlkOworICAgICAgICB9CisKKyAgICBuZXh0X2ZpZWxkOgorICAgICAgX2RidXNfdHlwZV9yZWFkZXJfbmV4dCAoJmFycmF5X3JlYWRlcik7CisgICAgfQorCisgIC8qIEFueXRoaW5nIHdlIGRpZG4ndCBmaWxsIGluIGlzIG5vdyBrbm93biBub3QgdG8gZXhpc3QgKi8KKyAgaSA9IDA7CisgIHdoaWxlIChpIDw9IERCVVNfSEVBREVSX0ZJRUxEX0xBU1QpCisgICAgeworICAgICAgaWYgKGhlYWRlci0+ZmllbGRzW2ldLnZhbHVlX3BvcyA9PSBfREJVU19IRUFERVJfRklFTERfVkFMVUVfVU5LTk9XTikKKyAgICAgICAgaGVhZGVyLT5maWVsZHNbaV0udmFsdWVfcG9zID0gX0RCVVNfSEVBREVSX0ZJRUxEX1ZBTFVFX05PTkVYSVNURU5UOworICAgICAgKytpOworICAgIH0KKworICB2ID0gY2hlY2tfbWFuZGF0b3J5X2ZpZWxkcyAoaGVhZGVyKTsKKyAgaWYgKHYgIT0gREJVU19WQUxJRCkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiTWFuZGF0b3J5IGZpZWxkcyB3ZXJlIG1pc3NpbmcsIGNvZGUgJWRcbiIsIHYpOworICAgICAgKnZhbGlkaXR5ID0gdjsKKyAgICAgIGdvdG8gaW52YWxpZDsKKyAgICB9CisKKyAgKnZhbGlkaXR5ID0gREJVU19WQUxJRDsKKyAgcmV0dXJuIFRSVUU7CisKKyBpbnZhbGlkOgorICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoJmhlYWRlci0+ZGF0YSwgMCk7CisgIHJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBGaWxscyBpbiB0aGUgY29ycmVjdCBib2R5IGxlbmd0aC4KKyAqCisgKiBAcGFyYW0gaGVhZGVyIHRoZSBoZWFkZXIKKyAqIEBwYXJhbSBib2R5X2xlbiB0aGUgbGVuZ3RoIG9mIHRoZSBib2R5CisgKi8KK3ZvaWQKK19kYnVzX2hlYWRlcl91cGRhdGVfbGVuZ3RocyAoREJ1c0hlYWRlciAqaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICBib2R5X2xlbikKK3sKKyAgX2RidXNfbWFyc2hhbF9zZXRfdWludDMyICgmaGVhZGVyLT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPRFlfTEVOR1RIX09GRlNFVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2R5X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19oZWFkZXJfZ2V0X2J5dGVfb3JkZXIgKGhlYWRlcikpOworfQorCisvKioKKyAqIFRyeSB0byBmaW5kIHRoZSBnaXZlbiBmaWVsZC4KKyAqCisgKiBAcGFyYW0gaGVhZGVyIHRoZSBoZWFkZXIKKyAqIEBwYXJhbSBmaWVsZCB0aGUgZmllbGQgY29kZQorICogQHBhcmFtIHJlYWRlciBhIHR5cGUgcmVhZGVyOyBvbiBzdWNjZXNzIHRoaXMgaXMgbGVmdCBwb2ludGluZyBhdCB0aGUgc3RydWN0CisgKiAgKHV2KSBmb3IgdGhlIGZpZWxkLCB3aGlsZSBvbiBmYWlsdXJlIGl0IGlzIGxlZnQgcG9pbnRpbmcgaW50byBlbXB0eSBzcGFjZQorICogIGF0IHRoZSBlbmQgb2YgdGhlIGhlYWRlciBmaWVsZHMKKyAqIEBwYXJhbSByZWFsaWduX3Jvb3QgYW5vdGhlciB0eXBlIHJlYWRlcjsgb24gc3VjY2VzcyBvciBmYWlsdXJlIGl0IGlzIGxlZnQKKyAqICBwb2ludGluZyB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhcnJheSBvZiBmaWVsZHMgKGkuZS4gdGhlIHRoaW5nIHRoYXQgbWlnaHQKKyAqICBuZWVkIHJlYWxpZ25pbmcpCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzCisgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAorZmluZF9maWVsZF9mb3JfbW9kaWZpY2F0aW9uIChEQnVzSGVhZGVyICAgICAqaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFsaWduX3Jvb3QpCit7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKworICByZXR2YWwgPSBGQUxTRTsKKworICBfZGJ1c190eXBlX3JlYWRlcl9pbml0IChyZWFsaWduX3Jvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX2hlYWRlcl9nZXRfYnl0ZV9vcmRlciAoaGVhZGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJl9kYnVzX2hlYWRlcl9zaWduYXR1cmVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGSUVMRFNfQVJSQVlfU0lHTkFUVVJFX09GRlNFVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmhlYWRlci0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRklFTERTX0FSUkFZX0xFTkdUSF9PRkZTRVQpOworCisgIF9kYnVzX3R5cGVfcmVhZGVyX3JlY3Vyc2UgKHJlYWxpZ25fcm9vdCwgcmVhZGVyKTsKKworICB3aGlsZSAoX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2N1cnJlbnRfdHlwZSAocmVhZGVyKSAhPSBEQlVTX1RZUEVfSU5WQUxJRCkKKyAgICB7CisgICAgICBEQnVzVHlwZVJlYWRlciBzdWI7CisgICAgICB1bnNpZ25lZCBjaGFyIGZpZWxkX2NvZGU7CisKKyAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX3JlY3Vyc2UgKHJlYWRlciwgJnN1Yik7CisKKyAgICAgIF9kYnVzX2Fzc2VydCAoX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2N1cnJlbnRfdHlwZSAoJnN1YikgPT0gREJVU19UWVBFX0JZVEUpOworICAgICAgX2RidXNfdHlwZV9yZWFkZXJfcmVhZF9iYXNpYyAoJnN1YiwgJmZpZWxkX2NvZGUpOworCisgICAgICBpZiAoZmllbGRfY29kZSA9PSAodW5zaWduZWQpIGZpZWxkKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfYXNzZXJ0IChfZGJ1c190eXBlX3JlYWRlcl9nZXRfY3VycmVudF90eXBlIChyZWFkZXIpID09IERCVVNfVFlQRV9TVFJVQ1QpOworICAgICAgICAgIHJldHZhbCA9IFRSVUU7CisgICAgICAgICAgZ290byBkb25lOworICAgICAgICB9CisKKyAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX25leHQgKHJlYWRlcik7CisgICAgfQorCisgZG9uZToKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBTZXRzIHRoZSB2YWx1ZSBvZiBhIGZpZWxkIHdpdGggYmFzaWMgdHlwZS4gSWYgdGhlIHZhbHVlIGlzIGEgc3RyaW5nCisgKiB2YWx1ZSwgaXQgaXNuJ3QgYWxsb3dlZCB0byBiZSAjTlVMTC4gSWYgdGhlIGZpZWxkIGRvZXNuJ3QgZXhpc3QsCisgKiBpdCB3aWxsIGJlIGNyZWF0ZWQuCisgKgorICogQHBhcmFtIGhlYWRlciB0aGUgaGVhZGVyCisgKiBAcGFyYW0gZmllbGQgdGhlIGZpZWxkIHRvIHNldAorICogQHBhcmFtIHR5cGUgdGhlIHR5cGUgb2YgdGhlIHZhbHVlCisgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIGFzIGZvciBfZGJ1c19tYXJzaGFsX3NldF9iYXNpYygpCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm8gbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19oZWFkZXJfc2V0X2ZpZWxkX2Jhc2ljIChEQnVzSGVhZGVyICAgICAgICpoZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICAgICAgICp2YWx1ZSkKK3sKKyAgX2RidXNfYXNzZXJ0IChmaWVsZCA8PSBEQlVTX0hFQURFUl9GSUVMRF9MQVNUKTsKKworICBpZiAoIXJlc2VydmVfaGVhZGVyX3BhZGRpbmcgKGhlYWRlcikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIC8qIElmIHRoZSBmaWVsZCBleGlzdHMgd2Ugc2V0LCBvdGhlcndpc2Ugd2UgYXBwZW5kICovCisgIGlmIChfZGJ1c19oZWFkZXJfY2FjaGVfY2hlY2sgKGhlYWRlciwgZmllbGQpKQorICAgIHsKKyAgICAgIERCdXNUeXBlUmVhZGVyIHJlYWRlcjsKKyAgICAgIERCdXNUeXBlUmVhZGVyIHJlYWxpZ25fcm9vdDsKKworICAgICAgaWYgKCFmaW5kX2ZpZWxkX2Zvcl9tb2RpZmljYXRpb24gKGhlYWRlciwgZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlYWRlciwgJnJlYWxpZ25fcm9vdCkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImZpZWxkIHdhcyBtYXJrZWQgcHJlc2VudCBpbiBjYWNoZSBidXQgd2Fzbid0IGZvdW5kIik7CisKKyAgICAgIGlmICghc2V0X2Jhc2ljX2ZpZWxkICgmcmVhZGVyLCBmaWVsZCwgdHlwZSwgdmFsdWUsICZyZWFsaWduX3Jvb3QpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgREJ1c1R5cGVXcml0ZXIgd3JpdGVyOworICAgICAgREJ1c1R5cGVXcml0ZXIgYXJyYXk7CisKKyAgICAgIF9kYnVzX3R5cGVfd3JpdGVyX2luaXRfdmFsdWVzX29ubHkgKCZ3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19oZWFkZXJfZ2V0X2J5dGVfb3JkZXIgKGhlYWRlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmX2RidXNfaGVhZGVyX3NpZ25hdHVyZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSUVMRFNfQVJSQVlfU0lHTkFUVVJFX09GRlNFVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoZWFkZXItPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSUVMRFNfQVJSQVlfTEVOR1RIX09GRlNFVCk7CisKKyAgICAgIC8qIHJlY3Vyc2UgaW50byBhcnJheSB3aXRob3V0IGNyZWF0aW5nIGEgbmV3IGxlbmd0aCwgYW5kIGp1bXAgdG8KKyAgICAgICAqIGVuZCBvZiBhcnJheS4KKyAgICAgICAqLworICAgICAgaWYgKCFfZGJ1c190eXBlX3dyaXRlcl9hcHBlbmRfYXJyYXkgKCZ3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJl9kYnVzX2hlYWRlcl9zaWduYXR1cmVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJRUxEU19BUlJBWV9FTEVNRU5UX1NJR05BVFVSRV9PRkZTRVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFycmF5KSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgicmVjdXJzZSBpbnRvIEFSUkFZIHNob3VsZCBub3QgaGF2ZSB1c2VkIG1lbW9yeSIpOworCisgICAgICBfZGJ1c19hc3NlcnQgKGFycmF5LnUuYXJyYXkubGVuX3BvcyA9PSBGSUVMRFNfQVJSQVlfTEVOR1RIX09GRlNFVCk7CisgICAgICBfZGJ1c19hc3NlcnQgKGFycmF5LnUuYXJyYXkuc3RhcnRfcG9zID09IEZJUlNUX0ZJRUxEX09GRlNFVCk7CisgICAgICBfZGJ1c19hc3NlcnQgKGFycmF5LnZhbHVlX3BvcyA9PSBIRUFERVJfRU5EX0JFRk9SRV9QQURESU5HIChoZWFkZXIpKTsKKworICAgICAgaWYgKCF3cml0ZV9iYXNpY19maWVsZCAoJmFycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQsIHR5cGUsIHZhbHVlKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICBpZiAoIV9kYnVzX3R5cGVfd3JpdGVyX3VucmVjdXJzZSAoJndyaXRlciwgJmFycmF5KSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgidW5yZWN1cnNlIGZyb20gQVJSQVkgc2hvdWxkIG5vdCBoYXZlIHVzZWQgbWVtb3J5Iik7CisgICAgfQorCisgIGNvcnJlY3RfaGVhZGVyX3BhZGRpbmcgKGhlYWRlcik7CisKKyAgLyogV2UgY291bGQgYmUgc21hcnRlciBhYm91dCB0aGlzIChvbmx5IGludmFsaWRhdGUgZmllbGRzIGFmdGVyIHRoZQorICAgKiBvbmUgd2UgbW9kaWZpZWQsIG9yIGV2ZW4gb25seSBpZiB0aGUgb25lIHdlIG1vZGlmaWVkIGNoYW5nZWQKKyAgICogbGVuZ3RoKS4gQnV0IHRoaXMgaGFjayBpcyBhIHN0YXJ0LgorICAgKi8KKyAgX2RidXNfaGVhZGVyX2NhY2hlX2ludmFsaWRhdGVfYWxsIChoZWFkZXIpOworCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIEdldHMgdGhlIHZhbHVlIG9mIGEgZmllbGQgd2l0aCBiYXNpYyB0eXBlLiBJZiB0aGUgZmllbGQKKyAqIGRvZXNuJ3QgZXhpc3QsIHJldHVybnMgI0ZBTFNFLCBvdGhlcndpc2UgcmV0dXJucyAjVFJVRS4KKyAqCisgKiBAcGFyYW0gaGVhZGVyIHRoZSBoZWFkZXIKKyAqIEBwYXJhbSBmaWVsZCB0aGUgZmllbGQgdG8gZ2V0CisgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBvZiB0aGUgdmFsdWUKKyAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgYXMgZm9yIF9kYnVzX21hcnNoYWxfcmVhZF9iYXNpYygpCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgdGhlIGZpZWxkIGRvZXNuJ3QgZXhpc3QKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2hlYWRlcl9nZXRfZmllbGRfYmFzaWMgKERCdXNIZWFkZXIgICAgKmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnZhbHVlKQoreworICBfZGJ1c19hc3NlcnQgKGZpZWxkICE9IERCVVNfSEVBREVSX0ZJRUxEX0lOVkFMSUQpOworICBfZGJ1c19hc3NlcnQgKGZpZWxkIDw9IERCVVNfSEVBREVSX0ZJRUxEX0xBU1QpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX2hlYWRlcl9maWVsZF90eXBlc1tmaWVsZF0uY29kZSA9PSBmaWVsZCk7CisgIC8qIGluIGxpZ2h0IG9mIHRoaXMgeW91IG1pZ2h0IGFzayB3aHkgdGhlIHR5cGUgaXMgcGFzc2VkIGluOworICAgKiB0aGUgb25seSByYXRpb25hbGUgSSBjYW4gdGhpbmsgb2YgaXMgc28gdGhlIGNhbGxlciBoYXMKKyAgICogdG8gc3BlY2lmeSBpdHMgZXhwZWN0YXRpb24gYW5kIGJyZWFrcyBpZiB3ZSBjaGFuZ2UgaXQKKyAgICovCisgIF9kYnVzX2Fzc2VydCAodHlwZSA9PSBFWFBFQ1RFRF9UWVBFX09GX0ZJRUxEIChmaWVsZCkpOworCisgIGlmICghX2RidXNfaGVhZGVyX2NhY2hlX2NoZWNrIChoZWFkZXIsIGZpZWxkKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgX2RidXNfYXNzZXJ0IChoZWFkZXItPmZpZWxkc1tmaWVsZF0udmFsdWVfcG9zID49IDApOworCisgIF9kYnVzX21hcnNoYWxfcmVhZF9iYXNpYyAoJmhlYWRlci0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXItPmZpZWxkc1tmaWVsZF0udmFsdWVfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsIHZhbHVlLCBfZGJ1c19oZWFkZXJfZ2V0X2J5dGVfb3JkZXIgKGhlYWRlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogR2V0cyB0aGUgcmF3IG1hcnNoYWxlZCBkYXRhIGZvciBhIGZpZWxkLiBJZiB0aGUgZmllbGQgZG9lc24ndAorICogZXhpc3QsIHJldHVybnMgI0ZBTFNFLCBvdGhlcndpc2UgcmV0dXJucyAjVFJVRS4gIFJldHVybnMgdGhlIHN0YXJ0CisgKiBvZiB0aGUgbWFyc2hhbGVkIGRhdGEsIGkuZS4gdXN1YWxseSB0aGUgYnl0ZSB3aGVyZSB0aGUgbGVuZ3RoCisgKiBzdGFydHMgKGZvciBzdHJpbmdzIGFuZCBhcnJheXMpIG9yIGZvciBiYXNpYyB0eXBlcyBqdXN0IHRoZSB2YWx1ZQorICogaXRzZWxmLgorICoKKyAqIEBwYXJhbSBoZWFkZXIgdGhlIGhlYWRlcgorICogQHBhcmFtIGZpZWxkIHRoZSBmaWVsZCB0byBnZXQKKyAqIEBwYXJhbSBzdHIgcmV0dXJuIGxvY2F0aW9uIGZvciB0aGUgZGF0YSBzdHJpbmcKKyAqIEBwYXJhbSBwb3MgcmV0dXJuIGxvY2F0aW9uIGZvciBzdGFydCBvZiBmaWVsZCB2YWx1ZQorICogQHJldHVybnMgI0ZBTFNFIGlmIHRoZSBmaWVsZCBkb2Vzbid0IGV4aXN0CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19oZWFkZXJfZ2V0X2ZpZWxkX3JhdyAoREJ1c0hlYWRlciAgICAgICAgKmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAqcG9zKQoreworICBpZiAoIV9kYnVzX2hlYWRlcl9jYWNoZV9jaGVjayAoaGVhZGVyLCBmaWVsZCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmIChzdHIpCisgICAgKnN0ciA9ICZoZWFkZXItPmRhdGE7CisgIGlmIChwb3MpCisgICAgKnBvcyA9IGhlYWRlci0+ZmllbGRzW2ZpZWxkXS52YWx1ZV9wb3M7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogRGVsZXRlcyBhIGZpZWxkLCBpZiBpdCBleGlzdHMuCisgKgorICogQHBhcmFtIGhlYWRlciB0aGUgaGVhZGVyCisgKiBAcGFyYW0gZmllbGQgdGhlIGZpZWxkIHRvIGRlbGV0ZQorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfaGVhZGVyX2RlbGV0ZV9maWVsZCAoREJ1c0hlYWRlciAqaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgZmllbGQpCit7CisgIERCdXNUeXBlUmVhZGVyIHJlYWRlcjsKKyAgREJ1c1R5cGVSZWFkZXIgcmVhbGlnbl9yb290OworCisgIGlmIChfZGJ1c19oZWFkZXJfY2FjaGVfa25vd25fbm9uZXhpc3RlbnQgKGhlYWRlciwgZmllbGQpKQorICAgIHJldHVybiBUUlVFOyAvKiBub3RoaW5nIHRvIGRvICovCisKKyAgLyogU2NhbiB0byB0aGUgZmllbGQgd2Ugd2FudCwgZGVsZXRlIGFuZCByZWFsaWduLCByZWFwcGVuZAorICAgKiBwYWRkaW5nLiBGaWVsZCBtYXkgdHVybiBvdXQgbm90IHRvIGV4aXN0LgorICAgKi8KKyAgaWYgKCFmaW5kX2ZpZWxkX2Zvcl9tb2RpZmljYXRpb24gKGhlYWRlciwgZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVhZGVyLCAmcmVhbGlnbl9yb290KSkKKyAgICByZXR1cm4gVFJVRTsgLyogbm90aGluZyB0byBkbyAqLworCisgIGlmICghcmVzZXJ2ZV9oZWFkZXJfcGFkZGluZyAoaGVhZGVyKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFfZGJ1c190eXBlX3JlYWRlcl9kZWxldGUgKCZyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVhbGlnbl9yb290KSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgY29ycmVjdF9oZWFkZXJfcGFkZGluZyAoaGVhZGVyKTsKKworICBfZGJ1c19oZWFkZXJfY2FjaGVfaW52YWxpZGF0ZV9hbGwgKGhlYWRlcik7CisKKyAgX2RidXNfYXNzZXJ0ICghX2RidXNfaGVhZGVyX2NhY2hlX2NoZWNrIChoZWFkZXIsIGZpZWxkKSk7IC8qIEV4cGVuc2l2ZSBhc3NlcnRpb24gLi4uICovCisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogVG9nZ2xlcyBhIG1lc3NhZ2UgZmxhZyBiaXQsIHR1cm5pbmcgb24gdGhlIGJpdCBpZiB2YWx1ZSA9IFRSVUUgYW5kCisgKiBmbGlwcGluZyBpdCBvZmYgaWYgdmFsdWUgPSBGQUxTRS4KKyAqCisgKiBAcGFyYW0gaGVhZGVyIHRoZSBoZWFkZXIKKyAqIEBwYXJhbSBmbGFnIHRoZSBtZXNzYWdlIGZsYWcgdG8gdG9nZ2xlCisgKiBAcGFyYW0gdmFsdWUgdG9nZ2xlIG9uIG9yIG9mZgorICovCit2b2lkCitfZGJ1c19oZWFkZXJfdG9nZ2xlX2ZsYWcgKERCdXNIZWFkZXIgICAqaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90IGZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgdmFsdWUpCit7CisgIHVuc2lnbmVkIGNoYXIgKmZsYWdzX3A7CisKKyAgZmxhZ3NfcCA9IF9kYnVzX3N0cmluZ19nZXRfdWRhdGFfbGVuICgmaGVhZGVyLT5kYXRhLCBGTEFHU19PRkZTRVQsIDEpOworCisgIGlmICh2YWx1ZSkKKyAgICAqZmxhZ3NfcCB8PSBmbGFnOworICBlbHNlCisgICAgKmZsYWdzX3AgJj0gfmZsYWc7Cit9CisKKy8qKgorICogR2V0cyBhIG1lc3NhZ2UgZmxhZyBiaXQsIHJldHVybmluZyBUUlVFIGlmIHRoZSBiaXQgaXMgc2V0LgorICoKKyAqIEBwYXJhbSBoZWFkZXIgdGhlIGhlYWRlcgorICogQHBhcmFtIGZsYWcgdGhlIG1lc3NhZ2UgZmxhZyB0byBnZXQKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSBmbGFnIGlzIHNldAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfaGVhZGVyX2dldF9mbGFnIChEQnVzSGVhZGVyICAgKmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCBmbGFnKQoreworICBjb25zdCB1bnNpZ25lZCBjaGFyICpmbGFnc19wOworCisgIGZsYWdzX3AgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X3VkYXRhX2xlbiAoJmhlYWRlci0+ZGF0YSwgRkxBR1NfT0ZGU0VULCAxKTsKKworICByZXR1cm4gKCpmbGFnc19wICYgZmxhZykgIT0gMDsKK30KKworLyoqCisgKiBTd2FwcyB0aGUgaGVhZGVyIGludG8gdGhlIGdpdmVuIG9yZGVyIGlmIHJlcXVpcmVkLgorICoKKyAqIEBwYXJhbSBoZWFkZXIgdGhlIGhlYWRlcgorICogQHBhcmFtIG5ld19vcmRlciB0aGUgbmV3IGJ5dGUgb3JkZXIKKyAqLwordm9pZAorX2RidXNfaGVhZGVyX2J5dGVzd2FwIChEQnVzSGVhZGVyICpoZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIG5ld19vcmRlcikKK3sKKyAgY2hhciBieXRlX29yZGVyOworCisgIGJ5dGVfb3JkZXIgPSBfZGJ1c19oZWFkZXJfZ2V0X2J5dGVfb3JkZXIgKGhlYWRlcik7CisKKyAgaWYgKGJ5dGVfb3JkZXIgPT0gbmV3X29yZGVyKQorICAgIHJldHVybjsKKworICBfZGJ1c19tYXJzaGFsX2J5dGVzd2FwICgmX2RidXNfaGVhZGVyX3NpZ25hdHVyZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld19vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmhlYWRlci0+ZGF0YSwgMCk7CisKKyAgX2RidXNfc3RyaW5nX3NldF9ieXRlICgmaGVhZGVyLT5kYXRhLCBCWVRFX09SREVSX09GRlNFVCwgbmV3X29yZGVyKTsKK30KKworLyoqIEB9ICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtbWFyc2hhbC1oZWFkZXIuaCBiL2RidXMvZGJ1cy1tYXJzaGFsLWhlYWRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4YzAxMTIKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtbWFyc2hhbC1oZWFkZXIuaApAQCAtMCwwICsxLDEzMiBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLW1hcnNoYWwtaGVhZGVyLmggIE1hbmFnaW5nIG1hcnNoYWxpbmcvZGVtYXJzaGFsaW5nIG9mIG1lc3NhZ2UgaGVhZGVycworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSAgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBEQlVTX01BUlNIQUxfSEVBREVSX0gKKyNkZWZpbmUgREJVU19NQVJTSEFMX0hFQURFUl9ICisKKyNpbmNsdWRlIDxkYnVzL2RidXMtbWFyc2hhbC1iYXNpYy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1tYXJzaGFsLXZhbGlkYXRlLmg+CisKK3R5cGVkZWYgc3RydWN0IERCdXNIZWFkZXIgICAgICBEQnVzSGVhZGVyOwordHlwZWRlZiBzdHJ1Y3QgREJ1c0hlYWRlckZpZWxkIERCdXNIZWFkZXJGaWVsZDsKKworI2RlZmluZSBfREJVU19IRUFERVJfRklFTERfVkFMVUVfVU5LTk9XTiAtMQorI2RlZmluZSBfREJVU19IRUFERVJfRklFTERfVkFMVUVfTk9ORVhJU1RFTlQgLTIKKworLyoqCisgKiBDYWNoZWQgaW5mb3JtYXRpb24gYWJvdXQgYSBoZWFkZXIgZmllbGQgaW4gdGhlIG1lc3NhZ2UKKyAqLworc3RydWN0IERCdXNIZWFkZXJGaWVsZAoreworICBpbnQgICAgICAgICAgICB2YWx1ZV9wb3M7IC8qKjwgUG9zaXRpb24gb2YgZmllbGQgdmFsdWUsIG9yIC0xLy0yICovCit9OworCisvKioKKyAqIE1lc3NhZ2UgaGVhZGVyIGRhdGEgYW5kIHNvbWUgY2FjaGVkIGRldGFpbHMgb2YgaXQuCisgKi8KK3N0cnVjdCBEQnVzSGVhZGVyCit7CisgIERCdXNTdHJpbmcgZGF0YTsgLyoqPCBIZWFkZXIgbmV0d29yayBkYXRhLCBzdG9yZWQKKyAgICAgICAgICAgICAgICAgICAgKiBzZXBhcmF0ZWx5IGZyb20gYm9keSBzbyB3ZSBjYW4KKyAgICAgICAgICAgICAgICAgICAgKiBpbmRlcGVuZGVudGx5IHJlYWxsb2MgaXQuCisgICAgICAgICAgICAgICAgICAgICovCisKKyAgREJ1c0hlYWRlckZpZWxkIGZpZWxkc1tEQlVTX0hFQURFUl9GSUVMRF9MQVNUICsgMV07IC8qKjwgVHJhY2sgdGhlIGxvY2F0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBvZiBlYWNoIGZpZWxkIGluIGhlYWRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgZGJ1c191aW50MzJfdCBwYWRkaW5nIDogMzsgICAgICAgIC8qKjwgYnl0ZXMgb2YgYWxpZ25tZW50IGluIGhlYWRlciAqLworICBkYnVzX3VpbnQzMl90IGJ5dGVfb3JkZXIgOiA4OyAgICAgLyoqPCBieXRlIG9yZGVyIG9mIGhlYWRlciAqLworfTsKKworZGJ1c19ib29sX3QgICBfZGJ1c19oZWFkZXJfaW5pdCAgICAgICAgICAgICAgICAgICAoREJ1c0hlYWRlciAgICAgICAgKmhlYWRlcik7Cit2b2lkICAgICAgICAgIF9kYnVzX2hlYWRlcl9mcmVlICAgICAgICAgICAgICAgICAgIChEQnVzSGVhZGVyICAgICAgICAqaGVhZGVyKTsKK3ZvaWQgICAgICAgICAgX2RidXNfaGVhZGVyX3JlaW5pdCAgICAgICAgICAgICAgICAgKERCdXNIZWFkZXIgICAgICAgICpoZWFkZXIpOworZGJ1c19ib29sX3QgICBfZGJ1c19oZWFkZXJfY3JlYXRlICAgICAgICAgICAgICAgICAoREJ1c0hlYWRlciAgICAgICAgKmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAqZGVzdGluYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAqcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICppbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAqbWVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgKmVycm9yX25hbWUpOworZGJ1c19ib29sX3QgICBfZGJ1c19oZWFkZXJfY29weSAgICAgICAgICAgICAgICAgICAoY29uc3QgREJ1c0hlYWRlciAgKmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNIZWFkZXIgICAgICAgICpkZXN0KTsKK2ludCAgICAgICAgICAgX2RidXNfaGVhZGVyX2dldF9tZXNzYWdlX3R5cGUgICAgICAgKERCdXNIZWFkZXIgICAgICAgICpoZWFkZXIpOwordm9pZCAgICAgICAgICBfZGJ1c19oZWFkZXJfc2V0X3NlcmlhbCAgICAgICAgICAgICAoREJ1c0hlYWRlciAgICAgICAgKmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgICAgICBzZXJpYWwpOworZGJ1c191aW50MzJfdCBfZGJ1c19oZWFkZXJfZ2V0X3NlcmlhbCAgICAgICAgICAgICAoREJ1c0hlYWRlciAgICAgICAgKmhlYWRlcik7Cit2b2lkICAgICAgICAgIF9kYnVzX2hlYWRlcl91cGRhdGVfbGVuZ3RocyAgICAgICAgIChEQnVzSGVhZGVyICAgICAgICAqaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGJvZHlfbGVuKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90ICAgX2RidXNfaGVhZGVyX3NldF9maWVsZF9iYXNpYyAgICAgICAgKERCdXNIZWFkZXIgICAgICAgICpoZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgICAgICAgICp2YWx1ZSk7CitkYnVzX2Jvb2xfdCAgIF9kYnVzX2hlYWRlcl9nZXRfZmllbGRfYmFzaWMgICAgICAgIChEQnVzSGVhZGVyICAgICAgICAqaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAqdmFsdWUpOworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgICBfZGJ1c19oZWFkZXJfZ2V0X2ZpZWxkX3JhdyAgICAgICAgICAoREJ1c0hlYWRlciAgICAgICAgKmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKipzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAqcG9zKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90ICAgX2RidXNfaGVhZGVyX2RlbGV0ZV9maWVsZCAgICAgICAgICAgKERCdXNIZWFkZXIgICAgICAgICpoZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgZmllbGQpOwordm9pZCAgICAgICAgICBfZGJ1c19oZWFkZXJfdG9nZ2xlX2ZsYWcgICAgICAgICAgICAoREJ1c0hlYWRlciAgICAgICAgKmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgICAgICBmbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgIHZhbHVlKTsKK2RidXNfYm9vbF90ICAgX2RidXNfaGVhZGVyX2dldF9mbGFnICAgICAgICAgICAgICAgKERCdXNIZWFkZXIgICAgICAgICpoZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90ICAgICAgZmxhZyk7CitkYnVzX2Jvb2xfdCAgIF9kYnVzX2hlYWRlcl9lbnN1cmVfc2lnbmF0dXJlICAgICAgIChEQnVzSGVhZGVyICAgICAgICAqaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAqKnR5cGVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgKnR5cGVfcG9zKTsKK2RidXNfYm9vbF90ICAgX2RidXNfaGVhZGVyX2hhdmVfbWVzc2FnZV91bnRydXN0ZWQgKGludCAgICAgICAgICAgICAgICBtYXhfbWVzc2FnZV9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVmFsaWRpdHkgICAgICAqdmFsaWRpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAqYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICpmaWVsZHNfYXJyYXlfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgKmhlYWRlcl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAqYm9keV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGxlbik7CitkYnVzX2Jvb2xfdCAgIF9kYnVzX2hlYWRlcl9sb2FkICAgICAgICAgICAgICAgICAgIChEQnVzSGVhZGVyICAgICAgICAqaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1ZhbGlkYXRpb25Nb2RlIG1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVmFsaWRpdHkgICAgICAqdmFsaWRpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBmaWVsZHNfYXJyYXlfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGhlYWRlcl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgYm9keV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGxlbik7Cit2b2lkICAgICAgICAgIF9kYnVzX2hlYWRlcl9ieXRlc3dhcCAgICAgICAgICAgICAgIChEQnVzSGVhZGVyICAgICAgICAqaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIG5ld19vcmRlcik7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitjaGFyICAgICAgICAgIF9kYnVzX2hlYWRlcl9nZXRfYnl0ZV9vcmRlciAgICAgICAgIChjb25zdCBEQnVzSGVhZGVyICAqaGVhZGVyKTsKKworCisKKyNlbmRpZiAvKiBEQlVTX01BUlNIQUxfSEVBREVSX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1tYXJzaGFsLXJlY3Vyc2l2ZS11dGlsLmMgYi9kYnVzL2RidXMtbWFyc2hhbC1yZWN1cnNpdmUtdXRpbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzMGY1ODgKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtbWFyc2hhbC1yZWN1cnNpdmUtdXRpbC5jCkBAIC0wLDAgKzEsMzUzNyBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLW1hcnNoYWwtcmVjdXJzaXZlLXV0aWwuYyAgV291bGQgYmUgaW4gZGJ1cy1tYXJzaGFsLXJlY3Vyc2l2ZS5jLCBidXQgb25seSB1c2VkIGluIGJ1cy90ZXN0cworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNSBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisKKyNpZmRlZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworCisjaW5jbHVkZSAiZGJ1cy1tYXJzaGFsLXJlY3Vyc2l2ZS5oIgorI2luY2x1ZGUgImRidXMtbWFyc2hhbC1iYXNpYy5oIgorI2luY2x1ZGUgImRidXMtc2lnbmF0dXJlLmgiCisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2lmICFkZWZpbmVkKFBSSXg2NCkgJiYgZGVmaW5lZChEQlVTX1dJTikKKyNkZWZpbmUgUFJJeDY0ICJJNjR4IgorI2VuZGlmCisKKy8qKiB0dXJuIHRoaXMgb24gdG8gZ2V0IGRlbHVnZWQgaW4gVHlwZVdyaXRlciB2ZXJib3NlIHNwYW0gKi8KKyNkZWZpbmUgUkVDVVJTSVZFX01BUlNIQUxfV1JJVEVfVFJBQ0UgMAorCitzdGF0aWMgdm9pZAorYmFzaWNfdmFsdWVfemVybyAoREJ1c0Jhc2ljVmFsdWUgKnZhbHVlKQoreworICB2YWx1ZS0+dTY0ID0gMDsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitiYXNpY192YWx1ZV9lcXVhbCAoaW50ICAgICAgICAgICAgIHR5cGUsCisgICAgICAgICAgICAgICAgICAgREJ1c0Jhc2ljVmFsdWUgKmxocywKKyAgICAgICAgICAgICAgICAgICBEQnVzQmFzaWNWYWx1ZSAqcmhzKQoreworICBpZiAodHlwZSA9PSBEQlVTX1RZUEVfU1RSSU5HIHx8CisgICAgICB0eXBlID09IERCVVNfVFlQRV9TSUdOQVRVUkUgfHwKKyAgICAgIHR5cGUgPT0gREJVU19UWVBFX09CSkVDVF9QQVRIKQorICAgIHsKKyAgICAgIHJldHVybiBzdHJjbXAgKGxocy0+c3RyLCByaHMtPnN0cikgPT0gMDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICByZXR1cm4gbGhzLT51NjQgPT0gcmhzLT51NjQ7CisgICAgfQorfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2VxdWFsX3ZhbHVlc19oZWxwZXIgKERCdXNUeXBlUmVhZGVyICpsaHMsCisgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmhzKQoreworICBpbnQgbGhzX3R5cGU7CisgIGludCByaHNfdHlwZTsKKworICBsaHNfdHlwZSA9IF9kYnVzX3R5cGVfcmVhZGVyX2dldF9jdXJyZW50X3R5cGUgKGxocyk7CisgIHJoc190eXBlID0gX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2N1cnJlbnRfdHlwZSAocmhzKTsKKworICBpZiAobGhzX3R5cGUgIT0gcmhzX3R5cGUpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmIChsaHNfdHlwZSA9PSBEQlVTX1RZUEVfSU5WQUxJRCkKKyAgICByZXR1cm4gVFJVRTsKKworICBpZiAoZGJ1c190eXBlX2lzX2Jhc2ljIChsaHNfdHlwZSkpCisgICAgeworICAgICAgREJ1c0Jhc2ljVmFsdWUgbGhzX3ZhbHVlOworICAgICAgREJ1c0Jhc2ljVmFsdWUgcmhzX3ZhbHVlOworCisgICAgICBiYXNpY192YWx1ZV96ZXJvICgmbGhzX3ZhbHVlKTsKKyAgICAgIGJhc2ljX3ZhbHVlX3plcm8gKCZyaHNfdmFsdWUpOworICAgICAgCisgICAgICBfZGJ1c190eXBlX3JlYWRlcl9yZWFkX2Jhc2ljIChsaHMsICZsaHNfdmFsdWUpOworICAgICAgX2RidXNfdHlwZV9yZWFkZXJfcmVhZF9iYXNpYyAocmhzLCAmcmhzX3ZhbHVlKTsKKworICAgICAgcmV0dXJuIGJhc2ljX3ZhbHVlX2VxdWFsIChsaHNfdHlwZSwgJmxoc192YWx1ZSwgJnJoc192YWx1ZSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgREJ1c1R5cGVSZWFkZXIgbGhzX3N1YjsKKyAgICAgIERCdXNUeXBlUmVhZGVyIHJoc19zdWI7CisKKyAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX3JlY3Vyc2UgKGxocywgJmxoc19zdWIpOworICAgICAgX2RidXNfdHlwZV9yZWFkZXJfcmVjdXJzZSAocmhzLCAmcmhzX3N1Yik7CisKKyAgICAgIHJldHVybiBlcXVhbF92YWx1ZXNfaGVscGVyICgmbGhzX3N1YiwgJnJoc19zdWIpOworICAgIH0KK30KKworLyoqCisgKiBTZWUgd2hldGhlciB0aGUgdHdvIHJlYWRlcnMgcG9pbnQgdG8gaWRlbnRpY2FsIGRhdGEgYmxvY2tzLgorICoKKyAqIEBwYXJhbSBsaHMgcmVhZGVyIDEKKyAqIEBwYXJhbSByaHMgcmVhZGVyIDIKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSBkYXRhIGJsb2NrcyBoYXZlIHRoZSBzYW1lIHZhbHVlcworICovCitkYnVzX2Jvb2xfdAorX2RidXNfdHlwZV9yZWFkZXJfZXF1YWxfdmFsdWVzIChjb25zdCBEQnVzVHlwZVJlYWRlciAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzVHlwZVJlYWRlciAqcmhzKQoreworICBEQnVzVHlwZVJlYWRlciBjb3B5X2xocyA9ICpsaHM7CisgIERCdXNUeXBlUmVhZGVyIGNvcHlfcmhzID0gKnJoczsKKworICByZXR1cm4gZXF1YWxfdmFsdWVzX2hlbHBlciAoJmNvcHlfbGhzLCAmY29weV9yaHMpOworfQorCisvKiBURVNUUyAqLworCisjaWZuZGVmIERPWFlHRU5fU0hPVUxEX1NLSVBfVEhJUworCisjaW5jbHVkZSAiZGJ1cy10ZXN0LmgiCisjaW5jbHVkZSAiZGJ1cy1saXN0LmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworLyogV2hldGhlciB0byBkbyB0aGUgT09NIHN0dWZmIChvbmx5IHdpdGggb3RoZXIgZXhwZW5zaXZlIHRlc3RzKSAqLworI2RlZmluZSBURVNUX09PTV9IQU5ETElORyAwCisvKiBXZSBkbyBzdGFydCBvZmZzZXQgMCB0aHJvdWdoIDksIHRvIGdldCB2YXJpb3VzIGFsaWdubWVudCBjYXNlcy4gU3RpbGwgdGhpcworICogb2J2aW91c2x5IG1ha2VzIHRoZSB0ZXN0IHN1aXRlIHJ1biAxMHggYXMgc2xvdy4KKyAqLworI2RlZmluZSBNQVhfSU5JVElBTF9PRkZTRVQgOQorCisvKiBMYXJnZXN0IGl0ZXJhdGlvbiBjb3VudCB0byB0ZXN0IGNvcHlpbmcsIHJlYWxpZ25tZW50LAorICogZXRjLiB3aXRoLiBpLmUuIHdlIG9ubHkgdGVzdCB0aGlzIHN0dWZmIHdpdGggc29tZSBvZiB0aGUgc21hbGxlcgorICogZGF0YSBzZXRzLgorICovCisjZGVmaW5lIE1BWF9JVEVSQVRJT05TX0ZPUl9FWFBFTlNJVkVfVEVTVFMgMTAwMAorCit0eXBlZGVmIHN0cnVjdAoreworICBpbnQgYnl0ZV9vcmRlcjsKKyAgaW50IGluaXRpYWxfb2Zmc2V0OworICBEQnVzU3RyaW5nIHNpZ25hdHVyZTsKKyAgREJ1c1N0cmluZyBib2R5OworfSBEYXRhQmxvY2s7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGludCBzYXZlZF9zaWdfbGVuOworICBpbnQgc2F2ZWRfYm9keV9sZW47Cit9IERhdGFCbG9ja1N0YXRlOworCisjZGVmaW5lIE5fRkVOQ0VfQllURVMgNQorI2RlZmluZSBGRU5DRV9CWVRFU19TVFIgImFiY2RlIgorI2RlZmluZSBJTklUSUFMX1BBRERJTkdfQllURSAnXDAnCisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZGF0YV9ibG9ja19pbml0IChEYXRhQmxvY2sgKmJsb2NrLAorICAgICAgICAgICAgICAgICBpbnQgICAgICAgIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgIGludCAgICAgICAgaW5pdGlhbF9vZmZzZXQpCit7CisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZibG9jay0+c2lnbmF0dXJlKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmJsb2NrLT5ib2R5KSkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmJsb2NrLT5zaWduYXR1cmUpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19pbnNlcnRfYnl0ZXMgKCZibG9jay0+c2lnbmF0dXJlLCAwLCBpbml0aWFsX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTklUSUFMX1BBRERJTkdfQllURSkgfHwKKyAgICAgICFfZGJ1c19zdHJpbmdfaW5zZXJ0X2J5dGVzICgmYmxvY2stPmJvZHksIDAsIGluaXRpYWxfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOSVRJQUxfUEFERElOR19CWVRFKSB8fAorICAgICAgIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZibG9jay0+c2lnbmF0dXJlLCBGRU5DRV9CWVRFU19TVFIpIHx8CisgICAgICAhX2RidXNfc3RyaW5nX2FwcGVuZCAoJmJsb2NrLT5ib2R5LCBGRU5DRV9CWVRFU19TVFIpKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmYmxvY2stPnNpZ25hdHVyZSk7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmJsb2NrLT5ib2R5KTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgYmxvY2stPmJ5dGVfb3JkZXIgPSBieXRlX29yZGVyOworICBibG9jay0+aW5pdGlhbF9vZmZzZXQgPSBpbml0aWFsX29mZnNldDsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK2RhdGFfYmxvY2tfc2F2ZSAoRGF0YUJsb2NrICAgICAgKmJsb2NrLAorICAgICAgICAgICAgICAgICBEYXRhQmxvY2tTdGF0ZSAqc3RhdGUpCit7CisgIHN0YXRlLT5zYXZlZF9zaWdfbGVuID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZibG9jay0+c2lnbmF0dXJlKSAtIE5fRkVOQ0VfQllURVM7CisgIHN0YXRlLT5zYXZlZF9ib2R5X2xlbiA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmYmxvY2stPmJvZHkpIC0gTl9GRU5DRV9CWVRFUzsKK30KKworc3RhdGljIHZvaWQKK2RhdGFfYmxvY2tfcmVzdG9yZSAoRGF0YUJsb2NrICAgICAgKmJsb2NrLAorICAgICAgICAgICAgICAgICAgICBEYXRhQmxvY2tTdGF0ZSAqc3RhdGUpCit7CisgIF9kYnVzX3N0cmluZ19kZWxldGUgKCZibG9jay0+c2lnbmF0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+c2F2ZWRfc2lnX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZibG9jay0+c2lnbmF0dXJlKSAtIHN0YXRlLT5zYXZlZF9zaWdfbGVuIC0gTl9GRU5DRV9CWVRFUyk7CisgIF9kYnVzX3N0cmluZ19kZWxldGUgKCZibG9jay0+Ym9keSwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPnNhdmVkX2JvZHlfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmJsb2NrLT5ib2R5KSAtIHN0YXRlLT5zYXZlZF9ib2R5X2xlbiAtIE5fRkVOQ0VfQllURVMpOworfQorCitzdGF0aWMgdm9pZAorZGF0YV9ibG9ja192ZXJpZnkgKERhdGFCbG9jayAqYmxvY2spCit7CisgIGlmICghX2RidXNfc3RyaW5nX2VuZHNfd2l0aF9jX3N0ciAoJmJsb2NrLT5zaWduYXR1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkVOQ0VfQllURVNfU1RSKSkKKyAgICB7CisgICAgICBpbnQgb2Zmc2V0OworCisgICAgICBvZmZzZXQgPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmJsb2NrLT5zaWduYXR1cmUpIC0gTl9GRU5DRV9CWVRFUyAtIDg7CisgICAgICBpZiAob2Zmc2V0IDwgMCkKKyAgICAgICAgb2Zmc2V0ID0gMDsKKworICAgICAgX2RidXNfdmVyYm9zZV9ieXRlc19vZl9zdHJpbmcgKCZibG9jay0+c2lnbmF0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmJsb2NrLT5zaWduYXR1cmUpIC0gb2Zmc2V0KTsKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImJsb2NrIGRpZCBub3QgdmVyaWZ5OiBiYWQgYnl0ZXMgYXQgZW5kIG9mIHNpZ25hdHVyZSIpOworICAgIH0KKyAgaWYgKCFfZGJ1c19zdHJpbmdfZW5kc193aXRoX2Nfc3RyICgmYmxvY2stPmJvZHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkVOQ0VfQllURVNfU1RSKSkKKyAgICB7CisgICAgICBpbnQgb2Zmc2V0OworCisgICAgICBvZmZzZXQgPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmJsb2NrLT5ib2R5KSAtIE5fRkVOQ0VfQllURVMgLSA4OworICAgICAgaWYgKG9mZnNldCA8IDApCisgICAgICAgIG9mZnNldCA9IDA7CisKKyAgICAgIF9kYnVzX3ZlcmJvc2VfYnl0ZXNfb2Zfc3RyaW5nICgmYmxvY2stPmJvZHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmYmxvY2stPmJvZHkpIC0gb2Zmc2V0KTsKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImJsb2NrIGRpZCBub3QgdmVyaWZ5OiBiYWQgYnl0ZXMgYXQgZW5kIG9mIGJvZHkiKTsKKyAgICB9CisKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfdmFsaWRhdGVfbnVsICgmYmxvY2stPnNpZ25hdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBibG9jay0+aW5pdGlhbF9vZmZzZXQpKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfdmFsaWRhdGVfbnVsICgmYmxvY2stPmJvZHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgYmxvY2stPmluaXRpYWxfb2Zmc2V0KSk7Cit9CisKK3N0YXRpYyB2b2lkCitkYXRhX2Jsb2NrX2ZyZWUgKERhdGFCbG9jayAqYmxvY2spCit7CisgIGRhdGFfYmxvY2tfdmVyaWZ5IChibG9jayk7CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZibG9jay0+c2lnbmF0dXJlKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZibG9jay0+Ym9keSk7Cit9CisKK3N0YXRpYyB2b2lkCitkYXRhX2Jsb2NrX3Jlc2V0IChEYXRhQmxvY2sgKmJsb2NrKQoreworICBkYXRhX2Jsb2NrX3ZlcmlmeSAoYmxvY2spOworCisgIF9kYnVzX3N0cmluZ19kZWxldGUgKCZibG9jay0+c2lnbmF0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICBibG9jay0+aW5pdGlhbF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmYmxvY2stPnNpZ25hdHVyZSkgLSBOX0ZFTkNFX0JZVEVTIC0gYmxvY2stPmluaXRpYWxfb2Zmc2V0KTsKKyAgX2RidXNfc3RyaW5nX2RlbGV0ZSAoJmJsb2NrLT5ib2R5LAorICAgICAgICAgICAgICAgICAgICAgICBibG9jay0+aW5pdGlhbF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmYmxvY2stPmJvZHkpIC0gTl9GRU5DRV9CWVRFUyAtIGJsb2NrLT5pbml0aWFsX29mZnNldCk7CisKKyAgZGF0YV9ibG9ja192ZXJpZnkgKGJsb2NrKTsKK30KKworc3RhdGljIHZvaWQKK2RhdGFfYmxvY2tfaW5pdF9yZWFkZXJfd3JpdGVyIChEYXRhQmxvY2sgICAgICAqYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVdyaXRlciAqd3JpdGVyKQoreworICBpZiAocmVhZGVyKQorICAgIF9kYnVzX3R5cGVfcmVhZGVyX2luaXQgKHJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jay0+Ynl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmxvY2stPnNpZ25hdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jay0+aW5pdGlhbF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJsb2NrLT5ib2R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrLT5pbml0aWFsX29mZnNldCk7CisKKyAgaWYgKHdyaXRlcikKKyAgICBfZGJ1c190eXBlX3dyaXRlcl9pbml0ICh3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2stPmJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJsb2NrLT5zaWduYXR1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZibG9jay0+c2lnbmF0dXJlKSAtIE5fRkVOQ0VfQllURVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJsb2NrLT5ib2R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmYmxvY2stPmJvZHkpIC0gTl9GRU5DRV9CWVRFUyk7Cit9CisKK3N0YXRpYyB2b2lkCityZWFsX2NoZWNrX2V4cGVjdGVkX3R5cGUgKERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBleHBlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKmZ1bmNuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgbGluZSkKK3sKKyAgaW50IHQ7CisKKyAgdCA9IF9kYnVzX3R5cGVfcmVhZGVyX2dldF9jdXJyZW50X3R5cGUgKHJlYWRlcik7CisKKyAgaWYgKHQgIT0gZXhwZWN0ZWQpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIlJlYWQgdHlwZSAlcyB3aGlsZSBleHBlY3RpbmcgJXMgYXQgJXMgbGluZSAlZCIsCisgICAgICAgICAgICAgICAgICBfZGJ1c190eXBlX3RvX3N0cmluZyAodCksCisgICAgICAgICAgICAgICAgICBfZGJ1c190eXBlX3RvX3N0cmluZyAoZXhwZWN0ZWQpLAorICAgICAgICAgICAgICAgICAgZnVuY25hbWUsIGxpbmUpOworCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJyZWFkIHdyb25nIHR5cGUiKTsKKyAgICB9Cit9CisKKyNkZWZpbmUgY2hlY2tfZXhwZWN0ZWRfdHlwZShyZWFkZXIsIGV4cGVjdGVkKSByZWFsX2NoZWNrX2V4cGVjdGVkX3R5cGUgKHJlYWRlciwgZXhwZWN0ZWQsIF9EQlVTX0ZVTkNUSU9OX05BTUUsIF9fTElORV9fKQorCisjZGVmaW5lIE5FWFRfRVhQRUNUSU5HX1RSVUUocmVhZGVyKSAgZG8geyBpZiAoIV9kYnVzX3R5cGVfcmVhZGVyX25leHQgKHJlYWRlcikpICAgICAgICAgXAorIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfZGJ1c193YXJuICgiX2RidXNfdHlwZV9yZWFkZXJfbmV4dCgpIHNob3VsZCBoYXZlIHJldHVybmVkIFRSVUUgYXQgJXMgJWQiLCAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfREJVU19GVU5DVElPTl9OQU1FLCBfX0xJTkVfXyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInRlc3QgZmFpbGVkIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIE5FWFRfRVhQRUNUSU5HX0ZBTFNFKHJlYWRlcikgZG8geyBpZiAoX2RidXNfdHlwZV9yZWFkZXJfbmV4dCAocmVhZGVyKSkgICAgICAgICAgXAorIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfZGJ1c193YXJuICgiX2RidXNfdHlwZV9yZWFkZXJfbmV4dCgpIHNob3VsZCBoYXZlIHJldHVybmVkIEZBTFNFIGF0ICVzICVkIiwgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfREJVU19GVU5DVElPTl9OQU1FLCBfX0xJTkVfXyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInRlc3QgZmFpbGVkIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgY2hlY2tfZXhwZWN0ZWRfdHlwZSAocmVhZGVyLCBEQlVTX1RZUEVfSU5WQUxJRCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKwordHlwZWRlZiBzdHJ1Y3QgVGVzdFR5cGVOb2RlICAgICAgICAgICAgICAgVGVzdFR5cGVOb2RlOwordHlwZWRlZiBzdHJ1Y3QgVGVzdFR5cGVOb2RlQ2xhc3MgICAgICAgICAgVGVzdFR5cGVOb2RlQ2xhc3M7Cit0eXBlZGVmIHN0cnVjdCBUZXN0VHlwZU5vZGVDb250YWluZXIgICAgICBUZXN0VHlwZU5vZGVDb250YWluZXI7Cit0eXBlZGVmIHN0cnVjdCBUZXN0VHlwZU5vZGVDb250YWluZXJDbGFzcyBUZXN0VHlwZU5vZGVDb250YWluZXJDbGFzczsKKworc3RydWN0IFRlc3RUeXBlTm9kZQoreworICBjb25zdCBUZXN0VHlwZU5vZGVDbGFzcyAqa2xhc3M7Cit9OworCitzdHJ1Y3QgVGVzdFR5cGVOb2RlQ29udGFpbmVyCit7CisgIFRlc3RUeXBlTm9kZSBiYXNlOworICBEQnVzTGlzdCAgICAqY2hpbGRyZW47Cit9OworCitzdHJ1Y3QgVGVzdFR5cGVOb2RlQ2xhc3MKK3sKKyAgaW50IHR5cGVjb2RlOworCisgIGludCBpbnN0YW5jZV9zaXplOworCisgIGludCBzdWJjbGFzc19kZXRhaWw7IC8qIGEgYmFkIGhhY2sgdG8gYXZvaWQgYSBidW5jaCBvZiBzdWJjbGFzcyBjYXN0aW5nICovCisKKyAgZGJ1c19ib29sX3QgICAoKiBjb25zdHJ1Y3QpICAgICAoVGVzdFR5cGVOb2RlICAgKm5vZGUpOworICB2b2lkICAgICAgICAgICgqIGRlc3Ryb3kpICAgICAgIChUZXN0VHlwZU5vZGUgICAqbm9kZSk7CisKKyAgZGJ1c19ib29sX3QgKCogd3JpdGVfdmFsdWUpICAgICAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFCbG9jayAgICAgICpibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVXcml0ZXIgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpOworICBkYnVzX2Jvb2xfdCAoKiByZWFkX3ZhbHVlKSAgICAgIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpOworICBkYnVzX2Jvb2xfdCAoKiBzZXRfdmFsdWUpICAgICAgIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWxpZ25fcm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpOworICBkYnVzX2Jvb2xfdCAoKiBidWlsZF9zaWduYXR1cmUpIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgKnN0cik7CisgIGRidXNfYm9vbF90ICgqIHdyaXRlX211bHRpKSAgICAgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhQmxvY2sgICAgICAqYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlV3JpdGVyICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgY291bnQpOworICBkYnVzX2Jvb2xfdCAoKiByZWFkX211bHRpKSAgICAgIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBjb3VudCk7Cit9OworCitzdHJ1Y3QgVGVzdFR5cGVOb2RlQ29udGFpbmVyQ2xhc3MKK3sKKyAgVGVzdFR5cGVOb2RlQ2xhc3MgYmFzZTsKK307CisKKy8qIEZJWE1FIHRoaXMgY291bGQgYmUgY2hpbGxlZCBvdXQgc3Vic3RhbnRpYWxseSBieSB1bmlmeWluZworICogdGhlIGJhc2ljIHR5cGVzIGludG8gYmFzaWNfd3JpdGVfdmFsdWUvYmFzaWNfcmVhZF92YWx1ZQorICogYW5kIGJ5IG1lcmdpbmcgcmVhZF92YWx1ZSBhbmQgc2V0X3ZhbHVlIGludG8gb25lIGZ1bmN0aW9uCisgKiB0YWtpbmcgYSBmbGFnIGFyZ3VtZW50LgorICovCitzdGF0aWMgZGJ1c19ib29sX3QgaW50MTZfd3JpdGVfdmFsdWUgICAgICAgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhQmxvY2sgICAgICAqYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlV3JpdGVyICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBpbnQxNl9yZWFkX3ZhbHVlICAgICAgICAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBpbnQxNl9zZXRfdmFsdWUgICAgICAgICAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFsaWduX3Jvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBpbnQxNl93cml0ZV9tdWx0aSAgICAgICAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFCbG9jayAgICAgICpibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVXcml0ZXIgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBjb3VudCk7CitzdGF0aWMgZGJ1c19ib29sX3QgaW50MTZfcmVhZF9tdWx0aSAgICAgICAgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGNvdW50KTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBpbnQzMl93cml0ZV92YWx1ZSAgICAgICAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFCbG9jayAgICAgICpibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVXcml0ZXIgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpOworc3RhdGljIGRidXNfYm9vbF90IGludDMyX3JlYWRfdmFsdWUgICAgICAgIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpOworc3RhdGljIGRidXNfYm9vbF90IGludDMyX3NldF92YWx1ZSAgICAgICAgIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWxpZ25fcm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpOworc3RhdGljIGRidXNfYm9vbF90IGludDMyX3dyaXRlX211bHRpICAgICAgIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YUJsb2NrICAgICAgKmJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVdyaXRlciAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGNvdW50KTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBpbnQzMl9yZWFkX211bHRpICAgICAgICAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgY291bnQpOworc3RhdGljIGRidXNfYm9vbF90IGludDY0X3dyaXRlX3ZhbHVlICAgICAgIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YUJsb2NrICAgICAgKmJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVdyaXRlciAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCk7CitzdGF0aWMgZGJ1c19ib29sX3QgaW50NjRfcmVhZF92YWx1ZSAgICAgICAgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCk7CitzdGF0aWMgZGJ1c19ib29sX3QgaW50NjRfc2V0X3ZhbHVlICAgICAgICAgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhbGlnbl9yb290LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCk7CitzdGF0aWMgZGJ1c19ib29sX3Qgc3RyaW5nX3dyaXRlX3ZhbHVlICAgICAgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhQmxvY2sgICAgICAqYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlV3JpdGVyICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBzdHJpbmdfcmVhZF92YWx1ZSAgICAgICAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBzdHJpbmdfc2V0X3ZhbHVlICAgICAgICAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFsaWduX3Jvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBib29sX3dyaXRlX3ZhbHVlICAgICAgICAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFCbG9jayAgICAgICpibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVXcml0ZXIgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpOworc3RhdGljIGRidXNfYm9vbF90IGJvb2xfcmVhZF92YWx1ZSAgICAgICAgIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpOworc3RhdGljIGRidXNfYm9vbF90IGJvb2xfc2V0X3ZhbHVlICAgICAgICAgIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWxpZ25fcm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpOworc3RhdGljIGRidXNfYm9vbF90IGJ5dGVfd3JpdGVfdmFsdWUgICAgICAgIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YUJsb2NrICAgICAgKmJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVdyaXRlciAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCk7CitzdGF0aWMgZGJ1c19ib29sX3QgYnl0ZV9yZWFkX3ZhbHVlICAgICAgICAgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCk7CitzdGF0aWMgZGJ1c19ib29sX3QgYnl0ZV9zZXRfdmFsdWUgICAgICAgICAgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhbGlnbl9yb290LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCk7CitzdGF0aWMgZGJ1c19ib29sX3QgZG91YmxlX3dyaXRlX3ZhbHVlICAgICAgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhQmxvY2sgICAgICAqYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlV3JpdGVyICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBkb3VibGVfcmVhZF92YWx1ZSAgICAgICAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBkb3VibGVfc2V0X3ZhbHVlICAgICAgICAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFsaWduX3Jvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBvYmplY3RfcGF0aF93cml0ZV92YWx1ZSAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFCbG9jayAgICAgICpibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVXcml0ZXIgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpOworc3RhdGljIGRidXNfYm9vbF90IG9iamVjdF9wYXRoX3JlYWRfdmFsdWUgIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpOworc3RhdGljIGRidXNfYm9vbF90IG9iamVjdF9wYXRoX3NldF92YWx1ZSAgIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWxpZ25fcm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpOworc3RhdGljIGRidXNfYm9vbF90IHNpZ25hdHVyZV93cml0ZV92YWx1ZSAgIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YUJsb2NrICAgICAgKmJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVdyaXRlciAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCk7CitzdGF0aWMgZGJ1c19ib29sX3Qgc2lnbmF0dXJlX3JlYWRfdmFsdWUgICAgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCk7CitzdGF0aWMgZGJ1c19ib29sX3Qgc2lnbmF0dXJlX3NldF92YWx1ZSAgICAgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhbGlnbl9yb290LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCk7CitzdGF0aWMgZGJ1c19ib29sX3Qgc3RydWN0X3dyaXRlX3ZhbHVlICAgICAgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhQmxvY2sgICAgICAqYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlV3JpdGVyICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBzdHJ1Y3RfcmVhZF92YWx1ZSAgICAgICAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBzdHJ1Y3Rfc2V0X3ZhbHVlICAgICAgICAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFsaWduX3Jvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBzdHJ1Y3RfYnVpbGRfc2lnbmF0dXJlICAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICpzdHIpOworc3RhdGljIGRidXNfYm9vbF90IGRpY3Rfd3JpdGVfdmFsdWUgICAgICAgIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YUJsb2NrICAgICAgKmJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVdyaXRlciAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCk7CitzdGF0aWMgZGJ1c19ib29sX3QgZGljdF9yZWFkX3ZhbHVlICAgICAgICAgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCk7CitzdGF0aWMgZGJ1c19ib29sX3QgZGljdF9zZXRfdmFsdWUgICAgICAgICAgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhbGlnbl9yb290LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCk7CitzdGF0aWMgZGJ1c19ib29sX3QgZGljdF9idWlsZF9zaWduYXR1cmUgICAgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAqc3RyKTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBhcnJheV93cml0ZV92YWx1ZSAgICAgICAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFCbG9jayAgICAgICpibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVXcml0ZXIgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpOworc3RhdGljIGRidXNfYm9vbF90IGFycmF5X3JlYWRfdmFsdWUgICAgICAgIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpOworc3RhdGljIGRidXNfYm9vbF90IGFycmF5X3NldF92YWx1ZSAgICAgICAgIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWxpZ25fcm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpOworc3RhdGljIGRidXNfYm9vbF90IGFycmF5X2J1aWxkX3NpZ25hdHVyZSAgIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgKnN0cik7CitzdGF0aWMgZGJ1c19ib29sX3QgdmFyaWFudF93cml0ZV92YWx1ZSAgICAgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhQmxvY2sgICAgICAqYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlV3JpdGVyICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCB2YXJpYW50X3JlYWRfdmFsdWUgICAgICAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCB2YXJpYW50X3NldF92YWx1ZSAgICAgICAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFsaWduX3Jvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKTsKK3N0YXRpYyB2b2lkICAgICAgICBjb250YWluZXJfZGVzdHJveSAgICAgICAoVGVzdFR5cGVOb2RlICAgKm5vZGUpOworCisKKworc3RhdGljIGNvbnN0IFRlc3RUeXBlTm9kZUNsYXNzIGludDE2X2NsYXNzID0geworICBEQlVTX1RZUEVfSU5UMTYsCisgIHNpemVvZiAoVGVzdFR5cGVOb2RlKSwKKyAgMCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgaW50MTZfd3JpdGVfdmFsdWUsCisgIGludDE2X3JlYWRfdmFsdWUsCisgIGludDE2X3NldF92YWx1ZSwKKyAgTlVMTCwKKyAgaW50MTZfd3JpdGVfbXVsdGksCisgIGludDE2X3JlYWRfbXVsdGkKK307CisKK3N0YXRpYyBjb25zdCBUZXN0VHlwZU5vZGVDbGFzcyB1aW50MTZfY2xhc3MgPSB7CisgIERCVVNfVFlQRV9VSU5UMTYsCisgIHNpemVvZiAoVGVzdFR5cGVOb2RlKSwKKyAgMCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgaW50MTZfd3JpdGVfdmFsdWUsIC8qIHJlY3ljbGUgZnJvbSBpbnQxNiAqLworICBpbnQxNl9yZWFkX3ZhbHVlLCAgLyogcmVjeWNsZSBmcm9tIGludDE2ICovCisgIGludDE2X3NldF92YWx1ZSwgICAvKiByZWN5Y2xlIGZyb20gaW50MTYgKi8KKyAgTlVMTCwKKyAgaW50MTZfd3JpdGVfbXVsdGksIC8qIHJlY3ljbGUgZnJvbSBpbnQxNiAqLworICBpbnQxNl9yZWFkX211bHRpICAgLyogcmVjeWNsZSBmcm9tIGludDE2ICovCit9OworCitzdGF0aWMgY29uc3QgVGVzdFR5cGVOb2RlQ2xhc3MgaW50MzJfY2xhc3MgPSB7CisgIERCVVNfVFlQRV9JTlQzMiwKKyAgc2l6ZW9mIChUZXN0VHlwZU5vZGUpLAorICAwLAorICBOVUxMLAorICBOVUxMLAorICBpbnQzMl93cml0ZV92YWx1ZSwKKyAgaW50MzJfcmVhZF92YWx1ZSwKKyAgaW50MzJfc2V0X3ZhbHVlLAorICBOVUxMLAorICBpbnQzMl93cml0ZV9tdWx0aSwKKyAgaW50MzJfcmVhZF9tdWx0aQorfTsKKworc3RhdGljIGNvbnN0IFRlc3RUeXBlTm9kZUNsYXNzIHVpbnQzMl9jbGFzcyA9IHsKKyAgREJVU19UWVBFX1VJTlQzMiwKKyAgc2l6ZW9mIChUZXN0VHlwZU5vZGUpLAorICAwLAorICBOVUxMLAorICBOVUxMLAorICBpbnQzMl93cml0ZV92YWx1ZSwgLyogcmVjeWNsZSBmcm9tIGludDMyICovCisgIGludDMyX3JlYWRfdmFsdWUsICAvKiByZWN5Y2xlIGZyb20gaW50MzIgKi8KKyAgaW50MzJfc2V0X3ZhbHVlLCAgIC8qIHJlY3ljbGUgZnJvbSBpbnQzMiAqLworICBOVUxMLAorICBpbnQzMl93cml0ZV9tdWx0aSwgLyogcmVjeWNsZSBmcm9tIGludDMyICovCisgIGludDMyX3JlYWRfbXVsdGkgICAvKiByZWN5Y2xlIGZyb20gaW50MzIgKi8KK307CisKK3N0YXRpYyBjb25zdCBUZXN0VHlwZU5vZGVDbGFzcyBpbnQ2NF9jbGFzcyA9IHsKKyAgREJVU19UWVBFX0lOVDY0LAorICBzaXplb2YgKFRlc3RUeXBlTm9kZSksCisgIDAsCisgIE5VTEwsCisgIE5VTEwsCisgIGludDY0X3dyaXRlX3ZhbHVlLAorICBpbnQ2NF9yZWFkX3ZhbHVlLAorICBpbnQ2NF9zZXRfdmFsdWUsCisgIE5VTEwsCisgIE5VTEwsIC8qIEZJWE1FICovCisgIE5VTEwgIC8qIEZJWE1FICovCit9OworCitzdGF0aWMgY29uc3QgVGVzdFR5cGVOb2RlQ2xhc3MgdWludDY0X2NsYXNzID0geworICBEQlVTX1RZUEVfVUlOVDY0LAorICBzaXplb2YgKFRlc3RUeXBlTm9kZSksCisgIDAsCisgIE5VTEwsCisgIE5VTEwsCisgIGludDY0X3dyaXRlX3ZhbHVlLCAvKiByZWN5Y2xlIGZyb20gaW50NjQgKi8KKyAgaW50NjRfcmVhZF92YWx1ZSwgIC8qIHJlY3ljbGUgZnJvbSBpbnQ2NCAqLworICBpbnQ2NF9zZXRfdmFsdWUsICAgLyogcmVjeWNsZSBmcm9tIGludDY0ICovCisgIE5VTEwsCisgIE5VTEwsIC8qIEZJWE1FICovCisgIE5VTEwgIC8qIEZJWE1FICovCit9OworCitzdGF0aWMgY29uc3QgVGVzdFR5cGVOb2RlQ2xhc3Mgc3RyaW5nXzBfY2xhc3MgPSB7CisgIERCVVNfVFlQRV9TVFJJTkcsCisgIHNpemVvZiAoVGVzdFR5cGVOb2RlKSwKKyAgMCwgLyogc3RyaW5nIGxlbmd0aCAqLworICBOVUxMLAorICBOVUxMLAorICBzdHJpbmdfd3JpdGVfdmFsdWUsCisgIHN0cmluZ19yZWFkX3ZhbHVlLAorICBzdHJpbmdfc2V0X3ZhbHVlLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMCit9OworCitzdGF0aWMgY29uc3QgVGVzdFR5cGVOb2RlQ2xhc3Mgc3RyaW5nXzFfY2xhc3MgPSB7CisgIERCVVNfVFlQRV9TVFJJTkcsCisgIHNpemVvZiAoVGVzdFR5cGVOb2RlKSwKKyAgMSwgLyogc3RyaW5nIGxlbmd0aCAqLworICBOVUxMLAorICBOVUxMLAorICBzdHJpbmdfd3JpdGVfdmFsdWUsCisgIHN0cmluZ19yZWFkX3ZhbHVlLAorICBzdHJpbmdfc2V0X3ZhbHVlLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMCit9OworCisvKiB3aXRoIG51bCwgYSBsZW4gMyBzdHJpbmcgc2hvdWxkIGZpbGwgNCBieXRlcyBhbmQgdGh1cyBpcyAic3BlY2lhbCIgKi8KK3N0YXRpYyBjb25zdCBUZXN0VHlwZU5vZGVDbGFzcyBzdHJpbmdfM19jbGFzcyA9IHsKKyAgREJVU19UWVBFX1NUUklORywKKyAgc2l6ZW9mIChUZXN0VHlwZU5vZGUpLAorICAzLCAvKiBzdHJpbmcgbGVuZ3RoICovCisgIE5VTEwsCisgIE5VTEwsCisgIHN0cmluZ193cml0ZV92YWx1ZSwKKyAgc3RyaW5nX3JlYWRfdmFsdWUsCisgIHN0cmluZ19zZXRfdmFsdWUsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwKK307CisKKy8qIHdpdGggbnVsLCBhIGxlbiA4IHN0cmluZyBzaG91bGQgZmlsbCA5IGJ5dGVzIGFuZCB0aHVzIGlzICJzcGVjaWFsIiAoZmFyLWZldGNoZWQgSSBzdXBwb3NlKSAqLworc3RhdGljIGNvbnN0IFRlc3RUeXBlTm9kZUNsYXNzIHN0cmluZ184X2NsYXNzID0geworICBEQlVTX1RZUEVfU1RSSU5HLAorICBzaXplb2YgKFRlc3RUeXBlTm9kZSksCisgIDgsIC8qIHN0cmluZyBsZW5ndGggKi8KKyAgTlVMTCwKKyAgTlVMTCwKKyAgc3RyaW5nX3dyaXRlX3ZhbHVlLAorICBzdHJpbmdfcmVhZF92YWx1ZSwKKyAgc3RyaW5nX3NldF92YWx1ZSwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTAorfTsKKworc3RhdGljIGNvbnN0IFRlc3RUeXBlTm9kZUNsYXNzIGJvb2xfY2xhc3MgPSB7CisgIERCVVNfVFlQRV9CT09MRUFOLAorICBzaXplb2YgKFRlc3RUeXBlTm9kZSksCisgIDAsCisgIE5VTEwsCisgIE5VTEwsCisgIGJvb2xfd3JpdGVfdmFsdWUsCisgIGJvb2xfcmVhZF92YWx1ZSwKKyAgYm9vbF9zZXRfdmFsdWUsCisgIE5VTEwsCisgIE5VTEwsIC8qIEZJWE1FICovCisgIE5VTEwgIC8qIEZJWE1FICovCit9OworCitzdGF0aWMgY29uc3QgVGVzdFR5cGVOb2RlQ2xhc3MgYnl0ZV9jbGFzcyA9IHsKKyAgREJVU19UWVBFX0JZVEUsCisgIHNpemVvZiAoVGVzdFR5cGVOb2RlKSwKKyAgMCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgYnl0ZV93cml0ZV92YWx1ZSwKKyAgYnl0ZV9yZWFkX3ZhbHVlLAorICBieXRlX3NldF92YWx1ZSwKKyAgTlVMTCwKKyAgTlVMTCwgLyogRklYTUUgKi8KKyAgTlVMTCAgLyogRklYTUUgKi8KK307CisKK3N0YXRpYyBjb25zdCBUZXN0VHlwZU5vZGVDbGFzcyBkb3VibGVfY2xhc3MgPSB7CisgIERCVVNfVFlQRV9ET1VCTEUsCisgIHNpemVvZiAoVGVzdFR5cGVOb2RlKSwKKyAgMCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgZG91YmxlX3dyaXRlX3ZhbHVlLAorICBkb3VibGVfcmVhZF92YWx1ZSwKKyAgZG91YmxlX3NldF92YWx1ZSwKKyAgTlVMTCwKKyAgTlVMTCwgLyogRklYTUUgKi8KKyAgTlVMTCAgLyogRklYTUUgKi8KK307CisKK3N0YXRpYyBjb25zdCBUZXN0VHlwZU5vZGVDbGFzcyBvYmplY3RfcGF0aF9jbGFzcyA9IHsKKyAgREJVU19UWVBFX09CSkVDVF9QQVRILAorICBzaXplb2YgKFRlc3RUeXBlTm9kZSksCisgIDAsCisgIE5VTEwsCisgIE5VTEwsCisgIG9iamVjdF9wYXRoX3dyaXRlX3ZhbHVlLAorICBvYmplY3RfcGF0aF9yZWFkX3ZhbHVlLAorICBvYmplY3RfcGF0aF9zZXRfdmFsdWUsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwKK307CisKK3N0YXRpYyBjb25zdCBUZXN0VHlwZU5vZGVDbGFzcyBzaWduYXR1cmVfY2xhc3MgPSB7CisgIERCVVNfVFlQRV9TSUdOQVRVUkUsCisgIHNpemVvZiAoVGVzdFR5cGVOb2RlKSwKKyAgMCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgc2lnbmF0dXJlX3dyaXRlX3ZhbHVlLAorICBzaWduYXR1cmVfcmVhZF92YWx1ZSwKKyAgc2lnbmF0dXJlX3NldF92YWx1ZSwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTAorfTsKKworc3RhdGljIGNvbnN0IFRlc3RUeXBlTm9kZUNsYXNzIHN0cnVjdF8xX2NsYXNzID0geworICBEQlVTX1RZUEVfU1RSVUNULAorICBzaXplb2YgKFRlc3RUeXBlTm9kZUNvbnRhaW5lciksCisgIDEsIC8qIG51bWJlciBvZiB0aW1lcyBjaGlsZHJlbiBhcHBlYXIgYXMgZmllbGRzICovCisgIE5VTEwsCisgIGNvbnRhaW5lcl9kZXN0cm95LAorICBzdHJ1Y3Rfd3JpdGVfdmFsdWUsCisgIHN0cnVjdF9yZWFkX3ZhbHVlLAorICBzdHJ1Y3Rfc2V0X3ZhbHVlLAorICBzdHJ1Y3RfYnVpbGRfc2lnbmF0dXJlLAorICBOVUxMLAorICBOVUxMCit9OworCitzdGF0aWMgY29uc3QgVGVzdFR5cGVOb2RlQ2xhc3Mgc3RydWN0XzJfY2xhc3MgPSB7CisgIERCVVNfVFlQRV9TVFJVQ1QsCisgIHNpemVvZiAoVGVzdFR5cGVOb2RlQ29udGFpbmVyKSwKKyAgMiwgLyogbnVtYmVyIG9mIHRpbWVzIGNoaWxkcmVuIGFwcGVhciBhcyBmaWVsZHMgKi8KKyAgTlVMTCwKKyAgY29udGFpbmVyX2Rlc3Ryb3ksCisgIHN0cnVjdF93cml0ZV92YWx1ZSwKKyAgc3RydWN0X3JlYWRfdmFsdWUsCisgIHN0cnVjdF9zZXRfdmFsdWUsCisgIHN0cnVjdF9idWlsZF9zaWduYXR1cmUsCisgIE5VTEwsCisgIE5VTEwKK307CisKK3N0YXRpYyBjb25zdCBUZXN0VHlwZU5vZGVDbGFzcyBkaWN0XzFfY2xhc3MgPSB7CisgIERCVVNfVFlQRV9BUlJBWSwgLyogdGhpcyBpcyBjb3JyZWN0LCBhIGRpY3QgaXMgYW4gYXJyYXkgb2YgZGljdCBlbnRyeSAqLworICBzaXplb2YgKFRlc3RUeXBlTm9kZUNvbnRhaW5lciksCisgIDEsIC8qIG51bWJlciBvZiBlbnRyaWVzICovCisgIE5VTEwsCisgIGNvbnRhaW5lcl9kZXN0cm95LAorICBkaWN0X3dyaXRlX3ZhbHVlLAorICBkaWN0X3JlYWRfdmFsdWUsCisgIGRpY3Rfc2V0X3ZhbHVlLAorICBkaWN0X2J1aWxkX3NpZ25hdHVyZSwKKyAgTlVMTCwKKyAgTlVMTAorfTsKKworc3RhdGljIGRidXNfYm9vbF90IGFycmF5c193cml0ZV9maXhlZF9pbl9ibG9ja3MgPSBGQUxTRTsKKworc3RhdGljIGNvbnN0IFRlc3RUeXBlTm9kZUNsYXNzIGFycmF5XzBfY2xhc3MgPSB7CisgIERCVVNfVFlQRV9BUlJBWSwKKyAgc2l6ZW9mIChUZXN0VHlwZU5vZGVDb250YWluZXIpLAorICAwLCAvKiBudW1iZXIgb2YgYXJyYXkgZWxlbWVudHMgKi8KKyAgTlVMTCwKKyAgY29udGFpbmVyX2Rlc3Ryb3ksCisgIGFycmF5X3dyaXRlX3ZhbHVlLAorICBhcnJheV9yZWFkX3ZhbHVlLAorICBhcnJheV9zZXRfdmFsdWUsCisgIGFycmF5X2J1aWxkX3NpZ25hdHVyZSwKKyAgTlVMTCwKKyAgTlVMTAorfTsKKworc3RhdGljIGNvbnN0IFRlc3RUeXBlTm9kZUNsYXNzIGFycmF5XzFfY2xhc3MgPSB7CisgIERCVVNfVFlQRV9BUlJBWSwKKyAgc2l6ZW9mIChUZXN0VHlwZU5vZGVDb250YWluZXIpLAorICAxLCAvKiBudW1iZXIgb2YgYXJyYXkgZWxlbWVudHMgKi8KKyAgTlVMTCwKKyAgY29udGFpbmVyX2Rlc3Ryb3ksCisgIGFycmF5X3dyaXRlX3ZhbHVlLAorICBhcnJheV9yZWFkX3ZhbHVlLAorICBhcnJheV9zZXRfdmFsdWUsCisgIGFycmF5X2J1aWxkX3NpZ25hdHVyZSwKKyAgTlVMTCwKKyAgTlVMTAorfTsKKworc3RhdGljIGNvbnN0IFRlc3RUeXBlTm9kZUNsYXNzIGFycmF5XzJfY2xhc3MgPSB7CisgIERCVVNfVFlQRV9BUlJBWSwKKyAgc2l6ZW9mIChUZXN0VHlwZU5vZGVDb250YWluZXIpLAorICAyLCAvKiBudW1iZXIgb2YgYXJyYXkgZWxlbWVudHMgKi8KKyAgTlVMTCwKKyAgY29udGFpbmVyX2Rlc3Ryb3ksCisgIGFycmF5X3dyaXRlX3ZhbHVlLAorICBhcnJheV9yZWFkX3ZhbHVlLAorICBhcnJheV9zZXRfdmFsdWUsCisgIGFycmF5X2J1aWxkX3NpZ25hdHVyZSwKKyAgTlVMTCwKKyAgTlVMTAorfTsKKworc3RhdGljIGNvbnN0IFRlc3RUeXBlTm9kZUNsYXNzIGFycmF5XzlfY2xhc3MgPSB7CisgIERCVVNfVFlQRV9BUlJBWSwKKyAgc2l6ZW9mIChUZXN0VHlwZU5vZGVDb250YWluZXIpLAorICA5LCAvKiBudW1iZXIgb2YgYXJyYXkgZWxlbWVudHMgKi8KKyAgTlVMTCwKKyAgY29udGFpbmVyX2Rlc3Ryb3ksCisgIGFycmF5X3dyaXRlX3ZhbHVlLAorICBhcnJheV9yZWFkX3ZhbHVlLAorICBhcnJheV9zZXRfdmFsdWUsCisgIGFycmF5X2J1aWxkX3NpZ25hdHVyZSwKKyAgTlVMTCwKKyAgTlVMTAorfTsKKworc3RhdGljIGNvbnN0IFRlc3RUeXBlTm9kZUNsYXNzIHZhcmlhbnRfY2xhc3MgPSB7CisgIERCVVNfVFlQRV9WQVJJQU5ULAorICBzaXplb2YgKFRlc3RUeXBlTm9kZUNvbnRhaW5lciksCisgIDAsCisgIE5VTEwsCisgIGNvbnRhaW5lcl9kZXN0cm95LAorICB2YXJpYW50X3dyaXRlX3ZhbHVlLAorICB2YXJpYW50X3JlYWRfdmFsdWUsCisgIHZhcmlhbnRfc2V0X3ZhbHVlLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMCit9OworCitzdGF0aWMgY29uc3QgVGVzdFR5cGVOb2RlQ2xhc3MqIGNvbnN0CitiYXNpY19ub2Rlc1tdID0geworICAmaW50MTZfY2xhc3MsCisgICZ1aW50MTZfY2xhc3MsCisgICZpbnQzMl9jbGFzcywKKyAgJnVpbnQzMl9jbGFzcywKKyAgJmludDY0X2NsYXNzLAorICAmdWludDY0X2NsYXNzLAorICAmYm9vbF9jbGFzcywKKyAgJmJ5dGVfY2xhc3MsCisgICZkb3VibGVfY2xhc3MsCisgICZzdHJpbmdfMF9jbGFzcywKKyAgJnN0cmluZ18xX2NsYXNzLAorICAmc3RyaW5nXzNfY2xhc3MsCisgICZzdHJpbmdfOF9jbGFzcywKKyAgJm9iamVjdF9wYXRoX2NsYXNzLAorICAmc2lnbmF0dXJlX2NsYXNzCit9OworI2RlZmluZSBOX0JBU0lDUyAoX0RCVVNfTl9FTEVNRU5UUyAoYmFzaWNfbm9kZXMpKQorCitzdGF0aWMgY29uc3QgVGVzdFR5cGVOb2RlQ2xhc3MqIGNvbnN0Citjb250YWluZXJfbm9kZXNbXSA9IHsKKyAgJnN0cnVjdF8xX2NsYXNzLAorICAmYXJyYXlfMV9jbGFzcywKKyAgJnN0cnVjdF8yX2NsYXNzLAorICAmYXJyYXlfMF9jbGFzcywKKyAgJmFycmF5XzJfY2xhc3MsCisgICZ2YXJpYW50X2NsYXNzLAorICAmZGljdF8xX2NsYXNzIC8qIGxhc3Qgc2luY2Ugd2Ugd2FudCBzdHJ1Y3QgYW5kIGFycmF5IGJlZm9yZSBpdCAqLworICAvKiBhcnJheV85X2NsYXNzIGlzIG9taXR0ZWQgb24gcHVycG9zZSwgaXQncyB0b28gc2xvdzsKKyAgICogd2Ugb25seSB1c2UgaXQgaW4gb25lIGhhcmRjb2RlZCB0ZXN0IGJlbG93CisgICAqLworfTsKKyNkZWZpbmUgTl9DT05UQUlORVJTIChfREJVU19OX0VMRU1FTlRTIChjb250YWluZXJfbm9kZXMpKQorCitzdGF0aWMgVGVzdFR5cGVOb2RlKgorbm9kZV9uZXcgKGNvbnN0IFRlc3RUeXBlTm9kZUNsYXNzICprbGFzcykKK3sKKyAgVGVzdFR5cGVOb2RlICpub2RlOworCisgIG5vZGUgPSBkYnVzX21hbGxvYzAgKGtsYXNzLT5pbnN0YW5jZV9zaXplKTsKKyAgaWYgKG5vZGUgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBub2RlLT5rbGFzcyA9IGtsYXNzOworCisgIGlmIChrbGFzcy0+Y29uc3RydWN0KQorICAgIHsKKyAgICAgIGlmICghKCoga2xhc3MtPmNvbnN0cnVjdCkgKG5vZGUpKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19mcmVlIChub2RlKTsKKyAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICByZXR1cm4gbm9kZTsKK30KKworc3RhdGljIHZvaWQKK25vZGVfZGVzdHJveSAoVGVzdFR5cGVOb2RlICpub2RlKQoreworICBpZiAobm9kZS0+a2xhc3MtPmRlc3Ryb3kpCisgICAgKCogbm9kZS0+a2xhc3MtPmRlc3Ryb3kpIChub2RlKTsKKyAgZGJ1c19mcmVlIChub2RlKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90Citub2RlX3dyaXRlX3ZhbHVlIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgIERhdGFCbG9jayAgICAgICpibG9jaywKKyAgICAgICAgICAgICAgICAgIERCdXNUeXBlV3JpdGVyICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCkKK3sKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworCisgIHJldHZhbCA9ICgqIG5vZGUtPmtsYXNzLT53cml0ZV92YWx1ZSkgKG5vZGUsIGJsb2NrLCB3cml0ZXIsIHNlZWQpOworCisjaWYgMAorICAvKiBIYW5keSB0byBzZWUgd2hlcmUgdGhpbmdzIGJyZWFrLCBidXQgdG9vIGV4cGVuc2l2ZSB0byBkbyBhbGwgdGhlIHRpbWUgKi8KKyAgZGF0YV9ibG9ja192ZXJpZnkgKGJsb2NrKTsKKyNlbmRpZgorCisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorbm9kZV9yZWFkX3ZhbHVlIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpCit7CisgIC8qIERCdXNUeXBlUmVhZGVyIHJlc3RvcmVkOyAqLworCisgIGlmICghKCogbm9kZS0+a2xhc3MtPnJlYWRfdmFsdWUpIChub2RlLCByZWFkZXIsIHNlZWQpKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyogV2FybmluZzogaWYgdGhpcyBvbmUgZmFpbHMgZHVlIHRvIE9PTSwgaXQgaGFzIHNpZGUgZWZmZWN0cyAoY2FuCisgKiBtb2RpZnkgb25seSBzb21lIG9mIHRoZSBzdWItdmFsdWVzKS4gT0sgaW4gYSB0ZXN0IHN1aXRlLCBidXQgd2UKKyAqIG5ldmVyIGRvIHRoaXMgaW4gcmVhbCBjb2RlLgorICovCitzdGF0aWMgZGJ1c19ib29sX3QKK25vZGVfc2V0X3ZhbHVlIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFsaWduX3Jvb3QsCisgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpCit7CisgIGlmICghKCogbm9kZS0+a2xhc3MtPnNldF92YWx1ZSkgKG5vZGUsIHJlYWRlciwgcmVhbGlnbl9yb290LCBzZWVkKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorbm9kZV9idWlsZF9zaWduYXR1cmUgKFRlc3RUeXBlTm9kZSAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgKnN0cikKK3sKKyAgaWYgKG5vZGUtPmtsYXNzLT5idWlsZF9zaWduYXR1cmUpCisgICAgcmV0dXJuICgqIG5vZGUtPmtsYXNzLT5idWlsZF9zaWduYXR1cmUpIChub2RlLCBzdHIpOworICBlbHNlCisgICAgcmV0dXJuIF9kYnVzX3N0cmluZ19hcHBlbmRfYnl0ZSAoc3RyLCBub2RlLT5rbGFzcy0+dHlwZWNvZGUpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK25vZGVfYXBwZW5kX2NoaWxkIChUZXN0VHlwZU5vZGUgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgVGVzdFR5cGVOb2RlICpjaGlsZCkKK3sKKyAgVGVzdFR5cGVOb2RlQ29udGFpbmVyICpjb250YWluZXIgPSAoVGVzdFR5cGVOb2RlQ29udGFpbmVyKikgbm9kZTsKKworICBfZGJ1c19hc3NlcnQgKG5vZGUtPmtsYXNzLT5pbnN0YW5jZV9zaXplID49IChpbnQpIHNpemVvZiAoVGVzdFR5cGVOb2RlQ29udGFpbmVyKSk7CisKKyAgaWYgKCFfZGJ1c19saXN0X2FwcGVuZCAoJmNvbnRhaW5lci0+Y2hpbGRyZW4sIGNoaWxkKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkiKTsgLyogd2UgbmV2ZXIgY2hlY2sgdGhlIHJldHVybiB2YWx1ZSBvbiBub2RlX2FwcGVuZF9jaGlsZCBhbnlob3cgLSBpdCdzIHJ1biBmcm9tIG91dHNpZGUgdGhlIG1hbGxvYy1mYWlsdXJlIHRlc3QgY29kZSAqLworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK25vZGVfd3JpdGVfbXVsdGkgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgRGF0YUJsb2NrICAgICAgKmJsb2NrLAorICAgICAgICAgICAgICAgICAgREJ1c1R5cGVXcml0ZXIgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkLAorICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIG5fY29waWVzKQoreworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisKKyAgX2RidXNfYXNzZXJ0IChub2RlLT5rbGFzcy0+d3JpdGVfbXVsdGkgIT0gTlVMTCk7CisgIHJldHZhbCA9ICgqIG5vZGUtPmtsYXNzLT53cml0ZV9tdWx0aSkgKG5vZGUsIGJsb2NrLCB3cml0ZXIsIHNlZWQsIG5fY29waWVzKTsKKworI2lmIDAKKyAgLyogSGFuZHkgdG8gc2VlIHdoZXJlIHRoaW5ncyBicmVhaywgYnV0IHRvbyBleHBlbnNpdmUgdG8gZG8gYWxsIHRoZSB0aW1lICovCisgIGRhdGFfYmxvY2tfdmVyaWZ5IChibG9jayk7CisjZW5kaWYKKworICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK25vZGVfcmVhZF9tdWx0aSAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkLAorICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgbl9jb3BpZXMpCit7CisgIF9kYnVzX2Fzc2VydCAobm9kZS0+a2xhc3MtPnJlYWRfbXVsdGkgIT0gTlVMTCk7CisKKyAgaWYgKCEoKiBub2RlLT5rbGFzcy0+cmVhZF9tdWx0aSkgKG5vZGUsIHJlYWRlciwgc2VlZCwgbl9jb3BpZXMpKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGludCBuX2l0ZXJhdGlvbnNfY29tcGxldGVkX3RvdGFsID0gMDsKK3N0YXRpYyBpbnQgbl9pdGVyYXRpb25zX2NvbXBsZXRlZF90aGlzX3Rlc3QgPSAwOworc3RhdGljIGludCBuX2l0ZXJhdGlvbnNfZXhwZWN0ZWRfdGhpc190ZXN0ID0gMDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgY29uc3QgREJ1c1N0cmluZyAgICpzaWduYXR1cmU7CisgIERhdGFCbG9jayAgICAgICAgICAqYmxvY2s7CisgIGludCAgICAgICAgICAgICAgICAgdHlwZV9vZmZzZXQ7CisgIFRlc3RUeXBlTm9kZSAgICAgICoqbm9kZXM7CisgIGludCAgICAgICAgICAgICAgICAgbl9ub2RlczsKK30gTm9kZUl0ZXJhdGlvbkRhdGE7CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorcnVuX3Rlc3RfY29weSAoTm9kZUl0ZXJhdGlvbkRhdGEgKm5pZCkKK3sKKyAgRGF0YUJsb2NrICpzcmM7CisgIERhdGFCbG9jayBkZXN0OworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIERCdXNUeXBlUmVhZGVyIHJlYWRlcjsKKyAgREJ1c1R5cGVXcml0ZXIgd3JpdGVyOworCisgIF9kYnVzX3ZlcmJvc2UgKCJcbiIpOworCisgIHNyYyA9IG5pZC0+YmxvY2s7CisKKyAgcmV0dmFsID0gRkFMU0U7CisKKyAgaWYgKCFkYXRhX2Jsb2NrX2luaXQgKCZkZXN0LCBzcmMtPmJ5dGVfb3JkZXIsIHNyYy0+aW5pdGlhbF9vZmZzZXQpKQorICAgIHJldHVybiBGQUxTRTsKKworICBkYXRhX2Jsb2NrX2luaXRfcmVhZGVyX3dyaXRlciAoc3JjLCAmcmVhZGVyLCBOVUxMKTsKKyAgZGF0YV9ibG9ja19pbml0X3JlYWRlcl93cml0ZXIgKCZkZXN0LCBOVUxMLCAmd3JpdGVyKTsKKworICAvKiBEQnVzVHlwZVdyaXRlciBhc3N1bWVzIGl0J3Mgd3JpdGluZyBpbnRvIGFuIGV4aXN0aW5nIHNpZ25hdHVyZSwKKyAgICogc28gZG9lc24ndCBhZGQgbnVsIG9uIGl0cyBvd24uIFdlIGhhdmUgdG8gZG8gdGhhdC4KKyAgICovCisgIGlmICghX2RidXNfc3RyaW5nX2luc2VydF9ieXRlICgmZGVzdC5zaWduYXR1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0LmluaXRpYWxfb2Zmc2V0LCAnXDAnKSkKKyAgICBnb3RvIG91dDsKKworICBpZiAoIV9kYnVzX3R5cGVfd3JpdGVyX3dyaXRlX3JlYWRlciAoJndyaXRlciwgJnJlYWRlcikpCisgICAgZ290byBvdXQ7CisKKyAgLyogRGF0YSBibG9ja3Mgc2hvdWxkIG5vdyBiZSBpZGVudGljYWwgKi8KKyAgaWYgKCFfZGJ1c19zdHJpbmdfZXF1YWwgKCZzcmMtPnNpZ25hdHVyZSwgJmRlc3Quc2lnbmF0dXJlKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiU09VUkNFXG4iKTsKKyAgICAgIF9kYnVzX3ZlcmJvc2VfYnl0ZXNfb2Zfc3RyaW5nICgmc3JjLT5zaWduYXR1cmUsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzcmMtPnNpZ25hdHVyZSkpOworICAgICAgX2RidXNfdmVyYm9zZSAoIkRFU1RcbiIpOworICAgICAgX2RidXNfdmVyYm9zZV9ieXRlc19vZl9zdHJpbmcgKCZkZXN0LnNpZ25hdHVyZSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmRlc3Quc2lnbmF0dXJlKSk7CisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJzaWduYXR1cmVzIGRpZCBub3QgbWF0Y2giKTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfZXF1YWwgKCZzcmMtPmJvZHksICZkZXN0LmJvZHkpKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJTT1VSQ0VcbiIpOworICAgICAgX2RidXNfdmVyYm9zZV9ieXRlc19vZl9zdHJpbmcgKCZzcmMtPmJvZHksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzcmMtPmJvZHkpKTsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJERVNUXG4iKTsKKyAgICAgIF9kYnVzX3ZlcmJvc2VfYnl0ZXNfb2Zfc3RyaW5nICgmZGVzdC5ib2R5LCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmZGVzdC5ib2R5KSk7CisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJib2RpZXMgZGlkIG5vdCBtYXRjaCIpOworICAgIH0KKworICByZXR2YWwgPSBUUlVFOworCisgb3V0OgorCisgIGRhdGFfYmxvY2tfZnJlZSAoJmRlc3QpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorcnVuX3Rlc3RfdmFsdWVzX29ubHlfd3JpdGUgKE5vZGVJdGVyYXRpb25EYXRhICpuaWQpCit7CisgIERCdXNUeXBlUmVhZGVyIHJlYWRlcjsKKyAgREJ1c1R5cGVXcml0ZXIgd3JpdGVyOworICBpbnQgaTsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICBpbnQgc2lnX2xlbjsKKworICBfZGJ1c192ZXJib3NlICgiXG4iKTsKKworICByZXR2YWwgPSBGQUxTRTsKKworICBkYXRhX2Jsb2NrX3Jlc2V0IChuaWQtPmJsb2NrKTsKKworICBzaWdfbGVuID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKG5pZC0+c2lnbmF0dXJlKTsKKworICBfZGJ1c190eXBlX3dyaXRlcl9pbml0X3ZhbHVlc19vbmx5ICgmd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuaWQtPmJsb2NrLT5ieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuaWQtPnNpZ25hdHVyZSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5pZC0+YmxvY2stPmJvZHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmbmlkLT5ibG9jay0+Ym9keSkgLSBOX0ZFTkNFX0JZVEVTKTsKKyAgX2RidXNfdHlwZV9yZWFkZXJfaW5pdCAoJnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmlkLT5ibG9jay0+Ynl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmlkLT5zaWduYXR1cmUsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZuaWQtPmJsb2NrLT5ib2R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBuaWQtPmJsb2NrLT5pbml0aWFsX29mZnNldCk7CisKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgbmlkLT5uX25vZGVzKQorICAgIHsKKyAgICAgIGlmICghbm9kZV93cml0ZV92YWx1ZSAobmlkLT5ub2Rlc1tpXSwgbmlkLT5ibG9jaywgJndyaXRlciwgaSkpCisgICAgICAgIGdvdG8gb3V0OworCisgICAgICArK2k7CisgICAgfQorCisgIC8qIGlmIHdlIHdyb3RlIGFueSB0eXBlY29kZXMgdGhlbiB0aGlzIHdvdWxkIGZhaWwgKi8KKyAgX2RidXNfYXNzZXJ0IChzaWdfbGVuID09IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChuaWQtPnNpZ25hdHVyZSkpOworCisgIC8qIEJ1dCBiZSBzdXJlIHdlIHdyb3RlIG91dCB0aGUgdmFsdWVzIGNvcnJlY3RseSAqLworICBpID0gMDsKKyAgd2hpbGUgKGkgPCBuaWQtPm5fbm9kZXMpCisgICAgeworICAgICAgaWYgKCFub2RlX3JlYWRfdmFsdWUgKG5pZC0+bm9kZXNbaV0sICZyZWFkZXIsIGkpKQorICAgICAgICBnb3RvIG91dDsKKworICAgICAgaWYgKGkgKyAxID09IG5pZC0+bl9ub2RlcykKKyAgICAgICAgTkVYVF9FWFBFQ1RJTkdfRkFMU0UgKCZyZWFkZXIpOworICAgICAgZWxzZQorICAgICAgICBORVhUX0VYUEVDVElOR19UUlVFICgmcmVhZGVyKTsKKworICAgICAgKytpOworICAgIH0KKworICByZXR2YWwgPSBUUlVFOworCisgb3V0OgorICBkYXRhX2Jsb2NrX3Jlc2V0IChuaWQtPmJsb2NrKTsKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyogb2Zmc2V0IHRoZSBzZWVkIGZvciBzZXR0aW5nLCBzbyB3ZSBzZXQgZGlmZmVyZW50IG51bWJlcnMgdGhhbgorICogd2Ugb3JpZ2luYWxseSB3cm90ZS4gRG9uJ3Qgb2Zmc2V0IGJ5IGEgaHVnZSBudW1iZXIgc2luY2UgaW4KKyAqIHNvbWUgY2FzZXMgaXQncyB2YWx1ZSA9IHBvc3NpYmlsaXRpZXNbc2VlZCAlIG5fcG9zc2liaWxpdGllc10KKyAqIGFuZCB3ZSBkb24ndCB3YW50IHRvIHdyYXAgYXJvdW5kLiBib29sX2Zyb21fc2VlZAorICogaXMganVzdCBzZWVkICUgMiBldmVuLgorICovCisjZGVmaW5lIFNFVF9TRUVEIDEKK3N0YXRpYyBkYnVzX2Jvb2xfdAorcnVuX3Rlc3Rfc2V0X3ZhbHVlcyAoTm9kZUl0ZXJhdGlvbkRhdGEgKm5pZCkKK3sKKyAgREJ1c1R5cGVSZWFkZXIgcmVhZGVyOworICBEQnVzVHlwZVJlYWRlciByZWFsaWduX3Jvb3Q7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgaW50IGk7CisKKyAgX2RidXNfdmVyYm9zZSAoIlxuIik7CisKKyAgcmV0dmFsID0gRkFMU0U7CisKKyAgZGF0YV9ibG9ja19pbml0X3JlYWRlcl93cml0ZXIgKG5pZC0+YmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVhZGVyLCBOVUxMKTsKKworICByZWFsaWduX3Jvb3QgPSByZWFkZXI7CisKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgbmlkLT5uX25vZGVzKQorICAgIHsKKyAgICAgIGlmICghbm9kZV9zZXRfdmFsdWUgKG5pZC0+bm9kZXNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVhZGVyLCAmcmVhbGlnbl9yb290LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaSArIFNFVF9TRUVEKSkKKyAgICAgICAgZ290byBvdXQ7CisKKyAgICAgIGlmIChpICsgMSA9PSBuaWQtPm5fbm9kZXMpCisgICAgICAgIE5FWFRfRVhQRUNUSU5HX0ZBTFNFICgmcmVhZGVyKTsKKyAgICAgIGVsc2UKKyAgICAgICAgTkVYVF9FWFBFQ1RJTkdfVFJVRSAoJnJlYWRlcik7CisKKyAgICAgICsraTsKKyAgICB9CisKKyAgLyogQ2hlY2sgdGhhdCB0aGUgbmV3IHZhbHVlcyB3ZXJlIHNldCAqLworCisgIHJlYWRlciA9IHJlYWxpZ25fcm9vdDsKKworICBpID0gMDsKKyAgd2hpbGUgKGkgPCBuaWQtPm5fbm9kZXMpCisgICAgeworICAgICAgaWYgKCFub2RlX3JlYWRfdmFsdWUgKG5pZC0+bm9kZXNbaV0sICZyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSArIFNFVF9TRUVEKSkKKyAgICAgICAgZ290byBvdXQ7CisKKyAgICAgIGlmIChpICsgMSA9PSBuaWQtPm5fbm9kZXMpCisgICAgICAgIE5FWFRfRVhQRUNUSU5HX0ZBTFNFICgmcmVhZGVyKTsKKyAgICAgIGVsc2UKKyAgICAgICAgTkVYVF9FWFBFQ1RJTkdfVFJVRSAoJnJlYWRlcik7CisKKyAgICAgICsraTsKKyAgICB9CisKKyAgcmV0dmFsID0gVFJVRTsKKworIG91dDoKKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitydW5fdGVzdF9kZWxldGVfdmFsdWVzIChOb2RlSXRlcmF0aW9uRGF0YSAqbmlkKQoreworICBEQnVzVHlwZVJlYWRlciByZWFkZXI7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgaW50IHQ7CisKKyAgX2RidXNfdmVyYm9zZSAoIlxuIik7CisKKyAgcmV0dmFsID0gRkFMU0U7CisKKyAgZGF0YV9ibG9ja19pbml0X3JlYWRlcl93cml0ZXIgKG5pZC0+YmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVhZGVyLCBOVUxMKTsKKworICB3aGlsZSAoKHQgPSBfZGJ1c190eXBlX3JlYWRlcl9nZXRfY3VycmVudF90eXBlICgmcmVhZGVyKSkgIT0gREJVU19UWVBFX0lOVkFMSUQpCisgICAgeworICAgICAgLyogUmlnaHQgbm93LCBkZWxldGluZyBvbmx5IHdvcmtzIG9uIGFycmF5IGVsZW1lbnRzLiAgV2UgZGVsZXRlCisgICAgICAgKiBhbGwgYXJyYXkgZWxlbWVudHMsIGFuZCB0aGVuIHZlcmlmeSB0aGF0IHRoZXJlIGFyZW4ndCBhbnkKKyAgICAgICAqIGxlZnQuCisgICAgICAgKi8KKyAgICAgIGlmICh0ID09IERCVVNfVFlQRV9BUlJBWSkKKyAgICAgICAgeworICAgICAgICAgIERCdXNUeXBlUmVhZGVyIGFycmF5OworICAgICAgICAgIGludCBuX2VsZW1lbnRzOworICAgICAgICAgIGludCBlbGVtX3R5cGU7CisKKyAgICAgICAgICBfZGJ1c190eXBlX3JlYWRlcl9yZWN1cnNlICgmcmVhZGVyLCAmYXJyYXkpOworICAgICAgICAgIG5fZWxlbWVudHMgPSAwOworICAgICAgICAgIHdoaWxlIChfZGJ1c190eXBlX3JlYWRlcl9nZXRfY3VycmVudF90eXBlICgmYXJyYXkpICE9IERCVVNfVFlQRV9JTlZBTElEKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBuX2VsZW1lbnRzICs9IDE7CisgICAgICAgICAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX25leHQgKCZhcnJheSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAvKiByZXNldCB0byBzdGFydCBvZiBhcnJheSAqLworICAgICAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX3JlY3Vyc2UgKCZyZWFkZXIsICZhcnJheSk7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoInJlY3Vyc2luZyBpbnRvIGRlbGV0aW9uIGxvb3AgcmVhZGVyLnZhbHVlX3BvcyA9ICVkIGFycmF5LnZhbHVlX3BvcyA9ICVkIGFycmF5LnUuc3RhcnRfcG9zID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnZhbHVlX3BvcywgYXJyYXkudmFsdWVfcG9zLCBhcnJheS51LmFycmF5LnN0YXJ0X3Bvcyk7CisgICAgICAgICAgd2hpbGUgKChlbGVtX3R5cGUgPSBfZGJ1c190eXBlX3JlYWRlcl9nZXRfY3VycmVudF90eXBlICgmYXJyYXkpKSAhPSBEQlVTX1RZUEVfSU5WQUxJRCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogV2UgZG9uJ3Qgd2FudCB0byBhbHdheXMgZGVsZXRlIGZyb20gdGhlIHNhbWUgcGFydCBvZiB0aGUgYXJyYXkuICovCisgICAgICAgICAgICAgIHN0YXRpYyBpbnQgY3ljbGUgPSAwOworICAgICAgICAgICAgICBpbnQgZWxlbTsKKworICAgICAgICAgICAgICBfZGJ1c19hc3NlcnQgKG5fZWxlbWVudHMgPiAwKTsKKworICAgICAgICAgICAgICBlbGVtID0gY3ljbGU7CisgICAgICAgICAgICAgIGlmIChlbGVtID09IDMgfHwgZWxlbSA+PSBuX2VsZW1lbnRzKSAvKiBlbmQgb2YgYXJyYXkgKi8KKyAgICAgICAgICAgICAgICBlbGVtID0gbl9lbGVtZW50cyAtIDE7CisKKyAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoImRlbGV0aW5nIGFycmF5IGVsZW1lbnQgJWQgb2YgJWQgdHlwZSAlcyBjeWNsZSAlZCByZWFkZXIgcG9zICVkIGVsZW0gcG9zICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtLCBuX2VsZW1lbnRzLCBfZGJ1c190eXBlX3RvX3N0cmluZyAoZWxlbV90eXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3ljbGUsIHJlYWRlci52YWx1ZV9wb3MsIGFycmF5LnZhbHVlX3Bvcyk7CisgICAgICAgICAgICAgIHdoaWxlIChlbGVtID4gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBpZiAoIV9kYnVzX3R5cGVfcmVhZGVyX25leHQgKCZhcnJheSkpCisgICAgICAgICAgICAgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInNob3VsZCBoYXZlIGhhZCBhbm90aGVyIGVsZW1lbnQiKTsKKyAgICAgICAgICAgICAgICAgIC0tZWxlbTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgaWYgKCFfZGJ1c190eXBlX3JlYWRlcl9kZWxldGUgKCZhcnJheSwgJnJlYWRlcikpCisgICAgICAgICAgICAgICAgZ290byBvdXQ7CisKKyAgICAgICAgICAgICAgbl9lbGVtZW50cyAtPSAxOworCisgICAgICAgICAgICAgIC8qIHJlc2V0ICovCisgICAgICAgICAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX3JlY3Vyc2UgKCZyZWFkZXIsICZhcnJheSk7CisKKyAgICAgICAgICAgICAgaWYgKGN5Y2xlID4gMikKKyAgICAgICAgICAgICAgICBjeWNsZSA9IDA7CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBjeWNsZSArPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBfZGJ1c190eXBlX3JlYWRlcl9uZXh0ICgmcmVhZGVyKTsKKyAgICB9CisKKyAgLyogQ2hlY2sgdGhhdCB0aGVyZSBhcmUgbm8gYXJyYXkgZWxlbWVudHMgbGVmdCAqLworICBkYXRhX2Jsb2NrX2luaXRfcmVhZGVyX3dyaXRlciAobmlkLT5ibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWFkZXIsIE5VTEwpOworCisgIHdoaWxlICgodCA9IF9kYnVzX3R5cGVfcmVhZGVyX2dldF9jdXJyZW50X3R5cGUgKCZyZWFkZXIpKSAhPSBEQlVTX1RZUEVfSU5WQUxJRCkKKyAgICB7CisgICAgICBfZGJ1c190eXBlX3JlYWRlcl9uZXh0ICgmcmVhZGVyKTsKKyAgICB9CisKKyAgcmV0dmFsID0gVFJVRTsKKworIG91dDoKKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitydW5fdGVzdF9ub2Rlc19pdGVyYXRpb24gKHZvaWQgKmRhdGEpCit7CisgIE5vZGVJdGVyYXRpb25EYXRhICpuaWQgPSBkYXRhOworICBEQnVzVHlwZVJlYWRlciByZWFkZXI7CisgIERCdXNUeXBlV3JpdGVyIHdyaXRlcjsKKyAgaW50IGk7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKworICAvKiBTdHVmZiB0byBkbzoKKyAgICogMS4gd3JpdGUgdGhlIHZhbHVlCisgICAqIDIuIHN0cmNtcC1jb21wYXJlIHdpdGggdGhlIHNpZ25hdHVyZSB3ZSBidWlsdAorICAgKiAzLiByZWFkIHRoZSB2YWx1ZQorICAgKiA0LiB0eXBlLWl0ZXJhdGUgdGhlIHNpZ25hdHVyZSBhbmQgdGhlIHZhbHVlIGFuZCBzZWUgaWYgdGhleSBhcmUgdGhlIHNhbWUgdHlwZS13aXNlCisgICAqLworICByZXR2YWwgPSBGQUxTRTsKKworICBkYXRhX2Jsb2NrX2luaXRfcmVhZGVyX3dyaXRlciAobmlkLT5ibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWFkZXIsICZ3cml0ZXIpOworCisgIC8qIERCdXNUeXBlV3JpdGVyIGFzc3VtZXMgaXQncyB3cml0aW5nIGludG8gYW4gZXhpc3Rpbmcgc2lnbmF0dXJlLAorICAgKiBzbyBkb2Vzbid0IGFkZCBudWwgb24gaXRzIG93bi4gV2UgaGF2ZSB0byBkbyB0aGF0LgorICAgKi8KKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5zZXJ0X2J5dGUgKCZuaWQtPmJsb2NrLT5zaWduYXR1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuaWQtPnR5cGVfb2Zmc2V0LCAnXDAnKSkKKyAgICBnb3RvIG91dDsKKworICBpID0gMDsKKyAgd2hpbGUgKGkgPCBuaWQtPm5fbm9kZXMpCisgICAgeworICAgICAgaWYgKCFub2RlX3dyaXRlX3ZhbHVlIChuaWQtPm5vZGVzW2ldLCBuaWQtPmJsb2NrLCAmd3JpdGVyLCBpKSkKKyAgICAgICAgZ290byBvdXQ7CisKKyAgICAgICsraTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfZXF1YWxfc3Vic3RyaW5nIChuaWQtPnNpZ25hdHVyZSwgMCwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKG5pZC0+c2lnbmF0dXJlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmlkLT5ibG9jay0+c2lnbmF0dXJlLCBuaWQtPnR5cGVfb2Zmc2V0KSkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiRXhwZWN0ZWQgc2lnbmF0dXJlICclcycgYW5kIGdvdCAnJXMnIHdpdGggaW5pdGlhbCBvZmZzZXQgJWQiLAorICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChuaWQtPnNpZ25hdHVyZSksCisgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuICgmbmlkLT5ibG9jay0+c2lnbmF0dXJlLCBuaWQtPnR5cGVfb2Zmc2V0LCAwKSwKKyAgICAgICAgICAgICAgICAgIG5pZC0+dHlwZV9vZmZzZXQpOworICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgid3Jvbmcgc2lnbmF0dXJlIik7CisgICAgfQorCisgIGkgPSAwOworICB3aGlsZSAoaSA8IG5pZC0+bl9ub2RlcykKKyAgICB7CisgICAgICBpZiAoIW5vZGVfcmVhZF92YWx1ZSAobmlkLT5ub2Rlc1tpXSwgJnJlYWRlciwgaSkpCisgICAgICAgIGdvdG8gb3V0OworCisgICAgICBpZiAoaSArIDEgPT0gbmlkLT5uX25vZGVzKQorICAgICAgICBORVhUX0VYUEVDVElOR19GQUxTRSAoJnJlYWRlcik7CisgICAgICBlbHNlCisgICAgICAgIE5FWFRfRVhQRUNUSU5HX1RSVUUgKCZyZWFkZXIpOworCisgICAgICArK2k7CisgICAgfQorCisgIGlmIChuX2l0ZXJhdGlvbnNfZXhwZWN0ZWRfdGhpc190ZXN0IDw9IE1BWF9JVEVSQVRJT05TX0ZPUl9FWFBFTlNJVkVfVEVTVFMpCisgICAgeworICAgICAgLyogdGhpcyBzZXQgdmFsdWVzIHRlc3QgdXNlcyBjb2RlIGZyb20gY29weSBhbmQKKyAgICAgICAqIHZhbHVlc19vbmx5X3dyaXRlIHNvIHdvdWxkIGlkZWFsbHkgYmUgbGFzdCBzbyB5b3UgZ2V0IGEKKyAgICAgICAqIHNpbXBsZXIgdGVzdCBjYXNlIGZvciBwcm9ibGVtcyB3aXRoIGNvcHlpbmcgb3IgdmFsdWVzX29ubHkKKyAgICAgICAqIHdyaXRpbmc7IGJ1dCBpdCBhbHNvIG5lZWRzIGFuIGFscmVhZHktd3JpdHRlbiBEYXRhQmxvY2sgc28gaXQKKyAgICAgICAqIGhhcyB0byBnbyBmaXJzdC4gQ29tbWVudCBpdCBvdXQgaWYgaXQgYnJlYWtzLCBhbmQgc2VlIGlmIHRoZQorICAgICAgICogbGF0ZXIgdGVzdHMgYWxzbyBicmVhayAtIGRlYnVnIHRoZW0gZmlyc3QgaWYgc28uCisgICAgICAgKi8KKyAgICAgIGlmICghcnVuX3Rlc3Rfc2V0X3ZhbHVlcyAobmlkKSkKKyAgICAgICAgZ290byBvdXQ7CisKKyAgICAgIGlmICghcnVuX3Rlc3RfZGVsZXRlX3ZhbHVlcyAobmlkKSkKKyAgICAgICAgZ290byBvdXQ7CisKKyAgICAgIGlmICghcnVuX3Rlc3RfY29weSAobmlkKSkKKyAgICAgICAgZ290byBvdXQ7CisKKyAgICAgIGlmICghcnVuX3Rlc3RfdmFsdWVzX29ubHlfd3JpdGUgKG5pZCkpCisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAvKiBGSVhNRSB0eXBlLWl0ZXJhdGUgYm90aCBzaWduYXR1cmUgYW5kIHZhbHVlIGFuZCBjb21wYXJlIHRoZSByZXN1bHRpbmcKKyAgICogdHJlZSB0byB0aGUgbm9kZSB0cmVlIHBlcmhhcHMKKyAgICovCisKKyAgcmV0dmFsID0gVFJVRTsKKworIG91dDoKKworICBkYXRhX2Jsb2NrX3Jlc2V0IChuaWQtPmJsb2NrKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdm9pZAorcnVuX3Rlc3Rfbm9kZXNfaW5fb25lX2NvbmZpZ3VyYXRpb24gKFRlc3RUeXBlTm9kZSAgICAqKm5vZGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIG5fbm9kZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqc2lnbmF0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgaW5pdGlhbF9vZmZzZXQpCit7CisgIERhdGFCbG9jayBibG9jazsKKyAgTm9kZUl0ZXJhdGlvbkRhdGEgbmlkOworCisgIGlmICghZGF0YV9ibG9ja19pbml0ICgmYmxvY2ssIGJ5dGVfb3JkZXIsIGluaXRpYWxfb2Zmc2V0KSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkiKTsKKworICBuaWQuc2lnbmF0dXJlID0gc2lnbmF0dXJlOworICBuaWQuYmxvY2sgPSAmYmxvY2s7CisgIG5pZC50eXBlX29mZnNldCA9IGluaXRpYWxfb2Zmc2V0OworICBuaWQubm9kZXMgPSBub2RlczsKKyAgbmlkLm5fbm9kZXMgPSBuX25vZGVzOworCisgIGlmIChURVNUX09PTV9IQU5ETElORyAmJgorICAgICAgbl9pdGVyYXRpb25zX2V4cGVjdGVkX3RoaXNfdGVzdCA8PSBNQVhfSVRFUkFUSU9OU19GT1JfRVhQRU5TSVZFX1RFU1RTKQorICAgIHsKKyAgICAgIF9kYnVzX3Rlc3Rfb29tX2hhbmRsaW5nICgicnVubmluZyB0ZXN0IG5vZGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bl90ZXN0X25vZGVzX2l0ZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmlkKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoIXJ1bl90ZXN0X25vZGVzX2l0ZXJhdGlvbiAoJm5pZCkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOworICAgIH0KKworICBkYXRhX2Jsb2NrX2ZyZWUgKCZibG9jayk7Cit9CisKK3N0YXRpYyB2b2lkCitydW5fdGVzdF9ub2RlcyAoVGVzdFR5cGVOb2RlICoqbm9kZXMsCisgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgbl9ub2RlcykKK3sKKyAgaW50IGk7CisgIERCdXNTdHJpbmcgc2lnbmF0dXJlOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZzaWduYXR1cmUpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOworCisgIGkgPSAwOworICB3aGlsZSAoaSA8IG5fbm9kZXMpCisgICAgeworICAgICAgaWYgKCEgbm9kZV9idWlsZF9zaWduYXR1cmUgKG5vZGVzW2ldLCAmc2lnbmF0dXJlKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5Iik7CisKKyAgICAgICsraTsKKyAgICB9CisKKyAgX2RidXNfdmVyYm9zZSAoIj4+PiB0ZXN0IG5vZGVzIHdpdGggc2lnbmF0dXJlICclcydcbiIsCisgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJnNpZ25hdHVyZSkpOworCisgIGkgPSAwOworICB3aGlsZSAoaSA8PSBNQVhfSU5JVElBTF9PRkZTRVQpCisgICAgeworICAgICAgcnVuX3Rlc3Rfbm9kZXNfaW5fb25lX2NvbmZpZ3VyYXRpb24gKG5vZGVzLCBuX25vZGVzLCAmc2lnbmF0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfTElUVExFX0VORElBTiwgaSk7CisgICAgICBydW5fdGVzdF9ub2Rlc19pbl9vbmVfY29uZmlndXJhdGlvbiAobm9kZXMsIG5fbm9kZXMsICZzaWduYXR1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19CSUdfRU5ESUFOLCBpKTsKKworICAgICAgKytpOworICAgIH0KKworICBuX2l0ZXJhdGlvbnNfY29tcGxldGVkX3RoaXNfdGVzdCArPSAxOworICBuX2l0ZXJhdGlvbnNfY29tcGxldGVkX3RvdGFsICs9IDE7CisKKyAgaWYgKG5faXRlcmF0aW9uc19jb21wbGV0ZWRfdGhpc190ZXN0ID09IG5faXRlcmF0aW9uc19leHBlY3RlZF90aGlzX3Rlc3QpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiIDEwMCUlICVkIHRoaXMgdGVzdCAoJWQgY3VtdWxhdGl2ZSlcbiIsCisgICAgICAgICAgICAgICBuX2l0ZXJhdGlvbnNfY29tcGxldGVkX3RoaXNfdGVzdCwKKyAgICAgICAgICAgICAgIG5faXRlcmF0aW9uc19jb21wbGV0ZWRfdG90YWwpOworICAgIH0KKyAgLyogdGhpcyBoYXBwZW5zIHRvIHR1cm4gb3V0IHdlbGwgd2l0aCBtb2QgPT0gMSAqLworICBlbHNlIGlmICgobl9pdGVyYXRpb25zX2NvbXBsZXRlZF90aGlzX3Rlc3QgJQorICAgICAgICAgICAgKGludCkobl9pdGVyYXRpb25zX2V4cGVjdGVkX3RoaXNfdGVzdCAvIDEwLjApKSA9PSAxKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIiAlZCUlICIsIChpbnQpIChuX2l0ZXJhdGlvbnNfY29tcGxldGVkX3RoaXNfdGVzdCAvIChkb3VibGUpIG5faXRlcmF0aW9uc19leHBlY3RlZF90aGlzX3Rlc3QgKiAxMDApKTsKKyAgICB9CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZzaWduYXR1cmUpOworfQorCisjZGVmaW5lIE5fVkFMVUVTIChOX0JBU0lDUyAqIE5fQ09OVEFJTkVSUyArIE5fQkFTSUNTKQorCitzdGF0aWMgVGVzdFR5cGVOb2RlKgordmFsdWVfZ2VuZXJhdG9yIChpbnQgKmlwKQoreworICBpbnQgaSA9ICppcDsKKyAgY29uc3QgVGVzdFR5cGVOb2RlQ2xhc3MgKmNoaWxkX2tsYXNzOworICBjb25zdCBUZXN0VHlwZU5vZGVDbGFzcyAqY29udGFpbmVyX2tsYXNzOworICBUZXN0VHlwZU5vZGUgKmNoaWxkOworICBUZXN0VHlwZU5vZGUgKm5vZGU7CisKKyAgX2RidXNfYXNzZXJ0IChpIDw9IE5fVkFMVUVTKTsKKworICBpZiAoaSA9PSBOX1ZBTFVFUykKKyAgICB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIGVsc2UgaWYgKGkgPCBOX0JBU0lDUykKKyAgICB7CisgICAgICBub2RlID0gbm9kZV9uZXcgKGJhc2ljX25vZGVzW2ldKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBpbWFnaW5lIGFuIGFycmF5OgorICAgICAgICogY29udGFpbmVyIDAgb2YgYmFzaWMgMAorICAgICAgICogY29udGFpbmVyIDAgb2YgYmFzaWMgMQorICAgICAgICogY29udGFpbmVyIDAgb2YgYmFzaWMgMgorICAgICAgICogY29udGFpbmVyIDEgb2YgYmFzaWMgMAorICAgICAgICogY29udGFpbmVyIDEgb2YgYmFzaWMgMQorICAgICAgICogY29udGFpbmVyIDEgb2YgYmFzaWMgMgorICAgICAgICovCisgICAgICBpIC09IE5fQkFTSUNTOworCisgICAgICBjb250YWluZXJfa2xhc3MgPSBjb250YWluZXJfbm9kZXNbaSAvIE5fQkFTSUNTXTsKKyAgICAgIGNoaWxkX2tsYXNzID0gYmFzaWNfbm9kZXNbaSAlIE5fQkFTSUNTXTsKKworICAgICAgbm9kZSA9IG5vZGVfbmV3IChjb250YWluZXJfa2xhc3MpOworICAgICAgY2hpbGQgPSBub2RlX25ldyAoY2hpbGRfa2xhc3MpOworCisgICAgICBub2RlX2FwcGVuZF9jaGlsZCAobm9kZSwgY2hpbGQpOworICAgIH0KKworICAqaXAgKz0gMTsgLyogaW5jcmVtZW50IHRoZSBnZW5lcmF0b3IgKi8KKworICByZXR1cm4gbm9kZTsKK30KKworc3RhdGljIHZvaWQKK2J1aWxkX2JvZHkgKFRlc3RUeXBlTm9kZSAqKm5vZGVzLAorICAgICAgICAgICAgaW50ICAgICAgICAgICAgbl9ub2RlcywKKyAgICAgICAgICAgIGludCAgICAgICAgICAgIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICBEQnVzU3RyaW5nICAgICpzaWduYXR1cmUsCisgICAgICAgICAgICBEQnVzU3RyaW5nICAgICpib2R5KQoreworICBpbnQgaTsKKyAgRGF0YUJsb2NrIGJsb2NrOworICBEQnVzVHlwZVJlYWRlciByZWFkZXI7CisgIERCdXNUeXBlV3JpdGVyIHdyaXRlcjsKKworICBpID0gMDsKKyAgd2hpbGUgKGkgPCBuX25vZGVzKQorICAgIHsKKyAgICAgIGlmICghIG5vZGVfYnVpbGRfc2lnbmF0dXJlIChub2Rlc1tpXSwgc2lnbmF0dXJlKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5Iik7CisgICAgICAKKyAgICAgICsraTsKKyAgICB9CisKKyAgaWYgKCFkYXRhX2Jsb2NrX2luaXQgKCZibG9jaywgYnl0ZV9vcmRlciwgMCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5Iik7CisgIAorICBkYXRhX2Jsb2NrX2luaXRfcmVhZGVyX3dyaXRlciAoJmJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlYWRlciwgJndyaXRlcik7CisgIAorICAvKiBEQnVzVHlwZVdyaXRlciBhc3N1bWVzIGl0J3Mgd3JpdGluZyBpbnRvIGFuIGV4aXN0aW5nIHNpZ25hdHVyZSwKKyAgICogc28gZG9lc24ndCBhZGQgbnVsIG9uIGl0cyBvd24uIFdlIGhhdmUgdG8gZG8gdGhhdC4KKyAgICovCisgIGlmICghX2RidXNfc3RyaW5nX2luc2VydF9ieXRlICgmYmxvY2suc2lnbmF0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgJ1wwJykpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5Iik7CisKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgbl9ub2RlcykKKyAgICB7CisgICAgICBpZiAoIW5vZGVfd3JpdGVfdmFsdWUgKG5vZGVzW2ldLCAmYmxvY2ssICZ3cml0ZXIsIGkpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkiKTsKKworICAgICAgKytpOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5X2xlbiAoJmJsb2NrLmJvZHksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmJsb2NrLmJvZHkpIC0gTl9GRU5DRV9CWVRFUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHksIDApKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm9vbSIpOworCisgIGRhdGFfYmxvY2tfZnJlZSAoJmJsb2NrKTsgIAorfQorCitkYnVzX2Jvb2xfdAorZGJ1c19pbnRlcm5hbF9kb19ub3RfdXNlX2dlbmVyYXRlX2JvZGllcyAoaW50ICAgICAgICAgICBzZXF1ZW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAqc2lnbmF0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICpib2R5KQoreworICBUZXN0VHlwZU5vZGUgKm5vZGVzWzFdOworICBpbnQgaTsKKyAgaW50IG5fbm9kZXM7CisKKyAgbm9kZXNbMF0gPSB2YWx1ZV9nZW5lcmF0b3IgKCZzZXF1ZW5jZSk7CisKKyAgaWYgKG5vZGVzWzBdID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIG5fbm9kZXMgPSAxOworICAKKyAgYnVpbGRfYm9keSAobm9kZXMsIG5fbm9kZXMsIGJ5dGVfb3JkZXIsIHNpZ25hdHVyZSwgYm9keSk7CisKKworICBpID0gMDsKKyAgd2hpbGUgKGkgPCBuX25vZGVzKQorICAgIHsKKyAgICAgIG5vZGVfZGVzdHJveSAobm9kZXNbaV0pOworICAgICAgKytpOworICAgIH0KKyAgCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorbWFrZV9hbmRfcnVuX3ZhbHVlc19pbnNpZGVfY29udGFpbmVyIChjb25zdCBUZXN0VHlwZU5vZGVDbGFzcyAqY29udGFpbmVyX2tsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgbl9uZXN0ZWQpCit7CisgIFRlc3RUeXBlTm9kZSAqcm9vdDsKKyAgVGVzdFR5cGVOb2RlICpjb250YWluZXI7CisgIFRlc3RUeXBlTm9kZSAqY2hpbGQ7CisgIGludCBpOworCisgIHJvb3QgPSBub2RlX25ldyAoY29udGFpbmVyX2tsYXNzKTsKKyAgY29udGFpbmVyID0gcm9vdDsKKyAgZm9yIChpID0gMTsgaSA8IG5fbmVzdGVkOyBpKyspCisgICAgeworICAgICAgY2hpbGQgPSBub2RlX25ldyAoY29udGFpbmVyX2tsYXNzKTsKKyAgICAgIG5vZGVfYXBwZW5kX2NoaWxkIChjb250YWluZXIsIGNoaWxkKTsKKyAgICAgIGNvbnRhaW5lciA9IGNoaWxkOworICAgIH0KKworICAvKiBjb250YWluZXIgc2hvdWxkIG5vdyBiZSB0aGUgbW9zdC1uZXN0ZWQgY29udGFpbmVyICovCisKKyAgaSA9IDA7CisgIHdoaWxlICgoY2hpbGQgPSB2YWx1ZV9nZW5lcmF0b3IgKCZpKSkpCisgICAgeworICAgICAgbm9kZV9hcHBlbmRfY2hpbGQgKGNvbnRhaW5lciwgY2hpbGQpOworCisgICAgICBydW5fdGVzdF9ub2RlcyAoJnJvb3QsIDEpOworCisgICAgICBfZGJ1c19saXN0X2NsZWFyICgmKChUZXN0VHlwZU5vZGVDb250YWluZXIqKWNvbnRhaW5lciktPmNoaWxkcmVuKTsKKyAgICAgIG5vZGVfZGVzdHJveSAoY2hpbGQpOworICAgIH0KKworICBub2RlX2Rlc3Ryb3kgKHJvb3QpOworfQorCitzdGF0aWMgdm9pZAorc3RhcnRfbmV4dF90ZXN0IChjb25zdCBjaGFyICpkZXNjcmlwdGlvbiwKKyAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgZXhwZWN0ZWQpCit7CisgIG5faXRlcmF0aW9uc19jb21wbGV0ZWRfdGhpc190ZXN0ID0gMDsKKyAgbl9pdGVyYXRpb25zX2V4cGVjdGVkX3RoaXNfdGVzdCA9IGV4cGVjdGVkOworCisgIGZwcmludGYgKHN0ZGVyciwgIj4+PiA+Pj4gJXMgJWQgaXRlcmF0aW9uc1xuIiwKKyAgICAgICAgICAgZGVzY3JpcHRpb24sCisgICAgICAgICAgIG5faXRlcmF0aW9uc19leHBlY3RlZF90aGlzX3Rlc3QpOworfQorCitzdGF0aWMgdm9pZAorbWFrZV9hbmRfcnVuX3Rlc3Rfbm9kZXMgKHZvaWQpCit7CisgIGludCBpLCBqLCBrLCBtOworCisgIC8qIFdlIHRyeSB0byBkbyB0aGlzIGluIG9yZGVyIG9mICJjb21wbGljYXRlZG5lc3MiIHNvIHRoYXQgdGVzdAorICAgKiBmYWlsdXJlcyB0ZW5kIHRvIHNob3cgdXAgaW4gdGhlIHNpbXBsZXN0IHRlc3QgY2FzZSB0aGF0CisgICAqIGRlbW9uc3RyYXRlcyB0aGUgZmFpbHVyZS4gIFRoZXJlIGFyZSBhbHNvIHNvbWUgdGVzdHMgdGhhdCBydW4KKyAgICogbW9yZSB0aGFuIG9uY2UgZm9yIHRoaXMgcmVhc29uLCBmaXJzdCB3aGlsZSBnb2luZyB0aHJvdWdoIHNpbXBsZQorICAgKiBjYXNlcywgc2Vjb25kIHdoaWxlIGdvaW5nIHRocm91Z2ggYSBicm9hZGVyIHJhbmdlIG9mIGNvbXBsZXgKKyAgICogY2FzZXMuCisgICAqLworICAvKiBFYWNoIGJhc2ljIG5vZGUuIFRoZSBiYXNpYyBub2RlcyBzaG91bGQgaW5jbHVkZToKKyAgICoKKyAgICogLSBlYWNoIGZpeGVkLXNpemUgdHlwZSAoaW4gc3VjaCBhIHdheSB0aGF0IGl0IGhhcyBkaWZmZXJlbnQgdmFsdWVzIGVhY2ggdGltZSwKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgc28gd2UgY2FuIHRlbGwgaWYgd2UgbWl4IHR3byBvZiB0aGVtIHVwKQorICAgKiAtIHN0cmluZ3Mgb2YgdmFyaW91cyBsZW5ndGhzCisgICAqIC0gb2JqZWN0IHBhdGgKKyAgICogLSBzaWduYXR1cmUKKyAgICovCisgIC8qIEVhY2ggY29udGFpbmVyIG5vZGUuIFRoZSBjb250YWluZXIgbm9kZXMgc2hvdWxkIGluY2x1ZGU6CisgICAqCisgICAqICBzdHJ1Y3Qgd2l0aCAxIGFuZCAyIGNvcGllcyBvZiB0aGUgY29udGFpbmVkIGl0ZW0KKyAgICogIGFycmF5IHdpdGggMCwgMSwgMiBjb3BpZXMgb2YgdGhlIGNvbnRhaW5lZCBpdGVtCisgICAqICB2YXJpYW50CisgICAqLworICAvKiAgTGV0IGEgInZhbHVlIiBiZSBhIGJhc2ljIG5vZGUsIG9yIGEgY29udGFpbmVyIGNvbnRhaW5pbmcgYSBzaW5nbGUgYmFzaWMgbm9kZS4KKyAgICogIExldCBuX3ZhbHVlcyBiZSB0aGUgbnVtYmVyIG9mIHN1Y2ggdmFsdWVzIGkuZS4gKG5fY29udGFpbmVyICogbl9iYXNpYyArIG5fYmFzaWMpCisgICAqICBXaGVuIGl0ZXJhdGluZyB0aHJvdWdoIGFsbCB2YWx1ZXMgdG8gbWFrZSBjb21iaW5hdGlvbnMsIGRvIHRoZSBiYXNpYyB0eXBlcworICAgKiAgZmlyc3QgYW5kIHRoZSBjb250YWluZXJzIHNlY29uZC4KKyAgICovCisgIC8qIEVhY2ggaXRlbSBpcyBzaG93biB3aXRoIGl0cyBudW1iZXIgb2YgaXRlcmF0aW9ucyB0byBjb21wbGV0ZSBzbworICAgKiB3ZSBjYW4ga2VlcCBhIGhhbmRsZSBvbiB0aGlzIHVuaXQgdGVzdAorICAgKi8KKworICAvKiBGSVhNRSB0ZXN0IGp1c3QgYW4gZW1wdHkgYm9keSwgbm8gdHlwZXMgYXQgYWxsICovCisKKyAgc3RhcnRfbmV4dF90ZXN0ICgiRWFjaCB2YWx1ZSBieSBpdHNlbGYiLCBOX1ZBTFVFUyk7CisgIHsKKyAgICBUZXN0VHlwZU5vZGUgKm5vZGU7CisgICAgaSA9IDA7CisgICAgd2hpbGUgKChub2RlID0gdmFsdWVfZ2VuZXJhdG9yICgmaSkpKQorICAgICAgeworICAgICAgICBydW5fdGVzdF9ub2RlcyAoJm5vZGUsIDEpOworCisgICAgICAgIG5vZGVfZGVzdHJveSAobm9kZSk7CisgICAgICB9CisgIH0KKworICBzdGFydF9uZXh0X3Rlc3QgKCJFYWNoIHZhbHVlIGJ5IGl0c2VsZiB3aXRoIGFycmF5cyBhcyBibG9ja3MiLCBOX1ZBTFVFUyk7CisgIGFycmF5c193cml0ZV9maXhlZF9pbl9ibG9ja3MgPSBUUlVFOworICB7CisgICAgVGVzdFR5cGVOb2RlICpub2RlOworICAgIGkgPSAwOworICAgIHdoaWxlICgobm9kZSA9IHZhbHVlX2dlbmVyYXRvciAoJmkpKSkKKyAgICAgIHsKKyAgICAgICAgcnVuX3Rlc3Rfbm9kZXMgKCZub2RlLCAxKTsKKworICAgICAgICBub2RlX2Rlc3Ryb3kgKG5vZGUpOworICAgICAgfQorICB9CisgIGFycmF5c193cml0ZV9maXhlZF9pbl9ibG9ja3MgPSBGQUxTRTsKKworICBzdGFydF9uZXh0X3Rlc3QgKCJBbGwgdmFsdWVzIGluIG9uZSBiaWcgdG9wbGV2ZWwiLCAxKTsKKyAgeworICAgIFRlc3RUeXBlTm9kZSAqbm9kZXNbTl9WQUxVRVNdOworICAgIFRlc3RUeXBlTm9kZSAqbm9kZTsKKworICAgIGkgPSAwOworICAgIHdoaWxlICgobm9kZSA9IHZhbHVlX2dlbmVyYXRvciAoJmkpKSkKKyAgICAgIHsKKyAgICAgICAgbm9kZXNbaSAtIDFdID0gbm9kZTsKKyAgICAgIH0KKworICAgIHJ1bl90ZXN0X25vZGVzIChub2RlcywgTl9WQUxVRVMpOworCisgICAgZm9yIChpID0gMDsgaSA8IE5fVkFMVUVTOyBpKyspCisgICAgICBub2RlX2Rlc3Ryb3kgKG5vZGVzW2ldKTsKKyAgfQorCisgIHN0YXJ0X25leHRfdGVzdCAoIkVhY2ggdmFsdWUsdmFsdWUgcGFpciBjb21iaW5hdGlvbiBhcyB0b3BsZXZlbCwgaW4gYm90aCBvcmRlcnMiLAorICAgICAgICAgICAgICAgICAgIE5fVkFMVUVTICogTl9WQUxVRVMpOworICB7CisgICAgVGVzdFR5cGVOb2RlICpub2Rlc1syXTsKKworICAgIGkgPSAwOworICAgIHdoaWxlICgobm9kZXNbMF0gPSB2YWx1ZV9nZW5lcmF0b3IgKCZpKSkpCisgICAgICB7CisgICAgICAgIGogPSAwOworICAgICAgICB3aGlsZSAoKG5vZGVzWzFdID0gdmFsdWVfZ2VuZXJhdG9yICgmaikpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHJ1bl90ZXN0X25vZGVzIChub2RlcywgMik7CisKKyAgICAgICAgICAgIG5vZGVfZGVzdHJveSAobm9kZXNbMV0pOworICAgICAgICAgIH0KKworICAgICAgICBub2RlX2Rlc3Ryb3kgKG5vZGVzWzBdKTsKKyAgICAgIH0KKyAgfQorCisgIHN0YXJ0X25leHRfdGVzdCAoIkVhY2ggY29udGFpbmVyIGNvbnRhaW5pbmcgZWFjaCB2YWx1ZSIsCisgICAgICAgICAgICAgICAgICAgTl9DT05UQUlORVJTICogTl9WQUxVRVMpOworICBmb3IgKGkgPSAwOyBpIDwgTl9DT05UQUlORVJTOyBpKyspCisgICAgeworICAgICAgY29uc3QgVGVzdFR5cGVOb2RlQ2xhc3MgKmNvbnRhaW5lcl9rbGFzcyA9IGNvbnRhaW5lcl9ub2Rlc1tpXTsKKworICAgICAgbWFrZV9hbmRfcnVuX3ZhbHVlc19pbnNpZGVfY29udGFpbmVyIChjb250YWluZXJfa2xhc3MsIDEpOworICAgIH0KKworICBzdGFydF9uZXh0X3Rlc3QgKCJFYWNoIGNvbnRhaW5lciBjb250YWluaW5nIGVhY2ggdmFsdWUgd2l0aCBhcnJheXMgYXMgYmxvY2tzIiwKKyAgICAgICAgICAgICAgICAgICBOX0NPTlRBSU5FUlMgKiBOX1ZBTFVFUyk7CisgIGFycmF5c193cml0ZV9maXhlZF9pbl9ibG9ja3MgPSBUUlVFOworICBmb3IgKGkgPSAwOyBpIDwgTl9DT05UQUlORVJTOyBpKyspCisgICAgeworICAgICAgY29uc3QgVGVzdFR5cGVOb2RlQ2xhc3MgKmNvbnRhaW5lcl9rbGFzcyA9IGNvbnRhaW5lcl9ub2Rlc1tpXTsKKworICAgICAgbWFrZV9hbmRfcnVuX3ZhbHVlc19pbnNpZGVfY29udGFpbmVyIChjb250YWluZXJfa2xhc3MsIDEpOworICAgIH0KKyAgYXJyYXlzX3dyaXRlX2ZpeGVkX2luX2Jsb2NrcyA9IEZBTFNFOworCisgIHN0YXJ0X25leHRfdGVzdCAoIkVhY2ggY29udGFpbmVyIG9mIHNhbWUgY29udGFpbmVyIG9mIGVhY2ggdmFsdWUiLAorICAgICAgICAgICAgICAgICAgIE5fQ09OVEFJTkVSUyAqIE5fVkFMVUVTKTsKKyAgZm9yIChpID0gMDsgaSA8IE5fQ09OVEFJTkVSUzsgaSsrKQorICAgIHsKKyAgICAgIGNvbnN0IFRlc3RUeXBlTm9kZUNsYXNzICpjb250YWluZXJfa2xhc3MgPSBjb250YWluZXJfbm9kZXNbaV07CisKKyAgICAgIG1ha2VfYW5kX3J1bl92YWx1ZXNfaW5zaWRlX2NvbnRhaW5lciAoY29udGFpbmVyX2tsYXNzLCAyKTsKKyAgICB9CisKKyAgc3RhcnRfbmV4dF90ZXN0ICgiRWFjaCBjb250YWluZXIgb2Ygc2FtZSBjb250YWluZXIgb2Ygc2FtZSBjb250YWluZXIgb2YgZWFjaCB2YWx1ZSIsCisgICAgICAgICAgICAgICAgICAgTl9DT05UQUlORVJTICogTl9WQUxVRVMpOworICBmb3IgKGkgPSAwOyBpIDwgTl9DT05UQUlORVJTOyBpKyspCisgICAgeworICAgICAgY29uc3QgVGVzdFR5cGVOb2RlQ2xhc3MgKmNvbnRhaW5lcl9rbGFzcyA9IGNvbnRhaW5lcl9ub2Rlc1tpXTsKKworICAgICAgbWFrZV9hbmRfcnVuX3ZhbHVlc19pbnNpZGVfY29udGFpbmVyIChjb250YWluZXJfa2xhc3MsIDMpOworICAgIH0KKworICBzdGFydF9uZXh0X3Rlc3QgKCJFYWNoIHZhbHVlLHZhbHVlIHBhaXIgaW5zaWRlIGEgc3RydWN0IiwKKyAgICAgICAgICAgICAgICAgICBOX1ZBTFVFUyAqIE5fVkFMVUVTKTsKKyAgeworICAgIFRlc3RUeXBlTm9kZSAqdmFsMSwgKnZhbDI7CisgICAgVGVzdFR5cGVOb2RlICpub2RlOworCisgICAgbm9kZSA9IG5vZGVfbmV3ICgmc3RydWN0XzFfY2xhc3MpOworCisgICAgaSA9IDA7CisgICAgd2hpbGUgKCh2YWwxID0gdmFsdWVfZ2VuZXJhdG9yICgmaSkpKQorICAgICAgeworICAgICAgICBqID0gMDsKKyAgICAgICAgd2hpbGUgKCh2YWwyID0gdmFsdWVfZ2VuZXJhdG9yICgmaikpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIFRlc3RUeXBlTm9kZUNvbnRhaW5lciAqY29udGFpbmVyID0gKFRlc3RUeXBlTm9kZUNvbnRhaW5lciopIG5vZGU7CisKKyAgICAgICAgICAgIG5vZGVfYXBwZW5kX2NoaWxkIChub2RlLCB2YWwxKTsKKyAgICAgICAgICAgIG5vZGVfYXBwZW5kX2NoaWxkIChub2RlLCB2YWwyKTsKKworICAgICAgICAgICAgcnVuX3Rlc3Rfbm9kZXMgKCZub2RlLCAxKTsKKworICAgICAgICAgICAgX2RidXNfbGlzdF9jbGVhciAoJmNvbnRhaW5lci0+Y2hpbGRyZW4pOworICAgICAgICAgICAgbm9kZV9kZXN0cm95ICh2YWwyKTsKKyAgICAgICAgICB9CisgICAgICAgIG5vZGVfZGVzdHJveSAodmFsMSk7CisgICAgICB9CisgICAgbm9kZV9kZXN0cm95IChub2RlKTsKKyAgfQorCisgIHN0YXJ0X25leHRfdGVzdCAoIkFsbCB2YWx1ZXMgaW4gb25lIGJpZyBzdHJ1Y3QiLCAxKTsKKyAgeworICAgIFRlc3RUeXBlTm9kZSAqbm9kZTsKKyAgICBUZXN0VHlwZU5vZGUgKmNoaWxkOworCisgICAgbm9kZSA9IG5vZGVfbmV3ICgmc3RydWN0XzFfY2xhc3MpOworCisgICAgaSA9IDA7CisgICAgd2hpbGUgKChjaGlsZCA9IHZhbHVlX2dlbmVyYXRvciAoJmkpKSkKKyAgICAgIG5vZGVfYXBwZW5kX2NoaWxkIChub2RlLCBjaGlsZCk7CisKKyAgICBydW5fdGVzdF9ub2RlcyAoJm5vZGUsIDEpOworCisgICAgbm9kZV9kZXN0cm95IChub2RlKTsKKyAgfQorCisgIHN0YXJ0X25leHRfdGVzdCAoIkVhY2ggdmFsdWUgaW4gYSBsYXJnZSBhcnJheSIsIE5fVkFMVUVTKTsKKyAgeworICAgIFRlc3RUeXBlTm9kZSAqdmFsOworICAgIFRlc3RUeXBlTm9kZSAqbm9kZTsKKworICAgIG5vZGUgPSBub2RlX25ldyAoJmFycmF5XzlfY2xhc3MpOworCisgICAgaSA9IDA7CisgICAgd2hpbGUgKCh2YWwgPSB2YWx1ZV9nZW5lcmF0b3IgKCZpKSkpCisgICAgICB7CisgICAgICAgIFRlc3RUeXBlTm9kZUNvbnRhaW5lciAqY29udGFpbmVyID0gKFRlc3RUeXBlTm9kZUNvbnRhaW5lciopIG5vZGU7CisKKyAgICAgICAgbm9kZV9hcHBlbmRfY2hpbGQgKG5vZGUsIHZhbCk7CisKKyAgICAgICAgcnVuX3Rlc3Rfbm9kZXMgKCZub2RlLCAxKTsKKworICAgICAgICBfZGJ1c19saXN0X2NsZWFyICgmY29udGFpbmVyLT5jaGlsZHJlbik7CisgICAgICAgIG5vZGVfZGVzdHJveSAodmFsKTsKKyAgICAgIH0KKworICAgIG5vZGVfZGVzdHJveSAobm9kZSk7CisgIH0KKworICBpZiAoX2RidXNfZ2V0ZW52ICgiREJVU19URVNUX1NMT1ciKSA9PSBOVUxMIHx8CisgICAgICBhdG9pIChfZGJ1c19nZXRlbnYgKCJEQlVTX1RFU1RfU0xPVyIpKSA8IDEpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAic2tpcHBpbmcgcmVtYWluaW5nIG1hcnNoYWwtcmVjdXJzaXZlIHRlc3RzLCAiCisgICAgICAgICAgInJ1biB3aXRoIERCVVNfVEVTVF9TTE9XPTEgKG9yIG1vcmUpIHRvIGVuYWJsZVxuIik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgc3RhcnRfbmV4dF90ZXN0ICgiRWFjaCBjb250YWluZXIgb2YgZWFjaCBjb250YWluZXIgb2YgZWFjaCB2YWx1ZSIsCisgICAgICAgICAgICAgICAgICAgTl9DT05UQUlORVJTICogTl9DT05UQUlORVJTICogTl9WQUxVRVMpOworICBmb3IgKGkgPSAwOyBpIDwgTl9DT05UQUlORVJTOyBpKyspCisgICAgeworICAgICAgY29uc3QgVGVzdFR5cGVOb2RlQ2xhc3MgKm91dGVyX2NvbnRhaW5lcl9rbGFzcyA9IGNvbnRhaW5lcl9ub2Rlc1tpXTsKKyAgICAgIFRlc3RUeXBlTm9kZSAqb3V0ZXJfY29udGFpbmVyID0gbm9kZV9uZXcgKG91dGVyX2NvbnRhaW5lcl9rbGFzcyk7CisKKyAgICAgIGZvciAoaiA9IDA7IGogPCBOX0NPTlRBSU5FUlM7IGorKykKKyAgICAgICAgeworICAgICAgICAgIFRlc3RUeXBlTm9kZSAqY2hpbGQ7CisgICAgICAgICAgY29uc3QgVGVzdFR5cGVOb2RlQ2xhc3MgKmlubmVyX2NvbnRhaW5lcl9rbGFzcyA9IGNvbnRhaW5lcl9ub2Rlc1tqXTsKKyAgICAgICAgICBUZXN0VHlwZU5vZGUgKmlubmVyX2NvbnRhaW5lciA9IG5vZGVfbmV3IChpbm5lcl9jb250YWluZXJfa2xhc3MpOworCisgICAgICAgICAgbm9kZV9hcHBlbmRfY2hpbGQgKG91dGVyX2NvbnRhaW5lciwgaW5uZXJfY29udGFpbmVyKTsKKworICAgICAgICAgIG0gPSAwOworICAgICAgICAgIHdoaWxlICgoY2hpbGQgPSB2YWx1ZV9nZW5lcmF0b3IgKCZtKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIG5vZGVfYXBwZW5kX2NoaWxkIChpbm5lcl9jb250YWluZXIsIGNoaWxkKTsKKworICAgICAgICAgICAgICBydW5fdGVzdF9ub2RlcyAoJm91dGVyX2NvbnRhaW5lciwgMSk7CisKKyAgICAgICAgICAgICAgX2RidXNfbGlzdF9jbGVhciAoJigoVGVzdFR5cGVOb2RlQ29udGFpbmVyKilpbm5lcl9jb250YWluZXIpLT5jaGlsZHJlbik7CisgICAgICAgICAgICAgIG5vZGVfZGVzdHJveSAoY2hpbGQpOworICAgICAgICAgICAgfQorICAgICAgICAgIF9kYnVzX2xpc3RfY2xlYXIgKCYoKFRlc3RUeXBlTm9kZUNvbnRhaW5lciopb3V0ZXJfY29udGFpbmVyKS0+Y2hpbGRyZW4pOworICAgICAgICAgIG5vZGVfZGVzdHJveSAoaW5uZXJfY29udGFpbmVyKTsKKyAgICAgICAgfQorICAgICAgbm9kZV9kZXN0cm95IChvdXRlcl9jb250YWluZXIpOworICAgIH0KKworICBzdGFydF9uZXh0X3Rlc3QgKCJFYWNoIGNvbnRhaW5lciBvZiBlYWNoIGNvbnRhaW5lciBvZiBlYWNoIGNvbnRhaW5lciBvZiBlYWNoIHZhbHVlIiwKKyAgICAgICAgICAgICAgICAgICBOX0NPTlRBSU5FUlMgKiBOX0NPTlRBSU5FUlMgKiBOX0NPTlRBSU5FUlMgKiBOX1ZBTFVFUyk7CisgIGZvciAoaSA9IDA7IGkgPCBOX0NPTlRBSU5FUlM7IGkrKykKKyAgICB7CisgICAgICBjb25zdCBUZXN0VHlwZU5vZGVDbGFzcyAqb3V0ZXJfY29udGFpbmVyX2tsYXNzID0gY29udGFpbmVyX25vZGVzW2ldOworICAgICAgVGVzdFR5cGVOb2RlICpvdXRlcl9jb250YWluZXIgPSBub2RlX25ldyAob3V0ZXJfY29udGFpbmVyX2tsYXNzKTsKKworICAgICAgZm9yIChqID0gMDsgaiA8IE5fQ09OVEFJTkVSUzsgaisrKQorICAgICAgICB7CisgICAgICAgICAgY29uc3QgVGVzdFR5cGVOb2RlQ2xhc3MgKmlubmVyX2NvbnRhaW5lcl9rbGFzcyA9IGNvbnRhaW5lcl9ub2Rlc1tqXTsKKyAgICAgICAgICBUZXN0VHlwZU5vZGUgKmlubmVyX2NvbnRhaW5lciA9IG5vZGVfbmV3IChpbm5lcl9jb250YWluZXJfa2xhc3MpOworCisgICAgICAgICAgbm9kZV9hcHBlbmRfY2hpbGQgKG91dGVyX2NvbnRhaW5lciwgaW5uZXJfY29udGFpbmVyKTsKKworICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBOX0NPTlRBSU5FUlM7IGsrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgVGVzdFR5cGVOb2RlICpjaGlsZDsKKyAgICAgICAgICAgICAgY29uc3QgVGVzdFR5cGVOb2RlQ2xhc3MgKmNlbnRlcl9jb250YWluZXJfa2xhc3MgPSBjb250YWluZXJfbm9kZXNba107CisgICAgICAgICAgICAgIFRlc3RUeXBlTm9kZSAqY2VudGVyX2NvbnRhaW5lciA9IG5vZGVfbmV3IChjZW50ZXJfY29udGFpbmVyX2tsYXNzKTsKKworICAgICAgICAgICAgICBub2RlX2FwcGVuZF9jaGlsZCAoaW5uZXJfY29udGFpbmVyLCBjZW50ZXJfY29udGFpbmVyKTsKKworICAgICAgICAgICAgICBtID0gMDsKKyAgICAgICAgICAgICAgd2hpbGUgKChjaGlsZCA9IHZhbHVlX2dlbmVyYXRvciAoJm0pKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBub2RlX2FwcGVuZF9jaGlsZCAoY2VudGVyX2NvbnRhaW5lciwgY2hpbGQpOworCisgICAgICAgICAgICAgICAgICBydW5fdGVzdF9ub2RlcyAoJm91dGVyX2NvbnRhaW5lciwgMSk7CisKKyAgICAgICAgICAgICAgICAgIF9kYnVzX2xpc3RfY2xlYXIgKCYoKFRlc3RUeXBlTm9kZUNvbnRhaW5lciopY2VudGVyX2NvbnRhaW5lciktPmNoaWxkcmVuKTsKKyAgICAgICAgICAgICAgICAgIG5vZGVfZGVzdHJveSAoY2hpbGQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgX2RidXNfbGlzdF9jbGVhciAoJigoVGVzdFR5cGVOb2RlQ29udGFpbmVyKilpbm5lcl9jb250YWluZXIpLT5jaGlsZHJlbik7CisgICAgICAgICAgICAgIG5vZGVfZGVzdHJveSAoY2VudGVyX2NvbnRhaW5lcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgX2RidXNfbGlzdF9jbGVhciAoJigoVGVzdFR5cGVOb2RlQ29udGFpbmVyKilvdXRlcl9jb250YWluZXIpLT5jaGlsZHJlbik7CisgICAgICAgICAgbm9kZV9kZXN0cm95IChpbm5lcl9jb250YWluZXIpOworICAgICAgICB9CisgICAgICBub2RlX2Rlc3Ryb3kgKG91dGVyX2NvbnRhaW5lcik7CisgICAgfQorCisgIC8qIFRoaXMgb25lIHRha2VzIGEgcmVhbGx5IGxvbmcgdGltZSAoMTAgbWludXRlcyBvbiBhIENvcmUyKSwgc28gb25seSBlbmFibGUKKyAgICogaXQgaWYgeW91J3JlIHJlYWxseSBzdXJlICovCisgIGlmIChhdG9pIChfZGJ1c19nZXRlbnYgKCJEQlVTX1RFU1RfU0xPVyIpKSA8IDIpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAic2tpcHBpbmcgcmVhbGx5IHNsb3cgbWFyc2hhbC1yZWN1cnNpdmUgdGVzdCwgIgorICAgICAgICAgICJydW4gd2l0aCBEQlVTX1RFU1RfU0xPVz0yIChvciBtb3JlKSB0byBlbmFibGVcbiIpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIHN0YXJ0X25leHRfdGVzdCAoIkVhY2ggdmFsdWUsdmFsdWUsdmFsdWUgdHJpcGxldCBjb21iaW5hdGlvbiBhcyB0b3BsZXZlbCwgaW4gYWxsIG9yZGVycyIsCisgICAgICAgICAgICAgICAgICAgTl9WQUxVRVMgKiBOX1ZBTFVFUyAqIE5fVkFMVUVTKTsKKyAgeworICAgIFRlc3RUeXBlTm9kZSAqbm9kZXNbM107CisKKyAgICBpID0gMDsKKyAgICB3aGlsZSAoKG5vZGVzWzBdID0gdmFsdWVfZ2VuZXJhdG9yICgmaSkpKQorICAgICAgeworICAgICAgICBqID0gMDsKKyAgICAgICAgd2hpbGUgKChub2Rlc1sxXSA9IHZhbHVlX2dlbmVyYXRvciAoJmopKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBrID0gMDsKKyAgICAgICAgICAgIHdoaWxlICgobm9kZXNbMl0gPSB2YWx1ZV9nZW5lcmF0b3IgKCZrKSkpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBydW5fdGVzdF9ub2RlcyAobm9kZXMsIDMpOworCisgICAgICAgICAgICAgICAgbm9kZV9kZXN0cm95IChub2Rlc1syXSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5vZGVfZGVzdHJveSAobm9kZXNbMV0pOworICAgICAgICAgIH0KKyAgICAgICAgbm9kZV9kZXN0cm95IChub2Rlc1swXSk7CisgICAgICB9CisgIH0KKworb3V0OgorICBmcHJpbnRmIChzdGRlcnIsICIlZCB0b3RhbCBpdGVyYXRpb25zIG9mIHJlY3Vyc2l2ZSBtYXJzaGFsaW5nIHRlc3RzXG4iLAorICAgICAgICAgICBuX2l0ZXJhdGlvbnNfY29tcGxldGVkX3RvdGFsKTsKKyAgZnByaW50ZiAoc3RkZXJyLCAiZWFjaCBpdGVyYXRpb24gcmFuIGF0IGluaXRpYWwgb2Zmc2V0cyAwIHRocm91Z2ggJWQgaW4gYm90aCBiaWcgYW5kIGxpdHRsZSBlbmRpYW5cbiIsCisgICAgICAgICAgIE1BWF9JTklUSUFMX09GRlNFVCk7CisgIGZwcmludGYgKHN0ZGVyciwgIm91dCBvZiBtZW1vcnkgaGFuZGxpbmcgJXMgdGVzdGVkXG4iLAorICAgICAgICAgICBURVNUX09PTV9IQU5ETElORyA/ICJ3YXMiIDogIndhcyBub3QiKTsKK30KKworZGJ1c19ib29sX3QKK19kYnVzX21hcnNoYWxfcmVjdXJzaXZlX3Rlc3QgKHZvaWQpCit7CisgIG1ha2VfYW5kX3J1bl90ZXN0X25vZGVzICgpOworCisgIHJldHVybiBUUlVFOworfQorCisvKgorICoKKyAqCisgKiAgICAgICAgIEltcGxlbWVudGF0aW9ucyBvZiBlYWNoIHR5cGUgbm9kZSBjbGFzcworICoKKyAqCisgKgorICovCisjZGVmaW5lIE1BWF9NVUxUSV9DT1VOVCA1CisKKyNkZWZpbmUgU0FNUExFX0lOVDE2ICAgICAgICAgICAxMjM0CisjZGVmaW5lIFNBTVBMRV9JTlQxNl9BTFRFUk5BVEUgNjc4NQorc3RhdGljIGRidXNfaW50MTZfdAoraW50MTZfZnJvbV9zZWVkIChpbnQgc2VlZCkKK3sKKyAgLyogR2VuZXJhdGUgYW4gaW50ZWdlciB2YWx1ZSB0aGF0J3MgcHJlZGljdGFibGUgZnJvbSBzZWVkLiAgV2UgY291bGQKKyAgICoganVzdCB1c2Ugc2VlZCBpdHNlbGYsIGJ1dCB0aGF0IHdvdWxkIG9ubHkgZXZlciB0b3VjaCBvbmUgYnl0ZSBvZgorICAgKiB0aGUgaW50IHNvIHdvdWxkIG1pc3Mgc29tZSBraW5kcyBvZiBidWcuCisgICAqLworICBzdGF0aWMgY29uc3QgZGJ1c19pbnQxNl90IHZfb2Zfc2VlZFs1XSA9IHsKKyAgICBTQU1QTEVfSU5UMTYsCisgICAgU0FNUExFX0lOVDE2X0FMVEVSTkFURSwKKyAgICAtMSwKKyAgICBfREJVU19JTlQxNl9NQVgsCisgICAgMQorICB9OworCisgIGRidXNfaW50MTZfdCB2ID0gdl9vZl9zZWVkW3NlZWQgJSBfREJVU19OX0VMRU1FTlRTKHZfb2Zfc2VlZCldOworCisgIGlmIChzZWVkID4gMSkKKyAgICB2ICo9IHNlZWQ7IC8qIHdyYXBzIGFyb3VuZCBldmVudHVhbGx5LCB3aGljaCBpcyBmaW5lICovCisKKyAgcmV0dXJuIHY7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAoraW50MTZfd3JpdGVfdmFsdWUgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgIERhdGFCbG9jayAgICAgICpibG9jaywKKyAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVdyaXRlciAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKQoreworICAvKiBhbHNvIHVzZWQgZm9yIHVpbnQxNiAqLworICBkYnVzX2ludDE2X3QgdjsKKworICB2ID0gaW50MTZfZnJvbV9zZWVkIChzZWVkKTsKKworICByZXR1cm4gX2RidXNfdHlwZV93cml0ZXJfd3JpdGVfYmFzaWMgKHdyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLT5rbGFzcy0+dHlwZWNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnYpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2ludDE2X3JlYWRfdmFsdWUgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKQoreworICAvKiBhbHNvIHVzZWQgZm9yIHVpbnQxNiAqLworICBkYnVzX2ludDE2X3QgdjsKKworICBjaGVja19leHBlY3RlZF90eXBlIChyZWFkZXIsIG5vZGUtPmtsYXNzLT50eXBlY29kZSk7CisKKyAgX2RidXNfdHlwZV9yZWFkZXJfcmVhZF9iYXNpYyAocmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGJ1c19pbnQxNl90KikgJnYpOworCisgIF9kYnVzX2Fzc2VydCAodiA9PSBpbnQxNl9mcm9tX3NlZWQgKHNlZWQpKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitpbnQxNl9zZXRfdmFsdWUgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhbGlnbl9yb290LAorICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCkKK3sKKyAgLyogYWxzbyB1c2VkIGZvciB1aW50MTYgKi8KKyAgZGJ1c19pbnQxNl90IHY7CisKKyAgdiA9IGludDE2X2Zyb21fc2VlZCAoc2VlZCk7CisKKyAgcmV0dXJuIF9kYnVzX3R5cGVfcmVhZGVyX3NldF9iYXNpYyAocmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhbGlnbl9yb290KTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitpbnQxNl93cml0ZV9tdWx0aSAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgRGF0YUJsb2NrICAgICAgKmJsb2NrLAorICAgICAgICAgICAgICAgICAgIERCdXNUeXBlV3JpdGVyICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQsCisgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGNvdW50KQoreworICAvKiBhbHNvIHVzZWQgZm9yIHVpbnQxNiAqLworICBkYnVzX2ludDE2X3QgdmFsdWVzW01BWF9NVUxUSV9DT1VOVF07CisgIGRidXNfaW50MTZfdCAqdl9BUlJBWV9JTlQxNiA9IHZhbHVlczsKKyAgaW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IGNvdW50OyArK2kpCisgICAgdmFsdWVzW2ldID0gaW50MTZfZnJvbV9zZWVkIChzZWVkICsgaSk7CisKKyAgcmV0dXJuIF9kYnVzX3R5cGVfd3JpdGVyX3dyaXRlX2ZpeGVkX211bHRpICh3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS0+a2xhc3MtPnR5cGVjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2X0FSUkFZX0lOVDE2LCBjb3VudCk7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAoraW50MTZfcmVhZF9tdWx0aSAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQsCisgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgY291bnQpCit7CisgIC8qIGFsc28gdXNlZCBmb3IgdWludDE2ICovCisgIGRidXNfaW50MTZfdCAqdmFsdWVzOworICBpbnQgbl9lbGVtZW50czsKKyAgaW50IGk7CisKKyAgY2hlY2tfZXhwZWN0ZWRfdHlwZSAocmVhZGVyLCBub2RlLT5rbGFzcy0+dHlwZWNvZGUpOworCisgIF9kYnVzX3R5cGVfcmVhZGVyX3JlYWRfZml4ZWRfbXVsdGkgKHJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5fZWxlbWVudHMpOworCisgIGlmIChuX2VsZW1lbnRzICE9IGNvdW50KQorICAgIF9kYnVzX3dhcm4gKCJnb3QgJWQgZWxlbWVudHMgZXhwZWN0ZWQgJWQiLCBuX2VsZW1lbnRzLCBjb3VudCk7CisgIF9kYnVzX2Fzc2VydCAobl9lbGVtZW50cyA9PSBjb3VudCk7CisKKyAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgX2RidXNfYXNzZXJ0ICgoKGRidXNfaW50MTZfdClfZGJ1c191bnBhY2tfdWludDE2IChyZWFkZXItPmJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdW5zaWduZWQgY2hhciopdmFsdWVzICsgKGkgKiAyKSkpID09CisgICAgICAgICAgICAgICAgICBpbnQxNl9mcm9tX3NlZWQgKHNlZWQgKyBpKSk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKworI2RlZmluZSBTQU1QTEVfSU5UMzIgICAgICAgICAgIDEyMzQ1Njc4CisjZGVmaW5lIFNBTVBMRV9JTlQzMl9BTFRFUk5BVEUgNTM3ODE0MjkKK3N0YXRpYyBkYnVzX2ludDMyX3QKK2ludDMyX2Zyb21fc2VlZCAoaW50IHNlZWQpCit7CisgIC8qIEdlbmVyYXRlIGFuIGludGVnZXIgdmFsdWUgdGhhdCdzIHByZWRpY3RhYmxlIGZyb20gc2VlZC4gIFdlIGNvdWxkCisgICAqIGp1c3QgdXNlIHNlZWQgaXRzZWxmLCBidXQgdGhhdCB3b3VsZCBvbmx5IGV2ZXIgdG91Y2ggb25lIGJ5dGUgb2YKKyAgICogdGhlIGludCBzbyB3b3VsZCBtaXNzIHNvbWUga2luZHMgb2YgYnVnLgorICAgKi8KKyAgc3RhdGljIGNvbnN0IGRidXNfaW50MzJfdCB2X29mX3NlZWRbNV0gPSB7CisgICAgU0FNUExFX0lOVDMyLAorICAgIFNBTVBMRV9JTlQzMl9BTFRFUk5BVEUsCisgICAgLTEsCisgICAgX0RCVVNfSU5UX01BWCwKKyAgICAxCisgIH07CisKKyAgZGJ1c19pbnQzMl90IHYgPSB2X29mX3NlZWRbc2VlZCAlIF9EQlVTX05fRUxFTUVOVFModl9vZl9zZWVkKV07CisKKyAgaWYgKHNlZWQgPiAxKQorICAgIHYgKj0gc2VlZDsgLyogd3JhcHMgYXJvdW5kIGV2ZW50dWFsbHksIHdoaWNoIGlzIGZpbmUgKi8KKworICByZXR1cm4gdjsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitpbnQzMl93cml0ZV92YWx1ZSAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgRGF0YUJsb2NrICAgICAgKmJsb2NrLAorICAgICAgICAgICAgICAgICAgIERCdXNUeXBlV3JpdGVyICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpCit7CisgIC8qIGFsc28gdXNlZCBmb3IgdWludDMyICovCisgIGRidXNfaW50MzJfdCB2OworCisgIHYgPSBpbnQzMl9mcm9tX3NlZWQgKHNlZWQpOworCisgIHJldHVybiBfZGJ1c190eXBlX3dyaXRlcl93cml0ZV9iYXNpYyAod3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUtPmtsYXNzLT50eXBlY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdik7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAoraW50MzJfcmVhZF92YWx1ZSAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpCit7CisgIC8qIGFsc28gdXNlZCBmb3IgdWludDMyICovCisgIGRidXNfaW50MzJfdCB2OworCisgIGNoZWNrX2V4cGVjdGVkX3R5cGUgKHJlYWRlciwgbm9kZS0+a2xhc3MtPnR5cGVjb2RlKTsKKworICBfZGJ1c190eXBlX3JlYWRlcl9yZWFkX2Jhc2ljIChyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkYnVzX2ludDMyX3QqKSAmdik7CisKKyAgX2RidXNfYXNzZXJ0ICh2ID09IGludDMyX2Zyb21fc2VlZCAoc2VlZCkpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2ludDMyX3NldF92YWx1ZSAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFsaWduX3Jvb3QsCisgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKQoreworICAvKiBhbHNvIHVzZWQgZm9yIHVpbnQzMiAqLworICBkYnVzX2ludDMyX3QgdjsKKworICB2ID0gaW50MzJfZnJvbV9zZWVkIChzZWVkKTsKKworICByZXR1cm4gX2RidXNfdHlwZV9yZWFkZXJfc2V0X2Jhc2ljIChyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFsaWduX3Jvb3QpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2ludDMyX3dyaXRlX211bHRpIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICBEYXRhQmxvY2sgICAgICAqYmxvY2ssCisgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVXcml0ZXIgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCwKKyAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgY291bnQpCit7CisgIC8qIGFsc28gdXNlZCBmb3IgdWludDMyICovCisgIGRidXNfaW50MzJfdCB2YWx1ZXNbTUFYX01VTFRJX0NPVU5UXTsKKyAgZGJ1c19pbnQzMl90ICp2X0FSUkFZX0lOVDMyID0gdmFsdWVzOworICBpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7ICsraSkKKyAgICB2YWx1ZXNbaV0gPSBpbnQzMl9mcm9tX3NlZWQgKHNlZWQgKyBpKTsKKworICByZXR1cm4gX2RidXNfdHlwZV93cml0ZXJfd3JpdGVfZml4ZWRfbXVsdGkgKHdyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLT5rbGFzcy0+dHlwZWNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZfQVJSQVlfSU5UMzIsIGNvdW50KTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitpbnQzMl9yZWFkX211bHRpIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCwKKyAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBjb3VudCkKK3sKKyAgLyogYWxzbyB1c2VkIGZvciB1aW50MzIgKi8KKyAgZGJ1c19pbnQzMl90ICp2YWx1ZXM7CisgIGludCBuX2VsZW1lbnRzOworICBpbnQgaTsKKworICBjaGVja19leHBlY3RlZF90eXBlIChyZWFkZXIsIG5vZGUtPmtsYXNzLT50eXBlY29kZSk7CisKKyAgX2RidXNfdHlwZV9yZWFkZXJfcmVhZF9maXhlZF9tdWx0aSAocmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbl9lbGVtZW50cyk7CisKKyAgaWYgKG5fZWxlbWVudHMgIT0gY291bnQpCisgICAgX2RidXNfd2FybiAoImdvdCAlZCBlbGVtZW50cyBleHBlY3RlZCAlZCIsIG5fZWxlbWVudHMsIGNvdW50KTsKKyAgX2RidXNfYXNzZXJ0IChuX2VsZW1lbnRzID09IGNvdW50KTsKKworICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICBfZGJ1c19hc3NlcnQgKCgoaW50KV9kYnVzX3VucGFja191aW50MzIgKHJlYWRlci0+Ynl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1bnNpZ25lZCBjaGFyKil2YWx1ZXMgKyAoaSAqIDQpKSkgPT0KKyAgICAgICAgICAgICAgICAgIGludDMyX2Zyb21fc2VlZCAoc2VlZCArIGkpKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfaW50NjRfdAoraW50NjRfZnJvbV9zZWVkIChpbnQgc2VlZCkKK3sKKyAgZGJ1c19pbnQzMl90IHYzMjsKKyAgZGJ1c19pbnQ2NF90IHY7CisKKyAgdjMyID0gaW50MzJfZnJvbV9zZWVkIChzZWVkKTsKKworICB2ID0gLSAoZGJ1c19pbnQzMl90KSB+IHYzMjsKKyAgdiB8PSAoKChkYnVzX2ludDY0X3QpdjMyKSA8PCAzMik7CisKKyAgcmV0dXJuIHY7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAoraW50NjRfd3JpdGVfdmFsdWUgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgIERhdGFCbG9jayAgICAgICpibG9jaywKKyAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVdyaXRlciAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKQoreworICAvKiBhbHNvIHVzZWQgZm9yIHVpbnQ2NCAqLworICBkYnVzX2ludDY0X3QgdjsKKworICB2ID0gaW50NjRfZnJvbV9zZWVkIChzZWVkKTsKKworICByZXR1cm4gX2RidXNfdHlwZV93cml0ZXJfd3JpdGVfYmFzaWMgKHdyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLT5rbGFzcy0+dHlwZWNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnYpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2ludDY0X3JlYWRfdmFsdWUgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKQoreworICAvKiBhbHNvIHVzZWQgZm9yIHVpbnQ2NCAqLworICBkYnVzX2ludDY0X3QgdjsKKworICBjaGVja19leHBlY3RlZF90eXBlIChyZWFkZXIsIG5vZGUtPmtsYXNzLT50eXBlY29kZSk7CisKKyAgX2RidXNfdHlwZV9yZWFkZXJfcmVhZF9iYXNpYyAocmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGJ1c19pbnQ2NF90KikgJnYpOworCisgIF9kYnVzX2Fzc2VydCAodiA9PSBpbnQ2NF9mcm9tX3NlZWQgKHNlZWQpKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitpbnQ2NF9zZXRfdmFsdWUgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhbGlnbl9yb290LAorICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCkKK3sKKyAgLyogYWxzbyB1c2VkIGZvciB1aW50NjQgKi8KKyAgZGJ1c19pbnQ2NF90IHY7CisKKyAgdiA9IGludDY0X2Zyb21fc2VlZCAoc2VlZCk7CisKKyAgcmV0dXJuIF9kYnVzX3R5cGVfcmVhZGVyX3NldF9iYXNpYyAocmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhbGlnbl9yb290KTsKK30KKworI2RlZmluZSBNQVhfU0FNUExFX1NUUklOR19MRU4gMTAKK3N0YXRpYyB2b2lkCitzdHJpbmdfZnJvbV9zZWVkIChjaGFyICpidWYsCisgICAgICAgICAgICAgICAgICBpbnQgICBsZW4sCisgICAgICAgICAgICAgICAgICBpbnQgICBzZWVkKQoreworICBpbnQgaTsKKyAgdW5zaWduZWQgY2hhciB2OworCisgIF9kYnVzX2Fzc2VydCAobGVuIDwgTUFYX1NBTVBMRV9TVFJJTkdfTEVOKTsKKworICAvKiB2YXJ5IHRoZSBsZW5ndGggc2xpZ2h0bHksIHRob3VnaCB3ZSBhbHNvIGhhdmUgbXVsdGlwbGUgc3RyaW5nCisgICAqIHZhbHVlIHR5cGVzIGZvciB0aGlzLCB2YXJ5aW5nIGl0IGhlcmUgdGVzdHMgdGhlIHNldF92YWx1ZSBjb2RlCisgICAqLworICBzd2l0Y2ggKHNlZWQgJSAzKQorICAgIHsKKyAgICBkZWZhdWx0OgorICAgICAgLyogZG9uJ3QgYWx0ZXIgaXQgKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgIGxlbiArPSAyOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgbGVuIC09IDI7CisgICAgICBicmVhazsKKyAgICB9CisgIGlmIChsZW4gPCAwKQorICAgIGxlbiA9IDA7CisKKyAgdiA9ICh1bnNpZ25lZCBjaGFyKSAoJ0EnICsgc2VlZCk7CisKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgbGVuKQorICAgIHsKKyAgICAgIGlmICh2IDwgJ0EnIHx8IHYgPiAneicpCisgICAgICAgIHYgPSAnQSc7CisKKyAgICAgIGJ1ZltpXSA9IHY7CisKKyAgICAgIHYgKz0gMTsKKyAgICAgICsraTsKKyAgICB9CisKKyAgYnVmW2ldID0gJ1wwJzsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitzdHJpbmdfd3JpdGVfdmFsdWUgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICBEYXRhQmxvY2sgICAgICAqYmxvY2ssCisgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlV3JpdGVyICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKQoreworICBjaGFyIGJ1ZltNQVhfU0FNUExFX1NUUklOR19MRU4gKyAxXT0iIjsKKyAgY29uc3QgY2hhciAqdl9zdHJpbmcgPSBidWY7CisKKworICBzdHJpbmdfZnJvbV9zZWVkIChidWYsIG5vZGUtPmtsYXNzLT5zdWJjbGFzc19kZXRhaWwsCisgICAgICAgICAgICAgICAgICAgIHNlZWQpOworCisgIHJldHVybiBfZGJ1c190eXBlX3dyaXRlcl93cml0ZV9iYXNpYyAod3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUtPmtsYXNzLT50eXBlY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdl9zdHJpbmcpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3N0cmluZ19yZWFkX3ZhbHVlIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKQoreworICBjb25zdCBjaGFyICp2OworICBjaGFyIGJ1ZltNQVhfU0FNUExFX1NUUklOR19MRU4gKyAxXTsKKyAgdiA9IGJ1ZjsKKworICBjaGVja19leHBlY3RlZF90eXBlIChyZWFkZXIsIG5vZGUtPmtsYXNzLT50eXBlY29kZSk7CisKKyAgX2RidXNfdHlwZV9yZWFkZXJfcmVhZF9iYXNpYyAocmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciAqKikgJnYpOworCisgIHN0cmluZ19mcm9tX3NlZWQgKGJ1Ziwgbm9kZS0+a2xhc3MtPnN1YmNsYXNzX2RldGFpbCwKKyAgICAgICAgICAgICAgICAgICAgc2VlZCk7CisKKyAgaWYgKHN0cmNtcCAoYnVmLCB2KSAhPSAwKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJyZWFkIHN0cmluZyAnJXMnIGV4cGVjdGVkICclcyciLAorICAgICAgICAgICAgICAgICAgdiwgYnVmKTsKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInRlc3QgZmFpbGVkIik7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3N0cmluZ19zZXRfdmFsdWUgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFsaWduX3Jvb3QsCisgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCkKK3sKKyAgY2hhciBidWZbTUFYX1NBTVBMRV9TVFJJTkdfTEVOICsgMV07CisgIGNvbnN0IGNoYXIgKnZfc3RyaW5nID0gYnVmOworCisgIHN0cmluZ19mcm9tX3NlZWQgKGJ1Ziwgbm9kZS0+a2xhc3MtPnN1YmNsYXNzX2RldGFpbCwKKyAgICAgICAgICAgICAgICAgICAgc2VlZCk7CisKKyNpZiBSRUNVUlNJVkVfTUFSU0hBTF9XUklURV9UUkFDRQorIHsKKyAgIGNvbnN0IGNoYXIgKm9sZDsKKyAgIF9kYnVzX3R5cGVfcmVhZGVyX3JlYWRfYmFzaWMgKHJlYWRlciwgJm9sZCk7CisgICBfZGJ1c192ZXJib3NlICgiU0VUVElORyBuZXcgc3RyaW5nICclcycgbGVuICVkIGluIHBsYWNlIG9mICclcycgbGVuICVkXG4iLAorICAgICAgICAgICAgICAgICAgdl9zdHJpbmcsIHN0cmxlbiAodl9zdHJpbmcpLCBvbGQsIHN0cmxlbiAob2xkKSk7CisgfQorI2VuZGlmCisKKyAgcmV0dXJuIF9kYnVzX3R5cGVfcmVhZGVyX3NldF9iYXNpYyAocmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdl9zdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWxpZ25fcm9vdCk7Cit9CisKKyNkZWZpbmUgQk9PTF9GUk9NX1NFRUQoc2VlZCkgKChkYnVzX2Jvb2xfdCkoKHNlZWQpICUgMikpCisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYm9vbF93cml0ZV92YWx1ZSAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICBEYXRhQmxvY2sgICAgICAqYmxvY2ssCisgICAgICAgICAgICAgICAgICBEQnVzVHlwZVdyaXRlciAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpCit7CisgIGRidXNfYm9vbF90IHY7CisKKyAgdiA9IEJPT0xfRlJPTV9TRUVEIChzZWVkKTsKKworICByZXR1cm4gX2RidXNfdHlwZV93cml0ZXJfd3JpdGVfYmFzaWMgKHdyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLT5rbGFzcy0+dHlwZWNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnYpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2Jvb2xfcmVhZF92YWx1ZSAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKQoreworICBkYnVzX2Jvb2xfdCB2OworCisgIGNoZWNrX2V4cGVjdGVkX3R5cGUgKHJlYWRlciwgbm9kZS0+a2xhc3MtPnR5cGVjb2RlKTsKKworICBfZGJ1c190eXBlX3JlYWRlcl9yZWFkX2Jhc2ljIChyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyKikgJnYpOworCisgIF9kYnVzX2Fzc2VydCAodiA9PSBCT09MX0ZST01fU0VFRCAoc2VlZCkpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2Jvb2xfc2V0X3ZhbHVlIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFsaWduX3Jvb3QsCisgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpCit7CisgIGRidXNfYm9vbF90IHY7CisKKyAgdiA9IEJPT0xfRlJPTV9TRUVEIChzZWVkKTsKKworICByZXR1cm4gX2RidXNfdHlwZV9yZWFkZXJfc2V0X2Jhc2ljIChyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFsaWduX3Jvb3QpOworfQorCisjZGVmaW5lIEJZVEVfRlJPTV9TRUVEKHNlZWQpICgodW5zaWduZWQgY2hhcikgaW50MzJfZnJvbV9zZWVkIChzZWVkKSkKKworc3RhdGljIGRidXNfYm9vbF90CitieXRlX3dyaXRlX3ZhbHVlIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgIERhdGFCbG9jayAgICAgICpibG9jaywKKyAgICAgICAgICAgICAgICAgIERCdXNUeXBlV3JpdGVyICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCkKK3sKKyAgdW5zaWduZWQgY2hhciB2OworCisgIHYgPSBCWVRFX0ZST01fU0VFRCAoc2VlZCk7CisKKyAgcmV0dXJuIF9kYnVzX3R5cGVfd3JpdGVyX3dyaXRlX2Jhc2ljICh3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS0+a2xhc3MtPnR5cGVjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2KTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitieXRlX3JlYWRfdmFsdWUgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCkKK3sKKyAgdW5zaWduZWQgY2hhciB2OworCisgIGNoZWNrX2V4cGVjdGVkX3R5cGUgKHJlYWRlciwgbm9kZS0+a2xhc3MtPnR5cGVjb2RlKTsKKworICBfZGJ1c190eXBlX3JlYWRlcl9yZWFkX2Jhc2ljIChyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyKikgJnYpOworCisgIF9kYnVzX2Fzc2VydCAodiA9PSBCWVRFX0ZST01fU0VFRCAoc2VlZCkpOworCisgIHJldHVybiBUUlVFOworfQorCisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYnl0ZV9zZXRfdmFsdWUgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWxpZ25fcm9vdCwKKyAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCkKK3sKKyAgdW5zaWduZWQgY2hhciB2OworCisgIHYgPSBCWVRFX0ZST01fU0VFRCAoc2VlZCk7CisKKyAgcmV0dXJuIF9kYnVzX3R5cGVfcmVhZGVyX3NldF9iYXNpYyAocmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhbGlnbl9yb290KTsKK30KKworc3RhdGljIGRvdWJsZQorZG91YmxlX2Zyb21fc2VlZCAoaW50IHNlZWQpCit7CisgIHJldHVybiBTQU1QTEVfSU5UMzIgKiAoZG91YmxlKSBzZWVkICsgMC4zOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2RvdWJsZV93cml0ZV92YWx1ZSAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgIERhdGFCbG9jayAgICAgICpibG9jaywKKyAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVXcml0ZXIgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpCit7CisgIGRvdWJsZSB2OworCisgIHYgPSBkb3VibGVfZnJvbV9zZWVkIChzZWVkKTsKKworICByZXR1cm4gX2RidXNfdHlwZV93cml0ZXJfd3JpdGVfYmFzaWMgKHdyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLT5rbGFzcy0+dHlwZWNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnYpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2RvdWJsZV9yZWFkX3ZhbHVlIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKQoreworICBkb3VibGUgdjsKKyAgZG91YmxlIGV4cGVjdGVkOworCisgIGNoZWNrX2V4cGVjdGVkX3R5cGUgKHJlYWRlciwgbm9kZS0+a2xhc3MtPnR5cGVjb2RlKTsKKworICBfZGJ1c190eXBlX3JlYWRlcl9yZWFkX2Jhc2ljIChyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkb3VibGUqKSAmdik7CisKKyAgZXhwZWN0ZWQgPSBkb3VibGVfZnJvbV9zZWVkIChzZWVkKTsKKworICBpZiAoIV9EQlVTX0RPVUJMRVNfQklUV0lTRV9FUVVBTCAodiwgZXhwZWN0ZWQpKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJFeHBlY3RlZCBkb3VibGUgJWcgZ290ICVnXG4gYml0cyA9IDB4JSIgUFJJeDY0ICIgdnMuXG4gYml0cyA9IDB4JSIgUFJJeDY0LAorICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQsIHYsCisgICAgICAgICAgICAgICAgICAqKGRidXNfdWludDY0X3QqKShjaGFyKikmZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgICAqKGRidXNfdWludDY0X3QqKShjaGFyKikmdik7CisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJ0ZXN0IGZhaWxlZCIpOworICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90Citkb3VibGVfc2V0X3ZhbHVlIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFsaWduX3Jvb3QsCisgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpCit7CisgIGRvdWJsZSB2OworCisgIHYgPSBkb3VibGVfZnJvbV9zZWVkIChzZWVkKTsKKworICByZXR1cm4gX2RidXNfdHlwZV9yZWFkZXJfc2V0X2Jhc2ljIChyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFsaWduX3Jvb3QpOworfQorCisjZGVmaW5lIE1BWF9TQU1QTEVfT0JKRUNUX1BBVEhfTEVOIDEwCitzdGF0aWMgdm9pZAorb2JqZWN0X3BhdGhfZnJvbV9zZWVkIChjaGFyICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgIGludCAgIHNlZWQpCit7CisgIGludCBpOworICB1bnNpZ25lZCBjaGFyIHY7CisgIGludCBsZW47CisKKyAgbGVuID0gc2VlZCAlIDk7CisgIF9kYnVzX2Fzc2VydCAobGVuIDwgTUFYX1NBTVBMRV9PQkpFQ1RfUEFUSF9MRU4pOworCisgIHYgPSAodW5zaWduZWQgY2hhcikgKCdBJyArIHNlZWQpOworCisgIGlmIChsZW4gPCAyKQorICAgIHsKKyAgICAgIGJ1ZlswXSA9ICcvJzsKKyAgICAgIGkgPSAxOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGkgPSAwOworICAgICAgd2hpbGUgKGkgKyAxIDwgbGVuKQorICAgICAgICB7CisgICAgICAgICAgaWYgKHYgPCAnQScgfHwgdiA+ICd6JykKKyAgICAgICAgICAgIHYgPSAnQSc7CisKKyAgICAgICAgICBidWZbaV0gPSAnLyc7CisgICAgICAgICAgKytpOworICAgICAgICAgIGJ1ZltpXSA9IHY7CisgICAgICAgICAgKytpOworICAgICAgICAgIAorICAgICAgICAgIHYgKz0gMTsKKyAgICAgICAgfQorICAgIH0KKworICBidWZbaV0gPSAnXDAnOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK29iamVjdF9wYXRoX3dyaXRlX3ZhbHVlIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhQmxvY2sgICAgICAqYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVXcml0ZXIgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCkKK3sKKyAgY2hhciBidWZbTUFYX1NBTVBMRV9PQkpFQ1RfUEFUSF9MRU4gKyAxXTsKKyAgY29uc3QgY2hhciAqdl9zdHJpbmcgPSBidWY7CisKKyAgb2JqZWN0X3BhdGhfZnJvbV9zZWVkIChidWYsIHNlZWQpOworCisgIHJldHVybiBfZGJ1c190eXBlX3dyaXRlcl93cml0ZV9iYXNpYyAod3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUtPmtsYXNzLT50eXBlY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdl9zdHJpbmcpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK29iamVjdF9wYXRoX3JlYWRfdmFsdWUgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKQoreworICBjb25zdCBjaGFyICp2OworICBjaGFyIGJ1ZltNQVhfU0FNUExFX09CSkVDVF9QQVRIX0xFTiArIDFdOworCisgIGNoZWNrX2V4cGVjdGVkX3R5cGUgKHJlYWRlciwgbm9kZS0+a2xhc3MtPnR5cGVjb2RlKTsKKworICBfZGJ1c190eXBlX3JlYWRlcl9yZWFkX2Jhc2ljIChyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICoqKSAmdik7CisKKyAgb2JqZWN0X3BhdGhfZnJvbV9zZWVkIChidWYsIHNlZWQpOworCisgIGlmIChzdHJjbXAgKGJ1ZiwgdikgIT0gMCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgicmVhZCBvYmplY3QgcGF0aCAnJXMnIGV4cGVjdGVkICclcyciLAorICAgICAgICAgICAgICAgICAgdiwgYnVmKTsKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInRlc3QgZmFpbGVkIik7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK29iamVjdF9wYXRoX3NldF92YWx1ZSAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFsaWduX3Jvb3QsCisgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKQoreworICBjaGFyIGJ1ZltNQVhfU0FNUExFX09CSkVDVF9QQVRIX0xFTiArIDFdOworICBjb25zdCBjaGFyICp2X3N0cmluZyA9IGJ1ZjsKKworICBvYmplY3RfcGF0aF9mcm9tX3NlZWQgKGJ1Ziwgc2VlZCk7CisKKyAgcmV0dXJuIF9kYnVzX3R5cGVfcmVhZGVyX3NldF9iYXNpYyAocmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdl9zdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWxpZ25fcm9vdCk7Cit9CisKKyNkZWZpbmUgTUFYX1NBTVBMRV9TSUdOQVRVUkVfTEVOIDEwCitzdGF0aWMgdm9pZAorc2lnbmF0dXJlX2Zyb21fc2VlZCAoY2hhciAqYnVmLAorICAgICAgICAgICAgICAgICAgICAgaW50ICAgc2VlZCkKK3sKKyAgLyogdHJ5IHRvIGF2b2lkIGFzY2VuZGluZywgZGVzY2VuZGluZywgb3IgYWx0ZXJuYXRpbmcgbGVuZ3RoIHRvIGhlbHAgZmluZCBidWdzICovCisgIGNvbnN0IGNoYXIgKnNhbXBsZV9zaWduYXR1cmVzW10gPSB7CisgICAgImFzYXgiLAorICAgICIiLAorICAgICJhc2F1KHh4eHgpIiwKKyAgICAieCIsCisgICAgImFpIiwKKyAgICAiYShpaSkiCisgIH07CisKKyAgc3RyY3B5IChidWYsIHNhbXBsZV9zaWduYXR1cmVzW3NlZWQgJSBfREJVU19OX0VMRU1FTlRTKHNhbXBsZV9zaWduYXR1cmVzKV0pOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3NpZ25hdHVyZV93cml0ZV92YWx1ZSAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgIERhdGFCbG9jayAgICAgICpibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVXcml0ZXIgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpCit7CisgIGNoYXIgYnVmW01BWF9TQU1QTEVfU0lHTkFUVVJFX0xFTiArIDFdOworICBjb25zdCBjaGFyICp2X3N0cmluZyA9IGJ1ZjsKKworICBzaWduYXR1cmVfZnJvbV9zZWVkIChidWYsIHNlZWQpOworCisgIHJldHVybiBfZGJ1c190eXBlX3dyaXRlcl93cml0ZV9iYXNpYyAod3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUtPmtsYXNzLT50eXBlY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdl9zdHJpbmcpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3NpZ25hdHVyZV9yZWFkX3ZhbHVlIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKQoreworICBjb25zdCBjaGFyICp2OworICBjaGFyIGJ1ZltNQVhfU0FNUExFX1NJR05BVFVSRV9MRU4gKyAxXTsKKworICBjaGVja19leHBlY3RlZF90eXBlIChyZWFkZXIsIG5vZGUtPmtsYXNzLT50eXBlY29kZSk7CisKKyAgX2RidXNfdHlwZV9yZWFkZXJfcmVhZF9iYXNpYyAocmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciAqKikgJnYpOworCisgIHNpZ25hdHVyZV9mcm9tX3NlZWQgKGJ1Ziwgc2VlZCk7CisKKyAgaWYgKHN0cmNtcCAoYnVmLCB2KSAhPSAwKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJyZWFkIHNpZ25hdHVyZSB2YWx1ZSAnJXMnIGV4cGVjdGVkICclcyciLAorICAgICAgICAgICAgICAgICAgdiwgYnVmKTsKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInRlc3QgZmFpbGVkIik7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorc2lnbmF0dXJlX3NldF92YWx1ZSAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWxpZ25fcm9vdCwKKyAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKQoreworICBjaGFyIGJ1ZltNQVhfU0FNUExFX1NJR05BVFVSRV9MRU4gKyAxXTsKKyAgY29uc3QgY2hhciAqdl9zdHJpbmcgPSBidWY7CisKKyAgc2lnbmF0dXJlX2Zyb21fc2VlZCAoYnVmLCBzZWVkKTsKKworICByZXR1cm4gX2RidXNfdHlwZV9yZWFkZXJfc2V0X2Jhc2ljIChyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2X3N0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhbGlnbl9yb290KTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitzdHJ1Y3Rfd3JpdGVfdmFsdWUgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICBEYXRhQmxvY2sgICAgICAqYmxvY2ssCisgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlV3JpdGVyICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKQoreworICBUZXN0VHlwZU5vZGVDb250YWluZXIgKmNvbnRhaW5lciA9IChUZXN0VHlwZU5vZGVDb250YWluZXIqKSBub2RlOworICBEYXRhQmxvY2tTdGF0ZSBzYXZlZDsKKyAgREJ1c1R5cGVXcml0ZXIgc3ViOworICBpbnQgaTsKKyAgaW50IG5fY29waWVzOworCisgIG5fY29waWVzID0gbm9kZS0+a2xhc3MtPnN1YmNsYXNzX2RldGFpbDsKKworICBfZGJ1c19hc3NlcnQgKGNvbnRhaW5lci0+Y2hpbGRyZW4gIT0gTlVMTCk7CisKKyAgZGF0YV9ibG9ja19zYXZlIChibG9jaywgJnNhdmVkKTsKKworICBpZiAoIV9kYnVzX3R5cGVfd3JpdGVyX3JlY3Vyc2UgKHdyaXRlciwgREJVU19UWVBFX1NUUlVDVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdWIpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpID0gMDsKKyAgd2hpbGUgKGkgPCBuX2NvcGllcykKKyAgICB7CisgICAgICBEQnVzTGlzdCAqbGluazsKKworICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZjb250YWluZXItPmNoaWxkcmVuKTsKKyAgICAgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBUZXN0VHlwZU5vZGUgKmNoaWxkID0gbGluay0+ZGF0YTsKKyAgICAgICAgICBEQnVzTGlzdCAqbmV4dCA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJmNvbnRhaW5lci0+Y2hpbGRyZW4sIGxpbmspOworCisgICAgICAgICAgaWYgKCFub2RlX3dyaXRlX3ZhbHVlIChjaGlsZCwgYmxvY2ssICZzdWIsIHNlZWQgKyBpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGF0YV9ibG9ja19yZXN0b3JlIChibG9jaywgJnNhdmVkKTsKKyAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgbGluayA9IG5leHQ7CisgICAgICAgIH0KKworICAgICAgKytpOworICAgIH0KKworICBpZiAoIV9kYnVzX3R5cGVfd3JpdGVyX3VucmVjdXJzZSAod3JpdGVyLCAmc3ViKSkKKyAgICB7CisgICAgICBkYXRhX2Jsb2NrX3Jlc3RvcmUgKGJsb2NrLCAmc2F2ZWQpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitzdHJ1Y3RfcmVhZF9vcl9zZXRfdmFsdWUgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhbGlnbl9yb290LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCkKK3sKKyAgVGVzdFR5cGVOb2RlQ29udGFpbmVyICpjb250YWluZXIgPSAoVGVzdFR5cGVOb2RlQ29udGFpbmVyKikgbm9kZTsKKyAgREJ1c1R5cGVSZWFkZXIgc3ViOworICBpbnQgaTsKKyAgaW50IG5fY29waWVzOworCisgIG5fY29waWVzID0gbm9kZS0+a2xhc3MtPnN1YmNsYXNzX2RldGFpbDsKKworICBjaGVja19leHBlY3RlZF90eXBlIChyZWFkZXIsIERCVVNfVFlQRV9TVFJVQ1QpOworCisgIF9kYnVzX3R5cGVfcmVhZGVyX3JlY3Vyc2UgKHJlYWRlciwgJnN1Yik7CisKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgbl9jb3BpZXMpCisgICAgeworICAgICAgREJ1c0xpc3QgKmxpbms7CisKKyAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmY29udGFpbmVyLT5jaGlsZHJlbik7CisgICAgICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgVGVzdFR5cGVOb2RlICpjaGlsZCA9IGxpbmstPmRhdGE7CisgICAgICAgICAgREJ1c0xpc3QgKm5leHQgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZjb250YWluZXItPmNoaWxkcmVuLCBsaW5rKTsKKworICAgICAgICAgIGlmIChyZWFsaWduX3Jvb3QgPT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKCFub2RlX3JlYWRfdmFsdWUgKGNoaWxkLCAmc3ViLCBzZWVkICsgaSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKCFub2RlX3NldF92YWx1ZSAoY2hpbGQsICZzdWIsIHJlYWxpZ25fcm9vdCwgc2VlZCArIGkpKQorICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChpID09IChuX2NvcGllcyAtIDEpICYmIG5leHQgPT0gTlVMTCkKKyAgICAgICAgICAgIE5FWFRfRVhQRUNUSU5HX0ZBTFNFICgmc3ViKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBORVhUX0VYUEVDVElOR19UUlVFICgmc3ViKTsKKworICAgICAgICAgIGxpbmsgPSBuZXh0OworICAgICAgICB9CisKKyAgICAgICsraTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorc3RydWN0X3JlYWRfdmFsdWUgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpCit7CisgIHJldHVybiBzdHJ1Y3RfcmVhZF9vcl9zZXRfdmFsdWUgKG5vZGUsIHJlYWRlciwgTlVMTCwgc2VlZCk7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorc3RydWN0X3NldF92YWx1ZSAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWxpZ25fcm9vdCwKKyAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKQoreworICByZXR1cm4gc3RydWN0X3JlYWRfb3Jfc2V0X3ZhbHVlIChub2RlLCByZWFkZXIsIHJlYWxpZ25fcm9vdCwgc2VlZCk7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorc3RydWN0X2J1aWxkX3NpZ25hdHVyZSAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAqc3RyKQoreworICBUZXN0VHlwZU5vZGVDb250YWluZXIgKmNvbnRhaW5lciA9IChUZXN0VHlwZU5vZGVDb250YWluZXIqKSBub2RlOworICBpbnQgaTsKKyAgaW50IG9yaWdfbGVuOworICBpbnQgbl9jb3BpZXM7CisKKyAgbl9jb3BpZXMgPSBub2RlLT5rbGFzcy0+c3ViY2xhc3NfZGV0YWlsOworCisgIG9yaWdfbGVuID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHN0cik7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX2J5dGUgKHN0ciwgREJVU19TVFJVQ1RfQkVHSU5fQ0hBUikpCisgICAgZ290byBvb207CisKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgbl9jb3BpZXMpCisgICAgeworICAgICAgREJ1c0xpc3QgKmxpbms7CisKKyAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmY29udGFpbmVyLT5jaGlsZHJlbik7CisgICAgICB3aGlsZSAobGluayAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgVGVzdFR5cGVOb2RlICpjaGlsZCA9IGxpbmstPmRhdGE7CisgICAgICAgICAgREJ1c0xpc3QgKm5leHQgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZjb250YWluZXItPmNoaWxkcmVuLCBsaW5rKTsKKworICAgICAgICAgIGlmICghbm9kZV9idWlsZF9zaWduYXR1cmUgKGNoaWxkLCBzdHIpKQorICAgICAgICAgICAgZ290byBvb207CisKKyAgICAgICAgICBsaW5rID0gbmV4dDsKKyAgICAgICAgfQorCisgICAgICArK2k7CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlIChzdHIsIERCVVNfU1RSVUNUX0VORF9DSEFSKSkKKyAgICBnb3RvIG9vbTsKKworICByZXR1cm4gVFJVRTsKKworIG9vbToKKyAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKHN0ciwgb3JpZ19sZW4pOworICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYXJyYXlfd3JpdGVfdmFsdWUgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgIERhdGFCbG9jayAgICAgICpibG9jaywKKyAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVdyaXRlciAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKQoreworICBUZXN0VHlwZU5vZGVDb250YWluZXIgKmNvbnRhaW5lciA9IChUZXN0VHlwZU5vZGVDb250YWluZXIqKSBub2RlOworICBEYXRhQmxvY2tTdGF0ZSBzYXZlZDsKKyAgREJ1c1R5cGVXcml0ZXIgc3ViOworICBEQnVzU3RyaW5nIGVsZW1lbnRfc2lnbmF0dXJlOworICBpbnQgaTsKKyAgaW50IG5fY29waWVzOworICBpbnQgZWxlbWVudF90eXBlOworICBUZXN0VHlwZU5vZGUgKmNoaWxkOworCisgIG5fY29waWVzID0gbm9kZS0+a2xhc3MtPnN1YmNsYXNzX2RldGFpbDsKKworICBfZGJ1c19hc3NlcnQgKGNvbnRhaW5lci0+Y2hpbGRyZW4gIT0gTlVMTCk7CisKKyAgZGF0YV9ibG9ja19zYXZlIChibG9jaywgJnNhdmVkKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZWxlbWVudF9zaWduYXR1cmUpKQorICAgIHJldHVybiBGQUxTRTsKKworICBjaGlsZCA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0ICgmY29udGFpbmVyLT5jaGlsZHJlbik7CisKKyAgaWYgKCFub2RlX2J1aWxkX3NpZ25hdHVyZSAoY2hpbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbGVtZW50X3NpZ25hdHVyZSkpCisgICAgZ290byBvb207CisKKyAgZWxlbWVudF90eXBlID0gX2RidXNfZmlyc3RfdHlwZV9pbl9zaWduYXR1cmUgKCZlbGVtZW50X3NpZ25hdHVyZSwgMCk7CisKKyAgaWYgKCFfZGJ1c190eXBlX3dyaXRlcl9yZWN1cnNlICh3cml0ZXIsIERCVVNfVFlQRV9BUlJBWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZWxlbWVudF9zaWduYXR1cmUsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN1YikpCisgICAgZ290byBvb207CisKKyAgaWYgKGFycmF5c193cml0ZV9maXhlZF9pbl9ibG9ja3MgJiYKKyAgICAgIGRidXNfdHlwZV9pc19maXhlZCAoZWxlbWVudF90eXBlKSAmJgorICAgICAgY2hpbGQtPmtsYXNzLT53cml0ZV9tdWx0aSkKKyAgICB7CisgICAgICBpZiAoIW5vZGVfd3JpdGVfbXVsdGkgKGNoaWxkLCBibG9jaywgJnN1Yiwgc2VlZCwgbl9jb3BpZXMpKQorICAgICAgICBnb3RvIG9vbTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpID0gMDsKKyAgICAgIHdoaWxlIChpIDwgbl9jb3BpZXMpCisgICAgICAgIHsKKyAgICAgICAgICBEQnVzTGlzdCAqbGluazsKKworICAgICAgICAgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmY29udGFpbmVyLT5jaGlsZHJlbik7CisgICAgICAgICAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgVGVzdFR5cGVOb2RlICpjaGlsZDIgPSBsaW5rLT5kYXRhOworICAgICAgICAgICAgICBEQnVzTGlzdCAqbmV4dCA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJmNvbnRhaW5lci0+Y2hpbGRyZW4sIGxpbmspOworCisgICAgICAgICAgICAgIGlmICghbm9kZV93cml0ZV92YWx1ZSAoY2hpbGQyLCBibG9jaywgJnN1Yiwgc2VlZCArIGkpKQorICAgICAgICAgICAgICAgIGdvdG8gb29tOworCisgICAgICAgICAgICAgIGxpbmsgPSBuZXh0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgKytpOworICAgICAgICB9CisgICAgfQorCisgIGlmICghX2RidXNfdHlwZV93cml0ZXJfdW5yZWN1cnNlICh3cml0ZXIsICZzdWIpKQorICAgIGdvdG8gb29tOworCisgIF9kYnVzX3N0cmluZ19mcmVlICgmZWxlbWVudF9zaWduYXR1cmUpOworICByZXR1cm4gVFJVRTsKKworIG9vbToKKyAgZGF0YV9ibG9ja19yZXN0b3JlIChibG9jaywgJnNhdmVkKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZlbGVtZW50X3NpZ25hdHVyZSk7CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CithcnJheV9yZWFkX29yX3NldF92YWx1ZSAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhbGlnbl9yb290LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKQoreworICBUZXN0VHlwZU5vZGVDb250YWluZXIgKmNvbnRhaW5lciA9IChUZXN0VHlwZU5vZGVDb250YWluZXIqKSBub2RlOworICBEQnVzVHlwZVJlYWRlciBzdWI7CisgIGludCBpOworICBpbnQgbl9jb3BpZXM7CisgIFRlc3RUeXBlTm9kZSAqY2hpbGQ7CisKKyAgbl9jb3BpZXMgPSBub2RlLT5rbGFzcy0+c3ViY2xhc3NfZGV0YWlsOworCisgIGNoZWNrX2V4cGVjdGVkX3R5cGUgKHJlYWRlciwgREJVU19UWVBFX0FSUkFZKTsKKworICBjaGlsZCA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0ICgmY29udGFpbmVyLT5jaGlsZHJlbik7CisKKyAgaWYgKG5fY29waWVzID4gMCkKKyAgICB7CisgICAgICBfZGJ1c190eXBlX3JlYWRlcl9yZWN1cnNlIChyZWFkZXIsICZzdWIpOworCisgICAgICBpZiAocmVhbGlnbl9yb290ID09IE5VTEwgJiYgYXJyYXlzX3dyaXRlX2ZpeGVkX2luX2Jsb2NrcyAmJgorICAgICAgICAgIGRidXNfdHlwZV9pc19maXhlZCAoX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2VsZW1lbnRfdHlwZSAocmVhZGVyKSkgJiYKKyAgICAgICAgICBjaGlsZC0+a2xhc3MtPnJlYWRfbXVsdGkpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIW5vZGVfcmVhZF9tdWx0aSAoY2hpbGQsICZzdWIsIHNlZWQsIG5fY29waWVzKSkKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgaSA9IDA7CisgICAgICAgICAgd2hpbGUgKGkgPCBuX2NvcGllcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgREJ1c0xpc3QgKmxpbms7CisKKyAgICAgICAgICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZjb250YWluZXItPmNoaWxkcmVuKTsKKyAgICAgICAgICAgICAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBUZXN0VHlwZU5vZGUgKmNoaWxkMiA9IGxpbmstPmRhdGE7CisgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAqbmV4dCA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJmNvbnRhaW5lci0+Y2hpbGRyZW4sIGxpbmspOworCisgICAgICAgICAgICAgICAgICBfZGJ1c19hc3NlcnQgKGNoaWxkMi0+a2xhc3MtPnR5cGVjb2RlID09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX2dldF9lbGVtZW50X3R5cGUgKHJlYWRlcikpOworCisgICAgICAgICAgICAgICAgICBpZiAocmVhbGlnbl9yb290ID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICBpZiAoIW5vZGVfcmVhZF92YWx1ZSAoY2hpbGQyLCAmc3ViLCBzZWVkICsgaSkpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgIGlmICghbm9kZV9zZXRfdmFsdWUgKGNoaWxkMiwgJnN1YiwgcmVhbGlnbl9yb290LCBzZWVkICsgaSkpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgaWYgKGkgPT0gKG5fY29waWVzIC0gMSkgJiYgbmV4dCA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICBORVhUX0VYUEVDVElOR19GQUxTRSAoJnN1Yik7CisgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIE5FWFRfRVhQRUNUSU5HX1RSVUUgKCZzdWIpOworCisgICAgICAgICAgICAgICAgICBsaW5rID0gbmV4dDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgKytpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2FycmF5X3JlYWRfdmFsdWUgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKQoreworICByZXR1cm4gYXJyYXlfcmVhZF9vcl9zZXRfdmFsdWUgKG5vZGUsIHJlYWRlciwgTlVMTCwgc2VlZCk7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYXJyYXlfc2V0X3ZhbHVlIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWxpZ25fcm9vdCwKKyAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpCit7CisgIHJldHVybiBhcnJheV9yZWFkX29yX3NldF92YWx1ZSAobm9kZSwgcmVhZGVyLCByZWFsaWduX3Jvb3QsIHNlZWQpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2FycmF5X2J1aWxkX3NpZ25hdHVyZSAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICpzdHIpCit7CisgIFRlc3RUeXBlTm9kZUNvbnRhaW5lciAqY29udGFpbmVyID0gKFRlc3RUeXBlTm9kZUNvbnRhaW5lciopIG5vZGU7CisgIGludCBvcmlnX2xlbjsKKworICBvcmlnX2xlbiA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChzdHIpOworCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlIChzdHIsIERCVVNfVFlQRV9BUlJBWSkpCisgICAgZ290byBvb207CisKKyAgaWYgKCFub2RlX2J1aWxkX3NpZ25hdHVyZSAoX2RidXNfbGlzdF9nZXRfZmlyc3QgKCZjb250YWluZXItPmNoaWxkcmVuKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyKSkKKyAgICBnb3RvIG9vbTsKKworICByZXR1cm4gVFJVRTsKKworIG9vbToKKyAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKHN0ciwgb3JpZ19sZW4pOworICByZXR1cm4gRkFMU0U7Cit9CisKKyAvKiAxMCBpcyByYW5kb20ganVzdCB0byBhZGQgYW5vdGhlciBzZWVkIHRoYXQgd2UgdXNlIGluIHRoZSBzdWl0ZSAqLworI2RlZmluZSBWQVJJQU5UX1NFRUQgMTAKKworc3RhdGljIGRidXNfYm9vbF90Cit2YXJpYW50X3dyaXRlX3ZhbHVlIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgIERhdGFCbG9jayAgICAgICpibG9jaywKKyAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlV3JpdGVyICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCkKK3sKKyAgVGVzdFR5cGVOb2RlQ29udGFpbmVyICpjb250YWluZXIgPSAoVGVzdFR5cGVOb2RlQ29udGFpbmVyKikgbm9kZTsKKyAgRGF0YUJsb2NrU3RhdGUgc2F2ZWQ7CisgIERCdXNUeXBlV3JpdGVyIHN1YjsKKyAgREJ1c1N0cmluZyBjb250ZW50X3NpZ25hdHVyZTsKKyAgVGVzdFR5cGVOb2RlICpjaGlsZDsKKworICBfZGJ1c19hc3NlcnQgKGNvbnRhaW5lci0+Y2hpbGRyZW4gIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfbGlzdF9sZW5ndGhfaXNfb25lICgmY29udGFpbmVyLT5jaGlsZHJlbikpOworCisgIGNoaWxkID0gX2RidXNfbGlzdF9nZXRfZmlyc3QgKCZjb250YWluZXItPmNoaWxkcmVuKTsKKworICBkYXRhX2Jsb2NrX3NhdmUgKGJsb2NrLCAmc2F2ZWQpOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZjb250ZW50X3NpZ25hdHVyZSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghbm9kZV9idWlsZF9zaWduYXR1cmUgKGNoaWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29udGVudF9zaWduYXR1cmUpKQorICAgIGdvdG8gb29tOworCisgIGlmICghX2RidXNfdHlwZV93cml0ZXJfcmVjdXJzZSAod3JpdGVyLCBEQlVTX1RZUEVfVkFSSUFOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29udGVudF9zaWduYXR1cmUsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN1YikpCisgICAgZ290byBvb207CisKKyAgaWYgKCFub2RlX3dyaXRlX3ZhbHVlIChjaGlsZCwgYmxvY2ssICZzdWIsIHNlZWQgKyBWQVJJQU5UX1NFRUQpKQorICAgIGdvdG8gb29tOworCisgIGlmICghX2RidXNfdHlwZV93cml0ZXJfdW5yZWN1cnNlICh3cml0ZXIsICZzdWIpKQorICAgIGdvdG8gb29tOworCisgIF9kYnVzX3N0cmluZ19mcmVlICgmY29udGVudF9zaWduYXR1cmUpOworICByZXR1cm4gVFJVRTsKKworIG9vbToKKyAgZGF0YV9ibG9ja19yZXN0b3JlIChibG9jaywgJnNhdmVkKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZjb250ZW50X3NpZ25hdHVyZSk7CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90Cit2YXJpYW50X3JlYWRfb3Jfc2V0X3ZhbHVlIChUZXN0VHlwZU5vZGUgICAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhbGlnbl9yb290LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlZWQpCit7CisgIFRlc3RUeXBlTm9kZUNvbnRhaW5lciAqY29udGFpbmVyID0gKFRlc3RUeXBlTm9kZUNvbnRhaW5lciopIG5vZGU7CisgIERCdXNUeXBlUmVhZGVyIHN1YjsKKyAgVGVzdFR5cGVOb2RlICpjaGlsZDsKKworICBfZGJ1c19hc3NlcnQgKGNvbnRhaW5lci0+Y2hpbGRyZW4gIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfbGlzdF9sZW5ndGhfaXNfb25lICgmY29udGFpbmVyLT5jaGlsZHJlbikpOworCisgIGNoaWxkID0gX2RidXNfbGlzdF9nZXRfZmlyc3QgKCZjb250YWluZXItPmNoaWxkcmVuKTsKKworICBjaGVja19leHBlY3RlZF90eXBlIChyZWFkZXIsIERCVVNfVFlQRV9WQVJJQU5UKTsKKworICBfZGJ1c190eXBlX3JlYWRlcl9yZWN1cnNlIChyZWFkZXIsICZzdWIpOworCisgIGlmIChyZWFsaWduX3Jvb3QgPT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoIW5vZGVfcmVhZF92YWx1ZSAoY2hpbGQsICZzdWIsIHNlZWQgKyBWQVJJQU5UX1NFRUQpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKCFub2RlX3NldF92YWx1ZSAoY2hpbGQsICZzdWIsIHJlYWxpZ25fcm9vdCwgc2VlZCArIFZBUklBTlRfU0VFRCkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgTkVYVF9FWFBFQ1RJTkdfRkFMU0UgKCZzdWIpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3ZhcmlhbnRfcmVhZF92YWx1ZSAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKQoreworICByZXR1cm4gdmFyaWFudF9yZWFkX29yX3NldF92YWx1ZSAobm9kZSwgcmVhZGVyLCBOVUxMLCBzZWVkKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90Cit2YXJpYW50X3NldF92YWx1ZSAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhbGlnbl9yb290LAorICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKQoreworICByZXR1cm4gdmFyaWFudF9yZWFkX29yX3NldF92YWx1ZSAobm9kZSwgcmVhZGVyLCByZWFsaWduX3Jvb3QsIHNlZWQpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2RpY3Rfd3JpdGVfdmFsdWUgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgRGF0YUJsb2NrICAgICAgKmJsb2NrLAorICAgICAgICAgICAgICAgICAgREJ1c1R5cGVXcml0ZXIgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZWVkKQoreworICBUZXN0VHlwZU5vZGVDb250YWluZXIgKmNvbnRhaW5lciA9IChUZXN0VHlwZU5vZGVDb250YWluZXIqKSBub2RlOworICBEYXRhQmxvY2tTdGF0ZSBzYXZlZDsKKyAgREJ1c1R5cGVXcml0ZXIgc3ViOworICBEQnVzU3RyaW5nIGVudHJ5X3ZhbHVlX3NpZ25hdHVyZTsKKyAgREJ1c1N0cmluZyBkaWN0X2VudHJ5X3NpZ25hdHVyZTsKKyAgaW50IGk7CisgIGludCBuX2VudHJpZXM7CisgIFRlc3RUeXBlTm9kZSAqY2hpbGQ7CisKKyAgbl9lbnRyaWVzID0gbm9kZS0+a2xhc3MtPnN1YmNsYXNzX2RldGFpbDsKKworICBfZGJ1c19hc3NlcnQgKGNvbnRhaW5lci0+Y2hpbGRyZW4gIT0gTlVMTCk7CisKKyAgZGF0YV9ibG9ja19zYXZlIChibG9jaywgJnNhdmVkKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZW50cnlfdmFsdWVfc2lnbmF0dXJlKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmRpY3RfZW50cnlfc2lnbmF0dXJlKSkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmVudHJ5X3ZhbHVlX3NpZ25hdHVyZSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAKKyAgY2hpbGQgPSBfZGJ1c19saXN0X2dldF9maXJzdCAoJmNvbnRhaW5lci0+Y2hpbGRyZW4pOworCisgIGlmICghbm9kZV9idWlsZF9zaWduYXR1cmUgKGNoaWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZW50cnlfdmFsdWVfc2lnbmF0dXJlKSkKKyAgICBnb3RvIG9vbTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZkaWN0X2VudHJ5X3NpZ25hdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0RJQ1RfRU5UUllfQkVHSU5fQ0hBUl9BU19TVFJJTkcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5UMzJfQVNfU1RSSU5HKSkKKyAgICBnb3RvIG9vbTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5ICgmZW50cnlfdmFsdWVfc2lnbmF0dXJlLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGljdF9lbnRyeV9zaWduYXR1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmZGljdF9lbnRyeV9zaWduYXR1cmUpKSkKKyAgICBnb3RvIG9vbTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfYnl0ZSAoJmRpY3RfZW50cnlfc2lnbmF0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19ESUNUX0VOVFJZX0VORF9DSEFSKSkKKyAgICBnb3RvIG9vbTsKKworICBpZiAoIV9kYnVzX3R5cGVfd3JpdGVyX3JlY3Vyc2UgKHdyaXRlciwgREJVU19UWVBFX0FSUkFZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkaWN0X2VudHJ5X3NpZ25hdHVyZSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3ViKSkKKyAgICBnb3RvIG9vbTsKKworICBpID0gMDsKKyAgd2hpbGUgKGkgPCBuX2VudHJpZXMpCisgICAgeworICAgICAgREJ1c1R5cGVXcml0ZXIgZW50cnlfc3ViOworICAgICAgZGJ1c19pbnQzMl90IGtleTsKKworICAgICAgaWYgKCFfZGJ1c190eXBlX3dyaXRlcl9yZWN1cnNlICgmc3ViLCBEQlVTX1RZUEVfRElDVF9FTlRSWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVudHJ5X3N1YikpCisgICAgICAgIGdvdG8gb29tOworCisgICAgICBrZXkgPSBpbnQzMl9mcm9tX3NlZWQgKHNlZWQgKyBpKTsKKworICAgICAgaWYgKCFfZGJ1c190eXBlX3dyaXRlcl93cml0ZV9iYXNpYyAoJmVudHJ5X3N1YiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXkpKQorICAgICAgICBnb3RvIG9vbTsKKyAgICAgIAorICAgICAgaWYgKCFub2RlX3dyaXRlX3ZhbHVlIChjaGlsZCwgYmxvY2ssICZlbnRyeV9zdWIsIHNlZWQgKyBpKSkKKyAgICAgICAgZ290byBvb207CisKKyAgICAgIGlmICghX2RidXNfdHlwZV93cml0ZXJfdW5yZWN1cnNlICgmc3ViLCAmZW50cnlfc3ViKSkKKyAgICAgICAgZ290byBvb207CisgICAgICAKKyAgICAgICsraTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c190eXBlX3dyaXRlcl91bnJlY3Vyc2UgKHdyaXRlciwgJnN1YikpCisgICAgZ290byBvb207CisgIAorICBfZGJ1c19zdHJpbmdfZnJlZSAoJmVudHJ5X3ZhbHVlX3NpZ25hdHVyZSk7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmZGljdF9lbnRyeV9zaWduYXR1cmUpOworICByZXR1cm4gVFJVRTsKKworIG9vbToKKyAgZGF0YV9ibG9ja19yZXN0b3JlIChibG9jaywgJnNhdmVkKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZlbnRyeV92YWx1ZV9zaWduYXR1cmUpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmRpY3RfZW50cnlfc2lnbmF0dXJlKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2RpY3RfcmVhZF9vcl9zZXRfdmFsdWUgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFsaWduX3Jvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCkKK3sKKyAgVGVzdFR5cGVOb2RlQ29udGFpbmVyICpjb250YWluZXIgPSAoVGVzdFR5cGVOb2RlQ29udGFpbmVyKikgbm9kZTsKKyAgREJ1c1R5cGVSZWFkZXIgc3ViOworICBpbnQgaTsKKyAgaW50IG5fZW50cmllczsKKyAgVGVzdFR5cGVOb2RlICpjaGlsZDsKKworICBuX2VudHJpZXMgPSBub2RlLT5rbGFzcy0+c3ViY2xhc3NfZGV0YWlsOworCisgIGNoZWNrX2V4cGVjdGVkX3R5cGUgKHJlYWRlciwgREJVU19UWVBFX0FSUkFZKTsKKworICBjaGlsZCA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0ICgmY29udGFpbmVyLT5jaGlsZHJlbik7CisKKyAgaWYgKG5fZW50cmllcyA+IDApCisgICAgeworICAgICAgX2RidXNfdHlwZV9yZWFkZXJfcmVjdXJzZSAocmVhZGVyLCAmc3ViKTsKKworICAgICAgY2hlY2tfZXhwZWN0ZWRfdHlwZSAoJnN1YiwgREJVU19UWVBFX0RJQ1RfRU5UUlkpOworICAgICAgCisgICAgICBpID0gMDsKKyAgICAgIHdoaWxlIChpIDwgbl9lbnRyaWVzKQorICAgICAgICB7CisgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgZW50cnlfc3ViOworCisgICAgICAgICAgY2hlY2tfZXhwZWN0ZWRfdHlwZSAoJnN1YiwgREJVU19UWVBFX0RJQ1RfRU5UUlkpOworICAgICAgICAgIAorICAgICAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX3JlY3Vyc2UgKCZzdWIsICZlbnRyeV9zdWIpOworICAgICAgICAgIAorICAgICAgICAgIGlmIChyZWFsaWduX3Jvb3QgPT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c19pbnQzMl90IHY7CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBjaGVja19leHBlY3RlZF90eXBlICgmZW50cnlfc3ViLCBEQlVTX1RZUEVfSU5UMzIpOworCisgICAgICAgICAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX3JlYWRfYmFzaWMgKCZlbnRyeV9zdWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkYnVzX2ludDMyX3QqKSAmdik7CisKKyAgICAgICAgICAgICAgX2RidXNfYXNzZXJ0ICh2ID09IGludDMyX2Zyb21fc2VlZCAoc2VlZCArIGkpKTsKKworICAgICAgICAgICAgICBORVhUX0VYUEVDVElOR19UUlVFICgmZW50cnlfc3ViKTsKKyAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIGlmICghbm9kZV9yZWFkX3ZhbHVlIChjaGlsZCwgJmVudHJ5X3N1Yiwgc2VlZCArIGkpKQorICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgICAgICAgICBORVhUX0VYUEVDVElOR19GQUxTRSAoJmVudHJ5X3N1Yik7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkYnVzX2ludDMyX3QgdjsKKyAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIHYgPSBpbnQzMl9mcm9tX3NlZWQgKHNlZWQgKyBpKTsKKyAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIGlmICghX2RidXNfdHlwZV9yZWFkZXJfc2V0X2Jhc2ljICgmZW50cnlfc3ViLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFsaWduX3Jvb3QpKQorICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgICAgICAgICBORVhUX0VYUEVDVElOR19UUlVFICgmZW50cnlfc3ViKTsKKyAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIGlmICghbm9kZV9zZXRfdmFsdWUgKGNoaWxkLCAmZW50cnlfc3ViLCByZWFsaWduX3Jvb3QsIHNlZWQgKyBpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgICAgICAgICAgTkVYVF9FWFBFQ1RJTkdfRkFMU0UgKCZlbnRyeV9zdWIpOworICAgICAgICAgICAgfQorICAgICAgICAgIAorICAgICAgICAgIGlmIChpID09IChuX2VudHJpZXMgLSAxKSkKKyAgICAgICAgICAgIE5FWFRfRVhQRUNUSU5HX0ZBTFNFICgmc3ViKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBORVhUX0VYUEVDVElOR19UUlVFICgmc3ViKTsKKworICAgICAgICAgICsraTsKKyAgICAgICAgfQorICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitkaWN0X3JlYWRfdmFsdWUgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCkKK3sKKyAgcmV0dXJuIGRpY3RfcmVhZF9vcl9zZXRfdmFsdWUgKG5vZGUsIHJlYWRlciwgTlVMTCwgc2VlZCk7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZGljdF9zZXRfdmFsdWUgKFRlc3RUeXBlTm9kZSAgICpub2RlLAorICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWxpZ25fcm9vdCwKKyAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VlZCkKK3sKKyAgcmV0dXJuIGRpY3RfcmVhZF9vcl9zZXRfdmFsdWUgKG5vZGUsIHJlYWRlciwgcmVhbGlnbl9yb290LCBzZWVkKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitkaWN0X2J1aWxkX3NpZ25hdHVyZSAoVGVzdFR5cGVOb2RlICAgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgKnN0cikKK3sKKyAgVGVzdFR5cGVOb2RlQ29udGFpbmVyICpjb250YWluZXIgPSAoVGVzdFR5cGVOb2RlQ29udGFpbmVyKikgbm9kZTsKKyAgaW50IG9yaWdfbGVuOworCisgIG9yaWdfbGVuID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHN0cik7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX2J5dGUgKHN0ciwgREJVU19UWVBFX0FSUkFZKSkKKyAgICBnb3RvIG9vbTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKHN0ciwgREJVU19ESUNUX0VOVFJZX0JFR0lOX0NIQVJfQVNfU1RSSU5HIERCVVNfVFlQRV9JTlQzMl9BU19TVFJJTkcpKQorICAgIGdvdG8gb29tOworICAKKyAgaWYgKCFub2RlX2J1aWxkX3NpZ25hdHVyZSAoX2RidXNfbGlzdF9nZXRfZmlyc3QgKCZjb250YWluZXItPmNoaWxkcmVuKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyKSkKKyAgICBnb3RvIG9vbTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfYnl0ZSAoc3RyLCBEQlVTX0RJQ1RfRU5UUllfRU5EX0NIQVIpKQorICAgIGdvdG8gb29tOworCisgIHJldHVybiBUUlVFOworCisgb29tOgorICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoc3RyLCBvcmlnX2xlbik7CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIHZvaWQKK2NvbnRhaW5lcl9kZXN0cm95IChUZXN0VHlwZU5vZGUgKm5vZGUpCit7CisgIFRlc3RUeXBlTm9kZUNvbnRhaW5lciAqY29udGFpbmVyID0gKFRlc3RUeXBlTm9kZUNvbnRhaW5lciopIG5vZGU7CisgIERCdXNMaXN0ICpsaW5rOworCisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmY29udGFpbmVyLT5jaGlsZHJlbik7CisgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgeworICAgICAgVGVzdFR5cGVOb2RlICpjaGlsZCA9IGxpbmstPmRhdGE7CisgICAgICBEQnVzTGlzdCAqbmV4dCA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJmNvbnRhaW5lci0+Y2hpbGRyZW4sIGxpbmspOworCisgICAgICBub2RlX2Rlc3Ryb3kgKGNoaWxkKTsKKworICAgICAgX2RidXNfbGlzdF9mcmVlX2xpbmsgKGxpbmspOworCisgICAgICBsaW5rID0gbmV4dDsKKyAgICB9Cit9CisKKyNlbmRpZiAvKiAhRE9YWUdFTl9TSE9VTERfU0tJUF9USElTICovCisKKyNlbmRpZiAvKiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUyAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLW1hcnNoYWwtcmVjdXJzaXZlLmMgYi9kYnVzL2RidXMtbWFyc2hhbC1yZWN1cnNpdmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTcwNjhjCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLW1hcnNoYWwtcmVjdXJzaXZlLmMKQEAgLTAsMCArMSwyNzU2IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtbWFyc2hhbC1yZWN1cnNpdmUuYyAgTWFyc2hhbGxpbmcgcm91dGluZXMgZm9yIHJlY3Vyc2l2ZSB0eXBlcworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNSBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiZGJ1cy1tYXJzaGFsLXJlY3Vyc2l2ZS5oIgorI2luY2x1ZGUgImRidXMtbWFyc2hhbC1iYXNpYy5oIgorI2luY2x1ZGUgImRidXMtc2lnbmF0dXJlLmgiCisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzTWFyc2hhbAorICogQHsKKyAqLworCitzdGF0aWMgZGJ1c19ib29sX3QgX2RidXNfdHlwZV9yZWFkZXJfZ3JlYXRlcl90aGFuICAgICAgICAgICAgICAoY29uc3QgREJ1c1R5cGVSZWFkZXIgICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1R5cGVSZWFkZXIgICpyaHMpOworCitzdGF0aWMgdm9pZCAgICAgICBfZGJ1c190eXBlX3dyaXRlcl9zZXRfZW5hYmxlZCAgICAgICAgICAgKERCdXNUeXBlV3JpdGVyICAgICAgICAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICAgICAgIGVuYWJsZWQpOworc3RhdGljIGRidXNfYm9vbF90IF9kYnVzX3R5cGVfd3JpdGVyX3dyaXRlX3JlYWRlcl9wYXJ0aWFsIChEQnVzVHlwZVdyaXRlciAgICAgICAgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgICAgICAgICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNUeXBlUmVhZGVyICAqc3RhcnRfYWZ0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgc3RhcnRfYWZ0ZXJfbmV3X3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICBzdGFydF9hZnRlcl9uZXdfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAgICAgICAgICAgICAqKmZpeHVwcyk7CisKKy8qKiB0dXJuIHRoaXMgb24gdG8gZ2V0IGRlbHVnZWQgaW4gVHlwZVJlYWRlciB2ZXJib3NlIHNwYW0gKi8KKyNkZWZpbmUgUkVDVVJTSVZFX01BUlNIQUxfUkVBRF9UUkFDRSAgMAorCisvKiogdHVybiB0aGlzIG9uIHRvIGdldCBkZWx1Z2VkIGluIFR5cGVXcml0ZXIgdmVyYm9zZSBzcGFtICovCisjZGVmaW5lIFJFQ1VSU0lWRV9NQVJTSEFMX1dSSVRFX1RSQUNFIDAKKworc3RhdGljIHZvaWQKK2ZyZWVfZml4dXBzIChEQnVzTGlzdCAqKmZpeHVwcykKK3sKKyAgREJ1c0xpc3QgKmxpbms7CisKKyAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKGZpeHVwcyk7CisgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgeworICAgICAgREJ1c0xpc3QgKm5leHQ7CisKKyAgICAgIG5leHQgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKGZpeHVwcywgbGluayk7CisKKyAgICAgIGRidXNfZnJlZSAobGluay0+ZGF0YSk7CisgICAgICBfZGJ1c19saXN0X2ZyZWVfbGluayAobGluayk7CisKKyAgICAgIGxpbmsgPSBuZXh0OworICAgIH0KKworICAqZml4dXBzID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK2FwcGx5X2FuZF9mcmVlX2ZpeHVwcyAoREJ1c0xpc3QgICAgICAqKmZpeHVwcywKKyAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnJlYWRlcikKK3sKKyAgREJ1c0xpc3QgKmxpbms7CisKKyNpZiBSRUNVUlNJVkVfTUFSU0hBTF9XUklURV9UUkFDRQorICBpZiAoKmZpeHVwcykKKyAgICBfZGJ1c192ZXJib3NlICgiICVkIEZJWFVQUyB0byBhcHBseVxuIiwKKyAgICAgICAgICAgICAgICAgICBfZGJ1c19saXN0X2dldF9sZW5ndGggKGZpeHVwcykpOworI2VuZGlmCisKKyAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKGZpeHVwcyk7CisgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgeworICAgICAgREJ1c0xpc3QgKm5leHQ7CisKKyAgICAgIG5leHQgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKGZpeHVwcywgbGluayk7CisKKyAgICAgIGlmIChyZWFkZXIpCisgICAgICAgIHsKKyAgICAgICAgICBEQnVzQXJyYXlMZW5GaXh1cCAqZjsKKworICAgICAgICAgIGYgPSBsaW5rLT5kYXRhOworCisjaWYgUkVDVVJTSVZFX01BUlNIQUxfV1JJVEVfVFJBQ0UKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiIGFwcGx5aW5nIEZJWFVQIHRvIHJlYWRlciAlcCBhdCBwb3MgJWQgbmV3X2xlbiA9ICVkIG9sZCBsZW4gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLCBmLT5sZW5fcG9zX2luX3JlYWRlciwgZi0+bmV3X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19tYXJzaGFsX3JlYWRfdWludDMyIChyZWFkZXItPnZhbHVlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLT5sZW5fcG9zX2luX3JlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXItPmJ5dGVfb3JkZXIsIE5VTEwpKTsKKyNlbmRpZgorCisgICAgICAgICAgX2RidXNfbWFyc2hhbF9zZXRfdWludDMyICgoREJ1c1N0cmluZyopIHJlYWRlci0+dmFsdWVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi0+bGVuX3Bvc19pbl9yZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLT5uZXdfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLT5ieXRlX29yZGVyKTsKKyAgICAgICAgfQorCisgICAgICBkYnVzX2ZyZWUgKGxpbmstPmRhdGEpOworICAgICAgX2RidXNfbGlzdF9mcmVlX2xpbmsgKGxpbmspOworCisgICAgICBsaW5rID0gbmV4dDsKKyAgICB9CisKKyAgKmZpeHVwcyA9IE5VTEw7Cit9CisKKy8qKgorICogVmlydHVhbCB0YWJsZSBmb3IgYSB0eXBlIHJlYWRlci4KKyAqLworc3RydWN0IERCdXNUeXBlUmVhZGVyQ2xhc3MKK3sKKyAgY29uc3QgY2hhciAqbmFtZTsgICAgICAgLyoqPCBuYW1lIGZvciBkZWJ1Z2dpbmcgKi8KKyAgaW50ICAgICAgICAgaWQ7ICAgICAgICAgLyoqPCBpbmRleCBpbiBhbGxfcmVhZGVyX2NsYXNzZXMgKi8KKyAgZGJ1c19ib29sX3QgdHlwZXNfb25seTsgLyoqPCBvbmx5IGl0ZXJhdGVzIG92ZXIgdHlwZXMsIG5vdCB2YWx1ZXMgKi8KKyAgdm9pZCAgICAgICAgKCogcmVjdXJzZSkgICAgICAgICAgKERCdXNUeXBlUmVhZGVyICAgICAgICAqc3ViLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgICAgICAgICpwYXJlbnQpOyAvKio8IHJlY3Vyc2Ugd2l0aCB0aGlzIHJlYWRlciBhcyBzdWIgKi8KKyAgZGJ1c19ib29sX3QgKCogY2hlY2tfZmluaXNoZWQpICAgKGNvbnN0IERCdXNUeXBlUmVhZGVyICAqcmVhZGVyKTsgLyoqPCBjaGVjayB3aGV0aGVyIHJlYWRlciBpcyBhdCB0aGUgZW5kICovCisgIHZvaWQgICAgICAgICgqIG5leHQpICAgICAgICAgICAgIChEQnVzVHlwZVJlYWRlciAgICAgICAgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgY3VycmVudF90eXBlKTsgLyoqPCBnbyB0byB0aGUgbmV4dCB2YWx1ZSAqLworfTsKKworc3RhdGljIGludAorZWxlbWVudF90eXBlX2dldF9hbGlnbm1lbnQgKGNvbnN0IERCdXNTdHJpbmcgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBwb3MpCit7CisgIHJldHVybiBfZGJ1c190eXBlX2dldF9hbGlnbm1lbnQgKF9kYnVzX2ZpcnN0X3R5cGVfaW5fc2lnbmF0dXJlIChzdHIsIHBvcykpOworfQorCitzdGF0aWMgdm9pZAorcmVhZGVyX2luaXQgKERCdXNUeXBlUmVhZGVyICAgICpyZWFkZXIsCisgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAgKnR5cGVfc3RyLAorICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICB0eXBlX3BvcywKKyAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICAqdmFsdWVfc3RyLAorICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICB2YWx1ZV9wb3MpCit7CisgIF9EQlVTX1pFUk8gKCpyZWFkZXIpOworICByZWFkZXItPmJ5dGVfb3JkZXIgPSBieXRlX29yZGVyOworICByZWFkZXItPmZpbmlzaGVkID0gRkFMU0U7CisgIHJlYWRlci0+dHlwZV9zdHIgPSB0eXBlX3N0cjsKKyAgcmVhZGVyLT50eXBlX3BvcyA9IHR5cGVfcG9zOworICByZWFkZXItPnZhbHVlX3N0ciA9IHZhbHVlX3N0cjsKKyAgcmVhZGVyLT52YWx1ZV9wb3MgPSB2YWx1ZV9wb3M7Cit9CisKK3N0YXRpYyB2b2lkCitiYXNlX3JlYWRlcl9yZWN1cnNlIChEQnVzVHlwZVJlYWRlciAqc3ViLAorICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnBhcmVudCkKK3sKKyAgLyogcG9pbnQgc3VicmVhZGVyIGF0IHRoZSBzYW1lIHBsYWNlIGFzIHBhcmVudCAqLworICByZWFkZXJfaW5pdCAoc3ViLAorICAgICAgICAgICAgICAgcGFyZW50LT5ieXRlX29yZGVyLAorICAgICAgICAgICAgICAgcGFyZW50LT50eXBlX3N0ciwKKyAgICAgICAgICAgICAgIHBhcmVudC0+dHlwZV9wb3MsCisgICAgICAgICAgICAgICBwYXJlbnQtPnZhbHVlX3N0ciwKKyAgICAgICAgICAgICAgIHBhcmVudC0+dmFsdWVfcG9zKTsKK30KKworc3RhdGljIHZvaWQKK3N0cnVjdF9vcl9kaWN0X2VudHJ5X3R5cGVzX29ubHlfcmVhZGVyX3JlY3Vyc2UgKERCdXNUeXBlUmVhZGVyICpzdWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAqcGFyZW50KQoreworICBiYXNlX3JlYWRlcl9yZWN1cnNlIChzdWIsIHBhcmVudCk7CisgIAorICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoc3ViLT50eXBlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Yi0+dHlwZV9wb3MpID09IERCVVNfU1RSVUNUX0JFR0lOX0NIQVIgfHwKKyAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKHN1Yi0+dHlwZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWItPnR5cGVfcG9zKSA9PSBEQlVTX0RJQ1RfRU5UUllfQkVHSU5fQ0hBUik7CisKKyAgc3ViLT50eXBlX3BvcyArPSAxOworfQorCitzdGF0aWMgdm9pZAorc3RydWN0X29yX2RpY3RfZW50cnlfcmVhZGVyX3JlY3Vyc2UgKERCdXNUeXBlUmVhZGVyICpzdWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnBhcmVudCkKK3sKKyAgc3RydWN0X29yX2RpY3RfZW50cnlfdHlwZXNfb25seV9yZWFkZXJfcmVjdXJzZSAoc3ViLCBwYXJlbnQpOworCisgIC8qIHN0cnVjdCBhbmQgZGljdCBlbnRyeSBoYXZlIDggYnl0ZSBhbGlnbm1lbnQgKi8KKyAgc3ViLT52YWx1ZV9wb3MgPSBfREJVU19BTElHTl9WQUxVRSAoc3ViLT52YWx1ZV9wb3MsIDgpOworfQorCitzdGF0aWMgdm9pZAorYXJyYXlfdHlwZXNfb25seV9yZWFkZXJfcmVjdXJzZSAoREJ1c1R5cGVSZWFkZXIgKnN1YiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpwYXJlbnQpCit7CisgIGJhc2VfcmVhZGVyX3JlY3Vyc2UgKHN1YiwgcGFyZW50KTsKKworICAvKiBwb2ludCB0eXBlX3BvcyBhdCB0aGUgYXJyYXkgZWxlbWVudCB0eXBlICovCisgIHN1Yi0+dHlwZV9wb3MgKz0gMTsKKworICAvKiBJbml0IHdpdGggdmFsdWVzIGxpa2VseSB0byBjcmFzaCB0aGluZ3MgaWYgbWlzdXNlZCAqLworICBzdWItPnUuYXJyYXkuc3RhcnRfcG9zID0gX0RCVVNfSU5UX01BWDsKKyAgc3ViLT5hcnJheV9sZW5fb2Zmc2V0ID0gNzsKK30KKworLyoqIGNvbXB1dGUgcG9zaXRpb24gb2YgYXJyYXkgbGVuZ3RoIGdpdmVuIGFycmF5X2xlbl9vZmZzZXQsIHdoaWNoIGlzCisgICAgdGhlIG9mZnNldCBiYWNrIGZyb20gc3RhcnRfcG9zIHRvIGVuZCBvZiB0aGUgbGVuICovCisjZGVmaW5lIEFSUkFZX1JFQURFUl9MRU5fUE9TKHJlYWRlcikgXAorICAoKHJlYWRlciktPnUuYXJyYXkuc3RhcnRfcG9zIC0gKChpbnQpKHJlYWRlciktPmFycmF5X2xlbl9vZmZzZXQpIC0gNCkKKworc3RhdGljIGludAorYXJyYXlfcmVhZGVyX2dldF9hcnJheV9sZW4gKGNvbnN0IERCdXNUeXBlUmVhZGVyICpyZWFkZXIpCit7CisgIGRidXNfdWludDMyX3QgYXJyYXlfbGVuOworICBpbnQgbGVuX3BvczsKKworICBsZW5fcG9zID0gQVJSQVlfUkVBREVSX0xFTl9QT1MgKHJlYWRlcik7CisKKyAgX2RidXNfYXNzZXJ0IChfREJVU19BTElHTl9WQUxVRSAobGVuX3BvcywgNCkgPT0gKHVuc2lnbmVkKSBsZW5fcG9zKTsKKyAgYXJyYXlfbGVuID0gX2RidXNfdW5wYWNrX3VpbnQzMiAocmVhZGVyLT5ieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X3VkYXRhX2xlbiAocmVhZGVyLT52YWx1ZV9zdHIsIGxlbl9wb3MsIDQpKTsKKworI2lmIFJFQ1VSU0lWRV9NQVJTSEFMX1JFQURfVFJBQ0UKKyAgX2RidXNfdmVyYm9zZSAoIiAgIHJlYWRlciAlcCBsZW5fcG9zICVkIGFycmF5IGxlbiAldSBsZW5fb2Zmc2V0ICVkXG4iLAorICAgICAgICAgICAgICAgICByZWFkZXIsIGxlbl9wb3MsIGFycmF5X2xlbiwgcmVhZGVyLT5hcnJheV9sZW5fb2Zmc2V0KTsKKyNlbmRpZgorCisgIF9kYnVzX2Fzc2VydCAocmVhZGVyLT51LmFycmF5LnN0YXJ0X3BvcyAtIGxlbl9wb3MgLSA0IDwgOCk7CisKKyAgcmV0dXJuIGFycmF5X2xlbjsKK30KKworc3RhdGljIHZvaWQKK2FycmF5X3JlYWRlcl9yZWN1cnNlIChEQnVzVHlwZVJlYWRlciAqc3ViLAorICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICpwYXJlbnQpCit7CisgIGludCBhbGlnbm1lbnQ7CisgIGludCBsZW5fcG9zOworCisgIGFycmF5X3R5cGVzX29ubHlfcmVhZGVyX3JlY3Vyc2UgKHN1YiwgcGFyZW50KTsKKworICBzdWItPnZhbHVlX3BvcyA9IF9EQlVTX0FMSUdOX1ZBTFVFIChzdWItPnZhbHVlX3BvcywgNCk7CisKKyAgbGVuX3BvcyA9IHN1Yi0+dmFsdWVfcG9zOworCisgIHN1Yi0+dmFsdWVfcG9zICs9IDQ7IC8qIGZvciB0aGUgbGVuZ3RoICovCisKKyAgYWxpZ25tZW50ID0gZWxlbWVudF90eXBlX2dldF9hbGlnbm1lbnQgKHN1Yi0+dHlwZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWItPnR5cGVfcG9zKTsKKworICBzdWItPnZhbHVlX3BvcyA9IF9EQlVTX0FMSUdOX1ZBTFVFIChzdWItPnZhbHVlX3BvcywgYWxpZ25tZW50KTsKKworICBzdWItPnUuYXJyYXkuc3RhcnRfcG9zID0gc3ViLT52YWx1ZV9wb3M7CisgIF9kYnVzX2Fzc2VydCAoKHN1Yi0+dS5hcnJheS5zdGFydF9wb3MgLSAobGVuX3BvcyArIDQpKSA8IDgpOyAvKiBvbmx5IDMgYml0cyBpbiBhcnJheV9sZW5fb2Zmc2V0ICovCisgIHN1Yi0+YXJyYXlfbGVuX29mZnNldCA9IHN1Yi0+dS5hcnJheS5zdGFydF9wb3MgLSAobGVuX3BvcyArIDQpOworCisjaWYgUkVDVVJTSVZFX01BUlNIQUxfUkVBRF9UUkFDRQorICBfZGJ1c192ZXJib3NlICgiICAgIHR5cGUgcmVhZGVyICVwIGFycmF5IHN0YXJ0ID0gJWQgbGVuX29mZnNldCA9ICVkIGFycmF5IGxlbiA9ICVkIGFycmF5IGVsZW1lbnQgdHlwZSA9ICVzXG4iLAorICAgICAgICAgICAgICAgICBzdWIsCisgICAgICAgICAgICAgICAgIHN1Yi0+dS5hcnJheS5zdGFydF9wb3MsCisgICAgICAgICAgICAgICAgIHN1Yi0+YXJyYXlfbGVuX29mZnNldCwKKyAgICAgICAgICAgICAgICAgYXJyYXlfcmVhZGVyX2dldF9hcnJheV9sZW4gKHN1YiksCisgICAgICAgICAgICAgICAgIF9kYnVzX3R5cGVfdG9fc3RyaW5nIChfZGJ1c19maXJzdF90eXBlX2luX3NpZ25hdHVyZSAoc3ViLT50eXBlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWItPnR5cGVfcG9zKSkpOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkCit2YXJpYW50X3JlYWRlcl9yZWN1cnNlIChEQnVzVHlwZVJlYWRlciAqc3ViLAorICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnBhcmVudCkKK3sKKyAgaW50IHNpZ19sZW47CisgIGludCBjb250YWluZWRfYWxpZ25tZW50OworCisgIGJhc2VfcmVhZGVyX3JlY3Vyc2UgKHN1YiwgcGFyZW50KTsKKworICAvKiBWYXJpYW50IGlzIDEgYnl0ZSBzaWcgbGVuZ3RoICh3aXRob3V0IG51bCksIHNpZ25hdHVyZSB3aXRoIG51bCwKKyAgICogcGFkZGluZyB0byA4LWJvdW5kYXJ5LCB0aGVuIHZhbHVlcworICAgKi8KKworICBzaWdfbGVuID0gX2RidXNfc3RyaW5nX2dldF9ieXRlIChzdWItPnZhbHVlX3N0ciwgc3ViLT52YWx1ZV9wb3MpOworCisgIHN1Yi0+dHlwZV9zdHIgPSBzdWItPnZhbHVlX3N0cjsKKyAgc3ViLT50eXBlX3BvcyA9IHN1Yi0+dmFsdWVfcG9zICsgMTsKKworICBzdWItPnZhbHVlX3BvcyA9IHN1Yi0+dHlwZV9wb3MgKyBzaWdfbGVuICsgMTsKKworICBjb250YWluZWRfYWxpZ25tZW50ID0gX2RidXNfdHlwZV9nZXRfYWxpZ25tZW50IChfZGJ1c19maXJzdF90eXBlX2luX3NpZ25hdHVyZSAoc3ViLT50eXBlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Yi0+dHlwZV9wb3MpKTsKKyAgCisgIHN1Yi0+dmFsdWVfcG9zID0gX0RCVVNfQUxJR05fVkFMVUUgKHN1Yi0+dmFsdWVfcG9zLCBjb250YWluZWRfYWxpZ25tZW50KTsKKworI2lmIFJFQ1VSU0lWRV9NQVJTSEFMX1JFQURfVFJBQ0UKKyAgX2RidXNfdmVyYm9zZSAoIiAgICB0eXBlIHJlYWRlciAlcCB2YXJpYW50IGNvbnRhaW5pbmcgJyVzJ1xuIiwKKyAgICAgICAgICAgICAgICAgc3ViLAorICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuIChzdWItPnR5cGVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWItPnR5cGVfcG9zLCAwKSk7CisjZW5kaWYKK30KKworc3RhdGljIGRidXNfYm9vbF90CithcnJheV9yZWFkZXJfY2hlY2tfZmluaXNoZWQgKGNvbnN0IERCdXNUeXBlUmVhZGVyICpyZWFkZXIpCit7CisgIGludCBlbmRfcG9zOworCisgIC8qIHJldHVybiB0aGUgYXJyYXkgZWxlbWVudCB0eXBlIGlmIGVsZW1lbnRzIHJlbWFpbiwgYW5kCisgICAqIFRZUEVfSU5WQUxJRCBvdGhlcndpc2UKKyAgICovCisKKyAgZW5kX3BvcyA9IHJlYWRlci0+dS5hcnJheS5zdGFydF9wb3MgKyBhcnJheV9yZWFkZXJfZ2V0X2FycmF5X2xlbiAocmVhZGVyKTsKKworICBfZGJ1c19hc3NlcnQgKHJlYWRlci0+dmFsdWVfcG9zIDw9IGVuZF9wb3MpOworICBfZGJ1c19hc3NlcnQgKHJlYWRlci0+dmFsdWVfcG9zID49IHJlYWRlci0+dS5hcnJheS5zdGFydF9wb3MpOworCisgIHJldHVybiByZWFkZXItPnZhbHVlX3BvcyA9PSBlbmRfcG9zOworfQorCitzdGF0aWMgdm9pZAorc2tpcF9vbmVfY29tcGxldGVfdHlwZSAoY29uc3QgREJ1c1N0cmluZyAqdHlwZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICp0eXBlX3BvcykKK3sKKyAgX2RidXNfdHlwZV9zaWduYXR1cmVfbmV4dCAoX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICh0eXBlX3N0ciksCisJCQkgICAgIHR5cGVfcG9zKTsKK30KKworLyoqCisgKiBTa2lwcyB0byB0aGUgbmV4dCAiY29tcGxldGUiIHR5cGUgaW5zaWRlIGEgdHlwZSBzaWduYXR1cmUuCisgKiBUaGUgc2lnbmF0dXJlIGlzIHJlYWQgc3RhcnRpbmcgYXQgdHlwZV9wb3MsIGFuZCB0aGUgbmV4dAorICogdHlwZSBwb3NpdGlvbiBpcyBzdG9yZWQgaW4gdGhlIHNhbWUgdmFyaWFibGUuCisgKgorICogQHBhcmFtIHR5cGVfc3RyIGEgdHlwZSBzaWduYXR1cmUgKG11c3QgYmUgdmFsaWQpCisgKiBAcGFyYW0gdHlwZV9wb3MgYW4gaW50ZWdlciBwb3NpdGlvbiBpbiB0aGUgdHlwZSBzaWduYXR1cmUgKGluIGFuZCBvdXQpCisgKi8KK3ZvaWQKK19kYnVzX3R5cGVfc2lnbmF0dXJlX25leHQgKGNvbnN0IGNoYXIgICAgICAgKnR5cGVfc3RyLAorCQkJICAgaW50ICAgICAgICAgICAgICAqdHlwZV9wb3MpCit7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnA7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnN0YXJ0OworCisgIF9kYnVzX2Fzc2VydCAodHlwZV9zdHIgIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAodHlwZV9wb3MgIT0gTlVMTCk7CisgIAorICBzdGFydCA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopdHlwZV9zdHI7CisgIHAgPSBzdGFydCArICp0eXBlX3BvczsKKworICBfZGJ1c19hc3NlcnQgKCpwICE9IERCVVNfU1RSVUNUX0VORF9DSEFSKTsKKyAgX2RidXNfYXNzZXJ0ICgqcCAhPSBEQlVTX0RJQ1RfRU5UUllfRU5EX0NIQVIpOworICAKKyAgd2hpbGUgKCpwID09IERCVVNfVFlQRV9BUlJBWSkKKyAgICArK3A7CisKKyAgX2RidXNfYXNzZXJ0ICgqcCAhPSBEQlVTX1NUUlVDVF9FTkRfQ0hBUik7CisgIF9kYnVzX2Fzc2VydCAoKnAgIT0gREJVU19ESUNUX0VOVFJZX0VORF9DSEFSKTsKKyAgCisgIGlmICgqcCA9PSBEQlVTX1NUUlVDVF9CRUdJTl9DSEFSKQorICAgIHsKKyAgICAgIGludCBkZXB0aDsKKworICAgICAgZGVwdGggPSAxOworCisgICAgICB3aGlsZSAoVFJVRSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX2Fzc2VydCAoKnAgIT0gREJVU19UWVBFX0lOVkFMSUQpOworCisgICAgICAgICAgKytwOworCisgICAgICAgICAgX2RidXNfYXNzZXJ0ICgqcCAhPSBEQlVTX1RZUEVfSU5WQUxJRCk7CisKKyAgICAgICAgICBpZiAoKnAgPT0gREJVU19TVFJVQ1RfQkVHSU5fQ0hBUikKKyAgICAgICAgICAgIGRlcHRoICs9IDE7CisgICAgICAgICAgZWxzZSBpZiAoKnAgPT0gREJVU19TVFJVQ1RfRU5EX0NIQVIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRlcHRoIC09IDE7CisgICAgICAgICAgICAgIGlmIChkZXB0aCA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICsrcDsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgZWxzZSBpZiAoKnAgPT0gREJVU19ESUNUX0VOVFJZX0JFR0lOX0NIQVIpCisgICAgeworICAgICAgaW50IGRlcHRoOworCisgICAgICBkZXB0aCA9IDE7CisKKyAgICAgIHdoaWxlIChUUlVFKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfYXNzZXJ0ICgqcCAhPSBEQlVTX1RZUEVfSU5WQUxJRCk7CisKKyAgICAgICAgICArK3A7CisKKyAgICAgICAgICBfZGJ1c19hc3NlcnQgKCpwICE9IERCVVNfVFlQRV9JTlZBTElEKTsKKworICAgICAgICAgIGlmICgqcCA9PSBEQlVTX0RJQ1RfRU5UUllfQkVHSU5fQ0hBUikKKyAgICAgICAgICAgIGRlcHRoICs9IDE7CisgICAgICAgICAgZWxzZSBpZiAoKnAgPT0gREJVU19ESUNUX0VOVFJZX0VORF9DSEFSKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkZXB0aCAtPSAxOworICAgICAgICAgICAgICBpZiAoZGVwdGggPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICArK3A7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICArK3A7CisgICAgfQorCisgICp0eXBlX3BvcyA9IChpbnQpIChwIC0gc3RhcnQpOworfQorCitzdGF0aWMgaW50CitmaW5kX2xlbl9vZl9jb21wbGV0ZV90eXBlIChjb25zdCBEQnVzU3RyaW5nICp0eXBlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHR5cGVfcG9zKQoreworICBpbnQgZW5kOworCisgIGVuZCA9IHR5cGVfcG9zOworCisgIHNraXBfb25lX2NvbXBsZXRlX3R5cGUgKHR5cGVfc3RyLCAmZW5kKTsKKworICByZXR1cm4gZW5kIC0gdHlwZV9wb3M7Cit9CisKK3N0YXRpYyB2b2lkCitiYXNlX3JlYWRlcl9uZXh0IChEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGN1cnJlbnRfdHlwZSkKK3sKKyAgc3dpdGNoIChjdXJyZW50X3R5cGUpCisgICAgeworICAgIGNhc2UgREJVU19UWVBFX0RJQ1RfRU5UUlk6CisgICAgY2FzZSBEQlVTX1RZUEVfU1RSVUNUOgorICAgIGNhc2UgREJVU19UWVBFX1ZBUklBTlQ6CisgICAgICAvKiBTY2FuIGZvcndhcmQgb3ZlciB0aGUgZW50aXJlIGNvbnRhaW5lciBjb250ZW50cyAqLworICAgICAgeworICAgICAgICBEQnVzVHlwZVJlYWRlciBzdWI7CisKKyAgICAgICAgaWYgKHJlYWRlci0+a2xhc3MtPnR5cGVzX29ubHkgJiYgY3VycmVudF90eXBlID09IERCVVNfVFlQRV9WQVJJQU5UKQorICAgICAgICAgIDsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFJlY3Vyc2UgaW50byB0aGUgc3RydWN0IG9yIHZhcmlhbnQgKi8KKyAgICAgICAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX3JlY3Vyc2UgKHJlYWRlciwgJnN1Yik7CisKKyAgICAgICAgICAgIC8qIFNraXAgZXZlcnl0aGluZyBpbiB0aGlzIHN1YnJlYWRlciAqLworICAgICAgICAgICAgd2hpbGUgKF9kYnVzX3R5cGVfcmVhZGVyX25leHQgKCZzdWIpKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogbm90aGluZyAqLzsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgaWYgKCFyZWFkZXItPmtsYXNzLT50eXBlc19vbmx5KQorICAgICAgICAgIHJlYWRlci0+dmFsdWVfcG9zID0gc3ViLnZhbHVlX3BvczsKKworICAgICAgICAvKiBOb3cgd2UgYXJlIGF0IHRoZSBlbmQgb2YgdGhpcyBjb250YWluZXI7IGZvciB2YXJpYW50cywgdGhlCisgICAgICAgICAqIHN1YnJlYWRlcidzIHR5cGVfcG9zIGlzIHRvdGFsbHkgaW5hcHBsaWNhYmxlIChpdCdzIGluIHRoZQorICAgICAgICAgKiB2YWx1ZSBzdHJpbmcpIGJ1dCB3ZSBrbm93IHRoYXQgd2UgaW5jcmVtZW50IGJ5IG9uZSBwYXN0IHRoZQorICAgICAgICAgKiBEQlVTX1RZUEVfVkFSSUFOVAorICAgICAgICAgKi8KKyAgICAgICAgaWYgKGN1cnJlbnRfdHlwZSA9PSBEQlVTX1RZUEVfVkFSSUFOVCkKKyAgICAgICAgICByZWFkZXItPnR5cGVfcG9zICs9IDE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICByZWFkZXItPnR5cGVfcG9zID0gc3ViLnR5cGVfcG9zOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERCVVNfVFlQRV9BUlJBWToKKyAgICAgIHsKKyAgICAgICAgaWYgKCFyZWFkZXItPmtsYXNzLT50eXBlc19vbmx5KQorICAgICAgICAgIF9kYnVzX21hcnNoYWxfc2tpcF9hcnJheSAocmVhZGVyLT52YWx1ZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19maXJzdF90eXBlX2luX3NpZ25hdHVyZSAocmVhZGVyLT50eXBlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXItPnR5cGVfcG9zICsgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXItPmJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVhZGVyLT52YWx1ZV9wb3MpOworCisgICAgICAgIHNraXBfb25lX2NvbXBsZXRlX3R5cGUgKHJlYWRlci0+dHlwZV9zdHIsICZyZWFkZXItPnR5cGVfcG9zKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIGlmICghcmVhZGVyLT5rbGFzcy0+dHlwZXNfb25seSkKKyAgICAgICAgX2RidXNfbWFyc2hhbF9za2lwX2Jhc2ljIChyZWFkZXItPnZhbHVlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X3R5cGUsIHJlYWRlci0+Ynl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVhZGVyLT52YWx1ZV9wb3MpOworCisgICAgICByZWFkZXItPnR5cGVfcG9zICs9IDE7CisgICAgICBicmVhazsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitzdHJ1Y3RfcmVhZGVyX25leHQgKERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBjdXJyZW50X3R5cGUpCit7CisgIGludCB0OworCisgIGJhc2VfcmVhZGVyX25leHQgKHJlYWRlciwgY3VycmVudF90eXBlKTsKKworICAvKiBmb3IgU1RSVUNUIGNvbnRhaW5lcnMgd2UgcmV0dXJuIEZBTFNFIGF0IHRoZSBlbmQgb2YgdGhlIHN0cnVjdCwKKyAgICogZm9yIElOVkFMSUQgd2UgcmV0dXJuIEZBTFNFIGF0IHRoZSBlbmQgb2YgdGhlIHNpZ25hdHVyZS4KKyAgICogSW4gYm90aCBjYXNlcyB3ZSBhcnJhbmdlIGZvciBnZXRfY3VycmVudF90eXBlKCkgdG8gcmV0dXJuIElOVkFMSUQKKyAgICogd2hpY2ggaXMgZGVmaW5lZCB0byBoYXBwZW4gaWZmIHdlJ3JlIGF0IHRoZSBlbmQgKG5vIG1vcmUgbmV4dCgpKQorICAgKi8KKyAgdCA9IF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAocmVhZGVyLT50eXBlX3N0ciwgcmVhZGVyLT50eXBlX3Bvcyk7CisgIGlmICh0ID09IERCVVNfU1RSVUNUX0VORF9DSEFSKQorICAgIHsKKyAgICAgIHJlYWRlci0+dHlwZV9wb3MgKz0gMTsKKyAgICAgIHJlYWRlci0+ZmluaXNoZWQgPSBUUlVFOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK2RpY3RfZW50cnlfcmVhZGVyX25leHQgKERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgY3VycmVudF90eXBlKQoreworICBpbnQgdDsKKworICBiYXNlX3JlYWRlcl9uZXh0IChyZWFkZXIsIGN1cnJlbnRfdHlwZSk7CisKKyAgLyogZm9yIFNUUlVDVCBjb250YWluZXJzIHdlIHJldHVybiBGQUxTRSBhdCB0aGUgZW5kIG9mIHRoZSBzdHJ1Y3QsCisgICAqIGZvciBJTlZBTElEIHdlIHJldHVybiBGQUxTRSBhdCB0aGUgZW5kIG9mIHRoZSBzaWduYXR1cmUuCisgICAqIEluIGJvdGggY2FzZXMgd2UgYXJyYW5nZSBmb3IgZ2V0X2N1cnJlbnRfdHlwZSgpIHRvIHJldHVybiBJTlZBTElECisgICAqIHdoaWNoIGlzIGRlZmluZWQgdG8gaGFwcGVuIGlmZiB3ZSdyZSBhdCB0aGUgZW5kIChubyBtb3JlIG5leHQoKSkKKyAgICovCisgIHQgPSBfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKHJlYWRlci0+dHlwZV9zdHIsIHJlYWRlci0+dHlwZV9wb3MpOworICBpZiAodCA9PSBEQlVTX0RJQ1RfRU5UUllfRU5EX0NIQVIpCisgICAgeworICAgICAgcmVhZGVyLT50eXBlX3BvcyArPSAxOworICAgICAgcmVhZGVyLT5maW5pc2hlZCA9IFRSVUU7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorYXJyYXlfdHlwZXNfb25seV9yZWFkZXJfbmV4dCAoREJ1c1R5cGVSZWFkZXIgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBjdXJyZW50X3R5cGUpCit7CisgIC8qIFdlIGhhdmUgb25lICJlbGVtZW50IiB0byBiZSBpdGVyYXRlZCBvdmVyCisgICAqIGluIGVhY2ggYXJyYXksIHdoaWNoIGlzIGl0cyBlbGVtZW50IHR5cGUuCisgICAqIFNvIHRoZSBmaW5pc2hlZCBmbGFnIGluZGljYXRlcyB3aGV0aGVyIHdlJ3ZlCisgICAqIGl0ZXJhdGVkIG92ZXIgaXQgeWV0IG9yIG5vdC4KKyAgICovCisgIHJlYWRlci0+ZmluaXNoZWQgPSBUUlVFOworfQorCitzdGF0aWMgdm9pZAorYXJyYXlfcmVhZGVyX25leHQgKERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGN1cnJlbnRfdHlwZSkKK3sKKyAgLyogU2tpcCBvbmUgYXJyYXkgZWxlbWVudCAqLworICBpbnQgZW5kX3BvczsKKworICBlbmRfcG9zID0gcmVhZGVyLT51LmFycmF5LnN0YXJ0X3BvcyArIGFycmF5X3JlYWRlcl9nZXRfYXJyYXlfbGVuIChyZWFkZXIpOworCisjaWYgUkVDVVJTSVZFX01BUlNIQUxfUkVBRF9UUkFDRQorICBfZGJ1c192ZXJib3NlICgiICByZWFkZXIgJXAgYXJyYXkgbmV4dCBTVEFSVCBzdGFydF9wb3MgPSAlZCBlbmRfcG9zID0gJWQgdmFsdWVfcG9zID0gJWQgY3VycmVudF90eXBlID0gJXNcbiIsCisgICAgICAgICAgICAgICAgIHJlYWRlciwKKyAgICAgICAgICAgICAgICAgcmVhZGVyLT51LmFycmF5LnN0YXJ0X3BvcywKKyAgICAgICAgICAgICAgICAgZW5kX3BvcywgcmVhZGVyLT52YWx1ZV9wb3MsCisgICAgICAgICAgICAgICAgIF9kYnVzX3R5cGVfdG9fc3RyaW5nIChjdXJyZW50X3R5cGUpKTsKKyNlbmRpZgorCisgIF9kYnVzX2Fzc2VydCAocmVhZGVyLT52YWx1ZV9wb3MgPCBlbmRfcG9zKTsKKyAgX2RidXNfYXNzZXJ0IChyZWFkZXItPnZhbHVlX3BvcyA+PSByZWFkZXItPnUuYXJyYXkuc3RhcnRfcG9zKTsKKworICBzd2l0Y2ggKF9kYnVzX2ZpcnN0X3R5cGVfaW5fc2lnbmF0dXJlIChyZWFkZXItPnR5cGVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXItPnR5cGVfcG9zKSkKKyAgICB7CisgICAgY2FzZSBEQlVTX1RZUEVfRElDVF9FTlRSWToKKyAgICBjYXNlIERCVVNfVFlQRV9TVFJVQ1Q6CisgICAgY2FzZSBEQlVTX1RZUEVfVkFSSUFOVDoKKyAgICAgIHsKKyAgICAgICAgREJ1c1R5cGVSZWFkZXIgc3ViOworCisgICAgICAgIC8qIFJlY3Vyc2UgaW50byB0aGUgc3RydWN0IG9yIHZhcmlhbnQgKi8KKyAgICAgICAgX2RidXNfdHlwZV9yZWFkZXJfcmVjdXJzZSAocmVhZGVyLCAmc3ViKTsKKworICAgICAgICAvKiBTa2lwIGV2ZXJ5dGhpbmcgaW4gdGhpcyBlbGVtZW50ICovCisgICAgICAgIHdoaWxlIChfZGJ1c190eXBlX3JlYWRlcl9uZXh0ICgmc3ViKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBub3RoaW5nICovOworICAgICAgICAgIH0KKworICAgICAgICAvKiBOb3cgd2UgYXJlIGF0IHRoZSBlbmQgb2YgdGhpcyBlbGVtZW50ICovCisgICAgICAgIHJlYWRlci0+dmFsdWVfcG9zID0gc3ViLnZhbHVlX3BvczsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBEQlVTX1RZUEVfQVJSQVk6CisgICAgICB7CisgICAgICAgIF9kYnVzX21hcnNoYWxfc2tpcF9hcnJheSAocmVhZGVyLT52YWx1ZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfZmlyc3RfdHlwZV9pbl9zaWduYXR1cmUgKHJlYWRlci0+dHlwZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci0+dHlwZV9wb3MgKyAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXItPmJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlYWRlci0+dmFsdWVfcG9zKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIHsKKyAgICAgICAgX2RidXNfbWFyc2hhbF9za2lwX2Jhc2ljIChyZWFkZXItPnZhbHVlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X3R5cGUsIHJlYWRlci0+Ynl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVhZGVyLT52YWx1ZV9wb3MpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorCisjaWYgUkVDVVJTSVZFX01BUlNIQUxfUkVBRF9UUkFDRQorICBfZGJ1c192ZXJib3NlICgiICByZWFkZXIgJXAgYXJyYXkgbmV4dCBFTkQgc3RhcnRfcG9zID0gJWQgZW5kX3BvcyA9ICVkIHZhbHVlX3BvcyA9ICVkIGN1cnJlbnRfdHlwZSA9ICVzXG4iLAorICAgICAgICAgICAgICAgICByZWFkZXIsCisgICAgICAgICAgICAgICAgIHJlYWRlci0+dS5hcnJheS5zdGFydF9wb3MsCisgICAgICAgICAgICAgICAgIGVuZF9wb3MsIHJlYWRlci0+dmFsdWVfcG9zLAorICAgICAgICAgICAgICAgICBfZGJ1c190eXBlX3RvX3N0cmluZyAoY3VycmVudF90eXBlKSk7CisjZW5kaWYKKworICBfZGJ1c19hc3NlcnQgKHJlYWRlci0+dmFsdWVfcG9zIDw9IGVuZF9wb3MpOworCisgIGlmIChyZWFkZXItPnZhbHVlX3BvcyA9PSBlbmRfcG9zKQorICAgIHsKKyAgICAgIHNraXBfb25lX2NvbXBsZXRlX3R5cGUgKHJlYWRlci0+dHlwZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVhZGVyLT50eXBlX3Bvcyk7CisgICAgfQorfQorCitzdGF0aWMgY29uc3QgREJ1c1R5cGVSZWFkZXJDbGFzcyBib2R5X3JlYWRlcl9jbGFzcyA9IHsKKyAgImJvZHkiLCAwLAorICBGQUxTRSwKKyAgTlVMTCwgLyogYm9keSBpcyBhbHdheXMgdG9wbGV2ZWwsIHNvIGRvZXNuJ3QgZ2V0IHJlY3Vyc2VkIGludG8gKi8KKyAgTlVMTCwKKyAgYmFzZV9yZWFkZXJfbmV4dAorfTsKKworc3RhdGljIGNvbnN0IERCdXNUeXBlUmVhZGVyQ2xhc3MgYm9keV90eXBlc19vbmx5X3JlYWRlcl9jbGFzcyA9IHsKKyAgImJvZHkgdHlwZXMiLCAxLAorICBUUlVFLAorICBOVUxMLCAvKiBib2R5IGlzIGFsd2F5cyB0b3BsZXZlbCwgc28gZG9lc24ndCBnZXQgcmVjdXJzZWQgaW50byAqLworICBOVUxMLAorICBiYXNlX3JlYWRlcl9uZXh0Cit9OworCitzdGF0aWMgY29uc3QgREJ1c1R5cGVSZWFkZXJDbGFzcyBzdHJ1Y3RfcmVhZGVyX2NsYXNzID0geworICAic3RydWN0IiwgMiwKKyAgRkFMU0UsCisgIHN0cnVjdF9vcl9kaWN0X2VudHJ5X3JlYWRlcl9yZWN1cnNlLAorICBOVUxMLAorICBzdHJ1Y3RfcmVhZGVyX25leHQKK307CisKK3N0YXRpYyBjb25zdCBEQnVzVHlwZVJlYWRlckNsYXNzIHN0cnVjdF90eXBlc19vbmx5X3JlYWRlcl9jbGFzcyA9IHsKKyAgInN0cnVjdCB0eXBlcyIsIDMsCisgIFRSVUUsCisgIHN0cnVjdF9vcl9kaWN0X2VudHJ5X3R5cGVzX29ubHlfcmVhZGVyX3JlY3Vyc2UsCisgIE5VTEwsCisgIHN0cnVjdF9yZWFkZXJfbmV4dAorfTsKKworc3RhdGljIGNvbnN0IERCdXNUeXBlUmVhZGVyQ2xhc3MgZGljdF9lbnRyeV9yZWFkZXJfY2xhc3MgPSB7CisgICJkaWN0X2VudHJ5IiwgNCwKKyAgRkFMU0UsCisgIHN0cnVjdF9vcl9kaWN0X2VudHJ5X3JlYWRlcl9yZWN1cnNlLAorICBOVUxMLAorICBkaWN0X2VudHJ5X3JlYWRlcl9uZXh0Cit9OworCitzdGF0aWMgY29uc3QgREJ1c1R5cGVSZWFkZXJDbGFzcyBkaWN0X2VudHJ5X3R5cGVzX29ubHlfcmVhZGVyX2NsYXNzID0geworICAiZGljdF9lbnRyeSB0eXBlcyIsIDUsCisgIFRSVUUsCisgIHN0cnVjdF9vcl9kaWN0X2VudHJ5X3R5cGVzX29ubHlfcmVhZGVyX3JlY3Vyc2UsCisgIE5VTEwsCisgIGRpY3RfZW50cnlfcmVhZGVyX25leHQKK307CisKK3N0YXRpYyBjb25zdCBEQnVzVHlwZVJlYWRlckNsYXNzIGFycmF5X3JlYWRlcl9jbGFzcyA9IHsKKyAgImFycmF5IiwgNiwKKyAgRkFMU0UsCisgIGFycmF5X3JlYWRlcl9yZWN1cnNlLAorICBhcnJheV9yZWFkZXJfY2hlY2tfZmluaXNoZWQsCisgIGFycmF5X3JlYWRlcl9uZXh0Cit9OworCitzdGF0aWMgY29uc3QgREJ1c1R5cGVSZWFkZXJDbGFzcyBhcnJheV90eXBlc19vbmx5X3JlYWRlcl9jbGFzcyA9IHsKKyAgImFycmF5IHR5cGVzIiwgNywKKyAgVFJVRSwKKyAgYXJyYXlfdHlwZXNfb25seV9yZWFkZXJfcmVjdXJzZSwKKyAgTlVMTCwKKyAgYXJyYXlfdHlwZXNfb25seV9yZWFkZXJfbmV4dAorfTsKKworc3RhdGljIGNvbnN0IERCdXNUeXBlUmVhZGVyQ2xhc3MgdmFyaWFudF9yZWFkZXJfY2xhc3MgPSB7CisgICJ2YXJpYW50IiwgOCwKKyAgRkFMU0UsCisgIHZhcmlhbnRfcmVhZGVyX3JlY3Vyc2UsCisgIE5VTEwsCisgIGJhc2VfcmVhZGVyX25leHQKK307CisKKyNpZm5kZWYgREJVU19ESVNBQkxFX0FTU0VSVAorc3RhdGljIGNvbnN0IERCdXNUeXBlUmVhZGVyQ2xhc3MgKiBjb25zdAorYWxsX3JlYWRlcl9jbGFzc2VzW10gPSB7CisgICZib2R5X3JlYWRlcl9jbGFzcywKKyAgJmJvZHlfdHlwZXNfb25seV9yZWFkZXJfY2xhc3MsCisgICZzdHJ1Y3RfcmVhZGVyX2NsYXNzLAorICAmc3RydWN0X3R5cGVzX29ubHlfcmVhZGVyX2NsYXNzLAorICAmZGljdF9lbnRyeV9yZWFkZXJfY2xhc3MsCisgICZkaWN0X2VudHJ5X3R5cGVzX29ubHlfcmVhZGVyX2NsYXNzLAorICAmYXJyYXlfcmVhZGVyX2NsYXNzLAorICAmYXJyYXlfdHlwZXNfb25seV9yZWFkZXJfY2xhc3MsCisgICZ2YXJpYW50X3JlYWRlcl9jbGFzcworfTsKKyNlbmRpZgorCisvKioKKyAqIEluaXRpYWxpemVzIGEgdHlwZSByZWFkZXIuCisgKgorICogQHBhcmFtIHJlYWRlciB0aGUgcmVhZGVyCisgKiBAcGFyYW0gYnl0ZV9vcmRlciB0aGUgYnl0ZSBvcmRlciBvZiB0aGUgYmxvY2sgdG8gcmVhZAorICogQHBhcmFtIHR5cGVfc3RyIHRoZSBzaWduYXR1cmUgb2YgdGhlIGJsb2NrIHRvIHJlYWQKKyAqIEBwYXJhbSB0eXBlX3BvcyBsb2NhdGlvbiBvZiBzaWduYXR1cmUKKyAqIEBwYXJhbSB2YWx1ZV9zdHIgdGhlIHN0cmluZyBjb250YWluaW5nIHZhbHVlcyBibG9jaworICogQHBhcmFtIHZhbHVlX3BvcyBzdGFydCBvZiB2YWx1ZXMgYmxvY2sKKyAqLwordm9pZAorX2RidXNfdHlwZV9yZWFkZXJfaW5pdCAoREJ1c1R5cGVSZWFkZXIgICAgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAgKnR5cGVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIHR5cGVfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAgKnZhbHVlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICB2YWx1ZV9wb3MpCit7CisgIHJlYWRlcl9pbml0IChyZWFkZXIsIGJ5dGVfb3JkZXIsIHR5cGVfc3RyLCB0eXBlX3BvcywKKyAgICAgICAgICAgICAgIHZhbHVlX3N0ciwgdmFsdWVfcG9zKTsKKworICByZWFkZXItPmtsYXNzID0gJmJvZHlfcmVhZGVyX2NsYXNzOworCisjaWYgUkVDVVJTSVZFX01BUlNIQUxfUkVBRF9UUkFDRQorICBfZGJ1c192ZXJib3NlICgiICB0eXBlIHJlYWRlciAlcCBpbml0IHR5cGVfcG9zID0gJWQgdmFsdWVfcG9zID0gJWQgcmVtYWluaW5nIHNpZyAnJXMnXG4iLAorICAgICAgICAgICAgICAgICByZWFkZXIsIHJlYWRlci0+dHlwZV9wb3MsIHJlYWRlci0+dmFsdWVfcG9zLAorICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuIChyZWFkZXItPnR5cGVfc3RyLCByZWFkZXItPnR5cGVfcG9zLCAwKSk7CisjZW5kaWYKK30KKworLyoqCisgKiBMaWtlIF9kYnVzX3R5cGVfcmVhZGVyX2luaXQoKSBidXQgdGhlIGl0ZXJhdGlvbiBpcyBvdmVyIHRoZQorICogc2lnbmF0dXJlLCBub3Qgb3ZlciB2YWx1ZXMuCisgKgorICogQHBhcmFtIHJlYWRlciB0aGUgcmVhZGVyCisgKiBAcGFyYW0gdHlwZV9zdHIgdGhlIHNpZ25hdHVyZSBzdHJpbmcKKyAqIEBwYXJhbSB0eXBlX3BvcyBsb2NhdGlvbiBpbiB0aGUgc2lnbmF0dXJlIHN0cmluZworICovCit2b2lkCitfZGJ1c190eXBlX3JlYWRlcl9pbml0X3R5cGVzX29ubHkgKERCdXNUeXBlUmVhZGVyICAgICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICp0eXBlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIHR5cGVfcG9zKQoreworICByZWFkZXJfaW5pdCAocmVhZGVyLCBEQlVTX0NPTVBJTEVSX0JZVEVfT1JERVIgLyogaXJyZWxldmFudCAqLywKKyAgICAgICAgICAgICAgIHR5cGVfc3RyLCB0eXBlX3BvcywgTlVMTCwgX0RCVVNfSU5UX01BWCAvKiBjcmFzaGVzIGlmIHdlIHNjcmV3IHVwICovKTsKKworICByZWFkZXItPmtsYXNzID0gJmJvZHlfdHlwZXNfb25seV9yZWFkZXJfY2xhc3M7CisKKyNpZiBSRUNVUlNJVkVfTUFSU0hBTF9SRUFEX1RSQUNFCisgIF9kYnVzX3ZlcmJvc2UgKCIgIHR5cGUgcmVhZGVyICVwIGluaXQgdHlwZXMgb25seSB0eXBlX3BvcyA9ICVkIHJlbWFpbmluZyBzaWcgJyVzJ1xuIiwKKyAgICAgICAgICAgICAgICAgcmVhZGVyLCByZWFkZXItPnR5cGVfcG9zLAorICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuIChyZWFkZXItPnR5cGVfc3RyLCByZWFkZXItPnR5cGVfcG9zLCAwKSk7CisjZW5kaWYKK30KKworLyoqCisgKiBHZXRzIHRoZSB0eXBlIG9mIHRoZSB2YWx1ZSB0aGUgcmVhZGVyIGlzIGN1cnJlbnRseSBwb2ludGluZyB0bzsKKyAqIG9yIGZvciBhIHR5cGVzLW9ubHkgcmVhZGVyIGdldHMgdGhlIHR5cGUgaXQncyBjdXJyZW50bHkgcG9pbnRpbmcgdG8uCisgKiBJZiB0aGUgcmVhZGVyIGlzIGF0IHRoZSBlbmQgb2YgYSBibG9jayBvciBlbmQgb2YgYSBjb250YWluZXIgc3VjaAorICogYXMgYW4gYXJyYXksIHJldHVybnMgI0RCVVNfVFlQRV9JTlZBTElELgorICoKKyAqIEBwYXJhbSByZWFkZXIgdGhlIHJlYWRlcgorICovCitpbnQKK19kYnVzX3R5cGVfcmVhZGVyX2dldF9jdXJyZW50X3R5cGUgKGNvbnN0IERCdXNUeXBlUmVhZGVyICpyZWFkZXIpCit7CisgIGludCB0OworCisgIGlmIChyZWFkZXItPmZpbmlzaGVkIHx8CisgICAgICAocmVhZGVyLT5rbGFzcy0+Y2hlY2tfZmluaXNoZWQgJiYKKyAgICAgICAoKiByZWFkZXItPmtsYXNzLT5jaGVja19maW5pc2hlZCkgKHJlYWRlcikpKQorICAgIHQgPSBEQlVTX1RZUEVfSU5WQUxJRDsKKyAgZWxzZQorICAgIHQgPSBfZGJ1c19maXJzdF90eXBlX2luX3NpZ25hdHVyZSAocmVhZGVyLT50eXBlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci0+dHlwZV9wb3MpOworCisgIF9kYnVzX2Fzc2VydCAodCAhPSBEQlVTX1NUUlVDVF9FTkRfQ0hBUik7CisgIF9kYnVzX2Fzc2VydCAodCAhPSBEQlVTX1NUUlVDVF9CRUdJTl9DSEFSKTsKKyAgX2RidXNfYXNzZXJ0ICh0ICE9IERCVVNfRElDVF9FTlRSWV9FTkRfQ0hBUik7CisgIF9kYnVzX2Fzc2VydCAodCAhPSBEQlVTX0RJQ1RfRU5UUllfQkVHSU5fQ0hBUik7CisgIAorI2lmIDAKKyAgX2RidXNfdmVyYm9zZSAoIiAgdHlwZSByZWFkZXIgJXAgY3VycmVudCB0eXBlX3BvcyA9ICVkIHR5cGUgPSAlc1xuIiwKKyAgICAgICAgICAgICAgICAgcmVhZGVyLCByZWFkZXItPnR5cGVfcG9zLAorICAgICAgICAgICAgICAgICBfZGJ1c190eXBlX3RvX3N0cmluZyAodCkpOworI2VuZGlmCisKKyAgcmV0dXJuIHQ7Cit9CisKKy8qKgorICogR2V0cyB0aGUgdHlwZSBvZiBhbiBlbGVtZW50IG9mIHRoZSBhcnJheSB0aGUgcmVhZGVyIGlzIGN1cnJlbnRseQorICogcG9pbnRpbmcgdG8uIEl0J3MgYW4gZXJyb3IgdG8gY2FsbCB0aGlzIGlmCisgKiBfZGJ1c190eXBlX3JlYWRlcl9nZXRfY3VycmVudF90eXBlKCkgZG9lc24ndCByZXR1cm4gI0RCVVNfVFlQRV9BUlJBWQorICogZm9yIHRoaXMgcmVhZGVyLgorICoKKyAqIEBwYXJhbSByZWFkZXIgdGhlIHJlYWRlcgorICovCitpbnQKK19kYnVzX3R5cGVfcmVhZGVyX2dldF9lbGVtZW50X3R5cGUgKGNvbnN0IERCdXNUeXBlUmVhZGVyICAqcmVhZGVyKQoreworICBpbnQgZWxlbWVudF90eXBlOworCisgIF9kYnVzX2Fzc2VydCAoX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2N1cnJlbnRfdHlwZSAocmVhZGVyKSA9PSBEQlVTX1RZUEVfQVJSQVkpOworCisgIGVsZW1lbnRfdHlwZSA9IF9kYnVzX2ZpcnN0X3R5cGVfaW5fc2lnbmF0dXJlIChyZWFkZXItPnR5cGVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLT50eXBlX3BvcyArIDEpOworCisgIHJldHVybiBlbGVtZW50X3R5cGU7Cit9CisKKy8qKgorICogR2V0cyB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgdmFsdWUgYmxvY2sKKyAqIEBwYXJhbSByZWFkZXIgdGhlIHJlYWRlcgorICovCitpbnQKK19kYnVzX3R5cGVfcmVhZGVyX2dldF92YWx1ZV9wb3MgKGNvbnN0IERCdXNUeXBlUmVhZGVyICAqcmVhZGVyKQoreworICByZXR1cm4gcmVhZGVyLT52YWx1ZV9wb3M7Cit9CisKKy8qKgorICogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBtYXJzaGFsZWQgdmFsdWUgaW4gdGhlIGRhdGEgYmVpbmcgcmVhZC4gIFRoZQorICogYWRkcmVzcyBtYXkgbm90IGJlIGFsaWduZWQ7IHlvdSBoYXZlIHRvIGFsaWduIGl0IHRvIHRoZSB0eXBlIG9mIHRoZQorICogdmFsdWUgeW91IHdhbnQgdG8gcmVhZC4gTW9zdCBvZiB0aGUgZGVtYXJzaGFsIHJvdXRpbmVzIGRvIHRoaXMgZm9yCisgKiB5b3UuCisgKgorICogQHBhcmFtIHJlYWRlciB0aGUgcmVhZGVyCisgKiBAcGFyYW0gdmFsdWVfbG9jYXRpb24gdGhlIGFkZHJlc3Mgb2YgdGhlIG1hcnNoYWxlZCB2YWx1ZQorICovCit2b2lkCitfZGJ1c190eXBlX3JlYWRlcl9yZWFkX3JhdyAoY29uc3QgREJ1c1R5cGVSZWFkZXIgICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAgKip2YWx1ZV9sb2NhdGlvbikKK3sKKyAgX2RidXNfYXNzZXJ0ICghcmVhZGVyLT5rbGFzcy0+dHlwZXNfb25seSk7CisKKyAgKnZhbHVlX2xvY2F0aW9uID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF91ZGF0YV9sZW4gKHJlYWRlci0+dmFsdWVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLT52YWx1ZV9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKK30KKworLyoqCisgKiBSZWFkcyBhIGJhc2ljLXR5cGVkIHZhbHVlLCBhcyB3aXRoIF9kYnVzX21hcnNoYWxfcmVhZF9iYXNpYygpLgorICoKKyAqIEBwYXJhbSByZWFkZXIgdGhlIHJlYWRlcgorICogQHBhcmFtIHZhbHVlIHRoZSBhZGRyZXNzIG9mIHRoZSB2YWx1ZQorICovCit2b2lkCitfZGJ1c190eXBlX3JlYWRlcl9yZWFkX2Jhc2ljIChjb25zdCBEQnVzVHlwZVJlYWRlciAgICAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgKnZhbHVlKQoreworICBpbnQgdDsKKworICBfZGJ1c19hc3NlcnQgKCFyZWFkZXItPmtsYXNzLT50eXBlc19vbmx5KTsKKworICB0ID0gX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2N1cnJlbnRfdHlwZSAocmVhZGVyKTsKKworICBfZGJ1c19tYXJzaGFsX3JlYWRfYmFzaWMgKHJlYWRlci0+dmFsdWVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci0+dmFsdWVfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQsIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci0+Ynl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworCisjaWYgUkVDVVJTSVZFX01BUlNIQUxfUkVBRF9UUkFDRQorICBfZGJ1c192ZXJib3NlICgiICB0eXBlIHJlYWRlciAlcCByZWFkIGJhc2ljIHR5cGVfcG9zID0gJWQgdmFsdWVfcG9zID0gJWQgcmVtYWluaW5nIHNpZyAnJXMnXG4iLAorICAgICAgICAgICAgICAgICByZWFkZXIsIHJlYWRlci0+dHlwZV9wb3MsIHJlYWRlci0+dmFsdWVfcG9zLAorICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuIChyZWFkZXItPnR5cGVfc3RyLCByZWFkZXItPnR5cGVfcG9zLCAwKSk7CisjZW5kaWYKK30KKworLyoqCisgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGFycmF5LgorICoKKyAqIEBwYXJhbSByZWFkZXIgdGhlIHJlYWRlciB0byByZWFkIGZyb20KKyAqIEByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGFycmF5CisgKi8KK2ludAorX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2FycmF5X2xlbmd0aCAoY29uc3QgREJ1c1R5cGVSZWFkZXIgICpyZWFkZXIpCit7CisgIF9kYnVzX2Fzc2VydCAoIXJlYWRlci0+a2xhc3MtPnR5cGVzX29ubHkpOworICBfZGJ1c19hc3NlcnQgKHJlYWRlci0+a2xhc3MgPT0gJmFycmF5X3JlYWRlcl9jbGFzcyk7CisKKyAgcmV0dXJuIGFycmF5X3JlYWRlcl9nZXRfYXJyYXlfbGVuIChyZWFkZXIpOworfQorCisvKioKKyAqIFJlYWRzIGEgYmxvY2sgb2YgZml4ZWQtbGVuZ3RoIGJhc2ljIHZhbHVlcywgZnJvbSB0aGUgY3VycmVudCBwb2ludAorICogaW4gYW4gYXJyYXkgdG8gdGhlIGVuZCBvZiB0aGUgYXJyYXkuICBEb2VzIG5vdCB3b3JrIGZvciBhcnJheXMgb2YKKyAqIHN0cmluZyBvciBjb250YWluZXIgdHlwZXMuCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBhcnJheSBpbi1wbGFjZTsgaXQgZG9lcyBub3QgbWFrZSBhIGNvcHksCisgKiBhbmQgaXQgZG9lcyBub3Qgc3dhcCB0aGUgYnl0ZXMuCisgKgorICogSWYgeW91IGFzayBmb3IgI0RCVVNfVFlQRV9ET1VCTEUgeW91IHdpbGwgZ2V0IGEgImNvbnN0IGRvdWJsZSoiIGJhY2sKKyAqIGFuZCB0aGUgInZhbHVlIiBhcmd1bWVudCBzaG91bGQgYmUgYSAiY29uc3QgZG91YmxlKioiIGFuZCBzbyBvbi4KKyAqCisgKiBAcGFyYW0gcmVhZGVyIHRoZSByZWFkZXIgdG8gcmVhZCBmcm9tCisgKiBAcGFyYW0gdmFsdWUgcGxhY2UgdG8gcmV0dXJuIHRoZSBhcnJheSB2YWx1ZXMKKyAqIEBwYXJhbSBuX2VsZW1lbnRzIHBsYWNlIHRvIHJldHVybiBudW1iZXIgb2YgYXJyYXkgZWxlbWVudHMKKyAqLwordm9pZAorX2RidXNfdHlwZV9yZWFkZXJfcmVhZF9maXhlZF9tdWx0aSAoY29uc3QgREJ1c1R5cGVSZWFkZXIgICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICpuX2VsZW1lbnRzKQoreworICBpbnQgZWxlbWVudF90eXBlOworICBpbnQgZW5kX3BvczsKKyAgaW50IHJlbWFpbmluZ19sZW47CisgIGludCBhbGlnbm1lbnQ7CisgIGludCB0b3RhbF9sZW47CisKKyAgX2RidXNfYXNzZXJ0ICghcmVhZGVyLT5rbGFzcy0+dHlwZXNfb25seSk7CisgIF9kYnVzX2Fzc2VydCAocmVhZGVyLT5rbGFzcyA9PSAmYXJyYXlfcmVhZGVyX2NsYXNzKTsKKworICBlbGVtZW50X3R5cGUgPSBfZGJ1c19maXJzdF90eXBlX2luX3NpZ25hdHVyZSAocmVhZGVyLT50eXBlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci0+dHlwZV9wb3MpOworCisgIF9kYnVzX2Fzc2VydCAoZWxlbWVudF90eXBlICE9IERCVVNfVFlQRV9JTlZBTElEKTsgLyogd2h5IHdlIGRvbid0IHVzZSBnZXRfY3VycmVudF90eXBlKCkgKi8KKyAgX2RidXNfYXNzZXJ0IChkYnVzX3R5cGVfaXNfZml4ZWQgKGVsZW1lbnRfdHlwZSkpOworCisgIGFsaWdubWVudCA9IF9kYnVzX3R5cGVfZ2V0X2FsaWdubWVudCAoZWxlbWVudF90eXBlKTsKKworICBfZGJ1c19hc3NlcnQgKHJlYWRlci0+dmFsdWVfcG9zID49IHJlYWRlci0+dS5hcnJheS5zdGFydF9wb3MpOworCisgIHRvdGFsX2xlbiA9IGFycmF5X3JlYWRlcl9nZXRfYXJyYXlfbGVuIChyZWFkZXIpOworICBlbmRfcG9zID0gcmVhZGVyLT51LmFycmF5LnN0YXJ0X3BvcyArIHRvdGFsX2xlbjsKKyAgcmVtYWluaW5nX2xlbiA9IGVuZF9wb3MgLSByZWFkZXItPnZhbHVlX3BvczsKKworI2lmIFJFQ1VSU0lWRV9NQVJTSEFMX1JFQURfVFJBQ0UKKyAgX2RidXNfdmVyYm9zZSAoImVuZF9wb3MgJWQgdG90YWxfbGVuICVkIHJlbWFpbmluZ19sZW4gJWQgdmFsdWVfcG9zICVkXG4iLAorICAgICAgICAgICAgICAgICBlbmRfcG9zLCB0b3RhbF9sZW4sIHJlbWFpbmluZ19sZW4sIHJlYWRlci0+dmFsdWVfcG9zKTsKKyNlbmRpZgorCisgIF9kYnVzX2Fzc2VydCAocmVtYWluaW5nX2xlbiA8PSB0b3RhbF9sZW4pOworCisgIGlmIChyZW1haW5pbmdfbGVuID09IDApCisgICAgKihjb25zdCBEQnVzQmFzaWNWYWx1ZSoqKSB2YWx1ZSA9IE5VTEw7CisgIGVsc2UKKyAgICAqKGNvbnN0IERCdXNCYXNpY1ZhbHVlKiopIHZhbHVlID0KKyAgICAgICh2b2lkKikgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhX2xlbiAocmVhZGVyLT52YWx1ZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci0+dmFsdWVfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1haW5pbmdfbGVuKTsKKworICAqbl9lbGVtZW50cyA9IHJlbWFpbmluZ19sZW4gLyBhbGlnbm1lbnQ7CisgIF9kYnVzX2Fzc2VydCAoKHJlbWFpbmluZ19sZW4gJSBhbGlnbm1lbnQpID09IDApOworCisjaWYgUkVDVVJTSVZFX01BUlNIQUxfUkVBRF9UUkFDRQorICBfZGJ1c192ZXJib3NlICgiICB0eXBlIHJlYWRlciAlcCByZWFkIGZpeGVkIGFycmF5IHR5cGVfcG9zID0gJWQgdmFsdWVfcG9zID0gJWQgcmVtYWluaW5nIHNpZyAnJXMnXG4iLAorICAgICAgICAgICAgICAgICByZWFkZXIsIHJlYWRlci0+dHlwZV9wb3MsIHJlYWRlci0+dmFsdWVfcG9zLAorICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuIChyZWFkZXItPnR5cGVfc3RyLCByZWFkZXItPnR5cGVfcG9zLCAwKSk7CisjZW5kaWYKK30KKworLyoqCisgKiBJbml0aWFsaXplIGEgbmV3IHJlYWRlciBwb2ludGluZyB0byB0aGUgZmlyc3QgdHlwZSBhbmQKKyAqIGNvcnJlc3BvbmRpbmcgdmFsdWUgdGhhdCdzIGEgY2hpbGQgb2YgdGhlIGN1cnJlbnQgY29udGFpbmVyLiBJdCdzCisgKiBhbiBlcnJvciB0byBjYWxsIHRoaXMgaWYgdGhlIGN1cnJlbnQgdHlwZSBpcyBhIG5vbi1jb250YWluZXIuCisgKgorICogTm90ZSB0aGF0IERCdXNUeXBlUmVhZGVyIHRyYXZlcnNlcyB2YWx1ZXMsIG5vdCB0eXBlcy4gU28gaWYgeW91CisgKiBoYXZlIGFuIGVtcHR5IGFycmF5IG9mIGFycmF5IG9mIGludCwgeW91IGNhbid0IHJlY3Vyc2UgaW50byBpdC4gWW91CisgKiBjYW4gb25seSByZWN1cnNlIGludG8gZWFjaCBlbGVtZW50LgorICoKKyAqIEBwYXJhbSByZWFkZXIgdGhlIHJlYWRlcgorICogQHBhcmFtIHN1YiBhIHJlYWRlciB0byBpbml0IHBvaW50aW5nIHRvIHRoZSBmaXJzdCBjaGlsZAorICovCit2b2lkCitfZGJ1c190eXBlX3JlYWRlcl9yZWN1cnNlIChEQnVzVHlwZVJlYWRlciAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgKnN1YikKK3sKKyAgaW50IHQ7CisgIGNvbnN0IERCdXNUeXBlUmVhZGVyQ2xhc3MgKmtsYXNzID0gTlVMTDsKKworICB0ID0gX2RidXNfZmlyc3RfdHlwZV9pbl9zaWduYXR1cmUgKHJlYWRlci0+dHlwZV9zdHIsIHJlYWRlci0+dHlwZV9wb3MpOworCisgIHN3aXRjaCAodCkKKyAgICB7CisgICAgY2FzZSBEQlVTX1RZUEVfU1RSVUNUOgorICAgICAgaWYgKHJlYWRlci0+a2xhc3MtPnR5cGVzX29ubHkpCisgICAgICAgIGtsYXNzID0gJnN0cnVjdF90eXBlc19vbmx5X3JlYWRlcl9jbGFzczsKKyAgICAgIGVsc2UKKyAgICAgICAga2xhc3MgPSAmc3RydWN0X3JlYWRlcl9jbGFzczsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgREJVU19UWVBFX0RJQ1RfRU5UUlk6CisgICAgICBpZiAocmVhZGVyLT5rbGFzcy0+dHlwZXNfb25seSkKKyAgICAgICAga2xhc3MgPSAmZGljdF9lbnRyeV90eXBlc19vbmx5X3JlYWRlcl9jbGFzczsKKyAgICAgIGVsc2UKKyAgICAgICAga2xhc3MgPSAmZGljdF9lbnRyeV9yZWFkZXJfY2xhc3M7CisgICAgICBicmVhazsKKyAgICBjYXNlIERCVVNfVFlQRV9BUlJBWToKKyAgICAgIGlmIChyZWFkZXItPmtsYXNzLT50eXBlc19vbmx5KQorICAgICAgICBrbGFzcyA9ICZhcnJheV90eXBlc19vbmx5X3JlYWRlcl9jbGFzczsKKyAgICAgIGVsc2UKKyAgICAgICAga2xhc3MgPSAmYXJyYXlfcmVhZGVyX2NsYXNzOworICAgICAgYnJlYWs7CisgICAgY2FzZSBEQlVTX1RZUEVfVkFSSUFOVDoKKyAgICAgIGlmIChyZWFkZXItPmtsYXNzLT50eXBlc19vbmx5KQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjYW4ndCByZWN1cnNlIGludG8gdmFyaWFudCB0eXBlY29kZSIpOworICAgICAgZWxzZQorICAgICAgICBrbGFzcyA9ICZ2YXJpYW50X3JlYWRlcl9jbGFzczsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBfZGJ1c192ZXJib3NlICgicmVjdXJzaW5nIGludG8gdHlwZSAlc1xuIiwgX2RidXNfdHlwZV90b19zdHJpbmcgKHQpKTsKKyNpZm5kZWYgREJVU19ESVNBQkxFX0NIRUNLUworICAgICAgaWYgKHQgPT0gREJVU19UWVBFX0lOVkFMSUQpCisgICAgICAgIF9kYnVzX3dhcm5fY2hlY2tfZmFpbGVkICgiWW91IGNhbid0IHJlY3Vyc2UgaW50byBhbiBlbXB0eSBhcnJheSBvciBvZmYgdGhlIGVuZCBvZiBhIG1lc3NhZ2UgYm9keSIpOworI2VuZGlmIC8qIERCVVNfRElTQUJMRV9DSEVDS1MgKi8KKworICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZG9uJ3QgeWV0IGhhbmRsZSByZWN1cnNpbmcgaW50byB0aGlzIHR5cGUiKTsKKyAgICB9CisKKyAgX2RidXNfYXNzZXJ0IChrbGFzcyAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChrbGFzcyA9PSBhbGxfcmVhZGVyX2NsYXNzZXNba2xhc3MtPmlkXSk7CisKKyAgKCoga2xhc3MtPnJlY3Vyc2UpIChzdWIsIHJlYWRlcik7CisgIHN1Yi0+a2xhc3MgPSBrbGFzczsKKworI2lmIFJFQ1VSU0lWRV9NQVJTSEFMX1JFQURfVFJBQ0UKKyAgX2RidXNfdmVyYm9zZSAoIiAgdHlwZSByZWFkZXIgJXAgUkVDVVJTRUQgdHlwZV9wb3MgPSAlZCB2YWx1ZV9wb3MgPSAlZCByZW1haW5pbmcgc2lnICclcydcbiIsCisgICAgICAgICAgICAgICAgIHN1Yiwgc3ViLT50eXBlX3Bvcywgc3ViLT52YWx1ZV9wb3MsCisgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YV9sZW4gKHN1Yi0+dHlwZV9zdHIsIHN1Yi0+dHlwZV9wb3MsIDApKTsKKyNlbmRpZgorfQorCisvKioKKyAqIFNraXAgdG8gdGhlIG5leHQgdmFsdWUgb24gdGhpcyAibGV2ZWwiLiBlLmcuIHRoZSBuZXh0IGZpZWxkIGluIGEKKyAqIHN0cnVjdCwgdGhlIG5leHQgdmFsdWUgaW4gYW4gYXJyYXkuIFJldHVybnMgRkFMU0UgYXQgdGhlIGVuZCBvZiB0aGUKKyAqIGN1cnJlbnQgY29udGFpbmVyLgorICoKKyAqIEBwYXJhbSByZWFkZXIgdGhlIHJlYWRlcgorICogQHJldHVybnMgRkFMU0UgaWYgbm90aGluZyBtb3JlIHRvIHJlYWQgYXQgb3IgYmVsb3cgdGhpcyBsZXZlbAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfdHlwZV9yZWFkZXJfbmV4dCAoREJ1c1R5cGVSZWFkZXIgKnJlYWRlcikKK3sKKyAgaW50IHQ7CisKKyAgdCA9IF9kYnVzX3R5cGVfcmVhZGVyX2dldF9jdXJyZW50X3R5cGUgKHJlYWRlcik7CisKKyNpZiBSRUNVUlNJVkVfTUFSU0hBTF9SRUFEX1RSQUNFCisgIF9kYnVzX3ZlcmJvc2UgKCIgIHR5cGUgcmVhZGVyICVwIFNUQVJUIG5leHQoKSB7IHR5cGVfcG9zID0gJWQgdmFsdWVfcG9zID0gJWQgcmVtYWluaW5nIHNpZyAnJXMnIGN1cnJlbnRfdHlwZSA9ICVzXG4iLAorICAgICAgICAgICAgICAgICByZWFkZXIsIHJlYWRlci0+dHlwZV9wb3MsIHJlYWRlci0+dmFsdWVfcG9zLAorICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuIChyZWFkZXItPnR5cGVfc3RyLCByZWFkZXItPnR5cGVfcG9zLCAwKSwKKyAgICAgICAgICAgICAgICAgX2RidXNfdHlwZV90b19zdHJpbmcgKHQpKTsKKyNlbmRpZgorCisgIGlmICh0ID09IERCVVNfVFlQRV9JTlZBTElEKQorICAgIHJldHVybiBGQUxTRTsKKworICAoKiByZWFkZXItPmtsYXNzLT5uZXh0KSAocmVhZGVyLCB0KTsKKworI2lmIFJFQ1VSU0lWRV9NQVJTSEFMX1JFQURfVFJBQ0UKKyAgX2RidXNfdmVyYm9zZSAoIiAgdHlwZSByZWFkZXIgJXAgRU5EIG5leHQoKSB0eXBlX3BvcyA9ICVkIHZhbHVlX3BvcyA9ICVkIHJlbWFpbmluZyBzaWcgJyVzJyBjdXJyZW50X3R5cGUgPSAlc1xuIiwKKyAgICAgICAgICAgICAgICAgcmVhZGVyLCByZWFkZXItPnR5cGVfcG9zLCByZWFkZXItPnZhbHVlX3BvcywKKyAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhX2xlbiAocmVhZGVyLT50eXBlX3N0ciwgcmVhZGVyLT50eXBlX3BvcywgMCksCisgICAgICAgICAgICAgICAgIF9kYnVzX3R5cGVfdG9fc3RyaW5nIChfZGJ1c190eXBlX3JlYWRlcl9nZXRfY3VycmVudF90eXBlIChyZWFkZXIpKSk7CisjZW5kaWYKKworICByZXR1cm4gX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2N1cnJlbnRfdHlwZSAocmVhZGVyKSAhPSBEQlVTX1RZUEVfSU5WQUxJRDsKK30KKworLyoqCisgKiBDaGVjayB3aGV0aGVyIHRoZXJlJ3MgYW5vdGhlciB2YWx1ZSBvbiB0aGlzICJsZXZlbCIuIGUuZy4gdGhlIG5leHQKKyAqIGZpZWxkIGluIGEgc3RydWN0LCB0aGUgbmV4dCB2YWx1ZSBpbiBhbiBhcnJheS4gUmV0dXJucyBGQUxTRSBhdCB0aGUKKyAqIGVuZCBvZiB0aGUgY3VycmVudCBjb250YWluZXIuCisgKgorICogWW91IHByb2JhYmx5IGRvbid0IHdhbnQgdG8gdXNlIHRoaXM7IGl0IG1ha2VzIGZvciBhbiBhd2t3YXJkIGZvci93aGlsZQorICogbG9vcC4gQSBuaWNlciBvbmUgaXMgIndoaWxlICgoY3VycmVudF90eXBlID0gZ2V0X2N1cnJlbnRfdHlwZSgpKSAhPSBJTlZBTElEKSIKKyAqCisgKiBAcGFyYW0gcmVhZGVyIHRoZSByZWFkZXIKKyAqIEByZXR1cm5zIEZBTFNFIGlmIG5vdGhpbmcgbW9yZSB0byByZWFkIGF0IG9yIGJlbG93IHRoaXMgbGV2ZWwKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3R5cGVfcmVhZGVyX2hhc19uZXh0IChjb25zdCBEQnVzVHlwZVJlYWRlciAqcmVhZGVyKQoreworICAvKiBOb3QgZWZmaWNpZW50IGJ1dCB3b3JrcyBmb3Igbm93LiAqLworICBEQnVzVHlwZVJlYWRlciBjb3B5OworCisgIGNvcHkgPSAqcmVhZGVyOworICByZXR1cm4gX2RidXNfdHlwZV9yZWFkZXJfbmV4dCAoJmNvcHkpOworfQorCisvKioKKyAqIEdldHMgdGhlIHN0cmluZyBhbmQgcmFuZ2Ugb2Ygc2FpZCBzdHJpbmcgY29udGFpbmluZyB0aGUgc2lnbmF0dXJlCisgKiBvZiB0aGUgY3VycmVudCB2YWx1ZS4gRXNzZW50aWFsbHkgYSBtb3JlIGNvbXBsZXRlIHZlcnNpb24gb2YKKyAqIF9kYnVzX3R5cGVfcmVhZGVyX2dldF9jdXJyZW50X3R5cGUoKSAocmV0dXJucyB0aGUgZnVsbCB0eXBlCisgKiByYXRoZXIgdGhhbiBvbmx5IHRoZSBvdXRzaWRlIG9mIHRoZSBvbmlvbikuCisgKgorICogTm90ZSB0aG91Z2ggdGhhdCB0aGUgZmlyc3QgYnl0ZSBpbiBhIHN0cnVjdCBzaWduYXR1cmUgaXMKKyAqICNEQlVTX1NUUlVDVF9CRUdJTl9DSEFSIHdoaWxlIHRoZSBjdXJyZW50IHR5cGUgd2lsbCBiZQorICogI0RCVVNfVFlQRV9TVFJVQ1Qgc28gaXQgaXNuJ3QgdHJ1ZSB0aGF0IHRoZSBmaXJzdCBieXRlIG9mIHRoZQorICogc2lnbmF0dXJlIGlzIGFsd2F5cyB0aGUgc2FtZSBhcyB0aGUgY3VycmVudCB0eXBlLiBBbm90aGVyCisgKiBkaWZmZXJlbmNlIGlzIHRoYXQgdGhpcyBmdW5jdGlvbiB3aWxsIHN0aWxsIHJldHVybiBhIHNpZ25hdHVyZSB3aGVuCisgKiBpbnNpZGUgYW4gZW1wdHkgYXJyYXk7IHNheSB5b3UgcmVjdXJzZSBpbnRvIGVtcHR5IGFycmF5IG9mIGludDMyLAorICogdGhlIHNpZ25hdHVyZSBpcyAiaSIgYnV0IHRoZSBjdXJyZW50IHR5cGUgd2lsbCBhbHdheXMgYmUKKyAqICNEQlVTX1RZUEVfSU5WQUxJRCBzaW5jZSB0aGVyZSBhcmUgbm8gZWxlbWVudHMgdG8gYmUgY3VycmVudGx5CisgKiBwb2ludGluZyB0by4KKyAqCisgKiBAcGFyYW0gcmVhZGVyIHRoZSByZWFkZXIKKyAqIEBwYXJhbSBzdHJfcCBwbGFjZSB0byByZXR1cm4gdGhlIHN0cmluZyB3aXRoIHRoZSB0eXBlIGluIGl0CisgKiBAcGFyYW0gc3RhcnRfcCBwbGFjZSB0byByZXR1cm4gc3RhcnQgb2YgdGhlIHR5cGUKKyAqIEBwYXJhbSBsZW5fcCBwbGFjZSB0byByZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgdHlwZQorICovCit2b2lkCitfZGJ1c190eXBlX3JlYWRlcl9nZXRfc2lnbmF0dXJlIChjb25zdCBEQnVzVHlwZVJlYWRlciAgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICAgICoqc3RyX3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgKnN0YXJ0X3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgKmxlbl9wKQoreworICAqc3RyX3AgPSByZWFkZXItPnR5cGVfc3RyOworICAqc3RhcnRfcCA9IHJlYWRlci0+dHlwZV9wb3M7CisgICpsZW5fcCA9IGZpbmRfbGVuX29mX2NvbXBsZXRlX3R5cGUgKHJlYWRlci0+dHlwZV9zdHIsIHJlYWRlci0+dHlwZV9wb3MpOworfQorCit0eXBlZGVmIHN0cnVjdAoreworICBEQnVzU3RyaW5nIHJlcGxhY2VtZW50OyAvKio8IE1hcnNoYWxlZCB2YWx1ZSBpbmNsdWRpbmcgYWxpZ25tZW50IHBhZGRpbmcgKi8KKyAgaW50IHBhZGRpbmc7ICAgICAgICAgICAgLyoqPCBIb3cgbXVjaCBvZiB0aGUgcmVwbGFjZW1lbnQgYmxvY2sgaXMgcGFkZGluZyAqLworfSBSZXBsYWNlbWVudEJsb2NrOworCitzdGF0aWMgZGJ1c19ib29sX3QKK3JlcGxhY2VtZW50X2Jsb2NrX2luaXQgKFJlcGxhY2VtZW50QmxvY2sgKmJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgICAqcmVhZGVyKQoreworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmYmxvY2stPnJlcGxhY2VtZW50KSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgLyogJSA4IGlzIHRoZSBwYWRkaW5nIHRvIGhhdmUgdGhlIHNhbWUgYWxpZ24gcHJvcGVydGllcyBpbgorICAgKiBvdXIgcmVwbGFjZW1lbnQgc3RyaW5nIGFzIHdlIGRvIGF0IHRoZSBwb3NpdGlvbiBiZWluZyByZXBsYWNlZAorICAgKi8KKyAgYmxvY2stPnBhZGRpbmcgPSByZWFkZXItPnZhbHVlX3BvcyAlIDg7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfbGVuZ3RoZW4gKCZibG9jay0+cmVwbGFjZW1lbnQsIGJsb2NrLT5wYWRkaW5nKSkKKyAgICBnb3RvIG9vbTsKKworICByZXR1cm4gVFJVRTsKKworIG9vbToKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZibG9jay0+cmVwbGFjZW1lbnQpOworICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorcmVwbGFjZW1lbnRfYmxvY2tfcmVwbGFjZSAoUmVwbGFjZW1lbnRCbG9jayAgICAgKmJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgICAgICAgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNUeXBlUmVhZGVyICpyZWFsaWduX3Jvb3QpCit7CisgIERCdXNUeXBlV3JpdGVyIHdyaXRlcjsKKyAgREJ1c1R5cGVSZWFkZXIgcmVhbGlnbl9yZWFkZXI7CisgIERCdXNMaXN0ICpmaXh1cHM7CisgIGludCBvcmlnX2xlbjsKKworICBfZGJ1c19hc3NlcnQgKHJlYWxpZ25fcm9vdCAhPSBOVUxMKTsKKworICBvcmlnX2xlbiA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmYmxvY2stPnJlcGxhY2VtZW50KTsKKworICByZWFsaWduX3JlYWRlciA9ICpyZWFsaWduX3Jvb3Q7CisKKyNpZiBSRUNVUlNJVkVfTUFSU0hBTF9XUklURV9UUkFDRQorICBfZGJ1c192ZXJib3NlICgiSU5JVElBTElaSU5HIHJlcGxhY2VtZW50IGJsb2NrIHdyaXRlciAlcCBhdCB2YWx1ZV9wb3MgJWRcbiIsCisgICAgICAgICAgICAgICAgICZ3cml0ZXIsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmYmxvY2stPnJlcGxhY2VtZW50KSk7CisjZW5kaWYKKyAgX2RidXNfdHlwZV93cml0ZXJfaW5pdF92YWx1ZXNfb25seSAoJndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhbGlnbl9yZWFkZXIuYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhbGlnbl9yZWFkZXIudHlwZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWxpZ25fcmVhZGVyLnR5cGVfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmxvY2stPnJlcGxhY2VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmJsb2NrLT5yZXBsYWNlbWVudCkpOworCisgIF9kYnVzX2Fzc2VydCAocmVhbGlnbl9yZWFkZXIudmFsdWVfcG9zIDw9IHJlYWRlci0+dmFsdWVfcG9zKTsKKworI2lmIFJFQ1VSU0lWRV9NQVJTSEFMX1dSSVRFX1RSQUNFCisgIF9kYnVzX3ZlcmJvc2UgKCJDT1BZSU5HIGZyb20gcmVhZGVyIGF0IHZhbHVlX3BvcyAlZCB0byB3cml0ZXIgJXAgc3RhcnRpbmcgYWZ0ZXIgdmFsdWVfcG9zICVkXG4iLAorICAgICAgICAgICAgICAgICByZWFsaWduX3JlYWRlci52YWx1ZV9wb3MsICZ3cml0ZXIsIHJlYWRlci0+dmFsdWVfcG9zKTsKKyNlbmRpZgorICBmaXh1cHMgPSBOVUxMOworICBpZiAoIV9kYnVzX3R5cGVfd3JpdGVyX3dyaXRlX3JlYWRlcl9wYXJ0aWFsICgmd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVhbGlnbl9yZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2stPnBhZGRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmYmxvY2stPnJlcGxhY2VtZW50KSAtIGJsb2NrLT5wYWRkaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZml4dXBzKSkKKyAgICBnb3RvIG9vbTsKKworI2lmIFJFQ1VSU0lWRV9NQVJTSEFMX1dSSVRFX1RSQUNFCisgIF9kYnVzX3ZlcmJvc2UgKCJSRVBMQUNFTUVOVCBhdCBwYWRkaW5nICVkIGxlbiAlZFxuIiwgYmxvY2stPnBhZGRpbmcsCisgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmYmxvY2stPnJlcGxhY2VtZW50KSAtIGJsb2NrLT5wYWRkaW5nKTsKKyAgX2RidXNfdmVyYm9zZV9ieXRlc19vZl9zdHJpbmcgKCZibG9jay0+cmVwbGFjZW1lbnQsIGJsb2NrLT5wYWRkaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZibG9jay0+cmVwbGFjZW1lbnQpIC0gYmxvY2stPnBhZGRpbmcpOworICBfZGJ1c192ZXJib3NlICgiVE8gQkUgUkVQTEFDRUQgYXQgdmFsdWVfcG9zID0gJWQgKGFsaWduIHBhZCAlZCkgbGVuICVkIHJlYWxpZ25fcmVhZGVyLnZhbHVlX3BvcyAlZFxuIiwKKyAgICAgICAgICAgICAgICAgcmVhZGVyLT52YWx1ZV9wb3MsIHJlYWRlci0+dmFsdWVfcG9zICUgOCwKKyAgICAgICAgICAgICAgICAgcmVhbGlnbl9yZWFkZXIudmFsdWVfcG9zIC0gcmVhZGVyLT52YWx1ZV9wb3MsCisgICAgICAgICAgICAgICAgIHJlYWxpZ25fcmVhZGVyLnZhbHVlX3Bvcyk7CisgIF9kYnVzX3ZlcmJvc2VfYnl0ZXNfb2Zfc3RyaW5nIChyZWFkZXItPnZhbHVlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci0+dmFsdWVfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhbGlnbl9yZWFkZXIudmFsdWVfcG9zIC0gcmVhZGVyLT52YWx1ZV9wb3MpOworI2VuZGlmCisKKyAgLyogTW92ZSB0aGUgcmVwbGFjZW1lbnQgaW50byBwb3NpdGlvbgorICAgKiAocmVhbGlnbl9yZWFkZXIgc2hvdWxkIG5vdyBiZSBhdCB0aGUgZW5kIG9mIHRoZSBibG9jayB0byBiZSByZXBsYWNlZCkKKyAgICovCisgIGlmICghX2RidXNfc3RyaW5nX3JlcGxhY2VfbGVuICgmYmxvY2stPnJlcGxhY2VtZW50LCBibG9jay0+cGFkZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmYmxvY2stPnJlcGxhY2VtZW50KSAtIGJsb2NrLT5wYWRkaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKERCdXNTdHJpbmcqKSByZWFkZXItPnZhbHVlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci0+dmFsdWVfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhbGlnbl9yZWFkZXIudmFsdWVfcG9zIC0gcmVhZGVyLT52YWx1ZV9wb3MpKQorICAgIGdvdG8gb29tOworCisgIC8qIFByb2Nlc3Mgb3VyIGZpeHVwcyBub3cgdGhhdCB3ZSBjYW4ndCBoYXZlIGFuIE9PTSBlcnJvciAqLworICBhcHBseV9hbmRfZnJlZV9maXh1cHMgKCZmaXh1cHMsIHJlYWRlcik7CisKKyAgcmV0dXJuIFRSVUU7CisKKyBvb206CisgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoICgmYmxvY2stPnJlcGxhY2VtZW50LCBvcmlnX2xlbik7CisgIGZyZWVfZml4dXBzICgmZml4dXBzKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgdm9pZAorcmVwbGFjZW1lbnRfYmxvY2tfZnJlZSAoUmVwbGFjZW1lbnRCbG9jayAqYmxvY2spCit7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmYmxvY2stPnJlcGxhY2VtZW50KTsKK30KKworLyogSW4gdGhlIHZhcmlhYmxlLWxlbmd0aCBjYXNlLCB3ZSBoYXZlIHRvIGZpeCBhbGlnbm1lbnQgYWZ0ZXIgd2UgaW5zZXJ0LgorICogVGhlIHN0cmF0ZWd5IGlzIGFzIGZvbGxvd3M6CisgKgorICogIC0gcGFkIGEgbmV3IHN0cmluZyB0byBoYXZlIHRoZSBzYW1lIGFsaWdubWVudCBhcyB0aGUKKyAqICAgIHN0YXJ0IG9mIHRoZSBjdXJyZW50IGJhc2ljIHZhbHVlCisgKiAgLSB3cml0ZSB0aGUgbmV3IGJhc2ljIHZhbHVlCisgKiAgLSBjb3B5IGZyb20gdGhlIG9yaWdpbmFsIHJlYWRlciB0byB0aGUgbmV3IHN0cmluZywKKyAqICAgIHdoaWNoIHdpbGwgZml4IHRoZSBhbGlnbm1lbnQgb2YgdHlwZXMgZm9sbG93aW5nCisgKiAgICB0aGUgbmV3IHZhbHVlCisgKiAgICAtIHRoaXMgY29weSBoYXMgdG8gc3RhcnQgYXQgcmVhbGlnbl9yb290LAorICogICAgICBidXQgbm90IHJlYWxseSB3cml0ZSBhbnl0aGluZyB1bnRpbCBpdAorICogICAgICBwYXNzZXMgdGhlIHZhbHVlIGJlaW5nIHNldAorICogICAgLSBhcyBhbiBvcHRpbWl6YXRpb24sIHdlIGNhbiBzdG9wIGNvcHlpbmcKKyAqICAgICAgd2hlbiB0aGUgc291cmNlIGFuZCBkZXN0IHZhbHVlcyBhcmUgYm90aAorICogICAgICBvbiBhbiA4LWJvdW5kYXJ5LCBzaW5jZSB3ZSBrbm93IGFsbCBmb2xsb3dpbmcKKyAqICAgICAgcGFkZGluZyBhbmQgYWxpZ25tZW50IHdpbGwgYmUgaWRlbnRpY2FsCisgKiAgLSBjb3B5IHRoZSBuZXcgc3RyaW5nIGJhY2sgdG8gdGhlIG9yaWdpbmFsCisgKiAgICBzdHJpbmcsIHJlcGxhY2luZyB0aGUgcmVsZXZhbnQgcGFydCBvZiB0aGUKKyAqICAgIG9yaWdpbmFsIHN0cmluZworICogIC0gbm93IGFueSBhcnJheXMgaW4gdGhlIG9yaWdpbmFsIHN0cmluZyB0aGF0CisgKiAgICBjb250YWluZWQgdGhlIHJlcGxhY2VkIHN0cmluZyBtYXkgaGF2ZSB0aGUKKyAqICAgIHdyb25nIGxlbmd0aDsgc28gd2UgaGF2ZSB0byBmaXggdGhhdAorICovCitzdGF0aWMgZGJ1c19ib29sX3QKK3JlYWRlcl9zZXRfYmFzaWNfdmFyaWFibGVfbGVuZ3RoIChEQnVzVHlwZVJlYWRlciAgICAgICAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICBjdXJyZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAgICAgICAgICAgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNUeXBlUmVhZGVyICpyZWFsaWduX3Jvb3QpCit7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgUmVwbGFjZW1lbnRCbG9jayBibG9jazsKKyAgREJ1c1R5cGVXcml0ZXIgd3JpdGVyOworCisgIF9kYnVzX2Fzc2VydCAocmVhbGlnbl9yb290ICE9IE5VTEwpOworCisgIHJldHZhbCA9IEZBTFNFOworCisgIGlmICghcmVwbGFjZW1lbnRfYmxvY2tfaW5pdCAoJmJsb2NrLCByZWFkZXIpKQorICAgIHJldHVybiBGQUxTRTsKKworICAvKiBXcml0ZSB0aGUgbmV3IGJhc2ljIHZhbHVlICovCisjaWYgUkVDVVJTSVZFX01BUlNIQUxfV1JJVEVfVFJBQ0UKKyAgX2RidXNfdmVyYm9zZSAoIklOSVRJQUxJWklORyB3cml0ZXIgJXAgdG8gd3JpdGUgYmFzaWMgdmFsdWUgYXQgdmFsdWVfcG9zICVkIG9mIHJlcGxhY2VtZW50IHN0cmluZ1xuIiwKKyAgICAgICAgICAgICAgICAgJndyaXRlciwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZibG9jay5yZXBsYWNlbWVudCkpOworI2VuZGlmCisgIF9kYnVzX3R5cGVfd3JpdGVyX2luaXRfdmFsdWVzX29ubHkgKCZ3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci0+Ynl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLT50eXBlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLT50eXBlX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJsb2NrLnJlcGxhY2VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmJsb2NrLnJlcGxhY2VtZW50KSk7CisjaWYgUkVDVVJTSVZFX01BUlNIQUxfV1JJVEVfVFJBQ0UKKyAgX2RidXNfdmVyYm9zZSAoIldSSVRJTkcgYmFzaWMgdmFsdWUgdG8gd3JpdGVyICVwIChyZXBsYWNlbWVudCBzdHJpbmcpXG4iLCAmd3JpdGVyKTsKKyNlbmRpZgorICBpZiAoIV9kYnVzX3R5cGVfd3JpdGVyX3dyaXRlX2Jhc2ljICgmd3JpdGVyLCBjdXJyZW50X3R5cGUsIHZhbHVlKSkKKyAgICBnb3RvIG91dDsKKworICBpZiAoIXJlcGxhY2VtZW50X2Jsb2NrX3JlcGxhY2UgKCZibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhbGlnbl9yb290KSkKKyAgICBnb3RvIG91dDsKKworICByZXR2YWwgPSBUUlVFOworCisgb3V0OgorICByZXBsYWNlbWVudF9ibG9ja19mcmVlICgmYmxvY2spOworICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdm9pZAorcmVhZGVyX3NldF9iYXNpY19maXhlZF9sZW5ndGggKERCdXNUeXBlUmVhZGVyICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGN1cnJlbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICAgICAqdmFsdWUpCit7CisgIF9kYnVzX21hcnNoYWxfc2V0X2Jhc2ljICgoREJ1c1N0cmluZyopIHJlYWRlci0+dmFsdWVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLT52YWx1ZV9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci0+Ynl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwpOworfQorCisvKioKKyAqIFNldHMgYSBuZXcgdmFsdWUgZm9yIHRoZSBiYXNpYyB0eXBlIHZhbHVlIHBvaW50ZWQgdG8gYnkgdGhlIHJlYWRlciwKKyAqIGxlYXZpbmcgdGhlIHJlYWRlciB2YWxpZCB0byBjb250aW51ZSByZWFkaW5nLiBBbnkgb3RoZXIgcmVhZGVycworICogd2lsbCBiZSBpbnZhbGlkYXRlZCBpZiB5b3Ugc2V0IGEgdmFyaWFibGUtbGVuZ3RoIHR5cGUgc3VjaCBhcyBhCisgKiBzdHJpbmcuCisgKgorICogVGhlIHByb3ZpZGVkIHJlYWxpZ25fcm9vdCBpcyB0aGUgcmVhZGVyIHRvIHN0YXJ0IGZyb20gd2hlbgorICogcmVhbGlnbmluZyB0aGUgZGF0YSB0aGF0IGZvbGxvd3MgdGhlIG5ld2x5LXNldCB2YWx1ZS4gVGhlIHJlYWRlcgorICogcGFyYW1ldGVyIG11c3QgcG9pbnQgdG8gYSB2YWx1ZSBiZWxvdyB0aGUgcmVhbGlnbl9yb290IHBhcmFtZXRlci4KKyAqIElmIHRoZSB0eXBlIGJlaW5nIHNldCBpcyBmaXhlZC1sZW5ndGgsIHRoZW4gcmVhbGlnbl9yb290IG1heSBiZQorICogI05VTEwuIE9ubHkgdmFsdWVzIHJlYWNoYWJsZSBmcm9tIHJlYWxpZ25fcm9vdCB3aWxsIGJlIHJlYWxpZ25lZCwKKyAqIHNvIGlmIHlvdXIgc3RyaW5nIGNvbnRhaW5zIG90aGVyIHZhbHVlcyB5b3Ugd2lsbCBuZWVkIHRvIGRlYWwgd2l0aAorICogdGhvc2Ugc29tZWhvdyB5b3Vyc2VsZi4gSXQgaXMgT0sgaWYgcmVhbGlnbl9yb290IGlzIHRoZSBzYW1lCisgKiByZWFkZXIgYXMgdGhlIHJlYWRlciBwYXJhbWV0ZXIsIHRob3VnaCBpZiB5b3UgYXJlbid0IHNldHRpbmcgdGhlCisgKiByb290IGl0IG1heSBub3QgYmUgc3VjaCBhIGdvb2QgaWRlYS4KKyAqCisgKiBAdG9kbyBEQnVzVHlwZVJlYWRlciBjdXJyZW50bHkgdGFrZXMgImNvbnN0IiB2ZXJzaW9ucyBvZiB0aGUgdHlwZQorICogYW5kIHZhbHVlIHN0cmluZ3MsIGFuZCB0aGlzIGZ1bmN0aW9uIG1vZGlmaWVzIHRob3NlIHN0cmluZ3MgYnkKKyAqIGNhc3RpbmcgYXdheSB0aGUgY29uc3QsIHdoaWNoIGlzIG9mIGNvdXJzZSBiYWQgaWYgd2Ugd2FudCB0byBnZXQKKyAqIHBpY2t5LiAoVG8gYmUgdHJ1bHkgY2xlYW4geW91J2QgaGF2ZSBhbiBvYmplY3Qgd2hpY2ggY29udGFpbmVkIHRoZQorICogdHlwZSBhbmQgdmFsdWUgc3RyaW5ncyBhbmQgc2V0X2Jhc2ljIHdvdWxkIGJlIGEgbWV0aG9kIG9uIHRoYXQKKyAqIG9iamVjdC4uLiB0aGlzIHdvdWxkIGFsc28gbWFrZSBEQnVzVHlwZVJlYWRlciB0aGUgc2FtZSB0aGluZyBhcworICogREJ1c1R5cGVNYXJrLiBCdXQgc2luY2UgREJ1c01lc3NhZ2UgaXMgZWZmZWN0aXZlbHkgdGhhdCBvYmplY3QgZm9yCisgKiBELUJ1cyBpdCBkb2Vzbid0IHNlZW0gd29ydGggY3JlYXRpbmcgc29tZSByYW5kb20gb2JqZWN0LikKKyAqCisgKiBAdG9kbyBvcHRpbWl6ZSB0aGlzIGJ5IG9ubHkgcmV3cml0aW5nIHVudGlsIHRoZSBvbGQgYW5kIG5ldyB2YWx1ZXMKKyAqIGFyZSBhdCB0aGUgc2FtZSBhbGlnbm1lbnQuIEZyZXF1ZW50bHkgdGhpcyBzaG91bGQgcmVzdWx0IGluIG9ubHkKKyAqIHJlcGxhY2luZyB0aGUgdmFsdWUgdGhhdCdzIGltbWVkaWF0ZWx5IGF0IGhhbmQuCisgKgorICogQHBhcmFtIHJlYWRlciByZWFkZXIgaW5kaWNhdGluZyB3aGVyZSB0byBzZXQgYSBuZXcgdmFsdWUKKyAqIEBwYXJhbSB2YWx1ZSBhZGRyZXNzIG9mIHRoZSB2YWx1ZSB0byBzZXQKKyAqIEBwYXJhbSByZWFsaWduX3Jvb3QgcmVhbGlnbiBmcm9tIGhlcmUKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBub3QgZW5vdWdoIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfdHlwZV9yZWFkZXJfc2V0X2Jhc2ljIChEQnVzVHlwZVJlYWRlciAgICAgICAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICAgICAgICAgICAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNUeXBlUmVhZGVyICpyZWFsaWduX3Jvb3QpCit7CisgIGludCBjdXJyZW50X3R5cGU7CisKKyAgX2RidXNfYXNzZXJ0ICghcmVhZGVyLT5rbGFzcy0+dHlwZXNfb25seSk7CisgIF9kYnVzX2Fzc2VydCAocmVhZGVyLT52YWx1ZV9zdHIgPT0gcmVhbGlnbl9yb290LT52YWx1ZV9zdHIpOworICBfZGJ1c19hc3NlcnQgKHJlYWRlci0+dmFsdWVfcG9zID49IHJlYWxpZ25fcm9vdC0+dmFsdWVfcG9zKTsKKworICBjdXJyZW50X3R5cGUgPSBfZGJ1c190eXBlX3JlYWRlcl9nZXRfY3VycmVudF90eXBlIChyZWFkZXIpOworCisjaWYgUkVDVVJTSVZFX01BUlNIQUxfV1JJVEVfVFJBQ0UKKyAgX2RidXNfdmVyYm9zZSAoIiAgU0VUIEJBU0lDIHR5cGUgcmVhZGVyICVwIHR5cGVfcG9zID0gJWQgdmFsdWVfcG9zID0gJWQgcmVtYWluaW5nIHNpZyAnJXMnIHJlYWxpZ25fcm9vdCA9ICVwIHdpdGggdmFsdWVfcG9zICVkIGN1cnJlbnRfdHlwZSA9ICVzXG4iLAorICAgICAgICAgICAgICAgICByZWFkZXIsIHJlYWRlci0+dHlwZV9wb3MsIHJlYWRlci0+dmFsdWVfcG9zLAorICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuIChyZWFkZXItPnR5cGVfc3RyLCByZWFkZXItPnR5cGVfcG9zLCAwKSwKKyAgICAgICAgICAgICAgICAgcmVhbGlnbl9yb290LAorICAgICAgICAgICAgICAgICByZWFsaWduX3Jvb3QgPyByZWFsaWduX3Jvb3QtPnZhbHVlX3BvcyA6IC0xLAorICAgICAgICAgICAgICAgICBfZGJ1c190eXBlX3RvX3N0cmluZyAoY3VycmVudF90eXBlKSk7CisgIF9kYnVzX3ZlcmJvc2VfYnl0ZXNfb2Zfc3RyaW5nIChyZWFsaWduX3Jvb3QtPnZhbHVlX3N0ciwgcmVhbGlnbl9yb290LT52YWx1ZV9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAocmVhbGlnbl9yb290LT52YWx1ZV9zdHIpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWxpZ25fcm9vdC0+dmFsdWVfcG9zKTsKKyNlbmRpZgorCisgIF9kYnVzX2Fzc2VydCAoZGJ1c190eXBlX2lzX2Jhc2ljIChjdXJyZW50X3R5cGUpKTsKKworICBpZiAoZGJ1c190eXBlX2lzX2ZpeGVkIChjdXJyZW50X3R5cGUpKQorICAgIHsKKyAgICAgIHJlYWRlcl9zZXRfYmFzaWNfZml4ZWRfbGVuZ3RoIChyZWFkZXIsIGN1cnJlbnRfdHlwZSwgdmFsdWUpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0IChyZWFsaWduX3Jvb3QgIT0gTlVMTCk7CisgICAgICByZXR1cm4gcmVhZGVyX3NldF9iYXNpY192YXJpYWJsZV9sZW5ndGggKHJlYWRlciwgY3VycmVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSwgcmVhbGlnbl9yb290KTsKKyAgICB9Cit9CisKKy8qKgorICogUmVjdXJzaXZlbHkgZGVsZXRlcyBhbnkgdmFsdWUgcG9pbnRlZCB0byBieSB0aGUgcmVhZGVyLCBsZWF2aW5nIHRoZQorICogcmVhZGVyIHZhbGlkIHRvIGNvbnRpbnVlIHJlYWRpbmcuIEFueSBvdGhlciByZWFkZXJzIHdpbGwgYmUKKyAqIGludmFsaWRhdGVkLgorICoKKyAqIFRoZSBwcm92aWRlZCByZWFsaWduX3Jvb3QgaXMgdGhlIHJlYWRlciB0byBzdGFydCBmcm9tIHdoZW4KKyAqIHJlYWxpZ25pbmcgdGhlIGRhdGEgdGhhdCBmb2xsb3dzIHRoZSBuZXdseS1zZXQgdmFsdWUuCisgKiBTZWUgX2RidXNfdHlwZV9yZWFkZXJfc2V0X2Jhc2ljKCkgZm9yIG1vcmUgZGV0YWlscyBvbiB0aGUKKyAqIHJlYWxpZ25fcm9vdCBwYXJhbXRlci4KKyAqCisgKiBAdG9kbyBmb3Igbm93IHRoaXMgZG9lcyBub3QgZGVsZXRlIHRoZSB0eXBlY29kZXMgYXNzb2NpYXRlZCB3aXRoCisgKiB0aGUgdmFsdWUsIHNvIHRoaXMgZnVuY3Rpb24gc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgYXJyYXkgZWxlbWVudHMuCisgKgorICogQHBhcmFtIHJlYWRlciByZWFkZXIgaW5kaWNhdGluZyB3aGVyZSB0byBkZWxldGUgYSB2YWx1ZQorICogQHBhcmFtIHJlYWxpZ25fcm9vdCByZWFsaWduIGZyb20gaGVyZQorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vdCBlbm91Z2ggbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c190eXBlX3JlYWRlcl9kZWxldGUgKERCdXNUeXBlUmVhZGVyICAgICAgICAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzVHlwZVJlYWRlciAgKnJlYWxpZ25fcm9vdCkKK3sKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICBSZXBsYWNlbWVudEJsb2NrIGJsb2NrOworCisgIF9kYnVzX2Fzc2VydCAocmVhbGlnbl9yb290ICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKHJlYWRlci0+a2xhc3MgPT0gJmFycmF5X3JlYWRlcl9jbGFzcyk7CisKKyAgcmV0dmFsID0gRkFMU0U7CisKKyAgaWYgKCFyZXBsYWNlbWVudF9ibG9ja19pbml0ICgmYmxvY2ssIHJlYWRlcikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghcmVwbGFjZW1lbnRfYmxvY2tfcmVwbGFjZSAoJmJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFsaWduX3Jvb3QpKQorICAgIGdvdG8gb3V0OworCisgIHJldHZhbCA9IFRSVUU7CisKKyBvdXQ6CisgIHJlcGxhY2VtZW50X2Jsb2NrX2ZyZWUgKCZibG9jayk7CisgIHJldHVybiByZXR2YWw7Cit9CisKKy8qCisgKiBDb21wYXJlcyB0d28gcmVhZGVycywgd2hpY2ggbXVzdCBiZSBpdGVyYXRpbmcgb3ZlciB0aGUgc2FtZSB2YWx1ZSBkYXRhLgorICogUmV0dXJucyAjVFJVRSBpZiB0aGUgZmlyc3QgcGFyYW1ldGVyIGlzIGZ1cnRoZXIgYWxvbmcgdGhhbiB0aGUgc2Vjb25kIHBhcmFtZXRlci4KKyAqCisgKiBAcGFyYW0gbGhzIGxlZnQtaGFuZC1zaWRlIChmaXJzdCkgcGFyYW1ldGVyCisgKiBAcGFyYW0gcmhzIGxlZnQtaGFuZC1zaWRlIChmaXJzdCkgcGFyYW1ldGVyCisgKiBAcmV0dXJucyB3aGV0aGVyIGxocyBpcyBncmVhdGVyIHRoYW4gcmhzCisgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAorX2RidXNfdHlwZV9yZWFkZXJfZ3JlYXRlcl90aGFuIChjb25zdCBEQnVzVHlwZVJlYWRlciAgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1R5cGVSZWFkZXIgICpyaHMpCit7CisgIF9kYnVzX2Fzc2VydCAobGhzLT52YWx1ZV9zdHIgPT0gcmhzLT52YWx1ZV9zdHIpOworCisgIHJldHVybiBsaHMtPnZhbHVlX3BvcyA+IHJocy0+dmFsdWVfcG9zOworfQorCisvKgorICoKKyAqCisgKiAgICAgICAgIERCdXNUeXBlV3JpdGVyCisgKgorICoKKyAqCisgKi8KKworLyoqCisgKiBJbml0aWFsaXplIGEgd3JpdGUgaXRlcmF0b3IsIHdoaWNoIGlzIHVzZWQgdG8gd3JpdGUgb3V0IHZhbHVlcyBpbgorICogc2VyaWFsaXplZCBELUJ1cyBmb3JtYXQuCisgKgorICogVGhlIHR5cGVfcG9zIHBhc3NlZCBpbiBpcyBleHBlY3RlZCB0byBiZSBpbnNpZGUgYW4gYWxyZWFkeS12YWxpZCwKKyAqIHRob3VnaCBwb3RlbnRpYWxseSBlbXB0eSwgdHlwZSBzaWduYXR1cmUuIFRoaXMgbWVhbnMgdGhhdCB0aGUgYnl0ZQorICogYWZ0ZXIgdHlwZV9wb3MgbXVzdCBiZSBlaXRoZXIgI0RCVVNfVFlQRV9JTlZBTElEIChha2EgbnVsKSBvciBzb21lCisgKiBvdGhlciB2YWxpZCB0eXBlLiAjREJ1c1R5cGVXcml0ZXIgd29uJ3QgZW5mb3JjZSB0aGF0IHRoZSBzaWduYXR1cmUKKyAqIGlzIGFscmVhZHkgdmFsaWQgKHlvdSBjYW4gYXBwZW5kIHRoZSBudWwgYnl0ZSBhdCB0aGUgZW5kIGlmIHlvdQorICogbGlrZSksIGJ1dCBqdXN0IGJlIGF3YXJlIHRoYXQgeW91IG5lZWQgdGhlIG51bCBieXRlIGV2ZW50dWFsbHkgYW5kCisgKiAjREJ1c1R5cGVXcml0ZXIgaXNuJ3QgZ29pbmcgdG8gd3JpdGUgaXQgZm9yIHlvdS4KKyAqCisgKiBAcGFyYW0gd3JpdGVyIHRoZSB3cml0ZXIgdG8gaW5pdAorICogQHBhcmFtIGJ5dGVfb3JkZXIgdGhlIGJ5dGUgb3JkZXIgdG8gbWFyc2hhbCBpbnRvCisgKiBAcGFyYW0gdHlwZV9zdHIgdGhlIHN0cmluZyB0byB3cml0ZSB0eXBlY29kZXMgaW50bworICogQHBhcmFtIHR5cGVfcG9zIHdoZXJlIHRvIGluc2VydCB0eXBlY29kZXMKKyAqIEBwYXJhbSB2YWx1ZV9zdHIgdGhlIHN0cmluZyB0byB3cml0ZSB2YWx1ZXMgaW50bworICogQHBhcmFtIHZhbHVlX3BvcyB3aGVyZSB0byBpbnNlcnQgdmFsdWVzCisgKgorICovCit2b2lkCitfZGJ1c190eXBlX3dyaXRlcl9pbml0IChEQnVzVHlwZVdyaXRlciAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAqdHlwZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgdHlwZV9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAqdmFsdWVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHZhbHVlX3BvcykKK3sKKyAgd3JpdGVyLT5ieXRlX29yZGVyID0gYnl0ZV9vcmRlcjsKKyAgd3JpdGVyLT50eXBlX3N0ciA9IHR5cGVfc3RyOworICB3cml0ZXItPnR5cGVfcG9zID0gdHlwZV9wb3M7CisgIHdyaXRlci0+dmFsdWVfc3RyID0gdmFsdWVfc3RyOworICB3cml0ZXItPnZhbHVlX3BvcyA9IHZhbHVlX3BvczsKKyAgd3JpdGVyLT5jb250YWluZXJfdHlwZSA9IERCVVNfVFlQRV9JTlZBTElEOworICB3cml0ZXItPnR5cGVfcG9zX2lzX2V4cGVjdGF0aW9uID0gRkFMU0U7CisgIHdyaXRlci0+ZW5hYmxlZCA9IFRSVUU7CisKKyNpZiBSRUNVUlNJVkVfTUFSU0hBTF9XUklURV9UUkFDRQorICBfZGJ1c192ZXJib3NlICgid3JpdGVyICVwIGluaXQgcmVtYWluaW5nIHNpZyAnJXMnXG4iLCB3cml0ZXIsCisgICAgICAgICAgICAgICAgIHdyaXRlci0+dHlwZV9zdHIgPworICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuICh3cml0ZXItPnR5cGVfc3RyLCB3cml0ZXItPnR5cGVfcG9zLCAwKSA6CisgICAgICAgICAgICAgICAgICJ1bmtub3duIik7CisjZW5kaWYKK30KKworLyoqCisgKiBJbml0aWFsaXplIGEgd3JpdGUgaXRlcmF0b3IsIHdpdGggdGhlIHNpZ25hdHVyZSB0byBiZSBwcm92aWRlZAorICogbGF0ZXIuCisgKgorICogQHBhcmFtIHdyaXRlciB0aGUgd3JpdGVyIHRvIGluaXQKKyAqIEBwYXJhbSBieXRlX29yZGVyIHRoZSBieXRlIG9yZGVyIHRvIG1hcnNoYWwgaW50bworICogQHBhcmFtIHZhbHVlX3N0ciB0aGUgc3RyaW5nIHRvIHdyaXRlIHZhbHVlcyBpbnRvCisgKiBAcGFyYW0gdmFsdWVfcG9zIHdoZXJlIHRvIGluc2VydCB2YWx1ZXMKKyAqCisgKi8KK3ZvaWQKK19kYnVzX3R5cGVfd3JpdGVyX2luaXRfdHlwZXNfZGVsYXllZCAoREJ1c1R5cGVXcml0ZXIgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICp2YWx1ZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICB2YWx1ZV9wb3MpCit7CisgIF9kYnVzX3R5cGVfd3JpdGVyX2luaXQgKHdyaXRlciwgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgdmFsdWVfc3RyLCB2YWx1ZV9wb3MpOworfQorCisvKioKKyAqIEFkZHMgdHlwZSBzdHJpbmcgdG8gdGhlIHdyaXRlciwgaWYgaXQgaGFkIG5vbmUuCisgKgorICogQHBhcmFtIHdyaXRlciB0aGUgd3JpdGVyIHRvIGluaXQKKyAqIEBwYXJhbSB0eXBlX3N0ciB0eXBlIHN0cmluZyB0byBhZGQKKyAqIEBwYXJhbSB0eXBlX3BvcyB0eXBlIHBvc2l0aW9uCisgKgorICovCit2b2lkCitfZGJ1c190eXBlX3dyaXRlcl9hZGRfdHlwZXMgKERCdXNUeXBlV3JpdGVyICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICp0eXBlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHR5cGVfcG9zKQoreworICBpZiAod3JpdGVyLT50eXBlX3N0ciA9PSBOVUxMKSAvKiBrZWVwcyB1cyBmcm9tIHVzaW5nIHRoaXMgYXMgc2V0dGVyICovCisgICAgeworICAgICAgd3JpdGVyLT50eXBlX3N0ciA9IHR5cGVfc3RyOworICAgICAgd3JpdGVyLT50eXBlX3BvcyA9IHR5cGVfcG9zOworICAgIH0KK30KKworLyoqCisgKiBSZW1vdmVzIHR5cGUgc3RyaW5nIGZyb20gdGhlIHdyaXRlci4KKyAqCisgKiBAcGFyYW0gd3JpdGVyIHRoZSB3cml0ZXIgdG8gcmVtb3ZlIGZyb20KKyAqLwordm9pZAorX2RidXNfdHlwZV93cml0ZXJfcmVtb3ZlX3R5cGVzIChEQnVzVHlwZVdyaXRlciAqd3JpdGVyKQoreworICB3cml0ZXItPnR5cGVfc3RyID0gTlVMTDsKKyAgd3JpdGVyLT50eXBlX3BvcyA9IC0xOworfQorCisvKioKKyAqIExpa2UgX2RidXNfdHlwZV93cml0ZXJfaW5pdCgpLCBleGNlcHQgdGhlIHR5cGUgc3RyaW5nCisgKiBwYXNzZWQgaW4gc2hvdWxkIGNvcnJlc3BvbmQgdG8gYW4gZXhpc3Rpbmcgc2lnbmF0dXJlIHRoYXQKKyAqIG1hdGNoZXMgd2hhdCB5b3UncmUgZ29pbmcgdG8gd3JpdGUgb3V0LiBUaGUgd3JpdGVyIHdpbGwKKyAqIGNoZWNrIHdoYXQgeW91IHdyaXRlIHZzLiB0aGlzIGV4aXN0aW5nIHNpZ25hdHVyZS4KKyAqCisgKiBAcGFyYW0gd3JpdGVyIHRoZSB3cml0ZXIgdG8gaW5pdAorICogQHBhcmFtIGJ5dGVfb3JkZXIgdGhlIGJ5dGUgb3JkZXIgdG8gbWFyc2hhbCBpbnRvCisgKiBAcGFyYW0gdHlwZV9zdHIgdGhlIHN0cmluZyB3aXRoIHNpZ25hdHVyZQorICogQHBhcmFtIHR5cGVfcG9zIHN0YXJ0IG9mIHNpZ25hdHVyZQorICogQHBhcmFtIHZhbHVlX3N0ciB0aGUgc3RyaW5nIHRvIHdyaXRlIHZhbHVlcyBpbnRvCisgKiBAcGFyYW0gdmFsdWVfcG9zIHdoZXJlIHRvIGluc2VydCB2YWx1ZXMKKyAqCisgKi8KK3ZvaWQKK19kYnVzX3R5cGVfd3JpdGVyX2luaXRfdmFsdWVzX29ubHkgKERCdXNUeXBlV3JpdGVyICAgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICp0eXBlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHR5cGVfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAqdmFsdWVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgdmFsdWVfcG9zKQoreworICBfZGJ1c190eXBlX3dyaXRlcl9pbml0ICh3cml0ZXIsIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChEQnVzU3RyaW5nKil0eXBlX3N0ciwgdHlwZV9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3N0ciwgdmFsdWVfcG9zKTsKKworICB3cml0ZXItPnR5cGVfcG9zX2lzX2V4cGVjdGF0aW9uID0gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitfZGJ1c190eXBlX3dyaXRlcl93cml0ZV9iYXNpY19ub190eXBlY29kZSAoREJ1c1R5cGVXcml0ZXIgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICAgICAqdmFsdWUpCit7CisgIGlmICh3cml0ZXItPmVuYWJsZWQpCisgICAgcmV0dXJuIF9kYnVzX21hcnNoYWxfd3JpdGVfYmFzaWMgKHdyaXRlci0+dmFsdWVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXItPnZhbHVlX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci0+Ynl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndyaXRlci0+dmFsdWVfcG9zKTsKKyAgZWxzZQorICAgIHJldHVybiBUUlVFOworfQorCisvKiBJZiBvdXIgcGFyZW50IGlzIGFuIGFycmF5LCB0aGluZ3MgYXJlIGEgbGl0dGxlIGJpdCBjb21wbGljYXRlZC4KKyAqCisgKiBUaGUgcGFyZW50IG11c3QgaGF2ZSBhIGNvbXBsZXRlIGVsZW1lbnQgdHlwZSwgc3VjaCBhcworICogImkiIG9yICJhYWkiIG9yICIoaWkpIiBvciAiYShpaSkiLiBUaGVyZSBjYW4ndCBiZQorICogdW5jbG9zZWQgcGFyZW5zLCBvciBhbiAiYSIgd2l0aCBubyBmb2xsb3dpbmcgdHlwZS4KKyAqCisgKiBUbyByZWN1cnNlLCB0aGUgb25seSBhbGxvd2VkIG9wZXJhdGlvbiBpcyB0byByZWN1cnNlIGludG8gdGhlCisgKiBmaXJzdCB0eXBlIGluIHRoZSBlbGVtZW50IHR5cGUuIFNvIGZvciAiaSIgeW91IGNhbid0IHJlY3Vyc2UsIGZvcgorICogImFpIiB5b3UgY2FuIHJlY3Vyc2UgaW50byB0aGUgYXJyYXksIGZvciAiKGlpKSIgeW91IGNhbiByZWN1cnNlCisgKiBpbnRvIHRoZSBzdHJ1Y3QuCisgKgorICogSWYgeW91IHJlY3Vyc2UgaW50byB0aGUgYXJyYXkgZm9yICJhaSIsIHRoZW4geW91IG11c3Qgc3BlY2lmeQorICogImkiIGZvciB0aGUgZWxlbWVudCB0eXBlIG9mIHRoZSBhcnJheSB5b3UgcmVjdXJzZSBpbnRvLgorICoKKyAqIFdoaWxlIGluc2lkZSBhbiBhcnJheSBhdCBhbnkgbGV2ZWwsIHdlIG5lZWQgdG8gYXZvaWQgd3JpdGluZyB0bworICogdHlwZV9zdHIsIHNpbmNlIHRoZSB0eXBlIG9ubHkgYXBwZWFycyBvbmNlIGZvciB0aGUgd2hvbGUgYXJyYXksCisgKiBpdCBkb2VzIG5vdCBhcHBlYXIgZm9yIGVhY2ggYXJyYXkgZWxlbWVudC4KKyAqCisgKiBXaGlsZSBpbnNpZGUgYW4gYXJyYXkgdHlwZV9wb3MgcG9pbnRzIHRvIHRoZSBleHBlY3RlZCBuZXh0CisgKiB0eXBlY29kZSwgcmF0aGVyIHRoYW4gdGhlIG5leHQgcGxhY2Ugd2UgY291bGQgd3JpdGUgYSB0eXBlY29kZS4KKyAqLworc3RhdGljIHZvaWQKK3dyaXRlcl9yZWN1cnNlX2luaXRfYW5kX2NoZWNrIChEQnVzVHlwZVdyaXRlciAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBjb250YWluZXJfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVdyaXRlciAqc3ViKQoreworICBfZGJ1c190eXBlX3dyaXRlcl9pbml0IChzdWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci0+Ynl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLT50eXBlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLT50eXBlX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLT52YWx1ZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci0+dmFsdWVfcG9zKTsKKworICBzdWItPmNvbnRhaW5lcl90eXBlID0gY29udGFpbmVyX3R5cGU7CisKKyAgaWYgKHdyaXRlci0+dHlwZV9wb3NfaXNfZXhwZWN0YXRpb24gfHwKKyAgICAgIChzdWItPmNvbnRhaW5lcl90eXBlID09IERCVVNfVFlQRV9BUlJBWSB8fCBzdWItPmNvbnRhaW5lcl90eXBlID09IERCVVNfVFlQRV9WQVJJQU5UKSkKKyAgICBzdWItPnR5cGVfcG9zX2lzX2V4cGVjdGF0aW9uID0gVFJVRTsKKyAgZWxzZQorICAgIHN1Yi0+dHlwZV9wb3NfaXNfZXhwZWN0YXRpb24gPSBGQUxTRTsKKworICBzdWItPmVuYWJsZWQgPSB3cml0ZXItPmVuYWJsZWQ7CisKKyNpZm5kZWYgREJVU19ESVNBQkxFX0NIRUNLUworICBpZiAod3JpdGVyLT50eXBlX3Bvc19pc19leHBlY3RhdGlvbiAmJiB3cml0ZXItPnR5cGVfc3RyKQorICAgIHsKKyAgICAgIGludCBleHBlY3RlZDsKKworICAgICAgZXhwZWN0ZWQgPSBfZGJ1c19maXJzdF90eXBlX2luX3NpZ25hdHVyZSAod3JpdGVyLT50eXBlX3N0ciwgd3JpdGVyLT50eXBlX3Bvcyk7CisKKyAgICAgIGlmIChleHBlY3RlZCAhPSBzdWItPmNvbnRhaW5lcl90eXBlKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGV4cGVjdGVkICE9IERCVVNfVFlQRV9JTlZBTElEKQorICAgICAgICAgICAgX2RidXNfd2Fybl9jaGVja19mYWlsZWQgKCJXcml0aW5nIGFuIGVsZW1lbnQgb2YgdHlwZSAlcywgYnV0IHRoZSBleHBlY3RlZCB0eXBlIGhlcmUgaXMgJXNcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlIG92ZXJhbGwgc2lnbmF0dXJlIGV4cGVjdGVkIGhlcmUgd2FzICclcycgYW5kIHdlIGFyZSBvbiBieXRlICVkIG9mIHRoYXQgc2lnbmF0dXJlLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfdHlwZV90b19zdHJpbmcgKHN1Yi0+Y29udGFpbmVyX3R5cGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3R5cGVfdG9fc3RyaW5nIChleHBlY3RlZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICh3cml0ZXItPnR5cGVfc3RyKSwgd3JpdGVyLT50eXBlX3Bvcyk7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgX2RidXNfd2Fybl9jaGVja19mYWlsZWQgKCJXcml0aW5nIGFuIGVsZW1lbnQgb2YgdHlwZSAlcywgYnV0IG5vIHZhbHVlIGlzIGV4cGVjdGVkIGhlcmVcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlIG92ZXJhbGwgc2lnbmF0dXJlIGV4cGVjdGVkIGhlcmUgd2FzICclcycgYW5kIHdlIGFyZSBvbiBieXRlICVkIG9mIHRoYXQgc2lnbmF0dXJlLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfdHlwZV90b19zdHJpbmcgKHN1Yi0+Y29udGFpbmVyX3R5cGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAod3JpdGVyLT50eXBlX3N0ciksIHdyaXRlci0+dHlwZV9wb3MpOworICAgICAgICAgIAorICAgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImJhZCBhcnJheSBlbGVtZW50IG9yIHZhcmlhbnQgY29udGVudCB3cml0dGVuIik7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogREJVU19ESVNBQkxFX0NIRUNLUyAqLworCisjaWYgUkVDVVJTSVZFX01BUlNIQUxfV1JJVEVfVFJBQ0UKKyAgX2RidXNfdmVyYm9zZSAoIiAgdHlwZSB3cml0ZXIgJXAgcmVjdXJzZSBwYXJlbnQgJXMgdHlwZV9wb3MgPSAlZCB2YWx1ZV9wb3MgPSAlZCBpc19leHBlY3RhdGlvbiA9ICVkIHJlbWFpbmluZyBzaWcgJyVzJyBlbmFibGVkID0gJWRcbiIsCisgICAgICAgICAgICAgICAgIHdyaXRlciwKKyAgICAgICAgICAgICAgICAgX2RidXNfdHlwZV90b19zdHJpbmcgKHdyaXRlci0+Y29udGFpbmVyX3R5cGUpLAorICAgICAgICAgICAgICAgICB3cml0ZXItPnR5cGVfcG9zLCB3cml0ZXItPnZhbHVlX3Bvcywgd3JpdGVyLT50eXBlX3Bvc19pc19leHBlY3RhdGlvbiwKKyAgICAgICAgICAgICAgICAgd3JpdGVyLT50eXBlX3N0ciA/CisgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YV9sZW4gKHdyaXRlci0+dHlwZV9zdHIsIHdyaXRlci0+dHlwZV9wb3MsIDApIDoKKyAgICAgICAgICAgICAgICAgInVua25vd24iLAorICAgICAgICAgICAgICAgICB3cml0ZXItPmVuYWJsZWQpOworICBfZGJ1c192ZXJib3NlICgiICB0eXBlIHdyaXRlciAlcCByZWN1cnNlIHN1YiAlcyAgIHR5cGVfcG9zID0gJWQgdmFsdWVfcG9zID0gJWQgaXNfZXhwZWN0YXRpb24gPSAlZCBlbmFibGVkID0gJWRcbiIsCisgICAgICAgICAgICAgICAgIHN1YiwKKyAgICAgICAgICAgICAgICAgX2RidXNfdHlwZV90b19zdHJpbmcgKHN1Yi0+Y29udGFpbmVyX3R5cGUpLAorICAgICAgICAgICAgICAgICBzdWItPnR5cGVfcG9zLCBzdWItPnZhbHVlX3BvcywKKyAgICAgICAgICAgICAgICAgc3ViLT50eXBlX3Bvc19pc19leHBlY3RhdGlvbiwKKyAgICAgICAgICAgICAgICAgc3ViLT5lbmFibGVkKTsKKyNlbmRpZgorfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3dyaXRlX29yX3ZlcmlmeV90eXBlY29kZSAoREJ1c1R5cGVXcml0ZXIgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHR5cGVjb2RlKQoreworICAvKiBBIHN1YndyaXRlciBpbnNpZGUgYW4gYXJyYXkgb3IgdmFyaWFudCB3aWxsIGhhdmUgdHlwZV9wb3MKKyAgICogcG9pbnRpbmcgdG8gdGhlIGV4cGVjdGVkIHR5cGVjb2RlOyBhIHdyaXRlciBub3QgaW5zaWRlIGFuIGFycmF5CisgICAqIG9yIHZhcmlhbnQgaGFzIHR5cGVfcG9zIHBvaW50aW5nIHRvIHRoZSBuZXh0IHBsYWNlIHRvIGluc2VydCBhCisgICAqIHR5cGVjb2RlLgorICAgKi8KKyNpZiBSRUNVUlNJVkVfTUFSU0hBTF9XUklURV9UUkFDRQorICBfZGJ1c192ZXJib3NlICgiICB0eXBlIHdyaXRlciAlcCB3cml0ZV9vcl92ZXJpZnkgc3RhcnQgdHlwZV9wb3MgPSAlZCByZW1haW5pbmcgc2lnICclcycgZW5hYmxlZCA9ICVkXG4iLAorICAgICAgICAgICAgICAgICB3cml0ZXIsIHdyaXRlci0+dHlwZV9wb3MsCisgICAgICAgICAgICAgICAgIHdyaXRlci0+dHlwZV9zdHIgPworICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuICh3cml0ZXItPnR5cGVfc3RyLCB3cml0ZXItPnR5cGVfcG9zLCAwKSA6CisgICAgICAgICAgICAgICAgICJ1bmtub3duIiwKKyAgICAgICAgICAgICAgICAgd3JpdGVyLT5lbmFibGVkKTsKKyNlbmRpZgorCisgIGlmICh3cml0ZXItPnR5cGVfc3RyID09IE5VTEwpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgaWYgKHdyaXRlci0+dHlwZV9wb3NfaXNfZXhwZWN0YXRpb24pCisgICAgeworI2lmbmRlZiBEQlVTX0RJU0FCTEVfQ0hFQ0tTCisgICAgICB7CisgICAgICAgIGludCBleHBlY3RlZDsKKworICAgICAgICBleHBlY3RlZCA9IF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAod3JpdGVyLT50eXBlX3N0ciwgd3JpdGVyLT50eXBlX3Bvcyk7CisKKyAgICAgICAgaWYgKGV4cGVjdGVkICE9IHR5cGVjb2RlKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChleHBlY3RlZCAhPSBEQlVTX1RZUEVfSU5WQUxJRCkKKyAgICAgICAgICAgICAgX2RidXNfd2Fybl9jaGVja19mYWlsZWQgKCJBcnJheSBvciB2YXJpYW50IHR5cGUgcmVxdWlyZXMgdGhhdCB0eXBlICVzIGJlIHdyaXR0ZW4sIGJ1dCAlcyB3YXMgd3JpdHRlbi5cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgb3ZlcmFsbCBzaWduYXR1cmUgZXhwZWN0ZWQgaGVyZSB3YXMgJyVzJyBhbmQgd2UgYXJlIG9uIGJ5dGUgJWQgb2YgdGhhdCBzaWduYXR1cmUuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3R5cGVfdG9fc3RyaW5nIChleHBlY3RlZCksIF9kYnVzX3R5cGVfdG9fc3RyaW5nICh0eXBlY29kZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKHdyaXRlci0+dHlwZV9zdHIpLCB3cml0ZXItPnR5cGVfcG9zKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgX2RidXNfd2Fybl9jaGVja19mYWlsZWQgKCJBcnJheSBvciB2YXJpYW50IHR5cGUgd2Fzbid0IGV4cGVjdGluZyBhbnkgbW9yZSB2YWx1ZXMgdG8gYmUgd3JpdHRlbiBpbnRvIGl0LCBidXQgYSB2YWx1ZSAlcyB3YXMgd3JpdHRlbi5cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgb3ZlcmFsbCBzaWduYXR1cmUgZXhwZWN0ZWQgaGVyZSB3YXMgJyVzJyBhbmQgd2UgYXJlIG9uIGJ5dGUgJWQgb2YgdGhhdCBzaWduYXR1cmUuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3R5cGVfdG9fc3RyaW5nICh0eXBlY29kZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKHdyaXRlci0+dHlwZV9zdHIpLCB3cml0ZXItPnR5cGVfcG9zKTsKKyAgICAgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImJhZCB0eXBlIGluc2VydGVkIHNvbWV3aGVyZSBpbnNpZGUgYW4gYXJyYXkgb3IgdmFyaWFudCIpOworICAgICAgICAgIH0KKyAgICAgIH0KKyNlbmRpZiAvKiBEQlVTX0RJU0FCTEVfQ0hFQ0tTICovCisKKyAgICAgIC8qIGlmIGltbWVkaWF0ZWx5IGluc2lkZSBhbiBhcnJheSB3ZSdkIGFsd2F5cyBiZSBhcHBlbmRpbmcgYW4gZWxlbWVudCwKKyAgICAgICAqIHNvIHRoZSBleHBlY3RlZCB0eXBlIGRvZXNuJ3QgY2hhbmdlOyBpZiBpbnNpZGUgYSBzdHJ1Y3Qgb3Igc29tZXRoaW5nCisgICAgICAgKiBiZWxvdyBhbiBhcnJheSwgd2UgbmVlZCB0byBtb3ZlIHRocm91Z2ggc2FpZCBzdHJ1Y3Qgb3Igc29tZXRoaW5nLgorICAgICAgICovCisgICAgICBpZiAod3JpdGVyLT5jb250YWluZXJfdHlwZSAhPSBEQlVTX1RZUEVfQVJSQVkpCisgICAgICAgIHdyaXRlci0+dHlwZV9wb3MgKz0gMTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbnNlcnRfYnl0ZSAod3JpdGVyLT50eXBlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXItPnR5cGVfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVjb2RlKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICB3cml0ZXItPnR5cGVfcG9zICs9IDE7CisgICAgfQorCisjaWYgUkVDVVJTSVZFX01BUlNIQUxfV1JJVEVfVFJBQ0UKKyAgX2RidXNfdmVyYm9zZSAoIiAgdHlwZSB3cml0ZXIgJXAgd3JpdGVfb3JfdmVyaWZ5IGVuZCB0eXBlX3BvcyA9ICVkIHJlbWFpbmluZyBzaWcgJyVzJ1xuIiwKKyAgICAgICAgICAgICAgICAgd3JpdGVyLCB3cml0ZXItPnR5cGVfcG9zLAorICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuICh3cml0ZXItPnR5cGVfc3RyLCB3cml0ZXItPnR5cGVfcG9zLCAwKSk7CisjZW5kaWYKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90Cit3cml0ZXJfcmVjdXJzZV9zdHJ1Y3Rfb3JfZGljdF9lbnRyeSAoREJ1c1R5cGVXcml0ZXIgICAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGJlZ2luX2NoYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqY29udGFpbmVkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgY29udGFpbmVkX3R5cGVfc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgY29udGFpbmVkX3R5cGVfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlV3JpdGVyICAgKnN1YikKK3sKKyAgLyogRklYTUUgcmlnaHQgbm93IGNvbnRhaW5lZF90eXBlIGlzIGlnbm9yZWQ7IHdlIGNvdWxkIHByb2JhYmx5CisgICAqIGFsbW9zdCB0cml2aWFsbHkgZml4IHRoZSBjb2RlIHNvIGlmIGl0J3MgcHJlc2VudCB3ZQorICAgKiB3cml0ZSBpdCBvdXQgYW5kIHRoZW4gc2V0IHR5cGVfcG9zX2lzX2V4cGVjdGF0aW9uCisgICAqLworCisgIC8qIEVuc3VyZSB0aGF0IHdlJ2xsIGJlIGFibGUgdG8gYWRkIGFsaWdubWVudCBwYWRkaW5nIGFuZCB0aGUgdHlwZWNvZGUgKi8KKyAgaWYgKHdyaXRlci0+ZW5hYmxlZCkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hbGxvY19zcGFjZSAoc3ViLT52YWx1ZV9zdHIsIDgpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghd3JpdGVfb3JfdmVyaWZ5X3R5cGVjb2RlIChzdWIsIGJlZ2luX2NoYXIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImZhaWxlZCB0byBpbnNlcnQgc3RydWN0IHR5cGVjb2RlIGFmdGVyIHByZWFsbG9jIik7CisKKyAgaWYgKHdyaXRlci0+ZW5hYmxlZCkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbnNlcnRfYnl0ZXMgKHN1Yi0+dmFsdWVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWItPnZhbHVlX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0RCVVNfQUxJR05fVkFMVUUgKHN1Yi0+dmFsdWVfcG9zLCA4KSAtIHN1Yi0+dmFsdWVfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXDAnKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgic2hvdWxkIG5vdCBoYXZlIGZhaWxlZCB0byBpbnNlcnQgYWxpZ25tZW50IHBhZGRpbmcgZm9yIHN0cnVjdCIpOworICAgICAgc3ViLT52YWx1ZV9wb3MgPSBfREJVU19BTElHTl9WQUxVRSAoc3ViLT52YWx1ZV9wb3MsIDgpOworICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworCitzdGF0aWMgZGJ1c19ib29sX3QKK3dyaXRlcl9yZWN1cnNlX2FycmF5IChEQnVzVHlwZVdyaXRlciAgICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqY29udGFpbmVkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgY29udGFpbmVkX3R5cGVfc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgY29udGFpbmVkX3R5cGVfbGVuLAorICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlV3JpdGVyICAgKnN1YiwKKyAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICBpc19hcnJheV9hcHBlbmQpCit7CisgIGRidXNfdWludDMyX3QgdmFsdWUgPSAwOworICBpbnQgYWxpZ25tZW50OworICBpbnQgYWxpZ25lZDsKKworI2lmbmRlZiBEQlVTX0RJU0FCTEVfQ0hFQ0tTCisgIGlmICh3cml0ZXItPmNvbnRhaW5lcl90eXBlID09IERCVVNfVFlQRV9BUlJBWSAmJgorICAgICAgd3JpdGVyLT50eXBlX3N0cikKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19lcXVhbF9zdWJzdHJpbmcgKGNvbnRhaW5lZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZWRfdHlwZV9zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVkX3R5cGVfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXItPnR5cGVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXItPnUuYXJyYXkuZWxlbWVudF90eXBlX3BvcyArIDEpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2Fybl9jaGVja19mYWlsZWQgKCJXcml0aW5nIGFuIGFycmF5IG9mICclcycgYnV0IHRoaXMgaXMgaW5jb21wYXRpYmxlIHdpdGggdGhlIGV4cGVjdGVkIHR5cGUgb2YgZWxlbWVudHMgaW4gdGhlIHBhcmVudCBhcnJheSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YV9sZW4gKGNvbnRhaW5lZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZWRfdHlwZV9zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVkX3R5cGVfbGVuKSk7CisgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiaW5jb21wYXRpYmxlIHR5cGUgZm9yIGNoaWxkIGFycmF5Iik7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogREJVU19ESVNBQkxFX0NIRUNLUyAqLworCisgIGlmICh3cml0ZXItPmVuYWJsZWQgJiYgIWlzX2FycmF5X2FwcGVuZCkKKyAgICB7CisgICAgICAvKiAzIHBhZCArIDQgYnl0ZXMgZm9yIHRoZSBhcnJheSBsZW5ndGgsIGFuZCA0IGJ5dGVzIHBvc3NpYmxlIHBhZGRpbmcKKyAgICAgICAqIGJlZm9yZSBhcnJheSB2YWx1ZXMKKyAgICAgICAqLworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYWxsb2Nfc3BhY2UgKHN1Yi0+dmFsdWVfc3RyLCAzICsgNCArIDQpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICh3cml0ZXItPnR5cGVfc3RyICE9IE5VTEwpCisgICAgeworICAgICAgc3ViLT50eXBlX3BvcyArPSAxOyAvKiBtb3ZlIHRvIHBvaW50IHRvIHRoZSBlbGVtZW50IHR5cGUsIHNpbmNlIHR5cGVfcG9zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHNob3VsZCBiZSB0aGUgZXhwZWN0ZWQgdHlwZSBmb3IgZnVydGhlciB3cml0ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICBzdWItPnUuYXJyYXkuZWxlbWVudF90eXBlX3BvcyA9IHN1Yi0+dHlwZV9wb3M7CisgICAgfQorCisgIGlmICghd3JpdGVyLT50eXBlX3Bvc19pc19leHBlY3RhdGlvbikKKyAgICB7CisgICAgICAvKiBzdWIgaXMgYSB0b3BsZXZlbC9vdXRlcm1vc3QgYXJyYXkgc28gd2UgbmVlZCB0byB3cml0ZSB0aGUgdHlwZSBkYXRhICovCisKKyAgICAgIC8qIGFsbG9jIHNwYWNlIGZvciBhcnJheSB0eXBlY29kZSwgZWxlbWVudCBzaWduYXR1cmUgKi8KKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FsbG9jX3NwYWNlICh3cml0ZXItPnR5cGVfc3RyLCAxICsgY29udGFpbmVkX3R5cGVfbGVuKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbnNlcnRfYnl0ZSAod3JpdGVyLT50eXBlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXItPnR5cGVfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9BUlJBWSkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImZhaWxlZCB0byBpbnNlcnQgYXJyYXkgdHlwZWNvZGUgYWZ0ZXIgcHJlYWxsb2MiKTsKKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfY29weV9sZW4gKGNvbnRhaW5lZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lZF90eXBlX3N0YXJ0LCBjb250YWluZWRfdHlwZV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViLT50eXBlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWItPnUuYXJyYXkuZWxlbWVudF90eXBlX3BvcykpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInNob3VsZCBub3QgaGF2ZSBmYWlsZWQgdG8gaW5zZXJ0IGFycmF5IGVsZW1lbnQgdHlwZWNvZGVzIik7CisgICAgfQorCisgIGlmICh3cml0ZXItPnR5cGVfc3RyICE9IE5VTEwpCisgICAgeworICAgICAgLyogSWYgdGhlIHBhcmVudCBpcyBhbiBhcnJheSwgd2UgaG9sZCB0eXBlX3BvcyBwb2ludGluZyBhdCB0aGUgYXJyYXkgZWxlbWVudCB0eXBlOworICAgICAgICogb3RoZXJ3aXNlIGFkdmFuY2UgaXQgdG8gcmVmbGVjdCB0aGUgYXJyYXkgdmFsdWUgd2UganVzdCByZWN1cnNlZCBpbnRvCisgICAgICAgKi8KKyAgICAgIGlmICh3cml0ZXItPmNvbnRhaW5lcl90eXBlICE9IERCVVNfVFlQRV9BUlJBWSkKKyAgICAgICAgd3JpdGVyLT50eXBlX3BvcyArPSAxICsgY29udGFpbmVkX3R5cGVfbGVuOworICAgICAgZWxzZQorICAgICAgICBfZGJ1c19hc3NlcnQgKHdyaXRlci0+dHlwZV9wb3NfaXNfZXhwZWN0YXRpb24pOyAvKiBiZWNhdXNlIGl0J3MgYW4gYXJyYXkgKi8KKyAgICB9CisKKyAgaWYgKHdyaXRlci0+ZW5hYmxlZCkKKyAgICB7CisgICAgICAvKiBXcml0ZSAob3IganVtcCBvdmVyLCBpZiBpc19hcnJheV9hcHBlbmQpIHRoZSBsZW5ndGggKi8KKyAgICAgIHN1Yi0+dS5hcnJheS5sZW5fcG9zID0gX0RCVVNfQUxJR05fVkFMVUUgKHN1Yi0+dmFsdWVfcG9zLCA0KTsKKworICAgICAgaWYgKGlzX2FycmF5X2FwcGVuZCkKKyAgICAgICAgeworICAgICAgICAgIHN1Yi0+dmFsdWVfcG9zICs9IDQ7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGlmICghX2RidXNfdHlwZV93cml0ZXJfd3JpdGVfYmFzaWNfbm9fdHlwZWNvZGUgKHN1YiwgREJVU19UWVBFX1VJTlQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpKQorICAgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgic2hvdWxkIG5vdCBoYXZlIGZhaWxlZCB0byBpbnNlcnQgYXJyYXkgbGVuIik7CisgICAgICAgIH0KKworICAgICAgX2RidXNfYXNzZXJ0IChzdWItPnUuYXJyYXkubGVuX3BvcyA9PSBzdWItPnZhbHVlX3BvcyAtIDQpOworCisgICAgICAvKiBXcml0ZSBhbGlnbm1lbnQgcGFkZGluZyBmb3IgYXJyYXkgZWxlbWVudHMKKyAgICAgICAqIE5vdGUgdGhhdCB3ZSB3cml0ZSB0aGUgcGFkZGluZyAqZXZlbiBmb3IgZW1wdHkgYXJyYXlzKgorICAgICAgICogdG8gYXZvaWQgd29ua3kgc3BlY2lhbCBjYXNlcworICAgICAgICovCisgICAgICBhbGlnbm1lbnQgPSBlbGVtZW50X3R5cGVfZ2V0X2FsaWdubWVudCAoY29udGFpbmVkX3R5cGUsIGNvbnRhaW5lZF90eXBlX3N0YXJ0KTsKKworICAgICAgYWxpZ25lZCA9IF9EQlVTX0FMSUdOX1ZBTFVFIChzdWItPnZhbHVlX3BvcywgYWxpZ25tZW50KTsKKyAgICAgIGlmIChhbGlnbmVkICE9IHN1Yi0+dmFsdWVfcG9zKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCFpc19hcnJheV9hcHBlbmQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2luc2VydF9ieXRlcyAoc3ViLT52YWx1ZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViLT52YWx1ZV9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ25lZCAtIHN1Yi0+dmFsdWVfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcMCcpKQorICAgICAgICAgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInNob3VsZCBub3QgaGF2ZSBmYWlsZWQgdG8gaW5zZXJ0IGFsaWdubWVudCBwYWRkaW5nIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBzdWItPnZhbHVlX3BvcyA9IGFsaWduZWQ7CisgICAgICAgIH0KKworICAgICAgc3ViLT51LmFycmF5LnN0YXJ0X3BvcyA9IHN1Yi0+dmFsdWVfcG9zOworCisgICAgICBpZiAoaXNfYXJyYXlfYXBwZW5kKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c191aW50MzJfdCBsZW47CisKKyAgICAgICAgICBfZGJ1c19hc3NlcnQgKF9EQlVTX0FMSUdOX1ZBTFVFIChzdWItPnUuYXJyYXkubGVuX3BvcywgNCkgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCkgc3ViLT51LmFycmF5Lmxlbl9wb3MpOworICAgICAgICAgIGxlbiA9IF9kYnVzX3VucGFja191aW50MzIgKHN1Yi0+Ynl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X3VkYXRhX2xlbiAoc3ViLT52YWx1ZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViLT51LmFycmF5Lmxlbl9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCkpOworCisgICAgICAgICAgc3ViLT52YWx1ZV9wb3MgKz0gbGVuOworICAgICAgICB9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogbm90IGVuYWJsZWQsIHNvIHdlIHdvbid0IHdyaXRlIHRoZSBsZW5fcG9zOyBzZXQgaXQgdG8gLTEgdG8gc28gaW5kaWNhdGUgKi8KKyAgICAgIHN1Yi0+dS5hcnJheS5sZW5fcG9zID0gLTE7CisgICAgICBzdWItPnUuYXJyYXkuc3RhcnRfcG9zID0gc3ViLT52YWx1ZV9wb3M7CisgICAgfQorCisgIF9kYnVzX2Fzc2VydCAoc3ViLT51LmFycmF5Lmxlbl9wb3MgPCBzdWItPnUuYXJyYXkuc3RhcnRfcG9zKTsKKyAgX2RidXNfYXNzZXJ0IChpc19hcnJheV9hcHBlbmQgfHwgc3ViLT51LmFycmF5LnN0YXJ0X3BvcyA9PSBzdWItPnZhbHVlX3Bvcyk7CisKKyNpZiBSRUNVUlNJVkVfTUFSU0hBTF9XUklURV9UUkFDRQorICAgICAgX2RidXNfdmVyYm9zZSAoIiAgdHlwZSB3cml0ZXIgJXAgcmVjdXJzZSBhcnJheSBkb25lIHJlbWFpbmluZyBzaWcgJyVzJyBhcnJheSBzdGFydF9wb3MgPSAlZCBsZW5fcG9zID0gJWQgdmFsdWVfcG9zID0gJWRcbiIsIHN1YiwKKyAgICAgICAgICAgICAgICAgICAgIHN1Yi0+dHlwZV9zdHIgPworICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhX2xlbiAoc3ViLT50eXBlX3N0ciwgc3ViLT50eXBlX3BvcywgMCkgOgorICAgICAgICAgICAgICAgICAgICAgInVua25vd24iLAorICAgICAgICAgICAgICAgICAgICAgc3ViLT51LmFycmF5LnN0YXJ0X3Bvcywgc3ViLT51LmFycmF5Lmxlbl9wb3MsIHN1Yi0+dmFsdWVfcG9zKTsKKyNlbmRpZgorCisgIHJldHVybiBUUlVFOworfQorCisvKiBWYXJpYW50IHZhbHVlIHdpbGwgbm9ybWFsbHkgaGF2ZToKKyAqICAgMSBieXRlIHNpZ25hdHVyZSBsZW5ndGggbm90IGluY2x1ZGluZyBudWwKKyAqICAgc2lnbmF0dXJlIHR5cGVjb2RlcyAobnVsIHRlcm1pbmF0ZWQpCisgKiAgIHBhZGRpbmcgdG8gYWxpZ25tZW50IG9mIGNvbnRhaW5lZCB0eXBlCisgKiAgIGJvZHkgYWNjb3JkaW5nIHRvIHNpZ25hdHVyZQorICoKKyAqIFRoZSBzaWduYXR1cmUgc3RyaW5nIGNhbiBvbmx5IGhhdmUgYSBzaW5nbGUgdHlwZQorICogaW4gaXQgYnV0IHRoYXQgdHlwZSBtYXkgYmUgY29tcGxleC9yZWN1cnNpdmUuCisgKgorICogU28gYSB0eXBpY2FsIHZhcmlhbnQgdHlwZSB3aXRoIHRoZSBpbnRlZ2VyIDMgd2lsbCBoYXZlIHRoZXNlCisgKiBvY3RldHM6CisgKiAgIDB4MSAnaScgJ1wwJyBbMSBieXRlIHBhZGRpbmcgdG8gYWxpZ25tZW50IGJvdW5kYXJ5XSAweDAgMHgwIDB4MCAweDMKKyAqCisgKiBUaGUgbWFpbiB3b3JsZCBvZiBodXJ0IGZvciB3cml0aW5nIG91dCBhIHZhcmlhbnQgaXMgdGhhdCB0aGUgdHlwZQorICogc3RyaW5nIGlzIHRoZSBzYW1lIHN0cmluZyBhcyB0aGUgdmFsdWUgc3RyaW5nLiBXaGljaCBtZWFucworICogaW5zZXJ0aW5nIHRvIHRoZSB0eXBlIHN0cmluZyB3aWxsIG1vdmUgdGhlIHZhbHVlX3BvczsgYW5kIGl0IG1lYW5zCisgKiB0aGF0IGluc2VydGluZyB0byB0aGUgdHlwZSBzdHJpbmcgY291bGQgYnJlYWsgdHlwZSBhbGlnbm1lbnQuCisgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAord3JpdGVyX3JlY3Vyc2VfdmFyaWFudCAoREJ1c1R5cGVXcml0ZXIgICAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqY29udGFpbmVkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBjb250YWluZWRfdHlwZV9zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGNvbnRhaW5lZF90eXBlX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlV3JpdGVyICAgKnN1YikKK3sKKyAgaW50IGNvbnRhaW5lZF9hbGlnbm1lbnQ7CisgIAorICBpZiAod3JpdGVyLT5lbmFibGVkKQorICAgIHsKKyAgICAgIC8qIEFsbG9jYXRlIHNwYWNlIGZvciB0aGUgd29yc3QgY2FzZSwgd2hpY2ggaXMgMSBieXRlIHNpZworICAgICAgICogbGVuZ3RoLCBudWwgYnl0ZSBhdCBlbmQgb2Ygc2lnLCBhbmQgNyBieXRlcyBwYWRkaW5nIHRvCisgICAgICAgKiA4LWJvdW5kYXJ5LgorICAgICAgICovCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hbGxvY19zcGFjZSAoc3ViLT52YWx1ZV9zdHIsIGNvbnRhaW5lZF90eXBlX2xlbiArIDkpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIC8qIHdyaXRlIFZBUklBTlQgdHlwZWNvZGUgdG8gdGhlIHBhcmVudCdzIHR5cGUgc3RyaW5nICovCisgIGlmICghd3JpdGVfb3JfdmVyaWZ5X3R5cGVjb2RlICh3cml0ZXIsIERCVVNfVFlQRV9WQVJJQU5UKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgLyogSWYgbm90IGVuYWJsZWQsIG1hcmsgdGhhdCB3ZSBoYXZlIG5vIHR5cGVfc3RyIGFueW1vcmUgLi4uICovCisKKyAgaWYgKCF3cml0ZXItPmVuYWJsZWQpCisgICAgeworICAgICAgc3ViLT50eXBlX3N0ciA9IE5VTEw7CisgICAgICBzdWItPnR5cGVfcG9zID0gLTE7CisKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICAvKiBJZiB3ZSdyZSBlbmFibGVkIHRoZW4gY29udGludWUgLi4uICovCisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5zZXJ0X2J5dGUgKHN1Yi0+dmFsdWVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViLT52YWx1ZV9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZWRfdHlwZV9sZW4pKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInNob3VsZCBub3QgaGF2ZSBmYWlsZWQgdG8gaW5zZXJ0IHZhcmlhbnQgdHlwZSBzaWcgbGVuIik7CisKKyAgc3ViLT52YWx1ZV9wb3MgKz0gMTsKKworICAvKiBIZXJlIHdlIHN3aXRjaCBvdmVyIHRvIHRoZSBleHBlY3RlZCB0eXBlIHNpZyB3ZSdyZSBhYm91dCB0byB3cml0ZSAqLworICBzdWItPnR5cGVfc3RyID0gc3ViLT52YWx1ZV9zdHI7CisgIHN1Yi0+dHlwZV9wb3MgPSBzdWItPnZhbHVlX3BvczsKKworICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5X2xlbiAoY29udGFpbmVkX3R5cGUsIGNvbnRhaW5lZF90eXBlX3N0YXJ0LCBjb250YWluZWRfdHlwZV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWItPnZhbHVlX3N0ciwgc3ViLT52YWx1ZV9wb3MpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInNob3VsZCBub3QgaGF2ZSBmYWlsZWQgdG8gaW5zZXJ0IHZhcmlhbnQgdHlwZSBzaWciKTsKKworICBzdWItPnZhbHVlX3BvcyArPSBjb250YWluZWRfdHlwZV9sZW47CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5zZXJ0X2J5dGUgKHN1Yi0+dmFsdWVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViLT52YWx1ZV9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgic2hvdWxkIG5vdCBoYXZlIGZhaWxlZCB0byBpbnNlcnQgdmFyaWFudCB0eXBlIG51bCB0ZXJtaW5hdGlvbiIpOworCisgIHN1Yi0+dmFsdWVfcG9zICs9IDE7CisKKyAgY29udGFpbmVkX2FsaWdubWVudCA9IF9kYnVzX3R5cGVfZ2V0X2FsaWdubWVudCAoX2RidXNfZmlyc3RfdHlwZV9pbl9zaWduYXR1cmUgKGNvbnRhaW5lZF90eXBlLCBjb250YWluZWRfdHlwZV9zdGFydCkpOworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5zZXJ0X2J5dGVzIChzdWItPnZhbHVlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWItPnZhbHVlX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfREJVU19BTElHTl9WQUxVRSAoc3ViLT52YWx1ZV9wb3MsIGNvbnRhaW5lZF9hbGlnbm1lbnQpIC0gc3ViLT52YWx1ZV9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1wwJykpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgic2hvdWxkIG5vdCBoYXZlIGZhaWxlZCB0byBpbnNlcnQgYWxpZ25tZW50IHBhZGRpbmcgZm9yIHZhcmlhbnQgYm9keSIpOworICBzdWItPnZhbHVlX3BvcyA9IF9EQlVTX0FMSUdOX1ZBTFVFIChzdWItPnZhbHVlX3BvcywgY29udGFpbmVkX2FsaWdubWVudCk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorX2RidXNfdHlwZV93cml0ZXJfcmVjdXJzZV9jb250YWluZWRfbGVuIChEQnVzVHlwZVdyaXRlciAgICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGNvbnRhaW5lcl90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpjb250YWluZWRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgY29udGFpbmVkX3R5cGVfc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGNvbnRhaW5lZF90eXBlX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVXcml0ZXIgICAqc3ViLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICBpc19hcnJheV9hcHBlbmQpCit7CisgIHdyaXRlcl9yZWN1cnNlX2luaXRfYW5kX2NoZWNrICh3cml0ZXIsIGNvbnRhaW5lcl90eXBlLCBzdWIpOworCisgIHN3aXRjaCAoY29udGFpbmVyX3R5cGUpCisgICAgeworICAgIGNhc2UgREJVU19UWVBFX1NUUlVDVDoKKyAgICAgIHJldHVybiB3cml0ZXJfcmVjdXJzZV9zdHJ1Y3Rfb3JfZGljdF9lbnRyeSAod3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1NUUlVDVF9CRUdJTl9DSEFSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZWRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVkX3R5cGVfc3RhcnQsIGNvbnRhaW5lZF90eXBlX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgREJVU19UWVBFX0RJQ1RfRU5UUlk6CisgICAgICByZXR1cm4gd3JpdGVyX3JlY3Vyc2Vfc3RydWN0X29yX2RpY3RfZW50cnkgKHdyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19ESUNUX0VOVFJZX0JFR0lOX0NIQVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZWRfdHlwZV9zdGFydCwgY29udGFpbmVkX3R5cGVfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBEQlVTX1RZUEVfQVJSQVk6CisgICAgICByZXR1cm4gd3JpdGVyX3JlY3Vyc2VfYXJyYXkgKHdyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVkX3R5cGUsIGNvbnRhaW5lZF90eXBlX3N0YXJ0LCBjb250YWluZWRfdHlwZV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YiwgaXNfYXJyYXlfYXBwZW5kKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgREJVU19UWVBFX1ZBUklBTlQ6CisgICAgICByZXR1cm4gd3JpdGVyX3JlY3Vyc2VfdmFyaWFudCAod3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lZF90eXBlLCBjb250YWluZWRfdHlwZV9zdGFydCwgY29udGFpbmVkX3R5cGVfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Yik7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgidHJpZWQgdG8gcmVjdXJzZSBpbnRvIHR5cGUgdGhhdCBkb2Vzbid0IHN1cHBvcnQgdGhhdCIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgYnJlYWs7CisgICAgfQorfQorCisvKioKKyAqIE9wZW5zIGEgbmV3IGNvbnRhaW5lciBhbmQgd3JpdGVzIG91dCB0aGUgaW5pdGlhbCBpbmZvcm1hdGlvbiBmb3IgdGhhdCBjb250YWluZXIuCisgKgorICogQHBhcmFtIHdyaXRlciB0aGUgd3JpdGVyCisgKiBAcGFyYW0gY29udGFpbmVyX3R5cGUgdGhlIHR5cGUgb2YgdGhlIGNvbnRhaW5lciB0byBvcGVuCisgKiBAcGFyYW0gY29udGFpbmVkX3R5cGUgdGhlIGFycmF5IGVsZW1lbnQgdHlwZSBvciB2YXJpYW50IGNvbnRlbnQgdHlwZQorICogQHBhcmFtIGNvbnRhaW5lZF90eXBlX3N0YXJ0IHBvc2l0aW9uIHRvIGxvb2sgZm9yIHRoZSB0eXBlCisgKiBAcGFyYW0gc3ViIHRoZSBuZXcgc3ViLXdyaXRlciB0byB3cml0ZSBjb250YWluZXIgY29udGVudHMKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBubyBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3R5cGVfd3JpdGVyX3JlY3Vyc2UgKERCdXNUeXBlV3JpdGVyICAgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGNvbnRhaW5lcl90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqY29udGFpbmVkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBjb250YWluZWRfdHlwZV9zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlV3JpdGVyICAgKnN1YikKK3sKKyAgaW50IGNvbnRhaW5lZF90eXBlX2xlbjsKKworICBpZiAoY29udGFpbmVkX3R5cGUpCisgICAgY29udGFpbmVkX3R5cGVfbGVuID0gZmluZF9sZW5fb2ZfY29tcGxldGVfdHlwZSAoY29udGFpbmVkX3R5cGUsIGNvbnRhaW5lZF90eXBlX3N0YXJ0KTsKKyAgZWxzZQorICAgIGNvbnRhaW5lZF90eXBlX2xlbiA9IDA7CisKKyAgcmV0dXJuIF9kYnVzX3R5cGVfd3JpdGVyX3JlY3Vyc2VfY29udGFpbmVkX2xlbiAod3JpdGVyLCBjb250YWluZXJfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lZF90eXBlX3N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZWRfdHlwZV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UpOworfQorCisvKioKKyAqIEFwcGVuZCB0byBhbiBleGlzdGluZyBhcnJheS4gRXNzZW50aWFsbHksIHRoZSB3cml0ZXIgd2lsbCByZWFkIGFuCisgKiBleGlzdGluZyBsZW5ndGggYXQgdGhlIHdyaXRlIGxvY2F0aW9uOyBqdW1wIG92ZXIgdGhhdCBsZW5ndGg7IGFuZAorICogd3JpdGUgbmV3IGZpZWxkcy4gT24gdW5yZWN1cnNlKCksIHRoZSBleGlzdGluZyBsZW5ndGggd2lsbCBiZQorICogdXBkYXRlZC4KKyAqCisgKiBAcGFyYW0gd3JpdGVyIHRoZSB3cml0ZXIKKyAqIEBwYXJhbSBjb250YWluZWRfdHlwZSBlbGVtZW50IHR5cGUKKyAqIEBwYXJhbSBjb250YWluZWRfdHlwZV9zdGFydCBwb3NpdGlvbiBvZiBlbGVtZW50IHR5cGUKKyAqIEBwYXJhbSBzdWIgdGhlIHN1YndyaXRlciB0byBpbml0CisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm8gbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c190eXBlX3dyaXRlcl9hcHBlbmRfYXJyYXkgKERCdXNUeXBlV3JpdGVyICAgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqY29udGFpbmVkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGNvbnRhaW5lZF90eXBlX3N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVdyaXRlciAgICpzdWIpCit7CisgIGludCBjb250YWluZWRfdHlwZV9sZW47CisKKyAgaWYgKGNvbnRhaW5lZF90eXBlKQorICAgIGNvbnRhaW5lZF90eXBlX2xlbiA9IGZpbmRfbGVuX29mX2NvbXBsZXRlX3R5cGUgKGNvbnRhaW5lZF90eXBlLCBjb250YWluZWRfdHlwZV9zdGFydCk7CisgIGVsc2UKKyAgICBjb250YWluZWRfdHlwZV9sZW4gPSAwOworCisgIHJldHVybiBfZGJ1c190eXBlX3dyaXRlcl9yZWN1cnNlX2NvbnRhaW5lZF9sZW4gKHdyaXRlciwgREJVU19UWVBFX0FSUkFZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZWRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVkX3R5cGVfc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lZF90eXBlX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFKTsKK30KKworc3RhdGljIGludAord3JpdGVyX2dldF9hcnJheV9sZW4gKERCdXNUeXBlV3JpdGVyICp3cml0ZXIpCit7CisgIF9kYnVzX2Fzc2VydCAod3JpdGVyLT5jb250YWluZXJfdHlwZSA9PSBEQlVTX1RZUEVfQVJSQVkpOworICByZXR1cm4gd3JpdGVyLT52YWx1ZV9wb3MgLSB3cml0ZXItPnUuYXJyYXkuc3RhcnRfcG9zOworfQorCisvKioKKyAqIENsb3NlcyBhIGNvbnRhaW5lciBjcmVhdGVkIGJ5IF9kYnVzX3R5cGVfd3JpdGVyX3JlY3Vyc2UoKQorICogYW5kIHdyaXRlcyBhbnkgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB0byB0aGUgdmFsdWVzIGJsb2NrLgorICoKKyAqIEBwYXJhbSB3cml0ZXIgdGhlIHdyaXRlcgorICogQHBhcmFtIHN1YiB0aGUgc3ViLXdyaXRlciBjcmVhdGVkIGJ5IF9kYnVzX3R5cGVfd3JpdGVyX3JlY3Vyc2UoKQorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfdHlwZV93cml0ZXJfdW5yZWN1cnNlIChEQnVzVHlwZVdyaXRlciAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVdyaXRlciAqc3ViKQoreworICAvKiB0eXBlX3Bvc19pc19leHBlY3RhdGlvbiBuZXZlciBnZXRzIHVuc2V0IG9uY2Ugc2V0LCBvciB3ZSdkIGdldCBhbGwgaG9zZWQgKi8KKyAgX2RidXNfYXNzZXJ0ICghd3JpdGVyLT50eXBlX3Bvc19pc19leHBlY3RhdGlvbiB8fAorICAgICAgICAgICAgICAgICh3cml0ZXItPnR5cGVfcG9zX2lzX2V4cGVjdGF0aW9uICYmIHN1Yi0+dHlwZV9wb3NfaXNfZXhwZWN0YXRpb24pKTsKKworI2lmIFJFQ1VSU0lWRV9NQVJTSEFMX1dSSVRFX1RSQUNFCisgIF9kYnVzX3ZlcmJvc2UgKCIgIHR5cGUgd3JpdGVyICVwIHVucmVjdXJzZSB0eXBlX3BvcyA9ICVkIHZhbHVlX3BvcyA9ICVkIGlzX2V4cGVjdGF0aW9uID0gJWQgY29udGFpbmVyX3R5cGUgPSAlc1xuIiwKKyAgICAgICAgICAgICAgICAgd3JpdGVyLCB3cml0ZXItPnR5cGVfcG9zLCB3cml0ZXItPnZhbHVlX3Bvcywgd3JpdGVyLT50eXBlX3Bvc19pc19leHBlY3RhdGlvbiwKKyAgICAgICAgICAgICAgICAgX2RidXNfdHlwZV90b19zdHJpbmcgKHdyaXRlci0+Y29udGFpbmVyX3R5cGUpKTsKKyAgX2RidXNfdmVyYm9zZSAoIiAgdHlwZSB3cml0ZXIgJXAgdW5yZWN1cnNlIHN1YiB0eXBlX3BvcyA9ICVkIHZhbHVlX3BvcyA9ICVkIGlzX2V4cGVjdGF0aW9uID0gJWQgY29udGFpbmVyX3R5cGUgPSAlc1xuIiwKKyAgICAgICAgICAgICAgICAgc3ViLCBzdWItPnR5cGVfcG9zLCBzdWItPnZhbHVlX3BvcywKKyAgICAgICAgICAgICAgICAgc3ViLT50eXBlX3Bvc19pc19leHBlY3RhdGlvbiwKKyAgICAgICAgICAgICAgICAgX2RidXNfdHlwZV90b19zdHJpbmcgKHN1Yi0+Y29udGFpbmVyX3R5cGUpKTsKKyNlbmRpZgorCisgIGlmIChzdWItPmNvbnRhaW5lcl90eXBlID09IERCVVNfVFlQRV9TVFJVQ1QpCisgICAgeworICAgICAgaWYgKCF3cml0ZV9vcl92ZXJpZnlfdHlwZWNvZGUgKHN1YiwgREJVU19TVFJVQ1RfRU5EX0NIQVIpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICBlbHNlIGlmIChzdWItPmNvbnRhaW5lcl90eXBlID09IERCVVNfVFlQRV9ESUNUX0VOVFJZKQorICAgIHsKKyAgICAgIGlmICghd3JpdGVfb3JfdmVyaWZ5X3R5cGVjb2RlIChzdWIsIERCVVNfRElDVF9FTlRSWV9FTkRfQ0hBUikpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIGVsc2UgaWYgKHN1Yi0+Y29udGFpbmVyX3R5cGUgPT0gREJVU19UWVBFX0FSUkFZKQorICAgIHsKKyAgICAgIGlmIChzdWItPnUuYXJyYXkubGVuX3BvcyA+PSAwKSAvKiBsZW5fcG9zID09IC0xIGlmIHdlIHdlcmVuJ3QgZW5hYmxlZCB3aGVuIHdlIHBhc3NlZCBpdCAqLworICAgICAgICB7CisgICAgICAgICAgZGJ1c191aW50MzJfdCBsZW47CisKKyAgICAgICAgICAvKiBTZXQgdGhlIGFycmF5IGxlbmd0aCAqLworICAgICAgICAgIGxlbiA9IHdyaXRlcl9nZXRfYXJyYXlfbGVuIChzdWIpOworICAgICAgICAgIF9kYnVzX21hcnNoYWxfc2V0X3VpbnQzMiAoc3ViLT52YWx1ZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWItPnUuYXJyYXkubGVuX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Yi0+Ynl0ZV9vcmRlcik7CisjaWYgUkVDVVJTSVZFX01BUlNIQUxfV1JJVEVfVFJBQ0UKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiICAgIGZpbGxlZCBpbiBzdWIgYXJyYXkgbGVuIHRvICV1IGF0IGxlbl9wb3MgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLCBzdWItPnUuYXJyYXkubGVuX3Bvcyk7CisjZW5kaWYKKyAgICAgICAgfQorI2lmIFJFQ1VSU0lWRV9NQVJTSEFMX1dSSVRFX1RSQUNFCisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiICAgIG5vdCBmaWxsaW5nIGluIHN1YiBhcnJheSBsZW4gYmVjYXVzZSB3ZSB3ZXJlIGRpc2FibGVkIHdoZW4gd2UgcGFzc2VkIHRoZSBsZW5cbiIpOworICAgICAgICB9CisjZW5kaWYKKyAgICB9CisKKyAgLyogTm93IGdldCB0eXBlX3BvcyByaWdodCBmb3IgdGhlIHBhcmVudCB3cml0ZXIuIEhlcmUgYXJlIHRoZSBjYXNlczoKKyAgICoKKyAgICogQ2FzZXMgIXdyaXRlci0+dHlwZV9wb3NfaXNfZXhwZWN0YXRpb246CisgICAqICAgKGluIHRoZXNlIGNhc2VzIHdlIHdhbnQgdG8gdXBkYXRlIHRvIHRoZSBuZXcgaW5zZXJ0aW9uIHBvaW50KQorICAgKgorICAgKiAtIGlmIHdlIHJlY3Vyc2VkIGludG8gYSBTVFJVQ1QgdGhlbiB3ZSBkaWRuJ3Qga25vdyBpbiBhZHZhbmNlCisgICAqICAgd2hhdCB0aGUgdHlwZXMgaW4gdGhlIHN0cnVjdCB3b3VsZCBiZTsgc28gd2UgaGF2ZSB0byBmaWxsIGluCisgICAqICAgdGhhdCBpbmZvcm1hdGlvbiBub3cuCisgICAqICAgICAgIHdyaXRlci0+dHlwZV9wb3MgPSBzdWItPnR5cGVfcG9zCisgICAqCisgICAqIC0gaWYgd2UgcmVjdXJzZWQgaW50byBhbnl0aGluZyBlbHNlLCB3ZSBrbmV3IHRoZSBmdWxsIGFycmF5CisgICAqICAgdHlwZSwgb3Iga25ldyB0aGUgc2luZ2xlIHR5cGVjb2RlIG1hcmtpbmcgVkFSSUFOVCwgc28KKyAgICogICB3cml0ZXItPnR5cGVfcG9zIGlzIGFscmVhZHkgY29ycmVjdC4KKyAgICogICAgICAgd3JpdGVyLT50eXBlX3BvcyBzaG91bGQgcmVtYWluIGFzLWlzCisgICAqCisgICAqIC0gbm90ZSB0aGF0IHRoZSBwYXJlbnQgaXMgbmV2ZXIgYW4gQVJSQVkgb3IgVkFSSUFOVCwgaWYgaXQgd2VyZQorICAgKiAgIHRoZW4gdHlwZV9wb3NfaXNfZXhwZWN0YXRpb24gd291bGQgYmUgVFJVRS4gVGhlIHBhcmVudAorICAgKiAgIGlzIHRodXMga25vd24gdG8gYmUgYSB0b3BsZXZlbCBvciBTVFJVQ1QuCisgICAqCisgICAqIENhc2VzIHdoZXJlIHdyaXRlci0+dHlwZV9wb3NfaXNfZXhwZWN0YXRpb246CisgICAqICAgKGluIHRoZXNlIGNhc2VzIHdlIHdhbnQgdG8gdXBkYXRlIHRvIG5leHQgZXhwZWN0ZWQgdHlwZSB0byB3cml0ZSkKKyAgICoKKyAgICogLSB3ZSByZWN1cnNlZCBmcm9tIFNUUlVDVCBpbnRvIFNUUlVDVCBhbmQgd2UgZGlkbid0IGluY3JlbWVudAorICAgKiAgIHR5cGVfcG9zIGluIHRoZSBwYXJlbnQganVzdCB0byBzdGF5IGNvbnNpc3RlbnQgd2l0aCB0aGUKKyAgICogICAhd3JpdGVyLT50eXBlX3Bvc19pc19leHBlY3RhdGlvbiBjYXNlICh0aG91Z2ggd2UgY291bGQKKyAgICogICBzcGVjaWFsLWNhc2UgdGhpcyBpbiByZWN1cnNlX3N0cnVjdCBpbnN0ZWFkIGlmIHdlIHdhbnRlZCkKKyAgICogICAgICAgd3JpdGVyLT50eXBlX3BvcyA9IHN1Yi0+dHlwZV9wb3MKKyAgICoKKyAgICogLSB3ZSByZWN1cnNlZCBmcm9tIFNUUlVDVCBpbnRvIEFSUkFZIG9yIFZBUklBTlQgYW5kIHR5cGVfcG9zCisgICAqICAgZm9yIHBhcmVudCBzaG91bGQgaGF2ZSBiZWVuIGluY3JlbWVudGVkIGFscmVhZHkKKyAgICogICAgICAgd3JpdGVyLT50eXBlX3BvcyBzaG91bGQgcmVtYWluIGFzLWlzCisgICAqCisgICAqIC0gd2UgcmVjdXJzZWQgZnJvbSBBUlJBWSBpbnRvIGEgc3ViLWVsZW1lbnQsIHNvIHR5cGVfcG9zIGluIHRoZQorICAgKiAgIHBhcmVudCBpcyB0aGUgZWxlbWVudCB0eXBlIGFuZCBzaG91bGQgcmVtYWluIHRoZSBlbGVtZW50IHR5cGUKKyAgICogICBmb3IgdGhlIGJlbmVmaXQgb2YgdGhlIG5leHQgY2hpbGQgZWxlbWVudAorICAgKiAgICAgICB3cml0ZXItPnR5cGVfcG9zIHNob3VsZCByZW1haW4gYXMtaXMKKyAgICoKKyAgICogLSB3ZSByZWN1cnNlZCBmcm9tIFZBUklBTlQgaW50byBpdHMgdmFsdWUsIHNvIHR5cGVfcG9zIGluIHRoZQorICAgKiAgIHBhcmVudCBtYWtlcyBubyBkaWZmZXJlbmNlIHNpbmNlIHRoZXJlJ3Mgb25seSBvbmUgdmFsdWUKKyAgICogICBhbmQgd2UganVzdCBmaW5pc2hlZCB3cml0aW5nIGl0IGFuZCB3b24ndCB1c2UgdHlwZV9wb3MgYWdhaW4KKyAgICogICAgICAgd3JpdGVyLT50eXBlX3BvcyBzaG91bGQgcmVtYWluIGFzLWlzCisgICAqCisgICAqCisgICAqIEZvciBhbGwgdGhlc2UsIERJQ1RfRU5UUlkgaXMgdGhlIHNhbWUgYXMgU1RSVUNUCisgICAqLworICBpZiAod3JpdGVyLT50eXBlX3N0ciAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmICgoc3ViLT5jb250YWluZXJfdHlwZSA9PSBEQlVTX1RZUEVfU1RSVUNUIHx8CisgICAgICAgICAgIHN1Yi0+Y29udGFpbmVyX3R5cGUgPT0gREJVU19UWVBFX0RJQ1RfRU5UUlkpICYmCisgICAgICAgICAgKHdyaXRlci0+Y29udGFpbmVyX3R5cGUgPT0gREJVU19UWVBFX1NUUlVDVCB8fAorICAgICAgICAgICB3cml0ZXItPmNvbnRhaW5lcl90eXBlID09IERCVVNfVFlQRV9ESUNUX0VOVFJZIHx8CisgICAgICAgICAgIHdyaXRlci0+Y29udGFpbmVyX3R5cGUgPT0gREJVU19UWVBFX0lOVkFMSUQpKQorICAgICAgICB7CisgICAgICAgICAgLyogQWR2YW5jZSB0aGUgcGFyZW50IHRvIHRoZSBuZXh0IHN0cnVjdCBmaWVsZCAqLworICAgICAgICAgIHdyaXRlci0+dHlwZV9wb3MgPSBzdWItPnR5cGVfcG9zOworICAgICAgICB9CisgICAgfQorCisgIHdyaXRlci0+dmFsdWVfcG9zID0gc3ViLT52YWx1ZV9wb3M7CisKKyNpZiBSRUNVUlNJVkVfTUFSU0hBTF9XUklURV9UUkFDRQorICBfZGJ1c192ZXJib3NlICgiICB0eXBlIHdyaXRlciAlcCB1bnJlY3Vyc2VkIHR5cGVfcG9zID0gJWQgdmFsdWVfcG9zID0gJWQgcmVtYWluaW5nIHNpZyAnJXMnXG4iLAorICAgICAgICAgICAgICAgICB3cml0ZXIsIHdyaXRlci0+dHlwZV9wb3MsIHdyaXRlci0+dmFsdWVfcG9zLAorICAgICAgICAgICAgICAgICB3cml0ZXItPnR5cGVfc3RyID8KKyAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhX2xlbiAod3JpdGVyLT50eXBlX3N0ciwgd3JpdGVyLT50eXBlX3BvcywgMCkgOgorICAgICAgICAgICAgICAgICAidW5rbm93biIpOworI2VuZGlmCisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogV3JpdGVzIG91dCBhIGJhc2ljIHR5cGUuCisgKgorICogQHBhcmFtIHdyaXRlciB0aGUgd3JpdGVyCisgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSB0byB3cml0ZQorICogQHBhcmFtIHZhbHVlIHRoZSBhZGRyZXNzIG9mIHRoZSB2YWx1ZSB0byB3cml0ZQorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfdHlwZV93cml0ZXJfd3JpdGVfYmFzaWMgKERCdXNUeXBlV3JpdGVyICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAgICAgKnZhbHVlKQoreworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisKKyAgLyogRmlyc3QgZW5zdXJlIHRoYXQgb3VyIHR5cGUgcmVhbGxvYyB3aWxsIHN1Y2NlZWQgKi8KKyAgaWYgKCF3cml0ZXItPnR5cGVfcG9zX2lzX2V4cGVjdGF0aW9uICYmIHdyaXRlci0+dHlwZV9zdHIgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hbGxvY19zcGFjZSAod3JpdGVyLT50eXBlX3N0ciwgMSkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgcmV0dmFsID0gRkFMU0U7CisKKyAgaWYgKCFfZGJ1c190eXBlX3dyaXRlcl93cml0ZV9iYXNpY19ub190eXBlY29kZSAod3JpdGVyLCB0eXBlLCB2YWx1ZSkpCisgICAgZ290byBvdXQ7CisKKyAgaWYgKCF3cml0ZV9vcl92ZXJpZnlfdHlwZWNvZGUgKHdyaXRlciwgdHlwZSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZmFpbGVkIHRvIHdyaXRlIHR5cGVjb2RlIGFmdGVyIHByZWFsbG9jIik7CisKKyAgcmV0dmFsID0gVFJVRTsKKworIG91dDoKKyNpZiBSRUNVUlNJVkVfTUFSU0hBTF9XUklURV9UUkFDRQorICBfZGJ1c192ZXJib3NlICgiICB0eXBlIHdyaXRlciAlcCBiYXNpYyB0eXBlX3BvcyA9ICVkIHZhbHVlX3BvcyA9ICVkIGlzX2V4cGVjdGF0aW9uID0gJWQgZW5hYmxlZCA9ICVkXG4iLAorICAgICAgICAgICAgICAgICB3cml0ZXIsIHdyaXRlci0+dHlwZV9wb3MsIHdyaXRlci0+dmFsdWVfcG9zLCB3cml0ZXItPnR5cGVfcG9zX2lzX2V4cGVjdGF0aW9uLAorICAgICAgICAgICAgICAgICB3cml0ZXItPmVuYWJsZWQpOworI2VuZGlmCisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBXcml0ZXMgYSBibG9jayBvZiBmaXhlZC1sZW5ndGggYmFzaWMgdmFsdWVzLCBpLmUuIHRob3NlIHRoYXQgYXJlCisgKiBib3RoIGRidXNfdHlwZV9pc19maXhlZCgpIGFuZCBfZGJ1c190eXBlX2lzX2Jhc2ljKCkuIFRoZSBibG9jaworICogbXVzdCBiZSB3cml0dGVuIGluc2lkZSBhbiBhcnJheS4KKyAqCisgKiBUaGUgdmFsdWUgcGFyYW1ldGVyIHNob3VsZCBiZSB0aGUgYWRkcmVzcyBvZiBzYWlkIGFycmF5IG9mIHZhbHVlcywKKyAqIHNvIGUuZy4gaWYgaXQncyBhbiBhcnJheSBvZiBkb3VibGUsIHBhc3MgaW4gImNvbnN0IGRvdWJsZSoqIgorICoKKyAqIEBwYXJhbSB3cml0ZXIgdGhlIHdyaXRlcgorICogQHBhcmFtIGVsZW1lbnRfdHlwZSB0eXBlIG9mIHN0dWZmIGluIHRoZSBhcnJheQorICogQHBhcmFtIHZhbHVlIGFkZHJlc3Mgb2YgdGhlIGFycmF5CisgKiBAcGFyYW0gbl9lbGVtZW50cyBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGFycmF5CisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm8gbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c190eXBlX3dyaXRlcl93cml0ZV9maXhlZF9tdWx0aSAoREJ1c1R5cGVXcml0ZXIgICAgICAgICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICBlbGVtZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAgICAgICAgICAgICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgIG5fZWxlbWVudHMpCit7CisgIF9kYnVzX2Fzc2VydCAod3JpdGVyLT5jb250YWluZXJfdHlwZSA9PSBEQlVTX1RZUEVfQVJSQVkpOworICBfZGJ1c19hc3NlcnQgKGRidXNfdHlwZV9pc19maXhlZCAoZWxlbWVudF90eXBlKSk7CisgIF9kYnVzX2Fzc2VydCAod3JpdGVyLT50eXBlX3Bvc19pc19leHBlY3RhdGlvbik7CisgIF9kYnVzX2Fzc2VydCAobl9lbGVtZW50cyA+PSAwKTsKKworI2lmIFJFQ1VSU0lWRV9NQVJTSEFMX1dSSVRFX1RSQUNFCisgIF9kYnVzX3ZlcmJvc2UgKCIgIHR5cGUgd3JpdGVyICVwIGVudGVyaW5nIGZpeGVkIG11bHRpIHR5cGVfcG9zID0gJWQgdmFsdWVfcG9zID0gJWQgbl9lbGVtZW50cyAlZFxuIiwKKyAgICAgICAgICAgICAgICAgd3JpdGVyLCB3cml0ZXItPnR5cGVfcG9zLCB3cml0ZXItPnZhbHVlX3Bvcywgbl9lbGVtZW50cyk7CisjZW5kaWYKKworICBpZiAoIXdyaXRlX29yX3ZlcmlmeV90eXBlY29kZSAod3JpdGVyLCBlbGVtZW50X3R5cGUpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIk9PTSBzaG91bGQgbm90IGhhcHBlbiBpZiBvbmx5IHZlcmlmeWluZyB0eXBlY29kZSIpOworCisgIGlmICh3cml0ZXItPmVuYWJsZWQpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19tYXJzaGFsX3dyaXRlX2ZpeGVkX211bHRpICh3cml0ZXItPnZhbHVlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLT52YWx1ZV9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5fZWxlbWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci0+Ynl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndyaXRlci0+dmFsdWVfcG9zKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworI2lmIFJFQ1VSU0lWRV9NQVJTSEFMX1dSSVRFX1RSQUNFCisgIF9kYnVzX3ZlcmJvc2UgKCIgIHR5cGUgd3JpdGVyICVwIGZpeGVkIG11bHRpIHdyaXR0ZW4gbmV3IHR5cGVfcG9zID0gJWQgbmV3IHZhbHVlX3BvcyA9ICVkIG5fZWxlbWVudHMgJWRcbiIsCisgICAgICAgICAgICAgICAgIHdyaXRlciwgd3JpdGVyLT50eXBlX3Bvcywgd3JpdGVyLT52YWx1ZV9wb3MsIG5fZWxlbWVudHMpOworI2VuZGlmCisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitlbmFibGVfaWZfYWZ0ZXIgKERCdXNUeXBlV3JpdGVyICAgICAgICp3cml0ZXIsCisgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICAgICAgICpyZWFkZXIsCisgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNUeXBlUmVhZGVyICpzdGFydF9hZnRlcikKK3sKKyAgaWYgKHN0YXJ0X2FmdGVyKQorICAgIHsKKyAgICAgIGlmICghd3JpdGVyLT5lbmFibGVkICYmIF9kYnVzX3R5cGVfcmVhZGVyX2dyZWF0ZXJfdGhhbiAocmVhZGVyLCBzdGFydF9hZnRlcikpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c190eXBlX3dyaXRlcl9zZXRfZW5hYmxlZCAod3JpdGVyLCBUUlVFKTsKKyNpZiBSRUNVUlNJVkVfTUFSU0hBTF9XUklURV9UUkFDRQorICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJFTkFCTElORyB3cml0ZXIgJXAgYXQgJWQgYmVjYXVzZSByZWFkZXIgYXQgdmFsdWVfcG9zICVkIGlzIGFmdGVyIHJlYWRlciBhdCB2YWx1ZV9wb3MgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLCB3cml0ZXItPnZhbHVlX3BvcywgcmVhZGVyLT52YWx1ZV9wb3MsIHN0YXJ0X2FmdGVyLT52YWx1ZV9wb3MpOworI2VuZGlmCisgICAgICAgIH0KKworICAgICAgX2RidXNfYXNzZXJ0ICgoIXdyaXRlci0+ZW5hYmxlZCAmJiAhX2RidXNfdHlwZV9yZWFkZXJfZ3JlYXRlcl90aGFuIChyZWFkZXIsIHN0YXJ0X2FmdGVyKSkgfHwKKyAgICAgICAgICAgICAgICAgICAgKHdyaXRlci0+ZW5hYmxlZCAmJiBfZGJ1c190eXBlX3JlYWRlcl9ncmVhdGVyX3RoYW4gKHJlYWRlciwgc3RhcnRfYWZ0ZXIpKSk7CisgICAgfQorfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2FwcGVuZF9maXh1cCAoREJ1c0xpc3QgICAgICAgICAgICAgICAqKmZpeHVwcywKKyAgICAgICAgICAgICAgY29uc3QgREJ1c0FycmF5TGVuRml4dXAgKmZpeHVwKQoreworICBEQnVzQXJyYXlMZW5GaXh1cCAqZjsKKworICBmID0gZGJ1c19uZXcgKERCdXNBcnJheUxlbkZpeHVwLCAxKTsKKyAgaWYgKGYgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgKmYgPSAqZml4dXA7CisKKyAgaWYgKCFfZGJ1c19saXN0X2FwcGVuZCAoZml4dXBzLCBmKSkKKyAgICB7CisgICAgICBkYnVzX2ZyZWUgKGYpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBfZGJ1c19hc3NlcnQgKGYtPmxlbl9wb3NfaW5fcmVhZGVyID09IGZpeHVwLT5sZW5fcG9zX2luX3JlYWRlcik7CisgIF9kYnVzX2Fzc2VydCAoZi0+bmV3X2xlbiA9PSBmaXh1cC0+bmV3X2xlbik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIFRoaXMgbG9vcCBpcyB0cml2aWFsIGlmIHlvdSBpZ25vcmUgYWxsIHRoZSBzdGFydF9hZnRlciBub25zZW5zZSwKKyAqIHNvIGlmIHlvdSdyZSB0cnlpbmcgdG8gZmlndXJlIGl0IG91dCwgc3RhcnQgYnkgaWdub3JpbmcgdGhhdAorICovCitzdGF0aWMgZGJ1c19ib29sX3QKK3dyaXRlcl93cml0ZV9yZWFkZXJfaGVscGVyIChEQnVzVHlwZVdyaXRlciAgICAgICAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICAgICAgICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1R5cGVSZWFkZXIgKnN0YXJ0X2FmdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICBzdGFydF9hZnRlcl9uZXdfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICBzdGFydF9hZnRlcl9uZXdfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNMaXN0ICAgICAgICAgICAgKipmaXh1cHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgICAgIGluc2lkZV9zdGFydF9hZnRlcikKK3sKKyAgaW50IGN1cnJlbnRfdHlwZTsKKworICB3aGlsZSAoKGN1cnJlbnRfdHlwZSA9IF9kYnVzX3R5cGVfcmVhZGVyX2dldF9jdXJyZW50X3R5cGUgKHJlYWRlcikpICE9IERCVVNfVFlQRV9JTlZBTElEKQorICAgIHsKKyAgICAgIGlmIChkYnVzX3R5cGVfaXNfY29udGFpbmVyIChjdXJyZW50X3R5cGUpKQorICAgICAgICB7CisgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgc3VicmVhZGVyOworICAgICAgICAgIERCdXNUeXBlV3JpdGVyIHN1YndyaXRlcjsKKyAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpzaWdfc3RyOworICAgICAgICAgIGludCBzaWdfc3RhcnQ7CisgICAgICAgICAgaW50IHNpZ19sZW47CisgICAgICAgICAgZGJ1c19ib29sX3QgZW5hYmxlZF9hdF9yZWN1cnNlOworICAgICAgICAgIGRidXNfYm9vbF90IHBhc3Rfc3RhcnRfYWZ0ZXI7CisgICAgICAgICAgaW50IHJlYWRlcl9hcnJheV9sZW5fcG9zOworICAgICAgICAgIGludCByZWFkZXJfYXJyYXlfc3RhcnRfcG9zOworICAgICAgICAgIGRidXNfYm9vbF90IHRoaXNfaXNfc3RhcnRfYWZ0ZXI7CisKKyAgICAgICAgICAvKiB0eXBlX3BvcyBpcyBjaGVja2VkIHNpbmNlIGUuZy4gaW4gYSBzdHJ1Y3QgdGhlIHN0cnVjdAorICAgICAgICAgICAqIGFuZCBpdHMgZmlyc3QgZmllbGQgaGF2ZSB0aGUgc2FtZSB2YWx1ZV9wb3MuCisgICAgICAgICAgICogdHlwZV9zdHIgd2lsbCBkaWZmZXIgaW4gcmVhZGVyL3N0YXJ0X2FmdGVyIGZvciB2YXJpYW50cworICAgICAgICAgICAqIHdoZXJlIHR5cGVfc3RyIGlzIGluc2lkZSB0aGUgdmFsdWVfc3RyCisgICAgICAgICAgICovCisgICAgICAgICAgaWYgKCFpbnNpZGVfc3RhcnRfYWZ0ZXIgJiYgc3RhcnRfYWZ0ZXIgJiYKKyAgICAgICAgICAgICAgcmVhZGVyLT52YWx1ZV9wb3MgPT0gc3RhcnRfYWZ0ZXItPnZhbHVlX3BvcyAmJgorICAgICAgICAgICAgICByZWFkZXItPnR5cGVfc3RyID09IHN0YXJ0X2FmdGVyLT50eXBlX3N0ciAmJgorICAgICAgICAgICAgICByZWFkZXItPnR5cGVfcG9zID09IHN0YXJ0X2FmdGVyLT50eXBlX3BvcykKKyAgICAgICAgICAgIHRoaXNfaXNfc3RhcnRfYWZ0ZXIgPSBUUlVFOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRoaXNfaXNfc3RhcnRfYWZ0ZXIgPSBGQUxTRTsKKworICAgICAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX3JlY3Vyc2UgKHJlYWRlciwgJnN1YnJlYWRlcik7CisKKyAgICAgICAgICBpZiAoY3VycmVudF90eXBlID09IERCVVNfVFlQRV9BUlJBWSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcmVhZGVyX2FycmF5X2xlbl9wb3MgPSBBUlJBWV9SRUFERVJfTEVOX1BPUyAoJnN1YnJlYWRlcik7CisgICAgICAgICAgICAgIHJlYWRlcl9hcnJheV9zdGFydF9wb3MgPSBzdWJyZWFkZXIudS5hcnJheS5zdGFydF9wb3M7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvKiBxdWlldCBnY2MgKi8KKyAgICAgICAgICAgICAgcmVhZGVyX2FycmF5X2xlbl9wb3MgPSAtMTsKKyAgICAgICAgICAgICAgcmVhZGVyX2FycmF5X3N0YXJ0X3BvcyA9IC0xOworICAgICAgICAgICAgfQorCisgICAgICAgICAgX2RidXNfdHlwZV9yZWFkZXJfZ2V0X3NpZ25hdHVyZSAoJnN1YnJlYWRlciwgJnNpZ19zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpZ19zdGFydCwgJnNpZ19sZW4pOworCisjaWYgUkVDVVJTSVZFX01BUlNIQUxfV1JJVEVfVFJBQ0UKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiYWJvdXQgdG8gcmVjdXJzZSBpbnRvICVzIHJlYWRlciBhdCAlZCBzdWJyZWFkZXIgYXQgJWQgd3JpdGVyIGF0ICVkIHN0YXJ0X2FmdGVyIHJlYWRlciBhdCAlZCB3cml0ZSB0YXJnZXQgbGVuICVkIGluc2lkZV9zdGFydF9hZnRlciA9ICVkIHRoaXNfaXNfc3RhcnRfYWZ0ZXIgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c190eXBlX3RvX3N0cmluZyAoY3VycmVudF90eXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXItPnZhbHVlX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdWJyZWFkZXIudmFsdWVfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci0+dmFsdWVfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0X2FmdGVyID8gc3RhcnRfYWZ0ZXItPnZhbHVlX3BvcyA6IC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICh3cml0ZXItPnZhbHVlX3N0ciksCisgICAgICAgICAgICAgICAgICAgICAgICAgaW5zaWRlX3N0YXJ0X2FmdGVyLCB0aGlzX2lzX3N0YXJ0X2FmdGVyKTsKKyNlbmRpZgorCisgICAgICAgICAgaWYgKCFpbnNpZGVfc3RhcnRfYWZ0ZXIgJiYgIXRoaXNfaXNfc3RhcnRfYWZ0ZXIpCisgICAgICAgICAgICBlbmFibGVfaWZfYWZ0ZXIgKHdyaXRlciwgJnN1YnJlYWRlciwgc3RhcnRfYWZ0ZXIpOworICAgICAgICAgIGVuYWJsZWRfYXRfcmVjdXJzZSA9IHdyaXRlci0+ZW5hYmxlZDsKKyAgICAgICAgICBpZiAoIV9kYnVzX3R5cGVfd3JpdGVyX3JlY3Vyc2VfY29udGFpbmVkX2xlbiAod3JpdGVyLCBjdXJyZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ19zdHIsIHNpZ19zdGFydCwgc2lnX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN1YndyaXRlciwgRkFMU0UpKQorICAgICAgICAgICAgZ290byBvb207CisKKyNpZiBSRUNVUlNJVkVfTUFSU0hBTF9XUklURV9UUkFDRQorICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJyZWN1cnNlZCBpbnRvIHN1YndyaXRlciBhdCAlZCB3cml0ZSB0YXJnZXQgbGVuICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN1YndyaXRlci52YWx1ZV9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHN1YndyaXRlci52YWx1ZV9zdHIpKTsKKyNlbmRpZgorCisgICAgICAgICAgaWYgKCF3cml0ZXJfd3JpdGVfcmVhZGVyX2hlbHBlciAoJnN1YndyaXRlciwgJnN1YnJlYWRlciwgc3RhcnRfYWZ0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRfYWZ0ZXJfbmV3X3Bvcywgc3RhcnRfYWZ0ZXJfbmV3X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXh1cHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zaWRlX3N0YXJ0X2FmdGVyIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc19pc19zdGFydF9hZnRlcikpCisgICAgICAgICAgICBnb3RvIG9vbTsKKworI2lmIFJFQ1VSU0lWRV9NQVJTSEFMX1dSSVRFX1RSQUNFCisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoImFib3V0IHRvIHVucmVjdXJzZSBmcm9tICVzIHN1YnJlYWRlciBhdCAlZCB3cml0ZXIgYXQgJWQgc3Vid3JpdGVyIGF0ICVkICB3cml0ZSB0YXJnZXQgbGVuICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3R5cGVfdG9fc3RyaW5nIChjdXJyZW50X3R5cGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnJlYWRlci52YWx1ZV9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLT52YWx1ZV9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3Vid3JpdGVyLnZhbHVlX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAod3JpdGVyLT52YWx1ZV9zdHIpKTsKKyNlbmRpZgorCisgICAgICAgICAgaWYgKCFpbnNpZGVfc3RhcnRfYWZ0ZXIgJiYgIXRoaXNfaXNfc3RhcnRfYWZ0ZXIpCisgICAgICAgICAgICBlbmFibGVfaWZfYWZ0ZXIgKHdyaXRlciwgJnN1YnJlYWRlciwgc3RhcnRfYWZ0ZXIpOworICAgICAgICAgIHBhc3Rfc3RhcnRfYWZ0ZXIgPSB3cml0ZXItPmVuYWJsZWQ7CisgICAgICAgICAgaWYgKCFfZGJ1c190eXBlX3dyaXRlcl91bnJlY3Vyc2UgKHdyaXRlciwgJnN1YndyaXRlcikpCisgICAgICAgICAgICBnb3RvIG9vbTsKKworICAgICAgICAgIC8qIElmIHdlIHdlcmVuJ3QgZW5hYmxlZCB3aGVuIHdlIHJlY3Vyc2VkLCB3ZSBkaWRuJ3QKKyAgICAgICAgICAgKiB3cml0ZSBhbiBhcnJheSBsZW47IGlmIHdlIHBhc3NlZCBzdGFydF9hZnRlcgorICAgICAgICAgICAqIHNvbWV3aGVyZSBpbnNpZGUgdGhlIGFycmF5LCB0aGVuIHdlIG5lZWQgdG8gZ2VuZXJhdGUKKyAgICAgICAgICAgKiBhIGZpeHVwLgorICAgICAgICAgICAqLworICAgICAgICAgIGlmIChzdGFydF9hZnRlciAhPSBOVUxMICYmCisgICAgICAgICAgICAgICFlbmFibGVkX2F0X3JlY3Vyc2UgJiYgcGFzdF9zdGFydF9hZnRlciAmJgorICAgICAgICAgICAgICBjdXJyZW50X3R5cGUgPT0gREJVU19UWVBFX0FSUkFZICYmCisgICAgICAgICAgICAgIGZpeHVwcyAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBEQnVzQXJyYXlMZW5GaXh1cCBmaXh1cDsKKyAgICAgICAgICAgICAgaW50IGJ5dGVzX3dyaXR0ZW5fYWZ0ZXJfc3RhcnRfYWZ0ZXI7CisgICAgICAgICAgICAgIGludCBieXRlc19iZWZvcmVfc3RhcnRfYWZ0ZXI7CisgICAgICAgICAgICAgIGludCBvbGRfbGVuOworCisgICAgICAgICAgICAgIC8qIHRoaXMgc3Vid3JpdGVyIGFjY2VzcyBpcyBtb2RlcmF0ZWx5IHVua29zaGVyIHNpbmNlIHdlCisgICAgICAgICAgICAgICAqIGFscmVhZHkgdW5yZWN1cnNlZCwgYnV0IGl0IHdvcmtzIGFzIGxvbmcgYXMgdW5yZWN1cnNlCisgICAgICAgICAgICAgICAqIGRvZXNuJ3QgYnJlYWsgdXMgb24gcHVycG9zZQorICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgYnl0ZXNfd3JpdHRlbl9hZnRlcl9zdGFydF9hZnRlciA9IHdyaXRlcl9nZXRfYXJyYXlfbGVuICgmc3Vid3JpdGVyKTsKKworICAgICAgICAgICAgICBieXRlc19iZWZvcmVfc3RhcnRfYWZ0ZXIgPQorICAgICAgICAgICAgICAgIHN0YXJ0X2FmdGVyLT52YWx1ZV9wb3MgLSByZWFkZXJfYXJyYXlfc3RhcnRfcG9zOworCisgICAgICAgICAgICAgIGZpeHVwLmxlbl9wb3NfaW5fcmVhZGVyID0gcmVhZGVyX2FycmF5X2xlbl9wb3M7CisgICAgICAgICAgICAgIGZpeHVwLm5ld19sZW4gPQorICAgICAgICAgICAgICAgIGJ5dGVzX2JlZm9yZV9zdGFydF9hZnRlciArCisgICAgICAgICAgICAgICAgc3RhcnRfYWZ0ZXJfbmV3X2xlbiArCisgICAgICAgICAgICAgICAgYnl0ZXNfd3JpdHRlbl9hZnRlcl9zdGFydF9hZnRlcjsKKworICAgICAgICAgICAgICBfZGJ1c19hc3NlcnQgKF9EQlVTX0FMSUdOX1ZBTFVFIChmaXh1cC5sZW5fcG9zX2luX3JlYWRlciwgNCkgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpIGZpeHVwLmxlbl9wb3NfaW5fcmVhZGVyKTsKKworICAgICAgICAgICAgICBvbGRfbGVuID0gX2RidXNfdW5wYWNrX3VpbnQzMiAocmVhZGVyLT5ieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF91ZGF0YV9sZW4gKHJlYWRlci0+dmFsdWVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZml4dXAubGVuX3Bvc19pbl9yZWFkZXIsIDQpKTsKKworICAgICAgICAgICAgICBpZiAob2xkX2xlbiAhPSBmaXh1cC5uZXdfbGVuICYmICFhcHBlbmRfZml4dXAgKGZpeHVwcywgJmZpeHVwKSkKKyAgICAgICAgICAgICAgICBnb3RvIG9vbTsKKworI2lmIFJFQ1VSU0lWRV9NQVJTSEFMX1dSSVRFX1RSQUNFCisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJHZW5lcmF0ZWQgZml4dXAgbGVuX3Bvc19pbl9yZWFkZXIgPSAlZCBuZXdfbGVuID0gJWQgcmVhZGVyX2FycmF5X3N0YXJ0X3BvcyA9ICVkIHN0YXJ0X2FmdGVyLT52YWx1ZV9wb3MgPSAlZCBieXRlc19iZWZvcmVfc3RhcnRfYWZ0ZXIgPSAlZCBzdGFydF9hZnRlcl9uZXdfbGVuID0gJWQgYnl0ZXNfd3JpdHRlbl9hZnRlcl9zdGFydF9hZnRlciA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXh1cC5sZW5fcG9zX2luX3JlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZml4dXAubmV3X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyX2FycmF5X3N0YXJ0X3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRfYWZ0ZXItPnZhbHVlX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNfYmVmb3JlX3N0YXJ0X2FmdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydF9hZnRlcl9uZXdfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc193cml0dGVuX2FmdGVyX3N0YXJ0X2FmdGVyKTsKKyNlbmRpZgorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBEQnVzQmFzaWNWYWx1ZSB2YWw7CisKKyAgICAgICAgICBfZGJ1c19hc3NlcnQgKGRidXNfdHlwZV9pc19iYXNpYyAoY3VycmVudF90eXBlKSk7CisKKyNpZiBSRUNVUlNJVkVfTUFSU0hBTF9XUklURV9UUkFDRQorICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJSZWFkaW5nIGJhc2ljIHZhbHVlICVzIGF0ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3R5cGVfdG9fc3RyaW5nIChjdXJyZW50X3R5cGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci0+dmFsdWVfcG9zKTsKKyNlbmRpZgorCisgICAgICAgICAgX2RidXNfdHlwZV9yZWFkZXJfcmVhZF9iYXNpYyAocmVhZGVyLCAmdmFsKTsKKworI2lmIFJFQ1VSU0lWRV9NQVJTSEFMX1dSSVRFX1RSQUNFCisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIldyaXRpbmcgYmFzaWMgdmFsdWUgJXMgYXQgJWQgd3JpdGUgdGFyZ2V0IGxlbiAlZCBpbnNpZGVfc3RhcnRfYWZ0ZXIgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c190eXBlX3RvX3N0cmluZyAoY3VycmVudF90eXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXItPnZhbHVlX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAod3JpdGVyLT52YWx1ZV9zdHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGluc2lkZV9zdGFydF9hZnRlcik7CisjZW5kaWYKKyAgICAgICAgICBpZiAoIWluc2lkZV9zdGFydF9hZnRlcikKKyAgICAgICAgICAgIGVuYWJsZV9pZl9hZnRlciAod3JpdGVyLCByZWFkZXIsIHN0YXJ0X2FmdGVyKTsKKyAgICAgICAgICBpZiAoIV9kYnVzX3R5cGVfd3JpdGVyX3dyaXRlX2Jhc2ljICh3cml0ZXIsIGN1cnJlbnRfdHlwZSwgJnZhbCkpCisgICAgICAgICAgICBnb3RvIG9vbTsKKyNpZiBSRUNVUlNJVkVfTUFSU0hBTF9XUklURV9UUkFDRQorICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJXcm90ZSBiYXNpYyB2YWx1ZSAlcywgbmV3IHZhbHVlX3BvcyAlZCB3cml0ZSB0YXJnZXQgbGVuICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3R5cGVfdG9fc3RyaW5nIChjdXJyZW50X3R5cGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci0+dmFsdWVfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICh3cml0ZXItPnZhbHVlX3N0cikpOworI2VuZGlmCisgICAgICAgIH0KKworICAgICAgX2RidXNfdHlwZV9yZWFkZXJfbmV4dCAocmVhZGVyKTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7CisKKyBvb206CisgIGlmIChmaXh1cHMpCisgICAgYXBwbHlfYW5kX2ZyZWVfZml4dXBzIChmaXh1cHMsIE5VTEwpOyAvKiBOVUxMIGZvciByZWFkZXIgdG8gYXBwbHkgdG8gKi8KKworICByZXR1cm4gRkFMU0U7Cit9CisKKy8qCisgKiBJdGVyYXRlIHRocm91Z2ggYWxsIHZhbHVlcyBpbiB0aGUgZ2l2ZW4gcmVhZGVyLCB3cml0aW5nIGEgY29weSBvZgorICogZWFjaCB2YWx1ZSB0byB0aGUgd3JpdGVyLiAgVGhlIHJlYWRlciB3aWxsIGJlIG1vdmVkIGZvcndhcmQgdG8gaXRzCisgKiBlbmQgcG9zaXRpb24uCisgKgorICogSWYgYSByZWFkZXIgc3RhcnRfYWZ0ZXIgaXMgcHJvdmlkZWQsIGl0IHNob3VsZCBiZSBhIHJlYWRlciBmb3IgdGhlCisgKiBzYW1lIGRhdGEgYXMgdGhlIHJlYWRlciB0byBiZSB3cml0dGVuLiBPbmx5IHZhbHVlcyBvY2N1cnJpbmcgYWZ0ZXIKKyAqIHRoZSB2YWx1ZSBwb2ludGVkIHRvIGJ5IHN0YXJ0X2FmdGVyIHdpbGwgYmUgd3JpdHRlbiB0byB0aGUgd3JpdGVyLgorICoKKyAqIElmIHN0YXJ0X2FmdGVyIGlzIHByb3ZpZGVkLCB0aGVuIHRoZSBjb3B5IG9mIHRoZSByZWFkZXIgd2lsbCBiZQorICogcGFydGlhbC4gVGhpcyBtZWFucyB0aGF0IGFycmF5IGxlbmd0aHMgd2lsbCBub3QgaGF2ZSBiZWVuIGNvcGllZC4KKyAqIFRoZSBhc3N1bXB0aW9uIGlzIHRoYXQgeW91IHdyb3RlIGEgbmV3IHZlcnNpb24gb2YgdGhlIHZhbHVlIGF0CisgKiBzdGFydF9hZnRlciB0byB0aGUgd3JpdGVyLiBZb3UgaGF2ZSB0byBwYXNzIGluIHRoZSBzdGFydCBwb3NpdGlvbgorICogYW5kIGxlbmd0aCBvZiB0aGUgbmV3IHZhbHVlLiAoSWYgeW91IGFyZSBkZWxldGluZyB0aGUgdmFsdWUKKyAqIGF0IHN0YXJ0X2FmdGVyLCBwYXNzIGluIDAgZm9yIHRoZSBsZW5ndGguKQorICoKKyAqIElmIHRoZSBmaXh1cHMgcGFyYW1ldGVyIGlzIG5vbi0jTlVMTCwgdGhlbiBhbnkgYXJyYXkgbGVuZ3RoIHRoYXQKKyAqIHdhcyByZWFkIGJ1dCBub3Qgd3JpdHRlbiBkdWUgdG8gc3RhcnRfYWZ0ZXIgd2lsbCBiZSBwcm92aWRlZAorICogYXMgYSAjREJ1c0FycmF5TGVuRml4dXAuIFRoZSBmaXh1cCBjb250YWlucyB0aGUgcG9zaXRpb24gb2YgdGhlCisgKiBhcnJheSBsZW5ndGggaW4gdGhlIHNvdXJjZSBkYXRhLCBhbmQgdGhlIGNvcnJlY3QgYXJyYXkgbGVuZ3RoCisgKiBhc3N1bWluZyB5b3UgY29tYmluZSB0aGUgc291cmNlIGRhdGEgYmVmb3JlIHN0YXJ0X2FmdGVyIHdpdGgKKyAqIHRoZSB3cml0dGVuIGRhdGEgYXQgc3RhcnRfYWZ0ZXIgYW5kIGJleW9uZC4KKyAqCisgKiBAcGFyYW0gd3JpdGVyIHRoZSB3cml0ZXIgdG8gY29weSB0bworICogQHBhcmFtIHJlYWRlciB0aGUgcmVhZGVyIHRvIGNvcHkgZnJvbQorICogQHBhcmFtIHN0YXJ0X2FmdGVyICNOVUxMIG9yIGEgcmVhZGVyIHNob3dpbmcgd2hlcmUgdG8gc3RhcnQKKyAqIEBwYXJhbSBzdGFydF9hZnRlcl9uZXdfcG9zIHRoZSBwb3NpdGlvbiBvZiBzdGFydF9hZnRlciBlcXVpdmFsZW50IGluIHRoZSB0YXJnZXQgZGF0YQorICogQHBhcmFtIHN0YXJ0X2FmdGVyX25ld19sZW4gdGhlIGxlbmd0aCBvZiBzdGFydF9hZnRlciBlcXVpdmFsZW50IGluIHRoZSB0YXJnZXQgZGF0YQorICogQHBhcmFtIGZpeHVwcyBsaXN0IHRvIGFwcGVuZCAjREJ1c0FycmF5TGVuRml4dXAgaWYgdGhlIHdyaXRlIHdhcyBwYXJ0aWFsCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm8gbWVtb3J5CisgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAorX2RidXNfdHlwZV93cml0ZXJfd3JpdGVfcmVhZGVyX3BhcnRpYWwgKERCdXNUeXBlV3JpdGVyICAgICAgICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgICAgICAgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzVHlwZVJlYWRlciAqc3RhcnRfYWZ0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgIHN0YXJ0X2FmdGVyX25ld19wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgIHN0YXJ0X2FmdGVyX25ld19sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICAgICAgICAgICAqKmZpeHVwcykKK3sKKyAgREJ1c1R5cGVXcml0ZXIgb3JpZzsKKyAgaW50IG9yaWdfdHlwZV9sZW47CisgIGludCBvcmlnX3ZhbHVlX2xlbjsKKyAgaW50IG5ld19ieXRlczsKKyAgaW50IG9yaWdfZW5hYmxlZDsKKworICBvcmlnID0gKndyaXRlcjsKKyAgb3JpZ190eXBlX2xlbiA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICh3cml0ZXItPnR5cGVfc3RyKTsKKyAgb3JpZ192YWx1ZV9sZW4gPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAod3JpdGVyLT52YWx1ZV9zdHIpOworICBvcmlnX2VuYWJsZWQgPSB3cml0ZXItPmVuYWJsZWQ7CisKKyAgaWYgKHN0YXJ0X2FmdGVyKQorICAgIF9kYnVzX3R5cGVfd3JpdGVyX3NldF9lbmFibGVkICh3cml0ZXIsIEZBTFNFKTsKKworICBpZiAoIXdyaXRlcl93cml0ZV9yZWFkZXJfaGVscGVyICh3cml0ZXIsIHJlYWRlciwgc3RhcnRfYWZ0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0X2FmdGVyX25ld19wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0X2FmdGVyX25ld19sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpeHVwcywgRkFMU0UpKQorICAgIGdvdG8gb29tOworCisgIF9kYnVzX3R5cGVfd3JpdGVyX3NldF9lbmFibGVkICh3cml0ZXIsIG9yaWdfZW5hYmxlZCk7CisgIHJldHVybiBUUlVFOworCisgb29tOgorICBpZiAoIXdyaXRlci0+dHlwZV9wb3NfaXNfZXhwZWN0YXRpb24pCisgICAgeworICAgICAgbmV3X2J5dGVzID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHdyaXRlci0+dHlwZV9zdHIpIC0gb3JpZ190eXBlX2xlbjsKKyAgICAgIF9kYnVzX3N0cmluZ19kZWxldGUgKHdyaXRlci0+dHlwZV9zdHIsIG9yaWcudHlwZV9wb3MsIG5ld19ieXRlcyk7CisgICAgfQorICBuZXdfYnl0ZXMgPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAod3JpdGVyLT52YWx1ZV9zdHIpIC0gb3JpZ192YWx1ZV9sZW47CisgIF9kYnVzX3N0cmluZ19kZWxldGUgKHdyaXRlci0+dmFsdWVfc3RyLCBvcmlnLnZhbHVlX3BvcywgbmV3X2J5dGVzKTsKKworICAqd3JpdGVyID0gb3JpZzsKKworICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKgorICogSXRlcmF0ZSB0aHJvdWdoIGFsbCB2YWx1ZXMgaW4gdGhlIGdpdmVuIHJlYWRlciwgd3JpdGluZyBhIGNvcHkgb2YKKyAqIGVhY2ggdmFsdWUgdG8gdGhlIHdyaXRlci4gIFRoZSByZWFkZXIgd2lsbCBiZSBtb3ZlZCBmb3J3YXJkIHRvIGl0cworICogZW5kIHBvc2l0aW9uLgorICoKKyAqIEBwYXJhbSB3cml0ZXIgdGhlIHdyaXRlciB0byBjb3B5IHRvCisgKiBAcGFyYW0gcmVhZGVyIHRoZSByZWFkZXIgdG8gY29weSBmcm9tCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm8gbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c190eXBlX3dyaXRlcl93cml0ZV9yZWFkZXIgKERCdXNUeXBlV3JpdGVyICAgICAgICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyICAgICAgICpyZWFkZXIpCit7CisgIHJldHVybiBfZGJ1c190eXBlX3dyaXRlcl93cml0ZV9yZWFkZXJfcGFydGlhbCAod3JpdGVyLCByZWFkZXIsIE5VTEwsIDAsIDAsIE5VTEwpOworfQorCisvKgorICogSWYgZGlzYWJsZWQsIGEgd3JpdGVyIGNhbiBzdGlsbCBiZSBpdGVyYXRlZCBmb3J3YXJkIGFuZCByZWN1cnNlZC91bnJlY3Vyc2VkCisgKiBidXQgd29uJ3Qgd3JpdGUgYW55IHZhbHVlcy4gVHlwZXMgd2lsbCBzdGlsbCBiZSB3cml0dGVuIHVubGVzcyB0aGUKKyAqIHdyaXRlciBpcyBhICJ2YWx1ZXMgb25seSIgd3JpdGVyLCBiZWNhdXNlIHRoZSB3cml0ZXIgbmVlZHMgYWNjZXNzIHRvCisgKiBhIHZhbGlkIHNpZ25hdHVyZSB0byBiZSBhYmxlIHRvIGl0ZXJhdGUuCisgKgorICogQHBhcmFtIHdyaXRlciB0aGUgdHlwZSB3cml0ZXIKKyAqIEBwYXJhbSBlbmFibGVkICNUUlVFIGlmIHZhbHVlcyBzaG91bGQgYmUgd3JpdHRlbgorICovCitzdGF0aWMgdm9pZAorX2RidXNfdHlwZV93cml0ZXJfc2V0X2VuYWJsZWQgKERCdXNUeXBlV3JpdGVyICAgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICBlbmFibGVkKQoreworICB3cml0ZXItPmVuYWJsZWQgPSBlbmFibGVkICE9IEZBTFNFOworfQorCisvKiogQH0gKi8gLyogZW5kIG9mIERCdXNNYXJzaGFsIGdyb3VwICovCisKKy8qIHRlc3RzIGluIGRidXMtbWFyc2hhbC1yZWN1cnNpdmUtdXRpbC5jICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtbWFyc2hhbC1yZWN1cnNpdmUuaCBiL2RidXMvZGJ1cy1tYXJzaGFsLXJlY3Vyc2l2ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMWQxZWYKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtbWFyc2hhbC1yZWN1cnNpdmUuaApAQCAtMCwwICsxLDE5OSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLW1hcnNoYWwtcmVjdXJzaXZlLmggIE1hcnNoYWxsaW5nIHJvdXRpbmVzIGZvciByZWN1cnNpdmUgdHlwZXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBEQlVTX01BUlNIQUxfUkVDVVJTSVZFX0gKKyNkZWZpbmUgREJVU19NQVJTSEFMX1JFQ1VSU0lWRV9ICisKKyNpbmNsdWRlIDxkYnVzL2RidXMtcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbGlzdC5oPgorCit0eXBlZGVmIHN0cnVjdCBEQnVzVHlwZVJlYWRlciAgICAgIERCdXNUeXBlUmVhZGVyOwordHlwZWRlZiBzdHJ1Y3QgREJ1c1R5cGVXcml0ZXIgICAgICBEQnVzVHlwZVdyaXRlcjsKK3R5cGVkZWYgc3RydWN0IERCdXNUeXBlUmVhZGVyQ2xhc3MgREJ1c1R5cGVSZWFkZXJDbGFzczsKK3R5cGVkZWYgc3RydWN0IERCdXNBcnJheUxlbkZpeHVwICAgREJ1c0FycmF5TGVuRml4dXA7CisKKy8qKgorICogVGhlIHR5cGUgcmVhZGVyIGlzIGFuIGl0ZXJhdG9yIGZvciByZWFkaW5nIHZhbHVlcyBmcm9tIGEgYmxvY2sgb2YKKyAqIHZhbHVlcy4KKyAqLworc3RydWN0IERCdXNUeXBlUmVhZGVyCit7CisgIGRidXNfdWludDMyX3QgYnl0ZV9vcmRlciA6IDg7IC8qKjwgYnl0ZSBvcmRlciBvZiB0aGUgYmxvY2sgKi8KKworICBkYnVzX3VpbnQzMl90IGZpbmlzaGVkIDogMTsgICAvKio8IG1hcmtzIHdlJ3JlIGF0IGVuZCBpdGVyYXRvciBmb3IgY2FzZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogd2hlcmUgd2UgZG9uJ3QgaGF2ZSBhbm90aGVyIHdheSB0byB0ZWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBkYnVzX3VpbnQzMl90IGFycmF5X2xlbl9vZmZzZXQgOiAzOyAvKio8IGJ5dGVzIGJhY2sgZnJvbSBzdGFydF9wb3MgdGhhdCBsZW4gZW5kcyAqLworICBjb25zdCBEQnVzU3RyaW5nICp0eXBlX3N0cjsgICAvKio8IHN0cmluZyBjb250YWluaW5nIHNpZ25hdHVyZSBvZiBibG9jayAqLworICBpbnQgdHlwZV9wb3M7ICAgICAgICAgICAgICAgICAvKio8IGN1cnJlbnQgcG9zaXRpb24gaW4gc2lnbmF0dXJlICovCisgIGNvbnN0IERCdXNTdHJpbmcgKnZhbHVlX3N0cjsgIC8qKjwgc3RyaW5nIGNvbnRhaW5pbmcgdmFsdWVzIG9mIGJsb2NrICovCisgIGludCB2YWx1ZV9wb3M7ICAgICAgICAgICAgICAgIC8qKjwgY3VycmVudCBwb3NpdGlvbiBpbiB2YWx1ZXMgKi8KKworICBjb25zdCBEQnVzVHlwZVJlYWRlckNsYXNzICprbGFzczsgLyoqPCB0aGUgdnRhYmxlIGZvciB0aGUgcmVhZGVyICovCisgIHVuaW9uCisgIHsKKyAgICBzdHJ1Y3QgeworICAgICAgaW50IHN0YXJ0X3BvczsgICAgICAgICAgICAgICAgLyoqPCBmb3IgYXJyYXkgcmVhZGVycywgdGhlIHN0YXJ0IG9mIHRoZSBhcnJheSB2YWx1ZXMgKi8KKyAgICB9IGFycmF5OworICB9IHU7IC8qKjwgY2xhc3Mtc3BlY2lmaWMgZGF0YSAqLworfTsKKworLyoqCisgKiBUaGUgdHlwZSB3cml0ZXIgaXMgYW4gaXRlcmF0b3IgZm9yIHdyaXRpbmcgdG8gYSBibG9jayBvZiB2YWx1ZXMuCisgKi8KK3N0cnVjdCBEQnVzVHlwZVdyaXRlcgoreworICBkYnVzX3VpbnQzMl90IGJ5dGVfb3JkZXIgOiA4OyAgICAgICAgICAgIC8qKjwgYnl0ZSBvcmRlciB0byB3cml0ZSB2YWx1ZXMgd2l0aCAqLworCisgIGRidXNfdWludDMyX3QgY29udGFpbmVyX3R5cGUgOiA4OyAgICAgICAgLyoqPCB3aGF0IGFyZSB3ZSBpbnNpZGU/IChlLmcuIHN0cnVjdCwgdmFyaWFudCwgYXJyYXkpICovCisKKyAgZGJ1c191aW50MzJfdCB0eXBlX3Bvc19pc19leHBlY3RhdGlvbiA6IDE7IC8qKjwgdHlwZV9wb3MgY2FuIGJlIGVpdGhlciBhbiBpbnNlcnRpb24gcG9pbnQgZm9yIG9yIGFuIGV4cGVjdGVkIG5leHQgdHlwZSAqLworCisgIGRidXNfdWludDMyX3QgZW5hYmxlZCA6IDE7IC8qKjwgd2hldGhlciB0byB3cml0ZSB2YWx1ZXMgKi8KKworICBEQnVzU3RyaW5nICp0eXBlX3N0cjsgLyoqPCB3aGVyZSB0byB3cml0ZSB0eXBlY29kZXMgKG9yIHJlYWQgdHlwZSBleHBlY3RhdGlvbnMpICovCisgIGludCB0eXBlX3BvczsgICAgICAgICAvKio8IGN1cnJlbnQgcG9zIGluIHR5cGVfc3RyICovCisgIERCdXNTdHJpbmcgKnZhbHVlX3N0cjsgLyoqPCB3aGVyZSB0byB3cml0ZSB2YWx1ZXMgKi8KKyAgaW50IHZhbHVlX3BvczsgICAgICAgICAvKio8IG5leHQgcG9zaXRpb24gdG8gd3JpdGUgKi8KKworICB1bmlvbgorICB7CisgICAgc3RydWN0IHsKKyAgICAgIGludCBzdGFydF9wb3M7IC8qKjwgcG9zaXRpb24gb2YgZmlyc3QgZWxlbWVudCBpbiB0aGUgYXJyYXkgKi8KKyAgICAgIGludCBsZW5fcG9zOyAgIC8qKjwgcG9zaXRpb24gb2YgbGVuZ3RoIG9mIHRoZSBhcnJheSAqLworICAgICAgaW50IGVsZW1lbnRfdHlwZV9wb3M7IC8qKjwgcG9zaXRpb24gb2YgYXJyYXkgZWxlbWVudCB0eXBlIGluIHR5cGVfc3RyICovCisgICAgfSBhcnJheTsKKyAgfSB1OyAvKio8IGNsYXNzLXNwZWNpZmljIGRhdGEgKi8KK307CisKKy8qKgorICogV2hlbiBtb2RpZnlpbmcgYW4gZXhpc3RpbmcgYmxvY2sgb2YgdmFsdWVzLCBhcnJheSBsZW5ndGhzIG1heSBuZWVkCisgKiB0byBiZSBhZGp1c3RlZDsgdGhvc2UgYWRqdXN0bWVudHMgYXJlIGRlc2NyaWJlZCBieSB0aGlzIHN0cnVjdC4KKyAqLworc3RydWN0IERCdXNBcnJheUxlbkZpeHVwCit7CisgIGludCBsZW5fcG9zX2luX3JlYWRlcjsgLyoqPCB3aGVyZSB0aGUgbGVuZ3RoIHdhcyBpbiB0aGUgb3JpZ2luYWwgYmxvY2sgKi8KKyAgaW50IG5ld19sZW47ICAgICAgICAgICAvKio8IHRoZSBuZXcgdmFsdWUgb2YgdGhlIGxlbmd0aCBpbiB0aGUgd3JpdHRlbi1vdXQgYmxvY2sgKi8KK307CisKK0RCVVNfUFJJVkFURV9FWFBPUlQKK3ZvaWQgICAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX2luaXQgICAgICAgICAgICAgICAgICAgICAgKERCdXNUeXBlUmVhZGVyICAgICAgICAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAgICAgICp0eXBlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgdHlwZV9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICAgICAgKnZhbHVlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgdmFsdWVfcG9zKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK3ZvaWQgICAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX2luaXRfdHlwZXNfb25seSAgICAgICAgICAgKERCdXNUeXBlUmVhZGVyICAgICAgICAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAgICAgICp0eXBlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgdHlwZV9wb3MpOworREJVU19QUklWQVRFX0VYUE9SVAoraW50ICAgICAgICAgX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2N1cnJlbnRfdHlwZSAgICAgICAgICAoY29uc3QgREJ1c1R5cGVSZWFkZXIgICpyZWFkZXIpOworREJVU19QUklWQVRFX0VYUE9SVAoraW50ICAgICAgICAgX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2VsZW1lbnRfdHlwZSAgICAgICAgICAoY29uc3QgREJ1c1R5cGVSZWFkZXIgICpyZWFkZXIpOworaW50ICAgICAgICAgX2RidXNfdHlwZV9yZWFkZXJfZ2V0X3ZhbHVlX3BvcyAgICAgICAgICAgICAoY29uc3QgREJ1c1R5cGVSZWFkZXIgICpyZWFkZXIpOworREJVU19QUklWQVRFX0VYUE9SVAordm9pZCAgICAgICAgX2RidXNfdHlwZV9yZWFkZXJfcmVhZF9iYXNpYyAgICAgICAgICAgICAgICAoY29uc3QgREJ1c1R5cGVSZWFkZXIgICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgKnZhbHVlKTsKK2ludCAgICAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX2dldF9hcnJheV9sZW5ndGggICAgICAgICAgKGNvbnN0IERCdXNUeXBlUmVhZGVyICAqcmVhZGVyKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK3ZvaWQgICAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX3JlYWRfZml4ZWRfbXVsdGkgICAgICAgICAgKGNvbnN0IERCdXNUeXBlUmVhZGVyICAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAqbl9lbGVtZW50cyk7Cit2b2lkICAgICAgICBfZGJ1c190eXBlX3JlYWRlcl9yZWFkX3JhdyAgICAgICAgICAgICAgICAgIChjb25zdCBEQnVzVHlwZVJlYWRlciAgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgICoqdmFsdWVfbG9jYXRpb24pOworREJVU19QUklWQVRFX0VYUE9SVAordm9pZCAgICAgICAgX2RidXNfdHlwZV9yZWFkZXJfcmVjdXJzZSAgICAgICAgICAgICAgICAgICAoREJ1c1R5cGVSZWFkZXIgICAgICAgICpyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciAgICAgICAgKnN1YnJlYWRlcik7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCBfZGJ1c190eXBlX3JlYWRlcl9uZXh0ICAgICAgICAgICAgICAgICAgICAgIChEQnVzVHlwZVJlYWRlciAgICAgICAgKnJlYWRlcik7CitkYnVzX2Jvb2xfdCBfZGJ1c190eXBlX3JlYWRlcl9oYXNfbmV4dCAgICAgICAgICAgICAgICAgIChjb25zdCBEQnVzVHlwZVJlYWRlciAgKnJlYWRlcik7CitEQlVTX1BSSVZBVEVfRVhQT1JUCit2b2lkICAgICAgICBfZGJ1c190eXBlX3JlYWRlcl9nZXRfc2lnbmF0dXJlICAgICAgICAgICAgIChjb25zdCBEQnVzVHlwZVJlYWRlciAgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICAgICoqc3RyX3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgKnN0YXJ0X3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgKmxlbl9wKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90IF9kYnVzX3R5cGVfcmVhZGVyX3NldF9iYXNpYyAgICAgICAgICAgICAgICAgKERCdXNUeXBlUmVhZGVyICAgICAgICAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAgICAgICAgICAgICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNUeXBlUmVhZGVyICAqcmVhbGlnbl9yb290KTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90IF9kYnVzX3R5cGVfcmVhZGVyX2RlbGV0ZSAgICAgICAgICAgICAgICAgICAgKERCdXNUeXBlUmVhZGVyICAgICAgICAqcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1R5cGVSZWFkZXIgICpyZWFsaWduX3Jvb3QpOworCitkYnVzX2Jvb2xfdCBfZGJ1c190eXBlX3JlYWRlcl9lcXVhbF92YWx1ZXMgICAgICAgICAgICAgIChjb25zdCBEQnVzVHlwZVJlYWRlciAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1R5cGVSZWFkZXIgKnJocyk7CisKK3ZvaWQgICAgICAgIF9kYnVzX3R5cGVfc2lnbmF0dXJlX25leHQgICAgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgICAgICAgICAgICAqc2lnbmF0dXJlLAorCQkJCQkJCSBpbnQgICAgICAgICAgICAgICAgICAgKnR5cGVfcG9zKTsKKworREJVU19QUklWQVRFX0VYUE9SVAordm9pZCAgICAgICAgX2RidXNfdHlwZV93cml0ZXJfaW5pdCAgICAgICAgICAgICAgICAgKERCdXNUeXBlV3JpdGVyICAgICAgICAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICAgICAgKnR5cGVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgdHlwZV9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAgICAgICp2YWx1ZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICB2YWx1ZV9wb3MpOwordm9pZCAgICAgICAgX2RidXNfdHlwZV93cml0ZXJfaW5pdF90eXBlc19kZWxheWVkICAgKERCdXNUeXBlV3JpdGVyICAgICAgICAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICAgICAgKnZhbHVlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgIHZhbHVlX3Bvcyk7Cit2b2lkICAgICAgICBfZGJ1c190eXBlX3dyaXRlcl9hZGRfdHlwZXMgICAgICAgICAgICAoREJ1c1R5cGVXcml0ZXIgICAgICAgICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAgICAgICp0eXBlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgIHR5cGVfcG9zKTsKK3ZvaWQgICAgICAgIF9kYnVzX3R5cGVfd3JpdGVyX3JlbW92ZV90eXBlcyAgICAgICAgIChEQnVzVHlwZVdyaXRlciAgICAgICAgKndyaXRlcik7CitEQlVTX1BSSVZBVEVfRVhQT1JUCit2b2lkICAgICAgICBfZGJ1c190eXBlX3dyaXRlcl9pbml0X3ZhbHVlc19vbmx5ICAgICAoREJ1c1R5cGVXcml0ZXIgICAgICAgICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICAgICAqdHlwZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICB0eXBlX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICAgICAgKnZhbHVlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgIHZhbHVlX3Bvcyk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCBfZGJ1c190eXBlX3dyaXRlcl93cml0ZV9iYXNpYyAgICAgICAgICAoREJ1c1R5cGVXcml0ZXIgICAgICAgICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgICAgICAgICAgICAqdmFsdWUpOworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgX2RidXNfdHlwZV93cml0ZXJfd3JpdGVfZml4ZWRfbXVsdGkgICAgKERCdXNUeXBlV3JpdGVyICAgICAgICAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgICAgICAgICAgICAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICBuX2VsZW1lbnRzKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90IF9kYnVzX3R5cGVfd3JpdGVyX3JlY3Vyc2UgICAgICAgICAgICAgIChEQnVzVHlwZVdyaXRlciAgICAgICAgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcl90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICAgICAqY29udGFpbmVkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICBjb250YWluZWRfdHlwZV9zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVdyaXRlciAgICAgICAgKnN1Yik7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCBfZGJ1c190eXBlX3dyaXRlcl91bnJlY3Vyc2UgICAgICAgICAgICAoREJ1c1R5cGVXcml0ZXIgICAgICAgICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVXcml0ZXIgICAgICAgICpzdWIpOworZGJ1c19ib29sX3QgX2RidXNfdHlwZV93cml0ZXJfYXBwZW5kX2FycmF5ICAgICAgICAgKERCdXNUeXBlV3JpdGVyICAgICAgICAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICAgICAqY29udGFpbmVkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICBjb250YWluZWRfdHlwZV9zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHlwZVdyaXRlciAgICAgICAgKnN1Yik7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCBfZGJ1c190eXBlX3dyaXRlcl93cml0ZV9yZWFkZXIgICAgICAgICAoREJ1c1R5cGVXcml0ZXIgICAgICAgICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1R5cGVSZWFkZXIgICAgICAgICpyZWFkZXIpOworCisKKyNlbmRpZiAvKiBEQlVTX01BUlNIQUxfUkVDVVJTSVZFX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1tYXJzaGFsLXZhbGlkYXRlLXV0aWwuYyBiL2RidXMvZGJ1cy1tYXJzaGFsLXZhbGlkYXRlLXV0aWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTc1YTdlCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLW1hcnNoYWwtdmFsaWRhdGUtdXRpbC5jCkBAIC0wLDAgKzEsNTQzIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtbWFyc2hhbC12YWxpZGF0ZS11dGlsLmMgV291bGQgYmUgaW4gZGJ1cy1tYXJzaGFsLXZhbGlkYXRlLmMsIGJ1dCBvbmx5IHVzZWQgYnkgdGVzdHMvYnVzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpZmRlZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworCisjaWZuZGVmIERPWFlHRU5fU0hPVUxEX1NLSVBfVEhJUworCisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKyNpbmNsdWRlICJkYnVzLW1hcnNoYWwtdmFsaWRhdGUuaCIKKyNpbmNsdWRlICJkYnVzLW1hcnNoYWwtcmVjdXJzaXZlLmgiCisKKyNpbmNsdWRlICJkYnVzLXRlc3QuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorCit0eXBlZGVmIHN0cnVjdAoreworICBjb25zdCBjaGFyICpkYXRhOworICBEQnVzVmFsaWRpdHkgZXhwZWN0ZWQ7Cit9IFZhbGlkaXR5VGVzdDsKKworc3RhdGljIHZvaWQKK3J1bl92YWxpZGl0eV90ZXN0cyAoY29uc3QgVmFsaWRpdHlUZXN0ICp0ZXN0cywKKyAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICBuX3Rlc3RzLAorICAgICAgICAgICAgICAgICAgICBEQnVzVmFsaWRpdHkgKCogZnVuYykgKGNvbnN0IERCdXNTdHJpbmcqLGludCxpbnQpKQoreworICBpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgbl90ZXN0czsgaSsrKQorICAgIHsKKyAgICAgIERCdXNTdHJpbmcgc3RyOworICAgICAgREJ1c1ZhbGlkaXR5IHY7CisKKyAgICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmc3RyLCB0ZXN0c1tpXS5kYXRhKTsKKworICAgICAgdiA9ICgqZnVuYykgKCZzdHIsIDAsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSk7CisKKyAgICAgIGlmICh2ICE9IHRlc3RzW2ldLmV4cGVjdGVkKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoIkltcHJvcGVyIHZhbGlkYXRpb24gcmVzdWx0ICVkIGZvciAnJXMnIiwKKyAgICAgICAgICAgICAgICAgICAgICB2LCB0ZXN0c1tpXS5kYXRhKTsKKyAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJ0ZXN0IGZhaWxlZCIpOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgY29uc3QgVmFsaWRpdHlUZXN0IHNpZ25hdHVyZV90ZXN0c1tdID0geworICB7ICIiLCBEQlVTX1ZBTElEIH0sCisgIHsgInNzcyIsIERCVVNfVkFMSUQgfSwKKyAgeyAiaSIsIERCVVNfVkFMSUQgfSwKKyAgeyAiYiIsIERCVVNfVkFMSUQgfSwKKyAgeyAiYWkiLCBEQlVTX1ZBTElEIH0sCisgIHsgIihpKSIsIERCVVNfVkFMSUQgfSwKKyAgeyAidyIsIERCVVNfSU5WQUxJRF9VTktOT1dOX1RZUEVDT0RFIH0sCisgIHsgImEiLCBEQlVTX0lOVkFMSURfTUlTU0lOR19BUlJBWV9FTEVNRU5UX1RZUEUgfSwKKyAgeyAiYWFhYWFhIiwgREJVU19JTlZBTElEX01JU1NJTkdfQVJSQVlfRUxFTUVOVF9UWVBFIH0sCisgIHsgImlpKGlpKWEiLCBEQlVTX0lOVkFMSURfTUlTU0lOR19BUlJBWV9FTEVNRU5UX1RZUEUgfSwKKyAgeyAiaWEiLCBEQlVTX0lOVkFMSURfTUlTU0lOR19BUlJBWV9FTEVNRU5UX1RZUEUgfSwKKyAgLyogREJVU19JTlZBTElEX1NJR05BVFVSRV9UT09fTE9ORywgKi8gLyogdG9vIGhhcmQgdG8gdGVzdCB0aGlzIHdheSAqLworICB7ICJhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEiLAorICAgIERCVVNfSU5WQUxJRF9FWENFRURFRF9NQVhJTVVNX0FSUkFZX1JFQ1VSU0lPTiB9LAorICB7ICIoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKGlpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkiLAorICAgIERCVVNfSU5WQUxJRF9FWENFRURFRF9NQVhJTVVNX1NUUlVDVF9SRUNVUlNJT04gfSwKKyAgeyAiKSIsIERCVVNfSU5WQUxJRF9TVFJVQ1RfRU5ERURfQlVUX05PVF9TVEFSVEVEIH0sCisgIHsgImkpIiwgREJVU19JTlZBTElEX1NUUlVDVF9FTkRFRF9CVVRfTk9UX1NUQVJURUQgfSwKKyAgeyAiYSkiLCBEQlVTX0lOVkFMSURfTUlTU0lOR19BUlJBWV9FTEVNRU5UX1RZUEUgfSwKKyAgeyAiKCIsIERCVVNfSU5WQUxJRF9TVFJVQ1RfU1RBUlRFRF9CVVRfTk9UX0VOREVEIH0sCisgIHsgIihpIiwgREJVU19JTlZBTElEX1NUUlVDVF9TVEFSVEVEX0JVVF9OT1RfRU5ERUQgfSwKKyAgeyAiKGlpaWlpIiwgREJVU19JTlZBTElEX1NUUlVDVF9TVEFSVEVEX0JVVF9OT1RfRU5ERUQgfSwKKyAgeyAiKGFpIiwgREJVU19JTlZBTElEX1NUUlVDVF9TVEFSVEVEX0JVVF9OT1RfRU5ERUQgfSwKKyAgeyAiKCkiLCBEQlVTX0lOVkFMSURfU1RSVUNUX0hBU19OT19GSUVMRFMgfSwKKyAgeyAiKCgpKSIsIERCVVNfSU5WQUxJRF9TVFJVQ1RfSEFTX05PX0ZJRUxEUyB9LAorICB7ICJhKCkiLCBEQlVTX0lOVkFMSURfU1RSVUNUX0hBU19OT19GSUVMRFMgfSwKKyAgeyAiaSgpIiwgREJVU19JTlZBTElEX1NUUlVDVF9IQVNfTk9fRklFTERTIH0sCisgIHsgIigpaSIsIERCVVNfSU5WQUxJRF9TVFJVQ1RfSEFTX05PX0ZJRUxEUyB9LAorICB7ICIoYSkiLCBEQlVTX0lOVkFMSURfTUlTU0lOR19BUlJBWV9FTEVNRU5UX1RZUEUgfSwKKyAgeyAiYXtpYX0iLCBEQlVTX0lOVkFMSURfTUlTU0lOR19BUlJBWV9FTEVNRU5UX1RZUEUgfSwKKyAgeyAiYXt9IiwgREJVU19JTlZBTElEX0RJQ1RfRU5UUllfSEFTX05PX0ZJRUxEUyB9LAorICB7ICJhe2FpaX0iLCBEQlVTX0lOVkFMSURfRElDVF9LRVlfTVVTVF9CRV9CQVNJQ19UWVBFIH0sCisgIHsgIiAiLCBEQlVTX0lOVkFMSURfVU5LTk9XTl9UWVBFQ09ERSB9LAorICB7ICJub3QgYSB2YWxpZCBzaWduYXR1cmUiLCBEQlVTX0lOVkFMSURfVU5LTk9XTl9UWVBFQ09ERSB9LAorICB7ICIxMjMiLCBEQlVTX0lOVkFMSURfVU5LTk9XTl9UWVBFQ09ERSB9LAorICB7ICIuIiwgREJVU19JTlZBTElEX1VOS05PV05fVFlQRUNPREUgfSwKKyAgLyogaHR0cHM6Ly9idWdzLmZyZWVkZXNrdG9wLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTc4MDMgKi8KKyAgeyAiYXsoaWkpaX0iLCBEQlVTX0lOVkFMSURfRElDVF9LRVlfTVVTVF9CRV9CQVNJQ19UWVBFIH0sCisgIHsgImF7aX0iLCBEQlVTX0lOVkFMSURfRElDVF9FTlRSWV9IQVNfT05MWV9PTkVfRklFTEQgfSwKKyAgeyAie2lzfSIsIERCVVNfSU5WQUxJRF9ESUNUX0VOVFJZX05PVF9JTlNJREVfQVJSQVkgfSwKKyAgeyAiYXtpc2l9IiwgREJVU19JTlZBTElEX0RJQ1RfRU5UUllfSEFTX1RPT19NQU5ZX0ZJRUxEUyB9LAorfTsKKworZGJ1c19ib29sX3QKK19kYnVzX21hcnNoYWxfdmFsaWRhdGVfdGVzdCAodm9pZCkKK3sKKyAgREJ1c1N0cmluZyBzdHI7CisgIGludCBpOworCisgIGNvbnN0IGNoYXIgKnZhbGlkX3BhdGhzW10gPSB7CisgICAgIi8iLAorICAgICIvZm9vL2JhciIsCisgICAgIi9mb28iLAorICAgICIvZm9vL2Jhci9iYXoiCisgIH07CisgIGNvbnN0IGNoYXIgKmludmFsaWRfcGF0aHNbXSA9IHsKKyAgICAiYmFyIiwKKyAgICAiYmFyL2JheiIsCisgICAgIi9mb28vYmFyLyIsCisgICAgIi9mb28vIiwKKyAgICAiZm9vLyIsCisgICAgImJvby8vYmxhaCIsCisgICAgIi8vIiwKKyAgICAiLy8vIiwKKyAgICAiZm9vLy8vYmxhaC8iLAorICAgICJIZWxsbyBXb3JsZCIsCisgICAgIiIsCisgICAgIiAgICIsCisgICAgImZvbyBiYXIiCisgIH07CisKKyAgY29uc3QgY2hhciAqdmFsaWRfaW50ZXJmYWNlc1tdID0geworICAgICJvcmcuZnJlZWRlc2t0b3AuRm9vIiwKKyAgICAiQmFyLkJheiIsCisgICAgIkJsYWguQmxhaC5CbGFoLkJsYWguQmxhaCIsCisgICAgImEuYiIsCisgICAgImEuYi5jLmQuZS5mLmciLAorICAgICJhMC5iMS5jMi5kMy5lNC5mNS5nNiIsCisgICAgImFiYzEyMy5mb28yNyIKKyAgfTsKKyAgY29uc3QgY2hhciAqaW52YWxpZF9pbnRlcmZhY2VzW10gPSB7CisgICAgIi4iLAorICAgICIiLAorICAgICIuLiIsCisgICAgIi5Gb28uQmFyIiwKKyAgICAiLi5Gb28uQmFyIiwKKyAgICAiRm9vLkJhci4iLAorICAgICJGb28uQmFyLi4iLAorICAgICJGb28iLAorICAgICI5Zm9vLmJhci5iYXoiLAorICAgICJmb28uYmFyLi5iYXoiLAorICAgICJmb28uYmFyLi4uYmF6IiwKKyAgICAiZm9vLmJhci5iLi5ibGFoIiwKKyAgICAiOiIsCisgICAgIjowLTEiLAorICAgICIxMCIsCisgICAgIjoxMS4zNDMyNCIsCisgICAgIjAuMC4wIiwKKyAgICAiMC4uMCIsCisgICAgImZvby5CYXIuJSIsCisgICAgImZvby5CYXIhISIsCisgICAgIiFGb28uYmFyLmJ6IiwKKyAgICAiZm9vLiQuYmxhaCIsCisgICAgIiIsCisgICAgIiAgICIsCisgICAgImZvbyBiYXIiCisgIH07CisKKyAgY29uc3QgY2hhciAqdmFsaWRfdW5pcXVlX25hbWVzW10gPSB7CisgICAgIjowIiwKKyAgICAiOmEiLAorICAgICI6IiwKKyAgICAiOi5hIiwKKyAgICAiOi4xIiwKKyAgICAiOjAuMSIsCisgICAgIjowMDAuMjIyMiIsCisgICAgIjouYmxhaCIsCisgICAgIjphYmNlLmZyZWVkZXNrdG9wLmJsYWgiCisgIH07CisgIGNvbnN0IGNoYXIgKmludmFsaWRfdW5pcXVlX25hbWVzW10gPSB7CisgICAgLy8iOi0iLAorICAgICI6ISIsCisgICAgLy8iOjAtMTAiLAorICAgICI6YmxhaC4iLAorICAgICI6YmxhaC4iLAorICAgICI6YmxhaC4ub3JnIiwKKyAgICAiOmJsYWgub3JnLi4iLAorICAgICI6Li5ibGFoLm9yZyIsCisgICAgIiIsCisgICAgIiAgICIsCisgICAgImZvbyBiYXIiCisgIH07CisKKyAgY29uc3QgY2hhciAqdmFsaWRfbWVtYmVyc1tdID0geworICAgICJIZWxsbyIsCisgICAgIkJhciIsCisgICAgImZvb2JhciIsCisgICAgIl9mb29iYXIiLAorICAgICJmb284OSIKKyAgfTsKKworICBjb25zdCBjaGFyICppbnZhbGlkX21lbWJlcnNbXSA9IHsKKyAgICAiOUhlbGxvIiwKKyAgICAiMTAiLAorICAgICIxIiwKKyAgICAiZm9vLWJhciIsCisgICAgImJsYWgub3JnIiwKKyAgICAiLmJsYWgiLAorICAgICJibGFoLiIsCisgICAgIkhlbGxvLiIsCisgICAgIiFmb28iLAorICAgICIiLAorICAgICIgICAiLAorICAgICJmb28gYmFyIgorICB9OworCisgIC8qIFNpZ25hdHVyZSB3aXRoIHJlYXNvbiAqLworCisgIHJ1bl92YWxpZGl0eV90ZXN0cyAoc2lnbmF0dXJlX3Rlc3RzLCBfREJVU19OX0VMRU1FTlRTIChzaWduYXR1cmVfdGVzdHMpLAorICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3ZhbGlkYXRlX3NpZ25hdHVyZV93aXRoX3JlYXNvbik7CisKKyAgLyogUGF0aCB2YWxpZGF0aW9uICovCisgIGkgPSAwOworICB3aGlsZSAoaSA8IChpbnQpIF9EQlVTX05fRUxFTUVOVFMgKHZhbGlkX3BhdGhzKSkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnN0ciwgdmFsaWRfcGF0aHNbaV0pOworCisgICAgICBpZiAoIV9kYnVzX3ZhbGlkYXRlX3BhdGggKCZzdHIsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgiUGF0aCBcIiVzXCIgc2hvdWxkIGhhdmUgYmVlbiB2YWxpZCIsIHZhbGlkX3BhdGhzW2ldKTsKKyAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJpbnZhbGlkIHBhdGgiKTsKKyAgICAgICAgfQorCisgICAgICArK2k7CisgICAgfQorCisgIGkgPSAwOworICB3aGlsZSAoaSA8IChpbnQpIF9EQlVTX05fRUxFTUVOVFMgKGludmFsaWRfcGF0aHMpKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmc3RyLCBpbnZhbGlkX3BhdGhzW2ldKTsKKworICAgICAgaWYgKF9kYnVzX3ZhbGlkYXRlX3BhdGggKCZzdHIsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJQYXRoIFwiJXNcIiBzaG91bGQgaGF2ZSBiZWVuIGludmFsaWQiLCBpbnZhbGlkX3BhdGhzW2ldKTsKKyAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJ2YWxpZCBwYXRoIik7CisgICAgICAgIH0KKworICAgICAgKytpOworICAgIH0KKworICAvKiBJbnRlcmZhY2UgdmFsaWRhdGlvbiAqLworICBpID0gMDsKKyAgd2hpbGUgKGkgPCAoaW50KSBfREJVU19OX0VMRU1FTlRTICh2YWxpZF9pbnRlcmZhY2VzKSkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnN0ciwgdmFsaWRfaW50ZXJmYWNlc1tpXSk7CisKKyAgICAgIGlmICghX2RidXNfdmFsaWRhdGVfaW50ZXJmYWNlICgmc3RyLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgiSW50ZXJmYWNlIFwiJXNcIiBzaG91bGQgaGF2ZSBiZWVuIHZhbGlkIiwgdmFsaWRfaW50ZXJmYWNlc1tpXSk7CisgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiaW52YWxpZCBpbnRlcmZhY2UiKTsKKyAgICAgICAgfQorCisgICAgICArK2k7CisgICAgfQorCisgIGkgPSAwOworICB3aGlsZSAoaSA8IChpbnQpIF9EQlVTX05fRUxFTUVOVFMgKGludmFsaWRfaW50ZXJmYWNlcykpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZzdHIsIGludmFsaWRfaW50ZXJmYWNlc1tpXSk7CisKKyAgICAgIGlmIChfZGJ1c192YWxpZGF0ZV9pbnRlcmZhY2UgKCZzdHIsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoIkludGVyZmFjZSBcIiVzXCIgc2hvdWxkIGhhdmUgYmVlbiBpbnZhbGlkIiwgaW52YWxpZF9pbnRlcmZhY2VzW2ldKTsKKyAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJ2YWxpZCBpbnRlcmZhY2UiKTsKKyAgICAgICAgfQorCisgICAgICArK2k7CisgICAgfQorCisgIC8qIEJ1cyBuYW1lIHZhbGlkYXRpb24gKGNoZWNrIHRoYXQgdmFsaWQgaW50ZXJmYWNlcyBhcmUgdmFsaWQgYnVzIG5hbWVzLAorICAgKiBhbmQgaW52YWxpZCBpbnRlcmZhY2VzIGFyZSBpbnZhbGlkIHNlcnZpY2VzIGV4Y2VwdCBpZiB0aGV5IHN0YXJ0IHdpdGggJzonKQorICAgKi8KKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgKGludCkgX0RCVVNfTl9FTEVNRU5UUyAodmFsaWRfaW50ZXJmYWNlcykpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZzdHIsIHZhbGlkX2ludGVyZmFjZXNbaV0pOworCisgICAgICBpZiAoIV9kYnVzX3ZhbGlkYXRlX2J1c19uYW1lICgmc3RyLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoIkJ1cyBuYW1lIFwiJXNcIiBzaG91bGQgaGF2ZSBiZWVuIHZhbGlkIiwgdmFsaWRfaW50ZXJmYWNlc1tpXSk7CisgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiaW52YWxpZCBidXMgbmFtZSIpOworICAgICAgICB9CisKKyAgICAgICsraTsKKyAgICB9CisKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgKGludCkgX0RCVVNfTl9FTEVNRU5UUyAoaW52YWxpZF9pbnRlcmZhY2VzKSkKKyAgICB7CisgICAgICBpZiAoaW52YWxpZF9pbnRlcmZhY2VzW2ldWzBdICE9ICc6JykKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmc3RyLCBpbnZhbGlkX2ludGVyZmFjZXNbaV0pOworCisgICAgICAgICAgaWYgKF9kYnVzX3ZhbGlkYXRlX2J1c19uYW1lICgmc3RyLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfd2FybiAoIkJ1cyBuYW1lIFwiJXNcIiBzaG91bGQgaGF2ZSBiZWVuIGludmFsaWQiLCBpbnZhbGlkX2ludGVyZmFjZXNbaV0pOworICAgICAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJ2YWxpZCBidXMgbmFtZSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICsraTsKKyAgICB9CisKKyAgLyogdW5pcXVlIG5hbWUgdmFsaWRhdGlvbiAqLworICBpID0gMDsKKyAgd2hpbGUgKGkgPCAoaW50KSBfREJVU19OX0VMRU1FTlRTICh2YWxpZF91bmlxdWVfbmFtZXMpKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmc3RyLCB2YWxpZF91bmlxdWVfbmFtZXNbaV0pOworCisgICAgICBpZiAoIV9kYnVzX3ZhbGlkYXRlX2J1c19uYW1lICgmc3RyLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJCdXMgbmFtZSBcIiVzXCIgc2hvdWxkIGhhdmUgYmVlbiB2YWxpZCIsIHZhbGlkX3VuaXF1ZV9uYW1lc1tpXSk7CisgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiaW52YWxpZCB1bmlxdWUgbmFtZSIpOworICAgICAgICB9CisKKyAgICAgICsraTsKKyAgICB9CisKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgKGludCkgX0RCVVNfTl9FTEVNRU5UUyAoaW52YWxpZF91bmlxdWVfbmFtZXMpKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmc3RyLCBpbnZhbGlkX3VuaXF1ZV9uYW1lc1tpXSk7CisKKyAgICAgIGlmIChfZGJ1c192YWxpZGF0ZV9idXNfbmFtZSAoJnN0ciwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJCdXMgbmFtZSBcIiVzXCIgc2hvdWxkIGhhdmUgYmVlbiBpbnZhbGlkIiwgaW52YWxpZF91bmlxdWVfbmFtZXNbaV0pOworICAgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInZhbGlkIHVuaXF1ZSBuYW1lIik7CisgICAgICAgIH0KKworICAgICAgKytpOworICAgIH0KKworCisgIC8qIEVycm9yIG5hbWUgdmFsaWRhdGlvbiAoY3VycmVudGx5IGlkZW50aWNhbCB0byBpbnRlcmZhY2VzKQorICAgKi8KKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgKGludCkgX0RCVVNfTl9FTEVNRU5UUyAodmFsaWRfaW50ZXJmYWNlcykpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZzdHIsIHZhbGlkX2ludGVyZmFjZXNbaV0pOworCisgICAgICBpZiAoIV9kYnVzX3ZhbGlkYXRlX2Vycm9yX25hbWUgKCZzdHIsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgiRXJyb3IgbmFtZSBcIiVzXCIgc2hvdWxkIGhhdmUgYmVlbiB2YWxpZCIsIHZhbGlkX2ludGVyZmFjZXNbaV0pOworICAgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImludmFsaWQgZXJyb3IgbmFtZSIpOworICAgICAgICB9CisKKyAgICAgICsraTsKKyAgICB9CisKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgKGludCkgX0RCVVNfTl9FTEVNRU5UUyAoaW52YWxpZF9pbnRlcmZhY2VzKSkKKyAgICB7CisgICAgICBpZiAoaW52YWxpZF9pbnRlcmZhY2VzW2ldWzBdICE9ICc6JykKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmc3RyLCBpbnZhbGlkX2ludGVyZmFjZXNbaV0pOworCisgICAgICAgICAgaWYgKF9kYnVzX3ZhbGlkYXRlX2Vycm9yX25hbWUgKCZzdHIsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJFcnJvciBuYW1lIFwiJXNcIiBzaG91bGQgaGF2ZSBiZWVuIGludmFsaWQiLCBpbnZhbGlkX2ludGVyZmFjZXNbaV0pOworICAgICAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJ2YWxpZCBlcnJvciBuYW1lIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgKytpOworICAgIH0KKworICAvKiBNZW1iZXIgdmFsaWRhdGlvbiAqLworICBpID0gMDsKKyAgd2hpbGUgKGkgPCAoaW50KSBfREJVU19OX0VMRU1FTlRTICh2YWxpZF9tZW1iZXJzKSkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnN0ciwgdmFsaWRfbWVtYmVyc1tpXSk7CisKKyAgICAgIGlmICghX2RidXNfdmFsaWRhdGVfbWVtYmVyICgmc3RyLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgiTWVtYmVyIFwiJXNcIiBzaG91bGQgaGF2ZSBiZWVuIHZhbGlkIiwgdmFsaWRfbWVtYmVyc1tpXSk7CisgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiaW52YWxpZCBtZW1iZXIiKTsKKyAgICAgICAgfQorCisgICAgICArK2k7CisgICAgfQorCisgIGkgPSAwOworICB3aGlsZSAoaSA8IChpbnQpIF9EQlVTX05fRUxFTUVOVFMgKGludmFsaWRfbWVtYmVycykpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZzdHIsIGludmFsaWRfbWVtYmVyc1tpXSk7CisKKyAgICAgIGlmIChfZGJ1c192YWxpZGF0ZV9tZW1iZXIgKCZzdHIsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoIk1lbWJlciBcIiVzXCIgc2hvdWxkIGhhdmUgYmVlbiBpbnZhbGlkIiwgaW52YWxpZF9tZW1iZXJzW2ldKTsKKyAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJ2YWxpZCBtZW1iZXIiKTsKKyAgICAgICAgfQorCisgICAgICArK2k7CisgICAgfQorCisgIC8qIFZhbGlkYXRlIGNsYWltZWQgbGVuZ3RoIGxvbmdlciB0aGFuIHJlYWwgbGVuZ3RoICovCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmc3RyLCAiYWJjLmVmZyIpOworICBpZiAoX2RidXNfdmFsaWRhdGVfYnVzX25hbWUgKCZzdHIsIDAsIDgpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInZhbGlkYXRlZCB0b28tbG9uZyBzdHJpbmciKTsKKyAgaWYgKF9kYnVzX3ZhbGlkYXRlX2ludGVyZmFjZSAoJnN0ciwgMCwgOCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgidmFsaWRhdGVkIHRvby1sb25nIHN0cmluZyIpOworICBpZiAoX2RidXNfdmFsaWRhdGVfZXJyb3JfbmFtZSAoJnN0ciwgMCwgOCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgidmFsaWRhdGVkIHRvby1sb25nIHN0cmluZyIpOworCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmc3RyLCAiYWJjIik7CisgIGlmIChfZGJ1c192YWxpZGF0ZV9tZW1iZXIgKCZzdHIsIDAsIDQpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInZhbGlkYXRlZCB0b28tbG9uZyBzdHJpbmciKTsKKworICAvKiBWYWxpZGF0ZSBzdHJpbmcgZXhjZWVkaW5nIG1heCBuYW1lIGxlbmd0aCAqLworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmc3RyKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkiKTsKKworICB3aGlsZSAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpIDw9IERCVVNfTUFYSU1VTV9OQU1FX0xFTkdUSCkKKyAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZzdHIsICJhYmMuZGVmIikpCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkiKTsKKworICBpZiAoX2RidXNfdmFsaWRhdGVfYnVzX25hbWUgKCZzdHIsIDAsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgidmFsaWRhdGVkIG92ZXJtYXggc3RyaW5nIik7CisgIGlmIChfZGJ1c192YWxpZGF0ZV9pbnRlcmZhY2UgKCZzdHIsIDAsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgidmFsaWRhdGVkIG92ZXJtYXggc3RyaW5nIik7CisgIGlmIChfZGJ1c192YWxpZGF0ZV9lcnJvcl9uYW1lICgmc3RyLCAwLCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInZhbGlkYXRlZCBvdmVybWF4IHN0cmluZyIpOworCisgIC8qIG92ZXJsb25nIG1lbWJlciAqLworICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoJnN0ciwgMCk7CisgIHdoaWxlIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikgPD0gREJVU19NQVhJTVVNX05BTUVfTEVOR1RIKQorICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnN0ciwgImFiYyIpKQorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5Iik7CisKKyAgaWYgKF9kYnVzX3ZhbGlkYXRlX21lbWJlciAoJnN0ciwgMCwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJ2YWxpZGF0ZWQgb3Zlcm1heCBzdHJpbmciKTsKKworICAvKiBvdmVybG9uZyB1bmlxdWUgbmFtZSAqLworICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoJnN0ciwgMCk7CisgIF9kYnVzX3N0cmluZ19hcHBlbmQgKCZzdHIsICI6Iik7CisgIHdoaWxlIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikgPD0gREJVU19NQVhJTVVNX05BTUVfTEVOR1RIKQorICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnN0ciwgImFiYyIpKQorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5Iik7CisKKyAgaWYgKF9kYnVzX3ZhbGlkYXRlX2J1c19uYW1lICgmc3RyLCAwLCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInZhbGlkYXRlZCBvdmVybWF4IHN0cmluZyIpOworCisgIF9kYnVzX3N0cmluZ19mcmVlICgmc3RyKTsKKworICAvKiBCb2R5IHZhbGlkYXRpb247IHRlc3QgYmFzaWMgdmFsaWRhdGlvbiBvZiB2YWxpZCBib2RpZXMgZm9yIGJvdGggZW5kaWFuICovCisgIAorICB7CisgICAgaW50IHNlcXVlbmNlOworICAgIERCdXNTdHJpbmcgc2lnbmF0dXJlOworICAgIERCdXNTdHJpbmcgYm9keTsKKworICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZzaWduYXR1cmUpIHx8ICFfZGJ1c19zdHJpbmdfaW5pdCAoJmJvZHkpKQorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisKKyAgICBzZXF1ZW5jZSA9IDA7CisgICAgd2hpbGUgKGRidXNfaW50ZXJuYWxfZG9fbm90X3VzZV9nZW5lcmF0ZV9ib2RpZXMgKHNlcXVlbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0xJVFRMRV9FTkRJQU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaWduYXR1cmUsICZib2R5KSkKKyAgICAgIHsKKyAgICAgICAgREJ1c1ZhbGlkaXR5IHZhbGlkaXR5OworCisgICAgICAgIHZhbGlkaXR5ID0gX2RidXNfdmFsaWRhdGVfYm9keV93aXRoX3JlYXNvbiAoJnNpZ25hdHVyZSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0xJVFRMRV9FTkRJQU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgJmJvZHksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZib2R5KSk7CisgICAgICAgIGlmICh2YWxpZGl0eSAhPSBEQlVTX1ZBTElEKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJpbnZhbGlkIGNvZGUgJWQgZXhwZWN0ZWQgdmFsaWQgb24gc2VxdWVuY2UgJWQgbGl0dGxlIGVuZGlhbiIsCisgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGl0eSwgc2VxdWVuY2UpOworICAgICAgICAgICAgX2RidXNfdmVyYm9zZV9ieXRlc19vZl9zdHJpbmcgKCZzaWduYXR1cmUsIDAsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc2lnbmF0dXJlKSk7CisgICAgICAgICAgICBfZGJ1c192ZXJib3NlX2J5dGVzX29mX3N0cmluZyAoJmJvZHksIDAsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmYm9keSkpOworICAgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgidGVzdCBmYWlsZWQiKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKCZzaWduYXR1cmUsIDApOworICAgICAgICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoJmJvZHksIDApOworICAgICAgICArK3NlcXVlbmNlOworICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBzZXF1ZW5jZSA9IDA7CisgICAgd2hpbGUgKGRidXNfaW50ZXJuYWxfZG9fbm90X3VzZV9nZW5lcmF0ZV9ib2RpZXMgKHNlcXVlbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0JJR19FTkRJQU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaWduYXR1cmUsICZib2R5KSkKKyAgICAgIHsKKyAgICAgICAgREJ1c1ZhbGlkaXR5IHZhbGlkaXR5OworCisgICAgICAgIHZhbGlkaXR5ID0gX2RidXNfdmFsaWRhdGVfYm9keV93aXRoX3JlYXNvbiAoJnNpZ25hdHVyZSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0JJR19FTkRJQU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgJmJvZHksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZib2R5KSk7CisgICAgICAgIGlmICh2YWxpZGl0eSAhPSBEQlVTX1ZBTElEKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJpbnZhbGlkIGNvZGUgJWQgZXhwZWN0ZWQgdmFsaWQgb24gc2VxdWVuY2UgJWQgYmlnIGVuZGlhbiIsCisgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGl0eSwgc2VxdWVuY2UpOworICAgICAgICAgICAgX2RidXNfdmVyYm9zZV9ieXRlc19vZl9zdHJpbmcgKCZzaWduYXR1cmUsIDAsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc2lnbmF0dXJlKSk7CisgICAgICAgICAgICBfZGJ1c192ZXJib3NlX2J5dGVzX29mX3N0cmluZyAoJmJvZHksIDAsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmYm9keSkpOworICAgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgidGVzdCBmYWlsZWQiKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKCZzaWduYXR1cmUsIDApOworICAgICAgICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoJmJvZHksIDApOworICAgICAgICArK3NlcXVlbmNlOworICAgICAgfQorCisgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZzaWduYXR1cmUpOworICAgIF9kYnVzX3N0cmluZ19mcmVlICgmYm9keSk7CisgIH0KKyAgCisgIHJldHVybiBUUlVFOworfQorCisjZW5kaWYgLyogIURPWFlHRU5fU0hPVUxEX1NLSVBfVEhJUyAqLworCisjZW5kaWYgLyogREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMgKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1tYXJzaGFsLXZhbGlkYXRlLmMgYi9kYnVzL2RidXMtbWFyc2hhbC12YWxpZGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkNDkyZjMKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtbWFyc2hhbC12YWxpZGF0ZS5jCkBAIC0wLDAgKzEsMTIzNyBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLW1hcnNoYWwtdmFsaWRhdGUuYyBWYWxpZGF0aW9uIHJvdXRpbmVzIGZvciBtYXJzaGFsZWQgZGF0YQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKyNpbmNsdWRlICJkYnVzLW1hcnNoYWwtdmFsaWRhdGUuaCIKKyNpbmNsdWRlICJkYnVzLW1hcnNoYWwtcmVjdXJzaXZlLmgiCisjaW5jbHVkZSAiZGJ1cy1tYXJzaGFsLWJhc2ljLmgiCisjaW5jbHVkZSAiZGJ1cy1zaWduYXR1cmUuaCIKKyNpbmNsdWRlICJkYnVzLXN0cmluZy5oIgorCisvKioKKyAqIEBhZGR0b2dyb3VwIERCdXNNYXJzaGFsCisgKgorICogQHsKKyAqLworCisvKioKKyAqIFZlcmlmaWVzIHRoYXQgdGhlIHJhbmdlIG9mIHR5cGVfc3RyIGZyb20gdHlwZV9wb3MgdG8gdHlwZV9lbmQgaXMgYQorICogdmFsaWQgc2lnbmF0dXJlLiAgSWYgdGhpcyBmdW5jdGlvbiByZXR1cm5zICNUUlVFLCBpdCB3aWxsIGJlIHNhZmUKKyAqIHRvIGl0ZXJhdGUgb3ZlciB0aGUgc2lnbmF0dXJlIHdpdGggYSB0eXBlcy1vbmx5ICNEQnVzVHlwZVJlYWRlci4KKyAqIFRoZSByYW5nZSBwYXNzZWQgaW4gc2hvdWxkIE5PVCBpbmNsdWRlIHRoZSB0ZXJtaW5hdGluZworICogbnVsL0RCVVNfVFlQRV9JTlZBTElELgorICoKKyAqIEBwYXJhbSB0eXBlX3N0ciB0aGUgc3RyaW5nCisgKiBAcGFyYW0gdHlwZV9wb3Mgd2hlcmUgdGhlIHR5cGVjb2RlcyBzdGFydAorICogQHBhcmFtIGxlbiBsZW5ndGggb2YgdHlwZWNvZGVzCisgKiBAcmV0dXJucyAjREJVU19WQUxJRCBpZiB2YWxpZCwgcmVhc29uIHdoeSBpbnZhbGlkIG90aGVyd2lzZQorICovCitEQnVzVmFsaWRpdHkKK19kYnVzX3ZhbGlkYXRlX3NpZ25hdHVyZV93aXRoX3JlYXNvbiAoY29uc3QgREJ1c1N0cmluZyAqdHlwZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHR5cGVfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBsZW4pCit7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnA7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmVuZDsKKyAgaW50IGxhc3Q7CisgIGludCBzdHJ1Y3RfZGVwdGg7CisgIGludCBhcnJheV9kZXB0aDsKKyAgaW50IGRpY3RfZW50cnlfZGVwdGg7CisgIERCdXNWYWxpZGl0eSByZXN1bHQ7CisKKyAgaW50IGVsZW1lbnRfY291bnQ7CisgIERCdXNMaXN0ICplbGVtZW50X2NvdW50X3N0YWNrOworCisgIHJlc3VsdCA9IERCVVNfVkFMSUQ7CisgIGVsZW1lbnRfY291bnRfc3RhY2sgPSBOVUxMOworCisgIGlmICghX2RidXNfbGlzdF9hcHBlbmQgKCZlbGVtZW50X2NvdW50X3N0YWNrLCBfREJVU19JTlRfVE9fUE9JTlRFUiAoMCkpKQorICAgIHsKKyAgICAgIHJlc3VsdCA9IERCVVNfVkFMSURJVFlfVU5LTk9XTl9PT01fRVJST1I7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgX2RidXNfYXNzZXJ0ICh0eXBlX3N0ciAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0ICh0eXBlX3BvcyA8IF9EQlVTX0lOVDMyX01BWCAtIGxlbik7CisgIF9kYnVzX2Fzc2VydCAobGVuID49IDApOworICBfZGJ1c19hc3NlcnQgKHR5cGVfcG9zID49IDApOworCisgIGlmIChsZW4gPiBEQlVTX01BWElNVU1fU0lHTkFUVVJFX0xFTkdUSCkKKyAgICB7CisgICAgICByZXN1bHQgPSBEQlVTX0lOVkFMSURfU0lHTkFUVVJFX1RPT19MT05HOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIHAgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X3VkYXRhX2xlbiAodHlwZV9zdHIsIHR5cGVfcG9zLCAwKTsKKworICBlbmQgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X3VkYXRhX2xlbiAodHlwZV9zdHIsIHR5cGVfcG9zICsgbGVuLCAwKTsKKyAgc3RydWN0X2RlcHRoID0gMDsKKyAgYXJyYXlfZGVwdGggPSAwOworICBkaWN0X2VudHJ5X2RlcHRoID0gMDsKKyAgbGFzdCA9IERCVVNfVFlQRV9JTlZBTElEOworCisgIHdoaWxlIChwICE9IGVuZCkKKyAgICB7CisgICAgICBzd2l0Y2ggKCpwKQorICAgICAgICB7CisgICAgICAgIGNhc2UgREJVU19UWVBFX0JZVEU6CisgICAgICAgIGNhc2UgREJVU19UWVBFX0JPT0xFQU46CisgICAgICAgIGNhc2UgREJVU19UWVBFX0lOVDE2OgorICAgICAgICBjYXNlIERCVVNfVFlQRV9VSU5UMTY6CisgICAgICAgIGNhc2UgREJVU19UWVBFX0lOVDMyOgorICAgICAgICBjYXNlIERCVVNfVFlQRV9VSU5UMzI6CisgICAgICAgIGNhc2UgREJVU19UWVBFX1VOSVhfRkQ6CisgICAgICAgIGNhc2UgREJVU19UWVBFX0lOVDY0OgorICAgICAgICBjYXNlIERCVVNfVFlQRV9VSU5UNjQ6CisgICAgICAgIGNhc2UgREJVU19UWVBFX0RPVUJMRToKKyAgICAgICAgY2FzZSBEQlVTX1RZUEVfU1RSSU5HOgorICAgICAgICBjYXNlIERCVVNfVFlQRV9PQkpFQ1RfUEFUSDoKKyAgICAgICAgY2FzZSBEQlVTX1RZUEVfU0lHTkFUVVJFOgorICAgICAgICBjYXNlIERCVVNfVFlQRV9WQVJJQU5UOgorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgREJVU19UWVBFX0FSUkFZOgorICAgICAgICAgIGFycmF5X2RlcHRoICs9IDE7CisgICAgICAgICAgaWYgKGFycmF5X2RlcHRoID4gREJVU19NQVhJTVVNX1RZUEVfUkVDVVJTSU9OX0RFUFRIKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICByZXN1bHQgPSBEQlVTX0lOVkFMSURfRVhDRUVERURfTUFYSU1VTV9BUlJBWV9SRUNVUlNJT047CisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgREJVU19TVFJVQ1RfQkVHSU5fQ0hBUjoKKyAgICAgICAgICBzdHJ1Y3RfZGVwdGggKz0gMTsKKworICAgICAgICAgIGlmIChzdHJ1Y3RfZGVwdGggPiBEQlVTX01BWElNVU1fVFlQRV9SRUNVUlNJT05fREVQVEgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHJlc3VsdCA9IERCVVNfSU5WQUxJRF9FWENFRURFRF9NQVhJTVVNX1NUUlVDVF9SRUNVUlNJT047CisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorICAgICAgICAgIAorICAgICAgICAgIGlmICghX2RidXNfbGlzdF9hcHBlbmQgKCZlbGVtZW50X2NvdW50X3N0YWNrLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0RCVVNfSU5UX1RPX1BPSU5URVIgKDApKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcmVzdWx0ID0gREJVU19WQUxJRElUWV9VTktOT1dOX09PTV9FUlJPUjsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIERCVVNfU1RSVUNUX0VORF9DSEFSOgorICAgICAgICAgIGlmIChzdHJ1Y3RfZGVwdGggPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcmVzdWx0ID0gREJVU19JTlZBTElEX1NUUlVDVF9FTkRFRF9CVVRfTk9UX1NUQVJURUQ7CisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKGxhc3QgPT0gREJVU19TVFJVQ1RfQkVHSU5fQ0hBUikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcmVzdWx0ID0gREJVU19JTlZBTElEX1NUUlVDVF9IQVNfTk9fRklFTERTOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIF9kYnVzX2xpc3RfcG9wX2xhc3QgKCZlbGVtZW50X2NvdW50X3N0YWNrKTsKKworICAgICAgICAgIHN0cnVjdF9kZXB0aCAtPSAxOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgREJVU19ESUNUX0VOVFJZX0JFR0lOX0NIQVI6CisgICAgICAgICAgaWYgKGxhc3QgIT0gREJVU19UWVBFX0FSUkFZKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICByZXN1bHQgPSBEQlVTX0lOVkFMSURfRElDVF9FTlRSWV9OT1RfSU5TSURFX0FSUkFZOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgIGRpY3RfZW50cnlfZGVwdGggKz0gMTsKKworICAgICAgICAgIGlmIChkaWN0X2VudHJ5X2RlcHRoID4gREJVU19NQVhJTVVNX1RZUEVfUkVDVVJTSU9OX0RFUFRIKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICByZXN1bHQgPSBEQlVTX0lOVkFMSURfRVhDRUVERURfTUFYSU1VTV9ESUNUX0VOVFJZX1JFQ1VSU0lPTjsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoIV9kYnVzX2xpc3RfYXBwZW5kICgmZWxlbWVudF9jb3VudF9zdGFjaywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9EQlVTX0lOVF9UT19QT0lOVEVSICgwKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHJlc3VsdCA9IERCVVNfVkFMSURJVFlfVU5LTk9XTl9PT01fRVJST1I7CisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBEQlVTX0RJQ1RfRU5UUllfRU5EX0NIQVI6CisgICAgICAgICAgaWYgKGRpY3RfZW50cnlfZGVwdGggPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcmVzdWx0ID0gREJVU19JTlZBTElEX0RJQ1RfRU5UUllfRU5ERURfQlVUX05PVF9TVEFSVEVEOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgIGRpY3RfZW50cnlfZGVwdGggLT0gMTsKKworICAgICAgICAgIGVsZW1lbnRfY291bnQgPSAKKyAgICAgICAgICAgIF9EQlVTX1BPSU5URVJfVE9fSU5UIChfZGJ1c19saXN0X3BvcF9sYXN0ICgmZWxlbWVudF9jb3VudF9zdGFjaykpOworCisgICAgICAgICAgaWYgKGVsZW1lbnRfY291bnQgIT0gMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKGVsZW1lbnRfY291bnQgPT0gMCkKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBEQlVTX0lOVkFMSURfRElDVF9FTlRSWV9IQVNfTk9fRklFTERTOworICAgICAgICAgICAgICBlbHNlIGlmIChlbGVtZW50X2NvdW50ID09IDEpCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gREJVU19JTlZBTElEX0RJQ1RfRU5UUllfSEFTX09OTFlfT05FX0ZJRUxEOworICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gREJVU19JTlZBTElEX0RJQ1RfRU5UUllfSEFTX1RPT19NQU5ZX0ZJRUxEUzsKKyAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICAgIAorICAgICAgICBjYXNlIERCVVNfVFlQRV9TVFJVQ1Q6ICAgICAvKiBkb2Vzbid0IGFwcGVhciBpbiBzaWduYXR1cmVzICovCisgICAgICAgIGNhc2UgREJVU19UWVBFX0RJQ1RfRU5UUlk6IC8qIGRpdHRvICovCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgcmVzdWx0ID0gREJVU19JTlZBTElEX1VOS05PV05fVFlQRUNPREU7CisJICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICBpZiAoKnAgIT0gREJVU19UWVBFX0FSUkFZICYmIAorICAgICAgICAgICpwICE9IERCVVNfRElDVF9FTlRSWV9CRUdJTl9DSEFSICYmIAorCSAgKnAgIT0gREJVU19TVFJVQ1RfQkVHSU5fQ0hBUikgCisgICAgICAgIHsKKyAgICAgICAgICBlbGVtZW50X2NvdW50ID0gCisgICAgICAgICAgICBfREJVU19QT0lOVEVSX1RPX0lOVCAoX2RidXNfbGlzdF9wb3BfbGFzdCAoJmVsZW1lbnRfY291bnRfc3RhY2spKTsKKworICAgICAgICAgICsrZWxlbWVudF9jb3VudDsKKworICAgICAgICAgIGlmICghX2RidXNfbGlzdF9hcHBlbmQgKCZlbGVtZW50X2NvdW50X3N0YWNrLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0RCVVNfSU5UX1RPX1BPSU5URVIgKGVsZW1lbnRfY291bnQpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcmVzdWx0ID0gREJVU19WQUxJRElUWV9VTktOT1dOX09PTV9FUlJPUjsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIAorICAgICAgaWYgKGFycmF5X2RlcHRoID4gMCkKKyAgICAgICAgeworICAgICAgICAgIGlmICgqcCA9PSBEQlVTX1RZUEVfQVJSQVkgJiYgcCAhPSBlbmQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpwMTsKKwkgICAgICAgcDEgPSBwICsgMTsKKyAgICAgICAgICAgICAgIGlmICgqcDEgPT0gREJVU19TVFJVQ1RfRU5EX0NIQVIgfHwKKyAgICAgICAgICAgICAgICAgICAqcDEgPT0gREJVU19ESUNUX0VOVFJZX0VORF9DSEFSKQorICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gREJVU19JTlZBTElEX01JU1NJTkdfQVJSQVlfRUxFTUVOVF9UWVBFOworICAgICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorCSAgICB7CisgICAgICAgICAgICAgIGFycmF5X2RlcHRoID0gMDsKKwkgICAgfQorICAgICAgICB9CisKKyAgICAgIGlmIChsYXN0ID09IERCVVNfRElDVF9FTlRSWV9CRUdJTl9DSEFSKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCEoZGJ1c190eXBlX2lzX3ZhbGlkICgqcCkgJiYgZGJ1c190eXBlX2lzX2Jhc2ljICgqcCkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICByZXN1bHQgPSBEQlVTX0lOVkFMSURfRElDVF9LRVlfTVVTVF9CRV9CQVNJQ19UWVBFOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICBsYXN0ID0gKnA7CisgICAgICArK3A7CisgICAgfQorCisKKyAgaWYgKGFycmF5X2RlcHRoID4gMCkKKyAgICB7CisgICAgICByZXN1bHQgPSBEQlVTX0lOVkFMSURfTUlTU0lOR19BUlJBWV9FTEVNRU5UX1RZUEU7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisgICAgCisgIGlmIChzdHJ1Y3RfZGVwdGggPiAwKQorICAgIHsKKyAgICAgICByZXN1bHQgPSBEQlVTX0lOVkFMSURfU1RSVUNUX1NUQVJURURfQlVUX05PVF9FTkRFRDsKKyAgICAgICBnb3RvIG91dDsKKyAgICB9CisgICAgCisgIGlmIChkaWN0X2VudHJ5X2RlcHRoID4gMCkKKyAgICB7CisgICAgICByZXN1bHQgPSAgREJVU19JTlZBTElEX0RJQ1RfRU5UUllfU1RBUlRFRF9CVVRfTk9UX0VOREVEOworICAgICAgZ290byBvdXQ7CisgICAgfQorICAgIAorICBfZGJ1c19hc3NlcnQgKGxhc3QgIT0gREJVU19UWVBFX0FSUkFZKTsKKyAgX2RidXNfYXNzZXJ0IChsYXN0ICE9IERCVVNfU1RSVUNUX0JFR0lOX0NIQVIpOworICBfZGJ1c19hc3NlcnQgKGxhc3QgIT0gREJVU19ESUNUX0VOVFJZX0JFR0lOX0NIQVIpOworCisgIHJlc3VsdCA9IERCVVNfVkFMSUQ7CisKK291dDoKKyAgX2RidXNfbGlzdF9jbGVhciAoJmVsZW1lbnRfY291bnRfc3RhY2spOworICByZXR1cm4gcmVzdWx0OworfQorCisvKiBub3RlOiB0aGlzIGZ1bmN0aW9uIGlzIGFsc28gdXNlZCB0byB2YWxpZGF0ZSB0aGUgaGVhZGVyJ3MgdmFsdWVzLAorICogc2luY2UgdGhlIGhlYWRlciBpcyBhIHZhbGlkIGJvZHkgd2l0aCBhIHBhcnRpY3VsYXIgc2lnbmF0dXJlLgorICovCitzdGF0aWMgREJ1c1ZhbGlkaXR5Cit2YWxpZGF0ZV9ib2R5X2hlbHBlciAoREJ1c1R5cGVSZWFkZXIgICAgICAgKnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICAgICAgd2Fsa19yZWFkZXJfdG9fZW5kLAorICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICB0b3RhbF9kZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICAqcCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICAqZW5kLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKipuZXdfcCkKK3sKKyAgaW50IGN1cnJlbnRfdHlwZTsKKworICAvKiBUaGUgc3BlYyBhbGxvd3MgYXJyYXlzIGFuZCBzdHJ1Y3RzIHRvIGVhY2ggbmVzdCAzMiwgZm9yIHRvdGFsCisgICAqIG5lc3Rpbmcgb2YgMiozMi4gV2Ugd2FudCB0byBpbXBvc2UgdGhlIHNhbWUgbGltaXQgb24gImR5bmFtaWMiCisgICAqIHZhbHVlIG5lc3RpbmcgKG5vdCB2aXNpYmxlIGluIHRoZSBzaWduYXR1cmUpIHdoaWNoIGlzIGludHJvZHVjZWQKKyAgICogYnkgREJVU19UWVBFX1ZBUklBTlQuCisgICAqLworICBpZiAodG90YWxfZGVwdGggPiAoREJVU19NQVhJTVVNX1RZUEVfUkVDVVJTSU9OX0RFUFRIICogMikpCisgICAgeworICAgICAgcmV0dXJuIERCVVNfSU5WQUxJRF9ORVNURURfVE9PX0RFRVBMWTsKKyAgICB9CisKKyAgd2hpbGUgKChjdXJyZW50X3R5cGUgPSBfZGJ1c190eXBlX3JlYWRlcl9nZXRfY3VycmVudF90eXBlIChyZWFkZXIpKSAhPSBEQlVTX1RZUEVfSU5WQUxJRCkKKyAgICB7CisgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICphOworICAgICAgaW50IGFsaWdubWVudDsKKworI2lmIDAKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgICB2YWxpZGF0aW5nIHZhbHVlIG9mIHR5cGUgJXMgdHlwZSByZWFkZXIgJXAgdHlwZV9wb3MgJWQgcCAlcCBlbmQgJXAgJWQgcmVtYWluXG4iLAorICAgICAgICAgICAgICAgICAgICAgX2RidXNfdHlwZV90b19zdHJpbmcgKGN1cnJlbnRfdHlwZSksIHJlYWRlciwgcmVhZGVyLT50eXBlX3BvcywgcCwgZW5kLAorICAgICAgICAgICAgICAgICAgICAgKGludCkgKGVuZCAtIHApKTsKKyNlbmRpZgorCisgICAgICAvKiBHdWFyYW50ZWUgdGhhdCBwIGhhcyBvbmUgYnl0ZSB0byBsb29rIGF0ICovCisgICAgICBpZiAocCA9PSBlbmQpCisgICAgICAgIHJldHVybiBEQlVTX0lOVkFMSURfTk9UX0VOT1VHSF9EQVRBOworCisgICAgICBzd2l0Y2ggKGN1cnJlbnRfdHlwZSkKKyAgICAgICAgeworICAgICAgICBjYXNlIERCVVNfVFlQRV9CWVRFOgorICAgICAgICAgICsrcDsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIERCVVNfVFlQRV9CT09MRUFOOgorICAgICAgICBjYXNlIERCVVNfVFlQRV9JTlQxNjoKKyAgICAgICAgY2FzZSBEQlVTX1RZUEVfVUlOVDE2OgorICAgICAgICBjYXNlIERCVVNfVFlQRV9JTlQzMjoKKyAgICAgICAgY2FzZSBEQlVTX1RZUEVfVUlOVDMyOgorICAgICAgICBjYXNlIERCVVNfVFlQRV9VTklYX0ZEOgorICAgICAgICBjYXNlIERCVVNfVFlQRV9JTlQ2NDoKKyAgICAgICAgY2FzZSBEQlVTX1RZUEVfVUlOVDY0OgorICAgICAgICBjYXNlIERCVVNfVFlQRV9ET1VCTEU6CisgICAgICAgICAgYWxpZ25tZW50ID0gX2RidXNfdHlwZV9nZXRfYWxpZ25tZW50IChjdXJyZW50X3R5cGUpOworICAgICAgICAgIGEgPSBfREJVU19BTElHTl9BRERSRVNTIChwLCBhbGlnbm1lbnQpOworICAgICAgICAgIGlmIChhID49IGVuZCkKKyAgICAgICAgICAgIHJldHVybiBEQlVTX0lOVkFMSURfTk9UX0VOT1VHSF9EQVRBOworICAgICAgICAgIHdoaWxlIChwICE9IGEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmICgqcCAhPSAnXDAnKQorICAgICAgICAgICAgICAgIHJldHVybiBEQlVTX0lOVkFMSURfQUxJR05NRU5UX1BBRERJTkdfTk9UX05VTDsKKyAgICAgICAgICAgICAgKytwOworICAgICAgICAgICAgfQorICAgICAgICAgIAorICAgICAgICAgIGlmIChjdXJyZW50X3R5cGUgPT0gREJVU19UWVBFX0JPT0xFQU4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgdjsKKworICAgICAgICAgICAgICBpZiAocCArIDQgPiBlbmQpCisgICAgICAgICAgICAgICAgcmV0dXJuIERCVVNfSU5WQUxJRF9OT1RfRU5PVUdIX0RBVEE7CisKKyAgICAgICAgICAgICAgdiA9IF9kYnVzX3VucGFja191aW50MzIgKGJ5dGVfb3JkZXIsIHApOworCisgICAgICAgICAgICAgIGlmICghKHYgPT0gMCB8fCB2ID09IDEpKQorICAgICAgICAgICAgICAgIHJldHVybiBEQlVTX0lOVkFMSURfQk9PTEVBTl9OT1RfWkVST19PUl9PTkU7CisgICAgICAgICAgICB9CisgICAgICAgICAgCisgICAgICAgICAgcCArPSBhbGlnbm1lbnQ7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBEQlVTX1RZUEVfQVJSQVk6CisgICAgICAgIGNhc2UgREJVU19UWVBFX1NUUklORzoKKyAgICAgICAgY2FzZSBEQlVTX1RZUEVfT0JKRUNUX1BBVEg6CisgICAgICAgICAgeworICAgICAgICAgICAgZGJ1c191aW50MzJfdCBjbGFpbWVkX2xlbjsKKworICAgICAgICAgICAgYSA9IF9EQlVTX0FMSUdOX0FERFJFU1MgKHAsIDQpOworICAgICAgICAgICAgaWYgKGEgKyA0ID4gZW5kKQorICAgICAgICAgICAgICByZXR1cm4gREJVU19JTlZBTElEX05PVF9FTk9VR0hfREFUQTsKKyAgICAgICAgICAgIHdoaWxlIChwICE9IGEpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKnAgIT0gJ1wwJykKKyAgICAgICAgICAgICAgICAgIHJldHVybiBEQlVTX0lOVkFMSURfQUxJR05NRU5UX1BBRERJTkdfTk9UX05VTDsKKyAgICAgICAgICAgICAgICArK3A7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xhaW1lZF9sZW4gPSBfZGJ1c191bnBhY2tfdWludDMyIChieXRlX29yZGVyLCBwKTsKKyAgICAgICAgICAgIHAgKz0gNDsKKworICAgICAgICAgICAgLyogcCBtYXkgbm93IGJlID09IGVuZCAqLworICAgICAgICAgICAgX2RidXNfYXNzZXJ0IChwIDw9IGVuZCk7CisKKyAgICAgICAgICAgIGlmIChjdXJyZW50X3R5cGUgPT0gREJVU19UWVBFX0FSUkFZKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFycmF5X2VsZW1fdHlwZSA9IF9kYnVzX3R5cGVfcmVhZGVyX2dldF9lbGVtZW50X3R5cGUgKHJlYWRlcik7CisKKyAgICAgICAgICAgICAgICBpZiAoIWRidXNfdHlwZV9pc192YWxpZCAoYXJyYXlfZWxlbV90eXBlKSkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERCVVNfSU5WQUxJRF9VTktOT1dOX1RZUEVDT0RFOworICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYWxpZ25tZW50ID0gX2RidXNfdHlwZV9nZXRfYWxpZ25tZW50IChhcnJheV9lbGVtX3R5cGUpOworCisgICAgICAgICAgICAgICAgYSA9IF9EQlVTX0FMSUdOX0FERFJFU1MgKHAsIGFsaWdubWVudCk7CisKKyAgICAgICAgICAgICAgICAvKiBhIG1heSBub3cgYmUgPT0gZW5kICovCisgICAgICAgICAgICAgICAgaWYgKGEgPiBlbmQpCisgICAgICAgICAgICAgICAgICByZXR1cm4gREJVU19JTlZBTElEX05PVF9FTk9VR0hfREFUQTsKKworICAgICAgICAgICAgICAgIHdoaWxlIChwICE9IGEpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICgqcCAhPSAnXDAnKQorICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBEQlVTX0lOVkFMSURfQUxJR05NRU5UX1BBRERJTkdfTk9UX05VTDsKKyAgICAgICAgICAgICAgICAgICAgKytwOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjbGFpbWVkX2xlbiA+ICh1bnNpZ25lZCBsb25nKSAoZW5kIC0gcCkpCisgICAgICAgICAgICAgIHJldHVybiBEQlVTX0lOVkFMSURfTEVOR1RIX09VVF9PRl9CT1VORFM7CisKKyAgICAgICAgICAgIGlmIChjdXJyZW50X3R5cGUgPT0gREJVU19UWVBFX09CSkVDVF9QQVRIKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREJ1c1N0cmluZyBzdHI7CisgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2luaXRfY29uc3RfbGVuICgmc3RyLCAoY29uc3QgY2hhciAqKSBwLCBjbGFpbWVkX2xlbik7CisgICAgICAgICAgICAgICAgaWYgKCFfZGJ1c192YWxpZGF0ZV9wYXRoICgmc3RyLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpKSkKKyAgICAgICAgICAgICAgICAgIHJldHVybiBEQlVTX0lOVkFMSURfQkFEX1BBVEg7CisKKyAgICAgICAgICAgICAgICBwICs9IGNsYWltZWRfbGVuOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChjdXJyZW50X3R5cGUgPT0gREJVU19UWVBFX1NUUklORykKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgc3RyOworICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0X2xlbiAoJnN0ciwgKGNvbnN0IGNoYXIgKikgcCwgY2xhaW1lZF9sZW4pOworICAgICAgICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX3ZhbGlkYXRlX3V0ZjggKCZzdHIsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpKSkKKyAgICAgICAgICAgICAgICAgIHJldHVybiBEQlVTX0lOVkFMSURfQkFEX1VURjhfSU5fU1RSSU5HOworCisgICAgICAgICAgICAgICAgcCArPSBjbGFpbWVkX2xlbjsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoY3VycmVudF90eXBlID09IERCVVNfVFlQRV9BUlJBWSAmJiBjbGFpbWVkX2xlbiA+IDApCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciBzdWI7CisgICAgICAgICAgICAgICAgREJ1c1ZhbGlkaXR5IHZhbGlkaXR5OworICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFycmF5X2VuZDsKKyAgICAgICAgICAgICAgICBpbnQgYXJyYXlfZWxlbV90eXBlOworCisgICAgICAgICAgICAgICAgaWYgKGNsYWltZWRfbGVuID4gREJVU19NQVhJTVVNX0FSUkFZX0xFTkdUSCkKKyAgICAgICAgICAgICAgICAgIHJldHVybiBEQlVTX0lOVkFMSURfQVJSQVlfTEVOR1RIX0VYQ0VFRFNfTUFYSU1VTTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvKiBSZW1lbWJlciB0aGF0IHRoZSByZWFkZXIgaXMgdHlwZXMgb25seSwgc28gd2UgY2FuJ3QKKyAgICAgICAgICAgICAgICAgKiB1c2UgaXQgdG8gaXRlcmF0ZSBvdmVyIGVsZW1lbnRzLiBJdCBzdGF5cyB0aGUgc2FtZQorICAgICAgICAgICAgICAgICAqIGZvciBhbGwgZWxlbWVudHMuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgX2RidXNfdHlwZV9yZWFkZXJfcmVjdXJzZSAocmVhZGVyLCAmc3ViKTsKKworICAgICAgICAgICAgICAgIGFycmF5X2VuZCA9IHAgKyBjbGFpbWVkX2xlbjsKKworICAgICAgICAgICAgICAgIGFycmF5X2VsZW1fdHlwZSA9IF9kYnVzX3R5cGVfcmVhZGVyX2dldF9lbGVtZW50X3R5cGUgKHJlYWRlcik7CisKKyAgICAgICAgICAgICAgICAvKiBhdm9pZCByZWN1cnNpdmUgY2FsbCB0byB2YWxpZGF0ZV9ib2R5X2hlbHBlciBpZiB0aGlzIGlzIGFuIGFycmF5CisgICAgICAgICAgICAgICAgICogb2YgZml4ZWQtc2l6ZSBlbGVtZW50cworICAgICAgICAgICAgICAgICAqLyAKKyAgICAgICAgICAgICAgICBpZiAoZGJ1c190eXBlX2lzX2ZpeGVkIChhcnJheV9lbGVtX3R5cGUpKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBib29scyBuZWVkIHRvIGJlIGhhbmRsZWQgZGlmZmVyZW50bHksIGJlY2F1c2UgdGhleSBjYW4KKyAgICAgICAgICAgICAgICAgICAgICogaGF2ZSBhbiBpbnZhbGlkIHZhbHVlCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBpZiAoYXJyYXlfZWxlbV90eXBlID09IERCVVNfVFlQRV9CT09MRUFOKQorICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgdjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsaWdubWVudCA9IF9kYnVzX3R5cGVfZ2V0X2FsaWdubWVudCAoYXJyYXlfZWxlbV90eXBlKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHAgPCBhcnJheV9lbmQpCisgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gX2RidXNfdW5wYWNrX3VpbnQzMiAoYnl0ZV9vcmRlciwgcCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh2ID09IDAgfHwgdiA9PSAxKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBEQlVTX0lOVkFMSURfQk9PTEVBTl9OT1RfWkVST19PUl9PTkU7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwICs9IGFsaWdubWVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcCA9IGFycmF5X2VuZDsKKyAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChwIDwgYXJyYXlfZW5kKQorICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkaXR5ID0gdmFsaWRhdGVfYm9keV9oZWxwZXIgKCZzdWIsIGJ5dGVfb3JkZXIsIEZBTFNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxfZGVwdGggKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCwgZW5kLCAmcCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWRpdHkgIT0gREJVU19WQUxJRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbGlkaXR5OworICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChwICE9IGFycmF5X2VuZCkKKyAgICAgICAgICAgICAgICAgIHJldHVybiBEQlVTX0lOVkFMSURfQVJSQVlfTEVOR1RIX0lOQ09SUkVDVDsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBjaGVjayBudWwgdGVybWluYXRpb24gKi8KKyAgICAgICAgICAgIGlmIChjdXJyZW50X3R5cGUgIT0gREJVU19UWVBFX0FSUkFZKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHAgPT0gZW5kKQorICAgICAgICAgICAgICAgICAgcmV0dXJuIERCVVNfSU5WQUxJRF9OT1RfRU5PVUdIX0RBVEE7CisKKyAgICAgICAgICAgICAgICBpZiAoKnAgIT0gJ1wwJykKKyAgICAgICAgICAgICAgICAgIHJldHVybiBEQlVTX0lOVkFMSURfU1RSSU5HX01JU1NJTkdfTlVMOworICAgICAgICAgICAgICAgICsrcDsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIERCVVNfVFlQRV9TSUdOQVRVUkU6CisgICAgICAgICAgeworICAgICAgICAgICAgZGJ1c191aW50MzJfdCBjbGFpbWVkX2xlbjsKKyAgICAgICAgICAgIERCdXNTdHJpbmcgc3RyOworICAgICAgICAgICAgREJ1c1ZhbGlkaXR5IHZhbGlkaXR5OworCisgICAgICAgICAgICBjbGFpbWVkX2xlbiA9ICpwOworICAgICAgICAgICAgKytwOworCisgICAgICAgICAgICAvKiAxIGlzIGZvciBudWwgdGVybWluYXRpb24gKi8KKyAgICAgICAgICAgIGlmIChjbGFpbWVkX2xlbiArIDEgPiAodW5zaWduZWQgbG9uZykgKGVuZCAtIHApKQorICAgICAgICAgICAgICByZXR1cm4gREJVU19JTlZBTElEX1NJR05BVFVSRV9MRU5HVEhfT1VUX09GX0JPVU5EUzsKKworICAgICAgICAgICAgX2RidXNfc3RyaW5nX2luaXRfY29uc3RfbGVuICgmc3RyLCAoY29uc3QgY2hhciAqKSBwLCBjbGFpbWVkX2xlbik7CisgICAgICAgICAgICB2YWxpZGl0eSA9CisgICAgICAgICAgICAgIF9kYnVzX3ZhbGlkYXRlX3NpZ25hdHVyZV93aXRoX3JlYXNvbiAoJnN0ciwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikpOworCisgICAgICAgICAgICBpZiAodmFsaWRpdHkgIT0gREJVU19WQUxJRCkKKyAgICAgICAgICAgICAgcmV0dXJuIHZhbGlkaXR5OworCisgICAgICAgICAgICBwICs9IGNsYWltZWRfbGVuOworCisgICAgICAgICAgICBfZGJ1c19hc3NlcnQgKHAgPCBlbmQpOworICAgICAgICAgICAgaWYgKCpwICE9IERCVVNfVFlQRV9JTlZBTElEKQorICAgICAgICAgICAgICByZXR1cm4gREJVU19JTlZBTElEX1NJR05BVFVSRV9NSVNTSU5HX05VTDsKKworICAgICAgICAgICAgKytwOworCisgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgicCA9ICVwIGVuZCA9ICVwIGNsYWltZWRfbGVuICV1XG4iLCBwLCBlbmQsIGNsYWltZWRfbGVuKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBEQlVTX1RZUEVfVkFSSUFOVDoKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiAxIGJ5dGUgc2lnIGxlbiwgc2lnIHR5cGVjb2RlcywgYWxpZ24gdG8KKyAgICAgICAgICAgICAqIGNvbnRhaW5lZC10eXBlLWJvdW5kYXJ5LCB2YWx1ZXMuCisgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgLyogSW4gYWRkaXRpb24gdG8gbm9ybWFsIHNpZ25hdHVyZSB2YWxpZGF0aW9uLCB3ZSBuZWVkIHRvIGJlIHN1cmUKKyAgICAgICAgICAgICAqIHRoZSBzaWduYXR1cmUgY29udGFpbnMgb25seSBhIHNpbmdsZSAocG9zc2libHkgY29udGFpbmVyKSB0eXBlLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBkYnVzX3VpbnQzMl90IGNsYWltZWRfbGVuOworICAgICAgICAgICAgREJ1c1N0cmluZyBzaWc7CisgICAgICAgICAgICBEQnVzVHlwZVJlYWRlciBzdWI7CisgICAgICAgICAgICBEQnVzVmFsaWRpdHkgdmFsaWRpdHk7CisgICAgICAgICAgICBpbnQgY29udGFpbmVkX2FsaWdubWVudDsKKyAgICAgICAgICAgIGludCBjb250YWluZWRfdHlwZTsKKyAgICAgICAgICAgIERCdXNWYWxpZGl0eSByZWFzb247CisKKyAgICAgICAgICAgIGNsYWltZWRfbGVuID0gKnA7CisgICAgICAgICAgICArK3A7CisKKyAgICAgICAgICAgIC8qICsgMSBmb3IgbnVsICovCisgICAgICAgICAgICBpZiAoY2xhaW1lZF9sZW4gKyAxID4gKHVuc2lnbmVkIGxvbmcpIChlbmQgLSBwKSkKKyAgICAgICAgICAgICAgcmV0dXJuIERCVVNfSU5WQUxJRF9WQVJJQU5UX1NJR05BVFVSRV9MRU5HVEhfT1VUX09GX0JPVU5EUzsKKworICAgICAgICAgICAgX2RidXNfc3RyaW5nX2luaXRfY29uc3RfbGVuICgmc2lnLCAoY29uc3QgY2hhciAqKSBwLCBjbGFpbWVkX2xlbik7CisgICAgICAgICAgICByZWFzb24gPSBfZGJ1c192YWxpZGF0ZV9zaWduYXR1cmVfd2l0aF9yZWFzb24gKCZzaWcsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzaWcpKTsKKyAgICAgICAgICAgIGlmICghKHJlYXNvbiA9PSBEQlVTX1ZBTElEKSkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChyZWFzb24gPT0gREJVU19WQUxJRElUWV9VTktOT1dOX09PTV9FUlJPUikKKyAgICAgICAgICAgICAgICAgIHJldHVybiByZWFzb247CisgICAgICAgICAgICAgICAgZWxzZSAKKyAgICAgICAgICAgICAgICAgIHJldHVybiBEQlVTX0lOVkFMSURfVkFSSUFOVF9TSUdOQVRVUkVfQkFEOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHAgKz0gY2xhaW1lZF9sZW47CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmICgqcCAhPSBEQlVTX1RZUEVfSU5WQUxJRCkKKyAgICAgICAgICAgICAgcmV0dXJuIERCVVNfSU5WQUxJRF9WQVJJQU5UX1NJR05BVFVSRV9NSVNTSU5HX05VTDsKKyAgICAgICAgICAgICsrcDsKKworICAgICAgICAgICAgY29udGFpbmVkX3R5cGUgPSBfZGJ1c19maXJzdF90eXBlX2luX3NpZ25hdHVyZSAoJnNpZywgMCk7CisgICAgICAgICAgICBpZiAoY29udGFpbmVkX3R5cGUgPT0gREJVU19UWVBFX0lOVkFMSUQpCisgICAgICAgICAgICAgIHJldHVybiBEQlVTX0lOVkFMSURfVkFSSUFOVF9TSUdOQVRVUkVfRU1QVFk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNvbnRhaW5lZF9hbGlnbm1lbnQgPSBfZGJ1c190eXBlX2dldF9hbGlnbm1lbnQgKGNvbnRhaW5lZF90eXBlKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgYSA9IF9EQlVTX0FMSUdOX0FERFJFU1MgKHAsIGNvbnRhaW5lZF9hbGlnbm1lbnQpOworICAgICAgICAgICAgaWYgKGEgPiBlbmQpCisgICAgICAgICAgICAgIHJldHVybiBEQlVTX0lOVkFMSURfTk9UX0VOT1VHSF9EQVRBOworICAgICAgICAgICAgd2hpbGUgKHAgIT0gYSkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgqcCAhPSAnXDAnKQorICAgICAgICAgICAgICAgICAgcmV0dXJuIERCVVNfSU5WQUxJRF9BTElHTk1FTlRfUEFERElOR19OT1RfTlVMOworICAgICAgICAgICAgICAgICsrcDsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICBfZGJ1c190eXBlX3JlYWRlcl9pbml0X3R5cGVzX29ubHkgKCZzdWIsICZzaWcsIDApOworCisgICAgICAgICAgICBfZGJ1c19hc3NlcnQgKF9kYnVzX3R5cGVfcmVhZGVyX2dldF9jdXJyZW50X3R5cGUgKCZzdWIpICE9IERCVVNfVFlQRV9JTlZBTElEKTsKKworICAgICAgICAgICAgdmFsaWRpdHkgPSB2YWxpZGF0ZV9ib2R5X2hlbHBlciAoJnN1YiwgYnl0ZV9vcmRlciwgRkFMU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbF9kZXB0aCArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLCBlbmQsICZwKTsKKyAgICAgICAgICAgIGlmICh2YWxpZGl0eSAhPSBEQlVTX1ZBTElEKQorICAgICAgICAgICAgICByZXR1cm4gdmFsaWRpdHk7CisKKyAgICAgICAgICAgIGlmIChfZGJ1c190eXBlX3JlYWRlcl9uZXh0ICgmc3ViKSkKKyAgICAgICAgICAgICAgcmV0dXJuIERCVVNfSU5WQUxJRF9WQVJJQU5UX1NJR05BVFVSRV9TUEVDSUZJRVNfTVVMVElQTEVfVkFMVUVTOworCisgICAgICAgICAgICBfZGJ1c19hc3NlcnQgKF9kYnVzX3R5cGVfcmVhZGVyX2dldF9jdXJyZW50X3R5cGUgKCZzdWIpID09IERCVVNfVFlQRV9JTlZBTElEKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBEQlVTX1RZUEVfRElDVF9FTlRSWToKKyAgICAgICAgY2FzZSBEQlVTX1RZUEVfU1RSVUNUOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIERCdXNUeXBlUmVhZGVyIHN1YjsKKyAgICAgICAgICAgIERCdXNWYWxpZGl0eSB2YWxpZGl0eTsKKworICAgICAgICAgICAgYSA9IF9EQlVTX0FMSUdOX0FERFJFU1MgKHAsIDgpOworICAgICAgICAgICAgaWYgKGEgPiBlbmQpCisgICAgICAgICAgICAgIHJldHVybiBEQlVTX0lOVkFMSURfTk9UX0VOT1VHSF9EQVRBOworICAgICAgICAgICAgd2hpbGUgKHAgIT0gYSkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgqcCAhPSAnXDAnKQorICAgICAgICAgICAgICAgICAgcmV0dXJuIERCVVNfSU5WQUxJRF9BTElHTk1FTlRfUEFERElOR19OT1RfTlVMOworICAgICAgICAgICAgICAgICsrcDsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICBfZGJ1c190eXBlX3JlYWRlcl9yZWN1cnNlIChyZWFkZXIsICZzdWIpOworCisgICAgICAgICAgICB2YWxpZGl0eSA9IHZhbGlkYXRlX2JvZHlfaGVscGVyICgmc3ViLCBieXRlX29yZGVyLCBUUlVFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxfZGVwdGggKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCwgZW5kLCAmcCk7CisgICAgICAgICAgICBpZiAodmFsaWRpdHkgIT0gREJVU19WQUxJRCkKKyAgICAgICAgICAgICAgcmV0dXJuIHZhbGlkaXR5OworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImludmFsaWQgdHlwZWNvZGUgaW4gc3VwcG9zZWRseS12YWxpZGF0ZWQgc2lnbmF0dXJlIik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworI2lmIDAKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgICB2YWxpZGF0ZWQgdmFsdWUgb2YgdHlwZSAlcyB0eXBlIHJlYWRlciAlcCB0eXBlX3BvcyAlZCBwICVwIGVuZCAlcCAlZCByZW1haW5cbiIsCisgICAgICAgICAgICAgICAgICAgICBfZGJ1c190eXBlX3RvX3N0cmluZyAoY3VycmVudF90eXBlKSwgcmVhZGVyLCByZWFkZXItPnR5cGVfcG9zLCBwLCBlbmQsCisgICAgICAgICAgICAgICAgICAgICAoaW50KSAoZW5kIC0gcCkpOworI2VuZGlmCisKKyAgICAgIGlmIChwID4gZW5kKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIm5vdCBlbm91Z2ggZGF0YSEhISBwID0gJXAgZW5kID0gJXAgZW5kLXAgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwLCBlbmQsIChpbnQpIChlbmQgLSBwKSk7CisgICAgICAgICAgcmV0dXJuIERCVVNfSU5WQUxJRF9OT1RfRU5PVUdIX0RBVEE7CisgICAgICAgIH0KKworICAgICAgaWYgKHdhbGtfcmVhZGVyX3RvX2VuZCkKKyAgICAgICAgX2RidXNfdHlwZV9yZWFkZXJfbmV4dCAocmVhZGVyKTsKKyAgICAgIGVsc2UKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgIGlmIChuZXdfcCkKKyAgICAqbmV3X3AgPSBwOworCisgIHJldHVybiBEQlVTX1ZBTElEOworfQorCisvKioKKyAqIFZlcmlmaWVzIHRoYXQgdGhlIHJhbmdlIG9mIHZhbHVlX3N0ciBmcm9tIHZhbHVlX3BvcyB0byB2YWx1ZV9lbmQgaXMKKyAqIGEgbGVnaXRpbWF0ZSB2YWx1ZSBvZiB0eXBlIGV4cGVjdGVkX3NpZ25hdHVyZS4gIElmIHRoaXMgZnVuY3Rpb24KKyAqIHJldHVybnMgI1RSVUUsIGl0IHdpbGwgYmUgc2FmZSB0byBpdGVyYXRlIG92ZXIgdGhlIHZhbHVlcyB3aXRoCisgKiAjREJ1c1R5cGVSZWFkZXIuIFRoZSBzaWduYXR1cmUgaXMgYXNzdW1lZCB0byBiZSBhbHJlYWR5IHZhbGlkLgorICoKKyAqIElmIGJ5dGVzX3JlbWFpbmluZyBpcyBub3QgI05VTEwsIHRoZW4gbGVmdG92ZXIgYnl0ZXMgd2lsbCBiZSBzdG9yZWQKKyAqIHRoZXJlIGFuZCAjREJVU19WQUxJRCByZXR1cm5lZC4gSWYgaXQgaXMgI05VTEwsIHRoZW4KKyAqICNEQlVTX0lOVkFMSURfVE9PX01VQ0hfREFUQSB3aWxsIGJlIHJldHVybmVkIGlmIGJ5dGVzIGFyZSBsZWZ0CisgKiBvdmVyLgorICoKKyAqIEBwYXJhbSBleHBlY3RlZF9zaWduYXR1cmUgdGhlIGV4cGVjdGVkIHR5cGVzIGluIHRoZSB2YWx1ZV9zdHIKKyAqIEBwYXJhbSBleHBlY3RlZF9zaWduYXR1cmVfc3RhcnQgd2hlcmUgaW4gZXhwZWN0ZWRfc2lnbmF0dXJlIGlzIHRoZSBzaWduYXR1cmUKKyAqIEBwYXJhbSBieXRlX29yZGVyIHRoZSBieXRlIG9yZGVyCisgKiBAcGFyYW0gYnl0ZXNfcmVtYWluaW5nIHBsYWNlIHRvIHN0b3JlIGxlZnRvdmVyIGJ5dGVzCisgKiBAcGFyYW0gdmFsdWVfc3RyIHRoZSBzdHJpbmcgY29udGFpbmluZyB0aGUgYm9keQorICogQHBhcmFtIHZhbHVlX3BvcyB3aGVyZSB0aGUgdmFsdWVzIHN0YXJ0CisgKiBAcGFyYW0gbGVuIGxlbmd0aCBvZiB2YWx1ZXMgYWZ0ZXIgdmFsdWVfcG9zCisgKiBAcmV0dXJucyAjREJVU19WQUxJRCBpZiB2YWxpZCwgcmVhc29uIHdoeSBpbnZhbGlkIG90aGVyd2lzZQorICovCitEQnVzVmFsaWRpdHkKK19kYnVzX3ZhbGlkYXRlX2JvZHlfd2l0aF9yZWFzb24gKGNvbnN0IERCdXNTdHJpbmcgKmV4cGVjdGVkX3NpZ25hdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGV4cGVjdGVkX3NpZ25hdHVyZV9zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICpieXRlc19yZW1haW5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICp2YWx1ZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICB2YWx1ZV9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBsZW4pCit7CisgIERCdXNUeXBlUmVhZGVyIHJlYWRlcjsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqcDsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqZW5kOworICBEQnVzVmFsaWRpdHkgdmFsaWRpdHk7CisKKyAgX2RidXNfYXNzZXJ0IChsZW4gPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAodmFsdWVfcG9zID49IDApOworICBfZGJ1c19hc3NlcnQgKHZhbHVlX3BvcyA8PSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAodmFsdWVfc3RyKSAtIGxlbik7CisKKyAgX2RidXNfdmVyYm9zZSAoInZhbGlkYXRpbmcgYm9keSBmcm9tIHBvcyAlZCBsZW4gJWQgc2lnICclcydcbiIsCisgICAgICAgICAgICAgICAgIHZhbHVlX3BvcywgbGVuLCBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuIChleHBlY3RlZF9zaWduYXR1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZF9zaWduYXR1cmVfc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKSk7CisKKyAgX2RidXNfdHlwZV9yZWFkZXJfaW5pdF90eXBlc19vbmx5ICgmcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX3NpZ25hdHVyZSwgZXhwZWN0ZWRfc2lnbmF0dXJlX3N0YXJ0KTsKKworICBwID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF91ZGF0YV9sZW4gKHZhbHVlX3N0ciwgdmFsdWVfcG9zLCBsZW4pOworICBlbmQgPSBwICsgbGVuOworCisgIHZhbGlkaXR5ID0gdmFsaWRhdGVfYm9keV9oZWxwZXIgKCZyZWFkZXIsIGJ5dGVfb3JkZXIsIFRSVUUsIDAsIHAsIGVuZCwgJnApOworICBpZiAodmFsaWRpdHkgIT0gREJVU19WQUxJRCkKKyAgICByZXR1cm4gdmFsaWRpdHk7CisgIAorICBpZiAoYnl0ZXNfcmVtYWluaW5nKQorICAgIHsKKyAgICAgICpieXRlc19yZW1haW5pbmcgPSBlbmQgLSBwOworICAgICAgcmV0dXJuIERCVVNfVkFMSUQ7CisgICAgfQorICBlbHNlIGlmIChwIDwgZW5kKQorICAgIHJldHVybiBEQlVTX0lOVkFMSURfVE9PX01VQ0hfREFUQTsKKyAgZWxzZQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydCAocCA9PSBlbmQpOworICAgICAgcmV0dXJuIERCVVNfVkFMSUQ7CisgICAgfQorfQorCisvKioKKyAqIERldGVybWluZSB3ZXRoZXIgdGhlIGdpdmVuIGNoYXJhY3RlciBpcyB2YWxpZCBhcyB0aGUgZmlyc3QgY2hhcmFjdGVyCisgKiBpbiBhIG5hbWUuCisgKi8KKyNkZWZpbmUgVkFMSURfSU5JVElBTF9OQU1FX0NIQVJBQ1RFUihjKSAgICAgICAgIFwKKyAgKCAoKGMpID49ICdBJyAmJiAoYykgPD0gJ1onKSB8fCAgICAgICAgICAgICAgIFwKKyAgICAoKGMpID49ICdhJyAmJiAoYykgPD0gJ3onKSB8fCAgICAgICAgICAgICAgIFwKKyAgICAoKGMpID09ICdfJykgKQorCisvKioKKyAqIERldGVybWluZSB3ZXRoZXIgdGhlIGdpdmVuIGNoYXJhY3RlciBpcyB2YWxpZCBhcyBhIHNlY29uZCBvciBsYXRlcgorICogY2hhcmFjdGVyIGluIGEgbmFtZQorICovCisjZGVmaW5lIFZBTElEX05BTUVfQ0hBUkFDVEVSKGMpICAgICAgICAgICAgICAgICBcCisgICggKChjKSA+PSAnMCcgJiYgKGMpIDw9ICc5JykgfHwgICAgICAgICAgICAgICBcCisgICAgKChjKSA+PSAnQScgJiYgKGMpIDw9ICdaJykgfHwgICAgICAgICAgICAgICBcCisgICAgKChjKSA+PSAnYScgJiYgKGMpIDw9ICd6JykgfHwgICAgICAgICAgICAgICBcCisgICAgKChjKSA9PSAnXycpICkKKworLyoqCisgKiBDaGVja3MgdGhhdCB0aGUgZ2l2ZW4gcmFuZ2Ugb2YgdGhlIHN0cmluZyBpcyBhIHZhbGlkIG9iamVjdCBwYXRoCisgKiBuYW1lIGluIHRoZSBELUJ1cyBwcm90b2NvbC4gUGFydCBvZiB0aGUgdmFsaWRhdGlvbiBlbnN1cmVzIHRoYXQKKyAqIHRoZSBvYmplY3QgcGF0aCBjb250YWlucyBvbmx5IEFTQ0lJLgorICoKKyAqIEB0b2RvIHRoaXMgaXMgaW5jb25zaXN0ZW50IHdpdGggbW9zdCBvZiBEQnVzU3RyaW5nIGluIHRoYXQKKyAqIGl0IGFsbG93cyBhIHN0YXJ0LGxlbiByYW5nZSB0aGF0IGV4dGVuZHMgcGFzdCB0aGUgc3RyaW5nIGVuZC4KKyAqCisgKiBAdG9kbyBjaGFuZ2Ugc3BlYyB0byBkaXNhbGxvdyBtb3JlIHRoaW5ncywgc3VjaCBhcyBzcGFjZXMgaW4gdGhlCisgKiBwYXRoIG5hbWUKKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcKKyAqIEBwYXJhbSBzdGFydCBmaXJzdCBieXRlIGluZGV4IHRvIGNoZWNrCisgKiBAcGFyYW0gbGVuIG51bWJlciBvZiBieXRlcyB0byBjaGVjaworICogQHJldHVybnMgI1RSVUUgaWYgdGhlIGJ5dGUgcmFuZ2UgZXhpc3RzIGFuZCBpcyBhIHZhbGlkIG5hbWUKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3ZhbGlkYXRlX3BhdGggKGNvbnN0IERCdXNTdHJpbmcgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgbGVuKQoreworICBjb25zdCB1bnNpZ25lZCBjaGFyICpzOworICBjb25zdCB1bnNpZ25lZCBjaGFyICplbmQ7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmxhc3Rfc2xhc2g7CisKKyAgX2RidXNfYXNzZXJ0IChzdGFydCA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChsZW4gPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAoc3RhcnQgPD0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHN0cikpOworICAKKyAgaWYgKGxlbiA+IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChzdHIpIC0gc3RhcnQpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmIChsZW4gPT0gMCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcyA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfdWRhdGEgKHN0cikgKyBzdGFydDsKKyAgZW5kID0gcyArIGxlbjsKKworICBpZiAoKnMgIT0gJy8nKQorICAgIHJldHVybiBGQUxTRTsKKyAgbGFzdF9zbGFzaCA9IHM7CisgICsrczsKKworICB3aGlsZSAocyAhPSBlbmQpCisgICAgeworICAgICAgaWYgKCpzID09ICcvJykKKyAgICAgICAgeworICAgICAgICAgIGlmICgocyAtIGxhc3Rfc2xhc2gpIDwgMikKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsgLyogbm8gZW1wdHkgcGF0aCBjb21wb25lbnRzIGFsbG93ZWQgKi8KKworICAgICAgICAgIGxhc3Rfc2xhc2ggPSBzOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoX0RCVVNfVU5MSUtFTFkgKCFWQUxJRF9OQU1FX0NIQVJBQ1RFUiAoKnMpKSkKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICArK3M7CisgICAgfQorCisgIGlmICgoZW5kIC0gbGFzdF9zbGFzaCkgPCAyICYmCisgICAgICBsZW4gPiAxKQorICAgIHJldHVybiBGQUxTRTsgLyogdHJhaWxpbmcgc2xhc2ggbm90IGFsbG93ZWQgdW5sZXNzIHRoZSBzdHJpbmcgaXMgIi8iICovCisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2NvbnN0IGNoYXIgKgorX2RidXNfdmFsaWRpdHlfdG9fZXJyb3JfbWVzc2FnZSAoREJ1c1ZhbGlkaXR5IHZhbGlkaXR5KQoreworICBzd2l0Y2ggKHZhbGlkaXR5KQorICAgIHsKKyAgICBjYXNlIERCVVNfVkFMSURJVFlfVU5LTk9XTl9PT01fRVJST1I6ICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIk91dCBvZiBtZW1vcnkiOworICAgIGNhc2UgREJVU19JTlZBTElEX0ZPUl9VTktOT1dOX1JFQVNPTjogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiVW5rbm93biByZWFzb24iOworICAgIGNhc2UgREJVU19WQUxJRF9CVVRfSU5DT01QTEVURTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiVmFsaWQgYnV0IGluY29tcGxldGUiOworICAgIGNhc2UgREJVU19WQUxJRElUWV9VTktOT1dOOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiVmFsaWRpdHkgdW5rbm93biI7CisgICAgY2FzZSBEQlVTX1ZBTElEOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJWYWxpZCI7CisgICAgY2FzZSBEQlVTX0lOVkFMSURfVU5LTk9XTl9UWVBFQ09ERTogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJVbmtub3duIHR5cGVjb2RlIjsKKyAgICBjYXNlIERCVVNfSU5WQUxJRF9NSVNTSU5HX0FSUkFZX0VMRU1FTlRfVFlQRTogICAgICAgICAgICAgICAgICByZXR1cm4gIk1pc3NpbmcgYXJyYXkgZWxlbWVudCB0eXBlIjsKKyAgICBjYXNlIERCVVNfSU5WQUxJRF9TSUdOQVRVUkVfVE9PX0xPTkc6ICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIlNpZ25hdHVyZSBpcyB0b28gbG9uZyI7CisgICAgY2FzZSBEQlVTX0lOVkFMSURfRVhDRUVERURfTUFYSU1VTV9BUlJBWV9SRUNVUlNJT046ICAgICAgICAgICAgcmV0dXJuICJFeGNlZWRlZCBtYXhpbXVtIGFycmF5IHJlY3Vyc2lvbiI7CisgICAgY2FzZSBEQlVTX0lOVkFMSURfRVhDRUVERURfTUFYSU1VTV9TVFJVQ1RfUkVDVVJTSU9OOiAgICAgICAgICAgcmV0dXJuICJFeGNlZWRlZCBtYXhpbXVtIHN0cnVjdCByZWN1cnNpb24iOworICAgIGNhc2UgREJVU19JTlZBTElEX1NUUlVDVF9FTkRFRF9CVVRfTk9UX1NUQVJURUQ6ICAgICAgICAgICAgICAgIHJldHVybiAiU3RydWN0IGVuZGVkIGJ1dCBub3Qgc3RhcnRlZCI7CisgICAgY2FzZSBEQlVTX0lOVkFMSURfU1RSVUNUX1NUQVJURURfQlVUX05PVF9FTkRFRDogICAgICAgICAgICAgICAgcmV0dXJuICJTdHJ1Y3Qgc3RhcnRlZCBidXQgbm90IGVuZGVkIjsKKyAgICBjYXNlIERCVVNfSU5WQUxJRF9TVFJVQ1RfSEFTX05PX0ZJRUxEUzogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIlN0cnVjdCBoYXMgbm8gZmllbGRzIjsKKyAgICBjYXNlIERCVVNfSU5WQUxJRF9BTElHTk1FTlRfUEFERElOR19OT1RfTlVMOiAgICAgICAgICAgICAgICAgICByZXR1cm4gIkFsaWdubWVudCBwYWRkaW5nIG5vdCBudWxsIjsKKyAgICBjYXNlIERCVVNfSU5WQUxJRF9CT09MRUFOX05PVF9aRVJPX09SX09ORTogICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkJvb2xlYW4gaXMgbm90IHplcm8gb3Igb25lIjsKKyAgICBjYXNlIERCVVNfSU5WQUxJRF9OT1RfRU5PVUdIX0RBVEE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIk5vdCBlbm91Z2ggZGF0YSI7CisgICAgY2FzZSBEQlVTX0lOVkFMSURfVE9PX01VQ0hfREFUQTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJUb28gbXVjaCBkYXRhIjsKKyAgICBjYXNlIERCVVNfSU5WQUxJRF9CQURfQllURV9PUkRFUjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkJhZCBieXRlIG9yZGVyIjsKKyAgICBjYXNlIERCVVNfSU5WQUxJRF9CQURfUFJPVE9DT0xfVkVSU0lPTjogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkJhZCBwcm90b2NvbCB2ZXJzaW9uIjsKKyAgICBjYXNlIERCVVNfSU5WQUxJRF9CQURfTUVTU0FHRV9UWVBFOiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkJhZCBtZXNzYWdlIHR5cGUiOworICAgIGNhc2UgREJVU19JTlZBTElEX0JBRF9TRVJJQUw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiQmFkIHNlcmlhbCI7CisgICAgY2FzZSBEQlVTX0lOVkFMSURfSU5TQU5FX0ZJRUxEU19BUlJBWV9MRU5HVEg6ICAgICAgICAgICAgICAgICAgcmV0dXJuICJJbnNhbmUgZmllbGRzIGFycmF5IGxlbmd0aCI7CisgICAgY2FzZSBEQlVTX0lOVkFMSURfSU5TQU5FX0JPRFlfTEVOR1RIOiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJJbnNhbmUgYm9keSBsZW5ndGgiOworICAgIGNhc2UgREJVU19JTlZBTElEX01FU1NBR0VfVE9PX0xPTkc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiTWVzc2FnZSB0b28gbG9uZyI7CisgICAgY2FzZSBEQlVTX0lOVkFMSURfSEVBREVSX0ZJRUxEX0NPREU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJIZWFkZXIgZmllbGQgY29kZSI7CisgICAgY2FzZSBEQlVTX0lOVkFMSURfSEVBREVSX0ZJRUxEX0hBU19XUk9OR19UWVBFOiAgICAgICAgICAgICAgICAgcmV0dXJuICJIZWFkZXIgZmllbGQgaGFzIHdyb25nIHR5cGUiOworICAgIGNhc2UgREJVU19JTlZBTElEX1VTRVNfTE9DQUxfSU5URVJGQUNFOiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiVXNlcyBsb2NhbCBpbnRlcmZhY2UiOworICAgIGNhc2UgREJVU19JTlZBTElEX1VTRVNfTE9DQUxfUEFUSDogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiVXNlcyBsb2NhbCBwYXRoIjsKKyAgICBjYXNlIERCVVNfSU5WQUxJRF9IRUFERVJfRklFTERfQVBQRUFSU19UV0lDRTogICAgICAgICAgICAgICAgICByZXR1cm4gIkhlYWRlciBmaWVsZCBhcHBlYXJzIHR3aWNlIjsKKyAgICBjYXNlIERCVVNfSU5WQUxJRF9CQURfREVTVElOQVRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkJhZCBkZXN0aW5hdGlvbiI7CisgICAgY2FzZSBEQlVTX0lOVkFMSURfQkFEX0lOVEVSRkFDRTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJCYWQgaW50ZXJmYWNlIjsKKyAgICBjYXNlIERCVVNfSU5WQUxJRF9CQURfTUVNQkVSOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkJhZCBtZW1iZXIiOworICAgIGNhc2UgREJVU19JTlZBTElEX0JBRF9FUlJPUl9OQU1FOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiQmFkIGVycm9yIG5hbWUiOworICAgIGNhc2UgREJVU19JTlZBTElEX0JBRF9TRU5ERVI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiQmFkIHNlbmRlciI7CisgICAgY2FzZSBEQlVTX0lOVkFMSURfTUlTU0lOR19QQVRIOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJNaXNzaW5nIHBhdGgiOworICAgIGNhc2UgREJVU19JTlZBTElEX01JU1NJTkdfSU5URVJGQUNFOiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiTWlzc2luZyBpbnRlcmZhY2UiOworICAgIGNhc2UgREJVU19JTlZBTElEX01JU1NJTkdfTUVNQkVSOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiTWlzc2luZyBtZW1iZXIiOworICAgIGNhc2UgREJVU19JTlZBTElEX01JU1NJTkdfRVJST1JfTkFNRTogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiTWlzc2luZyBlcnJvciBuYW1lIjsKKyAgICBjYXNlIERCVVNfSU5WQUxJRF9NSVNTSU5HX1JFUExZX1NFUklBTDogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIk1pc3NpbmcgcmVwbHkgc2VyaWFsIjsKKyAgICBjYXNlIERCVVNfSU5WQUxJRF9MRU5HVEhfT1VUX09GX0JPVU5EUzogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkxlbmd0aCBvdXQgb2YgYm91bmRzIjsKKyAgICBjYXNlIERCVVNfSU5WQUxJRF9BUlJBWV9MRU5HVEhfRVhDRUVEU19NQVhJTVVNOiAgICAgICAgICAgICAgICByZXR1cm4gIkFycmF5IGxlbmd0aCBleGNlZWRzIG1heGltdW0iOworICAgIGNhc2UgREJVU19JTlZBTElEX0JBRF9QQVRIOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiQmFkIHBhdGgiOworICAgIGNhc2UgREJVU19JTlZBTElEX1NJR05BVFVSRV9MRU5HVEhfT1VUX09GX0JPVU5EUzogICAgICAgICAgICAgIHJldHVybiAiU2lnbmF0dXJlIGxlbmd0aCBvdXQgb2YgYm91bmRzIjsKKyAgICBjYXNlIERCVVNfSU5WQUxJRF9CQURfVVRGOF9JTl9TVFJJTkc6ICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkJhZCB1dGY4IGluIHN0cmluZyI7CisgICAgY2FzZSBEQlVTX0lOVkFMSURfQVJSQVlfTEVOR1RIX0lOQ09SUkVDVDogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJBcnJheSBsZW5ndGggaW5jb3JyZWN0IjsKKyAgICBjYXNlIERCVVNfSU5WQUxJRF9WQVJJQU5UX1NJR05BVFVSRV9MRU5HVEhfT1VUX09GX0JPVU5EUzogICAgICByZXR1cm4gIlZhcmlhbnQgc2lnbmF0dXJlIGxlbmd0aCBvdXQgb2YgYm91bmRzIjsKKyAgICBjYXNlIERCVVNfSU5WQUxJRF9WQVJJQU5UX1NJR05BVFVSRV9CQUQ6ICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIlZhcmlhbnQgc2lnbmF0dXJlIGJhZCI7CisgICAgY2FzZSBEQlVTX0lOVkFMSURfVkFSSUFOVF9TSUdOQVRVUkVfRU1QVFk6ICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJWYXJpYW50IHNpZ25hdHVyZSBlbXB0eSI7CisgICAgY2FzZSBEQlVTX0lOVkFMSURfVkFSSUFOVF9TSUdOQVRVUkVfU1BFQ0lGSUVTX01VTFRJUExFX1ZBTFVFUzogcmV0dXJuICJWYXJpYW50IHNpZ25hdHVyZSBzcGVjaWZpZXMgbXVsdGlwbGUgdmFsdWVzIjsKKyAgICBjYXNlIERCVVNfSU5WQUxJRF9WQVJJQU5UX1NJR05BVFVSRV9NSVNTSU5HX05VTDogICAgICAgICAgICAgICByZXR1cm4gIlZhcmlhbnQgc2lnbmF0dXJlIG1pc3NpbmcgbnVsIjsKKyAgICBjYXNlIERCVVNfSU5WQUxJRF9TVFJJTkdfTUlTU0lOR19OVUw6ICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIlN0cmluZyBtaXNzaW5nIG51bCI7CisgICAgY2FzZSBEQlVTX0lOVkFMSURfU0lHTkFUVVJFX01JU1NJTkdfTlVMOiAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJTaWduYXR1cmUgbWlzc2luZyBudWwiOworICAgIGNhc2UgREJVU19JTlZBTElEX0VYQ0VFREVEX01BWElNVU1fRElDVF9FTlRSWV9SRUNVUlNJT046ICAgICAgIHJldHVybiAiRXhjZWVkZWQgbWF4aW11bSBkaWN0IGVudHJ5IHJlY3Vyc2lvbiI7CisgICAgY2FzZSBEQlVTX0lOVkFMSURfRElDVF9FTlRSWV9FTkRFRF9CVVRfTk9UX1NUQVJURUQ6ICAgICAgICAgICAgcmV0dXJuICJEaWN0IGVudHJ5IGVuZGVkIGJ1dCBub3Qgc3RhcnRlZCI7CisgICAgY2FzZSBEQlVTX0lOVkFMSURfRElDVF9FTlRSWV9TVEFSVEVEX0JVVF9OT1RfRU5ERUQ6ICAgICAgICAgICAgcmV0dXJuICJEaWN0IGVudHJ5IHN0YXJ0ZWQgYnV0IG5vdCBlbmRlZCI7CisgICAgY2FzZSBEQlVTX0lOVkFMSURfRElDVF9FTlRSWV9IQVNfTk9fRklFTERTOiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJEaWN0IGVudHJ5IGhhcyBubyBmaWVsZHMiOworICAgIGNhc2UgREJVU19JTlZBTElEX0RJQ1RfRU5UUllfSEFTX09OTFlfT05FX0ZJRUxEOiAgICAgICAgICAgICAgIHJldHVybiAiRGljdCBlbnRyeSBoYXMgb25seSBvbmUgZmllbGQiOworICAgIGNhc2UgREJVU19JTlZBTElEX0RJQ1RfRU5UUllfSEFTX1RPT19NQU5ZX0ZJRUxEUzogICAgICAgICAgICAgIHJldHVybiAiRGljdCBlbnRyeSBoYXMgdG9vIG1hbnkgZmllbGRzIjsKKyAgICBjYXNlIERCVVNfSU5WQUxJRF9ESUNUX0VOVFJZX05PVF9JTlNJREVfQVJSQVk6ICAgICAgICAgICAgICAgICByZXR1cm4gIkRpY3QgZW50cnkgbm90IGluc2lkZSBhcnJheSI7CisgICAgY2FzZSBEQlVTX0lOVkFMSURfRElDVF9LRVlfTVVTVF9CRV9CQVNJQ19UWVBFOiAgICAgICAgICAgICAgICAgcmV0dXJuICJEaWN0IGtleSBtdXN0IGJlIGJhc2ljIHR5cGUiOworICAgIGNhc2UgREJVU19JTlZBTElEX01JU1NJTkdfVU5JWF9GRFM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiVW5peCBmaWxlIGRlc2NyaXB0b3IgbWlzc2luZyI7CisgICAgY2FzZSBEQlVTX0lOVkFMSURfTkVTVEVEX1RPT19ERUVQTFk6ICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJWYXJpYW50cyBjYW5ub3QgYmUgdXNlZCB0byBjcmVhdGUgYSBodWdlbHkgcmVjdXJzaXZlIHRyZWUgb2YgdmFsdWVzIjsKKyAgICBjYXNlIERCVVNfVkFMSURJVFlfTEFTVDoKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuICJJbnZhbGlkIjsKKyAgICB9Cit9CisKKy8qKgorICogQ2hlY2tzIHRoYXQgdGhlIGdpdmVuIHJhbmdlIG9mIHRoZSBzdHJpbmcgaXMgYSB2YWxpZCBpbnRlcmZhY2UgbmFtZQorICogaW4gdGhlIEQtQnVzIHByb3RvY29sLiBUaGlzIGluY2x1ZGVzIGEgbGVuZ3RoIHJlc3RyaWN0aW9uIGFuZCBhbgorICogQVNDSUkgc3Vic2V0LCBzZWUgdGhlIHNwZWNpZmljYXRpb24uCisgKgorICogQHRvZG8gdGhpcyBpcyBpbmNvbnNpc3RlbnQgd2l0aCBtb3N0IG9mIERCdXNTdHJpbmcgaW4gdGhhdAorICogaXQgYWxsb3dzIGEgc3RhcnQsbGVuIHJhbmdlIHRoYXQgZXh0ZW5kcyBwYXN0IHRoZSBzdHJpbmcgZW5kLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZworICogQHBhcmFtIHN0YXJ0IGZpcnN0IGJ5dGUgaW5kZXggdG8gY2hlY2sKKyAqIEBwYXJhbSBsZW4gbnVtYmVyIG9mIGJ5dGVzIHRvIGNoZWNrCisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGUgYnl0ZSByYW5nZSBleGlzdHMgYW5kIGlzIGEgdmFsaWQgbmFtZQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfdmFsaWRhdGVfaW50ZXJmYWNlIChjb25zdCBEQnVzU3RyaW5nICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBsZW4pCit7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnM7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmVuZDsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqaWZhY2U7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmxhc3RfZG90OworCisgIF9kYnVzX2Fzc2VydCAoc3RhcnQgPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAobGVuID49IDApOworICBfZGJ1c19hc3NlcnQgKHN0YXJ0IDw9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChzdHIpKTsKKworICBpZiAobGVuID4gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHN0cikgLSBzdGFydCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKGxlbiA+IERCVVNfTUFYSU1VTV9OQU1FX0xFTkdUSCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKGxlbiA9PSAwKQorICAgIHJldHVybiBGQUxTRTsKKworICBsYXN0X2RvdCA9IE5VTEw7CisgIGlmYWNlID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF91ZGF0YSAoc3RyKSArIHN0YXJ0OworICBlbmQgPSBpZmFjZSArIGxlbjsKKyAgcyA9IGlmYWNlOworCisgIC8qIGNoZWNrIHNwZWNpYWwgY2FzZXMgb2YgZmlyc3QgY2hhciBzbyBpdCBkb2Vzbid0IGhhdmUgdG8gYmUgZG9uZQorICAgKiBpbiB0aGUgbG9vcC4gTm90ZSB3ZSBrbm93IGxlbiA+IDAKKyAgICovCisgIGlmIChfREJVU19VTkxJS0VMWSAoKnMgPT0gJy4nKSkgLyogZGlzYWxsb3cgc3RhcnRpbmcgd2l0aCBhIC4gKi8KKyAgICByZXR1cm4gRkFMU0U7CisgIGVsc2UgaWYgKF9EQlVTX1VOTElLRUxZICghVkFMSURfSU5JVElBTF9OQU1FX0NIQVJBQ1RFUiAoKnMpKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIGVsc2UKKyAgICArK3M7CisKKyAgd2hpbGUgKHMgIT0gZW5kKQorICAgIHsKKyAgICAgIGlmICgqcyA9PSAnLicpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoX0RCVVNfVU5MSUtFTFkgKChzICsgMSkgPT0gZW5kKSkKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICBlbHNlIGlmIChfREJVU19VTkxJS0VMWSAoIVZBTElEX0lOSVRJQUxfTkFNRV9DSEFSQUNURVIgKCoocyArIDEpKSkpCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgbGFzdF9kb3QgPSBzOworICAgICAgICAgICsrczsgLyogd2UganVzdCB2YWxpZGF0ZWQgdGhlIG5leHQgY2hhciwgc28gc2tpcCB0d28gKi8KKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoX0RCVVNfVU5MSUtFTFkgKCFWQUxJRF9OQU1FX0NIQVJBQ1RFUiAoKnMpKSkKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICArK3M7CisgICAgfQorCisgIGlmIChfREJVU19VTkxJS0VMWSAobGFzdF9kb3QgPT0gTlVMTCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIENoZWNrcyB0aGF0IHRoZSBnaXZlbiByYW5nZSBvZiB0aGUgc3RyaW5nIGlzIGEgdmFsaWQgbWVtYmVyIG5hbWUKKyAqIGluIHRoZSBELUJ1cyBwcm90b2NvbC4gVGhpcyBpbmNsdWRlcyBhIGxlbmd0aCByZXN0cmljdGlvbiwgZXRjLiwKKyAqIHNlZSB0aGUgc3BlY2lmaWNhdGlvbi4KKyAqCisgKiBAdG9kbyB0aGlzIGlzIGluY29uc2lzdGVudCB3aXRoIG1vc3Qgb2YgREJ1c1N0cmluZyBpbiB0aGF0CisgKiBpdCBhbGxvd3MgYSBzdGFydCxsZW4gcmFuZ2UgdGhhdCBleHRlbmRzIHBhc3QgdGhlIHN0cmluZyBlbmQuCisgKgorICogQHBhcmFtIHN0ciB0aGUgc3RyaW5nCisgKiBAcGFyYW0gc3RhcnQgZmlyc3QgYnl0ZSBpbmRleCB0byBjaGVjaworICogQHBhcmFtIGxlbiBudW1iZXIgb2YgYnl0ZXMgdG8gY2hlY2sKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSBieXRlIHJhbmdlIGV4aXN0cyBhbmQgaXMgYSB2YWxpZCBuYW1lCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c192YWxpZGF0ZV9tZW1iZXIgKGNvbnN0IERCdXNTdHJpbmcgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGxlbikKK3sKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqczsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqZW5kOworICBjb25zdCB1bnNpZ25lZCBjaGFyICptZW1iZXI7CisKKyAgX2RidXNfYXNzZXJ0IChzdGFydCA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChsZW4gPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAoc3RhcnQgPD0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHN0cikpOworCisgIGlmIChsZW4gPiBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoc3RyKSAtIHN0YXJ0KQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAobGVuID4gREJVU19NQVhJTVVNX05BTUVfTEVOR1RIKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAobGVuID09IDApCisgICAgcmV0dXJuIEZBTFNFOworCisgIG1lbWJlciA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfdWRhdGEgKHN0cikgKyBzdGFydDsKKyAgZW5kID0gbWVtYmVyICsgbGVuOworICBzID0gbWVtYmVyOworCisgIC8qIGNoZWNrIHNwZWNpYWwgY2FzZXMgb2YgZmlyc3QgY2hhciBzbyBpdCBkb2Vzbid0IGhhdmUgdG8gYmUgZG9uZQorICAgKiBpbiB0aGUgbG9vcC4gTm90ZSB3ZSBrbm93IGxlbiA+IDAKKyAgICovCisKKyAgaWYgKF9EQlVTX1VOTElLRUxZICghVkFMSURfSU5JVElBTF9OQU1FX0NIQVJBQ1RFUiAoKnMpKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIGVsc2UKKyAgICArK3M7CisKKyAgd2hpbGUgKHMgIT0gZW5kKQorICAgIHsKKyAgICAgIGlmIChfREJVU19VTkxJS0VMWSAoIVZBTElEX05BTUVfQ0hBUkFDVEVSICgqcykpKQorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgICsrczsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogQ2hlY2tzIHRoYXQgdGhlIGdpdmVuIHJhbmdlIG9mIHRoZSBzdHJpbmcgaXMgYSB2YWxpZCBlcnJvciBuYW1lCisgKiBpbiB0aGUgRC1CdXMgcHJvdG9jb2wuIFRoaXMgaW5jbHVkZXMgYSBsZW5ndGggcmVzdHJpY3Rpb24sIGV0Yy4sCisgKiBzZWUgdGhlIHNwZWNpZmljYXRpb24uCisgKgorICogQHRvZG8gdGhpcyBpcyBpbmNvbnNpc3RlbnQgd2l0aCBtb3N0IG9mIERCdXNTdHJpbmcgaW4gdGhhdAorICogaXQgYWxsb3dzIGEgc3RhcnQsbGVuIHJhbmdlIHRoYXQgZXh0ZW5kcyBwYXN0IHRoZSBzdHJpbmcgZW5kLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZworICogQHBhcmFtIHN0YXJ0IGZpcnN0IGJ5dGUgaW5kZXggdG8gY2hlY2sKKyAqIEBwYXJhbSBsZW4gbnVtYmVyIG9mIGJ5dGVzIHRvIGNoZWNrCisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGUgYnl0ZSByYW5nZSBleGlzdHMgYW5kIGlzIGEgdmFsaWQgbmFtZQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfdmFsaWRhdGVfZXJyb3JfbmFtZSAoY29uc3QgREJ1c1N0cmluZyAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBsZW4pCit7CisgIC8qIFNhbWUgcmVzdHJpY3Rpb25zIGFzIGludGVyZmFjZSBuYW1lIGF0IHRoZSBtb21lbnQgKi8KKyAgcmV0dXJuIF9kYnVzX3ZhbGlkYXRlX2ludGVyZmFjZSAoc3RyLCBzdGFydCwgbGVuKTsKK30KKworLyoqCisgKiBEZXRlcm1pbmUgd2V0aGVyIHRoZSBnaXZlbiBjaGFyYWN0ZXIgaXMgdmFsaWQgYXMgdGhlIGZpcnN0IGNoYXJhY3RlcgorICogaW4gYSBidXMgbmFtZS4KKyAqLworI2RlZmluZSBWQUxJRF9JTklUSUFMX0JVU19OQU1FX0NIQVJBQ1RFUihjKSAgICAgICAgIFwKKyAgKCAoKGMpID49ICdBJyAmJiAoYykgPD0gJ1onKSB8fCAgICAgICAgICAgICAgIFwKKyAgICAoKGMpID49ICdhJyAmJiAoYykgPD0gJ3onKSB8fCAgICAgICAgICAgICAgIFwKKyAgICAoKGMpID09ICdfJykgfHwgKChjKSA9PSAnLScpKQorCisvKioKKyAqIERldGVybWluZSB3ZXRoZXIgdGhlIGdpdmVuIGNoYXJhY3RlciBpcyB2YWxpZCBhcyBhIHNlY29uZCBvciBsYXRlcgorICogY2hhcmFjdGVyIGluIGEgYnVzIG5hbWUKKyAqLworI2RlZmluZSBWQUxJRF9CVVNfTkFNRV9DSEFSQUNURVIoYykgICAgICAgICAgICAgICAgIFwKKyAgKCAoKGMpID49ICcwJyAmJiAoYykgPD0gJzknKSB8fCAgICAgICAgICAgICAgIFwKKyAgICAoKGMpID49ICdBJyAmJiAoYykgPD0gJ1onKSB8fCAgICAgICAgICAgICAgIFwKKyAgICAoKGMpID49ICdhJyAmJiAoYykgPD0gJ3onKSB8fCAgICAgICAgICAgICAgIFwKKyAgICAoKGMpID09ICdfJykgfHwgKChjKSA9PSAnLScpKQorCitzdGF0aWMgZGJ1c19ib29sX3QKK19kYnVzX3ZhbGlkYXRlX2J1c19uYW1lX2Z1bGwgKGNvbnN0IERCdXNTdHJpbmcgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgIGlzX25hbWVzcGFjZSkKK3sKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqczsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqZW5kOworICBjb25zdCB1bnNpZ25lZCBjaGFyICppZmFjZTsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqbGFzdF9kb3Q7CisKKyAgX2RidXNfYXNzZXJ0IChzdGFydCA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChsZW4gPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAoc3RhcnQgPD0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHN0cikpOworCisgIGlmIChsZW4gPiBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoc3RyKSAtIHN0YXJ0KQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAobGVuID4gREJVU19NQVhJTVVNX05BTUVfTEVOR1RIKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAobGVuID09IDApCisgICAgcmV0dXJuIEZBTFNFOworCisgIGxhc3RfZG90ID0gTlVMTDsKKyAgaWZhY2UgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X3VkYXRhIChzdHIpICsgc3RhcnQ7CisgIGVuZCA9IGlmYWNlICsgbGVuOworICBzID0gaWZhY2U7CisKKyAgLyogY2hlY2sgc3BlY2lhbCBjYXNlcyBvZiBmaXJzdCBjaGFyIHNvIGl0IGRvZXNuJ3QgaGF2ZSB0byBiZSBkb25lCisgICAqIGluIHRoZSBsb29wLiBOb3RlIHdlIGtub3cgbGVuID4gMAorICAgKi8KKyAgaWYgKCpzID09ICc6JykKKyAgeworICAgIC8qIHVuaXF1ZSBuYW1lICovCisgICAgKytzOworICAgIHdoaWxlIChzICE9IGVuZCkKKyAgICAgIHsKKyAgICAgICAgaWYgKCpzID09ICcuJykKKyAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoX0RCVVNfVU5MSUtFTFkgKChzICsgMSkgPT0gZW5kKSkKKyAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgaWYgKF9EQlVTX1VOTElLRUxZICghVkFMSURfQlVTX05BTUVfQ0hBUkFDVEVSICgqKHMgKyAxKSkpKQorICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICArK3M7IC8qIHdlIGp1c3QgdmFsaWRhdGVkIHRoZSBuZXh0IGNoYXIsIHNvIHNraXAgdHdvICovCisgICAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChfREJVU19VTkxJS0VMWSAoIVZBTElEX0JVU19OQU1FX0NIQVJBQ1RFUiAoKnMpKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgfQorCisgICAgICAgICsrczsKKyAgICAgIH0KKworICAgIHJldHVybiBUUlVFOworICB9CisgIGVsc2UgaWYgKF9EQlVTX1VOTElLRUxZICgqcyA9PSAnLicpKSAvKiBkaXNhbGxvdyBzdGFydGluZyB3aXRoIGEgLiAqLworICAgIHJldHVybiBGQUxTRTsKKyAgZWxzZSBpZiAoX0RCVVNfVU5MSUtFTFkgKCFWQUxJRF9JTklUSUFMX0JVU19OQU1FX0NIQVJBQ1RFUiAoKnMpKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIGVsc2UKKyAgICArK3M7CisKKyAgd2hpbGUgKHMgIT0gZW5kKQorICAgIHsKKyAgICAgIGlmICgqcyA9PSAnLicpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoX0RCVVNfVU5MSUtFTFkgKChzICsgMSkgPT0gZW5kKSkKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICBlbHNlIGlmIChfREJVU19VTkxJS0VMWSAoIVZBTElEX0lOSVRJQUxfQlVTX05BTUVfQ0hBUkFDVEVSICgqKHMgKyAxKSkpKQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgIGxhc3RfZG90ID0gczsKKyAgICAgICAgICArK3M7IC8qIHdlIGp1c3QgdmFsaWRhdGVkIHRoZSBuZXh0IGNoYXIsIHNvIHNraXAgdHdvICovCisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKF9EQlVTX1VOTElLRUxZICghVkFMSURfQlVTX05BTUVfQ0hBUkFDVEVSICgqcykpKQorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgICsrczsKKyAgICB9CisKKyAgaWYgKCFpc19uYW1lc3BhY2UgJiYgX0RCVVNfVU5MSUtFTFkgKGxhc3RfZG90ID09IE5VTEwpKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBDaGVja3MgdGhhdCB0aGUgZ2l2ZW4gcmFuZ2Ugb2YgdGhlIHN0cmluZyBpcyBhIHZhbGlkIGJ1cyBuYW1lIGluCisgKiB0aGUgRC1CdXMgcHJvdG9jb2wuIFRoaXMgaW5jbHVkZXMgYSBsZW5ndGggcmVzdHJpY3Rpb24sIGV0Yy4sIHNlZQorICogdGhlIHNwZWNpZmljYXRpb24uCisgKgorICogQHRvZG8gdGhpcyBpcyBpbmNvbnNpc3RlbnQgd2l0aCBtb3N0IG9mIERCdXNTdHJpbmcgaW4gdGhhdAorICogaXQgYWxsb3dzIGEgc3RhcnQsbGVuIHJhbmdlIHRoYXQgZXh0ZW5kcyBwYXN0IHRoZSBzdHJpbmcgZW5kLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZworICogQHBhcmFtIHN0YXJ0IGZpcnN0IGJ5dGUgaW5kZXggdG8gY2hlY2sKKyAqIEBwYXJhbSBsZW4gbnVtYmVyIG9mIGJ5dGVzIHRvIGNoZWNrCisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGUgYnl0ZSByYW5nZSBleGlzdHMgYW5kIGlzIGEgdmFsaWQgbmFtZQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfdmFsaWRhdGVfYnVzX25hbWUgKGNvbnN0IERCdXNTdHJpbmcgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBsZW4pCit7CisgIHJldHVybiBfZGJ1c192YWxpZGF0ZV9idXNfbmFtZV9mdWxsIChzdHIsIHN0YXJ0LCBsZW4sIEZBTFNFKTsKK30KKworLyoqCisgKiBDaGVja3MgdGhhdCB0aGUgZ2l2ZW4gcmFuZ2Ugb2YgdGhlIHN0cmluZyBpcyBhIHByZWZpeCBvZiBhIHZhbGlkIGJ1cyBuYW1lIGluCisgKiB0aGUgRC1CdXMgcHJvdG9jb2wuIFVubGlrZSBfZGJ1c192YWxpZGF0ZV9idXNfbmFtZSgpLCB0aGlzIGFjY2VwdHMgc3RyaW5ncworICogd2l0aCBvbmx5IG9uZSBwZXJpb2Qtc2VwYXJhdGVkIGNvbXBvbmVudC4KKyAqCisgKiBAdG9kbyB0aGlzIGlzIGluY29uc2lzdGVudCB3aXRoIG1vc3Qgb2YgREJ1c1N0cmluZyBpbiB0aGF0CisgKiBpdCBhbGxvd3MgYSBzdGFydCxsZW4gcmFuZ2UgdGhhdCBleHRlbmRzIHBhc3QgdGhlIHN0cmluZyBlbmQuCisgKgorICogQHBhcmFtIHN0ciB0aGUgc3RyaW5nCisgKiBAcGFyYW0gc3RhcnQgZmlyc3QgYnl0ZSBpbmRleCB0byBjaGVjaworICogQHBhcmFtIGxlbiBudW1iZXIgb2YgYnl0ZXMgdG8gY2hlY2sKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSBieXRlIHJhbmdlIGV4aXN0cyBhbmQgaXMgYSB2YWxpZCBuYW1lCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c192YWxpZGF0ZV9idXNfbmFtZXNwYWNlIChjb25zdCBEQnVzU3RyaW5nICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGxlbikKK3sKKyAgcmV0dXJuIF9kYnVzX3ZhbGlkYXRlX2J1c19uYW1lX2Z1bGwgKHN0ciwgc3RhcnQsIGxlbiwgVFJVRSk7Cit9CisKKy8qKiBkZWZpbmUgX2RidXNfY2hlY2tfaXNfdmFsaWRfcGF0aCgpICovCitERUZJTkVfREJVU19OQU1FX0NIRUNLKHBhdGgpCisvKiogZGVmaW5lIF9kYnVzX2NoZWNrX2lzX3ZhbGlkX2ludGVyZmFjZSgpICovCitERUZJTkVfREJVU19OQU1FX0NIRUNLKGludGVyZmFjZSkKKy8qKiBkZWZpbmUgX2RidXNfY2hlY2tfaXNfdmFsaWRfbWVtYmVyKCkgKi8KK0RFRklORV9EQlVTX05BTUVfQ0hFQ0sobWVtYmVyKQorLyoqIGRlZmluZSBfZGJ1c19jaGVja19pc192YWxpZF9lcnJvcl9uYW1lKCkgKi8KK0RFRklORV9EQlVTX05BTUVfQ0hFQ0soZXJyb3JfbmFtZSkKKy8qKiBkZWZpbmUgX2RidXNfY2hlY2tfaXNfdmFsaWRfYnVzX25hbWUoKSAqLworREVGSU5FX0RCVVNfTkFNRV9DSEVDSyhidXNfbmFtZSkKKy8qKiBkZWZpbmUgX2RidXNfY2hlY2tfaXNfdmFsaWRfdXRmOCgpICovCitERUZJTkVfREJVU19OQU1FX0NIRUNLKHV0ZjgpCisKKy8qKiBAfSAqLworCisvKiB0ZXN0cyBpbiBkYnVzLW1hcnNoYWwtdmFsaWRhdGUtdXRpbC5jICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtbWFyc2hhbC12YWxpZGF0ZS5oIGIvZGJ1cy9kYnVzLW1hcnNoYWwtdmFsaWRhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjhlNTY3Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLW1hcnNoYWwtdmFsaWRhdGUuaApAQCAtMCwwICsxLDIwOSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLW1hcnNoYWwtdmFsaWRhdGUuaCAgVmFsaWRhdGlvbiByb3V0aW5lcyBmb3IgbWFyc2hhbGVkIGRhdGEKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgIFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpZm5kZWYgREJVU19NQVJTSEFMX1ZBTElEQVRFX0gKKyNkZWZpbmUgREJVU19NQVJTSEFMX1ZBTElEQVRFX0gKKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzTWFyc2hhbAorICoKKyAqIEB7CisgKi8KKworLyoqCisgKiBUaGlzIGlzIHVzZWQgcmF0aGVyIHRoYW4gYSBib29sIGZvciBoaWdoIHZpc2liaWxpdHkKKyAqLwordHlwZWRlZiBlbnVtCit7CisgIERCVVNfVkFMSURBVElPTl9NT0RFX1dFX1RSVVNUX1RISVNfREFUQV9BQlNPTFVURUxZLAorICBEQlVTX1ZBTElEQVRJT05fTU9ERV9EQVRBX0lTX1VOVFJVU1RFRAorfSBEQnVzVmFsaWRhdGlvbk1vZGU7CisKKy8qKgorICogVGhpcyBpcyBwcmltYXJpbHkgdXNlZCBpbiB1bml0IHRlc3RpbmcsIHNvIHdlIGNhbiB2ZXJpZnkgdGhhdCBlYWNoCisgKiBpbnZhbGlkIG1lc3NhZ2UgaXMgaW52YWxpZCBmb3IgdGhlIGV4cGVjdGVkIHJlYXNvbnMuIFRodXMgd2UgcmVhbGx5CisgKiB3YW50IGEgZGlzdGluY3QgZW51bSB2YWx1ZSBmb3IgZXZlcnkgY29kZXBhdGggbGVhdmluZyB0aGUgdmFsaWRhdG9yCisgKiBmdW5jdGlvbnMuIEVudW0gdmFsdWVzIGFyZSBzcGVjaWZpZWQgbWFudWFsbHkgZm9yIGVhc2Ugb2YgZGVidWdnaW5nCisgKiAoc28geW91IGNhbiBzZWUgdGhlIGVudW0gdmFsdWUgZ2l2ZW4gYSBwcmludGYpCisgKi8KK3R5cGVkZWYgZW51bQoreworI2RlZmluZSBfREJVU19ORUdBVElWRV9WQUxJRElUWV9DT1VOVCA0CisgIERCVVNfVkFMSURJVFlfVU5LTk9XTl9PT01fRVJST1IgPSAtNCwgLyoqPCBjYW4ndCBkZXRlcm1pbmUgdmFsaWRpdHkgZHVlIHRvIE9PTSAqLworICBEQlVTX0lOVkFMSURfRk9SX1VOS05PV05fUkVBU09OID0gLTMsCisgIERCVVNfVkFMSURfQlVUX0lOQ09NUExFVEUgPSAtMiwKKyAgREJVU19WQUxJRElUWV9VTktOT1dOID0gLTEsCisgIERCVVNfVkFMSUQgPSAwLCAvKio8IHRoZSBkYXRhIGlzIHZhbGlkICovCisgIERCVVNfSU5WQUxJRF9VTktOT1dOX1RZUEVDT0RFID0gMSwKKyAgREJVU19JTlZBTElEX01JU1NJTkdfQVJSQVlfRUxFTUVOVF9UWVBFID0gMiwKKyAgREJVU19JTlZBTElEX1NJR05BVFVSRV9UT09fTE9ORyA9IDMsIC8qIHRoaXMgb25lIGlzIGltcG9zc2libGUgcmlnaHQgbm93IHNpbmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB5b3UgY2FuJ3QgcHV0IGEgdG9vLWxvbmcgdmFsdWUgaW4gYSBieXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgREJVU19JTlZBTElEX0VYQ0VFREVEX01BWElNVU1fQVJSQVlfUkVDVVJTSU9OID0gNCwKKyAgREJVU19JTlZBTElEX0VYQ0VFREVEX01BWElNVU1fU1RSVUNUX1JFQ1VSU0lPTiA9IDUsCisgIERCVVNfSU5WQUxJRF9TVFJVQ1RfRU5ERURfQlVUX05PVF9TVEFSVEVEID0gNiwKKyAgREJVU19JTlZBTElEX1NUUlVDVF9TVEFSVEVEX0JVVF9OT1RfRU5ERUQgPSA3LAorICBEQlVTX0lOVkFMSURfU1RSVUNUX0hBU19OT19GSUVMRFMgPSA4LAorICBEQlVTX0lOVkFMSURfQUxJR05NRU5UX1BBRERJTkdfTk9UX05VTCA9IDksCisgIERCVVNfSU5WQUxJRF9CT09MRUFOX05PVF9aRVJPX09SX09ORSA9IDEwLAorICBEQlVTX0lOVkFMSURfTk9UX0VOT1VHSF9EQVRBID0gMTEsCisgIERCVVNfSU5WQUxJRF9UT09fTVVDSF9EQVRBID0gMTIsIC8qKjwgdHJhaWxpbmcganVuayBtYWtlcyBpdCBpbnZhbGlkICovCisgIERCVVNfSU5WQUxJRF9CQURfQllURV9PUkRFUiA9IDEzLAorICBEQlVTX0lOVkFMSURfQkFEX1BST1RPQ09MX1ZFUlNJT04gPSAxNCwKKyAgREJVU19JTlZBTElEX0JBRF9NRVNTQUdFX1RZUEUgPSAxNSwKKyAgREJVU19JTlZBTElEX0JBRF9TRVJJQUwgPSAxNiwKKyAgREJVU19JTlZBTElEX0lOU0FORV9GSUVMRFNfQVJSQVlfTEVOR1RIID0gMTcsCisgIERCVVNfSU5WQUxJRF9JTlNBTkVfQk9EWV9MRU5HVEggPSAxOCwKKyAgREJVU19JTlZBTElEX01FU1NBR0VfVE9PX0xPTkcgPSAxOSwKKyAgREJVU19JTlZBTElEX0hFQURFUl9GSUVMRF9DT0RFID0gMjAsCisgIERCVVNfSU5WQUxJRF9IRUFERVJfRklFTERfSEFTX1dST05HX1RZUEUgPSAyMSwKKyAgREJVU19JTlZBTElEX1VTRVNfTE9DQUxfSU5URVJGQUNFID0gMjIsCisgIERCVVNfSU5WQUxJRF9VU0VTX0xPQ0FMX1BBVEggPSAyMywKKyAgREJVU19JTlZBTElEX0hFQURFUl9GSUVMRF9BUFBFQVJTX1RXSUNFID0gMjQsCisgIERCVVNfSU5WQUxJRF9CQURfREVTVElOQVRJT04gPSAyNSwKKyAgREJVU19JTlZBTElEX0JBRF9JTlRFUkZBQ0UgPSAyNiwKKyAgREJVU19JTlZBTElEX0JBRF9NRU1CRVIgPSAyNywKKyAgREJVU19JTlZBTElEX0JBRF9FUlJPUl9OQU1FID0gMjgsCisgIERCVVNfSU5WQUxJRF9CQURfU0VOREVSID0gMjksCisgIERCVVNfSU5WQUxJRF9NSVNTSU5HX1BBVEggPSAzMCwKKyAgREJVU19JTlZBTElEX01JU1NJTkdfSU5URVJGQUNFID0gMzEsCisgIERCVVNfSU5WQUxJRF9NSVNTSU5HX01FTUJFUiA9IDMyLAorICBEQlVTX0lOVkFMSURfTUlTU0lOR19FUlJPUl9OQU1FID0gMzMsCisgIERCVVNfSU5WQUxJRF9NSVNTSU5HX1JFUExZX1NFUklBTCA9IDM0LAorICBEQlVTX0lOVkFMSURfTEVOR1RIX09VVF9PRl9CT1VORFMgPSAzNSwKKyAgREJVU19JTlZBTElEX0FSUkFZX0xFTkdUSF9FWENFRURTX01BWElNVU0gPSAzNiwKKyAgREJVU19JTlZBTElEX0JBRF9QQVRIID0gMzcsCisgIERCVVNfSU5WQUxJRF9TSUdOQVRVUkVfTEVOR1RIX09VVF9PRl9CT1VORFMgPSAzOCwKKyAgREJVU19JTlZBTElEX0JBRF9VVEY4X0lOX1NUUklORyA9IDM5LAorICBEQlVTX0lOVkFMSURfQVJSQVlfTEVOR1RIX0lOQ09SUkVDVCA9IDQwLAorICBEQlVTX0lOVkFMSURfVkFSSUFOVF9TSUdOQVRVUkVfTEVOR1RIX09VVF9PRl9CT1VORFMgPSA0MSwKKyAgREJVU19JTlZBTElEX1ZBUklBTlRfU0lHTkFUVVJFX0JBRCA9IDQyLAorICBEQlVTX0lOVkFMSURfVkFSSUFOVF9TSUdOQVRVUkVfRU1QVFkgPSA0MywKKyAgREJVU19JTlZBTElEX1ZBUklBTlRfU0lHTkFUVVJFX1NQRUNJRklFU19NVUxUSVBMRV9WQUxVRVMgPSA0NCwKKyAgREJVU19JTlZBTElEX1ZBUklBTlRfU0lHTkFUVVJFX01JU1NJTkdfTlVMID0gNDUsCisgIERCVVNfSU5WQUxJRF9TVFJJTkdfTUlTU0lOR19OVUwgPSA0NiwKKyAgREJVU19JTlZBTElEX1NJR05BVFVSRV9NSVNTSU5HX05VTCA9IDQ3LAorICBEQlVTX0lOVkFMSURfRVhDRUVERURfTUFYSU1VTV9ESUNUX0VOVFJZX1JFQ1VSU0lPTiA9IDQ4LAorICBEQlVTX0lOVkFMSURfRElDVF9FTlRSWV9FTkRFRF9CVVRfTk9UX1NUQVJURUQgPSA0OSwKKyAgREJVU19JTlZBTElEX0RJQ1RfRU5UUllfU1RBUlRFRF9CVVRfTk9UX0VOREVEID0gNTAsCisgIERCVVNfSU5WQUxJRF9ESUNUX0VOVFJZX0hBU19OT19GSUVMRFMgPSA1MSwKKyAgREJVU19JTlZBTElEX0RJQ1RfRU5UUllfSEFTX09OTFlfT05FX0ZJRUxEID0gNTIsCisgIERCVVNfSU5WQUxJRF9ESUNUX0VOVFJZX0hBU19UT09fTUFOWV9GSUVMRFMgPSA1MywKKyAgREJVU19JTlZBTElEX0RJQ1RfRU5UUllfTk9UX0lOU0lERV9BUlJBWSA9IDU0LAorICBEQlVTX0lOVkFMSURfRElDVF9LRVlfTVVTVF9CRV9CQVNJQ19UWVBFID0gNTUsCisgIERCVVNfSU5WQUxJRF9NSVNTSU5HX1VOSVhfRkRTID0gNTYsCisgIERCVVNfSU5WQUxJRF9ORVNURURfVE9PX0RFRVBMWSA9IDU3LAorICBEQlVTX1ZBTElESVRZX0xBU1QKK30gREJ1c1ZhbGlkaXR5OworCitEQlVTX1BSSVZBVEVfRVhQT1JUCitEQnVzVmFsaWRpdHkgX2RidXNfdmFsaWRhdGVfc2lnbmF0dXJlX3dpdGhfcmVhc29uIChjb25zdCBEQnVzU3RyaW5nICp0eXBlX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHR5cGVfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgbGVuKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK0RCdXNWYWxpZGl0eSBfZGJ1c192YWxpZGF0ZV9ib2R5X3dpdGhfcmVhc29uICAgICAgKGNvbnN0IERCdXNTdHJpbmcgKmV4cGVjdGVkX3NpZ25hdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGV4cGVjdGVkX3NpZ25hdHVyZV9zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICpieXRlc19yZW1haW5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICp2YWx1ZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICB2YWx1ZV9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBsZW4pOworCitjb25zdCBjaGFyICpfZGJ1c192YWxpZGl0eV90b19lcnJvcl9tZXNzYWdlIChEQnVzVmFsaWRpdHkgdmFsaWRpdHkpOworCitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCBfZGJ1c192YWxpZGF0ZV9wYXRoICAgICAgIChjb25zdCBEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGxlbik7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCBfZGJ1c192YWxpZGF0ZV9pbnRlcmZhY2UgIChjb25zdCBEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGxlbik7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCBfZGJ1c192YWxpZGF0ZV9tZW1iZXIgICAgIChjb25zdCBEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGxlbik7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCBfZGJ1c192YWxpZGF0ZV9lcnJvcl9uYW1lIChjb25zdCBEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGxlbik7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCBfZGJ1c192YWxpZGF0ZV9idXNfbmFtZSAgIChjb25zdCBEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGxlbik7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCBfZGJ1c192YWxpZGF0ZV9idXNfbmFtZXNwYWNlIChjb25zdCBEQnVzU3RyaW5nICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGxlbik7CisvKiBqdXN0IHRvIGhhdmUgYSBuYW1lIGNvbnNpc3RlbnQgd2l0aCB0aGUgYWJvdmU6ICovCisjZGVmaW5lIF9kYnVzX3ZhbGlkYXRlX3V0ZjgocyxiLGUpIF9kYnVzX3N0cmluZ192YWxpZGF0ZV91dGY4IChzLCBiLCBlKQorCisjaWZkZWYgREJVU19ESVNBQkxFX0NIRUNLUworCisvKiBCZSBzdXJlIHRoZXkgZG9uJ3QgZXhpc3QsIHNpbmNlIHdlIGRvbid0IHdhbnQgdG8gdXNlIHRoZW0gb3V0c2lkZSBvZiBjaGVja3MKKyAqIGFuZCBzbyB3ZSB3YW50IHRoZSBjb21waWxlIGZhaWx1cmUuCisgKi8KKyNkZWZpbmUgREVDTEFSRV9EQlVTX05BTUVfQ0hFQ0sod2hhdCkKKyNkZWZpbmUgREVGSU5FX0RCVVNfTkFNRV9DSEVDSyh3aGF0KQorCisjZWxzZSAvKiAhREJVU19ESVNBQkxFX0NIRUNLUyAqLworCisvKiogQSBuYW1lIGNoZWNrIGlzIHVzZWQgaW4gX2RidXNfcmV0dXJuX2lmX2ZhaWwoKSwgaXQncyBub3Qgc3VpdGFibGUKKyAqIGZvciB2YWxpZGF0aW5nIHVudHJ1c3RlZCBkYXRhLiB1c2UgX2RidXNfdmFsaWRhdGVfd2hhdGV2ZXIgZm9yIHRoYXQuCisgKi8KKyNkZWZpbmUgREVDTEFSRV9EQlVTX05BTUVfQ0hFQ0sod2hhdCkgXAorZGJ1c19ib29sX3QgX2RidXNfY2hlY2tfaXNfdmFsaWRfIyN3aGF0IChjb25zdCBjaGFyICpuYW1lKQorCisvKiogRGVmaW5lIGEgbmFtZSBjaGVjayB0byBiZSB1c2VkIGluIF9kYnVzX3JldHVybl9pZl9mYWlsKCkgc3RhdGVtZW50cy4KKyAqLworI2RlZmluZSBERUZJTkVfREJVU19OQU1FX0NIRUNLKHdoYXQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorZGJ1c19ib29sX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorX2RidXNfY2hlY2tfaXNfdmFsaWRfIyN3aGF0IChjb25zdCBjaGFyICpuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBEQnVzU3RyaW5nIHN0cjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAobmFtZSA9PSBOVUxMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBGQUxTRTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnN0ciwgbmFtZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICByZXR1cm4gX2RidXNfdmFsaWRhdGVfIyN3aGF0ICgmc3RyLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikpOyAgICAgICAgXAorfQorI2VuZGlmIC8qICFEQlVTX0RJU0FCTEVfQ0hFQ0tTICovCisKKy8qKiBkZWZpbmVzIF9kYnVzX2NoZWNrX2lzX3ZhbGlkX3BhdGgoKSAqLworREVDTEFSRV9EQlVTX05BTUVfQ0hFQ0socGF0aCk7CisvKiogZGVmaW5lcyBfZGJ1c19jaGVja19pc192YWxpZF9pbnRlcmZhY2UoKSAqLworREVDTEFSRV9EQlVTX05BTUVfQ0hFQ0soaW50ZXJmYWNlKTsKKy8qKiBkZWZpbmVzIF9kYnVzX2NoZWNrX2lzX3ZhbGlkX21lbWJlcigpICovCitERUNMQVJFX0RCVVNfTkFNRV9DSEVDSyhtZW1iZXIpOworLyoqIGRlZmluZXMgX2RidXNfY2hlY2tfaXNfdmFsaWRfZXJyb3JfbmFtZSgpICovCitERUNMQVJFX0RCVVNfTkFNRV9DSEVDSyhlcnJvcl9uYW1lKTsKKy8qKiBkZWZpbmVzIF9kYnVzX2NoZWNrX2lzX3ZhbGlkX2J1c19uYW1lKCkgKi8KK0RFQ0xBUkVfREJVU19OQU1FX0NIRUNLKGJ1c19uYW1lKTsKKy8qKiBkZWZpbmVzIF9kYnVzX2NoZWNrX2lzX3ZhbGlkX3V0ZjgoKSAqLworREVDTEFSRV9EQlVTX05BTUVfQ0hFQ0sodXRmOCk7CisKKy8qKiBAfSAqLworCisjZW5kaWYgLyogREJVU19NQVJTSEFMX1ZBTElEQVRFX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1tZW1vcnkuYyBiL2RidXMvZGJ1cy1tZW1vcnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWMyZjdhCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLW1lbW9yeS5jCkBAIC0wLDAgKzEsOTYwIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtbWVtb3J5LmMgIEQtQnVzIG1lbW9yeSBoYW5kbGluZworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMyAgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLW1lbW9yeS5oIgorI2luY2x1ZGUgImRidXMtaW50ZXJuYWxzLmgiCisjaW5jbHVkZSAiZGJ1cy1zeXNkZXBzLmgiCisjaW5jbHVkZSAiZGJ1cy1saXN0LmgiCisjaW5jbHVkZSAiZGJ1cy10aHJlYWRzLmgiCisjaW5jbHVkZSA8c3RkbGliLmg+CisKKy8qKgorICogQGRlZmdyb3VwIERCdXNNZW1vcnkgTWVtb3J5IEFsbG9jYXRpb24KKyAqIEBpbmdyb3VwICBEQnVzCisgKiBAYnJpZWYgZGJ1c19tYWxsb2MoKSwgZGJ1c19mcmVlKCksIGV0Yy4KKyAqCisgKiBGdW5jdGlvbnMgYW5kIG1hY3JvcyByZWxhdGVkIHRvIGFsbG9jYXRpbmcgYW5kIHJlbGVhc2luZworICogYmxvY2tzIG9mIG1lbW9yeS4KKyAqCisgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c01lbW9yeUludGVybmFscyBNZW1vcnkgYWxsb2NhdGlvbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzCisgKiBAaW5ncm91cCAgREJ1c0ludGVybmFscworICogQGJyaWVmIGludGVybmFscyBvZiBkYnVzX21hbGxvYygpIGV0Yy4KKyAqCisgKiBJbXBsZW1lbnRhdGlvbiBkZXRhaWxzIHJlbGF0ZWQgdG8gYWxsb2NhdGluZyBhbmQgcmVsZWFzaW5nIGJsb2NrcworICogb2YgbWVtb3J5LgorICovCisKKy8qKgorICogQGFkZHRvZ3JvdXAgREJ1c01lbW9yeQorICoKKyAqIEB7CisgKi8KKworLyoqCisgKiBAZGVmIGRidXNfbmV3CisgKgorICogU2FmZSBtYWNybyBmb3IgdXNpbmcgZGJ1c19tYWxsb2MoKS4gQWNjZXB0cyB0aGUgdHlwZQorICogdG8gYWxsb2NhdGUgYW5kIHRoZSBudW1iZXIgb2YgdHlwZSBpbnN0YW5jZXMgdG8KKyAqIGFsbG9jYXRlIGFzIGFyZ3VtZW50cywgYW5kIHJldHVybnMgYSBtZW1vcnkgYmxvY2sKKyAqIGNhc3QgdG8gdGhlIGRlc2lyZWQgdHlwZSwgaW5zdGVhZCBvZiBhcyBhIHZvaWQqLgorICoKKyAqIEBwYXJhbSB0eXBlIHR5cGUgbmFtZSB0byBhbGxvY2F0ZQorICogQHBhcmFtIGNvdW50IG51bWJlciBvZiBpbnN0YW5jZXMgaW4gdGhlIGFsbG9jYXRlZCBhcnJheQorICogQHJldHVybnMgdGhlIG5ldyBtZW1vcnkgYmxvY2sgb3IgI05VTEwgb24gZmFpbHVyZQorICovCisKKy8qKgorICogQGRlZiBkYnVzX25ldzAKKyAqCisgKiBTYWZlIG1hY3JvIGZvciB1c2luZyBkYnVzX21hbGxvYzAoKS4gQWNjZXB0cyB0aGUgdHlwZQorICogdG8gYWxsb2NhdGUgYW5kIHRoZSBudW1iZXIgb2YgdHlwZSBpbnN0YW5jZXMgdG8KKyAqIGFsbG9jYXRlIGFzIGFyZ3VtZW50cywgYW5kIHJldHVybnMgYSBtZW1vcnkgYmxvY2sKKyAqIGNhc3QgdG8gdGhlIGRlc2lyZWQgdHlwZSwgaW5zdGVhZCBvZiBhcyBhIHZvaWQqLgorICogVGhlIGFsbG9jYXRlZCBhcnJheSBpcyBpbml0aWFsaXplZCB0byBhbGwtYml0cy16ZXJvLgorICoKKyAqIEBwYXJhbSB0eXBlIHR5cGUgbmFtZSB0byBhbGxvY2F0ZQorICogQHBhcmFtIGNvdW50IG51bWJlciBvZiBpbnN0YW5jZXMgaW4gdGhlIGFsbG9jYXRlZCBhcnJheQorICogQHJldHVybnMgdGhlIG5ldyBtZW1vcnkgYmxvY2sgb3IgI05VTEwgb24gZmFpbHVyZQorICovCisKKy8qKgorICogQHR5cGVkZWYgREJ1c0ZyZWVGdW5jdGlvbgorICoKKyAqIFRoZSB0eXBlIG9mIGEgZnVuY3Rpb24gd2hpY2ggZnJlZXMgYSBibG9jayBvZiBtZW1vcnkuCisgKgorICogQHBhcmFtIG1lbW9yeSB0aGUgbWVtb3J5IHRvIGZyZWUKKyAqLworCisvKiogQH0gKi8gLyogZW5kIG9mIHB1YmxpYyBBUEkgZG9jcyAqLworCisvKioKKyAqIEBhZGR0b2dyb3VwIERCdXNNZW1vcnlJbnRlcm5hbHMKKyAqCisgKiBAeworICovCisKKyNpZmRlZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworc3RhdGljIGRidXNfYm9vbF90IGRlYnVnX2luaXRpYWxpemVkID0gRkFMU0U7CitzdGF0aWMgaW50IGZhaWxfbnRoID0gLTE7CitzdGF0aWMgc2l6ZV90IGZhaWxfc2l6ZSA9IDA7CitzdGF0aWMgaW50IGZhaWxfYWxsb2NfY291bnRlciA9IF9EQlVTX0lOVF9NQVg7CitzdGF0aWMgaW50IG5fZmFpbHVyZXNfcGVyX2ZhaWx1cmUgPSAxOworc3RhdGljIGludCBuX2ZhaWx1cmVzX3RoaXNfZmFpbHVyZSA9IDA7CitzdGF0aWMgZGJ1c19ib29sX3QgZ3VhcmRzID0gRkFMU0U7CitzdGF0aWMgZGJ1c19ib29sX3QgZGlzYWJsZV9tZW1fcG9vbHMgPSBGQUxTRTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBiYWNrdHJhY2Vfb25fZmFpbF9hbGxvYyA9IEZBTFNFOworc3RhdGljIGRidXNfYm9vbF90IG1hbGxvY19jYW5ub3RfZmFpbCA9IEZBTFNFOworc3RhdGljIERCdXNBdG9taWMgbl9ibG9ja3Nfb3V0c3RhbmRpbmcgPSB7MH07CisKKy8qKiB2YWx1ZSBzdG9yZWQgaW4gZ3VhcmQgcGFkZGluZyBmb3IgZGVidWdnaW5nIGJ1ZmZlciBvdmVycnVuICovCisjZGVmaW5lIEdVQVJEX1ZBTFVFIDB4ZGVhZGJlZWYKKy8qKiBzaXplIG9mIHRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYmxvY2sgc3RvcmVkIGluIGd1YXJkIG1vZGUgKi8KKyNkZWZpbmUgR1VBUkRfSU5GT19TSVpFIDgKKy8qKiBzaXplIG9mIHRoZSBHVUFSRF9WQUxVRS1maWxsZWQgcGFkZGluZyBhZnRlciB0aGUgaGVhZGVyIGluZm8gICovCisjZGVmaW5lIEdVQVJEX1NUQVJUX1BBRCAxNgorLyoqIHNpemUgb2YgdGhlIEdVQVJEX1ZBTFVFLWZpbGxlZCBwYWRkaW5nIGF0IHRoZSBlbmQgb2YgdGhlIGJsb2NrICovCisjZGVmaW5lIEdVQVJEX0VORF9QQUQgMTYKKy8qKiBzaXplIG9mIHN0dWZmIGF0IHN0YXJ0IG9mIGJsb2NrICovCisjZGVmaW5lIEdVQVJEX1NUQVJUX09GRlNFVCAoR1VBUkRfU1RBUlRfUEFEICsgR1VBUkRfSU5GT19TSVpFKQorLyoqIHRvdGFsIGV4dHJhIHNpemUgb3ZlciB0aGUgcmVxdWVzdGVkIGFsbG9jYXRpb24gZm9yIGd1YXJkIHN0dWZmICovCisjZGVmaW5lIEdVQVJEX0VYVFJBX1NJWkUgKEdVQVJEX1NUQVJUX09GRlNFVCArIEdVQVJEX0VORF9QQUQpCisKK3N0YXRpYyB2b2lkCitfZGJ1c19pbml0aWFsaXplX21hbGxvY19kZWJ1ZyAodm9pZCkKK3sKKyAgaWYgKCFkZWJ1Z19pbml0aWFsaXplZCkKKyAgICB7CisgICAgICBkZWJ1Z19pbml0aWFsaXplZCA9IFRSVUU7CisgICAgICAKKyAgICAgIGlmIChfZGJ1c19nZXRlbnYgKCJEQlVTX01BTExPQ19GQUlMX05USCIpICE9IE5VTEwpCisJeworCSAgZmFpbF9udGggPSBhdG9pIChfZGJ1c19nZXRlbnYgKCJEQlVTX01BTExPQ19GQUlMX05USCIpKTsKKyAgICAgICAgICBmYWlsX2FsbG9jX2NvdW50ZXIgPSBmYWlsX250aDsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiV2lsbCBmYWlsIGRidXNfbWFsbG9jIGV2ZXJ5ICVkIHRpbWVzXG4iLCBmYWlsX250aCk7CisJfQorICAgICAgCisgICAgICBpZiAoX2RidXNfZ2V0ZW52ICgiREJVU19NQUxMT0NfRkFJTF9HUkVBVEVSX1RIQU4iKSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgZmFpbF9zaXplID0gYXRvaSAoX2RidXNfZ2V0ZW52ICgiREJVU19NQUxMT0NfRkFJTF9HUkVBVEVSX1RIQU4iKSk7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIldpbGwgZmFpbCBtYWxsb2NzIG92ZXIgJWxkIGJ5dGVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nKSBmYWlsX3NpemUpOworICAgICAgICB9CisKKyAgICAgIGlmIChfZGJ1c19nZXRlbnYgKCJEQlVTX01BTExPQ19HVUFSRFMiKSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgZ3VhcmRzID0gVFJVRTsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiV2lsbCB1c2UgZGJ1c19tYWxsb2MgZ3VhcmRzXG4iKTsKKyAgICAgICAgfQorCisgICAgICBpZiAoX2RidXNfZ2V0ZW52ICgiREJVU19ESVNBQkxFX01FTV9QT09MUyIpICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBkaXNhYmxlX21lbV9wb29scyA9IFRSVUU7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIldpbGwgZGlzYWJsZSBtZW1vcnkgcG9vbHNcbiIpOworICAgICAgICB9CisKKyAgICAgIGlmIChfZGJ1c19nZXRlbnYgKCJEQlVTX01BTExPQ19CQUNLVFJBQ0VTIikgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGJhY2t0cmFjZV9vbl9mYWlsX2FsbG9jID0gVFJVRTsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiV2lsbCBiYWNrdHJhY2Ugb24gZmFpbGluZyBhIGRidXNfbWFsbG9jXG4iKTsKKyAgICAgICAgfQorCisgICAgICBpZiAoX2RidXNfZ2V0ZW52ICgiREJVU19NQUxMT0NfQ0FOTk9UX0ZBSUwiKSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgbWFsbG9jX2Nhbm5vdF9mYWlsID0gVFJVRTsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiV2lsbCBhYm9ydCBpZiBzeXN0ZW0gbWFsbG9jKCkgYW5kIGZyaWVuZHMgZmFpbFxuIik7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKgorICogV2hldGhlciB0byB0dXJuIG9mZiBtZW0gcG9vbHMsIHVzZWZ1bCBmb3IgbGVhayBjaGVja2luZy4KKyAqCisgKiBAcmV0dXJucyAjVFJVRSBpZiBtZW1wb29scyBzaG91bGQgbm90IGJlIHVzZWQuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19kaXNhYmxlX21lbV9wb29scyAodm9pZCkKK3sKKyAgX2RidXNfaW5pdGlhbGl6ZV9tYWxsb2NfZGVidWcgKCk7CisgIHJldHVybiBkaXNhYmxlX21lbV9wb29sczsKK30KKworLyoqCisgKiBTZXRzIHRoZSBudW1iZXIgb2YgYWxsb2NhdGlvbnMgdW50aWwgd2Ugc2ltdWxhdGUgYSBmYWlsZWQKKyAqIGFsbG9jYXRpb24uIElmIHNldCB0byAwLCB0aGUgbmV4dCBhbGxvY2F0aW9uIHRvIHJ1bgorICogZmFpbHM7IGlmIHNldCB0byAxLCBvbmUgc3VjY2VlZHMgdGhlbiB0aGUgbmV4dCBmYWlsczsgZXRjLgorICogU2V0IHRvIF9EQlVTX0lOVF9NQVggdG8gbm90IGZhaWwgYW55dGhpbmcuIAorICoKKyAqIEBwYXJhbSB1bnRpbF9uZXh0X2ZhaWwgbnVtYmVyIG9mIHN1Y2Nlc3NmdWwgYWxsb2NzIGJlZm9yZSBvbmUgZmFpbHMKKyAqLwordm9pZAorX2RidXNfc2V0X2ZhaWxfYWxsb2NfY291bnRlciAoaW50IHVudGlsX25leHRfZmFpbCkKK3sKKyAgX2RidXNfaW5pdGlhbGl6ZV9tYWxsb2NfZGVidWcgKCk7CisKKyAgZmFpbF9hbGxvY19jb3VudGVyID0gdW50aWxfbmV4dF9mYWlsOworCisjaWYgMAorICBfZGJ1c192ZXJib3NlICgiU2V0IGZhaWwgYWxsb2MgY291bnRlciA9ICVkXG4iLCBmYWlsX2FsbG9jX2NvdW50ZXIpOworI2VuZGlmCit9CisKKy8qKgorICogR2V0cyB0aGUgbnVtYmVyIG9mIHN1Y2Nlc3NmdWwgYWxsb2NzIHVudGlsIHdlJ2xsIHNpbXVsYXRlCisgKiBhIGZhaWxlZCBhbGxvYy4KKyAqCisgKiBAcmV0dXJucyBjdXJyZW50IGNvdW50ZXIgdmFsdWUKKyAqLworaW50CitfZGJ1c19nZXRfZmFpbF9hbGxvY19jb3VudGVyICh2b2lkKQoreworICBfZGJ1c19pbml0aWFsaXplX21hbGxvY19kZWJ1ZyAoKTsKKworICByZXR1cm4gZmFpbF9hbGxvY19jb3VudGVyOworfQorCisvKioKKyAqIFNldHMgaG93IG1hbnkgbWFsbG9jcyB0byBmYWlsIHdoZW4gdGhlIGZhaWwgYWxsb2MgY291bnRlciByZWFjaGVzCisgKiAwLgorICoKKyAqIEBwYXJhbSBmYWlsdXJlc19wZXJfZmFpbHVyZSBudW1iZXIgdG8gZmFpbAorICovCit2b2lkCitfZGJ1c19zZXRfZmFpbF9hbGxvY19mYWlsdXJlcyAoaW50IGZhaWx1cmVzX3Blcl9mYWlsdXJlKQoreworICBuX2ZhaWx1cmVzX3Blcl9mYWlsdXJlID0gZmFpbHVyZXNfcGVyX2ZhaWx1cmU7Cit9CisKKy8qKgorICogR2V0cyB0aGUgbnVtYmVyIG9mIGZhaWx1cmVzIHdlJ2xsIGhhdmUgd2hlbiB0aGUgZmFpbCBtYWxsb2MKKyAqIGNvdW50ZXIgcmVhY2hlcyAwLgorICoKKyAqIEByZXR1cm5zIG51bWJlciBvZiBmYWlsdXJlcyBwbGFubmVkCisgKi8KK2ludAorX2RidXNfZ2V0X2ZhaWxfYWxsb2NfZmFpbHVyZXMgKHZvaWQpCit7CisgIHJldHVybiBuX2ZhaWx1cmVzX3Blcl9mYWlsdXJlOworfQorCisjaWZkZWYgREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMKKy8qKgorICogQ2FsbGVkIHdoZW4gYWJvdXQgdG8gYWxsb2Mgc29tZSBtZW1vcnk7IGlmCisgKiBpdCByZXR1cm5zICNUUlVFLCB0aGVuIHRoZSBhbGxvY2F0aW9uIHNob3VsZAorICogZmFpbC4gSWYgaXQgcmV0dXJucyAjRkFMU0UsIHRoZW4gdGhlIGFsbG9jYXRpb24KKyAqIHNob3VsZCBub3QgZmFpbC4KKyAqCisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGlzIGFsbG9jIHNob3VsZCBmYWlsCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19kZWNyZW1lbnRfZmFpbF9hbGxvY19jb3VudGVyICh2b2lkKQoreworICBfZGJ1c19pbml0aWFsaXplX21hbGxvY19kZWJ1ZyAoKTsKKyNpZmRlZiBEQlVTX1dJTl9GSVhNRQorICB7CisgICAgc3RhdGljIGRidXNfYm9vbF90IGNhbGxlZCA9IDA7CisKKyAgICBpZiAoIWNhbGxlZCkKKyAgICAgIHsKKyAgICAgICAgX2RidXNfdmVyYm9zZSgiVE9ETzogbWVtb3J5IGFsbG9jYXRpb24gdGVzdGluZyBlcnJvcnMgZGlzYWJsZWQgZm9yIG5vd1xuIik7CisgICAgICAgIGNhbGxlZCA9IDE7CisgICAgICB9CisgICAgcmV0dXJuIEZBTFNFOworICB9CisjZW5kaWYKKworICBpZiAoZmFpbF9hbGxvY19jb3VudGVyIDw9IDApCisgICAgeworICAgICAgaWYgKGJhY2t0cmFjZV9vbl9mYWlsX2FsbG9jKQorICAgICAgICBfZGJ1c19wcmludF9iYWNrdHJhY2UgKCk7CisKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJmYWlsdXJlICVkXG4iLCBuX2ZhaWx1cmVzX3RoaXNfZmFpbHVyZSk7CisgICAgICAKKyAgICAgIG5fZmFpbHVyZXNfdGhpc19mYWlsdXJlICs9IDE7CisgICAgICBpZiAobl9mYWlsdXJlc190aGlzX2ZhaWx1cmUgPj0gbl9mYWlsdXJlc19wZXJfZmFpbHVyZSkKKyAgICAgICAgeworICAgICAgICAgIGlmIChmYWlsX250aCA+PSAwKQorICAgICAgICAgICAgZmFpbF9hbGxvY19jb3VudGVyID0gZmFpbF9udGg7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgZmFpbF9hbGxvY19jb3VudGVyID0gX0RCVVNfSU5UX01BWDsKKworICAgICAgICAgIG5fZmFpbHVyZXNfdGhpc19mYWlsdXJlID0gMDsKKworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJyZXNldCBmYWlsIGFsbG9jIGNvdW50ZXIgdG8gJWRcbiIsIGZhaWxfYWxsb2NfY291bnRlcik7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZmFpbF9hbGxvY19jb3VudGVyIC09IDE7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorfQorI2VuZGlmIC8qIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTICovCisKKy8qKgorICogR2V0IHRoZSBudW1iZXIgb2Ygb3V0c3RhbmRpbmcgbWFsbG9jKCknZCBibG9ja3MuCisgKgorICogQHJldHVybnMgbnVtYmVyIG9mIGJsb2NrcworICovCitpbnQKK19kYnVzX2dldF9tYWxsb2NfYmxvY2tzX291dHN0YW5kaW5nICh2b2lkKQoreworICByZXR1cm4gX2RidXNfYXRvbWljX2dldCAoJm5fYmxvY2tzX291dHN0YW5kaW5nKTsKK30KKworLyoqCisgKiBXaGVyZSB0aGUgYmxvY2sgY2FtZSBmcm9tLgorICovCit0eXBlZGVmIGVudW0KK3sKKyAgU09VUkNFX1VOS05PV04sCisgIFNPVVJDRV9NQUxMT0MsCisgIFNPVVJDRV9SRUFMTE9DLAorICBTT1VSQ0VfTUFMTE9DX1pFUk8sCisgIFNPVVJDRV9SRUFMTE9DX05VTEwKK30gQmxvY2tTb3VyY2U7CisKK3N0YXRpYyBjb25zdCBjaGFyKgorc291cmNlX3N0cmluZyAoQmxvY2tTb3VyY2Ugc291cmNlKQoreworICBzd2l0Y2ggKHNvdXJjZSkKKyAgICB7CisgICAgY2FzZSBTT1VSQ0VfVU5LTk9XTjoKKyAgICAgIHJldHVybiAidW5rbm93biI7CisgICAgY2FzZSBTT1VSQ0VfTUFMTE9DOgorICAgICAgcmV0dXJuICJtYWxsb2MiOworICAgIGNhc2UgU09VUkNFX1JFQUxMT0M6CisgICAgICByZXR1cm4gInJlYWxsb2MiOworICAgIGNhc2UgU09VUkNFX01BTExPQ19aRVJPOgorICAgICAgcmV0dXJuICJtYWxsb2MwIjsKKyAgICBjYXNlIFNPVVJDRV9SRUFMTE9DX05VTEw6CisgICAgICByZXR1cm4gInJlYWxsb2MoTlVMTCkiOworICAgIGRlZmF1bHQ6CisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJJbnZhbGlkIG1hbGxvYyBibG9jayBzb3VyY2UgSUQiKTsKKyAgICAgIHJldHVybiAiaW52YWxpZCEiOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK2NoZWNrX2d1YXJkcyAodm9pZCAgICAgICAqZnJlZV9ibG9jaywKKyAgICAgICAgICAgICAgZGJ1c19ib29sX3Qgb3ZlcndyaXRlKQoreworICBpZiAoZnJlZV9ibG9jayAhPSBOVUxMKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGNoYXIgKmJsb2NrID0gKCh1bnNpZ25lZCBjaGFyKilmcmVlX2Jsb2NrKSAtIEdVQVJEX1NUQVJUX09GRlNFVDsKKyAgICAgIHNpemVfdCByZXF1ZXN0ZWRfYnl0ZXMgPSAqKGRidXNfdWludDMyX3QqKWJsb2NrOworICAgICAgQmxvY2tTb3VyY2Ugc291cmNlID0gKihkYnVzX3VpbnQzMl90KikoYmxvY2sgKyA0KTsKKyAgICAgIHVuc2lnbmVkIGludCBpOworICAgICAgZGJ1c19ib29sX3QgZmFpbGVkOworCisgICAgICBmYWlsZWQgPSBGQUxTRTsKKworI2lmIDAKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJDaGVja2luZyAlZCBieXRlcyByZXF1ZXN0IGZyb20gc291cmNlICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkX2J5dGVzLCBzb3VyY2Vfc3RyaW5nIChzb3VyY2UpKTsKKyNlbmRpZgorICAgICAgCisgICAgICBpID0gR1VBUkRfSU5GT19TSVpFOworICAgICAgd2hpbGUgKGkgPCBHVUFSRF9TVEFSVF9PRkZTRVQpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX3VpbnQzMl90IHZhbHVlID0gKihkYnVzX3VpbnQzMl90KikgJmJsb2NrW2ldOworICAgICAgICAgIGlmICh2YWx1ZSAhPSBHVUFSRF9WQUxVRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfd2FybiAoIkJsb2NrIG9mICVsdSBieXRlcyBmcm9tICVzIGhhZCBzdGFydCBndWFyZCB2YWx1ZSAweCV1eCBhdCAlZCBleHBlY3RlZCAweCV4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcpIHJlcXVlc3RlZF9ieXRlcywgc291cmNlX3N0cmluZyAoc291cmNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsIGksIEdVQVJEX1ZBTFVFKTsKKyAgICAgICAgICAgICAgZmFpbGVkID0gVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgICAgICBpICs9IDQ7CisgICAgICAgIH0KKworICAgICAgaSA9IEdVQVJEX1NUQVJUX09GRlNFVCArIHJlcXVlc3RlZF9ieXRlczsKKyAgICAgIHdoaWxlIChpIDwgKEdVQVJEX1NUQVJUX09GRlNFVCArIHJlcXVlc3RlZF9ieXRlcyArIEdVQVJEX0VORF9QQUQpKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c191aW50MzJfdCB2YWx1ZSA9ICooZGJ1c191aW50MzJfdCopICZibG9ja1tpXTsKKyAgICAgICAgICBpZiAodmFsdWUgIT0gR1VBUkRfVkFMVUUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJCbG9jayBvZiAlbHUgYnl0ZXMgZnJvbSAlcyBoYWQgZW5kIGd1YXJkIHZhbHVlIDB4JXV4IGF0ICVkIGV4cGVjdGVkIDB4JXgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZykgcmVxdWVzdGVkX2J5dGVzLCBzb3VyY2Vfc3RyaW5nIChzb3VyY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSwgaSwgR1VBUkRfVkFMVUUpOworICAgICAgICAgICAgICBmYWlsZWQgPSBUUlVFOworICAgICAgICAgICAgfQorICAgICAgICAgIAorICAgICAgICAgIGkgKz0gNDsKKyAgICAgICAgfQorCisgICAgICAvKiBzZXQgbWVtb3J5IHRvIGFueXRoaW5nIGJ1dCBudWwgYnl0ZXMgKi8KKyAgICAgIGlmIChvdmVyd3JpdGUpCisgICAgICAgIG1lbXNldCAoZnJlZV9ibG9jaywgJ2cnLCByZXF1ZXN0ZWRfYnl0ZXMpOworICAgICAgCisgICAgICBpZiAoZmFpbGVkKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJndWFyZCB2YWx1ZSBjb3JydXB0aW9uIik7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCoKK3NldF9ndWFyZHMgKHZvaWQgICAgICAgKnJlYWxfYmxvY2ssCisgICAgICAgICAgICBzaXplX3QgICAgICByZXF1ZXN0ZWRfYnl0ZXMsCisgICAgICAgICAgICBCbG9ja1NvdXJjZSBzb3VyY2UpCit7CisgIHVuc2lnbmVkIGNoYXIgKmJsb2NrID0gcmVhbF9ibG9jazsKKyAgdW5zaWduZWQgaW50IGk7CisgIAorICBpZiAoYmxvY2sgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBfZGJ1c19hc3NlcnQgKEdVQVJEX1NUQVJUX09GRlNFVCArIEdVQVJEX0VORF9QQUQgPT0gR1VBUkRfRVhUUkFfU0laRSk7CisgIAorICAqKChkYnVzX3VpbnQzMl90KilibG9jaykgPSByZXF1ZXN0ZWRfYnl0ZXM7CisgICooKGRidXNfdWludDMyX3QqKShibG9jayArIDQpKSA9IHNvdXJjZTsKKworICBpID0gR1VBUkRfSU5GT19TSVpFOworICB3aGlsZSAoaSA8IEdVQVJEX1NUQVJUX09GRlNFVCkKKyAgICB7CisgICAgICAoKihkYnVzX3VpbnQzMl90KikgJmJsb2NrW2ldKSA9IEdVQVJEX1ZBTFVFOworICAgICAgCisgICAgICBpICs9IDQ7CisgICAgfQorCisgIGkgPSBHVUFSRF9TVEFSVF9PRkZTRVQgKyByZXF1ZXN0ZWRfYnl0ZXM7CisgIHdoaWxlIChpIDwgKEdVQVJEX1NUQVJUX09GRlNFVCArIHJlcXVlc3RlZF9ieXRlcyArIEdVQVJEX0VORF9QQUQpKQorICAgIHsKKyAgICAgICgqKGRidXNfdWludDMyX3QqKSAmYmxvY2tbaV0pID0gR1VBUkRfVkFMVUU7CisgICAgICAKKyAgICAgIGkgKz0gNDsKKyAgICB9CisgIAorICBjaGVja19ndWFyZHMgKGJsb2NrICsgR1VBUkRfU1RBUlRfT0ZGU0VULCBGQUxTRSk7CisgIAorICByZXR1cm4gYmxvY2sgKyBHVUFSRF9TVEFSVF9PRkZTRVQ7Cit9CisKKyNlbmRpZgorCisvKiogQH0gKi8gLyogRW5kIG9mIGludGVybmFscyBkb2NzICovCisKKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzTWVtb3J5CisgKgorICogQHsKKyAqLworCisvKioKKyAqIEFsbG9jYXRlcyB0aGUgZ2l2ZW4gbnVtYmVyIG9mIGJ5dGVzLCBhcyB3aXRoIHN0YW5kYXJkCisgKiBtYWxsb2MoKS4gR3VhcmFudGVlZCB0byByZXR1cm4gI05VTEwgaWYgYnl0ZXMgaXMgemVybworICogb24gYWxsIHBsYXRmb3Jtcy4gUmV0dXJucyAjTlVMTCBpZiB0aGUgYWxsb2NhdGlvbiBmYWlscy4KKyAqIFRoZSBtZW1vcnkgbXVzdCBiZSByZWxlYXNlZCB3aXRoIGRidXNfZnJlZSgpLgorICoKKyAqIGRidXNfbWFsbG9jKCkgbWVtb3J5IGlzIE5PVCBzYWZlIHRvIGZyZWUgd2l0aCByZWd1bGFyIGZyZWUoKSBmcm9tCisgKiB0aGUgQyBsaWJyYXJ5LiBGcmVlIGl0IHdpdGggZGJ1c19mcmVlKCkgb25seS4KKyAqCisgKiBAcGFyYW0gYnl0ZXMgbnVtYmVyIG9mIGJ5dGVzIHRvIGFsbG9jYXRlCisgKiBAcmV0dXJuIGFsbG9jYXRlZCBtZW1vcnksIG9yICNOVUxMIGlmIHRoZSBhbGxvY2F0aW9uIGZhaWxzLgorICovCit2b2lkKgorZGJ1c19tYWxsb2MgKHNpemVfdCBieXRlcykKK3sKKyNpZmRlZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworICBfZGJ1c19pbml0aWFsaXplX21hbGxvY19kZWJ1ZyAoKTsKKyAgCisgIGlmIChfZGJ1c19kZWNyZW1lbnRfZmFpbF9hbGxvY19jb3VudGVyICgpKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgRkFJTElORyBtYWxsb2Mgb2YgJWxkIGJ5dGVzXG4iLCAobG9uZykgYnl0ZXMpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorI2VuZGlmCisKKyAgaWYgKGJ5dGVzID09IDApIC8qIHNvbWUgc3lzdGVtIG1hbGxvY3MgaGFuZGxlIHRoaXMsIHNvbWUgZG9uJ3QgKi8KKyAgICByZXR1cm4gTlVMTDsKKyNpZmRlZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworICBlbHNlIGlmIChmYWlsX3NpemUgIT0gMCAmJiBieXRlcyA+IGZhaWxfc2l6ZSkKKyAgICByZXR1cm4gTlVMTDsKKyAgZWxzZSBpZiAoZ3VhcmRzKQorICAgIHsKKyAgICAgIHZvaWQgKmJsb2NrOworCisgICAgICBibG9jayA9IG1hbGxvYyAoYnl0ZXMgKyBHVUFSRF9FWFRSQV9TSVpFKTsKKyAgICAgIGlmIChibG9jaykKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX2F0b21pY19pbmMgKCZuX2Jsb2Nrc19vdXRzdGFuZGluZyk7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKG1hbGxvY19jYW5ub3RfZmFpbCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJvdXQgb2YgbWVtb3J5OiBtYWxsb2MgKCVsZCArICVsZCkiLAorICAgICAgICAgICAgICAobG9uZykgYnl0ZXMsIChsb25nKSBHVUFSRF9FWFRSQV9TSVpFKTsKKyAgICAgICAgICBfZGJ1c19hYm9ydCAoKTsKKyAgICAgICAgfQorICAgICAgCisgICAgICByZXR1cm4gc2V0X2d1YXJkcyAoYmxvY2ssIGJ5dGVzLCBTT1VSQ0VfTUFMTE9DKTsKKyAgICB9CisjZW5kaWYKKyAgZWxzZQorICAgIHsKKyAgICAgIHZvaWQgKm1lbTsKKyAgICAgIG1lbSA9IG1hbGxvYyAoYnl0ZXMpOworCisjaWZkZWYgREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMKKyAgICAgIGlmIChtZW0pCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19hdG9taWNfaW5jICgmbl9ibG9ja3Nfb3V0c3RhbmRpbmcpOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChtYWxsb2NfY2Fubm90X2ZhaWwpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgib3V0IG9mIG1lbW9yeTogbWFsbG9jICglbGQpIiwgKGxvbmcpIGJ5dGVzKTsKKyAgICAgICAgICBfZGJ1c19hYm9ydCAoKTsKKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgIHJldHVybiBtZW07CisgICAgfQorfQorCisvKioKKyAqIEFsbG9jYXRlcyB0aGUgZ2l2ZW4gbnVtYmVyIG9mIGJ5dGVzLCBhcyB3aXRoIHN0YW5kYXJkIG1hbGxvYygpLCBidXQKKyAqIGFsbCBieXRlcyBhcmUgaW5pdGlhbGl6ZWQgdG8gemVybyBhcyB3aXRoIGNhbGxvYygpLiBHdWFyYW50ZWVkIHRvCisgKiByZXR1cm4gI05VTEwgaWYgYnl0ZXMgaXMgemVybyBvbiBhbGwgcGxhdGZvcm1zLiBSZXR1cm5zICNOVUxMIGlmIHRoZQorICogYWxsb2NhdGlvbiBmYWlscy4gIFRoZSBtZW1vcnkgbXVzdCBiZSByZWxlYXNlZCB3aXRoIGRidXNfZnJlZSgpLgorICoKKyAqIGRidXNfbWFsbG9jMCgpIG1lbW9yeSBpcyBOT1Qgc2FmZSB0byBmcmVlIHdpdGggcmVndWxhciBmcmVlKCkgZnJvbQorICogdGhlIEMgbGlicmFyeS4gRnJlZSBpdCB3aXRoIGRidXNfZnJlZSgpIG9ubHkuCisgKgorICogQHBhcmFtIGJ5dGVzIG51bWJlciBvZiBieXRlcyB0byBhbGxvY2F0ZQorICogQHJldHVybiBhbGxvY2F0ZWQgbWVtb3J5LCBvciAjTlVMTCBpZiB0aGUgYWxsb2NhdGlvbiBmYWlscy4KKyAqLwordm9pZCoKK2RidXNfbWFsbG9jMCAoc2l6ZV90IGJ5dGVzKQoreworI2lmZGVmIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTCisgIF9kYnVzX2luaXRpYWxpemVfbWFsbG9jX2RlYnVnICgpOworICAKKyAgaWYgKF9kYnVzX2RlY3JlbWVudF9mYWlsX2FsbG9jX2NvdW50ZXIgKCkpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIiBGQUlMSU5HIG1hbGxvYzAgb2YgJWxkIGJ5dGVzXG4iLCAobG9uZykgYnl0ZXMpOworICAgICAgCisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisjZW5kaWYKKyAgCisgIGlmIChieXRlcyA9PSAwKQorICAgIHJldHVybiBOVUxMOworI2lmZGVmIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTCisgIGVsc2UgaWYgKGZhaWxfc2l6ZSAhPSAwICYmIGJ5dGVzID4gZmFpbF9zaXplKQorICAgIHJldHVybiBOVUxMOworICBlbHNlIGlmIChndWFyZHMpCisgICAgeworICAgICAgdm9pZCAqYmxvY2s7CisKKyAgICAgIGJsb2NrID0gY2FsbG9jIChieXRlcyArIEdVQVJEX0VYVFJBX1NJWkUsIDEpOworCisgICAgICBpZiAoYmxvY2spCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19hdG9taWNfaW5jICgmbl9ibG9ja3Nfb3V0c3RhbmRpbmcpOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChtYWxsb2NfY2Fubm90X2ZhaWwpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgib3V0IG9mIG1lbW9yeTogY2FsbG9jICglbGQgKyAlbGQsIDEpIiwKKyAgICAgICAgICAgICAgKGxvbmcpIGJ5dGVzLCAobG9uZykgR1VBUkRfRVhUUkFfU0laRSk7CisgICAgICAgICAgX2RidXNfYWJvcnQgKCk7CisgICAgICAgIH0KKworICAgICAgcmV0dXJuIHNldF9ndWFyZHMgKGJsb2NrLCBieXRlcywgU09VUkNFX01BTExPQ19aRVJPKTsKKyAgICB9CisjZW5kaWYKKyAgZWxzZQorICAgIHsKKyAgICAgIHZvaWQgKm1lbTsKKyAgICAgIG1lbSA9IGNhbGxvYyAoYnl0ZXMsIDEpOworCisjaWZkZWYgREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMKKyAgICAgIGlmIChtZW0pCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19hdG9taWNfaW5jICgmbl9ibG9ja3Nfb3V0c3RhbmRpbmcpOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChtYWxsb2NfY2Fubm90X2ZhaWwpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgib3V0IG9mIG1lbW9yeTogY2FsbG9jICglbGQpIiwgKGxvbmcpIGJ5dGVzKTsKKyAgICAgICAgICBfZGJ1c19hYm9ydCAoKTsKKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgIHJldHVybiBtZW07CisgICAgfQorfQorCisvKioKKyAqIFJlc2l6ZXMgYSBibG9jayBvZiBtZW1vcnkgcHJldmlvdXNseSBhbGxvY2F0ZWQgYnkgZGJ1c19tYWxsb2MoKSBvcgorICogZGJ1c19tYWxsb2MwKCkuIEd1YXJhbnRlZWQgdG8gZnJlZSB0aGUgbWVtb3J5IGFuZCByZXR1cm4gI05VTEwgaWYgYnl0ZXMKKyAqIGlzIHplcm8gb24gYWxsIHBsYXRmb3Jtcy4gUmV0dXJucyAjTlVMTCBpZiB0aGUgcmVzaXplIGZhaWxzLgorICogSWYgdGhlIHJlc2l6ZSBmYWlscywgdGhlIG1lbW9yeSBpcyBub3QgZnJlZWQuCisgKgorICogQHBhcmFtIG1lbW9yeSBibG9jayB0byBiZSByZXNpemVkCisgKiBAcGFyYW0gYnl0ZXMgbmV3IHNpemUgb2YgdGhlIG1lbW9yeSBibG9jaworICogQHJldHVybiBhbGxvY2F0ZWQgbWVtb3J5LCBvciAjTlVMTCBpZiB0aGUgcmVzaXplIGZhaWxzLgorICovCit2b2lkKgorZGJ1c19yZWFsbG9jICh2b2lkICAqbWVtb3J5LAorICAgICAgICAgICAgICBzaXplX3QgYnl0ZXMpCit7CisjaWZkZWYgREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMKKyAgX2RidXNfaW5pdGlhbGl6ZV9tYWxsb2NfZGVidWcgKCk7CisgIAorICBpZiAoX2RidXNfZGVjcmVtZW50X2ZhaWxfYWxsb2NfY291bnRlciAoKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiIEZBSUxJTkcgcmVhbGxvYyBvZiAlbGQgYnl0ZXNcbiIsIChsb25nKSBieXRlcyk7CisgICAgICAKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyNlbmRpZgorICAKKyAgaWYgKGJ5dGVzID09IDApIC8qIGd1YXJhbnRlZSB0aGlzIGlzIHNhZmUgKi8KKyAgICB7CisgICAgICBkYnVzX2ZyZWUgKG1lbW9yeSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisjaWZkZWYgREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMKKyAgZWxzZSBpZiAoZmFpbF9zaXplICE9IDAgJiYgYnl0ZXMgPiBmYWlsX3NpemUpCisgICAgcmV0dXJuIE5VTEw7CisgIGVsc2UgaWYgKGd1YXJkcykKKyAgICB7CisgICAgICBpZiAobWVtb3J5KQorICAgICAgICB7CisgICAgICAgICAgc2l6ZV90IG9sZF9ieXRlczsKKyAgICAgICAgICB2b2lkICpibG9jazsKKyAgICAgICAgICAKKyAgICAgICAgICBjaGVja19ndWFyZHMgKG1lbW9yeSwgRkFMU0UpOworICAgICAgICAgIAorICAgICAgICAgIGJsb2NrID0gcmVhbGxvYyAoKCh1bnNpZ25lZCBjaGFyKiltZW1vcnkpIC0gR1VBUkRfU1RBUlRfT0ZGU0VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXMgKyBHVUFSRF9FWFRSQV9TSVpFKTsKKworICAgICAgICAgIGlmIChibG9jayA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAobWFsbG9jX2Nhbm5vdF9mYWlsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJvdXQgb2YgbWVtb3J5OiByZWFsbG9jICglcCwgJWxkICsgJWxkKSIsCisgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5LCAobG9uZykgYnl0ZXMsIChsb25nKSBHVUFSRF9FWFRSQV9TSVpFKTsKKyAgICAgICAgICAgICAgICAgIF9kYnVzX2Fib3J0ICgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIG9sZF9ieXRlcyA9ICooZGJ1c191aW50MzJfdCopYmxvY2s7CisgICAgICAgICAgaWYgKGJ5dGVzID49IG9sZF9ieXRlcykKKyAgICAgICAgICAgIC8qIG9sZCBndWFyZHMgc2hvdWxkbid0IGhhdmUgbW92ZWQgKi8KKyAgICAgICAgICAgIGNoZWNrX2d1YXJkcyAoKCh1bnNpZ25lZCBjaGFyKilibG9jaykgKyBHVUFSRF9TVEFSVF9PRkZTRVQsIEZBTFNFKTsKKyAgICAgICAgICAKKyAgICAgICAgICByZXR1cm4gc2V0X2d1YXJkcyAoYmxvY2ssIGJ5dGVzLCBTT1VSQ0VfUkVBTExPQyk7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHZvaWQgKmJsb2NrOworICAgICAgICAgIAorICAgICAgICAgIGJsb2NrID0gbWFsbG9jIChieXRlcyArIEdVQVJEX0VYVFJBX1NJWkUpOworCisgICAgICAgICAgaWYgKGJsb2NrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c19hdG9taWNfaW5jICgmbl9ibG9ja3Nfb3V0c3RhbmRpbmcpOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgaWYgKG1hbGxvY19jYW5ub3RfZmFpbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfd2FybiAoIm91dCBvZiBtZW1vcnk6IG1hbGxvYyAoJWxkICsgJWxkKSIsCisgICAgICAgICAgICAgICAgICAobG9uZykgYnl0ZXMsIChsb25nKSBHVUFSRF9FWFRSQV9TSVpFKTsKKyAgICAgICAgICAgICAgX2RidXNfYWJvcnQgKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICByZXR1cm4gc2V0X2d1YXJkcyAoYmxvY2ssIGJ5dGVzLCBTT1VSQ0VfUkVBTExPQ19OVUxMKTsgICAKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorICBlbHNlCisgICAgeworICAgICAgdm9pZCAqbWVtOworICAgICAgbWVtID0gcmVhbGxvYyAobWVtb3J5LCBieXRlcyk7CisKKyNpZmRlZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworICAgICAgaWYgKG1lbSA9PSBOVUxMICYmIG1hbGxvY19jYW5ub3RfZmFpbCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJvdXQgb2YgbWVtb3J5OiBtYWxsb2MgKCVsZCkiLCAobG9uZykgYnl0ZXMpOworICAgICAgICAgIF9kYnVzX2Fib3J0ICgpOworICAgICAgICB9CisKKyAgICAgIGlmIChtZW1vcnkgPT0gTlVMTCAmJiBtZW0gIT0gTlVMTCkKKwkgICAgX2RidXNfYXRvbWljX2luYyAoJm5fYmxvY2tzX291dHN0YW5kaW5nKTsKKyNlbmRpZgorICAgICAgcmV0dXJuIG1lbTsKKyAgICB9Cit9CisKKy8qKgorICogRnJlZXMgYSBibG9jayBvZiBtZW1vcnkgcHJldmlvdXNseSBhbGxvY2F0ZWQgYnkgZGJ1c19tYWxsb2MoKSBvcgorICogZGJ1c19tYWxsb2MwKCkuIElmIHBhc3NlZCAjTlVMTCwgZG9lcyBub3RoaW5nLgorICogCisgKiBAcGFyYW0gbWVtb3J5IGJsb2NrIHRvIGJlIGZyZWVkCisgKi8KK3ZvaWQKK2RidXNfZnJlZSAodm9pZCAgKm1lbW9yeSkKK3sKKyNpZmRlZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworICBpZiAoZ3VhcmRzKQorICAgIHsKKyAgICAgIGNoZWNrX2d1YXJkcyAobWVtb3J5LCBUUlVFKTsKKyAgICAgIGlmIChtZW1vcnkpCisgICAgICAgIHsKKyNpZmRlZiBEQlVTX0RJU0FCTEVfQVNTRVJUCisgICAgICAgICAgX2RidXNfYXRvbWljX2RlYyAoJm5fYmxvY2tzX291dHN0YW5kaW5nKTsKKyNlbHNlCisgICAgICAgICAgZGJ1c19pbnQzMl90IG9sZF92YWx1ZTsKKworICAgICAgICAgIG9sZF92YWx1ZSA9IF9kYnVzX2F0b21pY19kZWMgKCZuX2Jsb2Nrc19vdXRzdGFuZGluZyk7CisgICAgICAgICAgX2RidXNfYXNzZXJ0IChvbGRfdmFsdWUgPj0gMSk7CisjZW5kaWYKKworICAgICAgICAgIGZyZWUgKCgodW5zaWduZWQgY2hhciopbWVtb3J5KSAtIEdVQVJEX1NUQVJUX09GRlNFVCk7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZgorICAgIAorICBpZiAobWVtb3J5KSAvKiB3ZSBndWFyYW50ZWUgaXQncyBzYWZlIHRvIGZyZWUgKE5VTEwpICovCisgICAgeworI2lmZGVmIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTCisjaWZkZWYgREJVU19ESVNBQkxFX0FTU0VSVAorICAgICAgX2RidXNfYXRvbWljX2RlYyAoJm5fYmxvY2tzX291dHN0YW5kaW5nKTsKKyNlbHNlCisgICAgICBkYnVzX2ludDMyX3Qgb2xkX3ZhbHVlOworCisgICAgICBvbGRfdmFsdWUgPSBfZGJ1c19hdG9taWNfZGVjICgmbl9ibG9ja3Nfb3V0c3RhbmRpbmcpOworICAgICAgX2RidXNfYXNzZXJ0IChvbGRfdmFsdWUgPj0gMSk7CisjZW5kaWYKKyNlbmRpZgorCisgICAgICBmcmVlIChtZW1vcnkpOworICAgIH0KK30KKworLyoqCisgKiBGcmVlcyBhICNOVUxMLXRlcm1pbmF0ZWQgYXJyYXkgb2Ygc3RyaW5ncy4KKyAqIElmIHBhc3NlZCAjTlVMTCwgZG9lcyBub3RoaW5nLgorICoKKyAqIEBwYXJhbSBzdHJfYXJyYXkgdGhlIGFycmF5IHRvIGJlIGZyZWVkCisgKi8KK3ZvaWQKK2RidXNfZnJlZV9zdHJpbmdfYXJyYXkgKGNoYXIgKipzdHJfYXJyYXkpCit7CisgIGlmIChzdHJfYXJyYXkpCisgICAgeworICAgICAgaW50IGk7CisKKyAgICAgIGkgPSAwOworICAgICAgd2hpbGUgKHN0cl9hcnJheVtpXSkKKwl7CisJICBkYnVzX2ZyZWUgKHN0cl9hcnJheVtpXSk7CisJICBpKys7CisJfQorCisgICAgICBkYnVzX2ZyZWUgKHN0cl9hcnJheSk7CisgICAgfQorfQorCisvKiogQH0gKi8gLyogRW5kIG9mIHB1YmxpYyBBUEkgZG9jcyBibG9jayAqLworCisKKy8qKgorICogQGFkZHRvZ3JvdXAgREJ1c01lbW9yeUludGVybmFscworICoKKyAqIEB7CisgKi8KKworLyoqCisgKiBfZGJ1c19jdXJyZW50X2dlbmVyYXRpb24gaXMgdXNlZCB0byB0cmFjayBlYWNoCisgKiB0aW1lIHRoYXQgZGJ1c19zaHV0ZG93bigpIGlzIGNhbGxlZCwgc28gd2UgY2FuCisgKiByZWluaXQgdGhpbmdzIGFmdGVyIGl0J3MgYmVlbiBjYWxsZWQuIEl0IGlzIHNpbXBseQorICogaW5jcmVtZW50ZWQgZWFjaCB0aW1lIHdlIHNodXQgZG93bi4KKyAqLworaW50IF9kYnVzX2N1cnJlbnRfZ2VuZXJhdGlvbiA9IDE7CisKKy8qKgorICogUmVwcmVzZW50cyBhIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBvbiBzaHV0ZG93bi4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgU2h1dGRvd25DbG9zdXJlIFNodXRkb3duQ2xvc3VyZTsKKworLyoqCisgKiBUaGlzIHN0cnVjdCByZXByZXNlbnRzIGEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIG9uIHNodXRkb3duLgorICovCitzdHJ1Y3QgU2h1dGRvd25DbG9zdXJlCit7CisgIFNodXRkb3duQ2xvc3VyZSAqbmV4dDsgICAgIC8qKjwgTmV4dCBTaHV0ZG93bkNsb3N1cmUgKi8KKyAgREJ1c1NodXRkb3duRnVuY3Rpb24gZnVuYzsgLyoqPCBGdW5jdGlvbiB0byBjYWxsICovCisgIHZvaWQgKmRhdGE7ICAgICAgICAgICAgICAgIC8qKjwgRGF0YSBmb3IgZnVuY3Rpb24gKi8KK307CisKKy8qIFByb3RlY3RlZCBieSBfREJVU19MT0NLIChzaHV0ZG93bl9mdW5jcykgKi8KK3N0YXRpYyBTaHV0ZG93bkNsb3N1cmUgKnJlZ2lzdGVyZWRfZ2xvYmFscyA9IE5VTEw7CisKKy8qKgorICogUmVnaXN0ZXIgYSBjbGVhbnVwIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBleGFjdGx5IG9uY2UKKyAqIHRoZSBuZXh0IHRpbWUgZGJ1c19zaHV0ZG93bigpIGlzIGNhbGxlZC4KKyAqCisgKiBAcGFyYW0gZnVuYyB0aGUgZnVuY3Rpb24KKyAqIEBwYXJhbSBkYXRhIGRhdGEgdG8gcGFzcyB0byB0aGUgZnVuY3Rpb24KKyAqIEByZXR1cm5zICNGQUxTRSBvbiBub3QgZW5vdWdoIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfcmVnaXN0ZXJfc2h1dGRvd25fZnVuYyAoREJ1c1NodXRkb3duRnVuY3Rpb24gIGZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAqZGF0YSkKK3sKKyAgZGJ1c19ib29sX3Qgb2s7CisKKyAgaWYgKCFfREJVU19MT0NLIChzaHV0ZG93bl9mdW5jcykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIG9rID0gX2RidXNfcmVnaXN0ZXJfc2h1dGRvd25fZnVuY191bmxvY2tlZCAoZnVuYywgZGF0YSk7CisgIF9EQlVTX1VOTE9DSyAoc2h1dGRvd25fZnVuY3MpOworICByZXR1cm4gb2s7Cit9CisKK2RidXNfYm9vbF90CitfZGJ1c19yZWdpc3Rlcl9zaHV0ZG93bl9mdW5jX3VubG9ja2VkIChEQnVzU2h1dGRvd25GdW5jdGlvbiAgZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICpkYXRhKQoreworICBTaHV0ZG93bkNsb3N1cmUgKmM7CisKKyAgYyA9IGRidXNfbmV3IChTaHV0ZG93bkNsb3N1cmUsIDEpOworCisgIGlmIChjID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGMtPmZ1bmMgPSBmdW5jOworICBjLT5kYXRhID0gZGF0YTsKKworICBjLT5uZXh0ID0gcmVnaXN0ZXJlZF9nbG9iYWxzOworICByZWdpc3RlcmVkX2dsb2JhbHMgPSBjOworCisgIHJldHVybiBUUlVFOworfQorCisvKiogQH0gKi8gLyogRW5kIG9mIHByaXZhdGUgQVBJIGRvY3MgYmxvY2sgKi8KKworCisvKioKKyAqIEBhZGR0b2dyb3VwIERCdXNNZW1vcnkKKyAqCisgKiBAeworICovCisKKy8qKgorICogRnJlZXMgYWxsIG1lbW9yeSBhbGxvY2F0ZWQgaW50ZXJuYWxseSBieSBsaWJkYnVzIGFuZAorICogcmV2ZXJzZXMgdGhlIGVmZmVjdHMgb2YgZGJ1c190aHJlYWRzX2luaXQoKS4gbGliZGJ1cyBrZWVwcyBpbnRlcm5hbAorICogZ2xvYmFsIHZhcmlhYmxlcywgZm9yIGV4YW1wbGUgY2FjaGVzIGFuZCB0aHJlYWQgbG9ja3MsIGFuZCBpdAorICogY2FuIGJlIHVzZWZ1bCB0byBmcmVlIHRoZXNlIGludGVybmFsIGRhdGEgc3RydWN0dXJlcy4KKyAqCisgKiBkYnVzX3NodXRkb3duKCkgZG9lcyBOT1QgZnJlZSBtZW1vcnkgdGhhdCB3YXMgcmV0dXJuZWQKKyAqIHRvIHRoZSBhcHBsaWNhdGlvbi4gSXQgb25seSBmcmVlcyBsaWJkYnVzLWludGVybmFsCisgKiBkYXRhIHN0cnVjdHVyZXMuCisgKgorICogWW91IE1VU1QgZnJlZSBhbGwgbWVtb3J5IGFuZCByZWxlYXNlIGFsbCByZWZlcmVuY2UgY291bnRzCisgKiByZXR1cm5lZCB0byB5b3UgYnkgbGliZGJ1cyBwcmlvciB0byBjYWxsaW5nIGRidXNfc2h1dGRvd24oKS4KKyAqCisgKiBJZiBhIHNoYXJlZCBjb25uZWN0aW9uIGlzIG9wZW4sIGNhbGxpbmcgZGJ1c19zaHV0ZG93bigpIHdpbGwKKyAqIGRyYWluIGl0cyBxdWV1ZSBvZiBtZXNzYWdlcyBhbmQgZGlzY29ubmVjdCBpdC4gSW4gcGFydGljdWxhciwKKyAqIHRoaXMgd2lsbCByZXN1bHQgaW4gcHJvY2Vzc2luZyBvZiB0aGUgc3BlY2lhbCBEaXNjb25uZWN0ZWQKKyAqIHNpZ25hbCwgd2hpY2ggbWF5IHJlc3VsdCBpbiBhIGNhbGwgdG8gX2V4aXQoKSwgdW5sZXNzIHlvdQorICogaGF2ZSB1c2VkIGRidXNfY29ubmVjdGlvbl9zZXRfZXhpdF9vbl9kaXNjb25uZWN0KCkgdG8gZGlzYWJsZQorICogdGhhdCBiZWhhdmlvdXIuCisgKgorICogWW91IGNhbid0IGNvbnRpbnVlIHRvIHVzZSBhbnkgRC1CdXMgb2JqZWN0cywgc3VjaCBhcyBjb25uZWN0aW9ucywKKyAqIHRoYXQgd2VyZSBhbGxvY2F0ZWQgcHJpb3IgdG8gZGJ1c19zaHV0ZG93bigpLiBZb3UgY2FuLCBob3dldmVyLAorICogc3RhcnQgb3ZlcjsgY2FsbCBkYnVzX3RocmVhZHNfaW5pdCgpIGFnYWluLCBjcmVhdGUgbmV3IGNvbm5lY3Rpb25zLAorICogYW5kIHNvIGZvcnRoLgorICoKKyAqIFdBUk5JTkc6IGRidXNfc2h1dGRvd24oKSBpcyBOT1QgdGhyZWFkIHNhZmUsIGl0IG11c3QgYmUgY2FsbGVkCisgKiB3aGlsZSBOTyBvdGhlciB0aHJlYWRzIGFyZSB1c2luZyBELUJ1cy4gKFJlbWVtYmVyLCB5b3UgaGF2ZSB0byBmcmVlCisgKiBhbGwgRC1CdXMgb2JqZWN0cyBhbmQgbWVtb3J5IGJlZm9yZSB5b3UgY2FsbCBkYnVzX3NodXRkb3duKCksIHNvIG5vCisgKiB0aHJlYWQgY2FuIGJlIHVzaW5nIGxpYmRidXMuKQorICoKKyAqIFRoZSBwdXJwb3NlIG9mIGRidXNfc2h1dGRvd24oKSBpcyB0byBhbGxvdyBhcHBsaWNhdGlvbnMgdG8gZ2V0CisgKiBjbGVhbiBvdXRwdXQgZnJvbSBtZW1vcnkgbGVhayBjaGVja2Vycy4gZGJ1c19zaHV0ZG93bigpIG1heSBhbHNvIGJlCisgKiB1c2VmdWwgaWYgeW91IHdhbnQgdG8gZGxvcGVuKCkgbGliZGJ1cyBpbnN0ZWFkIG9mIGxpbmtpbmcgdG8gaXQsCisgKiBhbmQgd2FudCB0byBiZSBhYmxlIHRvIHVubG9hZCB0aGUgbGlicmFyeSBhZ2Fpbi4KKyAqCisgKiBUaGVyZSBpcyBhYnNvbHV0ZWx5IG5vIHJlcXVpcmVtZW50IHRvIGNhbGwgZGJ1c19zaHV0ZG93bigpIC0gaW4gZmFjdCwKKyAqIG1vc3QgYXBwbGljYXRpb25zIHdvbid0IGJvdGhlciBhbmQgc2hvdWxkIG5vdCBmZWVsIGd1aWx0eS4KKyAqIAorICogWW91IGhhdmUgdG8ga25vdyB0aGF0IG5vYm9keSBpcyB1c2luZyBsaWJkYnVzIGluIHlvdXIgYXBwbGljYXRpb24ncworICogcHJvY2VzcyBiZWZvcmUgeW91IGNhbiBjYWxsIGRidXNfc2h1dGRvd24oKS4gT25lIGltcGxpY2F0aW9uIG9mIHRoaXMKKyAqIGlzIHRoYXQgY2FsbGluZyBkYnVzX3NodXRkb3duKCkgZnJvbSBhIGxpYnJhcnkgaXMgYWxtb3N0IGNlcnRhaW5seQorICogd3JvbmcsIHNpbmNlIHlvdSBkb24ndCBrbm93IHdoYXQgdGhlIHJlc3Qgb2YgdGhlIGFwcCBpcyB1cCB0by4KKyAqIAorICovCit2b2lkCitkYnVzX3NodXRkb3duICh2b2lkKQoreworICB3aGlsZSAocmVnaXN0ZXJlZF9nbG9iYWxzICE9IE5VTEwpCisgICAgeworICAgICAgU2h1dGRvd25DbG9zdXJlICpjOworCisgICAgICBjID0gcmVnaXN0ZXJlZF9nbG9iYWxzOworICAgICAgcmVnaXN0ZXJlZF9nbG9iYWxzID0gYy0+bmV4dDsKKyAgICAgIAorICAgICAgKCogYy0+ZnVuYykgKGMtPmRhdGEpOworICAgICAgCisgICAgICBkYnVzX2ZyZWUgKGMpOworICAgIH0KKworICAvKiBXZSB3cmFwIHRoaXMgaW4gdGhlIHRocmVhZC1pbml0aWFsaXphdGlvbiBsb2NrIGJlY2F1c2UKKyAgICogZGJ1c190aHJlYWRzX2luaXQoKSB1c2VzIHRoZSBjdXJyZW50IGdlbmVyYXRpb24gdG8gdGVsbCB3aGV0aGVyCisgICAqIHdlJ3JlIGluaXRpYWxpemVkLCBzbyB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHVuLWluaXRpYWxpemluZworICAgKiBwcm9wYWdhdGVzIGludG8gYWxsIHRocmVhZHMuICovCisgIF9kYnVzX3RocmVhZHNfbG9ja19wbGF0Zm9ybV9zcGVjaWZpYyAoKTsKKyAgX2RidXNfY3VycmVudF9nZW5lcmF0aW9uICs9IDE7CisgIF9kYnVzX3RocmVhZHNfdW5sb2NrX3BsYXRmb3JtX3NwZWNpZmljICgpOworfQorCisvKiogQH0gKi8gLyoqIEVuZCBvZiBwdWJsaWMgQVBJIGRvY3MgYmxvY2sgKi8KKworI2lmZGVmIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTCisjaW5jbHVkZSAiZGJ1cy10ZXN0LmgiCisKKy8qKgorICogQGluZ3JvdXAgREJ1c01lbW9yeUludGVybmFscworICogVW5pdCB0ZXN0IGZvciBEQnVzTWVtb3J5CisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzLgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfbWVtb3J5X3Rlc3QgKHZvaWQpCit7CisgIGRidXNfYm9vbF90IG9sZF9ndWFyZHM7CisgIHZvaWQgKnA7CisgIHNpemVfdCBzaXplOworCisgIG9sZF9ndWFyZHMgPSBndWFyZHM7CisgIGd1YXJkcyA9IFRSVUU7CisgIHAgPSBkYnVzX21hbGxvYyAoNCk7CisgIGlmIChwID09IE5VTEwpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5Iik7CisgIGZvciAoc2l6ZSA9IDQ7IHNpemUgPCAyNTY7IHNpemUgKz0gNCkKKyAgICB7CisgICAgICBwID0gZGJ1c19yZWFsbG9jIChwLCBzaXplKTsKKyAgICAgIGlmIChwID09IE5VTEwpCisJX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5Iik7CisgICAgfQorICBmb3IgKHNpemUgPSAyNTY7IHNpemUgIT0gMDsgc2l6ZSAtPSA0KQorICAgIHsKKyAgICAgIHAgPSBkYnVzX3JlYWxsb2MgKHAsIHNpemUpOworICAgICAgaWYgKHAgPT0gTlVMTCkKKwlfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkiKTsKKyAgICB9CisgIGRidXNfZnJlZSAocCk7CisgIGd1YXJkcyA9IG9sZF9ndWFyZHM7CisgIHJldHVybiBUUlVFOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1tZW1vcnkuaCBiL2RidXMvZGJ1cy1tZW1vcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTc1YjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLW1lbW9yeS5oCkBAIC0wLDAgKzEsNzIgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1tZW1vcnkuaCAgRC1CdXMgbWVtb3J5IGhhbmRsaW5nCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyICBSZWQgSGF0IEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKyNpZiAhZGVmaW5lZCAoREJVU19JTlNJREVfREJVU19IKSAmJiAhZGVmaW5lZCAoREJVU19DT01QSUxBVElPTikKKyNlcnJvciAiT25seSA8ZGJ1cy9kYnVzLmg+IGNhbiBiZSBpbmNsdWRlZCBkaXJlY3RseSwgdGhpcyBmaWxlIG1heSBkaXNhcHBlYXIgb3IgY2hhbmdlIGNvbnRlbnRzLiIKKyNlbmRpZgorCisjaWZuZGVmIERCVVNfTUVNT1JZX0gKKyNkZWZpbmUgREJVU19NRU1PUllfSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLW1hY3Jvcy5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCitEQlVTX0JFR0lOX0RFQ0xTCisKKy8qKgorICogQGFkZHRvZ3JvdXAgREJ1c01lbW9yeQorICogQHsKKyAqLworCitEQlVTX0VYUE9SVAorREJVU19NQUxMT0MKK0RCVVNfQUxMT0NfU0laRSgxKQordm9pZCogZGJ1c19tYWxsb2MgICAgICAgIChzaXplX3QgYnl0ZXMpOworCitEQlVTX0VYUE9SVAorREJVU19NQUxMT0MKK0RCVVNfQUxMT0NfU0laRSgxKQordm9pZCogZGJ1c19tYWxsb2MwICAgICAgIChzaXplX3QgYnl0ZXMpOworCitEQlVTX0VYUE9SVAorREJVU19BTExPQ19TSVpFKDIpCit2b2lkKiBkYnVzX3JlYWxsb2MgICAgICAgKHZvaWQgICptZW1vcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBieXRlcyk7CitEQlVTX0VYUE9SVAordm9pZCAgZGJ1c19mcmVlICAgICAgICAgICh2b2lkICAqbWVtb3J5KTsKKworI2RlZmluZSBkYnVzX25ldyh0eXBlLCBjb3VudCkgICgodHlwZSopZGJ1c19tYWxsb2MgKHNpemVvZiAodHlwZSkgKiAoY291bnQpKSkKKyNkZWZpbmUgZGJ1c19uZXcwKHR5cGUsIGNvdW50KSAoKHR5cGUqKWRidXNfbWFsbG9jMCAoc2l6ZW9mICh0eXBlKSAqIChjb3VudCkpKQorCitEQlVTX0VYUE9SVAordm9pZCBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5IChjaGFyICoqc3RyX2FycmF5KTsKKwordHlwZWRlZiB2b2lkICgqIERCdXNGcmVlRnVuY3Rpb24pICh2b2lkICptZW1vcnkpOworCitEQlVTX0VYUE9SVAordm9pZCBkYnVzX3NodXRkb3duICh2b2lkKTsKKworLyoqIEB9ICovCisKK0RCVVNfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBEQlVTX01FTU9SWV9IICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtbWVtcG9vbC5jIGIvZGJ1cy9kYnVzLW1lbXBvb2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjQ2NjE1Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLW1lbXBvb2wuYwpAQCAtMCwwICsxLDY0NyBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLW1lbXBvb2wuaCBNZW1vcnkgcG9vbHMKKyAqIAorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzICBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLW1lbXBvb2wuaCIKKyNpbmNsdWRlICJkYnVzLWludGVybmFscy5oIgorI2luY2x1ZGUgImRidXMtdmFsZ3JpbmQtaW50ZXJuYWwuaCIKKworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c01lbVBvb2wgbWVtb3J5IHBvb2xzCisgKiBAaW5ncm91cCAgREJ1c0ludGVybmFscworICogQGJyaWVmIERCdXNNZW1Qb29sIG9iamVjdAorICoKKyAqIFR5cGVzIGFuZCBmdW5jdGlvbnMgcmVsYXRlZCB0byBEQnVzTWVtUG9vbC4gIEEgbWVtb3J5IHBvb2wgaXMgdXNlZAorICogdG8gZGVjcmVhc2UgbWVtb3J5IGZyYWdtZW50YXRpb24vb3ZlcmhlYWQgYW5kIGluY3JlYXNlIHNwZWVkIGZvcgorICogYmxvY2tzIG9mIHNtYWxsIHVuaWZvcm1seS1zaXplZCBvYmplY3RzLiBUaGUgbWFpbiBwb2ludCBpcyB0byBhdm9pZAorICogdGhlIG92ZXJoZWFkIG9mIGEgbWFsbG9jIGJsb2NrIGZvciBlYWNoIHNtYWxsIG9iamVjdCwgc3BlZWQgaXMKKyAqIHNlY29uZGFyeS4KKyAqLworCisvKioKKyAqIEBkZWZncm91cCBEQnVzTWVtUG9vbEludGVybmFscyBNZW1vcnkgcG9vbCBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzCisgKiBAaW5ncm91cCAgREJ1c0ludGVybmFscworICogQGJyaWVmIERCdXNNZW1Qb29sIGltcGxlbWVudGF0aW9uIGRldGFpbHMKKyAqCisgKiBUaGUgZ3V0cyBvZiBEQnVzTWVtUG9vbC4KKyAqCisgKiBAeworICovCisKKy8qKgorICogdHlwZWRlZiBzbyBEQnVzRnJlZWRFbGVtZW50IHN0cnVjdCBjYW4gcmVmZXIgdG8gaXRzZWxmLgorICovCit0eXBlZGVmIHN0cnVjdCBEQnVzRnJlZWRFbGVtZW50IERCdXNGcmVlZEVsZW1lbnQ7CisKKy8qKgorICogc3RydWN0IHJlcHJlc2VudGluZyBhbiBlbGVtZW50IG9uIHRoZSBmcmVlIGxpc3QuCisgKiBXZSBqdXN0IGNhc3QgZnJlZWQgZWxlbWVudHMgdG8gdGhpcyBzbyB3ZSBjYW4KKyAqIG1ha2UgYSBsaXN0IG91dCBvZiB0aGVtLgorICovCitzdHJ1Y3QgREJ1c0ZyZWVkRWxlbWVudAoreworICBEQnVzRnJlZWRFbGVtZW50ICpuZXh0OyAvKio8IG5leHQgZWxlbWVudCBvZiB0aGUgZnJlZSBsaXN0ICovCit9OworCisvKioKKyAqIFRoZSBkdW1teSBzaXplIG9mIHRoZSB2YXJpYWJsZS1sZW5ndGggImVsZW1lbnRzIgorICogZmllbGQgaW4gREJ1c01lbUJsb2NrCisgKi8KKyNkZWZpbmUgRUxFTUVOVF9QQURESU5HIDQKKworLyoqCisgKiBUeXBlZGVmIGZvciBEQnVzTWVtQmxvY2sgc28gdGhlIHN0cnVjdCBjYW4gcmVjdXJzaXZlbHkKKyAqIHBvaW50IHRvIGl0c2VsZi4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgREJ1c01lbUJsb2NrIERCdXNNZW1CbG9jazsKKworLyoqCisgKiBEQnVzTWVtQmxvY2sgb2JqZWN0IHJlcHJlc2VudHMgYSBzaW5nbGUgbWFsbG9jKCktcmV0dXJuZWQKKyAqIGJsb2NrIHRoYXQgZ2V0cyBjaHVua2VkIHVwIGludG8gb2JqZWN0cyBpbiB0aGUgbWVtb3J5IHBvb2wuCisgKi8KK3N0cnVjdCBEQnVzTWVtQmxvY2sKK3sKKyAgREJ1c01lbUJsb2NrICpuZXh0OyAgLyoqPCBuZXh0IGJsb2NrIGluIHRoZSBsaXN0LCB3aGljaCBpcyBhbHJlYWR5IHVzZWQgdXA7CisgICAgICAgICAgICAgICAgICAgICAgICAqICAgb25seSBzYXZlZCBzbyB3ZSBjYW4gZnJlZSBhbGwgdGhlIGJsb2NrcworICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHdoZW4gd2UgZnJlZSB0aGUgbWVtIHBvb2wuCisgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgIC8qIHRoaXMgaXMgYSBsb25nIHNvIHRoYXQgImVsZW1lbnRzIiBpcyBhbGlnbmVkICovCisgIGxvbmcgdXNlZF9zb19mYXI7ICAgICAvKio8IGJ5dGVzIG9mIHRoaXMgYmxvY2sgYWxyZWFkeSBhbGxvY2F0ZWQgYXMgZWxlbWVudHMuICovCisgIAorICB1bnNpZ25lZCBjaGFyIGVsZW1lbnRzW0VMRU1FTlRfUEFERElOR107IC8qKjwgdGhlIGJsb2NrIGRhdGEsIGFjdHVhbGx5IGFsbG9jYXRlZCB0byByZXF1aXJlZCBzaXplICovCit9OworCisvKioKKyAqIEludGVybmFscyBmaWVsZHMgb2YgREJ1c01lbVBvb2wKKyAqLworc3RydWN0IERCdXNNZW1Qb29sCit7CisgIGludCBlbGVtZW50X3NpemU7ICAgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiBhIHNpbmdsZSBvYmplY3QgaW4gdGhlIHBvb2wgKi8KKyAgaW50IGJsb2NrX3NpemU7ICAgICAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIG1vc3QgcmVjZW50bHkgYWxsb2NhdGVkIGJsb2NrICovCisgIHVuc2lnbmVkIGludCB6ZXJvX2VsZW1lbnRzIDogMTsgIC8qKjwgd2hldGhlciB0byB6ZXJvLWluaXQgYWxsb2NhdGVkIGVsZW1lbnRzICovCisKKyAgREJ1c0ZyZWVkRWxlbWVudCAqZnJlZV9lbGVtZW50czsgLyoqPCBhIGZyZWUgbGlzdCBvZiBlbGVtZW50cyB0byByZWN5Y2xlICovCisgIERCdXNNZW1CbG9jayAqYmxvY2tzOyAgICAgICAgICAgIC8qKjwgYmxvY2tzIG9mIG1lbW9yeSBmcm9tIG1hbGxvYygpICovCisgIGludCBhbGxvY2F0ZWRfZWxlbWVudHM7ICAgICAgICAgIC8qKjwgQ291bnQgb2Ygb3V0c3RhbmRpbmcgYWxsb2NhdGVkIGVsZW1lbnRzICovCit9OworCisvKiogQH0gKi8KKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzTWVtUG9vbAorICoKKyAqIEB7CisgKi8KKworLyoqCisgKiBAdHlwZWRlZiBEQnVzTWVtUG9vbAorICoKKyAqIE9wYXF1ZSBvYmplY3QgcmVwcmVzZW50aW5nIGEgbWVtb3J5IHBvb2wuIE1lbW9yeSBwb29scyBhbGxvdworICogYXZvaWRpbmcgcGVyLW1hbGxvYy1ibG9jayBtZW1vcnkgb3ZlcmhlYWQgd2hlbiBhbGxvY2F0aW5nIGEgbG90IG9mCisgKiBzbWFsbCBvYmplY3RzIHRoYXQgYXJlIGFsbCB0aGUgc2FtZSBzaXplLiBUaGV5IGFyZSBzbGlnaHRseQorICogZmFzdGVyIHRoYW4gY2FsbGluZyBtYWxsb2MoKSBhbHNvLgorICovCisKKy8qKgorICogQ3JlYXRlcyBhIG5ldyBtZW1vcnkgcG9vbCwgb3IgcmV0dXJucyAjTlVMTCBvbiBmYWlsdXJlLiAgT2JqZWN0cyBpbgorICogdGhlIHBvb2wgbXVzdCBiZSBhdCBsZWFzdCBzaXplb2Yodm9pZCopIGJ5dGVzIGVhY2gsIGR1ZSB0byB0aGUgd2F5CisgKiBtZW1vcnkgcG9vbHMgd29yay4gVG8gYXZvaWQgY3JlYXRpbmcgNjQgYml0IHByb2JsZW1zLCB0aGlzIG1lYW5zIGF0CisgKiBsZWFzdCA4IGJ5dGVzIG9uIGFsbCBwbGF0Zm9ybXMsIHVubGVzcyB5b3UgYXJlIDQgYnl0ZXMgb24gMzItYml0CisgKiBhbmQgOCBieXRlcyBvbiA2NC1iaXQuCisgKgorICogQHBhcmFtIGVsZW1lbnRfc2l6ZSBzaXplIG9mIGFuIGVsZW1lbnQgYWxsb2NhdGVkIGZyb20gdGhlIHBvb2wuCisgKiBAcGFyYW0gemVyb19lbGVtZW50cyB3aGV0aGVyIHRvIHplcm8taW5pdGlhbGl6ZSBlbGVtZW50cworICogQHJldHVybnMgdGhlIG5ldyBwb29sIG9yICNOVUxMCisgKi8KK0RCdXNNZW1Qb29sKgorX2RidXNfbWVtX3Bvb2xfbmV3IChpbnQgZWxlbWVudF9zaXplLAorICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCB6ZXJvX2VsZW1lbnRzKQoreworICBEQnVzTWVtUG9vbCAqcG9vbDsKKworICBwb29sID0gZGJ1c19uZXcwIChEQnVzTWVtUG9vbCwgMSk7CisgIGlmIChwb29sID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgLyogTWFrZSB0aGUgZWxlbWVudCBzaXplIGF0IGxlYXN0IDggYnl0ZXMuICovCisgIGlmIChlbGVtZW50X3NpemUgPCA4KQorICAgIGVsZW1lbnRfc2l6ZSA9IDg7CisgIAorICAvKiB0aGVzZSBhc3NlcnRpb25zIGFyZSBlcXVpdmFsZW50IGJ1dCB0aGUgZmlyc3QgaXMgbW9yZSBjbGVhcgorICAgKiB0byBwcm9ncmFtbWVycyB0aGF0IHNlZSBpdCBmYWlsLgorICAgKi8KKyAgX2RidXNfYXNzZXJ0IChlbGVtZW50X3NpemUgPj0gKGludCkgc2l6ZW9mICh2b2lkKikpOworICBfZGJ1c19hc3NlcnQgKGVsZW1lbnRfc2l6ZSA+PSAoaW50KSBzaXplb2YgKERCdXNGcmVlZEVsZW1lbnQpKTsKKworICAvKiBhbGlnbiB0aGUgZWxlbWVudCBzaXplIHRvIGEgcG9pbnRlciBib3VuZGFyeSBzbyB3ZSB3b24ndCBnZXQgYnVzCisgICAqIGVycm9ycyB1bmRlciBvdGhlciBhcmNoaXRlY3R1cmVzLiAgCisgICAqLworICBwb29sLT5lbGVtZW50X3NpemUgPSBfREJVU19BTElHTl9WQUxVRSAoZWxlbWVudF9zaXplLCBzaXplb2YgKHZvaWQgKikpOworCisgIHBvb2wtPnplcm9fZWxlbWVudHMgPSB6ZXJvX2VsZW1lbnRzICE9IEZBTFNFOworCisgIHBvb2wtPmFsbG9jYXRlZF9lbGVtZW50cyA9IDA7CisgIAorICAvKiBwaWNrIGEgc2l6ZSBmb3IgdGhlIGZpcnN0IGJsb2NrOyBpdCBpbmNyZWFzZXMKKyAgICogZm9yIGVhY2ggYmxvY2sgd2UgbmVlZCB0byBhbGxvY2F0ZS4gVGhpcyBpcworICAgKiBhY3R1YWxseSBoYWxmIHRoZSBpbml0aWFsIGJsb2NrIHNpemUKKyAgICogc2luY2UgX2RidXNfbWVtX3Bvb2xfYWxsb2MoKSB1bmNvbmRpdGlvbmFsbHkKKyAgICogZG91YmxlcyBpdCBwcmlvciB0byBjcmVhdGluZyBhIG5ldyBibG9jay4gICovCisgIHBvb2wtPmJsb2NrX3NpemUgPSBwb29sLT5lbGVtZW50X3NpemUgKiA4OworCisgIF9kYnVzX2Fzc2VydCAoKHBvb2wtPmJsb2NrX3NpemUgJQorICAgICAgICAgICAgICAgICBwb29sLT5lbGVtZW50X3NpemUpID09IDApOworCisgIFZBTEdSSU5EX0NSRUFURV9NRU1QT09MIChwb29sLCAwLCB6ZXJvX2VsZW1lbnRzKTsKKworICByZXR1cm4gcG9vbDsKK30KKworLyoqCisgKiBGcmVlcyBhIG1lbW9yeSBwb29sIChhbmQgYWxsIGVsZW1lbnRzIGFsbG9jYXRlZCBmcm9tIGl0KS4KKyAqCisgKiBAcGFyYW0gcG9vbCB0aGUgbWVtb3J5IHBvb2wuCisgKi8KK3ZvaWQKK19kYnVzX21lbV9wb29sX2ZyZWUgKERCdXNNZW1Qb29sICpwb29sKQoreworICBEQnVzTWVtQmxvY2sgKmJsb2NrOworCisgIFZBTEdSSU5EX0RFU1RST1lfTUVNUE9PTCAocG9vbCk7CisKKyAgYmxvY2sgPSBwb29sLT5ibG9ja3M7CisgIHdoaWxlIChibG9jayAhPSBOVUxMKQorICAgIHsKKyAgICAgIERCdXNNZW1CbG9jayAqbmV4dCA9IGJsb2NrLT5uZXh0OworCisgICAgICBkYnVzX2ZyZWUgKGJsb2NrKTsKKworICAgICAgYmxvY2sgPSBuZXh0OworICAgIH0KKworICBkYnVzX2ZyZWUgKHBvb2wpOworfQorCisvKioKKyAqIEFsbG9jYXRlcyBhbiBvYmplY3QgZnJvbSB0aGUgbWVtb3J5IHBvb2wuCisgKiBUaGUgb2JqZWN0IG11c3QgYmUgZnJlZWQgd2l0aCBfZGJ1c19tZW1fcG9vbF9kZWFsbG9jKCkuCisgKgorICogQHBhcmFtIHBvb2wgdGhlIG1lbW9yeSBwb29sCisgKiBAcmV0dXJucyB0aGUgYWxsb2NhdGVkIG9iamVjdCBvciAjTlVMTCBpZiBubyBtZW1vcnkuCisgKi8KK3ZvaWQqCitfZGJ1c19tZW1fcG9vbF9hbGxvYyAoREJ1c01lbVBvb2wgKnBvb2wpCit7CisjaWZkZWYgREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMKKyAgaWYgKF9kYnVzX2Rpc2FibGVfbWVtX3Bvb2xzICgpKQorICAgIHsKKyAgICAgIERCdXNNZW1CbG9jayAqYmxvY2s7CisgICAgICBpbnQgYWxsb2Nfc2l6ZTsKKyAgICAgIAorICAgICAgLyogVGhpcyBpcyBvYnZpb3VzbHkgcmVhbGx5IHNpbGx5LCBidXQgaXQncworICAgICAgICogZGVidWctbW9kZS1vbmx5IGNvZGUgdGhhdCBpcyBjb21waWxlZCBvdXQKKyAgICAgICAqIHdoZW4gdGVzdHMgYXJlIGRpc2FibGVkIChfZGJ1c19kaXNhYmxlX21lbV9wb29scygpCisgICAgICAgKiBpcyBhIGNvbnN0YW50IGV4cHJlc3Npb24gRkFMU0Ugc28gdGhpcyBibG9jaworICAgICAgICogc2hvdWxkIHZhbmlzaCkKKyAgICAgICAqLworICAgICAgCisgICAgICBhbGxvY19zaXplID0gc2l6ZW9mIChEQnVzTWVtQmxvY2spIC0gRUxFTUVOVF9QQURESU5HICsKKyAgICAgICAgcG9vbC0+ZWxlbWVudF9zaXplOworICAgICAgCisgICAgICBpZiAocG9vbC0+emVyb19lbGVtZW50cykKKyAgICAgICAgYmxvY2sgPSBkYnVzX21hbGxvYzAgKGFsbG9jX3NpemUpOworICAgICAgZWxzZQorICAgICAgICBibG9jayA9IGRidXNfbWFsbG9jIChhbGxvY19zaXplKTsKKworICAgICAgaWYgKGJsb2NrICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBibG9jay0+bmV4dCA9IHBvb2wtPmJsb2NrczsKKyAgICAgICAgICBwb29sLT5ibG9ja3MgPSBibG9jazsKKyAgICAgICAgICBwb29sLT5hbGxvY2F0ZWRfZWxlbWVudHMgKz0gMTsKKworICAgICAgICAgIFZBTEdSSU5EX01FTVBPT0xfQUxMT0MgKHBvb2wsICh2b2lkICopICZibG9jay0+ZWxlbWVudHNbMF0sCisgICAgICAgICAgICAgIHBvb2wtPmVsZW1lbnRfc2l6ZSk7CisgICAgICAgICAgcmV0dXJuICh2b2lkKikgJmJsb2NrLT5lbGVtZW50c1swXTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIGVsc2UKKyNlbmRpZgorICAgIHsKKyAgICAgIGlmIChfZGJ1c19kZWNyZW1lbnRfZmFpbF9hbGxvY19jb3VudGVyICgpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiBGQUlMSU5HIG1lbXBvb2wgYWxsb2NcbiIpOworICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChwb29sLT5mcmVlX2VsZW1lbnRzKQorICAgICAgICB7CisgICAgICAgICAgREJ1c0ZyZWVkRWxlbWVudCAqZWxlbWVudCA9IHBvb2wtPmZyZWVfZWxlbWVudHM7CisKKyAgICAgICAgICBwb29sLT5mcmVlX2VsZW1lbnRzID0gcG9vbC0+ZnJlZV9lbGVtZW50cy0+bmV4dDsKKworICAgICAgICAgIFZBTEdSSU5EX01FTVBPT0xfQUxMT0MgKHBvb2wsIGVsZW1lbnQsIHBvb2wtPmVsZW1lbnRfc2l6ZSk7CisKKyAgICAgICAgICBpZiAocG9vbC0+emVyb19lbGVtZW50cykKKyAgICAgICAgICAgIG1lbXNldCAoZWxlbWVudCwgJ1wwJywgcG9vbC0+ZWxlbWVudF9zaXplKTsKKworICAgICAgICAgIHBvb2wtPmFsbG9jYXRlZF9lbGVtZW50cyArPSAxOworCisgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHZvaWQgKmVsZW1lbnQ7CisgICAgICAKKyAgICAgICAgICBpZiAocG9vbC0+YmxvY2tzID09IE5VTEwgfHwKKyAgICAgICAgICAgICAgcG9vbC0+YmxvY2tzLT51c2VkX3NvX2ZhciA9PSBwb29sLT5ibG9ja19zaXplKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvKiBOZWVkIGEgbmV3IGJsb2NrICovCisgICAgICAgICAgICAgIERCdXNNZW1CbG9jayAqYmxvY2s7CisgICAgICAgICAgICAgIGludCBhbGxvY19zaXplOworI2lmZGVmIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTCisgICAgICAgICAgICAgIGludCBzYXZlZF9jb3VudGVyOworI2VuZGlmCisgICAgICAgICAgCisgICAgICAgICAgICAgIGlmIChwb29sLT5ibG9ja19zaXplIDw9IF9EQlVTX0lOVF9NQVggLyA0KSAvKiBhdm9pZCBvdmVyZmxvdyAqLworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIC8qIHVzZSBhIGxhcmdlciBibG9jayBzaXplIGZvciBvdXIgbmV4dCBibG9jayAqLworICAgICAgICAgICAgICAgICAgcG9vbC0+YmxvY2tfc2l6ZSAqPSAyOworICAgICAgICAgICAgICAgICAgX2RidXNfYXNzZXJ0ICgocG9vbC0+YmxvY2tfc2l6ZSAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb29sLT5lbGVtZW50X3NpemUpID09IDApOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBhbGxvY19zaXplID0gc2l6ZW9mIChEQnVzTWVtQmxvY2spIC0gRUxFTUVOVF9QQURESU5HICsgcG9vbC0+YmxvY2tfc2l6ZTsKKworI2lmZGVmIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTCisgICAgICAgICAgICAgIC8qIFdlIHNhdmUvcmVzdG9yZSB0aGUgY291bnRlciwgc28gdGhhdCBtZW1vcnkgcG9vbHMgd29uJ3QKKyAgICAgICAgICAgICAgICogY2F1c2UgYSBnaXZlbiBmdW5jdGlvbiB0byBoYXZlIGRpZmZlcmVudCBudW1iZXIgb2YKKyAgICAgICAgICAgICAgICogYWxsb2NhdGlvbnMgb24gZGlmZmVyZW50IGludm9jYXRpb25zLiBpLmUuICB3aGVuIHRlc3RpbmcKKyAgICAgICAgICAgICAgICogd2Ugd2FudCBjb25zaXN0ZW50IGFsbG9jIHBhdHRlcm5zLiBTbyB3ZSBza2lwIG91cgorICAgICAgICAgICAgICAgKiBtYWxsb2MgaGVyZSBmb3IgcHVycG9zZXMgb2YgZmFpbGVkIGFsbG9jIHNpbXVsYXRpb24uCisgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICBzYXZlZF9jb3VudGVyID0gX2RidXNfZ2V0X2ZhaWxfYWxsb2NfY291bnRlciAoKTsKKyAgICAgICAgICAgICAgX2RidXNfc2V0X2ZhaWxfYWxsb2NfY291bnRlciAoX0RCVVNfSU5UX01BWCk7CisjZW5kaWYKKyAgICAgICAgICAKKyAgICAgICAgICAgICAgaWYgKHBvb2wtPnplcm9fZWxlbWVudHMpCisgICAgICAgICAgICAgICAgYmxvY2sgPSBkYnVzX21hbGxvYzAgKGFsbG9jX3NpemUpOworICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYmxvY2sgPSBkYnVzX21hbGxvYyAoYWxsb2Nfc2l6ZSk7CisKKyNpZmRlZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworICAgICAgICAgICAgICBfZGJ1c19zZXRfZmFpbF9hbGxvY19jb3VudGVyIChzYXZlZF9jb3VudGVyKTsKKyAgICAgICAgICAgICAgX2RidXNfYXNzZXJ0IChzYXZlZF9jb3VudGVyID09IF9kYnVzX2dldF9mYWlsX2FsbG9jX2NvdW50ZXIgKCkpOworI2VuZGlmCisgICAgICAgICAgCisgICAgICAgICAgICAgIGlmIChibG9jayA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworCisgICAgICAgICAgICAgIGJsb2NrLT51c2VkX3NvX2ZhciA9IDA7CisgICAgICAgICAgICAgIGJsb2NrLT5uZXh0ID0gcG9vbC0+YmxvY2tzOworICAgICAgICAgICAgICBwb29sLT5ibG9ja3MgPSBibG9jazsgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAKKyAgICAgICAgICBlbGVtZW50ID0gJnBvb2wtPmJsb2Nrcy0+ZWxlbWVudHNbcG9vbC0+YmxvY2tzLT51c2VkX3NvX2Zhcl07CisgICAgICAgICAgCisgICAgICAgICAgcG9vbC0+YmxvY2tzLT51c2VkX3NvX2ZhciArPSBwb29sLT5lbGVtZW50X3NpemU7CisKKyAgICAgICAgICBwb29sLT5hbGxvY2F0ZWRfZWxlbWVudHMgKz0gMTsKKworICAgICAgICAgIFZBTEdSSU5EX01FTVBPT0xfQUxMT0MgKHBvb2wsIGVsZW1lbnQsIHBvb2wtPmVsZW1lbnRfc2l6ZSk7CisgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKgorICogRGVhbGxvY2F0ZXMgYW4gb2JqZWN0IHByZXZpb3VzbHkgY3JlYXRlZCB3aXRoCisgKiBfZGJ1c19tZW1fcG9vbF9hbGxvYygpLiBUaGUgcHJldmlvdXMgb2JqZWN0CisgKiBtdXN0IGhhdmUgY29tZSBmcm9tIHRoaXMgc2FtZSBwb29sLgorICogQHBhcmFtIHBvb2wgdGhlIG1lbW9yeSBwb29sCisgKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudCBlYXJsaWVyIGFsbG9jYXRlZC4KKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZXJlIGFyZSBubyByZW1haW5pbmcgYWxsb2NhdGVkIGVsZW1lbnRzCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19tZW1fcG9vbF9kZWFsbG9jIChEQnVzTWVtUG9vbCAqcG9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICplbGVtZW50KQoreworICBWQUxHUklORF9NRU1QT09MX0ZSRUUgKHBvb2wsIGVsZW1lbnQpOworCisjaWZkZWYgREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMKKyAgaWYgKF9kYnVzX2Rpc2FibGVfbWVtX3Bvb2xzICgpKQorICAgIHsKKyAgICAgIERCdXNNZW1CbG9jayAqYmxvY2s7CisgICAgICBEQnVzTWVtQmxvY2sgKnByZXY7CisKKyAgICAgIC8qIG1tbSwgZmFzdC4gOy0pIGRlYnVnLW9ubHkgY29kZSwgc28gZG9lc24ndCBtYXR0ZXIuICovCisgICAgICAKKyAgICAgIHByZXYgPSBOVUxMOworICAgICAgYmxvY2sgPSBwb29sLT5ibG9ja3M7CisKKyAgICAgIHdoaWxlIChibG9jayAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGJsb2NrLT5lbGVtZW50cyA9PSAodW5zaWduZWQgY2hhciopIGVsZW1lbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmIChwcmV2KQorICAgICAgICAgICAgICAgIHByZXYtPm5leHQgPSBibG9jay0+bmV4dDsKKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHBvb2wtPmJsb2NrcyA9IGJsb2NrLT5uZXh0OworICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgZGJ1c19mcmVlIChibG9jayk7CisKKyAgICAgICAgICAgICAgX2RidXNfYXNzZXJ0IChwb29sLT5hbGxvY2F0ZWRfZWxlbWVudHMgPiAwKTsKKyAgICAgICAgICAgICAgcG9vbC0+YWxsb2NhdGVkX2VsZW1lbnRzIC09IDE7CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBpZiAocG9vbC0+YWxsb2NhdGVkX2VsZW1lbnRzID09IDApCisgICAgICAgICAgICAgICAgX2RidXNfYXNzZXJ0IChwb29sLT5ibG9ja3MgPT0gTlVMTCk7CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICByZXR1cm4gcG9vbC0+YmxvY2tzID09IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgcHJldiA9IGJsb2NrOworICAgICAgICAgIGJsb2NrID0gYmxvY2stPm5leHQ7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZnJlZWQgbm9uZXhpc3RlbnQgYmxvY2siKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIGVsc2UKKyNlbmRpZgorICAgIHsKKyAgICAgIERCdXNGcmVlZEVsZW1lbnQgKmZyZWVkOworICAgICAgCisgICAgICBmcmVlZCA9IGVsZW1lbnQ7CisgICAgICAvKiB1c2VkIGZvciBpbnRlcm5hbCBtZW1wb29sIGFkbWluaXN0cmF0aW9uICovCisgICAgICBWQUxHUklORF9NQUtFX01FTV9VTkRFRklORUQgKGZyZWVkLCBzaXplb2YgKCpmcmVlZCkpOworCisgICAgICBmcmVlZC0+bmV4dCA9IHBvb2wtPmZyZWVfZWxlbWVudHM7CisgICAgICBwb29sLT5mcmVlX2VsZW1lbnRzID0gZnJlZWQ7CisgICAgICAKKyAgICAgIF9kYnVzX2Fzc2VydCAocG9vbC0+YWxsb2NhdGVkX2VsZW1lbnRzID4gMCk7CisgICAgICBwb29sLT5hbGxvY2F0ZWRfZWxlbWVudHMgLT0gMTsKKyAgICAgIAorICAgICAgcmV0dXJuIHBvb2wtPmFsbG9jYXRlZF9lbGVtZW50cyA9PSAwOworICAgIH0KK30KKworI2lmZGVmIERCVVNfRU5BQkxFX1NUQVRTCit2b2lkCitfZGJ1c19tZW1fcG9vbF9nZXRfc3RhdHMgKERCdXNNZW1Qb29sICAgKnBvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgKmluX3VzZV9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90ICppbl9mcmVlX2xpc3RfcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAqYWxsb2NhdGVkX3ApCit7CisgIERCdXNNZW1CbG9jayAqYmxvY2s7CisgIERCdXNGcmVlZEVsZW1lbnQgKmZyZWVkOworICBkYnVzX3VpbnQzMl90IGluX3VzZSA9IDA7CisgIGRidXNfdWludDMyX3QgaW5fZnJlZV9saXN0ID0gMDsKKyAgZGJ1c191aW50MzJfdCBhbGxvY2F0ZWQgPSAwOworCisgIGlmIChwb29sICE9IE5VTEwpCisgICAgeworICAgICAgaW5fdXNlID0gcG9vbC0+ZWxlbWVudF9zaXplICogcG9vbC0+YWxsb2NhdGVkX2VsZW1lbnRzOworCisgICAgICBmb3IgKGZyZWVkID0gcG9vbC0+ZnJlZV9lbGVtZW50czsgZnJlZWQgIT0gTlVMTDsgZnJlZWQgPSBmcmVlZC0+bmV4dCkKKyAgICAgICAgeworICAgICAgICAgIGluX2ZyZWVfbGlzdCArPSBwb29sLT5lbGVtZW50X3NpemU7CisgICAgICAgIH0KKworICAgICAgZm9yIChibG9jayA9IHBvb2wtPmJsb2NrczsgYmxvY2sgIT0gTlVMTDsgYmxvY2sgPSBibG9jay0+bmV4dCkKKyAgICAgICAgeworICAgICAgICAgIGlmIChibG9jayA9PSBwb29sLT5ibG9ja3MpCisgICAgICAgICAgICBhbGxvY2F0ZWQgKz0gcG9vbC0+YmxvY2tfc2l6ZTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBhbGxvY2F0ZWQgKz0gYmxvY2stPnVzZWRfc29fZmFyOworICAgICAgICB9CisgICAgfQorCisgIGlmIChpbl91c2VfcCAhPSBOVUxMKQorICAgICppbl91c2VfcCA9IGluX3VzZTsKKworICBpZiAoaW5fZnJlZV9saXN0X3AgIT0gTlVMTCkKKyAgICAqaW5fZnJlZV9saXN0X3AgPSBpbl9mcmVlX2xpc3Q7CisKKyAgaWYgKGFsbG9jYXRlZF9wICE9IE5VTEwpCisgICAgKmFsbG9jYXRlZF9wID0gYWxsb2NhdGVkOworfQorI2VuZGlmIC8qIERCVVNfRU5BQkxFX1NUQVRTICovCisKKy8qKiBAfSAqLworCisjaWZkZWYgREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMKKyNpbmNsdWRlICJkYnVzLXRlc3QuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKworc3RhdGljIHZvaWQKK3RpbWVfZm9yX3NpemUgKGludCBzaXplKQoreworICBpbnQgaTsKKyAgaW50IGo7CisjaWZkZWYgREJVU19FTkFCTEVfVkVSQk9TRV9NT0RFCisgIGNsb2NrX3Qgc3RhcnQ7CisgIGNsb2NrX3QgZW5kOworI2VuZGlmCisjZGVmaW5lIEZSRUVfQVJSQVlfU0laRSA1MTIKKyNkZWZpbmUgTl9JVEVSQVRJT05TIEZSRUVfQVJSQVlfU0laRSAqIDUxMgorICB2b2lkICp0b19mcmVlW0ZSRUVfQVJSQVlfU0laRV07CisgIERCdXNNZW1Qb29sICpwb29sOworCisgIF9kYnVzX3ZlcmJvc2UgKCJUaW1pbmdzIGZvciBzaXplICVkXG4iLCBzaXplKTsKKyAgCisgIF9kYnVzX3ZlcmJvc2UgKCIgbWFsbG9jXG4iKTsKKyAgCisjaWZkZWYgREJVU19FTkFCTEVfVkVSQk9TRV9NT0RFCisgIHN0YXJ0ID0gY2xvY2sgKCk7CisjZW5kaWYKKworICBpID0gMDsKKyAgaiA9IDA7CisgIHdoaWxlIChpIDwgTl9JVEVSQVRJT05TKQorICAgIHsKKyAgICAgIHRvX2ZyZWVbal0gPSBkYnVzX21hbGxvYyAoc2l6ZSk7CisgICAgICBfZGJ1c19hc3NlcnQgKHRvX2ZyZWVbal0gIT0gTlVMTCk7IC8qIGluIGEgcmVhbCBhcHAgb2YgY291cnNlIHRoaXMgaXMgd3JvbmcgKi8KKworICAgICAgKytqOworCisgICAgICBpZiAoaiA9PSBGUkVFX0FSUkFZX1NJWkUpCisgICAgICAgIHsKKyAgICAgICAgICBqID0gMDsKKyAgICAgICAgICB3aGlsZSAoaiA8IEZSRUVfQVJSQVlfU0laRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c19mcmVlICh0b19mcmVlW2pdKTsKKyAgICAgICAgICAgICAgKytqOworICAgICAgICAgICAgfQorCisgICAgICAgICAgaiA9IDA7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgKytpOworICAgIH0KKworI2lmZGVmIERCVVNfRU5BQkxFX1ZFUkJPU0VfTU9ERQorICBlbmQgPSBjbG9jayAoKTsKKworICBfZGJ1c192ZXJib3NlICgiICBjcmVhdGVkL2Rlc3Ryb3llZCAlZCBlbGVtZW50cyBpbiAlZyBzZWNvbmRzXG4iLAorICAgICAgICAgICAgICAgICBOX0lURVJBVElPTlMsIChlbmQgLSBzdGFydCkgLyAoZG91YmxlKSBDTE9DS1NfUEVSX1NFQyk7CisKKworCisgIF9kYnVzX3ZlcmJvc2UgKCIgbWVtcG9vbHNcbiIpOworICAKKyAgc3RhcnQgPSBjbG9jayAoKTsKKyNlbmRpZgorCisgIHBvb2wgPSBfZGJ1c19tZW1fcG9vbF9uZXcgKHNpemUsIEZBTFNFKTsKKyAgCisgIGkgPSAwOworICBqID0gMDsKKyAgd2hpbGUgKGkgPCBOX0lURVJBVElPTlMpCisgICAgeworICAgICAgdG9fZnJlZVtqXSA9IF9kYnVzX21lbV9wb29sX2FsbG9jIChwb29sKTsgCisgICAgICBfZGJ1c19hc3NlcnQgKHRvX2ZyZWVbal0gIT0gTlVMTCk7ICAvKiBpbiBhIHJlYWwgYXBwIG9mIGNvdXJzZSB0aGlzIGlzIHdyb25nICovCisKKyAgICAgICsrajsKKworICAgICAgaWYgKGogPT0gRlJFRV9BUlJBWV9TSVpFKQorICAgICAgICB7CisgICAgICAgICAgaiA9IDA7CisgICAgICAgICAgd2hpbGUgKGogPCBGUkVFX0FSUkFZX1NJWkUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX21lbV9wb29sX2RlYWxsb2MgKHBvb2wsIHRvX2ZyZWVbal0pOworICAgICAgICAgICAgICArK2o7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBqID0gMDsKKyAgICAgICAgfQorICAgICAgCisgICAgICArK2k7CisgICAgfQorCisgIF9kYnVzX21lbV9wb29sX2ZyZWUgKHBvb2wpOworICAKKyNpZmRlZiBEQlVTX0VOQUJMRV9WRVJCT1NFX01PREUKKyAgZW5kID0gY2xvY2sgKCk7CisKKyAgX2RidXNfdmVyYm9zZSAoIiAgY3JlYXRlZC9kZXN0cm95ZWQgJWQgZWxlbWVudHMgaW4gJWcgc2Vjb25kc1xuIiwKKyAgICAgICAgICAgICAgICAgTl9JVEVSQVRJT05TLCAoZW5kIC0gc3RhcnQpIC8gKGRvdWJsZSkgQ0xPQ0tTX1BFUl9TRUMpOworCisgIF9kYnVzX3ZlcmJvc2UgKCIgemVyb2VkIG1hbGxvY1xuIik7CisgICAgCisgIHN0YXJ0ID0gY2xvY2sgKCk7CisjZW5kaWYKKyAgCisgIGkgPSAwOworICBqID0gMDsKKyAgd2hpbGUgKGkgPCBOX0lURVJBVElPTlMpCisgICAgeworICAgICAgdG9fZnJlZVtqXSA9IGRidXNfbWFsbG9jMCAoc2l6ZSk7CisgICAgICBfZGJ1c19hc3NlcnQgKHRvX2ZyZWVbal0gIT0gTlVMTCk7IC8qIGluIGEgcmVhbCBhcHAgb2YgY291cnNlIHRoaXMgaXMgd3JvbmcgKi8KKworICAgICAgKytqOworCisgICAgICBpZiAoaiA9PSBGUkVFX0FSUkFZX1NJWkUpCisgICAgICAgIHsKKyAgICAgICAgICBqID0gMDsKKyAgICAgICAgICB3aGlsZSAoaiA8IEZSRUVfQVJSQVlfU0laRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c19mcmVlICh0b19mcmVlW2pdKTsKKyAgICAgICAgICAgICAgKytqOworICAgICAgICAgICAgfQorCisgICAgICAgICAgaiA9IDA7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgKytpOworICAgIH0KKworI2lmZGVmIERCVVNfRU5BQkxFX1ZFUkJPU0VfTU9ERQorICBlbmQgPSBjbG9jayAoKTsKKworICBfZGJ1c192ZXJib3NlICgiICBjcmVhdGVkL2Rlc3Ryb3llZCAlZCBlbGVtZW50cyBpbiAlZyBzZWNvbmRzXG4iLAorICAgICAgICAgICAgICAgICBOX0lURVJBVElPTlMsIChlbmQgLSBzdGFydCkgLyAoZG91YmxlKSBDTE9DS1NfUEVSX1NFQyk7CisgIAorICBfZGJ1c192ZXJib3NlICgiIHplcm9lZCBtZW1wb29sc1xuIik7CisgIAorICBzdGFydCA9IGNsb2NrICgpOworI2VuZGlmCisKKyAgcG9vbCA9IF9kYnVzX21lbV9wb29sX25ldyAoc2l6ZSwgVFJVRSk7CisgIAorICBpID0gMDsKKyAgaiA9IDA7CisgIHdoaWxlIChpIDwgTl9JVEVSQVRJT05TKQorICAgIHsKKyAgICAgIHRvX2ZyZWVbal0gPSBfZGJ1c19tZW1fcG9vbF9hbGxvYyAocG9vbCk7IAorICAgICAgX2RidXNfYXNzZXJ0ICh0b19mcmVlW2pdICE9IE5VTEwpOyAgLyogaW4gYSByZWFsIGFwcCBvZiBjb3Vyc2UgdGhpcyBpcyB3cm9uZyAqLworCisgICAgICArK2o7CisKKyAgICAgIGlmIChqID09IEZSRUVfQVJSQVlfU0laRSkKKyAgICAgICAgeworICAgICAgICAgIGogPSAwOworICAgICAgICAgIHdoaWxlIChqIDwgRlJFRV9BUlJBWV9TSVpFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c19tZW1fcG9vbF9kZWFsbG9jIChwb29sLCB0b19mcmVlW2pdKTsKKyAgICAgICAgICAgICAgKytqOworICAgICAgICAgICAgfQorCisgICAgICAgICAgaiA9IDA7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgKytpOworICAgIH0KKworICBfZGJ1c19tZW1fcG9vbF9mcmVlIChwb29sKTsKKyAgCisjaWZkZWYgREJVU19FTkFCTEVfVkVSQk9TRV9NT0RFCisgIGVuZCA9IGNsb2NrICgpOworCisgIF9kYnVzX3ZlcmJvc2UgKCIgIGNyZWF0ZWQvZGVzdHJveWVkICVkIGVsZW1lbnRzIGluICVnIHNlY29uZHNcbiIsCisgICAgICAgICAgICAgICAgIE5fSVRFUkFUSU9OUywgKGVuZCAtIHN0YXJ0KSAvIChkb3VibGUpIENMT0NLU19QRVJfU0VDKTsKKyNlbmRpZgorfQorCisvKioKKyAqIEBpbmdyb3VwIERCdXNNZW1Qb29sSW50ZXJuYWxzCisgKiBVbml0IHRlc3QgZm9yIERCdXNNZW1Qb29sCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzLgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfbWVtX3Bvb2xfdGVzdCAodm9pZCkKK3sKKyAgaW50IGk7CisgIGludCBlbGVtZW50X3NpemVzW10gPSB7IDQsIDgsIDE2LCA1MCwgMTI0IH07CisgIAorICBpID0gMDsKKyAgd2hpbGUgKGkgPCBfREJVU19OX0VMRU1FTlRTIChlbGVtZW50X3NpemVzKSkKKyAgICB7CisgICAgICB0aW1lX2Zvcl9zaXplIChlbGVtZW50X3NpemVzW2ldKTsKKyAgICAgICsraTsKKyAgICB9CisgIAorICByZXR1cm4gVFJVRTsKK30KKworI2VuZGlmIC8qIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtbWVtcG9vbC5oIGIvZGJ1cy9kYnVzLW1lbXBvb2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzQ2NWFjCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLW1lbXBvb2wuaApAQCAtMCwwICsxLDU0IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtbWVtcG9vbC5oIE1lbW9yeSBwb29scworICogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgIFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBEQlVTX01FTVBPT0xfSAorI2RlZmluZSBEQlVTX01FTVBPT0xfSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWludGVybmFscy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1tZW1vcnkuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtdHlwZXMuaD4KKworREJVU19CRUdJTl9ERUNMUworCit0eXBlZGVmIHN0cnVjdCBEQnVzTWVtUG9vbCBEQnVzTWVtUG9vbDsKKworREJVU19QUklWQVRFX0VYUE9SVAorREJ1c01lbVBvb2wqIF9kYnVzX21lbV9wb29sX25ldyAgICAgKGludCAgICAgICAgICBlbGVtZW50X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgIHplcm9fZWxlbWVudHMpOworREJVU19QUklWQVRFX0VYUE9SVAordm9pZCAgICAgICAgIF9kYnVzX21lbV9wb29sX2ZyZWUgICAgKERCdXNNZW1Qb29sICpwb29sKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK3ZvaWQqICAgICAgICBfZGJ1c19tZW1fcG9vbF9hbGxvYyAgIChEQnVzTWVtUG9vbCAqcG9vbCk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCAgX2RidXNfbWVtX3Bvb2xfZGVhbGxvYyAoREJ1c01lbVBvb2wgKnBvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgKmVsZW1lbnQpOworCisvKiBpZiBEQlVTX0VOQUJMRV9TVEFUUyAqLwordm9pZCAgICAgICAgIF9kYnVzX21lbV9wb29sX2dldF9zdGF0cyAoREJ1c01lbVBvb2wgICAqcG9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgKmluX3VzZV9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAqaW5fZnJlZV9saXN0X3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90ICphbGxvY2F0ZWRfcCk7CisKK0RCVVNfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBEQlVTX01FTVBPT0xfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLW1lc3NhZ2UtZmFjdG9yeS5jIGIvZGJ1cy9kYnVzLW1lc3NhZ2UtZmFjdG9yeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzZTEzZDgKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtbWVzc2FnZS1mYWN0b3J5LmMKQEAgLTAsMCArMSwxMzEwIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtbWVzc2FnZS1mYWN0b3J5LmMgR2VuZXJhdG9yIG9mIHZhbGlkIGFuZCBpbnZhbGlkIG1lc3NhZ2UgZGF0YSBmb3IgdGVzdCBzdWl0ZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBSZWQgSGF0IEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKyNpbmNsdWRlIDxjb25maWcuaD4KKworI2lmbmRlZiBET1hZR0VOX1NIT1VMRF9TS0lQX1RISVMKKworI2lmZGVmIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTCisjaW5jbHVkZSAiZGJ1cy1tZXNzYWdlLWZhY3RvcnkuaCIKKyNpbmNsdWRlICJkYnVzLW1lc3NhZ2UtcHJpdmF0ZS5oIgorI2luY2x1ZGUgImRidXMtc2lnbmF0dXJlLmgiCisjaW5jbHVkZSAiZGJ1cy10ZXN0LmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKwordHlwZWRlZiBlbnVtCisgIHsKKyAgICBDSEFOR0VfVFlQRV9BREpVU1QsCisgICAgQ0hBTkdFX1RZUEVfQUJTT0xVVEUKKyAgfSBDaGFuZ2VUeXBlOworCisjZGVmaW5lIEJZVEVfT1JERVJfT0ZGU0VUICAwCisjZGVmaW5lIFRZUEVfT0ZGU0VUICAgICAgICAxCisjZGVmaW5lIEJPRFlfTEVOR1RIX09GRlNFVCA0CisjZGVmaW5lIEZJRUxEU19BUlJBWV9MRU5HVEhfT0ZGU0VUIDEyCisKK3N0YXRpYyB2b2lkCitpdGVyX3JlY3Vyc2UgKERCdXNNZXNzYWdlRGF0YUl0ZXIgKml0ZXIpCit7CisgIGl0ZXItPmRlcHRoICs9IDE7CisgIF9kYnVzX2Fzc2VydCAoaXRlci0+ZGVwdGggPCBfREJVU19NRVNTQUdFX0RBVEFfTUFYX05FU1RJTkcpOworICBfZGJ1c19hc3NlcnQgKGl0ZXItPnNlcXVlbmNlX25vc1tpdGVyLT5kZXB0aF0gPj0gMCk7Cit9CisKK3N0YXRpYyBpbnQKK2l0ZXJfZ2V0X3NlcXVlbmNlIChEQnVzTWVzc2FnZURhdGFJdGVyICppdGVyKQoreworICBfZGJ1c19hc3NlcnQgKGl0ZXItPnNlcXVlbmNlX25vc1tpdGVyLT5kZXB0aF0gPj0gMCk7CisgIHJldHVybiBpdGVyLT5zZXF1ZW5jZV9ub3NbaXRlci0+ZGVwdGhdOworfQorCitzdGF0aWMgdm9pZAoraXRlcl9zZXRfc2VxdWVuY2UgKERCdXNNZXNzYWdlRGF0YUl0ZXIgKml0ZXIsCisgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgc2VxdWVuY2UpCit7CisgIF9kYnVzX2Fzc2VydCAoc2VxdWVuY2UgPj0gMCk7CisgIGl0ZXItPnNlcXVlbmNlX25vc1tpdGVyLT5kZXB0aF0gPSBzZXF1ZW5jZTsKK30KKworc3RhdGljIHZvaWQKK2l0ZXJfdW5yZWN1cnNlIChEQnVzTWVzc2FnZURhdGFJdGVyICppdGVyKQoreworICBpdGVyLT5kZXB0aCAtPSAxOworICBfZGJ1c19hc3NlcnQgKGl0ZXItPmRlcHRoID49IDApOworfQorCitzdGF0aWMgdm9pZAoraXRlcl9uZXh0IChEQnVzTWVzc2FnZURhdGFJdGVyICppdGVyKQoreworICBpdGVyLT5zZXF1ZW5jZV9ub3NbaXRlci0+ZGVwdGhdICs9IDE7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAoraXRlcl9maXJzdF9pbl9zZXJpZXMgKERCdXNNZXNzYWdlRGF0YUl0ZXIgKml0ZXIpCit7CisgIGludCBpOworCisgIGkgPSBpdGVyLT5kZXB0aDsKKyAgd2hpbGUgKGkgPCBfREJVU19NRVNTQUdFX0RBVEFfTUFYX05FU1RJTkcpCisgICAgeworICAgICAgaWYgKGl0ZXItPnNlcXVlbmNlX25vc1tpXSAhPSAwKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICArK2k7CisgICAgfQorICByZXR1cm4gVFJVRTsKK30KKwordHlwZWRlZiBkYnVzX2Jvb2xfdCAoKiBEQnVzSW5uZXJHZW5lcmF0b3JGdW5jKSAgIChEQnVzTWVzc2FnZURhdGFJdGVyICppdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgICAgKiptZXNzYWdlX3ApOwordHlwZWRlZiBkYnVzX2Jvb2xfdCAoKiBEQnVzTWVzc2FnZUdlbmVyYXRvckZ1bmMpIChEQnVzTWVzc2FnZURhdGFJdGVyICppdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICAgICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVmFsaWRpdHkgICAgICAgICpleHBlY3RlZF92YWxpZGl0eSk7CisKK3N0YXRpYyB2b2lkCitzZXRfcmVwbHlfc2VyaWFsIChEQnVzTWVzc2FnZSAqbWVzc2FnZSkKK3sKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKKyAgaWYgKCFkYnVzX21lc3NhZ2Vfc2V0X3JlcGx5X3NlcmlhbCAobWVzc2FnZSwgMTAwKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitnZW5lcmF0ZV90cml2aWFsX2lubmVyIChEQnVzTWVzc2FnZURhdGFJdGVyICppdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICAgICoqbWVzc2FnZV9wKQoreworICBEQnVzTWVzc2FnZSAqbWVzc2FnZTsKKworICBzd2l0Y2ggKGl0ZXJfZ2V0X3NlcXVlbmNlIChpdGVyKSkKKyAgICB7CisgICAgY2FzZSAwOgorICAgICAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKCJvcmcuZnJlZWRlc2t0b3AuVGV4dEVkaXRvciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9mb28vYmFyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLkRvY3VtZW50RmFjdG9yeSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNyZWF0ZSIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXcgKERCVVNfTUVTU0FHRV9UWVBFX01FVEhPRF9SRVRVUk4pOworICAgICAgc2V0X3JlcGx5X3NlcmlhbCAobWVzc2FnZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ld19zaWduYWwgKCIvZm9vL2JhciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuRG9jdW1lbnRGYWN0b3J5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNyZWF0ZWQiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzoKKyAgICAgIG1lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfbmV3IChEQlVTX01FU1NBR0VfVFlQRV9FUlJPUik7CisKKyAgICAgIGlmICghZGJ1c19tZXNzYWdlX3NldF9lcnJvcl9uYW1lIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuVGVzdEVycm9yTmFtZSIpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKKyAgICAgIAorICAgICAgeworICAgICAgICBEQnVzTWVzc2FnZUl0ZXIgaXRlcjI7CisgICAgICAgIGNvbnN0IGNoYXIgKnZfU1RSSU5HID0gIlRoaXMgaXMgYW4gZXJyb3IiOworICAgICAgICAKKyAgICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfaW5pdF9hcHBlbmQgKG1lc3NhZ2UsICZpdGVyMik7CisgICAgICAgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljICgmaXRlcjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZfU1RSSU5HKSkKKyAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgc2V0X3JlcGx5X3NlcmlhbCAobWVzc2FnZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgCisgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisKKyAgKm1lc3NhZ2VfcCA9IG1lc3NhZ2U7CisgIAorICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitnZW5lcmF0ZV9tYW55X2JvZGllc19pbm5lciAoREJ1c01lc3NhZ2VEYXRhSXRlciAqaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgICAgKiptZXNzYWdlX3ApCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworICBEQnVzU3RyaW5nIHNpZ25hdHVyZTsKKyAgREJ1c1N0cmluZyBib2R5OworICBjaGFyIGJ5dGVfb3JkZXI7CisKKyAgLyogS2VlcGluZyB0aGlzIHNtYWxsIG1ha2VzIHRoaW5ncyBnbyBmYXN0ZXIgKi8KKyAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKCJvLnouRiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiby56LkIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5haCIpOworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm9vbSIpOworCisgIGJ5dGVfb3JkZXIgPSBfZGJ1c19oZWFkZXJfZ2V0X2J5dGVfb3JkZXIgKCZtZXNzYWdlLT5oZWFkZXIpOworCisgIHNldF9yZXBseV9zZXJpYWwgKG1lc3NhZ2UpOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZzaWduYXR1cmUpIHx8ICFfZGJ1c19zdHJpbmdfaW5pdCAoJmJvZHkpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm9vbSIpOworICAKKyAgaWYgKGRidXNfaW50ZXJuYWxfZG9fbm90X3VzZV9nZW5lcmF0ZV9ib2RpZXMgKGl0ZXJfZ2V0X3NlcXVlbmNlIChpdGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2lnbmF0dXJlLCAmYm9keSkpCisgICAgeworICAgICAgY29uc3QgY2hhciAqdl9TSUdOQVRVUkU7CisKKyAgICAgIHZfU0lHTkFUVVJFID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmc2lnbmF0dXJlKTsKKyAgICAgIGlmICghX2RidXNfaGVhZGVyX3NldF9maWVsZF9iYXNpYyAoJm1lc3NhZ2UtPmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19IRUFERVJfRklFTERfU0lHTkFUVVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU0lHTkFUVVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdl9TSUdOQVRVUkUpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfbW92ZSAoJmJvZHksIDAsICZtZXNzYWdlLT5ib2R5LCAwKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisKKyAgICAgIF9kYnVzX21hcnNoYWxfc2V0X3VpbnQzMiAoJm1lc3NhZ2UtPmhlYWRlci5kYXRhLCBCT0RZX0xFTkdUSF9PRkZTRVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmbWVzc2FnZS0+Ym9keSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIpOworICAgICAgCisgICAgICAqbWVzc2FnZV9wID0gbWVzc2FnZTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgKm1lc3NhZ2VfcCA9IE5VTEw7CisgICAgfQorICAKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZzaWduYXR1cmUpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmJvZHkpOworCisgIHJldHVybiAqbWVzc2FnZV9wICE9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCitnZW5lcmF0ZV9mcm9tX21lc3NhZ2UgKERCdXNTdHJpbmcgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgREJ1c1ZhbGlkaXR5ICAgICAgICAgICpleHBlY3RlZF92YWxpZGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICAgICAgICptZXNzYWdlKQoreworICBkYnVzX21lc3NhZ2Vfc2V0X3NlcmlhbCAobWVzc2FnZSwgMSk7CisgIGRidXNfbWVzc2FnZV9sb2NrIChtZXNzYWdlKTsKKworICAqZXhwZWN0ZWRfdmFsaWRpdHkgPSBEQlVTX1ZBTElEOworICAKKyAgLyogbW92ZSBmb3IgZWZmaWNpZW5jeSwgc2luY2Ugd2UnbGwgbnVrZSB0aGUgbWVzc2FnZSBhbnl3YXkgKi8KKyAgaWYgKCFfZGJ1c19zdHJpbmdfbW92ZSAoJm1lc3NhZ2UtPmhlYWRlci5kYXRhLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLCAwKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5ICgmbWVzc2FnZS0+Ym9keSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGRhdGEpKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitnZW5lcmF0ZV9vdXRlciAoREJ1c01lc3NhZ2VEYXRhSXRlciAgICppdGVyLAorICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICBEQnVzVmFsaWRpdHkgICAgICAgICAgKmV4cGVjdGVkX3ZhbGlkaXR5LAorICAgICAgICAgICAgICAgIERCdXNJbm5lckdlbmVyYXRvckZ1bmMgZnVuYykKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisKKyAgbWVzc2FnZSA9IE5VTEw7CisgIGlmICghKCpmdW5jKShpdGVyLCAmbWVzc2FnZSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGl0ZXJfbmV4dCAoaXRlcik7CisgIAorICBfZGJ1c19hc3NlcnQgKG1lc3NhZ2UgIT0gTlVMTCk7CisKKyAgZ2VuZXJhdGVfZnJvbV9tZXNzYWdlIChkYXRhLCBleHBlY3RlZF92YWxpZGl0eSwgbWVzc2FnZSk7CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitnZW5lcmF0ZV90cml2aWFsIChEQnVzTWVzc2FnZURhdGFJdGVyICAgKml0ZXIsCisgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICAgICAgKmRhdGEsCisgICAgICAgICAgICAgICAgICBEQnVzVmFsaWRpdHkgICAgICAgICAgKmV4cGVjdGVkX3ZhbGlkaXR5KQoreworICByZXR1cm4gZ2VuZXJhdGVfb3V0ZXIgKGl0ZXIsIGRhdGEsIGV4cGVjdGVkX3ZhbGlkaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlX3RyaXZpYWxfaW5uZXIpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2dlbmVyYXRlX21hbnlfYm9kaWVzIChEQnVzTWVzc2FnZURhdGFJdGVyICAgKml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAgICAgICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgIERCdXNWYWxpZGl0eSAgICAgICAgICAqZXhwZWN0ZWRfdmFsaWRpdHkpCit7CisgIHJldHVybiBnZW5lcmF0ZV9vdXRlciAoaXRlciwgZGF0YSwgZXhwZWN0ZWRfdmFsaWRpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVfbWFueV9ib2RpZXNfaW5uZXIpOworfQorCitzdGF0aWMgREJ1c01lc3NhZ2UqCitzaW1wbGVfbWV0aG9kX2NhbGwgKHZvaWQpCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworICAvKiBLZWVwaW5nIHRoaXMgc21hbGwgbWFrZXMgc3R1ZmYgZ28gZmFzdGVyICovCisgIG1lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsICgiby5iLlEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9mL2IiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm8uYi5aIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGcm8iKTsKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKKyAgcmV0dXJuIG1lc3NhZ2U7Cit9CisKK3N0YXRpYyBEQnVzTWVzc2FnZSoKK3NpbXBsZV9zaWduYWwgKHZvaWQpCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ld19zaWduYWwgKCIvZi9iIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiby5iLloiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGcm8iKTsKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKKyAgcmV0dXJuIG1lc3NhZ2U7Cit9CisKK3N0YXRpYyBEQnVzTWVzc2FnZSoKK3NpbXBsZV9tZXRob2RfcmV0dXJuICh2b2lkKQoreworICBEQnVzTWVzc2FnZSAqbWVzc2FnZTsKKyAgbWVzc2FnZSA9ICBkYnVzX21lc3NhZ2VfbmV3IChEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfUkVUVVJOKTsKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKKworICBzZXRfcmVwbHlfc2VyaWFsIChtZXNzYWdlKTsKKyAgCisgIHJldHVybiBtZXNzYWdlOworfQorCitzdGF0aWMgREJ1c01lc3NhZ2UqCitzaW1wbGVfZXJyb3IgKHZvaWQpCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworICBtZXNzYWdlID0gIGRidXNfbWVzc2FnZV9uZXcgKERCVVNfTUVTU0FHRV9UWVBFX0VSUk9SKTsKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKKworICBpZiAoIWRidXNfbWVzc2FnZV9zZXRfZXJyb3JfbmFtZSAobWVzc2FnZSwgImZvby5iYXIiKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKKyAgCisgIHNldF9yZXBseV9zZXJpYWwgKG1lc3NhZ2UpOworICAKKyAgcmV0dXJuIG1lc3NhZ2U7Cit9CisKK3N0YXRpYyBEQnVzTWVzc2FnZSoKK21lc3NhZ2Vfd2l0aF9uZXN0aW5nX2xldmVscyAoaW50IGxldmVscykKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisgIGRidXNfaW50MzJfdCB2X0lOVDMyOworICBEQnVzTWVzc2FnZUl0ZXIgKnBhcmVudHM7CisgIERCdXNNZXNzYWdlSXRlciAqY2hpbGRyZW47CisgIGludCBpOworCisgIC8qIElmIGxldmVscyBpcyBoaWdoZXIgaXQgYnJlYWtzIHNpZ19yZWZjb3VudCBpbiBEQnVzTWVzc2FnZVJlYWxJdGVyCisgICAqIGluIGRidXMtbWVzc2FnZS5jLCB0aGlzIGFzc2VydCBpcyBqdXN0IHRvIGhlbHAgeW91IGtub3cgeW91IG5lZWQKKyAgICogdG8gZml4IHRoYXQgaWYgeW91IGhpdCBpdAorICAgKi8KKyAgX2RidXNfYXNzZXJ0IChsZXZlbHMgPCAyNTYpOworCisgIHBhcmVudHMgPSBkYnVzX25ldyhEQnVzTWVzc2FnZUl0ZXIsIGxldmVscyArIDEpOworICBjaGlsZHJlbiA9IGRidXNfbmV3KERCdXNNZXNzYWdlSXRlciwgbGV2ZWxzICsgMSk7CisKKyAgdl9JTlQzMiA9IDQyOworICBtZXNzYWdlID0gc2ltcGxlX21ldGhvZF9jYWxsICgpOworCisgIGkgPSAwOworICBkYnVzX21lc3NhZ2VfaXRlcl9pbml0X2FwcGVuZCAobWVzc2FnZSwgJnBhcmVudHNbaV0pOworICB3aGlsZSAoaSA8IGxldmVscykKKyAgICB7CisgICAgICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX29wZW5fY29udGFpbmVyICgmcGFyZW50c1tpXSwgREJVU19UWVBFX1ZBUklBTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID09IChsZXZlbHMgLSAxKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5UMzJfQVNfU1RSSU5HIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9WQVJJQU5UX0FTX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjaGlsZHJlbltpXSkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm9vbSIpOworICAgICAgKytpOworICAgICAgcGFyZW50c1tpXSA9IGNoaWxkcmVuW2ktMV07CisgICAgfQorICAtLWk7CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfYmFzaWMgKCZjaGlsZHJlbltpXSwgREJVU19UWVBFX0lOVDMyLCAmdl9JTlQzMikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisKKyAgd2hpbGUgKGkgPj0gMCkKKyAgICB7CisgICAgICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX2Nsb3NlX2NvbnRhaW5lciAoJnBhcmVudHNbaV0sICZjaGlsZHJlbltpXSkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm9vbSIpOworICAgICAgLS1pOworICAgIH0KKworICBkYnVzX2ZyZWUocGFyZW50cyk7CisgIGRidXNfZnJlZShjaGlsZHJlbik7CisKKyAgcmV0dXJuIG1lc3NhZ2U7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZ2VuZXJhdGVfc3BlY2lhbCAoREJ1c01lc3NhZ2VEYXRhSXRlciAgICppdGVyLAorICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAgICAgICpkYXRhLAorICAgICAgICAgICAgICAgICAgREJ1c1ZhbGlkaXR5ICAgICAgICAgICpleHBlY3RlZF92YWxpZGl0eSkKK3sKKyAgaW50IGl0ZW1fc2VxOworICBEQnVzTWVzc2FnZSAqbWVzc2FnZTsKKyAgaW50IHBvczsKKyAgZGJ1c19pbnQzMl90IHZfSU5UMzI7CisKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoZGF0YSkgPT0gMCk7CisgIAorICBtZXNzYWdlID0gTlVMTDsKKyAgcG9zID0gLTE7CisgIHZfSU5UMzIgPSA0MjsKKyAgaXRlbV9zZXEgPSBpdGVyX2dldF9zZXF1ZW5jZSAoaXRlcik7CisKKyAgaWYgKGl0ZW1fc2VxID09IDApCisgICAgeworICAgICAgbWVzc2FnZSA9IHNpbXBsZV9tZXRob2RfY2FsbCAoKTsKKyAgICAgIGlmICghZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlQzMiwgJnZfSU5UMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVDMyLCAmdl9JTlQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5UMzIsICZ2X0lOVDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICBfZGJ1c19oZWFkZXJfZ2V0X2ZpZWxkX3JhdyAoJm1lc3NhZ2UtPmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0hFQURFUl9GSUVMRF9TSUdOQVRVUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgJnBvcyk7CisgICAgICBnZW5lcmF0ZV9mcm9tX21lc3NhZ2UgKGRhdGEsIGV4cGVjdGVkX3ZhbGlkaXR5LCBtZXNzYWdlKTsKKyAgICAgIAorICAgICAgLyogc2V0IGFuIGludmFsaWQgdHlwZWNvZGUgKi8KKyAgICAgIF9kYnVzX3N0cmluZ19zZXRfYnl0ZSAoZGF0YSwgcG9zICsgMSwgJyQnKTsKKworICAgICAgKmV4cGVjdGVkX3ZhbGlkaXR5ID0gREJVU19JTlZBTElEX1VOS05PV05fVFlQRUNPREU7CisgICAgfQorICBlbHNlIGlmIChpdGVtX3NlcSA9PSAxKQorICAgIHsKKyAgICAgIGNoYXIgbG9uZ19zaWdbREJVU19NQVhJTVVNX1RZUEVfUkVDVVJTSU9OX0RFUFRIKzJdOworICAgICAgY29uc3QgY2hhciAqdl9TVFJJTkc7CisgICAgICBpbnQgaTsKKyAgICAgIAorICAgICAgbWVzc2FnZSA9IHNpbXBsZV9tZXRob2RfY2FsbCAoKTsKKyAgICAgIGlmICghZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlQzMiwgJnZfSU5UMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVDMyLCAmdl9JTlQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5UMzIsICZ2X0lOVDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisKKyAgICAgIGkgPSAwOworICAgICAgd2hpbGUgKGkgPCAoREJVU19NQVhJTVVNX1RZUEVfUkVDVVJTSU9OX0RFUFRIICsgMSkpCisgICAgICAgIHsKKyAgICAgICAgICBsb25nX3NpZ1tpXSA9IERCVVNfVFlQRV9BUlJBWTsKKyAgICAgICAgICArK2k7CisgICAgICAgIH0KKyAgICAgIGxvbmdfc2lnW2ldID0gREJVU19UWVBFX0lOVkFMSUQ7CisKKyAgICAgIHZfU1RSSU5HID0gbG9uZ19zaWc7CisgICAgICBpZiAoIV9kYnVzX2hlYWRlcl9zZXRfZmllbGRfYmFzaWMgKCZtZXNzYWdlLT5oZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSEVBREVSX0ZJRUxEX1NJR05BVFVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NJR05BVFVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZfU1RSSU5HKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisgICAgICAKKyAgICAgIF9kYnVzX2hlYWRlcl9nZXRfZmllbGRfcmF3ICgmbWVzc2FnZS0+aGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSEVBREVSX0ZJRUxEX1NJR05BVFVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAmcG9zKTsKKyAgICAgIGdlbmVyYXRlX2Zyb21fbWVzc2FnZSAoZGF0YSwgZXhwZWN0ZWRfdmFsaWRpdHksIG1lc3NhZ2UpOworICAgICAgCisgICAgICAqZXhwZWN0ZWRfdmFsaWRpdHkgPSBEQlVTX0lOVkFMSURfRVhDRUVERURfTUFYSU1VTV9BUlJBWV9SRUNVUlNJT047CisgICAgfQorICBlbHNlIGlmIChpdGVtX3NlcSA9PSAyKQorICAgIHsKKyAgICAgIGNoYXIgbG9uZ19zaWdbREJVU19NQVhJTVVNX1RZUEVfUkVDVVJTSU9OX0RFUFRIKjIrNF07CisgICAgICBjb25zdCBjaGFyICp2X1NUUklORzsKKyAgICAgIGludCBpOworICAgICAgCisgICAgICBtZXNzYWdlID0gc2ltcGxlX21ldGhvZF9jYWxsICgpOworICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVDMyLCAmdl9JTlQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5UMzIsICZ2X0lOVDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlQzMiwgJnZfSU5UMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKKworICAgICAgaSA9IDA7CisgICAgICB3aGlsZSAoaSA8PSAoREJVU19NQVhJTVVNX1RZUEVfUkVDVVJTSU9OX0RFUFRIICsgMSkpCisgICAgICAgIHsKKyAgICAgICAgICBsb25nX3NpZ1tpXSA9IERCVVNfU1RSVUNUX0JFR0lOX0NIQVI7CisgICAgICAgICAgKytpOworICAgICAgICB9CisKKyAgICAgIGxvbmdfc2lnW2ldID0gREJVU19UWVBFX0lOVDMyOworICAgICAgKytpOworCisgICAgICB3aGlsZSAoaSA8IChEQlVTX01BWElNVU1fVFlQRV9SRUNVUlNJT05fREVQVEgqMiArIDMpKQorICAgICAgICB7CisgICAgICAgICAgbG9uZ19zaWdbaV0gPSBEQlVTX1NUUlVDVF9FTkRfQ0hBUjsKKyAgICAgICAgICArK2k7CisgICAgICAgIH0KKyAgICAgIGxvbmdfc2lnW2ldID0gREJVU19UWVBFX0lOVkFMSUQ7CisgICAgICAKKyAgICAgIHZfU1RSSU5HID0gbG9uZ19zaWc7CisgICAgICBpZiAoIV9kYnVzX2hlYWRlcl9zZXRfZmllbGRfYmFzaWMgKCZtZXNzYWdlLT5oZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSEVBREVSX0ZJRUxEX1NJR05BVFVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NJR05BVFVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZfU1RSSU5HKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisgICAgICAKKyAgICAgIF9kYnVzX2hlYWRlcl9nZXRfZmllbGRfcmF3ICgmbWVzc2FnZS0+aGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSEVBREVSX0ZJRUxEX1NJR05BVFVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAmcG9zKTsKKyAgICAgIGdlbmVyYXRlX2Zyb21fbWVzc2FnZSAoZGF0YSwgZXhwZWN0ZWRfdmFsaWRpdHksIG1lc3NhZ2UpOworICAgICAgCisgICAgICAqZXhwZWN0ZWRfdmFsaWRpdHkgPSBEQlVTX0lOVkFMSURfRVhDRUVERURfTUFYSU1VTV9TVFJVQ1RfUkVDVVJTSU9OOworICAgIH0KKyAgZWxzZSBpZiAoaXRlbV9zZXEgPT0gMykKKyAgICB7CisgICAgICBtZXNzYWdlID0gc2ltcGxlX21ldGhvZF9jYWxsICgpOworICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVDMyLCAmdl9JTlQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5UMzIsICZ2X0lOVDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlQzMiwgJnZfSU5UMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgIF9kYnVzX2hlYWRlcl9nZXRfZmllbGRfcmF3ICgmbWVzc2FnZS0+aGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSEVBREVSX0ZJRUxEX1NJR05BVFVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAmcG9zKTsKKyAgICAgIGdlbmVyYXRlX2Zyb21fbWVzc2FnZSAoZGF0YSwgZXhwZWN0ZWRfdmFsaWRpdHksIG1lc3NhZ2UpOworICAgICAgCisgICAgICBfZGJ1c19zdHJpbmdfc2V0X2J5dGUgKGRhdGEsIHBvcyArIDEsIERCVVNfU1RSVUNUX0JFR0lOX0NIQVIpOworICAgICAgCisgICAgICAqZXhwZWN0ZWRfdmFsaWRpdHkgPSBEQlVTX0lOVkFMSURfU1RSVUNUX1NUQVJURURfQlVUX05PVF9FTkRFRDsKKyAgICB9CisgIGVsc2UgaWYgKGl0ZW1fc2VxID09IDQpCisgICAgeworICAgICAgbWVzc2FnZSA9IHNpbXBsZV9tZXRob2RfY2FsbCAoKTsKKyAgICAgIGlmICghZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlQzMiwgJnZfSU5UMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVDMyLCAmdl9JTlQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5UMzIsICZ2X0lOVDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICBfZGJ1c19oZWFkZXJfZ2V0X2ZpZWxkX3JhdyAoJm1lc3NhZ2UtPmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0hFQURFUl9GSUVMRF9TSUdOQVRVUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgJnBvcyk7CisgICAgICBnZW5lcmF0ZV9mcm9tX21lc3NhZ2UgKGRhdGEsIGV4cGVjdGVkX3ZhbGlkaXR5LCBtZXNzYWdlKTsKKyAgICAgIAorICAgICAgX2RidXNfc3RyaW5nX3NldF9ieXRlIChkYXRhLCBwb3MgKyAxLCBEQlVTX1NUUlVDVF9FTkRfQ0hBUik7CisgICAgICAKKyAgICAgICpleHBlY3RlZF92YWxpZGl0eSA9IERCVVNfSU5WQUxJRF9TVFJVQ1RfRU5ERURfQlVUX05PVF9TVEFSVEVEOworICAgIH0KKyAgZWxzZSBpZiAoaXRlbV9zZXEgPT0gNSkKKyAgICB7CisgICAgICBtZXNzYWdlID0gc2ltcGxlX21ldGhvZF9jYWxsICgpOworICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVDMyLCAmdl9JTlQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5UMzIsICZ2X0lOVDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlQzMiwgJnZfSU5UMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgIF9kYnVzX2hlYWRlcl9nZXRfZmllbGRfcmF3ICgmbWVzc2FnZS0+aGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSEVBREVSX0ZJRUxEX1NJR05BVFVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAmcG9zKTsKKyAgICAgIGdlbmVyYXRlX2Zyb21fbWVzc2FnZSAoZGF0YSwgZXhwZWN0ZWRfdmFsaWRpdHksIG1lc3NhZ2UpOworICAgICAgCisgICAgICBfZGJ1c19zdHJpbmdfc2V0X2J5dGUgKGRhdGEsIHBvcyArIDEsIERCVVNfU1RSVUNUX0JFR0lOX0NIQVIpOworICAgICAgX2RidXNfc3RyaW5nX3NldF9ieXRlIChkYXRhLCBwb3MgKyAyLCBEQlVTX1NUUlVDVF9FTkRfQ0hBUik7CisgICAgICAKKyAgICAgICpleHBlY3RlZF92YWxpZGl0eSA9IERCVVNfSU5WQUxJRF9TVFJVQ1RfSEFTX05PX0ZJRUxEUzsKKyAgICB9CisgIGVsc2UgaWYgKGl0ZW1fc2VxID09IDYpCisgICAgeworICAgICAgbWVzc2FnZSA9IHNpbXBsZV9tZXRob2RfY2FsbCAoKTsKKyAgICAgIGdlbmVyYXRlX2Zyb21fbWVzc2FnZSAoZGF0YSwgZXhwZWN0ZWRfdmFsaWRpdHksIG1lc3NhZ2UpOworICAgICAgCisgICAgICBfZGJ1c19zdHJpbmdfc2V0X2J5dGUgKGRhdGEsIFRZUEVfT0ZGU0VULCBEQlVTX01FU1NBR0VfVFlQRV9JTlZBTElEKTsKKyAgICAgIAorICAgICAgKmV4cGVjdGVkX3ZhbGlkaXR5ID0gREJVU19JTlZBTElEX0JBRF9NRVNTQUdFX1RZUEU7CisgICAgfQorICBlbHNlIGlmIChpdGVtX3NlcSA9PSA3KQorICAgIHsKKyAgICAgIC8qIE1lc3NhZ2VzIG9mIHVua25vd24gdHlwZSBhcmUgY29uc2lkZXJlZCB2YWxpZCAqLworICAgICAgbWVzc2FnZSA9IHNpbXBsZV9tZXRob2RfY2FsbCAoKTsKKyAgICAgIGdlbmVyYXRlX2Zyb21fbWVzc2FnZSAoZGF0YSwgZXhwZWN0ZWRfdmFsaWRpdHksIG1lc3NhZ2UpOworICAgICAgCisgICAgICBfZGJ1c19zdHJpbmdfc2V0X2J5dGUgKGRhdGEsIFRZUEVfT0ZGU0VULCAxMDApOworICAgICAgCisgICAgICAqZXhwZWN0ZWRfdmFsaWRpdHkgPSBEQlVTX1ZBTElEOworICAgIH0KKyAgZWxzZSBpZiAoaXRlbV9zZXEgPT0gOCkKKyAgICB7CisgICAgICBjaGFyIGJ5dGVfb3JkZXI7CisKKyAgICAgIG1lc3NhZ2UgPSBzaW1wbGVfbWV0aG9kX2NhbGwgKCk7CisgICAgICBieXRlX29yZGVyID0gX2RidXNfaGVhZGVyX2dldF9ieXRlX29yZGVyICgmbWVzc2FnZS0+aGVhZGVyKTsKKyAgICAgIGdlbmVyYXRlX2Zyb21fbWVzc2FnZSAoZGF0YSwgZXhwZWN0ZWRfdmFsaWRpdHksIG1lc3NhZ2UpOworICAgICAgCisgICAgICBfZGJ1c19tYXJzaGFsX3NldF91aW50MzIgKGRhdGEsIEJPRFlfTEVOR1RIX09GRlNFVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19NQVhJTVVNX01FU1NBR0VfTEVOR1RIIC8gMiArIDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIpOworICAgICAgX2RidXNfbWFyc2hhbF9zZXRfdWludDMyIChkYXRhLCBGSUVMRFNfQVJSQVlfTEVOR1RIX09GRlNFVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19NQVhJTVVNX01FU1NBR0VfTEVOR1RIIC8gMiArIDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIpOworICAgICAgKmV4cGVjdGVkX3ZhbGlkaXR5ID0gREJVU19JTlZBTElEX01FU1NBR0VfVE9PX0xPTkc7CisgICAgfQorICBlbHNlIGlmIChpdGVtX3NlcSA9PSA5KQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKnZfU1RSSU5HID0gIm5vdCBhIHZhbGlkIGJ1cyBuYW1lIjsKKyAgICAgIG1lc3NhZ2UgPSBzaW1wbGVfbWV0aG9kX2NhbGwgKCk7CisKKyAgICAgIGlmICghX2RidXNfaGVhZGVyX3NldF9maWVsZF9iYXNpYyAoJm1lc3NhZ2UtPmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19IRUFERVJfRklFTERfU0VOREVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmdl9TVFJJTkcpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKKyAgICAgIAorICAgICAgZ2VuZXJhdGVfZnJvbV9tZXNzYWdlIChkYXRhLCBleHBlY3RlZF92YWxpZGl0eSwgbWVzc2FnZSk7CisKKyAgICAgICpleHBlY3RlZF92YWxpZGl0eSA9IERCVVNfSU5WQUxJRF9CQURfU0VOREVSOworICAgIH0KKyAgZWxzZSBpZiAoaXRlbV9zZXEgPT0gMTApCisgICAgeworICAgICAgbWVzc2FnZSA9IHNpbXBsZV9tZXRob2RfY2FsbCAoKTsKKworICAgICAgaWYgKCFkYnVzX21lc3NhZ2Vfc2V0X2ludGVyZmFjZSAobWVzc2FnZSwgREJVU19JTlRFUkZBQ0VfTE9DQUwpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKKyAgICAgIAorICAgICAgZ2VuZXJhdGVfZnJvbV9tZXNzYWdlIChkYXRhLCBleHBlY3RlZF92YWxpZGl0eSwgbWVzc2FnZSk7CisKKyAgICAgICpleHBlY3RlZF92YWxpZGl0eSA9IERCVVNfSU5WQUxJRF9VU0VTX0xPQ0FMX0lOVEVSRkFDRTsKKyAgICB9CisgIGVsc2UgaWYgKGl0ZW1fc2VxID09IDExKQorICAgIHsKKyAgICAgIG1lc3NhZ2UgPSBzaW1wbGVfbWV0aG9kX2NhbGwgKCk7CisKKyAgICAgIGlmICghZGJ1c19tZXNzYWdlX3NldF9wYXRoIChtZXNzYWdlLCBEQlVTX1BBVEhfTE9DQUwpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKKyAgICAgIAorICAgICAgZ2VuZXJhdGVfZnJvbV9tZXNzYWdlIChkYXRhLCBleHBlY3RlZF92YWxpZGl0eSwgbWVzc2FnZSk7CisKKyAgICAgICpleHBlY3RlZF92YWxpZGl0eSA9IERCVVNfSU5WQUxJRF9VU0VTX0xPQ0FMX1BBVEg7CisgICAgfQorICBlbHNlIGlmIChpdGVtX3NlcSA9PSAxMikKKyAgICB7CisgICAgICAvKiBNZXRob2QgY2FsbHMgZG9uJ3QgaGF2ZSB0byBoYXZlIGludGVyZmFjZSAqLworICAgICAgbWVzc2FnZSA9IHNpbXBsZV9tZXRob2RfY2FsbCAoKTsKKworICAgICAgaWYgKCFkYnVzX21lc3NhZ2Vfc2V0X2ludGVyZmFjZSAobWVzc2FnZSwgTlVMTCkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm9vbSIpOworICAgICAgCisgICAgICBnZW5lcmF0ZV9mcm9tX21lc3NhZ2UgKGRhdGEsIGV4cGVjdGVkX3ZhbGlkaXR5LCBtZXNzYWdlKTsKKyAgICAgIAorICAgICAgKmV4cGVjdGVkX3ZhbGlkaXR5ID0gREJVU19WQUxJRDsKKyAgICB9CisgIGVsc2UgaWYgKGl0ZW1fc2VxID09IDEzKQorICAgIHsKKyAgICAgIC8qIFNpZ25hbHMgcmVxdWlyZSBhbiBpbnRlcmZhY2UgKi8KKyAgICAgIG1lc3NhZ2UgPSBzaW1wbGVfc2lnbmFsICgpOworCisgICAgICBpZiAoIWRidXNfbWVzc2FnZV9zZXRfaW50ZXJmYWNlIChtZXNzYWdlLCBOVUxMKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisgICAgICAKKyAgICAgIGdlbmVyYXRlX2Zyb21fbWVzc2FnZSAoZGF0YSwgZXhwZWN0ZWRfdmFsaWRpdHksIG1lc3NhZ2UpOworICAgICAgCisgICAgICAqZXhwZWN0ZWRfdmFsaWRpdHkgPSBEQlVTX0lOVkFMSURfTUlTU0lOR19JTlRFUkZBQ0U7CisgICAgfQorICBlbHNlIGlmIChpdGVtX3NlcSA9PSAxNCkKKyAgICB7CisgICAgICBtZXNzYWdlID0gc2ltcGxlX21ldGhvZF9yZXR1cm4gKCk7CisKKyAgICAgIGlmICghX2RidXNfaGVhZGVyX2RlbGV0ZV9maWVsZCAoJm1lc3NhZ2UtPmhlYWRlciwgREJVU19IRUFERVJfRklFTERfUkVQTFlfU0VSSUFMKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisgICAgICAKKyAgICAgIGdlbmVyYXRlX2Zyb21fbWVzc2FnZSAoZGF0YSwgZXhwZWN0ZWRfdmFsaWRpdHksIG1lc3NhZ2UpOworICAgICAgCisgICAgICAqZXhwZWN0ZWRfdmFsaWRpdHkgPSBEQlVTX0lOVkFMSURfTUlTU0lOR19SRVBMWV9TRVJJQUw7CisgICAgfQorICBlbHNlIGlmIChpdGVtX3NlcSA9PSAxNSkKKyAgICB7CisgICAgICBtZXNzYWdlID0gc2ltcGxlX2Vycm9yICgpOworCisgICAgICBpZiAoIWRidXNfbWVzc2FnZV9zZXRfZXJyb3JfbmFtZSAobWVzc2FnZSwgTlVMTCkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm9vbSIpOworICAgICAgCisgICAgICBnZW5lcmF0ZV9mcm9tX21lc3NhZ2UgKGRhdGEsIGV4cGVjdGVkX3ZhbGlkaXR5LCBtZXNzYWdlKTsKKyAgICAgIAorICAgICAgKmV4cGVjdGVkX3ZhbGlkaXR5ID0gREJVU19JTlZBTElEX01JU1NJTkdfRVJST1JfTkFNRTsKKyAgICB9CisgIGVsc2UgaWYgKGl0ZW1fc2VxID09IDE2KQorICAgIHsKKyAgICAgIGNoYXIgbG9uZ19zaWdbREJVU19NQVhJTVVNX1RZUEVfUkVDVVJTSU9OX0RFUFRIKjQrMTBdOworICAgICAgY29uc3QgY2hhciAqdl9TVFJJTkc7CisgICAgICBpbnQgaTsKKyAgICAgIGludCBuX2JlZ2luczsKKyAgICAgIAorICAgICAgbWVzc2FnZSA9IHNpbXBsZV9tZXRob2RfY2FsbCAoKTsKKyAgICAgIGlmICghZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlQzMiwgJnZfSU5UMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVDMyLCAmdl9JTlQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5UMzIsICZ2X0lOVDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisKKyAgICAgIGkgPSAwOworICAgICAgd2hpbGUgKGkgPD0gKERCVVNfTUFYSU1VTV9UWVBFX1JFQ1VSU0lPTl9ERVBUSCozICsgMykpCisgICAgICAgIHsKKyAgICAgICAgICBsb25nX3NpZ1tpXSA9IERCVVNfVFlQRV9BUlJBWTsKKyAgICAgICAgICArK2k7CisgICAgICAgICAgbG9uZ19zaWdbaV0gPSBEQlVTX0RJQ1RfRU5UUllfQkVHSU5fQ0hBUjsKKyAgICAgICAgICArK2k7CisgICAgICAgICAgbG9uZ19zaWdbaV0gPSBEQlVTX1RZUEVfSU5UMzI7CisgICAgICAgICAgKytpOworICAgICAgICB9CisgICAgICBuX2JlZ2lucyA9IGkgLyAzOworCisgICAgICBsb25nX3NpZ1tpXSA9IERCVVNfVFlQRV9JTlQzMjsKKyAgICAgICsraTsKKyAgICAgIAorICAgICAgd2hpbGUgKG5fYmVnaW5zID4gMCkKKyAgICAgICAgeworICAgICAgICAgIGxvbmdfc2lnW2ldID0gREJVU19ESUNUX0VOVFJZX0VORF9DSEFSOworICAgICAgICAgICsraTsKKyAgICAgICAgICBuX2JlZ2lucyAtPSAxOworICAgICAgICB9CisgICAgICBsb25nX3NpZ1tpXSA9IERCVVNfVFlQRV9JTlZBTElEOworICAgICAgCisgICAgICB2X1NUUklORyA9IGxvbmdfc2lnOworICAgICAgaWYgKCFfZGJ1c19oZWFkZXJfc2V0X2ZpZWxkX2Jhc2ljICgmbWVzc2FnZS0+aGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0hFQURFUl9GSUVMRF9TSUdOQVRVUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TSUdOQVRVUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2X1NUUklORykpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm9vbSIpOworICAgICAgCisgICAgICBfZGJ1c19oZWFkZXJfZ2V0X2ZpZWxkX3JhdyAoJm1lc3NhZ2UtPmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0hFQURFUl9GSUVMRF9TSUdOQVRVUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgJnBvcyk7CisgICAgICBnZW5lcmF0ZV9mcm9tX21lc3NhZ2UgKGRhdGEsIGV4cGVjdGVkX3ZhbGlkaXR5LCBtZXNzYWdlKTsKKyAgICAgIAorICAgICAgKmV4cGVjdGVkX3ZhbGlkaXR5ID0gREJVU19JTlZBTElEX0VYQ0VFREVEX01BWElNVU1fRElDVF9FTlRSWV9SRUNVUlNJT047CisgICAgfQorICBlbHNlIGlmIChpdGVtX3NlcSA9PSAxNykKKyAgICB7CisgICAgICBtZXNzYWdlID0gc2ltcGxlX21ldGhvZF9jYWxsICgpOworICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVDMyLCAmdl9JTlQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5UMzIsICZ2X0lOVDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlQzMiwgJnZfSU5UMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgIF9kYnVzX2hlYWRlcl9nZXRfZmllbGRfcmF3ICgmbWVzc2FnZS0+aGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSEVBREVSX0ZJRUxEX1NJR05BVFVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAmcG9zKTsKKyAgICAgIGdlbmVyYXRlX2Zyb21fbWVzc2FnZSAoZGF0YSwgZXhwZWN0ZWRfdmFsaWRpdHksIG1lc3NhZ2UpOworCisgICAgICBfZGJ1c19zdHJpbmdfc2V0X2J5dGUgKGRhdGEsIHBvcyArIDEsIERCVVNfVFlQRV9BUlJBWSk7CisgICAgICBfZGJ1c19zdHJpbmdfc2V0X2J5dGUgKGRhdGEsIHBvcyArIDIsIERCVVNfRElDVF9FTlRSWV9CRUdJTl9DSEFSKTsKKyAgICAgIAorICAgICAgKmV4cGVjdGVkX3ZhbGlkaXR5ID0gREJVU19JTlZBTElEX0RJQ1RfRU5UUllfU1RBUlRFRF9CVVRfTk9UX0VOREVEOworICAgIH0KKyAgZWxzZSBpZiAoaXRlbV9zZXEgPT0gMTgpCisgICAgeworICAgICAgbWVzc2FnZSA9IHNpbXBsZV9tZXRob2RfY2FsbCAoKTsKKyAgICAgIGlmICghZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlQzMiwgJnZfSU5UMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVDMyLCAmdl9JTlQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5UMzIsICZ2X0lOVDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICBfZGJ1c19oZWFkZXJfZ2V0X2ZpZWxkX3JhdyAoJm1lc3NhZ2UtPmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0hFQURFUl9GSUVMRF9TSUdOQVRVUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgJnBvcyk7CisgICAgICBnZW5lcmF0ZV9mcm9tX21lc3NhZ2UgKGRhdGEsIGV4cGVjdGVkX3ZhbGlkaXR5LCBtZXNzYWdlKTsKKyAgICAgIAorICAgICAgX2RidXNfc3RyaW5nX3NldF9ieXRlIChkYXRhLCBwb3MgKyAxLCBEQlVTX0RJQ1RfRU5UUllfRU5EX0NIQVIpOworICAgICAgCisgICAgICAqZXhwZWN0ZWRfdmFsaWRpdHkgPSBEQlVTX0lOVkFMSURfRElDVF9FTlRSWV9FTkRFRF9CVVRfTk9UX1NUQVJURUQ7CisgICAgfQorICBlbHNlIGlmIChpdGVtX3NlcSA9PSAxOSkKKyAgICB7CisgICAgICBtZXNzYWdlID0gc2ltcGxlX21ldGhvZF9jYWxsICgpOworICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVDMyLCAmdl9JTlQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5UMzIsICZ2X0lOVDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlQzMiwgJnZfSU5UMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgIF9kYnVzX2hlYWRlcl9nZXRfZmllbGRfcmF3ICgmbWVzc2FnZS0+aGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSEVBREVSX0ZJRUxEX1NJR05BVFVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAmcG9zKTsKKyAgICAgIGdlbmVyYXRlX2Zyb21fbWVzc2FnZSAoZGF0YSwgZXhwZWN0ZWRfdmFsaWRpdHksIG1lc3NhZ2UpOworCisgICAgICBfZGJ1c19zdHJpbmdfc2V0X2J5dGUgKGRhdGEsIHBvcyArIDEsIERCVVNfVFlQRV9BUlJBWSk7CisgICAgICBfZGJ1c19zdHJpbmdfc2V0X2J5dGUgKGRhdGEsIHBvcyArIDIsIERCVVNfRElDVF9FTlRSWV9CRUdJTl9DSEFSKTsKKyAgICAgIF9kYnVzX3N0cmluZ19zZXRfYnl0ZSAoZGF0YSwgcG9zICsgMywgREJVU19ESUNUX0VOVFJZX0VORF9DSEFSKTsKKyAgICAgIAorICAgICAgKmV4cGVjdGVkX3ZhbGlkaXR5ID0gREJVU19JTlZBTElEX0RJQ1RfRU5UUllfSEFTX05PX0ZJRUxEUzsKKyAgICB9CisgIGVsc2UgaWYgKGl0ZW1fc2VxID09IDIwKQorICAgIHsKKyAgICAgIC8qIDY0IGxldmVscyBvZiBuZXN0aW5nIGlzIE9LICovCisgICAgICBtZXNzYWdlID0gbWVzc2FnZV93aXRoX25lc3RpbmdfbGV2ZWxzKDY0KTsKKworICAgICAgZ2VuZXJhdGVfZnJvbV9tZXNzYWdlIChkYXRhLCBleHBlY3RlZF92YWxpZGl0eSwgbWVzc2FnZSk7CisKKyAgICAgICpleHBlY3RlZF92YWxpZGl0eSA9IERCVVNfVkFMSUQ7CisgICAgfQorICBlbHNlIGlmIChpdGVtX3NlcSA9PSAyMSkKKyAgICB7CisgICAgICAvKiA2NSBsZXZlbHMgb2YgbmVzdGluZyBpcyBub3QgT0sgKi8KKyAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlX3dpdGhfbmVzdGluZ19sZXZlbHMoNjUpOworCisgICAgICBnZW5lcmF0ZV9mcm9tX21lc3NhZ2UgKGRhdGEsIGV4cGVjdGVkX3ZhbGlkaXR5LCBtZXNzYWdlKTsKKworICAgICAgKmV4cGVjdGVkX3ZhbGlkaXR5ID0gREJVU19JTlZBTElEX05FU1RFRF9UT09fREVFUExZOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKG1lc3NhZ2UpCisgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKworICBpdGVyX25leHQgKGl0ZXIpOworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitnZW5lcmF0ZV93cm9uZ19sZW5ndGggKERCdXNNZXNzYWdlRGF0YUl0ZXIgKml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgICAgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgIERCdXNWYWxpZGl0eSAgICAgICAgKmV4cGVjdGVkX3ZhbGlkaXR5KQoreworICBpbnQgbGVuZ3Roc1tdID0geyAtNDIsIC0xNywgLTE2LCAtMTUsIC05LCAtOCwgLTcsIC02LCAtNSwgLTQsIC0zLCAtMiwgLTEsCisgICAgICAgICAgICAgICAgICAgIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDE1LCAxNiwgMzAgfTsKKyAgaW50IGFkanVzdDsKKyAgaW50IGxlbl9zZXE7CisKKyByZXN0YXJ0OgorICBsZW5fc2VxID0gaXRlcl9nZXRfc2VxdWVuY2UgKGl0ZXIpOworICBpZiAobGVuX3NlcSA9PSBfREJVU19OX0VMRU1FTlRTIChsZW5ndGhzKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgX2RidXNfYXNzZXJ0IChsZW5fc2VxIDwgX0RCVVNfTl9FTEVNRU5UUyAobGVuZ3RocykpOworICAKKyAgaXRlcl9yZWN1cnNlIChpdGVyKTsKKyAgaWYgKCFnZW5lcmF0ZV9tYW55X2JvZGllcyAoaXRlciwgZGF0YSwgZXhwZWN0ZWRfdmFsaWRpdHkpKQorICAgIHsKKyAgICAgIGl0ZXJfc2V0X3NlcXVlbmNlIChpdGVyLCAwKTsgLyogcmVzZXQgdG8gZmlyc3QgYm9keSAqLworICAgICAgaXRlcl91bnJlY3Vyc2UgKGl0ZXIpOworICAgICAgaXRlcl9uZXh0IChpdGVyKTsgICAgICAgICAgICAvKiBuZXh0IGxlbmd0aCBhZGp1c3RtZW50ICovCisgICAgICBnb3RvIHJlc3RhcnQ7CisgICAgfQorICBpdGVyX3VucmVjdXJzZSAoaXRlcik7CisKKyAgYWRqdXN0ID0gbGVuZ3Roc1tsZW5fc2VxXTsKKworICBpZiAoYWRqdXN0IDwgMCkKKyAgICB7CisgICAgICBpZiAoKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChkYXRhKSArIGFkanVzdCkgPCBEQlVTX01JTklNVU1fSEVBREVSX1NJWkUpCisgICAgICAgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoIChkYXRhLCBEQlVTX01JTklNVU1fSEVBREVSX1NJWkUpOworICAgICAgZWxzZQorICAgICAgICBfZGJ1c19zdHJpbmdfc2hvcnRlbiAoZGF0YSwgLSBhZGp1c3QpOworICAgICAgKmV4cGVjdGVkX3ZhbGlkaXR5ID0gREJVU19JTlZBTElEX0ZPUl9VTktOT1dOX1JFQVNPTjsKKyAgICB9CisgIGVsc2UKKyAgICB7ICAgICAgCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19sZW5ndGhlbiAoZGF0YSwgYWRqdXN0KSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisgICAgICAqZXhwZWN0ZWRfdmFsaWRpdHkgPSBEQlVTX0lOVkFMSURfVE9PX01VQ0hfREFUQTsKKyAgICB9CisKKyAgLyogRml4dXAgbGVuZ3RocyAqLworICB7CisgICAgaW50IG9sZF9ib2R5X2xlbjsKKyAgICBpbnQgbmV3X2JvZHlfbGVuOworICAgIGludCBieXRlX29yZGVyOworICAgIAorICAgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGRhdGEpID49IERCVVNfTUlOSU1VTV9IRUFERVJfU0laRSk7CisgICAgCisgICAgYnl0ZV9vcmRlciA9IF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoZGF0YSwgQllURV9PUkRFUl9PRkZTRVQpOworICAgIG9sZF9ib2R5X2xlbiA9IF9kYnVzX21hcnNoYWxfcmVhZF91aW50MzIgKGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9EWV9MRU5HVEhfT0ZGU0VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgX2RidXNfYXNzZXJ0IChvbGRfYm9keV9sZW4gPCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoZGF0YSkpOworICAgIG5ld19ib2R5X2xlbiA9IG9sZF9ib2R5X2xlbiArIGFkanVzdDsKKyAgICBpZiAobmV3X2JvZHlfbGVuIDwgMCkKKyAgICAgIHsKKyAgICAgICAgbmV3X2JvZHlfbGVuID0gMDsKKyAgICAgICAgLyogd2UganVzdCBtdW5nZWQgdGhlIGhlYWRlciwgYW5kIGFyZW4ndCBzdXJlIGhvdyAqLworICAgICAgICAqZXhwZWN0ZWRfdmFsaWRpdHkgPSBEQlVTX1ZBTElESVRZX1VOS05PV047CisgICAgICB9CisKKyAgICBfZGJ1c192ZXJib3NlICgiY2hhbmdpbmcgYm9keSBsZW4gZnJvbSAldSB0byAldSBieSBhZGp1c3QgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgb2xkX2JvZHlfbGVuLCBuZXdfYm9keV9sZW4sIGFkanVzdCk7CisgICAgCisgICAgX2RidXNfbWFyc2hhbF9zZXRfdWludDMyIChkYXRhLCBCT0RZX0xFTkdUSF9PRkZTRVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfYm9keV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlX29yZGVyKTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2dlbmVyYXRlX2J5dGVfY2hhbmdlZCAoREJ1c01lc3NhZ2VEYXRhSXRlciAqaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgREJ1c1ZhbGlkaXR5ICAgICAgICAqZXhwZWN0ZWRfdmFsaWRpdHkpCit7CisgIGludCBieXRlX3NlcTsKKyAgaW50IHZfQllURTsKKworICAvKiBUaGlzIGlzIGEgbGl0dGxlIGNvbnZvbHV0ZWQgdG8gbWFrZSB0aGUgYm9kaWVzIHRoZQorICAgKiBvdXRlciBsb29wIGFuZCBlYWNoIGJ5dGUgb2YgZWFjaCBib2R5IHRoZSBpbm5lcgorICAgKiBsb29wCisgICAqLworCisgcmVzdGFydDoKKyAgaWYgKCFnZW5lcmF0ZV9tYW55X2JvZGllcyAoaXRlciwgZGF0YSwgZXhwZWN0ZWRfdmFsaWRpdHkpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpdGVyX3JlY3Vyc2UgKGl0ZXIpOworICBieXRlX3NlcSA9IGl0ZXJfZ2V0X3NlcXVlbmNlIChpdGVyKTsKKyAgaXRlcl9uZXh0IChpdGVyKTsKKyAgaXRlcl91bnJlY3Vyc2UgKGl0ZXIpOworICAKKyAgaWYgKGJ5dGVfc2VxID09IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChkYXRhKSkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoZGF0YSwgMCk7CisgICAgICAvKiByZXNldCBieXRlIGNvdW50ICovCisgICAgICBpdGVyX3JlY3Vyc2UgKGl0ZXIpOworICAgICAgaXRlcl9zZXRfc2VxdWVuY2UgKGl0ZXIsIDApOworICAgICAgaXRlcl91bnJlY3Vyc2UgKGl0ZXIpOworICAgICAgZ290byByZXN0YXJ0OworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIFVuZG8gdGhlICJuZXh0IiBpbiBnZW5lcmF0ZV9tYW55X2JvZGllcyAqLworICAgICAgaXRlcl9zZXRfc2VxdWVuY2UgKGl0ZXIsIGl0ZXJfZ2V0X3NlcXVlbmNlIChpdGVyKSAtIDEpOworICAgIH0KKworICBfZGJ1c19hc3NlcnQgKGJ5dGVfc2VxIDwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGRhdGEpKTsKKyAgdl9CWVRFID0gX2RidXNfc3RyaW5nX2dldF9ieXRlIChkYXRhLCBieXRlX3NlcSk7CisgIHZfQllURSArPSBieXRlX3NlcTsgLyogYXJiaXRyYXJ5IGJ1dCBkZXRlcm1pbmlzdGljIGNoYW5nZSB0byB0aGUgYnl0ZSAqLworICBfZGJ1c19zdHJpbmdfc2V0X2J5dGUgKGRhdGEsIGJ5dGVfc2VxLCB2X0JZVEUpOworICAqZXhwZWN0ZWRfdmFsaWRpdHkgPSBEQlVTX1ZBTElESVRZX1VOS05PV047CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKyNpZiAwCisvKiBUaGlzIGlzIHJlYWxseSBleHBlbnNpdmUgYW5kIGRvZXNuJ3QgYWRkIHRvbyBtdWNoIGNvdmVyYWdlICovCisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZmluZF9uZXh0X3R5cGVjb2RlIChEQnVzTWVzc2FnZURhdGFJdGVyICppdGVyLAorICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICAgICpkYXRhLAorICAgICAgICAgICAgICAgICAgICBEQnVzVmFsaWRpdHkgICAgICAgICpleHBlY3RlZF92YWxpZGl0eSkKK3sKKyAgaW50IGJvZHlfc2VxOworICBpbnQgYnl0ZV9zZXE7CisgIGludCBiYXNlX2RlcHRoOworCisgIGJhc2VfZGVwdGggPSBpdGVyLT5kZXB0aDsKKworIHJlc3RhcnQ6CisgIF9kYnVzX2Fzc2VydCAoaXRlci0+ZGVwdGggPT0gKGJhc2VfZGVwdGggKyAwKSk7CisgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoIChkYXRhLCAwKTsKKworICBib2R5X3NlcSA9IGl0ZXJfZ2V0X3NlcXVlbmNlIChpdGVyKTsKKyAgCisgIGlmICghZ2VuZXJhdGVfbWFueV9ib2RpZXMgKGl0ZXIsIGRhdGEsIGV4cGVjdGVkX3ZhbGlkaXR5KSkKKyAgICByZXR1cm4gRkFMU0U7CisgIC8qIFVuZG8gdGhlICJuZXh0IiBpbiBnZW5lcmF0ZV9tYW55X2JvZGllcyAqLworICBpdGVyX3NldF9zZXF1ZW5jZSAoaXRlciwgYm9keV9zZXEpOworICAKKyAgaXRlcl9yZWN1cnNlIChpdGVyKTsKKyAgd2hpbGUgKFRSVUUpCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0IChpdGVyLT5kZXB0aCA9PSAoYmFzZV9kZXB0aCArIDEpKTsKKyAgICAgIAorICAgICAgYnl0ZV9zZXEgPSBpdGVyX2dldF9zZXF1ZW5jZSAoaXRlcik7CisKKyAgICAgIF9kYnVzX2Fzc2VydCAoYnl0ZV9zZXEgPD0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGRhdGEpKTsKKyAgICAgIAorICAgICAgaWYgKGJ5dGVfc2VxID09IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChkYXRhKSkKKyAgICAgICAgeworICAgICAgICAgIC8qIHJlc2V0IGJ5dGUgY291bnQgKi8KKyAgICAgICAgICBpdGVyX3NldF9zZXF1ZW5jZSAoaXRlciwgMCk7CisgICAgICAgICAgaXRlcl91bnJlY3Vyc2UgKGl0ZXIpOworICAgICAgICAgIF9kYnVzX2Fzc2VydCAoaXRlci0+ZGVwdGggPT0gKGJhc2VfZGVwdGggKyAwKSk7CisgICAgICAgICAgaXRlcl9uZXh0IChpdGVyKTsgLyogZ28gdG8gdGhlIG5leHQgYm9keSAqLworICAgICAgICAgIGdvdG8gcmVzdGFydDsKKyAgICAgICAgfQorCisgICAgICBfZGJ1c19hc3NlcnQgKGJ5dGVfc2VxIDwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGRhdGEpKTsKKworICAgICAgaWYgKGRidXNfdHlwZV9pc192YWxpZCAoX2RidXNfc3RyaW5nX2dldF9ieXRlIChkYXRhLCBieXRlX3NlcSkpKQorICAgICAgICBicmVhazsKKyAgICAgIGVsc2UKKyAgICAgICAgaXRlcl9uZXh0IChpdGVyKTsKKyAgICB9CisKKyAgX2RidXNfYXNzZXJ0IChieXRlX3NlcSA9PSBpdGVyX2dldF9zZXF1ZW5jZSAoaXRlcikpOworICBfZGJ1c19hc3NlcnQgKGJ5dGVfc2VxIDwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGRhdGEpKTsKKworICBpdGVyX3VucmVjdXJzZSAoaXRlcik7CisKKyAgX2RidXNfYXNzZXJ0IChpdGVyLT5kZXB0aCA9PSAoYmFzZV9kZXB0aCArIDApKTsKKyAgCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgY29uc3QgaW50IHR5cGVjb2Rlc1tdID0geworICBEQlVTX1RZUEVfSU5WQUxJRCwKKyAgREJVU19UWVBFX0JZVEUsCisgIERCVVNfVFlQRV9CT09MRUFOLAorICBEQlVTX1RZUEVfSU5UMTYsCisgIERCVVNfVFlQRV9VSU5UMTYsCisgIERCVVNfVFlQRV9JTlQzMiwKKyAgREJVU19UWVBFX1VJTlQzMiwKKyAgREJVU19UWVBFX0lOVDY0LAorICBEQlVTX1RZUEVfVUlOVDY0LAorICBEQlVTX1RZUEVfRE9VQkxFLAorICBEQlVTX1RZUEVfU1RSSU5HLAorICBEQlVTX1RZUEVfT0JKRUNUX1BBVEgsCisgIERCVVNfVFlQRV9TSUdOQVRVUkUsCisgIERCVVNfVFlQRV9BUlJBWSwKKyAgREJVU19UWVBFX1ZBUklBTlQsCisgIERCVVNfU1RSVUNUX0JFR0lOX0NIQVIsCisgIERCVVNfU1RSVUNUX0VORF9DSEFSLAorICBEQlVTX0RJQ1RfRU5UUllfQkVHSU5fQ0hBUiwKKyAgREJVU19ESUNUX0VOVFJZX0VORF9DSEFSLAorICBEQlVTX1RZUEVfVU5JWF9GRCwKKyAgMjU1IC8qIHJhbmRvbSBpbnZhbGlkIHR5cGVjb2RlICovCit9OworCitzdGF0aWMgZGJ1c19ib29sX3QKK2dlbmVyYXRlX3R5cGVjb2RlX2NoYW5nZWQgKERCdXNNZXNzYWdlRGF0YUl0ZXIgKml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICAgICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1ZhbGlkaXR5ICAgICAgICAqZXhwZWN0ZWRfdmFsaWRpdHkpCit7CisgIGludCBieXRlX3NlcTsKKyAgaW50IHR5cGVjb2RlX3NlcTsKKyAgaW50IGJhc2VfZGVwdGg7CisKKyAgYmFzZV9kZXB0aCA9IGl0ZXItPmRlcHRoOworCisgcmVzdGFydDoKKyAgX2RidXNfYXNzZXJ0IChpdGVyLT5kZXB0aCA9PSAoYmFzZV9kZXB0aCArIDApKTsKKyAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKGRhdGEsIDApOworICAKKyAgaWYgKCFmaW5kX25leHRfdHlwZWNvZGUgKGl0ZXIsIGRhdGEsIGV4cGVjdGVkX3ZhbGlkaXR5KSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaXRlcl9yZWN1cnNlIChpdGVyKTsKKyAgYnl0ZV9zZXEgPSBpdGVyX2dldF9zZXF1ZW5jZSAoaXRlcik7CisKKyAgX2RidXNfYXNzZXJ0IChieXRlX3NlcSA8IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChkYXRhKSk7CisgIAorICBpdGVyX3JlY3Vyc2UgKGl0ZXIpOworICB0eXBlY29kZV9zZXEgPSBpdGVyX2dldF9zZXF1ZW5jZSAoaXRlcik7CisgIGl0ZXJfbmV4dCAoaXRlcik7CisKKyAgX2RidXNfYXNzZXJ0ICh0eXBlY29kZV9zZXEgPD0gX0RCVVNfTl9FTEVNRU5UUyAodHlwZWNvZGVzKSk7CisgIAorICBpZiAodHlwZWNvZGVfc2VxID09IF9EQlVTX05fRUxFTUVOVFMgKHR5cGVjb2RlcykpCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0IChpdGVyLT5kZXB0aCA9PSAoYmFzZV9kZXB0aCArIDIpKTsKKyAgICAgIGl0ZXJfc2V0X3NlcXVlbmNlIChpdGVyLCAwKTsgLyogcmVzZXQgdHlwZWNvZGUgc2VxdWVuY2UgKi8KKyAgICAgIGl0ZXJfdW5yZWN1cnNlIChpdGVyKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoaXRlci0+ZGVwdGggPT0gKGJhc2VfZGVwdGggKyAxKSk7CisgICAgICBpdGVyX25leHQgKGl0ZXIpOyAvKiBnbyB0byB0aGUgbmV4dCBieXRlX3NlcSAqLworICAgICAgaXRlcl91bnJlY3Vyc2UgKGl0ZXIpOworICAgICAgX2RidXNfYXNzZXJ0IChpdGVyLT5kZXB0aCA9PSAoYmFzZV9kZXB0aCArIDApKTsKKyAgICAgIGdvdG8gcmVzdGFydDsKKyAgICB9CisKKyAgX2RidXNfYXNzZXJ0IChpdGVyLT5kZXB0aCA9PSAoYmFzZV9kZXB0aCArIDIpKTsKKyAgaXRlcl91bnJlY3Vyc2UgKGl0ZXIpOworICBfZGJ1c19hc3NlcnQgKGl0ZXItPmRlcHRoID09IChiYXNlX2RlcHRoICsgMSkpOworICBpdGVyX3VucmVjdXJzZSAoaXRlcik7CisgIF9kYnVzX2Fzc2VydCAoaXRlci0+ZGVwdGggPT0gKGJhc2VfZGVwdGggKyAwKSk7CisKKyNpZiAwCisgIHByaW50ZiAoIkNoYW5naW5nIGJ5dGUgJWQgaW4gbWVzc2FnZSAlZCB0byAlY1xuIiwKKyAgICAgICAgICBieXRlX3NlcSwgaXRlcl9nZXRfc2VxdWVuY2UgKGl0ZXIpLCB0eXBlY29kZXNbdHlwZWNvZGVfc2VxXSk7CisjZW5kaWYKKyAgCisgIF9kYnVzX3N0cmluZ19zZXRfYnl0ZSAoZGF0YSwgYnl0ZV9zZXEsIHR5cGVjb2Rlc1t0eXBlY29kZV9zZXFdKTsKKyAgKmV4cGVjdGVkX3ZhbGlkaXR5ID0gREJVU19WQUxJRElUWV9VTktOT1dOOworICByZXR1cm4gVFJVRTsKK30KKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdAoreworICBDaGFuZ2VUeXBlIHR5cGU7CisgIGRidXNfdWludDMyX3QgdmFsdWU7IC8qIGNhc3QgdG8gc2lnbmVkIGZvciBhZGp1c3RzICovCit9IFVJbnRDaGFuZ2U7CisKK3N0YXRpYyBjb25zdCBVSW50Q2hhbmdlIHVpbnQzMl9jaGFuZ2VzW10gPSB7CisgIHsgQ0hBTkdFX1RZUEVfQURKVVNULCAoZGJ1c191aW50MzJfdCkgLTEgfSwKKyAgeyBDSEFOR0VfVFlQRV9BREpVU1QsIChkYnVzX3VpbnQzMl90KSAtMiB9LAorICB7IENIQU5HRV9UWVBFX0FESlVTVCwgKGRidXNfdWludDMyX3QpIC0zIH0sCisgIHsgQ0hBTkdFX1RZUEVfQURKVVNULCAoZGJ1c191aW50MzJfdCkgMSB9LAorICB7IENIQU5HRV9UWVBFX0FESlVTVCwgKGRidXNfdWludDMyX3QpIDIgfSwKKyAgeyBDSEFOR0VfVFlQRV9BREpVU1QsIChkYnVzX3VpbnQzMl90KSAzIH0sCisgIHsgQ0hBTkdFX1RZUEVfQUJTT0xVVEUsIF9EQlVTX1VJTlQzMl9NQVggfSwKKyAgeyBDSEFOR0VfVFlQRV9BQlNPTFVURSwgMCB9LAorICB7IENIQU5HRV9UWVBFX0FCU09MVVRFLCAxIH0sCisgIHsgQ0hBTkdFX1RZUEVfQUJTT0xVVEUsIF9EQlVTX1VJTlQzMl9NQVggLSAxIH0sCisgIHsgQ0hBTkdFX1RZUEVfQUJTT0xVVEUsIF9EQlVTX1VJTlQzMl9NQVggLSA1IH0KK307CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZ2VuZXJhdGVfdWludDMyX2NoYW5nZWQgKERCdXNNZXNzYWdlRGF0YUl0ZXIgKml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVmFsaWRpdHkgICAgICAgICpleHBlY3RlZF92YWxpZGl0eSkKK3sKKyAgaW50IGJvZHlfc2VxOworICBpbnQgYnl0ZV9zZXE7CisgIGludCBjaGFuZ2Vfc2VxOworICBkYnVzX3VpbnQzMl90IHZfVUlOVDMyOworICBpbnQgYnl0ZV9vcmRlcjsKKyAgY29uc3QgVUludENoYW5nZSAqY2hhbmdlOworICBpbnQgYmFzZV9kZXB0aDsKKworICAvKiBPdXRlciBsb29wIGlzIGVhY2ggYm9keSwgbmV4dCBsb29wIGlzIGVhY2ggY2hhbmdlLAorICAgKiBpbm5lciBsb29wIGlzIGVhY2ggY2hhbmdlIGxvY2F0aW9uCisgICAqLworCisgIGJhc2VfZGVwdGggPSBpdGVyLT5kZXB0aDsKKyAgCisgbmV4dF9ib2R5OgorICBfZGJ1c19hc3NlcnQgKGl0ZXItPmRlcHRoID09IChiYXNlX2RlcHRoICsgMCkpOworICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoZGF0YSwgMCk7CisgIGJvZHlfc2VxID0gaXRlcl9nZXRfc2VxdWVuY2UgKGl0ZXIpOworICAKKyAgaWYgKCFnZW5lcmF0ZV9tYW55X2JvZGllcyAoaXRlciwgZGF0YSwgZXhwZWN0ZWRfdmFsaWRpdHkpKQorICAgIHJldHVybiBGQUxTRTsKKworICBfZGJ1c19hc3NlcnQgKGl0ZXItPmRlcHRoID09IChiYXNlX2RlcHRoICsgMCkpOworCisgIGl0ZXJfc2V0X3NlcXVlbmNlIChpdGVyLCBib2R5X3NlcSk7IC8qIHVuZG8gdGhlICJuZXh0IiBmcm9tIGdlbmVyYXRlX21hbnlfYm9kaWVzICovCisgIGl0ZXJfcmVjdXJzZSAoaXRlcik7CisgbmV4dF9jaGFuZ2U6CisgIF9kYnVzX2Fzc2VydCAoaXRlci0+ZGVwdGggPT0gKGJhc2VfZGVwdGggKyAxKSk7CisgIGNoYW5nZV9zZXEgPSBpdGVyX2dldF9zZXF1ZW5jZSAoaXRlcik7CisgIAorICBpZiAoY2hhbmdlX3NlcSA9PSBfREJVU19OX0VMRU1FTlRTICh1aW50MzJfY2hhbmdlcykpCisgICAgeworICAgICAgLyogUmVzZXQgY2hhbmdlIGNvdW50ICovCisgICAgICBpdGVyX3NldF9zZXF1ZW5jZSAoaXRlciwgMCk7CisgICAgICBpdGVyX3VucmVjdXJzZSAoaXRlcik7CisgICAgICBpdGVyX25leHQgKGl0ZXIpOworICAgICAgZ290byBuZXh0X2JvZHk7CisgICAgfQorCisgIF9kYnVzX2Fzc2VydCAoaXRlci0+ZGVwdGggPT0gKGJhc2VfZGVwdGggKyAxKSk7CisgIAorICBpdGVyX3JlY3Vyc2UgKGl0ZXIpOworICBfZGJ1c19hc3NlcnQgKGl0ZXItPmRlcHRoID09IChiYXNlX2RlcHRoICsgMikpOworICBieXRlX3NlcSA9IGl0ZXJfZ2V0X3NlcXVlbmNlIChpdGVyKTsKKyAgLyogc2tpcCA0IGJ5dGVzIGF0IGEgdGltZSAqLworICBpdGVyX25leHQgKGl0ZXIpOworICBpdGVyX25leHQgKGl0ZXIpOworICBpdGVyX25leHQgKGl0ZXIpOworICBpdGVyX25leHQgKGl0ZXIpOworICBpdGVyX3VucmVjdXJzZSAoaXRlcik7CisKKyAgX2RidXNfYXNzZXJ0IChfREJVU19BTElHTl9WQUxVRSAoYnl0ZV9zZXEsIDQpID09ICh1bnNpZ25lZCkgYnl0ZV9zZXEpOworICBpZiAoYnl0ZV9zZXEgPj0gKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChkYXRhKSAtIDQpKQorICAgIHsKKyAgICAgIC8qIHJlc2V0IGJ5dGUgY291bnQgKi8KKyAgICAgIF9kYnVzX2Fzc2VydCAoaXRlci0+ZGVwdGggPT0gKGJhc2VfZGVwdGggKyAxKSk7CisgICAgICBpdGVyX3JlY3Vyc2UgKGl0ZXIpOworICAgICAgX2RidXNfYXNzZXJ0IChpdGVyLT5kZXB0aCA9PSAoYmFzZV9kZXB0aCArIDIpKTsKKyAgICAgIGl0ZXJfc2V0X3NlcXVlbmNlIChpdGVyLCAwKTsKKyAgICAgIGl0ZXJfdW5yZWN1cnNlIChpdGVyKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoaXRlci0+ZGVwdGggPT0gKGJhc2VfZGVwdGggKyAxKSk7CisgICAgICBpdGVyX25leHQgKGl0ZXIpOworICAgICAgZ290byBuZXh0X2NoYW5nZTsKKyAgICB9CisgIAorICBfZGJ1c19hc3NlcnQgKGJ5dGVfc2VxIDw9IChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoZGF0YSkgLSA0KSk7CisKKyAgYnl0ZV9vcmRlciA9IF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoZGF0YSwgQllURV9PUkRFUl9PRkZTRVQpOworICAKKyAgdl9VSU5UMzIgPSBfZGJ1c19tYXJzaGFsX3JlYWRfdWludDMyIChkYXRhLCBieXRlX3NlcSwgYnl0ZV9vcmRlciwgTlVMTCk7CisKKyAgY2hhbmdlID0gJnVpbnQzMl9jaGFuZ2VzW2NoYW5nZV9zZXFdOworCisgIGlmIChjaGFuZ2UtPnR5cGUgPT0gQ0hBTkdFX1RZUEVfQURKVVNUKQorICAgIHsKKyAgICAgIHZfVUlOVDMyICs9IChpbnQpIGNoYW5nZS0+dmFsdWU7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgdl9VSU5UMzIgPSBjaGFuZ2UtPnZhbHVlOworICAgIH0KKworI2lmIDAKKyAgcHJpbnRmICgiYm9keSAlZCBjaGFuZ2UgJWQgcG9zICVkICIsCisgICAgICAgICAgYm9keV9zZXEsIGNoYW5nZV9zZXEsIGJ5dGVfc2VxKTsKKworICBpZiAoY2hhbmdlLT50eXBlID09IENIQU5HRV9UWVBFX0FESlVTVCkKKyAgICBwcmludGYgKCJhZGp1c3QgYnkgJWQiLCAoaW50KSBjaGFuZ2UtPnZhbHVlKTsKKyAgZWxzZQorICAgIHByaW50ZiAoInNldCB0byAldSIsIGNoYW5nZS0+dmFsdWUpOworICAKKyAgcHJpbnRmICgiIFx0JXUgLT4gJXVcbiIsCisgICAgICAgICAgX2RidXNfbWFyc2hhbF9yZWFkX3VpbnQzMiAoZGF0YSwgYnl0ZV9zZXEsIGJ5dGVfb3JkZXIsIE5VTEwpLAorICAgICAgICAgIHZfVUlOVDMyKTsKKyNlbmRpZgorICAKKyAgX2RidXNfbWFyc2hhbF9zZXRfdWludDMyIChkYXRhLCBieXRlX3NlcSwgdl9VSU5UMzIsIGJ5dGVfb3JkZXIpOworICAqZXhwZWN0ZWRfdmFsaWRpdHkgPSBEQlVTX1ZBTElESVRZX1VOS05PV047CisKKyAgX2RidXNfYXNzZXJ0IChpdGVyLT5kZXB0aCA9PSAoYmFzZV9kZXB0aCArIDEpKTsKKyAgaXRlcl91bnJlY3Vyc2UgKGl0ZXIpOworICBfZGJ1c19hc3NlcnQgKGl0ZXItPmRlcHRoID09IChiYXNlX2RlcHRoICsgMCkpOworICAgICAgICAgIAorICByZXR1cm4gVFJVRTsKK30KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgREJ1c01lc3NhZ2VHZW5lcmF0b3JGdW5jIGZ1bmM7ICAKK30gREJ1c01lc3NhZ2VHZW5lcmF0b3I7CisKK3N0YXRpYyBjb25zdCBEQnVzTWVzc2FnZUdlbmVyYXRvciBnZW5lcmF0b3JzW10gPSB7CisgIHsgInRyaXZpYWwgZXhhbXBsZSBvZiBlYWNoIG1lc3NhZ2UgdHlwZSIsIGdlbmVyYXRlX3RyaXZpYWwgfSwKKyAgeyAiYXNzb3J0ZWQgYXJndW1lbnRzIiwgZ2VuZXJhdGVfbWFueV9ib2RpZXMgfSwKKyAgeyAiYXNzb3J0ZWQgc3BlY2lhbCBjYXNlcyIsIGdlbmVyYXRlX3NwZWNpYWwgfSwKKyAgeyAiZWFjaCB1aW50MzIgbW9kaWZpZWQiLCBnZW5lcmF0ZV91aW50MzJfY2hhbmdlZCB9LAorICB7ICJ3cm9uZyBib2R5IGxlbmd0aHMiLCBnZW5lcmF0ZV93cm9uZ19sZW5ndGggfSwKKyAgeyAiZWFjaCBieXRlIG1vZGlmaWVkIiwgZ2VuZXJhdGVfYnl0ZV9jaGFuZ2VkIH0sCisjaWYgMAorICAvKiBUaGlzIGlzIHJlYWxseSBleHBlbnNpdmUgYW5kIGRvZXNuJ3QgYWRkIHRvbyBtdWNoIGNvdmVyYWdlICovCisgIHsgImNoYW5nZSBlYWNoIHR5cGVjb2RlIiwgZ2VuZXJhdGVfdHlwZWNvZGVfY2hhbmdlZCB9CisjZW5kaWYKK307CisKK3ZvaWQKK19kYnVzX21lc3NhZ2VfZGF0YV9mcmVlIChEQnVzTWVzc2FnZURhdGEgKmRhdGEpCit7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmZGF0YS0+ZGF0YSk7Cit9CisKK3ZvaWQKK19kYnVzX21lc3NhZ2VfZGF0YV9pdGVyX2luaXQgKERCdXNNZXNzYWdlRGF0YUl0ZXIgKml0ZXIpCit7CisgIGludCBpOworICAKKyAgaXRlci0+ZGVwdGggPSAwOworICBpID0gMDsKKyAgd2hpbGUgKGkgPCBfREJVU19NRVNTQUdFX0RBVEFfTUFYX05FU1RJTkcpCisgICAgeworICAgICAgaXRlci0+c2VxdWVuY2Vfbm9zW2ldID0gMDsKKyAgICAgICsraTsKKyAgICB9CisgIGl0ZXItPmNvdW50ID0gMDsKK30KKworZGJ1c19ib29sX3QKK19kYnVzX21lc3NhZ2VfZGF0YV9pdGVyX2dldF9hbmRfbmV4dCAoREJ1c01lc3NhZ2VEYXRhSXRlciAqaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2VEYXRhICAgICAqZGF0YSkKK3sKKyAgREJ1c01lc3NhZ2VHZW5lcmF0b3JGdW5jIGZ1bmM7CisgIGludCBnZW5lcmF0b3I7CisKKyByZXN0YXJ0OgorICBnZW5lcmF0b3IgPSBpdGVyX2dldF9zZXF1ZW5jZSAoaXRlcik7CisgIAorICBpZiAoZ2VuZXJhdG9yID09IF9EQlVTX05fRUxFTUVOVFMgKGdlbmVyYXRvcnMpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpdGVyX3JlY3Vyc2UgKGl0ZXIpOworICAKKyAgaWYgKGl0ZXJfZmlyc3RfaW5fc2VyaWVzIChpdGVyKSkKKyAgICB7CisgICAgICBwcmludGYgKCIgdGVzdGluZyBtZXNzYWdlIGxvYWRpbmc6ICVzICIsIGdlbmVyYXRvcnNbZ2VuZXJhdG9yXS5uYW1lKTsKKyAgICAgIGZmbHVzaCAoc3Rkb3V0KTsKKyAgICB9CisgIAorICBmdW5jID0gZ2VuZXJhdG9yc1tnZW5lcmF0b3JdLmZ1bmM7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmRhdGEtPmRhdGEpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm9vbSIpOworICAKKyAgaWYgKCgqZnVuYykoaXRlciwgJmRhdGEtPmRhdGEsICZkYXRhLT5leHBlY3RlZF92YWxpZGl0eSkpCisgICAgOworICBlbHNlCisgICAgeworICAgICAgaXRlcl9zZXRfc2VxdWVuY2UgKGl0ZXIsIDApOworICAgICAgaXRlcl91bnJlY3Vyc2UgKGl0ZXIpOworICAgICAgaXRlcl9uZXh0IChpdGVyKTsgLyogbmV4dCBnZW5lcmF0b3IgKi8KKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmZGF0YS0+ZGF0YSk7CisgICAgICBwcmludGYgKCIlZCB0ZXN0IGxvYWRzIGN1bXVsYXRpdmVcbiIsIGl0ZXItPmNvdW50KTsKKyAgICAgIGdvdG8gcmVzdGFydDsKKyAgICB9CisgIGl0ZXJfdW5yZWN1cnNlIChpdGVyKTsKKworICBpdGVyLT5jb3VudCArPSAxOworICByZXR1cm4gVFJVRTsKK30KKworI2VuZGlmIC8qICFET1hZR0VOX1NIT1VMRF9TS0lQX1RISVMgKi8KKworI2VuZGlmIC8qIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtbWVzc2FnZS1mYWN0b3J5LmggYi9kYnVzL2RidXMtbWVzc2FnZS1mYWN0b3J5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ3YTQ3NgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1tZXNzYWdlLWZhY3RvcnkuaApAQCAtMCwwICsxLDYxIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtbWVzc2FnZS1mYWN0b3J5LmggR2VuZXJhdG9yIG9mIHZhbGlkIGFuZCBpbnZhbGlkIG1lc3NhZ2UgZGF0YSBmb3IgdGVzdCBzdWl0ZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBSZWQgSGF0IEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBEQlVTX01FU1NBR0VfRkFDVE9SWV9ICisjZGVmaW5lIERCVVNfTUVTU0FHRV9GQUNUT1JZX0gKKworI2lmZGVmIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTCisKKyNpbmNsdWRlIDxkYnVzL2RidXMtc3RyaW5nLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLW1hcnNoYWwtYmFzaWMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbWFyc2hhbC12YWxpZGF0ZS5oPgorCitEQlVTX0JFR0lOX0RFQ0xTCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIERCdXNWYWxpZGl0eSBleHBlY3RlZF92YWxpZGl0eTsKKyAgCisgIERCdXNTdHJpbmcgZGF0YTsKKworfSBEQnVzTWVzc2FnZURhdGE7CisKKyNkZWZpbmUgX0RCVVNfTUVTU0FHRV9EQVRBX01BWF9ORVNUSU5HIDEwCit0eXBlZGVmIHN0cnVjdAoreworICBpbnQgc2VxdWVuY2Vfbm9zW19EQlVTX01FU1NBR0VfREFUQV9NQVhfTkVTVElOR107CisgIGludCBkZXB0aDsKKyAgaW50IGNvdW50OworfSBEQnVzTWVzc2FnZURhdGFJdGVyOworCit2b2lkICAgICAgICBfZGJ1c19tZXNzYWdlX2RhdGFfZnJlZSAgICAgICAgICAgICAgKERCdXNNZXNzYWdlRGF0YSAgICAgKmRhdGEpOwordm9pZCAgICAgICAgX2RidXNfbWVzc2FnZV9kYXRhX2l0ZXJfaW5pdCAgICAgICAgIChEQnVzTWVzc2FnZURhdGFJdGVyICppdGVyKTsKK2RidXNfYm9vbF90IF9kYnVzX21lc3NhZ2VfZGF0YV9pdGVyX2dldF9hbmRfbmV4dCAoREJ1c01lc3NhZ2VEYXRhSXRlciAqaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2VEYXRhICAgICAqZGF0YSk7CisKKworREJVU19FTkRfREVDTFMKKworI2VuZGlmIC8qIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTICovCisKKyNlbmRpZiAvKiBEQlVTX01FU1NBR0VfRkFDVE9SWV9IICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtbWVzc2FnZS1pbnRlcm5hbC5oIGIvZGJ1cy9kYnVzLW1lc3NhZ2UtaW50ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGM3OTIzCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLW1lc3NhZ2UtaW50ZXJuYWwuaApAQCAtMCwwICsxLDE1MCBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLW1lc3NhZ2UtaW50ZXJuYWwuaCBEQnVzTWVzc2FnZSBvYmplY3QgaW50ZXJuYWwgaW50ZXJmYWNlcworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiAgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaWZuZGVmIERCVVNfTUVTU0FHRV9JTlRFUk5BTF9ICisjZGVmaW5lIERCVVNfTUVTU0FHRV9JTlRFUk5BTF9ICisKKyNpbmNsdWRlIDxkYnVzL2RidXMtbWFyc2hhbC12YWxpZGF0ZS5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1tZXNzYWdlLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXJlc291cmNlcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1saXN0Lmg+CisKK0RCVVNfQkVHSU5fREVDTFMKKworI2lmZGVmIERCVVNfRU5BQkxFX1ZFUkJPU0VfTU9ERQordm9pZCBfZGJ1c19tZXNzYWdlX3RyYWNlX3JlZiAoREJ1c01lc3NhZ2UgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgb2xkX3JlZmNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgIG5ld19yZWZjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICp3aHkpOworI2Vsc2UKKy8qIHRoaXMgYnlwYXNzZXMgYW55ICJ1bnVzZWQiIHdhcm5pbmdzIGZvciB0aGUgb2xkIGFuZCBuZXcgcmVmY291bnQgKi8KKyNkZWZpbmUgX2RidXNfbWVzc2FnZV90cmFjZV9yZWYobSwgbywgbiwgdykgXAorICBkbyBcCisgIHtcCisgICAgKHZvaWQpIChvKTsgXAorICAgICh2b2lkKSAobik7IFwKKyAgfSB3aGlsZSAoMCkKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBEQnVzTWVzc2FnZUxvYWRlciBEQnVzTWVzc2FnZUxvYWRlcjsKKwordm9pZCBfZGJ1c19tZXNzYWdlX2dldF9uZXR3b3JrX2RhdGEgIChEQnVzTWVzc2FnZSAgICAgICAqbWVzc2FnZSwKKwkJCQkgICAgICBjb25zdCBEQnVzU3RyaW5nICoqaGVhZGVyLAorCQkJCSAgICAgIGNvbnN0IERCdXNTdHJpbmcgKipib2R5KTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK3ZvaWQgX2RidXNfbWVzc2FnZV9nZXRfdW5peF9mZHMgICAgICAoREJ1c01lc3NhZ2UgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAqKmZkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgKm5fZmRzKTsKKwordW5zaWduZWQgaW50IF9kYnVzX21lc3NhZ2VfZ2V0X25fdW5peF9mZHMgICAgICAgKERCdXNNZXNzYWdlICAqbWVzc2FnZSk7Cit2b2lkICAgICAgICBfZGJ1c19tZXNzYWdlX2xvY2sgICAgICAgICAgICAgICAgICAoREJ1c01lc3NhZ2UgICptZXNzYWdlKTsKK3ZvaWQgICAgICAgIF9kYnVzX21lc3NhZ2VfdW5sb2NrICAgICAgICAgICAgICAgIChEQnVzTWVzc2FnZSAgKm1lc3NhZ2UpOworZGJ1c19ib29sX3QgX2RidXNfbWVzc2FnZV9hZGRfY291bnRlciAgICAgICAgICAgKERCdXNNZXNzYWdlICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ291bnRlciAgKmNvdW50ZXIpOwordm9pZCAgICAgICAgX2RidXNfbWVzc2FnZV9hZGRfY291bnRlcl9saW5rICAgICAgKERCdXNNZXNzYWdlICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAgICAgKmxpbmspOwordm9pZCAgICAgICAgX2RidXNfbWVzc2FnZV9yZW1vdmVfY291bnRlciAgICAgICAgKERCdXNNZXNzYWdlICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ291bnRlciAgKmNvdW50ZXIpOworCitEQlVTX1BSSVZBVEVfRVhQT1JUCitEQnVzTWVzc2FnZUxvYWRlciogX2RidXNfbWVzc2FnZV9sb2FkZXJfbmV3ICAgICAgICAgICAgICAgICAgICh2b2lkKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK0RCdXNNZXNzYWdlTG9hZGVyKiBfZGJ1c19tZXNzYWdlX2xvYWRlcl9yZWYgICAgICAgICAgICAgICAgICAgKERCdXNNZXNzYWdlTG9hZGVyICAqbG9hZGVyKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK3ZvaWQgICAgICAgICAgICAgICBfZGJ1c19tZXNzYWdlX2xvYWRlcl91bnJlZiAgICAgICAgICAgICAgICAgKERCdXNNZXNzYWdlTG9hZGVyICAqbG9hZGVyKTsKKworREJVU19QUklWQVRFX0VYUE9SVAordm9pZCAgICAgICAgICAgICAgIF9kYnVzX21lc3NhZ2VfbG9hZGVyX2dldF9idWZmZXIgICAgICAgICAgICAoREJ1c01lc3NhZ2VMb2FkZXIgICpsb2FkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICAqKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAqbWF4X3RvX3JlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICAgKm1heV9yZWFkX3VuaXhfZmRzKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK3ZvaWQgICAgICAgICAgICAgICBfZGJ1c19tZXNzYWdlX2xvYWRlcl9yZXR1cm5fYnVmZmVyICAgICAgICAgKERCdXNNZXNzYWdlTG9hZGVyICAqbG9hZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAgICpidWZmZXIpOworCisKKyNpZmRlZiBIQVZFX1VOSVhfRkRfUEFTU0lORworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgICAgICAgIF9kYnVzX21lc3NhZ2VfbG9hZGVyX2dldF91bml4X2ZkcyAgICAgICAgICAoREJ1c01lc3NhZ2VMb2FkZXIgICpsb2FkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAqKmZkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICAgICAgICAgICAqbWF4X25fZmRzKTsKKworREJVU19QUklWQVRFX0VYUE9SVAordm9pZCAgICAgICAgICAgICAgIF9kYnVzX21lc3NhZ2VfbG9hZGVyX3JldHVybl91bml4X2ZkcyAgICAgICAoREJ1c01lc3NhZ2VMb2FkZXIgICpsb2FkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgKmZkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICAgICAgICAgICAgbl9mZHMpOworI2VuZGlmCisKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90ICAgICAgICBfZGJ1c19tZXNzYWdlX2xvYWRlcl9xdWV1ZV9tZXNzYWdlcyAgICAgICAgKERCdXNNZXNzYWdlTG9hZGVyICAqbG9hZGVyKTsKK0RCdXNNZXNzYWdlKiAgICAgICBfZGJ1c19tZXNzYWdlX2xvYWRlcl9wZWVrX21lc3NhZ2UgICAgICAgICAgKERCdXNNZXNzYWdlTG9hZGVyICAqbG9hZGVyKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK0RCdXNNZXNzYWdlKiAgICAgICBfZGJ1c19tZXNzYWdlX2xvYWRlcl9wb3BfbWVzc2FnZSAgICAgICAgICAgKERCdXNNZXNzYWdlTG9hZGVyICAqbG9hZGVyKTsKK0RCdXNMaXN0KiAgICAgICAgICBfZGJ1c19tZXNzYWdlX2xvYWRlcl9wb3BfbWVzc2FnZV9saW5rICAgICAgKERCdXNNZXNzYWdlTG9hZGVyICAqbG9hZGVyKTsKK3ZvaWQgICAgICAgICAgICAgICBfZGJ1c19tZXNzYWdlX2xvYWRlcl9wdXRiYWNrX21lc3NhZ2VfbGluayAgKERCdXNNZXNzYWdlTG9hZGVyICAqbG9hZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICAgICAgICAgICpsaW5rKTsKKworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgICAgICAgIF9kYnVzX21lc3NhZ2VfbG9hZGVyX2dldF9pc19jb3JydXB0ZWQgICAgICAoREJ1c01lc3NhZ2VMb2FkZXIgICpsb2FkZXIpOworREJ1c1ZhbGlkaXR5ICAgICAgIF9kYnVzX21lc3NhZ2VfbG9hZGVyX2dldF9jb3JydXB0aW9uX3JlYXNvbiAoREJ1c01lc3NhZ2VMb2FkZXIgICpsb2FkZXIpOworCit2b2lkICAgICAgICAgICAgICAgX2RidXNfbWVzc2FnZV9sb2FkZXJfc2V0X21heF9tZXNzYWdlX3NpemUgIChEQnVzTWVzc2FnZUxvYWRlciAgKmxvYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgICAgICAgICAgICAgICAgc2l6ZSk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitsb25nICAgICAgICAgICAgICAgX2RidXNfbWVzc2FnZV9sb2FkZXJfZ2V0X21heF9tZXNzYWdlX3NpemUgIChEQnVzTWVzc2FnZUxvYWRlciAgKmxvYWRlcik7CisKK3ZvaWQgICAgICAgICAgICAgICBfZGJ1c19tZXNzYWdlX2xvYWRlcl9zZXRfbWF4X21lc3NhZ2VfdW5peF9mZHMoREJ1c01lc3NhZ2VMb2FkZXIgICpsb2FkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgICAgICAgICAgICAgICAgbik7Citsb25nICAgICAgICAgICAgICAgX2RidXNfbWVzc2FnZV9sb2FkZXJfZ2V0X21heF9tZXNzYWdlX3VuaXhfZmRzKERCdXNNZXNzYWdlTG9hZGVyICAqbG9hZGVyKTsKK2ludCAgICAgICAgICAgICAgICBfZGJ1c19tZXNzYWdlX2xvYWRlcl9nZXRfcGVuZGluZ19mZHNfY291bnQgKERCdXNNZXNzYWdlTG9hZGVyICAqbG9hZGVyKTsKK3ZvaWQgICAgICAgICAgICAgICBfZGJ1c19tZXNzYWdlX2xvYWRlcl9zZXRfcGVuZGluZ19mZHNfZnVuY3Rpb24gKERCdXNNZXNzYWdlTG9hZGVyICpsb2FkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICgqIGNhbGxiYWNrKSAodm9pZCAqKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEpOworCit0eXBlZGVmIHN0cnVjdCBEQnVzVmFyaWFudCBEQnVzVmFyaWFudDsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK0RCdXNWYXJpYW50ICAgICAgICpfZGJ1c192YXJpYW50X3JlYWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKERCdXNNZXNzYWdlSXRlciAqcmVhZGVyKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90ICAgICAgICBfZGJ1c192YXJpYW50X3dyaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgKERCdXNWYXJpYW50ICpzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2VJdGVyICp3cml0ZXIpOworREJVU19QUklWQVRFX0VYUE9SVAordm9pZCAgICAgICAgICAgICAgIF9kYnVzX3ZhcmlhbnRfZnJlZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoREJ1c1ZhcmlhbnQgKnNlbGYpOworREJVU19QUklWQVRFX0VYUE9SVAoraW50ICAgICAgICAgICAgICAgIF9kYnVzX3ZhcmlhbnRfZ2V0X2xlbmd0aCAgICAgICAgICAgICAgICAgICAgICAoREJ1c1ZhcmlhbnQgKnNlbGYpOworREJVU19QUklWQVRFX0VYUE9SVAorY29uc3QgREJ1c1N0cmluZyAgKl9kYnVzX3ZhcmlhbnRfcGVlayAgICAgICAgICAgICAgICAgICAgICAgICAgICAoREJ1c1ZhcmlhbnQgKnNlbGYpOworREJVU19QUklWQVRFX0VYUE9SVAorY29uc3QgY2hhciAgICAgICAgKl9kYnVzX3ZhcmlhbnRfZ2V0X3NpZ25hdHVyZSAgICAgICAgICAgICAgICAgICAoREJ1c1ZhcmlhbnQgKnNlbGYpOworCitzdGF0aWMgaW5saW5lIHZvaWQKK19kYnVzX2NsZWFyX3ZhcmlhbnQgKERCdXNWYXJpYW50ICoqdmFyaWFudF9wKQoreworICBfZGJ1c19jbGVhcl9wb2ludGVyX2ltcGwgKERCdXNWYXJpYW50LCB2YXJpYW50X3AsIF9kYnVzX3ZhcmlhbnRfZnJlZSk7Cit9CisKK3R5cGVkZWYgc3RydWN0IERCdXNJbml0aWFsRkRzIERCdXNJbml0aWFsRkRzOworREJ1c0luaXRpYWxGRHMgKl9kYnVzX2NoZWNrX2ZkbGVha3NfZW50ZXIgKHZvaWQpOwordm9pZCAgICAgICAgICAgIF9kYnVzX2NoZWNrX2ZkbGVha3NfbGVhdmUgKERCdXNJbml0aWFsRkRzICpmZHMpOworCitEQlVTX0VORF9ERUNMUworCisjZW5kaWYgLyogREJVU19NRVNTQUdFX0lOVEVSTkFMX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1tZXNzYWdlLXByaXZhdGUuaCBiL2RidXMvZGJ1cy1tZXNzYWdlLXByaXZhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGM0MWE4Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLW1lc3NhZ2UtcHJpdmF0ZS5oCkBAIC0wLDAgKzEsMTQ2IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtbWVzc2FnZS1wcml2YXRlLmggaGVhZGVyIHNoYXJlZCBiZXR3ZWVuIGRidXMtbWVzc2FnZS5jIGFuZCBkYnVzLW1lc3NhZ2UtdXRpbC5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1ICBSZWQgSGF0IEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKyNpZm5kZWYgREJVU19NRVNTQUdFX1BSSVZBVEVfSAorI2RlZmluZSBEQlVTX01FU1NBR0VfUFJJVkFURV9ICisKKyNpbmNsdWRlIDxkYnVzL2RidXMtbWVzc2FnZS5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1tZXNzYWdlLWludGVybmFsLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXN0cmluZy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1kYXRhc2xvdC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1tYXJzaGFsLWhlYWRlci5oPgorCitEQlVTX0JFR0lOX0RFQ0xTCisKKy8qKgorICogQGFkZHRvZ3JvdXAgREJ1c01lc3NhZ2VJbnRlcm5hbHMKKyAqIEB7CisgKi8KKworLyoqCisgKiBAdHlwZWRlZiBEQnVzTWVzc2FnZUxvYWRlcgorICoKKyAqIFRoZSBEQnVzTWVzc2FnZUxvYWRlciBvYmplY3QgZW5jYXBzdWxhdGVzIHRoZSBwcm9jZXNzIG9mIGNvbnZlcnRpbmcKKyAqIGEgYnl0ZSBzdHJlYW0gaW50byBhIHNlcmllcyBvZiBEQnVzTWVzc2FnZS4gSXQgYnVmZmVycyB0aGUgaW5jb21pbmcKKyAqIGJ5dGVzIGFzIGVmZmljaWVudGx5IGFzIHBvc3NpYmxlLCBhbmQgZ2VuZXJhdGVzIGEgcXVldWUgb2YKKyAqIG1lc3NhZ2VzLiBEQnVzTWVzc2FnZUxvYWRlciBpcyB0eXBpY2FsbHkgdXNlZCBhcyBwYXJ0IG9mIGEKKyAqIERCdXNUcmFuc3BvcnQgaW1wbGVtZW50YXRpb24uIFRoZSBEQnVzVHJhbnNwb3J0IHRoZW4gaGFuZHMgb2ZmCisgKiB0aGUgbG9hZGVkIG1lc3NhZ2VzIHRvIGEgREJ1c0Nvbm5lY3Rpb24sIG1ha2luZyB0aGUgbWVzc2FnZXMKKyAqIHZpc2libGUgdG8gdGhlIGFwcGxpY2F0aW9uLgorICoKKyAqIEB0b2RvIHdyaXRlIHRlc3RzIGZvciBicmVhay1sb2FkZXIgdGhhdCBhKSByYW5kb21seSBkZWxldGUgaGVhZGVyCisgKiBmaWVsZHMgYW5kIGIpIHNldCBzdHJpbmcgZmllbGRzIHRvIHplcm8tbGVuZ3RoIGFuZCBvdGhlciBmdW5reQorICogdmFsdWVzLgorICoKKyAqLworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIGRldGFpbHMgb2YgREJ1c01lc3NhZ2VMb2FkZXIuCisgKiBBbGwgbWVtYmVycyBhcmUgcHJpdmF0ZS4KKyAqLworc3RydWN0IERCdXNNZXNzYWdlTG9hZGVyCit7CisgIGludCByZWZjb3VudDsgICAgICAgIC8qKjwgUmVmZXJlbmNlIGNvdW50LiAqLworCisgIERCdXNTdHJpbmcgZGF0YTsgICAgIC8qKjwgQnVmZmVyZWQgZGF0YSAqLworCisgIERCdXNMaXN0ICptZXNzYWdlczsgIC8qKjwgQ29tcGxldGUgbWVzc2FnZXMuICovCisKKyAgbG9uZyBtYXhfbWVzc2FnZV9zaXplOyAvKio8IE1heGltdW0gc2l6ZSBvZiBhIG1lc3NhZ2UgKi8KKyAgbG9uZyBtYXhfbWVzc2FnZV91bml4X2ZkczsgLyoqPCBNYXhpbXVtIHVuaXggZmRzIGluIGEgbWVzc2FnZSAqLworCisgIERCdXNWYWxpZGl0eSBjb3JydXB0aW9uX3JlYXNvbjsgLyoqPCB3aHkgd2Ugd2VyZSBjb3JydXB0ZWQgKi8KKworICB1bnNpZ25lZCBpbnQgY29ycnVwdGVkIDogMTsgLyoqPCBXZSBnb3QgYnJva2VuIGRhdGEsIGFuZCBhcmUgbm8gbG9uZ2VyIHdvcmtpbmcgKi8KKworICB1bnNpZ25lZCBpbnQgYnVmZmVyX291dHN0YW5kaW5nIDogMTsgLyoqPCBTb21lb25lIGlzIHVzaW5nIHRoZSBidWZmZXIgdG8gcmVhZCAqLworCisjaWZkZWYgSEFWRV9VTklYX0ZEX1BBU1NJTkcKKyAgdW5zaWduZWQgaW50IHVuaXhfZmRzX291dHN0YW5kaW5nIDogMTsgLyoqPCBTb21lb25lIGlzIHVzaW5nIHRoZSB1bml4IGZkIGFycmF5IHRvIHJlYWQgKi8KKworICBpbnQgKnVuaXhfZmRzOyAvKio8IEZpbGUgZGVzY3JpcHRvcnMgdGhhdCBoYXZlIGJlZW4gcmVhZCBmcm9tIHRoZSB0cmFuc3BvcnQgYnV0IG5vdCB5ZXQgYmVlbiBoYW5kZWQgdG8gYW55IG1lc3NhZ2UuIEFycmF5IHdpbGwgYmUgYWxsb2NhdGVkIGF0IGZpcnN0IHVzZS4gKi8KKyAgdW5zaWduZWQgbl91bml4X2Zkc19hbGxvY2F0ZWQ7IC8qKjwgTnVtYmVyIG9mIGZpbGUgZGVzY3JpcHRvcnMgdGhpcyBhcnJheSBoYXMgc3BhY2UgZm9yICovCisgIHVuc2lnbmVkIG5fdW5peF9mZHM7IC8qKjwgTnVtYmVyIG9mIHZhbGlkIGZpbGUgZGVzY3JpcHRvcnMgaW4gYXJyYXkgKi8KKyAgdm9pZCAoKiB1bml4X2Zkc19jaGFuZ2UpICh2b2lkICopOyAvKio8IE5vdGlmeSB3aGVuIHRoZSBwZW5kaW5nIGZkcyBjaGFuZ2UgKi8KKyAgdm9pZCAqdW5peF9mZHNfY2hhbmdlX2RhdGE7CisjZW5kaWYKK307CisKKworLyoqIEhvdyBtYW55IGJpdHMgYXJlIGluIHRoZSBjaGFuZ2VkX3N0YW1wIHVzZWQgdG8gdmFsaWRhdGUgaXRlcmF0b3JzICovCisjZGVmaW5lIENIQU5HRURfU1RBTVBfQklUUyAyMQorCisvKioKKyAqIEBicmllZiBJbnRlcm5hbHMgb2YgREJ1c01lc3NhZ2UKKyAqCisgKiBPYmplY3QgcmVwcmVzZW50aW5nIGEgbWVzc2FnZSByZWNlaXZlZCBmcm9tIG9yIHRvIGJlIHNlbnQgdG8KKyAqIGFub3RoZXIgYXBwbGljYXRpb24uIFRoaXMgaXMgYW4gb3BhcXVlIG9iamVjdCwgYWxsIG1lbWJlcnMKKyAqIGFyZSBwcml2YXRlLgorICovCitzdHJ1Y3QgREJ1c01lc3NhZ2UKK3sKKyAgREJ1c0F0b21pYyByZWZjb3VudDsgLyoqPCBSZWZlcmVuY2UgY291bnQgKi8KKworICBEQnVzSGVhZGVyIGhlYWRlcjsgLyoqPCBIZWFkZXIgbmV0d29yayBkYXRhIGFuZCBhc3NvY2lhdGVkIGNhY2hlICovCisKKyAgREJ1c1N0cmluZyBib2R5OyAgIC8qKjwgQm9keSBuZXR3b3JrIGRhdGEuICovCisKKyAgdW5zaWduZWQgaW50IGxvY2tlZCA6IDE7IC8qKjwgTWVzc2FnZSBiZWluZyBzZW50LCBubyBtb2RpZmljYXRpb25zIGFsbG93ZWQuICovCisKKyNpZm5kZWYgREJVU19ESVNBQkxFX0NIRUNLUworICB1bnNpZ25lZCBpbnQgaW5fY2FjaGUgOiAxOyAvKio8IEhhcyBiZWVuICJmcmVlZCIgc2luY2UgaXQncyBpbiB0aGUgY2FjaGUgKHRoaXMgaXMgYSBkZWJ1ZyBmZWF0dXJlKSAqLworI2VuZGlmCisKKyAgREJ1c0xpc3QgKmNvdW50ZXJzOyAgIC8qKjwgMC1OIERCdXNDb3VudGVyIHVzZWQgdG8gdHJhY2sgbWVzc2FnZSBzaXplL3VuaXggZmRzLiAqLworICBsb25nIHNpemVfY291bnRlcl9kZWx0YTsgICAvKio8IFNpemUgd2UgaW5jcmVtZW50ZWQgdGhlIHNpemUgY291bnRlcnMgYnkuICAgKi8KKworICBkYnVzX3VpbnQzMl90IGNoYW5nZWRfc3RhbXAgOiBDSEFOR0VEX1NUQU1QX0JJVFM7IC8qKjwgSW5jcmVtZW50ZWQgd2hlbiBpdGVyYXRvcnMgYXJlIGludmFsaWRhdGVkLiAqLworCisgIERCdXNEYXRhU2xvdExpc3Qgc2xvdF9saXN0OyAgIC8qKjwgRGF0YSBzdG9yZWQgYnkgYWxsb2NhdGVkIGludGVnZXIgSUQgKi8KKworI2lmbmRlZiBEQlVTX0RJU0FCTEVfQ0hFQ0tTCisgIGludCBnZW5lcmF0aW9uOyAvKio8IF9kYnVzX2N1cnJlbnRfZ2VuZXJhdGlvbiB3aGVuIG1lc3NhZ2Ugd2FzIGNyZWF0ZWQgKi8KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9VTklYX0ZEX1BBU1NJTkcKKyAgaW50ICp1bml4X2ZkczsKKyAgLyoqPCBVbml4IGZpbGUgZGVzY3JpcHRvcnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbWVzc2FnZS4gVGhlc2UgYXJlCisgICAgIGNsb3NlZCB3aGVuIHRoZSBtZXNzYWdlIGlzIGRlc3Ryb3llZCwgaGVuY2UgbWFrZSBzdXJlIHRvIGR1cCgpCisgICAgIHRoZW0gd2hlbiBhZGRpbmcgb3IgcmVtb3ZpbmcgdGhlbSBoZXJlLiAqLworICB1bnNpZ25lZCBuX3VuaXhfZmRzOyAvKio8IE51bWJlciBvZiB2YWxpZCBmZHMgaW4gdGhlIGFycmF5ICovCisgIHVuc2lnbmVkIG5fdW5peF9mZHNfYWxsb2NhdGVkOyAvKio8IEFsbG9jYXRlZCBzaXplIG9mIHRoZSBhcnJheSAqLworCisgIGxvbmcgdW5peF9mZF9jb3VudGVyX2RlbHRhOyAvKio8IFNpemUgd2UgaW5jcmVtZW50ZWQgdGhlIHVuaXggZmQgY291bnRlciBieSAqLworI2VuZGlmCit9OworCitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCBfZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2FyZ3NfdmFsaXN0IChEQnVzTWVzc2FnZUl0ZXIgKml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgKmVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICBmaXJzdF9hcmdfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhX2xpc3QgICAgICAgICAgdmFyX2FyZ3MpOworCisvKiogQH0gKi8KKworREJVU19FTkRfREVDTFMKKworI2VuZGlmIC8qIERCVVNfTUVTU0FHRV9IICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtbWVzc2FnZS11dGlsLmMgYi9kYnVzL2RidXMtbWVzc2FnZS11dGlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJmMDBlMgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1tZXNzYWdlLXV0aWwuYwpAQCAtMCwwICsxLDE4MzEgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1tZXNzYWdlLXV0aWwuYyBXb3VsZCBiZSBpbiBkYnVzLW1lc3NhZ2UuYywgYnV0IG9ubHkgdXNlZCBieSBidXMvdGVzdHMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUgIFJlZCBIYXQgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzICBDb2RlRmFjdG9yeSBBQgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgImRidXMtaW50ZXJuYWxzLmgiCisjaW5jbHVkZSAiZGJ1cy10ZXN0LmgiCisjaW5jbHVkZSAiZGJ1cy1tZXNzYWdlLXByaXZhdGUuaCIKKyNpbmNsdWRlICJkYnVzLW1hcnNoYWwtcmVjdXJzaXZlLmgiCisjaW5jbHVkZSAiZGJ1cy1zdHJpbmcuaCIKKyNpZmRlZiBIQVZFX1VOSVhfRkRfUEFTU0lORworI2luY2x1ZGUgImRidXMtc3lzZGVwcy11bml4LmgiCisjZW5kaWYKKworI2lmZGVmIF9fbGludXhfXworLyogTmVjZXNzYXJ5IGZvciB0aGUgTGludXgtc3BlY2lmaWMgZmQgbGVhayBjaGVja2luZyBjb2RlIG9ubHkgKi8KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2VuZGlmCisKKy8qKgorICogQGFkZHRvZ3JvdXAgREJ1c01lc3NhZ2UKKyAqIEB7CisgKi8KKworLyoqCisgKiBHZXRzIHRoZSBudW1iZXIgb2YgdW5peCBmZHMgYXR0YWNoZWQgdG8gdGhpcyBtZXNzYWdlLgorICoKKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlCisgKiBAcmV0dXJucyB0aGUgbnVtYmVyIG9mIGZpbGUgZGVzY3JpcHRvcnMKKyAqLwordW5zaWduZWQgaW50CitfZGJ1c19tZXNzYWdlX2dldF9uX3VuaXhfZmRzIChEQnVzTWVzc2FnZSAqbWVzc2FnZSkKK3sKKyNpZmRlZiBIQVZFX1VOSVhfRkRfUEFTU0lORworICByZXR1cm4gbWVzc2FnZS0+bl91bml4X2ZkczsKKyNlbHNlCisgIHJldHVybiAwOworI2VuZGlmCit9CisKKyNpZmRlZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworLyoqCisgKiBSZWFkcyBhcmd1bWVudHMgZnJvbSBhIG1lc3NhZ2UgaXRlcmF0b3IgZ2l2ZW4gYSB2YXJpYWJsZSBhcmd1bWVudAorICogbGlzdC4gT25seSBhcmd1bWVudHMgb2YgYmFzaWMgdHlwZSBhbmQgYXJyYXlzIG9mIGZpeGVkLWxlbmd0aAorICogYmFzaWMgdHlwZSBtYXkgYmUgcmVhZCB3aXRoIHRoaXMgZnVuY3Rpb24uIFNlZQorICogZGJ1c19tZXNzYWdlX2dldF9hcmdzKCkgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBAcGFyYW0gaXRlciB0aGUgbWVzc2FnZSBpdGVyYXRvcgorICogQHBhcmFtIGVycm9yIGVycm9yIHRvIGJlIGZpbGxlZCBpbiBvbiBmYWlsdXJlCisgKiBAcGFyYW0gZmlyc3RfYXJnX3R5cGUgdGhlIGZpcnN0IGFyZ3VtZW50IHR5cGUKKyAqIEBwYXJhbSAuLi4gbG9jYXRpb24gZm9yIGZpcnN0IGFyZ3VtZW50IHZhbHVlLCB0aGVuIGxpc3Qgb2YgdHlwZS1sb2NhdGlvbiBwYWlycworICogQHJldHVybnMgI0ZBTFNFIGlmIHRoZSBlcnJvciB3YXMgc2V0CisgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAorZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2FyZ3MgKERCdXNNZXNzYWdlSXRlciAqaXRlciwKKwkJCSAgICBEQnVzRXJyb3IgICAgICAgKmVycm9yLAorCQkJICAgIGludCAgICAgICAgICAgICAgZmlyc3RfYXJnX3R5cGUsCisJCQkgICAgLi4uKQoreworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIHZhX2xpc3QgdmFyX2FyZ3M7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChpdGVyICE9IE5VTEwsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9lcnJvcl9pc19zZXQgKGVycm9yLCBGQUxTRSk7CisKKyAgdmFfc3RhcnQgKHZhcl9hcmdzLCBmaXJzdF9hcmdfdHlwZSk7CisgIHJldHZhbCA9IF9kYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJnc192YWxpc3QgKGl0ZXIsIGVycm9yLCBmaXJzdF9hcmdfdHlwZSwgdmFyX2FyZ3MpOworICB2YV9lbmQgKHZhcl9hcmdzKTsKKworICByZXR1cm4gcmV0dmFsOworfQorI2VuZGlmIC8qIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTICovCisKKy8qKiBAfSAqLworCisjaWZkZWYgREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMKKyNpbmNsdWRlICJkYnVzLXRlc3QuaCIKKyNpbmNsdWRlICJkYnVzLW1lc3NhZ2UtZmFjdG9yeS5oIgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKK3N0YXRpYyBpbnQgdmFsaWRpdGllc19zZWVuW0RCVVNfVkFMSURJVFlfTEFTVCArIF9EQlVTX05FR0FUSVZFX1ZBTElESVRZX0NPVU5UXTsKKworc3RhdGljIHZvaWQKK3Jlc2V0X3ZhbGlkaXRpZXNfc2VlbiAodm9pZCkKK3sKKyAgaW50IGk7CisgIGkgPSAwOworICB3aGlsZSAoaSA8IF9EQlVTX05fRUxFTUVOVFMgKHZhbGlkaXRpZXNfc2VlbikpCisgICAgeworICAgICAgdmFsaWRpdGllc19zZWVuW2ldID0gMDsKKyAgICAgICsraTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCityZWNvcmRfdmFsaWRpdHlfc2VlbiAoREJ1c1ZhbGlkaXR5IHZhbGlkaXR5KQoreworICB2YWxpZGl0aWVzX3NlZW5bdmFsaWRpdHkgKyBfREJVU19ORUdBVElWRV9WQUxJRElUWV9DT1VOVF0gKz0gMTsKK30KKworc3RhdGljIHZvaWQKK3ByaW50X3ZhbGlkaXRpZXNfc2VlbiAoZGJ1c19ib29sX3Qgbm90X3NlZW4pCit7CisgIGludCBpOworICBpID0gMDsKKyAgd2hpbGUgKGkgPCBfREJVU19OX0VMRU1FTlRTICh2YWxpZGl0aWVzX3NlZW4pKQorICAgIHsKKyAgICAgIGlmICgoaSAtIF9EQlVTX05FR0FUSVZFX1ZBTElESVRZX0NPVU5UKSA9PSBEQlVTX1ZBTElESVRZX1VOS05PV04gfHwKKyAgICAgICAgICAoaSAtIF9EQlVTX05FR0FUSVZFX1ZBTElESVRZX0NPVU5UKSA9PSBEQlVTX0lOVkFMSURfRk9SX1VOS05PV05fUkVBU09OKQorICAgICAgICA7CisgICAgICBlbHNlIGlmICgobm90X3NlZW4gJiYgdmFsaWRpdGllc19zZWVuW2ldID09IDApIHx8CisgICAgICAgICAgICAgICAoIW5vdF9zZWVuICYmIHZhbGlkaXRpZXNfc2VlbltpXSA+IDApKQorICAgICAgICBwcmludGYgKCJ2YWxpZGl0eSAlM2Qgc2VlbiAlZCB0aW1lc1xuIiwKKyAgICAgICAgICAgICAgICBpIC0gX0RCVVNfTkVHQVRJVkVfVkFMSURJVFlfQ09VTlQsCisgICAgICAgICAgICAgICAgdmFsaWRpdGllc19zZWVuW2ldKTsKKyAgICAgICsraTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitjaGVja19tZW1sZWFrcyAodm9pZCkKK3sKKyAgZGJ1c19zaHV0ZG93biAoKTsKKworICBpZiAoX2RidXNfZ2V0X21hbGxvY19ibG9ja3Nfb3V0c3RhbmRpbmcgKCkgIT0gMCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiJWQgZGJ1c19tYWxsb2MgYmxvY2tzIHdlcmUgbm90IGZyZWVkIGluICVzIiwKKyAgICAgICAgICAgICAgICAgIF9kYnVzX2dldF9tYWxsb2NfYmxvY2tzX291dHN0YW5kaW5nICgpLCBfX0ZJTEVfXyk7CisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJtZW1sZWFrcyIpOworICAgIH0KK30KKworI2lmZGVmIF9fbGludXhfXworc3RydWN0IERCdXNJbml0aWFsRkRzIHsKKyAgICBmZF9zZXQgc2V0OworfTsKKyNlbmRpZgorCitEQnVzSW5pdGlhbEZEcyAqCitfZGJ1c19jaGVja19mZGxlYWtzX2VudGVyICh2b2lkKQoreworI2lmZGVmIF9fbGludXhfXworICBESVIgKmQ7CisgIERCdXNJbml0aWFsRkRzICpmZHM7CisKKyAgLyogdGhpcyBpcyBwbGFpbiBtYWxsb2Mgc28gaXQgd29uJ3QgaW50ZXJmZXJlIHdpdGggbGVhayBjaGVja2luZyAqLworICBmZHMgPSBtYWxsb2MgKHNpemVvZiAoREJ1c0luaXRpYWxGRHMpKTsKKyAgX2RidXNfYXNzZXJ0IChmZHMgIT0gTlVMTCk7CisKKyAgLyogVGhpcyB3b3JrcyBvbiBMaW51eCBvbmx5ICovCisKKyAgaWYgKChkID0gb3BlbmRpciAoIi9wcm9jL3NlbGYvZmQiKSkpCisgICAgeworICAgICAgc3RydWN0IGRpcmVudCAqZGU7CisKKyAgICAgIHdoaWxlICgoZGUgPSByZWFkZGlyKGQpKSkKKyAgICAgICAgeworICAgICAgICAgIGxvbmcgbDsKKyAgICAgICAgICBjaGFyICplID0gTlVMTDsKKyAgICAgICAgICBpbnQgZmQ7CisKKyAgICAgICAgICBpZiAoZGUtPmRfbmFtZVswXSA9PSAnLicpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgIGVycm5vID0gMDsKKyAgICAgICAgICBsID0gc3RydG9sIChkZS0+ZF9uYW1lLCAmZSwgMTApOworICAgICAgICAgIF9kYnVzX2Fzc2VydCAoZXJybm8gPT0gMCAmJiBlICYmICEqZSk7CisKKyAgICAgICAgICBmZCA9IChpbnQpIGw7CisKKyAgICAgICAgICBpZiAoZmQgPCAzKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICBpZiAoZmQgPT0gZGlyZmQgKGQpKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICBpZiAoZmQgPj0gRkRfU0VUU0laRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkZEICVkIHVuZXhwZWN0ZWRseSBsYXJnZTsgY2Fubm90IHRyYWNrIHdoZXRoZXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaXQgaXMgbGVha2VkXG4iLCBmZCk7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgRkRfU0VUIChmZCwgJmZkcy0+c2V0KTsKKyAgICAgICAgfQorCisgICAgICBjbG9zZWRpciAoZCk7CisgICAgfQorCisgIHJldHVybiBmZHM7CisjZWxzZQorICByZXR1cm4gTlVMTDsKKyNlbmRpZgorfQorCit2b2lkCitfZGJ1c19jaGVja19mZGxlYWtzX2xlYXZlIChEQnVzSW5pdGlhbEZEcyAqZmRzKQoreworI2lmZGVmIF9fbGludXhfXworICBESVIgKmQ7CisKKyAgLyogVGhpcyB3b3JrcyBvbiBMaW51eCBvbmx5ICovCisKKyAgaWYgKChkID0gb3BlbmRpciAoIi9wcm9jL3NlbGYvZmQiKSkpCisgICAgeworICAgICAgc3RydWN0IGRpcmVudCAqZGU7CisKKyAgICAgIHdoaWxlICgoZGUgPSByZWFkZGlyKGQpKSkKKyAgICAgICAgeworICAgICAgICAgIGxvbmcgbDsKKyAgICAgICAgICBjaGFyICplID0gTlVMTDsKKyAgICAgICAgICBpbnQgZmQ7CisKKyAgICAgICAgICBpZiAoZGUtPmRfbmFtZVswXSA9PSAnLicpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgIGVycm5vID0gMDsKKyAgICAgICAgICBsID0gc3RydG9sIChkZS0+ZF9uYW1lLCAmZSwgMTApOworICAgICAgICAgIF9kYnVzX2Fzc2VydCAoZXJybm8gPT0gMCAmJiBlICYmICEqZSk7CisKKyAgICAgICAgICBmZCA9IChpbnQpIGw7CisKKyAgICAgICAgICBpZiAoZmQgPCAzKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICBpZiAoZmQgPT0gZGlyZmQgKGQpKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICBpZiAoZmQgPj0gRkRfU0VUU0laRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkZEICVkIHVuZXhwZWN0ZWRseSBsYXJnZTsgY2Fubm90IHRyYWNrIHdoZXRoZXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaXQgaXMgbGVha2VkXG4iLCBmZCk7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKEZEX0lTU0VUIChmZCwgJmZkcy0+c2V0KSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgX2RidXNfd2FybiAoImZpbGUgZGVzY3JpcHRvciAlaSBsZWFrZWQgaW4gJXMuIiwgZmQsIF9fRklMRV9fKTsKKyAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJmZGxlYWtzIik7CisgICAgICAgIH0KKworICAgICAgY2xvc2VkaXIgKGQpOworICAgIH0KKworICBmcmVlIChmZHMpOworI2Vsc2UKKyAgX2RidXNfYXNzZXJ0IChmZHMgPT0gTlVMTCk7CisjZW5kaWYKK30KKworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19oYXZlX3ZhbGlkX21lc3NhZ2UgKERCdXNNZXNzYWdlTG9hZGVyICpsb2FkZXIpCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisKKyAgbWVzc2FnZSA9IE5VTEw7CisgIHJldHZhbCA9IEZBTFNFOworCisgIGlmIChfZGJ1c19tZXNzYWdlX2xvYWRlcl9nZXRfaXNfY29ycnVwdGVkIChsb2FkZXIpKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJsb2FkZXIgY29ycnVwdGVkIG9uIG1lc3NhZ2UgdGhhdCB3YXMgZXhwZWN0ZWQgdG8gYmUgdmFsaWQ7IGludmFsaWQgcmVhc29uICVkIiwKKyAgICAgICAgICAgICAgICAgIGxvYWRlci0+Y29ycnVwdGlvbl9yZWFzb24pOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIG1lc3NhZ2UgPSBfZGJ1c19tZXNzYWdlX2xvYWRlcl9wb3BfbWVzc2FnZSAobG9hZGVyKTsKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiZGlkbid0IGxvYWQgbWVzc2FnZSB0aGF0IHdhcyBleHBlY3RlZCB0byBiZSB2YWxpZCAobWVzc2FnZSBub3QgcG9wcGVkKSIpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmxvYWRlci0+ZGF0YSkgPiAwKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJoYWQgbGVmdG92ZXIgYnl0ZXMgZnJvbSBleHBlY3RlZC10by1iZS12YWxpZCBzaW5nbGUgbWVzc2FnZSIpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisjaWYgMAorICAvKiBGSVhNRSAqLworICAvKiBWZXJpZnkgdGhhdCB3ZSdyZSBhYmxlIHRvIHByb3Blcmx5IGRlYWwgd2l0aCB0aGUgbWVzc2FnZS4KKyAgICogRm9yIGV4YW1wbGUsIHRoaXMgd291bGQgZGV0ZWN0IGltcHJvcGVyIGhhbmRsaW5nIG9mIG1lc3NhZ2VzCisgICAqIGluIG5vbnN0YW5kYXJkIGJ5dGUgb3JkZXIuCisgICAqLworICBpZiAoIWNoZWNrX21lc3NhZ2VfaGFuZGxpbmcgKG1lc3NhZ2UpKQorICAgIGdvdG8gZmFpbGVkOworI2VuZGlmCisKKyAgcmVjb3JkX3ZhbGlkaXR5X3NlZW4gKERCVVNfVkFMSUQpOworICAKKyAgcmV0dmFsID0gVFJVRTsKKworIGZhaWxlZDoKKyAgaWYgKG1lc3NhZ2UpCisgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX2ludmFsaWRfbWVzc2FnZSAoREJ1c01lc3NhZ2VMb2FkZXIgKmxvYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgREJ1c1ZhbGlkaXR5ICAgICAgIGV4cGVjdGVkX3ZhbGlkaXR5KQoreworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisKKyAgcmV0dmFsID0gRkFMU0U7CisKKyAgaWYgKCFfZGJ1c19tZXNzYWdlX2xvYWRlcl9nZXRfaXNfY29ycnVwdGVkIChsb2FkZXIpKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJsb2FkZXIgbm90IGNvcnJ1cHRlZCBvbiBtZXNzYWdlIHRoYXQgd2FzIGV4cGVjdGVkIHRvIGJlIGludmFsaWQiKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICByZWNvcmRfdmFsaWRpdHlfc2VlbiAobG9hZGVyLT5jb3JydXB0aW9uX3JlYXNvbik7CisgIAorICBpZiAoZXhwZWN0ZWRfdmFsaWRpdHkgIT0gREJVU19JTlZBTElEX0ZPUl9VTktOT1dOX1JFQVNPTiAmJgorICAgICAgbG9hZGVyLT5jb3JydXB0aW9uX3JlYXNvbiAhPSBleHBlY3RlZF92YWxpZGl0eSkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiZXhwZWN0ZWQgbWVzc2FnZSB0byBiZSBjb3JydXB0ZWQgZm9yIHJlYXNvbiAlZCBhbmQgd2FzIGNvcnJ1cHRlZCBmb3IgJWQgaW5zdGVhZCIsCisgICAgICAgICAgICAgICAgICBleHBlY3RlZF92YWxpZGl0eSwgbG9hZGVyLT5jb3JydXB0aW9uX3JlYXNvbik7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgcmV0dmFsID0gVFJVRTsKKworIGZhaWxlZDoKKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19pbmNvbXBsZXRlX21lc3NhZ2UgKERCdXNNZXNzYWdlTG9hZGVyICpsb2FkZXIpCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisKKyAgbWVzc2FnZSA9IE5VTEw7CisgIHJldHZhbCA9IEZBTFNFOworCisgIGlmIChfZGJ1c19tZXNzYWdlX2xvYWRlcl9nZXRfaXNfY29ycnVwdGVkIChsb2FkZXIpKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJsb2FkZXIgY29ycnVwdGVkIG9uIG1lc3NhZ2UgdGhhdCB3YXMgZXhwZWN0ZWQgdG8gYmUgdmFsaWQgKGJ1dCBpbmNvbXBsZXRlKSwgY29ycnVwdGlvbiByZWFzb24gJWQiLAorICAgICAgICAgICAgICAgICAgbG9hZGVyLT5jb3JydXB0aW9uX3JlYXNvbik7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgbWVzc2FnZSA9IF9kYnVzX21lc3NhZ2VfbG9hZGVyX3BvcF9tZXNzYWdlIChsb2FkZXIpOworICBpZiAobWVzc2FnZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJsb2FkZWQgbWVzc2FnZSB0aGF0IHdhcyBleHBlY3RlZCB0byBiZSBpbmNvbXBsZXRlIik7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgcmVjb3JkX3ZhbGlkaXR5X3NlZW4gKERCVVNfVkFMSURfQlVUX0lOQ09NUExFVEUpOworICByZXR2YWwgPSBUUlVFOworCisgZmFpbGVkOgorICBpZiAobWVzc2FnZSkKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX2xvYWRlcl9yZXN1bHRzIChEQnVzTWVzc2FnZUxvYWRlciAgICAgICpsb2FkZXIsCisgICAgICAgICAgICAgICAgICAgICAgREJ1c1ZhbGlkaXR5ICAgICAgICAgICAgZXhwZWN0ZWRfdmFsaWRpdHkpCit7CisgIGlmICghX2RidXNfbWVzc2FnZV9sb2FkZXJfcXVldWVfbWVzc2FnZXMgKGxvYWRlcikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5IHRvIHF1ZXVlIG1lc3NhZ2VzIik7CisKKyAgaWYgKGV4cGVjdGVkX3ZhbGlkaXR5ID09IERCVVNfVkFMSUQpCisgICAgcmV0dXJuIGNoZWNrX2hhdmVfdmFsaWRfbWVzc2FnZSAobG9hZGVyKTsKKyAgZWxzZSBpZiAoZXhwZWN0ZWRfdmFsaWRpdHkgPT0gREJVU19WQUxJRF9CVVRfSU5DT01QTEVURSkKKyAgICByZXR1cm4gY2hlY2tfaW5jb21wbGV0ZV9tZXNzYWdlIChsb2FkZXIpOworICBlbHNlIGlmIChleHBlY3RlZF92YWxpZGl0eSA9PSBEQlVTX1ZBTElESVRZX1VOS05PV04pCisgICAgeworICAgICAgLyogaGVyZSB3ZSBqdXN0IGtub3cgd2UgZGlkbid0IHNlZ2ZhdWx0IGFuZCB0aGF0IHdhcyB0aGUKKyAgICAgICAqIG9ubHkgdGVzdC4gQWxzbywgd2UgcmVjb3JkIHRoYXQgd2UgZ290IGNvdmVyYWdlCisgICAgICAgKiBmb3IgdGhlIHZhbGlkaXR5IHJlYXNvbi4KKyAgICAgICAqLworICAgICAgaWYgKF9kYnVzX21lc3NhZ2VfbG9hZGVyX2dldF9pc19jb3JydXB0ZWQgKGxvYWRlcikpCisgICAgICAgIHJlY29yZF92YWxpZGl0eV9zZWVuIChsb2FkZXItPmNvcnJ1cHRpb25fcmVhc29uKTsKKyAgICAgIAorICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICBlbHNlCisgICAgcmV0dXJuIGNoZWNrX2ludmFsaWRfbWVzc2FnZSAobG9hZGVyLCBleHBlY3RlZF92YWxpZGl0eSk7Cit9CisKKy8qKgorICogTG9hZHMgdGhlIG1lc3NhZ2UgaW4gdGhlIGdpdmVuIG1lc3NhZ2UgZmlsZS4KKyAqCisgKiBAcGFyYW0gZmlsZW5hbWUgZmlsZW5hbWUgdG8gbG9hZAorICogQHBhcmFtIGRhdGEgc3RyaW5nIHRvIGxvYWQgbWVzc2FnZSBpbnRvCisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGUgbWVzc2FnZSB3YXMgbG9hZGVkCisgKi8KK2RidXNfYm9vbF90CitkYnVzX2ludGVybmFsX2RvX25vdF91c2VfbG9hZF9tZXNzYWdlX2ZpbGUgKGNvbnN0IERCdXNTdHJpbmcgICAgKmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICAgICpkYXRhKQoreworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIERCdXNFcnJvciBlcnJvciA9IERCVVNfRVJST1JfSU5JVDsKKworICByZXR2YWwgPSBGQUxTRTsKKworICBfZGJ1c192ZXJib3NlICgiTG9hZGluZyByYXcgJXNcbiIsIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoZmlsZW5hbWUpKTsKKyAgaWYgKCFfZGJ1c19maWxlX2dldF9jb250ZW50cyAoZGF0YSwgZmlsZW5hbWUsICZlcnJvcikpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkNvdWxkIG5vdCBsb2FkIG1lc3NhZ2UgZmlsZSAlczogJXMiLAorICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChmaWxlbmFtZSksCisgICAgICAgICAgICAgICAgICBlcnJvci5tZXNzYWdlKTsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICByZXR2YWwgPSBUUlVFOworCisgZmFpbGVkOgorCisgIHJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogVHJpZXMgbG9hZGluZyB0aGUgbWVzc2FnZSBpbiB0aGUgZ2l2ZW4gbWVzc2FnZSBmaWxlCisgKiBhbmQgdmVyaWZpZXMgdGhhdCBEQnVzTWVzc2FnZUxvYWRlciBjYW4gaGFuZGxlIGl0LgorICoKKyAqIEBwYXJhbSBmaWxlbmFtZSBmaWxlbmFtZSB0byBsb2FkCisgKiBAcGFyYW0gZXhwZWN0ZWRfdmFsaWRpdHkgd2hhdCB0aGUgbWVzc2FnZSBoYXMgdG8gYmUgbGlrZSB0byByZXR1cm4gI1RSVUUKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSBtZXNzYWdlIGhhcyB0aGUgZXhwZWN0ZWQgdmFsaWRpdHkKKyAqLworZGJ1c19ib29sX3QKK2RidXNfaW50ZXJuYWxfZG9fbm90X3VzZV90cnlfbWVzc2FnZV9maWxlIChjb25zdCBEQnVzU3RyaW5nICAgICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVmFsaWRpdHkgICAgICAgICBleHBlY3RlZF92YWxpZGl0eSkKK3sKKyAgREJ1c1N0cmluZyBkYXRhOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisKKyAgcmV0dmFsID0gRkFMU0U7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmRhdGEpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkIG5vdCBhbGxvY2F0ZSBzdHJpbmciKTsKKworICBpZiAoIWRidXNfaW50ZXJuYWxfZG9fbm90X3VzZV9sb2FkX21lc3NhZ2VfZmlsZSAoZmlsZW5hbWUsICZkYXRhKSkKKyAgICBnb3RvIGZhaWxlZDsKKworICByZXR2YWwgPSBkYnVzX2ludGVybmFsX2RvX25vdF91c2VfdHJ5X21lc3NhZ2VfZGF0YSAoJmRhdGEsIGV4cGVjdGVkX3ZhbGlkaXR5KTsKKworIGZhaWxlZDoKKworICBpZiAoIXJldHZhbCkKKyAgICB7CisgICAgICBpZiAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZkYXRhKSA+IDApCisgICAgICAgIF9kYnVzX3ZlcmJvc2VfYnl0ZXNfb2Zfc3RyaW5nICgmZGF0YSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmZGF0YSkpOworCisgICAgICBfZGJ1c193YXJuICgiRmFpbGVkIG1lc3NhZ2UgbG9hZGVyIHRlc3Qgb24gJXMiLAorICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChmaWxlbmFtZSkpOworICAgIH0KKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmRhdGEpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogVHJpZXMgbG9hZGluZyB0aGUgZ2l2ZW4gbWVzc2FnZSBkYXRhLgorICoKKyAqCisgKiBAcGFyYW0gZGF0YSB0aGUgbWVzc2FnZSBkYXRhCisgKiBAcGFyYW0gZXhwZWN0ZWRfdmFsaWRpdHkgd2hhdCB0aGUgbWVzc2FnZSBoYXMgdG8gYmUgbGlrZSB0byByZXR1cm4gI1RSVUUKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSBtZXNzYWdlIGhhcyB0aGUgZXhwZWN0ZWQgdmFsaWRpdHkKKyAqLworZGJ1c19ib29sX3QKK2RidXNfaW50ZXJuYWxfZG9fbm90X3VzZV90cnlfbWVzc2FnZV9kYXRhIChjb25zdCBEQnVzU3RyaW5nICAgICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNWYWxpZGl0eSAgICAgICAgIGV4cGVjdGVkX3ZhbGlkaXR5KQoreworICBEQnVzTWVzc2FnZUxvYWRlciAqbG9hZGVyOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIGludCBsZW47CisgIGludCBpOworCisgIGxvYWRlciA9IE5VTEw7CisgIHJldHZhbCA9IEZBTFNFOworCisgIC8qIFdyaXRlIHRoZSBkYXRhIG9uZSBieXRlIGF0IGEgdGltZSAqLworCisgIGxvYWRlciA9IF9kYnVzX21lc3NhZ2VfbG9hZGVyX25ldyAoKTsKKyAgaWYgKGxvYWRlciA9PSBOVUxMKQorICAgIGdvdG8gZmFpbGVkOworCisgIC8qIGNoZWNrIHNvbWUgdHJpdmlhbCBsb2FkZXIgZnVuY3Rpb25zICovCisgIF9kYnVzX21lc3NhZ2VfbG9hZGVyX3JlZiAobG9hZGVyKTsKKyAgX2RidXNfbWVzc2FnZV9sb2FkZXJfdW5yZWYgKGxvYWRlcik7CisKKyAgbGVuID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGRhdGEpOworICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisgICAgeworICAgICAgREJ1c1N0cmluZyAqYnVmZmVyOworCisgICAgICBfZGJ1c19tZXNzYWdlX2xvYWRlcl9nZXRfYnVmZmVyIChsb2FkZXIsICZidWZmZXIsIE5VTEwsIE5VTEwpOworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX2J5dGUgKGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKGRhdGEsIGkpKSkKKyAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICBfZGJ1c19tZXNzYWdlX2xvYWRlcl9yZXR1cm5fYnVmZmVyIChsb2FkZXIsIGJ1ZmZlcik7CisgICAgfQorCisgIGlmICghY2hlY2tfbG9hZGVyX3Jlc3VsdHMgKGxvYWRlciwgZXhwZWN0ZWRfdmFsaWRpdHkpKQorICAgIGdvdG8gZmFpbGVkOworCisgIF9kYnVzX21lc3NhZ2VfbG9hZGVyX3VucmVmIChsb2FkZXIpOworICBsb2FkZXIgPSBOVUxMOworCisgIC8qIFdyaXRlIHRoZSBkYXRhIGFsbCBhdCBvbmNlICovCisKKyAgbG9hZGVyID0gX2RidXNfbWVzc2FnZV9sb2FkZXJfbmV3ICgpOworICBpZiAobG9hZGVyID09IE5VTEwpCisgICAgZ290byBmYWlsZWQ7CisKKyAgeworICAgIERCdXNTdHJpbmcgKmJ1ZmZlcjsKKworICAgIF9kYnVzX21lc3NhZ2VfbG9hZGVyX2dldF9idWZmZXIgKGxvYWRlciwgJmJ1ZmZlciwgTlVMTCwgTlVMTCk7CisgICAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAoZGF0YSwgMCwgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChidWZmZXIpKSkKKyAgICAgICAgZ290byBmYWlsZWQ7CisgICAgX2RidXNfbWVzc2FnZV9sb2FkZXJfcmV0dXJuX2J1ZmZlciAobG9hZGVyLCBidWZmZXIpOworICB9CisKKyAgaWYgKCFjaGVja19sb2FkZXJfcmVzdWx0cyAobG9hZGVyLCBleHBlY3RlZF92YWxpZGl0eSkpCisgICAgZ290byBmYWlsZWQ7CisKKyAgX2RidXNfbWVzc2FnZV9sb2FkZXJfdW5yZWYgKGxvYWRlcik7CisgIGxvYWRlciA9IE5VTEw7CisKKyAgLyogV3JpdGUgdGhlIGRhdGEgMiBieXRlcyBhdCBhIHRpbWUgKi8KKworICBsb2FkZXIgPSBfZGJ1c19tZXNzYWdlX2xvYWRlcl9uZXcgKCk7CisgIGlmIChsb2FkZXIgPT0gTlVMTCkKKyAgICBnb3RvIGZhaWxlZDsKKworICBsZW4gPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoZGF0YSk7CisgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gMikKKyAgICB7CisgICAgICBEQnVzU3RyaW5nICpidWZmZXI7CisKKyAgICAgIF9kYnVzX21lc3NhZ2VfbG9hZGVyX2dldF9idWZmZXIgKGxvYWRlciwgJmJ1ZmZlciwgTlVMTCwgTlVMTCk7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfYnl0ZSAoYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoZGF0YSwgaSkpKQorICAgICAgICBnb3RvIGZhaWxlZDsKKworICAgICAgaWYgKChpKzEpIDwgbGVuKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX2J5dGUgKGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9ieXRlIChkYXRhLCBpKzEpKSkKKyAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICB9CisKKyAgICAgIF9kYnVzX21lc3NhZ2VfbG9hZGVyX3JldHVybl9idWZmZXIgKGxvYWRlciwgYnVmZmVyKTsKKyAgICB9CisKKyAgaWYgKCFjaGVja19sb2FkZXJfcmVzdWx0cyAobG9hZGVyLCBleHBlY3RlZF92YWxpZGl0eSkpCisgICAgZ290byBmYWlsZWQ7CisKKyAgX2RidXNfbWVzc2FnZV9sb2FkZXJfdW5yZWYgKGxvYWRlcik7CisgIGxvYWRlciA9IE5VTEw7CisKKyAgcmV0dmFsID0gVFJVRTsKKworIGZhaWxlZDoKKworICBpZiAobG9hZGVyKQorICAgIF9kYnVzX21lc3NhZ2VfbG9hZGVyX3VucmVmIChsb2FkZXIpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorcHJvY2Vzc190ZXN0X3N1YmRpciAoY29uc3QgREJ1c1N0cmluZyAgICAgICAgICAqdGVzdF9iYXNlX2RpciwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICAgICAgICAgKnN1YmRpciwKKyAgICAgICAgICAgICAgICAgICAgIERCdXNWYWxpZGl0eSAgICAgICAgICAgICAgIGV4cGVjdGVkX3ZhbGlkaXR5LAorICAgICAgICAgICAgICAgICAgICAgREJ1c0ZvcmVhY2hNZXNzYWdlRmlsZUZ1bmMgZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICp1c2VyX2RhdGEpCit7CisgIERCdXNTdHJpbmcgdGVzdF9kaXJlY3Rvcnk7CisgIERCdXNTdHJpbmcgZmlsZW5hbWU7CisgIERCdXNEaXJJdGVyICpkaXI7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgREJ1c0Vycm9yIGVycm9yID0gREJVU19FUlJPUl9JTklUOworCisgIHJldHZhbCA9IEZBTFNFOworICBkaXIgPSBOVUxMOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZ0ZXN0X2RpcmVjdG9yeSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZGlkbid0IGFsbG9jYXRlIHRlc3RfZGlyZWN0b3J5Iik7CisKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZmaWxlbmFtZSwgc3ViZGlyKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5ICh0ZXN0X2Jhc2VfZGlyLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGVzdF9kaXJlY3RvcnksIDApKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkbid0IGNvcHkgdGVzdF9iYXNlX2RpciB0byB0ZXN0X2RpcmVjdG9yeSIpOworCisgIGlmICghX2RidXNfY29uY2F0X2Rpcl9hbmRfZmlsZSAoJnRlc3RfZGlyZWN0b3J5LCAmZmlsZW5hbWUpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkbid0IGFsbG9jYXRlIGZ1bGwgcGF0aCIpOworCisgIF9kYnVzX3N0cmluZ19mcmVlICgmZmlsZW5hbWUpOworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZmlsZW5hbWUpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImRpZG4ndCBhbGxvY2F0ZSBmaWxlbmFtZSBzdHJpbmciKTsKKworICBkaXIgPSBfZGJ1c19kaXJlY3Rvcnlfb3BlbiAoJnRlc3RfZGlyZWN0b3J5LCAmZXJyb3IpOworICBpZiAoZGlyID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkNvdWxkIG5vdCBvcGVuICVzOiAlcyIsCisgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZ0ZXN0X2RpcmVjdG9yeSksCisgICAgICAgICAgICAgICAgICBlcnJvci5tZXNzYWdlKTsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICBwcmludGYgKCJUZXN0aW5nICVzOlxuIiwgc3ViZGlyKTsKKworIG5leHQ6CisgIHdoaWxlIChfZGJ1c19kaXJlY3RvcnlfZ2V0X25leHRfZmlsZSAoZGlyLCAmZmlsZW5hbWUsICZlcnJvcikpCisgICAgeworICAgICAgREJ1c1N0cmluZyBmdWxsX3BhdGg7CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZmdWxsX3BhdGgpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZG4ndCBpbml0IHN0cmluZyIpOworCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5ICgmdGVzdF9kaXJlY3RvcnksIDAsICZmdWxsX3BhdGgsIDApKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZG4ndCBjb3B5IGRpciB0byBmdWxsX3BhdGgiKTsKKworICAgICAgaWYgKCFfZGJ1c19jb25jYXRfZGlyX2FuZF9maWxlICgmZnVsbF9wYXRoLCAmZmlsZW5hbWUpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZG4ndCBjb25jYXQgZmlsZSB0byBkaXIiKTsKKworICAgICAgaWYgKF9kYnVzX3N0cmluZ19lbmRzX3dpdGhfY19zdHIgKCZmaWxlbmFtZSwgIi5tZXNzYWdlLXJhdyIpKQorICAgICAgICA7CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoX2RidXNfc3RyaW5nX2VuZHNfd2l0aF9jX3N0ciAoJmZpbGVuYW1lLCAiLm1lc3NhZ2UiKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcHJpbnRmICgiU0tJUDogQ291bGQgbm90IGxvYWQgJXMsIG1lc3NhZ2UgYnVpbGRlciBsYW5ndWFnZSBubyBsb25nZXIgc3VwcG9ydGVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmZpbGVuYW1lKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgCisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIlNraXBwaW5nIG5vbi0ubWVzc2FnZSBmaWxlICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmZpbGVuYW1lKSk7CisJICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZ1bGxfcGF0aCk7CisgICAgICAgICAgZ290byBuZXh0OworICAgICAgICB9CisKKyAgICAgIHByaW50ZiAoIiAgICAlc1xuIiwKKyAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmZmlsZW5hbWUpKTsKKworICAgICAgaWYgKCEgKCpmdW5jdGlvbikgKCZmdWxsX3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfdmFsaWRpdHksIHVzZXJfZGF0YSkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZ1bGxfcGF0aCk7CisgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmdWxsX3BhdGgpOworICAgIH0KKworICBpZiAoZGJ1c19lcnJvcl9pc19zZXQgKCZlcnJvcikpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkNvdWxkIG5vdCBnZXQgbmV4dCBmaWxlIGluICVzOiAlcyIsCisgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZ0ZXN0X2RpcmVjdG9yeSksCisgICAgICAgICAgICAgICAgICBlcnJvci5tZXNzYWdlKTsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICByZXR2YWwgPSBUUlVFOworCisgZmFpbGVkOgorCisgIGlmIChkaXIpCisgICAgX2RidXNfZGlyZWN0b3J5X2Nsb3NlIChkaXIpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnRlc3RfZGlyZWN0b3J5KTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmaWxlbmFtZSk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBSdW5zIHRoZSBnaXZlbiBmdW5jdGlvbiBvbiBldmVyeSBtZXNzYWdlIGZpbGUgaW4gdGhlIHRlc3Qgc3VpdGUuCisgKiBUaGUgZnVuY3Rpb24gc2hvdWxkIHJldHVybiAjRkFMU0Ugb24gdGVzdCBmYWlsdXJlIG9yIGZhdGFsIGVycm9yLgorICoKKyAqIEBwYXJhbSB0ZXN0X2RhdGFfZGlyIHJvb3QgZGlyIG9mIHRoZSB0ZXN0IHN1aXRlIGRhdGEgZmlsZXMgKHRvcF9zcmNkaXIvdGVzdC9kYXRhKQorICogQHBhcmFtIGZ1bmMgdGhlIGZ1bmN0aW9uIHRvIHJ1bgorICogQHBhcmFtIHVzZXJfZGF0YSBkYXRhIGZvciBmdW5jdGlvbgorICogQHJldHVybnMgI0ZBTFNFIGlmIHRoZXJlJ3MgYSBmYWlsdXJlCisgKi8KK2RidXNfYm9vbF90CitkYnVzX2ludGVybmFsX2RvX25vdF91c2VfZm9yZWFjaF9tZXNzYWdlX2ZpbGUgKGNvbnN0IGNoYXIgICAgICAgICAgICAgICAgKnRlc3RfZGF0YV9kaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNGb3JlYWNoTWVzc2FnZUZpbGVGdW5jIGZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgKnVzZXJfZGF0YSkKK3sKKyAgREJ1c1N0cmluZyB0ZXN0X2RpcmVjdG9yeTsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworCisgIHJldHZhbCA9IEZBTFNFOworCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmdGVzdF9kaXJlY3RvcnksIHRlc3RfZGF0YV9kaXIpOworICAKKyAgaWYgKCFwcm9jZXNzX3Rlc3Rfc3ViZGlyICgmdGVzdF9kaXJlY3RvcnksICJ2YWxpZC1tZXNzYWdlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19WQUxJRCwgZnVuYywgdXNlcl9kYXRhKSkKKyAgICBnb3RvIGZhaWxlZDsKKworICBjaGVja19tZW1sZWFrcyAoKTsKKyAgCisgIGlmICghcHJvY2Vzc190ZXN0X3N1YmRpciAoJnRlc3RfZGlyZWN0b3J5LCAiaW52YWxpZC1tZXNzYWdlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19JTlZBTElEX0ZPUl9VTktOT1dOX1JFQVNPTiwgZnVuYywgdXNlcl9kYXRhKSkKKyAgICBnb3RvIGZhaWxlZDsKKworICBjaGVja19tZW1sZWFrcyAoKTsKKyAgCisgIGlmICghcHJvY2Vzc190ZXN0X3N1YmRpciAoJnRlc3RfZGlyZWN0b3J5LCAiaW5jb21wbGV0ZS1tZXNzYWdlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19WQUxJRF9CVVRfSU5DT01QTEVURSwgZnVuYywgdXNlcl9kYXRhKSkKKyAgICBnb3RvIGZhaWxlZDsKKworICBjaGVja19tZW1sZWFrcyAoKTsKKyAgCisgIHJldHZhbCA9IFRSVUU7CisgIAorIGZhaWxlZDoKKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnRlc3RfZGlyZWN0b3J5KTsKKworICByZXR1cm4gcmV0dmFsOworfQorCisjaWYgMAorI2RlZmluZSBHRVRfQU5EX0NIRUNLKGl0ZXIsIHR5cGVuYW1lLCBsaXRlcmFsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2FyZ190eXBlICgmaXRlcikgIT0gREJVU19UWVBFXyMjdHlwZW5hbWUpICAgICAgICAgXAorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZ290IHdyb25nIGFyZ3VtZW50IHR5cGUgZnJvbSBtZXNzYWdlIGl0ZXIiKTsgICBcCisgICAgZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2Jhc2ljICgmaXRlciwgJnZfIyN0eXBlbmFtZSk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAodl8jI3R5cGVuYW1lICE9IGxpdGVyYWwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZ290IHdyb25nIHZhbHVlIGZyb20gbWVzc2FnZSBpdGVyIik7ICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgR0VUX0FORF9DSEVDS19TVFJDTVAoaXRlciwgdHlwZW5hbWUsIGxpdGVyYWwpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGRidXNfbWVzc2FnZV9pdGVyX2dldF9hcmdfdHlwZSAoJml0ZXIpICE9IERCVVNfVFlQRV8jI3R5cGVuYW1lKSAgICAgICAgIFwKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImdvdCB3cm9uZyBhcmd1bWVudCB0eXBlIGZyb20gbWVzc2FnZSBpdGVyIik7ICAgXAorICAgIGRidXNfbWVzc2FnZV9pdGVyX2dldF9iYXNpYyAoJml0ZXIsICZ2XyMjdHlwZW5hbWUpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKHN0cmNtcCAodl8jI3R5cGVuYW1lLCBsaXRlcmFsKSAhPSAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImdvdCB3cm9uZyB2YWx1ZSBmcm9tIG1lc3NhZ2UgaXRlciIpOyAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIEdFVF9BTkRfQ0hFQ0tfQU5EX05FWFQoaXRlciwgdHlwZW5hbWUsIGxpdGVyYWwpICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBHRVRfQU5EX0NIRUNLKGl0ZXIsIHR5cGVuYW1lLCBsaXRlcmFsKTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9uZXh0ICgmaXRlcikpICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZmFpbGVkIHRvIG1vdmUgaXRlciB0byBuZXh0Iik7IFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBHRVRfQU5EX0NIRUNLX1NUUkNNUF9BTkRfTkVYVChpdGVyLCB0eXBlbmFtZSwgbGl0ZXJhbCkgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgR0VUX0FORF9DSEVDS19TVFJDTVAoaXRlciwgdHlwZW5hbWUsIGxpdGVyYWwpOyAgICAgICAgICAgICAgXAorICAgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfbmV4dCAoJml0ZXIpKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImZhaWxlZCB0byBtb3ZlIGl0ZXIgdG8gbmV4dCIpOyBcCisgIH0gd2hpbGUgKDApCisKK3N0YXRpYyB2b2lkCittZXNzYWdlX2l0ZXJfdGVzdCAoREJ1c01lc3NhZ2UgKm1lc3NhZ2UpCit7CisgIERCdXNNZXNzYWdlSXRlciBpdGVyLCBhcnJheSwgYXJyYXkyOworICBjb25zdCBjaGFyICp2X1NUUklORzsKKyAgZG91YmxlIHZfRE9VQkxFOworICBkYnVzX2ludDE2X3Qgdl9JTlQxNjsKKyAgZGJ1c191aW50MTZfdCB2X1VJTlQxNjsKKyAgZGJ1c19pbnQzMl90IHZfSU5UMzI7CisgIGRidXNfdWludDMyX3Qgdl9VSU5UMzI7CisgIGRidXNfaW50NjRfdCB2X0lOVDY0OworICBkYnVzX3VpbnQ2NF90IHZfVUlOVDY0OworICB1bnNpZ25lZCBjaGFyIHZfQllURTsKKyAgZGJ1c19ib29sX3Qgdl9CT09MRUFOOworCisgIGNvbnN0IGRidXNfaW50MzJfdCAqb3VyX2ludF9hcnJheTsKKyAgaW50IGxlbjsKKworICBkYnVzX21lc3NhZ2VfaXRlcl9pbml0IChtZXNzYWdlLCAmaXRlcik7CisKKyAgR0VUX0FORF9DSEVDS19TVFJDTVBfQU5EX05FWFQgKGl0ZXIsIFNUUklORywgIlRlc3Qgc3RyaW5nIik7CisgIEdFVF9BTkRfQ0hFQ0tfQU5EX05FWFQgKGl0ZXIsIElOVDMyLCAtMHgxMjM0NTY3OCk7CisgIEdFVF9BTkRfQ0hFQ0tfQU5EX05FWFQgKGl0ZXIsIFVJTlQzMiwgMHhlZGQxZSk7CisgIEdFVF9BTkRfQ0hFQ0tfQU5EX05FWFQgKGl0ZXIsIERPVUJMRSwgMy4xNDE1OSk7CisKKyAgaWYgKGRidXNfbWVzc2FnZV9pdGVyX2dldF9hcmdfdHlwZSAoJml0ZXIpICE9IERCVVNfVFlQRV9BUlJBWSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJBcmd1bWVudCB0eXBlIG5vdCBhbiBhcnJheSIpOworCisgIGlmIChkYnVzX21lc3NhZ2VfaXRlcl9nZXRfZWxlbWVudF90eXBlICgmaXRlcikgIT0gREJVU19UWVBFX0RPVUJMRSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJBcnJheSB0eXBlIG5vdCBkb3VibGUiKTsKKworICBkYnVzX21lc3NhZ2VfaXRlcl9yZWN1cnNlICgmaXRlciwgJmFycmF5KTsKKworICBHRVRfQU5EX0NIRUNLX0FORF9ORVhUIChhcnJheSwgRE9VQkxFLCAxLjUpOworICBHRVRfQU5EX0NIRUNLIChhcnJheSwgRE9VQkxFLCAyLjUpOworCisgIGlmIChkYnVzX21lc3NhZ2VfaXRlcl9uZXh0ICgmYXJyYXkpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIkRpZG4ndCByZWFjaCBlbmQgb2YgYXJyYXkiKTsKKworICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX25leHQgKCZpdGVyKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJSZWFjaGVkIGVuZCBvZiBhcmd1bWVudHMiKTsKKworICBHRVRfQU5EX0NIRUNLX0FORF9ORVhUIChpdGVyLCBCWVRFLCAweEYwKTsKKworICBpZiAoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2FyZ190eXBlICgmaXRlcikgIT0gREJVU19UWVBFX0FSUkFZKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIGFycmF5Iik7CisKKyAgaWYgKGRidXNfbWVzc2FnZV9pdGVyX2dldF9lbGVtZW50X3R5cGUgKCZpdGVyKSAhPSBEQlVTX1RZUEVfSU5UMzIpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiQXJyYXkgdHlwZSBub3QgaW50MzIiKTsKKworICAvKiBFbXB0eSBhcnJheSAqLworICBkYnVzX21lc3NhZ2VfaXRlcl9yZWN1cnNlICgmaXRlciwgJmFycmF5KTsKKworICBpZiAoZGJ1c19tZXNzYWdlX2l0ZXJfbmV4dCAoJmFycmF5KSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJEaWRuJ3QgcmVhY2ggZW5kIG9mIGFycmF5Iik7CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9uZXh0ICgmaXRlcikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiUmVhY2hlZCBlbmQgb2YgYXJndW1lbnRzIik7CisKKyAgR0VUX0FORF9DSEVDSyAoaXRlciwgQllURSwgMHhGMCk7CisKKyAgaWYgKGRidXNfbWVzc2FnZV9pdGVyX25leHQgKCZpdGVyKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJEaWRuJ3QgcmVhY2ggZW5kIG9mIGFyZ3VtZW50cyIpOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkCit2ZXJpZnlfdGVzdF9tZXNzYWdlIChEQnVzTWVzc2FnZSAqbWVzc2FnZSkKK3sKKyAgREJ1c01lc3NhZ2VJdGVyIGl0ZXI7CisgIERCdXNFcnJvciBlcnJvciA9IERCVVNfRVJST1JfSU5JVDsKKyAgZGJ1c19pbnQxNl90IG91cl9pbnQxNjsKKyAgZGJ1c191aW50MTZfdCBvdXJfdWludDE2OworICBkYnVzX2ludDMyX3Qgb3VyX2ludDsKKyAgZGJ1c191aW50MzJfdCBvdXJfdWludDsKKyAgY29uc3QgY2hhciAqb3VyX3N0cjsKKyAgZG91YmxlIG91cl9kb3VibGU7CisgIGRvdWJsZSB2X0RPVUJMRTsKKyAgZGJ1c19ib29sX3Qgb3VyX2Jvb2w7CisgIHVuc2lnbmVkIGNoYXIgb3VyX2J5dGVfMSwgb3VyX2J5dGVfMjsKKyAgY29uc3QgZGJ1c191aW50MzJfdCAqb3VyX3VpbnQzMl9hcnJheSA9ICh2b2lkKikweGRlYWRiZWVmOworICBpbnQgb3VyX3VpbnQzMl9hcnJheV9sZW47CisgIGRidXNfaW50MzJfdCAqb3VyX2ludDMyX2FycmF5ID0gKHZvaWQqKTB4ZGVhZGJlZWY7CisgIGludCBvdXJfaW50MzJfYXJyYXlfbGVuOworICBkYnVzX2ludDY0X3Qgb3VyX2ludDY0OworICBkYnVzX3VpbnQ2NF90IG91cl91aW50NjQ7CisgIGRidXNfaW50NjRfdCAqb3VyX3VpbnQ2NF9hcnJheSA9ICh2b2lkKikweGRlYWRiZWVmOworICBpbnQgb3VyX3VpbnQ2NF9hcnJheV9sZW47CisgIGNvbnN0IGRidXNfaW50NjRfdCAqb3VyX2ludDY0X2FycmF5ID0gKHZvaWQqKTB4ZGVhZGJlZWY7CisgIGludCBvdXJfaW50NjRfYXJyYXlfbGVuOworICBjb25zdCBkb3VibGUgKm91cl9kb3VibGVfYXJyYXkgPSAodm9pZCopMHhkZWFkYmVlZjsKKyAgaW50IG91cl9kb3VibGVfYXJyYXlfbGVuOworICBjb25zdCB1bnNpZ25lZCBjaGFyICpvdXJfYnl0ZV9hcnJheSA9ICh2b2lkKikweGRlYWRiZWVmOworICBpbnQgb3VyX2J5dGVfYXJyYXlfbGVuOworICBjb25zdCBkYnVzX2Jvb2xfdCAqb3VyX2Jvb2xlYW5fYXJyYXkgPSAodm9pZCopMHhkZWFkYmVlZjsKKyAgaW50IG91cl9ib29sZWFuX2FycmF5X2xlbjsKKyAgY2hhciAqKm91cl9zdHJpbmdfYXJyYXk7CisgIGludCBvdXJfc3RyaW5nX2FycmF5X2xlbjsKKworICBkYnVzX21lc3NhZ2VfaXRlcl9pbml0IChtZXNzYWdlLCAmaXRlcik7CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJncyAoJml0ZXIsICZlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVDE2LCAmb3VyX2ludDE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfVUlOVDE2LCAmb3VyX3VpbnQxNiwKKwkJCQkgICBEQlVTX1RZUEVfSU5UMzIsICZvdXJfaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfVUlOVDMyLCAmb3VyX3VpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlQ2NCwgJm91cl9pbnQ2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1VJTlQ2NCwgJm91cl91aW50NjQsCisJCQkJICAgREJVU19UWVBFX1NUUklORywgJm91cl9zdHIsCisJCQkJICAgREJVU19UWVBFX0RPVUJMRSwgJm91cl9kb3VibGUsCisJCQkJICAgREJVU19UWVBFX0JPT0xFQU4sICZvdXJfYm9vbCwKKwkJCQkgICBEQlVTX1RZUEVfQllURSwgJm91cl9ieXRlXzEsCisJCQkJICAgREJVU19UWVBFX0JZVEUsICZvdXJfYnl0ZV8yLAorCQkJCSAgIERCVVNfVFlQRV9BUlJBWSwgREJVU19UWVBFX1VJTlQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91cl91aW50MzJfYXJyYXksICZvdXJfdWludDMyX2FycmF5X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0FSUkFZLCBEQlVTX1RZUEVfSU5UMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXJfaW50MzJfYXJyYXksICZvdXJfaW50MzJfYXJyYXlfbGVuLAorCQkJCSAgIERCVVNfVFlQRV9BUlJBWSwgREJVU19UWVBFX1VJTlQ2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91cl91aW50NjRfYXJyYXksICZvdXJfdWludDY0X2FycmF5X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0FSUkFZLCBEQlVTX1RZUEVfSU5UNjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXJfaW50NjRfYXJyYXksICZvdXJfaW50NjRfYXJyYXlfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfQVJSQVksIERCVVNfVFlQRV9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXJfZG91YmxlX2FycmF5LCAmb3VyX2RvdWJsZV9hcnJheV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9BUlJBWSwgREJVU19UWVBFX0JZVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXJfYnl0ZV9hcnJheSwgJm91cl9ieXRlX2FycmF5X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0FSUkFZLCBEQlVTX1RZUEVfQk9PTEVBTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91cl9ib29sZWFuX2FycmF5LCAmb3VyX2Jvb2xlYW5fYXJyYXlfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfQVJSQVksIERCVVNfVFlQRV9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXJfc3RyaW5nX2FycmF5LCAmb3VyX3N0cmluZ19hcnJheV9sZW4sCisJCQkJICAgMCkpCisgICAgeworICAgICAgX2RidXNfd2FybiAoImVycm9yOiAlcyAtICVzIiwgZXJyb3IubmFtZSwKKyAgICAgICAgICAgICAgICAgIChlcnJvci5tZXNzYWdlICE9IE5VTEwpID8gZXJyb3IubWVzc2FnZSA6ICJubyBtZXNzYWdlIik7CisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJDb3VsZCBub3QgZ2V0IGFyZ3VtZW50cyIpOworICAgIH0KKworICBpZiAob3VyX2ludDE2ICE9IC0weDEyMykKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCIxNi1iaXQgaW50ZWdlcnMgZGlmZmVyISIpOworCisgIGlmIChvdXJfdWludDE2ICE9IDB4MTIzKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIjE2LWJpdCB1aW50cyBkaWZmZXIhIik7CisgIAorICBpZiAob3VyX2ludCAhPSAtMHgxMjM0NTY3OCkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJpbnRlZ2VycyBkaWZmZXIhIik7CisKKyAgaWYgKG91cl91aW50ICE9IDB4MTIzMDAwNDIpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgidWludHMgZGlmZmVyISIpOworCisgIGlmIChvdXJfaW50NjQgIT0gREJVU19JTlQ2NF9DT05TVEFOVCAoLTB4MTIzNDU2Nzg5YWJjZCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiNjQtYml0IGludGVnZXJzIGRpZmZlciEiKTsKKyAgaWYgKG91cl91aW50NjQgIT0gREJVU19VSU5UNjRfQ09OU1RBTlQgKDB4MTIzNDU2Nzg5YWJjZCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiNjQtYml0IHVuc2lnbmVkIGludGVnZXJzIGRpZmZlciEiKTsKKworICB2X0RPVUJMRSA9IDMuMTQxNTk7CisgIGlmICghIF9EQlVTX0RPVUJMRVNfQklUV0lTRV9FUVVBTCAob3VyX2RvdWJsZSwgdl9ET1VCTEUpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImRvdWJsZXMgZGlmZmVyISIpOworCisgIGlmIChzdHJjbXAgKG91cl9zdHIsICJUZXN0IHN0cmluZyIpICE9IDApCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgic3RyaW5ncyBkaWZmZXIhIik7CisKKyAgaWYgKCFvdXJfYm9vbCkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJib29sZWFucyBkaWZmZXIiKTsKKworICBpZiAob3VyX2J5dGVfMSAhPSA0MikKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJieXRlcyBkaWZmZXIhIik7CisKKyAgaWYgKG91cl9ieXRlXzIgIT0gMjQpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiYnl0ZXMgZGlmZmVyISIpOworCisgIGlmIChvdXJfdWludDMyX2FycmF5X2xlbiAhPSA0IHx8CisgICAgICBvdXJfdWludDMyX2FycmF5WzBdICE9IDB4MTIzNDU2NzggfHwKKyAgICAgIG91cl91aW50MzJfYXJyYXlbMV0gIT0gMHgyMzQ1Njc4MSB8fAorICAgICAgb3VyX3VpbnQzMl9hcnJheVsyXSAhPSAweDM0NTY3ODEyIHx8CisgICAgICBvdXJfdWludDMyX2FycmF5WzNdICE9IDB4NDU2NzgxMjMpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgidWludCBhcnJheSBkaWZmZXJzIik7CisKKyAgaWYgKG91cl9pbnQzMl9hcnJheV9sZW4gIT0gNCB8fAorICAgICAgb3VyX2ludDMyX2FycmF5WzBdICE9IDB4MTIzNDU2NzggfHwKKyAgICAgIG91cl9pbnQzMl9hcnJheVsxXSAhPSAtMHgyMzQ1Njc4MSB8fAorICAgICAgb3VyX2ludDMyX2FycmF5WzJdICE9IDB4MzQ1Njc4MTIgfHwKKyAgICAgIG91cl9pbnQzMl9hcnJheVszXSAhPSAtMHg0NTY3ODEyMykKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJpbnQgYXJyYXkgZGlmZmVycyIpOworCisgIGlmIChvdXJfdWludDY0X2FycmF5X2xlbiAhPSA0IHx8CisgICAgICBvdXJfdWludDY0X2FycmF5WzBdICE9IDB4MTIzNDU2NzggfHwKKyAgICAgIG91cl91aW50NjRfYXJyYXlbMV0gIT0gMHgyMzQ1Njc4MSB8fAorICAgICAgb3VyX3VpbnQ2NF9hcnJheVsyXSAhPSAweDM0NTY3ODEyIHx8CisgICAgICBvdXJfdWludDY0X2FycmF5WzNdICE9IDB4NDU2NzgxMjMpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgidWludDY0IGFycmF5IGRpZmZlcnMiKTsKKworICBpZiAob3VyX2ludDY0X2FycmF5X2xlbiAhPSA0IHx8CisgICAgICBvdXJfaW50NjRfYXJyYXlbMF0gIT0gMHgxMjM0NTY3OCB8fAorICAgICAgb3VyX2ludDY0X2FycmF5WzFdICE9IC0weDIzNDU2NzgxIHx8CisgICAgICBvdXJfaW50NjRfYXJyYXlbMl0gIT0gMHgzNDU2NzgxMiB8fAorICAgICAgb3VyX2ludDY0X2FycmF5WzNdICE9IC0weDQ1Njc4MTIzKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImludDY0IGFycmF5IGRpZmZlcnMiKTsKKworICBpZiAob3VyX2RvdWJsZV9hcnJheV9sZW4gIT0gMykKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJkb3VibGUgYXJyYXkgaGFkIHdyb25nIGxlbmd0aCIpOworCisgIC8qIE9uIGFsbCBJRUVFIG1hY2hpbmVzIChpLmUuIGV2ZXJ5dGhpbmcgc2FuZSkgZXhhY3QgZXF1YWxpdHkKKyAgICogc2hvdWxkIGJlIHByZXNlcnZlZCBvdmVyIHRoZSB3aXJlCisgICAqLworICB2X0RPVUJMRSA9IDAuMTIzNDsKKyAgaWYgKCEgX0RCVVNfRE9VQkxFU19CSVRXSVNFX0VRVUFMIChvdXJfZG91YmxlX2FycmF5WzBdLCB2X0RPVUJMRSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZG91YmxlIGFycmF5IGhhZCB3cm9uZyB2YWx1ZXMiKTsKKyAgdl9ET1VCTEUgPSA5ODc2LjU0MzIxOworICBpZiAoISBfREJVU19ET1VCTEVTX0JJVFdJU0VfRVFVQUwgKG91cl9kb3VibGVfYXJyYXlbMV0sIHZfRE9VQkxFKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJkb3VibGUgYXJyYXkgaGFkIHdyb25nIHZhbHVlcyIpOworICB2X0RPVUJMRSA9IC0zMDAuMDsKKyAgaWYgKCEgX0RCVVNfRE9VQkxFU19CSVRXSVNFX0VRVUFMIChvdXJfZG91YmxlX2FycmF5WzJdLCB2X0RPVUJMRSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZG91YmxlIGFycmF5IGhhZCB3cm9uZyB2YWx1ZXMiKTsKKworICBpZiAob3VyX2J5dGVfYXJyYXlfbGVuICE9IDQpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiYnl0ZSBhcnJheSBoYWQgd3JvbmcgbGVuZ3RoIik7CisKKyAgaWYgKG91cl9ieXRlX2FycmF5WzBdICE9ICdhJyB8fAorICAgICAgb3VyX2J5dGVfYXJyYXlbMV0gIT0gJ2InIHx8CisgICAgICBvdXJfYnl0ZV9hcnJheVsyXSAhPSAnYycgfHwKKyAgICAgIG91cl9ieXRlX2FycmF5WzNdICE9IDIzNCkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJieXRlIGFycmF5IGhhZCB3cm9uZyB2YWx1ZXMiKTsKKworICBpZiAob3VyX2Jvb2xlYW5fYXJyYXlfbGVuICE9IDUpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiYm9vbCBhcnJheSBoYWQgd3JvbmcgbGVuZ3RoIik7CisKKyAgaWYgKG91cl9ib29sZWFuX2FycmF5WzBdICE9IFRSVUUgfHwKKyAgICAgIG91cl9ib29sZWFuX2FycmF5WzFdICE9IEZBTFNFIHx8CisgICAgICBvdXJfYm9vbGVhbl9hcnJheVsyXSAhPSBUUlVFIHx8CisgICAgICBvdXJfYm9vbGVhbl9hcnJheVszXSAhPSBUUlVFIHx8CisgICAgICBvdXJfYm9vbGVhbl9hcnJheVs0XSAhPSBGQUxTRSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJib29sIGFycmF5IGhhZCB3cm9uZyB2YWx1ZXMiKTsKKworICBpZiAob3VyX3N0cmluZ19hcnJheV9sZW4gIT0gNCkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJzdHJpbmcgYXJyYXkgd2FzIHdyb25nIGxlbmd0aCIpOworCisgIGlmIChzdHJjbXAgKG91cl9zdHJpbmdfYXJyYXlbMF0sICJGb28iKSAhPSAwIHx8CisgICAgICBzdHJjbXAgKG91cl9zdHJpbmdfYXJyYXlbMV0sICJiYXIiKSAhPSAwIHx8CisgICAgICBzdHJjbXAgKG91cl9zdHJpbmdfYXJyYXlbMl0sICIiKSAhPSAwIHx8CisgICAgICBzdHJjbXAgKG91cl9zdHJpbmdfYXJyYXlbM10sICJ3b28gd29vIHdvbyB3b28iKSAhPSAwKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInN0cmluZyBhcnJheSBoYWQgd3JvbmcgdmFsdWVzIik7CisKKyAgZGJ1c19mcmVlX3N0cmluZ19hcnJheSAob3VyX3N0cmluZ19hcnJheSk7CisgIAorICBpZiAoZGJ1c19tZXNzYWdlX2l0ZXJfbmV4dCAoJml0ZXIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIkRpZG4ndCByZWFjaCBlbmQgb2YgYXJndW1lbnRzIik7Cit9CisKK3N0YXRpYyB2b2lkCit2ZXJpZnlfdGVzdF9tZXNzYWdlX2FyZ3NfaWdub3JlZCAoREJ1c01lc3NhZ2UgKm1lc3NhZ2UpCit7CisgIERCdXNNZXNzYWdlSXRlciBpdGVyOworICBEQnVzRXJyb3IgZXJyb3IgPSBEQlVTX0VSUk9SX0lOSVQ7CisgIGRidXNfdWludDMyX3Qgb3VyX3VpbnQ7CisgIERCdXNJbml0aWFsRkRzICppbml0aWFsX2ZkczsKKworICBpbml0aWFsX2ZkcyA9IF9kYnVzX2NoZWNrX2ZkbGVha3NfZW50ZXIgKCk7CisKKyAgLyogcGFyc2Ugd2l0aCBlbXB0eSBzaWduYXR1cmU6ICIiICovCisgIGRidXNfbWVzc2FnZV9pdGVyX2luaXQgKG1lc3NhZ2UsICZpdGVyKTsKKyAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJncyAoJml0ZXIsICZlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJlcnJvcjogJXMgLSAlcyIsIGVycm9yLm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAoZXJyb3IubWVzc2FnZSAhPSBOVUxMKSA/IGVycm9yLm1lc3NhZ2UgOiAibm8gbWVzc2FnZSIpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydCAoIWRidXNfZXJyb3JfaXNfc2V0ICgmZXJyb3IpKTsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJhcmd1bWVudHMgaWdub3JlZC5cbiIpOworICAgIH0KKworICAvKiBwYXJzZSB3aXRoIHNob3J0ZXIgc2lnbmF0dXJlOiAidSIgKi8KKyAgZGJ1c19tZXNzYWdlX2l0ZXJfaW5pdCAobWVzc2FnZSwgJml0ZXIpOworICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX2dldF9hcmdzICgmaXRlciwgJmVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfVUlOVDMyLCAmb3VyX3VpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiZXJyb3I6ICVzIC0gJXMiLCBlcnJvci5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgKGVycm9yLm1lc3NhZ2UgIT0gTlVMTCkgPyBlcnJvci5tZXNzYWdlIDogIm5vIG1lc3NhZ2UiKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfZGJ1c19hc3NlcnQgKCFkYnVzX2Vycm9yX2lzX3NldCAoJmVycm9yKSk7CisgICAgICBfZGJ1c192ZXJib3NlICgiYXJndW1lbnRzIGlnbm9yZWQuXG4iKTsKKyAgICB9CisKKyAgX2RidXNfY2hlY2tfZmRsZWFrc19sZWF2ZSAoaW5pdGlhbF9mZHMpOworfQorCitzdGF0aWMgdm9pZAordmVyaWZ5X3Rlc3RfbWVzc2FnZV9tZW1sZWFrIChEQnVzTWVzc2FnZSAqbWVzc2FnZSkKK3sKKyAgREJ1c01lc3NhZ2VJdGVyIGl0ZXI7CisgIERCdXNFcnJvciBlcnJvciA9IERCVVNfRVJST1JfSU5JVDsKKyAgZGJ1c191aW50MzJfdCBvdXJfdWludDE7CisgIGRidXNfdWludDMyX3Qgb3VyX3VpbnQyOworICBkYnVzX3VpbnQzMl90IG91cl91aW50MzsKKyAgY2hhciAqKm91cl9zdHJpbmdfYXJyYXkxOworICBpbnQgb3VyX3N0cmluZ19hcnJheV9sZW4xOworICBjaGFyICoqb3VyX3N0cmluZ19hcnJheTI7CisgIGludCBvdXJfc3RyaW5nX2FycmF5X2xlbjI7CisjaWZkZWYgSEFWRV9VTklYX0ZEX1BBU1NJTkcKKyAgaW50IG91cl91bml4X2ZkMTsKKyAgaW50IG91cl91bml4X2ZkMjsKKyNlbmRpZgorICBEQnVzSW5pdGlhbEZEcyAqaW5pdGlhbF9mZHM7CisKKyAgaW5pdGlhbF9mZHMgPSBfZGJ1c19jaGVja19mZGxlYWtzX2VudGVyICgpOworCisgIC8qIHBhcnNlIHdpdGggd3Jvbmcgc2lnbmF0dXJlOiAidWFzaHV1IiAqLworICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgIGRidXNfbWVzc2FnZV9pdGVyX2luaXQgKG1lc3NhZ2UsICZpdGVyKTsKKyAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJncyAoJml0ZXIsICZlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1VJTlQzMiwgJm91cl91aW50MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0FSUkFZLCBEQlVTX1RZUEVfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3VyX3N0cmluZ19hcnJheTEsICZvdXJfc3RyaW5nX2FycmF5X2xlbjEsCisjaWZkZWYgSEFWRV9VTklYX0ZEX1BBU1NJTkcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1VOSVhfRkQsICZvdXJfdW5peF9mZDEsCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1VJTlQzMiwgJm91cl91aW50MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1VJTlQzMiwgJm91cl91aW50MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJleHBlY3RlZCBlcnJvcjogJXMgLSAlc1xuIiwgZXJyb3IubmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIChlcnJvci5tZXNzYWdlICE9IE5VTEwpID8gZXJyb3IubWVzc2FnZSA6ICJubyBtZXNzYWdlIik7CisgICAgICAvKiBlbnN1cmUgYXJyYXkgb2Ygc3RyaW5nIGFuZCB1bml4IGZkIG5vdCBsZWFrZWQgKi8KKyAgICAgIF9kYnVzX2Fzc2VydCAob3VyX3N0cmluZ19hcnJheTEgPT0gTlVMTCk7CisjaWZkZWYgSEFWRV9VTklYX0ZEX1BBU1NJTkcKKyAgICAgIF9kYnVzX2Fzc2VydCAob3VyX3VuaXhfZmQxID09IC0xKTsKKyNlbmRpZgorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJlcnJvcjogcGFyc2Ugd2l0aCB3cm9uZyBzaWduYXR1cmU6ICd1YXNodXUnLiIpOworICAgIH0KKworICAvKiBwYXJzZSB3aXRoIHdyb25nIHNpZ25hdHVyZTogInVhc2h1YXNodSIgKi8KKyAgZGJ1c19tZXNzYWdlX2l0ZXJfaW5pdCAobWVzc2FnZSwgJml0ZXIpOworICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2FyZ3MgKCZpdGVyLCAmZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9VSU5UMzIsICZvdXJfdWludDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9BUlJBWSwgREJVU19UWVBFX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91cl9zdHJpbmdfYXJyYXkxLCAmb3VyX3N0cmluZ19hcnJheV9sZW4xLAorI2lmZGVmIEhBVkVfVU5JWF9GRF9QQVNTSU5HCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9VTklYX0ZELCAmb3VyX3VuaXhfZmQxLAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9VSU5UMzIsICZvdXJfdWludDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9BUlJBWSwgREJVU19UWVBFX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91cl9zdHJpbmdfYXJyYXkyLCAmb3VyX3N0cmluZ19hcnJheV9sZW4yLAorI2lmZGVmIEhBVkVfVU5JWF9GRF9QQVNTSU5HCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9VTklYX0ZELCAmb3VyX3VuaXhfZmQyLAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9VSU5UMzIsICZvdXJfdWludDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiZXhwZWN0ZWQgZXJyb3I6ICVzIC0gJXNcbiIsIGVycm9yLm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAoZXJyb3IubWVzc2FnZSAhPSBOVUxMKSA/IGVycm9yLm1lc3NhZ2UgOiAibm8gbWVzc2FnZSIpOworICAgICAgLyogZW5zdXJlIGFycmF5IG9mIHN0cmluZyBhbmQgdW5peCBmZCBub3QgbGVha2VkICovCisgICAgICBfZGJ1c19hc3NlcnQgKG91cl9zdHJpbmdfYXJyYXkxID09IE5VTEwpOworICAgICAgX2RidXNfYXNzZXJ0IChvdXJfc3RyaW5nX2FycmF5MiA9PSBOVUxMKTsKKyNpZmRlZiBIQVZFX1VOSVhfRkRfUEFTU0lORworICAgICAgX2RidXNfYXNzZXJ0IChvdXJfdW5peF9mZDEgPT0gLTEpOworICAgICAgX2RidXNfYXNzZXJ0IChvdXJfdW5peF9mZDIgPT0gLTEpOworI2VuZGlmCisgICAgfQorICBlbHNlCisgICAgeworICAgICAgX2RidXNfd2FybiAoImVycm9yOiBwYXJzZSB3aXRoIHdyb25nIHNpZ25hdHVyZTogJ3Vhc2h1YXNodScuIik7CisgICAgfQorCisgIC8qIHBhcnNlIHdpdGggY29ycmVjdCBzaWduYXR1cmU6ICJ1YXNodWFzaCIgKi8KKyAgZGJ1c19tZXNzYWdlX2l0ZXJfaW5pdCAobWVzc2FnZSwgJml0ZXIpOworICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2FyZ3MgKCZpdGVyLCAmZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9VSU5UMzIsICZvdXJfdWludDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9BUlJBWSwgREJVU19UWVBFX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91cl9zdHJpbmdfYXJyYXkxLCAmb3VyX3N0cmluZ19hcnJheV9sZW4xLAorI2lmZGVmIEhBVkVfVU5JWF9GRF9QQVNTSU5HCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9VTklYX0ZELCAmb3VyX3VuaXhfZmQxLAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9VSU5UMzIsICZvdXJfdWludDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9BUlJBWSwgREJVU19UWVBFX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91cl9zdHJpbmdfYXJyYXkyLCAmb3VyX3N0cmluZ19hcnJheV9sZW4yLAorI2lmZGVmIEhBVkVfVU5JWF9GRF9QQVNTSU5HCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9VTklYX0ZELCAmb3VyX3VuaXhfZmQyLAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiZXJyb3I6ICVzIC0gJXMiLCBlcnJvci5uYW1lLAorICAgICAgICAgICAgICAgICAgKGVycm9yLm1lc3NhZ2UgIT0gTlVMTCkgPyBlcnJvci5tZXNzYWdlIDogIm5vIG1lc3NhZ2UiKTsKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIkNvdWxkIG5vdCBnZXQgYXJndW1lbnRzIik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZGJ1c19mcmVlX3N0cmluZ19hcnJheSAob3VyX3N0cmluZ19hcnJheTEpOworICAgICAgZGJ1c19mcmVlX3N0cmluZ19hcnJheSAob3VyX3N0cmluZ19hcnJheTIpOworI2lmZGVmIEhBVkVfVU5JWF9GRF9QQVNTSU5HCisgICAgICBfZGJ1c19jbG9zZSAob3VyX3VuaXhfZmQxLCAmZXJyb3IpOworICAgICAgX2RidXNfY2xvc2UgKG91cl91bml4X2ZkMiwgJmVycm9yKTsKKyNlbmRpZgorICAgIH0KKyAgX2RidXNfY2hlY2tfZmRsZWFrc19sZWF2ZSAoaW5pdGlhbF9mZHMpOworfQorCisvKioKKyAqIEBpbmdyb3VwIERCdXNNZXNzYWdlSW50ZXJuYWxzCisgKiBVbml0IHRlc3QgZm9yIERCdXNNZXNzYWdlLgorICoKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19tZXNzYWdlX3Rlc3QgKGNvbnN0IGNoYXIgKnRlc3RfZGF0YV9kaXIpCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlLCAqbWVzc2FnZV93aXRob3V0X3VuaXhfZmRzOworICBEQnVzTWVzc2FnZUxvYWRlciAqbG9hZGVyOworICBpbnQgaTsKKyAgY29uc3QgY2hhciAqZGF0YTsKKyAgREJ1c01lc3NhZ2UgKmNvcHk7CisgIGNvbnN0IGNoYXIgKm5hbWUxOworICBjb25zdCBjaGFyICpuYW1lMjsKKyAgY29uc3QgZGJ1c191aW50MzJfdCBvdXJfdWludDMyX2FycmF5W10gPQorICAgIHsgMHgxMjM0NTY3OCwgMHgyMzQ1Njc4MSwgMHgzNDU2NzgxMiwgMHg0NTY3ODEyMyB9OworICBjb25zdCBkYnVzX2ludDMyX3Qgb3VyX2ludDMyX2FycmF5W10gPQorICAgIHsgMHgxMjM0NTY3OCwgLTB4MjM0NTY3ODEsIDB4MzQ1Njc4MTIsIC0weDQ1Njc4MTIzIH07CisgIGNvbnN0IGRidXNfdWludDMyX3QgKnZfQVJSQVlfVUlOVDMyID0gb3VyX3VpbnQzMl9hcnJheTsKKyAgY29uc3QgZGJ1c19pbnQzMl90ICp2X0FSUkFZX0lOVDMyID0gb3VyX2ludDMyX2FycmF5OworICBjb25zdCBkYnVzX3VpbnQ2NF90IG91cl91aW50NjRfYXJyYXlbXSA9CisgICAgeyAweDEyMzQ1Njc4LCAweDIzNDU2NzgxLCAweDM0NTY3ODEyLCAweDQ1Njc4MTIzIH07CisgIGNvbnN0IGRidXNfaW50NjRfdCBvdXJfaW50NjRfYXJyYXlbXSA9CisgICAgeyAweDEyMzQ1Njc4LCAtMHgyMzQ1Njc4MSwgMHgzNDU2NzgxMiwgLTB4NDU2NzgxMjMgfTsKKyAgY29uc3QgZGJ1c191aW50NjRfdCAqdl9BUlJBWV9VSU5UNjQgPSBvdXJfdWludDY0X2FycmF5OworICBjb25zdCBkYnVzX2ludDY0X3QgKnZfQVJSQVlfSU5UNjQgPSBvdXJfaW50NjRfYXJyYXk7CisgIGNvbnN0IGNoYXIgKm91cl9zdHJpbmdfYXJyYXlbXSA9IHsgIkZvbyIsICJiYXIiLCAiIiwgIndvbyB3b28gd29vIHdvbyIgfTsKKyAgY29uc3QgY2hhciAqb3VyX3N0cmluZ19hcnJheTFbXSA9IHsgImZvbyIsICJCYXIiLCAiIiwgIldvbyB3b28gV29vIHdvbyIgfTsKKyAgY29uc3QgY2hhciAqKnZfQVJSQVlfU1RSSU5HID0gb3VyX3N0cmluZ19hcnJheTsKKyAgY29uc3QgY2hhciAqKnYxX0FSUkFZX1NUUklORyA9IG91cl9zdHJpbmdfYXJyYXkxOworICBjb25zdCBkb3VibGUgb3VyX2RvdWJsZV9hcnJheVtdID0geyAwLjEyMzQsIDk4NzYuNTQzMjEsIC0zMDAuMCB9OworICBjb25zdCBkb3VibGUgKnZfQVJSQVlfRE9VQkxFID0gb3VyX2RvdWJsZV9hcnJheTsKKyAgY29uc3QgdW5zaWduZWQgY2hhciBvdXJfYnl0ZV9hcnJheVtdID0geyAnYScsICdiJywgJ2MnLCAyMzQgfTsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqdl9BUlJBWV9CWVRFID0gb3VyX2J5dGVfYXJyYXk7CisgIGNvbnN0IGRidXNfYm9vbF90IG91cl9ib29sZWFuX2FycmF5W10gPSB7IFRSVUUsIEZBTFNFLCBUUlVFLCBUUlVFLCBGQUxTRSB9OworICBjb25zdCBkYnVzX2Jvb2xfdCAqdl9BUlJBWV9CT09MRUFOID0gb3VyX2Jvb2xlYW5fYXJyYXk7CisgIGNoYXIgc2lnWzY0XTsKKyAgY29uc3QgY2hhciAqczsKKyAgY29uc3QgY2hhciAqdl9TVFJJTkc7CisgIGRvdWJsZSB2X0RPVUJMRTsKKyAgZGJ1c19pbnQxNl90IHZfSU5UMTY7CisgIGRidXNfdWludDE2X3Qgdl9VSU5UMTY7CisgIGRidXNfaW50MzJfdCB2X0lOVDMyOworICBkYnVzX3VpbnQzMl90IHZfVUlOVDMyOworICBkYnVzX3VpbnQzMl90IHYxX1VJTlQzMjsKKyAgZGJ1c19pbnQ2NF90IHZfSU5UNjQ7CisgIGRidXNfdWludDY0X3Qgdl9VSU5UNjQ7CisgIHVuc2lnbmVkIGNoYXIgdl9CWVRFOworICB1bnNpZ25lZCBjaGFyIHYyX0JZVEU7CisgIGRidXNfYm9vbF90IHZfQk9PTEVBTjsKKyAgREJ1c01lc3NhZ2VJdGVyIGl0ZXIsIGFycmF5X2l0ZXIsIHN0cnVjdF9pdGVyOworI2lmZGVmIEhBVkVfVU5JWF9GRF9QQVNTSU5HCisgIGludCB2X1VOSVhfRkQ7CisgIGludCB2MV9VTklYX0ZEOworI2VuZGlmCisgIGNoYXIgKipkZWNvbXBvc2VkOworICBEQnVzSW5pdGlhbEZEcyAqaW5pdGlhbF9mZHM7CisgIGRidXNfYm9vbF90IG9rOworICBjaGFyIGJhc2ljX3R5cGVzW10gPSBEQlVTX1RZUEVfQllURV9BU19TVFJJTkcgXAorICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfQk9PTEVBTl9BU19TVFJJTkcgXAorICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5UMTZfQVNfU1RSSU5HIFwKKyAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVDMyX0FTX1NUUklORyBcCisgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlQ2NF9BU19TVFJJTkcgXAorICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfVUlOVDE2X0FTX1NUUklORyBcCisgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9VSU5UMzJfQVNfU1RSSU5HIFwKKyAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1VJTlQ2NF9BU19TVFJJTkcgXAorICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfRE9VQkxFX0FTX1NUUklORyBcCisgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkdfQVNfU1RSSU5HOworCisgIGluaXRpYWxfZmRzID0gX2RidXNfY2hlY2tfZmRsZWFrc19lbnRlciAoKTsKKworICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoIm9yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTZXJ2aWNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvb3JnL2ZyZWVkZXNrdG9wL1Rlc3RQYXRoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGb28uVGVzdEludGVyZmFjZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGVzdE1ldGhvZCIpOworICBfZGJ1c19hc3NlcnQgKGRidXNfbWVzc2FnZV9oYXNfZGVzdGluYXRpb24gKG1lc3NhZ2UsICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U2VydmljZSIpKTsKKyAgX2RidXNfYXNzZXJ0IChkYnVzX21lc3NhZ2VfaXNfbWV0aG9kX2NhbGwgKG1lc3NhZ2UsICJGb28uVGVzdEludGVyZmFjZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGVzdE1ldGhvZCIpKTsKKyAgX2RidXNfYXNzZXJ0IChzdHJjbXAgKGRidXNfbWVzc2FnZV9nZXRfcGF0aCAobWVzc2FnZSksCisgICAgICAgICAgICAgICAgICAgICAgICAiL29yZy9mcmVlZGVza3RvcC9UZXN0UGF0aCIpID09IDApOworICBkYnVzX21lc3NhZ2Vfc2V0X3NlcmlhbCAobWVzc2FnZSwgMTIzNCk7CisKKyAgLyogc3RyaW5nIGxlbmd0aCBpbmNsdWRpbmcgbnVsIGJ5dGUgbm90IGEgbXVsdGlwbGUgb2YgNCAqLworICBpZiAoIWRidXNfbWVzc2FnZV9zZXRfc2VuZGVyIChtZXNzYWdlLCAib3JnLmZvby5iYXIxIikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib3V0IG9mIG1lbW9yeSIpOworCisgIF9kYnVzX2Fzc2VydCAoZGJ1c19tZXNzYWdlX2hhc19zZW5kZXIgKG1lc3NhZ2UsICJvcmcuZm9vLmJhcjEiKSk7CisgIGRidXNfbWVzc2FnZV9zZXRfcmVwbHlfc2VyaWFsIChtZXNzYWdlLCA1Njc4KTsKKworICBfZGJ1c192ZXJib3NlX2J5dGVzX29mX3N0cmluZyAoJm1lc3NhZ2UtPmhlYWRlci5kYXRhLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZtZXNzYWdlLT5oZWFkZXIuZGF0YSkpOworICBfZGJ1c192ZXJib3NlX2J5dGVzX29mX3N0cmluZyAoJm1lc3NhZ2UtPmJvZHksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJm1lc3NhZ2UtPmJvZHkpKTsKKworICBpZiAoIWRidXNfbWVzc2FnZV9zZXRfc2VuZGVyIChtZXNzYWdlLCBOVUxMKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvdXQgb2YgbWVtb3J5Iik7CisKKworICBfZGJ1c192ZXJib3NlX2J5dGVzX29mX3N0cmluZyAoJm1lc3NhZ2UtPmhlYWRlci5kYXRhLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZtZXNzYWdlLT5oZWFkZXIuZGF0YSkpOworICBfZGJ1c192ZXJib3NlX2J5dGVzX29mX3N0cmluZyAoJm1lc3NhZ2UtPmJvZHksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJm1lc3NhZ2UtPmJvZHkpKTsKKworCisgIF9kYnVzX2Fzc2VydCAoIWRidXNfbWVzc2FnZV9oYXNfc2VuZGVyIChtZXNzYWdlLCAib3JnLmZvby5iYXIxIikpOworICBfZGJ1c19hc3NlcnQgKGRidXNfbWVzc2FnZV9nZXRfc2VyaWFsIChtZXNzYWdlKSA9PSAxMjM0KTsKKyAgX2RidXNfYXNzZXJ0IChkYnVzX21lc3NhZ2VfZ2V0X3JlcGx5X3NlcmlhbCAobWVzc2FnZSkgPT0gNTY3OCk7CisgIF9kYnVzX2Fzc2VydCAoZGJ1c19tZXNzYWdlX2hhc19kZXN0aW5hdGlvbiAobWVzc2FnZSwgIm9yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTZXJ2aWNlIikpOworCisgIF9kYnVzX2Fzc2VydCAoZGJ1c19tZXNzYWdlX2dldF9ub19yZXBseSAobWVzc2FnZSkgPT0gRkFMU0UpOworICBkYnVzX21lc3NhZ2Vfc2V0X25vX3JlcGx5IChtZXNzYWdlLCBUUlVFKTsKKyAgX2RidXNfYXNzZXJ0IChkYnVzX21lc3NhZ2VfZ2V0X25vX3JlcGx5IChtZXNzYWdlKSA9PSBUUlVFKTsKKyAgZGJ1c19tZXNzYWdlX3NldF9ub19yZXBseSAobWVzc2FnZSwgRkFMU0UpOworICBfZGJ1c19hc3NlcnQgKGRidXNfbWVzc2FnZV9nZXRfbm9fcmVwbHkgKG1lc3NhZ2UpID09IEZBTFNFKTsKKworICAvKiBTZXQvZ2V0IHNvbWUgaGVhZGVyIGZpZWxkcyAqLworCisgIGlmICghZGJ1c19tZXNzYWdlX3NldF9wYXRoIChtZXNzYWdlLCAiL2ZvbyIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm91dCBvZiBtZW1vcnkiKTsKKyAgX2RidXNfYXNzZXJ0IChzdHJjbXAgKGRidXNfbWVzc2FnZV9nZXRfcGF0aCAobWVzc2FnZSksCisgICAgICAgICAgICAgICAgICAgICAgICAiL2ZvbyIpID09IDApOworCisgIGlmICghZGJ1c19tZXNzYWdlX3NldF9pbnRlcmZhY2UgKG1lc3NhZ2UsICJvcmcuRm9vIikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib3V0IG9mIG1lbW9yeSIpOworICBfZGJ1c19hc3NlcnQgKHN0cmNtcCAoZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG1lc3NhZ2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5Gb28iKSA9PSAwKTsKKworICBpZiAoIWRidXNfbWVzc2FnZV9zZXRfbWVtYmVyIChtZXNzYWdlLCAiQmFyIikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib3V0IG9mIG1lbW9yeSIpOworICBfZGJ1c19hc3NlcnQgKHN0cmNtcCAoZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKG1lc3NhZ2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgIkJhciIpID09IDApOworCisgIC8qIFNldC9nZXQgdGhlbSB3aXRoIGxvbmdlciB2YWx1ZXMgKi8KKyAgaWYgKCFkYnVzX21lc3NhZ2Vfc2V0X3BhdGggKG1lc3NhZ2UsICIvZm9vL2JhciIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm91dCBvZiBtZW1vcnkiKTsKKyAgX2RidXNfYXNzZXJ0IChzdHJjbXAgKGRidXNfbWVzc2FnZV9nZXRfcGF0aCAobWVzc2FnZSksCisgICAgICAgICAgICAgICAgICAgICAgICAiL2Zvby9iYXIiKSA9PSAwKTsKKworICBpZiAoIWRidXNfbWVzc2FnZV9zZXRfaW50ZXJmYWNlIChtZXNzYWdlLCAib3JnLkZvby5CYXIiKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvdXQgb2YgbWVtb3J5Iik7CisgIF9kYnVzX2Fzc2VydCAoc3RyY21wIChkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAobWVzc2FnZSksCisgICAgICAgICAgICAgICAgICAgICAgICAib3JnLkZvby5CYXIiKSA9PSAwKTsKKworICBpZiAoIWRidXNfbWVzc2FnZV9zZXRfbWVtYmVyIChtZXNzYWdlLCAiQmFyRm9vIikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib3V0IG9mIG1lbW9yeSIpOworICBfZGJ1c19hc3NlcnQgKHN0cmNtcCAoZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKG1lc3NhZ2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgIkJhckZvbyIpID09IDApOworCisgIC8qIFJlYWxsb2Mgc2hvcnRlciBhZ2FpbiAqLworCisgIGlmICghZGJ1c19tZXNzYWdlX3NldF9wYXRoIChtZXNzYWdlLCAiL2ZvbyIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm91dCBvZiBtZW1vcnkiKTsKKyAgX2RidXNfYXNzZXJ0IChzdHJjbXAgKGRidXNfbWVzc2FnZV9nZXRfcGF0aCAobWVzc2FnZSksCisgICAgICAgICAgICAgICAgICAgICAgICAiL2ZvbyIpID09IDApOworCisgIGlmICghZGJ1c19tZXNzYWdlX3NldF9pbnRlcmZhY2UgKG1lc3NhZ2UsICJvcmcuRm9vIikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib3V0IG9mIG1lbW9yeSIpOworICBfZGJ1c19hc3NlcnQgKHN0cmNtcCAoZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG1lc3NhZ2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5Gb28iKSA9PSAwKTsKKworICBpZiAoIWRidXNfbWVzc2FnZV9zZXRfbWVtYmVyIChtZXNzYWdlLCAiQmFyIikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib3V0IG9mIG1lbW9yeSIpOworICBfZGJ1c19hc3NlcnQgKHN0cmNtcCAoZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKG1lc3NhZ2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgIkJhciIpID09IDApOworCisgIC8qIFBhdGggZGVjb21wb3NpbmcgKi8KKyAgZGJ1c19tZXNzYWdlX3NldF9wYXRoIChtZXNzYWdlLCBOVUxMKTsKKyAgZGJ1c19tZXNzYWdlX2dldF9wYXRoX2RlY29tcG9zZWQgKG1lc3NhZ2UsICZkZWNvbXBvc2VkKTsKKyAgX2RidXNfYXNzZXJ0IChkZWNvbXBvc2VkID09IE5VTEwpOworICBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5IChkZWNvbXBvc2VkKTsKKworICBkYnVzX21lc3NhZ2Vfc2V0X3BhdGggKG1lc3NhZ2UsICIvIik7CisgIGRidXNfbWVzc2FnZV9nZXRfcGF0aF9kZWNvbXBvc2VkIChtZXNzYWdlLCAmZGVjb21wb3NlZCk7CisgIF9kYnVzX2Fzc2VydCAoZGVjb21wb3NlZCAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChkZWNvbXBvc2VkWzBdID09IE5VTEwpOworICBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5IChkZWNvbXBvc2VkKTsKKworICBkYnVzX21lc3NhZ2Vfc2V0X3BhdGggKG1lc3NhZ2UsICIvYS9iIik7CisgIGRidXNfbWVzc2FnZV9nZXRfcGF0aF9kZWNvbXBvc2VkIChtZXNzYWdlLCAmZGVjb21wb3NlZCk7CisgIF9kYnVzX2Fzc2VydCAoZGVjb21wb3NlZCAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChzdHJjbXAgKGRlY29tcG9zZWRbMF0sICJhIikgPT0gMCk7CisgIF9kYnVzX2Fzc2VydCAoc3RyY21wIChkZWNvbXBvc2VkWzFdLCAiYiIpID09IDApOworICBfZGJ1c19hc3NlcnQgKGRlY29tcG9zZWRbMl0gPT0gTlVMTCk7CisgIGRidXNfZnJlZV9zdHJpbmdfYXJyYXkgKGRlY29tcG9zZWQpOworCisgIGRidXNfbWVzc2FnZV9zZXRfcGF0aCAobWVzc2FnZSwgIi9zcGFtL2VnZ3MiKTsKKyAgZGJ1c19tZXNzYWdlX2dldF9wYXRoX2RlY29tcG9zZWQgKG1lc3NhZ2UsICZkZWNvbXBvc2VkKTsKKyAgX2RidXNfYXNzZXJ0IChkZWNvbXBvc2VkICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKHN0cmNtcCAoZGVjb21wb3NlZFswXSwgInNwYW0iKSA9PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChzdHJjbXAgKGRlY29tcG9zZWRbMV0sICJlZ2dzIikgPT0gMCk7CisgIF9kYnVzX2Fzc2VydCAoZGVjb21wb3NlZFsyXSA9PSBOVUxMKTsKKyAgZGJ1c19mcmVlX3N0cmluZ19hcnJheSAoZGVjb21wb3NlZCk7CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKworICAvKiBUZXN0IHRoZSB2YXJhcmcgZnVuY3Rpb25zICovCisgIG1lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsICgib3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFNlcnZpY2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9vcmcvZnJlZWRlc2t0b3AvVGVzdFBhdGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZvby5UZXN0SW50ZXJmYWNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUZXN0TWV0aG9kIik7CisgIGRidXNfbWVzc2FnZV9zZXRfc2VyaWFsIChtZXNzYWdlLCAxKTsKKyAgZGJ1c19tZXNzYWdlX3NldF9yZXBseV9zZXJpYWwgKG1lc3NhZ2UsIDU2NzgpOworCisgIHZfSU5UMTYgPSAtMHgxMjM7CisgIHZfVUlOVDE2ID0gMHgxMjM7CisgIHZfSU5UMzIgPSAtMHgxMjM0NTY3ODsKKyAgdl9VSU5UMzIgPSAweDEyMzAwMDQyOworICB2X0lOVDY0ID0gREJVU19JTlQ2NF9DT05TVEFOVCAoLTB4MTIzNDU2Nzg5YWJjZCk7CisgIHZfVUlOVDY0ID0gREJVU19VSU5UNjRfQ09OU1RBTlQgKDB4MTIzNDU2Nzg5YWJjZCk7CisgIHZfU1RSSU5HID0gIlRlc3Qgc3RyaW5nIjsKKyAgdl9ET1VCTEUgPSAzLjE0MTU5OworICB2X0JPT0xFQU4gPSBUUlVFOworICB2X0JZVEUgPSA0MjsKKyAgdjJfQllURSA9IDI0OworI2lmZGVmIEhBVkVfVU5JWF9GRF9QQVNTSU5HCisgIHZfVU5JWF9GRCA9IDE7CisgIHYxX1VOSVhfRkQgPSAyOworI2VuZGlmCisKKyAgZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlQxNiwgJnZfSU5UMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1VJTlQxNiwgJnZfVUlOVDE2LAorCQkJICAgIERCVVNfVFlQRV9JTlQzMiwgJnZfSU5UMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1VJTlQzMiwgJnZfVUlOVDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlQ2NCwgJnZfSU5UNjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1VJTlQ2NCwgJnZfVUlOVDY0LAorCQkJICAgIERCVVNfVFlQRV9TVFJJTkcsICZ2X1NUUklORywKKwkJCSAgICBEQlVTX1RZUEVfRE9VQkxFLCAmdl9ET1VCTEUsCisJCQkgICAgREJVU19UWVBFX0JPT0xFQU4sICZ2X0JPT0xFQU4sCisJCQkgICAgREJVU19UWVBFX0JZVEUsICZ2X0JZVEUsCisJCQkgICAgREJVU19UWVBFX0JZVEUsICZ2Ml9CWVRFLAorCQkJICAgIERCVVNfVFlQRV9BUlJBWSwgREJVU19UWVBFX1VJTlQzMiwgJnZfQVJSQVlfVUlOVDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9EQlVTX05fRUxFTUVOVFMgKG91cl91aW50MzJfYXJyYXkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9BUlJBWSwgREJVU19UWVBFX0lOVDMyLCAmdl9BUlJBWV9JTlQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfREJVU19OX0VMRU1FTlRTIChvdXJfaW50MzJfYXJyYXkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9BUlJBWSwgREJVU19UWVBFX1VJTlQ2NCwgJnZfQVJSQVlfVUlOVDY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9EQlVTX05fRUxFTUVOVFMgKG91cl91aW50NjRfYXJyYXkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9BUlJBWSwgREJVU19UWVBFX0lOVDY0LCAmdl9BUlJBWV9JTlQ2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfREJVU19OX0VMRU1FTlRTIChvdXJfaW50NjRfYXJyYXkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9BUlJBWSwgREJVU19UWVBFX0RPVUJMRSwgJnZfQVJSQVlfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9EQlVTX05fRUxFTUVOVFMgKG91cl9kb3VibGVfYXJyYXkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9BUlJBWSwgREJVU19UWVBFX0JZVEUsICZ2X0FSUkFZX0JZVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0RCVVNfTl9FTEVNRU5UUyAob3VyX2J5dGVfYXJyYXkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9BUlJBWSwgREJVU19UWVBFX0JPT0xFQU4sICZ2X0FSUkFZX0JPT0xFQU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0RCVVNfTl9FTEVNRU5UUyAob3VyX2Jvb2xlYW5fYXJyYXkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9BUlJBWSwgREJVU19UWVBFX1NUUklORywgJnZfQVJSQVlfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9EQlVTX05fRUxFTUVOVFMgKG91cl9zdHJpbmdfYXJyYXkpLAorCisJCQkgICAgREJVU19UWVBFX0lOVkFMSUQpOworCisgIGkgPSAwOworICBzaWdbaSsrXSA9IERCVVNfVFlQRV9JTlQxNjsKKyAgc2lnW2krK10gPSBEQlVTX1RZUEVfVUlOVDE2OworICBzaWdbaSsrXSA9IERCVVNfVFlQRV9JTlQzMjsKKyAgc2lnW2krK10gPSBEQlVTX1RZUEVfVUlOVDMyOworICBzaWdbaSsrXSA9IERCVVNfVFlQRV9JTlQ2NDsKKyAgc2lnW2krK10gPSBEQlVTX1RZUEVfVUlOVDY0OworICBzaWdbaSsrXSA9IERCVVNfVFlQRV9TVFJJTkc7CisgIHNpZ1tpKytdID0gREJVU19UWVBFX0RPVUJMRTsKKyAgc2lnW2krK10gPSBEQlVTX1RZUEVfQk9PTEVBTjsKKyAgc2lnW2krK10gPSBEQlVTX1RZUEVfQllURTsKKyAgc2lnW2krK10gPSBEQlVTX1RZUEVfQllURTsKKyAgc2lnW2krK10gPSBEQlVTX1RZUEVfQVJSQVk7CisgIHNpZ1tpKytdID0gREJVU19UWVBFX1VJTlQzMjsKKyAgc2lnW2krK10gPSBEQlVTX1RZUEVfQVJSQVk7CisgIHNpZ1tpKytdID0gREJVU19UWVBFX0lOVDMyOworICBzaWdbaSsrXSA9IERCVVNfVFlQRV9BUlJBWTsKKyAgc2lnW2krK10gPSBEQlVTX1RZUEVfVUlOVDY0OworICBzaWdbaSsrXSA9IERCVVNfVFlQRV9BUlJBWTsKKyAgc2lnW2krK10gPSBEQlVTX1RZUEVfSU5UNjQ7CisgIHNpZ1tpKytdID0gREJVU19UWVBFX0FSUkFZOworICBzaWdbaSsrXSA9IERCVVNfVFlQRV9ET1VCTEU7CisgIHNpZ1tpKytdID0gREJVU19UWVBFX0FSUkFZOworICBzaWdbaSsrXSA9IERCVVNfVFlQRV9CWVRFOworICBzaWdbaSsrXSA9IERCVVNfVFlQRV9BUlJBWTsKKyAgc2lnW2krK10gPSBEQlVTX1RZUEVfQk9PTEVBTjsKKyAgc2lnW2krK10gPSBEQlVTX1RZUEVfQVJSQVk7CisgIHNpZ1tpKytdID0gREJVU19UWVBFX1NUUklORzsKKworICBtZXNzYWdlX3dpdGhvdXRfdW5peF9mZHMgPSBkYnVzX21lc3NhZ2VfY29weShtZXNzYWdlKTsKKyAgX2RidXNfYXNzZXJ0KG1lc3NhZ2Vfd2l0aG91dF91bml4X2Zkcyk7CisjaWZkZWYgSEFWRV9VTklYX0ZEX1BBU1NJTkcKKyAgZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9VTklYX0ZELCAmdl9VTklYX0ZELAorCQkJICAgIERCVVNfVFlQRV9JTlZBTElEKTsKKyAgc2lnW2krK10gPSBEQlVTX1RZUEVfVU5JWF9GRDsKKyNlbmRpZgorICBzaWdbaSsrXSA9IERCVVNfVFlQRV9JTlZBTElEOworCisgIF9kYnVzX2Fzc2VydCAoaSA8IChpbnQpIF9EQlVTX05fRUxFTUVOVFMgKHNpZykpOworCisgIF9kYnVzX3ZlcmJvc2UgKCJIRUFERVJcbiIpOworICBfZGJ1c192ZXJib3NlX2J5dGVzX29mX3N0cmluZyAoJm1lc3NhZ2UtPmhlYWRlci5kYXRhLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZtZXNzYWdlLT5oZWFkZXIuZGF0YSkpOworICBfZGJ1c192ZXJib3NlICgiQk9EWVxuIik7CisgIF9kYnVzX3ZlcmJvc2VfYnl0ZXNfb2Zfc3RyaW5nICgmbWVzc2FnZS0+Ym9keSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmbWVzc2FnZS0+Ym9keSkpOworCisgIF9kYnVzX3ZlcmJvc2UgKCJTaWduYXR1cmUgZXhwZWN0ZWQgXCIlc1wiIGFjdHVhbCBcIiVzXCJcbiIsCisgICAgICAgICAgICAgICAgIHNpZywgZGJ1c19tZXNzYWdlX2dldF9zaWduYXR1cmUgKG1lc3NhZ2UpKTsKKworICBzID0gZGJ1c19tZXNzYWdlX2dldF9zaWduYXR1cmUgKG1lc3NhZ2UpOworCisgIF9kYnVzX2Fzc2VydCAoZGJ1c19tZXNzYWdlX2hhc19zaWduYXR1cmUgKG1lc3NhZ2UsIHNpZykpOworICBfZGJ1c19hc3NlcnQgKHN0cmNtcCAocywgc2lnKSA9PSAwKTsKKworICB2ZXJpZnlfdGVzdF9tZXNzYWdlIChtZXNzYWdlKTsKKworICBjb3B5ID0gZGJ1c19tZXNzYWdlX2NvcHkgKG1lc3NhZ2UpOworCisgIF9kYnVzX2Fzc2VydCAoZGJ1c19tZXNzYWdlX2dldF9yZXBseV9zZXJpYWwgKG1lc3NhZ2UpID09CisgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9yZXBseV9zZXJpYWwgKGNvcHkpKTsKKyAgX2RidXNfYXNzZXJ0IChtZXNzYWdlLT5oZWFkZXIucGFkZGluZyA9PSBjb3B5LT5oZWFkZXIucGFkZGluZyk7CisKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJm1lc3NhZ2UtPmhlYWRlci5kYXRhKSA9PQorICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmY29weS0+aGVhZGVyLmRhdGEpKTsKKworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmbWVzc2FnZS0+Ym9keSkgPT0KKyAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmNvcHktPmJvZHkpKTsKKworICB2ZXJpZnlfdGVzdF9tZXNzYWdlIChjb3B5KTsKKworICBuYW1lMSA9IGRidXNfbWVzc2FnZV9nZXRfaW50ZXJmYWNlIChtZXNzYWdlKTsKKyAgbmFtZTIgPSBkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAoY29weSk7CisKKyAgX2RidXNfYXNzZXJ0IChzdHJjbXAgKG5hbWUxLCBuYW1lMikgPT0gMCk7CisKKyAgbmFtZTEgPSBkYnVzX21lc3NhZ2VfZ2V0X21lbWJlciAobWVzc2FnZSk7CisgIG5hbWUyID0gZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKGNvcHkpOworCisgIF9kYnVzX2Fzc2VydCAoc3RyY21wIChuYW1lMSwgbmFtZTIpID09IDApOworCisgIGRidXNfbWVzc2FnZV91bnJlZiAoY29weSk7CisKKyAgLyogTWVzc2FnZSBsb2FkZXIgdGVzdCAqLworICBkYnVzX21lc3NhZ2VfbG9jayAobWVzc2FnZSk7CisgIGxvYWRlciA9IF9kYnVzX21lc3NhZ2VfbG9hZGVyX25ldyAoKTsKKyAgCisgIC8qIGNoZWNrIHJlZi91bnJlZiAqLworICBfZGJ1c19tZXNzYWdlX2xvYWRlcl9yZWYgKGxvYWRlcik7CisgIF9kYnVzX21lc3NhZ2VfbG9hZGVyX3VucmVmIChsb2FkZXIpOworCisgIC8qIFdyaXRlIHRoZSBoZWFkZXIgZGF0YSBvbmUgYnl0ZSBhdCBhIHRpbWUgKi8KKyAgZGF0YSA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJm1lc3NhZ2UtPmhlYWRlci5kYXRhKTsKKyAgZm9yIChpID0gMDsgaSA8IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmbWVzc2FnZS0+aGVhZGVyLmRhdGEpOyBpKyspCisgICAgeworICAgICAgREJ1c1N0cmluZyAqYnVmZmVyOworCisgICAgICBfZGJ1c19tZXNzYWdlX2xvYWRlcl9nZXRfYnVmZmVyIChsb2FkZXIsICZidWZmZXIsIE5VTEwsIE5VTEwpOworICAgICAgX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlIChidWZmZXIsIGRhdGFbaV0pOworICAgICAgX2RidXNfbWVzc2FnZV9sb2FkZXJfcmV0dXJuX2J1ZmZlciAobG9hZGVyLCBidWZmZXIpOworICAgIH0KKworICAvKiBXcml0ZSB0aGUgYm9keSBkYXRhIG9uZSBieXRlIGF0IGEgdGltZSAqLworICBkYXRhID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmbWVzc2FnZS0+Ym9keSk7CisgIGZvciAoaSA9IDA7IGkgPCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJm1lc3NhZ2UtPmJvZHkpOyBpKyspCisgICAgeworICAgICAgREJ1c1N0cmluZyAqYnVmZmVyOworCisgICAgICBfZGJ1c19tZXNzYWdlX2xvYWRlcl9nZXRfYnVmZmVyIChsb2FkZXIsICZidWZmZXIsIE5VTEwsIE5VTEwpOworICAgICAgX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlIChidWZmZXIsIGRhdGFbaV0pOworICAgICAgX2RidXNfbWVzc2FnZV9sb2FkZXJfcmV0dXJuX2J1ZmZlciAobG9hZGVyLCBidWZmZXIpOworICAgIH0KKworI2lmZGVmIEhBVkVfVU5JWF9GRF9QQVNTSU5HCisgIHsKKyAgICBpbnQgKnVuaXhfZmRzOworICAgIHVuc2lnbmVkIG5fdW5peF9mZHM7CisgICAgLyogV3JpdGUgdW5peCBmZCAqLworICAgIF9kYnVzX21lc3NhZ2VfbG9hZGVyX2dldF91bml4X2Zkcyhsb2FkZXIsICZ1bml4X2ZkcywgJm5fdW5peF9mZHMpOworICAgIF9kYnVzX2Fzc2VydChuX3VuaXhfZmRzID4gMCk7CisgICAgX2RidXNfYXNzZXJ0KG1lc3NhZ2UtPm5fdW5peF9mZHMgPT0gMSk7CisgICAgdW5peF9mZHNbMF0gPSBfZGJ1c19kdXAobWVzc2FnZS0+dW5peF9mZHNbMF0sIE5VTEwpOworICAgIF9kYnVzX2Fzc2VydCh1bml4X2Zkc1swXSA+PSAwKTsKKyAgICBfZGJ1c19tZXNzYWdlX2xvYWRlcl9yZXR1cm5fdW5peF9mZHMobG9hZGVyLCB1bml4X2ZkcywgMSk7CisgIH0KKyNlbmRpZgorCisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisKKyAgLyogTm93IHBvcCBiYWNrIHRoZSBtZXNzYWdlICovCisgIGlmICghX2RidXNfbWVzc2FnZV9sb2FkZXJfcXVldWVfbWVzc2FnZXMgKGxvYWRlcikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5IHRvIHF1ZXVlIG1lc3NhZ2VzIik7CisKKyAgaWYgKF9kYnVzX21lc3NhZ2VfbG9hZGVyX2dldF9pc19jb3JydXB0ZWQgKGxvYWRlcikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibWVzc2FnZSBsb2FkZXIgY29ycnVwdGVkIik7CisKKyAgbWVzc2FnZSA9IF9kYnVzX21lc3NhZ2VfbG9hZGVyX3BvcF9tZXNzYWdlIChsb2FkZXIpOworICBpZiAoIW1lc3NhZ2UpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgicmVjZWl2ZWQgYSBOVUxMIG1lc3NhZ2UiKTsKKworICBpZiAoZGJ1c19tZXNzYWdlX2dldF9yZXBseV9zZXJpYWwgKG1lc3NhZ2UpICE9IDU2NzgpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgicmVwbHkgc2VyaWFsIGZpZWxkcyBkaWZmZXIiKTsKKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworCisgIC8qIG92dmVyaWRlIHRoZSBzZXJpYWwsIHNpbmNlIGl0IHdhcyByZXNldCBieSBkYnVzX21lc3NhZ2VfY29weSgpICovCisgIGRidXNfbWVzc2FnZV9zZXRfc2VyaWFsKG1lc3NhZ2Vfd2l0aG91dF91bml4X2ZkcywgODkwMSk7CisKKyAgZGJ1c19tZXNzYWdlX2xvY2sgKG1lc3NhZ2Vfd2l0aG91dF91bml4X2Zkcyk7CisKKyAgdmVyaWZ5X3Rlc3RfbWVzc2FnZSAobWVzc2FnZV93aXRob3V0X3VuaXhfZmRzKTsKKworICAgIHsKKyAgICAgIC8qIE1hcnNoYWwgYW5kIGRlbWFyc2hhbCB0aGUgbWVzc2FnZS4gKi8KKworICAgICAgREJ1c01lc3NhZ2UgKm1lc3NhZ2UyOworICAgICAgREJ1c0Vycm9yIGVycm9yID0gREJVU19FUlJPUl9JTklUOworICAgICAgY2hhciAqbWFyc2hhbGxlZCA9IE5VTEw7CisgICAgICBpbnQgbGVuID0gMDsKKyAgICAgIGNoYXIgZ2FyYmFnZV9oZWFkZXJbREJVU19NSU5JTVVNX0hFQURFUl9TSVpFXSA9ICJ4eHgiOworCisgICAgICBpZiAoIWRidXNfbWVzc2FnZV9tYXJzaGFsIChtZXNzYWdlX3dpdGhvdXRfdW5peF9mZHMsICZtYXJzaGFsbGVkLCAmbGVuKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZmFpbGVkIHRvIG1hcnNoYWwgbWVzc2FnZSIpOworCisgICAgICBfZGJ1c19hc3NlcnQgKGxlbiAhPSAwKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAobWFyc2hhbGxlZCAhPSBOVUxMKTsKKworICAgICAgX2RidXNfYXNzZXJ0IChkYnVzX21lc3NhZ2VfZGVtYXJzaGFsX2J5dGVzX25lZWRlZCAobWFyc2hhbGxlZCwgbGVuKSA9PSBsZW4pOworICAgICAgbWVzc2FnZTIgPSBkYnVzX21lc3NhZ2VfZGVtYXJzaGFsIChtYXJzaGFsbGVkLCBsZW4sICZlcnJvcik7CisKKyAgICAgIF9kYnVzX2Fzc2VydCAobWVzc2FnZTIgIT0gTlVMTCk7CisgICAgICBfZGJ1c19hc3NlcnQgKCFkYnVzX2Vycm9yX2lzX3NldCAoJmVycm9yKSk7CisgICAgICB2ZXJpZnlfdGVzdF9tZXNzYWdlIChtZXNzYWdlMik7CisKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZTIpOworICAgICAgZGJ1c19mcmVlIChtYXJzaGFsbGVkKTsKKworICAgICAgLyogRGVtYXJzaGFsIGludmFsaWQgbWVzc2FnZS4gKi8KKworICAgICAgbWVzc2FnZTIgPSBkYnVzX21lc3NhZ2VfZGVtYXJzaGFsICgiaW52YWxpZCIsIDcsICZlcnJvcik7CisgICAgICBfZGJ1c19hc3NlcnQgKG1lc3NhZ2UyID09IE5VTEwpOworICAgICAgX2RidXNfYXNzZXJ0IChkYnVzX2Vycm9yX2lzX3NldCAoJmVycm9yKSk7CisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisKKyAgICAgIC8qIERlbWFyc2hhbCBpbnZhbGlkIChlbXB0eSkgbWVzc2FnZS4gKi8KKworICAgICAgbWVzc2FnZTIgPSBkYnVzX21lc3NhZ2VfZGVtYXJzaGFsICgiIiwgMCwgJmVycm9yKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAobWVzc2FnZTIgPT0gTlVMTCk7CisgICAgICBfZGJ1c19hc3NlcnQgKGRidXNfZXJyb3JfaXNfc2V0ICgmZXJyb3IpKTsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKworICAgICAgLyogQnl0ZXMgbmVlZGVkIHRvIGRlbWFyc2hhbCBlbXB0eSBtZXNzYWdlOiAwIChtb3JlKSAqLworCisgICAgICBfZGJ1c19hc3NlcnQgKGRidXNfbWVzc2FnZV9kZW1hcnNoYWxfYnl0ZXNfbmVlZGVkICgiIiwgMCkgPT0gMCk7CisgICAgICAKKyAgICAgIC8qIEJ5dGVzIG5lZWRlZCB0byBkZW1hcnNoYWwgaW52YWxpZCBtZXNzYWdlOiAtMSAoZXJyb3IpLiAqLworCisgICAgICBfZGJ1c19hc3NlcnQgKGRidXNfbWVzc2FnZV9kZW1hcnNoYWxfYnl0ZXNfbmVlZGVkIChnYXJiYWdlX2hlYWRlciwgREJVU19NSU5JTVVNX0hFQURFUl9TSVpFKSA9PSAtMSk7CisgICAgfQorCisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZV93aXRob3V0X3VuaXhfZmRzKTsKKyAgX2RidXNfbWVzc2FnZV9sb2FkZXJfdW5yZWYgKGxvYWRlcik7CisKKyAgY2hlY2tfbWVtbGVha3MgKCk7CisgIF9kYnVzX2NoZWNrX2ZkbGVha3NfbGVhdmUgKGluaXRpYWxfZmRzKTsKKyAgaW5pdGlhbF9mZHMgPSBfZGJ1c19jaGVja19mZGxlYWtzX2VudGVyICgpOworCisgIC8qIFRlc3QgZW51bWVyYXRpb24gb2YgYXJyYXkgZWxlbWVudHMgKi8KKyAgZm9yIChpID0gc3RybGVuIChiYXNpY190eXBlcykgLSAxOyBpID4gMDsgaS0tKQorICAgIHsKKyAgICAgIERCdXNCYXNpY1ZhbHVlIHZhbDsKKyAgICAgIGludCBzb21lOworICAgICAgY2hhciogc2lnbmF0dXJlID0gX2RidXNfc3RyZHVwICgiPyIpOworCisgICAgICBzaWduYXR1cmVbMF0gPSBiYXNpY190eXBlc1tpXTsKKyAgICAgIHMgPSAiU29tZVRoaW5nVG9TYXkiOworICAgICAgbWVtc2V0ICgmdmFsLCAnXDAnLCBzaXplb2YgKHZhbCkpOworCisgICAgICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoImRlLmVuZGUudGVzdCIsCisgICAgICAgICIvZGUvZW5kZS90ZXN0IiwgImRlLmVuZGUuVGVzdCIsICJBcnRpc3ROYW1lIik7CisgICAgICBfZGJ1c19hc3NlcnQgKG1lc3NhZ2UgIT0gTlVMTCk7CisgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9pbml0X2FwcGVuZCAobWVzc2FnZSwgJml0ZXIpOworICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfb3Blbl9jb250YWluZXIgKCZpdGVyLCBEQlVTX1RZUEVfQVJSQVksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlLCAmYXJyYXlfaXRlcik7CisgICAgICBmb3IgKHNvbWUgPSAwOyBzb21lIDwgMzsgc29tZSsrKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGJhc2ljX3R5cGVzW2ldID09IERCVVNfVFlQRV9TVFJJTkcpCisgICAgICAgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfYmFzaWMgKCZhcnJheV9pdGVyLCBEQlVTX1RZUEVfU1RSSU5HLCAmcyk7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljICgmYXJyYXlfaXRlciwgYmFzaWNfdHlwZXNbaV0sICZ2YWwpOworICAgICAgICB9CisgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9jbG9zZV9jb250YWluZXIgKCZpdGVyLCAmYXJyYXlfaXRlcik7CisgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9pbml0IChtZXNzYWdlLCAmaXRlcik7CisgICAgICBfZGJ1c19hc3NlcnQgKGRidXNfbWVzc2FnZV9pdGVyX2dldF9lbGVtZW50X2NvdW50ICgmaXRlcikgPT0gc29tZSk7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgZGJ1c19mcmVlIChzaWduYXR1cmUpOworICAgIH0KKyAgLyogQXJyYXkgb2Ygc3RydWN0cyAqLworICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoImRlLmVuZGUudGVzdCIsCisgICAgICAiL2RlL2VuZGUvdGVzdCIsICJkZS5lbmRlLlRlc3QiLCAiQXJ0aXN0TmFtZSIpOworICBfZGJ1c19hc3NlcnQgKG1lc3NhZ2UgIT0gTlVMTCk7CisgIGRidXNfbWVzc2FnZV9pdGVyX2luaXRfYXBwZW5kIChtZXNzYWdlLCAmaXRlcik7CisgIGRidXNfbWVzc2FnZV9pdGVyX29wZW5fY29udGFpbmVyICgmaXRlciwgREJVU19UWVBFX0FSUkFZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19TVFJVQ1RfQkVHSU5fQ0hBUl9BU19TVFJJTkcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkdfQVNfU1RSSU5HCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1NUUlVDVF9FTkRfQ0hBUl9BU19TVFJJTkcsICZhcnJheV9pdGVyKTsKKyAgZGJ1c19tZXNzYWdlX2l0ZXJfb3Blbl9jb250YWluZXIgKCZhcnJheV9pdGVyLCBEQlVTX1RZUEVfU1RSVUNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgJnN0cnVjdF9pdGVyKTsKKyAgcyA9ICJTcGFtQW5kRWdncyI7CisgIGRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYyAoJnN0cnVjdF9pdGVyLCBEQlVTX1RZUEVfU1RSSU5HLCAmcyk7CisgIGRidXNfbWVzc2FnZV9pdGVyX2Nsb3NlX2NvbnRhaW5lciAoJmFycmF5X2l0ZXIsICZzdHJ1Y3RfaXRlcik7CisgIGRidXNfbWVzc2FnZV9pdGVyX2Nsb3NlX2NvbnRhaW5lciAoJml0ZXIsICZhcnJheV9pdGVyKTsKKyAgZGJ1c19tZXNzYWdlX2l0ZXJfaW5pdCAobWVzc2FnZSwgJml0ZXIpOworICBfZGJ1c19hc3NlcnQgKGRidXNfbWVzc2FnZV9pdGVyX2dldF9lbGVtZW50X2NvdW50ICgmaXRlcikgPT0gMSk7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIGNoZWNrX21lbWxlYWtzICgpOworCisgIC8qIENoZWNrIHRoYXQgd2UgY2FuIGFiYW5kb24gYSBjb250YWluZXIgKi8KKyAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKCJvcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U2VydmljZSIsCisJCSAgCQkJICAiL29yZy9mcmVlZGVza3RvcC9UZXN0UGF0aCIsCisJCQkJCSAgIkZvby5UZXN0SW50ZXJmYWNlIiwKKwkJCQkJICAiTWV0aG9kIik7CisKKyAgZGJ1c19tZXNzYWdlX2l0ZXJfaW5pdF9hcHBlbmQgKG1lc3NhZ2UsICZpdGVyKTsKKworICBvayA9IGRidXNfbWVzc2FnZV9pdGVyX29wZW5fY29udGFpbmVyICgmaXRlciwgREJVU19UWVBFX0FSUkFZLAorCQkJICAJCQkgIChEQlVTX1NUUlVDVF9CRUdJTl9DSEFSX0FTX1NUUklORworCQkJCQkJICAgREJVU19UWVBFX1NUUklOR19BU19TVFJJTkcKKwkJCQkJCSAgIERCVVNfVFlQRV9TVFJJTkdfQVNfU1RSSU5HCisJCQkJCQkgICBEQlVTX1NUUlVDVF9FTkRfQ0hBUl9BU19TVFJJTkcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYXJyYXlfaXRlcik7CisgIF9kYnVzX2Fzc2VydCAob2spOworICBvayA9IGRidXNfbWVzc2FnZV9pdGVyX29wZW5fY29udGFpbmVyICgmYXJyYXlfaXRlciwgREJVU19UWVBFX1NUUlVDVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgJnN0cnVjdF9pdGVyKTsKKyAgX2RidXNfYXNzZXJ0IChvayk7CisgIHMgPSAicGVhY2hlcyI7CisgIG9rID0gZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljICgmc3RydWN0X2l0ZXIsIERCVVNfVFlQRV9TVFJJTkcsICZzKTsKKyAgX2RidXNfYXNzZXJ0IChvayk7CisKKyAgLyogdWgtb2gsIGVycm9yLCB0cnkgYW5kIHVud2luZCAqLworCisgIGRidXNfbWVzc2FnZV9pdGVyX2FiYW5kb25fY29udGFpbmVyICgmYXJyYXlfaXRlciwgJnN0cnVjdF9pdGVyKTsKKyAgZGJ1c19tZXNzYWdlX2l0ZXJfYWJhbmRvbl9jb250YWluZXIgKCZhcnJheV9pdGVyLCAmaXRlcik7CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKworICAvKiBDaGVjayB3ZSBzaG91bGQgbm90IGxlYWsgYXJyYXkgb2Ygc3RyaW5nIG9yIHVuaXggZmQsIGZkLm8jMjEyNTkgKi8KKyAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKCJvcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U2VydmljZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiL29yZy9mcmVlZGVza3RvcC9UZXN0UGF0aCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRm9vLlRlc3RJbnRlcmZhY2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1ldGhvZCIpOworCisgIC8qIHNpZ25hdHVyZSAidWFzaHVhc2giICovCisgIGRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfVUlOVDMyLCAmdl9VSU5UMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0FSUkFZLCBEQlVTX1RZUEVfU1RSSU5HLCAmdl9BUlJBWV9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0RCVVNfTl9FTEVNRU5UUyAob3VyX3N0cmluZ19hcnJheSksCisjaWZkZWYgSEFWRV9VTklYX0ZEX1BBU1NJTkcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfVU5JWF9GRCwgJnZfVU5JWF9GRCwKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9VSU5UMzIsICZ2MV9VSU5UMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0FSUkFZLCBEQlVTX1RZUEVfU1RSSU5HLCAmdjFfQVJSQVlfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9EQlVTX05fRUxFTUVOVFMgKG91cl9zdHJpbmdfYXJyYXkxKSwKKyNpZmRlZiBIQVZFX1VOSVhfRkRfUEFTU0lORworICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9VTklYX0ZELCAmdjFfVU5JWF9GRCwKKyNlbmRpZgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpOworCisgIGkgPSAwOworICBzaWdbaSsrXSA9IERCVVNfVFlQRV9VSU5UMzI7CisgIHNpZ1tpKytdID0gREJVU19UWVBFX0FSUkFZOworICBzaWdbaSsrXSA9IERCVVNfVFlQRV9TVFJJTkc7CisjaWZkZWYgSEFWRV9VTklYX0ZEX1BBU1NJTkcKKyAgc2lnW2krK10gPSBEQlVTX1RZUEVfVU5JWF9GRDsKKyNlbmRpZgorICBzaWdbaSsrXSA9IERCVVNfVFlQRV9VSU5UMzI7CisgIHNpZ1tpKytdID0gREJVU19UWVBFX0FSUkFZOworICBzaWdbaSsrXSA9IERCVVNfVFlQRV9TVFJJTkc7CisjaWZkZWYgSEFWRV9VTklYX0ZEX1BBU1NJTkcKKyAgc2lnW2krK10gPSBEQlVTX1RZUEVfVU5JWF9GRDsKKyNlbmRpZgorICBzaWdbaSsrXSA9IERCVVNfVFlQRV9JTlZBTElEOworCisgIF9kYnVzX2Fzc2VydCAoaSA8IChpbnQpIF9EQlVTX05fRUxFTUVOVFMgKHNpZykpOworCisgIHZlcmlmeV90ZXN0X21lc3NhZ2VfYXJnc19pZ25vcmVkIChtZXNzYWdlKTsKKyAgdmVyaWZ5X3Rlc3RfbWVzc2FnZV9tZW1sZWFrIChtZXNzYWdlKTsKKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworCisgIC8qIExvYWQgYWxsIHRoZSBzYW1wbGUgbWVzc2FnZXMgZnJvbSB0aGUgbWVzc2FnZSBmYWN0b3J5ICovCisgIHsKKyAgICBEQnVzTWVzc2FnZURhdGFJdGVyIGRpdGVyOworICAgIERCdXNNZXNzYWdlRGF0YSBtZGF0YTsKKyAgICBpbnQgY291bnQ7CisKKyAgICByZXNldF92YWxpZGl0aWVzX3NlZW4gKCk7CisgICAgCisgICAgY291bnQgPSAwOworICAgIF9kYnVzX21lc3NhZ2VfZGF0YV9pdGVyX2luaXQgKCZkaXRlcik7CisgICAgCisgICAgd2hpbGUgKF9kYnVzX21lc3NhZ2VfZGF0YV9pdGVyX2dldF9hbmRfbmV4dCAoJmRpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZGF0YSkpCisgICAgICB7CisgICAgICAgIGlmICghZGJ1c19pbnRlcm5hbF9kb19ub3RfdXNlX3RyeV9tZXNzYWdlX2RhdGEgKCZtZGF0YS5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZGF0YS5leHBlY3RlZF92YWxpZGl0eSkpCisgICAgICAgICAgeworICAgICAgICAgICAgX2RidXNfd2FybiAoImV4cGVjdGVkIHZhbGlkaXR5ICVkIGFuZCBkaWQgbm90IGdldCBpdCIsCisgICAgICAgICAgICAgICAgICAgICAgICBtZGF0YS5leHBlY3RlZF92YWxpZGl0eSk7CisgICAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJtZXNzYWdlIGRhdGEgZmFpbGVkIik7CisgICAgICAgICAgfQorCisgICAgICAgIF9kYnVzX21lc3NhZ2VfZGF0YV9mcmVlICgmbWRhdGEpOworCisgICAgICAgIGNvdW50ICs9IDE7CisgICAgICB9CisKKyAgICBwcmludGYgKCIlZCBzYW1wbGUgbWVzc2FnZXMgdGVzdGVkXG4iLCBjb3VudCk7CisKKyAgICBwcmludF92YWxpZGl0aWVzX3NlZW4gKEZBTFNFKTsKKyAgICBwcmludF92YWxpZGl0aWVzX3NlZW4gKFRSVUUpOworICB9CisKKyAgY2hlY2tfbWVtbGVha3MgKCk7CisgIF9kYnVzX2NoZWNrX2ZkbGVha3NfbGVhdmUgKGluaXRpYWxfZmRzKTsKKworICAvKiBOb3cgbG9hZCBldmVyeSBtZXNzYWdlIGluIHRlc3RfZGF0YV9kaXIgaWYgd2UgaGF2ZSBvbmUgKi8KKyAgaWYgKHRlc3RfZGF0YV9kaXIgPT0gTlVMTCkKKyAgICByZXR1cm4gVFJVRTsKKworICBpbml0aWFsX2ZkcyA9IF9kYnVzX2NoZWNrX2ZkbGVha3NfZW50ZXIgKCk7CisKKyAgaWYgKCFkYnVzX2ludGVybmFsX2RvX25vdF91c2VfZm9yZWFjaF9tZXNzYWdlX2ZpbGUgKHRlc3RfZGF0YV9kaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChEQnVzRm9yZWFjaE1lc3NhZ2VGaWxlRnVuYykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19pbnRlcm5hbF9kb19ub3RfdXNlX3RyeV9tZXNzYWdlX2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImZvcmVhY2hfbWVzc2FnZV9maWxlIHRlc3QgZmFpbGVkIik7CisKKyAgX2RidXNfY2hlY2tfZmRsZWFrc19sZWF2ZSAoaW5pdGlhbF9mZHMpOworCisgIHJldHVybiBUUlVFOworfQorCisjZW5kaWYgLyogREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMgKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1tZXNzYWdlLmMgYi9kYnVzL2RidXMtbWVzc2FnZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0ZDhjMGMKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtbWVzc2FnZS5jCkBAIC0wLDAgKzEsNTQ4MyBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLW1lc3NhZ2UuYyAgREJ1c01lc3NhZ2Ugb2JqZWN0CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1ICBSZWQgSGF0IEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMyAgQ29kZUZhY3RvcnkgQUIKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLWludGVybmFscy5oIgorI2luY2x1ZGUgImRidXMtbWFyc2hhbC1yZWN1cnNpdmUuaCIKKyNpbmNsdWRlICJkYnVzLW1hcnNoYWwtdmFsaWRhdGUuaCIKKyNpbmNsdWRlICJkYnVzLW1hcnNoYWwtYnl0ZXN3YXAuaCIKKyNpbmNsdWRlICJkYnVzLW1hcnNoYWwtaGVhZGVyLmgiCisjaW5jbHVkZSAiZGJ1cy1zaWduYXR1cmUuaCIKKyNpbmNsdWRlICJkYnVzLW1lc3NhZ2UtcHJpdmF0ZS5oIgorI2luY2x1ZGUgImRidXMtb2JqZWN0LXRyZWUuaCIKKyNpbmNsdWRlICJkYnVzLW1lbW9yeS5oIgorI2luY2x1ZGUgImRidXMtbGlzdC5oIgorI2luY2x1ZGUgImRidXMtdGhyZWFkcy1pbnRlcm5hbC5oIgorI2lmZGVmIEhBVkVfVU5JWF9GRF9QQVNTSU5HCisjaW5jbHVkZSAiZGJ1cy1zeXNkZXBzLmgiCisjaW5jbHVkZSAiZGJ1cy1zeXNkZXBzLXVuaXguaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNkZWZpbmUgX0RCVVNfVFlQRV9JU19TVFJJTkdMSUtFKHR5cGUpIFwKKyAgKHR5cGUgPT0gREJVU19UWVBFX1NUUklORyB8fCB0eXBlID09IERCVVNfVFlQRV9TSUdOQVRVUkUgfHwgXAorICAgdHlwZSA9PSBEQlVTX1RZUEVfT0JKRUNUX1BBVEgpCisKK3N0YXRpYyB2b2lkIGRidXNfbWVzc2FnZV9maW5hbGl6ZSAoREJ1c01lc3NhZ2UgKm1lc3NhZ2UpOworCisvKioKKyAqIEBkZWZncm91cCBEQnVzTWVzc2FnZUludGVybmFscyBEQnVzTWVzc2FnZSBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzCisgKiBAaW5ncm91cCBEQnVzSW50ZXJuYWxzCisgKiBAYnJpZWYgREJ1c01lc3NhZ2UgcHJpdmF0ZSBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLgorICoKKyAqIFRoZSBndXRzIG9mIERCdXNNZXNzYWdlIGFuZCBpdHMgbWV0aG9kcy4KKyAqCisgKiBAeworICovCisKKyNpZmRlZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworc3RhdGljIGRidXNfYm9vbF90CitfZGJ1c19lbmFibGVfbWVzc2FnZV9jYWNoZSAodm9pZCkKK3sKKyAgc3RhdGljIGludCBlbmFibGVkID0gLTE7CisKKyAgaWYgKGVuYWJsZWQgPCAwKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKnMgPSBfZGJ1c19nZXRlbnYgKCJEQlVTX01FU1NBR0VfQ0FDSEUiKTsKKworICAgICAgZW5hYmxlZCA9IFRSVUU7CisKKyAgICAgIGlmIChzICYmICpzKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCpzID09ICcwJykKKyAgICAgICAgICAgIGVuYWJsZWQgPSBGQUxTRTsKKyAgICAgICAgICBlbHNlIGlmICgqcyA9PSAnMScpCisgICAgICAgICAgICBlbmFibGVkID0gVFJVRTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBfZGJ1c193YXJuICgiREJVU19NRVNTQUdFX0NBQ0hFIHNob3VsZCBiZSAwIG9yIDEgaWYgc2V0LCBub3QgJyVzJyIsCisgICAgICAgICAgICAgICAgcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgcmV0dXJuIGVuYWJsZWQ7Cit9CisjZWxzZQorICAgIC8qIGNvbnN0YW50IGV4cHJlc3Npb24sIHNob3VsZCBiZSBvcHRpbWl6ZWQgYXdheSAqLworIyAgIGRlZmluZSBfZGJ1c19lbmFibGVfbWVzc2FnZV9jYWNoZSgpIChUUlVFKQorI2VuZGlmCisKKyNpZm5kZWYgX2RidXNfbWVzc2FnZV90cmFjZV9yZWYKK3ZvaWQKK19kYnVzX21lc3NhZ2VfdHJhY2VfcmVmIChEQnVzTWVzc2FnZSAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgb2xkX3JlZmNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICBuZXdfcmVmY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgKndoeSkKK3sKKyAgc3RhdGljIGludCBlbmFibGVkID0gLTE7CisKKyAgX2RidXNfdHJhY2VfcmVmICgiREJ1c01lc3NhZ2UiLCBtZXNzYWdlLCBvbGRfcmVmY291bnQsIG5ld19yZWZjb3VudCwgd2h5LAorICAgICAgIkRCVVNfTUVTU0FHRV9UUkFDRSIsICZlbmFibGVkKTsKK30KKyNlbmRpZgorCisvKiBOb3QgdGhyZWFkIGxvY2tlZCwgYnV0IHN0cmljdGx5IGNvbnN0L3JlYWQtb25seSBzbyBzaG91bGQgYmUgT0sKKyAqLworLyoqIEFuIHN0YXRpYyBzdHJpbmcgcmVwcmVzZW50aW5nIGFuIGVtcHR5IHNpZ25hdHVyZSAqLworX0RCVVNfU1RSSU5HX0RFRklORV9TVEFUSUMoX2RidXNfZW1wdHlfc2lnbmF0dXJlX3N0ciwgICIiKTsKKworLyogdGhlc2UgaGF2ZSB3YWNreSB2YWx1ZXMgdG8gaGVscCB0cmFwIHVuaW5pdGlhbGl6ZWQgaXRlcmF0b3JzOworICogYnV0IGhhcyB0byBmaXQgaW4gMyBiaXRzCisgKi8KK2VudW0geworICBEQlVTX01FU1NBR0VfSVRFUl9UWVBFX1JFQURFUiA9IDMsCisgIERCVVNfTUVTU0FHRV9JVEVSX1RZUEVfV1JJVEVSID0gNworfTsKKworLyoqIHR5cGVkZWYgZm9yIGludGVybmFscyBvZiBtZXNzYWdlIGl0ZXJhdG9yICovCit0eXBlZGVmIHN0cnVjdCBEQnVzTWVzc2FnZVJlYWxJdGVyIERCdXNNZXNzYWdlUmVhbEl0ZXI7CisKKy8qKgorICogQGJyaWVmIEludGVybmFscyBvZiBEQnVzTWVzc2FnZUl0ZXIKKyAqCisgKiBPYmplY3QgcmVwcmVzZW50aW5nIGEgcG9zaXRpb24gaW4gYSBtZXNzYWdlLiBBbGwgZmllbGRzIGFyZSBpbnRlcm5hbC4KKyAqLworc3RydWN0IERCdXNNZXNzYWdlUmVhbEl0ZXIKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7IC8qKjwgTWVzc2FnZSB1c2VkICovCisgIGRidXNfdWludDMyX3QgY2hhbmdlZF9zdGFtcCA6IENIQU5HRURfU1RBTVBfQklUUzsgLyoqPCBzdGFtcCB0byBkZXRlY3QgaW52YWxpZCBpdGVycyAqLworICBkYnVzX3VpbnQzMl90IGl0ZXJfdHlwZSA6IDM7ICAgICAgLyoqPCB3aGV0aGVyIHRoaXMgaXMgYSByZWFkZXIgb3Igd3JpdGVyIGl0ZXIgKi8KKyAgZGJ1c191aW50MzJfdCBzaWdfcmVmY291bnQgOiA4OyAgIC8qKjwgZGVwdGggb2Ygb3Blbl9zaWduYXR1cmUoKSAqLworICB1bmlvbgorICB7CisgICAgREJ1c1R5cGVXcml0ZXIgd3JpdGVyOyAvKio8IHdyaXRlciAqLworICAgIERCdXNUeXBlUmVhZGVyIHJlYWRlcjsgLyoqPCByZWFkZXIgKi8KKyAgfSB1OyAvKio8IHRoZSB0eXBlIHdyaXRlciBvciByZWFkZXIgdGhhdCBkb2VzIGFsbCB0aGUgd29yayAqLworfTsKKworLyoqCisgKiBMYXlvdXQgb2YgYSBEQnVzTWVzc2FnZUl0ZXIgb24gdGhlIHN0YWNrIGluIGRidXMgMS4xMC4wLiBUaGlzIGlzIG5vCisgKiBsb25nZXIgdXNlZCwgYnV0IGZvciBBQkkgY29tcGF0aWJpbGl0eSB3ZSBuZWVkIHRvIGFzc2VydCB0aGF0IHRoZQorICogbmV3IGxheW91dCBpcyB0aGUgc2FtZSBzaXplLgorICovCit0eXBlZGVmIHN0cnVjdAoreworICB2b2lkICpkdW1teTE7CisgIHZvaWQgKmR1bW15MjsKKyAgZGJ1c191aW50MzJfdCBkdW1teTM7CisgIGludCBkdW1teTQ7CisgIGludCBkdW1teTU7CisgIGludCBkdW1teTY7CisgIGludCBkdW1teTc7CisgIGludCBkdW1teTg7CisgIGludCBkdW1teTk7CisgIGludCBkdW1teTEwOworICBpbnQgZHVtbXkxMTsKKyAgaW50IHBhZDE7CisgIGludCBwYWQyOworICB2b2lkICpwYWQzOworfSBEQnVzTWVzc2FnZUl0ZXJfMV8xMF8wOworCitzdGF0aWMgdm9pZAorZ2V0X2NvbnN0X3NpZ25hdHVyZSAoREJ1c0hlYWRlciAgICAgICAgKmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKip0eXBlX3N0cl9wLAorICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgKnR5cGVfcG9zX3ApCit7CisgIGlmIChfZGJ1c19oZWFkZXJfZ2V0X2ZpZWxkX3JhdyAoaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSEVBREVSX0ZJRUxEX1NJR05BVFVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlX3N0cl9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVfcG9zX3ApKQorICAgIHsKKyAgICAgICp0eXBlX3Bvc19wICs9IDE7IC8qIHNraXAgdGhlIHNpZ25hdHVyZSBsZW5ndGggd2hpY2ggaXMgMSBieXRlICovCisgICAgfQorICBlbHNlCisgICAgeworICAgICAgKnR5cGVfc3RyX3AgPSAmX2RidXNfZW1wdHlfc2lnbmF0dXJlX3N0cjsKKyAgICAgICp0eXBlX3Bvc19wID0gMDsKKyAgICB9Cit9CisKKy8qKgorICogU3dhcHMgdGhlIG1lc3NhZ2UgdG8gY29tcGlsZXIgYnl0ZSBvcmRlciBpZiByZXF1aXJlZAorICoKKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlCisgKi8KK3N0YXRpYyB2b2lkCitfZGJ1c19tZXNzYWdlX2J5dGVzd2FwIChEQnVzTWVzc2FnZSAqbWVzc2FnZSkKK3sKKyAgY29uc3QgREJ1c1N0cmluZyAqdHlwZV9zdHI7CisgIGludCB0eXBlX3BvczsKKyAgY2hhciBieXRlX29yZGVyOworCisgIGJ5dGVfb3JkZXIgPSBfZGJ1c19oZWFkZXJfZ2V0X2J5dGVfb3JkZXIgKCZtZXNzYWdlLT5oZWFkZXIpOworCisgIGlmIChieXRlX29yZGVyID09IERCVVNfQ09NUElMRVJfQllURV9PUkRFUikKKyAgICByZXR1cm47CisKKyAgX2RidXNfdmVyYm9zZSAoIlN3YXBwaW5nIG1lc3NhZ2UgaW50byBjb21waWxlciBieXRlIG9yZGVyXG4iKTsKKyAgCisgIGdldF9jb25zdF9zaWduYXR1cmUgKCZtZXNzYWdlLT5oZWFkZXIsICZ0eXBlX3N0ciwgJnR5cGVfcG9zKTsKKyAgCisgIF9kYnVzX21hcnNoYWxfYnl0ZXN3YXAgKHR5cGVfc3RyLCB0eXBlX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19DT01QSUxFUl9CWVRFX09SREVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVzc2FnZS0+Ym9keSwgMCk7CisKKyAgX2RidXNfaGVhZGVyX2J5dGVzd2FwICgmbWVzc2FnZS0+aGVhZGVyLCBEQlVTX0NPTVBJTEVSX0JZVEVfT1JERVIpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX2hlYWRlcl9nZXRfYnl0ZV9vcmRlciAoJm1lc3NhZ2UtPmhlYWRlcikgPT0KKyAgICAgICAgICAgICAgICBEQlVTX0NPTVBJTEVSX0JZVEVfT1JERVIpOworfQorCisvKiogYnl0ZS1zd2FwIHRoZSBtZXNzYWdlIGlmIGl0IGRvZXNuJ3QgbWF0Y2ggb3VyIGJ5dGUgb3JkZXIuCisgKiAgQ2FsbGVkIG9ubHkgd2hlbiB3ZSBuZWVkIHRoZSBtZXNzYWdlIGluIG91ciBvd24gYnl0ZSBvcmRlciwKKyAqICBub3JtYWxseSB3aGVuIHJlYWRpbmcgYXJyYXlzIG9mIGludGVnZXJzIG9yIGRvdWJsZXMuCisgKiAgT3RoZXJ3aXNlIHNob3VsZCBub3QgYmUgY2FsbGVkIHNpbmNlIGl0IHdvdWxkIGRvIG5lZWRsZXNzCisgKiAgd29yay4KKyAqLworI2RlZmluZSBlbnN1cmVfYnl0ZV9vcmRlcihtZXNzYWdlKSBfZGJ1c19tZXNzYWdlX2J5dGVzd2FwIChtZXNzYWdlKQorCisvKioKKyAqIEdldHMgdGhlIGRhdGEgdG8gYmUgc2VudCBvdmVyIHRoZSBuZXR3b3JrIGZvciB0aGlzIG1lc3NhZ2UuCisgKiBUaGUgaGVhZGVyIGFuZCB0aGVuIHRoZSBib2R5IHNob3VsZCBiZSB3cml0dGVuIG91dC4KKyAqIFRoaXMgZnVuY3Rpb24gaXMgZ3VhcmFudGVlZCB0byBhbHdheXMgcmV0dXJuIHRoZSBzYW1lCisgKiBkYXRhIG9uY2UgYSBtZXNzYWdlIGlzIGxvY2tlZCAod2l0aCBkYnVzX21lc3NhZ2VfbG9jaygpKS4KKyAqCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZS4KKyAqIEBwYXJhbSBoZWFkZXIgcmV0dXJuIGxvY2F0aW9uIGZvciBtZXNzYWdlIGhlYWRlciBkYXRhLgorICogQHBhcmFtIGJvZHkgcmV0dXJuIGxvY2F0aW9uIGZvciBtZXNzYWdlIGJvZHkgZGF0YS4KKyAqLwordm9pZAorX2RidXNfbWVzc2FnZV9nZXRfbmV0d29ya19kYXRhIChEQnVzTWVzc2FnZSAgICAgICAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAgICAqKmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAgICAqKmJvZHkpCit7CisgIF9kYnVzX2Fzc2VydCAobWVzc2FnZS0+bG9ja2VkKTsKKworICAqaGVhZGVyID0gJm1lc3NhZ2UtPmhlYWRlci5kYXRhOworICAqYm9keSA9ICZtZXNzYWdlLT5ib2R5OworfQorCisvKioKKyAqIEdldHMgdGhlIHVuaXggZmRzIHRvIGJlIHNlbnQgb3ZlciB0aGUgbmV0d29yayBmb3IgdGhpcyBtZXNzYWdlLgorICogVGhpcyBmdW5jdGlvbiBpcyBndWFyYW50ZWVkIHRvIGFsd2F5cyByZXR1cm4gdGhlIHNhbWUgZGF0YSBvbmNlIGEKKyAqIG1lc3NhZ2UgaXMgbG9ja2VkICh3aXRoIGRidXNfbWVzc2FnZV9sb2NrKCkpLgorICoKKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlLgorICogQHBhcmFtIGZkcyByZXR1cm4gbG9jYXRpb24gb2YgdW5peCBmZCBhcnJheQorICogQHBhcmFtIG5fZmRzIHJldHVybiBudW1iZXIgb2YgZW50cmllcyBpbiBhcnJheQorICovCit2b2lkIF9kYnVzX21lc3NhZ2VfZ2V0X3VuaXhfZmRzKERCdXNNZXNzYWdlICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgICoqZmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAgICAqbl9mZHMpCit7CisgIF9kYnVzX2Fzc2VydCAobWVzc2FnZS0+bG9ja2VkKTsKKworI2lmZGVmIEhBVkVfVU5JWF9GRF9QQVNTSU5HCisgICpmZHMgPSBtZXNzYWdlLT51bml4X2ZkczsKKyAgKm5fZmRzID0gbWVzc2FnZS0+bl91bml4X2ZkczsKKyNlbHNlCisgICpmZHMgPSBOVUxMOworICAqbl9mZHMgPSAwOworI2VuZGlmCit9CisKKy8qKgorICogU2V0cyB0aGUgc2VyaWFsIG51bWJlciBvZiBhIG1lc3NhZ2UuCisgKiBUaGlzIGNhbiBvbmx5IGJlIGRvbmUgb25jZSBvbiBhIG1lc3NhZ2UuCisgKgorICogREJ1c0Nvbm5lY3Rpb24gd2lsbCBhdXRvbWF0aWNhbGx5IHNldCB0aGUgc2VyaWFsIHRvIGFuIGFwcHJvcHJpYXRlIHZhbHVlIAorICogd2hlbiB0aGUgbWVzc2FnZSBpcyBzZW50OyB0aGlzIGZ1bmN0aW9uIGlzIG9ubHkgbmVlZGVkIHdoZW4gZW5jYXBzdWxhdGluZyAKKyAqIG1lc3NhZ2VzIGluIGFub3RoZXIgcHJvdG9jb2wsIG9yIG90aGVyd2lzZSBieXBhc3NpbmcgREJ1c0Nvbm5lY3Rpb24uCisgKgorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UKKyAqIEBwYXJhbSBzZXJpYWwgdGhlIHNlcmlhbAorICovCit2b2lkIAorZGJ1c19tZXNzYWdlX3NldF9zZXJpYWwgKERCdXNNZXNzYWdlICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgc2VyaWFsKQoreworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAobWVzc2FnZSAhPSBOVUxMKTsKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKCFtZXNzYWdlLT5sb2NrZWQpOworCisgIF9kYnVzX2hlYWRlcl9zZXRfc2VyaWFsICgmbWVzc2FnZS0+aGVhZGVyLCBzZXJpYWwpOworfQorCisvKioKKyAqIEFkZHMgYSBjb3VudGVyIHRvIGJlIGluY3JlbWVudGVkIGltbWVkaWF0ZWx5IHdpdGggdGhlIHNpemUvdW5peCBmZHMKKyAqIG9mIHRoaXMgbWVzc2FnZSwgYW5kIGRlY3JlbWVudGVkIGJ5IHRoZSBzaXplL3VuaXggZmRzIG9mIHRoaXMKKyAqIG1lc3NhZ2Ugd2hlbiB0aGlzIG1lc3NhZ2UgaWYgZmluYWxpemVkLiAgVGhlIGxpbmsgY29udGFpbnMgYQorICogY291bnRlciB3aXRoIGl0cyByZWZjb3VudCBhbHJlYWR5IGluY3JlbWVudGVkLCBidXQgdGhlIGNvdW50ZXIKKyAqIGl0c2VsZiBub3QgaW5jcmVtZW50ZWQuICBPd25lcnNoaXAgb2YgbGluayBhbmQgY291bnRlciByZWZjb3VudCBpcworICogcGFzc2VkIHRvIHRoZSBtZXNzYWdlLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCB3aXRoIGxvY2tzIGhlbGQuIEFzIGEgcmVzdWx0LCB0aGUgY291bnRlcidzCisgKiBub3RpZnkgZnVuY3Rpb24gaXMgbm90IGNhbGxlZDsgdGhlIGNhbGxlciBpcyBleHBlY3RlZCB0byBlaXRoZXIgY2FsbAorICogX2RidXNfY291bnRlcl9ub3RpZnkoKSBvbiB0aGUgY291bnRlciB3aGVuIHRoZXkgYXJlIG5vIGxvbmdlciBob2xkaW5nCisgKiBsb2Nrcywgb3IgdGFrZSB0aGUgc2FtZSBhY3Rpb24gdGhhdCB3b3VsZCBiZSB0YWtlbiBieSB0aGUgbm90aWZ5IGZ1bmN0aW9uLgorICoKKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlCisgKiBAcGFyYW0gbGluayBsaW5rIHdpdGggY291bnRlciBhcyBkYXRhCisgKi8KK3ZvaWQKK19kYnVzX21lc3NhZ2VfYWRkX2NvdW50ZXJfbGluayAoREJ1c01lc3NhZ2UgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAgICAgKmxpbmspCit7CisgIC8qIHJpZ2h0IG5vdyB3ZSBkb24ndCByZWNvbXB1dGUgdGhlIGRlbHRhIHdoZW4gbWVzc2FnZQorICAgKiBzaXplIGNoYW5nZXMsIGFuZCB0aGF0J3MgT0sgZm9yIGN1cnJlbnQgcHVycG9zZXMKKyAgICogSSB0aGluaywgYnV0IGNvdWxkIGJlIGltcG9ydGFudCB0byBjaGFuZ2UgbGF0ZXIuCisgICAqIERvIHJlY29tcHV0ZSBpdCB3aGVuZXZlciB0aGVyZSBhcmUgbm8gb3V0c3RhbmRpbmcgY291bnRlcnMsCisgICAqIHNpbmNlIGl0J3MgYmFzaWNhbGx5IGZyZWUuCisgICAqLworICBpZiAobWVzc2FnZS0+Y291bnRlcnMgPT0gTlVMTCkKKyAgICB7CisgICAgICBtZXNzYWdlLT5zaXplX2NvdW50ZXJfZGVsdGEgPQorICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJm1lc3NhZ2UtPmhlYWRlci5kYXRhKSArCisgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmbWVzc2FnZS0+Ym9keSk7CisKKyNpZmRlZiBIQVZFX1VOSVhfRkRfUEFTU0lORworICAgICAgbWVzc2FnZS0+dW5peF9mZF9jb3VudGVyX2RlbHRhID0gbWVzc2FnZS0+bl91bml4X2ZkczsKKyNlbmRpZgorCisjaWYgMAorICAgICAgX2RidXNfdmVyYm9zZSAoIm1lc3NhZ2UgaGFzIHNpemUgJWxkXG4iLAorICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS0+c2l6ZV9jb3VudGVyX2RlbHRhKTsKKyNlbmRpZgorICAgIH0KKworICBfZGJ1c19saXN0X2FwcGVuZF9saW5rICgmbWVzc2FnZS0+Y291bnRlcnMsIGxpbmspOworCisgIF9kYnVzX2NvdW50ZXJfYWRqdXN0X3NpemUgKGxpbmstPmRhdGEsIG1lc3NhZ2UtPnNpemVfY291bnRlcl9kZWx0YSk7CisKKyNpZmRlZiBIQVZFX1VOSVhfRkRfUEFTU0lORworICBfZGJ1c19jb3VudGVyX2FkanVzdF91bml4X2ZkIChsaW5rLT5kYXRhLCBtZXNzYWdlLT51bml4X2ZkX2NvdW50ZXJfZGVsdGEpOworI2VuZGlmCit9CisKKy8qKgorICogQWRkcyBhIGNvdW50ZXIgdG8gYmUgaW5jcmVtZW50ZWQgaW1tZWRpYXRlbHkgd2l0aCB0aGUgc2l6ZS91bml4IGZkcworICogb2YgdGhpcyBtZXNzYWdlLCBhbmQgZGVjcmVtZW50ZWQgYnkgdGhlIHNpemUvdW5peCBmZHMgb2YgdGhpcworICogbWVzc2FnZSB3aGVuIHRoaXMgbWVzc2FnZSBpZiBmaW5hbGl6ZWQuCisgKgorICogVGhpcyBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIHdpdGggbG9ja3MgaGVsZC4gQXMgYSByZXN1bHQsIHRoZSBjb3VudGVyJ3MKKyAqIG5vdGlmeSBmdW5jdGlvbiBpcyBub3QgY2FsbGVkOyB0aGUgY2FsbGVyIGlzIGV4cGVjdGVkIHRvIGVpdGhlciBjYWxsCisgKiBfZGJ1c19jb3VudGVyX25vdGlmeSgpIG9uIHRoZSBjb3VudGVyIHdoZW4gdGhleSBhcmUgbm8gbG9uZ2VyIGhvbGRpbmcKKyAqIGxvY2tzLCBvciB0YWtlIHRoZSBzYW1lIGFjdGlvbiB0aGF0IHdvdWxkIGJlIHRha2VuIGJ5IHRoZSBub3RpZnkgZnVuY3Rpb24uCisgKgorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UKKyAqIEBwYXJhbSBjb3VudGVyIHRoZSBjb3VudGVyCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm8gbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19tZXNzYWdlX2FkZF9jb3VudGVyIChEQnVzTWVzc2FnZSAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb3VudGVyICpjb3VudGVyKQoreworICBEQnVzTGlzdCAqbGluazsKKworICBsaW5rID0gX2RidXNfbGlzdF9hbGxvY19saW5rIChjb3VudGVyKTsKKyAgaWYgKGxpbmsgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgX2RidXNfY291bnRlcl9yZWYgKGNvdW50ZXIpOworICBfZGJ1c19tZXNzYWdlX2FkZF9jb3VudGVyX2xpbmsgKG1lc3NhZ2UsIGxpbmspOworCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIFJlbW92ZXMgYSBjb3VudGVyIHRyYWNraW5nIHRoZSBzaXplL3VuaXggZmRzIG9mIHRoaXMgbWVzc2FnZSwgYW5kCisgKiBkZWNyZW1lbnRzIHRoZSBjb3VudGVyIGJ5IHRoZSBzaXplL3VuaXggZmRzIG9mIHRoaXMgbWVzc2FnZS4KKyAqCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZQorICogQHBhcmFtIGNvdW50ZXIgdGhlIGNvdW50ZXIKKyAqLwordm9pZAorX2RidXNfbWVzc2FnZV9yZW1vdmVfY291bnRlciAoREJ1c01lc3NhZ2UgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0NvdW50ZXIgICpjb3VudGVyKQoreworICBEQnVzTGlzdCAqbGluazsKKworICBsaW5rID0gX2RidXNfbGlzdF9maW5kX2xhc3QgKCZtZXNzYWdlLT5jb3VudGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudGVyKTsKKyAgX2RidXNfYXNzZXJ0IChsaW5rICE9IE5VTEwpOworCisgIF9kYnVzX2xpc3RfcmVtb3ZlX2xpbmsgKCZtZXNzYWdlLT5jb3VudGVycywgbGluayk7CisKKyAgX2RidXNfY291bnRlcl9hZGp1c3Rfc2l6ZSAoY291bnRlciwgLSBtZXNzYWdlLT5zaXplX2NvdW50ZXJfZGVsdGEpOworCisjaWZkZWYgSEFWRV9VTklYX0ZEX1BBU1NJTkcKKyAgX2RidXNfY291bnRlcl9hZGp1c3RfdW5peF9mZCAoY291bnRlciwgLSBtZXNzYWdlLT51bml4X2ZkX2NvdW50ZXJfZGVsdGEpOworI2VuZGlmCisKKyAgX2RidXNfY291bnRlcl9ub3RpZnkgKGNvdW50ZXIpOworICBfZGJ1c19jb3VudGVyX3VucmVmIChjb3VudGVyKTsKK30KKworLyoqCisgKiBMb2NrcyBhIG1lc3NhZ2UuIEFsbG93cyBjaGVja2luZyB0aGF0IGFwcGxpY2F0aW9ucyBkb24ndCBrZWVwIGEKKyAqIHJlZmVyZW5jZSB0byBhIG1lc3NhZ2UgaW4gdGhlIG91dGdvaW5nIHF1ZXVlIGFuZCBjaGFuZ2UgaXQKKyAqIHVuZGVybmVhdGggdXMuIE1lc3NhZ2VzIGFyZSBsb2NrZWQgd2hlbiB0aGV5IGVudGVyIHRoZSBvdXRnb2luZworICogcXVldWUgKGRidXNfY29ubmVjdGlvbl9zZW5kX21lc3NhZ2UoKSksIGFuZCB0aGUgbGlicmFyeSBjb21wbGFpbnMKKyAqIGlmIHRoZSBtZXNzYWdlIGlzIG1vZGlmaWVkIHdoaWxlIGxvY2tlZC4gVGhpcyBmdW5jdGlvbiBtYXkgYWxzbyAKKyAqIGNhbGxlZCBleHRlcm5hbGx5LCBmb3IgYXBwbGljYXRpb25zIHdyYXBwaW5nIEQtQnVzIGluIGFub3RoZXIgcHJvdG9jb2wuCisgKgorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgdG8gbG9jay4KKyAqLwordm9pZAorZGJ1c19tZXNzYWdlX2xvY2sgKERCdXNNZXNzYWdlICAqbWVzc2FnZSkKK3sKKyAgaWYgKCFtZXNzYWdlLT5sb2NrZWQpCisgICAgeworICAgICAgX2RidXNfaGVhZGVyX3VwZGF0ZV9sZW5ndGhzICgmbWVzc2FnZS0+aGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJm1lc3NhZ2UtPmJvZHkpKTsKKworICAgICAgLyogbXVzdCBoYXZlIGEgc2lnbmF0dXJlIGlmIHlvdSBoYXZlIGEgYm9keSAqLworICAgICAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJm1lc3NhZ2UtPmJvZHkpID09IDAgfHwKKyAgICAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9zaWduYXR1cmUgKG1lc3NhZ2UpICE9IE5VTEwpOworCisgICAgICBtZXNzYWdlLT5sb2NrZWQgPSBUUlVFOworICAgIH0KK30KKworc3RhdGljIGRidXNfYm9vbF90CitzZXRfb3JfZGVsZXRlX3N0cmluZ19maWVsZCAoREJ1c01lc3NhZ2UgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICB0eXBlY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAqdmFsdWUpCit7CisgIGlmICh2YWx1ZSA9PSBOVUxMKQorICAgIHJldHVybiBfZGJ1c19oZWFkZXJfZGVsZXRlX2ZpZWxkICgmbWVzc2FnZS0+aGVhZGVyLCBmaWVsZCk7CisgIGVsc2UKKyAgICByZXR1cm4gX2RidXNfaGVhZGVyX3NldF9maWVsZF9iYXNpYyAoJm1lc3NhZ2UtPmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpOworfQorCisvKiBNZXNzYWdlIENhY2hlCisgKgorICogV2UgY2FjaGUgc29tZSBEQnVzTWVzc2FnZSB0byByZWR1Y2UgdGhlIG92ZXJoZWFkIG9mIGFsbG9jYXRpbmcKKyAqIHRoZW0uICBJbiBteSBwcm9maWxpbmcgdGhpcyBjb25zaXN0ZW50bHkgbWFkZSBhYm91dCBhbiA4JQorICogZGlmZmVyZW5jZS4gIEl0IGF2b2lkcyB0aGUgbWFsbG9jIGZvciB0aGUgbWVzc2FnZSwgdGhlIG1hbGxvYyBmb3IKKyAqIHRoZSBzbG90IGxpc3QsIHRoZSBtYWxsb2MgZm9yIHRoZSBoZWFkZXIgc3RyaW5nIGFuZCBib2R5IHN0cmluZywKKyAqIGFuZCB0aGUgYXNzb2NpYXRlZCBmcmVlKCkgY2FsbHMuIEl0IGRvZXMgaW50cm9kdWNlIGFub3RoZXIgZ2xvYmFsCisgKiBsb2NrIHdoaWNoIGNvdWxkIGJlIGEgcGVyZm9ybWFuY2UgaXNzdWUgaW4gY2VydGFpbiBjYXNlcy4KKyAqCisgKiBGb3IgdGhlIGVjaG8gY2xpZW50L3NlcnZlciB0aGUgcm91bmQgdHJpcCB0aW1lIGdvZXMgZnJvbSBhcm91bmQKKyAqIC4wMDAwNzcgdG8gLjAwMDA2OSB3aXRoIHRoZSBtZXNzYWdlIGNhY2hlIG9uIG15IGxhcHRvcC4gVGhlIHN5c3Byb2YKKyAqIGNoYW5nZSBpcyBhcyBmb2xsb3dzIChudW1iZXJzIGFyZSBjdW11bGF0aXZlIHBlcmNlbnRhZ2UpOgorICoKKyAqICB3aXRoIG1lc3NhZ2UgY2FjaGUgaW1wbGVtZW50ZWQgYXMgYXJyYXkgYXMgaXQgaXMgbm93ICgwLjAwMDA2OSBwZXIpOgorICogICAgbmV3X2VtcHR5X2hlYWRlciAgICAgICAgICAgMS40NgorICogICAgICBtdXRleF9sb2NrICAgICAgICAgICAgICAgMC41NiAgICAjIGkuZS4gX0RCVVNfTE9DSyhtZXNzYWdlX2NhY2hlKQorICogICAgICBtdXRleF91bmxvY2sgICAgICAgICAgICAgMC4yNQorICogICAgICBzZWxmICAgICAgICAgICAgICAgICAgICAgMC40MQorICogICAgdW5yZWYgICAgICAgICAgICAgICAgICAgICAgMi4yNAorICogICAgICBzZWxmICAgICAgICAgICAgICAgICAgICAgMC42OAorICogICAgICBsaXN0X2NsZWFyICAgICAgICAgICAgICAgMC40MworICogICAgICBtdXRleF9sb2NrICAgICAgICAgICAgICAgMC4zMyAgICAjIGkuZS4gX0RCVVNfTE9DSyhtZXNzYWdlX2NhY2hlKQorICogICAgICBtdXRleF91bmxvY2sgICAgICAgICAgICAgMC4yNQorICoKKyAqICB3aXRoIG1lc3NhZ2UgY2FjaGUgaW1wbGVtZW50ZWQgYXMgbGlzdCAoMC4wMDAwNzAgcGVyIHJvdW5kdHJpcCk6CisgKiAgICBuZXdfZW1wdHlfaGVhZGVyICAgICAgICAgICAyLjcyCisgKiAgICAgIGxpc3RfcG9wX2ZpcnN0ICAgICAgICAgICAxLjg4CisgKiAgICB1bnJlZiAgICAgICAgICAgICAgICAgICAgICAzLjMKKyAqICAgICAgbGlzdF9wcmVwZW5kICAgICAgICAgICAgIDEuNjMKKyAqCisgKiB3aXRob3V0IGNhY2hlICgwLjAwMDA3NyBwZXIgcm91bmR0cmlwKToKKyAqICAgIG5ld19lbXB0eV9oZWFkZXIgICAgICAgICAgIDYuNworICogICAgICBzdHJpbmdfaW5pdF9wcmVhbGxvY2F0ZWQgMy40MworICogICAgICAgIGRidXNfbWFsbG9jICAgICAgICAgICAgMi40MworICogICAgICBkYnVzX21hbGxvYzAgICAgICAgICAgICAgMi41OQorICoKKyAqICAgIHVucmVmICAgICAgICAgICAgICAgICAgICAgIDQuMDIKKyAqICAgICAgc3RyaW5nX2ZyZWUgICAgICAgICAgICAgIDEuODIKKyAqICAgICAgICBkYnVzX2ZyZWUgICAgICAgICAgICAgIDEuNjMKKyAqICAgICAgZGJ1c19mcmVlICAgICAgICAgICAgICAgIDAuNzEKKyAqCisgKiBJZiB5b3UgaW1wbGVtZW50IHRoZSBtZXNzYWdlX2NhY2hlIHdpdGggYSBsaXN0LCB0aGUgcHJpbWFyeSByZWFzb24KKyAqIGl0J3Mgc2xvd2VyIGlzIHRoYXQgeW91IGFkZCBhbm90aGVyIHRocmVhZCBsb2NrIChvbiB0aGUgREJ1c0xpc3QKKyAqIG1lbXBvb2wpLgorICovCisKKy8qKiBBdm9pZCBjYWNoaW5nIGh1Z2UgbWVzc2FnZXMgKi8KKyNkZWZpbmUgTUFYX01FU1NBR0VfU0laRV9UT19DQUNIRSAxMCAqIF9EQlVTX09ORV9LSUxPQllURQorCisvKiogQXZvaWQgY2FjaGluZyB0b28gbWFueSBtZXNzYWdlcyAqLworI2RlZmluZSBNQVhfTUVTU0FHRV9DQUNIRV9TSVpFICAgIDUKKworLyogUHJvdGVjdGVkIGJ5IF9EQlVTX0xPQ0sgKG1lc3NhZ2VfY2FjaGUpICovCitzdGF0aWMgREJ1c01lc3NhZ2UgKm1lc3NhZ2VfY2FjaGVbTUFYX01FU1NBR0VfQ0FDSEVfU0laRV07CitzdGF0aWMgaW50IG1lc3NhZ2VfY2FjaGVfY291bnQgPSAwOworc3RhdGljIGRidXNfYm9vbF90IG1lc3NhZ2VfY2FjaGVfc2h1dGRvd25fcmVnaXN0ZXJlZCA9IEZBTFNFOworCitzdGF0aWMgdm9pZAorZGJ1c19tZXNzYWdlX2NhY2hlX3NodXRkb3duICh2b2lkICpkYXRhKQoreworICBpbnQgaTsKKworICBpZiAoIV9EQlVTX0xPQ0sgKG1lc3NhZ2VfY2FjaGUpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIndlIHdvdWxkIGhhdmUgaW5pdGlhbGl6ZWQgZ2xvYmFsIGxvY2tzICIKKyAgICAgICAgImJlZm9yZSByZWdpc3RlcmluZyBhIHNodXRkb3duIGZ1bmN0aW9uIik7CisKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgTUFYX01FU1NBR0VfQ0FDSEVfU0laRSkKKyAgICB7CisgICAgICBpZiAobWVzc2FnZV9jYWNoZVtpXSkKKyAgICAgICAgZGJ1c19tZXNzYWdlX2ZpbmFsaXplIChtZXNzYWdlX2NhY2hlW2ldKTsKKworICAgICAgKytpOworICAgIH0KKworICBtZXNzYWdlX2NhY2hlX2NvdW50ID0gMDsKKyAgbWVzc2FnZV9jYWNoZV9zaHV0ZG93bl9yZWdpc3RlcmVkID0gRkFMU0U7CisKKyAgX0RCVVNfVU5MT0NLIChtZXNzYWdlX2NhY2hlKTsKK30KKworLyoqCisgKiBUcmllcyB0byBnZXQgYSBtZXNzYWdlIGZyb20gdGhlIG1lc3NhZ2UgY2FjaGUuICBUaGUgcmV0cmlldmVkCisgKiBtZXNzYWdlIHdpbGwgaGF2ZSBqdW5rIGluIGl0LCBzbyBpdCBzdGlsbCBuZWVkcyB0byBiZSBjbGVhcmVkIG91dAorICogaW4gZGJ1c19tZXNzYWdlX25ld19lbXB0eV9oZWFkZXIoKQorICoKKyAqIEByZXR1cm5zIHRoZSBtZXNzYWdlLCBvciAjTlVMTCBpZiBub25lIGNhY2hlZAorICovCitzdGF0aWMgREJ1c01lc3NhZ2UqCitkYnVzX21lc3NhZ2VfZ2V0X2NhY2hlZCAodm9pZCkKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisgIGludCBpOworCisgIG1lc3NhZ2UgPSBOVUxMOworCisgIGlmICghX0RCVVNfTE9DSyAobWVzc2FnZV9jYWNoZSkpCisgICAgeworICAgICAgLyogd2UnZCBoYXZlIGluaXRpYWxpemVkIGdsb2JhbCBsb2NrcyBiZWZvcmUgY2FjaGluZyBhbnl0aGluZywKKyAgICAgICAqIHNvIHRoZXJlIGNhbid0IGJlIGFueXRoaW5nIGluIHRoZSBjYWNoZSAqLworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIF9kYnVzX2Fzc2VydCAobWVzc2FnZV9jYWNoZV9jb3VudCA+PSAwKTsKKworICBpZiAobWVzc2FnZV9jYWNoZV9jb3VudCA9PSAwKQorICAgIHsKKyAgICAgIF9EQlVTX1VOTE9DSyAobWVzc2FnZV9jYWNoZSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgLyogVGhpcyBpcyBub3QgbmVjZXNzYXJpbHkgdHJ1ZSB1bmxlc3MgY291bnQgPiAwLCBhbmQKKyAgICogbWVzc2FnZV9jYWNoZSBpcyB1bmluaXRpYWxpemVkIHVudGlsIHRoZSBzaHV0ZG93biBpcworICAgKiByZWdpc3RlcmVkCisgICAqLworICBfZGJ1c19hc3NlcnQgKG1lc3NhZ2VfY2FjaGVfc2h1dGRvd25fcmVnaXN0ZXJlZCk7CisKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgTUFYX01FU1NBR0VfQ0FDSEVfU0laRSkKKyAgICB7CisgICAgICBpZiAobWVzc2FnZV9jYWNoZVtpXSkKKyAgICAgICAgeworICAgICAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlX2NhY2hlW2ldOworICAgICAgICAgIG1lc3NhZ2VfY2FjaGVbaV0gPSBOVUxMOworICAgICAgICAgIG1lc3NhZ2VfY2FjaGVfY291bnQgLT0gMTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgKytpOworICAgIH0KKyAgX2RidXNfYXNzZXJ0IChtZXNzYWdlX2NhY2hlX2NvdW50ID49IDApOworICBfZGJ1c19hc3NlcnQgKGkgPCBNQVhfTUVTU0FHRV9DQUNIRV9TSVpFKTsKKyAgX2RidXNfYXNzZXJ0IChtZXNzYWdlICE9IE5VTEwpOworCisgIF9kYnVzX2Fzc2VydCAoX2RidXNfYXRvbWljX2dldCAoJm1lc3NhZ2UtPnJlZmNvdW50KSA9PSAwKTsKKworICBfZGJ1c19hc3NlcnQgKG1lc3NhZ2UtPmNvdW50ZXJzID09IE5VTEwpOworICAKKyAgX0RCVVNfVU5MT0NLIChtZXNzYWdlX2NhY2hlKTsKKworICByZXR1cm4gbWVzc2FnZTsKK30KKworI2lmZGVmIEhBVkVfVU5JWF9GRF9QQVNTSU5HCitzdGF0aWMgdm9pZAorY2xvc2VfdW5peF9mZHMoaW50ICpmZHMsIHVuc2lnbmVkICpuX2ZkcykKK3sKKyAgREJ1c0Vycm9yIGU7CisgIHVuc2lnbmVkIGludCBpOworCisgIGlmICgqbl9mZHMgPD0gMCkKKyAgICByZXR1cm47CisKKyAgZGJ1c19lcnJvcl9pbml0KCZlKTsKKworICBmb3IgKGkgPSAwOyBpIDwgKm5fZmRzOyBpKyspCisgICAgeworICAgICAgaWYgKCFfZGJ1c19jbG9zZShmZHNbaV0sICZlKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4oIkZhaWxlZCB0byBjbG9zZSBmaWxlIGRlc2NyaXB0b3I6ICVzIiwgZS5tZXNzYWdlKTsKKyAgICAgICAgICBkYnVzX2Vycm9yX2ZyZWUoJmUpOworICAgICAgICB9CisgICAgfQorCisgICpuX2ZkcyA9IDA7CisKKyAgLyogV2UgZG9uJ3QgZnJlZSB0aGUgYXJyYXkgaGVyZSwgaW4gY2FzZSB3ZSBjYW4gcmVjeWNsZSBpdCBsYXRlciAqLworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkCitmcmVlX2NvdW50ZXIgKHZvaWQgKmVsZW1lbnQsCisgICAgICAgICAgICAgIHZvaWQgKmRhdGEpCit7CisgIERCdXNDb3VudGVyICpjb3VudGVyID0gZWxlbWVudDsKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2UgPSBkYXRhOworCisgIF9kYnVzX2NvdW50ZXJfYWRqdXN0X3NpemUgKGNvdW50ZXIsIC0gbWVzc2FnZS0+c2l6ZV9jb3VudGVyX2RlbHRhKTsKKyNpZmRlZiBIQVZFX1VOSVhfRkRfUEFTU0lORworICBfZGJ1c19jb3VudGVyX2FkanVzdF91bml4X2ZkIChjb3VudGVyLCAtIG1lc3NhZ2UtPnVuaXhfZmRfY291bnRlcl9kZWx0YSk7CisjZW5kaWYKKworICBfZGJ1c19jb3VudGVyX25vdGlmeSAoY291bnRlcik7CisgIF9kYnVzX2NvdW50ZXJfdW5yZWYgKGNvdW50ZXIpOworfQorCisvKioKKyAqIFRyaWVzIHRvIGNhY2hlIGEgbWVzc2FnZSwgb3RoZXJ3aXNlIGZpbmFsaXplIGl0LgorICoKKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlCisgKi8KK3N0YXRpYyB2b2lkCitkYnVzX21lc3NhZ2VfY2FjaGVfb3JfZmluYWxpemUgKERCdXNNZXNzYWdlICptZXNzYWdlKQoreworICBkYnVzX2Jvb2xfdCB3YXNfY2FjaGVkOworICBpbnQgaTsKKworICBfZGJ1c19hc3NlcnQgKF9kYnVzX2F0b21pY19nZXQgKCZtZXNzYWdlLT5yZWZjb3VudCkgPT0gMCk7CisKKyAgLyogVGhpcyBjYWxscyBhcHBsaWNhdGlvbiBjb2RlIGFuZCBoYXMgdG8gYmUgZG9uZSBmaXJzdCB0aGluZworICAgKiB3aXRob3V0IGhvbGRpbmcgdGhlIGxvY2sKKyAgICovCisgIF9kYnVzX2RhdGFfc2xvdF9saXN0X2NsZWFyICgmbWVzc2FnZS0+c2xvdF9saXN0KTsKKworICBfZGJ1c19saXN0X2ZvcmVhY2ggKCZtZXNzYWdlLT5jb3VudGVycywKKyAgICAgICAgICAgICAgICAgICAgICBmcmVlX2NvdW50ZXIsIG1lc3NhZ2UpOworICBfZGJ1c19saXN0X2NsZWFyICgmbWVzc2FnZS0+Y291bnRlcnMpOworCisjaWZkZWYgSEFWRV9VTklYX0ZEX1BBU1NJTkcKKyAgY2xvc2VfdW5peF9mZHMobWVzc2FnZS0+dW5peF9mZHMsICZtZXNzYWdlLT5uX3VuaXhfZmRzKTsKKyNlbmRpZgorCisgIHdhc19jYWNoZWQgPSBGQUxTRTsKKworICBpZiAoIV9EQlVTX0xPQ0sgKG1lc3NhZ2VfY2FjaGUpKQorICAgIHsKKyAgICAgIC8qIFRoZSBvbmx5IHdheSB0byBnZXQgYSBub24tbnVsbCBtZXNzYWdlIGdvZXMgdGhyb3VnaAorICAgICAgICogZGJ1c19tZXNzYWdlX2dldF9jYWNoZWQoKSB3aGljaCB0YWtlcyB0aGUgbG9jay4gKi8KKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIndlIHdvdWxkIGhhdmUgaW5pdGlhbGl6ZWQgZ2xvYmFsIGxvY2tzICIKKyAgICAgICAgICAidGhlIGZpcnN0IHRpbWUgd2UgY29uc3RydWN0ZWQgYSBtZXNzYWdlIik7CisgICAgfQorCisgIGlmICghbWVzc2FnZV9jYWNoZV9zaHV0ZG93bl9yZWdpc3RlcmVkKQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydCAobWVzc2FnZV9jYWNoZV9jb3VudCA9PSAwKTsKKworICAgICAgaWYgKCFfZGJ1c19yZWdpc3Rlcl9zaHV0ZG93bl9mdW5jIChkYnVzX21lc3NhZ2VfY2FjaGVfc2h1dGRvd24sIE5VTEwpKQorICAgICAgICBnb3RvIG91dDsKKworICAgICAgaSA9IDA7CisgICAgICB3aGlsZSAoaSA8IE1BWF9NRVNTQUdFX0NBQ0hFX1NJWkUpCisgICAgICAgIHsKKyAgICAgICAgICBtZXNzYWdlX2NhY2hlW2ldID0gTlVMTDsKKyAgICAgICAgICArK2k7CisgICAgICAgIH0KKworICAgICAgbWVzc2FnZV9jYWNoZV9zaHV0ZG93bl9yZWdpc3RlcmVkID0gVFJVRTsKKyAgICB9CisKKyAgX2RidXNfYXNzZXJ0IChtZXNzYWdlX2NhY2hlX2NvdW50ID49IDApOworCisgIGlmICghX2RidXNfZW5hYmxlX21lc3NhZ2VfY2FjaGUgKCkpCisgICAgZ290byBvdXQ7CisKKyAgaWYgKChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJm1lc3NhZ2UtPmhlYWRlci5kYXRhKSArCisgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZtZXNzYWdlLT5ib2R5KSkgPgorICAgICAgTUFYX01FU1NBR0VfU0laRV9UT19DQUNIRSkKKyAgICBnb3RvIG91dDsKKworICBpZiAobWVzc2FnZV9jYWNoZV9jb3VudCA+PSBNQVhfTUVTU0FHRV9DQUNIRV9TSVpFKQorICAgIGdvdG8gb3V0OworCisgIC8qIEZpbmQgZW1wdHkgc2xvdCAqLworICBpID0gMDsKKyAgd2hpbGUgKG1lc3NhZ2VfY2FjaGVbaV0gIT0gTlVMTCkKKyAgICArK2k7CisKKyAgX2RidXNfYXNzZXJ0IChpIDwgTUFYX01FU1NBR0VfQ0FDSEVfU0laRSk7CisKKyAgX2RidXNfYXNzZXJ0IChtZXNzYWdlX2NhY2hlW2ldID09IE5VTEwpOworICBtZXNzYWdlX2NhY2hlW2ldID0gbWVzc2FnZTsKKyAgbWVzc2FnZV9jYWNoZV9jb3VudCArPSAxOworICB3YXNfY2FjaGVkID0gVFJVRTsKKyNpZm5kZWYgREJVU19ESVNBQkxFX0NIRUNLUworICBtZXNzYWdlLT5pbl9jYWNoZSA9IFRSVUU7CisjZW5kaWYKKworIG91dDoKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19hdG9taWNfZ2V0ICgmbWVzc2FnZS0+cmVmY291bnQpID09IDApOworCisgIF9EQlVTX1VOTE9DSyAobWVzc2FnZV9jYWNoZSk7CisgIAorICBpZiAoIXdhc19jYWNoZWQpCisgICAgZGJ1c19tZXNzYWdlX2ZpbmFsaXplIChtZXNzYWdlKTsKK30KKworLyoKKyAqIEFycmFuZ2UgZm9yIGl0ZXIgdG8gYmUgc29tZXRoaW5nIHRoYXQgX2RidXNfbWVzc2FnZV9pdGVyX2NoZWNrKCkgd291bGQKKyAqIHJlamVjdCBhcyBub3QgYSB2YWxpZCBpdGVyYXRvci4KKyAqLworc3RhdGljIHZvaWQKK19kYnVzX21lc3NhZ2VfcmVhbF9pdGVyX3plcm8gKERCdXNNZXNzYWdlUmVhbEl0ZXIgKml0ZXIpCit7CisgIF9kYnVzX2Fzc2VydCAoaXRlciAhPSBOVUxMKTsKKyAgX0RCVVNfWkVSTyAoKml0ZXIpOworICAvKiBOVUxMIGlzIG5vdCwgc3RyaWN0bHkgc3BlYWtpbmcsIGd1YXJhbnRlZWQgdG8gYmUgYWxsLWJpdHMtemVybyAqLworICBpdGVyLT5tZXNzYWdlID0gTlVMTDsKK30KKworLyoqCisgKiBJbml0aWFsaXplIGl0ZXIgYXMgaWYgd2l0aCAjREJVU19NRVNTQUdFX0lURVJfSU5JVF9DTE9TRUQuIFRoZSBvbmx5IHZhbGlkCisgKiBvcGVyYXRpb24gZm9yIHN1Y2ggYW4gaXRlcmF0b3IgaXMKKyAqIGRidXNfbWVzc2FnZV9pdGVyX2FiYW5kb25fY29udGFpbmVyX2lmX29wZW4oKSwgd2hpY2ggZG9lcyBub3RoaW5nLgorICovCit2b2lkCitkYnVzX21lc3NhZ2VfaXRlcl9pbml0X2Nsb3NlZCAoREJ1c01lc3NhZ2VJdGVyICppdGVyKQoreworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAoaXRlciAhPSBOVUxMKTsKKyAgX2RidXNfbWVzc2FnZV9yZWFsX2l0ZXJfemVybyAoKERCdXNNZXNzYWdlUmVhbEl0ZXIgKikgaXRlcik7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorX2RidXNfbWVzc2FnZV9yZWFsX2l0ZXJfaXNfemVyb2VkIChEQnVzTWVzc2FnZVJlYWxJdGVyICppdGVyKQoreworICByZXR1cm4gKGl0ZXIgIT0gTlVMTCAmJiBpdGVyLT5tZXNzYWdlID09IE5VTEwgJiYgaXRlci0+Y2hhbmdlZF9zdGFtcCA9PSAwICYmCisgICAgICAgICAgaXRlci0+aXRlcl90eXBlID09IDAgJiYgaXRlci0+c2lnX3JlZmNvdW50ID09IDApOworfQorCisjaWYgZGVmaW5lZChEQlVTX0VOQUJMRV9DSEVDS1MpIHx8IGRlZmluZWQoREJVU19FTkFCTEVfQVNTRVJUKQorc3RhdGljIGRidXNfYm9vbF90CitfZGJ1c19tZXNzYWdlX2l0ZXJfY2hlY2sgKERCdXNNZXNzYWdlUmVhbEl0ZXIgKml0ZXIpCit7CisgIGNoYXIgYnl0ZV9vcmRlcjsKKworICBpZiAoaXRlciA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm5fY2hlY2tfZmFpbGVkICgiZGJ1cyBtZXNzYWdlIGl0ZXJhdG9yIGlzIE5VTEwiKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKGl0ZXItPm1lc3NhZ2UgPT0gTlVMTCB8fCBpdGVyLT5pdGVyX3R5cGUgPT0gMCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuX2NoZWNrX2ZhaWxlZCAoImRidXMgbWVzc2FnZSBpdGVyYXRvciBoYXMgYWxyZWFkeSBiZWVuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2xvc2VkLCBvciBpcyB1bmluaXRpYWxpemVkIG9yIGNvcnJ1cHQiKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgYnl0ZV9vcmRlciA9IF9kYnVzX2hlYWRlcl9nZXRfYnl0ZV9vcmRlciAoJml0ZXItPm1lc3NhZ2UtPmhlYWRlcik7CisKKyAgaWYgKGl0ZXItPml0ZXJfdHlwZSA9PSBEQlVTX01FU1NBR0VfSVRFUl9UWVBFX1JFQURFUikKKyAgICB7CisgICAgICBpZiAoaXRlci0+dS5yZWFkZXIuYnl0ZV9vcmRlciAhPSBieXRlX29yZGVyKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2Fybl9jaGVja19mYWlsZWQgKCJkYnVzIG1lc3NhZ2UgY2hhbmdlZCBieXRlIG9yZGVyIHNpbmNlIGl0ZXJhdG9yIHdhcyBjcmVhdGVkIik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAvKiBiZWNhdXNlIHdlIHN3YXAgdGhlIG1lc3NhZ2UgaW50byBjb21waWxlciBvcmRlciB3aGVuIHlvdSBpbml0IGFuIGl0ZXIgKi8KKyAgICAgIF9kYnVzX2Fzc2VydCAoaXRlci0+dS5yZWFkZXIuYnl0ZV9vcmRlciA9PSBEQlVTX0NPTVBJTEVSX0JZVEVfT1JERVIpOworICAgIH0KKyAgZWxzZSBpZiAoaXRlci0+aXRlcl90eXBlID09IERCVVNfTUVTU0FHRV9JVEVSX1RZUEVfV1JJVEVSKQorICAgIHsKKyAgICAgIGlmIChpdGVyLT51LndyaXRlci5ieXRlX29yZGVyICE9IGJ5dGVfb3JkZXIpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuX2NoZWNrX2ZhaWxlZCAoImRidXMgbWVzc2FnZSBjaGFuZ2VkIGJ5dGUgb3JkZXIgc2luY2UgYXBwZW5kIGl0ZXJhdG9yIHdhcyBjcmVhdGVkIik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAvKiBiZWNhdXNlIHdlIHN3YXAgdGhlIG1lc3NhZ2UgaW50byBjb21waWxlciBvcmRlciB3aGVuIHlvdSBpbml0IGFuIGl0ZXIgKi8KKyAgICAgIF9kYnVzX2Fzc2VydCAoaXRlci0+dS53cml0ZXIuYnl0ZV9vcmRlciA9PSBEQlVTX0NPTVBJTEVSX0JZVEVfT1JERVIpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm5fY2hlY2tfZmFpbGVkICgiZGJ1cyBtZXNzYWdlIGl0ZXJhdG9yIGxvb2tzIHVuaW5pdGlhbGl6ZWQgb3IgY29ycnVwdGVkIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmIChpdGVyLT5jaGFuZ2VkX3N0YW1wICE9IGl0ZXItPm1lc3NhZ2UtPmNoYW5nZWRfc3RhbXApCisgICAgeworICAgICAgX2RidXNfd2Fybl9jaGVja19mYWlsZWQgKCJkYnVzIG1lc3NhZ2UgaXRlcmF0b3IgaW52YWxpZCBiZWNhdXNlIHRoZSBtZXNzYWdlIGhhcyBiZWVuIG1vZGlmaWVkIChvciBwZXJoYXBzIHRoZSBpdGVyYXRvciBpcyBqdXN0IHVuaW5pdGlhbGl6ZWQpIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorI2VuZGlmIC8qIERCVVNfRU5BQkxFX0NIRUNLUyB8fCBEQlVTX0VOQUJMRV9BU1NFUlQgKi8KKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgdmFyYXJncyBhcmctZ2V0dGluZyBmdW5jdGlvbnMuCisgKiBkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MoKSBpcyB0aGUgcGxhY2UgdG8gZ28gZm9yIGNvbXBsZXRlCisgKiBkb2N1bWVudGF0aW9uLgorICoKKyAqIEBzZWUgZGJ1c19tZXNzYWdlX2dldF9hcmdzCisgKiBAcGFyYW0gaXRlciB0aGUgbWVzc2FnZSBpdGVyCisgKiBAcGFyYW0gZXJyb3IgZXJyb3IgdG8gYmUgZmlsbGVkIGluCisgKiBAcGFyYW0gZmlyc3RfYXJnX3R5cGUgdHlwZSBvZiB0aGUgZmlyc3QgYXJndW1lbnQKKyAqIEBwYXJhbSB2YXJfYXJncyByZXR1cm4gbG9jYXRpb24gZm9yIGZpcnN0IGFyZ3VtZW50LCBmb2xsb3dlZCBieSBsaXN0IG9mIHR5cGUvbG9jYXRpb24gcGFpcnMKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBlcnJvciB3YXMgc2V0CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2FyZ3NfdmFsaXN0IChEQnVzTWVzc2FnZUl0ZXIgKml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgKmVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICBmaXJzdF9hcmdfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhX2xpc3QgICAgICAgICAgdmFyX2FyZ3MpCit7CisgIERCdXNNZXNzYWdlUmVhbEl0ZXIgKnJlYWwgPSAoREJ1c01lc3NhZ2VSZWFsSXRlciAqKWl0ZXI7CisgIGludCBzcGVjX3R5cGUsIG1zZ190eXBlLCBpLCBqOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIHZhX2xpc3QgY29weV9hcmdzOworCisgIF9kYnVzX2Fzc2VydCAoX2RidXNfbWVzc2FnZV9pdGVyX2NoZWNrIChyZWFsKSk7CisKKyAgcmV0dmFsID0gRkFMU0U7CisKKyAgc3BlY190eXBlID0gZmlyc3RfYXJnX3R5cGU7CisgIGkgPSAwOworCisgIC8qIGNvcHkgdmFyX2FyZ3MgZmlyc3QsIHRoZW4gd2UgY2FuIGRvIGFub3RoZXIgaXRlcmF0aW9uIG92ZXIgaXQgdG8KKyAgICogZnJlZSBtZW1vcnkgYW5kIGNsb3NlIHVuaXggZmRzIGlmIHBhcnNlIGZhaWxlZCBhdCBzb21lIHBvaW50LgorICAgKi8KKyAgREJVU19WQV9DT1BZIChjb3B5X2FyZ3MsIHZhcl9hcmdzKTsKKworICB3aGlsZSAoc3BlY190eXBlICE9IERCVVNfVFlQRV9JTlZBTElEKQorICAgIHsKKyAgICAgIG1zZ190eXBlID0gZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2FyZ190eXBlIChpdGVyKTsKKworICAgICAgaWYgKG1zZ190eXBlICE9IHNwZWNfdHlwZSkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9JTlZBTElEX0FSR1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJBcmd1bWVudCAlZCBpcyBzcGVjaWZpZWQgdG8gYmUgb2YgdHlwZSBcIiVzXCIsIGJ1dCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJpcyBhY3R1YWxseSBvZiB0eXBlIFwiJXNcIlxuIiwgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfdHlwZV90b19zdHJpbmcgKHNwZWNfdHlwZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3R5cGVfdG9fc3RyaW5nIChtc2dfdHlwZSkpOworCisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgICAgaWYgKHNwZWNfdHlwZSA9PSBEQlVTX1RZUEVfVU5JWF9GRCkKKyAgICAgICAgeworI2lmZGVmIEhBVkVfVU5JWF9GRF9QQVNTSU5HCisgICAgICAgICAgREJ1c0Jhc2ljVmFsdWUgaWR4OworICAgICAgICAgIGludCAqcGZkLCBuZmQ7CisKKyAgICAgICAgICBwZmQgPSB2YV9hcmcgKHZhcl9hcmdzLCBpbnQqKTsKKyAgICAgICAgICBfZGJ1c19hc3NlcnQocGZkKTsKKworICAgICAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX3JlYWRfYmFzaWMoJnJlYWwtPnUucmVhZGVyLCAmaWR4KTsKKworICAgICAgICAgIGlmIChpZHgudTMyID49IHJlYWwtPm1lc3NhZ2UtPm5fdW5peF9mZHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9JTkNPTlNJU1RFTlRfTUVTU0FHRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNZXNzYWdlIHJlZmVycyB0byBmaWxlIGRlc2NyaXB0b3IgYXQgaW5kZXggJWksIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ1dCBoYXMgb25seSAlaSBkZXNjcmlwdG9ycyBhdHRhY2hlZC5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZHgudTMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhbC0+bWVzc2FnZS0+bl91bml4X2Zkcyk7CisgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKChuZmQgPSBfZGJ1c19kdXAocmVhbC0+bWVzc2FnZS0+dW5peF9mZHNbaWR4LnUzMl0sIGVycm9yKSkgPCAwKQorICAgICAgICAgICAgZ290byBvdXQ7CisKKyAgICAgICAgICAqcGZkID0gbmZkOworI2Vsc2UKKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9UX1NVUFBPUlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlBsYXRmb3JtIGRvZXMgbm90IHN1cHBvcnQgZmlsZSBkZXNjaXB0b3IgcGFzc2luZy5cbiIpOworICAgICAgICAgIGdvdG8gb3V0OworI2VuZGlmCisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKGRidXNfdHlwZV9pc19iYXNpYyAoc3BlY190eXBlKSkKKyAgICAgICAgeworICAgICAgICAgIERCdXNCYXNpY1ZhbHVlICpwdHI7CisKKyAgICAgICAgICBwdHIgPSB2YV9hcmcgKHZhcl9hcmdzLCBEQnVzQmFzaWNWYWx1ZSopOworCisgICAgICAgICAgX2RidXNfYXNzZXJ0IChwdHIgIT0gTlVMTCk7CisKKyAgICAgICAgICBfZGJ1c190eXBlX3JlYWRlcl9yZWFkX2Jhc2ljICgmcmVhbC0+dS5yZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyKTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoc3BlY190eXBlID09IERCVVNfVFlQRV9BUlJBWSkKKyAgICAgICAgeworICAgICAgICAgIGludCBlbGVtZW50X3R5cGU7CisgICAgICAgICAgaW50IHNwZWNfZWxlbWVudF90eXBlOworICAgICAgICAgIGNvbnN0IERCdXNCYXNpY1ZhbHVlICoqcHRyOworICAgICAgICAgIGludCAqbl9lbGVtZW50c19wOworICAgICAgICAgIERCdXNUeXBlUmVhZGVyIGFycmF5OworCisgICAgICAgICAgc3BlY19lbGVtZW50X3R5cGUgPSB2YV9hcmcgKHZhcl9hcmdzLCBpbnQpOworICAgICAgICAgIGVsZW1lbnRfdHlwZSA9IF9kYnVzX3R5cGVfcmVhZGVyX2dldF9lbGVtZW50X3R5cGUgKCZyZWFsLT51LnJlYWRlcik7CisKKyAgICAgICAgICBpZiAoc3BlY19lbGVtZW50X3R5cGUgIT0gZWxlbWVudF90eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfSU5WQUxJRF9BUkdTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFyZ3VtZW50ICVkIGlzIHNwZWNpZmllZCB0byBiZSBhbiBhcnJheSBvZiBcIiVzXCIsIGJ1dCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaXMgYWN0dWFsbHkgYW4gYXJyYXkgb2YgXCIlc1wiXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3R5cGVfdG9fc3RyaW5nIChzcGVjX2VsZW1lbnRfdHlwZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c190eXBlX3RvX3N0cmluZyAoZWxlbWVudF90eXBlKSk7CisKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoZGJ1c190eXBlX2lzX2ZpeGVkIChzcGVjX2VsZW1lbnRfdHlwZSkgJiYKKyAgICAgICAgICAgICAgZWxlbWVudF90eXBlICE9IERCVVNfVFlQRV9VTklYX0ZEKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBwdHIgPSB2YV9hcmcgKHZhcl9hcmdzLCBjb25zdCBEQnVzQmFzaWNWYWx1ZSoqKTsKKyAgICAgICAgICAgICAgbl9lbGVtZW50c19wID0gdmFfYXJnICh2YXJfYXJncywgaW50Kik7CisKKyAgICAgICAgICAgICAgX2RidXNfYXNzZXJ0IChwdHIgIT0gTlVMTCk7CisgICAgICAgICAgICAgIF9kYnVzX2Fzc2VydCAobl9lbGVtZW50c19wICE9IE5VTEwpOworCisgICAgICAgICAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX3JlY3Vyc2UgKCZyZWFsLT51LnJlYWRlciwgJmFycmF5KTsKKworICAgICAgICAgICAgICBfZGJ1c190eXBlX3JlYWRlcl9yZWFkX2ZpeGVkX211bHRpICgmYXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopIHB0ciwgbl9lbGVtZW50c19wKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIGlmIChfREJVU19UWVBFX0lTX1NUUklOR0xJS0UgKHNwZWNfZWxlbWVudF90eXBlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgY2hhciAqKipzdHJfYXJyYXlfcDsKKyAgICAgICAgICAgICAgaW50IG5fZWxlbWVudHM7CisgICAgICAgICAgICAgIGNoYXIgKipzdHJfYXJyYXk7CisKKyAgICAgICAgICAgICAgc3RyX2FycmF5X3AgPSB2YV9hcmcgKHZhcl9hcmdzLCBjaGFyKioqKTsKKyAgICAgICAgICAgICAgbl9lbGVtZW50c19wID0gdmFfYXJnICh2YXJfYXJncywgaW50Kik7CisKKyAgICAgICAgICAgICAgX2RidXNfYXNzZXJ0IChzdHJfYXJyYXlfcCAhPSBOVUxMKTsKKyAgICAgICAgICAgICAgX2RidXNfYXNzZXJ0IChuX2VsZW1lbnRzX3AgIT0gTlVMTCk7CisKKyAgICAgICAgICAgICAgLyogQ291bnQgZWxlbWVudHMgaW4gdGhlIGFycmF5ICovCisgICAgICAgICAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX3JlY3Vyc2UgKCZyZWFsLT51LnJlYWRlciwgJmFycmF5KTsKKworICAgICAgICAgICAgICBuX2VsZW1lbnRzID0gMDsKKyAgICAgICAgICAgICAgd2hpbGUgKF9kYnVzX3R5cGVfcmVhZGVyX2dldF9jdXJyZW50X3R5cGUgKCZhcnJheSkgIT0gREJVU19UWVBFX0lOVkFMSUQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgKytuX2VsZW1lbnRzOworICAgICAgICAgICAgICAgICAgX2RidXNfdHlwZV9yZWFkZXJfbmV4dCAoJmFycmF5KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgc3RyX2FycmF5ID0gZGJ1c19uZXcwIChjaGFyKiwgbl9lbGVtZW50cyArIDEpOworICAgICAgICAgICAgICBpZiAoc3RyX2FycmF5ID09IE5VTEwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIC8qIE5vdyBnbyB0aHJvdWdoIGFuZCBkdXAgZWFjaCBzdHJpbmcgKi8KKyAgICAgICAgICAgICAgX2RidXNfdHlwZV9yZWFkZXJfcmVjdXJzZSAoJnJlYWwtPnUucmVhZGVyLCAmYXJyYXkpOworCisgICAgICAgICAgICAgIGogPSAwOworICAgICAgICAgICAgICB3aGlsZSAoaiA8IG5fZWxlbWVudHMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqczsKKyAgICAgICAgICAgICAgICAgIF9kYnVzX3R5cGVfcmVhZGVyX3JlYWRfYmFzaWMgKCZhcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopICZzKTsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgc3RyX2FycmF5W2pdID0gX2RidXNfc3RyZHVwIChzKTsKKyAgICAgICAgICAgICAgICAgIGlmIChzdHJfYXJyYXlbal0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgIGRidXNfZnJlZV9zdHJpbmdfYXJyYXkgKHN0cl9hcnJheSk7CisgICAgICAgICAgICAgICAgICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICsrajsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgaWYgKCFfZGJ1c190eXBlX3JlYWRlcl9uZXh0ICgmYXJyYXkpKQorICAgICAgICAgICAgICAgICAgICBfZGJ1c19hc3NlcnQgKGogPT0gbl9lbGVtZW50cyk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIF9kYnVzX2Fzc2VydCAoX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2N1cnJlbnRfdHlwZSAoJmFycmF5KSA9PSBEQlVTX1RZUEVfSU5WQUxJRCk7CisgICAgICAgICAgICAgIF9kYnVzX2Fzc2VydCAoaiA9PSBuX2VsZW1lbnRzKTsKKyAgICAgICAgICAgICAgX2RidXNfYXNzZXJ0IChzdHJfYXJyYXlbal0gPT0gTlVMTCk7CisKKyAgICAgICAgICAgICAgKnN0cl9hcnJheV9wID0gc3RyX2FycmF5OworICAgICAgICAgICAgICAqbl9lbGVtZW50c19wID0gbl9lbGVtZW50czsKKyAgICAgICAgICAgIH0KKyNpZm5kZWYgREJVU19ESVNBQkxFX0NIRUNLUworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfd2FybiAoInlvdSBjYW4ndCByZWFkIGFycmF5cyBvZiBjb250YWluZXIgdHlwZXMgKHN0cnVjdCwgdmFyaWFudCwgYXJyYXkpIHdpdGggJXMgZm9yIG5vdyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9EQlVTX0ZVTkNUSU9OX05BTUUpOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICB9CisjaWZuZGVmIERCVVNfRElTQUJMRV9DSEVDS1MKKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJ5b3UgY2FuIG9ubHkgcmVhZCBhcnJheXMgYW5kIGJhc2ljIHR5cGVzIHdpdGggJXMgZm9yIG5vdyIsCisgICAgICAgICAgICAgICAgICAgICAgX0RCVVNfRlVOQ1RJT05fTkFNRSk7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAvKiBob3cgbWFueSBhcmd1bWVudHMgYWxyZWFkeSBoYW5kbGVkICovCisgICAgICBpKys7CisKKyAgICAgIHNwZWNfdHlwZSA9IHZhX2FyZyAodmFyX2FyZ3MsIGludCk7CisgICAgICBpZiAoIV9kYnVzX3R5cGVfcmVhZGVyX25leHQgKCZyZWFsLT51LnJlYWRlcikgJiYgc3BlY190eXBlICE9IERCVVNfVFlQRV9JTlZBTElEKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0lOVkFMSURfQVJHUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIk1lc3NhZ2UgaGFzIG9ubHkgJWQgYXJndW1lbnRzLCBidXQgbW9yZSB3ZXJlIGV4cGVjdGVkIiwgaSk7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgcmV0dmFsID0gVFJVRTsKKworIG91dDoKKyAgLyogdGhlcmUgbWF5IG1lbW9yeSBvciB1bml4IGZkIGxlYWsgaW4gdGhlIGFib3ZlIGl0ZXJhdGlvbiBpZiBwYXJzZSBmYWlsZWQuCisgICAqIHNvIHdlIGhhdmUgYW5vdGhlciBpdGVyYXRpb24gb3ZlciBjb3B5X2FyZ3MgdG8gZnJlZSBtZW1vcnkgYW5kIGNsb3NlCisgICAqIHVuaXggZmRzLgorICAgKi8KKyAgaWYgKCFyZXR2YWwpCisgICAgeworICAgICAgc3BlY190eXBlID0gZmlyc3RfYXJnX3R5cGU7CisgICAgICBqID0gMDsKKworICAgICAgd2hpbGUgKGogPCBpKQorICAgICAgICB7CisgICAgICAgICAgaWYgKHNwZWNfdHlwZSA9PSBEQlVTX1RZUEVfVU5JWF9GRCkKKyAgICAgICAgICAgIHsKKyNpZmRlZiBIQVZFX1VOSVhfRkRfUEFTU0lORworICAgICAgICAgICAgICBpbnQgKnBmZDsKKworICAgICAgICAgICAgICBwZmQgPSB2YV9hcmcgKGNvcHlfYXJncywgaW50ICopOworICAgICAgICAgICAgICBfZGJ1c19hc3NlcnQocGZkKTsKKyAgICAgICAgICAgICAgaWYgKCpwZmQgPj0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBfZGJ1c19jbG9zZSAoKnBmZCwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAqcGZkID0gLTE7CisgICAgICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZSBpZiAoZGJ1c190eXBlX2lzX2Jhc2ljIChzcGVjX3R5cGUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvKiBtb3ZlIHRoZSBpbmRleCBmb3J3YXJkICovCisgICAgICAgICAgICAgIHZhX2FyZyAoY29weV9hcmdzLCBEQnVzQmFzaWNWYWx1ZSAqKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIGlmIChzcGVjX3R5cGUgPT0gREJVU19UWVBFX0FSUkFZKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpbnQgc3BlY19lbGVtZW50X3R5cGU7CisKKyAgICAgICAgICAgICAgc3BlY19lbGVtZW50X3R5cGUgPSB2YV9hcmcgKGNvcHlfYXJncywgaW50KTsKKyAgICAgICAgICAgICAgaWYgKGRidXNfdHlwZV9pc19maXhlZCAoc3BlY19lbGVtZW50X3R5cGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIC8qIG1vdmUgdGhlIGluZGV4IGZvcndhcmQgKi8KKyAgICAgICAgICAgICAgICAgIHZhX2FyZyAoY29weV9hcmdzLCBjb25zdCBEQnVzQmFzaWNWYWx1ZSAqKik7CisgICAgICAgICAgICAgICAgICB2YV9hcmcgKGNvcHlfYXJncywgaW50ICopOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZSBpZiAoX0RCVVNfVFlQRV9JU19TVFJJTkdMSUtFIChzcGVjX2VsZW1lbnRfdHlwZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgY2hhciAqKipzdHJfYXJyYXlfcDsKKworICAgICAgICAgICAgICAgICAgc3RyX2FycmF5X3AgPSB2YV9hcmcgKGNvcHlfYXJncywgY2hhciAqKiopOworICAgICAgICAgICAgICAgICAgLyogbW92ZSB0aGUgaW5kZXggZm9yd2FyZCAqLworICAgICAgICAgICAgICAgICAgdmFfYXJnIChjb3B5X2FyZ3MsIGludCAqKTsKKyAgICAgICAgICAgICAgICAgIF9kYnVzX2Fzc2VydCAoc3RyX2FycmF5X3AgIT0gTlVMTCk7CisgICAgICAgICAgICAgICAgICBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5ICgqc3RyX2FycmF5X3ApOworICAgICAgICAgICAgICAgICAgKnN0cl9hcnJheV9wID0gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBzcGVjX3R5cGUgPSB2YV9hcmcgKGNvcHlfYXJncywgaW50KTsKKyAgICAgICAgICBqKys7CisgICAgICAgIH0KKyAgICB9CisKKyAgdmFfZW5kIChjb3B5X2FyZ3MpOworICByZXR1cm4gcmV0dmFsOworfQorCisvKiogQH0gKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c01lc3NhZ2UgREJ1c01lc3NhZ2UKKyAqIEBpbmdyb3VwICBEQnVzCisgKiBAYnJpZWYgTWVzc2FnZSB0byBiZSBzZW50IG9yIHJlY2VpdmVkIG92ZXIgYSAjREJ1c0Nvbm5lY3Rpb24uCisgKgorICogQSBEQnVzTWVzc2FnZSBpcyB0aGUgbW9zdCBiYXNpYyB1bml0IG9mIGNvbW11bmljYXRpb24gb3ZlciBhCisgKiBEQnVzQ29ubmVjdGlvbi4gQSBEQnVzQ29ubmVjdGlvbiByZXByZXNlbnRzIGEgc3RyZWFtIG9mIG1lc3NhZ2VzCisgKiByZWNlaXZlZCBmcm9tIGEgcmVtb3RlIGFwcGxpY2F0aW9uLCBhbmQgYSBzdHJlYW0gb2YgbWVzc2FnZXMKKyAqIHNlbnQgdG8gYSByZW1vdGUgYXBwbGljYXRpb24uCisgKgorICogQSBtZXNzYWdlIGhhcyBhIG1lc3NhZ2UgdHlwZSwgcmV0dXJuZWQgZnJvbQorICogZGJ1c19tZXNzYWdlX2dldF90eXBlKCkuICBUaGlzIGluZGljYXRlcyB3aGV0aGVyIHRoZSBtZXNzYWdlIGlzIGEKKyAqIG1ldGhvZCBjYWxsLCBhIHJlcGx5IHRvIGEgbWV0aG9kIGNhbGwsIGEgc2lnbmFsLCBvciBhbiBlcnJvciByZXBseS4KKyAqCisgKiBBIG1lc3NhZ2UgaGFzIGhlYWRlciBmaWVsZHMgc3VjaCBhcyB0aGUgc2VuZGVyLCBkZXN0aW5hdGlvbiwgbWV0aG9kCisgKiBvciBzaWduYWwgbmFtZSwgYW5kIHNvIGZvcnRoLiBEQnVzTWVzc2FnZSBoYXMgYWNjZXNzb3IgZnVuY3Rpb25zIGZvcgorICogdGhlc2UsIHN1Y2ggYXMgZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIoKS4KKyAqCisgKiBDb252ZW5pZW5jZSBmdW5jdGlvbnMgZGJ1c19tZXNzYWdlX2lzX21ldGhvZF9jYWxsKCksIGRidXNfbWVzc2FnZV9pc19zaWduYWwoKSwKKyAqIGFuZCBkYnVzX21lc3NhZ2VfaXNfZXJyb3IoKSBjaGVjayBzZXZlcmFsIGhlYWRlciBmaWVsZHMgYXQgb25jZSBhbmQgYXJlCisgKiBzbGlnaHRseSBtb3JlIGVmZmljaWVudCB0aGFuIGNoZWNraW5nIHRoZSBoZWFkZXIgZmllbGRzIHdpdGggaW5kaXZpZHVhbAorICogYWNjZXNzb3IgZnVuY3Rpb25zLgorICoKKyAqIEZpbmFsbHksIGEgbWVzc2FnZSBoYXMgYXJndW1lbnRzLiBUaGUgbnVtYmVyIGFuZCB0eXBlcyBvZiBhcmd1bWVudHMKKyAqIGFyZSBpbiB0aGUgbWVzc2FnZSdzIHNpZ25hdHVyZSBoZWFkZXIgZmllbGQgKGFjY2Vzc2VkIHdpdGgKKyAqIGRidXNfbWVzc2FnZV9nZXRfc2lnbmF0dXJlKCkpLiAgU2ltcGxlIGFyZ3VtZW50IHZhbHVlcyBhcmUgdXN1YWxseQorICogcmV0cmlldmVkIHdpdGggZGJ1c19tZXNzYWdlX2dldF9hcmdzKCkgYnV0IG1vcmUgY29tcGxleCB2YWx1ZXMgc3VjaAorICogYXMgc3RydWN0cyBtYXkgcmVxdWlyZSB0aGUgdXNlIG9mICNEQnVzTWVzc2FnZUl0ZXIuCisgKgorICogVGhlIEQtQnVzIHNwZWNpZmljYXRpb24gZ29lcyBpbnRvIHNvbWUgbW9yZSBkZXRhaWwgYWJvdXQgaGVhZGVyIGZpZWxkcyBhbmQKKyAqIG1lc3NhZ2UgdHlwZXMuCisgKiAKKyAqIEB7CisgKi8KKworLyoqCisgKiBAdHlwZWRlZiBEQnVzTWVzc2FnZQorICoKKyAqIE9wYXF1ZSBkYXRhIHR5cGUgcmVwcmVzZW50aW5nIGEgbWVzc2FnZSByZWNlaXZlZCBmcm9tIG9yIHRvIGJlCisgKiBzZW50IHRvIGFub3RoZXIgYXBwbGljYXRpb24uCisgKi8KKworLyoqCisgKiBSZXR1cm5zIHRoZSBzZXJpYWwgb2YgYSBtZXNzYWdlIG9yIDAgaWYgbm9uZSBoYXMgYmVlbiBzcGVjaWZpZWQuCisgKiBUaGUgbWVzc2FnZSdzIHNlcmlhbCBudW1iZXIgaXMgcHJvdmlkZWQgYnkgdGhlIGFwcGxpY2F0aW9uIHNlbmRpbmcKKyAqIHRoZSBtZXNzYWdlIGFuZCBpcyB1c2VkIHRvIGlkZW50aWZ5IHJlcGxpZXMgdG8gdGhpcyBtZXNzYWdlLgorICoKKyAqIEFsbCBtZXNzYWdlcyByZWNlaXZlZCBvbiBhIGNvbm5lY3Rpb24gd2lsbCBoYXZlIGEgc2VyaWFsIHByb3ZpZGVkCisgKiBieSB0aGUgcmVtb3RlIGFwcGxpY2F0aW9uLgorICoKKyAqIEZvciBtZXNzYWdlcyB5b3UncmUgc2VuZGluZywgZGJ1c19jb25uZWN0aW9uX3NlbmQoKSB3aWxsIGFzc2lnbiBhCisgKiBzZXJpYWwgYW5kIHJldHVybiBpdCB0byB5b3UuCisgKgorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UKKyAqIEByZXR1cm5zIHRoZSBzZXJpYWwKKyAqLworZGJ1c191aW50MzJfdAorZGJ1c19tZXNzYWdlX2dldF9zZXJpYWwgKERCdXNNZXNzYWdlICptZXNzYWdlKQoreworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG1lc3NhZ2UgIT0gTlVMTCwgMCk7CisKKyAgcmV0dXJuIF9kYnVzX2hlYWRlcl9nZXRfc2VyaWFsICgmbWVzc2FnZS0+aGVhZGVyKTsKK30KKworLyoqCisgKiBTZXRzIHRoZSByZXBseSBzZXJpYWwgb2YgYSBtZXNzYWdlICh0aGUgc2VyaWFsIG9mIHRoZSBtZXNzYWdlIHRoaXMKKyAqIGlzIGEgcmVwbHkgdG8pLgorICoKKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlCisgKiBAcGFyYW0gcmVwbHlfc2VyaWFsIHRoZSBzZXJpYWwgd2UncmUgcmVwbHlpbmcgdG8KKyAqIEByZXR1cm5zICNGQUxTRSBpZiBub3QgZW5vdWdoIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorZGJ1c19tZXNzYWdlX3NldF9yZXBseV9zZXJpYWwgKERCdXNNZXNzYWdlICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgcmVwbHlfc2VyaWFsKQoreworICBEQnVzQmFzaWNWYWx1ZSB2YWx1ZTsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG1lc3NhZ2UgIT0gTlVMTCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKCFtZXNzYWdlLT5sb2NrZWQsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChyZXBseV9zZXJpYWwgIT0gMCwgRkFMU0UpOyAvKiAwIGlzIGludmFsaWQgKi8KKworICB2YWx1ZS51MzIgPSByZXBseV9zZXJpYWw7CisKKyAgcmV0dXJuIF9kYnVzX2hlYWRlcl9zZXRfZmllbGRfYmFzaWMgKCZtZXNzYWdlLT5oZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0hFQURFUl9GSUVMRF9SRVBMWV9TRVJJQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfVUlOVDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKTsKK30KKworLyoqCisgKiBSZXR1cm5zIHRoZSBzZXJpYWwgdGhhdCB0aGUgbWVzc2FnZSBpcyBhIHJlcGx5IHRvIG9yIDAgaWYgbm9uZS4KKyAqCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZQorICogQHJldHVybnMgdGhlIHJlcGx5IHNlcmlhbAorICovCitkYnVzX3VpbnQzMl90CitkYnVzX21lc3NhZ2VfZ2V0X3JlcGx5X3NlcmlhbCAgKERCdXNNZXNzYWdlICptZXNzYWdlKQoreworICBkYnVzX3VpbnQzMl90IHZfVUlOVDMyOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAobWVzc2FnZSAhPSBOVUxMLCAwKTsKKworICBpZiAoX2RidXNfaGVhZGVyX2dldF9maWVsZF9iYXNpYyAoJm1lc3NhZ2UtPmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSEVBREVSX0ZJRUxEX1JFUExZX1NFUklBTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9VSU5UMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdl9VSU5UMzIpKQorICAgIHJldHVybiB2X1VJTlQzMjsKKyAgZWxzZQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorZGJ1c19tZXNzYWdlX2ZpbmFsaXplIChEQnVzTWVzc2FnZSAqbWVzc2FnZSkKK3sKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19hdG9taWNfZ2V0ICgmbWVzc2FnZS0+cmVmY291bnQpID09IDApOworCisgIC8qIFRoaXMgY2FsbHMgYXBwbGljYXRpb24gY2FsbGJhY2tzISAqLworICBfZGJ1c19kYXRhX3Nsb3RfbGlzdF9mcmVlICgmbWVzc2FnZS0+c2xvdF9saXN0KTsKKworICBfZGJ1c19saXN0X2ZvcmVhY2ggKCZtZXNzYWdlLT5jb3VudGVycywKKyAgICAgICAgICAgICAgICAgICAgICBmcmVlX2NvdW50ZXIsIG1lc3NhZ2UpOworICBfZGJ1c19saXN0X2NsZWFyICgmbWVzc2FnZS0+Y291bnRlcnMpOworCisgIF9kYnVzX2hlYWRlcl9mcmVlICgmbWVzc2FnZS0+aGVhZGVyKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZtZXNzYWdlLT5ib2R5KTsKKworI2lmZGVmIEhBVkVfVU5JWF9GRF9QQVNTSU5HCisgIGNsb3NlX3VuaXhfZmRzKG1lc3NhZ2UtPnVuaXhfZmRzLCAmbWVzc2FnZS0+bl91bml4X2Zkcyk7CisgIGRidXNfZnJlZShtZXNzYWdlLT51bml4X2Zkcyk7CisjZW5kaWYKKworICBfZGJ1c19hc3NlcnQgKF9kYnVzX2F0b21pY19nZXQgKCZtZXNzYWdlLT5yZWZjb3VudCkgPT0gMCk7CisKKyAgZGJ1c19mcmVlIChtZXNzYWdlKTsKK30KKworc3RhdGljIERCdXNNZXNzYWdlKgorZGJ1c19tZXNzYWdlX25ld19lbXB0eV9oZWFkZXIgKHZvaWQpCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworICBkYnVzX2Jvb2xfdCBmcm9tX2NhY2hlOworCisgIG1lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfZ2V0X2NhY2hlZCAoKTsKKworICBpZiAobWVzc2FnZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGZyb21fY2FjaGUgPSBUUlVFOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGZyb21fY2FjaGUgPSBGQUxTRTsKKyAgICAgIG1lc3NhZ2UgPSBkYnVzX25ldzAgKERCdXNNZXNzYWdlLCAxKTsKKyAgICAgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworI2lmbmRlZiBEQlVTX0RJU0FCTEVfQ0hFQ0tTCisgICAgICBtZXNzYWdlLT5nZW5lcmF0aW9uID0gX2RidXNfY3VycmVudF9nZW5lcmF0aW9uOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX1VOSVhfRkRfUEFTU0lORworICAgICAgbWVzc2FnZS0+dW5peF9mZHMgPSBOVUxMOworICAgICAgbWVzc2FnZS0+bl91bml4X2Zkc19hbGxvY2F0ZWQgPSAwOworI2VuZGlmCisgICAgfQorCisgIF9kYnVzX2F0b21pY19pbmMgKCZtZXNzYWdlLT5yZWZjb3VudCk7CisKKyAgX2RidXNfbWVzc2FnZV90cmFjZV9yZWYgKG1lc3NhZ2UsIDAsIDEsICJuZXdfZW1wdHlfaGVhZGVyIik7CisKKyAgbWVzc2FnZS0+bG9ja2VkID0gRkFMU0U7CisjaWZuZGVmIERCVVNfRElTQUJMRV9DSEVDS1MKKyAgbWVzc2FnZS0+aW5fY2FjaGUgPSBGQUxTRTsKKyNlbmRpZgorICBtZXNzYWdlLT5jb3VudGVycyA9IE5VTEw7CisgIG1lc3NhZ2UtPnNpemVfY291bnRlcl9kZWx0YSA9IDA7CisgIG1lc3NhZ2UtPmNoYW5nZWRfc3RhbXAgPSAwOworCisjaWZkZWYgSEFWRV9VTklYX0ZEX1BBU1NJTkcKKyAgbWVzc2FnZS0+bl91bml4X2ZkcyA9IDA7CisgIG1lc3NhZ2UtPm5fdW5peF9mZHNfYWxsb2NhdGVkID0gMDsKKyAgbWVzc2FnZS0+dW5peF9mZF9jb3VudGVyX2RlbHRhID0gMDsKKyNlbmRpZgorCisgIGlmICghZnJvbV9jYWNoZSkKKyAgICBfZGJ1c19kYXRhX3Nsb3RfbGlzdF9pbml0ICgmbWVzc2FnZS0+c2xvdF9saXN0KTsKKworICBpZiAoZnJvbV9jYWNoZSkKKyAgICB7CisgICAgICBfZGJ1c19oZWFkZXJfcmVpbml0ICgmbWVzc2FnZS0+aGVhZGVyKTsKKyAgICAgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoICgmbWVzc2FnZS0+Ym9keSwgMCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKCFfZGJ1c19oZWFkZXJfaW5pdCAoJm1lc3NhZ2UtPmhlYWRlcikpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX2ZyZWUgKG1lc3NhZ2UpOworICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXRfcHJlYWxsb2NhdGVkICgmbWVzc2FnZS0+Ym9keSwgMzIpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfaGVhZGVyX2ZyZWUgKCZtZXNzYWdlLT5oZWFkZXIpOworICAgICAgICAgIGRidXNfZnJlZSAobWVzc2FnZSk7CisgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgcmV0dXJuIG1lc3NhZ2U7Cit9CisKKy8qKgorICogQ29uc3RydWN0cyBhIG5ldyBtZXNzYWdlIG9mIHRoZSBnaXZlbiBtZXNzYWdlIHR5cGUuCisgKiBUeXBlcyBpbmNsdWRlICNEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfQ0FMTCwKKyAqICNEQlVTX01FU1NBR0VfVFlQRV9TSUdOQUwsIGFuZCBzbyBmb3J0aC4KKyAqCisgKiBVc3VhbGx5IHlvdSB3YW50IHRvIHVzZSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsKCksCisgKiBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9yZXR1cm4oKSwgZGJ1c19tZXNzYWdlX25ld19zaWduYWwoKSwKKyAqIG9yIGRidXNfbWVzc2FnZV9uZXdfZXJyb3IoKSBpbnN0ZWFkLgorICogCisgKiBAcGFyYW0gbWVzc2FnZV90eXBlIHR5cGUgb2YgbWVzc2FnZQorICogQHJldHVybnMgbmV3IG1lc3NhZ2Ugb3IgI05VTEwgaWYgbm8gbWVtb3J5CisgKi8KK0RCdXNNZXNzYWdlKgorZGJ1c19tZXNzYWdlX25ldyAoaW50IG1lc3NhZ2VfdHlwZSkKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChtZXNzYWdlX3R5cGUgIT0gREJVU19NRVNTQUdFX1RZUEVfSU5WQUxJRCwgTlVMTCk7CisKKyAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXdfZW1wdHlfaGVhZGVyICgpOworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIGlmICghX2RidXNfaGVhZGVyX2NyZWF0ZSAoJm1lc3NhZ2UtPmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0NPTVBJTEVSX0JZVEVfT1JERVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgcmV0dXJuIG1lc3NhZ2U7Cit9CisKKy8qKgorICogQ29uc3RydWN0cyBhIG5ldyBtZXNzYWdlIHRvIGludm9rZSBhIG1ldGhvZCBvbiBhIHJlbW90ZQorICogb2JqZWN0LiBSZXR1cm5zICNOVUxMIGlmIG1lbW9yeSBjYW4ndCBiZSBhbGxvY2F0ZWQgZm9yIHRoZQorICogbWVzc2FnZS4gVGhlIGRlc3RpbmF0aW9uIG1heSBiZSAjTlVMTCBpbiB3aGljaCBjYXNlIG5vIGRlc3RpbmF0aW9uCisgKiBpcyBzZXQ7IHRoaXMgaXMgYXBwcm9wcmlhdGUgd2hlbiB1c2luZyBELUJ1cyBpbiBhIHBlZXItdG8tcGVlcgorICogY29udGV4dCAobm8gbWVzc2FnZSBidXMpLiBUaGUgaW50ZXJmYWNlIG1heSBiZSAjTlVMTCwgd2hpY2ggbWVhbnMKKyAqIHRoYXQgaWYgbXVsdGlwbGUgbWV0aG9kcyB3aXRoIHRoZSBnaXZlbiBuYW1lIGV4aXN0IGl0IGlzIHVuZGVmaW5lZAorICogd2hpY2ggb25lIHdpbGwgYmUgaW52b2tlZC4KKyAqCisgKiBUaGUgcGF0aCBhbmQgbWV0aG9kIG5hbWVzIG1heSBub3QgYmUgI05VTEwuCisgKgorICogRGVzdGluYXRpb24sIHBhdGgsIGludGVyZmFjZSwgYW5kIG1ldGhvZCBuYW1lIGNhbid0IGNvbnRhaW4KKyAqIGFueSBpbnZhbGlkIGNoYXJhY3RlcnMgKHNlZSB0aGUgRC1CdXMgc3BlY2lmaWNhdGlvbikuCisgKiAKKyAqIEBwYXJhbSBkZXN0aW5hdGlvbiBuYW1lIHRoYXQgdGhlIG1lc3NhZ2Ugc2hvdWxkIGJlIHNlbnQgdG8gb3IgI05VTEwKKyAqIEBwYXJhbSBwYXRoIG9iamVjdCBwYXRoIHRoZSBtZXNzYWdlIHNob3VsZCBiZSBzZW50IHRvCisgKiBAcGFyYW0gaWZhY2UgaW50ZXJmYWNlIHRvIGludm9rZSBtZXRob2Qgb24sIG9yICNOVUxMCisgKiBAcGFyYW0gbWV0aG9kIG1ldGhvZCB0byBpbnZva2UKKyAqCisgKiBAcmV0dXJucyBhIG5ldyBEQnVzTWVzc2FnZSwgZnJlZSB3aXRoIGRidXNfbWVzc2FnZV91bnJlZigpCisgKi8KK0RCdXNNZXNzYWdlKgorZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoY29uc3QgY2hhciAqZGVzdGluYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptZXRob2QpCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAocGF0aCAhPSBOVUxMLCBOVUxMKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChtZXRob2QgIT0gTlVMTCwgTlVMTCk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoZGVzdGluYXRpb24gPT0gTlVMTCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX2NoZWNrX2lzX3ZhbGlkX2J1c19uYW1lIChkZXN0aW5hdGlvbiksIE5VTEwpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKF9kYnVzX2NoZWNrX2lzX3ZhbGlkX3BhdGggKHBhdGgpLCBOVUxMKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChpZmFjZSA9PSBOVUxMIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfY2hlY2tfaXNfdmFsaWRfaW50ZXJmYWNlIChpZmFjZSksIE5VTEwpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKF9kYnVzX2NoZWNrX2lzX3ZhbGlkX21lbWJlciAobWV0aG9kKSwgTlVMTCk7CisKKyAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXdfZW1wdHlfaGVhZGVyICgpOworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIGlmICghX2RidXNfaGVhZGVyX2NyZWF0ZSAoJm1lc3NhZ2UtPmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0NPTVBJTEVSX0JZVEVfT1JERVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX0NBTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb24sIHBhdGgsIGlmYWNlLCBtZXRob2QsIE5VTEwpKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgcmV0dXJuIG1lc3NhZ2U7Cit9CisKKy8qKgorICogQ29uc3RydWN0cyBhIG1lc3NhZ2UgdGhhdCBpcyBhIHJlcGx5IHRvIGEgbWV0aG9kIGNhbGwuIFJldHVybnMKKyAqICNOVUxMIGlmIG1lbW9yeSBjYW4ndCBiZSBhbGxvY2F0ZWQgZm9yIHRoZSBtZXNzYWdlLgorICoKKyAqIEBwYXJhbSBtZXRob2RfY2FsbCB0aGUgbWVzc2FnZSBiZWluZyByZXBsaWVkIHRvCisgKiBAcmV0dXJucyBhIG5ldyBEQnVzTWVzc2FnZSwgZnJlZSB3aXRoIGRidXNfbWVzc2FnZV91bnJlZigpCisgKi8KK0RCdXNNZXNzYWdlKgorZGJ1c19tZXNzYWdlX25ld19tZXRob2RfcmV0dXJuIChEQnVzTWVzc2FnZSAqbWV0aG9kX2NhbGwpCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworICBjb25zdCBjaGFyICpzZW5kZXI7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChtZXRob2RfY2FsbCAhPSBOVUxMLCBOVUxMKTsKKworICBzZW5kZXIgPSBkYnVzX21lc3NhZ2VfZ2V0X3NlbmRlciAobWV0aG9kX2NhbGwpOworCisgIC8qIHNlbmRlciBpcyBhbGxvd2VkIHRvIGJlIG51bGwgaGVyZSBpbiBwZWVyLXRvLXBlZXIgY2FzZSAqLworCisgIG1lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfbmV3X2VtcHR5X2hlYWRlciAoKTsKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBpZiAoIV9kYnVzX2hlYWRlcl9jcmVhdGUgKCZtZXNzYWdlLT5oZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19DT01QSUxFUl9CWVRFX09SREVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfTUVTU0FHRV9UWVBFX01FVEhPRF9SRVRVUk4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZGVyLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIGRidXNfbWVzc2FnZV9zZXRfbm9fcmVwbHkgKG1lc3NhZ2UsIFRSVUUpOworCisgIGlmICghZGJ1c19tZXNzYWdlX3NldF9yZXBseV9zZXJpYWwgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfc2VyaWFsIChtZXRob2RfY2FsbCkpKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgcmV0dXJuIG1lc3NhZ2U7Cit9CisKKy8qKgorICogQ29uc3RydWN0cyBhIG5ldyBtZXNzYWdlIHJlcHJlc2VudGluZyBhIHNpZ25hbCBlbWlzc2lvbi4gUmV0dXJucworICogI05VTEwgaWYgbWVtb3J5IGNhbid0IGJlIGFsbG9jYXRlZCBmb3IgdGhlIG1lc3NhZ2UuICBBIHNpZ25hbCBpcworICogaWRlbnRpZmllZCBieSBpdHMgb3JpZ2luYXRpbmcgb2JqZWN0IHBhdGgsIGludGVyZmFjZSwgYW5kIHRoZSBuYW1lCisgKiBvZiB0aGUgc2lnbmFsLgorICoKKyAqIFBhdGgsIGludGVyZmFjZSwgYW5kIHNpZ25hbCBuYW1lIG11c3QgYWxsIGJlIHZhbGlkICh0aGUgRC1CdXMKKyAqIHNwZWNpZmljYXRpb24gZGVmaW5lcyB0aGUgc3ludGF4IG9mIHRoZXNlIGZpZWxkcykuCisgKiAKKyAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoIHRvIHRoZSBvYmplY3QgZW1pdHRpbmcgdGhlIHNpZ25hbAorICogQHBhcmFtIGlmYWNlIHRoZSBpbnRlcmZhY2UgdGhlIHNpZ25hbCBpcyBlbWl0dGVkIGZyb20KKyAqIEBwYXJhbSBuYW1lIG5hbWUgb2YgdGhlIHNpZ25hbAorICogQHJldHVybnMgYSBuZXcgREJ1c01lc3NhZ2UsIGZyZWUgd2l0aCBkYnVzX21lc3NhZ2VfdW5yZWYoKQorICovCitEQnVzTWVzc2FnZSoKK2RidXNfbWVzc2FnZV9uZXdfc2lnbmFsIChjb25zdCBjaGFyICpwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUpCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAocGF0aCAhPSBOVUxMLCBOVUxMKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChpZmFjZSAhPSBOVUxMLCBOVUxMKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChuYW1lICE9IE5VTEwsIE5VTEwpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKF9kYnVzX2NoZWNrX2lzX3ZhbGlkX3BhdGggKHBhdGgpLCBOVUxMKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChfZGJ1c19jaGVja19pc192YWxpZF9pbnRlcmZhY2UgKGlmYWNlKSwgTlVMTCk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoX2RidXNfY2hlY2tfaXNfdmFsaWRfbWVtYmVyIChuYW1lKSwgTlVMTCk7CisKKyAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXdfZW1wdHlfaGVhZGVyICgpOworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIGlmICghX2RidXNfaGVhZGVyX2NyZWF0ZSAoJm1lc3NhZ2UtPmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0NPTVBJTEVSX0JZVEVfT1JERVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19NRVNTQUdFX1RZUEVfU0lHTkFMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIHBhdGgsIGlmYWNlLCBuYW1lLCBOVUxMKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIGRidXNfbWVzc2FnZV9zZXRfbm9fcmVwbHkgKG1lc3NhZ2UsIFRSVUUpOworCisgIHJldHVybiBtZXNzYWdlOworfQorCisvKioKKyAqIENyZWF0ZXMgYSBuZXcgbWVzc2FnZSB0aGF0IGlzIGFuIGVycm9yIHJlcGx5IHRvIGFub3RoZXIgbWVzc2FnZS4KKyAqIEVycm9yIHJlcGxpZXMgYXJlIG1vc3QgY29tbW9uIGluIHJlc3BvbnNlIHRvIG1ldGhvZCBjYWxscywgYnV0CisgKiBjYW4gYmUgcmV0dXJuZWQgaW4gcmVwbHkgdG8gYW55IG1lc3NhZ2UuCisgKgorICogVGhlIGVycm9yIG5hbWUgbXVzdCBiZSBhIHZhbGlkIGVycm9yIG5hbWUgYWNjb3JkaW5nIHRvIHRoZSBzeW50YXgKKyAqIGdpdmVuIGluIHRoZSBELUJ1cyBzcGVjaWZpY2F0aW9uLiBJZiB5b3UgZG9uJ3Qgd2FudCB0byBtYWtlCisgKiB1cCBhbiBlcnJvciBuYW1lIGp1c3QgdXNlICNEQlVTX0VSUk9SX0ZBSUxFRC4KKyAqCisgKiBAcGFyYW0gcmVwbHlfdG8gdGhlIG1lc3NhZ2Ugd2UncmUgcmVwbHlpbmcgdG8KKyAqIEBwYXJhbSBlcnJvcl9uYW1lIHRoZSBlcnJvciBuYW1lCisgKiBAcGFyYW0gZXJyb3JfbWVzc2FnZSB0aGUgZXJyb3IgbWVzc2FnZSBzdHJpbmcgKG9yICNOVUxMIGZvciBub25lLCBidXQgcGxlYXNlIGdpdmUgYSBtZXNzYWdlKQorICogQHJldHVybnMgYSBuZXcgZXJyb3IgbWVzc2FnZSBvYmplY3QsIGZyZWUgd2l0aCBkYnVzX21lc3NhZ2VfdW5yZWYoKQorICovCitEQnVzTWVzc2FnZSoKK2RidXNfbWVzc2FnZV9uZXdfZXJyb3IgKERCdXNNZXNzYWdlICpyZXBseV90bywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICplcnJvcl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgKmVycm9yX21lc3NhZ2UpCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworICBjb25zdCBjaGFyICpzZW5kZXI7CisgIERCdXNNZXNzYWdlSXRlciBpdGVyOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAocmVwbHlfdG8gIT0gTlVMTCwgTlVMTCk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoZXJyb3JfbmFtZSAhPSBOVUxMLCBOVUxMKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChfZGJ1c19jaGVja19pc192YWxpZF9lcnJvcl9uYW1lIChlcnJvcl9uYW1lKSwgTlVMTCk7CisKKyAgc2VuZGVyID0gZGJ1c19tZXNzYWdlX2dldF9zZW5kZXIgKHJlcGx5X3RvKTsKKworICAvKiBzZW5kZXIgbWF5IGJlIE5VTEwgZm9yIG5vbi1tZXNzYWdlLWJ1cyBjYXNlIG9yCisgICAqIHdoZW4gdGhlIG1lc3NhZ2UgYnVzIGlzIGRlYWxpbmcgd2l0aCBhbiB1bnJlZ2lzdGVyZWQKKyAgICogY29ubmVjdGlvbi4KKyAgICovCisgIG1lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfbmV3X2VtcHR5X2hlYWRlciAoKTsKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBpZiAoIV9kYnVzX2hlYWRlcl9jcmVhdGUgKCZtZXNzYWdlLT5oZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19DT01QSUxFUl9CWVRFX09SREVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfTUVTU0FHRV9UWVBFX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRlciwgTlVMTCwgTlVMTCwgTlVMTCwgZXJyb3JfbmFtZSkpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBkYnVzX21lc3NhZ2Vfc2V0X25vX3JlcGx5IChtZXNzYWdlLCBUUlVFKTsKKworICBpZiAoIWRidXNfbWVzc2FnZV9zZXRfcmVwbHlfc2VyaWFsIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3NlcmlhbCAocmVwbHlfdG8pKSkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIGlmIChlcnJvcl9tZXNzYWdlICE9IE5VTEwpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfaW5pdF9hcHBlbmQgKG1lc3NhZ2UsICZpdGVyKTsKKyAgICAgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljICgmaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcl9tZXNzYWdlKSkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgcmV0dXJuIG1lc3NhZ2U7Cit9CisKKy8qKgorICogQ3JlYXRlcyBhIG5ldyBtZXNzYWdlIHRoYXQgaXMgYW4gZXJyb3IgcmVwbHkgdG8gYW5vdGhlciBtZXNzYWdlLCBhbGxvd2luZworICogeW91IHRvIHVzZSBwcmludGYgZm9ybWF0dGluZy4KKyAqCisgKiBTZWUgZGJ1c19tZXNzYWdlX25ld19lcnJvcigpIGZvciBkZXRhaWxzIC0gdGhpcyBmdW5jdGlvbiBpcyB0aGUgc2FtZQorICogYXNpZGUgZnJvbSB0aGUgcHJpbnRmIGZvcm1hdHRpbmcuCisgKgorICogQHRvZG8gYWRkIF9EQlVTX0dOVUNfUFJJTlRGIHRvIHRoaXMgKHJlcXVpcmVzIG1vdmluZyBfREJVU19HTlVDX1BSSU5URiB0bworICogcHVibGljIGhlYWRlciwgc2VlIERCVVNfREVQUkVDQVRFRCBmb3IgYW4gZXhhbXBsZSkKKyAqIAorICogQHBhcmFtIHJlcGx5X3RvIHRoZSBvcmlnaW5hbCBtZXNzYWdlCisgKiBAcGFyYW0gZXJyb3JfbmFtZSB0aGUgZXJyb3IgbmFtZQorICogQHBhcmFtIGVycm9yX2Zvcm1hdCB0aGUgZXJyb3IgbWVzc2FnZSBmb3JtYXQgYXMgd2l0aCBwcmludGYKKyAqIEBwYXJhbSAuLi4gZm9ybWF0IHN0cmluZyBhcmd1bWVudHMKKyAqIEByZXR1cm5zIGEgbmV3IGVycm9yIG1lc3NhZ2UKKyAqLworREJ1c01lc3NhZ2UqCitkYnVzX21lc3NhZ2VfbmV3X2Vycm9yX3ByaW50ZiAoREJ1c01lc3NhZ2UgKnJlcGx5X3RvLAorCQkJICAgICAgIGNvbnN0IGNoYXIgICplcnJvcl9uYW1lLAorCQkJICAgICAgIGNvbnN0IGNoYXIgICplcnJvcl9mb3JtYXQsCisJCQkgICAgICAgLi4uKQoreworICB2YV9saXN0IGFyZ3M7CisgIERCdXNTdHJpbmcgc3RyOworICBEQnVzTWVzc2FnZSAqbWVzc2FnZTsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHJlcGx5X3RvICE9IE5VTEwsIE5VTEwpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGVycm9yX25hbWUgIT0gTlVMTCwgTlVMTCk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoX2RidXNfY2hlY2tfaXNfdmFsaWRfZXJyb3JfbmFtZSAoZXJyb3JfbmFtZSksIE5VTEwpOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZzdHIpKQorICAgIHJldHVybiBOVUxMOworCisgIHZhX3N0YXJ0IChhcmdzLCBlcnJvcl9mb3JtYXQpOworCisgIGlmIChfZGJ1c19zdHJpbmdfYXBwZW5kX3ByaW50Zl92YWxpc3QgKCZzdHIsIGVycm9yX2Zvcm1hdCwgYXJncykpCisgICAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXdfZXJyb3IgKHJlcGx5X3RvLCBlcnJvcl9uYW1lLAorCQkJCSAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJnN0cikpOworICBlbHNlCisgICAgbWVzc2FnZSA9IE5VTEw7CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZzdHIpOworCisgIHZhX2VuZCAoYXJncyk7CisKKyAgcmV0dXJuIG1lc3NhZ2U7Cit9CisKKworLyoqCisgKiBDcmVhdGVzIGEgbmV3IG1lc3NhZ2UgdGhhdCBpcyBhbiBleGFjdCByZXBsaWNhIG9mIHRoZSBtZXNzYWdlCisgKiBzcGVjaWZpZWQsIGV4Y2VwdCB0aGF0IGl0cyByZWZjb3VudCBpcyBzZXQgdG8gMSwgaXRzIG1lc3NhZ2Ugc2VyaWFsCisgKiBpcyByZXNldCB0byAwLCBhbmQgaWYgdGhlIG9yaWdpbmFsIG1lc3NhZ2Ugd2FzICJsb2NrZWQiIChpbiB0aGUKKyAqIG91dGdvaW5nIG1lc3NhZ2UgcXVldWUgYW5kIHRodXMgbm90IG1vZGlmaWFibGUpIHRoZSBuZXcgbWVzc2FnZQorICogd2lsbCBub3QgYmUgbG9ja2VkLgorICoKKyAqIEB0b2RvIFRoaXMgZnVuY3Rpb24gY2FuJ3QgYmUgdXNlZCBpbiBwcm9ncmFtcyB0aGF0IHRyeSB0byByZWNvdmVyIGZyb20gT09NIGVycm9ycy4KKyAqCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZQorICogQHJldHVybnMgdGhlIG5ldyBtZXNzYWdlLm9yICNOVUxMIGlmIG5vdCBlbm91Z2ggbWVtb3J5IG9yIFVuaXggZmlsZSBkZXNjcmlwdG9ycyAoaW4gY2FzZSB0aGUgbWVzc2FnZSB0byBjb3B5IGluY2x1ZGVzIFVuaXggZmlsZSBkZXNjcmlwdG9ycykgY2FuIGJlIGFsbG9jYXRlZC4KKyAqLworREJ1c01lc3NhZ2UgKgorZGJ1c19tZXNzYWdlX2NvcHkgKGNvbnN0IERCdXNNZXNzYWdlICptZXNzYWdlKQoreworICBEQnVzTWVzc2FnZSAqcmV0dmFsOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAobWVzc2FnZSAhPSBOVUxMLCBOVUxMKTsKKworICByZXR2YWwgPSBkYnVzX25ldzAgKERCdXNNZXNzYWdlLCAxKTsKKyAgaWYgKHJldHZhbCA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIF9kYnVzX2F0b21pY19pbmMgKCZyZXR2YWwtPnJlZmNvdW50KTsKKworICByZXR2YWwtPmxvY2tlZCA9IEZBTFNFOworI2lmbmRlZiBEQlVTX0RJU0FCTEVfQ0hFQ0tTCisgIHJldHZhbC0+Z2VuZXJhdGlvbiA9IG1lc3NhZ2UtPmdlbmVyYXRpb247CisjZW5kaWYKKworICBpZiAoIV9kYnVzX2hlYWRlcl9jb3B5ICgmbWVzc2FnZS0+aGVhZGVyLCAmcmV0dmFsLT5oZWFkZXIpKQorICAgIHsKKyAgICAgIGRidXNfZnJlZSAocmV0dmFsKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0X3ByZWFsbG9jYXRlZCAoJnJldHZhbC0+Ym9keSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmbWVzc2FnZS0+Ym9keSkpKQorICAgIHsKKyAgICAgIF9kYnVzX2hlYWRlcl9mcmVlICgmcmV0dmFsLT5oZWFkZXIpOworICAgICAgZGJ1c19mcmVlIChyZXR2YWwpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX2NvcHkgKCZtZXNzYWdlLT5ib2R5LCAwLAorCQkJICAmcmV0dmFsLT5ib2R5LCAwKSkKKyAgICBnb3RvIGZhaWxlZF9jb3B5OworCisjaWZkZWYgSEFWRV9VTklYX0ZEX1BBU1NJTkcKKyAgcmV0dmFsLT51bml4X2ZkcyA9IGRidXNfbmV3KGludCwgbWVzc2FnZS0+bl91bml4X2Zkcyk7CisgIGlmIChyZXR2YWwtPnVuaXhfZmRzID09IE5VTEwgJiYgbWVzc2FnZS0+bl91bml4X2ZkcyA+IDApCisgICAgZ290byBmYWlsZWRfY29weTsKKworICByZXR2YWwtPm5fdW5peF9mZHNfYWxsb2NhdGVkID0gbWVzc2FnZS0+bl91bml4X2ZkczsKKworICBmb3IgKHJldHZhbC0+bl91bml4X2ZkcyA9IDA7CisgICAgICAgcmV0dmFsLT5uX3VuaXhfZmRzIDwgbWVzc2FnZS0+bl91bml4X2ZkczsKKyAgICAgICByZXR2YWwtPm5fdW5peF9mZHMrKykKKyAgICB7CisgICAgICByZXR2YWwtPnVuaXhfZmRzW3JldHZhbC0+bl91bml4X2Zkc10gPSBfZGJ1c19kdXAobWVzc2FnZS0+dW5peF9mZHNbcmV0dmFsLT5uX3VuaXhfZmRzXSwgTlVMTCk7CisKKyAgICAgIGlmIChyZXR2YWwtPnVuaXhfZmRzW3JldHZhbC0+bl91bml4X2Zkc10gPCAwKQorICAgICAgICBnb3RvIGZhaWxlZF9jb3B5OworICAgIH0KKworI2VuZGlmCisKKyAgX2RidXNfbWVzc2FnZV90cmFjZV9yZWYgKHJldHZhbCwgMCwgMSwgImNvcHkiKTsKKyAgcmV0dXJuIHJldHZhbDsKKworIGZhaWxlZF9jb3B5OgorICBfZGJ1c19oZWFkZXJfZnJlZSAoJnJldHZhbC0+aGVhZGVyKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZyZXR2YWwtPmJvZHkpOworCisjaWZkZWYgSEFWRV9VTklYX0ZEX1BBU1NJTkcKKyAgY2xvc2VfdW5peF9mZHMocmV0dmFsLT51bml4X2ZkcywgJnJldHZhbC0+bl91bml4X2Zkcyk7CisgIGRidXNfZnJlZShyZXR2YWwtPnVuaXhfZmRzKTsKKyNlbmRpZgorCisgIGRidXNfZnJlZSAocmV0dmFsKTsKKworICByZXR1cm4gTlVMTDsKK30KKworCisvKioKKyAqIEluY3JlbWVudHMgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiBhIERCdXNNZXNzYWdlLgorICoKKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlCisgKiBAcmV0dXJucyB0aGUgbWVzc2FnZQorICogQHNlZSBkYnVzX21lc3NhZ2VfdW5yZWYKKyAqLworREJ1c01lc3NhZ2UgKgorZGJ1c19tZXNzYWdlX3JlZiAoREJ1c01lc3NhZ2UgKm1lc3NhZ2UpCit7CisgIGRidXNfaW50MzJfdCBvbGRfcmVmY291bnQ7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChtZXNzYWdlICE9IE5VTEwsIE5VTEwpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG1lc3NhZ2UtPmdlbmVyYXRpb24gPT0gX2RidXNfY3VycmVudF9nZW5lcmF0aW9uLCBOVUxMKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsICghbWVzc2FnZS0+aW5fY2FjaGUsIE5VTEwpOworCisgIG9sZF9yZWZjb3VudCA9IF9kYnVzX2F0b21pY19pbmMgKCZtZXNzYWdlLT5yZWZjb3VudCk7CisgIF9kYnVzX2Fzc2VydCAob2xkX3JlZmNvdW50ID49IDEpOworICBfZGJ1c19tZXNzYWdlX3RyYWNlX3JlZiAobWVzc2FnZSwgb2xkX3JlZmNvdW50LCBvbGRfcmVmY291bnQgKyAxLCAicmVmIik7CisKKyAgcmV0dXJuIG1lc3NhZ2U7Cit9CisKKy8qKgorICogRGVjcmVtZW50cyB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIGEgREJ1c01lc3NhZ2UsIGZyZWVpbmcgdGhlCisgKiBtZXNzYWdlIGlmIHRoZSBjb3VudCByZWFjaGVzIDAuCisgKgorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UKKyAqIEBzZWUgZGJ1c19tZXNzYWdlX3JlZgorICovCit2b2lkCitkYnVzX21lc3NhZ2VfdW5yZWYgKERCdXNNZXNzYWdlICptZXNzYWdlKQoreworIGRidXNfaW50MzJfdCBvbGRfcmVmY291bnQ7CisKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKG1lc3NhZ2UgIT0gTlVMTCk7CisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChtZXNzYWdlLT5nZW5lcmF0aW9uID09IF9kYnVzX2N1cnJlbnRfZ2VuZXJhdGlvbik7CisgIF9kYnVzX3JldHVybl9pZl9mYWlsICghbWVzc2FnZS0+aW5fY2FjaGUpOworCisgIG9sZF9yZWZjb3VudCA9IF9kYnVzX2F0b21pY19kZWMgKCZtZXNzYWdlLT5yZWZjb3VudCk7CisKKyAgX2RidXNfYXNzZXJ0IChvbGRfcmVmY291bnQgPj0gMSk7CisKKyAgX2RidXNfbWVzc2FnZV90cmFjZV9yZWYgKG1lc3NhZ2UsIG9sZF9yZWZjb3VudCwgb2xkX3JlZmNvdW50IC0gMSwgInVucmVmIik7CisKKyAgaWYgKG9sZF9yZWZjb3VudCA9PSAxKQorICAgIHsKKyAgICAgIC8qIENhbGxzIGFwcGxpY2F0aW9uIGNhbGxiYWNrcyEgKi8KKyAgICAgIGRidXNfbWVzc2FnZV9jYWNoZV9vcl9maW5hbGl6ZSAobWVzc2FnZSk7CisgICAgfQorfQorCisvKioKKyAqIEdldHMgdGhlIHR5cGUgb2YgYSBtZXNzYWdlLiBUeXBlcyBpbmNsdWRlCisgKiAjREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX0NBTEwsICNEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfUkVUVVJOLAorICogI0RCVVNfTUVTU0FHRV9UWVBFX0VSUk9SLCAjREJVU19NRVNTQUdFX1RZUEVfU0lHTkFMLCBidXQgb3RoZXIKKyAqIHR5cGVzIGFyZSBhbGxvd2VkIGFuZCBhbGwgY29kZSBtdXN0IHNpbGVudGx5IGlnbm9yZSBtZXNzYWdlcyBvZgorICogdW5rbm93biB0eXBlLiAjREJVU19NRVNTQUdFX1RZUEVfSU5WQUxJRCB3aWxsIG5ldmVyIGJlIHJldHVybmVkLgorICoKKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlCisgKiBAcmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgbWVzc2FnZQorICovCitpbnQKK2RidXNfbWVzc2FnZV9nZXRfdHlwZSAoREJ1c01lc3NhZ2UgKm1lc3NhZ2UpCit7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAobWVzc2FnZSAhPSBOVUxMLCBEQlVTX01FU1NBR0VfVFlQRV9JTlZBTElEKTsKKworICByZXR1cm4gX2RidXNfaGVhZGVyX2dldF9tZXNzYWdlX3R5cGUgKCZtZXNzYWdlLT5oZWFkZXIpOworfQorCisvKioKKyAqIEFwcGVuZHMgZmllbGRzIHRvIGEgbWVzc2FnZSBnaXZlbiBhIHZhcmlhYmxlIGFyZ3VtZW50IGxpc3QuIFRoZQorICogdmFyaWFibGUgYXJndW1lbnQgbGlzdCBzaG91bGQgY29udGFpbiB0aGUgdHlwZSBvZiBlYWNoIGFyZ3VtZW50CisgKiBmb2xsb3dlZCBieSB0aGUgdmFsdWUgdG8gYXBwZW5kLiBBcHBlbmRhYmxlIHR5cGVzIGFyZSBiYXNpYyB0eXBlcywKKyAqIGFuZCBhcnJheXMgb2YgZml4ZWQtbGVuZ3RoIGJhc2ljIHR5cGVzIChleGNlcHQgYXJyYXlzIG9mIFVuaXggZmlsZQorICogZGVzY3JpcHRvcnMpLiBUbyBhcHBlbmQgdmFyaWFibGUtbGVuZ3RoIGJhc2ljIHR5cGVzLCBvciBhbnkgbW9yZQorICogY29tcGxleCB2YWx1ZSwgeW91IGhhdmUgdG8gdXNlIGFuIGl0ZXJhdG9yIHJhdGhlciB0aGFuIHRoaXMKKyAqIGZ1bmN0aW9uLgorICoKKyAqIFRvIGFwcGVuZCBhIGJhc2ljIHR5cGUsIHNwZWNpZnkgaXRzIHR5cGUgY29kZSBmb2xsb3dlZCBieSB0aGUKKyAqIGFkZHJlc3Mgb2YgdGhlIHZhbHVlLiBGb3IgZXhhbXBsZToKKyAqCisgKiBAY29kZQorICoKKyAqIGRidXNfaW50MzJfdCB2X0lOVDMyID0gNDI7CisgKiBjb25zdCBjaGFyICp2X1NUUklORyA9ICJIZWxsbyBXb3JsZCI7CisgKiBkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKG1lc3NhZ2UsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlQzMiwgJnZfSU5UMzIsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZ2X1NUUklORywKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpOworICogQGVuZGNvZGUKKyAqCisgKiBUbyBhcHBlbmQgYW4gYXJyYXkgb2YgZml4ZWQtbGVuZ3RoIGJhc2ljIHR5cGVzIChleGNlcHQgVW5peCBmaWxlCisgKiBkZXNjcmlwdG9ycyksIHBhc3MgaW4gdGhlIERCVVNfVFlQRV9BUlJBWSB0eXBlY29kZSwgdGhlIGVsZW1lbnQKKyAqIHR5cGVjb2RlLCB0aGUgYWRkcmVzcyBvZiB0aGUgYXJyYXkgcG9pbnRlciwgYW5kIGEgMzItYml0IGludGVnZXIKKyAqIGdpdmluZyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBhcnJheS4gU28gZm9yIGV4YW1wbGU6CisgKgorICogQGNvZGUKKyAqCisgKiBjb25zdCBkYnVzX2ludDMyX3QgYXJyYXlbXSA9IHsgMSwgMiwgMyB9OworICogY29uc3QgZGJ1c19pbnQzMl90ICp2X0FSUkFZID0gYXJyYXk7CisgKiBkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKG1lc3NhZ2UsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9BUlJBWSwgREJVU19UWVBFX0lOVDMyLCAmdl9BUlJBWSwgMywKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpOworICoKKyAqIEBlbmRjb2RlCisgKgorICogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBzdXBwb3J0IGFycmF5cyBvZiBVbml4IGZpbGUgZGVzY3JpcHRvcnMuIElmCisgKiB5b3UgbmVlZCB0aG9zZSB5b3UgbmVlZCB0byBtYW51YWxseSByZWN1cnNlIGludG8gdGhlIGFycmF5LgorICoKKyAqIEZvciBVbml4IGZpbGUgZGVzY3JpcHRvcnMgdGhpcyBmdW5jdGlvbiB3aWxsIGludGVybmFsbHkgZHVwbGljYXRlCisgKiB0aGUgZGVzY3JpcHRvciB5b3UgcGFzc2VkIGluLiBIZW5jZSB5b3UgbWF5IGNsb3NlIHRoZSBkZXNjcmlwdG9yCisgKiBpbW1lZGlhdGVseSBhZnRlciB0aGlzIGNhbGwuCisgKgorICogQHdhcm5pbmcgaW4gQywgZ2l2ZW4gImludCBhcnJheVtdIiwgIiZhcnJheSA9PSBhcnJheSIgKHRoZQorICogY29tcC5sYW5nLmMgRkFRIHNheXMgb3RoZXJ3aXNlLCBidXQgZ2NjIGFuZCB0aGUgRkFRIGRvbid0IGFncmVlKS4KKyAqIFNvIGlmIHlvdSdyZSB1c2luZyBhbiBhcnJheSBpbnN0ZWFkIG9mIGEgcG9pbnRlciB5b3UgaGF2ZSB0byBjcmVhdGUKKyAqIGEgcG9pbnRlciB2YXJpYWJsZSwgYXNzaWduIHRoZSBhcnJheSB0byBpdCwgdGhlbiB0YWtlIHRoZSBhZGRyZXNzCisgKiBvZiB0aGUgcG9pbnRlciB2YXJpYWJsZS4gRm9yIHN0cmluZ3MgaXQgd29ya3MgdG8gd3JpdGUKKyAqIGNvbnN0IGNoYXIgKmFycmF5ID0gIkhlbGxvIiBhbmQgdGhlbiB1c2UgJmFycmF5IHRob3VnaC4KKyAqCisgKiBUaGUgbGFzdCBhcmd1bWVudCB0byB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgI0RCVVNfVFlQRV9JTlZBTElELAorICogbWFya2luZyB0aGUgZW5kIG9mIHRoZSBhcmd1bWVudCBsaXN0LiBJZiB5b3UgZG9uJ3QgZG8gdGhpcworICogdGhlbiBsaWJkYnVzIHdvbid0IGtub3cgdG8gc3RvcCBhbmQgd2lsbCByZWFkIGludmFsaWQgbWVtb3J5LgorICoKKyAqIFN0cmluZy9zaWduYXR1cmUvcGF0aCBhcnJheXMgc2hvdWxkIGJlIHBhc3NlZCBpbiBhcyAiY29uc3QgY2hhcioqKgorICogYWRkcmVzc19vZl9hcnJheSIgYW5kICJpbnQgbl9lbGVtZW50cyIKKyAqCisgKiBAdG9kbyBzdXBwb3J0IERCVVNfVFlQRV9TVFJVQ1QgYW5kIERCVVNfVFlQRV9WQVJJQU5UIGFuZCBjb21wbGV4IGFycmF5cworICoKKyAqIEB0b2RvIElmIHRoaXMgZmFpbHMgZHVlIHRvIGxhY2sgb2YgbWVtb3J5LCB0aGUgbWVzc2FnZSBpcyBob3NlZCBhbmQKKyAqIHlvdSBoYXZlIHRvIHN0YXJ0IG92ZXIgYnVpbGRpbmcgdGhlIHdob2xlIG1lc3NhZ2UuCisgKgorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UKKyAqIEBwYXJhbSBmaXJzdF9hcmdfdHlwZSB0eXBlIG9mIHRoZSBmaXJzdCBhcmd1bWVudAorICogQHBhcmFtIC4uLiB2YWx1ZSBvZiBmaXJzdCBhcmd1bWVudCwgbGlzdCBvZiBhZGRpdGlvbmFsIHR5cGUtdmFsdWUgcGFpcnMKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MKKyAqLworZGJ1c19ib29sX3QKK2RidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAoREJ1c01lc3NhZ2UgKm1lc3NhZ2UsCisJCQkgIGludCAgICAgICAgICBmaXJzdF9hcmdfdHlwZSwKKwkJCSAgLi4uKQoreworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIHZhX2xpc3QgdmFyX2FyZ3M7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChtZXNzYWdlICE9IE5VTEwsIEZBTFNFKTsKKworICB2YV9zdGFydCAodmFyX2FyZ3MsIGZpcnN0X2FyZ190eXBlKTsKKyAgcmV0dmFsID0gZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzX3ZhbGlzdCAobWVzc2FnZSwKKwkJCQkJICAgIGZpcnN0X2FyZ190eXBlLAorCQkJCQkgICAgdmFyX2FyZ3MpOworICB2YV9lbmQgKHZhcl9hcmdzKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIExpa2UgZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzKCkgYnV0IHRha2VzIGEgdmFfbGlzdCBmb3IgdXNlIGJ5IGxhbmd1YWdlIGJpbmRpbmdzLgorICoKKyAqIEB0b2RvIGZvciBub3csIGlmIHRoaXMgZnVuY3Rpb24gZmFpbHMgZHVlIHRvIE9PTSBpdCB3aWxsIGxlYXZlCisgKiB0aGUgbWVzc2FnZSBoYWxmLXdyaXR0ZW4gYW5kIHlvdSBoYXZlIHRvIGRpc2NhcmQgdGhlIG1lc3NhZ2UKKyAqIGFuZCBzdGFydCBvdmVyLgorICoKKyAqIEBzZWUgZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzLgorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UKKyAqIEBwYXJhbSBmaXJzdF9hcmdfdHlwZSB0eXBlIG9mIGZpcnN0IGFyZ3VtZW50CisgKiBAcGFyYW0gdmFyX2FyZ3MgdmFsdWUgb2YgZmlyc3QgYXJndW1lbnQsIHRoZW4gbGlzdCBvZiB0eXBlL3ZhbHVlIHBhaXJzCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzCisgKi8KK2RidXNfYm9vbF90CitkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3NfdmFsaXN0IChEQnVzTWVzc2FnZSAqbWVzc2FnZSwKKwkJCQkgaW50ICAgICAgICAgIGZpcnN0X2FyZ190eXBlLAorCQkJCSB2YV9saXN0ICAgICAgdmFyX2FyZ3MpCit7CisgIGludCB0eXBlOworICBEQnVzTWVzc2FnZUl0ZXIgaXRlcjsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG1lc3NhZ2UgIT0gTlVMTCwgRkFMU0UpOworCisgIHR5cGUgPSBmaXJzdF9hcmdfdHlwZTsKKworICBkYnVzX21lc3NhZ2VfaXRlcl9pbml0X2FwcGVuZCAobWVzc2FnZSwgJml0ZXIpOworCisgIHdoaWxlICh0eXBlICE9IERCVVNfVFlQRV9JTlZBTElEKQorICAgIHsKKyAgICAgIGlmIChkYnVzX3R5cGVfaXNfYmFzaWMgKHR5cGUpKQorICAgICAgICB7CisgICAgICAgICAgY29uc3QgREJ1c0Jhc2ljVmFsdWUgKnZhbHVlOworICAgICAgICAgIHZhbHVlID0gdmFfYXJnICh2YXJfYXJncywgY29uc3QgREJ1c0Jhc2ljVmFsdWUqKTsKKworICAgICAgICAgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljICgmaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUpKQorICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHR5cGUgPT0gREJVU19UWVBFX0FSUkFZKQorICAgICAgICB7CisgICAgICAgICAgaW50IGVsZW1lbnRfdHlwZTsKKyAgICAgICAgICBEQnVzTWVzc2FnZUl0ZXIgYXJyYXk7CisgICAgICAgICAgY2hhciBidWZbMl07CisKKyAgICAgICAgICBlbGVtZW50X3R5cGUgPSB2YV9hcmcgKHZhcl9hcmdzLCBpbnQpOworICAgICAgICAgICAgICAKKyAgICAgICAgICBidWZbMF0gPSBlbGVtZW50X3R5cGU7CisgICAgICAgICAgYnVmWzFdID0gJ1wwJzsKKyAgICAgICAgICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX29wZW5fY29udGFpbmVyICgmaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfQVJSQVksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhcnJheSkpCisgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKworICAgICAgICAgIGlmIChkYnVzX3R5cGVfaXNfZml4ZWQgKGVsZW1lbnRfdHlwZSkgJiYKKyAgICAgICAgICAgICAgZWxlbWVudF90eXBlICE9IERCVVNfVFlQRV9VTklYX0ZEKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBjb25zdCBEQnVzQmFzaWNWYWx1ZSAqKnZhbHVlOworICAgICAgICAgICAgICBpbnQgbl9lbGVtZW50czsKKworICAgICAgICAgICAgICB2YWx1ZSA9IHZhX2FyZyAodmFyX2FyZ3MsIGNvbnN0IERCdXNCYXNpY1ZhbHVlKiopOworICAgICAgICAgICAgICBuX2VsZW1lbnRzID0gdmFfYXJnICh2YXJfYXJncywgaW50KTsKKyAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2ZpeGVkX2FycmF5ICgmYXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5fZWxlbWVudHMpKSB7CisgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfYWJhbmRvbl9jb250YWluZXIgKCZpdGVyLCAmYXJyYXkpOworICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZSBpZiAoX0RCVVNfVFlQRV9JU19TVFJJTkdMSUtFIChlbGVtZW50X3R5cGUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBjb25zdCBjaGFyICoqKnZhbHVlX3A7CisgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKip2YWx1ZTsKKyAgICAgICAgICAgICAgaW50IG5fZWxlbWVudHM7CisgICAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgdmFsdWVfcCA9IHZhX2FyZyAodmFyX2FyZ3MsIGNvbnN0IGNoYXIqKiopOworICAgICAgICAgICAgICBuX2VsZW1lbnRzID0gdmFfYXJnICh2YXJfYXJncywgaW50KTsKKworICAgICAgICAgICAgICB2YWx1ZSA9ICp2YWx1ZV9wOworICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgaSA9IDA7CisgICAgICAgICAgICAgIHdoaWxlIChpIDwgbl9lbGVtZW50cykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYyAoJmFycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVbaV0pKSB7CisgICAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9pdGVyX2FiYW5kb25fY29udGFpbmVyICgmaXRlciwgJmFycmF5KTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICArK2k7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfd2FybiAoImFycmF5cyBvZiAlcyBjYW4ndCBiZSBhcHBlbmRlZCB3aXRoICVzIGZvciBub3ciLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c190eXBlX3RvX3N0cmluZyAoZWxlbWVudF90eXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX0RCVVNfRlVOQ1RJT05fTkFNRSk7CisgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9pdGVyX2FiYW5kb25fY29udGFpbmVyICgmaXRlciwgJmFycmF5KTsKKyAgICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX2Nsb3NlX2NvbnRhaW5lciAoJml0ZXIsICZhcnJheSkpCisgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgfQorI2lmbmRlZiBEQlVTX0RJU0FCTEVfQ0hFQ0tTCisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgidHlwZSAlcyBpc24ndCBzdXBwb3J0ZWQgeWV0IGluICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBfZGJ1c190eXBlX3RvX3N0cmluZyAodHlwZSksIF9EQlVTX0ZVTkNUSU9OX05BTUUpOworICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICB9CisjZW5kaWYKKworICAgICAgdHlwZSA9IHZhX2FyZyAodmFyX2FyZ3MsIGludCk7CisgICAgfQorCisgIHJldHVybiBUUlVFOworCisgZmFpbGVkOgorICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKgorICogR2V0cyBhcmd1bWVudHMgZnJvbSBhIG1lc3NhZ2UgZ2l2ZW4gYSB2YXJpYWJsZSBhcmd1bWVudCBsaXN0LiAgVGhlCisgKiBzdXBwb3J0ZWQgdHlwZXMgaW5jbHVkZSB0aG9zZSBzdXBwb3J0ZWQgYnkKKyAqIGRidXNfbWVzc2FnZV9hcHBlbmRfYXJncygpOyB0aGF0IGlzLCBiYXNpYyB0eXBlcyBhbmQgYXJyYXlzIG9mCisgKiBmaXhlZC1sZW5ndGggYmFzaWMgdHlwZXMuICBUaGUgYXJndW1lbnRzIGFyZSB0aGUgc2FtZSBhcyB0aGV5IHdvdWxkCisgKiBiZSBmb3IgZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2Jhc2ljKCkgb3IKKyAqIGRidXNfbWVzc2FnZV9pdGVyX2dldF9maXhlZF9hcnJheSgpLgorICoKKyAqIEluIGFkZGl0aW9uIHRvIHRob3NlIHR5cGVzLCBhcnJheXMgb2Ygc3RyaW5nLCBvYmplY3QgcGF0aCwgYW5kCisgKiBzaWduYXR1cmUgYXJlIHN1cHBvcnRlZDsgYnV0IHRoZXNlIGFyZSByZXR1cm5lZCBhcyBhbGxvY2F0ZWQgbWVtb3J5CisgKiBhbmQgbXVzdCBiZSBmcmVlZCB3aXRoIGRidXNfZnJlZV9zdHJpbmdfYXJyYXkoKSwgd2hpbGUgdGhlIG90aGVyCisgKiB0eXBlcyBhcmUgcmV0dXJuZWQgYXMgY29uc3QgcmVmZXJlbmNlcy4gVG8gZ2V0IGEgc3RyaW5nIGFycmF5CisgKiBwYXNzIGluICJjaGFyICoqKmFycmF5X2xvY2F0aW9uIiBhbmQgImludCAqbl9lbGVtZW50cyIuCisgKgorICogU2ltaWxhciB0byBkYnVzX21lc3NhZ2VfZ2V0X2ZpeGVkX2FycmF5KCkgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdAorICogc3VwcG9ydCBhcnJheXMgb2YgdHlwZSBEQlVTX1RZUEVfVU5JWF9GRC4gSWYgeW91IG5lZWQgdG8gcGFyc2UKKyAqIG1lc3NhZ2VzIHdpdGggYXJyYXlzIG9mIFVuaXggZmlsZSBkZXNjcmlwdG9ycyB5b3UgbmVlZCB0byByZWN1cnNlCisgKiBpbnRvIHRoZSBhcnJheSBtYW51YWxseS4KKyAqCisgKiBVbml4IGZpbGUgZGVzY3JpcHRvcnMgdGhhdCBhcmUgcmVhZCB3aXRoIHRoaXMgZnVuY3Rpb24gd2lsbCBoYXZlCisgKiB0aGUgRkRfQ0xPRVhFQyBmbGFnIHNldC4gSWYgeW91IG5lZWQgdGhlbSB3aXRob3V0IHRoaXMgZmxhZyBzZXQsCisgKiBtYWtlIHN1cmUgdG8gdW5zZXQgaXQgd2l0aCBmY250bCgpLgorICoKKyAqIFRoZSB2YXJpYWJsZSBhcmd1bWVudCBsaXN0IHNob3VsZCBjb250YWluIHRoZSB0eXBlIG9mIHRoZSBhcmd1bWVudAorICogZm9sbG93ZWQgYnkgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSB2YWx1ZSBzaG91bGQgYmUgc3RvcmVkLiBUaGUgbGlzdAorICogaXMgdGVybWluYXRlZCB3aXRoICNEQlVTX1RZUEVfSU5WQUxJRC4KKyAqCisgKiBFeGNlcHQgZm9yIHN0cmluZyBhcnJheXMsIHRoZSByZXR1cm5lZCB2YWx1ZXMgYXJlIGNvbnN0YW50OyBkbyBub3QKKyAqIGZyZWUgdGhlbS4gVGhleSBwb2ludCBpbnRvIHRoZSAjREJ1c01lc3NhZ2UuCisgKgorICogSWYgdGhlIHJlcXVlc3RlZCBhcmd1bWVudHMgYXJlIG5vdCBwcmVzZW50LCBvciBkbyBub3QgaGF2ZSB0aGUKKyAqIHJlcXVlc3RlZCB0eXBlcywgdGhlbiBhbiBlcnJvciB3aWxsIGJlIHNldC4KKyAqCisgKiBJZiBtb3JlIGFyZ3VtZW50cyB0aGFuIHJlcXVlc3RlZCBhcmUgcHJlc2VudCwgdGhlIHJlcXVlc3RlZAorICogYXJndW1lbnRzIGFyZSByZXR1cm5lZCBhbmQgdGhlIGV4dHJhIGFyZ3VtZW50cyBhcmUgaWdub3JlZC4KKyAqIAorICogQHRvZG8gc3VwcG9ydCBEQlVTX1RZUEVfU1RSVUNUIGFuZCBEQlVTX1RZUEVfVkFSSUFOVCBhbmQgY29tcGxleCBhcnJheXMKKyAqCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZQorICogQHBhcmFtIGVycm9yIGVycm9yIHRvIGJlIGZpbGxlZCBpbiBvbiBmYWlsdXJlCisgKiBAcGFyYW0gZmlyc3RfYXJnX3R5cGUgdGhlIGZpcnN0IGFyZ3VtZW50IHR5cGUKKyAqIEBwYXJhbSAuLi4gbG9jYXRpb24gZm9yIGZpcnN0IGFyZ3VtZW50IHZhbHVlLCB0aGVuIGxpc3Qgb2YgdHlwZS1sb2NhdGlvbiBwYWlycworICogQHJldHVybnMgI0ZBTFNFIGlmIHRoZSBlcnJvciB3YXMgc2V0CisgKi8KK2RidXNfYm9vbF90CitkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MgKERCdXNNZXNzYWdlICAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICplcnJvciwKKwkJICAgICAgIGludCAgICAgICAgICAgICAgZmlyc3RfYXJnX3R5cGUsCisJCSAgICAgICAuLi4pCit7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgdmFfbGlzdCB2YXJfYXJnczsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG1lc3NhZ2UgIT0gTlVMTCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2Vycm9yX2lzX3NldCAoZXJyb3IsIEZBTFNFKTsKKworICB2YV9zdGFydCAodmFyX2FyZ3MsIGZpcnN0X2FyZ190eXBlKTsKKyAgcmV0dmFsID0gZGJ1c19tZXNzYWdlX2dldF9hcmdzX3ZhbGlzdCAobWVzc2FnZSwgZXJyb3IsIGZpcnN0X2FyZ190eXBlLCB2YXJfYXJncyk7CisgIHZhX2VuZCAodmFyX2FyZ3MpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogTGlrZSBkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MgYnV0IHRha2VzIGEgdmFfbGlzdCBmb3IgdXNlIGJ5IGxhbmd1YWdlIGJpbmRpbmdzLgorICoKKyAqIEBzZWUgZGJ1c19tZXNzYWdlX2dldF9hcmdzCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZQorICogQHBhcmFtIGVycm9yIGVycm9yIHRvIGJlIGZpbGxlZCBpbgorICogQHBhcmFtIGZpcnN0X2FyZ190eXBlIHR5cGUgb2YgdGhlIGZpcnN0IGFyZ3VtZW50CisgKiBAcGFyYW0gdmFyX2FyZ3MgcmV0dXJuIGxvY2F0aW9uIGZvciBmaXJzdCBhcmd1bWVudCwgZm9sbG93ZWQgYnkgbGlzdCBvZiB0eXBlL2xvY2F0aW9uIHBhaXJzCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgZXJyb3Igd2FzIHNldAorICovCitkYnVzX2Jvb2xfdAorZGJ1c19tZXNzYWdlX2dldF9hcmdzX3ZhbGlzdCAoREJ1c01lc3NhZ2UgICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICplcnJvciwKKwkJCSAgICAgIGludCAgICAgICAgICAgICAgZmlyc3RfYXJnX3R5cGUsCisJCQkgICAgICB2YV9saXN0ICAgICAgICAgIHZhcl9hcmdzKQoreworICBEQnVzTWVzc2FnZUl0ZXIgaXRlcjsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG1lc3NhZ2UgIT0gTlVMTCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2Vycm9yX2lzX3NldCAoZXJyb3IsIEZBTFNFKTsKKworICBkYnVzX21lc3NhZ2VfaXRlcl9pbml0IChtZXNzYWdlLCAmaXRlcik7CisgIHJldHVybiBfZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2FyZ3NfdmFsaXN0ICgmaXRlciwgZXJyb3IsIGZpcnN0X2FyZ190eXBlLCB2YXJfYXJncyk7Cit9CisKK3N0YXRpYyB2b2lkCitfZGJ1c19tZXNzYWdlX2l0ZXJfaW5pdF9jb21tb24gKERCdXNNZXNzYWdlICAgICAgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlUmVhbEl0ZXIgKnJlYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgIGl0ZXJfdHlwZSkKK3sKKyAgLyogSWYgdGhlc2Ugc3RhdGljIGFzc2VydGlvbnMgZmFpbCBvbiB5b3VyIHBsYXRmb3JtLCByZXBvcnQgaXQgYXMgYSBidWcuICovCisgIF9EQlVTX1NUQVRJQ19BU1NFUlQgKHNpemVvZiAoREJ1c01lc3NhZ2VSZWFsSXRlcikgPD0gc2l6ZW9mIChEQnVzTWVzc2FnZUl0ZXIpKTsKKyAgX0RCVVNfU1RBVElDX0FTU0VSVCAoX0RCVVNfQUxJR05PRiAoREJ1c01lc3NhZ2VSZWFsSXRlcikgPD0KKyAgICAgIF9EQlVTX0FMSUdOT0YgKERCdXNNZXNzYWdlSXRlcikpOworICAvKiBBIGZhaWx1cmUgb2YgdGhlc2UgdHdvIGFzc2VydGlvbnMgd291bGQgaW5kaWNhdGUgdGhhdCB3ZSd2ZSBicm9rZW4KKyAgICogQUJJIG9uIHRoaXMgcGxhdGZvcm0gc2luY2UgMS4xMC4wLiAqLworICBfREJVU19TVEFUSUNfQVNTRVJUIChzaXplb2YgKERCdXNNZXNzYWdlSXRlcl8xXzEwXzApID09CisgICAgICBzaXplb2YgKERCdXNNZXNzYWdlSXRlcikpOworICBfREJVU19TVEFUSUNfQVNTRVJUIChfREJVU19BTElHTk9GIChEQnVzTWVzc2FnZUl0ZXJfMV8xMF8wKSA9PQorICAgICAgX0RCVVNfQUxJR05PRiAoREJ1c01lc3NhZ2VJdGVyKSk7CisgIC8qIElmIHRoaXMgc3RhdGljIGFzc2VydGlvbiBmYWlscywgaXQgbWVhbnMgdGhlIERCdXNNZXNzYWdlSXRlciBzdHJ1Y3QKKyAgICogaXMgbm90ICJwYWNrZWQiLCB3aGljaCBtaWdodCByZXN1bHQgaW4gIml0ZXIgPSBvdGhlcl9pdGVyIiBub3QgY29weWluZworICAgKiBldmVyeSBieXRlLiAqLworICBfREJVU19TVEFUSUNfQVNTRVJUIChzaXplb2YgKERCdXNNZXNzYWdlSXRlcikgPT0KKyAgICAgIDQgKiBzaXplb2YgKHZvaWQgKikgKyBzaXplb2YgKGRidXNfdWludDMyX3QpICsgOSAqIHNpemVvZiAoaW50KSk7CisKKyAgLyogU2luY2UgdGhlIGl0ZXJhdG9yIHdpbGwgcmVhZCBvciB3cml0ZSB3aG8ta25vd3Mtd2hhdCBmcm9tIHRoZQorICAgKiBtZXNzYWdlLCB3ZSBuZWVkIHRvIGdldCBpbiB0aGUgcmlnaHQgYnl0ZSBvcmRlcgorICAgKi8KKyAgZW5zdXJlX2J5dGVfb3JkZXIgKG1lc3NhZ2UpOworICAKKyAgcmVhbC0+bWVzc2FnZSA9IG1lc3NhZ2U7CisgIHJlYWwtPmNoYW5nZWRfc3RhbXAgPSBtZXNzYWdlLT5jaGFuZ2VkX3N0YW1wOworICByZWFsLT5pdGVyX3R5cGUgPSBpdGVyX3R5cGU7CisgIHJlYWwtPnNpZ19yZWZjb3VudCA9IDA7Cit9CisKKy8qKgorICogSW5pdGlhbGl6ZXMgYSAjREJ1c01lc3NhZ2VJdGVyIGZvciByZWFkaW5nIHRoZSBhcmd1bWVudHMgb2YgdGhlCisgKiBtZXNzYWdlIHBhc3NlZCBpbi4KKyAqCisgKiBXaGVuIHBvc3NpYmxlLCBkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MoKSBpcyBtdWNoIG1vcmUgY29udmVuaWVudC4KKyAqIFNvbWUgdHlwZXMgb2YgYXJndW1lbnQgY2FuIG9ubHkgYmUgcmVhZCB3aXRoICNEQnVzTWVzc2FnZUl0ZXIKKyAqIGhvd2V2ZXIuCisgKgorICogVGhlIGVhc2llc3Qgd2F5IHRvIGl0ZXJhdGUgaXMgbGlrZSB0aGlzOiAKKyAqIEBjb2RlCisgKiBkYnVzX21lc3NhZ2VfaXRlcl9pbml0IChtZXNzYWdlLCAmaXRlcik7CisgKiB3aGlsZSAoKGN1cnJlbnRfdHlwZSA9IGRidXNfbWVzc2FnZV9pdGVyX2dldF9hcmdfdHlwZSAoJml0ZXIpKSAhPSBEQlVTX1RZUEVfSU5WQUxJRCkKKyAqICAgZGJ1c19tZXNzYWdlX2l0ZXJfbmV4dCAoJml0ZXIpOworICogQGVuZGNvZGUKKyAqCisgKiAjREJ1c01lc3NhZ2VJdGVyIGNvbnRhaW5zIG5vIGFsbG9jYXRlZCBtZW1vcnk7IGl0IG5lZWQgbm90IGJlCisgKiBmcmVlZCwgYW5kIGNhbiBiZSBjb3BpZWQgYnkgYXNzaWdubWVudCBvciBtZW1jcHkoKS4KKyAqIAorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UKKyAqIEBwYXJhbSBpdGVyIHBvaW50ZXIgdG8gYW4gaXRlcmF0b3IgdG8gaW5pdGlhbGl6ZQorICogQHJldHVybnMgI0ZBTFNFIGlmIHRoZSBtZXNzYWdlIGhhcyBubyBhcmd1bWVudHMKKyAqLworZGJ1c19ib29sX3QKK2RidXNfbWVzc2FnZV9pdGVyX2luaXQgKERCdXNNZXNzYWdlICAgICAqbWVzc2FnZSwKKwkJCURCdXNNZXNzYWdlSXRlciAqaXRlcikKK3sKKyAgREJ1c01lc3NhZ2VSZWFsSXRlciAqcmVhbCA9IChEQnVzTWVzc2FnZVJlYWxJdGVyICopaXRlcjsKKyAgY29uc3QgREJ1c1N0cmluZyAqdHlwZV9zdHI7CisgIGludCB0eXBlX3BvczsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG1lc3NhZ2UgIT0gTlVMTCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGl0ZXIgIT0gTlVMTCwgRkFMU0UpOworCisgIGdldF9jb25zdF9zaWduYXR1cmUgKCZtZXNzYWdlLT5oZWFkZXIsICZ0eXBlX3N0ciwgJnR5cGVfcG9zKTsKKworICBfZGJ1c19tZXNzYWdlX2l0ZXJfaW5pdF9jb21tb24gKG1lc3NhZ2UsIHJlYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19NRVNTQUdFX0lURVJfVFlQRV9SRUFERVIpOworCisgIF9kYnVzX3R5cGVfcmVhZGVyX2luaXQgKCZyZWFsLT51LnJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfaGVhZGVyX2dldF9ieXRlX29yZGVyICgmbWVzc2FnZS0+aGVhZGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZV9zdHIsIHR5cGVfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVzc2FnZS0+Ym9keSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisKKyAgcmV0dXJuIF9kYnVzX3R5cGVfcmVhZGVyX2dldF9jdXJyZW50X3R5cGUgKCZyZWFsLT51LnJlYWRlcikgIT0gREJVU19UWVBFX0lOVkFMSUQ7Cit9CisKKy8qKgorICogQ2hlY2tzIGlmIGFuIGl0ZXJhdG9yIGhhcyBhbnkgbW9yZSBmaWVsZHMuCisgKgorICogQHBhcmFtIGl0ZXIgdGhlIG1lc3NhZ2UgaXRlcgorICogQHJldHVybnMgI1RSVUUgaWYgdGhlcmUgYXJlIG1vcmUgZmllbGRzIGZvbGxvd2luZworICovCitkYnVzX2Jvb2xfdAorZGJ1c19tZXNzYWdlX2l0ZXJfaGFzX25leHQgKERCdXNNZXNzYWdlSXRlciAqaXRlcikKK3sKKyAgREJ1c01lc3NhZ2VSZWFsSXRlciAqcmVhbCA9IChEQnVzTWVzc2FnZVJlYWxJdGVyICopaXRlcjsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKF9kYnVzX21lc3NhZ2VfaXRlcl9jaGVjayAocmVhbCksIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChyZWFsLT5pdGVyX3R5cGUgPT0gREJVU19NRVNTQUdFX0lURVJfVFlQRV9SRUFERVIsIEZBTFNFKTsKKworICByZXR1cm4gX2RidXNfdHlwZV9yZWFkZXJfaGFzX25leHQgKCZyZWFsLT51LnJlYWRlcik7Cit9CisKKy8qKgorICogTW92ZXMgdGhlIGl0ZXJhdG9yIHRvIHRoZSBuZXh0IGZpZWxkLCBpZiBhbnkuIElmIHRoZXJlJ3Mgbm8gbmV4dAorICogZmllbGQsIHJldHVybnMgI0ZBTFNFLiBJZiB0aGUgaXRlcmF0b3IgbW92ZXMgZm9yd2FyZCwgcmV0dXJucworICogI1RSVUUuCisgKgorICogQHBhcmFtIGl0ZXIgdGhlIG1lc3NhZ2UgaXRlcgorICogQHJldHVybnMgI1RSVUUgaWYgdGhlIGl0ZXJhdG9yIHdhcyBtb3ZlZCB0byB0aGUgbmV4dCBmaWVsZAorICovCitkYnVzX2Jvb2xfdAorZGJ1c19tZXNzYWdlX2l0ZXJfbmV4dCAoREJ1c01lc3NhZ2VJdGVyICppdGVyKQoreworICBEQnVzTWVzc2FnZVJlYWxJdGVyICpyZWFsID0gKERCdXNNZXNzYWdlUmVhbEl0ZXIgKilpdGVyOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoX2RidXNfbWVzc2FnZV9pdGVyX2NoZWNrIChyZWFsKSwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHJlYWwtPml0ZXJfdHlwZSA9PSBEQlVTX01FU1NBR0VfSVRFUl9UWVBFX1JFQURFUiwgRkFMU0UpOworCisgIHJldHVybiBfZGJ1c190eXBlX3JlYWRlcl9uZXh0ICgmcmVhbC0+dS5yZWFkZXIpOworfQorCisvKioKKyAqIFJldHVybnMgdGhlIGFyZ3VtZW50IHR5cGUgb2YgdGhlIGFyZ3VtZW50IHRoYXQgdGhlIG1lc3NhZ2UgaXRlcmF0b3IKKyAqIHBvaW50cyB0by4gSWYgdGhlIGl0ZXJhdG9yIGlzIGF0IHRoZSBlbmQgb2YgdGhlIG1lc3NhZ2UsIHJldHVybnMKKyAqICNEQlVTX1RZUEVfSU5WQUxJRC4gWW91IGNhbiB0aHVzIHdyaXRlIGEgbG9vcCBhcyBmb2xsb3dzOgorICoKKyAqIEBjb2RlCisgKiBkYnVzX21lc3NhZ2VfaXRlcl9pbml0IChtZXNzYWdlLCAmaXRlcik7CisgKiB3aGlsZSAoKGN1cnJlbnRfdHlwZSA9IGRidXNfbWVzc2FnZV9pdGVyX2dldF9hcmdfdHlwZSAoJml0ZXIpKSAhPSBEQlVTX1RZUEVfSU5WQUxJRCkKKyAqICAgZGJ1c19tZXNzYWdlX2l0ZXJfbmV4dCAoJml0ZXIpOworICogQGVuZGNvZGUKKyAqCisgKiBAcGFyYW0gaXRlciB0aGUgbWVzc2FnZSBpdGVyCisgKiBAcmV0dXJucyB0aGUgYXJndW1lbnQgdHlwZQorICovCitpbnQKK2RidXNfbWVzc2FnZV9pdGVyX2dldF9hcmdfdHlwZSAoREJ1c01lc3NhZ2VJdGVyICppdGVyKQoreworICBEQnVzTWVzc2FnZVJlYWxJdGVyICpyZWFsID0gKERCdXNNZXNzYWdlUmVhbEl0ZXIgKilpdGVyOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoX2RidXNfbWVzc2FnZV9pdGVyX2NoZWNrIChyZWFsKSwgREJVU19UWVBFX0lOVkFMSUQpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHJlYWwtPml0ZXJfdHlwZSA9PSBEQlVTX01FU1NBR0VfSVRFUl9UWVBFX1JFQURFUiwgRkFMU0UpOworCisgIHJldHVybiBfZGJ1c190eXBlX3JlYWRlcl9nZXRfY3VycmVudF90eXBlICgmcmVhbC0+dS5yZWFkZXIpOworfQorCisvKioKKyAqIFJldHVybnMgdGhlIGVsZW1lbnQgdHlwZSBvZiB0aGUgYXJyYXkgdGhhdCB0aGUgbWVzc2FnZSBpdGVyYXRvcgorICogcG9pbnRzIHRvLiBOb3RlIHRoYXQgeW91IG5lZWQgdG8gY2hlY2sgdGhhdCB0aGUgaXRlcmF0b3IgcG9pbnRzIHRvCisgKiBhbiBhcnJheSBwcmlvciB0byB1c2luZyB0aGlzIGZ1bmN0aW9uLgorICoKKyAqIEBwYXJhbSBpdGVyIHRoZSBtZXNzYWdlIGl0ZXIKKyAqIEByZXR1cm5zIHRoZSBhcnJheSBlbGVtZW50IHR5cGUKKyAqLworaW50CitkYnVzX21lc3NhZ2VfaXRlcl9nZXRfZWxlbWVudF90eXBlIChEQnVzTWVzc2FnZUl0ZXIgKml0ZXIpCit7CisgIERCdXNNZXNzYWdlUmVhbEl0ZXIgKnJlYWwgPSAoREJ1c01lc3NhZ2VSZWFsSXRlciAqKWl0ZXI7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChfZGJ1c19tZXNzYWdlX2l0ZXJfY2hlY2sgKHJlYWwpLCBEQlVTX1RZUEVfSU5WQUxJRCk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAocmVhbC0+aXRlcl90eXBlID09IERCVVNfTUVTU0FHRV9JVEVSX1RZUEVfUkVBREVSLCBEQlVTX1RZUEVfSU5WQUxJRCk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2FyZ190eXBlIChpdGVyKSA9PSBEQlVTX1RZUEVfQVJSQVksIERCVVNfVFlQRV9JTlZBTElEKTsKKworICByZXR1cm4gX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2VsZW1lbnRfdHlwZSAoJnJlYWwtPnUucmVhZGVyKTsKK30KKworLyoqCisgKiBSZWN1cnNlcyBpbnRvIGEgY29udGFpbmVyIHZhbHVlIHdoZW4gcmVhZGluZyB2YWx1ZXMgZnJvbSBhIG1lc3NhZ2UsCisgKiBpbml0aWFsaXppbmcgYSBzdWItaXRlcmF0b3IgdG8gdXNlIGZvciB0cmF2ZXJzaW5nIHRoZSBjaGlsZCB2YWx1ZXMKKyAqIG9mIHRoZSBjb250YWluZXIuCisgKgorICogTm90ZSB0aGF0IHRoaXMgcmVjdXJzZXMgaW50byBhIHZhbHVlLCBub3QgYSB0eXBlLCBzbyB5b3UgY2FuIG9ubHkKKyAqIHJlY3Vyc2UgaWYgdGhlIHZhbHVlIGV4aXN0cy4gVGhlIG1haW4gaW1wbGljYXRpb24gb2YgdGhpcyBpcyB0aGF0CisgKiBpZiB5b3UgaGF2ZSBmb3IgZXhhbXBsZSBhbiBlbXB0eSBhcnJheSBvZiBhcnJheSBvZiBpbnQzMiwgeW91IGNhbgorICogcmVjdXJzZSBpbnRvIHRoZSBvdXRlcm1vc3QgYXJyYXksIGJ1dCBpdCB3aWxsIGhhdmUgbm8gdmFsdWVzLCBzbworICogeW91IHdvbid0IGJlIGFibGUgdG8gcmVjdXJzZSBmdXJ0aGVyLiBUaGVyZSdzIG5vIGFycmF5IG9mIGludDMyIHRvCisgKiByZWN1cnNlIGludG8uCisgKgorICogSWYgYSBjb250YWluZXIgaXMgYW4gYXJyYXkgb2YgZml4ZWQtbGVuZ3RoIHR5cGVzIChleGNlcHQgVW5peCBmaWxlCisgKiBkZXNjcmlwdG9ycyksIGl0IGlzIG11Y2ggbW9yZSBlZmZpY2llbnQgdG8gdXNlCisgKiBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfZml4ZWRfYXJyYXkoKSB0byBnZXQgdGhlIHdob2xlIGFycmF5IGluIG9uZQorICogc2hvdCwgcmF0aGVyIHRoYW4gaW5kaXZpZHVhbGx5IHdhbGtpbmcgb3ZlciB0aGUgYXJyYXkgZWxlbWVudHMuCisgKgorICogQmUgc3VyZSB5b3UgaGF2ZSBzb21laG93IGNoZWNrZWQgdGhhdAorICogZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2FyZ190eXBlKCkgbWF0Y2hlcyB0aGUgdHlwZSB5b3UgYXJlIGV4cGVjdGluZworICogdG8gcmVjdXJzZSBpbnRvLiBSZXN1bHRzIG9mIHRoaXMgZnVuY3Rpb24gYXJlIHVuZGVmaW5lZCBpZiB0aGVyZSBpcworICogbm8gY29udGFpbmVyIHRvIHJlY3Vyc2UgaW50byBhdCB0aGUgY3VycmVudCBpdGVyYXRvciBwb3NpdGlvbi4KKyAqCisgKiBAcGFyYW0gaXRlciB0aGUgbWVzc2FnZSBpdGVyYXRvcgorICogQHBhcmFtIHN1YiB0aGUgc3ViLWl0ZXJhdG9yIHRvIGluaXRpYWxpemUKKyAqLwordm9pZAorZGJ1c19tZXNzYWdlX2l0ZXJfcmVjdXJzZSAoREJ1c01lc3NhZ2VJdGVyICAqaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlSXRlciAgKnN1YikKK3sKKyAgREJ1c01lc3NhZ2VSZWFsSXRlciAqcmVhbCA9IChEQnVzTWVzc2FnZVJlYWxJdGVyICopaXRlcjsKKyAgREJ1c01lc3NhZ2VSZWFsSXRlciAqcmVhbF9zdWIgPSAoREJ1c01lc3NhZ2VSZWFsSXRlciAqKXN1YjsKKworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAoX2RidXNfbWVzc2FnZV9pdGVyX2NoZWNrIChyZWFsKSk7CisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChzdWIgIT0gTlVMTCk7CisKKyAgKnJlYWxfc3ViID0gKnJlYWw7CisgIF9kYnVzX3R5cGVfcmVhZGVyX3JlY3Vyc2UgKCZyZWFsLT51LnJlYWRlciwgJnJlYWxfc3ViLT51LnJlYWRlcik7Cit9CisKKy8qKgorICogUmV0dXJucyB0aGUgY3VycmVudCBzaWduYXR1cmUgb2YgYSBtZXNzYWdlIGl0ZXJhdG9yLiAgVGhpcworICogaXMgdXNlZnVsIHByaW1hcmlseSBmb3IgZGVhbGluZyB3aXRoIHZhcmlhbnRzOyBvbmUgY2FuCisgKiByZWN1cnNlIGludG8gYSB2YXJpYW50IGFuZCBkZXRlcm1pbmUgdGhlIHNpZ25hdHVyZSBvZgorICogdGhlIHZhcmlhbnQncyB2YWx1ZS4KKyAqCisgKiBUaGUgcmV0dXJuZWQgc3RyaW5nIG11c3QgYmUgZnJlZWQgd2l0aCBkYnVzX2ZyZWUoKS4KKyAqIAorICogQHBhcmFtIGl0ZXIgdGhlIG1lc3NhZ2UgaXRlcmF0b3IKKyAqIEByZXR1cm5zIHRoZSBjb250YWluZWQgc2lnbmF0dXJlLCBvciBOVUxMIGlmIG91dCBvZiBtZW1vcnkKKyAqLworY2hhciAqCitkYnVzX21lc3NhZ2VfaXRlcl9nZXRfc2lnbmF0dXJlIChEQnVzTWVzc2FnZUl0ZXIgKml0ZXIpCit7CisgIGNvbnN0IERCdXNTdHJpbmcgKnNpZzsKKyAgREJ1c1N0cmluZyByZXRzdHI7CisgIGNoYXIgKnJldDsKKyAgaW50IHN0YXJ0LCBsZW47CisgIERCdXNNZXNzYWdlUmVhbEl0ZXIgKnJlYWwgPSAoREJ1c01lc3NhZ2VSZWFsSXRlciAqKWl0ZXI7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChfZGJ1c19tZXNzYWdlX2l0ZXJfY2hlY2sgKHJlYWwpLCBOVUxMKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmcmV0c3RyKSkKKyAgICByZXR1cm4gTlVMTDsKKworICBfZGJ1c190eXBlX3JlYWRlcl9nZXRfc2lnbmF0dXJlICgmcmVhbC0+dS5yZWFkZXIsICZzaWcsCisJCQkJICAgJnN0YXJ0LCAmbGVuKTsKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX2xlbiAoJnJldHN0ciwKKwkJCQlfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKHNpZykgKyBzdGFydCwKKwkJCQlsZW4pKQorICAgIHJldHVybiBOVUxMOworICBpZiAoIV9kYnVzX3N0cmluZ19zdGVhbF9kYXRhICgmcmV0c3RyLCAmcmV0KSkKKyAgICByZXR1cm4gTlVMTDsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZyZXRzdHIpOworICByZXR1cm4gcmV0OworfQorCisvKioKKyAqIFJlYWRzIGEgYmFzaWMtdHlwZWQgdmFsdWUgZnJvbSB0aGUgbWVzc2FnZSBpdGVyYXRvci4KKyAqIEJhc2ljIHR5cGVzIGFyZSB0aGUgbm9uLWNvbnRhaW5lcnMgc3VjaCBhcyBpbnRlZ2VyIGFuZCBzdHJpbmcuCisgKgorICogVGhlIHZhbHVlIGFyZ3VtZW50IHNob3VsZCBiZSB0aGUgYWRkcmVzcyBvZiBhIGxvY2F0aW9uIHRvIHN0b3JlCisgKiB0aGUgcmV0dXJuZWQgdmFsdWUuIFNvIGZvciBpbnQzMiBpdCBzaG91bGQgYmUgYSAiZGJ1c19pbnQzMl90KiIKKyAqIGFuZCBmb3Igc3RyaW5nIGEgImNvbnN0IGNoYXIqKiIuIFRoZSByZXR1cm5lZCB2YWx1ZSBpcworICogYnkgcmVmZXJlbmNlIGFuZCBzaG91bGQgbm90IGJlIGZyZWVkLgorICoKKyAqIFRoaXMgY2FsbCBkdXBsaWNhdGVzIFVuaXggZmlsZSBkZXNjcmlwdG9ycyB3aGVuIHJlYWRpbmcgdGhlbS4gSXQgaXMKKyAqIHlvdXIgam9iIHRvIGNsb3NlIHRoZW0gd2hlbiB5b3UgZG9uJ3QgbmVlZCB0aGVtIGFueW1vcmUuCisgKgorICogVW5peCBmaWxlIGRlc2NyaXB0b3JzIHRoYXQgYXJlIHJlYWQgd2l0aCB0aGlzIGZ1bmN0aW9uIHdpbGwgaGF2ZQorICogdGhlIEZEX0NMT0VYRUMgZmxhZyBzZXQuIElmIHlvdSBuZWVkIHRoZW0gd2l0aG91dCB0aGlzIGZsYWcgc2V0LAorICogbWFrZSBzdXJlIHRvIHVuc2V0IGl0IHdpdGggZmNudGwoKS4KKyAqCisgKiBCZSBzdXJlIHlvdSBoYXZlIHNvbWVob3cgY2hlY2tlZCB0aGF0CisgKiBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJnX3R5cGUoKSBtYXRjaGVzIHRoZSB0eXBlIHlvdSBhcmUKKyAqIGV4cGVjdGluZywgb3IgeW91J2xsIGNyYXNoIHdoZW4geW91IHRyeSB0byB1c2UgYW4gaW50ZWdlciBhcyBhCisgKiBzdHJpbmcgb3Igc29tZXRoaW5nLgorICoKKyAqIFRvIHJlYWQgYW55IGNvbnRhaW5lciB0eXBlIChhcnJheSwgc3RydWN0LCBkaWN0KSB5b3Ugd2lsbCBuZWVkIHRvCisgKiByZWN1cnNlIGludG8gdGhlIGNvbnRhaW5lciB3aXRoIGRidXNfbWVzc2FnZV9pdGVyX3JlY3Vyc2UoKS4gIElmCisgKiB0aGUgY29udGFpbmVyIGlzIGFuIGFycmF5IG9mIGZpeGVkLWxlbmd0aCB2YWx1ZXMgKGV4Y2VwdCBVbml4IGZpbGUKKyAqIGRlc2NyaXB0b3JzKSwgeW91IGNhbiBnZXQgYWxsIHRoZSBhcnJheSBlbGVtZW50cyBhdCBvbmNlIHdpdGgKKyAqIGRidXNfbWVzc2FnZV9pdGVyX2dldF9maXhlZF9hcnJheSgpLiBPdGhlcndpc2UsIHlvdSBoYXZlIHRvIGl0ZXJhdGUKKyAqIG92ZXIgdGhlIGNvbnRhaW5lcidzIGNvbnRlbnRzIG9uZSB2YWx1ZSBhdCBhIHRpbWUuCisgKgorICogQWxsIGJhc2ljLXR5cGVkIHZhbHVlcyBhcmUgZ3VhcmFudGVlZCB0byBmaXQgaW4gYSAjREJ1c0Jhc2ljVmFsdWUsCisgKiBzbyBpbiB2ZXJzaW9ucyBvZiBsaWJkYnVzIHRoYXQgaGF2ZSB0aGF0IHR5cGUsIHlvdSBjYW4gd3JpdGUgY29kZSBsaWtlIHRoaXM6CisgKgorICogQGNvZGUKKyAqIERCdXNCYXNpY1ZhbHVlIHZhbHVlOworICogaW50IHR5cGU7CisgKiBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYmFzaWMgKCZyZWFkX2l0ZXIsICZ2YWx1ZSk7CisgKiB0eXBlID0gZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2FyZ190eXBlICgmcmVhZF9pdGVyKTsKKyAqIGRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYyAoJndyaXRlX2l0ZXIsIHR5cGUsICZ2YWx1ZSk7CisgKiBAZW5kY29kZQorICoKKyAqIChBbGwgRC1CdXMgYmFzaWMgdHlwZXMgYXJlIGVpdGhlciBudW1lcmljIGFuZCA4IGJ5dGVzIG9yIHNtYWxsZXIsIG9yCisgKiBiZWhhdmUgbGlrZSBhIHN0cmluZzsgc28gaW4gb2xkZXIgdmVyc2lvbnMgb2YgbGliZGJ1cywgREJ1c0Jhc2ljVmFsdWUKKyAqIGNhbiBiZSByZXBsYWNlZCB3aXRoIHVuaW9uIHsgY2hhciAqc3RyaW5nOyB1bnNpZ25lZCBjaGFyIGJ5dGVzWzhdOyB9LAorICogZm9yIGluc3RhbmNlLikKKyAqCisgKiBAcGFyYW0gaXRlciB0aGUgaXRlcmF0b3IKKyAqIEBwYXJhbSB2YWx1ZSBsb2NhdGlvbiB0byBzdG9yZSB0aGUgdmFsdWUKKyAqLwordm9pZAorZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2Jhc2ljIChEQnVzTWVzc2FnZUl0ZXIgICppdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICp2YWx1ZSkKK3sKKyAgREJ1c01lc3NhZ2VSZWFsSXRlciAqcmVhbCA9IChEQnVzTWVzc2FnZVJlYWxJdGVyICopaXRlcjsKKworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAoX2RidXNfbWVzc2FnZV9pdGVyX2NoZWNrIChyZWFsKSk7CisgIF9kYnVzX3JldHVybl9pZl9mYWlsICh2YWx1ZSAhPSBOVUxMKTsKKworICBpZiAoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2FyZ190eXBlIChpdGVyKSA9PSBEQlVTX1RZUEVfVU5JWF9GRCkKKyAgICB7CisjaWZkZWYgSEFWRV9VTklYX0ZEX1BBU1NJTkcKKyAgICAgIERCdXNCYXNpY1ZhbHVlIGlkeDsKKworICAgICAgX2RidXNfdHlwZV9yZWFkZXJfcmVhZF9iYXNpYygmcmVhbC0+dS5yZWFkZXIsICZpZHgpOworCisgICAgICBpZiAoaWR4LnUzMiA+PSByZWFsLT5tZXNzYWdlLT5uX3VuaXhfZmRzKSB7CisgICAgICAgIC8qIEhtbSwgd2UgY2Fubm90IHJlYWxseSBzaWduYWwgYW4gZXJyb3IgaGVyZSwgc28gbGV0J3MgbWFrZQorICAgICAgICAgICBzdXJlIHRvIHJldHVybiBhbiBpbnZhbGlkIGZkLiAqLworICAgICAgICAqKChpbnQqKSB2YWx1ZSkgPSAtMTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICAqKChpbnQqKSB2YWx1ZSkgPSBfZGJ1c19kdXAocmVhbC0+bWVzc2FnZS0+dW5peF9mZHNbaWR4LnUzMl0sIE5VTEwpOworI2Vsc2UKKyAgICAgICooKGludCopIHZhbHVlKSA9IC0xOworI2VuZGlmCisgICAgfQorICBlbHNlCisgICAgeworICAgICAgX2RidXNfdHlwZV9yZWFkZXJfcmVhZF9iYXNpYyAoJnJlYWwtPnUucmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUpOworICAgIH0KK30KKworLyoqCisgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGFycmF5LXR5cGVkIHZhbHVlIHBvaW50ZWQKKyAqIHRvIGJ5IHRoZSBpdGVyYXRvci4KKyAqIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIGlzIE8oMSkgZm9yIGFycmF5cyBvZiBmaXhlZC1zaXplIHR5cGVzCisgKiBidXQgTyhuKSBmb3IgYXJyYXlzIG9mIHZhcmlhYmxlLWxlbmd0aCB0eXBlcyBzdWNoIGFzIHN0cmluZ3MsCisgKiBzbyBpdCBtYXkgYmUgYSBiYWQgaWRlYSB0byB1c2UgaXQuCisgKgorICogQHBhcmFtIGl0ZXIgdGhlIGl0ZXJhdG9yCisgKiBAcmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBhcnJheQorICovCitpbnQKK2RidXNfbWVzc2FnZV9pdGVyX2dldF9lbGVtZW50X2NvdW50IChEQnVzTWVzc2FnZUl0ZXIgKml0ZXIpCit7CisgIERCdXNNZXNzYWdlUmVhbEl0ZXIgKnJlYWwgPSAoREJ1c01lc3NhZ2VSZWFsSXRlciAqKWl0ZXI7CisgIERCdXNUeXBlUmVhZGVyIGFycmF5OworICBpbnQgZWxlbWVudF90eXBlOworICBpbnQgbl9lbGVtZW50cyA9IDA7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChfZGJ1c19tZXNzYWdlX2l0ZXJfY2hlY2sgKHJlYWwpLCAwKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChfZGJ1c190eXBlX3JlYWRlcl9nZXRfY3VycmVudF90eXBlICgmcmVhbC0+dS5yZWFkZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gREJVU19UWVBFX0FSUkFZLCAwKTsKKworICBlbGVtZW50X3R5cGUgPSBfZGJ1c190eXBlX3JlYWRlcl9nZXRfZWxlbWVudF90eXBlICgmcmVhbC0+dS5yZWFkZXIpOworICBfZGJ1c190eXBlX3JlYWRlcl9yZWN1cnNlICgmcmVhbC0+dS5yZWFkZXIsICZhcnJheSk7CisgIGlmIChkYnVzX3R5cGVfaXNfZml4ZWQgKGVsZW1lbnRfdHlwZSkpCisgICAgeworICAgICAgaW50IGFsaWdubWVudCA9IF9kYnVzX3R5cGVfZ2V0X2FsaWdubWVudCAoZWxlbWVudF90eXBlKTsKKyAgICAgIGludCB0b3RhbF9sZW4gPSBfZGJ1c190eXBlX3JlYWRlcl9nZXRfYXJyYXlfbGVuZ3RoICgmYXJyYXkpOworICAgICAgbl9lbGVtZW50cyA9IHRvdGFsX2xlbiAvIGFsaWdubWVudDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICB3aGlsZSAoX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2N1cnJlbnRfdHlwZSAoJmFycmF5KSAhPSBEQlVTX1RZUEVfSU5WQUxJRCkKKyAgICAgICAgeworICAgICAgICAgICsrbl9lbGVtZW50czsKKyAgICAgICAgICBfZGJ1c190eXBlX3JlYWRlcl9uZXh0ICgmYXJyYXkpOworICAgICAgICB9CisgICAgfQorCisgICByZXR1cm4gbl9lbGVtZW50czsKK30KKworLyoqCisgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGFycmF5IGFzIG1hcnNoYWxlZCBpbiB0aGUgd2lyZQorICogcHJvdG9jb2wuIFRoZSBpdGVyYXRvciBtdXN0IGN1cnJlbnRseSBiZSBpbnNpZGUgYW4gYXJyYXktdHlwZWQKKyAqIHZhbHVlLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgZGVwcmVjYXRlZCBvbiB0aGUgZ3JvdW5kcyB0aGF0IGl0IGlzIHN0dXBpZC4gIFdoeQorICogd291bGQgeW91IHdhbnQgdG8ga25vdyBob3cgbWFueSBieXRlcyBhcmUgaW4gdGhlIGFycmF5IGFzIG1hcnNoYWxlZAorICogaW4gdGhlIHdpcmUgcHJvdG9jb2w/ICBVc2UgZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2VsZW1lbnRfY291bnQoKSBpbnN0ZWFkLgorICoKKyAqIEBwYXJhbSBpdGVyIHRoZSBpdGVyYXRvcgorICogQHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUgYXJyYXkKKyAqLworaW50CitkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJyYXlfbGVuIChEQnVzTWVzc2FnZUl0ZXIgKml0ZXIpCit7CisgIERCdXNNZXNzYWdlUmVhbEl0ZXIgKnJlYWwgPSAoREJ1c01lc3NhZ2VSZWFsSXRlciAqKWl0ZXI7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChfZGJ1c19tZXNzYWdlX2l0ZXJfY2hlY2sgKHJlYWwpLCAwKTsKKworICByZXR1cm4gX2RidXNfdHlwZV9yZWFkZXJfZ2V0X2FycmF5X2xlbmd0aCAoJnJlYWwtPnUucmVhZGVyKTsKK30KKworLyoqCisgKiBSZWFkcyBhIGJsb2NrIG9mIGZpeGVkLWxlbmd0aCB2YWx1ZXMgZnJvbSB0aGUgbWVzc2FnZSBpdGVyYXRvci4KKyAqIEZpeGVkLWxlbmd0aCB2YWx1ZXMgYXJlIHRob3NlIGJhc2ljIHR5cGVzIHRoYXQgYXJlIG5vdCBzdHJpbmctbGlrZSwKKyAqIHN1Y2ggYXMgaW50ZWdlcnMsIGJvb2wsIGRvdWJsZS4gVGhlIHJldHVybmVkIGJsb2NrIHdpbGwgYmUgZnJvbSB0aGUKKyAqIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIGFycmF5IHVudGlsIHRoZSBlbmQgb2YgdGhlIGFycmF5LgorICoKKyAqIFRoZXJlIGlzIG9uZSBleGNlcHRpb24gaGVyZTogYWx0aG91Z2ggREJVU19UWVBFX1VOSVhfRkQgaXMKKyAqIGNvbnNpZGVyZWQgYSAnZml4ZWQnIHR5cGUgYXJyYXlzIG9mIHRoaXMgdHlwZSBtYXkgbm90IGJlIHJlYWQgd2l0aAorICogdGhpcyBmdW5jdGlvbi4KKyAqCisgKiBUaGUgbWVzc2FnZSBpdGVyIHNob3VsZCBiZSAiaW4iIHRoZSBhcnJheSAodGhhdCBpcywgeW91IHJlY3Vyc2UgaW50byB0aGUKKyAqIGFycmF5LCBhbmQgdGhlbiB5b3UgY2FsbCBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfZml4ZWRfYXJyYXkoKSBvbiB0aGUKKyAqICJzdWItaXRlcmF0b3IiIGNyZWF0ZWQgYnkgZGJ1c19tZXNzYWdlX2l0ZXJfcmVjdXJzZSgpKS4KKyAqCisgKiBUaGUgdmFsdWUgYXJndW1lbnQgc2hvdWxkIGJlIHRoZSBhZGRyZXNzIG9mIGEgbG9jYXRpb24gdG8gc3RvcmUgdGhlCisgKiByZXR1cm5lZCBhcnJheS4gU28gZm9yIGludDMyIGl0IHNob3VsZCBiZSBhICJjb25zdCBkYnVzX2ludDMyX3QqKiIKKyAqIFRoZSByZXR1cm5lZCB2YWx1ZSBpcyBieSByZWZlcmVuY2UgYW5kIHNob3VsZCBub3QgYmUgZnJlZWQuCisgKiAKKyAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG9ubHkgYmUgdXNlZCBpZiBkYnVzX3R5cGVfaXNfZml4ZWQoKSByZXR1cm5zCisgKiAjVFJVRSBmb3IgdGhlIGVsZW1lbnQgdHlwZS4KKyAqCisgKiBJZiBhbiBhcnJheSdzIGVsZW1lbnRzIGFyZSBub3QgZml4ZWQgaW4gc2l6ZSwgeW91IGhhdmUgdG8gcmVjdXJzZQorICogaW50byB0aGUgYXJyYXkgd2l0aCBkYnVzX21lc3NhZ2VfaXRlcl9yZWN1cnNlKCkgYW5kIHJlYWQgdGhlCisgKiBlbGVtZW50cyBvbmUgYnkgb25lLgorICogCisgKiBCZWNhdXNlIHRoZSBhcnJheSBpcyBub3QgY29waWVkLCB0aGlzIGZ1bmN0aW9uIHJ1bnMgaW4gY29uc3RhbnQKKyAqIHRpbWUgYW5kIGlzIGZhc3Q7IGl0J3MgbXVjaCBwcmVmZXJyZWQgb3ZlciB3YWxraW5nIHRoZSBlbnRpcmUgYXJyYXkKKyAqIHdpdGggYW4gaXRlcmF0b3IuIChIb3dldmVyLCB5b3UgY2FuIGFsd2F5cyB1c2UKKyAqIGRidXNfbWVzc2FnZV9pdGVyX3JlY3Vyc2UoKSwgZXZlbiBmb3IgZml4ZWQtbGVuZ3RoIHR5cGVzOworICogZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2ZpeGVkX2FycmF5KCkgaXMganVzdCBhbiBvcHRpbWl6YXRpb24uKQorICogCisgKiBAcGFyYW0gaXRlciB0aGUgaXRlcmF0b3IKKyAqIEBwYXJhbSB2YWx1ZSBsb2NhdGlvbiB0byBzdG9yZSB0aGUgYmxvY2sKKyAqIEBwYXJhbSBuX2VsZW1lbnRzIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgYmxvY2sKKyAqLwordm9pZAorZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2ZpeGVkX2FycmF5IChEQnVzTWVzc2FnZUl0ZXIgICppdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAqbl9lbGVtZW50cykKK3sKKyAgREJ1c01lc3NhZ2VSZWFsSXRlciAqcmVhbCA9IChEQnVzTWVzc2FnZVJlYWxJdGVyICopaXRlcjsKKyNpZm5kZWYgREJVU19ESVNBQkxFX0NIRUNLUworICBpbnQgc3VidHlwZSA9IF9kYnVzX3R5cGVfcmVhZGVyX2dldF9jdXJyZW50X3R5cGUoJnJlYWwtPnUucmVhZGVyKTsKKworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAoX2RidXNfbWVzc2FnZV9pdGVyX2NoZWNrIChyZWFsKSk7CisgIF9kYnVzX3JldHVybl9pZl9mYWlsICh2YWx1ZSAhPSBOVUxMKTsKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKChzdWJ0eXBlID09IERCVVNfVFlQRV9JTlZBTElEKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgKGRidXNfdHlwZV9pc19maXhlZCAoc3VidHlwZSkgJiYgc3VidHlwZSAhPSBEQlVTX1RZUEVfVU5JWF9GRCkpOworI2VuZGlmCisKKyAgX2RidXNfdHlwZV9yZWFkZXJfcmVhZF9maXhlZF9tdWx0aSAoJnJlYWwtPnUucmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSwgbl9lbGVtZW50cyk7Cit9CisKKy8qKgorICogSW5pdGlhbGl6ZXMgYSAjREJ1c01lc3NhZ2VJdGVyIGZvciBhcHBlbmRpbmcgYXJndW1lbnRzIHRvIHRoZSBlbmQKKyAqIG9mIGEgbWVzc2FnZS4KKyAqCisgKiBAdG9kbyBJZiBhcHBlbmRpbmcgYW55IG9mIHRoZSBhcmd1bWVudHMgZmFpbHMgZHVlIHRvIGxhY2sgb2YKKyAqIG1lbW9yeSwgdGhlIG1lc3NhZ2UgaXMgaG9zZWQgYW5kIHlvdSBoYXZlIHRvIHN0YXJ0IG92ZXIgYnVpbGRpbmcKKyAqIHRoZSB3aG9sZSBtZXNzYWdlLgorICoKKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlCisgKiBAcGFyYW0gaXRlciBwb2ludGVyIHRvIGFuIGl0ZXJhdG9yIHRvIGluaXRpYWxpemUKKyAqLwordm9pZAorZGJ1c19tZXNzYWdlX2l0ZXJfaW5pdF9hcHBlbmQgKERCdXNNZXNzYWdlICAgICAqbWVzc2FnZSwKKwkJCSAgICAgICBEQnVzTWVzc2FnZUl0ZXIgKml0ZXIpCit7CisgIERCdXNNZXNzYWdlUmVhbEl0ZXIgKnJlYWwgPSAoREJ1c01lc3NhZ2VSZWFsSXRlciAqKWl0ZXI7CisKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKG1lc3NhZ2UgIT0gTlVMTCk7CisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChpdGVyICE9IE5VTEwpOworCisgIF9kYnVzX21lc3NhZ2VfaXRlcl9pbml0X2NvbW1vbiAobWVzc2FnZSwgcmVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX01FU1NBR0VfSVRFUl9UWVBFX1dSSVRFUik7CisKKyAgLyogV2UgY3JlYXRlIHRoZSBzaWduYXR1cmUgc3RyaW5nIGFuZCBwb2ludCBpdGVyYXRvcnMgYXQgaXQgIm9uIGRlbWFuZCIKKyAgICogd2hlbiBhIHZhbHVlIGlzIGFjdHVhbGx5IGFwcGVuZGVkLiBUaGF0IG1lYW5zIHRoYXQgaW5pdCgpIG5ldmVyIGZhaWxzCisgICAqIGR1ZSB0byBPT00uCisgICAqLworICBfZGJ1c190eXBlX3dyaXRlcl9pbml0X3R5cGVzX2RlbGF5ZWQgKCZyZWFsLT51LndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19oZWFkZXJfZ2V0X2J5dGVfb3JkZXIgKCZtZXNzYWdlLT5oZWFkZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZXNzYWdlLT5ib2R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmbWVzc2FnZS0+Ym9keSkpOworfQorCisvKioKKyAqIENyZWF0ZXMgYSB0ZW1wb3Jhcnkgc2lnbmF0dXJlIHN0cmluZyBjb250YWluaW5nIHRoZSBjdXJyZW50CisgKiBzaWduYXR1cmUsIHN0b3JlcyBpdCBpbiB0aGUgaXRlcmF0b3IsIGFuZCBwb2ludHMgdGhlIGl0ZXJhdG9yIHRvCisgKiB0aGUgZW5kIG9mIGl0LiBVc2VkIGFueSB0aW1lIHdlIHdyaXRlIHRvIHRoZSBtZXNzYWdlLgorICoKKyAqIEBwYXJhbSByZWFsIGFuIGl0ZXJhdG9yIHdpdGhvdXQgYSB0eXBlX3N0cgorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vIG1lbW9yeQorICovCitzdGF0aWMgZGJ1c19ib29sX3QKK19kYnVzX21lc3NhZ2VfaXRlcl9vcGVuX3NpZ25hdHVyZSAoREJ1c01lc3NhZ2VSZWFsSXRlciAqcmVhbCkKK3sKKyAgREJ1c1N0cmluZyAqc3RyOworICBjb25zdCBEQnVzU3RyaW5nICpjdXJyZW50X3NpZzsKKyAgaW50IGN1cnJlbnRfc2lnX3BvczsKKworICBfZGJ1c19hc3NlcnQgKHJlYWwtPml0ZXJfdHlwZSA9PSBEQlVTX01FU1NBR0VfSVRFUl9UWVBFX1dSSVRFUik7CisKKyAgaWYgKHJlYWwtPnUud3JpdGVyLnR5cGVfc3RyICE9IE5VTEwpCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0IChyZWFsLT5zaWdfcmVmY291bnQgPiAwKTsKKyAgICAgIHJlYWwtPnNpZ19yZWZjb3VudCArPSAxOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIHN0ciA9IGRidXNfbmV3IChEQnVzU3RyaW5nLCAxKTsKKyAgaWYgKHN0ciA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIV9kYnVzX2hlYWRlcl9nZXRfZmllbGRfcmF3ICgmcmVhbC0+bWVzc2FnZS0+aGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0hFQURFUl9GSUVMRF9TSUdOQVRVUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjdXJyZW50X3NpZywgJmN1cnJlbnRfc2lnX3BvcykpCisgICAgY3VycmVudF9zaWcgPSBOVUxMOworCisgIGlmIChjdXJyZW50X3NpZykKKyAgICB7CisgICAgICBpbnQgY3VycmVudF9sZW47CisKKyAgICAgIGN1cnJlbnRfbGVuID0gX2RidXNfc3RyaW5nX2dldF9ieXRlIChjdXJyZW50X3NpZywgY3VycmVudF9zaWdfcG9zKTsKKyAgICAgIGN1cnJlbnRfc2lnX3BvcyArPSAxOyAvKiBtb3ZlIG9uIHRvIHNpZyBkYXRhICovCisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXRfcHJlYWxsb2NhdGVkIChzdHIsIGN1cnJlbnRfbGVuICsgNCkpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX2ZyZWUgKHN0cik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2NvcHlfbGVuIChjdXJyZW50X3NpZywgY3VycmVudF9zaWdfcG9zLCBjdXJyZW50X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIsIDApKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKHN0cik7CisgICAgICAgICAgZGJ1c19mcmVlIChzdHIpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXRfcHJlYWxsb2NhdGVkIChzdHIsIDQpKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19mcmVlIChzdHIpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICByZWFsLT5zaWdfcmVmY291bnQgPSAxOworCisgIC8qIElmIHRoaXMgYXNzZXJ0aW9uIGZhaWxlZCwgdGhlbiBzdHIgd291bGQgYmUgbmVpdGhlciBzdG9yZWQgaW4gdS53cml0ZXIKKyAgICogbm9yIGZyZWVkIGJ5IHRoaXMgZnVuY3Rpb24sIHJlc3VsdGluZyBpbiBhIG1lbW9yeSBsZWFrLiAqLworICBfZGJ1c19hc3NlcnQgKHJlYWwtPnUud3JpdGVyLnR5cGVfc3RyID09IE5VTEwpOworICBfZGJ1c190eXBlX3dyaXRlcl9hZGRfdHlwZXMgKCZyZWFsLT51LndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChzdHIpKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogU2V0cyB0aGUgbmV3IHNpZ25hdHVyZSBhcyB0aGUgbWVzc2FnZSBzaWduYXR1cmUsIGZyZWVzIHRoZQorICogc2lnbmF0dXJlIHN0cmluZywgYW5kIG1hcmtzIHRoZSBpdGVyYXRvciBhcyBub3QgaGF2aW5nIGEgdHlwZV9zdHIKKyAqIGFueW1vcmUuIEZyZWVzIHRoZSBzaWduYXR1cmUgZXZlbiBpZiBpdCBmYWlscywgc28geW91IGNhbid0CisgKiByZWFsbHkgcmVjb3ZlciBmcm9tIGZhaWx1cmUuIEtpbmRhIGJ1c3RlZC4KKyAqCisgKiBAcGFyYW0gcmVhbCBhbiBpdGVyYXRvciB3aXRob3V0IGEgdHlwZV9zdHIKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBubyBtZW1vcnkKKyAqLworc3RhdGljIGRidXNfYm9vbF90CitfZGJ1c19tZXNzYWdlX2l0ZXJfY2xvc2Vfc2lnbmF0dXJlIChEQnVzTWVzc2FnZVJlYWxJdGVyICpyZWFsKQoreworICBEQnVzU3RyaW5nICpzdHI7CisgIGNvbnN0IGNoYXIgKnZfU1RSSU5HOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisKKyAgX2RidXNfYXNzZXJ0IChyZWFsLT5pdGVyX3R5cGUgPT0gREJVU19NRVNTQUdFX0lURVJfVFlQRV9XUklURVIpOworICBfZGJ1c19hc3NlcnQgKHJlYWwtPnUud3JpdGVyLnR5cGVfc3RyICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKHJlYWwtPnNpZ19yZWZjb3VudCA+IDApOworCisgIHJlYWwtPnNpZ19yZWZjb3VudCAtPSAxOworCisgIGlmIChyZWFsLT5zaWdfcmVmY291bnQgPiAwKQorICAgIHJldHVybiBUUlVFOworICBfZGJ1c19hc3NlcnQgKHJlYWwtPnNpZ19yZWZjb3VudCA9PSAwKTsKKworICByZXR2YWwgPSBUUlVFOworCisgIHN0ciA9IHJlYWwtPnUud3JpdGVyLnR5cGVfc3RyOworCisgIHZfU1RSSU5HID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChzdHIpOworICBpZiAoIV9kYnVzX2hlYWRlcl9zZXRfZmllbGRfYmFzaWMgKCZyZWFsLT5tZXNzYWdlLT5oZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19IRUFERVJfRklFTERfU0lHTkFUVVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TSUdOQVRVUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZfU1RSSU5HKSkKKyAgICByZXR2YWwgPSBGQUxTRTsKKworICBfZGJ1c190eXBlX3dyaXRlcl9yZW1vdmVfdHlwZXMgKCZyZWFsLT51LndyaXRlcik7CisgIF9kYnVzX3N0cmluZ19mcmVlIChzdHIpOworICBkYnVzX2ZyZWUgKHN0cik7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBGcmVlcyB0aGUgc2lnbmF0dXJlIHN0cmluZyBhbmQgbWFya3MgdGhlIGl0ZXJhdG9yIGFzIG5vdCBoYXZpbmcgYQorICogdHlwZV9zdHIgYW55bW9yZS4gIFNpbmNlIHRoZSBuZXcgc2lnbmF0dXJlIGlzIG5vdCBzZXQsIHRoZSBtZXNzYWdlCisgKiB3aWxsIGdlbmVyYWxseSBiZSBob3NlZCBhZnRlciB0aGlzIGlzIGNhbGxlZC4KKyAqCisgKiBAcGFyYW0gcmVhbCBhbiBpdGVyYXRvciB3aXRob3V0IGEgdHlwZV9zdHIKKyAqLworc3RhdGljIHZvaWQKK19kYnVzX21lc3NhZ2VfaXRlcl9hYmFuZG9uX3NpZ25hdHVyZSAoREJ1c01lc3NhZ2VSZWFsSXRlciAqcmVhbCkKK3sKKyAgREJ1c1N0cmluZyAqc3RyOworCisgIF9kYnVzX2Fzc2VydCAocmVhbC0+aXRlcl90eXBlID09IERCVVNfTUVTU0FHRV9JVEVSX1RZUEVfV1JJVEVSKTsKKyAgX2RidXNfYXNzZXJ0IChyZWFsLT51LndyaXRlci50eXBlX3N0ciAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChyZWFsLT5zaWdfcmVmY291bnQgPiAwKTsKKworICByZWFsLT5zaWdfcmVmY291bnQgLT0gMTsKKworICBpZiAocmVhbC0+c2lnX3JlZmNvdW50ID4gMCkKKyAgICByZXR1cm47CisgIF9kYnVzX2Fzc2VydCAocmVhbC0+c2lnX3JlZmNvdW50ID09IDApOworCisgIHN0ciA9IHJlYWwtPnUud3JpdGVyLnR5cGVfc3RyOworCisgIF9kYnVzX3R5cGVfd3JpdGVyX3JlbW92ZV90eXBlcyAoJnJlYWwtPnUud3JpdGVyKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKHN0cik7CisgIGRidXNfZnJlZSAoc3RyKTsKK30KKworI2lmbmRlZiBEQlVTX0RJU0FCTEVfQ0hFQ0tTCitzdGF0aWMgZGJ1c19ib29sX3QKK19kYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfY2hlY2sgKERCdXNNZXNzYWdlUmVhbEl0ZXIgKml0ZXIpCit7CisgIGlmICghX2RidXNfbWVzc2FnZV9pdGVyX2NoZWNrIChpdGVyKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKGl0ZXItPm1lc3NhZ2UtPmxvY2tlZCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuX2NoZWNrX2ZhaWxlZCAoImRidXMgYXBwZW5kIGl0ZXJhdG9yIGNhbid0IGJlIHVzZWQ6IG1lc3NhZ2UgaXMgbG9ja2VkIChoYXMgYWxyZWFkeSBiZWVuIHNlbnQpIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorI2VuZGlmIC8qIERCVVNfRElTQUJMRV9DSEVDS1MgKi8KKworI2lmZGVmIEhBVkVfVU5JWF9GRF9QQVNTSU5HCitzdGF0aWMgaW50ICoKK2V4cGFuZF9mZF9hcnJheShEQnVzTWVzc2FnZSAqbSwKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCAgICAgbikKK3sKKyAgX2RidXNfYXNzZXJ0KG0pOworCisgIC8qIFRoaXMgbWFrZXMgc3BhY2UgZm9yIGFkZGluZyBuIG5ldyBmZHMgdG8gdGhlIGFycmF5IGFuZCByZXR1cm5zIGEKKyAgICAgcG9pbnRlciB0byB0aGUgcGxhY2Ugd2VyZSB0aGUgZmlyc3QgZmQgc2hvdWxkIGJlIHB1dC4gKi8KKworICBpZiAobS0+bl91bml4X2ZkcyArIG4gPiBtLT5uX3VuaXhfZmRzX2FsbG9jYXRlZCkKKyAgICB7CisgICAgICB1bnNpZ25lZCBrOworICAgICAgaW50ICpwOworCisgICAgICAvKiBNYWtlIHR3aWNlIGFzIG11Y2ggc3BhY2UgYXMgbmVjZXNzYXJ5ICovCisgICAgICBrID0gKG0tPm5fdW5peF9mZHMgKyBuKSAqIDI7CisKKyAgICAgIC8qIEFsbG9jYXRlIGF0IGxlYXN0IGZvdXIgKi8KKyAgICAgIGlmIChrIDwgNCkKKyAgICAgICAgayA9IDQ7CisKKyAgICAgIHAgPSBkYnVzX3JlYWxsb2MobS0+dW5peF9mZHMsIGsgKiBzaXplb2YoaW50KSk7CisgICAgICBpZiAocCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgICAgbS0+dW5peF9mZHMgPSBwOworICAgICAgbS0+bl91bml4X2Zkc19hbGxvY2F0ZWQgPSBrOworICAgIH0KKworICByZXR1cm4gbS0+dW5peF9mZHMgKyBtLT5uX3VuaXhfZmRzOworfQorI2VuZGlmCisKKy8qKgorICogQXBwZW5kcyBhIGJhc2ljLXR5cGVkIHZhbHVlIHRvIHRoZSBtZXNzYWdlLiBUaGUgYmFzaWMgdHlwZXMgYXJlIHRoZQorICogbm9uLWNvbnRhaW5lciB0eXBlcyBzdWNoIGFzIGludGVnZXIgYW5kIHN0cmluZy4KKyAqCisgKiBUaGUgInZhbHVlIiBhcmd1bWVudCBzaG91bGQgYmUgdGhlIGFkZHJlc3Mgb2YgYSBiYXNpYy10eXBlZCB2YWx1ZS4KKyAqIFNvIGZvciBzdHJpbmcsIGNvbnN0IGNoYXIqKi4gRm9yIGludGVnZXIsIGRidXNfaW50MzJfdCouCisgKgorICogRm9yIFVuaXggZmlsZSBkZXNjcmlwdG9ycyB0aGlzIGZ1bmN0aW9uIHdpbGwgaW50ZXJuYWxseSBkdXBsaWNhdGUKKyAqIHRoZSBkZXNjcmlwdG9yIHlvdSBwYXNzZWQgaW4uIEhlbmNlIHlvdSBtYXkgY2xvc2UgdGhlIGRlc2NyaXB0b3IKKyAqIGltbWVkaWF0ZWx5IGFmdGVyIHRoaXMgY2FsbC4KKyAqCisgKiBAdG9kbyBJZiB0aGlzIGZhaWxzIGR1ZSB0byBsYWNrIG9mIG1lbW9yeSwgdGhlIG1lc3NhZ2UgaXMgaG9zZWQgYW5kCisgKiB5b3UgaGF2ZSB0byBzdGFydCBvdmVyIGJ1aWxkaW5nIHRoZSB3aG9sZSBtZXNzYWdlLgorICoKKyAqIEBwYXJhbSBpdGVyIHRoZSBhcHBlbmQgaXRlcmF0b3IKKyAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlIG9mIHRoZSB2YWx1ZQorICogQHBhcmFtIHZhbHVlIHRoZSBhZGRyZXNzIG9mIHRoZSB2YWx1ZQorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vdCBlbm91Z2ggbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfYmFzaWMgKERCdXNNZXNzYWdlSXRlciAqaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICAgICAgKnZhbHVlKQoreworICBEQnVzTWVzc2FnZVJlYWxJdGVyICpyZWFsID0gKERCdXNNZXNzYWdlUmVhbEl0ZXIgKilpdGVyOworICBkYnVzX2Jvb2xfdCByZXQ7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChfZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2NoZWNrIChyZWFsKSwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHJlYWwtPml0ZXJfdHlwZSA9PSBEQlVTX01FU1NBR0VfSVRFUl9UWVBFX1dSSVRFUiwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGRidXNfdHlwZV9pc19iYXNpYyAodHlwZSksIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsICh2YWx1ZSAhPSBOVUxMLCBGQUxTRSk7CisKKyNpZm5kZWYgREJVU19ESVNBQkxFX0NIRUNLUworICBzd2l0Y2ggKHR5cGUpCisgICAgeworICAgICAgREJ1c1N0cmluZyBzdHI7CisgICAgICBEQnVzVmFsaWRpdHkgc2lnbmF0dXJlX3ZhbGlkaXR5OworICAgICAgY29uc3QgY2hhciAqIGNvbnN0ICpzdHJpbmdfcDsKKyAgICAgIGNvbnN0IGRidXNfYm9vbF90ICpib29sX3A7CisKKyAgICAgIGNhc2UgREJVU19UWVBFX1NUUklORzoKKyAgICAgICAgc3RyaW5nX3AgPSB2YWx1ZTsKKyAgICAgICAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChfZGJ1c19jaGVja19pc192YWxpZF91dGY4ICgqc3RyaW5nX3ApLCBGQUxTRSk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIERCVVNfVFlQRV9PQkpFQ1RfUEFUSDoKKyAgICAgICAgc3RyaW5nX3AgPSB2YWx1ZTsKKyAgICAgICAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChfZGJ1c19jaGVja19pc192YWxpZF9wYXRoICgqc3RyaW5nX3ApLCBGQUxTRSk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIERCVVNfVFlQRV9TSUdOQVRVUkU6CisgICAgICAgIHN0cmluZ19wID0gdmFsdWU7CisgICAgICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmc3RyLCAqc3RyaW5nX3ApOworICAgICAgICBzaWduYXR1cmVfdmFsaWRpdHkgPSBfZGJ1c192YWxpZGF0ZV9zaWduYXR1cmVfd2l0aF9yZWFzb24gKCZzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikpOworCisgICAgICAgIGlmIChzaWduYXR1cmVfdmFsaWRpdHkgPT0gREJVU19WQUxJRElUWV9VTktOT1dOX09PTV9FUlJPUikKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgICAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChzaWduYXR1cmVfdmFsaWRpdHkgPT0gREJVU19WQUxJRCwgRkFMU0UpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBEQlVTX1RZUEVfQk9PTEVBTjoKKyAgICAgICAgYm9vbF9wID0gdmFsdWU7CisgICAgICAgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoKmJvb2xfcCA9PSAwIHx8ICpib29sX3AgPT0gMSwgRkFMU0UpOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBub3RoaW5nIHRvIGNoZWNrLCBhbGwgcG9zc2libGUgdmFsdWVzIGFyZSBhbGxvd2VkICovCisgICAgICAgICAgfQorICAgIH0KKyNlbmRpZgorCisgIGlmICghX2RidXNfbWVzc2FnZV9pdGVyX29wZW5fc2lnbmF0dXJlIChyZWFsKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKHR5cGUgPT0gREJVU19UWVBFX1VOSVhfRkQpCisgICAgeworI2lmZGVmIEhBVkVfVU5JWF9GRF9QQVNTSU5HCisgICAgICBpbnQgKmZkczsKKyAgICAgIGRidXNfdWludDMyX3QgdTsKKworICAgICAgcmV0ID0gRkFMU0U7CisKKyAgICAgIC8qIEZpcnN0IHN0ZXAsIGluY2x1ZGUgdGhlIGZkIGluIHRoZSBmZCBsaXN0IG9mIHRoaXMgbWVzc2FnZSAqLworICAgICAgaWYgKCEoZmRzID0gZXhwYW5kX2ZkX2FycmF5KHJlYWwtPm1lc3NhZ2UsIDEpKSkKKyAgICAgICAgZ290byBvdXQ7CisKKyAgICAgICpmZHMgPSBfZGJ1c19kdXAoKihpbnQqKSB2YWx1ZSwgTlVMTCk7CisgICAgICBpZiAoKmZkcyA8IDApCisgICAgICAgIGdvdG8gb3V0OworCisgICAgICB1ID0gcmVhbC0+bWVzc2FnZS0+bl91bml4X2ZkczsKKworICAgICAgLyogU2Vjb25kIHN0ZXAsIHdyaXRlIHRoZSBpbmRleCB0byB0aGUgZmQgKi8KKyAgICAgIGlmICghKHJldCA9IF9kYnVzX3R5cGVfd3JpdGVyX3dyaXRlX2Jhc2ljICgmcmVhbC0+dS53cml0ZXIsIERCVVNfVFlQRV9VTklYX0ZELCAmdSkpKSB7CisgICAgICAgIF9kYnVzX2Nsb3NlKCpmZHMsIE5VTEwpOworICAgICAgICBnb3RvIG91dDsKKyAgICAgIH0KKworICAgICAgcmVhbC0+bWVzc2FnZS0+bl91bml4X2ZkcyArPSAxOworICAgICAgdSArPSAxOworCisgICAgICAvKiBGaW5hbCBzdGVwLCB1cGRhdGUgdGhlIGhlYWRlciBhY2NvcmRpbmdseSAqLworICAgICAgcmV0ID0gX2RidXNfaGVhZGVyX3NldF9maWVsZF9iYXNpYyAoJnJlYWwtPm1lc3NhZ2UtPmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSEVBREVSX0ZJRUxEX1VOSVhfRkRTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1VJTlQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1KTsKKworICAgICAgLyogSWYgYW55IG9mIHRoZXNlIG9wZXJhdGlvbnMgZmFpbCB0aGUgbWVzc2FnZSBpcworICAgICAgICAgaG9zZWQuIEhvd2V2ZXIsIG5vIG1lbW9yeSBvciBmZHMgc2hvdWxkIGJlIGxlYWtlZCBzaW5jZSB3aGF0CisgICAgICAgICBoYXMgYmVlbiBhZGRlZCB0byBtZXNzYWdlIGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBtZXNzYWdlLCBhbmQKKyAgICAgICAgIGNhbiBoZW5jZSBiZSBhY2NvdW50ZWQgZm9yIHdoZW4gdGhlIG1lc3NhZ2UgaXMgYmVpbmcKKyAgICAgICAgIGZyZWVkLiAqLworI2Vsc2UKKyAgICAgIHJldCA9IEZBTFNFOworICAgICAgLyogVGhpcyBpcyByZWR1bmRhbnQgKHdlIGNvdWxkIGp1c3QgZmFsbCB0aHJvdWdoKSwgYnV0IGl0IGF2b2lkcworICAgICAgICogLVd1bnVzZWQtbGFiZWwgaW4gYnVpbGRzIHRoYXQgZG9uJ3QgSEFWRV9VTklYX0ZEX1BBU1NJTkcgKi8KKyAgICAgIGdvdG8gb3V0OworI2VuZGlmCisgICAgfQorICBlbHNlCisgICAgeworICAgICAgcmV0ID0gX2RidXNfdHlwZV93cml0ZXJfd3JpdGVfYmFzaWMgKCZyZWFsLT51LndyaXRlciwgdHlwZSwgdmFsdWUpOworICAgIH0KKworb3V0OgorICBpZiAoIV9kYnVzX21lc3NhZ2VfaXRlcl9jbG9zZV9zaWduYXR1cmUgKHJlYWwpKQorICAgIHJldCA9IEZBTFNFOworCisgIHJldHVybiByZXQ7Cit9CisKKy8qKgorICogQXBwZW5kcyBhIGJsb2NrIG9mIGZpeGVkLWxlbmd0aCB2YWx1ZXMgdG8gYW4gYXJyYXkuIFRoZQorICogZml4ZWQtbGVuZ3RoIHR5cGVzIGFyZSBhbGwgYmFzaWMgdHlwZXMgdGhhdCBhcmUgbm90IHN0cmluZy1saWtlLiBTbworICogaW50MzIsIGRvdWJsZSwgYm9vbCwgZXRjLiAoVW5peCBmaWxlIGRlc2NyaXB0b3JzIGhvd2V2ZXIgYXJlIG5vdAorICogc3VwcG9ydGVkLikgWW91IG11c3QgY2FsbCBkYnVzX21lc3NhZ2VfaXRlcl9vcGVuX2NvbnRhaW5lcigpIHRvCisgKiBvcGVuIGFuIGFycmF5IG9mIHZhbHVlcyBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLiBZb3UgbWF5IGNhbGwKKyAqIHRoaXMgZnVuY3Rpb24gbXVsdGlwbGUgdGltZXMgKGFuZCBpbnRlcm1peGVkIHdpdGggY2FsbHMgdG8KKyAqIGRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYygpKSBmb3IgdGhlIHNhbWUgYXJyYXkuCisgKgorICogVGhlICJ2YWx1ZSIgYXJndW1lbnQgc2hvdWxkIGJlIHRoZSBhZGRyZXNzIG9mIHRoZSBhcnJheS4gIFNvIGZvcgorICogaW50ZWdlciwgImRidXNfaW50MzJfdCoqIiBpcyBleHBlY3RlZCBmb3IgZXhhbXBsZS4KKyAqCisgKiBAd2FybmluZyBpbiBDLCBnaXZlbiAiaW50IGFycmF5W10iLCAiJmFycmF5ID09IGFycmF5IiAodGhlCisgKiBjb21wLmxhbmcuYyBGQVEgc2F5cyBvdGhlcndpc2UsIGJ1dCBnY2MgYW5kIHRoZSBGQVEgZG9uJ3QgYWdyZWUpLgorICogU28gaWYgeW91J3JlIHVzaW5nIGFuIGFycmF5IGluc3RlYWQgb2YgYSBwb2ludGVyIHlvdSBoYXZlIHRvIGNyZWF0ZQorICogYSBwb2ludGVyIHZhcmlhYmxlLCBhc3NpZ24gdGhlIGFycmF5IHRvIGl0LCB0aGVuIHRha2UgdGhlIGFkZHJlc3MKKyAqIG9mIHRoZSBwb2ludGVyIHZhcmlhYmxlLgorICogQGNvZGUKKyAqIGNvbnN0IGRidXNfaW50MzJfdCBhcnJheVtdID0geyAxLCAyLCAzIH07CisgKiBjb25zdCBkYnVzX2ludDMyX3QgKnZfQVJSQVkgPSBhcnJheTsKKyAqIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2ZpeGVkX2FycmF5ICgmaXRlciwgREJVU19UWVBFX0lOVDMyLCAmdl9BUlJBWSwgMykpCisgKiAgIGZwcmludGYgKHN0ZGVyciwgIk5vIG1lbW9yeSFcbiIpOworICogQGVuZGNvZGUKKyAqIEZvciBzdHJpbmdzIGl0IHdvcmtzIHRvIHdyaXRlIGNvbnN0IGNoYXIgKmFycmF5ID0gIkhlbGxvIiBhbmQgdGhlbgorICogdXNlICZhcnJheSB0aG91Z2guCisgKgorICogQHRvZG8gSWYgdGhpcyBmYWlscyBkdWUgdG8gbGFjayBvZiBtZW1vcnksIHRoZSBtZXNzYWdlIGlzIGhvc2VkIGFuZAorICogeW91IGhhdmUgdG8gc3RhcnQgb3ZlciBidWlsZGluZyB0aGUgd2hvbGUgbWVzc2FnZS4KKyAqCisgKiBAcGFyYW0gaXRlciB0aGUgYXBwZW5kIGl0ZXJhdG9yCisgKiBAcGFyYW0gZWxlbWVudF90eXBlIHRoZSB0eXBlIG9mIHRoZSBhcnJheSBlbGVtZW50cworICogQHBhcmFtIHZhbHVlIHRoZSBhZGRyZXNzIG9mIHRoZSBhcnJheQorICogQHBhcmFtIG5fZWxlbWVudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyB0byBhcHBlbmQKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBub3QgZW5vdWdoIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2ZpeGVkX2FycmF5IChEQnVzTWVzc2FnZUl0ZXIgKml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICAgICAgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgIG5fZWxlbWVudHMpCit7CisgIERCdXNNZXNzYWdlUmVhbEl0ZXIgKnJlYWwgPSAoREJ1c01lc3NhZ2VSZWFsSXRlciAqKWl0ZXI7CisgIGRidXNfYm9vbF90IHJldDsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKF9kYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfY2hlY2sgKHJlYWwpLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAocmVhbC0+aXRlcl90eXBlID09IERCVVNfTUVTU0FHRV9JVEVSX1RZUEVfV1JJVEVSLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoZGJ1c190eXBlX2lzX2ZpeGVkIChlbGVtZW50X3R5cGUpICYmIGVsZW1lbnRfdHlwZSAhPSBEQlVTX1RZUEVfVU5JWF9GRCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHJlYWwtPnUud3JpdGVyLmNvbnRhaW5lcl90eXBlID09IERCVVNfVFlQRV9BUlJBWSwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHZhbHVlICE9IE5VTEwsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChuX2VsZW1lbnRzID49IDAsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChuX2VsZW1lbnRzIDw9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19NQVhJTVVNX0FSUkFZX0xFTkdUSCAvIF9kYnVzX3R5cGVfZ2V0X2FsaWdubWVudCAoZWxlbWVudF90eXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSk7CisKKyNpZm5kZWYgREJVU19ESVNBQkxFX0NIRUNLUworICBpZiAoZWxlbWVudF90eXBlID09IERCVVNfVFlQRV9CT09MRUFOKQorICAgIHsKKyAgICAgIGNvbnN0IGRidXNfYm9vbF90ICogY29uc3QgKmJvb2xzID0gdmFsdWU7CisgICAgICBpbnQgaTsKKworICAgICAgZm9yIChpID0gMDsgaSA8IG5fZWxlbWVudHM7IGkrKykKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoKCpib29scylbaV0gPT0gMCB8fCAoKmJvb2xzKVtpXSA9PSAxLCBGQUxTRSk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworICByZXQgPSBfZGJ1c190eXBlX3dyaXRlcl93cml0ZV9maXhlZF9tdWx0aSAoJnJlYWwtPnUud3JpdGVyLCBlbGVtZW50X3R5cGUsIHZhbHVlLCBuX2VsZW1lbnRzKTsKKworICByZXR1cm4gcmV0OworfQorCisvKioKKyAqIEFwcGVuZHMgYSBjb250YWluZXItdHlwZWQgdmFsdWUgdG8gdGhlIG1lc3NhZ2UuIE9uIHN1Y2Nlc3MsIHlvdSBhcmUKKyAqIHJlcXVpcmVkIHRvIGFwcGVuZCB0aGUgY29udGVudHMgb2YgdGhlIGNvbnRhaW5lciB1c2luZyB0aGUgcmV0dXJuZWQKKyAqIHN1Yi1pdGVyYXRvciwgYW5kIHRoZW4gY2FsbAorICogZGJ1c19tZXNzYWdlX2l0ZXJfY2xvc2VfY29udGFpbmVyKCkuIENvbnRhaW5lciB0eXBlcyBhcmUgZm9yCisgKiBleGFtcGxlIHN0cnVjdCwgdmFyaWFudCwgYW5kIGFycmF5LiBGb3IgdmFyaWFudHMsIHRoZQorICogY29udGFpbmVkX3NpZ25hdHVyZSBzaG91bGQgYmUgdGhlIHR5cGUgb2YgdGhlIHNpbmdsZSB2YWx1ZSBpbnNpZGUKKyAqIHRoZSB2YXJpYW50LiBGb3Igc3RydWN0cyBhbmQgZGljdCBlbnRyaWVzLCBjb250YWluZWRfc2lnbmF0dXJlCisgKiBzaG91bGQgYmUgI05VTEw7IGl0IHdpbGwgYmUgc2V0IHRvIHdoYXRldmVyIHR5cGVzIHlvdSB3cml0ZSBpbnRvCisgKiB0aGUgc3RydWN0LiAgRm9yIGFycmF5cywgY29udGFpbmVkX3NpZ25hdHVyZSBzaG91bGQgYmUgdGhlIHR5cGUgb2YKKyAqIHRoZSBhcnJheSBlbGVtZW50cy4KKyAqCisgKiBAdG9kbyBJZiB0aGlzIGZhaWxzIGR1ZSB0byBsYWNrIG9mIG1lbW9yeSwgdGhlIG1lc3NhZ2UgaXMgaG9zZWQgYW5kCisgKiB5b3UgaGF2ZSB0byBzdGFydCBvdmVyIGJ1aWxkaW5nIHRoZSB3aG9sZSBtZXNzYWdlLgorICoKKyAqIElmIHRoaXMgZnVuY3Rpb24gZmFpbHMsIHRoZSBzdWItaXRlcmF0b3IgcmVtYWlucyBpbnZhbGlkLCBhbmQgbXVzdAorICogbm90IGJlIGNsb3NlZCB3aXRoIGRidXNfbWVzc2FnZV9pdGVyX2Nsb3NlX2NvbnRhaW5lcigpIG9yIGFiYW5kb25lZAorICogd2l0aCBkYnVzX21lc3NhZ2VfaXRlcl9hYmFuZG9uX2NvbnRhaW5lcigpLiBIb3dldmVyLCBhZnRlciB0aGlzCisgKiBmdW5jdGlvbiBoYXMgZWl0aGVyIHN1Y2NlZWRlZCBvciBmYWlsZWQsIGl0IGlzIHZhbGlkIHRvIGNhbGwKKyAqIGRidXNfbWVzc2FnZV9pdGVyX2FiYW5kb25fY29udGFpbmVyX2lmX29wZW4oKS4KKyAqCisgKiBAcGFyYW0gaXRlciB0aGUgYXBwZW5kIGl0ZXJhdG9yCisgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBvZiB0aGUgdmFsdWUKKyAqIEBwYXJhbSBjb250YWluZWRfc2lnbmF0dXJlIHRoZSB0eXBlIG9mIGNvbnRhaW5lciBjb250ZW50cworICogQHBhcmFtIHN1YiBzdWItaXRlcmF0b3IgdG8gaW5pdGlhbGl6ZQorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vdCBlbm91Z2ggbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitkYnVzX21lc3NhZ2VfaXRlcl9vcGVuX2NvbnRhaW5lciAoREJ1c01lc3NhZ2VJdGVyICppdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgKmNvbnRhaW5lZF9zaWduYXR1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2VJdGVyICpzdWIpCit7CisgIERCdXNNZXNzYWdlUmVhbEl0ZXIgKnJlYWwgPSAoREJ1c01lc3NhZ2VSZWFsSXRlciAqKWl0ZXI7CisgIERCdXNNZXNzYWdlUmVhbEl0ZXIgKnJlYWxfc3ViID0gKERCdXNNZXNzYWdlUmVhbEl0ZXIgKilzdWI7CisgIERCdXNTdHJpbmcgY29udGFpbmVkX3N0cjsKKyAgREJ1c1ZhbGlkaXR5IGNvbnRhaW5lZF9zaWduYXR1cmVfdmFsaWRpdHk7CisgIGRidXNfYm9vbF90IHJldDsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHN1YiAhPSBOVUxMLCBGQUxTRSk7CisgIC8qIERvIG91ciBiZXN0IHRvIG1ha2Ugc3VyZSB0aGUgc3ViLWl0ZXJhdG9yIGRvZXNuJ3QgY29udGFpbiBzb21ldGhpbmcKKyAgICogdmFsaWQtbG9va2luZyBvbiBmYWlsdXJlICovCisgIF9kYnVzX21lc3NhZ2VfcmVhbF9pdGVyX3plcm8gKHJlYWxfc3ViKTsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKF9kYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfY2hlY2sgKHJlYWwpLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAocmVhbC0+aXRlcl90eXBlID09IERCVVNfTUVTU0FHRV9JVEVSX1RZUEVfV1JJVEVSLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoZGJ1c190eXBlX2lzX2NvbnRhaW5lciAodHlwZSksIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsICgodHlwZSA9PSBEQlVTX1RZUEVfU1RSVUNUICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lZF9zaWduYXR1cmUgPT0gTlVMTCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHlwZSA9PSBEQlVTX1RZUEVfRElDVF9FTlRSWSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZWRfc2lnbmF0dXJlID09IE5VTEwpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHR5cGUgPT0gREJVU19UWVBFX1ZBUklBTlQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVkX3NpZ25hdHVyZSAhPSBOVUxMKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0eXBlID09IERCVVNfVFlQRV9BUlJBWSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZWRfc2lnbmF0dXJlICE9IE5VTEwpLCBGQUxTRSk7CisgIAorICAvKiB0aGlzIHdvdWxkIGZhaWwgaWYgdGhlIGNvbnRhaW5lZF9zaWduYXR1cmUgaXMgYSBkaWN0IGVudHJ5LCBzaW5jZQorICAgKiBkaWN0IGVudHJpZXMgYXJlIGludmFsaWQgc2lnbmF0dXJlcyBzdGFuZGFsb25lICh0aGV5IG11c3QgYmUgaW4KKyAgICogYW4gYXJyYXkpCisgICAqLworICBpZiAoY29udGFpbmVkX3NpZ25hdHVyZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmY29udGFpbmVkX3N0ciwgY29udGFpbmVkX3NpZ25hdHVyZSk7CisgICAgICBjb250YWluZWRfc2lnbmF0dXJlX3ZhbGlkaXR5ID0gX2RidXNfdmFsaWRhdGVfc2lnbmF0dXJlX3dpdGhfcmVhc29uICgmY29udGFpbmVkX3N0ciwKKyAgICAgICAgICAwLAorICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmY29udGFpbmVkX3N0cikpOworCisgICAgICBpZiAoY29udGFpbmVkX3NpZ25hdHVyZV92YWxpZGl0eSA9PSBEQlVTX1ZBTElESVRZX1VOS05PV05fT09NX0VSUk9SKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyoganVzdCBzb21lIHBsYWNlaG9sZGVyIHZhbHVlICovCisgICAgICBjb250YWluZWRfc2lnbmF0dXJlX3ZhbGlkaXR5ID0gREJVU19WQUxJRF9CVVRfSU5DT01QTEVURTsKKyAgICB9CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsICgodHlwZSA9PSBEQlVTX1RZUEVfQVJSQVkgJiYgY29udGFpbmVkX3NpZ25hdHVyZSAmJiAqY29udGFpbmVkX3NpZ25hdHVyZSA9PSBEQlVTX0RJQ1RfRU5UUllfQkVHSU5fQ0hBUikgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZWRfc2lnbmF0dXJlID09IE5VTEwgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZWRfc2lnbmF0dXJlX3ZhbGlkaXR5ID09IERCVVNfVkFMSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UpOworCisgIGlmICghX2RidXNfbWVzc2FnZV9pdGVyX29wZW5fc2lnbmF0dXJlIChyZWFsKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0ID0gRkFMU0U7CisgICpyZWFsX3N1YiA9ICpyZWFsOworCisgIGlmIChjb250YWluZWRfc2lnbmF0dXJlICE9IE5VTEwpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZjb250YWluZWRfc3RyLCBjb250YWluZWRfc2lnbmF0dXJlKTsKKworICAgICAgcmV0ID0gX2RidXNfdHlwZV93cml0ZXJfcmVjdXJzZSAoJnJlYWwtPnUud3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb250YWluZWRfc3RyLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlYWxfc3ViLT51LndyaXRlcik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgcmV0ID0gX2RidXNfdHlwZV93cml0ZXJfcmVjdXJzZSAoJnJlYWwtPnUud3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVhbF9zdWItPnUud3JpdGVyKTsKKyAgICB9CisKKyAgaWYgKCFyZXQpCisgICAgX2RidXNfbWVzc2FnZV9pdGVyX2FiYW5kb25fc2lnbmF0dXJlIChyZWFsKTsKKworICByZXR1cm4gcmV0OworfQorCisKKy8qKgorICogQ2xvc2VzIGEgY29udGFpbmVyLXR5cGVkIHZhbHVlIGFwcGVuZGVkIHRvIHRoZSBtZXNzYWdlOyBtYXkgd3JpdGUKKyAqIG91dCBtb3JlIGluZm9ybWF0aW9uIHRvIHRoZSBtZXNzYWdlIGtub3duIG9ubHkgYWZ0ZXIgdGhlIGVudGlyZQorICogY29udGFpbmVyIGlzIHdyaXR0ZW4sIGFuZCBtYXkgZnJlZSByZXNvdXJjZXMgY3JlYXRlZCBieQorICogZGJ1c19tZXNzYWdlX2l0ZXJfb3Blbl9jb250YWluZXIoKS4KKyAqCisgKiBFdmVuIGlmIHRoaXMgZnVuY3Rpb24gZmFpbHMgZHVlIHRvIGxhY2sgb2YgbWVtb3J5LCB0aGUgc3ViLWl0ZXJhdG9yIHN1YgorICogaGFzIGJlZW4gY2xvc2VkIGFuZCBpbnZhbGlkYXRlZC4gSXQgbXVzdCBub3QgYmUgY2xvc2VkIGFnYWluIHdpdGggdGhpcworICogZnVuY3Rpb24sIG9yIGFiYW5kb25lZCB3aXRoIGRidXNfbWVzc2FnZV9pdGVyX2FiYW5kb25fY29udGFpbmVyKCkuCisgKiBIb3dldmVyLCBpdCByZW1haW5zIHZhbGlkIHRvIGNhbGwKKyAqIGRidXNfbWVzc2FnZV9pdGVyX2FiYW5kb25fY29udGFpbmVyX2lmX29wZW4oKS4KKyAqCisgKiBAdG9kbyBJZiB0aGlzIGZhaWxzIGR1ZSB0byBsYWNrIG9mIG1lbW9yeSwgdGhlIG1lc3NhZ2UgaXMgaG9zZWQgYW5kCisgKiB5b3UgaGF2ZSB0byBzdGFydCBvdmVyIGJ1aWxkaW5nIHRoZSB3aG9sZSBtZXNzYWdlLgorICoKKyAqIEBwYXJhbSBpdGVyIHRoZSBhcHBlbmQgaXRlcmF0b3IKKyAqIEBwYXJhbSBzdWIgc3ViLWl0ZXJhdG9yIHRvIGNsb3NlCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm90IGVub3VnaCBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK2RidXNfbWVzc2FnZV9pdGVyX2Nsb3NlX2NvbnRhaW5lciAoREJ1c01lc3NhZ2VJdGVyICppdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZUl0ZXIgKnN1YikKK3sKKyAgREJ1c01lc3NhZ2VSZWFsSXRlciAqcmVhbCA9IChEQnVzTWVzc2FnZVJlYWxJdGVyICopaXRlcjsKKyAgREJ1c01lc3NhZ2VSZWFsSXRlciAqcmVhbF9zdWIgPSAoREJ1c01lc3NhZ2VSZWFsSXRlciAqKXN1YjsKKyAgZGJ1c19ib29sX3QgcmV0OworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoX2RidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9jaGVjayAocmVhbCksIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChyZWFsLT5pdGVyX3R5cGUgPT0gREJVU19NRVNTQUdFX0lURVJfVFlQRV9XUklURVIsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChfZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2NoZWNrIChyZWFsX3N1YiksIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChyZWFsX3N1Yi0+aXRlcl90eXBlID09IERCVVNfTUVTU0FHRV9JVEVSX1RZUEVfV1JJVEVSLCBGQUxTRSk7CisKKyAgcmV0ID0gX2RidXNfdHlwZV93cml0ZXJfdW5yZWN1cnNlICgmcmVhbC0+dS53cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlYWxfc3ViLT51LndyaXRlcik7CisgIF9kYnVzX21lc3NhZ2VfcmVhbF9pdGVyX3plcm8gKHJlYWxfc3ViKTsKKworICBpZiAoIV9kYnVzX21lc3NhZ2VfaXRlcl9jbG9zZV9zaWduYXR1cmUgKHJlYWwpKQorICAgIHJldCA9IEZBTFNFOworCisgIHJldHVybiByZXQ7Cit9CisKKy8qKgorICogQWJhbmRvbnMgY3JlYXRpb24gb2YgYSBjb250YWluZWQtdHlwZWQgdmFsdWUgYW5kIGZyZWVzIHJlc291cmNlcyBjcmVhdGVkCisgKiBieSBkYnVzX21lc3NhZ2VfaXRlcl9vcGVuX2NvbnRhaW5lcigpLiAgT25jZSB0aGlzIHJldHVybnMsIHRoZSBtZXNzYWdlCisgKiBpcyBob3NlZCBhbmQgeW91IGhhdmUgdG8gc3RhcnQgb3ZlciBidWlsZGluZyB0aGUgd2hvbGUgbWVzc2FnZS4KKyAqCisgKiBUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgdG8gYWJhbmRvbiBjcmVhdGlvbiBvZiBhIG1lc3NhZ2Ugd2hlbiB5b3UgaGF2ZQorICogb3BlbiBjb250YWluZXJzLgorICoKKyAqIEBwYXJhbSBpdGVyIHRoZSBhcHBlbmQgaXRlcmF0b3IKKyAqIEBwYXJhbSBzdWIgc3ViLWl0ZXJhdG9yIHRvIGNsb3NlCisgKi8KK3ZvaWQKK2RidXNfbWVzc2FnZV9pdGVyX2FiYW5kb25fY29udGFpbmVyIChEQnVzTWVzc2FnZUl0ZXIgKml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2VJdGVyICpzdWIpCit7CisgIERCdXNNZXNzYWdlUmVhbEl0ZXIgKnJlYWwgPSAoREJ1c01lc3NhZ2VSZWFsSXRlciAqKWl0ZXI7CisgIERCdXNNZXNzYWdlUmVhbEl0ZXIgKnJlYWxfc3ViID0gKERCdXNNZXNzYWdlUmVhbEl0ZXIgKilzdWI7CisKKyNpZm5kZWYgREJVU19ESVNBQkxFX0NIRUNLUworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAoX2RidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9jaGVjayAocmVhbCkpOworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAocmVhbC0+aXRlcl90eXBlID09IERCVVNfTUVTU0FHRV9JVEVSX1RZUEVfV1JJVEVSKTsKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKF9kYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfY2hlY2sgKHJlYWxfc3ViKSk7CisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChyZWFsX3N1Yi0+aXRlcl90eXBlID09IERCVVNfTUVTU0FHRV9JVEVSX1RZUEVfV1JJVEVSKTsKKyNlbmRpZgorCisgIF9kYnVzX21lc3NhZ2VfaXRlcl9hYmFuZG9uX3NpZ25hdHVyZSAocmVhbCk7CisgIF9kYnVzX21lc3NhZ2VfcmVhbF9pdGVyX3plcm8gKHJlYWxfc3ViKTsKK30KKworLyoqCisgKiBBYmFuZG9ucyBjcmVhdGlvbiBvZiBhIGNvbnRhaW5lZC10eXBlZCB2YWx1ZSBhbmQgZnJlZXMgcmVzb3VyY2VzIGNyZWF0ZWQKKyAqIGJ5IGRidXNfbWVzc2FnZV9pdGVyX29wZW5fY29udGFpbmVyKCkuICBPbmNlIHRoaXMgcmV0dXJucywgdGhlIG1lc3NhZ2UKKyAqIGlzIGhvc2VkIGFuZCB5b3UgaGF2ZSB0byBzdGFydCBvdmVyIGJ1aWxkaW5nIHRoZSB3aG9sZSBtZXNzYWdlLgorICoKKyAqIFVubGlrZSBkYnVzX21lc3NhZ2VfaXRlcl9hYmFuZG9uX2NvbnRhaW5lcigpLCBpdCBpcyB2YWxpZCB0byBjYWxsIHRoaXMKKyAqIGZ1bmN0aW9uIG9uIGFuIGl0ZXJhdG9yIHRoYXQgd2FzIGluaXRpYWxpemVkIHdpdGgKKyAqICNEQlVTX01FU1NBR0VfSVRFUl9JTklUX0NMT1NFRCwgb3IgYW4gaXRlcmF0b3IgdGhhdCB3YXMgYWxyZWFkeSBjbG9zZWQKKyAqIG9yIGFiYW5kb25lZC4gSG93ZXZlciwgaXQgaXMgbm90IHZhbGlkIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiBvbgorICogdW5pbml0aWFsaXplZCBtZW1vcnkuIFRoaXMgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBpbiBlcnJvciBjbGVhbnVwCisgKiBjb2RlIHBhdGhzLCBzaW1pbGFyIHRvIHRoaXMgcGF0dGVybjoKKyAqCisgKiAgICAgICBEQnVzTWVzc2FnZUl0ZXIgb3V0ZXIgPSBEQlVTX01FU1NBR0VfSVRFUl9JTklUX0NMT1NFRDsKKyAqICAgICAgIERCdXNNZXNzYWdlSXRlciBpbm5lciA9IERCVVNfTUVTU0FHRV9JVEVSX0lOSVRfQ0xPU0VEOworICogICAgICAgZGJ1c19ib29sX3QgcmVzdWx0ID0gRkFMU0U7CisgKgorICogICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9vcGVuX2NvbnRhaW5lciAoaXRlciwgLi4uLCAmb3V0ZXIpKQorICogICAgICAgICBnb3RvIG91dDsKKyAqCisgKiAgICAgICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX29wZW5fY29udGFpbmVyICgmb3V0ZXIsIC4uLiwgJmlubmVyKSkKKyAqICAgICAgICAgZ290byBvdXQ7CisgKgorICogICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfYmFzaWMgKCZpbm5lciwgLi4uKSkKKyAqICAgICAgICAgZ290byBvdXQ7CisgKgorICogICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9jbG9zZV9jb250YWluZXIgKCZvdXRlciwgLi4uLCAmaW5uZXIpKQorICogICAgICAgICBnb3RvIG91dDsKKyAqCisgKiAgICAgICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX2Nsb3NlX2NvbnRhaW5lciAoaXRlciwgLi4uLCAmb3V0ZXIpKQorICogICAgICAgICBnb3RvIG91dDsKKyAqCisgKiAgICAgICByZXN1bHQgPSBUUlVFOworICoKKyAqICAgICBvdXQ6CisgKiAgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9hYmFuZG9uX2NvbnRhaW5lcl9pZl9vcGVuICgmb3V0ZXIsICZpbm5lcik7CisgKiAgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9hYmFuZG9uX2NvbnRhaW5lcl9pZl9vcGVuIChpdGVyLCAmb3V0ZXIpOworICogICAgICAgcmV0dXJuIHJlc3VsdDsKKyAqCisgKiBAcGFyYW0gaXRlciB0aGUgYXBwZW5kIGl0ZXJhdG9yCisgKiBAcGFyYW0gc3ViIHN1Yi1pdGVyYXRvciB0byBjbG9zZQorICovCit2b2lkCitkYnVzX21lc3NhZ2VfaXRlcl9hYmFuZG9uX2NvbnRhaW5lcl9pZl9vcGVuIChEQnVzTWVzc2FnZUl0ZXIgKml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZUl0ZXIgKnN1YikKK3sKKyAgREJ1c01lc3NhZ2VSZWFsSXRlciAqcmVhbCA9IChEQnVzTWVzc2FnZVJlYWxJdGVyICopaXRlcjsKKyAgREJ1c01lc3NhZ2VSZWFsSXRlciAqcmVhbF9zdWIgPSAoREJ1c01lc3NhZ2VSZWFsSXRlciAqKXN1YjsKKworICAvKiBJZiBib3RoIHRoZSBwYXJlbnQgYW5kIHRoZSBjaGlsZCBhcmUgemVyb2VkIG91dCwgdGhlbiBlaXRoZXIgd2UgZGlkbid0CisgICAqIGV2ZW4gZ2V0IGFzIGZhciBhcyBzdWNjZXNzZnVsbHkgcmVjdXJzaW5nIGludG8gdGhlIHBhcmVudCwgb3Igd2UgYWxyZWFkeQorICAgKiBjbG9zZWQgYm90aCB0aGUgY2hpbGQgYW5kIHRoZSBwYXJlbnQuIEZvciBleGFtcGxlLCBpbiB0aGUgY29kZSBzYW1wbGUKKyAgICogaW4gdGhlIGRvYy1jb21tZW50IGFib3ZlLCB0aGlzIGhhcHBlbnMgZm9yCisgICAqIGFiYW5kb25fY29udGFpbmVyX2lmX29wZW4gKCZvdXRlciwgJmlubmVyKSBpZiB0aGUgZmlyc3Qgb3Blbl9jb250YWluZXIKKyAgICogY2FsbCBmYWlsZWQsIG9yIGlmIHdlIHJlYWNoZWQgcmVzdWx0ID0gVFJVRSBhbmQgZmVsbCB0aHJvdWdoLiAqLworICBpZiAoX2RidXNfbWVzc2FnZV9yZWFsX2l0ZXJfaXNfemVyb2VkIChyZWFsKSAmJgorICAgICAgX2RidXNfbWVzc2FnZV9yZWFsX2l0ZXJfaXNfemVyb2VkIChyZWFsX3N1YikpCisgICAgcmV0dXJuOworCisjaWZuZGVmIERCVVNfRElTQUJMRV9DSEVDS1MKKyAgLyogSWYgdGhlIGNoaWxkIGlzIG5vdCB6ZXJvZWQgb3V0LCBidXQgdGhlIHBhcmVudCBpcywgdGhlbiBzb21ldGhpbmcgaGFzCisgICAqIGdvbmUgaG9ycmlibHkgd3JvbmcgKGluIHByYWN0aWNlIHRoYXQgd291bGQgcHJvYmFibHkgbWVhbiBib3RoIGFyZQorICAgKiB1bmluaXRpYWxpemVkIG9yIGNvcnJ1cHQsIGFuZCB0aGUgcGFyZW50IGhhcHBlbnMgdG8gaGF2ZSBlbmRlZCB1cAorICAgKiBhbGwtYnl0ZXMtemVybykuICovCisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChfZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2NoZWNrIChyZWFsKSk7CisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChyZWFsLT5pdGVyX3R5cGUgPT0gREJVU19NRVNTQUdFX0lURVJfVFlQRV9XUklURVIpOworI2VuZGlmCisKKyAgLyogSWYgdGhlIHBhcmVudCBpcyBub3QgemVyb2VkIG91dCwgYnV0IHRoZSBjaGlsZCBpcywgdGhlbiBlaXRoZXIgd2UgZGlkCisgICAqIG5vdCBzdWNjZXNzZnVsbHkgb3BlbiB0aGUgY2hpbGQsIG9yIHdlIGFscmVhZHkgY2xvc2VkIHRoZSBjaGlsZC4gVGhpcworICAgKiBtZWFucyB3ZSBkbyBub3Qgb3duIGEgcmVmZXJlbmNlIHRvIHRoZSBwYXJlbnQncyBzaWduYXR1cmUsIHNvIGl0IHdvdWxkCisgICAqIGJlIHdyb25nIHRvIHJlbGVhc2UgaXQ7IHNvIHdlIG11c3Qgbm90IGNhbGwgYWJhbmRvbl9zaWduYXR1cmUoKSBoZXJlLgorICAgKiBJbiB0aGUgY29kZSBzYW1wbGUgaW4gdGhlIGRvYy1jb21tZW50IGFib3ZlLCB0aGlzIGhhcHBlbnMgZm9yCisgICAqIGFiYW5kb25fY29udGFpbmVyX2lmX29wZW4gKCZvdXRlciwgJmlubmVyKSBpZiB0aGUgc2Vjb25kIG9wZW5fY29udGFpbmVyCisgICAqIGNhbGwgZmFpbGVkLCBvciBpZiB0aGUgc2Vjb25kIGNsb3NlX2NvbnRhaW5lciBjYWxsIGZhaWxlZC4gKi8KKyAgaWYgKF9kYnVzX21lc3NhZ2VfcmVhbF9pdGVyX2lzX3plcm9lZCAocmVhbF9zdWIpKQorICAgIHJldHVybjsKKworI2lmbmRlZiBEQlVTX0RJU0FCTEVfQ0hFQ0tTCisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChfZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2NoZWNrIChyZWFsX3N1YikpOworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAocmVhbF9zdWItPml0ZXJfdHlwZSA9PSBEQlVTX01FU1NBR0VfSVRFUl9UWVBFX1dSSVRFUik7CisjZW5kaWYKKworICAvKiBJZiBuZWl0aGVyIHRoZSBwYXJlbnQgbm9yIHRoZSBjaGlsZCBpcyB6ZXJvZWQgb3V0LCB0aGVuIHdlIGdlbnVpbmVseQorICAgKiBoYXZlIGFuIG9wZW4gY29udGFpbmVyOyBjbG9zZSBpdC4gSW4gdGhlIGNvZGUgc2FtcGxlIGluIHRoZSBkb2MtY29tbWVudCwKKyAgICogdGhpcyBoYXBwZW5zIGZvciBhYmFuZG9uX2NvbnRhaW5lcl9pZl9vcGVuICgmb3V0ZXIsICZpbm5lcikgaWYgdGhlCisgICAqIGFwcGVuZF9iYXNpYyBjYWxsIGZhaWxlZC4gKi8KKyAgX2RidXNfbWVzc2FnZV9pdGVyX2FiYW5kb25fc2lnbmF0dXJlIChyZWFsKTsKKyAgX2RidXNfbWVzc2FnZV9yZWFsX2l0ZXJfemVybyAocmVhbF9zdWIpOworfQorCisvKioKKyAqIFNldHMgYSBmbGFnIGluZGljYXRpbmcgdGhhdCB0aGUgbWVzc2FnZSBkb2VzIG5vdCB3YW50IGEgcmVwbHk7IGlmCisgKiB0aGlzIGZsYWcgaXMgc2V0LCB0aGUgb3RoZXIgZW5kIG9mIHRoZSBjb25uZWN0aW9uIG1heSAoYnV0IGlzIG5vdAorICogcmVxdWlyZWQgdG8pIG9wdGltaXplIGJ5IG5vdCBzZW5kaW5nIG1ldGhvZCByZXR1cm4gb3IgZXJyb3IKKyAqIHJlcGxpZXMuIElmIHRoaXMgZmxhZyBpcyBzZXQsIHRoZXJlIGlzIG5vIHdheSB0byBrbm93IHdoZXRoZXIgdGhlCisgKiBtZXNzYWdlIHN1Y2Nlc3NmdWxseSBhcnJpdmVkIGF0IHRoZSByZW1vdGUgZW5kLiBOb3JtYWxseSB5b3Uga25vdyBhCisgKiBtZXNzYWdlIHdhcyByZWNlaXZlZCB3aGVuIHlvdSByZWNlaXZlIHRoZSByZXBseSB0byBpdC4KKyAqCisgKiBUaGUgZmxhZyBpcyAjRkFMU0UgYnkgZGVmYXVsdCwgdGhhdCBpcyBieSBkZWZhdWx0IHRoZSBvdGhlciBlbmQgaXMKKyAqIHJlcXVpcmVkIHRvIHJlcGx5LgorICoKKyAqIE9uIHRoZSBwcm90b2NvbCBsZXZlbCB0aGlzIHRvZ2dsZXMgI0RCVVNfSEVBREVSX0ZMQUdfTk9fUkVQTFlfRVhQRUNURUQKKyAqIAorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UKKyAqIEBwYXJhbSBub19yZXBseSAjVFJVRSBpZiBubyByZXBseSBpcyBkZXNpcmVkCisgKi8KK3ZvaWQKK2RidXNfbWVzc2FnZV9zZXRfbm9fcmVwbHkgKERCdXNNZXNzYWdlICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgIG5vX3JlcGx5KQoreworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAobWVzc2FnZSAhPSBOVUxMKTsKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKCFtZXNzYWdlLT5sb2NrZWQpOworCisgIF9kYnVzX2hlYWRlcl90b2dnbGVfZmxhZyAoJm1lc3NhZ2UtPmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0hFQURFUl9GTEFHX05PX1JFUExZX0VYUEVDVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vX3JlcGx5KTsKK30KKworLyoqCisgKiBSZXR1cm5zICNUUlVFIGlmIHRoZSBtZXNzYWdlIGRvZXMgbm90IGV4cGVjdAorICogYSByZXBseS4KKyAqCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZQorICogQHJldHVybnMgI1RSVUUgaWYgdGhlIG1lc3NhZ2Ugc2VuZGVyIGlzbid0IHdhaXRpbmcgZm9yIGEgcmVwbHkKKyAqLworZGJ1c19ib29sX3QKK2RidXNfbWVzc2FnZV9nZXRfbm9fcmVwbHkgKERCdXNNZXNzYWdlICptZXNzYWdlKQoreworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG1lc3NhZ2UgIT0gTlVMTCwgRkFMU0UpOworCisgIHJldHVybiBfZGJ1c19oZWFkZXJfZ2V0X2ZsYWcgKCZtZXNzYWdlLT5oZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSEVBREVSX0ZMQUdfTk9fUkVQTFlfRVhQRUNURUQpOworfQorCisvKioKKyAqIFNldHMgYSBmbGFnIGluZGljYXRpbmcgdGhhdCBhbiBvd25lciBmb3IgdGhlIGRlc3RpbmF0aW9uIG5hbWUgd2lsbAorICogYmUgYXV0b21hdGljYWxseSBzdGFydGVkIGJlZm9yZSB0aGUgbWVzc2FnZSBpcyBkZWxpdmVyZWQuIFdoZW4gdGhpcworICogZmxhZyBpcyBzZXQsIHRoZSBtZXNzYWdlIGlzIGhlbGQgdW50aWwgYSBuYW1lIG93bmVyIGZpbmlzaGVzCisgKiBzdGFydGluZyB1cCwgb3IgZmFpbHMgdG8gc3RhcnQgdXAuIEluIGNhc2Ugb2YgZmFpbHVyZSwgdGhlIHJlcGx5CisgKiB3aWxsIGJlIGFuIGVycm9yLgorICoKKyAqIFRoZSBmbGFnIGlzIHNldCB0byAjVFJVRSBieSBkZWZhdWx0LCBpLmUuIGF1dG8gc3RhcnRpbmcgaXMgdGhlIGRlZmF1bHQuCisgKgorICogT24gdGhlIHByb3RvY29sIGxldmVsIHRoaXMgdG9nZ2xlcyAjREJVU19IRUFERVJfRkxBR19OT19BVVRPX1NUQVJUCisgKiAKKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlCisgKiBAcGFyYW0gYXV0b19zdGFydCAjVFJVRSBpZiBhdXRvLXN0YXJ0aW5nIGlzIGRlc2lyZWQKKyAqLwordm9pZAorZGJ1c19tZXNzYWdlX3NldF9hdXRvX3N0YXJ0IChEQnVzTWVzc2FnZSAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgIGF1dG9fc3RhcnQpCit7CisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChtZXNzYWdlICE9IE5VTEwpOworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAoIW1lc3NhZ2UtPmxvY2tlZCk7CisKKyAgX2RidXNfaGVhZGVyX3RvZ2dsZV9mbGFnICgmbWVzc2FnZS0+aGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSEVBREVSX0ZMQUdfTk9fQVVUT19TVEFSVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAhYXV0b19zdGFydCk7Cit9CisKKy8qKgorICogUmV0dXJucyAjVFJVRSBpZiB0aGUgbWVzc2FnZSB3aWxsIGNhdXNlIGFuIG93bmVyIGZvcgorICogZGVzdGluYXRpb24gbmFtZSB0byBiZSBhdXRvLXN0YXJ0ZWQuCisgKgorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSBtZXNzYWdlIHdpbGwgdXNlIGF1dG8tc3RhcnQKKyAqLworZGJ1c19ib29sX3QKK2RidXNfbWVzc2FnZV9nZXRfYXV0b19zdGFydCAoREJ1c01lc3NhZ2UgKm1lc3NhZ2UpCit7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAobWVzc2FnZSAhPSBOVUxMLCBGQUxTRSk7CisKKyAgcmV0dXJuICFfZGJ1c19oZWFkZXJfZ2V0X2ZsYWcgKCZtZXNzYWdlLT5oZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0hFQURFUl9GTEFHX05PX0FVVE9fU1RBUlQpOworfQorCisKKy8qKgorICogU2V0cyB0aGUgb2JqZWN0IHBhdGggdGhpcyBtZXNzYWdlIGlzIGJlaW5nIHNlbnQgdG8gKGZvcgorICogREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX0NBTEwpIG9yIHRoZSBvbmUgYSBzaWduYWwgaXMgYmVpbmcKKyAqIGVtaXR0ZWQgZnJvbSAoZm9yIERCVVNfTUVTU0FHRV9UWVBFX1NJR05BTCkuCisgKgorICogVGhlIHBhdGggbXVzdCBjb250YWluIG9ubHkgdmFsaWQgY2hhcmFjdGVycyBhcyBkZWZpbmVkCisgKiBpbiB0aGUgRC1CdXMgc3BlY2lmaWNhdGlvbi4KKyAqCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZQorICogQHBhcmFtIG9iamVjdF9wYXRoIHRoZSBwYXRoIG9yICNOVUxMIHRvIHVuc2V0CisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm90IGVub3VnaCBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK2RidXNfbWVzc2FnZV9zZXRfcGF0aCAoREJ1c01lc3NhZ2UgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAqb2JqZWN0X3BhdGgpCit7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAobWVzc2FnZSAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoIW1lc3NhZ2UtPmxvY2tlZCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG9iamVjdF9wYXRoID09IE5VTEwgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19jaGVja19pc192YWxpZF9wYXRoIChvYmplY3RfcGF0aCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UpOworCisgIHJldHVybiBzZXRfb3JfZGVsZXRlX3N0cmluZ19maWVsZCAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0hFQURFUl9GSUVMRF9QQVRILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9PQkpFQ1RfUEFUSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RfcGF0aCk7Cit9CisKKy8qKgorICogR2V0cyB0aGUgb2JqZWN0IHBhdGggdGhpcyBtZXNzYWdlIGlzIGJlaW5nIHNlbnQgdG8gKGZvcgorICogREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX0NBTEwpIG9yIGJlaW5nIGVtaXR0ZWQgZnJvbSAoZm9yCisgKiBEQlVTX01FU1NBR0VfVFlQRV9TSUdOQUwpLiBSZXR1cm5zICNOVUxMIGlmIG5vbmUuCisgKgorICogU2VlIGFsc28gZGJ1c19tZXNzYWdlX2dldF9wYXRoX2RlY29tcG9zZWQoKS4KKyAqCisgKiBUaGUgcmV0dXJuZWQgc3RyaW5nIGJlY29tZXMgaW52YWxpZCBpZiB0aGUgbWVzc2FnZSBpcworICogbW9kaWZpZWQsIHNpbmNlIGl0IHBvaW50cyBpbnRvIHRoZSB3aXJlLW1hcnNoYWxlZCBtZXNzYWdlIGRhdGEuCisgKiAKKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlCisgKiBAcmV0dXJucyB0aGUgcGF0aCAoc2hvdWxkIG5vdCBiZSBmcmVlZCkgb3IgI05VTEwKKyAqLworY29uc3QgY2hhcioKK2RidXNfbWVzc2FnZV9nZXRfcGF0aCAoREJ1c01lc3NhZ2UgICAqbWVzc2FnZSkKK3sKKyAgY29uc3QgY2hhciAqdjsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG1lc3NhZ2UgIT0gTlVMTCwgTlVMTCk7CisKKyAgdiA9IE5VTEw7IC8qIGluIGNhc2UgZmllbGQgZG9lc24ndCBleGlzdCAqLworICBfZGJ1c19oZWFkZXJfZ2V0X2ZpZWxkX2Jhc2ljICgmbWVzc2FnZS0+aGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0hFQURFUl9GSUVMRF9QQVRILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfT0JKRUNUX1BBVEgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopICZ2KTsKKyAgcmV0dXJuIHY7Cit9CisKKy8qKgorICogQ2hlY2tzIGlmIHRoZSBtZXNzYWdlIGhhcyBhIHBhcnRpY3VsYXIgb2JqZWN0IHBhdGguICBUaGUgb2JqZWN0CisgKiBwYXRoIGlzIHRoZSBkZXN0aW5hdGlvbiBvYmplY3QgZm9yIGEgbWV0aG9kIGNhbGwgb3IgdGhlIGVtaXR0aW5nCisgKiBvYmplY3QgZm9yIGEgc2lnbmFsLgorICoKKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlCisgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aCBuYW1lCisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGVyZSBpcyBhIHBhdGggZmllbGQgaW4gdGhlIGhlYWRlcgorICovCitkYnVzX2Jvb2xfdAorZGJ1c19tZXNzYWdlX2hhc19wYXRoIChEQnVzTWVzc2FnZSAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICpwYXRoKQoreworICBjb25zdCBjaGFyICptc2dfcGF0aDsKKyAgbXNnX3BhdGggPSBkYnVzX21lc3NhZ2VfZ2V0X3BhdGggKG1lc3NhZ2UpOworICAKKyAgaWYgKG1zZ19wYXRoID09IE5VTEwpCisgICAgeworICAgICAgaWYgKHBhdGggPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKHBhdGggPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisgICAKKyAgaWYgKHN0cmNtcCAobXNnX3BhdGgsIHBhdGgpID09IDApCisgICAgcmV0dXJuIFRSVUU7CisKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKioKKyAqIEdldHMgdGhlIG9iamVjdCBwYXRoIHRoaXMgbWVzc2FnZSBpcyBiZWluZyBzZW50IHRvCisgKiAoZm9yIERCVVNfTUVTU0FHRV9UWVBFX01FVEhPRF9DQUxMKSBvciBiZWluZyBlbWl0dGVkCisgKiBmcm9tIChmb3IgREJVU19NRVNTQUdFX1RZUEVfU0lHTkFMKSBpbiBhIGRlY29tcG9zZWQKKyAqIGZvcm1hdCAob25lIGFycmF5IGVsZW1lbnQgcGVyIHBhdGggY29tcG9uZW50KS4KKyAqIEZyZWUgdGhlIHJldHVybmVkIGFycmF5IHdpdGggZGJ1c19mcmVlX3N0cmluZ19hcnJheSgpLgorICoKKyAqIEFuIGVtcHR5IGJ1dCBub24tTlVMTCBwYXRoIGFycmF5IG1lYW5zIHRoZSBwYXRoICIvIi4KKyAqIFNvIHRoZSBwYXRoICIvZm9vL2JhciIgYmVjb21lcyB7ICJmb28iLCAiYmFyIiwgTlVMTCB9CisgKiBhbmQgdGhlIHBhdGggIi8iIGJlY29tZXMgeyBOVUxMIH0uCisgKgorICogU2VlIGFsc28gZGJ1c19tZXNzYWdlX2dldF9wYXRoKCkuCisgKiAKKyAqIEB0b2RvIHRoaXMgY291bGQgYmUgb3B0aW1pemVkIGJ5IHVzaW5nIHRoZSBsZW4gZnJvbSB0aGUgbWVzc2FnZQorICogaW5zdGVhZCBvZiBjYWxsaW5nIHN0cmxlbigpIGFnYWluCisgKgorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UKKyAqIEBwYXJhbSBwYXRoIHBsYWNlIHRvIHN0b3JlIGFsbG9jYXRlZCBhcnJheSBvZiBwYXRoIGNvbXBvbmVudHM7ICNOVUxMIHNldCBoZXJlIGlmIG5vIHBhdGggZmllbGQgZXhpc3RzCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm8gbWVtb3J5IHRvIGFsbG9jYXRlIHRoZSBhcnJheQorICovCitkYnVzX2Jvb2xfdAorZGJ1c19tZXNzYWdlX2dldF9wYXRoX2RlY29tcG9zZWQgKERCdXNNZXNzYWdlICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAgKioqcGF0aCkKK3sKKyAgY29uc3QgY2hhciAqdjsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG1lc3NhZ2UgIT0gTlVMTCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHBhdGggIT0gTlVMTCwgRkFMU0UpOworCisgICpwYXRoID0gTlVMTDsKKworICB2ID0gZGJ1c19tZXNzYWdlX2dldF9wYXRoIChtZXNzYWdlKTsKKyAgaWYgKHYgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX2RlY29tcG9zZV9wYXRoICh2LCBzdHJsZW4gKHYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCwgTlVMTCkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIFNldHMgdGhlIGludGVyZmFjZSB0aGlzIG1lc3NhZ2UgaXMgYmVpbmcgc2VudCB0bworICogKGZvciBEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfQ0FMTCkgb3IKKyAqIHRoZSBpbnRlcmZhY2UgYSBzaWduYWwgaXMgYmVpbmcgZW1pdHRlZCBmcm9tCisgKiAoZm9yIERCVVNfTUVTU0FHRV9UWVBFX1NJR05BTCkuCisgKgorICogVGhlIGludGVyZmFjZSBuYW1lIG11c3QgY29udGFpbiBvbmx5IHZhbGlkIGNoYXJhY3RlcnMgYXMgZGVmaW5lZAorICogaW4gdGhlIEQtQnVzIHNwZWNpZmljYXRpb24uCisgKiAKKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlCisgKiBAcGFyYW0gaWZhY2UgdGhlIGludGVyZmFjZSBvciAjTlVMTCB0byB1bnNldAorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vdCBlbm91Z2ggbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitkYnVzX21lc3NhZ2Vfc2V0X2ludGVyZmFjZSAoREJ1c01lc3NhZ2UgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAqaWZhY2UpCit7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAobWVzc2FnZSAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoIW1lc3NhZ2UtPmxvY2tlZCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGlmYWNlID09IE5VTEwgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19jaGVja19pc192YWxpZF9pbnRlcmZhY2UgKGlmYWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSk7CisKKyAgcmV0dXJuIHNldF9vcl9kZWxldGVfc3RyaW5nX2ZpZWxkIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSEVBREVSX0ZJRUxEX0lOVEVSRkFDRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmYWNlKTsKK30KKworLyoqCisgKiBHZXRzIHRoZSBpbnRlcmZhY2UgdGhpcyBtZXNzYWdlIGlzIGJlaW5nIHNlbnQgdG8KKyAqIChmb3IgREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX0NBTEwpIG9yIGJlaW5nIGVtaXR0ZWQKKyAqIGZyb20gKGZvciBEQlVTX01FU1NBR0VfVFlQRV9TSUdOQUwpLgorICogVGhlIGludGVyZmFjZSBuYW1lIGlzIGZ1bGx5LXF1YWxpZmllZCAobmFtZXNwYWNlZCkuCisgKiBSZXR1cm5zICNOVUxMIGlmIG5vbmUuCisgKgorICogVGhlIHJldHVybmVkIHN0cmluZyBiZWNvbWVzIGludmFsaWQgaWYgdGhlIG1lc3NhZ2UgaXMKKyAqIG1vZGlmaWVkLCBzaW5jZSBpdCBwb2ludHMgaW50byB0aGUgd2lyZS1tYXJzaGFsZWQgbWVzc2FnZSBkYXRhLgorICoKKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlCisgKiBAcmV0dXJucyB0aGUgbWVzc2FnZSBpbnRlcmZhY2UgKHNob3VsZCBub3QgYmUgZnJlZWQpIG9yICNOVUxMCisgKi8KK2NvbnN0IGNoYXIqCitkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAoREJ1c01lc3NhZ2UgKm1lc3NhZ2UpCit7CisgIGNvbnN0IGNoYXIgKnY7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChtZXNzYWdlICE9IE5VTEwsIE5VTEwpOworCisgIHYgPSBOVUxMOyAvKiBpbiBjYXNlIGZpZWxkIGRvZXNuJ3QgZXhpc3QgKi8KKyAgX2RidXNfaGVhZGVyX2dldF9maWVsZF9iYXNpYyAoJm1lc3NhZ2UtPmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19IRUFERVJfRklFTERfSU5URVJGQUNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSAmdik7CisgIHJldHVybiB2OworfQorCisvKioKKyAqIENoZWNrcyBpZiB0aGUgbWVzc2FnZSBoYXMgYW4gaW50ZXJmYWNlCisgKgorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UKKyAqIEBwYXJhbSBpZmFjZSB0aGUgaW50ZXJmYWNlIG5hbWUKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSBpbnRlcmZhY2UgZmllbGQgaW4gdGhlIGhlYWRlciBtYXRjaGVzCisgKi8KK2RidXNfYm9vbF90CitkYnVzX21lc3NhZ2VfaGFzX2ludGVyZmFjZSAoREJ1c01lc3NhZ2UgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICppZmFjZSkKK3sKKyAgY29uc3QgY2hhciAqbXNnX2ludGVyZmFjZTsKKyAgbXNnX2ludGVyZmFjZSA9IGRidXNfbWVzc2FnZV9nZXRfaW50ZXJmYWNlIChtZXNzYWdlKTsKKyAgIAorICBpZiAobXNnX2ludGVyZmFjZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChpZmFjZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoaWZhY2UgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisgICAgIAorICBpZiAoc3RyY21wIChtc2dfaW50ZXJmYWNlLCBpZmFjZSkgPT0gMCkKKyAgICByZXR1cm4gVFJVRTsKKworICByZXR1cm4gRkFMU0U7CisKK30KKworLyoqCisgKiBTZXRzIHRoZSBpbnRlcmZhY2UgbWVtYmVyIGJlaW5nIGludm9rZWQKKyAqIChEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfQ0FMTCkgb3IgZW1pdHRlZAorICogKERCVVNfTUVTU0FHRV9UWVBFX1NJR05BTCkuCisgKgorICogVGhlIG1lbWJlciBuYW1lIG11c3QgY29udGFpbiBvbmx5IHZhbGlkIGNoYXJhY3RlcnMgYXMgZGVmaW5lZAorICogaW4gdGhlIEQtQnVzIHNwZWNpZmljYXRpb24uCisgKgorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UKKyAqIEBwYXJhbSBtZW1iZXIgdGhlIG1lbWJlciBvciAjTlVMTCB0byB1bnNldAorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vdCBlbm91Z2ggbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitkYnVzX21lc3NhZ2Vfc2V0X21lbWJlciAoREJ1c01lc3NhZ2UgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAqbWVtYmVyKQoreworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG1lc3NhZ2UgIT0gTlVMTCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKCFtZXNzYWdlLT5sb2NrZWQsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChtZW1iZXIgPT0gTlVMTCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX2NoZWNrX2lzX3ZhbGlkX21lbWJlciAobWVtYmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSk7CisKKyAgcmV0dXJuIHNldF9vcl9kZWxldGVfc3RyaW5nX2ZpZWxkIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSEVBREVSX0ZJRUxEX01FTUJFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWJlcik7Cit9CisKKy8qKgorICogR2V0cyB0aGUgaW50ZXJmYWNlIG1lbWJlciBiZWluZyBpbnZva2VkCisgKiAoREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX0NBTEwpIG9yIGVtaXR0ZWQKKyAqIChEQlVTX01FU1NBR0VfVFlQRV9TSUdOQUwpLiBSZXR1cm5zICNOVUxMIGlmIG5vbmUuCisgKgorICogVGhlIHJldHVybmVkIHN0cmluZyBiZWNvbWVzIGludmFsaWQgaWYgdGhlIG1lc3NhZ2UgaXMKKyAqIG1vZGlmaWVkLCBzaW5jZSBpdCBwb2ludHMgaW50byB0aGUgd2lyZS1tYXJzaGFsZWQgbWVzc2FnZSBkYXRhLgorICogCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZQorICogQHJldHVybnMgdGhlIG1lbWJlciBuYW1lIChzaG91bGQgbm90IGJlIGZyZWVkKSBvciAjTlVMTAorICovCitjb25zdCBjaGFyKgorZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKERCdXNNZXNzYWdlICptZXNzYWdlKQoreworICBjb25zdCBjaGFyICp2OworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAobWVzc2FnZSAhPSBOVUxMLCBOVUxMKTsKKworICB2ID0gTlVMTDsgLyogaW4gY2FzZSBmaWVsZCBkb2Vzbid0IGV4aXN0ICovCisgIF9kYnVzX2hlYWRlcl9nZXRfZmllbGRfYmFzaWMgKCZtZXNzYWdlLT5oZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSEVBREVSX0ZJRUxEX01FTUJFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikgJnYpOworICByZXR1cm4gdjsKK30KKworLyoqCisgKiBDaGVja3MgaWYgdGhlIG1lc3NhZ2UgaGFzIGFuIGludGVyZmFjZSBtZW1iZXIKKyAqCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZQorICogQHBhcmFtIG1lbWJlciB0aGUgbWVtYmVyIG5hbWUKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZXJlIGlzIGEgbWVtYmVyIGZpZWxkIGluIHRoZSBoZWFkZXIKKyAqLworZGJ1c19ib29sX3QKK2RidXNfbWVzc2FnZV9oYXNfbWVtYmVyIChEQnVzTWVzc2FnZSAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgKm1lbWJlcikKK3sKKyAgY29uc3QgY2hhciAqbXNnX21lbWJlcjsKKyAgbXNnX21lbWJlciA9IGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKTsKKyAKKyAgaWYgKG1zZ19tZW1iZXIgPT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAobWVtYmVyID09IE5VTEwpCisgICAgICAgIHJldHVybiBUUlVFOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmIChtZW1iZXIgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisgICAgCisgIGlmIChzdHJjbXAgKG1zZ19tZW1iZXIsIG1lbWJlcikgPT0gMCkKKyAgICByZXR1cm4gVFJVRTsKKworICByZXR1cm4gRkFMU0U7CisKK30KKworLyoqCisgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSBlcnJvciAoREJVU19NRVNTQUdFX1RZUEVfRVJST1IpLgorICogVGhlIG5hbWUgaXMgZnVsbHktcXVhbGlmaWVkIChuYW1lc3BhY2VkKS4KKyAqCisgKiBUaGUgZXJyb3IgbmFtZSBtdXN0IGNvbnRhaW4gb25seSB2YWxpZCBjaGFyYWN0ZXJzIGFzIGRlZmluZWQKKyAqIGluIHRoZSBELUJ1cyBzcGVjaWZpY2F0aW9uLgorICoKKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlCisgKiBAcGFyYW0gZXJyb3JfbmFtZSB0aGUgbmFtZSBvciAjTlVMTCB0byB1bnNldAorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vdCBlbm91Z2ggbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitkYnVzX21lc3NhZ2Vfc2V0X2Vycm9yX25hbWUgKERCdXNNZXNzYWdlICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICplcnJvcl9uYW1lKQoreworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG1lc3NhZ2UgIT0gTlVMTCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKCFtZXNzYWdlLT5sb2NrZWQsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChlcnJvcl9uYW1lID09IE5VTEwgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19jaGVja19pc192YWxpZF9lcnJvcl9uYW1lIChlcnJvcl9uYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSk7CisKKyAgcmV0dXJuIHNldF9vcl9kZWxldGVfc3RyaW5nX2ZpZWxkIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSEVBREVSX0ZJRUxEX0VSUk9SX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9uYW1lKTsKK30KKworLyoqCisgKiBHZXRzIHRoZSBlcnJvciBuYW1lIChEQlVTX01FU1NBR0VfVFlQRV9FUlJPUiBvbmx5KQorICogb3IgI05VTEwgaWYgbm9uZS4KKyAqCisgKiBUaGUgcmV0dXJuZWQgc3RyaW5nIGJlY29tZXMgaW52YWxpZCBpZiB0aGUgbWVzc2FnZSBpcworICogbW9kaWZpZWQsIHNpbmNlIGl0IHBvaW50cyBpbnRvIHRoZSB3aXJlLW1hcnNoYWxlZCBtZXNzYWdlIGRhdGEuCisgKiAKKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlCisgKiBAcmV0dXJucyB0aGUgZXJyb3IgbmFtZSAoc2hvdWxkIG5vdCBiZSBmcmVlZCkgb3IgI05VTEwKKyAqLworY29uc3QgY2hhcioKK2RidXNfbWVzc2FnZV9nZXRfZXJyb3JfbmFtZSAoREJ1c01lc3NhZ2UgKm1lc3NhZ2UpCit7CisgIGNvbnN0IGNoYXIgKnY7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChtZXNzYWdlICE9IE5VTEwsIE5VTEwpOworCisgIHYgPSBOVUxMOyAvKiBpbiBjYXNlIGZpZWxkIGRvZXNuJ3QgZXhpc3QgKi8KKyAgX2RidXNfaGVhZGVyX2dldF9maWVsZF9iYXNpYyAoJm1lc3NhZ2UtPmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19IRUFERVJfRklFTERfRVJST1JfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikgJnYpOworICByZXR1cm4gdjsKK30KKworLyoqCisgKiBTZXRzIHRoZSBtZXNzYWdlJ3MgZGVzdGluYXRpb24uIFRoZSBkZXN0aW5hdGlvbiBpcyB0aGUgbmFtZSBvZgorICogYW5vdGhlciBjb25uZWN0aW9uIG9uIHRoZSBidXMgYW5kIG1heSBiZSBlaXRoZXIgdGhlIHVuaXF1ZSBuYW1lCisgKiBhc3NpZ25lZCBieSB0aGUgYnVzIHRvIGVhY2ggY29ubmVjdGlvbiwgb3IgYSB3ZWxsLWtub3duIG5hbWUKKyAqIHNwZWNpZmllZCBpbiBhZHZhbmNlLgorICoKKyAqIFRoZSBkZXN0aW5hdGlvbiBuYW1lIG11c3QgY29udGFpbiBvbmx5IHZhbGlkIGNoYXJhY3RlcnMgYXMgZGVmaW5lZAorICogaW4gdGhlIEQtQnVzIHNwZWNpZmljYXRpb24uCisgKiAKKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlCisgKiBAcGFyYW0gZGVzdGluYXRpb24gdGhlIGRlc3RpbmF0aW9uIG5hbWUgb3IgI05VTEwgdG8gdW5zZXQKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBub3QgZW5vdWdoIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorZGJ1c19tZXNzYWdlX3NldF9kZXN0aW5hdGlvbiAoREJ1c01lc3NhZ2UgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICpkZXN0aW5hdGlvbikKK3sKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChtZXNzYWdlICE9IE5VTEwsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsICghbWVzc2FnZS0+bG9ja2VkLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoZGVzdGluYXRpb24gPT0gTlVMTCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX2NoZWNrX2lzX3ZhbGlkX2J1c19uYW1lIChkZXN0aW5hdGlvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UpOworCisgIHJldHVybiBzZXRfb3JfZGVsZXRlX3N0cmluZ19maWVsZCAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0hFQURFUl9GSUVMRF9ERVNUSU5BVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uKTsKK30KKworLyoqCisgKiBHZXRzIHRoZSBkZXN0aW5hdGlvbiBvZiBhIG1lc3NhZ2Ugb3IgI05VTEwgaWYgdGhlcmUgaXMgbm9uZSBzZXQuCisgKgorICogVGhlIHJldHVybmVkIHN0cmluZyBiZWNvbWVzIGludmFsaWQgaWYgdGhlIG1lc3NhZ2UgaXMKKyAqIG1vZGlmaWVkLCBzaW5jZSBpdCBwb2ludHMgaW50byB0aGUgd2lyZS1tYXJzaGFsZWQgbWVzc2FnZSBkYXRhLgorICoKKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlCisgKiBAcmV0dXJucyB0aGUgbWVzc2FnZSBkZXN0aW5hdGlvbiAoc2hvdWxkIG5vdCBiZSBmcmVlZCkgb3IgI05VTEwKKyAqLworY29uc3QgY2hhcioKK2RidXNfbWVzc2FnZV9nZXRfZGVzdGluYXRpb24gKERCdXNNZXNzYWdlICptZXNzYWdlKQoreworICBjb25zdCBjaGFyICp2OworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAobWVzc2FnZSAhPSBOVUxMLCBOVUxMKTsKKworICB2ID0gTlVMTDsgLyogaW4gY2FzZSBmaWVsZCBkb2Vzbid0IGV4aXN0ICovCisgIF9kYnVzX2hlYWRlcl9nZXRfZmllbGRfYmFzaWMgKCZtZXNzYWdlLT5oZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSEVBREVSX0ZJRUxEX0RFU1RJTkFUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSAmdik7CisgIHJldHVybiB2OworfQorCisvKioKKyAqIFNldHMgdGhlIG1lc3NhZ2Ugc2VuZGVyLgorICoKKyAqIFRoZSBzZW5kZXIgbXVzdCBiZSBhIHZhbGlkIGJ1cyBuYW1lIGFzIGRlZmluZWQgaW4gdGhlIEQtQnVzCisgKiBzcGVjaWZpY2F0aW9uLgorICoKKyAqIFVzdWFsbHkgeW91IGRvbid0IHdhbnQgdG8gY2FsbCB0aGlzLiBUaGUgbWVzc2FnZSBidXMgZGFlbW9uIHdpbGwKKyAqIGNhbGwgaXQgdG8gc2V0IHRoZSBvcmlnaW4gb2YgZWFjaCBtZXNzYWdlLiBJZiB5b3UgYXJlbid0IGltcGxlbWVudGluZworICogYSBtZXNzYWdlIGJ1cyBkYWVtb24geW91IHNob3VsZG4ndCBuZWVkIHRvIHNldCB0aGUgc2VuZGVyLgorICoKKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlCisgKiBAcGFyYW0gc2VuZGVyIHRoZSBzZW5kZXIgb3IgI05VTEwgdG8gdW5zZXQKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBub3QgZW5vdWdoIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorZGJ1c19tZXNzYWdlX3NldF9zZW5kZXIgKERCdXNNZXNzYWdlICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgKnNlbmRlcikKK3sKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChtZXNzYWdlICE9IE5VTEwsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsICghbWVzc2FnZS0+bG9ja2VkLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoc2VuZGVyID09IE5VTEwgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19jaGVja19pc192YWxpZF9idXNfbmFtZSAoc2VuZGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSk7CisKKyAgcmV0dXJuIHNldF9vcl9kZWxldGVfc3RyaW5nX2ZpZWxkIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSEVBREVSX0ZJRUxEX1NFTkRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRlcik7Cit9CisKKy8qKgorICogR2V0cyB0aGUgdW5pcXVlIG5hbWUgb2YgdGhlIGNvbm5lY3Rpb24gd2hpY2ggb3JpZ2luYXRlZCB0aGlzCisgKiBtZXNzYWdlLCBvciAjTlVMTCBpZiB1bmtub3duIG9yIGluYXBwbGljYWJsZS4gVGhlIHNlbmRlciBpcyBmaWxsZWQKKyAqIGluIGJ5IHRoZSBtZXNzYWdlIGJ1cy4KKyAqCisgKiBOb3RlLCB0aGUgcmV0dXJuZWQgc2VuZGVyIGlzIGFsd2F5cyB0aGUgdW5pcXVlIGJ1cyBuYW1lLgorICogQ29ubmVjdGlvbnMgbWF5IG93biBtdWx0aXBsZSBvdGhlciBidXMgbmFtZXMsIGJ1dCB0aG9zZQorICogYXJlIG5vdCBmb3VuZCBpbiB0aGUgc2VuZGVyIGZpZWxkLgorICogCisgKiBUaGUgcmV0dXJuZWQgc3RyaW5nIGJlY29tZXMgaW52YWxpZCBpZiB0aGUgbWVzc2FnZSBpcworICogbW9kaWZpZWQsIHNpbmNlIGl0IHBvaW50cyBpbnRvIHRoZSB3aXJlLW1hcnNoYWxlZCBtZXNzYWdlIGRhdGEuCisgKgorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UKKyAqIEByZXR1cm5zIHRoZSB1bmlxdWUgbmFtZSBvZiB0aGUgc2VuZGVyIG9yICNOVUxMCisgKi8KK2NvbnN0IGNoYXIqCitkYnVzX21lc3NhZ2VfZ2V0X3NlbmRlciAoREJ1c01lc3NhZ2UgKm1lc3NhZ2UpCit7CisgIGNvbnN0IGNoYXIgKnY7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChtZXNzYWdlICE9IE5VTEwsIE5VTEwpOworCisgIHYgPSBOVUxMOyAvKiBpbiBjYXNlIGZpZWxkIGRvZXNuJ3QgZXhpc3QgKi8KKyAgX2RidXNfaGVhZGVyX2dldF9maWVsZF9iYXNpYyAoJm1lc3NhZ2UtPmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19IRUFERVJfRklFTERfU0VOREVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSAmdik7CisgIHJldHVybiB2OworfQorCisvKioKKyAqIEdldHMgdGhlIHR5cGUgc2lnbmF0dXJlIG9mIHRoZSBtZXNzYWdlLCBpLmUuIHRoZSBhcmd1bWVudHMgaW4gdGhlCisgKiBtZXNzYWdlIHBheWxvYWQuIFRoZSBzaWduYXR1cmUgaW5jbHVkZXMgb25seSAiaW4iIGFyZ3VtZW50cyBmb3IKKyAqICNEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfQ0FMTCBhbmQgb25seSAib3V0IiBhcmd1bWVudHMgZm9yCisgKiAjREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX1JFVFVSTiwgc28gaXMgc2xpZ2h0bHkgZGlmZmVyZW50IGZyb20KKyAqIHdoYXQgeW91IG1pZ2h0IGV4cGVjdCAodGhhdCBpcywgaXQgZG9lcyBub3QgaW5jbHVkZSB0aGUgc2lnbmF0dXJlIG9mIHRoZQorICogZW50aXJlIEMrKy1zdHlsZSBtZXRob2QpLgorICoKKyAqIFRoZSBzaWduYXR1cmUgaXMgYSBzdHJpbmcgbWFkZSB1cCBvZiB0eXBlIGNvZGVzIHN1Y2ggYXMKKyAqICNEQlVTX1RZUEVfSU5UMzIuIFRoZSBzdHJpbmcgaXMgdGVybWluYXRlZCB3aXRoIG51bCAobnVsIGlzIGFsc28KKyAqIHRoZSB2YWx1ZSBvZiAjREJVU19UWVBFX0lOVkFMSUQpLgorICoKKyAqIFRoZSByZXR1cm5lZCBzdHJpbmcgYmVjb21lcyBpbnZhbGlkIGlmIHRoZSBtZXNzYWdlIGlzCisgKiBtb2RpZmllZCwgc2luY2UgaXQgcG9pbnRzIGludG8gdGhlIHdpcmUtbWFyc2hhbGVkIG1lc3NhZ2UgZGF0YS4KKyAqCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZQorICogQHJldHVybnMgdGhlIHR5cGUgc2lnbmF0dXJlCisgKi8KK2NvbnN0IGNoYXIqCitkYnVzX21lc3NhZ2VfZ2V0X3NpZ25hdHVyZSAoREJ1c01lc3NhZ2UgKm1lc3NhZ2UpCit7CisgIGNvbnN0IERCdXNTdHJpbmcgKnR5cGVfc3RyOworICBpbnQgdHlwZV9wb3M7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChtZXNzYWdlICE9IE5VTEwsIE5VTEwpOworCisgIGdldF9jb25zdF9zaWduYXR1cmUgKCZtZXNzYWdlLT5oZWFkZXIsICZ0eXBlX3N0ciwgJnR5cGVfcG9zKTsKKworICByZXR1cm4gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhX2xlbiAodHlwZV9zdHIsIHR5cGVfcG9zLCAwKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitfZGJ1c19tZXNzYWdlX2hhc190eXBlX2ludGVyZmFjZV9tZW1iZXIgKERCdXNNZXNzYWdlICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAqbWVtYmVyKQoreworICBjb25zdCBjaGFyICpuOworCisgIF9kYnVzX2Fzc2VydCAobWVzc2FnZSAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChpZmFjZSAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChtZW1iZXIgIT0gTlVMTCk7CisKKyAgaWYgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkgIT0gdHlwZSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgLyogT3B0aW1pemUgYnkgY2hlY2tpbmcgdGhlIHNob3J0IG1lbWJlciBuYW1lIGZpcnN0CisgICAqIGluc3RlYWQgb2YgdGhlIGxvbmdlciBpbnRlcmZhY2UgbmFtZQorICAgKi8KKworICBuID0gZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKG1lc3NhZ2UpOworCisgIGlmIChuICYmIHN0cmNtcCAobiwgbWVtYmVyKSA9PSAwKQorICAgIHsKKyAgICAgIG4gPSBkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAobWVzc2FnZSk7CisKKyAgICAgIGlmIChuID09IE5VTEwgfHwgc3RyY21wIChuLCBpZmFjZSkgPT0gMCkKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIHJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBDaGVja3Mgd2hldGhlciB0aGUgbWVzc2FnZSBpcyBhIG1ldGhvZCBjYWxsIHdpdGggdGhlIGdpdmVuCisgKiBpbnRlcmZhY2UgYW5kIG1lbWJlciBmaWVsZHMuICBJZiB0aGUgbWVzc2FnZSBpcyBub3QKKyAqICNEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfQ0FMTCwgb3IgaGFzIGEgZGlmZmVyZW50IGludGVyZmFjZSBvcgorICogbWVtYmVyIGZpZWxkLCByZXR1cm5zICNGQUxTRS4gSWYgdGhlIGludGVyZmFjZSBmaWVsZCBpcyBtaXNzaW5nLAorICogdGhlbiBpdCB3aWxsIGJlIGFzc3VtZWQgZXF1YWwgdG8gdGhlIHByb3ZpZGVkIGludGVyZmFjZS4gIFRoZSBELUJ1cworICogcHJvdG9jb2wgYWxsb3dzIG1ldGhvZCBjYWxsZXJzIHRvIGxlYXZlIG91dCB0aGUgaW50ZXJmYWNlIG5hbWUuCisgKgorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UKKyAqIEBwYXJhbSBpZmFjZSB0aGUgbmFtZSB0byBjaGVjayAobXVzdCBub3QgYmUgI05VTEwpCisgKiBAcGFyYW0gbWV0aG9kIHRoZSBuYW1lIHRvIGNoZWNrIChtdXN0IG5vdCBiZSAjTlVMTCkKKyAqCisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGUgbWVzc2FnZSBpcyB0aGUgc3BlY2lmaWVkIG1ldGhvZCBjYWxsCisgKi8KK2RidXNfYm9vbF90CitkYnVzX21lc3NhZ2VfaXNfbWV0aG9kX2NhbGwgKERCdXNNZXNzYWdlICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICptZXRob2QpCit7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAobWVzc2FnZSAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoaWZhY2UgIT0gTlVMTCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG1ldGhvZCAhPSBOVUxMLCBGQUxTRSk7CisgIC8qIGRvbid0IGNoZWNrIHRoYXQgaW50ZXJmYWNlL21ldGhvZCBhcmUgdmFsaWQgc2luY2UgaXQgd291bGQgYmUKKyAgICogZXhwZW5zaXZlLCBhbmQgbm90IGNhdGNoIG1hbnkgY29tbW9uIGVycm9ycworICAgKi8KKworICByZXR1cm4gX2RidXNfbWVzc2FnZV9oYXNfdHlwZV9pbnRlcmZhY2VfbWVtYmVyIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfQ0FMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZhY2UsIG1ldGhvZCk7Cit9CisKKy8qKgorICogQ2hlY2tzIHdoZXRoZXIgdGhlIG1lc3NhZ2UgaXMgYSBzaWduYWwgd2l0aCB0aGUgZ2l2ZW4gaW50ZXJmYWNlIGFuZAorICogbWVtYmVyIGZpZWxkcy4gIElmIHRoZSBtZXNzYWdlIGlzIG5vdCAjREJVU19NRVNTQUdFX1RZUEVfU0lHTkFMLCBvcgorICogaGFzIGEgZGlmZmVyZW50IGludGVyZmFjZSBvciBtZW1iZXIgZmllbGQsIHJldHVybnMgI0ZBTFNFLgorICoKKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlCisgKiBAcGFyYW0gaWZhY2UgdGhlIG5hbWUgdG8gY2hlY2sgKG11c3Qgbm90IGJlICNOVUxMKQorICogQHBhcmFtIHNpZ25hbF9uYW1lIHRoZSBuYW1lIHRvIGNoZWNrIChtdXN0IG5vdCBiZSAjTlVMTCkKKyAqCisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGUgbWVzc2FnZSBpcyB0aGUgc3BlY2lmaWVkIHNpZ25hbAorICovCitkYnVzX2Jvb2xfdAorZGJ1c19tZXNzYWdlX2lzX3NpZ25hbCAoREJ1c01lc3NhZ2UgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAqc2lnbmFsX25hbWUpCit7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAobWVzc2FnZSAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoaWZhY2UgIT0gTlVMTCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHNpZ25hbF9uYW1lICE9IE5VTEwsIEZBTFNFKTsKKyAgLyogZG9uJ3QgY2hlY2sgdGhhdCBpbnRlcmZhY2UvbmFtZSBhcmUgdmFsaWQgc2luY2UgaXQgd291bGQgYmUKKyAgICogZXhwZW5zaXZlLCBhbmQgbm90IGNhdGNoIG1hbnkgY29tbW9uIGVycm9ycworICAgKi8KKworICByZXR1cm4gX2RidXNfbWVzc2FnZV9oYXNfdHlwZV9pbnRlcmZhY2VfbWVtYmVyIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX01FU1NBR0VfVFlQRV9TSUdOQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmYWNlLCBzaWduYWxfbmFtZSk7Cit9CisKKy8qKgorICogQ2hlY2tzIHdoZXRoZXIgdGhlIG1lc3NhZ2UgaXMgYW4gZXJyb3IgcmVwbHkgd2l0aCB0aGUgZ2l2ZW4gZXJyb3IKKyAqIG5hbWUuICBJZiB0aGUgbWVzc2FnZSBpcyBub3QgI0RCVVNfTUVTU0FHRV9UWVBFX0VSUk9SLCBvciBoYXMgYQorICogZGlmZmVyZW50IG5hbWUsIHJldHVybnMgI0ZBTFNFLgorICoKKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlCisgKiBAcGFyYW0gZXJyb3JfbmFtZSB0aGUgbmFtZSB0byBjaGVjayAobXVzdCBub3QgYmUgI05VTEwpCisgKgorICogQHJldHVybnMgI1RSVUUgaWYgdGhlIG1lc3NhZ2UgaXMgdGhlIHNwZWNpZmllZCBlcnJvcgorICovCitkYnVzX2Jvb2xfdAorZGJ1c19tZXNzYWdlX2lzX2Vycm9yIChEQnVzTWVzc2FnZSAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgKmVycm9yX25hbWUpCit7CisgIGNvbnN0IGNoYXIgKm47CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChtZXNzYWdlICE9IE5VTEwsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChlcnJvcl9uYW1lICE9IE5VTEwsIEZBTFNFKTsKKyAgLyogZG9uJ3QgY2hlY2sgdGhhdCBlcnJvcl9uYW1lIGlzIHZhbGlkIHNpbmNlIGl0IHdvdWxkIGJlIGV4cGVuc2l2ZSwKKyAgICogYW5kIG5vdCBjYXRjaCBtYW55IGNvbW1vbiBlcnJvcnMKKyAgICovCisKKyAgaWYgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkgIT0gREJVU19NRVNTQUdFX1RZUEVfRVJST1IpCisgICAgcmV0dXJuIEZBTFNFOworCisgIG4gPSBkYnVzX21lc3NhZ2VfZ2V0X2Vycm9yX25hbWUgKG1lc3NhZ2UpOworCisgIGlmIChuICYmIHN0cmNtcCAobiwgZXJyb3JfbmFtZSkgPT0gMCkKKyAgICByZXR1cm4gVFJVRTsKKyAgZWxzZQorICAgIHJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBDaGVja3Mgd2hldGhlciB0aGUgbWVzc2FnZSB3YXMgc2VudCB0byB0aGUgZ2l2ZW4gbmFtZS4gIElmIHRoZQorICogbWVzc2FnZSBoYXMgbm8gZGVzdGluYXRpb24gc3BlY2lmaWVkIG9yIGhhcyBhIGRpZmZlcmVudAorICogZGVzdGluYXRpb24sIHJldHVybnMgI0ZBTFNFLgorICoKKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlCisgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSB0byBjaGVjayAobXVzdCBub3QgYmUgI05VTEwpCisgKgorICogQHJldHVybnMgI1RSVUUgaWYgdGhlIG1lc3NhZ2UgaGFzIHRoZSBnaXZlbiBkZXN0aW5hdGlvbiBuYW1lCisgKi8KK2RidXNfYm9vbF90CitkYnVzX21lc3NhZ2VfaGFzX2Rlc3RpbmF0aW9uIChEQnVzTWVzc2FnZSAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgKm5hbWUpCit7CisgIGNvbnN0IGNoYXIgKnM7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChtZXNzYWdlICE9IE5VTEwsIEZBTFNFKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChuYW1lICE9IE5VTEwsIEZBTFNFKTsKKyAgLyogZG9uJ3QgY2hlY2sgdGhhdCBuYW1lIGlzIHZhbGlkIHNpbmNlIGl0IHdvdWxkIGJlIGV4cGVuc2l2ZSwgYW5kCisgICAqIG5vdCBjYXRjaCBtYW55IGNvbW1vbiBlcnJvcnMKKyAgICovCisKKyAgcyA9IGRidXNfbWVzc2FnZV9nZXRfZGVzdGluYXRpb24gKG1lc3NhZ2UpOworCisgIGlmIChzICYmIHN0cmNtcCAocywgbmFtZSkgPT0gMCkKKyAgICByZXR1cm4gVFJVRTsKKyAgZWxzZQorICAgIHJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBDaGVja3Mgd2hldGhlciB0aGUgbWVzc2FnZSBoYXMgdGhlIGdpdmVuIHVuaXF1ZSBuYW1lIGFzIGl0cyBzZW5kZXIuCisgKiBJZiB0aGUgbWVzc2FnZSBoYXMgbm8gc2VuZGVyIHNwZWNpZmllZCBvciBoYXMgYSBkaWZmZXJlbnQgc2VuZGVyLAorICogcmV0dXJucyAjRkFMU0UuIE5vdGUgdGhhdCBhIHBlZXIgYXBwbGljYXRpb24gd2lsbCBhbHdheXMgaGF2ZSB0aGUKKyAqIHVuaXF1ZSBuYW1lIG9mIHRoZSBjb25uZWN0aW9uIGFzIHRoZSBzZW5kZXIuIFNvIHlvdSBjYW4ndCB1c2UgdGhpcworICogZnVuY3Rpb24gdG8gc2VlIHdoZXRoZXIgYSBzZW5kZXIgb3duZWQgYSB3ZWxsLWtub3duIG5hbWUuCisgKgorICogTWVzc2FnZXMgZnJvbSB0aGUgYnVzIGl0c2VsZiB3aWxsIGhhdmUgI0RCVVNfU0VSVklDRV9EQlVTCisgKiBhcyB0aGUgc2VuZGVyLgorICoKKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlCisgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSB0byBjaGVjayAobXVzdCBub3QgYmUgI05VTEwpCisgKgorICogQHJldHVybnMgI1RSVUUgaWYgdGhlIG1lc3NhZ2UgaGFzIHRoZSBnaXZlbiBzZW5kZXIKKyAqLworZGJ1c19ib29sX3QKK2RidXNfbWVzc2FnZV9oYXNfc2VuZGVyIChEQnVzTWVzc2FnZSAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICpuYW1lKQoreworICBjb25zdCBjaGFyICpzOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAobWVzc2FnZSAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAobmFtZSAhPSBOVUxMLCBGQUxTRSk7CisgIC8qIGRvbid0IGNoZWNrIHRoYXQgbmFtZSBpcyB2YWxpZCBzaW5jZSBpdCB3b3VsZCBiZSBleHBlbnNpdmUsIGFuZAorICAgKiBub3QgY2F0Y2ggbWFueSBjb21tb24gZXJyb3JzCisgICAqLworCisgIHMgPSBkYnVzX21lc3NhZ2VfZ2V0X3NlbmRlciAobWVzc2FnZSk7CisKKyAgaWYgKHMgJiYgc3RyY21wIChzLCBuYW1lKSA9PSAwKQorICAgIHJldHVybiBUUlVFOworICBlbHNlCisgICAgcmV0dXJuIEZBTFNFOworfQorCisvKioKKyAqIENoZWNrcyB3aGV0aGVyIHRoZSBtZXNzYWdlIGhhcyB0aGUgZ2l2ZW4gc2lnbmF0dXJlOyBzZWUKKyAqIGRidXNfbWVzc2FnZV9nZXRfc2lnbmF0dXJlKCkgZm9yIG1vcmUgZGV0YWlscyBvbiB3aGF0IHRoZSBzaWduYXR1cmUKKyAqIGxvb2tzIGxpa2UuCisgKgorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UKKyAqIEBwYXJhbSBzaWduYXR1cmUgdHlwZWNvZGUgYXJyYXkKKyAqIEByZXR1cm5zICNUUlVFIGlmIG1lc3NhZ2UgaGFzIHRoZSBnaXZlbiBzaWduYXR1cmUKKyovCitkYnVzX2Jvb2xfdAorZGJ1c19tZXNzYWdlX2hhc19zaWduYXR1cmUgKERCdXNNZXNzYWdlICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAqc2lnbmF0dXJlKQoreworICBjb25zdCBjaGFyICpzOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAobWVzc2FnZSAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoc2lnbmF0dXJlICE9IE5VTEwsIEZBTFNFKTsKKyAgLyogZG9uJ3QgY2hlY2sgdGhhdCBzaWduYXR1cmUgaXMgdmFsaWQgc2luY2UgaXQgd291bGQgYmUgZXhwZW5zaXZlLAorICAgKiBhbmQgbm90IGNhdGNoIG1hbnkgY29tbW9uIGVycm9ycworICAgKi8KKworICBzID0gZGJ1c19tZXNzYWdlX2dldF9zaWduYXR1cmUgKG1lc3NhZ2UpOworCisgIGlmIChzICYmIHN0cmNtcCAocywgc2lnbmF0dXJlKSA9PSAwKQorICAgIHJldHVybiBUUlVFOworICBlbHNlCisgICAgcmV0dXJuIEZBTFNFOworfQorCisvKioKKyAqIFNldHMgYSAjREJ1c0Vycm9yIGJhc2VkIG9uIHRoZSBjb250ZW50cyBvZiB0aGUgZ2l2ZW4KKyAqIG1lc3NhZ2UuIFRoZSBlcnJvciBpcyBvbmx5IHNldCBpZiB0aGUgbWVzc2FnZQorICogaXMgYW4gZXJyb3IgbWVzc2FnZSwgYXMgaW4gI0RCVVNfTUVTU0FHRV9UWVBFX0VSUk9SLgorICogVGhlIG5hbWUgb2YgdGhlIGVycm9yIGlzIHNldCB0byB0aGUgbmFtZSBvZiB0aGUgbWVzc2FnZSwKKyAqIGFuZCB0aGUgZXJyb3IgbWVzc2FnZSBpcyBzZXQgdG8gdGhlIGZpcnN0IGFyZ3VtZW50CisgKiBpZiB0aGUgYXJndW1lbnQgZXhpc3RzIGFuZCBpcyBhIHN0cmluZy4KKyAqCisgKiBUaGUgcmV0dXJuIHZhbHVlIGluZGljYXRlcyB3aGV0aGVyIHRoZSBlcnJvciB3YXMgc2V0ICh0aGUgZXJyb3IgaXMKKyAqIHNldCBpZiBhbmQgb25seSBpZiB0aGUgbWVzc2FnZSBpcyBhbiBlcnJvciBtZXNzYWdlKS4gIFNvIHlvdSBjYW4KKyAqIGNoZWNrIGZvciBhbiBlcnJvciByZXBseSBhbmQgY29udmVydCBpdCB0byBEQnVzRXJyb3IgaW4gb25lIGdvOgorICogQGNvZGUKKyAqICBpZiAoZGJ1c19zZXRfZXJyb3JfZnJvbV9tZXNzYWdlIChlcnJvciwgcmVwbHkpKQorICogICAgcmV0dXJuIGVycm9yOworICogIGVsc2UKKyAqICAgIHByb2Nlc3MgcmVwbHk7CisgKiBAZW5kY29kZQorICoKKyAqIEBwYXJhbSBlcnJvciB0aGUgZXJyb3IgdG8gc2V0CisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB0byBzZXQgaXQgZnJvbQorICogQHJldHVybnMgI1RSVUUgaWYgdGhlIG1lc3NhZ2UgaGFkIHR5cGUgI0RCVVNfTUVTU0FHRV9UWVBFX0VSUk9SCisgKi8KK2RidXNfYm9vbF90CitkYnVzX3NldF9lcnJvcl9mcm9tX21lc3NhZ2UgKERCdXNFcnJvciAgICplcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgKm1lc3NhZ2UpCit7CisgIGNvbnN0IGNoYXIgKnN0cjsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG1lc3NhZ2UgIT0gTlVMTCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2Vycm9yX2lzX3NldCAoZXJyb3IsIEZBTFNFKTsKKworICBpZiAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlKSAhPSBEQlVTX01FU1NBR0VfVFlQRV9FUlJPUikKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgc3RyID0gTlVMTDsKKyAgZGJ1c19tZXNzYWdlX2dldF9hcmdzIChtZXNzYWdlLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpOworCisgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgZGJ1c19tZXNzYWdlX2dldF9lcnJvcl9uYW1lIChtZXNzYWdlKSwKKyAgICAgICAgICAgICAgICAgIHN0ciA/ICIlcyIgOiBOVUxMLCBzdHIpOworCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIENoZWNrcyB3aGV0aGVyIGEgbWVzc2FnZSBjb250YWlucyB1bml4IGZkcworICoKKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlCisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGUgbWVzc2FnZSBjb250YWlucyB1bml4IGZkcworICovCitkYnVzX2Jvb2xfdAorZGJ1c19tZXNzYWdlX2NvbnRhaW5zX3VuaXhfZmRzKERCdXNNZXNzYWdlICptZXNzYWdlKQoreworI2lmZGVmIEhBVkVfVU5JWF9GRF9QQVNTSU5HCisgIF9kYnVzX2Fzc2VydChtZXNzYWdlKTsKKworICByZXR1cm4gbWVzc2FnZS0+bl91bml4X2ZkcyA+IDA7CisjZWxzZQorICByZXR1cm4gRkFMU0U7CisjZW5kaWYKK30KKworLyoqIEB9ICovCisKKy8qKgorICogQGFkZHRvZ3JvdXAgREJ1c01lc3NhZ2VJbnRlcm5hbHMKKyAqCisgKiBAeworICovCisKKy8qKgorICogVGhlIGluaXRpYWwgYnVmZmVyIHNpemUgb2YgdGhlIG1lc3NhZ2UgbG9hZGVyLgorICoKKyAqIEB0b2RvIHRoaXMgc2hvdWxkIGJlIGJhc2VkIG9uIG1pbiBoZWFkZXIgc2l6ZSBwbHVzIHNvbWUgYXZlcmFnZQorICogYm9keSBzaXplLCBvciBzb21ldGhpbmcuIE9yIHJhdGhlciwgdGhlIG1pbiBoZWFkZXIgc2l6ZSBvbmx5LCBpZiB3ZQorICogd2FudCB0byB0cnkgdG8gcmVhZCBvbmx5IHRoZSBoZWFkZXIsIHN0b3JlIHRoYXQgaW4gYSBEQnVzTWVzc2FnZSwKKyAqIHRoZW4gcmVhZCBvbmx5IHRoZSBib2R5IGFuZCBzdG9yZSB0aGF0LCBldGMuLCBkZXBlbmRzIG9uCisgKiBob3cgd2Ugb3B0aW1pemUgX2RidXNfbWVzc2FnZV9sb2FkZXJfZ2V0X2J1ZmZlcigpIGFuZCB3aGF0CisgKiB0aGUgZXhhY3QgbWVzc2FnZSBmb3JtYXQgaXMuCisgKi8KKyNkZWZpbmUgSU5JVElBTF9MT0FERVJfREFUQV9MRU4gMzIKKworLyoqCisgKiBDcmVhdGVzIGEgbmV3IG1lc3NhZ2UgbG9hZGVyLiBSZXR1cm5zICNOVUxMIGlmIG1lbW9yeSBjYW4ndAorICogYmUgYWxsb2NhdGVkLgorICoKKyAqIEByZXR1cm5zIG5ldyBsb2FkZXIsIG9yICNOVUxMLgorICovCitEQnVzTWVzc2FnZUxvYWRlcioKK19kYnVzX21lc3NhZ2VfbG9hZGVyX25ldyAodm9pZCkKK3sKKyAgREJ1c01lc3NhZ2VMb2FkZXIgKmxvYWRlcjsKKworICBsb2FkZXIgPSBkYnVzX25ldzAgKERCdXNNZXNzYWdlTG9hZGVyLCAxKTsKKyAgaWYgKGxvYWRlciA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworICAKKyAgbG9hZGVyLT5yZWZjb3VudCA9IDE7CisKKyAgbG9hZGVyLT5jb3JydXB0ZWQgPSBGQUxTRTsKKyAgbG9hZGVyLT5jb3JydXB0aW9uX3JlYXNvbiA9IERCVVNfVkFMSUQ7CisKKyAgLyogdGhpcyBjYW4gYmUgY29uZmlndXJlZCBieSB0aGUgYXBwLCBidXQgZGVmYXVsdHMgdG8gdGhlIHByb3RvY29sIG1heCAqLworICBsb2FkZXItPm1heF9tZXNzYWdlX3NpemUgPSBEQlVTX01BWElNVU1fTUVTU0FHRV9MRU5HVEg7CisKKyAgLyogV2Ugc2V0IGEgdmVyeSByZWxhdGl2ZWx5IGNvbnNlcnZhdGl2ZSBkZWZhdWx0IGhlcmUgc2luY2UgZHVlIHRvIGhvdworICBTQ01fUklHSFRTIHdvcmtzIHdlIG5lZWQgdG8gcHJlYWxsb2NhdGUgYW4gZmQgYXJyYXkgb2YgdGhlIG1heGltdW0KKyAgbnVtYmVyIG9mIHVuaXggZmRzIHdlIHdhbnQgdG8gcmVjZWl2ZSBpbiBhZHZhbmNlLiBBCisgIHRyeS1hbmQtcmVhbGxvY2F0ZSBsb29wIGlzIG5vdCBwb3NzaWJsZS4gKi8KKyAgbG9hZGVyLT5tYXhfbWVzc2FnZV91bml4X2ZkcyA9IERCVVNfREVGQVVMVF9NRVNTQUdFX1VOSVhfRkRTOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZsb2FkZXItPmRhdGEpKQorICAgIHsKKyAgICAgIGRidXNfZnJlZSAobG9hZGVyKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAvKiBwcmVhbGxvY2F0ZSB0aGUgYnVmZmVyIGZvciBzcGVlZCwgaWdub3JlIGZhaWx1cmUgKi8KKyAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKCZsb2FkZXItPmRhdGEsIElOSVRJQUxfTE9BREVSX0RBVEFfTEVOKTsKKyAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKCZsb2FkZXItPmRhdGEsIDApOworCisjaWZkZWYgSEFWRV9VTklYX0ZEX1BBU1NJTkcKKyAgbG9hZGVyLT51bml4X2ZkcyA9IE5VTEw7CisgIGxvYWRlci0+bl91bml4X2ZkcyA9IGxvYWRlci0+bl91bml4X2Zkc19hbGxvY2F0ZWQgPSAwOworICBsb2FkZXItPnVuaXhfZmRzX291dHN0YW5kaW5nID0gRkFMU0U7CisjZW5kaWYKKworICByZXR1cm4gbG9hZGVyOworfQorCisvKioKKyAqIEluY3JlbWVudHMgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiB0aGUgbG9hZGVyLgorICoKKyAqIEBwYXJhbSBsb2FkZXIgdGhlIGxvYWRlci4KKyAqIEByZXR1cm5zIHRoZSBsb2FkZXIKKyAqLworREJ1c01lc3NhZ2VMb2FkZXIgKgorX2RidXNfbWVzc2FnZV9sb2FkZXJfcmVmIChEQnVzTWVzc2FnZUxvYWRlciAqbG9hZGVyKQoreworICBsb2FkZXItPnJlZmNvdW50ICs9IDE7CisKKyAgcmV0dXJuIGxvYWRlcjsKK30KKworLyoqCisgKiBEZWNyZW1lbnRzIHRoZSByZWZlcmVuY2UgY291bnQgb2YgdGhlIGxvYWRlciBhbmQgZmluYWxpemVzIHRoZQorICogbG9hZGVyIHdoZW4gdGhlIGNvdW50IHJlYWNoZXMgemVyby4KKyAqCisgKiBAcGFyYW0gbG9hZGVyIHRoZSBsb2FkZXIuCisgKi8KK3ZvaWQKK19kYnVzX21lc3NhZ2VfbG9hZGVyX3VucmVmIChEQnVzTWVzc2FnZUxvYWRlciAqbG9hZGVyKQoreworICBsb2FkZXItPnJlZmNvdW50IC09IDE7CisgIGlmIChsb2FkZXItPnJlZmNvdW50ID09IDApCisgICAgeworI2lmZGVmIEhBVkVfVU5JWF9GRF9QQVNTSU5HCisgICAgICBjbG9zZV91bml4X2Zkcyhsb2FkZXItPnVuaXhfZmRzLCAmbG9hZGVyLT5uX3VuaXhfZmRzKTsKKyAgICAgIGRidXNfZnJlZShsb2FkZXItPnVuaXhfZmRzKTsKKyNlbmRpZgorICAgICAgX2RidXNfbGlzdF9mb3JlYWNoICgmbG9hZGVyLT5tZXNzYWdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKERCdXNGb3JlYWNoRnVuY3Rpb24pIGRidXNfbWVzc2FnZV91bnJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICBfZGJ1c19saXN0X2NsZWFyICgmbG9hZGVyLT5tZXNzYWdlcyk7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmxvYWRlci0+ZGF0YSk7CisgICAgICBkYnVzX2ZyZWUgKGxvYWRlcik7CisgICAgfQorfQorCisvKioKKyAqIEdldHMgdGhlIGJ1ZmZlciB0byB1c2UgZm9yIHJlYWRpbmcgZGF0YSBmcm9tIHRoZSBuZXR3b3JrLiAgTmV0d29yaworICogZGF0YSBpcyByZWFkIGRpcmVjdGx5IGludG8gYW4gYWxsb2NhdGVkIGJ1ZmZlciwgd2hpY2ggaXMgdGhlbiB1c2VkCisgKiBpbiB0aGUgREJ1c01lc3NhZ2UsIHRvIGF2b2lkIGFzIG1hbnkgZXh0cmEgbWVtY3B5J3MgYXMgcG9zc2libGUuCisgKiBUaGUgYnVmZmVyIG11c3QgYWx3YXlzIGJlIHJldHVybmVkIGltbWVkaWF0ZWx5IHVzaW5nCisgKiBfZGJ1c19tZXNzYWdlX2xvYWRlcl9yZXR1cm5fYnVmZmVyKCksIGV2ZW4gaWYgbm8gYnl0ZXMgYXJlCisgKiBzdWNjZXNzZnVsbHkgcmVhZC4KKyAqCisgKiBAdG9kbyB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBhIGxvdCBtb3JlIGNsZXZlci4gRm9yIGV4YW1wbGUKKyAqIGl0IGNhbiBwcm9iYWJseSBhbHdheXMgcmV0dXJuIGEgYnVmZmVyIHNpemUgdG8gcmVhZCBleGFjdGx5CisgKiB0aGUgYm9keSBvZiB0aGUgbmV4dCBtZXNzYWdlLCB0aHVzIGF2b2lkaW5nIGFueSBtZW1vcnkgd2FzdGFnZQorICogb3IgcmVhbGxvY3MuCisgKgorICogQHRvZG8gd2UgbmVlZCB0byBlbmZvcmNlIGEgbWF4IGxlbmd0aCBvbiBzdHJpbmdzIGluIGhlYWRlciBmaWVsZHMuCisgKgorICogQHBhcmFtIGxvYWRlciB0aGUgbWVzc2FnZSBsb2FkZXIuCisgKiBAcGFyYW0gYnVmZmVyIHRoZSBidWZmZXIKKyAqLwordm9pZAorX2RidXNfbWVzc2FnZV9sb2FkZXJfZ2V0X2J1ZmZlciAoREJ1c01lc3NhZ2VMb2FkZXIgICpsb2FkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICAqKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAqbWF4X3RvX3JlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICAgKm1heV9yZWFkX2ZkcykKK3sKKyAgX2RidXNfYXNzZXJ0ICghbG9hZGVyLT5idWZmZXJfb3V0c3RhbmRpbmcpOworCisgICpidWZmZXIgPSAmbG9hZGVyLT5kYXRhOworCisgIGxvYWRlci0+YnVmZmVyX291dHN0YW5kaW5nID0gVFJVRTsKKworICBpZiAobWF4X3RvX3JlYWQgIT0gTlVMTCkKKyAgICB7CisjaWZkZWYgSEFWRV9VTklYX0ZEX1BBU1NJTkcKKyAgICAgIGludCBvZmZzZXQgPSAwOworICAgICAgaW50IHJlbWFpbjsKKyAgICAgIGludCBieXRlX29yZGVyOworICAgICAgaW50IGZpZWxkc19hcnJheV9sZW47CisgICAgICBpbnQgaGVhZGVyX2xlbjsKKyAgICAgIGludCBib2R5X2xlbjsKKyNlbmRpZgorCisgICAgICAqbWF4X3RvX3JlYWQgPSBEQlVTX01BWElNVU1fTUVTU0FHRV9MRU5HVEg7CisgICAgICAqbWF5X3JlYWRfZmRzID0gVFJVRTsKKworI2lmZGVmIEhBVkVfVU5JWF9GRF9QQVNTSU5HCisgICAgICAvKiBJZiB3ZSBhcmVuJ3QgaG9sZGluZyBvbnRvIGFueSBmZHMsIHdlIGNhbiByZWFkIGFzIG11Y2ggYXMgd2Ugd2FudAorICAgICAgICogKGZhc3QgcGF0aCkuICovCisgICAgICBpZiAobG9hZGVyLT5uX3VuaXhfZmRzID09IDApCisgICAgICAgIHJldHVybjsKKworICAgICAgLyogU2xvdyBwYXRoOiB3ZSBoYXZlIGEgbWVzc2FnZSB3aXRoIHNvbWUgZmRzIGluIGl0LiBXZSBkb24ndCB3YW50CisgICAgICAgKiB0byBzdGFydCBvbiB0aGUgbmV4dCBtZXNzYWdlIHVudGlsIHRoaXMgb25lIGlzIG91dCBvZiB0aGUgd2F5OworICAgICAgICogb3RoZXJ3aXNlIGEgbGVnaXRpbWF0ZSBzZW5kZXIgY2FuIGtlZXAgdXMgcHJvY2Vzc2luZyBtZXNzYWdlcworICAgICAgICogY29udGFpbmluZyBmZHMsIHVudGlsIHdlIGRpc2Nvbm5lY3QgaXQgZm9yIGhhdmluZyBoYWQgZmRzIHBlbmRpbmcKKyAgICAgICAqIGZvciB0b28gbG9uZywgYSBsaW1pdCB0aGF0IGlzIGluIHBsYWNlIHRvIHN0b3AgbWFsaWNpb3VzIHNlbmRlcnMKKyAgICAgICAqIGZyb20gc2V0dGluZyB1cCByZWN1cnNpdmUgZmQtcGFzc2luZyB0aGF0IHRha2VzIHVwIG91ciBxdW90YSBhbmQKKyAgICAgICAqIHdpbGwgbmV2ZXIgZ28gYXdheS4gKi8KKworICAgICAgcmVtYWluID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZsb2FkZXItPmRhdGEpOworCisgICAgICB3aGlsZSAocmVtYWluID4gMCkKKyAgICAgICAgeworICAgICAgICAgIERCdXNWYWxpZGl0eSB2YWxpZGl0eSA9IERCVVNfVkFMSURJVFlfVU5LTk9XTjsKKyAgICAgICAgICBpbnQgbmVlZGVkOworCisgICAgICAgICAgLyogSWYgMCA8IHJlbWFpbiA8IERCVVNfTUlOSU1VTV9IRUFERVJfU0laRSwgdGhlbiB3ZSd2ZSBoYWQgYXQKKyAgICAgICAgICAgKiBsZWFzdCB0aGUgZmlyc3QgYnl0ZSBvZiBhIG1lc3NhZ2UsIGJ1dCB3ZSBkb24ndCBrbm93IGhvdworICAgICAgICAgICAqIG11Y2ggbW9yZSB0byByZWFkLiBPbmx5IHJlYWQgdGhlIHJlc3Qgb2YgdGhlCisgICAgICAgICAgICogREJVU19NSU5JTVVNX0hFQURFUl9TSVpFIGZvciBub3c7IHRoZW4gd2UnbGwga25vdy4gKi8KKyAgICAgICAgICBpZiAocmVtYWluIDwgREJVU19NSU5JTVVNX0hFQURFUl9TSVpFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAqbWF4X3RvX3JlYWQgPSBEQlVTX01JTklNVU1fSEVBREVSX1NJWkUgLSByZW1haW47CisgICAgICAgICAgICAgICptYXlfcmVhZF9mZHMgPSBGQUxTRTsKKyAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKCFfZGJ1c19oZWFkZXJfaGF2ZV9tZXNzYWdlX3VudHJ1c3RlZCAobG9hZGVyLT5tYXhfbWVzc2FnZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWxpZGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnl0ZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRzX2FycmF5X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaGVhZGVyX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm9keV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxvYWRlci0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogSWYgYSBtZXNzYWdlIGluIHRoZSBidWZmZXIgaXMgaW52YWxpZCwgd2UncmUgZ29pbmcgdG8KKyAgICAgICAgICAgICAgICogZGlzY29ubmVjdCB0aGUgc2VuZGVyIGFueXdheSwgc28gcmVhZGluZyBhbiBhcmJpdHJhcnkgYW1vdW50CisgICAgICAgICAgICAgICAqIGlzIGZpbmUuICovCisgICAgICAgICAgICAgIGlmICh2YWxpZGl0eSAhPSBEQlVTX1ZBTElEKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgICAvKiBXZSBoYXZlIGEgcGFydGlhbCBtZXNzYWdlLCB3aXRoIHRoZQorICAgICAgICAgICAgICAgKiBEQlVTX01JTklNVU1fSEVBREVSX1NJWkUtYnl0ZSBmaXhlZCBwYXJ0IG9mIHRoZSBoZWFkZXIgKHdoaWNoCisgICAgICAgICAgICAgICAqIGxldHMgdXMgd29yayBvdXQgaG93IG11Y2ggbW9yZSB3ZSBuZWVkKSwgYnV0IG5vIG1vcmUuIFJlYWQKKyAgICAgICAgICAgICAgICogdGhlIHJlc3Qgb2YgdGhlIG1lc3NhZ2UuICovCisgICAgICAgICAgICAgIG5lZWRlZCA9IGhlYWRlcl9sZW4gKyBib2R5X2xlbjsKKyAgICAgICAgICAgICAgX2RidXNfYXNzZXJ0IChuZWVkZWQgPiByZW1haW4pOworICAgICAgICAgICAgICAqbWF4X3RvX3JlYWQgPSBuZWVkZWQgLSByZW1haW47CisgICAgICAgICAgICAgICptYXlfcmVhZF9mZHMgPSBGQUxTRTsKKyAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgLyogU2tpcCBvdmVyIGVudGlyZSBtZXNzYWdlcyB1bnRpbCB3ZSBoYXZlIGxlc3MgdGhhbiBhIG1lc3NhZ2UKKyAgICAgICAgICAgKiByZW1haW5pbmcuICovCisgICAgICAgICAgbmVlZGVkID0gaGVhZGVyX2xlbiArIGJvZHlfbGVuOworICAgICAgICAgIF9kYnVzX2Fzc2VydCAobmVlZGVkID4gREJVU19NSU5JTVVNX0hFQURFUl9TSVpFKTsKKyAgICAgICAgICBfZGJ1c19hc3NlcnQgKHJlbWFpbiA+PSBuZWVkZWQpOworICAgICAgICAgIHJlbWFpbiAtPSBuZWVkZWQ7CisgICAgICAgICAgb2Zmc2V0ICs9IG5lZWRlZDsKKyAgICAgICAgfQorI2VuZGlmCisgICAgfQorfQorCisvKioKKyAqIFJldHVybnMgYSBidWZmZXIgb2J0YWluZWQgZnJvbSBfZGJ1c19tZXNzYWdlX2xvYWRlcl9nZXRfYnVmZmVyKCksCisgKiBpbmRpY2F0aW5nIHRvIHRoZSBsb2FkZXIgaG93IG1hbnkgYnl0ZXMgb2YgdGhlIGJ1ZmZlciB3ZXJlIGZpbGxlZAorICogaW4uIFRoaXMgZnVuY3Rpb24gbXVzdCBhbHdheXMgYmUgY2FsbGVkLCBldmVuIGlmIG5vIGJ5dGVzIHdlcmUKKyAqIHN1Y2Nlc3NmdWxseSByZWFkLgorICoKKyAqIEBwYXJhbSBsb2FkZXIgdGhlIGxvYWRlci4KKyAqIEBwYXJhbSBidWZmZXIgdGhlIGJ1ZmZlci4KKyAqLwordm9pZAorX2RidXNfbWVzc2FnZV9sb2FkZXJfcmV0dXJuX2J1ZmZlciAoREJ1c01lc3NhZ2VMb2FkZXIgICpsb2FkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICAgKmJ1ZmZlcikKK3sKKyAgX2RidXNfYXNzZXJ0IChsb2FkZXItPmJ1ZmZlcl9vdXRzdGFuZGluZyk7CisgIF9kYnVzX2Fzc2VydCAoYnVmZmVyID09ICZsb2FkZXItPmRhdGEpOworCisgIGxvYWRlci0+YnVmZmVyX291dHN0YW5kaW5nID0gRkFMU0U7Cit9CisKKyNpZmRlZiBIQVZFX1VOSVhfRkRfUEFTU0lORworLyoqCisgKiBHZXRzIHRoZSBidWZmZXIgdG8gdXNlIGZvciByZWFkaW5nIHVuaXggZmRzIGZyb20gdGhlIG5ldHdvcmsuCisgKgorICogVGhpcyB3b3JrcyBzaW1pbGFyIHRvIF9kYnVzX21lc3NhZ2VfbG9hZGVyX2dldF9idWZmZXIoKQorICoKKyAqIEBwYXJhbSBsb2FkZXIgdGhlIG1lc3NhZ2UgbG9hZGVyLgorICogQHBhcmFtIGZkcyB0aGUgYXJyYXkgdG8gcmVhZCBmZHMgaW50bworICogQHBhcmFtIG1heF9uX2ZkcyBob3cgbWFueSBmZHMgdG8gcmVhZCBhdCBtb3N0CisgKiBAcmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gT09NCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19tZXNzYWdlX2xvYWRlcl9nZXRfdW5peF9mZHMoREJ1c01lc3NhZ2VMb2FkZXIgICpsb2FkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgKipmZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgICAgICAgICAgICptYXhfbl9mZHMpCit7CisgIF9kYnVzX2Fzc2VydCAoIWxvYWRlci0+dW5peF9mZHNfb3V0c3RhbmRpbmcpOworCisgIC8qIEFsbG9jYXRlIHNwYWNlIHdoZXJlIHdlIGNhbiBwdXQgdGhlIGZkcyB3ZSByZWFkLiBXZSBhbGxvY2F0ZQorICAgICBzcGFjZSBmb3IgbWF4X21lc3NhZ2VfdW5peF9mZHMgc2luY2UgdGhpcyBpcyBhbgorICAgICB1cHBlciBsaW1pdCBob3cgbWFueSBmZHMgY2FuIGJlIHJlY2VpdmVkIHdpdGhpbiBhIHNpbmdsZQorICAgICBtZXNzYWdlLiBTaW5jZSBTQ01fUklHSFRTIGRvZXNuJ3QgYWxsb3cgYSByZWFsbG9jYXRlK3JldHJ5IGxvZ2ljCisgICAgIHdlIGFyZSBhbGxvY2F0aW5nIHRoZSBtYXhpbXVtIHBvc3NpYmxlIGFycmF5IHNpemUgcmlnaHQgZnJvbSB0aGUKKyAgICAgYmVnaW5uaW5nLiBUaGlzIHN1Y2tzIGEgYml0LCBob3dldmVyIHVubGVzcyBTQ01fUklHSFRTIGlzIGZpeGVkCisgICAgIHRoZXJlIGlzIG5vIGJldHRlciB3YXkuICovCisKKyAgaWYgKGxvYWRlci0+bl91bml4X2Zkc19hbGxvY2F0ZWQgPCBsb2FkZXItPm1heF9tZXNzYWdlX3VuaXhfZmRzKQorICAgIHsKKyAgICAgIGludCAqYSA9IGRidXNfcmVhbGxvYyhsb2FkZXItPnVuaXhfZmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlci0+bWF4X21lc3NhZ2VfdW5peF9mZHMgKiBzaXplb2YobG9hZGVyLT51bml4X2Zkc1swXSkpOworCisgICAgICBpZiAoIWEpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgbG9hZGVyLT51bml4X2ZkcyA9IGE7CisgICAgICBsb2FkZXItPm5fdW5peF9mZHNfYWxsb2NhdGVkID0gbG9hZGVyLT5tYXhfbWVzc2FnZV91bml4X2ZkczsKKyAgICB9CisKKyAgKmZkcyA9IGxvYWRlci0+dW5peF9mZHMgKyBsb2FkZXItPm5fdW5peF9mZHM7CisgICptYXhfbl9mZHMgPSBsb2FkZXItPm5fdW5peF9mZHNfYWxsb2NhdGVkIC0gbG9hZGVyLT5uX3VuaXhfZmRzOworCisgIGxvYWRlci0+dW5peF9mZHNfb3V0c3RhbmRpbmcgPSBUUlVFOworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBSZXR1cm5zIGEgYnVmZmVyIG9idGFpbmVkIGZyb20gX2RidXNfbWVzc2FnZV9sb2FkZXJfZ2V0X3VuaXhfZmRzKCkuCisgKgorICogVGhpcyB3b3JrcyBzaW1pbGFyIHRvIF9kYnVzX21lc3NhZ2VfbG9hZGVyX3JldHVybl9idWZmZXIoKQorICoKKyAqIEBwYXJhbSBsb2FkZXIgdGhlIG1lc3NhZ2UgbG9hZGVyLgorICogQHBhcmFtIGZkcyB0aGUgYXJyYXkgZmRzIHdlcmUgcmVhZCBpbnRvCisgKiBAcGFyYW0gbl9mZHMgaG93IG1hbnkgZmRzIHdlcmUgcmVhZAorICovCisKK3ZvaWQKK19kYnVzX21lc3NhZ2VfbG9hZGVyX3JldHVybl91bml4X2ZkcyhEQnVzTWVzc2FnZUxvYWRlciAgKmxvYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgKmZkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAgICAgICAgICAgIG5fZmRzKQoreworICBfZGJ1c19hc3NlcnQobG9hZGVyLT51bml4X2Zkc19vdXRzdGFuZGluZyk7CisgIF9kYnVzX2Fzc2VydChsb2FkZXItPnVuaXhfZmRzICsgbG9hZGVyLT5uX3VuaXhfZmRzID09IGZkcyk7CisgIF9kYnVzX2Fzc2VydChsb2FkZXItPm5fdW5peF9mZHMgKyBuX2ZkcyA8PSBsb2FkZXItPm5fdW5peF9mZHNfYWxsb2NhdGVkKTsKKworICBsb2FkZXItPm5fdW5peF9mZHMgKz0gbl9mZHM7CisgIGxvYWRlci0+dW5peF9mZHNfb3V0c3RhbmRpbmcgPSBGQUxTRTsKKworICBpZiAobl9mZHMgJiYgbG9hZGVyLT51bml4X2Zkc19jaGFuZ2UpCisgICAgbG9hZGVyLT51bml4X2Zkc19jaGFuZ2UgKGxvYWRlci0+dW5peF9mZHNfY2hhbmdlX2RhdGEpOworfQorI2VuZGlmCisKKy8qCisgKiBGSVhNRSB3aGVuIHdlIG1vdmUgdGhlIGhlYWRlciBvdXQgb2YgdGhlIGJ1ZmZlciwgdGhhdCBtZW1tb3ZlcyBhbGwKKyAqIGJ1ZmZlcmVkIG1lc3NhZ2VzLiBLaW5kIG9mIGNyYXBweS4KKyAqCisgKiBBbHNvIHdlIGNvcHkgdGhlIGhlYWRlciBhbmQgYm9keSwgd2hpY2ggaXMga2luZCBvZiBjcmFwcHkuICBUbworICogYXZvaWQgdGhpcywgd2UgaGF2ZSB0byBhbGxvdyBoZWFkZXIgYW5kIGJvZHkgdG8gYmUgaW4gYSBzaW5nbGUKKyAqIG1lbW9yeSBibG9jaywgd2hpY2ggaXMgZ29vZCBmb3IgbWVzc2FnZXMgd2UgcmVhZCBhbmQgYmFkIGZvcgorICogbWVzc2FnZXMgd2UgYXJlIGNyZWF0aW5nLiBCdXQgd2UgY291bGQgbW92ZV9sZW4oKSB0aGUgYnVmZmVyIGludG8KKyAqIHRoaXMgc2luZ2xlIG1lbW9yeSBibG9jaywgYW5kIG1vdmVfbGVuKCkgd2lsbCBqdXN0IHN3YXAgdGhlIGJ1ZmZlcnMKKyAqIGlmIHlvdSdyZSBtb3ZpbmcgdGhlIGVudGlyZSBidWZmZXIgcmVwbGFjaW5nIHRoZSBkZXN0IHN0cmluZy4KKyAqCisgKiBXZSBjb3VsZCBhbHNvIGhhdmUgdGhlIG1lc3NhZ2UgbG9hZGVyIHRlbGwgdGhlIHRyYW5zcG9ydCBob3cgbWFueQorICogYnl0ZXMgdG8gcmVhZDsgc28gaXQgd291bGQgZmlyc3QgYXNrIGZvciBzb21lIGFyYml0cmFyeSBudW1iZXIgbGlrZQorICogMjU2LCB0aGVuIGlmIHRoZSBtZXNzYWdlIHdhcyBpbmNvbXBsZXRlIGl0IHdvdWxkIHVzZSB0aGUKKyAqIGhlYWRlci9ib2R5IGxlbiB0byBhc2sgZm9yIGV4YWN0bHkgdGhlIHNpemUgb2YgdGhlIG1lc3NhZ2UgKG9yCisgKiBibG9ja3MgdGhlIHNpemUgb2YgYSB0eXBpY2FsIGtlcm5lbCBidWZmZXIgZm9yIHRoZSBzb2NrZXQpLiBUaGF0CisgKiB3YXkgd2UgZG9uJ3QgZ2V0IHRyYWlsaW5nIGJ5dGVzIGluIHRoZSBidWZmZXIgdGhhdCBoYXZlIHRvIGJlCisgKiBtZW1tb3ZlZC4gVGhvdWdoIEkgc3VwcG9zZSB3ZSBhbHNvIGRvbid0IGhhdmUgYSBjaGFuY2Ugb2YgcmVhZGluZyBhCisgKiBidW5jaCBvZiBzbWFsbCBtZXNzYWdlcyBhdCBvbmNlLCBzbyB0aGUgb3B0aW1pemF0aW9uIG1heSBiZSBzdHVwaWQuCisgKgorICogQW5vdGhlciBhcHByb2FjaCB3b3VsZCBiZSB0byBrZWVwIGEgInN0YXJ0IiBpbmRleCBpbnRvCisgKiBsb2FkZXItPmRhdGEgYW5kIG9ubHkgZGVsZXRlIGl0IG9jY2FzaW9uYWxseSwgaW5zdGVhZCBvZiBhZnRlcgorICogZWFjaCBtZXNzYWdlIGlzIGxvYWRlZC4KKyAqCisgKiBsb2FkX21lc3NhZ2UoKSByZXR1cm5zIEZBTFNFIGlmIG5vdCBlbm91Z2ggbWVtb3J5IE9SIHRoZSBsb2FkZXIgd2FzIGNvcnJ1cHRlZAorICovCitzdGF0aWMgZGJ1c19ib29sX3QKK2xvYWRfbWVzc2FnZSAoREJ1c01lc3NhZ2VMb2FkZXIgKmxvYWRlciwKKyAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgZmllbGRzX2FycmF5X2xlbiwKKyAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGhlYWRlcl9sZW4sCisgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBib2R5X2xlbikKK3sKKyAgZGJ1c19ib29sX3Qgb29tOworICBEQnVzVmFsaWRpdHkgdmFsaWRpdHk7CisgIGNvbnN0IERCdXNTdHJpbmcgKnR5cGVfc3RyOworICBpbnQgdHlwZV9wb3M7CisgIERCdXNWYWxpZGF0aW9uTW9kZSBtb2RlOworICBkYnVzX3VpbnQzMl90IG5fdW5peF9mZHMgPSAwOworCisgIG1vZGUgPSBEQlVTX1ZBTElEQVRJT05fTU9ERV9EQVRBX0lTX1VOVFJVU1RFRDsKKyAgCisgIG9vbSA9IEZBTFNFOworCisjaWYgMAorICBfZGJ1c192ZXJib3NlX2J5dGVzX29mX3N0cmluZyAoJmxvYWRlci0+ZGF0YSwgMCwgaGVhZGVyX2xlbiAvKiArIGJvZHlfbGVuICovKTsKKyNlbmRpZgorCisgIC8qIDEuIFZBTElEQVRFIEFORCBDT1BZIE9WRVIgSEVBREVSICovCisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZtZXNzYWdlLT5oZWFkZXIuZGF0YSkgPT0gMCk7CisgIF9kYnVzX2Fzc2VydCAoKGhlYWRlcl9sZW4gKyBib2R5X2xlbikgPD0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZsb2FkZXItPmRhdGEpKTsKKworICBpZiAoIV9kYnVzX2hlYWRlcl9sb2FkICgmbWVzc2FnZS0+aGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsaWRpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkc19hcnJheV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHlfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbG9hZGVyLT5kYXRhLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmxvYWRlci0+ZGF0YSkpKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJGYWlsZWQgdG8gbG9hZCBoZWFkZXIgZm9yIG5ldyBtZXNzYWdlIGNvZGUgJWRcbiIsIHZhbGlkaXR5KTsKKworICAgICAgLyogYXNzZXJ0IGhlcmUgc28gd2UgY2FuIGNhdGNoIGFueSBjb2RlIHRoYXQgc3RpbGwgdXNlcyBEQlVTX1ZBTElEIHRvIGluZGljYXRlCisgICAgICAgICBvb20gZXJyb3JzLiAgVGhleSBzaG91bGQgdXNlIERCVVNfVkFMSURJVFlfVU5LTk9XTl9PT01fRVJST1IgaW5zdGVhZCAqLworICAgICAgX2RidXNfYXNzZXJ0ICh2YWxpZGl0eSAhPSBEQlVTX1ZBTElEKTsKKworICAgICAgaWYgKHZhbGlkaXR5ID09IERCVVNfVkFMSURJVFlfVU5LTk9XTl9PT01fRVJST1IpCisgICAgICAgIG9vbSA9IFRSVUU7CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBsb2FkZXItPmNvcnJ1cHRlZCA9IFRSVUU7CisgICAgICAgICAgbG9hZGVyLT5jb3JydXB0aW9uX3JlYXNvbiA9IHZhbGlkaXR5OworICAgICAgICB9CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgX2RidXNfYXNzZXJ0ICh2YWxpZGl0eSA9PSBEQlVTX1ZBTElEKTsKKworICAvKiAyLiBWQUxJREFURSBCT0RZICovCisgIGlmIChtb2RlICE9IERCVVNfVkFMSURBVElPTl9NT0RFX1dFX1RSVVNUX1RISVNfREFUQV9BQlNPTFVURUxZKQorICAgIHsKKyAgICAgIGdldF9jb25zdF9zaWduYXR1cmUgKCZtZXNzYWdlLT5oZWFkZXIsICZ0eXBlX3N0ciwgJnR5cGVfcG9zKTsKKyAgICAgIAorICAgICAgLyogQmVjYXVzZSB0aGUgYnl0ZXNfcmVtYWluaW5nIGFyZyBpcyBOVUxMLCB0aGlzIHZhbGlkYXRlcyB0aGF0IHRoZQorICAgICAgICogYm9keSBpcyB0aGUgcmlnaHQgbGVuZ3RoCisgICAgICAgKi8KKyAgICAgIHZhbGlkaXR5ID0gX2RidXNfdmFsaWRhdGVfYm9keV93aXRoX3JlYXNvbiAodHlwZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbG9hZGVyLT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2R5X2xlbik7CisgICAgICBpZiAodmFsaWRpdHkgIT0gREJVU19WQUxJRCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJGYWlsZWQgdG8gdmFsaWRhdGUgbWVzc2FnZSBib2R5IGNvZGUgJWRcbiIsIHZhbGlkaXR5KTsKKworICAgICAgICAgIGxvYWRlci0+Y29ycnVwdGVkID0gVFJVRTsKKyAgICAgICAgICBsb2FkZXItPmNvcnJ1cHRpb25fcmVhc29uID0gdmFsaWRpdHk7CisgICAgICAgICAgCisgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgLyogMy4gQ09QWSBPVkVSIFVOSVggRkRTICovCisgIF9kYnVzX2hlYWRlcl9nZXRfZmllbGRfYmFzaWMoJm1lc3NhZ2UtPmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0hFQURFUl9GSUVMRF9VTklYX0ZEUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfVUlOVDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuX3VuaXhfZmRzKTsKKworI2lmZGVmIEhBVkVfVU5JWF9GRF9QQVNTSU5HCisKKyAgaWYgKG5fdW5peF9mZHMgPiBsb2FkZXItPm5fdW5peF9mZHMpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSgiTWVzc2FnZSBjb250YWlucyByZWZlcmVuY2VzIHRvIG1vcmUgdW5peCBmZHMgdGhhbiB3ZXJlIHNlbnQgJXUgIT0gJXVcbiIsCisgICAgICAgICAgICAgICAgICAgIG5fdW5peF9mZHMsIGxvYWRlci0+bl91bml4X2Zkcyk7CisKKyAgICAgIGxvYWRlci0+Y29ycnVwdGVkID0gVFJVRTsKKyAgICAgIGxvYWRlci0+Y29ycnVwdGlvbl9yZWFzb24gPSBEQlVTX0lOVkFMSURfTUlTU0lOR19VTklYX0ZEUzsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICAvKiBJZiB0aGlzIHdhcyBhIHJlY3ljbGVkIG1lc3NhZ2UgdGhlcmUgbWlnaHQgc3RpbGwgYmUKKyAgICAgc29tZSBtZW1vcnkgYWxsb2NhdGVkIGZvciB0aGUgZmRzICovCisgIGRidXNfZnJlZShtZXNzYWdlLT51bml4X2Zkcyk7CisKKyAgaWYgKG5fdW5peF9mZHMgPiAwKQorICAgIHsKKyAgICAgIG1lc3NhZ2UtPnVuaXhfZmRzID0gX2RidXNfbWVtZHVwKGxvYWRlci0+dW5peF9mZHMsIG5fdW5peF9mZHMgKiBzaXplb2YobWVzc2FnZS0+dW5peF9mZHNbMF0pKTsKKyAgICAgIGlmIChtZXNzYWdlLT51bml4X2ZkcyA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkZhaWxlZCB0byBhbGxvY2F0ZSBmaWxlIGRlc2NyaXB0b3IgYXJyYXlcbiIpOworICAgICAgICAgIG9vbSA9IFRSVUU7CisgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgIH0KKworICAgICAgbWVzc2FnZS0+bl91bml4X2Zkc19hbGxvY2F0ZWQgPSBtZXNzYWdlLT5uX3VuaXhfZmRzID0gbl91bml4X2ZkczsKKyAgICAgIGxvYWRlci0+bl91bml4X2ZkcyAtPSBuX3VuaXhfZmRzOworICAgICAgbWVtbW92ZSAobG9hZGVyLT51bml4X2ZkcywgbG9hZGVyLT51bml4X2ZkcyArIG5fdW5peF9mZHMsIGxvYWRlci0+bl91bml4X2ZkcyAqIHNpemVvZiAobG9hZGVyLT51bml4X2Zkc1swXSkpOworCisgICAgICBpZiAobG9hZGVyLT51bml4X2Zkc19jaGFuZ2UpCisgICAgICAgIGxvYWRlci0+dW5peF9mZHNfY2hhbmdlIChsb2FkZXItPnVuaXhfZmRzX2NoYW5nZV9kYXRhKTsKKyAgICB9CisgIGVsc2UKKyAgICBtZXNzYWdlLT51bml4X2ZkcyA9IE5VTEw7CisKKyNlbHNlCisKKyAgaWYgKG5fdW5peF9mZHMgPiAwKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJIbW0sIG1lc3NhZ2UgY2xhaW1zIHRvIGNvbWUgd2l0aCBmaWxlIGRlc2NyaXB0b3JzICIKKyAgICAgICAgICAgICAgICAgICAgICJidXQgdGhhdCdzIG5vdCBzdXBwb3J0ZWQgb24gb3VyIHBsYXRmb3JtLCBkaXNjb25uZWN0aW5nLlxuIik7CisKKyAgICAgIGxvYWRlci0+Y29ycnVwdGVkID0gVFJVRTsKKyAgICAgIGxvYWRlci0+Y29ycnVwdGlvbl9yZWFzb24gPSBEQlVTX0lOVkFMSURfTUlTU0lOR19VTklYX0ZEUzsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworI2VuZGlmCisKKyAgLyogMy4gQ09QWSBPVkVSIEJPRFkgQU5EIFFVRVVFIE1FU1NBR0UgKi8KKworICBpZiAoIV9kYnVzX2xpc3RfYXBwZW5kICgmbG9hZGVyLT5tZXNzYWdlcywgbWVzc2FnZSkpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIkZhaWxlZCB0byBhcHBlbmQgbmV3IG1lc3NhZ2UgdG8gbG9hZGVyIHF1ZXVlXG4iKTsKKyAgICAgIG9vbSA9IFRSVUU7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJm1lc3NhZ2UtPmJvZHkpID09IDApOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmbG9hZGVyLT5kYXRhKSA+PQorICAgICAgICAgICAgICAgIChoZWFkZXJfbGVuICsgYm9keV9sZW4pKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5X2xlbiAoJmxvYWRlci0+ZGF0YSwgaGVhZGVyX2xlbiwgYm9keV9sZW4sICZtZXNzYWdlLT5ib2R5LCAwKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiRmFpbGVkIHRvIG1vdmUgYm9keSBpbnRvIG5ldyBtZXNzYWdlXG4iKTsKKyAgICAgIG9vbSA9IFRSVUU7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgX2RidXNfc3RyaW5nX2RlbGV0ZSAoJmxvYWRlci0+ZGF0YSwgMCwgaGVhZGVyX2xlbiArIGJvZHlfbGVuKTsKKworICAvKiBkb24ndCB3YXN0ZSBtb3JlIHRoYW4gMmsgb2YgbWVtb3J5ICovCisgIF9kYnVzX3N0cmluZ19jb21wYWN0ICgmbG9hZGVyLT5kYXRhLCAyMDQ4KTsKKworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmbWVzc2FnZS0+aGVhZGVyLmRhdGEpID09IGhlYWRlcl9sZW4pOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmbWVzc2FnZS0+Ym9keSkgPT0gYm9keV9sZW4pOworCisgIF9kYnVzX3ZlcmJvc2UgKCJMb2FkZWQgbWVzc2FnZSAlcFxuIiwgbWVzc2FnZSk7CisKKyAgX2RidXNfYXNzZXJ0ICghb29tKTsKKyAgX2RidXNfYXNzZXJ0ICghbG9hZGVyLT5jb3JydXB0ZWQpOworICBfZGJ1c19hc3NlcnQgKGxvYWRlci0+bWVzc2FnZXMgIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfbGlzdF9maW5kX2xhc3QgKCZsb2FkZXItPm1lc3NhZ2VzLCBtZXNzYWdlKSAhPSBOVUxMKTsKKworICByZXR1cm4gVFJVRTsKKworIGZhaWxlZDoKKworICAvKiBDbGVhbiB1cCAqLworCisgIC8qIGRvZXMgbm90aGluZyBpZiB0aGUgbWVzc2FnZSBpc24ndCBpbiB0aGUgbGlzdCAqLworICBfZGJ1c19saXN0X3JlbW92ZV9sYXN0ICgmbG9hZGVyLT5tZXNzYWdlcywgbWVzc2FnZSk7CisgIAorICBpZiAob29tKQorICAgIF9kYnVzX2Fzc2VydCAoIWxvYWRlci0+Y29ycnVwdGVkKTsKKyAgZWxzZQorICAgIF9kYnVzX2Fzc2VydCAobG9hZGVyLT5jb3JydXB0ZWQpOworCisgIF9kYnVzX3ZlcmJvc2VfYnl0ZXNfb2Zfc3RyaW5nICgmbG9hZGVyLT5kYXRhLCAwLCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmxvYWRlci0+ZGF0YSkpOworCisgIHJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBDb252ZXJ0cyBidWZmZXJlZCBkYXRhIGludG8gbWVzc2FnZXMsIGlmIHdlIGhhdmUgZW5vdWdoIGRhdGEuICBJZgorICogd2UgZG9uJ3QgaGF2ZSBlbm91Z2ggZGF0YSwgZG9lcyBub3RoaW5nLgorICoKKyAqIEB0b2RvIHdlIG5lZWQgdG8gY2hlY2sgdGhhdCB0aGUgcHJvcGVyIG5hbWVkIGhlYWRlciBmaWVsZHMgZXhpc3QKKyAqIGZvciBlYWNoIG1lc3NhZ2UgdHlwZS4KKyAqCisgKiBAdG9kbyBJZiBhIG1lc3NhZ2UgaGFzIHVua25vd24gdHlwZSwgd2Ugc2hvdWxkIHByb2JhYmx5IGVhdCBpdAorICogcmlnaHQgaGVyZSByYXRoZXIgdGhhbiBwYXNzaW5nIGl0IG91dCB0byBhcHBsaWNhdGlvbnMuICBIb3dldmVyCisgKiBpdCdzIG5vdCBhbiBlcnJvciB0byBzZWUgbWVzc2FnZXMgb2YgdW5rbm93biB0eXBlLgorICoKKyAqIEBwYXJhbSBsb2FkZXIgdGhlIGxvYWRlci4KKyAqIEByZXR1cm5zICNUUlVFIGlmIHdlIGhhZCBlbm91Z2ggbWVtb3J5IHRvIGZpbmlzaC4KKyAqLworZGJ1c19ib29sX3QKK19kYnVzX21lc3NhZ2VfbG9hZGVyX3F1ZXVlX21lc3NhZ2VzIChEQnVzTWVzc2FnZUxvYWRlciAqbG9hZGVyKQoreworICB3aGlsZSAoIWxvYWRlci0+Y29ycnVwdGVkICYmCisgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmxvYWRlci0+ZGF0YSkgPj0gREJVU19NSU5JTVVNX0hFQURFUl9TSVpFKQorICAgIHsKKyAgICAgIERCdXNWYWxpZGl0eSB2YWxpZGl0eTsKKyAgICAgIGludCBieXRlX29yZGVyLCBmaWVsZHNfYXJyYXlfbGVuLCBoZWFkZXJfbGVuLCBib2R5X2xlbjsKKworICAgICAgaWYgKF9kYnVzX2hlYWRlcl9oYXZlX21lc3NhZ2VfdW50cnVzdGVkIChsb2FkZXItPm1heF9tZXNzYWdlX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWxpZGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZHNfYXJyYXlfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaGVhZGVyX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvZHlfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbG9hZGVyLT5kYXRhLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmxvYWRlci0+ZGF0YSkpKQorICAgICAgICB7CisgICAgICAgICAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisKKyAgICAgICAgICBfZGJ1c19hc3NlcnQgKHZhbGlkaXR5ID09IERCVVNfVkFMSUQpOworCisgICAgICAgICAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXdfZW1wdHlfaGVhZGVyICgpOworICAgICAgICAgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgICAgICBpZiAoIWxvYWRfbWVzc2FnZSAobG9hZGVyLCBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlX29yZGVyLCBmaWVsZHNfYXJyYXlfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJfbGVuLCBib2R5X2xlbikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICAgICAgICAgIC8qIGxvYWRfbWVzc2FnZSgpIHJldHVybnMgZmFsc2UgaWYgY29ycnVwdGVkIG9yIE9PTTsgaWYKKyAgICAgICAgICAgICAgICogY29ycnVwdGVkIHRoZW4gcmV0dXJuIFRSVUUgZm9yIG5vdCBPT00KKyAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgIHJldHVybiBsb2FkZXItPmNvcnJ1cHRlZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIF9kYnVzX2Fzc2VydCAobG9hZGVyLT5tZXNzYWdlcyAhPSBOVUxMKTsKKyAgICAgICAgICBfZGJ1c19hc3NlcnQgKF9kYnVzX2xpc3RfZmluZF9sYXN0ICgmbG9hZGVyLT5tZXNzYWdlcywgbWVzc2FnZSkgIT0gTlVMTCk7CisJfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkluaXRpYWwgcGVlayBhdCBoZWFkZXIgc2F5cyB3ZSBkb24ndCBoYXZlIGEgd2hvbGUgbWVzc2FnZSB5ZXQsIG9yIGRhdGEgYnJva2VuIHdpdGggaW52YWxpZCBjb2RlICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkaXR5KTsKKyAgICAgICAgICBpZiAodmFsaWRpdHkgIT0gREJVU19WQUxJRCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgbG9hZGVyLT5jb3JydXB0ZWQgPSBUUlVFOworICAgICAgICAgICAgICBsb2FkZXItPmNvcnJ1cHRpb25fcmVhc29uID0gdmFsaWRpdHk7CisgICAgICAgICAgICB9CisgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIH0KKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogUGVla3MgYXQgZmlyc3QgbG9hZGVkIG1lc3NhZ2UsIHJldHVybnMgI05VTEwgaWYgbm8gbWVzc2FnZXMgaGF2ZQorICogYmVlbiBxdWV1ZWQuCisgKgorICogQHBhcmFtIGxvYWRlciB0aGUgbG9hZGVyLgorICogQHJldHVybnMgdGhlIG5leHQgbWVzc2FnZSwgb3IgI05VTEwgaWYgbm9uZS4KKyAqLworREJ1c01lc3NhZ2UqCitfZGJ1c19tZXNzYWdlX2xvYWRlcl9wZWVrX21lc3NhZ2UgKERCdXNNZXNzYWdlTG9hZGVyICpsb2FkZXIpCit7CisgIGlmIChsb2FkZXItPm1lc3NhZ2VzKQorICAgIHJldHVybiBsb2FkZXItPm1lc3NhZ2VzLT5kYXRhOworICBlbHNlCisgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogUG9wcyBhIGxvYWRlZCBtZXNzYWdlIChwYXNzaW5nIG93bmVyc2hpcCBvZiB0aGUgbWVzc2FnZQorICogdG8gdGhlIGNhbGxlcikuIFJldHVybnMgI05VTEwgaWYgbm8gbWVzc2FnZXMgaGF2ZSBiZWVuCisgKiBxdWV1ZWQuCisgKgorICogQHBhcmFtIGxvYWRlciB0aGUgbG9hZGVyLgorICogQHJldHVybnMgdGhlIG5leHQgbWVzc2FnZSwgb3IgI05VTEwgaWYgbm9uZS4KKyAqLworREJ1c01lc3NhZ2UqCitfZGJ1c19tZXNzYWdlX2xvYWRlcl9wb3BfbWVzc2FnZSAoREJ1c01lc3NhZ2VMb2FkZXIgKmxvYWRlcikKK3sKKyAgcmV0dXJuIF9kYnVzX2xpc3RfcG9wX2ZpcnN0ICgmbG9hZGVyLT5tZXNzYWdlcyk7Cit9CisKKy8qKgorICogUG9wcyBhIGxvYWRlZCBtZXNzYWdlIGluc2lkZSBhIGxpc3QgbGluayAocGFzc2luZyBvd25lcnNoaXAgb2YgdGhlCisgKiBtZXNzYWdlIGFuZCBsaW5rIHRvIHRoZSBjYWxsZXIpLiBSZXR1cm5zICNOVUxMIGlmIG5vIG1lc3NhZ2VzIGhhdmUKKyAqIGJlZW4gbG9hZGVkLgorICoKKyAqIEBwYXJhbSBsb2FkZXIgdGhlIGxvYWRlci4KKyAqIEByZXR1cm5zIHRoZSBuZXh0IG1lc3NhZ2UgbGluaywgb3IgI05VTEwgaWYgbm9uZS4KKyAqLworREJ1c0xpc3QqCitfZGJ1c19tZXNzYWdlX2xvYWRlcl9wb3BfbWVzc2FnZV9saW5rIChEQnVzTWVzc2FnZUxvYWRlciAqbG9hZGVyKQoreworICByZXR1cm4gX2RidXNfbGlzdF9wb3BfZmlyc3RfbGluayAoJmxvYWRlci0+bWVzc2FnZXMpOworfQorCisvKioKKyAqIFJldHVybnMgYSBwb3BwZWQgbWVzc2FnZSBsaW5rLCB1c2VkIHRvIHVuZG8gYSBwb3AuCisgKgorICogQHBhcmFtIGxvYWRlciB0aGUgbG9hZGVyCisgKiBAcGFyYW0gbGluayB0aGUgbGluayB3aXRoIGEgbWVzc2FnZSBpbiBpdAorICovCit2b2lkCitfZGJ1c19tZXNzYWdlX2xvYWRlcl9wdXRiYWNrX21lc3NhZ2VfbGluayAoREJ1c01lc3NhZ2VMb2FkZXIgICpsb2FkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgICAgICAgICAgICpsaW5rKQoreworICBfZGJ1c19saXN0X3ByZXBlbmRfbGluayAoJmxvYWRlci0+bWVzc2FnZXMsIGxpbmspOworfQorCisvKioKKyAqIENoZWNrcyB3aGV0aGVyIHRoZSBsb2FkZXIgaXMgY29uZnVzZWQgZHVlIHRvIGJhZCBkYXRhLgorICogSWYgbWVzc2FnZXMgYXJlIHJlY2VpdmVkIHRoYXQgYXJlIGludmFsaWQsIHRoZQorICogbG9hZGVyIGdldHMgY29uZnVzZWQgYW5kIGdpdmVzIHVwIHBlcm1hbmVudGx5LgorICogVGhpcyBzdGF0ZSBpcyBjYWxsZWQgImNvcnJ1cHRlZC4iCisgKgorICogQHBhcmFtIGxvYWRlciB0aGUgbG9hZGVyCisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGUgbG9hZGVyIGlzIGhvc2VkLgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfbWVzc2FnZV9sb2FkZXJfZ2V0X2lzX2NvcnJ1cHRlZCAoREJ1c01lc3NhZ2VMb2FkZXIgKmxvYWRlcikKK3sKKyAgX2RidXNfYXNzZXJ0ICgobG9hZGVyLT5jb3JydXB0ZWQgJiYgbG9hZGVyLT5jb3JydXB0aW9uX3JlYXNvbiAhPSBEQlVTX1ZBTElEKSB8fAorICAgICAgICAgICAgICAgICghbG9hZGVyLT5jb3JydXB0ZWQgJiYgbG9hZGVyLT5jb3JydXB0aW9uX3JlYXNvbiA9PSBEQlVTX1ZBTElEKSk7CisgIHJldHVybiBsb2FkZXItPmNvcnJ1cHRlZDsKK30KKworLyoqCisgKiBDaGVja3Mgd2hhdCBraW5kIG9mIGJhZCBkYXRhIGNvbmZ1c2VkIHRoZSBsb2FkZXIuCisgKgorICogQHBhcmFtIGxvYWRlciB0aGUgbG9hZGVyCisgKiBAcmV0dXJucyB3aHkgdGhlIGxvYWRlciBpcyBob3NlZCwgb3IgREJVU19WQUxJRCBpZiBpdCBpc24ndC4KKyAqLworREJ1c1ZhbGlkaXR5CitfZGJ1c19tZXNzYWdlX2xvYWRlcl9nZXRfY29ycnVwdGlvbl9yZWFzb24gKERCdXNNZXNzYWdlTG9hZGVyICpsb2FkZXIpCit7CisgIF9kYnVzX2Fzc2VydCAoKGxvYWRlci0+Y29ycnVwdGVkICYmIGxvYWRlci0+Y29ycnVwdGlvbl9yZWFzb24gIT0gREJVU19WQUxJRCkgfHwKKyAgICAgICAgICAgICAgICAoIWxvYWRlci0+Y29ycnVwdGVkICYmIGxvYWRlci0+Y29ycnVwdGlvbl9yZWFzb24gPT0gREJVU19WQUxJRCkpOworCisgIHJldHVybiBsb2FkZXItPmNvcnJ1cHRpb25fcmVhc29uOworfQorCisvKioKKyAqIFNldHMgdGhlIG1heGltdW0gc2l6ZSBtZXNzYWdlIHdlIGFsbG93LgorICoKKyAqIEBwYXJhbSBsb2FkZXIgdGhlIGxvYWRlcgorICogQHBhcmFtIHNpemUgdGhlIG1heCBtZXNzYWdlIHNpemUgaW4gYnl0ZXMKKyAqLwordm9pZAorX2RidXNfbWVzc2FnZV9sb2FkZXJfc2V0X21heF9tZXNzYWdlX3NpemUgKERCdXNNZXNzYWdlTG9hZGVyICAqbG9hZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgICAgICAgICAgICAgICAgc2l6ZSkKK3sKKyAgaWYgKHNpemUgPiBEQlVTX01BWElNVU1fTUVTU0FHRV9MRU5HVEgpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoImNsYW1waW5nIHJlcXVlc3RlZCBtYXggbWVzc2FnZSBzaXplICVsZCB0byAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgIHNpemUsIERCVVNfTUFYSU1VTV9NRVNTQUdFX0xFTkdUSCk7CisgICAgICBzaXplID0gREJVU19NQVhJTVVNX01FU1NBR0VfTEVOR1RIOworICAgIH0KKyAgbG9hZGVyLT5tYXhfbWVzc2FnZV9zaXplID0gc2l6ZTsKK30KKworLyoqCisgKiBHZXRzIHRoZSBtYXhpbXVtIGFsbG93ZWQgbWVzc2FnZSBzaXplIGluIGJ5dGVzLgorICoKKyAqIEBwYXJhbSBsb2FkZXIgdGhlIGxvYWRlcgorICogQHJldHVybnMgbWF4IHNpemUgaW4gYnl0ZXMKKyAqLworbG9uZworX2RidXNfbWVzc2FnZV9sb2FkZXJfZ2V0X21heF9tZXNzYWdlX3NpemUgKERCdXNNZXNzYWdlTG9hZGVyICAqbG9hZGVyKQoreworICByZXR1cm4gbG9hZGVyLT5tYXhfbWVzc2FnZV9zaXplOworfQorCisvKioKKyAqIFNldHMgdGhlIG1heGltdW0gdW5peCBmZHMgcGVyIG1lc3NhZ2Ugd2UgYWxsb3cuCisgKgorICogQHBhcmFtIGxvYWRlciB0aGUgbG9hZGVyCisgKiBAcGFyYW0gbiB0aGUgbWF4IG51bWJlciBvZiB1bml4IGZkcyBpbiBhIG1lc3NhZ2UKKyAqLwordm9pZAorX2RidXNfbWVzc2FnZV9sb2FkZXJfc2V0X21heF9tZXNzYWdlX3VuaXhfZmRzIChEQnVzTWVzc2FnZUxvYWRlciAgKmxvYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyAgICAgICAgICAgICAgICBuKQoreworICBpZiAobiA+IERCVVNfTUFYSU1VTV9NRVNTQUdFX1VOSVhfRkRTKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJjbGFtcGluZyByZXF1ZXN0ZWQgbWF4IG1lc3NhZ2UgdW5peF9mZHMgJWxkIHRvICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgbiwgREJVU19NQVhJTVVNX01FU1NBR0VfVU5JWF9GRFMpOworICAgICAgbiA9IERCVVNfTUFYSU1VTV9NRVNTQUdFX1VOSVhfRkRTOworICAgIH0KKyAgbG9hZGVyLT5tYXhfbWVzc2FnZV91bml4X2ZkcyA9IG47Cit9CisKKy8qKgorICogR2V0cyB0aGUgbWF4aW11bSBhbGxvd2VkIG51bWJlciBvZiB1bml4IGZkcyBwZXIgbWVzc2FnZQorICoKKyAqIEBwYXJhbSBsb2FkZXIgdGhlIGxvYWRlcgorICogQHJldHVybnMgbWF4IHVuaXggZmRzCisgKi8KK2xvbmcKK19kYnVzX21lc3NhZ2VfbG9hZGVyX2dldF9tYXhfbWVzc2FnZV91bml4X2ZkcyAoREJ1c01lc3NhZ2VMb2FkZXIgICpsb2FkZXIpCit7CisgIHJldHVybiBsb2FkZXItPm1heF9tZXNzYWdlX3VuaXhfZmRzOworfQorCisvKioKKyAqIFJldHVybiBob3cgbWFueSBmaWxlIGRlc2NyaXB0b3JzIGFyZSBwZW5kaW5nIGluIHRoZSBsb2FkZXIKKyAqCisgKiBAcGFyYW0gbG9hZGVyIHRoZSBsb2FkZXIKKyAqLworaW50CitfZGJ1c19tZXNzYWdlX2xvYWRlcl9nZXRfcGVuZGluZ19mZHNfY291bnQgKERCdXNNZXNzYWdlTG9hZGVyICpsb2FkZXIpCit7CisjaWZkZWYgSEFWRV9VTklYX0ZEX1BBU1NJTkcKKyAgcmV0dXJuIGxvYWRlci0+bl91bml4X2ZkczsKKyNlbHNlCisgIHJldHVybiAwOworI2VuZGlmCit9CisKKy8qKgorICogUmVnaXN0ZXIgYSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbmV2ZXIgdGhlIG51bWJlciBvZiBwZW5kaW5nIGZpbGUKKyAqIGRlc2NyaXB0b3JzIGluIHRoZSBsb2FkZXIgY2hhbmdlLgorICoKKyAqIEBwYXJhbSBsb2FkZXIgdGhlIGxvYWRlcgorICogQHBhcmFtIGNhbGxiYWNrIHRoZSBjYWxsYmFjaworICogQHBhcmFtIGRhdGEgdGhlIGRhdGEgZm9yIHRoZSBjYWxsYmFjaworICovCit2b2lkCitfZGJ1c19tZXNzYWdlX2xvYWRlcl9zZXRfcGVuZGluZ19mZHNfZnVuY3Rpb24gKERCdXNNZXNzYWdlTG9hZGVyICpsb2FkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCogY2FsbGJhY2spICh2b2lkICopLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhKQoreworI2lmZGVmIEhBVkVfVU5JWF9GRF9QQVNTSU5HCisgIGxvYWRlci0+dW5peF9mZHNfY2hhbmdlID0gY2FsbGJhY2s7CisgIGxvYWRlci0+dW5peF9mZHNfY2hhbmdlX2RhdGEgPSBkYXRhOworI2VuZGlmCit9CisKK3N0YXRpYyBEQnVzRGF0YVNsb3RBbGxvY2F0b3Igc2xvdF9hbGxvY2F0b3IgPQorICBfREJVU19EQVRBX1NMT1RfQUxMT0NBVE9SX0lOSVQgKF9EQlVTX0xPQ0tfTkFNRSAobWVzc2FnZV9zbG90cykpOworCisvKioKKyAqIEFsbG9jYXRlcyBhbiBpbnRlZ2VyIElEIHRvIGJlIHVzZWQgZm9yIHN0b3JpbmcgYXBwbGljYXRpb24tc3BlY2lmaWMKKyAqIGRhdGEgb24gYW55IERCdXNNZXNzYWdlLiBUaGUgYWxsb2NhdGVkIElEIG1heSB0aGVuIGJlIHVzZWQKKyAqIHdpdGggZGJ1c19tZXNzYWdlX3NldF9kYXRhKCkgYW5kIGRidXNfbWVzc2FnZV9nZXRfZGF0YSgpLgorICogVGhlIHBhc3NlZC1pbiBzbG90IG11c3QgYmUgaW5pdGlhbGl6ZWQgdG8gLTEsIGFuZCBpcyBmaWxsZWQgaW4KKyAqIHdpdGggdGhlIHNsb3QgSUQuIElmIHRoZSBwYXNzZWQtaW4gc2xvdCBpcyBub3QgLTEsIGl0J3MgYXNzdW1lZAorICogdG8gYmUgYWxyZWFkeSBhbGxvY2F0ZWQsIGFuZCBpdHMgcmVmY291bnQgaXMgaW5jcmVtZW50ZWQuCisgKgorICogVGhlIGFsbG9jYXRlZCBzbG90IGlzIGdsb2JhbCwgaS5lLiBhbGwgREJ1c01lc3NhZ2Ugb2JqZWN0cyB3aWxsCisgKiBoYXZlIGEgc2xvdCB3aXRoIHRoZSBnaXZlbiBpbnRlZ2VyIElEIHJlc2VydmVkLgorICoKKyAqIEBwYXJhbSBzbG90X3AgYWRkcmVzcyBvZiBhIGdsb2JhbCB2YXJpYWJsZSBzdG9yaW5nIHRoZSBzbG90CisgKiBAcmV0dXJucyAjRkFMU0Ugb24gZmFpbHVyZSAobm8gbWVtb3J5KQorICovCitkYnVzX2Jvb2xfdAorZGJ1c19tZXNzYWdlX2FsbG9jYXRlX2RhdGFfc2xvdCAoZGJ1c19pbnQzMl90ICpzbG90X3ApCit7CisgIHJldHVybiBfZGJ1c19kYXRhX3Nsb3RfYWxsb2NhdG9yX2FsbG9jICgmc2xvdF9hbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90X3ApOworfQorCisvKioKKyAqIERlYWxsb2NhdGVzIGEgZ2xvYmFsIElEIGZvciBtZXNzYWdlIGRhdGEgc2xvdHMuCisgKiBkYnVzX21lc3NhZ2VfZ2V0X2RhdGEoKSBhbmQgZGJ1c19tZXNzYWdlX3NldF9kYXRhKCkgbWF5IG5vCisgKiBsb25nZXIgYmUgdXNlZCB3aXRoIHRoaXMgc2xvdC4gIEV4aXN0aW5nIGRhdGEgc3RvcmVkIG9uIGV4aXN0aW5nCisgKiBEQnVzTWVzc2FnZSBvYmplY3RzIHdpbGwgYmUgZnJlZWQgd2hlbiB0aGUgbWVzc2FnZSBpcworICogZmluYWxpemVkLCBidXQgbWF5IG5vdCBiZSByZXRyaWV2ZWQgKGFuZCBtYXkgb25seSBiZSByZXBsYWNlZCBpZgorICogc29tZW9uZSBlbHNlIHJlYWxsb2NhdGVzIHRoZSBzbG90KS4gIFdoZW4gdGhlIHJlZmNvdW50IG9uIHRoZQorICogcGFzc2VkLWluIHNsb3QgcmVhY2hlcyAwLCBpdCBpcyBzZXQgdG8gLTEuCisgKgorICogQHBhcmFtIHNsb3RfcCBhZGRyZXNzIHN0b3JpbmcgdGhlIHNsb3QgdG8gZGVhbGxvY2F0ZQorICovCit2b2lkCitkYnVzX21lc3NhZ2VfZnJlZV9kYXRhX3Nsb3QgKGRidXNfaW50MzJfdCAqc2xvdF9wKQoreworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAoKnNsb3RfcCA+PSAwKTsKKworICBfZGJ1c19kYXRhX3Nsb3RfYWxsb2NhdG9yX2ZyZWUgKCZzbG90X2FsbG9jYXRvciwgc2xvdF9wKTsKK30KKworLyoqCisgKiBTdG9yZXMgYSBwb2ludGVyIG9uIGEgREJ1c01lc3NhZ2UsIGFsb25nCisgKiB3aXRoIGFuIG9wdGlvbmFsIGZ1bmN0aW9uIHRvIGJlIHVzZWQgZm9yIGZyZWVpbmcKKyAqIHRoZSBkYXRhIHdoZW4gdGhlIGRhdGEgaXMgc2V0IGFnYWluLCBvciB3aGVuCisgKiB0aGUgbWVzc2FnZSBpcyBmaW5hbGl6ZWQuIFRoZSBzbG90IG51bWJlcgorICogbXVzdCBoYXZlIGJlZW4gYWxsb2NhdGVkIHdpdGggZGJ1c19tZXNzYWdlX2FsbG9jYXRlX2RhdGFfc2xvdCgpLgorICoKKyAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlCisgKiBAcGFyYW0gc2xvdCB0aGUgc2xvdCBudW1iZXIKKyAqIEBwYXJhbSBkYXRhIHRoZSBkYXRhIHRvIHN0b3JlCisgKiBAcGFyYW0gZnJlZV9kYXRhX2Z1bmMgZmluYWxpemVyIGZ1bmN0aW9uIGZvciB0aGUgZGF0YQorICogQHJldHVybnMgI1RSVUUgaWYgdGhlcmUgd2FzIGVub3VnaCBtZW1vcnkgdG8gc3RvcmUgdGhlIGRhdGEKKyAqLworZGJ1c19ib29sX3QKK2RidXNfbWVzc2FnZV9zZXRfZGF0YSAoREJ1c01lc3NhZ2UgICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2ludDMyX3QgICAgIHNsb3QsCisgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiBmcmVlX2RhdGFfZnVuYykKK3sKKyAgREJ1c0ZyZWVGdW5jdGlvbiBvbGRfZnJlZV9mdW5jOworICB2b2lkICpvbGRfZGF0YTsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAobWVzc2FnZSAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoc2xvdCA+PSAwLCBGQUxTRSk7CisKKyAgcmV0dmFsID0gX2RidXNfZGF0YV9zbG90X2xpc3Rfc2V0ICgmc2xvdF9hbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lc3NhZ2UtPnNsb3RfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90LCBkYXRhLCBmcmVlX2RhdGFfZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2xkX2ZyZWVfZnVuYywgJm9sZF9kYXRhKTsKKworICBpZiAocmV0dmFsKQorICAgIHsKKyAgICAgIC8qIERvIHRoZSBhY3R1YWwgZnJlZSBvdXRzaWRlIHRoZSBtZXNzYWdlIGxvY2sgKi8KKyAgICAgIGlmIChvbGRfZnJlZV9mdW5jKQorICAgICAgICAoKiBvbGRfZnJlZV9mdW5jKSAob2xkX2RhdGEpOworICAgIH0KKworICByZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIFJldHJpZXZlcyBkYXRhIHByZXZpb3VzbHkgc2V0IHdpdGggZGJ1c19tZXNzYWdlX3NldF9kYXRhKCkuCisgKiBUaGUgc2xvdCBtdXN0IHN0aWxsIGJlIGFsbG9jYXRlZCAobXVzdCBub3QgaGF2ZSBiZWVuIGZyZWVkKS4KKyAqCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZQorICogQHBhcmFtIHNsb3QgdGhlIHNsb3QgdG8gZ2V0IGRhdGEgZnJvbQorICogQHJldHVybnMgdGhlIGRhdGEsIG9yICNOVUxMIGlmIG5vdCBmb3VuZAorICovCit2b2lkKgorZGJ1c19tZXNzYWdlX2dldF9kYXRhIChEQnVzTWVzc2FnZSAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2ludDMyX3QgICBzbG90KQoreworICB2b2lkICpyZXM7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChtZXNzYWdlICE9IE5VTEwsIE5VTEwpOworCisgIHJlcyA9IF9kYnVzX2RhdGFfc2xvdF9saXN0X2dldCAoJnNsb3RfYWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZXNzYWdlLT5zbG90X2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvdCk7CisKKyAgcmV0dXJuIHJlczsKK30KKworLyoqCisgKiBVdGlsaXR5IGZ1bmN0aW9uIHRvIGNvbnZlcnQgYSBtYWNoaW5lLXJlYWRhYmxlIChub3QgdHJhbnNsYXRlZCkKKyAqIHN0cmluZyBpbnRvIGEgRC1CdXMgbWVzc2FnZSB0eXBlLgorICoKKyAqIEBjb2RlCisgKiAgICJtZXRob2RfY2FsbCIgICAgLT4gREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX0NBTEwKKyAqICAgIm1ldGhvZF9yZXR1cm4iICAtPiBEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfUkVUVVJOCisgKiAgICJzaWduYWwiICAgICAgICAgLT4gREJVU19NRVNTQUdFX1RZUEVfU0lHTkFMCisgKiAgICJlcnJvciIgICAgICAgICAgLT4gREJVU19NRVNTQUdFX1RZUEVfRVJST1IKKyAqICAgYW55dGhpbmcgZWxzZSAgICAtPiBEQlVTX01FU1NBR0VfVFlQRV9JTlZBTElECisgKiBAZW5kY29kZQorICoKKyAqLworaW50CitkYnVzX21lc3NhZ2VfdHlwZV9mcm9tX3N0cmluZyAoY29uc3QgY2hhciAqdHlwZV9zdHIpCit7CisgIGlmIChzdHJjbXAgKHR5cGVfc3RyLCAibWV0aG9kX2NhbGwiKSA9PSAwKQorICAgIHJldHVybiBEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfQ0FMTDsKKyAgaWYgKHN0cmNtcCAodHlwZV9zdHIsICJtZXRob2RfcmV0dXJuIikgPT0gMCkKKyAgICByZXR1cm4gREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX1JFVFVSTjsKKyAgZWxzZSBpZiAoc3RyY21wICh0eXBlX3N0ciwgInNpZ25hbCIpID09IDApCisgICAgcmV0dXJuIERCVVNfTUVTU0FHRV9UWVBFX1NJR05BTDsKKyAgZWxzZSBpZiAoc3RyY21wICh0eXBlX3N0ciwgImVycm9yIikgPT0gMCkKKyAgICByZXR1cm4gREJVU19NRVNTQUdFX1RZUEVfRVJST1I7CisgIGVsc2UKKyAgICByZXR1cm4gREJVU19NRVNTQUdFX1RZUEVfSU5WQUxJRDsKK30KKworLyoqCisgKiBVdGlsaXR5IGZ1bmN0aW9uIHRvIGNvbnZlcnQgYSBELUJ1cyBtZXNzYWdlIHR5cGUgaW50byBhCisgKiBtYWNoaW5lLXJlYWRhYmxlIHN0cmluZyAobm90IHRyYW5zbGF0ZWQpLgorICoKKyAqIEBjb2RlCisgKiAgIERCVVNfTUVTU0FHRV9UWVBFX01FVEhPRF9DQUxMICAgIC0+ICJtZXRob2RfY2FsbCIKKyAqICAgREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX1JFVFVSTiAgLT4gIm1ldGhvZF9yZXR1cm4iCisgKiAgIERCVVNfTUVTU0FHRV9UWVBFX1NJR05BTCAgICAgICAgIC0+ICJzaWduYWwiCisgKiAgIERCVVNfTUVTU0FHRV9UWVBFX0VSUk9SICAgICAgICAgIC0+ICJlcnJvciIKKyAqICAgREJVU19NRVNTQUdFX1RZUEVfSU5WQUxJRCAgICAgICAgLT4gImludmFsaWQiCisgKiBAZW5kY29kZQorICoKKyAqLworY29uc3QgY2hhciAqCitkYnVzX21lc3NhZ2VfdHlwZV90b19zdHJpbmcgKGludCB0eXBlKQoreworICBzd2l0Y2ggKHR5cGUpCisgICAgeworICAgIGNhc2UgREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX0NBTEw6CisgICAgICByZXR1cm4gIm1ldGhvZF9jYWxsIjsKKyAgICBjYXNlIERCVVNfTUVTU0FHRV9UWVBFX01FVEhPRF9SRVRVUk46CisgICAgICByZXR1cm4gIm1ldGhvZF9yZXR1cm4iOworICAgIGNhc2UgREJVU19NRVNTQUdFX1RZUEVfU0lHTkFMOgorICAgICAgcmV0dXJuICJzaWduYWwiOworICAgIGNhc2UgREJVU19NRVNTQUdFX1RZUEVfRVJST1I6CisgICAgICByZXR1cm4gImVycm9yIjsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuICJpbnZhbGlkIjsKKyAgICB9Cit9CisKKy8qKgorICogVHVybiBhIERCdXNNZXNzYWdlIGludG8gdGhlIG1hcnNoYWxsZWQgZm9ybSBhcyBkZXNjcmliZWQgaW4gdGhlIEQtQnVzCisgKiBzcGVjaWZpY2F0aW9uLgorICoKKyAqIEdlbmVyYWxseSwgdGhpcyBmdW5jdGlvbiBpcyBvbmx5IHVzZWZ1bCBmb3IgZW5jYXBzdWxhdGluZyBELUJ1cyBtZXNzYWdlcyBpbgorICogYSBkaWZmZXJlbnQgcHJvdG9jb2wuCisgKgorICogQHBhcmFtIG1zZyB0aGUgREJ1c01lc3NhZ2UKKyAqIEBwYXJhbSBtYXJzaGFsbGVkX2RhdGFfcCB0aGUgbG9jYXRpb24gdG8gc2F2ZSB0aGUgbWFyc2hhbGxlZCBmb3JtIHRvCisgKiBAcGFyYW0gbGVuX3AgdGhlIGxvY2F0aW9uIHRvIHNhdmUgdGhlIGxlbmd0aCBvZiB0aGUgbWFyc2hhbGxlZCBmb3JtIHRvCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitkYnVzX21lc3NhZ2VfbWFyc2hhbCAoREJ1c01lc3NhZ2UgICptc2csCisgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAgKiptYXJzaGFsbGVkX2RhdGFfcCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgKmxlbl9wKQoreworICBEQnVzU3RyaW5nIHRtcDsKKyAgZGJ1c19ib29sX3Qgd2FzX2xvY2tlZDsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG1zZyAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAobWFyc2hhbGxlZF9kYXRhX3AgIT0gTlVMTCwgRkFMU0UpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGxlbl9wICE9IE5VTEwsIEZBTFNFKTsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZ0bXApKQorICAgIHJldHVybiBGQUxTRTsKKworICAvKiBFbnN1cmUgdGhlIG1lc3NhZ2UgaXMgbG9ja2VkLCB0byBlbnN1cmUgdGhlIGxlbmd0aCBoZWFkZXIgaXMgZmlsbGVkIGluLiAqLworICB3YXNfbG9ja2VkID0gbXNnLT5sb2NrZWQ7CisKKyAgaWYgKCF3YXNfbG9ja2VkKQorICAgIGRidXNfbWVzc2FnZV9sb2NrIChtc2cpOworCisgIGlmICghX2RidXNfc3RyaW5nX2NvcHkgKCYobXNnLT5oZWFkZXIuZGF0YSksIDAsICZ0bXAsIDApKQorICAgIGdvdG8gZmFpbDsKKworICAqbGVuX3AgPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnRtcCk7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAoJihtc2ctPmJvZHkpLCAwLCAmdG1wLCAqbGVuX3ApKQorICAgIGdvdG8gZmFpbDsKKworICAqbGVuX3AgPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnRtcCk7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfc3RlYWxfZGF0YSAoJnRtcCwgbWFyc2hhbGxlZF9kYXRhX3ApKQorICAgIGdvdG8gZmFpbDsKKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnRtcCk7CisKKyAgaWYgKCF3YXNfbG9ja2VkKQorICAgIG1zZy0+bG9ja2VkID0gRkFMU0U7CisKKyAgcmV0dXJuIFRSVUU7CisKKyBmYWlsOgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJnRtcCk7CisKKyAgaWYgKCF3YXNfbG9ja2VkKQorICAgIG1zZy0+bG9ja2VkID0gRkFMU0U7CisKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKioKKyAqIERlbWFyc2hhbCBhIEQtQnVzIG1lc3NhZ2UgZnJvbSB0aGUgZm9ybWF0IGRlc2NyaWJlZCBpbiB0aGUgRC1CdXMKKyAqIHNwZWNpZmljYXRpb24uCisgKgorICogR2VuZXJhbGx5LCB0aGlzIGZ1bmN0aW9uIGlzIG9ubHkgdXNlZnVsIGZvciBlbmNhcHN1bGF0aW5nIEQtQnVzIG1lc3NhZ2VzIGluCisgKiBhIGRpZmZlcmVudCBwcm90b2NvbC4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBtYXJzaGFsbGVkIERCdXNNZXNzYWdlCisgKiBAcGFyYW0gbGVuIHRoZSBsZW5ndGggb2Ygc3RyCisgKiBAcGFyYW0gZXJyb3IgdGhlIGxvY2F0aW9uIHRvIHNhdmUgZXJyb3JzIHRvCisgKiBAcmV0dXJucyAjTlVMTCBpZiB0aGVyZSB3YXMgYW4gZXJyb3IKKyAqLworREJ1c01lc3NhZ2UgKgorZGJ1c19tZXNzYWdlX2RlbWFyc2hhbCAoY29uc3QgY2hhciAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAqZXJyb3IpCit7CisgIERCdXNNZXNzYWdlTG9hZGVyICpsb2FkZXI7CisgIERCdXNTdHJpbmcgKmJ1ZmZlcjsKKyAgREJ1c01lc3NhZ2UgKm1zZzsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHN0ciAhPSBOVUxMLCBOVUxMKTsKKworICBsb2FkZXIgPSBfZGJ1c19tZXNzYWdlX2xvYWRlcl9uZXcgKCk7CisKKyAgaWYgKGxvYWRlciA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIF9kYnVzX21lc3NhZ2VfbG9hZGVyX2dldF9idWZmZXIgKGxvYWRlciwgJmJ1ZmZlciwgTlVMTCwgTlVMTCk7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX2xlbiAoYnVmZmVyLCBzdHIsIGxlbikpCisgICAgZ290byBmYWlsX29vbTsKKworICBfZGJ1c19tZXNzYWdlX2xvYWRlcl9yZXR1cm5fYnVmZmVyIChsb2FkZXIsIGJ1ZmZlcik7CisKKyAgaWYgKCFfZGJ1c19tZXNzYWdlX2xvYWRlcl9xdWV1ZV9tZXNzYWdlcyAobG9hZGVyKSkKKyAgICBnb3RvIGZhaWxfb29tOworCisgIGlmIChfZGJ1c19tZXNzYWdlX2xvYWRlcl9nZXRfaXNfY29ycnVwdGVkIChsb2FkZXIpKQorICAgIGdvdG8gZmFpbF9jb3JydXB0OworCisgIG1zZyA9IF9kYnVzX21lc3NhZ2VfbG9hZGVyX3BvcF9tZXNzYWdlIChsb2FkZXIpOworCisgIGlmICghbXNnKQorICAgIGdvdG8gZmFpbF9vb207CisKKyAgX2RidXNfbWVzc2FnZV9sb2FkZXJfdW5yZWYgKGxvYWRlcik7CisgIHJldHVybiBtc2c7CisKKyBmYWlsX2NvcnJ1cHQ6CisgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9JTlZBTElEX0FSR1MsICJNZXNzYWdlIGlzIGNvcnJ1cHRlZCAoJXMpIiwKKyAgICAgICAgICAgICAgICAgIF9kYnVzX3ZhbGlkaXR5X3RvX2Vycm9yX21lc3NhZ2UgKGxvYWRlci0+Y29ycnVwdGlvbl9yZWFzb24pKTsKKyAgX2RidXNfbWVzc2FnZV9sb2FkZXJfdW5yZWYgKGxvYWRlcik7CisgIHJldHVybiBOVUxMOworCisgZmFpbF9vb206CisgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgX2RidXNfbWVzc2FnZV9sb2FkZXJfdW5yZWYgKGxvYWRlcik7CisgIHJldHVybiBOVUxMOworfQorCisvKioKKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCB0byBiZSBpbiB0aGUgYnVmZmVyIHRvIGRlbWFyc2hhbCBhCisgKiBELUJ1cyBtZXNzYWdlLgorICoKKyAqIEdlbmVyYWxseSwgdGhpcyBmdW5jdGlvbiBpcyBvbmx5IHVzZWZ1bCBmb3IgZW5jYXBzdWxhdGluZyBELUJ1cyBtZXNzYWdlcyBpbgorICogYSBkaWZmZXJlbnQgcHJvdG9jb2wuCisgKgorICogQHBhcmFtIGJ1ZiBkYXRhIHRvIGJlIG1hcnNoYWxsZWQKKyAqIEBwYXJhbSBsZW4gdGhlIGxlbmd0aCBvZiBAcCBidWYKKyAqIEByZXR1cm5zIC0xIGlmIHRoZXJlIHdhcyBubyB2YWxpZCBkYXRhIHRvIGJlIGRlbWFyc2hhbGxlZCwgMCBpZiB0aGVyZSB3YXNuJ3QgZW5vdWdoIGRhdGEgdG8gZGV0ZXJtaW5lIGhvdyBtdWNoIHNob3VsZCBiZSBkZW1hcnNoYWxsZWQuIE90aGVyd2lzZSByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgZGVtYXJzaGFsbGVkCisgKiAKKyAqLworaW50IAorZGJ1c19tZXNzYWdlX2RlbWFyc2hhbF9ieXRlc19uZWVkZWQoY29uc3QgY2hhciAqYnVmLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIGxlbikKK3sKKyAgREJ1c1N0cmluZyBzdHI7CisgIGludCBieXRlX29yZGVyLCBmaWVsZHNfYXJyYXlfbGVuLCBoZWFkZXJfbGVuLCBib2R5X2xlbjsKKyAgREJ1c1ZhbGlkaXR5IHZhbGlkaXR5ID0gREJVU19WQUxJRDsKKyAgaW50IGhhdmVfbWVzc2FnZTsKKworICBpZiAoIWJ1ZiB8fCBsZW4gPCBEQlVTX01JTklNVU1fSEVBREVSX1NJWkUpCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKGxlbiA+IERCVVNfTUFYSU1VTV9NRVNTQUdFX0xFTkdUSCkKKyAgICBsZW4gPSBEQlVTX01BWElNVU1fTUVTU0FHRV9MRU5HVEg7CisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0X2xlbiAoJnN0ciwgYnVmLCBsZW4pOworICAKKyAgdmFsaWRpdHkgPSBEQlVTX1ZBTElEOworICBoYXZlX21lc3NhZ2UKKyAgICA9IF9kYnVzX2hlYWRlcl9oYXZlX21lc3NhZ2VfdW50cnVzdGVkKERCVVNfTUFYSU1VTV9NRVNTQUdFX0xFTkdUSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWxpZGl0eSwgJmJ5dGVfb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRzX2FycmF5X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoZWFkZXJfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvZHlfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0ciwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbik7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmc3RyKTsKKworICBpZiAodmFsaWRpdHkgPT0gREJVU19WQUxJRCkKKyAgICB7CisgICAgICBfZGJ1c19hc3NlcnQgKGhhdmVfbWVzc2FnZSB8fCAoaGVhZGVyX2xlbiArIGJvZHlfbGVuKSA+IGxlbik7CisgICAgICAodm9pZCkgaGF2ZV9tZXNzYWdlOyAvKiB1bnVzZWQgdW5sZXNzIGFzc2VydGluZyAqLworICAgICAgcmV0dXJuIGhlYWRlcl9sZW4gKyBib2R5X2xlbjsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICByZXR1cm4gLTE7IC8qIGJyb2tlbiEgKi8KKyAgICB9Cit9CisKKy8qKgorICogU2V0cyBhIGZsYWcgaW5kaWNhdGluZyB0aGF0IHRoZSBjYWxsZXIgb2YgdGhlIG1ldGhvZCBpcyBwcmVwYXJlZAorICogdG8gd2FpdCBmb3IgaW50ZXJhY3RpdmUgYXV0aG9yaXphdGlvbiB0byB0YWtlIHBsYWNlIChmb3IgaW5zdGFuY2UKKyAqIHZpYSBQb2xraXQpIGJlZm9yZSB0aGUgYWN0dWFsIG1ldGhvZCBpcyBwcm9jZXNzZWQuCisgKgorICogVGhlIGZsYWcgaXMgI0ZBTFNFIGJ5IGRlZmF1bHQ7IHRoYXQgaXMsIGJ5IGRlZmF1bHQgdGhlIG90aGVyIGVuZCBpcworICogZXhwZWN0ZWQgdG8gbWFrZSBhbnkgYXV0aG9yaXphdGlvbiBkZWNpc2lvbnMgbm9uLWludGVyYWN0aXZlbHkKKyAqIGFuZCBwcm9tcHRseS4gSXQgbWF5IHVzZSB0aGUgZXJyb3IKKyAqICNEQlVTX0VSUk9SX0lOVEVSQUNUSVZFX0FVVEhPUklaQVRJT05fUkVRVUlSRUQgdG8gc2lnbmFsIHRoYXQKKyAqIGF1dGhvcml6YXRpb24gZmFpbGVkLCBidXQgY291bGQgaGF2ZSBzdWNjZWVkZWQgaWYgdGhpcyBmbGFnIGhhZAorICogYmVlbiB1c2VkLgorICoKKyAqIEZvciBtZXNzYWdlcyB3aG9zZSB0eXBlIGlzIG5vdCAjREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX0NBTEwsCisgKiB0aGlzIGZsYWcgaXMgbWVhbmluZ2xlc3MgYW5kIHNob3VsZCBub3QgYmUgc2V0LgorICoKKyAqIE9uIHRoZSBwcm90b2NvbCBsZXZlbCB0aGlzIHRvZ2dsZXMKKyAqICNEQlVTX0hFQURFUl9GTEFHX0FMTE9XX0lOVEVSQUNUSVZFX0FVVEhPUklaQVRJT04uCisgKgorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UKKyAqIEBwYXJhbSBhbGxvdyAjVFJVRSBpZiBpbnRlcmFjdGl2ZSBhdXRob3JpemF0aW9uIGlzIGFjY2VwdGFibGUKKyAqLwordm9pZAorZGJ1c19tZXNzYWdlX3NldF9hbGxvd19pbnRlcmFjdGl2ZV9hdXRob3JpemF0aW9uIChEQnVzTWVzc2FnZSAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgIGFsbG93KQoreworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAobWVzc2FnZSAhPSBOVUxMKTsKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKCFtZXNzYWdlLT5sb2NrZWQpOworCisgIF9kYnVzX2hlYWRlcl90b2dnbGVfZmxhZyAoJm1lc3NhZ2UtPmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0hFQURFUl9GTEFHX0FMTE9XX0lOVEVSQUNUSVZFX0FVVEhPUklaQVRJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3cpOworfQorCisvKioKKyAqIFJldHVybnMgd2hldGhlciB0aGUgZmxhZyBjb250cm9sbGVkIGJ5CisgKiBkYnVzX21lc3NhZ2Vfc2V0X2FsbG93X2ludGVyYWN0aXZlX2F1dGhvcml6YXRpb24oKSBoYXMgYmVlbiBzZXQuCisgKgorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UKKyAqLworZGJ1c19ib29sX3QKK2RidXNfbWVzc2FnZV9nZXRfYWxsb3dfaW50ZXJhY3RpdmVfYXV0aG9yaXphdGlvbiAoREJ1c01lc3NhZ2UgKm1lc3NhZ2UpCit7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAobWVzc2FnZSAhPSBOVUxMLCBGQUxTRSk7CisKKyAgcmV0dXJuIF9kYnVzX2hlYWRlcl9nZXRfZmxhZyAoJm1lc3NhZ2UtPmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19IRUFERVJfRkxBR19BTExPV19JTlRFUkFDVElWRV9BVVRIT1JJWkFUSU9OKTsKK30KKworLyoqCisgKiBBbiBvcGFxdWUgZGF0YSBzdHJ1Y3R1cmUgY29udGFpbmluZyB0aGUgc2VyaWFsaXplZCBmb3JtIG9mIGFueSBzaW5nbGUKKyAqIEQtQnVzIG1lc3NhZ2UgaXRlbSwgd2hvc2Ugc2lnbmF0dXJlIGlzIGEgc2luZ2xlIGNvbXBsZXRlIHR5cGUuCisgKgorICogKEltcGxlbWVudGF0aW9uIGRldGFpbDogSXQncyBzZXJpYWxpemVkIGFzIGEgc2luZ2xlIHZhcmlhbnQuKQorICovCitzdHJ1Y3QgREJ1c1ZhcmlhbnQKK3sKKyAgREJ1c1N0cmluZyBkYXRhOworfTsKKworLyoqCisgKiBDb3B5IGEgc2luZ2xlIEQtQnVzIG1lc3NhZ2UgaXRlbSBmcm9tIHJlYWRlciBpbnRvIGEKKyAqIG5ld2x5LWFsbG9jYXRlZCAjREJ1c1ZhcmlhbnQuCisgKgorICogRm9yIGV4YW1wbGUsIGlmIGEgbWVzc2FnZSBjb250YWlucyB0aHJlZSBzdHJpbmcgYXJndW1lbnRzLCBhbmQgcmVhZGVyIHBvaW50cworICogdG8gdGhlIHNlY29uZCBzdHJpbmcsIHRoZSByZXN1bHRpbmcgREJ1c1ZhcmlhbnQgd2lsbCBoYXZlIHNpZ25hdHVyZQorICogI0RCVVNfVFlQRV9TVFJJTkdfQVNfU1RSSU5HIGFuZCBjb250YWluIG9ubHkgdGhhdCBzZWNvbmQgc3RyaW5nLgorICoKKyAqIEBwYXJhbSByZWFkZXIgQW4gaXRlcmF0b3Igb3ZlciBtZXNzYWdlIGl0ZW1zLCBwb2ludGluZyB0byBvbmUgaXRlbSB0byBjb3B5CisgKiBAcmV0dXJucyBUaGUgdmFyaWFudCwgb3IgI05VTEwgaWYgb3V0IG9mIG1lbW9yeQorICovCitEQnVzVmFyaWFudCAqCitfZGJ1c192YXJpYW50X3JlYWQgKERCdXNNZXNzYWdlSXRlciAqcmVhZGVyKQoreworICBEQnVzVmFyaWFudCAqc2VsZiA9IE5VTEw7CisgIC8qIFBvaW50cyB0byB0aGUgc2luZ2xlIGl0ZW0gd2Ugd2lsbCByZWFkIGZyb20gdGhlIHJlYWRlciAqLworICBEQnVzTWVzc2FnZVJlYWxJdGVyICpyZWFsX3JlYWRlciA9IChEQnVzTWVzc2FnZVJlYWxJdGVyICopIHJlYWRlcjsKKyAgLyogVGhlIHBvc2l0aW9uIGluIHNlbGYgYXQgd2hpY2ggd2Ugd2lsbCB3cml0ZSBhIHNpbmdsZSB2YXJpYW50CisgICAqIChpdCBpcyBwb3NpdGlvbiAwKSAqLworICBEQnVzVHlwZVdyaXRlciBpdGVtc193cml0ZXI7CisgIC8qIFRoZSBwb3NpdGlvbiBpbiBzZWxmIGF0IHdoaWNoIHdlIHdpbGwgd3JpdGUgYSBjb3B5IG9mIHJlYWRlcgorICAgKiAoaXQgaXMgaW5zaWRlIHRoZSB2YXJpYW50KSAqLworICBEQnVzVHlwZVdyaXRlciB2YXJpYW50X3dyaXRlcjsKKyAgLyogJ3YnICovCisgIERCdXNTdHJpbmcgdmFyaWFudF9zaWduYXR1cmU7CisgIC8qIFdoYXRldmVyIGlzIHRoZSBzaWduYXR1cmUgb2YgdGhlIGl0ZW0gd2Ugd2lsbCBjb3B5IGZyb20gdGhlIHJlYWRlciAqLworICBEQnVzU3RyaW5nIGNvbnRhaW5lZF9zaWduYXR1cmU7CisgIC8qIFRSVUUgaWYgc2VsZi0+ZGF0YSBuZWVkcyB0byBiZSBmcmVlZCAqLworICBkYnVzX2Jvb2xfdCBkYXRhX2luaXRlZCA9IEZBTFNFOworICAvKiBUaGUgdHlwZSBvZiB0aGUgaXRlbSB3ZSB3aWxsIHJlYWQgZnJvbSB0aGUgcmVhZGVyICovCisgIGludCB0eXBlOworICAvKiBUaGUgc3RyaW5nLCBzdGFydCBwb3NpdGlvbiB3aXRoaW4gdGhhdCBzdHJpbmcsIGFuZCBsZW5ndGggb2YgdGhlIHNpZ25hdHVyZQorICAgKiBvZiB0aGUgc2luZ2xlIGNvbXBsZXRlIHR5cGUgb2YgdGhlIGl0ZW0gcmVhZGVyIHBvaW50cyB0byAqLworICBjb25zdCBEQnVzU3RyaW5nICpzaWc7CisgIGludCBzdGFydCwgbGVuOworCisgIF9kYnVzX2Fzc2VydCAoX2RidXNfbWVzc2FnZV9pdGVyX2NoZWNrIChyZWFsX3JlYWRlcikpOworICBfZGJ1c19hc3NlcnQgKHJlYWxfcmVhZGVyLT5pdGVyX3R5cGUgPT0gREJVU19NRVNTQUdFX0lURVJfVFlQRV9SRUFERVIpOworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnZhcmlhbnRfc2lnbmF0dXJlLCBEQlVTX1RZUEVfVkFSSUFOVF9BU19TVFJJTkcpOworICB0eXBlID0gZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2FyZ190eXBlIChyZWFkZXIpOworICBfZGJ1c190eXBlX3JlYWRlcl9nZXRfc2lnbmF0dXJlICgmcmVhbF9yZWFkZXItPnUucmVhZGVyLCAmc2lnLCAmc3RhcnQsICZsZW4pOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZjb250YWluZWRfc2lnbmF0dXJlKSkKKyAgICByZXR1cm4gTlVMTDsKKworICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5X2xlbiAoc2lnLCBzdGFydCwgbGVuLCAmY29udGFpbmVkX3NpZ25hdHVyZSwgMCkpCisgICAgZ290byBvb207CisKKyAgc2VsZiA9IGRidXNfbmV3MCAoREJ1c1ZhcmlhbnQsIDEpOworCisgIGlmIChzZWxmID09IE5VTEwpCisgICAgZ290byBvb207CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnNlbGYtPmRhdGEpKQorICAgIGdvdG8gb29tOworCisgIGRhdGFfaW5pdGVkID0gVFJVRTsKKworICBfZGJ1c190eXBlX3dyaXRlcl9pbml0X3ZhbHVlc19vbmx5ICgmaXRlbXNfd3JpdGVyLCBEQlVTX0NPTVBJTEVSX0JZVEVfT1JERVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YXJpYW50X3NpZ25hdHVyZSwgMCwgJnNlbGYtPmRhdGEsIDApOworCisgIGlmICghX2RidXNfdHlwZV93cml0ZXJfcmVjdXJzZSAoJml0ZW1zX3dyaXRlciwgREJVU19UWVBFX1ZBUklBTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbnRhaW5lZF9zaWduYXR1cmUsIDAsICZ2YXJpYW50X3dyaXRlcikpCisgICAgZ290byBvb207CisKKyAgaWYgKHR5cGUgPT0gREJVU19UWVBFX0FSUkFZKQorICAgIHsKKyAgICAgIC8qIFBvaW50cyB0byBlYWNoIGl0ZW0gaW4gdHVybiBpbnNpZGUgdGhlIGFycmF5IHdlIGFyZSBjb3B5aW5nICovCisgICAgICBEQnVzTWVzc2FnZUl0ZXIgYXJyYXlfcmVhZGVyOworICAgICAgLyogU2FtZSBhcyBhcnJheV9yZWFkZXIgKi8KKyAgICAgIERCdXNNZXNzYWdlUmVhbEl0ZXIgKnJlYWxfYXJyYXlfcmVhZGVyID0gKERCdXNNZXNzYWdlUmVhbEl0ZXIgKikgJmFycmF5X3JlYWRlcjsKKyAgICAgIC8qIFRoZSBwb3NpdGlvbiBpbnNpZGUgdGhlIGNvcGllZCBhcnJheSBhdCB3aGljaCB3ZSB3aWxsIHdyaXRlCisgICAgICAgKiB0aGUgY29weSBvZiBhcnJheV9yZWFkZXIgKi8KKyAgICAgIERCdXNUeXBlV3JpdGVyIGFycmF5X3dyaXRlcjsKKworICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfcmVjdXJzZSAocmVhZGVyLCAmYXJyYXlfcmVhZGVyKTsKKworICAgICAgaWYgKCFfZGJ1c190eXBlX3dyaXRlcl9yZWN1cnNlICgmdmFyaWFudF93cml0ZXIsIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb250YWluZWRfc2lnbmF0dXJlLCAxLCAmYXJyYXlfd3JpdGVyKSkKKyAgICAgICAgZ290byBvb207CisKKyAgICAgIGlmICghX2RidXNfdHlwZV93cml0ZXJfd3JpdGVfcmVhZGVyICgmYXJyYXlfd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWFsX2FycmF5X3JlYWRlci0+dS5yZWFkZXIpKQorICAgICAgICBnb3RvIG9vbTsKKworICAgICAgaWYgKCFfZGJ1c190eXBlX3dyaXRlcl91bnJlY3Vyc2UgKCZ2YXJpYW50X3dyaXRlciwgJmFycmF5X3dyaXRlcikpCisgICAgICAgIGdvdG8gb29tOworICAgIH0KKyAgZWxzZSBpZiAodHlwZSA9PSBEQlVTX1RZUEVfRElDVF9FTlRSWSB8fCB0eXBlID09IERCVVNfVFlQRV9WQVJJQU5UIHx8CisgICAgICAgICAgIHR5cGUgPT0gREJVU19UWVBFX1NUUlVDVCkKKyAgICB7CisgICAgICAvKiBQb2ludHMgdG8gZWFjaCBpdGVtIGluIHR1cm4gaW5zaWRlIHRoZSBjb250YWluZXIgd2UgYXJlIGNvcHlpbmcgKi8KKyAgICAgIERCdXNNZXNzYWdlSXRlciBpbm5lcl9yZWFkZXI7CisgICAgICAvKiBTYW1lIGFzIGlubmVyX3JlYWRlciAqLworICAgICAgREJ1c01lc3NhZ2VSZWFsSXRlciAqcmVhbF9pbm5lcl9yZWFkZXIgPSAoREJ1c01lc3NhZ2VSZWFsSXRlciAqKSAmaW5uZXJfcmVhZGVyOworICAgICAgLyogVGhlIHBvc2l0aW9uIGluc2lkZSB0aGUgY29waWVkIGNvbnRhaW5lciBhdCB3aGljaCB3ZSB3aWxsIHdyaXRlIHRoZQorICAgICAgICogY29weSBvZiBpbm5lcl9yZWFkZXIgKi8KKyAgICAgIERCdXNUeXBlV3JpdGVyIGlubmVyX3dyaXRlcjsKKworICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfcmVjdXJzZSAocmVhZGVyLCAmaW5uZXJfcmVhZGVyKTsKKworICAgICAgaWYgKCFfZGJ1c190eXBlX3dyaXRlcl9yZWN1cnNlICgmdmFyaWFudF93cml0ZXIsIHR5cGUsIE5VTEwsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbm5lcl93cml0ZXIpKQorICAgICAgICBnb3RvIG9vbTsKKworICAgICAgaWYgKCFfZGJ1c190eXBlX3dyaXRlcl93cml0ZV9yZWFkZXIgKCZpbm5lcl93cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlYWxfaW5uZXJfcmVhZGVyLT51LnJlYWRlcikpCisgICAgICAgIGdvdG8gb29tOworCisgICAgICBpZiAoIV9kYnVzX3R5cGVfd3JpdGVyX3VucmVjdXJzZSAoJnZhcmlhbnRfd3JpdGVyLCAmaW5uZXJfd3JpdGVyKSkKKyAgICAgICAgZ290byBvb207CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgREJ1c0Jhc2ljVmFsdWUgdmFsdWU7CisKKyAgICAgIC8qIFdlIGVsaW1pbmF0ZWQgYWxsIHRoZSBjb250YWluZXIgdHlwZXMgYWJvdmUgKi8KKyAgICAgIF9kYnVzX2Fzc2VydCAoZGJ1c190eXBlX2lzX2Jhc2ljICh0eXBlKSk7CisKKyAgICAgIGRidXNfbWVzc2FnZV9pdGVyX2dldF9iYXNpYyAocmVhZGVyLCAmdmFsdWUpOworCisgICAgICBpZiAoIV9kYnVzX3R5cGVfd3JpdGVyX3dyaXRlX2Jhc2ljICgmdmFyaWFudF93cml0ZXIsIHR5cGUsICZ2YWx1ZSkpCisgICAgICAgIGdvdG8gb29tOworICAgIH0KKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmNvbnRhaW5lZF9zaWduYXR1cmUpOworICByZXR1cm4gc2VsZjsKKworb29tOgorICBpZiAoc2VsZiAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChkYXRhX2luaXRlZCkKKyAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZzZWxmLT5kYXRhKTsKKworICAgICAgZGJ1c19mcmVlIChzZWxmKTsKKyAgICB9CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZjb250YWluZWRfc2lnbmF0dXJlKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogUmV0dXJuIHRoZSBzaWduYXR1cmUgb2YgdGhlIGl0ZW0gc3RvcmVkIGluIHNlbGYuIEl0IGlzIGEgc2luZ2xlIGNvbXBsZXRlCisgKiB0eXBlLgorICoKKyAqIEBwYXJhbSBzZWxmIHRoZSB2YXJpYW50CisgKi8KK2NvbnN0IGNoYXIgKgorX2RidXNfdmFyaWFudF9nZXRfc2lnbmF0dXJlIChEQnVzVmFyaWFudCAqc2VsZikKK3sKKyAgdW5zaWduZWQgY2hhciBsZW47CisgIGNvbnN0IGNoYXIgKnJldDsKKworICBfZGJ1c19hc3NlcnQgKHNlbGYgIT0gTlVMTCk7CisKKyAgLyogSGVyZSB3ZSBtYWtlIHVzZSBvZiB0aGUgZmFjdCB0aGF0IHRoZSBzZXJpYWxpemF0aW9uIG9mIGEgdmFyaWFudCBzdGFydHMKKyAgICogd2l0aCB0aGUgMS1ieXRlIGxlbmd0aCwgdGhlbiB0aGF0IG1hbnkgYnl0ZXMgb2Ygc2lnbmF0dXJlLCB0aGVuIFwwLiAqLworICBsZW4gPSBfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKCZzZWxmLT5kYXRhLCAwKTsKKyAgcmV0ID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhX2xlbiAoJnNlbGYtPmRhdGEsIDEsIGxlbik7CisgIF9kYnVzX2Fzc2VydCAoc3RybGVuIChyZXQpID09IGxlbik7CisgIHJldHVybiByZXQ7Cit9CisKKy8qKgorICogQ29weSB0aGUgc2luZ2xlIEQtQnVzIG1lc3NhZ2UgaXRlbSBmcm9tIHNlbGYgaW50byB3cml0ZXIuCisgKgorICogRm9yIGV4YW1wbGUsIGlmIHdyaXRlciBwb2ludHMgaW50byB0aGUgYm9keSBvZiBhbiBlbXB0eSBtZXNzYWdlIGFuZCBzZWxmIGhhcworICogc2lnbmF0dXJlICNEQlVTX1RZUEVfU1RSSU5HX0FTX1NUUklORywgdGhlbiB0aGUgbWVzc2FnZSB3aWxsCisgKiBoYXZlIHNpZ25hdHVyZSAjREJVU19UWVBFX1NUUklOR19BU19TVFJJTkcgYWZ0ZXIgdGhpcyBmdW5jdGlvbiByZXR1cm5zCisgKgorICogQHBhcmFtIHNlbGYgdGhlIHZhcmlhbnQKKyAqIEBwYXJhbSB3cml0ZXIgdGhlIHBsYWNlIHRvIHdyaXRlIHRoZSBjb250ZW50cyBvZiB0aGUgdmFyaWFudAorICogQHJldHVybnMgI1RSVUUgb24gc3VjY2VzcywgI0ZBTFNFIGlmIG91dCBvZiBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3ZhcmlhbnRfd3JpdGUgKERCdXNWYXJpYW50ICpzZWxmLAorICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2VJdGVyICp3cml0ZXIpCit7CisgIC8qICd2JyAqLworICBEQnVzU3RyaW5nIHZhcmlhbnRfc2lnbmF0dXJlOworICAvKiBQb2ludHMgdG8gdGhlIHNpbmdsZSBpdGVtIGluIHNlbGYgKi8KKyAgREJ1c1R5cGVSZWFkZXIgdmFyaWFudF9yZWFkZXI7CisgIC8qIFBvaW50cyB0byB0aGUgc2luZ2xlIGl0ZW0gKG9mIHdoYXRldmVyIHR5cGUpIGluc2lkZSB0aGUgdmFyaWFudCAqLworICBEQnVzVHlwZVJlYWRlciByZWFkZXI7CisgIC8qIFRoZSBwb3NpdGlvbiBhdCB3aGljaCB3ZSB3aWxsIGNvcHkgcmVhZGVyICovCisgIERCdXNNZXNzYWdlUmVhbEl0ZXIgKnJlYWxfd3JpdGVyID0gKERCdXNNZXNzYWdlUmVhbEl0ZXIgKikgd3JpdGVyOworICBkYnVzX2Jvb2xfdCByZXQ7CisKKyAgX2RidXNfYXNzZXJ0IChzZWxmICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfY2hlY2sgKHJlYWxfd3JpdGVyKSk7CisgIF9kYnVzX2Fzc2VydCAocmVhbF93cml0ZXItPml0ZXJfdHlwZSA9PSBEQlVTX01FU1NBR0VfSVRFUl9UWVBFX1dSSVRFUik7CisKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZ2YXJpYW50X3NpZ25hdHVyZSwgREJVU19UWVBFX1ZBUklBTlRfQVNfU1RSSU5HKTsKKyAgX2RidXNfdHlwZV9yZWFkZXJfaW5pdCAoJnJlYWRlciwgREJVU19DT01QSUxFUl9CWVRFX09SREVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFyaWFudF9zaWduYXR1cmUsIDAsICZzZWxmLT5kYXRhLCAwKTsKKyAgX2RidXNfdHlwZV9yZWFkZXJfcmVjdXJzZSAoJnJlYWRlciwgJnZhcmlhbnRfcmVhZGVyKTsKKworICBpZiAoIV9kYnVzX21lc3NhZ2VfaXRlcl9vcGVuX3NpZ25hdHVyZSAocmVhbF93cml0ZXIpKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXQgPSBfZGJ1c190eXBlX3dyaXRlcl93cml0ZV9yZWFkZXIgKCZyZWFsX3dyaXRlci0+dS53cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhcmlhbnRfcmVhZGVyKTsKKworICBpZiAoIV9kYnVzX21lc3NhZ2VfaXRlcl9jbG9zZV9zaWduYXR1cmUgKHJlYWxfd3JpdGVyKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dXJuIHJldDsKK30KKworaW50CitfZGJ1c192YXJpYW50X2dldF9sZW5ndGggKERCdXNWYXJpYW50ICpzZWxmKQoreworICBfZGJ1c19hc3NlcnQgKHNlbGYgIT0gTlVMTCk7CisgIHJldHVybiBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnNlbGYtPmRhdGEpOworfQorCitjb25zdCBEQnVzU3RyaW5nICoKK19kYnVzX3ZhcmlhbnRfcGVlayAoREJ1c1ZhcmlhbnQgKnNlbGYpCit7CisgIF9kYnVzX2Fzc2VydCAoc2VsZiAhPSBOVUxMKTsKKyAgcmV0dXJuICZzZWxmLT5kYXRhOworfQorCit2b2lkCitfZGJ1c192YXJpYW50X2ZyZWUgKERCdXNWYXJpYW50ICpzZWxmKQoreworICBfZGJ1c19hc3NlcnQgKHNlbGYgIT0gTlVMTCk7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmc2VsZi0+ZGF0YSk7CisgIGRidXNfZnJlZSAoc2VsZik7Cit9CisKKy8qKiBAfSAqLworCisvKiB0ZXN0cyBpbiBkYnVzLW1lc3NhZ2UtdXRpbC5jICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtbWVzc2FnZS5oIGIvZGJ1cy9kYnVzLW1lc3NhZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTlkNTdhCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLW1lc3NhZ2UuaApAQCAtMCwwICsxLDM3NyBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLW1lc3NhZ2UuaCBEQnVzTWVzc2FnZSBvYmplY3QKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMsIDIwMDUgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaWYgIWRlZmluZWQgKERCVVNfSU5TSURFX0RCVVNfSCkgJiYgIWRlZmluZWQgKERCVVNfQ09NUElMQVRJT04pCisjZXJyb3IgIk9ubHkgPGRidXMvZGJ1cy5oPiBjYW4gYmUgaW5jbHVkZWQgZGlyZWN0bHksIHRoaXMgZmlsZSBtYXkgZGlzYXBwZWFyIG9yIGNoYW5nZSBjb250ZW50cy4iCisjZW5kaWYKKworI2lmbmRlZiBEQlVTX01FU1NBR0VfSAorI2RlZmluZSBEQlVTX01FU1NBR0VfSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLW1hY3Jvcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy10eXBlcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1hcmNoLWRlcHMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbWVtb3J5Lmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWVycm9ycy5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorCitEQlVTX0JFR0lOX0RFQ0xTCisKKy8qKgorICogQGFkZHRvZ3JvdXAgREJ1c01lc3NhZ2UKKyAqIEB7CisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgREJ1c01lc3NhZ2UgREJ1c01lc3NhZ2U7CisvKioKKyAqIE9wYXF1ZSB0eXBlIHJlcHJlc2VudGluZyBhIG1lc3NhZ2UgaXRlcmF0b3IuIENhbiBiZSBjb3BpZWQgYnkgdmFsdWUgYW5kCisgKiBhbGxvY2F0ZWQgb24gdGhlIHN0YWNrLgorICoKKyAqIEEgREJ1c01lc3NhZ2VJdGVyIHVzdWFsbHkgY29udGFpbnMgbm8gYWxsb2NhdGVkIG1lbW9yeS4gSG93ZXZlciwgdGhlcmUKKyAqIGlzIG9uZSBzcGVjaWFsIGNhc2U6IGFmdGVyIGEgc3VjY2Vzc2Z1bCBjYWxsIHRvCisgKiBkYnVzX21lc3NhZ2VfaXRlcl9vcGVuX2NvbnRhaW5lcigpLCB0aGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBjYWxsaW5nCisgKiBlaXRoZXIgZGJ1c19tZXNzYWdlX2l0ZXJfY2xvc2VfY29udGFpbmVyKCkgb3IKKyAqIGRidXNfbWVzc2FnZV9pdGVyX2FiYW5kb25fY29udGFpbmVyKCkgZXhhY3RseSBvbmNlLCB3aXRoIHRoZSBzYW1lIHBhaXIKKyAqIG9mIGl0ZXJhdG9ycy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgREJ1c01lc3NhZ2VJdGVyIERCdXNNZXNzYWdlSXRlcjsKKworLyoqCisgKiBEQnVzTWVzc2FnZUl0ZXIgc3RydWN0OyBjb250YWlucyBubyBwdWJsaWMgZmllbGRzLiAKKyAqLworc3RydWN0IERCdXNNZXNzYWdlSXRlcgoreyAKKyAgdm9pZCAqZHVtbXkxOyAgICAgICAgIC8qKjwgRG9uJ3QgdXNlIHRoaXMgKi8KKyAgdm9pZCAqZHVtbXkyOyAgICAgICAgIC8qKjwgRG9uJ3QgdXNlIHRoaXMgKi8KKyAgZGJ1c191aW50MzJfdCBkdW1teTM7IC8qKjwgRG9uJ3QgdXNlIHRoaXMgKi8KKyAgaW50IGR1bW15NDsgICAgICAgICAgIC8qKjwgRG9uJ3QgdXNlIHRoaXMgKi8KKyAgaW50IGR1bW15NTsgICAgICAgICAgIC8qKjwgRG9uJ3QgdXNlIHRoaXMgKi8KKyAgaW50IGR1bW15NjsgICAgICAgICAgIC8qKjwgRG9uJ3QgdXNlIHRoaXMgKi8KKyAgaW50IGR1bW15NzsgICAgICAgICAgIC8qKjwgRG9uJ3QgdXNlIHRoaXMgKi8KKyAgaW50IGR1bW15ODsgICAgICAgICAgIC8qKjwgRG9uJ3QgdXNlIHRoaXMgKi8KKyAgaW50IGR1bW15OTsgICAgICAgICAgIC8qKjwgRG9uJ3QgdXNlIHRoaXMgKi8KKyAgaW50IGR1bW15MTA7ICAgICAgICAgIC8qKjwgRG9uJ3QgdXNlIHRoaXMgKi8KKyAgaW50IGR1bW15MTE7ICAgICAgICAgIC8qKjwgRG9uJ3QgdXNlIHRoaXMgKi8KKyAgaW50IHBhZDE7ICAgICAgICAgICAgIC8qKjwgRG9uJ3QgdXNlIHRoaXMgKi8KKyAgdm9pZCAqcGFkMjsgICAgICAgICAgIC8qKjwgRG9uJ3QgdXNlIHRoaXMgKi8KKyAgdm9pZCAqcGFkMzsgICAgICAgICAgIC8qKjwgRG9uJ3QgdXNlIHRoaXMgKi8KK307CisKKy8qKgorICogQSBtZXNzYWdlIGl0ZXJhdG9yIGZvciB3aGljaCBkYnVzX21lc3NhZ2VfaXRlcl9hYmFuZG9uX2NvbnRhaW5lcl9pZl9vcGVuKCkKKyAqIGlzIHRoZSBvbmx5IHZhbGlkIG9wZXJhdGlvbi4KKyAqLworI2RlZmluZSBEQlVTX01FU1NBR0VfSVRFUl9JTklUX0NMT1NFRCBcCit7IFwKKyAgTlVMTCwgLyogZHVtbXkxICovIFwKKyAgTlVMTCwgLyogZHVtbXkyICovIFwKKyAgMCwgLyogZHVtbXkzICovIFwKKyAgMCwgLyogZHVtbXk0ICovIFwKKyAgMCwgLyogZHVtbXk1ICovIFwKKyAgMCwgLyogZHVtbXk2ICovIFwKKyAgMCwgLyogZHVtbXk3ICovIFwKKyAgMCwgLyogZHVtbXk4ICovIFwKKyAgMCwgLyogZHVtbXk5ICovIFwKKyAgMCwgLyogZHVtbXkxMCAqLyBcCisgIDAsIC8qIGR1bW15MTEgKi8gXAorICAwLCAvKiBwYWQxICovIFwKKyAgTlVMTCwgLyogcGFkMiAqLyBcCisgIE5VTEwgLyogcGFkMyAqLyBcCit9CisKK0RCVVNfRVhQT1JUCitEQnVzTWVzc2FnZSogZGJ1c19tZXNzYWdlX25ldyAgICAgICAgICAgICAgIChpbnQgICAgICAgICAgbWVzc2FnZV90eXBlKTsKK0RCVVNfRVhQT1JUCitEQnVzTWVzc2FnZSogZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAgIChjb25zdCBjaGFyICAqYnVzX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAqcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICptZXRob2QpOworREJVU19FWFBPUlQKK0RCdXNNZXNzYWdlKiBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9yZXR1cm4gKERCdXNNZXNzYWdlICptZXRob2RfY2FsbCk7CitEQlVTX0VYUE9SVAorREJ1c01lc3NhZ2UqIGRidXNfbWVzc2FnZV9uZXdfc2lnbmFsICAgICAgICAoY29uc3QgY2hhciAgKnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAqbmFtZSk7CitEQlVTX0VYUE9SVAorREJ1c01lc3NhZ2UqIGRidXNfbWVzc2FnZV9uZXdfZXJyb3IgICAgICAgICAoREJ1c01lc3NhZ2UgKnJlcGx5X3RvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgKmVycm9yX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAqZXJyb3JfbWVzc2FnZSk7CitEQlVTX0VYUE9SVAorREJ1c01lc3NhZ2UqIGRidXNfbWVzc2FnZV9uZXdfZXJyb3JfcHJpbnRmICAoREJ1c01lc3NhZ2UgKnJlcGx5X3RvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgKmVycm9yX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAqZXJyb3JfZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKSBfREJVU19HTlVDX1BSSU5URiAoMywgNCk7CisKK0RCVVNfRVhQT1JUCitEQnVzTWVzc2FnZSogZGJ1c19tZXNzYWdlX2NvcHkgICAgICAgICAgICAgIChjb25zdCBEQnVzTWVzc2FnZSAqbWVzc2FnZSk7CisKK0RCVVNfRVhQT1JUCitEQnVzTWVzc2FnZSogIGRidXNfbWVzc2FnZV9yZWYgICAgICAgICAgICAgIChEQnVzTWVzc2FnZSAgICptZXNzYWdlKTsKK0RCVVNfRVhQT1JUCit2b2lkICAgICAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAgICAgICAgICAgIChEQnVzTWVzc2FnZSAgICptZXNzYWdlKTsKK0RCVVNfRVhQT1JUCitpbnQgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfdHlwZSAgICAgICAgIChEQnVzTWVzc2FnZSAgICptZXNzYWdlKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCAgIGRidXNfbWVzc2FnZV9zZXRfcGF0aCAgICAgICAgIChEQnVzTWVzc2FnZSAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAqb2JqZWN0X3BhdGgpOworREJVU19FWFBPUlQKK2NvbnN0IGNoYXIqICAgZGJ1c19tZXNzYWdlX2dldF9wYXRoICAgICAgICAgKERCdXNNZXNzYWdlICAgKm1lc3NhZ2UpOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90ICAgZGJ1c19tZXNzYWdlX2hhc19wYXRoICAgICAgICAgKERCdXNNZXNzYWdlICAgKm1lc3NhZ2UsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAqb2JqZWN0X3BhdGgpOyAgCitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgICBkYnVzX21lc3NhZ2Vfc2V0X2ludGVyZmFjZSAgICAoREJ1c01lc3NhZ2UgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgKmlmYWNlKTsKK0RCVVNfRVhQT1JUCitjb25zdCBjaGFyKiAgIGRidXNfbWVzc2FnZV9nZXRfaW50ZXJmYWNlICAgIChEQnVzTWVzc2FnZSAgICptZXNzYWdlKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCAgIGRidXNfbWVzc2FnZV9oYXNfaW50ZXJmYWNlICAgIChEQnVzTWVzc2FnZSAgICptZXNzYWdlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgKmlmYWNlKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCAgIGRidXNfbWVzc2FnZV9zZXRfbWVtYmVyICAgICAgIChEQnVzTWVzc2FnZSAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAqbWVtYmVyKTsKK0RCVVNfRVhQT1JUCitjb25zdCBjaGFyKiAgIGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyICAgICAgIChEQnVzTWVzc2FnZSAgICptZXNzYWdlKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCAgIGRidXNfbWVzc2FnZV9oYXNfbWVtYmVyICAgICAgIChEQnVzTWVzc2FnZSAgICptZXNzYWdlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgKm1lbWJlcik7CitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgICBkYnVzX21lc3NhZ2Vfc2V0X2Vycm9yX25hbWUgICAoREJ1c01lc3NhZ2UgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgKm5hbWUpOworREJVU19FWFBPUlQKK2NvbnN0IGNoYXIqICAgZGJ1c19tZXNzYWdlX2dldF9lcnJvcl9uYW1lICAgKERCdXNNZXNzYWdlICAgKm1lc3NhZ2UpOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90ICAgZGJ1c19tZXNzYWdlX3NldF9kZXN0aW5hdGlvbiAgKERCdXNNZXNzYWdlICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICpkZXN0aW5hdGlvbik7CitEQlVTX0VYUE9SVAorY29uc3QgY2hhciogICBkYnVzX21lc3NhZ2VfZ2V0X2Rlc3RpbmF0aW9uICAoREJ1c01lc3NhZ2UgICAqbWVzc2FnZSk7CitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgICBkYnVzX21lc3NhZ2Vfc2V0X3NlbmRlciAgICAgICAoREJ1c01lc3NhZ2UgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgKnNlbmRlcik7CitEQlVTX0VYUE9SVAorY29uc3QgY2hhciogICBkYnVzX21lc3NhZ2VfZ2V0X3NlbmRlciAgICAgICAoREJ1c01lc3NhZ2UgICAqbWVzc2FnZSk7CitEQlVTX0VYUE9SVAorY29uc3QgY2hhciogICBkYnVzX21lc3NhZ2VfZ2V0X3NpZ25hdHVyZSAgICAoREJ1c01lc3NhZ2UgICAqbWVzc2FnZSk7CitEQlVTX0VYUE9SVAordm9pZCAgICAgICAgICBkYnVzX21lc3NhZ2Vfc2V0X25vX3JlcGx5ICAgICAoREJ1c01lc3NhZ2UgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgIG5vX3JlcGx5KTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCAgIGRidXNfbWVzc2FnZV9nZXRfbm9fcmVwbHkgICAgIChEQnVzTWVzc2FnZSAgICptZXNzYWdlKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCAgIGRidXNfbWVzc2FnZV9pc19tZXRob2RfY2FsbCAgIChEQnVzTWVzc2FnZSAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICptZXRob2QpOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90ICAgZGJ1c19tZXNzYWdlX2lzX3NpZ25hbCAgICAgICAgKERCdXNNZXNzYWdlICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgKnNpZ25hbF9uYW1lKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCAgIGRidXNfbWVzc2FnZV9pc19lcnJvciAgICAgICAgIChEQnVzTWVzc2FnZSAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAqZXJyb3JfbmFtZSk7CitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgICBkYnVzX21lc3NhZ2VfaGFzX2Rlc3RpbmF0aW9uICAoREJ1c01lc3NhZ2UgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgKmJ1c19uYW1lKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCAgIGRidXNfbWVzc2FnZV9oYXNfc2VuZGVyICAgICAgIChEQnVzTWVzc2FnZSAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAqdW5pcXVlX2J1c19uYW1lKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCAgIGRidXNfbWVzc2FnZV9oYXNfc2lnbmF0dXJlICAgIChEQnVzTWVzc2FnZSAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAqc2lnbmF0dXJlKTsKK0RCVVNfRVhQT1JUCitkYnVzX3VpbnQzMl90IGRidXNfbWVzc2FnZV9nZXRfc2VyaWFsICAgICAgIChEQnVzTWVzc2FnZSAgICptZXNzYWdlKTsKK0RCVVNfRVhQT1JUCit2b2lkICAgICAgICAgIGRidXNfbWVzc2FnZV9zZXRfc2VyaWFsICAgICAgIChEQnVzTWVzc2FnZSAgICptZXNzYWdlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgIHNlcmlhbCk7CitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgICBkYnVzX21lc3NhZ2Vfc2V0X3JlcGx5X3NlcmlhbCAoREJ1c01lc3NhZ2UgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgIHJlcGx5X3NlcmlhbCk7CitEQlVTX0VYUE9SVAorZGJ1c191aW50MzJfdCBkYnVzX21lc3NhZ2VfZ2V0X3JlcGx5X3NlcmlhbCAoREJ1c01lc3NhZ2UgICAqbWVzc2FnZSk7CisKK0RCVVNfRVhQT1JUCit2b2lkICAgICAgICAgIGRidXNfbWVzc2FnZV9zZXRfYXV0b19zdGFydCAgIChEQnVzTWVzc2FnZSAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgYXV0b19zdGFydCk7CitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgICBkYnVzX21lc3NhZ2VfZ2V0X2F1dG9fc3RhcnQgICAoREJ1c01lc3NhZ2UgICAqbWVzc2FnZSk7CisKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCAgIGRidXNfbWVzc2FnZV9nZXRfcGF0aF9kZWNvbXBvc2VkIChEQnVzTWVzc2FnZSAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAgKioqcGF0aCk7CisKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCBkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgICAgICAgICAgKERCdXNNZXNzYWdlICAgICAqbWVzc2FnZSwKKwkJCQkJICAgICAgIGludCAgICAgICAgICAgICAgZmlyc3RfYXJnX3R5cGUsCisJCQkJCSAgICAgICAuLi4pOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90IGRidXNfbWVzc2FnZV9hcHBlbmRfYXJnc192YWxpc3QgICAoREJ1c01lc3NhZ2UgICAgICptZXNzYWdlLAorCQkJCQkgICAgICAgaW50ICAgICAgICAgICAgICBmaXJzdF9hcmdfdHlwZSwKKwkJCQkJICAgICAgIHZhX2xpc3QgICAgICAgICAgdmFyX2FyZ3MpOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90IGRidXNfbWVzc2FnZV9nZXRfYXJncyAgICAgICAgICAgICAoREJ1c01lc3NhZ2UgICAgICptZXNzYWdlLAorCQkJCQkgICAgICAgREJ1c0Vycm9yICAgICAgICplcnJvciwKKwkJCQkJICAgICAgIGludCAgICAgICAgICAgICAgZmlyc3RfYXJnX3R5cGUsCisJCQkJCSAgICAgICAuLi4pOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90IGRidXNfbWVzc2FnZV9nZXRfYXJnc192YWxpc3QgICAgICAoREJ1c01lc3NhZ2UgICAgICptZXNzYWdlLAorCQkJCQkgICAgICAgREJ1c0Vycm9yICAgICAgICplcnJvciwKKwkJCQkJICAgICAgIGludCAgICAgICAgICAgICAgZmlyc3RfYXJnX3R5cGUsCisJCQkJCSAgICAgICB2YV9saXN0ICAgICAgICAgIHZhcl9hcmdzKTsKKworREJVU19FWFBPUlQKK2RidXNfYm9vbF90IGRidXNfbWVzc2FnZV9jb250YWluc191bml4X2ZkcyAgICAoREJ1c01lc3NhZ2UgKm1lc3NhZ2UpOworCitEQlVTX0VYUE9SVAordm9pZCAgICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfaW5pdF9jbG9zZWQgICAgICAgIChEQnVzTWVzc2FnZUl0ZXIgKml0ZXIpOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90IGRidXNfbWVzc2FnZV9pdGVyX2luaXQgICAgICAgICAgICAgKERCdXNNZXNzYWdlICAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlSXRlciAqaXRlcik7CitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgZGJ1c19tZXNzYWdlX2l0ZXJfaGFzX25leHQgICAgICAgICAoREJ1c01lc3NhZ2VJdGVyICppdGVyKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCBkYnVzX21lc3NhZ2VfaXRlcl9uZXh0ICAgICAgICAgICAgIChEQnVzTWVzc2FnZUl0ZXIgKml0ZXIpOworREJVU19FWFBPUlQKK2NoYXIqICAgICAgIGRidXNfbWVzc2FnZV9pdGVyX2dldF9zaWduYXR1cmUgICAgKERCdXNNZXNzYWdlSXRlciAqaXRlcik7CitEQlVTX0VYUE9SVAoraW50ICAgICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2FyZ190eXBlICAgICAoREJ1c01lc3NhZ2VJdGVyICppdGVyKTsKK0RCVVNfRVhQT1JUCitpbnQgICAgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfZWxlbWVudF90eXBlIChEQnVzTWVzc2FnZUl0ZXIgKml0ZXIpOworREJVU19FWFBPUlQKK3ZvaWQgICAgICAgIGRidXNfbWVzc2FnZV9pdGVyX3JlY3Vyc2UgICAgICAgICAgKERCdXNNZXNzYWdlSXRlciAqaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlSXRlciAqc3ViKTsKK0RCVVNfRVhQT1JUCit2b2lkICAgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYmFzaWMgICAgICAgIChEQnVzTWVzc2FnZUl0ZXIgKml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgKnZhbHVlKTsKK0RCVVNfRVhQT1JUCitpbnQgICAgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfZWxlbWVudF9jb3VudChEQnVzTWVzc2FnZUl0ZXIgKml0ZXIpOworCisjaWZuZGVmIERCVVNfRElTQUJMRV9ERVBSRUNBVEVECisvKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHdpcmUgcHJvdG9jb2wgc2l6ZSBvZiB0aGUgYXJyYXkgaW4gYnl0ZXMsCisgKiB5b3UgZG8gbm90IHdhbnQgdG8ga25vdyB0aGF0IHByb2JhYmx5CisgKi8KK0RCVVNfRVhQT1JUCitEQlVTX0RFUFJFQ0FURUQgaW50ICAgICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2FycmF5X2xlbiAgICAoREJ1c01lc3NhZ2VJdGVyICppdGVyKTsKKyNlbmRpZgorREJVU19FWFBPUlQKK3ZvaWQgICAgICAgIGRidXNfbWVzc2FnZV9pdGVyX2dldF9maXhlZF9hcnJheSAgKERCdXNNZXNzYWdlSXRlciAqaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgKm5fZWxlbWVudHMpOworCisKK0RCVVNfRVhQT1JUCit2b2lkICAgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9pbml0X2FwcGVuZCAgICAgICAgKERCdXNNZXNzYWdlICAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2VJdGVyICppdGVyKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCBkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfYmFzaWMgICAgICAgKERCdXNNZXNzYWdlSXRlciAqaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICAgICAgKnZhbHVlKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCBkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfZml4ZWRfYXJyYXkgKERCdXNNZXNzYWdlSXRlciAqaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICBlbGVtZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgICAgICAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgbl9lbGVtZW50cyk7CitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgZGJ1c19tZXNzYWdlX2l0ZXJfb3Blbl9jb250YWluZXIgICAgIChEQnVzTWVzc2FnZUl0ZXIgKml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICpjb250YWluZWRfc2lnbmF0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZUl0ZXIgKnN1Yik7CitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgZGJ1c19tZXNzYWdlX2l0ZXJfY2xvc2VfY29udGFpbmVyICAgIChEQnVzTWVzc2FnZUl0ZXIgKml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlSXRlciAqc3ViKTsKK0RCVVNfRVhQT1JUCit2b2lkICAgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9hYmFuZG9uX2NvbnRhaW5lciAgKERCdXNNZXNzYWdlSXRlciAqaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2VJdGVyICpzdWIpOworCitEQlVTX0VYUE9SVAordm9pZCAgICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfYWJhbmRvbl9jb250YWluZXJfaWZfb3BlbiAoREJ1c01lc3NhZ2VJdGVyICppdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2VJdGVyICpzdWIpOworCitEQlVTX0VYUE9SVAordm9pZCBkYnVzX21lc3NhZ2VfbG9jayAgICAoREJ1c01lc3NhZ2UgICptZXNzYWdlKTsKKworREJVU19FWFBPUlQKK2RidXNfYm9vbF90ICBkYnVzX3NldF9lcnJvcl9mcm9tX21lc3NhZ2UgIChEQnVzRXJyb3IgICAgKmVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAqbWVzc2FnZSk7CisKKworREJVU19FWFBPUlQKK2RidXNfYm9vbF90IGRidXNfbWVzc2FnZV9hbGxvY2F0ZV9kYXRhX3Nsb3QgKGRidXNfaW50MzJfdCAgICAgKnNsb3RfcCk7CitEQlVTX0VYUE9SVAordm9pZCAgICAgICAgZGJ1c19tZXNzYWdlX2ZyZWVfZGF0YV9zbG90ICAgICAoZGJ1c19pbnQzMl90ICAgICAqc2xvdF9wKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCBkYnVzX21lc3NhZ2Vfc2V0X2RhdGEgICAgICAgICAgIChEQnVzTWVzc2FnZSAgICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19pbnQzMl90ICAgICAgc2xvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRnJlZUZ1bmN0aW9uICBmcmVlX2RhdGFfZnVuYyk7CitEQlVTX0VYUE9SVAordm9pZCogICAgICAgZGJ1c19tZXNzYWdlX2dldF9kYXRhICAgICAgICAgICAoREJ1c01lc3NhZ2UgICAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfaW50MzJfdCAgICAgIHNsb3QpOworCitEQlVTX0VYUE9SVAoraW50ICAgICAgICAgZGJ1c19tZXNzYWdlX3R5cGVfZnJvbV9zdHJpbmcgKGNvbnN0IGNoYXIgKnR5cGVfc3RyKTsKK0RCVVNfRVhQT1JUCitjb25zdCBjaGFyKiBkYnVzX21lc3NhZ2VfdHlwZV90b19zdHJpbmcgICAoaW50IHR5cGUpOworCitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgIGRidXNfbWVzc2FnZV9tYXJzaGFsICAgKERCdXNNZXNzYWdlICAqbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICoqbWFyc2hhbGxlZF9kYXRhX3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICpsZW5fcCk7CitEQlVTX0VYUE9SVAorREJ1c01lc3NhZ2UqIGRidXNfbWVzc2FnZV9kZW1hcnNoYWwgKGNvbnN0IGNoYXIgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAqZXJyb3IpOworCitEQlVTX0VYUE9SVAoraW50ICAgICAgICAgIGRidXNfbWVzc2FnZV9kZW1hcnNoYWxfYnl0ZXNfbmVlZGVkIChjb25zdCBjaGFyICpzdHIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuKTsKKworREJVU19FWFBPUlQKK3ZvaWQgZGJ1c19tZXNzYWdlX3NldF9hbGxvd19pbnRlcmFjdGl2ZV9hdXRob3JpemF0aW9uIChEQnVzTWVzc2FnZSAqbWVzc2FnZSwKKyAgICBkYnVzX2Jvb2xfdCBhbGxvdyk7CisKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCBkYnVzX21lc3NhZ2VfZ2V0X2FsbG93X2ludGVyYWN0aXZlX2F1dGhvcml6YXRpb24gKAorICAgIERCdXNNZXNzYWdlICptZXNzYWdlKTsKKworLyoqCisgKiBDbGVhciBhIHZhcmlhYmxlIG9yIHN0cnVjdCBtZW1iZXIgdGhhdCBjb250YWlucyBhICNEQnVzTWVzc2FnZS4KKyAqIElmIGl0IGRvZXMgbm90IGNvbnRhaW4gI05VTEwsIHRoZSBtZXNzYWdlIHRoYXQgd2FzIHByZXZpb3VzbHkKKyAqIHRoZXJlIGlzIHVucmVmZXJlbmNlZCB3aXRoIGRidXNfbWVzc2FnZV91bnJlZigpLgorICoKKyAqIFRoaXMgaXMgdmVyeSBzaW1pbGFyIHRvIGRidXNfY2xlYXJfY29ubmVjdGlvbigpOiBzZWUgdGhhdCBmdW5jdGlvbgorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBAcGFyYW0gcG9pbnRlcl90b19tZXNzYWdlIEEgcG9pbnRlciB0byBhIHZhcmlhYmxlIG9yIHN0cnVjdCBtZW1iZXIuCisgKiBwb2ludGVyX3RvX21lc3NhZ2UgbXVzdCBub3QgYmUgI05VTEwsIGJ1dCAqcG9pbnRlcl90b19tZXNzYWdlCisgKiBtYXkgYmUgI05VTEwuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorZGJ1c19jbGVhcl9tZXNzYWdlIChEQnVzTWVzc2FnZSAqKnBvaW50ZXJfdG9fbWVzc2FnZSkKK3sKKyAgX2RidXNfY2xlYXJfcG9pbnRlcl9pbXBsIChEQnVzTWVzc2FnZSwgcG9pbnRlcl90b19tZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV91bnJlZik7Cit9CisKKy8qKiBAfSAqLworCitEQlVTX0VORF9ERUNMUworCisjZW5kaWYgLyogREJVU19NRVNTQUdFX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1taXNjLmMgYi9kYnVzL2RidXMtbWlzYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiZTU4YTIKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtbWlzYy5jCkBAIC0wLDAgKzEsMjk3IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtbWlzYy5jICBBIGZldyBhc3NvcnRlZCBwdWJsaWMgZnVuY3Rpb25zIHRoYXQgZG9uJ3QgZml0IGVsc2V3aGVyZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLW1pc2MuaCIKKyNpbmNsdWRlICJkYnVzLWludGVybmFscy5oIgorI2luY2x1ZGUgImRidXMtc3RyaW5nLmgiCisKKy8qKgorICogQGRlZmdyb3VwIERCdXNNaXNjIE1pc2NlbGxhbmVvdXMKKyAqIEBpbmdyb3VwICBEQnVzCisgKiBAYnJpZWYgTWlzY2VsbGFuZW91cyBBUEkgdGhhdCBkb2Vzbid0IGNsZWFubHkgZml0IGFueXdoZXJlIGVsc2UKKyAqCisgKiBAeworICovCisKKy8qKgorICogT2J0YWlucyB0aGUgbWFjaGluZSBVVUlEIG9mIHRoZSBtYWNoaW5lIHRoaXMgcHJvY2VzcyBpcyBydW5uaW5nIG9uLgorICoKKyAqIFRoZSByZXR1cm5lZCBzdHJpbmcgbXVzdCBiZSBmcmVlZCB3aXRoIGRidXNfZnJlZSgpLgorICogCisgKiBUaGlzIFVVSUQgaXMgZ3VhcmFudGVlZCB0byByZW1haW4gdGhlIHNhbWUgdW50aWwgdGhlIG5leHQgcmVib290CisgKiAodW5sZXNzIHRoZSBzeXNhZG1pbiBmb29saXNobHkgY2hhbmdlcyBpdCBhbmQgc2NyZXdzIHRoZW1zZWx2ZXMpLgorICogSXQgd2lsbCB1c3VhbGx5IHJlbWFpbiB0aGUgc2FtZSBhY3Jvc3MgcmVib290cyBhbHNvLCBidXQgaGFyZHdhcmUKKyAqIGNvbmZpZ3VyYXRpb24gY2hhbmdlcyBvciByZWJ1aWxkaW5nIHRoZSBtYWNoaW5lIGNvdWxkIGJyZWFrIHRoYXQuCisgKgorICogVGhlIGlkZWEgaXMgdGhhdCB0d28gcHJvY2Vzc2VzIHdpdGggdGhlIHNhbWUgbWFjaGluZSBJRCBzaG91bGQgYmUKKyAqIGFibGUgdG8gdXNlIHNoYXJlZCBtZW1vcnksIFVOSVggZG9tYWluIHNvY2tldHMsIHByb2Nlc3MgSURzLCBhbmQgb3RoZXIKKyAqIGZlYXR1cmVzIG9mIHRoZSBPUyB0aGF0IHJlcXVpcmUgYm90aCBwcm9jZXNzZXMgdG8gYmUgcnVubmluZworICogb24gdGhlIHNhbWUgT1Mga2VybmVsIGluc3RhbmNlLgorICoKKyAqIFRoZSBtYWNoaW5lIElEIGNhbiBhbHNvIGJlIHVzZWQgdG8gY3JlYXRlIHVuaXF1ZSBwZXItbWFjaGluZQorICogaW5zdGFuY2VzLiBGb3IgZXhhbXBsZSwgeW91IGNvdWxkIHVzZSBpdCBpbiBidXMgbmFtZXMgb3IKKyAqIFggc2VsZWN0aW9uIG5hbWVzLgorICoKKyAqIFRoZSBtYWNoaW5lIElEIGlzIHByZWZlcnJlZCBvdmVyIHRoZSBtYWNoaW5lIGhvc3RuYW1lLCBiZWNhdXNlCisgKiB0aGUgaG9zdG5hbWUgaXMgZnJlcXVlbnRseSBzZXQgdG8gImxvY2FsaG9zdC5sb2NhbGRvbWFpbiIgYW5kCisgKiBtYXkgYWxzbyBjaGFuZ2UgYXQgcnVudGltZS4KKyAqCisgKiBZb3UgY2FuIGdldCB0aGUgbWFjaGluZSBJRCBvZiBhIHJlbW90ZSBhcHBsaWNhdGlvbiBieSBpbnZva2luZyB0aGUKKyAqIG1ldGhvZCBHZXRNYWNoaW5lSWQgZnJvbSBpbnRlcmZhY2Ugb3JnLmZyZWVkZXNrdG9wLkRCdXMuUGVlci4KKyAqCisgKiBJZiB0aGUgcmVtb3RlIGFwcGxpY2F0aW9uIGhhcyB0aGUgc2FtZSBtYWNoaW5lIElEIGFzIHRoZSBvbmUKKyAqIHJldHVybmVkIGJ5IHRoaXMgZnVuY3Rpb24sIHRoZW4gdGhlIHJlbW90ZSBhcHBsaWNhdGlvbiBpcyBvbiB0aGUKKyAqIHNhbWUgbWFjaGluZSBhcyB5b3VyIGFwcGxpY2F0aW9uLgorICoKKyAqIFRoZSBVVUlEIGlzIG5vdCBhIFVVSUQgaW4gdGhlIHNlbnNlIG9mIFJGQzQxMjI7IHRoZSBkZXRhaWxzCisgKiBhcmUgZXhwbGFpbmVkIGluIHRoZSBELUJ1cyBzcGVjaWZpY2F0aW9uLgorICoKKyAqIEByZXR1cm5zIGEgMzItYnl0ZS1sb25nIGhleC1lbmNvZGVkIFVVSUQgc3RyaW5nLCBvciAjTlVMTCBvbiBmYWlsdXJlCisgKi8KK2NoYXIgKgorZGJ1c190cnlfZ2V0X2xvY2FsX21hY2hpbmVfaWQgKERCdXNFcnJvciAqZXJyb3IpCit7CisgIERCdXNTdHJpbmcgdXVpZDsKKyAgY2hhciAqczsKKworICBzID0gTlVMTDsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmdXVpZCkpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19nZXRfbG9jYWxfbWFjaGluZV91dWlkX2VuY29kZWQgKCZ1dWlkLCBlcnJvcikpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ1dWlkKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19zdGVhbF9kYXRhICgmdXVpZCwgJnMpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ1dWlkKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmdXVpZCk7CisgICAgICByZXR1cm4gczsKKyAgICB9CisKK30KKworLyoqCisgKiBPYnRhaW5zIHRoZSBtYWNoaW5lIFVVSUQgb2YgdGhlIG1hY2hpbmUgdGhpcyBwcm9jZXNzIGlzIHJ1bm5pbmcgb24uCisgKgorICogVGhlIHJldHVybmVkIHN0cmluZyBtdXN0IGJlIGZyZWVkIHdpdGggZGJ1c19mcmVlKCkuCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zICNOVUxMIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoIG1lbW9yeSB0byByZWFkCisgKiB0aGUgVVVJRCwgb3IgaWYgdGhlIFVVSUQgY291bGQgbm90IGJlIHJlYWQgYmVjYXVzZSB0aGUgRC1CdXMKKyAqIGxpYnJhcnkgd2FzIGluc3RhbGxlZCBpbmNvcnJlY3RseS4gSW4gdGhlIGxhdHRlciBjYXNlLCBhIHdhcm5pbmcKKyAqIGlzIGxvZ2dlZC4KKyAqCisgKiBPdGhlciB0aGFuIGl0cyBkZWZpY2llbnQgZXJyb3IgcmVwb3J0aW5nLCB0aGlzIGZ1bmN0aW9uIGlzIHRoZSBzYW1lIGFzCisgKiBkYnVzX3RyeV9nZXRfbG9jYWxfbWFjaGluZV9pZCgpLgorICoKKyAqIEByZXR1cm5zIGEgMzItYnl0ZS1sb25nIGhleC1lbmNvZGVkIFVVSUQgc3RyaW5nLCBvciAjTlVMTCBvbiBmYWlsdXJlCisgKi8KK2NoYXIgKgorZGJ1c19nZXRfbG9jYWxfbWFjaGluZV9pZCAodm9pZCkKK3sKKyAgREJ1c0Vycm9yIGVycm9yID0gREJVU19FUlJPUl9JTklUOworICBjaGFyICpzOworCisgIHMgPSBkYnVzX3RyeV9nZXRfbG9jYWxfbWFjaGluZV9pZCAoJmVycm9yKTsKKworICAvKiBUaGUgZG9jdW1lbnRhdGlvbiBzYXlzIGRidXNfZ2V0X2xvY2FsX21hY2hpbmVfaWQoKSBvbmx5IGZhaWxzIG9uIE9PTTsKKyAgICogdGhpcyBjYW4gYWN0dWFsbHkgYWxzbyBmYWlsIGlmIHRoZSBELUJ1cyBpbnN0YWxsYXRpb24gaXMgZmF1bHR5CisgICAqIChubyBVVUlEKSwgYnV0IHdlIGhhdmUgbm8gZ29vZCB3YXkgdG8gcmVwb3J0IHRoYXQuIEhpc3RvcmljYWxseSwKKyAgICogX2RidXNfZ2V0X2xvY2FsX21hY2hpbmVfdXVpZF9lbmNvZGVkIHdhcyByZXNwb25zaWJsZSBmb3IgaXNzdWluZyB0aGUKKyAgICogd2FybmluZzsgbm93IHdlIGRvIHRoYXQgaGVyZS4gKi8KKyAgaWYgKHMgPT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoIWRidXNfZXJyb3JfaGFzX25hbWUgKCZlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlkpKQorICAgICAgICBfZGJ1c193YXJuX2NoZWNrX2ZhaWxlZCAoIiVzIiwgZXJyb3IubWVzc2FnZSk7CisKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICByZXR1cm4gczsKK30KKworLyoqCisgKiBAZGVmIERCVVNfTUFKT1JfVkVSU0lPTgorICoKKyAqIFRoZSBDT01QSUxFIFRJTUUgbWFqb3IgdmVyc2lvbiBvZiBsaWJkYnVzLCB0aGF0IGlzLCB0aGUgIlgiIGluICJYLlkuWiIsCisgKiBhcyBhbiBpbnRlZ2VyIGxpdGVyYWwuIENvbnNpZGVyIGNhcmVmdWxseSB3aGV0aGVyIHRvIHVzZSB0aGlzIG9yIHRoZQorICogcnVudGltZSB2ZXJzaW9uIGZyb20gZGJ1c19nZXRfdmVyc2lvbigpLgorICovCisKKy8qKgorICogQGRlZiBEQlVTX01JTk9SX1ZFUlNJT04KKyAqCisgKiBUaGUgQ09NUElMRSBUSU1FIG1pbm9yIHZlcnNpb24gb2YgbGliZGJ1cywgdGhhdCBpcywgdGhlICJZIiBpbiAiWC5ZLloiLAorICogYXMgYW4gaW50ZWdlciBsaXRlcmFsLiBDb25zaWRlciBjYXJlZnVsbHkgd2hldGhlciB0byB1c2UgdGhpcyBvciB0aGUKKyAqIHJ1bnRpbWUgdmVyc2lvbiBmcm9tIGRidXNfZ2V0X3ZlcnNpb24oKS4KKyAqLworCisvKioKKyAqIEBkZWYgREJVU19NSUNST19WRVJTSU9OCisgKgorICogVGhlIENPTVBJTEUgVElNRSBtaWNybyB2ZXJzaW9uIG9mIGxpYmRidXMsIHRoYXQgaXMsIHRoZSAiWiIgaW4gIlguWS5aIiwKKyAqIGFzIGFuIGludGVnZXIgbGl0ZXJhbC4gQ29uc2lkZXIgY2FyZWZ1bGx5IHdoZXRoZXIgdG8gdXNlIHRoaXMgb3IgdGhlCisgKiBydW50aW1lIHZlcnNpb24gZnJvbSBkYnVzX2dldF92ZXJzaW9uKCkuCisgKi8KKworLyoqCisgKiBAZGVmIERCVVNfVkVSU0lPTgorICoKKyAqIFRoZSBDT01QSUxFIFRJTUUgdmVyc2lvbiBvZiBsaWJkYnVzLCBhcyBhIHNpbmdsZSBpbnRlZ2VyIHRoYXQgaGFzIDAgaW4gdGhlIG1vc3QKKyAqIHNpZ25pZmljYW50IGJ5dGUsIHRoZSBtYWpvciB2ZXJzaW9uIGluIHRoZSBuZXh0IG1vc3Qgc2lnbmlmaWNhbnQgYnl0ZSwKKyAqIHRoZSBtaW5vciB2ZXJzaW9uIGluIHRoZSB0aGlyZCBtb3N0IHNpZ25pZmljYW50LCBhbmQgdGhlIG1pY3JvIHZlcnNpb24gaW4gdGhlCisgKiBsZWFzdCBzaWduaWZpY2FudCBieXRlLiBUaGlzIG1lYW5zIHR3byBEQlVTX1ZFUlNJT04gY2FuIGJlIGNvbXBhcmVkIHRvIHNlZQorICogd2hpY2ggaXMgaGlnaGVyLgorICoKKyAqIENvbnNpZGVyIGNhcmVmdWxseSB3aGV0aGVyIHRvIHVzZSB0aGlzIG9yIHRoZSBydW50aW1lIHZlcnNpb24gZnJvbQorICogZGJ1c19nZXRfdmVyc2lvbigpLgorICovCisKKy8qKgorICogQGRlZiBEQlVTX1ZFUlNJT05fU1RSSU5HCisgKgorICogVGhlIENPTVBJTEUgVElNRSB2ZXJzaW9uIG9mIGxpYmRidXMsIGFzIGEgc3RyaW5nICJYLlkuWiIuCisgKgorICogQ29uc2lkZXIgY2FyZWZ1bGx5IHdoZXRoZXIgdG8gdXNlIHRoaXMgb3IgdGhlIHJ1bnRpbWUgdmVyc2lvbiBmcm9tCisgKiBkYnVzX2dldF92ZXJzaW9uKCkuCisgKi8KKworLyoqCisgKiBHZXRzIHRoZSBEWU5BTUlDQUxMWSBMSU5LRUQgdmVyc2lvbiBvZiBsaWJkYnVzLiBBbHRlcm5hdGl2ZWx5LCB0aGVyZQorICogYXJlIG1hY3JvcyAjREJVU19NQUpPUl9WRVJTSU9OLCAjREJVU19NSU5PUl9WRVJTSU9OLCAjREJVU19NSUNST19WRVJTSU9OLAorICogYW5kICNEQlVTX1ZFUlNJT04gd2hpY2ggYWxsb3cgeW91IHRvIHRlc3QgdGhlIFZFUlNJT04gWU9VIEFSRSBDT01QSUxFRCBBR0FJTlNULgorICogSW4gb3RoZXIgd29yZHMsIHlvdSBjYW4gZ2V0IGVpdGhlciB0aGUgcnVudGltZSBvciB0aGUgY29tcGlsZS10aW1lIHZlcnNpb24uCisgKiBUaGluayBjYXJlZnVsbHkgYWJvdXQgd2hpY2ggb2YgdGhlc2UgeW91IHdhbnQgaW4gYSBnaXZlbiBjYXNlLgorICoKKyAqIFRoZSBsaWJkYnVzIGZ1bGwgdmVyc2lvbiBudW1iZXIgaXMgIk1BSk9SLk1JTk9SLk1JQ1JPIiB3aGVyZSB0aGUKKyAqIE1JTk9SIGNoYW5nZXMgaWYgQVBJIGlzIGFkZGVkLCBhbmQgdGhlIE1JQ1JPIGNoYW5nZXMgd2l0aCBlYWNoCisgKiByZWxlYXNlIG9mIGEgTUFKT1IuTUlOT1Igc2VyaWVzLiAgVGhlIE1JTk9SIGlzIGFuIG9kZCBudW1iZXIgZm9yCisgKiBkZXZlbG9wbWVudCByZWxlYXNlcyBhbmQgYW4gZXZlbiBudW1iZXIgZm9yIHN0YWJsZSByZWxlYXNlcy4KKyAqIAorICogQHBhcmFtIG1ham9yX3ZlcnNpb25fcCBwb2ludGVyIHRvIHJldHVybiB0aGUgbWFqb3IgdmVyc2lvbiwgb3IgI05VTEwKKyAqIEBwYXJhbSBtaW5vcl92ZXJzaW9uX3AgcG9pbnRlciB0byByZXR1cm4gdGhlIG1pbm9yIHZlcnNpb24sIG9yICNOVUxMCisgKiBAcGFyYW0gbWljcm9fdmVyc2lvbl9wIHBvaW50ZXIgdG8gcmV0dXJuIHRoZSBtaWNybyB2ZXJzaW9uLCBvciAjTlVMTCAKKyAqIAorICovCit2b2lkCitkYnVzX2dldF92ZXJzaW9uIChpbnQgKm1ham9yX3ZlcnNpb25fcCwKKyAgICAgICAgICAgICAgICAgIGludCAqbWlub3JfdmVyc2lvbl9wLAorICAgICAgICAgICAgICAgICAgaW50ICptaWNyb192ZXJzaW9uX3ApCit7CisgIGlmIChtYWpvcl92ZXJzaW9uX3ApCisgICAgKm1ham9yX3ZlcnNpb25fcCA9IERCVVNfTUFKT1JfVkVSU0lPTjsKKyAgaWYgKG1pbm9yX3ZlcnNpb25fcCkKKyAgICAqbWlub3JfdmVyc2lvbl9wID0gREJVU19NSU5PUl9WRVJTSU9OOworICBpZiAobWljcm9fdmVyc2lvbl9wKQorICAgICptaWNyb192ZXJzaW9uX3AgPSBEQlVTX01JQ1JPX1ZFUlNJT047Cit9CisKKworLyoqIEB9ICovIC8qIEVuZCBvZiBwdWJsaWMgQVBJICovCisKKyNpZmRlZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworCisjaWZuZGVmIERPWFlHRU5fU0hPVUxEX1NLSVBfVEhJUworCisjaW5jbHVkZSAiZGJ1cy10ZXN0LmgiCisjaW5jbHVkZSA8c3RkbGliLmg+CisKKworZGJ1c19ib29sX3QKK19kYnVzX21pc2NfdGVzdCAodm9pZCkKK3sKKyAgaW50IG1ham9yLCBtaW5vciwgbWljcm87CisgIERCdXNTdHJpbmcgc3RyOworCisgIC8qIG1ha2Ugc3VyZSB3ZSBkb24ndCBjcmFzaCBvbiBOVUxMICovCisgIGRidXNfZ2V0X3ZlcnNpb24gKE5VTEwsIE5VTEwsIE5VTEwpOworCisgIC8qIE5vdyB2ZXJpZnkgdGhhdCBhbGwgdGhlIGNvbXBpbGUtdGltZSB2ZXJzaW9uIHN0dWZmCisgICAqIGlzIHJpZ2h0IGFuZCBtYXRjaGVzIHRoZSBydW50aW1lLiBUaGVzZSB0ZXN0cworICAgKiBhcmUgbW9zdGx5IGludGVuZGVkIHRvIGNhdGNoIHZhcmlvdXMga2luZHMgb2YKKyAgICogdHlwbyAobWl4aW5nIHVwIG1ham9yIGFuZCBtaW5vciwgdGhhdCBzb3J0IG9mIHRoaW5nKS4KKyAgICovCisgIGRidXNfZ2V0X3ZlcnNpb24gKCZtYWpvciwgJm1pbm9yLCAmbWljcm8pOworCisgIF9kYnVzX2Fzc2VydCAobWFqb3IgPT0gREJVU19NQUpPUl9WRVJTSU9OKTsKKyAgX2RidXNfYXNzZXJ0IChtaW5vciA9PSBEQlVTX01JTk9SX1ZFUlNJT04pOworICBfZGJ1c19hc3NlcnQgKG1pY3JvID09IERCVVNfTUlDUk9fVkVSU0lPTik7CisKKyNkZWZpbmUgTUFLRV9WRVJTSU9OKHgsIHksIHopICgoKHgpIDw8IDE2KSB8ICgoeSkgPDwgOCkgfCAoeikpCisKKyAgLyogY2hlY2sgdGhhdCBNQUtFX1ZFUlNJT04gd29ya3MgYW5kIHByb2R1Y2VzIHRoZSBpbnRlbmRlZCBvcmRlcmluZyAqLworICBfZGJ1c19hc3NlcnQgKE1BS0VfVkVSU0lPTiAoMSwgMCwgMCkgPiBNQUtFX1ZFUlNJT04gKDAsIDAsIDApKTsKKyAgX2RidXNfYXNzZXJ0IChNQUtFX1ZFUlNJT04gKDEsIDEsIDApID4gTUFLRV9WRVJTSU9OICgxLCAwLCAwKSk7CisgIF9kYnVzX2Fzc2VydCAoTUFLRV9WRVJTSU9OICgxLCAxLCAxKSA+IE1BS0VfVkVSU0lPTiAoMSwgMSwgMCkpOworCisgIF9kYnVzX2Fzc2VydCAoTUFLRV9WRVJTSU9OICgyLCAwLCAwKSA+IE1BS0VfVkVSU0lPTiAoMSwgMSwgMSkpOworICBfZGJ1c19hc3NlcnQgKE1BS0VfVkVSU0lPTiAoMiwgMSwgMCkgPiBNQUtFX1ZFUlNJT04gKDEsIDEsIDEpKTsKKyAgX2RidXNfYXNzZXJ0IChNQUtFX1ZFUlNJT04gKDIsIDEsIDEpID4gTUFLRV9WRVJTSU9OICgxLCAxLCAxKSk7CisKKyAgLyogY2hlY2sgREJVU19WRVJTSU9OICovCisgIF9kYnVzX2Fzc2VydCAoTUFLRV9WRVJTSU9OIChtYWpvciwgbWlub3IsIG1pY3JvKSA9PSBEQlVTX1ZFUlNJT04pOworCisgIC8qIGNoZWNrIHRoYXQgb3JkZXJpbmcgd29ya3Mgd2l0aCBEQlVTX1ZFUlNJT04gKi8KKyAgX2RidXNfYXNzZXJ0IChNQUtFX1ZFUlNJT04gKG1ham9yIC0gMSwgbWlub3IsIG1pY3JvKSA8IERCVVNfVkVSU0lPTik7CisgIF9kYnVzX2Fzc2VydCAoTUFLRV9WRVJTSU9OIChtYWpvciwgbWlub3IgLSAxLCBtaWNybykgPCBEQlVTX1ZFUlNJT04pOworICBfZGJ1c19hc3NlcnQgKE1BS0VfVkVSU0lPTiAobWFqb3IsIG1pbm9yLCBtaWNybyAtIDEpIDwgREJVU19WRVJTSU9OKTsKKyAgCisgIF9kYnVzX2Fzc2VydCAoTUFLRV9WRVJTSU9OIChtYWpvciArIDEsIG1pbm9yLCBtaWNybykgPiBEQlVTX1ZFUlNJT04pOworICBfZGJ1c19hc3NlcnQgKE1BS0VfVkVSU0lPTiAobWFqb3IsIG1pbm9yICsgMSwgbWljcm8pID4gREJVU19WRVJTSU9OKTsKKyAgX2RidXNfYXNzZXJ0IChNQUtFX1ZFUlNJT04gKG1ham9yLCBtaW5vciwgbWljcm8gKyAxKSA+IERCVVNfVkVSU0lPTik7CisKKyAgLyogQ2hlY2sgREJVU19WRVJTSU9OX1NUUklORyAqLworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZzdHIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOworCisgIGlmICghKF9kYnVzX3N0cmluZ19hcHBlbmRfaW50ICgmc3RyLCBtYWpvcikgJiYKKyAgICAgICAgX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlICgmc3RyLCAnLicpICYmCisgICAgICAgIF9kYnVzX3N0cmluZ19hcHBlbmRfaW50ICgmc3RyLCBtaW5vcikgJiYKKyAgICAgICAgX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlICgmc3RyLCAnLicpICYmCisgICAgICAgIF9kYnVzX3N0cmluZ19hcHBlbmRfaW50ICgmc3RyLCBtaWNybykpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOworCisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2VxdWFsX2Nfc3RyICgmc3RyLCBEQlVTX1ZFUlNJT05fU1RSSU5HKSk7CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZzdHIpOworICAgCisgIHJldHVybiBUUlVFOworfQorCisjZW5kaWYgLyogIURPWFlHRU5fU0hPVUxEX1NLSVBfVEhJUyAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1taXNjLmggYi9kYnVzL2RidXMtbWlzYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3OGQ3OTkKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtbWlzYy5oCkBAIC0wLDAgKzEsNTkgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1taXNjLmggIEEgZmV3IGFzc29ydGVkIHB1YmxpYyBmdW5jdGlvbnMgdGhhdCBkb24ndCBmaXQgZWxzZXdoZXJlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2IFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKyNpZiAhZGVmaW5lZCAoREJVU19JTlNJREVfREJVU19IKSAmJiAhZGVmaW5lZCAoREJVU19DT01QSUxBVElPTikKKyNlcnJvciAiT25seSA8ZGJ1cy9kYnVzLmg+IGNhbiBiZSBpbmNsdWRlZCBkaXJlY3RseSwgdGhpcyBmaWxlIG1heSBkaXNhcHBlYXIgb3IgY2hhbmdlIGNvbnRlbnRzLiIKKyNlbmRpZgorCisjaWZuZGVmIERCVVNfTUlTQ19ICisjZGVmaW5lIERCVVNfTUlTQ19ICisKKyNpbmNsdWRlIDxkYnVzL2RidXMtdHlwZXMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtZXJyb3JzLmg+CisKK0RCVVNfQkVHSU5fREVDTFMKKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzTWlzYworICogQHsKKyAqLworREJVU19FWFBPUlQKK2NoYXIqICAgICAgIGRidXNfZ2V0X2xvY2FsX21hY2hpbmVfaWQgICh2b2lkKTsKKworREJVU19FWFBPUlQKK3ZvaWQgICAgICAgIGRidXNfZ2V0X3ZlcnNpb24gICAgICAgICAgIChpbnQgKm1ham9yX3ZlcnNpb25fcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKm1pbm9yX3ZlcnNpb25fcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKm1pY3JvX3ZlcnNpb25fcCk7CisKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCBkYnVzX3NldGVudiAgICAgICAgICAgICAgICAoY29uc3QgY2hhciAqdmFyaWFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdmFsdWUpOworCitEQlVTX0VYUE9SVAorY2hhciAqZGJ1c190cnlfZ2V0X2xvY2FsX21hY2hpbmVfaWQgKERCdXNFcnJvciAqZXJyb3IpOworCisvKiogQH0gKi8KKworREJVU19FTkRfREVDTFMKKworI2VuZGlmIC8qIERCVVNfTUlTQ19IICovCisKZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1ub25jZS5jIGIvZGJ1cy9kYnVzLW5vbmNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAyNTVkMwotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1ub25jZS5jCkBAIC0wLDAgKzEsNDgxIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtbm9uY2UuYyAgTm9uY2UgaGFuZGxpbmcgZnVuY3Rpb25zIHVzZWQgYnkgbm9uY2UtdGNwIChpbnRlcm5hbCB0byBELUJ1cyBpbXBsZW1lbnRhdGlvbikKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgS2xhcmFsdmRhbGVucyBEYXRha29uc3VsdCBBQiwgYSBLREFCIEdyb3VwIGNvbXBhbnksIGluZm9Aa2RhYi5uZXQKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisvLyBtYWpvciBzZWN0aW9ucyBvZiB0aGlzIGZpbGUgYXJlIG1vZGlmaWVkIGNvZGUgZnJvbSBsaWJhc3N1YW4sIChDKSBGU0YKKyNpbmNsdWRlICJkYnVzLW5vbmNlLmgiCisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKyNpbmNsdWRlICJkYnVzLXByb3RvY29sLmgiCisjaW5jbHVkZSAiZGJ1cy1zeXNkZXBzLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCitzdGF0aWMgZGJ1c19ib29sX3QKK2RvX2NoZWNrX25vbmNlIChEQnVzU29ja2V0IGZkLCBjb25zdCBEQnVzU3RyaW5nICpub25jZSwgREJ1c0Vycm9yICplcnJvcikKK3sKKyAgREJ1c1N0cmluZyBidWZmZXI7CisgIERCdXNTdHJpbmcgcDsKKyAgc2l6ZV90IG5sZWZ0OworICBkYnVzX2Jvb2xfdCByZXN1bHQ7CisgIGludCBuOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIG5sZWZ0ID0gMTY7CisKKyAgLyogVGhpcyBpcyBhIHRyaWNrIHRvIG1ha2UgaXQgc2FmZSB0byBjYWxsIF9kYnVzX3N0cmluZ19mcmVlIG9uIHRoZXNlCisgICAqIHN0cmluZ3MgZHVyaW5nIGVycm9yIHVud2luZGluZywgZXZlbiBpZiBhbGxvY2F0aW5nIG1lbW9yeSBmb3IgdGhlbQorICAgKiBmYWlscy4gQSBjb25zdGFudCBEQnVzU3RyaW5nIGlzIGNvbnNpZGVyZWQgdG8gYmUgdmFsaWQgdG8gImZyZWUiLAorICAgKiBldmVuIHRob3VnaCB0aGVyZSBpcyBub3RoaW5nIHRvIGZyZWUgKG9mIGNvdXJzZSB0aGUgZnJlZSBvcGVyYXRpb24KKyAgICogaXMgdHJpdmlhbCwgYmVjYXVzZSBpdCBkb2VzIG5vdCBvd24gaXRzIG93biBidWZmZXIpOyBidXQKKyAgICogdW5saWtlIGEgbXV0YWJsZSBEQnVzU3RyaW5nLCBpbml0aWFsaXppbmcgYSBjb25zdGFudCBEQnVzU3RyaW5nCisgICAqIGNhbm5vdCBmYWlsLgorICAgKgorICAgKiBXZSBtdXN0IHN1Y2Nlc3NmdWxseSByZS1pbml0aWFsaXplIHRoZSBzdHJpbmdzIHRvIGJlIG11dGFibGUgYmVmb3JlCisgICAqIHdyaXRpbmcgdG8gdGhlbSwgb2YgY291cnNlLgorICAgKi8KKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZidWZmZXIsICIiKTsKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZwLCAiIik7CisKKyAgaWYgKCAgICFfZGJ1c19zdHJpbmdfaW5pdCAoJmJ1ZmZlcikKKyAgICAgIHx8ICFfZGJ1c19zdHJpbmdfaW5pdCAoJnApICkgeworICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwKTsKKyAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZidWZmZXIpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9CisKKyAgd2hpbGUgKG5sZWZ0KQorICAgIHsKKyAgICAgIGludCBzYXZlZF9lcnJubzsKKworICAgICAgbiA9IF9kYnVzX3JlYWRfc29ja2V0IChmZCwgJnAsIG5sZWZ0KTsKKyAgICAgIHNhdmVkX2Vycm5vID0gX2RidXNfc2F2ZV9zb2NrZXRfZXJybm8gKCk7CisKKyAgICAgIGlmIChuID09IC0xICYmIF9kYnVzX2dldF9pc19lcnJub19laW50ciAoc2F2ZWRfZXJybm8pKQorICAgICAgICA7CisgICAgICBlbHNlIGlmIChuID09IC0xICYmIF9kYnVzX2dldF9pc19lcnJub19lYWdhaW5fb3JfZXdvdWxkYmxvY2sgKHNhdmVkX2Vycm5vKSkKKyAgICAgICAgX2RidXNfc2xlZXBfbWlsbGlzZWNvbmRzICgxMDApOworICAgICAgZWxzZSBpZiAobj09LTEpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfSU9fRVJST1IsICJDb3VsZCBub3QgcmVhZCBub25jZSBmcm9tIHNvY2tldCAoZmQ9JSIgREJVU19TT0NLRVRfRk9STUFUICIpIiwgX2RidXNfc29ja2V0X3ByaW50YWJsZSAoZmQpKTsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnApOworICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmYnVmZmVyKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKCFuKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwKTsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmJ1ZmZlcik7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0lPX0VSUk9SLCAiQ291bGQgbm90IHJlYWQgbm9uY2UgZnJvbSBzb2NrZXQgKGZkPSUiIERCVVNfU09DS0VUX0ZPUk1BVCAiKSIsIF9kYnVzX3NvY2tldF9wcmludGFibGUgKGZkKSk7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfbGVuICgmYnVmZmVyLCBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZwKSwgbikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnApOworICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmJ1ZmZlcik7CisgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBubGVmdCAtPSBuOworICAgICAgICB9CisgICAgfQorCisgIHJlc3VsdCA9ICBfZGJ1c19zdHJpbmdfZXF1YWxfbGVuICgmYnVmZmVyLCBub25jZSwgMTYpOworICBpZiAoIXJlc3VsdCkKKyAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfQUNDRVNTX0RFTklFRCwgIk5vbmNlcyBkbyBub3QgbWF0Y2gsIGFjY2VzcyBkZW5pZWQgKGZkPSUiIERCVVNfU09DS0VUX0ZPUk1BVCAiKSIsIF9kYnVzX3NvY2tldF9wcmludGFibGUgKGZkKSk7CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZidWZmZXIpOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogcmVhZHMgdGhlIG5vbmNlIGZyb20gdGhlIG5vbmNlIGZpbGUgYW5kIHN0b3JlcyBpdCBpbiBhIHN0cmluZworICoKKyAqIEBwYXJhbSBmbmFtZSB0aGUgZmlsZSB0byByZWFkIHRoZSBub25jZSBmcm9tCisgKiBAcGFyYW0gbm9uY2UgcmV0dXJucyB0aGUgbm9uY2UuIE11c3QgYmUgYW4gaW5pdGlhbGl6ZWQgc3RyaW5nLCB0aGUgbm9uY2Ugd2lsbCBiZSBhcHBlbmRlZC4KKyAqIEBwYXJhbSBlcnJvciBlcnJvciBvYmplY3QgdG8gcmVwb3J0IHBvc3NpYmxlIGVycm9ycworICogQHJldHVybiBGQUxTRSBpZmYgcmVhZGluZyB0aGUgbm9uY2UgZmFpbHMgKGVycm9yIGlzIHNldCB0aGVuKQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfcmVhZF9ub25jZSAoY29uc3QgREJ1c1N0cmluZyAqZm5hbWUsIERCdXNTdHJpbmcgKm5vbmNlLCBEQnVzRXJyb3IqIGVycm9yKQoreworICBGSUxFICpmcDsKKyAgY2hhciBidWZmZXJbMTddOworICBzaXplX3QgbnJlYWQ7CisKKyAgYnVmZmVyW3NpemVvZiBidWZmZXIgLSAxXSA9ICdcMCc7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgX2RidXNfdmVyYm9zZSAoInJlYWRpbmcgbm9uY2UgZnJvbSBmaWxlOiAlc1xuIiwgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChmbmFtZSkpOworCisKKyAgZnAgPSBmb3BlbiAoX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChmbmFtZSksICJyYiIpOworICBpZiAoIWZwKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwKKwkJICAgICAgX2RidXNfZXJyb3JfZnJvbV9zeXN0ZW1fZXJybm8gKCksCisJCSAgICAgICJGYWlsZWQgdG8gb3BlbiAlcyBmb3IgcmVhZDogJXMiLAorCQkgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKGZuYW1lKSwKKwkJICAgICAgX2RidXNfc3RyZXJyb3JfZnJvbV9lcnJubyAoKSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIG5yZWFkID0gZnJlYWQgKGJ1ZmZlciwgMSwgc2l6ZW9mIGJ1ZmZlciAtIDEsIGZwKTsKKyAgZmNsb3NlIChmcCk7CisgIGlmICghbnJlYWQpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZJTEVfTk9UX0ZPVU5ELCAiQ291bGQgbm90IHJlYWQgbm9uY2UgZnJvbSBmaWxlICVzIiwgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChmbmFtZSkpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfbGVuIChub25jZSwgYnVmZmVyLCBzaXplb2YgYnVmZmVyIC0gMSApKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK0RCdXNTb2NrZXQKK19kYnVzX2FjY2VwdF93aXRoX25vbmNlZmlsZSAoREJ1c1NvY2tldCBsaXN0ZW5fZmQsIGNvbnN0IERCdXNOb25jZUZpbGUgKm5vbmNlZmlsZSkKK3sKKyAgREJ1c1NvY2tldCBmZCA9IF9kYnVzX3NvY2tldF9nZXRfaW52YWxpZCAoKTsKKyAgREJ1c1N0cmluZyBub25jZTsKKworICBfZGJ1c19hc3NlcnQgKG5vbmNlZmlsZSAhPSBOVUxMKTsKKworICAvKiBNYWtlIGl0IHZhbGlkIHRvICJmcmVlIiB0aGlzIGV2ZW4gaWYgX2RidXNfc3RyaW5nX2luaXQoKSBydW5zCisgICAqIG91dCBvZiBtZW1vcnk6IHNlZSBjb21tZW50IGluIGRvX2NoZWNrX25vbmNlKCkgKi8KKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZub25jZSwgIiIpOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZub25jZSkpCisgICAgZ290byBvdXQ7CisKKyAgLy9QRU5ESU5HKGtkYWIpOiBzZXQgYmV0dGVyIGVycm9ycworICBpZiAoX2RidXNfcmVhZF9ub25jZSAoX2RidXNfbm9uY2VmaWxlX2dldF9wYXRoKG5vbmNlZmlsZSksICZub25jZSwgTlVMTCkgIT0gVFJVRSkKKyAgICBnb3RvIG91dDsKKworICBmZCA9IF9kYnVzX2FjY2VwdCAobGlzdGVuX2ZkKTsKKworICBpZiAoIV9kYnVzX3NvY2tldF9pc192YWxpZCAoZmQpKQorICAgIGdvdG8gb3V0OworCisgIGlmIChkb19jaGVja19ub25jZShmZCwgJm5vbmNlLCBOVUxMKSAhPSBUUlVFKSB7CisgICAgX2RidXNfdmVyYm9zZSAoIm5vbmNlIGNoZWNrIGZhaWxlZC4gQ2xvc2luZyBzb2NrZXQuXG4iKTsKKyAgICBfZGJ1c19jbG9zZV9zb2NrZXQoZmQsIE5VTEwpOworICAgIF9kYnVzX3NvY2tldF9pbnZhbGlkYXRlICgmZmQpOworICAgIGdvdG8gb3V0OworICB9CisKK291dDoKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZub25jZSk7CisgIHJldHVybiBmZDsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitnZW5lcmF0ZV9hbmRfd3JpdGVfbm9uY2UgKGNvbnN0IERCdXNTdHJpbmcgKmZpbGVuYW1lLCBEQnVzRXJyb3IgKmVycm9yKQoreworICBEQnVzU3RyaW5nIG5vbmNlOworICBkYnVzX2Jvb2xfdCByZXQ7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJm5vbmNlKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19nZW5lcmF0ZV9yYW5kb21fYnl0ZXMgKCZub25jZSwgMTYsIGVycm9yKSkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJm5vbmNlKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgcmV0ID0gX2RidXNfc3RyaW5nX3NhdmVfdG9fZmlsZSAoJm5vbmNlLCBmaWxlbmFtZSwgRkFMU0UsIGVycm9yKTsKKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJm5vbmNlKTsKKworICByZXR1cm4gcmV0OworfQorCisvKioKKyAqIHNlbmRzIHRoZSBub25jZSBvdmVyIGEgZ2l2ZW4gc29ja2V0LiBCbG9ja3Mgd2hpbGUgZG9pbmcgc28uCisgKgorICogQHBhcmFtIGZkIHRoZSBmaWxlIGRlc2NyaXB0b3IgdG8gd3JpdGUgdGhlIG5vbmNlIGRhdGEgdG8gKHVzdWFsbHkgYSBzb2NrZXQpCisgKiBAcGFyYW0gbm9uY2VmaWxlIHRoZSBub25jZWZpbGUgbG9jYXRpb24gdG8gcmVhZCB0aGUgbm9uY2UgZnJvbQorICogQHBhcmFtIGVycm9yIGNvbnRhaW5zIGVycm9yIGRldGFpbHMgaWYgRkFMU0UgaXMgcmV0dXJuZWQKKyAqIEByZXR1cm4gVFJVRSBpZmYgdGhlIG5vbmNlIHdhcyBzdWNjZXNzZnVsbHkgc2VudC4gTm90ZSB0aGF0IHRoaXMgZG9lcyBub3QKKyAqIGluZGljYXRlIHdoZXRoZXIgdGhlIHNlcnZlciBhY2NlcHRlZCB0aGUgbm9uY2UuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zZW5kX25vbmNlIChEQnVzU29ja2V0ICAgICAgICBmZCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKm5vbmNlZmlsZSwKKyAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICBkYnVzX2Jvb2xfdCByZWFkX3Jlc3VsdDsKKyAgaW50IHNlbmRfcmVzdWx0OworICBEQnVzU3RyaW5nIG5vbmNlOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAobm9uY2VmaWxlKSA9PSAwKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmbm9uY2UpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICByZWFkX3Jlc3VsdCA9IF9kYnVzX3JlYWRfbm9uY2UgKG5vbmNlZmlsZSwgJm5vbmNlLCBlcnJvcik7CisgIGlmICghcmVhZF9yZXN1bHQpCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZub25jZSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBzZW5kX3Jlc3VsdCA9IF9kYnVzX3dyaXRlX3NvY2tldCAoZmQsICZub25jZSwgMCwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZub25jZSkpOworCisgIF9kYnVzX3N0cmluZ19mcmVlICgmbm9uY2UpOworCisgIGlmIChzZW5kX3Jlc3VsdCA9PSAtMSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgX2RidXNfZXJyb3JfZnJvbV9zeXN0ZW1fZXJybm8gKCksCisgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBzZW5kIG5vbmNlIChmZD0lIiBEQlVTX1NPQ0tFVF9GT1JNQVQgIik6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zb2NrZXRfcHJpbnRhYmxlIChmZCksCisgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3JfZnJvbV9lcnJubyAoKSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2RvX25vbmNlZmlsZV9jcmVhdGUgKERCdXNOb25jZUZpbGUgKm5vbmNlZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAqZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCB1c2Vfc3ViZGlyKQoreworICAgIERCdXNTdHJpbmcgcmFuZG9tU3RyOworICAgIGNvbnN0IGNoYXIgKnRtcDsKKworICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgICAgX2RidXNfYXNzZXJ0IChub25jZWZpbGUpOworCisgICAgLyogTWFrZSBpdCB2YWxpZCB0byAiZnJlZSIgdGhlc2UgZXZlbiBpZiBfZGJ1c19zdHJpbmdfaW5pdCgpIHJ1bnMKKyAgICAgKiBvdXQgb2YgbWVtb3J5OiBzZWUgY29tbWVudCBpbiBkb19jaGVja19ub25jZSgpICovCisgICAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZyYW5kb21TdHIsICIiKTsKKyAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJm5vbmNlZmlsZS0+ZGlyLCAiIik7CisgICAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZub25jZWZpbGUtPnBhdGgsICIiKTsKKworICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZyYW5kb21TdHIpKQorICAgICAgeworICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgICAgZ290byBvbl9lcnJvcjsKKyAgICAgIH0KKworICAgIGlmICghX2RidXNfZ2VuZXJhdGVfcmFuZG9tX2FzY2lpICgmcmFuZG9tU3RyLCA4LCBlcnJvcikpCisgICAgICB7CisgICAgICAgIGdvdG8gb25fZXJyb3I7CisgICAgICB9CisKKyAgICB0bXAgPSBfZGJ1c19nZXRfdG1wZGlyICgpOworCisgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJm5vbmNlZmlsZS0+ZGlyKQorICAgICAgICB8fCB0bXAgPT0gTlVMTAorICAgICAgICB8fCAhX2RidXNfc3RyaW5nX2FwcGVuZCAoJm5vbmNlZmlsZS0+ZGlyLCB0bXApKQorICAgICAgeworICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgICAgZ290byBvbl9lcnJvcjsKKyAgICAgIH0KKyAgICBpZiAodXNlX3N1YmRpcikKKyAgICAgIHsKKyAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmbm9uY2VmaWxlLT5kaXIsICIvZGJ1c19ub25jZS0iKQorICAgICAgICAgICAgfHwgIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZub25jZWZpbGUtPmRpciwgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmcmFuZG9tU3RyKSkgKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgICAgICAgZ290byBvbl9lcnJvcjsKKyAgICAgICAgICB9CisgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZub25jZWZpbGUtPnBhdGgpCisgICAgICAgICAgICB8fCAhX2RidXNfc3RyaW5nX2NvcHkgKCZub25jZWZpbGUtPmRpciwgMCwgJm5vbmNlZmlsZS0+cGF0aCwgMCkKKyAgICAgICAgICAgIHx8ICFfZGJ1c19zdHJpbmdfYXBwZW5kICgmbm9uY2VmaWxlLT5wYXRoLCAiL25vbmNlIikpCisgICAgICAgICAgeworICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICAgICAgICBnb3RvIG9uX2Vycm9yOworICAgICAgICAgIH0KKyAgICAgICAgaWYgKCFfZGJ1c19jcmVhdGVfZGlyZWN0b3J5ICgmbm9uY2VmaWxlLT5kaXIsIGVycm9yKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICAgICAgICBnb3RvIG9uX2Vycm9yOworICAgICAgICAgIH0KKyAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgICAgIH0KKyAgICBlbHNlCisgICAgICB7CisgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZub25jZWZpbGUtPnBhdGgpCisgICAgICAgICAgICB8fCAhX2RidXNfc3RyaW5nX2NvcHkgKCZub25jZWZpbGUtPmRpciwgMCwgJm5vbmNlZmlsZS0+cGF0aCwgMCkKKyAgICAgICAgICAgIHx8ICFfZGJ1c19zdHJpbmdfYXBwZW5kICgmbm9uY2VmaWxlLT5wYXRoLCAiL2RidXNfbm9uY2UtIikKKyAgICAgICAgICAgIHx8ICFfZGJ1c19zdHJpbmdfYXBwZW5kICgmbm9uY2VmaWxlLT5wYXRoLCBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZyYW5kb21TdHIpKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgICAgICAgIGdvdG8gb25fZXJyb3I7CisgICAgICAgICAgfQorCisgICAgICB9CisKKyAgICBpZiAoIWdlbmVyYXRlX2FuZF93cml0ZV9ub25jZSAoJm5vbmNlZmlsZS0+cGF0aCwgZXJyb3IpKQorICAgICAgeworICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICAgIGlmICh1c2Vfc3ViZGlyKQorICAgICAgICAgIF9kYnVzX2RlbGV0ZV9kaXJlY3RvcnkgKCZub25jZWZpbGUtPmRpciwgTlVMTCk7IC8vd2UgaWdub3JlIHBvc3NpYmxlIGVycm9ycyBkZWxldGluZyB0aGUgZGlyIGFuZCByZXR1cm4gdGhlIHdyaXRlIGVycm9yIGluc3RlYWQKKyAgICAgICAgZ290byBvbl9lcnJvcjsKKyAgICAgIH0KKyAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICAgIF9kYnVzX3N0cmluZ19mcmVlICgmcmFuZG9tU3RyKTsKKworICAgIHJldHVybiBUUlVFOworICBvbl9lcnJvcjoKKyAgICBpZiAodXNlX3N1YmRpciAmJiBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJm5vbmNlZmlsZS0+ZGlyKSAhPSAwKQorICAgICAgX2RidXNfZGVsZXRlX2RpcmVjdG9yeSAoJm5vbmNlZmlsZS0+ZGlyLCBOVUxMKTsKKyAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJm5vbmNlZmlsZS0+ZGlyKTsKKyAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJm5vbmNlZmlsZS0+cGF0aCk7CisgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZyYW5kb21TdHIpOworICAgIHJldHVybiBGQUxTRTsKK30KKworI2lmZGVmIERCVVNfV0lOCisvKioKKyAqIGNyZWF0ZXMgYSBub25jZSBmaWxlIGluIGEgdXNlci1yZWFkYWJsZSBsb2NhdGlvbiBhbmQgd3JpdGVzIGEgZ2VuZXJhdGVkIG5vbmNlIHRvIGl0CisgKgorICogQHBhcmFtIG5vbmNlZmlsZSByZXR1cm5zIHRoZSBub25jZSBmaWxlIGxvY2F0aW9uCisgKiBAcGFyYW0gZXJyb3IgZXJyb3IgZGV0YWlscyBpZiBjcmVhdGluZyB0aGUgbm9uY2UgZmlsZSBmYWlscworICogQHJldHVybiBUUlVFIGlmZiB0aGUgbm9uY2UgZmlsZSB3YXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX25vbmNlZmlsZV9jcmVhdGUgKERCdXNOb25jZUZpbGUgKm5vbmNlZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAqZXJyb3IpCit7CisgICAgcmV0dXJuIGRvX25vbmNlZmlsZV9jcmVhdGUgKG5vbmNlZmlsZSwgZXJyb3IsIC8qdXNlX3N1YmRpcj0qL0ZBTFNFKTsKK30KKworLyoqCisgKiBkZWxldGVzIHRoZSBub25jZWZpbGUgYW5kIGZyZWVzIHRoZSBEQnVzTm9uY2VGaWxlIG9iamVjdC4KKyAqCisgKiBAcGFyYW0gbm9uY2VmaWxlIHRoZSBub25jZSBmaWxlIHRvIGRlbGV0ZS4gQ29udGVudHMgd2lsbCBiZSBmcmVlZC4KKyAqIEBwYXJhbSBlcnJvciBlcnJvciBkZXRhaWxzIGlmIHRoZSBub25jZSBmaWxlIGNvdWxkIG5vdCBiZSBkZWxldGVkCisgKiBAcmV0dXJuIFRSVUUKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX25vbmNlZmlsZV9kZWxldGUgKERCdXNOb25jZUZpbGUgKm5vbmNlZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAqZXJyb3IpCit7CisgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgICBfZGJ1c19kZWxldGVfZmlsZSAoJm5vbmNlZmlsZS0+cGF0aCwgZXJyb3IpOworICAgIF9kYnVzX3N0cmluZ19mcmVlICgmbm9uY2VmaWxlLT5kaXIpOworICAgIF9kYnVzX3N0cmluZ19mcmVlICgmbm9uY2VmaWxlLT5wYXRoKTsKKyAgICByZXR1cm4gVFJVRTsKK30KKworI2Vsc2UKKy8qKgorICogY3JlYXRlcyBhIG5vbmNlIGZpbGUgaW4gYSB1c2VyLXJlYWRhYmxlIGxvY2F0aW9uIGFuZCB3cml0ZXMgYSBnZW5lcmF0ZWQgbm9uY2UgdG8gaXQuCisgKiBJbml0aWFsaXplcyB0aGUgbm9uY2VmaWxlIG9iamVjdC4KKyAqCisgKiBAcGFyYW0gbm9uY2VmaWxlIHJldHVybnMgdGhlIG5vbmNlIGZpbGUgbG9jYXRpb24KKyAqIEBwYXJhbSBlcnJvciBlcnJvciBkZXRhaWxzIGlmIGNyZWF0aW5nIHRoZSBub25jZSBmaWxlIGZhaWxzCisgKiBAcmV0dXJuIFRSVUUgaWZmIHRoZSBub25jZSBmaWxlIHdhcyBzdWNjZXNzZnVsbHkgY3JlYXRlZAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfbm9uY2VmaWxlX2NyZWF0ZSAoREJ1c05vbmNlRmlsZSAqbm9uY2VmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICplcnJvcikKK3sKKyAgICByZXR1cm4gZG9fbm9uY2VmaWxlX2NyZWF0ZSAobm9uY2VmaWxlLCBlcnJvciwgLyp1c2Vfc3ViZGlyPSovVFJVRSk7Cit9CisKKy8qKgorICogZGVsZXRlcyB0aGUgbm9uY2VmaWxlIGFuZCBmcmVlcyB0aGUgREJ1c05vbmNlRmlsZSBvYmplY3QuCisgKgorICogQHBhcmFtIG5vbmNlZmlsZSB0aGUgbm9uY2UgZmlsZSB0byBkZWxldGUuIENvbnRlbnRzIHdpbGwgYmUgZnJlZWQuCisgKiBAcGFyYW0gZXJyb3IgZXJyb3IgZGV0YWlscyBpZiB0aGUgbm9uY2UgZmlsZSBjb3VsZCBub3QgYmUgZGVsZXRlZAorICogQHJldHVybiBUUlVFCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19ub25jZWZpbGVfZGVsZXRlIChEQnVzTm9uY2VGaWxlICpub25jZWZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgKmVycm9yKQoreworICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgICAgX2RidXNfZGVsZXRlX2RpcmVjdG9yeSAoJm5vbmNlZmlsZS0+ZGlyLCBlcnJvcik7CisgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZub25jZWZpbGUtPmRpcik7CisgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZub25jZWZpbGUtPnBhdGgpOworICAgIHJldHVybiBUUlVFOworfQorI2VuZGlmCisKKworLyoqCisgKiByZXR1cm5zIHRoZSBhYnNvbHV0ZSBmaWxlIHBhdGggb2YgdGhlIG5vbmNlIGZpbGUKKyAqCisgKiBAcGFyYW0gbm9uY2VmaWxlIGFuIGluaXRpYWxpemVkIG5vbmNlZmlsZSBvYmplY3QKKyAqIEByZXR1cm4gdGhlIGFic29sdXRlIHBhdGggb2YgdGhlIG5vbmNlIGZpbGUKKyAqLworY29uc3QgREJ1c1N0cmluZyoKK19kYnVzX25vbmNlZmlsZV9nZXRfcGF0aCAoY29uc3QgREJ1c05vbmNlRmlsZSAqbm9uY2VmaWxlKQoreworICAgIF9kYnVzX2Fzc2VydCAobm9uY2VmaWxlKTsKKyAgICByZXR1cm4gJm5vbmNlZmlsZS0+cGF0aDsKK30KKworLyoqCisgKiByZWFkcyBkYXRhIGZyb20gYSBmaWxlIGRlc2NyaXB0b3IgYW5kIGNoZWNrcyBpZiB0aGUgcmVjZWl2ZWQgZGF0YSBtYXRjaGVzCisgKiB0aGUgZGF0YSBpbiB0aGUgZ2l2ZW4gbm9uY2VmaWxlLgorICoKKyAqIEBwYXJhbSBmZCB0aGUgZmlsZSBkZXNjcmlwdG9yIHRvIHJlYWQgdGhlIG5vbmNlIGZyb20KKyAqIEBwYXJhbSBub25jZWZpbGUgdGhlIG5vbmNlIGZpbGUgdG8gY2hlY2sgdGhlIHJlY2VpdmVkIGRhdGEgYWdhaW5zdAorICogQHBhcmFtIGVycm9yIGVycm9yIGRldGFpbHMgb24gZmFpbAorICogQHJldHVybiBUUlVFIGlmZiBhIG5vbmNlIGNvdWxkIGJlIHN1Y2Nlc3NmdWxseSByZWFkIGZyb20gdGhlIGZpbGUgZGVzY3JpcHRvcgorICogYW5kIG1hdGNoZXMgdGhlIG5vbmNlIGZyb20gdGhlIGdpdmVuIG5vbmNlIGZpbGUKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX25vbmNlZmlsZV9jaGVja19ub25jZSAoREJ1c1NvY2tldCBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c05vbmNlRmlsZSAqbm9uY2VmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IqIGVycm9yKQoreworICAgIHJldHVybiBkb19jaGVja19ub25jZSAoZmQsIF9kYnVzX25vbmNlZmlsZV9nZXRfcGF0aCAobm9uY2VmaWxlKSwgZXJyb3IpOworfQorCisKKy8qKiBAfSBlbmQgb2Ygbm9uY2UgKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1ub25jZS5oIGIvZGJ1cy9kYnVzLW5vbmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTkzNjZmZAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1ub25jZS5oCkBAIC0wLDAgKzEsNzMgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1ub25jZS5oICBOb25jZSBoYW5kbGluZyBmdW5jdGlvbnMgdXNlZCBieSBub25jZS10Y3AgKGludGVybmFsIHRvIEQtQnVzIGltcGxlbWVudGF0aW9uKQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBLbGFyYWx2ZGFsZW5zIERhdGFrb25zdWx0IEFCLCBhIEtEQUIgR3JvdXAgY29tcGFueSwgaW5mb0BrZGFiLm5ldAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICovCisjaWZuZGVmIERCVVNfTk9OQ0VfSAorI2RlZmluZSBEQlVTX05PTkNFX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy1tYWNyb3MuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtdHlwZXMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtZXJyb3JzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXN0cmluZy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zeXNkZXBzLmg+CisKK0RCVVNfQkVHSU5fREVDTFMKKwordHlwZWRlZiBzdHJ1Y3QgREJ1c05vbmNlRmlsZSBEQnVzTm9uY2VGaWxlOworCitzdHJ1Y3QgREJ1c05vbmNlRmlsZQoreworICBEQnVzU3RyaW5nIHBhdGg7CisgIERCdXNTdHJpbmcgZGlyOworfTsKKworLy8gc2VydmVyCisKK2RidXNfYm9vbF90IF9kYnVzX25vbmNlZmlsZV9jcmVhdGUgKERCdXNOb25jZUZpbGUgKm5vbmNlZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAqZXJyb3IpOworCitkYnVzX2Jvb2xfdCBfZGJ1c19ub25jZWZpbGVfZGVsZXRlIChEQnVzTm9uY2VGaWxlICpub25jZWZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgKmVycm9yKTsKKworZGJ1c19ib29sX3QgX2RidXNfbm9uY2VmaWxlX2NoZWNrX25vbmNlIChEQnVzU29ja2V0IGZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzTm9uY2VGaWxlICpub25jZWZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAqZXJyb3IpOworCitjb25zdCBEQnVzU3RyaW5nKiBfZGJ1c19ub25jZWZpbGVfZ2V0X3BhdGggKGNvbnN0IERCdXNOb25jZUZpbGUgKm5vbmNlZmlsZSk7CisKK0RCdXNTb2NrZXQgX2RidXNfYWNjZXB0X3dpdGhfbm9uY2VmaWxlKERCdXNTb2NrZXQgbGlzdGVuX2ZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c05vbmNlRmlsZSAqbm9uY2VmaWxlKTsKKworLy8gc2hhcmVkCisKK2RidXNfYm9vbF90IF9kYnVzX3JlYWRfbm9uY2UgKGNvbnN0IERCdXNTdHJpbmcgKmZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAqbm9uY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgKmVycm9yKTsKKworLy8gY2xpZW50CisKK2RidXNfYm9vbF90IF9kYnVzX3NlbmRfbm9uY2UgKERCdXNTb2NrZXQgZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpub25jZWZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgKmVycm9yKTsKKworREJVU19FTkRfREVDTFMKKworI2VuZGlmIC8qIERCVVNfTk9OQ0VfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLW9iamVjdC10cmVlLmMgYi9kYnVzL2RidXMtb2JqZWN0LXRyZWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjVkZjM5Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLW9iamVjdC10cmVlLmMKQEAgLTAsMCArMSwyMzI5IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtb2JqZWN0LXRyZWUuYyAgREJ1c09iamVjdFRyZWUgKGludGVybmFscyBvZiBEQnVzQ29ubmVjdGlvbikKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDUgIFJlZCBIYXQgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgImRidXMtb2JqZWN0LXRyZWUuaCIKKyNpbmNsdWRlICJkYnVzLWNvbm5lY3Rpb24taW50ZXJuYWwuaCIKKyNpbmNsdWRlICJkYnVzLWludGVybmFscy5oIgorI2luY2x1ZGUgImRidXMtaGFzaC5oIgorI2luY2x1ZGUgImRidXMtcHJvdG9jb2wuaCIKKyNpbmNsdWRlICJkYnVzLXN0cmluZy5oIgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisvKioKKyAqIEBkZWZncm91cCBEQnVzT2JqZWN0VHJlZSBBIGhpZXJhcmNoeSBvZiBvYmplY3RzIHdpdGggY29udGFpbmVyLWNvbnRhaW5lZCByZWxhdGlvbnNoaXAKKyAqIEBpbmdyb3VwICBEQnVzSW50ZXJuYWxzCisgKiBAYnJpZWYgREJ1c09iamVjdFRyZWUgaXMgdXNlZCBieSBEQnVzQ29ubmVjdGlvbiB0byB0cmFjayB0aGUgb2JqZWN0IHRyZWUKKyAqCisgKiBUeXBlcyBhbmQgZnVuY3Rpb25zIHJlbGF0ZWQgdG8gREJ1c09iamVjdFRyZWUuIFRoZXNlCisgKiBhcmUgYWxsIGxpYnJhcnktaW50ZXJuYWwuCisgKgorICogQHsKKyAqLworCisvKiogU3Vibm9kZSBvZiB0aGUgb2JqZWN0IGhpZXJhcmNoeSAqLwordHlwZWRlZiBzdHJ1Y3QgREJ1c09iamVjdFN1YnRyZWUgREJ1c09iamVjdFN1YnRyZWU7CisKK3N0YXRpYyBEQnVzT2JqZWN0U3VidHJlZSogX2RidXNfb2JqZWN0X3N1YnRyZWVfbmV3ICAgKGNvbnN0IGNoYXIgICAgICAgICAgICAgICAgICAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNPYmplY3RQYXRoVlRhYmxlICAqdnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICp1c2VyX2RhdGEpOworc3RhdGljIERCdXNPYmplY3RTdWJ0cmVlKiBfZGJ1c19vYmplY3Rfc3VidHJlZV9yZWYgICAoREJ1c09iamVjdFN1YnRyZWUgICAgICAgICAgICpzdWJ0cmVlKTsKK3N0YXRpYyB2b2lkICAgICAgICAgICAgICAgX2RidXNfb2JqZWN0X3N1YnRyZWVfdW5yZWYgKERCdXNPYmplY3RTdWJ0cmVlICAgICAgICAgICAqc3VidHJlZSk7CisKKy8qKgorICogSW50ZXJuYWxzIG9mIERCdXNPYmplY3RUcmVlCisgKi8KK3N0cnVjdCBEQnVzT2JqZWN0VHJlZQoreworICBpbnQgICAgICAgICAgICAgICAgIHJlZmNvdW50OyAgIC8qKjwgUmVmZXJlbmNlIGNvdW50ICovCisgIERCdXNDb25uZWN0aW9uICAgICAqY29ubmVjdGlvbjsgLyoqPCBDb25uZWN0aW9uIHRoaXMgdHJlZSBiZWxvbmdzIHRvICovCisKKyAgREJ1c09iamVjdFN1YnRyZWUgICpyb290OyAgICAgICAvKio8IFJvb3Qgb2YgdGhlIHRyZWUgKCIvIiBub2RlKSAqLworfTsKKworLyoqCisgKiBTdHJ1Y3QgcmVwcmVzZW50aW5nIGEgc2luZ2xlIHJlZ2lzdGVyZWQgc3VidHJlZSBoYW5kbGVyLCBvciBub2RlCisgKiB0aGF0J3MgYSBwYXJlbnQgb2YgYSByZWdpc3RlcmVkIHN1YnRyZWUgaGFuZGxlci4gSWYKKyAqIG1lc3NhZ2VfZnVuY3Rpb24gIT0gTlVMTCB0aGVyZSdzIGFjdHVhbGx5IGEgaGFuZGxlciBhdCB0aGlzIG5vZGUuCisgKi8KK3N0cnVjdCBEQnVzT2JqZWN0U3VidHJlZQoreworICBEQnVzQXRvbWljICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmNvdW50OyAgICAgICAgICAgIC8qKjwgUmVmZXJlbmNlIGNvdW50ICovCisgIERCdXNPYmplY3RTdWJ0cmVlICAgICAgICAgICAgICAgICAqcGFyZW50OyAgICAgICAgICAgICAgLyoqPCBQYXJlbnQgbm9kZSAqLworICBEQnVzT2JqZWN0UGF0aFVucmVnaXN0ZXJGdW5jdGlvbiAgIHVucmVnaXN0ZXJfZnVuY3Rpb247IC8qKjwgRnVuY3Rpb24gdG8gY2FsbCBvbiB1bnJlZ2lzdGVyICovCisgIERCdXNPYmplY3RQYXRoTWVzc2FnZUZ1bmN0aW9uICAgICAgbWVzc2FnZV9mdW5jdGlvbjsgICAgLyoqPCBGdW5jdGlvbiB0byBoYW5kbGUgbWVzc2FnZXMgKi8KKyAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp1c2VyX2RhdGE7ICAgICAgICAgICAvKio8IERhdGEgZm9yIGZ1bmN0aW9ucyAqLworICBEQnVzT2JqZWN0U3VidHJlZSAgICAgICAgICAgICAgICAqKnN1YnRyZWVzOyAgICAgICAgICAgIC8qKjwgQ2hpbGQgbm9kZXMgKi8KKyAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuX3N1YnRyZWVzOyAgICAgICAgICAvKio8IE51bWJlciBvZiBjaGlsZCBub2RlcyAqLworICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9zdWJ0cmVlczsgICAgICAgIC8qKjwgTnVtYmVyIG9mIGFsbG9jYXRlZCBlbnRyaWVzIGluIHN1YnRyZWVzICovCisgIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgICAgICAgICAgaW52b2tlX2FzX2ZhbGxiYWNrIDogMTsgLyoqPCBXaGV0aGVyIHRvIGludm9rZSBtZXNzYWdlX2Z1bmN0aW9uIHdoZW4gY2hpbGQgbm9kZXMgZG9uJ3QgaGFuZGxlIHRoZSBtZXNzYWdlICovCisgIGNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZVsxXTsgLyoqPCBBbGxvY2F0ZWQgYXMgbGFyZ2UgYXMgbmVjZXNzYXJ5ICovCit9OworCisvKioKKyAqIENyZWF0ZXMgYSBuZXcgb2JqZWN0IHRyZWUsIHJlcHJlc2VudGluZyBhIG1hcHBpbmcgZnJvbSBwYXRocworICogdG8gaGFuZGxlciB2dGFibGVzLgorICoKKyAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjb25uZWN0aW9uIHRoaXMgdHJlZSBiZWxvbmdzIHRvCisgKiBAcmV0dXJucyB0aGUgbmV3IHRyZWUgb3IgI05VTEwgaWYgbm8gbWVtb3J5CisgKi8KK0RCdXNPYmplY3RUcmVlKgorX2RidXNfb2JqZWN0X3RyZWVfbmV3IChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgREJ1c09iamVjdFRyZWUgKnRyZWU7CisKKyAgLyogdGhlIGNvbm5lY3Rpb24gcGFzc2VkIGluIGhlcmUgaXNuJ3QgZnVsbHkgY29uc3RydWN0ZWQsCisgICAqIHNvIGRvbid0IGRvIGFueXRoaW5nIG1vcmUgdGhhbiBzdG9yZSBhIHBvaW50ZXIgdG8KKyAgICogaXQKKyAgICovCisKKyAgdHJlZSA9IGRidXNfbmV3MCAoREJ1c09iamVjdFRyZWUsIDEpOworICBpZiAodHJlZSA9PSBOVUxMKQorICAgIGdvdG8gb29tOworCisgIHRyZWUtPnJlZmNvdW50ID0gMTsKKyAgdHJlZS0+Y29ubmVjdGlvbiA9IGNvbm5lY3Rpb247CisgIHRyZWUtPnJvb3QgPSBfZGJ1c19vYmplY3Rfc3VidHJlZV9uZXcgKCIvIiwgTlVMTCwgTlVMTCk7CisgIGlmICh0cmVlLT5yb290ID09IE5VTEwpCisgICAgZ290byBvb207CisgIHRyZWUtPnJvb3QtPmludm9rZV9hc19mYWxsYmFjayA9IFRSVUU7CisgIAorICByZXR1cm4gdHJlZTsKKworIG9vbToKKyAgaWYgKHRyZWUpCisgICAgeworICAgICAgZGJ1c19mcmVlICh0cmVlKTsKKyAgICB9CisKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogSW5jcmVtZW50IHRoZSByZWZlcmVuY2UgY291bnQKKyAqIEBwYXJhbSB0cmVlIHRoZSBvYmplY3QgdHJlZQorICogQHJldHVybnMgdGhlIG9iamVjdCB0cmVlCisgKi8KK0RCdXNPYmplY3RUcmVlICoKK19kYnVzX29iamVjdF90cmVlX3JlZiAoREJ1c09iamVjdFRyZWUgKnRyZWUpCit7CisgIF9kYnVzX2Fzc2VydCAodHJlZS0+cmVmY291bnQgPiAwKTsKKworICB0cmVlLT5yZWZjb3VudCArPSAxOworCisgIHJldHVybiB0cmVlOworfQorCisvKioKKyAqIERlY3JlbWVudCB0aGUgcmVmZXJlbmNlIGNvdW50CisgKiBAcGFyYW0gdHJlZSB0aGUgb2JqZWN0IHRyZWUKKyAqLwordm9pZAorX2RidXNfb2JqZWN0X3RyZWVfdW5yZWYgKERCdXNPYmplY3RUcmVlICp0cmVlKQoreworICBfZGJ1c19hc3NlcnQgKHRyZWUtPnJlZmNvdW50ID4gMCk7CisKKyAgdHJlZS0+cmVmY291bnQgLT0gMTsKKworICBpZiAodHJlZS0+cmVmY291bnQgPT0gMCkKKyAgICB7CisgICAgICBfZGJ1c19vYmplY3RfdHJlZV9mcmVlX2FsbF91bmxvY2tlZCAodHJlZSk7CisKKyAgICAgIGRidXNfZnJlZSAodHJlZSk7CisgICAgfQorfQorCisvKiogU2V0IHRvIDEgdG8gZ2V0IGEgYnVuY2ggb2YgZGVidWcgc3BldyBhYm91dCBmaW5kaW5nIHRoZQorICogc3VidHJlZSBub2RlcworICovCisjZGVmaW5lIFZFUkJPU0VfRklORCAwCisKK3N0YXRpYyBEQnVzT2JqZWN0U3VidHJlZSoKK2ZpbmRfc3VidHJlZV9yZWN1cnNlIChEQnVzT2JqZWN0U3VidHJlZSAgKnN1YnRyZWUsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgKipwYXRoLAorICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgICAgY3JlYXRlX2lmX25vdF9mb3VuZCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgKmluZGV4X2luX3BhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICAgKmV4YWN0X21hdGNoKQoreworICBpbnQgaSwgajsKKyAgZGJ1c19ib29sX3QgcmV0dXJuX2RlZXBlc3RfbWF0Y2g7CisKKyAgcmV0dXJuX2RlZXBlc3RfbWF0Y2ggPSBleGFjdF9tYXRjaCAhPSBOVUxMOworCisgIF9kYnVzX2Fzc2VydCAoIShyZXR1cm5fZGVlcGVzdF9tYXRjaCAmJiBjcmVhdGVfaWZfbm90X2ZvdW5kKSk7CisKKyAgaWYgKHBhdGhbMF0gPT0gTlVMTCkKKyAgICB7CisjaWYgVkVSQk9TRV9GSU5ECisgICAgICBfZGJ1c192ZXJib3NlICgiICBwYXRoIGV4aGF1c3RlZCwgcmV0dXJuaW5nICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgc3VidHJlZS0+bmFtZSk7CisjZW5kaWYKKyAgICAgIGlmIChleGFjdF9tYXRjaCAhPSBOVUxMKQorCSpleGFjdF9tYXRjaCA9IFRSVUU7CisgICAgICByZXR1cm4gc3VidHJlZTsKKyAgICB9CisKKyNpZiBWRVJCT1NFX0ZJTkQKKyAgX2RidXNfdmVyYm9zZSAoIiAgc2VhcmNoaW5nIGNoaWxkcmVuIG9mICVzIGZvciAlc1xuIiwKKyAgICAgICAgICAgICAgICAgc3VidHJlZS0+bmFtZSwgcGF0aFswXSk7CisjZW5kaWYKKyAgCisgIGkgPSAwOworICBqID0gc3VidHJlZS0+bl9zdWJ0cmVlczsKKyAgd2hpbGUgKGkgPCBqKQorICAgIHsKKyAgICAgIGludCBrLCB2OworCisgICAgICBrID0gKGkgKyBqKSAvIDI7CisgICAgICB2ID0gc3RyY21wIChwYXRoWzBdLCBzdWJ0cmVlLT5zdWJ0cmVlc1trXS0+bmFtZSk7CisKKyNpZiBWRVJCT1NFX0ZJTkQKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgICVzIGNtcCAlcyA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgcGF0aFswXSwgc3VidHJlZS0+c3VidHJlZXNba10tPm5hbWUsCisgICAgICAgICAgICAgICAgICAgICB2KTsKKyNlbmRpZgorICAgICAgCisgICAgICBpZiAodiA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGluZGV4X2luX3BhcmVudCkKKyAgICAgICAgICAgIHsKKyNpZiBWRVJCT1NFX0ZJTkQKKyAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiAgc3RvcmluZyBwYXJlbnQgaW5kZXggJWRcbiIsIGspOworI2VuZGlmCisgICAgICAgICAgICAgICppbmRleF9pbl9wYXJlbnQgPSBrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKHJldHVybl9kZWVwZXN0X21hdGNoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBEQnVzT2JqZWN0U3VidHJlZSAqbmV4dDsKKworICAgICAgICAgICAgICBuZXh0ID0gZmluZF9zdWJ0cmVlX3JlY3Vyc2UgKHN1YnRyZWUtPnN1YnRyZWVzW2tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXRoWzFdLCBjcmVhdGVfaWZfbm90X2ZvdW5kLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleF9pbl9wYXJlbnQsIGV4YWN0X21hdGNoKTsKKyAgICAgICAgICAgICAgaWYgKG5leHQgPT0gTlVMTCAmJgorICAgICAgICAgICAgICAgICAgc3VidHJlZS0+aW52b2tlX2FzX2ZhbGxiYWNrKQorICAgICAgICAgICAgICAgIHsKKyNpZiBWRVJCT1NFX0ZJTkQKKyAgICAgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgIG5vIGRlZXBlciBtYXRjaCBmb3VuZCwgcmV0dXJuaW5nICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VidHJlZS0+bmFtZSk7CisjZW5kaWYKKwkJICBpZiAoZXhhY3RfbWF0Y2ggIT0gTlVMTCkKKwkJICAgICpleGFjdF9tYXRjaCA9IEZBTFNFOworICAgICAgICAgICAgICAgICAgcmV0dXJuIHN1YnRyZWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIG5leHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIGZpbmRfc3VidHJlZV9yZWN1cnNlIChzdWJ0cmVlLT5zdWJ0cmVlc1trXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhdGhbMV0sIGNyZWF0ZV9pZl9ub3RfZm91bmQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleF9pbl9wYXJlbnQsIGV4YWN0X21hdGNoKTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAodiA8IDApCisgICAgICAgIHsKKyAgICAgICAgICBqID0gazsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgaSA9IGsgKyAxOworICAgICAgICB9CisgICAgfQorCisjaWYgVkVSQk9TRV9GSU5ECisgIF9kYnVzX3ZlcmJvc2UgKCIgIG5vIG1hdGNoIGZvdW5kLCBjdXJyZW50IHRyZWUgJXMsIGNyZWF0ZV9pZl9ub3RfZm91bmQgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgc3VidHJlZS0+bmFtZSwgY3JlYXRlX2lmX25vdF9mb3VuZCk7CisjZW5kaWYKKyAgCisgIGlmIChjcmVhdGVfaWZfbm90X2ZvdW5kKQorICAgIHsKKyAgICAgIERCdXNPYmplY3RTdWJ0cmVlKiBjaGlsZDsKKyAgICAgIGludCBjaGlsZF9wb3MsIG5ld19uX3N1YnRyZWVzOworCisjaWYgVkVSQk9TRV9GSU5ECisgICAgICBfZGJ1c192ZXJib3NlICgiICBjcmVhdGluZyBzdWJ0cmVlICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgcGF0aFswXSk7CisjZW5kaWYKKyAgICAgIAorICAgICAgY2hpbGQgPSBfZGJ1c19vYmplY3Rfc3VidHJlZV9uZXcgKHBhdGhbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCk7CisgICAgICBpZiAoY2hpbGQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICAgIG5ld19uX3N1YnRyZWVzID0gc3VidHJlZS0+bl9zdWJ0cmVlcyArIDE7CisgICAgICBpZiAobmV3X25fc3VidHJlZXMgPiBzdWJ0cmVlLT5tYXhfc3VidHJlZXMpCisgICAgICAgIHsKKyAgICAgICAgICBpbnQgbmV3X21heF9zdWJ0cmVlczsKKyAgICAgICAgICBEQnVzT2JqZWN0U3VidHJlZSAqKm5ld19zdWJ0cmVlczsKKworICAgICAgICAgIG5ld19tYXhfc3VidHJlZXMgPSBzdWJ0cmVlLT5tYXhfc3VidHJlZXMgPT0gMCA/IDEgOiAyICogc3VidHJlZS0+bWF4X3N1YnRyZWVzOworICAgICAgICAgIG5ld19zdWJ0cmVlcyA9IGRidXNfcmVhbGxvYyAoc3VidHJlZS0+c3VidHJlZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfbWF4X3N1YnRyZWVzICogc2l6ZW9mIChEQnVzT2JqZWN0U3VidHJlZSopKTsKKyAgICAgICAgICBpZiAobmV3X3N1YnRyZWVzID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX29iamVjdF9zdWJ0cmVlX3VucmVmIChjaGlsZCk7CisgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgIHN1YnRyZWUtPnN1YnRyZWVzID0gbmV3X3N1YnRyZWVzOworICAgICAgICAgIHN1YnRyZWUtPm1heF9zdWJ0cmVlcyA9IG5ld19tYXhfc3VidHJlZXM7CisgICAgICAgIH0KKworICAgICAgLyogVGhlIGJpbmFyeSBzZWFyY2ggZmFpbGVkLCBzbyBpID09IGogcG9pbnRzIHRvIHRoZSAKKyAgICAgICAgIHBsYWNlIHRoZSBjaGlsZCBzaG91bGQgYmUgaW5zZXJ0ZWQuICovCisgICAgICBjaGlsZF9wb3MgPSBpOworICAgICAgX2RidXNfYXNzZXJ0IChjaGlsZF9wb3MgPCBuZXdfbl9zdWJ0cmVlcyAmJgorICAgICAgICAgICAgICAgICAgICBuZXdfbl9zdWJ0cmVlcyA8PSBzdWJ0cmVlLT5tYXhfc3VidHJlZXMpOworICAgICAgaWYgKGNoaWxkX3BvcyArIDEgPCBuZXdfbl9zdWJ0cmVlcykKKwl7CisJICBtZW1tb3ZlICgmc3VidHJlZS0+c3VidHJlZXNbY2hpbGRfcG9zKzFdLCAKKwkJICAgJnN1YnRyZWUtPnN1YnRyZWVzW2NoaWxkX3Bvc10sIAorCQkgICAobmV3X25fc3VidHJlZXMgLSBjaGlsZF9wb3MgLSAxKSAqIAorCQkgICBzaXplb2Ygc3VidHJlZS0+c3VidHJlZXNbMF0pOworCX0KKyAgICAgIHN1YnRyZWUtPnN1YnRyZWVzW2NoaWxkX3Bvc10gPSBjaGlsZDsKKworICAgICAgaWYgKGluZGV4X2luX3BhcmVudCkKKyAgICAgICAgKmluZGV4X2luX3BhcmVudCA9IGNoaWxkX3BvczsKKyAgICAgIHN1YnRyZWUtPm5fc3VidHJlZXMgPSBuZXdfbl9zdWJ0cmVlczsKKyAgICAgIGNoaWxkLT5wYXJlbnQgPSBzdWJ0cmVlOworCisgICAgICByZXR1cm4gZmluZF9zdWJ0cmVlX3JlY3Vyc2UgKGNoaWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGF0aFsxXSwgY3JlYXRlX2lmX25vdF9mb3VuZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4X2luX3BhcmVudCwgZXhhY3RfbWF0Y2gpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmIChleGFjdF9tYXRjaCAhPSBOVUxMKQorCSpleGFjdF9tYXRjaCA9IEZBTFNFOworICAgICAgcmV0dXJuIChyZXR1cm5fZGVlcGVzdF9tYXRjaCAmJiBzdWJ0cmVlLT5pbnZva2VfYXNfZmFsbGJhY2spID8gc3VidHJlZSA6IE5VTEw7CisgICAgfQorfQorCisjaWZkZWYgREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMKK3N0YXRpYyBEQnVzT2JqZWN0U3VidHJlZSoKK2ZpbmRfc3VidHJlZSAoREJ1c09iamVjdFRyZWUgKnRyZWUsCisgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgKipwYXRoLAorICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAqaW5kZXhfaW5fcGFyZW50KQoreworICBEQnVzT2JqZWN0U3VidHJlZSAqc3VidHJlZTsKKworI2lmIFZFUkJPU0VfRklORAorICBfZGJ1c192ZXJib3NlICgiTG9va2luZyBmb3IgZXhhY3QgcmVnaXN0ZXJlZCBzdWJ0cmVlXG4iKTsKKyNlbmRpZgorICAKKyAgc3VidHJlZSA9IGZpbmRfc3VidHJlZV9yZWN1cnNlICh0cmVlLT5yb290LCBwYXRoLCBGQUxTRSwgaW5kZXhfaW5fcGFyZW50LCBOVUxMKTsKKworICBpZiAoc3VidHJlZSAmJiBzdWJ0cmVlLT5tZXNzYWdlX2Z1bmN0aW9uID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisgIGVsc2UKKyAgICByZXR1cm4gc3VidHJlZTsKK30KKyNlbmRpZgorCitzdGF0aWMgREJ1c09iamVjdFN1YnRyZWUqCitsb29rdXBfc3VidHJlZSAoREJ1c09iamVjdFRyZWUgKnRyZWUsCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAqKnBhdGgpCit7CisjaWYgVkVSQk9TRV9GSU5ECisgIF9kYnVzX3ZlcmJvc2UgKCJMb29raW5nIGZvciBzdWJ0cmVlXG4iKTsKKyNlbmRpZgorICByZXR1cm4gZmluZF9zdWJ0cmVlX3JlY3Vyc2UgKHRyZWUtPnJvb3QsIHBhdGgsIEZBTFNFLCBOVUxMLCBOVUxMKTsKK30KKworc3RhdGljIERCdXNPYmplY3RTdWJ0cmVlKgorZmluZF9oYW5kbGVyIChEQnVzT2JqZWN0VHJlZSAqdHJlZSwKKyAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAqKnBhdGgsCisgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICpleGFjdF9tYXRjaCkKK3sKKyNpZiBWRVJCT1NFX0ZJTkQKKyAgX2RidXNfdmVyYm9zZSAoIkxvb2tpbmcgZm9yIGRlZXBlc3QgaGFuZGxlclxuIik7CisjZW5kaWYKKyAgX2RidXNfYXNzZXJ0IChleGFjdF9tYXRjaCAhPSBOVUxMKTsKKworICAqZXhhY3RfbWF0Y2ggPSBGQUxTRTsgLyogZW5zdXJlIGFsd2F5cyBpbml0aWFsaXplZCAqLworICAKKyAgcmV0dXJuIGZpbmRfc3VidHJlZV9yZWN1cnNlICh0cmVlLT5yb290LCBwYXRoLCBGQUxTRSwgTlVMTCwgZXhhY3RfbWF0Y2gpOworfQorCitzdGF0aWMgREJ1c09iamVjdFN1YnRyZWUqCitlbnN1cmVfc3VidHJlZSAoREJ1c09iamVjdFRyZWUgKnRyZWUsCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAqKnBhdGgpCit7CisjaWYgVkVSQk9TRV9GSU5ECisgIF9kYnVzX3ZlcmJvc2UgKCJFbnN1cmluZyBzdWJ0cmVlXG4iKTsKKyNlbmRpZgorICByZXR1cm4gZmluZF9zdWJ0cmVlX3JlY3Vyc2UgKHRyZWUtPnJvb3QsIHBhdGgsIFRSVUUsIE5VTEwsIE5VTEwpOworfQorCitzdGF0aWMgY2hhciAqZmxhdHRlbl9wYXRoIChjb25zdCBjaGFyICoqcGF0aCk7CisKKy8qKgorICogUmVnaXN0ZXJzIGEgbmV3IHN1YnRyZWUgaW4gdGhlIGdsb2JhbCBvYmplY3QgdHJlZS4KKyAqCisgKiBAcGFyYW0gdHJlZSB0aGUgZ2xvYmFsIG9iamVjdCB0cmVlCisgKiBAcGFyYW0gZmFsbGJhY2sgI1RSVUUgdG8gaGFuZGxlIG1lc3NhZ2VzIHRvIGNoaWxkcmVuIG9mIHRoaXMgcGF0aAorICogQHBhcmFtIHBhdGggTlVMTC10ZXJtaW5hdGVkIGFycmF5IG9mIHBhdGggZWxlbWVudHMgZ2l2aW5nIHBhdGggdG8gc3VidHJlZQorICogQHBhcmFtIHZ0YWJsZSB0aGUgdnRhYmxlIHVzZWQgdG8gdHJhdmVyc2UgdGhpcyBzdWJ0cmVlCisgKiBAcGFyYW0gdXNlcl9kYXRhIHVzZXIgZGF0YSB0byBwYXNzIHRvIG1ldGhvZHMgaW4gdGhlIHZ0YWJsZQorICogQHBhcmFtIGVycm9yIGFkZHJlc3Mgd2hlcmUgYW4gZXJyb3IgY2FuIGJlIHJldHVybmVkCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgYW4gZXJyb3IgKCNEQlVTX0VSUk9SX05PX01FTU9SWSBvcgorICogICAgI0RCVVNfRVJST1JfT0JKRUNUX1BBVEhfSU5fVVNFKSBpcyByZXBvcnRlZAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfb2JqZWN0X3RyZWVfcmVnaXN0ZXIgKERCdXNPYmplY3RUcmVlICAgICAgICAgICAgICAqdHJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICAgICAgICAgICAgIGZhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICAgICAgICAgICoqcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzT2JqZWN0UGF0aFZUYWJsZSAgKnZ0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgKnVzZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAgICAgICAgICAgKmVycm9yKQoreworICBEQnVzT2JqZWN0U3VidHJlZSAgKnN1YnRyZWU7CisKKyAgX2RidXNfYXNzZXJ0ICh0cmVlICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKHZ0YWJsZS0+bWVzc2FnZV9mdW5jdGlvbiAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChwYXRoICE9IE5VTEwpOworCisgIHN1YnRyZWUgPSBlbnN1cmVfc3VidHJlZSAodHJlZSwgcGF0aCk7CisgIGlmIChzdWJ0cmVlID09IE5VTEwpCisgICAgeworICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoc3VidHJlZS0+bWVzc2FnZV9mdW5jdGlvbiAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChlcnJvciAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgY2hhciAqY29tcGxldGVfcGF0aCA9IGZsYXR0ZW5fcGF0aCAocGF0aCk7CisKKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfT0JKRUNUX1BBVEhfSU5fVVNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiQSBoYW5kbGVyIGlzIGFscmVhZHkgcmVnaXN0ZXJlZCBmb3IgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZV9wYXRoID8gY29tcGxldGVfcGF0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIihjYW5ub3QgcmVwcmVzZW50IHBhdGg6IG91dCBvZiBtZW1vcnkhKSIpOworCisgICAgICAgICAgZGJ1c19mcmVlIChjb21wbGV0ZV9wYXRoKTsKKyAgICAgICAgfQorCisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHN1YnRyZWUtPm1lc3NhZ2VfZnVuY3Rpb24gPSB2dGFibGUtPm1lc3NhZ2VfZnVuY3Rpb247CisgIHN1YnRyZWUtPnVucmVnaXN0ZXJfZnVuY3Rpb24gPSB2dGFibGUtPnVucmVnaXN0ZXJfZnVuY3Rpb247CisgIHN1YnRyZWUtPnVzZXJfZGF0YSA9IHVzZXJfZGF0YTsKKyAgc3VidHJlZS0+aW52b2tlX2FzX2ZhbGxiYWNrID0gZmFsbGJhY2sgIT0gRkFMU0U7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogQXR0ZW1wdHMgdG8gdW5yZWdpc3RlciB0aGUgZ2l2ZW4gc3VidHJlZS4gIElmIHRoZSBzdWJ0cmVlIGlzIHJlZ2lzdGVyZWQsCisgKiBzdG9yZXMgaXRzIHVucmVnaXN0ZXIgZnVuY3Rpb24gYW5kIHVzZXIgZGF0YSBmb3IgbGF0ZXIgdXNlIGFuZCByZXR1cm5zCisgKiAjVFJVRS4gIElmIHN1YnRyZWUgaXMgbm90IHJlZ2lzdGVyZWQsIHNpbXBseSByZXR1cm5zICNGQUxTRS4gIERvZXMgbm90IGZyZWUKKyAqIHN1YnRyZWUgb3IgcmVtb3ZlIGl0IGZyb20gdGhlIG9iamVjdCB0cmVlLgorICoKKyAqIEBwYXJhbSBzdWJ0cmVlIHRoZSBzdWJ0cmVlIHRvIHVucmVnaXN0ZXIKKyAqIEBwYXJhbSB1bnJlZ2lzdGVyX2Z1bmN0aW9uX291dCBzdG9yZXMgc3VidHJlZSdzIHVucmVnaXN0ZXJfZnVuY3Rpb24KKyAqIEBwYXJhbSB1c2VyX2RhdGFfb3V0IHN0b3JlcyBzdWJ0cmVlJ3MgdXNlcl9kYXRhCisgKiBAcmV0dXJuICNGQUxTRSBpZiB0aGUgc3VidHJlZSB3YXMgbm90IHJlZ2lzdGVyZWQsICNUUlVFIG9uIHN1Y2Nlc3MKKyAqLworc3RhdGljIGRidXNfYm9vbF90Cit1bnJlZ2lzdGVyX3N1YnRyZWUgKERCdXNPYmplY3RTdWJ0cmVlICAgICAgICAgICAgICAgICAqc3VidHJlZSwKKyAgICAgICAgICAgICAgICAgICAgREJ1c09iamVjdFBhdGhVbnJlZ2lzdGVyRnVuY3Rpb24gICp1bnJlZ2lzdGVyX2Z1bmN0aW9uX291dCwKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKip1c2VyX2RhdGFfb3V0KQoreworICBfZGJ1c19hc3NlcnQgKHN1YnRyZWUgIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAodW5yZWdpc3Rlcl9mdW5jdGlvbl9vdXQgIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAodXNlcl9kYXRhX291dCAhPSBOVUxMKTsKKworICAvKiBDb25maXJtIHN1YnRyZWUgaXMgcmVnaXN0ZXJlZCAqLworICBpZiAoc3VidHJlZS0+bWVzc2FnZV9mdW5jdGlvbiAhPSBOVUxMKQorICAgIHsKKyAgICAgIHN1YnRyZWUtPm1lc3NhZ2VfZnVuY3Rpb24gPSBOVUxMOworCisgICAgICAqdW5yZWdpc3Rlcl9mdW5jdGlvbl9vdXQgPSBzdWJ0cmVlLT51bnJlZ2lzdGVyX2Z1bmN0aW9uOworICAgICAgKnVzZXJfZGF0YV9vdXQgPSBzdWJ0cmVlLT51c2VyX2RhdGE7CisKKyAgICAgIHN1YnRyZWUtPnVucmVnaXN0ZXJfZnVuY3Rpb24gPSBOVUxMOworICAgICAgc3VidHJlZS0+dXNlcl9kYXRhID0gTlVMTDsKKworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogQXNzZXJ0IHRoYXQgdGhpcyB1bnJlZ2lzdGVyZWQgc3VidHJlZSBpcyBlaXRoZXIgdGhlIHJvb3Qgbm9kZSBvciBoYXMKKyAgICAgICAgIGNoaWxkcmVuLCBvdGhlcndpc2Ugd2UgaGF2ZSBhIGRhbmdsaW5nIHBhdGggd2hpY2ggc2hvdWxkIG5ldmVyCisgICAgICAgICBoYXBwZW4gKi8KKyAgICAgIF9kYnVzX2Fzc2VydCAoc3VidHJlZS0+cGFyZW50ID09IE5VTEwgfHwgc3VidHJlZS0+bl9zdWJ0cmVlcyA+IDApOworCisgICAgICAvKiBUaGUgc3VidHJlZSBpcyBub3QgcmVnaXN0ZXJlZCAqLworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KK30KKworLyoqCisgKiBBdHRlbXB0cyB0byByZW1vdmUgYSBjaGlsZCBzdWJ0cmVlIGZyb20gaXRzIHBhcmVudC4gIElmIHJlbW92YWwgaXMKKyAqIHN1Y2Nlc3NmdWwsIGFsc28gZnJlZXMgdGhlIGNoaWxkLiAgUmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzLCAjRkFMU0UKKyAqIG90aGVyd2lzZS4gIEEgI0ZBTFNFIHJldHVybiB2YWx1ZSB0ZWxscyB1bnJlZ2lzdGVyX2FuZF9mcmVlX3BhdGhfcmVjdXJzZSB0bworICogc3RvcCBhdHRlbXB0aW5nIHRvIHJlbW92ZSBhbmNlc3RvcnMsIGkuZS4sIHRoYXQgbm8gYW5jZXN0b3JzIG9mIHRoZQorICogc3BlY2lmaWVkIGNoaWxkIGFyZSBlbGlnaWJsZSBmb3IgcmVtb3ZhbC4KKyAqCisgKiBAcGFyYW0gcGFyZW50IHBhcmVudCBmcm9tIHdoaWNoIHRvIHJlbW92ZSBjaGlsZAorICogQHBhcmFtIGNoaWxkX2luZGV4IHBhcmVudC0+c3VidHJlZXMgaW5kZXggb2YgY2hpbGQgdG8gcmVtb3ZlCisgKiBAcmV0dXJuICNUUlVFIGlmIHJlbW92YWwgYW5kIGZyZWUgc3VjY2VlZCwgI0ZBTFNFIG90aGVyd2lzZQorICovCitzdGF0aWMgZGJ1c19ib29sX3QKK2F0dGVtcHRfY2hpbGRfcmVtb3ZhbCAoREJ1c09iamVjdFN1YnRyZWUgICpwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGlsZF9pbmRleCkKK3sKKyAgLyogQ2FuZGlkYXRlIGZvciByZW1vdmFsICovCisgIERCdXNPYmplY3RTdWJ0cmVlKiBjYW5kaWRhdGU7CisKKyAgX2RidXNfYXNzZXJ0IChwYXJlbnQgIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAoY2hpbGRfaW5kZXggPj0gMCAmJiBjaGlsZF9pbmRleCA8IHBhcmVudC0+bl9zdWJ0cmVlcyk7CisKKyAgY2FuZGlkYXRlID0gcGFyZW50LT5zdWJ0cmVlc1tjaGlsZF9pbmRleF07CisgIF9kYnVzX2Fzc2VydCAoY2FuZGlkYXRlICE9IE5VTEwpOworCisgIGlmIChjYW5kaWRhdGUtPm5fc3VidHJlZXMgPT0gMCAmJiBjYW5kaWRhdGUtPm1lc3NhZ2VfZnVuY3Rpb24gPT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBUaGUgY2FuZGlkYXRlIG5vZGUgaXMgY2hpbGRsZXNzIGFuZCBpcyBub3QgYSByZWdpc3RlcmVkCisgICAgICAgICBwYXRoLCBzby4uLiAqLworCisgICAgICAvKiAuLi4gcmVtb3ZlIGl0IGZyb20gaXRzIHBhcmVudC4uLiAqLworICAgICAgLyogQXNzdW1lcyBhIDAtYnl0ZSBtZW1tb3ZlIGlzIE9LICovCisgICAgICBtZW1tb3ZlICgmcGFyZW50LT5zdWJ0cmVlc1tjaGlsZF9pbmRleF0sCisgICAgICAgICAgICAgICAmcGFyZW50LT5zdWJ0cmVlc1tjaGlsZF9pbmRleCArIDFdLAorICAgICAgICAgICAgICAgKHBhcmVudC0+bl9zdWJ0cmVlcyAtIGNoaWxkX2luZGV4IC0gMSkKKyAgICAgICAgICAgICAgICogc2l6ZW9mIChwYXJlbnQtPnN1YnRyZWVzWzBdKSk7CisgICAgICBwYXJlbnQtPm5fc3VidHJlZXMgLT0gMTsKKworICAgICAgLyogLi4uIGFuZCBmcmVlIGl0ICovCisgICAgICBjYW5kaWRhdGUtPnBhcmVudCA9IE5VTEw7CisgICAgICBfZGJ1c19vYmplY3Rfc3VidHJlZV91bnJlZiAoY2FuZGlkYXRlKTsKKworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKgorICogU2VhcmNoZXMgdGhlIG9iamVjdCB0cmVlIGZvciBhIHJlZ2lzdGVyZWQgc3VidHJlZSBub2RlIGF0IHRoZSBnaXZlbiBwYXRoLgorICogSWYgYSByZWdpc3RlcmVkIG5vZGUgaXMgZm91bmQsIGl0IGlzIHJlbW92ZWQgZnJvbSB0aGUgdHJlZSBhbmQgZnJlZWQsIGFuZAorICogVFJVRSBpcyByZXR1cm5lZC4gIElmIGEgcmVnaXN0ZXJlZCBzdWJ0cmVlIG5vZGUgaXMgbm90IGZvdW5kIGF0IHRoZSBnaXZlbgorICogcGF0aCwgdGhlIHRyZWUgaXMgbm90IG1vZGlmaWVkIGFuZCBGQUxTRSBpcyByZXR1cm5lZC4KKyAqCisgKiBUaGUgZm91bmQgbm9kZSdzIHVucmVnaXN0ZXJfZnVuY3Rpb24gYW5kIHVzZXJfZGF0YSBhcmUgcmV0dXJuZWQgaW4gdGhlCisgKiBjb3JyZXNwb25kaW5nIF9vdXQgYXJndW1lbnRzLiAgVGhlIGNhbGxlciBzaG91bGQgZGVmaW5lIHRoZXNlIHZhcmlhYmxlcyBhbmQKKyAqIHBhc3MgdGhlaXIgYWRkcmVzc2VzIGFzIGFyZ3VtZW50cy4KKyAqCisgKiBMaWtld2lzZSwgdGhlIGNhbGxlciBzaG91bGQgZGVmaW5lIGFuZCBzZXQgdG8gVFJVRSBhIGJvb2xlYW4gdmFyaWFibGUsIHRoZW4KKyAqIHBhc3MgaXRzIGFkZHJlc3MgYXMgdGhlIGNvbnRpbnVlX3JlbW92YWxfYXR0ZW1wdHMgYXJndW1lbnQuCisgKgorICogT25jZSBhIG1hdGNoaW5nIHJlZ2lzdGVyZWQgbm9kZSBpcyBmb3VuZCwgcmVtb3ZlZCBhbmQgZnJlZWQsIHRoZSByZWN1cnNpdmUKKyAqIHJldHVybiBwYXRoIGlzIHRyYXZlcnNlZC4gIEFsb25nIHRoZSB3YXksIGVsaWdpYmxlIGFuY2VzdG9yIG5vZGVzIGFyZQorICogcmVtb3ZlZCBhbmQgZnJlZWQuICBBbiBhbmNlc3RvciBub2RlIGlzIGVsaWdpYmxlIGZvciByZW1vdmFsIGlmIGFuZCBvbmx5IGlmCisgKiAxKSBpdCBoYXMgbm8gY2hpbGRyZW4sIGkuZS4sIGl0IGhhcyBiZWNvbWUgY2hpbGRsZXNzIGFuZCAyKSBpdCBpcyBub3QgaXRzZWxmCisgKiBhIHJlZ2lzdGVyZWQgaGFuZGxlci4KKyAqCisgKiBGb3IgZXhhbXBsZSwgc3VwcG9zZSAvQS9CIGFuZCAvQS9DIGFyZSByZWdpc3RlcmVkIHBhdGhzLCBhbmQgdGhhdCB0aGVzZSBhcmUKKyAqIHRoZSBvbmx5IHBhdGhzIGluIHRoZSB0cmVlLiAgSWYgQiBpcyByZW1vdmVkIGFuZCBmcmVlZCwgQyBpcyBzdGlsbCByZWFjaGFibGUKKyAqIHRocm91Z2ggQSwgc28gQSBjYW5ub3QgYmUgcmVtb3ZlZCBhbmQgZnJlZWQuICBJZiBDIGlzIHN1YnNlcXVlbnRseSByZW1vdmVkCisgKiBhbmQgZnJlZWQsIHRoZW4gQSBiZWNvbWVzIGEgY2hpbGRsZXNzIG5vZGUgYW5kIGl0IGJlY29tZXMgZWxpZ2libGUgZm9yCisgKiByZW1vdmFsLCBhbmQgd2lsbCBiZSByZW1vdmVkIGFuZCBmcmVlZC4KKyAqCisgKiBTaW1pbGFybHksIHN1cHBvc2UgL0EgaXMgYSByZWdpc3RlcmVkIHBhdGgsIGFuZCAvQS9CIGlzIGFsc28gYSByZWdpc3RlcmVkCisgKiBwYXRoLCBhbmQgdGhhdCB0aGVzZSBhcmUgdGhlIG9ubHkgcGF0aHMgaW4gdGhlIHRyZWUuICBJZiBCIGlzIHJlbW92ZWQgYW5kCisgKiBmcmVlZCwgdGhlbiBldmVuIHRob3VnaCBBIGhhcyBiZWNvbWUgY2hpbGRsZXNzLCBpdCBjYW4ndCBiZSBmcmVlZCBiZWNhdXNlIGl0CisgKiByZWZlcnMgdG8gYSBwYXRoIHRoYXQgaXMgc3RpbGwgcmVnaXN0ZXJlZC4KKyAqCisgKiBAcGFyYW0gc3VidHJlZSBzdWJ0cmVlIGZyb20gd2hpY2ggdG8gc3RhcnQgdGhlIHNlYXJjaCwgcm9vdCBmb3IgaW5pdGlhbCBjYWxsCisgKiBAcGFyYW0gcGF0aCBwYXRoIHRvIHN1YnRyZWUgKHNhbWUgYXMgX2RidXNfb2JqZWN0X3RyZWVfdW5yZWdpc3Rlcl9hbmRfdW5sb2NrKQorICogQHBhcmFtIGNvbnRpbnVlX3JlbW92YWxfYXR0ZW1wdHMgcG9pbnRlciB0byBhIGJvb2wsICNUUlVFIGZvciBpbml0aWFsIGNhbGwKKyAqIEBwYXJhbSB1bnJlZ2lzdGVyX2Z1bmN0aW9uX291dCByZXR1cm5zIHRoZSBmb3VuZCBub2RlJ3MgdW5yZWdpc3Rlcl9mdW5jdGlvbgorICogQHBhcmFtIHVzZXJfZGF0YV9vdXQgcmV0dXJucyB0aGUgZm91bmQgbm9kZSdzIHVzZXJfZGF0YQorICogQHJldHVybnMgI1RSVUUgaWYgYSByZWdpc3RlcmVkIG5vZGUgd2FzIGZvdW5kIGF0IHBhdGgsICNGQUxTRSBvdGhlcndpc2UKKyAqLworc3RhdGljIGRidXNfYm9vbF90Cit1bnJlZ2lzdGVyX2FuZF9mcmVlX3BhdGhfcmVjdXJzZQorKERCdXNPYmplY3RTdWJ0cmVlICAgICAgICAgICAgICAgICAqc3VidHJlZSwKKyBjb25zdCBjaGFyICAgICAgICAgICAgICAgICAgICAgICAqKnBhdGgsCisgZGJ1c19ib29sX3QgICAgICAgICAgICAgICAgICAgICAgICpjb250aW51ZV9yZW1vdmFsX2F0dGVtcHRzLAorIERCdXNPYmplY3RQYXRoVW5yZWdpc3RlckZ1bmN0aW9uICAqdW5yZWdpc3Rlcl9mdW5jdGlvbl9vdXQsCisgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKip1c2VyX2RhdGFfb3V0KQoreworICBpbnQgaSwgajsKKworICBfZGJ1c19hc3NlcnQgKGNvbnRpbnVlX3JlbW92YWxfYXR0ZW1wdHMgIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAoKmNvbnRpbnVlX3JlbW92YWxfYXR0ZW1wdHMpOworICBfZGJ1c19hc3NlcnQgKHVucmVnaXN0ZXJfZnVuY3Rpb25fb3V0ICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKHVzZXJfZGF0YV9vdXQgIT0gTlVMTCk7CisKKyAgaWYgKHBhdGhbMF0gPT0gTlVMTCkKKyAgICByZXR1cm4gdW5yZWdpc3Rlcl9zdWJ0cmVlIChzdWJ0cmVlLCB1bnJlZ2lzdGVyX2Z1bmN0aW9uX291dCwgdXNlcl9kYXRhX291dCk7CisKKyAgaSA9IDA7CisgIGogPSBzdWJ0cmVlLT5uX3N1YnRyZWVzOworICB3aGlsZSAoaSA8IGopCisgICAgeworICAgICAgaW50IGssIHY7CisKKyAgICAgIGsgPSAoaSArIGopIC8gMjsKKyAgICAgIHYgPSBzdHJjbXAgKHBhdGhbMF0sIHN1YnRyZWUtPnN1YnRyZWVzW2tdLT5uYW1lKTsKKworICAgICAgaWYgKHYgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfYm9vbF90IGZyZWVkOworICAgICAgICAgIGZyZWVkID0gdW5yZWdpc3Rlcl9hbmRfZnJlZV9wYXRoX3JlY3Vyc2UgKHN1YnRyZWUtPnN1YnRyZWVzW2tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXRoWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlX3JlbW92YWxfYXR0ZW1wdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5yZWdpc3Rlcl9mdW5jdGlvbl9vdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlcl9kYXRhX291dCk7CisgICAgICAgICAgaWYgKGZyZWVkICYmICpjb250aW51ZV9yZW1vdmFsX2F0dGVtcHRzKQorICAgICAgICAgICAgKmNvbnRpbnVlX3JlbW92YWxfYXR0ZW1wdHMgPSBhdHRlbXB0X2NoaWxkX3JlbW92YWwgKHN1YnRyZWUsIGspOworICAgICAgICAgIHJldHVybiBmcmVlZDsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAodiA8IDApCisgICAgICAgIHsKKyAgICAgICAgICBqID0gazsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgaSA9IGsgKyAxOworICAgICAgICB9CisgICAgfQorICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKgorICogVW5yZWdpc3RlcnMgYW4gb2JqZWN0IHN1YnRyZWUgdGhhdCB3YXMgcmVnaXN0ZXJlZCB3aXRoIHRoZQorICogc2FtZSBwYXRoLgorICoKKyAqIEBwYXJhbSB0cmVlIHRoZSBnbG9iYWwgb2JqZWN0IHRyZWUKKyAqIEBwYXJhbSBwYXRoIHBhdGggdG8gdGhlIHN1YnRyZWUgKHNhbWUgYXMgdGhlIG9uZSBwYXNzZWQgdG8gX2RidXNfb2JqZWN0X3RyZWVfcmVnaXN0ZXIoKSkKKyAqLwordm9pZAorX2RidXNfb2JqZWN0X3RyZWVfdW5yZWdpc3Rlcl9hbmRfdW5sb2NrIChEQnVzT2JqZWN0VHJlZSAgICAgICAgICAqdHJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgICAgICAqKnBhdGgpCit7CisgIGRidXNfYm9vbF90IGZvdW5kX3N1YnRyZWU7CisgIGRidXNfYm9vbF90IGNvbnRpbnVlX3JlbW92YWxfYXR0ZW1wdHM7CisgIERCdXNPYmplY3RQYXRoVW5yZWdpc3RlckZ1bmN0aW9uIHVucmVnaXN0ZXJfZnVuY3Rpb247CisgIHZvaWQgKnVzZXJfZGF0YTsKKyAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisKKyAgX2RidXNfYXNzZXJ0ICh0cmVlICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKHBhdGggIT0gTlVMTCk7CisKKyAgY29udGludWVfcmVtb3ZhbF9hdHRlbXB0cyA9IFRSVUU7CisgIHVucmVnaXN0ZXJfZnVuY3Rpb24gPSBOVUxMOworICB1c2VyX2RhdGEgPSBOVUxMOworCisgIGZvdW5kX3N1YnRyZWUgPSB1bnJlZ2lzdGVyX2FuZF9mcmVlX3BhdGhfcmVjdXJzZSAodHJlZS0+cm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb250aW51ZV9yZW1vdmFsX2F0dGVtcHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1bnJlZ2lzdGVyX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1c2VyX2RhdGEpOworCisjaWZuZGVmIERCVVNfRElTQUJMRV9DSEVDS1MKKyAgaWYgKGZvdW5kX3N1YnRyZWUgPT0gRkFMU0UpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkF0dGVtcHRlZCB0byB1bnJlZ2lzdGVyIHBhdGggKHBhdGhbMF0gPSAlcyBwYXRoWzFdID0gJXMpIHdoaWNoIGlzbid0IHJlZ2lzdGVyZWQiLAorICAgICAgICAgICAgICAgICAgcGF0aFswXSA/IHBhdGhbMF0gOiAibnVsbCIsCisgICAgICAgICAgICAgICAgICAocGF0aFswXSAmJiBwYXRoWzFdKSA/IHBhdGhbMV0gOiAibnVsbCIpOworICAgICAgZ290byB1bmxvY2s7ICAgIAorICAgIH0KKyNlbHNlCisgIF9kYnVzX2Fzc2VydCAoZm91bmRfc3VidHJlZSA9PSBUUlVFKTsKKyNlbmRpZgorCit1bmxvY2s6CisgIGNvbm5lY3Rpb24gPSB0cmVlLT5jb25uZWN0aW9uOworCisgIC8qIFVubG9jayBhbmQgY2FsbCBhcHBsaWNhdGlvbiBjb2RlICovCisjaWZkZWYgREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMKKyAgaWYgKGNvbm5lY3Rpb24pCisjZW5kaWYKKyAgICB7CisgICAgICBfZGJ1c19jb25uZWN0aW9uX3JlZl91bmxvY2tlZCAoY29ubmVjdGlvbik7CisgICAgICBfZGJ1c192ZXJib3NlICgidW5sb2NrXG4iKTsKKyAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fdW5sb2NrIChjb25uZWN0aW9uKTsKKyAgICB9CisKKyAgaWYgKHVucmVnaXN0ZXJfZnVuY3Rpb24pCisgICAgKCogdW5yZWdpc3Rlcl9mdW5jdGlvbikgKGNvbm5lY3Rpb24sIHVzZXJfZGF0YSk7CisKKyNpZmRlZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworICBpZiAoY29ubmVjdGlvbikKKyNlbmRpZgorICAgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoY29ubmVjdGlvbik7Cit9CisKK3N0YXRpYyB2b2lkCitmcmVlX3N1YnRyZWVfcmVjdXJzZSAoREJ1c0Nvbm5lY3Rpb24gICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgREJ1c09iamVjdFN1YnRyZWUgKnN1YnRyZWUpCit7CisgIC8qIERlbGV0ZSB0aGVtIGZyb20gdGhlIGVuZCwgZm9yIHNsaWdodGx5CisgICAqIG1vcmUgcm9idXN0bmVzcyBhZ2FpbnN0IG9kZCByZWVudHJhbmN5LgorICAgKi8KKyAgd2hpbGUgKHN1YnRyZWUtPm5fc3VidHJlZXMgPiAwKQorICAgIHsKKyAgICAgIERCdXNPYmplY3RTdWJ0cmVlICpjaGlsZDsKKworICAgICAgY2hpbGQgPSBzdWJ0cmVlLT5zdWJ0cmVlc1tzdWJ0cmVlLT5uX3N1YnRyZWVzIC0gMV07CisgICAgICBzdWJ0cmVlLT5zdWJ0cmVlc1tzdWJ0cmVlLT5uX3N1YnRyZWVzIC0gMV0gPSBOVUxMOworICAgICAgc3VidHJlZS0+bl9zdWJ0cmVlcyAtPSAxOworICAgICAgY2hpbGQtPnBhcmVudCA9IE5VTEw7CisKKyAgICAgIGZyZWVfc3VidHJlZV9yZWN1cnNlIChjb25uZWN0aW9uLCBjaGlsZCk7CisgICAgfQorCisgIC8qIENhbGwgYXBwbGljYXRpb24gY29kZSAqLworICBpZiAoc3VidHJlZS0+dW5yZWdpc3Rlcl9mdW5jdGlvbikKKyAgICAoKiBzdWJ0cmVlLT51bnJlZ2lzdGVyX2Z1bmN0aW9uKSAoY29ubmVjdGlvbiwKKwkJCQkgICAgICBzdWJ0cmVlLT51c2VyX2RhdGEpOworCisgIHN1YnRyZWUtPm1lc3NhZ2VfZnVuY3Rpb24gPSBOVUxMOworICBzdWJ0cmVlLT51bnJlZ2lzdGVyX2Z1bmN0aW9uID0gTlVMTDsKKyAgc3VidHJlZS0+dXNlcl9kYXRhID0gTlVMTDsKKworICAvKiBOb3cgZnJlZSBvdXJzZWx2ZXMgKi8KKyAgX2RidXNfb2JqZWN0X3N1YnRyZWVfdW5yZWYgKHN1YnRyZWUpOworfQorCisvKioKKyAqIEZyZWUgYWxsIHRoZSBoYW5kbGVycyBpbiB0aGUgdHJlZS4gTG9jayBvbiB0cmVlJ3MgY29ubmVjdGlvbgorICogbXVzdCBub3QgYmUgaGVsZC4KKyAqCisgKiBAcGFyYW0gdHJlZSB0aGUgb2JqZWN0IHRyZWUKKyAqLwordm9pZAorX2RidXNfb2JqZWN0X3RyZWVfZnJlZV9hbGxfdW5sb2NrZWQgKERCdXNPYmplY3RUcmVlICp0cmVlKQoreworICBpZiAodHJlZS0+cm9vdCkKKyAgICBmcmVlX3N1YnRyZWVfcmVjdXJzZSAodHJlZS0+Y29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdHJlZS0+cm9vdCk7CisgIHRyZWUtPnJvb3QgPSBOVUxMOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK19kYnVzX29iamVjdF90cmVlX2xpc3RfcmVnaXN0ZXJlZF91bmxvY2tlZCAoREJ1c09iamVjdFRyZWUgKnRyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgKipwYXJlbnRfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAgICoqKmNoaWxkX2VudHJpZXMpCit7CisgIERCdXNPYmplY3RTdWJ0cmVlICpzdWJ0cmVlOworICBjaGFyICoqcmV0dmFsOworICAKKyAgX2RidXNfYXNzZXJ0IChwYXJlbnRfcGF0aCAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChjaGlsZF9lbnRyaWVzICE9IE5VTEwpOworCisgICpjaGlsZF9lbnRyaWVzID0gTlVMTDsKKyAgCisgIHN1YnRyZWUgPSBsb29rdXBfc3VidHJlZSAodHJlZSwgcGFyZW50X3BhdGgpOworICBpZiAoc3VidHJlZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIHJldHZhbCA9IGRidXNfbmV3MCAoY2hhciAqLCAxKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpbnQgaTsKKyAgICAgIHJldHZhbCA9IGRidXNfbmV3MCAoY2hhciosIHN1YnRyZWUtPm5fc3VidHJlZXMgKyAxKTsKKyAgICAgIGlmIChyZXR2YWwgPT0gTlVMTCkKKyAgICAgICAgZ290byBvdXQ7CisgICAgICBpID0gMDsKKyAgICAgIHdoaWxlIChpIDwgc3VidHJlZS0+bl9zdWJ0cmVlcykKKyAgICAgICAgeworICAgICAgICAgIHJldHZhbFtpXSA9IF9kYnVzX3N0cmR1cCAoc3VidHJlZS0+c3VidHJlZXNbaV0tPm5hbWUpOworICAgICAgICAgIGlmIChyZXR2YWxbaV0gPT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c19mcmVlX3N0cmluZ19hcnJheSAocmV0dmFsKTsKKyAgICAgICAgICAgICAgcmV0dmFsID0gTlVMTDsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgKytpOworICAgICAgICB9CisgICAgfQorCisgb3V0OgorICAgIAorICAqY2hpbGRfZW50cmllcyA9IHJldHZhbDsKKyAgcmV0dXJuIHJldHZhbCAhPSBOVUxMOworfQorCitzdGF0aWMgREJ1c0hhbmRsZXJSZXN1bHQKK2hhbmRsZV9kZWZhdWx0X2ludHJvc3BlY3RfYW5kX3VubG9jayAoREJ1c09iamVjdFRyZWUgICAgICAgICAgKnRyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICAgICAgICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAgICAgICoqcGF0aCkKK3sKKyAgREJ1c1N0cmluZyB4bWw7CisgIERCdXNIYW5kbGVyUmVzdWx0IHJlc3VsdDsKKyAgY2hhciAqKmNoaWxkcmVuOworICBpbnQgaTsKKyAgREJ1c01lc3NhZ2UgKnJlcGx5OworICBEQnVzTWVzc2FnZUl0ZXIgaXRlcjsKKyAgY29uc3QgY2hhciAqdl9TVFJJTkc7CisgIGRidXNfYm9vbF90IGFscmVhZHlfdW5sb2NrZWQ7CisKKyAgLyogV2UgaGF2ZSB0aGUgY29ubmVjdGlvbiBsb2NrIGhlcmUgKi8KKworICBhbHJlYWR5X3VubG9ja2VkID0gRkFMU0U7CisgIAorICBfZGJ1c192ZXJib3NlICgiIGNvbnNpZGVyaW5nIGRlZmF1bHQgSW50cm9zcGVjdCgpIGhhbmRsZXIuLi5cbiIpOworCisgIHJlcGx5ID0gTlVMTDsKKyAgCisgIGlmICghZGJ1c19tZXNzYWdlX2lzX21ldGhvZF9jYWxsIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19JTlRFUkZBQ0VfSU5UUk9TUEVDVEFCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW50cm9zcGVjdCIpKQorICAgIHsKKyNpZmRlZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworICAgICAgaWYgKHRyZWUtPmNvbm5lY3Rpb24pCisjZW5kaWYKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJ1bmxvY2tcbiIpOworICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fdW5sb2NrICh0cmVlLT5jb25uZWN0aW9uKTsKKyAgICAgICAgfQorICAgICAgCisgICAgICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9OT1RfWUVUX0hBTkRMRUQ7CisgICAgfQorCisgIF9kYnVzX3ZlcmJvc2UgKCIgdXNpbmcgZGVmYXVsdCBJbnRyb3NwZWN0KCkgaGFuZGxlciFcbiIpOworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnhtbCkpCisgICAgeworI2lmZGVmIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTCisgICAgICBpZiAodHJlZS0+Y29ubmVjdGlvbikKKyNlbmRpZgorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoInVubG9ja1xuIik7CisgICAgICAgICAgX2RidXNfY29ubmVjdGlvbl91bmxvY2sgKHRyZWUtPmNvbm5lY3Rpb24pOworICAgICAgICB9CisKKyAgICAgIHJldHVybiBEQlVTX0hBTkRMRVJfUkVTVUxUX05FRURfTUVNT1JZOworICAgIH0KKworICByZXN1bHQgPSBEQlVTX0hBTkRMRVJfUkVTVUxUX05FRURfTUVNT1JZOworCisgIGNoaWxkcmVuID0gTlVMTDsKKyAgaWYgKCFfZGJ1c19vYmplY3RfdHJlZV9saXN0X3JlZ2lzdGVyZWRfdW5sb2NrZWQgKHRyZWUsIHBhdGgsICZjaGlsZHJlbikpCisgICAgZ290byBvdXQ7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmeG1sLCBEQlVTX0lOVFJPU1BFQ1RfMV8wX1hNTF9ET0NUWVBFX0RFQ0xfTk9ERSkpCisgICAgZ290byBvdXQ7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZ4bWwsICI8bm9kZT5cbiIpKQorICAgIGdvdG8gb3V0OworCisgIGkgPSAwOworICB3aGlsZSAoY2hpbGRyZW5baV0gIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfcHJpbnRmICgmeG1sLCAiICA8bm9kZSBuYW1lPVwiJXNcIi8+XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW5baV0pKQorICAgICAgICBnb3RvIG91dDsKKworICAgICAgKytpOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZ4bWwsICI8L25vZGU+XG4iKSkKKyAgICBnb3RvIG91dDsKKworICByZXBseSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX3JldHVybiAobWVzc2FnZSk7CisgIGlmIChyZXBseSA9PSBOVUxMKQorICAgIGdvdG8gb3V0OworCisgIGRidXNfbWVzc2FnZV9pdGVyX2luaXRfYXBwZW5kIChyZXBseSwgJml0ZXIpOworICB2X1NUUklORyA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJnhtbCk7CisgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljICgmaXRlciwgREJVU19UWVBFX1NUUklORywgJnZfU1RSSU5HKSkKKyAgICBnb3RvIG91dDsKKyAgCisjaWZkZWYgREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMKKyAgaWYgKHRyZWUtPmNvbm5lY3Rpb24pCisjZW5kaWYKKyAgICB7CisgICAgICBhbHJlYWR5X3VubG9ja2VkID0gVFJVRTsKKyAgICAgIAorICAgICAgaWYgKCFfZGJ1c19jb25uZWN0aW9uX3NlbmRfYW5kX3VubG9jayAodHJlZS0+Y29ubmVjdGlvbiwgcmVwbHksIE5VTEwpKQorICAgICAgICBnb3RvIG91dDsKKyAgICB9CisgIAorICByZXN1bHQgPSBEQlVTX0hBTkRMRVJfUkVTVUxUX0hBTkRMRUQ7CisgIAorIG91dDoKKyNpZmRlZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworICBpZiAodHJlZS0+Y29ubmVjdGlvbikKKyNlbmRpZgorICAgIHsKKyAgICAgIGlmICghYWxyZWFkeV91bmxvY2tlZCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJ1bmxvY2tcbiIpOworICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fdW5sb2NrICh0cmVlLT5jb25uZWN0aW9uKTsKKyAgICAgICAgfQorICAgIH0KKyAgCisgIF9kYnVzX3N0cmluZ19mcmVlICgmeG1sKTsKKyAgZGJ1c19mcmVlX3N0cmluZ19hcnJheSAoY2hpbGRyZW4pOworICBpZiAocmVwbHkpCisgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgIAorICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIFRyaWVzIHRvIGRpc3BhdGNoIGEgbWVzc2FnZSBieSBkaXJlY3RpbmcgaXQgdG8gaGFuZGxlciBmb3IgdGhlCisgKiBvYmplY3QgcGF0aCBsaXN0ZWQgaW4gdGhlIG1lc3NhZ2UgaGVhZGVyLCBpZiBhbnkuIE1lc3NhZ2VzIGFyZQorICogZGlzcGF0Y2hlZCBmaXJzdCB0byB0aGUgcmVnaXN0ZXJlZCBoYW5kbGVyIHRoYXQgbWF0Y2hlcyB0aGUgbGFyZ2VzdAorICogbnVtYmVyIG9mIHBhdGggZWxlbWVudHM7IHRoYXQgaXMsIG1lc3NhZ2UgdG8gL2Zvby9iYXIvYmF6IHdvdWxkIGdvCisgKiB0byB0aGUgaGFuZGxlciBmb3IgL2Zvby9iYXIgYmVmb3JlIHRoZSBvbmUgZm9yIC9mb28uCisgKgorICogQHRvZG8gdGhyZWFkIHByb2JsZW1zCisgKgorICogQHBhcmFtIHRyZWUgdGhlIGdsb2JhbCBvYmplY3QgdHJlZQorICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgdG8gZGlzcGF0Y2gKKyAqIEBwYXJhbSBmb3VuZF9vYmplY3QgcmV0dXJuIGxvY2F0aW9uIGZvciB0aGUgb2JqZWN0CisgKiBAcmV0dXJucyB3aGV0aGVyIG1lc3NhZ2Ugd2FzIGhhbmRsZWQgc3VjY2Vzc2Z1bGx5CisgKi8KK0RCdXNIYW5kbGVyUmVzdWx0CitfZGJ1c19vYmplY3RfdHJlZV9kaXNwYXRjaF9hbmRfdW5sb2NrIChEQnVzT2JqZWN0VHJlZSAgICAgICAgICAqdHJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICAgICAgICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgICAgICAgKmZvdW5kX29iamVjdCkKK3sKKyAgY2hhciAqKnBhdGg7CisgIGRidXNfYm9vbF90IGV4YWN0X21hdGNoOworICBEQnVzTGlzdCAqbGlzdDsKKyAgREJ1c0xpc3QgKmxpbms7CisgIERCdXNIYW5kbGVyUmVzdWx0IHJlc3VsdDsKKyAgREJ1c09iamVjdFN1YnRyZWUgKnN1YnRyZWU7CisgIAorI2lmIDAKKyAgX2RidXNfdmVyYm9zZSAoIkRpc3BhdGNoIG9mIG1lc3NhZ2UgYnkgb2JqZWN0IHBhdGhcbiIpOworI2VuZGlmCisgIAorICBwYXRoID0gTlVMTDsKKyAgaWYgKCFkYnVzX21lc3NhZ2VfZ2V0X3BhdGhfZGVjb21wb3NlZCAobWVzc2FnZSwgJnBhdGgpKQorICAgIHsKKyNpZmRlZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworICAgICAgaWYgKHRyZWUtPmNvbm5lY3Rpb24pCisjZW5kaWYKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJ1bmxvY2tcbiIpOworICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fdW5sb2NrICh0cmVlLT5jb25uZWN0aW9uKTsKKyAgICAgICAgfQorICAgICAgCisgICAgICBfZGJ1c192ZXJib3NlICgiTm8gbWVtb3J5IHRvIGdldCBkZWNvbXBvc2VkIHBhdGhcbiIpOworCisgICAgICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9ORUVEX01FTU9SWTsKKyAgICB9CisKKyAgaWYgKHBhdGggPT0gTlVMTCkKKyAgICB7CisjaWZkZWYgREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMKKyAgICAgIGlmICh0cmVlLT5jb25uZWN0aW9uKQorI2VuZGlmCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgidW5sb2NrXG4iKTsKKyAgICAgICAgICBfZGJ1c19jb25uZWN0aW9uX3VubG9jayAodHJlZS0+Y29ubmVjdGlvbik7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgX2RidXNfdmVyYm9zZSAoIk5vIHBhdGggZmllbGQgaW4gbWVzc2FnZVxuIik7CisgICAgICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9OT1RfWUVUX0hBTkRMRUQ7CisgICAgfQorICAKKyAgLyogRmluZCB0aGUgZGVlcGVzdCBwYXRoIHRoYXQgY292ZXJzIHRoZSBwYXRoIGluIHRoZSBtZXNzYWdlICovCisgIHN1YnRyZWUgPSBmaW5kX2hhbmRsZXIgKHRyZWUsIChjb25zdCBjaGFyKiopIHBhdGgsICZleGFjdF9tYXRjaCk7CisgIAorICBpZiAoZm91bmRfb2JqZWN0KQorICAgICpmb3VuZF9vYmplY3QgPSAhIXN1YnRyZWU7CisKKyAgLyogQnVpbGQgYSBsaXN0IG9mIGFsbCBwYXRocyB0aGF0IGNvdmVyIHRoZSBwYXRoIGluIHRoZSBtZXNzYWdlICovCisKKyAgbGlzdCA9IE5VTEw7CisKKyAgd2hpbGUgKHN1YnRyZWUgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoc3VidHJlZS0+bWVzc2FnZV9mdW5jdGlvbiAhPSBOVUxMICYmIChleGFjdF9tYXRjaCB8fCBzdWJ0cmVlLT5pbnZva2VfYXNfZmFsbGJhY2spKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfb2JqZWN0X3N1YnRyZWVfcmVmIChzdWJ0cmVlKTsKKworICAgICAgICAgIC8qIHJ1biBkZWVwZXN0IHBhdGhzIGZpcnN0ICovCisgICAgICAgICAgaWYgKCFfZGJ1c19saXN0X2FwcGVuZCAoJmxpc3QsIHN1YnRyZWUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICByZXN1bHQgPSBEQlVTX0hBTkRMRVJfUkVTVUxUX05FRURfTUVNT1JZOworICAgICAgICAgICAgICBfZGJ1c19vYmplY3Rfc3VidHJlZV91bnJlZiAoc3VidHJlZSk7CisgICAgICAgICAgICAgIGdvdG8gZnJlZV9hbmRfcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgIGV4YWN0X21hdGNoID0gRkFMU0U7CisgICAgICBzdWJ0cmVlID0gc3VidHJlZS0+cGFyZW50OworICAgIH0KKworICBfZGJ1c192ZXJib3NlICgiJWQgaGFuZGxlcnMgaW4gdGhlIHBhdGggdHJlZSBmb3IgdGhpcyBtZXNzYWdlXG4iLAorICAgICAgICAgICAgICAgICBfZGJ1c19saXN0X2dldF9sZW5ndGggKCZsaXN0KSk7CisKKyAgLyogSW52b2tlIGVhY2ggaGFuZGxlciBpbiB0aGUgbGlzdCAqLworCisgIHJlc3VsdCA9IERCVVNfSEFORExFUl9SRVNVTFRfTk9UX1lFVF9IQU5ETEVEOworCisgIGxpbmsgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmbGlzdCk7CisgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgeworICAgICAgREJ1c0xpc3QgKm5leHQgPSBfZGJ1c19saXN0X2dldF9uZXh0X2xpbmsgKCZsaXN0LCBsaW5rKTsKKyAgICAgIHN1YnRyZWUgPSBsaW5rLT5kYXRhOworCisgICAgICAvKiBtZXNzYWdlX2Z1bmN0aW9uIGlzIE5VTEwgaWYgd2UncmUgdW5yZWdpc3RlcmVkCisgICAgICAgKiBkdWUgdG8gcmVlbnRyYW5jeQorICAgICAgICovCisgICAgICBpZiAoc3VidHJlZS0+bWVzc2FnZV9mdW5jdGlvbikKKyAgICAgICAgeworICAgICAgICAgIERCdXNPYmplY3RQYXRoTWVzc2FnZUZ1bmN0aW9uIG1lc3NhZ2VfZnVuY3Rpb247CisgICAgICAgICAgdm9pZCAqdXNlcl9kYXRhOworCisgICAgICAgICAgbWVzc2FnZV9mdW5jdGlvbiA9IHN1YnRyZWUtPm1lc3NhZ2VfZnVuY3Rpb247CisgICAgICAgICAgdXNlcl9kYXRhID0gc3VidHJlZS0+dXNlcl9kYXRhOworCisjaWYgMAorICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgIChpbnZva2luZyBhIGhhbmRsZXIpXG4iKTsKKyNlbmRpZgorICAgICAgICAgIAorI2lmZGVmIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTCisgICAgICAgICAgaWYgKHRyZWUtPmNvbm5lY3Rpb24pCisjZW5kaWYKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoInVubG9ja1xuIik7CisgICAgICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fdW5sb2NrICh0cmVlLT5jb25uZWN0aW9uKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIC8qIEZJWE1FIHlvdSBjb3VsZCB1bnJlZ2lzdGVyIHRoZSBzdWJ0cmVlIGluIGFub3RoZXIgdGhyZWFkCisgICAgICAgICAgICogYmVmb3JlIHdlIGludm9rZSB0aGUgY2FsbGJhY2ssIGFuZCBJIGNhbid0IGZpZ3VyZSBvdXQgYQorICAgICAgICAgICAqIGdvb2Qgd2F5IHRvIHNvbHZlIHRoaXMuCisgICAgICAgICAgICovCisKKyAgICAgICAgICByZXN1bHQgPSAoKiBtZXNzYWdlX2Z1bmN0aW9uKSAodHJlZS0+Y29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlcl9kYXRhKTsKKworI2lmZGVmIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTCisgICAgICAgICAgaWYgKHRyZWUtPmNvbm5lY3Rpb24pCisjZW5kaWYKKyAgICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fbG9jayAodHJlZS0+Y29ubmVjdGlvbik7CisKKyAgICAgICAgICBpZiAocmVzdWx0ICE9IERCVVNfSEFORExFUl9SRVNVTFRfTk9UX1lFVF9IQU5ETEVEKQorICAgICAgICAgICAgZ290byBmcmVlX2FuZF9yZXR1cm47CisgICAgICAgIH0KKworICAgICAgbGluayA9IG5leHQ7CisgICAgfQorCisgZnJlZV9hbmRfcmV0dXJuOgorCisgIGlmIChyZXN1bHQgPT0gREJVU19IQU5ETEVSX1JFU1VMVF9OT1RfWUVUX0hBTkRMRUQpCisgICAgeworICAgICAgLyogVGhpcyBoYXJkY29kZWQgZGVmYXVsdCBoYW5kbGVyIGRvZXMgYSBtaW5pbWFsIEludHJvc3BlY3QoKQorICAgICAgICovCisgICAgICByZXN1bHQgPSBoYW5kbGVfZGVmYXVsdF9pbnRyb3NwZWN0X2FuZF91bmxvY2sgKHRyZWUsIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyKiopIHBhdGgpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyNpZmRlZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworICAgICAgaWYgKHRyZWUtPmNvbm5lY3Rpb24pCisjZW5kaWYKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJ1bmxvY2tcbiIpOworICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fdW5sb2NrICh0cmVlLT5jb25uZWN0aW9uKTsKKyAgICAgICAgfQorICAgIH0KKyAgCisgIHdoaWxlIChsaXN0ICE9IE5VTEwpCisgICAgeworICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZsaXN0KTsKKyAgICAgIF9kYnVzX29iamVjdF9zdWJ0cmVlX3VucmVmIChsaW5rLT5kYXRhKTsKKyAgICAgIF9kYnVzX2xpc3RfcmVtb3ZlX2xpbmsgKCZsaXN0LCBsaW5rKTsKKyAgICB9CisgIAorICBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5IChwYXRoKTsKKworICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIExvb2tzIHVwIHRoZSBkYXRhIHBhc3NlZCB0byBfZGJ1c19vYmplY3RfdHJlZV9yZWdpc3RlcigpIGZvciBhCisgKiBoYW5kbGVyIGF0IHRoZSBnaXZlbiBwYXRoLgorICoKKyAqIEBwYXJhbSB0cmVlIHRoZSBnbG9iYWwgb2JqZWN0IHRyZWUKKyAqIEBwYXJhbSBwYXRoIE5VTEwtdGVybWluYXRlZCBhcnJheSBvZiBwYXRoIGVsZW1lbnRzIGdpdmluZyBwYXRoIHRvIHN1YnRyZWUKKyAqIEByZXR1cm5zIHRoZSBvYmplY3QncyB1c2VyX2RhdGEgb3IgI05VTEwgaWYgbm9uZSBmb3VuZAorICovCit2b2lkKgorX2RidXNfb2JqZWN0X3RyZWVfZ2V0X3VzZXJfZGF0YV91bmxvY2tlZCAoREJ1c09iamVjdFRyZWUgKnRyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICoqcGF0aCkKK3sKKyAgZGJ1c19ib29sX3QgZXhhY3RfbWF0Y2g7CisgIERCdXNPYmplY3RTdWJ0cmVlICpzdWJ0cmVlOworCisgIF9kYnVzX2Fzc2VydCAodHJlZSAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChwYXRoICE9IE5VTEwpOworICAKKyAgLyogRmluZCB0aGUgZGVlcGVzdCBwYXRoIHRoYXQgY292ZXJzIHRoZSBwYXRoIGluIHRoZSBtZXNzYWdlICovCisgIHN1YnRyZWUgPSBmaW5kX2hhbmRsZXIgKHRyZWUsIChjb25zdCBjaGFyKiopIHBhdGgsICZleGFjdF9tYXRjaCk7CisKKyAgaWYgKChzdWJ0cmVlID09IE5VTEwpIHx8ICFleGFjdF9tYXRjaCkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiTm8gb2JqZWN0IGF0IHNwZWNpZmllZCBwYXRoIGZvdW5kXG4iKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICByZXR1cm4gc3VidHJlZS0+dXNlcl9kYXRhOworfQorCisvKioKKyAqIEFsbG9jYXRlcyBhIHN1YnRyZWUgb2JqZWN0LgorICoKKyAqIEBwYXJhbSBuYW1lIG5hbWUgdG8gZHVwbGljYXRlLgorICogQHJldHVybnMgbmV3bHktYWxsb2NhdGVkIHN1YnRyZWUKKyAqLworc3RhdGljIERCdXNPYmplY3RTdWJ0cmVlKgorYWxsb2NhdGVfc3VidHJlZV9vYmplY3QgKGNvbnN0IGNoYXIgKm5hbWUpCit7CisgIGludCBsZW47CisgIERCdXNPYmplY3RTdWJ0cmVlICpzdWJ0cmVlOworICBjb25zdCBzaXplX3QgZnJvbnRfcGFkZGluZyA9IF9EQlVTX1NUUlVDVF9PRkZTRVQgKERCdXNPYmplY3RTdWJ0cmVlLCBuYW1lKTsKKworICBfZGJ1c19hc3NlcnQgKG5hbWUgIT0gTlVMTCk7CisKKyAgbGVuID0gc3RybGVuIChuYW1lKTsKKworICBzdWJ0cmVlID0gZGJ1c19tYWxsb2MwIChNQVggKGZyb250X3BhZGRpbmcgKyAobGVuICsgMSksIHNpemVvZiAoREJ1c09iamVjdFN1YnRyZWUpKSk7CisKKyAgaWYgKHN1YnRyZWUgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBtZW1jcHkgKHN1YnRyZWUtPm5hbWUsIG5hbWUsIGxlbiArIDEpOworCisgIHJldHVybiBzdWJ0cmVlOworfQorCitzdGF0aWMgREJ1c09iamVjdFN1YnRyZWUqCitfZGJ1c19vYmplY3Rfc3VidHJlZV9uZXcgKGNvbnN0IGNoYXIgICAgICAgICAgICAgICAgICAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c09iamVjdFBhdGhWVGFibGUgICp2dGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAqdXNlcl9kYXRhKQoreworICBEQnVzT2JqZWN0U3VidHJlZSAqc3VidHJlZTsKKworICBzdWJ0cmVlID0gYWxsb2NhdGVfc3VidHJlZV9vYmplY3QgKG5hbWUpOworICBpZiAoc3VidHJlZSA9PSBOVUxMKQorICAgIGdvdG8gb29tOworCisgIF9kYnVzX2Fzc2VydCAobmFtZSAhPSBOVUxMKTsKKworICBzdWJ0cmVlLT5wYXJlbnQgPSBOVUxMOworCisgIGlmICh2dGFibGUpCisgICAgeworICAgICAgc3VidHJlZS0+bWVzc2FnZV9mdW5jdGlvbiA9IHZ0YWJsZS0+bWVzc2FnZV9mdW5jdGlvbjsKKyAgICAgIHN1YnRyZWUtPnVucmVnaXN0ZXJfZnVuY3Rpb24gPSB2dGFibGUtPnVucmVnaXN0ZXJfZnVuY3Rpb247CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgc3VidHJlZS0+bWVzc2FnZV9mdW5jdGlvbiA9IE5VTEw7CisgICAgICBzdWJ0cmVlLT51bnJlZ2lzdGVyX2Z1bmN0aW9uID0gTlVMTDsKKyAgICB9CisKKyAgc3VidHJlZS0+dXNlcl9kYXRhID0gdXNlcl9kYXRhOworICBfZGJ1c19hdG9taWNfaW5jICgmc3VidHJlZS0+cmVmY291bnQpOworICBzdWJ0cmVlLT5zdWJ0cmVlcyA9IE5VTEw7CisgIHN1YnRyZWUtPm5fc3VidHJlZXMgPSAwOworICBzdWJ0cmVlLT5tYXhfc3VidHJlZXMgPSAwOworICBzdWJ0cmVlLT5pbnZva2VfYXNfZmFsbGJhY2sgPSBGQUxTRTsKKworICByZXR1cm4gc3VidHJlZTsKKworIG9vbToKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBEQnVzT2JqZWN0U3VidHJlZSAqCitfZGJ1c19vYmplY3Rfc3VidHJlZV9yZWYgKERCdXNPYmplY3RTdWJ0cmVlICpzdWJ0cmVlKQoreworI2lmZGVmIERCVVNfRElTQUJMRV9BU1NFUlQKKyAgX2RidXNfYXRvbWljX2luYyAoJnN1YnRyZWUtPnJlZmNvdW50KTsKKyNlbHNlCisgIGRidXNfaW50MzJfdCBvbGRfdmFsdWU7CisKKyAgb2xkX3ZhbHVlID0gX2RidXNfYXRvbWljX2luYyAoJnN1YnRyZWUtPnJlZmNvdW50KTsKKyAgX2RidXNfYXNzZXJ0IChvbGRfdmFsdWUgPiAwKTsKKyNlbmRpZgorCisgIHJldHVybiBzdWJ0cmVlOworfQorCitzdGF0aWMgdm9pZAorX2RidXNfb2JqZWN0X3N1YnRyZWVfdW5yZWYgKERCdXNPYmplY3RTdWJ0cmVlICpzdWJ0cmVlKQoreworICBkYnVzX2ludDMyX3Qgb2xkX3ZhbHVlOworCisgIG9sZF92YWx1ZSA9IF9kYnVzX2F0b21pY19kZWMgKCZzdWJ0cmVlLT5yZWZjb3VudCk7CisgIF9kYnVzX2Fzc2VydCAob2xkX3ZhbHVlID4gMCk7CisKKyAgaWYgKG9sZF92YWx1ZSA9PSAxKQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydCAoc3VidHJlZS0+dW5yZWdpc3Rlcl9mdW5jdGlvbiA9PSBOVUxMKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoc3VidHJlZS0+bWVzc2FnZV9mdW5jdGlvbiA9PSBOVUxMKTsKKworICAgICAgZGJ1c19mcmVlIChzdWJ0cmVlLT5zdWJ0cmVlcyk7CisgICAgICBkYnVzX2ZyZWUgKHN1YnRyZWUpOworICAgIH0KK30KKworLyoqCisgKiBMaXN0cyB0aGUgcmVnaXN0ZXJlZCBmYWxsYmFjayBoYW5kbGVycyBhbmQgb2JqZWN0IHBhdGggaGFuZGxlcnMgYXQKKyAqIHRoZSBnaXZlbiBwYXJlbnRfcGF0aC4gVGhlIHJldHVybmVkIGFycmF5IHNob3VsZCBiZSBmcmVlZCB3aXRoCisgKiBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5KCkuCisgKgorICogQHBhcmFtIHRyZWUgdGhlIG9iamVjdCB0cmVlCisgKiBAcGFyYW0gcGFyZW50X3BhdGggdGhlIHBhdGggdG8gbGlzdCB0aGUgY2hpbGQgaGFuZGxlcnMgb2YKKyAqIEBwYXJhbSBjaGlsZF9lbnRyaWVzIHJldHVybnMgI05VTEwtdGVybWluYXRlZCBhcnJheSBvZiBjaGlsZHJlbgorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vIG1lbW9yeSB0byBhbGxvY2F0ZSB0aGUgY2hpbGQgZW50cmllcworICovCitkYnVzX2Jvb2xfdAorX2RidXNfb2JqZWN0X3RyZWVfbGlzdF9yZWdpc3RlcmVkX2FuZF91bmxvY2sgKERCdXNPYmplY3RUcmVlICp0cmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgKipwYXJlbnRfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICAgKioqY2hpbGRfZW50cmllcykKK3sKKyAgZGJ1c19ib29sX3QgcmVzdWx0OworCisgIHJlc3VsdCA9IF9kYnVzX29iamVjdF90cmVlX2xpc3RfcmVnaXN0ZXJlZF91bmxvY2tlZCAodHJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZF9lbnRyaWVzKTsKKyAgCisjaWZkZWYgREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMKKyAgaWYgKHRyZWUtPmNvbm5lY3Rpb24pCisjZW5kaWYKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgidW5sb2NrXG4iKTsKKyAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fdW5sb2NrICh0cmVlLT5jb25uZWN0aW9uKTsKKyAgICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworCisvKiogU2V0IHRvIDEgdG8gZ2V0IGEgYnVuY2ggb2Ygc3BldyBhYm91dCBkaXNhc3NlbWJsaW5nIHRoZSBwYXRoIHN0cmluZyAqLworI2RlZmluZSBWRVJCT1NFX0RFQ09NUE9TRSAwCisKKy8qKgorICogRGVjb21wb3NlIGFuIG9iamVjdCBwYXRoLiAgQSBwYXRoIG9mIGp1c3QgIi8iIGlzCisgKiByZXByZXNlbnRlZCBhcyBhbiBlbXB0eSB2ZWN0b3Igb2Ygc3RyaW5ncy4KKyAqIFRoZSBwYXRoIG5lZWQgbm90IGJlIG51bCB0ZXJtaW5hdGVkLgorICogCisgKiBAcGFyYW0gZGF0YSB0aGUgcGF0aCBkYXRhCisgKiBAcGFyYW0gbGVuICB0aGUgbGVuZ3RoIG9mIHRoZSBwYXRoIHN0cmluZworICogQHBhcmFtIHBhdGggYWRkcmVzcyB0byBzdG9yZSBuZXcgb2JqZWN0IHBhdGgKKyAqIEBwYXJhbSBwYXRoX2xlbiBsZW5ndGggb2Ygc3RvcmVkIHBhdGgKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2RlY29tcG9zZV9wYXRoIChjb25zdCBjaGFyKiAgICAgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgbGVuLAorICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICAqKipwYXRoLAorICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICpwYXRoX2xlbikKK3sKKyAgY2hhciAqKnJldHZhbDsKKyAgaW50IG5fY29tcG9uZW50czsKKyAgaW50IGksIGosIGNvbXA7CisKKyAgX2RidXNfYXNzZXJ0IChkYXRhICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKHBhdGggIT0gTlVMTCk7CisgIAorI2lmIFZFUkJPU0VfREVDT01QT1NFCisgIF9kYnVzX3ZlcmJvc2UgKCJEZWNvbXBvc2luZyBwYXRoIFwiJXNcIlxuIiwKKyAgICAgICAgICAgICAgICAgZGF0YSk7CisjZW5kaWYKKyAgCisgIG5fY29tcG9uZW50cyA9IDA7CisgIGlmIChsZW4gPiAxKSAvKiBpZiBwYXRoIGlzIG5vdCBqdXN0ICIvIiAqLworICAgIHsKKyAgICAgIGkgPSAwOworICAgICAgd2hpbGUgKGkgPCBsZW4pCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19hc3NlcnQgKGRhdGFbaV0gIT0gJ1wwJyk7CisgICAgICAgICAgaWYgKGRhdGFbaV0gPT0gJy8nKQorICAgICAgICAgICAgbl9jb21wb25lbnRzICs9IDE7CisgICAgICAgICAgKytpOworICAgICAgICB9CisgICAgfQorICAKKyAgcmV0dmFsID0gZGJ1c19uZXcwIChjaGFyKiwgbl9jb21wb25lbnRzICsgMSk7CisKKyAgaWYgKHJldHZhbCA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKworICBjb21wID0gMDsKKyAgaWYgKG5fY29tcG9uZW50cyA9PSAwKQorICAgIGkgPSAxOworICBlbHNlCisgICAgaSA9IDA7CisgIHdoaWxlIChjb21wIDwgbl9jb21wb25lbnRzKQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydCAoaSA8IGxlbik7CisgICAgICAKKyAgICAgIGlmIChkYXRhW2ldID09ICcvJykKKyAgICAgICAgKytpOworICAgICAgaiA9IGk7CisKKyAgICAgIHdoaWxlIChqIDwgbGVuICYmIGRhdGFbal0gIT0gJy8nKQorICAgICAgICArK2o7CisKKyAgICAgIC8qIE5vdyBbaSwgaikgaXMgdGhlIHBhdGggY29tcG9uZW50ICovCisgICAgICBfZGJ1c19hc3NlcnQgKGkgPCBqKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoZGF0YVtpXSAhPSAnLycpOworICAgICAgX2RidXNfYXNzZXJ0IChqID09IGxlbiB8fCBkYXRhW2pdID09ICcvJyk7CisKKyNpZiBWRVJCT1NFX0RFQ09NUE9TRQorICAgICAgX2RidXNfdmVyYm9zZSAoIiAgKGNvbXBvbmVudCBpbiBbJWQsJWQpKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgIGksIGopOworI2VuZGlmCisgICAgICAKKyAgICAgIHJldHZhbFtjb21wXSA9IF9kYnVzX21lbWR1cCAoJmRhdGFbaV0sIGogLSBpICsgMSk7CisgICAgICBpZiAocmV0dmFsW2NvbXBdID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5IChyZXR2YWwpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgcmV0dmFsW2NvbXBdW2otaV0gPSAnXDAnOworI2lmIFZFUkJPU0VfREVDT01QT1NFCisgICAgICBfZGJ1c192ZXJib3NlICgiICAoY29tcG9uZW50ICVkID0gXCIlc1wiKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgIGNvbXAsIHJldHZhbFtjb21wXSk7CisjZW5kaWYKKworICAgICAgKytjb21wOworICAgICAgaSA9IGo7CisgICAgfQorICBfZGJ1c19hc3NlcnQgKGkgPT0gbGVuKTsKKyAgCisgICpwYXRoID0gcmV0dmFsOworICBpZiAocGF0aF9sZW4pCisgICAgKnBhdGhfbGVuID0gbl9jb21wb25lbnRzOworICAKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKiBAfSAqLworCitzdGF0aWMgY2hhcioKK2ZsYXR0ZW5fcGF0aCAoY29uc3QgY2hhciAqKnBhdGgpCit7CisgIERCdXNTdHJpbmcgc3RyOworICBjaGFyICpzOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZzdHIpKQorICAgIHJldHVybiBOVUxMOworCisgIGlmIChwYXRoWzBdID09IE5VTEwpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX2J5dGUgKCZzdHIsICcvJykpCisgICAgICAgIGdvdG8gbm9tZW07CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaW50IGk7CisgICAgICAKKyAgICAgIGkgPSAwOworICAgICAgd2hpbGUgKHBhdGhbaV0pCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfYnl0ZSAoJnN0ciwgJy8nKSkKKyAgICAgICAgICAgIGdvdG8gbm9tZW07CisgICAgICAgICAgCisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmc3RyLCBwYXRoW2ldKSkKKyAgICAgICAgICAgIGdvdG8gbm9tZW07CisgICAgICAgICAgCisgICAgICAgICAgKytpOworICAgICAgICB9CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX3N0ZWFsX2RhdGEgKCZzdHIsICZzKSkKKyAgICBnb3RvIG5vbWVtOworCisgIF9kYnVzX3N0cmluZ19mcmVlICgmc3RyKTsKKworICByZXR1cm4gczsKKworIG5vbWVtOgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJnN0cik7CisgIHJldHVybiBOVUxMOworfQorCisKKyNpZmRlZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworCisjaWZuZGVmIERPWFlHRU5fU0hPVUxEX1NLSVBfVEhJUworCisjaW5jbHVkZSAiZGJ1cy10ZXN0LmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKwordHlwZWRlZiBlbnVtIAoreworICBTVFJfRVFVQUwsCisgIFNUUl9QUkVGSVgsCisgIFNUUl9ESUZGRVJFTlQKK30gU3RyQ29tcGFyaXNvbjsKKworLyogUmV0dXJucyBUUlVFIGlmIGNvbnRhaW5lciBpcyBhIHBhcmVudCBvZiBjaGlsZAorICovCitzdGF0aWMgU3RyQ29tcGFyaXNvbgorcGF0aF9jb250YWlucyAoY29uc3QgY2hhciAqKmNvbnRhaW5lciwKKyAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKipjaGlsZCkKK3sKKyAgaW50IGk7CisKKyAgaSA9IDA7CisgIHdoaWxlIChjaGlsZFtpXSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGludCB2OworCisgICAgICBpZiAoY29udGFpbmVyW2ldID09IE5VTEwpCisgICAgICAgIHJldHVybiBTVFJfUFJFRklYOyAvKiBjb250YWluZXIgcmFuIG91dCwgY2hpbGQgY29udGludWVzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICogdGh1cyB0aGUgY29udGFpbmVyIGlzIGEgcGFyZW50IG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICogY2hpbGQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgICAgX2RidXNfYXNzZXJ0IChjb250YWluZXJbaV0gIT0gTlVMTCk7CisgICAgICBfZGJ1c19hc3NlcnQgKGNoaWxkW2ldICE9IE5VTEwpOworCisgICAgICB2ID0gc3RyY21wIChjb250YWluZXJbaV0sIGNoaWxkW2ldKTsKKworICAgICAgaWYgKHYgIT0gMCkKKyAgICAgICAgcmV0dXJuIFNUUl9ESUZGRVJFTlQ7IC8qIHRoZXkgb3ZlcmxhcCB1bnRpbCBoZXJlIGFuZCB0aGVuIGFyZSBkaWZmZXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBub3Qgb3ZlcmxhcHBpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgICArK2k7CisgICAgfQorCisgIC8qIENoaWxkIHJhbiBvdXQ7IGlmIGNvbnRhaW5lciBhbHNvIGRpZCwgdGhleSBhcmUgZXF1YWw7CisgICAqIG90aGVyd2lzZSwgdGhlIGNoaWxkIGlzIGEgcGFyZW50IG9mIHRoZSBjb250YWluZXIuCisgICAqLworICBpZiAoY29udGFpbmVyW2ldID09IE5VTEwpCisgICAgcmV0dXJuIFNUUl9FUVVBTDsKKyAgZWxzZQorICAgIHJldHVybiBTVFJfRElGRkVSRU5UOworfQorCisjaWYgMAorc3RhdGljIHZvaWQKK3NwZXdfc3VidHJlZV9yZWN1cnNlIChEQnVzT2JqZWN0U3VidHJlZSAqc3VidHJlZSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgaW5kZW50KQoreworICBpbnQgaTsKKworICBpID0gMDsKKyAgd2hpbGUgKGkgPCBpbmRlbnQpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIiAiKTsKKyAgICAgICsraTsKKyAgICB9CisKKyAgX2RidXNfdmVyYm9zZSAoIiVzICglZCBjaGlsZHJlbilcbiIsCisgICAgICAgICAgICAgICAgIHN1YnRyZWUtPm5hbWUsIHN1YnRyZWUtPm5fc3VidHJlZXMpOworCisgIGkgPSAwOworICB3aGlsZSAoaSA8IHN1YnRyZWUtPm5fc3VidHJlZXMpCisgICAgeworICAgICAgc3Bld19zdWJ0cmVlX3JlY3Vyc2UgKHN1YnRyZWUtPnN1YnRyZWVzW2ldLCBpbmRlbnQgKyAyKTsKKworICAgICAgKytpOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK3NwZXdfdHJlZSAoREJ1c09iamVjdFRyZWUgKnRyZWUpCit7CisgIHNwZXdfc3VidHJlZV9yZWN1cnNlICh0cmVlLT5yb290LCAwKTsKK30KKyNlbmRpZgorCisvKioKKyAqIENhbGxiYWNrIGRhdGEgdXNlZCBpbiB0ZXN0cworICovCit0eXBlZGVmIHN0cnVjdAoreworICBjb25zdCBjaGFyICoqcGF0aDsgLyoqPCBQYXRoICovCisgIGRidXNfYm9vbF90IGhhbmRsZXJfZmFsbGJhY2s7IC8qKjwgdHJ1ZSBpZiB0aGUgaGFuZGxlciBtYXkgYmUgY2FsbGVkIGFzIGZhbGxiYWNrICovCisgIGRidXNfYm9vbF90IG1lc3NhZ2VfaGFuZGxlZDsgLyoqPCBHZXRzIHNldCB0byB0cnVlIGlmIG1lc3NhZ2UgaGFuZGxlciBjYWxsZWQgKi8KKyAgZGJ1c19ib29sX3QgaGFuZGxlcl91bnJlZ2lzdGVyZWQ7IC8qKjwgZ2V0cyBzZXQgdG8gdHJ1ZSBpZiBoYW5kbGVyIGlzIHVucmVnaXN0ZXJlZCAqLworfSBUcmVlVGVzdERhdGE7CisKKworc3RhdGljIHZvaWQKK3Rlc3RfdW5yZWdpc3Rlcl9mdW5jdGlvbiAoREJ1c0Nvbm5lY3Rpb24gICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgKnVzZXJfZGF0YSkKK3sKKyAgVHJlZVRlc3REYXRhICp0dGQgPSB1c2VyX2RhdGE7CisKKyAgdHRkLT5oYW5kbGVyX3VucmVnaXN0ZXJlZCA9IFRSVUU7Cit9CisKK3N0YXRpYyBEQnVzSGFuZGxlclJlc3VsdAordGVzdF9tZXNzYWdlX2Z1bmN0aW9uIChEQnVzQ29ubmVjdGlvbiAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICp1c2VyX2RhdGEpCit7CisgIFRyZWVUZXN0RGF0YSAqdHRkID0gdXNlcl9kYXRhOworCisgIHR0ZC0+bWVzc2FnZV9oYW5kbGVkID0gVFJVRTsKKworICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9OT1RfWUVUX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZG9fcmVnaXN0ZXIgKERCdXNPYmplY3RUcmVlICp0cmVlLAorICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgKipwYXRoLAorICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICBmYWxsYmFjaywKKyAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgaSwKKyAgICAgICAgICAgICBUcmVlVGVzdERhdGEgICAqdHJlZV90ZXN0X2RhdGEpCit7CisgIERCdXNPYmplY3RQYXRoVlRhYmxlIHZ0YWJsZSA9IHsgdGVzdF91bnJlZ2lzdGVyX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfbWVzc2FnZV9mdW5jdGlvbiwgTlVMTCB9OworCisgIHRyZWVfdGVzdF9kYXRhW2ldLm1lc3NhZ2VfaGFuZGxlZCA9IEZBTFNFOworICB0cmVlX3Rlc3RfZGF0YVtpXS5oYW5kbGVyX3VucmVnaXN0ZXJlZCA9IEZBTFNFOworICB0cmVlX3Rlc3RfZGF0YVtpXS5oYW5kbGVyX2ZhbGxiYWNrID0gZmFsbGJhY2s7CisgIHRyZWVfdGVzdF9kYXRhW2ldLnBhdGggPSBwYXRoOworCisgIGlmICghX2RidXNfb2JqZWN0X3RyZWVfcmVnaXN0ZXIgKHRyZWUsIGZhbGxiYWNrLCBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHJlZV90ZXN0X2RhdGFbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKQorICAgIHJldHVybiBGQUxTRTsKKworICBfZGJ1c19hc3NlcnQgKF9kYnVzX29iamVjdF90cmVlX2dldF91c2VyX2RhdGFfdW5sb2NrZWQgKHRyZWUsIHBhdGgpID09CisgICAgICAgICAgICAgICAgJnRyZWVfdGVzdF9kYXRhW2ldKTsKKyAgCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2RvX3Rlc3RfZGlzcGF0Y2ggKERCdXNPYmplY3RUcmVlICp0cmVlLAorICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAqKnBhdGgsCisgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgaSwKKyAgICAgICAgICAgICAgICAgIFRyZWVUZXN0RGF0YSAgICp0cmVlX3Rlc3RfZGF0YSwKKyAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBuX3Rlc3RfZGF0YSkKK3sKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisgIGludCBqOworICBEQnVzSGFuZGxlclJlc3VsdCByZXN1bHQ7CisgIGNoYXIgKmZsYXQ7CisKKyAgbWVzc2FnZSA9IE5VTEw7CisgIAorICBmbGF0ID0gZmxhdHRlbl9wYXRoIChwYXRoKTsKKyAgaWYgKGZsYXQgPT0gTlVMTCkKKyAgICBnb3RvIG9vbTsKKworICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLlRlc3RJbnRlcmZhY2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZvbyIpOworICBkYnVzX2ZyZWUgKGZsYXQpOworICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgIGdvdG8gb29tOworCisgIGogPSAwOworICB3aGlsZSAoaiA8IG5fdGVzdF9kYXRhKQorICAgIHsKKyAgICAgIHRyZWVfdGVzdF9kYXRhW2pdLm1lc3NhZ2VfaGFuZGxlZCA9IEZBTFNFOworICAgICAgKytqOworICAgIH0KKworICByZXN1bHQgPSBfZGJ1c19vYmplY3RfdHJlZV9kaXNwYXRjaF9hbmRfdW5sb2NrICh0cmVlLCBtZXNzYWdlLCBOVUxMKTsKKyAgaWYgKHJlc3VsdCA9PSBEQlVTX0hBTkRMRVJfUkVTVUxUX05FRURfTUVNT1JZKQorICAgIGdvdG8gb29tOworCisgIF9kYnVzX2Fzc2VydCAodHJlZV90ZXN0X2RhdGFbaV0ubWVzc2FnZV9oYW5kbGVkKTsKKworICBqID0gMDsKKyAgd2hpbGUgKGogPCBuX3Rlc3RfZGF0YSkKKyAgICB7CisgICAgICBpZiAodHJlZV90ZXN0X2RhdGFbal0ubWVzc2FnZV9oYW5kbGVkKQorCXsKKwkgIGlmICh0cmVlX3Rlc3RfZGF0YVtqXS5oYW5kbGVyX2ZhbGxiYWNrKQorCSAgICBfZGJ1c19hc3NlcnQgKHBhdGhfY29udGFpbnMgKHRyZWVfdGVzdF9kYXRhW2pdLnBhdGgsCisJCQkJCSBwYXRoKSAhPSBTVFJfRElGRkVSRU5UKTsKKwkgIGVsc2UKKwkgICAgX2RidXNfYXNzZXJ0IChwYXRoX2NvbnRhaW5zICh0cmVlX3Rlc3RfZGF0YVtqXS5wYXRoLCBwYXRoKSA9PSBTVFJfRVFVQUwpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBpZiAodHJlZV90ZXN0X2RhdGFbal0uaGFuZGxlcl9mYWxsYmFjaykKKwkgICAgX2RidXNfYXNzZXJ0IChwYXRoX2NvbnRhaW5zICh0cmVlX3Rlc3RfZGF0YVtqXS5wYXRoLAorCQkJCQkgcGF0aCkgPT0gU1RSX0RJRkZFUkVOVCk7CisJICBlbHNlCisJICAgIF9kYnVzX2Fzc2VydCAocGF0aF9jb250YWlucyAodHJlZV90ZXN0X2RhdGFbal0ucGF0aCwgcGF0aCkgIT0gU1RSX0VRVUFMKTsKKwl9CisKKyAgICAgICsrajsKKyAgICB9CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKworICByZXR1cm4gVFJVRTsKKworIG9vbToKKyAgaWYgKG1lc3NhZ2UpCisgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCit0eXBlZGVmIHN0cnVjdAoreworICBjb25zdCBjaGFyICpwYXRoOworICBjb25zdCBjaGFyICpyZXN1bHRbMjBdOworfSBEZWNvbXBvc2VQYXRoVGVzdDsKKworc3RhdGljIERlY29tcG9zZVBhdGhUZXN0IGRlY29tcG9zZV90ZXN0c1tdID0geworICB7ICIvZm9vIiwgeyAiZm9vIiwgTlVMTCB9IH0sCisgIHsgIi9mb28vYmFyIiwgeyAiZm9vIiwgImJhciIsIE5VTEwgfSB9LAorICB7ICIvIiwgeyBOVUxMIH0gfSwKKyAgeyAiL2EvYiIsIHsgImEiLCAiYiIsIE5VTEwgfSB9LAorICB7ICIvYS9iL2MiLCB7ICJhIiwgImIiLCAiYyIsIE5VTEwgfSB9LAorICB7ICIvYS9iL2MvZCIsIHsgImEiLCAiYiIsICJjIiwgImQiLCBOVUxMIH0gfSwKKyAgeyAiL2Zvby9iYXIvcSIsIHsgImZvbyIsICJiYXIiLCAicSIsIE5VTEwgfSB9LAorICB7ICIvZm9vL2Jhci90aGlzL2lzL2xvbmdlciIsIHsgImZvbyIsICJiYXIiLCAidGhpcyIsICJpcyIsICJsb25nZXIiLCBOVUxMIH0gfQorfTsKKworLyogUmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gT09NLCBkaWUgd2l0aCBhbiBhc3NlcnRpb24gZmFpbHVyZQorICogb24gZmFpbHVyZS4gKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAorcnVuX2RlY29tcG9zZV90ZXN0cyAodm9pZCkKK3sKKyAgaW50IGk7CisKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgX0RCVVNfTl9FTEVNRU5UUyAoZGVjb21wb3NlX3Rlc3RzKSkKKyAgICB7CisgICAgICBjaGFyICoqcmVzdWx0OworICAgICAgaW50ICAgIHJlc3VsdF9sZW47CisgICAgICBpbnQgICAgZXhwZWN0ZWRfbGVuOworCisgICAgICBpZiAoIV9kYnVzX2RlY29tcG9zZV9wYXRoIChkZWNvbXBvc2VfdGVzdHNbaV0ucGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbiAoZGVjb21wb3NlX3Rlc3RzW2ldLnBhdGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdCwgJnJlc3VsdF9sZW4pKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIGV4cGVjdGVkX2xlbiA9IF9kYnVzX3N0cmluZ19hcnJheV9sZW5ndGggKGRlY29tcG9zZV90ZXN0c1tpXS5yZXN1bHQpOworICAgICAgCisgICAgICBpZiAocmVzdWx0X2xlbiAhPSAoaW50KSBfZGJ1c19zdHJpbmdfYXJyYXlfbGVuZ3RoICgoY29uc3QgY2hhcioqKXJlc3VsdCkgfHwKKyAgICAgICAgICBleHBlY3RlZF9sZW4gIT0gcmVzdWx0X2xlbiB8fAorICAgICAgICAgIHBhdGhfY29udGFpbnMgKGRlY29tcG9zZV90ZXN0c1tpXS5yZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIqKikgcmVzdWx0KSAhPSBTVFJfRVFVQUwpCisgICAgICAgIHsKKyAgICAgICAgICBpbnQgcmVhbF9sZW4gPSBfZGJ1c19zdHJpbmdfYXJyYXlfbGVuZ3RoICgoY29uc3QgY2hhcioqKXJlc3VsdCk7CisgICAgICAgICAgX2RidXNfd2FybiAoIkV4cGVjdGVkIGRlY29tcG9zZSBvZiAlcyB0byBoYXZlIGxlbiAlZCwgcmV0dXJuZWQgJWQsIGFwcGVhcnMgdG8gaGF2ZSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgZGVjb21wb3NlX3Rlc3RzW2ldLnBhdGgsIGV4cGVjdGVkX2xlbiwgcmVzdWx0X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICByZWFsX2xlbik7CisgICAgICAgICAgX2RidXNfd2FybiAoIkRlY29tcG9zZSByZXN1bHRlZCBpbiBlbGVtZW50czogeyAiKTsKKyAgICAgICAgICBpID0gMDsKKyAgICAgICAgICB3aGlsZSAoaSA8IHJlYWxfbGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c193YXJuICgiXCIlc1wiJXMiLCByZXN1bHRbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIChpICsgMSkgPT0gcmVhbF9sZW4gPyAiIiA6ICIsICIpOworICAgICAgICAgICAgICArK2k7CisgICAgICAgICAgICB9CisgICAgICAgICAgX2RidXNfd2FybiAoIn0iKTsKKyAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJwYXRoIGRlY29tcG9zZSBmYWlsZWQiKTsKKyAgICAgICAgfQorCisgICAgICBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5IChyZXN1bHQpOworCisgICAgICArK2k7CisgICAgfQorICAKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBEQnVzT2JqZWN0U3VidHJlZSoKK2ZpbmRfc3VidHJlZV9yZWdpc3RlcmVkX29yX3VucmVnaXN0ZXJlZCAoREJ1c09iamVjdFRyZWUgKnRyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgKipwYXRoKQoreworI2lmIFZFUkJPU0VfRklORAorICBfZGJ1c192ZXJib3NlICgiTG9va2luZyBmb3IgZXhhY3Qgc3VidHJlZSwgcmVnaXN0ZXJlZCBvciB1bnJlZ2lzdGVyZWRcbiIpOworI2VuZGlmCisKKyAgcmV0dXJuIGZpbmRfc3VidHJlZV9yZWN1cnNlICh0cmVlLT5yb290LCBwYXRoLCBGQUxTRSwgTlVMTCwgTlVMTCk7Cit9CisKKy8qIFJldHVybnMgVFJVRSBpZiB0aGUgcmlnaHQgdGhpbmcgaGFwcGVucywgYnV0IHRoZSByaWdodCB0aGluZyBtaWdodAorICogYmUgT09NLiAqLworc3RhdGljIGRidXNfYm9vbF90CitvYmplY3RfdHJlZV90ZXN0X2l0ZXJhdGlvbiAodm9pZCAqZGF0YSkKK3sKKyAgY29uc3QgY2hhciAqcGF0aDBbXSA9IHsgTlVMTCB9OworICBjb25zdCBjaGFyICpwYXRoMVtdID0geyAiZm9vIiwgTlVMTCB9OworICBjb25zdCBjaGFyICpwYXRoMltdID0geyAiZm9vIiwgImJhciIsIE5VTEwgfTsKKyAgY29uc3QgY2hhciAqcGF0aDNbXSA9IHsgImZvbyIsICJiYXIiLCAiYmF6IiwgTlVMTCB9OworICBjb25zdCBjaGFyICpwYXRoNFtdID0geyAiZm9vIiwgImJhciIsICJib28iLCBOVUxMIH07CisgIGNvbnN0IGNoYXIgKnBhdGg1W10gPSB7ICJibGFoIiwgTlVMTCB9OworICBjb25zdCBjaGFyICpwYXRoNltdID0geyAiYmxhaCIsICJib29mIiwgTlVMTCB9OworICBjb25zdCBjaGFyICpwYXRoN1tdID0geyAiYmxhaCIsICJib29mIiwgInRoaXMiLCAiaXMiLCAicmVhbGx5IiwgImxvbmciLCBOVUxMIH07CisgIGNvbnN0IGNoYXIgKnBhdGg4W10gPSB7ICJjaGlsZGxlc3MiLCBOVUxMIH07CisgIGNvbnN0IGNoYXIgKnBhdGg5W10gPSB7ICJibGFoIiwgImEiLCBOVUxMIH07CisgIGNvbnN0IGNoYXIgKnBhdGgxMFtdID0geyAiYmxhaCIsICJiIiwgTlVMTCB9OworICBjb25zdCBjaGFyICpwYXRoMTFbXSA9IHsgImJsYWgiLCAiYyIsIE5VTEwgfTsKKyAgY29uc3QgY2hhciAqcGF0aDEyW10gPSB7ICJibGFoIiwgImEiLCAiZCIsIE5VTEwgfTsKKyAgY29uc3QgY2hhciAqcGF0aDEzW10gPSB7ICJibGFoIiwgImIiLCAiZCIsIE5VTEwgfTsKKyAgY29uc3QgY2hhciAqcGF0aDE0W10gPSB7ICJibGFoIiwgImMiLCAiZCIsIE5VTEwgfTsKKyAgREJ1c09iamVjdFBhdGhWVGFibGUgdGVzdF92dGFibGUgPSB7IE5VTEwsIHRlc3RfbWVzc2FnZV9mdW5jdGlvbiwgTlVMTCB9OworICBEQnVzT2JqZWN0VHJlZSAqdHJlZTsKKyAgVHJlZVRlc3REYXRhIHRyZWVfdGVzdF9kYXRhWzldOworICBpbnQgaTsKKyAgZGJ1c19ib29sX3QgZXhhY3RfbWF0Y2g7CisKKyAgaWYgKCFydW5fZGVjb21wb3NlX3Rlc3RzICgpKQorICAgIHJldHVybiBUUlVFOyAvKiBPT00gaXMgT0sgKi8KKyAgCisgIHRyZWUgPSBOVUxMOworCisgIHRyZWUgPSBfZGJ1c19vYmplY3RfdHJlZV9uZXcgKE5VTEwpOworICBpZiAodHJlZSA9PSBOVUxMKQorICAgIGdvdG8gb3V0OworCisgIGlmICghZG9fcmVnaXN0ZXIgKHRyZWUsIHBhdGgwLCBUUlVFLCAwLCB0cmVlX3Rlc3RfZGF0YSkpCisgICAgZ290byBvdXQ7CisKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgwLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDEsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMiwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgzLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDQsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNSwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg2LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDcsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoOCwgTlVMTCkpOworCisgIF9kYnVzX2Fzc2VydCAoZmluZF9oYW5kbGVyICh0cmVlLCBwYXRoMCwgJmV4YWN0X21hdGNoKSAmJiBleGFjdF9tYXRjaCk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9oYW5kbGVyICh0cmVlLCBwYXRoMSwgJmV4YWN0X21hdGNoKSA9PSB0cmVlLT5yb290ICYmICFleGFjdF9tYXRjaCk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9oYW5kbGVyICh0cmVlLCBwYXRoMiwgJmV4YWN0X21hdGNoKSA9PSB0cmVlLT5yb290ICYmICFleGFjdF9tYXRjaCk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9oYW5kbGVyICh0cmVlLCBwYXRoMywgJmV4YWN0X21hdGNoKSA9PSB0cmVlLT5yb290ICYmICFleGFjdF9tYXRjaCk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9oYW5kbGVyICh0cmVlLCBwYXRoNCwgJmV4YWN0X21hdGNoKSA9PSB0cmVlLT5yb290ICYmICFleGFjdF9tYXRjaCk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9oYW5kbGVyICh0cmVlLCBwYXRoNSwgJmV4YWN0X21hdGNoKSA9PSB0cmVlLT5yb290ICYmICFleGFjdF9tYXRjaCk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9oYW5kbGVyICh0cmVlLCBwYXRoNiwgJmV4YWN0X21hdGNoKSA9PSB0cmVlLT5yb290ICYmICFleGFjdF9tYXRjaCk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9oYW5kbGVyICh0cmVlLCBwYXRoNywgJmV4YWN0X21hdGNoKSA9PSB0cmVlLT5yb290ICYmICFleGFjdF9tYXRjaCk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9oYW5kbGVyICh0cmVlLCBwYXRoOCwgJmV4YWN0X21hdGNoKSA9PSB0cmVlLT5yb290ICYmICFleGFjdF9tYXRjaCk7CisgIAorICBpZiAoIWRvX3JlZ2lzdGVyICh0cmVlLCBwYXRoMSwgVFJVRSwgMSwgdHJlZV90ZXN0X2RhdGEpKQorICAgIGdvdG8gb3V0OworCisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMCwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDEsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMiwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgzLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDQsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNSwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg2LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDcsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoOCwgTlVMTCkpOworCisgIF9kYnVzX2Fzc2VydCAoZmluZF9oYW5kbGVyICh0cmVlLCBwYXRoMCwgJmV4YWN0X21hdGNoKSAmJiAgZXhhY3RfbWF0Y2gpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfaGFuZGxlciAodHJlZSwgcGF0aDEsICZleGFjdF9tYXRjaCkgJiYgIGV4YWN0X21hdGNoKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX2hhbmRsZXIgKHRyZWUsIHBhdGgyLCAmZXhhY3RfbWF0Y2gpICYmICFleGFjdF9tYXRjaCk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9oYW5kbGVyICh0cmVlLCBwYXRoMywgJmV4YWN0X21hdGNoKSAmJiAhZXhhY3RfbWF0Y2gpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfaGFuZGxlciAodHJlZSwgcGF0aDQsICZleGFjdF9tYXRjaCkgJiYgIWV4YWN0X21hdGNoKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX2hhbmRsZXIgKHRyZWUsIHBhdGg1LCAmZXhhY3RfbWF0Y2gpID09IHRyZWUtPnJvb3QgJiYgIWV4YWN0X21hdGNoKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX2hhbmRsZXIgKHRyZWUsIHBhdGg2LCAmZXhhY3RfbWF0Y2gpID09IHRyZWUtPnJvb3QgJiYgIWV4YWN0X21hdGNoKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX2hhbmRsZXIgKHRyZWUsIHBhdGg3LCAmZXhhY3RfbWF0Y2gpID09IHRyZWUtPnJvb3QgJiYgIWV4YWN0X21hdGNoKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX2hhbmRsZXIgKHRyZWUsIHBhdGg4LCAmZXhhY3RfbWF0Y2gpID09IHRyZWUtPnJvb3QgJiYgIWV4YWN0X21hdGNoKTsKKworICBpZiAoIWRvX3JlZ2lzdGVyICh0cmVlLCBwYXRoMiwgVFJVRSwgMiwgdHJlZV90ZXN0X2RhdGEpKQorICAgIGdvdG8gb3V0OworCisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMSwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDIsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMywgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg0LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDUsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNiwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg3LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDgsIE5VTEwpKTsKKworICBpZiAoIWRvX3JlZ2lzdGVyICh0cmVlLCBwYXRoMywgVFJVRSwgMywgdHJlZV90ZXN0X2RhdGEpKQorICAgIGdvdG8gb3V0OworCisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMCwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDEsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgyLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMywgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg0LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDUsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNiwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg3LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDgsIE5VTEwpKTsKKyAgCisgIGlmICghZG9fcmVnaXN0ZXIgKHRyZWUsIHBhdGg0LCBUUlVFLCA0LCB0cmVlX3Rlc3RfZGF0YSkpCisgICAgZ290byBvdXQ7CisKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgwLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMSwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDIsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgzLCBOVUxMKSk7ICAKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg0LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDUsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNiwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg3LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDgsIE5VTEwpKTsKKyAgCisgIGlmICghZG9fcmVnaXN0ZXIgKHRyZWUsIHBhdGg1LCBUUlVFLCA1LCB0cmVlX3Rlc3RfZGF0YSkpCisgICAgZ290byBvdXQ7CisKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgwLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMSwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDIsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgzLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNCwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDUsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNiwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg3LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDgsIE5VTEwpKTsKKworICBfZGJ1c19hc3NlcnQgKGZpbmRfaGFuZGxlciAodHJlZSwgcGF0aDAsICZleGFjdF9tYXRjaCkgPT0gdHJlZS0+cm9vdCAmJiAgZXhhY3RfbWF0Y2gpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfaGFuZGxlciAodHJlZSwgcGF0aDEsICZleGFjdF9tYXRjaCkgIT0gdHJlZS0+cm9vdCAmJiAgZXhhY3RfbWF0Y2gpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfaGFuZGxlciAodHJlZSwgcGF0aDIsICZleGFjdF9tYXRjaCkgIT0gdHJlZS0+cm9vdCAmJiAgZXhhY3RfbWF0Y2gpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfaGFuZGxlciAodHJlZSwgcGF0aDMsICZleGFjdF9tYXRjaCkgIT0gdHJlZS0+cm9vdCAmJiAgZXhhY3RfbWF0Y2gpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfaGFuZGxlciAodHJlZSwgcGF0aDQsICZleGFjdF9tYXRjaCkgIT0gdHJlZS0+cm9vdCAmJiAgZXhhY3RfbWF0Y2gpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfaGFuZGxlciAodHJlZSwgcGF0aDUsICZleGFjdF9tYXRjaCkgIT0gdHJlZS0+cm9vdCAmJiAgZXhhY3RfbWF0Y2gpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfaGFuZGxlciAodHJlZSwgcGF0aDYsICZleGFjdF9tYXRjaCkgIT0gdHJlZS0+cm9vdCAmJiAhZXhhY3RfbWF0Y2gpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfaGFuZGxlciAodHJlZSwgcGF0aDcsICZleGFjdF9tYXRjaCkgIT0gdHJlZS0+cm9vdCAmJiAhZXhhY3RfbWF0Y2gpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfaGFuZGxlciAodHJlZSwgcGF0aDgsICZleGFjdF9tYXRjaCkgPT0gdHJlZS0+cm9vdCAmJiAhZXhhY3RfbWF0Y2gpOworCisgIGlmICghZG9fcmVnaXN0ZXIgKHRyZWUsIHBhdGg2LCBUUlVFLCA2LCB0cmVlX3Rlc3RfZGF0YSkpCisgICAgZ290byBvdXQ7CisKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgwLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMSwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDIsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgzLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNCwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDUsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg2LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDcsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoOCwgTlVMTCkpOworCisgIGlmICghZG9fcmVnaXN0ZXIgKHRyZWUsIHBhdGg3LCBUUlVFLCA3LCB0cmVlX3Rlc3RfZGF0YSkpCisgICAgZ290byBvdXQ7CisKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgwLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMSwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDIsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgzLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNCwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDUsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg2LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNywgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg4LCBOVUxMKSk7CisKKyAgaWYgKCFkb19yZWdpc3RlciAodHJlZSwgcGF0aDgsIFRSVUUsIDgsIHRyZWVfdGVzdF9kYXRhKSkKKyAgICBnb3RvIG91dDsKKworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDAsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgxLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMiwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDMsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg0LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNSwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDYsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg3LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoOCwgTlVMTCkpOworCisgIF9kYnVzX2Fzc2VydCAoZmluZF9oYW5kbGVyICh0cmVlLCBwYXRoMCwgJmV4YWN0X21hdGNoKSA9PSB0cmVlLT5yb290ICYmICBleGFjdF9tYXRjaCk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9oYW5kbGVyICh0cmVlLCBwYXRoMSwgJmV4YWN0X21hdGNoKSAhPSB0cmVlLT5yb290ICYmIGV4YWN0X21hdGNoKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX2hhbmRsZXIgKHRyZWUsIHBhdGgyLCAmZXhhY3RfbWF0Y2gpICE9IHRyZWUtPnJvb3QgJiYgZXhhY3RfbWF0Y2gpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfaGFuZGxlciAodHJlZSwgcGF0aDMsICZleGFjdF9tYXRjaCkgIT0gdHJlZS0+cm9vdCAmJiBleGFjdF9tYXRjaCk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9oYW5kbGVyICh0cmVlLCBwYXRoNCwgJmV4YWN0X21hdGNoKSAhPSB0cmVlLT5yb290ICYmIGV4YWN0X21hdGNoKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX2hhbmRsZXIgKHRyZWUsIHBhdGg1LCAmZXhhY3RfbWF0Y2gpICE9IHRyZWUtPnJvb3QgJiYgZXhhY3RfbWF0Y2gpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfaGFuZGxlciAodHJlZSwgcGF0aDYsICZleGFjdF9tYXRjaCkgIT0gdHJlZS0+cm9vdCAmJiBleGFjdF9tYXRjaCk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9oYW5kbGVyICh0cmVlLCBwYXRoNywgJmV4YWN0X21hdGNoKSAhPSB0cmVlLT5yb290ICYmIGV4YWN0X21hdGNoKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX2hhbmRsZXIgKHRyZWUsIHBhdGg4LCAmZXhhY3RfbWF0Y2gpICE9IHRyZWUtPnJvb3QgJiYgZXhhY3RfbWF0Y2gpOworICAKKyAgLyogdGVzdCB0aGUgbGlzdF9yZWdpc3RlcmVkIGZ1bmN0aW9uICovCisKKyAgeworICAgIGNvbnN0IGNoYXIgKnJvb3RbXSA9IHsgTlVMTCB9OworICAgIGNoYXIgKipjaGlsZF9lbnRyaWVzOworICAgIGludCBuYjsKKworICAgIF9kYnVzX29iamVjdF90cmVlX2xpc3RfcmVnaXN0ZXJlZF91bmxvY2tlZCAodHJlZSwgcGF0aDEsICZjaGlsZF9lbnRyaWVzKTsKKyAgICBpZiAoY2hpbGRfZW50cmllcyAhPSBOVUxMKQorICAgICAgeworCW5iID0gX2RidXNfc3RyaW5nX2FycmF5X2xlbmd0aCAoKGNvbnN0IGNoYXIqKiljaGlsZF9lbnRyaWVzKTsKKwlfZGJ1c19hc3NlcnQgKG5iID09IDEpOworCWRidXNfZnJlZV9zdHJpbmdfYXJyYXkgKGNoaWxkX2VudHJpZXMpOworICAgICAgfQorCisgICAgX2RidXNfb2JqZWN0X3RyZWVfbGlzdF9yZWdpc3RlcmVkX3VubG9ja2VkICh0cmVlLCBwYXRoMiwgJmNoaWxkX2VudHJpZXMpOworICAgIGlmIChjaGlsZF9lbnRyaWVzICE9IE5VTEwpCisgICAgICB7CisJbmIgPSBfZGJ1c19zdHJpbmdfYXJyYXlfbGVuZ3RoICgoY29uc3QgY2hhcioqKWNoaWxkX2VudHJpZXMpOworCV9kYnVzX2Fzc2VydCAobmIgPT0gMik7CisJZGJ1c19mcmVlX3N0cmluZ19hcnJheSAoY2hpbGRfZW50cmllcyk7CisgICAgICB9CisKKyAgICBfZGJ1c19vYmplY3RfdHJlZV9saXN0X3JlZ2lzdGVyZWRfdW5sb2NrZWQgKHRyZWUsIHBhdGg4LCAmY2hpbGRfZW50cmllcyk7CisgICAgaWYgKGNoaWxkX2VudHJpZXMgIT0gTlVMTCkKKyAgICAgIHsKKwluYiA9IF9kYnVzX3N0cmluZ19hcnJheV9sZW5ndGggKChjb25zdCBjaGFyKiopY2hpbGRfZW50cmllcyk7CisJX2RidXNfYXNzZXJ0IChuYiA9PSAwKTsKKwlkYnVzX2ZyZWVfc3RyaW5nX2FycmF5IChjaGlsZF9lbnRyaWVzKTsKKyAgICAgIH0KKworICAgIF9kYnVzX29iamVjdF90cmVlX2xpc3RfcmVnaXN0ZXJlZF91bmxvY2tlZCAodHJlZSwgcm9vdCwgJmNoaWxkX2VudHJpZXMpOworICAgIGlmIChjaGlsZF9lbnRyaWVzICE9IE5VTEwpCisgICAgICB7CisJbmIgPSBfZGJ1c19zdHJpbmdfYXJyYXlfbGVuZ3RoICgoY29uc3QgY2hhcioqKWNoaWxkX2VudHJpZXMpOworCV9kYnVzX2Fzc2VydCAobmIgPT0gMyk7CisJZGJ1c19mcmVlX3N0cmluZ19hcnJheSAoY2hpbGRfZW50cmllcyk7CisgICAgICB9CisgIH0KKworICAvKiBDaGVjayB0aGF0IGRlc3Ryb3lpbmcgdHJlZSBjYWxscyB1bnJlZ2lzdGVyIGZ1bmNzICovCisgIF9kYnVzX29iamVjdF90cmVlX3VucmVmICh0cmVlKTsKKworICBpID0gMDsKKyAgd2hpbGUgKGkgPCAoaW50KSBfREJVU19OX0VMRU1FTlRTICh0cmVlX3Rlc3RfZGF0YSkpCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0ICh0cmVlX3Rlc3RfZGF0YVtpXS5oYW5kbGVyX3VucmVnaXN0ZXJlZCk7CisgICAgICBfZGJ1c19hc3NlcnQgKCF0cmVlX3Rlc3RfZGF0YVtpXS5tZXNzYWdlX2hhbmRsZWQpOworICAgICAgKytpOworICAgIH0KKworICAvKiBOb3cgc3RhcnQgYWdhaW4gYW5kIHRyeSB0aGUgaW5kaXZpZHVhbCB1bnJlZ2lzdGVyIGZ1bmN0aW9uICovCisgIHRyZWUgPSBfZGJ1c19vYmplY3RfdHJlZV9uZXcgKE5VTEwpOworICBpZiAodHJlZSA9PSBOVUxMKQorICAgIGdvdG8gb3V0OworCisgIGlmICghZG9fcmVnaXN0ZXIgKHRyZWUsIHBhdGgwLCBUUlVFLCAwLCB0cmVlX3Rlc3RfZGF0YSkpCisgICAgZ290byBvdXQ7CisgIGlmICghZG9fcmVnaXN0ZXIgKHRyZWUsIHBhdGgxLCBUUlVFLCAxLCB0cmVlX3Rlc3RfZGF0YSkpCisgICAgZ290byBvdXQ7CisgIGlmICghZG9fcmVnaXN0ZXIgKHRyZWUsIHBhdGgyLCBUUlVFLCAyLCB0cmVlX3Rlc3RfZGF0YSkpCisgICAgZ290byBvdXQ7CisgIGlmICghZG9fcmVnaXN0ZXIgKHRyZWUsIHBhdGgzLCBUUlVFLCAzLCB0cmVlX3Rlc3RfZGF0YSkpCisgICAgZ290byBvdXQ7CisgIGlmICghZG9fcmVnaXN0ZXIgKHRyZWUsIHBhdGg0LCBUUlVFLCA0LCB0cmVlX3Rlc3RfZGF0YSkpCisgICAgZ290byBvdXQ7CisgIGlmICghZG9fcmVnaXN0ZXIgKHRyZWUsIHBhdGg1LCBUUlVFLCA1LCB0cmVlX3Rlc3RfZGF0YSkpCisgICAgZ290byBvdXQ7CisgIGlmICghZG9fcmVnaXN0ZXIgKHRyZWUsIHBhdGg2LCBUUlVFLCA2LCB0cmVlX3Rlc3RfZGF0YSkpCisgICAgZ290byBvdXQ7CisgIGlmICghZG9fcmVnaXN0ZXIgKHRyZWUsIHBhdGg3LCBUUlVFLCA3LCB0cmVlX3Rlc3RfZGF0YSkpCisgICAgZ290byBvdXQ7CisgIGlmICghZG9fcmVnaXN0ZXIgKHRyZWUsIHBhdGg4LCBUUlVFLCA4LCB0cmVlX3Rlc3RfZGF0YSkpCisgICAgZ290byBvdXQ7CisKKyAgX2RidXNfb2JqZWN0X3RyZWVfdW5yZWdpc3Rlcl9hbmRfdW5sb2NrICh0cmVlLCBwYXRoMCk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfb2JqZWN0X3RyZWVfZ2V0X3VzZXJfZGF0YV91bmxvY2tlZCAodHJlZSwgcGF0aDApID09IE5VTEwpOworCisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDAsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgxLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMiwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDMsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg0LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNSwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDYsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg3LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoOCwgTlVMTCkpOworICAKKyAgX2RidXNfb2JqZWN0X3RyZWVfdW5yZWdpc3Rlcl9hbmRfdW5sb2NrICh0cmVlLCBwYXRoMSk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfb2JqZWN0X3RyZWVfZ2V0X3VzZXJfZGF0YV91bmxvY2tlZCAodHJlZSwgcGF0aDEpID09IE5VTEwpOworCisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDAsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMSwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDIsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgzLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNCwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDUsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg2LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNywgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDgsIE5VTEwpKTsKKworICBfZGJ1c19vYmplY3RfdHJlZV91bnJlZ2lzdGVyX2FuZF91bmxvY2sgKHRyZWUsIHBhdGgyKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19vYmplY3RfdHJlZV9nZXRfdXNlcl9kYXRhX3VubG9ja2VkICh0cmVlLCBwYXRoMikgPT0gTlVMTCk7CisKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMCwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgxLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDIsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgzLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNCwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDUsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg2LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNywgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDgsIE5VTEwpKTsKKyAgCisgIF9kYnVzX29iamVjdF90cmVlX3VucmVnaXN0ZXJfYW5kX3VubG9jayAodHJlZSwgcGF0aDMpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX29iamVjdF90cmVlX2dldF91c2VyX2RhdGFfdW5sb2NrZWQgKHRyZWUsIHBhdGgzKSA9PSBOVUxMKTsKKworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgwLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDEsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMiwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgzLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNCwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDUsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg2LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNywgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDgsIE5VTEwpKTsKKyAgCisgIF9kYnVzX29iamVjdF90cmVlX3VucmVnaXN0ZXJfYW5kX3VubG9jayAodHJlZSwgcGF0aDQpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX29iamVjdF90cmVlX2dldF91c2VyX2RhdGFfdW5sb2NrZWQgKHRyZWUsIHBhdGg0KSA9PSBOVUxMKTsKKworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgwLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDEsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMiwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgzLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDQsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg1LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNiwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDcsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg4LCBOVUxMKSk7CisgIAorICBfZGJ1c19vYmplY3RfdHJlZV91bnJlZ2lzdGVyX2FuZF91bmxvY2sgKHRyZWUsIHBhdGg1KTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19vYmplY3RfdHJlZV9nZXRfdXNlcl9kYXRhX3VubG9ja2VkICh0cmVlLCBwYXRoNSkgPT0gTlVMTCk7CisKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMCwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgxLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDIsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMywgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg0LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDUsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg2LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNywgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDgsIE5VTEwpKTsKKyAgCisgIF9kYnVzX29iamVjdF90cmVlX3VucmVnaXN0ZXJfYW5kX3VubG9jayAodHJlZSwgcGF0aDYpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX29iamVjdF90cmVlX2dldF91c2VyX2RhdGFfdW5sb2NrZWQgKHRyZWUsIHBhdGg2KSA9PSBOVUxMKTsKKworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgwLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDEsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMiwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgzLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDQsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNSwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg2LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNywgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDgsIE5VTEwpKTsKKworICBfZGJ1c19vYmplY3RfdHJlZV91bnJlZ2lzdGVyX2FuZF91bmxvY2sgKHRyZWUsIHBhdGg3KTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19vYmplY3RfdHJlZV9nZXRfdXNlcl9kYXRhX3VubG9ja2VkICh0cmVlLCBwYXRoNykgPT0gTlVMTCk7CisKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMCwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgxLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDIsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMywgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg0LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDUsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNiwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg3LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoOCwgTlVMTCkpOworCisgIF9kYnVzX29iamVjdF90cmVlX3VucmVnaXN0ZXJfYW5kX3VubG9jayAodHJlZSwgcGF0aDgpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX29iamVjdF90cmVlX2dldF91c2VyX2RhdGFfdW5sb2NrZWQgKHRyZWUsIHBhdGg4KSA9PSBOVUxMKTsKKworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgwLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDEsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMiwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgzLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDQsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNSwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg2LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDcsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoOCwgTlVMTCkpOworICAKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgKGludCkgX0RCVVNfTl9FTEVNRU5UUyAodHJlZV90ZXN0X2RhdGEpKQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydCAodHJlZV90ZXN0X2RhdGFbaV0uaGFuZGxlcl91bnJlZ2lzdGVyZWQpOworICAgICAgX2RidXNfYXNzZXJ0ICghdHJlZV90ZXN0X2RhdGFbaV0ubWVzc2FnZV9oYW5kbGVkKTsKKyAgICAgICsraTsKKyAgICB9CisKKyAgLyogVGVzdCByZW1vdmFsIG9mIG5ld2x5LWNoaWxkbGVzcyB1bnJlZ2lzdGVyZWQgbm9kZXMgKi8KKyAgaWYgKCFkb19yZWdpc3RlciAodHJlZSwgcGF0aDIsIFRSVUUsIDIsIHRyZWVfdGVzdF9kYXRhKSkKKyAgICBnb3RvIG91dDsKKworICBfZGJ1c19vYmplY3RfdHJlZV91bnJlZ2lzdGVyX2FuZF91bmxvY2sgKHRyZWUsIHBhdGgyKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlX3JlZ2lzdGVyZWRfb3JfdW5yZWdpc3RlcmVkICh0cmVlLCBwYXRoMikpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWVfcmVnaXN0ZXJlZF9vcl91bnJlZ2lzdGVyZWQgKHRyZWUsIHBhdGgxKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlX3JlZ2lzdGVyZWRfb3JfdW5yZWdpc3RlcmVkICh0cmVlLCBwYXRoMCkpOworCisgIC8qIFRlc3QgdGhhdCB1bnJlZ2lzdGVyZWQgcGFyZW50cyBjYW5ub3QgYmUgZnJlZWQgb3V0IGZyb20gdW5kZXIgdGhlaXIKKyAgICAgY2hpbGRyZW4gKi8KKyAgaWYgKCFkb19yZWdpc3RlciAodHJlZSwgcGF0aDIsIFRSVUUsIDIsIHRyZWVfdGVzdF9kYXRhKSkKKyAgICBnb3RvIG91dDsKKworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgxLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlX3JlZ2lzdGVyZWRfb3JfdW5yZWdpc3RlcmVkICh0cmVlLCBwYXRoMSkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZV9yZWdpc3RlcmVkX29yX3VucmVnaXN0ZXJlZCAodHJlZSwgcGF0aDApKTsKKworI2lmIDAKKyAgLyogVGhpcyB0cmlnZ2VycyB0aGUgIkF0dGVtcHRlZCB0byB1bnJlZ2lzdGVyIHBhdGggLi4uIiB3YXJuaW5nIG1lc3NhZ2UgKi8KKyAgX2RidXNfb2JqZWN0X3RyZWVfdW5yZWdpc3Rlcl9hbmRfdW5sb2NrICh0cmVlLCBwYXRoMSk7CisjZW5kaWYKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgyLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDEsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWVfcmVnaXN0ZXJlZF9vcl91bnJlZ2lzdGVyZWQgKHRyZWUsIHBhdGgxKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlX3JlZ2lzdGVyZWRfb3JfdW5yZWdpc3RlcmVkICh0cmVlLCBwYXRoMCkpOworCisgIF9kYnVzX29iamVjdF90cmVlX3VucmVnaXN0ZXJfYW5kX3VubG9jayAodHJlZSwgcGF0aDIpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgyLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZV9yZWdpc3RlcmVkX29yX3VucmVnaXN0ZXJlZCAodHJlZSwgcGF0aDIpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlX3JlZ2lzdGVyZWRfb3JfdW5yZWdpc3RlcmVkICh0cmVlLCBwYXRoMSkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZV9yZWdpc3RlcmVkX29yX3VucmVnaXN0ZXJlZCAodHJlZSwgcGF0aDApKTsKKworICAvKiBUZXN0IHRoYXQgcmVnaXN0ZXJlZCBwYXJlbnRzIGNhbm5vdCBiZSBmcmVlZCBvdXQgZnJvbSB1bmRlciB0aGVpcgorICAgICBjaGlsZHJlbiwgYW5kIHRoYXQgaWYgdGhleSBhcmUgdW5yZWdpc3RlcmVkIGJlZm9yZSB0aGVpciBjaGlsZHJlbiwgdGhleQorICAgICBhcmUgc3RpbGwgZnJlZWQgd2hlbiB0aGVpciBjaGlsZHJlbiBhcmUgdW5yZWdpc3RlcmVkICovCisgIGlmICghZG9fcmVnaXN0ZXIgKHRyZWUsIHBhdGgxLCBUUlVFLCAxLCB0cmVlX3Rlc3RfZGF0YSkpCisgICAgZ290byBvdXQ7CisgIGlmICghZG9fcmVnaXN0ZXIgKHRyZWUsIHBhdGgyLCBUUlVFLCAyLCB0cmVlX3Rlc3RfZGF0YSkpCisgICAgZ290byBvdXQ7CisKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgxLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMiwgTlVMTCkpOworCisgIF9kYnVzX29iamVjdF90cmVlX3VucmVnaXN0ZXJfYW5kX3VubG9jayAodHJlZSwgcGF0aDEpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgxLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMiwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZV9yZWdpc3RlcmVkX29yX3VucmVnaXN0ZXJlZCAodHJlZSwgcGF0aDEpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWVfcmVnaXN0ZXJlZF9vcl91bnJlZ2lzdGVyZWQgKHRyZWUsIHBhdGgwKSk7CisKKyAgX2RidXNfb2JqZWN0X3RyZWVfdW5yZWdpc3Rlcl9hbmRfdW5sb2NrICh0cmVlLCBwYXRoMik7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDEsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlX3JlZ2lzdGVyZWRfb3JfdW5yZWdpc3RlcmVkICh0cmVlLCBwYXRoMSkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgyLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZV9yZWdpc3RlcmVkX29yX3VucmVnaXN0ZXJlZCAodHJlZSwgcGF0aDIpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWVfcmVnaXN0ZXJlZF9vcl91bnJlZ2lzdGVyZWQgKHRyZWUsIHBhdGgwKSk7CisKKyAgLyogVGVzdCB3aXRoIE5VTEwgdW5yZWdpc3Rlcl9mdW5jdGlvbiBhbmQgdXNlcl9kYXRhICovCisgIGlmICghX2RidXNfb2JqZWN0X3RyZWVfcmVnaXN0ZXIgKHRyZWUsIFRSVUUsIHBhdGgyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGVzdF92dGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKQorICAgIGdvdG8gb3V0OworCisgIF9kYnVzX2Fzc2VydCAoX2RidXNfb2JqZWN0X3RyZWVfZ2V0X3VzZXJfZGF0YV91bmxvY2tlZCAodHJlZSwgcGF0aDIpID09IE5VTEwpOworICBfZGJ1c19vYmplY3RfdHJlZV91bnJlZ2lzdGVyX2FuZF91bmxvY2sgKHRyZWUsIHBhdGgyKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMiwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWVfcmVnaXN0ZXJlZF9vcl91bnJlZ2lzdGVyZWQgKHRyZWUsIHBhdGgyKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZV9yZWdpc3RlcmVkX29yX3VucmVnaXN0ZXJlZCAodHJlZSwgcGF0aDEpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWVfcmVnaXN0ZXJlZF9vcl91bnJlZ2lzdGVyZWQgKHRyZWUsIHBhdGgwKSk7CisKKyAgLyogVGVzdCBmcmVlaW5nIGEgbG9uZyBwYXRoICovCisgIGlmICghZG9fcmVnaXN0ZXIgKHRyZWUsIHBhdGgzLCBUUlVFLCAzLCB0cmVlX3Rlc3RfZGF0YSkpCisgICAgZ290byBvdXQ7CisKKyAgX2RidXNfb2JqZWN0X3RyZWVfdW5yZWdpc3Rlcl9hbmRfdW5sb2NrICh0cmVlLCBwYXRoMyk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDMsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlX3JlZ2lzdGVyZWRfb3JfdW5yZWdpc3RlcmVkICh0cmVlLCBwYXRoMykpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWVfcmVnaXN0ZXJlZF9vcl91bnJlZ2lzdGVyZWQgKHRyZWUsIHBhdGgyKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZV9yZWdpc3RlcmVkX29yX3VucmVnaXN0ZXJlZCAodHJlZSwgcGF0aDEpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWVfcmVnaXN0ZXJlZF9vcl91bnJlZ2lzdGVyZWQgKHRyZWUsIHBhdGgwKSk7CisKKyAgLyogVGVzdCBmcmVlaW5nIG11bHRpcGxlIGNoaWxkcmVuIGZyb20gdGhlIHNhbWUgcGF0aCAqLworICBpZiAoIWRvX3JlZ2lzdGVyICh0cmVlLCBwYXRoMywgVFJVRSwgMywgdHJlZV90ZXN0X2RhdGEpKQorICAgIGdvdG8gb3V0OworICBpZiAoIWRvX3JlZ2lzdGVyICh0cmVlLCBwYXRoNCwgVFJVRSwgNCwgdHJlZV90ZXN0X2RhdGEpKQorICAgIGdvdG8gb3V0OworCisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMywgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDQsIE5VTEwpKTsKKworICBfZGJ1c19vYmplY3RfdHJlZV91bnJlZ2lzdGVyX2FuZF91bmxvY2sgKHRyZWUsIHBhdGgzKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMywgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWVfcmVnaXN0ZXJlZF9vcl91bnJlZ2lzdGVyZWQgKHRyZWUsIHBhdGgzKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoNCwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZV9yZWdpc3RlcmVkX29yX3VucmVnaXN0ZXJlZCAodHJlZSwgcGF0aDQpKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWVfcmVnaXN0ZXJlZF9vcl91bnJlZ2lzdGVyZWQgKHRyZWUsIHBhdGgyKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlX3JlZ2lzdGVyZWRfb3JfdW5yZWdpc3RlcmVkICh0cmVlLCBwYXRoMSkpOworCisgIF9kYnVzX29iamVjdF90cmVlX3VucmVnaXN0ZXJfYW5kX3VubG9jayAodHJlZSwgcGF0aDQpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGg0LCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZV9yZWdpc3RlcmVkX29yX3VucmVnaXN0ZXJlZCAodHJlZSwgcGF0aDQpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMywgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWVfcmVnaXN0ZXJlZF9vcl91bnJlZ2lzdGVyZWQgKHRyZWUsIHBhdGgzKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZV9yZWdpc3RlcmVkX29yX3VucmVnaXN0ZXJlZCAodHJlZSwgcGF0aDIpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlX3JlZ2lzdGVyZWRfb3JfdW5yZWdpc3RlcmVkICh0cmVlLCBwYXRoMSkpOworCisgIC8qIFRlc3Qgc3VidHJlZSByZW1vdmFsICovCisgIGlmICghX2RidXNfb2JqZWN0X3RyZWVfcmVnaXN0ZXIgKHRyZWUsIFRSVUUsIHBhdGgxMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRlc3RfdnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkKKyAgICBnb3RvIG91dDsKKworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDEyLCBOVUxMKSk7CisKKyAgaWYgKCFfZGJ1c19vYmplY3RfdHJlZV9yZWdpc3RlciAodHJlZSwgVFJVRSwgcGF0aDEzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGVzdF92dGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKQorICAgIGdvdG8gb3V0OworCisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMTMsIE5VTEwpKTsKKworICBpZiAoIV9kYnVzX29iamVjdF90cmVlX3JlZ2lzdGVyICh0cmVlLCBUUlVFLCBwYXRoMTQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZXN0X3Z0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpCisgICAgZ290byBvdXQ7CisKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgxNCwgTlVMTCkpOworCisgIF9kYnVzX29iamVjdF90cmVlX3VucmVnaXN0ZXJfYW5kX3VubG9jayAodHJlZSwgcGF0aDEyKTsKKworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWVfcmVnaXN0ZXJlZF9vcl91bnJlZ2lzdGVyZWQgKHRyZWUsIHBhdGgxMikpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDEzLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMTQsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlX3JlZ2lzdGVyZWRfb3JfdW5yZWdpc3RlcmVkICh0cmVlLCBwYXRoOSkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZV9yZWdpc3RlcmVkX29yX3VucmVnaXN0ZXJlZCAodHJlZSwgcGF0aDUpKTsKKworICBpZiAoIV9kYnVzX29iamVjdF90cmVlX3JlZ2lzdGVyICh0cmVlLCBUUlVFLCBwYXRoMTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZXN0X3Z0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpCisgICAgZ290byBvdXQ7CisKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgxMiwgTlVMTCkpOworCisgIF9kYnVzX29iamVjdF90cmVlX3VucmVnaXN0ZXJfYW5kX3VubG9jayAodHJlZSwgcGF0aDEzKTsKKworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDEyLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZV9yZWdpc3RlcmVkX29yX3VucmVnaXN0ZXJlZCAodHJlZSwgcGF0aDEzKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMTQsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZmluZF9zdWJ0cmVlX3JlZ2lzdGVyZWRfb3JfdW5yZWdpc3RlcmVkICh0cmVlLCBwYXRoMTApKTsKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWVfcmVnaXN0ZXJlZF9vcl91bnJlZ2lzdGVyZWQgKHRyZWUsIHBhdGg1KSk7CisKKyAgaWYgKCFfZGJ1c19vYmplY3RfdHJlZV9yZWdpc3RlciAodHJlZSwgVFJVRSwgcGF0aDEzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGVzdF92dGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKQorICAgIGdvdG8gb3V0OworCisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlICh0cmVlLCBwYXRoMTMsIE5VTEwpKTsKKworICBfZGJ1c19vYmplY3RfdHJlZV91bnJlZ2lzdGVyX2FuZF91bmxvY2sgKHRyZWUsIHBhdGgxNCk7CisKKyAgX2RidXNfYXNzZXJ0IChmaW5kX3N1YnRyZWUgKHRyZWUsIHBhdGgxMiwgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGZpbmRfc3VidHJlZSAodHJlZSwgcGF0aDEzLCBOVUxMKSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZV9yZWdpc3RlcmVkX29yX3VucmVnaXN0ZXJlZCAodHJlZSwgcGF0aDE0KSk7CisgIF9kYnVzX2Fzc2VydCAoIWZpbmRfc3VidHJlZV9yZWdpc3RlcmVkX29yX3VucmVnaXN0ZXJlZCAodHJlZSwgcGF0aDExKSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlX3JlZ2lzdGVyZWRfb3JfdW5yZWdpc3RlcmVkICh0cmVlLCBwYXRoNSkpOworCisgIF9kYnVzX29iamVjdF90cmVlX3VucmVnaXN0ZXJfYW5kX3VubG9jayAodHJlZSwgcGF0aDEyKTsKKworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWVfcmVnaXN0ZXJlZF9vcl91bnJlZ2lzdGVyZWQgKHRyZWUsIHBhdGgxMikpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWVfcmVnaXN0ZXJlZF9vcl91bnJlZ2lzdGVyZWQgKHRyZWUsIHBhdGg5KSk7CisgIF9kYnVzX2Fzc2VydCAoZmluZF9zdWJ0cmVlX3JlZ2lzdGVyZWRfb3JfdW5yZWdpc3RlcmVkICh0cmVlLCBwYXRoNSkpOworCisgIF9kYnVzX29iamVjdF90cmVlX3VucmVnaXN0ZXJfYW5kX3VubG9jayAodHJlZSwgcGF0aDEzKTsKKworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWVfcmVnaXN0ZXJlZF9vcl91bnJlZ2lzdGVyZWQgKHRyZWUsIHBhdGgxMykpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWVfcmVnaXN0ZXJlZF9vcl91bnJlZ2lzdGVyZWQgKHRyZWUsIHBhdGgxMCkpOworICBfZGJ1c19hc3NlcnQgKCFmaW5kX3N1YnRyZWVfcmVnaXN0ZXJlZF9vcl91bnJlZ2lzdGVyZWQgKHRyZWUsIHBhdGg1KSk7CisKKyNpZiAwCisgIC8qIFRlc3QgYXR0ZW1wdGluZyB0byB1bnJlZ2lzdGVyIG5vbi1leGlzdGVudCBwYXRocy4gIFRoZXNlIHRyaWdnZXIKKyAgICAgIkF0dGVtcHRlZCB0byB1bnJlZ2lzdGVyIHBhdGggLi4uIiB3YXJuaW5nIG1lc3NhZ2VzICovCisgIF9kYnVzX29iamVjdF90cmVlX3VucmVnaXN0ZXJfYW5kX3VubG9jayAodHJlZSwgcGF0aDApOworICBfZGJ1c19vYmplY3RfdHJlZV91bnJlZ2lzdGVyX2FuZF91bmxvY2sgKHRyZWUsIHBhdGgxKTsKKyAgX2RidXNfb2JqZWN0X3RyZWVfdW5yZWdpc3Rlcl9hbmRfdW5sb2NrICh0cmVlLCBwYXRoMik7CisgIF9kYnVzX29iamVjdF90cmVlX3VucmVnaXN0ZXJfYW5kX3VubG9jayAodHJlZSwgcGF0aDMpOworICBfZGJ1c19vYmplY3RfdHJlZV91bnJlZ2lzdGVyX2FuZF91bmxvY2sgKHRyZWUsIHBhdGg0KTsKKyNlbmRpZgorCisgIC8qIFJlZ2lzdGVyIGl0IGFsbCBhZ2FpbiwgYW5kIHRlc3QgZGlzcGF0Y2ggKi8KKyAgCisgIGlmICghZG9fcmVnaXN0ZXIgKHRyZWUsIHBhdGgwLCBUUlVFLCAwLCB0cmVlX3Rlc3RfZGF0YSkpCisgICAgZ290byBvdXQ7CisgIGlmICghZG9fcmVnaXN0ZXIgKHRyZWUsIHBhdGgxLCBGQUxTRSwgMSwgdHJlZV90ZXN0X2RhdGEpKQorICAgIGdvdG8gb3V0OworICBpZiAoIWRvX3JlZ2lzdGVyICh0cmVlLCBwYXRoMiwgVFJVRSwgMiwgdHJlZV90ZXN0X2RhdGEpKQorICAgIGdvdG8gb3V0OworICBpZiAoIWRvX3JlZ2lzdGVyICh0cmVlLCBwYXRoMywgVFJVRSwgMywgdHJlZV90ZXN0X2RhdGEpKQorICAgIGdvdG8gb3V0OworICBpZiAoIWRvX3JlZ2lzdGVyICh0cmVlLCBwYXRoNCwgVFJVRSwgNCwgdHJlZV90ZXN0X2RhdGEpKQorICAgIGdvdG8gb3V0OworICBpZiAoIWRvX3JlZ2lzdGVyICh0cmVlLCBwYXRoNSwgVFJVRSwgNSwgdHJlZV90ZXN0X2RhdGEpKQorICAgIGdvdG8gb3V0OworICBpZiAoIWRvX3JlZ2lzdGVyICh0cmVlLCBwYXRoNiwgRkFMU0UsIDYsIHRyZWVfdGVzdF9kYXRhKSkKKyAgICBnb3RvIG91dDsKKyAgaWYgKCFkb19yZWdpc3RlciAodHJlZSwgcGF0aDcsIFRSVUUsIDcsIHRyZWVfdGVzdF9kYXRhKSkKKyAgICBnb3RvIG91dDsKKyAgaWYgKCFkb19yZWdpc3RlciAodHJlZSwgcGF0aDgsIFRSVUUsIDgsIHRyZWVfdGVzdF9kYXRhKSkKKyAgICBnb3RvIG91dDsKKworI2lmIDAKKyAgc3Bld190cmVlICh0cmVlKTsKKyNlbmRpZgorCisgIGlmICghZG9fdGVzdF9kaXNwYXRjaCAodHJlZSwgcGF0aDAsIDAsIHRyZWVfdGVzdF9kYXRhLCBfREJVU19OX0VMRU1FTlRTICh0cmVlX3Rlc3RfZGF0YSkpKQorICAgIGdvdG8gb3V0OworICBpZiAoIWRvX3Rlc3RfZGlzcGF0Y2ggKHRyZWUsIHBhdGgxLCAxLCB0cmVlX3Rlc3RfZGF0YSwgX0RCVVNfTl9FTEVNRU5UUyAodHJlZV90ZXN0X2RhdGEpKSkKKyAgICBnb3RvIG91dDsKKyAgaWYgKCFkb190ZXN0X2Rpc3BhdGNoICh0cmVlLCBwYXRoMiwgMiwgdHJlZV90ZXN0X2RhdGEsIF9EQlVTX05fRUxFTUVOVFMgKHRyZWVfdGVzdF9kYXRhKSkpCisgICAgZ290byBvdXQ7CisgIGlmICghZG9fdGVzdF9kaXNwYXRjaCAodHJlZSwgcGF0aDMsIDMsIHRyZWVfdGVzdF9kYXRhLCBfREJVU19OX0VMRU1FTlRTICh0cmVlX3Rlc3RfZGF0YSkpKQorICAgIGdvdG8gb3V0OworICBpZiAoIWRvX3Rlc3RfZGlzcGF0Y2ggKHRyZWUsIHBhdGg0LCA0LCB0cmVlX3Rlc3RfZGF0YSwgX0RCVVNfTl9FTEVNRU5UUyAodHJlZV90ZXN0X2RhdGEpKSkKKyAgICBnb3RvIG91dDsKKyAgaWYgKCFkb190ZXN0X2Rpc3BhdGNoICh0cmVlLCBwYXRoNSwgNSwgdHJlZV90ZXN0X2RhdGEsIF9EQlVTX05fRUxFTUVOVFMgKHRyZWVfdGVzdF9kYXRhKSkpCisgICAgZ290byBvdXQ7CisgIGlmICghZG9fdGVzdF9kaXNwYXRjaCAodHJlZSwgcGF0aDYsIDYsIHRyZWVfdGVzdF9kYXRhLCBfREJVU19OX0VMRU1FTlRTICh0cmVlX3Rlc3RfZGF0YSkpKQorICAgIGdvdG8gb3V0OworICBpZiAoIWRvX3Rlc3RfZGlzcGF0Y2ggKHRyZWUsIHBhdGg3LCA3LCB0cmVlX3Rlc3RfZGF0YSwgX0RCVVNfTl9FTEVNRU5UUyAodHJlZV90ZXN0X2RhdGEpKSkKKyAgICBnb3RvIG91dDsKKyAgaWYgKCFkb190ZXN0X2Rpc3BhdGNoICh0cmVlLCBwYXRoOCwgOCwgdHJlZV90ZXN0X2RhdGEsIF9EQlVTX05fRUxFTUVOVFMgKHRyZWVfdGVzdF9kYXRhKSkpCisgICAgZ290byBvdXQ7CisgIAorIG91dDoKKyAgaWYgKHRyZWUpCisgICAgeworICAgICAgLyogdGVzdCByZWYgKi8KKyAgICAgIF9kYnVzX29iamVjdF90cmVlX3JlZiAodHJlZSk7CisgICAgICBfZGJ1c19vYmplY3RfdHJlZV91bnJlZiAodHJlZSk7CisgICAgICBfZGJ1c19vYmplY3RfdHJlZV91bnJlZiAodHJlZSk7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIEBpbmdyb3VwIERCdXNPYmplY3RUcmVlCisgKiBVbml0IHRlc3QgZm9yIERCdXNPYmplY3RUcmVlCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzLgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfb2JqZWN0X3RyZWVfdGVzdCAodm9pZCkKK3sKKyAgcmV0dXJuIF9kYnVzX3Rlc3Rfb29tX2hhbmRsaW5nICgib2JqZWN0IHRyZWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdF90cmVlX3Rlc3RfaXRlcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworfQorCisjZW5kaWYgLyogIURPWFlHRU5fU0hPVUxEX1NLSVBfVEhJUyAqLworCisjZW5kaWYgLyogREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMgKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1vYmplY3QtdHJlZS5oIGIvZGJ1cy9kYnVzLW9iamVjdC10cmVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU3NmMyNQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1vYmplY3QtdHJlZS5oCkBAIC0wLDAgKzEsNjMgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1vYmplY3QtdHJlZS5oICBEQnVzT2JqZWN0VHJlZSAoaW50ZXJuYWxzIG9mIERCdXNDb25uZWN0aW9uKQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaWZuZGVmIERCVVNfT0JKRUNUX1RSRUVfSAorI2RlZmluZSBEQlVTX09CSkVDVF9UUkVFX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy1jb25uZWN0aW9uLmg+CisKK0RCVVNfQkVHSU5fREVDTFMKKwordHlwZWRlZiBzdHJ1Y3QgREJ1c09iamVjdFRyZWUgREJ1c09iamVjdFRyZWU7CisKK0RCdXNPYmplY3RUcmVlKiBfZGJ1c19vYmplY3RfdHJlZV9uZXcgICAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOworREJ1c09iamVjdFRyZWUqIF9kYnVzX29iamVjdF90cmVlX3JlZiAgIChEQnVzT2JqZWN0VHJlZSAqdHJlZSk7Cit2b2lkICAgICAgICAgICAgX2RidXNfb2JqZWN0X3RyZWVfdW5yZWYgKERCdXNPYmplY3RUcmVlICp0cmVlKTsKKworZGJ1c19ib29sX3QgICAgICAgX2RidXNfb2JqZWN0X3RyZWVfcmVnaXN0ZXIgICAgICAgICAgICAgICAoREJ1c09iamVjdFRyZWUgICAgICAgICAgICAgICp0cmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgICAgICAgICAgICBmYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICAgICAgICAgICoqcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNPYmplY3RQYXRoVlRhYmxlICAqdnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICp1c2VyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAgICAgICAgICAgKmVycm9yKTsKK3ZvaWQgICAgICAgICAgICAgIF9kYnVzX29iamVjdF90cmVlX3VucmVnaXN0ZXJfYW5kX3VubG9jayAgKERCdXNPYmplY3RUcmVlICAgICAgICAgICAgICAqdHJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICAgICAgICAgICoqcGF0aCk7CitEQnVzSGFuZGxlclJlc3VsdCBfZGJ1c19vYmplY3RfdHJlZV9kaXNwYXRjaF9hbmRfdW5sb2NrICAgIChEQnVzT2JqZWN0VHJlZSAgICAgICAgICAgICAgKnRyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgICAgICAgICAgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICAgICAgICAgICAgKmZvdW5kX29iamVjdCk7Cit2b2lkKiAgICAgICAgICAgICBfZGJ1c19vYmplY3RfdHJlZV9nZXRfdXNlcl9kYXRhX3VubG9ja2VkIChEQnVzT2JqZWN0VHJlZSAgICAgICAgICAgICAgKnRyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAgICAgICAgICAqKnBhdGgpOwordm9pZCAgICAgICAgICAgICAgX2RidXNfb2JqZWN0X3RyZWVfZnJlZV9hbGxfdW5sb2NrZWQgICAgICAoREJ1c09iamVjdFRyZWUgICAgICAgICAgICAgICp0cmVlKTsKKworCitkYnVzX2Jvb2xfdCBfZGJ1c19vYmplY3RfdHJlZV9saXN0X3JlZ2lzdGVyZWRfYW5kX3VubG9jayAoREJ1c09iamVjdFRyZWUgKnRyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAqKnBhcmVudF9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICAqKipjaGlsZF9lbnRyaWVzKTsKKworZGJ1c19ib29sX3QgX2RidXNfZGVjb21wb3NlX3BhdGggKGNvbnN0IGNoYXIgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICoqKnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICpwYXRoX2xlbik7CisKK0RCVVNfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBEQlVTX09CSkVDVF9UUkVFX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1wZW5kaW5nLWNhbGwtaW50ZXJuYWwuaCBiL2RidXMvZGJ1cy1wZW5kaW5nLWNhbGwtaW50ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjM3OWI0Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLXBlbmRpbmctY2FsbC1pbnRlcm5hbC5oCkBAIC0wLDAgKzEsNzEgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1wZW5kaW5nLWNhbGwtaW50ZXJuYWwuaCBEQnVzUGVuZGluZ0NhbGwgaW50ZXJuYWwgaW50ZXJmYWNlcworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiAgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaWZuZGVmIERCVVNfUEVORElOR19DQUxMX0lOVEVSTkFMX0gKKyNkZWZpbmUgREJVU19QRU5ESU5HX0NBTExfSU5URVJOQUxfSAorCisKKyNpbmNsdWRlIDxkYnVzL2RidXMtaW50ZXJuYWxzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLW1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtY29ubmVjdGlvbi5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1saXN0Lmg+CisKK0RCVVNfQkVHSU5fREVDTFMKKworZGJ1c19ib29sX3QgICAgICBfZGJ1c19wZW5kaW5nX2NhbGxfaXNfdGltZW91dF9hZGRlZF91bmxvY2tlZCAgICAoREJ1c1BlbmRpbmdDYWxsICAgICpwZW5kaW5nKTsKK3ZvaWQgICAgICAgICAgICAgX2RidXNfcGVuZGluZ19jYWxsX3NldF90aW1lb3V0X2FkZGVkX3VubG9ja2VkICAgKERCdXNQZW5kaW5nQ2FsbCAgICAqcGVuZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgICAgaXNfYWRkZWQpOworREJ1c1RpbWVvdXQgICAgKiBfZGJ1c19wZW5kaW5nX2NhbGxfZ2V0X3RpbWVvdXRfdW5sb2NrZWQgICAgICAgICAoREJ1c1BlbmRpbmdDYWxsICAgICpwZW5kaW5nKTsKK2RidXNfdWludDMyX3QgICAgX2RidXNfcGVuZGluZ19jYWxsX2dldF9yZXBseV9zZXJpYWxfdW5sb2NrZWQgICAgKERCdXNQZW5kaW5nQ2FsbCAgICAqcGVuZGluZyk7Cit2b2lkICAgICAgICAgICAgIF9kYnVzX3BlbmRpbmdfY2FsbF9zZXRfcmVwbHlfc2VyaWFsX3VubG9ja2VkICAgIChEQnVzUGVuZGluZ0NhbGwgICAgKnBlbmRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90ICAgICAgIHNlcmlhbCk7CitEQnVzQ29ubmVjdGlvbiAqIF9kYnVzX3BlbmRpbmdfY2FsbF9nZXRfY29ubmVjdGlvbl9hbmRfbG9jayAgICAgIChEQnVzUGVuZGluZ0NhbGwgICAgKnBlbmRpbmcpOworREJ1c0Nvbm5lY3Rpb24gKiBfZGJ1c19wZW5kaW5nX2NhbGxfZ2V0X2Nvbm5lY3Rpb25fdW5sb2NrZWQgICAgICAoREJ1c1BlbmRpbmdDYWxsICAgICpwZW5kaW5nKTsKK2RidXNfYm9vbF90ICAgICAgX2RidXNfcGVuZGluZ19jYWxsX2dldF9jb21wbGV0ZWRfdW5sb2NrZWQgICAgICAgKERCdXNQZW5kaW5nQ2FsbCAgICAqcGVuZGluZyk7CisKK3ZvaWQgICAgICAgICAgICAgX2RidXNfcGVuZGluZ19jYWxsX3N0YXJ0X2NvbXBsZXRpb25fdW5sb2NrZWQgICAgKERCdXNQZW5kaW5nQ2FsbCAgICAqcGVuZGluZyk7Cit2b2lkICAgICAgICAgICAgIF9kYnVzX3BlbmRpbmdfY2FsbF9maW5pc2hfY29tcGxldGlvbiAgICAgICAgICAgIChEQnVzUGVuZGluZ0NhbGwgICAgKnBlbmRpbmcpOworCit2b2lkICAgICAgICAgICAgIF9kYnVzX3BlbmRpbmdfY2FsbF9zZXRfcmVwbHlfdW5sb2NrZWQgICAgICAgICAgIChEQnVzUGVuZGluZ0NhbGwgICAgKnBlbmRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgICAgKm1lc3NhZ2UpOwordm9pZCAgICAgICAgICAgICBfZGJ1c19wZW5kaW5nX2NhbGxfcXVldWVfdGltZW91dF9lcnJvcl91bmxvY2tlZCAoREJ1c1BlbmRpbmdDYWxsICAgICpwZW5kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gICAgICpjb25uZWN0aW9uKTsKK2RidXNfYm9vbF90ICAgICAgX2RidXNfcGVuZGluZ19jYWxsX3NldF90aW1lb3V0X2Vycm9yX3VubG9ja2VkICAgKERCdXNQZW5kaW5nQ2FsbCAgICAqcGVuZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgICAgICAgc2VyaWFsKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK0RCdXNQZW5kaW5nQ2FsbCogX2RidXNfcGVuZGluZ19jYWxsX25ld191bmxvY2tlZCAgICAgICAgICAgICAgICAgKERCdXNDb25uZWN0aW9uICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgdGltZW91dF9taWxsaXNlY29uZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVGltZW91dEhhbmRsZXIgIHRpbWVvdXRfaGFuZGxlcik7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitEQnVzUGVuZGluZ0NhbGwqIF9kYnVzX3BlbmRpbmdfY2FsbF9yZWZfdW5sb2NrZWQgICAgICAgICAgICAgICAgIChEQnVzUGVuZGluZ0NhbGwgICAgKnBlbmRpbmcpOworREJVU19QUklWQVRFX0VYUE9SVAordm9pZCAgICAgICAgICAgICBfZGJ1c19wZW5kaW5nX2NhbGxfdW5yZWZfYW5kX3VubG9jayAgICAgICAgICAgICAoREJ1c1BlbmRpbmdDYWxsICAgICpwZW5kaW5nKTsKK2RidXNfYm9vbF90ICAgICAgX2RidXNfcGVuZGluZ19jYWxsX3NldF9kYXRhX3VubG9ja2VkICAgICAgICAgICAgKERCdXNQZW5kaW5nQ2FsbCAgICAqcGVuZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfaW50MzJfdCAgICAgICAgc2xvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNGcmVlRnVuY3Rpb24gICAgZnJlZV9kYXRhX2Z1bmMpOworCisKK0RCVVNfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBEQlVTX1BFTkRJTkdfQ0FMTF9JTlRFUk5BTF9IICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtcGVuZGluZy1jYWxsLmMgYi9kYnVzL2RidXMtcGVuZGluZy1jYWxsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA1N2I0OQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1wZW5kaW5nLWNhbGwuYwpAQCAtMCwwICsxLDg2OSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXBlbmRpbmctY2FsbC5jIE9iamVjdCByZXByZXNlbnRpbmcgYSBjYWxsIGluIHByb2dyZXNzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMyBSZWQgSGF0IEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLWludGVybmFscy5oIgorI2luY2x1ZGUgImRidXMtY29ubmVjdGlvbi1pbnRlcm5hbC5oIgorI2luY2x1ZGUgImRidXMtbWVzc2FnZS1pbnRlcm5hbC5oIgorI2luY2x1ZGUgImRidXMtcGVuZGluZy1jYWxsLWludGVybmFsLmgiCisjaW5jbHVkZSAiZGJ1cy1wZW5kaW5nLWNhbGwuaCIKKyNpbmNsdWRlICJkYnVzLWxpc3QuaCIKKyNpbmNsdWRlICJkYnVzLXRocmVhZHMuaCIKKyNpbmNsdWRlICJkYnVzLXRlc3QuaCIKKworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c1BlbmRpbmdDYWxsSW50ZXJuYWxzIERCdXNQZW5kaW5nQ2FsbCBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzCisgKiBAaW5ncm91cCBEQnVzSW50ZXJuYWxzCisgKiBAYnJpZWYgREJ1c1BlbmRpbmdDYWxsIHByaXZhdGUgaW1wbGVtZW50YXRpb24gZGV0YWlscy4KKyAqCisgKiBUaGUgZ3V0cyBvZiBEQnVzUGVuZGluZ0NhbGwgYW5kIGl0cyBtZXRob2RzLgorICoKKyAqIEB7CisgKi8KKworLyoqCisgKiBAYnJpZWYgSW50ZXJuYWxzIG9mIERCdXNQZW5kaW5nQ2FsbAorICoKKyAqIE9wYXF1ZSBvYmplY3QgcmVwcmVzZW50aW5nIGEgcmVwbHkgbWVzc2FnZSB0aGF0IHdlJ3JlIHdhaXRpbmcgZm9yLgorICovCisKKy8qKgorICogc2hvcnRlciBhbmQgbW9yZSB2aXNpYmxlIHdheSB0byB3cml0ZSBfZGJ1c19jb25uZWN0aW9uX2xvY2soKQorICovCisjZGVmaW5lIENPTk5FQ1RJT05fTE9DSyhjb25uZWN0aW9uKSAgIF9kYnVzX2Nvbm5lY3Rpb25fbG9jayhjb25uZWN0aW9uKQorLyoqCisgKiBzaG9ydGVyIGFuZCBtb3JlIHZpc2libGUgd2F5IHRvIHdyaXRlIF9kYnVzX2Nvbm5lY3Rpb25fdW5sb2NrKCkKKyAqLworI2RlZmluZSBDT05ORUNUSU9OX1VOTE9DSyhjb25uZWN0aW9uKSBfZGJ1c19jb25uZWN0aW9uX3VubG9jayhjb25uZWN0aW9uKQorCisvKioKKyAqIEltcGxlbWVudGF0aW9uIGRldGFpbHMgb2YgI0RCdXNQZW5kaW5nQ2FsbCAtIGFsbCBmaWVsZHMgYXJlIHByaXZhdGUuCisgKi8KK3N0cnVjdCBEQnVzUGVuZGluZ0NhbGwKK3sKKyAgREJ1c0F0b21pYyByZWZjb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2UgY291bnQgKi8KKworICBEQnVzRGF0YVNsb3RMaXN0IHNsb3RfbGlzdDsgICAgICAgICAgICAgICAgICAgICAvKio8IERhdGEgc3RvcmVkIGJ5IGFsbG9jYXRlZCBpbnRlZ2VyIElEICovCisgIAorICBEQnVzUGVuZGluZ0NhbGxOb3RpZnlGdW5jdGlvbiBmdW5jdGlvbjsgICAgICAgICAvKio8IE5vdGlmaWVyIHdoZW4gcmVwbHkgYXJyaXZlcy4gKi8KKworICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbjsgICAgICAgICAgICAgICAgICAgICAvKio8IENvbm5lY3Rpb25zIHdlJ3JlIGFzc29jaWF0ZWQgd2l0aCAqLworICBEQnVzTWVzc2FnZSAqcmVwbHk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFJlcGx5IChhZnRlciB3ZSd2ZSByZWNlaXZlZCBpdCkgKi8KKyAgREJ1c1RpbWVvdXQgKnRpbWVvdXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUaW1lb3V0ICovCisKKyAgREJ1c0xpc3QgKnRpbWVvdXRfbGluazsgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBQcmVhbGxvY2F0ZWQgdGltZW91dCByZXNwb25zZSAqLworICAKKyAgZGJ1c191aW50MzJfdCByZXBseV9zZXJpYWw7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBFeHBlY3RlZCBzZXJpYWwgb2YgcmVwbHkgKi8KKworICAvKioKKyAgICogVFJVRSBpZiBzb21lIHRocmVhZCBoYXMgdGFrZW4gcmVzcG9uc2liaWxpdHkgZm9yIGNvbXBsZXRpbmcgdGhpcworICAgKiBwZW5kaW5nIGNhbGw6IGVpdGhlciB0aGUgcGVuZGluZyBjYWxsIGhhcyBjb21wbGV0ZWQsIG9yIGl0IGlzIGFib3V0CisgICAqIHRvIGJlIGNvbXBsZXRlZC4gUHJvdGVjdGVkIGJ5IHRoZSBjb25uZWN0aW9uIGxvY2suCisgICAqLworICB1bnNpZ25lZCBpbnQgY29tcGxldGVkIDogMTsKKyAgLyoqCisgICAqIFRSVUUgaWYgd2UgaGF2ZSBhZGRlZCB0aGUgdGltZW91dC4gUHJvdGVjdGVkIGJ5IHRoZSBjb25uZWN0aW9uIGxvY2suCisgICAqLworICB1bnNpZ25lZCBpbnQgdGltZW91dF9hZGRlZCA6IDE7Cit9OworCitzdGF0aWMgdm9pZAorX2RidXNfcGVuZGluZ19jYWxsX3RyYWNlX3JlZiAoREJ1c1BlbmRpbmdDYWxsICpwZW5kaW5nX2NhbGwsCisgICAgaW50IG9sZF9yZWZjb3VudCwKKyAgICBpbnQgbmV3X3JlZmNvdW50LAorICAgIGNvbnN0IGNoYXIgKndoeSkKK3sKKyNpZmRlZiBEQlVTX0VOQUJMRV9WRVJCT1NFX01PREUKKyAgc3RhdGljIGludCBlbmFibGVkID0gLTE7CisKKyAgX2RidXNfdHJhY2VfcmVmICgiREJ1c1BlbmRpbmdDYWxsIiwgcGVuZGluZ19jYWxsLCBvbGRfcmVmY291bnQsCisgICAgICBuZXdfcmVmY291bnQsIHdoeSwgIkRCVVNfUEVORElOR19DQUxMX1RSQUNFIiwgJmVuYWJsZWQpOworI2VuZGlmCit9CisKK3N0YXRpYyBkYnVzX2ludDMyX3Qgbm90aWZ5X3VzZXJfZGF0YV9zbG90ID0gLTE7CisKKy8qKgorICogQ3JlYXRlcyBhIG5ldyBwZW5kaW5nIHJlcGx5IG9iamVjdC4KKyAqCisgKiBAcGFyYW0gY29ubmVjdGlvbiBjb25uZWN0aW9uIHdoZXJlIHJlcGx5IHdpbGwgYXJyaXZlCisgKiBAcGFyYW0gdGltZW91dF9taWxsaXNlY29uZHMgbGVuZ3RoIG9mIHRpbWVvdXQsIC0xIChvcgorICogICNEQlVTX1RJTUVPVVRfVVNFX0RFRkFVTFQpIGZvciBkZWZhdWx0LAorICogICNEQlVTX1RJTUVPVVRfSU5GSU5JVEUgZm9yIG5vIHRpbWVvdXQKKyAqIEBwYXJhbSB0aW1lb3V0X2hhbmRsZXIgdGltZW91dCBoYW5kbGVyLCB0YWtlcyBwZW5kaW5nIGNhbGwgYXMgZGF0YQorICogQHJldHVybnMgYSBuZXcgI0RCdXNQZW5kaW5nQ2FsbCBvciAjTlVMTCBpZiBubyBtZW1vcnkuCisgKi8KK0RCdXNQZW5kaW5nQ2FsbCoKK19kYnVzX3BlbmRpbmdfY2FsbF9uZXdfdW5sb2NrZWQgKERCdXNDb25uZWN0aW9uICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIHRpbWVvdXRfbWlsbGlzZWNvbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1RpbWVvdXRIYW5kbGVyIHRpbWVvdXRfaGFuZGxlcikKK3sKKyAgREJ1c1BlbmRpbmdDYWxsICpwZW5kaW5nOworICBEQnVzVGltZW91dCAqdGltZW91dDsKKworICBfZGJ1c19hc3NlcnQgKHRpbWVvdXRfbWlsbGlzZWNvbmRzID49IDAgfHwgdGltZW91dF9taWxsaXNlY29uZHMgPT0gLTEpOworIAorICBpZiAodGltZW91dF9taWxsaXNlY29uZHMgPT0gLTEpCisgICAgdGltZW91dF9taWxsaXNlY29uZHMgPSBfREJVU19ERUZBVUxUX1RJTUVPVVRfVkFMVUU7CisKKyAgaWYgKCFkYnVzX3BlbmRpbmdfY2FsbF9hbGxvY2F0ZV9kYXRhX3Nsb3QgKCZub3RpZnlfdXNlcl9kYXRhX3Nsb3QpKQorICAgIHJldHVybiBOVUxMOworICAKKyAgcGVuZGluZyA9IGRidXNfbmV3MCAoREJ1c1BlbmRpbmdDYWxsLCAxKTsKKyAgCisgIGlmIChwZW5kaW5nID09IE5VTEwpCisgICAgeworICAgICAgZGJ1c19wZW5kaW5nX2NhbGxfZnJlZV9kYXRhX3Nsb3QgKCZub3RpZnlfdXNlcl9kYXRhX3Nsb3QpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIGlmICh0aW1lb3V0X21pbGxpc2Vjb25kcyAhPSBEQlVTX1RJTUVPVVRfSU5GSU5JVEUpCisgICAgeworICAgICAgdGltZW91dCA9IF9kYnVzX3RpbWVvdXRfbmV3ICh0aW1lb3V0X21pbGxpc2Vjb25kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dF9oYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nLCBOVUxMKTsgIAorCisgICAgICBpZiAodGltZW91dCA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19wZW5kaW5nX2NhbGxfZnJlZV9kYXRhX3Nsb3QgKCZub3RpZnlfdXNlcl9kYXRhX3Nsb3QpOworICAgICAgICAgIGRidXNfZnJlZSAocGVuZGluZyk7CisgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgcGVuZGluZy0+dGltZW91dCA9IHRpbWVvdXQ7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgcGVuZGluZy0+dGltZW91dCA9IE5VTEw7CisgICAgfQorCisgIF9kYnVzX2F0b21pY19pbmMgKCZwZW5kaW5nLT5yZWZjb3VudCk7CisgIHBlbmRpbmctPmNvbm5lY3Rpb24gPSBjb25uZWN0aW9uOworICBfZGJ1c19jb25uZWN0aW9uX3JlZl91bmxvY2tlZCAocGVuZGluZy0+Y29ubmVjdGlvbik7CisKKyAgX2RidXNfZGF0YV9zbG90X2xpc3RfaW5pdCAoJnBlbmRpbmctPnNsb3RfbGlzdCk7CisKKyAgX2RidXNfcGVuZGluZ19jYWxsX3RyYWNlX3JlZiAocGVuZGluZywgMCwgMSwgIm5ld191bmxvY2tlZCIpOworCisgIHJldHVybiBwZW5kaW5nOworfQorCisvKioKKyAqIFNldHMgdGhlIHJlcGx5IG9mIGEgcGVuZGluZyBjYWxsIHdpdGggdGhlIGdpdmVuIG1lc3NhZ2UsCisgKiBvciBpZiB0aGUgbWVzc2FnZSBpcyAjTlVMTCwgYnkgdGltaW5nIG91dCB0aGUgcGVuZGluZyBjYWxsLgorICogCisgKiBAcGFyYW0gcGVuZGluZyB0aGUgcGVuZGluZyBjYWxsCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB0byBjb21wbGV0ZSB0aGUgY2FsbCB3aXRoLCBvciAjTlVMTAorICogIHRvIHRpbWUgb3V0IHRoZSBjYWxsCisgKi8KK3ZvaWQKK19kYnVzX3BlbmRpbmdfY2FsbF9zZXRfcmVwbHlfdW5sb2NrZWQgKERCdXNQZW5kaW5nQ2FsbCAqcGVuZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICAqbWVzc2FnZSkKK3sKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICB7CisgICAgICBtZXNzYWdlID0gcGVuZGluZy0+dGltZW91dF9saW5rLT5kYXRhOworICAgICAgX2RidXNfbGlzdF9jbGVhciAoJnBlbmRpbmctPnRpbWVvdXRfbGluayk7CisgICAgfQorICBlbHNlCisgICAgZGJ1c19tZXNzYWdlX3JlZiAobWVzc2FnZSk7CisKKyAgX2RidXNfdmVyYm9zZSAoIiAgaGFuZGluZyBtZXNzYWdlICVwICglcykgdG8gcGVuZGluZyBjYWxsIHNlcmlhbCAldVxuIiwKKyAgICAgICAgICAgICAgICAgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlKSA9PSBEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfUkVUVVJOID8KKyAgICAgICAgICAgICAgICAgIm1ldGhvZCByZXR1cm4iIDoKKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlKSA9PSBEQlVTX01FU1NBR0VfVFlQRV9FUlJPUiA/CisgICAgICAgICAgICAgICAgICJlcnJvciIgOiAib3RoZXIgdHlwZSIsCisgICAgICAgICAgICAgICAgIHBlbmRpbmctPnJlcGx5X3NlcmlhbCk7CisgIAorICBfZGJ1c19hc3NlcnQgKHBlbmRpbmctPnJlcGx5ID09IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKHBlbmRpbmctPnJlcGx5X3NlcmlhbCA9PSBkYnVzX21lc3NhZ2VfZ2V0X3JlcGx5X3NlcmlhbCAobWVzc2FnZSkpOworICBwZW5kaW5nLT5yZXBseSA9IG1lc3NhZ2U7Cit9CisKKy8qKgorICogU2V0cyB0aGUgcGVuZGluZyBjYWxsIHRvIGNvbXBsZXRlZAorICoKKyAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aXRoIHRoZSBjb25uZWN0aW9uIGxvY2sgaGVsZCwgdG8gcHJvdGVjdAorICogcGVuZGluZy0+Y29tcGxldGVkLiBJdCBtdXN0IGJlIHBhaXJlZCB3aXRoIGEgY2FsbCB0bworICogX2RidXNfcGVuZGluZ19jYWxsX2ZpbmlzaF9jb21wbGV0aW9uKCkgYWZ0ZXIgdGhlIGNvbm5lY3Rpb24gbG9jayBoYXMKKyAqIGJlZW4gcmVsZWFzZWQuCisgKgorICogQHBhcmFtIHBlbmRpbmcgdGhlIHBlbmRpbmcgY2FsbAorICovCit2b2lkCitfZGJ1c19wZW5kaW5nX2NhbGxfc3RhcnRfY29tcGxldGlvbl91bmxvY2tlZCAoREJ1c1BlbmRpbmdDYWxsICpwZW5kaW5nKQoreworICBfZGJ1c19hc3NlcnQgKCFwZW5kaW5nLT5jb21wbGV0ZWQpOworICAKKyAgcGVuZGluZy0+Y29tcGxldGVkID0gVFJVRTsKK30KKworLyoqCisgKiBDYWxsIHRoZSBub3RpZmllciBmdW5jdGlvbiBmb3IgdGhlIHBlbmRpbmcgY2FsbC4KKyAqCisgKiBUaGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgY29ubmVjdGlvbiBsb2NrIGhhcyBiZWVuCisgKiByZWxlYXNlZCwgYW5kIG11c3QgYmUgcGFpcmVkIHdpdGggYSBjYWxsIHRvCisgKiBfZGJ1c19wZW5kaW5nX2NhbGxfc3RhcnRfY29tcGxldGlvbl91bmxvY2tlZCgpLgorICoKKyAqIEBwYXJhbSBwZW5kaW5nIHRoZSBwZW5kaW5nIGNhbGwKKyAqLwordm9pZAorX2RidXNfcGVuZGluZ19jYWxsX2ZpbmlzaF9jb21wbGV0aW9uIChEQnVzUGVuZGluZ0NhbGwgKnBlbmRpbmcpCit7CisgIF9kYnVzX2Fzc2VydCAocGVuZGluZy0+Y29tcGxldGVkKTsKKworICBpZiAocGVuZGluZy0+ZnVuY3Rpb24pCisgICAgeworICAgICAgdm9pZCAqdXNlcl9kYXRhOworICAgICAgdXNlcl9kYXRhID0gZGJ1c19wZW5kaW5nX2NhbGxfZ2V0X2RhdGEgKHBlbmRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5X3VzZXJfZGF0YV9zbG90KTsKKyAgICAgIAorICAgICAgKCogcGVuZGluZy0+ZnVuY3Rpb24pIChwZW5kaW5nLCB1c2VyX2RhdGEpOworICAgIH0KK30KKworLyoqCisgKiBJZiB0aGUgcGVuZGluZyBjYWxsIGhhc24ndCBiZWVuIHRpbWVkIG91dCwgYWRkIGl0cyB0aW1lb3V0CisgKiBlcnJvciByZXBseSB0byB0aGUgY29ubmVjdGlvbidzIGluY29taW5nIG1lc3NhZ2UgcXVldWUuCisgKgorICogQHBhcmFtIHBlbmRpbmcgdGhlIHBlbmRpbmcgY2FsbAorICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGNvbm5lY3Rpb24gdGhlIGNhbGwgd2FzIHNlbnQgdG8KKyAqLwordm9pZAorX2RidXNfcGVuZGluZ19jYWxsX3F1ZXVlX3RpbWVvdXRfZXJyb3JfdW5sb2NrZWQgKERCdXNQZW5kaW5nQ2FsbCAqcGVuZGluZywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gICpjb25uZWN0aW9uKQoreworICBfZGJ1c19hc3NlcnQgKGNvbm5lY3Rpb24gPT0gcGVuZGluZy0+Y29ubmVjdGlvbik7CisgIAorICBpZiAocGVuZGluZy0+dGltZW91dF9saW5rKQorICAgIHsKKyAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fcXVldWVfc3ludGhlc2l6ZWRfbWVzc2FnZV9saW5rIChjb25uZWN0aW9uLAorCQkJCQkJICAgICAgIHBlbmRpbmctPnRpbWVvdXRfbGluayk7CisgICAgICBwZW5kaW5nLT50aW1lb3V0X2xpbmsgPSBOVUxMOworICAgIH0KK30KKworLyoqCisgKiBDaGVja3MgdG8gc2VlIGlmIGEgdGltZW91dCBoYXMgYmVlbiBhZGRlZAorICoKKyAqIEBwYXJhbSBwZW5kaW5nIHRoZSBwZW5kaW5nX2NhbGwKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZXJlIGlzIGEgdGltZW91dCBvciAjRkFMU0UgaWYgbm90CisgKi8KK2RidXNfYm9vbF90IAorX2RidXNfcGVuZGluZ19jYWxsX2lzX3RpbWVvdXRfYWRkZWRfdW5sb2NrZWQgKERCdXNQZW5kaW5nQ2FsbCAgKnBlbmRpbmcpCit7CisgIF9kYnVzX2Fzc2VydCAocGVuZGluZyAhPSBOVUxMKTsKKworICByZXR1cm4gcGVuZGluZy0+dGltZW91dF9hZGRlZDsKK30KKworCisvKioKKyAqIFNldHMgd2V0aGVyIHRoZSB0aW1lb3V0IGhhcyBiZWVuIGFkZGVkCisgKgorICogQHBhcmFtIHBlbmRpbmcgdGhlIHBlbmRpbmdfY2FsbAorICogQHBhcmFtIGlzX2FkZGVkIHdoZXRoZXIgb3Igbm90IGEgdGltZW91dCBpcyBhZGRlZAorICovCit2b2lkCitfZGJ1c19wZW5kaW5nX2NhbGxfc2V0X3RpbWVvdXRfYWRkZWRfdW5sb2NrZWQgKERCdXNQZW5kaW5nQ2FsbCAgKnBlbmRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgIGlzX2FkZGVkKQoreworICBfZGJ1c19hc3NlcnQgKHBlbmRpbmcgIT0gTlVMTCk7CisKKyAgcGVuZGluZy0+dGltZW91dF9hZGRlZCA9IGlzX2FkZGVkOworfQorCisKKy8qKgorICogUmV0cml2ZXMgdGhlIHRpbWVvdXQKKyAqCisgKiBAcGFyYW0gcGVuZGluZyB0aGUgcGVuZGluZ19jYWxsCisgKiBAcmV0dXJucyBhIHRpbWVvdXQgb2JqZWN0IG9yIE5VTEwgaWYgY2FsbCBoYXMgbm8gdGltZW91dAorICovCitEQnVzVGltZW91dCAqCitfZGJ1c19wZW5kaW5nX2NhbGxfZ2V0X3RpbWVvdXRfdW5sb2NrZWQgKERCdXNQZW5kaW5nQ2FsbCAgKnBlbmRpbmcpCit7CisgIF9kYnVzX2Fzc2VydCAocGVuZGluZyAhPSBOVUxMKTsKKworICByZXR1cm4gcGVuZGluZy0+dGltZW91dDsKK30KKworLyoqCisgKiBHZXRzIHRoZSByZXBseSdzIHNlcmlhbCBudW1iZXIKKyAqCisgKiBAcGFyYW0gcGVuZGluZyB0aGUgcGVuZGluZ19jYWxsCisgKiBAcmV0dXJucyBhIHNlcmlhbCBudW1iZXIgZm9yIHRoZSByZXBseSBvciAwIAorICovCitkYnVzX3VpbnQzMl90IAorX2RidXNfcGVuZGluZ19jYWxsX2dldF9yZXBseV9zZXJpYWxfdW5sb2NrZWQgKERCdXNQZW5kaW5nQ2FsbCAgKnBlbmRpbmcpCit7CisgIF9kYnVzX2Fzc2VydCAocGVuZGluZyAhPSBOVUxMKTsKKworICByZXR1cm4gcGVuZGluZy0+cmVwbHlfc2VyaWFsOworfQorCisvKioKKyAqIFNldHMgdGhlIHJlcGx5J3Mgc2VyaWFsIG51bWJlcgorICoKKyAqIEBwYXJhbSBwZW5kaW5nIHRoZSBwZW5kaW5nX2NhbGwKKyAqIEBwYXJhbSBzZXJpYWwgdGhlIHNlcmlhbCBudW1iZXIgCisgKi8KK3ZvaWQKK19kYnVzX3BlbmRpbmdfY2FsbF9zZXRfcmVwbHlfc2VyaWFsX3VubG9ja2VkICAoREJ1c1BlbmRpbmdDYWxsICpwZW5kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90IHNlcmlhbCkKK3sKKyAgX2RidXNfYXNzZXJ0IChwZW5kaW5nICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKHBlbmRpbmctPnJlcGx5X3NlcmlhbCA9PSAwKTsKKworICBwZW5kaW5nLT5yZXBseV9zZXJpYWwgPSBzZXJpYWw7Cit9CisKKy8qKgorICogR2V0cyB0aGUgY29ubmVjdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBwZW5kaW5nIGNhbGwuCisgKgorICogQHBhcmFtIHBlbmRpbmcgdGhlIHBlbmRpbmdfY2FsbAorICogQHJldHVybnMgdGhlIGNvbm5lY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBwZW5kaW5nIGNhbGwKKyAqLworREJ1c0Nvbm5lY3Rpb24gKgorX2RidXNfcGVuZGluZ19jYWxsX2dldF9jb25uZWN0aW9uX2FuZF9sb2NrIChEQnVzUGVuZGluZ0NhbGwgKnBlbmRpbmcpCit7CisgIF9kYnVzX2Fzc2VydCAocGVuZGluZyAhPSBOVUxMKTsKKyAKKyAgQ09OTkVDVElPTl9MT0NLIChwZW5kaW5nLT5jb25uZWN0aW9uKTsKKyAgcmV0dXJuIHBlbmRpbmctPmNvbm5lY3Rpb247Cit9CisKKy8qKgorICogR2V0cyB0aGUgY29ubmVjdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBwZW5kaW5nIGNhbGwuCisgKgorICogQHBhcmFtIHBlbmRpbmcgdGhlIHBlbmRpbmdfY2FsbAorICogQHJldHVybnMgdGhlIGNvbm5lY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBwZW5kaW5nIGNhbGwKKyAqLworREJ1c0Nvbm5lY3Rpb24gKgorX2RidXNfcGVuZGluZ19jYWxsX2dldF9jb25uZWN0aW9uX3VubG9ja2VkIChEQnVzUGVuZGluZ0NhbGwgKnBlbmRpbmcpCit7CisgIF9kYnVzX2Fzc2VydCAocGVuZGluZyAhPSBOVUxMKTsKKyAKKyAgcmV0dXJuIHBlbmRpbmctPmNvbm5lY3Rpb247Cit9CisKKy8qKgorICogU2V0cyB0aGUgcmVwbHkgbWVzc2FnZSBhc3NvY2lhdGVkIHdpdGggdGhlIHBlbmRpbmcgY2FsbCB0byBhIHRpbWVvdXQgZXJyb3IKKyAqCisgKiBAcGFyYW0gcGVuZGluZyB0aGUgcGVuZGluZ19jYWxsCisgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB3ZSBhcmUgc2VuZGluZyB0aGUgZXJyb3IgcmVwbHkgdG8gCisgKiBAcGFyYW0gc2VyaWFsIHNlcmlhbCBudW1iZXIgZm9yIHRoZSByZXBseQorICogQHJldHVybiAjRkFMU0Ugb24gT09NCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19wZW5kaW5nX2NhbGxfc2V0X3RpbWVvdXRfZXJyb3JfdW5sb2NrZWQgKERCdXNQZW5kaW5nQ2FsbCAqcGVuZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90ICAgIHNlcmlhbCkKK3sgCisgIERCdXNMaXN0ICpyZXBseV9saW5rOworICBEQnVzTWVzc2FnZSAqcmVwbHk7CisKKyAgcmVwbHkgPSBkYnVzX21lc3NhZ2VfbmV3X2Vycm9yIChtZXNzYWdlLCBEQlVTX0VSUk9SX05PX1JFUExZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEaWQgbm90IHJlY2VpdmUgYSByZXBseS4gUG9zc2libGUgY2F1c2VzIGluY2x1ZGU6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhlIHJlbW90ZSBhcHBsaWNhdGlvbiBkaWQgbm90IHNlbmQgYSByZXBseSwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgbWVzc2FnZSBidXMgc2VjdXJpdHkgcG9saWN5IGJsb2NrZWQgdGhlIHJlcGx5LCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoZSByZXBseSB0aW1lb3V0IGV4cGlyZWQsIG9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhlIG5ldHdvcmsgY29ubmVjdGlvbiB3YXMgYnJva2VuLiIpOworICBpZiAocmVwbHkgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmVwbHlfbGluayA9IF9kYnVzX2xpc3RfYWxsb2NfbGluayAocmVwbHkpOworICBpZiAocmVwbHlfbGluayA9PSBOVUxMKQorICAgIHsKKyAgICAgIC8qIGl0J3MgT0sgdG8gdW5yZWYgdGhpcywgbm90aGluZyB0aGF0IGNvdWxkIGhhdmUgYXR0YWNoZWQgYSBjYWxsYmFjaworICAgICAgICogaGFzIGV2ZXIgc2VlbiBpdCAqLworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHBlbmRpbmctPnRpbWVvdXRfbGluayA9IHJlcGx5X2xpbms7CisKKyAgX2RidXNfcGVuZGluZ19jYWxsX3NldF9yZXBseV9zZXJpYWxfdW5sb2NrZWQgKHBlbmRpbmcsIHNlcmlhbCk7CisgIAorICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBJbmNyZW1lbnRzIHRoZSByZWZlcmVuY2UgY291bnQgb24gYSBwZW5kaW5nIGNhbGwsCisgKiB3aGlsZSB0aGUgbG9jayBvbiBpdHMgY29ubmVjdGlvbiBpcyBhbHJlYWR5IGhlbGQuCisgKgorICogQHBhcmFtIHBlbmRpbmcgdGhlIHBlbmRpbmcgY2FsbCBvYmplY3QKKyAqIEByZXR1cm5zIHRoZSBwZW5kaW5nIGNhbGwgb2JqZWN0CisgKi8KK0RCdXNQZW5kaW5nQ2FsbCAqCitfZGJ1c19wZW5kaW5nX2NhbGxfcmVmX3VubG9ja2VkIChEQnVzUGVuZGluZ0NhbGwgKnBlbmRpbmcpCit7CisgIGRidXNfaW50MzJfdCBvbGRfcmVmY291bnQ7CisKKyAgb2xkX3JlZmNvdW50ID0gX2RidXNfYXRvbWljX2luYyAoJnBlbmRpbmctPnJlZmNvdW50KTsKKyAgX2RidXNfcGVuZGluZ19jYWxsX3RyYWNlX3JlZiAocGVuZGluZywgb2xkX3JlZmNvdW50LCBvbGRfcmVmY291bnQgKyAxLAorICAgICAgInJlZl91bmxvY2tlZCIpOworCisgIHJldHVybiBwZW5kaW5nOworfQorCisKK3N0YXRpYyB2b2lkCitfZGJ1c19wZW5kaW5nX2NhbGxfbGFzdF91bnJlZiAoREJ1c1BlbmRpbmdDYWxsICpwZW5kaW5nKQoreworICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKyAgCisgIC8qIElmIHdlIGdldCBoZXJlLCB3ZSBzaG91bGQgYmUgYWxyZWFkeSBkZXRhY2hlZAorICAgKiBmcm9tIHRoZSBjb25uZWN0aW9uLCBvciBuZXZlciBhdHRhY2hlZC4KKyAgICovCisgIF9kYnVzX2Fzc2VydCAoIXBlbmRpbmctPnRpbWVvdXRfYWRkZWQpOyAgCisKKyAgY29ubmVjdGlvbiA9IHBlbmRpbmctPmNvbm5lY3Rpb247CisKKyAgLyogdGhpcyBhc3N1bWVzIHdlIGFyZW4ndCBob2xkaW5nIGNvbm5lY3Rpb24gbG9jay4uLiAqLworICBfZGJ1c19kYXRhX3Nsb3RfbGlzdF9mcmVlICgmcGVuZGluZy0+c2xvdF9saXN0KTsKKworICBpZiAocGVuZGluZy0+dGltZW91dCAhPSBOVUxMKQorICAgIF9kYnVzX3RpbWVvdXRfdW5yZWYgKHBlbmRpbmctPnRpbWVvdXQpOworICAgICAgCisgIGlmIChwZW5kaW5nLT50aW1lb3V0X2xpbmspCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmICgoREJ1c01lc3NhZ2UgKilwZW5kaW5nLT50aW1lb3V0X2xpbmstPmRhdGEpOworICAgICAgX2RidXNfbGlzdF9mcmVlX2xpbmsgKHBlbmRpbmctPnRpbWVvdXRfbGluayk7CisgICAgICBwZW5kaW5nLT50aW1lb3V0X2xpbmsgPSBOVUxMOworICAgIH0KKworICBpZiAocGVuZGluZy0+cmVwbHkpCisgICAgeworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChwZW5kaW5nLT5yZXBseSk7CisgICAgICBwZW5kaW5nLT5yZXBseSA9IE5VTEw7CisgICAgfQorICAgICAgCisgIGRidXNfZnJlZSAocGVuZGluZyk7CisKKyAgZGJ1c19wZW5kaW5nX2NhbGxfZnJlZV9kYXRhX3Nsb3QgKCZub3RpZnlfdXNlcl9kYXRhX3Nsb3QpOworCisgIC8qIGNvbm5lY3Rpb24gbG9jayBzaG91bGQgbm90IGJlIGhlbGQuICovCisgIC8qIEZyZWUgdGhlIGNvbm5lY3Rpb24gbGFzdCB0byBhdm9pZCBhIHdlaXJkIHN0YXRlIHdoaWxlCisgICAqIGNhbGxpbmcgb3V0IHRvIGFwcGxpY2F0aW9uIGNvZGUgd2hlcmUgdGhlIHBlbmRpbmcgZXhpc3RzCisgICAqIGJ1dCBub3QgdGhlIGNvbm5lY3Rpb24uCisgICAqLworICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGNvbm5lY3Rpb24pOworfQorCisvKioKKyAqIERlY3JlbWVudHMgdGhlIHJlZmVyZW5jZSBjb3VudCBvbiBhIHBlbmRpbmcgY2FsbCwKKyAqIGZyZWVpbmcgaXQgaWYgdGhlIGNvdW50IHJlYWNoZXMgMC4gQXNzdW1lcworICogY29ubmVjdGlvbiBsb2NrIGlzIGFscmVhZHkgaGVsZC4KKyAqCisgKiBAcGFyYW0gcGVuZGluZyB0aGUgcGVuZGluZyBjYWxsIG9iamVjdAorICovCit2b2lkCitfZGJ1c19wZW5kaW5nX2NhbGxfdW5yZWZfYW5kX3VubG9jayAoREJ1c1BlbmRpbmdDYWxsICpwZW5kaW5nKQoreworICBkYnVzX2ludDMyX3Qgb2xkX3JlZmNvdW50OworCisgIG9sZF9yZWZjb3VudCA9IF9kYnVzX2F0b21pY19kZWMgKCZwZW5kaW5nLT5yZWZjb3VudCk7CisgIF9kYnVzX2Fzc2VydCAob2xkX3JlZmNvdW50ID4gMCk7CisgIF9kYnVzX3BlbmRpbmdfY2FsbF90cmFjZV9yZWYgKHBlbmRpbmcsIG9sZF9yZWZjb3VudCwKKyAgICAgIG9sZF9yZWZjb3VudCAtIDEsICJ1bnJlZl9hbmRfdW5sb2NrIik7CisKKyAgQ09OTkVDVElPTl9VTkxPQ0sgKHBlbmRpbmctPmNvbm5lY3Rpb24pOworCisgIGlmIChvbGRfcmVmY291bnQgPT0gMSkKKyAgICBfZGJ1c19wZW5kaW5nX2NhbGxfbGFzdF91bnJlZiAocGVuZGluZyk7Cit9CisKKy8qKgorICogQ2hlY2tzIHdoZXRoZXIgdGhlIHBlbmRpbmcgY2FsbCBoYXMgcmVjZWl2ZWQgYSByZXBseQorICogeWV0LCBvciBub3QuIEFzc3VtZXMgY29ubmVjdGlvbiBsb2NrIGlzIGhlbGQuCisgKgorICogQHBhcmFtIHBlbmRpbmcgdGhlIHBlbmRpbmcgY2FsbAorICogQHJldHVybnMgI1RSVUUgaWYgYSByZXBseSBoYXMgYmVlbiByZWNlaXZlZAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfcGVuZGluZ19jYWxsX2dldF9jb21wbGV0ZWRfdW5sb2NrZWQgKERCdXNQZW5kaW5nQ2FsbCAgICAqcGVuZGluZykKK3sKKyAgcmV0dXJuIHBlbmRpbmctPmNvbXBsZXRlZDsKK30KKworc3RhdGljIERCdXNEYXRhU2xvdEFsbG9jYXRvciBzbG90X2FsbG9jYXRvciA9CisgIF9EQlVTX0RBVEFfU0xPVF9BTExPQ0FUT1JfSU5JVCAoX0RCVVNfTE9DS19OQU1FIChwZW5kaW5nX2NhbGxfc2xvdHMpKTsKKworLyoqCisgKiBTdG9yZXMgYSBwb2ludGVyIG9uIGEgI0RCdXNQZW5kaW5nQ2FsbCwgYWxvbmcKKyAqIHdpdGggYW4gb3B0aW9uYWwgZnVuY3Rpb24gdG8gYmUgdXNlZCBmb3IgZnJlZWluZworICogdGhlIGRhdGEgd2hlbiB0aGUgZGF0YSBpcyBzZXQgYWdhaW4sIG9yIHdoZW4KKyAqIHRoZSBwZW5kaW5nIGNhbGwgaXMgZmluYWxpemVkLiBUaGUgc2xvdCBudW1iZXIKKyAqIG11c3QgaGF2ZSBiZWVuIGFsbG9jYXRlZCB3aXRoIGRidXNfcGVuZGluZ19jYWxsX2FsbG9jYXRlX2RhdGFfc2xvdCgpLgorICoKKyAqIEBwYXJhbSBwZW5kaW5nIHRoZSBwZW5kaW5nX2NhbGwKKyAqIEBwYXJhbSBzbG90IHRoZSBzbG90IG51bWJlcgorICogQHBhcmFtIGRhdGEgdGhlIGRhdGEgdG8gc3RvcmUKKyAqIEBwYXJhbSBmcmVlX2RhdGFfZnVuYyBmaW5hbGl6ZXIgZnVuY3Rpb24gZm9yIHRoZSBkYXRhCisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGVyZSB3YXMgZW5vdWdoIG1lbW9yeSB0byBzdG9yZSB0aGUgZGF0YQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfcGVuZGluZ19jYWxsX3NldF9kYXRhX3VubG9ja2VkIChEQnVzUGVuZGluZ0NhbGwgICpwZW5kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfaW50MzJfdCAgICAgIHNsb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRnJlZUZ1bmN0aW9uICBmcmVlX2RhdGFfZnVuYykKK3sKKyAgREJ1c0ZyZWVGdW5jdGlvbiBvbGRfZnJlZV9mdW5jOworICB2b2lkICpvbGRfZGF0YTsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworCisgIHJldHZhbCA9IF9kYnVzX2RhdGFfc2xvdF9saXN0X3NldCAoJnNsb3RfYWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwZW5kaW5nLT5zbG90X2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvdCwgZGF0YSwgZnJlZV9kYXRhX2Z1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9sZF9mcmVlX2Z1bmMsICZvbGRfZGF0YSk7CisKKyAgLyogRHJvcCBsb2NrcyB0byBjYWxsIG91dCB0byBhcHAgY29kZSAqLworICBDT05ORUNUSU9OX1VOTE9DSyAocGVuZGluZy0+Y29ubmVjdGlvbik7CisgIAorICBpZiAocmV0dmFsKQorICAgIHsKKyAgICAgIGlmIChvbGRfZnJlZV9mdW5jKQorICAgICAgICAoKiBvbGRfZnJlZV9mdW5jKSAob2xkX2RhdGEpOworICAgIH0KKworICBDT05ORUNUSU9OX0xPQ0sgKHBlbmRpbmctPmNvbm5lY3Rpb24pOworICAKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyoqIEB9ICovCisKKy8qKgorICogQGRlZmdyb3VwIERCdXNQZW5kaW5nQ2FsbCBEQnVzUGVuZGluZ0NhbGwKKyAqIEBpbmdyb3VwICBEQnVzCisgKiBAYnJpZWYgUGVuZGluZyByZXBseSB0byBhIG1ldGhvZCBjYWxsIG1lc3NhZ2UKKyAqCisgKiBBIERCdXNQZW5kaW5nQ2FsbCBpcyBhbiBvYmplY3QgcmVwcmVzZW50aW5nIGFuCisgKiBleHBlY3RlZCByZXBseS4gQSAjREJ1c1BlbmRpbmdDYWxsIGNhbiBiZSBjcmVhdGVkCisgKiB3aGVuIHlvdSBzZW5kIGEgbWVzc2FnZSB0aGF0IHNob3VsZCBoYXZlIGEgcmVwbHkuCisgKgorICogQHsKKyAqLworCisvKioKKyAqIEBkZWYgREJVU19USU1FT1VUX0lORklOSVRFCisgKgorICogQW4gaW50ZWdlciBjb25zdGFudCByZXByZXNlbnRpbmcgYW4gaW5maW5pdGUgdGltZW91dC4gVGhpcyBoYXMgdGhlCisgKiBudW1lcmljIHZhbHVlIDB4N2ZmZmZmZmYgKHRoZSBsYXJnZXN0IDMyLWJpdCBzaWduZWQgaW50ZWdlcikuCisgKgorICogRm9yIHNvdXJjZSBjb21wYXRpYmlsaXR5IHdpdGggRC1CdXMgdmVyc2lvbnMgZWFybGllciB0aGFuIDEuNC4xMiwgdXNlCisgKiAweDdmZmZmZmZmLCBvciBJTlQzMl9NQVggKGFzc3VtaW5nIHlvdXIgcGxhdGZvcm0gaGFzIGl0KS4KKyAqLworCisvKioKKyAqIEBkZWYgREJVU19USU1FT1VUX1VTRV9ERUZBVUxUCisgKgorICogQW4gaW50ZWdlciBjb25zdGFudCByZXByZXNlbnRpbmcgYSByZXF1ZXN0IHRvIHVzZSB0aGUgZGVmYXVsdCB0aW1lb3V0LgorICogVGhpcyBoYXMgbnVtZXJpYyB2YWx1ZSAtMS4KKyAqCisgKiBGb3Igc291cmNlIGNvbXBhdGliaWxpdHkgd2l0aCBELUJ1cyB2ZXJzaW9ucyBlYXJsaWVyIHRoYW4gMS40LjEyLCB1c2UgYQorICogbGl0ZXJhbCAtMS4KKyAqLworCisvKioKKyAqIEB0eXBlZGVmIERCdXNQZW5kaW5nQ2FsbAorICoKKyAqIE9wYXF1ZSBkYXRhIHR5cGUgcmVwcmVzZW50aW5nIGEgbWVzc2FnZSBwZW5kaW5nLgorICovCisKKy8qKgorICogSW5jcmVtZW50cyB0aGUgcmVmZXJlbmNlIGNvdW50IG9uIGEgcGVuZGluZyBjYWxsLgorICoKKyAqIEBwYXJhbSBwZW5kaW5nIHRoZSBwZW5kaW5nIGNhbGwgb2JqZWN0CisgKiBAcmV0dXJucyB0aGUgcGVuZGluZyBjYWxsIG9iamVjdAorICovCitEQnVzUGVuZGluZ0NhbGwgKgorZGJ1c19wZW5kaW5nX2NhbGxfcmVmIChEQnVzUGVuZGluZ0NhbGwgKnBlbmRpbmcpCit7CisgIGRidXNfaW50MzJfdCBvbGRfcmVmY291bnQ7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChwZW5kaW5nICE9IE5VTEwsIE5VTEwpOworCisgIG9sZF9yZWZjb3VudCA9IF9kYnVzX2F0b21pY19pbmMgKCZwZW5kaW5nLT5yZWZjb3VudCk7CisgIF9kYnVzX3BlbmRpbmdfY2FsbF90cmFjZV9yZWYgKHBlbmRpbmcsIG9sZF9yZWZjb3VudCwgb2xkX3JlZmNvdW50ICsgMSwKKyAgICAgICJyZWYiKTsKKworICByZXR1cm4gcGVuZGluZzsKK30KKworLyoqCisgKiBEZWNyZW1lbnRzIHRoZSByZWZlcmVuY2UgY291bnQgb24gYSBwZW5kaW5nIGNhbGwsCisgKiBmcmVlaW5nIGl0IGlmIHRoZSBjb3VudCByZWFjaGVzIDAuCisgKgorICogQHBhcmFtIHBlbmRpbmcgdGhlIHBlbmRpbmcgY2FsbCBvYmplY3QKKyAqLwordm9pZAorZGJ1c19wZW5kaW5nX2NhbGxfdW5yZWYgKERCdXNQZW5kaW5nQ2FsbCAqcGVuZGluZykKK3sKKyAgZGJ1c19pbnQzMl90IG9sZF9yZWZjb3VudDsKKworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAocGVuZGluZyAhPSBOVUxMKTsKKworICBvbGRfcmVmY291bnQgPSBfZGJ1c19hdG9taWNfZGVjICgmcGVuZGluZy0+cmVmY291bnQpOworICBfZGJ1c19wZW5kaW5nX2NhbGxfdHJhY2VfcmVmIChwZW5kaW5nLCBvbGRfcmVmY291bnQsIG9sZF9yZWZjb3VudCAtIDEsCisgICAgICAidW5yZWYiKTsKKworICBpZiAob2xkX3JlZmNvdW50ID09IDEpCisgICAgX2RidXNfcGVuZGluZ19jYWxsX2xhc3RfdW5yZWYocGVuZGluZyk7Cit9CisKKy8qKgorICogU2V0cyBhIG5vdGlmaWNhdGlvbiBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiB0aGUgcmVwbHkgaXMKKyAqIHJlY2VpdmVkIG9yIHRoZSBwZW5kaW5nIGNhbGwgdGltZXMgb3V0LgorICoKKyAqIEBwYXJhbSBwZW5kaW5nIHRoZSBwZW5kaW5nIGNhbGwKKyAqIEBwYXJhbSBmdW5jdGlvbiBub3RpZmllciBmdW5jdGlvbgorICogQHBhcmFtIHVzZXJfZGF0YSBkYXRhIHRvIHBhc3MgdG8gbm90aWZpZXIgZnVuY3Rpb24KKyAqIEBwYXJhbSBmcmVlX3VzZXJfZGF0YSBmdW5jdGlvbiB0byBmcmVlIHRoZSB1c2VyIGRhdGEKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBub3QgZW5vdWdoIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorZGJ1c19wZW5kaW5nX2NhbGxfc2V0X25vdGlmeSAoREJ1c1BlbmRpbmdDYWxsICAgICAgICAgICAgICAqcGVuZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNQZW5kaW5nQ2FsbE5vdGlmeUZ1bmN0aW9uIGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAqdXNlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgICAgICAgICAgICAgZnJlZV91c2VyX2RhdGEpCit7CisgIGRidXNfYm9vbF90IHJldCA9IEZBTFNFOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAocGVuZGluZyAhPSBOVUxMLCBGQUxTRSk7CisKKyAgQ09OTkVDVElPTl9MT0NLIChwZW5kaW5nLT5jb25uZWN0aW9uKTsKKyAgCisgIC8qIGNvdWxkIGludm9rZSBhcHBsaWNhdGlvbiBjb2RlISAqLworICBpZiAoIV9kYnVzX3BlbmRpbmdfY2FsbF9zZXRfZGF0YV91bmxvY2tlZCAocGVuZGluZywgbm90aWZ5X3VzZXJfZGF0YV9zbG90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlcl9kYXRhLCBmcmVlX3VzZXJfZGF0YSkpCisgICAgZ290byBvdXQ7CisgIAorICBwZW5kaW5nLT5mdW5jdGlvbiA9IGZ1bmN0aW9uOworICByZXQgPSBUUlVFOworCitvdXQ6CisgIENPTk5FQ1RJT05fVU5MT0NLIChwZW5kaW5nLT5jb25uZWN0aW9uKTsKKyAgCisgIHJldHVybiByZXQ7Cit9CisKKy8qKgorICogQ2FuY2VscyB0aGUgcGVuZGluZyBjYWxsLCBzdWNoIHRoYXQgYW55IHJlcGx5IG9yIGVycm9yIHJlY2VpdmVkCisgKiB3aWxsIGp1c3QgYmUgaWdub3JlZC4gIERyb3BzIHRoZSBkYnVzIGxpYnJhcnkncyBpbnRlcm5hbCByZWZlcmVuY2UKKyAqIHRvIHRoZSAjREJ1c1BlbmRpbmdDYWxsIHNvIHdpbGwgZnJlZSB0aGUgY2FsbCBpZiBub2JvZHkgZWxzZSBpcworICogaG9sZGluZyBhIHJlZmVyZW5jZS4gSG93ZXZlciB5b3UgdXN1YWxseSBnZXQgYSByZWZlcmVuY2UgZnJvbQorICogZGJ1c19jb25uZWN0aW9uX3NlbmRfd2l0aF9yZXBseSgpIHNvIHByb2JhYmx5IHlvdXIgYXBwIG93bnMgYSByZWYKKyAqIGFsc28uCisgKgorICogTm90ZSB0aGF0IGNhbmNlbGluZyBhIHBlbmRpbmcgY2FsbCB3aWxsIDxlbT5ub3Q8L2VtPiBzaW11bGF0ZSBhCisgKiB0aW1lZC1vdXQgY2FsbDsgaWYgYSBjYWxsIHRpbWVzIG91dCwgdGhlbiBhIHRpbWVvdXQgZXJyb3IgcmVwbHkgaXMKKyAqIHJlY2VpdmVkLiBJZiB5b3UgY2FuY2VsIHRoZSBjYWxsLCBubyByZXBseSBpcyByZWNlaXZlZCB1bmxlc3MgdGhlCisgKiB0aGUgcmVwbHkgd2FzIGFscmVhZHkgcmVjZWl2ZWQgYmVmb3JlIHlvdSBjYW5jZWxlZC4KKyAqIAorICogQHBhcmFtIHBlbmRpbmcgdGhlIHBlbmRpbmcgY2FsbAorICovCit2b2lkCitkYnVzX3BlbmRpbmdfY2FsbF9jYW5jZWwgKERCdXNQZW5kaW5nQ2FsbCAqcGVuZGluZykKK3sKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKHBlbmRpbmcgIT0gTlVMTCk7CisKKyAgX2RidXNfY29ubmVjdGlvbl9yZW1vdmVfcGVuZGluZ19jYWxsIChwZW5kaW5nLT5jb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmcpOworfQorCisvKioKKyAqIENoZWNrcyB3aGV0aGVyIHRoZSBwZW5kaW5nIGNhbGwgaGFzIHJlY2VpdmVkIGEgcmVwbHkKKyAqIHlldCwgb3Igbm90LgorICoKKyAqIEBwYXJhbSBwZW5kaW5nIHRoZSBwZW5kaW5nIGNhbGwKKyAqIEByZXR1cm5zICNUUlVFIGlmIGEgcmVwbHkgaGFzIGJlZW4gcmVjZWl2ZWQKKyAqLworZGJ1c19ib29sX3QKK2RidXNfcGVuZGluZ19jYWxsX2dldF9jb21wbGV0ZWQgKERCdXNQZW5kaW5nQ2FsbCAqcGVuZGluZykKK3sKKyAgZGJ1c19ib29sX3QgY29tcGxldGVkOworICAKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChwZW5kaW5nICE9IE5VTEwsIEZBTFNFKTsKKworICBDT05ORUNUSU9OX0xPQ0sgKHBlbmRpbmctPmNvbm5lY3Rpb24pOworICBjb21wbGV0ZWQgPSBwZW5kaW5nLT5jb21wbGV0ZWQ7CisgIENPTk5FQ1RJT05fVU5MT0NLIChwZW5kaW5nLT5jb25uZWN0aW9uKTsKKworICByZXR1cm4gY29tcGxldGVkOworfQorCisvKioKKyAqIEdldHMgdGhlIHJlcGx5LCBvciByZXR1cm5zICNOVUxMIGlmIG5vbmUgaGFzIGJlZW4gcmVjZWl2ZWQKKyAqIHlldC4gT3duZXJzaGlwIG9mIHRoZSByZXBseSBtZXNzYWdlIHBhc3NlcyB0byB0aGUgY2FsbGVyLiBUaGlzCisgKiBmdW5jdGlvbiBjYW4gb25seSBiZSBjYWxsZWQgb25jZSBwZXIgcGVuZGluZyBjYWxsLCBzaW5jZSB0aGUgcmVwbHkKKyAqIG1lc3NhZ2UgaXMgdHJhbmZlcnJlZCB0byB0aGUgY2FsbGVyLgorICogCisgKiBAcGFyYW0gcGVuZGluZyB0aGUgcGVuZGluZyBjYWxsCisgKiBAcmV0dXJucyB0aGUgcmVwbHkgbWVzc2FnZSBvciAjTlVMTC4KKyAqLworREJ1c01lc3NhZ2UqCitkYnVzX3BlbmRpbmdfY2FsbF9zdGVhbF9yZXBseSAoREJ1c1BlbmRpbmdDYWxsICpwZW5kaW5nKQoreworICBEQnVzTWVzc2FnZSAqbWVzc2FnZTsKKyAgCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAocGVuZGluZyAhPSBOVUxMLCBOVUxMKTsKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChwZW5kaW5nLT5jb21wbGV0ZWQsIE5VTEwpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHBlbmRpbmctPnJlcGx5ICE9IE5VTEwsIE5VTEwpOworCisgIENPTk5FQ1RJT05fTE9DSyAocGVuZGluZy0+Y29ubmVjdGlvbik7CisgIAorICBtZXNzYWdlID0gcGVuZGluZy0+cmVwbHk7CisgIHBlbmRpbmctPnJlcGx5ID0gTlVMTDsKKworICBDT05ORUNUSU9OX1VOTE9DSyAocGVuZGluZy0+Y29ubmVjdGlvbik7CisKKyAgX2RidXNfbWVzc2FnZV90cmFjZV9yZWYgKG1lc3NhZ2UsIC0xLCAtMSwgImRidXNfcGVuZGluZ19jYWxsX3N0ZWFsX3JlcGx5Iik7CisgIHJldHVybiBtZXNzYWdlOworfQorCisvKioKKyAqIEJsb2NrIHVudGlsIHRoZSBwZW5kaW5nIGNhbGwgaXMgY29tcGxldGVkLiAgVGhlIGJsb2NraW5nIGlzIGFzIHdpdGgKKyAqIGRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHlfYW5kX2Jsb2NrKCk7IGl0IGRvZXMgbm90IGVudGVyIHRoZQorICogbWFpbiBsb29wIG9yIHByb2Nlc3Mgb3RoZXIgbWVzc2FnZXMsIGl0IHNpbXBseSB3YWl0cyBmb3IgdGhlIHJlcGx5CisgKiBpbiBxdWVzdGlvbi4KKyAqCisgKiBJZiB0aGUgcGVuZGluZyBjYWxsIGlzIGFscmVhZHkgY29tcGxldGVkLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMKKyAqIGltbWVkaWF0ZWx5LgorICoKKyAqIEB0b2RvIHdoZW4geW91IHN0YXJ0IGJsb2NraW5nLCB0aGUgdGltZW91dCBpcyByZXNldCwgYnV0IGl0IHNob3VsZAorICogcmVhbGx5IG9ubHkgdXNlIHRpbWUgcmVtYWluaW5nIHNpbmNlIHRoZSBwZW5kaW5nIGNhbGwgd2FzIGNyZWF0ZWQuCisgKiBUaGlzIHJlcXVpcmVzIHN0b3JpbmcgdGltZXN0YW1wcyBpbnN0ZWFkIG9mIGludGVydmFscyBpbiB0aGUgdGltZW91dAorICoKKyAqIEBwYXJhbSBwZW5kaW5nIHRoZSBwZW5kaW5nIGNhbGwKKyAqLwordm9pZAorZGJ1c19wZW5kaW5nX2NhbGxfYmxvY2sgKERCdXNQZW5kaW5nQ2FsbCAqcGVuZGluZykKK3sKKyAgX2RidXNfcmV0dXJuX2lmX2ZhaWwgKHBlbmRpbmcgIT0gTlVMTCk7CisKKyAgX2RidXNfY29ubmVjdGlvbl9ibG9ja19wZW5kaW5nX2NhbGwgKHBlbmRpbmcpOworfQorCisvKioKKyAqIEFsbG9jYXRlcyBhbiBpbnRlZ2VyIElEIHRvIGJlIHVzZWQgZm9yIHN0b3JpbmcgYXBwbGljYXRpb24tc3BlY2lmaWMKKyAqIGRhdGEgb24gYW55IERCdXNQZW5kaW5nQ2FsbC4gVGhlIGFsbG9jYXRlZCBJRCBtYXkgdGhlbiBiZSB1c2VkCisgKiB3aXRoIGRidXNfcGVuZGluZ19jYWxsX3NldF9kYXRhKCkgYW5kIGRidXNfcGVuZGluZ19jYWxsX2dldF9kYXRhKCkuCisgKiBUaGUgcGFzc2VkLWluIHNsb3QgbXVzdCBiZSBpbml0aWFsaXplZCB0byAtMSwgYW5kIGlzIGZpbGxlZCBpbgorICogd2l0aCB0aGUgc2xvdCBJRC4gSWYgdGhlIHBhc3NlZC1pbiBzbG90IGlzIG5vdCAtMSwgaXQncyBhc3N1bWVkCisgKiB0byBiZSBhbHJlYWR5IGFsbG9jYXRlZCwgYW5kIGl0cyByZWZjb3VudCBpcyBpbmNyZW1lbnRlZC4KKyAqIAorICogVGhlIGFsbG9jYXRlZCBzbG90IGlzIGdsb2JhbCwgaS5lLiBhbGwgREJ1c1BlbmRpbmdDYWxsIG9iamVjdHMgd2lsbAorICogaGF2ZSBhIHNsb3Qgd2l0aCB0aGUgZ2l2ZW4gaW50ZWdlciBJRCByZXNlcnZlZC4KKyAqCisgKiBAcGFyYW0gc2xvdF9wIGFkZHJlc3Mgb2YgYSBnbG9iYWwgdmFyaWFibGUgc3RvcmluZyB0aGUgc2xvdAorICogQHJldHVybnMgI0ZBTFNFIG9uIGZhaWx1cmUgKG5vIG1lbW9yeSkKKyAqLworZGJ1c19ib29sX3QKK2RidXNfcGVuZGluZ19jYWxsX2FsbG9jYXRlX2RhdGFfc2xvdCAoZGJ1c19pbnQzMl90ICpzbG90X3ApCit7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoc2xvdF9wICE9IE5VTEwsIEZBTFNFKTsKKworICByZXR1cm4gX2RidXNfZGF0YV9zbG90X2FsbG9jYXRvcl9hbGxvYyAoJnNsb3RfYWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvdF9wKTsKK30KKworLyoqCisgKiBEZWFsbG9jYXRlcyBhIGdsb2JhbCBJRCBmb3IgI0RCdXNQZW5kaW5nQ2FsbCBkYXRhIHNsb3RzLgorICogZGJ1c19wZW5kaW5nX2NhbGxfZ2V0X2RhdGEoKSBhbmQgZGJ1c19wZW5kaW5nX2NhbGxfc2V0X2RhdGEoKSBtYXkKKyAqIG5vIGxvbmdlciBiZSB1c2VkIHdpdGggdGhpcyBzbG90LiAgRXhpc3RpbmcgZGF0YSBzdG9yZWQgb24gZXhpc3RpbmcKKyAqIERCdXNQZW5kaW5nQ2FsbCBvYmplY3RzIHdpbGwgYmUgZnJlZWQgd2hlbiB0aGUgI0RCdXNQZW5kaW5nQ2FsbCBpcworICogZmluYWxpemVkLCBidXQgbWF5IG5vdCBiZSByZXRyaWV2ZWQgKGFuZCBtYXkgb25seSBiZSByZXBsYWNlZCBpZgorICogc29tZW9uZSBlbHNlIHJlYWxsb2NhdGVzIHRoZSBzbG90KS4gIFdoZW4gdGhlIHJlZmNvdW50IG9uIHRoZQorICogcGFzc2VkLWluIHNsb3QgcmVhY2hlcyAwLCBpdCBpcyBzZXQgdG8gLTEuCisgKgorICogQHBhcmFtIHNsb3RfcCBhZGRyZXNzIHN0b3JpbmcgdGhlIHNsb3QgdG8gZGVhbGxvY2F0ZQorICovCit2b2lkCitkYnVzX3BlbmRpbmdfY2FsbF9mcmVlX2RhdGFfc2xvdCAoZGJ1c19pbnQzMl90ICpzbG90X3ApCit7CisgIF9kYnVzX3JldHVybl9pZl9mYWlsIChzbG90X3AgIT0gTlVMTCk7CisgIF9kYnVzX3JldHVybl9pZl9mYWlsICgqc2xvdF9wID49IDApOworCisgIF9kYnVzX2RhdGFfc2xvdF9hbGxvY2F0b3JfZnJlZSAoJnNsb3RfYWxsb2NhdG9yLCBzbG90X3ApOworfQorCisvKioKKyAqIFN0b3JlcyBhIHBvaW50ZXIgb24gYSAjREJ1c1BlbmRpbmdDYWxsLCBhbG9uZworICogd2l0aCBhbiBvcHRpb25hbCBmdW5jdGlvbiB0byBiZSB1c2VkIGZvciBmcmVlaW5nCisgKiB0aGUgZGF0YSB3aGVuIHRoZSBkYXRhIGlzIHNldCBhZ2Fpbiwgb3Igd2hlbgorICogdGhlIHBlbmRpbmcgY2FsbCBpcyBmaW5hbGl6ZWQuIFRoZSBzbG90IG51bWJlcgorICogbXVzdCBoYXZlIGJlZW4gYWxsb2NhdGVkIHdpdGggZGJ1c19wZW5kaW5nX2NhbGxfYWxsb2NhdGVfZGF0YV9zbG90KCkuCisgKgorICogQHBhcmFtIHBlbmRpbmcgdGhlIHBlbmRpbmdfY2FsbAorICogQHBhcmFtIHNsb3QgdGhlIHNsb3QgbnVtYmVyCisgKiBAcGFyYW0gZGF0YSB0aGUgZGF0YSB0byBzdG9yZQorICogQHBhcmFtIGZyZWVfZGF0YV9mdW5jIGZpbmFsaXplciBmdW5jdGlvbiBmb3IgdGhlIGRhdGEKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZXJlIHdhcyBlbm91Z2ggbWVtb3J5IHRvIHN0b3JlIHRoZSBkYXRhCisgKi8KK2RidXNfYm9vbF90CitkYnVzX3BlbmRpbmdfY2FsbF9zZXRfZGF0YSAoREJ1c1BlbmRpbmdDYWxsICAqcGVuZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2ludDMyX3QgICAgICBzbG90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgZnJlZV9kYXRhX2Z1bmMpCit7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAocGVuZGluZyAhPSBOVUxMLCBGQUxTRSk7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoc2xvdCA+PSAwLCBGQUxTRSk7CisKKyAgCisgIENPTk5FQ1RJT05fTE9DSyAocGVuZGluZy0+Y29ubmVjdGlvbik7CisgIHJldHZhbCA9IF9kYnVzX3BlbmRpbmdfY2FsbF9zZXRfZGF0YV91bmxvY2tlZCAocGVuZGluZywgc2xvdCwgZGF0YSwgZnJlZV9kYXRhX2Z1bmMpOworICBDT05ORUNUSU9OX1VOTE9DSyAocGVuZGluZy0+Y29ubmVjdGlvbik7CisgIHJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogUmV0cmlldmVzIGRhdGEgcHJldmlvdXNseSBzZXQgd2l0aCBkYnVzX3BlbmRpbmdfY2FsbF9zZXRfZGF0YSgpLgorICogVGhlIHNsb3QgbXVzdCBzdGlsbCBiZSBhbGxvY2F0ZWQgKG11c3Qgbm90IGhhdmUgYmVlbiBmcmVlZCkuCisgKgorICogQHBhcmFtIHBlbmRpbmcgdGhlIHBlbmRpbmdfY2FsbAorICogQHBhcmFtIHNsb3QgdGhlIHNsb3QgdG8gZ2V0IGRhdGEgZnJvbQorICogQHJldHVybnMgdGhlIGRhdGEsIG9yICNOVUxMIGlmIG5vdCBmb3VuZAorICovCit2b2lkKgorZGJ1c19wZW5kaW5nX2NhbGxfZ2V0X2RhdGEgKERCdXNQZW5kaW5nQ2FsbCAgICpwZW5kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfaW50MzJfdCAgICAgICBzbG90KQoreworICB2b2lkICpyZXM7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChwZW5kaW5nICE9IE5VTEwsIE5VTEwpOworCisgIENPTk5FQ1RJT05fTE9DSyAocGVuZGluZy0+Y29ubmVjdGlvbik7CisgIHJlcyA9IF9kYnVzX2RhdGFfc2xvdF9saXN0X2dldCAoJnNsb3RfYWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwZW5kaW5nLT5zbG90X2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvdCk7CisgIENPTk5FQ1RJT05fVU5MT0NLIChwZW5kaW5nLT5jb25uZWN0aW9uKTsKKworICByZXR1cm4gcmVzOworfQorCisvKiogQH0gKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1wZW5kaW5nLWNhbGwuaCBiL2RidXMvZGJ1cy1wZW5kaW5nLWNhbGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTkzMzk3Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLXBlbmRpbmctY2FsbC5oCkBAIC0wLDAgKzEsOTggQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1wZW5kaW5nLWNhbGwuaCBPYmplY3QgcmVwcmVzZW50aW5nIGEgY2FsbCBpbiBwcm9ncmVzcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaWYgIWRlZmluZWQgKERCVVNfSU5TSURFX0RCVVNfSCkgJiYgIWRlZmluZWQgKERCVVNfQ09NUElMQVRJT04pCisjZXJyb3IgIk9ubHkgPGRidXMvZGJ1cy5oPiBjYW4gYmUgaW5jbHVkZWQgZGlyZWN0bHksIHRoaXMgZmlsZSBtYXkgZGlzYXBwZWFyIG9yIGNoYW5nZSBjb250ZW50cy4iCisjZW5kaWYKKworI2lmbmRlZiBEQlVTX1BFTkRJTkdfQ0FMTF9ICisjZGVmaW5lIERCVVNfUEVORElOR19DQUxMX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy1tYWNyb3MuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtdHlwZXMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtY29ubmVjdGlvbi5oPgorCitEQlVTX0JFR0lOX0RFQ0xTCisKKy8qKgorICogQGFkZHRvZ3JvdXAgREJ1c1BlbmRpbmdDYWxsCisgKiBAeworICovCisKKyNkZWZpbmUgREJVU19USU1FT1VUX0lORklOSVRFICgoaW50KSAweDdmZmZmZmZmKQorI2RlZmluZSBEQlVTX1RJTUVPVVRfVVNFX0RFRkFVTFQgKC0xKQorCitEQlVTX0VYUE9SVAorREJ1c1BlbmRpbmdDYWxsKiBkYnVzX3BlbmRpbmdfY2FsbF9yZWYgICAgICAgKERCdXNQZW5kaW5nQ2FsbCAgICAgICAgICAgICAgICpwZW5kaW5nKTsKK0RCVVNfRVhQT1JUCit2b2lkICAgICAgICAgZGJ1c19wZW5kaW5nX2NhbGxfdW5yZWYgICAgICAgICAoREJ1c1BlbmRpbmdDYWxsICAgICAgICAgICAgICAgKnBlbmRpbmcpOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90ICBkYnVzX3BlbmRpbmdfY2FsbF9zZXRfbm90aWZ5ICAgIChEQnVzUGVuZGluZ0NhbGwgICAgICAgICAgICAgICAqcGVuZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzUGVuZGluZ0NhbGxOb3RpZnlGdW5jdGlvbiAgZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgKnVzZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRnJlZUZ1bmN0aW9uICAgICAgICAgICAgICAgZnJlZV91c2VyX2RhdGEpOworREJVU19FWFBPUlQKK3ZvaWQgICAgICAgICBkYnVzX3BlbmRpbmdfY2FsbF9jYW5jZWwgICAgICAgIChEQnVzUGVuZGluZ0NhbGwgICAgICAgICAgICAgICAqcGVuZGluZyk7CitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgIGRidXNfcGVuZGluZ19jYWxsX2dldF9jb21wbGV0ZWQgKERCdXNQZW5kaW5nQ2FsbCAgICAgICAgICAgICAgICpwZW5kaW5nKTsKK0RCVVNfRVhQT1JUCitEQnVzTWVzc2FnZSogZGJ1c19wZW5kaW5nX2NhbGxfc3RlYWxfcmVwbHkgICAoREJ1c1BlbmRpbmdDYWxsICAgICAgICAgICAgICAgKnBlbmRpbmcpOworREJVU19FWFBPUlQKK3ZvaWQgICAgICAgICBkYnVzX3BlbmRpbmdfY2FsbF9ibG9jayAgICAgICAgIChEQnVzUGVuZGluZ0NhbGwgICAgICAgICAgICAgICAqcGVuZGluZyk7CisKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCBkYnVzX3BlbmRpbmdfY2FsbF9hbGxvY2F0ZV9kYXRhX3Nsb3QgKGRidXNfaW50MzJfdCAgICAgKnNsb3RfcCk7CitEQlVTX0VYUE9SVAordm9pZCAgICAgICAgZGJ1c19wZW5kaW5nX2NhbGxfZnJlZV9kYXRhX3Nsb3QgICAgIChkYnVzX2ludDMyX3QgICAgICpzbG90X3ApOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90IGRidXNfcGVuZGluZ19jYWxsX3NldF9kYXRhICAgICAgICAgICAoREJ1c1BlbmRpbmdDYWxsICAqcGVuZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19pbnQzMl90ICAgICAgc2xvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgZnJlZV9kYXRhX2Z1bmMpOworREJVU19FWFBPUlQKK3ZvaWQqICAgICAgIGRidXNfcGVuZGluZ19jYWxsX2dldF9kYXRhICAgICAgICAgICAoREJ1c1BlbmRpbmdDYWxsICAqcGVuZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19pbnQzMl90ICAgICAgc2xvdCk7CisKKy8qKgorICogQ2xlYXIgYSB2YXJpYWJsZSBvciBzdHJ1Y3QgbWVtYmVyIHRoYXQgY29udGFpbnMgYSAjREJ1c1BlbmRpbmdDYWxsLgorICogSWYgaXQgZG9lcyBub3QgY29udGFpbiAjTlVMTCwgdGhlIHBlbmRpbmcgY2FsbCB0aGF0IHdhcyBwcmV2aW91c2x5CisgKiB0aGVyZSBpcyB1bnJlZmVyZW5jZWQgd2l0aCBkYnVzX3BlbmRpbmdfY2FsbF91bnJlZigpLgorICoKKyAqIFRoaXMgaXMgdmVyeSBzaW1pbGFyIHRvIGRidXNfY2xlYXJfY29ubmVjdGlvbigpOiBzZWUgdGhhdCBmdW5jdGlvbgorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBAcGFyYW0gcG9pbnRlcl90b19wZW5kaW5nX2NhbGwgQSBwb2ludGVyIHRvIGEgdmFyaWFibGUgb3Igc3RydWN0IG1lbWJlci4KKyAqIHBvaW50ZXJfdG9fcGVuZGluZ19jYWxsIG11c3Qgbm90IGJlICNOVUxMLCBidXQgKnBvaW50ZXJfdG9fcGVuZGluZ19jYWxsCisgKiBtYXkgYmUgI05VTEwuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorZGJ1c19jbGVhcl9wZW5kaW5nX2NhbGwgKERCdXNQZW5kaW5nQ2FsbCAqKnBvaW50ZXJfdG9fcGVuZGluZ19jYWxsKQoreworICBfZGJ1c19jbGVhcl9wb2ludGVyX2ltcGwgKERCdXNQZW5kaW5nQ2FsbCwgcG9pbnRlcl90b19wZW5kaW5nX2NhbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19wZW5kaW5nX2NhbGxfdW5yZWYpOworfQorCisvKiogQH0gKi8KKworREJVU19FTkRfREVDTFMKKworI2VuZGlmIC8qIERCVVNfUEVORElOR19DQUxMX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1waXBlLXVuaXguYyBiL2RidXMvZGJ1cy1waXBlLXVuaXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmM1NzA0Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLXBpcGUtdW5peC5jCkBAIC0wLDAgKzEsODMgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1waXBlLXVuaXguYyB1bml4IHJlbGF0ZWQgcGlwZSBpbXBsZW1lbnRhdGlvbgorICogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMsIDIwMDYgIFJlZCBIYXQsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwMyBDb2RlRmFjdG9yeSBBQgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiZGJ1cy1wcm90b2NvbC5oIgorI2luY2x1ZGUgImRidXMtc3RyaW5nLmgiCisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKyNpbmNsdWRlICJkYnVzLXBpcGUuaCIKKyNpbmNsdWRlICJkYnVzLXN5c2RlcHMtdW5peC5oIgorCisjaW5jbHVkZSA8ZXJybm8uaD4KKworLyoqCisgKiB3cml0ZSBkYXRhIHRvIGEgcGlwZS4KKyAqCisgKiBAcGFyYW0gcGlwZSB0aGUgcGlwZSBpbnN0YW5jZQorICogQHBhcmFtIGJ1ZmZlciB0aGUgYnVmZmVyIHRvIHdyaXRlIGRhdGEgZnJvbQorICogQHBhcmFtIHN0YXJ0IHRoZSBmaXJzdCBieXRlIGluIHRoZSBidWZmZXIgdG8gd3JpdGUKKyAqIEBwYXJhbSBsZW4gdGhlIG51bWJlciBvZiBieXRlcyB0byB0cnkgdG8gd3JpdGUKKyAqIEBwYXJhbSBlcnJvciBlcnJvciByZXR1cm4KKyAqIEByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiBvciAtMSBvbiBlcnJvcgorICovCitpbnQKK19kYnVzX3BpcGVfd3JpdGUgKERCdXNQaXBlICAgICAgICAgKnBpcGUsCisgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpidWZmZXIsCisgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGxlbiwKKyAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICBpbnQgd3JpdHRlbjsKKyAgCisgIHdyaXR0ZW4gPSBfZGJ1c193cml0ZSAocGlwZS0+ZmQsIGJ1ZmZlciwgc3RhcnQsIGxlbik7CisgIGlmICh3cml0dGVuIDwgMCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJXcml0aW5nIHRvIHBpcGU6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgIH0KKyAgcmV0dXJuIHdyaXR0ZW47Cit9CisKKy8qKgorICogY2xvc2UgYSBwaXBlLgorICoKKyAqIEBwYXJhbSBwaXBlIHRoZSBwaXBlIGluc3RhbmNlCisgKiBAcGFyYW0gZXJyb3IgcmV0dXJuIGxvY2F0aW9uIGZvciBhbiBlcnJvcgorICogQHJldHVybnMgLTEgaWYgZXJyb3IgaXMgc2V0CisgKi8KK2ludAorX2RidXNfcGlwZV9jbG9zZSAgKERCdXNQaXBlICAgICAgICAgKnBpcGUsCisgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCit7CisgIGlmICghX2RidXNfY2xvc2UgKHBpcGUtPmZkLCBlcnJvcikpCisgICAgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9kYnVzX3BpcGVfaW52YWxpZGF0ZSAocGlwZSk7CisgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9kYnVzL2RidXMtcGlwZS13aW4uYyBiL2RidXMvZGJ1cy1waXBlLXdpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljN2MyNTcKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtcGlwZS13aW4uYwpAQCAtMCwwICsxLDkwIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtcGlwZS13aW4uYyB3aW5kb3dzIHJlbGF0ZWQgcGlwZSBpbXBsZW1lbnRhdGlvbgorICogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMsIDIwMDYgIFJlZCBIYXQsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwMyBDb2RlRmFjdG9yeSBBQgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiZGJ1cy1wcm90b2NvbC5oIgorI2luY2x1ZGUgImRidXMtc3RyaW5nLmgiCisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKyNpbmNsdWRlICJkYnVzLXBpcGUuaCIKKworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRlIDxpby5oPgorCisvKioKKyAqIHdyaXRlIGRhdGEgdG8gYSBwaXBlLgorICoKKyAqIEBwYXJhbSBwaXBlIHRoZSBwaXBlIGluc3RhbmNlCisgKiBAcGFyYW0gYnVmZmVyIHRoZSBidWZmZXIgdG8gd3JpdGUgZGF0YSBmcm9tCisgKiBAcGFyYW0gc3RhcnQgdGhlIGZpcnN0IGJ5dGUgaW4gdGhlIGJ1ZmZlciB0byB3cml0ZQorICogQHBhcmFtIGxlbiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHRyeSB0byB3cml0ZQorICogQHBhcmFtIGVycm9yIGVycm9yIHJldHVybgorICogQHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuIG9yIC0xIG9uIGVycm9yCisgKi8KK2ludAorX2RidXNfcGlwZV93cml0ZSAoREJ1c1BpcGUgICAgICAgICAqcGlwZSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgbGVuLAorICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCit7CisgIGNvbnN0IGNoYXIgKmJ1ZmZlcl9jID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChidWZmZXIpOworICBpbnQgd3JpdHRlbjsKKworICB3cml0dGVuID0gX3dyaXRlIChwaXBlLT5mZCwgYnVmZmVyX2MgKyBzdGFydCwgbGVuKTsKKworICBpZiAod3JpdHRlbiA+PSAwKQorICAgIHJldHVybiB3cml0dGVuOworCisgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfZXJyb3JfZnJvbV9zeXN0ZW1fZXJybm8gKCksCisgICAgICAgICAgICAgICAgICAiV3JpdGluZyB0byBwaXBlOiAlcyIsCisgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvcl9mcm9tX2Vycm5vICgpKTsKKyAgcmV0dXJuIC0xOworfQorCisvKioKKyAqIGNsb3NlIGEgcGlwZS4KKyAqCisgKiBAcGFyYW0gcGlwZSB0aGUgcGlwZSBpbnN0YW5jZQorICogQHBhcmFtIGVycm9yIHJldHVybiBsb2NhdGlvbiBmb3IgYW4gZXJyb3IKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBlcnJvciBpcyBzZXQKKyAqLworaW50CitfZGJ1c19waXBlX2Nsb3NlICAoREJ1c1BpcGUgICAgICAgICAqcGlwZSwKKyAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgaWYgKF9jbG9zZSAocGlwZS0+ZmQpICE9IDApCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c19lcnJvcl9mcm9tX3N5c3RlbV9lcnJubyAoKSwKKyAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGNsb3NlIHBpcGUgZmQgJWQ6ICVzIiwgcGlwZS0+ZmQsCisgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3JfZnJvbV9lcnJubyAoKSk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgX2RidXNfcGlwZV9pbnZhbGlkYXRlIChwaXBlKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1waXBlLmMgYi9kYnVzL2RidXMtcGlwZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiNWZlNmQKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtcGlwZS5jCkBAIC0wLDAgKzEsODUgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1waXBlLmMgcGlwZSBpbXBsZW1lbnRhdGlvbiAoaW50ZXJuYWwgdG8gRC1CdXMgaW1wbGVtZW50YXRpb24pCisgKiAKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMywgMjAwNiAgUmVkIEhhdCwgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDAzIENvZGVGYWN0b3J5IEFCCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLXBpcGUuaCIKKworLyoKKyAqIGluaXQgYSBwaXBlIGluc3RhbmNlLgorICoKKyAqIEBwYXJhbSBwaXBlIHRoZSBwaXBlCisgKiBAcGFyYW0gZmQgdGhlIGZpbGUgZGVzY3JpcHRvciB0byBpbml0IGZyb20gCisgKi8KK3ZvaWQKK19kYnVzX3BpcGVfaW5pdCAoREJ1c1BpcGUgKnBpcGUsCisgICAgICAgICAgICAgICAgIGludCAgICAgICBmZCkKK3sKKyAgcGlwZS0+ZmQgPSBmZDsKK30KKworLyoqCisgKiBpbml0IGEgcGlwZSB3aXRoIHN0ZG91dAorICoKKyAqIEBwYXJhbSBwaXBlIHRoZSBwaXBlCisgKi8KK3ZvaWQKK19kYnVzX3BpcGVfaW5pdF9zdGRvdXQgKERCdXNQaXBlICpwaXBlKQoreworICBfZGJ1c19waXBlX2luaXQgKHBpcGUsIDEpOworfQorCisvKioKKyAqIGNoZWNrIGlmIGEgcGlwZSBpcyB2YWxpZDsgcGlwZXMgY2FuIGJlIHNldCBpbnZhbGlkLCBzaW1pbGFyIHRvCisgKiBhIC0xIGZpbGUgZGVzY3JpcHRvci4KKyAqCisgKiBAcGFyYW0gcGlwZSB0aGUgcGlwZSBpbnN0YW5jZQorICogQHJldHVybnMgI0ZBTFNFIGlmIHBpcGUgaXMgbm90IHZhbGlkCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19waXBlX2lzX3ZhbGlkKERCdXNQaXBlICpwaXBlKQoreworICByZXR1cm4gcGlwZS0+ZmQgPj0gMDsKK30KKworLyoqCisgKiBDaGVjayBpZiBhIHBpcGUgaXMgc3Rkb3V0IG9yIHN0ZGVyci4KKyAqCisgKiBAcGFyYW0gcGlwZSB0aGUgcGlwZSBpbnN0YW5jZQorICogQHJldHVybnMgI1RSVUUgaWYgcGlwZSBpcyBvbmUgb2YgdGhlIHN0YW5kYXJkIG91dC9lcnIgY2hhbm5lbHMKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3BpcGVfaXNfc3Rkb3V0X29yX3N0ZGVyciAoREJ1c1BpcGUgKnBpcGUpCit7CisgIHJldHVybiBwaXBlLT5mZCA9PSAxIHx8IHBpcGUtPmZkID09IDI7Cit9CisKKy8qKgorICogSW5pdGlhbGl6ZXMgYSBwaXBlIHRvIGFuIGludmFsaWQgdmFsdWUuCisgKiBAcGFyYW0gcGlwZSB0aGUgcGlwZQorICovCit2b2lkCitfZGJ1c19waXBlX2ludmFsaWRhdGUgKERCdXNQaXBlICpwaXBlKQoreworICBwaXBlLT5mZCA9IC0xOworfQpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLXBpcGUuaCBiL2RidXMvZGJ1cy1waXBlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E5MjRjYwotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1waXBlLmgKQEAgLTAsMCArMSw2NiBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXN5c2RlcHMuaCBXcmFwcGVycyBhcm91bmQgc3lzdGVtL2xpYmMgZmVhdHVyZXMgKGludGVybmFsIHRvIEQtQnVzIGltcGxlbWVudGF0aW9uKQorICogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMgIFJlZCBIYXQsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwMyBDb2RlRmFjdG9yeSBBQgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaWZuZGVmIERCVVNfUElQRV9ICisjZGVmaW5lIERCVVNfUElQRV9ICisKKyNpZmRlZiBIQVZFX1NURElOVF9ICisjaW5jbHVkZSA8c3RkaW50Lmg+CisjZW5kaWYKKworI2lmZGVmIEhBVkVfSU5UVFlQRVNfSAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGRidXMvZGJ1cy10eXBlcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1lcnJvcnMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc3RyaW5nLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXN5c2RlcHMuaD4KKworc3RydWN0IERCdXNQaXBlIHsKKyAgaW50IGZkOworfTsKKworREJVU19QUklWQVRFX0VYUE9SVAordm9pZCAgICAgICAgX2RidXNfcGlwZV9pbml0ICAgICAgICAgICAgICAgIChEQnVzUGlwZSAgICAgICAgICpwaXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBmZCk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCit2b2lkICAgICAgICBfZGJ1c19waXBlX2luaXRfc3Rkb3V0ICAgICAgICAgKERCdXNQaXBlICAgICAgICAgKnBpcGUpOworREJVU19QUklWQVRFX0VYUE9SVAoraW50ICAgICAgICAgX2RidXNfcGlwZV93cml0ZSAgICAgICAgICAgICAgIChEQnVzUGlwZSAgICAgICAgICpwaXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2ludCAgICAgICAgIF9kYnVzX3BpcGVfY2xvc2UgICAgICAgICAgICAgICAoREJ1c1BpcGUgICAgICAgICAqcGlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpOworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgX2RidXNfcGlwZV9pc192YWxpZCAgICAgICAgICAgIChEQnVzUGlwZSAgICAgICAgICpwaXBlKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK3ZvaWQgICAgICAgIF9kYnVzX3BpcGVfaW52YWxpZGF0ZSAgICAgICAgICAoREJ1c1BpcGUgICAgICAgICAqcGlwZSk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCBfZGJ1c19waXBlX2lzX3N0ZG91dF9vcl9zdGRlcnIgKERCdXNQaXBlICAgICAgICAgKnBpcGUpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1wcm90b2NvbC5oIGIvZGJ1cy9kYnVzLXByb3RvY29sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMzYzM2NQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1wcm90b2NvbC5oCkBAIC0wLDAgKzEsNDc5IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtcHJvdG9jb2wuaCAgRC1CdXMgcHJvdG9jb2wgY29uc3RhbnRzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzICBDb2RlRmFjdG9yeSBBQgorICogQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1IFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpZm5kZWYgREJVU19QUk9UT0NPTF9ICisjZGVmaW5lIERCVVNfUFJPVE9DT0xfSAorCisvKiBEb24ndCBpbmNsdWRlIGFueXRoaW5nIGluIGhlcmUgZnJvbSBhbnl3aGVyZSBlbHNlLiBJdCdzCisgKiBpbnRlbmRlZCBmb3IgdXNlIGJ5IGFueSByYW5kb20gbGlicmFyeS4KKyAqLworCisjaWZkZWYgIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNpZiAwCit9IC8qIGF2b2lkcyBjb25mdXNpbmcgZW1hY3MgaW5kZW50YXRpb24gKi8KKyNlbmRpZgorI2VuZGlmCisKKy8qIE5vcm1hbGx5IGRvY3MgYXJlIGluIC5jIGZpbGVzLCBidXQgdGhlcmUgaXNuJ3QgYSAuYyBmaWxlIGZvciB0aGlzLiAqLworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c1Byb3RvY29sIFByb3RvY29sIGNvbnN0YW50cworICogQGluZ3JvdXAgIERCdXMKKyAqCisgKiBAYnJpZWYgRGVmaW5lcyBjb25zdGFudHMgd2hpY2ggYXJlIHBhcnQgb2YgdGhlIEQtQnVzIHByb3RvY29sCisgKgorICogVGhpcyBoZWFkZXIgaXMgaW50ZW5kZWQgZm9yIHVzZSBieSBhbnkgbGlicmFyeSwgbm90IG9ubHkgbGliZGJ1cy4KKyAqCisgKiBAeworICovCisKKworLyogTWVzc2FnZSBieXRlIG9yZGVyICovCisjZGVmaW5lIERCVVNfTElUVExFX0VORElBTiAoJ2wnKSAgLyoqPCBDb2RlIG1hcmtpbmcgTFNCLWZpcnN0IGJ5dGUgb3JkZXIgaW4gdGhlIHdpcmUgcHJvdG9jb2wuICovCisjZGVmaW5lIERCVVNfQklHX0VORElBTiAgICAoJ0InKSAgLyoqPCBDb2RlIG1hcmtpbmcgTVNCLWZpcnN0IGJ5dGUgb3JkZXIgaW4gdGhlIHdpcmUgcHJvdG9jb2wuICovCisKKy8qKiBQcm90b2NvbCB2ZXJzaW9uLiAqLworI2RlZmluZSBEQlVTX01BSk9SX1BST1RPQ09MX1ZFUlNJT04gMQorCisvKiogVHlwZSBjb2RlIHRoYXQgaXMgbmV2ZXIgZXF1YWwgdG8gYSBsZWdpdGltYXRlIHR5cGUgY29kZSAqLworI2RlZmluZSBEQlVTX1RZUEVfSU5WQUxJRCAgICAgICAoKGludCkgJ1wwJykKKy8qKiAjREJVU19UWVBFX0lOVkFMSUQgYXMgYSBzdHJpbmcgbGl0ZXJhbCBpbnN0ZWFkIG9mIGEgaW50IGxpdGVyYWwgKi8KKyNkZWZpbmUgREJVU19UWVBFX0lOVkFMSURfQVNfU1RSSU5HICAgICAgICAiXDAiCisKKy8qIFByaW1pdGl2ZSB0eXBlcyAqLworLyoqIFR5cGUgY29kZSBtYXJraW5nIGFuIDgtYml0IHVuc2lnbmVkIGludGVnZXIgKi8KKyNkZWZpbmUgREJVU19UWVBFX0JZVEUgICAgICAgICAgKChpbnQpICd5JykKKy8qKiAjREJVU19UWVBFX0JZVEUgYXMgYSBzdHJpbmcgbGl0ZXJhbCBpbnN0ZWFkIG9mIGEgaW50IGxpdGVyYWwgKi8KKyNkZWZpbmUgREJVU19UWVBFX0JZVEVfQVNfU1RSSU5HICAgICAgICAgICAieSIKKy8qKiBUeXBlIGNvZGUgbWFya2luZyBhIGJvb2xlYW4gKi8KKyNkZWZpbmUgREJVU19UWVBFX0JPT0xFQU4gICAgICAgKChpbnQpICdiJykKKy8qKiAjREJVU19UWVBFX0JPT0xFQU4gYXMgYSBzdHJpbmcgbGl0ZXJhbCBpbnN0ZWFkIG9mIGEgaW50IGxpdGVyYWwgKi8KKyNkZWZpbmUgREJVU19UWVBFX0JPT0xFQU5fQVNfU1RSSU5HICAgICAgICAiYiIKKy8qKiBUeXBlIGNvZGUgbWFya2luZyBhIDE2LWJpdCBzaWduZWQgaW50ZWdlciAqLworI2RlZmluZSBEQlVTX1RZUEVfSU5UMTYgICAgICAgICAoKGludCkgJ24nKQorLyoqICNEQlVTX1RZUEVfSU5UMTYgYXMgYSBzdHJpbmcgbGl0ZXJhbCBpbnN0ZWFkIG9mIGEgaW50IGxpdGVyYWwgKi8KKyNkZWZpbmUgREJVU19UWVBFX0lOVDE2X0FTX1NUUklORyAgICAgICAgICAibiIKKy8qKiBUeXBlIGNvZGUgbWFya2luZyBhIDE2LWJpdCB1bnNpZ25lZCBpbnRlZ2VyICovCisjZGVmaW5lIERCVVNfVFlQRV9VSU5UMTYgICAgICAgICgoaW50KSAncScpCisvKiogI0RCVVNfVFlQRV9VSU5UMTYgYXMgYSBzdHJpbmcgbGl0ZXJhbCBpbnN0ZWFkIG9mIGEgaW50IGxpdGVyYWwgKi8KKyNkZWZpbmUgREJVU19UWVBFX1VJTlQxNl9BU19TVFJJTkcgICAgICAgICAicSIKKy8qKiBUeXBlIGNvZGUgbWFya2luZyBhIDMyLWJpdCBzaWduZWQgaW50ZWdlciAqLworI2RlZmluZSBEQlVTX1RZUEVfSU5UMzIgICAgICAgICAoKGludCkgJ2knKQorLyoqICNEQlVTX1RZUEVfSU5UMzIgYXMgYSBzdHJpbmcgbGl0ZXJhbCBpbnN0ZWFkIG9mIGEgaW50IGxpdGVyYWwgKi8KKyNkZWZpbmUgREJVU19UWVBFX0lOVDMyX0FTX1NUUklORyAgICAgICAgICAiaSIKKy8qKiBUeXBlIGNvZGUgbWFya2luZyBhIDMyLWJpdCB1bnNpZ25lZCBpbnRlZ2VyICovCisjZGVmaW5lIERCVVNfVFlQRV9VSU5UMzIgICAgICAgICgoaW50KSAndScpCisvKiogI0RCVVNfVFlQRV9VSU5UMzIgYXMgYSBzdHJpbmcgbGl0ZXJhbCBpbnN0ZWFkIG9mIGEgaW50IGxpdGVyYWwgKi8KKyNkZWZpbmUgREJVU19UWVBFX1VJTlQzMl9BU19TVFJJTkcgICAgICAgICAidSIKKy8qKiBUeXBlIGNvZGUgbWFya2luZyBhIDY0LWJpdCBzaWduZWQgaW50ZWdlciAqLworI2RlZmluZSBEQlVTX1RZUEVfSU5UNjQgICAgICAgICAoKGludCkgJ3gnKQorLyoqICNEQlVTX1RZUEVfSU5UNjQgYXMgYSBzdHJpbmcgbGl0ZXJhbCBpbnN0ZWFkIG9mIGEgaW50IGxpdGVyYWwgKi8KKyNkZWZpbmUgREJVU19UWVBFX0lOVDY0X0FTX1NUUklORyAgICAgICAgICAieCIKKy8qKiBUeXBlIGNvZGUgbWFya2luZyBhIDY0LWJpdCB1bnNpZ25lZCBpbnRlZ2VyICovCisjZGVmaW5lIERCVVNfVFlQRV9VSU5UNjQgICAgICAgICgoaW50KSAndCcpCisvKiogI0RCVVNfVFlQRV9VSU5UNjQgYXMgYSBzdHJpbmcgbGl0ZXJhbCBpbnN0ZWFkIG9mIGEgaW50IGxpdGVyYWwgKi8KKyNkZWZpbmUgREJVU19UWVBFX1VJTlQ2NF9BU19TVFJJTkcgICAgICAgICAidCIKKy8qKiBUeXBlIGNvZGUgbWFya2luZyBhbiA4LWJ5dGUgZG91YmxlIGluIElFRUUgNzU0IGZvcm1hdCAqLworI2RlZmluZSBEQlVTX1RZUEVfRE9VQkxFICAgICAgICAoKGludCkgJ2QnKQorLyoqICNEQlVTX1RZUEVfRE9VQkxFIGFzIGEgc3RyaW5nIGxpdGVyYWwgaW5zdGVhZCBvZiBhIGludCBsaXRlcmFsICovCisjZGVmaW5lIERCVVNfVFlQRV9ET1VCTEVfQVNfU1RSSU5HICAgICAgICAgImQiCisvKiogVHlwZSBjb2RlIG1hcmtpbmcgYSBVVEYtOCBlbmNvZGVkLCBudWwtdGVybWluYXRlZCBVbmljb2RlIHN0cmluZyAqLworI2RlZmluZSBEQlVTX1RZUEVfU1RSSU5HICAgICAgICAoKGludCkgJ3MnKQorLyoqICNEQlVTX1RZUEVfU1RSSU5HIGFzIGEgc3RyaW5nIGxpdGVyYWwgaW5zdGVhZCBvZiBhIGludCBsaXRlcmFsICovCisjZGVmaW5lIERCVVNfVFlQRV9TVFJJTkdfQVNfU1RSSU5HICAgICAgICAgInMiCisvKiogVHlwZSBjb2RlIG1hcmtpbmcgYSBELUJ1cyBvYmplY3QgcGF0aCAqLworI2RlZmluZSBEQlVTX1RZUEVfT0JKRUNUX1BBVEggICAoKGludCkgJ28nKQorLyoqICNEQlVTX1RZUEVfT0JKRUNUX1BBVEggYXMgYSBzdHJpbmcgbGl0ZXJhbCBpbnN0ZWFkIG9mIGEgaW50IGxpdGVyYWwgKi8KKyNkZWZpbmUgREJVU19UWVBFX09CSkVDVF9QQVRIX0FTX1NUUklORyAgICAibyIKKy8qKiBUeXBlIGNvZGUgbWFya2luZyBhIEQtQnVzIHR5cGUgc2lnbmF0dXJlICovCisjZGVmaW5lIERCVVNfVFlQRV9TSUdOQVRVUkUgICAgICgoaW50KSAnZycpCisvKiogI0RCVVNfVFlQRV9TSUdOQVRVUkUgYXMgYSBzdHJpbmcgbGl0ZXJhbCBpbnN0ZWFkIG9mIGEgaW50IGxpdGVyYWwgKi8KKyNkZWZpbmUgREJVU19UWVBFX1NJR05BVFVSRV9BU19TVFJJTkcgICAgICAiZyIKKy8qKiBUeXBlIGNvZGUgbWFya2luZyBhIHVuaXggZmlsZSBkZXNjcmlwdG9yICovCisjZGVmaW5lIERCVVNfVFlQRV9VTklYX0ZEICAgICAgKChpbnQpICdoJykKKy8qKiAjREJVU19UWVBFX1VOSVhfRkQgYXMgYSBzdHJpbmcgbGl0ZXJhbCBpbnN0ZWFkIG9mIGEgaW50IGxpdGVyYWwgKi8KKyNkZWZpbmUgREJVU19UWVBFX1VOSVhfRkRfQVNfU1RSSU5HICAgICAgICAiaCIKKworLyogQ29tcG91bmQgdHlwZXMgKi8KKy8qKiBUeXBlIGNvZGUgbWFya2luZyBhIEQtQnVzIGFycmF5IHR5cGUgKi8KKyNkZWZpbmUgREJVU19UWVBFX0FSUkFZICAgICAgICAgKChpbnQpICdhJykKKy8qKiAjREJVU19UWVBFX0FSUkFZIGFzIGEgc3RyaW5nIGxpdGVyYWwgaW5zdGVhZCBvZiBhIGludCBsaXRlcmFsICovCisjZGVmaW5lIERCVVNfVFlQRV9BUlJBWV9BU19TVFJJTkcgICAgICAgICAgImEiCisvKiogVHlwZSBjb2RlIG1hcmtpbmcgYSBELUJ1cyB2YXJpYW50IHR5cGUgKi8KKyNkZWZpbmUgREJVU19UWVBFX1ZBUklBTlQgICAgICAgKChpbnQpICd2JykKKy8qKiAjREJVU19UWVBFX1ZBUklBTlQgYXMgYSBzdHJpbmcgbGl0ZXJhbCBpbnN0ZWFkIG9mIGEgaW50IGxpdGVyYWwgKi8KKyNkZWZpbmUgREJVU19UWVBFX1ZBUklBTlRfQVNfU1RSSU5HICAgICAgICAidiIKKworLyoqIFNUUlVDVCBhbmQgRElDVF9FTlRSWSBhcmUgc29ydCBvZiBzcGVjaWFsIHNpbmNlIHRoZWlyIGNvZGVzIGNhbid0CisgKiBhcHBlYXIgaW4gYSB0eXBlIHN0cmluZywgaW5zdGVhZAorICogREJVU19TVFJVQ1RfQkVHSU5fQ0hBUi9EQlVTX0RJQ1RfRU5UUllfQkVHSU5fQ0hBUiBoYXZlIHRvIGFwcGVhcgorICovCisvKiogVHlwZSBjb2RlIHVzZWQgdG8gcmVwcmVzZW50IGEgc3RydWN0OyBob3dldmVyLCB0aGlzIHR5cGUgY29kZSBkb2VzIG5vdCBhcHBlYXIKKyAqIGluIHR5cGUgc2lnbmF0dXJlcywgaW5zdGVhZCAjREJVU19TVFJVQ1RfQkVHSU5fQ0hBUiBhbmQgI0RCVVNfU1RSVUNUX0VORF9DSEFSIHdpbGwKKyAqIGFwcGVhciBpbiBhIHNpZ25hdHVyZS4KKyAqLworI2RlZmluZSBEQlVTX1RZUEVfU1RSVUNUICAgICAgICAoKGludCkgJ3InKQorLyoqICNEQlVTX1RZUEVfU1RSVUNUIGFzIGEgc3RyaW5nIGxpdGVyYWwgaW5zdGVhZCBvZiBhIGludCBsaXRlcmFsICovCisjZGVmaW5lIERCVVNfVFlQRV9TVFJVQ1RfQVNfU1RSSU5HICAgICAgICAgInIiCisvKiogVHlwZSBjb2RlIHVzZWQgdG8gcmVwcmVzZW50IGEgZGljdCBlbnRyeTsgaG93ZXZlciwgdGhpcyB0eXBlIGNvZGUgZG9lcyBub3QgYXBwZWFyCisgKiBpbiB0eXBlIHNpZ25hdHVyZXMsIGluc3RlYWQgI0RCVVNfRElDVF9FTlRSWV9CRUdJTl9DSEFSIGFuZCAjREJVU19ESUNUX0VOVFJZX0VORF9DSEFSIHdpbGwKKyAqIGFwcGVhciBpbiBhIHNpZ25hdHVyZS4KKyAqLworI2RlZmluZSBEQlVTX1RZUEVfRElDVF9FTlRSWSAgICAoKGludCkgJ2UnKQorLyoqICNEQlVTX1RZUEVfRElDVF9FTlRSWSBhcyBhIHN0cmluZyBsaXRlcmFsIGluc3RlYWQgb2YgYSBpbnQgbGl0ZXJhbCAqLworI2RlZmluZSBEQlVTX1RZUEVfRElDVF9FTlRSWV9BU19TVFJJTkcgICAgICJlIgorCisvKiogRG9lcyBub3QgaW5jbHVkZSAjREJVU19UWVBFX0lOVkFMSUQsICNEQlVTX1NUUlVDVF9CRUdJTl9DSEFSLCAjREJVU19TVFJVQ1RfRU5EX0NIQVIsCisgKiAjREJVU19ESUNUX0VOVFJZX0JFR0lOX0NIQVIsIG9yICNEQlVTX0RJQ1RfRU5UUllfRU5EX0NIQVIgLSBpLmUuIGl0IGlzIHRoZSBudW1iZXIgb2YKKyAqIHZhbGlkIHR5cGVzLCBub3QgdGhlIG51bWJlciBvZiBkaXN0aW5jdCBjaGFyYWN0ZXJzIHRoYXQgbWF5IGFwcGVhciBpbiBhIHR5cGUgc2lnbmF0dXJlLgorICovCisjZGVmaW5lIERCVVNfTlVNQkVSX09GX1RZUEVTICAgICgxNikKKworLyogY2hhcmFjdGVycyBvdGhlciB0aGFuIHR5cGVjb2RlcyB0aGF0IGFwcGVhciBpbiB0eXBlIHNpZ25hdHVyZXMgKi8KKworLyoqIENvZGUgbWFya2luZyB0aGUgc3RhcnQgb2YgYSBzdHJ1Y3QgdHlwZSBpbiBhIHR5cGUgc2lnbmF0dXJlICovCisjZGVmaW5lIERCVVNfU1RSVUNUX0JFR0lOX0NIQVIgICAoKGludCkgJygnKQorLyoqICNEQlVTX1NUUlVDVF9CRUdJTl9DSEFSIGFzIGEgc3RyaW5nIGxpdGVyYWwgaW5zdGVhZCBvZiBhIGludCBsaXRlcmFsICovCisjZGVmaW5lIERCVVNfU1RSVUNUX0JFR0lOX0NIQVJfQVNfU1RSSU5HICAgIigiCisvKiogQ29kZSBtYXJraW5nIHRoZSBlbmQgb2YgYSBzdHJ1Y3QgdHlwZSBpbiBhIHR5cGUgc2lnbmF0dXJlICovCisjZGVmaW5lIERCVVNfU1RSVUNUX0VORF9DSEFSICAgICAoKGludCkgJyknKQorLyoqICNEQlVTX1NUUlVDVF9FTkRfQ0hBUiBhIHN0cmluZyBsaXRlcmFsIGluc3RlYWQgb2YgYSBpbnQgbGl0ZXJhbCAqLworI2RlZmluZSBEQlVTX1NUUlVDVF9FTkRfQ0hBUl9BU19TVFJJTkcgICAgICIpIgorLyoqIENvZGUgbWFya2luZyB0aGUgc3RhcnQgb2YgYSBkaWN0IGVudHJ5IHR5cGUgaW4gYSB0eXBlIHNpZ25hdHVyZSAqLworI2RlZmluZSBEQlVTX0RJQ1RfRU5UUllfQkVHSU5fQ0hBUiAgICgoaW50KSAneycpCisvKiogI0RCVVNfRElDVF9FTlRSWV9CRUdJTl9DSEFSIGFzIGEgc3RyaW5nIGxpdGVyYWwgaW5zdGVhZCBvZiBhIGludCBsaXRlcmFsICovCisjZGVmaW5lIERCVVNfRElDVF9FTlRSWV9CRUdJTl9DSEFSX0FTX1NUUklORyAgICJ7IgorLyoqIENvZGUgbWFya2luZyB0aGUgZW5kIG9mIGEgZGljdCBlbnRyeSB0eXBlIGluIGEgdHlwZSBzaWduYXR1cmUgKi8KKyNkZWZpbmUgREJVU19ESUNUX0VOVFJZX0VORF9DSEFSICAgICAoKGludCkgJ30nKQorLyoqICNEQlVTX0RJQ1RfRU5UUllfRU5EX0NIQVIgYXMgYSBzdHJpbmcgbGl0ZXJhbCBpbnN0ZWFkIG9mIGEgaW50IGxpdGVyYWwgKi8KKyNkZWZpbmUgREJVU19ESUNUX0VOVFJZX0VORF9DSEFSX0FTX1NUUklORyAgICAgIn0iCisKKy8qKiBNYXggbGVuZ3RoIGluIGJ5dGVzIG9mIGEgYnVzIG5hbWUsIGludGVyZmFjZSwgb3IgbWVtYmVyIChub3Qgb2JqZWN0CisgKiBwYXRoLCBwYXRocyBhcmUgdW5saW1pdGVkKS4gVGhpcyBpcyBsaW1pdGVkIGJlY2F1c2UgbG90cyBvZiBzdHVmZgorICogaXMgTyhuKSBpbiB0aGlzIG51bWJlciwgcGx1cyBpdCB3b3VsZCBiZSBvYm5veGlvdXMgdG8gdHlwZSBpbiBhCisgKiBwYXJhZ3JhcGgtbG9uZyBtZXRob2QgbmFtZSBzbyBtb3N0IGxpa2VseSBzb21ldGhpbmcgbGlrZSB0aGF0IHdvdWxkCisgKiBiZSBhbiBleHBsb2l0LgorICovCisjZGVmaW5lIERCVVNfTUFYSU1VTV9OQU1FX0xFTkdUSCAyNTUKKworLyoqIFRoaXMgb25lIGlzIDI1NSBzbyBpdCBmaXRzIGluIGEgYnl0ZSAqLworI2RlZmluZSBEQlVTX01BWElNVU1fU0lHTkFUVVJFX0xFTkdUSCAyNTUKKworLyoqIE1heCBsZW5ndGggb2YgYSBtYXRjaCBydWxlIHN0cmluZzsgdG8ga2VlcCBwZW9wbGUgZnJvbSBob3NpbmcgdGhlCisgKiBkYWVtb24gd2l0aCBzb21lIGh1Z2UgcnVsZQorICovCisjZGVmaW5lIERCVVNfTUFYSU1VTV9NQVRDSF9SVUxFX0xFTkdUSCAxMDI0CisKKy8qKiBNYXggYXJnIG51bWJlciB5b3UgY2FuIG1hdGNoIG9uIGluIGEgbWF0Y2ggcnVsZSwgZS5nLgorICogYXJnMD0naGVsbG8nIGlzIE9LLCBhcmczNDg5NzIwOTg3PSdoZWxsbycgaXMgbm90CisgKi8KKyNkZWZpbmUgREJVU19NQVhJTVVNX01BVENIX1JVTEVfQVJHX05VTUJFUiA2MworCisvKiogTWF4IGxlbmd0aCBvZiBhIG1hcnNoYWxlZCBhcnJheSBpbiBieXRlcyAoNjRNLCAyXjI2KSBXZSB1c2Ugc2lnbmVkCisgKiBpbnQgZm9yIGxlbmd0aHMgc28gbXVzdCBiZSBJTlRfTUFYIG9yIGxlc3MuICBXZSBuZWVkIHNvbWV0aGluZyBhCisgKiBiaXQgc21hbGxlciB0aGFuIElOVF9NQVggYmVjYXVzZSB0aGUgYXJyYXkgaXMgaW5zaWRlIGEgbWVzc2FnZSB3aXRoCisgKiBoZWFkZXIgaW5mbywgZXRjLiAgc28gYW4gSU5UX01BWCBhcnJheSB3b3VsZG4ndCBhbGxvdyB0aGUgbWVzc2FnZQorICogb3ZlcmhlYWQuICBUaGUgNjRNIG51bWJlciBpcyBhbiBhdHRlbXB0IGF0IGEgbGFyZ2VyIG51bWJlciB0aGFuCisgKiB3ZSdkIHJlYXNvbmFibHkgZXZlciB1c2UsIGJ1dCBzbWFsbCBlbm91Z2ggdGhhdCB5b3VyIGJ1cyB3b3VsZCBjaGV3CisgKiB0aHJvdWdoIGl0IGZhaXJseSBxdWlja2x5IHdpdGhvdXQgbG9ja2luZyB1cCBmb3JldmVyLiBJZiB5b3UgaGF2ZQorICogZGF0YSB0aGF0J3MgbGlrZWx5IHRvIGJlIGxhcmdlciB0aGFuIHRoaXMsIHlvdSBzaG91bGQgcHJvYmFibHkgYmUKKyAqIHNlbmRpbmcgaXQgaW4gbXVsdGlwbGUgaW5jcmVtZW50YWwgbWVzc2FnZXMgYW55aG93LgorICovCisjZGVmaW5lIERCVVNfTUFYSU1VTV9BUlJBWV9MRU5HVEggKDY3MTA4ODY0KQorLyoqIE51bWJlciBvZiBiaXRzIHlvdSBuZWVkIGluIGFuIHVuc2lnbmVkIHRvIHN0b3JlIHRoZSBtYXggYXJyYXkgc2l6ZSAqLworI2RlZmluZSBEQlVTX01BWElNVU1fQVJSQVlfTEVOR1RIX0JJVFMgMjYKKworLyoqIFRoZSBtYXhpbXVtIHRvdGFsIG1lc3NhZ2Ugc2l6ZSBpbmNsdWRpbmcgaGVhZGVyIGFuZCBib2R5OyBzaW1pbGFyCisgKiByYXRpb25hbGUgdG8gbWF4IGFycmF5IHNpemUuCisgKi8KKyNkZWZpbmUgREJVU19NQVhJTVVNX01FU1NBR0VfTEVOR1RIIChEQlVTX01BWElNVU1fQVJSQVlfTEVOR1RIICogMikKKy8qKiBOdW1iZXIgb2YgYml0cyB5b3UgbmVlZCBpbiBhbiB1bnNpZ25lZCB0byBzdG9yZSB0aGUgbWF4IG1lc3NhZ2Ugc2l6ZSAqLworI2RlZmluZSBEQlVTX01BWElNVU1fTUVTU0FHRV9MRU5HVEhfQklUUyAyNworCisvKiogVGhlIG1heGltdW0gdG90YWwgbnVtYmVyIG9mIHVuaXggZmRzIGluIGEgbWVzc2FnZS4gU2ltaWxhcgorICogcmF0aW9uYWxlIGFzIERCVVNfTUFYSU1VTV9NRVNTQUdFX0xFTkdUSC4gSG93ZXZlciB3ZSBkaXZpZGUgYnkgZm91cgorICogZ2l2ZW4gdGhhdCBvbmUgZmQgaXMgYW4gaW50IGFuZCBoZW5jZSBhdCBsZWFzdCAzMiBiaXRzLgorICovCisjZGVmaW5lIERCVVNfTUFYSU1VTV9NRVNTQUdFX1VOSVhfRkRTIChEQlVTX01BWElNVU1fTUVTU0FHRV9MRU5HVEgvNCkKKy8qKiBOdW1iZXIgb2YgYml0cyB5b3UgbmVlZCBpbiBhbiB1bnNpZ25lZCB0byBzdG9yZSB0aGUgbWF4IG1lc3NhZ2UgdW5peCBmZHMgKi8KKyNkZWZpbmUgREJVU19NQVhJTVVNX01FU1NBR0VfVU5JWF9GRFNfQklUUyAoREJVU19NQVhJTVVNX01FU1NBR0VfTEVOR1RIX0JJVFMtMikKKworLyoqIERlcHRoIG9mIHJlY3Vyc2lvbiBpbiB0aGUgdHlwZSB0cmVlLiBUaGlzIGlzIGF1dG9tYXRpY2FsbHkgbGltaXRlZAorICogdG8gREJVU19NQVhJTVVNX1NJR05BVFVSRV9MRU5HVEggc2luY2UgeW91IGNvdWxkIG9ubHkgaGF2ZSBhbiBhcnJheQorICogb2YgYXJyYXkgb2YgYXJyYXkgb2YgLi4uIHRoYXQgZml0IGluIHRoZSBtYXggc2lnbmF0dXJlLiAgQnV0IHRoYXQncworICogcHJvYmFibHkgYSBiaXQgdG9vIGxhcmdlLgorICovCisjZGVmaW5lIERCVVNfTUFYSU1VTV9UWVBFX1JFQ1VSU0lPTl9ERVBUSCAzMgorCisvKiBUeXBlcyBvZiBtZXNzYWdlICovCisKKy8qKiBUaGlzIHZhbHVlIGlzIG5ldmVyIGEgdmFsaWQgbWVzc2FnZSB0eXBlLCBzZWUgZGJ1c19tZXNzYWdlX2dldF90eXBlKCkgKi8KKyNkZWZpbmUgREJVU19NRVNTQUdFX1RZUEVfSU5WQUxJRCAgICAgICAwCisvKiogTWVzc2FnZSB0eXBlIG9mIGEgbWV0aG9kIGNhbGwgbWVzc2FnZSwgc2VlIGRidXNfbWVzc2FnZV9nZXRfdHlwZSgpICovCisjZGVmaW5lIERCVVNfTUVTU0FHRV9UWVBFX01FVEhPRF9DQUxMICAgMQorLyoqIE1lc3NhZ2UgdHlwZSBvZiBhIG1ldGhvZCByZXR1cm4gbWVzc2FnZSwgc2VlIGRidXNfbWVzc2FnZV9nZXRfdHlwZSgpICovCisjZGVmaW5lIERCVVNfTUVTU0FHRV9UWVBFX01FVEhPRF9SRVRVUk4gMgorLyoqIE1lc3NhZ2UgdHlwZSBvZiBhbiBlcnJvciByZXBseSBtZXNzYWdlLCBzZWUgZGJ1c19tZXNzYWdlX2dldF90eXBlKCkgKi8KKyNkZWZpbmUgREJVU19NRVNTQUdFX1RZUEVfRVJST1IgICAgICAgICAzCisvKiogTWVzc2FnZSB0eXBlIG9mIGEgc2lnbmFsIG1lc3NhZ2UsIHNlZSBkYnVzX21lc3NhZ2VfZ2V0X3R5cGUoKSAqLworI2RlZmluZSBEQlVTX01FU1NBR0VfVFlQRV9TSUdOQUwgICAgICAgIDQKKworI2RlZmluZSBEQlVTX05VTV9NRVNTQUdFX1RZUEVTICAgICAgICAgIDUKKworLyogSGVhZGVyIGZsYWdzICovCisKKy8qKiBJZiBzZXQsIHRoaXMgZmxhZyBtZWFucyB0aGF0IHRoZSBzZW5kZXIgb2YgYSBtZXNzYWdlIGRvZXMgbm90IGNhcmUgYWJvdXQgZ2V0dGluZworICogYSByZXBseSwgc28gdGhlIHJlY2lwaWVudCBuZWVkIG5vdCBzZW5kIG9uZS4gU2VlIGRidXNfbWVzc2FnZV9zZXRfbm9fcmVwbHkoKS4KKyAqLworI2RlZmluZSBEQlVTX0hFQURFUl9GTEFHX05PX1JFUExZX0VYUEVDVEVEIDB4MQorLyoqCisgKiBJZiBzZXQsIHRoaXMgZmxhZyBtZWFucyB0aGF0IGV2ZW4gaWYgdGhlIG1lc3NhZ2UgYnVzIGtub3dzIGhvdyB0byBzdGFydCBhbiBvd25lciBmb3IKKyAqIHRoZSBkZXN0aW5hdGlvbiBidXMgbmFtZSAoc2VlIGRidXNfbWVzc2FnZV9zZXRfZGVzdGluYXRpb24oKSksIGl0IHNob3VsZCBub3QKKyAqIGRvIHNvLiBJZiB0aGlzIGZsYWcgaXMgbm90IHNldCwgdGhlIGJ1cyBtYXkgbGF1bmNoIGEgcHJvZ3JhbSB0byBwcm9jZXNzIHRoZQorICogbWVzc2FnZS4KKyAqLworI2RlZmluZSBEQlVTX0hFQURFUl9GTEFHX05PX0FVVE9fU1RBUlQgICAgIDB4MgorLyoqCisgKiBJZiBzZXQgb24gYSBtZXRob2QgY2FsbCwgdGhpcyBmbGFnIG1lYW5zIHRoYXQgdGhlIGNhbGxlciBpcyBwcmVwYXJlZCB0bworICogd2FpdCBmb3IgaW50ZXJhY3RpdmUgYXV0aG9yaXphdGlvbi4KKyAqLworI2RlZmluZSBEQlVTX0hFQURFUl9GTEFHX0FMTE9XX0lOVEVSQUNUSVZFX0FVVEhPUklaQVRJT04gMHg0CisKKy8qIEhlYWRlciBmaWVsZHMgKi8KKworLyoqIE5vdCBlcXVhbCB0byBhbnkgdmFsaWQgaGVhZGVyIGZpZWxkIGNvZGUgKi8KKyNkZWZpbmUgREJVU19IRUFERVJfRklFTERfSU5WQUxJRCAgICAgICAgMAorLyoqIEhlYWRlciBmaWVsZCBjb2RlIGZvciB0aGUgcGF0aCAtIHRoZSBwYXRoIGlzIHRoZSBvYmplY3QgZW1pdHRpbmcgYSBzaWduYWwgb3IgdGhlIG9iamVjdCByZWNlaXZpbmcgYSBtZXRob2QgY2FsbC4KKyAqIFNlZSBkYnVzX21lc3NhZ2Vfc2V0X3BhdGgoKS4KKyAqLworI2RlZmluZSBEQlVTX0hFQURFUl9GSUVMRF9QQVRIICAgICAgICAgICAxCisvKiogSGVhZGVyIGZpZWxkIGNvZGUgZm9yIHRoZSBpbnRlcmZhY2UgY29udGFpbmluZyBhIG1lbWJlciAobWV0aG9kIG9yIHNpZ25hbCkuCisgKiBTZWUgZGJ1c19tZXNzYWdlX3NldF9pbnRlcmZhY2UoKS4KKyAqLworI2RlZmluZSBEQlVTX0hFQURFUl9GSUVMRF9JTlRFUkZBQ0UgICAgICAyCisvKiogSGVhZGVyIGZpZWxkIGNvZGUgZm9yIGEgbWVtYmVyIChtZXRob2Qgb3Igc2lnbmFsKS4gU2VlIGRidXNfbWVzc2FnZV9zZXRfbWVtYmVyKCkuICovCisjZGVmaW5lIERCVVNfSEVBREVSX0ZJRUxEX01FTUJFUiAgICAgICAgIDMKKy8qKiBIZWFkZXIgZmllbGQgY29kZSBmb3IgYW4gZXJyb3IgbmFtZSAoZm91bmQgaW4gI0RCVVNfTUVTU0FHRV9UWVBFX0VSUk9SIG1lc3NhZ2VzKS4KKyAqIFNlZSBkYnVzX21lc3NhZ2Vfc2V0X2Vycm9yX25hbWUoKS4KKyAqLworI2RlZmluZSBEQlVTX0hFQURFUl9GSUVMRF9FUlJPUl9OQU1FICAgICA0CisvKiogSGVhZGVyIGZpZWxkIGNvZGUgZm9yIGEgcmVwbHkgc2VyaWFsLCB1c2VkIHRvIG1hdGNoIGEgI0RCVVNfTUVTU0FHRV9UWVBFX01FVEhPRF9SRVRVUk4gbWVzc2FnZSB3aXRoIHRoZQorICogbWVzc2FnZSB0aGF0IGl0J3MgYSByZXBseSB0by4gU2VlIGRidXNfbWVzc2FnZV9zZXRfcmVwbHlfc2VyaWFsKCkuCisgKi8KKyNkZWZpbmUgREJVU19IRUFERVJfRklFTERfUkVQTFlfU0VSSUFMICAgNQorLyoqCisgKiBIZWFkZXIgZmllbGQgY29kZSBmb3IgdGhlIGRlc3RpbmF0aW9uIGJ1cyBuYW1lIG9mIGEgbWVzc2FnZS4gU2VlIGRidXNfbWVzc2FnZV9zZXRfZGVzdGluYXRpb24oKS4KKyAqLworI2RlZmluZSBEQlVTX0hFQURFUl9GSUVMRF9ERVNUSU5BVElPTiAgICA2CisvKioKKyAqIEhlYWRlciBmaWVsZCBjb2RlIGZvciB0aGUgc2VuZGVyIG9mIGEgbWVzc2FnZTsgdXN1YWxseSBpbml0aWFsaXplZCBieSB0aGUgbWVzc2FnZSBidXMuCisgKiBTZWUgZGJ1c19tZXNzYWdlX3NldF9zZW5kZXIoKS4KKyAqLworI2RlZmluZSBEQlVTX0hFQURFUl9GSUVMRF9TRU5ERVIgICAgICAgICA3CisvKioKKyAqIEhlYWRlciBmaWVsZCBjb2RlIGZvciB0aGUgdHlwZSBzaWduYXR1cmUgb2YgYSBtZXNzYWdlLgorICovCisjZGVmaW5lIERCVVNfSEVBREVSX0ZJRUxEX1NJR05BVFVSRSAgICAgIDgKKy8qKgorICogSGVhZGVyIGZpZWxkIGNvZGUgZm9yIHRoZSBudW1iZXIgb2YgdW5peCBmaWxlIGRlc2NyaXB0b3JzIGFzc29jaWF0ZWQKKyAqIHdpdGggdGhpcyBtZXNzYWdlLgorICovCisjZGVmaW5lIERCVVNfSEVBREVSX0ZJRUxEX1VOSVhfRkRTICAgICAgIDkKKworCisvKioKKyAqIFZhbHVlIG9mIHRoZSBoaWdoZXN0LW51bWJlcmVkIGhlYWRlciBmaWVsZCBjb2RlLCBjYW4gYmUgdXNlZCB0byBkZXRlcm1pbmUKKyAqIHRoZSBzaXplIG9mIGFuIGFycmF5IGluZGV4ZWQgYnkgaGVhZGVyIGZpZWxkIGNvZGUuIFJlbWVtYmVyIHRob3VnaAorICogdGhhdCB1bmtub3duIGNvZGVzIG11c3QgYmUgaWdub3JlZCwgc28gY2hlY2sgZm9yIHRoYXQgYmVmb3JlCisgKiBpbmRleGluZyB0aGUgYXJyYXkuCisgKi8KKyNkZWZpbmUgREJVU19IRUFERVJfRklFTERfTEFTVCBEQlVTX0hFQURFUl9GSUVMRF9VTklYX0ZEUworCisvKiogSGVhZGVyIGZvcm1hdCBpcyBkZWZpbmVkIGFzIGEgc2lnbmF0dXJlOgorICogICBieXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGUgb3JkZXIKKyAqICAgYnl0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlIHR5cGUgSUQKKyAqICAgYnl0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncworICogICBieXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sIHZlcnNpb24KKyAqICAgdWludDMyICAgICAgICAgICAgICAgICAgICAgICAgICBib2R5IGxlbmd0aAorICogICB1aW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbAorICogICBhcnJheSBvZiBzdHJ1Y3QgKGJ5dGUsdmFyaWFudCkgIChmaWVsZCBuYW1lLCB2YWx1ZSkKKyAqCisgKiBUaGUgbGVuZ3RoIG9mIHRoZSBoZWFkZXIgY2FuIGJlIGNvbXB1dGVkIGFzIHRoZQorICogZml4ZWQgc2l6ZSBvZiB0aGUgaW5pdGlhbCBkYXRhLCBwbHVzIHRoZSBsZW5ndGggb2YKKyAqIHRoZSBhcnJheSBhdCB0aGUgZW5kLCBwbHVzIHBhZGRpbmcgdG8gYW4gOC1ib3VuZGFyeS4KKyAqLworI2RlZmluZSBEQlVTX0hFQURFUl9TSUdOQVRVUkUgICAgICAgICAgICAgICAgICAgXAorICAgICBEQlVTX1RZUEVfQllURV9BU19TVFJJTkcgICAgICAgICAgICAgICAgICAgXAorICAgICBEQlVTX1RZUEVfQllURV9BU19TVFJJTkcgICAgICAgICAgICAgICAgICAgXAorICAgICBEQlVTX1RZUEVfQllURV9BU19TVFJJTkcgICAgICAgICAgICAgICAgICAgXAorICAgICBEQlVTX1RZUEVfQllURV9BU19TVFJJTkcgICAgICAgICAgICAgICAgICAgXAorICAgICBEQlVTX1RZUEVfVUlOVDMyX0FTX1NUUklORyAgICAgICAgICAgICAgICAgXAorICAgICBEQlVTX1RZUEVfVUlOVDMyX0FTX1NUUklORyAgICAgICAgICAgICAgICAgXAorICAgICBEQlVTX1RZUEVfQVJSQVlfQVNfU1RSSU5HICAgICAgICAgICAgICAgICAgXAorICAgICBEQlVTX1NUUlVDVF9CRUdJTl9DSEFSX0FTX1NUUklORyAgICAgICAgICAgXAorICAgICBEQlVTX1RZUEVfQllURV9BU19TVFJJTkcgICAgICAgICAgICAgICAgICAgXAorICAgICBEQlVTX1RZUEVfVkFSSUFOVF9BU19TVFJJTkcgICAgICAgICAgICAgICAgXAorICAgICBEQlVTX1NUUlVDVF9FTkRfQ0hBUl9BU19TVFJJTkcKKworCisvKioKKyAqIFRoZSBzbWFsbGVzdCBoZWFkZXIgc2l6ZSB0aGF0IGNhbiBvY2N1ci4gIChJdCB3b24ndCBiZSB2YWxpZCBkdWUgdG8KKyAqIG1pc3NpbmcgcmVxdWlyZWQgaGVhZGVyIGZpZWxkcy4pIFRoaXMgaXMgNCBieXRlcywgdHdvIHVpbnQzMiwgYW4KKyAqIGFycmF5IGxlbmd0aC4gVGhpcyBpc24ndCBhbnkga2luZCBvZiByZXNvdXJjZSBsaW1pdCwganVzdCB0aGUKKyAqIG5lY2Vzc2FyeS9sb2dpY2FsIG91dGNvbWUgb2YgdGhlIGhlYWRlciBzaWduYXR1cmUuCisgKi8KKyNkZWZpbmUgREJVU19NSU5JTVVNX0hFQURFUl9TSVpFIDE2CisKKy8qIEVycm9ycyAqLworLyogV0FSTklORyB0aGVzZSBnZXQgYXV0b2NvbnZlcnRlZCB0byBhbiBlbnVtIGluIGRidXMtZ2xpYi5oLiBUaHVzLAorICogaWYgeW91IGNoYW5nZSB0aGUgb3JkZXIgaXQgYnJlYWtzIHRoZSBBQkkuIEtlZXAgdGhlbSBpbiBvcmRlci4KKyAqIEFsc28sIGRvbid0IGNoYW5nZSB0aGUgZm9ybWF0dGluZyBzaW5jZSB0aGF0IHdpbGwgYnJlYWsgdGhlIHNlZAorICogc2NyaXB0LgorICovCisvKiogQSBnZW5lcmljIGVycm9yOyAic29tZXRoaW5nIHdlbnQgd3JvbmciIC0gc2VlIHRoZSBlcnJvciBtZXNzYWdlIGZvciBtb3JlLiAqLworI2RlZmluZSBEQlVTX0VSUk9SX0ZBSUxFRCAgICAgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5FcnJvci5GYWlsZWQiCisvKiogVGhlcmUgd2FzIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGNvbXBsZXRlIGFuIG9wZXJhdGlvbi4gKi8KKyNkZWZpbmUgREJVU19FUlJPUl9OT19NRU1PUlkgICAgICAgICAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLkRCdXMuRXJyb3IuTm9NZW1vcnkiCisvKiogVGhlIGJ1cyBkb2Vzbid0IGtub3cgaG93IHRvIGxhdW5jaCBhIHNlcnZpY2UgdG8gc3VwcGx5IHRoZSBidXMgbmFtZSB5b3Ugd2FudGVkLiAqLworI2RlZmluZSBEQlVTX0VSUk9SX1NFUlZJQ0VfVU5LTk9XTiAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5FcnJvci5TZXJ2aWNlVW5rbm93biIKKy8qKiBUaGUgYnVzIG5hbWUgeW91IHJlZmVyZW5jZWQgZG9lc24ndCBleGlzdCAoaS5lLiBubyBhcHBsaWNhdGlvbiBvd25zIGl0KS4gKi8KKyNkZWZpbmUgREJVU19FUlJPUl9OQU1FX0hBU19OT19PV05FUiAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLkRCdXMuRXJyb3IuTmFtZUhhc05vT3duZXIiCisvKiogTm8gcmVwbHkgdG8gYSBtZXNzYWdlIGV4cGVjdGluZyBvbmUsIHVzdWFsbHkgbWVhbnMgYSB0aW1lb3V0IG9jY3VycmVkLiAqLworI2RlZmluZSBEQlVTX0VSUk9SX05PX1JFUExZICAgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5FcnJvci5Ob1JlcGx5IgorLyoqIFNvbWV0aGluZyB3ZW50IHdyb25nIHJlYWRpbmcgb3Igd3JpdGluZyB0byBhIHNvY2tldCwgZm9yIGV4YW1wbGUuICovCisjZGVmaW5lIERCVVNfRVJST1JfSU9fRVJST1IgICAgICAgICAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5EQnVzLkVycm9yLklPRXJyb3IiCisvKiogQSBELUJ1cyBidXMgYWRkcmVzcyB3YXMgbWFsZm9ybWVkLiAqLworI2RlZmluZSBEQlVTX0VSUk9SX0JBRF9BRERSRVNTICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5FcnJvci5CYWRBZGRyZXNzIgorLyoqIFJlcXVlc3RlZCBvcGVyYXRpb24gaXNuJ3Qgc3VwcG9ydGVkIChsaWtlIEVOT1NZUyBvbiBVTklYKS4gKi8KKyNkZWZpbmUgREJVU19FUlJPUl9OT1RfU1VQUE9SVEVEICAgICAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLkRCdXMuRXJyb3IuTm90U3VwcG9ydGVkIgorLyoqIFNvbWUgbGltaXRlZCByZXNvdXJjZSBpcyBleGhhdXN0ZWQuICovCisjZGVmaW5lIERCVVNfRVJST1JfTElNSVRTX0VYQ0VFREVEICAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5EQnVzLkVycm9yLkxpbWl0c0V4Y2VlZGVkIgorLyoqIFNlY3VyaXR5IHJlc3RyaWN0aW9ucyBkb24ndCBhbGxvdyBkb2luZyB3aGF0IHlvdSdyZSB0cnlpbmcgdG8gZG8uICovCisjZGVmaW5lIERCVVNfRVJST1JfQUNDRVNTX0RFTklFRCAgICAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5EQnVzLkVycm9yLkFjY2Vzc0RlbmllZCIKKy8qKiBBdXRoZW50aWNhdGlvbiBkaWRuJ3Qgd29yay4gKi8KKyNkZWZpbmUgREJVU19FUlJPUl9BVVRIX0ZBSUxFRCAgICAgICAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLkRCdXMuRXJyb3IuQXV0aEZhaWxlZCIKKy8qKiBVbmFibGUgdG8gY29ubmVjdCB0byBzZXJ2ZXIgKHByb2JhYmx5IGNhdXNlZCBieSBFQ09OTlJFRlVTRUQgb24gYSBzb2NrZXQpLiAqLworI2RlZmluZSBEQlVTX0VSUk9SX05PX1NFUlZFUiAgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5FcnJvci5Ob1NlcnZlciIKKy8qKiBDZXJ0YWluIHRpbWVvdXQgZXJyb3JzLCBwb3NzaWJseSBFVElNRURPVVQgb24gYSBzb2NrZXQuCisgKiBOb3RlIHRoYXQgI0RCVVNfRVJST1JfTk9fUkVQTFkgaXMgdXNlZCBmb3IgbWVzc2FnZSByZXBseSB0aW1lb3V0cy4KKyAqIEB3YXJuaW5nIHRoaXMgaXMgY29uZnVzaW5nbHktbmFtZWQgZ2l2ZW4gdGhhdCAjREJVU19FUlJPUl9USU1FRF9PVVQgYWxzbyBleGlzdHMuIFdlIGNhbid0IGZpeAorICogaXQgZm9yIGNvbXBhdGliaWxpdHkgcmVhc29ucyBzbyBqdXN0IGJlIGNhcmVmdWwuCisgKi8KKyNkZWZpbmUgREJVU19FUlJPUl9USU1FT1VUICAgICAgICAgICAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLkRCdXMuRXJyb3IuVGltZW91dCIKKy8qKiBObyBuZXR3b3JrIGFjY2VzcyAocHJvYmFibHkgRU5FVFVOUkVBQ0ggb24gYSBzb2NrZXQpLiAqLworI2RlZmluZSBEQlVTX0VSUk9SX05PX05FVFdPUksgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5FcnJvci5Ob05ldHdvcmsiCisvKiogQ2FuJ3QgYmluZCBhIHNvY2tldCBzaW5jZSBpdHMgYWRkcmVzcyBpcyBpbiB1c2UgKGkuZS4gRUFERFJJTlVTRSkuICovCisjZGVmaW5lIERCVVNfRVJST1JfQUREUkVTU19JTl9VU0UgICAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5EQnVzLkVycm9yLkFkZHJlc3NJblVzZSIKKy8qKiBUaGUgY29ubmVjdGlvbiBpcyBkaXNjb25uZWN0ZWQgYW5kIHlvdSdyZSB0cnlpbmcgdG8gdXNlIGl0LiAqLworI2RlZmluZSBEQlVTX0VSUk9SX0RJU0NPTk5FQ1RFRCAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5FcnJvci5EaXNjb25uZWN0ZWQiCisvKiogSW52YWxpZCBhcmd1bWVudHMgcGFzc2VkIHRvIGEgbWV0aG9kIGNhbGwuICovCisjZGVmaW5lIERCVVNfRVJST1JfSU5WQUxJRF9BUkdTICAgICAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5EQnVzLkVycm9yLkludmFsaWRBcmdzIgorLyoqIE1pc3NpbmcgZmlsZS4gKi8KKyNkZWZpbmUgREJVU19FUlJPUl9GSUxFX05PVF9GT1VORCAgICAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLkRCdXMuRXJyb3IuRmlsZU5vdEZvdW5kIgorLyoqIEV4aXN0aW5nIGZpbGUgYW5kIHRoZSBvcGVyYXRpb24geW91J3JlIHVzaW5nIGRvZXMgbm90IHNpbGVudGx5IG92ZXJ3cml0ZS4gKi8KKyNkZWZpbmUgREJVU19FUlJPUl9GSUxFX0VYSVNUUyAgICAgICAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLkRCdXMuRXJyb3IuRmlsZUV4aXN0cyIKKy8qKiBNZXRob2QgbmFtZSB5b3UgaW52b2tlZCBpc24ndCBrbm93biBieSB0aGUgb2JqZWN0IHlvdSBpbnZva2VkIGl0IG9uLiAqLworI2RlZmluZSBEQlVTX0VSUk9SX1VOS05PV05fTUVUSE9EICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5FcnJvci5Vbmtub3duTWV0aG9kIgorLyoqIE9iamVjdCB5b3UgaW52b2tlZCBhIG1ldGhvZCBvbiBpc24ndCBrbm93bi4gKi8KKyNkZWZpbmUgREJVU19FUlJPUl9VTktOT1dOX09CSkVDVCAgICAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLkRCdXMuRXJyb3IuVW5rbm93bk9iamVjdCIKKy8qKiBJbnRlcmZhY2UgeW91IGludm9rZWQgYSBtZXRob2Qgb24gaXNuJ3Qga25vd24gYnkgdGhlIG9iamVjdC4gKi8KKyNkZWZpbmUgREJVU19FUlJPUl9VTktOT1dOX0lOVEVSRkFDRSAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLkRCdXMuRXJyb3IuVW5rbm93bkludGVyZmFjZSIKKy8qKiBQcm9wZXJ0eSB5b3UgdHJpZWQgdG8gYWNjZXNzIGlzbid0IGtub3duIGJ5IHRoZSBvYmplY3QuICovCisjZGVmaW5lIERCVVNfRVJST1JfVU5LTk9XTl9QUk9QRVJUWSAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5EQnVzLkVycm9yLlVua25vd25Qcm9wZXJ0eSIKKy8qKiBQcm9wZXJ0eSB5b3UgdHJpZWQgdG8gc2V0IGlzIHJlYWQtb25seS4gKi8KKyNkZWZpbmUgREJVU19FUlJPUl9QUk9QRVJUWV9SRUFEX09OTFkgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLkRCdXMuRXJyb3IuUHJvcGVydHlSZWFkT25seSIKKy8qKiBDZXJ0YWluIHRpbWVvdXQgZXJyb3JzLCBlLmcuIHdoaWxlIHN0YXJ0aW5nIGEgc2VydmljZS4KKyAqIEB3YXJuaW5nIHRoaXMgaXMgY29uZnVzaW5nbHktbmFtZWQgZ2l2ZW4gdGhhdCAjREJVU19FUlJPUl9USU1FT1VUIGFsc28gZXhpc3RzLiBXZSBjYW4ndCBmaXgKKyAqIGl0IGZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnMgc28ganVzdCBiZSBjYXJlZnVsLgorICovCisjZGVmaW5lIERCVVNfRVJST1JfVElNRURfT1VUICAgICAgICAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5EQnVzLkVycm9yLlRpbWVkT3V0IgorLyoqIFRyaWVkIHRvIHJlbW92ZSBvciBtb2RpZnkgYSBtYXRjaCBydWxlIHRoYXQgZGlkbid0IGV4aXN0LiAqLworI2RlZmluZSBEQlVTX0VSUk9SX01BVENIX1JVTEVfTk9UX0ZPVU5EICAgICAgICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5FcnJvci5NYXRjaFJ1bGVOb3RGb3VuZCIKKy8qKiBUaGUgbWF0Y2ggcnVsZSBpc24ndCBzeW50YWN0aWNhbGx5IHZhbGlkLiAqLworI2RlZmluZSBEQlVTX0VSUk9SX01BVENIX1JVTEVfSU5WQUxJRCAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5FcnJvci5NYXRjaFJ1bGVJbnZhbGlkIgorLyoqIFdoaWxlIHN0YXJ0aW5nIGEgbmV3IHByb2Nlc3MsIHRoZSBleGVjKCkgY2FsbCBmYWlsZWQuICovCisjZGVmaW5lIERCVVNfRVJST1JfU1BBV05fRVhFQ19GQUlMRUQgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5EQnVzLkVycm9yLlNwYXduLkV4ZWNGYWlsZWQiCisvKiogV2hpbGUgc3RhcnRpbmcgYSBuZXcgcHJvY2VzcywgdGhlIGZvcmsoKSBjYWxsIGZhaWxlZC4gKi8KKyNkZWZpbmUgREJVU19FUlJPUl9TUEFXTl9GT1JLX0ZBSUxFRCAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLkRCdXMuRXJyb3IuU3Bhd24uRm9ya0ZhaWxlZCIKKy8qKiBXaGlsZSBzdGFydGluZyBhIG5ldyBwcm9jZXNzLCB0aGUgY2hpbGQgZXhpdGVkIHdpdGggYSBzdGF0dXMgY29kZS4gKi8KKyNkZWZpbmUgREJVU19FUlJPUl9TUEFXTl9DSElMRF9FWElURUQgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLkRCdXMuRXJyb3IuU3Bhd24uQ2hpbGRFeGl0ZWQiCisvKiogV2hpbGUgc3RhcnRpbmcgYSBuZXcgcHJvY2VzcywgdGhlIGNoaWxkIGV4aXRlZCBvbiBhIHNpZ25hbC4gKi8KKyNkZWZpbmUgREJVU19FUlJPUl9TUEFXTl9DSElMRF9TSUdOQUxFRCAgICAgICAib3JnLmZyZWVkZXNrdG9wLkRCdXMuRXJyb3IuU3Bhd24uQ2hpbGRTaWduYWxlZCIKKy8qKiBXaGlsZSBzdGFydGluZyBhIG5ldyBwcm9jZXNzLCBzb21ldGhpbmcgd2VudCB3cm9uZy4gKi8KKyNkZWZpbmUgREJVU19FUlJPUl9TUEFXTl9GQUlMRUQgICAgICAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLkRCdXMuRXJyb3IuU3Bhd24uRmFpbGVkIgorLyoqIFdlIGZhaWxlZCB0byBzZXR1cCB0aGUgZW52aXJvbm1lbnQgY29ycmVjdGx5LiAqLworI2RlZmluZSBEQlVTX0VSUk9SX1NQQVdOX1NFVFVQX0ZBSUxFRCAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5FcnJvci5TcGF3bi5GYWlsZWRUb1NldHVwIgorLyoqIFdlIGZhaWxlZCB0byBzZXR1cCB0aGUgY29uZmlnIHBhcnNlciBjb3JyZWN0bHkuICovCisjZGVmaW5lIERCVVNfRVJST1JfU1BBV05fQ09ORklHX0lOVkFMSUQgICAgICAgIm9yZy5mcmVlZGVza3RvcC5EQnVzLkVycm9yLlNwYXduLkNvbmZpZ0ludmFsaWQiCisvKiogQnVzIG5hbWUgd2FzIG5vdCB2YWxpZC4gKi8KKyNkZWZpbmUgREJVU19FUlJPUl9TUEFXTl9TRVJWSUNFX0lOVkFMSUQgICAgICAib3JnLmZyZWVkZXNrdG9wLkRCdXMuRXJyb3IuU3Bhd24uU2VydmljZU5vdFZhbGlkIgorLyoqIFNlcnZpY2UgZmlsZSBub3QgZm91bmQgaW4gc3lzdGVtLXNlcnZpY2VzIGRpcmVjdG9yeS4gKi8KKyNkZWZpbmUgREJVU19FUlJPUl9TUEFXTl9TRVJWSUNFX05PVF9GT1VORCAgICAib3JnLmZyZWVkZXNrdG9wLkRCdXMuRXJyb3IuU3Bhd24uU2VydmljZU5vdEZvdW5kIgorLyoqIFBlcm1pc3Npb25zIGFyZSBpbmNvcnJlY3Qgb24gdGhlIHNldHVpZCBoZWxwZXIuICovCisjZGVmaW5lIERCVVNfRVJST1JfU1BBV05fUEVSTUlTU0lPTlNfSU5WQUxJRCAgIm9yZy5mcmVlZGVza3RvcC5EQnVzLkVycm9yLlNwYXduLlBlcm1pc3Npb25zSW52YWxpZCIKKy8qKiBTZXJ2aWNlIGZpbGUgaW52YWxpZCAoTmFtZSwgVXNlciBvciBFeGVjIG1pc3NpbmcpLiAqLworI2RlZmluZSBEQlVTX0VSUk9SX1NQQVdOX0ZJTEVfSU5WQUxJRCAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5FcnJvci5TcGF3bi5GaWxlSW52YWxpZCIKKy8qKiBUcmllZCB0byBnZXQgYSBVTklYIHByb2Nlc3MgSUQgYW5kIGl0IHdhc24ndCBhdmFpbGFibGUuICovCisjZGVmaW5lIERCVVNfRVJST1JfU1BBV05fTk9fTUVNT1JZICAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5EQnVzLkVycm9yLlNwYXduLk5vTWVtb3J5IgorLyoqIFRyaWVkIHRvIGdldCBhIFVOSVggcHJvY2VzcyBJRCBhbmQgaXQgd2Fzbid0IGF2YWlsYWJsZS4gKi8KKyNkZWZpbmUgREJVU19FUlJPUl9VTklYX1BST0NFU1NfSURfVU5LTk9XTiAgICAib3JnLmZyZWVkZXNrdG9wLkRCdXMuRXJyb3IuVW5peFByb2Nlc3NJZFVua25vd24iCisvKiogQSB0eXBlIHNpZ25hdHVyZSBpcyBub3QgdmFsaWQuICovCisjZGVmaW5lIERCVVNfRVJST1JfSU5WQUxJRF9TSUdOQVRVUkUgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5EQnVzLkVycm9yLkludmFsaWRTaWduYXR1cmUiCisvKiogQSBmaWxlIGNvbnRhaW5zIGludmFsaWQgc3ludGF4IG9yIGlzIG90aGVyd2lzZSBicm9rZW4uICovCisjZGVmaW5lIERCVVNfRVJST1JfSU5WQUxJRF9GSUxFX0NPTlRFTlQgICAgICAgIm9yZy5mcmVlZGVza3RvcC5EQnVzLkVycm9yLkludmFsaWRGaWxlQ29udGVudCIKKy8qKiBBc2tlZCBmb3IgU0VMaW51eCBzZWN1cml0eSBjb250ZXh0IGFuZCBpdCB3YXNuJ3QgYXZhaWxhYmxlLiAqLworI2RlZmluZSBEQlVTX0VSUk9SX1NFTElOVVhfU0VDVVJJVFlfQ09OVEVYVF9VTktOT1dOICAgICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5FcnJvci5TRUxpbnV4U2VjdXJpdHlDb250ZXh0VW5rbm93biIKKy8qKiBBc2tlZCBmb3IgQURUIGF1ZGl0IGRhdGEgYW5kIGl0IHdhc24ndCBhdmFpbGFibGUuICovCisjZGVmaW5lIERCVVNfRVJST1JfQURUX0FVRElUX0RBVEFfVU5LTk9XTiAgICAgIm9yZy5mcmVlZGVza3RvcC5EQnVzLkVycm9yLkFkdEF1ZGl0RGF0YVVua25vd24iCisvKiogVGhlcmUncyBhbHJlYWR5IGFuIG9iamVjdCB3aXRoIHRoZSByZXF1ZXN0ZWQgb2JqZWN0IHBhdGguICovCisjZGVmaW5lIERCVVNfRVJST1JfT0JKRUNUX1BBVEhfSU5fVVNFICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5EQnVzLkVycm9yLk9iamVjdFBhdGhJblVzZSIKKy8qKiBUaGUgbWVzc2FnZSBtZXRhIGRhdGEgZG9lcyBub3QgbWF0Y2ggdGhlIHBheWxvYWQuIGUuZy4gZXhwZWN0ZWQKKyAgICBudW1iZXIgb2YgZmlsZSBkZXNjcmlwdG9ycyB3ZXJlIG5vdCBzZW50IG92ZXIgdGhlIHNvY2tldCB0aGlzIG1lc3NhZ2Ugd2FzIHJlY2VpdmVkIG9uLiAqLworI2RlZmluZSBEQlVTX0VSUk9SX0lOQ09OU0lTVEVOVF9NRVNTQUdFICAgICAgICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5FcnJvci5JbmNvbnNpc3RlbnRNZXNzYWdlIgorLyoqIFRoZSBtZXNzYWdlIGlzIG5vdCBhbGxvd2VkIHdpdGhvdXQgcGVyZm9ybWluZyBpbnRlcmFjdGl2ZSBhdXRob3JpemF0aW9uLAorICogYnV0IGNvdWxkIGhhdmUgc3VjY2VlZGVkIGlmIGFuIGludGVyYWN0aXZlIGF1dGhvcml6YXRpb24gc3RlcCB3YXMKKyAqIGFsbG93ZWQuICovCisjZGVmaW5lIERCVVNfRVJST1JfSU5URVJBQ1RJVkVfQVVUSE9SSVpBVElPTl9SRVFVSVJFRCAib3JnLmZyZWVkZXNrdG9wLkRCdXMuRXJyb3IuSW50ZXJhY3RpdmVBdXRob3JpemF0aW9uUmVxdWlyZWQiCisKKy8qIFhNTCBpbnRyb3NwZWN0aW9uIGZvcm1hdCAqLworCisvKiogWE1MIG5hbWVzcGFjZSBvZiB0aGUgaW50cm9zcGVjdGlvbiBmb3JtYXQgdmVyc2lvbiAxLjAgKi8KKyNkZWZpbmUgREJVU19JTlRST1NQRUNUXzFfMF9YTUxfTkFNRVNQQUNFICAgICAgICAgImh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3N0YW5kYXJkcy9kYnVzIgorLyoqIFhNTCBwdWJsaWMgaWRlbnRpZmllciBvZiB0aGUgaW50cm9zcGVjdGlvbiBmb3JtYXQgdmVyc2lvbiAxLjAgKi8KKyNkZWZpbmUgREJVU19JTlRST1NQRUNUXzFfMF9YTUxfUFVCTElDX0lERU5USUZJRVIgIi0vL2ZyZWVkZXNrdG9wLy9EVEQgRC1CVVMgT2JqZWN0IEludHJvc3BlY3Rpb24gMS4wLy9FTiIKKy8qKiBYTUwgc3lzdGVtIGlkZW50aWZpZXIgb2YgdGhlIGludHJvc3BlY3Rpb24gZm9ybWF0IHZlcnNpb24gMS4wICovCisjZGVmaW5lIERCVVNfSU5UUk9TUEVDVF8xXzBfWE1MX1NZU1RFTV9JREVOVElGSUVSICJodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zdGFuZGFyZHMvZGJ1cy8xLjAvaW50cm9zcGVjdC5kdGQiCisvKiogWE1MIGRvY3VtZW50IHR5cGUgZGVjbGFyYXRpb24gb2YgdGhlIGludHJvc3BlY3Rpb24gZm9ybWF0IHZlcnNpb24gMS4wICovCisjZGVmaW5lIERCVVNfSU5UUk9TUEVDVF8xXzBfWE1MX0RPQ1RZUEVfREVDTF9OT0RFICI8IURPQ1RZUEUgbm9kZSBQVUJMSUMgXCIiIERCVVNfSU5UUk9TUEVDVF8xXzBfWE1MX1BVQkxJQ19JREVOVElGSUVSICJcIlxuXCIiIERCVVNfSU5UUk9TUEVDVF8xXzBfWE1MX1NZU1RFTV9JREVOVElGSUVSICJcIj5cbiIKKworLyoqIEB9ICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworI2lmIDAKK3sgLyogYXZvaWRzIGNvbmZ1c2luZyBlbWFjcyBpbmRlbnRhdGlvbiAqLworI2VuZGlmCit9CisjZW5kaWYKKworI2VuZGlmIC8qIERCVVNfUFJPVE9DT0xfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLXJlc291cmNlcy5jIGIvZGJ1cy9kYnVzLXJlc291cmNlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2MTdlYWUKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtcmVzb3VyY2VzLmMKQEAgLTAsMCArMSwzMzIgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1yZXNvdXJjZXMuYyBSZXNvdXJjZSB0cmFja2luZy9saW1pdHMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgIFJlZCBIYXQgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXJlc291cmNlcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1pbnRlcm5hbHMuaD4KKworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c1Jlc291cmNlcyBSZXNvdXJjZSBsaW1pdHMgcmVsYXRlZCBjb2RlCisgKiBAaW5ncm91cCAgREJ1c0ludGVybmFscworICogQGJyaWVmIERCdXNDb3VudGVyIGFuZCBvdGhlciBzdHVmZiByZWxhdGVkIHRvIHJlc291cmNlIGxpbWl0cworICoKKyAqIFR5cGVzIGFuZCBmdW5jdGlvbnMgcmVsYXRlZCB0byB0cmFja2luZyByZXNvdXJjZSBsaW1pdHMsCisgKiBzdWNoIGFzIHRoZSBtYXhpbXVtIGFtb3VudCBvZiBtZW1vcnkvdW5peCBmZHMgYSBjb25uZWN0aW9uIGNhbiB1c2UKKyAqIGZvciBtZXNzYWdlcywgZXRjLgorICovCisKKy8qKgorICogQGRlZmdyb3VwIERCdXNSZXNvdXJjZXNJbnRlcm5hbHMgUmVzb3VyY2UgbGltaXRzIGltcGxlbWVudGF0aW9uIGRldGFpbHMKKyAqIEBpbmdyb3VwICBEQnVzSW50ZXJuYWxzCisgKiBAYnJpZWYgUmVzb3VyY2UgbGltaXRzIGltcGxlbWVudGF0aW9uIGRldGFpbHMKKyAqCisgKiBJbXBsZW1lbnRhdGlvbiBkZXRhaWxzIG9mIHJlc291cmNlIGxpbWl0cyBjb2RlLgorICoKKyAqIEB7CisgKi8KKworLyoqCisgKiBAYnJpZWYgSW50ZXJuYWxzIG9mIERCdXNDb3VudGVyLgorICogCisgKiBEQnVzQ291bnRlciBpbnRlcm5hbHMuIERCdXNDb3VudGVyIGlzIGFuIG9wYXF1ZSBvYmplY3QsIGl0IG11c3QgYmUKKyAqIHVzZWQgdmlhIGFjY2Vzc29yIGZ1bmN0aW9ucy4KKyAqLworc3RydWN0IERCdXNDb3VudGVyCit7CisgIGludCByZWZjb3VudDsgIC8qKjwgcmVmZXJlbmNlIGNvdW50ICovCisKKyAgbG9uZyBzaXplX3ZhbHVlOyAgICAgICAvKio8IGN1cnJlbnQgc2l6ZSBjb3VudGVyIHZhbHVlICovCisgIGxvbmcgdW5peF9mZF92YWx1ZTsgICAgLyoqPCBjdXJyZW50IHVuaXggZmQgY291bnRlciB2YWx1ZSAqLworCisjaWZkZWYgREJVU19FTkFCTEVfU1RBVFMKKyAgbG9uZyBwZWFrX3NpemVfdmFsdWU7ICAgICAvKio8IGxhcmdlc3QgZXZlciBzaXplIGNvdW50ZXIgdmFsdWUgKi8KKyAgbG9uZyBwZWFrX3VuaXhfZmRfdmFsdWU7ICAvKio8IGxhcmdlc3QgZXZlciB1bml4IGZkIGNvdW50ZXIgdmFsdWUgKi8KKyNlbmRpZgorCisgIGxvbmcgbm90aWZ5X3NpemVfZ3VhcmRfdmFsdWU7ICAgIC8qKjwgY2FsbCBub3RpZnkgZnVuY3Rpb24gd2hlbiBjcm9zc2luZyB0aGlzIHNpemUgdmFsdWUgKi8KKyAgbG9uZyBub3RpZnlfdW5peF9mZF9ndWFyZF92YWx1ZTsgLyoqPCBjYWxsIG5vdGlmeSBmdW5jdGlvbiB3aGVuIGNyb3NzaW5nIHRoaXMgdW5peCBmZCB2YWx1ZSAqLworCisgIERCdXNDb3VudGVyTm90aWZ5RnVuY3Rpb24gbm90aWZ5X2Z1bmN0aW9uOyAvKio8IG5vdGlmeSBmdW5jdGlvbiAqLworICB2b2lkICpub3RpZnlfZGF0YTsgLyoqPCBkYXRhIGZvciBub3RpZnkgZnVuY3Rpb24gKi8KKyAgZGJ1c19ib29sX3Qgbm90aWZ5X3BlbmRpbmcgOiAxOyAvKio8IFRSVUUgaWYgdGhlIGd1YXJkIHZhbHVlIGhhcyBiZWVuIGNyb3NzZWQgKi8KKyAgREJ1c1JNdXRleCAqbXV0ZXg7ICAgIC8qKjwgTG9jayBvbiB0aGUgZW50aXJlIERCdXNDb3VudGVyICovCit9OworCisvKiogQH0gKi8gIC8qIGVuZCBvZiByZXNvdXJjZSBsaW1pdHMgaW50ZXJuYWxzIGRvY3MgKi8KKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzUmVzb3VyY2VzCisgKiBAeworICovCisKKy8qKgorICogQ3JlYXRlcyBhIG5ldyBEQnVzQ291bnRlci4gREJ1c0NvdW50ZXIgaXMgdXNlZAorICogdG8gY291bnQgdXNhZ2Ugb2Ygc29tZSByZXNvdXJjZSBzdWNoIGFzIG1lbW9yeS4KKyAqCisgKiBAcmV0dXJucyBuZXcgY291bnRlciBvciAjTlVMTCBvbiBmYWlsdXJlCisgKi8KK0RCdXNDb3VudGVyKgorX2RidXNfY291bnRlcl9uZXcgKHZvaWQpCit7CisgIERCdXNDb3VudGVyICpjb3VudGVyOworCisgIGNvdW50ZXIgPSBkYnVzX25ldzAgKERCdXNDb3VudGVyLCAxKTsKKyAgaWYgKGNvdW50ZXIgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBjb3VudGVyLT5yZWZjb3VudCA9IDE7CisKKyAgX2RidXNfcm11dGV4X25ld19hdF9sb2NhdGlvbiAoJmNvdW50ZXItPm11dGV4KTsKKyAgaWYgKGNvdW50ZXItPm11dGV4ID09IE5VTEwpCisgIHsKKyAgICBkYnVzX2ZyZWUgKGNvdW50ZXIpOworICAgIGNvdW50ZXIgPSBOVUxMOworICB9CisKKyAgcmV0dXJuIGNvdW50ZXI7Cit9CisKKy8qKgorICogSW5jcmVtZW50cyByZWZjb3VudCBvZiB0aGUgY291bnRlcgorICoKKyAqIEBwYXJhbSBjb3VudGVyIHRoZSBjb3VudGVyCisgKiBAcmV0dXJucyB0aGUgY291bnRlcgorICovCitEQnVzQ291bnRlciAqCitfZGJ1c19jb3VudGVyX3JlZiAoREJ1c0NvdW50ZXIgKmNvdW50ZXIpCit7CisgIF9kYnVzX3JtdXRleF9sb2NrIChjb3VudGVyLT5tdXRleCk7CisKKyAgX2RidXNfYXNzZXJ0IChjb3VudGVyLT5yZWZjb3VudCA+IDApOworICAKKyAgY291bnRlci0+cmVmY291bnQgKz0gMTsKKworICBfZGJ1c19ybXV0ZXhfdW5sb2NrIChjb3VudGVyLT5tdXRleCk7CisKKyAgcmV0dXJuIGNvdW50ZXI7Cit9CisKKy8qKgorICogRGVjcmVtZW50cyByZWZjb3VudCBvZiB0aGUgY291bnRlciBhbmQgcG9zc2libHkKKyAqIGZpbmFsaXplcyB0aGUgY291bnRlci4KKyAqCisgKiBAcGFyYW0gY291bnRlciB0aGUgY291bnRlcgorICovCit2b2lkCitfZGJ1c19jb3VudGVyX3VucmVmIChEQnVzQ291bnRlciAqY291bnRlcikKK3sKKyAgZGJ1c19ib29sX3QgbGFzdF9yZWYgPSBGQUxTRTsKKworICBfZGJ1c19ybXV0ZXhfbG9jayAoY291bnRlci0+bXV0ZXgpOworCisgIF9kYnVzX2Fzc2VydCAoY291bnRlci0+cmVmY291bnQgPiAwKTsKKworICBjb3VudGVyLT5yZWZjb3VudCAtPSAxOworICBsYXN0X3JlZiA9IChjb3VudGVyLT5yZWZjb3VudCA9PSAwKTsKKworICBfZGJ1c19ybXV0ZXhfdW5sb2NrIChjb3VudGVyLT5tdXRleCk7CisKKyAgaWYgKGxhc3RfcmVmKQorICAgIHsKKyAgICAgIF9kYnVzX3JtdXRleF9mcmVlX2F0X2xvY2F0aW9uICgmY291bnRlci0+bXV0ZXgpOworICAgICAgZGJ1c19mcmVlIChjb3VudGVyKTsKKyAgICB9Cit9CisKKy8qKgorICogQWRqdXN0cyB0aGUgdmFsdWUgb2YgdGhlIHNpemUgY291bnRlciBieSB0aGUgZ2l2ZW4KKyAqIGRlbHRhIHdoaWNoIG1heSBiZSBwb3NpdGl2ZSBvciBuZWdhdGl2ZS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIG1heSBiZSBjYWxsZWQgd2l0aCBsb2NrcyBoZWxkLiBBZnRlciBjYWxsaW5nIGl0LCB3aGVuCisgKiBhbnkgcmVsZXZhbnQgbG9ja3MgYXJlIG5vIGxvbmdlciBoZWxkIHlvdSBtdXN0IGNhbGwgX2RidXNfY291bnRlcl9ub3RpZnkoKS4KKyAqCisgKiBAcGFyYW0gY291bnRlciB0aGUgY291bnRlcgorICogQHBhcmFtIGRlbHRhIHZhbHVlIHRvIGFkZCB0byB0aGUgc2l6ZSBjb3VudGVyJ3MgY3VycmVudCB2YWx1ZQorICovCit2b2lkCitfZGJ1c19jb3VudGVyX2FkanVzdF9zaXplIChEQnVzQ291bnRlciAqY291bnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgICAgICAgICBkZWx0YSkKK3sKKyAgbG9uZyBvbGQgPSAwOworCisgIF9kYnVzX3JtdXRleF9sb2NrIChjb3VudGVyLT5tdXRleCk7CisKKyAgb2xkID0gY291bnRlci0+c2l6ZV92YWx1ZTsKKworICBjb3VudGVyLT5zaXplX3ZhbHVlICs9IGRlbHRhOworCisjaWZkZWYgREJVU19FTkFCTEVfU1RBVFMKKyAgaWYgKGNvdW50ZXItPnBlYWtfc2l6ZV92YWx1ZSA8IGNvdW50ZXItPnNpemVfdmFsdWUpCisgICAgY291bnRlci0+cGVha19zaXplX3ZhbHVlID0gY291bnRlci0+c2l6ZV92YWx1ZTsKKyNlbmRpZgorCisjaWYgMAorICBfZGJ1c192ZXJib3NlICgiQWRqdXN0aW5nIGNvdW50ZXIgJWxkIGJ5ICVsZCA9ICVsZFxuIiwKKyAgICAgICAgICAgICAgICAgb2xkLCBkZWx0YSwgY291bnRlci0+c2l6ZV92YWx1ZSk7CisjZW5kaWYKKworICBpZiAoY291bnRlci0+bm90aWZ5X2Z1bmN0aW9uICE9IE5VTEwgJiYKKyAgICAgICgob2xkIDwgY291bnRlci0+bm90aWZ5X3NpemVfZ3VhcmRfdmFsdWUgJiYKKyAgICAgICAgY291bnRlci0+c2l6ZV92YWx1ZSA+PSBjb3VudGVyLT5ub3RpZnlfc2l6ZV9ndWFyZF92YWx1ZSkgfHwKKyAgICAgICAob2xkID49IGNvdW50ZXItPm5vdGlmeV9zaXplX2d1YXJkX3ZhbHVlICYmCisgICAgICAgIGNvdW50ZXItPnNpemVfdmFsdWUgPCBjb3VudGVyLT5ub3RpZnlfc2l6ZV9ndWFyZF92YWx1ZSkpKQorICAgIGNvdW50ZXItPm5vdGlmeV9wZW5kaW5nID0gVFJVRTsKKworICBfZGJ1c19ybXV0ZXhfdW5sb2NrIChjb3VudGVyLT5tdXRleCk7Cit9CisKKy8qKgorICogQ2FsbHMgdGhlIG5vdGlmeSBmdW5jdGlvbiBmcm9tIF9kYnVzX2NvdW50ZXJfc2V0X25vdGlmeSgpLAorICogaWYgdGhhdCBmdW5jdGlvbiBoYXMgYmVlbiBzcGVjaWZpZWQgYW5kIHRoZSBjb3VudGVyIGhhcyBjcm9zc2VkIHRoZQorICogZ3VhcmQgdmFsdWUgKGluIGVpdGhlciBkaXJlY3Rpb24pIHNpbmNlIHRoZSBsYXN0IGNhbGwgdG8gdGhpcyBmdW5jdGlvbi4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIG11c3Qgbm90IGJlIGNhbGxlZCB3aXRoIGxvY2tzIGhlbGQsIHNpbmNlIGl0IGNhbiBjYWxsIG91dAorICogdG8gdXNlciBjb2RlLgorICovCit2b2lkCitfZGJ1c19jb3VudGVyX25vdGlmeSAoREJ1c0NvdW50ZXIgKmNvdW50ZXIpCit7CisgIERCdXNDb3VudGVyTm90aWZ5RnVuY3Rpb24gbm90aWZ5X2Z1bmN0aW9uID0gTlVMTDsKKyAgdm9pZCAqbm90aWZ5X2RhdGEgPSBOVUxMOworCisgIF9kYnVzX3JtdXRleF9sb2NrIChjb3VudGVyLT5tdXRleCk7CisgIGlmIChjb3VudGVyLT5ub3RpZnlfcGVuZGluZykKKyAgICB7CisgICAgICBjb3VudGVyLT5ub3RpZnlfcGVuZGluZyA9IEZBTFNFOworICAgICAgbm90aWZ5X2Z1bmN0aW9uID0gY291bnRlci0+bm90aWZ5X2Z1bmN0aW9uOworICAgICAgbm90aWZ5X2RhdGEgPSBjb3VudGVyLT5ub3RpZnlfZGF0YTsKKyAgICB9CisgIF9kYnVzX3JtdXRleF91bmxvY2sgKGNvdW50ZXItPm11dGV4KTsKKworICBpZiAobm90aWZ5X2Z1bmN0aW9uICE9IE5VTEwpCisgICAgKCogbm90aWZ5X2Z1bmN0aW9uKSAoY291bnRlciwgbm90aWZ5X2RhdGEpOworfQorCisvKioKKyAqIEFkanVzdHMgdGhlIHZhbHVlIG9mIHRoZSB1bml4IGZkIGNvdW50ZXIgYnkgdGhlIGdpdmVuCisgKiBkZWx0YSB3aGljaCBtYXkgYmUgcG9zaXRpdmUgb3IgbmVnYXRpdmUuCisgKgorICogVGhpcyBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIHdpdGggbG9ja3MgaGVsZC4gQWZ0ZXIgY2FsbGluZyBpdCwgd2hlbgorICogYW55IHJlbGV2YW50IGxvY2tzIGFyZSBubyBsb25nZXIgaGVsZCB5b3UgbXVzdCBjYWxsIF9kYnVzX2NvdW50ZXJfbm90aWZ5KCkuCisgKgorICogQHBhcmFtIGNvdW50ZXIgdGhlIGNvdW50ZXIKKyAqIEBwYXJhbSBkZWx0YSB2YWx1ZSB0byBhZGQgdG8gdGhlIHVuaXggZmRzIGNvdW50ZXIncyBjdXJyZW50IHZhbHVlCisgKi8KK3ZvaWQKK19kYnVzX2NvdW50ZXJfYWRqdXN0X3VuaXhfZmQgKERCdXNDb3VudGVyICpjb3VudGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyAgICAgICAgIGRlbHRhKQoreworICBsb25nIG9sZCA9IDA7CisKKyAgX2RidXNfcm11dGV4X2xvY2sgKGNvdW50ZXItPm11dGV4KTsKKworICBvbGQgPSBjb3VudGVyLT51bml4X2ZkX3ZhbHVlOworICAKKyAgY291bnRlci0+dW5peF9mZF92YWx1ZSArPSBkZWx0YTsKKworI2lmZGVmIERCVVNfRU5BQkxFX1NUQVRTCisgIGlmIChjb3VudGVyLT5wZWFrX3VuaXhfZmRfdmFsdWUgPCBjb3VudGVyLT51bml4X2ZkX3ZhbHVlKQorICAgIGNvdW50ZXItPnBlYWtfdW5peF9mZF92YWx1ZSA9IGNvdW50ZXItPnVuaXhfZmRfdmFsdWU7CisjZW5kaWYKKworI2lmIDAKKyAgX2RidXNfdmVyYm9zZSAoIkFkanVzdGluZyBjb3VudGVyICVsZCBieSAlbGQgPSAlbGRcbiIsCisgICAgICAgICAgICAgICAgIG9sZCwgZGVsdGEsIGNvdW50ZXItPnVuaXhfZmRfdmFsdWUpOworI2VuZGlmCisgIAorICBpZiAoY291bnRlci0+bm90aWZ5X2Z1bmN0aW9uICE9IE5VTEwgJiYKKyAgICAgICgob2xkIDwgY291bnRlci0+bm90aWZ5X3VuaXhfZmRfZ3VhcmRfdmFsdWUgJiYKKyAgICAgICAgY291bnRlci0+dW5peF9mZF92YWx1ZSA+PSBjb3VudGVyLT5ub3RpZnlfdW5peF9mZF9ndWFyZF92YWx1ZSkgfHwKKyAgICAgICAob2xkID49IGNvdW50ZXItPm5vdGlmeV91bml4X2ZkX2d1YXJkX3ZhbHVlICYmCisgICAgICAgIGNvdW50ZXItPnVuaXhfZmRfdmFsdWUgPCBjb3VudGVyLT5ub3RpZnlfdW5peF9mZF9ndWFyZF92YWx1ZSkpKQorICAgIGNvdW50ZXItPm5vdGlmeV9wZW5kaW5nID0gVFJVRTsKKworICBfZGJ1c19ybXV0ZXhfdW5sb2NrIChjb3VudGVyLT5tdXRleCk7Cit9CisKKy8qKgorICogR2V0cyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgc2l6ZSBjb3VudGVyLgorICoKKyAqIEBwYXJhbSBjb3VudGVyIHRoZSBjb3VudGVyCisgKiBAcmV0dXJucyBpdHMgY3VycmVudCBzaXplIHZhbHVlCisgKi8KK2xvbmcKK19kYnVzX2NvdW50ZXJfZ2V0X3NpemVfdmFsdWUgKERCdXNDb3VudGVyICpjb3VudGVyKQoreworICByZXR1cm4gY291bnRlci0+c2l6ZV92YWx1ZTsKK30KKworLyoqCisgKiBHZXRzIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSB1bml4IGZkIGNvdW50ZXIuCisgKgorICogQHBhcmFtIGNvdW50ZXIgdGhlIGNvdW50ZXIKKyAqIEByZXR1cm5zIGl0cyBjdXJyZW50IHVuaXggZmQgdmFsdWUKKyAqLworbG9uZworX2RidXNfY291bnRlcl9nZXRfdW5peF9mZF92YWx1ZSAoREJ1c0NvdW50ZXIgKmNvdW50ZXIpCit7CisgIHJldHVybiBjb3VudGVyLT51bml4X2ZkX3ZhbHVlOworfQorCisvKioKKyAqIFNldHMgdGhlIG5vdGlmeSBmdW5jdGlvbiBmb3IgdGhpcyBjb3VudGVyOyB0aGUgbm90aWZ5IGZ1bmN0aW9uIGlzCisgKiBjYWxsZWQgd2hlbmV2ZXIgdGhlIGNvdW50ZXIncyB2YWx1ZXMgY3Jvc3MgdGhlIGd1YXJkIHZhbHVlcyBpbgorICogZWl0aGVyIGRpcmVjdGlvbiAobW92aW5nIHVwLCBvciBtb3ZpbmcgZG93bikuCisgKgorICogQHBhcmFtIGNvdW50ZXIgdGhlIGNvdW50ZXIKKyAqIEBwYXJhbSBzaXplX2d1YXJkX3ZhbHVlIHRoZSB2YWx1ZSB3ZSdyZSBub3RpZmllZCBpZiB0aGUgc2l6ZSBjb3VudGVyIGNyb3NzZXMKKyAqIEBwYXJhbSB1bml4X2ZkX2d1YXJkX3ZhbHVlIHRoZSB2YWx1ZSB3ZSdyZSBub3RpZmllZCBpZiB0aGUgdW5peCBmZCBjb3VudGVyIGNyb3NzZXMKKyAqIEBwYXJhbSBmdW5jdGlvbiBmdW5jdGlvbiB0byBjYWxsIGluIG9yZGVyIHRvIG5vdGlmeQorICogQHBhcmFtIHVzZXJfZGF0YSBkYXRhIHRvIHBhc3MgdG8gdGhlIGZ1bmN0aW9uCisgKi8KK3ZvaWQKK19kYnVzX2NvdW50ZXJfc2V0X25vdGlmeSAoREJ1c0NvdW50ZXIgICAgICAgICAgICAgICAqY291bnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV9ndWFyZF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyAgICAgICAgICAgICAgICAgICAgICAgdW5peF9mZF9ndWFyZF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0NvdW50ZXJOb3RpZnlGdW5jdGlvbiAgZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgKnVzZXJfZGF0YSkKK3sKKyAgX2RidXNfcm11dGV4X2xvY2sgKGNvdW50ZXItPm11dGV4KTsKKyAgY291bnRlci0+bm90aWZ5X3NpemVfZ3VhcmRfdmFsdWUgPSBzaXplX2d1YXJkX3ZhbHVlOworICBjb3VudGVyLT5ub3RpZnlfdW5peF9mZF9ndWFyZF92YWx1ZSA9IHVuaXhfZmRfZ3VhcmRfdmFsdWU7CisgIGNvdW50ZXItPm5vdGlmeV9mdW5jdGlvbiA9IGZ1bmN0aW9uOworICBjb3VudGVyLT5ub3RpZnlfZGF0YSA9IHVzZXJfZGF0YTsKKyAgY291bnRlci0+bm90aWZ5X3BlbmRpbmcgPSBGQUxTRTsKKyAgX2RidXNfcm11dGV4X3VubG9jayAoY291bnRlci0+bXV0ZXgpOworfQorCisjaWZkZWYgREJVU19FTkFCTEVfU1RBVFMKK2xvbmcKK19kYnVzX2NvdW50ZXJfZ2V0X3BlYWtfc2l6ZV92YWx1ZSAoREJ1c0NvdW50ZXIgKmNvdW50ZXIpCit7CisgIHJldHVybiBjb3VudGVyLT5wZWFrX3NpemVfdmFsdWU7Cit9CisKK2xvbmcKK19kYnVzX2NvdW50ZXJfZ2V0X3BlYWtfdW5peF9mZF92YWx1ZSAoREJ1c0NvdW50ZXIgKmNvdW50ZXIpCit7CisgIHJldHVybiBjb3VudGVyLT5wZWFrX3VuaXhfZmRfdmFsdWU7Cit9CisjZW5kaWYKKworLyoqIEB9ICovICAvKiBlbmQgb2YgcmVzb3VyY2UgbGltaXRzIGV4cG9ydGVkIEFQSSAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLXJlc291cmNlcy5oIGIvZGJ1cy9kYnVzLXJlc291cmNlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4MWE1NzUKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtcmVzb3VyY2VzLmgKQEAgLTAsMCArMSw2MSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXJlc291cmNlcy5oIFJlc291cmNlIHRyYWNraW5nL2xpbWl0cworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaWZuZGVmIERCVVNfUkVTT1VSQ0VTX0gKKyNkZWZpbmUgREJVU19SRVNPVVJDRVNfSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLW1hY3Jvcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1lcnJvcnMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtY29ubmVjdGlvbi5oPgorCitEQlVTX0JFR0lOX0RFQ0xTCisKK3R5cGVkZWYgc3RydWN0IERCdXNDb3VudGVyIERCdXNDb3VudGVyOworCit0eXBlZGVmIHZvaWQgKCogREJ1c0NvdW50ZXJOb3RpZnlGdW5jdGlvbikgKERCdXNDb3VudGVyICpjb3VudGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAqdXNlcl9kYXRhKTsKKworREJ1c0NvdW50ZXIqIF9kYnVzX2NvdW50ZXJfbmV3ICAgICAgICh2b2lkKTsKK0RCdXNDb3VudGVyKiBfZGJ1c19jb3VudGVyX3JlZiAgICAgICAoREJ1c0NvdW50ZXIgKmNvdW50ZXIpOwordm9pZCAgICAgICAgIF9kYnVzX2NvdW50ZXJfdW5yZWYgICAgIChEQnVzQ291bnRlciAqY291bnRlcik7CisKK3ZvaWQgICAgICAgICBfZGJ1c19jb3VudGVyX2FkanVzdF9zaXplICAgICAgIChEQnVzQ291bnRlciAqY291bnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nICAgICAgICAgZGVsdGEpOwordm9pZCAgICAgICAgIF9kYnVzX2NvdW50ZXJfYWRqdXN0X3VuaXhfZmQgICAgKERCdXNDb3VudGVyICpjb3VudGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgICAgICAgICBkZWx0YSk7Cit2b2lkICAgICAgICAgX2RidXNfY291bnRlcl9ub3RpZnkgICAgICAgICAgICAoREJ1c0NvdW50ZXIgKmNvdW50ZXIpOworbG9uZyAgICAgICAgIF9kYnVzX2NvdW50ZXJfZ2V0X3NpemVfdmFsdWUgICAgKERCdXNDb3VudGVyICpjb3VudGVyKTsKK2xvbmcgICAgICAgICBfZGJ1c19jb3VudGVyX2dldF91bml4X2ZkX3ZhbHVlIChEQnVzQ291bnRlciAqY291bnRlcik7CisKK3ZvaWQgX2RidXNfY291bnRlcl9zZXRfbm90aWZ5ICAgIChEQnVzQ291bnRlciAgICAgICAgICAgICAgICpjb3VudGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgICAgICAgICAgICAgICAgICAgICAgIHNpemVfZ3VhcmRfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyAgICAgICAgICAgICAgICAgICAgICAgdW5peF9mZF9ndWFyZF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ291bnRlck5vdGlmeUZ1bmN0aW9uICBmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICp1c2VyX2RhdGEpOworCisvKiBpZiBEQlVTX0VOQUJMRV9TVEFUUyAqLworbG9uZyBfZGJ1c19jb3VudGVyX2dldF9wZWFrX3NpemVfdmFsdWUgICAgKERCdXNDb3VudGVyICpjb3VudGVyKTsKK2xvbmcgX2RidXNfY291bnRlcl9nZXRfcGVha191bml4X2ZkX3ZhbHVlIChEQnVzQ291bnRlciAqY291bnRlcik7CisKK0RCVVNfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBEQlVTX1JFU09VUkNFU19IICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtc2VydmVyLWRlYnVnLXBpcGUuYyBiL2RidXMvZGJ1cy1zZXJ2ZXItZGVidWctcGlwZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMGJlODcKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtc2VydmVyLWRlYnVnLXBpcGUuYwpAQCAtMCwwICsxLDQzMiBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXNlcnZlci1kZWJ1Zy1waXBlLmMgSW4tcHJvYyBkZWJ1ZyBzZXJ2ZXIgaW1wbGVtZW50YXRpb24gCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzICBDb2RlRmFjdG9yeSBBQgorICogQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0ICBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLWludGVybmFscy5oIgorI2luY2x1ZGUgImRidXMtc2VydmVyLWRlYnVnLXBpcGUuaCIKKyNpbmNsdWRlICJkYnVzLXRyYW5zcG9ydC1zb2NrZXQuaCIKKyNpbmNsdWRlICJkYnVzLWNvbm5lY3Rpb24taW50ZXJuYWwuaCIKKyNpbmNsdWRlICJkYnVzLWhhc2guaCIKKyNpbmNsdWRlICJkYnVzLXN0cmluZy5oIgorI2luY2x1ZGUgImRidXMtcHJvdG9jb2wuaCIKKworI2lmZGVmIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTCisKKy8qKgorICogQGRlZmdyb3VwIERCdXNTZXJ2ZXJEZWJ1Z1BpcGUgREJ1c1NlcnZlckRlYnVnUGlwZQorICogQGluZ3JvdXAgIERCdXNJbnRlcm5hbHMKKyAqIEBicmllZiBJbi1wcm9jZXNzIHBpcGUgZGVidWcgc2VydmVyIHVzZWQgaW4gdW5pdCB0ZXN0cy4KKyAqCisgKiBUeXBlcyBhbmQgZnVuY3Rpb25zIHJlbGF0ZWQgdG8gREJ1c1NlcnZlckRlYnVnUGlwZS4KKyAqIFRoaXMgaXMgdXNlZCBmb3IgdW5pdCB0ZXN0aW5nLgorICoKKyAqIEB7CisgKi8KKworLyoqCisgKiBPcGFxdWUgb2JqZWN0IHJlcHJlc2VudGluZyBhIGRlYnVnIHNlcnZlciBpbXBsZW1lbnRhdGlvbi4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgREJ1c1NlcnZlckRlYnVnUGlwZSBEQnVzU2VydmVyRGVidWdQaXBlOworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIGRldGFpbHMgb2YgREJ1c1NlcnZlckRlYnVnUGlwZS4gQWxsIG1lbWJlcnMKKyAqIGFyZSBwcml2YXRlLgorICovCitzdHJ1Y3QgREJ1c1NlcnZlckRlYnVnUGlwZQoreworICBEQnVzU2VydmVyIGJhc2U7ICAvKio8IFBhcmVudCBjbGFzcyBtZW1iZXJzLiAqLworCisgIGNoYXIgKm5hbWU7IC8qKjwgU2VydmVyIG5hbWUuICovCisKKyAgZGJ1c19ib29sX3QgZGlzY29ubmVjdGVkOyAvKio8IFRSVUUgaWYgZGlzY29ubmVjdCBoYXMgYmVlbiBjYWxsZWQgKi8KK307CisKKy8qIEZJWE1FIG5vdCB0aHJlYWRzYWZlIChyaWdodCBub3cgdGhlIHRlc3Qgc3VpdGUgZG9lc24ndCB1c2UgdGhyZWFkcyBhbnlob3cgKSAqLworc3RhdGljIERCdXNIYXNoVGFibGUgKnNlcnZlcl9waXBlX2hhc2g7CitzdGF0aWMgaW50IHNlcnZlcl9waXBlX2hhc2hfcmVmY291bnQgPSAwOworCitzdGF0aWMgZGJ1c19ib29sX3QKK3BpcGVfaGFzaF9yZWYgKHZvaWQpCit7CisgIGlmICghc2VydmVyX3BpcGVfaGFzaCkKKyAgICB7CisgICAgICBfZGJ1c19hc3NlcnQgKHNlcnZlcl9waXBlX2hhc2hfcmVmY291bnQgPT0gMCk7CisgICAgICAKKyAgICAgIHNlcnZlcl9waXBlX2hhc2ggPSBfZGJ1c19oYXNoX3RhYmxlX25ldyAoREJVU19IQVNIX1NUUklORywgTlVMTCwgTlVMTCk7CisKKyAgICAgIGlmICghc2VydmVyX3BpcGVfaGFzaCkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBzZXJ2ZXJfcGlwZV9oYXNoX3JlZmNvdW50ID0gMTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK3BpcGVfaGFzaF91bnJlZiAodm9pZCkKK3sKKyAgX2RidXNfYXNzZXJ0IChzZXJ2ZXJfcGlwZV9oYXNoICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKHNlcnZlcl9waXBlX2hhc2hfcmVmY291bnQgPiAwKTsKKworICBzZXJ2ZXJfcGlwZV9oYXNoX3JlZmNvdW50IC09IDE7CisgIGlmIChzZXJ2ZXJfcGlwZV9oYXNoX3JlZmNvdW50ID09IDApCisgICAgeworICAgICAgX2RidXNfaGFzaF90YWJsZV91bnJlZiAoc2VydmVyX3BpcGVfaGFzaCk7CisgICAgICBzZXJ2ZXJfcGlwZV9oYXNoID0gTlVMTDsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitkZWJ1Z19maW5hbGl6ZSAoREJ1c1NlcnZlciAqc2VydmVyKQoreworICBEQnVzU2VydmVyRGVidWdQaXBlICpkZWJ1Z19zZXJ2ZXIgPSAoREJ1c1NlcnZlckRlYnVnUGlwZSopIHNlcnZlcjsKKworICBwaXBlX2hhc2hfdW5yZWYgKCk7CisgIAorICBfZGJ1c19zZXJ2ZXJfZmluYWxpemVfYmFzZSAoc2VydmVyKTsKKworICBkYnVzX2ZyZWUgKGRlYnVnX3NlcnZlci0+bmFtZSk7CisgIGRidXNfZnJlZSAoc2VydmVyKTsKK30KKworc3RhdGljIHZvaWQKK2RlYnVnX2Rpc2Nvbm5lY3QgKERCdXNTZXJ2ZXIgKnNlcnZlcikKK3sKKyAgKChEQnVzU2VydmVyRGVidWdQaXBlKilzZXJ2ZXIpLT5kaXNjb25uZWN0ZWQgPSBUUlVFOworfQorCitzdGF0aWMgREJ1c1NlcnZlclZUYWJsZSBkZWJ1Z192dGFibGUgPSB7CisgIGRlYnVnX2ZpbmFsaXplLAorICBkZWJ1Z19kaXNjb25uZWN0Cit9OworCisvKioKKyAqIENyZWF0ZXMgYSBuZXcgZGVidWcgc2VydmVyIHVzaW5nIGFuIGluLXByb2Nlc3MgcGlwZQorICoKKyAqIEBwYXJhbSBzZXJ2ZXJfbmFtZSB0aGUgbmFtZSBvZiB0aGUgc2VydmVyLgorICogQHBhcmFtIGVycm9yIGFkZHJlc3Mgd2hlcmUgYW4gZXJyb3IgY2FuIGJlIHJldHVybmVkLgorICogQHJldHVybnMgYSBuZXcgc2VydmVyLCBvciAjTlVMTCBvbiBmYWlsdXJlLgorICovCitEQnVzU2VydmVyKgorX2RidXNfc2VydmVyX2RlYnVnX3BpcGVfbmV3IChjb25zdCBjaGFyICAgICAqc2VydmVyX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgREJ1c1NlcnZlckRlYnVnUGlwZSAqZGVidWdfc2VydmVyOworICBEQnVzU3RyaW5nIGFkZHJlc3M7CisgIERCdXNTdHJpbmcgbmFtZV9zdHI7CisgIAorICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgCisgIGlmICghcGlwZV9oYXNoX3JlZiAoKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgCisgIGlmIChfZGJ1c19oYXNoX3RhYmxlX2xvb2t1cF9zdHJpbmcgKHNlcnZlcl9waXBlX2hhc2gsIHNlcnZlcl9uYW1lKSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9BRERSRVNTX0lOX1VTRSwgTlVMTCk7CisgICAgICBwaXBlX2hhc2hfdW5yZWYgKCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIAorICBkZWJ1Z19zZXJ2ZXIgPSBkYnVzX25ldzAgKERCdXNTZXJ2ZXJEZWJ1Z1BpcGUsIDEpOworICBpZiAoZGVidWdfc2VydmVyID09IE5VTEwpCisgICAgZ290byBub21lbV8wOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZhZGRyZXNzKSkKKyAgICBnb3RvIG5vbWVtXzE7CisKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZuYW1lX3N0ciwgc2VydmVyX25hbWUpOworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhZGRyZXNzLCAiZGVidWctcGlwZTpuYW1lPSIpIHx8CisgICAgICAhX2RidXNfYWRkcmVzc19hcHBlbmRfZXNjYXBlZCAoJmFkZHJlc3MsICZuYW1lX3N0cikpCisgICAgZ290byBub21lbV8yOworICAKKyAgZGVidWdfc2VydmVyLT5uYW1lID0gX2RidXNfc3RyZHVwIChzZXJ2ZXJfbmFtZSk7CisgIGlmIChkZWJ1Z19zZXJ2ZXItPm5hbWUgPT0gTlVMTCkKKyAgICBnb3RvIG5vbWVtXzI7CisgIAorICBpZiAoIV9kYnVzX3NlcnZlcl9pbml0X2Jhc2UgKCZkZWJ1Z19zZXJ2ZXItPmJhc2UsCisJCQkgICAgICAgJmRlYnVnX3Z0YWJsZSwgJmFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKQorICAgIGdvdG8gZmFpbF8zOworCisgIGlmICghX2RidXNfaGFzaF90YWJsZV9pbnNlcnRfc3RyaW5nIChzZXJ2ZXJfcGlwZV9oYXNoLAorCQkJCSAgICAgICBkZWJ1Z19zZXJ2ZXItPm5hbWUsCisJCQkJICAgICAgIGRlYnVnX3NlcnZlcikpCisgICAgZ290byBub21lbV80OworCisgIF9kYnVzX3N0cmluZ19mcmVlICgmYWRkcmVzcyk7CisKKyAgLyogc2VydmVyIGtlZXBzIHRoZSBwaXBlIGhhc2ggcmVmICovCisKKyAgX2RidXNfc2VydmVyX3RyYWNlX3JlZiAoJmRlYnVnX3NlcnZlci0+YmFzZSwgMCwgMSwgImRlYnVnX3BpcGVfbmV3Iik7CisgIHJldHVybiAoREJ1c1NlcnZlciAqKWRlYnVnX3NlcnZlcjsKKworIG5vbWVtXzQ6CisgIF9kYnVzX3NlcnZlcl9maW5hbGl6ZV9iYXNlICgmZGVidWdfc2VydmVyLT5iYXNlKTsKKyBmYWlsXzM6CisgIGRidXNfZnJlZSAoZGVidWdfc2VydmVyLT5uYW1lKTsKKyBub21lbV8yOgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJmFkZHJlc3MpOworIG5vbWVtXzE6CisgIGRidXNfZnJlZSAoZGVidWdfc2VydmVyKTsKKyBub21lbV8wOgorICBwaXBlX2hhc2hfdW5yZWYgKCk7CisgIGlmIChlcnJvciAhPSBOVUxMICYmICFkYnVzX2Vycm9yX2lzX3NldCAoZXJyb3IpKQorICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogQ3JlYXRlcyB0aGUgY2xpZW50LXNpZGUgdHJhbnNwb3J0IGZvcgorICogYSBkZWJ1Zy1waXBlIGNvbm5lY3Rpb24gY29ubmVjdGVkIHRvIHRoZQorICogZ2l2ZW4gZGVidWctcGlwZSBzZXJ2ZXIgbmFtZS4KKyAqIAorICogQHBhcmFtIHNlcnZlcl9uYW1lIG5hbWUgb2Ygc2VydmVyIHRvIGNvbm5lY3QgdG8KKyAqIEBwYXJhbSBlcnJvciBhZGRyZXNzIHdoZXJlIGFuIGVycm9yIGNhbiBiZSByZXR1cm5lZC4KKyAqIEByZXR1cm5zICNOVUxMIG9uIG5vIG1lbW9yeSBvciB0cmFuc3BvcnQKKyAqLworREJ1c1RyYW5zcG9ydCoKK19kYnVzX3RyYW5zcG9ydF9kZWJ1Z19waXBlX25ldyAoY29uc3QgY2hhciAgICAgKnNlcnZlcl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIERCdXNUcmFuc3BvcnQgKmNsaWVudF90cmFuc3BvcnQ7CisgIERCdXNUcmFuc3BvcnQgKnNlcnZlcl90cmFuc3BvcnQ7CisgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uOworICBEQnVzU29ja2V0IGNsaWVudF9mZCwgc2VydmVyX2ZkOworICBEQnVzU2VydmVyICpzZXJ2ZXI7CisgIERCdXNTdHJpbmcgYWRkcmVzczsKKyAgCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIGlmIChzZXJ2ZXJfcGlwZV9oYXNoID09IE5VTEwpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX1NFUlZFUiwgTlVMTCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIAorICBzZXJ2ZXIgPSBfZGJ1c19oYXNoX3RhYmxlX2xvb2t1cF9zdHJpbmcgKHNlcnZlcl9waXBlX2hhc2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyX25hbWUpOworICBpZiAoc2VydmVyID09IE5VTEwgfHwKKyAgICAgICgoREJ1c1NlcnZlckRlYnVnUGlwZSopc2VydmVyKS0+ZGlzY29ubmVjdGVkKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19TRVJWRVIsIE5VTEwpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZhZGRyZXNzKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhZGRyZXNzLCAiZGVidWctcGlwZTpuYW1lPSIpIHx8CisgICAgICAhX2RidXNfc3RyaW5nX2FwcGVuZCAoJmFkZHJlc3MsIHNlcnZlcl9uYW1lKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmYWRkcmVzcyk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIAorICBpZiAoIV9kYnVzX3NvY2tldHBhaXIgKCZjbGllbnRfZmQsICZzZXJ2ZXJfZmQsIEZBTFNFLCBOVUxMKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiZmFpbGVkIHRvIGNyZWF0ZSBmdWxsIGR1cGxleCBwaXBlXG4iKTsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsICJDb3VsZCBub3QgY3JlYXRlIGZ1bGwtZHVwbGV4IHBpcGUiKTsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmYWRkcmVzcyk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgY2xpZW50X3RyYW5zcG9ydCA9IF9kYnVzX3RyYW5zcG9ydF9uZXdfZm9yX3NvY2tldCAoY2xpZW50X2ZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAmYWRkcmVzcyk7CisgIGlmIChjbGllbnRfdHJhbnNwb3J0ID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfY2xvc2Vfc29ja2V0IChjbGllbnRfZmQsIE5VTEwpOworICAgICAgX2RidXNfY2xvc2Vfc29ja2V0IChzZXJ2ZXJfZmQsIE5VTEwpOworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmFkZHJlc3MpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIF9kYnVzX3N0cmluZ19mcmVlICgmYWRkcmVzcyk7CisgIAorICBfZGJ1c19zb2NrZXRfaW52YWxpZGF0ZSAoJmNsaWVudF9mZCk7CisKKyAgc2VydmVyX3RyYW5zcG9ydCA9IF9kYnVzX3RyYW5zcG9ydF9uZXdfZm9yX3NvY2tldCAoc2VydmVyX2ZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VydmVyLT5ndWlkX2hleCwgTlVMTCk7CisgIGlmIChzZXJ2ZXJfdHJhbnNwb3J0ID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfdHJhbnNwb3J0X3VucmVmIChjbGllbnRfdHJhbnNwb3J0KTsKKyAgICAgIF9kYnVzX2Nsb3NlX3NvY2tldCAoc2VydmVyX2ZkLCBOVUxMKTsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIF9kYnVzX3NvY2tldF9pbnZhbGlkYXRlICgmc2VydmVyX2ZkKTsKKworICBpZiAoIV9kYnVzX3RyYW5zcG9ydF9zZXRfYXV0aF9tZWNoYW5pc21zIChzZXJ2ZXJfdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhcioqKSBzZXJ2ZXItPmF1dGhfbWVjaGFuaXNtcykpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICBfZGJ1c190cmFuc3BvcnRfdW5yZWYgKHNlcnZlcl90cmFuc3BvcnQpOworICAgICAgX2RidXNfdHJhbnNwb3J0X3VucmVmIChjbGllbnRfdHJhbnNwb3J0KTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgCisgIGNvbm5lY3Rpb24gPSBfZGJ1c19jb25uZWN0aW9uX25ld19mb3JfdHJhbnNwb3J0IChzZXJ2ZXJfdHJhbnNwb3J0KTsKKyAgX2RidXNfdHJhbnNwb3J0X3VucmVmIChzZXJ2ZXJfdHJhbnNwb3J0KTsKKyAgc2VydmVyX3RyYW5zcG9ydCA9IE5VTEw7CisgIAorICBpZiAoY29ubmVjdGlvbiA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3RyYW5zcG9ydF91bnJlZiAoY2xpZW50X3RyYW5zcG9ydCk7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAvKiBTZWUgaWYgc29tZW9uZSB3YW50cyB0byBoYW5kbGUgdGhpcyBuZXcgY29ubmVjdGlvbiwKKyAgICogc2VsZi1yZWZlcmVuY2luZyBmb3IgcGFyYW5vaWEKKyAgICovCisgIGlmIChzZXJ2ZXItPm5ld19jb25uZWN0aW9uX2Z1bmN0aW9uKQorICAgIHsKKyAgICAgIGRidXNfc2VydmVyX3JlZiAoc2VydmVyKTsKKyAgICAgICgqIHNlcnZlci0+bmV3X2Nvbm5lY3Rpb25fZnVuY3Rpb24pIChzZXJ2ZXIsIGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyLT5uZXdfY29ubmVjdGlvbl9kYXRhKTsKKyAgICAgIGRidXNfc2VydmVyX3VucmVmIChzZXJ2ZXIpOworICAgIH0KKyAgCisgIC8qIElmIG5vIG9uZSBncmFiYmVkIGEgcmVmZXJlbmNlLCB0aGUgY29ubmVjdGlvbiB3aWxsIGRpZSwKKyAgICogYW5kIHRoZSBjbGllbnQgdHJhbnNwb3J0IHdpbGwgZ2V0IGFuIGltbWVkaWF0ZSBkaXNjb25uZWN0CisgICAqLworICBfZGJ1c19jb25uZWN0aW9uX2Nsb3NlX2lmX29ubHlfb25lX3JlZiAoY29ubmVjdGlvbik7CisgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoY29ubmVjdGlvbik7CisKKyAgcmV0dXJuIGNsaWVudF90cmFuc3BvcnQ7Cit9CisKKy8qKgorICogVHJpZXMgdG8gaW50ZXJwcmV0IHRoZSBhZGRyZXNzIGVudHJ5IGFzIGEgZGVidWcgcGlwZSBlbnRyeS4KKyAqIAorICogU2V0cyBlcnJvciBpZiB0aGUgcmVzdWx0IGlzIG5vdCBPSy4KKyAqIAorICogQHBhcmFtIGVudHJ5IGFuIGFkZHJlc3MgZW50cnkKKyAqIEBwYXJhbSBzZXJ2ZXJfcCBsb2NhdGlvbiB0byBzdG9yZSBhIG5ldyBEQnVzU2VydmVyLCBvciAjTlVMTCBvbiBmYWlsdXJlLgorICogQHBhcmFtIGVycm9yIGxvY2F0aW9uIHRvIHN0b3JlIHJhdGlvbmFsZSBmb3IgZmFpbHVyZSBvbiBiYWQgYWRkcmVzcworICogQHJldHVybnMgdGhlIG91dGNvbWUKKyAqIAorICovCitEQnVzU2VydmVyTGlzdGVuUmVzdWx0CitfZGJ1c19zZXJ2ZXJfbGlzdGVuX2RlYnVnX3BpcGUgKERCdXNBZGRyZXNzRW50cnkgKmVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU2VydmVyICAgICAgKipzZXJ2ZXJfcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCit7CisgIGNvbnN0IGNoYXIgKm1ldGhvZDsKKworICAqc2VydmVyX3AgPSBOVUxMOworICAKKyAgbWV0aG9kID0gZGJ1c19hZGRyZXNzX2VudHJ5X2dldF9tZXRob2QgKGVudHJ5KTsKKyAgCisgIGlmIChzdHJjbXAgKG1ldGhvZCwgImRlYnVnLXBpcGUiKSA9PSAwKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBkYnVzX2FkZHJlc3NfZW50cnlfZ2V0X3ZhbHVlIChlbnRyeSwgIm5hbWUiKTsKKyAgICAgIAorICAgICAgaWYgKG5hbWUgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3NldF9iYWRfYWRkcmVzcyhlcnJvciwgImRlYnVnLXBpcGUiLCAibmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICAgIHJldHVybiBEQlVTX1NFUlZFUl9MSVNURU5fQkFEX0FERFJFU1M7CisgICAgICAgIH0KKworICAgICAgKnNlcnZlcl9wID0gX2RidXNfc2VydmVyX2RlYnVnX3BpcGVfbmV3IChuYW1lLCBlcnJvcik7CisgICAgICAKKyAgICAgIGlmICgqc2VydmVyX3ApCisgICAgICAgIHsKKyAgICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIoZXJyb3IpOworICAgICAgICAgIHJldHVybiBEQlVTX1NFUlZFUl9MSVNURU5fT0s7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQoZXJyb3IpOworICAgICAgICAgIHJldHVybiBEQlVTX1NFUlZFUl9MSVNURU5fRElEX05PVF9DT05ORUNUOworICAgICAgICB9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSKGVycm9yKTsKKyAgICAgIHJldHVybiBEQlVTX1NFUlZFUl9MSVNURU5fTk9UX0hBTkRMRUQ7CisgICAgfQorfQorCisvKioKKyAqIE9wZW5zIGEgZGVidWcgcGlwZSB0cmFuc3BvcnQsIHVzZWQgaW4gdGhlIHRlc3Qgc3VpdGUuCisgKiAKKyAqIEBwYXJhbSBlbnRyeSB0aGUgYWRkcmVzcyBlbnRyeSB0byB0cnkgb3BlbmluZyBhcyBkZWJ1Zy1waXBlCisgKiBAcGFyYW0gdHJhbnNwb3J0X3AgcmV0dXJuIGxvY2F0aW9uIGZvciB0aGUgb3BlbmVkIHRyYW5zcG9ydAorICogQHBhcmFtIGVycm9yIGVycm9yIHRvIGJlIHNldAorICogQHJldHVybnMgcmVzdWx0IG9mIHRoZSBhdHRlbXB0CisgKi8KK0RCdXNUcmFuc3BvcnRPcGVuUmVzdWx0CitfZGJ1c190cmFuc3BvcnRfb3Blbl9kZWJ1Z19waXBlIChEQnVzQWRkcmVzc0VudHJ5ICAqZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHJhbnNwb3J0ICAgICoqdHJhbnNwb3J0X3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAqZXJyb3IpCit7CisgIGNvbnN0IGNoYXIgKm1ldGhvZDsKKyAgCisgIG1ldGhvZCA9IGRidXNfYWRkcmVzc19lbnRyeV9nZXRfbWV0aG9kIChlbnRyeSk7CisgIF9kYnVzX2Fzc2VydCAobWV0aG9kICE9IE5VTEwpOworCisgIGlmIChzdHJjbXAgKG1ldGhvZCwgImRlYnVnLXBpcGUiKSA9PSAwKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBkYnVzX2FkZHJlc3NfZW50cnlfZ2V0X3ZhbHVlIChlbnRyeSwgIm5hbWUiKTsKKworICAgICAgaWYgKG5hbWUgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3NldF9iYWRfYWRkcmVzcyAoZXJyb3IsICJkZWJ1Zy1waXBlIiwgIm5hbWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgICAgcmV0dXJuIERCVVNfVFJBTlNQT1JUX09QRU5fQkFEX0FERFJFU1M7CisgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgICp0cmFuc3BvcnRfcCA9IF9kYnVzX3RyYW5zcG9ydF9kZWJ1Z19waXBlX25ldyAobmFtZSwgZXJyb3IpOworCisgICAgICBpZiAoKnRyYW5zcG9ydF9wID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICAgICAgcmV0dXJuIERCVVNfVFJBTlNQT1JUX09QRU5fRElEX05PVF9DT05ORUNUOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gREJVU19UUkFOU1BPUlRfT1BFTl9PSzsKKyAgICAgICAgfSAgICAgIAorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworICAgICAgcmV0dXJuIERCVVNfVFJBTlNQT1JUX09QRU5fTk9UX0hBTkRMRUQ7CisgICAgfQorfQorCisKKy8qKiBAfSAqLworCisjZW5kaWYgLyogREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMgKi8KKwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLXNlcnZlci1kZWJ1Zy1waXBlLmggYi9kYnVzL2RidXMtc2VydmVyLWRlYnVnLXBpcGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTc0MzExCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLXNlcnZlci1kZWJ1Zy1waXBlLmgKQEAgLTAsMCArMSw0NyBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXNlcnZlci1kZWJ1Zy1waXBlLmggSW4tcHJvYyBkZWJ1ZyBzZXJ2ZXIgaW1wbGVtZW50YXRpb24gCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzICBDb2RlRmFjdG9yeSBBQgorICogQ29weXJpZ2h0IChDKSAyMDAzICBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaWZuZGVmIERCVVNfU0VSVkVSX0RFQlVHX1BJUEVfSAorI2RlZmluZSBEQlVTX1NFUlZFUl9ERUJVR19QSVBFX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy1pbnRlcm5hbHMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc2VydmVyLXByb3RlY3RlZC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy10cmFuc3BvcnQtcHJvdGVjdGVkLmg+CisKK0RCVVNfQkVHSU5fREVDTFMKKworREJ1c1NlcnZlciogICAgICAgICAgICAgX2RidXNfc2VydmVyX2RlYnVnX3BpcGVfbmV3ICAgICAoY29uc3QgY2hhciAgICAgICAgKnNlcnZlcl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgKmVycm9yKTsKK0RCdXNUcmFuc3BvcnQqICAgICAgICAgIF9kYnVzX3RyYW5zcG9ydF9kZWJ1Z19waXBlX25ldyAgKGNvbnN0IGNoYXIgICAgICAgICpzZXJ2ZXJfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICplcnJvcik7CitEQnVzU2VydmVyTGlzdGVuUmVzdWx0ICBfZGJ1c19zZXJ2ZXJfbGlzdGVuX2RlYnVnX3BpcGUgIChEQnVzQWRkcmVzc0VudHJ5ICAqZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU2VydmVyICAgICAgICoqc2VydmVyX3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAqZXJyb3IpOworREJ1c1RyYW5zcG9ydE9wZW5SZXN1bHQgX2RidXNfdHJhbnNwb3J0X29wZW5fZGVidWdfcGlwZSAoREJ1c0FkZHJlc3NFbnRyeSAgKmVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1RyYW5zcG9ydCAgICAqKnRyYW5zcG9ydF9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgKmVycm9yKTsKKworCitEQlVTX0VORF9ERUNMUworCisjZW5kaWYgLyogREJVU19TRVJWRVJfREVCVUdfUElQRV9IICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtc2VydmVyLWxhdW5jaGQuYyBiL2RidXMvZGJ1cy1zZXJ2ZXItbGF1bmNoZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxOGJhOGMKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtc2VydmVyLWxhdW5jaGQuYwpAQCAtMCwwICsxLDIwOSBAQAorLyogZGJ1cy1zZXJ2ZXItbGF1bmNoZC5jIFNlcnZlciBtZXRob2RzIGZvciBpbnRlcmFjdGluZyB3aXRoIGxhdW5jaGQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcsIFRhbm5lciBMb3ZlbGFjZSA8bG92ZWxhY2VAd2F5ZmFyZXIub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDA4LCBDb2xpbiBXYWx0ZXJzIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSwgQmVuamFtaW4gUmVlZCA8cmFuZ2Vycmlja0BiZWZ1bmsuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDA5LCBKb25hcyBCw6RociA8am9uYXMuYmFlaHJAd2ViLmRlPgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksCisgKiBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMKKyAqIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCisgKiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgKiBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLXNlcnZlci1sYXVuY2hkLmgiCisKKy8qKgorICogQGRlZmdyb3VwIERCdXNTZXJ2ZXJMYXVuY2hkIERCdXNTZXJ2ZXIgaW1wbGVtZW50YXRpb25zIGZvciBMYXVuY2hkCisgKiBAaW5ncm91cCAgREJ1c0ludGVybmFscworICogQGJyaWVmIEltcGxlbWVudGF0aW9uIGRldGFpbHMgb2YgREJ1c1NlcnZlciB3aXRoIExhdW5jaGQgc3VwcG9ydAorICoKKyAqIEB7CisgKi8KKworI2lmZGVmIERCVVNfRU5BQkxFX0xBVU5DSEQKKyNpbmNsdWRlIDxsYXVuY2guaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSAiZGJ1cy1taXNjLmgiCisjaW5jbHVkZSAiZGJ1cy1zZXJ2ZXItc29ja2V0LmgiCisjaW5jbHVkZSAiZGJ1cy1zeXNkZXBzLXVuaXguaCIKKworLyogcHV0IG90aGVyIHByaXZhdGUgbGF1bmNoZCBmdW5jdGlvbnMgaGVyZSAqLworCisjZW5kaWYgLyogREJVU19FTkFCTEVfTEFVTkNIRCAqLworCisvKioKKyAqIEBicmllZiBDcmVhdGVzIGEgbmV3IHNlcnZlciBmcm9tIGxhdW5jaGQuCisgKgorICogbGF1bmNoZCBoYXMgYWxsb2NhZWQgYSBzb2NrZXQgZm9yIHVzLiBXZSBub3cgcXVlcnkgbGF1bmNoZCBmb3IgdGhlCisgKiBmaWxlIGRlc2NyaXB0b3Igb2YgdGhpcyBzb2NrZXQgYW5kIGNyZWF0ZSBhIHNlcnZlciBvbiBpdC4KKyAqIEluIGFkZGl0aW9uIHdlIGluaGVyaXQgbGF1bmNoZCdzIGVudmlyb25tZW50IHdoaWNoIGhvbGRzIGEgdmFyaWFibGUKKyAqIGNvbnRhaW5pbmcgdGhlIHBhdGggdG8gdGhlIHNvY2tldC4gVGhpcyBpcyB1c2VkIHRvIGluaXQgdGhlIHNlcnZlcidzCisgKiBhZGRyZXNzIHdoaWNoIGlzIHBhc3NlZCB0byBhdXRvbGF1bmNoZWQgc2VydmljZXMuCisgKgorICogQHBhcmFtIGxhdW5jaGRfZW52X3ZhciB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgd2hpY2ggaG9sZHMgdGhlIHVuaXggcGF0aCB0byB0aGUgc29ja2V0CisgKiBAcGFyYW0gZXJyb3IgbG9jYXRpb24gdG8gc3RvcmUgcmVhc29uIGZvciBmYWlsdXJlLgorICogQHJldHVybnMgdGhlIG5ldyBzZXJ2ZXIsIG9yICNOVUxMIG9uIGZhaWx1cmUuCisgKi8KKworREJ1c1NlcnZlciAqCitfZGJ1c19zZXJ2ZXJfbmV3X2Zvcl9sYXVuY2hkIChjb25zdCBjaGFyICpsYXVuY2hkX2Vudl92YXIsIERCdXNFcnJvciAqIGVycm9yKQorICB7CisjaWZkZWYgREJVU19FTkFCTEVfTEFVTkNIRAorICAgIERCdXNTZXJ2ZXIgKnNlcnZlcjsKKyAgICBEQnVzU3RyaW5nIGFkZHJlc3M7CisgICAgaW50IGxhdW5jaGRfZmQ7CisgICAgbGF1bmNoX2RhdGFfdCBzb2NrZXRzX2RpY3QsIGNoZWNraW5fcmVzcG9uc2U7CisgICAgbGF1bmNoX2RhdGFfdCBjaGVja2luX3JlcXVlc3Q7CisgICAgbGF1bmNoX2RhdGFfdCBsaXN0ZW5pbmdfZmRfYXJyYXksIGxpc3RlbmluZ19mZDsKKyAgICBsYXVuY2hfZGF0YV90IGVudmlyb25tZW50X2RpY3QsIGVudmlyb25tZW50X3BhcmFtOworICAgIGNvbnN0IGNoYXIgKmxhdW5jaGRfc29ja2V0X3BhdGgsICpkaXNwbGF5OworCisgICAgbGF1bmNoZF9zb2NrZXRfcGF0aCA9IF9kYnVzX2dldGVudiAobGF1bmNoZF9lbnZfdmFyKTsKKyAgICBkaXNwbGF5ID0gX2RidXNfZ2V0ZW52ICgiRElTUExBWSIpOworCisgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgICBpZiAobGF1bmNoZF9zb2NrZXRfcGF0aCA9PSBOVUxMIHx8ICpsYXVuY2hkX3NvY2tldF9wYXRoID09ICdcMCcpCisgICAgICB7CisgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9CQURfQUREUkVTUywKKyAgICAgICAgICAgICAgICAgICAgICAgICJsYXVuY2hkJ3MgZW52aXJvbm1lbnQgdmFyaWFibGUgJXMgaXMgZW1wdHksIGJ1dCBzaG91bGQgY29udGFpbiBhIHNvY2tldCBwYXRoLlxuIiwgbGF1bmNoZF9lbnZfdmFyKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICB9CisKKyAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmYWRkcmVzcykpCisgICAgICB7CisgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgIH0KKyAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhZGRyZXNzLCAidW5peDpwYXRoPSIpKQorICAgICAgeworICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgICAgZ290byBsX2ZhaWxlZF8wOworICAgICAgfQorICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmFkZHJlc3MsIGxhdW5jaGRfc29ja2V0X3BhdGgpKQorICAgICAgeworICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgICAgZ290byBsX2ZhaWxlZF8wOworICAgICAgfQorCisgICAgaWYgKChjaGVja2luX3JlcXVlc3QgPSBsYXVuY2hfZGF0YV9uZXdfc3RyaW5nIChMQVVOQ0hfS0VZX0NIRUNLSU4pKSA9PSBOVUxMKQorICAgICAgeworICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLAorICAgICAgICAgICAgICAgICAgICAgICAgImxhdW5jaF9kYXRhX25ld19zdHJpbmcoXCIlc1wiKSBVbmFibGUgdG8gY3JlYXRlIHN0cmluZy5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBMQVVOQ0hfS0VZX0NIRUNLSU4pOworICAgICAgICBnb3RvIGxfZmFpbGVkXzA7CisgICAgICB9CisKKyAgICBpZiAoKGNoZWNraW5fcmVzcG9uc2UgPSBsYXVuY2hfbXNnIChjaGVja2luX3JlcXVlc3QpKSA9PSBOVUxMKQorICAgICAgeworICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfSU9fRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAibGF1bmNoX21zZyhcIiVzXCIpIElQQyBmYWlsdXJlOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIExBVU5DSF9LRVlfQ0hFQ0tJTiwgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICAgIGdvdG8gbF9mYWlsZWRfMDsKKyAgICAgIH0KKworICAgIGlmIChMQVVOQ0hfREFUQV9FUlJOTyA9PSBsYXVuY2hfZGF0YV9nZXRfdHlwZSAoY2hlY2tpbl9yZXNwb25zZSkpCisgICAgICB7CisgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsICJDaGVjay1pbiBmYWlsZWQ6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IgKGxhdW5jaF9kYXRhX2dldF9lcnJubyAoY2hlY2tpbl9yZXNwb25zZSkpKTsKKyAgICAgICAgZ290byBsX2ZhaWxlZF8wOworICAgICAgfQorCisgICAgc29ja2V0c19kaWN0ID0KKyAgICAgIGxhdW5jaF9kYXRhX2RpY3RfbG9va3VwIChjaGVja2luX3Jlc3BvbnNlLCBMQVVOQ0hfSk9CS0VZX1NPQ0tFVFMpOworICAgIGlmIChOVUxMID09IHNvY2tldHNfZGljdCkKKyAgICAgIHsKKyAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0lPX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgIk5vIHNvY2tldHMgZm91bmQgdG8gYW5zd2VyIHJlcXVlc3RzIG9uIVxuIik7CisgICAgICAgIGdvdG8gbF9mYWlsZWRfMDsKKyAgICAgIH0KKworICAgIGxpc3RlbmluZ19mZF9hcnJheSA9CisgICAgICBsYXVuY2hfZGF0YV9kaWN0X2xvb2t1cCAoc29ja2V0c19kaWN0LCAidW5peF9kb21haW5fbGlzdGVuZXIiKTsKKyAgICBpZiAoTlVMTCA9PSBsaXN0ZW5pbmdfZmRfYXJyYXkpCisgICAgICB7CisgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9JT19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJObyBrbm93biBzb2NrZXRzIGZvdW5kIHRvIGFuc3dlciByZXF1ZXN0cyBvbiFcbiIpOworICAgICAgICBnb3RvIGxfZmFpbGVkXzA7CisgICAgICB9CisKKyAgICBpZiAobGF1bmNoX2RhdGFfYXJyYXlfZ2V0X2NvdW50IChsaXN0ZW5pbmdfZmRfYXJyYXkpICE9IDEpCisgICAgICB7CisgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9MSU1JVFNfRVhDRUVERUQsCisgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgMSBzb2NrZXQgZnJvbSBsYXVuY2hkLCBnb3QgJWQuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgbGF1bmNoX2RhdGFfYXJyYXlfZ2V0X2NvdW50IChsaXN0ZW5pbmdfZmRfYXJyYXkpKTsKKyAgICAgICAgZ290byBsX2ZhaWxlZF8wOworICAgICAgfQorCisgICAgbGlzdGVuaW5nX2ZkID0gbGF1bmNoX2RhdGFfYXJyYXlfZ2V0X2luZGV4IChsaXN0ZW5pbmdfZmRfYXJyYXksIDApOworICAgIGxhdW5jaGRfZmQgPSBsYXVuY2hfZGF0YV9nZXRfZmQgKGxpc3RlbmluZ19mZCk7CisKKyAgICBfZGJ1c19mZF9zZXRfY2xvc2Vfb25fZXhlYyAobGF1bmNoZF9mZCk7CisKKyAgICBpZiAobGF1bmNoZF9mZCA8IDApCisgICAgICB7CisgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgICAgZ290byBsX2ZhaWxlZF8wOworICBpZiAoZGlzcGxheSA9PSBOVUxMIHx8ICpkaXNwbGF5ID09ICdcMCcpCisgICAgeworICAgICAgZW52aXJvbm1lbnRfZGljdCA9IGxhdW5jaF9kYXRhX2RpY3RfbG9va3VwIChjaGVja2luX3Jlc3BvbnNlLCBMQVVOQ0hfSk9CS0VZX1VTRVJFTlZJUk9OTUVOVFZBUklBQkxFUyk7CisgICAgICBpZiAoTlVMTCA9PSBlbnZpcm9ubWVudF9kaWN0KQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoIlVuYWJsZSB0byByZXRyaWV2ZSB1c2VyIGVudmlyb25tZW50IGZyb20gbGF1bmNoZC4iKTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgZW52aXJvbm1lbnRfcGFyYW0gPSBsYXVuY2hfZGF0YV9kaWN0X2xvb2t1cCAoZW52aXJvbm1lbnRfZGljdCwgIkRJU1BMQVkiKTsKKyAgICAgICAgICBpZiAoTlVMTCA9PSBlbnZpcm9ubWVudF9wYXJhbSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfd2FybiAoIlVuYWJsZSB0byByZXRyaWV2ZSBESVNQTEFZIGZyb20gbGF1bmNoZC4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRpc3BsYXkgPSBsYXVuY2hfZGF0YV9nZXRfc3RyaW5nKGVudmlyb25tZW50X3BhcmFtKTsKKyAgICAgICAgICAgICAgZGJ1c19zZXRlbnYgKCJESVNQTEFZIiwgZGlzcGxheSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAgIH0KKworICAgIHNlcnZlciA9IF9kYnVzX3NlcnZlcl9uZXdfZm9yX3NvY2tldCAoJmxhdW5jaGRfZmQsIDEsICZhZGRyZXNzLCAwLCBlcnJvcik7CisgICAgaWYgKHNlcnZlciA9PSBOVUxMKQorICAgICAgeworICAgICAgICBnb3RvIGxfZmFpbGVkXzA7CisgICAgICB9CisKKyAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmFkZHJlc3MpOworCisgICAgcmV0dXJuIHNlcnZlcjsKKworICBsX2ZhaWxlZF8wOgorICAgIF9kYnVzX3N0cmluZ19mcmVlICgmYWRkcmVzcyk7CisKKyAgICByZXR1cm4gTlVMTDsKKyNlbHNlIC8qIERCVVNfRU5BQkxFX0xBVU5DSEQgKi8KKyAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfQkFEX0FERFJFU1MsCisgICAgICAgICAgICAgICAgICAgICJhZGRyZXNzIHR5cGUgJ2xhdW5jaGQnIHJlcXVlc3RlZCwgYnV0IGxhdW5jaGQgc3VwcG9ydCBub3QgY29tcGlsZWQgaW4iKTsKKyAgICByZXR1cm4gTlVMTDsKKyNlbmRpZgorICB9CisKKy8qKiBAfSAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLXNlcnZlci1sYXVuY2hkLmggYi9kYnVzL2RidXMtc2VydmVyLWxhdW5jaGQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjliOTE0Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLXNlcnZlci1sYXVuY2hkLmgKQEAgLTAsMCArMSwzNiBAQAorLyogZGJ1cy1zZXJ2ZXItbGF1bmNoZC5oIFNlcnZlciBtZXRob2RzIGZvciBpbnRlcmFjdGluZyB3aXRoIGxhdW5jaGQuCisqIENvcHlyaWdodCAoQykgMjAwOCwgQmVuamFtaW4gUmVlZCA8cmFuZ2Vycmlja0BiZWZ1bmsuY29tPgorKgorKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorKiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorKiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisqIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LAorKiBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMKKyogb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyoKKyogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKKyogaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisqCisqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyogSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisqIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyovCisKKyNpZm5kZWYgREJVU19TRVJWRVJfTEFVTkNIRF9ICisjZGVmaW5lIERCVVNfU0VSVkVSX0xBVU5DSERfSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWludGVybmFscy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zZXJ2ZXItcHJvdGVjdGVkLmg+CisKK0RCVVNfQkVHSU5fREVDTFMKKworREJ1c1NlcnZlciAqIF9kYnVzX3NlcnZlcl9uZXdfZm9yX2xhdW5jaGQgKGNvbnN0IGNoYXIgKmxhdW5jaGRfZW52X3ZhciwgREJ1c0Vycm9yICogZXJyb3IpOworCitEQlVTX0VORF9ERUNMUworI2VuZGlmIC8qIERCVVNfU0VSVkVSX0xBVU5DSERfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLXNlcnZlci1wcm90ZWN0ZWQuaCBiL2RidXMvZGJ1cy1zZXJ2ZXItcHJvdGVjdGVkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY2NGIyYgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1zZXJ2ZXItcHJvdGVjdGVkLmgKQEAgLTAsMCArMSwxODAgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1zZXJ2ZXItcHJvdGVjdGVkLmggVXNlZCBieSBzdWJjbGFzc2VzIG9mIERCdXNTZXJ2ZXIgb2JqZWN0IChpbnRlcm5hbCB0byBELUJ1cyBpbXBsZW1lbnRhdGlvbikKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgIFJlZCBIYXQgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworI2lmbmRlZiBEQlVTX1NFUlZFUl9QUk9URUNURURfSAorI2RlZmluZSBEQlVTX1NFUlZFUl9QUk9URUNURURfSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWludGVybmFscy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy10aHJlYWRzLWludGVybmFsLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXNlcnZlci5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1hZGRyZXNzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXRpbWVvdXQuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtd2F0Y2guaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtcmVzb3VyY2VzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWRhdGFzbG90Lmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXN0cmluZy5oPgorCitEQlVTX0JFR0lOX0RFQ0xTCisKK3R5cGVkZWYgc3RydWN0IERCdXNTZXJ2ZXJWVGFibGUgREJ1c1NlcnZlclZUYWJsZTsKKworLyoqCisgKiBWaXJ0dWFsIHRhYmxlIHRvIGJlIGltcGxlbWVudGVkIGJ5IGFsbCBzZXJ2ZXIgInN1YmNsYXNzZXMiCisgKi8KK3N0cnVjdCBEQnVzU2VydmVyVlRhYmxlCit7CisgIHZvaWQgICAgICAgICgqIGZpbmFsaXplKSAgICAgIChEQnVzU2VydmVyICpzZXJ2ZXIpOworICAvKio8IFRoZSBmaW5hbGl6ZSBtZXRob2QgbXVzdCBmcmVlIHRoZSBzZXJ2ZXIuICovCisgIAorICB2b2lkICAgICAgICAoKiBkaXNjb25uZWN0KSAgICAoREJ1c1NlcnZlciAqc2VydmVyKTsKKyAgLyoqPCBEaXNjb25uZWN0IHRoaXMgc2VydmVyLiAqLworfTsKKworLyoqCisgKiBAaW5ncm91cCBEQnVzU2VydmVySW50ZXJuYWxzCisgKiBJbnRlcm5hbHMgb2YgREJ1c1NlcnZlciBvYmplY3QKKyAqLworc3RydWN0IERCdXNTZXJ2ZXIKK3sKKyAgREJ1c0F0b21pYyByZWZjb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFJlZmVyZW5jZSBjb3VudC4gKi8KKyAgY29uc3QgREJ1c1NlcnZlclZUYWJsZSAqdnRhYmxlOyAgICAgICAgICAgICAvKio8IFZpcnR1YWwgbWV0aG9kcyBmb3IgdGhpcyBpbnN0YW5jZS4gKi8KKyAgREJ1c1JNdXRleCAqbXV0ZXg7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IExvY2sgb24gdGhlIHNlcnZlciBvYmplY3QgKi8KKworICBEQnVzR1VJRCBndWlkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgR2xvYmFsbHkgdW5pcXVlIElEIG9mIHNlcnZlciAqLworCisgIERCdXNTdHJpbmcgZ3VpZF9oZXg7ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBIZXgtZW5jb2RlZCB2ZXJzaW9uIG9mIEdVSUQgKi8KKyAgCisgIERCdXNXYXRjaExpc3QgKndhdGNoZXM7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBPdXIgd2F0Y2hlcyAqLworICBEQnVzVGltZW91dExpc3QgKnRpbWVvdXRzOyAgICAgICAgICAgICAgICAgIC8qKjwgT3VyIHRpbWVvdXRzICovICAKKworICBjaGFyICphZGRyZXNzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQWRkcmVzcyB0aGlzIHNlcnZlciBpcyBsaXN0ZW5pbmcgb24uICovCisgIGRidXNfYm9vbF90IHB1Ymxpc2hlZF9hZGRyZXNzOyAgICAgICAgICAgICAgLyoqPCBmbGFnIHdoaWNoIGluZGljYXRlcyB0aGF0IHNlcnZlciBoYXMgcHVibGlzaGVkIGl0cyBidXMgYWRkcmVzcy4gKi8KKworICBpbnQgbWF4X2Nvbm5lY3Rpb25zOyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTWF4IG51bWJlciBvZiBjb25uZWN0aW9ucyBhbGxvd2VkIGF0IG9uY2UuICovCisKKyAgREJ1c0RhdGFTbG90TGlzdCBzbG90X2xpc3Q7ICAgLyoqPCBEYXRhIHN0b3JlZCBieSBhbGxvY2F0ZWQgaW50ZWdlciBJRCAqLworICAKKyAgREJ1c05ld0Nvbm5lY3Rpb25GdW5jdGlvbiAgbmV3X2Nvbm5lY3Rpb25fZnVuY3Rpb247CisgIC8qKjwgQ2FsbGJhY2sgdG8gaW52b2tlIHdoZW4gYSBuZXcgY29ubmVjdGlvbiBpcyBjcmVhdGVkLiAqLworICB2b2lkICpuZXdfY29ubmVjdGlvbl9kYXRhOworICAvKio8IERhdGEgZm9yIG5ldyBjb25uZWN0aW9uIGNhbGxiYWNrICovCisgIERCdXNGcmVlRnVuY3Rpb24gbmV3X2Nvbm5lY3Rpb25fZnJlZV9kYXRhX2Z1bmN0aW9uOworICAvKio8IENhbGxiYWNrIHRvIGludm9rZSB0byBmcmVlIG5ld19jb25uZWN0aW9uX2RhdGEKKyAgICogd2hlbiBzZXJ2ZXIgaXMgZmluYWxpemVkIG9yIGRhdGEgaXMgcmVwbGFjZWQuCisgICAqLworCisgIGNoYXIgKiphdXRoX21lY2hhbmlzbXM7IC8qKjwgQXJyYXkgb2YgYWxsb3dlZCBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc21zICovCisgIAorICB1bnNpZ25lZCBpbnQgZGlzY29ubmVjdGVkIDogMTsgICAgICAgICAgICAgIC8qKjwgVFJVRSBpZiB3ZSBhcmUgZGlzY29ubmVjdGVkLiAqLworCisjaWZuZGVmIERCVVNfRElTQUJMRV9DSEVDS1MKKyAgdW5zaWduZWQgaW50IGhhdmVfc2VydmVyX2xvY2sgOiAxOyAvKio8IERvZXMgc29tZW9uZSBoYXZlIHRoZSBzZXJ2ZXIgbXV0ZXggbG9ja2VkICovCisjZW5kaWYKK307CisKK2RidXNfYm9vbF90IF9kYnVzX3NlcnZlcl9pbml0X2Jhc2UgICAgICAoREJ1c1NlcnZlciAgICAgICAgICAgICAqc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU2VydmVyVlRhYmxlICp2dGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICAgICAgKmFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICAgICAgKmVycm9yKTsKK3ZvaWQgICAgICAgIF9kYnVzX3NlcnZlcl9maW5hbGl6ZV9iYXNlICAoREJ1c1NlcnZlciAgICAgICAgICAgICAqc2VydmVyKTsKK3ZvaWQgICAgICAgIF9kYnVzX3NlcnZlcl9kaXNjb25uZWN0X3VubG9ja2VkIChEQnVzU2VydmVyICAgICAgICAqc2VydmVyKTsKK2RidXNfYm9vbF90IF9kYnVzX3NlcnZlcl9hZGRfd2F0Y2ggICAgICAoREJ1c1NlcnZlciAgICAgICAgICAgICAqc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzV2F0Y2ggICAgICAgICAgICAgICp3YXRjaCk7Cit2b2lkICAgICAgICBfZGJ1c19zZXJ2ZXJfcmVtb3ZlX3dhdGNoICAgKERCdXNTZXJ2ZXIgICAgICAgICAgICAgKnNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1dhdGNoICAgICAgICAgICAgICAqd2F0Y2gpOworREJVU19QUklWQVRFX0VYUE9SVAordm9pZCAgICAgICAgX2RidXNfc2VydmVyX3RvZ2dsZV9hbGxfd2F0Y2hlcyAoREJ1c1NlcnZlciAgICAgICAgICpzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICAgIGVuYWJsZWQpOworZGJ1c19ib29sX3QgX2RidXNfc2VydmVyX2FkZF90aW1lb3V0ICAgIChEQnVzU2VydmVyICAgICAgICAgICAgICpzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUaW1lb3V0ICAgICAgICAgICAgKnRpbWVvdXQpOwordm9pZCAgICAgICAgX2RidXNfc2VydmVyX3JlbW92ZV90aW1lb3V0IChEQnVzU2VydmVyICAgICAgICAgICAgICpzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUaW1lb3V0ICAgICAgICAgICAgKnRpbWVvdXQpOwordm9pZCAgICAgICAgX2RidXNfc2VydmVyX3RvZ2dsZV90aW1lb3V0IChEQnVzU2VydmVyICAgICAgICAgICAgICpzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUaW1lb3V0ICAgICAgICAgICAgKnRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgICAgICAgIGVuYWJsZWQpOworCitEQlVTX1BSSVZBVEVfRVhQT1JUCit2b2lkICAgICAgICBfZGJ1c19zZXJ2ZXJfcmVmX3VubG9ja2VkICAgKERCdXNTZXJ2ZXIgICAgICAgICAgICAgKnNlcnZlcik7CitEQlVTX1BSSVZBVEVfRVhQT1JUCit2b2lkICAgICAgICBfZGJ1c19zZXJ2ZXJfdW5yZWZfdW5sb2NrZWQgKERCdXNTZXJ2ZXIgICAgICAgICAgICAgKnNlcnZlcik7CisKK3R5cGVkZWYgZW51bQoreworICBEQlVTX1NFUlZFUl9MSVNURU5fTk9UX0hBTkRMRUQsIC8qKjwgd2UgYXJlbid0IGluIGNoYXJnZSBvZiB0aGlzIGFkZHJlc3MgdHlwZSAqLworICBEQlVTX1NFUlZFUl9MSVNURU5fT0ssICAgICAgICAgIC8qKjwgd2Ugc2V0IHVwIHRoZSBsaXN0ZW4gKi8KKyAgREJVU19TRVJWRVJfTElTVEVOX0JBRF9BRERSRVNTLCAvKio8IG1hbGZvcm1lZCBhZGRyZXNzICovCisgIERCVVNfU0VSVkVSX0xJU1RFTl9ESURfTk9UX0NPTk5FQ1QsIC8qKjwgd2VsbC1mb3JtZWQgYWRkcmVzcyBidXQgZmFpbGVkIHRvIHNldCBpdCB1cCAqLworICBEQlVTX1NFUlZFUl9MSVNURU5fQUREUkVTU19BTFJFQURZX1VTRUQgLyoqPCBhZGRyZXNzIGlzIGFscmVhZHkgdXNlZCAqLworfSBEQnVzU2VydmVyTGlzdGVuUmVzdWx0OworCitEQnVzU2VydmVyTGlzdGVuUmVzdWx0IF9kYnVzX3NlcnZlcl9saXN0ZW5fcGxhdGZvcm1fc3BlY2lmaWMgKERCdXNBZGRyZXNzRW50cnkgICplbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1NlcnZlciAgICAgICAqKnNlcnZlcl9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAqZXJyb3IpOworCisjaWZkZWYgREJVU19FTkFCTEVfVkVSQk9TRV9NT0RFCit2b2lkIF9kYnVzX3NlcnZlcl90cmFjZV9yZWYgKERCdXNTZXJ2ZXIgKnNlcnZlciwKKyAgICBpbnQgb2xkX3JlZmNvdW50LAorICAgIGludCBuZXdfcmVmY291bnQsCisgICAgY29uc3QgY2hhciAqd2h5KTsKKyNlbHNlCisjZGVmaW5lIF9kYnVzX3NlcnZlcl90cmFjZV9yZWYocyxvLG4sdykgXAorICBkbyBcCisgIHtcCisgICAgKHZvaWQpIChvKTsgXAorICAgICh2b2lkKSAobik7IFwKKyAgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisjaWZkZWYgREJVU19ESVNBQkxFX0NIRUNLUworI2RlZmluZSBUT09LX0xPQ0tfQ0hFQ0soc2VydmVyKQorI2RlZmluZSBSRUxFQVNJTkdfTE9DS19DSEVDSyhzZXJ2ZXIpCisjZGVmaW5lIEhBVkVfTE9DS19DSEVDSyhzZXJ2ZXIpCisjZWxzZQorI2RlZmluZSBUT09LX0xPQ0tfQ0hFQ0soc2VydmVyKSBkbyB7ICAgICAgICAgICAgICAgIFwKKyAgICBfZGJ1c19hc3NlcnQgKCEoc2VydmVyKS0+aGF2ZV9zZXJ2ZXJfbG9jayk7IFwKKyAgICAoc2VydmVyKS0+aGF2ZV9zZXJ2ZXJfbG9jayA9IFRSVUU7ICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKyNkZWZpbmUgUkVMRUFTSU5HX0xPQ0tfQ0hFQ0soc2VydmVyKSBkbyB7ICAgICAgICAgICAgXAorICAgIF9kYnVzX2Fzc2VydCAoKHNlcnZlciktPmhhdmVfc2VydmVyX2xvY2spOyAgIFwKKyAgICAoc2VydmVyKS0+aGF2ZV9zZXJ2ZXJfbG9jayA9IEZBTFNFOyAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisjZGVmaW5lIEhBVkVfTE9DS19DSEVDSyhzZXJ2ZXIpICAgICAgICBfZGJ1c19hc3NlcnQgKChzZXJ2ZXIpLT5oYXZlX3NlcnZlcl9sb2NrKQorLyogQSAiRE9fTk9UX0hBVkVfTE9DS19DSEVDSyIgaXMgaW1wb3NzaWJsZSBzaW5jZSB3ZSBuZWVkIHRoZSBsb2NrIHRvIGNoZWNrIHRoZSBmbGFnICovCisjZW5kaWYKKworI2RlZmluZSBUUkFDRV9MT0NLUyAwCisKKyNkZWZpbmUgU0VSVkVSX0xPQ0soc2VydmVyKSAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChUUkFDRV9MT0NLUykgeyBfZGJ1c192ZXJib3NlICgiTE9DS1xuIik7IH0gICBcCisgICAgX2RidXNfcm11dGV4X2xvY2sgKChzZXJ2ZXIpLT5tdXRleCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUT09LX0xPQ0tfQ0hFQ0sgKHNlcnZlcik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIFNFUlZFUl9VTkxPQ0soc2VydmVyKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChUUkFDRV9MT0NLUykgeyBfZGJ1c192ZXJib3NlICgiVU5MT0NLXG4iKTsgIH0gICAgICAgIFwKKyAgICBSRUxFQVNJTkdfTE9DS19DSEVDSyAoc2VydmVyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX2RidXNfcm11dGV4X3VubG9jayAoKHNlcnZlciktPm11dGV4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCitEQlVTX0VORF9ERUNMUworCisjZW5kaWYgLyogREJVU19TRVJWRVJfUFJPVEVDVEVEX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1zZXJ2ZXItc29ja2V0LmMgYi9kYnVzL2RidXMtc2VydmVyLXNvY2tldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhOTMwOTEKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtc2VydmVyLXNvY2tldC5jCkBAIC0wLDAgKzEsNjE3IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtc2VydmVyLXNvY2tldC5jIFNlcnZlciBpbXBsZW1lbnRhdGlvbiBmb3Igc29ja2V0cworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMywgMjAwNCwgMjAwNiAgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKyNpbmNsdWRlICJkYnVzLXNlcnZlci1zb2NrZXQuaCIKKyNpbmNsdWRlICJkYnVzLXRyYW5zcG9ydC1zb2NrZXQuaCIKKyNpbmNsdWRlICJkYnVzLWNvbm5lY3Rpb24taW50ZXJuYWwuaCIKKyNpbmNsdWRlICJkYnVzLW1lbW9yeS5oIgorI2luY2x1ZGUgImRidXMtbm9uY2UuaCIKKyNpbmNsdWRlICJkYnVzLXN0cmluZy5oIgorCisvKioKKyAqIEBkZWZncm91cCBEQnVzU2VydmVyU29ja2V0IERCdXNTZXJ2ZXIgaW1wbGVtZW50YXRpb25zIGZvciBTT0NLRVQKKyAqIEBpbmdyb3VwICBEQnVzSW50ZXJuYWxzCisgKiBAYnJpZWYgSW1wbGVtZW50YXRpb24gZGV0YWlscyBvZiBEQnVzU2VydmVyIG9uIFNPQ0tFVAorICoKKyAqIEB7CisgKi8KKy8qKgorICoKKyAqIE9wYXF1ZSBvYmplY3QgcmVwcmVzZW50aW5nIGEgU29ja2V0IHNlcnZlciBpbXBsZW1lbnRhdGlvbi4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgREJ1c1NlcnZlclNvY2tldCBEQnVzU2VydmVyU29ja2V0OworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIGRldGFpbHMgb2YgREJ1c1NlcnZlclNvY2tldC4gQWxsIG1lbWJlcnMKKyAqIGFyZSBwcml2YXRlLgorICovCitzdHJ1Y3QgREJ1c1NlcnZlclNvY2tldAoreworICBEQnVzU2VydmVyIGJhc2U7ICAgLyoqPCBQYXJlbnQgY2xhc3MgbWVtYmVycy4gKi8KKyAgaW50IG5fZmRzOyAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGFjdGl2ZSBmaWxlIGhhbmRsZXMgKi8KKyAgREJ1c1NvY2tldCAqZmRzOyAgIC8qKjwgRmlsZSBkZXNjcmlwdG9yIG9yIERCVVNfU09DS0VUX0lOVkFMSUQgaWYgZGlzY29ubmVjdGVkLiAqLworICBEQnVzV2F0Y2ggKip3YXRjaDsgLyoqPCBGaWxlIGRlc2NyaXB0b3Igd2F0Y2guICovCisgIGNoYXIgKnNvY2tldF9uYW1lOyAvKio8IE5hbWUgb2YgZG9tYWluIHNvY2tldCwgdG8gdW5saW5rIGlmIGFwcHJvcHJpYXRlICovCisgIERCdXNOb25jZUZpbGUgKm5vbmNlZmlsZTsgLyoqPCBOb25jZSBmaWxlIHVzZWQgdG8gYXV0aGVudGljYXRlIGNsaWVudHMgKi8KK307CisKK3N0YXRpYyB2b2lkCitzb2NrZXRfZmluYWxpemUgKERCdXNTZXJ2ZXIgKnNlcnZlcikKK3sKKyAgREJ1c1NlcnZlclNvY2tldCAqc29ja2V0X3NlcnZlciA9IChEQnVzU2VydmVyU29ja2V0Kikgc2VydmVyOworICBpbnQgaTsKKworICBfZGJ1c19zZXJ2ZXJfZmluYWxpemVfYmFzZSAoc2VydmVyKTsKKworICBmb3IgKGkgPSAwIDsgaSA8IHNvY2tldF9zZXJ2ZXItPm5fZmRzIDsgaSsrKQorICAgIGlmIChzb2NrZXRfc2VydmVyLT53YXRjaFtpXSkKKyAgICAgIHsKKyAgICAgICAgX2RidXNfd2F0Y2hfdW5yZWYgKHNvY2tldF9zZXJ2ZXItPndhdGNoW2ldKTsKKyAgICAgICAgc29ja2V0X3NlcnZlci0+d2F0Y2hbaV0gPSBOVUxMOworICAgICAgfQorCisgIGRidXNfZnJlZSAoc29ja2V0X3NlcnZlci0+ZmRzKTsKKyAgZGJ1c19mcmVlIChzb2NrZXRfc2VydmVyLT53YXRjaCk7CisgIGRidXNfZnJlZSAoc29ja2V0X3NlcnZlci0+c29ja2V0X25hbWUpOworICBpZiAoc29ja2V0X3NlcnZlci0+bm9uY2VmaWxlKQorCV9kYnVzX25vbmNlZmlsZV9kZWxldGUgKHNvY2tldF9zZXJ2ZXItPm5vbmNlZmlsZSwgTlVMTCk7CisgIGRidXNfZnJlZSAoc29ja2V0X3NlcnZlci0+bm9uY2VmaWxlKTsKKyAgZGJ1c19mcmVlIChzZXJ2ZXIpOworfQorCisvKiBSZXR1cm4gdmFsdWUgaXMganVzdCBmb3IgbWVtb3J5LCBub3Qgb3RoZXIgZmFpbHVyZXMuICovCitzdGF0aWMgZGJ1c19ib29sX3QKK2hhbmRsZV9uZXdfY2xpZW50X2ZkX2FuZF91bmxvY2sgKERCdXNTZXJ2ZXIgKnNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTb2NrZXQgIGNsaWVudF9mZCkKK3sKKyAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisgIERCdXNUcmFuc3BvcnQgKnRyYW5zcG9ydDsKKyAgREJ1c05ld0Nvbm5lY3Rpb25GdW5jdGlvbiBuZXdfY29ubmVjdGlvbl9mdW5jdGlvbjsKKyAgdm9pZCAqbmV3X2Nvbm5lY3Rpb25fZGF0YTsKKworICBfZGJ1c192ZXJib3NlICgiQ3JlYXRpbmcgbmV3IGNsaWVudCBjb25uZWN0aW9uIHdpdGggZmQgJSIgREJVU19TT0NLRVRfRk9STUFUICJcbiIsCisgICAgICAgICAgICAgICAgIF9kYnVzX3NvY2tldF9wcmludGFibGUgKGNsaWVudF9mZCkpOworCisgIEhBVkVfTE9DS19DSEVDSyAoc2VydmVyKTsKKworICBpZiAoIV9kYnVzX3NldF9zb2NrZXRfbm9uYmxvY2tpbmcgKGNsaWVudF9mZCwgTlVMTCkpCisgICAgeworICAgICAgU0VSVkVSX1VOTE9DSyAoc2VydmVyKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICB0cmFuc3BvcnQgPSBfZGJ1c190cmFuc3BvcnRfbmV3X2Zvcl9zb2NrZXQgKGNsaWVudF9mZCwgJnNlcnZlci0+Z3VpZF9oZXgsIE5VTEwpOworICBpZiAodHJhbnNwb3J0ID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfY2xvc2Vfc29ja2V0IChjbGllbnRfZmQsIE5VTEwpOworICAgICAgU0VSVkVSX1VOTE9DSyAoc2VydmVyKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c190cmFuc3BvcnRfc2V0X2F1dGhfbWVjaGFuaXNtcyAodHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciAqKikgc2VydmVyLT5hdXRoX21lY2hhbmlzbXMpKQorICAgIHsKKyAgICAgIF9kYnVzX3RyYW5zcG9ydF91bnJlZiAodHJhbnNwb3J0KTsKKyAgICAgIFNFUlZFUl9VTkxPQ0sgKHNlcnZlcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIC8qIG5vdGUgdGhhdCBjbGllbnRfZmQgaXMgbm93IG93bmVkIGJ5IHRoZSB0cmFuc3BvcnQsIGFuZCB3aWxsIGJlCisgICAqIGNsb3NlZCBvbiB0cmFuc3BvcnQgZGlzY29ubmVjdGlvbi9maW5hbGl6YXRpb24KKyAgICovCisKKyAgY29ubmVjdGlvbiA9IF9kYnVzX2Nvbm5lY3Rpb25fbmV3X2Zvcl90cmFuc3BvcnQgKHRyYW5zcG9ydCk7CisgIF9kYnVzX3RyYW5zcG9ydF91bnJlZiAodHJhbnNwb3J0KTsKKyAgdHJhbnNwb3J0ID0gTlVMTDsgLyogbm93IHVuZGVyIHRoZSBjb25uZWN0aW9uIGxvY2sgKi8KKworICBpZiAoY29ubmVjdGlvbiA9PSBOVUxMKQorICAgIHsKKyAgICAgIFNFUlZFUl9VTkxPQ0sgKHNlcnZlcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIC8qIFNlZSBpZiBzb21lb25lIHdhbnRzIHRvIGhhbmRsZSB0aGlzIG5ldyBjb25uZWN0aW9uLCBzZWxmLXJlZmVyZW5jaW5nCisgICAqIGZvciBwYXJhbm9pYS4KKyAgICovCisgIG5ld19jb25uZWN0aW9uX2Z1bmN0aW9uID0gc2VydmVyLT5uZXdfY29ubmVjdGlvbl9mdW5jdGlvbjsKKyAgbmV3X2Nvbm5lY3Rpb25fZGF0YSA9IHNlcnZlci0+bmV3X2Nvbm5lY3Rpb25fZGF0YTsKKworICBfZGJ1c19zZXJ2ZXJfcmVmX3VubG9ja2VkIChzZXJ2ZXIpOworICBTRVJWRVJfVU5MT0NLIChzZXJ2ZXIpOworCisgIGlmIChuZXdfY29ubmVjdGlvbl9mdW5jdGlvbikKKyAgICB7CisgICAgICAoKiBuZXdfY29ubmVjdGlvbl9mdW5jdGlvbikgKHNlcnZlciwgY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X2Nvbm5lY3Rpb25fZGF0YSk7CisgICAgfQorICBkYnVzX3NlcnZlcl91bnJlZiAoc2VydmVyKTsKKworICAvKiBJZiBubyBvbmUgZ3JhYmJlZCBhIHJlZmVyZW5jZSwgdGhlIGNvbm5lY3Rpb24gd2lsbCBkaWUuICovCisgIF9kYnVzX2Nvbm5lY3Rpb25fY2xvc2VfaWZfb25seV9vbmVfcmVmIChjb25uZWN0aW9uKTsKKyAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChjb25uZWN0aW9uKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90Citzb2NrZXRfaGFuZGxlX3dhdGNoIChEQnVzV2F0Y2ggICAgKndhdGNoLAorICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICpkYXRhKQoreworICBEQnVzU2VydmVyICpzZXJ2ZXIgPSBkYXRhOworICBEQnVzU2VydmVyU29ja2V0ICpzb2NrZXRfc2VydmVyID0gZGF0YTsKKworI2lmbmRlZiBEQlVTX0RJU0FCTEVfQVNTRVJUCisgIGludCBpOworICBkYnVzX2Jvb2xfdCBmb3VuZCA9IEZBTFNFOworI2VuZGlmCisKKyAgU0VSVkVSX0xPQ0sgKHNlcnZlcik7CisKKyNpZm5kZWYgREJVU19ESVNBQkxFX0FTU0VSVAorICBmb3IgKGkgPSAwIDsgaSA8IHNvY2tldF9zZXJ2ZXItPm5fZmRzIDsgaSsrKQorICAgIHsKKyAgICAgIGlmIChzb2NrZXRfc2VydmVyLT53YXRjaFtpXSA9PSB3YXRjaCkKKyAgICAgICAgZm91bmQgPSBUUlVFOworICAgIH0KKyAgX2RidXNfYXNzZXJ0IChmb3VuZCk7CisjZW5kaWYKKworICBfZGJ1c192ZXJib3NlICgiSGFuZGxpbmcgY2xpZW50IGNvbm5lY3Rpb24sIGZsYWdzIDB4JXhcbiIsIGZsYWdzKTsKKworICBpZiAoZmxhZ3MgJiBEQlVTX1dBVENIX1JFQURBQkxFKQorICAgIHsKKyAgICAgIERCdXNTb2NrZXQgY2xpZW50X2ZkOworICAgICAgREJ1c1NvY2tldCBsaXN0ZW5fZmQ7CisgICAgICBpbnQgc2F2ZWRfZXJybm87CisKKyAgICAgIGxpc3Rlbl9mZCA9IF9kYnVzX3dhdGNoX2dldF9zb2NrZXQgKHdhdGNoKTsKKworICAgICAgaWYgKHNvY2tldF9zZXJ2ZXItPm5vbmNlZmlsZSkKKyAgICAgICAgICBjbGllbnRfZmQgPSBfZGJ1c19hY2NlcHRfd2l0aF9ub25jZWZpbGUgKGxpc3Rlbl9mZCwgc29ja2V0X3NlcnZlci0+bm9uY2VmaWxlKTsKKyAgICAgIGVsc2UgCisgICAgICAgICAgY2xpZW50X2ZkID0gX2RidXNfYWNjZXB0IChsaXN0ZW5fZmQpOworCisgICAgICBzYXZlZF9lcnJubyA9IF9kYnVzX3NhdmVfc29ja2V0X2Vycm5vICgpOworCisgICAgICBpZiAoIV9kYnVzX3NvY2tldF9pc192YWxpZCAoY2xpZW50X2ZkKSkKKyAgICAgICAgeworICAgICAgICAgIC8qIEVJTlRSIGhhbmRsZWQgZm9yIHVzICovCisKKyAgICAgICAgICBpZiAoX2RidXNfZ2V0X2lzX2Vycm5vX2VhZ2Fpbl9vcl9ld291bGRibG9jayAoc2F2ZWRfZXJybm8pKQorICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIk5vIGNsaWVudCBhdmFpbGFibGUgdG8gYWNjZXB0IGFmdGVyIGFsbFxuIik7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkZhaWxlZCB0byBhY2NlcHQgYSBjbGllbnQgY29ubmVjdGlvbjogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvciAoc2F2ZWRfZXJybm8pKTsKKworICAgICAgICAgIFNFUlZFUl9VTkxPQ0sgKHNlcnZlcik7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGlmICghaGFuZGxlX25ld19jbGllbnRfZmRfYW5kX3VubG9jayAoc2VydmVyLCBjbGllbnRfZmQpKQorICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIlJlamVjdGVkIGNsaWVudCBjb25uZWN0aW9uIGR1ZSB0byBsYWNrIG9mIG1lbW9yeVxuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgaWYgKGZsYWdzICYgREJVU19XQVRDSF9FUlJPUikKKyAgICBfZGJ1c192ZXJib3NlICgiRXJyb3Igb24gc2VydmVyIGxpc3RlbmluZyBzb2NrZXRcbiIpOworCisgIGlmIChmbGFncyAmIERCVVNfV0FUQ0hfSEFOR1VQKQorICAgIF9kYnVzX3ZlcmJvc2UgKCJIYW5ndXAgb24gc2VydmVyIGxpc3RlbmluZyBzb2NrZXRcbiIpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorc29ja2V0X2Rpc2Nvbm5lY3QgKERCdXNTZXJ2ZXIgKnNlcnZlcikKK3sKKyAgREJ1c1NlcnZlclNvY2tldCAqc29ja2V0X3NlcnZlciA9IChEQnVzU2VydmVyU29ja2V0Kikgc2VydmVyOworICBpbnQgaTsKKworICBIQVZFX0xPQ0tfQ0hFQ0sgKHNlcnZlcik7CisKKyAgZm9yIChpID0gMCA7IGkgPCBzb2NrZXRfc2VydmVyLT5uX2ZkcyA7IGkrKykKKyAgICB7CisgICAgICBpZiAoc29ja2V0X3NlcnZlci0+d2F0Y2hbaV0pCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19zZXJ2ZXJfcmVtb3ZlX3dhdGNoIChzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0X3NlcnZlci0+d2F0Y2hbaV0pOworICAgICAgICAgIF9kYnVzX3dhdGNoX2ludmFsaWRhdGUgKHNvY2tldF9zZXJ2ZXItPndhdGNoW2ldKTsKKyAgICAgICAgICBfZGJ1c193YXRjaF91bnJlZiAoc29ja2V0X3NlcnZlci0+d2F0Y2hbaV0pOworICAgICAgICAgIHNvY2tldF9zZXJ2ZXItPndhdGNoW2ldID0gTlVMTDsKKyAgICAgICAgfQorCisgICAgICBpZiAoX2RidXNfc29ja2V0X2lzX3ZhbGlkIChzb2NrZXRfc2VydmVyLT5mZHNbaV0pKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfY2xvc2Vfc29ja2V0IChzb2NrZXRfc2VydmVyLT5mZHNbaV0sIE5VTEwpOworICAgICAgICAgIF9kYnVzX3NvY2tldF9pbnZhbGlkYXRlICgmc29ja2V0X3NlcnZlci0+ZmRzW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICBpZiAoc29ja2V0X3NlcnZlci0+c29ja2V0X25hbWUgIT0gTlVMTCkKKyAgICB7CisgICAgICBEQnVzU3RyaW5nIHRtcDsKKyAgICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmdG1wLCBzb2NrZXRfc2VydmVyLT5zb2NrZXRfbmFtZSk7CisgICAgICBfZGJ1c19kZWxldGVfZmlsZSAoJnRtcCwgTlVMTCk7CisgICAgfQorCisgIGlmIChzZXJ2ZXItPnB1Ymxpc2hlZF9hZGRyZXNzKQorICAgICAgX2RidXNfZGFlbW9uX3VucHVibGlzaF9zZXNzaW9uX2J1c19hZGRyZXNzKCk7CisKKyAgSEFWRV9MT0NLX0NIRUNLIChzZXJ2ZXIpOworfQorCitzdGF0aWMgY29uc3QgREJ1c1NlcnZlclZUYWJsZSBzb2NrZXRfdnRhYmxlID0geworICBzb2NrZXRfZmluYWxpemUsCisgIHNvY2tldF9kaXNjb25uZWN0Cit9OworCisvKioKKyAqIENyZWF0ZXMgYSBuZXcgc2VydmVyIGxpc3RlbmluZyBvbiB0aGUgZ2l2ZW4gZmlsZSBkZXNjcmlwdG9yLiAgVGhlCisgKiBmaWxlIGRlc2NyaXB0b3Igc2hvdWxkIGJlIG5vbmJsb2NraW5nICh1c2UKKyAqIF9kYnVzX3NldF9mZF9ub25ibG9ja2luZygpIHRvIG1ha2UgaXQgc28pLiBUaGUgZmlsZSBkZXNjcmlwdG9yCisgKiBzaG91bGQgYmUgbGlzdGVuaW5nIGZvciBjb25uZWN0aW9ucywgdGhhdCBpcywgbGlzdGVuKCkgc2hvdWxkIGhhdmUKKyAqIGJlZW4gc3VjY2Vzc2Z1bGx5IGludm9rZWQgb24gaXQuIFRoZSBzZXJ2ZXIgd2lsbCB1c2UgYWNjZXB0KCkgdG8KKyAqIGFjY2VwdCBuZXcgY2xpZW50IGNvbm5lY3Rpb25zLgorICoKKyAqIEBwYXJhbSBmZHMgbGlzdCBvZiBmaWxlIGRlc2NyaXB0b3JzLgorICogQHBhcmFtIG5fZmRzIG51bWJlciBvZiBmaWxlIGRlc2NyaXB0b3JzCisgKiBAcGFyYW0gYWRkcmVzcyB0aGUgc2VydmVyJ3MgYWRkcmVzcworICogQHBhcmFtIG5vbmNlZmlsZSB0byBiZSB1c2VkIGZvciBhdXRoZW50aWNhdGlvbiAoTlVMTCBpZiBub3QgbmVlZGVkKQorICogQHBhcmFtIGVycm9yIGxvY2F0aW9uIHRvIHN0b3JlIHJlYXNvbiBmb3IgZmFpbHVyZQorICogQHJldHVybnMgdGhlIG5ldyBzZXJ2ZXIsIG9yICNOVUxMIG9uIE9PTSBvciBvdGhlciBlcnJvci4KKyAqCisgKi8KK0RCdXNTZXJ2ZXIqCitfZGJ1c19zZXJ2ZXJfbmV3X2Zvcl9zb2NrZXQgKERCdXNTb2NrZXQgICAgICAgKmZkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgbl9mZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNOb25jZUZpbGUgICAgKm5vbmNlZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCit7CisgIERCdXNTZXJ2ZXJTb2NrZXQgKnNvY2tldF9zZXJ2ZXI7CisgIERCdXNTZXJ2ZXIgKnNlcnZlcjsKKyAgaW50IGk7CisKKyAgc29ja2V0X3NlcnZlciA9IGRidXNfbmV3MCAoREJ1c1NlcnZlclNvY2tldCwgMSk7CisgIGlmIChzb2NrZXRfc2VydmVyID09IE5VTEwpCisgICAgZ290byBmYWlsZWRfMDsKKworICBzb2NrZXRfc2VydmVyLT5ub25jZWZpbGUgPSBub25jZWZpbGU7CisKKyAgc29ja2V0X3NlcnZlci0+ZmRzID0gZGJ1c19uZXcgKERCdXNTb2NrZXQsIG5fZmRzKTsKKyAgaWYgKCFzb2NrZXRfc2VydmVyLT5mZHMpCisgICAgZ290byBmYWlsZWRfMDsKKworICBzb2NrZXRfc2VydmVyLT53YXRjaCA9IGRidXNfbmV3MCAoREJ1c1dhdGNoICosIG5fZmRzKTsKKyAgaWYgKCFzb2NrZXRfc2VydmVyLT53YXRjaCkKKyAgICBnb3RvIGZhaWxlZF8xOworCisgIGZvciAoaSA9IDAgOyBpIDwgbl9mZHMgOyBpKyspCisgICAgeworICAgICAgREJ1c1dhdGNoICp3YXRjaDsKKworICAgICAgd2F0Y2ggPSBfZGJ1c193YXRjaF9uZXcgKF9kYnVzX3NvY2tldF9nZXRfcG9sbGFibGUgKGZkc1tpXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19XQVRDSF9SRUFEQUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldF9oYW5kbGVfd2F0Y2gsIHNvY2tldF9zZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICBpZiAod2F0Y2ggPT0gTlVMTCkKKyAgICAgICAgZ290byBmYWlsZWRfMjsKKworICAgICAgc29ja2V0X3NlcnZlci0+bl9mZHMrKzsKKyAgICAgIHNvY2tldF9zZXJ2ZXItPmZkc1tpXSA9IGZkc1tpXTsKKyAgICAgIHNvY2tldF9zZXJ2ZXItPndhdGNoW2ldID0gd2F0Y2g7CisgICAgfQorCisgIGlmICghX2RidXNfc2VydmVyX2luaXRfYmFzZSAoJnNvY2tldF9zZXJ2ZXItPmJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNvY2tldF92dGFibGUsIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKQorICAgIGdvdG8gZmFpbGVkXzI7CisKKyAgc2VydmVyID0gKERCdXNTZXJ2ZXIqKXNvY2tldF9zZXJ2ZXI7CisKKyAgU0VSVkVSX0xPQ0sgKHNlcnZlcik7CisKKyAgZm9yIChpID0gMCA7IGkgPCBuX2ZkcyA7IGkrKykKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX3NlcnZlcl9hZGRfd2F0Y2ggKCZzb2NrZXRfc2VydmVyLT5iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXRfc2VydmVyLT53YXRjaFtpXSkpCisgICAgICAgIHsKKyAgICAgICAgICBpbnQgajsKKworICAgICAgICAgIC8qIFRoZSBjYWxsZXIgaXMgc3RpbGwgcmVzcG9uc2libGUgZm9yIGNsb3NpbmcgdGhlIGZkcyB1bnRpbAorICAgICAgICAgICAqIHdlIHJldHVybiBzdWNjZXNzZnVsbHksIHNvIGRvbid0IGxldCBzb2NrZXRfZGlzY29ubmVjdCgpCisgICAgICAgICAgICogY2xvc2UgdGhlbSAqLworICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBuX2ZkczsgaisrKQorICAgICAgICAgICAgX2RidXNfc29ja2V0X2ludmFsaWRhdGUgKCZzb2NrZXRfc2VydmVyLT5mZHNbal0pOworCisgICAgICAgICAgLyogc29ja2V0X2Rpc2Nvbm5lY3QoKSB3aWxsIHRyeSB0byByZW1vdmUgYWxsIHRoZSB3YXRjaGVzOworICAgICAgICAgICAqIG1ha2Ugc3VyZSBpdCBkb2Vzbid0IHNlZSB0aGUgb25lcyB0aGF0IHdlcmVuJ3QgZXZlbiBhZGRlZAorICAgICAgICAgICAqIHlldCAqLworICAgICAgICAgIGZvciAoaiA9IGk7IGogPCBuX2ZkczsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c193YXRjaF9pbnZhbGlkYXRlIChzb2NrZXRfc2VydmVyLT53YXRjaFtqXSk7CisgICAgICAgICAgICAgIF9kYnVzX3dhdGNoX3VucmVmIChzb2NrZXRfc2VydmVyLT53YXRjaFtqXSk7CisgICAgICAgICAgICAgIHNvY2tldF9zZXJ2ZXItPndhdGNoW2pdID0gTlVMTDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIF9kYnVzX3NlcnZlcl9kaXNjb25uZWN0X3VubG9ja2VkIChzZXJ2ZXIpOworICAgICAgICAgIFNFUlZFUl9VTkxPQ0sgKHNlcnZlcik7CisgICAgICAgICAgX2RidXNfc2VydmVyX2ZpbmFsaXplX2Jhc2UgKCZzb2NrZXRfc2VydmVyLT5iYXNlKTsKKyAgICAgICAgICBnb3RvIGZhaWxlZF8yOworICAgICAgICB9CisgICAgfQorCisgIFNFUlZFUl9VTkxPQ0sgKHNlcnZlcik7CisKKyAgX2RidXNfc2VydmVyX3RyYWNlX3JlZiAoJnNvY2tldF9zZXJ2ZXItPmJhc2UsIDAsIDEsICJuZXdfZm9yX3NvY2tldCIpOworICByZXR1cm4gKERCdXNTZXJ2ZXIqKSBzb2NrZXRfc2VydmVyOworCisgZmFpbGVkXzI6CisgIGZvciAoaSA9IDAgOyBpIDwgbl9mZHMgOyBpKyspCisgICAgeworICAgICAgaWYgKHNvY2tldF9zZXJ2ZXItPndhdGNoW2ldICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXRjaF9pbnZhbGlkYXRlIChzb2NrZXRfc2VydmVyLT53YXRjaFtpXSk7CisgICAgICAgICAgX2RidXNfd2F0Y2hfdW5yZWYgKHNvY2tldF9zZXJ2ZXItPndhdGNoW2ldKTsKKyAgICAgICAgICBzb2NrZXRfc2VydmVyLT53YXRjaFtpXSA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgIGRidXNfZnJlZSAoc29ja2V0X3NlcnZlci0+d2F0Y2gpOworCisgZmFpbGVkXzE6CisgIGRidXNfZnJlZSAoc29ja2V0X3NlcnZlci0+ZmRzKTsKKworIGZhaWxlZF8wOgorICBkYnVzX2ZyZWUgKHNvY2tldF9zZXJ2ZXIpOworCisgIGlmIChlcnJvciAhPSBOVUxMICYmICFkYnVzX2Vycm9yX2lzX3NldCAoZXJyb3IpKQorICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKworICByZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiBDcmVhdGVzIGEgbmV3IHNlcnZlciBsaXN0ZW5pbmcgb24gVENQLgorICogSWYgaG9zdCBpcyBOVUxMLCBpdCB3aWxsIGRlZmF1bHQgdG8gbG9jYWxob3N0LgorICogSWYgYmluZCBpcyBOVUxMLCBpdCB3aWxsIGRlZmF1bHQgdG8gdGhlIHZhbHVlIGZvciB0aGUgaG9zdAorICogcGFyYW1ldGVyLCBhbmQgaWYgdGhhdCBpcyBOVUxMLCB0aGVuIGxvY2FsaG9zdAorICogSWYgYmluZCBpcyBhIGhvc3RuYW1lLCBpdCB3aWxsIGJlIHJlc29sdmVkIGFuZCB3aWxsIGxpc3RlbgorICogb24gYWxsIHJldHVybmVkIGFkZHJlc3Nlcy4KKyAqIElmIGZhbWlseSBpcyBOVUxMLCBob3N0bmFtZSByZXNvbHV0aW9uIHdpbGwgdHJ5IGFsbCBhZGRyZXNzCisgKiBmYW1pbGllcywgb3RoZXJ3aXNlIGl0IGNhbiBiZSBpcHY0IG9yIGlwdjYgdG8gcmVzdHJpY3QgdGhlCisgKiBhZGRyZXNzZXMgY29uc2lkZXJlZC4KKyAqCisgKiBAcGFyYW0gaG9zdCB0aGUgaG9zdG5hbWUgdG8gcmVwb3J0IGZvciB0aGUgbGlzdGVuIGFkZHJlc3MKKyAqIEBwYXJhbSBiaW5kIHRoZSBob3N0bmFtZSB0byBsaXN0ZW4gb24KKyAqIEBwYXJhbSBwb3J0IHRoZSBwb3J0IHRvIGxpc3RlbiBvbiBvciAwIHRvIGxldCB0aGUgT1MgY2hvb3NlCisgKiBAcGFyYW0gZmFtaWx5CisgKiBAcGFyYW0gZXJyb3IgbG9jYXRpb24gdG8gc3RvcmUgcmVhc29uIGZvciBmYWlsdXJlLgorICogQHBhcmFtIHVzZV9ub25jZSB3aGV0aGVyIHRvIHVzZSBhIG5vbmNlIGZvciBsb3ctbGV2ZWwgYXV0aGVudGljYXRpb24gKG5vbmNlLXRjcCB0cmFuc3BvcnQpIG9yIG5vdCAodGNwIHRyYW5zcG9ydCkKKyAqIEByZXR1cm5zIHRoZSBuZXcgc2VydmVyLCBvciAjTlVMTCBvbiBmYWlsdXJlLgorICovCitEQnVzU2VydmVyKgorX2RidXNfc2VydmVyX25ld19mb3JfdGNwX3NvY2tldCAoY29uc3QgY2hhciAgICAgKmhvc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqYmluZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKmZhbWlseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgIHVzZV9ub25jZSkKK3sKKyAgREJ1c1NlcnZlciAqc2VydmVyOworICBEQnVzU29ja2V0ICpsaXN0ZW5fZmRzID0gTlVMTDsKKyAgaW50IG5saXN0ZW5fZmRzID0gMCwgaTsKKyAgREJ1c1N0cmluZyBhZGRyZXNzOworICBEQnVzU3RyaW5nIGhvc3Rfc3RyOworICBEQnVzU3RyaW5nIHBvcnRfc3RyOworICBEQnVzTm9uY2VGaWxlICpub25jZWZpbGU7CisgIAorICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBub25jZWZpbGUgPSBOVUxMOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZhZGRyZXNzKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmcG9ydF9zdHIpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgZ290byBmYWlsZWRfMDsKKyAgICB9CisKKyAgaWYgKGhvc3QgPT0gTlVMTCkKKyAgICBob3N0ID0gImxvY2FsaG9zdCI7CisKKyAgaWYgKHBvcnQgPT0gTlVMTCkKKyAgICBwb3J0ID0gIjAiOworCisgIGlmIChiaW5kID09IE5VTEwpCisgICAgYmluZCA9IGhvc3Q7CisgIGVsc2UgaWYgKHN0cmNtcCAoYmluZCwgIioiKSA9PSAwKQorICAgIGJpbmQgPSBOVUxMOworCisgIG5saXN0ZW5fZmRzID1fZGJ1c19saXN0ZW5fdGNwX3NvY2tldCAoYmluZCwgcG9ydCwgZmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwb3J0X3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGlzdGVuX2ZkcywgZXJyb3IpOworICBpZiAobmxpc3Rlbl9mZHMgPD0gMCkKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUKGVycm9yKTsKKyAgICAgIGdvdG8gZmFpbGVkXzE7CisgICAgfQorCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmaG9zdF9zdHIsIGhvc3QpOworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhZGRyZXNzLCB1c2Vfbm9uY2UgPyAibm9uY2UtdGNwOmhvc3Q9IiA6ICJ0Y3A6aG9zdD0iKSB8fAorICAgICAgIV9kYnVzX2FkZHJlc3NfYXBwZW5kX2VzY2FwZWQgKCZhZGRyZXNzLCAmaG9zdF9zdHIpIHx8CisgICAgICAhX2RidXNfc3RyaW5nX2FwcGVuZCAoJmFkZHJlc3MsICIscG9ydD0iKSB8fAorICAgICAgIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhZGRyZXNzLCBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEoJnBvcnRfc3RyKSkpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICBnb3RvIGZhaWxlZF8yOworICAgIH0KKyAgaWYgKGZhbWlseSAmJgorICAgICAgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmYWRkcmVzcywgIixmYW1pbHk9IikgfHwKKyAgICAgICAhX2RidXNfc3RyaW5nX2FwcGVuZCAoJmFkZHJlc3MsIGZhbWlseSkpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgZ290byBmYWlsZWRfMjsKKyAgICB9CisKKyAgaWYgKHVzZV9ub25jZSkKKyAgICB7CisgICAgICBub25jZWZpbGUgPSBkYnVzX25ldzAgKERCdXNOb25jZUZpbGUsIDEpOworICAgICAgaWYgKG5vbmNlZmlsZSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICAgICAgZ290byBmYWlsZWRfMjsKKyAgICAgICAgfQorCisgICAgICBpZiAoIV9kYnVzX25vbmNlZmlsZV9jcmVhdGUgKG5vbmNlZmlsZSwgZXJyb3IpKQorICAgICAgICAgIGdvdG8gZmFpbGVkXzM7CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmFkZHJlc3MsICIsbm9uY2VmaWxlPSIpIHx8CisgICAgICAgICAgIV9kYnVzX2FkZHJlc3NfYXBwZW5kX2VzY2FwZWQgKCZhZGRyZXNzLCBfZGJ1c19ub25jZWZpbGVfZ2V0X3BhdGggKG5vbmNlZmlsZSkpKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICAgICAgZ290byBmYWlsZWRfNDsKKyAgICAgICAgfQorCisgICAgfQorCisgIHNlcnZlciA9IF9kYnVzX3NlcnZlcl9uZXdfZm9yX3NvY2tldCAobGlzdGVuX2Zkcywgbmxpc3Rlbl9mZHMsICZhZGRyZXNzLCBub25jZWZpbGUsIGVycm9yKTsKKyAgaWYgKHNlcnZlciA9PSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChub25jZWZpbGUgIT0gTlVMTCkKKyAgICAgICAgZ290byBmYWlsZWRfNDsKKyAgICAgIGVsc2UKKyAgICAgICAgZ290byBmYWlsZWRfMjsKKyAgICB9CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwb3J0X3N0cik7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmYWRkcmVzcyk7CisgIGRidXNfZnJlZShsaXN0ZW5fZmRzKTsKKworICByZXR1cm4gc2VydmVyOworCisgZmFpbGVkXzQ6CisgIF9kYnVzX25vbmNlZmlsZV9kZWxldGUgKG5vbmNlZmlsZSwgTlVMTCk7CisKKyBmYWlsZWRfMzoKKyAgZGJ1c19mcmVlIChub25jZWZpbGUpOworCisgZmFpbGVkXzI6CisgIGZvciAoaSA9IDAgOyBpIDwgbmxpc3Rlbl9mZHMgOyBpKyspCisgICAgX2RidXNfY2xvc2Vfc29ja2V0IChsaXN0ZW5fZmRzW2ldLCBOVUxMKTsKKyAgZGJ1c19mcmVlKGxpc3Rlbl9mZHMpOworCisgZmFpbGVkXzE6CisgIF9kYnVzX3N0cmluZ19mcmVlICgmcG9ydF9zdHIpOworCisgZmFpbGVkXzA6CisgIF9kYnVzX3N0cmluZ19mcmVlICgmYWRkcmVzcyk7CisKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogVHJpZXMgdG8gaW50ZXJwcmV0IHRoZSBhZGRyZXNzIGVudHJ5IGZvciB2YXJpb3VzIHNvY2tldC1yZWxhdGVkCisgKiBhZGRyZXNzZXMgKHdlbGwsIGN1cnJlbnRseSBvbmx5IHRjcCBhbmQgbm9uY2UtdGNwKS4KKyAqCisgKiBTZXRzIGVycm9yIGlmIHRoZSByZXN1bHQgaXMgbm90IE9LLgorICoKKyAqIEBwYXJhbSBlbnRyeSBhbiBhZGRyZXNzIGVudHJ5CisgKiBAcGFyYW0gc2VydmVyX3AgYSBuZXcgREJ1c1NlcnZlciwgb3IgI05VTEwgb24gZmFpbHVyZS4KKyAqIEBwYXJhbSBlcnJvciBsb2NhdGlvbiB0byBzdG9yZSByYXRpb25hbGUgZm9yIGZhaWx1cmUgb24gYmFkIGFkZHJlc3MKKyAqIEByZXR1cm5zIHRoZSBvdXRjb21lCisgKgorICovCitEQnVzU2VydmVyTGlzdGVuUmVzdWx0CitfZGJ1c19zZXJ2ZXJfbGlzdGVuX3NvY2tldCAoREJ1c0FkZHJlc3NFbnRyeSAqZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1NlcnZlciAgICAgICoqc2VydmVyX3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCit7CisgIGNvbnN0IGNoYXIgKm1ldGhvZDsKKworICAqc2VydmVyX3AgPSBOVUxMOworCisgIG1ldGhvZCA9IGRidXNfYWRkcmVzc19lbnRyeV9nZXRfbWV0aG9kIChlbnRyeSk7CisKKyAgaWYgKHN0cmNtcCAobWV0aG9kLCAidGNwIikgPT0gMCB8fCBzdHJjbXAgKG1ldGhvZCwgIm5vbmNlLXRjcCIpID09IDApCisgICAgeworICAgICAgY29uc3QgY2hhciAqaG9zdDsKKyAgICAgIGNvbnN0IGNoYXIgKnBvcnQ7CisgICAgICBjb25zdCBjaGFyICpiaW5kOworICAgICAgY29uc3QgY2hhciAqZmFtaWx5OworCisgICAgICBob3N0ID0gZGJ1c19hZGRyZXNzX2VudHJ5X2dldF92YWx1ZSAoZW50cnksICJob3N0Iik7CisgICAgICBiaW5kID0gZGJ1c19hZGRyZXNzX2VudHJ5X2dldF92YWx1ZSAoZW50cnksICJiaW5kIik7CisgICAgICBwb3J0ID0gZGJ1c19hZGRyZXNzX2VudHJ5X2dldF92YWx1ZSAoZW50cnksICJwb3J0Iik7CisgICAgICBmYW1pbHkgPSBkYnVzX2FkZHJlc3NfZW50cnlfZ2V0X3ZhbHVlIChlbnRyeSwgImZhbWlseSIpOworCisgICAgICAqc2VydmVyX3AgPSBfZGJ1c19zZXJ2ZXJfbmV3X2Zvcl90Y3Bfc29ja2V0IChob3N0LCBiaW5kLCBwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFtaWx5LCBlcnJvciwgc3RyY21wIChtZXRob2QsICJub25jZS10Y3AiKSA9PSAwID8gVFJVRSA6IEZBTFNFKTsKKworICAgICAgaWYgKCpzZXJ2ZXJfcCkKKyAgICAgICAgeworICAgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUihlcnJvcik7CisgICAgICAgICAgcmV0dXJuIERCVVNfU0VSVkVSX0xJU1RFTl9PSzsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVChlcnJvcik7CisgICAgICAgICAgcmV0dXJuIERCVVNfU0VSVkVSX0xJU1RFTl9ESURfTk9UX0NPTk5FQ1Q7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIoZXJyb3IpOworICAgICAgcmV0dXJuIERCVVNfU0VSVkVSX0xJU1RFTl9OT1RfSEFORExFRDsKKyAgICB9Cit9CisKKy8qKgorICogVGhpcyBpcyBhIGJhZCBoYWNrIHNpbmNlIGl0J3MgcmVhbGx5IHVuaXggZG9tYWluIHNvY2tldAorICogc3BlY2lmaWMuIEFsc28sIHRoZSBmdW5jdGlvbiB3ZWlyZGx5IGFkb3B0cyBvd25lcnNoaXAKKyAqIG9mIHRoZSBwYXNzZWQtaW4gc3RyaW5nLgorICoKKyAqIEBwYXJhbSBzZXJ2ZXIgYSBzb2NrZXQgc2VydmVyCisgKiBAcGFyYW0gZmlsZW5hbWUgc29ja2V0IGZpbGVuYW1lIHRvIHJlcG9ydC9kZWxldGUKKyAqCisgKi8KK3ZvaWQKK19kYnVzX3NlcnZlcl9zb2NrZXRfb3duX2ZpbGVuYW1lIChEQnVzU2VydmVyICpzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAqZmlsZW5hbWUpCit7CisgIERCdXNTZXJ2ZXJTb2NrZXQgKnNvY2tldF9zZXJ2ZXIgPSAoREJ1c1NlcnZlclNvY2tldCopIHNlcnZlcjsKKworICBzb2NrZXRfc2VydmVyLT5zb2NrZXRfbmFtZSA9IGZpbGVuYW1lOworfQorCisKKy8qKiBAfSAqLworCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtc2VydmVyLXNvY2tldC5oIGIvZGJ1cy9kYnVzLXNlcnZlci1zb2NrZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTU4OWY3Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLXNlcnZlci1zb2NrZXQuaApAQCAtMCwwICsxLDU2IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtc2VydmVyLXNvY2tldC5oIFNlcnZlciBpbXBsZW1lbnRhdGlvbiBmb3Igc29ja2V0cworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwNiAgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaWZuZGVmIERCVVNfU0VSVkVSX1NPQ0tFVF9ICisjZGVmaW5lIERCVVNfU0VSVkVSX1NPQ0tFVF9ICisKKyNpbmNsdWRlIDxkYnVzL2RidXMtaW50ZXJuYWxzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXNlcnZlci1wcm90ZWN0ZWQuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbm9uY2UuaD4KKworREJVU19CRUdJTl9ERUNMUworCitEQnVzU2VydmVyKiBfZGJ1c19zZXJ2ZXJfbmV3X2Zvcl9zb2NrZXQgICAgICAgICAgIChEQnVzU29ja2V0ICAgICAgICpmZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBuX2ZkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTm9uY2VGaWxlICAgICpub25jZWZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcik7CitEQnVzU2VydmVyKiBfZGJ1c19zZXJ2ZXJfbmV3X2Zvcl9hdXRvbGF1bmNoICAgICAgIChjb25zdCBEQnVzU3RyaW5nICphZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpOworREJVU19QUklWQVRFX0VYUE9SVAorREJ1c1NlcnZlciogX2RidXNfc2VydmVyX25ld19mb3JfdGNwX3NvY2tldCAgICAgICAoY29uc3QgY2hhciAgICAgICAqaG9zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKmJpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICpwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqZmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgIHVzZV9ub25jZSk7CitEQnVzU2VydmVyTGlzdGVuUmVzdWx0IF9kYnVzX3NlcnZlcl9saXN0ZW5fc29ja2V0IChEQnVzQWRkcmVzc0VudHJ5ICAqZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU2VydmVyICAgICAgICoqc2VydmVyX3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAqZXJyb3IpOworCisKK3ZvaWQgX2RidXNfc2VydmVyX3NvY2tldF9vd25fZmlsZW5hbWUgKERCdXNTZXJ2ZXIgKnNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgKmZpbGVuYW1lKTsKKworREJVU19FTkRfREVDTFMKKworI2VuZGlmIC8qIERCVVNfU0VSVkVSX1NPQ0tFVF9IICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtc2VydmVyLXVuaXguYyBiL2RidXMvZGJ1cy1zZXJ2ZXItdW5peC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3YWNlMmIKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtc2VydmVyLXVuaXguYwpAQCAtMCwwICsxLDM4NCBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXNlcnZlci11bml4LmMgU2VydmVyIGltcGxlbWVudGF0aW9uIGZvciBVbml4IG5ldHdvcmsgcHJvdG9jb2xzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMywgMjAwNCAgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKyNpbmNsdWRlICJkYnVzLXNlcnZlci11bml4LmgiCisjaW5jbHVkZSAiZGJ1cy1zZXJ2ZXItc29ja2V0LmgiCisjaW5jbHVkZSAiZGJ1cy1zZXJ2ZXItbGF1bmNoZC5oIgorI2luY2x1ZGUgImRidXMtdHJhbnNwb3J0LXVuaXguaCIKKyNpbmNsdWRlICJkYnVzLWNvbm5lY3Rpb24taW50ZXJuYWwuaCIKKyNpbmNsdWRlICJkYnVzLXN5c2RlcHMtdW5peC5oIgorI2luY2x1ZGUgImRidXMtc3RyaW5nLmgiCisKKy8qKgorICogQGRlZmdyb3VwIERCdXNTZXJ2ZXJVbml4IERCdXNTZXJ2ZXIgaW1wbGVtZW50YXRpb25zIGZvciBVTklYCisgKiBAaW5ncm91cCAgREJ1c0ludGVybmFscworICogQGJyaWVmIEltcGxlbWVudGF0aW9uIGRldGFpbHMgb2YgREJ1c1NlcnZlciBvbiBVTklYCisgKgorICogQHsKKyAqLworCisvKioKKyAqIFRyaWVzIHRvIGludGVycHJldCB0aGUgYWRkcmVzcyBlbnRyeSBpbiBhIHBsYXRmb3JtLXNwZWNpZmljCisgKiB3YXksIGNyZWF0aW5nIGEgcGxhdGZvcm0tc3BlY2lmaWMgc2VydmVyIHR5cGUgaWYgYXBwcm9wcmlhdGUuCisgKiBTZXRzIGVycm9yIGlmIHRoZSByZXN1bHQgaXMgbm90IE9LLgorICoKKyAqIEBwYXJhbSBlbnRyeSBhbiBhZGRyZXNzIGVudHJ5CisgKiBAcGFyYW0gc2VydmVyX3AgbG9jYXRpb24gdG8gc3RvcmUgYSBuZXcgREJ1c1NlcnZlciwgb3IgI05VTEwgb24gZmFpbHVyZS4KKyAqIEBwYXJhbSBlcnJvciBsb2NhdGlvbiB0byBzdG9yZSByYXRpb25hbGUgZm9yIGZhaWx1cmUgb24gYmFkIGFkZHJlc3MKKyAqIEByZXR1cm5zIHRoZSBvdXRjb21lCisgKgorICovCitEQnVzU2VydmVyTGlzdGVuUmVzdWx0CitfZGJ1c19zZXJ2ZXJfbGlzdGVuX3BsYXRmb3JtX3NwZWNpZmljIChEQnVzQWRkcmVzc0VudHJ5ICplbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTZXJ2ZXIgICAgICAqKnNlcnZlcl9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCit7CisgIGNvbnN0IGNoYXIgKm1ldGhvZDsKKworICAqc2VydmVyX3AgPSBOVUxMOworCisgIG1ldGhvZCA9IGRidXNfYWRkcmVzc19lbnRyeV9nZXRfbWV0aG9kIChlbnRyeSk7CisKKyAgaWYgKHN0cmNtcCAobWV0aG9kLCAidW5peCIpID09IDApCisgICAgeworICAgICAgY29uc3QgY2hhciAqcGF0aCA9IGRidXNfYWRkcmVzc19lbnRyeV9nZXRfdmFsdWUgKGVudHJ5LCAicGF0aCIpOworICAgICAgY29uc3QgY2hhciAqZGlyID0gZGJ1c19hZGRyZXNzX2VudHJ5X2dldF92YWx1ZSAoZW50cnksICJkaXIiKTsKKyAgICAgIGNvbnN0IGNoYXIgKnRtcGRpciA9IGRidXNfYWRkcmVzc19lbnRyeV9nZXRfdmFsdWUgKGVudHJ5LCAidG1wZGlyIik7CisgICAgICBjb25zdCBjaGFyICphYnN0cmFjdCA9IGRidXNfYWRkcmVzc19lbnRyeV9nZXRfdmFsdWUgKGVudHJ5LCAiYWJzdHJhY3QiKTsKKyAgICAgIGNvbnN0IGNoYXIgKnJ1bnRpbWUgPSBkYnVzX2FkZHJlc3NfZW50cnlfZ2V0X3ZhbHVlIChlbnRyeSwgInJ1bnRpbWUiKTsKKyAgICAgIGludCBtdXR1YWxseV9leGNsdXNpdmVfbW9kZXMgPSAwOworCisgICAgICBtdXR1YWxseV9leGNsdXNpdmVfbW9kZXMgPSAocGF0aCAhPSBOVUxMKSArICh0bXBkaXIgIT0gTlVMTCkgKworICAgICAgICAoYWJzdHJhY3QgIT0gTlVMTCkgKyAocnVudGltZSAhPSBOVUxMKSArIChkaXIgIT0gTlVMTCk7CisKKyAgICAgIGlmIChtdXR1YWxseV9leGNsdXNpdmVfbW9kZXMgPCAxKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfc2V0X2JhZF9hZGRyZXNzKGVycm9yLCAidW5peCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXRoIG9yIHRtcGRpciBvciBhYnN0cmFjdCBvciBydW50aW1lIG9yIGRpciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICAgIHJldHVybiBEQlVTX1NFUlZFUl9MSVNURU5fQkFEX0FERFJFU1M7CisgICAgICAgIH0KKworICAgICAgaWYgKG11dHVhbGx5X2V4Y2x1c2l2ZV9tb2RlcyA+IDEpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19zZXRfYmFkX2FkZHJlc3MoZXJyb3IsIE5VTEwsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjYW5ub3Qgc3BlY2lmeSB0d28gb2YgXCJwYXRoXCIsIFwidG1wZGlyXCIsIFwiYWJzdHJhY3RcIiwgXCJydW50aW1lXCIgYW5kIFwiZGlyXCIgYXQgdGhlIHNhbWUgdGltZSIpOworICAgICAgICAgIHJldHVybiBEQlVTX1NFUlZFUl9MSVNURU5fQkFEX0FERFJFU1M7CisgICAgICAgIH0KKworICAgICAgaWYgKHJ1bnRpbWUgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIERCdXNTdHJpbmcgZnVsbF9wYXRoOworICAgICAgICAgIERCdXNTdHJpbmcgZmlsZW5hbWU7CisgICAgICAgICAgY29uc3QgY2hhciAqcnVudGltZWRpcjsKKworICAgICAgICAgIGlmIChzdHJjbXAgKHJ1bnRpbWUsICJ5ZXMiKSAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c19zZXRfYmFkX2FkZHJlc3MoZXJyb3IsIE5VTEwsIE5VTEwsCisgICAgICAgICAgICAgICAgICAiaWYgZ2l2ZW4sIHRoZSBvbmx5IHZhbHVlIGFsbG93ZWQgZm9yIFwicnVudGltZVwiIGlzIFwieWVzXCIiKTsKKyAgICAgICAgICAgICAgcmV0dXJuIERCVVNfU0VSVkVSX0xJU1RFTl9CQURfQUREUkVTUzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIHJ1bnRpbWVkaXIgPSBfZGJ1c19nZXRlbnYgKCJYREdfUlVOVElNRV9ESVIiKTsKKworICAgICAgICAgIGlmIChydW50aW1lZGlyID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwKKyAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfTk9UX1NVUFBPUlRFRCwgIlwiWERHX1JVTlRJTUVfRElSXCIgaXMgbm90IHNldCIpOworICAgICAgICAgICAgICByZXR1cm4gREJVU19TRVJWRVJfTElTVEVOX0RJRF9OT1RfQ09OTkVDVDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmZmlsZW5hbWUsICJidXMiKTsKKworICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZmdWxsX3BhdGgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgICAgIHJldHVybiBEQlVTX1NFUlZFUl9MSVNURU5fRElEX05PVF9DT05ORUNUOworICAgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmZnVsbF9wYXRoLCBydW50aW1lZGlyKSB8fAorICAgICAgICAgICAgICAhX2RidXNfY29uY2F0X2Rpcl9hbmRfZmlsZSAoJmZ1bGxfcGF0aCwgJmZpbGVuYW1lKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmdWxsX3BhdGgpOworICAgICAgICAgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgICAgIHJldHVybiBEQlVTX1NFUlZFUl9MSVNURU5fRElEX05PVF9DT05ORUNUOworICAgICAgICAgICAgfQorCisgICAgICAgICAgLyogV2UgY2FuIHNhZmVseSB1c2UgZmlsZXN5c3RlbSBzb2NrZXRzIGluIHRoZSBydW50aW1lIGRpcmVjdG9yeSwKKyAgICAgICAgICAgKiBhbmQgdGhleSBhcmUgcHJlZmVycmVkIGJlY2F1c2UgdGhleSBjYW4gYmUgYmluZC1tb3VudGVkIGJldHdlZW4KKyAgICAgICAgICAgKiBMaW51eCBjb250YWluZXJzLiAqLworICAgICAgICAgICpzZXJ2ZXJfcCA9IF9kYnVzX3NlcnZlcl9uZXdfZm9yX2RvbWFpbl9zb2NrZXQgKAorICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZmdWxsX3BhdGgpLAorICAgICAgICAgICAgICBGQUxTRSwgZXJyb3IpOworCisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmdWxsX3BhdGgpOworICAgICAgICB9CisgICAgICBlbHNlIGlmICh0bXBkaXIgIT0gTlVMTCB8fCBkaXIgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIERCdXNTdHJpbmcgZnVsbF9wYXRoOworICAgICAgICAgIERCdXNTdHJpbmcgZmlsZW5hbWU7CisgICAgICAgICAgZGJ1c19ib29sX3QgdXNlX2Fic3RyYWN0ID0gRkFMU0U7CisKKyAgICAgICAgICBpZiAodG1wZGlyICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRpciA9IHRtcGRpcjsKKworI2lmZGVmIF9fbGludXhfXworICAgICAgICAgICAgICAvKiBVc2UgYWJzdHJhY3Qgc29ja2V0cyBmb3IgdG1wZGlyIGlmIHN1cHBvcnRlZCwgc28gdGhhdCBpdAorICAgICAgICAgICAgICAgKiBuZXZlciBuZWVkcyB0byBiZSBjbGVhbmVkIHVwLiBVc2UgZGlyIGluc3RlYWQgaWYgeW91IHdhbnQgYQorICAgICAgICAgICAgICAgKiBwYXRoLWJhc2VkIHNvY2tldC4gKi8KKyAgICAgICAgICAgICAgdXNlX2Fic3RyYWN0ID0gVFJVRTsKKyNlbmRpZgorICAgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmZ1bGxfcGF0aCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgICAgICAgICByZXR1cm4gREJVU19TRVJWRVJfTElTVEVOX0RJRF9OT1RfQ09OTkVDVDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZmaWxlbmFtZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmZnVsbF9wYXRoKTsKKyAgICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICAgICAgICAgIHJldHVybiBEQlVTX1NFUlZFUl9MSVNURU5fRElEX05PVF9DT05ORUNUOworICAgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmZmlsZW5hbWUsICJkYnVzLSIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZ1bGxfcGF0aCk7CisgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmZmlsZW5hbWUpOworICAgICAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgICAgICAgICAgcmV0dXJuIERCVVNfU0VSVkVSX0xJU1RFTl9ESURfTk9UX0NPTk5FQ1Q7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoIV9kYnVzX2dlbmVyYXRlX3JhbmRvbV9hc2NpaSAoJmZpbGVuYW1lLCAxMCwgZXJyb3IpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZ1bGxfcGF0aCk7CisgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmZmlsZW5hbWUpOworICAgICAgICAgICAgICByZXR1cm4gREJVU19TRVJWRVJfTElTVEVOX0RJRF9OT1RfQ09OTkVDVDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmZ1bGxfcGF0aCwgZGlyKSB8fAorICAgICAgICAgICAgICAhX2RidXNfY29uY2F0X2Rpcl9hbmRfZmlsZSAoJmZ1bGxfcGF0aCwgJmZpbGVuYW1lKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmdWxsX3BhdGgpOworICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZpbGVuYW1lKTsKKyAgICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICAgICAgICAgIHJldHVybiBEQlVTX1NFUlZFUl9MSVNURU5fRElEX05PVF9DT05ORUNUOworICAgICAgICAgICAgfQorCisgICAgICAgICAgKnNlcnZlcl9wID0KKyAgICAgICAgICAgIF9kYnVzX3NlcnZlcl9uZXdfZm9yX2RvbWFpbl9zb2NrZXQgKF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmZ1bGxfcGF0aCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VfYWJzdHJhY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7CisKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZ1bGxfcGF0aCk7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmaWxlbmFtZSk7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGlmIChwYXRoKQorICAgICAgICAgICAgKnNlcnZlcl9wID0gX2RidXNfc2VydmVyX25ld19mb3JfZG9tYWluX3NvY2tldCAocGF0aCwgRkFMU0UsIGVycm9yKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICAqc2VydmVyX3AgPSBfZGJ1c19zZXJ2ZXJfbmV3X2Zvcl9kb21haW5fc29ja2V0IChhYnN0cmFjdCwgVFJVRSwgZXJyb3IpOworICAgICAgICB9CisKKyAgICAgIGlmICgqc2VydmVyX3AgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUihlcnJvcik7CisgICAgICAgICAgcmV0dXJuIERCVVNfU0VSVkVSX0xJU1RFTl9PSzsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVChlcnJvcik7CisgICAgICAgICAgcmV0dXJuIERCVVNfU0VSVkVSX0xJU1RFTl9ESURfTk9UX0NPTk5FQ1Q7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UgaWYgKHN0cmNtcCAobWV0aG9kLCAic3lzdGVtZCIpID09IDApCisgICAgeworICAgICAgaW50IGksIG47CisgICAgICBEQnVzU29ja2V0ICpmZHM7CisgICAgICBEQnVzU3RyaW5nIGFkZHJlc3M7CisKKyAgICAgIG4gPSBfZGJ1c19saXN0ZW5fc3lzdGVtZF9zb2NrZXRzICgmZmRzLCBlcnJvcik7CisgICAgICBpZiAobiA8IDApCisgICAgICAgIHsKKyAgICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICAgICAgcmV0dXJuIERCVVNfU0VSVkVSX0xJU1RFTl9ESURfTk9UX0NPTk5FQ1Q7CisgICAgICAgIH0KKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmFkZHJlc3MpKQorICAgICAgICAgIGdvdG8gc3lzdGVtZF9vb207CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoaSA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmFkZHJlc3MsICI7IikpCisgICAgICAgICAgICAgICAgZ290byBzeXN0ZW1kX29vbTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoIV9kYnVzX2FwcGVuZF9hZGRyZXNzX2Zyb21fc29ja2V0IChmZHNbaV0sICZhZGRyZXNzLCBlcnJvcikpCisgICAgICAgICAgICBnb3RvIHN5c3RlbWRfZXJyOworICAgICAgICB9CisKKyAgICAgICpzZXJ2ZXJfcCA9IF9kYnVzX3NlcnZlcl9uZXdfZm9yX3NvY2tldCAoZmRzLCBuLCAmYWRkcmVzcywgTlVMTCwgZXJyb3IpOworICAgICAgaWYgKCpzZXJ2ZXJfcCA9PSBOVUxMKQorICAgICAgICBnb3RvIHN5c3RlbWRfZXJyOworCisgICAgICBkYnVzX2ZyZWUgKGZkcyk7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmFkZHJlc3MpOworCisgICAgICByZXR1cm4gREJVU19TRVJWRVJfTElTVEVOX09LOworCisgIHN5c3RlbWRfb29tOgorICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICBzeXN0ZW1kX2VycjoKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19jbG9zZV9zb2NrZXQgKGZkc1tpXSwgTlVMTCk7CisgICAgICAgIH0KKyAgICAgIGRidXNfZnJlZSAoZmRzKTsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmYWRkcmVzcyk7CisKKyAgICAgIHJldHVybiBEQlVTX1NFUlZFUl9MSVNURU5fRElEX05PVF9DT05ORUNUOworICAgIH0KKyNpZmRlZiBEQlVTX0VOQUJMRV9MQVVOQ0hECisgIGVsc2UgaWYgKHN0cmNtcCAobWV0aG9kLCAibGF1bmNoZCIpID09IDApCisgICAgeworICAgICAgY29uc3QgY2hhciAqbGF1bmNoZF9lbnZfdmFyID0gZGJ1c19hZGRyZXNzX2VudHJ5X2dldF92YWx1ZSAoZW50cnksICJlbnYiKTsKKyAgICAgIGlmIChsYXVuY2hkX2Vudl92YXIgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3NldF9iYWRfYWRkcmVzcyAoZXJyb3IsICJsYXVuY2hkIiwgImVudiIsIE5VTEwpOworICAgICAgICAgIHJldHVybiBEQlVTX1NFUlZFUl9MSVNURU5fRElEX05PVF9DT05ORUNUOworICAgICAgICB9CisgICAgICAqc2VydmVyX3AgPSBfZGJ1c19zZXJ2ZXJfbmV3X2Zvcl9sYXVuY2hkIChsYXVuY2hkX2Vudl92YXIsIGVycm9yKTsKKworICAgICAgaWYgKCpzZXJ2ZXJfcCAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSKGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gREJVU19TRVJWRVJfTElTVEVOX09LOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUKGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gREJVU19TRVJWRVJfTElTVEVOX0RJRF9OT1RfQ09OTkVDVDsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorICBlbHNlCisgICAgeworICAgICAgLyogSWYgd2UgZG9uJ3QgaGFuZGxlIHRoZSBtZXRob2QsIHdlIHJldHVybiBOVUxMIHdpdGggdGhlCisgICAgICAgKiBlcnJvciB1bnNldAorICAgICAgICovCisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIoZXJyb3IpOworICAgICAgcmV0dXJuIERCVVNfU0VSVkVSX0xJU1RFTl9OT1RfSEFORExFRDsKKyAgICB9Cit9CisKKy8qKgorICogQ3JlYXRlcyBhIG5ldyBzZXJ2ZXIgbGlzdGVuaW5nIG9uIHRoZSBnaXZlbiBVbml4IGRvbWFpbiBzb2NrZXQuCisgKgorICogQHBhcmFtIHBhdGggdGhlIHBhdGggZm9yIHRoZSBkb21haW4gc29ja2V0LgorICogQHBhcmFtIGFic3RyYWN0ICNUUlVFIHRvIHVzZSBhYnN0cmFjdCBzb2NrZXQgbmFtZXNwYWNlCisgKiBAcGFyYW0gZXJyb3IgbG9jYXRpb24gdG8gc3RvcmUgcmVhc29uIGZvciBmYWlsdXJlLgorICogQHJldHVybnMgdGhlIG5ldyBzZXJ2ZXIsIG9yICNOVUxMIG9uIGZhaWx1cmUuCisgKi8KK0RCdXNTZXJ2ZXIqCitfZGJ1c19zZXJ2ZXJfbmV3X2Zvcl9kb21haW5fc29ja2V0IChjb25zdCBjaGFyICAgICAqcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICBhYnN0cmFjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgREJ1c1NlcnZlciAqc2VydmVyOworICBEQnVzU29ja2V0IGxpc3Rlbl9mZDsKKyAgREJ1c1N0cmluZyBhZGRyZXNzOworICBjaGFyICpwYXRoX2NvcHk7CisgIERCdXNTdHJpbmcgcGF0aF9zdHI7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmFkZHJlc3MpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmcGF0aF9zdHIsIHBhdGgpOworICBpZiAoKGFic3RyYWN0ICYmCisgICAgICAgIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhZGRyZXNzLCAidW5peDphYnN0cmFjdD0iKSkgfHwKKyAgICAgICghYWJzdHJhY3QgJiYKKyAgICAgICAhX2RidXNfc3RyaW5nX2FwcGVuZCAoJmFkZHJlc3MsICJ1bml4OnBhdGg9IikpIHx8CisgICAgICAhX2RidXNfYWRkcmVzc19hcHBlbmRfZXNjYXBlZCAoJmFkZHJlc3MsICZwYXRoX3N0cikpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICBnb3RvIGZhaWxlZF8wOworICAgIH0KKworICBpZiAoYWJzdHJhY3QpCisgICAgeworICAgICAgcGF0aF9jb3B5ID0gTlVMTDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBwYXRoX2NvcHkgPSBfZGJ1c19zdHJkdXAgKHBhdGgpOworICAgICAgaWYgKHBhdGhfY29weSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICAgICAgZ290byBmYWlsZWRfMDsKKyAgICAgICAgfQorICAgIH0KKworICBsaXN0ZW5fZmQuZmQgPSBfZGJ1c19saXN0ZW5fdW5peF9zb2NrZXQgKHBhdGgsIGFic3RyYWN0LCBlcnJvcik7CisKKyAgaWYgKGxpc3Rlbl9mZC5mZCA8IDApCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgZ290byBmYWlsZWRfMTsKKyAgICB9CisKKyAgc2VydmVyID0gX2RidXNfc2VydmVyX25ld19mb3Jfc29ja2V0ICgmbGlzdGVuX2ZkLCAxLCAmYWRkcmVzcywgMCwgZXJyb3IpOworICBpZiAoc2VydmVyID09IE5VTEwpCisgICAgeworICAgICAgZ290byBmYWlsZWRfMjsKKyAgICB9CisKKyAgaWYgKHBhdGhfY29weSAhPSBOVUxMKQorICAgIF9kYnVzX3NlcnZlcl9zb2NrZXRfb3duX2ZpbGVuYW1lKHNlcnZlciwgcGF0aF9jb3B5KTsKKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmFkZHJlc3MpOworCisgIHJldHVybiBzZXJ2ZXI7CisKKyBmYWlsZWRfMjoKKyAgX2RidXNfY2xvc2Vfc29ja2V0IChsaXN0ZW5fZmQsIE5VTEwpOworIGZhaWxlZF8xOgorICBkYnVzX2ZyZWUgKHBhdGhfY29weSk7CisgZmFpbGVkXzA6CisgIF9kYnVzX3N0cmluZ19mcmVlICgmYWRkcmVzcyk7CisKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKiBAfSAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLXNlcnZlci11bml4LmggYi9kYnVzL2RidXMtc2VydmVyLXVuaXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmI5OTZjCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLXNlcnZlci11bml4LmgKQEAgLTAsMCArMSwzNyBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXNlcnZlci11bml4LmggU2VydmVyIGltcGxlbWVudGF0aW9uIGZvciBVbml4IG5ldHdvcmsgcHJvdG9jb2xzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiAgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaWZuZGVmIERCVVNfU0VSVkVSX1VOSVhfSAorI2RlZmluZSBEQlVTX1NFUlZFUl9VTklYX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy1pbnRlcm5hbHMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc2VydmVyLXByb3RlY3RlZC5oPgorCitEQlVTX0JFR0lOX0RFQ0xTCisKK0RCdXNTZXJ2ZXIqIF9kYnVzX3NlcnZlcl9uZXdfZm9yX2RvbWFpbl9zb2NrZXQgKGNvbnN0IGNoYXIgICAgICAgKnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICBhYnN0cmFjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKTsKKworREJVU19FTkRfREVDTFMKKworI2VuZGlmIC8qIERCVVNfU0VSVkVSX1VOSVhfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLXNlcnZlci13aW4uYyBiL2RidXMvZGJ1cy1zZXJ2ZXItd2luLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI2ZGE0OAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1zZXJ2ZXItd2luLmMKQEAgLTAsMCArMSw5NiBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXNlcnZlci13aW4uYyBTZXJ2ZXIgaW1wbGVtZW50YXRpb24gZm9yIFdJTiBuZXR3b3JrIHByb3RvY29scy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMsIDIwMDQgIFJlZCBIYXQgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJhbGYgSGFiYWNrZXIgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgImRidXMtaW50ZXJuYWxzLmgiCisjaW5jbHVkZSAiZGJ1cy1zZXJ2ZXItd2luLmgiCisjaW5jbHVkZSAiZGJ1cy1zZXJ2ZXItc29ja2V0LmgiCisKKy8qKgorICogQGRlZmdyb3VwIERCdXNTZXJ2ZXJXaW4gREJ1c1NlcnZlciBpbXBsZW1lbnRhdGlvbnMgZm9yIFdpbmRvd3MKKyAqIEBpbmdyb3VwICBEQnVzSW50ZXJuYWxzCisgKiBAYnJpZWYgSW1wbGVtZW50YXRpb24gZGV0YWlscyBvZiBEQnVzU2VydmVyIG9uIFdpbmRvd3MgCisgKgorICogQHsKKyAqLworCisvKioKKyAqIFRyaWVzIHRvIGludGVycHJldCB0aGUgYWRkcmVzcyBlbnRyeSBpbiBhIHBsYXRmb3JtLXNwZWNpZmljCisgKiB3YXksIGNyZWF0aW5nIGEgcGxhdGZvcm0tc3BlY2lmaWMgc2VydmVyIHR5cGUgaWYgYXBwcm9wcmlhdGUuCisgKiBTZXRzIGVycm9yIGlmIHRoZSByZXN1bHQgaXMgbm90IE9LLgorICogCisgKiBAcGFyYW0gZW50cnkgYW4gYWRkcmVzcyBlbnRyeQorICogQHBhcmFtIHNlcnZlcl9wIGxvY2F0aW9uIHRvIHN0b3JlIGEgbmV3IERCdXNTZXJ2ZXIsIG9yICNOVUxMIG9uIGZhaWx1cmUuCisgKiBAcGFyYW0gZXJyb3IgbG9jYXRpb24gdG8gc3RvcmUgcmF0aW9uYWxlIGZvciBmYWlsdXJlIG9uIGJhZCBhZGRyZXNzCisgKiBAcmV0dXJucyB0aGUgb3V0Y29tZQorICogCisgKi8KK0RCdXNTZXJ2ZXJMaXN0ZW5SZXN1bHQKK19kYnVzX3NlcnZlcl9saXN0ZW5fcGxhdGZvcm1fc3BlY2lmaWMgKERCdXNBZGRyZXNzRW50cnkgKmVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1NlcnZlciAgICAgICoqc2VydmVyX3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgY29uc3QgY2hhciAqbWV0aG9kOworCisgICpzZXJ2ZXJfcCAgPSBOVUxMOworCisgIG1ldGhvZCA9IGRidXNfYWRkcmVzc19lbnRyeV9nZXRfbWV0aG9kIChlbnRyeSk7CisKKyAgaWYgKHN0cmNtcCAobWV0aG9kLCAiYXV0b2xhdW5jaCIpID09IDApCisgICAgeworICAgICAgY29uc3QgY2hhciAqaG9zdCA9ICJsb2NhbGhvc3QiOworICAgICAgY29uc3QgY2hhciAqYmluZCA9ICJsb2NhbGhvc3QiOworICAgICAgY29uc3QgY2hhciAqcG9ydCA9ICIwIjsKKyAgICAgIGNvbnN0IGNoYXIgKmZhbWlseSA9ICJpcHY0IjsKKyAgICAgIGNvbnN0IGNoYXIgKnNjb3BlID0gZGJ1c19hZGRyZXNzX2VudHJ5X2dldF92YWx1ZSAoZW50cnksICJzY29wZSIpOworCisgICAgICBpZiAoX2RidXNfZGFlbW9uX2lzX3Nlc3Npb25fYnVzX2FkZHJlc3NfcHVibGlzaGVkIChzY29wZSkpCisgICAgICAgICAgcmV0dXJuIERCVVNfU0VSVkVSX0xJU1RFTl9BRERSRVNTX0FMUkVBRFlfVVNFRDsKKworICAgICAgKnNlcnZlcl9wID0gX2RidXNfc2VydmVyX25ld19mb3JfdGNwX3NvY2tldCAoaG9zdCwgYmluZCwgcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbWlseSwgZXJyb3IsIEZBTFNFKTsKKyAgICAgIGlmICgqc2VydmVyX3ApCisgICAgICAgIHsKKyAgICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIoZXJyb3IpOworICAgICAgICAgICgqc2VydmVyX3ApLT5wdWJsaXNoZWRfYWRkcmVzcyA9CisgICAgICAgICAgICAgIF9kYnVzX2RhZW1vbl9wdWJsaXNoX3Nlc3Npb25fYnVzX2FkZHJlc3MgKCgqc2VydmVyX3ApLT5hZGRyZXNzLCBzY29wZSk7CisgICAgICAgICAgcmV0dXJuIERCVVNfU0VSVkVSX0xJU1RFTl9PSzsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgLy8gbWFrZSBzdXJlIG5vIGhhbmRsZSBpcyBvcGVuCisgICAgICAgICAgX2RidXNfZGFlbW9uX3VucHVibGlzaF9zZXNzaW9uX2J1c19hZGRyZXNzICgpOworICAgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQoZXJyb3IpOworICAgICAgICAgIHJldHVybiBEQlVTX1NFUlZFUl9MSVNURU5fRElEX05PVF9DT05ORUNUOworICAgICAgICB9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUihlcnJvcik7CisgICAgICAgcmV0dXJuIERCVVNfU0VSVkVSX0xJU1RFTl9OT1RfSEFORExFRDsKKyAgICB9Cit9CisKKy8qKiBAfSAqLworCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtc2VydmVyLXdpbi5oIGIvZGJ1cy9kYnVzLXNlcnZlci13aW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWMyNzU2Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLXNlcnZlci13aW4uaApAQCAtMCwwICsxLDM2IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtc2VydmVyLXdpbi5oIFNlcnZlciBpbXBsZW1lbnRhdGlvbiBmb3Igd2luZG93cyBuZXR3b3JrIHByb3RvY29scy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgIFJlZCBIYXQgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDA3ICBSYWxmIEhhYmFja2VyIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaWZuZGVmIERCVVNfU0VSVkVSX1dJTl9ICisjZGVmaW5lIERCVVNfU0VSVkVSX1dJTl9ICisKKyNpbmNsdWRlIDxkYnVzL2RidXMtaW50ZXJuYWxzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXNlcnZlci1wcm90ZWN0ZWQuaD4KKworREJVU19CRUdJTl9ERUNMUworCisvKiBhZGQgZGVmaW5pdGlvbnMgaGVyZSAqLworCitEQlVTX0VORF9ERUNMUworCisjZW5kaWYgLyogREJVU19TRVJWRVJfV0lOX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1zZXJ2ZXIuYyBiL2RidXMvZGJ1cy1zZXJ2ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTEyNDNiCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLXNlcnZlci5jCkBAIC0wLDAgKzEsMTI0OCBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXNlcnZlci5jIERCdXNTZXJ2ZXIgb2JqZWN0CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1IFJlZCBIYXQgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLyAKKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgImRidXMtc2VydmVyLmgiCisjaW5jbHVkZSAiZGJ1cy1zZXJ2ZXItdW5peC5oIgorI2luY2x1ZGUgImRidXMtc2VydmVyLXNvY2tldC5oIgorI2luY2x1ZGUgImRidXMtc3RyaW5nLmgiCisjaWZkZWYgREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMKKyNpbmNsdWRlICJkYnVzLXNlcnZlci1kZWJ1Zy1waXBlLmgiCisjZW5kaWYKKyNpbmNsdWRlICJkYnVzLWFkZHJlc3MuaCIKKyNpbmNsdWRlICJkYnVzLXByb3RvY29sLmgiCisKKy8qKgorICogQGRlZmdyb3VwIERCdXNTZXJ2ZXIgREJ1c1NlcnZlcgorICogQGluZ3JvdXAgIERCdXMKKyAqIEBicmllZiBTZXJ2ZXIgdGhhdCBsaXN0ZW5zIGZvciBuZXcgY29ubmVjdGlvbnMuCisgKgorICogQSBEQnVzU2VydmVyIHJlcHJlc2VudHMgYSBzZXJ2ZXIgdGhhdCBvdGhlciBhcHBsaWNhdGlvbnMKKyAqIGNhbiBjb25uZWN0IHRvLiBFYWNoIGNvbm5lY3Rpb24gZnJvbSBhbm90aGVyIGFwcGxpY2F0aW9uCisgKiBpcyByZXByZXNlbnRlZCBieSBhICNEQnVzQ29ubmVjdGlvbi4KKyAqCisgKiBAdG9kbyBUaHJlYWQgc2FmZXR5IGhhc24ndCBiZWVuIHRlc3RlZCBtdWNoIGZvciAjREJ1c1NlcnZlcgorICogQHRvZG8gTmVlZCBub3RpZmljYXRpb24gdG8gYXBwcyBvZiBkaXNjb25uZWN0aW9uLCBtYXkgbWF0dGVyIGZvciBzb21lIHRyYW5zcG9ydHMKKyAqLworCisvKioKKyAqIEBkZWZncm91cCBEQnVzU2VydmVySW50ZXJuYWxzIERCdXNTZXJ2ZXIgaW1wbGVtZW50YXRpb24gZGV0YWlscworICogQGluZ3JvdXAgIERCdXNJbnRlcm5hbHMKKyAqIEBicmllZiBJbXBsZW1lbnRhdGlvbiBkZXRhaWxzIG9mIERCdXNTZXJ2ZXIKKyAqCisgKiBAeworICovCisKKyNpZm5kZWYgX2RidXNfc2VydmVyX3RyYWNlX3JlZgordm9pZAorX2RidXNfc2VydmVyX3RyYWNlX3JlZiAoREJ1c1NlcnZlciAqc2VydmVyLAorICAgIGludCBvbGRfcmVmY291bnQsCisgICAgaW50IG5ld19yZWZjb3VudCwKKyAgICBjb25zdCBjaGFyICp3aHkpCit7CisgIHN0YXRpYyBpbnQgZW5hYmxlZCA9IC0xOworCisgIF9kYnVzX3RyYWNlX3JlZiAoIkRCdXNTZXJ2ZXIiLCBzZXJ2ZXIsIG9sZF9yZWZjb3VudCwgbmV3X3JlZmNvdW50LCB3aHksCisgICAgICAiREJVU19TRVJWRVJfVFJBQ0UiLCAmZW5hYmxlZCk7Cit9CisjZW5kaWYKKworLyogdGhpcyBpcyBhIGxpdHRsZSBmcmFnaWxlIHNpbmNlIGl0IGFzc3VtZXMgdGhlIGFkZHJlc3MgZG9lc24ndAorICogYWxyZWFkeSBoYXZlIGEgZ3VpZCwgYnV0IGl0IHNob3VsZG4ndAorICovCitzdGF0aWMgY2hhcioKK2NvcHlfYWRkcmVzc193aXRoX2d1aWRfYXBwZW5kZWQgKGNvbnN0IERCdXNTdHJpbmcgKmFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpndWlkX2hleCkKK3sKKyAgREJ1c1N0cmluZyB3aXRoX2d1aWQ7CisgIGNoYXIgKnJldHZhbDsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZ3aXRoX2d1aWQpKQorICAgIHJldHVybiBOVUxMOworCisgIGlmICghX2RidXNfc3RyaW5nX2NvcHkgKGFkZHJlc3MsIDAsICZ3aXRoX2d1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmd2l0aF9ndWlkKSkgfHwKKyAgICAgICFfZGJ1c19zdHJpbmdfYXBwZW5kICgmd2l0aF9ndWlkLCAiLGd1aWQ9IikgfHwKKyAgICAgICFfZGJ1c19zdHJpbmdfY29weSAoZ3VpZF9oZXgsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aXRoX2d1aWQsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmd2l0aF9ndWlkKSkpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ3aXRoX2d1aWQpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIHJldHZhbCA9IE5VTEw7CisgIF9kYnVzX3N0cmluZ19zdGVhbF9kYXRhICgmd2l0aF9ndWlkLCAmcmV0dmFsKTsKKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJndpdGhfZ3VpZCk7CisgICAgICAKKyAgcmV0dXJuIHJldHZhbDsgLyogbWF5IGJlIE5VTEwgaWYgc3RlYWxfZGF0YSBmYWlsZWQgKi8KK30KKworLyoqCisgKiBJbml0aWFsaXplcyB0aGUgbWVtYmVycyBvZiB0aGUgREJ1c1NlcnZlciBiYXNlIGNsYXNzLgorICogQ2hhaW5lZCB1cCB0byBieSBzdWJjbGFzcyBjb25zdHJ1Y3RvcnMuCisgKgorICogQHBhcmFtIHNlcnZlciB0aGUgc2VydmVyLgorICogQHBhcmFtIHZ0YWJsZSB0aGUgdnRhYmxlIGZvciB0aGUgc3ViY2xhc3MuCisgKiBAcGFyYW0gYWRkcmVzcyB0aGUgc2VydmVyJ3MgYWRkcmVzcworICogQHBhcmFtIGVycm9yIGxvY2F0aW9uIHRvIHN0b3JlIHJlYXNvbiBmb3IgZmFpbHVyZQorICogQHJldHVybnMgI1RSVUUgb24gc3VjY2Vzcy4KKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3NlcnZlcl9pbml0X2Jhc2UgKERCdXNTZXJ2ZXIgICAgICAgICAgICAgKnNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTZXJ2ZXJWVGFibGUgKnZ0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICAgICAgKmFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAgICAgICplcnJvcikKK3sKKyAgc2VydmVyLT52dGFibGUgPSB2dGFibGU7CisKKyNpZmRlZiBEQlVTX0RJU0FCTEVfQVNTRVJUCisgIF9kYnVzX2F0b21pY19pbmMgKCZzZXJ2ZXItPnJlZmNvdW50KTsKKyNlbHNlCisgICAgeworICAgICAgZGJ1c19pbnQzMl90IG9sZF9yZWZjb3VudCA9IF9kYnVzX2F0b21pY19pbmMgKCZzZXJ2ZXItPnJlZmNvdW50KTsKKworICAgICAgX2RidXNfYXNzZXJ0IChvbGRfcmVmY291bnQgPT0gMCk7CisgICAgfQorI2VuZGlmCisKKyAgc2VydmVyLT5hZGRyZXNzID0gTlVMTDsKKyAgc2VydmVyLT53YXRjaGVzID0gTlVMTDsKKyAgc2VydmVyLT50aW1lb3V0cyA9IE5VTEw7CisgIHNlcnZlci0+cHVibGlzaGVkX2FkZHJlc3MgPSBGQUxTRTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmc2VydmVyLT5ndWlkX2hleCkpCisgICAgeworICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIV9kYnVzX2dlbmVyYXRlX3V1aWQgKCZzZXJ2ZXItPmd1aWQsIGVycm9yKSkKKyAgICBnb3RvIGZhaWxlZDsKKworICBpZiAoIV9kYnVzX3V1aWRfZW5jb2RlICgmc2VydmVyLT5ndWlkLCAmc2VydmVyLT5ndWlkX2hleCkpCisgICAgZ290byBvb207CisgIAorICBzZXJ2ZXItPmFkZHJlc3MgPSBjb3B5X2FkZHJlc3Nfd2l0aF9ndWlkX2FwcGVuZGVkIChhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VydmVyLT5ndWlkX2hleCk7CisgIGlmIChzZXJ2ZXItPmFkZHJlc3MgPT0gTlVMTCkKKyAgICBnb3RvIG9vbTsKKyAgCisgIF9kYnVzX3JtdXRleF9uZXdfYXRfbG9jYXRpb24gKCZzZXJ2ZXItPm11dGV4KTsKKyAgaWYgKHNlcnZlci0+bXV0ZXggPT0gTlVMTCkKKyAgICBnb3RvIG9vbTsKKyAgCisgIHNlcnZlci0+d2F0Y2hlcyA9IF9kYnVzX3dhdGNoX2xpc3RfbmV3ICgpOworICBpZiAoc2VydmVyLT53YXRjaGVzID09IE5VTEwpCisgICAgZ290byBvb207CisKKyAgc2VydmVyLT50aW1lb3V0cyA9IF9kYnVzX3RpbWVvdXRfbGlzdF9uZXcgKCk7CisgIGlmIChzZXJ2ZXItPnRpbWVvdXRzID09IE5VTEwpCisgICAgZ290byBvb207CisKKyAgX2RidXNfZGF0YV9zbG90X2xpc3RfaW5pdCAoJnNlcnZlci0+c2xvdF9saXN0KTsKKworICBfZGJ1c192ZXJib3NlICgiSW5pdGlhbGl6ZWQgc2VydmVyIG9uIGFkZHJlc3MgJXNcbiIsIHNlcnZlci0+YWRkcmVzcyk7CisgIAorICByZXR1cm4gVFJVRTsKKworIG9vbToKKyAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworIGZhaWxlZDoKKyAgX2RidXNfcm11dGV4X2ZyZWVfYXRfbG9jYXRpb24gKCZzZXJ2ZXItPm11dGV4KTsKKyAgc2VydmVyLT5tdXRleCA9IE5VTEw7CisgIGlmIChzZXJ2ZXItPndhdGNoZXMpCisgICAgeworICAgICAgX2RidXNfd2F0Y2hfbGlzdF9mcmVlIChzZXJ2ZXItPndhdGNoZXMpOworICAgICAgc2VydmVyLT53YXRjaGVzID0gTlVMTDsKKyAgICB9CisgIGlmIChzZXJ2ZXItPnRpbWVvdXRzKQorICAgIHsKKyAgICAgIF9kYnVzX3RpbWVvdXRfbGlzdF9mcmVlIChzZXJ2ZXItPnRpbWVvdXRzKTsKKyAgICAgIHNlcnZlci0+dGltZW91dHMgPSBOVUxMOworICAgIH0KKyAgaWYgKHNlcnZlci0+YWRkcmVzcykKKyAgICB7CisgICAgICBkYnVzX2ZyZWUgKHNlcnZlci0+YWRkcmVzcyk7CisgICAgICBzZXJ2ZXItPmFkZHJlc3MgPSBOVUxMOworICAgIH0KKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZzZXJ2ZXItPmd1aWRfaGV4KTsKKyAgCisgIHJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBGaW5hbGl6ZXMgdGhlIG1lbWJlcnMgb2YgdGhlIERCdXNTZXJ2ZXIgYmFzZSBjbGFzcy4KKyAqIENoYWluZWQgdXAgdG8gYnkgc3ViY2xhc3MgZmluYWxpemVycy4KKyAqCisgKiBAcGFyYW0gc2VydmVyIHRoZSBzZXJ2ZXIuCisgKi8KK3ZvaWQKK19kYnVzX3NlcnZlcl9maW5hbGl6ZV9iYXNlIChEQnVzU2VydmVyICpzZXJ2ZXIpCit7CisgIC8qIFdlIGRvbid0IGhhdmUgdGhlIGxvY2ssIGJ1dCBub2JvZHkgc2hvdWxkIGJlIGFjY2Vzc2luZworICAgKiBjb25jdXJyZW50bHkgc2luY2UgdGhleSBkb24ndCBoYXZlIGEgcmVmCisgICAqLworI2lmbmRlZiBEQlVTX0RJU0FCTEVfQ0hFQ0tTCisgIF9kYnVzX2Fzc2VydCAoIXNlcnZlci0+aGF2ZV9zZXJ2ZXJfbG9jayk7CisjZW5kaWYKKyAgX2RidXNfYXNzZXJ0IChzZXJ2ZXItPmRpc2Nvbm5lY3RlZCk7CisgIAorICAvKiBjYWxscyBvdXQgdG8gYXBwbGljYXRpb24gY29kZS4uLiAqLworICBfZGJ1c19kYXRhX3Nsb3RfbGlzdF9mcmVlICgmc2VydmVyLT5zbG90X2xpc3QpOworCisgIGRidXNfc2VydmVyX3NldF9uZXdfY29ubmVjdGlvbl9mdW5jdGlvbiAoc2VydmVyLCBOVUxMLCBOVUxMLCBOVUxMKTsKKworICBfZGJ1c193YXRjaF9saXN0X2ZyZWUgKHNlcnZlci0+d2F0Y2hlcyk7CisgIF9kYnVzX3RpbWVvdXRfbGlzdF9mcmVlIChzZXJ2ZXItPnRpbWVvdXRzKTsKKworICBfZGJ1c19ybXV0ZXhfZnJlZV9hdF9sb2NhdGlvbiAoJnNlcnZlci0+bXV0ZXgpOworICAKKyAgZGJ1c19mcmVlIChzZXJ2ZXItPmFkZHJlc3MpOworCisgIGRidXNfZnJlZV9zdHJpbmdfYXJyYXkgKHNlcnZlci0+YXV0aF9tZWNoYW5pc21zKTsKKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnNlcnZlci0+Z3VpZF9oZXgpOworfQorCisKKy8qKiBGdW5jdGlvbiB0byBiZSBjYWxsZWQgaW4gcHJvdGVjdGVkX2NoYW5nZV93YXRjaCgpIHdpdGggcmVmY291bnQgaGVsZCAqLwordHlwZWRlZiBkYnVzX2Jvb2xfdCAoKiBEQnVzV2F0Y2hBZGRGdW5jdGlvbikgICAgIChEQnVzV2F0Y2hMaXN0ICpsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzV2F0Y2ggICAgICp3YXRjaCk7CisvKiogRnVuY3Rpb24gdG8gYmUgY2FsbGVkIGluIHByb3RlY3RlZF9jaGFuZ2Vfd2F0Y2goKSB3aXRoIHJlZmNvdW50IGhlbGQgKi8KK3R5cGVkZWYgdm9pZCAgICAgICAgKCogREJ1c1dhdGNoUmVtb3ZlRnVuY3Rpb24pICAoREJ1c1dhdGNoTGlzdCAqbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1dhdGNoICAgICAqd2F0Y2gpOworLyoqIEZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBpbiBwcm90ZWN0ZWRfY2hhbmdlX3dhdGNoKCkgd2l0aCByZWZjb3VudCBoZWxkICovCit0eXBlZGVmIHZvaWQgICAgICAgICgqIERCdXNXYXRjaFRvZ2dsZUZ1bmN0aW9uKSAgKERCdXNXYXRjaExpc3QgKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNXYXRjaCAgICAgKndhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICBlbmFibGVkKTsKKworc3RhdGljIGRidXNfYm9vbF90Citwcm90ZWN0ZWRfY2hhbmdlX3dhdGNoIChEQnVzU2VydmVyICAgICAgICAgICAgICpzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBEQnVzV2F0Y2ggICAgICAgICAgICAgICp3YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgIERCdXNXYXRjaEFkZEZ1bmN0aW9uICAgIGFkZF9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIERCdXNXYXRjaFJlbW92ZUZ1bmN0aW9uIHJlbW92ZV9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIERCdXNXYXRjaFRvZ2dsZUZ1bmN0aW9uIHRvZ2dsZV9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgICAgICAgIGVuYWJsZWQpCit7CisgIERCdXNXYXRjaExpc3QgKndhdGNoZXM7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgCisgIEhBVkVfTE9DS19DSEVDSyAoc2VydmVyKTsKKworICAvKiBUaGlzIGlzbid0IHJlYWxseSBzYWZlIG9yIHJlYXNvbmFibGU7IGEgYmV0dGVyIHBhdHRlcm4gaXMgdGhlICJkbworICAgKiBldmVyeXRoaW5nLCB0aGVuIGRyb3AgbG9jayBhbmQgY2FsbCBvdXQiIG9uZTsgYnV0IGl0IGhhcyB0byBiZQorICAgKiBwcm9wYWdhdGVkIHVwIHRocm91Z2ggYWxsIGNhbGxlcnMKKyAgICovCisgIAorICB3YXRjaGVzID0gc2VydmVyLT53YXRjaGVzOworICBpZiAod2F0Y2hlcykKKyAgICB7CisgICAgICBzZXJ2ZXItPndhdGNoZXMgPSBOVUxMOworICAgICAgX2RidXNfc2VydmVyX3JlZl91bmxvY2tlZCAoc2VydmVyKTsKKyAgICAgIFNFUlZFUl9VTkxPQ0sgKHNlcnZlcik7CisKKyAgICAgIGlmIChhZGRfZnVuY3Rpb24pCisgICAgICAgIHJldHZhbCA9ICgqIGFkZF9mdW5jdGlvbikgKHdhdGNoZXMsIHdhdGNoKTsKKyAgICAgIGVsc2UgaWYgKHJlbW92ZV9mdW5jdGlvbikKKyAgICAgICAgeworICAgICAgICAgIHJldHZhbCA9IFRSVUU7CisgICAgICAgICAgKCogcmVtb3ZlX2Z1bmN0aW9uKSAod2F0Y2hlcywgd2F0Y2gpOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICByZXR2YWwgPSBUUlVFOworICAgICAgICAgICgqIHRvZ2dsZV9mdW5jdGlvbikgKHdhdGNoZXMsIHdhdGNoLCBlbmFibGVkKTsKKyAgICAgICAgfQorICAgICAgCisgICAgICBTRVJWRVJfTE9DSyAoc2VydmVyKTsKKyAgICAgIHNlcnZlci0+d2F0Y2hlcyA9IHdhdGNoZXM7CisgICAgICBfZGJ1c19zZXJ2ZXJfdW5yZWZfdW5sb2NrZWQgKHNlcnZlcik7CisKKyAgICAgIHJldHVybiByZXR2YWw7CisgICAgfQorICBlbHNlCisgICAgcmV0dXJuIEZBTFNFOworfQorCisvKioKKyAqIEFkZHMgYSB3YXRjaCBmb3IgdGhpcyBzZXJ2ZXIsIGNoYWluaW5nIG91dCB0byBhcHBsaWNhdGlvbi1wcm92aWRlZAorICogd2F0Y2ggaGFuZGxlcnMuCisgKgorICogQHBhcmFtIHNlcnZlciB0aGUgc2VydmVyLgorICogQHBhcmFtIHdhdGNoIHRoZSB3YXRjaCB0byBhZGQuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zZXJ2ZXJfYWRkX3dhdGNoIChEQnVzU2VydmVyICpzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBEQnVzV2F0Y2ggICp3YXRjaCkKK3sKKyAgSEFWRV9MT0NLX0NIRUNLIChzZXJ2ZXIpOworICByZXR1cm4gcHJvdGVjdGVkX2NoYW5nZV93YXRjaCAoc2VydmVyLCB3YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3dhdGNoX2xpc3RfYWRkX3dhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgRkFMU0UpOworfQorCisvKioKKyAqIFJlbW92ZXMgYSB3YXRjaCBwcmV2aW91c2x5IGFkZGVkIHdpdGggX2RidXNfc2VydmVyX3JlbW92ZV93YXRjaCgpLgorICoKKyAqIEBwYXJhbSBzZXJ2ZXIgdGhlIHNlcnZlci4KKyAqIEBwYXJhbSB3YXRjaCB0aGUgd2F0Y2ggdG8gcmVtb3ZlLgorICovCit2b2lkCitfZGJ1c19zZXJ2ZXJfcmVtb3ZlX3dhdGNoICAoREJ1c1NlcnZlciAqc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNXYXRjaCAgKndhdGNoKQoreworICBIQVZFX0xPQ0tfQ0hFQ0sgKHNlcnZlcik7CisgIHByb3RlY3RlZF9jaGFuZ2Vfd2F0Y2ggKHNlcnZlciwgd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3dhdGNoX2xpc3RfcmVtb3ZlX3dhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBGQUxTRSk7Cit9CisKKy8qKgorICogVG9nZ2xlcyBhbGwgd2F0Y2ggYW5kIG5vdGlmaWVzIGFwcCB2aWEgc2VydmVyJ3MKKyAqIERCdXNXYXRjaFRvZ2dsZWRGdW5jdGlvbiBpZiBhdmFpbGFibGUuCisgKgorICogQHBhcmFtIHNlcnZlciB0aGUgc2VydmVyLgorICogQHBhcmFtIGVuYWJsZWQgd2hldGhlciB0byBlbmFibGUgb3IgZGlzYWJsZQorICovCit2b2lkCitfZGJ1c19zZXJ2ZXJfdG9nZ2xlX2FsbF93YXRjaGVzIChEQnVzU2VydmVyICAqc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgZW5hYmxlZCkKK3sKKyAgX2RidXNfd2F0Y2hfbGlzdF90b2dnbGVfYWxsX3dhdGNoZXMgKHNlcnZlci0+d2F0Y2hlcywgZW5hYmxlZCk7Cit9CisKKy8qKiBGdW5jdGlvbiB0byBiZSBjYWxsZWQgaW4gcHJvdGVjdGVkX2NoYW5nZV90aW1lb3V0KCkgd2l0aCByZWZjb3VudCBoZWxkICovCit0eXBlZGVmIGRidXNfYm9vbF90ICgqIERCdXNUaW1lb3V0QWRkRnVuY3Rpb24pICAgIChEQnVzVGltZW91dExpc3QgKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVGltZW91dCAgICAgKnRpbWVvdXQpOworLyoqIEZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBpbiBwcm90ZWN0ZWRfY2hhbmdlX3RpbWVvdXQoKSB3aXRoIHJlZmNvdW50IGhlbGQgKi8KK3R5cGVkZWYgdm9pZCAgICAgICAgKCogREJ1c1RpbWVvdXRSZW1vdmVGdW5jdGlvbikgKERCdXNUaW1lb3V0TGlzdCAqbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUaW1lb3V0ICAgICAqdGltZW91dCk7CisvKiogRnVuY3Rpb24gdG8gYmUgY2FsbGVkIGluIHByb3RlY3RlZF9jaGFuZ2VfdGltZW91dCgpIHdpdGggcmVmY291bnQgaGVsZCAqLwordHlwZWRlZiB2b2lkICAgICAgICAoKiBEQnVzVGltZW91dFRvZ2dsZUZ1bmN0aW9uKSAoREJ1c1RpbWVvdXRMaXN0ICpsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1RpbWVvdXQgICAgICp0aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICBlbmFibGVkKTsKKworCitzdGF0aWMgZGJ1c19ib29sX3QKK3Byb3RlY3RlZF9jaGFuZ2VfdGltZW91dCAoREJ1c1NlcnZlciAgICAgICAgICAgICAgICpzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUaW1lb3V0ICAgICAgICAgICAgICAqdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1RpbWVvdXRBZGRGdW5jdGlvbiAgICBhZGRfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUaW1lb3V0UmVtb3ZlRnVuY3Rpb24gcmVtb3ZlX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVGltZW91dFRvZ2dsZUZ1bmN0aW9uIHRvZ2dsZV9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgICAgICAgICBlbmFibGVkKQoreworICBEQnVzVGltZW91dExpc3QgKnRpbWVvdXRzOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIAorICBIQVZFX0xPQ0tfQ0hFQ0sgKHNlcnZlcik7CisKKyAgLyogVGhpcyBpc24ndCByZWFsbHkgc2FmZSBvciByZWFzb25hYmxlOyBhIGJldHRlciBwYXR0ZXJuIGlzIHRoZSAiZG8gZXZlcnl0aGluZywgdGhlbgorICAgKiBkcm9wIGxvY2sgYW5kIGNhbGwgb3V0IiBvbmU7IGJ1dCBpdCBoYXMgdG8gYmUgcHJvcGFnYXRlZCB1cCB0aHJvdWdoIGFsbCBjYWxsZXJzCisgICAqLworICAKKyAgdGltZW91dHMgPSBzZXJ2ZXItPnRpbWVvdXRzOworICBpZiAodGltZW91dHMpCisgICAgeworICAgICAgc2VydmVyLT50aW1lb3V0cyA9IE5VTEw7CisgICAgICBfZGJ1c19zZXJ2ZXJfcmVmX3VubG9ja2VkIChzZXJ2ZXIpOworICAgICAgU0VSVkVSX1VOTE9DSyAoc2VydmVyKTsKKworICAgICAgaWYgKGFkZF9mdW5jdGlvbikKKyAgICAgICAgcmV0dmFsID0gKCogYWRkX2Z1bmN0aW9uKSAodGltZW91dHMsIHRpbWVvdXQpOworICAgICAgZWxzZSBpZiAocmVtb3ZlX2Z1bmN0aW9uKQorICAgICAgICB7CisgICAgICAgICAgcmV0dmFsID0gVFJVRTsKKyAgICAgICAgICAoKiByZW1vdmVfZnVuY3Rpb24pICh0aW1lb3V0cywgdGltZW91dCk7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHJldHZhbCA9IFRSVUU7CisgICAgICAgICAgKCogdG9nZ2xlX2Z1bmN0aW9uKSAodGltZW91dHMsIHRpbWVvdXQsIGVuYWJsZWQpOworICAgICAgICB9CisgICAgICAKKyAgICAgIFNFUlZFUl9MT0NLIChzZXJ2ZXIpOworICAgICAgc2VydmVyLT50aW1lb3V0cyA9IHRpbWVvdXRzOworICAgICAgX2RidXNfc2VydmVyX3VucmVmX3VubG9ja2VkIChzZXJ2ZXIpOworCisgICAgICByZXR1cm4gcmV0dmFsOworICAgIH0KKyAgZWxzZQorICAgIHJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBBZGRzIGEgdGltZW91dCBmb3IgdGhpcyBzZXJ2ZXIsIGNoYWluaW5nIG91dCB0bworICogYXBwbGljYXRpb24tcHJvdmlkZWQgdGltZW91dCBoYW5kbGVycy4gVGhlIHRpbWVvdXQgc2hvdWxkIGJlCisgKiByZXBlYXRlZGx5IGhhbmRsZWQgd2l0aCBkYnVzX3RpbWVvdXRfaGFuZGxlKCkgYXQgaXRzIGdpdmVuIGludGVydmFsCisgKiB1bnRpbCBpdCBpcyByZW1vdmVkLgorICoKKyAqIEBwYXJhbSBzZXJ2ZXIgdGhlIHNlcnZlci4KKyAqIEBwYXJhbSB0aW1lb3V0IHRoZSB0aW1lb3V0IHRvIGFkZC4KKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3NlcnZlcl9hZGRfdGltZW91dCAoREJ1c1NlcnZlciAgKnNlcnZlciwKKwkJCSAgREJ1c1RpbWVvdXQgKnRpbWVvdXQpCit7CisgIHJldHVybiBwcm90ZWN0ZWRfY2hhbmdlX3RpbWVvdXQgKHNlcnZlciwgdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfdGltZW91dF9saXN0X2FkZF90aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBGQUxTRSk7Cit9CisKKy8qKgorICogUmVtb3ZlcyBhIHRpbWVvdXQgcHJldmlvdXNseSBhZGRlZCB3aXRoIF9kYnVzX3NlcnZlcl9hZGRfdGltZW91dCgpLgorICoKKyAqIEBwYXJhbSBzZXJ2ZXIgdGhlIHNlcnZlci4KKyAqIEBwYXJhbSB0aW1lb3V0IHRoZSB0aW1lb3V0IHRvIHJlbW92ZS4KKyAqLwordm9pZAorX2RidXNfc2VydmVyX3JlbW92ZV90aW1lb3V0IChEQnVzU2VydmVyICAqc2VydmVyLAorCQkJICAgICBEQnVzVGltZW91dCAqdGltZW91dCkKK3sKKyAgcHJvdGVjdGVkX2NoYW5nZV90aW1lb3V0IChzZXJ2ZXIsIHRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c190aW1lb3V0X2xpc3RfcmVtb3ZlX3RpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgRkFMU0UpOworfQorCisvKioKKyAqIFRvZ2dsZXMgYSB0aW1lb3V0IGFuZCBub3RpZmllcyBhcHAgdmlhIHNlcnZlcidzCisgKiBEQnVzVGltZW91dFRvZ2dsZWRGdW5jdGlvbiBpZiBhdmFpbGFibGUuIEl0J3MgYW4gZXJyb3IgdG8gY2FsbCB0aGlzCisgKiBmdW5jdGlvbiBvbiBhIHRpbWVvdXQgdGhhdCB3YXMgbm90IHByZXZpb3VzbHkgYWRkZWQuCisgKgorICogQHBhcmFtIHNlcnZlciB0aGUgc2VydmVyLgorICogQHBhcmFtIHRpbWVvdXQgdGhlIHRpbWVvdXQgdG8gdG9nZ2xlLgorICogQHBhcmFtIGVuYWJsZWQgd2hldGhlciB0byBlbmFibGUgb3IgZGlzYWJsZQorICovCit2b2lkCitfZGJ1c19zZXJ2ZXJfdG9nZ2xlX3RpbWVvdXQgKERCdXNTZXJ2ZXIgICpzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUaW1lb3V0ICp0aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgZW5hYmxlZCkKK3sKKyAgcHJvdGVjdGVkX2NoYW5nZV90aW1lb3V0IChzZXJ2ZXIsIHRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c190aW1lb3V0X2xpc3RfdG9nZ2xlX3RpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlZCk7Cit9CisKKworLyoqCisgKiBMaWtlIGRidXNfc2VydmVyX3JlZigpIGJ1dCBkb2VzIG5vdCBhY3F1aXJlIHRoZSBsb2NrIChtdXN0IGFscmVhZHkgYmUgaGVsZCkKKyAqCisgKiBAcGFyYW0gc2VydmVyIHRoZSBzZXJ2ZXIuCisgKi8KK3ZvaWQKK19kYnVzX3NlcnZlcl9yZWZfdW5sb2NrZWQgKERCdXNTZXJ2ZXIgKnNlcnZlcikKK3sKKyAgZGJ1c19pbnQzMl90IG9sZF9yZWZjb3VudDsKKworICBfZGJ1c19hc3NlcnQgKHNlcnZlciAhPSBOVUxMKTsKKyAgSEFWRV9MT0NLX0NIRUNLIChzZXJ2ZXIpOworCisgIG9sZF9yZWZjb3VudCA9IF9kYnVzX2F0b21pY19pbmMgKCZzZXJ2ZXItPnJlZmNvdW50KTsKKyAgX2RidXNfYXNzZXJ0IChvbGRfcmVmY291bnQgPiAwKTsKKyAgX2RidXNfc2VydmVyX3RyYWNlX3JlZiAoc2VydmVyLCBvbGRfcmVmY291bnQsIG9sZF9yZWZjb3VudCArIDEsCisgICAgICAicmVmX3VubG9ja2VkIik7Cit9CisKKy8qKgorICogTGlrZSBkYnVzX3NlcnZlcl91bnJlZigpIGJ1dCBkb2VzIG5vdCBhY3F1aXJlIHRoZSBsb2NrIChtdXN0IGFscmVhZHkgYmUgaGVsZCkKKyAqCisgKiBAcGFyYW0gc2VydmVyIHRoZSBzZXJ2ZXIuCisgKi8KK3ZvaWQKK19kYnVzX3NlcnZlcl91bnJlZl91bmxvY2tlZCAoREJ1c1NlcnZlciAqc2VydmVyKQoreworICBkYnVzX2ludDMyX3Qgb2xkX3JlZmNvdW50OworCisgIC8qIEtlZXAgdGhpcyBpbiBzeW5jIHdpdGggZGJ1c19zZXJ2ZXJfdW5yZWYgKi8KKworICBfZGJ1c19hc3NlcnQgKHNlcnZlciAhPSBOVUxMKTsKKworICBIQVZFX0xPQ0tfQ0hFQ0sgKHNlcnZlcik7CisKKyAgb2xkX3JlZmNvdW50ID0gX2RidXNfYXRvbWljX2RlYyAoJnNlcnZlci0+cmVmY291bnQpOworICBfZGJ1c19hc3NlcnQgKG9sZF9yZWZjb3VudCA+IDApOworCisgIF9kYnVzX3NlcnZlcl90cmFjZV9yZWYgKHNlcnZlciwgb2xkX3JlZmNvdW50LCBvbGRfcmVmY291bnQgLSAxLAorICAgICAgInVucmVmX3VubG9ja2VkIik7CisKKyAgaWYgKG9sZF9yZWZjb3VudCA9PSAxKQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydCAoc2VydmVyLT5kaXNjb25uZWN0ZWQpOworICAgICAgCisgICAgICBTRVJWRVJfVU5MT0NLIChzZXJ2ZXIpOworICAgICAgCisgICAgICBfZGJ1c19hc3NlcnQgKHNlcnZlci0+dnRhYmxlLT5maW5hbGl6ZSAhPSBOVUxMKTsKKyAgICAgIAorICAgICAgKCogc2VydmVyLT52dGFibGUtPmZpbmFsaXplKSAoc2VydmVyKTsKKyAgICB9Cit9CisKKy8qKiBAfSAqLworCisvKioKKyAqIEBhZGR0b2dyb3VwIERCdXNTZXJ2ZXIKKyAqCisgKiBAeworICovCisKKworLyoqCisgKiBAdHlwZWRlZiBEQnVzU2VydmVyCisgKgorICogQW4gb3BhcXVlIG9iamVjdCByZXByZXNlbnRpbmcgYSBzZXJ2ZXIgdGhhdCBsaXN0ZW5zIGZvcgorICogY29ubmVjdGlvbnMgZnJvbSBvdGhlciBhcHBsaWNhdGlvbnMuIEVhY2ggdGltZSBhIGNvbm5lY3Rpb24KKyAqIGlzIG1hZGUsIGEgbmV3IERCdXNDb25uZWN0aW9uIGlzIGNyZWF0ZWQgYW5kIG1hZGUgYXZhaWxhYmxlCisgKiB2aWEgYW4gYXBwbGljYXRpb24tcHJvdmlkZWQgREJ1c05ld0Nvbm5lY3Rpb25GdW5jdGlvbi4KKyAqIFRoZSBEQnVzTmV3Q29ubmVjdGlvbkZ1bmN0aW9uIGlzIHByb3ZpZGVkIHdpdGgKKyAqIGRidXNfc2VydmVyX3NldF9uZXdfY29ubmVjdGlvbl9mdW5jdGlvbigpLgorICogCisgKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCB7CisgIERCdXNTZXJ2ZXJMaXN0ZW5SZXN1bHQgKCogZnVuYykgKERCdXNBZGRyZXNzRW50cnkgKmVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU2VydmVyICAgICAgKipzZXJ2ZXJfcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpOworfSBsaXN0ZW5fZnVuY3NbXSA9IHsKKyAgeyBfZGJ1c19zZXJ2ZXJfbGlzdGVuX3NvY2tldCB9CisgICwgeyBfZGJ1c19zZXJ2ZXJfbGlzdGVuX3BsYXRmb3JtX3NwZWNpZmljIH0KKyNpZmRlZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworICAsIHsgX2RidXNfc2VydmVyX2xpc3Rlbl9kZWJ1Z19waXBlIH0KKyNlbmRpZgorfTsKKworLyoqCisgKiBMaXN0ZW5zIGZvciBuZXcgY29ubmVjdGlvbnMgb24gdGhlIGdpdmVuIGFkZHJlc3MuICBJZiB0aGVyZSBhcmUKKyAqIG11bHRpcGxlIHNlbWljb2xvbi1zZXBhcmF0ZWQgYWRkcmVzcyBlbnRyaWVzIGluIHRoZSBhZGRyZXNzLCB0cmllcworICogZWFjaCBvbmUgYW5kIGxpc3RlbnMgb24gdGhlIGZpcnN0IG9uZSB0aGF0IHdvcmtzLgorICogCisgKiBSZXR1cm5zICNOVUxMIGFuZCBzZXRzIGVycm9yIGlmIGxpc3RlbmluZyBmYWlscyBmb3IgYW55IHJlYXNvbi4KKyAqIE90aGVyd2lzZSByZXR1cm5zIGEgbmV3ICNEQnVzU2VydmVyLgorICogZGJ1c19zZXJ2ZXJfc2V0X25ld19jb25uZWN0aW9uX2Z1bmN0aW9uKCksCisgKiBkYnVzX3NlcnZlcl9zZXRfd2F0Y2hfZnVuY3Rpb25zKCksIGFuZAorICogZGJ1c19zZXJ2ZXJfc2V0X3RpbWVvdXRfZnVuY3Rpb25zKCkgc2hvdWxkIGJlIGNhbGxlZCBpbW1lZGlhdGVseSB0bworICogcmVuZGVyIHRoZSBzZXJ2ZXIgZnVsbHkgZnVuY3Rpb25hbC4KKyAqCisgKiBUbyBmcmVlIHRoZSBzZXJ2ZXIsIGFwcGxpY2F0aW9ucyBtdXN0IGNhbGwgZmlyc3QKKyAqIGRidXNfc2VydmVyX2Rpc2Nvbm5lY3QoKSBhbmQgdGhlbiBkYnVzX3NlcnZlcl91bnJlZigpLgorICogCisgKiBAcGFyYW0gYWRkcmVzcyB0aGUgYWRkcmVzcyBvZiB0aGlzIHNlcnZlci4KKyAqIEBwYXJhbSBlcnJvciBsb2NhdGlvbiB0byBzdG9yZSByZWFzb24gZm9yIGZhaWx1cmUuCisgKiBAcmV0dXJucyBhIG5ldyAjREJ1c1NlcnZlciwgb3IgI05VTEwgb24gZmFpbHVyZS4KKyAqIAorICovCitEQnVzU2VydmVyKgorZGJ1c19zZXJ2ZXJfbGlzdGVuIChjb25zdCBjaGFyICAgICAqYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBEQnVzU2VydmVyICpzZXJ2ZXI7CisgIERCdXNBZGRyZXNzRW50cnkgKiplbnRyaWVzOworICBpbnQgbGVuLCBpOworICBEQnVzRXJyb3IgZmlyc3RfY29ubmVjdF9lcnJvciA9IERCVVNfRVJST1JfSU5JVDsKKyAgZGJ1c19ib29sX3QgaGFuZGxlZF9vbmNlOworICAKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChhZGRyZXNzICE9IE5VTEwsIE5VTEwpOworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2Vycm9yX2lzX3NldCAoZXJyb3IsIE5VTEwpOworICAKKyAgaWYgKCFkYnVzX3BhcnNlX2FkZHJlc3MgKGFkZHJlc3MsICZlbnRyaWVzLCAmbGVuLCBlcnJvcikpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgc2VydmVyID0gTlVMTDsKKyAgaGFuZGxlZF9vbmNlID0gRkFMU0U7CisKKyAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorICAgIHsKKyAgICAgIGludCBqOworCisgICAgICBmb3IgKGogPSAwOyBqIDwgKGludCkgX0RCVVNfTl9FTEVNRU5UUyAobGlzdGVuX2Z1bmNzKTsgKytqKQorICAgICAgICB7CisgICAgICAgICAgREJ1c1NlcnZlckxpc3RlblJlc3VsdCByZXN1bHQ7CisgICAgICAgICAgREJ1c0Vycm9yIHRtcF9lcnJvciA9IERCVVNfRVJST1JfSU5JVDsKKworICAgICAgICAgIHJlc3VsdCA9ICgqIGxpc3Rlbl9mdW5jc1tqXS5mdW5jKSAoZW50cmllc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1wX2Vycm9yKTsKKworICAgICAgICAgIGlmIChyZXN1bHQgPT0gREJVU19TRVJWRVJfTElTVEVOX09LKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c19hc3NlcnQgKHNlcnZlciAhPSBOVUxMKTsKKyAgICAgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSICgmdG1wX2Vycm9yKTsKKyAgICAgICAgICAgICAgaGFuZGxlZF9vbmNlID0gVFJVRTsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZSBpZiAocmVzdWx0ID09IERCVVNfU0VSVkVSX0xJU1RFTl9BRERSRVNTX0FMUkVBRFlfVVNFRCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfYXNzZXJ0IChzZXJ2ZXIgPT0gTlVMTCk7CisgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9BRERSRVNTX0lOX1VTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIkFkZHJlc3MgJyVzJyBhbHJlYWR5IHVzZWQiLAorICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2FkZHJlc3NfZW50cnlfZ2V0X21ldGhvZCAoZW50cmllc1swXSkpOworICAgICAgICAgICAgICBoYW5kbGVkX29uY2UgPSBUUlVFOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIGlmIChyZXN1bHQgPT0gREJVU19TRVJWRVJfTElTVEVOX0JBRF9BRERSRVNTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c19hc3NlcnQgKHNlcnZlciA9PSBOVUxMKTsKKyAgICAgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoJnRtcF9lcnJvcik7CisgICAgICAgICAgICAgIGRidXNfbW92ZV9lcnJvciAoJnRtcF9lcnJvciwgZXJyb3IpOworICAgICAgICAgICAgICBoYW5kbGVkX29uY2UgPSBUUlVFOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIGlmIChyZXN1bHQgPT0gREJVU19TRVJWRVJfTElTVEVOX05PVF9IQU5ETEVEKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c19hc3NlcnQgKHNlcnZlciA9PSBOVUxMKTsKKyAgICAgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSICgmdG1wX2Vycm9yKTsKKworICAgICAgICAgICAgICAvKiBrZWVwIHRyeWluZyBhZGRyZXNzZXMgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIGlmIChyZXN1bHQgPT0gREJVU19TRVJWRVJfTElTVEVOX0RJRF9OT1RfQ09OTkVDVCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfYXNzZXJ0IChzZXJ2ZXIgPT0gTlVMTCk7CisgICAgICAgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKCZ0bXBfZXJyb3IpOworICAgICAgICAgICAgICBpZiAoIWRidXNfZXJyb3JfaXNfc2V0ICgmZmlyc3RfY29ubmVjdF9lcnJvcikpCisgICAgICAgICAgICAgICAgZGJ1c19tb3ZlX2Vycm9yICgmdG1wX2Vycm9yLCAmZmlyc3RfY29ubmVjdF9lcnJvcik7CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZ0bXBfZXJyb3IpOworCisgICAgICAgICAgICAgIGhhbmRsZWRfb25jZSA9IFRSVUU7CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAvKiBrZWVwIHRyeWluZyBhZGRyZXNzZXMgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICBfZGJ1c19hc3NlcnQgKHNlcnZlciA9PSBOVUxMKTsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworICAgIH0KKworIG91dDoKKworICBpZiAoIWhhbmRsZWRfb25jZSkKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgICAgIGlmIChsZW4gPiAwKQorICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfQkFEX0FERFJFU1MsCisgICAgICAgICAgICAgICAgICAgICAgICJVbmtub3duIGFkZHJlc3MgdHlwZSAnJXMnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19hZGRyZXNzX2VudHJ5X2dldF9tZXRob2QgKGVudHJpZXNbMF0pKTsKKyAgICAgIGVsc2UKKyAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9CQURfQUREUkVTUywKKyAgICAgICAgICAgICAgICAgICAgICAgICJFbXB0eSBhZGRyZXNzICclcyciLAorICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyk7CisgICAgfQorICAKKyAgZGJ1c19hZGRyZXNzX2VudHJpZXNfZnJlZSAoZW50cmllcyk7CisKKyAgaWYgKHNlcnZlciA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydCAoZXJyb3IgPT0gTlVMTCB8fCBkYnVzX2Vycm9yX2lzX3NldCAoJmZpcnN0X2Nvbm5lY3RfZXJyb3IpIHx8CisgICAgICAgICAgICAgICAgICAgZGJ1c19lcnJvcl9pc19zZXQgKGVycm9yKSk7CisgICAgICAKKyAgICAgIGlmIChlcnJvciAmJiBkYnVzX2Vycm9yX2lzX3NldCAoZXJyb3IpKQorICAgICAgICB7CisgICAgICAgICAgLyogYWxyZWFkeSBzZXQgdGhlIGVycm9yICovCisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8qIGRpZG4ndCBzZXQgdGhlIGVycm9yIGJ1dCBlaXRoZXIgZXJyb3Igc2hvdWxkIGJlCisgICAgICAgICAgICogTlVMTCBvciBmaXJzdF9jb25uZWN0X2Vycm9yIHNob3VsZCBiZSBzZXQuCisgICAgICAgICAgICovCisgICAgICAgICAgX2RidXNfYXNzZXJ0IChlcnJvciA9PSBOVUxMIHx8IGRidXNfZXJyb3JfaXNfc2V0ICgmZmlyc3RfY29ubmVjdF9lcnJvcikpOworICAgICAgICAgIGRidXNfbW92ZV9lcnJvciAoJmZpcnN0X2Nvbm5lY3RfZXJyb3IsIGVycm9yKTsKKyAgICAgICAgfQorCisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKCZmaXJzdF9jb25uZWN0X2Vycm9yKTsgLyogYmUgc3VyZSB3ZSBmcmVlZCBpdCAqLworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworCisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZmaXJzdF9jb25uZWN0X2Vycm9yKTsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworICAgICAgcmV0dXJuIHNlcnZlcjsKKyAgICB9Cit9CisKKy8qKgorICogSW5jcmVtZW50cyB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIGEgREJ1c1NlcnZlci4KKyAqCisgKiBAcGFyYW0gc2VydmVyIHRoZSBzZXJ2ZXIuCisgKiBAcmV0dXJucyB0aGUgc2VydmVyCisgKi8KK0RCdXNTZXJ2ZXIgKgorZGJ1c19zZXJ2ZXJfcmVmIChEQnVzU2VydmVyICpzZXJ2ZXIpCit7CisgIGRidXNfaW50MzJfdCBvbGRfcmVmY291bnQ7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChzZXJ2ZXIgIT0gTlVMTCwgTlVMTCk7CisKKyAgb2xkX3JlZmNvdW50ID0gX2RidXNfYXRvbWljX2luYyAoJnNlcnZlci0+cmVmY291bnQpOworCisjaWZuZGVmIERCVVNfRElTQUJMRV9DSEVDS1MKKyAgaWYgKF9EQlVTX1VOTElLRUxZIChvbGRfcmVmY291bnQgPD0gMCkpCisgICAgeworICAgICAgX2RidXNfYXRvbWljX2RlYyAoJnNlcnZlci0+cmVmY291bnQpOworICAgICAgX2RidXNfd2Fybl9yZXR1cm5faWZfZmFpbCAoX0RCVVNfRlVOQ1RJT05fTkFNRSwgIm9sZF9yZWZjb3VudCA+IDAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GSUxFX18sIF9fTElORV9fKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyNlbmRpZgorCisgIF9kYnVzX3NlcnZlcl90cmFjZV9yZWYgKHNlcnZlciwgb2xkX3JlZmNvdW50LCBvbGRfcmVmY291bnQgKyAxLCAicmVmIik7CisKKyAgcmV0dXJuIHNlcnZlcjsKK30KKworLyoqCisgKiBEZWNyZW1lbnRzIHRoZSByZWZlcmVuY2UgY291bnQgb2YgYSBEQnVzU2VydmVyLiAgRmluYWxpemVzIHRoZQorICogc2VydmVyIGlmIHRoZSByZWZlcmVuY2UgY291bnQgcmVhY2hlcyB6ZXJvLgorICoKKyAqIFRoZSBzZXJ2ZXIgbXVzdCBiZSBkaXNjb25uZWN0ZWQgYmVmb3JlIHRoZSByZWZjb3VudCByZWFjaGVzIHplcm8uCisgKgorICogQHBhcmFtIHNlcnZlciB0aGUgc2VydmVyLgorICovCit2b2lkCitkYnVzX3NlcnZlcl91bnJlZiAoREJ1c1NlcnZlciAqc2VydmVyKQoreworICBkYnVzX2ludDMyX3Qgb2xkX3JlZmNvdW50OworCisgIC8qIGtlZXAgdGhpcyBpbiBzeW5jIHdpdGggdW5yZWZfdW5sb2NrZWQgKi8KKworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAoc2VydmVyICE9IE5VTEwpOworCisgIG9sZF9yZWZjb3VudCA9IF9kYnVzX2F0b21pY19kZWMgKCZzZXJ2ZXItPnJlZmNvdW50KTsKKworI2lmbmRlZiBEQlVTX0RJU0FCTEVfQ0hFQ0tTCisgIGlmIChfREJVU19VTkxJS0VMWSAob2xkX3JlZmNvdW50IDw9IDApKQorICAgIHsKKyAgICAgIC8qIHVuZG8gc2lkZS1lZmZlY3QgZmlyc3QKKyAgICAgICAqIHBsZWFzZSBkbyBub3QgdHJ5IHRvIHNpbXBsaWZ5IHRoZSBjb2RlIGhlcmUgYnkgdXNpbmcKKyAgICAgICAqIF9kYnVzX2F0b21pY19nZXQoKSwgd2h5IHdlIGRvbid0IHVzZSBpdCBpcworICAgICAgICogYmVjYXVzZSBpdCBpc3N1ZXMgYW5vdGhlciBhdG9taWMgb3BlcmF0aW9uIGV2ZW4gdGhvdWdoCisgICAgICAgKiBEQlVTX0RJU0FCTEVfQ0hFQ0tTIGRlZmluZWQuCisgICAgICAgKiBCdWc6IGh0dHBzOi8vYnVncy5mcmVlZGVza3RvcC5vcmcvc2hvd19idWcuY2dpP2lkPTY4MzAzCisgICAgICAgKi8KKyAgICAgIF9kYnVzX2F0b21pY19pbmMgKCZzZXJ2ZXItPnJlZmNvdW50KTsKKyAgICAgIF9kYnVzX3dhcm5fcmV0dXJuX2lmX2ZhaWwgKF9EQlVTX0ZVTkNUSU9OX05BTUUsICJvbGRfcmVmY291bnQgPiAwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXyk7CisgICAgICByZXR1cm47CisgICAgfQorI2VuZGlmCisKKyAgX2RidXNfc2VydmVyX3RyYWNlX3JlZiAoc2VydmVyLCBvbGRfcmVmY291bnQsIG9sZF9yZWZjb3VudCAtIDEsICJ1bnJlZiIpOworCisgIGlmIChvbGRfcmVmY291bnQgPT0gMSkKKyAgICB7CisgICAgICAvKiBsb2NrIG5vdCBoZWxkISAqLworICAgICAgX2RidXNfYXNzZXJ0IChzZXJ2ZXItPmRpc2Nvbm5lY3RlZCk7CisgICAgICAKKyAgICAgIF9kYnVzX2Fzc2VydCAoc2VydmVyLT52dGFibGUtPmZpbmFsaXplICE9IE5VTEwpOworICAgICAgCisgICAgICAoKiBzZXJ2ZXItPnZ0YWJsZS0+ZmluYWxpemUpIChzZXJ2ZXIpOworICAgIH0KK30KKwordm9pZAorX2RidXNfc2VydmVyX2Rpc2Nvbm5lY3RfdW5sb2NrZWQgKERCdXNTZXJ2ZXIgKnNlcnZlcikKK3sKKyAgX2RidXNfYXNzZXJ0IChzZXJ2ZXItPnZ0YWJsZS0+ZGlzY29ubmVjdCAhPSBOVUxMKTsKKworICBpZiAoIXNlcnZlci0+ZGlzY29ubmVjdGVkKQorICAgIHsKKyAgICAgIC8qIHRoaXMgaGFzIHRvIGJlIGZpcnN0IHNvIHJlY3Vyc2l2ZSBjYWxscyB0byBkaXNjb25uZWN0IGRvbid0IGhhcHBlbiAqLworICAgICAgc2VydmVyLT5kaXNjb25uZWN0ZWQgPSBUUlVFOworCisgICAgICAoKiBzZXJ2ZXItPnZ0YWJsZS0+ZGlzY29ubmVjdCkgKHNlcnZlcik7CisgICAgfQorfQorCisvKioKKyAqIFJlbGVhc2VzIHRoZSBzZXJ2ZXIncyBhZGRyZXNzIGFuZCBzdG9wcyBsaXN0ZW5pbmcgZm9yCisgKiBuZXcgY2xpZW50cy4gSWYgY2FsbGVkIG1vcmUgdGhhbiBvbmNlLCBvbmx5IHRoZSBmaXJzdAorICogY2FsbCBoYXMgYW4gZWZmZWN0LiBEb2VzIG5vdCBtb2RpZnkgdGhlIHNlcnZlcidzCisgKiByZWZlcmVuY2UgY291bnQuCisgKiAKKyAqIEBwYXJhbSBzZXJ2ZXIgdGhlIHNlcnZlci4KKyAqLwordm9pZAorZGJ1c19zZXJ2ZXJfZGlzY29ubmVjdCAoREJ1c1NlcnZlciAqc2VydmVyKQoreworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAoc2VydmVyICE9IE5VTEwpOworCisgIGRidXNfc2VydmVyX3JlZiAoc2VydmVyKTsKKyAgU0VSVkVSX0xPQ0sgKHNlcnZlcik7CisKKyAgX2RidXNfc2VydmVyX2Rpc2Nvbm5lY3RfdW5sb2NrZWQgKHNlcnZlcik7CisKKyAgU0VSVkVSX1VOTE9DSyAoc2VydmVyKTsKKyAgZGJ1c19zZXJ2ZXJfdW5yZWYgKHNlcnZlcik7Cit9CisKKy8qKgorICogUmV0dXJucyAjVFJVRSBpZiB0aGUgc2VydmVyIGlzIHN0aWxsIGxpc3RlbmluZyBmb3IgbmV3IGNvbm5lY3Rpb25zLgorICoKKyAqIEBwYXJhbSBzZXJ2ZXIgdGhlIHNlcnZlci4KKyAqLworZGJ1c19ib29sX3QKK2RidXNfc2VydmVyX2dldF9pc19jb25uZWN0ZWQgKERCdXNTZXJ2ZXIgKnNlcnZlcikKK3sKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICAKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChzZXJ2ZXIgIT0gTlVMTCwgRkFMU0UpOworCisgIFNFUlZFUl9MT0NLIChzZXJ2ZXIpOworICByZXR2YWwgPSAhc2VydmVyLT5kaXNjb25uZWN0ZWQ7CisgIFNFUlZFUl9VTkxPQ0sgKHNlcnZlcik7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBSZXR1cm5zIHRoZSBhZGRyZXNzIG9mIHRoZSBzZXJ2ZXIsIGFzIGEgbmV3bHktYWxsb2NhdGVkCisgKiBzdHJpbmcgd2hpY2ggbXVzdCBiZSBmcmVlZCBieSB0aGUgY2FsbGVyLgorICoKKyAqIEBwYXJhbSBzZXJ2ZXIgdGhlIHNlcnZlcgorICogQHJldHVybnMgdGhlIGFkZHJlc3Mgb3IgI05VTEwgaWYgbm8gbWVtb3J5CisgKi8KK2NoYXIqCitkYnVzX3NlcnZlcl9nZXRfYWRkcmVzcyAoREJ1c1NlcnZlciAqc2VydmVyKQoreworICBjaGFyICpyZXR2YWw7CisgIAorICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHNlcnZlciAhPSBOVUxMLCBOVUxMKTsKKworICBTRVJWRVJfTE9DSyAoc2VydmVyKTsKKyAgcmV0dmFsID0gX2RidXNfc3RyZHVwIChzZXJ2ZXItPmFkZHJlc3MpOworICBTRVJWRVJfVU5MT0NLIChzZXJ2ZXIpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogUmV0dXJucyB0aGUgdW5pcXVlIElEIG9mIHRoZSBzZXJ2ZXIsIGFzIGEgbmV3bHktYWxsb2NhdGVkCisgKiBzdHJpbmcgd2hpY2ggbXVzdCBiZSBmcmVlZCBieSB0aGUgY2FsbGVyLiBUaGlzIElEIGlzCisgKiBub3JtYWxseSB1c2VkIGJ5IGNsaWVudHMgdG8gdGVsbCB3aGVuIHR3byAjREJ1c0Nvbm5lY3Rpb24KKyAqIHdvdWxkIGJlIGVxdWl2YWxlbnQgKGJlY2F1c2UgdGhlIHNlcnZlciBhZGRyZXNzIHBhc3NlZAorICogdG8gZGJ1c19jb25uZWN0aW9uX29wZW4oKSB3aWxsIGhhdmUgdGhlIHNhbWUgZ3VpZCBpbiB0aGUKKyAqIHR3byBjYXNlcykuIGRidXNfY29ubmVjdGlvbl9vcGVuKCkgY2FuIHJlLXVzZSBhbiBleGlzdGluZworICogY29ubmVjdGlvbiB3aXRoIHRoZSBzYW1lIElEIGluc3RlYWQgb2Ygb3BlbmluZyBhIG5ldworICogY29ubmVjdGlvbi4KKyAqCisgKiBUaGlzIGlzIGFuIElEIHVuaXF1ZSB0byBlYWNoICNEQnVzU2VydmVyLiBSZW1lbWJlciB0aGF0CisgKiBhICNEQnVzU2VydmVyIHJlcHJlc2VudHMgb25seSBvbmUgbW9kZSBvZiBjb25uZWN0aW5nLAorICogc28gZS5nLiBhIGJ1cyBkYWVtb24gY2FuIGxpc3RlbiBvbiBtdWx0aXBsZSBhZGRyZXNzZXMKKyAqIHdoaWNoIHdpbGwgbWVhbiBpdCBoYXMgbXVsdGlwbGUgI0RCdXNTZXJ2ZXIgZWFjaCB3aXRoCisgKiB0aGVpciBvd24gSUQuCisgKgorICogVGhlIElEIGlzIG5vdCBhIFVVSUQgaW4gdGhlIHNlbnNlIG9mIFJGQzQxMjI7IHRoZSBkZXRhaWxzCisgKiBhcmUgZXhwbGFpbmVkIGluIHRoZSBELUJ1cyBzcGVjaWZpY2F0aW9uLgorICoKKyAqIEBwYXJhbSBzZXJ2ZXIgdGhlIHNlcnZlcgorICogQHJldHVybnMgdGhlIGlkIG9mIHRoZSBzZXJ2ZXIgb3IgI05VTEwgaWYgbm8gbWVtb3J5CisgKi8KK2NoYXIqCitkYnVzX3NlcnZlcl9nZXRfaWQgKERCdXNTZXJ2ZXIgKnNlcnZlcikKK3sKKyAgY2hhciAqcmV0dmFsOworICAKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChzZXJ2ZXIgIT0gTlVMTCwgTlVMTCk7CisKKyAgU0VSVkVSX0xPQ0sgKHNlcnZlcik7CisgIHJldHZhbCA9IE5VTEw7CisgIF9kYnVzX3N0cmluZ19jb3B5X2RhdGEgKCZzZXJ2ZXItPmd1aWRfaGV4LCAmcmV0dmFsKTsKKyAgU0VSVkVSX1VOTE9DSyAoc2VydmVyKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIFNldHMgYSBmdW5jdGlvbiB0byBiZSB1c2VkIGZvciBoYW5kbGluZyBuZXcgY29ubmVjdGlvbnMuICBUaGUgZ2l2ZW4KKyAqIGZ1bmN0aW9uIGlzIHBhc3NlZCBlYWNoIG5ldyBjb25uZWN0aW9uIGFzIHRoZSBjb25uZWN0aW9uIGlzCisgKiBjcmVhdGVkLiBJZiB0aGUgbmV3IGNvbm5lY3Rpb24gZnVuY3Rpb24gaW5jcmVtZW50cyB0aGUgY29ubmVjdGlvbidzCisgKiByZWZlcmVuY2UgY291bnQsIHRoZSBjb25uZWN0aW9uIHdpbGwgc3RheSBhbGl2ZS4gT3RoZXJ3aXNlLCB0aGUKKyAqIGNvbm5lY3Rpb24gd2lsbCBiZSB1bnJlZmVyZW5jZWQgYW5kIGNsb3NlZC4gVGhlIG5ldyBjb25uZWN0aW9uCisgKiBmdW5jdGlvbiBtYXkgYWxzbyBjbG9zZSB0aGUgY29ubmVjdGlvbiBpdHNlbGYsIHdoaWNoIGlzIGNvbnNpZGVyZWQKKyAqIGdvb2QgZm9ybSBpZiB0aGUgY29ubmVjdGlvbiBpcyBub3Qgd2FudGVkLgorICoKKyAqIFRoZSBjb25uZWN0aW9uIGhlcmUgaXMgcHJpdmF0ZSBpbiB0aGUgc2Vuc2Ugb2YKKyAqIGRidXNfY29ubmVjdGlvbl9vcGVuX3ByaXZhdGUoKSwgc28gaWYgdGhlIG5ldyBjb25uZWN0aW9uIGZ1bmN0aW9uCisgKiBrZWVwcyBhIHJlZmVyZW5jZSBpdCBtdXN0IGFycmFuZ2UgZm9yIHRoZSBjb25uZWN0aW9uIHRvIGJlIGNsb3NlZC4KKyAqIGkuZS4gbGliZGJ1cyBkb2VzIG5vdCBvd24gdGhpcyBjb25uZWN0aW9uIG9uY2UgdGhlIG5ldyBjb25uZWN0aW9uCisgKiBmdW5jdGlvbiB0YWtlcyBhIHJlZmVyZW5jZS4KKyAqCisgKiBAcGFyYW0gc2VydmVyIHRoZSBzZXJ2ZXIuCisgKiBAcGFyYW0gZnVuY3Rpb24gYSBmdW5jdGlvbiB0byBoYW5kbGUgbmV3IGNvbm5lY3Rpb25zLgorICogQHBhcmFtIGRhdGEgZGF0YSB0byBwYXNzIHRvIHRoZSBuZXcgY29ubmVjdGlvbiBoYW5kbGVyLgorICogQHBhcmFtIGZyZWVfZGF0YV9mdW5jdGlvbiBmdW5jdGlvbiB0byBmcmVlIHRoZSBkYXRhLgorICovCit2b2lkCitkYnVzX3NlcnZlcl9zZXRfbmV3X2Nvbm5lY3Rpb25fZnVuY3Rpb24gKERCdXNTZXJ2ZXIgICAgICAgICAgICAgICAgKnNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c05ld0Nvbm5lY3Rpb25GdW5jdGlvbiAgZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNGcmVlRnVuY3Rpb24gICAgICAgICAgIGZyZWVfZGF0YV9mdW5jdGlvbikKK3sKKyAgREJ1c0ZyZWVGdW5jdGlvbiBvbGRfZnJlZV9mdW5jdGlvbjsKKyAgdm9pZCAqb2xkX2RhdGE7CisgIAorICBfZGJ1c19yZXR1cm5faWZfZmFpbCAoc2VydmVyICE9IE5VTEwpOworCisgIFNFUlZFUl9MT0NLIChzZXJ2ZXIpOworICBvbGRfZnJlZV9mdW5jdGlvbiA9IHNlcnZlci0+bmV3X2Nvbm5lY3Rpb25fZnJlZV9kYXRhX2Z1bmN0aW9uOworICBvbGRfZGF0YSA9IHNlcnZlci0+bmV3X2Nvbm5lY3Rpb25fZGF0YTsKKyAgCisgIHNlcnZlci0+bmV3X2Nvbm5lY3Rpb25fZnVuY3Rpb24gPSBmdW5jdGlvbjsKKyAgc2VydmVyLT5uZXdfY29ubmVjdGlvbl9kYXRhID0gZGF0YTsKKyAgc2VydmVyLT5uZXdfY29ubmVjdGlvbl9mcmVlX2RhdGFfZnVuY3Rpb24gPSBmcmVlX2RhdGFfZnVuY3Rpb247CisgIFNFUlZFUl9VTkxPQ0sgKHNlcnZlcik7CisgICAgCisgIGlmIChvbGRfZnJlZV9mdW5jdGlvbiAhPSBOVUxMKQorICAgICgqIG9sZF9mcmVlX2Z1bmN0aW9uKSAob2xkX2RhdGEpOworfQorCisvKioKKyAqIFNldHMgdGhlIHdhdGNoIGZ1bmN0aW9ucyBmb3IgdGhlIHNlcnZlci4gVGhlc2UgZnVuY3Rpb25zIGFyZQorICogcmVzcG9uc2libGUgZm9yIG1ha2luZyB0aGUgYXBwbGljYXRpb24ncyBtYWluIGxvb3AgYXdhcmUgb2YgZmlsZQorICogZGVzY3JpcHRvcnMgdGhhdCBuZWVkIHRvIGJlIG1vbml0b3JlZCBmb3IgZXZlbnRzLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gYmVoYXZlcyBleGFjdGx5IGxpa2UgZGJ1c19jb25uZWN0aW9uX3NldF93YXRjaF9mdW5jdGlvbnMoKTsKKyAqIHNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhhdCByb3V0aW5lLgorICoKKyAqIEBwYXJhbSBzZXJ2ZXIgdGhlIHNlcnZlci4KKyAqIEBwYXJhbSBhZGRfZnVuY3Rpb24gZnVuY3Rpb24gdG8gYmVnaW4gbW9uaXRvcmluZyBhIG5ldyBkZXNjcmlwdG9yLgorICogQHBhcmFtIHJlbW92ZV9mdW5jdGlvbiBmdW5jdGlvbiB0byBzdG9wIG1vbml0b3JpbmcgYSBkZXNjcmlwdG9yLgorICogQHBhcmFtIHRvZ2dsZWRfZnVuY3Rpb24gZnVuY3Rpb24gdG8gbm90aWZ5IHdoZW4gdGhlIHdhdGNoIGlzIGVuYWJsZWQvZGlzYWJsZWQKKyAqIEBwYXJhbSBkYXRhIGRhdGEgdG8gcGFzcyB0byBhZGRfZnVuY3Rpb24gYW5kIHJlbW92ZV9mdW5jdGlvbi4KKyAqIEBwYXJhbSBmcmVlX2RhdGFfZnVuY3Rpb24gZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHRvIGZyZWUgdGhlIGRhdGEuCisgKiBAcmV0dXJucyAjRkFMU0Ugb24gZmFpbHVyZSAobm8gbWVtb3J5KQorICovCitkYnVzX2Jvb2xfdAorZGJ1c19zZXJ2ZXJfc2V0X3dhdGNoX2Z1bmN0aW9ucyAoREJ1c1NlcnZlciAgICAgICAgICAgICAgKnNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNBZGRXYXRjaEZ1bmN0aW9uICAgICBhZGRfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzUmVtb3ZlV2F0Y2hGdW5jdGlvbiAgcmVtb3ZlX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1dhdGNoVG9nZ2xlZEZ1bmN0aW9uIHRvZ2dsZWRfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNGcmVlRnVuY3Rpb24gICAgICAgICBmcmVlX2RhdGFfZnVuY3Rpb24pCit7CisgIGRidXNfYm9vbF90IHJlc3VsdDsKKyAgREJ1c1dhdGNoTGlzdCAqd2F0Y2hlczsKKyAgCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoc2VydmVyICE9IE5VTEwsIEZBTFNFKTsKKworICBTRVJWRVJfTE9DSyAoc2VydmVyKTsKKyAgd2F0Y2hlcyA9IHNlcnZlci0+d2F0Y2hlczsKKyAgc2VydmVyLT53YXRjaGVzID0gTlVMTDsKKyAgaWYgKHdhdGNoZXMpCisgICAgeworICAgICAgU0VSVkVSX1VOTE9DSyAoc2VydmVyKTsKKyAgICAgIHJlc3VsdCA9IF9kYnVzX3dhdGNoX2xpc3Rfc2V0X2Z1bmN0aW9ucyAod2F0Y2hlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvZ2dsZWRfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWVfZGF0YV9mdW5jdGlvbik7CisgICAgICBTRVJWRVJfTE9DSyAoc2VydmVyKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfZGJ1c193YXJuX2NoZWNrX2ZhaWxlZCAoIlJlLWVudHJhbnQgY2FsbCB0byAlcyIsIF9EQlVTX0ZVTkNUSU9OX05BTUUpOworICAgICAgcmVzdWx0ID0gRkFMU0U7CisgICAgfQorICBzZXJ2ZXItPndhdGNoZXMgPSB3YXRjaGVzOworICBTRVJWRVJfVU5MT0NLIChzZXJ2ZXIpOworICAKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBTZXRzIHRoZSB0aW1lb3V0IGZ1bmN0aW9ucyBmb3IgdGhlIHNlcnZlci4gVGhlc2UgZnVuY3Rpb25zIGFyZQorICogcmVzcG9uc2libGUgZm9yIG1ha2luZyB0aGUgYXBwbGljYXRpb24ncyBtYWluIGxvb3AgYXdhcmUgb2YgdGltZW91dHMuCisgKgorICogVGhpcyBmdW5jdGlvbiBiZWhhdmVzIGV4YWN0bHkgbGlrZSBkYnVzX2Nvbm5lY3Rpb25fc2V0X3RpbWVvdXRfZnVuY3Rpb25zKCk7CisgKiBzZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoYXQgcm91dGluZS4KKyAqCisgKiBAcGFyYW0gc2VydmVyIHRoZSBzZXJ2ZXIuCisgKiBAcGFyYW0gYWRkX2Z1bmN0aW9uIGZ1bmN0aW9uIHRvIGFkZCBhIHRpbWVvdXQuCisgKiBAcGFyYW0gcmVtb3ZlX2Z1bmN0aW9uIGZ1bmN0aW9uIHRvIHJlbW92ZSBhIHRpbWVvdXQuCisgKiBAcGFyYW0gdG9nZ2xlZF9mdW5jdGlvbiBmdW5jdGlvbiB0byBub3RpZnkgd2hlbiB0aGUgdGltZW91dCBpcyBlbmFibGVkL2Rpc2FibGVkCisgKiBAcGFyYW0gZGF0YSBkYXRhIHRvIHBhc3MgdG8gYWRkX2Z1bmN0aW9uIGFuZCByZW1vdmVfZnVuY3Rpb24uCisgKiBAcGFyYW0gZnJlZV9kYXRhX2Z1bmN0aW9uIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB0byBmcmVlIHRoZSBkYXRhLgorICogQHJldHVybnMgI0ZBTFNFIG9uIGZhaWx1cmUgKG5vIG1lbW9yeSkKKyAqLworZGJ1c19ib29sX3QKK2RidXNfc2VydmVyX3NldF90aW1lb3V0X2Z1bmN0aW9ucyAoREJ1c1NlcnZlciAgICAgICAgICAgICAgICAqc2VydmVyLAorCQkJCSAgIERCdXNBZGRUaW1lb3V0RnVuY3Rpb24gICAgIGFkZF9mdW5jdGlvbiwKKwkJCQkgICBEQnVzUmVtb3ZlVGltZW91dEZ1bmN0aW9uICByZW1vdmVfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUaW1lb3V0VG9nZ2xlZEZ1bmN0aW9uIHRvZ2dsZWRfZnVuY3Rpb24sCisJCQkJICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAqZGF0YSwKKwkJCQkgICBEQnVzRnJlZUZ1bmN0aW9uICAgICAgICAgICBmcmVlX2RhdGFfZnVuY3Rpb24pCit7CisgIGRidXNfYm9vbF90IHJlc3VsdDsKKyAgREJ1c1RpbWVvdXRMaXN0ICp0aW1lb3V0czsKKyAgCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoc2VydmVyICE9IE5VTEwsIEZBTFNFKTsKKworICBTRVJWRVJfTE9DSyAoc2VydmVyKTsKKyAgdGltZW91dHMgPSBzZXJ2ZXItPnRpbWVvdXRzOworICBzZXJ2ZXItPnRpbWVvdXRzID0gTlVMTDsKKyAgaWYgKHRpbWVvdXRzKQorICAgIHsKKyAgICAgIFNFUlZFUl9VTkxPQ0sgKHNlcnZlcik7CisgICAgICByZXN1bHQgPSBfZGJ1c190aW1lb3V0X2xpc3Rfc2V0X2Z1bmN0aW9ucyAodGltZW91dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZV9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2dnbGVkX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZV9kYXRhX2Z1bmN0aW9uKTsKKyAgICAgIFNFUlZFUl9MT0NLIChzZXJ2ZXIpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm5fY2hlY2tfZmFpbGVkICgiUmUtZW50cmFudCBjYWxsIHRvICVzIiwgX0RCVVNfRlVOQ1RJT05fTkFNRSk7CisgICAgICByZXN1bHQgPSBGQUxTRTsKKyAgICB9CisgIHNlcnZlci0+dGltZW91dHMgPSB0aW1lb3V0czsKKyAgU0VSVkVSX1VOTE9DSyAoc2VydmVyKTsKKyAgCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogU2V0cyB0aGUgYXV0aGVudGljYXRpb24gbWVjaGFuaXNtcyB0aGF0IHRoaXMgc2VydmVyIG9mZmVycyB0bworICogY2xpZW50cywgYXMgYSAjTlVMTC10ZXJtaW5hdGVkIGFycmF5IG9mIG1lY2hhbmlzbSBuYW1lcy4gVGhpcworICogZnVuY3Rpb24gb25seSBhZmZlY3RzIGNvbm5lY3Rpb25zIGNyZWF0ZWQgPGVtPmFmdGVyPC9lbT4gaXQgaXMKKyAqIGNhbGxlZC4gIFBhc3MgI05VTEwgaW5zdGVhZCBvZiBhbiBhcnJheSB0byB1c2UgYWxsIGF2YWlsYWJsZQorICogbWVjaGFuaXNtcyAodGhpcyBpcyB0aGUgZGVmYXVsdCBiZWhhdmlvcikuCisgKgorICogVGhlIEQtQnVzIHNwZWNpZmljYXRpb24gZGVzY3JpYmVzIHNvbWUgb2YgdGhlIHN1cHBvcnRlZCBtZWNoYW5pc21zLgorICoKKyAqIEBwYXJhbSBzZXJ2ZXIgdGhlIHNlcnZlcgorICogQHBhcmFtIG1lY2hhbmlzbXMgI05VTEwtdGVybWluYXRlZCBhcnJheSBvZiBtZWNoYW5pc21zCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm8gbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitkYnVzX3NlcnZlcl9zZXRfYXV0aF9tZWNoYW5pc21zIChEQnVzU2VydmVyICAqc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKm1lY2hhbmlzbXMpCit7CisgIGNoYXIgKipjb3B5OworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAoc2VydmVyICE9IE5VTEwsIEZBTFNFKTsKKworICBTRVJWRVJfTE9DSyAoc2VydmVyKTsKKyAgCisgIGlmIChtZWNoYW5pc21zICE9IE5VTEwpCisgICAgeworICAgICAgY29weSA9IF9kYnVzX2R1cF9zdHJpbmdfYXJyYXkgKG1lY2hhbmlzbXMpOworICAgICAgaWYgKGNvcHkgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIFNFUlZFUl9VTkxPQ0sgKHNlcnZlcik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgfQorICBlbHNlCisgICAgY29weSA9IE5VTEw7CisKKyAgZGJ1c19mcmVlX3N0cmluZ19hcnJheSAoc2VydmVyLT5hdXRoX21lY2hhbmlzbXMpOworICBzZXJ2ZXItPmF1dGhfbWVjaGFuaXNtcyA9IGNvcHk7CisKKyAgU0VSVkVSX1VOTE9DSyAoc2VydmVyKTsKKyAgCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgREJ1c0RhdGFTbG90QWxsb2NhdG9yIHNsb3RfYWxsb2NhdG9yID0KKyAgX0RCVVNfREFUQV9TTE9UX0FMTE9DQVRPUl9JTklUIChfREJVU19MT0NLX05BTUUgKHNlcnZlcl9zbG90cykpOworCisvKioKKyAqIEFsbG9jYXRlcyBhbiBpbnRlZ2VyIElEIHRvIGJlIHVzZWQgZm9yIHN0b3JpbmcgYXBwbGljYXRpb24tc3BlY2lmaWMKKyAqIGRhdGEgb24gYW55IERCdXNTZXJ2ZXIuIFRoZSBhbGxvY2F0ZWQgSUQgbWF5IHRoZW4gYmUgdXNlZAorICogd2l0aCBkYnVzX3NlcnZlcl9zZXRfZGF0YSgpIGFuZCBkYnVzX3NlcnZlcl9nZXRfZGF0YSgpLgorICogVGhlIHNsb3QgbXVzdCBiZSBpbml0aWFsaXplZCB3aXRoIC0xLiBJZiBhIG5vbm5lZ2F0aXZlCisgKiBzbG90IGlzIHBhc3NlZCBpbiwgdGhlIHJlZmNvdW50IGlzIGluY3JlbWVudGVkIG9uIHRoYXQKKyAqIHNsb3QsIHJhdGhlciB0aGFuIGNyZWF0aW5nIGEgbmV3IHNsb3QuCisgKiAgCisgKiBUaGUgYWxsb2NhdGVkIHNsb3QgaXMgZ2xvYmFsLCBpLmUuIGFsbCBEQnVzU2VydmVyIG9iamVjdHMgd2lsbCBoYXZlCisgKiBhIHNsb3Qgd2l0aCB0aGUgZ2l2ZW4gaW50ZWdlciBJRCByZXNlcnZlZC4KKyAqCisgKiBAcGFyYW0gc2xvdF9wIGFkZHJlc3Mgb2YgZ2xvYmFsIHZhcmlhYmxlIHN0b3JpbmcgdGhlIHNsb3QgSUQKKyAqIEByZXR1cm5zICNGQUxTRSBvbiBubyBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK2RidXNfc2VydmVyX2FsbG9jYXRlX2RhdGFfc2xvdCAoZGJ1c19pbnQzMl90ICpzbG90X3ApCit7CisgIHJldHVybiBfZGJ1c19kYXRhX3Nsb3RfYWxsb2NhdG9yX2FsbG9jICgmc2xvdF9hbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90X3ApOworfQorCisvKioKKyAqIERlYWxsb2NhdGVzIGEgZ2xvYmFsIElEIGZvciBzZXJ2ZXIgZGF0YSBzbG90cy4KKyAqIGRidXNfc2VydmVyX2dldF9kYXRhKCkgYW5kIGRidXNfc2VydmVyX3NldF9kYXRhKCkKKyAqIG1heSBubyBsb25nZXIgYmUgdXNlZCB3aXRoIHRoaXMgc2xvdC4KKyAqIEV4aXN0aW5nIGRhdGEgc3RvcmVkIG9uIGV4aXN0aW5nIERCdXNTZXJ2ZXIgb2JqZWN0cworICogd2lsbCBiZSBmcmVlZCB3aGVuIHRoZSBzZXJ2ZXIgaXMgZmluYWxpemVkLAorICogYnV0IG1heSBub3QgYmUgcmV0cmlldmVkIChhbmQgbWF5IG9ubHkgYmUgcmVwbGFjZWQKKyAqIGlmIHNvbWVvbmUgZWxzZSByZWFsbG9jYXRlcyB0aGUgc2xvdCkuCisgKgorICogQHBhcmFtIHNsb3RfcCBhZGRyZXNzIG9mIHRoZSBzbG90IHRvIGRlYWxsb2NhdGUKKyAqLwordm9pZAorZGJ1c19zZXJ2ZXJfZnJlZV9kYXRhX3Nsb3QgKGRidXNfaW50MzJfdCAqc2xvdF9wKQoreworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAoKnNsb3RfcCA+PSAwKTsKKyAgCisgIF9kYnVzX2RhdGFfc2xvdF9hbGxvY2F0b3JfZnJlZSAoJnNsb3RfYWxsb2NhdG9yLCBzbG90X3ApOworfQorCisvKioKKyAqIFN0b3JlcyBhIHBvaW50ZXIgb24gYSBEQnVzU2VydmVyLCBhbG9uZworICogd2l0aCBhbiBvcHRpb25hbCBmdW5jdGlvbiB0byBiZSB1c2VkIGZvciBmcmVlaW5nCisgKiB0aGUgZGF0YSB3aGVuIHRoZSBkYXRhIGlzIHNldCBhZ2Fpbiwgb3Igd2hlbgorICogdGhlIHNlcnZlciBpcyBmaW5hbGl6ZWQuIFRoZSBzbG90IG51bWJlcgorICogbXVzdCBoYXZlIGJlZW4gYWxsb2NhdGVkIHdpdGggZGJ1c19zZXJ2ZXJfYWxsb2NhdGVfZGF0YV9zbG90KCkuCisgKgorICogQHBhcmFtIHNlcnZlciB0aGUgc2VydmVyCisgKiBAcGFyYW0gc2xvdCB0aGUgc2xvdCBudW1iZXIKKyAqIEBwYXJhbSBkYXRhIHRoZSBkYXRhIHRvIHN0b3JlCisgKiBAcGFyYW0gZnJlZV9kYXRhX2Z1bmMgZmluYWxpemVyIGZ1bmN0aW9uIGZvciB0aGUgZGF0YQorICogQHJldHVybnMgI1RSVUUgaWYgdGhlcmUgd2FzIGVub3VnaCBtZW1vcnkgdG8gc3RvcmUgdGhlIGRhdGEKKyAqLworZGJ1c19ib29sX3QKK2RidXNfc2VydmVyX3NldF9kYXRhIChEQnVzU2VydmVyICAgICAgICpzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgc2xvdCwKKyAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgIERCdXNGcmVlRnVuY3Rpb24gIGZyZWVfZGF0YV9mdW5jKQoreworICBEQnVzRnJlZUZ1bmN0aW9uIG9sZF9mcmVlX2Z1bmM7CisgIHZvaWQgKm9sZF9kYXRhOworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChzZXJ2ZXIgIT0gTlVMTCwgRkFMU0UpOworCisgIFNFUlZFUl9MT0NLIChzZXJ2ZXIpOworICAKKyAgcmV0dmFsID0gX2RidXNfZGF0YV9zbG90X2xpc3Rfc2V0ICgmc2xvdF9hbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlcnZlci0+c2xvdF9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3QsIGRhdGEsIGZyZWVfZGF0YV9mdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvbGRfZnJlZV9mdW5jLCAmb2xkX2RhdGEpOworCisKKyAgU0VSVkVSX1VOTE9DSyAoc2VydmVyKTsKKyAgCisgIGlmIChyZXR2YWwpCisgICAgeworICAgICAgLyogRG8gdGhlIGFjdHVhbCBmcmVlIG91dHNpZGUgdGhlIHNlcnZlciBsb2NrICovCisgICAgICBpZiAob2xkX2ZyZWVfZnVuYykKKyAgICAgICAgKCogb2xkX2ZyZWVfZnVuYykgKG9sZF9kYXRhKTsKKyAgICB9CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBSZXRyaWV2ZXMgZGF0YSBwcmV2aW91c2x5IHNldCB3aXRoIGRidXNfc2VydmVyX3NldF9kYXRhKCkuCisgKiBUaGUgc2xvdCBtdXN0IHN0aWxsIGJlIGFsbG9jYXRlZCAobXVzdCBub3QgaGF2ZSBiZWVuIGZyZWVkKS4KKyAqCisgKiBAcGFyYW0gc2VydmVyIHRoZSBzZXJ2ZXIKKyAqIEBwYXJhbSBzbG90IHRoZSBzbG90IHRvIGdldCBkYXRhIGZyb20KKyAqIEByZXR1cm5zIHRoZSBkYXRhLCBvciAjTlVMTCBpZiBub3QgZm91bmQKKyAqLwordm9pZCoKK2RidXNfc2VydmVyX2dldF9kYXRhIChEQnVzU2VydmVyICAgKnNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgIHNsb3QpCit7CisgIHZvaWQgKnJlczsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHNlcnZlciAhPSBOVUxMLCBOVUxMKTsKKyAgCisgIFNFUlZFUl9MT0NLIChzZXJ2ZXIpOworICAKKyAgcmVzID0gX2RidXNfZGF0YV9zbG90X2xpc3RfZ2V0ICgmc2xvdF9hbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlcnZlci0+c2xvdF9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3QpOworCisgIFNFUlZFUl9VTkxPQ0sgKHNlcnZlcik7CisgIAorICByZXR1cm4gcmVzOworfQorCisvKiogQH0gKi8KKworI2lmZGVmIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTCisjaW5jbHVkZSAiZGJ1cy10ZXN0LmgiCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK2RidXNfYm9vbF90CitfZGJ1c19zZXJ2ZXJfdGVzdCAodm9pZCkKK3sKKyAgY29uc3QgY2hhciAqdmFsaWRfYWRkcmVzc2VzW10gPSB7CisgICAgInRjcDpwb3J0PTEyMzQiLAorICAgICJ0Y3A6aG9zdD1sb2NhbGhvc3QscG9ydD0xMjM0IiwKKyAgICAidGNwOmhvc3Q9bG9jYWxob3N0LHBvcnQ9MTIzNDt0Y3A6cG9ydD01Njc4IiwKKyNpZmRlZiBEQlVTX1VOSVgKKyAgICAidW5peDpwYXRoPS4vYm9vZ2llIiwKKyAgICAidGNwOnBvcnQ9MTIzNDt1bml4OnBhdGg9Li9ib29naWUiLAorI2VuZGlmCisgIH07CisKKyAgREJ1c1NlcnZlciAqc2VydmVyOworICBpbnQgaTsKKyAgCisgIGZvciAoaSA9IDA7IGkgPCBfREJVU19OX0VMRU1FTlRTICh2YWxpZF9hZGRyZXNzZXMpOyBpKyspCisgICAgeworICAgICAgREJ1c0Vycm9yIGVycm9yID0gREJVU19FUlJPUl9JTklUOworICAgICAgY2hhciAqYWRkcmVzczsKKyAgICAgIGNoYXIgKmlkOworCisgICAgICBzZXJ2ZXIgPSBkYnVzX3NlcnZlcl9saXN0ZW4gKHZhbGlkX2FkZHJlc3Nlc1tpXSwgJmVycm9yKTsKKyAgICAgIGlmIChzZXJ2ZXIgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJzZXJ2ZXIgbGlzdGVuIGVycm9yOiAlczogJXMiLCBlcnJvci5uYW1lLCBlcnJvci5tZXNzYWdlKTsKKyAgICAgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiRmFpbGVkIHRvIGxpc3RlbiBmb3IgdmFsaWQgYWRkcmVzcy4iKTsKKyAgICAgICAgfQorCisgICAgICBpZCA9IGRidXNfc2VydmVyX2dldF9pZCAoc2VydmVyKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAoaWQgIT0gTlVMTCk7CisgICAgICBhZGRyZXNzID0gZGJ1c19zZXJ2ZXJfZ2V0X2FkZHJlc3MgKHNlcnZlcik7CisgICAgICBfZGJ1c19hc3NlcnQgKGFkZHJlc3MgIT0gTlVMTCk7CisKKyAgICAgIGlmIChzdHJzdHIgKGFkZHJlc3MsIGlkKSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoInNlcnZlciBpZCAnJXMnIGlzIG5vdCBpbiB0aGUgc2VydmVyIGFkZHJlc3MgJyVzJyIsCisgICAgICAgICAgICAgICAgICAgICAgaWQsIGFkZHJlc3MpOworICAgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImJhZCBzZXJ2ZXIgaWQgb3IgYWRkcmVzcyIpOworICAgICAgICB9CisKKyAgICAgIGRidXNfZnJlZSAoaWQpOworICAgICAgZGJ1c19mcmVlIChhZGRyZXNzKTsKKyAgICAgIAorICAgICAgZGJ1c19zZXJ2ZXJfZGlzY29ubmVjdCAoc2VydmVyKTsKKyAgICAgIGRidXNfc2VydmVyX3VucmVmIChzZXJ2ZXIpOworICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworI2VuZGlmIC8qIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtc2VydmVyLmggYi9kYnVzL2RidXMtc2VydmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q4ZjA0ZQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1zZXJ2ZXIuaApAQCAtMCwwICsxLDEyNSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXNlcnZlci5oIERCdXNTZXJ2ZXIgb2JqZWN0CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzICBSZWQgSGF0IEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKyNpZiAhZGVmaW5lZCAoREJVU19JTlNJREVfREJVU19IKSAmJiAhZGVmaW5lZCAoREJVU19DT01QSUxBVElPTikKKyNlcnJvciAiT25seSA8ZGJ1cy9kYnVzLmg+IGNhbiBiZSBpbmNsdWRlZCBkaXJlY3RseSwgdGhpcyBmaWxlIG1heSBkaXNhcHBlYXIgb3IgY2hhbmdlIGNvbnRlbnRzLiIKKyNlbmRpZgorCisjaWZuZGVmIERCVVNfU0VSVkVSX0gKKyNkZWZpbmUgREJVU19TRVJWRVJfSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWVycm9ycy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1tYWNyb3MuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbWVzc2FnZS5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1jb25uZWN0aW9uLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXByb3RvY29sLmg+CisKK0RCVVNfQkVHSU5fREVDTFMKKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzU2VydmVyCisgKiBAeworICovCisKK3R5cGVkZWYgc3RydWN0IERCdXNTZXJ2ZXIgREJ1c1NlcnZlcjsKKworLyoqIENhbGxlZCB3aGVuIGEgbmV3IGNvbm5lY3Rpb24gdG8gdGhlIHNlcnZlciBpcyBhdmFpbGFibGUuIE11c3QgcmVmZXJlbmNlIGFuZCBzYXZlIHRoZSBuZXcKKyAqIGNvbm5lY3Rpb24sIG9yIGNsb3NlIHRoZSBuZXcgY29ubmVjdGlvbi4gU2V0IHdpdGggZGJ1c19zZXJ2ZXJfc2V0X25ld19jb25uZWN0aW9uX2Z1bmN0aW9uKCkuCisgKi8KK3R5cGVkZWYgdm9pZCAoKiBEQnVzTmV3Q29ubmVjdGlvbkZ1bmN0aW9uKSAoREJ1c1NlcnZlciAgICAgKnNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKm5ld19jb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAqZGF0YSk7CisKK0RCVVNfRVhQT1JUCitEQnVzU2VydmVyKiBkYnVzX3NlcnZlcl9saXN0ZW4gICAgICAgICAgIChjb25zdCBjaGFyICAgICAqYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcik7CitEQlVTX0VYUE9SVAorREJ1c1NlcnZlciogZGJ1c19zZXJ2ZXJfcmVmICAgICAgICAgICAgICAoREJ1c1NlcnZlciAgICAgKnNlcnZlcik7CitEQlVTX0VYUE9SVAordm9pZCAgICAgICAgZGJ1c19zZXJ2ZXJfdW5yZWYgICAgICAgICAgICAoREJ1c1NlcnZlciAgICAgKnNlcnZlcik7CitEQlVTX0VYUE9SVAordm9pZCAgICAgICAgZGJ1c19zZXJ2ZXJfZGlzY29ubmVjdCAgICAgICAoREJ1c1NlcnZlciAgICAgKnNlcnZlcik7CitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgZGJ1c19zZXJ2ZXJfZ2V0X2lzX2Nvbm5lY3RlZCAoREJ1c1NlcnZlciAgICAgKnNlcnZlcik7CitEQlVTX0VYUE9SVAorY2hhciogICAgICAgZGJ1c19zZXJ2ZXJfZ2V0X2FkZHJlc3MgICAgICAoREJ1c1NlcnZlciAgICAgKnNlcnZlcik7CitEQlVTX0VYUE9SVAorY2hhciogICAgICAgZGJ1c19zZXJ2ZXJfZ2V0X2lkICAgICAgICAgICAoREJ1c1NlcnZlciAgICAgKnNlcnZlcik7CitEQlVTX0VYUE9SVAordm9pZCAgICAgICAgZGJ1c19zZXJ2ZXJfc2V0X25ld19jb25uZWN0aW9uX2Z1bmN0aW9uIChEQnVzU2VydmVyICAgICAgICAgICAgICAgICpzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNOZXdDb25uZWN0aW9uRnVuY3Rpb24gIGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRnJlZUZ1bmN0aW9uICAgICAgICAgICBmcmVlX2RhdGFfZnVuY3Rpb24pOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90IGRidXNfc2VydmVyX3NldF93YXRjaF9mdW5jdGlvbnMgICAgICAgICAoREJ1c1NlcnZlciAgICAgICAgICAgICAgICAqc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQWRkV2F0Y2hGdW5jdGlvbiAgICAgICBhZGRfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNSZW1vdmVXYXRjaEZ1bmN0aW9uICAgIHJlbW92ZV9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1dhdGNoVG9nZ2xlZEZ1bmN0aW9uICAgdG9nZ2xlZF9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgICAgICAgICAgZnJlZV9kYXRhX2Z1bmN0aW9uKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCBkYnVzX3NlcnZlcl9zZXRfdGltZW91dF9mdW5jdGlvbnMgICAgICAgKERCdXNTZXJ2ZXIgICAgICAgICAgICAgICAgKnNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0FkZFRpbWVvdXRGdW5jdGlvbiAgICAgYWRkX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzUmVtb3ZlVGltZW91dEZ1bmN0aW9uICByZW1vdmVfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUaW1lb3V0VG9nZ2xlZEZ1bmN0aW9uIHRvZ2dsZWRfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNGcmVlRnVuY3Rpb24gICAgICAgICAgIGZyZWVfZGF0YV9mdW5jdGlvbik7CitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgZGJ1c19zZXJ2ZXJfc2V0X2F1dGhfbWVjaGFuaXNtcyAgICAgICAgIChEQnVzU2VydmVyICAgICAgICAgICAgICAgICpzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICAgICAgICAqKm1lY2hhbmlzbXMpOworCitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgZGJ1c19zZXJ2ZXJfYWxsb2NhdGVfZGF0YV9zbG90IChkYnVzX2ludDMyX3QgICAgICpzbG90X3ApOworREJVU19FWFBPUlQKK3ZvaWQgICAgICAgIGRidXNfc2VydmVyX2ZyZWVfZGF0YV9zbG90ICAgICAoZGJ1c19pbnQzMl90ICAgICAqc2xvdF9wKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCBkYnVzX3NlcnZlcl9zZXRfZGF0YSAgICAgICAgICAgKERCdXNTZXJ2ZXIgICAgICAgKnNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgc2xvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgZnJlZV9kYXRhX2Z1bmMpOworREJVU19FWFBPUlQKK3ZvaWQqICAgICAgIGRidXNfc2VydmVyX2dldF9kYXRhICAgICAgICAgICAoREJ1c1NlcnZlciAgICAgICAqc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzbG90KTsKKworLyoqCisgKiBDbGVhciBhIHZhcmlhYmxlIG9yIHN0cnVjdCBtZW1iZXIgdGhhdCBjb250YWlucyBhICNEQnVzU2VydmVyLgorICogSWYgaXQgZG9lcyBub3QgY29udGFpbiAjTlVMTCwgdGhlIHNlcnZlciB0aGF0IHdhcyBwcmV2aW91c2x5CisgKiB0aGVyZSBpcyB1bnJlZmVyZW5jZWQgd2l0aCBkYnVzX3NlcnZlcl91bnJlZigpLgorICoKKyAqIFRoaXMgaXMgdmVyeSBzaW1pbGFyIHRvIGRidXNfY2xlYXJfY29ubmVjdGlvbigpOiBzZWUgdGhhdCBmdW5jdGlvbgorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBAcGFyYW0gcG9pbnRlcl90b19zZXJ2ZXIgQSBwb2ludGVyIHRvIGEgdmFyaWFibGUgb3Igc3RydWN0IG1lbWJlci4KKyAqIHBvaW50ZXJfdG9fc2VydmVyIG11c3Qgbm90IGJlICNOVUxMLCBidXQgKnBvaW50ZXJfdG9fc2VydmVyCisgKiBtYXkgYmUgI05VTEwuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorZGJ1c19jbGVhcl9zZXJ2ZXIgKERCdXNTZXJ2ZXIgKipwb2ludGVyX3RvX3NlcnZlcikKK3sKKyAgX2RidXNfY2xlYXJfcG9pbnRlcl9pbXBsIChEQnVzU2VydmVyLCBwb2ludGVyX3RvX3NlcnZlciwgZGJ1c19zZXJ2ZXJfdW5yZWYpOworfQorCisvKiogQH0gKi8KKworREJVU19FTkRfREVDTFMKKworI2VuZGlmIC8qIERCVVNfU0VSVkVSX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1zaGEuYyBiL2RidXMvZGJ1cy1zaGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmM3NGY1Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLXNoYS5jCkBAIC0wLDAgKzEsOTc0IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtc2hhLmMgU0hBLTEgaW1wbGVtZW50YXRpb24KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgUmVkIEhhdCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUgQS4gTS4gS3VjaGxpbmcKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLWludGVybmFscy5oIgorI2luY2x1ZGUgImRidXMtc2hhLmgiCisjaW5jbHVkZSAiZGJ1cy1tYXJzaGFsLWJhc2ljLmgiIC8qIGZvciBieXRlc3dhcCByb3V0aW5lcyAqLworI2luY2x1ZGUgPHN0cmluZy5oPgorCisvKiBUaGUgZm9sbG93aW5nIGNvbW1lbnRzIGhhdmUgdGhlIGhpc3Rvcnkgb2Ygd2hlcmUgdGhpcyBjb2RlCisgKiBjb21lcyBmcm9tLiBJIGFjdHVhbGx5IGNvcGllZCBpdCBmcm9tIEdOZXQgaW4gR05PTUUgQ1ZTLgorICogLSBocEByZWRoYXQuY29tCisgKi8KKworLyoKKyAqICBzaGEuaCA6IEltcGxlbWVudGF0aW9uIG9mIHRoZSBTZWN1cmUgSGFzaCBBbGdvcml0aG0KKyAqCisgKiBQYXJ0IG9mIHRoZSBQeXRob24gQ3J5cHRvZ3JhcGh5IFRvb2xraXQsIHZlcnNpb24gMS4wLjAKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUsIEEuTS4gS3VjaGxpbmcKKyAqCisgKiBEaXN0cmlidXRlIGFuZCB1c2UgZnJlZWx5OyB0aGVyZSBhcmUgbm8gcmVzdHJpY3Rpb25zIG9uIGZ1cnRoZXIKKyAqIGRpc3NlbWluYXRpb24gYW5kIHVzYWdlIGV4Y2VwdCB0aG9zZSBpbXBvc2VkIGJ5IHRoZSBsYXdzIG9mIHlvdXIKKyAqIGNvdW50cnkgb2YgcmVzaWRlbmNlLgorICoKKyAqLworCisvKiBTSEE6IE5JU1QncyBTZWN1cmUgSGFzaCBBbGdvcml0aG0gKi8KKworLyogQmFzZWQgb24gU0hBIGNvZGUgb3JpZ2luYWxseSBwb3N0ZWQgdG8gc2NpLmNyeXB0IGJ5IFBldGVyIEd1dG1hbm4KKyAgIGluIG1lc3NhZ2UgPDMwYWpvNSRvZThAY2N1Mi5hdWNrbGFuZC5hYy5uej4uCisgICBNb2RpZmllZCB0byB0ZXN0IGZvciBlbmRpYW5uZXNzIG9uIGNyZWF0aW9uIG9mIFNIQSBvYmplY3RzIGJ5IEFNSy4KKyAgIEFsc28sIHRoZSBvcmlnaW5hbCBzcGVjaWZpY2F0aW9uIG9mIFNIQSB3YXMgZm91bmQgdG8gaGF2ZSBhIHdlYWtuZXNzCisgICBieSBOU0EvTklTVC4gIFRoaXMgY29kZSBpbXBsZW1lbnRzIHRoZSBmaXhlZCB2ZXJzaW9uIG9mIFNIQS4KKyovCisKKy8qIEhlcmUncyB0aGUgZmlyc3QgcGFyYWdyYXBoIG9mIFBldGVyIEd1dG1hbm4ncyBwb3N0aW5nOgorCitUaGUgZm9sbG93aW5nIGlzIG15IFNIQSAoRklQUyAxODApIGNvZGUgdXBkYXRlZCB0byBhbGxvdyB1c2Ugb2YgdGhlICJmaXhlZCIKK1NIQSwgdGhhbmtzIHRvIEppbSBHaWxsb2dseSBhbmQgYW4gYW5vbnltb3VzIGNvbnRyaWJ1dG9yIGZvciB0aGUgaW5mb3JtYXRpb24gb24KK3doYXQncyBjaGFuZ2VkIGluIHRoZSBuZXcgdmVyc2lvbi4gIFRoZSBmaXggaXMgYSBzaW1wbGUgY2hhbmdlIHdoaWNoIGludm9sdmVzCithZGRpbmcgYSBzaW5nbGUgcm90YXRlIGluIHRoZSBpbml0aWFsIGV4cGFuc2lvbiBmdW5jdGlvbi4gIEl0IGlzIHVua25vd24KK3doZXRoZXIgdGhpcyBpcyBhbiBvcHRpbWFsIHNvbHV0aW9uIHRvIHRoZSBwcm9ibGVtIHdoaWNoIHdhcyBkaXNjb3ZlcmVkIGluIHRoZQorU0hBIG9yIHdoZXRoZXIgaXQncyBzaW1wbHkgYSBiYW5kYWlkIHdoaWNoIGZpeGVzIHRoZSBwcm9ibGVtIHdpdGggYSBtaW5pbXVtIG9mCitlZmZvcnQgKGZvciBleGFtcGxlIHRoZSByZWVuZ2luZWVyaW5nIG9mIGEgZ3JlYXQgbWFueSBDYXBzdG9uZSBjaGlwcykuCisqLworCisvKioKKyAqIEBkZWZncm91cCBEQnVzU0hBIFNIQSBpbXBsZW1lbnRhdGlvbgorICogQGluZ3JvdXAgIERCdXNJbnRlcm5hbHMKKyAqIEBicmllZiBTSEEtMSBoYXNoCisgKgorICogVHlwZXMgYW5kIGZ1bmN0aW9ucyByZWxhdGVkIHRvIGNvbXB1dGluZyBTSEEtMSBoYXNoLgorICovCisKKy8qKgorICogQGRlZmdyb3VwIERCdXNTSEFJbnRlcm5hbHMgU0hBIGltcGxlbWVudGF0aW9uIGRldGFpbHMKKyAqIEBpbmdyb3VwICBEQnVzSW50ZXJuYWxzCisgKiBAYnJpZWYgSW50ZXJuYWxzIG9mIFNIQSBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBUaGUgaW1wbGVtZW50YXRpb24gb2YgU0hBLTEgKHNlZSBodHRwOi8vd3d3Lml0bC5uaXN0Lmdvdi9maXBzcHVicy9maXAxODAtMS5odG0pLgorICogVGhpcyBTSEEgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gYnkgQS5NLiBLdWNobGluZworICoKKyAqIEB7CisgKi8KKworI2lmbmRlZiBET1hZR0VOX1NIT1VMRF9TS0lQX1RISVMKKworLyogVGhlIFNIQSBibG9jayBzaXplIGFuZCBtZXNzYWdlIGRpZ2VzdCBzaXplcywgaW4gYnl0ZXMgKi8KKworI2RlZmluZSBTSEFfREFUQVNJWkUgICAgNjQKKyNkZWZpbmUgU0hBX0RJR0VTVFNJWkUgIDIwCisKKy8qIFRoZSBTSEEgZigpLWZ1bmN0aW9ucy4gIFRoZSBmMSBhbmQgZjMgZnVuY3Rpb25zIGNhbiBiZSBvcHRpbWl6ZWQgdG8KKyAgIHNhdmUgb25lIGJvb2xlYW4gb3BlcmF0aW9uIGVhY2ggLSB0aGFua3MgdG8gUmljaCBTY2hyb2VwcGVsLAorICAgcmNzQGNzLmFyaXpvbmEuZWR1IGZvciBkaXNjb3ZlcmluZyB0aGlzICovCisKKy8qI2RlZmluZSBmMSh4LHkseikgKCAoIHggJiB5ICkgfCAoIH54ICYgeiApICkgICAgICAgICAgLy8gUm91bmRzICAwLTE5ICovCisjZGVmaW5lIGYxKHgseSx6KSAgKCB6IF4gKCB4ICYgKCB5IF4geiApICkgKSAgICAgICAgICAgLyogUm91bmRzICAwLTE5ICovCisjZGVmaW5lIGYyKHgseSx6KSAgKCB4IF4geSBeIHogKSAgICAgICAgICAgICAgICAgICAgICAgLyogUm91bmRzIDIwLTM5ICovCisvKiNkZWZpbmUgZjMoeCx5LHopICggKCB4ICYgeSApIHwgKCB4ICYgeiApIHwgKCB5ICYgeiApICkgICAvLyBSb3VuZHMgNDAtNTkgKi8KKyNkZWZpbmUgZjMoeCx5LHopICAoICggeCAmIHkgKSB8ICggeiAmICggeCB8IHkgKSApICkgICAvKiBSb3VuZHMgNDAtNTkgKi8KKyNkZWZpbmUgZjQoeCx5LHopICAoIHggXiB5IF4geiApICAgICAgICAgICAgICAgICAgICAgICAvKiBSb3VuZHMgNjAtNzkgKi8KKworLyogVGhlIFNIQSBNeXN0ZXJpb3VzIENvbnN0YW50cyAqLworCisjZGVmaW5lIEsxICAweDVBODI3OTk5TCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJvdW5kcyAgMC0xOSAqLworI2RlZmluZSBLMiAgMHg2RUQ5RUJBMUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSb3VuZHMgMjAtMzkgKi8KKyNkZWZpbmUgSzMgIDB4OEYxQkJDRENMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUm91bmRzIDQwLTU5ICovCisjZGVmaW5lIEs0ICAweENBNjJDMUQ2TCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJvdW5kcyA2MC03OSAqLworCisvKiBTSEEgaW5pdGlhbCB2YWx1ZXMgKi8KKworI2RlZmluZSBoMGluaXQgIDB4Njc0NTIzMDFMCisjZGVmaW5lIGgxaW5pdCAgMHhFRkNEQUI4OUwKKyNkZWZpbmUgaDJpbml0ICAweDk4QkFEQ0ZFTAorI2RlZmluZSBoM2luaXQgIDB4MTAzMjU0NzZMCisjZGVmaW5lIGg0aW5pdCAgMHhDM0QyRTFGMEwKKworLyogTm90ZSB0aGF0IGl0IG1heSBiZSBuZWNlc3NhcnkgdG8gYWRkIHBhcmVudGhlc2VzIHRvIHRoZXNlIG1hY3JvcyBpZiB0aGV5CisgICBhcmUgdG8gYmUgY2FsbGVkIHdpdGggZXhwcmVzc2lvbnMgYXMgYXJndW1lbnRzICovCisvKiAzMi1iaXQgcm90YXRlIGxlZnQgLSBrbHVkZ2VkIHdpdGggc2hpZnRzICovCisKKyNkZWZpbmUgUk9UTChuLFgpICggKCAoIFggKSA8PCBuICkgfCAoICggWCApID4+ICggMzIgLSBuICkgKSApCisKKy8qIFRoZSBpbml0aWFsIGV4cGFuZGluZyBmdW5jdGlvbi4gIFRoZSBoYXNoIGZ1bmN0aW9uIGlzIGRlZmluZWQgb3ZlciBhbgorICAgODAtd29yZCBleHBhbmRlZCBpbnB1dCBhcnJheSBXLCB3aGVyZSB0aGUgZmlyc3QgMTYgYXJlIGNvcGllcyBvZiB0aGUgaW5wdXQKKyAgIGRhdGEsIGFuZCB0aGUgcmVtYWluaW5nIDY0IGFyZSBkZWZpbmVkIGJ5CisKKyAgICAgICAgV1sgaSBdID0gV1sgaSAtIDE2IF0gXiBXWyBpIC0gMTQgXSBeIFdbIGkgLSA4IF0gXiBXWyBpIC0gMyBdCisKKyAgIFRoaXMgaW1wbGVtZW50YXRpb24gZ2VuZXJhdGVzIHRoZXNlIHZhbHVlcyBvbiB0aGUgZmx5IGluIGEgY2lyY3VsYXIKKyAgIGJ1ZmZlciAtIHRoYW5rcyB0byBDb2xpbiBQbHVtYiwgY29saW5Abnl4MTAuY3MuZHUuZWR1IGZvciB0aGlzCisgICBvcHRpbWl6YXRpb24uCisKKyAgIFRoZSB1cGRhdGVkIFNIQSBjaGFuZ2VzIHRoZSBleHBhbmRpbmcgZnVuY3Rpb24gYnkgYWRkaW5nIGEgcm90YXRlIG9mIDEKKyAgIGJpdC4gIFRoYW5rcyB0byBKaW0gR2lsbG9nbHksIGppbUByYW5kLm9yZywgYW5kIGFuIGFub255bW91cyBjb250cmlidXRvcgorICAgZm9yIHRoaXMgaW5mb3JtYXRpb24gKi8KKworI2RlZmluZSBleHBhbmQoVyxpKSAoIFdbIGkgJiAxNSBdID0gUk9UTCggMSwgKCBXWyBpICYgMTUgXSBeIFdbIChpIC0gMTQpICYgMTUgXSBeIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXWyAoaSAtIDgpICYgMTUgXSBeIFdbIChpIC0gMykgJiAxNSBdICkgKSApCisKKworLyogVGhlIHByb3RvdHlwZSBTSEEgc3ViLXJvdW5kLiAgVGhlIGZ1bmRhbWVudGFsIHN1Yi1yb3VuZCBpczoKKworICAgICAgICBhJyA9IGUgKyBST1RMKCA1LCBhICkgKyBmKCBiLCBjLCBkICkgKyBrICsgZGF0YTsKKyAgICAgICAgYicgPSBhOworICAgICAgICBjJyA9IFJPVEwoIDMwLCBiICk7CisgICAgICAgIGQnID0gYzsKKyAgICAgICAgZScgPSBkOworCisgICBidXQgdGhpcyBpcyBpbXBsZW1lbnRlZCBieSB1bnJvbGxpbmcgdGhlIGxvb3AgNSB0aW1lcyBhbmQgcmVuYW1pbmcgdGhlCisgICB2YXJpYWJsZXMgKCBlLCBhLCBiLCBjLCBkICkgPSAoIGEnLCBiJywgYycsIGQnLCBlJyApIGVhY2ggaXRlcmF0aW9uLgorICAgVGhpcyBjb2RlIGlzIHRoZW4gcmVwbGljYXRlZCAyMCB0aW1lcyBmb3IgZWFjaCBvZiB0aGUgNCBmdW5jdGlvbnMsIHVzaW5nCisgICB0aGUgbmV4dCAyMCB2YWx1ZXMgZnJvbSB0aGUgV1tdIGFycmF5IGVhY2ggdGltZSAqLworCisjZGVmaW5lIHN1YlJvdW5kKGEsIGIsIGMsIGQsIGUsIGYsIGssIGRhdGEpIFwKKyAgICggZSArPSBST1RMKCA1LCBhICkgKyBmKCBiLCBjLCBkICkgKyBrICsgZGF0YSwgYiA9IFJPVEwoIDMwLCBiICkgKQorCisjZW5kaWYgLyogIURPWFlHRU5fU0hPVUxEX1NLSVBfVEhJUyAqLworCisvKiBQZXJmb3JtIHRoZSBTSEEgdHJhbnNmb3JtYXRpb24uICBOb3RlIHRoYXQgdGhpcyBjb2RlLCBsaWtlIE1ENSwgc2VlbXMgdG8KKyAgIGJyZWFrIHNvbWUgb3B0aW1pemluZyBjb21waWxlcnMgZHVlIHRvIHRoZSBjb21wbGV4aXR5IG9mIHRoZSBleHByZXNzaW9ucworICAgYW5kIHRoZSBzaXplIG9mIHRoZSBiYXNpYyBibG9jay4gIEl0IG1heSBiZSBuZWNlc3NhcnkgdG8gc3BsaXQgaXQgaW50bworICAgc2VjdGlvbnMsIGUuZy4gYmFzZWQgb24gdGhlIGZvdXIgc3Vicm91bmRzCisKKyAgIE5vdGUgdGhhdCB0aGlzIGNvcnJ1cHRzIHRoZSBjb250ZXh0LT5kYXRhIGFyZWEgKi8KKworc3RhdGljIHZvaWQKK1NIQVRyYW5zZm9ybShkYnVzX3VpbnQzMl90ICpkaWdlc3QsIGRidXNfdWludDMyX3QgKmRhdGEpCit7CisgIGRidXNfdWludDMyX3QgQSwgQiwgQywgRCwgRTsgICAgIC8qIExvY2FsIHZhcnMgKi8KKyAgZGJ1c191aW50MzJfdCBlRGF0YVsxNl07ICAgICAgIC8qIEV4cGFuZGVkIGRhdGEgKi8KKworICAvKiBTZXQgdXAgZmlyc3QgYnVmZmVyIGFuZCBsb2NhbCBkYXRhIGJ1ZmZlciAqLworICBBID0gZGlnZXN0WzBdOworICBCID0gZGlnZXN0WzFdOworICBDID0gZGlnZXN0WzJdOworICBEID0gZGlnZXN0WzNdOworICBFID0gZGlnZXN0WzRdOworICBtZW1tb3ZlIChlRGF0YSwgZGF0YSwgU0hBX0RBVEFTSVpFKTsKKworICAvKiBIZWF2eSBtYW5nbGluZywgaW4gNCBzdWItcm91bmRzIG9mIDIwIGludGVyYXRpb25zIGVhY2guICovCisgIHN1YlJvdW5kIChBLCBCLCBDLCBELCBFLCBmMSwgSzEsIGVEYXRhWzBdKTsKKyAgc3ViUm91bmQgKEUsIEEsIEIsIEMsIEQsIGYxLCBLMSwgZURhdGFbMV0pOworICBzdWJSb3VuZCAoRCwgRSwgQSwgQiwgQywgZjEsIEsxLCBlRGF0YVsyXSk7CisgIHN1YlJvdW5kIChDLCBELCBFLCBBLCBCLCBmMSwgSzEsIGVEYXRhWzNdKTsKKyAgc3ViUm91bmQgKEIsIEMsIEQsIEUsIEEsIGYxLCBLMSwgZURhdGFbNF0pOworICBzdWJSb3VuZCAoQSwgQiwgQywgRCwgRSwgZjEsIEsxLCBlRGF0YVs1XSk7CisgIHN1YlJvdW5kIChFLCBBLCBCLCBDLCBELCBmMSwgSzEsIGVEYXRhWzZdKTsKKyAgc3ViUm91bmQgKEQsIEUsIEEsIEIsIEMsIGYxLCBLMSwgZURhdGFbN10pOworICBzdWJSb3VuZCAoQywgRCwgRSwgQSwgQiwgZjEsIEsxLCBlRGF0YVs4XSk7CisgIHN1YlJvdW5kIChCLCBDLCBELCBFLCBBLCBmMSwgSzEsIGVEYXRhWzldKTsKKyAgc3ViUm91bmQgKEEsIEIsIEMsIEQsIEUsIGYxLCBLMSwgZURhdGFbMTBdKTsKKyAgc3ViUm91bmQgKEUsIEEsIEIsIEMsIEQsIGYxLCBLMSwgZURhdGFbMTFdKTsKKyAgc3ViUm91bmQgKEQsIEUsIEEsIEIsIEMsIGYxLCBLMSwgZURhdGFbMTJdKTsKKyAgc3ViUm91bmQgKEMsIEQsIEUsIEEsIEIsIGYxLCBLMSwgZURhdGFbMTNdKTsKKyAgc3ViUm91bmQgKEIsIEMsIEQsIEUsIEEsIGYxLCBLMSwgZURhdGFbMTRdKTsKKyAgc3ViUm91bmQgKEEsIEIsIEMsIEQsIEUsIGYxLCBLMSwgZURhdGFbMTVdKTsKKyAgc3ViUm91bmQgKEUsIEEsIEIsIEMsIEQsIGYxLCBLMSwgZXhwYW5kICggZURhdGEsIDE2KSApOworICBzdWJSb3VuZCAoRCwgRSwgQSwgQiwgQywgZjEsIEsxLCBleHBhbmQgKCBlRGF0YSwgMTcpICk7CisgIHN1YlJvdW5kIChDLCBELCBFLCBBLCBCLCBmMSwgSzEsIGV4cGFuZCAoIGVEYXRhLCAxOCkgKTsKKyAgc3ViUm91bmQgKEIsIEMsIEQsIEUsIEEsIGYxLCBLMSwgZXhwYW5kICggZURhdGEsIDE5KSApOworCisgIHN1YlJvdW5kIChBLCBCLCBDLCBELCBFLCBmMiwgSzIsIGV4cGFuZCAoIGVEYXRhLCAyMCkgKTsKKyAgc3ViUm91bmQgKEUsIEEsIEIsIEMsIEQsIGYyLCBLMiwgZXhwYW5kICggZURhdGEsIDIxKSApOworICBzdWJSb3VuZCAoRCwgRSwgQSwgQiwgQywgZjIsIEsyLCBleHBhbmQgKCBlRGF0YSwgMjIpICk7CisgIHN1YlJvdW5kIChDLCBELCBFLCBBLCBCLCBmMiwgSzIsIGV4cGFuZCAoIGVEYXRhLCAyMykgKTsKKyAgc3ViUm91bmQgKEIsIEMsIEQsIEUsIEEsIGYyLCBLMiwgZXhwYW5kICggZURhdGEsIDI0KSApOworICBzdWJSb3VuZCAoQSwgQiwgQywgRCwgRSwgZjIsIEsyLCBleHBhbmQgKCBlRGF0YSwgMjUpICk7CisgIHN1YlJvdW5kIChFLCBBLCBCLCBDLCBELCBmMiwgSzIsIGV4cGFuZCAoIGVEYXRhLCAyNikgKTsKKyAgc3ViUm91bmQgKEQsIEUsIEEsIEIsIEMsIGYyLCBLMiwgZXhwYW5kICggZURhdGEsIDI3KSApOworICBzdWJSb3VuZCAoQywgRCwgRSwgQSwgQiwgZjIsIEsyLCBleHBhbmQgKCBlRGF0YSwgMjgpICk7CisgIHN1YlJvdW5kIChCLCBDLCBELCBFLCBBLCBmMiwgSzIsIGV4cGFuZCAoIGVEYXRhLCAyOSkgKTsKKyAgc3ViUm91bmQgKEEsIEIsIEMsIEQsIEUsIGYyLCBLMiwgZXhwYW5kICggZURhdGEsIDMwKSApOworICBzdWJSb3VuZCAoRSwgQSwgQiwgQywgRCwgZjIsIEsyLCBleHBhbmQgKCBlRGF0YSwgMzEpICk7CisgIHN1YlJvdW5kIChELCBFLCBBLCBCLCBDLCBmMiwgSzIsIGV4cGFuZCAoIGVEYXRhLCAzMikgKTsKKyAgc3ViUm91bmQgKEMsIEQsIEUsIEEsIEIsIGYyLCBLMiwgZXhwYW5kICggZURhdGEsIDMzKSApOworICBzdWJSb3VuZCAoQiwgQywgRCwgRSwgQSwgZjIsIEsyLCBleHBhbmQgKCBlRGF0YSwgMzQpICk7CisgIHN1YlJvdW5kIChBLCBCLCBDLCBELCBFLCBmMiwgSzIsIGV4cGFuZCAoIGVEYXRhLCAzNSkgKTsKKyAgc3ViUm91bmQgKEUsIEEsIEIsIEMsIEQsIGYyLCBLMiwgZXhwYW5kICggZURhdGEsIDM2KSApOworICBzdWJSb3VuZCAoRCwgRSwgQSwgQiwgQywgZjIsIEsyLCBleHBhbmQgKCBlRGF0YSwgMzcpICk7CisgIHN1YlJvdW5kIChDLCBELCBFLCBBLCBCLCBmMiwgSzIsIGV4cGFuZCAoIGVEYXRhLCAzOCkgKTsKKyAgc3ViUm91bmQgKEIsIEMsIEQsIEUsIEEsIGYyLCBLMiwgZXhwYW5kICggZURhdGEsIDM5KSApOworCisgIHN1YlJvdW5kIChBLCBCLCBDLCBELCBFLCBmMywgSzMsIGV4cGFuZCAoIGVEYXRhLCA0MCkgKTsKKyAgc3ViUm91bmQgKEUsIEEsIEIsIEMsIEQsIGYzLCBLMywgZXhwYW5kICggZURhdGEsIDQxKSApOworICBzdWJSb3VuZCAoRCwgRSwgQSwgQiwgQywgZjMsIEszLCBleHBhbmQgKCBlRGF0YSwgNDIpICk7CisgIHN1YlJvdW5kIChDLCBELCBFLCBBLCBCLCBmMywgSzMsIGV4cGFuZCAoIGVEYXRhLCA0MykgKTsKKyAgc3ViUm91bmQgKEIsIEMsIEQsIEUsIEEsIGYzLCBLMywgZXhwYW5kICggZURhdGEsIDQ0KSApOworICBzdWJSb3VuZCAoQSwgQiwgQywgRCwgRSwgZjMsIEszLCBleHBhbmQgKCBlRGF0YSwgNDUpICk7CisgIHN1YlJvdW5kIChFLCBBLCBCLCBDLCBELCBmMywgSzMsIGV4cGFuZCAoIGVEYXRhLCA0NikgKTsKKyAgc3ViUm91bmQgKEQsIEUsIEEsIEIsIEMsIGYzLCBLMywgZXhwYW5kICggZURhdGEsIDQ3KSApOworICBzdWJSb3VuZCAoQywgRCwgRSwgQSwgQiwgZjMsIEszLCBleHBhbmQgKCBlRGF0YSwgNDgpICk7CisgIHN1YlJvdW5kIChCLCBDLCBELCBFLCBBLCBmMywgSzMsIGV4cGFuZCAoIGVEYXRhLCA0OSkgKTsKKyAgc3ViUm91bmQgKEEsIEIsIEMsIEQsIEUsIGYzLCBLMywgZXhwYW5kICggZURhdGEsIDUwKSApOworICBzdWJSb3VuZCAoRSwgQSwgQiwgQywgRCwgZjMsIEszLCBleHBhbmQgKCBlRGF0YSwgNTEpICk7CisgIHN1YlJvdW5kIChELCBFLCBBLCBCLCBDLCBmMywgSzMsIGV4cGFuZCAoIGVEYXRhLCA1MikgKTsKKyAgc3ViUm91bmQgKEMsIEQsIEUsIEEsIEIsIGYzLCBLMywgZXhwYW5kICggZURhdGEsIDUzKSApOworICBzdWJSb3VuZCAoQiwgQywgRCwgRSwgQSwgZjMsIEszLCBleHBhbmQgKCBlRGF0YSwgNTQpICk7CisgIHN1YlJvdW5kIChBLCBCLCBDLCBELCBFLCBmMywgSzMsIGV4cGFuZCAoIGVEYXRhLCA1NSkgKTsKKyAgc3ViUm91bmQgKEUsIEEsIEIsIEMsIEQsIGYzLCBLMywgZXhwYW5kICggZURhdGEsIDU2KSApOworICBzdWJSb3VuZCAoRCwgRSwgQSwgQiwgQywgZjMsIEszLCBleHBhbmQgKCBlRGF0YSwgNTcpICk7CisgIHN1YlJvdW5kIChDLCBELCBFLCBBLCBCLCBmMywgSzMsIGV4cGFuZCAoIGVEYXRhLCA1OCkgKTsKKyAgc3ViUm91bmQgKEIsIEMsIEQsIEUsIEEsIGYzLCBLMywgZXhwYW5kICggZURhdGEsIDU5KSApOworCisgIHN1YlJvdW5kIChBLCBCLCBDLCBELCBFLCBmNCwgSzQsIGV4cGFuZCAoIGVEYXRhLCA2MCkgKTsKKyAgc3ViUm91bmQgKEUsIEEsIEIsIEMsIEQsIGY0LCBLNCwgZXhwYW5kICggZURhdGEsIDYxKSApOworICBzdWJSb3VuZCAoRCwgRSwgQSwgQiwgQywgZjQsIEs0LCBleHBhbmQgKCBlRGF0YSwgNjIpICk7CisgIHN1YlJvdW5kIChDLCBELCBFLCBBLCBCLCBmNCwgSzQsIGV4cGFuZCAoIGVEYXRhLCA2MykgKTsKKyAgc3ViUm91bmQgKEIsIEMsIEQsIEUsIEEsIGY0LCBLNCwgZXhwYW5kICggZURhdGEsIDY0KSApOworICBzdWJSb3VuZCAoQSwgQiwgQywgRCwgRSwgZjQsIEs0LCBleHBhbmQgKCBlRGF0YSwgNjUpICk7CisgIHN1YlJvdW5kIChFLCBBLCBCLCBDLCBELCBmNCwgSzQsIGV4cGFuZCAoIGVEYXRhLCA2NikgKTsKKyAgc3ViUm91bmQgKEQsIEUsIEEsIEIsIEMsIGY0LCBLNCwgZXhwYW5kICggZURhdGEsIDY3KSApOworICBzdWJSb3VuZCAoQywgRCwgRSwgQSwgQiwgZjQsIEs0LCBleHBhbmQgKCBlRGF0YSwgNjgpICk7CisgIHN1YlJvdW5kIChCLCBDLCBELCBFLCBBLCBmNCwgSzQsIGV4cGFuZCAoIGVEYXRhLCA2OSkgKTsKKyAgc3ViUm91bmQgKEEsIEIsIEMsIEQsIEUsIGY0LCBLNCwgZXhwYW5kICggZURhdGEsIDcwKSApOworICBzdWJSb3VuZCAoRSwgQSwgQiwgQywgRCwgZjQsIEs0LCBleHBhbmQgKCBlRGF0YSwgNzEpICk7CisgIHN1YlJvdW5kIChELCBFLCBBLCBCLCBDLCBmNCwgSzQsIGV4cGFuZCAoIGVEYXRhLCA3MikgKTsKKyAgc3ViUm91bmQgKEMsIEQsIEUsIEEsIEIsIGY0LCBLNCwgZXhwYW5kICggZURhdGEsIDczKSApOworICBzdWJSb3VuZCAoQiwgQywgRCwgRSwgQSwgZjQsIEs0LCBleHBhbmQgKCBlRGF0YSwgNzQpICk7CisgIHN1YlJvdW5kIChBLCBCLCBDLCBELCBFLCBmNCwgSzQsIGV4cGFuZCAoIGVEYXRhLCA3NSkgKTsKKyAgc3ViUm91bmQgKEUsIEEsIEIsIEMsIEQsIGY0LCBLNCwgZXhwYW5kICggZURhdGEsIDc2KSApOworICBzdWJSb3VuZCAoRCwgRSwgQSwgQiwgQywgZjQsIEs0LCBleHBhbmQgKCBlRGF0YSwgNzcpICk7CisgIHN1YlJvdW5kIChDLCBELCBFLCBBLCBCLCBmNCwgSzQsIGV4cGFuZCAoIGVEYXRhLCA3OCkgKTsKKyAgc3ViUm91bmQgKEIsIEMsIEQsIEUsIEEsIGY0LCBLNCwgZXhwYW5kICggZURhdGEsIDc5KSApOworCisgIC8qIEJ1aWxkIG1lc3NhZ2UgZGlnZXN0ICovCisgIGRpZ2VzdFswXSArPSBBOworICBkaWdlc3RbMV0gKz0gQjsKKyAgZGlnZXN0WzJdICs9IEM7CisgIGRpZ2VzdFszXSArPSBEOworICBkaWdlc3RbNF0gKz0gRTsKK30KKworLyogV2hlbiBydW4gb24gYSBsaXR0bGUtZW5kaWFuIENQVSB3ZSBuZWVkIHRvIHBlcmZvcm0gYnl0ZSByZXZlcnNhbCBvbiBhbgorICAgYXJyYXkgb2YgbG9uZ3dvcmRzLiAqLworCisjaWZkZWYgV09SRFNfQklHRU5ESUFOCisjZGVmaW5lIHN3YXBfd29yZHMoYnVmZmVyLCBieXRlX2NvdW50KQorI2Vsc2UKK3N0YXRpYyB2b2lkCitzd2FwX3dvcmRzIChkYnVzX3VpbnQzMl90ICpidWZmZXIsCisgICAgICAgICAgICBpbnQgICAgICAgICAgICBieXRlX2NvdW50KQoreworICBieXRlX2NvdW50IC89IHNpemVvZiAoZGJ1c191aW50MzJfdCk7CisgIHdoaWxlIChieXRlX2NvdW50LS0pCisgICAgeworICAgICAgKmJ1ZmZlciA9IERCVVNfVUlOVDMyX1NXQVBfTEVfQkUgKCpidWZmZXIpOworICAgICAgKytidWZmZXI7CisgICAgfQorfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkCitzaGFfaW5pdCAoREJ1c1NIQUNvbnRleHQgKmNvbnRleHQpCit7CisgIC8qIFNldCB0aGUgaC12YXJzIHRvIHRoZWlyIGluaXRpYWwgdmFsdWVzICovCisgIGNvbnRleHQtPmRpZ2VzdFswXSA9IGgwaW5pdDsKKyAgY29udGV4dC0+ZGlnZXN0WzFdID0gaDFpbml0OworICBjb250ZXh0LT5kaWdlc3RbMl0gPSBoMmluaXQ7CisgIGNvbnRleHQtPmRpZ2VzdFszXSA9IGgzaW5pdDsKKyAgY29udGV4dC0+ZGlnZXN0WzRdID0gaDRpbml0OworCisgIC8qIEluaXRpYWxpc2UgYml0IGNvdW50ICovCisgIGNvbnRleHQtPmNvdW50X2xvID0gY29udGV4dC0+Y291bnRfaGkgPSAwOworfQorCitzdGF0aWMgdm9pZAorc2hhX2FwcGVuZCAoREJ1c1NIQUNvbnRleHQgICAgICAqY29udGV4dCwKKyAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciwKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCAgICAgICAgIGNvdW50KQoreworICBkYnVzX3VpbnQzMl90IHRtcDsKKyAgdW5zaWduZWQgaW50IGRhdGFDb3VudDsKKworICAvKiBVcGRhdGUgYml0Y291bnQgKi8KKyAgdG1wID0gY29udGV4dC0+Y291bnRfbG87CisgIGlmICgoIGNvbnRleHQtPmNvdW50X2xvID0gdG1wICsgKCAoIGRidXNfdWludDMyX3QpIGNvdW50IDw8IDMpICkgPCB0bXApCisgICAgY29udGV4dC0+Y291bnRfaGkrKzsgICAgICAgICAgICAgLyogQ2FycnkgZnJvbSBsb3cgdG8gaGlnaCAqLworICBjb250ZXh0LT5jb3VudF9oaSArPSBjb3VudCA+PiAyOTsKKworICAvKiBHZXQgY291bnQgb2YgYnl0ZXMgYWxyZWFkeSBpbiBkYXRhICovCisgIGRhdGFDb3VudCA9IChpbnQpICh0bXAgPj4gMykgJiAweDNGOworCisgIC8qIEhhbmRsZSBhbnkgbGVhZGluZyBvZGQtc2l6ZWQgY2h1bmtzICovCisgIGlmIChkYXRhQ291bnQpCisgICAgeworICAgICAgdW5zaWduZWQgY2hhciAqcCA9ICh1bnNpZ25lZCBjaGFyICopIGNvbnRleHQtPmRhdGEgKyBkYXRhQ291bnQ7CisKKyAgICAgIGRhdGFDb3VudCA9IFNIQV9EQVRBU0laRSAtIGRhdGFDb3VudDsKKyAgICAgIGlmIChjb3VudCA8IGRhdGFDb3VudCkKKyAgICAgICAgeworICAgICAgICAgIG1lbW1vdmUgKHAsIGJ1ZmZlciwgY291bnQpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgbWVtbW92ZSAocCwgYnVmZmVyLCBkYXRhQ291bnQpOworICAgICAgc3dhcF93b3JkcyAoY29udGV4dC0+ZGF0YSwgU0hBX0RBVEFTSVpFKTsKKyAgICAgIFNIQVRyYW5zZm9ybSAoY29udGV4dC0+ZGlnZXN0LCBjb250ZXh0LT5kYXRhKTsKKyAgICAgIGJ1ZmZlciArPSBkYXRhQ291bnQ7CisgICAgICBjb3VudCAtPSBkYXRhQ291bnQ7CisgICAgfQorCisgIC8qIFByb2Nlc3MgZGF0YSBpbiBTSEFfREFUQVNJWkUgY2h1bmtzICovCisgIHdoaWxlIChjb3VudCA+PSBTSEFfREFUQVNJWkUpCisgICAgeworICAgICAgbWVtbW92ZSAoY29udGV4dC0+ZGF0YSwgYnVmZmVyLCBTSEFfREFUQVNJWkUpOworICAgICAgc3dhcF93b3JkcyAoY29udGV4dC0+ZGF0YSwgU0hBX0RBVEFTSVpFKTsKKyAgICAgIFNIQVRyYW5zZm9ybSAoY29udGV4dC0+ZGlnZXN0LCBjb250ZXh0LT5kYXRhKTsKKyAgICAgIGJ1ZmZlciArPSBTSEFfREFUQVNJWkU7CisgICAgICBjb3VudCAtPSBTSEFfREFUQVNJWkU7CisgICAgfQorCisgIC8qIEhhbmRsZSBhbnkgcmVtYWluaW5nIGJ5dGVzIG9mIGRhdGEuICovCisgIG1lbW1vdmUgKGNvbnRleHQtPmRhdGEsIGJ1ZmZlciwgY291bnQpOworfQorCisKKy8qIEZpbmFsIHdyYXB1cCAtIHBhZCB0byBTSEFfREFUQVNJWkUtYnl0ZSBib3VuZGFyeSB3aXRoIHRoZSBiaXQgcGF0dGVybgorICAgMSAwKiAoNjQtYml0IGNvdW50IG9mIGJpdHMgcHJvY2Vzc2VkLCBNU0ItZmlyc3QpICovCisKK3N0YXRpYyB2b2lkCitzaGFfZmluaXNoIChEQnVzU0hBQ29udGV4dCAqY29udGV4dCwgdW5zaWduZWQgY2hhciBkaWdlc3RbMjBdKQoreworICBpbnQgY291bnQ7CisgIHVuc2lnbmVkIGNoYXIgKmRhdGFfcDsKKworICAvKiBDb21wdXRlIG51bWJlciBvZiBieXRlcyBtb2QgNjQgKi8KKyAgY291bnQgPSAoaW50KSBjb250ZXh0LT5jb3VudF9sbzsKKyAgY291bnQgPSAoY291bnQgPj4gMykgJiAweDNGOworCisgIC8qIFNldCB0aGUgZmlyc3QgY2hhciBvZiBwYWRkaW5nIHRvIDB4ODAuICBUaGlzIGlzIHNhZmUgc2luY2UgdGhlcmUgaXMKKyAgICAgYWx3YXlzIGF0IGxlYXN0IG9uZSBieXRlIGZyZWUgKi8KKyAgZGF0YV9wID0gKHVuc2lnbmVkIGNoYXIgKikgY29udGV4dC0+ZGF0YSArIGNvdW50OworICAqZGF0YV9wKysgPSAweDgwOworCisgIC8qIEJ5dGVzIG9mIHBhZGRpbmcgbmVlZGVkIHRvIG1ha2UgNjQgYnl0ZXMgKi8KKyAgY291bnQgPSBTSEFfREFUQVNJWkUgLSAxIC0gY291bnQ7CisKKyAgLyogUGFkIG91dCB0byA1NiBtb2QgNjQgKi8KKyAgaWYgKGNvdW50IDwgOCkKKyAgICB7CisgICAgICAvKiBUd28gbG90cyBvZiBwYWRkaW5nOiAgUGFkIHRoZSBmaXJzdCBibG9jayB0byA2NCBieXRlcyAqLworICAgICAgbWVtc2V0IChkYXRhX3AsIDAsIGNvdW50KTsKKyAgICAgIHN3YXBfd29yZHMgKGNvbnRleHQtPmRhdGEsIFNIQV9EQVRBU0laRSk7CisgICAgICBTSEFUcmFuc2Zvcm0gKGNvbnRleHQtPmRpZ2VzdCwgY29udGV4dC0+ZGF0YSk7CisKKyAgICAgIC8qIE5vdyBmaWxsIHRoZSBuZXh0IGJsb2NrIHdpdGggNTYgYnl0ZXMgKi8KKyAgICAgIG1lbXNldCAoY29udGV4dC0+ZGF0YSwgMCwgU0hBX0RBVEFTSVpFIC0gOCk7CisgICAgfQorICBlbHNlCisgICAgLyogUGFkIGJsb2NrIHRvIDU2IGJ5dGVzICovCisgICAgbWVtc2V0IChkYXRhX3AsIDAsIGNvdW50IC0gOCk7CisKKyAgLyogQXBwZW5kIGxlbmd0aCBpbiBiaXRzIGFuZCB0cmFuc2Zvcm0gKi8KKyAgY29udGV4dC0+ZGF0YVsxNF0gPSBjb250ZXh0LT5jb3VudF9oaTsKKyAgY29udGV4dC0+ZGF0YVsxNV0gPSBjb250ZXh0LT5jb3VudF9sbzsKKworICBzd2FwX3dvcmRzIChjb250ZXh0LT5kYXRhLCBTSEFfREFUQVNJWkUgLSA4KTsKKyAgU0hBVHJhbnNmb3JtIChjb250ZXh0LT5kaWdlc3QsIGNvbnRleHQtPmRhdGEpOworICBzd2FwX3dvcmRzIChjb250ZXh0LT5kaWdlc3QsIFNIQV9ESUdFU1RTSVpFKTsKKyAgbWVtbW92ZSAoZGlnZXN0LCBjb250ZXh0LT5kaWdlc3QsIFNIQV9ESUdFU1RTSVpFKTsKK30KKworLyoqIEB9ICovIC8qIEVuZCBvZiBpbnRlcm5hbHMgKi8KKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzU0hBCisgKgorICogQHsKKyAqLworCisvKioKKyAqIEluaXRpYWxpemVzIHRoZSBTSEEgY29udGV4dC4KKyAqCisgKiBAcGFyYW0gY29udGV4dCBhbiB1bmluaXRpYWxpemVkIGNvbnRleHQsIHR5cGljYWxseSBvbiB0aGUgc3RhY2suCisgKi8KK3ZvaWQKK19kYnVzX3NoYV9pbml0IChEQnVzU0hBQ29udGV4dCAqY29udGV4dCkKK3sKKyAgc2hhX2luaXQgKGNvbnRleHQpOworfQorCisvKioKKyAqIEZlZWRzIG1vcmUgZGF0YSBpbnRvIGFuIGV4aXN0aW5nIHNoYXN1bSBjb21wdXRhdGlvbi4KKyAqCisgKiBAcGFyYW0gY29udGV4dCB0aGUgU0hBIGNvbnRleHQKKyAqIEBwYXJhbSBkYXRhIHRoZSBhZGRpdGlvbmFsIGRhdGEgdG8gaGFzaAorICovCit2b2lkCitfZGJ1c19zaGFfdXBkYXRlIChEQnVzU0hBQ29udGV4dCAgICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqZGF0YSkKK3sKKyAgdW5zaWduZWQgaW50IGlucHV0TGVuOworICBjb25zdCB1bnNpZ25lZCBjaGFyICppbnB1dDsKKworICBpbnB1dCA9IChjb25zdCB1bnNpZ25lZCBjaGFyKikgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChkYXRhKTsKKyAgaW5wdXRMZW4gPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoZGF0YSk7CisKKyAgc2hhX2FwcGVuZCAoY29udGV4dCwgaW5wdXQsIGlucHV0TGVuKTsKK30KKworLyoqCisgKiBTSEEgZmluYWxpemF0aW9uLiBFbmRzIGFuIFNIQSBtZXNzYWdlLWRpZ2VzdCBvcGVyYXRpb24sIHdyaXRpbmcgdGhlCisgKiB0aGUgbWVzc2FnZSBkaWdlc3QgYW5kIHplcm9pbmcgdGhlIGNvbnRleHQuICBUaGUgcmVzdWx0cyBhcmUKKyAqIHJldHVybmVkIGFzIGEgcmF3IDIwLWJ5dGUgZGlnZXN0LCBub3QgYXMgdGhlIGFzY2lpLWhleC1kaWdpdHMKKyAqIHN0cmluZyBmb3JtIG9mIHRoZSBkaWdlc3QuCisgKgorICogQHBhcmFtIGNvbnRleHQgdGhlIFNIQSBjb250ZXh0CisgKiBAcGFyYW0gcmVzdWx0cyBzdHJpbmcgdG8gYXBwZW5kIHRoZSAyMC1ieXRlIFNIQSBkaWdlc3QgdG8KKyAqIEByZXR1cm5zICNGQUxTRSBpZiBub3QgZW5vdWdoIG1lbW9yeSB0byBhcHBlbmQgdGhlIGRpZ2VzdAorICoKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3NoYV9maW5hbCAoREJ1c1NIQUNvbnRleHQgICAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAqcmVzdWx0cykKK3sKKyAgdW5zaWduZWQgY2hhciBkaWdlc3RbMjBdOworCisgIHNoYV9maW5pc2ggKGNvbnRleHQsIGRpZ2VzdCk7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX2xlbiAocmVzdWx0cywgKGNvbnN0IGNoYXIgKikgZGlnZXN0LCAyMCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIC8qIHNvbWUga2luZCBvZiBzZWN1cml0eSBwYXJhbm9pYSwgdGhvdWdoIGl0IHNlZW1zIHBvaW50bGVzcworICAgKiB0byBtZSBnaXZlbiB0aGUgbm9uemVyb2VkIHN0dWZmIGZseWluZyBhcm91bmQKKyAgICovCisgIF9EQlVTX1pFUk8oKmNvbnRleHQpOworCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIENvbXB1dGVzIHRoZSBBU0NJSSBoZXgtZW5jb2RlZCBzaGFzdW0gb2YgdGhlIGdpdmVuIGRhdGEgYW5kCisgKiBhcHBlbmRzIGl0IHRvIHRoZSBvdXRwdXQgc3RyaW5nLgorICoKKyAqIEBwYXJhbSBkYXRhIGlucHV0IGRhdGEgdG8gYmUgaGFzaGVkCisgKiBAcGFyYW0gYXNjaWlfb3V0cHV0IHN0cmluZyB0byBhcHBlbmQgQVNDSUkgc2hhc3VtIHRvCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm90IGVub3VnaCBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3NoYV9jb21wdXRlIChjb25zdCBEQnVzU3RyaW5nICpkYXRhLAorICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgKmFzY2lpX291dHB1dCkKK3sKKyAgREJ1c1NIQUNvbnRleHQgY29udGV4dDsKKyAgREJ1c1N0cmluZyBkaWdlc3Q7CisKKyAgX2RidXNfc2hhX2luaXQgKCZjb250ZXh0KTsKKworICBfZGJ1c19zaGFfdXBkYXRlICgmY29udGV4dCwgZGF0YSk7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmRpZ2VzdCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghX2RidXNfc2hhX2ZpbmFsICgmY29udGV4dCwgJmRpZ2VzdCkpCisgICAgZ290byBlcnJvcjsKKworICBpZiAoIV9kYnVzX3N0cmluZ19oZXhfZW5jb2RlICgmZGlnZXN0LCAwLCBhc2NpaV9vdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChhc2NpaV9vdXRwdXQpKSkKKyAgICBnb3RvIGVycm9yOworCisgIF9kYnVzX3N0cmluZ19mcmVlICgmZGlnZXN0KTsKKyAgCisgIHJldHVybiBUUlVFOworCisgZXJyb3I6CisgIF9kYnVzX3N0cmluZ19mcmVlICgmZGlnZXN0KTsKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKiogQH0gKi8gLyogZW5kIG9mIGV4cG9ydGVkIGZ1bmN0aW9ucyAqLworCisjaWZkZWYgREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMKKyNpbmNsdWRlICJkYnVzLXRlc3QuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorCitzdGF0aWMgZGJ1c19ib29sX3QKK2NoZWNrX3NoYV9iaW5hcnkgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmlucHV0LAorICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgaW5wdXRfbGVuLAorICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgICAqZXhwZWN0ZWQpCit7CisgIERCdXNTdHJpbmcgaW5wdXRfc3RyOworICBEQnVzU3RyaW5nIGV4cGVjdGVkX3N0cjsKKyAgREJ1c1N0cmluZyByZXN1bHRzOworCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0X2xlbiAoJmlucHV0X3N0ciwgKGNvbnN0IGNoYXIgKikgaW5wdXQsIGlucHV0X2xlbik7CisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmZXhwZWN0ZWRfc3RyLCBleHBlY3RlZCk7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnJlc3VsdHMpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSBmb3IgU0hBLTEgcmVzdWx0cyIpOworCisgIGlmICghX2RidXNfc2hhX2NvbXB1dGUgKCZpbnB1dF9zdHIsICZyZXN1bHRzKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkgZm9yIFNIQS0xIHJlc3VsdHMiKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19lcXVhbCAoJmV4cGVjdGVkX3N0ciwgJnJlc3VsdHMpKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJFeHBlY3RlZCBoYXNoICVzIGdvdCAlcyBmb3IgU0hBLTEgc3VtIiwKKyAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmcmVzdWx0cykpOworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZyZXN1bHRzKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZyZXN1bHRzKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorY2hlY2tfc2hhX3N0ciAoY29uc3QgY2hhciAqaW5wdXQsCisgICAgICAgICAgICAgICBjb25zdCBjaGFyICpleHBlY3RlZCkKK3sKKyAgcmV0dXJuIGNoZWNrX3NoYV9iaW5hcnkgKCh1bnNpZ25lZCBjaGFyICopIGlucHV0LCBzdHJsZW4gKGlucHV0KSwgZXhwZWN0ZWQpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2RlY29kZV9jb21wYWN0X3N0cmluZyAoY29uc3QgREJ1c1N0cmluZyAqbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAqZGVjb2RlZCkKK3sKKyAgaW50IG5fYml0czsKKyAgZGJ1c19ib29sX3QgY3VycmVudF9iOworICBpbnQgb2Zmc2V0OworICBpbnQgbmV4dDsKKyAgbG9uZyB2YWw7CisgIGludCBsZW5ndGhfYnl0ZXM7CisgIAorICBvZmZzZXQgPSAwOworICBuZXh0ID0gMDsKKworICBpZiAoIV9kYnVzX3N0cmluZ19wYXJzZV9pbnQgKGxpbmUsIG9mZnNldCwgJnZhbCwgJm5leHQpKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgImNvdWxkIG5vdCBwYXJzZSBsZW5ndGggYXQgc3RhcnQgb2YgY29tcGFjdCBzdHJpbmc6ICVzXG4iLAorICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChsaW5lKSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIF9kYnVzX3N0cmluZ19za2lwX2JsYW5rIChsaW5lLCBuZXh0LCAmbmV4dCk7CisgIAorICBvZmZzZXQgPSBuZXh0OworICBpZiAoIV9kYnVzX3N0cmluZ19wYXJzZV9pbnQgKGxpbmUsIG9mZnNldCwgJnZhbCwgJm5leHQpKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgImNvdWxkIG5vdCBwYXJzZSBzdGFydCBiaXQgJ2InIGluIGNvbXBhY3Qgc3RyaW5nOiAlc1xuIiwKKyAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAobGluZSkpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgCisgIGlmICghKHZhbCA9PSAwIHx8IHZhbCA9PSAxKSkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJ0aGUgdmFsdWUgJ2InIG11c3QgYmUgMCBvciAxLCBzZWUgc2hhLTEvUmVhZG1lLnR4dFxuIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIF9kYnVzX3N0cmluZ19za2lwX2JsYW5rIChsaW5lLCBuZXh0LCAmbmV4dCk7CisgIAorICBjdXJyZW50X2IgPSB2YWw7CisgIG5fYml0cyA9IDA7CisgIAorICB3aGlsZSAobmV4dCA8IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChsaW5lKSkKKyAgICB7CisgICAgICBpbnQgdG90YWxfYml0czsKKyAgICAgIAorICAgICAgb2Zmc2V0ID0gbmV4dDsKKworICAgICAgaWYgKF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAobGluZSwgb2Zmc2V0KSA9PSAnXicpCisgICAgICAgIGJyZWFrOworICAgICAgCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19wYXJzZV9pbnQgKGxpbmUsIG9mZnNldCwgJnZhbCwgJm5leHQpKQorICAgICAgICB7CisgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiY291bGQgbm90IHBhcnNlIGJpdCBjb3VudCBpbiBjb21wYWN0IHN0cmluZ1xuIik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIC8qIFdlIG5vdyBhcHBlbmQgInZhbCIgY29waWVzIG9mICJjdXJyZW50X2IiIGJpdHMgdG8gdGhlIHN0cmluZyAqLworICAgICAgdG90YWxfYml0cyA9IG5fYml0cyArIHZhbDsKKyAgICAgIHdoaWxlIChuX2JpdHMgPCB0b3RhbF9iaXRzKQorICAgICAgICB7CisgICAgICAgICAgaW50IGJ5dGVfY29udGFpbmluZ19uZXh0X2JpdCA9IG5fYml0cyAvIDg7CisgICAgICAgICAgaW50IGJpdF9jb250YWluaW5nX25leHRfYml0ID0gNyAtIChuX2JpdHMgJSA4KTsKKyAgICAgICAgICB1bnNpZ25lZCBjaGFyIG9sZF9ieXRlOworICAgICAgICAgIAorICAgICAgICAgIGlmIChieXRlX2NvbnRhaW5pbmdfbmV4dF9iaXQgPj0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGRlY29kZWQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoIChkZWNvZGVkLCBieXRlX2NvbnRhaW5pbmdfbmV4dF9iaXQgKyAxKSkKKyAgICAgICAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkgdG8gZXh0ZW5kIHRvIG5leHQgYnl0ZSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgb2xkX2J5dGUgPSBfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKGRlY29kZWQsIGJ5dGVfY29udGFpbmluZ19uZXh0X2JpdCk7CisgICAgICAgICAgb2xkX2J5dGUgfD0gY3VycmVudF9iIDw8IGJpdF9jb250YWluaW5nX25leHRfYml0OworCisjaWYgMAorICAgICAgICAgIHByaW50ZiAoIkFwcGVuZGluZyBiaXQgJWQgdG8gYnl0ZSAlZCBhdCBiaXQgJWQgcmVzdWx0aW5nIGluIGJ5dGUgMHgleFxuIiwKKyAgICAgICAgICAgICAgICAgIGN1cnJlbnRfYiwgYnl0ZV9jb250YWluaW5nX25leHRfYml0LAorICAgICAgICAgICAgICAgICAgYml0X2NvbnRhaW5pbmdfbmV4dF9iaXQsIG9sZF9ieXRlKTsKKyNlbmRpZgorICAgICAgICAgIAorICAgICAgICAgIF9kYnVzX3N0cmluZ19zZXRfYnl0ZSAoZGVjb2RlZCwgYnl0ZV9jb250YWluaW5nX25leHRfYml0LCBvbGRfYnl0ZSk7CisgICAgICAgICAgCisgICAgICAgICAgKytuX2JpdHM7CisgICAgICAgIH0KKworICAgICAgX2RidXNfc3RyaW5nX3NraXBfYmxhbmsgKGxpbmUsIG5leHQsICZuZXh0KTsKKyAgICAgICAgICAKKyAgICAgIGN1cnJlbnRfYiA9ICFjdXJyZW50X2I7CisgICAgfQorCisgIGxlbmd0aF9ieXRlcyA9IChuX2JpdHMgLyA4ICsgKChuX2JpdHMgJSA4KSA/IDEgOiAwKSk7CisgIAorICBpZiAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGRlY29kZWQpICE9IGxlbmd0aF9ieXRlcykKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJFeHBlY3RlZCBsZW5ndGggJWQgYnl0ZXMgJWQgYml0cyBmb3IgY29tcGFjdCBzdHJpbmcsIGdvdCAlZCBieXRlc1xuIiwKKyAgICAgICAgICAgICAgIGxlbmd0aF9ieXRlcywgbl9iaXRzLCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoZGVjb2RlZCkpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgZWxzZQorICAgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2dldF9uZXh0X2V4cGVjdGVkX3Jlc3VsdCAoREJ1c1N0cmluZyAqcmVzdWx0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAqcmVzdWx0KQoreworICBEQnVzU3RyaW5nIGxpbmU7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKworICByZXR2YWwgPSBGQUxTRTsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZsaW5lKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkiKTsKKyAgCisgbmV4dF9pdGVyYXRpb246CisgIHdoaWxlIChfZGJ1c19zdHJpbmdfcG9wX2xpbmUgKHJlc3VsdHMsICZsaW5lKSkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfZGVsZXRlX2xlYWRpbmdfYmxhbmtzICgmbGluZSk7CisKKyAgICAgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmxpbmUpID09IDApCisgICAgICAgIGdvdG8gbmV4dF9pdGVyYXRpb247CisgICAgICBlbHNlIGlmIChfZGJ1c19zdHJpbmdfc3RhcnRzX3dpdGhfY19zdHIgKCZsaW5lLCAiIyIpKQorICAgICAgICBnb3RvIG5leHRfaXRlcmF0aW9uOworICAgICAgZWxzZSBpZiAoX2RidXNfc3RyaW5nX3N0YXJ0c193aXRoX2Nfc3RyICgmbGluZSwgIkg+IikpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBkb24ndCBwcmludCAqLworICAgICAgICB9CisgICAgICBlbHNlIGlmIChfZGJ1c19zdHJpbmdfc3RhcnRzX3dpdGhfY19zdHIgKCZsaW5lLCAiRD4iKSB8fAorICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX3N0YXJ0c193aXRoX2Nfc3RyICgmbGluZSwgIjxEIikpCisgICAgICAgIGdvdG8gbmV4dF9pdGVyYXRpb247CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19tb3ZlICgmbGluZSwgMCwgcmVzdWx0LCAwKSkKKyAgICAgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOworCisgICAgICAgICAgaSA9IDA7CisgICAgICAgICAgd2hpbGUgKGkgPCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAocmVzdWx0KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBjID0gX2RidXNfc3RyaW5nX2dldF9ieXRlIChyZXN1bHQsIGkpOworCisgICAgICAgICAgICAgIHN3aXRjaCAoYykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAnQSc6CisgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfc2V0X2J5dGUgKHJlc3VsdCwgaSwgJ2EnKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJ0InOgorICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX3NldF9ieXRlIChyZXN1bHQsIGksICdiJyk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICdDJzoKKyAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19zZXRfYnl0ZSAocmVzdWx0LCBpLCAnYycpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnRCc6CisgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfc2V0X2J5dGUgKHJlc3VsdCwgaSwgJ2QnKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJ0UnOgorICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX3NldF9ieXRlIChyZXN1bHQsIGksICdlJyk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICdGJzoKKyAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19zZXRfYnl0ZSAocmVzdWx0LCBpLCAnZicpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnXic6CisgICAgICAgICAgICAgICAgY2FzZSAnICc6CisgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZGVsZXRlIChyZXN1bHQsIGksIDEpOworICAgICAgICAgICAgICAgICAgLS1pOyAvKiB0byBvZmZzZXQgKytpIGJlbG93ICovCisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgaWYgKChjIDwgJzAnIHx8IGMgPiAnOScpICYmIChjIDwgJ2EnIHx8IGMgPiAnZicpKQorICAgICAgICAgICAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJpbnZhbGlkIFNIQS0xIHRlc3Qgc2NyaXB0Iik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICsraTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgCisgIHJldHZhbCA9IFRSVUU7CisgIAorICAvKiBvdXQ6ICovCisgIF9kYnVzX3N0cmluZ19mcmVlICgmbGluZSk7CisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorcHJvY2Vzc190ZXN0X2RhdGEgKGNvbnN0IGNoYXIgKnRlc3RfZGF0YV9kaXIpCit7CisgIERCdXNTdHJpbmcgdGVzdHNfZmlsZTsKKyAgREJ1c1N0cmluZyByZXN1bHRzX2ZpbGU7CisgIERCdXNTdHJpbmcgdGVzdHM7CisgIERCdXNTdHJpbmcgcmVzdWx0czsKKyAgREJ1c1N0cmluZyBsaW5lOworICBEQnVzU3RyaW5nIHRtcDsKKyAgaW50IGxpbmVfbm87CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgaW50IHN1Y2Nlc3NfY291bnQ7CisgIERCdXNFcnJvciBlcnJvciA9IERCVVNfRVJST1JfSU5JVDsKKworICByZXR2YWwgPSBGQUxTRTsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZ0ZXN0c19maWxlKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkiKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmcmVzdWx0c19maWxlKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkiKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmdGVzdHMpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZyZXN1bHRzKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkiKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmbGluZSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5Iik7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZ0ZXN0c19maWxlLCB0ZXN0X2RhdGFfZGlyKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkiKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZyZXN1bHRzX2ZpbGUsIHRlc3RfZGF0YV9kaXIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOworCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmdG1wLCAic2hhLTEvYnl0ZS1tZXNzYWdlcy5zaGExIik7CisgIGlmICghX2RidXNfY29uY2F0X2Rpcl9hbmRfZmlsZSAoJnRlc3RzX2ZpbGUsICZ0bXApKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOworCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmdG1wLCAic2hhLTEvYnl0ZS1oYXNoZXMuc2hhMSIpOworICBpZiAoIV9kYnVzX2NvbmNhdF9kaXJfYW5kX2ZpbGUgKCZyZXN1bHRzX2ZpbGUsICZ0bXApKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOworCisgIGlmICghX2RidXNfZmlsZV9nZXRfY29udGVudHMgKCZ0ZXN0cywgJnRlc3RzX2ZpbGUsICZlcnJvcikpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiY291bGQgbm90IGxvYWQgdGVzdCBkYXRhIGZpbGUgJXM6ICVzXG4iLAorICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmdGVzdHNfZmlsZSksCisgICAgICAgICAgICAgICBlcnJvci5tZXNzYWdlKTsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAoIV9kYnVzX2ZpbGVfZ2V0X2NvbnRlbnRzICgmcmVzdWx0cywgJnJlc3VsdHNfZmlsZSwgJmVycm9yKSkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJjb3VsZCBub3QgbG9hZCByZXN1bHRzIGRhdGEgZmlsZSAlczogJXNcbiIsCisgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZyZXN1bHRzX2ZpbGUpLCBlcnJvci5tZXNzYWdlKTsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBzdWNjZXNzX2NvdW50ID0gMDsKKyAgbGluZV9ubyA9IDA7CisgbmV4dF9pdGVyYXRpb246CisgIHdoaWxlIChfZGJ1c19zdHJpbmdfcG9wX2xpbmUgKCZ0ZXN0cywgJmxpbmUpKQorICAgIHsKKyAgICAgIGxpbmVfbm8gKz0gMTsKKworICAgICAgX2RidXNfc3RyaW5nX2RlbGV0ZV9sZWFkaW5nX2JsYW5rcyAoJmxpbmUpOworCisgICAgICBpZiAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZsaW5lKSA9PSAwKQorICAgICAgICBnb3RvIG5leHRfaXRlcmF0aW9uOworICAgICAgZWxzZSBpZiAoX2RidXNfc3RyaW5nX3N0YXJ0c193aXRoX2Nfc3RyICgmbGluZSwgIiMiKSkKKyAgICAgICAgZ290byBuZXh0X2l0ZXJhdGlvbjsKKyAgICAgIGVsc2UgaWYgKF9kYnVzX3N0cmluZ19zdGFydHNfd2l0aF9jX3N0ciAoJmxpbmUsICJIPiIpKQorICAgICAgICB7CisgICAgICAgICAgcHJpbnRmICgiU0hBLTE6ICVzXG4iLCBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZsaW5lKSk7CisKKyAgICAgICAgICBpZiAoX2RidXNfc3RyaW5nX2ZpbmQgKCZsaW5lLCAwLCAiVHlwZSAzIiwgTlVMTCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8qIFNlZSBzaGEtMS9SZWFkbWUudHh0IC0gdGhlICJUeXBlIDMiIHRlc3RzIGFyZQorICAgICAgICAgICAgICAgKiByYW5kb20gc2VlZHMsIHJhdGhlciB0aGFuIGRhdGEgdG8gYmUgaGFzaGVkLgorICAgICAgICAgICAgICAgKiB3ZSdkIGhhdmUgdG8gZG8gYSBsaXR0bGUgYml0IG1vcmUgaW1wbGVtZW50YXRpb24KKyAgICAgICAgICAgICAgICogdG8gdXNlIHRob3NlIHRlc3RzLgorICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIHByaW50ZiAoIiAoZW5kaW5nIHRlc3RzIGR1ZSB0byBUeXBlIDMgdGVzdHMgc2VlbiAtIHRoaXMgaXMgbm9ybWFsKVxuIik7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBlbHNlIGlmIChfZGJ1c19zdHJpbmdfc3RhcnRzX3dpdGhfY19zdHIgKCZsaW5lLCAiRD4iKSB8fAorICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX3N0YXJ0c193aXRoX2Nfc3RyICgmbGluZSwgIjxEIikpCisgICAgICAgIGdvdG8gbmV4dF9pdGVyYXRpb247CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBEQnVzU3RyaW5nIHRlc3Q7CisgICAgICAgICAgREJ1c1N0cmluZyByZXN1bHQ7CisgICAgICAgICAgREJ1c1N0cmluZyBuZXh0X2xpbmU7CisgICAgICAgICAgREJ1c1N0cmluZyBleHBlY3RlZDsKKyAgICAgICAgICBkYnVzX2Jvb2xfdCBzdWNjZXNzOworCisgICAgICAgICAgc3VjY2VzcyA9IEZBTFNFOworICAgICAgICAgIAorICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZuZXh0X2xpbmUpKQorICAgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5Iik7CisKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZXhwZWN0ZWQpKQorICAgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5Iik7CisgICAgICAgICAgCisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnRlc3QpKQorICAgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5Iik7CisKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmcmVzdWx0KSkKKyAgICAgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOworCisgICAgICAgICAgLyogdGhlICJjb21wYWN0IHN0cmluZ3MiIGFyZSAiXiItdGVybWluYXRlZCBub3QKKyAgICAgICAgICAgKiBuZXdsaW5lLXRlcm1pbmF0ZWQgc28gcmVhZGFoZWFkIHRvIGZpbmQgdGhlCisgICAgICAgICAgICogIl4iCisgICAgICAgICAgICovCisgICAgICAgICAgd2hpbGUgKCFfZGJ1c19zdHJpbmdfZmluZCAoJmxpbmUsIDAsICJeIiwgTlVMTCkgJiYKKyAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX3BvcF9saW5lICgmdGVzdHMsICZuZXh0X2xpbmUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfYnl0ZSAoJmxpbmUsICcgJykgfHwKKyAgICAgICAgICAgICAgICAgICFfZGJ1c19zdHJpbmdfbW92ZSAoJm5leHRfbGluZSwgMCwgJmxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmbGluZSkpKQorICAgICAgICAgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOworICAgICAgICAgICAgfQorICAgICAgICAgIAorICAgICAgICAgIGlmICghZGVjb2RlX2NvbXBhY3Rfc3RyaW5nICgmbGluZSwgJnRlc3QpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJGYWlsZWQgdG8gZGVjb2RlIGxpbmUgJWQgYXMgYSBjb21wYWN0IHN0cmluZ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgbGluZV9ubyk7CisgICAgICAgICAgICAgIGdvdG8gZmFpbHVyZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgICAgICBpZiAoIV9kYnVzX3NoYV9jb21wdXRlICgmdGVzdCwgJnJlc3VsdCkpCisgICAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkgZm9yIFNIQS0xIHJlc3VsdCIpOworCisgICAgICAgICAgaWYgKCFnZXRfbmV4dF9leHBlY3RlZF9yZXN1bHQgKCZyZXN1bHRzLCAmZXhwZWN0ZWQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJGYWlsZWQgdG8gcmVhZCBhbiBleHBlY3RlZCByZXN1bHRcbiIpOworICAgICAgICAgICAgICBnb3RvIGZhaWx1cmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgCisgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfZXF1YWwgKCZyZXN1bHQsICZleHBlY3RlZCkpCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiIGZvciBsaW5lICVkIGdvdCBoYXNoICVzIGV4cGVjdGVkICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBsaW5lX25vLAorICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZyZXN1bHQpLAorICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZleHBlY3RlZCkpOworICAgICAgICAgICAgICBnb3RvIGZhaWx1cmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBzdWNjZXNzX2NvdW50ICs9IDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBzdWNjZXNzID0gVFJVRTsKKworICAgICAgICBmYWlsdXJlOgorICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmdGVzdCk7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZyZXN1bHQpOworICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmbmV4dF9saW5lKTsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmV4cGVjdGVkKTsKKworICAgICAgICAgIGlmICghc3VjY2VzcykKKyAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgfQorCisgIHJldHZhbCA9IFRSVUU7CisKKyAgcHJpbnRmICgiUGFzc2VkIHRoZSAlZCBTSEEtMSB0ZXN0cyBpbiB0aGUgdGVzdCBmaWxlXG4iLAorICAgICAgICAgIHN1Y2Nlc3NfY291bnQpOworICAKKyBvdXQ6CisgIF9kYnVzX3N0cmluZ19mcmVlICgmdGVzdHNfZmlsZSk7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmcmVzdWx0c19maWxlKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZ0ZXN0cyk7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmcmVzdWx0cyk7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmbGluZSk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBAaW5ncm91cCBEQnVzU0hBSW50ZXJuYWxzCisgKiBVbml0IHRlc3QgZm9yIFNIQSBjb21wdXRhdGlvbi4KKyAqCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzLgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc2hhX3Rlc3QgKGNvbnN0IGNoYXIgKnRlc3RfZGF0YV9kaXIpCit7CisgIHVuc2lnbmVkIGNoYXIgYWxsX2J5dGVzWzI1Nl07CisgIGludCBpOworCisgIGlmICh0ZXN0X2RhdGFfZGlyICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKCFwcm9jZXNzX3Rlc3RfZGF0YSAodGVzdF9kYXRhX2RpcikpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIGVsc2UKKyAgICBwcmludGYgKCJObyB0ZXN0IGRhdGEgZGlyXG4iKTsKKyAgCisgIGkgPSAwOworICB3aGlsZSAoaSA8IDI1NikKKyAgICB7CisgICAgICBhbGxfYnl0ZXNbaV0gPSBpOworICAgICAgKytpOworICAgIH0KKworICBpZiAoIWNoZWNrX3NoYV9iaW5hcnkgKGFsbF9ieXRlcywgMjU2LAorICAgICAgICAgICAgICAgICAgICAgICAgICI0OTE2ZDZiZGI3Zjc4ZTY4MDM2OThjYWIzMmQxNTg2ZWE0NTdkZmM4IikpCisgICAgcmV0dXJuIEZBTFNFOworCisjZGVmaW5lIENIRUNLKGlucHV0LGV4cGVjdGVkKSBpZiAoIWNoZWNrX3NoYV9zdHIgKGlucHV0LCBleHBlY3RlZCkpIHJldHVybiBGQUxTRQorCisgIENIRUNLICgiIiwgImRhMzlhM2VlNWU2YjRiMGQzMjU1YmZlZjk1NjAxODkwYWZkODA3MDkiKTsKKyAgQ0hFQ0sgKCJhIiwgIjg2ZjdlNDM3ZmFhNWE3ZmNlMTVkMWRkY2I5ZWFlYWVhMzc3NjY3YjgiKTsKKyAgQ0hFQ0sgKCJhYmMiLCAiYTk5OTNlMzY0NzA2ODE2YWJhM2UyNTcxNzg1MGMyNmM5Y2QwZDg5ZCIpOworICBDSEVDSyAoIm1lc3NhZ2UgZGlnZXN0IiwgImMxMjI1MmNlZGE4YmU4OTk0ZDVmYTAyOTBhNDcyMzFjMWQxNmFhZTMiKTsKKyAgQ0hFQ0sgKCJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiIsICIzMmQxMGM3YjhjZjk2NTcwY2EwNGNlMzdmMmExOWQ4NDI0MGQzYTg5Iik7CisgIENIRUNLICgiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkiLAorICAgICAgICAgIjc2MWM0NTdiZjczYjE0ZDI3ZTllOTI2NWM0NmY0YjRkZGExMWY5NDAiKTsKKyAgQ0hFQ0sgKCIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MCIsCisgICAgICAgICAiNTBhYmY1NzA2YTE1MDk5MGEwOGIyYzVlYTQwZmEwZTU4NTU1NDczMiIpOworCisgIHJldHVybiBUUlVFOworfQorCisjZW5kaWYgLyogREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMgKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1zaGEuaCBiL2RidXMvZGJ1cy1zaGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDgwMzViCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLXNoYS5oCkBAIC0wLDAgKzEsNTUgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1zaGEuaCBTSEEtMSBpbXBsZW1lbnRhdGlvbgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBSZWQgSGF0IEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaWZuZGVmIERCVVNfU0hBX0gKKyNkZWZpbmUgREJVU19TSEFfSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLW1hY3Jvcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1lcnJvcnMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc3RyaW5nLmg+CisKK0RCVVNfQkVHSU5fREVDTFMKKwordHlwZWRlZiBzdHJ1Y3QgREJ1c1NIQUNvbnRleHQgREJ1c1NIQUNvbnRleHQ7CisKKy8qKgorICogU3RydWN0IHN0b3Jpbmcgc3RhdGUgb2YgdGhlIFNIQSBhbGdvcml0aG0KKyAqLworc3RydWN0IERCdXNTSEFDb250ZXh0Cit7CisgIGRidXNfdWludDMyX3QgIGRpZ2VzdFs1XTsgICAgICAgICAvKio8IE1lc3NhZ2UgZGlnZXN0ICovCisgIGRidXNfdWludDMyX3QgIGNvdW50X2xvOyAgICAgICAgICAvKio8IDY0LWJpdCBiaXQgY291bnQgKi8KKyAgZGJ1c191aW50MzJfdCAgY291bnRfaGk7ICAgICAgICAgIC8qKjwgTm8gY2x1ZSAqLworICBkYnVzX3VpbnQzMl90ICBkYXRhWzE2XTsgICAgICAgICAgLyoqPCBTSEEgZGF0YSBidWZmZXIgKi8KK307CisKK3ZvaWQgICAgICAgIF9kYnVzX3NoYV9pbml0ICAgIChEQnVzU0hBQ29udGV4dCAgICpjb250ZXh0KTsKK3ZvaWQgICAgICAgIF9kYnVzX3NoYV91cGRhdGUgIChEQnVzU0hBQ29udGV4dCAgICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmRhdGEpOworZGJ1c19ib29sX3QgX2RidXNfc2hhX2ZpbmFsICAgKERCdXNTSEFDb250ZXh0ICAgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAqcmVzdWx0cyk7CitkYnVzX2Jvb2xfdCBfZGJ1c19zaGFfY29tcHV0ZSAoY29uc3QgREJ1c1N0cmluZyAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICphc2NpaV9vdXRwdXQpOworCitEQlVTX0VORF9ERUNMUworCisjZW5kaWYgLyogREJVU19TSEFfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLXNoYXJlZC5oIGIvZGJ1cy9kYnVzLXNoYXJlZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhYjkxMDMKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtc2hhcmVkLmgKQEAgLTAsMCArMSwxMzYgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1zaGFyZWQuaCAgU3R1ZmYgdXNlZCBieSBib3RoIGRidXMvZGJ1cy5oIGxvdy1sZXZlbCBhbmQgQy9DKysgYmluZGluZyBBUElzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0IFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBEQlVTX1NIQVJFRF9ICisjZGVmaW5lIERCVVNfU0hBUkVEX0gKKworLyogRG9uJ3QgaW5jbHVkZSBhbnl0aGluZyBpbiBoZXJlIGZyb20gYW55d2hlcmUgZWxzZS4gSXQncworICogaW50ZW5kZWQgZm9yIHVzZSBieSBhbnkgcmFuZG9tIGxpYnJhcnkuCisgKi8KKworI2lmZGVmICBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjaWYgMAorfSAvKiBhdm9pZHMgY29uZnVzaW5nIGVtYWNzIGluZGVudGF0aW9uICovCisjZW5kaWYKKyNlbmRpZgorCisvKiBOb3JtYWxseSBkb2NzIGFyZSBpbiAuYyBmaWxlcywgYnV0IHRoZXJlIGlzbid0IGEgLmMgZmlsZSBmb3IgdGhpcy4gKi8KKy8qKgorICogQGRlZmdyb3VwIERCdXNTaGFyZWQgU2hhcmVkIGNvbnN0YW50cyAKKyAqIEBpbmdyb3VwICBEQnVzCisgKgorICogQGJyaWVmIFNoYXJlZCBoZWFkZXIgaW5jbHVkZWQgYnkgYm90aCBsaWJkYnVzIGFuZCBDL0MrKyBiaW5kaW5ncyBzdWNoIGFzIHRoZSBHTGliIGJpbmRpbmdzLgorICoKKyAqIFVzdWFsbHkgYSBDL0MrKyBiaW5kaW5nIHN1Y2ggYXMgdGhlIEdMaWIgb3IgUXQgYmluZGluZyB3b24ndCB3YW50IHRvIGluY2x1ZGUgZGJ1cy5oIGluIGl0cworICogcHVibGljIGhlYWRlcnMuIEhvd2V2ZXIsIGEgZmV3IGNvbnN0YW50cyBhbmQgbWFjcm9zIG1heSBiZSB1c2VmdWwgdG8gaW5jbHVkZTsgdGhvc2UgYXJlCisgKiBmb3VuZCBoZXJlIGFuZCBpbiBkYnVzLXByb3RvY29sLmgKKyAqCisgKiBAeworICovCisKKworLyoqCisgKiBXZWxsLWtub3duIGJ1cyB0eXBlcy4gU2VlIGRidXNfYnVzX2dldCgpLgorICovCit0eXBlZGVmIGVudW0KK3sKKyAgREJVU19CVVNfU0VTU0lPTiwgICAgLyoqPCBUaGUgbG9naW4gc2Vzc2lvbiBidXMgKi8KKyAgREJVU19CVVNfU1lTVEVNLCAgICAgLyoqPCBUaGUgc3lzdGVtd2lkZSBidXMgKi8KKyAgREJVU19CVVNfU1RBUlRFUiAgICAgLyoqPCBUaGUgYnVzIHRoYXQgc3RhcnRlZCB1cywgaWYgYW55ICovCit9IERCdXNCdXNUeXBlOworCisvKioKKyAqIFJlc3VsdHMgdGhhdCBhIG1lc3NhZ2UgaGFuZGxlciBjYW4gcmV0dXJuLgorICovCit0eXBlZGVmIGVudW0KK3sKKyAgREJVU19IQU5ETEVSX1JFU1VMVF9IQU5ETEVELCAgICAgICAgIC8qKjwgTWVzc2FnZSBoYXMgaGFkIGl0cyBlZmZlY3QgLSBubyBuZWVkIHRvIHJ1biBtb3JlIGhhbmRsZXJzLiAqLyAKKyAgREJVU19IQU5ETEVSX1JFU1VMVF9OT1RfWUVUX0hBTkRMRUQsIC8qKjwgTWVzc2FnZSBoYXMgbm90IGhhZCBhbnkgZWZmZWN0IC0gc2VlIGlmIG90aGVyIGhhbmRsZXJzIHdhbnQgaXQuICovCisgIERCVVNfSEFORExFUl9SRVNVTFRfTkVFRF9NRU1PUlkgICAgICAvKio8IE5lZWQgbW9yZSBtZW1vcnkgaW4gb3JkZXIgdG8gcmV0dXJuICNEQlVTX0hBTkRMRVJfUkVTVUxUX0hBTkRMRUQgb3IgI0RCVVNfSEFORExFUl9SRVNVTFRfTk9UX1lFVF9IQU5ETEVELiBQbGVhc2UgdHJ5IGFnYWluIGxhdGVyIHdpdGggbW9yZSBtZW1vcnkuICovCit9IERCdXNIYW5kbGVyUmVzdWx0OworCisvKiBCdXMgbmFtZXMgKi8KKworLyoqIFRoZSBidXMgbmFtZSB1c2VkIHRvIHRhbGsgdG8gdGhlIGJ1cyBpdHNlbGYuICovCisjZGVmaW5lIERCVVNfU0VSVklDRV9EQlVTICAgICAgIm9yZy5mcmVlZGVza3RvcC5EQnVzIgorCisvKiBQYXRocyAqLworLyoqIFRoZSBvYmplY3QgcGF0aCB1c2VkIHRvIHRhbGsgdG8gdGhlIGJ1cyBpdHNlbGYuICovCisjZGVmaW5lIERCVVNfUEFUSF9EQlVTICAiL29yZy9mcmVlZGVza3RvcC9EQnVzIgorLyoqIFRoZSBvYmplY3QgcGF0aCB1c2VkIGluIGxvY2FsL2luLXByb2Nlc3MtZ2VuZXJhdGVkIG1lc3NhZ2VzLiAqLworI2RlZmluZSBEQlVTX1BBVEhfTE9DQUwgIi9vcmcvZnJlZWRlc2t0b3AvREJ1cy9Mb2NhbCIKKworLyogSW50ZXJmYWNlcywgdGhlc2UgI2RlZmluZSBkb24ndCBkbyBtdWNoIG90aGVyIHRoYW4KKyAqIGNhdGNoIHR5cG9zIGF0IGNvbXBpbGUgdGltZQorICovCisvKiogVGhlIGludGVyZmFjZSBleHBvcnRlZCBieSB0aGUgb2JqZWN0IHdpdGggI0RCVVNfU0VSVklDRV9EQlVTIGFuZCAjREJVU19QQVRIX0RCVVMgKi8KKyNkZWZpbmUgREJVU19JTlRFUkZBQ0VfREJVUyAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5EQnVzIgorLyoqIFRoZSBtb25pdG9yaW5nIGludGVyZmFjZSBleHBvcnRlZCBieSB0aGUgZGJ1cy1kYWVtb24gKi8KKyNkZWZpbmUgREJVU19JTlRFUkZBQ0VfTU9OSVRPUklORyAgICAgIm9yZy5mcmVlZGVza3RvcC5EQnVzLk1vbml0b3JpbmciCisKKy8qKiBUaGUgdmVyYm9zZSBpbnRlcmZhY2UgZXhwb3J0ZWQgYnkgdGhlIGRidXMtZGFlbW9uICovCisjZGVmaW5lIERCVVNfSU5URVJGQUNFX1ZFUkJPU0UgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5WZXJib3NlIgorLyoqIFRoZSBpbnRlcmZhY2Ugc3VwcG9ydGVkIGJ5IGludHJvc3BlY3RhYmxlIG9iamVjdHMgKi8KKyNkZWZpbmUgREJVU19JTlRFUkZBQ0VfSU5UUk9TUEVDVEFCTEUgIm9yZy5mcmVlZGVza3RvcC5EQnVzLkludHJvc3BlY3RhYmxlIgorLyoqIFRoZSBpbnRlcmZhY2Ugc3VwcG9ydGVkIGJ5IG9iamVjdHMgd2l0aCBwcm9wZXJ0aWVzICovCisjZGVmaW5lIERCVVNfSU5URVJGQUNFX1BST1BFUlRJRVMgICAgICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5Qcm9wZXJ0aWVzIgorLyoqIFRoZSBpbnRlcmZhY2Ugc3VwcG9ydGVkIGJ5IG1vc3QgZGJ1cyBwZWVycyAqLworI2RlZmluZSBEQlVTX0lOVEVSRkFDRV9QRUVSICAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLkRCdXMuUGVlciIKKworLyoqIFRoaXMgaXMgYSBzcGVjaWFsIGludGVyZmFjZSB3aG9zZSBtZXRob2RzIGNhbiBvbmx5IGJlIGludm9rZWQKKyAqIGJ5IHRoZSBsb2NhbCBpbXBsZW1lbnRhdGlvbiAobWVzc2FnZXMgZnJvbSByZW1vdGUgYXBwcyBhcmVuJ3QKKyAqIGFsbG93ZWQgdG8gc3BlY2lmeSB0aGlzIGludGVyZmFjZSkuCisgKi8KKyNkZWZpbmUgREJVU19JTlRFUkZBQ0VfTE9DQUwgIm9yZy5mcmVlZGVza3RvcC5EQnVzLkxvY2FsIgorCisvKiBPd25lciBmbGFncyAqLworI2RlZmluZSBEQlVTX05BTUVfRkxBR19BTExPV19SRVBMQUNFTUVOVCAweDEgLyoqPCBBbGxvdyBhbm90aGVyIHNlcnZpY2UgdG8gYmVjb21lIHRoZSBwcmltYXJ5IG93bmVyIGlmIHJlcXVlc3RlZCAqLworI2RlZmluZSBEQlVTX05BTUVfRkxBR19SRVBMQUNFX0VYSVNUSU5HICAweDIgLyoqPCBSZXF1ZXN0IHRvIHJlcGxhY2UgdGhlIGN1cnJlbnQgcHJpbWFyeSBvd25lciAqLworI2RlZmluZSBEQlVTX05BTUVfRkxBR19ET19OT1RfUVVFVUUgICAgICAweDQgLyoqPCBJZiB3ZSBjYW4gbm90IGJlY29tZSB0aGUgcHJpbWFyeSBvd25lciBkbyBub3QgcGxhY2UgdXMgaW4gdGhlIHF1ZXVlICovCisKKy8qIFJlcGxpZXMgdG8gcmVxdWVzdCBmb3IgYSBuYW1lICovCisjZGVmaW5lIERCVVNfUkVRVUVTVF9OQU1FX1JFUExZX1BSSU1BUllfT1dORVIgIDEgLyoqPCBTZXJ2aWNlIGhhcyBiZWNvbWUgdGhlIHByaW1hcnkgb3duZXIgb2YgdGhlIHJlcXVlc3RlZCBuYW1lICovCisjZGVmaW5lIERCVVNfUkVRVUVTVF9OQU1FX1JFUExZX0lOX1FVRVVFICAgICAgIDIgLyoqPCBTZXJ2aWNlIGNvdWxkIG5vdCBiZWNvbWUgdGhlIHByaW1hcnkgb3duZXIgYW5kIGhhcyBiZWVuIHBsYWNlZCBpbiB0aGUgcXVldWUgKi8KKyNkZWZpbmUgREJVU19SRVFVRVNUX05BTUVfUkVQTFlfRVhJU1RTICAgICAgICAgMyAvKio8IFNlcnZpY2UgaXMgYWxyZWFkeSBpbiB0aGUgcXVldWUgKi8KKyNkZWZpbmUgREJVU19SRVFVRVNUX05BTUVfUkVQTFlfQUxSRUFEWV9PV05FUiAgNCAvKio8IFNlcnZpY2UgaXMgYWxyZWFkeSB0aGUgcHJpbWFyeSBvd25lciAqLworCisvKiBSZXBsaWVzIHRvIHJlbGVhc2luZyBhIG5hbWUgKi8KKyNkZWZpbmUgREJVU19SRUxFQVNFX05BTUVfUkVQTFlfUkVMRUFTRUQgICAgICAgIDEgLyoqPCBTZXJ2aWNlIHdhcyByZWxlYXNlZCBmcm9tIHRoZSBnaXZlbiBuYW1lICovCisjZGVmaW5lIERCVVNfUkVMRUFTRV9OQU1FX1JFUExZX05PTl9FWElTVEVOVCAgICAyIC8qKjwgVGhlIGdpdmVuIG5hbWUgZG9lcyBub3QgZXhpc3Qgb24gdGhlIGJ1cyAqLworI2RlZmluZSBEQlVTX1JFTEVBU0VfTkFNRV9SRVBMWV9OT1RfT1dORVIgICAgICAgMyAvKio8IFNlcnZpY2UgaXMgbm90IGFuIG93bmVyIG9mIHRoZSBnaXZlbiBuYW1lICovCisKKy8qIFJlcGxpZXMgdG8gc2VydmljZSBzdGFydHMgKi8KKyNkZWZpbmUgREJVU19TVEFSVF9SRVBMWV9TVUNDRVNTICAgICAgICAgMSAvKio8IFNlcnZpY2Ugd2FzIGF1dG8gc3RhcnRlZCAqLworI2RlZmluZSBEQlVTX1NUQVJUX1JFUExZX0FMUkVBRFlfUlVOTklORyAyIC8qKjwgU2VydmljZSB3YXMgYWxyZWFkeSBydW5uaW5nICovCisKKy8qKiBAfSAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKKyNpZiAwCit7IC8qIGF2b2lkcyBjb25mdXNpbmcgZW1hY3MgaW5kZW50YXRpb24gKi8KKyNlbmRpZgorfQorI2VuZGlmCisKKyNlbmRpZiAvKiBEQlVTX1NIQVJFRF9IICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtc2hlbGwuYyBiL2RidXMvZGJ1cy1zaGVsbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0Y2JiY2YKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtc2hlbGwuYwpAQCAtMCwwICsxLDY0MSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXNoZWxsLmMgU2hlbGwgY29tbWFuZCBsaW5lIHV0aWxpdHkgZnVuY3Rpb25zLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMyAgUmVkIEhhdCwgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDAzIENvZGVGYWN0b3J5IEFCCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKyNpbmNsdWRlICJkYnVzLWxpc3QuaCIKKyNpbmNsdWRlICJkYnVzLW1lbW9yeS5oIgorI2luY2x1ZGUgImRidXMtcHJvdG9jb2wuaCIKKyNpbmNsdWRlICJkYnVzLXNoZWxsLmgiCisjaW5jbHVkZSAiZGJ1cy1zdHJpbmcuaCIKKworLyogU2luZ2xlIHF1b3RlcyBwcmVzZXJ2ZSB0aGUgbGl0ZXJhbCBzdHJpbmcgZXhhY3RseS4gZXNjYXBlCisgKiBzZXF1ZW5jZXMgYXJlIG5vdCBhbGxvd2VkOyBub3QgZXZlbiBcJyAtIGlmIHlvdSB3YW50IGEgJworICogaW4gdGhlIHF1b3RlZCB0ZXh0LCB5b3UgaGF2ZSB0byBkbyBzb21ldGhpbmcgbGlrZSAnZm9vJ1wnJ2JhcicKKyAqCisgKiBEb3VibGUgcXVvdGVzIGFsbG93ICQgYCAiIFwgYW5kIG5ld2xpbmUgdG8gYmUgZXNjYXBlZCB3aXRoIGJhY2tzbGFzaC4KKyAqIE90aGVyd2lzZSBkb3VibGUgcXVvdGVzIHByZXNlcnZlIHRoaW5ncyBsaXRlcmFsbHkuCisgKi8KKworc3RhdGljIGRidXNfYm9vbF90Cit1bnF1b3RlX3N0cmluZ19pbnBsYWNlIChjaGFyKiBzdHIsIGNoYXIqKiBlbmQpCit7CisgIGNoYXIqIGRlc3Q7CisgIGNoYXIqIHM7CisgIGNoYXIgcXVvdGVfY2hhcjsKKyAgCisgIGRlc3QgPSBzID0gc3RyOworCisgIHF1b3RlX2NoYXIgPSAqczsKKyAgCisgIGlmICghKCpzID09ICciJyB8fCAqcyA9PSAnXCcnKSkKKyAgICB7CisgICAgICAqZW5kID0gc3RyOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAvKiBTa2lwIHRoZSBpbml0aWFsIHF1b3RlIG1hcmsgKi8KKyAgKytzOworCisgIGlmIChxdW90ZV9jaGFyID09ICciJykKKyAgICB7CisgICAgICB3aGlsZSAoKnMpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19hc3NlcnQocyA+IGRlc3QpOyAvKiBsb29wIGludmFyaWFudCAqLworICAgICAgCisgICAgICAgICAgc3dpdGNoICgqcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgJyInOgorICAgICAgICAgICAgICAvKiBFbmQgb2YgdGhlIHN0cmluZywgcmV0dXJuIG5vdyAqLworICAgICAgICAgICAgICAqZGVzdCA9ICdcMCc7CisgICAgICAgICAgICAgICsrczsKKyAgICAgICAgICAgICAgKmVuZCA9IHM7CisgICAgICAgICAgICAgIHJldHVybiBUUlVFOworCisgICAgICAgICAgICBjYXNlICdcXCc6CisgICAgICAgICAgICAgIC8qIFBvc3NpYmxlIGVzY2FwZWQgcXVvdGUgb3IgXCAqLworICAgICAgICAgICAgICArK3M7CisgICAgICAgICAgICAgIHN3aXRjaCAoKnMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgJyInOgorICAgICAgICAgICAgICAgIGNhc2UgJ1xcJzoKKyAgICAgICAgICAgICAgICBjYXNlICdgJzoKKyAgICAgICAgICAgICAgICBjYXNlICckJzoKKyAgICAgICAgICAgICAgICBjYXNlICdcbic6CisgICAgICAgICAgICAgICAgICAqZGVzdCA9ICpzOworICAgICAgICAgICAgICAgICAgKytzOworICAgICAgICAgICAgICAgICAgKytkZXN0OworICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgLyogbm90IGFuIGVzY2FwZWQgY2hhciAqLworICAgICAgICAgICAgICAgICAgKmRlc3QgPSAnXFwnOworICAgICAgICAgICAgICAgICAgKytkZXN0OworICAgICAgICAgICAgICAgICAgLyogKytzIGFscmVhZHkgZG9uZS4gKi8KKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICpkZXN0ID0gKnM7CisgICAgICAgICAgICAgICsrZGVzdDsKKyAgICAgICAgICAgICAgKytzOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIF9kYnVzX2Fzc2VydChzID4gZGVzdCk7IC8qIGxvb3AgaW52YXJpYW50ICovCisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICB3aGlsZSAoKnMpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19hc3NlcnQocyA+IGRlc3QpOyAvKiBsb29wIGludmFyaWFudCAqLworICAgICAgICAgIAorICAgICAgICAgIGlmICgqcyA9PSAnXCcnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvKiBFbmQgb2YgdGhlIHN0cmluZywgcmV0dXJuIG5vdyAqLworICAgICAgICAgICAgICAqZGVzdCA9ICdcMCc7CisgICAgICAgICAgICAgICsrczsKKyAgICAgICAgICAgICAgKmVuZCA9IHM7CisgICAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgKmRlc3QgPSAqczsKKyAgICAgICAgICAgICAgKytkZXN0OworICAgICAgICAgICAgICArK3M7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBfZGJ1c19hc3NlcnQocyA+IGRlc3QpOyAvKiBsb29wIGludmFyaWFudCAqLworICAgICAgICB9CisgICAgfQorICAKKyAgLyogSWYgd2UgcmVhY2ggaGVyZSB0aGlzIG1lYW5zIHRoZSBjbG9zZSBxdW90ZSB3YXMgbmV2ZXIgZW5jb3VudGVyZWQgKi8KKworICAqZGVzdCA9ICdcMCc7CisgIAorICAqZW5kID0gczsKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKiogCisgKiBVbnF1b3RlcyBhIHN0cmluZyBhcyB0aGUgc2hlbGwgKC9iaW4vc2gpIHdvdWxkLiBPbmx5IGhhbmRsZXMKKyAqIHF1b3RlczsgaWYgYSBzdHJpbmcgY29udGFpbnMgZmlsZSBnbG9icywgYXJpdGhtZXRpYyBvcGVyYXRvcnMsCisgKiB2YXJpYWJsZXMsIGJhY2t0aWNrcywgcmVkaXJlY3Rpb25zLCBvciBvdGhlciBzcGVjaWFsLXRvLXRoZS1zaGVsbAorICogZmVhdHVyZXMsIHRoZSByZXN1bHQgd2lsbCBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgcmVzdWx0IGEgcmVhbCBzaGVsbAorICogd291bGQgcHJvZHVjZSAodGhlIHZhcmlhYmxlcywgYmFja3RpY2tzLCBldGMuIHdpbGwgYmUgcGFzc2VkCisgKiB0aHJvdWdoIGxpdGVyYWxseSBpbnN0ZWFkIG9mIGJlaW5nIGV4cGFuZGVkKS4gVGhpcyBmdW5jdGlvbiBpcworICogZ3VhcmFudGVlZCB0byBzdWNjZWVkIGlmIGFwcGxpZWQgdG8gdGhlIHJlc3VsdCBvZgorICogX2RidXNfc2hlbGxfcXVvdGUoKS4gSWYgaXQgZmFpbHMsIGl0IHJldHVybnMgJU5VTEwuCisgKiBUaGUgQHAgcXVvdGVkX3N0cmluZyBuZWVkIG5vdCBhY3R1YWxseSBjb250YWluIHF1b3RlZCBvcgorICogZXNjYXBlZCB0ZXh0OyBfZGJ1c19zaGVsbF91bnF1b3RlKCkgc2ltcGx5IGdvZXMgdGhyb3VnaCB0aGUgc3RyaW5nIGFuZAorICogdW5xdW90ZXMvdW5lc2NhcGVzIGFueXRoaW5nIHRoYXQgdGhlIHNoZWxsIHdvdWxkLiBCb3RoIHNpbmdsZSBhbmQKKyAqIGRvdWJsZSBxdW90ZXMgYXJlIGhhbmRsZWQsIGFzIGFyZSBlc2NhcGVzIGluY2x1ZGluZyBlc2NhcGVkCisgKiBuZXdsaW5lcy4gVGhlIHJldHVybiB2YWx1ZSBtdXN0IGJlIGZyZWVkIHdpdGggZGJ1c19mcmVlKCkuCisgKiAKKyAqIFNoZWxsIHF1b3RpbmcgcnVsZXMgYXJlIGEgYml0IHN0cmFuZ2UuIFNpbmdsZSBxdW90ZXMgcHJlc2VydmUgdGhlCisgKiBsaXRlcmFsIHN0cmluZyBleGFjdGx5LiBlc2NhcGUgc2VxdWVuY2VzIGFyZSBub3QgYWxsb3dlZDsgbm90IGV2ZW4KKyAqIFwnIC0gaWYgeW91IHdhbnQgYSAnIGluIHRoZSBxdW90ZWQgdGV4dCwgeW91IGhhdmUgdG8gZG8gc29tZXRoaW5nCisgKiBsaWtlICdmb28nXCcnYmFyJy4gIERvdWJsZSBxdW90ZXMgYWxsb3cgJCwgYCwgIiwgXCwgYW5kIG5ld2xpbmUgdG8KKyAqIGJlIGVzY2FwZWQgd2l0aCBiYWNrc2xhc2guIE90aGVyd2lzZSBkb3VibGUgcXVvdGVzIHByZXNlcnZlIHRoaW5ncworICogbGl0ZXJhbGx5LgorICoKKyAqIEBwYXJhbSBxdW90ZWRfc3RyaW5nIHNoZWxsLXF1b3RlZCBzdHJpbmcKKyAqKi8KK2NoYXIqCitfZGJ1c19zaGVsbF91bnF1b3RlIChjb25zdCBjaGFyICpxdW90ZWRfc3RyaW5nKQoreworICBjaGFyICp1bnF1b3RlZDsKKyAgY2hhciAqZW5kOworICBjaGFyICpzdGFydDsKKyAgY2hhciAqcmV0OworICBEQnVzU3RyaW5nIHJldHZhbDsKKworICB1bnF1b3RlZCA9IF9kYnVzX3N0cmR1cCAocXVvdGVkX3N0cmluZyk7CisgIGlmICh1bnF1b3RlZCA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIHN0YXJ0ID0gdW5xdW90ZWQ7CisgIGVuZCA9IHVucXVvdGVkOworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmcmV0dmFsKSkKKyAgICB7CisgICAgICBkYnVzX2ZyZWUgKHVucXVvdGVkKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAvKiBUaGUgbG9vcCBhbGxvd3MgY2FzZXMgc3VjaCBhcworICAgKiAiZm9vImJsYWggYmxhaCdiYXInd29vIGZvbyJiYXoibGEgbGEgbGFcJ1wnJ2ZvbycKKyAgICovCisgIHdoaWxlICgqc3RhcnQpCisgICAgeworICAgICAgLyogQXBwZW5kIGFsbCBub24tcXVvdGVkIGNoYXJzLCBob25vcmluZyBiYWNrc2xhc2ggZXNjYXBlCisgICAgICAgKi8KKyAgICAgIAorICAgICAgd2hpbGUgKCpzdGFydCAmJiAhKCpzdGFydCA9PSAnIicgfHwgKnN0YXJ0ID09ICdcJycpKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCpzdGFydCA9PSAnXFwnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvKiBhbGwgY2hhcmFjdGVycyBjYW4gZ2V0IGVzY2FwZWQgYnkgYmFja3NsYXNoLAorICAgICAgICAgICAgICAgKiBleGNlcHQgbmV3bGluZSwgd2hpY2ggaXMgcmVtb3ZlZCBpZiBpdCBmb2xsb3dzCisgICAgICAgICAgICAgICAqIGEgYmFja3NsYXNoIG91dHNpZGUgb2YgcXVvdGVzCisgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgKytzdGFydDsKKyAgICAgICAgICAgICAgaWYgKCpzdGFydCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBpZiAoKnN0YXJ0ICE9ICdcbicpCisJCSAgICB7CisJCSAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlICgmcmV0dmFsLCAqc3RhcnQpKQorCQkJZ290byBlcnJvcjsKKwkJICAgIH0KKyAgICAgICAgICAgICAgICAgICsrc3RhcnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX2J5dGUgKCZyZXR2YWwsICpzdGFydCkpCisJCWdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICsrc3RhcnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgaWYgKCpzdGFydCkKKyAgICAgICAgeworICAgICAgICAgIGlmICghdW5xdW90ZV9zdHJpbmdfaW5wbGFjZSAoc3RhcnQsICZlbmQpKQorCSAgICBnb3RvIGVycm9yOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmcmV0dmFsLCBzdGFydCkpCisJCWdvdG8gZXJyb3I7CisgICAgICAgICAgICAgIHN0YXJ0ID0gZW5kOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgIHJldCA9IF9kYnVzX3N0cmR1cCAoX2RidXNfc3RyaW5nX2dldF9kYXRhICgmcmV0dmFsKSk7CisgIGlmICghcmV0KQorICAgIGdvdG8gZXJyb3I7CisKKyAgZGJ1c19mcmVlICh1bnF1b3RlZCk7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmcmV0dmFsKTsKKyAgCisgIHJldHVybiByZXQ7CisgIAorIGVycm9yOgorICBkYnVzX2ZyZWUgKHVucXVvdGVkKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZyZXR2YWwpOworICByZXR1cm4gTlVMTDsKK30KKworLyogX2RidXNfc2hlbGxfcGFyc2VfYXJndigpIGRvZXMgYSBzZW1pLWFyYml0cmFyeSB3ZWlyZCBzdWJzZXQgb2YgdGhlIHdheQorICogdGhlIHNoZWxsIHBhcnNlcyBhIGNvbW1hbmQgbGluZS4gV2UgZG9uJ3QgZG8gdmFyaWFibGUgZXhwYW5zaW9uLAorICogZG9uJ3QgdW5kZXJzdGFuZCB0aGF0IG9wZXJhdG9ycyBhcmUgdG9rZW5zLCBkb24ndCBkbyB0aWxkZSBleHBhbnNpb24sCisgKiBkb24ndCBkbyBjb21tYW5kIHN1YnN0aXR1dGlvbiwgbm8gYXJpdGhtZXRpYyBleHBhbnNpb24sIElGUyBnZXRzIGlnbm9yZWQsCisgKiBkb24ndCBkbyBmaWxlbmFtZSBnbG9icywgZG9uJ3QgcmVtb3ZlIHJlZGlyZWN0aW9uIHN0dWZmLCBldGMuCisgKgorICogUkVBRCBUSEUgVU5JWDk4IFNQRUMgb24gIlNoZWxsIENvbW1hbmQgTGFuZ3VhZ2UiIGJlZm9yZSBjaGFuZ2luZworICogdGhlIGJlaGF2aW9yIG9mIHRoaXMgY29kZS4KKyAqCisgKiBTdGVwcyB0byBwYXJzaW5nIHRoZSBhcmd2IHN0cmluZzoKKyAqCisgKiAgLSB0b2tlbml6ZSB0aGUgc3RyaW5nIChidXQgc2luY2Ugd2UgaWdub3JlIG9wZXJhdG9ycywKKyAqICAgIG91ciB0b2tlbml6YXRpb24gbWF5IGRpdmVyZ2UgZnJvbSB3aGF0IHRoZSBzaGVsbCB3b3VsZCBkbykKKyAqICAgIG5vdGUgdGhhdCB0b2tlbml6YXRpb24gaWdub3JlcyB0aGUgaW50ZXJuYWxzIG9mIGEgcXVvdGVkCisgKiAgICB3b3JkIGFuZCBpdCBhbHdheXMgc3BsaXRzIG9uIHNwYWNlcywgbm90IG9uIElGUyBldmVuCisgKiAgICBpZiB3ZSB1c2VkIElGUy4gV2UgYWxzbyBpZ25vcmUgImVuZCBvZiBpbnB1dCBpbmRpY2F0b3IiCisgKiAgICAoSSBndWVzcyB0aGlzIGlzIGNvbnRyb2wtRD8pCisgKgorICogICAgVG9rZW5pemF0aW9uIHN0ZXBzLCBmcm9tIFVOSVg5OCB3aXRoIG9wZXJhdG9yIHN0dWZmIHJlbW92ZWQsCisgKiAgICBhcmU6CisgKiAKKyAqICAgIDEpICJJZiB0aGUgY3VycmVudCBjaGFyYWN0ZXIgaXMgYmFja3NsYXNoLCBzaW5nbGUtcXVvdGUgb3IKKyAqICAgICAgICBkb3VibGUtcXVvdGUgKFwsICcgb3IgIikgYW5kIGl0IGlzIG5vdCBxdW90ZWQsIGl0IHdpbGwgYWZmZWN0CisgKiAgICAgICAgcXVvdGluZyBmb3Igc3Vic2VxdWVudCBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBlbmQgb2YgdGhlIHF1b3RlZAorICogICAgICAgIHRleHQuIFRoZSBydWxlcyBmb3IgcXVvdGluZyBhcmUgYXMgZGVzY3JpYmVkIGluIFF1b3RpbmcKKyAqICAgICAgICAuIER1cmluZyB0b2tlbiByZWNvZ25pdGlvbiBubyBzdWJzdGl0dXRpb25zIHdpbGwgYmUgYWN0dWFsbHkKKyAqICAgICAgICBwZXJmb3JtZWQsIGFuZCB0aGUgcmVzdWx0IHRva2VuIHdpbGwgY29udGFpbiBleGFjdGx5IHRoZQorICogICAgICAgIGNoYXJhY3RlcnMgdGhhdCBhcHBlYXIgaW4gdGhlIGlucHV0IChleGNlcHQgZm9yIG5ld2xpbmUKKyAqICAgICAgICBjaGFyYWN0ZXIgam9pbmluZyksIHVubW9kaWZpZWQsIGluY2x1ZGluZyBhbnkgZW1iZWRkZWQgb3IKKyAqICAgICAgICBlbmNsb3NpbmcgcXVvdGVzIG9yIHN1YnN0aXR1dGlvbiBvcGVyYXRvcnMsIGJldHdlZW4gdGhlIHF1b3RlCisgKiAgICAgICAgbWFyayBhbmQgdGhlIGVuZCBvZiB0aGUgcXVvdGVkIHRleHQuIFRoZSB0b2tlbiB3aWxsIG5vdCBiZQorICogICAgICAgIGRlbGltaXRlZCBieSB0aGUgZW5kIG9mIHRoZSBxdW90ZWQgZmllbGQuIgorICoKKyAqICAgIDIpICJJZiB0aGUgY3VycmVudCBjaGFyYWN0ZXIgaXMgYW4gdW5xdW90ZWQgbmV3bGluZSBjaGFyYWN0ZXIsCisgKiAgICAgICAgdGhlIGN1cnJlbnQgdG9rZW4gd2lsbCBiZSBkZWxpbWl0ZWQuIgorICoKKyAqICAgIDMpICJJZiB0aGUgY3VycmVudCBjaGFyYWN0ZXIgaXMgYW4gdW5xdW90ZWQgYmxhbmsgY2hhcmFjdGVyLCBhbnkKKyAqICAgICAgICB0b2tlbiBjb250YWluaW5nIHRoZSBwcmV2aW91cyBjaGFyYWN0ZXIgaXMgZGVsaW1pdGVkIGFuZCB0aGUKKyAqICAgICAgICBjdXJyZW50IGNoYXJhY3RlciB3aWxsIGJlIGRpc2NhcmRlZC4iCisgKgorICogICAgNCkgIklmIHRoZSBwcmV2aW91cyBjaGFyYWN0ZXIgd2FzIHBhcnQgb2YgYSB3b3JkLCB0aGUgY3VycmVudAorICogICAgICAgIGNoYXJhY3RlciB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoYXQgd29yZC4iCisgKgorICogICAgNSkgIklmIHRoZSBjdXJyZW50IGNoYXJhY3RlciBpcyBhICIjIiwgaXQgYW5kIGFsbCBzdWJzZXF1ZW50CisgKiAgICAgICAgY2hhcmFjdGVycyB1cCB0bywgYnV0IGV4Y2x1ZGluZywgdGhlIG5leHQgbmV3bGluZSBjaGFyYWN0ZXIKKyAqICAgICAgICB3aWxsIGJlIGRpc2NhcmRlZCBhcyBhIGNvbW1lbnQuIFRoZSBuZXdsaW5lIGNoYXJhY3RlciB0aGF0CisgKiAgICAgICAgZW5kcyB0aGUgbGluZSBpcyBub3QgY29uc2lkZXJlZCBwYXJ0IG9mIHRoZSBjb21tZW50LiBUaGUKKyAqICAgICAgICAiIyIgc3RhcnRzIGEgY29tbWVudCBvbmx5IHdoZW4gaXQgaXMgYXQgdGhlIGJlZ2lubmluZyBvZiBhCisgKiAgICAgICAgdG9rZW4uIFNpbmNlIHRoZSBzZWFyY2ggZm9yIHRoZSBlbmQtb2YtY29tbWVudCBkb2VzIG5vdAorICogICAgICAgIGNvbnNpZGVyIGFuIGVzY2FwZWQgbmV3bGluZSBjaGFyYWN0ZXIgc3BlY2lhbGx5LCBhIGNvbW1lbnQKKyAqICAgICAgICBjYW5ub3QgYmUgY29udGludWVkIHRvIHRoZSBuZXh0IGxpbmUuIgorICoKKyAqICAgIDYpICJUaGUgY3VycmVudCBjaGFyYWN0ZXIgd2lsbCBiZSB1c2VkIGFzIHRoZSBzdGFydCBvZiBhIG5ldyB3b3JkLiIKKyAqCisgKgorICogIC0gZm9yIGVhY2ggdG9rZW4gKHdvcmQpLCBwZXJmb3JtIHBvcnRpb25zIG9mIHdvcmQgZXhwYW5zaW9uLCBuYW1lbHkKKyAqICAgIGZpZWxkIHNwbGl0dGluZyAodXNpbmcgZGVmYXVsdCB3aGl0ZXNwYWNlIElGUykgYW5kIHF1b3RlCisgKiAgICByZW1vdmFsLiAgRmllbGQgc3BsaXR0aW5nIG1heSBpbmNyZWFzZSB0aGUgbnVtYmVyIG9mIHdvcmRzLgorICogICAgUXVvdGUgcmVtb3ZhbCBkb2VzIG5vdCBpbmNyZWFzZSB0aGUgbnVtYmVyIG9mIHdvcmRzLgorICoKKyAqICAgIklmIHRoZSBjb21wbGV0ZSBleHBhbnNpb24gYXBwcm9wcmlhdGUgZm9yIGEgd29yZCByZXN1bHRzIGluIGFuCisgKiAgIGVtcHR5IGZpZWxkLCB0aGF0IGVtcHR5IGZpZWxkIHdpbGwgYmUgZGVsZXRlZCBmcm9tIHRoZSBsaXN0IG9mCisgKiAgIGZpZWxkcyB0aGF0IGZvcm0gdGhlIGNvbXBsZXRlbHkgZXhwYW5kZWQgY29tbWFuZCwgdW5sZXNzIHRoZQorICogICBvcmlnaW5hbCB3b3JkIGNvbnRhaW5lZCBzaW5nbGUtcXVvdGUgb3IgZG91YmxlLXF1b3RlIGNoYXJhY3RlcnMuIgorICogICAgLSBVTklYOTggc3BlYworICoKKyAqCisgKi8KKworc3RhdGljIGRidXNfYm9vbF90CitkZWxpbWl0X3Rva2VuIChEQnVzU3RyaW5nICp0b2tlbiwKKyAgICAgICAgICAgICAgIERCdXNMaXN0ICoqcmV0dmFsLAorCSAgICAgICBEQnVzRXJyb3IgKmVycm9yKQoreworICBjaGFyICpzdHI7CisKKyAgc3RyID0gX2RidXNfc3RyZHVwIChfZGJ1c19zdHJpbmdfZ2V0X2RhdGEgKHRva2VuKSk7CisgIGlmICghc3RyKQorICAgIHsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19saXN0X2FwcGVuZCAocmV0dmFsLCBzdHIpKQorICAgIHsKKyAgICAgIGRidXNfZnJlZSAoc3RyKTsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBEQnVzTGlzdCoKK3Rva2VuaXplX2NvbW1hbmRfbGluZSAoY29uc3QgY2hhciAqY29tbWFuZF9saW5lLCBEQnVzRXJyb3IgKmVycm9yKQoreworICBjaGFyIGN1cnJlbnRfcXVvdGU7CisgIGNvbnN0IGNoYXIgKnA7CisgIERCdXNTdHJpbmcgY3VycmVudF90b2tlbjsKKyAgREJ1c0xpc3QgKnJldHZhbCA9IE5VTEw7CisgIGRidXNfYm9vbF90IHF1b3RlZDs7CisKKyAgY3VycmVudF9xdW90ZSA9ICdcMCc7CisgIHF1b3RlZCA9IEZBTFNFOworICBwID0gY29tbWFuZF9saW5lOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZjdXJyZW50X3Rva2VuKSkKKyAgICB7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgd2hpbGUgKCpwKQorICAgIHsKKyAgICAgIGlmIChjdXJyZW50X3F1b3RlID09ICdcXCcpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoKnAgPT0gJ1xuJykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogd2UgYXBwZW5kIG5vdGhpbmc7IGJhY2tzbGFzaC1uZXdsaW5lIGJlY29tZSBub3RoaW5nICovCisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworCSAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlICgmY3VycmVudF90b2tlbiwgJ1xcJykgfHwgCisJICAgICAgICAgICFfZGJ1c19zdHJpbmdfYXBwZW5kX2J5dGUgKCZjdXJyZW50X3Rva2VuLCAqcCkpCisJCXsKKwkJICBfREJVU19TRVRfT09NIChlcnJvcik7CisJCSAgZ290byBlcnJvcjsKKwkJfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgY3VycmVudF9xdW90ZSA9ICdcMCc7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKGN1cnJlbnRfcXVvdGUgPT0gJyMnKQorICAgICAgICB7CisgICAgICAgICAgLyogRGlzY2FyZCB1cCB0byBhbmQgaW5jbHVkaW5nIG5leHQgbmV3bGluZSAqLworICAgICAgICAgIHdoaWxlICgqcCAmJiAqcCAhPSAnXG4nKQorICAgICAgICAgICAgKytwOworCisgICAgICAgICAgY3VycmVudF9xdW90ZSA9ICdcMCc7CisgICAgICAgICAgCisgICAgICAgICAgaWYgKCpwID09ICdcMCcpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoY3VycmVudF9xdW90ZSkKKyAgICAgICAgeworICAgICAgICAgIGlmICgqcCA9PSBjdXJyZW50X3F1b3RlICYmCisgICAgICAgICAgICAgIC8qIGNoZWNrIHRoYXQgaXQgaXNuJ3QgYW4gZXNjYXBlZCBkb3VibGUgcXVvdGUgKi8KKyAgICAgICAgICAgICAgIShjdXJyZW50X3F1b3RlID09ICciJyAmJiBxdW90ZWQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvKiBjbG9zZSB0aGUgcXVvdGUgKi8KKyAgICAgICAgICAgICAgY3VycmVudF9xdW90ZSA9ICdcMCc7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAvKiBFdmVyeXRoaW5nIGluc2lkZSBxdW90ZXMsIGFuZCB0aGUgY2xvc2UgcXVvdGUsCisgICAgICAgICAgICogZ2V0cyBhcHBlbmRlZCBsaXRlcmFsbHkuCisgICAgICAgICAgICovCisKKyAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfYnl0ZSAoJmN1cnJlbnRfdG9rZW4sICpwKSkKKwkgICAgeworCSAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKwkgICAgICBnb3RvIGVycm9yOworCSAgICB9CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHN3aXRjaCAoKnApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlICdcbic6CisgICAgICAgICAgICAgIGlmICghZGVsaW1pdF90b2tlbiAoJmN1cnJlbnRfdG9rZW4sICZyZXR2YWwsIGVycm9yKSkKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworCisgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmY3VycmVudF90b2tlbik7CisKKyAgICAgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmN1cnJlbnRfdG9rZW4pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICAgICAgICAgIGdvdG8gaW5pdF9lcnJvcjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgJyAnOgorICAgICAgICAgICAgY2FzZSAnXHQnOgorICAgICAgICAgICAgICAvKiBJZiB0aGUgY3VycmVudCB0b2tlbiBjb250YWlucyB0aGUgcHJldmlvdXMgY2hhciwgZGVsaW1pdAorICAgICAgICAgICAgICAgKiB0aGUgY3VycmVudCB0b2tlbi4gQSBub256ZXJvIGxlbmd0aAorICAgICAgICAgICAgICAgKiB0b2tlbiBzaG91bGQgYWx3YXlzIGNvbnRhaW4gdGhlIHByZXZpb3VzIGNoYXIuCisgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICBpZiAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZjdXJyZW50X3Rva2VuKSA+IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgaWYgKCFkZWxpbWl0X3Rva2VuICgmY3VycmVudF90b2tlbiwgJnJldHZhbCwgZXJyb3IpKQorCQkgICAgZ290byBlcnJvcjsKKworCQkgIF9kYnVzX3N0cmluZ19mcmVlICgmY3VycmVudF90b2tlbik7CisKKwkJICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmY3VycmVudF90b2tlbikpCisJCSAgICB7CisJCSAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKwkJICAgICAgZ290byBpbml0X2Vycm9yOworCQkgICAgfQorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgLyogZGlzY2FyZCBhbGwgdW5xdW90ZWQgYmxhbmtzIChkb24ndCBhZGQgdGhlbSB0byBhIHRva2VuKSAqLworICAgICAgICAgICAgICBicmVhazsKKworCisgICAgICAgICAgICAgIC8qIHNpbmdsZS9kb3VibGUgcXVvdGVzIGFyZSBhcHBlbmRlZCB0byB0aGUgdG9rZW4sCisgICAgICAgICAgICAgICAqIGVzY2FwZXMgYXJlIG1heWJlIGFwcGVuZGVkIG5leHQgdGltZSB0aHJvdWdoIHRoZSBsb29wLAorICAgICAgICAgICAgICAgKiBjb21tZW50IGNoYXJzIGFyZSBuZXZlciBhcHBlbmRlZC4KKyAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgIAorICAgICAgICAgICAgY2FzZSAnXCcnOgorICAgICAgICAgICAgY2FzZSAnIic6CisgICAgICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlICgmY3VycmVudF90b2tlbiwgKnApKQorCQl7CisJCSAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworCQkgIGdvdG8gZXJyb3I7CisJCX0KKworICAgICAgICAgICAgICAvKiBGQUxMIFRIUlUgKi8KKyAgICAgICAgICAgICAgCisgICAgICAgICAgICBjYXNlICcjJzoKKyAgICAgICAgICAgIGNhc2UgJ1xcJzoKKyAgICAgICAgICAgICAgY3VycmVudF9xdW90ZSA9ICpwOworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgLyogQ29tYmluZXMgcnVsZXMgNCkgYW5kIDYpIC0gaWYgd2UgaGF2ZSBhIHRva2VuLCBhcHBlbmQgdG8gaXQsCisgICAgICAgICAgICAgICAqIG90aGVyd2lzZSBjcmVhdGUgYSBuZXcgdG9rZW4uCisgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfYnl0ZSAoJmN1cnJlbnRfdG9rZW4sICpwKSkKKwkJeworCQkgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKwkJICBnb3RvIGVycm9yOworCQl9CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgIC8qIFdlIG5lZWQgdG8gY291bnQgY29uc2VjdXRpdmUgYmFja3NsYXNoZXMgbW9kIDIsIAorICAgICAgICogdG8gZGV0ZWN0IGVzY2FwZWQgZG91YmxlcXVvdGVzLgorICAgICAgICovCisgICAgICBpZiAoKnAgIT0gJ1xcJykKKwlxdW90ZWQgPSBGQUxTRTsKKyAgICAgIGVsc2UKKwlxdW90ZWQgPSAhcXVvdGVkOworCisgICAgICArK3A7CisgICAgfQorCisgIGlmICghZGVsaW1pdF90b2tlbiAoJmN1cnJlbnRfdG9rZW4sICZyZXR2YWwsIGVycm9yKSkKKyAgICBnb3RvIGVycm9yOworCisgIGlmIChjdXJyZW50X3F1b3RlKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yX2NvbnN0IChlcnJvciwgREJVU19FUlJPUl9JTlZBTElEX0FSR1MsICJVbmNsb3NlZCBxdW90ZXMgaW4gY29tbWFuZCBsaW5lIik7CisgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICBpZiAocmV0dmFsID09IE5VTEwpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3JfY29uc3QgKGVycm9yLCBEQlVTX0VSUk9SX0lOVkFMSURfQVJHUywgIk5vIHRva2VucyBmb3VuZCBpbiBjb21tYW5kIGxpbmUiKTsKKyAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorIAorICBfZGJ1c19zdHJpbmdfZnJlZSAoJmN1cnJlbnRfdG9rZW4pOworIAorICByZXR1cm4gcmV0dmFsOworCisgZXJyb3I6CisgIF9kYnVzX3N0cmluZ19mcmVlICgmY3VycmVudF90b2tlbik7CisKKyBpbml0X2Vycm9yOgorICBpZiAocmV0dmFsKQorICAgIHsKKyAgICAgIF9kYnVzX2xpc3RfZm9yZWFjaCAoJnJldHZhbCwgKERCdXNGb3JlYWNoRnVuY3Rpb24pIGRidXNfZnJlZSwgTlVMTCk7CisgICAgICBfZGJ1c19saXN0X2NsZWFyICgmcmV0dmFsKTsKKyAgICB9CisKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogX2RidXNfc2hlbGxfcGFyc2VfYXJndjoKKyAqIAorICogUGFyc2VzIGEgY29tbWFuZCBsaW5lIGludG8gYW4gYXJndW1lbnQgdmVjdG9yLCBpbiBtdWNoIHRoZSBzYW1lIHdheQorICogdGhlIHNoZWxsIHdvdWxkLCBidXQgd2l0aG91dCBtYW55IG9mIHRoZSBleHBhbnNpb25zIHRoZSBzaGVsbCB3b3VsZAorICogcGVyZm9ybSAodmFyaWFibGUgZXhwYW5zaW9uLCBnbG9icywgb3BlcmF0b3JzLCBmaWxlbmFtZSBleHBhbnNpb24sCisgKiBldGMuIGFyZSBub3Qgc3VwcG9ydGVkKS4gVGhlIHJlc3VsdHMgYXJlIGRlZmluZWQgdG8gYmUgdGhlIHNhbWUgYXMKKyAqIHRob3NlIHlvdSB3b3VsZCBnZXQgZnJvbSBhIFVOSVg5OCAvYmluL3NoLCBhcyBsb25nIGFzIHRoZSBpbnB1dAorICogY29udGFpbnMgbm9uZSBvZiB0aGUgdW5zdXBwb3J0ZWQgc2hlbGwgZXhwYW5zaW9ucy4gSWYgdGhlIGlucHV0CisgKiBkb2VzIGNvbnRhaW4gc3VjaCBleHBhbnNpb25zLCB0aGV5IGFyZSBwYXNzZWQgdGhyb3VnaAorICogbGl0ZXJhbGx5LiBGcmVlIHRoZSByZXR1cm5lZCB2ZWN0b3Igd2l0aCBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5KCkuCisgKiAKKyAqIEBwYXJhbSBjb21tYW5kX2xpbmUgY29tbWFuZCBsaW5lIHRvIHBhcnNlCisgKiBAcGFyYW0gYXJnY3AgcmV0dXJuIGxvY2F0aW9uIGZvciBudW1iZXIgb2YgYXJncworICogQHBhcmFtIGFyZ3ZwIHJldHVybiBsb2NhdGlvbiBmb3IgYXJyYXkgb2YgYXJncworICogQHBhcmFtIGVycm9yIGVycm9yIGluZm9ybWF0aW9uCisgKiovCitkYnVzX2Jvb2xfdAorX2RidXNfc2hlbGxfcGFyc2VfYXJndiAoY29uc3QgY2hhciAqY29tbWFuZF9saW5lLAorCQkJaW50ICAgICAgICAqYXJnY3AsCisJCQljaGFyICAgICAqKiphcmd2cCwKKwkJCURCdXNFcnJvciAgKmVycm9yKQoreworICAvKiBDb2RlIGJhc2VkIG9uIHBvcHRQYXJzZUFyZ3ZTdHJpbmcoKSBmcm9tIGxpYnBvcHQgKi8KKyAgaW50IGFyZ2MgPSAwOworICBjaGFyICoqYXJndiA9IE5VTEw7CisgIERCdXNMaXN0ICp0b2tlbnMgPSBOVUxMOworICBpbnQgaTsKKyAgREJ1c0xpc3QgKnRtcF9saXN0OworICAKKyAgaWYgKCFjb21tYW5kX2xpbmUpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIkNvbW1hbmQgbGluZSBpcyBOVUxMXG4iKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgdG9rZW5zID0gdG9rZW5pemVfY29tbWFuZF9saW5lIChjb21tYW5kX2xpbmUsIGVycm9yKTsKKyAgaWYgKHRva2VucyA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJObyB0b2tlbnMgZm9yIGNvbW1hbmQgbGluZSAnJXMnXG4iLCBjb21tYW5kX2xpbmUpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAvKiBCZWNhdXNlIHdlIGNhbid0IGhhdmUgaW50cm9kdWNlZCBhbnkgbmV3IGJsYW5rIHNwYWNlIGludG8gdGhlCisgICAqIHRva2VucyAod2UgZGlkbid0IGRvIGFueSBuZXcgZXhwYW5zaW9ucyksIHdlIGRvbid0IG5lZWQgdG8KKyAgICogcGVyZm9ybSBmaWVsZCBzcGxpdHRpbmcuIElmIHdlIHdlcmUgZ29pbmcgdG8gaG9ub3IgSUZTIG9yIGRvIGFueQorICAgKiBleHBhbnNpb25zLCB3ZSB3b3VsZCBoYXZlIHRvIGRvIGZpZWxkIHNwbGl0dGluZyBvbiBlYWNoIHdvcmQKKyAgICogaGVyZS4gQWxzbywgaWYgd2Ugd2VyZSBnb2luZyB0byBkbyBhbnkgZXhwYW5zaW9uIHdlIHdvdWxkIG5lZWQgdG8KKyAgICogcmVtb3ZlIGFueSB6ZXJvLWxlbmd0aCB3b3JkcyB0aGF0IGRpZG4ndCBjb250YWluIHF1b3RlcworICAgKiBvcmlnaW5hbGx5OyBidXQgc2luY2UgdGhlcmUncyBubyBleHBhbnNpb24gd2Uga25vdyBhbGwgd29yZHMgaGF2ZQorICAgKiBub256ZXJvIGxlbmd0aCwgdW5sZXNzIHRoZXkgY29udGFpbiBxdW90ZXMuCisgICAqIAorICAgKiBTbywgd2Ugc2ltcGx5IHJlbW92ZSBxdW90ZXMsIGFuZCBkb24ndCBkbyBhbnkgZmllbGQgc3BsaXR0aW5nIG9yCisgICAqIGVtcHR5IHdvcmQgcmVtb3ZhbCwgc2luY2Ugd2Uga25vdyB0aGVyZSB3YXMgbm8gd2F5IHRvIGludHJvZHVjZQorICAgKiBzdWNoIHRoaW5ncy4KKyAgICovCisKKyAgYXJnYyA9IF9kYnVzX2xpc3RfZ2V0X2xlbmd0aCAoJnRva2Vucyk7CisgIGFyZ3YgPSBkYnVzX25ldyAoY2hhciAqLCBhcmdjICsgMSk7CisgIGlmICghYXJndikKKyAgICB7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICBpID0gMDsKKyAgdG1wX2xpc3QgPSB0b2tlbnM7CisgIHdoaWxlICh0bXBfbGlzdCkKKyAgICB7CisgICAgICBhcmd2W2ldID0gX2RidXNfc2hlbGxfdW5xdW90ZSAodG1wX2xpc3QtPmRhdGEpOworCisgICAgICBpZiAoIWFyZ3ZbaV0pCisgICAgICAgIHsKKyAgICAgICAgICBpbnQgajsKKwkgIGZvciAoaiA9IDA7IGogPCBpOyBqKyspCisJICAgIGRidXNfZnJlZShhcmd2W2pdKTsKKworICAgICAgICAgIGRidXNfZnJlZSAoYXJndik7CisJICBfREJVU19TRVRfT09NIChlcnJvcik7CisJICBnb3RvIGVycm9yOworICAgICAgICB9CisKKyAgICAgIHRtcF9saXN0ID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmdG9rZW5zLCB0bXBfbGlzdCk7CisgICAgICArK2k7CisgICAgfQorICBhcmd2W2FyZ2NdID0gTlVMTDsKKyAgCisgIF9kYnVzX2xpc3RfZm9yZWFjaCAoJnRva2VucywgKERCdXNGb3JlYWNoRnVuY3Rpb24pIGRidXNfZnJlZSwgTlVMTCk7CisgIF9kYnVzX2xpc3RfY2xlYXIgKCZ0b2tlbnMpOworICAKKyAgaWYgKGFyZ2NwKQorICAgICphcmdjcCA9IGFyZ2M7CisKKyAgaWYgKGFyZ3ZwKQorICAgICphcmd2cCA9IGFyZ3Y7CisgIGVsc2UKKyAgICBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5IChhcmd2KTsKKworICByZXR1cm4gVFJVRTsKKworIGVycm9yOgorICBfZGJ1c19saXN0X2ZvcmVhY2ggKCZ0b2tlbnMsIChEQnVzRm9yZWFjaEZ1bmN0aW9uKSBkYnVzX2ZyZWUsIE5VTEwpOworICBfZGJ1c19saXN0X2NsZWFyICgmdG9rZW5zKTsKKworICByZXR1cm4gRkFMU0U7CisKK30KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1zaGVsbC5oIGIvZGJ1cy9kYnVzLXNoZWxsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZkYTI3NAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1zaGVsbC5oCkBAIC0wLDAgKzEsNDEgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1zaGVsbC5oIFNoZWxsIGNvbW1hbmQgbGluZSB1dGlsaXR5IGZ1bmN0aW9ucy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMgIFJlZCBIYXQsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwMyBDb2RlRmFjdG9yeSBBQgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworCisjaWZuZGVmIERCVVNfU0hFTExfSAorI2RlZmluZSBEQlVTX1NIRUxMX0gKKworREJVU19CRUdJTl9ERUNMUworCitjaGFyKiAgICAgICBfZGJ1c19zaGVsbF91bnF1b3RlICAgIChjb25zdCBjaGFyICpxdW90ZWRfc3RyaW5nKTsKK2RidXNfYm9vbF90IF9kYnVzX3NoZWxsX3BhcnNlX2FyZ3YgKGNvbnN0IGNoYXIgKmNvbW1hbmRfbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgKmFyZ2NwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAqKiphcmd2cCwKKwkJCQkgICAgREJ1c0Vycm9yICAqZXJyb3IpOworCitEQlVTX0VORF9ERUNMUworCisjZW5kaWYgLyogREJVU19TSEVMTF9IICovCisKKwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLXNpZ25hdHVyZS5jIGIvZGJ1cy9kYnVzLXNpZ25hdHVyZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmOWVjYTkKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtc2lnbmF0dXJlLmMKQEAgLTAsMCArMSw1OTAgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1zaWduYXR1cmUuYyAgUm91dGluZXMgZm9yIHJlYWRpbmcgcmVjdXJzaXZlIHR5cGUgc2lnbmF0dXJlcworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisKKyNpbmNsdWRlICJkYnVzLXNpZ25hdHVyZS5oIgorI2luY2x1ZGUgImRidXMtbWFyc2hhbC1yZWN1cnNpdmUuaCIKKyNpbmNsdWRlICJkYnVzLW1hcnNoYWwtYmFzaWMuaCIKKyNpbmNsdWRlICJkYnVzLWludGVybmFscy5oIgorI2luY2x1ZGUgImRidXMtdGVzdC5oIgorCisvKioKKyAqIEltcGxlbWVudGF0aW9uIGRldGFpbHMgb2YgI0RCdXNTaWduYXR1cmVJdGVyLCBhbGwgZmllbGRzIGFyZSBwcml2YXRlCisgKi8KK3R5cGVkZWYgc3RydWN0Cit7IAorICBjb25zdCBjaGFyICpwb3M7ICAgICAgICAgICAvKio8IGN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIHNpZ25hdHVyZSBzdHJpbmcgKi8KKyAgdW5zaWduZWQgaW50IGZpbmlzaGVkIDogMTsgLyoqPCB0cnVlIGlmIHdlIGFyZSBhdCB0aGUgZW5kIGl0ZXIgKi8KKyAgdW5zaWduZWQgaW50IGluX2FycmF5IDogMTsgLyoqPCB0cnVlIGlmIHdlIGFyZSBhIHN1Yml0ZXJhdG9yIHBvaW50aW5nIHRvIGFuIGFycmF5J3MgZWxlbWVudCB0eXBlICovCit9IERCdXNTaWduYXR1cmVSZWFsSXRlcjsKKworLyoqIG1hY3JvIHRoYXQgY2hlY2tzIHdoZXRoZXIgYSB0eXBlY29kZSBpcyBhIGNvbnRhaW5lciB0eXBlICovCisjZGVmaW5lIFRZUEVfSVNfQ09OVEFJTkVSKHR5cGVjb2RlKSAgICAgICAgICAgICBcCisgICAgKCh0eXBlY29kZSkgPT0gREJVU19UWVBFX1NUUlVDVCB8fCAgICAgICAgICBcCisgICAgICh0eXBlY29kZSkgPT0gREJVU19UWVBFX0RJQ1RfRU5UUlkgfHwgICAgICBcCisgICAgICh0eXBlY29kZSkgPT0gREJVU19UWVBFX1ZBUklBTlQgfHwgICAgICAgICBcCisgICAgICh0eXBlY29kZSkgPT0gREJVU19UWVBFX0FSUkFZKQorCisKKy8qKgorICogQGRlZmdyb3VwIERCdXNTaWduYXR1cmUgVHlwZSBzaWduYXR1cmUgcGFyc2luZworICogQGluZ3JvdXAgIERCdXMKKyAqIEBicmllZiBQYXJzaW5nIEQtQnVzIHR5cGUgc2lnbmF0dXJlcworICogQHsKKyAqLworCisvKioKKyAqIEluaXRpYWxpemVzIGEgI0RCdXNTaWduYXR1cmVJdGVyIGZvciByZWFkaW5nIGEgdHlwZSBzaWduYXR1cmUuICBUaGlzCisgKiBmdW5jdGlvbiBpcyBub3Qgc2FmZSB0byB1c2Ugb24gaW52YWxpZCBzaWduYXR1cmVzOyBiZSBzdXJlIHRvCisgKiB2YWxpZGF0ZSBwb3RlbnRpYWxseSBpbnZhbGlkIHNpZ25hdHVyZXMgd2l0aCBkYnVzX3NpZ25hdHVyZV92YWxpZGF0ZQorICogYmVmb3JlIHVzaW5nIHRoaXMgZnVuY3Rpb24uCisgKgorICogQHBhcmFtIGl0ZXIgcG9pbnRlciB0byBhbiBpdGVyYXRvciB0byBpbml0aWFsaXplCisgKiBAcGFyYW0gc2lnbmF0dXJlIHRoZSB0eXBlIHNpZ25hdHVyZQorICovCit2b2lkCitkYnVzX3NpZ25hdHVyZV9pdGVyX2luaXQgKERCdXNTaWduYXR1cmVJdGVyICppdGVyLAorCQkJICBjb25zdCBjaGFyICAgICAgICAqc2lnbmF0dXJlKQoreworICBEQnVzU2lnbmF0dXJlUmVhbEl0ZXIgKnJlYWxfaXRlciA9IChEQnVzU2lnbmF0dXJlUmVhbEl0ZXIgKikgaXRlcjsKKworICByZWFsX2l0ZXItPnBvcyA9IHNpZ25hdHVyZTsKKyAgcmVhbF9pdGVyLT5maW5pc2hlZCA9IEZBTFNFOworICByZWFsX2l0ZXItPmluX2FycmF5ID0gRkFMU0U7Cit9CisKKy8qKgorICogUmV0dXJucyB0aGUgY3VycmVudCB0eXBlIHBvaW50ZWQgdG8gYnkgdGhlIGl0ZXJhdG9yLgorICogSWYgdGhlIGl0ZXJhdG9yIGlzIHBvaW50aW5nIGF0IGEgdHlwZSBjb2RlIHN1Y2ggYXMgJ3MnLCB0aGVuCisgKiBpdCB3aWxsIGJlIHJldHVybmVkIGRpcmVjdGx5LgorICoKKyAqIEhvd2V2ZXIsIHdoZW4gdGhlIHBhcnNlciBlbmNvdW50ZXJzIGEgY29udGFpbmVyIHR5cGUgc3RhcnQKKyAqIGNoYXJhY3RlciBzdWNoIGFzICcoJyBmb3IgYSBzdHJ1Y3R1cmUsIHRoZSBjb3JyZXNwb25kaW5nIHR5cGUgZm9yCisgKiB0aGUgY29udGFpbmVyIHdpbGwgYmUgcmV0dXJuZWQsIGUuZy4gIERCVVNfVFlQRV9TVFJVQ1QsIG5vdCAnKCcuCisgKiBJbiB0aGlzIGNhc2UsIHlvdSBzaG91bGQgaW5pdGlhbGl6ZSBhIHN1Yi1pdGVyYXRvciB3aXRoCisgKiBkYnVzX3NpZ25hdHVyZV9pdGVyX3JlY3Vyc2UoKSB0byBwYXJzZSB0aGUgY29udGFpbmVyIHR5cGUuCisgKgorICogQHBhcmFtIGl0ZXIgcG9pbnRlciB0byBhbiBpdGVyYXRvciAKKyAqIEByZXR1cm5zIGN1cnJlbnQgdHlwZSAoZS5nLiAjREJVU19UWVBFX1NUUklORywgI0RCVVNfVFlQRV9BUlJBWSkKKyAqLworaW50CitkYnVzX3NpZ25hdHVyZV9pdGVyX2dldF9jdXJyZW50X3R5cGUgKGNvbnN0IERCdXNTaWduYXR1cmVJdGVyICppdGVyKQoreworICBEQnVzU2lnbmF0dXJlUmVhbEl0ZXIgKnJlYWxfaXRlciA9IChEQnVzU2lnbmF0dXJlUmVhbEl0ZXIgKikgaXRlcjsKKworICByZXR1cm4gX2RidXNfZmlyc3RfdHlwZV9pbl9zaWduYXR1cmVfY19zdHIgKHJlYWxfaXRlci0+cG9zLCAwKTsKK30KKworLyoqCisgKiBSZXR1cm5zIHRoZSBzaWduYXR1cmUgb2YgdGhlIHNpbmdsZSBjb21wbGV0ZSB0eXBlIHN0YXJ0aW5nIGF0IHRoZQorICogZ2l2ZW4gaXRlcmF0b3IuCisgKgorICogRm9yIGV4YW1wbGUsIGlmIHRoZSBpdGVyYXRvciBpcyBwb2ludGluZyBhdCB0aGUgc3RhcnQgb2YgIihpaSlpaSIKKyAqICh3aGljaCBpcyAiYSBzdHJ1Y3Qgb2YgdHdvIGludHMsIGZvbGxvd2VkIGJ5IGFuIGludCwgZm9sbG93ZWQgYnkgYW4KKyAqIGludCIpLCB0aGVuICIoaWkpIiB3b3VsZCBiZSByZXR1cm5lZC4gSWYgdGhlIGl0ZXJhdG9yIGlzIHBvaW50aW5nIGF0CisgKiBvbmUgb2YgdGhlICJpIiB0aGVuIGp1c3QgdGhhdCAiaSIgd291bGQgYmUgcmV0dXJuZWQuCisgKgorICogQHBhcmFtIGl0ZXIgcG9pbnRlciB0byBhbiBpdGVyYXRvciAKKyAqIEByZXR1cm5zIGN1cnJlbnQgc2lnbmF0dXJlOyBvciAjTlVMTCBpZiBubyBtZW1vcnkuICBTaG91bGQgYmUgZnJlZWQgd2l0aCBkYnVzX2ZyZWUoKQorICovCitjaGFyICoKK2RidXNfc2lnbmF0dXJlX2l0ZXJfZ2V0X3NpZ25hdHVyZSAoY29uc3QgREJ1c1NpZ25hdHVyZUl0ZXIgKml0ZXIpCit7CisgIERCdXNTaWduYXR1cmVSZWFsSXRlciAqcmVhbF9pdGVyID0gKERCdXNTaWduYXR1cmVSZWFsSXRlciAqKSBpdGVyOworICBEQnVzU3RyaW5nIHN0cjsKKyAgY2hhciAqcmV0OworICBpbnQgcG9zOworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnN0cikpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgcG9zID0gMDsKKyAgX2RidXNfdHlwZV9zaWduYXR1cmVfbmV4dCAocmVhbF9pdGVyLT5wb3MsICZwb3MpOworCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9sZW4gKCZzdHIsIHJlYWxfaXRlci0+cG9zLCBwb3MpKQorICAgIHJldHVybiBOVUxMOworICBpZiAoIV9kYnVzX3N0cmluZ19zdGVhbF9kYXRhICgmc3RyLCAmcmV0KSkKKyAgICByZXQgPSBOVUxMOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnN0cik7CisKKyAgcmV0dXJuIHJldDsgCit9CisKKy8qKgorICogQ29udmVuaWVuY2UgZnVuY3Rpb24gZm9yIHJldHVybmluZyB0aGUgZWxlbWVudCB0eXBlIG9mIGFuIGFycmF5OworICogVGhpcyBmdW5jdGlvbiBhbGxvd3MgeW91IHRvIGF2b2lkIGluaXRpYWxpemluZyBhIHN1Yi1pdGVyYXRvciBhbmQKKyAqIGdldHRpbmcgaXRzIGN1cnJlbnQgdHlwZS4KKyAqCisgKiBVbmRlZmluZWQgYmVoYXZpb3IgcmVzdWx0cyBpZiB5b3UgaW52b2tlIHRoaXMgZnVuY3Rpb24gd2hlbiB0aGUKKyAqIGN1cnJlbnQgdHlwZSBvZiB0aGUgaXRlcmF0b3IgaXMgbm90ICNEQlVTX1RZUEVfQVJSQVkuCisgKgorICogQHBhcmFtIGl0ZXIgcG9pbnRlciB0byBhbiBpdGVyYXRvciAKKyAqIEByZXR1cm5zIGN1cnJlbnQgYXJyYXkgZWxlbWVudCB0eXBlCisgKi8KK2ludAorZGJ1c19zaWduYXR1cmVfaXRlcl9nZXRfZWxlbWVudF90eXBlIChjb25zdCBEQnVzU2lnbmF0dXJlSXRlciAqaXRlcikKK3sKKyAgREJ1c1NpZ25hdHVyZVJlYWxJdGVyICpyZWFsX2l0ZXIgPSAoREJ1c1NpZ25hdHVyZVJlYWxJdGVyICopIGl0ZXI7CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChkYnVzX3NpZ25hdHVyZV9pdGVyX2dldF9jdXJyZW50X3R5cGUgKGl0ZXIpID09IERCVVNfVFlQRV9BUlJBWSwgREJVU19UWVBFX0lOVkFMSUQpOworCisgIHJldHVybiBfZGJ1c19maXJzdF90eXBlX2luX3NpZ25hdHVyZV9jX3N0ciAocmVhbF9pdGVyLT5wb3MsIDEpOworfQorCisvKioKKyAqIFNraXAgdG8gdGhlIG5leHQgdmFsdWUgb24gdGhpcyAibGV2ZWwiLiBlLmcuIHRoZSBuZXh0IGZpZWxkIGluIGEKKyAqIHN0cnVjdCwgdGhlIG5leHQgdmFsdWUgaW4gYW4gYXJyYXkuIFJldHVybnMgI0ZBTFNFIGF0IHRoZSBlbmQgb2YgdGhlCisgKiBjdXJyZW50IGNvbnRhaW5lci4KKyAqCisgKiBAcGFyYW0gaXRlciB0aGUgaXRlcmF0b3IKKyAqIEByZXR1cm5zIEZBTFNFIGlmIG5vdGhpbmcgbW9yZSB0byByZWFkIGF0IG9yIGJlbG93IHRoaXMgbGV2ZWwKKyAqLworZGJ1c19ib29sX3QKK2RidXNfc2lnbmF0dXJlX2l0ZXJfbmV4dCAoREJ1c1NpZ25hdHVyZUl0ZXIgKml0ZXIpCit7CisgIERCdXNTaWduYXR1cmVSZWFsSXRlciAqcmVhbF9pdGVyID0gKERCdXNTaWduYXR1cmVSZWFsSXRlciAqKSBpdGVyOworCisgIGlmIChyZWFsX2l0ZXItPmZpbmlzaGVkKQorICAgIHJldHVybiBGQUxTRTsKKyAgZWxzZQorICAgIHsKKyAgICAgIGludCBwb3M7CisKKyAgICAgIGlmIChyZWFsX2l0ZXItPmluX2FycmF5KQorCXsKKwkgIHJlYWxfaXRlci0+ZmluaXNoZWQgPSBUUlVFOworCSAgcmV0dXJuIEZBTFNFOworCX0KKworICAgICAgcG9zID0gMDsKKyAgICAgIF9kYnVzX3R5cGVfc2lnbmF0dXJlX25leHQgKHJlYWxfaXRlci0+cG9zLCAmcG9zKTsKKyAgICAgIHJlYWxfaXRlci0+cG9zICs9IHBvczsKKworICAgICAgaWYgKCpyZWFsX2l0ZXItPnBvcyA9PSBEQlVTX1NUUlVDVF9FTkRfQ0hBUgorCSAgfHwgKnJlYWxfaXRlci0+cG9zID09IERCVVNfRElDVF9FTlRSWV9FTkRfQ0hBUikKKwl7CisJICByZWFsX2l0ZXItPmZpbmlzaGVkID0gVFJVRTsKKwkgIHJldHVybiBGQUxTRTsKKwl9CisKKyAgICAgIHJldHVybiAqcmVhbF9pdGVyLT5wb3MgIT0gREJVU19UWVBFX0lOVkFMSUQ7CisgICAgfQorfQorCisvKioKKyAqIEluaXRpYWxpemUgYSBuZXcgaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGZpcnN0IHR5cGUgaW4gdGhlIGN1cnJlbnQKKyAqIGNvbnRhaW5lci4KKyAqIAorICogVGhlIHJlc3VsdHMgYXJlIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgdGhpcyBpZiB0aGUgY3VycmVudCB0eXBlIGlzCisgKiBhIG5vbi1jb250YWluZXIgKGkuZS4gaWYgZGJ1c190eXBlX2lzX2NvbnRhaW5lcigpIHJldHVybnMgI0ZBTFNFCisgKiBmb3IgdGhlIHJlc3VsdCBvZiBkYnVzX3NpZ25hdHVyZV9pdGVyX2dldF9jdXJyZW50X3R5cGUoKSkuCisgKgorICogQHBhcmFtIGl0ZXIgdGhlIGN1cnJlbnQgaW50ZXJhdG9yCisgKiBAcGFyYW0gc3ViaXRlciBhbiBpdGVyYXRvciB0byBpbml0aWFsaXplIHBvaW50aW5nIHRvIHRoZSBmaXJzdCBjaGlsZAorICovCit2b2lkCitkYnVzX3NpZ25hdHVyZV9pdGVyX3JlY3Vyc2UgKGNvbnN0IERCdXNTaWduYXR1cmVJdGVyICppdGVyLAorCQkJICAgICBEQnVzU2lnbmF0dXJlSXRlciAgICAgICAqc3ViaXRlcikKK3sKKyAgREJ1c1NpZ25hdHVyZVJlYWxJdGVyICpyZWFsX2l0ZXIgPSAoREJ1c1NpZ25hdHVyZVJlYWxJdGVyICopIGl0ZXI7CisgIERCdXNTaWduYXR1cmVSZWFsSXRlciAqcmVhbF9zdWJfaXRlciA9IChEQnVzU2lnbmF0dXJlUmVhbEl0ZXIgKikgc3ViaXRlcjsKKworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAoZGJ1c190eXBlX2lzX2NvbnRhaW5lciAoZGJ1c19zaWduYXR1cmVfaXRlcl9nZXRfY3VycmVudF90eXBlIChpdGVyKSkpOworCisgICpyZWFsX3N1Yl9pdGVyID0gKnJlYWxfaXRlcjsKKyAgcmVhbF9zdWJfaXRlci0+aW5fYXJyYXkgPSBGQUxTRTsKKyAgcmVhbF9zdWJfaXRlci0+cG9zKys7CisKKyAgaWYgKGRidXNfc2lnbmF0dXJlX2l0ZXJfZ2V0X2N1cnJlbnRfdHlwZSAoaXRlcikgPT0gREJVU19UWVBFX0FSUkFZKQorICAgIHJlYWxfc3ViX2l0ZXItPmluX2FycmF5ID0gVFJVRTsKK30KKworLyoqCisgKiBDaGVjayBhIHR5cGUgc2lnbmF0dXJlIGZvciB2YWxpZGl0eS4gUmVtZW1iZXIgdGhhdCAjTlVMTCBjYW4gYWx3YXlzCisgKiBiZSBwYXNzZWQgaW5zdGVhZCBvZiBhIERCdXNFcnJvciosIGlmIHlvdSBkb24ndCBjYXJlIGFib3V0IGhhdmluZworICogYW4gZXJyb3IgbmFtZSBhbmQgbWVzc2FnZS4KKyAqCisgKiBAcGFyYW0gc2lnbmF0dXJlIGEgcG90ZW50aWFsbHkgaW52YWxpZCB0eXBlIHNpZ25hdHVyZQorICogQHBhcmFtIGVycm9yIGVycm9yIHJldHVybgorICogQHJldHVybnMgI1RSVUUgaWYgc2lnbmF0dXJlIGlzIHZhbGlkIG9yICNGQUxTRSBpZiBhbiBlcnJvciBpcyBzZXQKKyAqLworZGJ1c19ib29sX3QKK2RidXNfc2lnbmF0dXJlX3ZhbGlkYXRlIChjb25zdCBjaGFyICAgICAgICpzaWduYXR1cmUsCisJCQkgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCisJCQkgCit7CisgIERCdXNTdHJpbmcgc3RyOworICBEQnVzVmFsaWRpdHkgcmVhc29uOworCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmc3RyLCBzaWduYXR1cmUpOworICByZWFzb24gPSBfZGJ1c192YWxpZGF0ZV9zaWduYXR1cmVfd2l0aF9yZWFzb24gKCZzdHIsIDAsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSk7CisKKyAgaWYgKHJlYXNvbiA9PSBEQlVTX1ZBTElEKQorICAgIHJldHVybiBUUlVFOworICBlbHNlCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0lOVkFMSURfU0lHTkFUVVJFLCAiJXMiLAorICAgICAgICAgIF9kYnVzX3ZhbGlkaXR5X3RvX2Vycm9yX21lc3NhZ2UgKHJlYXNvbikpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KK30KKworLyoqCisgKiBDaGVjayB0aGF0IGEgdHlwZSBzaWduYXR1cmUgaXMgYm90aCB2YWxpZCBhbmQgY29udGFpbnMgZXhhY3RseSBvbmUKKyAqIGNvbXBsZXRlIHR5cGUuICJPbmUgY29tcGxldGUgdHlwZSIgbWVhbnMgYSBzaW5nbGUgYmFzaWMgdHlwZSwKKyAqIGFycmF5LCBzdHJ1Y3QsIG9yIGRpY3Rpb25hcnksIHRob3VnaCB0aGUgc3RydWN0IG9yIGFycmF5IG1heSBiZQorICogYXJiaXRyYXJpbHkgcmVjdXJzaXZlIGFuZCBjb21wbGV4LiBNb3JlIHRoYW4gb25lIGNvbXBsZXRlIHR5cGUKKyAqIHdvdWxkIG1lYW4gZm9yIGV4YW1wbGUgImlpIiBvciB0d28gaW50ZWdlcnMgaW4gc2VxdWVuY2UuCisgKgorICogQHBhcmFtIHNpZ25hdHVyZSBhIHBvdGVudGlhbGx5IGludmFsaWQgdHlwZSBzaWduYXR1cmUKKyAqIEBwYXJhbSBlcnJvciBlcnJvciByZXR1cm4KKyAqIEByZXR1cm5zICNUUlVFIGlmIHNpZ25hdHVyZSBpcyB2YWxpZCBhbmQgaGFzIGV4YWN0bHkgb25lIGNvbXBsZXRlIHR5cGUKKyAqLworZGJ1c19ib29sX3QKK2RidXNfc2lnbmF0dXJlX3ZhbGlkYXRlX3NpbmdsZSAoY29uc3QgY2hhciAgICAgICAqc2lnbmF0dXJlLAorCQkJCURCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICBEQnVzU2lnbmF0dXJlSXRlciBpdGVyOworCisgIGlmICghZGJ1c19zaWduYXR1cmVfdmFsaWRhdGUgKHNpZ25hdHVyZSwgZXJyb3IpKQorICAgIHJldHVybiBGQUxTRTsKKworICBkYnVzX3NpZ25hdHVyZV9pdGVyX2luaXQgKCZpdGVyLCBzaWduYXR1cmUpOworICBpZiAoZGJ1c19zaWduYXR1cmVfaXRlcl9nZXRfY3VycmVudF90eXBlICgmaXRlcikgPT0gREJVU19UWVBFX0lOVkFMSUQpCisgICAgZ290byBsb3NlOworICBpZiAoIWRidXNfc2lnbmF0dXJlX2l0ZXJfbmV4dCAoJml0ZXIpKQorICAgIHJldHVybiBUUlVFOworIGxvc2U6CisgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9JTlZBTElEX1NJR05BVFVSRSwgIkV4YWN0bHkgb25lIGNvbXBsZXRlIHR5cGUgcmVxdWlyZWQgaW4gc2lnbmF0dXJlIik7CisgIHJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBBICJjb250YWluZXIgdHlwZSIgY2FuIGNvbnRhaW4gYmFzaWMgdHlwZXMsIG9yIG5lc3RlZAorICogY29udGFpbmVyIHR5cGVzLiAjREJVU19UWVBFX0lOVkFMSUQgaXMgbm90IGEgY29udGFpbmVyIHR5cGUuCisgKgorICogSXQgaXMgYW4gZXJyb3IgdG8gcGFzcyBhbiBpbnZhbGlkIHR5cGUtY29kZSwgb3RoZXIgdGhhbiBEQlVTX1RZUEVfSU5WQUxJRCwKKyAqIHRvIHRoaXMgZnVuY3Rpb24uIFRoZSB2YWxpZCB0eXBlLWNvZGVzIGFyZSBkZWZpbmVkIGJ5IGRidXMtcHJvdG9jb2wuaAorICogYW5kIGNhbiBiZSBjaGVja2VkIHdpdGggZGJ1c190eXBlX2lzX3ZhbGlkKCkuCisgKgorICogQHBhcmFtIHR5cGVjb2RlIGVpdGhlciBhIHZhbGlkIHR5cGUtY29kZSBvciBEQlVTX1RZUEVfSU5WQUxJRAorICogQHJldHVybnMgI1RSVUUgaWYgdHlwZSBpcyBhIGNvbnRhaW5lcgorICovCitkYnVzX2Jvb2xfdAorZGJ1c190eXBlX2lzX2NvbnRhaW5lciAoaW50IHR5cGVjb2RlKQoreworICAvKiBvbmx5IHJlYXNvbmFibGUgKG5vbi1saW5lLW5vaXNlKSB0eXBlY29kZXMgYXJlIGFsbG93ZWQgKi8KKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChkYnVzX3R5cGVfaXNfdmFsaWQgKHR5cGVjb2RlKSB8fCB0eXBlY29kZSA9PSBEQlVTX1RZUEVfSU5WQUxJRCwKKwkJCSAgICBGQUxTRSk7CisgIHJldHVybiBUWVBFX0lTX0NPTlRBSU5FUiAodHlwZWNvZGUpOworfQorCisvKioKKyAqIEEgImJhc2ljIHR5cGUiIGlzIGEgc29tZXdoYXQgYXJiaXRyYXJ5IGNvbmNlcHQsIGJ1dCB0aGUgaW50ZW50IGlzCisgKiB0byBpbmNsdWRlIHRob3NlIHR5cGVzIHRoYXQgYXJlIGZ1bGx5LXNwZWNpZmllZCBieSBhIHNpbmdsZQorICogdHlwZWNvZGUsIHdpdGggbm8gYWRkaXRpb25hbCB0eXBlIGluZm9ybWF0aW9uIG9yIG5lc3RlZCB2YWx1ZXMuIFNvCisgKiBhbGwgbnVtYmVycyBhbmQgc3RyaW5ncyBhcmUgYmFzaWMgdHlwZXMgYW5kIHN0cnVjdHMsIGFycmF5cywgYW5kCisgKiB2YXJpYW50cyBhcmUgbm90IGJhc2ljIHR5cGVzLiAgI0RCVVNfVFlQRV9JTlZBTElEIGlzIG5vdCBhIGJhc2ljCisgKiB0eXBlLgorICoKKyAqIEl0IGlzIGFuIGVycm9yIHRvIHBhc3MgYW4gaW52YWxpZCB0eXBlLWNvZGUsIG90aGVyIHRoYW4gREJVU19UWVBFX0lOVkFMSUQsCisgKiB0byB0aGlzIGZ1bmN0aW9uLiBUaGUgdmFsaWQgdHlwZS1jb2RlcyBhcmUgZGVmaW5lZCBieSBkYnVzLXByb3RvY29sLmgKKyAqIGFuZCBjYW4gYmUgY2hlY2tlZCB3aXRoIGRidXNfdHlwZV9pc192YWxpZCgpLgorICoKKyAqIEBwYXJhbSB0eXBlY29kZSBlaXRoZXIgYSB2YWxpZCB0eXBlLWNvZGUgb3IgREJVU19UWVBFX0lOVkFMSUQKKyAqIEByZXR1cm5zICNUUlVFIGlmIHR5cGUgaXMgYmFzaWMKKyAqLworZGJ1c19ib29sX3QKK2RidXNfdHlwZV9pc19iYXNpYyAoaW50IHR5cGVjb2RlKQoreworICAvKiBvbmx5IHJlYXNvbmFibGUgKG5vbi1saW5lLW5vaXNlKSB0eXBlY29kZXMgYXJlIGFsbG93ZWQgKi8KKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChkYnVzX3R5cGVfaXNfdmFsaWQgKHR5cGVjb2RlKSB8fCB0eXBlY29kZSA9PSBEQlVTX1RZUEVfSU5WQUxJRCwKKwkJCSAgICBGQUxTRSk7CisKKyAgLyogZXZlcnl0aGluZyB0aGF0IGlzbid0IGludmFsaWQgb3IgYSBjb250YWluZXIgKi8KKyAgcmV0dXJuICEodHlwZWNvZGUgPT0gREJVU19UWVBFX0lOVkFMSUQgfHwgVFlQRV9JU19DT05UQUlORVIgKHR5cGVjb2RlKSk7Cit9CisKKy8qKgorICogVGVsbHMgeW91IHdoZXRoZXIgdmFsdWVzIG9mIHRoaXMgdHlwZSBjYW4gY2hhbmdlIGxlbmd0aCBpZiB5b3Ugc2V0CisgKiB0aGVtIHRvIHNvbWUgb3RoZXIgdmFsdWUuIEZvciB0aGlzIHB1cnBvc2UsIHlvdSBhc3N1bWUgdGhhdCB0aGUKKyAqIGZpcnN0IGJ5dGUgb2YgdGhlIG9sZCBhbmQgbmV3IHZhbHVlIHdvdWxkIGJlIGluIHRoZSBzYW1lIGxvY2F0aW9uLAorICogc28gYWxpZ25tZW50IHBhZGRpbmcgaXMgbm90IGEgZmFjdG9yLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZnVsIHRvIGRldGVybWluZSB3aGV0aGVyCisgKiBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfZml4ZWRfYXJyYXkoKSBtYXkgYmUgdXNlZC4KKyAqCisgKiBTb21lIHN0cnVjdHMgYXJlIGZpeGVkLXNpemUgKGlmIHRoZXkgY29udGFpbiBvbmx5IGZpeGVkLXNpemUgdHlwZXMpCisgKiBidXQgc3RydWN0IGlzIG5vdCBjb25zaWRlcmVkIGEgZml4ZWQgdHlwZSBmb3IgcHVycG9zZXMgb2YgdGhpcworICogZnVuY3Rpb24uCisgKgorICogSXQgaXMgYW4gZXJyb3IgdG8gcGFzcyBhbiBpbnZhbGlkIHR5cGUtY29kZSwgb3RoZXIgdGhhbiBEQlVTX1RZUEVfSU5WQUxJRCwKKyAqIHRvIHRoaXMgZnVuY3Rpb24uIFRoZSB2YWxpZCB0eXBlLWNvZGVzIGFyZSBkZWZpbmVkIGJ5IGRidXMtcHJvdG9jb2wuaAorICogYW5kIGNhbiBiZSBjaGVja2VkIHdpdGggZGJ1c190eXBlX2lzX3ZhbGlkKCkuCisgKgorICogQHBhcmFtIHR5cGVjb2RlIGVpdGhlciBhIHZhbGlkIHR5cGUtY29kZSBvciBEQlVTX1RZUEVfSU5WQUxJRAorICogQHJldHVybnMgI0ZBTFNFIGlmIHRoZSB0eXBlIGNhbiBvY2N1cHkgZGlmZmVyZW50IGxlbmd0aHMKKyAqLworZGJ1c19ib29sX3QKK2RidXNfdHlwZV9pc19maXhlZCAoaW50IHR5cGVjb2RlKQoreworICAvKiBvbmx5IHJlYXNvbmFibGUgKG5vbi1saW5lLW5vaXNlKSB0eXBlY29kZXMgYXJlIGFsbG93ZWQgKi8KKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChkYnVzX3R5cGVfaXNfdmFsaWQgKHR5cGVjb2RlKSB8fCB0eXBlY29kZSA9PSBEQlVTX1RZUEVfSU5WQUxJRCwKKwkJCSAgICBGQUxTRSk7CisgIAorICBzd2l0Y2ggKHR5cGVjb2RlKQorICAgIHsKKyAgICBjYXNlIERCVVNfVFlQRV9CWVRFOgorICAgIGNhc2UgREJVU19UWVBFX0JPT0xFQU46CisgICAgY2FzZSBEQlVTX1RZUEVfSU5UMTY6CisgICAgY2FzZSBEQlVTX1RZUEVfVUlOVDE2OgorICAgIGNhc2UgREJVU19UWVBFX0lOVDMyOgorICAgIGNhc2UgREJVU19UWVBFX1VJTlQzMjoKKyAgICBjYXNlIERCVVNfVFlQRV9JTlQ2NDoKKyAgICBjYXNlIERCVVNfVFlQRV9VSU5UNjQ6CisgICAgY2FzZSBEQlVTX1RZUEVfRE9VQkxFOgorICAgIGNhc2UgREJVU19UWVBFX1VOSVhfRkQ6CisgICAgICByZXR1cm4gVFJVRTsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KK30KKworLyoqCisgKiBSZXR1cm4gI1RSVUUgaWYgdGhlIGFyZ3VtZW50IGlzIGEgdmFsaWQgdHlwZWNvZGUuCisgKiAjREJVU19UWVBFX0lOVkFMSUQgc3VycHJpc2luZ2x5IGVub3VnaCBpcyBub3QgY29uc2lkZXJlZCB2YWxpZCwgYW5kCisgKiByYW5kb20gdW5rbm93biBieXRlcyBhcmVuJ3QgZWl0aGVyLiBUaGlzIGZ1bmN0aW9uIGlzIHNhZmUgd2l0aAorICogdW50cnVzdGVkIGRhdGEuCisgKgorICogQHBhcmFtIHR5cGVjb2RlIGEgcG90ZW50aWFsIHR5cGUtY29kZQorICogQHJldHVybnMgI1RSVUUgaWYgdmFsaWQKKyAqLworZGJ1c19ib29sX3QKK2RidXNfdHlwZV9pc192YWxpZCAoaW50IHR5cGVjb2RlKQoreworICBzd2l0Y2ggKHR5cGVjb2RlKQorICAgIHsKKyAgICBjYXNlIERCVVNfVFlQRV9CWVRFOgorICAgIGNhc2UgREJVU19UWVBFX0JPT0xFQU46CisgICAgY2FzZSBEQlVTX1RZUEVfSU5UMTY6CisgICAgY2FzZSBEQlVTX1RZUEVfVUlOVDE2OgorICAgIGNhc2UgREJVU19UWVBFX0lOVDMyOgorICAgIGNhc2UgREJVU19UWVBFX1VJTlQzMjoKKyAgICBjYXNlIERCVVNfVFlQRV9JTlQ2NDoKKyAgICBjYXNlIERCVVNfVFlQRV9VSU5UNjQ6CisgICAgY2FzZSBEQlVTX1RZUEVfRE9VQkxFOgorICAgIGNhc2UgREJVU19UWVBFX1NUUklORzoKKyAgICBjYXNlIERCVVNfVFlQRV9PQkpFQ1RfUEFUSDoKKyAgICBjYXNlIERCVVNfVFlQRV9TSUdOQVRVUkU6CisgICAgY2FzZSBEQlVTX1RZUEVfQVJSQVk6CisgICAgY2FzZSBEQlVTX1RZUEVfU1RSVUNUOgorICAgIGNhc2UgREJVU19UWVBFX0RJQ1RfRU5UUlk6CisgICAgY2FzZSBEQlVTX1RZUEVfVkFSSUFOVDoKKyAgICBjYXNlIERCVVNfVFlQRV9VTklYX0ZEOgorICAgICAgcmV0dXJuIFRSVUU7CisKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KK30KKworLyoqIEB9ICovIC8qIGVuZCBvZiBEQnVzU2lnbmF0dXJlIGdyb3VwICovCisKKyNpZmRlZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworCisvKioKKyAqIEBpbmdyb3VwIERCdXNTaWduYXR1cmVJbnRlcm5hbHMKKyAqIFVuaXQgdGVzdCBmb3IgREJ1c1NpZ25hdHVyZS4KKyAqCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzLgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc2lnbmF0dXJlX3Rlc3QgKHZvaWQpCit7CisgIERCdXNTaWduYXR1cmVJdGVyIGl0ZXI7CisgIERCdXNTaWduYXR1cmVJdGVyIHN1Yml0ZXI7CisgIERCdXNTaWduYXR1cmVJdGVyIHN1YnN1Yml0ZXI7CisgIERCdXNTaWduYXR1cmVJdGVyIHN1YnN1YnN1Yml0ZXI7CisgIGNvbnN0IGNoYXIgKnNpZzsKKyAgZGJ1c19ib29sX3QgYm9vbHJlczsKKworICBfREJVU19TVEFUSUNfQVNTRVJUIChzaXplb2YgKERCdXNTaWduYXR1cmVJdGVyKSA+PSBzaXplb2YgKERCdXNTaWduYXR1cmVSZWFsSXRlcikpOworCisgIHNpZyA9ICIiOworICBfZGJ1c19hc3NlcnQgKGRidXNfc2lnbmF0dXJlX3ZhbGlkYXRlIChzaWcsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZGJ1c19zaWduYXR1cmVfdmFsaWRhdGVfc2luZ2xlIChzaWcsIE5VTEwpKTsKKyAgZGJ1c19zaWduYXR1cmVfaXRlcl9pbml0ICgmaXRlciwgc2lnKTsKKyAgX2RidXNfYXNzZXJ0IChkYnVzX3NpZ25hdHVyZV9pdGVyX2dldF9jdXJyZW50X3R5cGUgKCZpdGVyKSA9PSBEQlVTX1RZUEVfSU5WQUxJRCk7CisKKyAgc2lnID0gREJVU19UWVBFX1NUUklOR19BU19TVFJJTkc7CisgIF9kYnVzX2Fzc2VydCAoZGJ1c19zaWduYXR1cmVfdmFsaWRhdGUgKHNpZywgTlVMTCkpOworICBfZGJ1c19hc3NlcnQgKGRidXNfc2lnbmF0dXJlX3ZhbGlkYXRlX3NpbmdsZSAoc2lnLCBOVUxMKSk7CisgIGRidXNfc2lnbmF0dXJlX2l0ZXJfaW5pdCAoJml0ZXIsIHNpZyk7CisgIF9kYnVzX2Fzc2VydCAoZGJ1c19zaWduYXR1cmVfaXRlcl9nZXRfY3VycmVudF90eXBlICgmaXRlcikgPT0gREJVU19UWVBFX1NUUklORyk7CisKKyAgc2lnID0gREJVU19UWVBFX1NUUklOR19BU19TVFJJTkcgREJVU19UWVBFX0JZVEVfQVNfU1RSSU5HOworICBfZGJ1c19hc3NlcnQgKGRidXNfc2lnbmF0dXJlX3ZhbGlkYXRlIChzaWcsIE5VTEwpKTsKKyAgZGJ1c19zaWduYXR1cmVfaXRlcl9pbml0ICgmaXRlciwgc2lnKTsKKyAgX2RidXNfYXNzZXJ0IChkYnVzX3NpZ25hdHVyZV9pdGVyX2dldF9jdXJyZW50X3R5cGUgKCZpdGVyKSA9PSBEQlVTX1RZUEVfU1RSSU5HKTsKKyAgYm9vbHJlcyA9IGRidXNfc2lnbmF0dXJlX2l0ZXJfbmV4dCAoJml0ZXIpOworICBfZGJ1c19hc3NlcnQgKGJvb2xyZXMpOworICBfZGJ1c19hc3NlcnQgKGRidXNfc2lnbmF0dXJlX2l0ZXJfZ2V0X2N1cnJlbnRfdHlwZSAoJml0ZXIpID09IERCVVNfVFlQRV9CWVRFKTsKKworICBzaWcgPSBEQlVTX1RZUEVfVUlOVDE2X0FTX1NUUklORworICAgIERCVVNfU1RSVUNUX0JFR0lOX0NIQVJfQVNfU1RSSU5HCisgICAgREJVU19UWVBFX1NUUklOR19BU19TVFJJTkcKKyAgICBEQlVTX1RZUEVfVUlOVDMyX0FTX1NUUklORworICAgIERCVVNfVFlQRV9WQVJJQU5UX0FTX1NUUklORworICAgIERCVVNfVFlQRV9ET1VCTEVfQVNfU1RSSU5HCisgICAgREJVU19TVFJVQ1RfRU5EX0NIQVJfQVNfU1RSSU5HOworICBfZGJ1c19hc3NlcnQgKGRidXNfc2lnbmF0dXJlX3ZhbGlkYXRlIChzaWcsIE5VTEwpKTsKKyAgZGJ1c19zaWduYXR1cmVfaXRlcl9pbml0ICgmaXRlciwgc2lnKTsKKyAgX2RidXNfYXNzZXJ0IChkYnVzX3NpZ25hdHVyZV9pdGVyX2dldF9jdXJyZW50X3R5cGUgKCZpdGVyKSA9PSBEQlVTX1RZUEVfVUlOVDE2KTsKKyAgYm9vbHJlcyA9IGRidXNfc2lnbmF0dXJlX2l0ZXJfbmV4dCAoJml0ZXIpOworICBfZGJ1c19hc3NlcnQgKGJvb2xyZXMpOworICBfZGJ1c19hc3NlcnQgKGRidXNfc2lnbmF0dXJlX2l0ZXJfZ2V0X2N1cnJlbnRfdHlwZSAoJml0ZXIpID09IERCVVNfVFlQRV9TVFJVQ1QpOworICBkYnVzX3NpZ25hdHVyZV9pdGVyX3JlY3Vyc2UgKCZpdGVyLCAmc3ViaXRlcik7CisgIF9kYnVzX2Fzc2VydCAoZGJ1c19zaWduYXR1cmVfaXRlcl9nZXRfY3VycmVudF90eXBlICgmc3ViaXRlcikgPT0gREJVU19UWVBFX1NUUklORyk7CisgIGJvb2xyZXMgPSBkYnVzX3NpZ25hdHVyZV9pdGVyX25leHQgKCZzdWJpdGVyKTsKKyAgX2RidXNfYXNzZXJ0IChib29scmVzKTsKKyAgX2RidXNfYXNzZXJ0IChkYnVzX3NpZ25hdHVyZV9pdGVyX2dldF9jdXJyZW50X3R5cGUgKCZzdWJpdGVyKSA9PSBEQlVTX1RZUEVfVUlOVDMyKTsKKyAgYm9vbHJlcyA9IGRidXNfc2lnbmF0dXJlX2l0ZXJfbmV4dCAoJnN1Yml0ZXIpOworICBfZGJ1c19hc3NlcnQgKGJvb2xyZXMpOworICBfZGJ1c19hc3NlcnQgKGRidXNfc2lnbmF0dXJlX2l0ZXJfZ2V0X2N1cnJlbnRfdHlwZSAoJnN1Yml0ZXIpID09IERCVVNfVFlQRV9WQVJJQU5UKTsKKyAgYm9vbHJlcyA9IGRidXNfc2lnbmF0dXJlX2l0ZXJfbmV4dCAoJnN1Yml0ZXIpOworICBfZGJ1c19hc3NlcnQgKGJvb2xyZXMpOworICBfZGJ1c19hc3NlcnQgKGRidXNfc2lnbmF0dXJlX2l0ZXJfZ2V0X2N1cnJlbnRfdHlwZSAoJnN1Yml0ZXIpID09IERCVVNfVFlQRV9ET1VCTEUpOworCisgIHNpZyA9IERCVVNfVFlQRV9VSU5UMTZfQVNfU1RSSU5HCisgICAgREJVU19TVFJVQ1RfQkVHSU5fQ0hBUl9BU19TVFJJTkcKKyAgICBEQlVTX1RZUEVfVUlOVDMyX0FTX1NUUklORworICAgIERCVVNfVFlQRV9CWVRFX0FTX1NUUklORworICAgIERCVVNfVFlQRV9BUlJBWV9BU19TVFJJTkcKKyAgICBEQlVTX1RZUEVfQVJSQVlfQVNfU1RSSU5HCisgICAgREJVU19UWVBFX0RPVUJMRV9BU19TVFJJTkcKKyAgICBEQlVTX1NUUlVDVF9CRUdJTl9DSEFSX0FTX1NUUklORworICAgIERCVVNfVFlQRV9CWVRFX0FTX1NUUklORworICAgIERCVVNfU1RSVUNUX0VORF9DSEFSX0FTX1NUUklORworICAgIERCVVNfU1RSVUNUX0VORF9DSEFSX0FTX1NUUklORzsKKyAgX2RidXNfYXNzZXJ0IChkYnVzX3NpZ25hdHVyZV92YWxpZGF0ZSAoc2lnLCBOVUxMKSk7CisgIGRidXNfc2lnbmF0dXJlX2l0ZXJfaW5pdCAoJml0ZXIsIHNpZyk7CisgIF9kYnVzX2Fzc2VydCAoZGJ1c19zaWduYXR1cmVfaXRlcl9nZXRfY3VycmVudF90eXBlICgmaXRlcikgPT0gREJVU19UWVBFX1VJTlQxNik7CisgIGJvb2xyZXMgPSBkYnVzX3NpZ25hdHVyZV9pdGVyX25leHQgKCZpdGVyKTsKKyAgX2RidXNfYXNzZXJ0IChib29scmVzKTsKKyAgX2RidXNfYXNzZXJ0IChkYnVzX3NpZ25hdHVyZV9pdGVyX2dldF9jdXJyZW50X3R5cGUgKCZpdGVyKSA9PSBEQlVTX1RZUEVfU1RSVUNUKTsKKyAgZGJ1c19zaWduYXR1cmVfaXRlcl9yZWN1cnNlICgmaXRlciwgJnN1Yml0ZXIpOworICBfZGJ1c19hc3NlcnQgKGRidXNfc2lnbmF0dXJlX2l0ZXJfZ2V0X2N1cnJlbnRfdHlwZSAoJnN1Yml0ZXIpID09IERCVVNfVFlQRV9VSU5UMzIpOworICBib29scmVzID0gZGJ1c19zaWduYXR1cmVfaXRlcl9uZXh0ICgmc3ViaXRlcik7CisgIF9kYnVzX2Fzc2VydCAoYm9vbHJlcyk7CisgIF9kYnVzX2Fzc2VydCAoZGJ1c19zaWduYXR1cmVfaXRlcl9nZXRfY3VycmVudF90eXBlICgmc3ViaXRlcikgPT0gREJVU19UWVBFX0JZVEUpOworICBib29scmVzID0gZGJ1c19zaWduYXR1cmVfaXRlcl9uZXh0ICgmc3ViaXRlcik7CisgIF9kYnVzX2Fzc2VydCAoYm9vbHJlcyk7CisgIF9kYnVzX2Fzc2VydCAoZGJ1c19zaWduYXR1cmVfaXRlcl9nZXRfY3VycmVudF90eXBlICgmc3ViaXRlcikgPT0gREJVU19UWVBFX0FSUkFZKTsKKyAgX2RidXNfYXNzZXJ0IChkYnVzX3NpZ25hdHVyZV9pdGVyX2dldF9lbGVtZW50X3R5cGUgKCZzdWJpdGVyKSA9PSBEQlVTX1RZUEVfQVJSQVkpOworCisgIGRidXNfc2lnbmF0dXJlX2l0ZXJfcmVjdXJzZSAoJnN1Yml0ZXIsICZzdWJzdWJpdGVyKTsKKyAgX2RidXNfYXNzZXJ0IChkYnVzX3NpZ25hdHVyZV9pdGVyX2dldF9jdXJyZW50X3R5cGUgKCZzdWJzdWJpdGVyKSA9PSBEQlVTX1RZUEVfQVJSQVkpOworICBfZGJ1c19hc3NlcnQgKGRidXNfc2lnbmF0dXJlX2l0ZXJfZ2V0X2VsZW1lbnRfdHlwZSAoJnN1YnN1Yml0ZXIpID09IERCVVNfVFlQRV9ET1VCTEUpOworCisgIGRidXNfc2lnbmF0dXJlX2l0ZXJfcmVjdXJzZSAoJnN1YnN1Yml0ZXIsICZzdWJzdWJzdWJpdGVyKTsKKyAgX2RidXNfYXNzZXJ0IChkYnVzX3NpZ25hdHVyZV9pdGVyX2dldF9jdXJyZW50X3R5cGUgKCZzdWJzdWJzdWJpdGVyKSA9PSBEQlVTX1RZUEVfRE9VQkxFKTsKKyAgYm9vbHJlcyA9IGRidXNfc2lnbmF0dXJlX2l0ZXJfbmV4dCAoJnN1Yml0ZXIpOworICBfZGJ1c19hc3NlcnQgKGJvb2xyZXMpOworICBfZGJ1c19hc3NlcnQgKGRidXNfc2lnbmF0dXJlX2l0ZXJfZ2V0X2N1cnJlbnRfdHlwZSAoJnN1Yml0ZXIpID09IERCVVNfVFlQRV9TVFJVQ1QpOworICBkYnVzX3NpZ25hdHVyZV9pdGVyX3JlY3Vyc2UgKCZzdWJpdGVyLCAmc3Vic3ViaXRlcik7CisgIF9kYnVzX2Fzc2VydCAoZGJ1c19zaWduYXR1cmVfaXRlcl9nZXRfY3VycmVudF90eXBlICgmc3Vic3ViaXRlcikgPT0gREJVU19UWVBFX0JZVEUpOworCisgIHNpZyA9IERCVVNfVFlQRV9BUlJBWV9BU19TVFJJTkcKKyAgICBEQlVTX0RJQ1RfRU5UUllfQkVHSU5fQ0hBUl9BU19TVFJJTkcKKyAgICBEQlVTX1RZUEVfSU5UMTZfQVNfU1RSSU5HCisgICAgREJVU19UWVBFX1NUUklOR19BU19TVFJJTkcKKyAgICBEQlVTX0RJQ1RfRU5UUllfRU5EX0NIQVJfQVNfU1RSSU5HCisgICAgREJVU19UWVBFX1ZBUklBTlRfQVNfU1RSSU5HOworICBfZGJ1c19hc3NlcnQgKGRidXNfc2lnbmF0dXJlX3ZhbGlkYXRlIChzaWcsIE5VTEwpKTsKKyAgX2RidXNfYXNzZXJ0ICghZGJ1c19zaWduYXR1cmVfdmFsaWRhdGVfc2luZ2xlIChzaWcsIE5VTEwpKTsKKyAgZGJ1c19zaWduYXR1cmVfaXRlcl9pbml0ICgmaXRlciwgc2lnKTsKKyAgX2RidXNfYXNzZXJ0IChkYnVzX3NpZ25hdHVyZV9pdGVyX2dldF9jdXJyZW50X3R5cGUgKCZpdGVyKSA9PSBEQlVTX1RZUEVfQVJSQVkpOworICBfZGJ1c19hc3NlcnQgKGRidXNfc2lnbmF0dXJlX2l0ZXJfZ2V0X2VsZW1lbnRfdHlwZSAoJml0ZXIpID09IERCVVNfVFlQRV9ESUNUX0VOVFJZKTsKKworICBkYnVzX3NpZ25hdHVyZV9pdGVyX3JlY3Vyc2UgKCZpdGVyLCAmc3ViaXRlcik7CisgIGRidXNfc2lnbmF0dXJlX2l0ZXJfcmVjdXJzZSAoJnN1Yml0ZXIsICZzdWJzdWJpdGVyKTsKKyAgX2RidXNfYXNzZXJ0IChkYnVzX3NpZ25hdHVyZV9pdGVyX2dldF9jdXJyZW50X3R5cGUgKCZzdWJzdWJpdGVyKSA9PSBEQlVTX1RZUEVfSU5UMTYpOworICBib29scmVzID0gZGJ1c19zaWduYXR1cmVfaXRlcl9uZXh0ICgmc3Vic3ViaXRlcik7CisgIF9kYnVzX2Fzc2VydCAoYm9vbHJlcyk7CisgIF9kYnVzX2Fzc2VydCAoZGJ1c19zaWduYXR1cmVfaXRlcl9nZXRfY3VycmVudF90eXBlICgmc3Vic3ViaXRlcikgPT0gREJVU19UWVBFX1NUUklORyk7CisgIGJvb2xyZXMgPSBkYnVzX3NpZ25hdHVyZV9pdGVyX25leHQgKCZzdWJzdWJpdGVyKTsKKyAgX2RidXNfYXNzZXJ0ICghYm9vbHJlcyk7CisKKyAgYm9vbHJlcyA9IGRidXNfc2lnbmF0dXJlX2l0ZXJfbmV4dCAoJml0ZXIpOworICBfZGJ1c19hc3NlcnQgKGJvb2xyZXMpOworICBfZGJ1c19hc3NlcnQgKGRidXNfc2lnbmF0dXJlX2l0ZXJfZ2V0X2N1cnJlbnRfdHlwZSAoJml0ZXIpID09IERCVVNfVFlQRV9WQVJJQU5UKTsKKyAgYm9vbHJlcyA9IGRidXNfc2lnbmF0dXJlX2l0ZXJfbmV4dCAoJml0ZXIpOworICBfZGJ1c19hc3NlcnQgKCFib29scmVzKTsKKworICBzaWcgPSBEQlVTX1RZUEVfRElDVF9FTlRSWV9BU19TVFJJTkc7CisgIF9kYnVzX2Fzc2VydCAoIWRidXNfc2lnbmF0dXJlX3ZhbGlkYXRlIChzaWcsIE5VTEwpKTsKKworICBzaWcgPSBEQlVTX1RZUEVfQVJSQVlfQVNfU1RSSU5HOworICBfZGJ1c19hc3NlcnQgKCFkYnVzX3NpZ25hdHVyZV92YWxpZGF0ZSAoc2lnLCBOVUxMKSk7CisKKyAgc2lnID0gREJVU19UWVBFX1VJTlQzMl9BU19TVFJJTkcKKyAgICBEQlVTX1RZUEVfQVJSQVlfQVNfU1RSSU5HOworICBfZGJ1c19hc3NlcnQgKCFkYnVzX3NpZ25hdHVyZV92YWxpZGF0ZSAoc2lnLCBOVUxMKSk7CisKKyAgc2lnID0gREJVU19UWVBFX0FSUkFZX0FTX1NUUklORworICAgIERCVVNfVFlQRV9ESUNUX0VOVFJZX0FTX1NUUklORzsKKyAgX2RidXNfYXNzZXJ0ICghZGJ1c19zaWduYXR1cmVfdmFsaWRhdGUgKHNpZywgTlVMTCkpOworCisgIHNpZyA9IERCVVNfRElDVF9FTlRSWV9CRUdJTl9DSEFSX0FTX1NUUklORzsKKyAgX2RidXNfYXNzZXJ0ICghZGJ1c19zaWduYXR1cmVfdmFsaWRhdGUgKHNpZywgTlVMTCkpOworCisgIHNpZyA9IERCVVNfRElDVF9FTlRSWV9FTkRfQ0hBUl9BU19TVFJJTkc7CisgIF9kYnVzX2Fzc2VydCAoIWRidXNfc2lnbmF0dXJlX3ZhbGlkYXRlIChzaWcsIE5VTEwpKTsKKworICBzaWcgPSBEQlVTX0RJQ1RfRU5UUllfQkVHSU5fQ0hBUl9BU19TVFJJTkcKKyAgICBEQlVTX1RZUEVfSU5UMzJfQVNfU1RSSU5HOworICBfZGJ1c19hc3NlcnQgKCFkYnVzX3NpZ25hdHVyZV92YWxpZGF0ZSAoc2lnLCBOVUxMKSk7CisKKyAgc2lnID0gREJVU19ESUNUX0VOVFJZX0JFR0lOX0NIQVJfQVNfU1RSSU5HCisgICAgREJVU19UWVBFX0lOVDMyX0FTX1NUUklORworICAgIERCVVNfVFlQRV9TVFJJTkdfQVNfU1RSSU5HOworICBfZGJ1c19hc3NlcnQgKCFkYnVzX3NpZ25hdHVyZV92YWxpZGF0ZSAoc2lnLCBOVUxMKSk7CisKKyAgc2lnID0gREJVU19TVFJVQ1RfRU5EX0NIQVJfQVNfU1RSSU5HCisgICAgREJVU19TVFJVQ1RfQkVHSU5fQ0hBUl9BU19TVFJJTkc7CisgIF9kYnVzX2Fzc2VydCAoIWRidXNfc2lnbmF0dXJlX3ZhbGlkYXRlIChzaWcsIE5VTEwpKTsKKworICBzaWcgPSBEQlVTX1NUUlVDVF9CRUdJTl9DSEFSX0FTX1NUUklORworICAgIERCVVNfVFlQRV9CT09MRUFOX0FTX1NUUklORzsKKyAgX2RidXNfYXNzZXJ0ICghZGJ1c19zaWduYXR1cmVfdmFsaWRhdGUgKHNpZywgTlVMTCkpOworICByZXR1cm4gVFJVRTsKKyNpZiAwCisgb29tOgorICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvdXQgb2YgbWVtb3J5Iik7CisgIHJldHVybiBGQUxTRTsKKyNlbmRpZgorfQorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLXNpZ25hdHVyZS5oIGIvZGJ1cy9kYnVzLXNpZ25hdHVyZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0Mzk0MWMKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtc2lnbmF0dXJlLmgKQEAgLTAsMCArMSw5NSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXNpZ25hdHVyZXMuaCB1dGlsaXR5IGZ1bmN0aW9ucyBmb3IgRC1CdXMgdHlwZXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaWYgIWRlZmluZWQgKERCVVNfSU5TSURFX0RCVVNfSCkgJiYgIWRlZmluZWQgKERCVVNfQ09NUElMQVRJT04pCisjZXJyb3IgIk9ubHkgPGRidXMvZGJ1cy5oPiBjYW4gYmUgaW5jbHVkZWQgZGlyZWN0bHksIHRoaXMgZmlsZSBtYXkgZGlzYXBwZWFyIG9yIGNoYW5nZSBjb250ZW50cy4iCisjZW5kaWYKKworI2lmbmRlZiBEQlVTX1NJR05BVFVSRVNfSAorI2RlZmluZSBEQlVTX1NJR05BVFVSRVNfSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLW1hY3Jvcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy10eXBlcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1lcnJvcnMuaD4KKworREJVU19CRUdJTl9ERUNMUworCisvKioKKyAqIEBhZGR0b2dyb3VwIERCdXNTaWduYXR1cmUKKyAqIEB7CisgKi8KKworLyoqCisgKiBEQnVzU2lnbmF0dXJlSXRlciBzdHJ1Y3Q7IGNvbnRhaW5zIG5vIHB1YmxpYyBmaWVsZHMgCisgKi8KK3R5cGVkZWYgc3RydWN0Cit7IAorICB2b2lkICpkdW1teTE7ICAgICAgICAgLyoqPCBEb24ndCB1c2UgdGhpcyAqLworICB2b2lkICpkdW1teTI7ICAgICAgICAgLyoqPCBEb24ndCB1c2UgdGhpcyAqLworICBkYnVzX3VpbnQzMl90IGR1bW15ODsgLyoqPCBEb24ndCB1c2UgdGhpcyAqLworICBpbnQgZHVtbXkxMjsgICAgICAgICAgIC8qKjwgRG9uJ3QgdXNlIHRoaXMgKi8KKyAgaW50IGR1bW15MTc7ICAgICAgICAgICAvKio8IERvbid0IHVzZSB0aGlzICovCit9IERCdXNTaWduYXR1cmVJdGVyOworCitEQlVTX0VYUE9SVAordm9pZCAgICAgICAgICAgIGRidXNfc2lnbmF0dXJlX2l0ZXJfaW5pdCAgICAgICAgICAgICAoREJ1c1NpZ25hdHVyZUl0ZXIgICAgICAgKml0ZXIsCisJCQkJCQkgICAgICBjb25zdCBjaGFyICAgICAgICAgICAgICAqc2lnbmF0dXJlKTsKKworREJVU19FWFBPUlQKK2ludCAgICAgICAgICAgICBkYnVzX3NpZ25hdHVyZV9pdGVyX2dldF9jdXJyZW50X3R5cGUgKGNvbnN0IERCdXNTaWduYXR1cmVJdGVyICppdGVyKTsKKworREJVU19FWFBPUlQKK2NoYXIgKiAgICAgICAgICBkYnVzX3NpZ25hdHVyZV9pdGVyX2dldF9zaWduYXR1cmUgICAgKGNvbnN0IERCdXNTaWduYXR1cmVJdGVyICppdGVyKTsKKworREJVU19FWFBPUlQKK2ludCAgICAgICAgICAgICBkYnVzX3NpZ25hdHVyZV9pdGVyX2dldF9lbGVtZW50X3R5cGUgKGNvbnN0IERCdXNTaWduYXR1cmVJdGVyICppdGVyKTsKKworREJVU19FWFBPUlQKK2RidXNfYm9vbF90ICAgICBkYnVzX3NpZ25hdHVyZV9pdGVyX25leHQgICAgICAgICAgICAgKERCdXNTaWduYXR1cmVJdGVyICAgICAgICppdGVyKTsKKworREJVU19FWFBPUlQKK3ZvaWQgICAgICAgICAgICBkYnVzX3NpZ25hdHVyZV9pdGVyX3JlY3Vyc2UgICAgICAgICAgKGNvbnN0IERCdXNTaWduYXR1cmVJdGVyICppdGVyLAorCQkJCQkJICAgICAgREJ1c1NpZ25hdHVyZUl0ZXIgICAgICAgKnN1Yml0ZXIpOworCitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgICAgIGRidXNfc2lnbmF0dXJlX3ZhbGlkYXRlICAgICAgICAgICAgICAoY29uc3QgY2hhciAgICAgICAqc2lnbmF0dXJlLAorCQkJCQkJICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpOworCitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgICAgIGRidXNfc2lnbmF0dXJlX3ZhbGlkYXRlX3NpbmdsZSAgICAgICAoY29uc3QgY2hhciAgICAgICAqc2lnbmF0dXJlLAorCQkJCQkJICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpOworCitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgICAgIGRidXNfdHlwZV9pc192YWxpZCAgICAgICAgICAgICAgICAgICAoaW50ICAgICAgICAgICAgdHlwZWNvZGUpOworCitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgICAgIGRidXNfdHlwZV9pc19iYXNpYyAgICAgICAgICAgICAgICAgICAoaW50ICAgICAgICAgICAgdHlwZWNvZGUpOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90ICAgICBkYnVzX3R5cGVfaXNfY29udGFpbmVyICAgICAgICAgICAgICAgKGludCAgICAgICAgICAgIHR5cGVjb2RlKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCAgICAgZGJ1c190eXBlX2lzX2ZpeGVkICAgICAgICAgICAgICAgICAgIChpbnQgICAgICAgICAgICB0eXBlY29kZSk7CisKKy8qKiBAfSAqLworCitEQlVTX0VORF9ERUNMUworCisjZW5kaWYgLyogREJVU19TSUdOQVRVUkVfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLXNvY2tldC1zZXQtZXBvbGwuYyBiL2RidXMvZGJ1cy1zb2NrZXQtc2V0LWVwb2xsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY5MmNiZQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1zb2NrZXQtc2V0LWVwb2xsLmMKQEAgLTAsMCArMSwzNzcgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1zb2NrZXQtc2V0LWVwb2xsLmMgLSBhIHNvY2tldCBzZXQgaW1wbGVtZW50ZWQgdmlhIExpbnV4IGVwb2xsKDQpCisgKgorICogQ29weXJpZ2h0IMKpIDIwMTEgTm9raWEgQ29ycG9yYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLAorICogTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiZGJ1cy1zb2NrZXQtc2V0LmgiCisKKyNpbmNsdWRlIDxkYnVzL2RidXMtaW50ZXJuYWxzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXN5c2RlcHMuaD4KKworI2lmbmRlZiBfX2xpbnV4X18KKyMgZXJyb3IgVGhpcyBmaWxlIGlzIGZvciBMaW51eCBlcG9sbCg0KQorI2VuZGlmCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL2Vwb2xsLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpZm5kZWYgRE9YWUdFTl9TSE9VTERfU0tJUF9USElTCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBEQnVzU29ja2V0U2V0IHBhcmVudDsKKyAgICBpbnQgZXBmZDsKK30gREJ1c1NvY2tldFNldEVwb2xsOworCitzdGF0aWMgaW5saW5lIERCdXNTb2NrZXRTZXRFcG9sbCAqCitzb2NrZXRfc2V0X2Vwb2xsX2Nhc3QgKERCdXNTb2NrZXRTZXQgKnNldCkKK3sKKyAgX2RidXNfYXNzZXJ0IChzZXQtPmNscyA9PSAmX2RidXNfc29ja2V0X3NldF9lcG9sbF9jbGFzcyk7CisgIHJldHVybiAoREJ1c1NvY2tldFNldEVwb2xsICopIHNldDsKK30KKworLyogdGhpcyBpcyBzYWZlIHRvIGNhbGwgb24gYSBwYXJ0aWFsbHktYWxsb2NhdGVkIHNvY2tldCBzZXQgKi8KK3N0YXRpYyB2b2lkCitzb2NrZXRfc2V0X2Vwb2xsX2ZyZWUgKERCdXNTb2NrZXRTZXQgKnNldCkKK3sKKyAgREJ1c1NvY2tldFNldEVwb2xsICpzZWxmID0gc29ja2V0X3NldF9lcG9sbF9jYXN0IChzZXQpOworCisgIGlmIChzZWxmID09IE5VTEwpCisgICAgcmV0dXJuOworCisgIGlmIChzZWxmLT5lcGZkICE9IC0xKQorICAgIGNsb3NlIChzZWxmLT5lcGZkKTsKKworICBkYnVzX2ZyZWUgKHNlbGYpOworfQorCitEQnVzU29ja2V0U2V0ICoKK19kYnVzX3NvY2tldF9zZXRfZXBvbGxfbmV3ICh2b2lkKQoreworICBEQnVzU29ja2V0U2V0RXBvbGwgKnNlbGY7CisKKyAgc2VsZiA9IGRidXNfbmV3MCAoREJ1c1NvY2tldFNldEVwb2xsLCAxKTsKKworICBpZiAoc2VsZiA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIHNlbGYtPnBhcmVudC5jbHMgPSAmX2RidXNfc29ja2V0X3NldF9lcG9sbF9jbGFzczsKKworICBzZWxmLT5lcGZkID0gZXBvbGxfY3JlYXRlMSAoRVBPTExfQ0xPRVhFQyk7CisKKyAgaWYgKHNlbGYtPmVwZmQgPT0gLTEpCisgICAgeworICAgICAgaW50IGZsYWdzOworCisgICAgICAvKiB0aGUgc2l6ZSBoaW50IGlzIGlnbm9yZWQgdW5sZXNzIHlvdSBoYXZlIGEgcmF0aGVyIG9sZCBrZXJuZWwsCisgICAgICAgKiBidXQgbXVzdCBiZSBwb3NpdGl2ZSBvbiBzb21lIHZlcnNpb25zLCBzbyBqdXN0IHBpY2sgc29tZXRoaW5nCisgICAgICAgKiBhcmJpdHJhcnk7IGl0J3MgYSBoaW50LCBub3QgYSBsaW1pdCAqLworICAgICAgc2VsZi0+ZXBmZCA9IGVwb2xsX2NyZWF0ZSAoNDIpOworCisgICAgICBmbGFncyA9IGZjbnRsIChzZWxmLT5lcGZkLCBGX0dFVEZELCAwKTsKKworICAgICAgaWYgKGZsYWdzICE9IC0xKQorICAgICAgICBmY250bCAoc2VsZi0+ZXBmZCwgRl9TRVRGRCwgZmxhZ3MgfCBGRF9DTE9FWEVDKTsKKyAgICB9CisKKyAgaWYgKHNlbGYtPmVwZmQgPT0gLTEpCisgICAgeworICAgICAgc29ja2V0X3NldF9lcG9sbF9mcmVlICgoREJ1c1NvY2tldFNldCAqKSBzZWxmKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICByZXR1cm4gKERCdXNTb2NrZXRTZXQgKikgc2VsZjsKK30KKworc3RhdGljIHVpbnQzMl90Cit3YXRjaF9mbGFnc190b19lcG9sbF9ldmVudHMgKHVuc2lnbmVkIGludCBmbGFncykKK3sKKyAgdWludDMyX3QgZXZlbnRzID0gMDsKKworICBpZiAoZmxhZ3MgJiBEQlVTX1dBVENIX1JFQURBQkxFKQorICAgIGV2ZW50cyB8PSBFUE9MTElOOworICBpZiAoZmxhZ3MgJiBEQlVTX1dBVENIX1dSSVRBQkxFKQorICAgIGV2ZW50cyB8PSBFUE9MTE9VVDsKKworICByZXR1cm4gZXZlbnRzOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50CitlcG9sbF9ldmVudHNfdG9fd2F0Y2hfZmxhZ3MgKHVpbnQzMl90IGV2ZW50cykKK3sKKyAgc2hvcnQgZmxhZ3MgPSAwOworCisgIGlmIChldmVudHMgJiBFUE9MTElOKQorICAgIGZsYWdzIHw9IERCVVNfV0FUQ0hfUkVBREFCTEU7CisgIGlmIChldmVudHMgJiBFUE9MTE9VVCkKKyAgICBmbGFncyB8PSBEQlVTX1dBVENIX1dSSVRBQkxFOworICBpZiAoZXZlbnRzICYgRVBPTExIVVApCisgICAgZmxhZ3MgfD0gREJVU19XQVRDSF9IQU5HVVA7CisgIGlmIChldmVudHMgJiBFUE9MTEVSUikKKyAgICBmbGFncyB8PSBEQlVTX1dBVENIX0VSUk9SOworCisgIHJldHVybiBmbGFnczsKK30KKworc3RhdGljIGRidXNfYm9vbF90Citzb2NrZXRfc2V0X2Vwb2xsX2FkZCAoREJ1c1NvY2tldFNldCAgKnNldCwKKyAgICAgICAgICAgICAgICAgICAgICBEQnVzUG9sbGFibGUgICAgZmQsCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICBlbmFibGVkKQoreworICBEQnVzU29ja2V0U2V0RXBvbGwgKnNlbGYgPSBzb2NrZXRfc2V0X2Vwb2xsX2Nhc3QgKHNldCk7CisgIHN0cnVjdCBlcG9sbF9ldmVudCBldmVudDsKKyAgaW50IGVycjsKKworICBfREJVU19aRVJPIChldmVudCk7CisgIGV2ZW50LmRhdGEuZmQgPSBmZDsKKworICBpZiAoZW5hYmxlZCkKKyAgICB7CisgICAgICBldmVudC5ldmVudHMgPSB3YXRjaF9mbGFnc190b19lcG9sbF9ldmVudHMgKGZsYWdzKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBXZSBuZWVkIHRvIGFkZCAqc29tZXRoaW5nKiB0byByZXNlcnZlIHNwYWNlIGluIHRoZSBrZXJuZWwncyBkYXRhCisgICAgICAgKiBzdHJ1Y3R1cmVzOiBzZWUgc29ja2V0X3NldF9lcG9sbF9kaXNhYmxlIGZvciBtb3JlIGRldGFpbHMgKi8KKyAgICAgIGV2ZW50LmV2ZW50cyA9IEVQT0xMRVQ7CisgICAgfQorCisgIGlmIChlcG9sbF9jdGwgKHNlbGYtPmVwZmQsIEVQT0xMX0NUTF9BREQsIGZkLCAmZXZlbnQpID09IDApCisgICAgcmV0dXJuIFRSVUU7CisKKyAgLyogQW55dGhpbmcgZXhjZXB0IEVOT01FTSwgRU5PU1BDIG1lYW5zIHdlIGhhdmUgYW4gaW50ZXJuYWwgZXJyb3IuICovCisgIGVyciA9IGVycm5vOworICBzd2l0Y2ggKGVycikKKyAgICB7CisgICAgICBjYXNlIEVOT01FTToKKyAgICAgIGNhc2UgRU5PU1BDOgorICAgICAgICAvKiBiZSBzaWxlbnQ6IHRoaXMgaXMgYmFzaWNhbGx5IE9PTSwgd2hpY2ggb3VyIGNhbGxlcnMgYXJlIGV4cGVjdGVkCisgICAgICAgICAqIHRvIGNvcGUgd2l0aCAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBFQkFERjoKKyAgICAgICAgX2RidXNfd2FybiAoIkJhZCBmZCAlZCIsIGZkKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgRUVYSVNUOgorICAgICAgICBfZGJ1c193YXJuICgiZmQgJWQgYWRkZWQgYW5kIHRoZW4gYWRkZWQgYWdhaW4iLCBmZCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICBfZGJ1c193YXJuICgiTWlzYyBlcnJvciB3aGVuIHRyeWluZyB0byB3YXRjaCBmZCAlZDogJXMiLCBmZCwKKyAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IgKGVycikpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgdm9pZAorc29ja2V0X3NldF9lcG9sbF9lbmFibGUgKERCdXNTb2NrZXRTZXQgICpzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1BvbGxhYmxlICAgIGZkLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgICBmbGFncykKK3sKKyAgREJ1c1NvY2tldFNldEVwb2xsICpzZWxmID0gc29ja2V0X3NldF9lcG9sbF9jYXN0IChzZXQpOworICBzdHJ1Y3QgZXBvbGxfZXZlbnQgZXZlbnQ7CisgIGludCBlcnI7CisKKyAgX0RCVVNfWkVSTyAoZXZlbnQpOworICBldmVudC5kYXRhLmZkID0gZmQ7CisgIGV2ZW50LmV2ZW50cyA9IHdhdGNoX2ZsYWdzX3RvX2Vwb2xsX2V2ZW50cyAoZmxhZ3MpOworCisgIGlmIChlcG9sbF9jdGwgKHNlbGYtPmVwZmQsIEVQT0xMX0NUTF9NT0QsIGZkLCAmZXZlbnQpID09IDApCisgICAgcmV0dXJuOworCisgIGVyciA9IGVycm5vOworCisgIC8qIEVuYWJsaW5nIGEgZmlsZSBkZXNjcmlwdG9yIGlzbid0IGFsbG93ZWQgdG8gZmFpbCwgZXZlbiBmb3IgT09NLCBzbyB3ZQorICAgKiBkbyBvdXIgYmVzdCB0byBhdm9pZCBhbGwgb2YgdGhlc2UuICovCisgIHN3aXRjaCAoZXJyKQorICAgIHsKKyAgICAgIGNhc2UgRUJBREY6CisgICAgICAgIF9kYnVzX3dhcm4gKCJCYWQgZmQgJWQiLCBmZCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEVOT0VOVDoKKyAgICAgICAgX2RidXNfd2FybiAoImZkICVkIGVuYWJsZWQgYmVmb3JlIGl0IHdhcyBhZGRlZCIsIGZkKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgRU5PTUVNOgorICAgICAgICBfZGJ1c193YXJuICgiSW5zdWZmaWNpZW50IG1lbW9yeSB0byBjaGFuZ2Ugd2F0Y2ggZm9yIGZkICVkIiwgZmQpOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgX2RidXNfd2FybiAoIk1pc2MgZXJyb3Igd2hlbiB0cnlpbmcgdG8gd2F0Y2ggZmQgJWQ6ICVzIiwgZmQsCisgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yIChlcnIpKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorc29ja2V0X3NldF9lcG9sbF9kaXNhYmxlIChEQnVzU29ja2V0U2V0ICAqc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzUG9sbGFibGUgICAgZmQpCit7CisgIERCdXNTb2NrZXRTZXRFcG9sbCAqc2VsZiA9IHNvY2tldF9zZXRfZXBvbGxfY2FzdCAoc2V0KTsKKyAgc3RydWN0IGVwb2xsX2V2ZW50IGV2ZW50OworICBpbnQgZXJyOworCisgIC8qIFRoZSBuYWl2ZSB0aGluZyB0byBkbyB3b3VsZCBiZSBFUE9MTF9DVExfREVMLCBidXQgdGhhdCdsbCBwcm9iYWJseQorICAgKiBmcmVlIHJlc291cmNlcyBpbiB0aGUga2VybmVsLiBXaGVuIHdlIGNvbWUgdG8gZG8gc29ja2V0X3NldF9lcG9sbF9lbmFibGUsCisgICAqIHRoZXJlIG1pZ2h0IG5vdCBiZSBlbm91Z2ggcmVzb3VyY2VzIHRvIGJyaW5nIGl0IGJhY2shCisgICAqCisgICAqIFRoZSBuZXh0IGlkZWEgeW91IG1pZ2h0IGhhdmUgaXMgdG8gc2V0IHRoZSBmbGFncyB0byAwLiBIb3dldmVyLCBldmVudHMKKyAgICogYWx3YXlzIHRyaWdnZXIgb24gRVBPTExFUlIgYW5kIEVQT0xMSFVQLCBldmVuIGlmIGxpYmRidXMgaXNuJ3QgYWN0dWFsbHkKKyAgICogZGVsaXZlcmluZyB0aGVtIHRvIGEgREJ1c1dhdGNoLiBCZWNhdXNlIGVwb2xsIGlzIGxldmVsLXRyaWdnZXJlZCBieQorICAgKiBkZWZhdWx0LCB3ZSdsbCBidXN5LWxvb3Agb24gYW4gdW5oYW5kbGVkIGVycm9yIG9yIGhhbmd1cDsgbm90IGdvb2QuCisgICAqCisgICAqIFNvLCBsZXQncyBzZXQgaXQgdG8gYmUgZWRnZS10cmlnZ2VyZWQ6IHRoZW4gdGhlIHdvcnN0IGNhc2UgaXMgdGhhdAorICAgKiB3ZSByZXR1cm4gZnJvbSBwb2xsIGltbWVkaWF0ZWx5IG9uIG9uZSBpdGVyYXRpb24sIGlnbm9yZSBpdCBiZWNhdXNlIG5vCisgICAqIHdhdGNoIGlzIGVuYWJsZWQsIHRoZW4gZ28gYmFjayB0byBub3JtYWwuIFdoZW4gd2UgcmUtZW5hYmxlIGEgd2F0Y2gKKyAgICogd2UnbGwgc3dpdGNoIGJhY2sgdG8gbGV2ZWwtdHJpZ2dlcmVkIGFuZCBiZSBub3RpZmllZCBhZ2FpbiAodmVyaWZpZWQgdG8KKyAgICogd29yayBvbiAyLjYuMzIpLiBDb21waWxlIHRoaXMgZmlsZSB3aXRoIC1EVEVTVF9CRUhBVklPVVJfT0ZfRVBPTExFVCBmb3IKKyAgICogdGVzdCBjb2RlLgorICAgKi8KKyAgX0RCVVNfWkVSTyAoZXZlbnQpOworICBldmVudC5kYXRhLmZkID0gZmQ7CisgIGV2ZW50LmV2ZW50cyA9IEVQT0xMRVQ7CisKKyAgaWYgKGVwb2xsX2N0bCAoc2VsZi0+ZXBmZCwgRVBPTExfQ1RMX01PRCwgZmQsICZldmVudCkgPT0gMCkKKyAgICByZXR1cm47CisKKyAgZXJyID0gZXJybm87CisgIF9kYnVzX3dhcm4gKCJFcnJvciB3aGVuIHRyeWluZyB0byB3YXRjaCBmZCAlZDogJXMiLCBmZCwKKyAgICAgICAgICAgICAgc3RyZXJyb3IgKGVycikpOworfQorCitzdGF0aWMgdm9pZAorc29ja2V0X3NldF9lcG9sbF9yZW1vdmUgKERCdXNTb2NrZXRTZXQgICpzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1BvbGxhYmxlICAgIGZkKQoreworICBEQnVzU29ja2V0U2V0RXBvbGwgKnNlbGYgPSBzb2NrZXRfc2V0X2Vwb2xsX2Nhc3QgKHNldCk7CisgIGludCBlcnI7CisgIC8qIEtlcm5lbHMgPCAyLjYuOSByZXF1aXJlIGEgbm9uLU5VTEwgc3RydWN0IHBvaW50ZXIsIGV2ZW4gdGhvdWdoIGl0cworICAgKiBjb250ZW50cyBhcmUgaWdub3JlZCAqLworICBzdHJ1Y3QgZXBvbGxfZXZlbnQgZHVtbXk7CisgIF9EQlVTX1pFUk8gKGR1bW15KTsKKworICBpZiAoZXBvbGxfY3RsIChzZWxmLT5lcGZkLCBFUE9MTF9DVExfREVMLCBmZCwgJmR1bW15KSA9PSAwKQorICAgIHJldHVybjsKKworICBlcnIgPSBlcnJubzsKKyAgX2RidXNfd2FybiAoIkVycm9yIHdoZW4gdHJ5aW5nIHRvIHJlbW92ZSBmZCAlZDogJXMiLCBmZCwgc3RyZXJyb3IgKGVycikpOworfQorCisvKiBPcHRpbWFsbHksIHRoaXMgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIGluIERCdXNMb29wOiB3ZSB1c2UgaXQgdG8gdHJhbnNsYXRlCisgKiBiZXR3ZWVuIHN0cnVjdCBlcG9sbF9ldmVudCBhbmQgREJ1c1NvY2tldEV2ZW50IHdpdGhvdXQgYWxsb2NhdGluZyBoZWFwCisgKiBtZW1vcnkuICovCisjZGVmaW5lIE5fU1RBQ0tfREVTQ1JJUFRPUlMgNjQKKworc3RhdGljIGludAorc29ja2V0X3NldF9lcG9sbF9wb2xsIChEQnVzU29ja2V0U2V0ICAgKnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgREJ1c1NvY2tldEV2ZW50ICpyZXZlbnRzLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgIG1heF9ldmVudHMsCisgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgdGltZW91dF9tcykKK3sKKyAgREJ1c1NvY2tldFNldEVwb2xsICpzZWxmID0gc29ja2V0X3NldF9lcG9sbF9jYXN0IChzZXQpOworICBzdHJ1Y3QgZXBvbGxfZXZlbnQgZXZlbnRzW05fU1RBQ0tfREVTQ1JJUFRPUlNdOworICBpbnQgbl9yZWFkeTsKKyAgaW50IGk7CisKKyAgX2RidXNfYXNzZXJ0IChtYXhfZXZlbnRzID4gMCk7CisKKyAgbl9yZWFkeSA9IGVwb2xsX3dhaXQgKHNlbGYtPmVwZmQsIGV2ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgIE1JTiAoX0RCVVNfTl9FTEVNRU5UUyAoZXZlbnRzKSwgbWF4X2V2ZW50cyksCisgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0X21zKTsKKworICBpZiAobl9yZWFkeSA8PSAwKQorICAgIHJldHVybiBuX3JlYWR5OworCisgIGZvciAoaSA9IDA7IGkgPCBuX3JlYWR5OyBpKyspCisgICAgeworICAgICAgcmV2ZW50c1tpXS5mZCA9IGV2ZW50c1tpXS5kYXRhLmZkOworICAgICAgcmV2ZW50c1tpXS5mbGFncyA9IGVwb2xsX2V2ZW50c190b193YXRjaF9mbGFncyAoZXZlbnRzW2ldLmV2ZW50cyk7CisgICAgfQorCisgIHJldHVybiBuX3JlYWR5OworfQorCitEQnVzU29ja2V0U2V0Q2xhc3MgX2RidXNfc29ja2V0X3NldF9lcG9sbF9jbGFzcyA9IHsKKyAgICBzb2NrZXRfc2V0X2Vwb2xsX2ZyZWUsCisgICAgc29ja2V0X3NldF9lcG9sbF9hZGQsCisgICAgc29ja2V0X3NldF9lcG9sbF9yZW1vdmUsCisgICAgc29ja2V0X3NldF9lcG9sbF9lbmFibGUsCisgICAgc29ja2V0X3NldF9lcG9sbF9kaXNhYmxlLAorICAgIHNvY2tldF9zZXRfZXBvbGxfcG9sbAorfTsKKworI2lmZGVmIFRFU1RfQkVIQVZJT1VSX09GX0VQT0xMRVQKKy8qIHVzYWdlOiBjYXQgL2Rldi9udWxsIHwgLi9lcG9sbAorICoKKyAqIGRlc2lyZWQgb3V0cHV0OgorICogY3RsIEFERDogMAorICogd2FpdCBmb3IgSFVQLCBlZGdlLXRyaWdnZXJlZDogMQorICogd2FpdCBmb3IgSFVQIGFnYWluOiAwCisgKiBjdGwgTU9EOiAwCisgKiB3YWl0IGZvciBIVVA6IDEKKyAqLworCisjaW5jbHVkZSA8c3lzL2Vwb2xsLmg+CisKKyNpbmNsdWRlIDxzdGRpby5oPgorCitpbnQKK21haW4gKHZvaWQpCit7CisgIHN0cnVjdCBlcG9sbF9ldmVudCBpbnB1dDsKKyAgc3RydWN0IGVwb2xsX2V2ZW50IG91dHB1dDsKKyAgaW50IGVwZmQgPSBlcG9sbF9jcmVhdGUxIChFUE9MTF9DTE9FWEVDKTsKKyAgaW50IGZkID0gMDsgLyogc3RkaW4gKi8KKyAgaW50IHJldDsKKworICBfREJVU19aRVJPIChpbnB1dCk7CisKKyAgaW5wdXQuZXZlbnRzID0gRVBPTExIVVAgfCBFUE9MTEVUOworICByZXQgPSBlcG9sbF9jdGwgKGVwZmQsIEVQT0xMX0NUTF9BREQsIGZkLCAmaW5wdXQpOworICBwcmludGYgKCJjdGwgQUREOiAlZFxuIiwgcmV0KTsKKworICByZXQgPSBlcG9sbF93YWl0IChlcGZkLCAmb3V0cHV0LCAxLCAtMSk7CisgIHByaW50ZiAoIndhaXQgZm9yIEhVUCwgZWRnZS10cmlnZ2VyZWQ6ICVkXG4iLCByZXQpOworCisgIHJldCA9IGVwb2xsX3dhaXQgKGVwZmQsICZvdXRwdXQsIDEsIDEpOworICBwcmludGYgKCJ3YWl0IGZvciBIVVAgYWdhaW46ICVkXG4iLCByZXQpOworCisgIGlucHV0LmV2ZW50cyA9IEVQT0xMSFVQOworICByZXQgPSBlcG9sbF9jdGwgKGVwZmQsIEVQT0xMX0NUTF9NT0QsIGZkLCAmaW5wdXQpOworICBwcmludGYgKCJjdGwgTU9EOiAlZFxuIiwgcmV0KTsKKworICByZXQgPSBlcG9sbF93YWl0IChlcGZkLCAmb3V0cHV0LCAxLCAtMSk7CisgIHByaW50ZiAoIndhaXQgZm9yIEhVUDogJWRcbiIsIHJldCk7CisKKyAgcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBURVNUX0JFSEFWSU9VUl9PRl9FUE9MTEVUICovCisKKyNlbmRpZiAvKiAhRE9YWUdFTl9TSE9VTERfU0tJUF9USElTICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtc29ja2V0LXNldC1wb2xsLmMgYi9kYnVzL2RidXMtc29ja2V0LXNldC1wb2xsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjIzZTI4ZgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1zb2NrZXQtc2V0LXBvbGwuYwpAQCAtMCwwICsxLDMyMCBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXNvY2tldC1zZXQtcG9sbC5jIC0gYSBzb2NrZXQgc2V0IGltcGxlbWVudGVkIHZpYSBfZGJ1c19wb2xsCisgKgorICogQ29weXJpZ2h0IMKpIDIwMTEgTm9raWEgQ29ycG9yYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLAorICogTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiZGJ1cy1zb2NrZXQtc2V0LmgiCisKKyNpbmNsdWRlIDxkYnVzL2RidXMtaW50ZXJuYWxzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWxpc3QuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc3lzZGVwcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy13YXRjaC5oPgorCisjaWZuZGVmIERPWFlHRU5fU0hPVUxEX1NLSVBfVEhJUworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgREJ1c1NvY2tldFNldCAgICAgIHBhcmVudDsKKyAgICBEQnVzUG9sbEZEICAgICAgICAqZmRzOworICAgIGludCAgICAgICAgICAgICAgICBuX2ZkczsKKyAgICBpbnQgICAgICAgICAgICAgICAgbl9yZXNlcnZlZDsKKyAgICBpbnQgICAgICAgICAgICAgICAgbl9hbGxvY2F0ZWQ7Cit9IERCdXNTb2NrZXRTZXRQb2xsOworCisjZGVmaW5lIFJFQUxMT0NfSU5DUkVNRU5UIDgKKyNkZWZpbmUgTUlOSU1VTV9TSVpFIDgKKworLyogSWYgd2UncmUgaW4gdGhlIHJlZ3Jlc3Npb24gdGVzdHMsIGZvcmNlIHJlYWxsb2NhdGlvbiB0byBoYXBwZW4gc29vbmVyICovCisjaWZkZWYgREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMKKyNkZWZpbmUgREVGQVVMVF9TSVpFX0hJTlQgMQorI2Vsc2UKKyNkZWZpbmUgREVGQVVMVF9TSVpFX0hJTlQgTUlOSU1VTV9TSVpFCisjZW5kaWYKKworc3RhdGljIGlubGluZSBEQnVzU29ja2V0U2V0UG9sbCAqCitzb2NrZXRfc2V0X3BvbGxfY2FzdCAoREJ1c1NvY2tldFNldCAqc2V0KQoreworICBfZGJ1c19hc3NlcnQgKHNldC0+Y2xzID09ICZfZGJ1c19zb2NrZXRfc2V0X3BvbGxfY2xhc3MpOworICByZXR1cm4gKERCdXNTb2NrZXRTZXRQb2xsICopIHNldDsKK30KKworLyogdGhpcyBpcyBzYWZlIHRvIGNhbGwgb24gYSBwYXJ0aWFsbHktYWxsb2NhdGVkIHNvY2tldCBzZXQgKi8KK3N0YXRpYyB2b2lkCitzb2NrZXRfc2V0X3BvbGxfZnJlZSAoREJ1c1NvY2tldFNldCAqc2V0KQoreworICBEQnVzU29ja2V0U2V0UG9sbCAqc2VsZiA9IHNvY2tldF9zZXRfcG9sbF9jYXN0IChzZXQpOworCisgIGRidXNfZnJlZSAoc2VsZi0+ZmRzKTsKKyAgZGJ1c19mcmVlIChzZWxmKTsKKyAgX2RidXNfdmVyYm9zZSAoImZyZWVkIHNvY2tldCBzZXQgJXBcbiIsIHNlbGYpOworfQorCitEQnVzU29ja2V0U2V0ICoKK19kYnVzX3NvY2tldF9zZXRfcG9sbF9uZXcgKGludCBzaXplX2hpbnQpCit7CisgIERCdXNTb2NrZXRTZXRQb2xsICpyZXQ7CisKKyAgaWYgKHNpemVfaGludCA8PSAwKQorICAgIHNpemVfaGludCA9IERFRkFVTFRfU0laRV9ISU5UOworCisgIHJldCA9IGRidXNfbmV3MCAoREJ1c1NvY2tldFNldFBvbGwsIDEpOworCisgIGlmIChyZXQgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICByZXQtPnBhcmVudC5jbHMgPSAmX2RidXNfc29ja2V0X3NldF9wb2xsX2NsYXNzOworICByZXQtPm5fZmRzID0gMDsKKyAgcmV0LT5uX2FsbG9jYXRlZCA9IHNpemVfaGludDsKKworICByZXQtPmZkcyA9IGRidXNfbmV3MCAoREJ1c1BvbGxGRCwgc2l6ZV9oaW50KTsKKworICBpZiAocmV0LT5mZHMgPT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBzb2NrZXRfc2V0X3BvbGxfZnJlZSBzcGVjaWZpY2FsbHkgc3VwcG9ydHMgaGFsZi1jb25zdHJ1Y3RlZAorICAgICAgICogc29ja2V0IHNldHMgKi8KKyAgICAgIHNvY2tldF9zZXRfcG9sbF9mcmVlICgoREJ1c1NvY2tldFNldCAqKSByZXQpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIF9kYnVzX3ZlcmJvc2UgKCJuZXcgc29ja2V0IHNldCBhdCAlcFxuIiwgcmV0KTsKKyAgcmV0dXJuIChEQnVzU29ja2V0U2V0ICopIHJldDsKK30KKworc3RhdGljIHNob3J0Cit3YXRjaF9mbGFnc190b19wb2xsX2V2ZW50cyAodW5zaWduZWQgaW50IGZsYWdzKQoreworICBzaG9ydCBldmVudHMgPSAwOworCisgIGlmIChmbGFncyAmIERCVVNfV0FUQ0hfUkVBREFCTEUpCisgICAgZXZlbnRzIHw9IF9EQlVTX1BPTExJTjsKKyAgaWYgKGZsYWdzICYgREJVU19XQVRDSF9XUklUQUJMRSkKKyAgICBldmVudHMgfD0gX0RCVVNfUE9MTE9VVDsKKworICByZXR1cm4gZXZlbnRzOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3NvY2tldF9zZXRfcG9sbF9hZGQgKERCdXNTb2NrZXRTZXQgICpzZXQsCisgICAgICAgICAgICAgICAgICAgICBEQnVzUG9sbGFibGUgICAgZmQsCisgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgZW5hYmxlZCkKK3sKKyAgREJ1c1NvY2tldFNldFBvbGwgKnNlbGYgPSBzb2NrZXRfc2V0X3BvbGxfY2FzdCAoc2V0KTsKKyNpZm5kZWYgREJVU19ESVNBQkxFX0FTU0VSVAorICBpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgc2VsZi0+bl9mZHM7IGkrKykKKyAgICBfZGJ1c19hc3NlcnQgKCFfZGJ1c19wb2xsYWJsZV9lcXVhbHMgKHNlbGYtPmZkc1tpXS5mZCwgZmQpKTsKKyNlbmRpZgorCisgIGlmIChzZWxmLT5uX3Jlc2VydmVkID49IHNlbGYtPm5fYWxsb2NhdGVkKQorICAgIHsKKyAgICAgIERCdXNQb2xsRkQgKm5ld19mZHMgPSBkYnVzX3JlYWxsb2MgKHNlbGYtPmZkcywKKyAgICAgICAgICBzaXplb2YgKERCdXNQb2xsRkQpICogKHNlbGYtPm5fYWxsb2NhdGVkICsgUkVBTExPQ19JTkNSRU1FTlQpKTsKKworICAgICAgX2RidXNfdmVyYm9zZSAoImluZmxhdGluZyBzZXQgJXAgZnJvbSAlZCBlbi8lZCByZXMvJWQgYWxsb2MgdG8gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICBzZWxmLCBzZWxmLT5uX2Zkcywgc2VsZi0+bl9yZXNlcnZlZCwgc2VsZi0+bl9hbGxvY2F0ZWQsCisgICAgICAgICAgICAgICAgICAgICBzZWxmLT5uX2FsbG9jYXRlZCArIFJFQUxMT0NfSU5DUkVNRU5UKTsKKworICAgICAgaWYgKG5ld19mZHMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICBzZWxmLT5mZHMgPSBuZXdfZmRzOworICAgICAgc2VsZi0+bl9hbGxvY2F0ZWQgKz0gUkVBTExPQ19JTkNSRU1FTlQ7CisgICAgfQorCisgIF9kYnVzX3ZlcmJvc2UgKCJiZWZvcmUgYWRkaW5nIGZkICUiIERCVVNfUE9MTEFCTEVfRk9STUFUICIgdG8gJXAsICVkIGVuLyVkIHJlcy8lZCBhbGxvY1xuIiwKKyAgICAgICAgICAgICAgICAgX2RidXNfcG9sbGFibGVfcHJpbnRhYmxlIChmZCksIHNlbGYsIHNlbGYtPm5fZmRzLCBzZWxmLT5uX3Jlc2VydmVkLCBzZWxmLT5uX2FsbG9jYXRlZCk7CisgIF9kYnVzX2Fzc2VydCAoc2VsZi0+bl9yZXNlcnZlZCA+PSBzZWxmLT5uX2Zkcyk7CisgIF9kYnVzX2Fzc2VydCAoc2VsZi0+bl9hbGxvY2F0ZWQgPiBzZWxmLT5uX3Jlc2VydmVkKTsKKworICBzZWxmLT5uX3Jlc2VydmVkKys7CisKKyAgaWYgKGVuYWJsZWQpCisgICAgeworICAgICAgc2VsZi0+ZmRzW3NlbGYtPm5fZmRzXS5mZCA9IGZkOworICAgICAgc2VsZi0+ZmRzW3NlbGYtPm5fZmRzXS5ldmVudHMgPSB3YXRjaF9mbGFnc190b19wb2xsX2V2ZW50cyAoZmxhZ3MpOworICAgICAgc2VsZi0+bl9mZHMrKzsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitzb2NrZXRfc2V0X3BvbGxfZW5hYmxlIChEQnVzU29ja2V0U2V0ICpzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICBEQnVzUG9sbGFibGUgICBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgIGZsYWdzKQoreworICBEQnVzU29ja2V0U2V0UG9sbCAqc2VsZiA9IHNvY2tldF9zZXRfcG9sbF9jYXN0IChzZXQpOworICBpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgc2VsZi0+bl9mZHM7IGkrKykKKyAgICB7CisgICAgICBpZiAoX2RidXNfcG9sbGFibGVfZXF1YWxzIChzZWxmLT5mZHNbaV0uZmQsIGZkKSkKKyAgICAgICAgeworICAgICAgICAgIHNlbGYtPmZkc1tpXS5ldmVudHMgPSB3YXRjaF9mbGFnc190b19wb2xsX2V2ZW50cyAoZmxhZ3MpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAvKiB3ZSBhbGxvY2F0ZWQgc3BhY2Ugd2hlbiB0aGUgc29ja2V0IHdhcyBhZGRlZCAqLworICBfZGJ1c19hc3NlcnQgKHNlbGYtPm5fZmRzIDwgc2VsZi0+bl9yZXNlcnZlZCk7CisgIF9kYnVzX2Fzc2VydCAoc2VsZi0+bl9yZXNlcnZlZCA8PSBzZWxmLT5uX2FsbG9jYXRlZCk7CisKKyAgc2VsZi0+ZmRzW3NlbGYtPm5fZmRzXS5mZCA9IGZkOworICBzZWxmLT5mZHNbc2VsZi0+bl9mZHNdLmV2ZW50cyA9IHdhdGNoX2ZsYWdzX3RvX3BvbGxfZXZlbnRzIChmbGFncyk7CisgIHNlbGYtPm5fZmRzKys7Cit9CisKK3N0YXRpYyB2b2lkCitzb2NrZXRfc2V0X3BvbGxfZGlzYWJsZSAoREJ1c1NvY2tldFNldCAqc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNQb2xsYWJsZSAgIGZkKQoreworICBEQnVzU29ja2V0U2V0UG9sbCAqc2VsZiA9IHNvY2tldF9zZXRfcG9sbF9jYXN0IChzZXQpOworICBpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgc2VsZi0+bl9mZHM7IGkrKykKKyAgICB7CisgICAgICBpZiAoX2RidXNfcG9sbGFibGVfZXF1YWxzIChzZWxmLT5mZHNbaV0uZmQsIGZkKSkKKyAgICAgICAgeworICAgICAgICAgIGlmIChpICE9IHNlbGYtPm5fZmRzIC0gMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgc2VsZi0+ZmRzW2ldLmZkID0gc2VsZi0+ZmRzW3NlbGYtPm5fZmRzIC0gMV0uZmQ7CisgICAgICAgICAgICAgIHNlbGYtPmZkc1tpXS5ldmVudHMgPSBzZWxmLT5mZHNbc2VsZi0+bl9mZHMgLSAxXS5ldmVudHM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBzZWxmLT5uX2Zkcy0tOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQKK3NvY2tldF9zZXRfcG9sbF9yZW1vdmUgKERCdXNTb2NrZXRTZXQgKnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgIERCdXNQb2xsYWJsZSAgIGZkKQoreworICBEQnVzU29ja2V0U2V0UG9sbCAqc2VsZiA9IHNvY2tldF9zZXRfcG9sbF9jYXN0IChzZXQpOworCisgIHNvY2tldF9zZXRfcG9sbF9kaXNhYmxlIChzZXQsIGZkKTsKKyAgc2VsZi0+bl9yZXNlcnZlZC0tOworCisgIF9kYnVzX3ZlcmJvc2UgKCJhZnRlciByZW1vdmluZyBmZCAlIiBEQlVTX1BPTExBQkxFX0ZPUk1BVCAiIGZyb20gJXAsICVkIGVuLyVkIHJlcy8lZCBhbGxvY1xuIiwKKyAgICAgICAgICAgICAgICAgX2RidXNfcG9sbGFibGVfcHJpbnRhYmxlIChmZCksIHNlbGYsIHNlbGYtPm5fZmRzLCBzZWxmLT5uX3Jlc2VydmVkLCBzZWxmLT5uX2FsbG9jYXRlZCk7CisgIF9kYnVzX2Fzc2VydCAoc2VsZi0+bl9mZHMgPD0gc2VsZi0+bl9yZXNlcnZlZCk7CisgIF9kYnVzX2Fzc2VydCAoc2VsZi0+bl9yZXNlcnZlZCA8PSBzZWxmLT5uX2FsbG9jYXRlZCk7CisKKyAgaWYgKHNlbGYtPm5fcmVzZXJ2ZWQgKyBNSU5JTVVNX1NJWkUgPCBzZWxmLT5uX2FsbG9jYXRlZCAvIDIpCisgICAgeworICAgICAgLyogT3VyIGFycmF5IGlzIHR3aWNlIGFzIGJpZyBhcyBpdCBuZWVkcyB0byBiZSAtIGRlZmxhdGUgaXQgdW50aWwgaXQncworICAgICAgICogb25seSBzbGlnaHRseSBsYXJnZXIgdGhhbiB0aGUgbnVtYmVyIHJlc2VydmVkLiAqLworICAgICAgREJ1c1BvbGxGRCAqbmV3X2ZkcyA9IGRidXNfcmVhbGxvYyAoc2VsZi0+ZmRzLAorICAgICAgICAgIHNpemVvZiAoREJ1c1BvbGxGRCkgKiAoc2VsZi0+bl9yZXNlcnZlZCArIE1JTklNVU1fU0laRSkpOworCisgICAgICBfZGJ1c192ZXJib3NlICgiYmVmb3JlIGRlZmxhdGluZyAlcCwgJWQgZW4vJWQgcmVzLyVkIGFsbG9jXG4iLAorICAgICAgICAgICAgICAgICAgICAgc2VsZiwgc2VsZi0+bl9mZHMsIHNlbGYtPm5fcmVzZXJ2ZWQsIHNlbGYtPm5fYWxsb2NhdGVkKTsKKworICAgICAgaWYgKF9EQlVTX1VOTElLRUxZIChuZXdfZmRzID09IE5VTEwpKQorICAgICAgICB7CisgICAgICAgICAgLyogV2VpcmQuIE9oIHdlbGwsIG5ldmVyIG1pbmQsIHRoZSB0b28tYmlnIGFycmF5IGlzIHVudG91Y2hlZCAqLworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICBzZWxmLT5mZHMgPSBuZXdfZmRzOworICAgICAgc2VsZi0+bl9hbGxvY2F0ZWQgPSBzZWxmLT5uX3Jlc2VydmVkOworICAgIH0KK30KKworc3RhdGljIHVuc2lnbmVkIGludAord2F0Y2hfZmxhZ3NfZnJvbV9wb2xsX3JldmVudHMgKHNob3J0IHJldmVudHMpCit7CisgIHVuc2lnbmVkIGludCBjb25kaXRpb24gPSAwOworCisgIGlmIChyZXZlbnRzICYgX0RCVVNfUE9MTElOKQorICAgIGNvbmRpdGlvbiB8PSBEQlVTX1dBVENIX1JFQURBQkxFOworICBpZiAocmV2ZW50cyAmIF9EQlVTX1BPTExPVVQpCisgICAgY29uZGl0aW9uIHw9IERCVVNfV0FUQ0hfV1JJVEFCTEU7CisgIGlmIChyZXZlbnRzICYgX0RCVVNfUE9MTEhVUCkKKyAgICBjb25kaXRpb24gfD0gREJVU19XQVRDSF9IQU5HVVA7CisgIGlmIChyZXZlbnRzICYgX0RCVVNfUE9MTEVSUikKKyAgICBjb25kaXRpb24gfD0gREJVU19XQVRDSF9FUlJPUjsKKworICBpZiAoX0RCVVNfVU5MSUtFTFkgKHJldmVudHMgJiBfREJVU19QT0xMTlZBTCkpCisgICAgY29uZGl0aW9uIHw9IF9EQlVTX1dBVENIX05WQUw7CisKKyAgcmV0dXJuIGNvbmRpdGlvbjsKK30KKworLyoqIFRoaXMgaXMgYmFzaWNhbGx5IExpbnV4J3MgZXBvbGxfd2FpdCgyKSBpbXBsZW1lbnRlZCBpbiB0ZXJtcyBvZiBwb2xsKDIpOworICogaXQgcmV0dXJucyByZXN1bHRzIGludG8gYSBjYWxsZXItc3VwcGxpZWQgYnVmZmVyIHNvIHdlIGNhbiBiZSByZWVudHJhbnQuICovCitzdGF0aWMgaW50Citzb2NrZXRfc2V0X3BvbGxfcG9sbCAoREJ1c1NvY2tldFNldCAgICpzZXQsCisgICAgICAgICAgICAgICAgICAgICAgREJ1c1NvY2tldEV2ZW50ICpyZXZlbnRzLAorICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgbWF4X2V2ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgIHRpbWVvdXRfbXMpCit7CisgIERCdXNTb2NrZXRTZXRQb2xsICpzZWxmID0gc29ja2V0X3NldF9wb2xsX2Nhc3QgKHNldCk7CisgIGludCBpOworICBpbnQgbl9ldmVudHM7CisgIGludCBuX3JlYWR5OworCisgIF9kYnVzX2Fzc2VydCAobWF4X2V2ZW50cyA+IDApOworCisgIGZvciAoaSA9IDA7IGkgPCBzZWxmLT5uX2ZkczsgaSsrKQorICAgIHNlbGYtPmZkc1tpXS5yZXZlbnRzID0gMDsKKworICBuX3JlYWR5ID0gX2RidXNfcG9sbCAoc2VsZi0+ZmRzLCBzZWxmLT5uX2ZkcywgdGltZW91dF9tcyk7CisKKyAgaWYgKG5fcmVhZHkgPD0gMCkKKyAgICByZXR1cm4gbl9yZWFkeTsKKworICBuX2V2ZW50cyA9IDA7CisKKyAgZm9yIChpID0gMDsgaSA8IHNlbGYtPm5fZmRzOyBpKyspCisgICAgeworICAgICAgaWYgKHNlbGYtPmZkc1tpXS5yZXZlbnRzICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICByZXZlbnRzW25fZXZlbnRzXS5mZCA9IHNlbGYtPmZkc1tpXS5mZDsKKyAgICAgICAgICByZXZlbnRzW25fZXZlbnRzXS5mbGFncyA9IHdhdGNoX2ZsYWdzX2Zyb21fcG9sbF9yZXZlbnRzIChzZWxmLT5mZHNbaV0ucmV2ZW50cyk7CisKKyAgICAgICAgICBuX2V2ZW50cyArPSAxOworCisgICAgICAgICAgLyogV2UgaWdub3JlIGV2ZW50cyBiZXlvbmQgbWF4X2V2ZW50cyBiZWNhdXNlIHdlIGhhdmUgbm93aGVyZSB0bworICAgICAgICAgICAqIHB1dCB0aGVtLiBfZGJ1c19wb2xsIGlzIGxldmVsLXRyaWdnZXJlZCwgc28gd2UnbGwganVzdCBiZSB0b2xkCisgICAgICAgICAgICogYWJvdXQgdGhlbSBuZXh0IHRpbWUgcm91bmQgdGhlIG1haW4gbG9vcCBhbnl3YXkuICovCisgICAgICAgICAgaWYgKG5fZXZlbnRzID09IG1heF9ldmVudHMpCisgICAgICAgICAgICByZXR1cm4gbl9ldmVudHM7CisgICAgICAgIH0KKyAgICB9CisKKyAgcmV0dXJuIG5fZXZlbnRzOworfQorCitEQnVzU29ja2V0U2V0Q2xhc3MgX2RidXNfc29ja2V0X3NldF9wb2xsX2NsYXNzID0geworICAgIHNvY2tldF9zZXRfcG9sbF9mcmVlLAorICAgIHNvY2tldF9zZXRfcG9sbF9hZGQsCisgICAgc29ja2V0X3NldF9wb2xsX3JlbW92ZSwKKyAgICBzb2NrZXRfc2V0X3BvbGxfZW5hYmxlLAorICAgIHNvY2tldF9zZXRfcG9sbF9kaXNhYmxlLAorICAgIHNvY2tldF9zZXRfcG9sbF9wb2xsCit9OworCisjZW5kaWYgLyogIURPWFlHRU5fU0hPVUxEX1NLSVBfVEhJUyAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLXNvY2tldC1zZXQuYyBiL2RidXMvZGJ1cy1zb2NrZXQtc2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjEwZDYwMAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1zb2NrZXQtc2V0LmMKQEAgLTAsMCArMSw0NyBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKgorICogZGJ1cy1zb2NrZXQtc2V0LmMgLSB1c2VkIHRvIGJvbHQgZmlsZSBkZXNjcmlwdG9ycyBvbnRvIGEgYnVzCisgKgorICogQ29weXJpZ2h0IMKpIDIwMTEgTm9raWEgQ29ycG9yYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLAorICogTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXNvY2tldC1zZXQuaD4KKworREJ1c1NvY2tldFNldCAqCitfZGJ1c19zb2NrZXRfc2V0X25ldyAoaW50IHNpemVfaGludCkKK3sKKyAgREJ1c1NvY2tldFNldCAqcmV0OworCisjaWZkZWYgREJVU19IQVZFX0xJTlVYX0VQT0xMCisgIHJldCA9IF9kYnVzX3NvY2tldF9zZXRfZXBvbGxfbmV3ICgpOworCisgIGlmIChyZXQgIT0gTlVMTCkKKyAgICByZXR1cm4gcmV0OworI2VuZGlmCisKKyAgcmV0ID0gX2RidXNfc29ja2V0X3NldF9wb2xsX25ldyAoc2l6ZV9oaW50KTsKKworICBpZiAocmV0ICE9IE5VTEwpCisgICAgcmV0dXJuIHJldDsKKworICByZXR1cm4gTlVMTDsKK30KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1zb2NrZXQtc2V0LmggYi9kYnVzL2RidXMtc29ja2V0LXNldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjYzI2M2EKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtc29ja2V0LXNldC5oCkBAIC0wLDAgKzEsMTIzIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qCisgKiBkYnVzLXNvY2tldC1zZXQuaCAtIHVzZWQgdG8gYm9sdCBmaWxlIGRlc2NyaXB0b3JzIG9udG8gYSBidXMKKyAqCisgKiBDb3B5cmlnaHQgwqkgMjAxMSBOb2tpYSBDb3Jwb3JhdGlvbgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sCisgKiBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpZm5kZWYgREJVU19TT0NLRVRfU0VUX0gKKyNkZWZpbmUgREJVU19TT0NLRVRfU0VUX0gKKworI2lmbmRlZiBET1hZR0VOX1NIT1VMRF9TS0lQX1RISVMKKworI2luY2x1ZGUgPGRidXMvZGJ1cy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zeXNkZXBzLmg+CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBEQnVzUG9sbGFibGUgZmQ7CisgICAgdW5zaWduZWQgaW50IGZsYWdzOworfSBEQnVzU29ja2V0RXZlbnQ7CisKK3R5cGVkZWYgc3RydWN0IERCdXNTb2NrZXRTZXQgREJ1c1NvY2tldFNldDsKKwordHlwZWRlZiBzdHJ1Y3QgREJ1c1NvY2tldFNldENsYXNzIERCdXNTb2NrZXRTZXRDbGFzczsKK3N0cnVjdCBEQnVzU29ja2V0U2V0Q2xhc3MgeworICAgIHZvaWQgICAgICAgICAgICAoKmZyZWUpICAgICAoREJ1c1NvY2tldFNldCAgICpzZWxmKTsKKyAgICBkYnVzX2Jvb2xfdCAgICAgKCphZGQpICAgICAgKERCdXNTb2NrZXRTZXQgICAqc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNQb2xsYWJsZSAgICAgZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgICAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICBlbmFibGVkKTsKKyAgICB2b2lkICAgICAgICAgICAgKCpyZW1vdmUpICAgKERCdXNTb2NrZXRTZXQgICAqc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNQb2xsYWJsZSAgICAgZmQpOworICAgIHZvaWQgICAgICAgICAgICAoKmVuYWJsZSkgICAoREJ1c1NvY2tldFNldCAgICpzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1BvbGxhYmxlICAgICBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgICAgZmxhZ3MpOworICAgIHZvaWQgICAgICAgICAgICAoKmRpc2FibGUpICAoREJ1c1NvY2tldFNldCAgICpzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1BvbGxhYmxlICAgICBmZCk7CisgICAgaW50ICAgICAgICAgICAgICgqcG9sbCkgICAgIChEQnVzU29ja2V0U2V0ICAgKnNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU29ja2V0RXZlbnQgKnJldmVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgIG1heF9ldmVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgIHRpbWVvdXRfbXMpOworfTsKKworc3RydWN0IERCdXNTb2NrZXRTZXQgeworICAgIERCdXNTb2NrZXRTZXRDbGFzcyAqY2xzOworfTsKKworREJ1c1NvY2tldFNldCAqX2RidXNfc29ja2V0X3NldF9uZXcgICAgICAgICAgIChpbnQgICAgICAgICAgICAgICBzaXplX2hpbnQpOworCitzdGF0aWMgaW5saW5lIHZvaWQKK19kYnVzX3NvY2tldF9zZXRfZnJlZSAoREJ1c1NvY2tldFNldCAqc2VsZikKK3sKKyAgKHNlbGYtPmNscy0+ZnJlZSkgKHNlbGYpOworfQorCitzdGF0aWMgaW5saW5lIGRidXNfYm9vbF90CitfZGJ1c19zb2NrZXRfc2V0X2FkZCAoREJ1c1NvY2tldFNldCAqc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICBEQnVzUG9sbGFibGUgICBmZCwKKyAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICBlbmFibGVkKQoreworICByZXR1cm4gKHNlbGYtPmNscy0+YWRkKSAoc2VsZiwgZmQsIGZsYWdzLCBlbmFibGVkKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitfZGJ1c19zb2NrZXRfc2V0X3JlbW92ZSAoREJ1c1NvY2tldFNldCAqc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzUG9sbGFibGUgICBmZCkKK3sKKyAgKHNlbGYtPmNscy0+cmVtb3ZlKSAoc2VsZiwgZmQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK19kYnVzX3NvY2tldF9zZXRfZW5hYmxlIChEQnVzU29ja2V0U2V0ICpzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNQb2xsYWJsZSAgIGZkLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgIGZsYWdzKQoreworICAoc2VsZi0+Y2xzLT5lbmFibGUpIChzZWxmLCBmZCwgZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK19kYnVzX3NvY2tldF9zZXRfZGlzYWJsZSAoREJ1c1NvY2tldFNldCAqc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1BvbGxhYmxlICAgZmQpCit7CisgIChzZWxmLT5jbHMtPmRpc2FibGUpIChzZWxmLCBmZCk7Cit9CisKKworc3RhdGljIGlubGluZSBpbnQKK19kYnVzX3NvY2tldF9zZXRfcG9sbCAoREJ1c1NvY2tldFNldCAgICAqc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgREJ1c1NvY2tldEV2ZW50ICAqcmV2ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgbWF4X2V2ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgdGltZW91dF9tcykKK3sKKyAgcmV0dXJuIChzZWxmLT5jbHMtPnBvbGwpIChzZWxmLCByZXZlbnRzLCBtYXhfZXZlbnRzLCB0aW1lb3V0X21zKTsKK30KKworLyogY29uY3JldGUgaW1wbGVtZW50YXRpb25zLCBub3QgbmVjZXNzYXJpbHkgYnVpbHQgb24gYWxsIHBsYXRmb3JtcyAqLworCitleHRlcm4gREJ1c1NvY2tldFNldENsYXNzIF9kYnVzX3NvY2tldF9zZXRfcG9sbF9jbGFzczsKK2V4dGVybiBEQnVzU29ja2V0U2V0Q2xhc3MgX2RidXNfc29ja2V0X3NldF9lcG9sbF9jbGFzczsKKworREJ1c1NvY2tldFNldCAqX2RidXNfc29ja2V0X3NldF9wb2xsX25ldyAgKGludCAgc2l6ZV9oaW50KTsKK0RCdXNTb2NrZXRTZXQgKl9kYnVzX3NvY2tldF9zZXRfZXBvbGxfbmV3ICh2b2lkKTsKKworI2VuZGlmIC8qICFET1hZR0VOX1NIT1VMRF9TS0lQX1RISVMgKi8KKyNlbmRpZiAvKiBtdWx0aXBsZS1pbmNsdXNpb24gZ3VhcmQgKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1zb2NrZXRzLXdpbi5oIGIvZGJ1cy9kYnVzLXNvY2tldHMtd2luLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM1ZDY1MwotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1zb2NrZXRzLXdpbi5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1zb2NrZXRzLmggV3JhcHBlcnMgYXJvdW5kIHNvY2tldCBmZWF0dXJlcyAoaW50ZXJuYWwgdG8gRC1CVVMgaW1wbGVtZW50YXRpb24pCisgKiAKKyAqIENvcHlyaWdodCAoQykgMjAwNSBOb3ZlbGwsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBEQlVTX1NPQ0tFVFNfSAorI2RlZmluZSBEQlVTX1NPQ0tFVFNfSAorCisjaWYgZGVmaW5lZChEQlVTX1dJTikgfHwgZGVmaW5lZChEQlVTX1dJTkNFKQorCisKKworI2lmbmRlZiBTVFJJQ1QKKyNkZWZpbmUgU1RSSUNUCisjaW5jbHVkZSA8d2luc29jazIuaD4KKyN1bmRlZiBTVFJJQ1QKKyNlbmRpZgorI2luY2x1ZGUgPHdpbnNvY2syLmg+CisKKyN1bmRlZiBpbnRlcmZhY2UKKworI2lmIEhBVkVfRVJSTk9fSAorI2luY2x1ZGUgPGVycm5vLmg+CisjZW5kaWYKKworI2RlZmluZSBEQlVTX1NPQ0tFVF9BUElfUkVUVVJOU19FUlJPUihuKSAoKG4pID09IFNPQ0tFVF9FUlJPUikKKyNkZWZpbmUgREJVU19TT0NLRVRfU0VUX0VSUk5PKCkgKF9kYnVzX3dpbl9zZXRfZXJybm8gKFdTQUdldExhc3RFcnJvcigpKSkKKworI2Vsc2UKKworI2Vycm9yICJkYnVzLXNvY2tldHMtd2luLmggc2hvdWxkIG5vdCBiZSBpbmNsdWRlZCBvbiBub24tV2luZG93cyIKKworI2VuZGlmIC8qICFXaW4zMiAqLworCisjZW5kaWYgLyogREJVU19TT0NLRVRTX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1zcGF3bi10ZXN0LmMgYi9kYnVzL2RidXMtc3Bhd24tdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkOWI2ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtc3Bhd24tdGVzdC5jCkBAIC0wLDAgKzEsMjg4IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtc3Bhd24tdGVzdC5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzLCAyMDA0ICBSZWQgSGF0LCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgQ29kZUZhY3RvcnkgQUIKKyAqIENvcHlyaWdodCAoQykgMjAwNSBOb3ZlbGwsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaW5jbHVkZSA8Y29uZmlnLmg+CisKKworI2luY2x1ZGUgImRidXMtc3Bhd24uaCIKKyNpbmNsdWRlICJkYnVzLXN5c2RlcHMuaCIKKyNpbmNsdWRlICJkYnVzLXRlc3QuaCIKKworc3RhdGljIGNoYXIgKgorZ2V0X3Rlc3RfZXhlYyAoY29uc3QgY2hhciAqZXhlLAorICAgICAgICAgICAgICAgREJ1c1N0cmluZyAqc2NyYXRjaF9zcGFjZSkKK3sKKyAgY29uc3QgY2hhciAqZGJ1c190ZXN0X2V4ZWM7CisKKyAgZGJ1c190ZXN0X2V4ZWMgPSBfZGJ1c19nZXRlbnYgKCJEQlVTX1RFU1RfRVhFQyIpOworCisgIGlmIChkYnVzX3Rlc3RfZXhlYyA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKHNjcmF0Y2hfc3BhY2UpKQorICAgIHJldHVybiBOVUxMOworCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9wcmludGYgKHNjcmF0Y2hfc3BhY2UsICIlcy8lcyVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c190ZXN0X2V4ZWMsIGV4ZSwgREJVU19FWEVFWFQpKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlIChzY3JhdGNoX3NwYWNlKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICByZXR1cm4gX2RidXNfc3RyaW5nX2dldF9kYXRhIChzY3JhdGNoX3NwYWNlKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitjaGVja19zcGF3bl9ub25leGlzdGVudCAodm9pZCAqZGF0YSkKK3sKKyAgc3RhdGljIGNvbnN0IGNoYXIgYXJnX2RvZXNfbm90X2V4aXN0W10gPSAiL3RoaXMvZG9lcy9ub3QvZXhpc3QvMzI1NDJzZGdhZmdhZmRnIjsKKworICBjb25zdCBjaGFyICphcmd2WzRdID0geyBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMIH07CisgIERCdXNCYWJ5c2l0dGVyICpzaXR0ZXIgPSBOVUxMOworICBEQnVzRXJyb3IgZXJyb3IgPSBEQlVTX0VSUk9SX0lOSVQ7CisKKyAgLyoqKiBUZXN0IGxhdW5jaGluZyBub25leGlzdGVudCBiaW5hcnkgKi8KKworICBhcmd2WzBdID0gYXJnX2RvZXNfbm90X2V4aXN0OworICBpZiAoX2RidXNfc3Bhd25fYXN5bmNfd2l0aF9iYWJ5c2l0dGVyICgmc2l0dGVyLCAic3Bhd25fbm9uZXhpc3RlbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqIGNvbnN0ICopIGFyZ3YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIERCVVNfU1BBV05fTk9ORSwgTlVMTCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKSkKKyAgICB7CisgICAgICBfZGJ1c19iYWJ5c2l0dGVyX2Jsb2NrX2Zvcl9jaGlsZF9leGl0IChzaXR0ZXIpOworICAgICAgX2RidXNfYmFieXNpdHRlcl9zZXRfY2hpbGRfZXhpdF9lcnJvciAoc2l0dGVyLCAmZXJyb3IpOworICAgIH0KKworICBpZiAoc2l0dGVyKQorICAgIF9kYnVzX2JhYnlzaXR0ZXJfdW5yZWYgKHNpdHRlcik7CisKKyAgaWYgKCFkYnVzX2Vycm9yX2lzX3NldCAoJmVycm9yKSkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiRGlkIG5vdCBnZXQgYW4gZXJyb3IgbGF1bmNoaW5nIG5vbmV4aXN0ZW50IGV4ZWN1dGFibGUiKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCEoZGJ1c19lcnJvcl9oYXNfbmFtZSAoJmVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSkgfHwKKyAgICAgICAgZGJ1c19lcnJvcl9oYXNfbmFtZSAoJmVycm9yLCBEQlVTX0VSUk9SX1NQQVdOX0VYRUNfRkFJTEVEKSkpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIk5vdCBleHBlY3RpbmcgZXJyb3Igd2hlbiBsYXVuY2hpbmcgbm9uZXhpc3RlbnQgZXhlY3V0YWJsZTogJXM6ICVzIiwKKyAgICAgICAgICAgICAgICAgIGVycm9yLm5hbWUsIGVycm9yLm1lc3NhZ2UpOworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorY2hlY2tfc3Bhd25fc2VnZmF1bHQgKHZvaWQgKmRhdGEpCit7CisgIGNoYXIgKmFyZ3ZbNF0gPSB7IE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKyAgREJ1c0JhYnlzaXR0ZXIgKnNpdHRlciA9IE5VTEw7CisgIERCdXNFcnJvciBlcnJvciA9IERCVVNfRVJST1JfSU5JVDsKKyAgREJ1c1N0cmluZyBhcmd2MDsKKworICAvKioqIFRlc3QgbGF1bmNoaW5nIHNlZ2ZhdWx0IGJpbmFyeSAqLworCisgIGFyZ3ZbMF0gPSBnZXRfdGVzdF9leGVjICgidGVzdC1zZWdmYXVsdCIsICZhcmd2MCk7CisKKyAgaWYgKGFyZ3ZbMF0gPT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBPT00gd2FzIHNpbXVsYXRlZCBvciBEQlVTX1RFU1RfRVhFQyB3YXMgdW5zZXQ7IGVpdGhlciBpcyBPSyAqLworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGlmIChfZGJ1c19zcGF3bl9hc3luY193aXRoX2JhYnlzaXR0ZXIgKCZzaXR0ZXIsICJzcGF3bl9zZWdmYXVsdCIsIGFyZ3YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIERCVVNfU1BBV05fTk9ORSwgTlVMTCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKSkKKyAgICB7CisgICAgICBfZGJ1c19iYWJ5c2l0dGVyX2Jsb2NrX2Zvcl9jaGlsZF9leGl0IChzaXR0ZXIpOworICAgICAgX2RidXNfYmFieXNpdHRlcl9zZXRfY2hpbGRfZXhpdF9lcnJvciAoc2l0dGVyLCAmZXJyb3IpOworICAgIH0KKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmFyZ3YwKTsKKworICBpZiAoc2l0dGVyKQorICAgIF9kYnVzX2JhYnlzaXR0ZXJfdW5yZWYgKHNpdHRlcik7CisKKyAgaWYgKCFkYnVzX2Vycm9yX2lzX3NldCAoJmVycm9yKSkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiRGlkIG5vdCBnZXQgYW4gZXJyb3IgbGF1bmNoaW5nIHNlZ2ZhdWx0aW5nIGJpbmFyeSIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIShkYnVzX2Vycm9yX2hhc19uYW1lICgmZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZKSB8fAorI2lmZGVmIERCVVNfV0lOCisgICAgICAgIGRidXNfZXJyb3JfaGFzX25hbWUgKCZlcnJvciwgREJVU19FUlJPUl9TUEFXTl9DSElMRF9FWElURUQpKSkKKyNlbHNlCisgICAgICAgIGRidXNfZXJyb3JfaGFzX25hbWUgKCZlcnJvciwgREJVU19FUlJPUl9TUEFXTl9DSElMRF9TSUdOQUxFRCkpKQorI2VuZGlmCisgICAgeworICAgICAgX2RidXNfd2FybiAoIk5vdCBleHBlY3RpbmcgZXJyb3Igd2hlbiBsYXVuY2hpbmcgc2VnZmF1bHRpbmcgZXhlY3V0YWJsZTogJXM6ICVzIiwKKyAgICAgICAgICAgICAgICAgIGVycm9yLm5hbWUsIGVycm9yLm1lc3NhZ2UpOworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorY2hlY2tfc3Bhd25fZXhpdCAodm9pZCAqZGF0YSkKK3sKKyAgY2hhciAqYXJndls0XSA9IHsgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCB9OworICBEQnVzQmFieXNpdHRlciAqc2l0dGVyID0gTlVMTDsKKyAgREJ1c0Vycm9yIGVycm9yID0gREJVU19FUlJPUl9JTklUOworICBEQnVzU3RyaW5nIGFyZ3YwOworCisgIC8qKiogVGVzdCBsYXVuY2hpbmcgZXhpdCBmYWlsdXJlIGJpbmFyeSAqLworCisgIGFyZ3ZbMF0gPSBnZXRfdGVzdF9leGVjICgidGVzdC1leGl0IiwgJmFyZ3YwKTsKKworICBpZiAoYXJndlswXSA9PSBOVUxMKQorICAgIHsKKyAgICAgIC8qIE9PTSB3YXMgc2ltdWxhdGVkIG9yIERCVVNfVEVTVF9FWEVDIHdhcyB1bnNldDsgZWl0aGVyIGlzIE9LICovCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgaWYgKF9kYnVzX3NwYXduX2FzeW5jX3dpdGhfYmFieXNpdHRlciAoJnNpdHRlciwgInNwYXduX2V4aXQiLCBhcmd2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBEQlVTX1NQQVdOX05PTkUsIE5VTEwsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcikpCisgICAgeworICAgICAgX2RidXNfYmFieXNpdHRlcl9ibG9ja19mb3JfY2hpbGRfZXhpdCAoc2l0dGVyKTsKKyAgICAgIF9kYnVzX2JhYnlzaXR0ZXJfc2V0X2NoaWxkX2V4aXRfZXJyb3IgKHNpdHRlciwgJmVycm9yKTsKKyAgICB9CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZhcmd2MCk7CisKKyAgaWYgKHNpdHRlcikKKyAgICBfZGJ1c19iYWJ5c2l0dGVyX3VucmVmIChzaXR0ZXIpOworCisgIGlmICghZGJ1c19lcnJvcl9pc19zZXQgKCZlcnJvcikpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkRpZCBub3QgZ2V0IGFuIGVycm9yIGxhdW5jaGluZyBiaW5hcnkgdGhhdCBleGl0ZWQgd2l0aCBmYWlsdXJlIGNvZGUiKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCEoZGJ1c19lcnJvcl9oYXNfbmFtZSAoJmVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSkgfHwKKyAgICAgICAgZGJ1c19lcnJvcl9oYXNfbmFtZSAoJmVycm9yLCBEQlVTX0VSUk9SX1NQQVdOX0NISUxEX0VYSVRFRCkpKQorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJOb3QgZXhwZWN0aW5nIGVycm9yIHdoZW4gbGF1bmNoaW5nIGV4aXRpbmcgZXhlY3V0YWJsZTogJXM6ICVzIiwKKyAgICAgICAgICAgICAgICAgIGVycm9yLm5hbWUsIGVycm9yLm1lc3NhZ2UpOworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorY2hlY2tfc3Bhd25fYW5kX2tpbGwgKHZvaWQgKmRhdGEpCit7CisgIGNoYXIgKmFyZ3ZbNF0gPSB7IE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKyAgREJ1c0JhYnlzaXR0ZXIgKnNpdHRlciA9IE5VTEw7CisgIERCdXNFcnJvciBlcnJvciA9IERCVVNfRVJST1JfSU5JVDsKKyAgREJ1c1N0cmluZyBhcmd2MDsKKworICAvKioqIFRlc3QgbGF1bmNoaW5nIHNsZWVwaW5nIGJpbmFyeSB0aGVuIGtpbGxpbmcgaXQgKi8KKworICBhcmd2WzBdID0gZ2V0X3Rlc3RfZXhlYyAoInRlc3Qtc2xlZXAtZm9yZXZlciIsICZhcmd2MCk7CisKKyAgaWYgKGFyZ3ZbMF0gPT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBPT00gd2FzIHNpbXVsYXRlZCBvciBEQlVTX1RFU1RfRVhFQyB3YXMgdW5zZXQ7IGVpdGhlciBpcyBPSyAqLworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGlmIChfZGJ1c19zcGF3bl9hc3luY193aXRoX2JhYnlzaXR0ZXIgKCZzaXR0ZXIsICJzcGF3bl9hbmRfa2lsbCIsIGFyZ3YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIERCVVNfU1BBV05fTk9ORSwgTlVMTCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKSkKKyAgICB7CisgICAgICBfZGJ1c19iYWJ5c2l0dGVyX2tpbGxfY2hpbGQgKHNpdHRlcik7CisKKyAgICAgIF9kYnVzX2JhYnlzaXR0ZXJfYmxvY2tfZm9yX2NoaWxkX2V4aXQgKHNpdHRlcik7CisKKyAgICAgIF9kYnVzX2JhYnlzaXR0ZXJfc2V0X2NoaWxkX2V4aXRfZXJyb3IgKHNpdHRlciwgJmVycm9yKTsKKyAgICB9CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZhcmd2MCk7CisKKyAgaWYgKHNpdHRlcikKKyAgICBfZGJ1c19iYWJ5c2l0dGVyX3VucmVmIChzaXR0ZXIpOworCisgIGlmICghZGJ1c19lcnJvcl9pc19zZXQgKCZlcnJvcikpCisgICAgeworICAgICAgX2RidXNfd2FybiAoIkRpZCBub3QgZ2V0IGFuIGVycm9yIGFmdGVyIGtpbGxpbmcgc3Bhd25lZCBiaW5hcnkiKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCEoZGJ1c19lcnJvcl9oYXNfbmFtZSAoJmVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSkgfHwKKyNpZmRlZiBEQlVTX1dJTgorICAgICAgICBkYnVzX2Vycm9yX2hhc19uYW1lICgmZXJyb3IsIERCVVNfRVJST1JfU1BBV05fQ0hJTERfRVhJVEVEKSkpCisjZWxzZQorICAgICAgICBkYnVzX2Vycm9yX2hhc19uYW1lICgmZXJyb3IsIERCVVNfRVJST1JfU1BBV05fQ0hJTERfU0lHTkFMRUQpKSkKKyNlbmRpZgorICAgIHsKKyAgICAgIF9kYnVzX3dhcm4gKCJOb3QgZXhwZWN0aW5nIGVycm9yIHdoZW4ga2lsbGluZyBleGVjdXRhYmxlOiAlczogJXMiLAorICAgICAgICAgICAgICAgICAgZXJyb3IubmFtZSwgZXJyb3IubWVzc2FnZSk7CisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKworICByZXR1cm4gVFJVRTsKK30KKworZGJ1c19ib29sX3QKK19kYnVzX3NwYXduX3Rlc3QgKGNvbnN0IGNoYXIgKnRlc3RfZGF0YV9kaXIpCit7CisgIGlmICghX2RidXNfdGVzdF9vb21faGFuZGxpbmcgKCJzcGF3bl9ub25leGlzdGVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX3NwYXduX25vbmV4aXN0ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFfZGJ1c190ZXN0X29vbV9oYW5kbGluZyAoInNwYXduX3NlZ2ZhdWx0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tfc3Bhd25fc2VnZmF1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIV9kYnVzX3Rlc3Rfb29tX2hhbmRsaW5nICgic3Bhd25fZXhpdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX3NwYXduX2V4aXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIV9kYnVzX3Rlc3Rfb29tX2hhbmRsaW5nICgic3Bhd25fYW5kX2tpbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja19zcGF3bl9hbmRfa2lsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJldHVybiBUUlVFOworfQpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLXNwYXduLXdpbi5jIGIvZGJ1cy9kYnVzLXNwYXduLXdpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjNWJmYzMKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtc3Bhd24td2luLmMKQEAgLTAsMCArMSw3NzMgQEAKKyNpbmNsdWRlIDxjb25maWcuaD4KKworLy8jZGVmaW5lIFNQQVdOX0RFQlVHCisKKyNpZiAhZGVmaW5lZChTUEFXTl9ERUJVRykgfHwgZGVmaW5lZChfTVNDX1ZFUikKKyNkZWZpbmUgUElORygpCisjZWxzZQorI2RlZmluZSBQSU5HKCkgZnByaW50ZiAoc3RkZXJyLCAiJXM6JXM6JWRcbiIsIF9fRklMRV9fLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsgZmZsdXNoIChzdGRlcnIpCisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1zcGF3bi13aW4zMi5jIFdyYXBwZXIgYXJvdW5kIGdfc3Bhd24KKyAqIAorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzLCAyMDA0ICBSZWQgSGF0LCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgQ29kZUZhY3RvcnkgQUIKKyAqIENvcHlyaWdodCAoQykgMjAwNSBOb3ZlbGwsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKyNpbmNsdWRlICJkYnVzLXNwYXduLmgiCisjaW5jbHVkZSAiZGJ1cy1zeXNkZXBzLmgiCisjaW5jbHVkZSAiZGJ1cy1zeXNkZXBzLXdpbi5oIgorI2luY2x1ZGUgImRidXMtaW50ZXJuYWxzLmgiCisjaW5jbHVkZSAiZGJ1cy10ZXN0LmgiCisjaW5jbHVkZSAiZGJ1cy1wcm90b2NvbC5oIgorCisjZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4KKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisvLyNkZWZpbmUgU1RSSUNUCisvLyNpbmNsdWRlIDx3aW5kb3dzLmg+CisvLyN1bmRlZiBTVFJJQ1QKKyNpbmNsdWRlIDx3aW5zb2NrMi5oPgorI3VuZGVmIGludGVyZmFjZQorCisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpZm5kZWYgREJVU19XSU5DRQorI2luY2x1ZGUgPHByb2Nlc3MuaD4KKyNlbmRpZgorCisvKioKKyAqIEJhYnlzaXR0ZXIgaW1wbGVtZW50YXRpb24gZGV0YWlscworICovCitzdHJ1Y3QgREJ1c0JhYnlzaXR0ZXIKKyAgeworICAgIERCdXNBdG9taWMgcmVmY291bnQ7CisKKyAgICBIQU5ETEUgc3RhcnRfc3luY19ldmVudDsKKworICAgIGNoYXIgKmxvZ19uYW1lOworCisgICAgaW50IGFyZ2M7CisgICAgY2hhciAqKmFyZ3Y7CisgICAgY2hhciAqKmVudnA7CisKKyAgICBIQU5ETEUgdGhyZWFkX2hhbmRsZTsKKyAgICBIQU5ETEUgY2hpbGRfaGFuZGxlOworICAgIERCdXNTb2NrZXQgc29ja2V0X3RvX2JhYnlzaXR0ZXI7CS8qIENvbm5lY3Rpb24gdG8gdGhlIGJhYnlzaXR0ZXIgdGhyZWFkICovCisgICAgREJ1c1NvY2tldCBzb2NrZXRfdG9fbWFpbjsKKworICAgIERCdXNXYXRjaExpc3QgKndhdGNoZXM7CisgICAgREJ1c1dhdGNoICpzaXR0ZXJfd2F0Y2g7CisgICAgREJ1c0JhYnlzaXR0ZXJGaW5pc2hlZEZ1bmMgZmluaXNoZWRfY2I7CisgICAgdm9pZCAqZmluaXNoZWRfZGF0YTsKKworICAgIGRidXNfYm9vbF90IGhhdmVfc3Bhd25fZXJybm87CisgICAgaW50IHNwYXduX2Vycm5vOworICAgIGRidXNfYm9vbF90IGhhdmVfY2hpbGRfc3RhdHVzOworICAgIGludCBjaGlsZF9zdGF0dXM7CisgIH07CisKK3N0YXRpYyB2b2lkCitfZGJ1c19iYWJ5c2l0dGVyX3RyYWNlX3JlZiAoREJ1c0JhYnlzaXR0ZXIgKnNpdHRlciwKKyAgICBpbnQgb2xkX3JlZmNvdW50LAorICAgIGludCBuZXdfcmVmY291bnQsCisgICAgY29uc3QgY2hhciAqd2h5KQoreworI2lmZGVmIERCVVNfRU5BQkxFX1ZFUkJPU0VfTU9ERQorICBzdGF0aWMgaW50IGVuYWJsZWQgPSAtMTsKKworICBfZGJ1c190cmFjZV9yZWYgKCJEQnVzQmFieXNpdHRlciIsIHNpdHRlciwgb2xkX3JlZmNvdW50LCBuZXdfcmVmY291bnQsIHdoeSwKKyAgICAgICJEQlVTX0JBQllTSVRURVJfVFJBQ0UiLCAmZW5hYmxlZCk7CisjZW5kaWYKK30KKworc3RhdGljIERCdXNCYWJ5c2l0dGVyKgorX2RidXNfYmFieXNpdHRlcl9uZXcgKHZvaWQpCit7CisgIERCdXNCYWJ5c2l0dGVyICpzaXR0ZXI7CisgIGRidXNfaW50MzJfdCBvbGRfcmVmY291bnQ7CisKKyAgc2l0dGVyID0gZGJ1c19uZXcwIChEQnVzQmFieXNpdHRlciwgMSk7CisgIGlmIChzaXR0ZXIgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBvbGRfcmVmY291bnQgPSBfZGJ1c19hdG9taWNfaW5jICgmc2l0dGVyLT5yZWZjb3VudCk7CisKKyAgX2RidXNfYmFieXNpdHRlcl90cmFjZV9yZWYgKHNpdHRlciwgb2xkX3JlZmNvdW50LCBvbGRfcmVmY291bnQrMSwgX19GVU5DVElPTl9fKTsKKworICBzaXR0ZXItPnN0YXJ0X3N5bmNfZXZlbnQgPSBDcmVhdGVFdmVudCAoTlVMTCwgRkFMU0UsIEZBTFNFLCBOVUxMKTsKKyAgaWYgKHNpdHRlci0+c3RhcnRfc3luY19ldmVudCA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX2JhYnlzaXR0ZXJfdW5yZWYgKHNpdHRlcik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgc2l0dGVyLT5jaGlsZF9oYW5kbGUgPSBOVUxMOworCisgIHNpdHRlci0+c29ja2V0X3RvX2JhYnlzaXR0ZXIgPSBzaXR0ZXItPnNvY2tldF90b19tYWluID0gX2RidXNfc29ja2V0X2dldF9pbnZhbGlkICgpOworCisgIHNpdHRlci0+YXJnYyA9IDA7CisgIHNpdHRlci0+YXJndiA9IE5VTEw7CisgIHNpdHRlci0+ZW52cCA9IE5VTEw7CisKKyAgc2l0dGVyLT53YXRjaGVzID0gX2RidXNfd2F0Y2hfbGlzdF9uZXcgKCk7CisgIGlmIChzaXR0ZXItPndhdGNoZXMgPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c19iYWJ5c2l0dGVyX3VucmVmIChzaXR0ZXIpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIHNpdHRlci0+aGF2ZV9zcGF3bl9lcnJubyA9IEZBTFNFOworICBzaXR0ZXItPmhhdmVfY2hpbGRfc3RhdHVzID0gRkFMU0U7CisKKyAgcmV0dXJuIHNpdHRlcjsKK30KKworLyoqCisgKiBJbmNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudCBvbiB0aGUgYmFieXNpdHRlciBvYmplY3QuCisgKgorICogQHBhcmFtIHNpdHRlciB0aGUgYmFieXNpdHRlcgorICogQHJldHVybnMgdGhlIGJhYnlzaXR0ZXIKKyAqLworREJ1c0JhYnlzaXR0ZXIgKgorX2RidXNfYmFieXNpdHRlcl9yZWYgKERCdXNCYWJ5c2l0dGVyICpzaXR0ZXIpCit7CisgIGRidXNfaW50MzJfdCBvbGRfcmVmY291bnQ7CisgIFBJTkcoKTsKKyAgX2RidXNfYXNzZXJ0IChzaXR0ZXIgIT0gTlVMTCk7CisKKyAgb2xkX3JlZmNvdW50ID0gX2RidXNfYXRvbWljX2luYyAoJnNpdHRlci0+cmVmY291bnQpOworICBfZGJ1c19hc3NlcnQgKG9sZF9yZWZjb3VudCA+IDApOworICBfZGJ1c19iYWJ5c2l0dGVyX3RyYWNlX3JlZiAoc2l0dGVyLCBvbGRfcmVmY291bnQsIG9sZF9yZWZjb3VudCsxLCBfX0ZVTkNUSU9OX18pOworCisgIHJldHVybiBzaXR0ZXI7Cit9CisKK3N0YXRpYyB2b2lkCitjbG9zZV9zb2NrZXRfdG9fYmFieXNpdHRlciAoREJ1c0JhYnlzaXR0ZXIgKnNpdHRlcikKK3sKKyAgX2RidXNfdmVyYm9zZSAoIkNsb3NpbmcgYmFieXNpdHRlclxuIik7CisKKyAgaWYgKHNpdHRlci0+c2l0dGVyX3dhdGNoICE9IE5VTEwpCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0IChzaXR0ZXItPndhdGNoZXMgIT0gTlVMTCk7CisgICAgICBfZGJ1c193YXRjaF9saXN0X3JlbW92ZV93YXRjaCAoc2l0dGVyLT53YXRjaGVzLCAgc2l0dGVyLT5zaXR0ZXJfd2F0Y2gpOworICAgICAgX2RidXNfd2F0Y2hfaW52YWxpZGF0ZSAoc2l0dGVyLT5zaXR0ZXJfd2F0Y2gpOworICAgICAgX2RidXNfd2F0Y2hfdW5yZWYgKHNpdHRlci0+c2l0dGVyX3dhdGNoKTsKKyAgICAgIHNpdHRlci0+c2l0dGVyX3dhdGNoID0gTlVMTDsKKyAgICB9CisKKyAgaWYgKHNpdHRlci0+c29ja2V0X3RvX2JhYnlzaXR0ZXIuc29jayAhPSBJTlZBTElEX1NPQ0tFVCkKKyAgICB7CisgICAgICBfZGJ1c19jbG9zZV9zb2NrZXQgKHNpdHRlci0+c29ja2V0X3RvX2JhYnlzaXR0ZXIsIE5VTEwpOworICAgICAgc2l0dGVyLT5zb2NrZXRfdG9fYmFieXNpdHRlci5zb2NrID0gSU5WQUxJRF9TT0NLRVQ7CisgICAgfQorfQorCisvKioKKyAqIERlY3JlbWVudCB0aGUgcmVmZXJlbmNlIGNvdW50IG9uIHRoZSBiYWJ5c2l0dGVyIG9iamVjdC4KKyAqCisgKiBAcGFyYW0gc2l0dGVyIHRoZSBiYWJ5c2l0dGVyCisgKi8KK3ZvaWQKK19kYnVzX2JhYnlzaXR0ZXJfdW5yZWYgKERCdXNCYWJ5c2l0dGVyICpzaXR0ZXIpCit7CisgIGludCBpOworICBkYnVzX2ludDMyX3Qgb2xkX3JlZmNvdW50OworCisgIFBJTkcoKTsKKyAgX2RidXNfYXNzZXJ0IChzaXR0ZXIgIT0gTlVMTCk7CisKKyAgb2xkX3JlZmNvdW50ID0gX2RidXNfYXRvbWljX2RlYyAoJnNpdHRlci0+cmVmY291bnQpOworICBfZGJ1c19hc3NlcnQgKG9sZF9yZWZjb3VudCA+IDApOworICBfZGJ1c19iYWJ5c2l0dGVyX3RyYWNlX3JlZiAoc2l0dGVyLCBvbGRfcmVmY291bnQsIG9sZF9yZWZjb3VudC0xLCBfX0ZVTkNUSU9OX18pOworCisgIGlmIChvbGRfcmVmY291bnQgPT0gMSkKKyAgICB7CisgICAgICBjbG9zZV9zb2NrZXRfdG9fYmFieXNpdHRlciAoc2l0dGVyKTsKKworICAgICAgaWYgKHNpdHRlci0+c29ja2V0X3RvX21haW4uc29jayAhPSBJTlZBTElEX1NPQ0tFVCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX2Nsb3NlX3NvY2tldCAoc2l0dGVyLT5zb2NrZXRfdG9fbWFpbiwgTlVMTCk7CisgICAgICAgICAgc2l0dGVyLT5zb2NrZXRfdG9fbWFpbi5zb2NrID0gSU5WQUxJRF9TT0NLRVQ7CisgICAgICAgIH0KKworICAgICAgUElORygpOworICAgICAgaWYgKHNpdHRlci0+YXJndiAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpdHRlci0+YXJnYzsgaSsrKQorICAgICAgICAgICAgaWYgKHNpdHRlci0+YXJndltpXSAhPSBOVUxMKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGJ1c19mcmVlIChzaXR0ZXItPmFyZ3ZbaV0pOworICAgICAgICAgICAgICAgIHNpdHRlci0+YXJndltpXSA9IE5VTEw7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICBkYnVzX2ZyZWUgKHNpdHRlci0+YXJndik7CisgICAgICAgICAgc2l0dGVyLT5hcmd2ID0gTlVMTDsKKyAgICAgICAgfQorCisgICAgICBpZiAoc2l0dGVyLT5lbnZwICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBjaGFyICoqZSA9IHNpdHRlci0+ZW52cDsKKworICAgICAgICAgIHdoaWxlICgqZSkKKyAgICAgICAgICAgIGRidXNfZnJlZSAoKmUrKyk7CisgICAgICAgICAgZGJ1c19mcmVlIChzaXR0ZXItPmVudnApOworICAgICAgICAgIHNpdHRlci0+ZW52cCA9IE5VTEw7CisgICAgICAgIH0KKworICAgICAgaWYgKHNpdHRlci0+Y2hpbGRfaGFuZGxlICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBDbG9zZUhhbmRsZSAoc2l0dGVyLT5jaGlsZF9oYW5kbGUpOworICAgICAgICAgIHNpdHRlci0+Y2hpbGRfaGFuZGxlID0gTlVMTDsKKyAgICAgICAgfQorCisgICAgICBpZiAoc2l0dGVyLT5zaXR0ZXJfd2F0Y2gpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXRjaF9pbnZhbGlkYXRlIChzaXR0ZXItPnNpdHRlcl93YXRjaCk7CisgICAgICAgICAgX2RidXNfd2F0Y2hfdW5yZWYgKHNpdHRlci0+c2l0dGVyX3dhdGNoKTsKKyAgICAgICAgICBzaXR0ZXItPnNpdHRlcl93YXRjaCA9IE5VTEw7CisgICAgICAgIH0KKworICAgICAgaWYgKHNpdHRlci0+d2F0Y2hlcykKKyAgICAgICAgX2RidXNfd2F0Y2hfbGlzdF9mcmVlIChzaXR0ZXItPndhdGNoZXMpOworCisgICAgICBpZiAoc2l0dGVyLT5zdGFydF9zeW5jX2V2ZW50ICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBQSU5HKCk7CisgICAgICAgICAgQ2xvc2VIYW5kbGUgKHNpdHRlci0+c3RhcnRfc3luY19ldmVudCk7CisgICAgICAgICAgc2l0dGVyLT5zdGFydF9zeW5jX2V2ZW50ID0gTlVMTDsKKyAgICAgICAgfQorCisgICAgICBpZiAoc2l0dGVyLT50aHJlYWRfaGFuZGxlKQorICAgICAgICB7CisgICAgICAgICAgQ2xvc2VIYW5kbGUgKHNpdHRlci0+dGhyZWFkX2hhbmRsZSk7CisgICAgICAgICAgc2l0dGVyLT50aHJlYWRfaGFuZGxlID0gTlVMTDsKKyAgICAgICAgfQorCisgICAgICBkYnVzX2ZyZWUgKHNpdHRlci0+bG9nX25hbWUpOworCisgICAgICBkYnVzX2ZyZWUgKHNpdHRlcik7CisgICAgfQorfQorCit2b2lkCitfZGJ1c19iYWJ5c2l0dGVyX2tpbGxfY2hpbGQgKERCdXNCYWJ5c2l0dGVyICpzaXR0ZXIpCit7CisgIFBJTkcoKTsKKyAgaWYgKHNpdHRlci0+Y2hpbGRfaGFuZGxlID09IE5VTEwpCisgICAgcmV0dXJuOyAvKiBjaGlsZCBpcyBhbHJlYWR5IGRlYWQsIG9yIHdlJ3JlIHNvIGhvc2VkIHdlJ2xsIG5ldmVyIHJlY292ZXIgKi8KKworICBQSU5HKCk7CisgIFRlcm1pbmF0ZVByb2Nlc3MgKHNpdHRlci0+Y2hpbGRfaGFuZGxlLCAxMjM0NSk7Cit9CisKKy8qKgorICogQ2hlY2tzIHdoZXRoZXIgdGhlIGNoaWxkIGhhcyBleGl0ZWQsIHdpdGhvdXQgYmxvY2tpbmcuCisgKgorICogQHBhcmFtIHNpdHRlciB0aGUgYmFieXNpdHRlcgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfYmFieXNpdHRlcl9nZXRfY2hpbGRfZXhpdGVkIChEQnVzQmFieXNpdHRlciAqc2l0dGVyKQoreworICBQSU5HKCk7CisgIHJldHVybiAoc2l0dGVyLT5jaGlsZF9oYW5kbGUgPT0gTlVMTCk7Cit9CisKKy8qKgorICogR2V0cyB0aGUgZXhpdCBzdGF0dXMgb2YgdGhlIGNoaWxkLiBXZSBkbyB0aGlzIHNvIGltcGxlbWVudGF0aW9uIHNwZWNpZmljCisgKiBkZXRhaWwgaXMgbm90IGNsdXR0ZXJpbmcgdXAgZGJ1cywgZm9yIGV4YW1wbGUgdGhlIHN5c3RlbSBsYXVuY2hlciBjb2RlLgorICogVGhpcyBjYW4gb25seSBiZSBjYWxsZWQgaWYgdGhlIGNoaWxkIGhhcyBleGl0ZWQsIGkuZS4gY2FsbAorICogX2RidXNfYmFieXNpdHRlcl9nZXRfY2hpbGRfZXhpdGVkKCkuIEl0IHJldHVybnMgRkFMU0UgaWYgdGhlIGNoaWxkCisgKiBkaWQgbm90IHJldHVybiBhIHN0YXR1cyBjb2RlLCBlLmcuIGJlY2F1c2UgdGhlIGNoaWxkIHdhcyBzaWduYWxlZAorICogb3Igd2UgZmFpbGVkIHRvIGV2ZXIgbGF1bmNoIHRoZSBjaGlsZCBpbiB0aGUgZmlyc3QgcGxhY2UuCisgKgorICogQHBhcmFtIHNpdHRlciB0aGUgYmFieXNpdHRlcgorICogQHBhcmFtIHN0YXR1cyB0aGUgcmV0dXJuZWQgc3RhdHVzIGNvZGUKKyAqIEByZXR1cm5zICNGQUxTRSBvbiBmYWlsdXJlCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19iYWJ5c2l0dGVyX2dldF9jaGlsZF9leGl0X3N0YXR1cyAoREJ1c0JhYnlzaXR0ZXIgKnNpdHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAqc3RhdHVzKQoreworICBpZiAoIV9kYnVzX2JhYnlzaXR0ZXJfZ2V0X2NoaWxkX2V4aXRlZCAoc2l0dGVyKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJDaGlsZCBoYXMgbm90IGV4aXRlZCIpOworCisgIGlmICghc2l0dGVyLT5oYXZlX2NoaWxkX3N0YXR1cyB8fAorICAgICAgc2l0dGVyLT5jaGlsZF9zdGF0dXMgPT0gU1RJTExfQUNUSVZFKQorICAgIHJldHVybiBGQUxTRTsKKworICAqc3RhdHVzID0gc2l0dGVyLT5jaGlsZF9zdGF0dXM7CisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIFNldHMgdGhlICNEQnVzRXJyb3Igd2l0aCBhbiBleHBsYW5hdGlvbiBvZiB3aHkgdGhlIHNwYXduZWQKKyAqIGNoaWxkIHByb2Nlc3MgZXhpdGVkIChvbiBhIHNpZ25hbCwgb3Igd2hhdGV2ZXIpLiBJZgorICogdGhlIGNoaWxkIHByb2Nlc3MgaGFzIG5vdCBleGl0ZWQsIGRvZXMgbm90aGluZyAoZXJyb3IKKyAqIHdpbGwgcmVtYWluIHVuc2V0KS4KKyAqCisgKiBAcGFyYW0gc2l0dGVyIHRoZSBiYWJ5c2l0dGVyCisgKiBAcGFyYW0gZXJyb3IgYW4gZXJyb3IgdG8gZmlsbCBpbgorICovCit2b2lkCitfZGJ1c19iYWJ5c2l0dGVyX3NldF9jaGlsZF9leGl0X2Vycm9yIChEQnVzQmFieXNpdHRlciAqc2l0dGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBQSU5HKCk7CisgIGlmICghX2RidXNfYmFieXNpdHRlcl9nZXRfY2hpbGRfZXhpdGVkIChzaXR0ZXIpKQorICAgIHJldHVybjsKKworICBQSU5HKCk7CisgIGlmIChzaXR0ZXItPmhhdmVfc3Bhd25fZXJybm8pCisgICAgeworICAgICAgY2hhciAqZW1zZyA9IF9kYnVzX3dpbl9lcnJvcl9zdHJpbmcgKHNpdHRlci0+c3Bhd25fZXJybm8pOworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX1NQQVdOX0VYRUNfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZXhlY3V0ZSBwcm9ncmFtICVzOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgc2l0dGVyLT5sb2dfbmFtZSwgZW1zZyk7CisgICAgICBfZGJ1c193aW5fZnJlZV9lcnJvcl9zdHJpbmcgKGVtc2cpOworICAgIH0KKyAgZWxzZSBpZiAoc2l0dGVyLT5oYXZlX2NoaWxkX3N0YXR1cykKKyAgICB7CisgICAgICBQSU5HKCk7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfU1BBV05fQ0hJTERfRVhJVEVELAorICAgICAgICAgICAgICAgICAgICAgICJQcm9jZXNzICVzIGV4aXRlZCB3aXRoIHN0YXR1cyAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgc2l0dGVyLT5sb2dfbmFtZSwgc2l0dGVyLT5jaGlsZF9zdGF0dXMpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIFBJTkcoKTsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgIlByb2Nlc3MgJXMgZXhpdGVkLCBzdGF0dXMgdW5rbm93biIsCisgICAgICAgICAgICAgICAgICAgICAgc2l0dGVyLT5sb2dfbmFtZSk7CisgICAgfQorICBQSU5HKCk7Cit9CisKK2RidXNfYm9vbF90CitfZGJ1c19iYWJ5c2l0dGVyX3NldF93YXRjaF9mdW5jdGlvbnMgKERCdXNCYWJ5c2l0dGVyICAgICAgICAgICAgKnNpdHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0FkZFdhdGNoRnVuY3Rpb24gICAgICAgYWRkX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzUmVtb3ZlV2F0Y2hGdW5jdGlvbiAgICByZW1vdmVfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNXYXRjaFRvZ2dsZWRGdW5jdGlvbiAgIHRvZ2dsZWRfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNGcmVlRnVuY3Rpb24gICAgICAgICAgIGZyZWVfZGF0YV9mdW5jdGlvbikKK3sKKyAgUElORygpOworICByZXR1cm4gX2RidXNfd2F0Y2hfbGlzdF9zZXRfZnVuY3Rpb25zIChzaXR0ZXItPndhdGNoZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZF9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2dnbGVkX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlX2RhdGFfZnVuY3Rpb24pOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2hhbmRsZV93YXRjaCAoREJ1c1dhdGNoICAgICAgICp3YXRjaCwKKyAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICAgICBjb25kaXRpb24sCisgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAqZGF0YSkKK3sKKyAgREJ1c0JhYnlzaXR0ZXIgKnNpdHRlciA9IGRhdGE7CisKKyAgLyogT24gVW5peCBkYnVzLXNwYXduIHVzZXMgYSBiYWJ5c2l0dGVyICpwcm9jZXNzKiwgdGh1cyBpdCBoYXMgdG8KKyAgICogYWN0dWFsbHkgc2VuZCB0aGUgZXhpdCBzdGF0dXNlcywgZXJyb3IgY29kZXMgYW5kIHdoYXRub3QgdGhyb3VnaAorICAgKiBzb2NrZXRzIGFuZC9vciBwaXBlcy4gT24gV2luMzIsIHRoZSBiYWJ5c2l0dGVyIGlzIGp1cyBhIHRocmVhZCwKKyAgICogc28gaXQgY2FuIHNldCB0aGUgc3RhdHVzIGZpZWxkcyBkaXJlY3RseSBpbiB0aGUgYmFieXNpdHRlciBzdHJ1Y3QKKyAgICoganVzdCBmaW5lLiBUaGUgc29ja2V0IHBpcGUgaXMgdXNlZCBqdXN0IHNvIHdlIGNhbiB3YXRjaCBpdCB3aXRoCisgICAqIHNlbGVjdCgpLCBhcyBzb29uIGFzIGFueXRoaW5nIGlzIHdyaXR0ZW4gdG8gaXQgd2Uga25vdyB0aGF0IHRoZQorICAgKiBiYWJ5c2l0dGVyIHRocmVhZCBoYXMgcmVjb3JkZWQgdGhlIHN0YXR1cyBpbiB0aGUgYmFieXNpdHRlcgorICAgKiBzdHJ1Y3QuCisgICAqLworCisgIFBJTkcoKTsKKyAgY2xvc2Vfc29ja2V0X3RvX2JhYnlzaXR0ZXIgKHNpdHRlcik7CisgIFBJTkcoKTsKKworICBpZiAoX2RidXNfYmFieXNpdHRlcl9nZXRfY2hpbGRfZXhpdGVkIChzaXR0ZXIpICYmCisgICAgICBzaXR0ZXItPmZpbmlzaGVkX2NiICE9IE5VTEwpCisgICAgeworICAgICAgc2l0dGVyLT5maW5pc2hlZF9jYiAoc2l0dGVyLCBzaXR0ZXItPmZpbmlzaGVkX2RhdGEpOworICAgICAgc2l0dGVyLT5maW5pc2hlZF9jYiA9IE5VTEw7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCisvKiBwcm90ZWN0X2FyZ3YgbGlmdGVkIGZyb20gR0xpYiwgcmVsaWNlbnNlZCBieSBhdXRob3IsIFRvciBMaWxscXZpc3QgKi8KK3N0YXRpYyBpbnQKK3Byb3RlY3RfYXJndiAoY2hhciAgKiBjb25zdCAqYXJndiwKKyAgICAgICAgICAgICAgY2hhciAgICAgICAgKioqbmV3X2FyZ3YpCit7CisgIGludCBpOworICBpbnQgYXJnYyA9IDA7CisKKyAgd2hpbGUgKGFyZ3ZbYXJnY10pCisgICAgKythcmdjOworICAqbmV3X2FyZ3YgPSBkYnVzX21hbGxvYyAoKGFyZ2MgKyAxKSAqIHNpemVvZiAoY2hhciAqKSk7CisgIGlmICgqbmV3X2FyZ3YgPT0gTlVMTCkKKyAgICByZXR1cm4gLTE7CisKKyAgZm9yIChpID0gMDsgaSA8IGFyZ2M7IGkrKykKKyAgICAoKm5ld19hcmd2KVtpXSA9IE5VTEw7CisKKyAgLyogUXVvdGUgZWFjaCBhcmd2IGVsZW1lbnQgaWYgbmVjZXNzYXJ5LCBzbyB0aGF0IGl0IHdpbGwgZ2V0CisgICAqIHJlY29uc3RydWN0ZWQgY29ycmVjdGx5IGluIHRoZSBDIHJ1bnRpbWUgc3RhcnR1cCBjb2RlLiAgTm90ZSB0aGF0CisgICAqIHRoZSB1bnF1b3RpbmcgYWxnb3JpdGhtIGluIHRoZSBDIHJ1bnRpbWUgaXMgcmVhbGx5IHdlaXJkLCBhbmQKKyAgICogcmF0aGVyIGRpZmZlcmVudCB0aGFuIHdoYXQgVW5peCBzaGVsbHMgZG8uIFNlZSBzdGRhcmd2LmMgaW4gdGhlIEMKKyAgICogcnVudGltZSBzb3VyY2VzIChpbiB0aGUgUGxhdGZvcm0gU0RLLCBpbiBzcmMvY3J0KS4KKyAgICoKKyAgICogTm90ZSB0aGF0IGFuIG5ld19hcmd2WzBdIGNvbnN0cnVjdGVkIGJ5IHRoaXMgZnVuY3Rpb24gc2hvdWxkCisgICAqICpub3QqIGJlIHBhc3NlZCBhcyB0aGUgZmlsZW5hbWUgYXJndW1lbnQgdG8gYSBzcGF3biogb3IgZXhlYyoKKyAgICogZmFtaWx5IGZ1bmN0aW9uLiBUaGF0IGFyZ3VtZW50IHNob3VsZCBiZSB0aGUgcmVhbCBmaWxlIG5hbWUKKyAgICogd2l0aG91dCBhbnkgcXVvdGluZy4KKyAgICovCisgIGZvciAoaSA9IDA7IGkgPCBhcmdjOyBpKyspCisgICAgeworICAgICAgY29uc3QgY2hhciAqcCA9IGFyZ3ZbaV07CisgICAgICBjaGFyICpxOworICAgICAgaW50IGxlbiA9IDA7CisgICAgICBpbnQgbmVlZF9kYmxxdW90ZXMgPSBGQUxTRTsKKyAgICAgIHdoaWxlICgqcCkKKyAgICAgICAgeworICAgICAgICAgIGlmICgqcCA9PSAnICcgfHwgKnAgPT0gJ1x0JykKKyAgICAgICAgICAgIG5lZWRfZGJscXVvdGVzID0gVFJVRTsKKyAgICAgICAgICBlbHNlIGlmICgqcCA9PSAnIicpCisgICAgICAgICAgICBsZW4rKzsKKyAgICAgICAgICBlbHNlIGlmICgqcCA9PSAnXFwnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBjb25zdCBjaGFyICpwcCA9IHA7CisgICAgICAgICAgICAgIHdoaWxlICgqcHAgJiYgKnBwID09ICdcXCcpCisgICAgICAgICAgICAgICAgcHArKzsKKyAgICAgICAgICAgICAgaWYgKCpwcCA9PSAnIicpCisgICAgICAgICAgICAgICAgbGVuKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgbGVuKys7CisgICAgICAgICAgcCsrOworICAgICAgICB9CisKKyAgICAgIHEgPSAoKm5ld19hcmd2KVtpXSA9IGRidXNfbWFsbG9jIChsZW4gKyBuZWVkX2RibHF1b3RlcyoyICsgMSk7CisKKyAgICAgIGlmIChxID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKworCisgICAgICBwID0gYXJndltpXTsKKworICAgICAgaWYgKG5lZWRfZGJscXVvdGVzKQorICAgICAgICAqcSsrID0gJyInOworCisgICAgICB3aGlsZSAoKnApCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoKnAgPT0gJyInKQorICAgICAgICAgICAgKnErKyA9ICdcXCc7CisgICAgICAgICAgZWxzZSBpZiAoKnAgPT0gJ1xcJykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgY29uc3QgY2hhciAqcHAgPSBwOworICAgICAgICAgICAgICB3aGlsZSAoKnBwICYmICpwcCA9PSAnXFwnKQorICAgICAgICAgICAgICAgIHBwKys7CisgICAgICAgICAgICAgIGlmICgqcHAgPT0gJyInKQorICAgICAgICAgICAgICAgICpxKysgPSAnXFwnOworICAgICAgICAgICAgfQorICAgICAgICAgICpxKysgPSAqcDsKKyAgICAgICAgICBwKys7CisgICAgICAgIH0KKworICAgICAgaWYgKG5lZWRfZGJscXVvdGVzKQorICAgICAgICAqcSsrID0gJyInOworICAgICAgKnErKyA9ICdcMCc7CisgICAgICAvKiBwcmludGYgKCJhcmd2WyVkXTolcywgbmVlZF9kYmxxdW90ZXM6JXMgbGVuOiVkID0+ICVzXG4iLCBpLCBhcmd2W2ldLCBuZWVkX2RibHF1b3Rlcz8iVFJVRSI6IkZBTFNFIiwgbGVuLCAoKm5ld19hcmd2KVtpXSk7ICovCisgICAgfQorICAoKm5ld19hcmd2KVthcmdjXSA9IE5VTEw7CisKKyAgcmV0dXJuIGFyZ2M7Cit9CisKKworLyogRnJvbSBHUEdNRSwgcmVsaWNlbnNlZCBieSBnMTAgQ29kZSBHbWJILiAgKi8KK3N0YXRpYyBjaGFyICoKK2NvbXBvc2Vfc3RyaW5nIChjaGFyICoqc3RyaW5ncywgY2hhciBzZXBhcmF0b3IpCit7CisgIGludCBpOworICBpbnQgbiA9IDA7CisgIGNoYXIgKmJ1ZjsKKyAgY2hhciAqcDsKKworICBpZiAoIXN0cmluZ3MgfHwgIXN0cmluZ3NbMF0pCisgICAgcmV0dXJuIDA7CisgIGZvciAoaSA9IDA7IHN0cmluZ3NbaV07IGkrKykKKyAgICBuICs9IHN0cmxlbiAoc3RyaW5nc1tpXSkgKyAxOworICBuKys7CisKKyAgYnVmID0gcCA9IG1hbGxvYyAobik7CisgIGlmICghYnVmKQorICAgIHJldHVybiBOVUxMOworICBmb3IgKGkgPSAwOyBzdHJpbmdzW2ldOyBpKyspCisgICAgeworICAgICAgc3RyY3B5IChwLCBzdHJpbmdzW2ldKTsKKyAgICAgIHAgKz0gc3RybGVuIChzdHJpbmdzW2ldKTsKKyAgICAgICoocCsrKSA9IHNlcGFyYXRvcjsKKyAgICB9CisgIHAtLTsKKyAgKihwKyspID0gJ1wwJzsKKyAgKnAgPSAnXDAnOworCisgIHJldHVybiBidWY7Cit9CisKK3N0YXRpYyBjaGFyICoKK2J1aWxkX2NvbW1hbmRsaW5lIChjaGFyICoqYXJndikKK3sKKyAgcmV0dXJuIGNvbXBvc2Vfc3RyaW5nIChhcmd2LCAnICcpOworfQorCitzdGF0aWMgY2hhciAqCitidWlsZF9lbnZfc3RyaW5nIChjaGFyKiogZW52cCkKK3sKKyAgcmV0dXJuIGNvbXBvc2Vfc3RyaW5nIChlbnZwLCAnXDAnKTsKK30KKworc3RhdGljIEhBTkRMRQorc3Bhd25fcHJvZ3JhbSAoY2hhciogbmFtZSwgY2hhcioqIGFyZ3YsIGNoYXIqKiBlbnZwKQoreworICBQUk9DRVNTX0lORk9STUFUSU9OIHBpID0geyBOVUxMLCAwLCAwLCAwIH07CisgIFNUQVJUVVBJTkZPQSBzaTsKKyAgY2hhciAqYXJnX3N0cmluZywgKmVudl9zdHJpbmc7CisgIEJPT0wgcmVzdWx0OworCisjaWZkZWYgREJVU19XSU5DRQorICBpZiAoYXJndiAmJiBhcmd2WzBdKQorICAgIGFyZ19zdHJpbmcgPSBidWlsZF9jb21tYW5kbGluZSAoYXJndiArIDEpOworICBlbHNlCisgICAgYXJnX3N0cmluZyA9IE5VTEw7CisjZWxzZQorICBhcmdfc3RyaW5nID0gYnVpbGRfY29tbWFuZGxpbmUgKGFyZ3YpOworI2VuZGlmCisgIGlmICghYXJnX3N0cmluZykKKyAgICByZXR1cm4gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CisKKyAgZW52X3N0cmluZyA9IGJ1aWxkX2Vudl9zdHJpbmcoZW52cCk7CisKKyAgbWVtc2V0ICgmc2ksIDAsIHNpemVvZiAoc2kpKTsKKyAgc2kuY2IgPSBzaXplb2YgKHNpKTsKKyNpZmRlZiBEQlVTX1dJTkNFCisgIHJlc3VsdCA9IENyZWF0ZVByb2Nlc3NBIChuYW1lLCBhcmdfc3RyaW5nLCBOVUxMLCBOVUxMLCBGQUxTRSwgMCwKKyNlbHNlCisgIHJlc3VsdCA9IENyZWF0ZVByb2Nlc3NBIChOVUxMLCBhcmdfc3RyaW5nLCBOVUxMLCBOVUxMLCBGQUxTRSwgMCwKKyNlbmRpZgorCQkJICAgKExQVk9JRCllbnZfc3RyaW5nLCBOVUxMLCAmc2ksICZwaSk7CisgIGZyZWUgKGFyZ19zdHJpbmcpOworICBpZiAoZW52X3N0cmluZykKKyAgICBmcmVlIChlbnZfc3RyaW5nKTsKKworICBpZiAoIXJlc3VsdCkKKyAgICByZXR1cm4gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CisKKyAgQ2xvc2VIYW5kbGUgKHBpLmhUaHJlYWQpOworICByZXR1cm4gcGkuaFByb2Nlc3M7Cit9CisKKworc3RhdGljIERXT1JEIF9fc3RkY2FsbAorYmFieXNpdHRlciAodm9pZCAqcGFyYW1ldGVyKQoreworICBpbnQgcmV0ID0gMDsKKyAgREJ1c0JhYnlzaXR0ZXIgKnNpdHRlciA9IChEQnVzQmFieXNpdHRlciAqKSBwYXJhbWV0ZXI7CisgIEhBTkRMRSBoYW5kbGU7CisKKyAgUElORygpOworICBfZGJ1c192ZXJib3NlICgiYmFieXNpdHRlcjogc3Bhd25pbmcgJXNcbiIsIHNpdHRlci0+bG9nX25hbWUpOworCisgIFBJTkcoKTsKKyAgaGFuZGxlID0gc3Bhd25fcHJvZ3JhbSAoc2l0dGVyLT5sb2dfbmFtZSwgc2l0dGVyLT5hcmd2LCBzaXR0ZXItPmVudnApOworCisgIFBJTkcoKTsKKyAgaWYgKGhhbmRsZSAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSkKKyAgICB7CisgICAgICBzaXR0ZXItPmNoaWxkX2hhbmRsZSA9IGhhbmRsZTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBzaXR0ZXItPmNoaWxkX2hhbmRsZSA9IE5VTEw7CisgICAgICBzaXR0ZXItPmhhdmVfc3Bhd25fZXJybm8gPSBUUlVFOworICAgICAgc2l0dGVyLT5zcGF3bl9lcnJubyA9IEdldExhc3RFcnJvcigpOworICAgIH0KKyAgCisgIFBJTkcoKTsKKyAgU2V0RXZlbnQgKHNpdHRlci0+c3RhcnRfc3luY19ldmVudCk7CisKKyAgaWYgKHNpdHRlci0+Y2hpbGRfaGFuZGxlICE9IE5VTEwpCisgICAgeworICAgICAgRFdPUkQgc3RhdHVzOworCisgICAgICBQSU5HKCk7CisgICAgICAvLyB3YWl0IHVudGlsIHByb2Nlc3MgZmluaXNoZWQKKyAgICAgIFdhaXRGb3JTaW5nbGVPYmplY3QgKHNpdHRlci0+Y2hpbGRfaGFuZGxlLCBJTkZJTklURSk7CisKKyAgICAgIFBJTkcoKTsKKyAgICAgIHJldCA9IEdldEV4aXRDb2RlUHJvY2VzcyAoc2l0dGVyLT5jaGlsZF9oYW5kbGUsICZzdGF0dXMpOworICAgICAgaWYgKHJldCkKKyAgICAgICAgeworICAgICAgICAgIHNpdHRlci0+Y2hpbGRfc3RhdHVzID0gc3RhdHVzOworICAgICAgICAgIHNpdHRlci0+aGF2ZV9jaGlsZF9zdGF0dXMgPSBUUlVFOworICAgICAgICB9CisKKyAgICAgIENsb3NlSGFuZGxlIChzaXR0ZXItPmNoaWxkX2hhbmRsZSk7CisgICAgICBzaXR0ZXItPmNoaWxkX2hhbmRsZSA9IE5VTEw7CisgICAgfQorCisgIFBJTkcoKTsKKyAgc2VuZCAoc2l0dGVyLT5zb2NrZXRfdG9fbWFpbi5zb2NrLCAiICIsIDEsIDApOworCisgIF9kYnVzX2JhYnlzaXR0ZXJfdW5yZWYgKHNpdHRlcik7CisKKyAgcmV0dXJuIHJldCA/IDAgOiAxOworfQorCitkYnVzX2Jvb2xfdAorX2RidXNfc3Bhd25fYXN5bmNfd2l0aF9iYWJ5c2l0dGVyIChEQnVzQmFieXNpdHRlciAgICAgICAgICAgKipzaXR0ZXJfcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgICAgICAgICAqbG9nX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICAgICAgICogY29uc3QgKmFyZ3YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICAgICAgICAgICAgICAqKmVudnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTcGF3bkZsYWdzICAgICAgICAgICAgIGZsYWdzIF9EQlVTX0dOVUNfVU5VU0VELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3Bhd25DaGlsZFNldHVwRnVuYyAgICBjaGlsZF9zZXR1cCBfREJVU19HTlVDX1VOVVNFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAqdXNlcl9kYXRhIF9EQlVTX0dOVUNfVU5VU0VELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAgICAgICAgICplcnJvcikKK3sKKyAgREJ1c0JhYnlzaXR0ZXIgKnNpdHRlcjsKKyAgRFdPUkQgc2l0dGVyX3RocmVhZF9pZDsKKyAgCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworICBfZGJ1c19hc3NlcnQgKGFyZ3ZbMF0gIT0gTlVMTCk7CisKKyAgaWYgKHNpdHRlcl9wICE9IE5VTEwpCisgICAgKnNpdHRlcl9wID0gTlVMTDsKKworICBQSU5HKCk7CisgIHNpdHRlciA9IF9kYnVzX2JhYnlzaXR0ZXJfbmV3ICgpOworICBpZiAoc2l0dGVyID09IE5VTEwpCisgICAgeworICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBzaXR0ZXItPmxvZ19uYW1lID0gX2RidXNfc3RyZHVwIChsb2dfbmFtZSk7CisgIGlmIChzaXR0ZXItPmxvZ19uYW1lID09IE5VTEwgJiYgbG9nX25hbWUgIT0gTlVMTCkKKyAgICB7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBnb3RvIG91dDA7CisgICAgfQorCisgIGlmIChzaXR0ZXItPmxvZ19uYW1lID09IE5VTEwpCisgICAgc2l0dGVyLT5sb2dfbmFtZSA9IF9kYnVzX3N0cmR1cCAoYXJndlswXSk7CisKKyAgaWYgKHNpdHRlci0+bG9nX25hbWUgPT0gTlVMTCkKKyAgICB7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBnb3RvIG91dDA7CisgICAgfQorCisgIFBJTkcoKTsKKyAgaWYgKCFfZGJ1c19zb2NrZXRwYWlyICgmc2l0dGVyLT5zb2NrZXRfdG9fYmFieXNpdHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmc2l0dGVyLT5zb2NrZXRfdG9fbWFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSwgZXJyb3IpKQorICAgIGdvdG8gb3V0MDsKKworICBzaXR0ZXItPnNpdHRlcl93YXRjaCA9IF9kYnVzX3dhdGNoX25ldyAoc2l0dGVyLT5zb2NrZXRfdG9fYmFieXNpdHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfV0FUQ0hfUkVBREFCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFLCBoYW5kbGVfd2F0Y2gsIHNpdHRlciwgTlVMTCk7CisgIFBJTkcoKTsKKyAgaWYgKHNpdHRlci0+c2l0dGVyX3dhdGNoID09IE5VTEwpCisgICAgeworICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgZ290byBvdXQwOworICAgIH0KKworICBQSU5HKCk7CisgIGlmICghX2RidXNfd2F0Y2hfbGlzdF9hZGRfd2F0Y2ggKHNpdHRlci0+d2F0Y2hlcywgIHNpdHRlci0+c2l0dGVyX3dhdGNoKSkKKyAgICB7CisgICAgICAvKiB3ZSBuZWVkIHRvIGZyZWUgaXQgZWFybHkgc28gdGhlIGRlc3RydWN0b3Igd29uJ3QgdHJ5IHRvIHJlbW92ZSBpdAorICAgICAgICogd2l0aG91dCBpdCBoYXZpbmcgYmVlbiBhZGRlZCwgd2hpY2ggREJ1c0xvb3AgZG9lc24ndCBhbGxvdyAqLworICAgICAgX2RidXNfd2F0Y2hfaW52YWxpZGF0ZSAoc2l0dGVyLT5zaXR0ZXJfd2F0Y2gpOworICAgICAgX2RidXNfd2F0Y2hfdW5yZWYgKHNpdHRlci0+c2l0dGVyX3dhdGNoKTsKKyAgICAgIHNpdHRlci0+c2l0dGVyX3dhdGNoID0gTlVMTDsKKworICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgZ290byBvdXQwOworICAgIH0KKworICBzaXR0ZXItPmFyZ2MgPSBwcm90ZWN0X2FyZ3YgKGFyZ3YsICZzaXR0ZXItPmFyZ3YpOworICBpZiAoc2l0dGVyLT5hcmdjID09IC0xKQorICAgIHsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gb3V0MDsKKyAgICB9CisgIHNpdHRlci0+ZW52cCA9IGVudnA7CisKKyAgUElORygpOworICBzaXR0ZXItPnRocmVhZF9oYW5kbGUgPSAoSEFORExFKSBDcmVhdGVUaHJlYWQgKE5VTEwsIDAsIGJhYnlzaXR0ZXIsCisgICAgICAgICAgICAgICAgICBfZGJ1c19iYWJ5c2l0dGVyX3JlZiAoc2l0dGVyKSwgMCwgJnNpdHRlcl90aHJlYWRfaWQpOworCisgIGlmIChzaXR0ZXItPnRocmVhZF9oYW5kbGUgPT0gTlVMTCkKKyAgICB7CisgICAgICBQSU5HKCk7CisgICAgICBkYnVzX3NldF9lcnJvcl9jb25zdCAoZXJyb3IsIERCVVNfRVJST1JfU1BBV05fRk9SS19GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBjcmVhdGUgbmV3IHRocmVhZCIpOworICAgICAgZ290byBvdXQwOworICAgIH0KKworICBQSU5HKCk7CisgIFdhaXRGb3JTaW5nbGVPYmplY3QgKHNpdHRlci0+c3RhcnRfc3luY19ldmVudCwgSU5GSU5JVEUpOworCisgIFBJTkcoKTsKKyAgaWYgKHNpdHRlcl9wICE9IE5VTEwpCisgICAgKnNpdHRlcl9wID0gc2l0dGVyOworICBlbHNlCisgICAgX2RidXNfYmFieXNpdHRlcl91bnJlZiAoc2l0dGVyKTsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBQSU5HKCk7CisgIHJldHVybiBUUlVFOworCitvdXQwOgorICBfZGJ1c19iYWJ5c2l0dGVyX3VucmVmIChzaXR0ZXIpOworCisgIHJldHVybiBGQUxTRTsKK30KKwordm9pZAorX2RidXNfYmFieXNpdHRlcl9zZXRfcmVzdWx0X2Z1bmN0aW9uICAoREJ1c0JhYnlzaXR0ZXIgICAgICAgICAgICAgKnNpdHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNCYWJ5c2l0dGVyRmluaXNoZWRGdW5jICBmaW5pc2hlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICp1c2VyX2RhdGEpCit7CisgIHNpdHRlci0+ZmluaXNoZWRfY2IgPSBmaW5pc2hlZDsKKyAgc2l0dGVyLT5maW5pc2hlZF9kYXRhID0gdXNlcl9kYXRhOworfQorCisjZGVmaW5lIExJVkVfQ0hJTERSRU4oc2l0dGVyKSAoKHNpdHRlciktPmNoaWxkX2hhbmRsZSAhPSBOVUxMKQorCit2b2lkCitfZGJ1c19iYWJ5c2l0dGVyX2Jsb2NrX2Zvcl9jaGlsZF9leGl0IChEQnVzQmFieXNpdHRlciAqc2l0dGVyKQoreworICAvKiBUaGUgdGhyZWFkIHRlcm1pbmF0ZXMgYWZ0ZXIgdGhlIGNoaWxkIGRvZXMuIFdlIHdhbnQgdG8gd2FpdCBmb3IgdGhlIHRocmVhZCwKKyAgICogbm90IGp1c3QgdGhlIGNoaWxkLCB0byBhdm9pZCBkYXRhIHJhY2VzIGFuZCBlbnN1cmUgdGhhdCBpdCBoYXMgZnJlZWQgYWxsCisgICAqIGl0cyBtZW1vcnkuICovCisgIFdhaXRGb3JTaW5nbGVPYmplY3QgKHNpdHRlci0+dGhyZWFkX2hhbmRsZSwgSU5GSU5JVEUpOworfQpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLXNwYXduLmMgYi9kYnVzL2RidXMtc3Bhd24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWI1MjlhCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLXNwYXduLmMKQEAgLTAsMCArMSwxNTE2IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtc3Bhd24uYyBXcmFwcGVyIGFyb3VuZCBmb3JrL2V4ZWMKKyAqIAorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzLCAyMDA0ICBSZWQgSGF0LCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgQ29kZUZhY3RvcnkgQUIKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorCisjaW5jbHVkZSAiZGJ1cy1zcGF3bi5oIgorI2luY2x1ZGUgImRidXMtc3lzZGVwcy11bml4LmgiCisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKyNpbmNsdWRlICJkYnVzLXRlc3QuaCIKKyNpbmNsdWRlICJkYnVzLXByb3RvY29sLmgiCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaWZkZWYgSEFWRV9FUlJOT19ICisjaW5jbHVkZSA8ZXJybm8uaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfU1lTVEVNRAorI2lmZGVmIEhBVkVfU1lTTE9HX0gKKyNpbmNsdWRlIDxzeXNsb2cuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN5c3RlbWQvc2Qtam91cm5hbC5oPgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fQVBQTEVfXykKKyMgaW5jbHVkZSA8Y3J0X2V4dGVybnMuaD4KKyMgZGVmaW5lIGVudmlyb24gKCpfTlNHZXRFbnZpcm9uICgpKQorI2VsaWYgIUhBVkVfREVDTF9FTlZJUk9OCitleHRlcm4gY2hhciAqKmVudmlyb247CisjZW5kaWYKKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzSW50ZXJuYWxzVXRpbHMKKyAqIEB7CisgKi8KKworLyoKKyAqIEknbSBwcmV0dHkgc3VyZSB0aGlzIHdob2xlIHNwYXduIGZpbGUgY291bGQgYmUgbWFkZSBzaW1wbGVyLAorICogaWYgeW91IHRob3VnaHQgYWJvdXQgaXQgYSBiaXQuCisgKi8KKworLyoqCisgKiBFbnVtZXJhdGlvbiBmb3Igc3RhdHVzIG9mIGEgcmVhZCgpCisgKi8KK3R5cGVkZWYgZW51bQoreworICBSRUFEX1NUQVRVU19PSywgICAgLyoqPCBSZWFkIHN1Y2NlZWRlZCAqLworICBSRUFEX1NUQVRVU19FUlJPUiwgLyoqPCBTb21lIGtpbmQgb2YgZXJyb3IgKi8KKyAgUkVBRF9TVEFUVVNfRU9GICAgIC8qKjwgRU9GIHJldHVybmVkICovCit9IFJlYWRTdGF0dXM7CisKK3N0YXRpYyBSZWFkU3RhdHVzCityZWFkX2ludHMgKGludCAgICAgICAgZmQsCisJICAgaW50ICAgICAgICpidWYsCisJICAgaW50ICAgICAgICBuX2ludHNfaW5fYnVmLAorCSAgIGludCAgICAgICAqbl9pbnRzX3JlYWQsCisJICAgREJ1c0Vycm9yICplcnJvcikKK3sKKyAgc2l6ZV90IGJ5dGVzID0gMDsgICAgCisgIFJlYWRTdGF0dXMgcmV0dmFsOworICAKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgcmV0dmFsID0gUkVBRF9TVEFUVVNfT0s7CisgIAorICB3aGlsZSAoVFJVRSkKKyAgICB7CisgICAgICBzc2l6ZV90IGNodW5rOworICAgICAgc2l6ZV90IHRvX3JlYWQ7CisKKyAgICAgIHRvX3JlYWQgPSBzaXplb2YgKGludCkgKiBuX2ludHNfaW5fYnVmIC0gYnl0ZXM7CisKKyAgICAgIGlmICh0b19yZWFkID09IDApCisgICAgICAgIGJyZWFrOworCisgICAgYWdhaW46CisgICAgICAKKyAgICAgIGNodW5rID0gcmVhZCAoZmQsCisgICAgICAgICAgICAgICAgICAgICgoY2hhciopYnVmKSArIGJ5dGVzLAorICAgICAgICAgICAgICAgICAgICB0b19yZWFkKTsKKyAgICAgIAorICAgICAgaWYgKGNodW5rIDwgMCAmJiBlcnJubyA9PSBFSU5UUikKKyAgICAgICAgZ290byBhZ2FpbjsKKyAgICAgICAgICAKKyAgICAgIGlmIChjaHVuayA8IDApCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsCisJCQkgIERCVVNfRVJST1JfU1BBV05fRkFJTEVELAorCQkJICAiRmFpbGVkIHRvIHJlYWQgZnJvbSBjaGlsZCBwaXBlICglcykiLAorCQkJICBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKworICAgICAgICAgIHJldHZhbCA9IFJFQURfU1RBVFVTX0VSUk9SOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChjaHVuayA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgcmV0dmFsID0gUkVBRF9TVEFUVVNfRU9GOworICAgICAgICAgIGJyZWFrOyAvKiBFT0YgKi8KKyAgICAgICAgfQorICAgICAgZWxzZSAvKiBjaHVuayA+IDAgKi8KKwlieXRlcyArPSBjaHVuazsKKyAgICB9CisKKyAgKm5faW50c19yZWFkID0gKGludCkoYnl0ZXMgLyBzaXplb2YoaW50KSk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIFJlYWRTdGF0dXMKK3JlYWRfcGlkIChpbnQgICAgICAgIGZkLAorICAgICAgICAgIHBpZF90ICAgICAqYnVmLAorICAgICAgICAgIERCdXNFcnJvciAqZXJyb3IpCit7CisgIHNpemVfdCBieXRlcyA9IDA7ICAgIAorICBSZWFkU3RhdHVzIHJldHZhbDsKKyAgCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIHJldHZhbCA9IFJFQURfU1RBVFVTX09LOworICAKKyAgd2hpbGUgKFRSVUUpCisgICAgeworICAgICAgc3NpemVfdCBjaHVuazsKKyAgICAgIHNpemVfdCB0b19yZWFkOworCisgICAgICB0b19yZWFkID0gc2l6ZW9mIChwaWRfdCkgLSBieXRlczsKKworICAgICAgaWYgKHRvX3JlYWQgPT0gMCkKKyAgICAgICAgYnJlYWs7CisKKyAgICBhZ2FpbjoKKyAgICAgIAorICAgICAgY2h1bmsgPSByZWFkIChmZCwKKyAgICAgICAgICAgICAgICAgICAgKChjaGFyKilidWYpICsgYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgIHRvX3JlYWQpOworICAgICAgaWYgKGNodW5rIDwgMCAmJiBlcnJubyA9PSBFSU5UUikKKyAgICAgICAgZ290byBhZ2FpbjsKKyAgICAgICAgICAKKyAgICAgIGlmIChjaHVuayA8IDApCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsCisJCQkgIERCVVNfRVJST1JfU1BBV05fRkFJTEVELAorCQkJICAiRmFpbGVkIHRvIHJlYWQgZnJvbSBjaGlsZCBwaXBlICglcykiLAorCQkJICBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKworICAgICAgICAgIHJldHZhbCA9IFJFQURfU1RBVFVTX0VSUk9SOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChjaHVuayA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgcmV0dmFsID0gUkVBRF9TVEFUVVNfRU9GOworICAgICAgICAgIGJyZWFrOyAvKiBFT0YgKi8KKyAgICAgICAgfQorICAgICAgZWxzZSAvKiBjaHVuayA+IDAgKi8KKwlieXRlcyArPSBjaHVuazsKKyAgICB9CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyogVGhlIGltcGxlbWVudGF0aW9uIHVzZXMgYW4gaW50ZXJtZWRpYXRlIGNoaWxkIGJldHdlZW4gdGhlIG1haW4gcHJvY2VzcworICogYW5kIHRoZSBncmFuZGNoaWxkLiBUaGUgZ3JhbmRjaGlsZCBpcyBvdXIgc3Bhd25lZCBwcm9jZXNzLiBUaGUgaW50ZXJtZWRpYXRlCisgKiBjaGlsZCBpcyBhIGJhYnlzaXR0ZXIgcHJvY2VzczsgaXQga2VlcHMgdHJhY2sgb2Ygd2hlbiB0aGUgZ3JhbmRjaGlsZAorICogZXhpdHMvY3Jhc2hlcywgYW5kIHJlYXBzIHRoZSBncmFuZGNoaWxkLgorICoKKyAqIFdlIGF1dG9tYXRpY2FsbHkgcmVhcCB0aGUgYmFieXNpdHRlciBwcm9jZXNzLCBraWxsaW5nIGl0IGlmIG5lY2Vzc2FyeSwKKyAqIHdoZW4gdGhlIERCdXNCYWJ5c2l0dGVyJ3MgcmVmY291bnQgZ29lcyB0byB6ZXJvLgorICoKKyAqIFByb2Nlc3NlczoKKyAqCisgKiBtYWluIHByb2Nlc3MKKyAqIHwgZm9yaygpIEEKKyAqIFwtIGJhYnlzaXR0ZXIKKyAqICAgIHwgZm9yayAoKSBCCisgKiAgICBcLSBncmFuZGNoaWxkICAgICAtLT4gZXhlYyAtLT4gICAgc3Bhd25lZCBwcm9jZXNzCisgKgorICogSVBDOgorICogICAgICAgICAgICAgICAgICBjaGlsZF9lcnJfcmVwb3J0X3BpcGUKKyAqICAgICAgICAgIC8tLS0tLS0tLS0tLTwtLS0tLS0tLS08LS0tLS0tLS0tLS0tLS1cCisgKiAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXgorICogICAgICAgICAgdiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIG1haW4gcHJvY2VzcyAgICAgICAgICAgYmFieXNpdHRlciAgICAgICAgICBncmFuZGNoaWxkCisgKiAgICAgICAgICBeICAgICAgICAgICAgICAgICBeCisgKiAgICAgICAgICB2ICAgICAgICAgICAgICAgICB2CisgKiAgICAgICAgICBcLS0tLS0tLTwtPi0tLS0tLS0vCisgKiAgICAgICAgICAgIGJhYnlzaXR0ZXJfcGlwZQorICoKKyAqIGNoaWxkX2Vycl9yZXBvcnRfcGlwZSBpcyBnZW51aW5lbHkgYSBwaXBlLgorICogVGhlIFJFQURfRU5EIChhbHNvIGNhbGxlZCBlcnJvcl9waXBlX2Zyb21fY2hpbGQpIGlzIHVzZWQgaW4gdGhlIG1haW4KKyAqIHByb2Nlc3MuIFRoZSBXUklURV9FTkQgKGFsc28gY2FsbGVkIGNoaWxkX2Vycl9yZXBvcnRfZmQpIGlzIHVzZWQgaW4KKyAqIHRoZSBncmFuZGNoaWxkIHByb2Nlc3MuCisgKgorICogT24gZmFpbHVyZSwgdGhlIGdyYW5kY2hpbGQgcHJvY2VzcyBzZW5kcyBDSElMRF9FWEVDX0ZBSUxFRCArIGVycm5vLgorICogT24gc3VjY2VzcywgdGhlIHBpcGUganVzdCBjbG9zZXMgKGJlY2F1c2UgaXQncyBjbG9zZS1vbi1leGVjKSB3aXRob3V0CisgKiBzZW5kaW5nIGFueSBieXRlcy4KKyAqCisgKiBiYWJ5c2l0dGVyX3BpcGUgaXMgbWlzLW5hbWVkOiBpdCdzIHJlYWxseSBhIGJpZGlyZWN0aW9uYWwgc29ja2V0cGFpci4KKyAqIFRoZSBbMF0gZW5kIChhbHNvIGNhbGxlZCBzb2NrZXRfdG9fYmFieXNpdHRlcikgaXMgdXNlZCBpbiB0aGUgbWFpbgorICogcHJvY2VzcywgdGhlIFsxXSBlbmQgKGFsc28gY2FsbGVkIHBhcmVudF9waXBlKSBpcyB1c2VkIGluIHRoZSBiYWJ5c2l0dGVyLgorICoKKyAqIElmIHRoZSBmb3JrKCkgbGFiZWxsZWQgQiBpbiB0aGUgZGlhZ3JhbSBhYm92ZSBmYWlscywgdGhlIGJhYnlzaXR0ZXIgc2VuZHMKKyAqIENISUxEX0ZPUktfRkFJTEVEICsgZXJybm8uCisgKiBPbiBzdWNjZXNzLCB0aGUgYmFieXNpdHRlciBzZW5kcyBDSElMRF9QSUQgKyB0aGUgZ3JhbmRjaGlsZCdzIHBpZC4KKyAqIE9uIFNJR0NITEQsIHRoZSBiYWJ5c2l0dGVyIHNlbmRzIENISUxEX0VYSVRFRCArIHRoZSBleGl0IHN0YXR1cy4KKyAqIFRoZSBtYWluIHByb2Nlc3MgZG9lc24ndCBleHBsaWNpdGx5IHNlbmQgYW55dGhpbmcsIGJ1dCB3aGVuIGl0IGV4aXRzLAorICogdGhlIGJhYnlzaXR0ZXIgZ2V0cyBQT0xMSFVQIG9yIFBPTExFUlIuCisgKi8KKworLyogTWVzc2FnZXMgZnJvbSBjaGlsZHJlbiB0byBwYXJlbnRzICovCitlbnVtCit7CisgIENISUxEX0VYSVRFRCwgICAgICAgICAgICAvKiBUaGlzIG1lc3NhZ2UgaXMgZm9sbG93ZWQgYnkgdGhlIGV4aXQgc3RhdHVzIGludCAqLworICBDSElMRF9GT1JLX0ZBSUxFRCwgICAgICAgLyogRm9sbG93ZWQgYnkgZXJybm8gKi8KKyAgQ0hJTERfRVhFQ19GQUlMRUQsICAgICAgIC8qIEZvbGxvd2VkIGJ5IGVycm5vICovCisgIENISUxEX1BJRCAgICAgICAgICAgICAgICAvKiBGb2xsb3dlZCBieSBwaWRfdCAqLworfTsKKworLyoqCisgKiBCYWJ5c2l0dGVyIGltcGxlbWVudGF0aW9uIGRldGFpbHMKKyAqLworc3RydWN0IERCdXNCYWJ5c2l0dGVyCit7CisgIGludCByZWZjb3VudDsgLyoqPCBSZWZlcmVuY2UgY291bnQgKi8KKworICBjaGFyICpsb2dfbmFtZTsgLyoqPCB0aGUgbmFtZSB1bmRlciB3aGljaCB0byBsb2cgbWVzc2FnZXMgYWJvdXQgdGhpcworCQkgICAgcHJvY2VzcyBiZWluZyBzcGF3bmVkICovCisgIAorICBEQnVzU29ja2V0IHNvY2tldF90b19iYWJ5c2l0dGVyOyAvKio8IENvbm5lY3Rpb24gdG8gdGhlIGJhYnlzaXR0ZXIgcHJvY2VzcyAqLworICBpbnQgZXJyb3JfcGlwZV9mcm9tX2NoaWxkOyAvKio8IENvbm5lY3Rpb24gdG8gdGhlIHByb2Nlc3MgdGhhdCBkb2VzIHRoZSBleGVjKCkgKi8KKyAgCisgIHBpZF90IHNpdHRlcl9waWQ7ICAvKio8IFBJRCBPZiB0aGUgYmFieXNpdHRlciAqLworICBwaWRfdCBncmFuZGNoaWxkX3BpZDsgLyoqPCBQSUQgb2YgdGhlIGdyYW5kY2hpbGQgKi8KKworICBEQnVzV2F0Y2hMaXN0ICp3YXRjaGVzOyAvKio8IFdhdGNoZXMgKi8KKworICBEQnVzV2F0Y2ggKmVycm9yX3dhdGNoOyAvKio8IEVycm9yIHBpcGUgd2F0Y2ggKi8KKyAgREJ1c1dhdGNoICpzaXR0ZXJfd2F0Y2g7IC8qKjwgU2l0dGVyIHBpcGUgd2F0Y2ggKi8KKworICBEQnVzQmFieXNpdHRlckZpbmlzaGVkRnVuYyBmaW5pc2hlZF9jYjsKKyAgdm9pZCAqZmluaXNoZWRfZGF0YTsKKworICBpbnQgZXJybnVtOyAvKio8IEVycm9yIG51bWJlciAqLworICBpbnQgc3RhdHVzOyAvKio8IEV4aXQgc3RhdHVzIGNvZGUgKi8KKyAgdW5zaWduZWQgaW50IGhhdmVfY2hpbGRfc3RhdHVzIDogMTsgLyoqPCBUcnVlIGlmIGNoaWxkIHN0YXR1cyBoYXMgYmVlbiByZWFwZWQgKi8KKyAgdW5zaWduZWQgaW50IGhhdmVfZm9ya19lcnJudW0gOiAxOyAvKio8IFRydWUgaWYgd2UgaGF2ZSBhbiBlcnJvciBjb2RlIGZyb20gZm9yaygpICovCisgIHVuc2lnbmVkIGludCBoYXZlX2V4ZWNfZXJybnVtIDogMTsgLyoqPCBUcnVlIGlmIHdlIGhhdmUgYW4gZXJyb3IgY29kZSBmcm9tIGV4ZWMoKSAqLworfTsKKworc3RhdGljIERCdXNCYWJ5c2l0dGVyKgorX2RidXNfYmFieXNpdHRlcl9uZXcgKHZvaWQpCit7CisgIERCdXNCYWJ5c2l0dGVyICpzaXR0ZXI7CisKKyAgc2l0dGVyID0gZGJ1c19uZXcwIChEQnVzQmFieXNpdHRlciwgMSk7CisgIGlmIChzaXR0ZXIgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBzaXR0ZXItPnJlZmNvdW50ID0gMTsKKworICBzaXR0ZXItPnNvY2tldF90b19iYWJ5c2l0dGVyLmZkID0gLTE7CisgIHNpdHRlci0+ZXJyb3JfcGlwZV9mcm9tX2NoaWxkID0gLTE7CisgIAorICBzaXR0ZXItPnNpdHRlcl9waWQgPSAtMTsKKyAgc2l0dGVyLT5ncmFuZGNoaWxkX3BpZCA9IC0xOworCisgIHNpdHRlci0+d2F0Y2hlcyA9IF9kYnVzX3dhdGNoX2xpc3RfbmV3ICgpOworICBpZiAoc2l0dGVyLT53YXRjaGVzID09IE5VTEwpCisgICAgZ290byBmYWlsZWQ7CisgIAorICByZXR1cm4gc2l0dGVyOworCisgZmFpbGVkOgorICBfZGJ1c19iYWJ5c2l0dGVyX3VucmVmIChzaXR0ZXIpOworICByZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiBJbmNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudCBvbiB0aGUgYmFieXNpdHRlciBvYmplY3QuCisgKgorICogQHBhcmFtIHNpdHRlciB0aGUgYmFieXNpdHRlcgorICogQHJldHVybnMgdGhlIGJhYnlzaXR0ZXIKKyAqLworREJ1c0JhYnlzaXR0ZXIgKgorX2RidXNfYmFieXNpdHRlcl9yZWYgKERCdXNCYWJ5c2l0dGVyICpzaXR0ZXIpCit7CisgIF9kYnVzX2Fzc2VydCAoc2l0dGVyICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKHNpdHRlci0+cmVmY291bnQgPiAwKTsKKyAgCisgIHNpdHRlci0+cmVmY291bnQgKz0gMTsKKworICByZXR1cm4gc2l0dGVyOworfQorCitzdGF0aWMgdm9pZCBjbG9zZV9zb2NrZXRfdG9fYmFieXNpdHRlciAgKERCdXNCYWJ5c2l0dGVyICpzaXR0ZXIpOworc3RhdGljIHZvaWQgY2xvc2VfZXJyb3JfcGlwZV9mcm9tX2NoaWxkIChEQnVzQmFieXNpdHRlciAqc2l0dGVyKTsKKworLyoqCisgKiBEZWNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudCBvbiB0aGUgYmFieXNpdHRlciBvYmplY3QuCisgKiBXaGVuIHRoZSByZWZlcmVuY2UgY291bnQgb2YgdGhlIGJhYnlzaXR0ZXIgb2JqZWN0IHJlYWNoZXMKKyAqIHplcm8sIHRoZSBiYWJ5c2l0dGVyIGlzIGtpbGxlZCBhbmQgdGhlIGNoaWxkIHRoYXQgd2FzIGJlaW5nCisgKiBiYWJ5c2F0IGdldHMgZW1hbmNpcGF0ZWQuCisgKgorICogQHBhcmFtIHNpdHRlciB0aGUgYmFieXNpdHRlcgorICovCit2b2lkCitfZGJ1c19iYWJ5c2l0dGVyX3VucmVmIChEQnVzQmFieXNpdHRlciAqc2l0dGVyKQoreworICBfZGJ1c19hc3NlcnQgKHNpdHRlciAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChzaXR0ZXItPnJlZmNvdW50ID4gMCk7CisgIAorICBzaXR0ZXItPnJlZmNvdW50IC09IDE7CisgIGlmIChzaXR0ZXItPnJlZmNvdW50ID09IDApCisgICAgeworICAgICAgLyogSWYgd2UgaGF2ZW4ndCBmb3JrZWQgb3RoZXIgYmFieXNpdHRlcnMKKyAgICAgICAqIHNpbmNlIHRoaXMgYmFieXNpdHRlciBhbmQgc29ja2V0IHdlcmUKKyAgICAgICAqIGNyZWF0ZWQgdGhlbiB0aGlzIGNsb3NlIHdpbGwgY2F1c2UgdGhlCisgICAgICAgKiBiYWJ5c2l0dGVyIHRvIHdha2UgdXAgZnJvbSBwb2xsIHdpdGgKKyAgICAgICAqIGEgaGFuZ3VwIGFuZCB0aGVuIHRoZSBiYWJ5c2l0dGVyIHdpbGwKKyAgICAgICAqIHF1aXQgaXRzZWxmLgorICAgICAgICovCisgICAgICBjbG9zZV9zb2NrZXRfdG9fYmFieXNpdHRlciAoc2l0dGVyKTsKKworICAgICAgY2xvc2VfZXJyb3JfcGlwZV9mcm9tX2NoaWxkIChzaXR0ZXIpOworCisgICAgICBpZiAoc2l0dGVyLT5zaXR0ZXJfcGlkID4gMCkKKyAgICAgICAgeworICAgICAgICAgIGludCBzdGF0dXM7CisgICAgICAgICAgaW50IHJldDsKKworICAgICAgICAgIC8qIEl0J3MgcG9zc2libGUgdGhlIGJhYnlzaXR0ZXIgZGllZCBvbiBpdHMgb3duIGFib3ZlIAorICAgICAgICAgICAqIGZyb20gdGhlIGNsb3NlLCBvciB3YXMga2lsbGVkIHJhbmRvbWx5CisgICAgICAgICAgICogYnkgc29tZSBvdGhlciBwcm9jZXNzLCBzbyBmaXJzdCB0cnkgdG8gcmVhcCBpdAorICAgICAgICAgICAqLworICAgICAgICAgIHJldCA9IHdhaXRwaWQgKHNpdHRlci0+c2l0dGVyX3BpZCwgJnN0YXR1cywgV05PSEFORyk7CisKKyAgICAgICAgICAvKiBJZiB3ZSBjb3VsZG4ndCByZWFwIHRoZSBjaGlsZCB0aGVuIGtpbGwgaXQsIGFuZAorICAgICAgICAgICAqIHRyeSBhZ2FpbgorICAgICAgICAgICAqLworICAgICAgICAgIGlmIChyZXQgPT0gMCkKKyAgICAgICAgICAgIGtpbGwgKHNpdHRlci0+c2l0dGVyX3BpZCwgU0lHS0lMTCk7CisKKyAgICAgICAgICBpZiAocmV0ID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRvCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgcmV0ID0gd2FpdHBpZCAoc2l0dGVyLT5zaXR0ZXJfcGlkLCAmc3RhdHVzLCAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIHdoaWxlIChfREJVU19VTkxJS0VMWSAocmV0IDwgMCAmJiBlcnJubyA9PSBFSU5UUikpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmIChlcnJubyA9PSBFQ0hJTEQpCisgICAgICAgICAgICAgICAgX2RidXNfd2FybiAoIkJhYnlzaXR0ZXIgcHJvY2VzcyBub3QgYXZhaWxhYmxlIHRvIGJlIHJlYXBlZDsgc2hvdWxkIG5vdCBoYXBwZW4iKTsKKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJVbmV4cGVjdGVkIGVycm9yICVkIGluIHdhaXRwaWQoKSBmb3IgYmFieXNpdHRlcjogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vLCBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJSZWFwZWQgJWxkLCB3YWl0aW5nIGZvciBiYWJ5c2l0dGVyICVsZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcpIHJldCwgKGxvbmcpIHNpdHRlci0+c2l0dGVyX3BpZCk7CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBpZiAoV0lGRVhJVEVEIChzaXR0ZXItPnN0YXR1cykpCisgICAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkJhYnlzaXR0ZXIgZXhpdGVkIHdpdGggc3RhdHVzICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdFWElUU1RBVFVTIChzaXR0ZXItPnN0YXR1cykpOworICAgICAgICAgICAgICBlbHNlIGlmIChXSUZTSUdOQUxFRCAoc2l0dGVyLT5zdGF0dXMpKQorICAgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJCYWJ5c2l0dGVyIHJlY2VpdmVkIHNpZ25hbCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXVEVSTVNJRyAoc2l0dGVyLT5zdGF0dXMpKTsKKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJCYWJ5c2l0dGVyIGV4aXRlZCBhYm5vcm1hbGx5XG4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIHNpdHRlci0+c2l0dGVyX3BpZCA9IC0xOworICAgICAgICB9CisKKyAgICAgIGlmIChzaXR0ZXItPndhdGNoZXMpCisgICAgICAgIF9kYnVzX3dhdGNoX2xpc3RfZnJlZSAoc2l0dGVyLT53YXRjaGVzKTsKKworICAgICAgZGJ1c19mcmVlIChzaXR0ZXItPmxvZ19uYW1lKTsKKyAgICAgIAorICAgICAgZGJ1c19mcmVlIChzaXR0ZXIpOworICAgIH0KK30KKworc3RhdGljIFJlYWRTdGF0dXMKK3JlYWRfZGF0YSAoREJ1c0JhYnlzaXR0ZXIgKnNpdHRlciwKKyAgICAgICAgICAgaW50ICAgICAgICAgICAgIGZkKQoreworICBpbnQgd2hhdDsKKyAgaW50IGdvdDsKKyAgREJ1c0Vycm9yIGVycm9yID0gREJVU19FUlJPUl9JTklUOworICBSZWFkU3RhdHVzIHI7CisKKyAgciA9IHJlYWRfaW50cyAoZmQsICZ3aGF0LCAxLCAmZ290LCAmZXJyb3IpOworCisgIHN3aXRjaCAocikKKyAgICB7CisgICAgY2FzZSBSRUFEX1NUQVRVU19FUlJPUjoKKyAgICAgIF9kYnVzX3dhcm4gKCJGYWlsZWQgdG8gcmVhZCBkYXRhIGZyb20gZmQgJWQ6ICVzIiwgZmQsIGVycm9yLm1lc3NhZ2UpOworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgcmV0dXJuIHI7CisKKyAgICBjYXNlIFJFQURfU1RBVFVTX0VPRjoKKyAgICAgIHJldHVybiByOworCisgICAgY2FzZSBSRUFEX1NUQVRVU19PSzoKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImludmFsaWQgUmVhZFN0YXR1cyIpOworICAgICAgYnJlYWs7CisgICAgfQorICAKKyAgaWYgKGdvdCA9PSAxKQorICAgIHsKKyAgICAgIHN3aXRjaCAod2hhdCkKKyAgICAgICAgeworICAgICAgICBjYXNlIENISUxEX0VYSVRFRDoKKyAgICAgICAgY2FzZSBDSElMRF9GT1JLX0ZBSUxFRDoKKyAgICAgICAgY2FzZSBDSElMRF9FWEVDX0ZBSUxFRDoKKyAgICAgICAgICB7CisgICAgICAgICAgICBpbnQgYXJnOworICAgICAgICAgICAgCisgICAgICAgICAgICByID0gcmVhZF9pbnRzIChmZCwgJmFyZywgMSwgJmdvdCwgJmVycm9yKTsKKworICAgICAgICAgICAgc3dpdGNoIChyKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGNhc2UgUkVBRF9TVEFUVVNfRVJST1I6CisgICAgICAgICAgICAgICAgX2RidXNfd2FybiAoIkZhaWxlZCB0byByZWFkIGFyZyBmcm9tIGZkICVkOiAlcyIsIGZkLCBlcnJvci5tZXNzYWdlKTsKKyAgICAgICAgICAgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHI7CisgICAgICAgICAgICAgIGNhc2UgUkVBRF9TVEFUVVNfRU9GOgorICAgICAgICAgICAgICAgIHJldHVybiByOworICAgICAgICAgICAgICBjYXNlIFJFQURfU1RBVFVTX09LOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImludmFsaWQgUmVhZFN0YXR1cyIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChnb3QgPT0gMSkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh3aGF0ID09IENISUxEX0VYSVRFRCkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogRG8gbm90IHJlc2V0IHNpdHRlci0+ZXJybnVtIHRvIDAgaGVyZS4gV2UgZ2V0IGhlcmUgaWYKKyAgICAgICAgICAgICAgICAgICAgICogdGhlIGJhYnlzaXR0ZXIgcmVwb3J0cyB0aGF0IHRoZSBncmFuZGNoaWxkIHByb2Nlc3MgaGFzCisgICAgICAgICAgICAgICAgICAgICAqIGV4aXRlZCwgYW5kIHRoZXJlIGFyZSB0d28gd2F5cyB0aGF0IGNhbiBoYXBwZW46CisgICAgICAgICAgICAgICAgICAgICAqCisgICAgICAgICAgICAgICAgICAgICAqIDEuIGdyYW5kY2hpbGQgc3VjY2Vzc2Z1bGx5IGV4ZWMoKXMgdGhlIGRlc2lyZWQgcHJvY2VzcywKKyAgICAgICAgICAgICAgICAgICAgICogYnV0IHRoZW4gdGhlIGRlc2lyZWQgcHJvY2VzcyBleGl0cyBvciBpcyB0ZXJtaW5hdGVkCisgICAgICAgICAgICAgICAgICAgICAqIGJ5IGEgc2lnbmFsLiBUaGUgYmFieXNpdHRlciBvYnNlcnZlcyB0aGlzIGFuZCByZXBvcnRzCisgICAgICAgICAgICAgICAgICAgICAqIENISUxEX0VYSVRFRC4KKyAgICAgICAgICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAgICAgICAgICogMi4gZ3JhbmRjaGlsZCBmYWlscyB0byBleGVjKCkgdGhlIGRlc2lyZWQgcHJvY2VzcywKKyAgICAgICAgICAgICAgICAgICAgICogYXR0ZW1wdHMgdG8gcmVwb3J0IHRoZSBleGVjKCkgZmFpbHVyZSAod2hpY2gKKyAgICAgICAgICAgICAgICAgICAgICogd2Ugd2lsbCByZWNlaXZlIGFzIENISUxEX0VYRUNfRkFJTEVEKSwgYW5kIHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICogZXhpdHMgaXRzZWxmICh3aGljaCB3aWxsIHByb21wdCB0aGUgYmFieXNpdHRlciB0bworICAgICAgICAgICAgICAgICAgICAgKiBzZW5kIENISUxEX0VYSVRFRCkuIFdlIHdhbnQgdGhlIENISUxEX0VYRUNfRkFJTEVECisgICAgICAgICAgICAgICAgICAgICAqIHRvIHRha2UgcHJlY2VkZW5jZSAoYW5kIGhhdmUgaXRzIGVycm5vIGxvZ2dlZCksCisgICAgICAgICAgICAgICAgICAgICAqIHdoaWNoIF9kYnVzX2JhYnlzaXR0ZXJfc2V0X2NoaWxkX2V4aXRfZXJyb3IoKSBkb2VzLgorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgc2l0dGVyLT5oYXZlX2NoaWxkX3N0YXR1cyA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIHNpdHRlci0+c3RhdHVzID0gYXJnOworICAgICAgICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgicmVjb3JkZWQgY2hpbGQgc3RhdHVzIGV4aXRlZCA9ICVkIHNpZ25hbGVkID0gJWQgZXhpdHN0YXR1cyA9ICVkIHRlcm1zaWcgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lGRVhJVEVEIChzaXR0ZXItPnN0YXR1cyksIFdJRlNJR05BTEVEIChzaXR0ZXItPnN0YXR1cyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdFWElUU1RBVFVTIChzaXR0ZXItPnN0YXR1cyksIFdURVJNU0lHIChzaXR0ZXItPnN0YXR1cykpOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKHdoYXQgPT0gQ0hJTERfRk9SS19GQUlMRUQpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNpdHRlci0+aGF2ZV9mb3JrX2Vycm51bSA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIHNpdHRlci0+ZXJybnVtID0gYXJnOworICAgICAgICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgicmVjb3JkZWQgZm9yayBlcnJudW0gJWRcbiIsIHNpdHRlci0+ZXJybnVtKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICh3aGF0ID09IENISUxEX0VYRUNfRkFJTEVEKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzaXR0ZXItPmhhdmVfZXhlY19lcnJudW0gPSBUUlVFOworICAgICAgICAgICAgICAgICAgICBzaXR0ZXItPmVycm51bSA9IGFyZzsKKyAgICAgICAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoInJlY29yZGVkIGV4ZWMgZXJybnVtICVkXG4iLCBzaXR0ZXItPmVycm51bSk7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0hJTERfUElEOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIHBpZF90IHBpZCA9IC0xOworCisgICAgICAgICAgICByID0gcmVhZF9waWQgKGZkLCAmcGlkLCAmZXJyb3IpOworICAgICAgICAgICAgCisgICAgICAgICAgICBzd2l0Y2ggKHIpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgY2FzZSBSRUFEX1NUQVRVU19FUlJPUjoKKyAgICAgICAgICAgICAgICBfZGJ1c193YXJuICgiRmFpbGVkIHRvIHJlYWQgUElEIGZyb20gZmQgJWQ6ICVzIiwgZmQsIGVycm9yLm1lc3NhZ2UpOworICAgICAgICAgICAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcjsKKyAgICAgICAgICAgICAgY2FzZSBSRUFEX1NUQVRVU19FT0Y6CisgICAgICAgICAgICAgICAgcmV0dXJuIHI7CisgICAgICAgICAgICAgIGNhc2UgUkVBRF9TVEFUVVNfT0s6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiaW52YWxpZCBSZWFkU3RhdHVzIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgc2l0dGVyLT5ncmFuZGNoaWxkX3BpZCA9IHBpZDsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoInJlY29yZGVkIGdyYW5kY2hpbGQgcGlkICVkXG4iLCBzaXR0ZXItPmdyYW5kY2hpbGRfcGlkKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgX2RidXNfd2FybiAoIlVua25vd24gbWVzc2FnZSByZWNlaXZlZCBmcm9tIGJhYnlzaXR0ZXIgcHJvY2VzcyIpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgIHJldHVybiByOworfQorCitzdGF0aWMgdm9pZAorY2xvc2Vfc29ja2V0X3RvX2JhYnlzaXR0ZXIgKERCdXNCYWJ5c2l0dGVyICpzaXR0ZXIpCit7CisgIF9kYnVzX3ZlcmJvc2UgKCJDbG9zaW5nIGJhYnlzaXR0ZXJcbiIpOworCisgIGlmIChzaXR0ZXItPnNpdHRlcl93YXRjaCAhPSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydCAoc2l0dGVyLT53YXRjaGVzICE9IE5VTEwpOworICAgICAgX2RidXNfd2F0Y2hfbGlzdF9yZW1vdmVfd2F0Y2ggKHNpdHRlci0+d2F0Y2hlcywgIHNpdHRlci0+c2l0dGVyX3dhdGNoKTsKKyAgICAgIF9kYnVzX3dhdGNoX2ludmFsaWRhdGUgKHNpdHRlci0+c2l0dGVyX3dhdGNoKTsKKyAgICAgIF9kYnVzX3dhdGNoX3VucmVmIChzaXR0ZXItPnNpdHRlcl93YXRjaCk7CisgICAgICBzaXR0ZXItPnNpdHRlcl93YXRjaCA9IE5VTEw7CisgICAgfQorCisgIGlmIChzaXR0ZXItPnNvY2tldF90b19iYWJ5c2l0dGVyLmZkID49IDApCisgICAgeworICAgICAgX2RidXNfY2xvc2Vfc29ja2V0IChzaXR0ZXItPnNvY2tldF90b19iYWJ5c2l0dGVyLCBOVUxMKTsKKyAgICAgIHNpdHRlci0+c29ja2V0X3RvX2JhYnlzaXR0ZXIuZmQgPSAtMTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitjbG9zZV9lcnJvcl9waXBlX2Zyb21fY2hpbGQgKERCdXNCYWJ5c2l0dGVyICpzaXR0ZXIpCit7CisgIF9kYnVzX3ZlcmJvc2UgKCJDbG9zaW5nIGNoaWxkIGVycm9yXG4iKTsKKworICBpZiAoc2l0dGVyLT5lcnJvcl93YXRjaCAhPSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydCAoc2l0dGVyLT53YXRjaGVzICE9IE5VTEwpOworICAgICAgX2RidXNfd2F0Y2hfbGlzdF9yZW1vdmVfd2F0Y2ggKHNpdHRlci0+d2F0Y2hlcywgIHNpdHRlci0+ZXJyb3Jfd2F0Y2gpOworICAgICAgX2RidXNfd2F0Y2hfaW52YWxpZGF0ZSAoc2l0dGVyLT5lcnJvcl93YXRjaCk7CisgICAgICBfZGJ1c193YXRjaF91bnJlZiAoc2l0dGVyLT5lcnJvcl93YXRjaCk7CisgICAgICBzaXR0ZXItPmVycm9yX3dhdGNoID0gTlVMTDsKKyAgICB9CisKKyAgaWYgKHNpdHRlci0+ZXJyb3JfcGlwZV9mcm9tX2NoaWxkID49IDApCisgICAgeworICAgICAgX2RidXNfY2xvc2UgKHNpdHRlci0+ZXJyb3JfcGlwZV9mcm9tX2NoaWxkLCBOVUxMKTsKKyAgICAgIHNpdHRlci0+ZXJyb3JfcGlwZV9mcm9tX2NoaWxkID0gLTE7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAoraGFuZGxlX2JhYnlzaXR0ZXJfc29ja2V0IChEQnVzQmFieXNpdHRlciAqc2l0dGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgcmV2ZW50cykKK3sKKyAgLyogRXZlbiBpZiB3ZSBoYXZlIFBPTExIVVAsIHdlIHdhbnQgdG8ga2VlcCByZWFkaW5nCisgICAqIGRhdGEgdW50aWwgUE9MTElOIGdvZXMgYXdheTsgc28gdGhpcyBmdW5jdGlvbiBvbmx5CisgICAqIGxvb2tzIGF0IEhVUC9FUlIgaWYgbm8gSU4gaXMgc2V0LgorICAgKi8KKyAgaWYgKHJldmVudHMgJiBfREJVU19QT0xMSU4pCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIlJlYWRpbmcgZGF0YSBmcm9tIGJhYnlzaXR0ZXJcbiIpOworICAgICAgaWYgKHJlYWRfZGF0YSAoc2l0dGVyLCBzaXR0ZXItPnNvY2tldF90b19iYWJ5c2l0dGVyLmZkKSAhPSBSRUFEX1NUQVRVU19PSykKKyAgICAgICAgY2xvc2Vfc29ja2V0X3RvX2JhYnlzaXR0ZXIgKHNpdHRlcik7CisgICAgfQorICBlbHNlIGlmIChyZXZlbnRzICYgKF9EQlVTX1BPTExFUlIgfCBfREJVU19QT0xMSFVQKSkKKyAgICB7CisgICAgICBjbG9zZV9zb2NrZXRfdG9fYmFieXNpdHRlciAoc2l0dGVyKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitoYW5kbGVfZXJyb3JfcGlwZSAoREJ1c0JhYnlzaXR0ZXIgKnNpdHRlciwKKyAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgcmV2ZW50cykKK3sKKyAgaWYgKHJldmVudHMgJiBfREJVU19QT0xMSU4pCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIlJlYWRpbmcgZGF0YSBmcm9tIGNoaWxkIGVycm9yXG4iKTsKKyAgICAgIGlmIChyZWFkX2RhdGEgKHNpdHRlciwgc2l0dGVyLT5lcnJvcl9waXBlX2Zyb21fY2hpbGQpICE9IFJFQURfU1RBVFVTX09LKQorICAgICAgICBjbG9zZV9lcnJvcl9waXBlX2Zyb21fY2hpbGQgKHNpdHRlcik7CisgICAgfQorICBlbHNlIGlmIChyZXZlbnRzICYgKF9EQlVTX1BPTExFUlIgfCBfREJVU19QT0xMSFVQKSkKKyAgICB7CisgICAgICBjbG9zZV9lcnJvcl9waXBlX2Zyb21fY2hpbGQgKHNpdHRlcik7CisgICAgfQorfQorCisvKiByZXR1cm5zIHdoZXRoZXIgdGhlcmUgd2VyZSBhbnkgcG9sbCBldmVudHMgaGFuZGxlZCAqLworc3RhdGljIGRidXNfYm9vbF90CitiYWJ5c2l0dGVyX2l0ZXJhdGlvbiAoREJ1c0JhYnlzaXR0ZXIgKnNpdHRlciwKKyAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgYmxvY2spCit7CisgIERCdXNQb2xsRkQgZmRzWzJdOworICBpbnQgaTsKKyAgZGJ1c19ib29sX3QgZGVzY3JpcHRvcnNfcmVhZHk7CisKKyAgZGVzY3JpcHRvcnNfcmVhZHkgPSBGQUxTRTsKKyAgCisgIGkgPSAwOworCisgIGlmIChzaXR0ZXItPmVycm9yX3BpcGVfZnJvbV9jaGlsZCA+PSAwKQorICAgIHsKKyAgICAgIGZkc1tpXS5mZCA9IHNpdHRlci0+ZXJyb3JfcGlwZV9mcm9tX2NoaWxkOworICAgICAgZmRzW2ldLmV2ZW50cyA9IF9EQlVTX1BPTExJTjsKKyAgICAgIGZkc1tpXS5yZXZlbnRzID0gMDsKKyAgICAgICsraTsKKyAgICB9CisgIAorICBpZiAoc2l0dGVyLT5zb2NrZXRfdG9fYmFieXNpdHRlci5mZCA+PSAwKQorICAgIHsKKyAgICAgIGZkc1tpXS5mZCA9IHNpdHRlci0+c29ja2V0X3RvX2JhYnlzaXR0ZXIuZmQ7CisgICAgICBmZHNbaV0uZXZlbnRzID0gX0RCVVNfUE9MTElOOworICAgICAgZmRzW2ldLnJldmVudHMgPSAwOworICAgICAgKytpOworICAgIH0KKworICBpZiAoaSA+IDApCisgICAgeworICAgICAgaW50IHJldDsKKworICAgICAgZG8KKyAgICAgICAgeworICAgICAgICAgIHJldCA9IF9kYnVzX3BvbGwgKGZkcywgaSwgMCk7CisgICAgICAgIH0KKyAgICAgIHdoaWxlIChyZXQgPCAwICYmIGVycm5vID09IEVJTlRSKTsKKworICAgICAgaWYgKHJldCA9PSAwICYmIGJsb2NrKQorICAgICAgICB7CisgICAgICAgICAgZG8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcmV0ID0gX2RidXNfcG9sbCAoZmRzLCBpLCAtMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgd2hpbGUgKHJldCA8IDAgJiYgZXJybm8gPT0gRUlOVFIpOworICAgICAgICB9CisKKyAgICAgIGlmIChyZXQgPiAwKQorICAgICAgICB7CisgICAgICAgICAgZGVzY3JpcHRvcnNfcmVhZHkgPSBUUlVFOworICAgICAgICAgIAorICAgICAgICAgIHdoaWxlIChpID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLS1pOworICAgICAgICAgICAgICBpZiAoZmRzW2ldLmZkID09IHNpdHRlci0+ZXJyb3JfcGlwZV9mcm9tX2NoaWxkKQorICAgICAgICAgICAgICAgIGhhbmRsZV9lcnJvcl9waXBlIChzaXR0ZXIsIGZkc1tpXS5yZXZlbnRzKTsKKyAgICAgICAgICAgICAgZWxzZSBpZiAoZmRzW2ldLmZkID09IHNpdHRlci0+c29ja2V0X3RvX2JhYnlzaXR0ZXIuZmQpCisgICAgICAgICAgICAgICAgaGFuZGxlX2JhYnlzaXR0ZXJfc29ja2V0IChzaXR0ZXIsIGZkc1tpXS5yZXZlbnRzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICByZXR1cm4gZGVzY3JpcHRvcnNfcmVhZHk7Cit9CisKKy8qKgorICogTWFjcm8gcmV0dXJucyAjVFJVRSBpZiB0aGUgYmFieXNpdHRlciBzdGlsbCBoYXMgbGl2ZSBzb2NrZXRzIG9wZW4gdG8gdGhlCisgKiBiYWJ5c2l0dGVyIGNoaWxkIG9yIHRoZSBncmFuZGNoaWxkLgorICovCisjZGVmaW5lIExJVkVfQ0hJTERSRU4oc2l0dGVyKSAoKHNpdHRlciktPnNvY2tldF90b19iYWJ5c2l0dGVyLmZkID49IDAgfHwgKHNpdHRlciktPmVycm9yX3BpcGVfZnJvbV9jaGlsZCA+PSAwKQorCisvKioKKyAqIEJsb2NrcyB1bnRpbCB0aGUgYmFieXNpdHRlciBwcm9jZXNzIGdpdmVzIHVzIHRoZSBQSUQgb2YgdGhlIHNwYXduZWQgZ3JhbmRjaGlsZCwKKyAqIHRoZW4ga2lsbHMgdGhlIHNwYXduZWQgZ3JhbmRjaGlsZC4KKyAqCisgKiBAcGFyYW0gc2l0dGVyIHRoZSBiYWJ5c2l0dGVyIG9iamVjdAorICovCit2b2lkCitfZGJ1c19iYWJ5c2l0dGVyX2tpbGxfY2hpbGQgKERCdXNCYWJ5c2l0dGVyICpzaXR0ZXIpCit7CisgIC8qIGJlIHN1cmUgd2UgaGF2ZSB0aGUgUElEIG9mIHRoZSBjaGlsZCAqLworICB3aGlsZSAoTElWRV9DSElMRFJFTiAoc2l0dGVyKSAmJgorICAgICAgICAgc2l0dGVyLT5ncmFuZGNoaWxkX3BpZCA9PSAtMSkKKyAgICBiYWJ5c2l0dGVyX2l0ZXJhdGlvbiAoc2l0dGVyLCBUUlVFKTsKKworICBfZGJ1c192ZXJib3NlICgiR290IGNoaWxkIFBJRCAlbGQgZm9yIGtpbGxpbmdcbiIsCisgICAgICAgICAgICAgICAgIChsb25nKSBzaXR0ZXItPmdyYW5kY2hpbGRfcGlkKTsKKyAgCisgIGlmIChzaXR0ZXItPmdyYW5kY2hpbGRfcGlkID09IC0xKQorICAgIHJldHVybjsgLyogY2hpbGQgaXMgYWxyZWFkeSBkZWFkLCBvciB3ZSdyZSBzbyBob3NlZCB3ZSdsbCBuZXZlciByZWNvdmVyICovCisKKyAga2lsbCAoc2l0dGVyLT5ncmFuZGNoaWxkX3BpZCwgU0lHS0lMTCk7Cit9CisKKy8qKgorICogQ2hlY2tzIHdoZXRoZXIgdGhlIGNoaWxkIGhhcyBleGl0ZWQsIHdpdGhvdXQgYmxvY2tpbmcuCisgKgorICogQHBhcmFtIHNpdHRlciB0aGUgYmFieXNpdHRlcgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfYmFieXNpdHRlcl9nZXRfY2hpbGRfZXhpdGVkIChEQnVzQmFieXNpdHRlciAqc2l0dGVyKQoreworCisgIC8qIEJlIHN1cmUgd2UncmUgdXAtdG8tZGF0ZSAqLworICB3aGlsZSAoTElWRV9DSElMRFJFTiAoc2l0dGVyKSAmJgorICAgICAgICAgYmFieXNpdHRlcl9pdGVyYXRpb24gKHNpdHRlciwgRkFMU0UpKQorICAgIDsKKworICAvKiBXZSB3aWxsIGhhdmUgZXhpdGVkIHRoZSBiYWJ5c2l0dGVyIHdoZW4gdGhlIGNoaWxkIGhhcyBleGl0ZWQgKi8KKyAgcmV0dXJuIHNpdHRlci0+c29ja2V0X3RvX2JhYnlzaXR0ZXIuZmQgPCAwOworfQorCisvKioKKyAqIEdldHMgdGhlIGV4aXQgc3RhdHVzIG9mIHRoZSBjaGlsZC4gV2UgZG8gdGhpcyBzbyBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYworICogZGV0YWlsIGlzIG5vdCBjbHV0dGVyaW5nIHVwIGRidXMsIGZvciBleGFtcGxlIHRoZSBzeXN0ZW0gbGF1bmNoZXIgY29kZS4KKyAqIFRoaXMgY2FuIG9ubHkgYmUgY2FsbGVkIGlmIHRoZSBjaGlsZCBoYXMgZXhpdGVkLCBpLmUuIGNhbGwKKyAqIF9kYnVzX2JhYnlzaXR0ZXJfZ2V0X2NoaWxkX2V4aXRlZCgpLiBJdCByZXR1cm5zIEZBTFNFIGlmIHRoZSBjaGlsZAorICogZGlkIG5vdCByZXR1cm4gYSBzdGF0dXMgY29kZSwgZS5nLiBiZWNhdXNlIHRoZSBjaGlsZCB3YXMgc2lnbmFsZWQKKyAqIG9yIHdlIGZhaWxlZCB0byBldmVyIGxhdW5jaCB0aGUgY2hpbGQgaW4gdGhlIGZpcnN0IHBsYWNlLgorICoKKyAqIEBwYXJhbSBzaXR0ZXIgdGhlIGJhYnlzaXR0ZXIKKyAqIEBwYXJhbSBzdGF0dXMgdGhlIHJldHVybmVkIHN0YXR1cyBjb2RlCisgKiBAcmV0dXJucyAjRkFMU0Ugb24gZmFpbHVyZQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfYmFieXNpdHRlcl9nZXRfY2hpbGRfZXhpdF9zdGF0dXMgKERCdXNCYWJ5c2l0dGVyICpzaXR0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgKnN0YXR1cykKK3sKKyAgaWYgKCFfZGJ1c19iYWJ5c2l0dGVyX2dldF9jaGlsZF9leGl0ZWQgKHNpdHRlcikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiQ2hpbGQgaGFzIG5vdCBleGl0ZWQiKTsKKyAgCisgIGlmICghc2l0dGVyLT5oYXZlX2NoaWxkX3N0YXR1cyB8fAorICAgICAgIShXSUZFWElURUQgKHNpdHRlci0+c3RhdHVzKSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgICpzdGF0dXMgPSBXRVhJVFNUQVRVUyAoc2l0dGVyLT5zdGF0dXMpOworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBTZXRzIHRoZSAjREJ1c0Vycm9yIHdpdGggYW4gZXhwbGFuYXRpb24gb2Ygd2h5IHRoZSBzcGF3bmVkCisgKiBjaGlsZCBwcm9jZXNzIGV4aXRlZCAob24gYSBzaWduYWwsIG9yIHdoYXRldmVyKS4gSWYKKyAqIHRoZSBjaGlsZCBwcm9jZXNzIGhhcyBub3QgZXhpdGVkLCBkb2VzIG5vdGhpbmcgKGVycm9yCisgKiB3aWxsIHJlbWFpbiB1bnNldCkuCisgKgorICogQHBhcmFtIHNpdHRlciB0aGUgYmFieXNpdHRlcgorICogQHBhcmFtIGVycm9yIGFuIGVycm9yIHRvIGZpbGwgaW4KKyAqLwordm9pZAorX2RidXNfYmFieXNpdHRlcl9zZXRfY2hpbGRfZXhpdF9lcnJvciAoREJ1c0JhYnlzaXR0ZXIgKnNpdHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgaWYgKCFfZGJ1c19iYWJ5c2l0dGVyX2dldF9jaGlsZF9leGl0ZWQgKHNpdHRlcikpCisgICAgcmV0dXJuOworCisgIC8qIE5vdGUgdGhhdCBpZiBleGVjIGZhaWxzLCB3ZSB3aWxsIGFsc28gZ2V0IGEgY2hpbGQgc3RhdHVzCisgICAqIGZyb20gdGhlIGJhYnlzaXR0ZXIgc2F5aW5nIHRoZSBjaGlsZCBleGl0ZWQsCisgICAqIHNvIHdlIG5lZWQgdG8gZ2l2ZSBwcmlvcml0eSB0byB0aGUgZXhlYyBlcnJvcgorICAgKi8KKyAgaWYgKHNpdHRlci0+aGF2ZV9leGVjX2Vycm51bSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfU1BBV05fRVhFQ19GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBleGVjdXRlIHByb2dyYW0gJXM6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBzaXR0ZXItPmxvZ19uYW1lLCBfZGJ1c19zdHJlcnJvciAoc2l0dGVyLT5lcnJudW0pKTsKKyAgICB9CisgIGVsc2UgaWYgKHNpdHRlci0+aGF2ZV9mb3JrX2Vycm51bSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZm9yayBhIG5ldyBwcm9jZXNzICVzOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgc2l0dGVyLT5sb2dfbmFtZSwgX2RidXNfc3RyZXJyb3IgKHNpdHRlci0+ZXJybnVtKSk7CisgICAgfQorICBlbHNlIGlmIChzaXR0ZXItPmhhdmVfY2hpbGRfc3RhdHVzKQorICAgIHsKKyAgICAgIGlmIChXSUZFWElURUQgKHNpdHRlci0+c3RhdHVzKSkKKyAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX1NQQVdOX0NISUxEX0VYSVRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJQcm9jZXNzICVzIGV4aXRlZCB3aXRoIHN0YXR1cyAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBzaXR0ZXItPmxvZ19uYW1lLCBXRVhJVFNUQVRVUyAoc2l0dGVyLT5zdGF0dXMpKTsKKyAgICAgIGVsc2UgaWYgKFdJRlNJR05BTEVEIChzaXR0ZXItPnN0YXR1cykpCisgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9TUEFXTl9DSElMRF9TSUdOQUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJQcm9jZXNzICVzIHJlY2VpdmVkIHNpZ25hbCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBzaXR0ZXItPmxvZ19uYW1lLCBXVEVSTVNJRyAoc2l0dGVyLT5zdGF0dXMpKTsKKyAgICAgIGVsc2UKKyAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJQcm9jZXNzICVzIGV4aXRlZCBhYm5vcm1hbGx5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpdHRlci0+bG9nX25hbWUpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgIlByb2Nlc3MgJXMgZXhpdGVkLCByZWFzb24gdW5rbm93biIsCisgICAgICAgICAgICAgICAgICAgICAgc2l0dGVyLT5sb2dfbmFtZSk7CisgICAgfQorfQorCisvKioKKyAqIFNldHMgd2F0Y2ggZnVuY3Rpb25zIHRvIG5vdGlmeSB1cyB3aGVuIHRoZQorICogYmFieXNpdHRlciBvYmplY3QgbmVlZHMgdG8gcmVhZC93cml0ZSBmaWxlIGRlc2NyaXB0b3JzLgorICoKKyAqIEBwYXJhbSBzaXR0ZXIgdGhlIGJhYnlzaXR0ZXIKKyAqIEBwYXJhbSBhZGRfZnVuY3Rpb24gZnVuY3Rpb24gdG8gYmVnaW4gbW9uaXRvcmluZyBhIG5ldyBkZXNjcmlwdG9yLgorICogQHBhcmFtIHJlbW92ZV9mdW5jdGlvbiBmdW5jdGlvbiB0byBzdG9wIG1vbml0b3JpbmcgYSBkZXNjcmlwdG9yLgorICogQHBhcmFtIHRvZ2dsZWRfZnVuY3Rpb24gZnVuY3Rpb24gdG8gbm90aWZ5IHdoZW4gdGhlIHdhdGNoIGlzIGVuYWJsZWQvZGlzYWJsZWQKKyAqIEBwYXJhbSBkYXRhIGRhdGEgdG8gcGFzcyB0byBhZGRfZnVuY3Rpb24gYW5kIHJlbW92ZV9mdW5jdGlvbi4KKyAqIEBwYXJhbSBmcmVlX2RhdGFfZnVuY3Rpb24gZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHRvIGZyZWUgdGhlIGRhdGEuCisgKiBAcmV0dXJucyAjRkFMU0Ugb24gZmFpbHVyZSAobm8gbWVtb3J5KQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfYmFieXNpdHRlcl9zZXRfd2F0Y2hfZnVuY3Rpb25zIChEQnVzQmFieXNpdHRlciAgICAgICAgICAgICpzaXR0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNBZGRXYXRjaEZ1bmN0aW9uICAgICAgIGFkZF9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1JlbW92ZVdhdGNoRnVuY3Rpb24gICAgcmVtb3ZlX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzV2F0Y2hUb2dnbGVkRnVuY3Rpb24gICB0b2dnbGVkX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRnJlZUZ1bmN0aW9uICAgICAgICAgICBmcmVlX2RhdGFfZnVuY3Rpb24pCit7CisgIHJldHVybiBfZGJ1c193YXRjaF9saXN0X3NldF9mdW5jdGlvbnMgKHNpdHRlci0+d2F0Y2hlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvZ2dsZWRfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWVfZGF0YV9mdW5jdGlvbik7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAoraGFuZGxlX3dhdGNoIChEQnVzV2F0Y2ggICAgICAgKndhdGNoLAorICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgICAgIGNvbmRpdGlvbiwKKyAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICpkYXRhKQoreworICBEQnVzQmFieXNpdHRlciAqc2l0dGVyID0gX2RidXNfYmFieXNpdHRlcl9yZWYgKGRhdGEpOworICBpbnQgcmV2ZW50czsKKyAgaW50IGZkOworICAKKyAgcmV2ZW50cyA9IDA7CisgIGlmIChjb25kaXRpb24gJiBEQlVTX1dBVENIX1JFQURBQkxFKQorICAgIHJldmVudHMgfD0gX0RCVVNfUE9MTElOOworICBpZiAoY29uZGl0aW9uICYgREJVU19XQVRDSF9FUlJPUikKKyAgICByZXZlbnRzIHw9IF9EQlVTX1BPTExFUlI7CisgIGlmIChjb25kaXRpb24gJiBEQlVTX1dBVENIX0hBTkdVUCkKKyAgICByZXZlbnRzIHw9IF9EQlVTX1BPTExIVVA7CisKKyAgZmQgPSBkYnVzX3dhdGNoX2dldF9zb2NrZXQgKHdhdGNoKTsKKworICBpZiAoZmQgPT0gc2l0dGVyLT5lcnJvcl9waXBlX2Zyb21fY2hpbGQpCisgICAgaGFuZGxlX2Vycm9yX3BpcGUgKHNpdHRlciwgcmV2ZW50cyk7CisgIGVsc2UgaWYgKGZkID09IHNpdHRlci0+c29ja2V0X3RvX2JhYnlzaXR0ZXIuZmQpCisgICAgaGFuZGxlX2JhYnlzaXR0ZXJfc29ja2V0IChzaXR0ZXIsIHJldmVudHMpOworCisgIHdoaWxlIChMSVZFX0NISUxEUkVOIChzaXR0ZXIpICYmCisgICAgICAgICBiYWJ5c2l0dGVyX2l0ZXJhdGlvbiAoc2l0dGVyLCBGQUxTRSkpCisgICAgOworCisgIC8qIGZkLm8gIzMyOTkyOiBpZiB0aGUgaGFuZGxlXyogbWV0aG9kcyBjbG9zZWQgdGhlaXIgc29ja2V0cywgdGhleSBwcmV2aW91c2x5CisgICAqIGRpZG4ndCBhbHdheXMgcmVtb3ZlIHRoZSB3YXRjaGVzLiBDaGVjayB0aGF0IHdlIGRvbid0IHJlZ3Jlc3MuICovCisgIF9kYnVzX2Fzc2VydCAoc2l0dGVyLT5zb2NrZXRfdG9fYmFieXNpdHRlci5mZCAhPSAtMSB8fCBzaXR0ZXItPnNpdHRlcl93YXRjaCA9PSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChzaXR0ZXItPmVycm9yX3BpcGVfZnJvbV9jaGlsZCAhPSAtMSB8fCBzaXR0ZXItPmVycm9yX3dhdGNoID09IE5VTEwpOworCisgIGlmIChfZGJ1c19iYWJ5c2l0dGVyX2dldF9jaGlsZF9leGl0ZWQgKHNpdHRlcikgJiYKKyAgICAgIHNpdHRlci0+ZmluaXNoZWRfY2IgIT0gTlVMTCkKKyAgICB7CisgICAgICBzaXR0ZXItPmZpbmlzaGVkX2NiIChzaXR0ZXIsIHNpdHRlci0+ZmluaXNoZWRfZGF0YSk7CisgICAgICBzaXR0ZXItPmZpbmlzaGVkX2NiID0gTlVMTDsKKyAgICB9CisKKyAgX2RidXNfYmFieXNpdHRlcl91bnJlZiAoc2l0dGVyKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKiBIZWxwcyByZW1lbWJlciB3aGljaCBlbmQgb2YgdGhlIHBpcGUgaXMgd2hpY2ggKi8KKyNkZWZpbmUgUkVBRF9FTkQgMAorLyoqIEhlbHBzIHJlbWVtYmVyIHdoaWNoIGVuZCBvZiB0aGUgcGlwZSBpcyB3aGljaCAqLworI2RlZmluZSBXUklURV9FTkQgMQorCisKKy8qIEF2b2lkcyBhIGRhbmdlciBpbiByZS1lbnRyYW50IHNpdHVhdGlvbnMgKGNhbGxpbmcgY2xvc2UoKQorICogb24gYSBmaWxlIGRlc2NyaXB0b3IgdHdpY2UsIGFuZCBhbm90aGVyIG1vZHVsZSBoYXMKKyAqIHJlLW9wZW5lZCBpdCBzaW5jZSB0aGUgZmlyc3QgY2xvc2UpLgorICoKKyAqIFRoaXMgcHJldmlvdXNseSBjbGFpbWVkIHRvIGJlIHJlbGV2YW50IGZvciB0aHJlYWRlZCBzaXR1YXRpb25zLCBidXQgYnkKKyAqIHRyaXZpYWwgaW5zcGVjdGlvbiwgaXQgaXMgbm90IHRocmVhZC1zYWZlLiBJdCBkb2Vzbid0IGFjdHVhbGx5CisgKiBtYXR0ZXIsIHNpbmNlIHRoaXMgbW9kdWxlIGlzIG9ubHkgdXNlZCBpbiB0aGUgLXV0aWwgdmFyaWFudCBvZiB0aGUKKyAqIGxpYnJhcnksIHdoaWNoIGlzIG9ubHkgdXNlZCBpbiBzaW5nbGUtdGhyZWFkZWQgc2l0dWF0aW9ucy4KKyAqLworc3RhdGljIGludAorY2xvc2VfYW5kX2ludmFsaWRhdGUgKGludCAqZmQpCit7CisgIGludCByZXQ7CisKKyAgaWYgKCpmZCA8IDApCisgICAgcmV0dXJuIC0xOworICBlbHNlCisgICAgeworICAgICAgcmV0ID0gX2RidXNfY2xvc2UgKCpmZCwgTlVMTCk7CisgICAgICAqZmQgPSAtMTsKKyAgICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGRidXNfYm9vbF90CittYWtlX3BpcGUgKGludCAgICAgICAgIHBbMl0sCisgICAgICAgICAgIERCdXNFcnJvciAgKmVycm9yKQoreworICBpbnQgcmV0dmFsOworCisjaWZkZWYgSEFWRV9QSVBFMgorICBkYnVzX2Jvb2xfdCBjbG9leGVjX2RvbmU7CisKKyAgcmV0dmFsID0gcGlwZTIgKHAsIE9fQ0xPRVhFQyk7CisgIGNsb2V4ZWNfZG9uZSA9IHJldHZhbCA+PSAwOworCisgIC8qIENoZWNrIGlmIGtlcm5lbCBzZWVtcyB0byBiZSB0b28gb2xkIHRvIGtub3cgcGlwZTIoKS4gV2UgYXNzdW1lCisgICAgIHRoYXQgaWYgcGlwZTIgaXMgYXZhaWxhYmxlLCBPX0NMT0VYRUMgaXMgdG9vLiAgKi8KKyAgaWYgKHJldHZhbCA8IDAgJiYgZXJybm8gPT0gRU5PU1lTKQorI2VuZGlmCisgICAgeworICAgICAgcmV0dmFsID0gcGlwZShwKTsKKyAgICB9CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgaWYgKHJldHZhbCA8IDApCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLAorCQkgICAgICBEQlVTX0VSUk9SX1NQQVdOX0ZBSUxFRCwKKwkJICAgICAgIkZhaWxlZCB0byBjcmVhdGUgcGlwZSBmb3IgY29tbXVuaWNhdGluZyB3aXRoIGNoaWxkIHByb2Nlc3MgKCVzKSIsCisJCSAgICAgIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworI2lmZGVmIEhBVkVfUElQRTIKKyAgaWYgKCFjbG9leGVjX2RvbmUpCisjZW5kaWYKKyAgICB7CisgICAgICBfZGJ1c19mZF9zZXRfY2xvc2Vfb25fZXhlYyAocFswXSk7CisgICAgICBfZGJ1c19mZF9zZXRfY2xvc2Vfb25fZXhlYyAocFsxXSk7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorZG9fd3JpdGUgKGludCBmZCwgY29uc3Qgdm9pZCAqYnVmLCBzaXplX3QgY291bnQpCit7CisgIHNpemVfdCBieXRlc193cml0dGVuOworICBpbnQgcmV0OworICAKKyAgYnl0ZXNfd3JpdHRlbiA9IDA7CisgIAorIGFnYWluOgorICAKKyAgcmV0ID0gd3JpdGUgKGZkLCAoKGNvbnN0IGNoYXIqKWJ1ZikgKyBieXRlc193cml0dGVuLCBjb3VudCAtIGJ5dGVzX3dyaXR0ZW4pOworCisgIGlmIChyZXQgPCAwKQorICAgIHsKKyAgICAgIGlmIChlcnJubyA9PSBFSU5UUikKKyAgICAgICAgZ290byBhZ2FpbjsKKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJGYWlsZWQgdG8gd3JpdGUgZGF0YSB0byBwaXBlISIpOworICAgICAgICAgIGV4aXQgKDEpOyAvKiBnaXZlIHVwLCB3ZSBzdWNrICovCisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICBieXRlc193cml0dGVuICs9IHJldDsKKyAgCisgIGlmIChieXRlc193cml0dGVuIDwgY291bnQpCisgICAgZ290byBhZ2FpbjsKK30KKworc3RhdGljIHZvaWQgd3JpdGVfZXJyX2FuZF9leGl0IChpbnQgZmQsIGludCBtc2cpIF9EQlVTX0dOVUNfTk9SRVRVUk47CisKK3N0YXRpYyB2b2lkCit3cml0ZV9lcnJfYW5kX2V4aXQgKGludCBmZCwgaW50IG1zZykKK3sKKyAgaW50IGVuID0gZXJybm87CisKKyAgZG9fd3JpdGUgKGZkLCAmbXNnLCBzaXplb2YgKG1zZykpOworICBkb193cml0ZSAoZmQsICZlbiwgc2l6ZW9mIChlbikpOworICAKKyAgZXhpdCAoMSk7Cit9CisKK3N0YXRpYyB2b2lkCit3cml0ZV9waWQgKGludCBmZCwgcGlkX3QgcGlkKQoreworICBpbnQgbXNnID0gQ0hJTERfUElEOworICAKKyAgZG9fd3JpdGUgKGZkLCAmbXNnLCBzaXplb2YgKG1zZykpOworICBkb193cml0ZSAoZmQsICZwaWQsIHNpemVvZiAocGlkKSk7Cit9CisKK3N0YXRpYyB2b2lkIHdyaXRlX3N0YXR1c19hbmRfZXhpdCAoaW50IGZkLCBpbnQgc3RhdHVzKSBfREJVU19HTlVDX05PUkVUVVJOOworCitzdGF0aWMgdm9pZAord3JpdGVfc3RhdHVzX2FuZF9leGl0IChpbnQgZmQsIGludCBzdGF0dXMpCit7CisgIGludCBtc2cgPSBDSElMRF9FWElURUQ7CisgIAorICBkb193cml0ZSAoZmQsICZtc2csIHNpemVvZiAobXNnKSk7CisgIGRvX3dyaXRlIChmZCwgJnN0YXR1cywgc2l6ZW9mIChzdGF0dXMpKTsKKyAgCisgIGV4aXQgKDApOworfQorCitzdGF0aWMgdm9pZCBkb19leGVjIChpbnQgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkX2Vycl9yZXBvcnRfZmQsCisgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICAgICAgICogY29uc3QgKmFyZ3YsCisgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICAgICAgICogY29uc3QgKmVudnAsCisgICAgICAgICAgICAgICAgICAgICBEQnVzU3Bhd25DaGlsZFNldHVwRnVuYyAgIGNoaWxkX3NldHVwLAorICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICp1c2VyX2RhdGEpIF9EQlVTX0dOVUNfTk9SRVRVUk47CisKK3N0YXRpYyB2b2lkCitkb19leGVjIChpbnQgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkX2Vycl9yZXBvcnRfZmQsCisJIGNoYXIgICAgICAgICAgICAgKiBjb25zdCAqYXJndiwKKwkgY2hhciAgICAgICAgICAgICAqIGNvbnN0ICplbnZwLAorCSBEQnVzU3Bhd25DaGlsZFNldHVwRnVuYyAgIGNoaWxkX3NldHVwLAorCSB2b2lkICAgICAgICAgICAgICAgICAgICAgKnVzZXJfZGF0YSkKK3sKKyNpZmRlZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworICBpbnQgaSwgbWF4X29wZW47CisjZW5kaWYKKworICBfZGJ1c192ZXJib3NlX3Jlc2V0ICgpOworICBfZGJ1c192ZXJib3NlICgiQ2hpbGQgcHJvY2VzcyBoYXMgUElEICIgREJVU19QSURfRk9STUFUICJcbiIsCisgICAgICAgICAgICAgICAgIF9kYnVzX2dldHBpZCAoKSk7CisgIAorICBpZiAoY2hpbGRfc2V0dXApCisgICAgKCogY2hpbGRfc2V0dXApICh1c2VyX2RhdGEpOworCisjaWZkZWYgREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMKKyAgbWF4X29wZW4gPSBzeXNjb25mIChfU0NfT1BFTl9NQVgpOworICAKKyAgZm9yIChpID0gMzsgaSA8IG1heF9vcGVuOyBpKyspCisgICAgeworICAgICAgaW50IHJldHZhbDsKKworICAgICAgaWYgKGkgPT0gY2hpbGRfZXJyX3JlcG9ydF9mZCkKKyAgICAgICAgY29udGludWU7CisgICAgICAKKyAgICAgIHJldHZhbCA9IGZjbnRsIChpLCBGX0dFVEZEKTsKKworICAgICAgaWYgKHJldHZhbCAhPSAtMSAmJiAhKHJldHZhbCAmIEZEX0NMT0VYRUMpKQorICAgICAgICBfZGJ1c193YXJuICgiRmQgJWQgZGlkIG5vdCBoYXZlIHRoZSBjbG9zZS1vbi1leGVjIGZsYWcgc2V0ISIsIGkpOworICAgIH0KKyNlbmRpZgorCisgIGlmIChlbnZwID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0IChlbnZpcm9uICE9IE5VTEwpOworCisgICAgICBlbnZwID0gZW52aXJvbjsKKyAgICB9CisgIAorICBleGVjdmUgKGFyZ3ZbMF0sIGFyZ3YsIGVudnApOworICAKKyAgLyogRXhlYyBmYWlsZWQgKi8KKyAgd3JpdGVfZXJyX2FuZF9leGl0IChjaGlsZF9lcnJfcmVwb3J0X2ZkLAorICAgICAgICAgICAgICAgICAgICAgIENISUxEX0VYRUNfRkFJTEVEKTsKK30KKworc3RhdGljIHZvaWQKK2NoZWNrX2JhYnlzaXRfZXZlbnRzIChwaWRfdCBncmFuZGNoaWxkX3BpZCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgICBwYXJlbnRfcGlwZSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgICByZXZlbnRzKQoreworICBwaWRfdCByZXQ7CisgIGludCBzdGF0dXM7CisgIAorICBkbworICAgIHsKKyAgICAgIHJldCA9IHdhaXRwaWQgKGdyYW5kY2hpbGRfcGlkLCAmc3RhdHVzLCBXTk9IQU5HKTsKKyAgICAgIC8qIFRoZSBtYW4gcGFnZSBzYXlzIEVJTlRSIGNhbid0IGhhcHBlbiB3aXRoIFdOT0hBTkcsCisgICAgICAgKiBidXQgdGhlcmUgYXJlIHJlcG9ydHMgb2YgaXQgKG1heWJlIG9ubHkgd2l0aCB2YWxncmluZD8pCisgICAgICAgKi8KKyAgICB9CisgIHdoaWxlIChyZXQgPCAwICYmIGVycm5vID09IEVJTlRSKTsKKworICBpZiAocmV0ID09IDApCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIm5vIGNoaWxkIGV4aXRlZFxuIik7CisgICAgICAKKyAgICAgIDsgLyogbm8gY2hpbGQgZXhpdGVkICovCisgICAgfQorICBlbHNlIGlmIChyZXQgPCAwKQorICAgIHsKKyAgICAgIC8qIFRoaXMgaXNuJ3Qgc3VwcG9zZWQgdG8gaGFwcGVuLiAqLworICAgICAgX2RidXNfd2FybiAoInVuZXhwZWN0ZWQgd2FpdHBpZCgpIGZhaWx1cmUgaW4gY2hlY2tfYmFieXNpdF9ldmVudHMoKTogJXMiLAorICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisgIGVsc2UgaWYgKHJldCA9PSBncmFuZGNoaWxkX3BpZCkKKyAgICB7CisgICAgICAvKiBDaGlsZCBleGl0ZWQgKi8KKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJyZWFwZWQgY2hpbGQgcGlkICVsZFxuIiwgKGxvbmcpIHJldCk7CisgICAgICAKKyAgICAgIHdyaXRlX3N0YXR1c19hbmRfZXhpdCAocGFyZW50X3BpcGUsIHN0YXR1cyk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgX2RidXNfd2FybiAoIndhaXRwaWQoKSByZWFwZWQgcGlkICVkIHRoYXQgd2UndmUgbmV2ZXIgaGVhcmQgb2YiLAorICAgICAgICAgICAgICAgICAgKGludCkgcmV0KTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICBpZiAocmV2ZW50cyAmIF9EQlVTX1BPTExJTikKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiYmFieXNpdHRlciBnb3QgUE9MTElOIGZyb20gcGFyZW50IHBpcGVcbiIpOworICAgIH0KKworICBpZiAocmV2ZW50cyAmIChfREJVU19QT0xMRVJSIHwgX0RCVVNfUE9MTEhVUCkpCisgICAgeworICAgICAgLyogUGFyZW50IGlzIGdvbmUsIHNvIHdlIGp1c3QgZXhpdCAqLworICAgICAgX2RidXNfdmVyYm9zZSAoImJhYnlzaXR0ZXIgZ290IFBPTExFUlIgb3IgUE9MTEhVUCBmcm9tIHBhcmVudFxuIik7CisgICAgICBleGl0ICgwKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgYmFieXNpdF9zaWdjaGxkX3BpcGUgPSAtMTsKKworc3RhdGljIHZvaWQKK2JhYnlzaXRfc2lnbmFsX2hhbmRsZXIgKGludCBzaWdubykKK3sKKyAgLyogU2lnbmFsIGhhbmRsZXJzIHRoYXQgbWlnaHQgc2V0IGVycm5vIG11c3Qgc2F2ZSBhbmQgcmVzdG9yZSB0aGUgZXJybm8KKyAgICogdGhhdCB0aGUgaW50ZXJydXB0ZWQgZnVuY3Rpb24gbWlnaHQgaGF2ZSBiZWVuIHJlbHlpbmcgb24uICovCisgIGludCBzYXZlZF9lcnJubyA9IGVycm5vOworICBjaGFyIGIgPSAnXDAnOworCisgYWdhaW46CisgIGlmICh3cml0ZSAoYmFieXNpdF9zaWdjaGxkX3BpcGUsICZiLCAxKSA8PSAwKSAKKyAgICBpZiAoZXJybm8gPT0gRUlOVFIpCisgICAgICBnb3RvIGFnYWluOworCisgIGVycm5vID0gc2F2ZWRfZXJybm87Cit9CisKK3N0YXRpYyB2b2lkIGJhYnlzaXQgKHBpZF90IGdyYW5kY2hpbGRfcGlkLAorICAgICAgICAgICAgICAgICAgICAgaW50ICAgcGFyZW50X3BpcGUpIF9EQlVTX0dOVUNfTk9SRVRVUk47CisKK3N0YXRpYyB2b2lkCitiYWJ5c2l0IChwaWRfdCBncmFuZGNoaWxkX3BpZCwKKyAgICAgICAgIGludCAgIHBhcmVudF9waXBlKQoreworICBpbnQgc2lnY2hsZF9waXBlWzJdOworCisgIC8qIFdlIGRvbid0IGV4ZWMsIHNvIHdlIGtlZXAgcGFyZW50IHN0YXRlLCBzdWNoIGFzIHRoZSBwaWQgdGhhdAorICAgKiBfZGJ1c192ZXJib3NlKCkgdXNlcy4gUmVzZXQgdGhlIHBpZCBoZXJlLgorICAgKi8KKyAgX2RidXNfdmVyYm9zZV9yZXNldCAoKTsKKyAgCisgIC8qIEkgdGhvdWdodCBTSUdDSExEIHdvdWxkIGp1c3Qgd2FrZSB1cCB0aGUgcG9sbCwgYnV0CisgICAqIHRoYXQgZGlkbid0IHNlZW0gdG8gd29yaywgc28gYWRkZWQgdGhpcyBwaXBlLgorICAgKiBQcm9iYWJseSB0aGUgcGlwZSBpcyBtb3JlIGxpa2VseSB0byB3b3JrIG9uIGJ1c3RlZAorICAgKiBvcGVyYXRpbmcgc3lzdGVtcyBhbnlob3cuCisgICAqLworICBpZiAocGlwZSAoc2lnY2hsZF9waXBlKSA8IDApCisgICAgeworICAgICAgX2RidXNfd2FybiAoIk5vdCBlbm91Z2ggZmlsZSBkZXNjcmlwdG9ycyB0byBjcmVhdGUgcGlwZSBpbiBiYWJ5c2l0dGVyIHByb2Nlc3MiKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICBiYWJ5c2l0X3NpZ2NobGRfcGlwZSA9IHNpZ2NobGRfcGlwZVtXUklURV9FTkRdOworCisgIF9kYnVzX3NldF9zaWduYWxfaGFuZGxlciAoU0lHQ0hMRCwgYmFieXNpdF9zaWduYWxfaGFuZGxlcik7CisgIAorICB3cml0ZV9waWQgKHBhcmVudF9waXBlLCBncmFuZGNoaWxkX3BpZCk7CisKKyAgY2hlY2tfYmFieXNpdF9ldmVudHMgKGdyYW5kY2hpbGRfcGlkLCBwYXJlbnRfcGlwZSwgMCk7CisKKyAgd2hpbGUgKFRSVUUpCisgICAgeworICAgICAgREJ1c1BvbGxGRCBwZmRzWzJdOworICAgICAgCisgICAgICBwZmRzWzBdLmZkID0gcGFyZW50X3BpcGU7CisgICAgICBwZmRzWzBdLmV2ZW50cyA9IF9EQlVTX1BPTExJTjsKKyAgICAgIHBmZHNbMF0ucmV2ZW50cyA9IDA7CisKKyAgICAgIHBmZHNbMV0uZmQgPSBzaWdjaGxkX3BpcGVbUkVBRF9FTkRdOworICAgICAgcGZkc1sxXS5ldmVudHMgPSBfREJVU19QT0xMSU47CisgICAgICBwZmRzWzFdLnJldmVudHMgPSAwOworICAgICAgCisgICAgICBpZiAoX2RidXNfcG9sbCAocGZkcywgX0RCVVNfTl9FTEVNRU5UUyAocGZkcyksIC0xKSA8IDAgJiYgZXJybm8gIT0gRUlOVFIpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c193YXJuICgiX2RidXNfcG9sbCgpIGVycm9yOiAlcyIsIHN0cmVycm9yIChlcnJubykpOworICAgICAgICAgIGV4aXQgKDEpOworICAgICAgICB9CisKKyAgICAgIGlmIChwZmRzWzBdLnJldmVudHMgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgIGNoZWNrX2JhYnlzaXRfZXZlbnRzIChncmFuZGNoaWxkX3BpZCwgcGFyZW50X3BpcGUsIHBmZHNbMF0ucmV2ZW50cyk7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHBmZHNbMV0ucmV2ZW50cyAmIF9EQlVTX1BPTExJTikKKyAgICAgICAgeworICAgICAgICAgIGNoYXIgYjsKKyAgICAgICAgICBpZiAocmVhZCAoc2lnY2hsZF9waXBlW1JFQURfRU5EXSwgJmIsIDEpID09IC0xKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvKiBpZ25vcmUgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAvKiBkbyB3YWl0cGlkIGNoZWNrICovCisgICAgICAgICAgY2hlY2tfYmFieXNpdF9ldmVudHMgKGdyYW5kY2hpbGRfcGlkLCBwYXJlbnRfcGlwZSwgMCk7CisgICAgICAgIH0KKyAgICB9CisgIAorICBleGl0ICgxKTsKK30KKworLyoqCisgKiBTcGF3bnMgYSBuZXcgcHJvY2Vzcy4KKyAqCisgKiBPbiBVbml4IHBsYXRmb3JtcywgdGhlIGNoaWxkX3NldHVwIGZ1bmN0aW9uIGlzIHBhc3NlZCB0aGUgZ2l2ZW4KKyAqIHVzZXJfZGF0YSBhbmQgaXMgcnVuIGluIHRoZSBjaGlsZCBhZnRlciBmb3JrKCkgYnV0IGJlZm9yZSBjYWxsaW5nIGV4ZWMoKS4KKyAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gY2hhbmdlIHVpZCwgcmVzb3VyY2UgbGltaXRzIGFuZCBzbyBvbi4KKyAqIE9uIFdpbmRvd3MsIHRoaXMgZnVuY3Rpb25hbGl0eSBkb2VzIG5vdCBmaXQgdGhlIG11bHRpLXByb2Nlc3NpbmcgbW9kZWwKKyAqIChXaW5kb3dzIGRvZXMgdGhlIGVxdWl2YWxlbnQgb2YgZm9yaygpIGFuZCBleGVjKCkgaW4gYSBzaW5nbGUgQVBJIGNhbGwpLAorICogYW5kIHRoZSBjaGlsZF9zZXR1cCBmdW5jdGlvbiBhbmQgaXRzIHVzZXJfZGF0YSBhcmUgaWdub3JlZC4KKyAqCisgKiBBbHNvIGNyZWF0ZXMgYSAiYmFieXNpdHRlciIgd2hpY2ggdHJhY2tzIHRoZSBzdGF0dXMgb2YgdGhlCisgKiBjaGlsZCBwcm9jZXNzLCBhZHZpc2luZyB0aGUgcGFyZW50IGlmIHRoZSBjaGlsZCBleGl0cy4KKyAqIElmIHRoZSBzcGF3biBmYWlscywgbm8gYmFieXNpdHRlciBpcyBjcmVhdGVkLgorICogSWYgc2l0dGVyX3AgaXMgI05VTEwsIG5vIGJhYnlzaXR0ZXIgaXMga2VwdC4KKyAqCisgKiBAcGFyYW0gc2l0dGVyX3AgcmV0dXJuIGxvY2F0aW9uIGZvciBiYWJ5c2l0dGVyIG9yICNOVUxMCisgKiBAcGFyYW0gbG9nX25hbWUgdGhlIG5hbWUgdW5kZXIgd2hpY2ggdG8gbG9nIG1lc3NhZ2VzIGFib3V0IHRoaXMgcHJvY2VzcyBiZWluZyBzcGF3bmVkCisgKiBAcGFyYW0gYXJndiB0aGUgZXhlY3V0YWJsZSBhbmQgYXJndW1lbnRzCisgKiBAcGFyYW0gZW52IHRoZSBlbnZpcm9ubWVudCwgb3IgI05VTEwgdG8gY29weSB0aGUgcGFyZW50J3MKKyAqIEBwYXJhbSBjaGlsZF9zZXR1cCBmdW5jdGlvbiB0byBjYWxsIGluIGNoaWxkIHByZS1leGVjKCkKKyAqIEBwYXJhbSB1c2VyX2RhdGEgdXNlciBkYXRhIGZvciBzZXR1cCBmdW5jdGlvbgorICogQHBhcmFtIGVycm9yIGVycm9yIG9iamVjdCB0byBiZSBmaWxsZWQgaW4gaWYgZnVuY3Rpb24gZmFpbHMKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MsICNGQUxTRSBpZiBlcnJvciBpcyBmaWxsZWQgaW4KKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3NwYXduX2FzeW5jX3dpdGhfYmFieXNpdHRlciAoREJ1c0JhYnlzaXR0ZXIgICAgICAgICAgKipzaXR0ZXJfcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgICAgICAgICpsb2dfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAgICAgICAqIGNvbnN0ICphcmd2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICAgICAgICAgICAgICAqKmVudiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1NwYXduRmxhZ3MgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1NwYXduQ2hpbGRTZXR1cEZ1bmMgICBjaGlsZF9zZXR1cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICp1c2VyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICAgICAgICAqZXJyb3IpCit7CisgIERCdXNCYWJ5c2l0dGVyICpzaXR0ZXI7CisgIGludCBjaGlsZF9lcnJfcmVwb3J0X3BpcGVbMl0gPSB7IC0xLCAtMSB9OworICBEQnVzU29ja2V0IGJhYnlzaXR0ZXJfcGlwZVsyXSA9IHsgREJVU19TT0NLRVRfSU5JVCwgREJVU19TT0NLRVRfSU5JVCB9OworICBwaWRfdCBwaWQ7CisjaWZkZWYgSEFWRV9TWVNURU1ECisgIGludCBmZF9vdXQgPSAtMTsKKyAgaW50IGZkX2VyciA9IC0xOworI2VuZGlmCisgIAorICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgX2RidXNfYXNzZXJ0IChhcmd2WzBdICE9IE5VTEwpOworCisgIGlmIChzaXR0ZXJfcCAhPSBOVUxMKQorICAgICpzaXR0ZXJfcCA9IE5VTEw7CisKKyAgc2l0dGVyID0gTlVMTDsKKworICBzaXR0ZXIgPSBfZGJ1c19iYWJ5c2l0dGVyX25ldyAoKTsKKyAgaWYgKHNpdHRlciA9PSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBzaXR0ZXItPmxvZ19uYW1lID0gX2RidXNfc3RyZHVwIChsb2dfbmFtZSk7CisgIGlmIChzaXR0ZXItPmxvZ19uYW1lID09IE5VTEwgJiYgbG9nX25hbWUgIT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgIGdvdG8gY2xlYW51cF9hbmRfZmFpbDsKKyAgICB9CisKKyAgaWYgKHNpdHRlci0+bG9nX25hbWUgPT0gTlVMTCkKKyAgICBzaXR0ZXItPmxvZ19uYW1lID0gX2RidXNfc3RyZHVwIChhcmd2WzBdKTsKKworICBpZiAoc2l0dGVyLT5sb2dfbmFtZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgZ290byBjbGVhbnVwX2FuZF9mYWlsOworICAgIH0KKyAgCisgIGlmICghbWFrZV9waXBlIChjaGlsZF9lcnJfcmVwb3J0X3BpcGUsIGVycm9yKSkKKyAgICBnb3RvIGNsZWFudXBfYW5kX2ZhaWw7CisKKyAgaWYgKCFfZGJ1c19zb2NrZXRwYWlyICgmYmFieXNpdHRlcl9waXBlWzBdLCAmYmFieXNpdHRlcl9waXBlWzFdLCBUUlVFLCBlcnJvcikpCisgICAgZ290byBjbGVhbnVwX2FuZF9mYWlsOworCisgIC8qIFNldHRpbmcgdXAgdGhlIGJhYnlzaXR0ZXIgaXMgb25seSB1c2VmdWwgaW4gdGhlIHBhcmVudCwKKyAgICogYnV0IHdlIGRvbid0IHdhbnQgdG8gcnVuIG91dCBvZiBtZW1vcnkgYW5kIGZhaWwKKyAgICogYWZ0ZXIgd2UndmUgYWxyZWFkeSBmb3JrZWQsIHNpbmNlIHRoZW4gd2UnZCBsZWFrCisgICAqIGNoaWxkIHByb2Nlc3NlcyBldmVyeXdoZXJlLgorICAgKi8KKyAgc2l0dGVyLT5lcnJvcl93YXRjaCA9IF9kYnVzX3dhdGNoX25ldyAoY2hpbGRfZXJyX3JlcG9ydF9waXBlW1JFQURfRU5EXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19XQVRDSF9SRUFEQUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSwgaGFuZGxlX3dhdGNoLCBzaXR0ZXIsIE5VTEwpOworICBpZiAoc2l0dGVyLT5lcnJvcl93YXRjaCA9PSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgZ290byBjbGVhbnVwX2FuZF9mYWlsOworICAgIH0KKyAgICAgICAgCisgIGlmICghX2RidXNfd2F0Y2hfbGlzdF9hZGRfd2F0Y2ggKHNpdHRlci0+d2F0Y2hlcywgIHNpdHRlci0+ZXJyb3Jfd2F0Y2gpKQorICAgIHsKKyAgICAgIC8qIHdlIG5lZWQgdG8gZnJlZSBpdCBlYXJseSBzbyB0aGUgZGVzdHJ1Y3RvciB3b24ndCB0cnkgdG8gcmVtb3ZlIGl0CisgICAgICAgKiB3aXRob3V0IGl0IGhhdmluZyBiZWVuIGFkZGVkLCB3aGljaCBEQnVzTG9vcCBkb2Vzbid0IGFsbG93ICovCisgICAgICBfZGJ1c193YXRjaF9pbnZhbGlkYXRlIChzaXR0ZXItPmVycm9yX3dhdGNoKTsKKyAgICAgIF9kYnVzX3dhdGNoX3VucmVmIChzaXR0ZXItPmVycm9yX3dhdGNoKTsKKyAgICAgIHNpdHRlci0+ZXJyb3Jfd2F0Y2ggPSBOVUxMOworCisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgIGdvdG8gY2xlYW51cF9hbmRfZmFpbDsKKyAgICB9CisgICAgICAKKyAgc2l0dGVyLT5zaXR0ZXJfd2F0Y2ggPSBfZGJ1c193YXRjaF9uZXcgKGJhYnlzaXR0ZXJfcGlwZVswXS5mZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfV0FUQ0hfUkVBREFCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFLCBoYW5kbGVfd2F0Y2gsIHNpdHRlciwgTlVMTCk7CisgIGlmIChzaXR0ZXItPnNpdHRlcl93YXRjaCA9PSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgZ290byBjbGVhbnVwX2FuZF9mYWlsOworICAgIH0KKyAgICAgIAorICBpZiAoIV9kYnVzX3dhdGNoX2xpc3RfYWRkX3dhdGNoIChzaXR0ZXItPndhdGNoZXMsICBzaXR0ZXItPnNpdHRlcl93YXRjaCkpCisgICAgeworICAgICAgLyogd2UgbmVlZCB0byBmcmVlIGl0IGVhcmx5IHNvIHRoZSBkZXN0cnVjdG9yIHdvbid0IHRyeSB0byByZW1vdmUgaXQKKyAgICAgICAqIHdpdGhvdXQgaXQgaGF2aW5nIGJlZW4gYWRkZWQsIHdoaWNoIERCdXNMb29wIGRvZXNuJ3QgYWxsb3cgKi8KKyAgICAgIF9kYnVzX3dhdGNoX2ludmFsaWRhdGUgKHNpdHRlci0+c2l0dGVyX3dhdGNoKTsKKyAgICAgIF9kYnVzX3dhdGNoX3VucmVmIChzaXR0ZXItPnNpdHRlcl93YXRjaCk7CisgICAgICBzaXR0ZXItPnNpdHRlcl93YXRjaCA9IE5VTEw7CisKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgZ290byBjbGVhbnVwX2FuZF9mYWlsOworICAgIH0KKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworI2lmZGVmIEhBVkVfU1lTVEVNRAorICBpZiAoZmxhZ3MgJiBEQlVTX1NQQVdOX1JFRElSRUNUX09VVFBVVCkKKyAgICB7CisgICAgICAvKiBUaGlzIG1heSBmYWlsLCBidXQgaXQncyBub3QgY3JpdGljYWwuCisgICAgICAgKiBJbiBwYXJ0aWN1bGFyLCBpZiB3ZSB3ZXJlIGNvbXBpbGVkIHdpdGggam91cm5hbGQgc3VwcG9ydCBidXQgYXJlIG5vdworICAgICAgICogcnVubmluZyBvbiBhIG5vbi1zeXN0ZW1kIHN5c3RlbSwgdGhpcyBpcyBnb2luZyB0byBmYWlsLCBzbyB3ZQorICAgICAgICogaGF2ZSB0byBjb3BlIGdyYWNlZnVsbHkuICovCisgICAgICBmZF9vdXQgPSBzZF9qb3VybmFsX3N0cmVhbV9mZCAoc2l0dGVyLT5sb2dfbmFtZSwgTE9HX0lORk8sIEZBTFNFKTsKKyAgICAgIGZkX2VyciA9IHNkX2pvdXJuYWxfc3RyZWFtX2ZkIChzaXR0ZXItPmxvZ19uYW1lLCBMT0dfV0FSTklORywgRkFMU0UpOworICAgIH0KKyNlbmRpZgorCisgIHBpZCA9IGZvcmsgKCk7CisgIAorICBpZiAocGlkIDwgMCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsCisJCSAgICAgIERCVVNfRVJST1JfU1BBV05fRk9SS19GQUlMRUQsCisJCSAgICAgICJGYWlsZWQgdG8gZm9yayAoJXMpIiwKKwkJICAgICAgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICBnb3RvIGNsZWFudXBfYW5kX2ZhaWw7CisgICAgfQorICBlbHNlIGlmIChwaWQgPT0gMCkKKyAgICB7CisgICAgICAvKiBJbW1lZGlhdGUgY2hpbGQsIHRoaXMgaXMgdGhlIGJhYnlzaXR0ZXIgcHJvY2Vzcy4gKi8KKyAgICAgIGludCBncmFuZGNoaWxkX3BpZDsKKyAgICAgIAorICAgICAgLyogQmUgc3VyZSB3ZSBjcmFzaCBpZiB0aGUgcGFyZW50IGV4aXRzCisgICAgICAgKiBhbmQgd2Ugd3JpdGUgdG8gdGhlIGVycl9yZXBvcnRfcGlwZQorICAgICAgICovCisgICAgICBzaWduYWwgKFNJR1BJUEUsIFNJR19ERkwpOworCisgICAgICAvKiBDbG9zZSB0aGUgcGFyZW50J3MgZW5kIG9mIHRoZSBwaXBlcy4gKi8KKyAgICAgIGNsb3NlX2FuZF9pbnZhbGlkYXRlICgmY2hpbGRfZXJyX3JlcG9ydF9waXBlW1JFQURfRU5EXSk7CisgICAgICBjbG9zZV9hbmRfaW52YWxpZGF0ZSAoJmJhYnlzaXR0ZXJfcGlwZVswXS5mZCk7CisgICAgICAKKyAgICAgIC8qIENyZWF0ZSB0aGUgY2hpbGQgdGhhdCB3aWxsIGV4ZWMgKCkgKi8KKyAgICAgIGdyYW5kY2hpbGRfcGlkID0gZm9yayAoKTsKKyAgICAgIAorICAgICAgaWYgKGdyYW5kY2hpbGRfcGlkIDwgMCkKKwl7CisJICB3cml0ZV9lcnJfYW5kX2V4aXQgKGJhYnlzaXR0ZXJfcGlwZVsxXS5mZCwKKwkJCSAgICAgIENISUxEX0ZPUktfRkFJTEVEKTsKKyAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJHb3QgdG8gY29kZSBhZnRlciB3cml0ZV9lcnJfYW5kX2V4aXQoKSIpOworCX0KKyAgICAgIGVsc2UgaWYgKGdyYW5kY2hpbGRfcGlkID09IDApCisgICAgICB7CisjaWZkZWYgX19saW51eF9fCisgICAgICAgICAgaW50IGZkID0gLTE7CisKKyNpZmRlZiBPX0NMT0VYRUMKKyAgICAgICAgICBmZCA9IG9wZW4gKCIvcHJvYy9zZWxmL29vbV9zY29yZV9hZGoiLCBPX1dST05MWSB8IE9fQ0xPRVhFQyk7CisjZW5kaWYKKworICAgICAgICAgIGlmIChmZCA8IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGZkID0gb3BlbiAoIi9wcm9jL3NlbGYvb29tX3Njb3JlX2FkaiIsIE9fV1JPTkxZKTsKKyAgICAgICAgICAgICAgX2RidXNfZmRfc2V0X2Nsb3NlX29uX2V4ZWMgKGZkKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChmZCA+PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAod3JpdGUgKGZkLCAiMCIsIHNpemVvZiAoY2hhcikpIDwgMCkKKyAgICAgICAgICAgICAgICBfZGJ1c193YXJuICgid3JpdGluZyBvb21fc2NvcmVfYWRqIGVycm9yOiAlcyIsIHN0cmVycm9yIChlcnJubykpOworICAgICAgICAgICAgICBfZGJ1c19jbG9zZSAoZmQsIE5VTEwpOworICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgLyogR28gYmFjayB0byBpZ25vcmluZyBTSUdQSVBFLCBzaW5jZSBpdCdzIGV2aWwKKyAgICAgICAgICAgKi8KKyAgICAgICAgICBzaWduYWwgKFNJR1BJUEUsIFNJR19JR04pOworCisgICAgICAgICAgY2xvc2VfYW5kX2ludmFsaWRhdGUgKCZiYWJ5c2l0dGVyX3BpcGVbMV0uZmQpOworI2lmZGVmIEhBVkVfU1lTVEVNRAorCSAgLyogbG9nIHRvIHN5c3RlbWQgam91cm5hbCBpZiBwb3NzaWJsZSAqLworCSAgaWYgKGZkX291dCA+PSAwKQorICAgICAgICAgICAgZHVwMiAoZmRfb3V0LCBTVERPVVRfRklMRU5PKTsKKwkgIGlmIChmZF9lcnIgPj0gMCkKKyAgICAgICAgICAgIGR1cDIgKGZkX2VyciwgU1RERVJSX0ZJTEVOTyk7CisgICAgICAgICAgY2xvc2VfYW5kX2ludmFsaWRhdGUgKCZmZF9vdXQpOworICAgICAgICAgIGNsb3NlX2FuZF9pbnZhbGlkYXRlICgmZmRfZXJyKTsKKyNlbmRpZgorCSAgZG9fZXhlYyAoY2hpbGRfZXJyX3JlcG9ydF9waXBlW1dSSVRFX0VORF0sCisJCSAgIGFyZ3YsCisJCSAgIGVudiwKKwkJICAgY2hpbGRfc2V0dXAsIHVzZXJfZGF0YSk7CisgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiR290IHRvIGNvZGUgYWZ0ZXIgZXhlYygpIC0gc2hvdWxkIGhhdmUgZXhpdGVkIG9uIGVycm9yIik7CisJfQorICAgICAgZWxzZQorCXsKKyAgICAgICAgICBjbG9zZV9hbmRfaW52YWxpZGF0ZSAoJmNoaWxkX2Vycl9yZXBvcnRfcGlwZVtXUklURV9FTkRdKTsKKyNpZmRlZiBIQVZFX1NZU1RFTUQKKyAgICAgICAgICBjbG9zZV9hbmRfaW52YWxpZGF0ZSAoJmZkX291dCk7CisgICAgICAgICAgY2xvc2VfYW5kX2ludmFsaWRhdGUgKCZmZF9lcnIpOworI2VuZGlmCisgICAgICAgICAgYmFieXNpdCAoZ3JhbmRjaGlsZF9waWQsIGJhYnlzaXR0ZXJfcGlwZVsxXS5mZCk7CisgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiR290IHRvIGNvZGUgYWZ0ZXIgYmFieXNpdCgpIik7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsgICAgICAKKyAgICAgIC8qIENsb3NlIHRoZSB1bmNhcmVkLWFib3V0IGVuZHMgb2YgdGhlIHBpcGVzICovCisgICAgICBjbG9zZV9hbmRfaW52YWxpZGF0ZSAoJmNoaWxkX2Vycl9yZXBvcnRfcGlwZVtXUklURV9FTkRdKTsKKyAgICAgIGNsb3NlX2FuZF9pbnZhbGlkYXRlICgmYmFieXNpdHRlcl9waXBlWzFdLmZkKTsKKyNpZmRlZiBIQVZFX1NZU1RFTUQKKyAgICAgIGNsb3NlX2FuZF9pbnZhbGlkYXRlICgmZmRfb3V0KTsKKyAgICAgIGNsb3NlX2FuZF9pbnZhbGlkYXRlICgmZmRfZXJyKTsKKyNlbmRpZgorCisgICAgICBzaXR0ZXItPnNvY2tldF90b19iYWJ5c2l0dGVyID0gYmFieXNpdHRlcl9waXBlWzBdOworICAgICAgYmFieXNpdHRlcl9waXBlWzBdLmZkID0gLTE7CisgICAgICAKKyAgICAgIHNpdHRlci0+ZXJyb3JfcGlwZV9mcm9tX2NoaWxkID0gY2hpbGRfZXJyX3JlcG9ydF9waXBlW1JFQURfRU5EXTsKKyAgICAgIGNoaWxkX2Vycl9yZXBvcnRfcGlwZVtSRUFEX0VORF0gPSAtMTsKKworICAgICAgc2l0dGVyLT5zaXR0ZXJfcGlkID0gcGlkOworCisgICAgICBpZiAoc2l0dGVyX3AgIT0gTlVMTCkKKyAgICAgICAgKnNpdHRlcl9wID0gc2l0dGVyOworICAgICAgZWxzZQorICAgICAgICBfZGJ1c19iYWJ5c2l0dGVyX3VucmVmIChzaXR0ZXIpOworCisgICAgICBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5IChlbnYpOworCisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgICAgIAorICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgY2xlYW51cF9hbmRfZmFpbDoKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgIAorICBjbG9zZV9hbmRfaW52YWxpZGF0ZSAoJmNoaWxkX2Vycl9yZXBvcnRfcGlwZVtSRUFEX0VORF0pOworICBjbG9zZV9hbmRfaW52YWxpZGF0ZSAoJmNoaWxkX2Vycl9yZXBvcnRfcGlwZVtXUklURV9FTkRdKTsKKyAgY2xvc2VfYW5kX2ludmFsaWRhdGUgKCZiYWJ5c2l0dGVyX3BpcGVbMF0uZmQpOworICBjbG9zZV9hbmRfaW52YWxpZGF0ZSAoJmJhYnlzaXR0ZXJfcGlwZVsxXS5mZCk7CisjaWZkZWYgSEFWRV9TWVNURU1ECisgIGNsb3NlX2FuZF9pbnZhbGlkYXRlICgmZmRfb3V0KTsKKyAgY2xvc2VfYW5kX2ludmFsaWRhdGUgKCZmZF9lcnIpOworI2VuZGlmCisKKyAgaWYgKHNpdHRlciAhPSBOVUxMKQorICAgIF9kYnVzX2JhYnlzaXR0ZXJfdW5yZWYgKHNpdHRlcik7CisgIAorICByZXR1cm4gRkFMU0U7Cit9CisKK3ZvaWQKK19kYnVzX2JhYnlzaXR0ZXJfc2V0X3Jlc3VsdF9mdW5jdGlvbiAgKERCdXNCYWJ5c2l0dGVyICAgICAgICAgICAgICpzaXR0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQmFieXNpdHRlckZpbmlzaGVkRnVuYyAgZmluaXNoZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAqdXNlcl9kYXRhKQoreworICBzaXR0ZXItPmZpbmlzaGVkX2NiID0gZmluaXNoZWQ7CisgIHNpdHRlci0+ZmluaXNoZWRfZGF0YSA9IHVzZXJfZGF0YTsKK30KKworLyoqIEB9ICovCisKK3ZvaWQKK19kYnVzX2JhYnlzaXR0ZXJfYmxvY2tfZm9yX2NoaWxkX2V4aXQgKERCdXNCYWJ5c2l0dGVyICpzaXR0ZXIpCit7CisgIHdoaWxlIChMSVZFX0NISUxEUkVOIChzaXR0ZXIpKQorICAgIGJhYnlzaXR0ZXJfaXRlcmF0aW9uIChzaXR0ZXIsIFRSVUUpOworfQpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLXNwYXduLmggYi9kYnVzL2RidXMtc3Bhd24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzQzMjRkCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLXNwYXduLmgKQEAgLTAsMCArMSw3NSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXNwYXduLmggV3JhcHBlciBhcm91bmQgZm9yay9leGVjCisgKiAKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMyAgUmVkIEhhdCwgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDAzIENvZGVGYWN0b3J5IEFCCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpZm5kZWYgREJVU19TUEFXTl9ICisjZGVmaW5lIERCVVNfU1BBV05fSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXN0cmluZy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1lcnJvcnMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtd2F0Y2guaD4KKworREJVU19CRUdJTl9ERUNMUworCit0eXBlZGVmIHZvaWQgKCogREJ1c1NwYXduQ2hpbGRTZXR1cEZ1bmMpICh2b2lkICp1c2VyX2RhdGEpOworCit0eXBlZGVmIHN0cnVjdCBEQnVzQmFieXNpdHRlciBEQnVzQmFieXNpdHRlcjsKKwordHlwZWRlZiB2b2lkICgqIERCdXNCYWJ5c2l0dGVyRmluaXNoZWRGdW5jKSAoREJ1c0JhYnlzaXR0ZXIgKnNpdHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICp1c2VyX2RhdGEpOworCit0eXBlZGVmIGVudW0geworICBEQlVTX1NQQVdOX1JFRElSRUNUX09VVFBVVCA9ICgxIDw8IDApLAorICBEQlVTX1NQQVdOX05PTkUgPSAwCit9IERCdXNTcGF3bkZsYWdzOworCitkYnVzX2Jvb2xfdCBfZGJ1c19zcGF3bl9hc3luY193aXRoX2JhYnlzaXR0ZXIgICAgIChEQnVzQmFieXNpdHRlciAgICAgICAgICAgKipzaXR0ZXJfcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICAgICAgICAgKmxvZ19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAgICAgICAgKiBjb25zdCAqYXJndiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICAgICAgICAgICAgICAqKmVudiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTcGF3bkZsYWdzICAgICAgICAgICAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1NwYXduQ2hpbGRTZXR1cEZ1bmMgICAgY2hpbGRfc2V0dXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICp1c2VyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAgICAgICAgICplcnJvcik7Cit2b2lkICAgICAgICBfZGJ1c19iYWJ5c2l0dGVyX3NldF9yZXN1bHRfZnVuY3Rpb24gIChEQnVzQmFieXNpdHRlciAgICAgICAgICAgICpzaXR0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQmFieXNpdHRlckZpbmlzaGVkRnVuYyBmaW5pc2hlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgKnVzZXJfZGF0YSk7CitEQnVzQmFieXNpdHRlciogX2RidXNfYmFieXNpdHRlcl9yZWYgICAgICAgICAgICAgIChEQnVzQmFieXNpdHRlciAgICAgICAgICAgICpzaXR0ZXIpOwordm9pZCAgICAgICAgX2RidXNfYmFieXNpdHRlcl91bnJlZiAgICAgICAgICAgICAgICAoREJ1c0JhYnlzaXR0ZXIgICAgICAgICAgICAqc2l0dGVyKTsKK3ZvaWQgICAgICAgIF9kYnVzX2JhYnlzaXR0ZXJfa2lsbF9jaGlsZCAgICAgICAgICAgKERCdXNCYWJ5c2l0dGVyICAgICAgICAgICAgKnNpdHRlcik7CitkYnVzX2Jvb2xfdCBfZGJ1c19iYWJ5c2l0dGVyX2dldF9jaGlsZF9leGl0ZWQgICAgIChEQnVzQmFieXNpdHRlciAgICAgICAgICAgICpzaXR0ZXIpOwordm9pZCAgICAgICAgX2RidXNfYmFieXNpdHRlcl9zZXRfY2hpbGRfZXhpdF9lcnJvciAoREJ1c0JhYnlzaXR0ZXIgICAgICAgICAgICAqc2l0dGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgICAgICAgICAqZXJyb3IpOworZGJ1c19ib29sX3QgX2RidXNfYmFieXNpdHRlcl9nZXRfY2hpbGRfZXhpdF9zdGF0dXMgKERCdXNCYWJ5c2l0dGVyICAgICAgICAgICAqc2l0dGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAqc3RhdHVzKTsKK2RidXNfYm9vbF90IF9kYnVzX2JhYnlzaXR0ZXJfc2V0X3dhdGNoX2Z1bmN0aW9ucyAgKERCdXNCYWJ5c2l0dGVyICAgICAgICAgICAgKnNpdHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNBZGRXYXRjaEZ1bmN0aW9uICAgICAgIGFkZF9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNSZW1vdmVXYXRjaEZ1bmN0aW9uICAgIHJlbW92ZV9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNXYXRjaFRvZ2dsZWRGdW5jdGlvbiAgIHRvZ2dsZWRfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgICAgICAgICAgZnJlZV9kYXRhX2Z1bmN0aW9uKTsKK3ZvaWQgICAgICAgIF9kYnVzX2JhYnlzaXR0ZXJfYmxvY2tfZm9yX2NoaWxkX2V4aXQgKERCdXNCYWJ5c2l0dGVyICAgICAgICAgICAgKnNpdHRlcik7CisKK0RCVVNfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBEQlVTX1NQQVdOX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1zdHJpbmctcHJpdmF0ZS5oIGIvZGJ1cy9kYnVzLXN0cmluZy1wcml2YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU2ZGU5MAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1zdHJpbmctcHJpdmF0ZS5oCkBAIC0wLDAgKzEsMTMzIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtc3RyaW5nLXByaXZhdGUuaCBTdHJpbmcgdXRpbGl0eSBjbGFzcyAoaW50ZXJuYWwgdG8gRC1CdXMgaW1wbGVtZW50YXRpb24pCisgKiAKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMyAgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaWZuZGVmIERCVVNfU1RSSU5HX1BSSVZBVEVfSAorI2RlZmluZSBEQlVTX1NUUklOR19QUklWQVRFX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy1pbnRlcm5hbHMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbWVtb3J5Lmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXR5cGVzLmg+CisKKyNpZm5kZWYgREJVU19DQU5fVVNFX0RCVVNfU1RSSU5HX1BSSVZBVEUKKyNlcnJvciAiRG9uJ3QgZ28gaW5jbHVkaW5nIGRidXMtc3RyaW5nLXByaXZhdGUuaCBmb3Igbm8gZ29vZCByZWFzb24iCisjZW5kaWYKKworREJVU19CRUdJTl9ERUNMUworCisvKioKKyAqIEBicmllZiBJbnRlcm5hbHMgb2YgREJ1c1N0cmluZy4KKyAqIAorICogREJ1c1N0cmluZyBpbnRlcm5hbHMuIERCdXNTdHJpbmcgaXMgYW4gb3BhcXVlIG9iamVjdHMsIGl0IG11c3QgYmUKKyAqIHVzZWQgdmlhIGFjY2Vzc29yIGZ1bmN0aW9ucy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdW5zaWduZWQgY2hhciAqc3RyOyAgICAgICAgICAgIC8qKjwgU3RyaW5nIGRhdGEsIHBsdXMgbnVsIHRlcm1pbmF0aW9uICovCisgIGludCAgICAgICAgICAgIGxlbjsgICAgICAgICAgICAvKio8IExlbmd0aCB3aXRob3V0IG51bCAqLworICBpbnQgICAgICAgICAgICBhbGxvY2F0ZWQ7ICAgICAgLyoqPCBBbGxvY2F0ZWQgc2l6ZSBvZiBkYXRhICovCisgIHVuc2lnbmVkIGludCAgIGNvbnN0YW50IDogMTsgICAvKio8IFN0cmluZyBkYXRhIGlzIG5vdCBvd25lZCBieSBEQnVzU3RyaW5nICovCisgIHVuc2lnbmVkIGludCAgIGxvY2tlZCA6IDE7ICAgICAvKio8IERCdXNTdHJpbmcgaGFzIGJlZW4gbG9ja2VkIGFuZCBjYW4ndCBiZSBjaGFuZ2VkICovCisgIHVuc2lnbmVkIGludCAgIGludmFsaWQgOiAxOyAgICAvKio8IERCdXNTdHJpbmcgaXMgaW52YWxpZCAoZS5nLiBhbHJlYWR5IGZyZWVkKSAqLworICB1bnNpZ25lZCBpbnQgICBhbGlnbl9vZmZzZXQgOiAzOyAvKio8IHN0ciAtIGFsaWduX29mZnNldCBpcyB0aGUgYWN0dWFsIG1hbGxvYyBibG9jayAqLworfSBEQnVzUmVhbFN0cmluZzsKKworX0RCVVNfU1RBVElDX0FTU0VSVCAoc2l6ZW9mIChEQnVzUmVhbFN0cmluZykgPT0gc2l6ZW9mIChEQnVzU3RyaW5nKSk7CisKKy8qKgorICogQGRlZmdyb3VwIERCdXNTdHJpbmdJbnRlcm5hbHMgREJ1c1N0cmluZyBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzCisgKiBAaW5ncm91cCAgREJ1c0ludGVybmFscworICogQGJyaWVmIERCdXNTdHJpbmcgaW1wbGVtZW50YXRpb24gZGV0YWlscworICoKKyAqIFRoZSBndXRzIG9mIERCdXNTdHJpbmcuCisgKgorICogQHsKKyAqLworCisvKioKKyAqIFRoZSBtYXhpbXVtIGxlbmd0aCBvZiBhIERCdXNTdHJpbmcKKyAqLworI2RlZmluZSBfREJVU19TVFJJTkdfTUFYX0xFTkdUSCAoX0RCVVNfSU5UMzJfTUFYIC0gX0RCVVNfU1RSSU5HX0FMTE9DQVRJT05fUEFERElORykKKworLyoqCisgKiBDaGVja3MgYSBidW5jaCBvZiBhc3NlcnRpb25zIGFib3V0IGEgc3RyaW5nIG9iamVjdAorICoKKyAqIEBwYXJhbSByZWFsIHRoZSBEQnVzUmVhbFN0cmluZworICovCisjZGVmaW5lIERCVVNfR0VORVJJQ19TVFJJTkdfUFJFQU1CTEUocmVhbCkgXAorICBkbyB7IFwKKyAgICAgICh2b2lkKSByZWFsOyAvKiBtaWdodCBiZSB1bnVzZWQgdW5sZXNzIGFzc2VydGluZyAqLyBcCisgICAgICBfZGJ1c19hc3NlcnQgKChyZWFsKSAhPSBOVUxMKTsgXAorICAgICAgX2RidXNfYXNzZXJ0ICghKHJlYWwpLT5pbnZhbGlkKTsgXAorICAgICAgX2RidXNfYXNzZXJ0ICgocmVhbCktPmxlbiA+PSAwKTsgXAorICAgICAgX2RidXNfYXNzZXJ0ICgocmVhbCktPmFsbG9jYXRlZCA+PSAwKTsgXAorICAgICAgX2RidXNfYXNzZXJ0ICgocmVhbCktPmxlbiA8PSAoKHJlYWwpLT5hbGxvY2F0ZWQgLSBfREJVU19TVFJJTkdfQUxMT0NBVElPTl9QQURESU5HKSk7IFwKKyAgICAgIF9kYnVzX2Fzc2VydCAoKHJlYWwpLT5sZW4gPD0gX0RCVVNfU1RSSU5HX01BWF9MRU5HVEgpOyBcCisgIH0gd2hpbGUgKDApCisKKy8qKgorICogQ2hlY2tzIGFzc2VydGlvbnMgYWJvdXQgYSBzdHJpbmcgb2JqZWN0IHRoYXQgbmVlZHMgdG8gYmUKKyAqIG1vZGlmaWFibGUgLSBtYXkgbm90IGJlIGxvY2tlZCBvciBjb25zdC4gQWxzbyBkZWNsYXJlcworICogdGhlICJyZWFsIiB2YXJpYWJsZSBwb2ludGluZyB0byBEQnVzUmVhbFN0cmluZy4gCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcKKyAqLworI2RlZmluZSBEQlVTX1NUUklOR19QUkVBTUJMRShzdHIpIERCdXNSZWFsU3RyaW5nICpyZWFsID0gKERCdXNSZWFsU3RyaW5nKikgc3RyOyBcCisgIERCVVNfR0VORVJJQ19TVFJJTkdfUFJFQU1CTEUgKHJlYWwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX2RidXNfYXNzZXJ0ICghKHJlYWwpLT5jb25zdGFudCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfZGJ1c19hc3NlcnQgKCEocmVhbCktPmxvY2tlZCkKKworLyoqCisgKiBDaGVja3MgYXNzZXJ0aW9ucyBhYm91dCBhIHN0cmluZyBvYmplY3QgdGhhdCBtYXkgYmUgbG9ja2VkIGJ1dAorICogY2FuJ3QgYmUgY29uc3QuIGkuZS4gYSBzdHJpbmcgb2JqZWN0IHRoYXQgd2UgY2FuIGZyZWUuICBBbHNvCisgKiBkZWNsYXJlcyB0aGUgInJlYWwiIHZhcmlhYmxlIHBvaW50aW5nIHRvIERCdXNSZWFsU3RyaW5nLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZworICovCisjZGVmaW5lIERCVVNfTE9DS0VEX1NUUklOR19QUkVBTUJMRShzdHIpIERCdXNSZWFsU3RyaW5nICpyZWFsID0gKERCdXNSZWFsU3RyaW5nKikgc3RyOyBcCisgIERCVVNfR0VORVJJQ19TVFJJTkdfUFJFQU1CTEUgKHJlYWwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9kYnVzX2Fzc2VydCAoIShyZWFsKS0+Y29uc3RhbnQpCisKKy8qKgorICogQ2hlY2tzIGFzc2VydGlvbnMgYWJvdXQgYSBzdHJpbmcgdGhhdCBtYXkgYmUgY29uc3Qgb3IgbG9ja2VkLiAgQWxzbworICogZGVjbGFyZXMgdGhlICJyZWFsIiB2YXJpYWJsZSBwb2ludGluZyB0byBEQnVzUmVhbFN0cmluZy4KKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZy4KKyAqLworI2RlZmluZSBEQlVTX0NPTlNUX1NUUklOR19QUkVBTUJMRShzdHIpIGNvbnN0IERCdXNSZWFsU3RyaW5nICpyZWFsID0gKERCdXNSZWFsU3RyaW5nKikgc3RyOyBcCisgIERCVVNfR0VORVJJQ19TVFJJTkdfUFJFQU1CTEUgKHJlYWwpCisKKy8qKgorICogQ2hlY2tzIGZvciBBU0NJSSBibGFuayBieXRlCisgKiBAcGFyYW0gYyB0aGUgYnl0ZQorICovCisjZGVmaW5lIERCVVNfSVNfQVNDSUlfQkxBTksoYykgKChjKSA9PSAnICcgfHwgKGMpID09ICdcdCcpCisKKy8qKgorICogQ2hlY2tzIGZvciBBU0NJSSB3aGl0ZXNwYWNlIGJ5dGUKKyAqIEBwYXJhbSBjIHRoZSBieXRlCisgKi8KKyNkZWZpbmUgREJVU19JU19BU0NJSV9XSElURShjKSAoKGMpID09ICcgJyB8fCAoYykgPT0gJ1x0JyB8fCAoYykgPT0gJ1xuJyB8fCAoYykgPT0gJ1xyJykKKworLyoqIEB9ICovCisKK0RCVVNfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBEQlVTX1NUUklOR19QUklWQVRFX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1zdHJpbmctdXRpbC5jIGIvZGJ1cy9kYnVzLXN0cmluZy11dGlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODViYzU3MAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1zdHJpbmctdXRpbC5jCkBAIC0wLDAgKzEsOTM4IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtc3RyaW5nLXV0aWwuYyBXb3VsZCBiZSBpbiBkYnVzLXN0cmluZy5jLCBidXQgbm90IHVzZWQgaW4gbGliZGJ1cworICogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUgUmVkIEhhdCwgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDA2IFJhbGYgSGFiYWNrZXIgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgImRidXMtaW50ZXJuYWxzLmgiCisjaW5jbHVkZSAiZGJ1cy1zdHJpbmcuaCIKKyNkZWZpbmUgREJVU19DQU5fVVNFX0RCVVNfU1RSSU5HX1BSSVZBVEUgMQorI2luY2x1ZGUgImRidXMtc3RyaW5nLXByaXZhdGUuaCIKKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzU3RyaW5nCisgKiBAeworICovCisKKy8qKgorICogUmV0dXJucyB3aGV0aGVyIGEgc3RyaW5nIGVuZHMgd2l0aCB0aGUgZ2l2ZW4gc3VmZml4CisgKgorICogQHRvZG8gbWVtY21wIG1pZ2h0IG1ha2UgdGhpcyBmYXN0ZXIuCisgKiAKKyAqIEBwYXJhbSBhIHRoZSBzdHJpbmcKKyAqIEBwYXJhbSBjX3N0ciB0aGUgQy1zdHlsZSBzdHJpbmcKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSBzdHJpbmcgZW5kcyB3aXRoIHRoZSBzdWZmaXgKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3N0cmluZ19lbmRzX3dpdGhfY19zdHIgKGNvbnN0IERCdXNTdHJpbmcgKmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICpjX3N0cikKK3sKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqYXA7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJwOworICBjb25zdCB1bnNpZ25lZCBjaGFyICphX2VuZDsKKyAgdW5zaWduZWQgbG9uZyBjX3N0cl9sZW47CisgIGNvbnN0IERCdXNSZWFsU3RyaW5nICpyZWFsX2EgPSAoY29uc3QgREJ1c1JlYWxTdHJpbmcqKSBhOworICBEQlVTX0dFTkVSSUNfU1RSSU5HX1BSRUFNQkxFIChyZWFsX2EpOworICBfZGJ1c19hc3NlcnQgKGNfc3RyICE9IE5VTEwpOworICAKKyAgY19zdHJfbGVuID0gc3RybGVuIChjX3N0cik7CisgIGlmICgoKHVuc2lnbmVkIGxvbmcpcmVhbF9hLT5sZW4pIDwgY19zdHJfbGVuKQorICAgIHJldHVybiBGQUxTRTsKKyAgCisgIGFwID0gcmVhbF9hLT5zdHIgKyAocmVhbF9hLT5sZW4gLSBjX3N0cl9sZW4pOworICBicCA9IChjb25zdCB1bnNpZ25lZCBjaGFyKikgY19zdHI7CisgIGFfZW5kID0gcmVhbF9hLT5zdHIgKyByZWFsX2EtPmxlbjsKKyAgd2hpbGUgKGFwICE9IGFfZW5kKQorICAgIHsKKyAgICAgIGlmICgqYXAgIT0gKmJwKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAKKyAgICAgICsrYXA7CisgICAgICArK2JwOworICAgIH0KKworICBfZGJ1c19hc3NlcnQgKCphcCA9PSAnXDAnKTsKKyAgX2RidXNfYXNzZXJ0ICgqYnAgPT0gJ1wwJyk7CisgIAorICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBGaW5kIHRoZSBnaXZlbiBieXRlIHNjYW5uaW5nIGJhY2t3YXJkIGZyb20gdGhlIGdpdmVuIHN0YXJ0LgorICogU2V0cyAqZm91bmQgdG8gLTEgaWYgdGhlIGJ5dGUgaXMgbm90IGZvdW5kLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZworICogQHBhcmFtIHN0YXJ0IHRoZSBwbGFjZSB0byBzdGFydCBzY2FubmluZyAod2lsbCBub3QgZmluZCB0aGUgYnl0ZSBhdCB0aGlzIHBvaW50KQorICogQHBhcmFtIGJ5dGUgdGhlIGJ5dGUgdG8gZmluZAorICogQHBhcmFtIGZvdW5kIHJldHVybiBsb2NhdGlvbiBmb3Igd2hlcmUgaXQgd2FzIGZvdW5kCisgKiBAcmV0dXJucyAjVFJVRSBpZiBmb3VuZAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RyaW5nX2ZpbmRfYnl0ZV9iYWNrd2FyZCAoY29uc3QgREJ1c1N0cmluZyAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgICAgICBieXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgKmZvdW5kKQoreworICBpbnQgaTsKKyAgREJVU19DT05TVF9TVFJJTkdfUFJFQU1CTEUgKHN0cik7CisgIF9kYnVzX2Fzc2VydCAoc3RhcnQgPD0gcmVhbC0+bGVuKTsKKyAgX2RidXNfYXNzZXJ0IChzdGFydCA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChmb3VuZCAhPSBOVUxMKTsKKworICBpID0gc3RhcnQgLSAxOworICB3aGlsZSAoaSA+PSAwKQorICAgIHsKKyAgICAgIGlmIChyZWFsLT5zdHJbaV0gPT0gYnl0ZSkKKyAgICAgICAgYnJlYWs7CisgICAgICAKKyAgICAgIC0taTsKKyAgICB9CisKKyAgaWYgKGZvdW5kKQorICAgICpmb3VuZCA9IGk7CisKKyAgcmV0dXJuIGkgPj0gMDsKK30KKworLyoqIEB9ICovCisKKyNpZmRlZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworI2luY2x1ZGUgImRidXMtdGVzdC5oIgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKK3N0YXRpYyB2b2lkCit0ZXN0X2hleF9yb3VuZHRyaXAgKGNvbnN0IGNoYXIgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIGxlbikKK3sKKyAgREJ1c1N0cmluZyBvcmlnOworICBEQnVzU3RyaW5nIGVuY29kZWQ7CisgIERCdXNTdHJpbmcgZGVjb2RlZDsKKyAgaW50IGVuZDsKKworICBpZiAobGVuIDwgMCkKKyAgICBsZW4gPSBzdHJsZW4gKGRhdGEpOworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJm9yaWcpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkIG5vdCBpbml0IHN0cmluZyIpOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZlbmNvZGVkKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZCBub3QgaW5pdCBzdHJpbmciKTsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZkZWNvZGVkKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZCBub3QgaW5pdCBzdHJpbmciKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfbGVuICgmb3JpZywgZGF0YSwgbGVuKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZG4ndCBhcHBlbmQgb3JpZyBkYXRhIik7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaGV4X2VuY29kZSAoJm9yaWcsIDAsICZlbmNvZGVkLCAwKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZCBub3QgZW5jb2RlIik7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaGV4X2RlY29kZSAoJmVuY29kZWQsIDAsICZlbmQsICZkZWNvZGVkLCAwKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZCBub3QgZGVjb2RlIik7CisgICAgCisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZlbmNvZGVkKSA9PSBlbmQpOworCisgIGlmICghX2RidXNfc3RyaW5nX2VxdWFsICgmb3JpZywgJmRlY29kZWQpKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKnM7CisgICAgICAKKyAgICAgIHByaW50ZiAoIk9yaWdpbmFsIHN0cmluZyAlZCBieXRlcyBlbmNvZGVkICVkIGJ5dGVzIGRlY29kZWQgJWQgYnl0ZXNcbiIsCisgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmb3JpZyksCisgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmZW5jb2RlZCksCisgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmZGVjb2RlZCkpOworICAgICAgcHJpbnRmICgiT3JpZ2luYWw6ICVzXG4iLCBkYXRhKTsKKyAgICAgIHMgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZkZWNvZGVkKTsKKyAgICAgIHByaW50ZiAoIkRlY29kZWQ6ICVzXG4iLCBzKTsKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm9yaWdpbmFsIHN0cmluZyBub3QgdGhlIHNhbWUgYXMgc3RyaW5nIGRlY29kZWQgZnJvbSBoZXgiKTsKKyAgICB9CisgIAorICBfZGJ1c19zdHJpbmdfZnJlZSAoJm9yaWcpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmVuY29kZWQpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmRlY29kZWQpOyAgCit9CisKK3R5cGVkZWYgdm9pZCAoKiBUZXN0Um91bmR0cmlwRnVuYykgKGNvbnN0IGNoYXIgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICBsZW4pOworc3RhdGljIHZvaWQKK3Rlc3Rfcm91bmR0cmlwcyAoVGVzdFJvdW5kdHJpcEZ1bmMgZnVuYykKK3sKKyAgKCogZnVuYykgKCJIZWxsbyB0aGlzIGlzIGEgc3RyaW5nXG4iLCAtMSk7CisgICgqIGZ1bmMpICgiSGVsbG8gdGhpcyBpcyBhIHN0cmluZ1xuMSIsIC0xKTsKKyAgKCogZnVuYykgKCJIZWxsbyB0aGlzIGlzIGEgc3RyaW5nXG4xMiIsIC0xKTsKKyAgKCogZnVuYykgKCJIZWxsbyB0aGlzIGlzIGEgc3RyaW5nXG4xMjMiLCAtMSk7CisgICgqIGZ1bmMpICgiSGVsbG8gdGhpcyBpcyBhIHN0cmluZ1xuMTIzNCIsIC0xKTsKKyAgKCogZnVuYykgKCJIZWxsbyB0aGlzIGlzIGEgc3RyaW5nXG4xMjM0NSIsIC0xKTsKKyAgKCogZnVuYykgKCIiLCAwKTsKKyAgKCogZnVuYykgKCIxIiwgMSk7CisgICgqIGZ1bmMpICgiMTIiLCAyKTsKKyAgKCogZnVuYykgKCIxMjMiLCAzKTsKKyAgKCogZnVuYykgKCIxMjM0IiwgNCk7CisgICgqIGZ1bmMpICgiMTIzNDUiLCA1KTsKKyAgKCogZnVuYykgKCIiLCAxKTsKKyAgKCogZnVuYykgKCIxIiwgMik7CisgICgqIGZ1bmMpICgiMTIiLCAzKTsKKyAgKCogZnVuYykgKCIxMjMiLCA0KTsKKyAgKCogZnVuYykgKCIxMjM0IiwgNSk7CisgICgqIGZ1bmMpICgiMTIzNDUiLCA2KTsKKyAgeworICAgIHVuc2lnbmVkIGNoYXIgYnVmWzUxMl07CisgICAgaW50IGk7CisgICAgCisgICAgaSA9IDA7CisgICAgd2hpbGUgKGkgPCBfREJVU19OX0VMRU1FTlRTIChidWYpKQorICAgICAgeworICAgICAgICBidWZbaV0gPSAoaSAmIDB4ZmYpOworICAgICAgICArK2k7CisgICAgICB9CisgICAgaSA9IDA7CisgICAgd2hpbGUgKGkgPCBfREJVU19OX0VMRU1FTlRTIChidWYpKQorICAgICAgeworICAgICAgICAoKiBmdW5jKSAoKGNvbnN0IGNoYXIgKikgYnVmLCBpKTsKKyAgICAgICAgKytpOworICAgICAgfQorICB9Cit9CisKKy8qKgorICogQGluZ3JvdXAgREJ1c1N0cmluZ0ludGVybmFscworICogVW5pdCB0ZXN0IGZvciBEQnVzU3RyaW5nLgorICoKKyAqIEB0b2RvIE5lZWQgdG8gd3JpdGUgdGVzdHMgZm9yIF9kYnVzX3N0cmluZ19jb3B5KCkgYW5kCisgKiBfZGJ1c19zdHJpbmdfbW92ZSgpIG1vdmluZyB0by9mcm9tIGVhY2ggb2Ygc3RhcnQvbWlkZGxlL2VuZCBvZiBhCisgKiBzdHJpbmcuIEFsc28gbmVlZCB0ZXN0cyBmb3IgX2RidXNfc3RyaW5nX21vdmVfbGVuICgpCisgKiAKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zdHJpbmdfdGVzdCAodm9pZCkKK3sKKyAgREJ1c1N0cmluZyBzdHI7CisgIERCdXNTdHJpbmcgb3RoZXI7CisgIGludCBpLCBhLCBlbmQ7CisgIGxvbmcgdjsKKyAgaW50IGxlbnNbXSA9IHsgMCwgMSwgMiwgMywgNCwgNSwgMTAsIDE2LCAxNywgMTgsIDI1LCAzMSwgMzIsIDMzLCAzNCwgMzUsIDYzLCA2NCwgNjUsIDY2LCA2NywgNjgsIDY5LCA3MCwgNzEsIDEyNywgMTI4LCAxMjksIDEzMCwgMTMxLCAxMzIsIDEzMywgMTM0LCAxMzUsIDEzNiB9OworICBjaGFyICpzOworCisgIC8qIFRlc3Qgc2hvcnRlbmluZyBhbmQgc2V0dGluZyBsZW5ndGggKi8KKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgX0RCVVNfTl9FTEVNRU5UUyAobGVucykpCisgICAgeworICAgICAgaW50IGo7CisgICAgICAKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZzdHIpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJmYWlsZWQgdG8gaW5pdCBzdHJpbmciKTsKKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoJnN0ciwgbGVuc1tpXSkpCisgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImZhaWxlZCB0byBzZXQgc3RyaW5nIGxlbmd0aCIpOworCisgICAgICBqID0gbGVuc1tpXTsKKyAgICAgIHdoaWxlIChqID4gMCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpID09IGopOworICAgICAgICAgIGlmIChqID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX3Nob3J0ZW4gKCZzdHIsIDEpOworICAgICAgICAgICAgICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSA9PSAoaiAtIDEpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAtLWo7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZzdHIpOworCisgICAgICArK2k7CisgICAgfQorCisgIC8qIFRlc3QgZXF1YWxpdHkgKi8KKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnN0cikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib29tIik7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmc3RyLCAiSGVsbG8gV29ybGQiKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJvb20iKTsKKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJm90aGVyLCAiSCIpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19lcXVhbF9zdWJzdHJpbmcgKCZzdHIsIDAsIDEsICZvdGhlciwgMCkpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19lcXVhbF9zdWJzdHJpbmcgKCZzdHIsIDEsIDAsICZvdGhlciwgMSkpOworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJm90aGVyLCAiSGVsbG8iKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZXF1YWxfc3Vic3RyaW5nICgmc3RyLCAwLCA1LCAmb3RoZXIsIDApKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZXF1YWxfc3Vic3RyaW5nICgmc3RyLCAxLCA0LCAmb3RoZXIsIDEpKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZXF1YWxfc3Vic3RyaW5nICgmc3RyLCAyLCAzLCAmb3RoZXIsIDIpKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZXF1YWxfc3Vic3RyaW5nICgmc3RyLCAzLCAyLCAmb3RoZXIsIDMpKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZXF1YWxfc3Vic3RyaW5nICgmc3RyLCA0LCAxLCAmb3RoZXIsIDQpKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZXF1YWxfc3Vic3RyaW5nICgmc3RyLCA1LCAwLCAmb3RoZXIsIDUpKTsKKworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19lcXVhbF9zdWJzdHJpbmcgKCZvdGhlciwgMCwgNSwgJnN0ciwgMCkpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19lcXVhbF9zdWJzdHJpbmcgKCZvdGhlciwgMSwgNCwgJnN0ciwgMSkpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19lcXVhbF9zdWJzdHJpbmcgKCZvdGhlciwgMiwgMywgJnN0ciwgMikpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19lcXVhbF9zdWJzdHJpbmcgKCZvdGhlciwgMywgMiwgJnN0ciwgMykpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19lcXVhbF9zdWJzdHJpbmcgKCZvdGhlciwgNCwgMSwgJnN0ciwgNCkpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19lcXVhbF9zdWJzdHJpbmcgKCZvdGhlciwgNSwgMCwgJnN0ciwgNSkpOworCisgIAorICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJm90aGVyLCAiV29ybGQiKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZXF1YWxfc3Vic3RyaW5nICgmc3RyLCA2LCAgNSwgJm90aGVyLCAwKSk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2VxdWFsX3N1YnN0cmluZyAoJnN0ciwgNywgIDQsICZvdGhlciwgMSkpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19lcXVhbF9zdWJzdHJpbmcgKCZzdHIsIDgsICAzLCAmb3RoZXIsIDIpKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZXF1YWxfc3Vic3RyaW5nICgmc3RyLCA5LCAgMiwgJm90aGVyLCAzKSk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2VxdWFsX3N1YnN0cmluZyAoJnN0ciwgMTAsIDEsICZvdGhlciwgNCkpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19lcXVhbF9zdWJzdHJpbmcgKCZzdHIsIDExLCAwLCAmb3RoZXIsIDUpKTsKKworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19lcXVhbF9zdWJzdHJpbmcgKCZvdGhlciwgMCwgNSwgJnN0ciwgNikpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19lcXVhbF9zdWJzdHJpbmcgKCZvdGhlciwgMSwgNCwgJnN0ciwgNykpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19lcXVhbF9zdWJzdHJpbmcgKCZvdGhlciwgMiwgMywgJnN0ciwgOCkpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19lcXVhbF9zdWJzdHJpbmcgKCZvdGhlciwgMywgMiwgJnN0ciwgOSkpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19lcXVhbF9zdWJzdHJpbmcgKCZvdGhlciwgNCwgMSwgJnN0ciwgMTApKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZXF1YWxfc3Vic3RyaW5nICgmb3RoZXIsIDUsIDAsICZzdHIsIDExKSk7CisgIAorICBfZGJ1c19zdHJpbmdfZnJlZSAoJnN0cik7CisgIAorICAvKiBUZXN0IGFwcGVuZGluZyBkYXRhICovCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZzdHIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImZhaWxlZCB0byBpbml0IHN0cmluZyIpOworCisgIGkgPSAwOworICB3aGlsZSAoaSA8IDEwKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnN0ciwgImEiKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZmFpbGVkIHRvIGFwcGVuZCBzdHJpbmcgdG8gc3RyaW5nIik7CisKKyAgICAgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpID09IGkgKiAyICsgMSk7CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlICgmc3RyLCAnYicpKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJmYWlsZWQgdG8gYXBwZW5kIGJ5dGUgdG8gc3RyaW5nIik7CisKKyAgICAgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpID09IGkgKiAyICsgMik7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgKytpOworICAgIH0KKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnN0cik7CisKKyAgLyogQ2hlY2sgc3RlYWxfZGF0YSAqLworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnN0cikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZmFpbGVkIHRvIGluaXQgc3RyaW5nIik7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmc3RyLCAiSGVsbG8gV29ybGQiKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZCBub3QgYXBwZW5kIHRvIHN0cmluZyIpOworCisgIGkgPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cik7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19zdGVhbF9kYXRhICgmc3RyLCAmcykpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZmFpbGVkIHRvIHN0ZWFsIGRhdGEiKTsKKworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSA9PSAwKTsKKyAgX2RidXNfYXNzZXJ0ICgoKGludClzdHJsZW4gKHMpKSA9PSBpKTsKKworICBkYnVzX2ZyZWUgKHMpOworCisgIC8qIENoZWNrIG1vdmUgKi8KKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnN0ciwgIkhlbGxvIFdvcmxkIikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGQgbm90IGFwcGVuZCB0byBzdHJpbmciKTsKKworICBpID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZvdGhlcikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGQgbm90IGluaXQgc3RyaW5nIik7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19tb3ZlICgmc3RyLCAwLCAmb3RoZXIsIDApKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkIG5vdCBtb3ZlIik7CisKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikgPT0gMCk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZvdGhlcikgPT0gaSk7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmc3RyLCAiSGVsbG8gV29ybGQiKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZCBub3QgYXBwZW5kIHRvIHN0cmluZyIpOworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfbW92ZSAoJnN0ciwgMCwgJm90aGVyLCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJm90aGVyKSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGQgbm90IG1vdmUiKTsKKworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSA9PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJm90aGVyKSA9PSBpICogMik7CisKKyAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZzdHIsICJIZWxsbyBXb3JsZCIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkIG5vdCBhcHBlbmQgdG8gc3RyaW5nIik7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19tb3ZlICgmc3RyLCAwLCAmb3RoZXIsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmb3RoZXIpIC8gMikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGQgbm90IG1vdmUiKTsKKworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSA9PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJm90aGVyKSA9PSBpICogMyk7CisgIAorICBfZGJ1c19zdHJpbmdfZnJlZSAoJm90aGVyKTsKKworICAvKiBDaGVjayBjb3B5ICovCisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZzdHIsICJIZWxsbyBXb3JsZCIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkIG5vdCBhcHBlbmQgdG8gc3RyaW5nIik7CisKKyAgaSA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKTsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZvdGhlcikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGQgbm90IGluaXQgc3RyaW5nIik7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5ICgmc3RyLCAwLCAmb3RoZXIsIDApKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkIG5vdCBjb3B5Iik7CisKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikgPT0gaSk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZvdGhlcikgPT0gaSk7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAoJnN0ciwgMCwgJm90aGVyLCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJm90aGVyKSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGQgbm90IGNvcHkiKTsKKworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSA9PSBpKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJm90aGVyKSA9PSBpICogMik7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2VxdWFsX2Nfc3RyICgmb3RoZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVsbG8gV29ybGRIZWxsbyBXb3JsZCIpKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5ICgmc3RyLCAwLCAmb3RoZXIsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmb3RoZXIpIC8gMikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGQgbm90IGNvcHkiKTsKKworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSA9PSBpKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJm90aGVyKSA9PSBpICogMyk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2VxdWFsX2Nfc3RyICgmb3RoZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVsbG8gV29ybGRIZWxsbyBXb3JsZEhlbGxvIFdvcmxkIikpOworICAKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZzdHIpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJm90aGVyKTsKKworICAvKiBDaGVjayByZXBsYWNlICovCisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnN0cikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZmFpbGVkIHRvIGluaXQgc3RyaW5nIik7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZzdHIsICJIZWxsbyBXb3JsZCIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkIG5vdCBhcHBlbmQgdG8gc3RyaW5nIik7CisKKyAgaSA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKTsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZvdGhlcikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGQgbm90IGluaXQgc3RyaW5nIik7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19yZXBsYWNlX2xlbiAoJnN0ciwgMCwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm90aGVyLCAwLCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJm90aGVyKSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGQgbm90IHJlcGxhY2UiKTsKKworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSA9PSBpKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJm90aGVyKSA9PSBpKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZXF1YWxfY19zdHIgKCZvdGhlciwgIkhlbGxvIFdvcmxkIikpOworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfcmVwbGFjZV9sZW4gKCZzdHIsIDAsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdGhlciwgNSwgMSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGQgbm90IHJlcGxhY2UgY2VudGVyIHNwYWNlIik7CisKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikgPT0gaSk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZvdGhlcikgPT0gaSAqIDIgLSAxKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZXF1YWxfY19zdHIgKCZvdGhlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWxsb0hlbGxvIFdvcmxkV29ybGQiKSk7CisKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX3JlcGxhY2VfbGVuICgmc3RyLCAxLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm90aGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZvdGhlcikgLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGQgbm90IHJlcGxhY2UgZW5kIGNoYXJhY3RlciIpOworICAKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikgPT0gaSk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZvdGhlcikgPT0gaSAqIDIgLSAxKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZXF1YWxfY19zdHIgKCZvdGhlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWxsb0hlbGxvIFdvcmxkV29ybGUiKSk7CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZzdHIpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJm90aGVyKTsKKworICAvKiBEaWZmZXJlbnQgdGVzdHMgYXJlIHByb3ZpZGVkIGJlY2F1c2UgZGlmZmVyZW50IGJlaGF2aW91cnMgYXJlCisgICAqIGltcGxlbWVudGVkIGluIF9kYnVzX3N0cmluZ19yZXBsYWNlX2xlbigpIGluIGZ1bmN0aW9uIG9mIHJlcGxhY2luZyBhbmQKKyAgICogcmVwbGFjZWQgbGVuZ3RocworICAgKi8KKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmc3RyKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJmYWlsZWQgdG8gaW5pdCBzdHJpbmciKTsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnN0ciwgIkhlbGxvIFdvcmxkIikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGQgbm90IGFwcGVuZCB0byBzdHJpbmciKTsKKworICBpID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpOworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJm90aGVyKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZCBub3QgaW5pdCBzdHJpbmciKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZvdGhlciwgIkZvbyBTdHJpbmciKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjb3VsZCBub3QgYXBwZW5kIHRvIHN0cmluZyIpOworCisgIGEgPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJm90aGVyKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19yZXBsYWNlX2xlbiAoJnN0ciwgMCwgNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdGhlciwgNCwgMCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGQgbm90IHJlcGxhY2UgMCBsZW5ndGgiKTsKKworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSA9PSBpKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJm90aGVyKSA9PSBhICsgNik7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2VxdWFsX2Nfc3RyICgmb3RoZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRm9vIEhlbGxvIFN0cmluZyIpKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19yZXBsYWNlX2xlbiAoJnN0ciwgNSwgNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdGhlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmb3RoZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGQgbm90IHJlcGxhY2UgYXQgdGhlIGVuZCIpOworCisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpID09IGkpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmb3RoZXIpID09IGEgKyA2ICsgNik7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2VxdWFsX2Nfc3RyICgmb3RoZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRm9vIEhlbGxvIFN0cmluZyBXb3JsZCIpKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19yZXBsYWNlX2xlbiAoJnN0ciwgMCwgNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdGhlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmb3RoZXIpIC0gNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkIG5vdCByZXBsYWNlIHNhbWUgbGVuZ3RoIik7CisKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikgPT0gaSk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZvdGhlcikgPT0gYSArIDYgKyA2KTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZXF1YWxfY19zdHIgKCZvdGhlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGb28gSGVsbG8gU3RyaW5nIEhlbGxvIikpOworCisgIGlmICghX2RidXNfc3RyaW5nX3JlcGxhY2VfbGVuICgmc3RyLCA2LCA1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm90aGVyLCA0LCAxMikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGQgbm90IHJlcGxhY2Ugd2l0aCBzaG9ydGVyIHN0cmluZyIpOworCisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpID09IGkpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmb3RoZXIpID09IGEgKyA1KTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZXF1YWxfY19zdHIgKCZvdGhlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGb28gV29ybGQgSGVsbG8iKSk7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfcmVwbGFjZV9sZW4gKCZzdHIsIDAsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3RoZXIsIDAsIDMpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkIG5vdCByZXBsYWNlIGF0IHRoZSBiZWdpbm5pbmciKTsKKworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSA9PSBpKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJm90aGVyKSA9PSBhICsgMyk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2VxdWFsX2Nfc3RyICgmb3RoZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSCBXb3JsZCBIZWxsbyIpKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19yZXBsYWNlX2xlbiAoJnN0ciwgNiwgNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdGhlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmb3RoZXIpIC0gNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkIG5vdCByZXBsYWNlIHNhbWUgbGVuZ3RoIik7CisKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikgPT0gaSk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZvdGhlcikgPT0gYSArIDMpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19lcXVhbF9jX3N0ciAoJm90aGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkggV29ybGQgV29ybGQiKSk7CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZzdHIpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJm90aGVyKTsKKworICAvKiBDaGVjayBpbnNlcnQvc2V0L2dldCBieXRlICovCisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmc3RyKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJmYWlsZWQgdG8gaW5pdCBzdHJpbmciKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZzdHIsICJIZWxsbyIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImZhaWxlZCB0byBhcHBlbmQgSGVsbG8iKTsKKworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoJnN0ciwgMCkgPT0gJ0gnKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKCZzdHIsIDEpID09ICdlJyk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9ieXRlICgmc3RyLCAyKSA9PSAnbCcpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoJnN0ciwgMykgPT0gJ2wnKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKCZzdHIsIDQpID09ICdvJyk7CisKKyAgX2RidXNfc3RyaW5nX3NldF9ieXRlICgmc3RyLCAxLCAncScpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoJnN0ciwgMSkgPT0gJ3EnKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbnNlcnRfYnl0ZXMgKCZzdHIsIDAsIDEsIDI1NSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY2FuJ3QgaW5zZXJ0IGJ5dGUiKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbnNlcnRfYnl0ZXMgKCZzdHIsIDIsIDQsICdaJykpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY2FuJ3QgaW5zZXJ0IGJ5dGUiKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbnNlcnRfYnl0ZXMgKCZzdHIsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSwgMSwgJ1cnKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJjYW4ndCBpbnNlcnQgYnl0ZSIpOworICAKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKCZzdHIsIDApID09IDI1NSk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9ieXRlICgmc3RyLCAxKSA9PSAnSCcpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoJnN0ciwgMikgPT0gJ1onKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKCZzdHIsIDMpID09ICdaJyk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9ieXRlICgmc3RyLCA0KSA9PSAnWicpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoJnN0ciwgNSkgPT0gJ1onKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKCZzdHIsIDYpID09ICdxJyk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9ieXRlICgmc3RyLCA3KSA9PSAnbCcpOworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoJnN0ciwgOCkgPT0gJ2wnKTsKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKCZzdHIsIDkpID09ICdvJyk7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9ieXRlICgmc3RyLCAxMCkgPT0gJ1cnKTsKKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnN0cik7CisgIAorICAvKiBDaGVjayBhcHBlbmQvcGFyc2UgaW50L2RvdWJsZSAqLworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnN0cikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZmFpbGVkIHRvIGluaXQgc3RyaW5nIik7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX2ludCAoJnN0ciwgMjcpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImZhaWxlZCB0byBhcHBlbmQgaW50Iik7CisKKyAgaSA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19wYXJzZV9pbnQgKCZzdHIsIDAsICZ2LCAmZW5kKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJmYWlsZWQgdG8gcGFyc2UgaW50Iik7CisKKyAgX2RidXNfYXNzZXJ0ICh2ID09IDI3KTsKKyAgX2RidXNfYXNzZXJ0IChlbmQgPT0gaSk7CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZzdHIpOworCisgIC8qIFRlc3QgZmluZCAqLworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmc3RyKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJmYWlsZWQgdG8gaW5pdCBzdHJpbmciKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZzdHIsICJIZWxsbyIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkbid0IGFwcGVuZCB0byBzdHJpbmciKTsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2ZpbmQgKCZzdHIsIDAsICJIZSIsICZpKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJkaWRuJ3QgZmluZCAnSGUnIik7CisgIF9kYnVzX2Fzc2VydCAoaSA9PSAwKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19maW5kICgmc3RyLCAwLCAiSGVsbG8iLCAmaSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZGlkbid0IGZpbmQgJ0hlbGxvJyIpOworICBfZGJ1c19hc3NlcnQgKGkgPT0gMCk7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19maW5kICgmc3RyLCAwLCAiZWxsbyIsICZpKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJkaWRuJ3QgZmluZCAnZWxsbyciKTsKKyAgX2RidXNfYXNzZXJ0IChpID09IDEpOworCisgIGlmICghX2RidXNfc3RyaW5nX2ZpbmQgKCZzdHIsIDAsICJsbyIsICZpKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJkaWRuJ3QgZmluZCAnbG8nIik7CisgIF9kYnVzX2Fzc2VydCAoaSA9PSAzKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19maW5kICgmc3RyLCAyLCAibG8iLCAmaSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZGlkbid0IGZpbmQgJ2xvJyIpOworICBfZGJ1c19hc3NlcnQgKGkgPT0gMyk7CisKKyAgaWYgKF9kYnVzX3N0cmluZ19maW5kICgmc3RyLCA0LCAibG8iLCAmaSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZGlkIGZpbmQgJ2xvJyIpOworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfZmluZCAoJnN0ciwgMCwgImwiLCAmaSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZGlkbid0IGZpbmQgJ2wnIik7CisgIF9kYnVzX2Fzc2VydCAoaSA9PSAyKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19maW5kICgmc3RyLCAwLCAiSCIsICZpKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJkaWRuJ3QgZmluZCAnSCciKTsKKyAgX2RidXNfYXNzZXJ0IChpID09IDApOworCisgIGlmICghX2RidXNfc3RyaW5nX2ZpbmQgKCZzdHIsIDAsICIiLCAmaSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZGlkbid0IGZpbmQgJyciKTsKKyAgX2RidXNfYXNzZXJ0IChpID09IDApOworICAKKyAgaWYgKF9kYnVzX3N0cmluZ19maW5kICgmc3RyLCAwLCAiSGVsbG8hIiwgTlVMTCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiRGlkIGZpbmQgJ0hlbGxvISciKTsKKworICBpZiAoX2RidXNfc3RyaW5nX2ZpbmQgKCZzdHIsIDAsICJPaCwgSGVsbG8iLCBOVUxMKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJEaWQgZmluZCAnT2gsIEhlbGxvJyIpOworICAKKyAgaWYgKF9kYnVzX3N0cmluZ19maW5kICgmc3RyLCAwLCAiaWxsIiwgTlVMTCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiRGlkIGZpbmQgJ2lsbCciKTsKKworICBpZiAoX2RidXNfc3RyaW5nX2ZpbmQgKCZzdHIsIDAsICJxIiwgTlVMTCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiRGlkIGZpbmQgJ3EnIik7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfZmluZF90byAoJnN0ciwgMCwgMiwgIkhlIiwgTlVMTCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiRGlkbid0IGZpbmQgJ0hlJyIpOworCisgIGlmIChfZGJ1c19zdHJpbmdfZmluZF90byAoJnN0ciwgMCwgMiwgIkhlbGxvIiwgTlVMTCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiRGlkIGZpbmQgJ0hlbGxvJyIpOworCisgIGlmICghX2RidXNfc3RyaW5nX2ZpbmRfYnl0ZV9iYWNrd2FyZCAoJnN0ciwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpLCAnSCcsICZpKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJEaWQgbm90IGZpbmQgJ0gnIik7CisgIF9kYnVzX2Fzc2VydCAoaSA9PSAwKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19maW5kX2J5dGVfYmFja3dhcmQgKCZzdHIsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSwgJ28nLCAmaSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiRGlkIG5vdCBmaW5kICdvJyIpOworICBfZGJ1c19hc3NlcnQgKGkgPT0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpIC0gMSk7CisKKyAgaWYgKF9kYnVzX3N0cmluZ19maW5kX2J5dGVfYmFja3dhcmQgKCZzdHIsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKSAtIDEsICdvJywgJmkpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIkRpZCBmaW5kICdvJyIpOworICBfZGJ1c19hc3NlcnQgKGkgPT0gLTEpOworCisgIGlmIChfZGJ1c19zdHJpbmdfZmluZF9ieXRlX2JhY2t3YXJkICgmc3RyLCAxLCAnZScsICZpKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJEaWQgZmluZCAnZSciKTsKKyAgX2RidXNfYXNzZXJ0IChpID09IC0xKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19maW5kX2J5dGVfYmFja3dhcmQgKCZzdHIsIDIsICdlJywgJmkpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIkRpZG4ndCBmaW5kICdlJyIpOworICBfZGJ1c19hc3NlcnQgKGkgPT0gMSk7CisgIAorICBfZGJ1c19zdHJpbmdfZnJlZSAoJnN0cik7CisKKyAgLyogSGV4IGVuY29kaW5nICovCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmc3RyLCAiY2FmZWJhYmUsIHRoaXMgaXMgYSBib2d1cyBoZXggc3RyaW5nIik7CisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZvdGhlcikpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY291bGQgbm90IGluaXQgc3RyaW5nIik7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaGV4X2RlY29kZSAoJnN0ciwgMCwgJmVuZCwgJm90aGVyLCAwKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJkZWNjb2RlZCBib2d1cyBoZXggc3RyaW5nIHdpdGggbm8gZXJyb3IiKTsKKworICBfZGJ1c19hc3NlcnQgKGVuZCA9PSA4KTsKKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJm90aGVyKTsKKworICB0ZXN0X3JvdW5kdHJpcHMgKHRlc3RfaGV4X3JvdW5kdHJpcCk7CisgIAorICBfZGJ1c19zdHJpbmdfZnJlZSAoJnN0cik7CisKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBpbnQgZm91bmQsIGZvdW5kX2xlbjsgIAorCisgICAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZzdHIsICIwMTJcclxuNTY3XG45MCIpOworICAgIAorICAgIGlmICghX2RidXNfc3RyaW5nX2ZpbmRfZW9sICgmc3RyLCAwLCAmZm91bmQsICZmb3VuZF9sZW4pIHx8IGZvdW5kICE9IDMgfHwgZm91bmRfbGVuICE9IDIpCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJEaWQgbm90IGZpbmQgJ1xcclxcbiciKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBpZiAoZm91bmQgIT0gMyB8fCBmb3VuZF9sZW4gIT0gMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiaW52YWxpZCByZXR1cm4gdmFsdWVzIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgCisgICAgaWYgKCFfZGJ1c19zdHJpbmdfZmluZF9lb2wgKCZzdHIsIDUsICZmb3VuZCwgJmZvdW5kX2xlbikpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJEaWQgbm90IGZpbmQgJ1xcbiciKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBpZiAoZm91bmQgIT0gOCB8fCBmb3VuZF9sZW4gIT0gMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiaW52YWxpZCByZXR1cm4gdmFsdWVzIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgCisgICAgaWYgKF9kYnVzX3N0cmluZ19maW5kX2VvbCAoJnN0ciwgOSwgJmZvdW5kLCAmZm91bmRfbGVuKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJGb3VuZCBub3QgZXhwZWN0ZWQgJ1xcbiciKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBlbHNlIGlmIChmb3VuZCAhPSAxMSB8fCBmb3VuZF9sZW4gIT0gMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiaW52YWxpZCByZXR1cm4gdmFsdWVzICdcXG4nIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgICBmb3VuZCA9IC0xOworICAgIGZvdW5kX2xlbiA9IC0xOworICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmc3RyLCAiIik7CisgICAgaWYgKF9kYnVzX3N0cmluZ19maW5kX2VvbCAoJnN0ciwgMCwgJmZvdW5kLCAmZm91bmRfbGVuKSkKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImZvdW5kIGFuIGVvbCBpbiBhbiBlbXB0eSBzdHJpbmciKTsKKyAgICBfZGJ1c19hc3NlcnQgKGZvdW5kID09IDApOworICAgIF9kYnVzX2Fzc2VydCAoZm91bmRfbGVuID09IDApOworICAgIAorICAgIGZvdW5kID0gLTE7CisgICAgZm91bmRfbGVuID0gLTE7CisgICAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZzdHIsICJmb29iYXIiKTsKKyAgICBpZiAoX2RidXNfc3RyaW5nX2ZpbmRfZW9sICgmc3RyLCAwLCAmZm91bmQsICZmb3VuZF9sZW4pKQorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZm91bmQgZW9sIGluIHN0cmluZyB0aGF0IGxhY2tzIG9uZSIpOworICAgIF9kYnVzX2Fzc2VydCAoZm91bmQgPT0gNik7CisgICAgX2RidXNfYXNzZXJ0IChmb3VuZF9sZW4gPT0gMCk7CisKKyAgICBmb3VuZCA9IC0xOworICAgIGZvdW5kX2xlbiA9IC0xOworICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmc3RyLCAiZm9vYmFyXG4iKTsKKyAgICBpZiAoIV9kYnVzX3N0cmluZ19maW5kX2VvbCAoJnN0ciwgMCwgJmZvdW5kLCAmZm91bmRfbGVuKSkKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImRpZCBub3QgZmluZCBlb2wgaW4gc3RyaW5nIHRoYXQgaGFzIG9uZSBhdCBlbmQiKTsKKyAgICBfZGJ1c19hc3NlcnQgKGZvdW5kID09IDYpOworICAgIF9kYnVzX2Fzc2VydCAoZm91bmRfbGVuID09IDEpOworICB9CisKKyAgeworICAgIERCdXNTdHJpbmcgbGluZTsKKworI2RlZmluZSBGSVJTVF9MSU5FICJ0aGlzIGlzIGEgbGluZSIKKyNkZWZpbmUgU0VDT05EX0xJTkUgInRoaXMgaXMgYSBzZWNvbmQgbGluZSIKKyAgICAvKiB0aGlyZCBsaW5lIGlzIGVtcHR5ICovCisjZGVmaW5lIFRISVJEX0xJTkUgIiIKKyNkZWZpbmUgRk9VUlRIX0xJTkUgInRoaXMgaXMgYSBmb3VydGggbGluZSIKKyAgICAKKyAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmc3RyKSkKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOworCisgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmc3RyLCBGSVJTVF9MSU5FICJcbiIgU0VDT05EX0xJTkUgIlxyXG4iIFRISVJEX0xJTkUgIlxuIiBGT1VSVEhfTElORSkpCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkiKTsKKyAgICAKKyAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmbGluZSkpCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkiKTsKKyAgICAKKyAgICBpZiAoIV9kYnVzX3N0cmluZ19wb3BfbGluZSAoJnN0ciwgJmxpbmUpKQorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZmFpbGVkIHRvIHBvcCBmaXJzdCBsaW5lIik7CisKKyAgICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19lcXVhbF9jX3N0ciAoJmxpbmUsIEZJUlNUX0xJTkUpKTsKKyAgICAKKyAgICBpZiAoIV9kYnVzX3N0cmluZ19wb3BfbGluZSAoJnN0ciwgJmxpbmUpKQorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZmFpbGVkIHRvIHBvcCBzZWNvbmQgbGluZSIpOworCisgICAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZXF1YWxfY19zdHIgKCZsaW5lLCBTRUNPTkRfTElORSkpOworICAgIAorICAgIGlmICghX2RidXNfc3RyaW5nX3BvcF9saW5lICgmc3RyLCAmbGluZSkpCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJmYWlsZWQgdG8gcG9wIHRoaXJkIGxpbmUiKTsKKworICAgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2VxdWFsX2Nfc3RyICgmbGluZSwgVEhJUkRfTElORSkpOworICAgIAorICAgIGlmICghX2RidXNfc3RyaW5nX3BvcF9saW5lICgmc3RyLCAmbGluZSkpCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJmYWlsZWQgdG8gcG9wIGZvdXJ0aCBsaW5lIik7CisKKyAgICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19lcXVhbF9jX3N0ciAoJmxpbmUsIEZPVVJUSF9MSU5FKSk7CisgICAgCisgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZzdHIpOworICAgIF9kYnVzX3N0cmluZ19mcmVlICgmbGluZSk7CisgIH0KKworICB7CisgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnN0cikpCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkiKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAxMDAwMDsgaSsrKQorICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmc3RyLCAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiKSkKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5Iik7CisKKyAgICBpZiAoIV9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoICgmc3RyLCAxMCkpCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJmYWlsZWQgdG8gc2V0IGxlbmd0aCIpOworCisgICAgLyogYWN0dWFsbHkgY29tcGFjdCAqLworICAgIGlmICghX2RidXNfc3RyaW5nX2NvbXBhY3QgKCZzdHIsIDIwNDgpKQorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZmFpbGVkIHRvIGNvbXBhY3QgYWZ0ZXIgc2V0X2xlbmd0aCIpOworCisgICAgLyogcGVlayBpbnNpZGUgdG8gbWFrZSBzdXJlIGl0IHdvcmtlZCAqLworICAgIGlmICgoKERCdXNSZWFsU3RyaW5nICopJnN0ciktPmFsbG9jYXRlZCA+IDMwKQorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiY29tcGFjdGluZyBzdHJpbmcgZGlkbid0IGRvIGFueXRoaW5nIik7CisKKyAgICBpZiAoIV9kYnVzX3N0cmluZ19lcXVhbF9jX3N0ciAoJnN0ciwgImFiY2RlZmdoaWoiKSkKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInVuZXhwZWN0ZWQgY29udGVudCBhZnRlciBjb21wYWN0Iik7CisKKyAgICAvKiBjb21wYWN0IG5vdGhpbmcgKi8KKyAgICBpZiAoIV9kYnVzX3N0cmluZ19jb21wYWN0ICgmc3RyLCAyMDQ4KSkKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImZhaWxlZCB0byBjb21wYWN0IDJuZCB0aW1lIik7CisKKyAgICBpZiAoIV9kYnVzX3N0cmluZ19lcXVhbF9jX3N0ciAoJnN0ciwgImFiY2RlZmdoaWoiKSkKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInVuZXhwZWN0ZWQgY29udGVudCBhZnRlciAybmQgY29tcGFjdCIpOworCisgICAgLyogYW5kIG1ha2Ugc3VyZSBpdCBzdGlsbCB3b3Jrcy4uLiovCisgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmc3RyLCAiMTIzNDU2IikpCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJmYWlsZWQgdG8gYXBwZW5kIGFmdGVyIGNvbXBhY3QiKTsKKworICAgIGlmICghX2RidXNfc3RyaW5nX2VxdWFsX2Nfc3RyICgmc3RyLCAiYWJjZGVmZ2hpajEyMzQ1NiIpKQorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgidW5leHBlY3RlZCBjb250ZW50IGFmdGVyIGFwcGVuZCIpOworCisgICAgLyogYWZ0ZXIgZ3Jvd2luZyBhdXRvbWF0aWNhbGx5LCB0aGlzIHNob3VsZCBkbyBub3RoaW5nICovCisgICAgaWYgKCFfZGJ1c19zdHJpbmdfY29tcGFjdCAoJnN0ciwgMjAwMDApKQorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZmFpbGVkIHRvIGNvbXBhY3QgYWZ0ZXIgZ3JvdyIpOworCisgICAgLyogYnV0IHRoaXMgb25lIHdpbGwgZG8gc29tZXRoaW5nICovCisgICAgaWYgKCFfZGJ1c19zdHJpbmdfY29tcGFjdCAoJnN0ciwgMCkpCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJmYWlsZWQgdG8gY29tcGFjdCBhZnRlciBncm93Iik7CisKKyAgICBpZiAoIV9kYnVzX3N0cmluZ19lcXVhbF9jX3N0ciAoJnN0ciwgImFiY2RlZmdoaWoxMjM0NTYiKSkKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInVuZXhwZWN0ZWQgY29udGVudCIpOworCisgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmc3RyLCAiIUAjJCUiKSkKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImZhaWxlZCB0byBhcHBlbmQgYWZ0ZXIgY29tcGFjdCIpOworCisgICAgaWYgKCFfZGJ1c19zdHJpbmdfZXF1YWxfY19zdHIgKCZzdHIsICJhYmNkZWZnaGlqMTIzNDU2IUAjJCUiKSkKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInVuZXhwZWN0ZWQgY29udGVudCIpOworCisgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZzdHIpOworICB9CisKKyAgeworICAgIGNvbnN0IGNoYXIgdHdvX3N0cmluZ3NbXSA9ICJvbmVcdHR3byI7CisKKyAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmc3RyKSkKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOworCisgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJm90aGVyKSkKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOworCisgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmc3RyLCB0d29fc3RyaW5ncykpCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkiKTsKKworICAgIGlmICghX2RidXNfc3RyaW5nX3NwbGl0X29uX2J5dGUgKCZzdHIsICdcdCcsICZvdGhlcikpCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkgb3IgZGVsaW1pdGVyIG5vdCBmb3VuZCIpOworCisgICAgaWYgKHN0cmNtcCAoX2RidXNfc3RyaW5nX2dldF9kYXRhICgmc3RyKSwgIm9uZSIpICE9IDApCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJsZWZ0IHNpZGUgYWZ0ZXIgc3BsaXQgb24gdGFiIGlzIHdyb25nIik7CisKKyAgICBpZiAoc3RyY21wIChfZGJ1c19zdHJpbmdfZ2V0X2RhdGEgKCZvdGhlciksICJ0d28iKSAhPSAwKQorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgicmlnaHQgc2lkZSBhZnRlciBzcGxpdCBvbiB0YWIgaXMgd3JvbmciKTsKKworICAgIF9kYnVzX3N0cmluZ19mcmVlICgmc3RyKTsKKyAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJm90aGVyKTsKKyAgfQorCisgIHsKKyAgICBjb25zdCBjaGFyIHVwcGVyX3N0cmluZ1tdID0gIlRPVVBQRVJTVFJJTkciOworICAgIGNvbnN0IGNoYXIgbG93ZXJfc3RyaW5nW10gPSAidG91cHBlcnN0cmluZyI7CisgICAgY29uc3QgY2hhciBsb3dlcjJfc3RyaW5nW10gPSAidG91cHBlclNUUklORyI7CisKKyAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmc3RyKSkKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOworCisgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmc3RyLCB1cHBlcl9zdHJpbmcpKQorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5Iik7CisKKyAgICBfZGJ1c19zdHJpbmdfdG9sb3dlcl9hc2NpaSAoJnN0ciwgMCwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGgoJnN0cikpOworCisgICAgaWYgKCFfZGJ1c19zdHJpbmdfZXF1YWxfY19zdHIgKCZzdHIsIGxvd2VyX3N0cmluZykpCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJfZGJ1c19zdHJpbmdfdG9sb3dlcl9hc2NpaSBmYWlsZWQiKTsKKworICAgIF9kYnVzX3N0cmluZ19mcmVlICgmc3RyKTsKKworICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZzdHIpKQorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5Iik7CisKKyAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZzdHIsIHVwcGVyX3N0cmluZykpCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkiKTsKKworICAgIF9kYnVzX3N0cmluZ190b2xvd2VyX2FzY2lpICgmc3RyLCAwLCA3KTsKKworICAgIGlmICghX2RidXNfc3RyaW5nX2VxdWFsX2Nfc3RyICgmc3RyLCBsb3dlcjJfc3RyaW5nKSkKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIl9kYnVzX3N0cmluZ190b2xvd2VyX2FzY2lpIGZhaWxlZCBpbiBwYXJ0aWFsIGNvbnZlcnNpb24iKTsKKworICAgIF9kYnVzX3N0cmluZ19mcmVlICgmc3RyKTsKKyAgfQorCisgIHsKKyAgICBjb25zdCBjaGFyIGxvd2VyX3N0cmluZ1tdID0gInRvdXBwZXJzdHJpbmciOworICAgIGNvbnN0IGNoYXIgdXBwZXJfc3RyaW5nW10gPSAiVE9VUFBFUlNUUklORyI7CisgICAgY29uc3QgY2hhciB1cHBlcjJfc3RyaW5nW10gPSAiVE9VUFBFUnN0cmluZyI7CisKKyAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmc3RyKSkKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm5vIG1lbW9yeSIpOworCisgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmc3RyLCBsb3dlcl9zdHJpbmcpKQorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5Iik7CisKKyAgICBfZGJ1c19zdHJpbmdfdG91cHBlcl9hc2NpaSAoJnN0ciwgMCwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGgoJnN0cikpOworCisgICAgaWYgKCFfZGJ1c19zdHJpbmdfZXF1YWxfY19zdHIgKCZzdHIsIHVwcGVyX3N0cmluZykpCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJfZGJ1c19zdHJpbmdfdG91cHBlcl9hc2NpaSBmYWlsZWQiKTsKKworICAgIF9kYnVzX3N0cmluZ19mcmVlICgmc3RyKTsKKworICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZzdHIpKQorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5Iik7CisKKyAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZzdHIsIGxvd2VyX3N0cmluZykpCisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJubyBtZW1vcnkiKTsKKworICAgIF9kYnVzX3N0cmluZ190b3VwcGVyX2FzY2lpICgmc3RyLCAwLCA3KTsKKworICAgIGlmICghX2RidXNfc3RyaW5nX2VxdWFsX2Nfc3RyICgmc3RyLCB1cHBlcjJfc3RyaW5nKSkKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIl9kYnVzX3N0cmluZ190b3VwcGVyX2FzY2lpIGZhaWxlZCBpbiBwYXJ0aWFsIGNvbnZlcnNpb24iKTsKKworICAgIF9kYnVzX3N0cmluZ19mcmVlICgmc3RyKTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCisjZW5kaWYgLyogREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMgKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1zdHJpbmcuYyBiL2RidXMvZGJ1cy1zdHJpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGQ5ZjJiCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLXN0cmluZy5jCkBAIC0wLDAgKzEsMjY5MyBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXN0cmluZy5jIFN0cmluZyB1dGlsaXR5IGNsYXNzIChpbnRlcm5hbCB0byBELUJ1cyBpbXBsZW1lbnRhdGlvbikKKyAqIAorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1IFJlZCBIYXQsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwNiBSYWxmIEhhYmFja2VyIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLWludGVybmFscy5oIgorI2luY2x1ZGUgImRidXMtc3RyaW5nLmgiCisvKiB3ZSBhbGxvdyBhIHN5c3RlbSBoZWFkZXIgaGVyZSwgZm9yIHNwZWVkL2NvbnZlbmllbmNlICovCisjaW5jbHVkZSA8c3RyaW5nLmg+CisvKiBmb3IgdnNucHJpbnRmICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNkZWZpbmUgREJVU19DQU5fVVNFX0RCVVNfU1RSSU5HX1BSSVZBVEUgMQorI2luY2x1ZGUgImRidXMtc3RyaW5nLXByaXZhdGUuaCIKKyNpbmNsdWRlICJkYnVzLW1hcnNoYWwtYmFzaWMuaCIgLyogcHJvYmFibHkgc2hvdWxkIGJlIHJlbW92ZWQgYnkgbW92aW5nIHRoZSB1c2FnZSBvZiBEQlVTX1RZUEUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogaW50byB0aGUgbWFyc2hhbGluZy1yZWxhdGVkIGZpbGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogZm9yIERCVVNfVkFfQ09QWSAqLworI2luY2x1ZGUgImRidXMtc3lzZGVwcy5oIgorCisvKioKKyAqIEBkZWZncm91cCBEQnVzU3RyaW5nIERCdXNTdHJpbmcgY2xhc3MKKyAqIEBpbmdyb3VwICBEQnVzSW50ZXJuYWxzCisgKiBAYnJpZWYgREJ1c1N0cmluZyBkYXRhIHN0cnVjdHVyZSBmb3Igc2FmZXIgc3RyaW5nIGhhbmRsaW5nCisgKgorICogVHlwZXMgYW5kIGZ1bmN0aW9ucyByZWxhdGVkIHRvIERCdXNTdHJpbmcuIERCdXNTdHJpbmcgaXMgaW50ZW5kZWQKKyAqIHRvIGJlIGEgc3RyaW5nIGNsYXNzIHRoYXQgbWFrZXMgaXQgaGFyZCB0byBtZXNzIHVwIHNlY3VyaXR5IGlzc3VlcworICogKGFuZCBqdXN0IGluIGdlbmVyYWwgaGFyZGVyIHRvIHdyaXRlIGJ1Z2d5IGNvZGUpLiAgSXQgc2hvdWxkIGJlCisgKiB1c2VkIChvciBleHRlbmRlZCBhbmQgdGhlbiB1c2VkKSByYXRoZXIgdGhhbiB0aGUgbGliYyBzdHVmZiBpbgorICogc3RyaW5nLmguICBUaGUgc3RyaW5nIGNsYXNzIGlzIGEgYml0IGluY29udmVuaWVudCBhdCBzcG90cyBiZWNhdXNlCisgKiBpdCBoYW5kbGVzIG91dC1vZi1tZW1vcnkgZmFpbHVyZXMgYW5kIHRyaWVzIHRvIGJlIGV4dHJhLXJvYnVzdC4KKyAqIAorICogQSBEQnVzU3RyaW5nIGhhcyBhIG1heGltdW0gbGVuZ3RoIHNldCBhdCBpbml0aWFsaXphdGlvbiB0aW1lOyB0aGlzCisgKiBjYW4gYmUgdXNlZCB0byBlbnN1cmUgdGhhdCBhIGJ1ZmZlciBkb2Vzbid0IGdldCB0b28gYmlnLiAgVGhlCisgKiBfZGJ1c19zdHJpbmdfbGVuZ3RoZW4oKSBtZXRob2QgY2hlY2tzIGZvciBvdmVyZmxvdywgYW5kIGZvciBtYXgKKyAqIGxlbmd0aCBiZWluZyBleGNlZWRlZC4KKyAqIAorICogVHJ5IHRvIGF2b2lkIGNvbnZlcnNpb24gdG8gYSBwbGFpbiBDIHN0cmluZywgaS5lLiBhZGQgbWV0aG9kcyBvbgorICogdGhlIHN0cmluZyBvYmplY3QgaW5zdGVhZCwgb25seSBjb252ZXJ0IHRvIEMgc3RyaW5nIHdoZW4gcGFzc2luZworICogdGhpbmdzIG91dCB0byB0aGUgcHVibGljIEFQSS4gSW4gcGFydGljdWxhciwgbm8gc3ByaW50Ziwgc3RyY3B5LAorICogc3RyY2F0LCBhbnkgb2YgdGhhdCBzaG91bGQgYmUgdXNlZC4gVGhlIEdTdHJpbmcgZmVhdHVyZSBvZgorICogYWNjZXB0aW5nIG5lZ2F0aXZlIG51bWJlcnMgZm9yICJsZW5ndGggb2Ygc3RyaW5nIiBpcyBhbHNvIGFic2VudCwKKyAqIGJlY2F1c2UgaXQgY291bGQga2VlcCB1cyBmcm9tIGRldGVjdGluZyBib2d1cyBodWdlIGxlbmd0aHMuIGkuZS4gaWYKKyAqIHdlIHBhc3NlZCBpbiBzb21lIGJvZ3VzIGh1Z2UgbGVuZ3RoIGl0IHdvdWxkIGJlIHRha2VuIHRvIG1lYW4KKyAqICJjdXJyZW50IGxlbmd0aCBvZiBzdHJpbmciIGluc3RlYWQgb2YgImJyb2tlbiBjcmFjayIKKyAqCisgKiBAdG9kbyAjREJ1c1N0cmluZyBuZWVkcyBhIGxvdCBvZiBjbGVhbmluZyB1cDsgc29tZSBvZiB0aGUKKyAqIEFQSSBpcyBubyBsb25nZXIgdXNlZCwgYW5kIHRoZSBBUEkgaXMgcHJldHR5IGluY29uc2lzdGVudC4KKyAqIEluIHBhcnRpY3VsYXIgYWxsIHRoZSAiYXBwZW5kIiBBUElzLCBlc3BlY2lhbGx5IHRob3NlIGludm9sdmluZworICogYWxpZ25tZW50IGJ1dCBwcm9iYWJseSBsb3RzIG9mIHRoZW0sIGFyZSBubyBsb25nZXIgdXNlZCBieSB0aGUKKyAqIG1hcnNoYWxpbmcgY29kZSB3aGljaCBhbHdheXMgZG9lcyAiaW5zZXJ0cyIgbm93LgorICovCisKKy8qKgorICogQGFkZHRvZ3JvdXAgREJ1c1N0cmluZworICogQHsKKyAqLworCitzdGF0aWMgdm9pZAorZml4dXBfYWxpZ25tZW50IChEQnVzUmVhbFN0cmluZyAqcmVhbCkKK3sKKyAgdW5zaWduZWQgY2hhciAqYWxpZ25lZDsKKyAgdW5zaWduZWQgY2hhciAqcmVhbF9ibG9jazsKKyAgdW5zaWduZWQgaW50IG9sZF9hbGlnbl9vZmZzZXQ7CisKKyAgLyogd2UgaGF2ZSB0byBoYXZlIGV4dHJhIHNwYWNlIGluIHJlYWwtPmFsbG9jYXRlZCBmb3IgdGhlIGFsaWduIG9mZnNldCBhbmQgbnVsIGJ5dGUgKi8KKyAgX2RidXNfYXNzZXJ0IChyZWFsLT5sZW4gPD0gcmVhbC0+YWxsb2NhdGVkIC0gX0RCVVNfU1RSSU5HX0FMTE9DQVRJT05fUEFERElORyk7CisgIAorICBvbGRfYWxpZ25fb2Zmc2V0ID0gcmVhbC0+YWxpZ25fb2Zmc2V0OworICByZWFsX2Jsb2NrID0gcmVhbC0+c3RyIC0gb2xkX2FsaWduX29mZnNldDsKKyAgCisgIGFsaWduZWQgPSBfREJVU19BTElHTl9BRERSRVNTIChyZWFsX2Jsb2NrLCA4KTsKKworICByZWFsLT5hbGlnbl9vZmZzZXQgPSBhbGlnbmVkIC0gcmVhbF9ibG9jazsKKyAgcmVhbC0+c3RyID0gYWxpZ25lZDsKKyAgCisgIGlmIChvbGRfYWxpZ25fb2Zmc2V0ICE9IHJlYWwtPmFsaWduX29mZnNldCkKKyAgICB7CisgICAgICAvKiBIZXJlIGNvbWVzIHRoZSBzdWNrICovCisgICAgICBtZW1tb3ZlIChyZWFsX2Jsb2NrICsgcmVhbC0+YWxpZ25fb2Zmc2V0LAorICAgICAgICAgICAgICAgcmVhbF9ibG9jayArIG9sZF9hbGlnbl9vZmZzZXQsCisgICAgICAgICAgICAgICByZWFsLT5sZW4gKyAxKTsKKyAgICB9CisKKyAgX2RidXNfYXNzZXJ0IChyZWFsLT5hbGlnbl9vZmZzZXQgPCA4KTsKKyAgX2RidXNfYXNzZXJ0IChfREJVU19BTElHTl9BRERSRVNTIChyZWFsLT5zdHIsIDgpID09IHJlYWwtPnN0cik7Cit9CisKK3N0YXRpYyB2b2lkCit1bmRvX2FsaWdubWVudCAoREJ1c1JlYWxTdHJpbmcgKnJlYWwpCit7CisgIGlmIChyZWFsLT5hbGlnbl9vZmZzZXQgIT0gMCkKKyAgICB7CisgICAgICBtZW1tb3ZlIChyZWFsLT5zdHIgLSByZWFsLT5hbGlnbl9vZmZzZXQsCisgICAgICAgICAgICAgICByZWFsLT5zdHIsCisgICAgICAgICAgICAgICByZWFsLT5sZW4gKyAxKTsKKworICAgICAgcmVhbC0+c3RyID0gcmVhbC0+c3RyIC0gcmVhbC0+YWxpZ25fb2Zmc2V0OworICAgICAgcmVhbC0+YWxpZ25fb2Zmc2V0ID0gMDsKKyAgICB9Cit9CisKKy8qKgorICogSW5pdGlhbGl6ZXMgYSBzdHJpbmcgdGhhdCBjYW4gYmUgdXAgdG8gdGhlIGdpdmVuIGFsbG9jYXRpb24gc2l6ZQorICogYmVmb3JlIGl0IGhhcyB0byByZWFsbG9jLiBUaGUgc3RyaW5nIHN0YXJ0cyBsaWZlIHdpdGggemVybyBsZW5ndGguCisgKiBUaGUgc3RyaW5nIG11c3QgZXZlbnR1YWxseSBiZSBmcmVlZCB3aXRoIF9kYnVzX3N0cmluZ19mcmVlKCkuCisgKiAKKyAqIEBwYXJhbSBzdHIgbWVtb3J5IHRvIGhvbGQgdGhlIHN0cmluZworICogQHBhcmFtIGFsbG9jYXRlX3NpemUgYW1vdW50IHRvIHByZWFsbG9jYXRlCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzLCAjRkFMU0UgaWYgbm8gbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zdHJpbmdfaW5pdF9wcmVhbGxvY2F0ZWQgKERCdXNTdHJpbmcgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgYWxsb2NhdGVfc2l6ZSkKK3sKKyAgREJ1c1JlYWxTdHJpbmcgKnJlYWw7CisKKyAgX0RCVVNfU1RBVElDX0FTU0VSVCAoc2l6ZW9mIChEQnVzU3RyaW5nKSA9PSBzaXplb2YgKERCdXNSZWFsU3RyaW5nKSk7CisKKyAgX2RidXNfYXNzZXJ0IChzdHIgIT0gTlVMTCk7CisKKyAgcmVhbCA9IChEQnVzUmVhbFN0cmluZyopIHN0cjsKKworICAvKiBJdCdzIHZlcnkgaW1wb3J0YW50IG5vdCB0byB0b3VjaCBhbnl0aGluZworICAgKiBvdGhlciB0aGFuIHJlYWwtPnN0ciBpZiB3ZSdyZSBnb2luZyB0byBmYWlsLAorICAgKiBzaW5jZSB3ZSBhbHNvIHVzZSB0aGlzIGZ1bmN0aW9uIHRvIHJlc2V0CisgICAqIGFuIGV4aXN0aW5nIHN0cmluZywgZS5nLiBpbiBfZGJ1c19zdHJpbmdfc3RlYWxfZGF0YSgpCisgICAqLworICAKKyAgcmVhbC0+c3RyID0gZGJ1c19tYWxsb2MgKF9EQlVTX1NUUklOR19BTExPQ0FUSU9OX1BBRERJTkcgKyBhbGxvY2F0ZV9zaXplKTsKKyAgaWYgKHJlYWwtPnN0ciA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsgIAorICAKKyAgcmVhbC0+YWxsb2NhdGVkID0gX0RCVVNfU1RSSU5HX0FMTE9DQVRJT05fUEFERElORyArIGFsbG9jYXRlX3NpemU7CisgIHJlYWwtPmxlbiA9IDA7CisgIHJlYWwtPnN0cltyZWFsLT5sZW5dID0gJ1wwJzsKKyAgCisgIHJlYWwtPmNvbnN0YW50ID0gRkFMU0U7CisgIHJlYWwtPmxvY2tlZCA9IEZBTFNFOworICByZWFsLT5pbnZhbGlkID0gRkFMU0U7CisgIHJlYWwtPmFsaWduX29mZnNldCA9IDA7CisgIAorICBmaXh1cF9hbGlnbm1lbnQgKHJlYWwpOworICAKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogSW5pdGlhbGl6ZXMgYSBzdHJpbmcuIFRoZSBzdHJpbmcgc3RhcnRzIGxpZmUgd2l0aCB6ZXJvIGxlbmd0aC4gIFRoZQorICogc3RyaW5nIG11c3QgZXZlbnR1YWxseSBiZSBmcmVlZCB3aXRoIF9kYnVzX3N0cmluZ19mcmVlKCkuCisgKiAKKyAqIEBwYXJhbSBzdHIgbWVtb3J5IHRvIGhvbGQgdGhlIHN0cmluZworICogQHJldHVybnMgI1RSVUUgb24gc3VjY2VzcywgI0ZBTFNFIGlmIG5vIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RyaW5nX2luaXQgKERCdXNTdHJpbmcgKnN0cikKK3sKKyAgcmV0dXJuIF9kYnVzX3N0cmluZ19pbml0X3ByZWFsbG9jYXRlZCAoc3RyLCAwKTsKK30KKworLyoqCisgKiBJbml0aWFsaXplcyBhIGNvbnN0YW50IHN0cmluZy4gVGhlIHZhbHVlIHBhcmFtZXRlciBpcyBub3QgY29waWVkCisgKiAoc2hvdWxkIGJlIHN0YXRpYyksIGFuZCB0aGUgc3RyaW5nIG1heSBuZXZlciBiZSBtb2RpZmllZC4KKyAqIEl0IGlzIHNhZmUgYnV0IG5vdCBuZWNlc3NhcnkgdG8gY2FsbCBfZGJ1c19zdHJpbmdfZnJlZSgpCisgKiBvbiBhIGNvbnN0IHN0cmluZy4gVGhlIHN0cmluZyBoYXMgYSBsZW5ndGggbGltaXQgb2YgTUFYSU5UIC0gOC4KKyAqIAorICogQHBhcmFtIHN0ciBtZW1vcnkgdG8gdXNlIGZvciB0aGUgc3RyaW5nCisgKiBAcGFyYW0gdmFsdWUgYSBzdHJpbmcgdG8gYmUgc3RvcmVkIGluIHN0ciAobm90IGNvcGllZCEhISkKKyAqLwordm9pZAorX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKERCdXNTdHJpbmcgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKyAgX2RidXNfYXNzZXJ0ICh2YWx1ZSAhPSBOVUxMKTsKKyAgCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0X2xlbiAoc3RyLCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4gKHZhbHVlKSk7Cit9CisKKy8qKgorICogSW5pdGlhbGl6ZXMgYSBjb25zdGFudCBzdHJpbmcgd2l0aCBhIGxlbmd0aC4gVGhlIHZhbHVlIHBhcmFtZXRlciBpcworICogbm90IGNvcGllZCAoc2hvdWxkIGJlIHN0YXRpYyksIGFuZCB0aGUgc3RyaW5nIG1heSBuZXZlciBiZQorICogbW9kaWZpZWQuICBJdCBpcyBzYWZlIGJ1dCBub3QgbmVjZXNzYXJ5IHRvIGNhbGwgX2RidXNfc3RyaW5nX2ZyZWUoKQorICogb24gYSBjb25zdCBzdHJpbmcuCisgKiAKKyAqIEBwYXJhbSBzdHIgbWVtb3J5IHRvIHVzZSBmb3IgdGhlIHN0cmluZworICogQHBhcmFtIHZhbHVlIGEgc3RyaW5nIHRvIGJlIHN0b3JlZCBpbiBzdHIgKG5vdCBjb3BpZWQhISEpCisgKiBAcGFyYW0gbGVuIHRoZSBsZW5ndGggdG8gdXNlCisgKi8KK3ZvaWQKK19kYnVzX3N0cmluZ19pbml0X2NvbnN0X2xlbiAoREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgbGVuKQoreworICBEQnVzUmVhbFN0cmluZyAqcmVhbDsKKyAgCisgIF9kYnVzX2Fzc2VydCAoc3RyICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKGxlbiA9PSAwIHx8IHZhbHVlICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKGxlbiA8PSBfREJVU19TVFJJTkdfTUFYX0xFTkdUSCk7CisgIF9kYnVzX2Fzc2VydCAobGVuID49IDApOworICAKKyAgcmVhbCA9IChEQnVzUmVhbFN0cmluZyopIHN0cjsKKyAgCisgIHJlYWwtPnN0ciA9ICh1bnNpZ25lZCBjaGFyKikgdmFsdWU7CisgIHJlYWwtPmxlbiA9IGxlbjsKKyAgcmVhbC0+YWxsb2NhdGVkID0gcmVhbC0+bGVuICsgX0RCVVNfU1RSSU5HX0FMTE9DQVRJT05fUEFERElORzsgLyogYSBsaWUsIGp1c3QgdG8gYXZvaWQgc3BlY2lhbC1jYXNlIGFzc2VydGlvbnMuLi4gKi8KKyAgcmVhbC0+Y29uc3RhbnQgPSBUUlVFOworICByZWFsLT5sb2NrZWQgPSBUUlVFOworICByZWFsLT5pbnZhbGlkID0gRkFMU0U7CisgIHJlYWwtPmFsaWduX29mZnNldCA9IDA7CisKKyAgLyogV2UgZG9uJ3QgcmVxdWlyZSBjb25zdCBzdHJpbmdzIHRvIGJlIDgtYnl0ZSBhbGlnbmVkIGFzIHRoZQorICAgKiBtZW1vcnkgaXMgY29taW5nIGZyb20gZWxzZXdoZXJlLgorICAgKi8KK30KKworLyoqCisgKiBJbml0aWFsaXplcyBhIHN0cmluZyBmcm9tIGFub3RoZXIgc3RyaW5nLiBUaGUKKyAqIHN0cmluZyBtdXN0IGV2ZW50dWFsbHkgYmUgZnJlZWQgd2l0aCBfZGJ1c19zdHJpbmdfZnJlZSgpLgorICoKKyAqIEBwYXJhbSBzdHIgbWVtb3J5IHRvIGhvbGQgdGhlIHN0cmluZworICogQHBhcmFtIGZyb20gaW5zdGFuY2UgZnJvbSB3aGljaCB0aGUgc3RyaW5nIGlzIGluaXRpYWxpemVkCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzLCAjRkFMU0UgaWYgbm8gbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zdHJpbmdfaW5pdF9mcm9tX3N0cmluZyhEQnVzU3RyaW5nICAgICAgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpmcm9tKQoreworIGlmICghX2RidXNfc3RyaW5nX2luaXQgKHN0cikpCisgICAgIHJldHVybiBGQUxTRTsKKyByZXR1cm4gX2RidXNfc3RyaW5nX2FwcGVuZCAoc3RyLCBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKGZyb20pKTsKK30KKworLyoqCisgKiBGcmVlcyBhIHN0cmluZyBjcmVhdGVkIGJ5IF9kYnVzX3N0cmluZ19pbml0KCkuCisgKgorICogQHBhcmFtIHN0ciBtZW1vcnkgd2hlcmUgdGhlIHN0cmluZyBpcyBzdG9yZWQuCisgKi8KK3ZvaWQKK19kYnVzX3N0cmluZ19mcmVlIChEQnVzU3RyaW5nICpzdHIpCit7CisgIERCdXNSZWFsU3RyaW5nICpyZWFsID0gKERCdXNSZWFsU3RyaW5nKikgc3RyOworICBEQlVTX0dFTkVSSUNfU1RSSU5HX1BSRUFNQkxFIChyZWFsKTsKKyAgCisgIGlmIChyZWFsLT5jb25zdGFudCkKKyAgICByZXR1cm47CisKKyAgLyogc28gaXQncyBzYWZlIGlmIEBwIHN0ciByZXR1cm5lZCBieSBhIGZhaWxlZAorICAgKiBfZGJ1c19zdHJpbmdfaW5pdCBjYWxsCisgICAqIEJ1ZzogaHR0cHM6Ly9idWdzLmZyZWVkZXNrdG9wLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjU5NTkKKyAgICovCisgIGlmIChyZWFsLT5zdHIgPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAgZGJ1c19mcmVlIChyZWFsLT5zdHIgLSByZWFsLT5hbGlnbl9vZmZzZXQpOworCisgIHJlYWwtPmludmFsaWQgPSBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2NvbXBhY3QgKERCdXNSZWFsU3RyaW5nICpyZWFsLAorICAgICAgICAgaW50ICAgICAgICAgICAgIG1heF93YXN0ZSkKK3sKKyAgdW5zaWduZWQgY2hhciAqbmV3X3N0cjsKKyAgaW50IG5ld19hbGxvY2F0ZWQ7CisgIGludCB3YXN0ZTsKKworICB3YXN0ZSA9IHJlYWwtPmFsbG9jYXRlZCAtIChyZWFsLT5sZW4gKyBfREJVU19TVFJJTkdfQUxMT0NBVElPTl9QQURESU5HKTsKKworICBpZiAod2FzdGUgPD0gbWF4X3dhc3RlKQorICAgIHJldHVybiBUUlVFOworCisgIG5ld19hbGxvY2F0ZWQgPSByZWFsLT5sZW4gKyBfREJVU19TVFJJTkdfQUxMT0NBVElPTl9QQURESU5HOworCisgIG5ld19zdHIgPSBkYnVzX3JlYWxsb2MgKHJlYWwtPnN0ciAtIHJlYWwtPmFsaWduX29mZnNldCwgbmV3X2FsbG9jYXRlZCk7CisgIGlmIChfREJVU19VTkxJS0VMWSAobmV3X3N0ciA9PSBOVUxMKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmVhbC0+c3RyID0gbmV3X3N0ciArIHJlYWwtPmFsaWduX29mZnNldDsKKyAgcmVhbC0+YWxsb2NhdGVkID0gbmV3X2FsbG9jYXRlZDsKKyAgZml4dXBfYWxpZ25tZW50IChyZWFsKTsKKworICByZXR1cm4gVFJVRTsKK30KKworI2lmZGVmIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTCisvKiBOb3QgdXNpbmcgdGhpcyBmZWF0dXJlIGF0IHRoZSBtb21lbnQsCisgKiBzbyBtYXJrZWQgREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMtb25seQorICovCisvKioKKyAqIExvY2tzIGEgc3RyaW5nIHN1Y2ggdGhhdCBhbnkgYXR0ZW1wdHMgdG8gY2hhbmdlIHRoZSBzdHJpbmcgd2lsbAorICogcmVzdWx0IGluIGFib3J0aW5nIHRoZSBwcm9ncmFtLiBBbHNvLCBpZiB0aGUgc3RyaW5nIGlzIHdhc3RpbmcgYQorICogbG90IG9mIG1lbW9yeSAoYWxsb2NhdGlvbiBpcyBzdWZmaWNpZW50bHkgbGFyZ2VyIHRoYW4gd2hhdCB0aGUKKyAqIHN0cmluZyBpcyByZWFsbHkgdXNpbmcpLCBfZGJ1c19zdHJpbmdfbG9jaygpIHdpbGwgcmVhbGxvYyB0aGUKKyAqIHN0cmluZydzIGRhdGEgdG8gImNvbXBhY3QiIGl0LgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZyB0byBsb2NrLgorICovCit2b2lkCitfZGJ1c19zdHJpbmdfbG9jayAoREJ1c1N0cmluZyAqc3RyKQoreyAgCisgIERCVVNfTE9DS0VEX1NUUklOR19QUkVBTUJMRSAoc3RyKTsgLyogY2FuIGxvY2sgbXVsdGlwbGUgdGltZXMgKi8KKworICByZWFsLT5sb2NrZWQgPSBUUlVFOworCisgIC8qIFRyeSB0byByZWFsbG9jIHRvIGF2b2lkIGV4Y2VzcyBtZW1vcnkgdXNhZ2UsIHNpbmNlCisgICAqIHdlIGtub3cgd2Ugd29uJ3QgY2hhbmdlIHRoZSBzdHJpbmcgZnVydGhlcgorICAgKi8KKyNkZWZpbmUgTUFYX1dBU1RFIDQ4CisgIGNvbXBhY3QgKHJlYWwsIE1BWF9XQVNURSk7Cit9CisjZW5kaWYgLyogREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMgKi8KKworc3RhdGljIGRidXNfYm9vbF90CityZWFsbG9jYXRlX2Zvcl9sZW5ndGggKERCdXNSZWFsU3RyaW5nICpyZWFsLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgbmV3X2xlbmd0aCkKK3sKKyAgaW50IG5ld19hbGxvY2F0ZWQ7CisgIHVuc2lnbmVkIGNoYXIgKm5ld19zdHI7CisKKyAgLyogYXQgbGVhc3QgZG91YmxlIG91ciBvbGQgYWxsb2NhdGlvbiB0byBhdm9pZCBPKG4pLCBhdm9pZGluZworICAgKiBvdmVyZmxvdworICAgKi8KKyAgaWYgKHJlYWwtPmFsbG9jYXRlZCA+IChfREJVU19TVFJJTkdfTUFYX0xFTkdUSCArIF9EQlVTX1NUUklOR19BTExPQ0FUSU9OX1BBRERJTkcpIC8gMikKKyAgICBuZXdfYWxsb2NhdGVkID0gX0RCVVNfU1RSSU5HX01BWF9MRU5HVEggKyBfREJVU19TVFJJTkdfQUxMT0NBVElPTl9QQURESU5HOworICBlbHNlCisgICAgbmV3X2FsbG9jYXRlZCA9IHJlYWwtPmFsbG9jYXRlZCAqIDI7CisKKyAgLyogaWYgeW91IGNoYW5nZSB0aGUgY29kZSBqdXN0IGFib3ZlIGhlcmUsIHJ1biB0aGUgdGVzdHMgd2l0aG91dAorICAgKiB0aGUgZm9sbG93aW5nIGFzc2VydC1vbmx5IGhhY2sgYmVmb3JlIHlvdSBjb21taXQKKyAgICovCisgIC8qIFRoaXMgaXMga2V5ZWQgb2ZmIGFzc2VydHMgaW4gYWRkaXRpb24gdG8gdGVzdHMgc28gd2hlbiB5b3UKKyAgICogZGlzYWJsZSBhc3NlcnRzIHRvIHByb2ZpbGUsIHlvdSBkb24ndCBnZXQgdGhpcyBkZXN0cm95ZXIKKyAgICogb2YgcHJvZmlsZXMuCisgICAqLworI2lmIGRlZmluZWQgKERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTKSAmJiAhZGVmaW5lZCAoREJVU19ESVNBQkxFX0FTU0VSVCkKKyAgbmV3X2FsbG9jYXRlZCA9IDA7IC8qIGVuc3VyZSBhIHJlYWxsb2MgZXZlcnkgdGltZSBzbyB0aGF0IHdlIGdvCisgICAgICAgICAgICAgICAgICAgICAgKiB0aHJvdWdoIGFsbCBtYWxsb2MgZmFpbHVyZSBjb2RlcGF0aHMKKyAgICAgICAgICAgICAgICAgICAgICAqLworI2VuZGlmCisKKyAgLyogQnV0IGJlIHN1cmUgd2UgYWx3YXlzIGFsbG9jIGF0IGxlYXN0IHNwYWNlIGZvciB0aGUgbmV3IGxlbmd0aCAqLworICBuZXdfYWxsb2NhdGVkID0gTUFYIChuZXdfYWxsb2NhdGVkLAorICAgICAgICAgICAgICAgICAgICAgICBuZXdfbGVuZ3RoICsgX0RCVVNfU1RSSU5HX0FMTE9DQVRJT05fUEFERElORyk7CisKKyAgX2RidXNfYXNzZXJ0IChuZXdfYWxsb2NhdGVkID49IHJlYWwtPmFsbG9jYXRlZCk7IC8qIGNvZGUgcmVsaWVzIG9uIHRoaXMgKi8KKyAgbmV3X3N0ciA9IGRidXNfcmVhbGxvYyAocmVhbC0+c3RyIC0gcmVhbC0+YWxpZ25fb2Zmc2V0LCBuZXdfYWxsb2NhdGVkKTsKKyAgaWYgKF9EQlVTX1VOTElLRUxZIChuZXdfc3RyID09IE5VTEwpKQorICAgIHJldHVybiBGQUxTRTsKKworICByZWFsLT5zdHIgPSBuZXdfc3RyICsgcmVhbC0+YWxpZ25fb2Zmc2V0OworICByZWFsLT5hbGxvY2F0ZWQgPSBuZXdfYWxsb2NhdGVkOworICBmaXh1cF9hbGlnbm1lbnQgKHJlYWwpOworCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIENvbXBhY3RzIHRoZSBzdHJpbmcgdG8gYXZvaWQgd2FzdGVkIG1lbW9yeS4gIFdhc3RlZCBtZW1vcnkgaXMKKyAqIG1lbW9yeSB0aGF0IGlzIGFsbG9jYXRlZCBidXQgbm90IGFjdHVhbGx5IHJlcXVpcmVkIHRvIHN0b3JlIHRoZQorICogY3VycmVudCBsZW5ndGggb2YgdGhlIHN0cmluZy4gIFRoZSBjb21wYWN0IGlzIG9ubHkgZG9uZSBpZiBtb3JlCisgKiB0aGFuIHRoZSBnaXZlbiBhbW91bnQgb2YgbWVtb3J5IGlzIGJlaW5nIHdhc3RlZCAob3RoZXJ3aXNlIHRoZQorICogd2FzdGUgaXMgaWdub3JlZCBhbmQgdGhlIGNhbGwgZG9lcyBub3RoaW5nKS4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcKKyAqIEBwYXJhbSBtYXhfd2FzdGUgdGhlIG1heGltdW0gYW1vdW50IG9mIHdhc3RlIHRvIGlnbm9yZQorICogQHJldHVybnMgI0ZBTFNFIGlmIHRoZSBjb21wYWN0IGZhaWxlZCBkdWUgdG8gcmVhbGxvYyBmYWlsdXJlCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zdHJpbmdfY29tcGFjdCAoREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIG1heF93YXN0ZSkKK3sKKyAgREJVU19TVFJJTkdfUFJFQU1CTEUgKHN0cik7CisKKyAgcmV0dXJuIGNvbXBhY3QgKHJlYWwsIG1heF93YXN0ZSk7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorc2V0X2xlbmd0aCAoREJ1c1JlYWxTdHJpbmcgKnJlYWwsCisgICAgICAgICAgICBpbnQgICAgICAgICAgICAgbmV3X2xlbmd0aCkKK3sKKyAgLyogTm90ZSwgd2UgYXJlIHNldHRpbmcgdGhlIGxlbmd0aCBub3QgaW5jbHVkaW5nIG51bCB0ZXJtaW5hdGlvbiAqLworCisgIC8qIGV4Y2VlZGluZyBtYXggbGVuZ3RoIGlzIHRoZSBzYW1lIGFzIGZhaWx1cmUgdG8gYWxsb2NhdGUgbWVtb3J5ICovCisgIGlmIChfREJVU19VTkxJS0VMWSAobmV3X2xlbmd0aCA+IF9EQlVTX1NUUklOR19NQVhfTEVOR1RIKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIGVsc2UgaWYgKG5ld19sZW5ndGggPiAocmVhbC0+YWxsb2NhdGVkIC0gX0RCVVNfU1RSSU5HX0FMTE9DQVRJT05fUEFERElORykgJiYKKyAgICAgICAgICAgX0RCVVNfVU5MSUtFTFkgKCFyZWFsbG9jYXRlX2Zvcl9sZW5ndGggKHJlYWwsIG5ld19sZW5ndGgpKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIGVsc2UKKyAgICB7CisgICAgICByZWFsLT5sZW4gPSBuZXdfbGVuZ3RoOworICAgICAgcmVhbC0+c3RyW25ld19sZW5ndGhdID0gJ1wwJzsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KK30KKworc3RhdGljIGRidXNfYm9vbF90CitvcGVuX2dhcCAoaW50ICAgICAgICAgICAgIGxlbiwKKyAgICAgICAgICBEQnVzUmVhbFN0cmluZyAqZGVzdCwKKyAgICAgICAgICBpbnQgICAgICAgICAgICAgaW5zZXJ0X2F0KQoreworICBpZiAobGVuID09IDApCisgICAgcmV0dXJuIFRSVUU7CisKKyAgaWYgKGxlbiA+IF9EQlVTX1NUUklOR19NQVhfTEVOR1RIIC0gZGVzdC0+bGVuKQorICAgIHJldHVybiBGQUxTRTsgLyogZGV0ZWN0ZWQgb3ZlcmZsb3cgb2YgZGVzdC0+bGVuICsgbGVuIGJlbG93ICovCisgIAorICBpZiAoIXNldF9sZW5ndGggKGRlc3QsIGRlc3QtPmxlbiArIGxlbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIG1lbW1vdmUgKGRlc3QtPnN0ciArIGluc2VydF9hdCArIGxlbiwgCisgICAgICAgICAgIGRlc3QtPnN0ciArIGluc2VydF9hdCwKKyAgICAgICAgICAgZGVzdC0+bGVuIC0gbGVuIC0gaW5zZXJ0X2F0KTsKKworICByZXR1cm4gVFJVRTsKK30KKworI2lmbmRlZiBfZGJ1c19zdHJpbmdfZ2V0X2RhdGEKKy8qKgorICogR2V0cyB0aGUgcmF3IGNoYXJhY3RlciBidWZmZXIgZnJvbSB0aGUgc3RyaW5nLiAgVGhlIHJldHVybmVkIGJ1ZmZlcgorICogd2lsbCBiZSBudWwtdGVybWluYXRlZCwgYnV0IG5vdGUgdGhhdCBzdHJpbmdzIG1heSBjb250YWluIGJpbmFyeQorICogZGF0YSBzbyB0aGVyZSBtYXkgYmUgZXh0cmEgbnVsIGNoYXJhY3RlcnMgcHJpb3IgdG8gdGhlIHRlcm1pbmF0aW9uLgorICogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgbGl0dGxlLXVzZWQsIGV4dGVuZCBEQnVzU3RyaW5nIG9yIGFkZAorICogc3R1ZmYgdG8gZGJ1cy1zeXNkZXBzLmMgaW5zdGVhZC4gSXQncyBhbiBlcnJvciB0byB1c2UgdGhpcworICogZnVuY3Rpb24gb24gYSBjb25zdCBzdHJpbmcuCisgKgorICogQHBhcmFtIHN0ciB0aGUgc3RyaW5nCisgKiBAcmV0dXJucyB0aGUgZGF0YQorICovCitjaGFyKgorX2RidXNfc3RyaW5nX2dldF9kYXRhIChEQnVzU3RyaW5nICpzdHIpCit7CisgIERCVVNfU1RSSU5HX1BSRUFNQkxFIChzdHIpOworICAKKyAgcmV0dXJuIChjaGFyKikgcmVhbC0+c3RyOworfQorI2VuZGlmIC8qIF9kYnVzX3N0cmluZ19nZXRfZGF0YSAqLworCisvKiBvbmx5IGRvIHRoZSBmdW5jdGlvbiBpZiB3ZSBkb24ndCBoYXZlIHRoZSBtYWNybyAqLworI2lmbmRlZiBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEKKy8qKgorICogR2V0cyB0aGUgcmF3IGNoYXJhY3RlciBidWZmZXIgZnJvbSBhIGNvbnN0IHN0cmluZy4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcKKyAqIEByZXR1cm5zIHRoZSBzdHJpbmcgZGF0YQorICovCitjb25zdCBjaGFyKgorX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChjb25zdCBEQnVzU3RyaW5nICAqc3RyKQoreworICBEQlVTX0NPTlNUX1NUUklOR19QUkVBTUJMRSAoc3RyKTsKKyAgCisgIHJldHVybiAoY29uc3QgY2hhciopIHJlYWwtPnN0cjsKK30KKyNlbmRpZiAvKiBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKi8KKworLyoqCisgKiBHZXRzIGEgc3ViLXBvcnRpb24gb2YgdGhlIHJhdyBjaGFyYWN0ZXIgYnVmZmVyIGZyb20gdGhlCisgKiBzdHJpbmcuIFRoZSAibGVuIiBmaWVsZCBpcyByZXF1aXJlZCBzaW1wbHkgZm9yIGVycm9yCisgKiBjaGVja2luZywgdG8gYmUgc3VyZSB5b3UgZG9uJ3QgdHJ5IHRvIHVzZSBtb3JlCisgKiBzdHJpbmcgdGhhbiBleGlzdHMuIFRoZSBudWwgdGVybWluYXRpb24gb2YgdGhlCisgKiByZXR1cm5lZCBidWZmZXIgcmVtYWlucyBhdCB0aGUgZW5kIG9mIHRoZSBlbnRpcmUKKyAqIHN0cmluZywgbm90IGF0IHN0YXJ0ICsgbGVuLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZworICogQHBhcmFtIHN0YXJ0IGJ5dGUgb2Zmc2V0IHRvIHJldHVybgorICogQHBhcmFtIGxlbiBsZW5ndGggb2Ygc2VnbWVudCB0byByZXR1cm4KKyAqIEByZXR1cm5zIHRoZSBzdHJpbmcgZGF0YQorICovCitjaGFyKgorX2RidXNfc3RyaW5nX2dldF9kYXRhX2xlbiAoREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICBsZW4pCit7CisgIERCVVNfU1RSSU5HX1BSRUFNQkxFIChzdHIpOworICBfZGJ1c19hc3NlcnQgKHN0YXJ0ID49IDApOworICBfZGJ1c19hc3NlcnQgKGxlbiA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChzdGFydCA8PSByZWFsLT5sZW4pOworICBfZGJ1c19hc3NlcnQgKGxlbiA8PSByZWFsLT5sZW4gLSBzdGFydCk7CisgIAorICByZXR1cm4gKGNoYXIqKSByZWFsLT5zdHIgKyBzdGFydDsKK30KKworLyogb25seSBkbyB0aGUgZnVuY3Rpb24gaWYgd2UgZG9uJ3QgaGF2ZSB0aGUgbWFjcm8gKi8KKyNpZm5kZWYgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhX2xlbgorLyoqCisgKiBjb25zdCB2ZXJzaW9uIG9mIF9kYnVzX3N0cmluZ19nZXRfZGF0YV9sZW4oKS4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcKKyAqIEBwYXJhbSBzdGFydCBieXRlIG9mZnNldCB0byByZXR1cm4KKyAqIEBwYXJhbSBsZW4gbGVuZ3RoIG9mIHNlZ21lbnQgdG8gcmV0dXJuCisgKiBAcmV0dXJucyB0aGUgc3RyaW5nIGRhdGEKKyAqLworY29uc3QgY2hhcioKK19kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YV9sZW4gKGNvbnN0IERCdXNTdHJpbmcgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgbGVuKQoreworICBEQlVTX0NPTlNUX1NUUklOR19QUkVBTUJMRSAoc3RyKTsKKyAgX2RidXNfYXNzZXJ0IChzdGFydCA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChsZW4gPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAoc3RhcnQgPD0gcmVhbC0+bGVuKTsKKyAgX2RidXNfYXNzZXJ0IChsZW4gPD0gcmVhbC0+bGVuIC0gc3RhcnQpOworICAKKyAgcmV0dXJuIChjb25zdCBjaGFyKikgcmVhbC0+c3RyICsgc3RhcnQ7Cit9CisjZW5kaWYgLyogX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhX2xlbiAqLworCisvKiBvbmx5IGRvIHRoZSBmdW5jdGlvbiBpZiB3ZSBkb24ndCBoYXZlIHRoZSBtYWNybyAqLworI2lmbmRlZiBfZGJ1c19zdHJpbmdfc2V0X2J5dGUKKy8qKgorICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGJ5dGUgYXQgdGhlIGdpdmVuIHBvc2l0aW9uLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZworICogQHBhcmFtIGkgdGhlIHBvc2l0aW9uCisgKiBAcGFyYW0gYnl0ZSB0aGUgbmV3IHZhbHVlCisgKi8KK3ZvaWQKK19kYnVzX3N0cmluZ19zZXRfYnl0ZSAoREJ1c1N0cmluZyAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICBpLAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICBieXRlKQoreworICBEQlVTX1NUUklOR19QUkVBTUJMRSAoc3RyKTsKKyAgX2RidXNfYXNzZXJ0IChpIDwgcmVhbC0+bGVuKTsKKyAgX2RidXNfYXNzZXJ0IChpID49IDApOworICAKKyAgcmVhbC0+c3RyW2ldID0gYnl0ZTsKK30KKyNlbmRpZiAvKiBfZGJ1c19zdHJpbmdfc2V0X2J5dGUgKi8KKworLyogb25seSBoYXZlIHRoZSBmdW5jdGlvbiBpZiB3ZSBkaWRuJ3QgY3JlYXRlIGEgbWFjcm8gKi8KKyNpZm5kZWYgX2RidXNfc3RyaW5nX2dldF9ieXRlCisvKioKKyAqIEdldHMgdGhlIGJ5dGUgYXQgdGhlIGdpdmVuIHBvc2l0aW9uLiBJdCBpcworICogYWxsb3dlZCB0byBhc2sgZm9yIHRoZSBudWwgYnl0ZSBhdCB0aGUgZW5kIG9mCisgKiB0aGUgc3RyaW5nLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZworICogQHBhcmFtIHN0YXJ0IHRoZSBwb3NpdGlvbgorICogQHJldHVybnMgdGhlIGJ5dGUgYXQgdGhhdCBwb3NpdGlvbgorICovCit1bnNpZ25lZCBjaGFyCitfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKGNvbnN0IERCdXNTdHJpbmcgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBzdGFydCkKK3sKKyAgREJVU19DT05TVF9TVFJJTkdfUFJFQU1CTEUgKHN0cik7CisgIF9kYnVzX2Fzc2VydCAoc3RhcnQgPD0gcmVhbC0+bGVuKTsKKyAgX2RidXNfYXNzZXJ0IChzdGFydCA+PSAwKTsKKyAgCisgIHJldHVybiByZWFsLT5zdHJbc3RhcnRdOworfQorI2VuZGlmIC8qIF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAqLworCisvKioKKyAqIEluc2VydHMgYSBudW1iZXIgb2YgYnl0ZXMgb2YgYSBnaXZlbiB2YWx1ZSBhdCB0aGUKKyAqIGdpdmVuIHBvc2l0aW9uLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZworICogQHBhcmFtIGkgdGhlIHBvc2l0aW9uCisgKiBAcGFyYW0gbl9ieXRlcyBudW1iZXIgb2YgYnl0ZXMKKyAqIEBwYXJhbSBieXRlIHRoZSB2YWx1ZSB0byBpbnNlcnQKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3N0cmluZ19pbnNlcnRfYnl0ZXMgKERCdXNTdHJpbmcgICAqc3RyLAorCQkJICAgaW50ICAgICAgICAgICBpLAorCQkJICAgaW50ICAgICAgICAgICBuX2J5dGVzLAorCQkJICAgdW5zaWduZWQgY2hhciBieXRlKQoreworICBEQlVTX1NUUklOR19QUkVBTUJMRSAoc3RyKTsKKyAgX2RidXNfYXNzZXJ0IChpIDw9IHJlYWwtPmxlbik7CisgIF9kYnVzX2Fzc2VydCAoaSA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChuX2J5dGVzID49IDApOworCisgIGlmIChuX2J5dGVzID09IDApCisgICAgcmV0dXJuIFRSVUU7CisgIAorICBpZiAoIW9wZW5fZ2FwIChuX2J5dGVzLCByZWFsLCBpKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIAorICBtZW1zZXQgKHJlYWwtPnN0ciArIGksIGJ5dGUsIG5fYnl0ZXMpOworCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIEluc2VydHMgYSBzaW5nbGUgYnl0ZSBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24uCisgKgorICogQHBhcmFtIHN0ciB0aGUgc3RyaW5nCisgKiBAcGFyYW0gaSB0aGUgcG9zaXRpb24KKyAqIEBwYXJhbSBieXRlIHRoZSB2YWx1ZSB0byBpbnNlcnQKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3N0cmluZ19pbnNlcnRfYnl0ZSAoREJ1c1N0cmluZyAgICpzdHIsCisJCQkgICBpbnQgICAgICAgICAgIGksCisJCQkgICB1bnNpZ25lZCBjaGFyIGJ5dGUpCit7CisgIERCVVNfU1RSSU5HX1BSRUFNQkxFIChzdHIpOworICBfZGJ1c19hc3NlcnQgKGkgPD0gcmVhbC0+bGVuKTsKKyAgX2RidXNfYXNzZXJ0IChpID49IDApOworICAKKyAgaWYgKCFvcGVuX2dhcCAoMSwgcmVhbCwgaSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJlYWwtPnN0cltpXSA9IGJ5dGU7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogTGlrZSBfZGJ1c19zdHJpbmdfZ2V0X2RhdGEoKSwgYnV0IHJlbW92ZXMgdGhlCisgKiBnb3R0ZW4gZGF0YSBmcm9tIHRoZSBvcmlnaW5hbCBzdHJpbmcuIFRoZSBjYWxsZXIKKyAqIG11c3QgZnJlZSB0aGUgZGF0YSByZXR1cm5lZC4gVGhpcyBmdW5jdGlvbiBtYXkKKyAqIGZhaWwgZHVlIHRvIGxhY2sgb2YgbWVtb3J5LCBhbmQgcmV0dXJuICNGQUxTRS4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcKKyAqIEBwYXJhbSBkYXRhX3JldHVybiBsb2NhdGlvbiB0byByZXR1cm4gdGhlIGJ1ZmZlcgorICogQHJldHVybnMgI1RSVUUgb24gc3VjY2VzcworICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RyaW5nX3N0ZWFsX2RhdGEgKERCdXNTdHJpbmcgICAgICAgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAgICAgICAqKmRhdGFfcmV0dXJuKQoreworICBEQlVTX1NUUklOR19QUkVBTUJMRSAoc3RyKTsKKyAgX2RidXNfYXNzZXJ0IChkYXRhX3JldHVybiAhPSBOVUxMKTsKKworICB1bmRvX2FsaWdubWVudCAocmVhbCk7CisgIAorICAqZGF0YV9yZXR1cm4gPSAoY2hhciopIHJlYWwtPnN0cjsKKworICAvKiByZXNldCB0aGUgc3RyaW5nICovCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKHN0cikpCisgICAgeworICAgICAgLyogaHJtLCBwdXQgaXQgYmFjayB0aGVuICovCisgICAgICByZWFsLT5zdHIgPSAodW5zaWduZWQgY2hhciopICpkYXRhX3JldHVybjsKKyAgICAgICpkYXRhX3JldHVybiA9IE5VTEw7CisgICAgICBmaXh1cF9hbGlnbm1lbnQgKHJlYWwpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBDb3BpZXMgdGhlIGRhdGEgZnJvbSB0aGUgc3RyaW5nIGludG8gYSBjaGFyKgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZworICogQHBhcmFtIGRhdGFfcmV0dXJuIHBsYWNlIHRvIHJldHVybiB0aGUgZGF0YQorICogQHJldHVybnMgI1RSVUUgb24gc3VjY2VzcywgI0ZBTFNFIG9uIG5vIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RyaW5nX2NvcHlfZGF0YSAoY29uc3QgREJ1c1N0cmluZyAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICAgICAgKipkYXRhX3JldHVybikKK3sKKyAgREJVU19DT05TVF9TVFJJTkdfUFJFQU1CTEUgKHN0cik7CisgIF9kYnVzX2Fzc2VydCAoZGF0YV9yZXR1cm4gIT0gTlVMTCk7CisgIAorICAqZGF0YV9yZXR1cm4gPSBkYnVzX21hbGxvYyAocmVhbC0+bGVuICsgMSk7CisgIGlmICgqZGF0YV9yZXR1cm4gPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgbWVtY3B5ICgqZGF0YV9yZXR1cm4sIHJlYWwtPnN0ciwgcmVhbC0+bGVuICsgMSk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogQ29waWVzIHRoZSBjb250ZW50cyBvZiBhIERCdXNTdHJpbmcgaW50byBhIGRpZmZlcmVudCBidWZmZXIuIEl0IGlzCisgKiBhIGJ1ZyBpZiBhdmFpbF9sZW4gaXMgdG9vIHNob3J0IHRvIGhvbGQgdGhlIHN0cmluZyBjb250ZW50cy4gbnVsCisgKiB0ZXJtaW5hdGlvbiBpcyBub3QgY29waWVkLCBqdXN0IHRoZSBzdXBwbGllZCBieXRlcy4KKyAqIAorICogQHBhcmFtIHN0ciBhIHN0cmluZworICogQHBhcmFtIGJ1ZmZlciBhIEMgYnVmZmVyIHRvIGNvcHkgZGF0YSB0bworICogQHBhcmFtIGF2YWlsX2xlbiBtYXhpbXVtIGxlbmd0aCBvZiBDIGJ1ZmZlcgorICovCit2b2lkCitfZGJ1c19zdHJpbmdfY29weV90b19idWZmZXIgKGNvbnN0IERCdXNTdHJpbmcgICpzdHIsCisJCQkgICAgIGNoYXIgICAgICAgICAgICAgICpidWZmZXIsCisJCQkgICAgIGludCAgICAgICAgICAgICAgICBhdmFpbF9sZW4pCit7CisgIERCVVNfQ09OU1RfU1RSSU5HX1BSRUFNQkxFIChzdHIpOworCisgIF9kYnVzX2Fzc2VydCAoYXZhaWxfbGVuID49IDApOworICBfZGJ1c19hc3NlcnQgKGF2YWlsX2xlbiA+PSByZWFsLT5sZW4pOworICAKKyAgbWVtY3B5IChidWZmZXIsIHJlYWwtPnN0ciwgcmVhbC0+bGVuKTsKK30KKworLyoqCisgKiBDb3BpZXMgdGhlIGNvbnRlbnRzIG9mIGEgREJ1c1N0cmluZyBpbnRvIGEgZGlmZmVyZW50IGJ1ZmZlci4gSXQgaXMKKyAqIGEgYnVnIGlmIGF2YWlsX2xlbiBpcyB0b28gc2hvcnQgdG8gaG9sZCB0aGUgc3RyaW5nIGNvbnRlbnRzIHBsdXMgYQorICogbnVsIGJ5dGUuIAorICogCisgKiBAcGFyYW0gc3RyIGEgc3RyaW5nCisgKiBAcGFyYW0gYnVmZmVyIGEgQyBidWZmZXIgdG8gY29weSBkYXRhIHRvCisgKiBAcGFyYW0gYXZhaWxfbGVuIG1heGltdW0gbGVuZ3RoIG9mIEMgYnVmZmVyCisgKi8KK3ZvaWQKK19kYnVzX3N0cmluZ19jb3B5X3RvX2J1ZmZlcl93aXRoX251bCAoY29uc3QgREJ1c1N0cmluZyAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAgICAgICAgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGF2YWlsX2xlbikKK3sKKyAgREJVU19DT05TVF9TVFJJTkdfUFJFQU1CTEUgKHN0cik7CisKKyAgX2RidXNfYXNzZXJ0IChhdmFpbF9sZW4gPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAoYXZhaWxfbGVuID4gcmVhbC0+bGVuKTsKKyAgCisgIG1lbWNweSAoYnVmZmVyLCByZWFsLT5zdHIsIHJlYWwtPmxlbisxKTsKK30KKworLyogT25seSBoYXZlIHRoZSBmdW5jdGlvbiBpZiB3ZSBkb24ndCBoYXZlIHRoZSBtYWNybyAqLworI2lmbmRlZiBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aAorLyoqCisgKiBHZXRzIHRoZSBsZW5ndGggb2YgYSBzdHJpbmcgKG5vdCBpbmNsdWRpbmcgbnVsIHRlcm1pbmF0aW9uKS4KKyAqCisgKiBAcmV0dXJucyB0aGUgbGVuZ3RoLgorICovCitpbnQKK19kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChjb25zdCBEQnVzU3RyaW5nICAqc3RyKQoreworICBEQlVTX0NPTlNUX1NUUklOR19QUkVBTUJMRSAoc3RyKTsKKyAgCisgIHJldHVybiByZWFsLT5sZW47Cit9CisjZW5kaWYgLyogIV9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICovCisKKy8qKgorICogTWFrZXMgYSBzdHJpbmcgbG9uZ2VyIGJ5IHRoZSBnaXZlbiBudW1iZXIgb2YgYnl0ZXMuICBDaGVja3Mgd2hldGhlcgorICogYWRkaW5nIGFkZGl0aW9uYWxfbGVuZ3RoIHRvIHRoZSBjdXJyZW50IGxlbmd0aCB3b3VsZCBvdmVyZmxvdyBhbgorICogaW50ZWdlciwgYW5kIGNoZWNrcyBmb3IgZXhjZWVkaW5nIGEgc3RyaW5nJ3MgbWF4IGxlbmd0aC4KKyAqIFRoZSBuZXcgYnl0ZXMgYXJlIG5vdCBpbml0aWFsaXplZCwgb3RoZXIgdGhhbiBudWwtdGVybWluYXRpbmcKKyAqIHRoZSBlbmQgb2YgdGhlIHN0cmluZy4gVGhlIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgbWF5IGNvbnRhaW4KKyAqIG51bCBieXRlcyBvciBvdGhlciBqdW5rLgorICoKKyAqIEBwYXJhbSBzdHIgYSBzdHJpbmcKKyAqIEBwYXJhbSBhZGRpdGlvbmFsX2xlbmd0aCBsZW5ndGggdG8gYWRkIHRvIHRoZSBzdHJpbmcuCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzLgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RyaW5nX2xlbmd0aGVuIChEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIGFkZGl0aW9uYWxfbGVuZ3RoKQoreworICBEQlVTX1NUUklOR19QUkVBTUJMRSAoc3RyKTsgIAorICBfZGJ1c19hc3NlcnQgKGFkZGl0aW9uYWxfbGVuZ3RoID49IDApOworCisgIGlmIChfREJVU19VTkxJS0VMWSAoYWRkaXRpb25hbF9sZW5ndGggPiBfREJVU19TVFJJTkdfTUFYX0xFTkdUSCAtIHJlYWwtPmxlbikpCisgICAgcmV0dXJuIEZBTFNFOyAvKiB3b3VsZCBvdmVyZmxvdyAqLworICAKKyAgcmV0dXJuIHNldF9sZW5ndGggKHJlYWwsCisgICAgICAgICAgICAgICAgICAgICByZWFsLT5sZW4gKyBhZGRpdGlvbmFsX2xlbmd0aCk7Cit9CisKKy8qKgorICogTWFrZXMgYSBzdHJpbmcgc2hvcnRlciBieSB0aGUgZ2l2ZW4gbnVtYmVyIG9mIGJ5dGVzLgorICoKKyAqIEBwYXJhbSBzdHIgYSBzdHJpbmcKKyAqIEBwYXJhbSBsZW5ndGhfdG9fcmVtb3ZlIGxlbmd0aCB0byByZW1vdmUgZnJvbSB0aGUgc3RyaW5nLgorICovCit2b2lkCitfZGJ1c19zdHJpbmdfc2hvcnRlbiAoREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIGxlbmd0aF90b19yZW1vdmUpCit7CisgIERCVVNfU1RSSU5HX1BSRUFNQkxFIChzdHIpOworICBfZGJ1c19hc3NlcnQgKGxlbmd0aF90b19yZW1vdmUgPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAobGVuZ3RoX3RvX3JlbW92ZSA8PSByZWFsLT5sZW4pOworCisgIHNldF9sZW5ndGggKHJlYWwsCisgICAgICAgICAgICAgIHJlYWwtPmxlbiAtIGxlbmd0aF90b19yZW1vdmUpOworfQorCisvKioKKyAqIFNldHMgdGhlIGxlbmd0aCBvZiBhIHN0cmluZy4gQ2FuIGJlIHVzZWQgdG8gdHJ1bmNhdGUgb3IgbGVuZ3RoZW4KKyAqIHRoZSBzdHJpbmcuIElmIHRoZSBzdHJpbmcgaXMgbGVuZ3RoZW5lZCwgdGhlIGZ1bmN0aW9uIG1heSBmYWlsIGFuZAorICogcmV0dXJuICNGQUxTRS4gTmV3bHktYWRkZWQgYnl0ZXMgYXJlIG5vdCBpbml0aWFsaXplZCwgYXMgd2l0aAorICogX2RidXNfc3RyaW5nX2xlbmd0aGVuKCkuCisgKgorICogQHBhcmFtIHN0ciBhIHN0cmluZworICogQHBhcmFtIGxlbmd0aCBuZXcgbGVuZ3RoIG9mIHRoZSBzdHJpbmcuCisgKiBAcmV0dXJucyAjRkFMU0Ugb24gZmFpbHVyZS4KKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3N0cmluZ19zZXRfbGVuZ3RoIChEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgbGVuZ3RoKQoreworICBEQlVTX1NUUklOR19QUkVBTUJMRSAoc3RyKTsKKyAgX2RidXNfYXNzZXJ0IChsZW5ndGggPj0gMCk7CisKKyAgcmV0dXJuIHNldF9sZW5ndGggKHJlYWwsIGxlbmd0aCk7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYWxpZ25faW5zZXJ0X3BvaW50X3RoZW5fb3Blbl9nYXAgKERCdXNTdHJpbmcgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICppbnNlcnRfYXRfcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICBhbGlnbm1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgZ2FwX3NpemUpCit7CisgIHVuc2lnbmVkIGxvbmcgbmV3X2xlbjsgLyogdWxvbmcgdG8gYXZvaWQgX0RCVVNfQUxJR05fVkFMVUUgb3ZlcmZsb3cgKi8KKyAgdW5zaWduZWQgbG9uZyBnYXBfcG9zOworICBpbnQgaW5zZXJ0X2F0OworICBpbnQgZGVsdGE7CisgIERCVVNfU1RSSU5HX1BSRUFNQkxFIChzdHIpOworICBfZGJ1c19hc3NlcnQgKGFsaWdubWVudCA+PSAxKTsKKyAgX2RidXNfYXNzZXJ0IChhbGlnbm1lbnQgPD0gOCk7IC8qIGl0IGhhcyB0byBiZSBhIGJ1ZyBpZiA+IDggKi8KKworICBpbnNlcnRfYXQgPSAqaW5zZXJ0X2F0X3A7CisKKyAgX2RidXNfYXNzZXJ0IChpbnNlcnRfYXQgPD0gcmVhbC0+bGVuKTsKKyAgCisgIGdhcF9wb3MgPSBfREJVU19BTElHTl9WQUxVRSAoaW5zZXJ0X2F0LCBhbGlnbm1lbnQpOworICBuZXdfbGVuID0gcmVhbC0+bGVuICsgKGdhcF9wb3MgLSBpbnNlcnRfYXQpICsgZ2FwX3NpemU7CisgIAorICBpZiAoX0RCVVNfVU5MSUtFTFkgKG5ld19sZW4gPiAodW5zaWduZWQgbG9uZykgX0RCVVNfU1RSSU5HX01BWF9MRU5HVEgpKQorICAgIHJldHVybiBGQUxTRTsKKyAgCisgIGRlbHRhID0gbmV3X2xlbiAtIHJlYWwtPmxlbjsKKyAgX2RidXNfYXNzZXJ0IChkZWx0YSA+PSAwKTsKKworICBpZiAoZGVsdGEgPT0gMCkgLyogb25seSBoYXBwZW5zIGlmIGdhcF9zaXplID09IDAgYW5kIGluc2VydF9hdCBpcyBhbGlnbmVkIGFscmVhZHkgKi8KKyAgICB7CisgICAgICBfZGJ1c19hc3NlcnQgKCgodW5zaWduZWQgbG9uZykgKmluc2VydF9hdF9wKSA9PSBnYXBfcG9zKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICBpZiAoX0RCVVNfVU5MSUtFTFkgKCFvcGVuX2dhcCAobmV3X2xlbiAtIHJlYWwtPmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWwsIGluc2VydF9hdCkpKQorICAgIHJldHVybiBGQUxTRTsKKworICAvKiBudWwgdGhlIHBhZGRpbmcgaWYgd2UgaGFkIHRvIGFkZCBhbnkgcGFkZGluZyAqLworICBpZiAoZ2FwX3NpemUgPCBkZWx0YSkKKyAgICB7CisgICAgICBtZW1zZXQgKCZyZWFsLT5zdHJbaW5zZXJ0X2F0XSwgJ1wwJywKKyAgICAgICAgICAgICAgZ2FwX3BvcyAtIGluc2VydF9hdCk7CisgICAgfQorCisgICppbnNlcnRfYXRfcCA9IGdhcF9wb3M7CisgIAorICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CithbGlnbl9sZW5ndGhfdGhlbl9sZW5ndGhlbiAoREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIGFsaWdubWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICB0aGVuX2xlbmd0aGVuX2J5KQoreworICBpbnQgaW5zZXJ0X2F0OworCisgIGluc2VydF9hdCA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChzdHIpOworICAKKyAgcmV0dXJuIGFsaWduX2luc2VydF9wb2ludF90aGVuX29wZW5fZ2FwIChzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluc2VydF9hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbm1lbnQsIHRoZW5fbGVuZ3RoZW5fYnkpOworfQorCisvKioKKyAqIEFsaWduIHRoZSBsZW5ndGggb2YgYSBzdHJpbmcgdG8gYSBzcGVjaWZpYyBhbGlnbm1lbnQgKHR5cGljYWxseSA0IG9yIDgpCisgKiBieSBhcHBlbmRpbmcgbnVsIGJ5dGVzIHRvIHRoZSBzdHJpbmcuCisgKgorICogQHBhcmFtIHN0ciBhIHN0cmluZworICogQHBhcmFtIGFsaWdubWVudCB0aGUgYWxpZ25tZW50CisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm8gbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zdHJpbmdfYWxpZ25fbGVuZ3RoIChEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICBhbGlnbm1lbnQpCit7CisgIHJldHVybiBhbGlnbl9sZW5ndGhfdGhlbl9sZW5ndGhlbiAoc3RyLCBhbGlnbm1lbnQsIDApOworfQorCisvKioKKyAqIFByZWFsbG9jYXRlIGV4dHJhX2J5dGVzIHN1Y2ggdGhhdCBhIGZ1dHVyZSBsZW5ndGhlbmluZyBvZiB0aGUKKyAqIHN0cmluZyBieSBleHRyYV9ieXRlcyBpcyBndWFyYW50ZWVkIHRvIHN1Y2NlZWQgd2l0aG91dCBhbiBvdXQgb2YKKyAqIG1lbW9yeSBlcnJvci4KKyAqCisgKiBAcGFyYW0gc3RyIGEgc3RyaW5nCisgKiBAcGFyYW0gZXh0cmFfYnl0ZXMgYnl0ZXMgdG8gYWxsb2MKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBubyBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3N0cmluZ19hbGxvY19zcGFjZSAoREJ1c1N0cmluZyAgICAgICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGV4dHJhX2J5dGVzKQoreworICBpZiAoIV9kYnVzX3N0cmluZ19sZW5ndGhlbiAoc3RyLCBleHRyYV9ieXRlcykpCisgICAgcmV0dXJuIEZBTFNFOworICBfZGJ1c19zdHJpbmdfc2hvcnRlbiAoc3RyLCBleHRyYV9ieXRlcyk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYXBwZW5kIChEQnVzUmVhbFN0cmluZyAqcmVhbCwKKyAgICAgICAgY29uc3QgY2hhciAgICAgKmJ1ZmZlciwKKyAgICAgICAgaW50ICAgICAgICAgICAgIGJ1ZmZlcl9sZW4pCit7CisgIGlmIChidWZmZXJfbGVuID09IDApCisgICAgcmV0dXJuIFRSVUU7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfbGVuZ3RoZW4gKChEQnVzU3RyaW5nKilyZWFsLCBidWZmZXJfbGVuKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgbWVtY3B5IChyZWFsLT5zdHIgKyAocmVhbC0+bGVuIC0gYnVmZmVyX2xlbiksCisgICAgICAgICAgYnVmZmVyLAorICAgICAgICAgIGJ1ZmZlcl9sZW4pOworCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIEFwcGVuZHMgYSBudWwtdGVybWluYXRlZCBDLXN0eWxlIHN0cmluZyB0byBhIERCdXNTdHJpbmcuCisgKgorICogQHBhcmFtIHN0ciB0aGUgREJ1c1N0cmluZworICogQHBhcmFtIGJ1ZmZlciB0aGUgbnVsLXRlcm1pbmF0ZWQgY2hhcmFjdGVycyB0byBhcHBlbmQKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBub3QgZW5vdWdoIG1lbW9yeS4KKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3N0cmluZ19hcHBlbmQgKERCdXNTdHJpbmcgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmJ1ZmZlcikKK3sKKyAgdW5zaWduZWQgbG9uZyBidWZmZXJfbGVuOworICAKKyAgREJVU19TVFJJTkdfUFJFQU1CTEUgKHN0cik7CisgIF9kYnVzX2Fzc2VydCAoYnVmZmVyICE9IE5VTEwpOworICAKKyAgYnVmZmVyX2xlbiA9IHN0cmxlbiAoYnVmZmVyKTsKKyAgaWYgKGJ1ZmZlcl9sZW4gPiAodW5zaWduZWQgbG9uZykgX0RCVVNfU1RSSU5HX01BWF9MRU5HVEgpCisgICAgcmV0dXJuIEZBTFNFOworICAKKyAgcmV0dXJuIGFwcGVuZCAocmVhbCwgYnVmZmVyLCBidWZmZXJfbGVuKTsKK30KKworLyoqIGFzc2lnbiAyIGJ5dGVzIGZyb20gb25lIHN0cmluZyB0byBhbm90aGVyICovCisjZGVmaW5lIEFTU0lHTl8yX09DVEVUUyhwLCBvY3RldHMpIFwKKyAgKigoZGJ1c191aW50MTZfdCopKHApKSA9ICooKGRidXNfdWludDE2X3QqKShvY3RldHMpKTsKKworLyoqIGFzc2lnbiA0IGJ5dGVzIGZyb20gb25lIHN0cmluZyB0byBhbm90aGVyICovCisjZGVmaW5lIEFTU0lHTl80X09DVEVUUyhwLCBvY3RldHMpIFwKKyAgKigoZGJ1c191aW50MzJfdCopKHApKSA9ICooKGRidXNfdWludDMyX3QqKShvY3RldHMpKTsKKworLyoqIGFzc2lnbiA4IGJ5dGVzIGZyb20gb25lIHN0cmluZyB0byBhbm90aGVyICovCisjZGVmaW5lIEFTU0lHTl84X09DVEVUUyhwLCBvY3RldHMpIFwKKyAgKigoZGJ1c191aW50NjRfdCopKHApKSA9ICooKGRidXNfdWludDY0X3QqKShvY3RldHMpKTsKKworLyoqCisgKiBJbnNlcnRzIDIgYnl0ZXMgYWxpZ25lZCBvbiBhIDIgYnl0ZSBib3VuZGFyeQorICogd2l0aCBhbnkgYWxpZ25tZW50IHBhZGRpbmcgaW5pdGlhbGl6ZWQgdG8gMC4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBEQnVzU3RyaW5nCisgKiBAcGFyYW0gaW5zZXJ0X2F0IHdoZXJlIHRvIGluc2VydAorICogQHBhcmFtIG9jdGV0cyAyIGJ5dGVzIHRvIGluc2VydAorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vdCBlbm91Z2ggbWVtb3J5LgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RyaW5nX2luc2VydF8yX2FsaWduZWQgKERCdXNTdHJpbmcgICAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgaW5zZXJ0X2F0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgb2N0ZXRzWzJdKQoreworICBEQlVTX1NUUklOR19QUkVBTUJMRSAoc3RyKTsKKyAgCisgIGlmICghYWxpZ25faW5zZXJ0X3BvaW50X3RoZW5fb3Blbl9nYXAgKHN0ciwgJmluc2VydF9hdCwgMiwgMikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIEFTU0lHTl8yX09DVEVUUyAocmVhbC0+c3RyICsgaW5zZXJ0X2F0LCBvY3RldHMpOworCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIEluc2VydHMgNCBieXRlcyBhbGlnbmVkIG9uIGEgNCBieXRlIGJvdW5kYXJ5CisgKiB3aXRoIGFueSBhbGlnbm1lbnQgcGFkZGluZyBpbml0aWFsaXplZCB0byAwLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIERCdXNTdHJpbmcKKyAqIEBwYXJhbSBpbnNlcnRfYXQgd2hlcmUgdG8gaW5zZXJ0CisgKiBAcGFyYW0gb2N0ZXRzIDQgYnl0ZXMgdG8gaW5zZXJ0CisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm90IGVub3VnaCBtZW1vcnkuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zdHJpbmdfaW5zZXJ0XzRfYWxpZ25lZCAoREJ1c1N0cmluZyAgICAgICAgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICBpbnNlcnRfYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciBvY3RldHNbNF0pCit7CisgIERCVVNfU1RSSU5HX1BSRUFNQkxFIChzdHIpOworICAKKyAgaWYgKCFhbGlnbl9pbnNlcnRfcG9pbnRfdGhlbl9vcGVuX2dhcCAoc3RyLCAmaW5zZXJ0X2F0LCA0LCA0KSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgQVNTSUdOXzRfT0NURVRTIChyZWFsLT5zdHIgKyBpbnNlcnRfYXQsIG9jdGV0cyk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogSW5zZXJ0cyA4IGJ5dGVzIGFsaWduZWQgb24gYW4gOCBieXRlIGJvdW5kYXJ5CisgKiB3aXRoIGFueSBhbGlnbm1lbnQgcGFkZGluZyBpbml0aWFsaXplZCB0byAwLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIERCdXNTdHJpbmcKKyAqIEBwYXJhbSBpbnNlcnRfYXQgd2hlcmUgdG8gaW5zZXJ0CisgKiBAcGFyYW0gb2N0ZXRzIDggYnl0ZXMgdG8gaW5zZXJ0CisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm90IGVub3VnaCBtZW1vcnkuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zdHJpbmdfaW5zZXJ0XzhfYWxpZ25lZCAoREJ1c1N0cmluZyAgICAgICAgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICBpbnNlcnRfYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciBvY3RldHNbOF0pCit7CisgIERCVVNfU1RSSU5HX1BSRUFNQkxFIChzdHIpOworICAKKyAgaWYgKCFhbGlnbl9pbnNlcnRfcG9pbnRfdGhlbl9vcGVuX2dhcCAoc3RyLCAmaW5zZXJ0X2F0LCA4LCA4KSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgX2RidXNfYXNzZXJ0IChfREJVU19BTElHTl9WQUxVRSAoaW5zZXJ0X2F0LCA4KSA9PSAodW5zaWduZWQpIGluc2VydF9hdCk7CisgIAorICBBU1NJR05fOF9PQ1RFVFMgKHJlYWwtPnN0ciArIGluc2VydF9hdCwgb2N0ZXRzKTsKKworICByZXR1cm4gVFJVRTsKK30KKworCisvKioKKyAqIEluc2VydHMgcGFkZGluZyBhdCAqaW5zZXJ0X2F0IHN1Y2ggdG8gYWxpZ24gaXQgdG8gdGhlIGdpdmVuCisgKiBib3VuZGFyeS4gSW5pdGlhbGl6ZXMgdGhlIHBhZGRpbmcgdG8gbnVsIGJ5dGVzLiBTZXRzICppbnNlcnRfYXQKKyAqIHRvIHRoZSBhbGlnbmVkIHBvc2l0aW9uLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIERCdXNTdHJpbmcKKyAqIEBwYXJhbSBpbnNlcnRfYXQgbG9jYXRpb24gdG8gYmUgYWxpZ25lZAorICogQHBhcmFtIGFsaWdubWVudCBhbGlnbm1lbnQgYm91bmRhcnkgKDEsIDIsIDQsIG9yIDgpCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm90IGVub3VnaCBtZW1vcnkuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zdHJpbmdfaW5zZXJ0X2FsaWdubWVudCAoREJ1c1N0cmluZyAgICAgICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAqaW5zZXJ0X2F0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBhbGlnbm1lbnQpCit7CisgIERCVVNfU1RSSU5HX1BSRUFNQkxFIChzdHIpOworICAKKyAgaWYgKCFhbGlnbl9pbnNlcnRfcG9pbnRfdGhlbl9vcGVuX2dhcCAoc3RyLCBpbnNlcnRfYXQsIGFsaWdubWVudCwgMCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIF9kYnVzX2Fzc2VydCAoX0RCVVNfQUxJR05fVkFMVUUgKCppbnNlcnRfYXQsIGFsaWdubWVudCkgPT0gKHVuc2lnbmVkKSAqaW5zZXJ0X2F0KTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBBcHBlbmRzIGEgcHJpbnRmLXN0eWxlIGZvcm1hdHRlZCBzdHJpbmcKKyAqIHRvIHRoZSAjREJ1c1N0cmluZy4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcKKyAqIEBwYXJhbSBmb3JtYXQgcHJpbnRmIGZvcm1hdAorICogQHBhcmFtIGFyZ3MgdmFyaWFibGUgYXJndW1lbnQgbGlzdAorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RyaW5nX2FwcGVuZF9wcmludGZfdmFsaXN0ICAoREJ1c1N0cmluZyAgICAgICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICpmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YV9saXN0ICAgICAgICAgICAgYXJncykKK3sKKyAgZGJ1c19ib29sX3QgcmV0ID0gRkFMU0U7CisgIGludCBsZW47CisgIHZhX2xpc3QgYXJnc19jb3B5OworCisgIERCVVNfU1RSSU5HX1BSRUFNQkxFIChzdHIpOworCisgIERCVVNfVkFfQ09QWSAoYXJnc19jb3B5LCBhcmdzKTsKKworICAvKiBNZWFzdXJlIHRoZSBtZXNzYWdlIGxlbmd0aCB3aXRob3V0IHRlcm1pbmF0aW5nIG51bCAqLworICBsZW4gPSBfZGJ1c19wcmludGZfc3RyaW5nX3VwcGVyX2JvdW5kIChmb3JtYXQsIGFyZ3MpOworCisgIGlmIChsZW4gPCAwKQorICAgIGdvdG8gb3V0OworCisgIGlmICghX2RidXNfc3RyaW5nX2xlbmd0aGVuIChzdHIsIGxlbikpCisgICAgeworICAgICAgZ290byBvdXQ7CisgICAgfQorICAKKyAgdnNwcmludGYgKChjaGFyKikgKHJlYWwtPnN0ciArIChyZWFsLT5sZW4gLSBsZW4pKSwKKyAgICAgICAgICAgIGZvcm1hdCwgYXJnc19jb3B5KTsKKyAgcmV0ID0gVFJVRTsKKworb3V0OgorICB2YV9lbmQgKGFyZ3NfY29weSk7CisKKyAgcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBBcHBlbmRzIGEgcHJpbnRmLXN0eWxlIGZvcm1hdHRlZCBzdHJpbmcKKyAqIHRvIHRoZSAjREJ1c1N0cmluZy4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcKKyAqIEBwYXJhbSBmb3JtYXQgcHJpbnRmIGZvcm1hdAorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RyaW5nX2FwcGVuZF9wcmludGYgKERCdXNTdHJpbmcgICAgICAgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgKmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4pCit7CisgIHZhX2xpc3QgYXJnczsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworICAKKyAgdmFfc3RhcnQgKGFyZ3MsIGZvcm1hdCk7CisgIHJldHZhbCA9IF9kYnVzX3N0cmluZ19hcHBlbmRfcHJpbnRmX3ZhbGlzdCAoc3RyLCBmb3JtYXQsIGFyZ3MpOworICB2YV9lbmQgKGFyZ3MpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogQXBwZW5kcyBibG9jayBvZiBieXRlcyB3aXRoIHRoZSBnaXZlbiBsZW5ndGggdG8gYSBEQnVzU3RyaW5nLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIERCdXNTdHJpbmcKKyAqIEBwYXJhbSBidWZmZXIgdGhlIGJ5dGVzIHRvIGFwcGVuZAorICogQHBhcmFtIGxlbiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGFwcGVuZAorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vdCBlbm91Z2ggbWVtb3J5LgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RyaW5nX2FwcGVuZF9sZW4gKERCdXNTdHJpbmcgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgbGVuKQoreworICBEQlVTX1NUUklOR19QUkVBTUJMRSAoc3RyKTsKKyAgX2RidXNfYXNzZXJ0IChidWZmZXIgIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAobGVuID49IDApOworCisgIHJldHVybiBhcHBlbmQgKHJlYWwsIGJ1ZmZlciwgbGVuKTsKK30KKworLyoqCisgKiBBcHBlbmRzIGEgc2luZ2xlIGJ5dGUgdG8gdGhlIHN0cmluZywgcmV0dXJuaW5nICNGQUxTRQorICogaWYgbm90IGVub3VnaCBtZW1vcnkuCisgKgorICogQHBhcmFtIHN0ciB0aGUgc3RyaW5nCisgKiBAcGFyYW0gYnl0ZSB0aGUgYnl0ZSB0byBhcHBlbmQKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3N0cmluZ19hcHBlbmRfYnl0ZSAoREJ1c1N0cmluZyAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICBieXRlKQoreworICBEQlVTX1NUUklOR19QUkVBTUJMRSAoc3RyKTsKKworICBpZiAoIXNldF9sZW5ndGggKHJlYWwsIHJlYWwtPmxlbiArIDEpKQorICAgIHJldHVybiBGQUxTRTsKKworICByZWFsLT5zdHJbcmVhbC0+bGVuLTFdID0gYnl0ZTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK2RlbGV0ZSAoREJ1c1JlYWxTdHJpbmcgKnJlYWwsCisgICAgICAgIGludCAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgaW50ICAgICAgICAgICAgIGxlbikKK3sKKyAgaWYgKGxlbiA9PSAwKQorICAgIHJldHVybjsKKyAgCisgIG1lbW1vdmUgKHJlYWwtPnN0ciArIHN0YXJ0LCByZWFsLT5zdHIgKyBzdGFydCArIGxlbiwgcmVhbC0+bGVuIC0gKHN0YXJ0ICsgbGVuKSk7CisgIHJlYWwtPmxlbiAtPSBsZW47CisgIHJlYWwtPnN0cltyZWFsLT5sZW5dID0gJ1wwJzsKK30KKworLyoqCisgKiBEZWxldGVzIGEgc2VnbWVudCBvZiBhIERCdXNTdHJpbmcgd2l0aCBsZW5ndGggbGVuIHN0YXJ0aW5nIGF0CisgKiBzdGFydC4gKEhpbnQ6IHRvIGNsZWFyIGFuIGVudGlyZSBzdHJpbmcsIHNldHRpbmcgbGVuZ3RoIHRvIDAKKyAqIHdpdGggX2RidXNfc3RyaW5nX3NldF9sZW5ndGgoKSBpcyBlYXNpZXIuKQorICoKKyAqIEBwYXJhbSBzdHIgdGhlIERCdXNTdHJpbmcKKyAqIEBwYXJhbSBzdGFydCB3aGVyZSB0byBzdGFydCBkZWxldGluZworICogQHBhcmFtIGxlbiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGRlbGV0ZQorICovCit2b2lkCitfZGJ1c19zdHJpbmdfZGVsZXRlIChEQnVzU3RyaW5nICAgICAgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGxlbikKK3sKKyAgREJVU19TVFJJTkdfUFJFQU1CTEUgKHN0cik7CisgIF9kYnVzX2Fzc2VydCAoc3RhcnQgPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAobGVuID49IDApOworICBfZGJ1c19hc3NlcnQgKHN0YXJ0IDw9IHJlYWwtPmxlbik7CisgIF9kYnVzX2Fzc2VydCAobGVuIDw9IHJlYWwtPmxlbiAtIHN0YXJ0KTsKKyAgCisgIGRlbGV0ZSAocmVhbCwgc3RhcnQsIGxlbik7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorY29weSAoREJ1c1JlYWxTdHJpbmcgKnNvdXJjZSwKKyAgICAgIGludCAgICAgICAgICAgICBzdGFydCwKKyAgICAgIGludCAgICAgICAgICAgICBsZW4sCisgICAgICBEQnVzUmVhbFN0cmluZyAqZGVzdCwKKyAgICAgIGludCAgICAgICAgICAgICBpbnNlcnRfYXQpCit7CisgIGlmIChsZW4gPT0gMCkKKyAgICByZXR1cm4gVFJVRTsKKworICBpZiAoIW9wZW5fZ2FwIChsZW4sIGRlc3QsIGluc2VydF9hdCkpCisgICAgcmV0dXJuIEZBTFNFOworICAKKyAgbWVtbW92ZSAoZGVzdC0+c3RyICsgaW5zZXJ0X2F0LAorICAgICAgICAgICBzb3VyY2UtPnN0ciArIHN0YXJ0LAorICAgICAgICAgICBsZW4pOworCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIENoZWNrcyBhc3NlcnRpb25zIGZvciB0d28gc3RyaW5ncyB3ZSdyZSBjb3B5aW5nIGEgc2VnbWVudCBiZXR3ZWVuLAorICogYW5kIGRlY2xhcmVzIHJlYWxfc291cmNlL3JlYWxfZGVzdCB2YXJpYWJsZXMuCisgKgorICogQHBhcmFtIHNvdXJjZSB0aGUgc291cmNlIHN0cmluZworICogQHBhcmFtIHN0YXJ0IHRoZSBzdGFydGluZyBvZmZzZXQKKyAqIEBwYXJhbSBkZXN0IHRoZSBkZXN0IHN0cmluZworICogQHBhcmFtIGluc2VydF9hdCB3aGVyZSB0aGUgY29waWVkIHNlZ21lbnQgaXMgaW5zZXJ0ZWQKKyAqLworI2RlZmluZSBEQlVTX1NUUklOR19DT1BZX1BSRUFNQkxFKHNvdXJjZSwgc3RhcnQsIGRlc3QsIGluc2VydF9hdCkgICAgICAgXAorICBEQnVzUmVhbFN0cmluZyAqcmVhbF9zb3VyY2UgPSAoREJ1c1JlYWxTdHJpbmcqKSBzb3VyY2U7ICAgICAgICAgICAgICAgXAorICBEQnVzUmVhbFN0cmluZyAqcmVhbF9kZXN0ID0gKERCdXNSZWFsU3RyaW5nKikgZGVzdDsgICAgICAgICAgICAgICAgICAgXAorICBfZGJ1c19hc3NlcnQgKChzb3VyY2UpICE9IChkZXN0KSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBEQlVTX0dFTkVSSUNfU1RSSU5HX1BSRUFNQkxFIChyZWFsX3NvdXJjZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBEQlVTX0dFTkVSSUNfU1RSSU5HX1BSRUFNQkxFIChyZWFsX2Rlc3QpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfZGJ1c19hc3NlcnQgKCFyZWFsX2Rlc3QtPmNvbnN0YW50KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfZGJ1c19hc3NlcnQgKCFyZWFsX2Rlc3QtPmxvY2tlZCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfZGJ1c19hc3NlcnQgKChzdGFydCkgPj0gMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfZGJ1c19hc3NlcnQgKChzdGFydCkgPD0gcmVhbF9zb3VyY2UtPmxlbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfZGJ1c19hc3NlcnQgKChpbnNlcnRfYXQpID49IDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfZGJ1c19hc3NlcnQgKChpbnNlcnRfYXQpIDw9IHJlYWxfZGVzdC0+bGVuKQorCisvKioKKyAqIE1vdmVzIHRoZSBlbmQgb2Ygb25lIHN0cmluZyBpbnRvIGFub3RoZXIgc3RyaW5nLiBCb3RoIHN0cmluZ3MKKyAqIG11c3QgYmUgaW5pdGlhbGl6ZWQsIHZhbGlkIHN0cmluZ3MuCisgKgorICogQHBhcmFtIHNvdXJjZSB0aGUgc291cmNlIHN0cmluZworICogQHBhcmFtIHN0YXJ0IHdoZXJlIHRvIGNob3Agb2ZmIHRoZSBzb3VyY2Ugc3RyaW5nCisgKiBAcGFyYW0gZGVzdCB0aGUgZGVzdGluYXRpb24gc3RyaW5nCisgKiBAcGFyYW0gaW5zZXJ0X2F0IHdoZXJlIHRvIG1vdmUgdGhlIGNob3BwZWQtb2ZmIHBhcnQgb2Ygc291cmNlIHN0cmluZworICogQHJldHVybnMgI0ZBTFNFIGlmIG5vdCBlbm91Z2ggbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zdHJpbmdfbW92ZSAoREJ1c1N0cmluZyAgICAgICAqc291cmNlLAorICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgKmRlc3QsCisgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgaW5zZXJ0X2F0KQoreworICBEQnVzUmVhbFN0cmluZyAqcmVhbF9zb3VyY2UgPSAoREJ1c1JlYWxTdHJpbmcqKSBzb3VyY2U7CisgIF9kYnVzX2Fzc2VydCAoc3RhcnQgPD0gcmVhbF9zb3VyY2UtPmxlbik7CisgIAorICByZXR1cm4gX2RidXNfc3RyaW5nX21vdmVfbGVuIChzb3VyY2UsIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFsX3NvdXJjZS0+bGVuIC0gc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3QsIGluc2VydF9hdCk7Cit9CisKKy8qKgorICogTGlrZSBfZGJ1c19zdHJpbmdfbW92ZSgpLCBidXQgZG9lcyBub3QgZGVsZXRlIHRoZSBzZWN0aW9uCisgKiBvZiB0aGUgc291cmNlIHN0cmluZyB0aGF0J3MgY29waWVkIHRvIHRoZSBkZXN0IHN0cmluZy4KKyAqCisgKiBAcGFyYW0gc291cmNlIHRoZSBzb3VyY2Ugc3RyaW5nCisgKiBAcGFyYW0gc3RhcnQgd2hlcmUgdG8gc3RhcnQgY29weWluZyB0aGUgc291cmNlIHN0cmluZworICogQHBhcmFtIGRlc3QgdGhlIGRlc3RpbmF0aW9uIHN0cmluZworICogQHBhcmFtIGluc2VydF9hdCB3aGVyZSB0byBwbGFjZSB0aGUgY29waWVkIHBhcnQgb2Ygc291cmNlIHN0cmluZworICogQHJldHVybnMgI0ZBTFNFIGlmIG5vdCBlbm91Z2ggbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zdHJpbmdfY29weSAoY29uc3QgREJ1c1N0cmluZyAqc291cmNlLAorICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgKmRlc3QsCisgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgaW5zZXJ0X2F0KQoreworICBEQlVTX1NUUklOR19DT1BZX1BSRUFNQkxFIChzb3VyY2UsIHN0YXJ0LCBkZXN0LCBpbnNlcnRfYXQpOworCisgIHJldHVybiBjb3B5IChyZWFsX3NvdXJjZSwgc3RhcnQsCisgICAgICAgICAgICAgICByZWFsX3NvdXJjZS0+bGVuIC0gc3RhcnQsCisgICAgICAgICAgICAgICByZWFsX2Rlc3QsCisgICAgICAgICAgICAgICBpbnNlcnRfYXQpOworfQorCisvKioKKyAqIExpa2UgX2RidXNfc3RyaW5nX21vdmUoKSwgYnV0IGNhbiBtb3ZlIGEgc2VnbWVudCBmcm9tCisgKiB0aGUgbWlkZGxlIG9mIHRoZSBzb3VyY2Ugc3RyaW5nLgorICoKKyAqIEBwYXJhbSBzb3VyY2UgdGhlIHNvdXJjZSBzdHJpbmcKKyAqIEBwYXJhbSBzdGFydCBmaXJzdCBieXRlIG9mIHNvdXJjZSBzdHJpbmcgdG8gbW92ZQorICogQHBhcmFtIGxlbiBsZW5ndGggb2Ygc2VnbWVudCB0byBtb3ZlCisgKiBAcGFyYW0gZGVzdCB0aGUgZGVzdGluYXRpb24gc3RyaW5nCisgKiBAcGFyYW0gaW5zZXJ0X2F0IHdoZXJlIHRvIG1vdmUgdGhlIGJ5dGVzIGZyb20gdGhlIHNvdXJjZSBzdHJpbmcKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBub3QgZW5vdWdoIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RyaW5nX21vdmVfbGVuIChEQnVzU3RyaW5nICAgICAgICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgKmRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGluc2VydF9hdCkKKworeworICBEQlVTX1NUUklOR19DT1BZX1BSRUFNQkxFIChzb3VyY2UsIHN0YXJ0LCBkZXN0LCBpbnNlcnRfYXQpOworICBfZGJ1c19hc3NlcnQgKGxlbiA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0ICgoc3RhcnQgKyBsZW4pIDw9IHJlYWxfc291cmNlLT5sZW4pOworCisKKyAgaWYgKGxlbiA9PSAwKQorICAgIHsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgZWxzZSBpZiAoc3RhcnQgPT0gMCAmJgorICAgICAgICAgICBsZW4gPT0gcmVhbF9zb3VyY2UtPmxlbiAmJgorICAgICAgICAgICByZWFsX2Rlc3QtPmxlbiA9PSAwKQorICAgIHsKKyAgICAgIC8qIFNob3J0LWNpcmN1aXQgbW92aW5nIGFuIGVudGlyZSBleGlzdGluZyBzdHJpbmcgdG8gYW4gZW1wdHkgc3RyaW5nCisgICAgICAgKiBieSBqdXN0IHN3YXBwaW5nIHRoZSBidWZmZXJzLgorICAgICAgICovCisgICAgICAvKiB3ZSBhc3N1bWUgLT5jb25zdGFudCBkb2Vzbid0IG1hdHRlciBhcyB5b3UgY2FuJ3QgaGF2ZQorICAgICAgICogYSBjb25zdGFudCBzdHJpbmcgaW52b2x2ZWQgaW4gYSBtb3ZlLgorICAgICAgICovCisjZGVmaW5lIEFTU0lHTl9EQVRBKGEsIGIpIGRvIHsgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChhKS0+c3RyID0gKGIpLT5zdHI7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChhKS0+bGVuID0gKGIpLT5sZW47ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChhKS0+YWxsb2NhdGVkID0gKGIpLT5hbGxvY2F0ZWQ7ICAgICAgICBcCisgICAgICAgIChhKS0+YWxpZ25fb2Zmc2V0ID0gKGIpLT5hbGlnbl9vZmZzZXQ7ICBcCisgICAgICB9IHdoaWxlICgwKQorICAgICAgCisgICAgICBEQnVzUmVhbFN0cmluZyB0bXA7CisKKyAgICAgIEFTU0lHTl9EQVRBICgmdG1wLCByZWFsX3NvdXJjZSk7CisgICAgICBBU1NJR05fREFUQSAocmVhbF9zb3VyY2UsIHJlYWxfZGVzdCk7CisgICAgICBBU1NJR05fREFUQSAocmVhbF9kZXN0LCAmdG1wKTsKKworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKCFjb3B5IChyZWFsX3NvdXJjZSwgc3RhcnQsIGxlbiwKKyAgICAgICAgICAgICAgICAgcmVhbF9kZXN0LAorICAgICAgICAgICAgICAgICBpbnNlcnRfYXQpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAKKyAgICAgIGRlbGV0ZSAocmVhbF9zb3VyY2UsIHN0YXJ0LAorICAgICAgICAgICAgICBsZW4pOworICAgICAgCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9Cit9CisKKy8qKgorICogTGlrZSBfZGJ1c19zdHJpbmdfY29weSgpLCBidXQgY2FuIGNvcHkgYSBzZWdtZW50IGZyb20gdGhlIG1pZGRsZSBvZgorICogdGhlIHNvdXJjZSBzdHJpbmcuCisgKgorICogQHBhcmFtIHNvdXJjZSB0aGUgc291cmNlIHN0cmluZworICogQHBhcmFtIHN0YXJ0IHdoZXJlIHRvIHN0YXJ0IGNvcHlpbmcgdGhlIHNvdXJjZSBzdHJpbmcKKyAqIEBwYXJhbSBsZW4gbGVuZ3RoIG9mIHNlZ21lbnQgdG8gY29weQorICogQHBhcmFtIGRlc3QgdGhlIGRlc3RpbmF0aW9uIHN0cmluZworICogQHBhcmFtIGluc2VydF9hdCB3aGVyZSB0byBwbGFjZSB0aGUgY29waWVkIHNlZ21lbnQgb2Ygc291cmNlIHN0cmluZworICogQHJldHVybnMgI0ZBTFNFIGlmIG5vdCBlbm91Z2ggbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zdHJpbmdfY29weV9sZW4gKGNvbnN0IERCdXNTdHJpbmcgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAqZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgaW5zZXJ0X2F0KQoreworICBEQlVTX1NUUklOR19DT1BZX1BSRUFNQkxFIChzb3VyY2UsIHN0YXJ0LCBkZXN0LCBpbnNlcnRfYXQpOworICBfZGJ1c19hc3NlcnQgKGxlbiA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChzdGFydCA8PSByZWFsX3NvdXJjZS0+bGVuKTsKKyAgX2RidXNfYXNzZXJ0IChsZW4gPD0gcmVhbF9zb3VyY2UtPmxlbiAtIHN0YXJ0KTsKKyAgCisgIHJldHVybiBjb3B5IChyZWFsX3NvdXJjZSwgc3RhcnQsIGxlbiwKKyAgICAgICAgICAgICAgIHJlYWxfZGVzdCwKKyAgICAgICAgICAgICAgIGluc2VydF9hdCk7Cit9CisKKy8qKgorICogUmVwbGFjZXMgYSBzZWdtZW50IG9mIGRlc3Qgc3RyaW5nIHdpdGggYSBzZWdtZW50IG9mIHNvdXJjZSBzdHJpbmcuCisgKgorICogQHBhcmFtIHNvdXJjZSB0aGUgc291cmNlIHN0cmluZworICogQHBhcmFtIHN0YXJ0IHdoZXJlIHRvIHN0YXJ0IGNvcHlpbmcgdGhlIHNvdXJjZSBzdHJpbmcKKyAqIEBwYXJhbSBsZW4gbGVuZ3RoIG9mIHNlZ21lbnQgdG8gY29weQorICogQHBhcmFtIGRlc3QgdGhlIGRlc3RpbmF0aW9uIHN0cmluZworICogQHBhcmFtIHJlcGxhY2VfYXQgc3RhcnQgb2Ygc2VnbWVudCBvZiBkZXN0IHN0cmluZyB0byByZXBsYWNlCisgKiBAcGFyYW0gcmVwbGFjZV9sZW4gbGVuZ3RoIG9mIHNlZ21lbnQgb2YgZGVzdCBzdHJpbmcgdG8gcmVwbGFjZQorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vdCBlbm91Z2ggbWVtb3J5CisgKgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RyaW5nX3JlcGxhY2VfbGVuIChjb25zdCBEQnVzU3RyaW5nICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgKmRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHJlcGxhY2VfYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHJlcGxhY2VfbGVuKQoreworICBEQlVTX1NUUklOR19DT1BZX1BSRUFNQkxFIChzb3VyY2UsIHN0YXJ0LCBkZXN0LCByZXBsYWNlX2F0KTsKKyAgX2RidXNfYXNzZXJ0IChsZW4gPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAoc3RhcnQgPD0gcmVhbF9zb3VyY2UtPmxlbik7CisgIF9kYnVzX2Fzc2VydCAobGVuIDw9IHJlYWxfc291cmNlLT5sZW4gLSBzdGFydCk7CisgIF9kYnVzX2Fzc2VydCAocmVwbGFjZV9hdCA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChyZXBsYWNlX2F0IDw9IHJlYWxfZGVzdC0+bGVuKTsKKyAgX2RidXNfYXNzZXJ0IChyZXBsYWNlX2xlbiA8PSByZWFsX2Rlc3QtPmxlbiAtIHJlcGxhY2VfYXQpOworCisgIGlmIChsZW4gPT0gcmVwbGFjZV9sZW4pCisgICAgeworICAgICAgbWVtbW92ZSAocmVhbF9kZXN0LT5zdHIgKyByZXBsYWNlX2F0LAorICAgICAgICAgICAgICAgcmVhbF9zb3VyY2UtPnN0ciArIHN0YXJ0LCBsZW4pOworICAgIH0KKyAgZWxzZSBpZiAobGVuIDwgcmVwbGFjZV9sZW4pCisgICAgeworICAgICAgbWVtbW92ZSAocmVhbF9kZXN0LT5zdHIgKyByZXBsYWNlX2F0LAorICAgICAgICAgICAgICAgcmVhbF9zb3VyY2UtPnN0ciArIHN0YXJ0LCBsZW4pOworICAgICAgZGVsZXRlIChyZWFsX2Rlc3QsIHJlcGxhY2VfYXQgKyBsZW4sCisgICAgICAgICAgICAgIHJlcGxhY2VfbGVuIC0gbGVuKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpbnQgZGlmZjsKKworICAgICAgX2RidXNfYXNzZXJ0IChsZW4gPiByZXBsYWNlX2xlbik7CisKKyAgICAgIGRpZmYgPSBsZW4gLSByZXBsYWNlX2xlbjsKKworICAgICAgLyogRmlyc3Qgb2YgYWxsIHdlIGNoZWNrIGlmIGRlc3RpbmF0aW9uIHN0cmluZyBjYW4gYmUgZW5sYXJnZWQgYXMKKyAgICAgICAqIHJlcXVpcmVkLCB0aGVuIHdlIG92ZXJ3cml0ZSBwcmV2aW91cyBieXRlcworICAgICAgICovCisKKyAgICAgIGlmICghY29weSAocmVhbF9zb3VyY2UsIHN0YXJ0ICsgcmVwbGFjZV9sZW4sIGRpZmYsCisgICAgICAgICAgICAgICAgIHJlYWxfZGVzdCwgcmVwbGFjZV9hdCArIHJlcGxhY2VfbGVuKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICBtZW1tb3ZlIChyZWFsX2Rlc3QtPnN0ciArIHJlcGxhY2VfYXQsCisgICAgICAgICAgICAgICByZWFsX3NvdXJjZS0+c3RyICsgc3RhcnQsIHJlcGxhY2VfbGVuKTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogTG9va3MgZm9yIHRoZSBmaXJzdCBvY2N1cmFuY2Ugb2YgYSBieXRlLCBkZWxldGVzIHRoYXQgYnl0ZSwKKyAqIGFuZCBtb3ZlcyBldmVyeXRoaW5nIGFmdGVyIHRoZSBieXRlIHRvIHRoZSBiZWdpbm5pbmcgb2YgYQorICogc2VwYXJhdGUgc3RyaW5nLiAgQm90aCBzdHJpbmdzIG11c3QgYmUgaW5pdGlhbGl6ZWQsIHZhbGlkCisgKiBzdHJpbmdzLgorICoKKyAqIEBwYXJhbSBzb3VyY2UgdGhlIHNvdXJjZSBzdHJpbmcKKyAqIEBwYXJhbSBieXRlIHRoZSBieXRlIHRvIHJlbW92ZSBhbmQgc3BsaXQgdGhlIHN0cmluZyBhdAorICogQHBhcmFtIHRhaWwgdGhlIHNwbGl0IG9mZiBzdHJpbmcKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBub3QgZW5vdWdoIG1lbW9yeSBvciBpZiBieXRlIGNvdWxkIG5vdCBiZSBmb3VuZAorICoKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3N0cmluZ19zcGxpdF9vbl9ieXRlIChEQnVzU3RyaW5nICAgICAgICAqc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgICAgICBieXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgICp0YWlsKQoreworICBpbnQgYnl0ZV9wb3NpdGlvbjsKKyAgY2hhciBieXRlX3N0cmluZ1syXSA9ICIiOworICBpbnQgaGVhZF9sZW5ndGg7CisgIGludCB0YWlsX2xlbmd0aDsKKworICBieXRlX3N0cmluZ1swXSA9IChjaGFyKSBieXRlOworCisgIGlmICghX2RidXNfc3RyaW5nX2ZpbmQgKHNvdXJjZSwgMCwgYnl0ZV9zdHJpbmcsICZieXRlX3Bvc2l0aW9uKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaGVhZF9sZW5ndGggPSBieXRlX3Bvc2l0aW9uOworICB0YWlsX2xlbmd0aCA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChzb3VyY2UpIC0gaGVhZF9sZW5ndGggLSAxOworCisgIGlmICghX2RidXNfc3RyaW5nX21vdmVfbGVuIChzb3VyY2UsIGJ5dGVfcG9zaXRpb24gKyAxLCB0YWlsX2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhaWwsIDApKQorICAgIHJldHVybiBGQUxTRTsKKworICAvKiByZW1vdmUgdGhlIHRyYWlsaW5nIGRlbGltaXRlciBieXRlIGZyb20gdGhlIGhlYWQgbm93LgorICAgKi8KKyAgaWYgKCFfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoc291cmNlLCBoZWFkX2xlbmd0aCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJldHVybiBUUlVFOworfQorCisvKiBVbmljb2RlIG1hY3JvcyBhbmQgdXRmOF92YWxpZGF0ZSgpIGZyb20gR0xpYiBPd2VuIFRheWxvciwgSGF2b2MKKyAqIFBlbm5pbmd0b24sIGFuZCBUb20gVHJvbWV5IGFyZSB0aGUgYXV0aG9ycyBhbmQgYXV0aG9yaXplZCByZWxpY2Vuc2UuCisgKi8KKworLyoqIGNvbXB1dGVzIGxlbmd0aCBhbmQgbWFzayBvZiBhIHVuaWNvZGUgY2hhcmFjdGVyCisgKiBAcGFyYW0gQ2hhciB0aGUgY2hhcgorICogQHBhcmFtIE1hc2sgdGhlIG1hc2sgdmFyaWFibGUgdG8gYXNzaWduIHRvCisgKiBAcGFyYW0gTGVuIHRoZSBsZW5ndGggdmFyaWFibGUgdG8gYXNzaWduIHRvCisgKi8KKyNkZWZpbmUgVVRGOF9DT01QVVRFKENoYXIsIE1hc2ssIExlbikJCQkJCSAgICAgIFwKKyAgaWYgKENoYXIgPCAxMjgpCQkJCQkJCSAgICAgIFwKKyAgICB7CQkJCQkJCQkJICAgICAgXAorICAgICAgTGVuID0gMTsJCQkJCQkJCSAgICAgIFwKKyAgICAgIE1hc2sgPSAweDdmOwkJCQkJCQkgICAgICBcCisgICAgfQkJCQkJCQkJCSAgICAgIFwKKyAgZWxzZSBpZiAoKENoYXIgJiAweGUwKSA9PSAweGMwKQkJCQkJICAgICAgXAorICAgIHsJCQkJCQkJCQkgICAgICBcCisgICAgICBMZW4gPSAyOwkJCQkJCQkJICAgICAgXAorICAgICAgTWFzayA9IDB4MWY7CQkJCQkJCSAgICAgIFwKKyAgICB9CQkJCQkJCQkJICAgICAgXAorICBlbHNlIGlmICgoQ2hhciAmIDB4ZjApID09IDB4ZTApCQkJCQkgICAgICBcCisgICAgewkJCQkJCQkJCSAgICAgIFwKKyAgICAgIExlbiA9IDM7CQkJCQkJCQkgICAgICBcCisgICAgICBNYXNrID0gMHgwZjsJCQkJCQkJICAgICAgXAorICAgIH0JCQkJCQkJCQkgICAgICBcCisgIGVsc2UgaWYgKChDaGFyICYgMHhmOCkgPT0gMHhmMCkJCQkJCSAgICAgIFwKKyAgICB7CQkJCQkJCQkJICAgICAgXAorICAgICAgTGVuID0gNDsJCQkJCQkJCSAgICAgIFwKKyAgICAgIE1hc2sgPSAweDA3OwkJCQkJCQkgICAgICBcCisgICAgfQkJCQkJCQkJCSAgICAgIFwKKyAgZWxzZSBpZiAoKENoYXIgJiAweGZjKSA9PSAweGY4KQkJCQkJICAgICAgXAorICAgIHsJCQkJCQkJCQkgICAgICBcCisgICAgICBMZW4gPSA1OwkJCQkJCQkJICAgICAgXAorICAgICAgTWFzayA9IDB4MDM7CQkJCQkJCSAgICAgIFwKKyAgICB9CQkJCQkJCQkJICAgICAgXAorICBlbHNlIGlmICgoQ2hhciAmIDB4ZmUpID09IDB4ZmMpCQkJCQkgICAgICBcCisgICAgewkJCQkJCQkJCSAgICAgIFwKKyAgICAgIExlbiA9IDY7CQkJCQkJCQkgICAgICBcCisgICAgICBNYXNrID0gMHgwMTsJCQkJCQkJICAgICAgXAorICAgIH0JCQkJCQkJCQkgICAgICBcCisgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBMZW4gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIE1hc2sgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKy8qKgorICogY29tcHV0ZXMgbGVuZ3RoIG9mIGEgdW5pY29kZSBjaGFyYWN0ZXIgaW4gVVRGLTgKKyAqIEBwYXJhbSBDaGFyIHRoZSBjaGFyCisgKi8KKyNkZWZpbmUgVVRGOF9MRU5HVEgoQ2hhcikgICAgICAgICAgICAgIFwKKyAgKChDaGFyKSA8IDB4ODAgPyAxIDogICAgICAgICAgICAgICAgIFwKKyAgICgoQ2hhcikgPCAweDgwMCA/IDIgOiAgICAgICAgICAgICAgIFwKKyAgICAoKENoYXIpIDwgMHgxMDAwMCA/IDMgOiAgICAgICAgICAgIFwKKyAgICAgKChDaGFyKSA8IDB4MjAwMDAwID8gNCA6ICAgICAgICAgIFwKKyAgICAgICgoQ2hhcikgPCAweDQwMDAwMDAgPyA1IDogNikpKSkpCisgICAKKy8qKgorICogR2V0cyBhIFVURi04IHZhbHVlLgorICoKKyAqIEBwYXJhbSBSZXN1bHQgdmFyaWFibGUgZm9yIGV4dHJhY3RlZCB1bmljb2RlIGNoYXIuCisgKiBAcGFyYW0gQ2hhcnMgdGhlIGJ5dGVzIHRvIGRlY29kZQorICogQHBhcmFtIENvdW50IGNvdW50ZXIgdmFyaWFibGUKKyAqIEBwYXJhbSBNYXNrIG1hc2sgZm9yIHRoaXMgY2hhcgorICogQHBhcmFtIExlbiBsZW5ndGggZm9yIHRoaXMgY2hhciBpbiBieXRlcworICovCisjZGVmaW5lIFVURjhfR0VUKFJlc3VsdCwgQ2hhcnMsIENvdW50LCBNYXNrLCBMZW4pCQkJICAgICAgXAorICAoUmVzdWx0KSA9IChDaGFycylbMF0gJiAoTWFzayk7CQkJCQkgICAgICBcCisgIGZvciAoKENvdW50KSA9IDE7IChDb3VudCkgPCAoTGVuKTsgKysoQ291bnQpKQkJCQkgICAgICBcCisgICAgewkJCQkJCQkJCSAgICAgIFwKKyAgICAgIGlmICgoKENoYXJzKVsoQ291bnQpXSAmIDB4YzApICE9IDB4ODApCQkJCSAgICAgIFwKKwl7CQkJCQkJCQkgICAgICBcCisJICAoUmVzdWx0KSA9IC0xOwkJCQkJCSAgICAgIFwKKwkgIGJyZWFrOwkJCQkJCQkgICAgICBcCisJfQkJCQkJCQkJICAgICAgXAorICAgICAgKFJlc3VsdCkgPDw9IDY7CQkJCQkJCSAgICAgIFwKKyAgICAgIChSZXN1bHQpIHw9ICgoQ2hhcnMpWyhDb3VudCldICYgMHgzZik7CQkJCSAgICAgIFwKKyAgICB9CisKKy8qKgorICogQ2hlY2sgd2hldGhlciBhIFVuaWNvZGUgKDUuMikgY2hhciBpcyBpbiBhIHZhbGlkIHJhbmdlLgorICoKKyAqIFRoZSBmaXJzdCBjaGVjayBjb21lcyBmcm9tIHRoZSBVbmljb2RlIGd1YXJhbnRlZSB0byBuZXZlciBlbmNvZGUKKyAqIGEgcG9pbnQgYWJvdmUgMHgwMDEwZmZmZiwgc2luY2UgVVRGLTE2IGNvdWxkbid0IHJlcHJlc2VudCBpdC4KKyAqCisgKiBUaGUgc2Vjb25kIGNoZWNrIGNvdmVycyBzdXJyb2dhdGUgcGFpcnMgKGNhdGVnb3J5IENzKS4KKyAqCisgKiBAcGFyYW0gQ2hhciB0aGUgY2hhcmFjdGVyCisgKi8KKyNkZWZpbmUgVU5JQ09ERV9WQUxJRChDaGFyKSAgICAgICAgICAgICAgICAgICBcCisgICAgKChDaGFyKSA8IDB4MTEwMDAwICYmICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKChDaGFyKSAmIDB4RkZGRkY4MDApICE9IDB4RDgwMCkpCisKKy8qKgorICogRmluZHMgdGhlIGdpdmVuIHN1YnN0cmluZyBpbiB0aGUgc3RyaW5nLAorICogcmV0dXJuaW5nICNUUlVFIGFuZCBmaWxsaW5nIGluIHRoZSBieXRlIGluZGV4CisgKiB3aGVyZSB0aGUgc3Vic3RyaW5nIHdhcyBmb3VuZCwgaWYgaXQgd2FzIGZvdW5kLgorICogUmV0dXJucyAjRkFMU0UgaWYgdGhlIHN1YnN0cmluZyB3YXNuJ3QgZm91bmQuCisgKiBTZXRzICpzdGFydCB0byB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgaWYgdGhlIHN1YnN0cmluZworICogaXMgbm90IGZvdW5kLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZworICogQHBhcmFtIHN0YXJ0IHdoZXJlIHRvIHN0YXJ0IGxvb2tpbmcKKyAqIEBwYXJhbSBzdWJzdHIgdGhlIHN1YnN0cmluZworICogQHBhcmFtIGZvdW5kIHJldHVybiBsb2NhdGlvbiBmb3Igd2hlcmUgaXQgd2FzIGZvdW5kLCBvciAjTlVMTAorICogQHJldHVybnMgI1RSVUUgaWYgZm91bmQKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3N0cmluZ19maW5kIChjb25zdCBEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAqc3Vic3RyLAorICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgKmZvdW5kKQoreworICByZXR1cm4gX2RidXNfc3RyaW5nX2ZpbmRfdG8gKHN0ciwgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChjb25zdCBEQnVzUmVhbFN0cmluZyopc3RyKS0+bGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnN0ciwgZm91bmQpOworfQorCisvKioKKyAqIEZpbmRzIGVuZCBvZiBsaW5lICgiXHJcbiIgb3IgIlxuIikgaW4gdGhlIHN0cmluZywKKyAqIHJldHVybmluZyAjVFJVRSBhbmQgZmlsbGluZyBpbiB0aGUgYnl0ZSBpbmRleAorICogd2hlcmUgdGhlIGVvbCBzdHJpbmcgd2FzIGZvdW5kLCBpZiBpdCB3YXMgZm91bmQuCisgKiBSZXR1cm5zICNGQUxTRSBpZiBlb2wgd2Fzbid0IGZvdW5kLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZworICogQHBhcmFtIHN0YXJ0IHdoZXJlIHRvIHN0YXJ0IGxvb2tpbmcKKyAqIEBwYXJhbSBmb3VuZCByZXR1cm4gbG9jYXRpb24gZm9yIHdoZXJlIGVvbCB3YXMgZm91bmQgb3Igc3RyaW5nIGxlbmd0aCBvdGhlcndpc2UKKyAqIEBwYXJhbSBmb3VuZF9sZW4gcmV0dXJuIGxlbmd0aCBvZiBmb3VuZCBlb2wgc3RyaW5nIG9yIHplcm8gb3RoZXJ3aXNlCisgKiBAcmV0dXJucyAjVFJVRSBpZiBmb3VuZAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RyaW5nX2ZpbmRfZW9sIChjb25zdCBEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICpmb3VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAqZm91bmRfbGVuKQoreworICBpbnQgaTsKKworICBEQlVTX0NPTlNUX1NUUklOR19QUkVBTUJMRSAoc3RyKTsKKyAgX2RidXNfYXNzZXJ0IChzdGFydCA8PSByZWFsLT5sZW4pOworICBfZGJ1c19hc3NlcnQgKHN0YXJ0ID49IDApOworICAKKyAgaSA9IHN0YXJ0OworICB3aGlsZSAoaSA8IHJlYWwtPmxlbikKKyAgICB7CisgICAgICBpZiAocmVhbC0+c3RyW2ldID09ICdccicpIAorICAgICAgICB7CisgICAgICAgICAgaWYgKChpKzEpIDwgcmVhbC0+bGVuICYmIHJlYWwtPnN0cltpKzFdID09ICdcbicpIC8qICJcclxuIiAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoZm91bmQpIAorICAgICAgICAgICAgICAgICpmb3VuZCA9IGk7CisgICAgICAgICAgICAgIGlmIChmb3VuZF9sZW4pCisgICAgICAgICAgICAgICAgKmZvdW5kX2xlbiA9IDI7CisgICAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgfSAKKyAgICAgICAgICBlbHNlIC8qIG9ubHkgIlxyIiAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoZm91bmQpIAorICAgICAgICAgICAgICAgICpmb3VuZCA9IGk7CisgICAgICAgICAgICAgIGlmIChmb3VuZF9sZW4pCisgICAgICAgICAgICAgICAgKmZvdW5kX2xlbiA9IDE7CisgICAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgfQorICAgICAgICB9IAorICAgICAgZWxzZSBpZiAocmVhbC0+c3RyW2ldID09ICdcbicpICAvKiBvbmx5ICJcbiIgKi8KKyAgICAgICAgeworICAgICAgICAgIGlmIChmb3VuZCkgCisgICAgICAgICAgICAqZm91bmQgPSBpOworICAgICAgICAgIGlmIChmb3VuZF9sZW4pCisgICAgICAgICAgICAqZm91bmRfbGVuID0gMTsKKyAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgfQorICAgICAgKytpOworICAgIH0KKworICBpZiAoZm91bmQpCisgICAgKmZvdW5kID0gcmVhbC0+bGVuOworCisgIGlmIChmb3VuZF9sZW4pCisgICAgKmZvdW5kX2xlbiA9IDA7CisgIAorICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKgorICogRmluZHMgdGhlIGdpdmVuIHN1YnN0cmluZyBpbiB0aGUgc3RyaW5nLAorICogdXAgdG8gYSBjZXJ0YWluIHBvc2l0aW9uLAorICogcmV0dXJuaW5nICNUUlVFIGFuZCBmaWxsaW5nIGluIHRoZSBieXRlIGluZGV4CisgKiB3aGVyZSB0aGUgc3Vic3RyaW5nIHdhcyBmb3VuZCwgaWYgaXQgd2FzIGZvdW5kLgorICogUmV0dXJucyAjRkFMU0UgaWYgdGhlIHN1YnN0cmluZyB3YXNuJ3QgZm91bmQuCisgKiBTZXRzICpzdGFydCB0byB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgaWYgdGhlIHN1YnN0cmluZworICogaXMgbm90IGZvdW5kLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZworICogQHBhcmFtIHN0YXJ0IHdoZXJlIHRvIHN0YXJ0IGxvb2tpbmcKKyAqIEBwYXJhbSBlbmQgd2hlcmUgdG8gc3RvcCBsb29raW5nCisgKiBAcGFyYW0gc3Vic3RyIHRoZSBzdWJzdHJpbmcKKyAqIEBwYXJhbSBmb3VuZCByZXR1cm4gbG9jYXRpb24gZm9yIHdoZXJlIGl0IHdhcyBmb3VuZCwgb3IgI05VTEwKKyAqIEByZXR1cm5zICNUUlVFIGlmIGZvdW5kCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zdHJpbmdfZmluZF90byAoY29uc3QgREJ1c1N0cmluZyAqc3RyLAorCQkgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydCwKKwkJICAgICAgaW50ICAgICAgICAgICAgICAgZW5kLAorCQkgICAgICBjb25zdCBjaGFyICAgICAgICpzdWJzdHIsCisJCSAgICAgIGludCAgICAgICAgICAgICAgKmZvdW5kKQoreworICBpbnQgaTsKKyAgREJVU19DT05TVF9TVFJJTkdfUFJFQU1CTEUgKHN0cik7CisgIF9kYnVzX2Fzc2VydCAoc3Vic3RyICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKHN0YXJ0IDw9IHJlYWwtPmxlbik7CisgIF9kYnVzX2Fzc2VydCAoc3RhcnQgPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAoc3Vic3RyICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKGVuZCA8PSByZWFsLT5sZW4pOworICBfZGJ1c19hc3NlcnQgKHN0YXJ0IDw9IGVuZCk7CisKKyAgLyogd2UgYWx3YXlzICJmaW5kIiBhbiBlbXB0eSBzdHJpbmcgKi8KKyAgaWYgKCpzdWJzdHIgPT0gJ1wwJykKKyAgICB7CisgICAgICBpZiAoZm91bmQpCisgICAgICAgICpmb3VuZCA9IHN0YXJ0OworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGkgPSBzdGFydDsKKyAgd2hpbGUgKGkgPCBlbmQpCisgICAgeworICAgICAgaWYgKHJlYWwtPnN0cltpXSA9PSBzdWJzdHJbMF0pCisgICAgICAgIHsKKyAgICAgICAgICBpbnQgaiA9IGkgKyAxOworICAgICAgICAgIAorICAgICAgICAgIHdoaWxlIChqIDwgZW5kKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoc3Vic3RyW2ogLSBpXSA9PSAnXDAnKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBlbHNlIGlmIChyZWFsLT5zdHJbal0gIT0gc3Vic3RyW2ogLSBpXSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICsrajsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChzdWJzdHJbaiAtIGldID09ICdcMCcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmIChmb3VuZCkKKyAgICAgICAgICAgICAgICAqZm91bmQgPSBpOworICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgCisgICAgICArK2k7CisgICAgfQorCisgIGlmIChmb3VuZCkKKyAgICAqZm91bmQgPSBlbmQ7CisgIAorICByZXR1cm4gRkFMU0U7ICAKK30KKworLyoqCisgKiBGaW5kcyBhIGJsYW5rIChzcGFjZSBvciB0YWIpIGluIHRoZSBzdHJpbmcuIFJldHVybnMgI1RSVUUKKyAqIGlmIGZvdW5kLCAjRkFMU0Ugb3RoZXJ3aXNlLiBJZiBhIGJsYW5rIGlzIG5vdCBmb3VuZCBzZXRzCisgKiAqZm91bmQgdG8gdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZworICogQHBhcmFtIHN0YXJ0IGJ5dGUgaW5kZXggdG8gc3RhcnQgbG9va2luZworICogQHBhcmFtIGZvdW5kIHBsYWNlIHRvIHN0b3JlIHRoZSBsb2NhdGlvbiBvZiB0aGUgZmlyc3QgYmxhbmsKKyAqIEByZXR1cm5zICNUUlVFIGlmIGEgYmxhbmsgd2FzIGZvdW5kCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zdHJpbmdfZmluZF9ibGFuayAoY29uc3QgREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgKmZvdW5kKQoreworICBpbnQgaTsKKyAgREJVU19DT05TVF9TVFJJTkdfUFJFQU1CTEUgKHN0cik7CisgIF9kYnVzX2Fzc2VydCAoc3RhcnQgPD0gcmVhbC0+bGVuKTsKKyAgX2RidXNfYXNzZXJ0IChzdGFydCA+PSAwKTsKKyAgCisgIGkgPSBzdGFydDsKKyAgd2hpbGUgKGkgPCByZWFsLT5sZW4pCisgICAgeworICAgICAgaWYgKHJlYWwtPnN0cltpXSA9PSAnICcgfHwKKyAgICAgICAgICByZWFsLT5zdHJbaV0gPT0gJ1x0JykKKyAgICAgICAgeworICAgICAgICAgIGlmIChmb3VuZCkKKyAgICAgICAgICAgICpmb3VuZCA9IGk7CisgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgKytpOworICAgIH0KKworICBpZiAoZm91bmQpCisgICAgKmZvdW5kID0gcmVhbC0+bGVuOworICAKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKioKKyAqIFNraXBzIGJsYW5rcyBmcm9tIHN0YXJ0LCBzdG9yaW5nIHRoZSBmaXJzdCBub24tYmxhbmsgaW4gKmVuZAorICogKGJsYW5rIGlzIHNwYWNlIG9yIHRhYikuCisgKgorICogQHBhcmFtIHN0ciB0aGUgc3RyaW5nCisgKiBAcGFyYW0gc3RhcnQgd2hlcmUgdG8gc3RhcnQKKyAqIEBwYXJhbSBlbmQgd2hlcmUgdG8gc3RvcmUgdGhlIGZpcnN0IG5vbi1ibGFuayBieXRlIGluZGV4CisgKi8KK3ZvaWQKK19kYnVzX3N0cmluZ19za2lwX2JsYW5rIChjb25zdCBEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAqZW5kKQoreworICBpbnQgaTsKKyAgREJVU19DT05TVF9TVFJJTkdfUFJFQU1CTEUgKHN0cik7CisgIF9kYnVzX2Fzc2VydCAoc3RhcnQgPD0gcmVhbC0+bGVuKTsKKyAgX2RidXNfYXNzZXJ0IChzdGFydCA+PSAwKTsKKyAgCisgIGkgPSBzdGFydDsKKyAgd2hpbGUgKGkgPCByZWFsLT5sZW4pCisgICAgeworICAgICAgaWYgKCFEQlVTX0lTX0FTQ0lJX0JMQU5LIChyZWFsLT5zdHJbaV0pKQorICAgICAgICBicmVhazsKKyAgICAgIAorICAgICAgKytpOworICAgIH0KKworICBfZGJ1c19hc3NlcnQgKGkgPT0gcmVhbC0+bGVuIHx8ICFEQlVTX0lTX0FTQ0lJX1dISVRFIChyZWFsLT5zdHJbaV0pKTsKKyAgCisgIGlmIChlbmQpCisgICAgKmVuZCA9IGk7Cit9CisKKworLyoqCisgKiBTa2lwcyB3aGl0ZXNwYWNlIGZyb20gc3RhcnQsIHN0b3JpbmcgdGhlIGZpcnN0IG5vbi13aGl0ZXNwYWNlIGluICplbmQuCisgKiAod2hpdGVzcGFjZSBpcyBzcGFjZSwgdGFiLCBuZXdsaW5lLCBDUikuCisgKgorICogQHBhcmFtIHN0ciB0aGUgc3RyaW5nCisgKiBAcGFyYW0gc3RhcnQgd2hlcmUgdG8gc3RhcnQKKyAqIEBwYXJhbSBlbmQgd2hlcmUgdG8gc3RvcmUgdGhlIGZpcnN0IG5vbi13aGl0ZXNwYWNlIGJ5dGUgaW5kZXgKKyAqLwordm9pZAorX2RidXNfc3RyaW5nX3NraXBfd2hpdGUgKGNvbnN0IERCdXNTdHJpbmcgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICplbmQpCit7CisgIGludCBpOworICBEQlVTX0NPTlNUX1NUUklOR19QUkVBTUJMRSAoc3RyKTsKKyAgX2RidXNfYXNzZXJ0IChzdGFydCA8PSByZWFsLT5sZW4pOworICBfZGJ1c19hc3NlcnQgKHN0YXJ0ID49IDApOworICAKKyAgaSA9IHN0YXJ0OworICB3aGlsZSAoaSA8IHJlYWwtPmxlbikKKyAgICB7CisgICAgICBpZiAoIURCVVNfSVNfQVNDSUlfV0hJVEUgKHJlYWwtPnN0cltpXSkpCisgICAgICAgIGJyZWFrOworICAgICAgCisgICAgICArK2k7CisgICAgfQorCisgIF9kYnVzX2Fzc2VydCAoaSA9PSByZWFsLT5sZW4gfHwgIShEQlVTX0lTX0FTQ0lJX1dISVRFIChyZWFsLT5zdHJbaV0pKSk7CisgIAorICBpZiAoZW5kKQorICAgICplbmQgPSBpOworfQorCisvKioKKyAqIFNraXBzIHdoaXRlc3BhY2UgZnJvbSBlbmQsIHN0b3JpbmcgdGhlIHN0YXJ0IGluZGV4IG9mIHRoZSB0cmFpbGluZworICogd2hpdGVzcGFjZSBpbiAqc3RhcnQuICh3aGl0ZXNwYWNlIGlzIHNwYWNlLCB0YWIsIG5ld2xpbmUsIENSKS4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcKKyAqIEBwYXJhbSBlbmQgd2hlcmUgdG8gc3RhcnQgc2Nhbm5pbmcgYmFja3dhcmQKKyAqIEBwYXJhbSBzdGFydCB3aGVyZSB0byBzdG9yZSB0aGUgc3RhcnQgb2Ygd2hpdGVzcGFjZSBjaGFycworICovCit2b2lkCitfZGJ1c19zdHJpbmdfc2tpcF93aGl0ZV9yZXZlcnNlIChjb25zdCBEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICpzdGFydCkKK3sKKyAgaW50IGk7CisgIERCVVNfQ09OU1RfU1RSSU5HX1BSRUFNQkxFIChzdHIpOworICBfZGJ1c19hc3NlcnQgKGVuZCA8PSByZWFsLT5sZW4pOworICBfZGJ1c19hc3NlcnQgKGVuZCA+PSAwKTsKKyAgCisgIGkgPSBlbmQ7CisgIHdoaWxlIChpID4gMCkKKyAgICB7CisgICAgICBpZiAoIURCVVNfSVNfQVNDSUlfV0hJVEUgKHJlYWwtPnN0cltpLTFdKSkKKyAgICAgICAgYnJlYWs7CisgICAgICAtLWk7CisgICAgfQorCisgIF9kYnVzX2Fzc2VydCAoaSA+PSAwICYmIChpID09IDAgfHwgIShEQlVTX0lTX0FTQ0lJX1dISVRFIChyZWFsLT5zdHJbaS0xXSkpKSk7CisgIAorICBpZiAoc3RhcnQpCisgICAgKnN0YXJ0ID0gaTsKK30KKworLyoqCisgKiBBc3NpZ25zIGEgbmV3bGluZS10ZXJtaW5hdGVkIG9yIFxcclxcbi10ZXJtaW5hdGVkIGxpbmUgZnJvbSB0aGUgZnJvbnQKKyAqIG9mIHRoZSBzdHJpbmcgdG8gdGhlIGdpdmVuIGRlc3Qgc3RyaW5nLiBUaGUgZGVzdCBzdHJpbmcncyBwcmV2aW91cworICogY29udGVudHMgYXJlIGRlbGV0ZWQuIElmIHRoZSBzb3VyY2Ugc3RyaW5nIGNvbnRhaW5zIG5vIG5ld2xpbmUsCisgKiBtb3ZlcyB0aGUgZW50aXJlIHNvdXJjZSBzdHJpbmcgdG8gdGhlIGRlc3Qgc3RyaW5nLgorICoKKyAqIEB0b2RvIG93ZW4gY29ycmVjdGx5IG5vdGVzIHRoYXQgdGhpcyBpcyBhIHN0dXBpZCBmdW5jdGlvbiAoaXQgd2FzCisgKiB3cml0dGVuIHB1cmVseSBmb3IgdGVzdCBjb2RlLAorICogZS5nLiBkYnVzLW1lc3NhZ2UtYnVpbGRlci5jKS4gUHJvYmFibHkgc2hvdWxkIGJlIGVuZm9yY2VkIGFzIHRlc3QKKyAqIGNvZGUgb25seSB3aXRoIGlmZGVmIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTCisgKiAKKyAqIEBwYXJhbSBzb3VyY2UgdGhlIHNvdXJjZSBzdHJpbmcKKyAqIEBwYXJhbSBkZXN0IHRoZSBkZXN0aW5hdGlvbiBzdHJpbmcgKGNvbnRlbnRzIGFyZSByZXBsYWNlZCkKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBubyBtZW1vcnksIG9yIHNvdXJjZSBoYXMgbGVuZ3RoIDAKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3N0cmluZ19wb3BfbGluZSAoREJ1c1N0cmluZyAqc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICpkZXN0KQoreworICBpbnQgZW9sLCBlb2xfbGVuOworICAKKyAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKGRlc3QsIDApOworICAKKyAgZW9sID0gMDsKKyAgZW9sX2xlbiA9IDA7CisgIGlmICghX2RidXNfc3RyaW5nX2ZpbmRfZW9sIChzb3VyY2UsIDAsICZlb2wsICZlb2xfbGVuKSkKKyAgICB7CisgICAgICBfZGJ1c19hc3NlcnQgKGVvbCA9PSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoc291cmNlKSk7CisgICAgICBpZiAoZW9sID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAvKiBJZiB0aGVyZSdzIG5vIG5ld2xpbmUgYW5kIHNvdXJjZSBoYXMgemVybyBsZW5ndGgsIHdlJ3JlIGRvbmUgKi8KKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgIC8qIG90aGVyd2lzZSwgdGhlIGxhc3QgbGluZSBvZiB0aGUgZmlsZSBoYXMgbm8gZW9sIGNoYXJhY3RlcnMgKi8KKyAgICB9CisKKyAgLyogcmVtZW1iZXIgZW9sIGNhbiBiZSAwIGlmIGl0J3MgYW4gZW1wdHkgbGluZSwgYnV0IGVvbF9sZW4gc2hvdWxkIG5vdCBiZSB6ZXJvIGFsc28KKyAgICogc2luY2UgZmluZF9lb2wgcmV0dXJuZWQgVFJVRQorICAgKi8KKyAgCisgIGlmICghX2RidXNfc3RyaW5nX21vdmVfbGVuIChzb3VyY2UsIDAsIGVvbCArIGVvbF9sZW4sIGRlc3QsIDApKQorICAgIHJldHVybiBGQUxTRTsKKyAgCisgIC8qIHJlbW92ZSBsaW5lIGVuZGluZyAqLworICBpZiAoIV9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoIChkZXN0LCBlb2wpKQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm91dCBvZiBtZW1vcnkgd2hlbiBzaG9ydGVuaW5nIGEgc3RyaW5nIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCisjaWZkZWYgREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMKKy8qKgorICogRGVsZXRlcyB1cCB0byBhbmQgaW5jbHVkaW5nIHRoZSBmaXJzdCBibGFuayBzcGFjZQorICogaW4gdGhlIHN0cmluZy4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcKKyAqLwordm9pZAorX2RidXNfc3RyaW5nX2RlbGV0ZV9maXJzdF93b3JkIChEQnVzU3RyaW5nICpzdHIpCit7CisgIGludCBpOworICAKKyAgaWYgKF9kYnVzX3N0cmluZ19maW5kX2JsYW5rIChzdHIsIDAsICZpKSkKKyAgICBfZGJ1c19zdHJpbmdfc2tpcF9ibGFuayAoc3RyLCBpLCAmaSk7CisKKyAgX2RidXNfc3RyaW5nX2RlbGV0ZSAoc3RyLCAwLCBpKTsKK30KKyNlbmRpZgorCisjaWZkZWYgREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMKKy8qKgorICogRGVsZXRlcyBhbnkgbGVhZGluZyBibGFua3MgaW4gdGhlIHN0cmluZworICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZworICovCit2b2lkCitfZGJ1c19zdHJpbmdfZGVsZXRlX2xlYWRpbmdfYmxhbmtzIChEQnVzU3RyaW5nICpzdHIpCit7CisgIGludCBpOworICAKKyAgX2RidXNfc3RyaW5nX3NraXBfYmxhbmsgKHN0ciwgMCwgJmkpOworCisgIGlmIChpID4gMCkKKyAgICBfZGJ1c19zdHJpbmdfZGVsZXRlIChzdHIsIDAsIGkpOworfQorI2VuZGlmCisKKy8qKgorICogRGVsZXRlcyBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlCisgKiAKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZworICovCit2b2lkCitfZGJ1c19zdHJpbmdfY2hvcF93aGl0ZShEQnVzU3RyaW5nICpzdHIpCit7CisgIGludCBpOworICAKKyAgX2RidXNfc3RyaW5nX3NraXBfd2hpdGUgKHN0ciwgMCwgJmkpOworCisgIGlmIChpID4gMCkKKyAgICBfZGJ1c19zdHJpbmdfZGVsZXRlIChzdHIsIDAsIGkpOworICAKKyAgX2RidXNfc3RyaW5nX3NraXBfd2hpdGVfcmV2ZXJzZSAoc3RyLCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoc3RyKSwgJmkpOworCisgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoIChzdHIsIGkpOworfQorCisvKioKKyAqIFRlc3RzIHR3byBEQnVzU3RyaW5nIGZvciBlcXVhbGl0eS4KKyAqCisgKiBAdG9kbyBtZW1jbXAgaXMgcHJvYmFibHkgZmFzdGVyCisgKgorICogQHBhcmFtIGEgZmlyc3Qgc3RyaW5nCisgKiBAcGFyYW0gYiBzZWNvbmQgc3RyaW5nCisgKiBAcmV0dXJucyAjVFJVRSBpZiBlcXVhbAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RyaW5nX2VxdWFsIChjb25zdCBEQnVzU3RyaW5nICphLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpiKQoreworICBjb25zdCB1bnNpZ25lZCBjaGFyICphcDsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqYnA7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFfZW5kOworICBjb25zdCBEQnVzUmVhbFN0cmluZyAqcmVhbF9hID0gKGNvbnN0IERCdXNSZWFsU3RyaW5nKikgYTsKKyAgY29uc3QgREJ1c1JlYWxTdHJpbmcgKnJlYWxfYiA9IChjb25zdCBEQnVzUmVhbFN0cmluZyopIGI7CisgIERCVVNfR0VORVJJQ19TVFJJTkdfUFJFQU1CTEUgKHJlYWxfYSk7CisgIERCVVNfR0VORVJJQ19TVFJJTkdfUFJFQU1CTEUgKHJlYWxfYik7CisKKyAgaWYgKHJlYWxfYS0+bGVuICE9IHJlYWxfYi0+bGVuKQorICAgIHJldHVybiBGQUxTRTsKKworICBhcCA9IHJlYWxfYS0+c3RyOworICBicCA9IHJlYWxfYi0+c3RyOworICBhX2VuZCA9IHJlYWxfYS0+c3RyICsgcmVhbF9hLT5sZW47CisgIHdoaWxlIChhcCAhPSBhX2VuZCkKKyAgICB7CisgICAgICBpZiAoKmFwICE9ICpicCkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgCisgICAgICArK2FwOworICAgICAgKyticDsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogVGVzdHMgdHdvIERCdXNTdHJpbmcgZm9yIGVxdWFsaXR5IHVwIHRvIHRoZSBnaXZlbiBsZW5ndGguCisgKiBUaGUgc3RyaW5ncyBtYXkgYmUgc2hvcnRlciB0aGFuIHRoZSBnaXZlbiBsZW5ndGguCisgKgorICogQHRvZG8gd3JpdGUgYSB1bml0IHRlc3QKKyAqCisgKiBAdG9kbyBtZW1jbXAgaXMgcHJvYmFibHkgZmFzdGVyCisgKgorICogQHBhcmFtIGEgZmlyc3Qgc3RyaW5nCisgKiBAcGFyYW0gYiBzZWNvbmQgc3RyaW5nCisgKiBAcGFyYW0gbGVuIHRoZSBtYXhpbXVtIGxlbmd0aCB0byBsb29rIGF0CisgKiBAcmV0dXJucyAjVFJVRSBpZiBlcXVhbCBmb3IgdGhlIGdpdmVuIG51bWJlciBvZiBieXRlcworICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RyaW5nX2VxdWFsX2xlbiAoY29uc3QgREJ1c1N0cmluZyAqYSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmIsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBsZW4pCit7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFwOworICBjb25zdCB1bnNpZ25lZCBjaGFyICpicDsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqYV9lbmQ7CisgIGNvbnN0IERCdXNSZWFsU3RyaW5nICpyZWFsX2EgPSAoY29uc3QgREJ1c1JlYWxTdHJpbmcqKSBhOworICBjb25zdCBEQnVzUmVhbFN0cmluZyAqcmVhbF9iID0gKGNvbnN0IERCdXNSZWFsU3RyaW5nKikgYjsKKyAgREJVU19HRU5FUklDX1NUUklOR19QUkVBTUJMRSAocmVhbF9hKTsKKyAgREJVU19HRU5FUklDX1NUUklOR19QUkVBTUJMRSAocmVhbF9iKTsKKworICBpZiAocmVhbF9hLT5sZW4gIT0gcmVhbF9iLT5sZW4gJiYKKyAgICAgIChyZWFsX2EtPmxlbiA8IGxlbiB8fCByZWFsX2ItPmxlbiA8IGxlbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGFwID0gcmVhbF9hLT5zdHI7CisgIGJwID0gcmVhbF9iLT5zdHI7CisgIGFfZW5kID0gcmVhbF9hLT5zdHIgKyBNSU4gKHJlYWxfYS0+bGVuLCBsZW4pOworICB3aGlsZSAoYXAgIT0gYV9lbmQpCisgICAgeworICAgICAgaWYgKCphcCAhPSAqYnApCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIAorICAgICAgKythcDsKKyAgICAgICsrYnA7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIFRlc3RzIHR3byBzdWItcGFydHMgb2YgdHdvIERCdXNTdHJpbmcgZm9yIGVxdWFsaXR5LiAgVGhlIHNwZWNpZmllZAorICogcmFuZ2Ugb2YgdGhlIGZpcnN0IHN0cmluZyBtdXN0IGV4aXN0OyB0aGUgc3BlY2lmaWVkIHN0YXJ0IHBvc2l0aW9uCisgKiBvZiB0aGUgc2Vjb25kIHN0cmluZyBtdXN0IGV4aXN0LgorICoKKyAqIEB0b2RvIHdyaXRlIGEgdW5pdCB0ZXN0CisgKgorICogQHRvZG8gbWVtY21wIGlzIHByb2JhYmx5IGZhc3RlcgorICoKKyAqIEBwYXJhbSBhIGZpcnN0IHN0cmluZworICogQHBhcmFtIGFfc3RhcnQgd2hlcmUgdG8gc3RhcnQgc3Vic3RyaW5nIGluIGZpcnN0IHN0cmluZworICogQHBhcmFtIGFfbGVuIGxlbmd0aCBvZiBzdWJzdHJpbmcgaW4gZmlyc3Qgc3RyaW5nCisgKiBAcGFyYW0gYiBzZWNvbmQgc3RyaW5nCisgKiBAcGFyYW0gYl9zdGFydCB3aGVyZSB0byBzdGFydCBzdWJzdHJpbmcgaW4gc2Vjb25kIHN0cmluZworICogQHJldHVybnMgI1RSVUUgaWYgdGhlIHR3byBzdWJzdHJpbmdzIGFyZSBlcXVhbAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RyaW5nX2VxdWFsX3N1YnN0cmluZyAoY29uc3QgREJ1c1N0cmluZyAgKmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgYV9zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBhX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICpiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGJfc3RhcnQpCit7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFwOworICBjb25zdCB1bnNpZ25lZCBjaGFyICpicDsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqYV9lbmQ7CisgIGNvbnN0IERCdXNSZWFsU3RyaW5nICpyZWFsX2EgPSAoY29uc3QgREJ1c1JlYWxTdHJpbmcqKSBhOworICBjb25zdCBEQnVzUmVhbFN0cmluZyAqcmVhbF9iID0gKGNvbnN0IERCdXNSZWFsU3RyaW5nKikgYjsKKyAgREJVU19HRU5FUklDX1NUUklOR19QUkVBTUJMRSAocmVhbF9hKTsKKyAgREJVU19HRU5FUklDX1NUUklOR19QUkVBTUJMRSAocmVhbF9iKTsKKyAgX2RidXNfYXNzZXJ0IChhX3N0YXJ0ID49IDApOworICBfZGJ1c19hc3NlcnQgKGFfbGVuID49IDApOworICBfZGJ1c19hc3NlcnQgKGFfc3RhcnQgPD0gcmVhbF9hLT5sZW4pOworICBfZGJ1c19hc3NlcnQgKGFfbGVuIDw9IHJlYWxfYS0+bGVuIC0gYV9zdGFydCk7CisgIF9kYnVzX2Fzc2VydCAoYl9zdGFydCA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChiX3N0YXJ0IDw9IHJlYWxfYi0+bGVuKTsKKyAgCisgIGlmIChhX2xlbiA+IHJlYWxfYi0+bGVuIC0gYl9zdGFydCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgYXAgPSByZWFsX2EtPnN0ciArIGFfc3RhcnQ7CisgIGJwID0gcmVhbF9iLT5zdHIgKyBiX3N0YXJ0OworICBhX2VuZCA9IGFwICsgYV9sZW47CisgIHdoaWxlIChhcCAhPSBhX2VuZCkKKyAgICB7CisgICAgICBpZiAoKmFwICE9ICpicCkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgCisgICAgICArK2FwOworICAgICAgKyticDsKKyAgICB9CisKKyAgX2RidXNfYXNzZXJ0IChicCA8PSAocmVhbF9iLT5zdHIgKyByZWFsX2ItPmxlbikpOworICAKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogQ2hlY2tzIHdoZXRoZXIgYSBzdHJpbmcgaXMgZXF1YWwgdG8gYSBDIHN0cmluZy4KKyAqCisgKiBAcGFyYW0gYSB0aGUgc3RyaW5nCisgKiBAcGFyYW0gY19zdHIgdGhlIEMgc3RyaW5nCisgKiBAcmV0dXJucyAjVFJVRSBpZiBlcXVhbAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RyaW5nX2VxdWFsX2Nfc3RyIChjb25zdCBEQnVzU3RyaW5nICphLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICpjX3N0cikKK3sKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqYXA7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJwOworICBjb25zdCB1bnNpZ25lZCBjaGFyICphX2VuZDsKKyAgY29uc3QgREJ1c1JlYWxTdHJpbmcgKnJlYWxfYSA9IChjb25zdCBEQnVzUmVhbFN0cmluZyopIGE7CisgIERCVVNfR0VORVJJQ19TVFJJTkdfUFJFQU1CTEUgKHJlYWxfYSk7CisgIF9kYnVzX2Fzc2VydCAoY19zdHIgIT0gTlVMTCk7CisgIAorICBhcCA9IHJlYWxfYS0+c3RyOworICBicCA9IChjb25zdCB1bnNpZ25lZCBjaGFyKikgY19zdHI7CisgIGFfZW5kID0gcmVhbF9hLT5zdHIgKyByZWFsX2EtPmxlbjsKKyAgd2hpbGUgKGFwICE9IGFfZW5kICYmICpicCkKKyAgICB7CisgICAgICBpZiAoKmFwICE9ICpicCkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgCisgICAgICArK2FwOworICAgICAgKyticDsKKyAgICB9CisKKyAgaWYgKGFwICE9IGFfZW5kIHx8ICpicCkKKyAgICByZXR1cm4gRkFMU0U7CisgIAorICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBDaGVja3Mgd2hldGhlciBhIHN0cmluZyBzdGFydHMgd2l0aCB0aGUgZ2l2ZW4gQyBzdHJpbmcuCisgKgorICogQHBhcmFtIGEgdGhlIHN0cmluZworICogQHBhcmFtIGNfc3RyIHRoZSBDIHN0cmluZworICogQHJldHVybnMgI1RSVUUgaWYgc3RyaW5nIHN0YXJ0cyB3aXRoIGl0CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zdHJpbmdfc3RhcnRzX3dpdGhfY19zdHIgKGNvbnN0IERCdXNTdHJpbmcgKmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgKmNfc3RyKQoreworICBjb25zdCB1bnNpZ25lZCBjaGFyICphcDsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqYnA7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFfZW5kOworICBjb25zdCBEQnVzUmVhbFN0cmluZyAqcmVhbF9hID0gKGNvbnN0IERCdXNSZWFsU3RyaW5nKikgYTsKKyAgREJVU19HRU5FUklDX1NUUklOR19QUkVBTUJMRSAocmVhbF9hKTsKKyAgX2RidXNfYXNzZXJ0IChjX3N0ciAhPSBOVUxMKTsKKyAgCisgIGFwID0gcmVhbF9hLT5zdHI7CisgIGJwID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIqKSBjX3N0cjsKKyAgYV9lbmQgPSByZWFsX2EtPnN0ciArIHJlYWxfYS0+bGVuOworICB3aGlsZSAoYXAgIT0gYV9lbmQgJiYgKmJwKQorICAgIHsKKyAgICAgIGlmICgqYXAgIT0gKmJwKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAKKyAgICAgICsrYXA7CisgICAgICArK2JwOworICAgIH0KKworICBpZiAoKmJwID09ICdcMCcpCisgICAgcmV0dXJuIFRSVUU7CisgIGVsc2UKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKgorICogQXBwZW5kcyBhIHR3by1jaGFyYWN0ZXIgaGV4IGRpZ2l0IHRvIGEgc3RyaW5nLCB3aGVyZSB0aGUgaGV4IGRpZ2l0CisgKiBoYXMgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBieXRlLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZworICogQHBhcmFtIGJ5dGUgdGhlIGJ5dGUKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBubyBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3N0cmluZ19hcHBlbmRfYnl0ZV9hc19oZXggKERCdXNTdHJpbmcgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgYnl0ZSkKK3sKKyAgY29uc3QgY2hhciBoZXhkaWdpdHNbMTZdID0geworICAgICcwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLCAnOCcsICc5JywKKyAgICAnYScsICdiJywgJ2MnLCAnZCcsICdlJywgJ2YnCisgIH07CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX2J5dGUgKHN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhleGRpZ2l0c1soYnl0ZSA+PiA0KV0pKQorICAgIHJldHVybiBGQUxTRTsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlIChzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZXhkaWdpdHNbKGJ5dGUgJiAweDBmKV0pKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoIChzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHN0cikgLSAxKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogRW5jb2RlcyBhIHN0cmluZyBpbiBoZXgsIHRoZSB3YXkgTUQ1IGFuZCBTSEEtMSBhcmUgdXN1YWxseQorICogZW5jb2RlZC4gKEVhY2ggYnl0ZSBpcyB0d28gaGV4IGRpZ2l0cy4pCisgKgorICogQHBhcmFtIHNvdXJjZSB0aGUgc3RyaW5nIHRvIGVuY29kZQorICogQHBhcmFtIHN0YXJ0IGJ5dGUgaW5kZXggdG8gc3RhcnQgZW5jb2RpbmcKKyAqIEBwYXJhbSBkZXN0IHN0cmluZyB3aGVyZSBlbmNvZGVkIGRhdGEgc2hvdWxkIGJlIHBsYWNlZAorICogQHBhcmFtIGluc2VydF9hdCB3aGVyZSB0byBwbGFjZSBlbmNvZGVkIGRhdGEKKyAqIEByZXR1cm5zICNUUlVFIGlmIGVuY29kaW5nIHdhcyBzdWNjZXNzZnVsLCAjRkFMU0UgaWYgbm8gbWVtb3J5IGV0Yy4KKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3N0cmluZ19oZXhfZW5jb2RlIChjb25zdCBEQnVzU3RyaW5nICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAqZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBpbnNlcnRfYXQpCit7CisgIERCdXNTdHJpbmcgcmVzdWx0OworICBjb25zdCB1bnNpZ25lZCBjaGFyICpwOworICBjb25zdCB1bnNpZ25lZCBjaGFyICplbmQ7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgCisgIF9kYnVzX2Fzc2VydCAoc3RhcnQgPD0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHNvdXJjZSkpOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZyZXN1bHQpKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR2YWwgPSBGQUxTRTsKKyAgCisgIHAgPSAoY29uc3QgdW5zaWduZWQgY2hhciopIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoc291cmNlKTsKKyAgZW5kID0gcCArIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChzb3VyY2UpOworICBwICs9IHN0YXJ0OworICAKKyAgd2hpbGUgKHAgIT0gZW5kKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlX2FzX2hleCAoJnJlc3VsdCwgKnApKQorICAgICAgICBnb3RvIG91dDsKKyAgICAgIAorICAgICAgKytwOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19tb3ZlICgmcmVzdWx0LCAwLCBkZXN0LCBpbnNlcnRfYXQpKQorICAgIGdvdG8gb3V0OworCisgIHJldHZhbCA9IFRSVUU7CisKKyBvdXQ6CisgIF9kYnVzX3N0cmluZ19mcmVlICgmcmVzdWx0KTsKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBEZWNvZGVzIGEgc3RyaW5nIGZyb20gaGV4IGVuY29kaW5nLgorICoKKyAqIEBwYXJhbSBzb3VyY2UgdGhlIHN0cmluZyB0byBkZWNvZGUKKyAqIEBwYXJhbSBzdGFydCBieXRlIGluZGV4IHRvIHN0YXJ0IGRlY29kZQorICogQHBhcmFtIGVuZF9yZXR1cm4gcmV0dXJuIGxvY2F0aW9uIG9mIHRoZSBlbmQgb2YgdGhlIGhleCBkYXRhLCBvciAjTlVMTAorICogQHBhcmFtIGRlc3Qgc3RyaW5nIHdoZXJlIGRlY29kZWQgZGF0YSBzaG91bGQgYmUgcGxhY2VkCisgKiBAcGFyYW0gaW5zZXJ0X2F0IHdoZXJlIHRvIHBsYWNlIGRlY29kZWQgZGF0YQorICogQHJldHVybnMgI1RSVUUgaWYgZGVjb2Rpbmcgd2FzIHN1Y2Nlc3NmdWwsICNGQUxTRSBpZiBubyBtZW1vcnkuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zdHJpbmdfaGV4X2RlY29kZSAoY29uc3QgREJ1c1N0cmluZyAqc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHN0YXJ0LAorCQkJIGludCAgICAgICAgICAgICAgKmVuZF9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAqZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBpbnNlcnRfYXQpCit7CisgIERCdXNTdHJpbmcgcmVzdWx0OworICBjb25zdCB1bnNpZ25lZCBjaGFyICpwOworICBjb25zdCB1bnNpZ25lZCBjaGFyICplbmQ7CisgIGRidXNfYm9vbF90IHJldHZhbDsKKyAgZGJ1c19ib29sX3QgaGlnaF9iaXRzOworICAKKyAgX2RidXNfYXNzZXJ0IChzdGFydCA8PSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoc291cmNlKSk7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnJlc3VsdCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJldHZhbCA9IEZBTFNFOworCisgIGhpZ2hfYml0cyA9IFRSVUU7CisgIHAgPSAoY29uc3QgdW5zaWduZWQgY2hhciopIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoc291cmNlKTsKKyAgZW5kID0gcCArIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChzb3VyY2UpOworICBwICs9IHN0YXJ0OworICAKKyAgd2hpbGUgKHAgIT0gZW5kKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGludCB2YWw7CisKKyAgICAgIHN3aXRjaCAoKnApCisgICAgICAgIHsKKyAgICAgICAgY2FzZSAnMCc6CisgICAgICAgICAgdmFsID0gMDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnMSc6CisgICAgICAgICAgdmFsID0gMTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnMic6CisgICAgICAgICAgdmFsID0gMjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnMyc6CisgICAgICAgICAgdmFsID0gMzsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnNCc6CisgICAgICAgICAgdmFsID0gNDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnNSc6CisgICAgICAgICAgdmFsID0gNTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnNic6CisgICAgICAgICAgdmFsID0gNjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnNyc6CisgICAgICAgICAgdmFsID0gNzsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnOCc6CisgICAgICAgICAgdmFsID0gODsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnOSc6CisgICAgICAgICAgdmFsID0gOTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnYSc6CisgICAgICAgIGNhc2UgJ0EnOgorICAgICAgICAgIHZhbCA9IDEwOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdiJzoKKyAgICAgICAgY2FzZSAnQic6CisgICAgICAgICAgdmFsID0gMTE7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ2MnOgorICAgICAgICBjYXNlICdDJzoKKyAgICAgICAgICB2YWwgPSAxMjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnZCc6CisgICAgICAgIGNhc2UgJ0QnOgorICAgICAgICAgIHZhbCA9IDEzOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdlJzoKKyAgICAgICAgY2FzZSAnRSc6CisgICAgICAgICAgdmFsID0gMTQ7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ2YnOgorICAgICAgICBjYXNlICdGJzoKKyAgICAgICAgICB2YWwgPSAxNTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgIH0KKworICAgICAgaWYgKGhpZ2hfYml0cykKKyAgICAgICAgeworICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlICgmcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPDwgNCkpCisJICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBpbnQgbGVuOworICAgICAgICAgIHVuc2lnbmVkIGNoYXIgYjsKKworICAgICAgICAgIGxlbiA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmcmVzdWx0KTsKKyAgICAgICAgICAKKyAgICAgICAgICBiID0gX2RidXNfc3RyaW5nX2dldF9ieXRlICgmcmVzdWx0LCBsZW4gLSAxKTsKKworICAgICAgICAgIGIgfD0gdmFsOworCisgICAgICAgICAgX2RidXNfc3RyaW5nX3NldF9ieXRlICgmcmVzdWx0LCBsZW4gLSAxLCBiKTsKKyAgICAgICAgfQorCisgICAgICBoaWdoX2JpdHMgPSAhaGlnaF9iaXRzOworCisgICAgICArK3A7CisgICAgfQorCisgZG9uZToKKyAgaWYgKCFfZGJ1c19zdHJpbmdfbW92ZSAoJnJlc3VsdCwgMCwgZGVzdCwgaW5zZXJ0X2F0KSkKKyAgICBnb3RvIG91dDsKKworICBpZiAoZW5kX3JldHVybikKKyAgICAqZW5kX3JldHVybiA9IHAgLSAoY29uc3QgdW5zaWduZWQgY2hhciopIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoc291cmNlKTsKKworICByZXR2YWwgPSBUUlVFOworICAKKyBvdXQ6CisgIF9kYnVzX3N0cmluZ19mcmVlICgmcmVzdWx0KTsgIAorICByZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIENoZWNrcyB0aGF0IHRoZSBnaXZlbiByYW5nZSBvZiB0aGUgc3RyaW5nIGlzIHZhbGlkIEFTQ0lJIHdpdGggbm8KKyAqIG51bCBieXRlcy4gSWYgdGhlIGdpdmVuIHJhbmdlIGlzIG5vdCBlbnRpcmVseSBjb250YWluZWQgaW4gdGhlCisgKiBzdHJpbmcsIHJldHVybnMgI0ZBTFNFLgorICoKKyAqIEB0b2RvIHRoaXMgaXMgaW5jb25zaXN0ZW50IHdpdGggbW9zdCBvZiBEQnVzU3RyaW5nIGluIHRoYXQKKyAqIGl0IGFsbG93cyBhIHN0YXJ0LGxlbiByYW5nZSB0aGF0IGV4dGVuZHMgcGFzdCB0aGUgc3RyaW5nIGVuZC4KKyAqIAorICogQHBhcmFtIHN0ciB0aGUgc3RyaW5nCisgKiBAcGFyYW0gc3RhcnQgZmlyc3QgYnl0ZSBpbmRleCB0byBjaGVjaworICogQHBhcmFtIGxlbiBudW1iZXIgb2YgYnl0ZXMgdG8gY2hlY2sKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSBieXRlIHJhbmdlIGV4aXN0cyBhbmQgaXMgYWxsIHZhbGlkIEFTQ0lJCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zdHJpbmdfdmFsaWRhdGVfYXNjaWkgKGNvbnN0IERCdXNTdHJpbmcgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGxlbikKK3sKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqczsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqZW5kOworICBEQlVTX0NPTlNUX1NUUklOR19QUkVBTUJMRSAoc3RyKTsKKyAgX2RidXNfYXNzZXJ0IChzdGFydCA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChzdGFydCA8PSByZWFsLT5sZW4pOworICBfZGJ1c19hc3NlcnQgKGxlbiA+PSAwKTsKKyAgCisgIGlmIChsZW4gPiByZWFsLT5sZW4gLSBzdGFydCkKKyAgICByZXR1cm4gRkFMU0U7CisgIAorICBzID0gcmVhbC0+c3RyICsgc3RhcnQ7CisgIGVuZCA9IHMgKyBsZW47CisgIHdoaWxlIChzICE9IGVuZCkKKyAgICB7CisgICAgICBpZiAoX0RCVVNfVU5MSUtFTFkgKCFfREJVU19JU0FTQ0lJICgqcykpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIAorICAgICAgKytzOworICAgIH0KKyAgCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIENvbnZlcnRzIHRoZSBnaXZlbiByYW5nZSBvZiB0aGUgc3RyaW5nIHRvIGxvd2VyIGNhc2UuCisgKgorICogQHBhcmFtIHN0ciB0aGUgc3RyaW5nCisgKiBAcGFyYW0gc3RhcnQgZmlyc3QgYnl0ZSBpbmRleCB0byBjb252ZXJ0CisgKiBAcGFyYW0gbGVuIG51bWJlciBvZiBieXRlcyB0byBjb252ZXJ0CisgKi8KK3ZvaWQKK19kYnVzX3N0cmluZ190b2xvd2VyX2FzY2lpIChjb25zdCBEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgbGVuKQoreworICB1bnNpZ25lZCBjaGFyICpzOworICB1bnNpZ25lZCBjaGFyICplbmQ7CisgIERCVVNfU1RSSU5HX1BSRUFNQkxFIChzdHIpOworICBfZGJ1c19hc3NlcnQgKHN0YXJ0ID49IDApOworICBfZGJ1c19hc3NlcnQgKHN0YXJ0IDw9IHJlYWwtPmxlbik7CisgIF9kYnVzX2Fzc2VydCAobGVuID49IDApOworICBfZGJ1c19hc3NlcnQgKGxlbiA8PSByZWFsLT5sZW4gLSBzdGFydCk7CisKKyAgcyA9IHJlYWwtPnN0ciArIHN0YXJ0OworICBlbmQgPSBzICsgbGVuOworCisgIHdoaWxlIChzICE9IGVuZCkKKyAgICB7CisgICAgICBpZiAoKnMgPj0gJ0EnICYmICpzIDw9ICdaJykKKyAgICAgICAgICAqcyArPSAnYScgLSAnQSc7CisgICAgICArK3M7CisgICAgfQorfQorCisvKioKKyAqIENvbnZlcnRzIHRoZSBnaXZlbiByYW5nZSBvZiB0aGUgc3RyaW5nIHRvIHVwcGVyIGNhc2UuCisgKgorICogQHBhcmFtIHN0ciB0aGUgc3RyaW5nCisgKiBAcGFyYW0gc3RhcnQgZmlyc3QgYnl0ZSBpbmRleCB0byBjb252ZXJ0CisgKiBAcGFyYW0gbGVuIG51bWJlciBvZiBieXRlcyB0byBjb252ZXJ0CisgKi8KK3ZvaWQKK19kYnVzX3N0cmluZ190b3VwcGVyX2FzY2lpIChjb25zdCBEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgbGVuKQoreworICB1bnNpZ25lZCBjaGFyICpzOworICB1bnNpZ25lZCBjaGFyICplbmQ7CisgIERCVVNfU1RSSU5HX1BSRUFNQkxFIChzdHIpOworICBfZGJ1c19hc3NlcnQgKHN0YXJ0ID49IDApOworICBfZGJ1c19hc3NlcnQgKHN0YXJ0IDw9IHJlYWwtPmxlbik7CisgIF9kYnVzX2Fzc2VydCAobGVuID49IDApOworICBfZGJ1c19hc3NlcnQgKGxlbiA8PSByZWFsLT5sZW4gLSBzdGFydCk7CisKKyAgcyA9IHJlYWwtPnN0ciArIHN0YXJ0OworICBlbmQgPSBzICsgbGVuOworCisgIHdoaWxlIChzICE9IGVuZCkKKyAgICB7CisgICAgICBpZiAoKnMgPj0gJ2EnICYmICpzIDw9ICd6JykKKyAgICAgICAgICAqcyArPSAnQScgLSAnYSc7CisgICAgICArK3M7CisgICAgfQorfQorCisvKioKKyAqIENoZWNrcyB0aGF0IHRoZSBnaXZlbiByYW5nZSBvZiB0aGUgc3RyaW5nIGlzIHZhbGlkIFVURi04LiBJZiB0aGUKKyAqIGdpdmVuIHJhbmdlIGlzIG5vdCBlbnRpcmVseSBjb250YWluZWQgaW4gdGhlIHN0cmluZywgcmV0dXJucworICogI0ZBTFNFLiBJZiB0aGUgc3RyaW5nIGNvbnRhaW5zIGFueSBudWwgYnl0ZXMgaW4gdGhlIGdpdmVuIHJhbmdlLAorICogcmV0dXJucyAjRkFMU0UuIElmIHRoZSBzdGFydCBhbmQgc3RhcnQrbGVuIGFyZSBub3Qgb24gY2hhcmFjdGVyCisgKiBib3VuZGFyaWVzLCByZXR1cm5zICNGQUxTRS4KKyAqCisgKiBAdG9kbyB0aGlzIGlzIGluY29uc2lzdGVudCB3aXRoIG1vc3Qgb2YgREJ1c1N0cmluZyBpbiB0aGF0CisgKiBpdCBhbGxvd3MgYSBzdGFydCxsZW4gcmFuZ2UgdGhhdCBleHRlbmRzIHBhc3QgdGhlIHN0cmluZyBlbmQuCisgKiAKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZworICogQHBhcmFtIHN0YXJ0IGZpcnN0IGJ5dGUgaW5kZXggdG8gY2hlY2sKKyAqIEBwYXJhbSBsZW4gbnVtYmVyIG9mIGJ5dGVzIHRvIGNoZWNrCisgKiBAcmV0dXJucyAjVFJVRSBpZiB0aGUgYnl0ZSByYW5nZSBleGlzdHMgYW5kIGlzIGFsbCB2YWxpZCBVVEYtOAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RyaW5nX3ZhbGlkYXRlX3V0ZjggIChjb25zdCBEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBsZW4pCit7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnA7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmVuZDsKKyAgREJVU19DT05TVF9TVFJJTkdfUFJFQU1CTEUgKHN0cik7CisgIF9kYnVzX2Fzc2VydCAoc3RhcnQgPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAoc3RhcnQgPD0gcmVhbC0+bGVuKTsKKyAgX2RidXNfYXNzZXJ0IChsZW4gPj0gMCk7CisKKyAgLyogd2UgYXJlIGRvaW5nIF9EQlVTX1VOTElLRUxZKCkgaGVyZSB3aGljaCBtaWdodCBiZQorICAgKiBkdWJpb3VzIGluIGEgZ2VuZXJpYyBsaWJyYXJ5IGxpa2UgR0xpYiwgYnV0IGluIEQtQnVzCisgICAqIHdlIGtub3cgd2UncmUgdmFsaWRhdGluZyBtZXNzYWdlcyBhbmQgdGhhdCBpdCB3b3VsZAorICAgKiBvbmx5IGJlIGV2aWwvYnJva2VuIGFwcHMgdGhhdCB3b3VsZCBoYXZlIGludmFsaWQKKyAgICogVVRGLTguIEFsc28sIHRoaXMgZnVuY3Rpb24gc2VlbXMgdG8gYmUgYSBwZXJmb3JtYW5jZQorICAgKiBib3R0bGVuZWNrIGluIHByb2ZpbGVzLgorICAgKi8KKyAgCisgIGlmIChfREJVU19VTkxJS0VMWSAobGVuID4gcmVhbC0+bGVuIC0gc3RhcnQpKQorICAgIHJldHVybiBGQUxTRTsKKyAgCisgIHAgPSByZWFsLT5zdHIgKyBzdGFydDsKKyAgZW5kID0gcCArIGxlbjsKKyAgCisgIHdoaWxlIChwIDwgZW5kKQorICAgIHsKKyAgICAgIGludCBpLCBtYXNrLCBjaGFyX2xlbjsKKyAgICAgIGRidXNfdW5pY2hhcl90IHJlc3VsdDsKKworICAgICAgLyogbnVsIGJ5dGVzIGNvbnNpZGVyZWQgaW52YWxpZCAqLworICAgICAgaWYgKCpwID09ICdcMCcpCisgICAgICAgIGJyZWFrOworICAgICAgCisgICAgICAvKiBTcGVjaWFsLWNhc2UgQVNDSUk7IHRoaXMgbWFrZXMgdXMgZ28gYSBsb3QgZmFzdGVyIGluCisgICAgICAgKiBELUJ1cyBwcm9maWxlcyB3aGVyZSB3ZSBhcmUgdHlwaWNhbGx5IHZhbGlkYXRpbmcKKyAgICAgICAqIGZ1bmN0aW9uIG5hbWVzIGFuZCBzdWNoLiBXZSBoYXZlIHRvIGtub3cgdGhhdAorICAgICAgICogYWxsIGZvbGxvd2luZyBjaGVja3Mgd2lsbCBwYXNzIGZvciBBU0NJSSB0aG91Z2gsCisgICAgICAgKiBjb21tZW50cyBmb2xsb3cgLi4uCisgICAgICAgKi8gICAgICAKKyAgICAgIGlmICgqcCA8IDEyOCkKKyAgICAgICAgeworICAgICAgICAgICsrcDsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgCisgICAgICBVVEY4X0NPTVBVVEUgKCpwLCBtYXNrLCBjaGFyX2xlbik7CisKKyAgICAgIGlmIChfREJVU19VTkxJS0VMWSAoY2hhcl9sZW4gPT0gMCkpICAvKiBBU0NJSTogY2hhcl9sZW4gPT0gMSAqLworICAgICAgICBicmVhazsKKworICAgICAgLyogY2hlY2sgdGhhdCB0aGUgZXhwZWN0ZWQgbnVtYmVyIG9mIGJ5dGVzIGV4aXN0cyBpbiB0aGUgcmVtYWluaW5nIGxlbmd0aCAqLworICAgICAgaWYgKF9EQlVTX1VOTElLRUxZICgoZW5kIC0gcCkgPCBjaGFyX2xlbikpIC8qIEFTQ0lJOiBwIDwgZW5kIGFuZCBjaGFyX2xlbiA9PSAxICovCisgICAgICAgIGJyZWFrOworICAgICAgICAKKyAgICAgIFVURjhfR0VUIChyZXN1bHQsIHAsIGksIG1hc2ssIGNoYXJfbGVuKTsKKworICAgICAgLyogQ2hlY2sgZm9yIG92ZXJsb25nIFVURi04ICovCisgICAgICBpZiAoX0RCVVNfVU5MSUtFTFkgKFVURjhfTEVOR1RIIChyZXN1bHQpICE9IGNoYXJfbGVuKSkgLyogQVNDSUk6IFVURjhfTEVOR1RIID09IDEgKi8KKyAgICAgICAgYnJlYWs7CisjaWYgMAorICAgICAgLyogVGhlIFVOSUNPREVfVkFMSUQgY2hlY2sgYmVsb3cgd2lsbCBjYXRjaCB0aGlzICovCisgICAgICBpZiAoX0RCVVNfVU5MSUtFTFkgKHJlc3VsdCA9PSAoZGJ1c191bmljaGFyX3QpLTEpKSAvKiBBU0NJSTogcmVzdWx0ID0gYXNjaWkgdmFsdWUgKi8KKyAgICAgICAgYnJlYWs7CisjZW5kaWYKKworICAgICAgaWYgKF9EQlVTX1VOTElLRUxZICghVU5JQ09ERV9WQUxJRCAocmVzdWx0KSkpIC8qIEFTQ0lJOiBhbHdheXMgdmFsaWQgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIC8qIFVOSUNPREVfVkFMSUQgc2hvdWxkIGhhdmUgY2F1Z2h0IGl0ICovCisgICAgICBfZGJ1c19hc3NlcnQgKHJlc3VsdCAhPSAoZGJ1c191bmljaGFyX3QpLTEpOworICAgICAgCisgICAgICBwICs9IGNoYXJfbGVuOworICAgIH0KKworICAvKiBTZWUgdGhhdCB3ZSBjb3ZlcmVkIHRoZSBlbnRpcmUgbGVuZ3RoIGlmIGEgbGVuZ3RoIHdhcworICAgKiBwYXNzZWQgaW4KKyAgICovCisgIGlmIChfREJVU19VTkxJS0VMWSAocCAhPSBlbmQpKQorICAgIHJldHVybiBGQUxTRTsKKyAgZWxzZQorICAgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIENoZWNrcyB0aGF0IHRoZSBnaXZlbiByYW5nZSBvZiB0aGUgc3RyaW5nIGlzIGFsbCBudWwgYnl0ZXMuIElmIHRoZQorICogZ2l2ZW4gcmFuZ2UgaXMgbm90IGVudGlyZWx5IGNvbnRhaW5lZCBpbiB0aGUgc3RyaW5nLCByZXR1cm5zCisgKiAjRkFMU0UuCisgKgorICogQHRvZG8gdGhpcyBpcyBpbmNvbnNpc3RlbnQgd2l0aCBtb3N0IG9mIERCdXNTdHJpbmcgaW4gdGhhdAorICogaXQgYWxsb3dzIGEgc3RhcnQsbGVuIHJhbmdlIHRoYXQgZXh0ZW5kcyBwYXN0IHRoZSBzdHJpbmcgZW5kLgorICogCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcKKyAqIEBwYXJhbSBzdGFydCBmaXJzdCBieXRlIGluZGV4IHRvIGNoZWNrCisgKiBAcGFyYW0gbGVuIG51bWJlciBvZiBieXRlcyB0byBjaGVjaworICogQHJldHVybnMgI1RSVUUgaWYgdGhlIGJ5dGUgcmFuZ2UgZXhpc3RzIGFuZCBpcyBhbGwgbnVsIGJ5dGVzCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zdHJpbmdfdmFsaWRhdGVfbnVsIChjb25zdCBEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGxlbikKK3sKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqczsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqZW5kOworICBEQlVTX0NPTlNUX1NUUklOR19QUkVBTUJMRSAoc3RyKTsKKyAgX2RidXNfYXNzZXJ0IChzdGFydCA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChsZW4gPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAoc3RhcnQgPD0gcmVhbC0+bGVuKTsKKyAgCisgIGlmIChsZW4gPiByZWFsLT5sZW4gLSBzdGFydCkKKyAgICByZXR1cm4gRkFMU0U7CisgIAorICBzID0gcmVhbC0+c3RyICsgc3RhcnQ7CisgIGVuZCA9IHMgKyBsZW47CisgIHdoaWxlIChzICE9IGVuZCkKKyAgICB7CisgICAgICBpZiAoX0RCVVNfVU5MSUtFTFkgKCpzICE9ICdcMCcpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICArK3M7CisgICAgfQorICAKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogQ2xlYXJzIGFsbCBhbGxvY2F0ZWQgYnl0ZXMgaW4gdGhlIHN0cmluZyB0byB6ZXJvLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZworICovCit2b2lkCitfZGJ1c19zdHJpbmdfemVybyAoREJ1c1N0cmluZyAqc3RyKQoreworICBEQlVTX1NUUklOR19QUkVBTUJMRSAoc3RyKTsKKworICBtZW1zZXQgKHJlYWwtPnN0ciAtIHJlYWwtPmFsaWduX29mZnNldCwgJ1wwJywgcmVhbC0+YWxsb2NhdGVkKTsKK30KKy8qKiBAfSAqLworCisvKiB0ZXN0cyBhcmUgaW4gZGJ1cy1zdHJpbmctdXRpbC5jICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtc3RyaW5nLmggYi9kYnVzL2RidXMtc3RyaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWMwMTc3MAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1zdHJpbmcuaApAQCAtMCwwICsxLDQxMiBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXN0cmluZy5oIFN0cmluZyB1dGlsaXR5IGNsYXNzIChpbnRlcm5hbCB0byBELUJ1cyBpbXBsZW1lbnRhdGlvbikKKyAqIAorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzIFJlZCBIYXQsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwNiBSYWxmIEhhYmFja2VyIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpZm5kZWYgREJVU19TVFJJTkdfSAorI2RlZmluZSBEQlVTX1NUUklOR19ICisKKyNpbmNsdWRlIDxkYnVzL2RidXMtbWFjcm9zLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXR5cGVzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLW1lbW9yeS5oPgorCisjaW5jbHVkZSA8c3RkYXJnLmg+CisKK0RCVVNfQkVHSU5fREVDTFMKKworLyoqCisgKiBEQnVzU3RyaW5nIG9iamVjdAorICovCisKK3R5cGVkZWYgc3RydWN0IERCdXNTdHJpbmcgREJ1c1N0cmluZzsKKworc3RydWN0IERCdXNTdHJpbmcKK3sKKyNpZiBkZWZpbmVkKERCVVNfV0lOKSAmJiBkZWZpbmVkKF9ERUJVRykKKyAgY29uc3QgY2hhciAqZHVtbXkxOyAvKio8IHBsYWNlaG9sZGVyICovCisjZWxzZQorICBjb25zdCB2b2lkICpkdW1teTE7IC8qKjwgcGxhY2Vob2xkZXIgKi8KKyNlbmRpZgorICBpbnQgICBkdW1teTI7ICAgICAgIC8qKjwgcGxhY2Vob2xkZXIgKi8KKyAgaW50ICAgZHVtbXkzOyAgICAgICAvKio8IHBsYWNlaG9sZGVyICovCisgIHVuc2lnbmVkIGludCBkdW1teV9iaXQxIDogMTsgLyoqPCBwbGFjZWhvbGRlciAqLworICB1bnNpZ25lZCBpbnQgZHVtbXlfYml0MiA6IDE7IC8qKjwgcGxhY2Vob2xkZXIgKi8KKyAgdW5zaWduZWQgaW50IGR1bW15X2JpdDMgOiAxOyAvKio8IHBsYWNlaG9sZGVyICovCisgIHVuc2lnbmVkIGludCBkdW1teV9iaXRzIDogMzsgLyoqPCBwbGFjZWhvbGRlciAqLworfTsKKworI2lmZGVmIERCVVNfRElTQUJMRV9BU1NFUlQKKy8qIFNvbWUgc2ltcGxlIGlubGluaW5nIGhhY2tzOyB0aGUgY3VycmVudCBsaW5rZXIgaXMgbm90IHNtYXJ0IGVub3VnaAorICogdG8gaW5saW5lIG5vbi1leHBvcnRlZCBzeW1ib2xzIGFjcm9zcyBmaWxlcyBpbiB0aGUgbGlicmFyeS4KKyAqIE5vdGUgdGhhdCB0aGVzZSBicmVhayB0eXBlIHNhZmV0eSAoZHVlIHRvIHRoZSBjYXN0cykKKyAqLworI2RlZmluZSBfZGJ1c19zdHJpbmdfZ2V0X2RhdGEocykgKChjaGFyKikoKChEQnVzU3RyaW5nKikocykpLT5kdW1teTEpKQorI2RlZmluZSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aChzKSAoKChEQnVzU3RyaW5nKikocykpLT5kdW1teTIpCisjZGVmaW5lIF9kYnVzX3N0cmluZ19zZXRfYnl0ZShzLCBpLCBiKSAoKCgodW5zaWduZWQgY2hhciopKCgoREJ1c1N0cmluZyopKHMpKS0+ZHVtbXkxKSlbKGkpXSkgPSAodW5zaWduZWQgY2hhcikgKGIpKQorI2RlZmluZSBfZGJ1c19zdHJpbmdfZ2V0X2J5dGUocywgaSkgKCgoY29uc3QgdW5zaWduZWQgY2hhciopKCgoREJ1c1N0cmluZyopKHMpKS0+ZHVtbXkxKSlbKGkpXSkKKyNkZWZpbmUgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhKHMpICgoY29uc3QgY2hhciopKCgoREJ1c1N0cmluZyopKHMpKS0+ZHVtbXkxKSkKKyNkZWZpbmUgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhX2xlbihzLHN0YXJ0LGxlbikgKCgoY29uc3QgY2hhciopKCgoREJ1c1N0cmluZyopKHMpKS0+ZHVtbXkxKSkgKyAoc3RhcnQpKQorI2VuZGlmCisKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90ICAgX2RidXNfc3RyaW5nX2luaXQgICAgICAgICAgICAgICAgICAoREJ1c1N0cmluZyAgICAgICAgKnN0cik7CitEQlVTX1BSSVZBVEVfRVhQT1JUCit2b2lkICAgICAgICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICAgICAgICAgICAgKERCdXNTdHJpbmcgICAgICAgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICp2YWx1ZSk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCit2b2lkICAgICAgICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0X2xlbiAgICAgICAgKERCdXNTdHJpbmcgICAgICAgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGxlbik7CitkYnVzX2Jvb2xfdCAgIF9kYnVzX3N0cmluZ19pbml0X3ByZWFsbG9jYXRlZCAgICAgKERCdXNTdHJpbmcgICAgICAgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBhbGxvY2F0ZV9zaXplKTsKKworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgX2RidXNfc3RyaW5nX2luaXRfZnJvbV9zdHJpbmcgICAgICAgIChEQnVzU3RyaW5nICAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICAqZnJvbSk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCit2b2lkICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICAgICAgICAgICAgICAgICAgKERCdXNTdHJpbmcgICAgICAgICpzdHIpOwordm9pZCAgICAgICAgICBfZGJ1c19zdHJpbmdfbG9jayAgICAgICAgICAgICAgICAgIChEQnVzU3RyaW5nICAgICAgICAqc3RyKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90ICAgX2RidXNfc3RyaW5nX2NvbXBhY3QgICAgICAgICAgICAgICAoREJ1c1N0cmluZyAgICAgICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIG1heF93YXN0ZSk7CisjaWZuZGVmIF9kYnVzX3N0cmluZ19nZXRfZGF0YQorREJVU19QUklWQVRFX0VYUE9SVAorY2hhciogICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2RhdGEgICAgICAgICAgICAgIChEQnVzU3RyaW5nICAgICAgICAqc3RyKTsKKyNlbmRpZiAvKiBfZGJ1c19zdHJpbmdfZ2V0X2RhdGEgKi8KKyNpZm5kZWYgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhCitEQlVTX1BSSVZBVEVfRVhQT1JUCitjb25zdCBjaGFyKiAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAgICAgICAgKGNvbnN0IERCdXNTdHJpbmcgICpzdHIpOworI2VuZGlmIC8qIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAqLworY2hhciogICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2RhdGFfbGVuICAgICAgICAgIChEQnVzU3RyaW5nICAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBsZW4pOworI2lmbmRlZiBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuCitEQlVTX1BSSVZBVEVfRVhQT1JUCitjb25zdCBjaGFyKiAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YV9sZW4gICAgKGNvbnN0IERCdXNTdHJpbmcgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGxlbik7CisjZW5kaWYKKyNpZm5kZWYgX2RidXNfc3RyaW5nX3NldF9ieXRlCitEQlVTX1BSSVZBVEVfRVhQT1JUCit2b2lkICAgICAgICAgIF9kYnVzX3N0cmluZ19zZXRfYnl0ZSAgICAgICAgICAgICAgKERCdXNTdHJpbmcgICAgICAgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICAgICAgYnl0ZSk7CisjZW5kaWYKKyNpZm5kZWYgX2RidXNfc3RyaW5nX2dldF9ieXRlCitEQlVTX1BSSVZBVEVfRVhQT1JUCit1bnNpZ25lZCBjaGFyIF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAgICAgICAgICAgICAgKGNvbnN0IERCdXNTdHJpbmcgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBzdGFydCk7CisjZW5kaWYgLyogX2RidXNfc3RyaW5nX2dldF9ieXRlICovCitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCAgIF9kYnVzX3N0cmluZ19pbnNlcnRfYnl0ZXMgICAgICAgICAgKERCdXNTdHJpbmcgICAgICAgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBpLAorCQkJCQkJICBpbnQgICAgICAgICAgICAgICAgbl9ieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAgICAgIGJ5dGUpOworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgICBfZGJ1c19zdHJpbmdfaW5zZXJ0X2J5dGUgICAgICAgICAgIChEQnVzU3RyaW5nICAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAgICAgIGJ5dGUpOworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgICBfZGJ1c19zdHJpbmdfc3RlYWxfZGF0YSAgICAgICAgICAgIChEQnVzU3RyaW5nICAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICAgICAgICoqZGF0YV9yZXR1cm4pOworZGJ1c19ib29sX3QgICBfZGJ1c19zdHJpbmdfc3RlYWxfZGF0YV9sZW4gICAgICAgIChEQnVzU3RyaW5nICAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICAgICAgICoqZGF0YV9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGxlbik7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCAgIF9kYnVzX3N0cmluZ19jb3B5X2RhdGEgICAgICAgICAgICAgKGNvbnN0IERCdXNTdHJpbmcgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICAgICAgKipkYXRhX3JldHVybik7CitkYnVzX2Jvb2xfdCAgIF9kYnVzX3N0cmluZ19jb3B5X2RhdGFfbGVuICAgICAgICAgKGNvbnN0IERCdXNTdHJpbmcgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICAgICAgKipkYXRhX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgbGVuKTsKK3ZvaWQgICAgICAgICAgX2RidXNfc3RyaW5nX2NvcHlfdG9fYnVmZmVyICAgICAgICAoY29uc3QgREJ1c1N0cmluZyAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAgICAgICAgKmJ1ZmZlciwKKwkJCQkJCSAgaW50ICAgICAgICAgICAgICAgIGxlbik7CitEQlVTX1BSSVZBVEVfRVhQT1JUCit2b2lkICAgICAgICAgIF9kYnVzX3N0cmluZ19jb3B5X3RvX2J1ZmZlcl93aXRoX251bCAoY29uc3QgREJ1c1N0cmluZyAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICAgICAgICAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBhdmFpbF9sZW4pOworI2lmbmRlZiBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aAorREJVU19QUklWQVRFX0VYUE9SVAoraW50ICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAgICAgICAgICAgIChjb25zdCBEQnVzU3RyaW5nICAqc3RyKTsKKyNlbmRpZiAvKiAhX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKi8KKworLyoqCisgKiBHZXQgdGhlIHN0cmluZydzIGxlbmd0aCBhcyBhbiB1bnNpZ25lZCBpbnRlZ2VyLCBmb3IgY29tcGFyaXNvbiB3aXRoCisgKiBzaXplX3QgYW5kIHNpbWlsYXIgdW5zaWduZWQgdHlwZXMgdGhhdCBkb2VzIG5vdCB0cmlnZ2VyIGNvbXBpbGVyCisgKiB3YXJuaW5ncyBhYm91dCBwb3RlbnRpYWwgdmFsdWUgY2hhbmdlcyBkdXJpbmcgY29udmVyc2lvbi4KKyAqCisgKiBEQnVzU3RyaW5nIGxlbmd0aHMgYXJlIHNpZ25lZCBmb3IgaGlzdG9yaWNhbCByZWFzb25zLCBidXQgd2Uga25vdyB0aGF0CisgKiB0aGUgbGVuZ3RoIGlzIGFsd2F5cyA+PSAwIChhbmQgREJVU19HRU5FUklDX1NUUklOR19QUkVBTUJMRSBhc3NlcnRzCisgKiB0aGF0IHRoaXMgaXMgdGhlIGNhc2UpIHNvIHdlIGtub3cgdGhhdCB0aGlzIGNhc3QgZG9lcyBub3QgY2hhbmdlIHRoZQorICogdmFsdWUuCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50CitfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aF91aW50IChjb25zdCBEQnVzU3RyaW5nICpzdHIpCit7CisgIHJldHVybiAodW5zaWduZWQgaW50KSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoc3RyKTsKK30KKworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgICBfZGJ1c19zdHJpbmdfbGVuZ3RoZW4gICAgICAgICAgICAgIChEQnVzU3RyaW5nICAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgYWRkaXRpb25hbF9sZW5ndGgpOworREJVU19QUklWQVRFX0VYUE9SVAordm9pZCAgICAgICAgICBfZGJ1c19zdHJpbmdfc2hvcnRlbiAgICAgICAgICAgICAgIChEQnVzU3RyaW5nICAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgbGVuZ3RoX3RvX3JlbW92ZSk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCAgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoICAgICAgICAgICAgKERCdXNTdHJpbmcgICAgICAgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBsZW5ndGgpOworZGJ1c19ib29sX3QgICBfZGJ1c19zdHJpbmdfYWxpZ25fbGVuZ3RoICAgICAgICAgIChEQnVzU3RyaW5nICAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgYWxpZ25tZW50KTsKK2RidXNfYm9vbF90ICAgX2RidXNfc3RyaW5nX2FsbG9jX3NwYWNlICAgICAgICAgICAoREJ1c1N0cmluZyAgICAgICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGV4dHJhX2J5dGVzKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90ICAgX2RidXNfc3RyaW5nX2FwcGVuZCAgICAgICAgICAgICAgICAoREJ1c1N0cmluZyAgICAgICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgKmJ1ZmZlcik7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCAgIF9kYnVzX3N0cmluZ19hcHBlbmRfbGVuICAgICAgICAgICAgKERCdXNTdHJpbmcgICAgICAgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBsZW4pOworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgICBfZGJ1c19zdHJpbmdfYXBwZW5kX2ludCAgICAgICAgICAgIChEQnVzU3RyaW5nICAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nICAgICAgICAgICAgICAgdmFsdWUpOworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgICBfZGJ1c19zdHJpbmdfYXBwZW5kX3VpbnQgICAgICAgICAgIChEQnVzU3RyaW5nICAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgICAgdmFsdWUpOworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgICBfZGJ1c19zdHJpbmdfYXBwZW5kX2J5dGUgICAgICAgICAgIChEQnVzU3RyaW5nICAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICAgICAgYnl0ZSk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCAgIF9kYnVzX3N0cmluZ19hcHBlbmRfcHJpbnRmICAgICAgICAgKERCdXNTdHJpbmcgICAgICAgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICpmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLikgX0RCVVNfR05VQ19QUklOVEYgKDIsIDMpOworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgICBfZGJ1c19zdHJpbmdfYXBwZW5kX3ByaW50Zl92YWxpc3QgIChEQnVzU3RyaW5nICAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAqZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YV9saXN0ICAgICAgICAgICAgYXJncykgX0RCVVNfR05VQ19QUklOVEYgKDIsIDApOworZGJ1c19ib29sX3QgICBfZGJ1c19zdHJpbmdfaW5zZXJ0XzJfYWxpZ25lZCAgICAgIChEQnVzU3RyaW5nICAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgaW5zZXJ0X2F0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyIG9jdGV0c1syXSk7CitkYnVzX2Jvb2xfdCAgIF9kYnVzX3N0cmluZ19pbnNlcnRfNF9hbGlnbmVkICAgICAgKERCdXNTdHJpbmcgICAgICAgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBpbnNlcnRfYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgb2N0ZXRzWzRdKTsKK2RidXNfYm9vbF90ICAgX2RidXNfc3RyaW5nX2luc2VydF84X2FsaWduZWQgICAgICAoREJ1c1N0cmluZyAgICAgICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGluc2VydF9hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciBvY3RldHNbOF0pOworZGJ1c19ib29sX3QgICBfZGJ1c19zdHJpbmdfaW5zZXJ0X2FsaWdubWVudCAgICAgIChEQnVzU3RyaW5nICAgICAgICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAqaW5zZXJ0X2F0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgYWxpZ25tZW50KTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK3ZvaWQgICAgICAgICAgX2RidXNfc3RyaW5nX2RlbGV0ZSAgICAgICAgICAgICAgICAoREJ1c1N0cmluZyAgICAgICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgbGVuKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90ICAgX2RidXNfc3RyaW5nX21vdmUgICAgICAgICAgICAgICAgICAoREJ1c1N0cmluZyAgICAgICAgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICAqZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGluc2VydF9hdCk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCAgIF9kYnVzX3N0cmluZ19jb3B5ICAgICAgICAgICAgICAgICAgKGNvbnN0IERCdXNTdHJpbmcgICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAgKmRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBpbnNlcnRfYXQpOworZGJ1c19ib29sX3QgICBfZGJ1c19zdHJpbmdfbW92ZV9sZW4gICAgICAgICAgICAgIChEQnVzU3RyaW5nICAgICAgICAqc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgICpkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgaW5zZXJ0X2F0KTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90ICAgX2RidXNfc3RyaW5nX2NvcHlfbGVuICAgICAgICAgICAgICAoY29uc3QgREJ1c1N0cmluZyAgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICAqZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGluc2VydF9hdCk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCAgIF9kYnVzX3N0cmluZ19yZXBsYWNlX2xlbiAgICAgICAgICAgKGNvbnN0IERCdXNTdHJpbmcgICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAgKmRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICByZXBsYWNlX2F0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgcmVwbGFjZV9sZW4pOworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgICBfZGJ1c19zdHJpbmdfc3BsaXRfb25fYnl0ZSAgICAgICAgIChEQnVzU3RyaW5nICAgICAgICAqc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICAgICAgYnl0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAgKnRhaWwpOworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgICBfZGJ1c19zdHJpbmdfcGFyc2VfaW50ICAgICAgICAgICAgIChjb25zdCBEQnVzU3RyaW5nICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgICAgICAgICAgICAgICp2YWx1ZV9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICplbmRfcmV0dXJuKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90ICAgX2RidXNfc3RyaW5nX3BhcnNlX3VpbnQgICAgICAgICAgICAoY29uc3QgREJ1c1N0cmluZyAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgICAqdmFsdWVfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAqZW5kX3JldHVybik7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCAgIF9kYnVzX3N0cmluZ19maW5kICAgICAgICAgICAgICAgICAgKGNvbnN0IERCdXNTdHJpbmcgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgKnN1YnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgKmZvdW5kKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90ICAgX2RidXNfc3RyaW5nX2ZpbmRfZW9sICAgICAgICAgICAgICAgKGNvbnN0IERCdXNTdHJpbmcgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICpmb3VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgKmZvdW5kX2xlbik7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCAgIF9kYnVzX3N0cmluZ19maW5kX3RvICAgICAgICAgICAgICAgKGNvbnN0IERCdXNTdHJpbmcgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgKnN1YnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgKmZvdW5kKTsKK2RidXNfYm9vbF90ICAgX2RidXNfc3RyaW5nX2ZpbmRfYnl0ZV9iYWNrd2FyZCAgICAoY29uc3QgREJ1c1N0cmluZyAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICAgICAgYnl0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgKmZvdW5kKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90ICAgX2RidXNfc3RyaW5nX2ZpbmRfYmxhbmsgICAgICAgICAgICAoY29uc3QgREJ1c1N0cmluZyAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAqZm91bmQpOworREJVU19QUklWQVRFX0VYUE9SVAordm9pZCAgICAgICAgICBfZGJ1c19zdHJpbmdfc2tpcF9ibGFuayAgICAgICAgICAgIChjb25zdCBEQnVzU3RyaW5nICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICplbmQpOworREJVU19QUklWQVRFX0VYUE9SVAordm9pZCAgICAgICAgICBfZGJ1c19zdHJpbmdfc2tpcF93aGl0ZSAgICAgICAgICAgIChjb25zdCBEQnVzU3RyaW5nICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICplbmQpOwordm9pZCAgICAgICAgICBfZGJ1c19zdHJpbmdfc2tpcF93aGl0ZV9yZXZlcnNlICAgIChjb25zdCBEQnVzU3RyaW5nICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAqc3RhcnQpOworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgICBfZGJ1c19zdHJpbmdfZXF1YWwgICAgICAgICAgICAgICAgIChjb25zdCBEQnVzU3RyaW5nICAqYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAgKmIpOworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgICBfZGJ1c19zdHJpbmdfZXF1YWxfY19zdHIgICAgICAgICAgIChjb25zdCBEQnVzU3RyaW5nICAqYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgKmNfc3RyKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90ICAgX2RidXNfc3RyaW5nX2VxdWFsX2xlbiAgICAgICAgICAgICAoY29uc3QgREJ1c1N0cmluZyAgKmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICpiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgbGVuKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90ICAgX2RidXNfc3RyaW5nX2VxdWFsX3N1YnN0cmluZyAgICAgICAoY29uc3QgREJ1c1N0cmluZyAgKmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBhX3N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgYV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICpiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgYl9zdGFydCk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCAgIF9kYnVzX3N0cmluZ19zdGFydHNfd2l0aF9jX3N0ciAgICAgKGNvbnN0IERCdXNTdHJpbmcgICphLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAqY19zdHIpOworZGJ1c19ib29sX3QgICBfZGJ1c19zdHJpbmdfZW5kc193aXRoX2Nfc3RyICAgICAgIChjb25zdCBEQnVzU3RyaW5nICAqYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgKmNfc3RyKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90ICAgX2RidXNfc3RyaW5nX3BvcF9saW5lICAgICAgICAgICAgICAoREJ1c1N0cmluZyAgICAgICAgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAgKmRlc3QpOworREJVU19QUklWQVRFX0VYUE9SVAordm9pZCAgICAgICAgICBfZGJ1c19zdHJpbmdfZGVsZXRlX2ZpcnN0X3dvcmQgICAgIChEQnVzU3RyaW5nICAgICAgICAqc3RyKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK3ZvaWQgICAgICAgICAgX2RidXNfc3RyaW5nX2RlbGV0ZV9sZWFkaW5nX2JsYW5rcyAoREJ1c1N0cmluZyAgICAgICAgKnN0cik7CitEQlVTX1BSSVZBVEVfRVhQT1JUCit2b2lkICAgICAgICAgIF9kYnVzX3N0cmluZ19jaG9wX3doaXRlICAgICAgICAgICAgKERCdXNTdHJpbmcgICAgICAgICpzdHIpOyAKK2RidXNfYm9vbF90ICAgX2RidXNfc3RyaW5nX2FwcGVuZF9ieXRlX2FzX2hleCAgICAoREJ1c1N0cmluZyAgICAgICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAgICAgIGJ5dGUpOworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgICBfZGJ1c19zdHJpbmdfaGV4X2VuY29kZSAgICAgICAgICAgIChjb25zdCBEQnVzU3RyaW5nICAqc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgICpkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgaW5zZXJ0X2F0KTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90ICAgX2RidXNfc3RyaW5nX2hleF9kZWNvZGUgICAgICAgICAgICAoY29uc3QgREJ1c1N0cmluZyAgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIHN0YXJ0LAorCQkJCQkJICBpbnQgICAgICAgICAgICAgICAqZW5kX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAgKmRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBpbnNlcnRfYXQpOworREJVU19QUklWQVRFX0VYUE9SVAordm9pZCAgICAgICAgICBfZGJ1c19zdHJpbmdfdG9sb3dlcl9hc2NpaSAgICAgICAgIChjb25zdCBEQnVzU3RyaW5nICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBsZW4pOworREJVU19QUklWQVRFX0VYUE9SVAordm9pZCAgICAgICAgICBfZGJ1c19zdHJpbmdfdG91cHBlcl9hc2NpaSAgICAgICAgIChjb25zdCBEQnVzU3RyaW5nICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBsZW4pOworZGJ1c19ib29sX3QgICBfZGJ1c19zdHJpbmdfdmFsaWRhdGVfYXNjaWkgICAgICAgIChjb25zdCBEQnVzU3RyaW5nICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBsZW4pOworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgICBfZGJ1c19zdHJpbmdfdmFsaWRhdGVfdXRmOCAgICAgICAgIChjb25zdCBEQnVzU3RyaW5nICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBsZW4pOworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgICBfZGJ1c19zdHJpbmdfdmFsaWRhdGVfbnVsICAgICAgICAgIChjb25zdCBEQnVzU3RyaW5nICAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBsZW4pOwordm9pZCAgICAgICAgICBfZGJ1c19zdHJpbmdfemVybyAgICAgICAgICAgICAgICAgIChEQnVzU3RyaW5nICAgICAgICAqc3RyKTsKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyICoKK19kYnVzX3N0cmluZ19nZXRfdWRhdGEgKERCdXNTdHJpbmcgKnN0cikKK3sKKyAgcmV0dXJuICh1bnNpZ25lZCBjaGFyICopIF9kYnVzX3N0cmluZ19nZXRfZGF0YSAoc3RyKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyICoKK19kYnVzX3N0cmluZ19nZXRfdWRhdGFfbGVuIChEQnVzU3RyaW5nICpzdHIsIGludCBzdGFydCwgaW50IGxlbikKK3sKKyAgcmV0dXJuICh1bnNpZ25lZCBjaGFyICopIF9kYnVzX3N0cmluZ19nZXRfZGF0YV9sZW4gKHN0ciwgc3RhcnQsIGxlbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgdW5zaWduZWQgY2hhciAqCitfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X3VkYXRhIChjb25zdCBEQnVzU3RyaW5nICpzdHIpCit7CisgIHJldHVybiAoY29uc3QgdW5zaWduZWQgY2hhciAqKSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKHN0cik7Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgdW5zaWduZWQgY2hhciAqCitfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X3VkYXRhX2xlbiAoY29uc3QgREJ1c1N0cmluZyAqc3RyLCBpbnQgc3RhcnQsIGludCBsZW4pCit7CisgIHJldHVybiAoY29uc3QgdW5zaWduZWQgY2hhciAqKSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuIChzdHIsIHN0YXJ0LCBsZW4pOworfQorCisvKioKKyAqIFdlIGFsbG9jYXRlIDEgYnl0ZSBmb3IgbnVsIHRlcm1pbmF0aW9uLCBwbHVzIDcgYnl0ZXMgZm9yIHBvc3NpYmxlCisgKiBhbGlnbl9vZmZzZXQsIHNvIHdlIGFsd2F5cyBuZWVkIDggYnl0ZXMgb24gdG9wIG9mIHRoZSBzdHJpbmcncworICogbGVuZ3RoIHRvIGJlIGluIHRoZSBhbGxvY2F0ZWQgYmxvY2suCisgKi8KKyNkZWZpbmUgX0RCVVNfU1RSSU5HX0FMTE9DQVRJT05fUEFERElORyA4CisKKy8qKgorICogRGVmaW5lcyBhIHN0YXRpYyBjb25zdCB2YXJpYWJsZSB3aXRoIHR5cGUgI0RCdXNTdHJpbmcgY2FsbGVkICJuYW1lIgorICogY29udGFpbmluZyB0aGUgZ2l2ZW4gc3RyaW5nIGxpdGVyYWwuCisgKgorICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcgdmFsdWUKKyAqLworI2RlZmluZSBfREJVU19TVFJJTkdfREVGSU5FX1NUQVRJQyhuYW1lLCBzdHIpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzdGF0aWMgY29uc3QgY2hhciBfZGJ1c19zdGF0aWNfc3RyaW5nXyMjbmFtZVtdID0gc3RyOyAgICAgICAgICAgICAgICAgXAorICBzdGF0aWMgY29uc3QgREJ1c1N0cmluZyBuYW1lID0geyBfZGJ1c19zdGF0aWNfc3RyaW5nXyMjbmFtZSwgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoX2RidXNfc3RhdGljX3N0cmluZ18jI25hbWUpLCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoX2RidXNfc3RhdGljX3N0cmluZ18jI25hbWUpICsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfREJVU19TVFJJTkdfQUxMT0NBVElPTl9QQURESU5HLCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFLCBUUlVFLCBGQUxTRSwgMCB9CisKK0RCVVNfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBEQlVTX1NUUklOR19IICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtc3ludGF4LmMgYi9kYnVzL2RidXMtc3ludGF4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VmNjU5YwotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1zeW50YXguYwpAQCAtMCwwICsxLDMwOSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXN5bnRheC5jIC0gdXRpbGl0eSBmdW5jdGlvbnMgZm9yIHN0cmluZ3Mgd2l0aCBzcGVjaWFsIHN5bnRheAorICoKKyAqIEF1dGhvcjogU2ltb24gTWNWaXR0aWUgPHNpbW9uLm1jdml0dGllQGNvbGxhYm9yYS5jby51az4KKyAqIENvcHlyaWdodCDCqSAyMDExIE5va2lhIENvcnBvcmF0aW9uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiZGJ1cy1zeW50YXguaCIKKworI2luY2x1ZGUgImRidXMtaW50ZXJuYWxzLmgiCisjaW5jbHVkZSAiZGJ1cy1tYXJzaGFsLXZhbGlkYXRlLmgiCisjaW5jbHVkZSAiZGJ1cy1zaGFyZWQuaCIKKworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c1N5bnRheCBVdGlsaXR5IGZ1bmN0aW9ucyBmb3Igc3RyaW5ncyB3aXRoIHNwZWNpYWwgc3ludGF4CisgKiBAaW5ncm91cCAgREJ1cworICogQGJyaWVmIFBhcnNpbmcgRC1CdXMgdHlwZSBzaWduYXR1cmVzCisgKiBAeworICovCisKKy8qKgorICogQ2hlY2sgYW4gb2JqZWN0IHBhdGggZm9yIHZhbGlkaXR5LiBSZW1lbWJlciB0aGF0ICNOVUxMIGNhbiBhbHdheXMKKyAqIGJlIHBhc3NlZCBpbnN0ZWFkIG9mIGEgREJ1c0Vycm9yICosIGlmIHlvdSBkb24ndCBjYXJlIGFib3V0IGhhdmluZworICogYW4gZXJyb3IgbmFtZSBhbmQgbWVzc2FnZS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHN1aXRhYmxlIGZvciB2YWxpZGF0aW5nIEMgc3RyaW5ncywgYnV0IGlzIG5vdCBzdWl0YWJsZQorICogZm9yIHZhbGlkYXRpbmcgdW50cnVzdGVkIGRhdGEgZnJvbSBhIG5ldHdvcmsgdW5sZXNzIHRoZSBzdHJpbmcncyBsZW5ndGgKKyAqIGlzIGFsc28gY2hlY2tlZCwgc2luY2UgaXQgYXNzdW1lcyB0aGF0IHRoZSBzdHJpbmcgZW5kcyBhdCB0aGUgZmlyc3QgemVybworICogYnl0ZSBhY2NvcmRpbmcgdG8gbm9ybWFsIEMgY29udmVudGlvbnMuCisgKgorICogQHBhcmFtIHBhdGggYSBwb3RlbnRpYWxseSBpbnZhbGlkIG9iamVjdCBwYXRoLCB3aGljaCBtdXN0IG5vdCBiZSAjTlVMTAorICogQHBhcmFtIGVycm9yIGVycm9yIHJldHVybgorICogQHJldHVybnMgI1RSVUUgaWYgcGF0aCBpcyB2YWxpZAorICovCitkYnVzX2Jvb2xfdAorZGJ1c192YWxpZGF0ZV9wYXRoIChjb25zdCBjaGFyICAgICAgICpwYXRoLAorICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgREJ1c1N0cmluZyBzdHI7CisgIGludCBsZW47CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChwYXRoICE9IE5VTEwsIEZBTFNFKTsKKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnN0ciwgcGF0aCk7CisgIGxlbiA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKTsKKworICAvKiBJbiBnZW5lcmFsLCBpdCBvdWdodCB0byBiZSB2YWxpZC4uLiAqLworICBpZiAoX0RCVVNfTElLRUxZIChfZGJ1c192YWxpZGF0ZV9wYXRoICgmc3RyLCAwLCBsZW4pKSkKKyAgICByZXR1cm4gVFJVRTsKKworICAvKiBzbG93IHBhdGg6IHN0cmluZyBpcyBpbnZhbGlkLCBmaW5kIG91dCB3aHkgKi8KKworICBpZiAoIV9kYnVzX3N0cmluZ192YWxpZGF0ZV91dGY4ICgmc3RyLCAwLCBsZW4pKQorICAgIHsKKyAgICAgIC8qIGRvbid0IHF1b3RlIHRoZSBhY3R1YWwgc3RyaW5nIGhlcmUsIHNpbmNlIGEgREJ1c0Vycm9yIGFsc28gbmVlZHMgdG8KKyAgICAgICAqIGJlIHZhbGlkIFVURi04ICovCisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfSU5WQUxJRF9BUkdTLAorICAgICAgICAgICAgICAgICAgICAgICJPYmplY3QgcGF0aCB3YXMgbm90IHZhbGlkIFVURi04Iik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIC8qIEZJWE1FOiBsYXRlciwgZGlhZ25vc2UgZXhhY3RseSBob3cgaXQgd2FzIGludmFsaWQgKi8KKyAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0lOVkFMSURfQVJHUywKKyAgICAgICAgICAgICAgICAgICJPYmplY3QgcGF0aCB3YXMgbm90IHZhbGlkOiAnJXMnIiwgcGF0aCk7CisgIHJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBDaGVjayBhbiBpbnRlcmZhY2UgbmFtZSBmb3IgdmFsaWRpdHkuIFJlbWVtYmVyIHRoYXQgI05VTEwgY2FuIGFsd2F5cworICogYmUgcGFzc2VkIGluc3RlYWQgb2YgYSBEQnVzRXJyb3IgKiwgaWYgeW91IGRvbid0IGNhcmUgYWJvdXQgaGF2aW5nCisgKiBhbiBlcnJvciBuYW1lIGFuZCBtZXNzYWdlLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgc3VpdGFibGUgZm9yIHZhbGlkYXRpbmcgQyBzdHJpbmdzLCBidXQgaXMgbm90IHN1aXRhYmxlCisgKiBmb3IgdmFsaWRhdGluZyB1bnRydXN0ZWQgZGF0YSBmcm9tIGEgbmV0d29yayB1bmxlc3MgdGhlIHN0cmluZydzIGxlbmd0aAorICogaXMgYWxzbyBjaGVja2VkLCBzaW5jZSBpdCBhc3N1bWVzIHRoYXQgdGhlIHN0cmluZyBlbmRzIGF0IHRoZSBmaXJzdCB6ZXJvCisgKiBieXRlIGFjY29yZGluZyB0byBub3JtYWwgQyBjb252ZW50aW9ucy4KKyAqCisgKiBAcGFyYW0gbmFtZSBhIHBvdGVudGlhbGx5IGludmFsaWQgaW50ZXJmYWNlIG5hbWUsIHdoaWNoIG11c3Qgbm90IGJlICNOVUxMCisgKiBAcGFyYW0gZXJyb3IgZXJyb3IgcmV0dXJuCisgKiBAcmV0dXJucyAjVFJVRSBpZiBuYW1lIGlzIHZhbGlkCisgKi8KK2RidXNfYm9vbF90CitkYnVzX3ZhbGlkYXRlX2ludGVyZmFjZSAoY29uc3QgY2hhciAgICAgICAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgREJ1c1N0cmluZyBzdHI7CisgIGludCBsZW47CisKKyAgX2RidXNfcmV0dXJuX3ZhbF9pZl9mYWlsIChuYW1lICE9IE5VTEwsIEZBTFNFKTsKKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnN0ciwgbmFtZSk7CisgIGxlbiA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc3RyKTsKKworICAvKiBJbiBnZW5lcmFsLCBpdCBvdWdodCB0byBiZSB2YWxpZC4uLiAqLworICBpZiAoX0RCVVNfTElLRUxZIChfZGJ1c192YWxpZGF0ZV9pbnRlcmZhY2UgKCZzdHIsIDAsIGxlbikpKQorICAgIHJldHVybiBUUlVFOworCisgIC8qIHNsb3cgcGF0aDogc3RyaW5nIGlzIGludmFsaWQsIGZpbmQgb3V0IHdoeSAqLworCisgIGlmICghX2RidXNfc3RyaW5nX3ZhbGlkYXRlX3V0ZjggKCZzdHIsIDAsIGxlbikpCisgICAgeworICAgICAgLyogZG9uJ3QgcXVvdGUgdGhlIGFjdHVhbCBzdHJpbmcgaGVyZSwgc2luY2UgYSBEQnVzRXJyb3IgYWxzbyBuZWVkcyB0bworICAgICAgICogYmUgdmFsaWQgVVRGLTggKi8KKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9JTlZBTElEX0FSR1MsCisgICAgICAgICAgICAgICAgICAgICAgIkludGVyZmFjZSBuYW1lIHdhcyBub3QgdmFsaWQgVVRGLTgiKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgLyogRklYTUU6IGxhdGVyLCBkaWFnbm9zZSBleGFjdGx5IGhvdyBpdCB3YXMgaW52YWxpZCAqLworICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfSU5WQUxJRF9BUkdTLAorICAgICAgICAgICAgICAgICAgIkludGVyZmFjZSBuYW1lIHdhcyBub3QgdmFsaWQ6ICclcyciLCBuYW1lKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKioKKyAqIENoZWNrIGEgbWVtYmVyIChtZXRob2Qvc2lnbmFsKSBuYW1lIGZvciB2YWxpZGl0eS4gUmVtZW1iZXIgdGhhdCAjTlVMTAorICogY2FuIGFsd2F5cyBiZSBwYXNzZWQgaW5zdGVhZCBvZiBhIERCdXNFcnJvciAqLCBpZiB5b3UgZG9uJ3QgY2FyZSBhYm91dAorICogaGF2aW5nIGFuIGVycm9yIG5hbWUgYW5kIG1lc3NhZ2UuCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBzdWl0YWJsZSBmb3IgdmFsaWRhdGluZyBDIHN0cmluZ3MsIGJ1dCBpcyBub3Qgc3VpdGFibGUKKyAqIGZvciB2YWxpZGF0aW5nIHVudHJ1c3RlZCBkYXRhIGZyb20gYSBuZXR3b3JrIHVubGVzcyB0aGUgc3RyaW5nJ3MgbGVuZ3RoCisgKiBpcyBhbHNvIGNoZWNrZWQsIHNpbmNlIGl0IGFzc3VtZXMgdGhhdCB0aGUgc3RyaW5nIGVuZHMgYXQgdGhlIGZpcnN0IHplcm8KKyAqIGJ5dGUgYWNjb3JkaW5nIHRvIG5vcm1hbCBDIGNvbnZlbnRpb25zLgorICoKKyAqIEBwYXJhbSBuYW1lIGEgcG90ZW50aWFsbHkgaW52YWxpZCBtZW1iZXIgbmFtZSwgd2hpY2ggbXVzdCBub3QgYmUgI05VTEwKKyAqIEBwYXJhbSBlcnJvciBlcnJvciByZXR1cm4KKyAqIEByZXR1cm5zICNUUlVFIGlmIG5hbWUgaXMgdmFsaWQKKyAqLworZGJ1c19ib29sX3QKK2RidXNfdmFsaWRhdGVfbWVtYmVyIChjb25zdCBjaGFyICAgICAgICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICBEQnVzU3RyaW5nIHN0cjsKKyAgaW50IGxlbjsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG5hbWUgIT0gTlVMTCwgRkFMU0UpOworCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmc3RyLCBuYW1lKTsKKyAgbGVuID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpOworCisgIC8qIEluIGdlbmVyYWwsIGl0IG91Z2h0IHRvIGJlIHZhbGlkLi4uICovCisgIGlmIChfREJVU19MSUtFTFkgKF9kYnVzX3ZhbGlkYXRlX21lbWJlciAoJnN0ciwgMCwgbGVuKSkpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgLyogc2xvdyBwYXRoOiBzdHJpbmcgaXMgaW52YWxpZCwgZmluZCBvdXQgd2h5ICovCisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfdmFsaWRhdGVfdXRmOCAoJnN0ciwgMCwgbGVuKSkKKyAgICB7CisgICAgICAvKiBkb24ndCBxdW90ZSB0aGUgYWN0dWFsIHN0cmluZyBoZXJlLCBzaW5jZSBhIERCdXNFcnJvciBhbHNvIG5lZWRzIHRvCisgICAgICAgKiBiZSB2YWxpZCBVVEYtOCAqLworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0lOVkFMSURfQVJHUywKKyAgICAgICAgICAgICAgICAgICAgICAiTWVtYmVyIG5hbWUgd2FzIG5vdCB2YWxpZCBVVEYtOCIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAvKiBGSVhNRTogbGF0ZXIsIGRpYWdub3NlIGV4YWN0bHkgaG93IGl0IHdhcyBpbnZhbGlkICovCisgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9JTlZBTElEX0FSR1MsCisgICAgICAgICAgICAgICAgICAiTWVtYmVyIG5hbWUgd2FzIG5vdCB2YWxpZDogJyVzJyIsIG5hbWUpOworICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKgorICogQ2hlY2sgYW4gZXJyb3IgbmFtZSBmb3IgdmFsaWRpdHkuIFJlbWVtYmVyIHRoYXQgI05VTEwKKyAqIGNhbiBhbHdheXMgYmUgcGFzc2VkIGluc3RlYWQgb2YgYSBEQnVzRXJyb3IgKiwgaWYgeW91IGRvbid0IGNhcmUgYWJvdXQKKyAqIGhhdmluZyBhbiBlcnJvciBuYW1lIGFuZCBtZXNzYWdlLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgc3VpdGFibGUgZm9yIHZhbGlkYXRpbmcgQyBzdHJpbmdzLCBidXQgaXMgbm90IHN1aXRhYmxlCisgKiBmb3IgdmFsaWRhdGluZyB1bnRydXN0ZWQgZGF0YSBmcm9tIGEgbmV0d29yayB1bmxlc3MgdGhlIHN0cmluZydzIGxlbmd0aAorICogaXMgYWxzbyBjaGVja2VkLCBzaW5jZSBpdCBhc3N1bWVzIHRoYXQgdGhlIHN0cmluZyBlbmRzIGF0IHRoZSBmaXJzdCB6ZXJvCisgKiBieXRlIGFjY29yZGluZyB0byBub3JtYWwgQyBjb252ZW50aW9ucy4KKyAqCisgKiBAcGFyYW0gbmFtZSBhIHBvdGVudGlhbGx5IGludmFsaWQgZXJyb3IgbmFtZSwgd2hpY2ggbXVzdCBub3QgYmUgI05VTEwKKyAqIEBwYXJhbSBlcnJvciBlcnJvciByZXR1cm4KKyAqIEByZXR1cm5zICNUUlVFIGlmIG5hbWUgaXMgdmFsaWQKKyAqLworZGJ1c19ib29sX3QKK2RidXNfdmFsaWRhdGVfZXJyb3JfbmFtZSAoY29uc3QgY2hhciAgICAgICAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCit7CisgIERCdXNTdHJpbmcgc3RyOworICBpbnQgbGVuOworCisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAobmFtZSAhPSBOVUxMLCBGQUxTRSk7CisKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZzdHIsIG5hbWUpOworICBsZW4gPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cik7CisKKyAgLyogSW4gZ2VuZXJhbCwgaXQgb3VnaHQgdG8gYmUgdmFsaWQuLi4gKi8KKyAgaWYgKF9EQlVTX0xJS0VMWSAoX2RidXNfdmFsaWRhdGVfZXJyb3JfbmFtZSAoJnN0ciwgMCwgbGVuKSkpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgLyogc2xvdyBwYXRoOiBzdHJpbmcgaXMgaW52YWxpZCwgZmluZCBvdXQgd2h5ICovCisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfdmFsaWRhdGVfdXRmOCAoJnN0ciwgMCwgbGVuKSkKKyAgICB7CisgICAgICAvKiBkb24ndCBxdW90ZSB0aGUgYWN0dWFsIHN0cmluZyBoZXJlLCBzaW5jZSBhIERCdXNFcnJvciBhbHNvIG5lZWRzIHRvCisgICAgICAgKiBiZSB2YWxpZCBVVEYtOCAqLworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0lOVkFMSURfQVJHUywKKyAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IgbmFtZSB3YXMgbm90IHZhbGlkIFVURi04Iik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIC8qIEZJWE1FOiBsYXRlciwgZGlhZ25vc2UgZXhhY3RseSBob3cgaXQgd2FzIGludmFsaWQgKi8KKyAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0lOVkFMSURfQVJHUywKKyAgICAgICAgICAgICAgICAgICJFcnJvciBuYW1lIHdhcyBub3QgdmFsaWQ6ICclcyciLCBuYW1lKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKioKKyAqIENoZWNrIGEgYnVzIG5hbWUgZm9yIHZhbGlkaXR5LiBSZW1lbWJlciB0aGF0ICNOVUxMCisgKiBjYW4gYWx3YXlzIGJlIHBhc3NlZCBpbnN0ZWFkIG9mIGEgREJ1c0Vycm9yICosIGlmIHlvdSBkb24ndCBjYXJlIGFib3V0CisgKiBoYXZpbmcgYW4gZXJyb3IgbmFtZSBhbmQgbWVzc2FnZS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHN1aXRhYmxlIGZvciB2YWxpZGF0aW5nIEMgc3RyaW5ncywgYnV0IGlzIG5vdCBzdWl0YWJsZQorICogZm9yIHZhbGlkYXRpbmcgdW50cnVzdGVkIGRhdGEgZnJvbSBhIG5ldHdvcmsgdW5sZXNzIHRoZSBzdHJpbmcncyBsZW5ndGgKKyAqIGlzIGFsc28gY2hlY2tlZCwgc2luY2UgaXQgYXNzdW1lcyB0aGF0IHRoZSBzdHJpbmcgZW5kcyBhdCB0aGUgZmlyc3QgemVybworICogYnl0ZSBhY2NvcmRpbmcgdG8gbm9ybWFsIEMgY29udmVudGlvbnMuCisgKgorICogQHBhcmFtIG5hbWUgYSBwb3RlbnRpYWxseSBpbnZhbGlkIGJ1cyBuYW1lLCB3aGljaCBtdXN0IG5vdCBiZSAjTlVMTAorICogQHBhcmFtIGVycm9yIGVycm9yIHJldHVybgorICogQHJldHVybnMgI1RSVUUgaWYgbmFtZSBpcyB2YWxpZAorICovCitkYnVzX2Jvb2xfdAorZGJ1c192YWxpZGF0ZV9idXNfbmFtZSAoY29uc3QgY2hhciAgICAgICAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICBEQnVzU3RyaW5nIHN0cjsKKyAgaW50IGxlbjsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKG5hbWUgIT0gTlVMTCwgRkFMU0UpOworCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmc3RyLCBuYW1lKTsKKyAgbGVuID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzdHIpOworCisgIC8qIEluIGdlbmVyYWwsIGl0IG91Z2h0IHRvIGJlIHZhbGlkLi4uICovCisgIGlmIChfREJVU19MSUtFTFkgKF9kYnVzX3ZhbGlkYXRlX2J1c19uYW1lICgmc3RyLCAwLCBsZW4pKSkKKyAgICByZXR1cm4gVFJVRTsKKworICAvKiBzbG93IHBhdGg6IHN0cmluZyBpcyBpbnZhbGlkLCBmaW5kIG91dCB3aHkgKi8KKworICBpZiAoIV9kYnVzX3N0cmluZ192YWxpZGF0ZV91dGY4ICgmc3RyLCAwLCBsZW4pKQorICAgIHsKKyAgICAgIC8qIGRvbid0IHF1b3RlIHRoZSBhY3R1YWwgc3RyaW5nIGhlcmUsIHNpbmNlIGEgREJ1c0Vycm9yIGFsc28gbmVlZHMgdG8KKyAgICAgICAqIGJlIHZhbGlkIFVURi04ICovCisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfSU5WQUxJRF9BUkdTLAorICAgICAgICAgICAgICAgICAgICAgICJCdXMgbmFtZSB3YXMgbm90IHZhbGlkIFVURi04Iik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIC8qIEZJWE1FOiBsYXRlciwgZGlhZ25vc2UgZXhhY3RseSBob3cgaXQgd2FzIGludmFsaWQgKi8KKyAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0lOVkFMSURfQVJHUywKKyAgICAgICAgICAgICAgICAgICJCdXMgbmFtZSB3YXMgbm90IHZhbGlkOiAnJXMnIiwgbmFtZSk7CisgIHJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBDaGVjayBhIHN0cmluZyBmb3IgdmFsaWRpdHkuIFN0cmluZ3Mgb24gRC1CdXMgbXVzdCBiZSB2YWxpZCBVVEYtOC4KKyAqIFJlbWVtYmVyIHRoYXQgI05VTEwgY2FuIGFsd2F5cyBiZSBwYXNzZWQgaW5zdGVhZCBvZiBhIERCdXNFcnJvciAqLAorICogaWYgeW91IGRvbid0IGNhcmUgYWJvdXQgaGF2aW5nIGFuIGVycm9yIG5hbWUgYW5kIG1lc3NhZ2UuCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBzdWl0YWJsZSBmb3IgdmFsaWRhdGluZyBDIHN0cmluZ3MsIGJ1dCBpcyBub3Qgc3VpdGFibGUKKyAqIGZvciB2YWxpZGF0aW5nIHVudHJ1c3RlZCBkYXRhIGZyb20gYSBuZXR3b3JrIHVubGVzcyB0aGUgc3RyaW5nJ3MgbGVuZ3RoCisgKiBpcyBhbHNvIGNoZWNrZWQsIHNpbmNlIGl0IGFzc3VtZXMgdGhhdCB0aGUgc3RyaW5nIGVuZHMgYXQgdGhlIGZpcnN0IHplcm8KKyAqIGJ5dGUgYWNjb3JkaW5nIHRvIG5vcm1hbCBDIGNvbnZlbnRpb25zLgorICoKKyAqIEBwYXJhbSBhbGxlZ2VkX3V0ZjggYSBzdHJpbmcgdG8gYmUgY2hlY2tlZCwgd2hpY2ggbXVzdCBub3QgYmUgI05VTEwKKyAqIEBwYXJhbSBlcnJvciBlcnJvciByZXR1cm4KKyAqIEByZXR1cm5zICNUUlVFIGlmIGFsbGVnZWRfdXRmOCBpcyB2YWxpZCBVVEYtOAorICovCitkYnVzX2Jvb2xfdAorZGJ1c192YWxpZGF0ZV91dGY4IChjb25zdCBjaGFyICAgICAgICphbGxlZ2VkX3V0ZjgsCisgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICBEQnVzU3RyaW5nIHN0cjsKKworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKGFsbGVnZWRfdXRmOCAhPSBOVUxMLCBGQUxTRSk7CisKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZzdHIsIGFsbGVnZWRfdXRmOCk7CisKKyAgaWYgKF9EQlVTX0xJS0VMWSAoX2RidXNfc3RyaW5nX3ZhbGlkYXRlX3V0ZjggKCZzdHIsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnN0cikpKSkKKyAgICByZXR1cm4gVFJVRTsKKworICAvKiBkb24ndCBxdW90ZSB0aGUgYWN0dWFsIHN0cmluZyBoZXJlLCBzaW5jZSBhIERCdXNFcnJvciBhbHNvIG5lZWRzIHRvCisgICAqIGJlIHZhbGlkIFVURi04ICovCisgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9JTlZBTElEX0FSR1MsCisgICAgICAgICAgICAgICAgICAiU3RyaW5nIHdhcyBub3QgdmFsaWQgVVRGLTgiKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKiogQH0gKi8gLyogZW5kIG9mIGdyb3VwICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtc3ludGF4LmggYi9kYnVzL2RidXMtc3ludGF4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFmMjBmMAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1zeW50YXguaApAQCAtMCwwICsxLDU4IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtc3ludGF4LmggLSB1dGlsaXR5IGZ1bmN0aW9ucyBmb3Igc3RyaW5ncyB3aXRoIHNwZWNpYWwgc3ludGF4CisgKgorICogQXV0aG9yOiBTaW1vbiBNY1ZpdHRpZSA8c2ltb24ubWN2aXR0aWVAY29sbGFib3JhLmNvLnVrPgorICogQ29weXJpZ2h0IMKpIDIwMTEgTm9raWEgQ29ycG9yYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaWYgIWRlZmluZWQgKERCVVNfSU5TSURFX0RCVVNfSCkgJiYgIWRlZmluZWQgKERCVVNfQ09NUElMQVRJT04pCisjZXJyb3IgIk9ubHkgPGRidXMvZGJ1cy5oPiBjYW4gYmUgaW5jbHVkZWQgZGlyZWN0bHksIHRoaXMgZmlsZSBtYXkgZGlzYXBwZWFyIG9yIGNoYW5nZSBjb250ZW50cy4iCisjZW5kaWYKKworI2lmbmRlZiBEQlVTX1NZTlRBWF9ICisjZGVmaW5lIERCVVNfU1lOVEFYX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy1tYWNyb3MuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtdHlwZXMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtZXJyb3JzLmg+CisKK0RCVVNfQkVHSU5fREVDTFMKKworREJVU19FWFBPUlQKK2RidXNfYm9vbF90ICAgICBkYnVzX3ZhbGlkYXRlX3BhdGggICAgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICplcnJvcik7CitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgICAgIGRidXNfdmFsaWRhdGVfaW50ZXJmYWNlICAgICAgICAgICAgICAoY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgKmVycm9yKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCAgICAgZGJ1c192YWxpZGF0ZV9tZW1iZXIgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAqZXJyb3IpOworREJVU19FWFBPUlQKK2RidXNfYm9vbF90ICAgICBkYnVzX3ZhbGlkYXRlX2Vycm9yX25hbWUgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICplcnJvcik7CitEQlVTX0VYUE9SVAorZGJ1c19ib29sX3QgICAgIGRidXNfdmFsaWRhdGVfYnVzX25hbWUgICAgICAgICAgICAgICAoY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgKmVycm9yKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCAgICAgZGJ1c192YWxpZGF0ZV91dGY4ICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICphbGxlZ2VkX3V0ZjgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICplcnJvcik7CisKK0RCVVNfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBtdWx0aXBsZS1pbmNsdXNpb24gZ3VhcmQgKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1zeXNkZXBzLXB0aHJlYWQuYyBiL2RidXMvZGJ1cy1zeXNkZXBzLXB0aHJlYWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWMxNGY5Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLXN5c2RlcHMtcHRocmVhZC5jCkBAIC0wLDAgKzEsMzIwIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtc3lzZGVwcy1wdGhyZWFkLmMgSW1wbGVtZW50cyB0aHJlYWRzIHVzaW5nIHB0aHJlYWRzIChpbnRlcm5hbCB0byBsaWJkYnVzKQorICogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMsIDIwMDYgIFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgImRidXMtaW50ZXJuYWxzLmgiCisjaW5jbHVkZSAiZGJ1cy1zeXNkZXBzLmgiCisjaW5jbHVkZSAiZGJ1cy10aHJlYWRzLmgiCisKKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaWZkZWYgSEFWRV9FUlJOT19ICisjaW5jbHVkZSA8ZXJybm8uaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8Y29uZmlnLmg+CisKKyNpZmRlZiBIQVZFX01PTk9UT05JQ19DTE9DSworLyogV2hldGhlciB3ZSBoYXZlIGEgIm1vbm90b25pYyIgY2xvY2s7IGkuZS4gYSBjbG9jayBub3QgYWZmZWN0ZWQgYnkKKyAqIGNoYW5nZXMgaW4gc3lzdGVtIHRpbWUuCisgKiBUaGlzIGlzIGluaXRpYWxpemVkIG9uY2UgaW4gY2hlY2tfbW9ub3RvbmljX2Nsb2NrIGJlbG93LgorICogaHR0cHM6Ly9idWdzLmZyZWVkZXNrdG9wLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTgxMjEKKyAqLworc3RhdGljIGRidXNfYm9vbF90IGhhdmVfbW9ub3RvbmljX2Nsb2NrID0gMDsKKyNlbmRpZgorCitzdHJ1Y3QgREJ1c1JNdXRleCB7CisgIHB0aHJlYWRfbXV0ZXhfdCBsb2NrOyAvKio8IHRoZSBsb2NrICovCit9OworCitzdHJ1Y3QgREJ1c0NNdXRleCB7CisgIHB0aHJlYWRfbXV0ZXhfdCBsb2NrOyAvKio8IHRoZSBsb2NrICovCit9OworCitzdHJ1Y3QgREJ1c0NvbmRWYXIgeworICBwdGhyZWFkX2NvbmRfdCBjb25kOyAvKio8IHRoZSBjb25kaXRpb24gKi8KK307CisKKyNkZWZpbmUgREJVU19NVVRFWChtKSAgICAgICAgICgoREJ1c011dGV4KikgbSkKKyNkZWZpbmUgREJVU19NVVRFWF9QVEhSRUFEKG0pICgoREJ1c011dGV4UFRocmVhZCopIG0pCisKKyNkZWZpbmUgREJVU19DT05EX1ZBUihjKSAgICAgICAgICgoREJ1c0NvbmRWYXIqKSBjKQorI2RlZmluZSBEQlVTX0NPTkRfVkFSX1BUSFJFQUQoYykgKChEQnVzQ29uZFZhclBUaHJlYWQqKSBjKQorCisKKyNpZmRlZiBEQlVTX0RJU0FCTEVfQVNTRVJUCisvKiAodG1wICE9IDApIGlzIGEgbm8tb3AgdXNhZ2UgdG8gc2lsZW5jZSBjb21waWxlciAqLworI2RlZmluZSBQVEhSRUFEX0NIRUNLKGZ1bmNfbmFtZSwgcmVzdWx0X29yX2NhbGwpICAgIFwKKyAgICBkbyB7IGludCB0bXAgPSAocmVzdWx0X29yX2NhbGwpOyBpZiAodG1wICE9IDApIHs7fSB9IHdoaWxlICgwKQorI2Vsc2UKKyNkZWZpbmUgUFRIUkVBRF9DSEVDSyhmdW5jX25hbWUsIHJlc3VsdF9vcl9jYWxsKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgdG1wID0gKHJlc3VsdF9vcl9jYWxsKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAodG1wICE9IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIF9kYnVzX3dhcm5fY2hlY2tfZmFpbGVkICgicHRocmVhZCBmdW5jdGlvbiAlcyBmYWlsZWQgd2l0aCAlZCAlcyBpbiAlcyIsICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jX25hbWUsIHRtcCwgc3RyZXJyb3IodG1wKSwgX0RCVVNfRlVOQ1RJT05fTkFNRSk7ICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisjZW5kaWYgLyogIURCVVNfRElTQUJMRV9BU1NFUlQgKi8KKworREJ1c0NNdXRleCAqCitfZGJ1c19wbGF0Zm9ybV9jbXV0ZXhfbmV3ICh2b2lkKQoreworICBEQnVzQ011dGV4ICpwbXV0ZXg7CisgIGludCByZXN1bHQ7CisKKyAgcG11dGV4ID0gZGJ1c19uZXcgKERCdXNDTXV0ZXgsIDEpOworICBpZiAocG11dGV4ID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgcmVzdWx0ID0gcHRocmVhZF9tdXRleF9pbml0ICgmcG11dGV4LT5sb2NrLCBOVUxMKTsKKworICBpZiAocmVzdWx0ID09IEVOT01FTSB8fCByZXN1bHQgPT0gRUFHQUlOKQorICAgIHsKKyAgICAgIGRidXNfZnJlZSAocG11dGV4KTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIFBUSFJFQURfQ0hFQ0sgKCJwdGhyZWFkX211dGV4X2luaXQiLCByZXN1bHQpOworICAgIH0KKworICByZXR1cm4gcG11dGV4OworfQorCitEQnVzUk11dGV4ICoKK19kYnVzX3BsYXRmb3JtX3JtdXRleF9uZXcgKHZvaWQpCit7CisgIERCdXNSTXV0ZXggKnBtdXRleDsKKyAgcHRocmVhZF9tdXRleGF0dHJfdCBtdXRleGF0dHI7CisgIGludCByZXN1bHQ7CisKKyAgcG11dGV4ID0gZGJ1c19uZXcgKERCdXNSTXV0ZXgsIDEpOworICBpZiAocG11dGV4ID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgcHRocmVhZF9tdXRleGF0dHJfaW5pdCAoJm11dGV4YXR0cik7CisgIHB0aHJlYWRfbXV0ZXhhdHRyX3NldHR5cGUgKCZtdXRleGF0dHIsIFBUSFJFQURfTVVURVhfUkVDVVJTSVZFKTsKKyAgcmVzdWx0ID0gcHRocmVhZF9tdXRleF9pbml0ICgmcG11dGV4LT5sb2NrLCAmbXV0ZXhhdHRyKTsKKyAgcHRocmVhZF9tdXRleGF0dHJfZGVzdHJveSAoJm11dGV4YXR0cik7CisKKyAgaWYgKHJlc3VsdCA9PSBFTk9NRU0gfHwgcmVzdWx0ID09IEVBR0FJTikKKyAgICB7CisgICAgICBkYnVzX2ZyZWUgKHBtdXRleCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBQVEhSRUFEX0NIRUNLICgicHRocmVhZF9tdXRleF9pbml0IiwgcmVzdWx0KTsKKyAgICB9CisKKyAgcmV0dXJuIHBtdXRleDsKK30KKwordm9pZAorX2RidXNfcGxhdGZvcm1fY211dGV4X2ZyZWUgKERCdXNDTXV0ZXggKm11dGV4KQoreworICBQVEhSRUFEX0NIRUNLICgicHRocmVhZF9tdXRleF9kZXN0cm95IiwgcHRocmVhZF9tdXRleF9kZXN0cm95ICgmbXV0ZXgtPmxvY2spKTsKKyAgZGJ1c19mcmVlIChtdXRleCk7Cit9CisKK3ZvaWQKK19kYnVzX3BsYXRmb3JtX3JtdXRleF9mcmVlIChEQnVzUk11dGV4ICptdXRleCkKK3sKKyAgUFRIUkVBRF9DSEVDSyAoInB0aHJlYWRfbXV0ZXhfZGVzdHJveSIsIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSAoJm11dGV4LT5sb2NrKSk7CisgIGRidXNfZnJlZSAobXV0ZXgpOworfQorCit2b2lkCitfZGJ1c19wbGF0Zm9ybV9jbXV0ZXhfbG9jayAoREJ1c0NNdXRleCAqbXV0ZXgpCit7CisgIFBUSFJFQURfQ0hFQ0sgKCJwdGhyZWFkX211dGV4X2xvY2siLCBwdGhyZWFkX211dGV4X2xvY2sgKCZtdXRleC0+bG9jaykpOworfQorCit2b2lkCitfZGJ1c19wbGF0Zm9ybV9ybXV0ZXhfbG9jayAoREJ1c1JNdXRleCAqbXV0ZXgpCit7CisgIFBUSFJFQURfQ0hFQ0sgKCJwdGhyZWFkX211dGV4X2xvY2siLCBwdGhyZWFkX211dGV4X2xvY2sgKCZtdXRleC0+bG9jaykpOworfQorCit2b2lkCitfZGJ1c19wbGF0Zm9ybV9jbXV0ZXhfdW5sb2NrIChEQnVzQ011dGV4ICptdXRleCkKK3sKKyAgUFRIUkVBRF9DSEVDSyAoInB0aHJlYWRfbXV0ZXhfdW5sb2NrIiwgcHRocmVhZF9tdXRleF91bmxvY2sgKCZtdXRleC0+bG9jaykpOworfQorCit2b2lkCitfZGJ1c19wbGF0Zm9ybV9ybXV0ZXhfdW5sb2NrIChEQnVzUk11dGV4ICptdXRleCkKK3sKKyAgUFRIUkVBRF9DSEVDSyAoInB0aHJlYWRfbXV0ZXhfdW5sb2NrIiwgcHRocmVhZF9tdXRleF91bmxvY2sgKCZtdXRleC0+bG9jaykpOworfQorCitEQnVzQ29uZFZhciAqCitfZGJ1c19wbGF0Zm9ybV9jb25kdmFyX25ldyAodm9pZCkKK3sKKyAgREJ1c0NvbmRWYXIgKnBjb25kOworICBwdGhyZWFkX2NvbmRhdHRyX3QgYXR0cjsKKyAgaW50IHJlc3VsdDsKKyAgCisgIHBjb25kID0gZGJ1c19uZXcgKERCdXNDb25kVmFyLCAxKTsKKyAgaWYgKHBjb25kID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgcHRocmVhZF9jb25kYXR0cl9pbml0ICgmYXR0cik7CisjaWZkZWYgSEFWRV9NT05PVE9OSUNfQ0xPQ0sKKyAgaWYgKGhhdmVfbW9ub3RvbmljX2Nsb2NrKQorICAgIHB0aHJlYWRfY29uZGF0dHJfc2V0Y2xvY2sgKCZhdHRyLCBDTE9DS19NT05PVE9OSUMpOworI2VuZGlmCisKKyAgcmVzdWx0ID0gcHRocmVhZF9jb25kX2luaXQgKCZwY29uZC0+Y29uZCwgJmF0dHIpOworICBwdGhyZWFkX2NvbmRhdHRyX2Rlc3Ryb3kgKCZhdHRyKTsKKworICBpZiAocmVzdWx0ID09IEVBR0FJTiB8fCByZXN1bHQgPT0gRU5PTUVNKQorICAgIHsKKyAgICAgIGRidXNfZnJlZSAocGNvbmQpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgUFRIUkVBRF9DSEVDSyAoInB0aHJlYWRfY29uZF9pbml0IiwgcmVzdWx0KTsKKyAgICB9CisgIAorICByZXR1cm4gcGNvbmQ7Cit9CisKK3ZvaWQKK19kYnVzX3BsYXRmb3JtX2NvbmR2YXJfZnJlZSAoREJ1c0NvbmRWYXIgKmNvbmQpCit7CisgIFBUSFJFQURfQ0hFQ0sgKCJwdGhyZWFkX2NvbmRfZGVzdHJveSIsIHB0aHJlYWRfY29uZF9kZXN0cm95ICgmY29uZC0+Y29uZCkpOworICBkYnVzX2ZyZWUgKGNvbmQpOworfQorCit2b2lkCitfZGJ1c19wbGF0Zm9ybV9jb25kdmFyX3dhaXQgKERCdXNDb25kVmFyICpjb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ011dGV4ICAqbXV0ZXgpCit7CisgIFBUSFJFQURfQ0hFQ0sgKCJwdGhyZWFkX2NvbmRfd2FpdCIsIHB0aHJlYWRfY29uZF93YWl0ICgmY29uZC0+Y29uZCwgJm11dGV4LT5sb2NrKSk7Cit9CisKK2RidXNfYm9vbF90CitfZGJ1c19wbGF0Zm9ybV9jb25kdmFyX3dhaXRfdGltZW91dCAoREJ1c0NvbmRWYXIgICAgICAgICAgICAgICAqY29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ011dGV4ICAgICAgICAgICAgICAgICptdXRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0X21pbGxpc2Vjb25kcykKK3sKKyAgc3RydWN0IHRpbWV2YWwgdGltZV9ub3c7CisgIHN0cnVjdCB0aW1lc3BlYyBlbmRfdGltZTsKKyAgaW50IHJlc3VsdDsKKworI2lmZGVmIEhBVkVfTU9OT1RPTklDX0NMT0NLCisgIGlmIChoYXZlX21vbm90b25pY19jbG9jaykKKyAgICB7CisgICAgICBzdHJ1Y3QgdGltZXNwZWMgbW9ub3RvbmljX3RpbWVyOworICAgICAgY2xvY2tfZ2V0dGltZSAoQ0xPQ0tfTU9OT1RPTklDLCZtb25vdG9uaWNfdGltZXIpOworICAgICAgdGltZV9ub3cudHZfc2VjID0gbW9ub3RvbmljX3RpbWVyLnR2X3NlYzsKKyAgICAgIHRpbWVfbm93LnR2X3VzZWMgPSBtb25vdG9uaWNfdGltZXIudHZfbnNlYyAvIDEwMDA7CisgICAgfQorICBlbHNlCisgICAgLyogVGhpcyBlbHNlIGZhbGxzIHRocm91Z2ggdG8gZ2V0dGltZW9mZGF5ICovCisjZW5kaWYKKyAgZ2V0dGltZW9mZGF5ICgmdGltZV9ub3csIE5VTEwpOworICAKKyAgZW5kX3RpbWUudHZfc2VjID0gdGltZV9ub3cudHZfc2VjICsgdGltZW91dF9taWxsaXNlY29uZHMgLyAxMDAwOworICBlbmRfdGltZS50dl9uc2VjID0gKHRpbWVfbm93LnR2X3VzZWMgKyAodGltZW91dF9taWxsaXNlY29uZHMgJSAxMDAwKSAqIDEwMDApICogMTAwMDsKKyAgaWYgKGVuZF90aW1lLnR2X25zZWMgPiAxMDAwKjEwMDAqMTAwMCkKKyAgICB7CisgICAgICBlbmRfdGltZS50dl9zZWMgKz0gMTsKKyAgICAgIGVuZF90aW1lLnR2X25zZWMgLT0gMTAwMCoxMDAwKjEwMDA7CisgICAgfQorCisgIHJlc3VsdCA9IHB0aHJlYWRfY29uZF90aW1lZHdhaXQgKCZjb25kLT5jb25kLCAmbXV0ZXgtPmxvY2ssICZlbmRfdGltZSk7CisgIAorICBpZiAocmVzdWx0ICE9IEVUSU1FRE9VVCkKKyAgICB7CisgICAgICBQVEhSRUFEX0NIRUNLICgicHRocmVhZF9jb25kX3RpbWVkd2FpdCIsIHJlc3VsdCk7CisgICAgfQorCisgIC8qIHJldHVybiB0cnVlIGlmIHdlIGRpZCBub3QgdGltZSBvdXQgKi8KKyAgcmV0dXJuIHJlc3VsdCAhPSBFVElNRURPVVQ7Cit9CisKK3ZvaWQKK19kYnVzX3BsYXRmb3JtX2NvbmR2YXJfd2FrZV9vbmUgKERCdXNDb25kVmFyICpjb25kKQoreworICBQVEhSRUFEX0NIRUNLICgicHRocmVhZF9jb25kX3NpZ25hbCIsIHB0aHJlYWRfY29uZF9zaWduYWwgKCZjb25kLT5jb25kKSk7Cit9CisKK3N0YXRpYyB2b2lkCitjaGVja19tb25vdG9uaWNfY2xvY2sgKHZvaWQpCit7CisjaWZkZWYgSEFWRV9NT05PVE9OSUNfQ0xPQ0sKKyAgc3RydWN0IHRpbWVzcGVjIGR1bW15OworICBpZiAoY2xvY2tfZ2V0cmVzIChDTE9DS19NT05PVE9OSUMsICZkdW1teSkgPT0gMCkKKyAgICBoYXZlX21vbm90b25pY19jbG9jayA9IFRSVUU7CisjZW5kaWYKK30KKworZGJ1c19ib29sX3QKK19kYnVzX3RocmVhZHNfaW5pdF9wbGF0Zm9ybV9zcGVjaWZpYyAodm9pZCkKK3sKKyAgLyogVGhlc2UgaGF2ZSBzdGF0aWMgdmFyaWFibGVzLCBhbmQgd2UgbmVlZCB0byBoYW5kbGUgYm90aCB0aGUgY2FzZQorICAgKiB3aGVyZSBkYnVzX3RocmVhZHNfaW5pdCgpIGhhcyBiZWVuIGNhbGxlZCBhbmQgd2hlbiBpdCBoYXNuJ3Q7CisgICAqIHNvIGluaXRpYWxpemUgdGhlbSBiZWZvcmUgYW55IHRocmVhZHMgYXJlIGFsbG93ZWQgdG8gZW50ZXIuCisgICAqLworICBjaGVja19tb25vdG9uaWNfY2xvY2sgKCk7CisgICh2b2lkKSBfZGJ1c19jaGVja19zZXR1aWQgKCk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBwdGhyZWFkX211dGV4X3QgaW5pdF9tdXRleCA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7CisKK3ZvaWQKK19kYnVzX3RocmVhZHNfbG9ja19wbGF0Zm9ybV9zcGVjaWZpYyAodm9pZCkKK3sKKyAgcHRocmVhZF9tdXRleF9sb2NrICgmaW5pdF9tdXRleCk7Cit9CisKK3ZvaWQKK19kYnVzX3RocmVhZHNfdW5sb2NrX3BsYXRmb3JtX3NwZWNpZmljICh2b2lkKQoreworICBwdGhyZWFkX211dGV4X3VubG9jayAoJmluaXRfbXV0ZXgpOworfQorCisjaWZkZWYgREJVU19FTkFCTEVfVkVSQk9TRV9NT0RFCisvKgorICogSWYgd2UgY2FuIGlkZW50aWZ5IHRoZSBjdXJyZW50IHByb2Nlc3MgYW5kL29yIHRocmVhZCwgcHJpbnQgdGhlbSB0byBzdGRlcnIgZm9sbG93ZWQgYnkgYSBjb2xvbi4KKyAqLwordm9pZAorX2RidXNfcHJpbnRfdGhyZWFkICh2b2lkKQoreworI2lmZGVmIF9fbGludXhfXworICAvKiB3ZSBrbm93IGEgcHRocmVhZF90IGlzIG51bWVyaWMgb24gTGludXggKi8KKyAgZnByaW50ZiAoc3RkZXJyLCAiJWx1OiAweCVseDogIiwgX2RidXNfcGlkX2Zvcl9sb2cgKCksICh1bnNpZ25lZCBsb25nKSBwdGhyZWFkX3NlbGYgKCkpOworI2Vsc2UKKyAgLyogaW4gcHJpbmNpcGxlIHB0aHJlYWRfdCBpc24ndCByZXF1aXJlZCB0byBiZSBwcmludGFibGUgKi8KKyAgZnByaW50ZiAoc3RkZXJyLCAiJWx1OiAiLCBfZGJ1c19waWRfZm9yX2xvZyAoKSk7CisjZW5kaWYKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLXN5c2RlcHMtdGhyZWFkLXdpbi5jIGIvZGJ1cy9kYnVzLXN5c2RlcHMtdGhyZWFkLXdpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1YzA5OGMKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtc3lzZGVwcy10aHJlYWQtd2luLmMKQEAgLTAsMCArMSwzMTIgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1zeXNkZXBzLXB0aHJlYWQuYyBJbXBsZW1lbnRzIHRocmVhZHMgdXNpbmcgV2luZG93cyB0aHJlYWRzIChpbnRlcm5hbCB0byBsaWJkYnVzKQorICogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgIFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgImRidXMtaW50ZXJuYWxzLmgiCisjaW5jbHVkZSAiZGJ1cy1zeXNkZXBzLmgiCisjaW5jbHVkZSAiZGJ1cy1zeXNkZXBzLXdpbi5oIgorI2luY2x1ZGUgImRidXMtdGhyZWFkcy5oIgorI2luY2x1ZGUgImRidXMtbGlzdC5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworc3RhdGljIGRidXNfYm9vbF90IGdsb2JhbF9pbml0X2RvbmUgPSBGQUxTRTsKK3N0YXRpYyBDUklUSUNBTF9TRUNUSU9OIGluaXRfbG9jazsKKworLyogQ2FsbGVkIGZyb20gQysrIGNvZGUgaW4gZGJ1cy1pbml0LXdpbi5jcHAuICovCit2b2lkCitfZGJ1c190aHJlYWRzX3dpbmRvd3NfaW5pdF9nbG9iYWwgKHZvaWQpCit7CisgIC8qIHRoaXMgZW5zdXJlcyB0aGF0IHRoZSBvYmplY3QgdGhhdCBhY3RzIGFzIG91ciBnbG9iYWwgY29uc3RydWN0b3IKKyAgICogYWN0dWFsbHkgZ2V0cyBsaW5rZWQgaW4gd2hlbiB3ZSdyZSBsaW5rZWQgc3RhdGljYWxseSAqLworICBfZGJ1c190aHJlYWRzX3dpbmRvd3NfZW5zdXJlX2N0b3JfbGlua2VkICgpOworCisgIEluaXRpYWxpemVDcml0aWNhbFNlY3Rpb24gKCZpbml0X2xvY2spOworICBnbG9iYWxfaW5pdF9kb25lID0gVFJVRTsKK30KKworc3RydWN0IERCdXNDb25kVmFyIHsKKyAgREJ1c0xpc3QgKmxpc3Q7ICAgICAgICAvKio8IGxpc3QgdGhyZWFkLWxvY2FsLXN0b3JlZCBldmVudHMgd2FpdGluZyBvbiB0aGUgY29uZCB2YXJpYWJsZSAqLworICBDUklUSUNBTF9TRUNUSU9OIGxvY2s7IC8qKjwgbG9jayBwcm90ZWN0aW5nIHRoZSBsaXN0ICovCit9OworCitzdGF0aWMgRFdPUkQgZGJ1c19jb25kX2V2ZW50X3RscyA9IFRMU19PVVRfT0ZfSU5ERVhFUzsKKworCitzdGF0aWMgSE1PRFVMRSBkYnVzX2RsbF9obW9kdWxlOworCit2b2lkICoKK19kYnVzX3dpbl9nZXRfZGxsX2htb2R1bGUgKHZvaWQpCit7CisgIHJldHVybiBkYnVzX2RsbF9obW9kdWxlOworfQorCisjaWZkZWYgREJVU19XSU5DRQorI2RlZmluZSBoaW5zdF90IEhBTkRMRQorI2Vsc2UKKyNkZWZpbmUgaGluc3RfdCBISU5TVEFOQ0UKKyNlbmRpZgorCitCT09MIFdJTkFQSSBEbGxNYWluIChoaW5zdF90LCBEV09SRCwgTFBWT0lEKTsKKworLyogV2UgbmVlZCB0aGlzIHRvIGZyZWUgdGhlIFRMUyBldmVudHMgb24gdGhyZWFkIGV4aXQgKi8KK0JPT0wgV0lOQVBJCitEbGxNYWluIChoaW5zdF90IGhpbnN0RExMLAorCSBEV09SRCAgICAgZmR3UmVhc29uLAorCSBMUFZPSUQgICAgbHB2UmVzZXJ2ZWQpCit7CisgIEhBTkRMRSBldmVudDsKKyAgc3dpdGNoIChmZHdSZWFzb24pIAorICAgIHsgCisgICAgY2FzZSBETExfUFJPQ0VTU19BVFRBQ0g6CisgICAgICBkYnVzX2RsbF9obW9kdWxlID0gaGluc3RETEw7CisgICAgICBicmVhazsKKyAgICBjYXNlIERMTF9USFJFQURfREVUQUNIOgorICAgICAgaWYgKGRidXNfY29uZF9ldmVudF90bHMgIT0gVExTX09VVF9PRl9JTkRFWEVTKQorCXsKKwkgIGV2ZW50ID0gVGxzR2V0VmFsdWUoZGJ1c19jb25kX2V2ZW50X3Rscyk7CisJICBDbG9zZUhhbmRsZSAoZXZlbnQpOworCSAgVGxzU2V0VmFsdWUoZGJ1c19jb25kX2V2ZW50X3RscywgTlVMTCk7CisJfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBETExfUFJPQ0VTU19ERVRBQ0g6IAorICAgICAgaWYgKGRidXNfY29uZF9ldmVudF90bHMgIT0gVExTX09VVF9PRl9JTkRFWEVTKQorCXsKKwkgIGV2ZW50ID0gVGxzR2V0VmFsdWUoZGJ1c19jb25kX2V2ZW50X3Rscyk7CisJICBDbG9zZUhhbmRsZSAoZXZlbnQpOworCSAgVGxzU2V0VmFsdWUoZGJ1c19jb25kX2V2ZW50X3RscywgTlVMTCk7CisKKwkgIFRsc0ZyZWUoZGJ1c19jb25kX2V2ZW50X3Rscyk7IAorCX0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6IAorICAgICAgYnJlYWs7IAorICAgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK0RCdXNDTXV0ZXggKgorX2RidXNfcGxhdGZvcm1fY211dGV4X25ldyAodm9pZCkKK3sKKyAgSEFORExFIGhhbmRsZTsKKyAgaGFuZGxlID0gQ3JlYXRlTXV0ZXggKE5VTEwsIEZBTFNFLCBOVUxMKTsKKyAgcmV0dXJuIChEQnVzQ011dGV4ICopIGhhbmRsZTsKK30KKworREJ1c1JNdXRleCAqCitfZGJ1c19wbGF0Zm9ybV9ybXV0ZXhfbmV3ICh2b2lkKQoreworICBIQU5ETEUgaGFuZGxlOworICBoYW5kbGUgPSBDcmVhdGVNdXRleCAoTlVMTCwgRkFMU0UsIE5VTEwpOworICByZXR1cm4gKERCdXNSTXV0ZXggKikgaGFuZGxlOworfQorCit2b2lkCitfZGJ1c19wbGF0Zm9ybV9jbXV0ZXhfZnJlZSAoREJ1c0NNdXRleCAqbXV0ZXgpCit7CisgIENsb3NlSGFuZGxlICgoSEFORExFICopIG11dGV4KTsKK30KKwordm9pZAorX2RidXNfcGxhdGZvcm1fcm11dGV4X2ZyZWUgKERCdXNSTXV0ZXggKm11dGV4KQoreworICBDbG9zZUhhbmRsZSAoKEhBTkRMRSAqKSBtdXRleCk7Cit9CisKK3ZvaWQKK19kYnVzX3BsYXRmb3JtX2NtdXRleF9sb2NrIChEQnVzQ011dGV4ICptdXRleCkKK3sKKyAgV2FpdEZvclNpbmdsZU9iamVjdCAoKEhBTkRMRSAqKSBtdXRleCwgSU5GSU5JVEUpOworfQorCit2b2lkCitfZGJ1c19wbGF0Zm9ybV9ybXV0ZXhfbG9jayAoREJ1c1JNdXRleCAqbXV0ZXgpCit7CisgIFdhaXRGb3JTaW5nbGVPYmplY3QgKChIQU5ETEUgKikgbXV0ZXgsIElORklOSVRFKTsKK30KKwordm9pZAorX2RidXNfcGxhdGZvcm1fY211dGV4X3VubG9jayAoREJ1c0NNdXRleCAqbXV0ZXgpCit7CisgIFJlbGVhc2VNdXRleCAoKEhBTkRMRSAqKSBtdXRleCk7Cit9CisKK3ZvaWQKK19kYnVzX3BsYXRmb3JtX3JtdXRleF91bmxvY2sgKERCdXNSTXV0ZXggKm11dGV4KQoreworICBSZWxlYXNlTXV0ZXggKChIQU5ETEUgKikgbXV0ZXgpOworfQorCitEQnVzQ29uZFZhciAqCitfZGJ1c19wbGF0Zm9ybV9jb25kdmFyX25ldyAodm9pZCkKK3sKKyAgREJ1c0NvbmRWYXIgKmNvbmQ7CisgICAgCisgIGNvbmQgPSBkYnVzX25ldyAoREJ1c0NvbmRWYXIsIDEpOworICBpZiAoY29uZCA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworICAKKyAgY29uZC0+bGlzdCA9IE5VTEw7CisgIAorICBJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uICgmY29uZC0+bG9jayk7CisgIHJldHVybiBjb25kOworfQorCit2b2lkCitfZGJ1c19wbGF0Zm9ybV9jb25kdmFyX2ZyZWUgKERCdXNDb25kVmFyICpjb25kKQoreworICBEZWxldGVDcml0aWNhbFNlY3Rpb24gKCZjb25kLT5sb2NrKTsKKyAgX2RidXNfbGlzdF9jbGVhciAoJmNvbmQtPmxpc3QpOworICBkYnVzX2ZyZWUgKGNvbmQpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK19kYnVzX2NvbmR2YXJfd2FpdF93aW4zMiAoREJ1c0NvbmRWYXIgKmNvbmQsCisJCQkgIERCdXNDTXV0ZXggKm11dGV4LAorCQkJICBpbnQgbWlsbGlzZWNvbmRzKQoreworICBEV09SRCByZXR2YWw7CisgIGRidXNfYm9vbF90IHJldDsKKyAgSEFORExFIGV2ZW50ID0gVGxzR2V0VmFsdWUgKGRidXNfY29uZF9ldmVudF90bHMpOworCisgIGlmICghZXZlbnQpCisgICAgeworICAgICAgZXZlbnQgPSBDcmVhdGVFdmVudCAoMCwgRkFMU0UsIEZBTFNFLCBOVUxMKTsKKyAgICAgIGlmIChldmVudCA9PSAwKQorCXJldHVybiBGQUxTRTsKKyAgICAgIFRsc1NldFZhbHVlIChkYnVzX2NvbmRfZXZlbnRfdGxzLCBldmVudCk7CisgICAgfQorCisgIEVudGVyQ3JpdGljYWxTZWN0aW9uICgmY29uZC0+bG9jayk7CisKKyAgLyogVGhlIGV2ZW50IG11c3Qgbm90IGJlIHNpZ25hbGVkLiBDaGVjayB0aGlzICovCisgIF9kYnVzX2Fzc2VydCAoV2FpdEZvclNpbmdsZU9iamVjdCAoZXZlbnQsIDApID09IFdBSVRfVElNRU9VVCk7CisKKyAgcmV0ID0gX2RidXNfbGlzdF9hcHBlbmQgKCZjb25kLT5saXN0LCBldmVudCk7CisgIAorICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiAoJmNvbmQtPmxvY2spOworICAKKyAgaWYgKCFyZXQpCisgICAgcmV0dXJuIEZBTFNFOyAvKiBQcmVwZW5kIGZhaWxlZCAqLworCisgIF9kYnVzX3BsYXRmb3JtX2NtdXRleF91bmxvY2sgKG11dGV4KTsKKyAgcmV0dmFsID0gV2FpdEZvclNpbmdsZU9iamVjdCAoZXZlbnQsIG1pbGxpc2Vjb25kcyk7CisgIF9kYnVzX3BsYXRmb3JtX2NtdXRleF9sb2NrIChtdXRleCk7CisgIAorICBpZiAocmV0dmFsID09IFdBSVRfVElNRU9VVCkKKyAgICB7CisgICAgICBFbnRlckNyaXRpY2FsU2VjdGlvbiAoJmNvbmQtPmxvY2spOworICAgICAgX2RidXNfbGlzdF9yZW1vdmUgKCZjb25kLT5saXN0LCBldmVudCk7CisKKyAgICAgIC8qIEluIHRoZSBtZWFudGltZSB3ZSBjb3VsZCBoYXZlIGJlZW4gc2lnbmFsZWQsIHNvIHdlIG11c3QgYWdhaW4KKyAgICAgICAqIHdhaXQgZm9yIHRoZSBzaWduYWwsIHRoaXMgdGltZSB3aXRoIG5vIHRpbWVvdXQsIHRvIHJlc2V0CisgICAgICAgKiBpdC4gcmV0dmFsIGlzIHNldCBhZ2FpbiB0byBob25vdXIgdGhlIGxhdGUgYXJyaXZhbCBvZiB0aGUKKyAgICAgICAqIHNpZ25hbCAqLworICAgICAgcmV0dmFsID0gV2FpdEZvclNpbmdsZU9iamVjdCAoZXZlbnQsIDApOworCisgICAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiAoJmNvbmQtPmxvY2spOworICAgIH0KKworI2lmbmRlZiBEQlVTX0RJU0FCTEVfQVNTRVJUCisgIEVudGVyQ3JpdGljYWxTZWN0aW9uICgmY29uZC0+bG9jayk7CisKKyAgLyogTm93IGV2ZW50IG11c3Qgbm90IGJlIGluc2lkZSB0aGUgYXJyYXksIGNoZWNrIHRoaXMgKi8KKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19saXN0X3JlbW92ZSAoJmNvbmQtPmxpc3QsIGV2ZW50KSA9PSBGQUxTRSk7CisKKyAgTGVhdmVDcml0aWNhbFNlY3Rpb24gKCZjb25kLT5sb2NrKTsKKyNlbmRpZiAvKiAhR19ESVNBQkxFX0FTU0VSVCAqLworCisgIHJldHVybiByZXR2YWwgIT0gV0FJVF9USU1FT1VUOworfQorCit2b2lkCitfZGJ1c19wbGF0Zm9ybV9jb25kdmFyX3dhaXQgKERCdXNDb25kVmFyICpjb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ011dGV4ICAqbXV0ZXgpCit7CisgIF9kYnVzX2NvbmR2YXJfd2FpdF93aW4zMiAoY29uZCwgbXV0ZXgsIElORklOSVRFKTsKK30KKworZGJ1c19ib29sX3QKK19kYnVzX3BsYXRmb3JtX2NvbmR2YXJfd2FpdF90aW1lb3V0IChEQnVzQ29uZFZhciAgICAgICAgICAgICAgICpjb25kLAorCQkJCSAgICAgREJ1c0NNdXRleCAgICAgICAgICAgICAgICAqbXV0ZXgsCisJCQkJICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0X21pbGxpc2Vjb25kcykKK3sKKyAgcmV0dXJuIF9kYnVzX2NvbmR2YXJfd2FpdF93aW4zMiAoY29uZCwgbXV0ZXgsIHRpbWVvdXRfbWlsbGlzZWNvbmRzKTsKK30KKwordm9pZAorX2RidXNfcGxhdGZvcm1fY29uZHZhcl93YWtlX29uZSAoREJ1c0NvbmRWYXIgKmNvbmQpCit7CisgIEVudGVyQ3JpdGljYWxTZWN0aW9uICgmY29uZC0+bG9jayk7CisgIAorICBpZiAoY29uZC0+bGlzdCAhPSBOVUxMKQorICAgIHsKKyAgICAgIFNldEV2ZW50IChfZGJ1c19saXN0X3BvcF9maXJzdCAoJmNvbmQtPmxpc3QpKTsKKyAgICAgIC8qIEF2b2lkIGxpdmUgbG9jayBieSBwdXNoaW5nIHRoZSB3YWl0ZXIgdG8gdGhlIG11dGV4IGxvY2sKKyAgICAgICAgIGluc3RydWN0aW9uLCB3aGljaCBpcyBmYWlyLiAgSWYgd2UgZG9uJ3QgZG8gdGhpcywgd2UgY291bGQKKyAgICAgICAgIGFjcXVpcmUgdGhlIGNvbmRpdGlvbiB2YXJpYWJsZSBhZ2FpbiBiZWZvcmUgdGhlIHdhaXRlciBoYXMgYQorICAgICAgICAgY2hhbmNlIGl0c2VsZiwgbGVhZGluZyB0byBzdGFydmF0aW9uLiAgKi8KKyAgICAgIFNsZWVwICgwKTsKKyAgICB9CisgIExlYXZlQ3JpdGljYWxTZWN0aW9uICgmY29uZC0+bG9jayk7Cit9CisKK2RidXNfYm9vbF90CitfZGJ1c190aHJlYWRzX2luaXRfcGxhdGZvcm1fc3BlY2lmaWMgKHZvaWQpCit7CisgIC8qIFdlIHJldXNlIHRoaXMgb3ZlciBzZXZlcmFsIGdlbmVyYXRpb25zLCBiZWNhdXNlIHdlIGNhbid0CisgICAqIGZyZWUgdGhlIGV2ZW50cyBvbmNlIHRoZXkgYXJlIGluIHVzZQorICAgKi8KKyAgaWYgKGRidXNfY29uZF9ldmVudF90bHMgPT0gVExTX09VVF9PRl9JTkRFWEVTKQorICAgIHsKKyAgICAgIGRidXNfY29uZF9ldmVudF90bHMgPSBUbHNBbGxvYyAoKTsKKyAgICAgIGlmIChkYnVzX2NvbmRfZXZlbnRfdGxzID09IFRMU19PVVRfT0ZfSU5ERVhFUykKKwlyZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCit2b2lkCitfZGJ1c190aHJlYWRzX2xvY2tfcGxhdGZvcm1fc3BlY2lmaWMgKHZvaWQpCit7CisgIF9kYnVzX2Fzc2VydCAoZ2xvYmFsX2luaXRfZG9uZSk7CisgIEVudGVyQ3JpdGljYWxTZWN0aW9uICgmaW5pdF9sb2NrKTsKK30KKwordm9pZAorX2RidXNfdGhyZWFkc191bmxvY2tfcGxhdGZvcm1fc3BlY2lmaWMgKHZvaWQpCit7CisgIF9kYnVzX2Fzc2VydCAoZ2xvYmFsX2luaXRfZG9uZSk7CisgIExlYXZlQ3JpdGljYWxTZWN0aW9uICgmaW5pdF9sb2NrKTsKK30KKworI2lmZGVmIERCVVNfRU5BQkxFX1ZFUkJPU0VfTU9ERQordm9pZAorX2RidXNfcHJpbnRfdGhyZWFkICh2b2lkKQoreworICBmcHJpbnRmIChzdGRlcnIsICIlbHU6IDB4JTA0bHg6ICIsIF9kYnVzX3BpZF9mb3JfbG9nICgpLCBHZXRDdXJyZW50VGhyZWFkSWQgKCkpOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtc3lzZGVwcy11bml4LmMgYi9kYnVzL2RidXMtc3lzZGVwcy11bml4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTUxMWFmYwotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1zeXNkZXBzLXVuaXguYwpAQCAtMCwwICsxLDQ3NjEgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1zeXNkZXBzLXVuaXguYyBXcmFwcGVycyBhcm91bmQgVU5JWCBzeXN0ZW0vbGliYyBmZWF0dXJlcyAoaW50ZXJuYWwgdG8gRC1CdXMgaW1wbGVtZW50YXRpb24pCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzLCAyMDA2ICBSZWQgSGF0LCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgQ29kZUZhY3RvcnkgQUIKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKworI2luY2x1ZGUgImRidXMtaW50ZXJuYWxzLmgiCisjaW5jbHVkZSAiZGJ1cy1zeXNkZXBzLmgiCisjaW5jbHVkZSAiZGJ1cy1zeXNkZXBzLXVuaXguaCIKKyNpbmNsdWRlICJkYnVzLXRocmVhZHMuaCIKKyNpbmNsdWRlICJkYnVzLXByb3RvY29sLmgiCisjaW5jbHVkZSAiZGJ1cy1maWxlLmgiCisjaW5jbHVkZSAiZGJ1cy10cmFuc3BvcnQuaCIKKyNpbmNsdWRlICJkYnVzLXN0cmluZy5oIgorI2luY2x1ZGUgImRidXMtdXNlcmRiLmgiCisjaW5jbHVkZSAiZGJ1cy1saXN0LmgiCisjaW5jbHVkZSAiZGJ1cy1jcmVkZW50aWFscy5oIgorI2luY2x1ZGUgImRidXMtbm9uY2UuaCIKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSA8c3lzL3VuLmg+CisjaW5jbHVkZSA8cHdkLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPGxvY2FsZS5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxuZXRpbmV0L3RjcC5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSA8Z3JwLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKyNpZmRlZiBIQVZFX0VSUk5PX0gKKyNpbmNsdWRlIDxlcnJuby5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TWVNMT0dfSAorI2luY2x1ZGUgPHN5c2xvZy5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9XUklURVYKKyNpbmNsdWRlIDxzeXMvdWlvLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1BPTEwKKyNpbmNsdWRlIDxzeXMvcG9sbC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9CQUNLVFJBQ0UKKyNpbmNsdWRlIDxleGVjaW5mby5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9HRVRQRUVSVUNSRUQKKyNpbmNsdWRlIDx1Y3JlZC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9BTExPQ0FfSAorI2luY2x1ZGUgPGFsbG9jYS5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX0FEVAorI2luY2x1ZGUgPGJzbS9hZHQuaD4KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9TWVNURU1ECisjaW5jbHVkZSA8c3lzdGVtZC9zZC1kYWVtb24uaD4KKyNlbmRpZgorCisjaWYgIURCVVNfVVNFX1NZTkMKKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjZW5kaWYKKworI2lmbmRlZiBPX0JJTkFSWQorI2RlZmluZSBPX0JJTkFSWSAwCisjZW5kaWYKKworI2lmbmRlZiBBSV9BRERSQ09ORklHCisjZGVmaW5lIEFJX0FERFJDT05GSUcgMAorI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9TT0NLTEVOX1QKKyNkZWZpbmUgc29ja2xlbl90IGludAorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX3N1bikgfHwgZGVmaW5lZCAoX19zdW5fXykKKy8qCisgKiBDTVNfU1BBQ0UgZXRjLiBkZWZpbml0aW9ucyBmb3IgU29sYXJpcyA8IDEwLCBiYXNlZCBvbgorICogICBodHRwOi8vbWFpbG1hbi52aWRlb2xhbi5vcmcvcGlwZXJtYWlsL3ZsYy1kZXZlbC8yMDA2LU1heS8wMjQ0MDIuaHRtbAorICogdmlhCisgKiAgIGh0dHA6Ly93aWtpLm9wZW5jc3cub3JnL3BvcnRpbmctZmFxI3RvYzEwCisgKgorICogVGhlc2UgYXJlIG9ubHkgcmVkZWZpbmVkIGZvciBTb2xhcmlzLCBmb3Igbm93OiBpZiB5b3VyIE9TIG5lZWRzIHRoZXNlIHRvbywKKyAqIHBsZWFzZSBmaWxlIGEgYnVnLiAoT3IgcHJlZmVyYWJseSwgaW1wcm92ZSB5b3VyIE9TIHNvIHRoZXkncmUgbm90IG5lZWRlZC4pCisgKi8KKworIyBpZm5kZWYgQ01TR19BTElHTgorIyAgIGlmZGVmIF9fc3VuX18KKyMgICAgIGRlZmluZSBDTVNHX0FMSUdOKGxlbikgX0NNU0dfREFUQV9BTElHTiAobGVuKQorIyAgIGVsc2UKKyAgICAgIC8qIGFsaWduaW5nIHRvIHNpemVvZiAobG9uZykgaXMgYXNzdW1lZCB0byBiZSBwb3J0YWJsZSAoZmQubyM0MDIzNSkgKi8KKyMgICAgIGRlZmluZSBDTVNHX0FMSUdOKGxlbikgKCgobGVuKSArIHNpemVvZiAobG9uZykgLSAxKSAmIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oc2l6ZW9mIChsb25nKSAtIDEpKQorIyAgIGVuZGlmCisjIGVuZGlmCisKKyMgaWZuZGVmIENNU0dfU1BBQ0UKKyMgICBkZWZpbmUgQ01TR19TUEFDRShsZW4pIChDTVNHX0FMSUdOIChzaXplb2YgKHN0cnVjdCBjbXNnaGRyKSkgKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ01TR19BTElHTiAobGVuKSkKKyMgZW5kaWYKKworIyBpZm5kZWYgQ01TR19MRU4KKyMgICBkZWZpbmUgQ01TR19MRU4obGVuKSAoQ01TR19BTElHTiAoc2l6ZW9mIChzdHJ1Y3QgY21zZ2hkcikpICsgKGxlbikpCisjIGVuZGlmCisKKyNlbmRpZiAvKiBTb2xhcmlzICovCisKKy8qKgorICogRW5zdXJlIHRoYXQgdGhlIHN0YW5kYXJkIGZpbGUgZGVzY3JpcHRvcnMgc3RkaW4sIHN0ZG91dCBhbmQgc3RkZXJyCisgKiBhcmUgb3BlbiwgYnkgb3BlbmluZyAvZGV2L251bGwgaWYgbmVjZXNzYXJ5LgorICoKKyAqIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgdXNlIERCdXNFcnJvciwgdG8gYXZvaWQgY2FsbGluZyBtYWxsb2MoKSwgc28KKyAqIHRoYXQgaXQgY2FuIGJlIHVzZWQgaW4gY29udGV4dHMgd2hlcmUgYW4gYXN5bmMtc2lnbmFsLXNhZmUgZnVuY3Rpb24KKyAqIGlzIHJlcXVpcmVkIChmb3IgZXhhbXBsZSBhZnRlciBmb3JrKCkpLiBJbnN0ZWFkLCBvbiBmYWlsdXJlIGl0IHNldHMKKyAqIGVycm5vIGFuZCByZXR1cm5zIHNvbWV0aGluZyBsaWtlICJGYWlsZWQgdG8gb3BlbiAvZGV2L251bGwiIGluCisgKiAqZXJyb3Jfc3RyX3AuIENhbGxlcnMgYXJlIGV4cGVjdGVkIHRvIGNvbWJpbmUgKmVycm9yX3N0cl9wCisgKiB3aXRoIF9kYnVzX3N0cmVycm9yIChlcnJubykgdG8gZ2V0IGEgZnVsbCBlcnJvciByZXBvcnQuCisgKgorICogVGhpcyBmdW5jdGlvbiBjYW4gb25seSBiZSBjYWxsZWQgd2hpbGUgc2luZ2xlLXRocmVhZGVkOiBlaXRoZXIgZHVyaW5nCisgKiBzdGFydHVwIG9mIGFuIGV4ZWN1dGFibGUsIG9yIGFmdGVyIGZvcmsoKS4KKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2Vuc3VyZV9zdGFuZGFyZF9mZHMgKERCdXNFbnN1cmVTdGFuZGFyZEZkc0ZsYWdzICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAgICAgICAgICAqKmVycm9yX3N0cl9wKQoreworICBzdGF0aWMgaW50IGNvbnN0IHJlbGV2YW50X2ZsYWdbXSA9IHsgREJVU19GT1JDRV9TVERJTl9OVUxMLAorICAgICAgREJVU19GT1JDRV9TVERPVVRfTlVMTCwKKyAgICAgIERCVVNfRk9SQ0VfU1RERVJSX05VTEwgfTsKKyAgLyogU2hvdWxkIGFsd2F5cyBnZXQgcmVwbGFjZWQgd2l0aCB0aGUgcmVhbCBlcnJvciBiZWZvcmUgdXNlICovCisgIGNvbnN0IGNoYXIgKmVycm9yX3N0ciA9ICJGYWlsZWQgbXlzdGVyaW91c2x5IjsKKyAgaW50IGRldm51bGwgPSAtMTsKKyAgaW50IHNhdmVkX2Vycm5vOworICAvKiBUaGlzIGZ1bmN0aW9uIHJlbGllcyBvbiB0aGUgc3RhbmRhcmQgZmRzIGhhdmluZyB0aGVpciBQT1NJWCB2YWx1ZXMuICovCisgIF9EQlVTX1NUQVRJQ19BU1NFUlQgKFNURElOX0ZJTEVOTyA9PSAwKTsKKyAgX0RCVVNfU1RBVElDX0FTU0VSVCAoU1RET1VUX0ZJTEVOTyA9PSAxKTsKKyAgX0RCVVNfU1RBVElDX0FTU0VSVCAoU1RERVJSX0ZJTEVOTyA9PSAyKTsKKyAgaW50IGk7CisKKyAgZm9yIChpID0gU1RESU5fRklMRU5POyBpIDw9IFNUREVSUl9GSUxFTk87IGkrKykKKyAgICB7CisgICAgICAvKiBCZWNhdXNlIHdlIHJlbHkgb24gYmVpbmcgc2luZ2xlLXRocmVhZGVkLCBhbmQgd2Ugd2FudCB0aGUKKyAgICAgICAqIHN0YW5kYXJkIGZkcyB0byBub3QgYmUgY2xvc2Utb24tZXhlYywgd2UgZG9uJ3Qgc2V0IGl0CisgICAgICAgKiBjbG9zZS1vbi1leGVjLiAqLworICAgICAgaWYgKGRldm51bGwgPCBpKQorICAgICAgICBkZXZudWxsID0gb3BlbiAoIi9kZXYvbnVsbCIsIE9fUkRXUik7CisKKyAgICAgIGlmIChkZXZudWxsIDwgMCkKKyAgICAgICAgeworICAgICAgICAgIGVycm9yX3N0ciA9ICJGYWlsZWQgdG8gb3BlbiAvZGV2L251bGwiOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgIC8qIFdlIGFscmVhZHkgb3BlbmVkIGFsbCBmZHMgPCBpLCBzbyB0aGUgb25seSB3YXkgdGhpcyBhc3NlcnRpb24KKyAgICAgICAqIGNvdWxkIGZhaWwgaXMgaWYgYW5vdGhlciB0aHJlYWQgY2xvc2VkIG9uZSwgYW5kIHdlIGRvY3VtZW50CisgICAgICAgKiB0aGlzIGZ1bmN0aW9uIGFzIG5vdCBzYWZlIGZvciBtdWx0aS10aHJlYWRpbmcuICovCisgICAgICBfZGJ1c19hc3NlcnQgKGRldm51bGwgPj0gaSk7CisKKyAgICAgIGlmIChkZXZudWxsICE9IGkgJiYgKGZsYWdzICYgcmVsZXZhbnRfZmxhZ1tpXSkgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgIGlmIChkdXAyIChkZXZudWxsLCBpKSA8IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGVycm9yX3N0ciA9ICJGYWlsZWQgdG8gZHVwMiAvZGV2L251bGwgb250byBhIHN0YW5kYXJkIGZkIjsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgZXJyb3Jfc3RyID0gTlVMTDsKKworb3V0OgorICBzYXZlZF9lcnJubyA9IGVycm5vOworCisgIGlmIChkZXZudWxsID4gU1RERVJSX0ZJTEVOTykKKyAgICBjbG9zZSAoZGV2bnVsbCk7CisKKyAgaWYgKGVycm9yX3N0cl9wICE9IE5VTEwpCisgICAgKmVycm9yX3N0cl9wID0gZXJyb3Jfc3RyOworCisgIGVycm5vID0gc2F2ZWRfZXJybm87CisgIHJldHVybiAoZXJyb3Jfc3RyID09IE5VTEwpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QgX2RidXNfc2V0X2ZkX25vbmJsb2NraW5nIChpbnQgICAgICAgICAgICAgZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpOworCitzdGF0aWMgZGJ1c19ib29sX3QKK19kYnVzX29wZW5fc29ja2V0IChpbnQgICAgICAgICAgICAgICpmZF9wLAorICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGRvbWFpbiwKKyAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICB0eXBlLAorICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworI2lmZGVmIFNPQ0tfQ0xPRVhFQworICBkYnVzX2Jvb2xfdCBjbG9leGVjX2RvbmU7CisKKyAgKmZkX3AgPSBzb2NrZXQgKGRvbWFpbiwgdHlwZSB8IFNPQ0tfQ0xPRVhFQywgcHJvdG9jb2wpOworICBjbG9leGVjX2RvbmUgPSAqZmRfcCA+PSAwOworCisgIC8qIENoZWNrIGlmIGtlcm5lbCBzZWVtcyB0byBiZSB0b28gb2xkIHRvIGtub3cgU09DS19DTE9FWEVDICovCisgIGlmICgqZmRfcCA8IDAgJiYgKGVycm5vID09IEVJTlZBTCB8fCBlcnJubyA9PSBFUFJPVE9UWVBFKSkKKyNlbmRpZgorICAgIHsKKyAgICAgICpmZF9wID0gc29ja2V0IChkb21haW4sIHR5cGUsIHByb3RvY29sKTsKKyAgICB9CisKKyAgaWYgKCpmZF9wID49IDApCisgICAgeworI2lmZGVmIFNPQ0tfQ0xPRVhFQworICAgICAgaWYgKCFjbG9leGVjX2RvbmUpCisjZW5kaWYKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX2ZkX3NldF9jbG9zZV9vbl9leGVjKCpmZF9wKTsKKyAgICAgICAgfQorCisgICAgICBfZGJ1c192ZXJib3NlICgic29ja2V0IGZkICVkIG9wZW5lZFxuIiwgKmZkX3ApOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IoZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnJubyksCisgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIG9wZW4gc29ja2V0OiAlcyIsCisgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9Cit9CisKKy8qKgorICogT3BlbnMgYSBVTklYIGRvbWFpbiBzb2NrZXQgKGFzIGluIHRoZSBzb2NrZXQoKSBjYWxsKS4KKyAqIERvZXMgbm90IGJpbmQgdGhlIHNvY2tldC4KKyAqCisgKiBUaGlzIHdpbGwgc2V0IEZEX0NMT0VYRUMgZm9yIHRoZSBzb2NrZXQgcmV0dXJuZWQKKyAqCisgKiBAcGFyYW0gZmQgcmV0dXJuIGxvY2F0aW9uIGZvciBzb2NrZXQgZGVzY3JpcHRvcgorICogQHBhcmFtIGVycm9yIHJldHVybiBsb2NhdGlvbiBmb3IgYW4gZXJyb3IKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBlcnJvciBpcyBzZXQKKyAqLworc3RhdGljIGRidXNfYm9vbF90CitfZGJ1c19vcGVuX3VuaXhfc29ja2V0IChpbnQgICAgICAgICAgICAgICpmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICByZXR1cm4gX2RidXNfb3Blbl9zb2NrZXQoZmQsIFBGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwLCBlcnJvcik7Cit9CisKKy8qKgorICogQ2xvc2VzIGEgc29ja2V0LiBTaG91bGQgbm90IGJlIHVzZWQgb24gbm9uLXNvY2tldAorICogZmlsZSBkZXNjcmlwdG9ycyBvciBoYW5kbGVzLgorICoKKyAqIEBwYXJhbSBmZCB0aGUgc29ja2V0CisgKiBAcGFyYW0gZXJyb3IgcmV0dXJuIGxvY2F0aW9uIGZvciBhbiBlcnJvcgorICogQHJldHVybnMgI0ZBTFNFIGlmIGVycm9yIGlzIHNldAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfY2xvc2Vfc29ja2V0IChEQnVzU29ja2V0ICAgICAgICBmZCwKKyAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCit7CisgIHJldHVybiBfZGJ1c19jbG9zZSAoZmQuZmQsIGVycm9yKTsKK30KKworLyoqCisgKiBMaWtlIF9kYnVzX3JlYWQoKSwgYnV0IG9ubHkgd29ya3Mgb24gc29ja2V0cyBzbyBpcworICogYXZhaWxhYmxlIG9uIFdpbmRvd3MuCisgKgorICogQHBhcmFtIGZkIHRoZSBzb2NrZXQKKyAqIEBwYXJhbSBidWZmZXIgc3RyaW5nIHRvIGFwcGVuZCBkYXRhIHRvCisgKiBAcGFyYW0gY291bnQgbWF4IGFtb3VudCBvZiBkYXRhIHRvIHJlYWQKKyAqIEByZXR1cm5zIG51bWJlciBvZiBieXRlcyBhcHBlbmRlZCB0byB0aGUgc3RyaW5nCisgKi8KK2ludAorX2RidXNfcmVhZF9zb2NrZXQgKERCdXNTb2NrZXQgICAgICAgIGZkLAorICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBjb3VudCkKK3sKKyAgcmV0dXJuIF9kYnVzX3JlYWQgKGZkLmZkLCBidWZmZXIsIGNvdW50KTsKK30KKworLyoqCisgKiBMaWtlIF9kYnVzX3dyaXRlKCksIGJ1dCBvbmx5IHN1cHBvcnRzIHNvY2tldHMKKyAqIGFuZCBpcyB0aHVzIGF2YWlsYWJsZSBvbiBXaW5kb3dzLgorICoKKyAqIEBwYXJhbSBmZCB0aGUgZmlsZSBkZXNjcmlwdG9yIHRvIHdyaXRlCisgKiBAcGFyYW0gYnVmZmVyIHRoZSBidWZmZXIgdG8gd3JpdGUgZGF0YSBmcm9tCisgKiBAcGFyYW0gc3RhcnQgdGhlIGZpcnN0IGJ5dGUgaW4gdGhlIGJ1ZmZlciB0byB3cml0ZQorICogQHBhcmFtIGxlbiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHRyeSB0byB3cml0ZQorICogQHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuIG9yIC0xIG9uIGVycm9yCisgKi8KK2ludAorX2RidXNfd3JpdGVfc29ja2V0IChEQnVzU29ja2V0ICAgICAgICBmZCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgbGVuKQoreworI2lmIEhBVkVfREVDTF9NU0dfTk9TSUdOQUwKKyAgY29uc3QgY2hhciAqZGF0YTsKKyAgaW50IGJ5dGVzX3dyaXR0ZW47CisKKyAgZGF0YSA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YV9sZW4gKGJ1ZmZlciwgc3RhcnQsIGxlbik7CisKKyBhZ2FpbjoKKworICBieXRlc193cml0dGVuID0gc2VuZCAoZmQuZmQsIGRhdGEsIGxlbiwgTVNHX05PU0lHTkFMKTsKKworICBpZiAoYnl0ZXNfd3JpdHRlbiA8IDAgJiYgZXJybm8gPT0gRUlOVFIpCisgICAgZ290byBhZ2FpbjsKKworICByZXR1cm4gYnl0ZXNfd3JpdHRlbjsKKworI2Vsc2UKKyAgcmV0dXJuIF9kYnVzX3dyaXRlIChmZC5mZCwgYnVmZmVyLCBzdGFydCwgbGVuKTsKKyNlbmRpZgorfQorCisvKioKKyAqIExpa2UgX2RidXNfcmVhZF9zb2NrZXQoKSBidXQgYWxzbyB0cmllcyB0byByZWFkIHVuaXggZmRzIGZyb20gdGhlCisgKiBzb2NrZXQuIFdoZW4gdGhlcmUgYXJlIG1vcmUgZmRzIHRvIHJlYWQgdGhhbiBzcGFjZSBpbiB0aGUgYXJyYXkKKyAqIHBhc3NlZCB0aGlzIGZ1bmN0aW9uIHdpbGwgZmFpbCB3aXRoIEVOT1NQQy4KKyAqCisgKiBAcGFyYW0gZmQgdGhlIHNvY2tldAorICogQHBhcmFtIGJ1ZmZlciBzdHJpbmcgdG8gYXBwZW5kIGRhdGEgdG8KKyAqIEBwYXJhbSBjb3VudCBtYXggYW1vdW50IG9mIGRhdGEgdG8gcmVhZAorICogQHBhcmFtIGZkcyBhcnJheSB0byBwbGFjZSByZWFkIGZpbGUgZGVzY3JpcHRvcnMgaW4KKyAqIEBwYXJhbSBuX2ZkcyBvbiBpbnB1dCBzcGFjZSBpbiBmZHMgYXJyYXksIG9uIG91dHB1dCBob3cgbWFueSBmZHMgYWN0dWFsbHkgZ290IHJlYWQKKyAqIEByZXR1cm5zIG51bWJlciBvZiBieXRlcyBhcHBlbmRlZCB0byBzdHJpbmcKKyAqLworaW50CitfZGJ1c19yZWFkX3NvY2tldF93aXRoX3VuaXhfZmRzIChEQnVzU29ja2V0ICAgICAgICBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAqZmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICAgICAqbl9mZHMpIHsKKyNpZm5kZWYgSEFWRV9VTklYX0ZEX1BBU1NJTkcKKyAgaW50IHI7CisKKyAgaWYgKChyID0gX2RidXNfcmVhZF9zb2NrZXQoZmQsIGJ1ZmZlciwgY291bnQpKSA8IDApCisgICAgcmV0dXJuIHI7CisKKyAgKm5fZmRzID0gMDsKKyAgcmV0dXJuIHI7CisKKyNlbHNlCisgIGludCBieXRlc19yZWFkOworICBpbnQgc3RhcnQ7CisgIHN0cnVjdCBtc2doZHIgbTsKKyAgc3RydWN0IGlvdmVjIGlvdjsKKworICBfZGJ1c19hc3NlcnQgKGNvdW50ID49IDApOworICBfZGJ1c19hc3NlcnQgKCpuX2ZkcyA8PSBEQlVTX01BWElNVU1fTUVTU0FHRV9VTklYX0ZEUyk7CisKKyAgc3RhcnQgPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoYnVmZmVyKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19sZW5ndGhlbiAoYnVmZmVyLCBjb3VudCkpCisgICAgeworICAgICAgZXJybm8gPSBFTk9NRU07CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIF9EQlVTX1pFUk8oaW92KTsKKyAgaW92Lmlvdl9iYXNlID0gX2RidXNfc3RyaW5nX2dldF9kYXRhX2xlbiAoYnVmZmVyLCBzdGFydCwgY291bnQpOworICBpb3YuaW92X2xlbiA9IGNvdW50OworCisgIF9EQlVTX1pFUk8obSk7CisgIG0ubXNnX2lvdiA9ICZpb3Y7CisgIG0ubXNnX2lvdmxlbiA9IDE7CisKKyAgLyogSG1tLCB3ZSBoYXZlIG5vIGNsdWUgaG93IGxvbmcgdGhlIGNvbnRyb2wgZGF0YSB3aWxsIGFjdHVhbGx5IGJlCisgICAgIHRoYXQgaXMgcXVldWVkIGZvciB1cy4gVGhlIGxlYXN0IHdlIGNhbiBkbyBpcyBhc3N1bWUgdGhhdCB0aGUKKyAgICAgY2FsbGVyIGtub3dzLiBIZW5jZSBsZXQncyBtYWtlIHNwYWNlIGZvciB0aGUgbnVtYmVyIG9mIGZkcyB0aGF0CisgICAgIHdlIHNoYWxsIHJlYWQgYXQgbWF4IHBsdXMgdGhlIGNtc2cgaGVhZGVyLiAqLworICBtLm1zZ19jb250cm9sbGVuID0gQ01TR19TUEFDRSgqbl9mZHMgKiBzaXplb2YoaW50KSk7CisKKyAgLyogSXQncyBwcm9iYWJseSBzYWZlIHRvIGFzc3VtZSB0aGF0IHN5c3RlbXMgd2l0aCBTQ01fUklHSFRTIGFsc28KKyAgICAga25vdyBhbGxvY2EoKSAqLworICBtLm1zZ19jb250cm9sID0gYWxsb2NhKG0ubXNnX2NvbnRyb2xsZW4pOworICBtZW1zZXQobS5tc2dfY29udHJvbCwgMCwgbS5tc2dfY29udHJvbGxlbik7CisKKyAgLyogRG8gbm90IGluY2x1ZGUgdGhlIHBhZGRpbmcgYXQgdGhlIGVuZCB3aGVuIHdlIHRlbGwgdGhlIGtlcm5lbAorICAgKiBob3cgbXVjaCB3ZSdyZSB3aWxsaW5nIHRvIHJlY2VpdmUuIFRoaXMgYXZvaWRzIGdldHRpbmcKKyAgICogdGhlIHBhZGRpbmcgZmlsbGVkIHdpdGggYWRkaXRpb25hbCBmZHMgdGhhdCB3ZSB3ZXJlbid0IGV4cGVjdGluZywKKyAgICogaWYgYSAocG90ZW50aWFsbHkgbWFsaWNpb3VzKSBzZW5kZXIgaW5jbHVkZWQgdGhlbS4gKGZkLm8gIzgzNjIyKSAqLworICBtLm1zZ19jb250cm9sbGVuID0gQ01TR19MRU4gKCpuX2ZkcyAqIHNpemVvZihpbnQpKTsKKworIGFnYWluOgorCisgIGJ5dGVzX3JlYWQgPSByZWN2bXNnIChmZC5mZCwgJm0sIDAKKyNpZmRlZiBNU0dfQ01TR19DTE9FWEVDCisgICAgICAgICAgICAgICAgICAgICAgIHxNU0dfQ01TR19DTE9FWEVDCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgKTsKKworICBpZiAoYnl0ZXNfcmVhZCA8IDApCisgICAgeworICAgICAgaWYgKGVycm5vID09IEVJTlRSKQorICAgICAgICBnb3RvIGFnYWluOworICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgLyogcHV0IGxlbmd0aCBiYWNrIChub3RlIHRoYXQgdGhpcyBkb2Vzbid0IGFjdHVhbGx5IHJlYWxsb2MgYW55dGhpbmcpICovCisgICAgICAgICAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKGJ1ZmZlciwgc3RhcnQpOworICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHN0cnVjdCBjbXNnaGRyICpjbTsKKyAgICAgIGRidXNfYm9vbF90IGZvdW5kID0gRkFMU0U7CisKKyAgICAgIGZvciAoY20gPSBDTVNHX0ZJUlNUSERSKCZtKTsgY207IGNtID0gQ01TR19OWFRIRFIoJm0sIGNtKSkKKyAgICAgICAgaWYgKGNtLT5jbXNnX2xldmVsID09IFNPTF9TT0NLRVQgJiYgY20tPmNtc2dfdHlwZSA9PSBTQ01fUklHSFRTKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHNpemVfdCBpOworICAgICAgICAgICAgaW50ICpwYXlsb2FkID0gKGludCAqKSBDTVNHX0RBVEEgKGNtKTsKKyAgICAgICAgICAgIHNpemVfdCBwYXlsb2FkX2xlbl9ieXRlcyA9IChjbS0+Y21zZ19sZW4gLSBDTVNHX0xFTiAoMCkpOworICAgICAgICAgICAgc2l6ZV90IHBheWxvYWRfbGVuX2ZkczsKKyAgICAgICAgICAgIHNpemVfdCBmZHNfdG9fdXNlOworCisgICAgICAgICAgICAvKiBFdmVyeSB1bnNpZ25lZCBpbnQgZml0cyBpbiBhIHNpemVfdCB3aXRob3V0IHRydW5jYXRpb24sIHNvCisgICAgICAgICAgICAgKiBjYXN0aW5nIChzaXplX3QpICpuX2ZkcyBpcyBPSyAqLworICAgICAgICAgICAgX0RCVVNfU1RBVElDX0FTU0VSVCAoc2l6ZW9mIChzaXplX3QpID49IHNpemVvZiAodW5zaWduZWQgaW50KSk7CisKKyAgICAgICAgICAgIGlmICgobS5tc2dfZmxhZ3MgJiBNU0dfQ1RSVU5DKSAmJiBDTVNHX05YVEhEUigmbSwgY20pID09IE5VTEwgJiYKKyAgICAgICAgICAgICAgKGNoYXIgKikgcGF5bG9hZCArIHBheWxvYWRfbGVuX2J5dGVzID4KKyAgICAgICAgICAgICAgKGNoYXIgKikgbS5tc2dfY29udHJvbCArIG0ubXNnX2NvbnRyb2xsZW4pCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBUaGlzIGlzIHRoZSBsYXN0IGNtc2cgaW4gYSB0cnVuY2F0ZWQgbWVzc2FnZSBhbmQgdXNpbmcKKyAgICAgICAgICAgICAgICAgKiBjbXNnX2xlbiB3b3VsZCBhcHBhcmVudGx5IG92ZXJydW4gdGhlIGFsbG9jYXRlZCBidWZmZXIuCisgICAgICAgICAgICAgICAgICogU29tZSBvcGVyYXRpbmcgc3lzdGVtcyAoaWxsdW1vcyBhbmQgU29sYXJpcyBhcmUga25vd24pIGRvCisgICAgICAgICAgICAgICAgICogbm90IGFkanVzdCBjbXNnX2xlbiBpbiB0aGUgbGFzdCBjbXNnIHdoZW4gdHJ1bmNhdGlvbiBvY2N1cnMuCisgICAgICAgICAgICAgICAgICogQWRqdXN0IHRoZSBwYXlsb2FkIGxlbmd0aCBoZXJlLiBUaGUgY2FsY3VsYXRpb24gZm9yCisgICAgICAgICAgICAgICAgICogcGF5bG9hZF9sZW5fZmRzIGJlbG93IHdpbGwgZGlzY2FyZCBhbnkgdHJhaWxpbmcgYnl0ZXMgdGhhdAorICAgICAgICAgICAgICAgICAqIGJlbG9uZyB0byBhbiBpbmNvbXBsZXRlIGZpbGUgZGVzY3JpcHRvciAtIHRoZSBrZXJuZWwgd2lsbAorICAgICAgICAgICAgICAgICAqIGhhdmUgYWxyZWFkeSBjbG9zZWQgdGhhdCAoYXQgbGVhc3QgZm9yIGlsbHVtb3MgYW5kIFNvbGFyaXMpCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgIHBheWxvYWRfbGVuX2J5dGVzID0gbS5tc2dfY29udHJvbGxlbiAtCisgICAgICAgICAgICAgICAgICAgKChjaGFyICopIHBheWxvYWQgLSAoY2hhciAqKSBtLm1zZ19jb250cm9sKTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwYXlsb2FkX2xlbl9mZHMgPSBwYXlsb2FkX2xlbl9ieXRlcyAvIHNpemVvZiAoaW50KTsKKworICAgICAgICAgICAgaWYgKF9EQlVTX0xJS0VMWSAocGF5bG9hZF9sZW5fZmRzIDw9IChzaXplX3QpICpuX2ZkcykpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBUaGUgZmRzIGluIHRoZSBwYXlsb2FkIHdpbGwgZml0IGluIG91ciBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICBmZHNfdG9fdXNlID0gcGF5bG9hZF9sZW5fZmRzOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBUb28gbWFueSBmZHMgaW4gdGhlIHBheWxvYWQuIFRoaXMgc2hvdWxkbid0IGhhcHBlbgorICAgICAgICAgICAgICAgICAqIGFueSBtb3JlIGJlY2F1c2Ugd2UncmUgc2V0dGluZyBtLm1zZ19jb250cm9sbGVuIHRvCisgICAgICAgICAgICAgICAgICogdGhlIGV4YWN0IG51bWJlciB3ZSBjYW4gYWNjZXB0LCBidXQgYmUgc2FmZSBhbmQKKyAgICAgICAgICAgICAgICAgKiB0cnVuY2F0ZS4gKi8KKyAgICAgICAgICAgICAgICBmZHNfdG9fdXNlID0gKHNpemVfdCkgKm5fZmRzOworCisgICAgICAgICAgICAgICAgLyogQ2xvc2UgdGhlIGV4Y2VzcyBmZHMgdG8gYXZvaWQgRG9TOiBpZiB0aGV5IHN0YXllZCBvcGVuLAorICAgICAgICAgICAgICAgICAqIHNvbWVvbmUgY291bGQgc2VuZCB1cyBhbiBleHRyYSBmZCBwZXIgbWVzc2FnZQorICAgICAgICAgICAgICAgICAqIGFuZCB3ZSdkIGV2ZW50dWFsbHkgcnVuIG91dC4gKi8KKyAgICAgICAgICAgICAgICBmb3IgKGkgPSBmZHNfdG9fdXNlOyBpIDwgcGF5bG9hZF9sZW5fZmRzOyBpKyspCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNsb3NlIChwYXlsb2FkW2ldKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtZW1jcHkgKGZkcywgcGF5bG9hZCwgZmRzX3RvX3VzZSAqIHNpemVvZiAoaW50KSk7CisgICAgICAgICAgICBmb3VuZCA9IFRSVUU7CisgICAgICAgICAgICAvKiBUaGlzIG5hcnJvd2luZyBjYXN0IGZyb20gc2l6ZV90IHRvIHVuc2lnbmVkIGludCBjYW5ub3QKKyAgICAgICAgICAgICAqIG92ZXJmbG93IGJlY2F1c2Ugd2UgaGF2ZSBjaG9zZW4gZmRzX3RvX3VzZQorICAgICAgICAgICAgICogdG8gYmUgPD0gKm5fZmRzICovCisgICAgICAgICAgICAqbl9mZHMgPSAodW5zaWduZWQgaW50KSBmZHNfdG9fdXNlOworCisgICAgICAgICAgICAvKiBMaW51eCBkb2Vzbid0IHRlbGwgdXMgd2hldGhlciBNU0dfQ01TR19DTE9FWEVDIGFjdHVhbGx5CisgICAgICAgICAgICAgICB3b3JrZWQsIGhlbmNlIHdlIG5lZWQgdG8gZ28gdGhyb3VnaCB0aGlzIGxpc3QgYW5kIHNldAorICAgICAgICAgICAgICAgQ0xPRVhFQyBldmVyeXdoZXJlIGluIGFueSBjYXNlICovCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZmRzX3RvX3VzZTsgaSsrKQorICAgICAgICAgICAgICBfZGJ1c19mZF9zZXRfY2xvc2Vfb25fZXhlYyhmZHNbaV0pOworCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisKKyAgICAgIGlmICghZm91bmQpCisgICAgICAgICpuX2ZkcyA9IDA7CisKKyAgICAgIGlmIChtLm1zZ19mbGFncyAmIE1TR19DVFJVTkMpCisgICAgICAgIHsKKyAgICAgICAgICB1bnNpZ25lZCBpbnQgaTsKKworICAgICAgICAgIC8qIEhtbSwgYXBwYXJlbnRseSB0aGUgY29udHJvbCBkYXRhIHdhcyB0cnVuY2F0ZWQuIFRoZSBiYWQKKyAgICAgICAgICAgICB0aGluZyBpcyB0aGF0IHdlIG1pZ2h0IGhhdmUgY29tcGxldGVseSBsb3N0IGEgY291cGxlIG9mIGZkcworICAgICAgICAgICAgIHdpdGhvdXQgY2hhbmNlIHRvIHJlY292ZXIgdGhlbS4gSGVuY2UgbGV0J3MgdHJlYXQgdGhpcyBhcyBhCisgICAgICAgICAgICAgc2VyaW91cyBlcnJvci4gKi8KKworICAgICAgICAgIC8qIFdlIHN0aWxsIG5lZWQgdG8gY2xvc2Ugd2hhdGV2ZXIgZmRzIHdlICpkaWQqIHJlY2VpdmUsCisgICAgICAgICAgICogb3RoZXJ3aXNlIHRoZXknbGwgbmV2ZXIgZ2V0IGNsb3NlZC4gKENWRS0yMDIwLTEyMDQ5KSAqLworICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAqbl9mZHM7IGkrKykKKyAgICAgICAgICAgIGNsb3NlIChmZHNbaV0pOworCisgICAgICAgICAgKm5fZmRzID0gMDsKKyAgICAgICAgICBlcnJubyA9IEVOT1NQQzsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoYnVmZmVyLCBzdGFydCk7CisgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgIC8qIHB1dCBsZW5ndGggYmFjayAoZG9lc24ndCBhY3R1YWxseSByZWFsbG9jKSAqLworICAgICAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKGJ1ZmZlciwgc3RhcnQgKyBieXRlc19yZWFkKTsKKworI2lmIDAKKyAgICAgIGlmIChieXRlc19yZWFkID4gMCkKKyAgICAgICAgX2RidXNfdmVyYm9zZV9ieXRlc19vZl9zdHJpbmcgKGJ1ZmZlciwgc3RhcnQsIGJ5dGVzX3JlYWQpOworI2VuZGlmCisKKyAgICAgIHJldHVybiBieXRlc19yZWFkOworICAgIH0KKyNlbmRpZgorfQorCitpbnQKK19kYnVzX3dyaXRlX3NvY2tldF93aXRoX3VuaXhfZmRzKERCdXNTb2NrZXQgICAgICAgIGZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgICAgICAgICpmZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBuX2ZkcykgeworCisjaWZuZGVmIEhBVkVfVU5JWF9GRF9QQVNTSU5HCisKKyAgaWYgKG5fZmRzID4gMCkgeworICAgIGVycm5vID0gRU5PVFNVUDsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICByZXR1cm4gX2RidXNfd3JpdGVfc29ja2V0KGZkLCBidWZmZXIsIHN0YXJ0LCBsZW4pOworI2Vsc2UKKyAgcmV0dXJuIF9kYnVzX3dyaXRlX3NvY2tldF93aXRoX3VuaXhfZmRzX3R3byhmZCwgYnVmZmVyLCBzdGFydCwgbGVuLCBOVUxMLCAwLCAwLCBmZHMsIG5fZmRzKTsKKyNlbmRpZgorfQorCitpbnQKK19kYnVzX3dyaXRlX3NvY2tldF93aXRoX3VuaXhfZmRzX3R3byhEQnVzU29ja2V0ICAgICAgICBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpidWZmZXIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHN0YXJ0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBsZW4xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmJ1ZmZlcjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgc3RhcnQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGxlbjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICAgICAgICAqZmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIG5fZmRzKSB7CisKKyNpZm5kZWYgSEFWRV9VTklYX0ZEX1BBU1NJTkcKKworICBpZiAobl9mZHMgPiAwKSB7CisgICAgZXJybm8gPSBFTk9UU1VQOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIHJldHVybiBfZGJ1c193cml0ZV9zb2NrZXRfdHdvKGZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIxLCBzdGFydDEsIGxlbjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcjIsIHN0YXJ0MiwgbGVuMik7CisjZWxzZQorCisgIHN0cnVjdCBtc2doZHIgbTsKKyAgc3RydWN0IGNtc2doZHIgKmNtOworICBzdHJ1Y3QgaW92ZWMgaW92WzJdOworICBpbnQgYnl0ZXNfd3JpdHRlbjsKKworICBfZGJ1c19hc3NlcnQgKGxlbjEgPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAobGVuMiA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChuX2ZkcyA+PSAwKTsKKworICBfREJVU19aRVJPKGlvdik7CisgIGlvdlswXS5pb3ZfYmFzZSA9IChjaGFyKikgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhX2xlbiAoYnVmZmVyMSwgc3RhcnQxLCBsZW4xKTsKKyAgaW92WzBdLmlvdl9sZW4gPSBsZW4xOworCisgIGlmIChidWZmZXIyKQorICAgIHsKKyAgICAgIGlvdlsxXS5pb3ZfYmFzZSA9IChjaGFyKikgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhX2xlbiAoYnVmZmVyMiwgc3RhcnQyLCBsZW4yKTsKKyAgICAgIGlvdlsxXS5pb3ZfbGVuID0gbGVuMjsKKyAgICB9CisKKyAgX0RCVVNfWkVSTyhtKTsKKyAgbS5tc2dfaW92ID0gaW92OworICBtLm1zZ19pb3ZsZW4gPSBidWZmZXIyID8gMiA6IDE7CisKKyAgaWYgKG5fZmRzID4gMCkKKyAgICB7CisgICAgICBtLm1zZ19jb250cm9sbGVuID0gQ01TR19TUEFDRShuX2ZkcyAqIHNpemVvZihpbnQpKTsKKyAgICAgIG0ubXNnX2NvbnRyb2wgPSBhbGxvY2EobS5tc2dfY29udHJvbGxlbik7CisgICAgICBtZW1zZXQobS5tc2dfY29udHJvbCwgMCwgbS5tc2dfY29udHJvbGxlbik7CisKKyAgICAgIGNtID0gQ01TR19GSVJTVEhEUigmbSk7CisgICAgICBjbS0+Y21zZ19sZXZlbCA9IFNPTF9TT0NLRVQ7CisgICAgICBjbS0+Y21zZ190eXBlID0gU0NNX1JJR0hUUzsKKyAgICAgIGNtLT5jbXNnX2xlbiA9IENNU0dfTEVOKG5fZmRzICogc2l6ZW9mKGludCkpOworICAgICAgbWVtY3B5KENNU0dfREFUQShjbSksIGZkcywgbl9mZHMgKiBzaXplb2YoaW50KSk7CisgICAgfQorCisgYWdhaW46CisKKyAgYnl0ZXNfd3JpdHRlbiA9IHNlbmRtc2cgKGZkLmZkLCAmbSwgMAorI2lmIEhBVkVfREVDTF9NU0dfTk9TSUdOQUwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHxNU0dfTk9TSUdOQUwKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKworICBpZiAoYnl0ZXNfd3JpdHRlbiA8IDAgJiYgZXJybm8gPT0gRUlOVFIpCisgICAgZ290byBhZ2FpbjsKKworI2lmIDAKKyAgaWYgKGJ5dGVzX3dyaXR0ZW4gPiAwKQorICAgIF9kYnVzX3ZlcmJvc2VfYnl0ZXNfb2Zfc3RyaW5nIChidWZmZXIsIHN0YXJ0LCBieXRlc193cml0dGVuKTsKKyNlbmRpZgorCisgIHJldHVybiBieXRlc193cml0dGVuOworI2VuZGlmCit9CisKKy8qKgorICogTGlrZSBfZGJ1c193cml0ZV90d28oKSBidXQgb25seSB3b3JrcyBvbiBzb2NrZXRzIGFuZCBpcyB0aHVzCisgKiBhdmFpbGFibGUgb24gV2luZG93cy4KKyAqCisgKiBAcGFyYW0gZmQgdGhlIGZpbGUgZGVzY3JpcHRvcgorICogQHBhcmFtIGJ1ZmZlcjEgZmlyc3QgYnVmZmVyCisgKiBAcGFyYW0gc3RhcnQxIGZpcnN0IGJ5dGUgdG8gd3JpdGUgaW4gZmlyc3QgYnVmZmVyCisgKiBAcGFyYW0gbGVuMSBudW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUgZnJvbSBmaXJzdCBidWZmZXIKKyAqIEBwYXJhbSBidWZmZXIyIHNlY29uZCBidWZmZXIsIG9yICNOVUxMCisgKiBAcGFyYW0gc3RhcnQyIGZpcnN0IGJ5dGUgdG8gd3JpdGUgaW4gc2Vjb25kIGJ1ZmZlcgorICogQHBhcmFtIGxlbjIgbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlIGluIHNlY29uZCBidWZmZXIKKyAqIEByZXR1cm5zIHRvdGFsIGJ5dGVzIHdyaXR0ZW4gZnJvbSBib3RoIGJ1ZmZlcnMsIG9yIC0xIG9uIGVycm9yCisgKi8KK2ludAorX2RidXNfd3JpdGVfc29ja2V0X3R3byAoREJ1c1NvY2tldCAgICAgICAgZmQsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpidWZmZXIxLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgc3RhcnQxLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgbGVuMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmJ1ZmZlcjIsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydDIsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBsZW4yKQoreworI2lmIEhBVkVfREVDTF9NU0dfTk9TSUdOQUwKKyAgc3RydWN0IGlvdmVjIHZlY3RvcnNbMl07CisgIGNvbnN0IGNoYXIgKmRhdGExOworICBjb25zdCBjaGFyICpkYXRhMjsKKyAgaW50IGJ5dGVzX3dyaXR0ZW47CisgIHN0cnVjdCBtc2doZHIgbTsKKworICBfZGJ1c19hc3NlcnQgKGJ1ZmZlcjEgIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAoc3RhcnQxID49IDApOworICBfZGJ1c19hc3NlcnQgKHN0YXJ0MiA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChsZW4xID49IDApOworICBfZGJ1c19hc3NlcnQgKGxlbjIgPj0gMCk7CisKKyAgZGF0YTEgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuIChidWZmZXIxLCBzdGFydDEsIGxlbjEpOworCisgIGlmIChidWZmZXIyICE9IE5VTEwpCisgICAgZGF0YTIgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuIChidWZmZXIyLCBzdGFydDIsIGxlbjIpOworICBlbHNlCisgICAgeworICAgICAgZGF0YTIgPSBOVUxMOworICAgICAgc3RhcnQyID0gMDsKKyAgICAgIGxlbjIgPSAwOworICAgIH0KKworICB2ZWN0b3JzWzBdLmlvdl9iYXNlID0gKGNoYXIqKSBkYXRhMTsKKyAgdmVjdG9yc1swXS5pb3ZfbGVuID0gbGVuMTsKKyAgdmVjdG9yc1sxXS5pb3ZfYmFzZSA9IChjaGFyKikgZGF0YTI7CisgIHZlY3RvcnNbMV0uaW92X2xlbiA9IGxlbjI7CisKKyAgX0RCVVNfWkVSTyhtKTsKKyAgbS5tc2dfaW92ID0gdmVjdG9yczsKKyAgbS5tc2dfaW92bGVuID0gZGF0YTIgPyAyIDogMTsKKworIGFnYWluOgorCisgIGJ5dGVzX3dyaXR0ZW4gPSBzZW5kbXNnIChmZC5mZCwgJm0sIE1TR19OT1NJR05BTCk7CisKKyAgaWYgKGJ5dGVzX3dyaXR0ZW4gPCAwICYmIGVycm5vID09IEVJTlRSKQorICAgIGdvdG8gYWdhaW47CisKKyAgcmV0dXJuIGJ5dGVzX3dyaXR0ZW47CisKKyNlbHNlCisgIHJldHVybiBfZGJ1c193cml0ZV90d28gKGZkLmZkLCBidWZmZXIxLCBzdGFydDEsIGxlbjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcjIsIHN0YXJ0MiwgbGVuMik7CisjZW5kaWYKK30KKworLyoqCisgKiBUaGluIHdyYXBwZXIgYXJvdW5kIHRoZSByZWFkKCkgc3lzdGVtIGNhbGwgdGhhdCBhcHBlbmRzCisgKiB0aGUgZGF0YSBpdCByZWFkcyB0byB0aGUgREJ1c1N0cmluZyBidWZmZXIuIEl0IGFwcGVuZHMKKyAqIHVwIHRvIHRoZSBnaXZlbiBjb3VudCwgYW5kIHJldHVybnMgdGhlIHNhbWUgdmFsdWUKKyAqIGFuZCBzYW1lIGVycm5vIGFzIHJlYWQoKS4gVGhlIG9ubHkgZXhjZXB0aW9uIGlzIHRoYXQKKyAqIF9kYnVzX3JlYWQoKSBoYW5kbGVzIEVJTlRSIGZvciB5b3UuIEFsc28sIF9kYnVzX3JlYWQoKSBjYW4KKyAqIHJldHVybiBFTk9NRU0sIGV2ZW4gdGhvdWdoIHJlZ3VsYXIgVU5JWCByZWFkIGRvZXNuJ3QuCisgKgorICogVW5saWtlIF9kYnVzX3JlYWRfc29ja2V0KCksIF9kYnVzX3JlYWQoKSBpcyBub3QgYXZhaWxhYmxlCisgKiBvbiBXaW5kb3dzLgorICoKKyAqIEBwYXJhbSBmZCB0aGUgZmlsZSBkZXNjcmlwdG9yIHRvIHJlYWQgZnJvbQorICogQHBhcmFtIGJ1ZmZlciB0aGUgYnVmZmVyIHRvIGFwcGVuZCBkYXRhIHRvCisgKiBAcGFyYW0gY291bnQgdGhlIGFtb3VudCBvZiBkYXRhIHRvIHJlYWQKKyAqIEByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCBvciAtMQorICovCitpbnQKK19kYnVzX3JlYWQgKGludCAgICAgICAgICAgICAgIGZkLAorICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAqYnVmZmVyLAorICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgY291bnQpCit7CisgIGludCBieXRlc19yZWFkOworICBpbnQgc3RhcnQ7CisgIGNoYXIgKmRhdGE7CisKKyAgX2RidXNfYXNzZXJ0IChjb3VudCA+PSAwKTsKKworICBzdGFydCA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChidWZmZXIpOworCisgIGlmICghX2RidXNfc3RyaW5nX2xlbmd0aGVuIChidWZmZXIsIGNvdW50KSkKKyAgICB7CisgICAgICBlcnJubyA9IEVOT01FTTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgZGF0YSA9IF9kYnVzX3N0cmluZ19nZXRfZGF0YV9sZW4gKGJ1ZmZlciwgc3RhcnQsIGNvdW50KTsKKworIGFnYWluOgorCisgIGJ5dGVzX3JlYWQgPSByZWFkIChmZCwgZGF0YSwgY291bnQpOworCisgIGlmIChieXRlc19yZWFkIDwgMCkKKyAgICB7CisgICAgICBpZiAoZXJybm8gPT0gRUlOVFIpCisgICAgICAgIGdvdG8gYWdhaW47CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvKiBwdXQgbGVuZ3RoIGJhY2sgKG5vdGUgdGhhdCB0aGlzIGRvZXNuJ3QgYWN0dWFsbHkgcmVhbGxvYyBhbnl0aGluZykgKi8KKyAgICAgICAgICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoYnVmZmVyLCBzdGFydCk7CisgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogcHV0IGxlbmd0aCBiYWNrIChkb2Vzbid0IGFjdHVhbGx5IHJlYWxsb2MpICovCisgICAgICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoYnVmZmVyLCBzdGFydCArIGJ5dGVzX3JlYWQpOworCisjaWYgMAorICAgICAgaWYgKGJ5dGVzX3JlYWQgPiAwKQorICAgICAgICBfZGJ1c192ZXJib3NlX2J5dGVzX29mX3N0cmluZyAoYnVmZmVyLCBzdGFydCwgYnl0ZXNfcmVhZCk7CisjZW5kaWYKKworICAgICAgcmV0dXJuIGJ5dGVzX3JlYWQ7CisgICAgfQorfQorCisvKioKKyAqIFRoaW4gd3JhcHBlciBhcm91bmQgdGhlIHdyaXRlKCkgc3lzdGVtIGNhbGwgdGhhdCB3cml0ZXMgYSBwYXJ0IG9mIGEKKyAqIERCdXNTdHJpbmcgYW5kIGhhbmRsZXMgRUlOVFIgZm9yIHlvdS4KKyAqCisgKiBAcGFyYW0gZmQgdGhlIGZpbGUgZGVzY3JpcHRvciB0byB3cml0ZQorICogQHBhcmFtIGJ1ZmZlciB0aGUgYnVmZmVyIHRvIHdyaXRlIGRhdGEgZnJvbQorICogQHBhcmFtIHN0YXJ0IHRoZSBmaXJzdCBieXRlIGluIHRoZSBidWZmZXIgdG8gd3JpdGUKKyAqIEBwYXJhbSBsZW4gdGhlIG51bWJlciBvZiBieXRlcyB0byB0cnkgdG8gd3JpdGUKKyAqIEByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiBvciAtMSBvbiBlcnJvcgorICovCitpbnQKK19kYnVzX3dyaXRlIChpbnQgICAgICAgICAgICAgICBmZCwKKyAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpidWZmZXIsCisgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgbGVuKQoreworICBjb25zdCBjaGFyICpkYXRhOworICBpbnQgYnl0ZXNfd3JpdHRlbjsKKworICBkYXRhID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhX2xlbiAoYnVmZmVyLCBzdGFydCwgbGVuKTsKKworIGFnYWluOgorCisgIGJ5dGVzX3dyaXR0ZW4gPSB3cml0ZSAoZmQsIGRhdGEsIGxlbik7CisKKyAgaWYgKGJ5dGVzX3dyaXR0ZW4gPCAwICYmIGVycm5vID09IEVJTlRSKQorICAgIGdvdG8gYWdhaW47CisKKyNpZiAwCisgIGlmIChieXRlc193cml0dGVuID4gMCkKKyAgICBfZGJ1c192ZXJib3NlX2J5dGVzX29mX3N0cmluZyAoYnVmZmVyLCBzdGFydCwgYnl0ZXNfd3JpdHRlbik7CisjZW5kaWYKKworICByZXR1cm4gYnl0ZXNfd3JpdHRlbjsKK30KKworLyoqCisgKiBMaWtlIF9kYnVzX3dyaXRlKCkgYnV0IHdpbGwgdXNlIHdyaXRldigpIGlmIHBvc3NpYmxlCisgKiB0byB3cml0ZSBib3RoIGJ1ZmZlcnMgaW4gc2VxdWVuY2UuIFRoZSByZXR1cm4gdmFsdWUKKyAqIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiBpbiB0aGUgZmlyc3QgYnVmZmVyLAorICogcGx1cyB0aGUgbnVtYmVyIHdyaXR0ZW4gaW4gdGhlIHNlY29uZC4gSWYgdGhlIGZpcnN0CisgKiBidWZmZXIgaXMgd3JpdHRlbiBzdWNjZXNzZnVsbHkgYW5kIGFuIGVycm9yIG9jY3VycworICogd3JpdGluZyB0aGUgc2Vjb25kLCB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBmaXJzdAorICogaXMgcmV0dXJuZWQgKGkuZS4gdGhlIGVycm9yIGlzIGlnbm9yZWQpLCBvbiBzeXN0ZW1zIHRoYXQKKyAqIGRvbid0IGhhdmUgd3JpdGV2LiBIYW5kbGVzIEVJTlRSIGZvciB5b3UuCisgKiBUaGUgc2Vjb25kIGJ1ZmZlciBtYXkgYmUgI05VTEwuCisgKgorICogQHBhcmFtIGZkIHRoZSBmaWxlIGRlc2NyaXB0b3IKKyAqIEBwYXJhbSBidWZmZXIxIGZpcnN0IGJ1ZmZlcgorICogQHBhcmFtIHN0YXJ0MSBmaXJzdCBieXRlIHRvIHdyaXRlIGluIGZpcnN0IGJ1ZmZlcgorICogQHBhcmFtIGxlbjEgbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlIGZyb20gZmlyc3QgYnVmZmVyCisgKiBAcGFyYW0gYnVmZmVyMiBzZWNvbmQgYnVmZmVyLCBvciAjTlVMTAorICogQHBhcmFtIHN0YXJ0MiBmaXJzdCBieXRlIHRvIHdyaXRlIGluIHNlY29uZCBidWZmZXIKKyAqIEBwYXJhbSBsZW4yIG51bWJlciBvZiBieXRlcyB0byB3cml0ZSBpbiBzZWNvbmQgYnVmZmVyCisgKiBAcmV0dXJucyB0b3RhbCBieXRlcyB3cml0dGVuIGZyb20gYm90aCBidWZmZXJzLCBvciAtMSBvbiBlcnJvcgorICovCitpbnQKK19kYnVzX3dyaXRlX3R3byAoaW50ICAgICAgICAgICAgICAgZmQsCisgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmJ1ZmZlcjEsCisgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHN0YXJ0MSwKKyAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgbGVuMSwKKyAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqYnVmZmVyMiwKKyAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgc3RhcnQyLAorICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBsZW4yKQoreworICBfZGJ1c19hc3NlcnQgKGJ1ZmZlcjEgIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAoc3RhcnQxID49IDApOworICBfZGJ1c19hc3NlcnQgKHN0YXJ0MiA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChsZW4xID49IDApOworICBfZGJ1c19hc3NlcnQgKGxlbjIgPj0gMCk7CisKKyNpZmRlZiBIQVZFX1dSSVRFVgorICB7CisgICAgc3RydWN0IGlvdmVjIHZlY3RvcnNbMl07CisgICAgY29uc3QgY2hhciAqZGF0YTE7CisgICAgY29uc3QgY2hhciAqZGF0YTI7CisgICAgaW50IGJ5dGVzX3dyaXR0ZW47CisKKyAgICBkYXRhMSA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YV9sZW4gKGJ1ZmZlcjEsIHN0YXJ0MSwgbGVuMSk7CisKKyAgICBpZiAoYnVmZmVyMiAhPSBOVUxMKQorICAgICAgZGF0YTIgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuIChidWZmZXIyLCBzdGFydDIsIGxlbjIpOworICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgZGF0YTIgPSBOVUxMOworICAgICAgICBzdGFydDIgPSAwOworICAgICAgICBsZW4yID0gMDsKKyAgICAgIH0KKworICAgIHZlY3RvcnNbMF0uaW92X2Jhc2UgPSAoY2hhciopIGRhdGExOworICAgIHZlY3RvcnNbMF0uaW92X2xlbiA9IGxlbjE7CisgICAgdmVjdG9yc1sxXS5pb3ZfYmFzZSA9IChjaGFyKikgZGF0YTI7CisgICAgdmVjdG9yc1sxXS5pb3ZfbGVuID0gbGVuMjsKKworICBhZ2FpbjoKKworICAgIGJ5dGVzX3dyaXR0ZW4gPSB3cml0ZXYgKGZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTIgPyAyIDogMSk7CisKKyAgICBpZiAoYnl0ZXNfd3JpdHRlbiA8IDAgJiYgZXJybm8gPT0gRUlOVFIpCisgICAgICBnb3RvIGFnYWluOworCisgICAgcmV0dXJuIGJ5dGVzX3dyaXR0ZW47CisgIH0KKyNlbHNlIC8qIEhBVkVfV1JJVEVWICovCisgIHsKKyAgICBpbnQgcmV0MSwgcmV0MjsKKworICAgIHJldDEgPSBfZGJ1c193cml0ZSAoZmQsIGJ1ZmZlcjEsIHN0YXJ0MSwgbGVuMSk7CisgICAgaWYgKHJldDEgPT0gbGVuMSAmJiBidWZmZXIyICE9IE5VTEwpCisgICAgICB7CisgICAgICAgIHJldDIgPSBfZGJ1c193cml0ZSAoZmQsIGJ1ZmZlcjIsIHN0YXJ0MiwgbGVuMik7CisgICAgICAgIGlmIChyZXQyIDwgMCkKKyAgICAgICAgICByZXQyID0gMDsgLyogd2UgY2FuJ3QgcmVwb3J0IGFuIGVycm9yIGFzIHRoZSBmaXJzdCB3cml0ZSB3YXMgT0sgKi8KKworICAgICAgICByZXR1cm4gcmV0MSArIHJldDI7CisgICAgICB9CisgICAgZWxzZQorICAgICAgcmV0dXJuIHJldDE7CisgIH0KKyNlbmRpZiAvKiAhSEFWRV9XUklURVYgKi8KK30KKworI2RlZmluZSBfREJVU19NQVhfU1VOX1BBVEhfTEVOR1RIIDk5CisKKy8qKgorICogQGRlZiBfREJVU19NQVhfU1VOX1BBVEhfTEVOR1RICisgKgorICogTWF4aW11bSBsZW5ndGggb2YgdGhlIHBhdGggdG8gYSBVTklYIGRvbWFpbiBzb2NrZXQsCisgKiBzb2NrYWRkcl91bjo6c3VuX3BhdGggbWVtYmVyLiBQT1NJWCByZXF1aXJlcyB0aGF0IGFsbCBzeXN0ZW1zCisgKiBzdXBwb3J0IGF0IGxlYXN0IDEwMCBieXRlcyBoZXJlLCBpbmNsdWRpbmcgdGhlIG51bCB0ZXJtaW5hdGlvbi4KKyAqIFdlIHVzZSA5OSBmb3IgdGhlIG1heCB2YWx1ZSB0byBhbGxvdyBmb3IgdGhlIG51bC4KKyAqCisgKiBXZSBjb3VsZCBwcm9iYWJseSBhbHNvIGRvIHNpemVvZiAoYWRkci5zdW5fcGF0aCkKKyAqIGJ1dCB0aGlzIHdheSB3ZSBhcmUgdGhlIHNhbWUgb24gYWxsIHBsYXRmb3JtcworICogd2hpY2ggaXMgcHJvYmFibHkgYSBnb29kIGlkZWEuCisgKi8KKworLyoqCisgKiBDcmVhdGVzIGEgc29ja2V0IGFuZCBjb25uZWN0cyBpdCB0byB0aGUgVU5JWCBkb21haW4gc29ja2V0IGF0IHRoZQorICogZ2l2ZW4gcGF0aC4gIFRoZSBjb25uZWN0aW9uIGZkIGlzIHJldHVybmVkLCBhbmQgaXMgc2V0IHVwIGFzCisgKiBub25ibG9ja2luZy4KKyAqCisgKiBVc2VzIGFic3RyYWN0IHNvY2tldHMgaW5zdGVhZCBvZiBmaWxlc3lzdGVtLWxpbmtlZCBzb2NrZXRzIGlmCisgKiByZXF1ZXN0ZWQgKGl0J3MgcG9zc2libGUgb25seSBvbiBMaW51eDsgc2VlICJtYW4gNyB1bml4IiBvbiBMaW51eCkuCisgKiBPbiBub24tTGludXggYWJzdHJhY3Qgc29ja2V0IHVzYWdlIGFsd2F5cyBmYWlscy4KKyAqCisgKiBUaGlzIHdpbGwgc2V0IEZEX0NMT0VYRUMgZm9yIHRoZSBzb2NrZXQgcmV0dXJuZWQuCisgKgorICogQHBhcmFtIHBhdGggdGhlIHBhdGggdG8gVU5JWCBkb21haW4gc29ja2V0CisgKiBAcGFyYW0gYWJzdHJhY3QgI1RSVUUgdG8gdXNlIGFic3RyYWN0IG5hbWVzcGFjZQorICogQHBhcmFtIGVycm9yIHJldHVybiBsb2NhdGlvbiBmb3IgZXJyb3IgY29kZQorICogQHJldHVybnMgY29ubmVjdGlvbiBmaWxlIGRlc2NyaXB0b3Igb3IgLTEgb24gZXJyb3IKKyAqLworaW50CitfZGJ1c19jb25uZWN0X3VuaXhfc29ja2V0IChjb25zdCBjaGFyICAgICAqcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICBhYnN0cmFjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgaW50IGZkOworICBzaXplX3QgcGF0aF9sZW47CisgIHN0cnVjdCBzb2NrYWRkcl91biBhZGRyOworICBfREJVU19TVEFUSUNfQVNTRVJUIChzaXplb2YgKGFkZHIuc3VuX3BhdGgpID4gX0RCVVNfTUFYX1NVTl9QQVRIX0xFTkdUSCk7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgX2RidXNfdmVyYm9zZSAoImNvbm5lY3RpbmcgdG8gdW5peCBzb2NrZXQgJXMgYWJzdHJhY3Q9JWRcbiIsCisgICAgICAgICAgICAgICAgIHBhdGgsIGFic3RyYWN0KTsKKworCisgIGlmICghX2RidXNfb3Blbl91bml4X3NvY2tldCAoJmZkLCBlcnJvcikpCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVChlcnJvcik7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIoZXJyb3IpOworCisgIF9EQlVTX1pFUk8gKGFkZHIpOworICBhZGRyLnN1bl9mYW1pbHkgPSBBRl9VTklYOworICBwYXRoX2xlbiA9IHN0cmxlbiAocGF0aCk7CisKKyAgaWYgKGFic3RyYWN0KQorICAgIHsKKyNpZmRlZiBfX2xpbnV4X18KKyAgICAgIGFkZHIuc3VuX3BhdGhbMF0gPSAnXDAnOyAvKiB0aGlzIGlzIHdoYXQgc2F5cyAidXNlIGFic3RyYWN0IiAqLworICAgICAgcGF0aF9sZW4rKzsgLyogQWNjb3VudCBmb3IgdGhlIGV4dHJhIG51bCBieXRlIGFkZGVkIHRvIHRoZSBzdGFydCBvZiBzdW5fcGF0aCAqLworCisgICAgICBpZiAocGF0aF9sZW4gPiBfREJVU19NQVhfU1VOX1BBVEhfTEVOR1RIKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0JBRF9BRERSRVNTLAorICAgICAgICAgICAgICAgICAgICAgICJBYnN0cmFjdCBzb2NrZXQgbmFtZSB0b28gbG9uZ1xuIik7CisgICAgICAgICAgX2RidXNfY2xvc2UgKGZkLCBOVUxMKTsKKyAgICAgICAgICByZXR1cm4gLTE7CisJfQorCisgICAgICBzdHJuY3B5ICgmYWRkci5zdW5fcGF0aFsxXSwgcGF0aCwgc2l6ZW9mIChhZGRyLnN1bl9wYXRoKSAtIDIpOworICAgICAgLyogX2RidXNfdmVyYm9zZV9ieXRlcyAoYWRkci5zdW5fcGF0aCwgc2l6ZW9mIChhZGRyLnN1bl9wYXRoKSk7ICovCisjZWxzZSAvKiAhX19saW51eF9fICovCisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9UX1NVUFBPUlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiT3BlcmF0aW5nIHN5c3RlbSBkb2VzIG5vdCBzdXBwb3J0IGFic3RyYWN0IHNvY2tldCBuYW1lc3BhY2VcbiIpOworICAgICAgX2RidXNfY2xvc2UgKGZkLCBOVUxMKTsKKyAgICAgIHJldHVybiAtMTsKKyNlbmRpZiAvKiAhX19saW51eF9fICovCisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKHBhdGhfbGVuID4gX0RCVVNfTUFYX1NVTl9QQVRIX0xFTkdUSCkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9CQURfQUREUkVTUywKKyAgICAgICAgICAgICAgICAgICAgICAiU29ja2V0IG5hbWUgdG9vIGxvbmdcbiIpOworICAgICAgICAgIF9kYnVzX2Nsb3NlIChmZCwgTlVMTCk7CisgICAgICAgICAgcmV0dXJuIC0xOworCX0KKworICAgICAgc3RybmNweSAoYWRkci5zdW5fcGF0aCwgcGF0aCwgc2l6ZW9mIChhZGRyLnN1bl9wYXRoKSAtIDEpOworICAgIH0KKworICBpZiAoY29ubmVjdCAoZmQsIChzdHJ1Y3Qgc29ja2FkZHIqKSAmYWRkciwgX0RCVVNfU1RSVUNUX09GRlNFVCAoc3RydWN0IHNvY2thZGRyX3VuLCBzdW5fcGF0aCkgKyBwYXRoX2xlbikgPCAwKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBjb25uZWN0IHRvIHNvY2tldCAlczogJXMiLAorICAgICAgICAgICAgICAgICAgICAgIHBhdGgsIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworCisgICAgICBfZGJ1c19jbG9zZSAoZmQsIE5VTEwpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICBpZiAoIV9kYnVzX3NldF9mZF9ub25ibG9ja2luZyAoZmQsIGVycm9yKSkKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisKKyAgICAgIF9kYnVzX2Nsb3NlIChmZCwgTlVMTCk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIHJldHVybiBmZDsKK30KKworLyoqCisgKiBDcmVhdGVzIGEgVU5JWCBkb21haW4gc29ja2V0IGFuZCBjb25uZWN0cyBpdCB0byB0aGUgc3BlY2lmaWVkCisgKiBwcm9jZXNzIHRvIGV4ZWN1dGUuCisgKgorICogVGhpcyB3aWxsIHNldCBGRF9DTE9FWEVDIGZvciB0aGUgc29ja2V0IHJldHVybmVkLgorICoKKyAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoIHRvIHRoZSBleGVjdXRhYmxlCisgKiBAcGFyYW0gYXJndiB0aGUgYXJndW1lbnQgbGlzdCBmb3IgdGhlIHByb2Nlc3MgdG8gZXhlY3V0ZS4KKyAqIGFyZ3ZbMF0gdHlwaWNhbGx5IGlzIGlkZW50aWNhbCB0byB0aGUgcGF0aCBvZiB0aGUgZXhlY3V0YWJsZQorICogQHBhcmFtIGVycm9yIHJldHVybiBsb2NhdGlvbiBmb3IgZXJyb3IgY29kZQorICogQHJldHVybnMgY29ubmVjdGlvbiBmaWxlIGRlc2NyaXB0b3Igb3IgLTEgb24gZXJyb3IKKyAqLworaW50CitfZGJ1c19jb25uZWN0X2V4ZWMgKGNvbnN0IGNoYXIgICAgICpwYXRoLAorICAgICAgICAgICAgICAgICAgICBjaGFyICpjb25zdCAgICBhcmd2W10sCisgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgaW50IGZkc1syXTsKKyAgcGlkX3QgcGlkOworICBpbnQgcmV0dmFsOworICBkYnVzX2Jvb2xfdCBjbG9leGVjX2RvbmUgPSAwOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIF9kYnVzX3ZlcmJvc2UgKCJjb25uZWN0aW5nIHRvIHByb2Nlc3MgJXNcbiIsIHBhdGgpOworCisjaWZkZWYgU09DS19DTE9FWEVDCisgIHJldHZhbCA9IHNvY2tldHBhaXIgKEFGX1VOSVgsIFNPQ0tfU1RSRUFNfFNPQ0tfQ0xPRVhFQywgMCwgZmRzKTsKKyAgY2xvZXhlY19kb25lID0gKHJldHZhbCA+PSAwKTsKKworICBpZiAocmV0dmFsIDwgMCAmJiAoZXJybm8gPT0gRUlOVkFMIHx8IGVycm5vID09IEVQUk9UT1RZUEUpKQorI2VuZGlmCisgICAgeworICAgICAgcmV0dmFsID0gc29ja2V0cGFpciAoQUZfVU5JWCwgU09DS19TVFJFQU0sIDAsIGZkcyk7CisgICAgfQorCisgIGlmIChyZXR2YWwgPCAwKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBjcmVhdGUgc29ja2V0IHBhaXI6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgaWYgKCFjbG9leGVjX2RvbmUpCisgICAgeworICAgICAgX2RidXNfZmRfc2V0X2Nsb3NlX29uX2V4ZWMgKGZkc1swXSk7CisgICAgICBfZGJ1c19mZF9zZXRfY2xvc2Vfb25fZXhlYyAoZmRzWzFdKTsKKyAgICB9CisKKyAgcGlkID0gZm9yayAoKTsKKyAgaWYgKHBpZCA8IDApCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGZvcmsoKSB0byBjYWxsICVzOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgcGF0aCwgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICBjbG9zZSAoZmRzWzBdKTsKKyAgICAgIGNsb3NlIChmZHNbMV0pOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICBpZiAocGlkID09IDApCisgICAgeworICAgICAgLyogY2hpbGQgKi8KKyAgICAgIGNsb3NlIChmZHNbMF0pOworCisgICAgICBkdXAyIChmZHNbMV0sIFNURElOX0ZJTEVOTyk7CisgICAgICBkdXAyIChmZHNbMV0sIFNURE9VVF9GSUxFTk8pOworCisgICAgICBpZiAoZmRzWzFdICE9IFNURElOX0ZJTEVOTyAmJgorICAgICAgICAgIGZkc1sxXSAhPSBTVERPVVRfRklMRU5PKQorICAgICAgICBjbG9zZSAoZmRzWzFdKTsKKworICAgICAgLyogSW5oZXJpdCBTVERFUlIgYW5kIHRoZSBjb250cm9sbGluZyB0ZXJtaW5hbCBmcm9tIHRoZQorICAgICAgICAgcGFyZW50ICovCisKKyAgICAgIF9kYnVzX2Nsb3NlX2FsbCAoKTsKKworICAgICAgZXhlY3ZwIChwYXRoLCAoY2hhciAqIGNvbnN0ICopIGFyZ3YpOworCisgICAgICBmcHJpbnRmIChzdGRlcnIsICJGYWlsZWQgdG8gZXhlY3V0ZSBwcm9jZXNzICVzOiAlc1xuIiwgcGF0aCwgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisKKyAgICAgIF9leGl0KDEpOworICAgIH0KKworICAvKiBwYXJlbnQgKi8KKyAgY2xvc2UgKGZkc1sxXSk7CisKKyAgaWYgKCFfZGJ1c19zZXRfZmRfbm9uYmxvY2tpbmcgKGZkc1swXSwgZXJyb3IpKQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKworICAgICAgY2xvc2UgKGZkc1swXSk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIHJldHVybiBmZHNbMF07Cit9CisKKy8qKgorICogQ3JlYXRlcyBhIHNvY2tldCBhbmQgYmluZHMgaXQgdG8gdGhlIGdpdmVuIHBhdGgsCisgKiB0aGVuIGxpc3RlbnMgb24gdGhlIHNvY2tldC4gVGhlIHNvY2tldCBpcworICogc2V0IHRvIGJlIG5vbmJsb2NraW5nLgorICoKKyAqIFVzZXMgYWJzdHJhY3Qgc29ja2V0cyBpbnN0ZWFkIG9mIGZpbGVzeXN0ZW0tbGlua2VkCisgKiBzb2NrZXRzIGlmIHJlcXVlc3RlZCAoaXQncyBwb3NzaWJsZSBvbmx5IG9uIExpbnV4OworICogc2VlICJtYW4gNyB1bml4IiBvbiBMaW51eCkuCisgKiBPbiBub24tTGludXggYWJzdHJhY3Qgc29ja2V0IHVzYWdlIGFsd2F5cyBmYWlscy4KKyAqCisgKiBUaGlzIHdpbGwgc2V0IEZEX0NMT0VYRUMgZm9yIHRoZSBzb2NrZXQgcmV0dXJuZWQKKyAqCisgKiBAcGFyYW0gcGF0aCB0aGUgc29ja2V0IG5hbWUKKyAqIEBwYXJhbSBhYnN0cmFjdCAjVFJVRSB0byB1c2UgYWJzdHJhY3QgbmFtZXNwYWNlCisgKiBAcGFyYW0gZXJyb3IgcmV0dXJuIGxvY2F0aW9uIGZvciBlcnJvcnMKKyAqIEByZXR1cm5zIHRoZSBsaXN0ZW5pbmcgZmlsZSBkZXNjcmlwdG9yIG9yIC0xIG9uIGVycm9yCisgKi8KK2ludAorX2RidXNfbGlzdGVuX3VuaXhfc29ja2V0IChjb25zdCBjaGFyICAgICAqcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgIGFic3RyYWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIGludCBsaXN0ZW5fZmQ7CisgIHN0cnVjdCBzb2NrYWRkcl91biBhZGRyOworICBzaXplX3QgcGF0aF9sZW47CisgIF9EQlVTX1NUQVRJQ19BU1NFUlQgKHNpemVvZiAoYWRkci5zdW5fcGF0aCkgPiBfREJVU19NQVhfU1VOX1BBVEhfTEVOR1RIKTsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBfZGJ1c192ZXJib3NlICgibGlzdGVuaW5nIG9uIHVuaXggc29ja2V0ICVzIGFic3RyYWN0PSVkXG4iLAorICAgICAgICAgICAgICAgICBwYXRoLCBhYnN0cmFjdCk7CisKKyAgaWYgKCFfZGJ1c19vcGVuX3VuaXhfc29ja2V0ICgmbGlzdGVuX2ZkLCBlcnJvcikpCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVChlcnJvcik7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIoZXJyb3IpOworCisgIF9EQlVTX1pFUk8gKGFkZHIpOworICBhZGRyLnN1bl9mYW1pbHkgPSBBRl9VTklYOworICBwYXRoX2xlbiA9IHN0cmxlbiAocGF0aCk7CisKKyAgaWYgKGFic3RyYWN0KQorICAgIHsKKyNpZmRlZiBfX2xpbnV4X18KKyAgICAgIC8qIHJlbWVtYmVyIHRoYXQgYWJzdHJhY3QgbmFtZXMgYXJlbid0IG51bC10ZXJtaW5hdGVkIHNvIHdlIHJlbHkKKyAgICAgICAqIG9uIHN1bl9wYXRoIGJlaW5nIGZpbGxlZCBpbiB3aXRoIHplcm9lcyBhYm92ZS4KKyAgICAgICAqLworICAgICAgYWRkci5zdW5fcGF0aFswXSA9ICdcMCc7IC8qIHRoaXMgaXMgd2hhdCBzYXlzICJ1c2UgYWJzdHJhY3QiICovCisgICAgICBwYXRoX2xlbisrOyAvKiBBY2NvdW50IGZvciB0aGUgZXh0cmEgbnVsIGJ5dGUgYWRkZWQgdG8gdGhlIHN0YXJ0IG9mIHN1bl9wYXRoICovCisKKyAgICAgIGlmIChwYXRoX2xlbiA+IF9EQlVTX01BWF9TVU5fUEFUSF9MRU5HVEgpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfQkFEX0FERFJFU1MsCisgICAgICAgICAgICAgICAgICAgICAgIkFic3RyYWN0IHNvY2tldCBuYW1lIHRvbyBsb25nXG4iKTsKKyAgICAgICAgICBfZGJ1c19jbG9zZSAobGlzdGVuX2ZkLCBOVUxMKTsKKyAgICAgICAgICByZXR1cm4gLTE7CisJfQorCisgICAgICBzdHJuY3B5ICgmYWRkci5zdW5fcGF0aFsxXSwgcGF0aCwgc2l6ZW9mIChhZGRyLnN1bl9wYXRoKSAtIDIpOworICAgICAgLyogX2RidXNfdmVyYm9zZV9ieXRlcyAoYWRkci5zdW5fcGF0aCwgc2l6ZW9mIChhZGRyLnN1bl9wYXRoKSk7ICovCisjZWxzZSAvKiAhX19saW51eF9fICovCisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9UX1NVUFBPUlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiT3BlcmF0aW5nIHN5c3RlbSBkb2VzIG5vdCBzdXBwb3J0IGFic3RyYWN0IHNvY2tldCBuYW1lc3BhY2VcbiIpOworICAgICAgX2RidXNfY2xvc2UgKGxpc3Rlbl9mZCwgTlVMTCk7CisgICAgICByZXR1cm4gLTE7CisjZW5kaWYgLyogIV9fbGludXhfXyAqLworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIERpc2N1c3NlZCBzZWN1cml0eSBpbXBsaWNhdGlvbnMgb2YgdGhpcyB3aXRoIE5hbGluLAorICAgICAgICogYW5kIHdlIGNvdWxkbid0IHRoaW5rIG9mIHdoZXJlIGl0IHdvdWxkIGtpY2sgb3VyIGFzcywgYnV0CisgICAgICAgKiBpdCBzdGlsbCBzZWVtcyBhIGJpdCBzdWNreS4gSXQgYWxzbyBoYXMgbm9uLXNlY3VyaXR5IHN1Y2thZ2U7CisgICAgICAgKiByZWFsbHkgd2UnZCBwcmVmZXIgdG8gZXhpdCBpZiB0aGUgc29ja2V0IGlzIGFscmVhZHkgaW4gdXNlLgorICAgICAgICogQnV0IHRoZXJlIGRvZXNuJ3Qgc2VlbSB0byBiZSBhIGdvb2Qgd2F5IHRvIGRvIHRoaXMuCisgICAgICAgKgorICAgICAgICogSnVzdCB0byBiZSBleHRyYSBjYXJlZnVsLCBJIHRocmV3IGluIHRoZSBzdGF0KCkgLSBjbGVhcmx5CisgICAgICAgKiB0aGUgc3RhdCgpIGNhbid0ICpmaXgqIGFueSBzZWN1cml0eSBpc3N1ZSwgYnV0IGl0IGF0IGxlYXN0CisgICAgICAgKiBhdm9pZHMgaW5hZHZlcnRlbnQvYWNjaWRlbnRhbCBkYXRhIGxvc3MuCisgICAgICAgKi8KKyAgICAgIHsKKyAgICAgICAgc3RydWN0IHN0YXQgc2I7CisKKyAgICAgICAgaWYgKHN0YXQgKHBhdGgsICZzYikgPT0gMCAmJgorICAgICAgICAgICAgU19JU1NPQ0sgKHNiLnN0X21vZGUpKQorICAgICAgICAgIHVubGluayAocGF0aCk7CisgICAgICB9CisKKyAgICAgIGlmIChwYXRoX2xlbiA+IF9EQlVTX01BWF9TVU5fUEFUSF9MRU5HVEgpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfQkFEX0FERFJFU1MsCisgICAgICAgICAgICAgICAgICAgICAgIlNvY2tldCBuYW1lIHRvbyBsb25nXG4iKTsKKyAgICAgICAgICBfZGJ1c19jbG9zZSAobGlzdGVuX2ZkLCBOVUxMKTsKKyAgICAgICAgICByZXR1cm4gLTE7CisJfQorCisgICAgICBzdHJuY3B5IChhZGRyLnN1bl9wYXRoLCBwYXRoLCBzaXplb2YgKGFkZHIuc3VuX3BhdGgpIC0gMSk7CisgICAgfQorCisgIGlmIChiaW5kIChsaXN0ZW5fZmQsIChzdHJ1Y3Qgc29ja2FkZHIqKSAmYWRkciwgX0RCVVNfU1RSVUNUX09GRlNFVCAoc3RydWN0IHNvY2thZGRyX3VuLCBzdW5fcGF0aCkgKyBwYXRoX2xlbikgPCAwKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gYmluZCBzb2NrZXQgXCIlc1wiOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgcGF0aCwgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICBfZGJ1c19jbG9zZSAobGlzdGVuX2ZkLCBOVUxMKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgaWYgKGxpc3RlbiAobGlzdGVuX2ZkLCBTT01BWENPTk4gLyogYmFja2xvZyAqLykgPCAwKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gbGlzdGVuIG9uIHNvY2tldCBcIiVzXCI6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBwYXRoLCBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIF9kYnVzX2Nsb3NlIChsaXN0ZW5fZmQsIE5VTEwpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICBpZiAoIV9kYnVzX3NldF9mZF9ub25ibG9ja2luZyAobGlzdGVuX2ZkLCBlcnJvcikpCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgX2RidXNfY2xvc2UgKGxpc3Rlbl9mZCwgTlVMTCk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIC8qIFRyeSBvcGVuaW5nIHVwIHRoZSBwZXJtaXNzaW9ucywgYnV0IGlmIHdlIGNhbid0LCBqdXN0IGdvIGFoZWFkCisgICAqIGFuZCBjb250aW51ZSwgbWF5YmUgaXQgd2lsbCBiZSBnb29kIGVub3VnaC4KKyAgICovCisgIGlmICghYWJzdHJhY3QgJiYgY2htb2QgKHBhdGgsIDA3NzcpIDwgMCkKKyAgICBfZGJ1c193YXJuICgiQ291bGQgbm90IHNldCBtb2RlIDA3Nzcgb24gc29ja2V0ICVzIiwgcGF0aCk7CisKKyAgcmV0dXJuIGxpc3Rlbl9mZDsKK30KKworLyoqCisgKiBBY3F1aXJlcyBvbmUgb3IgbW9yZSBzb2NrZXRzIHBhc3NlZCBpbiBmcm9tIHN5c3RlbWQuIFRoZSBzb2NrZXRzCisgKiBhcmUgc2V0IHRvIGJlIG5vbmJsb2NraW5nLgorICoKKyAqIFRoaXMgd2lsbCBzZXQgRkRfQ0xPRVhFQyBmb3IgdGhlIHNvY2tldHMgcmV0dXJuZWQuCisgKgorICogQHBhcmFtIGZkcyB0aGUgZmlsZSBkZXNjcmlwdG9ycworICogQHBhcmFtIGVycm9yIHJldHVybiBsb2NhdGlvbiBmb3IgZXJyb3JzCisgKiBAcmV0dXJucyB0aGUgbnVtYmVyIG9mIGZpbGUgZGVzY3JpcHRvcnMKKyAqLworaW50CitfZGJ1c19saXN0ZW5fc3lzdGVtZF9zb2NrZXRzIChEQnVzU29ja2V0ICoqZmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgKmVycm9yKQoreworI2lmZGVmIEhBVkVfU1lTVEVNRAorICBpbnQgciwgbjsKKyAgaW50IGZkOworICBEQnVzU29ja2V0ICpuZXdfZmRzOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIG4gPSBzZF9saXN0ZW5fZmRzIChUUlVFKTsKKyAgaWYgKG4gPCAwKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoLW4pLAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gYWNxdWlyZSBzeXN0ZW1kIHNvY2tldDogJXMiLAorICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmVycm9yICgtbikpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICBpZiAobiA8PSAwKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9CQURfQUREUkVTUywKKyAgICAgICAgICAgICAgICAgICAgICAiTm8gc29ja2V0IHJlY2VpdmVkLiIpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICBmb3IgKGZkID0gU0RfTElTVEVOX0ZEU19TVEFSVDsgZmQgPCBTRF9MSVNURU5fRkRTX1NUQVJUICsgbjsgZmQgKyspCisgICAgeworICAgICAgciA9IHNkX2lzX3NvY2tldCAoZmQsIEFGX1VOU1BFQywgU09DS19TVFJFQU0sIDEpOworICAgICAgaWYgKHIgPCAwKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vICgtciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gdmVyaWZ5IHN5c3RlbWQgc29ja2V0IHR5cGU6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKC1yKSk7CisgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgIGlmICghcikKKyAgICAgICAgeworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9CQURfQUREUkVTUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlBhc3NlZCBzb2NrZXQgaGFzIHdyb25nIHR5cGUuIik7CisgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorCisgIC8qIE9LLCB0aGUgZmlsZSBkZXNjcmlwdG9ycyBhcmUgYWxsIGdvb2QsIHNvIGxldCdzIHRha2UgcG9zZXNzaW9uIG9mCisgICAgIHRoZW0gdGhlbi4gKi8KKworICBuZXdfZmRzID0gZGJ1c19uZXcgKERCdXNTb2NrZXQsIG4pOworICBpZiAoIW5ld19mZHMpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwKKyAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGFsbG9jYXRlIGZpbGUgaGFuZGxlIGFycmF5LiIpOworICAgICAgZ290byBmYWlsOworICAgIH0KKworICBmb3IgKGZkID0gU0RfTElTVEVOX0ZEU19TVEFSVDsgZmQgPCBTRF9MSVNURU5fRkRTX1NUQVJUICsgbjsgZmQgKyspCisgICAgeworICAgICAgaWYgKCFfZGJ1c19zZXRfZmRfbm9uYmxvY2tpbmcgKGZkLCBlcnJvcikpCisgICAgICAgIHsKKyAgICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisKKyAgICAgIG5ld19mZHNbZmQgLSBTRF9MSVNURU5fRkRTX1NUQVJUXS5mZCA9IGZkOworICAgIH0KKworICAqZmRzID0gbmV3X2ZkczsKKyAgcmV0dXJuIG47CisKKyBmYWlsOgorCisgIGZvciAoZmQgPSBTRF9MSVNURU5fRkRTX1NUQVJUOyBmZCA8IFNEX0xJU1RFTl9GRFNfU1RBUlQgKyBuOyBmZCArKykKKyAgICB7CisgICAgICBfZGJ1c19jbG9zZSAoZmQsIE5VTEwpOworICAgIH0KKworICBkYnVzX2ZyZWUgKG5ld19mZHMpOworICByZXR1cm4gLTE7CisjZWxzZQorICBkYnVzX3NldF9lcnJvcl9jb25zdCAoZXJyb3IsIERCVVNfRVJST1JfTk9UX1NVUFBPUlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJkYnVzIHdhcyBjb21waWxlZCB3aXRob3V0IHN5c3RlbWQgc3VwcG9ydCIpOworICByZXR1cm4gLTE7CisjZW5kaWYKK30KKworLyogQ29udmVydCBhbiBlcnJvciBjb2RlIGZyb20gZ2V0YWRkcmluZm8oKSBvciBnZXRuYW1laW5mbygpIGludG8KKyAqIGEgRC1CdXMgZXJyb3IgbmFtZS4gKi8KK3N0YXRpYyBjb25zdCBjaGFyICoKK19kYnVzX2Vycm9yX2Zyb21fZ2FpIChpbnQgZ2FpX3JlcywKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgc2F2ZWRfZXJybm8pCit7CisgIHN3aXRjaCAoZ2FpX3JlcykKKyAgICB7CisjaWZkZWYgRUFJX0ZBTUlMWQorICAgICAgY2FzZSBFQUlfRkFNSUxZOgorICAgICAgICAvKiBhaV9mYW1pbHkgbm90IHN1cHBvcnRlZCAoYXQgYWxsKSAqLworICAgICAgICByZXR1cm4gREJVU19FUlJPUl9OT1RfU1VQUE9SVEVEOworI2VuZGlmCisKKyNpZmRlZiBFQUlfU09DS1RZUEUKKyAgICAgIGNhc2UgRUFJX1NPQ0tUWVBFOgorICAgICAgICAvKiBhaV9zb2NrdHlwZSBub3Qgc3VwcG9ydGVkIChhdCBhbGwpICovCisgICAgICAgIHJldHVybiBEQlVTX0VSUk9SX05PVF9TVVBQT1JURUQ7CisjZW5kaWYKKworI2lmZGVmIEVBSV9NRU1PUlkKKyAgICAgIGNhc2UgRUFJX01FTU9SWToKKyAgICAgICAgLyogT3V0IG9mIG1lbW9yeSAqLworICAgICAgICByZXR1cm4gREJVU19FUlJPUl9OT19NRU1PUlk7CisjZW5kaWYKKworI2lmZGVmIEVBSV9TWVNURU0KKyAgICAgIGNhc2UgRUFJX1NZU1RFTToKKyAgICAgICAgLyogVW5zcGVjaWZpZWQgc3lzdGVtIGVycm9yLCBkZXRhaWxzIGluIGVycm5vICovCisgICAgICAgIHJldHVybiBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChzYXZlZF9lcnJubyk7CisjZW5kaWYKKworICAgICAgY2FzZSAwOgorICAgICAgICAvKiBJdCBzdWNjZWVkZWQsIGJ1dCB3ZSBkaWRuJ3QgZ2V0IGFueSBhZGRyZXNzZXM/ICovCisgICAgICAgIHJldHVybiBEQlVTX0VSUk9SX0ZBSUxFRDsKKworICAgICAgLyogRUFJX0FHQUlOOiBUcmFuc2llbnQgZmFpbHVyZSAqLworICAgICAgLyogRUFJX0JBREZMQUdTOiBpbnZhbGlkIGFpX2ZsYWdzIChwcm9ncmFtbWluZyBlcnJvcikgKi8KKyAgICAgIC8qIEVBSV9GQUlMOiBOb24tcmVjb3ZlcmFibGUgZmFpbHVyZSAqLworICAgICAgLyogRUFJX05PREFUQTogaG9zdCBleGlzdHMgYnV0IGhhcyBubyBhZGRyZXNzZXMgKi8KKyAgICAgIC8qIEVBSV9OT05BTUU6IGhvc3QgZG9lcyBub3QgZXhpc3QgKi8KKyAgICAgIC8qIEVBSV9PVkVSRkxPVzogYXJndW1lbnQgYnVmZmVyIG92ZXJmbG93ICovCisgICAgICAvKiBFQUlfU0VSVklDRTogc2VydmljZSBub3QgYXZhaWxhYmxlIGZvciBzcGVjaWZpZWQgc29ja2V0CisgICAgICAgKiB0eXBlICh3ZSBzaG91bGQgbmV2ZXIgc2VlIHRoaXMgYmVjYXVzZSB3ZSB1c2UgbnVtZXJpYworICAgICAgICogcG9ydHMpICovCisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gREJVU19FUlJPUl9GQUlMRUQ7CisgICAgfQorfQorCisvKioKKyAqIENyZWF0ZXMgYSBzb2NrZXQgYW5kIGNvbm5lY3RzIHRvIGEgc29ja2V0IGF0IHRoZSBnaXZlbiBob3N0CisgKiBhbmQgcG9ydC4gVGhlIGNvbm5lY3Rpb24gZmQgaXMgcmV0dXJuZWQsIGFuZCBpcyBzZXQgdXAgYXMKKyAqIG5vbmJsb2NraW5nLgorICoKKyAqIFRoaXMgd2lsbCBzZXQgRkRfQ0xPRVhFQyBmb3IgdGhlIHNvY2tldCByZXR1cm5lZAorICoKKyAqIEBwYXJhbSBob3N0IHRoZSBob3N0IG5hbWUgdG8gY29ubmVjdCB0bworICogQHBhcmFtIHBvcnQgdGhlIHBvcnQgdG8gY29ubmVjdCB0bworICogQHBhcmFtIGZhbWlseSB0aGUgYWRkcmVzcyBmYW1pbHkgdG8gbGlzdGVuIG9uLCBOVUxMIGZvciBhbGwKKyAqIEBwYXJhbSBlcnJvciByZXR1cm4gbG9jYXRpb24gZm9yIGVycm9yIGNvZGUKKyAqIEByZXR1cm5zIGNvbm5lY3Rpb24gZmlsZSBkZXNjcmlwdG9yIG9yIC0xIG9uIGVycm9yCisgKi8KK0RCdXNTb2NrZXQKK19kYnVzX2Nvbm5lY3RfdGNwX3NvY2tldCAoY29uc3QgY2hhciAgICAgKmhvc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqZmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgICAgcmV0dXJuIF9kYnVzX2Nvbm5lY3RfdGNwX3NvY2tldF93aXRoX25vbmNlIChob3N0LCBwb3J0LCBmYW1pbHksIChjb25zdCBjaGFyKilOVUxMLCBlcnJvcik7Cit9CisKK0RCdXNTb2NrZXQKK19kYnVzX2Nvbm5lY3RfdGNwX3NvY2tldF93aXRoX25vbmNlIChjb25zdCBjaGFyICAgICAqaG9zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqZmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpub25jZWZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBpbnQgc2F2ZWRfZXJybm8gPSAwOworICBEQnVzU29ja2V0IGZkID0gREJVU19TT0NLRVRfSU5JVDsKKyAgaW50IHJlczsKKyAgc3RydWN0IGFkZHJpbmZvIGhpbnRzOworICBzdHJ1Y3QgYWRkcmluZm8gKmFpLCAqdG1wOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUihlcnJvcik7CisKKyAgX0RCVVNfWkVSTyAoaGludHMpOworCisgIGlmICghZmFtaWx5KQorICAgIGhpbnRzLmFpX2ZhbWlseSA9IEFGX1VOU1BFQzsKKyAgZWxzZSBpZiAoIXN0cmNtcChmYW1pbHksICJpcHY0IikpCisgICAgaGludHMuYWlfZmFtaWx5ID0gQUZfSU5FVDsKKyAgZWxzZSBpZiAoIXN0cmNtcChmYW1pbHksICJpcHY2IikpCisgICAgaGludHMuYWlfZmFtaWx5ID0gQUZfSU5FVDY7CisgIGVsc2UKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgREJVU19FUlJPUl9CQURfQUREUkVTUywKKyAgICAgICAgICAgICAgICAgICAgICAiVW5rbm93biBhZGRyZXNzIGZhbWlseSAlcyIsIGZhbWlseSk7CisgICAgICByZXR1cm4gX2RidXNfc29ja2V0X2dldF9pbnZhbGlkICgpOworICAgIH0KKyAgaGludHMuYWlfcHJvdG9jb2wgPSBJUFBST1RPX1RDUDsKKyAgaGludHMuYWlfc29ja3R5cGUgPSBTT0NLX1NUUkVBTTsKKyAgaGludHMuYWlfZmxhZ3MgPSBBSV9BRERSQ09ORklHOworCisgIGlmICgocmVzID0gZ2V0YWRkcmluZm8oaG9zdCwgcG9ydCwgJmhpbnRzLCAmYWkpKSAhPSAwKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19lcnJvcl9mcm9tX2dhaSAocmVzLCBlcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBsb29rdXAgaG9zdC9wb3J0OiBcIiVzOiVzXCI6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgIGhvc3QsIHBvcnQsIGdhaV9zdHJlcnJvcihyZXMpLCByZXMpOworICAgICAgcmV0dXJuIF9kYnVzX3NvY2tldF9nZXRfaW52YWxpZCAoKTsKKyAgICB9CisKKyAgdG1wID0gYWk7CisgIHdoaWxlICh0bXApCisgICAgeworICAgICAgaWYgKCFfZGJ1c19vcGVuX3NvY2tldCAoJmZkLmZkLCB0bXAtPmFpX2ZhbWlseSwgU09DS19TVFJFQU0sIDAsIGVycm9yKSkKKyAgICAgICAgeworICAgICAgICAgIGZyZWVhZGRyaW5mbyhhaSk7CisgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVChlcnJvcik7CisgICAgICAgICAgcmV0dXJuIF9kYnVzX3NvY2tldF9nZXRfaW52YWxpZCAoKTsKKyAgICAgICAgfQorICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSKGVycm9yKTsKKworICAgICAgaWYgKGNvbm5lY3QgKGZkLmZkLCAoc3RydWN0IHNvY2thZGRyKikgdG1wLT5haV9hZGRyLCB0bXAtPmFpX2FkZHJsZW4pIDwgMCkKKyAgICAgICAgeworICAgICAgICAgIHNhdmVkX2Vycm5vID0gZXJybm87CisgICAgICAgICAgX2RidXNfY2xvc2UgKGZkLmZkLCBOVUxMKTsKKyAgICAgICAgICBmZC5mZCA9IC0xOworICAgICAgICAgIHRtcCA9IHRtcC0+YWlfbmV4dDsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICBicmVhazsKKyAgICB9CisgIGZyZWVhZGRyaW5mbyhhaSk7CisKKyAgaWYgKGZkLmZkID09IC0xKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChzYXZlZF9lcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBjb25uZWN0IHRvIHNvY2tldCBcIiVzOiVzXCIgJXMiLAorICAgICAgICAgICAgICAgICAgICAgIGhvc3QsIHBvcnQsIF9kYnVzX3N0cmVycm9yKHNhdmVkX2Vycm5vKSk7CisgICAgICByZXR1cm4gX2RidXNfc29ja2V0X2dldF9pbnZhbGlkICgpOworICAgIH0KKworICBpZiAobm9uY2VmaWxlICE9IE5VTEwpCisgICAgeworICAgICAgREJ1c1N0cmluZyBub25jZWZpbGVTdHI7CisgICAgICBkYnVzX2Jvb2xfdCByZXQ7CisgICAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJm5vbmNlZmlsZVN0ciwgbm9uY2VmaWxlKTsKKyAgICAgIHJldCA9IF9kYnVzX3NlbmRfbm9uY2UgKGZkLCAmbm9uY2VmaWxlU3RyLCBlcnJvcik7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJm5vbmNlZmlsZVN0cik7CisKKyAgICAgIGlmICghcmV0KQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfY2xvc2UgKGZkLmZkLCBOVUxMKTsKKyAgICAgICAgICByZXR1cm4gX2RidXNfc29ja2V0X2dldF9pbnZhbGlkICgpOworICAgICAgICB9CisgICAgfQorCisgIGlmICghX2RidXNfc2V0X2ZkX25vbmJsb2NraW5nIChmZC5mZCwgZXJyb3IpKQorICAgIHsKKyAgICAgIF9kYnVzX2Nsb3NlIChmZC5mZCwgTlVMTCk7CisgICAgICByZXR1cm4gX2RidXNfc29ja2V0X2dldF9pbnZhbGlkICgpOworICAgIH0KKworICByZXR1cm4gZmQ7Cit9CisKKy8qKgorICogQ3JlYXRlcyBhIHNvY2tldCBhbmQgYmluZHMgaXQgdG8gdGhlIGdpdmVuIHBhdGgsIHRoZW4gbGlzdGVucyBvbgorICogdGhlIHNvY2tldC4gVGhlIHNvY2tldCBpcyBzZXQgdG8gYmUgbm9uYmxvY2tpbmcuICBJbiBjYXNlIG9mIHBvcnQ9MAorICogYSByYW5kb20gZnJlZSBwb3J0IGlzIHVzZWQgYW5kIHJldHVybmVkIGluIHRoZSBwb3J0IHBhcmFtZXRlci4KKyAqIElmIGluYWRkcl9hbnkgaXMgc3BlY2lmaWVkLCB0aGUgaG9zdG5hbWUgaXMgaWdub3JlZC4KKyAqCisgKiBUaGlzIHdpbGwgc2V0IEZEX0NMT0VYRUMgZm9yIHRoZSBzb2NrZXQgcmV0dXJuZWQKKyAqCisgKiBAcGFyYW0gaG9zdCB0aGUgaG9zdCBuYW1lIHRvIGxpc3RlbiBvbgorICogQHBhcmFtIHBvcnQgdGhlIHBvcnQgdG8gbGlzdGVuIG9uLCBpZiB6ZXJvIGEgZnJlZSBwb3J0IHdpbGwgYmUgdXNlZAorICogQHBhcmFtIGZhbWlseSB0aGUgYWRkcmVzcyBmYW1pbHkgdG8gbGlzdGVuIG9uLCBOVUxMIGZvciBhbGwKKyAqIEBwYXJhbSByZXRwb3J0IHN0cmluZyB0byByZXR1cm4gdGhlIGFjdHVhbCBwb3J0IGxpc3RlbmVkIG9uCisgKiBAcGFyYW0gZmRzX3AgbG9jYXRpb24gdG8gc3RvcmUgcmV0dXJuZWQgZmlsZSBkZXNjcmlwdG9ycworICogQHBhcmFtIGVycm9yIHJldHVybiBsb2NhdGlvbiBmb3IgZXJyb3JzCisgKiBAcmV0dXJucyB0aGUgbnVtYmVyIG9mIGxpc3RlbmluZyBmaWxlIGRlc2NyaXB0b3JzIG9yIC0xIG9uIGVycm9yCisgKi8KK2ludAorX2RidXNfbGlzdGVuX3RjcF9zb2NrZXQgKGNvbnN0IGNoYXIgICAgICpob3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpmYW1pbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgKnJldHBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1NvY2tldCAgICAqKmZkc19wLAorICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgaW50IHNhdmVkX2Vycm5vOworICBpbnQgbmxpc3Rlbl9mZCA9IDAsIHJlcywgaTsKKyAgREJ1c1NvY2tldCAqbGlzdGVuX2ZkID0gTlVMTDsKKyAgc3RydWN0IGFkZHJpbmZvIGhpbnRzOworICBzdHJ1Y3QgYWRkcmluZm8gKmFpLCAqdG1wOworICB1bnNpZ25lZCBpbnQgcmV1c2VhZGRyOworCisgICpmZHNfcCA9IE5VTEw7CisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIF9EQlVTX1pFUk8gKGhpbnRzKTsKKworICBpZiAoIWZhbWlseSkKKyAgICBoaW50cy5haV9mYW1pbHkgPSBBRl9VTlNQRUM7CisgIGVsc2UgaWYgKCFzdHJjbXAoZmFtaWx5LCAiaXB2NCIpKQorICAgIGhpbnRzLmFpX2ZhbWlseSA9IEFGX0lORVQ7CisgIGVsc2UgaWYgKCFzdHJjbXAoZmFtaWx5LCAiaXB2NiIpKQorICAgIGhpbnRzLmFpX2ZhbWlseSA9IEFGX0lORVQ2OworICBlbHNlCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfQkFEX0FERFJFU1MsCisgICAgICAgICAgICAgICAgICAgICAgIlVua25vd24gYWRkcmVzcyBmYW1pbHkgJXMiLCBmYW1pbHkpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICBoaW50cy5haV9wcm90b2NvbCA9IElQUFJPVE9fVENQOworICBoaW50cy5haV9zb2NrdHlwZSA9IFNPQ0tfU1RSRUFNOworICBoaW50cy5haV9mbGFncyA9IEFJX0FERFJDT05GSUcgfCBBSV9QQVNTSVZFOworCisgcmVkb19sb29rdXBfd2l0aF9wb3J0OgorICBhaSA9IE5VTEw7CisgIGlmICgocmVzID0gZ2V0YWRkcmluZm8oaG9zdCwgcG9ydCwgJmhpbnRzLCAmYWkpKSAhPSAwIHx8ICFhaSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgX2RidXNfZXJyb3JfZnJvbV9nYWkgKHJlcywgZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gbG9va3VwIGhvc3QvcG9ydDogXCIlczolc1wiOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICBob3N0ID8gaG9zdCA6ICIqIiwgcG9ydCwgZ2FpX3N0cmVycm9yKHJlcyksIHJlcyk7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgdG1wID0gYWk7CisgIHdoaWxlICh0bXApCisgICAgeworICAgICAgaW50IGZkID0gLTEsIHRjcF9ub2RlbGF5X29uOworICAgICAgREJ1c1NvY2tldCAqbmV3bGlzdGVuX2ZkOworCisgICAgICBpZiAoIV9kYnVzX29wZW5fc29ja2V0ICgmZmQsIHRtcC0+YWlfZmFtaWx5LCBTT0NLX1NUUkVBTSwgMCwgZXJyb3IpKQorICAgICAgICB7CisgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVChlcnJvcik7CisgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgIH0KKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUihlcnJvcik7CisKKyAgICAgIHJldXNlYWRkciA9IDE7CisgICAgICBpZiAoc2V0c29ja29wdCAoZmQsIFNPTF9TT0NLRVQsIFNPX1JFVVNFQUREUiwgJnJldXNlYWRkciwgc2l6ZW9mKHJldXNlYWRkcikpPT0tMSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJGYWlsZWQgdG8gc2V0IHNvY2tldCBvcHRpb24gXCIlczolc1wiOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgaG9zdCA/IGhvc3QgOiAiKiIsIHBvcnQsIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgICB9CisKKyAgICAgIC8qIE5hZ2xlJ3MgYWxnb3JpdGhtIGltcG9zZXMgYSBodWdlIGRlbGF5IG9uIHRoZSBpbml0aWFsIG1lc3NhZ2VzCisgICAgICAgICBnb2luZyBvdmVyIFRDUC4gKi8KKyAgICAgIHRjcF9ub2RlbGF5X29uID0gMTsKKyAgICAgIGlmIChzZXRzb2Nrb3B0IChmZCwgSVBQUk9UT19UQ1AsIFRDUF9OT0RFTEFZLCAmdGNwX25vZGVsYXlfb24sIHNpemVvZiAodGNwX25vZGVsYXlfb24pKSA9PSAtMSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJGYWlsZWQgdG8gc2V0IFRDUF9OT0RFTEFZIHNvY2tldCBvcHRpb24gXCIlczolc1wiOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgaG9zdCA/IGhvc3QgOiAiKiIsIHBvcnQsIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgICB9CisKKyAgICAgIGlmIChiaW5kIChmZCwgKHN0cnVjdCBzb2NrYWRkciopIHRtcC0+YWlfYWRkciwgdG1wLT5haV9hZGRybGVuKSA8IDApCisgICAgICAgIHsKKyAgICAgICAgICBzYXZlZF9lcnJubyA9IGVycm5vOworICAgICAgICAgIF9kYnVzX2Nsb3NlKGZkLCBOVUxMKTsKKyAgICAgICAgICBpZiAoc2F2ZWRfZXJybm8gPT0gRUFERFJJTlVTRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogRGVwZW5kaW5nIG9uIGtlcm5lbCBwb2xpY3ksIGJpbmRpbmcgdG8gYW4gSVB2NiBhZGRyZXNzCisgICAgICAgICAgICAgICAgIG1pZ2h0IGltcGxpY2l0bHkgYmluZCB0byBhIGNvcnJlc3BvbmRpbmcgSVB2NAorICAgICAgICAgICAgICAgICBhZGRyZXNzIG9yIHZpY2UgdmVyc2EsIHJlc3VsdGluZyBpbiBFQUREUklOVVNFIGZvciB0aGUKKyAgICAgICAgICAgICAgICAgb3RoZXIgb25lIChlLmcuIGJpbmR2Nm9ubHk9MCBvbiBMaW51eCkuCisKKyAgICAgICAgICAgICAgICAgQWxzbywgYWZ0ZXIgd2UgImdvdG8gcmVkb19sb29rdXBfd2l0aF9wb3J0IiBhZnRlciBiaW5kaW5nCisgICAgICAgICAgICAgICAgIGEgcG9ydCBvbiBvbmUgb2YgdGhlIHBvc3NpYmxlIGFkZHJlc3Nlcywgd2Ugd2lsbAorICAgICAgICAgICAgICAgICB0cnkgdG8gYmluZCB0aGF0IHNhbWUgcG9ydCBvbiBldmVyeSBhZGRyZXNzLCBpbmNsdWRpbmcgdGhlCisgICAgICAgICAgICAgICAgIHNhbWUgYWRkcmVzcyBhZ2FpbiBmb3IgYSBzZWNvbmQgdGltZTsgdGhhdCBvbmUgd2lsbAorICAgICAgICAgICAgICAgICBhbHNvIGZhaWwgd2l0aCBFQUREUklOVVNFLgorCisgICAgICAgICAgICAgICAgIEZvciBib3RoIHRob3NlIHJlYXNvbnMsIGlnbm9yZSBFQUREUklOVVNFIGhlcmUgKi8KKyAgICAgICAgICAgICAgdG1wID0gdG1wLT5haV9uZXh0OworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKHNhdmVkX2Vycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBiaW5kIHNvY2tldCBcIiVzOiVzXCI6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdCA/IGhvc3QgOiAiKiIsIHBvcnQsIF9kYnVzX3N0cmVycm9yIChzYXZlZF9lcnJubykpOworICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICB9CisKKyAgICAgIGlmIChsaXN0ZW4gKGZkLCAzMCAvKiBiYWNrbG9nICovKSA8IDApCisgICAgICAgIHsKKyAgICAgICAgICBzYXZlZF9lcnJubyA9IGVycm5vOworICAgICAgICAgIF9kYnVzX2Nsb3NlIChmZCwgTlVMTCk7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChzYXZlZF9lcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gbGlzdGVuIG9uIHNvY2tldCBcIiVzOiVzXCI6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdCA/IGhvc3QgOiAiKiIsIHBvcnQsIF9kYnVzX3N0cmVycm9yIChzYXZlZF9lcnJubykpOworICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICB9CisKKyAgICAgIG5ld2xpc3Rlbl9mZCA9IGRidXNfcmVhbGxvYyhsaXN0ZW5fZmQsIHNpemVvZihEQnVzU29ja2V0KSoobmxpc3Rlbl9mZCsxKSk7CisgICAgICBpZiAoIW5ld2xpc3Rlbl9mZCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX2Nsb3NlIChmZCwgTlVMTCk7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBhbGxvY2F0ZSBmaWxlIGhhbmRsZSBhcnJheSIpOworICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICB9CisgICAgICBsaXN0ZW5fZmQgPSBuZXdsaXN0ZW5fZmQ7CisgICAgICBsaXN0ZW5fZmRbbmxpc3Rlbl9mZF0uZmQgPSBmZDsKKyAgICAgIG5saXN0ZW5fZmQrKzsKKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aChyZXRwb3J0KSkKKyAgICAgICAgeworICAgICAgICAgIC8qIElmIHRoZSB1c2VyIGRpZG4ndCBzcGVjaWZ5IGEgcG9ydCwgb3IgdXNlZCAwLCB0aGVuCisgICAgICAgICAgICAgdGhlIGtlcm5lbCBjaG9vc2VzIGEgcG9ydC4gQWZ0ZXIgdGhlIGZpcnN0IGFkZHJlc3MKKyAgICAgICAgICAgICBpcyBib3VuZCB0bywgd2UgbmVlZCB0byBmb3JjZSBhbGwgcmVtYWluaW5nIGFkZHJlc3NlcworICAgICAgICAgICAgIHRvIHVzZSB0aGUgc2FtZSBwb3J0ICovCisgICAgICAgICAgaWYgKCFwb3J0IHx8ICFzdHJjbXAocG9ydCwgIjAiKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaW50IHJlc3VsdDsKKyAgICAgICAgICAgICAgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgYWRkcjsKKyAgICAgICAgICAgICAgc29ja2xlbl90IGFkZHJsZW47CisgICAgICAgICAgICAgIGNoYXIgcG9ydGJ1Zls1MF07CisKKyAgICAgICAgICAgICAgYWRkcmxlbiA9IHNpemVvZihhZGRyKTsKKyAgICAgICAgICAgICAgcmVzdWx0ID0gZ2V0c29ja25hbWUoZmQsIChzdHJ1Y3Qgc29ja2FkZHIqKSAmYWRkciwgJmFkZHJsZW4pOworCisgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gLTEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgc2F2ZWRfZXJybm8gPSBlcnJubzsKKyAgICAgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoc2F2ZWRfZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gcmV0cmlldmUgc29ja2V0IG5hbWUgZm9yIFwiJXM6JXNcIjogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3QgPyBob3N0IDogIioiLCBwb3J0LCBfZGJ1c19zdHJlcnJvciAoc2F2ZWRfZXJybm8pKTsKKyAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBpZiAoKHJlcyA9IGdldG5hbWVpbmZvICgoc3RydWN0IHNvY2thZGRyKikmYWRkciwgYWRkcmxlbiwgTlVMTCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydGJ1Ziwgc2l6ZW9mKHBvcnRidWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOSV9OVU1FUklDSE9TVCB8IE5JX05VTUVSSUNTRVJWKSkgIT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBzYXZlZF9lcnJubyA9IGVycm5vOworICAgICAgICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c19lcnJvcl9mcm9tX2dhaSAocmVzLCBzYXZlZF9lcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byByZXNvbHZlIHBvcnQgXCIlczolc1wiOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3N0ID8gaG9zdCA6ICIqIiwgcG9ydCwgZ2FpX3N0cmVycm9yKHJlcyksIHJlcyk7CisgICAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kKHJldHBvcnQsIHBvcnRidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIC8qIFJlbGVhc2UgY3VycmVudCBhZGRyZXNzIGxpc3QgJiByZWRvIGxvb2t1cCAqLworICAgICAgICAgICAgICBwb3J0ID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhKHJldHBvcnQpOworICAgICAgICAgICAgICBmcmVlYWRkcmluZm8oYWkpOworICAgICAgICAgICAgICBnb3RvIHJlZG9fbG9va3VwX3dpdGhfcG9ydDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZChyZXRwb3J0LCBwb3J0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgdG1wID0gdG1wLT5haV9uZXh0OworICAgIH0KKyAgZnJlZWFkZHJpbmZvKGFpKTsKKyAgYWkgPSBOVUxMOworCisgIGlmICghbmxpc3Rlbl9mZCkKKyAgICB7CisgICAgICBlcnJubyA9IEVBRERSSU5VU0U7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGJpbmQgc29ja2V0IFwiJXM6JXNcIjogJXMiLAorICAgICAgICAgICAgICAgICAgICAgIGhvc3QgPyBob3N0IDogIioiLCBwb3J0LCBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICBmb3IgKGkgPSAwIDsgaSA8IG5saXN0ZW5fZmQgOyBpKyspCisgICAgeworICAgICAgaWYgKCFfZGJ1c19zZXRfZmRfbm9uYmxvY2tpbmcgKGxpc3Rlbl9mZFtpXS5mZCwgZXJyb3IpKQorICAgICAgICB7CisgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgKmZkc19wID0gbGlzdGVuX2ZkOworCisgIHJldHVybiBubGlzdGVuX2ZkOworCisgZmFpbGVkOgorICBpZiAoYWkpCisgICAgZnJlZWFkZHJpbmZvKGFpKTsKKyAgZm9yIChpID0gMCA7IGkgPCBubGlzdGVuX2ZkIDsgaSsrKQorICAgIF9kYnVzX2Nsb3NlKGxpc3Rlbl9mZFtpXS5mZCwgTlVMTCk7CisgIGRidXNfZnJlZShsaXN0ZW5fZmQpOworICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAord3JpdGVfY3JlZGVudGlhbHNfYnl0ZSAoaW50ICAgICAgICAgICAgIHNlcnZlcl9mZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgaW50IGJ5dGVzX3dyaXR0ZW47CisgIGNoYXIgYnVmWzFdID0geyAnXDAnIH07CisjaWYgZGVmaW5lZChIQVZFX0NNU0dDUkVEKQorICB1bmlvbiB7CisJICBzdHJ1Y3QgY21zZ2hkciBoZHI7CisJICBjaGFyIGNyZWRbQ01TR19TUEFDRSAoc2l6ZW9mIChzdHJ1Y3QgY21zZ2NyZWQpKV07CisgIH0gY21zZzsKKyAgc3RydWN0IGlvdmVjIGlvdjsKKyAgc3RydWN0IG1zZ2hkciBtc2c7CisgIGlvdi5pb3ZfYmFzZSA9IGJ1ZjsKKyAgaW92Lmlvdl9sZW4gPSAxOworCisgIF9EQlVTX1pFUk8obXNnKTsKKyAgbXNnLm1zZ19pb3YgPSAmaW92OworICBtc2cubXNnX2lvdmxlbiA9IDE7CisKKyAgbXNnLm1zZ19jb250cm9sID0gKGNhZGRyX3QpICZjbXNnOworICBtc2cubXNnX2NvbnRyb2xsZW4gPSBDTVNHX1NQQUNFIChzaXplb2YgKHN0cnVjdCBjbXNnY3JlZCkpOworICBfREJVU19aRVJPKGNtc2cpOworICBjbXNnLmhkci5jbXNnX2xlbiA9IENNU0dfTEVOIChzaXplb2YgKHN0cnVjdCBjbXNnY3JlZCkpOworICBjbXNnLmhkci5jbXNnX2xldmVsID0gU09MX1NPQ0tFVDsKKyAgY21zZy5oZHIuY21zZ190eXBlID0gU0NNX0NSRURTOworI2VuZGlmCisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyBhZ2FpbjoKKworI2lmIGRlZmluZWQoSEFWRV9DTVNHQ1JFRCkKKyAgYnl0ZXNfd3JpdHRlbiA9IHNlbmRtc2cgKHNlcnZlcl9mZCwgJm1zZywgMAorI2lmIEhBVkVfREVDTF9NU0dfTk9TSUdOQUwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHxNU0dfTk9TSUdOQUwKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKworICAvKiBJZiB3ZSBIQVZFX0NNU0dDUkVELCB0aGUgT1Mgc3RpbGwgbWlnaHQgbm90IGxldCB1cyBzZW5kbXNnKCkKKyAgICogd2l0aCBhIFNPTF9TT0NLRVQvU0NNX0NSRURTIG1lc3NhZ2UgLSBmb3IgaW5zdGFuY2UsIEZyZWVCU0QKKyAgICogb25seSBhbGxvd3MgdGhhdCBvbiBBRl9VTklYLiBUcnkganVzdCBkb2luZyBhIHNlbmQoKSBpbnN0ZWFkLiAqLworICBpZiAoYnl0ZXNfd3JpdHRlbiA8IDAgJiYgZXJybm8gPT0gRUlOVkFMKQorI2VuZGlmCisgICAgeworICAgICAgYnl0ZXNfd3JpdHRlbiA9IHNlbmQgKHNlcnZlcl9mZCwgYnVmLCAxLCAwCisjaWYgSEFWRV9ERUNMX01TR19OT1NJR05BTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxNU0dfTk9TSUdOQUwKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgfQorCisgIGlmIChieXRlc193cml0dGVuIDwgMCAmJiBlcnJubyA9PSBFSU5UUikKKyAgICBnb3RvIGFnYWluOworCisgIGlmIChieXRlc193cml0dGVuIDwgMCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHdyaXRlIGNyZWRlbnRpYWxzIGJ5dGU6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgZWxzZSBpZiAoYnl0ZXNfd3JpdHRlbiA9PSAwKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9JT19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAid3JvdGUgemVybyBieXRlcyB3cml0aW5nIGNyZWRlbnRpYWxzIGJ5dGUiKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfZGJ1c19hc3NlcnQgKGJ5dGVzX3dyaXR0ZW4gPT0gMSk7CisgICAgICBfZGJ1c192ZXJib3NlICgid3JvdGUgY3JlZGVudGlhbHMgYnl0ZVxuIik7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9Cit9CisKKy8qIHJldHVybiBGQUxTRSBvbiBPT00sIFRSVUUgb3RoZXJ3aXNlLCBldmVuIGlmIG5vIGNyZWRlbnRpYWxzIHdlcmUgZm91bmQgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAorYWRkX2xpbnV4X3NlY3VyaXR5X2xhYmVsX3RvX2NyZWRlbnRpYWxzIChpbnQgICAgICAgICAgICAgIGNsaWVudF9mZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0NyZWRlbnRpYWxzICpjcmVkZW50aWFscykKK3sKKyNpZiBkZWZpbmVkKF9fbGludXhfXykgJiYgZGVmaW5lZChTT19QRUVSU0VDKQorICBEQnVzU3RyaW5nIGJ1ZjsKKyAgc29ja2xlbl90IGxlbiA9IDEwMjQ7CisgIGRidXNfYm9vbF90IG9vbSA9IEZBTFNFOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXRfcHJlYWxsb2NhdGVkICgmYnVmLCBsZW4pIHx8CisgICAgICAhX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKCZidWYsIGxlbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHdoaWxlIChnZXRzb2Nrb3B0IChjbGllbnRfZmQsIFNPTF9TT0NLRVQsIFNPX1BFRVJTRUMsCisgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2RhdGEgKCZidWYpLCAmbGVuKSA8IDApCisgICAgeworICAgICAgaW50IGUgPSBlcnJubzsKKworICAgICAgX2RidXNfdmVyYm9zZSAoImdldHNvY2tvcHQgZmFpbGVkIHdpdGggJXMsIGxlbiBub3cgJWx1XG4iLAorICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKGUpLCAodW5zaWduZWQgbG9uZykgbGVuKTsKKworICAgICAgaWYgKGUgIT0gRVJBTkdFIHx8IGxlbiA8PSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aF91aW50ICgmYnVmKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJGYWlsZWQgdG8gZ2V0c29ja29wdChTT19QRUVSU0VDKTogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKGUpKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICAvKiBJZiBub3QgZW5vdWdoIHNwYWNlLCBsZW4gaXMgdXBkYXRlZCB0byBiZSBlbm91Z2guCisgICAgICAgKiBUcnkgYWdhaW4gd2l0aCBhIGxhcmdlIGVub3VnaCBidWZmZXIuICovCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoICgmYnVmLCBsZW4pKQorICAgICAgICB7CisgICAgICAgICAgb29tID0gVFJVRTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICBfZGJ1c192ZXJib3NlICgid2lsbCB0cnkgYWdhaW4gd2l0aCAlbHVcbiIsICh1bnNpZ25lZCBsb25nKSBsZW4pOworICAgIH0KKworICBpZiAobGVuIDw9IDApCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoImdldHNvY2tvcHQoU09fUEVFUlNFQykgeWllbGRlZCA8PSAwIGJ5dGVzOiAlbHVcbiIsCisgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykgbGVuKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAobGVuID4gX2RidXNfc3RyaW5nX2dldF9sZW5ndGhfdWludCAoJmJ1ZikpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIiVsdSA+ICV1IiwgKHVuc2lnbmVkIGxvbmcpIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoX3VpbnQgKCZidWYpKTsKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImdldHNvY2tvcHQoU09fUEVFUlNFQykgb3ZlcmZsb3dlZCIpOworICAgIH0KKworICBpZiAoX2RidXNfc3RyaW5nX2dldF9ieXRlICgmYnVmLCBsZW4gLSAxKSA9PSAwKQorICAgIHsKKyAgICAgIC8qIHRoZSBrZXJuZWwgaW5jbHVkZWQgdGhlIHRyYWlsaW5nIFwwIGluIGl0cyBjb3VudCwKKyAgICAgICAqIGJ1dCBEQnVzU3RyaW5nIGFsd2F5cyBoYXMgYW4gZXh0cmEgXDAgYWZ0ZXIgdGhlIGRhdGEgYW55d2F5ICovCisgICAgICBfZGJ1c192ZXJib3NlICgic3VidHJhY3RpbmcgdHJhaWxpbmcgXFwwXG4iKTsKKyAgICAgIGxlbi0tOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoICgmYnVmLCBsZW4pKQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoInNob3J0ZW5pbmcgc3RyaW5nIHNob3VsZCBub3QgbGVhZCB0byBPT00iKTsKKyAgICAgIG9vbSA9IFRSVUU7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgaWYgKHN0cmxlbiAoX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmYnVmKSkgIT0gbGVuKQorICAgIHsKKyAgICAgIC8qIExTTSBwZW9wbGUgb24gdGhlIGxpbnV4LXNlY3VyaXR5LW1vZHVsZUAgbWFpbGluZyBsaXN0IHNheSB0aGlzCisgICAgICAgKiBzaG91bGQgbmV2ZXIgaGFwcGVuOiB0aGUgbGFiZWwgc2hvdWxkIGJlIGEgYnl0ZXN0cmluZyB3aXRoCisgICAgICAgKiBhbiBvcHRpb25hbCB0cmFpbGluZyBcMCAqLworICAgICAgX2RidXNfdmVyYm9zZSAoInNlY3VyaXR5IGxhYmVsIGZyb20ga2VybmVsIGhhZCBhbiBlbWJlZGRlZCBcXDAsICIKKyAgICAgICAgICAgICAgICAgICAgICJpZ25vcmluZyBpdFxuIik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgX2RidXNfdmVyYm9zZSAoImdldHNvY2tvcHQoU09fUEVFUlNFQyk6ICVsdSBieXRlcyBleGNsdWRpbmcgXFwwOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIGxlbiwKKyAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmYnVmKSk7CisKKyAgaWYgKCFfZGJ1c19jcmVkZW50aWFsc19hZGRfbGludXhfc2VjdXJpdHlfbGFiZWwgKGNyZWRlbnRpYWxzLAorICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZidWYpKSkKKyAgICB7CisgICAgICBvb20gPSBUUlVFOworICAgICAgZ290byBvdXQ7CisgICAgfQorCitvdXQ6CisgIF9kYnVzX3N0cmluZ19mcmVlICgmYnVmKTsKKyAgcmV0dXJuICFvb207CisjZWxzZQorICAvKiBubyBlcnJvciAqLworICByZXR1cm4gVFJVRTsKKyNlbmRpZgorfQorCisvKioKKyAqIFJlYWRzIGEgc2luZ2xlIGJ5dGUgd2hpY2ggbXVzdCBiZSBudWwgKGFuIGVycm9yIG9jY3VycyBvdGhlcndpc2UpLAorICogYW5kIHJlYWRzIHVuaXggY3JlZGVudGlhbHMgaWYgYXZhaWxhYmxlLiBDbGVhcnMgdGhlIGNyZWRlbnRpYWxzCisgKiBvYmplY3QsIHRoZW4gYWRkcyBwaWQvdWlkIGlmIGF2YWlsYWJsZSwgc28gYW55IHByZXZpb3VzIGNyZWRlbnRpYWxzCisgKiBzdG9yZWQgaW4gdGhlIG9iamVjdCBhcmUgbG9zdC4KKyAqCisgKiBEQnVzU2VydmVyIG1ha2VzIHRoZSBzZWN1cml0eSBhc3N1bXB0aW9uIHRoYXQgdGhlIGNyZWRlbnRpYWxzCisgKiByZXR1cm5lZCBieSB0aGlzIG1ldGhvZCBhcmUgdGhlIGNyZWRlbnRpYWxzIHRoYXQgd2VyZSBhY3RpdmUKKyAqIGF0IHRoZSB0aW1lIHRoZSBzb2NrZXQgd2FzIG9wZW5lZC4gRG8gbm90IGFkZCBBUElzIHRvIHRoaXMKKyAqIG1ldGhvZCB0aGF0IHdvdWxkIGJyZWFrIHRoYXQgYXNzdW1wdGlvbi4KKyAqCisgKiBJbiBwYXJ0aWN1bGFyLCBpdCBpcyBpbmNvcnJlY3QgdG8gdXNlIGFueSBBUEkgb2YgdGhlIGZvcm0KKyAqICJnZXQgdGhlIHByb2Nlc3MgSUQgYXQgdGhlIG90aGVyIGVuZCBvZiB0aGUgY29ubmVjdGlvbiwgdGhlbgorICogZGV0ZXJtaW5lIGl0cyB1aWQsIGdpZCwgb3Igb3RoZXIgY3JlZGVudGlhbHMgZnJvbSB0aGUgcGlkIgorICogKGUuZy4gbG9va2luZyBpbiAvcHJvYyBvbiBMaW51eCkuIElmIHdlIGRpZCB0aGF0LCB3ZSB3b3VsZAorICogYmUgdnVsbmVyYWJsZSB0byBzZXZlcmFsIGF0dGFja3MuIEEgbWFsaWNpb3VzIHByb2Nlc3MgY291bGQKKyAqIHF1ZXVlIHVwIHRoZSByZXN0IG9mIHRoZSBhdXRoZW50aWNhdGlvbiBoYW5kc2hha2UgYW5kIGEgbWFsaWNpb3VzCisgKiBtZXNzYWdlIHRoYXQgaXQgc2hvdWxkIG5vdCBiZSBhbGxvd2VkIHRvIHNlbmQsIHRoZW4gcmFjZSB3aXRoCisgKiB0aGUgREJ1c1NlcnZlciB0byBleGVjKCkgYSBtb3JlIHByaXZpbGVnZWQgKGUuZy4gc2V0dWlkKSBiaW5hcnkgdGhhdAorICogd291bGQgaGF2ZSBiZWVuIGFsbG93ZWQgdG8gc2VuZCB0aGF0IG1lc3NhZ2U7IG9yIGl0IGNvdWxkIGV4aXQsCisgKiBhbmQgYXJyYW5nZSBmb3IgZW5vdWdoIHNldHVpZCBwcm9jZXNzZXMgdG8gYmUgc3RhcnRlZCB0aGF0IGl0cworICogcGlkIHdvdWxkIGJlIHJlY3ljbGVkIGZvciBvbmUgb2YgdGhvc2UgcHJvY2Vzc2VzIHdpdGggaGlnaAorICogcHJvYmFiaWxpdHk7IG9yIGl0IGNvdWxkIGZkLXBhc3MgdGhlIGNvbm5lY3Rpb24gdG8gYSBtb3JlCisgKiBwcml2aWxlZ2VkIHByb2Nlc3MuCisgKgorICogUmV0dXJuIHZhbHVlIGluZGljYXRlcyB3aGV0aGVyIGEgYnl0ZSB3YXMgcmVhZCwgbm90IHdoZXRoZXIKKyAqIHdlIGdvdCB2YWxpZCBjcmVkZW50aWFscy4gT24gc29tZSBzeXN0ZW1zLCBzdWNoIGFzIExpbnV4LAorICogcmVhZGluZy93cml0aW5nIHRoZSBieXRlIGlzbid0IGFjdHVhbGx5IHJlcXVpcmVkLCBidXQgd2UgZG8gaXQKKyAqIGFueXdheSBqdXN0IHRvIGF2b2lkIG11bHRpcGxlIGNvZGVwYXRocy4KKyAqCisgKiBGYWlscyBpZiBubyBieXRlIGlzIGF2YWlsYWJsZSwgc28geW91IG11c3Qgc2VsZWN0KCkgZmlyc3QuCisgKgorICogVGhlIHBvaW50IG9mIHRoZSBieXRlIGlzIHRoYXQgb24gc29tZSBzeXN0ZW1zIHdlIGhhdmUgdG8KKyAqIHVzZSBzZW5kbXNnKCkvcmVjdm1zZygpIHRvIHRyYW5zbWl0IGNyZWRlbnRpYWxzLgorICoKKyAqIEBwYXJhbSBjbGllbnRfZmQgdGhlIGNsaWVudCBmaWxlIGRlc2NyaXB0b3IKKyAqIEBwYXJhbSBjcmVkZW50aWFscyBvYmplY3QgdG8gYWRkIGNsaWVudCBjcmVkZW50aWFscyB0bworICogQHBhcmFtIGVycm9yIGxvY2F0aW9uIHRvIHN0b3JlIGVycm9yIGNvZGUKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3JlYWRfY3JlZGVudGlhbHNfc29ja2V0ICAoREJ1c1NvY2tldCAgICAgICBjbGllbnRfZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDcmVkZW50aWFscyAqY3JlZGVudGlhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAqZXJyb3IpCit7CisgIHN0cnVjdCBtc2doZHIgbXNnOworICBzdHJ1Y3QgaW92ZWMgaW92OworICBjaGFyIGJ1ZjsKKyAgZGJ1c191aWRfdCB1aWRfcmVhZDsKKyAgZGJ1c19waWRfdCBwaWRfcmVhZDsKKyAgaW50IGJ5dGVzX3JlYWQ7CisKKyNpZmRlZiBIQVZFX0NNU0dDUkVECisgIHVuaW9uIHsKKyAgICBzdHJ1Y3QgY21zZ2hkciBoZHI7CisgICAgY2hhciBjcmVkW0NNU0dfU1BBQ0UgKHNpemVvZiAoc3RydWN0IGNtc2djcmVkKSldOworICB9IGNtc2c7CisjZW5kaWYKKworICAvKiBUaGUgUE9TSVggc3BlYyBjZXJ0YWlubHkgZG9lc24ndCBwcm9taXNlIHRoaXMsIGJ1dAorICAgKiB3ZSBuZWVkIHRoZXNlIGFzc2VydGlvbnMgdG8gZmFpbCBhcyBzb29uIGFzIHdlJ3JlIHdyb25nIGFib3V0CisgICAqIGl0IHNvIHdlIGNhbiBkbyB0aGUgcG9ydGluZyBmaXh1cHMKKyAgICovCisgIF9EQlVTX1NUQVRJQ19BU1NFUlQgKHNpemVvZiAocGlkX3QpIDw9IHNpemVvZiAoZGJ1c19waWRfdCkpOworICBfREJVU19TVEFUSUNfQVNTRVJUIChzaXplb2YgKHVpZF90KSA8PSBzaXplb2YgKGRidXNfdWlkX3QpKTsKKyAgX0RCVVNfU1RBVElDX0FTU0VSVCAoc2l6ZW9mIChnaWRfdCkgPD0gc2l6ZW9mIChkYnVzX2dpZF90KSk7CisKKyAgdWlkX3JlYWQgPSBEQlVTX1VJRF9VTlNFVDsKKyAgcGlkX3JlYWQgPSBEQlVTX1BJRF9VTlNFVDsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBfZGJ1c19jcmVkZW50aWFsc19jbGVhciAoY3JlZGVudGlhbHMpOworCisgIGlvdi5pb3ZfYmFzZSA9ICZidWY7CisgIGlvdi5pb3ZfbGVuID0gMTsKKworICBfREJVU19aRVJPKG1zZyk7CisgIG1zZy5tc2dfaW92ID0gJmlvdjsKKyAgbXNnLm1zZ19pb3ZsZW4gPSAxOworCisjaWYgZGVmaW5lZChIQVZFX0NNU0dDUkVEKQorICBfREJVU19aRVJPKGNtc2cpOworICBtc2cubXNnX2NvbnRyb2wgPSAoY2FkZHJfdCkgJmNtc2c7CisgIG1zZy5tc2dfY29udHJvbGxlbiA9IENNU0dfU1BBQ0UgKHNpemVvZiAoc3RydWN0IGNtc2djcmVkKSk7CisjZW5kaWYKKworIGFnYWluOgorICBieXRlc19yZWFkID0gcmVjdm1zZyAoY2xpZW50X2ZkLmZkLCAmbXNnLCAwKTsKKworICBpZiAoYnl0ZXNfcmVhZCA8IDApCisgICAgeworICAgICAgaWYgKGVycm5vID09IEVJTlRSKQorCWdvdG8gYWdhaW47CisKKyAgICAgIC8qIEVBR0FJTiBvciBFV09VTERCTE9DSyB3b3VsZCBiZSB1bmV4cGVjdGVkIGhlcmUgc2luY2Ugd2Ugd291bGQKKyAgICAgICAqIG5vcm1hbGx5IG9ubHkgY2FsbCByZWFkX2NyZWRlbnRpYWxzIGlmIHRoZSBzb2NrZXQgd2FzIHJlYWR5CisgICAgICAgKiBmb3IgcmVhZGluZworICAgICAgICovCisKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gcmVhZCBjcmVkZW50aWFscyBieXRlOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICBlbHNlIGlmIChieXRlc19yZWFkID09IDApCisgICAgeworICAgICAgLyogdGhpcyBzaG91bGQgbm90IGhhcHBlbiB1bmxlc3Mgd2UgYXJlIHVzaW5nIHJlY3Ztc2cgd3JvbmcsCisgICAgICAgKiBzbyBpcyBlc3NlbnRpYWxseSBoZXJlIGZvciBwYXJhbm9pYQorICAgICAgICovCisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gcmVhZCBjcmVkZW50aWFscyBieXRlICh6ZXJvLWxlbmd0aCByZWFkKSIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgZWxzZSBpZiAoYnVmICE9ICdcMCcpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiQ3JlZGVudGlhbHMgYnl0ZSB3YXMgbm90IG51bCIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBfZGJ1c192ZXJib3NlICgicmVhZCBjcmVkZW50aWFscyBieXRlXG4iKTsKKworICB7CisjaWZkZWYgU09fUEVFUkNSRUQKKyAgICAvKiBTdXBwb3J0ZWQgYnkgYXQgbGVhc3QgTGludXggYW5kIE9wZW5CU0QsIHdpdGggbWlub3IgZGlmZmVyZW5jZXMuCisgICAgICoKKyAgICAgKiBUaGlzIG1lY2hhbmlzbSBwYXNzZXMgdGhlIHByb2Nlc3MgSUQgdGhyb3VnaCBhbmQgZG9lcyBub3QgcmVxdWlyZQorICAgICAqIHRoZSBwZWVyJ3MgY29vcGVyYXRpb24sIHNvIHdlIHByZWZlciBpdCBvdmVyIGFsbCBvdGhlcnMuIE5vdGFibHksCisgICAgICogTGludXggYWxzbyBzdXBwb3J0cyBTQ01fQ1JFREVOVElBTFMsIHdoaWNoIGlzIHNpbWlsYXIgdG8gRnJlZUJTRAorICAgICAqIFNDTV9DUkVEUzsgaXQncyBpbXBsZW1lbnRlZCBpbiBHSU8sIGJ1dCB3ZSBkb24ndCB1c2UgaXQgaW4gZGJ1cyBhdCBhbGwsCisgICAgICogYmVjYXVzZSB0aGlzIGlzIG11Y2ggbGVzcyBmcmFnaWxlLgorICAgICAqLworI2lmZGVmIF9fT3BlbkJTRF9fCisgICAgc3RydWN0IHNvY2twZWVyY3JlZCBjcjsKKyNlbHNlCisgICAgc3RydWN0IHVjcmVkIGNyOworI2VuZGlmCisgICAgc29ja2xlbl90IGNyX2xlbiA9IHNpemVvZiAoY3IpOworCisgICAgaWYgKGdldHNvY2tvcHQgKGNsaWVudF9mZC5mZCwgU09MX1NPQ0tFVCwgU09fUEVFUkNSRUQsICZjciwgJmNyX2xlbikgIT0gMCkKKyAgICAgIHsKKyAgICAgICAgX2RidXNfdmVyYm9zZSAoIkZhaWxlZCB0byBnZXRzb2Nrb3B0KFNPX1BFRVJDUkVEKTogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgfQorICAgIGVsc2UgaWYgKGNyX2xlbiAhPSBzaXplb2YgKGNyKSkKKyAgICAgIHsKKyAgICAgICAgX2RidXNfdmVyYm9zZSAoIkZhaWxlZCB0byBnZXRzb2Nrb3B0KFNPX1BFRVJDUkVEKSwgcmV0dXJuZWQgJWQgYnl0ZXMsIGV4cGVjdGVkICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBjcl9sZW4sIChpbnQpIHNpemVvZiAoY3IpKTsKKyAgICAgIH0KKyAgICBlbHNlCisgICAgICB7CisgICAgICAgIHBpZF9yZWFkID0gY3IucGlkOworICAgICAgICB1aWRfcmVhZCA9IGNyLnVpZDsKKyAgICAgIH0KKyNlbGlmIGRlZmluZWQoSEFWRV9VTlBDQklEKSAmJiBkZWZpbmVkKExPQ0FMX1BFRVJFSUQpCisgICAgLyogQW5vdGhlciB2YXJpYW50IG9mIHRoZSBhYm92ZSAtIHVzZWQgb24gTmV0QlNECisgICAgICovCisgICAgc3RydWN0IHVucGNiaWQgY3I7CisgICAgc29ja2xlbl90IGNyX2xlbiA9IHNpemVvZiAoY3IpOworCisgICAgaWYgKGdldHNvY2tvcHQgKGNsaWVudF9mZC5mZCwgMCwgTE9DQUxfUEVFUkVJRCwgJmNyLCAmY3JfbGVuKSAhPSAwKQorICAgICAgeworICAgICAgICBfZGJ1c192ZXJib3NlICgiRmFpbGVkIHRvIGdldHNvY2tvcHQoTE9DQUxfUEVFUkVJRCk6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIH0KKyAgICBlbHNlIGlmIChjcl9sZW4gIT0gc2l6ZW9mIChjcikpCisgICAgICB7CisgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJGYWlsZWQgdG8gZ2V0c29ja29wdChMT0NBTF9QRUVSRUlEKSwgcmV0dXJuZWQgJWQgYnl0ZXMsIGV4cGVjdGVkICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBjcl9sZW4sIChpbnQpIHNpemVvZiAoY3IpKTsKKyAgICAgIH0KKyAgICBlbHNlCisgICAgICB7CisgICAgICAgIHBpZF9yZWFkID0gY3IudW5wX3BpZDsKKyAgICAgICAgdWlkX3JlYWQgPSBjci51bnBfZXVpZDsKKyAgICAgIH0KKyNlbGlmIGRlZmluZWQoSEFWRV9DTVNHQ1JFRCkKKyAgICAvKiBXZSBvbmx5IGNoZWNrIGZvciBIQVZFX0NNU0dDUkVELCBidXQgd2UncmUgcmVhbGx5IGFzc3VtaW5nIHRoYXQgdGhlCisgICAgICogcHJlc2VuY2Ugb2YgdGhhdCBzdHJ1Y3QgaW1wbGllcyBTQ01fQ1JFRFMuIFN1cHBvcnRlZCBieSBhdCBsZWFzdAorICAgICAqIEZyZWVCU0QgYW5kIERyYWdvbmZseUJTRC4KKyAgICAgKgorICAgICAqIFRoaXMgbWVjaGFuaXNtIHJlcXVpcmVzIHRoZSBwZWVyIHRvIGhlbHAgdXMgKGl0IGhhcyB0byBzZW5kIHVzIGEKKyAgICAgKiBTQ01fQ1JFRFMgbWVzc2FnZSkgYnV0IGl0IGRvZXMgcGFzcyB0aGUgcHJvY2VzcyBJRCB0aHJvdWdoLAorICAgICAqIHdoaWNoIG1ha2VzIGl0IGJldHRlciB0aGFuIGdldHBlZXJlaWQoKS4KKyAgICAgKi8KKyAgICBzdHJ1Y3QgY21zZ2NyZWQgKmNyZWQ7CisgICAgc3RydWN0IGNtc2doZHIgKmNtc2dwOworCisgICAgZm9yIChjbXNncCA9IENNU0dfRklSU1RIRFIgKCZtc2cpOworICAgICAgICAgY21zZ3AgIT0gTlVMTDsKKyAgICAgICAgIGNtc2dwID0gQ01TR19OWFRIRFIgKCZtc2csIGNtc2dwKSkKKyAgICAgIHsKKyAgICAgICAgaWYgKGNtc2dwLT5jbXNnX3R5cGUgPT0gU0NNX0NSRURTICYmCisgICAgICAgICAgICBjbXNncC0+Y21zZ19sZXZlbCA9PSBTT0xfU09DS0VUICYmCisgICAgICAgICAgICBjbXNncC0+Y21zZ19sZW4gPj0gQ01TR19MRU4gKHNpemVvZiAoc3RydWN0IGNtc2djcmVkKSkpCisgICAgICAgICAgeworICAgICAgICAgICAgY3JlZCA9IChzdHJ1Y3QgY21zZ2NyZWQgKikgQ01TR19EQVRBIChjbXNncCk7CisgICAgICAgICAgICBwaWRfcmVhZCA9IGNyZWQtPmNtY3JlZF9waWQ7CisgICAgICAgICAgICB1aWRfcmVhZCA9IGNyZWQtPmNtY3JlZF9ldWlkOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgfQorCisjZWxpZiBkZWZpbmVkKEhBVkVfR0VUUEVFUlVDUkVEKQorICAgIC8qIFN1cHBvcnRlZCBpbiBhdCBsZWFzdCBTb2xhcmlzID49IDEwLiBJdCBzaG91bGQgcHJvYmFibHkgYmUgaGlnaGVyCisgICAgICogdXAgdGhpcyBsaXN0LCBiZWNhdXNlIGl0IGNhcnJpZXMgdGhlIHBpZCBhbmQgd2UgdXNlIHRoaXMgY29kZSBwYXRoCisgICAgICogZm9yIGF1ZGl0IGRhdGEuICovCisgICAgdWNyZWRfdCAqIHVjcmVkID0gTlVMTDsKKyAgICBpZiAoZ2V0cGVlcnVjcmVkIChjbGllbnRfZmQuZmQsICZ1Y3JlZCkgPT0gMCkKKyAgICAgIHsKKyNpZmRlZiBIQVZFX0FEVAorICAgICAgICBhZHRfc2Vzc2lvbl9kYXRhX3QgKmFkdGggPSBOVUxMOworI2VuZGlmCisgICAgICAgIHBpZF9yZWFkID0gdWNyZWRfZ2V0cGlkICh1Y3JlZCk7CisgICAgICAgIHVpZF9yZWFkID0gdWNyZWRfZ2V0ZXVpZCAodWNyZWQpOworI2lmZGVmIEhBVkVfQURUCisgICAgICAgIC8qIGdlbmVyYXRlIGF1ZGl0IHNlc3Npb24gZGF0YSBiYXNlZCBvbiBzb2NrZXQgdWNyZWQgKi8KKyAgICAgICAgaWYgKGFkdF9zdGFydF9zZXNzaW9uICgmYWR0aCwgTlVMTCwgMCkgfHwgKGFkdGggPT0gTlVMTCkpCisgICAgICAgICAgeworICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkZhaWxlZCB0byBhZHRfc3RhcnRfc2Vzc2lvbigpOiAlc1xuIiwgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgeworICAgICAgICAgICAgaWYgKGFkdF9zZXRfZnJvbV91Y3JlZCAoYWR0aCwgdWNyZWQsIEFEVF9ORVcpKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkZhaWxlZCB0byBhZHRfc2V0X2Zyb21fdWNyZWQoKTogJXNcbiIsIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhZHRfZXhwb3J0X2RhdGFfdCAqZGF0YSA9IE5VTEw7CisgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUgPSBhZHRfZXhwb3J0X3Nlc3Npb25fZGF0YSAoYWR0aCwgJmRhdGEpOworICAgICAgICAgICAgICAgIGlmIChzaXplIDw9IDApCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJGYWlsZWQgdG8gYWR0X2V4cG9ydF9zZXNzaW9uX2RhdGEoKTogJXNcbiIsIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2RidXNfY3JlZGVudGlhbHNfYWRkX2FkdF9hdWRpdF9kYXRhIChjcmVkZW50aWFscywgZGF0YSwgc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIGZyZWUgKGRhdGEpOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICAodm9pZCkgYWR0X2VuZF9zZXNzaW9uIChhZHRoKTsKKyAgICAgICAgICB9CisjZW5kaWYgLyogSEFWRV9BRFQgKi8KKyAgICAgIH0KKyAgICBlbHNlCisgICAgICB7CisgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJGYWlsZWQgdG8gZ2V0cGVlcnVjcmVkKCkgY3JlZGVudGlhbHM6ICVzXG4iLCBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIH0KKyAgICBpZiAodWNyZWQgIT0gTlVMTCkKKyAgICAgIHVjcmVkX2ZyZWUgKHVjcmVkKTsKKworICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgKiBXaGVuIGFkZGluZyBuZXcgbWVjaGFuaXNtcywgcGxlYXNlIGFkZCB0aGVtIGFib3ZlIHRoaXMgcG9pbnQKKyAgICAgKiBpZiB0aGV5IHN1cHBvcnQgcGFzc2luZyB0aGUgcHJvY2VzcyBJRCB0aHJvdWdoLCBvciBiZWxvdyBpZiBub3QuCisgICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZWxpZiBkZWZpbmVkKEhBVkVfR0VUUEVFUkVJRCkKKyAgICAvKiBnZXRwZWVyZWlkKCkgb3JpZ2luYXRlcyBmcm9tIEQuSi4gQmVybnN0ZWluIGFuZCBpcyBmYWlybHkKKyAgICAgKiB3aWRlbHktc3VwcG9ydGVkLiBBY2NvcmRpbmcgdG8gYSB3ZWIgc2VhcmNoLCBpdCBtaWdodCBiZSBwcmVzZW50IGluCisgICAgICogYW55L2FsbCBvZjoKKyAgICAgKgorICAgICAqIC0gQUlYPworICAgICAqIC0gQmxhY2tiZXJyeT8KKyAgICAgKiAtIEN5Z3dpbgorICAgICAqIC0gRnJlZUJTRCA0LjYrIChidXQgd2UgcHJlZmVyIFNDTV9DUkVEUzogaXQgY2FycmllcyB0aGUgcGlkKQorICAgICAqIC0gTWFjIE9TIFgKKyAgICAgKiAtIE1pbml4IDMuMS44KworICAgICAqIC0gTWlyQlNEPworICAgICAqIC0gTmV0QlNEIDUuMCsgKGJ1dCBMT0NBTF9QRUVSRUlEIHdvdWxkIGJlIGJldHRlcjogaXQgY2FycmllcyB0aGUgcGlkKQorICAgICAqIC0gT3BlbkJTRCAzLjArIChidXQgd2UgcHJlZmVyIFNPX1BFRVJDUkVEOiBpdCBjYXJyaWVzIHRoZSBwaWQpCisgICAgICogLSBRTlg/CisgICAgICovCisgICAgdWlkX3QgZXVpZDsKKyAgICBnaWRfdCBlZ2lkOworICAgIGlmIChnZXRwZWVyZWlkIChjbGllbnRfZmQuZmQsICZldWlkLCAmZWdpZCkgPT0gMCkKKyAgICAgIHsKKyAgICAgICAgdWlkX3JlYWQgPSBldWlkOworICAgICAgfQorICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgX2RidXNfdmVyYm9zZSAoIkZhaWxlZCB0byBnZXRwZWVyZWlkKCkgY3JlZGVudGlhbHM6ICVzXG4iLCBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIH0KKyNlbHNlIC8qIG5vIHN1cHBvcnRlZCBtZWNoYW5pc20gKi8KKworI3dhcm5pbmcgU29ja2V0IGNyZWRlbnRpYWxzIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBVbml4IE9TCisjd2FybmluZyBQbGVhc2UgdGVsbCBodHRwczovL2J1Z3MuZnJlZWRlc2t0b3Aub3JnL2VudGVyX2J1Zy5jZ2k/cHJvZHVjdD1EQnVzCisKKyAgICAvKiBQbGVhc2UgYWRkIG90aGVyIG9wZXJhdGluZyBzeXN0ZW1zIGtub3duIHRvIHN1cHBvcnQgYXQgbGVhc3Qgb25lIG9mCisgICAgICogdGhlIG1lY2hhbmlzbXMgYWJvdmUgdG8gdGhpcyBsaXN0LCBrZWVwaW5nIGFscGhhYmV0aWNhbCBvcmRlci4KKyAgICAgKiBFdmVyeXRoaW5nIG5vdCBpbiB0aGlzIGxpc3QgIGlzIGJlc3QtZWZmb3J0LgorICAgICAqLworI2lmIGRlZmluZWQoX19GcmVlQlNEX18pIHx8IGRlZmluZWQoX19GcmVlQlNEX2tlcm5lbF9fKSB8fCBcCisgICAgZGVmaW5lZChfX2xpbnV4X18pIHx8IFwKKyAgICBkZWZpbmVkKF9fT3BlbkJTRF9fKSB8fCBcCisgICAgZGVmaW5lZChfX05ldEJTRF9fKQorIyBlcnJvciBDcmVkZW50aWFscyBwYXNzaW5nIG5vdCB3b3JraW5nIG9uIHRoaXMgT1MgaXMgYSByZWdyZXNzaW9uIQorI2VuZGlmCisKKyAgICBfZGJ1c192ZXJib3NlICgiU29ja2V0IGNyZWRlbnRpYWxzIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBPU1xuIik7CisjZW5kaWYKKyAgfQorCisgIF9kYnVzX3ZlcmJvc2UgKCJDcmVkZW50aWFsczoiCisgICAgICAgICAgICAgICAgICIgIHBpZCAiREJVU19QSURfRk9STUFUCisgICAgICAgICAgICAgICAgICIgIHVpZCAiREJVU19VSURfRk9STUFUCisgICAgICAgICAgICAgICAgICJcbiIsCisJCSBwaWRfcmVhZCwKKwkJIHVpZF9yZWFkKTsKKworICBpZiAocGlkX3JlYWQgIT0gREJVU19QSURfVU5TRVQpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19jcmVkZW50aWFsc19hZGRfcGlkIChjcmVkZW50aWFscywgcGlkX3JlYWQpKQorICAgICAgICB7CisgICAgICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICBpZiAodWlkX3JlYWQgIT0gREJVU19VSURfVU5TRVQpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19jcmVkZW50aWFsc19hZGRfdW5peF91aWQgKGNyZWRlbnRpYWxzLCB1aWRfcmVhZCkpCisgICAgICAgIHsKKyAgICAgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgfQorCisgIGlmICghYWRkX2xpbnV4X3NlY3VyaXR5X2xhYmVsX3RvX2NyZWRlbnRpYWxzIChjbGllbnRfZmQuZmQsIGNyZWRlbnRpYWxzKSkKKyAgICB7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIFNlbmRzIGEgc2luZ2xlIG51bCBieXRlIHdpdGggb3VyIFVOSVggY3JlZGVudGlhbHMgYXMgYW5jaWxsYXJ5CisgKiBkYXRhLiAgUmV0dXJucyAjVFJVRSBpZiB0aGUgZGF0YSB3YXMgc3VjY2Vzc2Z1bGx5IHdyaXR0ZW4uICBPbgorICogc3lzdGVtcyB0aGF0IGRvbid0IHN1cHBvcnQgc2VuZGluZyBjcmVkZW50aWFscywganVzdCB3cml0ZXMgYSBieXRlLAorICogZG9lc24ndCBzZW5kIGFueSBjcmVkZW50aWFscy4gIE9uIHNvbWUgc3lzdGVtcywgc3VjaCBhcyBMaW51eCwKKyAqIHJlYWRpbmcvd3JpdGluZyB0aGUgYnl0ZSBpc24ndCBhY3R1YWxseSByZXF1aXJlZCwgYnV0IHdlIGRvIGl0CisgKiBhbnl3YXkganVzdCB0byBhdm9pZCBtdWx0aXBsZSBjb2RlcGF0aHMuCisgKgorICogRmFpbHMgaWYgbm8gYnl0ZSBjYW4gYmUgd3JpdHRlbiwgc28geW91IG11c3Qgc2VsZWN0KCkgZmlyc3QuCisgKgorICogVGhlIHBvaW50IG9mIHRoZSBieXRlIGlzIHRoYXQgb24gc29tZSBzeXN0ZW1zIHdlIGhhdmUgdG8KKyAqIHVzZSBzZW5kbXNnKCkvcmVjdm1zZygpIHRvIHRyYW5zbWl0IGNyZWRlbnRpYWxzLgorICoKKyAqIEBwYXJhbSBzZXJ2ZXJfZmQgZmlsZSBkZXNjcmlwdG9yIGZvciBjb25uZWN0aW9uIHRvIHNlcnZlcgorICogQHBhcmFtIGVycm9yIHJldHVybiBsb2NhdGlvbiBmb3IgZXJyb3IgY29kZQorICogQHJldHVybnMgI1RSVUUgaWYgdGhlIGJ5dGUgd2FzIHNlbnQKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3NlbmRfY3JlZGVudGlhbHNfc29ja2V0ICAoREJ1c1NvY2tldCAgICAgICBzZXJ2ZXJfZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAqZXJyb3IpCit7CisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIGlmICh3cml0ZV9jcmVkZW50aWFsc19ieXRlIChzZXJ2ZXJfZmQuZmQsIGVycm9yKSkKKyAgICByZXR1cm4gVFJVRTsKKyAgZWxzZQorICAgIHJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBBY2NlcHRzIGEgY29ubmVjdGlvbiBvbiBhIGxpc3RlbmluZyBzb2NrZXQuCisgKiBIYW5kbGVzIEVJTlRSIGZvciB5b3UuCisgKgorICogVGhpcyB3aWxsIGVuYWJsZSBGRF9DTE9FWEVDIGZvciB0aGUgcmV0dXJuZWQgc29ja2V0LgorICoKKyAqIEBwYXJhbSBsaXN0ZW5fZmQgdGhlIGxpc3RlbiBmaWxlIGRlc2NyaXB0b3IKKyAqIEByZXR1cm5zIHRoZSBjb25uZWN0aW9uIGZkIG9mIHRoZSBjbGllbnQsIG9yIC0xIG9uIGVycm9yCisgKi8KK0RCdXNTb2NrZXQKK19kYnVzX2FjY2VwdCAgKERCdXNTb2NrZXQgbGlzdGVuX2ZkKQoreworICBEQnVzU29ja2V0IGNsaWVudF9mZDsKKyAgc3RydWN0IHNvY2thZGRyIGFkZHI7CisgIHNvY2tsZW5fdCBhZGRybGVuOworI2lmZGVmIEhBVkVfQUNDRVBUNAorICBkYnVzX2Jvb2xfdCBjbG9leGVjX2RvbmU7CisjZW5kaWYKKworICBhZGRybGVuID0gc2l6ZW9mIChhZGRyKTsKKworIHJldHJ5OgorCisjaWZkZWYgSEFWRV9BQ0NFUFQ0CisgIC8qCisgICAqIEF0IGNvbXBpbGUtdGltZSwgd2UgYXNzdW1lIHRoYXQgaWYgYWNjZXB0NCgpIGlzIGF2YWlsYWJsZSBpbgorICAgKiBsaWJjIGhlYWRlcnMsIFNPQ0tfQ0xPRVhFQyBpcyB0b28uIEF0IHJ1bnRpbWUsIGl0IGlzIHN0aWxsCisgICAqIG5vdCBuZWNlc3NhcmlseSB0cnVlIHRoYXQgZWl0aGVyIGlzIHN1cHBvcnRlZCBieSB0aGUgcnVubmluZyBrZXJuZWwuCisgICAqLworICBjbGllbnRfZmQuZmQgPSBhY2NlcHQ0IChsaXN0ZW5fZmQuZmQsICZhZGRyLCAmYWRkcmxlbiwgU09DS19DTE9FWEVDKTsKKyAgY2xvZXhlY19kb25lID0gY2xpZW50X2ZkLmZkID49IDA7CisKKyAgaWYgKGNsaWVudF9mZC5mZCA8IDAgJiYgKGVycm5vID09IEVOT1NZUyB8fCBlcnJubyA9PSBFSU5WQUwpKQorI2VuZGlmCisgICAgeworICAgICAgY2xpZW50X2ZkLmZkID0gYWNjZXB0IChsaXN0ZW5fZmQuZmQsICZhZGRyLCAmYWRkcmxlbik7CisgICAgfQorCisgIGlmIChjbGllbnRfZmQuZmQgPCAwKQorICAgIHsKKyAgICAgIGlmIChlcnJubyA9PSBFSU5UUikKKyAgICAgICAgZ290byByZXRyeTsKKyAgICB9CisKKyAgX2RidXNfdmVyYm9zZSAoImNsaWVudCBmZCAlZCBhY2NlcHRlZFxuIiwgY2xpZW50X2ZkLmZkKTsKKworI2lmZGVmIEhBVkVfQUNDRVBUNAorICBpZiAoIWNsb2V4ZWNfZG9uZSkKKyNlbmRpZgorICAgIHsKKyAgICAgIF9kYnVzX2ZkX3NldF9jbG9zZV9vbl9leGVjKGNsaWVudF9mZC5mZCk7CisgICAgfQorCisgIHJldHVybiBjbGllbnRfZmQ7Cit9CisKKy8qKgorICogQ2hlY2tzIHRvIG1ha2Ugc3VyZSB0aGUgZ2l2ZW4gZGlyZWN0b3J5IGlzCisgKiBwcml2YXRlIHRvIHRoZSB1c2VyCisgKgorICogQHBhcmFtIGRpciB0aGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5CisgKiBAcGFyYW0gZXJyb3IgZXJyb3IgcmV0dXJuCisgKiBAcmV0dXJucyAjRkFMU0Ugb24gZmFpbHVyZQorICoqLworZGJ1c19ib29sX3QKK19kYnVzX2NoZWNrX2Rpcl9pc19wcml2YXRlX3RvX3VzZXIgKERCdXNTdHJpbmcgKmRpciwgREJ1c0Vycm9yICplcnJvcikKK3sKKyAgY29uc3QgY2hhciAqZGlyZWN0b3J5OworICBzdHJ1Y3Qgc3RhdCBzYjsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBkaXJlY3RvcnkgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKGRpcik7CisKKyAgaWYgKHN0YXQgKGRpcmVjdG9yeSwgJnNiKSA8IDApCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgIiVzIiwgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKHNiLnN0X3VpZCAhPSBnZXRldWlkICgpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAiJXMgZGlyZWN0b3J5IGlzIG93bmVkIGJ5IHVzZXIgJWx1LCBub3QgJWx1IiwKKyAgICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBzYi5zdF91aWQsCisgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykgZ2V0ZXVpZCAoKSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICgoU19JUk9USCAmIHNiLnN0X21vZGUpIHx8IChTX0lXT1RIICYgc2Iuc3RfbW9kZSkgfHwKKyAgICAgIChTX0lSR1JQICYgc2Iuc3RfbW9kZSkgfHwgKFNfSVdHUlAgJiBzYi5zdF9tb2RlKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgIiVzIGRpcmVjdG9yeSBpcyBub3QgcHJpdmF0ZSB0byB0aGUgdXNlciIsIGRpcmVjdG9yeSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2ZpbGxfdXNlcl9pbmZvX2Zyb21fcGFzc3dkIChzdHJ1Y3QgcGFzc3dkICpwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNVc2VySW5mbyAgKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAqZXJyb3IpCit7CisgIF9kYnVzX2Fzc2VydCAocC0+cHdfbmFtZSAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChwLT5wd19kaXIgIT0gTlVMTCk7CisKKyAgaW5mby0+dWlkID0gcC0+cHdfdWlkOworICBpbmZvLT5wcmltYXJ5X2dpZCA9IHAtPnB3X2dpZDsKKyAgaW5mby0+dXNlcm5hbWUgPSBfZGJ1c19zdHJkdXAgKHAtPnB3X25hbWUpOworICBpbmZvLT5ob21lZGlyID0gX2RidXNfc3RyZHVwIChwLT5wd19kaXIpOworCisgIGlmIChpbmZvLT51c2VybmFtZSA9PSBOVUxMIHx8CisgICAgICBpbmZvLT5ob21lZGlyID09IE5VTEwpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2ZpbGxfdXNlcl9pbmZvIChEQnVzVXNlckluZm8gICAgICAgKmluZm8sCisgICAgICAgICAgICAgICAgZGJ1c191aWRfdCAgICAgICAgICB1aWQsCisgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAgICp1c2VybmFtZSwKKyAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAgKmVycm9yKQoreworICBjb25zdCBjaGFyICp1c2VybmFtZV9jOworCisgIC8qIGV4YWN0bHkgb25lIG9mIHVzZXJuYW1lL3VpZCBwcm92aWRlZCAqLworICBfZGJ1c19hc3NlcnQgKHVzZXJuYW1lICE9IE5VTEwgfHwgdWlkICE9IERCVVNfVUlEX1VOU0VUKTsKKyAgX2RidXNfYXNzZXJ0ICh1c2VybmFtZSA9PSBOVUxMIHx8IHVpZCA9PSBEQlVTX1VJRF9VTlNFVCk7CisKKyAgaW5mby0+dWlkID0gREJVU19VSURfVU5TRVQ7CisgIGluZm8tPnByaW1hcnlfZ2lkID0gREJVU19HSURfVU5TRVQ7CisgIGluZm8tPmdyb3VwX2lkcyA9IE5VTEw7CisgIGluZm8tPm5fZ3JvdXBfaWRzID0gMDsKKyAgaW5mby0+dXNlcm5hbWUgPSBOVUxMOworICBpbmZvLT5ob21lZGlyID0gTlVMTDsKKworICBpZiAodXNlcm5hbWUgIT0gTlVMTCkKKyAgICB1c2VybmFtZV9jID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICh1c2VybmFtZSk7CisgIGVsc2UKKyAgICB1c2VybmFtZV9jID0gTlVMTDsKKworICAvKiBGb3Igbm93IGFzc3VtaW5nIHRoYXQgdGhlIGdldHB3bmFtKCkgYW5kIGdldHB3dWlkKCkgZmxhdm9ycworICAgKiBhcmUgYWx3YXlzIHN5bW1ldHJpY2FsLCBpZiBub3Qgd2UgaGF2ZSB0byBhZGQgbW9yZSBjb25maWd1cmUKKyAgICogY2hlY2tzCisgICAqLworCisjaWYgZGVmaW5lZCAoSEFWRV9QT1NJWF9HRVRQV05BTV9SKSB8fCBkZWZpbmVkIChIQVZFX05PTlBPU0lYX0dFVFBXTkFNX1IpCisgIHsKKyAgICBzdHJ1Y3QgcGFzc3dkICpwOworICAgIGludCByZXN1bHQ7CisgICAgc2l6ZV90IGJ1ZmxlbjsKKyAgICBjaGFyICpidWY7CisgICAgc3RydWN0IHBhc3N3ZCBwX3N0cjsKKworICAgIC8qIHJldHJpZXZlIG1heGltdW0gbmVlZGVkIHNpemUgZm9yIGJ1ZiAqLworICAgIGJ1ZmxlbiA9IHN5c2NvbmYgKF9TQ19HRVRQV19SX1NJWkVfTUFYKTsKKworICAgIC8qIHN5c2NvbmYgYWN0dWFsbHkgcmV0dXJucyBhIGxvbmcsIGJ1dCBldmVyeXRoaW5nIGVsc2UgZXhwZWN0cyBzaXplX3QsCisgICAgICogc28ganVzdCByZWNhc3QgaGVyZS4KKyAgICAgKiBodHRwczovL2J1Z3MuZnJlZWRlc2t0b3Aub3JnL3Nob3dfYnVnLmNnaT9pZD0xNzA2MQorICAgICAqLworICAgIGlmICgobG9uZykgYnVmbGVuIDw9IDApCisgICAgICBidWZsZW4gPSAxMDI0OworCisgICAgcmVzdWx0ID0gLTE7CisgICAgd2hpbGUgKDEpCisgICAgICB7CisgICAgICAgIGJ1ZiA9IGRidXNfbWFsbG9jIChidWZsZW4pOworICAgICAgICBpZiAoYnVmID09IE5VTEwpCisgICAgICAgICAgeworICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgfQorCisgICAgICAgIHAgPSBOVUxMOworI2lmZGVmIEhBVkVfUE9TSVhfR0VUUFdOQU1fUgorICAgICAgICBpZiAodWlkICE9IERCVVNfVUlEX1VOU0VUKQorICAgICAgICAgIHJlc3VsdCA9IGdldHB3dWlkX3IgKHVpZCwgJnBfc3RyLCBidWYsIGJ1ZmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICByZXN1bHQgPSBnZXRwd25hbV9yICh1c2VybmFtZV9jLCAmcF9zdHIsIGJ1ZiwgYnVmbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwKTsKKyNlbHNlCisgICAgICAgIGlmICh1aWQgIT0gREJVU19VSURfVU5TRVQpCisgICAgICAgICAgcCA9IGdldHB3dWlkX3IgKHVpZCwgJnBfc3RyLCBidWYsIGJ1Zmxlbik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBwID0gZ2V0cHduYW1fciAodXNlcm5hbWVfYywgJnBfc3RyLCBidWYsIGJ1Zmxlbik7CisgICAgICAgIHJlc3VsdCA9IDA7CisjZW5kaWYgLyogIUhBVkVfUE9TSVhfR0VUUFdOQU1fUiAqLworICAgICAgICAvL1RyeSBhIGJpZ2dlciBidWZmZXIgaWYgRVJBTkdFIHdhcyByZXR1cm5lZAorICAgICAgICBpZiAocmVzdWx0ID09IEVSQU5HRSAmJiBidWZsZW4gPCA1MTIgKiAxMDI0KQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGRidXNfZnJlZSAoYnVmKTsKKyAgICAgICAgICAgIGJ1ZmxlbiAqPSAyOworICAgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgIH0KKyAgICBpZiAocmVzdWx0ID09IDAgJiYgcCA9PSAmcF9zdHIpCisgICAgICB7CisgICAgICAgIGlmICghZmlsbF91c2VyX2luZm9fZnJvbV9wYXNzd2QgKHAsIGluZm8sIGVycm9yKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBkYnVzX2ZyZWUgKGJ1Zik7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgfQorICAgICAgICBkYnVzX2ZyZWUgKGJ1Zik7CisgICAgICB9CisgICAgZWxzZQorICAgICAgeworICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJVc2VyIFwiJXNcIiB1bmtub3duIG9yIG5vIG1lbW9yeSB0byBhbGxvY2F0ZSBwYXNzd29yZCBlbnRyeVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJuYW1lX2MgPyB1c2VybmFtZV9jIDogIj8/PyIpOworICAgICAgICBfZGJ1c192ZXJib3NlICgiVXNlciAlcyB1bmtub3duXG4iLCB1c2VybmFtZV9jID8gdXNlcm5hbWVfYyA6ICI/Pz8iKTsKKyAgICAgICAgZGJ1c19mcmVlIChidWYpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9CisgIH0KKyNlbHNlIC8qICEgSEFWRV9HRVRQV05BTV9SICovCisgIHsKKyAgICAvKiBJIGd1ZXNzIHdlJ3JlIHNjcmV3ZWQgb24gdGhyZWFkIHNhZmV0eSBoZXJlICovCisgICAgc3RydWN0IHBhc3N3ZCAqcDsKKworICAgIGlmICh1aWQgIT0gREJVU19VSURfVU5TRVQpCisgICAgICBwID0gZ2V0cHd1aWQgKHVpZCk7CisgICAgZWxzZQorICAgICAgcCA9IGdldHB3bmFtICh1c2VybmFtZV9jKTsKKworICAgIGlmIChwICE9IE5VTEwpCisgICAgICB7CisgICAgICAgIGlmICghZmlsbF91c2VyX2luZm9fZnJvbV9wYXNzd2QgKHAsIGluZm8sIGVycm9yKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgfQorICAgICAgfQorICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgICAiVXNlciBcIiVzXCIgdW5rbm93biBvciBubyBtZW1vcnkgdG8gYWxsb2NhdGUgcGFzc3dvcmQgZW50cnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICB1c2VybmFtZV9jID8gdXNlcm5hbWVfYyA6ICI/Pz8iKTsKKyAgICAgICAgX2RidXNfdmVyYm9zZSAoIlVzZXIgJXMgdW5rbm93blxuIiwgdXNlcm5hbWVfYyA/IHVzZXJuYW1lX2MgOiAiPz8/Iik7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgfQorI2VuZGlmICAvKiAhIEhBVkVfR0VUUFdOQU1fUiAqLworCisgIC8qIEZpbGwgdGhpcyBpbiBzbyB3ZSBjYW4gdXNlIGl0IHRvIGdldCBncm91cHMgKi8KKyAgdXNlcm5hbWVfYyA9IGluZm8tPnVzZXJuYW1lOworCisjaWZkZWYgSEFWRV9HRVRHUk9VUExJU1QKKyAgeworICAgIGdpZF90ICpidWY7CisgICAgaW50IGJ1Zl9jb3VudDsKKyAgICBpbnQgaTsKKyAgICBpbnQgaW5pdGlhbF9idWZfY291bnQ7CisKKyAgICBpbml0aWFsX2J1Zl9jb3VudCA9IDE3OworICAgIGJ1Zl9jb3VudCA9IGluaXRpYWxfYnVmX2NvdW50OworICAgIGJ1ZiA9IGRidXNfbmV3IChnaWRfdCwgYnVmX2NvdW50KTsKKyAgICBpZiAoYnVmID09IE5VTEwpCisgICAgICB7CisgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgIH0KKworICAgIGlmIChnZXRncm91cGxpc3QgKHVzZXJuYW1lX2MsCisgICAgICAgICAgICAgICAgICAgICAgaW5mby0+cHJpbWFyeV9naWQsCisgICAgICAgICAgICAgICAgICAgICAgYnVmLCAmYnVmX2NvdW50KSA8IDApCisgICAgICB7CisgICAgICAgIGdpZF90ICpuZXc7CisgICAgICAgIC8qIFByZXN1bWVkIGNhdXNlIG9mIG5lZ2F0aXZlIHJldHVybiBjb2RlOiBidWYgaGFzIGluc3VmZmljaWVudAorICAgICAgICAgICBlbnRyaWVzIHRvIGhvbGQgdGhlIGVudGlyZSBncm91cCBsaXN0LiBUaGUgTGludXggYmVoYXZpb3IgaW4gdGhpcworICAgICAgICAgICBjYXNlIGlzIHRvIHBhc3MgYmFjayB0aGUgYWN0dWFsIG51bWJlciBvZiBncm91cHMgaW4gYnVmX2NvdW50LCBidXQKKyAgICAgICAgICAgb24gTWFjIE9TIFggMTAuNSwgYnVmX2NvdW50IGlzIHVuaGVscGZ1bGx5IGxlZnQgYWxvbmUuCisgICAgICAgICAgIFNvIGFzIGEgaGFjaywgdHJ5IHRvIGhlbHAgb3V0IGEgYml0IGJ5IGd1ZXNzaW5nIGEgbGFyZ2VyCisgICAgICAgICAgIG51bWJlciBvZiBncm91cHMsIHdpdGhpbiByZWFzb24uLiBtaWdodCBzdGlsbCBmYWlsLCBvZiBjb3Vyc2UsCisgICAgICAgICAgIGJ1dCB3ZSBjYW4gYXQgbGVhc3QgcHJpbnQgYSBtb3JlIGluZm9ybWF0aXZlIG1lc3NhZ2UuICBJIGxvb2tlZCB1cAorICAgICAgICAgICB0aGUgInJpZ2h0IHdheSIgdG8gZG8gdGhpcyBieSBkb3dubG9hZGluZyBBcHBsZSdzIG93biBzb3VyY2UgY29kZQorICAgICAgICAgICBmb3IgdGhlICJpZCIgY29tbWFuZCwgYW5kIGl0IHR1cm5zIG91dCB0aGF0IHRoZXkgdXNlIGFuCisgICAgICAgICAgIHVuZG9jdW1lbnRlZCBsaWJyYXJ5IGZ1bmN0aW9uIGdldGdyb3VwbGlzdF8yICghKSB3aGljaCBpcyBub3QKKyAgICAgICAgICAgZGVjbGFyZWQgaW4gYW55IGhlYWRlciBpbiAvdXNyL2luY2x1ZGUgKCEhKS4gVGhhdCBkaWQgbm90IHNlZW0KKyAgICAgICAgICAgbGlrZSB0aGUgd2F5IHRvIGdvIGhlcmUuCisgICAgICAgICovCisgICAgICAgIGlmIChidWZfY291bnQgPT0gaW5pdGlhbF9idWZfY291bnQpCisgICAgICAgICAgeworICAgICAgICAgICAgYnVmX2NvdW50ICo9IDE2OyAvKiBSZXRyeSB3aXRoIGFuIGFyYml0cmFyaWx5IHNjYWxlZC11cCBhcnJheSAqLworICAgICAgICAgIH0KKyAgICAgICAgbmV3ID0gZGJ1c19yZWFsbG9jIChidWYsIGJ1Zl9jb3VudCAqIHNpemVvZiAoYnVmWzBdKSk7CisgICAgICAgIGlmIChuZXcgPT0gTlVMTCkKKyAgICAgICAgICB7CisgICAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgICAgICAgIGRidXNfZnJlZSAoYnVmKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICAgIH0KKworICAgICAgICBidWYgPSBuZXc7CisKKyAgICAgICAgZXJybm8gPSAwOworICAgICAgICBpZiAoZ2V0Z3JvdXBsaXN0ICh1c2VybmFtZV9jLCBpbmZvLT5wcmltYXJ5X2dpZCwgYnVmLCAmYnVmX2NvdW50KSA8IDApCisgICAgICAgICAgeworICAgICAgICAgICAgaWYgKGVycm5vID09IDApCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfZGJ1c193YXJuICgiSXQgYXBwZWFycyB0aGF0IHVzZXJuYW1lIFwiJXNcIiBpcyBpbiBtb3JlIHRoYW4gJWQgZ3JvdXBzLlxuUHJvY2VlZGluZyB3aXRoIGp1c3QgdGhlIGZpcnN0ICVkIGdyb3Vwcy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJuYW1lX2MsIGJ1Zl9jb3VudCwgYnVmX2NvdW50KTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZ2V0IGdyb3VwcyBmb3IgdXNlcm5hbWUgXCIlc1wiIHByaW1hcnkgR0lEICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19HSURfRk9STUFUICI6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VybmFtZV9jLCBpbmZvLT5wcmltYXJ5X2dpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICAgICAgICAgICAgZGJ1c19mcmVlIChidWYpOworICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgfQorCisgICAgaW5mby0+Z3JvdXBfaWRzID0gZGJ1c19uZXcgKGRidXNfZ2lkX3QsIGJ1Zl9jb3VudCk7CisgICAgaWYgKGluZm8tPmdyb3VwX2lkcyA9PSBOVUxMKQorICAgICAgeworICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgICAgZGJ1c19mcmVlIChidWYpOworICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBidWZfY291bnQ7ICsraSkKKyAgICAgIGluZm8tPmdyb3VwX2lkc1tpXSA9IGJ1ZltpXTsKKworICAgIGluZm8tPm5fZ3JvdXBfaWRzID0gYnVmX2NvdW50OworCisgICAgZGJ1c19mcmVlIChidWYpOworICB9CisjZWxzZSAgLyogSEFWRV9HRVRHUk9VUExJU1QgKi8KKyAgeworICAgIC8qIFdlIGp1c3QgZ2V0IHRoZSBvbmUgZ3JvdXAgSUQgKi8KKyAgICBpbmZvLT5ncm91cF9pZHMgPSBkYnVzX25ldyAoZGJ1c19naWRfdCwgMSk7CisgICAgaWYgKGluZm8tPmdyb3VwX2lkcyA9PSBOVUxMKQorICAgICAgeworICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICB9CisKKyAgICBpbmZvLT5uX2dyb3VwX2lkcyA9IDE7CisKKyAgICAoaW5mby0+Z3JvdXBfaWRzKVswXSA9IGluZm8tPnByaW1hcnlfZ2lkOworICB9CisjZW5kaWYgLyogSEFWRV9HRVRHUk9VUExJU1QgKi8KKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICByZXR1cm4gVFJVRTsKKworIGZhaWxlZDoKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKgorICogR2V0cyB1c2VyIGluZm8gZm9yIHRoZSBnaXZlbiB1c2VybmFtZS4KKyAqCisgKiBAcGFyYW0gaW5mbyB1c2VyIGluZm8gb2JqZWN0IHRvIGluaXRpYWxpemUKKyAqIEBwYXJhbSB1c2VybmFtZSB0aGUgdXNlcm5hbWUKKyAqIEBwYXJhbSBlcnJvciBlcnJvciByZXR1cm4KKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3VzZXJfaW5mb19maWxsIChEQnVzVXNlckluZm8gICAgICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKnVzZXJuYW1lLAorICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICByZXR1cm4gZmlsbF91c2VyX2luZm8gKGluZm8sIERCVVNfVUlEX1VOU0VULAorICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJuYW1lLCBlcnJvcik7Cit9CisKKy8qKgorICogR2V0cyB1c2VyIGluZm8gZm9yIHRoZSBnaXZlbiB1c2VyIElELgorICoKKyAqIEBwYXJhbSBpbmZvIHVzZXIgaW5mbyBvYmplY3QgdG8gaW5pdGlhbGl6ZQorICogQHBhcmFtIHVpZCB0aGUgdXNlciBJRAorICogQHBhcmFtIGVycm9yIGVycm9yIHJldHVybgorICogQHJldHVybnMgI1RSVUUgb24gc3VjY2VzcworICovCitkYnVzX2Jvb2xfdAorX2RidXNfdXNlcl9pbmZvX2ZpbGxfdWlkIChEQnVzVXNlckluZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWlkX3QgICAgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgKmVycm9yKQoreworICByZXR1cm4gZmlsbF91c2VyX2luZm8gKGluZm8sIHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBlcnJvcik7Cit9CisKKy8qKgorICogQWRkcyB0aGUgY3JlZGVudGlhbHMgb2YgdGhlIGN1cnJlbnQgcHJvY2VzcyB0byB0aGUKKyAqIHBhc3NlZC1pbiBjcmVkZW50aWFscyBvYmplY3QuCisgKgorICogQHBhcmFtIGNyZWRlbnRpYWxzIGNyZWRlbnRpYWxzIHRvIGFkZCB0bworICogQHJldHVybnMgI0ZBTFNFIGlmIG5vIG1lbW9yeTsgZG9lcyBub3QgcHJvcGVybHkgcm9sbCBiYWNrIG9uIGZhaWx1cmUsIHNvIG9ubHkgc29tZSBjcmVkZW50aWFscyBtYXkgaGF2ZSBiZWVuIGFkZGVkCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19jcmVkZW50aWFsc19hZGRfZnJvbV9jdXJyZW50X3Byb2Nlc3MgKERCdXNDcmVkZW50aWFscyAqY3JlZGVudGlhbHMpCit7CisgIC8qIFRoZSBQT1NJWCBzcGVjIGNlcnRhaW5seSBkb2Vzbid0IHByb21pc2UgdGhpcywgYnV0CisgICAqIHdlIG5lZWQgdGhlc2UgYXNzZXJ0aW9ucyB0byBmYWlsIGFzIHNvb24gYXMgd2UncmUgd3JvbmcgYWJvdXQKKyAgICogaXQgc28gd2UgY2FuIGRvIHRoZSBwb3J0aW5nIGZpeHVwcworICAgKi8KKyAgX0RCVVNfU1RBVElDX0FTU0VSVCAoc2l6ZW9mIChwaWRfdCkgPD0gc2l6ZW9mIChkYnVzX3BpZF90KSk7CisgIF9EQlVTX1NUQVRJQ19BU1NFUlQgKHNpemVvZiAodWlkX3QpIDw9IHNpemVvZiAoZGJ1c191aWRfdCkpOworICBfREJVU19TVEFUSUNfQVNTRVJUIChzaXplb2YgKGdpZF90KSA8PSBzaXplb2YgKGRidXNfZ2lkX3QpKTsKKworICBpZiAoIV9kYnVzX2NyZWRlbnRpYWxzX2FkZF9waWQoY3JlZGVudGlhbHMsIF9kYnVzX2dldHBpZCgpKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIGlmICghX2RidXNfY3JlZGVudGlhbHNfYWRkX3VuaXhfdWlkKGNyZWRlbnRpYWxzLCBfZGJ1c19nZXRldWlkKCkpKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBBcHBlbmQgdG8gdGhlIHN0cmluZyB0aGUgaWRlbnRpdHkgd2Ugd291bGQgbGlrZSB0byBoYXZlIHdoZW4gd2UKKyAqIGF1dGhlbnRpY2F0ZSwgb24gVU5JWCB0aGlzIGlzIHRoZSBjdXJyZW50IHByb2Nlc3MgVUlEIGFuZCBvbgorICogV2luZG93cyBzb21ldGhpbmcgZWxzZSwgcHJvYmFibHkgYSBXaW5kb3dzIFNJRCBzdHJpbmcuICBObyBlc2NhcGluZworICogaXMgcmVxdWlyZWQsIHRoYXQgaXMgZG9uZSBpbiBkYnVzLWF1dGguYy4gVGhlIHVzZXJuYW1lIGhlcmUKKyAqIG5lZWQgbm90IGJlIGFueXRoaW5nIGh1bWFuLXJlYWRhYmxlLCBpdCBjYW4gYmUgdGhlIG1hY2hpbmUtcmVhZGFibGUKKyAqIGZvcm0gaS5lLiBhIHVzZXIgaWQuCisgKgorICogQHBhcmFtIHN0ciB0aGUgc3RyaW5nIHRvIGFwcGVuZCB0bworICogQHJldHVybnMgI0ZBTFNFIG9uIG5vIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfYXBwZW5kX3VzZXJfZnJvbV9jdXJyZW50X3Byb2Nlc3MgKERCdXNTdHJpbmcgKnN0cikKK3sKKyAgcmV0dXJuIF9kYnVzX3N0cmluZ19hcHBlbmRfdWludCAoc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19nZXRldWlkICgpKTsKK30KKworLyoqCisgKiBHZXRzIG91ciBwcm9jZXNzIElECisgKiBAcmV0dXJucyBwcm9jZXNzIElECisgKi8KK2RidXNfcGlkX3QKK19kYnVzX2dldHBpZCAodm9pZCkKK3sKKyAgcmV0dXJuIGdldHBpZCAoKTsKK30KKworLyoqIEdldHMgb3VyIFVJRAorICogQHJldHVybnMgcHJvY2VzcyBVSUQKKyAqLworZGJ1c191aWRfdAorX2RidXNfZ2V0dWlkICh2b2lkKQoreworICByZXR1cm4gZ2V0dWlkICgpOworfQorCisvKiogR2V0cyBvdXIgZWZmZWN0aXZlIFVJRAorICogQHJldHVybnMgcHJvY2VzcyBlZmZlY3RpdmUgVUlECisgKi8KK2RidXNfdWlkX3QKK19kYnVzX2dldGV1aWQgKHZvaWQpCit7CisgIHJldHVybiBnZXRldWlkICgpOworfQorCisvKioKKyAqIFRoZSBvbmx5IHJlYXNvbiB0aGlzIGlzIHNlcGFyYXRlIGZyb20gX2RidXNfZ2V0cGlkKCkgaXMgdG8gYWxsb3cgaXQKKyAqIG9uIFdpbmRvd3MgZm9yIGxvZ2dpbmcgYnV0IG5vdCBmb3Igb3RoZXIgcHVycG9zZXMuCisgKgorICogQHJldHVybnMgcHJvY2VzcyBJRCB0byBwdXQgaW4gbG9nIG1lc3NhZ2VzCisgKi8KK3Vuc2lnbmVkIGxvbmcKK19kYnVzX3BpZF9mb3JfbG9nICh2b2lkKQoreworICByZXR1cm4gZ2V0cGlkICgpOworfQorCisvKioKKyAqIEdldHMgYSBVSUQgZnJvbSBhIFVJRCBzdHJpbmcuCisgKgorICogQHBhcmFtIHVpZF9zdHIgdGhlIFVJRCBpbiBzdHJpbmcgZm9ybQorICogQHBhcmFtIHVpZCBVSUQgdG8gZmlsbCBpbgorICogQHJldHVybnMgI1RSVUUgaWYgc3VjY2Vzc2Z1bGx5IGZpbGxlZCBpbiBVSUQKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3BhcnNlX3VpZCAoY29uc3QgREJ1c1N0cmluZyAgICAgICp1aWRfc3RyLAorICAgICAgICAgICAgICAgICBkYnVzX3VpZF90ICAgICAgICAgICAgKnVpZCkKK3sKKyAgaW50IGVuZDsKKyAgbG9uZyB2YWw7CisKKyAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICh1aWRfc3RyKSA9PSAwKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJVSUQgc3RyaW5nIHdhcyB6ZXJvIGxlbmd0aFxuIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHZhbCA9IC0xOworICBlbmQgPSAwOworICBpZiAoIV9kYnVzX3N0cmluZ19wYXJzZV9pbnQgKHVpZF9zdHIsIDAsICZ2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuZCkpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoImNvdWxkIG5vdCBwYXJzZSBzdHJpbmcgYXMgYSBVSURcbiIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoZW5kICE9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICh1aWRfc3RyKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgic3RyaW5nIGNvbnRhaW5lZCB0cmFpbGluZyBzdHVmZiBhZnRlciBVSURcbiIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAqdWlkID0gdmFsOworCisgIHJldHVybiBUUlVFOworfQorCisjaWYgIURCVVNfVVNFX1NZTkMKKy8qIFRvIGJlIHRocmVhZC1zYWZlIGJ5IGRlZmF1bHQgb24gcGxhdGZvcm1zIHRoYXQgZG9uJ3QgbmVjZXNzYXJpbHkgaGF2ZQorICogYXRvbWljIG9wZXJhdGlvbnMgKG5vdGFibHkgRGViaWFuIGFybWVsLCB3aGljaCBpcyBhcm12NHQpLCB3ZSBtdXN0CisgKiB1c2UgYSBtdXRleCB0aGF0IGNhbiBiZSBpbml0aWFsaXplZCBzdGF0aWNhbGx5LCBsaWtlIHRoaXMuCisgKiBHTGliID49IDIuMzIgdXNlcyBhIHNpbWlsYXIgc3lzdGVtLgorICovCitzdGF0aWMgcHRocmVhZF9tdXRleF90IGF0b21pY19tdXRleCA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7CisjZW5kaWYKKworLyoqCisgKiBBdG9taWNhbGx5IGluY3JlbWVudHMgYW4gaW50ZWdlcgorICoKKyAqIEBwYXJhbSBhdG9taWMgcG9pbnRlciB0byB0aGUgaW50ZWdlciB0byBpbmNyZW1lbnQKKyAqIEByZXR1cm5zIHRoZSB2YWx1ZSBiZWZvcmUgaW5jcmVtZW50aW5nCisgKi8KK2RidXNfaW50MzJfdAorX2RidXNfYXRvbWljX2luYyAoREJ1c0F0b21pYyAqYXRvbWljKQoreworI2lmIERCVVNfVVNFX1NZTkMKKyAgcmV0dXJuIF9fc3luY19hZGRfYW5kX2ZldGNoKCZhdG9taWMtPnZhbHVlLCAxKS0xOworI2Vsc2UKKyAgZGJ1c19pbnQzMl90IHJlczsKKworICBwdGhyZWFkX211dGV4X2xvY2sgKCZhdG9taWNfbXV0ZXgpOworICByZXMgPSBhdG9taWMtPnZhbHVlOworICBhdG9taWMtPnZhbHVlICs9IDE7CisgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrICgmYXRvbWljX211dGV4KTsKKworICByZXR1cm4gcmVzOworI2VuZGlmCit9CisKKy8qKgorICogQXRvbWljYWxseSBkZWNyZW1lbnQgYW4gaW50ZWdlcgorICoKKyAqIEBwYXJhbSBhdG9taWMgcG9pbnRlciB0byB0aGUgaW50ZWdlciB0byBkZWNyZW1lbnQKKyAqIEByZXR1cm5zIHRoZSB2YWx1ZSBiZWZvcmUgZGVjcmVtZW50aW5nCisgKi8KK2RidXNfaW50MzJfdAorX2RidXNfYXRvbWljX2RlYyAoREJ1c0F0b21pYyAqYXRvbWljKQoreworI2lmIERCVVNfVVNFX1NZTkMKKyAgcmV0dXJuIF9fc3luY19zdWJfYW5kX2ZldGNoKCZhdG9taWMtPnZhbHVlLCAxKSsxOworI2Vsc2UKKyAgZGJ1c19pbnQzMl90IHJlczsKKworICBwdGhyZWFkX211dGV4X2xvY2sgKCZhdG9taWNfbXV0ZXgpOworICByZXMgPSBhdG9taWMtPnZhbHVlOworICBhdG9taWMtPnZhbHVlIC09IDE7CisgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrICgmYXRvbWljX211dGV4KTsKKworICByZXR1cm4gcmVzOworI2VuZGlmCit9CisKKy8qKgorICogQXRvbWljYWxseSBnZXQgdGhlIHZhbHVlIG9mIGFuIGludGVnZXIuIEl0IG1heSBjaGFuZ2UgYXQgYW55IHRpbWUKKyAqIHRoZXJlYWZ0ZXIsIHNvIHRoaXMgaXMgbW9zdGx5IG9ubHkgdXNlZnVsIGZvciBhc3NlcnRpb25zLgorICoKKyAqIEBwYXJhbSBhdG9taWMgcG9pbnRlciB0byB0aGUgaW50ZWdlciB0byBnZXQKKyAqIEByZXR1cm5zIHRoZSB2YWx1ZSBhdCB0aGlzIG1vbWVudAorICovCitkYnVzX2ludDMyX3QKK19kYnVzX2F0b21pY19nZXQgKERCdXNBdG9taWMgKmF0b21pYykKK3sKKyNpZiBEQlVTX1VTRV9TWU5DCisgIF9fc3luY19zeW5jaHJvbml6ZSAoKTsKKyAgcmV0dXJuIGF0b21pYy0+dmFsdWU7CisjZWxzZQorICBkYnVzX2ludDMyX3QgcmVzOworCisgIHB0aHJlYWRfbXV0ZXhfbG9jayAoJmF0b21pY19tdXRleCk7CisgIHJlcyA9IGF0b21pYy0+dmFsdWU7CisgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrICgmYXRvbWljX211dGV4KTsKKworICByZXR1cm4gcmVzOworI2VuZGlmCit9CisKKy8qKgorICogV3JhcHBlciBmb3IgcG9sbCgpLgorICoKKyAqIEBwYXJhbSBmZHMgdGhlIGZpbGUgZGVzY3JpcHRvcnMgdG8gcG9sbAorICogQHBhcmFtIG5fZmRzIG51bWJlciBvZiBkZXNjcmlwdG9ycyBpbiB0aGUgYXJyYXkKKyAqIEBwYXJhbSB0aW1lb3V0X21pbGxpc2Vjb25kcyB0aW1lb3V0IG9yIC0xIGZvciBpbmZpbml0ZQorICogQHJldHVybnMgbnVtYmVycyBvZiBmZHMgd2l0aCByZXZlbnRzLCBvciA8MCBvbiBlcnJvcgorICovCitpbnQKK19kYnVzX3BvbGwgKERCdXNQb2xsRkQgKmZkcywKKyAgICAgICAgICAgIGludCAgICAgICAgIG5fZmRzLAorICAgICAgICAgICAgaW50ICAgICAgICAgdGltZW91dF9taWxsaXNlY29uZHMpCit7CisjaWYgZGVmaW5lZChIQVZFX1BPTEwpICYmICFkZWZpbmVkKEJST0tFTl9QT0xMKQorICAvKiBEQnVzUG9sbEZEIGlzIGEgc3RydWN0IHBvbGxmZCBpbiB0aGlzIGNvZGUgcGF0aCwgc28gd2UgY2FuIGp1c3QgcG9sbCgpICovCisgIGlmICh0aW1lb3V0X21pbGxpc2Vjb25kcyA8IC0xKQorICAgIHsKKyAgICAgIHRpbWVvdXRfbWlsbGlzZWNvbmRzID0gLTE7CisgICAgfQorCisgIHJldHVybiBwb2xsIChmZHMsCisgICAgICAgICAgICAgICBuX2ZkcywKKyAgICAgICAgICAgICAgIHRpbWVvdXRfbWlsbGlzZWNvbmRzKTsKKyNlbHNlIC8qICEgSEFWRV9QT0xMICovCisgIC8qIEVtdWxhdGUgcG9sbCgpIGluIHRlcm1zIG9mIHNlbGVjdCgpICovCisgIGZkX3NldCByZWFkX3NldCwgd3JpdGVfc2V0LCBlcnJfc2V0OworICBpbnQgbWF4X2ZkID0gMDsKKyAgaW50IGk7CisgIHN0cnVjdCB0aW1ldmFsIHR2OworICBpbnQgcmVhZHk7CisKKyAgRkRfWkVSTyAoJnJlYWRfc2V0KTsKKyAgRkRfWkVSTyAoJndyaXRlX3NldCk7CisgIEZEX1pFUk8gKCZlcnJfc2V0KTsKKworICBmb3IgKGkgPSAwOyBpIDwgbl9mZHM7IGkrKykKKyAgICB7CisgICAgICBEQnVzUG9sbEZEICpmZHAgPSAmZmRzW2ldOworCisgICAgICBpZiAoZmRwLT5ldmVudHMgJiBfREJVU19QT0xMSU4pCisJRkRfU0VUIChmZHAtPmZkLCAmcmVhZF9zZXQpOworCisgICAgICBpZiAoZmRwLT5ldmVudHMgJiBfREJVU19QT0xMT1VUKQorCUZEX1NFVCAoZmRwLT5mZCwgJndyaXRlX3NldCk7CisKKyAgICAgIEZEX1NFVCAoZmRwLT5mZCwgJmVycl9zZXQpOworCisgICAgICBtYXhfZmQgPSBNQVggKG1heF9mZCwgZmRwLT5mZCk7CisgICAgfQorCisgIHR2LnR2X3NlYyA9IHRpbWVvdXRfbWlsbGlzZWNvbmRzIC8gMTAwMDsKKyAgdHYudHZfdXNlYyA9ICh0aW1lb3V0X21pbGxpc2Vjb25kcyAlIDEwMDApICogMTAwMDsKKworICByZWFkeSA9IHNlbGVjdCAobWF4X2ZkICsgMSwgJnJlYWRfc2V0LCAmd3JpdGVfc2V0LCAmZXJyX3NldCwKKyAgICAgICAgICAgICAgICAgIHRpbWVvdXRfbWlsbGlzZWNvbmRzIDwgMCA/IE5VTEwgOiAmdHYpOworCisgIGlmIChyZWFkeSA+IDApCisgICAgeworICAgICAgZm9yIChpID0gMDsgaSA8IG5fZmRzOyBpKyspCisJeworCSAgREJ1c1BvbGxGRCAqZmRwID0gJmZkc1tpXTsKKworCSAgZmRwLT5yZXZlbnRzID0gMDsKKworCSAgaWYgKEZEX0lTU0VUIChmZHAtPmZkLCAmcmVhZF9zZXQpKQorCSAgICBmZHAtPnJldmVudHMgfD0gX0RCVVNfUE9MTElOOworCisJICBpZiAoRkRfSVNTRVQgKGZkcC0+ZmQsICZ3cml0ZV9zZXQpKQorCSAgICBmZHAtPnJldmVudHMgfD0gX0RCVVNfUE9MTE9VVDsKKworCSAgaWYgKEZEX0lTU0VUIChmZHAtPmZkLCAmZXJyX3NldCkpCisJICAgIGZkcC0+cmV2ZW50cyB8PSBfREJVU19QT0xMRVJSOworCX0KKyAgICB9CisKKyAgcmV0dXJuIHJlYWR5OworI2VuZGlmCit9CisKKy8qKgorICogR2V0IGN1cnJlbnQgdGltZSwgYXMgaW4gZ2V0dGltZW9mZGF5KCkuIFVzZSB0aGUgbW9ub3RvbmljIGNsb2NrIGlmCisgKiBhdmFpbGFibGUsIHRvIGF2b2lkIHByb2JsZW1zIHdoZW4gdGhlIHN5c3RlbSB0aW1lIGNoYW5nZXMuCisgKgorICogQHBhcmFtIHR2X3NlYyByZXR1cm4gbG9jYXRpb24gZm9yIG51bWJlciBvZiBzZWNvbmRzCisgKiBAcGFyYW0gdHZfdXNlYyByZXR1cm4gbG9jYXRpb24gZm9yIG51bWJlciBvZiBtaWNyb3NlY29uZHMKKyAqLwordm9pZAorX2RidXNfZ2V0X21vbm90b25pY190aW1lIChsb25nICp0dl9zZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgKnR2X3VzZWMpCit7CisjaWZkZWYgSEFWRV9NT05PVE9OSUNfQ0xPQ0sKKyAgc3RydWN0IHRpbWVzcGVjIHRzOworICBjbG9ja19nZXR0aW1lIChDTE9DS19NT05PVE9OSUMsICZ0cyk7CisKKyAgaWYgKHR2X3NlYykKKyAgICAqdHZfc2VjID0gdHMudHZfc2VjOworICBpZiAodHZfdXNlYykKKyAgICAqdHZfdXNlYyA9IHRzLnR2X25zZWMgLyAxMDAwOworI2Vsc2UKKyAgc3RydWN0IHRpbWV2YWwgdDsKKworICBnZXR0aW1lb2ZkYXkgKCZ0LCBOVUxMKTsKKworICBpZiAodHZfc2VjKQorICAgICp0dl9zZWMgPSB0LnR2X3NlYzsKKyAgaWYgKHR2X3VzZWMpCisgICAgKnR2X3VzZWMgPSB0LnR2X3VzZWM7CisjZW5kaWYKK30KKworLyoqCisgKiBHZXQgY3VycmVudCB0aW1lLCBhcyBpbiBnZXR0aW1lb2ZkYXkoKS4gTmV2ZXIgdXNlcyB0aGUgbW9ub3RvbmljCisgKiBjbG9jay4KKyAqCisgKiBAcGFyYW0gdHZfc2VjIHJldHVybiBsb2NhdGlvbiBmb3IgbnVtYmVyIG9mIHNlY29uZHMKKyAqIEBwYXJhbSB0dl91c2VjIHJldHVybiBsb2NhdGlvbiBmb3IgbnVtYmVyIG9mIG1pY3Jvc2Vjb25kcworICovCit2b2lkCitfZGJ1c19nZXRfcmVhbF90aW1lIChsb25nICp0dl9zZWMsCisgICAgICAgICAgICAgICAgICAgICBsb25nICp0dl91c2VjKQoreworICBzdHJ1Y3QgdGltZXZhbCB0OworCisgIGdldHRpbWVvZmRheSAoJnQsIE5VTEwpOworCisgIGlmICh0dl9zZWMpCisgICAgKnR2X3NlYyA9IHQudHZfc2VjOworICBpZiAodHZfdXNlYykKKyAgICAqdHZfdXNlYyA9IHQudHZfdXNlYzsKK30KKworLyoqCisgKiBDcmVhdGVzIGEgZGlyZWN0b3J5OyBzdWNjZWVkcyBpZiB0aGUgZGlyZWN0b3J5CisgKiBpcyBjcmVhdGVkIG9yIGFscmVhZHkgZXhpc3RlZC4KKyAqCisgKiBAcGFyYW0gZmlsZW5hbWUgZGlyZWN0b3J5IGZpbGVuYW1lCisgKiBAcGFyYW0gZXJyb3IgaW5pdGlhbGl6ZWQgZXJyb3Igb2JqZWN0CisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19lbnN1cmVfZGlyZWN0b3J5IChjb25zdCBEQnVzU3RyaW5nICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICBjb25zdCBjaGFyICpmaWxlbmFtZV9jOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIGZpbGVuYW1lX2MgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKGZpbGVuYW1lKTsKKworICBpZiAobWtkaXIgKGZpbGVuYW1lX2MsIDA3MDApIDwgMCkKKyAgICB7CisgICAgICBpZiAoZXJybm8gPT0gRUVYSVNUKQorICAgICAgICByZXR1cm4gVFJVRTsKKworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGNyZWF0ZSBkaXJlY3RvcnkgJXM6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lX2MsIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgZWxzZQorICAgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIENyZWF0ZXMgYSBkaXJlY3RvcnkuIFVubGlrZSBfZGJ1c19lbnN1cmVfZGlyZWN0b3J5KCksIHRoaXMgb25seSBzdWNjZWVkcworICogaWYgdGhlIGRpcmVjdG9yeSBpcyBnZW51aW5lbHkgbmV3bHktY3JlYXRlZC4KKyAqCisgKiBAcGFyYW0gZmlsZW5hbWUgZGlyZWN0b3J5IGZpbGVuYW1lCisgKiBAcGFyYW0gZXJyb3IgaW5pdGlhbGl6ZWQgZXJyb3Igb2JqZWN0CisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19jcmVhdGVfZGlyZWN0b3J5IChjb25zdCBEQnVzU3RyaW5nICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICBjb25zdCBjaGFyICpmaWxlbmFtZV9jOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIGZpbGVuYW1lX2MgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKGZpbGVuYW1lKTsKKworICBpZiAobWtkaXIgKGZpbGVuYW1lX2MsIDA3MDApIDwgMCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gY3JlYXRlIGRpcmVjdG9yeSAlczogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWVfYywgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICBlbHNlCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogQXBwZW5kcyB0aGUgZ2l2ZW4gZmlsZW5hbWUgdG8gdGhlIGdpdmVuIGRpcmVjdG9yeS4KKyAqCisgKiBAdG9kbyBpdCBtaWdodCBiZSBjdXRlIHRvIGNvbGxhcHNlIG11bHRpcGxlICcvJyBzdWNoIGFzICJmb28vLyIKKyAqIGNvbmNhdCAiLy9iYXIiCisgKgorICogQHBhcmFtIGRpciB0aGUgZGlyZWN0b3J5IG5hbWUKKyAqIEBwYXJhbSBuZXh0X2NvbXBvbmVudCB0aGUgZmlsZW5hbWUKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2NvbmNhdF9kaXJfYW5kX2ZpbGUgKERCdXNTdHJpbmcgICAgICAgKmRpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKm5leHRfY29tcG9uZW50KQoreworICBkYnVzX2Jvb2xfdCBkaXJfZW5kc19pbl9zbGFzaDsKKyAgZGJ1c19ib29sX3QgZmlsZV9zdGFydHNfd2l0aF9zbGFzaDsKKworICBpZiAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGRpcikgPT0gMCB8fAorICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKG5leHRfY29tcG9uZW50KSA9PSAwKQorICAgIHJldHVybiBUUlVFOworCisgIGRpcl9lbmRzX2luX3NsYXNoID0gJy8nID09IF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChkaXIpIC0gMSk7CisKKyAgZmlsZV9zdGFydHNfd2l0aF9zbGFzaCA9ICcvJyA9PSBfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKG5leHRfY29tcG9uZW50LCAwKTsKKworICBpZiAoZGlyX2VuZHNfaW5fc2xhc2ggJiYgZmlsZV9zdGFydHNfd2l0aF9zbGFzaCkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfc2hvcnRlbiAoZGlyLCAxKTsKKyAgICB9CisgIGVsc2UgaWYgKCEoZGlyX2VuZHNfaW5fc2xhc2ggfHwgZmlsZV9zdGFydHNfd2l0aF9zbGFzaCkpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX2J5dGUgKGRpciwgJy8nKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICByZXR1cm4gX2RidXNfc3RyaW5nX2NvcHkgKG5leHRfY29tcG9uZW50LCAwLCBkaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGRpcikpOworfQorCisvKiogbmFub3NlY29uZHMgaW4gYSBzZWNvbmQgKi8KKyNkZWZpbmUgTkFOT1NFQ09ORFNfUEVSX1NFQ09ORCAgICAgICAxMDAwMDAwMDAwCisvKiogbWljcm9zZWNvbmRzIGluIGEgc2Vjb25kICovCisjZGVmaW5lIE1JQ1JPU0VDT05EU19QRVJfU0VDT05EICAgICAgMTAwMDAwMAorLyoqIG1pbGxpc2Vjb25kcyBpbiBhIHNlY29uZCAqLworI2RlZmluZSBNSUxMSVNFQ09ORFNfUEVSX1NFQ09ORCAgICAgIDEwMDAKKy8qKiBuYW5vc2Vjb25kcyBpbiBhIG1pbGxpc2Vjb25kICovCisjZGVmaW5lIE5BTk9TRUNPTkRTX1BFUl9NSUxMSVNFQ09ORCAgMTAwMDAwMAorLyoqIG1pY3Jvc2Vjb25kcyBpbiBhIG1pbGxpc2Vjb25kICovCisjZGVmaW5lIE1JQ1JPU0VDT05EU19QRVJfTUlMTElTRUNPTkQgMTAwMAorCisvKioKKyAqIFNsZWVwcyB0aGUgZ2l2ZW4gbnVtYmVyIG9mIG1pbGxpc2Vjb25kcy4KKyAqIEBwYXJhbSBtaWxsaXNlY29uZHMgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcworICovCit2b2lkCitfZGJ1c19zbGVlcF9taWxsaXNlY29uZHMgKGludCBtaWxsaXNlY29uZHMpCit7CisjaWZkZWYgSEFWRV9OQU5PU0xFRVAKKyAgc3RydWN0IHRpbWVzcGVjIHJlcTsKKyAgc3RydWN0IHRpbWVzcGVjIHJlbTsKKworICByZXEudHZfc2VjID0gbWlsbGlzZWNvbmRzIC8gTUlMTElTRUNPTkRTX1BFUl9TRUNPTkQ7CisgIHJlcS50dl9uc2VjID0gKG1pbGxpc2Vjb25kcyAlIE1JTExJU0VDT05EU19QRVJfU0VDT05EKSAqIE5BTk9TRUNPTkRTX1BFUl9NSUxMSVNFQ09ORDsKKyAgcmVtLnR2X3NlYyA9IDA7CisgIHJlbS50dl9uc2VjID0gMDsKKworICB3aGlsZSAobmFub3NsZWVwICgmcmVxLCAmcmVtKSA8IDAgJiYgZXJybm8gPT0gRUlOVFIpCisgICAgcmVxID0gcmVtOworI2VsaWYgZGVmaW5lZCAoSEFWRV9VU0xFRVApCisgIHVzbGVlcCAobWlsbGlzZWNvbmRzICogTUlDUk9TRUNPTkRTX1BFUl9NSUxMSVNFQ09ORCk7CisjZWxzZSAvKiAhIEhBVkVfVVNMRUVQICovCisgIHNsZWVwIChNQVggKG1pbGxpc2Vjb25kcyAvIDEwMDAsIDEpKTsKKyNlbmRpZgorfQorCisvKioKKyAqIEdlbmVyYXRlcyB0aGUgZ2l2ZW4gbnVtYmVyIG9mIHNlY3VyZWx5IHJhbmRvbSBieXRlcywKKyAqIHVzaW5nIHRoZSBiZXN0IG1lY2hhbmlzbSB3ZSBjYW4gY29tZSB1cCB3aXRoLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZworICogQHBhcmFtIG5fYnl0ZXMgdGhlIG51bWJlciBvZiByYW5kb20gYnl0ZXMgdG8gYXBwZW5kIHRvIHN0cmluZworICogQHBhcmFtIGVycm9yIGxvY2F0aW9uIHRvIHN0b3JlIHJlYXNvbiBmb3IgZmFpbHVyZQorICogQHJldHVybnMgI1RSVUUgb24gc3VjY2VzcywgI0ZBTFNFIG9uIGVycm9yCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19nZW5lcmF0ZV9yYW5kb21fYnl0ZXMgKERCdXNTdHJpbmcgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgbl9ieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAqZXJyb3IpCit7CisgIGludCBvbGRfbGVuOworICBpbnQgZmQ7CisgIGludCByZXN1bHQ7CisKKyAgb2xkX2xlbiA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChzdHIpOworICBmZCA9IC0xOworCisgIC8qIG5vdGUsIHVyYW5kb20gb24gbGludXggd2lsbCBmYWxsIGJhY2sgdG8gcHNldWRvcmFuZG9tICovCisgIGZkID0gb3BlbiAoIi9kZXYvdXJhbmRvbSIsIE9fUkRPTkxZKTsKKworICBpZiAoZmQgPCAwKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3Qgb3BlbiAvZGV2L3VyYW5kb206ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgX2RidXNfdmVyYm9zZSAoIi9kZXYvdXJhbmRvbSBmZCAlZCBvcGVuZWRcbiIsIGZkKTsKKworICByZXN1bHQgPSBfZGJ1c19yZWFkIChmZCwgc3RyLCBuX2J5dGVzKTsKKworICBpZiAocmVzdWx0ICE9IG5fYnl0ZXMpCisgICAgeworICAgICAgaWYgKHJlc3VsdCA8IDApCisgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCByZWFkIC9kZXYvdXJhbmRvbTogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICBlbHNlCisgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9JT19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJTaG9ydCByZWFkIGZyb20gL2Rldi91cmFuZG9tIik7CisKKyAgICAgIF9kYnVzX2Nsb3NlIChmZCwgTlVMTCk7CisgICAgICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoc3RyLCBvbGRfbGVuKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgX2RidXNfdmVyYm9zZSAoIlJlYWQgJWQgYnl0ZXMgZnJvbSAvZGV2L3VyYW5kb21cbiIsCisgICAgICAgICAgICAgICAgIG5fYnl0ZXMpOworCisgIF9kYnVzX2Nsb3NlIChmZCwgTlVMTCk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogRXhpdCB0aGUgcHJvY2VzcywgcmV0dXJuaW5nIHRoZSBnaXZlbiB2YWx1ZS4KKyAqCisgKiBAcGFyYW0gY29kZSB0aGUgZXhpdCBjb2RlCisgKi8KK3ZvaWQKK19kYnVzX2V4aXQgKGludCBjb2RlKQoreworICBfZXhpdCAoY29kZSk7Cit9CisKKy8qKgorICogQSB3cmFwcGVyIGFyb3VuZCBzdHJlcnJvcigpIGJlY2F1c2Ugc29tZSBwbGF0Zm9ybXMKKyAqIG1heSBiZSBsYW1lIGFuZCBub3QgaGF2ZSBzdHJlcnJvcigpLiBBbHNvLCBuZXZlcgorICogcmV0dXJucyBOVUxMLgorICoKKyAqIEBwYXJhbSBlcnJvcl9udW1iZXIgZXJybm8uCisgKiBAcmV0dXJucyBlcnJvciBkZXNjcmlwdGlvbi4KKyAqLworY29uc3QgY2hhcioKK19kYnVzX3N0cmVycm9yIChpbnQgZXJyb3JfbnVtYmVyKQoreworICBjb25zdCBjaGFyICptc2c7CisKKyAgbXNnID0gc3RyZXJyb3IgKGVycm9yX251bWJlcik7CisgIGlmIChtc2cgPT0gTlVMTCkKKyAgICBtc2cgPSAidW5rbm93biI7CisKKyAgcmV0dXJuIG1zZzsKK30KKworLyoqCisgKiBzaWduYWwgKFNJR1BJUEUsIFNJR19JR04pOworICovCit2b2lkCitfZGJ1c19kaXNhYmxlX3NpZ3BpcGUgKHZvaWQpCit7CisgIHNpZ25hbCAoU0lHUElQRSwgU0lHX0lHTik7Cit9CisKKy8qKgorICogU2V0cyB0aGUgZmlsZSBkZXNjcmlwdG9yIHRvIGJlIGNsb3NlCisgKiBvbiBleGVjLiBTaG91bGQgYmUgY2FsbGVkIGZvciBhbGwgZmlsZQorICogZGVzY3JpcHRvcnMgaW4gRC1CdXMgY29kZS4KKyAqCisgKiBAcGFyYW0gZmQgdGhlIGZpbGUgZGVzY3JpcHRvcgorICovCit2b2lkCitfZGJ1c19mZF9zZXRfY2xvc2Vfb25fZXhlYyAoaW50IGZkKQoreworICBpbnQgdmFsOworCisgIHZhbCA9IGZjbnRsIChmZCwgRl9HRVRGRCwgMCk7CisKKyAgaWYgKHZhbCA8IDApCisgICAgcmV0dXJuOworCisgIHZhbCB8PSBGRF9DTE9FWEVDOworCisgIGZjbnRsIChmZCwgRl9TRVRGRCwgdmFsKTsKK30KKworLyoqCisgKiBDbG9zZXMgYSBmaWxlIGRlc2NyaXB0b3IuCisgKgorICogQHBhcmFtIGZkIHRoZSBmaWxlIGRlc2NyaXB0b3IKKyAqIEBwYXJhbSBlcnJvciBlcnJvciBvYmplY3QKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBlcnJvciBzZXQKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2Nsb3NlIChpbnQgICAgICAgIGZkLAorICAgICAgICAgICAgIERCdXNFcnJvciAqZXJyb3IpCit7CisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgYWdhaW46CisgIGlmIChjbG9zZSAoZmQpIDwgMCkKKyAgICB7CisgICAgICBpZiAoZXJybm8gPT0gRUlOVFIpCisgICAgICAgIGdvdG8gYWdhaW47CisKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgY2xvc2UgZmQgJWQiLCBmZCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIER1cGxpY2F0ZXMgYSBmaWxlIGRlc2NyaXB0b3IuIE1ha2VzIHN1cmUgdGhlIGZkIHJldHVybmVkIGlzID49IDMKKyAqIChpLmUuIGF2b2lkcyBzdGRpbi9zdGRvdXQvc3RkZXJyKS4gU2V0cyBPX0NMT0VYRUMuCisgKgorICogQHBhcmFtIGZkIHRoZSBmaWxlIGRlc2NyaXB0b3IgdG8gZHVwbGljYXRlCisgKiBAcGFyYW0gZXJyb3IgYWRkcmVzcyBvZiBlcnJvciBsb2NhdGlvbi4KKyAqIEByZXR1cm5zIGR1cGxpY2F0ZWQgZmlsZSBkZXNjcmlwdG9yCisgKiAqLworaW50CitfZGJ1c19kdXAoaW50ICAgICAgICBmZCwKKyAgICAgICAgICBEQnVzRXJyb3IgKmVycm9yKQoreworICBpbnQgbmV3X2ZkOworCisjaWZkZWYgRl9EVVBGRF9DTE9FWEVDCisgIGRidXNfYm9vbF90IGNsb2V4ZWNfZG9uZTsKKworICBuZXdfZmQgPSBmY250bChmZCwgRl9EVVBGRF9DTE9FWEVDLCAzKTsKKyAgY2xvZXhlY19kb25lID0gbmV3X2ZkID49IDA7CisKKyAgaWYgKG5ld19mZCA8IDAgJiYgZXJybm8gPT0gRUlOVkFMKQorI2VuZGlmCisgICAgeworICAgICAgbmV3X2ZkID0gZmNudGwoZmQsIEZfRFVQRkQsIDMpOworICAgIH0KKworICBpZiAobmV3X2ZkIDwgMCkgeworCisgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnJubyksCisgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgZHVwbGljYXRlIGZkICVkIiwgZmQpOworICAgIHJldHVybiAtMTsKKyAgfQorCisjaWZkZWYgRl9EVVBGRF9DTE9FWEVDCisgIGlmICghY2xvZXhlY19kb25lKQorI2VuZGlmCisgICAgeworICAgICAgX2RidXNfZmRfc2V0X2Nsb3NlX29uX2V4ZWMobmV3X2ZkKTsKKyAgICB9CisKKyAgcmV0dXJuIG5ld19mZDsKK30KKworLyoqCisgKiBTZXRzIGEgZmlsZSBkZXNjcmlwdG9yIHRvIGJlIG5vbmJsb2NraW5nLgorICoKKyAqIEBwYXJhbSBmZCB0aGUgZmlsZSBkZXNjcmlwdG9yLgorICogQHBhcmFtIGVycm9yIGFkZHJlc3Mgb2YgZXJyb3IgbG9jYXRpb24uCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzLgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc2V0X3NvY2tldF9ub25ibG9ja2luZyAoREJ1c1NvY2tldCAgICAgIGZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICByZXR1cm4gX2RidXNfc2V0X2ZkX25vbmJsb2NraW5nIChmZC5mZCwgZXJyb3IpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK19kYnVzX3NldF9mZF9ub25ibG9ja2luZyAoaW50ICAgICAgICAgICAgIGZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIGludCB2YWw7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgdmFsID0gZmNudGwgKGZkLCBGX0dFVEZMLCAwKTsKKyAgaWYgKHZhbCA8IDApCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBnZXQgZmxhZ3MgZnJvbSBmaWxlIGRlc2NyaXB0b3IgJWQ6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBmZCwgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICBfZGJ1c192ZXJib3NlICgiRmFpbGVkIHRvIGdldCBmbGFncyBmb3IgZmQgJWQ6ICVzXG4iLCBmZCwKKyAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoZmNudGwgKGZkLCBGX1NFVEZMLCB2YWwgfCBPX05PTkJMT0NLKSA8IDApCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBzZXQgbm9uYmxvY2tpbmcgZmxhZyBvZiBmaWxlIGRlc2NyaXB0b3IgJWQ6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBmZCwgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICBfZGJ1c192ZXJib3NlICgiRmFpbGVkIHRvIHNldCBmZCAlZCBub25ibG9ja2luZzogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICBmZCwgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogT24gR05VIGxpYmMgc3lzdGVtcywgcHJpbnQgYSBjcnVkZSBiYWNrdHJhY2UgdG8gc3RkZXJyLiAgT24gb3RoZXIKKyAqIHN5c3RlbXMsIHByaW50ICJubyBiYWNrdHJhY2Ugc3VwcG9ydCIgYW5kIGJsb2NrIGZvciBwb3NzaWJsZSBnZGIKKyAqIGF0dGFjaG1lbnQgaWYgYW4gYXBwcm9wcmlhdGUgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgc2V0LgorICovCit2b2lkCitfZGJ1c19wcmludF9iYWNrdHJhY2UgKHZvaWQpCit7CisjaWYgZGVmaW5lZCAoSEFWRV9CQUNLVFJBQ0UpICYmIGRlZmluZWQgKERCVVNfQlVJTFRfUl9EWU5BTUlDKQorICB2b2lkICpidFs1MDBdOworICBpbnQgYnRfc2l6ZTsKKyAgaW50IGk7CisgIGNoYXIgKipzeW1zOworCisgIGJ0X3NpemUgPSBiYWNrdHJhY2UgKGJ0LCA1MDApOworCisgIHN5bXMgPSBiYWNrdHJhY2Vfc3ltYm9scyAoYnQsIGJ0X3NpemUpOworCisgIGkgPSAwOworICB3aGlsZSAoaSA8IGJ0X3NpemUpCisgICAgeworICAgICAgLyogZG9uJ3QgdXNlIGRidXNfd2FybiBzaW5jZSBpdCBjYW4gX2RidXNfYWJvcnQoKSAqLworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiICAlc1xuIiwgc3ltc1tpXSk7CisgICAgICArK2k7CisgICAgfQorICBmZmx1c2ggKHN0ZGVycik7CisKKyAgZnJlZSAoc3ltcyk7CisjZWxpZiBkZWZpbmVkIChIQVZFX0JBQ0tUUkFDRSkgJiYgISBkZWZpbmVkIChEQlVTX0JVSUxUX1JfRFlOQU1JQykKKyAgZnByaW50ZiAoc3RkZXJyLCAiICBELUJ1cyBub3QgYnVpbHQgd2l0aCAtcmR5bmFtaWMgc28gdW5hYmxlIHRvIHByaW50IGEgYmFja3RyYWNlXG4iKTsKKyNlbHNlCisgIGZwcmludGYgKHN0ZGVyciwgIiAgRC1CdXMgbm90IGNvbXBpbGVkIHdpdGggYmFja3RyYWNlIHN1cHBvcnQgc28gdW5hYmxlIHRvIHByaW50IGEgYmFja3RyYWNlXG4iKTsKKyNlbmRpZgorfQorCisvKioKKyAqIENyZWF0ZXMgcGFpciBvZiBjb25uZWN0IHNvY2tldHMgKGFzIGluIHNvY2tldHBhaXIoKSkuCisgKiBTZXRzIGJvdGggZW5kcyBvZiB0aGUgcGFpciBub25ibG9ja2luZy4KKyAqCisgKiBNYXJrcyBib3RoIGZpbGUgZGVzY3JpcHRvcnMgYXMgY2xvc2Utb24tZXhlYworICoKKyAqIEBwYXJhbSBmZDEgcmV0dXJuIGxvY2F0aW9uIGZvciBvbmUgZW5kCisgKiBAcGFyYW0gZmQyIHJldHVybiBsb2NhdGlvbiBmb3IgdGhlIG90aGVyIGVuZAorICogQHBhcmFtIGJsb2NraW5nICNUUlVFIGlmIHBhaXIgc2hvdWxkIGJlIGJsb2NraW5nCisgKiBAcGFyYW0gZXJyb3IgZXJyb3IgcmV0dXJuCisgKiBAcmV0dXJucyAjRkFMU0Ugb24gZmFpbHVyZSAoaWYgZXJyb3IgaXMgc2V0KQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc29ja2V0cGFpciAoREJ1c1NvY2tldCAqZmQxLAorICAgICAgICAgICAgICAgICAgREJ1c1NvY2tldCAqZmQyLAorICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgYmxvY2tpbmcsCisgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICplcnJvcikKK3sKKyNpZmRlZiBIQVZFX1NPQ0tFVFBBSVIKKyAgaW50IGZkc1syXTsKKyAgaW50IHJldHZhbDsKKworI2lmZGVmIFNPQ0tfQ0xPRVhFQworICBkYnVzX2Jvb2xfdCBjbG9leGVjX2RvbmU7CisKKyAgcmV0dmFsID0gc29ja2V0cGFpcihBRl9VTklYLCBTT0NLX1NUUkVBTXxTT0NLX0NMT0VYRUMsIDAsIGZkcyk7CisgIGNsb2V4ZWNfZG9uZSA9IHJldHZhbCA+PSAwOworCisgIGlmIChyZXR2YWwgPCAwICYmIChlcnJubyA9PSBFSU5WQUwgfHwgZXJybm8gPT0gRVBST1RPVFlQRSkpCisjZW5kaWYKKyAgICB7CisgICAgICByZXR2YWwgPSBzb2NrZXRwYWlyKEFGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwLCBmZHMpOworICAgIH0KKworICBpZiAocmV0dmFsIDwgMCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGNyZWF0ZSBmdWxsLWR1cGxleCBwaXBlIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisjaWZkZWYgU09DS19DTE9FWEVDCisgIGlmICghY2xvZXhlY19kb25lKQorI2VuZGlmCisgICAgeworICAgICAgX2RidXNfZmRfc2V0X2Nsb3NlX29uX2V4ZWMgKGZkc1swXSk7CisgICAgICBfZGJ1c19mZF9zZXRfY2xvc2Vfb25fZXhlYyAoZmRzWzFdKTsKKyAgICB9CisKKyAgaWYgKCFibG9ja2luZyAmJgorICAgICAgKCFfZGJ1c19zZXRfZmRfbm9uYmxvY2tpbmcgKGZkc1swXSwgTlVMTCkgfHwKKyAgICAgICAhX2RidXNfc2V0X2ZkX25vbmJsb2NraW5nIChmZHNbMV0sIE5VTEwpKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IHNldCBmdWxsLWR1cGxleCBwaXBlIG5vbmJsb2NraW5nIik7CisKKyAgICAgIF9kYnVzX2Nsb3NlIChmZHNbMF0sIE5VTEwpOworICAgICAgX2RidXNfY2xvc2UgKGZkc1sxXSwgTlVMTCk7CisKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgZmQxLT5mZCA9IGZkc1swXTsKKyAgZmQyLT5mZCA9IGZkc1sxXTsKKworICBfZGJ1c192ZXJib3NlICgiZnVsbC1kdXBsZXggcGlwZSAlZCA8LT4gJWRcbiIsCisgICAgICAgICAgICAgICAgIGZkMS0+ZmQsIGZkMi0+ZmQpOworCisgIHJldHVybiBUUlVFOworI2Vsc2UKKyAgX2RidXNfd2FybiAoIl9kYnVzX3NvY2tldHBhaXIoKSBub3QgaW1wbGVtZW50ZWQgb24gdGhpcyBPUyIpOworICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgIl9kYnVzX3NvY2tldHBhaXIoKSBub3QgaW1wbGVtZW50ZWQgb24gdGhpcyBPUyIpOworICByZXR1cm4gRkFMU0U7CisjZW5kaWYKK30KKworLyoqCisgKiBNZWFzdXJlIHRoZSBsZW5ndGggb2YgdGhlIGdpdmVuIGZvcm1hdCBzdHJpbmcgYW5kIGFyZ3VtZW50cywKKyAqIG5vdCBpbmNsdWRpbmcgdGhlIHRlcm1pbmF0aW5nIG51bC4KKyAqCisgKiBAcGFyYW0gZm9ybWF0IGEgcHJpbnRmLXN0eWxlIGZvcm1hdCBzdHJpbmcKKyAqIEBwYXJhbSBhcmdzIGFyZ3VtZW50cyBmb3IgdGhlIGZvcm1hdCBzdHJpbmcKKyAqIEByZXR1cm5zIGxlbmd0aCBvZiB0aGUgZ2l2ZW4gZm9ybWF0IHN0cmluZyBhbmQgYXJncywgb3IgLTEgaWYgbm8gbWVtb3J5CisgKi8KK2ludAorX2RidXNfcHJpbnRmX3N0cmluZ191cHBlcl9ib3VuZCAoY29uc3QgY2hhciAqZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCAgICAgYXJncykKK3sKKyAgY2hhciBzdGF0aWNfYnVmWzEwMjRdOworICBpbnQgYnVmc2l6ZSA9IHNpemVvZiAoc3RhdGljX2J1Zik7CisgIGludCBsZW47CisgIHZhX2xpc3QgYXJnc19jb3B5OworCisgIERCVVNfVkFfQ09QWSAoYXJnc19jb3B5LCBhcmdzKTsKKyAgbGVuID0gdnNucHJpbnRmIChzdGF0aWNfYnVmLCBidWZzaXplLCBmb3JtYXQsIGFyZ3NfY29weSk7CisgIHZhX2VuZCAoYXJnc19jb3B5KTsKKworICAvKiBJZiB2c25wcmludGYoKSByZXR1cm5lZCBub24tbmVnYXRpdmUsIHRoZW4gZWl0aGVyIHRoZSBzdHJpbmcgZml0cyBpbgorICAgKiBzdGF0aWNfYnVmLCBvciB0aGlzIE9TIGhhcyB0aGUgUE9TSVggYW5kIEM5OSBiZWhhdmlvdXIgd2hlcmUgdnNucHJpbnRmCisgICAqIHJldHVybnMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRoYXQgd2VyZSBuZWVkZWQsIG9yIHRoaXMgT1MgcmV0dXJucyB0aGUKKyAgICogdHJ1bmNhdGVkIGxlbmd0aC4KKyAgICoKKyAgICogV2UgaWdub3JlIHRoZSBwb3NzaWJpbGl0eSB0aGF0IHNucHJpbnRmIG1pZ2h0IGp1c3QgaWdub3JlIHRoZSBsZW5ndGggYW5kCisgICAqIG92ZXJydW4gdGhlIGJ1ZmZlciAoNjQtYml0IFNvbGFyaXMgNyksIGJlY2F1c2UgdGhhdCdzIHBhdGhvbG9naWNhbC4KKyAgICogSWYgeW91ciBsaWJjIGlzIHJlYWxseSB0aGF0IGJhZCwgY29tZSBiYWNrIHdoZW4geW91IGhhdmUgYSBiZXR0ZXIgb25lLiAqLworICBpZiAobGVuID09IGJ1ZnNpemUpCisgICAgeworICAgICAgLyogVGhpcyBjb3VsZCBiZSB0aGUgdHJ1bmNhdGVkIGxlbmd0aCAoVHJ1NjQgYW5kIElSSVggaGF2ZSB0aGlzIGJ1ZyksCisgICAgICAgKiBvciB0aGUgcmVhbCBsZW5ndGggY291bGQgYmUgY29pbmNpZGVudGFsbHkgdGhlIHNhbWUuIFdoaWNoIGlzIGl0PworICAgICAgICogSWYgdnNucHJpbnRmIHJldHVybnMgdGhlIHRydW5jYXRlZCBsZW5ndGgsIHdlJ2xsIGdvIHRvIHRoZSBzbG93CisgICAgICAgKiBwYXRoLiAqLworICAgICAgREJVU19WQV9DT1BZIChhcmdzX2NvcHksIGFyZ3MpOworCisgICAgICBpZiAodnNucHJpbnRmIChzdGF0aWNfYnVmLCAxLCBmb3JtYXQsIGFyZ3NfY29weSkgPT0gMSkKKyAgICAgICAgbGVuID0gLTE7CisKKyAgICAgIHZhX2VuZCAoYXJnc19jb3B5KTsKKyAgICB9CisKKyAgLyogSWYgdnNucHJpbnRmKCkgcmV0dXJuZWQgbmVnYXRpdmUsIHdlIGhhdmUgdG8gZG8gbW9yZSB3b3JrLgorICAgKiBIUC1VWCByZXR1cm5zIG5lZ2F0aXZlLiAqLworICB3aGlsZSAobGVuIDwgMCkKKyAgICB7CisgICAgICBjaGFyICpidWY7CisKKyAgICAgIGJ1ZnNpemUgKj0gMjsKKworICAgICAgYnVmID0gZGJ1c19tYWxsb2MgKGJ1ZnNpemUpOworCisgICAgICBpZiAoYnVmID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKworICAgICAgREJVU19WQV9DT1BZIChhcmdzX2NvcHksIGFyZ3MpOworICAgICAgbGVuID0gdnNucHJpbnRmIChidWYsIGJ1ZnNpemUsIGZvcm1hdCwgYXJnc19jb3B5KTsKKyAgICAgIHZhX2VuZCAoYXJnc19jb3B5KTsKKworICAgICAgZGJ1c19mcmVlIChidWYpOworCisgICAgICAvKiBJZiB0aGUgcmVwb3J0ZWQgbGVuZ3RoIGlzIGV4YWN0bHkgdGhlIGJ1ZmZlciBzaXplLCByb3VuZCB1cCB0byB0aGUKKyAgICAgICAqIG5leHQgc2l6ZSwgaW4gY2FzZSB2c25wcmludGYgaGFzIGJlZW4gcmV0dXJuaW5nIHRoZSB0cnVuY2F0ZWQKKyAgICAgICAqIGxlbmd0aCAqLworICAgICAgaWYgKGxlbiA9PSBidWZzaXplKQorICAgICAgICBsZW4gPSAtMTsKKyAgICB9CisKKyAgcmV0dXJuIGxlbjsKK30KKworLyoqCisgKiBHZXRzIHRoZSB0ZW1wb3JhcnkgZmlsZXMgZGlyZWN0b3J5IGJ5IGluc3BlY3RpbmcgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcworICogVE1QRElSLCBUTVAsIGFuZCBURU1QIGluIHRoYXQgb3JkZXIuIElmIG5vbmUgb2YgdGhvc2UgYXJlIHNldCAiL3RtcCIgaXMgcmV0dXJuZWQKKyAqCisgKiBAcmV0dXJucyBsb2NhdGlvbiBvZiB0ZW1wIGRpcmVjdG9yeSwgb3IgI05VTEwgaWYgbm8gbWVtb3J5IGZvciBsb2NraW5nCisgKi8KK2NvbnN0IGNoYXIqCitfZGJ1c19nZXRfdG1wZGlyKHZvaWQpCit7CisgIC8qIFByb3RlY3RlZCBieSBfREJVU19MT0NLX3N5c2RlcHMgKi8KKyAgc3RhdGljIGNvbnN0IGNoYXIqIHRtcGRpciA9IE5VTEw7CisKKyAgaWYgKCFfREJVU19MT0NLIChzeXNkZXBzKSkKKyAgICByZXR1cm4gTlVMTDsKKworICBpZiAodG1wZGlyID09IE5VTEwpCisgICAgeworICAgICAgLyogVE1QRElSIGlzIHdoYXQgZ2xpYmMgdXNlcywgdGhlbgorICAgICAgICogZ2xpYmMgZmFsbHMgYmFjayB0byB0aGUgUF90bXBkaXIgbWFjcm8gd2hpY2gKKyAgICAgICAqIGp1c3QgZXhwYW5kcyB0byAiL3RtcCIKKyAgICAgICAqLworICAgICAgaWYgKHRtcGRpciA9PSBOVUxMKQorICAgICAgICB0bXBkaXIgPSBnZXRlbnYoIlRNUERJUiIpOworCisgICAgICAvKiBUaGVzZSB0d28gZW52IHZhcmlhYmxlcyBhcmUgcHJvYmFibHkKKyAgICAgICAqIGJyb2tlbiwgYnV0IG1heWJlIHNvbWUgT1MgdXNlcyB0aGVtPworICAgICAgICovCisgICAgICBpZiAodG1wZGlyID09IE5VTEwpCisgICAgICAgIHRtcGRpciA9IGdldGVudigiVE1QIik7CisgICAgICBpZiAodG1wZGlyID09IE5VTEwpCisgICAgICAgIHRtcGRpciA9IGdldGVudigiVEVNUCIpOworCisgICAgICAvKiBBbmQgdGhpcyBpcyB0aGUgc2FuZSBmYWxsYmFjay4gKi8KKyAgICAgIGlmICh0bXBkaXIgPT0gTlVMTCkKKyAgICAgICAgdG1wZGlyID0gIi90bXAiOworICAgIH0KKworICBfREJVU19VTkxPQ0sgKHN5c2RlcHMpOworCisgIF9kYnVzX2Fzc2VydCh0bXBkaXIgIT0gTlVMTCk7CisKKyAgcmV0dXJuIHRtcGRpcjsKK30KKworI2lmIGRlZmluZWQoREJVU19FTkFCTEVfWDExX0FVVE9MQVVOQ0gpIHx8IGRlZmluZWQoREJVU19FTkFCTEVfTEFVTkNIRCkKKy8qKgorICogRXhlY3V0ZSBhIHN1YnByb2Nlc3MsIHJldHVybmluZyB1cCB0byAxMDI0IGJ5dGVzIG9mIG91dHB1dAorICogaW50byBAcCByZXN1bHQuCisgKgorICogSWYgc3VjY2Vzc2Z1bCwgcmV0dXJucyAjVFJVRSBhbmQgYXBwZW5kcyB0aGUgb3V0cHV0IHRvIEBwCisgKiByZXN1bHQuIElmIGEgZmFpbHVyZSBoYXBwZW5zLCByZXR1cm5zICNGQUxTRSBhbmQKKyAqIHNldHMgYW4gZXJyb3IgaW4gQHAgZXJyb3IuCisgKgorICogQG5vdGUgSXQncyBub3QgYW4gZXJyb3IgaWYgdGhlIHN1YnByb2Nlc3MgdGVybWluYXRlcyBub3JtYWxseQorICogd2l0aG91dCB3cml0aW5nIGFueSBkYXRhIHRvIHN0ZG91dC4gVmVyaWZ5IHRoZSBAcCByZXN1bHQgbGVuZ3RoCisgKiBiZWZvcmUgYW5kIGFmdGVyIHRoaXMgZnVuY3Rpb24gY2FsbCB0byBjb3ZlciB0aGlzIGNhc2UuCisgKgorICogQHBhcmFtIHByb2duYW1lIGluaXRpYWwgcGF0aCB0byBleGVjIChtYXkgb3IgbWF5IG5vdCBiZSBhYnNvbHV0ZSkKKyAqIEBwYXJhbSBwYXRoX2ZhbGxiYWNrIGlmICVUUlVFLCBzZWFyY2ggUEFUSCBmb3IgZXhlY3V0YWJsZQorICogQHBhcmFtIGFyZ3YgTlVMTC10ZXJtaW5hdGVkIGxpc3Qgb2YgYXJndW1lbnRzCisgKiBAcGFyYW0gcmVzdWx0IGEgREJ1c1N0cmluZyB3aGVyZSB0aGUgb3V0cHV0IGNhbiBiZSBhcHBlbmQKKyAqIEBwYXJhbSBlcnJvciBhIERCdXNFcnJvciB0byBzdG9yZSB0aGUgZXJyb3IgaW4gY2FzZSBvZiBmYWlsdXJlCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzLCAjRkFMU0UgaWYgYW4gZXJyb3IgaGFwcGVuZWQKKyAqLworc3RhdGljIGRidXNfYm9vbF90CitfcmVhZF9zdWJwcm9jZXNzX2xpbmVfYXJndiAoY29uc3QgY2hhciAqcHJvZ3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgcGF0aF9mYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogY29uc3QgKmFyZ3YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAqcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgKmVycm9yKQoreworICBpbnQgcmVzdWx0X3BpcGVbMl0gPSB7IC0xLCAtMSB9OworICBpbnQgZXJyb3JzX3BpcGVbMl0gPSB7IC0xLCAtMSB9OworICBwaWRfdCBwaWQ7CisgIGludCByZXQ7CisgIGludCBzdGF0dXM7CisgIGludCBvcmlnX2xlbjsKKworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIHNpZ3NldF90IG5ld19zZXQsIG9sZF9zZXQ7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisgIHJldHZhbCA9IEZBTFNFOworCisgIC8qIFdlIG5lZWQgdG8gYmxvY2sgYW55IGV4aXN0aW5nIGhhbmRsZXJzIGZvciBTSUdDSExEIHRlbXBvcmFyaWx5OyB0aGV5CisgICAqIHdpbGwgY2F1c2Ugd2FpdHBpZCgpIGJlbG93IHRvIGZhaWwuCisgICAqIGh0dHBzOi8vYnVncy5mcmVlZGVza3RvcC5vcmcvc2hvd19idWcuY2dpP2lkPTIxMzQ3CisgICAqLworICBzaWdlbXB0eXNldCAoJm5ld19zZXQpOworICBzaWdhZGRzZXQgKCZuZXdfc2V0LCBTSUdDSExEKTsKKyAgc2lncHJvY21hc2sgKFNJR19CTE9DSywgJm5ld19zZXQsICZvbGRfc2V0KTsKKworICBvcmlnX2xlbiA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChyZXN1bHQpOworCisjZGVmaW5lIFJFQURfRU5EICAgICAgICAwCisjZGVmaW5lIFdSSVRFX0VORCAgICAgICAxCisgIGlmIChwaXBlIChyZXN1bHRfcGlwZSkgPCAwKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gY3JlYXRlIGEgcGlwZSB0byBjYWxsICVzOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgcHJvZ3BhdGgsIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgX2RidXNfdmVyYm9zZSAoIkZhaWxlZCB0byBjcmVhdGUgYSBwaXBlIHRvIGNhbGwgJXM6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgcHJvZ3BhdGgsIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgZ290byBvdXQ7CisgICAgfQorICBpZiAocGlwZSAoZXJyb3JzX3BpcGUpIDwgMCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGNyZWF0ZSBhIHBpcGUgdG8gY2FsbCAlczogJXMiLAorICAgICAgICAgICAgICAgICAgICAgIHByb2dwYXRoLCBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJGYWlsZWQgdG8gY3JlYXRlIGEgcGlwZSB0byBjYWxsICVzOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgIHByb2dwYXRoLCBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBwaWQgPSBmb3JrICgpOworICBpZiAocGlkIDwgMCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGZvcmsoKSB0byBjYWxsICVzOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgcHJvZ3BhdGgsIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgX2RidXNfdmVyYm9zZSAoIkZhaWxlZCB0byBmb3JrKCkgdG8gY2FsbCAlczogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICBwcm9ncGF0aCwgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgaWYgKHBpZCA9PSAwKQorICAgIHsKKyAgICAgIC8qIGNoaWxkIHByb2Nlc3MgKi8KKyAgICAgIGNvbnN0IGNoYXIgKmVycm9yX3N0cjsKKworICAgICAgaWYgKCFfZGJ1c19lbnN1cmVfc3RhbmRhcmRfZmRzIChEQlVTX0ZPUkNFX1NURElOX05VTEwsICZlcnJvcl9zdHIpKQorICAgICAgICB7CisgICAgICAgICAgaW50IHNhdmVkX2Vycm5vID0gZXJybm87CisKKyAgICAgICAgICAvKiBUcnkgdG8gd3JpdGUgZGV0YWlscyBpbnRvIHRoZSBwaXBlLCBidXQgZG9uJ3QgYm90aGVyCisgICAgICAgICAgICogdHJ5aW5nIHRvbyBoYXJkIChubyByZXRyeSBsb29wKS4gKi8KKworICAgICAgICAgIGlmICh3cml0ZSAoZXJyb3JzX3BpcGVbV1JJVEVfRU5EXSwgZXJyb3Jfc3RyLCBzdHJsZW4gKGVycm9yX3N0cikpIDwgMCB8fAorICAgICAgICAgICAgICB3cml0ZSAoZXJyb3JzX3BpcGVbV1JJVEVfRU5EXSwgIjogIiwgMikgPCAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvKiBpZ25vcmUsIG5vdCBtdWNoIHdlIGNhbiBkbyAqLworICAgICAgICAgICAgfQorCisgICAgICAgICAgZXJyb3Jfc3RyID0gX2RidXNfc3RyZXJyb3IgKHNhdmVkX2Vycm5vKTsKKworICAgICAgICAgIGlmICh3cml0ZSAoZXJyb3JzX3BpcGVbV1JJVEVfRU5EXSwgZXJyb3Jfc3RyLCBzdHJsZW4gKGVycm9yX3N0cikpIDwgMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogaWdub3JlLCBub3QgbXVjaCB3ZSBjYW4gZG8gKi8KKyAgICAgICAgICAgIH0KKworICAgICAgICAgIF9leGl0ICgxKTsKKyAgICAgICAgfQorCisgICAgICAvKiBzZXQtdXAgc3RkWFhYICovCisgICAgICBjbG9zZSAocmVzdWx0X3BpcGVbUkVBRF9FTkRdKTsKKyAgICAgIGNsb3NlIChlcnJvcnNfcGlwZVtSRUFEX0VORF0pOworCisgICAgICBpZiAoZHVwMiAocmVzdWx0X3BpcGVbV1JJVEVfRU5EXSwgMSkgPT0gLTEpIC8qIHNldHVwIHN0ZG91dCAqLworICAgICAgICBfZXhpdCAoMSk7CisgICAgICBpZiAoZHVwMiAoZXJyb3JzX3BpcGVbV1JJVEVfRU5EXSwgMikgPT0gLTEpIC8qIHNldHVwIHN0ZGVyciAqLworICAgICAgICBfZXhpdCAoMSk7CisKKyAgICAgIF9kYnVzX2Nsb3NlX2FsbCAoKTsKKworICAgICAgc2lncHJvY21hc2sgKFNJR19TRVRNQVNLLCAmb2xkX3NldCwgTlVMTCk7CisKKyAgICAgIC8qIElmIGl0IGxvb2tzIGZ1bGx5LXF1YWxpZmllZCwgdHJ5IGV4ZWN2IGZpcnN0ICovCisgICAgICBpZiAocHJvZ3BhdGhbMF0gPT0gJy8nKQorICAgICAgICB7CisgICAgICAgICAgZXhlY3YgKHByb2dwYXRoLCAoY2hhciAqIGNvbnN0ICopIGFyZ3YpOworICAgICAgICAgIC8qIE9rLCB0aGF0IGZhaWxlZC4gIE5vdyBpZiBwYXRoX2ZhbGxiYWNrIGlzIGdpdmVuLCBsZXQncworICAgICAgICAgICAqIHRyeSB1bnF1YWxpZmllZC4gIFRoaXMgaXMgbW9zdGx5IGEgaGFjayB0byB3b3JrCisgICAgICAgICAgICogYXJvdW5kIHN5c3RlbXMgd2hpY2ggc2hpcCBkYnVzLWxhdW5jaCBpbiAvdXNyL2JpbgorICAgICAgICAgICAqIGJ1dCBldmVyeXRoaW5nIGVsc2UgaW4gL2JpbiAoYmVjYXVzZSBkYnVzLWxhdW5jaAorICAgICAgICAgICAqIGRlcGVuZHMgb24gWDExKS4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBpZiAocGF0aF9mYWxsYmFjaykKKyAgICAgICAgICAgIC8qIFdlIG11c3QgaGF2ZSBhIHNsYXNoLCBiZWNhdXNlIHdlIGNoZWNrZWQgYWJvdmUgKi8KKyAgICAgICAgICAgIGV4ZWN2cCAoc3RycmNociAocHJvZ3BhdGgsICcvJykrMSwgKGNoYXIgKiBjb25zdCAqKSBhcmd2KTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBleGVjdnAgKHByb2dwYXRoLCAoY2hhciAqIGNvbnN0ICopIGFyZ3YpOworCisgICAgICAvKiBzdGlsbCBub3RoaW5nLCB3ZSBmYWlsZWQgKi8KKyAgICAgIF9leGl0ICgxKTsKKyAgICB9CisKKyAgLyogcGFyZW50IHByb2Nlc3MgKi8KKyAgY2xvc2UgKHJlc3VsdF9waXBlW1dSSVRFX0VORF0pOworICBjbG9zZSAoZXJyb3JzX3BpcGVbV1JJVEVfRU5EXSk7CisgIHJlc3VsdF9waXBlW1dSSVRFX0VORF0gPSAtMTsKKyAgZXJyb3JzX3BpcGVbV1JJVEVfRU5EXSA9IC0xOworCisgIHJldCA9IDA7CisgIGRvCisgICAgeworICAgICAgcmV0ID0gX2RidXNfcmVhZCAocmVzdWx0X3BpcGVbUkVBRF9FTkRdLCByZXN1bHQsIDEwMjQpOworICAgIH0KKyAgd2hpbGUgKHJldCA+IDApOworCisgIC8qIHJlYXAgdGhlIGNoaWxkIHByb2Nlc3MgdG8gYXZvaWQgaXQgbGluZ2VyaW5nIGFzIHpvbWJpZSAqLworICBkbworICAgIHsKKyAgICAgIHJldCA9IHdhaXRwaWQgKHBpZCwgJnN0YXR1cywgMCk7CisgICAgfQorICB3aGlsZSAocmV0ID09IC0xICYmIGVycm5vID09IEVJTlRSKTsKKworICAvKiBXZSBzdWNjZWVkZWQgaWYgdGhlIHByb2Nlc3MgZXhpdGVkIHdpdGggc3RhdHVzIDAgYW5kCisgICAgIGFueXRoaW5nIHdhcyByZWFkICovCisgIGlmICghV0lGRVhJVEVEIChzdGF0dXMpIHx8IFdFWElUU1RBVFVTIChzdGF0dXMpICE9IDAgKQorICAgIHsKKyAgICAgIC8qIFRoZSBwcm9jZXNzIGVuZGVkIHdpdGggZXJyb3IgKi8KKyAgICAgIERCdXNTdHJpbmcgZXJyb3JfbWVzc2FnZTsKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZlcnJvcl9tZXNzYWdlKSkKKyAgICAgICAgeworICAgICAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICByZXQgPSAwOworICAgICAgZG8KKyAgICAgICAgeworICAgICAgICAgIHJldCA9IF9kYnVzX3JlYWQgKGVycm9yc19waXBlW1JFQURfRU5EXSwgJmVycm9yX21lc3NhZ2UsIDEwMjQpOworICAgICAgICB9CisgICAgICB3aGlsZSAocmV0ID4gMCk7CisKKyAgICAgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoIChyZXN1bHQsIG9yaWdfbGVuKTsKKyAgICAgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJmVycm9yX21lc3NhZ2UpID4gMCkKKyAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX1NQQVdOX0VYRUNfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICAgIiVzIHRlcm1pbmF0ZWQgYWJub3JtYWxseSB3aXRoIHRoZSBmb2xsb3dpbmcgZXJyb3I6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2dwYXRoLCBfZGJ1c19zdHJpbmdfZ2V0X2RhdGEgKCZlcnJvcl9tZXNzYWdlKSk7CisgICAgICBlbHNlCisgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9TUEFXTl9FWEVDX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICIlcyB0ZXJtaW5hdGVkIGFibm9ybWFsbHkgd2l0aG91dCBhbnkgZXJyb3IgbWVzc2FnZSIsCisgICAgICAgICAgICAgICAgICAgICAgICBwcm9ncGF0aCk7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgcmV0dmFsID0gVFJVRTsKKworIG91dDoKKyAgc2lncHJvY21hc2sgKFNJR19TRVRNQVNLLCAmb2xkX3NldCwgTlVMTCk7CisKKyAgaWYgKHJldHZhbCkKKyAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgZWxzZQorICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKworICBpZiAocmVzdWx0X3BpcGVbMF0gIT0gLTEpCisgICAgY2xvc2UgKHJlc3VsdF9waXBlWzBdKTsKKyAgaWYgKHJlc3VsdF9waXBlWzFdICE9IC0xKQorICAgIGNsb3NlIChyZXN1bHRfcGlwZVsxXSk7CisgIGlmIChlcnJvcnNfcGlwZVswXSAhPSAtMSkKKyAgICBjbG9zZSAoZXJyb3JzX3BpcGVbMF0pOworICBpZiAoZXJyb3JzX3BpcGVbMV0gIT0gLTEpCisgICAgY2xvc2UgKGVycm9yc19waXBlWzFdKTsKKworICByZXR1cm4gcmV0dmFsOworfQorI2VuZGlmCisKKy8qKgorICogUmV0dXJucyB0aGUgYWRkcmVzcyBvZiBhIG5ldyBzZXNzaW9uIGJ1cy4KKyAqCisgKiBJZiBzdWNjZXNzZnVsLCByZXR1cm5zICNUUlVFIGFuZCBhcHBlbmRzIHRoZSBhZGRyZXNzIHRvIEBwCisgKiBhZGRyZXNzLiBJZiBhIGZhaWx1cmUgaGFwcGVucywgcmV0dXJucyAjRkFMU0UgYW5kCisgKiBzZXRzIGFuIGVycm9yIGluIEBwIGVycm9yLgorICoKKyAqIEBwYXJhbSBzY29wZSBzY29wZSBvZiBhdXRvbGF1bmNoIChXaW5kb3dzIG9ubHkpCisgKiBAcGFyYW0gYWRkcmVzcyBhIERCdXNTdHJpbmcgd2hlcmUgdGhlIGFkZHJlc3MgY2FuIGJlIHN0b3JlZAorICogQHBhcmFtIGVycm9yIGEgREJ1c0Vycm9yIHRvIHN0b3JlIHRoZSBlcnJvciBpbiBjYXNlIG9mIGZhaWx1cmUKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MsICNGQUxTRSBpZiBhbiBlcnJvciBoYXBwZW5lZAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfZ2V0X2F1dG9sYXVuY2hfYWRkcmVzcyAoY29uc3QgY2hhciAqc2NvcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICphZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAqZXJyb3IpCit7CisjaWZkZWYgREJVU19FTkFCTEVfWDExX0FVVE9MQVVOQ0gKKyAgc3RhdGljIGNvbnN0IGNoYXIgYXJnX2RidXNfbGF1bmNoW10gPSAiZGJ1cy1sYXVuY2giOworICBzdGF0aWMgY29uc3QgY2hhciBhcmdfYXV0b2xhdW5jaFtdID0gIi0tYXV0b2xhdW5jaCI7CisgIHN0YXRpYyBjb25zdCBjaGFyIGFyZ19iaW5hcnlfc3ludGF4W10gPSAiLS1iaW5hcnktc3ludGF4IjsKKyAgc3RhdGljIGNvbnN0IGNoYXIgYXJnX2Nsb3NlX3N0ZGVycltdID0gIi0tY2xvc2Utc3RkZXJyIjsKKworICAvKiBQZXJmb3JtIFgxMS1iYXNlZCBhdXRvbGF1bmNoLiAoV2UgYWxzbyBzdXBwb3J0IGxhdW5jaGQtYmFzZWQgYXV0b2xhdW5jaCwKKyAgICogYnV0IHRoYXQncyBkb25lIGVsc2V3aGVyZSwgYW5kIGlmIGl0IHdvcmtlZCwgdGhpcyBmdW5jdGlvbiB3b3VsZG4ndAorICAgKiBiZSBjYWxsZWQuKSAqLworICBjb25zdCBjaGFyICpkaXNwbGF5OworICBjb25zdCBjaGFyICpwcm9ncGF0aDsKKyAgY29uc3QgY2hhciAqYXJndls2XTsKKyAgaW50IGk7CisgIERCdXNTdHJpbmcgdXVpZDsKKyAgZGJ1c19ib29sX3QgcmV0dmFsOworCisgIGlmIChfZGJ1c19jaGVja19zZXR1aWQgKCkpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3JfY29uc3QgKGVycm9yLCBEQlVTX0VSUk9SX05PVF9TVVBQT1JURUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBhdXRvbGF1bmNoIHdoZW4gc2V0dWlkIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworICByZXR2YWwgPSBGQUxTRTsKKworICAvKiBmZC5vICMxOTk5NzogaWYgJERJU1BMQVkgaXNuJ3Qgc2V0IHRvIHNvbWV0aGluZyB1c2VmdWwsIHRoZW4KKyAgICogZGJ1cy1sYXVuY2gteDExIGlzIGp1c3QgZ29pbmcgdG8gZmFpbC4gUmF0aGVyIHRoYW4gdHJ5aW5nIHRvCisgICAqIHJ1biBpdCwgd2UgbWlnaHQgYXMgd2VsbCBiYWlsIG91dCBlYXJseSB3aXRoIGEgbmljZSBlcnJvci4KKyAgICoKKyAgICogVGhpcyBpcyBub3Qgc3RyaWN0bHkgdHJ1ZSBpbiBhIHdvcmxkIHdoZXJlIHRoZSB1c2VyIGJ1cyBleGlzdHMsCisgICAqIGJlY2F1c2UgZGJ1cy1sYXVuY2ggLS1hdXRvbGF1bmNoIGtub3dzIGhvdyB0byBjb25uZWN0IHRvIHRoYXQgLQorICAgKiBidXQgaWYgd2Ugd2VyZSBnb2luZyB0byBjb25uZWN0IHRvIHRoZSB1c2VyIGJ1cywgd2UnZCBoYXZlIGRvbmUKKyAgICogc28gYmVmb3JlIHRyeWluZyBhdXRvbGF1bmNoOiBpbiBhbnkgY2FzZS4gKi8KKyAgZGlzcGxheSA9IF9kYnVzX2dldGVudiAoIkRJU1BMQVkiKTsKKworICBpZiAoZGlzcGxheSA9PSBOVUxMIHx8IGRpc3BsYXlbMF0gPT0gJ1wwJykKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvcl9jb25zdCAoZXJyb3IsIERCVVNfRVJST1JfTk9UX1NVUFBPUlRFRCwKKyAgICAgICAgICAiVW5hYmxlIHRvIGF1dG9sYXVuY2ggYSBkYnVzLWRhZW1vbiB3aXRob3V0IGEgJERJU1BMQVkgZm9yIFgxMSIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmdXVpZCkpCisgICAgeworICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIV9kYnVzX2dldF9sb2NhbF9tYWNoaW5lX3V1aWRfZW5jb2RlZCAoJnV1aWQsIGVycm9yKSkKKyAgICB7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyNpZmRlZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworICBwcm9ncGF0aCA9IF9kYnVzX2dldGVudiAoIkRCVVNfVEVTVF9EQlVTX0xBVU5DSCIpOworCisgIGlmIChwcm9ncGF0aCA9PSBOVUxMKQorI2VuZGlmCisgICAgcHJvZ3BhdGggPSBEQlVTX0JJTkRJUiAiL2RidXMtbGF1bmNoIjsKKyAgLyoKKyAgICogYXJndlswXSBpcyBhbHdheXMgZGJ1cy1sYXVuY2gsIHRoYXQncyB0aGUgbmFtZSB3aGF0IHdlJ2xsCisgICAqIGdldCBmcm9tIC9wcm9jLCBvciBwcygxKSwgcmVnYXJkbGVzcyB3aGF0IHRoZSBwcm9ncGF0aCBpcywKKyAgICogc2VlIGZkLm8jNjk3MTYKKyAgICovCisgIGkgPSAwOworICBhcmd2W2ldID0gYXJnX2RidXNfbGF1bmNoOworICArK2k7CisgIGFyZ3ZbaV0gPSBhcmdfYXV0b2xhdW5jaDsKKyAgKytpOworICBhcmd2W2ldID0gX2RidXNfc3RyaW5nX2dldF9kYXRhICgmdXVpZCk7CisgICsraTsKKyAgYXJndltpXSA9IGFyZ19iaW5hcnlfc3ludGF4OworICArK2k7CisgIGFyZ3ZbaV0gPSBhcmdfY2xvc2Vfc3RkZXJyOworICArK2k7CisgIGFyZ3ZbaV0gPSBOVUxMOworICArK2k7CisKKyAgX2RidXNfYXNzZXJ0IChpID09IF9EQlVTX05fRUxFTUVOVFMgKGFyZ3YpKTsKKworICByZXR2YWwgPSBfcmVhZF9zdWJwcm9jZXNzX2xpbmVfYXJndiAocHJvZ3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJndiwgYWRkcmVzcywgZXJyb3IpOworCisgb3V0OgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJnV1aWQpOworICByZXR1cm4gcmV0dmFsOworI2Vsc2UKKyAgZGJ1c19zZXRfZXJyb3JfY29uc3QgKGVycm9yLCBEQlVTX0VSUk9SX05PVF9TVVBQT1JURUQsCisgICAgICAiVXNpbmcgWDExIGZvciBkYnVzLWRhZW1vbiBhdXRvbGF1bmNoIHdhcyBkaXNhYmxlZCBhdCBjb21waWxlIHRpbWUsICIKKyAgICAgICJzZXQgeW91ciBEQlVTX1NFU1NJT05fQlVTX0FERFJFU1MgaW5zdGVhZCIpOworICByZXR1cm4gRkFMU0U7CisjZW5kaWYKK30KKworLyoqCisgKiBSZWFkcyB0aGUgdXVpZCBvZiB0aGUgbWFjaGluZSB3ZSdyZSBydW5uaW5nIG9uIGZyb20KKyAqIHRoZSBkYnVzIGNvbmZpZ3VyYXRpb24uIE9wdGlvbmFsbHkgdHJ5IHRvIGNyZWF0ZSBpdAorICogKG9ubHkgcm9vdCBjYW4gZG8gdGhpcyB1c3VhbGx5KS4KKyAqCisgKiBPbiBVTklYLCByZWFkcyBhIGZpbGUgdGhhdCBnZXRzIGNyZWF0ZWQgYnkgZGJ1cy11dWlkZ2VuCisgKiBpbiBhIHBvc3QtaW5zdGFsbCBzY3JpcHQuIE9uIFdpbmRvd3MsIGlmIHRoZXJlJ3MgYSBzdGFuZGFyZAorICogbWFjaGluZSB1dWlkIHdlIGNvdWxkIGp1c3QgdXNlIHRoYXQsIGJ1dCBJIGNhbid0IGZpbmQgb25lCisgKiB3aXRoIHRoZSByaWdodCBwcm9wZXJ0aWVzICh0aGUgaGFyZHdhcmUgcHJvZmlsZSBndWlkIGNhbiBjaGFuZ2UKKyAqIHdpdGhvdXQgcmVib290aW5nIEkgYmVsaWV2ZSkuIElmIHRoZXJlJ3Mgbm8gc3RhbmRhcmQgb25lCisgKiB3ZSBtaWdodCB3YW50IHRvIHVzZSB0aGUgcmVnaXN0cnkgaW5zdGVhZCBvZiBhIGZpbGUgZm9yCisgKiB0aGlzLCBhbmQgSSdtIG5vdCBzdXJlIGhvdyB3ZSdkIGVuc3VyZSB0aGUgdXVpZCBnZXRzIGNyZWF0ZWQuCisgKgorICogQHBhcmFtIG1hY2hpbmVfaWQgZ3VpZCB0byBpbml0IHdpdGggdGhlIG1hY2hpbmUncyB1dWlkCisgKiBAcGFyYW0gY3JlYXRlX2lmX25vdF9mb3VuZCB0cnkgdG8gY3JlYXRlIHRoZSB1dWlkIGlmIGl0IGRvZXNuJ3QgZXhpc3QKKyAqIEBwYXJhbSBlcnJvciB0aGUgZXJyb3IgcmV0dXJuCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgdGhlIGVycm9yIGlzIHNldAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfcmVhZF9sb2NhbF9tYWNoaW5lX3V1aWQgKERCdXNHVUlEICAgKm1hY2hpbmVfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgY3JlYXRlX2lmX25vdF9mb3VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICplcnJvcikKK3sKKyAgREJ1c0Vycm9yIG91cl9lcnJvciA9IERCVVNfRVJST1JfSU5JVDsKKyAgREJ1c0Vycm9yIGV0Y19lcnJvciA9IERCVVNfRVJST1JfSU5JVDsKKyAgREJ1c1N0cmluZyBmaWxlbmFtZTsKKyAgZGJ1c19ib29sX3QgYjsKKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJmZpbGVuYW1lLCBEQlVTX01BQ0hJTkVfVVVJRF9GSUxFKTsKKworICBiID0gX2RidXNfcmVhZF91dWlkX2ZpbGUgKCZmaWxlbmFtZSwgbWFjaGluZV9pZCwgRkFMU0UsICZvdXJfZXJyb3IpOworICBpZiAoYikKKyAgICByZXR1cm4gVFJVRTsKKworICAvKiBGYWxsYmFjayB0byB0aGUgc3lzdGVtIG1hY2hpbmUgSUQgKi8KKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZmaWxlbmFtZSwgIi9ldGMvbWFjaGluZS1pZCIpOworICBiID0gX2RidXNfcmVhZF91dWlkX2ZpbGUgKCZmaWxlbmFtZSwgbWFjaGluZV9pZCwgRkFMU0UsICZldGNfZXJyb3IpOworCisgIGlmIChiKQorICAgIHsKKyAgICAgIGlmIChjcmVhdGVfaWZfbm90X2ZvdW5kKQorICAgICAgICB7CisgICAgICAgICAgLyogdHJ5IHRvIGNvcHkgaXQgdG8gdGhlIERCVVNfTUFDSElORV9VVUlEX0ZJTEUsIGJ1dCBkbyBub3QKKyAgICAgICAgICAgKiBjb21wbGFpbiBpZiB0aGF0IGlzbid0IHBvc3NpYmxlIGZvciB3aGF0ZXZlciByZWFzb24gKi8KKyAgICAgICAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJmZpbGVuYW1lLCBEQlVTX01BQ0hJTkVfVVVJRF9GSUxFKTsKKyAgICAgICAgICBfZGJ1c193cml0ZV91dWlkX2ZpbGUgKCZmaWxlbmFtZSwgbWFjaGluZV9pZCwgTlVMTCk7CisgICAgICAgIH0KKworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmb3VyX2Vycm9yKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICBpZiAoIWNyZWF0ZV9pZl9ub3RfZm91bmQpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBldGNfZXJyb3IubmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAiRC1CdXMgbGlicmFyeSBhcHBlYXJzIHRvIGJlIGluY29ycmVjdGx5IHNldCB1cDogIgorICAgICAgICAgICAgICAgICAgICAgICJzZWUgdGhlIG1hbnVhbCBwYWdlIGZvciBkYnVzLXV1aWRnZW4gdG8gY29ycmVjdCAiCisgICAgICAgICAgICAgICAgICAgICAgInRoaXMgaXNzdWUuICglczsgJXMpIiwKKyAgICAgICAgICAgICAgICAgICAgICBvdXJfZXJyb3IubWVzc2FnZSwgZXRjX2Vycm9yLm1lc3NhZ2UpOworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmb3VyX2Vycm9yKTsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmV0Y19lcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGRidXNfZXJyb3JfZnJlZSAoJm91cl9lcnJvcik7CisgIGRidXNfZXJyb3JfZnJlZSAoJmV0Y19lcnJvcik7CisKKyAgLyogaWYgbm9uZSBmb3VuZCwgdHJ5IHRvIG1ha2UgYSBuZXcgb25lICovCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmZmlsZW5hbWUsIERCVVNfTUFDSElORV9VVUlEX0ZJTEUpOworCisgIGlmICghX2RidXNfZ2VuZXJhdGVfdXVpZCAobWFjaGluZV9pZCwgZXJyb3IpKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gX2RidXNfd3JpdGVfdXVpZF9maWxlICgmZmlsZW5hbWUsIG1hY2hpbmVfaWQsIGVycm9yKTsKK30KKworLyoqCisgKiBxdXJpZXMgbGF1bmNoZCBmb3IgYSBzcGVjaWZpYyBlbnYgdmFyIHdoaWNoIGhvbGRzIHRoZSBzb2NrZXQgcGF0aC4KKyAqIEBwYXJhbSBzb2NrZXRfcGF0aCBhcHBlbmQgdGhlIHNvY2tldCBwYXRoIHRvIHRoaXMgREJ1c1N0cmluZworICogQHBhcmFtIGxhdW5jaGRfZW52X3ZhciB0aGUgZW52IHZhciB0byBsb29rIHVwCisgKiBAcGFyYW0gZXJyb3IgYSBEQnVzRXJyb3IgdG8gc3RvcmUgdGhlIGVycm9yIGluIGNhc2Ugb2YgZmFpbHVyZQorICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGVudiB2YXIKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2xvb2t1cF9sYXVuY2hkX3NvY2tldCAoREJ1c1N0cmluZyAqc29ja2V0X3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmxhdW5jaGRfZW52X3ZhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAqZXJyb3IpCit7CisjaWZkZWYgREJVU19FTkFCTEVfTEFVTkNIRAorICBjaGFyICphcmd2WzRdOworICBpbnQgaTsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBpZiAoX2RidXNfY2hlY2tfc2V0dWlkICgpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yX2NvbnN0IChlcnJvciwgREJVU19FUlJPUl9OT1RfU1VQUE9SVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gZmluZCBsYXVuY2hkIHNvY2tldCB3aGVuIHNldHVpZCIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpID0gMDsKKyAgYXJndltpXSA9ICJsYXVuY2hjdGwiOworICArK2k7CisgIGFyZ3ZbaV0gPSAiZ2V0ZW52IjsKKyAgKytpOworICBhcmd2W2ldID0gKGNoYXIqKWxhdW5jaGRfZW52X3ZhcjsKKyAgKytpOworICBhcmd2W2ldID0gTlVMTDsKKyAgKytpOworCisgIF9kYnVzX2Fzc2VydCAoaSA9PSBfREJVU19OX0VMRU1FTlRTIChhcmd2KSk7CisKKyAgaWYgKCFfcmVhZF9zdWJwcm9jZXNzX2xpbmVfYXJndihhcmd2WzBdLCBUUlVFLCBhcmd2LCBzb2NrZXRfcGF0aCwgZXJyb3IpKQorICAgIHsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgLyogbm8gZXJyb3IsIGJ1dCBubyByZXN1bHQgZWl0aGVyICovCisgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aChzb2NrZXRfcGF0aCkgPT0gMCkKKyAgICB7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIC8qIHN0cmlwIHRoZSBjYXJyaWFnZS1yZXR1cm4gKi8KKyAgX2RidXNfc3RyaW5nX3Nob3J0ZW4oc29ja2V0X3BhdGgsIDEpOworICByZXR1cm4gVFJVRTsKKyNlbHNlIC8qIERCVVNfRU5BQkxFX0xBVU5DSEQgKi8KKyAgZGJ1c19zZXRfZXJyb3IoZXJyb3IsIERCVVNfRVJST1JfTk9UX1NVUFBPUlRFRCwKKyAgICAgICAgICAgICAgICAiY2FuJ3QgbG9va3VwIHNvY2tldCBmcm9tIGxhdW5jaGQ7IGxhdW5jaGQgc3VwcG9ydCBub3QgY29tcGlsZWQgaW4iKTsKKyAgcmV0dXJuIEZBTFNFOworI2VuZGlmCit9CisKKyNpZmRlZiBEQlVTX0VOQUJMRV9MQVVOQ0hECitzdGF0aWMgZGJ1c19ib29sX3QKK19kYnVzX2xvb2t1cF9zZXNzaW9uX2FkZHJlc3NfbGF1bmNoZCAoREJ1c1N0cmluZyAqYWRkcmVzcywgREJ1c0Vycm9yICAqZXJyb3IpCit7CisgIGRidXNfYm9vbF90IHZhbGlkX3NvY2tldDsKKyAgREJ1c1N0cmluZyBzb2NrZXRfcGF0aDsKKworICBpZiAoX2RidXNfY2hlY2tfc2V0dWlkICgpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yX2NvbnN0IChlcnJvciwgREJVU19FUlJPUl9OT1RfU1VQUE9SVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gZmluZCBsYXVuY2hkIHNvY2tldCB3aGVuIHNldHVpZCIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmc29ja2V0X3BhdGgpKQorICAgIHsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgdmFsaWRfc29ja2V0ID0gX2RidXNfbG9va3VwX2xhdW5jaGRfc29ja2V0ICgmc29ja2V0X3BhdGgsICJEQlVTX0xBVU5DSERfU0VTU0lPTl9CVVNfU09DS0VUIiwgZXJyb3IpOworCisgIGlmIChkYnVzX2Vycm9yX2lzX3NldChlcnJvcikpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUoJnNvY2tldF9wYXRoKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCF2YWxpZF9zb2NrZXQpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IoZXJyb3IsICJubyBzb2NrZXQgcGF0aCIsCisgICAgICAgICAgICAgICAgImxhdW5jaGQgZGlkIG5vdCBwcm92aWRlIGEgc29ja2V0IHBhdGgsICIKKyAgICAgICAgICAgICAgICAidmVyaWZ5IHRoYXQgb3JnLmZyZWVkZXNrdG9wLmRidXMtc2Vzc2lvbi5wbGlzdCBpcyBsb2FkZWQhIik7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSgmc29ja2V0X3BhdGgpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kIChhZGRyZXNzLCAidW5peDpwYXRoPSIpKQorICAgIHsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlKCZzb2NrZXRfcGF0aCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5ICgmc29ja2V0X3BhdGgsIDAsIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChhZGRyZXNzKSkpCisgICAgeworICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUoJnNvY2tldF9wYXRoKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUoJnNvY2tldF9wYXRoKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYKKworZGJ1c19ib29sX3QKK19kYnVzX2xvb2t1cF91c2VyX2J1cyAoZGJ1c19ib29sX3QgKnN1cHBvcnRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgKmFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICplcnJvcikKK3sKKyAgY29uc3QgY2hhciAqcnVudGltZV9kaXIgPSBfZGJ1c19nZXRlbnYgKCJYREdfUlVOVElNRV9ESVIiKTsKKyAgZGJ1c19ib29sX3QgcmV0ID0gRkFMU0U7CisgIHN0cnVjdCBzdGF0IHN0YnVmOworICBEQnVzU3RyaW5nIHVzZXJfYnVzX3BhdGg7CisKKyAgaWYgKHJ1bnRpbWVfZGlyID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIlhER19SVU5USU1FX0RJUiBub3QgZm91bmQgaW4gZW52aXJvbm1lbnQiKTsKKyAgICAgICpzdXBwb3J0ZWQgPSBGQUxTRTsKKyAgICAgIHJldHVybiBUUlVFOyAgICAgICAgLyogQ2Fubm90IHVzZSBpdCwgYnV0IG5vdCBhbiBlcnJvciAqLworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmdXNlcl9idXNfcGF0aCkpCisgICAgeworICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfcHJpbnRmICgmdXNlcl9idXNfcGF0aCwgIiVzL2J1cyIsIHJ1bnRpbWVfZGlyKSkKKyAgICB7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgaWYgKGxzdGF0IChfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZ1c2VyX2J1c19wYXRoKSwgJnN0YnVmKSA9PSAtMSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiWERHX1JVTlRJTUVfRElSL2J1cyBub3QgYXZhaWxhYmxlOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgICpzdXBwb3J0ZWQgPSBGQUxTRTsKKyAgICAgIHJldCA9IFRSVUU7ICAgICAgIC8qIENhbm5vdCB1c2UgaXQsIGJ1dCBub3QgYW4gZXJyb3IgKi8KKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAoc3RidWYuc3RfdWlkICE9IGdldHVpZCAoKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiWERHX1JVTlRJTUVfRElSL2J1cyBvd25lZCBieSB1aWQgJWxkLCBub3Qgb3VyIHVpZCAlbGQiLAorICAgICAgICAgICAgICAgICAgICAgKGxvbmcpIHN0YnVmLnN0X3VpZCwgKGxvbmcpIGdldHVpZCAoKSk7CisgICAgICAqc3VwcG9ydGVkID0gRkFMU0U7CisgICAgICByZXQgPSBUUlVFOyAgICAgICAvKiBDYW5ub3QgdXNlIGl0LCBidXQgbm90IGFuIGVycm9yICovCisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgaWYgKChzdGJ1Zi5zdF9tb2RlICYgU19JRk1UKSAhPSBTX0lGU09DSykKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiWERHX1JVTlRJTUVfRElSL2J1cyBpcyBub3QgYSBzb2NrZXQ6IHN0X21vZGUgPSAwbyVsbyIsCisgICAgICAgICAgICAgICAgICAgICAobG9uZykgc3RidWYuc3RfbW9kZSk7CisgICAgICAqc3VwcG9ydGVkID0gRkFMU0U7CisgICAgICByZXQgPSBUUlVFOyAgICAgICAvKiBDYW5ub3QgdXNlIGl0LCBidXQgbm90IGFuIGVycm9yICovCisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kIChhZGRyZXNzLCAidW5peDpwYXRoPSIpIHx8CisgICAgICAhX2RidXNfYWRkcmVzc19hcHBlbmRfZXNjYXBlZCAoYWRkcmVzcywgJnVzZXJfYnVzX3BhdGgpKQorICAgIHsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAqc3VwcG9ydGVkID0gVFJVRTsKKyAgcmV0ID0gVFJVRTsKKworb3V0OgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJnVzZXJfYnVzX3BhdGgpOworICByZXR1cm4gcmV0OworfQorCisvKioKKyAqIERldGVybWluZXMgdGhlIGFkZHJlc3Mgb2YgdGhlIHNlc3Npb24gYnVzIGJ5IHF1ZXJ5aW5nIGEKKyAqIHBsYXRmb3JtLXNwZWNpZmljIG1ldGhvZC4KKyAqCisgKiBUaGUgZmlyc3QgcGFyYW1ldGVyIHdpbGwgYmUgYSBib29sZWFuIHNwZWNpZnlpbmcgd2hldGhlcgorICogb3Igbm90IGEgZHluYW1pYyBzZXNzaW9uIGxvb2t1cCBpcyBzdXBwb3J0ZWQgb24gdGhpcyBwbGF0Zm9ybS4KKyAqCisgKiBJZiBzdXBwb3J0ZWQgaXMgVFJVRSBhbmQgdGhlIHJldHVybiB2YWx1ZSBpcyAjVFJVRSwgdGhlCisgKiBhZGRyZXNzIHdpbGwgYmUgIGFwcGVuZGVkIHRvIEBwIGFkZHJlc3MuCisgKiBJZiBhIGZhaWx1cmUgaGFwcGVucywgcmV0dXJucyAjRkFMU0UgYW5kIHNldHMgYW4gZXJyb3IgaW4KKyAqIEBwIGVycm9yLgorICoKKyAqIElmIHN1cHBvcnRlZCBpcyBGQUxTRSwgaWdub3JlIHRoZSByZXR1cm4gdmFsdWUuCisgKgorICogQHBhcmFtIHN1cHBvcnRlZCByZXR1cm5zIHdoZXRoZXIgdGhpcyBtZXRob2QgaXMgc3VwcG9ydGVkCisgKiBAcGFyYW0gYWRkcmVzcyBhIERCdXNTdHJpbmcgd2hlcmUgdGhlIGFkZHJlc3MgY2FuIGJlIHN0b3JlZAorICogQHBhcmFtIGVycm9yIGEgREJ1c0Vycm9yIHRvIHN0b3JlIHRoZSBlcnJvciBpbiBjYXNlIG9mIGZhaWx1cmUKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MsICNGQUxTRSBpZiBhbiBlcnJvciBoYXBwZW5lZAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfbG9va3VwX3Nlc3Npb25fYWRkcmVzcyAoZGJ1c19ib29sX3QgKnN1cHBvcnRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICphZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgKmVycm9yKQoreworI2lmZGVmIERCVVNfRU5BQkxFX0xBVU5DSEQKKyAgKnN1cHBvcnRlZCA9IFRSVUU7CisgIHJldHVybiBfZGJ1c19sb29rdXBfc2Vzc2lvbl9hZGRyZXNzX2xhdW5jaGQgKGFkZHJlc3MsIGVycm9yKTsKKyNlbHNlCisgICpzdXBwb3J0ZWQgPSBGQUxTRTsKKworICBpZiAoIV9kYnVzX2xvb2t1cF91c2VyX2J1cyAoc3VwcG9ydGVkLCBhZGRyZXNzLCBlcnJvcikpCisgICAgcmV0dXJuIEZBTFNFOworICBlbHNlIGlmICgqc3VwcG9ydGVkKQorICAgIHJldHVybiBUUlVFOworCisgIC8qIE9uIG5vbi1NYWMgVW5peCBwbGF0Zm9ybXMsIGlmIHRoZSBzZXNzaW9uIGFkZHJlc3MgaXNuJ3QgYWxyZWFkeQorICAgKiBzZXQgaW4gREJVU19TRVNTSU9OX0JVU19BRERSRVNTIGVudmlyb25tZW50IHZhcmlhYmxlIGFuZCB0aGUKKyAgICogJFhER19SVU5USU1FX0RJUi9idXMgY2FuJ3QgYmUgdXNlZCwgd2UgcHVudCBhbmQgZmFsbCBiYWNrIHRvIHRoZQorICAgKiBhdXRvbGF1bmNoOiBnbG9iYWwgZGVmYXVsdDsgc2VlIGluaXRfc2Vzc2lvbl9hZGRyZXNzIGluCisgICAqIGRidXMvZGJ1cy1idXMuYy4gKi8KKyAgcmV0dXJuIFRSVUU7CisjZW5kaWYKK30KKworLyoqCisgKiBDYWxsZWQgd2hlbiB0aGUgYnVzIGRhZW1vbiBpcyBzaWduYWxlZCB0byByZWxvYWQgaXRzIGNvbmZpZ3VyYXRpb247IGFueQorICogY2FjaGVzIHNob3VsZCBiZSBudWtlZC4gT2YgY291cnNlIGFueSBjYWNoZXMgdGhhdCBuZWVkIGV4cGxpY2l0IHJlbG9hZAorICogYXJlIHByb2JhYmx5IGJyb2tlbiwgYnV0IGMnZXN0IGxhIHZpZS4KKyAqCisgKgorICovCit2b2lkCitfZGJ1c19mbHVzaF9jYWNoZXMgKHZvaWQpCit7CisgIF9kYnVzX3VzZXJfZGF0YWJhc2VfZmx1c2hfc3lzdGVtICgpOworfQorCisvKioKKyAqIEFwcGVuZHMgdGhlIGRpcmVjdG9yeSBpbiB3aGljaCBhIGtleXJpbmcgZm9yIHRoZSBnaXZlbiBjcmVkZW50aWFscworICogc2hvdWxkIGJlIHN0b3JlZC4gIFRoZSBjcmVkZW50aWFscyBzaG91bGQgaGF2ZSBlaXRoZXIgYSBXaW5kb3dzIG9yCisgKiBVTklYIHVzZXIgaW4gdGhlbS4gIFRoZSBkaXJlY3Rvcnkgc2hvdWxkIGJlIGFuIGFic29sdXRlIHBhdGguCisgKgorICogT24gVU5JWCB0aGUgZGlyZWN0b3J5IGlzIH4vLmRidXMta2V5cmluZ3Mgd2hpbGUgb24gV2luZG93cyBpdCBzaG91bGQgcHJvYmFibHkKKyAqIGJlIHNvbWV0aGluZyBlbHNlLCBzaW5jZSB0aGUgZG90ZmlsZSBjb252ZW50aW9uIGlzIG5vdCBub3JtYWwgb24gV2luZG93cy4KKyAqCisgKiBAcGFyYW0gZGlyZWN0b3J5IHN0cmluZyB0byBhcHBlbmQgZGlyZWN0b3J5IHRvCisgKiBAcGFyYW0gY3JlZGVudGlhbHMgY3JlZGVudGlhbHMgdGhlIGRpcmVjdG9yeSBzaG91bGQgYmUgZm9yCisgKgorICogQHJldHVybnMgI0ZBTFNFIG9uIG5vIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfYXBwZW5kX2tleXJpbmdfZGlyZWN0b3J5X2Zvcl9jcmVkZW50aWFscyAoREJ1c1N0cmluZyAgICAgICpkaXJlY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ3JlZGVudGlhbHMgKmNyZWRlbnRpYWxzKQoreworICBEQnVzU3RyaW5nIGhvbWVkaXI7CisgIERCdXNTdHJpbmcgZG90ZGlyOworICBkYnVzX3VpZF90IHVpZDsKKworICBfZGJ1c19hc3NlcnQgKGNyZWRlbnRpYWxzICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKCFfZGJ1c19jcmVkZW50aWFsc19hcmVfYW5vbnltb3VzIChjcmVkZW50aWFscykpOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZob21lZGlyKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgdWlkID0gX2RidXNfY3JlZGVudGlhbHNfZ2V0X3VuaXhfdWlkIChjcmVkZW50aWFscyk7CisgIF9kYnVzX2Fzc2VydCAodWlkICE9IERCVVNfVUlEX1VOU0VUKTsKKworICBpZiAoIV9kYnVzX2hvbWVkaXJfZnJvbV91aWQgKHVpZCwgJmhvbWVkaXIpKQorICAgIGdvdG8gZmFpbGVkOworCisjaWZkZWYgREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMKKyAgeworICAgIGNvbnN0IGNoYXIgKm92ZXJyaWRlOworCisgICAgb3ZlcnJpZGUgPSBfZGJ1c19nZXRlbnYgKCJEQlVTX1RFU1RfSE9NRURJUiIpOworICAgIGlmIChvdmVycmlkZSAhPSBOVUxMICYmICpvdmVycmlkZSAhPSAnXDAnKQorICAgICAgeworICAgICAgICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoJmhvbWVkaXIsIDApOworICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZob21lZGlyLCBvdmVycmlkZSkpCisgICAgICAgICAgZ290byBmYWlsZWQ7CisKKyAgICAgICAgX2RidXNfdmVyYm9zZSAoIlVzaW5nIGZha2UgaG9tZWRpciBmb3IgdGVzdGluZzogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmhvbWVkaXIpKTsKKyAgICAgIH0KKyAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIE5vdCBzdHJpY3RseSB0aHJlYWQtc2FmZSwgYnV0IGlmIHdlIGZhaWwgYXQgdGhyZWFkLXNhZmV0eSBoZXJlLAorICAgICAgICAgKiB0aGUgd29yc3QgdGhhdCB3aWxsIGhhcHBlbiBpcyBzb21lIGV4dHJhIHdhcm5pbmdzLiAqLworICAgICAgICBzdGF0aWMgZGJ1c19ib29sX3QgYWxyZWFkeV93YXJuZWQgPSBGQUxTRTsKKyAgICAgICAgaWYgKCFhbHJlYWR5X3dhcm5lZCkKKyAgICAgICAgICB7CisgICAgICAgICAgICBfZGJ1c193YXJuICgiVXNpbmcgJXMgZm9yIHRlc3RpbmcsIHNldCBEQlVTX1RFU1RfSE9NRURJUiB0byBhdm9pZCIsCisgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmaG9tZWRpcikpOworICAgICAgICAgICAgYWxyZWFkeV93YXJuZWQgPSBUUlVFOworICAgICAgICAgIH0KKyAgICAgIH0KKyAgfQorI2VuZGlmCisKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZkb3RkaXIsICIuZGJ1cy1rZXlyaW5ncyIpOworICBpZiAoIV9kYnVzX2NvbmNhdF9kaXJfYW5kX2ZpbGUgKCZob21lZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkb3RkaXIpKQorICAgIGdvdG8gZmFpbGVkOworCisgIGlmICghX2RidXNfc3RyaW5nX2NvcHkgKCZob21lZGlyLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3RvcnksIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChkaXJlY3RvcnkpKSkgeworICAgIGdvdG8gZmFpbGVkOworICB9CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZob21lZGlyKTsKKyAgcmV0dXJuIFRSVUU7CisKKyBmYWlsZWQ6CisgIF9kYnVzX3N0cmluZ19mcmVlICgmaG9tZWRpcik7CisgIHJldHVybiBGQUxTRTsKK30KKworLy9QRU5ESU5HKGtkYWIpIGRvY3MKK2RidXNfYm9vbF90CitfZGJ1c19kYWVtb25fcHVibGlzaF9zZXNzaW9uX2J1c19hZGRyZXNzIChjb25zdCBjaGFyKiBhZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc2NvcGUpCit7CisgIHJldHVybiBUUlVFOworfQorCisvL1BFTkRJTkcoa2RhYikgZG9jcwordm9pZAorX2RidXNfZGFlbW9uX3VucHVibGlzaF9zZXNzaW9uX2J1c19hZGRyZXNzICh2b2lkKQoreworCit9CisKKy8qKgorICogU2VlIGlmIGVycm5vIGlzIEVBR0FJTiBvciBFV09VTERCTE9DSyAodGhpcyBoYXMgdG8gYmUgZG9uZSBkaWZmZXJlbnRseQorICogZm9yIFdpbnNvY2sgc28gaXMgYWJzdHJhY3RlZCkKKyAqCisgKiBAcmV0dXJucyAjVFJVRSBpZiBlID09IEVBR0FJTiBvciBlID09IEVXT1VMREJMT0NLCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19nZXRfaXNfZXJybm9fZWFnYWluX29yX2V3b3VsZGJsb2NrIChpbnQgZSkKK3sKKyAgLyogQXZvaWQgdGhlIC1XbG9naWNhbC1vcCBHQ0Mgd2FybmluZywgd2hpY2ggY2FuIGJlIHRyaWdnZXJlZCB3aGVuIEVBR0FJTiBhbmQKKyAgICogRVdPVUxEQkxPQ0sgYXJlIG51bWVyaWNhbGx5IGVxdWFsLCB3aGljaCBpcyBwZXJtaXR0ZWQgYXMgZGVzY3JpYmVkIGJ5CisgICAqIGVycm5vKDMpLgorICAgKi8KKyNpZiBFQUdBSU4gPT0gRVdPVUxEQkxPQ0sKKyAgcmV0dXJuIGUgPT0gRUFHQUlOOworI2Vsc2UKKyAgcmV0dXJuIGUgPT0gRUFHQUlOIHx8IGUgPT0gRVdPVUxEQkxPQ0s7CisjZW5kaWYKK30KKworLyoqCisgKiBSZW1vdmVzIGEgZGlyZWN0b3J5OyBEaXJlY3RvcnkgbXVzdCBiZSBlbXB0eQorICoKKyAqIEBwYXJhbSBmaWxlbmFtZSBkaXJlY3RvcnkgZmlsZW5hbWUKKyAqIEBwYXJhbSBlcnJvciBpbml0aWFsaXplZCBlcnJvciBvYmplY3QKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2RlbGV0ZV9kaXJlY3RvcnkgKGNvbnN0IERCdXNTdHJpbmcgKmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCit7CisgIGNvbnN0IGNoYXIgKmZpbGVuYW1lX2M7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgZmlsZW5hbWVfYyA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoZmlsZW5hbWUpOworCisgIGlmIChybWRpciAoZmlsZW5hbWVfYykgIT0gMCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gcmVtb3ZlIGRpcmVjdG9yeSAlczogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWVfYywgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqICBDaGVja3Mgd2hldGhlciBmaWxlIGRlc2NyaXB0b3JzIG1heSBiZSBwYXNzZWQgdmlhIHRoZSBzb2NrZXQKKyAqCisgKiAgQHBhcmFtIGZkIHRoZSBzb2NrZXQKKyAqICBAcmV0dXJuIFRSVUUgd2hlbiBmZCBwYXNzaW5nIG92ZXIgdGhpcyBzb2NrZXQgaXMgc3VwcG9ydGVkCisgKgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc29ja2V0X2Nhbl9wYXNzX3VuaXhfZmQgKERCdXNTb2NrZXQgZmQpCit7CisjaWZkZWYgU0NNX1JJR0hUUworICB1bmlvbiB7CisgICAgc3RydWN0IHNvY2thZGRyIHNhOworICAgIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIHN0b3JhZ2U7CisgICAgc3RydWN0IHNvY2thZGRyX3VuIHVuOworICB9IHNhX2J1ZjsKKworICBzb2NrbGVuX3Qgc2FfbGVuID0gc2l6ZW9mKHNhX2J1Zik7CisKKyAgX0RCVVNfWkVSTyhzYV9idWYpOworCisgIGlmIChnZXRzb2NrbmFtZShmZC5mZCwgJnNhX2J1Zi5zYSwgJnNhX2xlbikgPCAwKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gc2FfYnVmLnNhLnNhX2ZhbWlseSA9PSBBRl9VTklYOworCisjZWxzZQorICByZXR1cm4gRkFMU0U7CisKKyNlbmRpZgorfQorCisvKioKKyAqIENsb3NlcyBhbGwgZmlsZSBkZXNjcmlwdG9ycyBleGNlcHQgdGhlIGZpcnN0IHRocmVlIChpLmUuIHN0ZGluLAorICogc3Rkb3V0LCBzdGRlcnIpLgorICovCit2b2lkCitfZGJ1c19jbG9zZV9hbGwgKHZvaWQpCit7CisgIGludCBtYXhmZHMsIGk7CisKKyNpZmRlZiBfX2xpbnV4X18KKyAgRElSICpkOworCisgIC8qIE9uIExpbnV4IHdlIGNhbiBvcHRpbWl6ZSB0aGlzIGEgYml0IGlmIC9wcm9jIGlzIGF2YWlsYWJsZS4gSWYgaXQKKyAgICAgaXNuJ3QgYXZhaWxhYmxlLCBmYWxsIGJhY2sgdG8gdGhlIGJydXRlIGZvcmNlIHdheS4gKi8KKworICBkID0gb3BlbmRpciAoIi9wcm9jL3NlbGYvZmQiKTsKKyAgaWYgKGQpCisgICAgeworICAgICAgZm9yICg7OykKKyAgICAgICAgeworICAgICAgICAgIHN0cnVjdCBkaXJlbnQgKmRlOworICAgICAgICAgIGludCBmZDsKKyAgICAgICAgICBsb25nIGw7CisgICAgICAgICAgY2hhciAqZSA9IE5VTEw7CisKKyAgICAgICAgICBkZSA9IHJlYWRkaXIgKGQpOworICAgICAgICAgIGlmICghZGUpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGlmIChkZS0+ZF9uYW1lWzBdID09ICcuJykKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgZXJybm8gPSAwOworICAgICAgICAgIGwgPSBzdHJ0b2wgKGRlLT5kX25hbWUsICZlLCAxMCk7CisgICAgICAgICAgaWYgKGVycm5vICE9IDAgfHwgZSA9PSBOVUxMIHx8ICplICE9ICdcMCcpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgIGZkID0gKGludCkgbDsKKyAgICAgICAgICBpZiAoZmQgPCAzKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICBpZiAoZmQgPT0gZGlyZmQgKGQpKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICBjbG9zZSAoZmQpOworICAgICAgICB9CisKKyAgICAgIGNsb3NlZGlyIChkKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisjZW5kaWYKKworICBtYXhmZHMgPSBzeXNjb25mIChfU0NfT1BFTl9NQVgpOworCisgIC8qIFBpY2sgc29tZXRoaW5nIHJlYXNvbmFibGUgaWYgZm9yIHNvbWUgcmVhc29uIHN5c2NvbmYgc2F5cworICAgKiB1bmxpbWl0ZWQuCisgICAqLworICBpZiAobWF4ZmRzIDwgMCkKKyAgICBtYXhmZHMgPSAxMDI0OworCisgIC8qIGNsb3NlIGFsbCBpbmhlcml0ZWQgZmRzICovCisgIGZvciAoaSA9IDM7IGkgPCBtYXhmZHM7IGkrKykKKyAgICBjbG9zZSAoaSk7Cit9CisKKy8qKgorICogKipOT1RFKio6IElmIHlvdSBtb2RpZnkgdGhpcyBmdW5jdGlvbiwgcGxlYXNlIGFsc28gY29uc2lkZXIgbWFraW5nCisgKiB0aGUgY29ycmVzcG9uZGluZyBjaGFuZ2UgaW4gR0xpYi4gIFNlZQorICogZ2xpYi9ndXRpbHMuYzpnX2NoZWNrX3NldHVpZCgpLgorICoKKyAqIFJldHVybnMgVFJVRSBpZiB0aGUgY3VycmVudCBwcm9jZXNzIHdhcyBleGVjdXRlZCBhcyBzZXR1aWQgKG9yIGFuCisgKiBlcXVpdmFsZW50IF9fbGliY19lbmFibGVfc2VjdXJlIGlzIGF2YWlsYWJsZSkuICBTZWU6CisgKiBodHRwOi8vb3NkaXIuY29tL21sL2xpbnV4Lmxmcy5oYXJkZW5lZC8yMDA3LTA0L21zZzAwMDMyLmh0bWwKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2NoZWNrX3NldHVpZCAodm9pZCkKK3sKKyAgLyogVE9ETzogZ2V0IF9fbGliY19lbmFibGVfc2VjdXJlIGV4cG9ydGVkIGZyb20gZ2xpYmMuCisgICAqIFNlZSBodHRwOi8vd3d3Lm9wZW53YWxsLmNvbS9saXN0cy9vd2wtZGV2LzIwMTIvMDgvMTQvMQorICAgKi8KKyNpZiAwICYmIGRlZmluZWQoSEFWRV9MSUJDX0VOQUJMRV9TRUNVUkUpCisgIHsKKyAgICAvKiBTZWUgZ2xpYmMvaW5jbHVkZS91bmlzdGQuaCAqLworICAgIGV4dGVybiBpbnQgX19saWJjX2VuYWJsZV9zZWN1cmU7CisgICAgcmV0dXJuIF9fbGliY19lbmFibGVfc2VjdXJlOworICB9CisjZWxpZiBkZWZpbmVkKEhBVkVfSVNTRVRVR0lEKQorICAvKiBCU0Q6IGh0dHA6Ly93d3cuZnJlZWJzZC5vcmcvY2dpL21hbi5jZ2k/cXVlcnk9aXNzZXR1Z2lkJnNla3Rpb249MiAqLworICByZXR1cm4gaXNzZXR1Z2lkICgpOworI2Vsc2UKKyAgdWlkX3QgcnVpZCwgZXVpZCwgc3VpZDsgLyogUmVhbCwgZWZmZWN0aXZlIGFuZCBzYXZlZCB1c2VyIElEJ3MgKi8KKyAgZ2lkX3QgcmdpZCwgZWdpZCwgc2dpZDsgLyogUmVhbCwgZWZmZWN0aXZlIGFuZCBzYXZlZCBncm91cCBJRCdzICovCisKKyAgLyogV2UgY2FsbCBpbnRvIHRoaXMgZnVuY3Rpb24gZnJvbSBfZGJ1c190aHJlYWRzX2luaXRfcGxhdGZvcm1fc3BlY2lmaWMoKQorICAgKiB0byBtYWtlIHN1cmUgdGhlc2UgYXJlIGluaXRpYWxpemVkIGJlZm9yZSB3ZSBzdGFydCB0aHJlYWRpbmcuICovCisgIHN0YXRpYyBkYnVzX2Jvb2xfdCBjaGVja19zZXR1aWRfaW5pdGlhbGlzZWQ7CisgIHN0YXRpYyBkYnVzX2Jvb2xfdCBpc19zZXR1aWQ7CisKKyAgaWYgKF9EQlVTX1VOTElLRUxZICghY2hlY2tfc2V0dWlkX2luaXRpYWxpc2VkKSkKKyAgICB7CisjaWZkZWYgSEFWRV9HRVRSRVNVSUQKKyAgICAgIGlmIChnZXRyZXN1aWQgKCZydWlkLCAmZXVpZCwgJnN1aWQpICE9IDAgfHwKKyAgICAgICAgICBnZXRyZXNnaWQgKCZyZ2lkLCAmZWdpZCwgJnNnaWQpICE9IDApCisjZW5kaWYgLyogSEFWRV9HRVRSRVNVSUQgKi8KKyAgICAgICAgeworICAgICAgICAgIHN1aWQgPSBydWlkID0gZ2V0dWlkICgpOworICAgICAgICAgIHNnaWQgPSByZ2lkID0gZ2V0Z2lkICgpOworICAgICAgICAgIGV1aWQgPSBnZXRldWlkICgpOworICAgICAgICAgIGVnaWQgPSBnZXRlZ2lkICgpOworICAgICAgICB9CisKKyAgICAgIGNoZWNrX3NldHVpZF9pbml0aWFsaXNlZCA9IFRSVUU7CisgICAgICBpc19zZXR1aWQgPSAocnVpZCAhPSBldWlkIHx8IHJ1aWQgIT0gc3VpZCB8fAorICAgICAgICAgICAgICAgICAgIHJnaWQgIT0gZWdpZCB8fCByZ2lkICE9IHNnaWQpOworCisgICAgfQorICByZXR1cm4gaXNfc2V0dWlkOworI2VuZGlmCit9CisKKy8qKgorICogUmVhZCB0aGUgYWRkcmVzcyBmcm9tIHRoZSBzb2NrZXQgYW5kIGFwcGVuZCBpdCB0byB0aGUgc3RyaW5nCisgKgorICogQHBhcmFtIGZkIHRoZSBzb2NrZXQKKyAqIEBwYXJhbSBhZGRyZXNzCisgKiBAcGFyYW0gZXJyb3IgcmV0dXJuIGxvY2F0aW9uIGZvciBlcnJvciBjb2RlCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19hcHBlbmRfYWRkcmVzc19mcm9tX3NvY2tldCAoREJ1c1NvY2tldCAgZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAqYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICplcnJvcikKK3sKKyAgdW5pb24geworICAgICAgc3RydWN0IHNvY2thZGRyIHNhOworICAgICAgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2Ugc3RvcmFnZTsKKyAgICAgIHN0cnVjdCBzb2NrYWRkcl91biB1bjsKKyAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBpcHY0OworICAgICAgc3RydWN0IHNvY2thZGRyX2luNiBpcHY2OworICB9IHNvY2tldDsKKyAgY2hhciBob3N0aXBbSU5FVDZfQUREUlNUUkxFTl07CisgIHNvY2tsZW5fdCBzaXplID0gc2l6ZW9mIChzb2NrZXQpOworICBEQnVzU3RyaW5nIHBhdGhfc3RyOworCisgIGlmIChnZXRzb2NrbmFtZSAoZmQuZmQsICZzb2NrZXQuc2EsICZzaXplKSkKKyAgICBnb3RvIGVycjsKKworICBzd2l0Y2ggKHNvY2tldC5zYS5zYV9mYW1pbHkpCisgICAgeworICAgIGNhc2UgQUZfVU5JWDoKKyAgICAgIGlmIChzb2NrZXQudW4uc3VuX3BhdGhbMF09PSdcMCcpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnBhdGhfc3RyLCAmKHNvY2tldC51bi5zdW5fcGF0aFsxXSkpOworICAgICAgICAgIGlmIChfZGJ1c19zdHJpbmdfYXBwZW5kIChhZGRyZXNzLCAidW5peDphYnN0cmFjdD0iKSAmJgorICAgICAgICAgICAgICBfZGJ1c19hZGRyZXNzX2FwcGVuZF9lc2NhcGVkIChhZGRyZXNzLCAmcGF0aF9zdHIpKQorICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmcGF0aF9zdHIsIHNvY2tldC51bi5zdW5fcGF0aCk7CisgICAgICAgICAgaWYgKF9kYnVzX3N0cmluZ19hcHBlbmQgKGFkZHJlc3MsICJ1bml4OnBhdGg9IikgJiYKKyAgICAgICAgICAgICAgX2RidXNfYWRkcmVzc19hcHBlbmRfZXNjYXBlZCAoYWRkcmVzcywgJnBhdGhfc3RyKSkKKyAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEFGX0lORVQ6CisgICAgICBpZiAoaW5ldF9udG9wIChBRl9JTkVULCAmc29ja2V0LmlwdjQuc2luX2FkZHIsIGhvc3RpcCwgc2l6ZW9mIChob3N0aXApKSkKKyAgICAgICAgaWYgKF9kYnVzX3N0cmluZ19hcHBlbmRfcHJpbnRmIChhZGRyZXNzLCAidGNwOmZhbWlseT1pcHY0LGhvc3Q9JXMscG9ydD0ldSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdGlwLCBudG9ocyAoc29ja2V0LmlwdjQuc2luX3BvcnQpKSkKKyAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgIGJyZWFrOworI2lmZGVmIEFGX0lORVQ2CisgICAgY2FzZSBBRl9JTkVUNjoKKyAgICAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmcGF0aF9zdHIsIGhvc3RpcCk7CisgICAgICBpZiAoaW5ldF9udG9wIChBRl9JTkVUNiwgJnNvY2tldC5pcHY2LnNpbjZfYWRkciwgaG9zdGlwLCBzaXplb2YgKGhvc3RpcCkpKQorICAgICAgICBpZiAoX2RidXNfc3RyaW5nX2FwcGVuZF9wcmludGYgKGFkZHJlc3MsICJ0Y3A6ZmFtaWx5PWlwdjYscG9ydD0ldSxob3N0PSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnRvaHMgKHNvY2tldC5pcHY2LnNpbjZfcG9ydCkpICYmCisgICAgICAgICAgICBfZGJ1c19hZGRyZXNzX2FwcGVuZF9lc2NhcGVkIChhZGRyZXNzLCAmcGF0aF9zdHIpKQorICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICBkZWZhdWx0OgorICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKEVJTlZBTCksCisgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byByZWFkIGFkZHJlc3MgZnJvbSBzb2NrZXQ6IFVua25vd24gc29ja2V0IHR5cGUuIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorIGVycjoKKyAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLAorICAgICAgICAgICAgICAgICAgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBvcGVuIHNvY2tldDogJXMiLAorICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgIHJldHVybiBGQUxTRTsKK30KKworaW50CitfZGJ1c19zYXZlX3NvY2tldF9lcnJubyAodm9pZCkKK3sKKyAgcmV0dXJuIGVycm5vOworfQorCit2b2lkCitfZGJ1c19yZXN0b3JlX3NvY2tldF9lcnJubyAoaW50IHNhdmVkX2Vycm5vKQoreworICBlcnJubyA9IHNhdmVkX2Vycm5vOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqc3lzbG9nX3RhZyA9ICJkYnVzIjsKKyNpZmRlZiBIQVZFX1NZU0xPR19ICitzdGF0aWMgREJ1c0xvZ0ZsYWdzIGxvZ19mbGFncyA9IERCVVNfTE9HX0ZMQUdTX1NUREVSUjsKKyNlbmRpZgorCisvKioKKyAqIEluaXRpYWxpemUgdGhlIHN5c3RlbSBsb2cuCisgKgorICogVGhlICJ0YWciIGlzIG5vdCBjb3BpZWQsIGFuZCBtdXN0IHJlbWFpbiB2YWxpZCBmb3IgdGhlIGVudGlyZSBsaWZldGltZSBvZgorICogdGhlIHByb2Nlc3Mgb3IgdW50aWwgX2RidXNfaW5pdF9zeXN0ZW1fbG9nKCkgaXMgY2FsbGVkIGFnYWluLiBJbiBwcmFjdGljZQorICogaXQgd2lsbCBub3JtYWxseSBiZSBhIGNvbnN0YW50LgorICoKKyAqIE9uIHBsYXRmb3JtcyB0aGF0IGRvIG5vdCBzdXBwb3J0IGEgc3lzdGVtIGxvZywgdGhlCisgKiAjREJVU19MT0dfRkxBR1NfU1lTVEVNX0xPRyBmbGFnIGlzIHRyZWF0ZWQgYXMgZXF1aXZhbGVudCB0bworICogI0RCVVNfTE9HX0ZMQUdTX1NUREVSUi4KKyAqCisgKiBAcGFyYW0gdGFnIHRoZSBuYW1lIG9mIHRoZSBleGVjdXRhYmxlIChzeXNsb2cgdGFnKQorICogQHBhcmFtIG1vZGUgd2hldGhlciB0byBsb2cgdG8gc3RkZXJyLCB0aGUgc3lzdGVtIGxvZyBvciBib3RoCisgKi8KK3ZvaWQKK19kYnVzX2luaXRfc3lzdGVtX2xvZyAoY29uc3QgY2hhciAgICp0YWcsCisgICAgICAgICAgICAgICAgICAgICAgIERCdXNMb2dGbGFncyAgZmxhZ3MpCit7CisgIC8qIFdlIG5ldmVyIHdhbnQgdG8gdHVybiBvZmYgbG9nZ2luZyBjb21wbGV0ZWx5ICovCisgIF9kYnVzX2Fzc2VydCAoCisgICAgICAoZmxhZ3MgJiAoREJVU19MT0dfRkxBR1NfU1RERVJSIHwgREJVU19MT0dfRkxBR1NfU1lTVEVNX0xPRykpICE9IDApOworCisgIHN5c2xvZ190YWcgPSB0YWc7CisKKyNpZmRlZiBIQVZFX1NZU0xPR19ICisgIGxvZ19mbGFncyA9IGZsYWdzOworCisgIGlmIChsb2dfZmxhZ3MgJiBEQlVTX0xPR19GTEFHU19TWVNURU1fTE9HKQorICAgIG9wZW5sb2cgKHRhZywgTE9HX1BJRCwgTE9HX0RBRU1PTik7CisjZW5kaWYKK30KKworLyoqCisgKiBMb2cgYSBtZXNzYWdlIHRvIHRoZSBzeXN0ZW0gbG9nIGZpbGUgKGUuZy4gc3lzbG9nIG9uIFVuaXgpIGFuZC9vciBzdGRlcnIuCisgKgorICogQHBhcmFtIHNldmVyaXR5IGEgc2V2ZXJpdHkgdmFsdWUKKyAqIEBwYXJhbSBtc2cgYSBwcmludGYtc3R5bGUgZm9ybWF0IHN0cmluZworICogQHBhcmFtIGFyZ3MgYXJndW1lbnRzIGZvciB0aGUgZm9ybWF0IHN0cmluZworICovCit2b2lkCitfZGJ1c19sb2d2IChEQnVzU3lzdGVtTG9nU2V2ZXJpdHkgIHNldmVyaXR5LAorICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgICAgICptc2csCisgICAgICAgICAgICB2YV9saXN0ICAgICAgICAgICAgICAgIGFyZ3MpCit7CisgIHZhX2xpc3QgdG1wOworI2lmZGVmIEhBVkVfU1lTTE9HX0gKKyAgaWYgKGxvZ19mbGFncyAmIERCVVNfTE9HX0ZMQUdTX1NZU1RFTV9MT0cpCisgICAgeworICAgICAgaW50IGZsYWdzOworICAgICAgc3dpdGNoIChzZXZlcml0eSkKKyAgICAgICAgeworICAgICAgICAgIGNhc2UgREJVU19TWVNURU1fTE9HX0lORk86CisgICAgICAgICAgICBmbGFncyA9ICBMT0dfREFFTU9OIHwgTE9HX0lORk87CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIERCVVNfU1lTVEVNX0xPR19XQVJOSU5HOgorICAgICAgICAgICAgZmxhZ3MgPSAgTE9HX0RBRU1PTiB8IExPR19XQVJOSU5HOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBEQlVTX1NZU1RFTV9MT0dfU0VDVVJJVFk6CisgICAgICAgICAgICBmbGFncyA9IExPR19BVVRIIHwgTE9HX05PVElDRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgREJVU19TWVNURU1fTE9HX0VSUk9SOgorICAgICAgICAgICAgZmxhZ3MgPSBMT0dfREFFTU9OfExPR19DUklUOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImludmFsaWQgbG9nIHNldmVyaXR5Iik7CisgICAgICAgIH0KKworICAgICAgREJVU19WQV9DT1BZICh0bXAsIGFyZ3MpOworICAgICAgdnN5c2xvZyAoZmxhZ3MsIG1zZywgdG1wKTsKKyAgICAgIHZhX2VuZCAodG1wKTsKKyAgICB9CisKKyAgLyogSWYgd2UgZG9uJ3QgaGF2ZSBzeXNsb2cuaCwgd2UgYWx3YXlzIGJlaGF2ZSBhcyB0aG91Z2ggc3RkZXJyIHdhcyBpbgorICAgKiB0aGUgZmxhZ3MgKi8KKyAgaWYgKGxvZ19mbGFncyAmIERCVVNfTE9HX0ZMQUdTX1NUREVSUikKKyNlbmRpZgorICAgIHsKKyAgICAgIERCVVNfVkFfQ09QWSAodG1wLCBhcmdzKTsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzWyIgREJVU19QSURfRk9STUFUICJdOiAiLCBzeXNsb2dfdGFnLCBfZGJ1c19nZXRwaWQgKCkpOworICAgICAgdmZwcmludGYgKHN0ZGVyciwgbXNnLCB0bXApOworICAgICAgZnB1dGMgKCdcbicsIHN0ZGVycik7CisgICAgICB2YV9lbmQgKHRtcCk7CisgICAgfQorfQorCisvKiB0ZXN0cyBpbiBkYnVzLXN5c2RlcHMtdXRpbC5jICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtc3lzZGVwcy11bml4LmggYi9kYnVzL2RidXMtc3lzZGVwcy11bml4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODMwZDVjZAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1zeXNkZXBzLXVuaXguaApAQCAtMCwwICsxLDE4MCBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXN5c2RlcHMtdW5peC5oIFVOSVgtc3BlY2lmaWMgd3JhcHBlcnMgYXJvdW5kIHN5c3RlbS9saWJjIGZlYXR1cmVzIChpbnRlcm5hbCB0byBELUJ1cyBpbXBsZW1lbnRhdGlvbikKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMsIDIwMDYgIFJlZCBIYXQsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwMyBDb2RlRmFjdG9yeSBBQgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBEQlVTX1NZU0RFUFNfVU5JWF9ICisjZGVmaW5lIERCVVNfU1lTREVQU19VTklYX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy1zeXNkZXBzLmg+CisKKyNpZmRlZiBEQlVTX1dJTgorI2Vycm9yICJEb24ndCBpbmNsdWRlIHRoaXMgb24gV2luZG93cyIKKyNlbmRpZgorCitEQlVTX0JFR0lOX0RFQ0xTCisKKy8qKgorICogQGRlZmdyb3VwIERCdXNTeXNkZXBzVW5peCBVTklYLXNwZWNpZmljIGludGVybmFsIEFQSQorICogQGluZ3JvdXAgREJ1c0ludGVybmFscworICogQGJyaWVmIEludGVybmFsIHN5c3RlbS1kZXBlbmRlbnQgQVBJIGF2YWlsYWJsZSBvbiBVTklYIG9ubHkKKyAqIEB7CisgKi8KKworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QKK19kYnVzX2Nsb3NlICAgICAoaW50ICAgICAgICAgICAgICAgZmQsCisgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2ludCBfZGJ1c19kdXAgICAoaW50ICAgICAgICAgICAgICAgZmQsCisgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2ludAorX2RidXNfcmVhZCAgICAgIChpbnQgICAgICAgICAgICAgICBmZCwKKyAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAqYnVmZmVyLAorICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBjb3VudCk7CitpbnQKK19kYnVzX3dyaXRlICAgICAoaW50ICAgICAgICAgICAgICAgZmQsCisgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGxlbik7CitpbnQKK19kYnVzX3dyaXRlX3R3byAoaW50ICAgICAgICAgICAgICAgZmQsCisgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmJ1ZmZlcjEsCisgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHN0YXJ0MSwKKyAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgbGVuMSwKKyAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqYnVmZmVyMiwKKyAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgc3RhcnQyLAorICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBsZW4yKTsKKworaW50IF9kYnVzX2Nvbm5lY3RfdW5peF9zb2NrZXQgKGNvbnN0IGNoYXIgICAgICpwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICBhYnN0cmFjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpOworaW50IF9kYnVzX2xpc3Rlbl91bml4X3NvY2tldCAgKGNvbnN0IGNoYXIgICAgICpwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICBhYnN0cmFjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpOworCitpbnQgX2RidXNfY29ubmVjdF9leGVjIChjb25zdCBjaGFyICAgICAqcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmNvbnN0ICAgIGFyZ3ZbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcik7CisKK2ludCBfZGJ1c19saXN0ZW5fc3lzdGVtZF9zb2NrZXRzIChEQnVzU29ja2V0ICAqKmZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAqZXJyb3IpOworCitkYnVzX2Jvb2xfdCBfZGJ1c19yZWFkX2NyZWRlbnRpYWxzIChpbnQgICAgICAgICAgICAgICBjbGllbnRfZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ3JlZGVudGlhbHMgICpjcmVkZW50aWFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKTsKK2RidXNfYm9vbF90IF9kYnVzX3NlbmRfY3JlZGVudGlhbHMgKGludCAgICAgICAgICAgICAgc2VydmVyX2ZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICplcnJvcik7CisKK2RidXNfYm9vbF90IF9kYnVzX2xvb2t1cF9sYXVuY2hkX3NvY2tldCAoREJ1c1N0cmluZyAqc29ja2V0X3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmxhdW5jaGRfZW52X3ZhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAqZXJyb3IpOworCitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCBfZGJ1c19sb29rdXBfdXNlcl9idXMgKGRidXNfYm9vbF90ICpzdXBwb3J0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICphZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAqZXJyb3IpOworCisvKiogSW5mb3JtYXRpb24gYWJvdXQgYSBVTklYIHVzZXIgKi8KK3R5cGVkZWYgc3RydWN0IERCdXNVc2VySW5mbyAgREJ1c1VzZXJJbmZvOworLyoqIEluZm9ybWF0aW9uIGFib3V0IGEgVU5JWCBncm91cCAqLwordHlwZWRlZiBzdHJ1Y3QgREJ1c0dyb3VwSW5mbyBEQnVzR3JvdXBJbmZvOworCisvKioKKyAqIEluZm9ybWF0aW9uIGFib3V0IGEgVU5JWCB1c2VyCisgKi8KK3N0cnVjdCBEQnVzVXNlckluZm8KK3sKKyAgc2l6ZV90ICAgICAgcmVmY291bnQ7ICAgICAgIC8qKjwgUmVmZXJlbmNlIGNvdW50ICovCisgIGRidXNfdWlkX3QgIHVpZDsgICAgICAgICAgICAvKio8IFVJRCAqLworICBkYnVzX2dpZF90ICBwcmltYXJ5X2dpZDsgICAgLyoqPCBHSUQgKi8KKyAgZGJ1c19naWRfdCAqZ3JvdXBfaWRzOyAgICAgIC8qKjwgR3JvdXBzIElEcywgKmluY2x1ZGluZyogYWJvdmUgcHJpbWFyeSBncm91cCAqLworICBpbnQgICAgICAgICBuX2dyb3VwX2lkczsgICAgLyoqPCBTaXplIG9mIGdyb3VwIElEcyBhcnJheSAqLworICBjaGFyICAgICAgICp1c2VybmFtZTsgICAgICAgLyoqPCBVc2VybmFtZSAqLworICBjaGFyICAgICAgICpob21lZGlyOyAgICAgICAgLyoqPCBIb21lIGRpcmVjdG9yeSAqLworfTsKKworLyoqCisgKiBJbmZvcm1hdGlvbiBhYm91dCBhIFVOSVggZ3JvdXAKKyAqLworc3RydWN0IERCdXNHcm91cEluZm8KK3sKKyAgc2l6ZV90ICAgICAgcmVmY291bnQ7ICAgICAgIC8qKjwgUmVmZXJlbmNlIGNvdW50ICovCisgIGRidXNfZ2lkX3QgIGdpZDsgICAgICAgICAgICAvKio8IEdJRCAqLworICBjaGFyICAgICAgICpncm91cG5hbWU7ICAgICAgLyoqPCBHcm91cCBuYW1lICovCit9OworCitkYnVzX2Jvb2xfdCBfZGJ1c191c2VyX2luZm9fZmlsbCAgICAgKERCdXNVc2VySW5mbyAgICAgKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKnVzZXJuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcik7CitkYnVzX2Jvb2xfdCBfZGJ1c191c2VyX2luZm9fZmlsbF91aWQgKERCdXNVc2VySW5mbyAgICAgKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWlkX3QgICAgICAgIHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpOwordm9pZCAgICAgICAgX2RidXNfdXNlcl9pbmZvX2ZyZWUgICAgIChEQnVzVXNlckluZm8gICAgICppbmZvKTsKKworZGJ1c19ib29sX3QgX2RidXNfZ3JvdXBfaW5mb19maWxsICAgICAoREJ1c0dyb3VwSW5mbyAgICAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmdyb3VwbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKTsKK2RidXNfYm9vbF90IF9kYnVzX2dyb3VwX2luZm9fZmlsbF9naWQgKERCdXNHcm91cEluZm8gICAgKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2dpZF90ICAgICAgICBnaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcik7Cit2b2lkICAgICAgICBfZGJ1c19ncm91cF9pbmZvX2ZyZWUgICAgIChEQnVzR3JvdXBJbmZvICAgICppbmZvKTsKKworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c191aWRfdCAgICBfZGJ1c19nZXRldWlkICh2b2lkKTsKKworZGJ1c19ib29sX3QgX2RidXNfcGFyc2VfdWlkIChjb25zdCBEQnVzU3RyaW5nICAqdWlkX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aWRfdCAgICAgICAgKnVpZCk7CisKK0RCVVNfUFJJVkFURV9FWFBPUlQKK3ZvaWQgX2RidXNfY2xvc2VfYWxsICh2b2lkKTsKKworZGJ1c19ib29sX3QgX2RidXNfYXBwZW5kX2FkZHJlc3NfZnJvbV9zb2NrZXQgKERCdXNTb2NrZXQgIGZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgKmFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAqZXJyb3IpOworCitEQlVTX1BSSVZBVEVfRVhQT1JUCit2b2lkIF9kYnVzX2ZkX3NldF9jbG9zZV9vbl9leGVjIChpbnQgZmQpOworCit0eXBlZGVmIGVudW0KK3sKKyAgREJVU19GT1JDRV9TVERJTl9OVUxMID0gKDEgPDwgMCksCisgIERCVVNfRk9SQ0VfU1RET1VUX05VTEwgPSAoMSA8PCAxKSwKKyAgREJVU19GT1JDRV9TVERFUlJfTlVMTCA9ICgxIDw8IDIpCit9IERCdXNFbnN1cmVTdGFuZGFyZEZkc0ZsYWdzOworCitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCBfZGJ1c19lbnN1cmVfc3RhbmRhcmRfZmRzIChEQnVzRW5zdXJlU3RhbmRhcmRGZHNGbGFncyAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgICAgICAgICAgKiplcnJvcl9zdHJfcCk7CisKKy8qKiBBIFVOSVggc2lnbmFsIGhhbmRsZXIgKi8KK3R5cGVkZWYgdm9pZCAoKiBEQnVzU2lnbmFsSGFuZGxlcikgKGludCBzaWcpOworCit2b2lkIF9kYnVzX3NldF9zaWduYWxfaGFuZGxlciAoaW50ICAgICAgICAgICAgICAgc2lnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTaWduYWxIYW5kbGVyIGhhbmRsZXIpOworCisvKiogQH0gKi8KKworREJVU19FTkRfREVDTFMKKworI2VuZGlmIC8qIERCVVNfU1lTREVQU19VTklYX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1zeXNkZXBzLXV0aWwtdW5peC5jIGIvZGJ1cy9kYnVzLXN5c2RlcHMtdXRpbC11bml4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZmY2I1YgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1zeXNkZXBzLXV0aWwtdW5peC5jCkBAIC0wLDAgKzEsMTU2NiBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXN5c2RlcHMtdXRpbC11bml4LmMgV291bGQgYmUgaW4gZGJ1cy1zeXNkZXBzLXVuaXguYywgYnV0IG5vdCB1c2VkIGluIGxpYmRidXMKKyAqIAorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1ICBSZWQgSGF0LCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgQ29kZUZhY3RvcnkgQUIKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgImRidXMtc3lzZGVwcy5oIgorI2luY2x1ZGUgImRidXMtc3lzZGVwcy11bml4LmgiCisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKyNpbmNsdWRlICJkYnVzLWxpc3QuaCIKKyNpbmNsdWRlICJkYnVzLXBpcGUuaCIKKyNpbmNsdWRlICJkYnVzLXByb3RvY29sLmgiCisjaW5jbHVkZSAiZGJ1cy1zdHJpbmcuaCIKKyNkZWZpbmUgREJVU19VU0VSREJfSU5DTFVERVNfUFJJVkFURSAxCisjaW5jbHVkZSAiZGJ1cy11c2VyZGIuaCIKKyNpbmNsdWRlICJkYnVzLXRlc3QuaCIKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaWZkZWYgSEFWRV9TWVNfUkVTT1VSQ0VfSAorI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgorI2VuZGlmCisjaW5jbHVkZSA8Z3JwLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPHN5cy91bi5oPgorCisjaWZkZWYgSEFWRV9TWVNfU1lTTElNSVRTX0gKKyNpbmNsdWRlIDxzeXMvc3lzbGltaXRzLmg+CisjZW5kaWYKKworI2lmZGVmIEhBVkVfU1lTVEVNRAorI2luY2x1ZGUgPHN5c3RlbWQvc2QtZGFlbW9uLmg+CisjZW5kaWYKKworI2lmbmRlZiBPX0JJTkFSWQorI2RlZmluZSBPX0JJTkFSWSAwCisjZW5kaWYKKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzSW50ZXJuYWxzVXRpbHMKKyAqIEB7CisgKi8KKworCisvKioKKyAqIERvZXMgdGhlIGNoZGlyLCBmb3JrLCBzZXRzaWQsIGV0Yy4gdG8gYmVjb21lIGEgZGFlbW9uIHByb2Nlc3MuCisgKgorICogQHBhcmFtIHBpZGZpbGUgI05VTEwsIG9yIHBpZGZpbGUgdG8gY3JlYXRlCisgKiBAcGFyYW0gcHJpbnRfcGlkX3BpcGUgcGlwZSB0byBwcmludCBkYWVtb24ncyBwaWQgdG8sIG9yIC0xIGZvciBub25lCisgKiBAcGFyYW0gZXJyb3IgcmV0dXJuIGxvY2F0aW9uIGZvciBlcnJvcnMKKyAqIEBwYXJhbSBrZWVwX3VtYXNrICNUUlVFIHRvIGtlZXAgdGhlIG9yaWdpbmFsIHVtYXNrCisgKiBAcmV0dXJucyAjRkFMU0Ugb24gZmFpbHVyZQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfYmVjb21lX2RhZW1vbiAoY29uc3QgREJ1c1N0cmluZyAqcGlkZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgIERCdXNQaXBlICAgICAgICAgKnByaW50X3BpZF9waXBlLAorICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICBrZWVwX3VtYXNrKQoreworICBjb25zdCBjaGFyICpzOworICBwaWRfdCBjaGlsZF9waWQ7CisgIERCdXNFbnN1cmVTdGFuZGFyZEZkc0ZsYWdzIGZsYWdzOworCisgIF9kYnVzX3ZlcmJvc2UgKCJCZWNvbWluZyBhIGRhZW1vbi4uLlxuIik7CisKKyAgX2RidXNfdmVyYm9zZSAoImNoZGlyIHRvIC9cbiIpOworICBpZiAoY2hkaXIgKCIvIikgPCAwKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBjaGRpcigpIHRvIHJvb3QgZGlyZWN0b3J5Iik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIF9kYnVzX3ZlcmJvc2UgKCJmb3JraW5nLi4uXG4iKTsKKyAgc3dpdGNoICgoY2hpbGRfcGlkID0gZm9yayAoKSkpCisgICAgeworICAgIGNhc2UgLTE6CisgICAgICBfZGJ1c192ZXJib3NlICgiZm9yayBmYWlsZWRcbiIpOworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBmb3JrIGRhZW1vbjogJXMiLCBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAwOgorICAgICAgX2RidXNfdmVyYm9zZSAoImluIGNoaWxkLCBjbG9zaW5nIHN0ZCBmaWxlIGRlc2NyaXB0b3JzXG4iKTsKKworICAgICAgZmxhZ3MgPSBEQlVTX0ZPUkNFX1NURElOX05VTEwgfCBEQlVTX0ZPUkNFX1NURE9VVF9OVUxMOworICAgICAgcyA9IF9kYnVzX2dldGVudiAoIkRCVVNfREVCVUdfT1VUUFVUIik7CisKKyAgICAgIGlmIChzID09IE5VTEwgfHwgKnMgPT0gJ1wwJykKKyAgICAgICAgZmxhZ3MgfD0gREJVU19GT1JDRV9TVERFUlJfTlVMTDsKKyAgICAgIGVsc2UKKyAgICAgICAgX2RidXNfdmVyYm9zZSAoImtlZXBpbmcgc3RkZXJyIG9wZW4gZHVlIHRvIERCVVNfREVCVUdfT1VUUFVUXG4iKTsKKworICAgICAgaWYgKCFfZGJ1c19lbnN1cmVfc3RhbmRhcmRfZmRzIChmbGFncywgJnMpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfd2FybiAoIiVzOiAlcyIsIHMsIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgICAgIF9leGl0ICgxKTsKKyAgICAgICAgfQorCisgICAgICBpZiAoIWtlZXBfdW1hc2spCisgICAgICAgIHsKKyAgICAgICAgICAvKiBHZXQgYSBwcmVkaWN0YWJsZSB1bWFzayAqLworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJzZXR0aW5nIHVtYXNrXG4iKTsKKyAgICAgICAgICB1bWFzayAoMDIyKTsKKyAgICAgICAgfQorCisgICAgICBfZGJ1c192ZXJib3NlICgiY2FsbGluZyBzZXRzaWQoKVxuIik7CisgICAgICBpZiAoc2V0c2lkICgpID09IC0xKQorICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJzZXRzaWQoKSBmYWlsZWQiKTsKKyAgICAgIAorICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgaWYgKCFfZGJ1c193cml0ZV9waWRfdG9fZmlsZV9hbmRfcGlwZSAocGlkZmlsZSwgcHJpbnRfcGlkX3BpcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZF9waWQsIGVycm9yKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJwaWQgZmlsZSBvciBwaXBlIHdyaXRlIGZhaWxlZDogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3ItPm1lc3NhZ2UpOworICAgICAgICAgIGtpbGwgKGNoaWxkX3BpZCwgU0lHVEVSTSk7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJwYXJlbnQgZXhpdGluZ1xuIik7CisgICAgICBfZXhpdCAoMCk7CisgICAgICBicmVhazsKKyAgICB9CisgIAorICByZXR1cm4gVFJVRTsKK30KKworCisvKioKKyAqIENyZWF0ZXMgYSBmaWxlIGNvbnRhaW5pbmcgdGhlIHByb2Nlc3MgSUQuCisgKgorICogQHBhcmFtIGZpbGVuYW1lIHRoZSBmaWxlbmFtZSB0byB3cml0ZSB0bworICogQHBhcmFtIHBpZCBvdXIgcHJvY2VzcyBJRAorICogQHBhcmFtIGVycm9yIHJldHVybiBsb2NhdGlvbiBmb3IgZXJyb3JzCisgKiBAcmV0dXJucyAjRkFMU0Ugb24gZmFpbHVyZQorICovCitzdGF0aWMgZGJ1c19ib29sX3QKK19kYnVzX3dyaXRlX3BpZF9maWxlIChjb25zdCBEQnVzU3RyaW5nICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgICBwaWQsCisJCSAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICBjb25zdCBjaGFyICpjZmlsZW5hbWU7CisgIGludCBmZDsKKyAgRklMRSAqZjsKKworICBjZmlsZW5hbWUgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKGZpbGVuYW1lKTsKKyAgCisgIGZkID0gb3BlbiAoY2ZpbGVuYW1lLCBPX1dST05MWXxPX0NSRUFUfE9fRVhDTHxPX0JJTkFSWSwgMDY0NCk7CisgIAorICBpZiAoZmQgPCAwKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gb3BlbiBcIiVzXCI6ICVzIiwgY2ZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoKGYgPSBmZG9wZW4gKGZkLCAidyIpKSA9PSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZmRvcGVuIGZkICVkOiAlcyIsIGZkLCBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIF9kYnVzX2Nsb3NlIChmZCwgTlVMTCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAKKyAgaWYgKGZwcmludGYgKGYsICIlbHVcbiIsIHBpZCkgPCAwKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gd3JpdGUgdG8gXCIlc1wiOiAlcyIsIGNmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIAorICAgICAgZmNsb3NlIChmKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKGZjbG9zZSAoZikgPT0gRU9GKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gY2xvc2UgXCIlc1wiOiAlcyIsIGNmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIAorICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBXcml0ZXMgdGhlIGdpdmVuIHBpZF90b193cml0ZSB0byBhIHBpZGZpbGUgKGlmIG5vbi1OVUxMKSBhbmQvb3IgdG8gYQorICogcGlwZSAoaWYgbm9uLU5VTEwpLiBEb2VzIG5vdGhpbmcgaWYgcGlkZmlsZSBhbmQgcHJpbnRfcGlkX3BpcGUgYXJlIGJvdGgKKyAqIE5VTEwuCisgKgorICogQHBhcmFtIHBpZGZpbGUgdGhlIGZpbGUgdG8gd3JpdGUgdG8gb3IgI05VTEwKKyAqIEBwYXJhbSBwcmludF9waWRfcGlwZSB0aGUgcGlwZSB0byB3cml0ZSB0byBvciAjTlVMTAorICogQHBhcmFtIHBpZF90b193cml0ZSB0aGUgcGlkIHRvIHdyaXRlIG91dAorICogQHBhcmFtIGVycm9yIGVycm9yIG9uIGZhaWx1cmUKKyAqIEByZXR1cm5zIEZBTFNFIGlmIGVycm9yIGlzIHNldAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfd3JpdGVfcGlkX3RvX2ZpbGVfYW5kX3BpcGUgKGNvbnN0IERCdXNTdHJpbmcgKnBpZGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1BpcGUgICAgICAgICAqcHJpbnRfcGlkX3BpcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19waWRfdCAgICAgICAgcGlkX3RvX3dyaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICBpZiAocGlkZmlsZSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgid3JpdGluZyBwaWQgZmlsZSAlc1xuIiwgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChwaWRmaWxlKSk7CisgICAgICBpZiAoIV9kYnVzX3dyaXRlX3BpZF9maWxlIChwaWRmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3RvX3dyaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoInBpZCBmaWxlIHdyaXRlIGZhaWxlZFxuIik7CisgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVChlcnJvcik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIk5vIHBpZCBmaWxlIHJlcXVlc3RlZFxuIik7CisgICAgfQorCisgIGlmIChwcmludF9waWRfcGlwZSAhPSBOVUxMICYmIF9kYnVzX3BpcGVfaXNfdmFsaWQgKHByaW50X3BpZF9waXBlKSkKKyAgICB7CisgICAgICBEQnVzU3RyaW5nIHBpZDsKKyAgICAgIGludCBieXRlczsKKworICAgICAgX2RidXNfdmVyYm9zZSAoIndyaXRpbmcgb3VyIHBpZCB0byBwaXBlICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgcHJpbnRfcGlkX3BpcGUtPmZkKTsKKyAgICAgIAorICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnBpZCkpCisgICAgICAgIHsKKyAgICAgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisJICAKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9pbnQgKCZwaWQsIHBpZF90b193cml0ZSkgfHwKKyAgICAgICAgICAhX2RidXNfc3RyaW5nX2FwcGVuZCAoJnBpZCwgIlxuIikpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnBpZCk7CisgICAgICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCSAgCisgICAgICBieXRlcyA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmcGlkKTsKKyAgICAgIGlmIChfZGJ1c19waXBlX3dyaXRlIChwcmludF9waWRfcGlwZSwgJnBpZCwgMCwgYnl0ZXMsIGVycm9yKSAhPSBieXRlcykKKyAgICAgICAgeworICAgICAgICAgIC8qIF9kYnVzX3BpcGVfd3JpdGUgc2V0cyBlcnJvciBvbmx5IG9uIGZhaWx1cmUsIG5vdCBzaG9ydCB3cml0ZSAqLworICAgICAgICAgIGlmIChlcnJvciAhPSBOVUxMICYmICFkYnVzX2Vycm9yX2lzX3NldChlcnJvcikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJpbnRpbmcgbWVzc2FnZSBidXMgUElEOiBkaWQgbm90IHdyaXRlIGVub3VnaCBieXRlc1xuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwaWQpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCSAgCisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnBpZCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIk5vIHBpZCBwaXBlIHRvIHdyaXRlIHRvXG4iKTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogVmVyaWZ5IHRoYXQgYWZ0ZXIgdGhlIGZvcmsgd2UgY2FuIHN1Y2Nlc3NmdWxseSBjaGFuZ2UgdG8gdGhpcyB1c2VyLgorICoKKyAqIEBwYXJhbSB1c2VyIHRoZSB1c2VybmFtZSBnaXZlbiBpbiB0aGUgZGFlbW9uIGNvbmZpZ3VyYXRpb24KKyAqIEByZXR1cm5zICNUUlVFIGlmIHVzZXJuYW1lIGlzIHZhbGlkCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c192ZXJpZnlfZGFlbW9uX3VzZXIgKGNvbnN0IGNoYXIgKnVzZXIpCit7CisgIERCdXNTdHJpbmcgdTsKKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnUsIHVzZXIpOworCisgIHJldHVybiBfZGJ1c19nZXRfdXNlcl9pZF9hbmRfcHJpbWFyeV9ncm91cCAoJnUsIE5VTEwsIE5VTEwpOworfQorCisKKy8qIFRoZSBIQVZFX0xJQkFVRElUIGNhc2UgbGl2ZXMgaW4gc2VsaW51eC5jICovCisjaWZuZGVmIEhBVkVfTElCQVVESVQKKy8qKgorICogQ2hhbmdlcyB0aGUgdXNlciBhbmQgZ3JvdXAgdGhlIGJ1cyBpcyBydW5uaW5nIGFzLgorICoKKyAqIEBwYXJhbSB1c2VyIHRoZSB1c2VyIHRvIGJlY29tZQorICogQHBhcmFtIGVycm9yIHJldHVybiBsb2NhdGlvbiBmb3IgZXJyb3JzCisgKiBAcmV0dXJucyAjRkFMU0Ugb24gZmFpbHVyZQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfY2hhbmdlX3RvX2RhZW1vbl91c2VyICAoY29uc3QgY2hhciAgICAqdXNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgKmVycm9yKQoreworICBkYnVzX3VpZF90IHVpZDsKKyAgZGJ1c19naWRfdCBnaWQ7CisgIERCdXNTdHJpbmcgdTsKKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnUsIHVzZXIpOworCisgIGlmICghX2RidXNfZ2V0X3VzZXJfaWRfYW5kX3ByaW1hcnlfZ3JvdXAgKCZ1LCAmdWlkLCAmZ2lkKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJVc2VyICclcycgZG9lcyBub3QgYXBwZWFyIHRvIGV4aXN0PyIsCisgICAgICAgICAgICAgICAgICAgICAgdXNlcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIC8qIHNldGdyb3VwcygpIG9ubHkgd29ya3MgaWYgd2UgYXJlIGEgcHJpdmlsZWdlZCBwcm9jZXNzLAorICAgKiBzbyB3ZSBkb24ndCByZXR1cm4gZXJyb3Igb24gZmFpbHVyZTsgdGhlIG9ubHkgcG9zc2libGUKKyAgICogZmFpbHVyZSBpcyB0aGF0IHdlIGRvbid0IGhhdmUgcGVybXMgdG8gZG8gaXQuCisgICAqCisgICAqIG5vdCBzdXJlIHRoaXMgaXMgcmlnaHQsIG1heWJlIGlmIHNldHVpZCgpCisgICAqIGlzIGdvaW5nIHRvIHdvcmsgdGhlbiBzZXRncm91cHMoKSBzaG91bGQgYWxzbyB3b3JrLgorICAgKi8KKyAgaWYgKHNldGdyb3VwcyAoMCwgTlVMTCkgPCAwKQorICAgIF9kYnVzX3dhcm4gKCJGYWlsZWQgdG8gZHJvcCBzdXBwbGVtZW50YXJ5IGdyb3VwczogJXMiLAorICAgICAgICAgICAgICAgIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworCisgIC8qIFNldCBHSUQgZmlyc3QsIG9yIHRoZSBzZXR1aWQgbWF5IHJlbW92ZSBvdXIgcGVybWlzc2lvbgorICAgKiB0byBjaGFuZ2UgdGhlIEdJRAorICAgKi8KKyAgaWYgKHNldGdpZCAoZ2lkKSA8IDApCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBzZXQgR0lEIHRvICVsdTogJXMiLCBnaWQsCisgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmIChzZXR1aWQgKHVpZCkgPCAwKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gc2V0IFVJRCB0byAlbHU6ICVzIiwgdWlkLAorICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKyNlbmRpZiAvKiAhSEFWRV9MSUJBVURJVCAqLworCisjaWZkZWYgSEFWRV9TRVRSTElNSVQKKworLyogV2UgYXNzdW1lIHRoYXQgaWYgd2UgaGF2ZSBzZXRybGltaXQsIHdlIGFsc28gaGF2ZSBnZXRybGltaXQgYW5kCisgKiBzdHJ1Y3QgcmxpbWl0LgorICovCisKK3N0cnVjdCBEQnVzUkxpbWl0IHsKKyAgICBzdHJ1Y3QgcmxpbWl0IGxpbTsKK307CisKK0RCdXNSTGltaXQgKgorX2RidXNfcmxpbWl0X3NhdmVfZmRfbGltaXQgKERCdXNFcnJvciAqZXJyb3IpCit7CisgIERCdXNSTGltaXQgKnNlbGY7CisKKyAgc2VsZiA9IGRidXNfbmV3MCAoREJ1c1JMaW1pdCwgMSk7CisKKyAgaWYgKHNlbGYgPT0gTlVMTCkKKyAgICB7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgaWYgKGdldHJsaW1pdCAoUkxJTUlUX05PRklMRSwgJnNlbGYtPmxpbSkgPCAwKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZ2V0IGZkIGxpbWl0OiAlcyIsIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgZGJ1c19mcmVlIChzZWxmKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICByZXR1cm4gc2VsZjsKK30KKworLyogRW5vdWdoIGZkcyB0aGF0IHdlIHNob3VsZG4ndCBydW4gb3V0LCBldmVuIGlmIHNldmVyYWwgdWlkcyB3b3JrCisgKiB0b2dldGhlciB0byBjYXJyeSBvdXQgYSBkZW5pYWwtb2Ytc2VydmljZSBhdHRhY2suIFRoaXMgaGFwcGVucyB0byBiZQorICogdGhlIHNhbWUgbnVtYmVyIHRoYXQgc3lzdGVtZCA8IDIzNCB3b3VsZCBub3JtYWxseSB1c2UuICovCisjZGVmaW5lIEVOT1VHSF9GRFMgNjU1MzYKKworZGJ1c19ib29sX3QKK19kYnVzX3JsaW1pdF9yYWlzZV9mZF9saW1pdCAoREJ1c0Vycm9yICplcnJvcikKK3sKKyAgc3RydWN0IHJsaW1pdCBvbGQsIGxpbTsKKworICBpZiAoZ2V0cmxpbWl0IChSTElNSVRfTk9GSUxFLCAmbGltKSA8IDApCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBnZXQgZmQgbGltaXQ6ICVzIiwgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIG9sZCA9IGxpbTsKKworICBpZiAoZ2V0dWlkICgpID09IDApCisgICAgeworICAgICAgLyogV2UgYXJlIHByaXZpbGVnZWQsIHNvIHJhaXNlIHRoZSBzb2Z0IGxpbWl0IHRvIGF0IGxlYXN0CisgICAgICAgKiBFTk9VR0hfRkRTLCBhbmQgdGhlIGhhcmQgbGltaXQgdG8gYXQgbGVhc3QgdGhlIGRlc2lyZWQgc29mdAorICAgICAgICogbGltaXQuIFRoaXMgYXNzdW1lcyB3ZSBjYW4gZXhlcmNpc2UgQ0FQX1NZU19SRVNPVVJDRSBvbiBMaW51eCwKKyAgICAgICAqIG9yIG90aGVyIE9TcycgZXF1aXZhbGVudHMuICovCisgICAgICBpZiAobGltLnJsaW1fY3VyICE9IFJMSU1fSU5GSU5JVFkgJiYKKyAgICAgICAgICBsaW0ucmxpbV9jdXIgPCBFTk9VR0hfRkRTKQorICAgICAgICBsaW0ucmxpbV9jdXIgPSBFTk9VR0hfRkRTOworCisgICAgICBpZiAobGltLnJsaW1fbWF4ICE9IFJMSU1fSU5GSU5JVFkgJiYKKyAgICAgICAgICBsaW0ucmxpbV9tYXggPCBsaW0ucmxpbV9jdXIpCisgICAgICAgIGxpbS5ybGltX21heCA9IGxpbS5ybGltX2N1cjsKKyAgICB9CisKKyAgLyogUmFpc2UgdGhlIHNvZnQgbGltaXQgdG8gbWF0Y2ggdGhlIGhhcmQgbGltaXQsIHdoaWNoIHdlIGNhbiBkbyBldmVuCisgICAqIGlmIHdlIGFyZSB1bnByaXZpbGVnZWQuIEluIHBhcnRpY3VsYXIsIHN5c3RlbWQgPj0gMjQwIHdpbGwgbm9ybWFsbHkKKyAgICogc2V0IHJsaW1fY3VyIHRvIDEwMjQgYW5kIHJsaW1fbWF4IHRvIDUxMioxMDI0LCByZWNlbnQgRGViaWFuCisgICAqIHZlcnNpb25zIGVuZCB1cCBzZXR0aW5nIHJsaW1fY3VyIHRvIDEwMjQgYW5kIHJsaW1fbWF4IHRvIDEwMjQqMTAyNCwKKyAgICogYW5kIG9sZGVyIGFuZCBub24tc3lzdGVtZCBMaW51eCBzeXN0ZW1zIHdvdWxkIHR5cGljYWxseSBzZXQgcmxpbV9jdXIKKyAgICogdG8gMTAyNCBhbmQgcmxpbV9tYXggdG8gNDA5Ni4gKi8KKyAgaWYgKGxpbS5ybGltX21heCA9PSBSTElNX0lORklOSVRZIHx8IGxpbS5ybGltX2N1ciA8IGxpbS5ybGltX21heCkKKyAgICBsaW0ucmxpbV9jdXIgPSBsaW0ucmxpbV9tYXg7CisKKyAgLyogRWFybHktcmV0dXJuIGlmIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8uICovCisgIGlmIChsaW0ucmxpbV9tYXggPT0gb2xkLnJsaW1fbWF4ICYmCisgICAgICBsaW0ucmxpbV9jdXIgPT0gb2xkLnJsaW1fY3VyKQorICAgIHJldHVybiBUUlVFOworCisgIGlmIChzZXRybGltaXQgKFJMSU1JVF9OT0ZJTEUsICZsaW0pIDwgMCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHNldCBmZCBsaW1pdCB0byAlbHU6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykgbGltLnJsaW1fY3VyLAorICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworZGJ1c19ib29sX3QKK19kYnVzX3JsaW1pdF9yZXN0b3JlX2ZkX2xpbWl0IChEQnVzUkxpbWl0ICpzYXZlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICplcnJvcikKK3sKKyAgaWYgKHNldHJsaW1pdCAoUkxJTUlUX05PRklMRSwgJnNhdmVkLT5saW0pIDwgMCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHJlc3RvcmUgb2xkIGZkIGxpbWl0OiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCisjZWxzZSAvKiAhSEFWRV9TRVRSTElNSVQgKi8KKworc3RhdGljIHZvaWQKK2ZkX2xpbWl0X25vdF9zdXBwb3J0ZWQgKERCdXNFcnJvciAqZXJyb3IpCit7CisgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT1RfU1VQUE9SVEVELAorICAgICAgICAgICAgICAgICAgImNhbm5vdCBjaGFuZ2UgZmQgbGltaXQgb24gdGhpcyBwbGF0Zm9ybSIpOworfQorCitEQnVzUkxpbWl0ICoKK19kYnVzX3JsaW1pdF9zYXZlX2ZkX2xpbWl0IChEQnVzRXJyb3IgKmVycm9yKQoreworICBmZF9saW1pdF9ub3Rfc3VwcG9ydGVkIChlcnJvcik7CisgIHJldHVybiBOVUxMOworfQorCitkYnVzX2Jvb2xfdAorX2RidXNfcmxpbWl0X3JhaXNlX2ZkX2xpbWl0IChEQnVzRXJyb3IgKmVycm9yKQoreworICBmZF9saW1pdF9ub3Rfc3VwcG9ydGVkIChlcnJvcik7CisgIHJldHVybiBGQUxTRTsKK30KKworZGJ1c19ib29sX3QKK19kYnVzX3JsaW1pdF9yZXN0b3JlX2ZkX2xpbWl0IChEQnVzUkxpbWl0ICpzYXZlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICplcnJvcikKK3sKKyAgZmRfbGltaXRfbm90X3N1cHBvcnRlZCAoZXJyb3IpOworICByZXR1cm4gRkFMU0U7Cit9CisKKyNlbmRpZgorCit2b2lkCitfZGJ1c19ybGltaXRfZnJlZSAoREJ1c1JMaW1pdCAqbGltKQoreworICBkYnVzX2ZyZWUgKGxpbSk7Cit9CisKKy8qKiBJbnN0YWxscyBhIFVOSVggc2lnbmFsIGhhbmRsZXIKKyAqCisgKiBAcGFyYW0gc2lnIHRoZSBzaWduYWwgdG8gaGFuZGxlCisgKiBAcGFyYW0gaGFuZGxlciB0aGUgaGFuZGxlcgorICovCit2b2lkCitfZGJ1c19zZXRfc2lnbmFsX2hhbmRsZXIgKGludCAgICAgICAgICAgICAgIHNpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1NpZ25hbEhhbmRsZXIgaGFuZGxlcikKK3sKKyAgc3RydWN0IHNpZ2FjdGlvbiBhY3Q7CisgIHNpZ3NldF90IGVtcHR5X21hc2s7CisgIAorICBzaWdlbXB0eXNldCAoJmVtcHR5X21hc2spOworICBhY3Quc2FfaGFuZGxlciA9IGhhbmRsZXI7CisgIGFjdC5zYV9tYXNrICAgID0gZW1wdHlfbWFzazsKKyAgYWN0LnNhX2ZsYWdzICAgPSAwOworICBzaWdhY3Rpb24gKHNpZywgICZhY3QsIE5VTEwpOworfQorCisvKiogQ2hlY2tzIGlmIGEgZmlsZSBleGlzdHMKKyoKKyogQHBhcmFtIGZpbGUgZnVsbCBwYXRoIHRvIHRoZSBmaWxlCisqIEByZXR1cm5zICNUUlVFIGlmIGZpbGUgZXhpc3RzCisqLworZGJ1c19ib29sX3QgCitfZGJ1c19maWxlX2V4aXN0cyAoY29uc3QgY2hhciAqZmlsZSkKK3sKKyAgcmV0dXJuIChhY2Nlc3MgKGZpbGUsIEZfT0spID09IDApOworfQorCisvKiogQ2hlY2tzIGlmIHVzZXIgaXMgYXQgdGhlIGNvbnNvbGUKKyoKKyogQHBhcmFtIHVzZXJuYW1lIHVzZXIgdG8gY2hlY2sKKyogQHBhcmFtIGVycm9yIHJldHVybiBsb2NhdGlvbiBmb3IgZXJyb3JzCisqIEByZXR1cm5zICNUUlVFIGlzIHRoZSB1c2VyIGlzIGF0IHRoZSBjb25zb2xlaSBhbmQgdGhlcmUgYXJlIG5vIGVycm9ycworKi8KK2RidXNfYm9vbF90IAorX2RidXNfdXNlcl9hdF9jb25zb2xlIChjb25zdCBjaGFyICp1c2VybmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAqZXJyb3IpCit7CisjaWZkZWYgREJVU19DT05TT0xFX0FVVEhfRElSCisgIERCdXNTdHJpbmcgdSwgZjsKKyAgZGJ1c19ib29sX3QgcmVzdWx0OworCisgIHJlc3VsdCA9IEZBTFNFOworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZikpCisgICAgeworICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZmLCBEQlVTX0NPTlNPTEVfQVVUSF9ESVIpKQorICAgIHsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJnUsIHVzZXJuYW1lKTsKKworICBpZiAoIV9kYnVzX2NvbmNhdF9kaXJfYW5kX2ZpbGUgKCZmLCAmdSkpCisgICAgeworICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIHJlc3VsdCA9IF9kYnVzX2ZpbGVfZXhpc3RzIChfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZmKSk7CisKKyBvdXQ6CisgIF9kYnVzX3N0cmluZ19mcmVlICgmZik7CisKKyAgcmV0dXJuIHJlc3VsdDsKKyNlbHNlCisgIHJldHVybiBGQUxTRTsKKyNlbmRpZgorfQorCisKKy8qKgorICogQ2hlY2tzIHdoZXRoZXIgdGhlIGZpbGVuYW1lIGlzIGFuIGFic29sdXRlIHBhdGgKKyAqCisgKiBAcGFyYW0gZmlsZW5hbWUgdGhlIGZpbGVuYW1lCisgKiBAcmV0dXJucyAjVFJVRSBpZiBhbiBhYnNvbHV0ZSBwYXRoCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19wYXRoX2lzX2Fic29sdXRlIChjb25zdCBEQnVzU3RyaW5nICpmaWxlbmFtZSkKK3sKKyAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChmaWxlbmFtZSkgPiAwKQorICAgIHJldHVybiBfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKGZpbGVuYW1lLCAwKSA9PSAnLyc7CisgIGVsc2UKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKgorICogc3RhdCgpIHdyYXBwZXIuCisgKgorICogQHBhcmFtIGZpbGVuYW1lIHRoZSBmaWxlbmFtZSB0byBzdGF0CisgKiBAcGFyYW0gc3RhdGJ1ZiB0aGUgc3RhdCBpbmZvIHRvIGZpbGwgaW4KKyAqIEBwYXJhbSBlcnJvciByZXR1cm4gbG9jYXRpb24gZm9yIGVycm9yCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgZXJyb3Igd2FzIHNldAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RhdCAoY29uc3QgREJ1c1N0cmluZyAqZmlsZW5hbWUsCisgICAgICAgICAgICBEQnVzU3RhdCAgICAgICAgICpzdGF0YnVmLAorICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCit7CisgIGNvbnN0IGNoYXIgKmZpbGVuYW1lX2M7CisgIHN0cnVjdCBzdGF0IHNiOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworICAKKyAgZmlsZW5hbWVfYyA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoZmlsZW5hbWUpOworCisgIGlmIChzdGF0IChmaWxlbmFtZV9jLCAmc2IpIDwgMCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAiJXMiLCBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgc3RhdGJ1Zi0+bW9kZSA9IHNiLnN0X21vZGU7CisgIHN0YXRidWYtPm5saW5rID0gc2Iuc3Rfbmxpbms7CisgIHN0YXRidWYtPnVpZCA9IHNiLnN0X3VpZDsKKyAgc3RhdGJ1Zi0+Z2lkID0gc2Iuc3RfZ2lkOworICBzdGF0YnVmLT5zaXplID0gc2Iuc3Rfc2l6ZTsKKyAgc3RhdGJ1Zi0+YXRpbWUgPSBzYi5zdF9hdGltZTsKKyAgc3RhdGJ1Zi0+bXRpbWUgPSBzYi5zdF9tdGltZTsKKyAgc3RhdGJ1Zi0+Y3RpbWUgPSBzYi5zdF9jdGltZTsKKworICByZXR1cm4gVFJVRTsKK30KKworCisvKioKKyAqIEludGVybmFscyBvZiBkaXJlY3RvcnkgaXRlcmF0b3IKKyAqLworc3RydWN0IERCdXNEaXJJdGVyCit7CisgIERJUiAqZDsgLyoqPCBUaGUgRElSKiBmcm9tIG9wZW5kaXIoKSAqLworICAKK307CisKKy8qKgorICogT3BlbiBhIGRpcmVjdG9yeSB0byBpdGVyYXRlIG92ZXIuCisgKgorICogQHBhcmFtIGZpbGVuYW1lIHRoZSBkaXJlY3RvcnkgbmFtZQorICogQHBhcmFtIGVycm9yIGV4Y2VwdGlvbiByZXR1cm4gb2JqZWN0IG9yICNOVUxMCisgKiBAcmV0dXJucyBuZXcgaXRlcmF0b3IsIG9yICNOVUxMIG9uIGVycm9yCisgKi8KK0RCdXNEaXJJdGVyKgorX2RidXNfZGlyZWN0b3J5X29wZW4gKGNvbnN0IERCdXNTdHJpbmcgKmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICBESVIgKmQ7CisgIERCdXNEaXJJdGVyICppdGVyOworICBjb25zdCBjaGFyICpmaWxlbmFtZV9jOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworICAKKyAgZmlsZW5hbWVfYyA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoZmlsZW5hbWUpOworCisgIGQgPSBvcGVuZGlyIChmaWxlbmFtZV9jKTsKKyAgaWYgKGQgPT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHJlYWQgZGlyZWN0b3J5IFwiJXNcIjogJXMiLAorICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lX2MsCisgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIGl0ZXIgPSBkYnVzX25ldzAgKERCdXNEaXJJdGVyLCAxKTsKKyAgaWYgKGl0ZXIgPT0gTlVMTCkKKyAgICB7CisgICAgICBjbG9zZWRpciAoZCk7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLAorICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBkaXJlY3RvcnkgaXRlcmF0b3IiKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBpdGVyLT5kID0gZDsKKworICByZXR1cm4gaXRlcjsKK30KKworLyoqCisgKiBHZXQgbmV4dCBmaWxlIGluIHRoZSBkaXJlY3RvcnkuIFdpbGwgbm90IHJldHVybiAiLiIgb3IgIi4uIiAgb24KKyAqIFVOSVguIElmIGFuIGVycm9yIG9jY3VycywgdGhlIGNvbnRlbnRzIG9mICJmaWxlbmFtZSIgYXJlCisgKiB1bmRlZmluZWQuIFRoZSBlcnJvciBpcyBuZXZlciBzZXQgaWYgdGhlIGZ1bmN0aW9uIHN1Y2NlZWRzLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgbm90IHJlLWVudHJhbnQsIGFuZCBub3QgbmVjZXNzYXJpbHkgdGhyZWFkLXNhZmUuCisgKiBPbmx5IHVzZSBpdCBmb3IgdGVzdCBjb2RlIG9yIHNpbmdsZS10aHJlYWRlZCB1dGlsaXRpZXMuCisgKgorICogQHBhcmFtIGl0ZXIgdGhlIGl0ZXJhdG9yCisgKiBAcGFyYW0gZmlsZW5hbWUgc3RyaW5nIHRvIGJlIHNldCB0byB0aGUgbmV4dCBmaWxlIGluIHRoZSBkaXIKKyAqIEBwYXJhbSBlcnJvciByZXR1cm4gbG9jYXRpb24gZm9yIGVycm9yCisgKiBAcmV0dXJucyAjVFJVRSBpZiBmaWxlbmFtZSB3YXMgZmlsbGVkIGluIHdpdGggYSBuZXcgZmlsZW5hbWUKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2RpcmVjdG9yeV9nZXRfbmV4dF9maWxlIChEQnVzRGlySXRlciAgICAgICppdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgKmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICBzdHJ1Y3QgZGlyZW50ICplbnQ7CisgIGludCBlcnI7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyBhZ2FpbjoKKyAgZXJybm8gPSAwOworICBlbnQgPSByZWFkZGlyIChpdGVyLT5kKTsKKworICBpZiAoIWVudCkKKyAgICB7CisgICAgICBlcnIgPSBlcnJubzsKKworICAgICAgaWYgKGVyciAhPSAwKQorICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIiVzIiwgX2RidXNfc3RyZXJyb3IgKGVycikpOworCisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICBlbHNlIGlmIChlbnQtPmRfbmFtZVswXSA9PSAnLicgJiYKKyAgICAgICAgICAgKGVudC0+ZF9uYW1lWzFdID09ICdcMCcgfHwKKyAgICAgICAgICAgIChlbnQtPmRfbmFtZVsxXSA9PSAnLicgJiYgZW50LT5kX25hbWVbMl0gPT0gJ1wwJykpKQorICAgIGdvdG8gYWdhaW47CisgIGVsc2UKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoZmlsZW5hbWUsIDApOworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kIChmaWxlbmFtZSwgZW50LT5kX25hbWUpKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vIG1lbW9yeSB0byByZWFkIGRpcmVjdG9yeSBlbnRyeSIpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKgorICogQ2xvc2VzIGEgZGlyZWN0b3J5IGl0ZXJhdGlvbi4KKyAqLwordm9pZAorX2RidXNfZGlyZWN0b3J5X2Nsb3NlIChEQnVzRGlySXRlciAqaXRlcikKK3sKKyAgY2xvc2VkaXIgKGl0ZXItPmQpOworICBkYnVzX2ZyZWUgKGl0ZXIpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2ZpbGxfdXNlcl9pbmZvX2Zyb21fZ3JvdXAgKHN0cnVjdCBncm91cCAgKmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzR3JvdXBJbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAqZXJyb3IpCit7CisgIF9kYnVzX2Fzc2VydCAoZy0+Z3JfbmFtZSAhPSBOVUxMKTsKKyAgCisgIGluZm8tPmdpZCA9IGctPmdyX2dpZDsKKyAgaW5mby0+Z3JvdXBuYW1lID0gX2RidXNfc3RyZHVwIChnLT5ncl9uYW1lKTsKKworICAvKiBpbmZvLT5tZW1iZXJzID0gZGJ1c19zdHJkdXB2IChnLT5ncl9tZW0pICovCisgIAorICBpZiAoaW5mby0+Z3JvdXBuYW1lID09IE5VTEwpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2ZpbGxfZ3JvdXBfaW5mbyAoREJ1c0dyb3VwSW5mbyAgICAqaW5mbywKKyAgICAgICAgICAgICAgICAgZGJ1c19naWRfdCAgICAgICAgZ2lkLAorICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpncm91cG5hbWUsCisgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICBjb25zdCBjaGFyICpncm91cF9jX3N0cjsKKworICBfZGJ1c19hc3NlcnQgKGdyb3VwbmFtZSAhPSBOVUxMIHx8IGdpZCAhPSBEQlVTX0dJRF9VTlNFVCk7CisgIF9kYnVzX2Fzc2VydCAoZ3JvdXBuYW1lID09IE5VTEwgfHwgZ2lkID09IERCVVNfR0lEX1VOU0VUKTsKKworICBpZiAoZ3JvdXBuYW1lKQorICAgIGdyb3VwX2Nfc3RyID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChncm91cG5hbWUpOworICBlbHNlCisgICAgZ3JvdXBfY19zdHIgPSBOVUxMOworICAKKyAgLyogRm9yIG5vdyBhc3N1bWluZyB0aGF0IHRoZSBnZXRncm5hbSgpIGFuZCBnZXRncmdpZCgpIGZsYXZvcnMKKyAgICogYWx3YXlzIGNvcnJlc3BvbmQgdG8gdGhlIHB3bmFtIGZsYXZvcnMsIGlmIG5vdCB3ZSBoYXZlCisgICAqIHRvIGFkZCBtb3JlIGNvbmZpZ3VyZSBjaGVja3MuCisgICAqLworICAKKyNpZiBkZWZpbmVkIChIQVZFX1BPU0lYX0dFVFBXTkFNX1IpIHx8IGRlZmluZWQgKEhBVkVfTk9OUE9TSVhfR0VUUFdOQU1fUikKKyAgeworICAgIHN0cnVjdCBncm91cCAqZzsKKyAgICBpbnQgcmVzdWx0OworICAgIHNpemVfdCBidWZsZW47CisgICAgY2hhciAqYnVmOworICAgIHN0cnVjdCBncm91cCBnX3N0cjsKKyAgICBkYnVzX2Jvb2xfdCBiOworCisgICAgLyogcmV0cmlldmUgbWF4aW11bSBuZWVkZWQgc2l6ZSBmb3IgYnVmICovCisgICAgYnVmbGVuID0gc3lzY29uZiAoX1NDX0dFVEdSX1JfU0laRV9NQVgpOworCisgICAgLyogc3lzY29uZiBhY3R1YWxseSByZXR1cm5zIGEgbG9uZywgYnV0IGV2ZXJ5dGhpbmcgZWxzZSBleHBlY3RzIHNpemVfdCwKKyAgICAgKiBzbyBqdXN0IHJlY2FzdCBoZXJlLgorICAgICAqIGh0dHBzOi8vYnVncy5mcmVlZGVza3RvcC5vcmcvc2hvd19idWcuY2dpP2lkPTE3MDYxCisgICAgICovCisgICAgaWYgKChsb25nKSBidWZsZW4gPD0gMCkKKyAgICAgIGJ1ZmxlbiA9IDEwMjQ7CisKKyAgICByZXN1bHQgPSAtMTsKKyAgICB3aGlsZSAoMSkKKyAgICAgIHsKKyAgICAgICAgYnVmID0gZGJ1c19tYWxsb2MgKGJ1Zmxlbik7CisgICAgICAgIGlmIChidWYgPT0gTlVMTCkKKyAgICAgICAgICB7CisgICAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICB9CisKKyAgICAgICAgZyA9IE5VTEw7CisjaWZkZWYgSEFWRV9QT1NJWF9HRVRQV05BTV9SCisgICAgICAgIGlmIChncm91cF9jX3N0cikKKyAgICAgICAgICByZXN1bHQgPSBnZXRncm5hbV9yIChncm91cF9jX3N0ciwgJmdfc3RyLCBidWYsIGJ1ZmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICByZXN1bHQgPSBnZXRncmdpZF9yIChnaWQsICZnX3N0ciwgYnVmLCBidWZsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmcpOworI2Vsc2UKKyAgICAgICAgZyA9IGdldGdybmFtX3IgKGdyb3VwX2Nfc3RyLCAmZ19zdHIsIGJ1ZiwgYnVmbGVuKTsKKyAgICAgICAgcmVzdWx0ID0gMDsKKyNlbmRpZiAvKiAhSEFWRV9QT1NJWF9HRVRQV05BTV9SICovCisgICAgICAgIC8qIFRyeSBhIGJpZ2dlciBidWZmZXIgaWYgRVJBTkdFIHdhcyByZXR1cm5lZDoKKyAgICAgICAgICAgaHR0cHM6Ly9idWdzLmZyZWVkZXNrdG9wLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTY3MjcKKyAgICAgICAgKi8KKyAgICAgICAgaWYgKHJlc3VsdCA9PSBFUkFOR0UgJiYgYnVmbGVuIDwgNTEyICogMTAyNCkKKyAgICAgICAgICB7CisgICAgICAgICAgICBkYnVzX2ZyZWUgKGJ1Zik7CisgICAgICAgICAgICBidWZsZW4gKj0gMjsKKyAgICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICB9CisKKyAgICBpZiAocmVzdWx0ID09IDAgJiYgZyA9PSAmZ19zdHIpCisgICAgICB7CisgICAgICAgIGIgPSBmaWxsX3VzZXJfaW5mb19mcm9tX2dyb3VwIChnLCBpbmZvLCBlcnJvcik7CisgICAgICAgIGRidXNfZnJlZSAoYnVmKTsKKyAgICAgICAgcmV0dXJuIGI7CisgICAgICB9CisgICAgZWxzZQorICAgICAgeworICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJHcm91cCAlcyB1bmtub3duIG9yIGZhaWxlZCB0byBsb29rIGl0IHVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBfY19zdHIgPyBncm91cF9jX3N0ciA6ICI/Pz8iKTsKKyAgICAgICAgZGJ1c19mcmVlIChidWYpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9CisgIH0KKyNlbHNlIC8qICEgSEFWRV9HRVRQV05BTV9SICovCisgIHsKKyAgICAvKiBJIGd1ZXNzIHdlJ3JlIHNjcmV3ZWQgb24gdGhyZWFkIHNhZmV0eSBoZXJlICovCisgICAgc3RydWN0IGdyb3VwICpnOworCisgICAgZyA9IGdldGdybmFtIChncm91cF9jX3N0cik7CisKKyAgICBpZiAoZyAhPSBOVUxMKQorICAgICAgeworICAgICAgICByZXR1cm4gZmlsbF91c2VyX2luZm9fZnJvbV9ncm91cCAoZywgaW5mbywgZXJyb3IpOworICAgICAgfQorICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgICAiR3JvdXAgJXMgdW5rbm93biBvciBmYWlsZWQgdG8gbG9vayBpdCB1cFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwX2Nfc3RyID8gZ3JvdXBfY19zdHIgOiAiPz8/Iik7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgfQorI2VuZGlmICAvKiAhIEhBVkVfR0VUUFdOQU1fUiAqLworfQorCisvKioKKyAqIEluaXRpYWxpemVzIHRoZSBnaXZlbiBEQnVzR3JvdXBJbmZvIHN0cnVjdAorICogd2l0aCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZ2l2ZW4gZ3JvdXAgbmFtZS4KKyAqCisgKiBAcGFyYW0gaW5mbyB0aGUgZ3JvdXAgaW5mbyBzdHJ1Y3QKKyAqIEBwYXJhbSBncm91cG5hbWUgbmFtZSBvZiBncm91cAorICogQHBhcmFtIGVycm9yIHRoZSBlcnJvciByZXR1cm4KKyAqIEByZXR1cm5zICNGQUxTRSBpZiBlcnJvciBpcyBzZXQKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2dyb3VwX2luZm9fZmlsbCAoREJ1c0dyb3VwSW5mbyAgICAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqZ3JvdXBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgcmV0dXJuIGZpbGxfZ3JvdXBfaW5mbyAoaW5mbywgREJVU19HSURfVU5TRVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwbmFtZSwgZXJyb3IpOworCit9CisKKy8qKgorICogSW5pdGlhbGl6ZXMgdGhlIGdpdmVuIERCdXNHcm91cEluZm8gc3RydWN0CisgKiB3aXRoIGluZm9ybWF0aW9uIGFib3V0IHRoZSBnaXZlbiBncm91cCBJRC4KKyAqCisgKiBAcGFyYW0gaW5mbyB0aGUgZ3JvdXAgaW5mbyBzdHJ1Y3QKKyAqIEBwYXJhbSBnaWQgZ3JvdXAgSUQKKyAqIEBwYXJhbSBlcnJvciB0aGUgZXJyb3IgcmV0dXJuCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgZXJyb3IgaXMgc2V0CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19ncm91cF9pbmZvX2ZpbGxfZ2lkIChEQnVzR3JvdXBJbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19naWRfdCAgICAgZ2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAqZXJyb3IpCit7CisgIHJldHVybiBmaWxsX2dyb3VwX2luZm8gKGluZm8sIGdpZCwgTlVMTCwgZXJyb3IpOworfQorCisvKioKKyAqIFBhcnNlIGEgVU5JWCB1c2VyIGZyb20gdGhlIGJ1cyBjb25maWcgZmlsZS4gT24gV2luZG93cywgdGhpcyBzaG91bGQKKyAqIHNpbXBseSBhbHdheXMgZmFpbCAoanVzdCByZXR1cm4gI0ZBTFNFKS4KKyAqCisgKiBAcGFyYW0gdXNlcm5hbWUgdGhlIHVzZXJuYW1lIHRleHQKKyAqIEBwYXJhbSB1aWRfcCBwbGFjZSB0byByZXR1cm4gdGhlIHVpZAorICogQHJldHVybnMgI1RSVUUgb24gc3VjY2VzcworICovCitkYnVzX2Jvb2xfdAorX2RidXNfcGFyc2VfdW5peF91c2VyX2Zyb21fY29uZmlnIChjb25zdCBEQnVzU3RyaW5nICAqdXNlcm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWlkX3QgICAgICAgICp1aWRfcCkKK3sKKyAgcmV0dXJuIF9kYnVzX2dldF91c2VyX2lkICh1c2VybmFtZSwgdWlkX3ApOworCit9CisKKy8qKgorICogUGFyc2UgYSBVTklYIGdyb3VwIGZyb20gdGhlIGJ1cyBjb25maWcgZmlsZS4gT24gV2luZG93cywgdGhpcyBzaG91bGQKKyAqIHNpbXBseSBhbHdheXMgZmFpbCAoanVzdCByZXR1cm4gI0ZBTFNFKS4KKyAqCisgKiBAcGFyYW0gZ3JvdXBuYW1lIHRoZSBncm91cG5hbWUgdGV4dAorICogQHBhcmFtIGdpZF9wIHBsYWNlIHRvIHJldHVybiB0aGUgZ2lkCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19wYXJzZV91bml4X2dyb3VwX2Zyb21fY29uZmlnIChjb25zdCBEQnVzU3RyaW5nICAqZ3JvdXBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19naWRfdCAgICAgICAgKmdpZF9wKQoreworICByZXR1cm4gX2RidXNfZ2V0X2dyb3VwX2lkIChncm91cG5hbWUsIGdpZF9wKTsKK30KKworLyoqCisgKiBHZXRzIGFsbCBncm91cHMgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gVU5JWCB1c2VyIElELiBPbiBVTklYLAorICoganVzdCBjYWxscyBfZGJ1c19ncm91cHNfZnJvbV91aWQoKS4gT24gV2luZG93cywgc2hvdWxkIGFsd2F5cworICogZmFpbCBzaW5jZSB3ZSBkb24ndCBrbm93IGFueSBVTklYIGdyb3Vwcy4KKyAqCisgKiBAcGFyYW0gdWlkIHRoZSBVSUQKKyAqIEBwYXJhbSBncm91cF9pZHMgcmV0dXJuIGxvY2F0aW9uIGZvciBhcnJheSBvZiBncm91cCBJRHMKKyAqIEBwYXJhbSBuX2dyb3VwX2lkcyByZXR1cm4gbG9jYXRpb24gZm9yIGxlbmd0aCBvZiByZXR1cm5lZCBhcnJheQorICogQHJldHVybnMgI1RSVUUgaWYgdGhlIFVJRCBleGlzdGVkIGFuZCB3ZSBnb3Qgc29tZSBjcmVkZW50aWFscworICovCitkYnVzX2Jvb2xfdAorX2RidXNfdW5peF9ncm91cHNfZnJvbV91aWQgKGRidXNfdWlkX3QgICAgICAgICAgICB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19naWRfdCAgICAgICAgICAqKmdyb3VwX2lkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAqbl9ncm91cF9pZHMpCit7CisgIHJldHVybiBfZGJ1c19ncm91cHNfZnJvbV91aWQgKHVpZCwgZ3JvdXBfaWRzLCBuX2dyb3VwX2lkcyk7Cit9CisKKy8qKgorICogQ2hlY2tzIHRvIHNlZSBpZiB0aGUgVU5JWCB1c2VyIElEIGlzIGF0IHRoZSBjb25zb2xlLgorICogU2hvdWxkIGFsd2F5cyBmYWlsIG9uIFdpbmRvd3MgKHNldCB0aGUgZXJyb3IgdG8KKyAqICNEQlVTX0VSUk9SX05PVF9TVVBQT1JURUQpLgorICoKKyAqIEBwYXJhbSB1aWQgVUlEIG9mIHBlcnNvbiB0byBjaGVjayAKKyAqIEBwYXJhbSBlcnJvciByZXR1cm4gbG9jYXRpb24gZm9yIGVycm9ycworICogQHJldHVybnMgI1RSVUUgaWYgdGhlIFVJRCBpcyB0aGUgc2FtZSBhcyB0aGUgY29uc29sZSB1c2VyIGFuZCB0aGVyZSBhcmUgbm8gZXJyb3JzCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c191bml4X3VzZXJfaXNfYXRfY29uc29sZSAoZGJ1c191aWRfdCAgICAgICAgIHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAqZXJyb3IpCit7CisgIHJldHVybiBfZGJ1c19pc19jb25zb2xlX3VzZXIgKHVpZCwgZXJyb3IpOworCit9CisKKy8qKgorICogQ2hlY2tzIHRvIHNlZSBpZiB0aGUgVU5JWCB1c2VyIElEIG1hdGNoZXMgdGhlIFVJRCBvZgorICogdGhlIHByb2Nlc3MuIFNob3VsZCBhbHdheXMgcmV0dXJuICNGQUxTRSBvbiBXaW5kb3dzLgorICoKKyAqIEBwYXJhbSB1aWQgdGhlIFVOSVggdXNlciBJRAorICogQHJldHVybnMgI1RSVUUgaWYgdGhpcyB1aWQgb3ducyB0aGUgcHJvY2Vzcy4KKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3VuaXhfdXNlcl9pc19wcm9jZXNzX293bmVyIChkYnVzX3VpZF90IHVpZCkKK3sKKyAgcmV0dXJuIHVpZCA9PSBfZGJ1c19nZXRldWlkICgpOworfQorCisvKioKKyAqIENoZWNrcyB0byBzZWUgaWYgdGhlIFdpbmRvd3MgdXNlciBTSUQgbWF0Y2hlcyB0aGUgb3duZXIgb2YKKyAqIHRoZSBwcm9jZXNzLiBTaG91bGQgYWx3YXlzIHJldHVybiAjRkFMU0Ugb24gVU5JWC4KKyAqCisgKiBAcGFyYW0gd2luZG93c19zaWQgdGhlIFdpbmRvd3MgdXNlciBTSUQKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoaXMgdXNlciBvd25zIHRoZSBwcm9jZXNzLgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfd2luZG93c191c2VyX2lzX3Byb2Nlc3Nfb3duZXIgKGNvbnN0IGNoYXIgKndpbmRvd3Nfc2lkKQoreworICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKiBAfSAqLyAvKiBFbmQgb2YgREJ1c0ludGVybmFsc1V0aWxzIGZ1bmN0aW9ucyAqLworCisvKioKKyAqIEBhZGR0b2dyb3VwIERCdXNTdHJpbmcKKyAqCisgKiBAeworICovCisvKioKKyAqIEdldCB0aGUgZGlyZWN0b3J5IG5hbWUgZnJvbSBhIGNvbXBsZXRlIGZpbGVuYW1lCisgKiBAcGFyYW0gZmlsZW5hbWUgdGhlIGZpbGVuYW1lCisgKiBAcGFyYW0gZGlybmFtZSBzdHJpbmcgdG8gYXBwZW5kIGRpcmVjdG9yeSBuYW1lIHRvCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm8gbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zdHJpbmdfZ2V0X2Rpcm5hbWUgIChjb25zdCBEQnVzU3RyaW5nICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgKmRpcm5hbWUpCit7CisgIGludCBzZXA7CisgIAorICBfZGJ1c19hc3NlcnQgKGZpbGVuYW1lICE9IGRpcm5hbWUpOworICBfZGJ1c19hc3NlcnQgKGZpbGVuYW1lICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKGRpcm5hbWUgIT0gTlVMTCk7CisKKyAgLyogSWdub3JlIGFueSBzZXBhcmF0b3JzIG9uIHRoZSBlbmQgKi8KKyAgc2VwID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGZpbGVuYW1lKTsKKyAgaWYgKHNlcCA9PSAwKQorICAgIHJldHVybiBfZGJ1c19zdHJpbmdfYXBwZW5kIChkaXJuYW1lLCAiLiIpOyAvKiBlbXB0eSBzdHJpbmcgcGFzc2VkIGluICovCisgICAgCisgIHdoaWxlIChzZXAgPiAwICYmIF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoZmlsZW5hbWUsIHNlcCAtIDEpID09ICcvJykKKyAgICAtLXNlcDsKKworICBfZGJ1c19hc3NlcnQgKHNlcCA+PSAwKTsKKyAgCisgIGlmIChzZXAgPT0gMCkKKyAgICByZXR1cm4gX2RidXNfc3RyaW5nX2FwcGVuZCAoZGlybmFtZSwgIi8iKTsKKyAgCisgIC8qIE5vdyBmaW5kIHRoZSBwcmV2aW91cyBzZXBhcmF0b3IgKi8KKyAgX2RidXNfc3RyaW5nX2ZpbmRfYnl0ZV9iYWNrd2FyZCAoZmlsZW5hbWUsIHNlcCwgJy8nLCAmc2VwKTsKKyAgaWYgKHNlcCA8IDApCisgICAgcmV0dXJuIF9kYnVzX3N0cmluZ19hcHBlbmQgKGRpcm5hbWUsICIuIik7CisgIAorICAvKiBza2lwIG11bHRpcGxlIHNlcGFyYXRvcnMgKi8KKyAgd2hpbGUgKHNlcCA+IDAgJiYgX2RidXNfc3RyaW5nX2dldF9ieXRlIChmaWxlbmFtZSwgc2VwIC0gMSkgPT0gJy8nKQorICAgIC0tc2VwOworCisgIF9kYnVzX2Fzc2VydCAoc2VwID49IDApOworICAKKyAgaWYgKHNlcCA9PSAwICYmCisgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKGZpbGVuYW1lLCAwKSA9PSAnLycpCisgICAgcmV0dXJuIF9kYnVzX3N0cmluZ19hcHBlbmQgKGRpcm5hbWUsICIvIik7CisgIGVsc2UKKyAgICByZXR1cm4gX2RidXNfc3RyaW5nX2NvcHlfbGVuIChmaWxlbmFtZSwgMCwgc2VwIC0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJuYW1lLCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoZGlybmFtZSkpOworfQorLyoqIEB9ICovIC8qIERCdXNTdHJpbmcgc3R1ZmYgKi8KKworc3RhdGljIHZvaWQKK3N0cmluZ19zcXVhc2hfbm9ucHJpbnRhYmxlIChEQnVzU3RyaW5nICpzdHIpCit7CisgIHVuc2lnbmVkIGNoYXIgKmJ1ZjsKKyAgaW50IGksIGxlbjsgCisgIAorICBidWYgPSBfZGJ1c19zdHJpbmdfZ2V0X3VkYXRhIChzdHIpOworICBsZW4gPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoc3RyKTsKKyAgCisgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKyAgICB7CisgICAgICB1bnNpZ25lZCBjaGFyIGMgPSAodW5zaWduZWQgY2hhcikgYnVmW2ldOworICAgICAgaWYgKGMgPT0gJ1wwJykKKyAgICAgICAgYnVmW2ldID0gJyAnOworICAgICAgZWxzZSBpZiAoYyA8IDB4MjAgfHwgYyA+IDEyNykKKyAgICAgICAgYnVmW2ldID0gJz8nOworICAgIH0KK30KKworLyoqCisgKiBHZXQgYSBwcmludGFibGUgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGNvbW1hbmQgdXNlZCB0byBleGVjdXRlCisgKiB0aGUgcHJvY2VzcyB3aXRoIHBpZC4gIFRoaXMgc3RyaW5nIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yCisgKiBpbmZvcm1hdGl2ZSBwdXJwb3NlcyBzdWNoIGFzIGxvZ2dpbmc7IGl0IG1heSBub3QgYmUgdHJ1c3RlZC4KKyAqIAorICogVGhlIGNvbW1hbmQgaXMgZ3VhcmFudGVlZCB0byBiZSBwcmludGFibGUgQVNDSUkgYW5kIG5vIGxvbmdlcgorICogdGhhbiBtYXhfbGVuLgorICogCisgKiBAcGFyYW0gcGlkIFByb2Nlc3MgaWQKKyAqIEBwYXJhbSBzdHIgQXBwZW5kIGNvbW1hbmQgdG8gdGhpcyBzdHJpbmcKKyAqIEBwYXJhbSBtYXhfbGVuIE1heGltdW0gbGVuZ3RoIG9mIHJldHVybmVkIGNvbW1hbmQKKyAqIEBwYXJhbSBlcnJvciByZXR1cm4gbG9jYXRpb24gZm9yIGVycm9ycworICogQHJldHVybnMgI0ZBTFNFIG9uIGVycm9yCisgKi8KK2RidXNfYm9vbF90IAorX2RidXNfY29tbWFuZF9mb3JfcGlkICh1bnNpZ25lZCBsb25nICBwaWQsCisgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgbWF4X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAqZXJyb3IpCit7CisgIC8qIFRoaXMgaXMgYWxsIExpbnV4LXNwZWNpZmljIGZvciBub3cgKi8KKyAgREJ1c1N0cmluZyBwYXRoOworICBEQnVzU3RyaW5nIGNtZGxpbmU7CisgIGludCBmZDsKKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZwYXRoKSkgCisgICAgeworICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZjbWRsaW5lKSkKKyAgICB7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnBhdGgpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZF9wcmludGYgKCZwYXRoLCAiL3Byb2MvJWxkL2NtZGxpbmUiLCBwaWQpKQorICAgIGdvdG8gb29tOworICAKKyAgZmQgPSBvcGVuIChfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZwYXRoKSwgT19SRE9OTFkpOworICBpZiAoZmQgPCAwKSAKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gb3BlbiBcIiVzXCI6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZwYXRoKSwKKyAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgIAorICBpZiAoIV9kYnVzX3JlYWQgKGZkLCAmY21kbGluZSwgbWF4X2xlbikpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHJlYWQgZnJvbSBcIiVzXCI6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZwYXRoKSwKKyAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvciAoZXJybm8pKTsgICAgICAKKyAgICAgIF9kYnVzX2Nsb3NlIChmZCwgTlVMTCk7CisgICAgICBnb3RvIGZhaWw7CisgICAgfQorICAKKyAgaWYgKCFfZGJ1c19jbG9zZSAoZmQsIGVycm9yKSkKKyAgICBnb3RvIGZhaWw7CisgIAorICBzdHJpbmdfc3F1YXNoX25vbnByaW50YWJsZSAoJmNtZGxpbmUpOyAgCisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAoJmNtZGxpbmUsIDAsIHN0ciwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHN0cikpKQorICAgIGdvdG8gb29tOworCisgIF9kYnVzX3N0cmluZ19mcmVlICgmY21kbGluZSk7ICAKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwYXRoKTsKKyAgcmV0dXJuIFRSVUU7Citvb206CisgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKK2ZhaWw6CisgIF9kYnVzX3N0cmluZ19mcmVlICgmY21kbGluZSk7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmcGF0aCk7CisgIHJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBSZXBsYWNlIHRoZSBEQlVTX1BSRUZJWCBpbiB0aGUgZ2l2ZW4gcGF0aCwgaW4tcGxhY2UsIGJ5IHRoZQorICogY3VycmVudCBELUJ1cyBpbnN0YWxsYXRpb24gZGlyZWN0b3J5LiBPbiBVbml4IHRoaXMgZnVuY3Rpb24KKyAqIGRvZXMgbm90aGluZywgc3VjY2Vzc2Z1bGx5LgorICoKKyAqIEBwYXJhbSBwYXRoIHBhdGggdG8gZWRpdAorICogQHJldHVybiAjRkFMU0Ugb24gT09NCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19yZXBsYWNlX2luc3RhbGxfcHJlZml4IChEQnVzU3RyaW5nICpwYXRoKQoreworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitlbnN1cmVfb3duZWRfZGlyZWN0b3J5IChjb25zdCBjaGFyICpsYWJlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKnN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90IGNyZWF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAqZXJyb3IpCit7CisgIGNvbnN0IGNoYXIgKmRpciA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoc3RyaW5nKTsKKyAgc3RydWN0IHN0YXQgYnVmOworCisgIGlmIChjcmVhdGUgJiYgIV9kYnVzX2Vuc3VyZV9kaXJlY3RvcnkgKHN0cmluZywgZXJyb3IpKQorICAgIHJldHVybiBGQUxTRTsKKworICAvKgorICAgKiBUaGUgc3RhdCgpLWJhc2VkIGNoZWNrcyBpbiB0aGlzIGZ1bmN0aW9uIGFyZSB0byBwcm90ZWN0IGFnYWluc3QKKyAgICogbWlzdGFrZXMsIG5vdCBtYWxpY2UuIFdlIGFyZSB3b3JraW5nIGluIGEgZGlyZWN0b3J5IHRoYXQgaXMgbWVhbnQKKyAgICogdG8gYmUgdHJ1c3RlZDsgYnV0IGlmIGEgdXNlciBoYXMgdXNlZCBgc3VgIG9yIHNpbWlsYXIgdG8gZXNjYWxhdGUKKyAgICogdGhlaXIgcHJpdmlsZWdlcyB3aXRob3V0IGNvcnJlY3RseSBjbGVhcmluZyB0aGUgZW52aXJvbm1lbnQsIHRoZQorICAgKiBYREdfUlVOVElNRV9ESVIgaW4gdGhlIGVudmlyb25tZW50IG1pZ2h0IHN0aWxsIGJlIHRoZSB1c2VyJ3MKKyAgICogYW5kIG5vdCByb290J3MuIFdlIGRvbid0IHdhbnQgdG8gd3JpdGUgcm9vdC1vd25lZCBmaWxlcyBpbnRvIHRoYXQKKyAgICogZGlyZWN0b3J5LCBzbyBqdXN0IHdhcm4gYW5kIGRvbid0IHByb3ZpZGUgc3VwcG9ydCBmb3IgdHJhbnNpZW50CisgICAqIHNlcnZpY2VzIGluIHRoYXQgY2FzZS4KKyAgICoKKyAgICogSW4gcGFydGljdWxhciwgd2UgdXNlIHN0YXQoKSBhbmQgbm90IGxzdGF0KCkgc28gdGhhdCBpZiB3ZSBsYXRlcgorICAgKiBkZWNpZGUgdG8gdXNlIGEgZGlmZmVyZW50IGRpcmVjdG9yeSBuYW1lIGZvciB0cmFuc2llbnQgc2VydmljZXMsCisgICAqIHdlIGNhbiBkcm9wIGluIGEgY29tcGF0aWJpbGl0eSBzeW1saW5rIHdpdGhvdXQgYnJlYWtpbmcgb2xkZXIKKyAgICogbGliZGJ1cy4KKyAgICovCisKKyAgaWYgKHN0YXQgKGRpciwgJmJ1ZikgIT0gMCkKKyAgICB7CisgICAgICBpbnQgc2F2ZWRfZXJybm8gPSBlcnJubzsKKworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChzYXZlZF9lcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgIiVzIFwiJXNcIiBub3QgYXZhaWxhYmxlOiAlcyIsIGxhYmVsLCBkaXIsCisgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKHNhdmVkX2Vycm5vKSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghU19JU0RJUiAoYnVmLnN0X21vZGUpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsICIlcyBcIiVzXCIgaXMgbm90IGEgZGlyZWN0b3J5IiwKKyAgICAgICAgICAgICAgICAgICAgICBsYWJlbCwgZGlyKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKGJ1Zi5zdF91aWQgIT0gZ2V0ZXVpZCAoKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICIlcyBcIiVzXCIgaXMgb3duZWQgYnkgdWlkICVsZCwgbm90IG91ciB1aWQgJWxkIiwKKyAgICAgICAgICAgICAgICAgICAgICBsYWJlbCwgZGlyLCAobG9uZykgYnVmLnN0X3VpZCwgKGxvbmcpIGdldGV1aWQgKCkpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAvKiBUaGlzIGlzIGp1c3QgYmVjYXVzZSB3ZSBoYXZlIHRoZSBzdGF0KCkgcmVzdWx0cyBhbHJlYWR5LCBzbyB3ZSBtaWdodAorICAgKiBhcyB3ZWxsIGNoZWNrIG9wcG9ydHVuaXN0aWNhbGx5LiAqLworICBpZiAoKFNfSVdPVEggfCBTX0lXR1JQKSAmIGJ1Zi5zdF9tb2RlKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgIiVzIFwiJXNcIiBjYW4gYmUgd3JpdHRlbiBieSBvdGhlcnMgKG1vZGUgMCVvKSIsCisgICAgICAgICAgICAgICAgICAgICAgbGFiZWwsIGRpciwgYnVmLnN0X21vZGUpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworI2RlZmluZSBEQlVTX1VOSVhfU1RBTkRBUkRfU0VTU0lPTl9TRVJWSUNFRElSICIvZGJ1cy0xL3NlcnZpY2VzIgorI2RlZmluZSBEQlVTX1VOSVhfU1RBTkRBUkRfU1lTVEVNX1NFUlZJQ0VESVIgIi9kYnVzLTEvc3lzdGVtLXNlcnZpY2VzIgorCisvKioKKyAqIFJldHVybnMgdGhlIHN0YW5kYXJkIGRpcmVjdG9yaWVzIGZvciBhIHNlc3Npb24gYnVzIHRvIGxvb2sgZm9yCisgKiB0cmFuc2llbnQgc2VydmljZSBhY3RpdmF0aW9uIGZpbGVzLgorICoKKyAqIEBwYXJhbSBkaXJzIHRoZSBkaXJlY3RvcnkgbGlzdCB3ZSBhcmUgcmV0dXJuaW5nCisgKiBAcmV0dXJucyAjRkFMU0Ugb24gZXJyb3IKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3NldF91cF90cmFuc2llbnRfc2Vzc2lvbl9zZXJ2aWNlZGlycyAoREJ1c0xpc3QgICoqZGlycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAqZXJyb3IpCit7CisgIGNvbnN0IGNoYXIgKnhkZ19ydW50aW1lX2RpcjsKKyAgREJ1c1N0cmluZyBzZXJ2aWNlczsKKyAgREJ1c1N0cmluZyBkYnVzMTsKKyAgREJ1c1N0cmluZyB4cmQ7CisgIGRidXNfYm9vbF90IHJldCA9IEZBTFNFOworICBjaGFyICpkYXRhID0gTlVMTDsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZGJ1czEpKQorICAgIHsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnNlcnZpY2VzKSkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmRidXMxKTsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnhyZCkpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZkYnVzMSk7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnNlcnZpY2VzKTsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgeGRnX3J1bnRpbWVfZGlyID0gX2RidXNfZ2V0ZW52ICgiWERHX1JVTlRJTUVfRElSIik7CisKKyAgLyogTm90IGFuIGVycm9yLCB3ZSBqdXN0IGNhbid0IGhhdmUgdHJhbnNpZW50IHNlc3Npb24gc2VydmljZXMgKi8KKyAgaWYgKHhkZ19ydW50aW1lX2RpciA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJYREdfUlVOVElNRV9ESVIgaXMgdW5zZXQ6IHRyYW5zaWVudCBzZXNzaW9uIHNlcnZpY2VzICIKKyAgICAgICAgICAgICAgICAgICAgICJub3QgYXZhaWxhYmxlIGhlcmVcbiIpOworICAgICAgcmV0ID0gVFJVRTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZ4cmQsIHhkZ19ydW50aW1lX2RpcikgfHwKKyAgICAgICFfZGJ1c19zdHJpbmdfYXBwZW5kX3ByaW50ZiAoJmRidXMxLCAiJXMvZGJ1cy0xIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGRnX3J1bnRpbWVfZGlyKSB8fAorICAgICAgIV9kYnVzX3N0cmluZ19hcHBlbmRfcHJpbnRmICgmc2VydmljZXMsICIlcy9kYnVzLTEvc2VydmljZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ZGdfcnVudGltZV9kaXIpKQorICAgIHsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAoIWVuc3VyZV9vd25lZF9kaXJlY3RvcnkgKCJYREdfUlVOVElNRV9ESVIiLCAmeHJkLCBGQUxTRSwgZXJyb3IpIHx8CisgICAgICAhZW5zdXJlX293bmVkX2RpcmVjdG9yeSAoIlhER19SVU5USU1FX0RJUiBzdWJkaXJlY3RvcnkiLCAmZGJ1czEsIFRSVUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpIHx8CisgICAgICAhZW5zdXJlX293bmVkX2RpcmVjdG9yeSAoIlhER19SVU5USU1FX0RJUiBzdWJkaXJlY3RvcnkiLCAmc2VydmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSwgZXJyb3IpKQorICAgIGdvdG8gb3V0OworCisgIGlmICghX2RidXNfc3RyaW5nX3N0ZWFsX2RhdGEgKCZzZXJ2aWNlcywgJmRhdGEpIHx8CisgICAgICAhX2RidXNfbGlzdF9hcHBlbmQgKGRpcnMsIGRhdGEpKQorICAgIHsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBfZGJ1c192ZXJib3NlICgiVHJhbnNpZW50IHNlcnZpY2UgZGlyZWN0b3J5IGlzICVzXG4iLCBkYXRhKTsKKyAgLyogT3duZXJzaGlwIHdhcyB0cmFuc2ZlcnJlZCB0byBAZGlycyAqLworICBkYXRhID0gTlVMTDsKKyAgcmV0ID0gVFJVRTsKKworb3V0OgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJmRidXMxKTsKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZzZXJ2aWNlcyk7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmeHJkKTsKKyAgZGJ1c19mcmVlIChkYXRhKTsKKyAgcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBSZXR1cm5zIHRoZSBzdGFuZGFyZCBkaXJlY3RvcmllcyBmb3IgYSBzZXNzaW9uIGJ1cyB0byBsb29rIGZvciBzZXJ2aWNlCisgKiBhY3RpdmF0aW9uIGZpbGVzCisgKgorICogT24gVU5JWCB0aGlzIHNob3VsZCBiZSB0aGUgc3RhbmRhcmQgeGRnIGZyZWVkZXNrdG9wLm9yZyBkYXRhIGRpcmVjdG9yaWVzOgorICoKKyAqIFhER19EQVRBX0hPTUU9JHtYREdfREFUQV9IT01FLSRIT01FLy5sb2NhbC9zaGFyZX0KKyAqIFhER19EQVRBX0RJUlM9JHtYREdfREFUQV9ESVJTLS91c3IvbG9jYWwvc2hhcmU6L3Vzci9zaGFyZX0KKyAqCisgKiBhbmQKKyAqCisgKiBEQlVTX0RBVEFESVIKKyAqCisgKiBAcGFyYW0gZGlycyB0aGUgZGlyZWN0b3J5IGxpc3Qgd2UgYXJlIHJldHVybmluZworICogQHJldHVybnMgI0ZBTFNFIG9uIE9PTQorICovCisKK2RidXNfYm9vbF90CitfZGJ1c19nZXRfc3RhbmRhcmRfc2Vzc2lvbl9zZXJ2aWNlZGlycyAoREJ1c0xpc3QgKipkaXJzKQoreworICBjb25zdCBjaGFyICp4ZGdfZGF0YV9ob21lOworICBjb25zdCBjaGFyICp4ZGdfZGF0YV9kaXJzOworICBEQnVzU3RyaW5nIHNlcnZpY2VkaXJfcGF0aDsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmc2VydmljZWRpcl9wYXRoKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgeGRnX2RhdGFfaG9tZSA9IF9kYnVzX2dldGVudiAoIlhER19EQVRBX0hPTUUiKTsKKyAgeGRnX2RhdGFfZGlycyA9IF9kYnVzX2dldGVudiAoIlhER19EQVRBX0RJUlMiKTsKKworICBpZiAoeGRnX2RhdGFfaG9tZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnNlcnZpY2VkaXJfcGF0aCwgeGRnX2RhdGFfaG9tZSkpCisgICAgICAgIGdvdG8gb29tOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmhvbWVkaXI7CisgICAgICBEQnVzU3RyaW5nIGxvY2FsX3NoYXJlOworCisgICAgICBpZiAoIV9kYnVzX2hvbWVkaXJfZnJvbV9jdXJyZW50X3Byb2Nlc3MgKCZob21lZGlyKSkKKyAgICAgICAgZ290byBvb207CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnNlcnZpY2VkaXJfcGF0aCwgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChob21lZGlyKSkpCisgICAgICAgIGdvdG8gb29tOworCisgICAgICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJmxvY2FsX3NoYXJlLCAiLy5sb2NhbC9zaGFyZSIpOworICAgICAgaWYgKCFfZGJ1c19jb25jYXRfZGlyX2FuZF9maWxlICgmc2VydmljZWRpcl9wYXRoLCAmbG9jYWxfc2hhcmUpKQorICAgICAgICBnb3RvIG9vbTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmc2VydmljZWRpcl9wYXRoLCAiOiIpKQorICAgIGdvdG8gb29tOworCisgIGlmICh4ZGdfZGF0YV9kaXJzICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmc2VydmljZWRpcl9wYXRoLCB4ZGdfZGF0YV9kaXJzKSkKKyAgICAgICAgZ290byBvb207CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnNlcnZpY2VkaXJfcGF0aCwgIjoiKSkKKyAgICAgICAgZ290byBvb207CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmc2VydmljZWRpcl9wYXRoLCAiL3Vzci9sb2NhbC9zaGFyZTovdXNyL3NoYXJlOiIpKQorICAgICAgICBnb3RvIG9vbTsKKyAgICB9CisKKyAgLyoKKyAgICogYWRkIGNvbmZpZ3VyZWQgZGF0YWRpciB0byBkZWZhdWx0cworICAgKiB0aGlzIG1heSBiZSB0aGUgc2FtZSBhcyBhbiB4ZGcgZGlyCisgICAqIGhvd2V2ZXIgdGhlIGNvbmZpZyBwYXJzZXIgc2hvdWxkIHRha2UKKyAgICogY2FyZSBvZiBkdXBsaWNhdGVzCisgICAqLworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZzZXJ2aWNlZGlyX3BhdGgsIERCVVNfREFUQURJUikpCisgICAgZ290byBvb207CisKKyAgaWYgKCFfZGJ1c19zcGxpdF9wYXRoc19hbmRfYXBwZW5kICgmc2VydmljZWRpcl9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVU5JWF9TVEFOREFSRF9TRVNTSU9OX1NFUlZJQ0VESVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlycykpCisgICAgZ290byBvb207CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZzZXJ2aWNlZGlyX3BhdGgpOworICByZXR1cm4gVFJVRTsKKworIG9vbToKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZzZXJ2aWNlZGlyX3BhdGgpOworICByZXR1cm4gRkFMU0U7Cit9CisKKworLyoqCisgKiBSZXR1cm5zIHRoZSBzdGFuZGFyZCBkaXJlY3RvcmllcyBmb3IgYSBzeXN0ZW0gYnVzIHRvIGxvb2sgZm9yIHNlcnZpY2UKKyAqIGFjdGl2YXRpb24gZmlsZXMKKyAqCisgKiBPbiBVTklYIHRoaXMgc2hvdWxkIGJlIHRoZSBzdGFuZGFyZCB4ZGcgZnJlZWRlc2t0b3Aub3JnIGRhdGEgZGlyZWN0b3JpZXM6CisgKgorICogWERHX0RBVEFfRElSUz0ke1hER19EQVRBX0RJUlMtL3Vzci9sb2NhbC9zaGFyZTovdXNyL3NoYXJlfQorICoKKyAqIGFuZAorICoKKyAqIERCVVNfREFUQURJUgorICoKKyAqIE9uIFdpbmRvd3MgdGhlcmUgaXMgbm8gc3lzdGVtIGJ1cyBhbmQgdGhpcyBmdW5jdGlvbiBjYW4gcmV0dXJuIG5vdGhpbmcuCisgKgorICogQHBhcmFtIGRpcnMgdGhlIGRpcmVjdG9yeSBsaXN0IHdlIGFyZSByZXR1cm5pbmcKKyAqIEByZXR1cm5zICNGQUxTRSBvbiBPT00KKyAqLworCitkYnVzX2Jvb2xfdAorX2RidXNfZ2V0X3N0YW5kYXJkX3N5c3RlbV9zZXJ2aWNlZGlycyAoREJ1c0xpc3QgKipkaXJzKQoreworICAvKgorICAgKiBEQlVTX0RBVEFESVIgbWF5IGJlIHRoZSBzYW1lIGFzIG9uZSBvZiB0aGUgc3RhbmRhcmQgZGlyZWN0b3JpZXMuIEhvd2V2ZXIsCisgICAqIHRoZSBjb25maWcgcGFyc2VyIHNob3VsZCB0YWtlIGNhcmUgb2YgdGhlIGR1cGxpY2F0ZXMuCisgICAqCisgICAqIEFsc28sIGFwcGVuZCAvbGliIGFzIGNvdW50ZXJwYXJ0IG9mIC91c3Ivc2hhcmUgb24gdGhlIHJvb3QKKyAgICogZGlyZWN0b3J5ICh0aGUgcm9vdCBkaXJlY3RvcnkgZG9lcyBub3Qga25vdyAvc2hhcmUpLCBpbiBvcmRlciB0bworICAgKiBmYWNpbGl0YXRlIGVhcmx5IGJvb3Qgc3lzdGVtIGJ1cyBhY3RpdmF0aW9uIHdoZXJlIC91c3IgbWlnaHQgbm90CisgICAqIGJlIGF2YWlsYWJsZS4KKyAgICovCisgIHN0YXRpYyBjb25zdCBjaGFyIHN0YW5kYXJkX3NlYXJjaF9wYXRoW10gPQorICAgICIvdXNyL2xvY2FsL3NoYXJlOiIKKyAgICAiL3Vzci9zaGFyZToiCisgICAgREJVU19EQVRBRElSICI6IgorICAgICIvbGliIjsKKyAgREJ1c1N0cmluZyBzZXJ2aWNlZGlyX3BhdGg7CisKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZzZXJ2aWNlZGlyX3BhdGgsIHN0YW5kYXJkX3NlYXJjaF9wYXRoKTsKKworICByZXR1cm4gX2RidXNfc3BsaXRfcGF0aHNfYW5kX2FwcGVuZCAoJnNlcnZpY2VkaXJfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVU5JWF9TVEFOREFSRF9TWVNURU1fU0VSVklDRURJUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcnMpOworfQorCisvKioKKyAqIEdldCB0aGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgc3lzdGVtLmNvbmYgZmlsZQorICogKHRoZXJlIGlzIG5vIHN5c3RlbSBidXMgb24gV2luZG93cyBzbyB0aGlzIGNhbiBqdXN0CisgKiByZXR1cm4gRkFMU0UgYW5kIHByaW50IGEgd2FybmluZyBvciBzb21ldGhpbmcpCisgKgorICogQHBhcmFtIHN0ciB0aGUgc3RyaW5nIHRvIGFwcGVuZCB0bywgd2hpY2ggbXVzdCBiZSBlbXB0eSBvbiBlbnRyeQorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfZ2V0X3N5c3RlbV9jb25maWdfZmlsZSAoREJ1c1N0cmluZyAqc3RyKQoreworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChzdHIpID09IDApOworCisgIHJldHVybiBfZGJ1c19zdHJpbmdfYXBwZW5kIChzdHIsIERCVVNfU1lTVEVNX0NPTkZJR19GSUxFKTsKK30KKworLyoqCisgKiBHZXQgdGhlIGFic29sdXRlIHBhdGggb2YgdGhlIHNlc3Npb24uY29uZiBmaWxlLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZyB0byBhcHBlbmQgdG8sIHdoaWNoIG11c3QgYmUgZW1wdHkgb24gZW50cnkKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBubyBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2dldF9zZXNzaW9uX2NvbmZpZ19maWxlIChEQnVzU3RyaW5nICpzdHIpCit7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHN0cikgPT0gMCk7CisKKyAgcmV0dXJuIF9kYnVzX3N0cmluZ19hcHBlbmQgKHN0ciwgREJVU19TRVNTSU9OX0NPTkZJR19GSUxFKTsKK30KKworI2lmZGVmIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTCisKKy8qCisgKiBTZXQgdWlkIHRvIGEgbWFjaGluZS1yZWFkYWJsZSBhdXRoZW50aWNhdGlvbiBpZGVudGl0eSAobnVtZXJpYyBVbml4CisgKiB1aWQgb3IgQ29udmVydFNpZFRvU3RyaW5nU2lkLXN0eWxlIFdpbmRvd3MgU0lEKSB0aGF0IGlzIGxpa2VseSB0byBleGlzdCwKKyAqIGFuZCBkaWZmZXJzIGZyb20gdGhlIGlkZW50aXR5IG9mIHRoZSBjdXJyZW50IHByb2Nlc3MuCisgKgorICogQHBhcmFtIHVpZCBQb3B1bGF0ZWQgd2l0aCBhIG1hY2hpbmUtcmVhZGFibGUgYXV0aGVudGljYXRpb24gaWRlbnRpdHkKKyAqICAgIG9uIHN1Y2Nlc3MKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBubyBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3Rlc3RfYXBwZW5kX2RpZmZlcmVudF91aWQgKERCdXNTdHJpbmcgKnVpZCkKK3sKKyAgaWYgKGdldGV1aWQgKCkgPT0gMCkKKyAgICByZXR1cm4gX2RidXNfc3RyaW5nX2FwcGVuZCAodWlkLCAiNjU1MzQiKTsKKyAgZWxzZQorICAgIHJldHVybiBfZGJ1c19zdHJpbmdfYXBwZW5kICh1aWQsICIwIik7Cit9CisKKy8qCisgKiBTZXQgdWlkIHRvIGEgaHVtYW4tcmVhZGFibGUgYXV0aGVudGljYXRpb24gaWRlbnRpdHkgKGxvZ2luIG5hbWUpCisgKiB0aGF0IGlzIGxpa2VseSB0byBleGlzdCwgYW5kIGRpZmZlcnMgZnJvbSB0aGUgaWRlbnRpdHkgb2YgdGhlIGN1cnJlbnQKKyAqIHByb2Nlc3MuIFRoaXMgZnVuY3Rpb24gY3VycmVudGx5IG9ubHkgZXhpc3RzIG9uIFVuaXggcGxhdGZvcm1zLgorICoKKyAqIEBwYXJhbSB1aWQgUG9wdWxhdGVkIHdpdGggYSBtYWNoaW5lLXJlYWRhYmxlIGF1dGhlbnRpY2F0aW9uIGlkZW50aXR5CisgKiAgICBvbiBzdWNjZXNzCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm8gbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c190ZXN0X2FwcGVuZF9kaWZmZXJlbnRfdXNlcm5hbWUgKERCdXNTdHJpbmcgKnVzZXJuYW1lKQoreworICBpZiAoZ2V0ZXVpZCAoKSA9PSAwKQorICAgIHJldHVybiBfZGJ1c19zdHJpbmdfYXBwZW5kICh1c2VybmFtZSwgIm5vYm9keSIpOworICBlbHNlCisgICAgcmV0dXJuIF9kYnVzX3N0cmluZ19hcHBlbmQgKHVzZXJuYW1lLCAicm9vdCIpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1zeXNkZXBzLXV0aWwtd2luLmMgYi9kYnVzL2RidXMtc3lzZGVwcy11dGlsLXdpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjOGZiZWQKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtc3lzZGVwcy11dGlsLXdpbi5jCkBAIC0wLDAgKzEsMTY4MCBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXN5c2RlcHMtdXRpbC5jIFdvdWxkIGJlIGluIGRidXMtc3lzZGVwcy5jLCBidXQgbm90IHVzZWQgaW4gbGliZGJ1cworICogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUgIFJlZCBIYXQsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwMyBDb2RlRmFjdG9yeSBBQgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisKKyNkZWZpbmUgU1RSU0FGRV9OT19ERVBSRUNBVEUKKworI2luY2x1ZGUgImRidXMtc3lzZGVwcy5oIgorI2luY2x1ZGUgImRidXMtaW50ZXJuYWxzLmgiCisjaW5jbHVkZSAiZGJ1cy1wcm90b2NvbC5oIgorI2luY2x1ZGUgImRidXMtc3RyaW5nLmgiCisjaW5jbHVkZSAiZGJ1cy1zeXNkZXBzLmgiCisjaW5jbHVkZSAiZGJ1cy1zeXNkZXBzLXdpbi5oIgorI2luY2x1ZGUgImRidXMtc29ja2V0cy13aW4uaCIKKyNpbmNsdWRlICJkYnVzLW1lbW9yeS5oIgorI2luY2x1ZGUgImRidXMtcGlwZS5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpZiBIQVZFX0VSUk5PX0gKKyNpbmNsdWRlIDxlcnJuby5oPgorI2VuZGlmCisjaW5jbHVkZSA8d2luc29jazIuaD4gICAvLyBXU0EgZXJyb3IgY29kZXMKKworI2lmbmRlZiBEQlVTX1dJTkNFCisjaW5jbHVkZSA8aW8uaD4KKyNpbmNsdWRlIDxsbS5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjZW5kaWYKKworCisvKioKKyAqIERvZXMgdGhlIGNoZGlyLCBmb3JrLCBzZXRzaWQsIGV0Yy4gdG8gYmVjb21lIGEgZGFlbW9uIHByb2Nlc3MuCisgKgorICogQHBhcmFtIHBpZGZpbGUgI05VTEwsIG9yIHBpZGZpbGUgdG8gY3JlYXRlCisgKiBAcGFyYW0gcHJpbnRfcGlkX3BpcGUgZmlsZSBkZXNjcmlwdG9yIHRvIHByaW50IGRhZW1vbidzIHBpZCB0bywgb3IgLTEgZm9yIG5vbmUKKyAqIEBwYXJhbSBlcnJvciByZXR1cm4gbG9jYXRpb24gZm9yIGVycm9ycworICogQHBhcmFtIGtlZXBfdW1hc2sgI1RSVUUgdG8ga2VlcCB0aGUgb3JpZ2luYWwgdW1hc2sKKyAqIEByZXR1cm5zICNGQUxTRSBvbiBmYWlsdXJlCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19iZWNvbWVfZGFlbW9uIChjb25zdCBEQnVzU3RyaW5nICpwaWRmaWxlLAorICAgICAgICAgICAgICAgICAgICAgREJ1c1BpcGUgICAgICAgICAqcHJpbnRfcGlkX3BpcGUsCisgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvciwKKyAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgIGtlZXBfdW1hc2spCit7CisgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT1RfU1VQUE9SVEVELAorICAgICAgICAgICAgICAgICAgIkNhbm5vdCBkYWVtb25pemUgb24gV2luZG93cyIpOworICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKgorICogQ3JlYXRlcyBhIGZpbGUgY29udGFpbmluZyB0aGUgcHJvY2VzcyBJRC4KKyAqCisgKiBAcGFyYW0gZmlsZW5hbWUgdGhlIGZpbGVuYW1lIHRvIHdyaXRlIHRvCisgKiBAcGFyYW0gcGlkIG91ciBwcm9jZXNzIElECisgKiBAcGFyYW0gZXJyb3IgcmV0dXJuIGxvY2F0aW9uIGZvciBlcnJvcnMKKyAqIEByZXR1cm5zICNGQUxTRSBvbiBmYWlsdXJlCisgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAorX2RidXNfd3JpdGVfcGlkX2ZpbGUgKGNvbnN0IERCdXNTdHJpbmcgKmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgICAgIHBpZCwKKyAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgY29uc3QgY2hhciAqY2ZpbGVuYW1lOworICBIQU5ETEUgaG5kOworICBjaGFyIHBpZHN0clsyMF07CisgIGludCB0b3RhbDsKKyAgaW50IGJ5dGVzX3RvX3dyaXRlOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIGNmaWxlbmFtZSA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoZmlsZW5hbWUpOworCisgIGhuZCA9IENyZWF0ZUZpbGVBIChjZmlsZW5hbWUsIEdFTkVSSUNfV1JJVEUsCisgICAgICAgICAgICAgICAgICAgICBGSUxFX1NIQVJFX1JFQUQgfCBGSUxFX1NIQVJFX1dSSVRFLAorICAgICAgICAgICAgICAgICAgICAgTlVMTCwgQ1JFQVRFX05FVywgRklMRV9BVFRSSUJVVEVfTk9STUFMLAorICAgICAgICAgICAgICAgICAgICAgSU5WQUxJRF9IQU5ETEVfVkFMVUUpOworICBpZiAoaG5kID09IElOVkFMSURfSEFORExFX1ZBTFVFKQorICAgIHsKKyAgICAgIGNoYXIgKmVtc2cgPSBfZGJ1c193aW5fZXJyb3Jfc3RyaW5nIChHZXRMYXN0RXJyb3IgKCkpOworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c193aW5fZXJyb3JfZnJvbV9sYXN0X2Vycm9yICgpLAorICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgY3JlYXRlIFBJRCBmaWxlICVzOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgY2ZpbGVuYW1lLCBlbXNnKTsKKyAgICAgIF9kYnVzX3dpbl9mcmVlX2Vycm9yX3N0cmluZyAoZW1zZyk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmIChzbnByaW50ZiAocGlkc3RyLCBzaXplb2YgKHBpZHN0ciksICIlbHVcbiIsIHBpZCkgPCAwKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfZXJyb3JfZnJvbV9zeXN0ZW1fZXJybm8gKCksCisgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBmb3JtYXQgUElEIGZvciBcIiVzXCI6ICVzIiwgY2ZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmVycm9yX2Zyb21fZXJybm8gKCkpOworICAgICAgQ2xvc2VIYW5kbGUgKGhuZCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHRvdGFsID0gMDsKKyAgYnl0ZXNfdG9fd3JpdGUgPSBzdHJsZW4gKHBpZHN0cik7OworCisgIHdoaWxlICh0b3RhbCA8IGJ5dGVzX3RvX3dyaXRlKQorICAgIHsKKyAgICAgIERXT1JEIGJ5dGVzX3dyaXR0ZW47CisgICAgICBCT09MIHJlczsKKworICAgICAgcmVzID0gV3JpdGVGaWxlIChobmQsIHBpZHN0ciArIHRvdGFsLCBieXRlc190b193cml0ZSAtIHRvdGFsLAorICAgICAgICAgICAgICAgICAgICAgICAmYnl0ZXNfd3JpdHRlbiwgTlVMTCk7CisKKyAgICAgIGlmIChyZXMgPT0gMCB8fCBieXRlc193cml0dGVuIDw9IDApCisgICAgICAgIHsKKyAgICAgICAgICBjaGFyICplbXNnID0gX2RidXNfd2luX2Vycm9yX3N0cmluZyAoR2V0TGFzdEVycm9yICgpKTsKKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX3dpbl9lcnJvcl9mcm9tX2xhc3RfZXJyb3IgKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IHdyaXRlIHRvICVzOiAlcyIsIGNmaWxlbmFtZSwgZW1zZyk7CisgICAgICAgICAgX2RidXNfd2luX2ZyZWVfZXJyb3Jfc3RyaW5nIChlbXNnKTsKKyAgICAgICAgICBDbG9zZUhhbmRsZSAoaG5kKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgdG90YWwgKz0gYnl0ZXNfd3JpdHRlbjsKKyAgICB9CisKKyAgaWYgKENsb3NlSGFuZGxlIChobmQpID09IDApCisgICAgeworICAgICAgY2hhciAqZW1zZyA9IF9kYnVzX3dpbl9lcnJvcl9zdHJpbmcgKEdldExhc3RFcnJvciAoKSk7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX3dpbl9lcnJvcl9mcm9tX2xhc3RfZXJyb3IgKCksCisgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgY2xvc2UgZmlsZSAlczogJXMiLAorICAgICAgICAgICAgICAgICAgICAgIGNmaWxlbmFtZSwgZW1zZyk7CisgICAgICBfZGJ1c193aW5fZnJlZV9lcnJvcl9zdHJpbmcgKGVtc2cpOworCisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIFdyaXRlcyB0aGUgZ2l2ZW4gcGlkX3RvX3dyaXRlIHRvIGEgcGlkZmlsZSAoaWYgbm9uLU5VTEwpIGFuZC9vciB0byBhCisgKiBwaXBlIChpZiBub24tTlVMTCkuIERvZXMgbm90aGluZyBpZiBwaWRmaWxlIGFuZCBwcmludF9waWRfcGlwZSBhcmUgYm90aAorICogTlVMTC4KKyAqCisgKiBAcGFyYW0gcGlkZmlsZSB0aGUgZmlsZSB0byB3cml0ZSB0byBvciAjTlVMTAorICogQHBhcmFtIHByaW50X3BpZF9waXBlIHRoZSBwaXBlIHRvIHdyaXRlIHRvIG9yICNOVUxMCisgKiBAcGFyYW0gcGlkX3RvX3dyaXRlIHRoZSBwaWQgdG8gd3JpdGUgb3V0CisgKiBAcGFyYW0gZXJyb3IgZXJyb3Igb24gZmFpbHVyZQorICogQHJldHVybnMgRkFMU0UgaWYgZXJyb3IgaXMgc2V0CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c193cml0ZV9waWRfdG9fZmlsZV9hbmRfcGlwZSAoY29uc3QgREJ1c1N0cmluZyAqcGlkZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzUGlwZSAgICAgICAgICpwcmludF9waWRfcGlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3BpZF90ICAgICAgICBwaWRfdG9fd3JpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCit7CisgIGlmIChwaWRmaWxlKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJ3cml0aW5nIHBpZCBmaWxlICVzXG4iLCBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKHBpZGZpbGUpKTsKKyAgICAgIGlmICghX2RidXNfd3JpdGVfcGlkX2ZpbGUgKHBpZGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdG9fd3JpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgicGlkIGZpbGUgd3JpdGUgZmFpbGVkXG4iKTsKKyAgICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUKGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiTm8gcGlkIGZpbGUgcmVxdWVzdGVkXG4iKTsKKyAgICB9CisKKyAgaWYgKHByaW50X3BpZF9waXBlICE9IE5VTEwgJiYgX2RidXNfcGlwZV9pc192YWxpZCAocHJpbnRfcGlkX3BpcGUpKQorICAgIHsKKyAgICAgIERCdXNTdHJpbmcgcGlkOworICAgICAgaW50IGJ5dGVzOworCisgICAgICBfZGJ1c192ZXJib3NlICgid3JpdGluZyBvdXIgcGlkIHRvIHBpcGUgJWRcbiIsIHByaW50X3BpZF9waXBlLT5mZCk7CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZwaWQpKQorICAgICAgICB7CisgICAgICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmRfaW50ICgmcGlkLCBwaWRfdG9fd3JpdGUpIHx8CisgICAgICAgICAgIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZwaWQsICJcbiIpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwaWQpOworICAgICAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgYnl0ZXMgPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnBpZCk7CisgICAgICBpZiAoX2RidXNfcGlwZV93cml0ZSAocHJpbnRfcGlkX3BpcGUsICZwaWQsIDAsIGJ5dGVzLCBlcnJvcikgIT0gYnl0ZXMpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBfZGJ1c19waXBlX3dyaXRlIHNldHMgZXJyb3Igb25seSBvbiBmYWlsdXJlLCBub3Qgc2hvcnQgd3JpdGUgKi8KKyAgICAgICAgICBpZiAoZXJyb3IgIT0gTlVMTCAmJiAhZGJ1c19lcnJvcl9pc19zZXQoZXJyb3IpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByaW50aW5nIG1lc3NhZ2UgYnVzIFBJRDogZGlkIG5vdCB3cml0ZSBlbm91Z2ggYnl0ZXNcbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmcGlkKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwaWQpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJObyBwaWQgcGlwZSB0byB3cml0ZSB0b1xuIik7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIFZlcmlmeSB0aGF0IGFmdGVyIHRoZSBmb3JrIHdlIGNhbiBzdWNjZXNzZnVsbHkgY2hhbmdlIHRvIHRoaXMgdXNlci4KKyAqCisgKiBAcGFyYW0gdXNlciB0aGUgdXNlcm5hbWUgZ2l2ZW4gaW4gdGhlIGRhZW1vbiBjb25maWd1cmF0aW9uCisgKiBAcmV0dXJucyAjVFJVRSBpZiB1c2VybmFtZSBpcyB2YWxpZAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfdmVyaWZ5X2RhZW1vbl91c2VyIChjb25zdCBjaGFyICp1c2VyKQoreworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBDaGFuZ2VzIHRoZSB1c2VyIGFuZCBncm91cCB0aGUgYnVzIGlzIHJ1bm5pbmcgYXMuCisgKgorICogQHBhcmFtIHVzZXIgdGhlIHVzZXIgdG8gYmVjb21lCisgKiBAcGFyYW0gZXJyb3IgcmV0dXJuIGxvY2F0aW9uIGZvciBlcnJvcnMKKyAqIEByZXR1cm5zICNGQUxTRSBvbiBmYWlsdXJlCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19jaGFuZ2VfdG9fZGFlbW9uX3VzZXIgIChjb25zdCBjaGFyICAgICp1c2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAqZXJyb3IpCit7CisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorZmRfbGltaXRfbm90X3N1cHBvcnRlZCAoREJ1c0Vycm9yICplcnJvcikKK3sKKyAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PVF9TVVBQT1JURUQsCisgICAgICAgICAgICAgICAgICAiY2Fubm90IGNoYW5nZSBmZCBsaW1pdCBvbiB0aGlzIHBsYXRmb3JtIik7Cit9CisKK0RCdXNSTGltaXQgKgorX2RidXNfcmxpbWl0X3NhdmVfZmRfbGltaXQgKERCdXNFcnJvciAqZXJyb3IpCit7CisgIGZkX2xpbWl0X25vdF9zdXBwb3J0ZWQgKGVycm9yKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKK2RidXNfYm9vbF90CitfZGJ1c19ybGltaXRfcmFpc2VfZmRfbGltaXQgKERCdXNFcnJvciAqZXJyb3IpCit7CisgIGZkX2xpbWl0X25vdF9zdXBwb3J0ZWQgKGVycm9yKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCitkYnVzX2Jvb2xfdAorX2RidXNfcmxpbWl0X3Jlc3RvcmVfZmRfbGltaXQgKERCdXNSTGltaXQgKnNhdmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgKmVycm9yKQoreworICBmZF9saW1pdF9ub3Rfc3VwcG9ydGVkIChlcnJvcik7CisgIHJldHVybiBGQUxTRTsKK30KKwordm9pZAorX2RidXNfcmxpbWl0X2ZyZWUgKERCdXNSTGltaXQgKmxpbSkKK3sKKyAgLyogX2RidXNfcmxpbWl0X3NhdmVfZmRfbGltaXQoKSBjYW5ub3QgcmV0dXJuIG5vbi1OVUxMIG9uIFdpbmRvd3MKKyAgICogc28gdGhlcmUgY2Fubm90IGJlIGFueXRoaW5nIHRvIGZyZWUgKi8KKyAgX2RidXNfYXNzZXJ0IChsaW0gPT0gTlVMTCk7Cit9CisKKy8qKgorICogc3RhdCgpIHdyYXBwZXIuCisgKgorICogQHBhcmFtIGZpbGVuYW1lIHRoZSBmaWxlbmFtZSB0byBzdGF0CisgKiBAcGFyYW0gc3RhdGJ1ZiB0aGUgc3RhdCBpbmZvIHRvIGZpbGwgaW4KKyAqIEBwYXJhbSBlcnJvciByZXR1cm4gbG9jYXRpb24gZm9yIGVycm9yCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgZXJyb3Igd2FzIHNldAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RhdChjb25zdCBEQnVzU3RyaW5nICpmaWxlbmFtZSwKKyAgICAgICAgICAgREJ1c1N0YXQgICAgICAgICAqc3RhdGJ1ZiwKKyAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCit7CisgIGNvbnN0IGNoYXIgKmZpbGVuYW1lX2M7CisgIFdJTjMyX0ZJTEVfQVRUUklCVVRFX0RBVEEgd2ZhZDsKKyAgY2hhciAqbGFzdGRvdDsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBmaWxlbmFtZV9jID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChmaWxlbmFtZSk7CisKKyAgaWYgKCFHZXRGaWxlQXR0cmlidXRlc0V4QSAoZmlsZW5hbWVfYywgR2V0RmlsZUV4SW5mb1N0YW5kYXJkLCAmd2ZhZCkpCisgICAgeworICAgICAgX2RidXNfd2luX3NldF9lcnJvcl9mcm9tX3dpbl9lcnJvciAoZXJyb3IsIEdldExhc3RFcnJvciAoKSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICh3ZmFkLmR3RmlsZUF0dHJpYnV0ZXMgJiBGSUxFX0FUVFJJQlVURV9ESVJFQ1RPUlkpCisgICAgc3RhdGJ1Zi0+bW9kZSA9IF9TX0lGRElSOworICBlbHNlCisgICAgc3RhdGJ1Zi0+bW9kZSA9IF9TX0lGUkVHOworCisgIHN0YXRidWYtPm1vZGUgfD0gX1NfSVJFQUQ7CisgIGlmICh3ZmFkLmR3RmlsZUF0dHJpYnV0ZXMgJiBGSUxFX0FUVFJJQlVURV9SRUFET05MWSkKKyAgICBzdGF0YnVmLT5tb2RlIHw9IF9TX0lXUklURTsKKworICBsYXN0ZG90ID0gc3RycmNociAoZmlsZW5hbWVfYywgJy4nKTsKKyAgaWYgKGxhc3Rkb3QgJiYgc3RyaWNtcCAobGFzdGRvdCwgIi5leGUiKSA9PSAwKQorICAgIHN0YXRidWYtPm1vZGUgfD0gX1NfSUVYRUM7CisKKyAgc3RhdGJ1Zi0+bW9kZSB8PSAoc3RhdGJ1Zi0+bW9kZSAmIDA3MDApID4+IDM7CisgIHN0YXRidWYtPm1vZGUgfD0gKHN0YXRidWYtPm1vZGUgJiAwNzAwKSA+PiA2OworCisgIHN0YXRidWYtPm5saW5rID0gMTsKKworI2lmZGVmIEVOQUJMRV9VSURfVE9fU0lECisgIHsKKyAgICBQU0lEIG93bmVyX3NpZCwgZ3JvdXBfc2lkOworICAgIFBTRUNVUklUWV9ERVNDUklQVE9SIHNkOworCisgICAgc2QgPSBOVUxMOworICAgIHJjID0gR2V0TmFtZWRTZWN1cml0eUluZm8gKChjaGFyICopIGZpbGVuYW1lX2MsIFNFX0ZJTEVfT0JKRUNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9XTkVSX1NFQ1VSSVRZX0lORk9STUFUSU9OIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUk9VUF9TRUNVUklUWV9JTkZPUk1BVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3duZXJfc2lkLCAmZ3JvdXBfc2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNkKTsKKyAgICBpZiAocmMgIT0gRVJST1JfU1VDQ0VTUykKKyAgICAgIHsKKyAgICAgICAgX2RidXNfd2luX3NldF9lcnJvcl9mcm9tX3dpbl9lcnJvciAoZXJyb3IsIHJjKTsKKyAgICAgICAgaWYgKHNkICE9IE5VTEwpCisgICAgICAgICAgTG9jYWxGcmVlIChzZCk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgICAKKyAgICAvKiBGSVhNRSAqLworICAgIHN0YXRidWYtPnVpZCA9IF9kYnVzX3dpbl9zaWRfdG9fdWlkX3QgKG93bmVyX3NpZCk7CisgICAgc3RhdGJ1Zi0+Z2lkID0gX2RidXNfd2luX3NpZF90b191aWRfdCAoZ3JvdXBfc2lkKTsKKworICAgIExvY2FsRnJlZSAoc2QpOworICB9CisjZWxzZQorICBzdGF0YnVmLT51aWQgPSBEQlVTX1VJRF9VTlNFVDsKKyAgc3RhdGJ1Zi0+Z2lkID0gREJVU19HSURfVU5TRVQ7CisjZW5kaWYKKworICBzdGF0YnVmLT5zaXplID0gKChkYnVzX2ludDY0X3QpIHdmYWQubkZpbGVTaXplSGlnaCA8PCAzMikgKyB3ZmFkLm5GaWxlU2l6ZUxvdzsKKworICBzdGF0YnVmLT5hdGltZSA9CisgICAgKCgoZGJ1c19pbnQ2NF90KSB3ZmFkLmZ0TGFzdEFjY2Vzc1RpbWUuZHdIaWdoRGF0ZVRpbWUgPDwgMzIpICsKKyAgICAgd2ZhZC5mdExhc3RBY2Nlc3NUaW1lLmR3TG93RGF0ZVRpbWUpIC8gMTAwMDAwMDAgLSBEQlVTX0lOVDY0X0NPTlNUQU5UICgxMTY0NDQ3MzYwMDAwMDAwMDApOworCisgIHN0YXRidWYtPm10aW1lID0KKyAgICAoKChkYnVzX2ludDY0X3QpIHdmYWQuZnRMYXN0V3JpdGVUaW1lLmR3SGlnaERhdGVUaW1lIDw8IDMyKSArCisgICAgIHdmYWQuZnRMYXN0V3JpdGVUaW1lLmR3TG93RGF0ZVRpbWUpIC8gMTAwMDAwMDAgLSBEQlVTX0lOVDY0X0NPTlNUQU5UICgxMTY0NDQ3MzYwMDAwMDAwMDApOworCisgIHN0YXRidWYtPmN0aW1lID0KKyAgICAoKChkYnVzX2ludDY0X3QpIHdmYWQuZnRDcmVhdGlvblRpbWUuZHdIaWdoRGF0ZVRpbWUgPDwgMzIpICsKKyAgICAgd2ZhZC5mdENyZWF0aW9uVGltZS5kd0xvd0RhdGVUaW1lKSAvIDEwMDAwMDAwIC0gREJVU19JTlQ2NF9DT05TVEFOVCAoMTE2NDQ0NzM2MDAwMDAwMDAwKTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBJbnRlcm5hbHMgb2YgZGlyZWN0b3J5IGl0ZXJhdG9yCisgKi8KK3N0cnVjdCBEQnVzRGlySXRlcgorICB7CisgICAgSEFORExFIGhhbmRsZTsKKyAgICBXSU4zMl9GSU5EX0RBVEFBIGZpbGVpbmZvOyAgLyogZnJvbSBGaW5kRmlyc3QvRmluZE5leHQgKi8KKyAgICBkYnVzX2Jvb2xfdCBmaW5pc2hlZDsgICAgICAgLyogdHJ1ZSBpZiB0aGVyZSBhcmUgbm8gbW9yZSBlbnRyaWVzICovCisgICAgaW50IG9mZnNldDsKKyAgfTsKKworLyoqCisgKiBPcGVuIGEgZGlyZWN0b3J5IHRvIGl0ZXJhdGUgb3Zlci4KKyAqCisgKiBAcGFyYW0gZmlsZW5hbWUgdGhlIGRpcmVjdG9yeSBuYW1lCisgKiBAcGFyYW0gZXJyb3IgZXhjZXB0aW9uIHJldHVybiBvYmplY3Qgb3IgI05VTEwKKyAqIEByZXR1cm5zIG5ldyBpdGVyYXRvciwgb3IgI05VTEwgb24gZXJyb3IKKyAqLworREJ1c0Rpckl0ZXIqCitfZGJ1c19kaXJlY3Rvcnlfb3BlbiAoY29uc3QgREJ1c1N0cmluZyAqZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCit7CisgIERCdXNEaXJJdGVyICppdGVyOworICBEQnVzU3RyaW5nIGZpbGVzcGVjOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXRfZnJvbV9zdHJpbmcgKCZmaWxlc3BlYywgZmlsZW5hbWUpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksCisgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGRpcmVjdG9yeSBmaWxlbmFtZSBjb3B5Iik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgaWYgKF9kYnVzX3N0cmluZ19lbmRzX3dpdGhfY19zdHIgKCZmaWxlc3BlYywgIi8iKSB8fCBfZGJ1c19zdHJpbmdfZW5kc193aXRoX2Nfc3RyICgmZmlsZXNwZWMsICJcXCIpICkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZmaWxlc3BlYywgIioiKSkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgYXBwZW5kIGZpbGVuYW1lIHdpbGRjYXJkIik7CisgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UgaWYgKCFfZGJ1c19zdHJpbmdfZW5kc193aXRoX2Nfc3RyICgmZmlsZXNwZWMsICIqIikpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmZmlsZXNwZWMsICJcXCoiKSkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgYXBwZW5kIGZpbGVuYW1lIHdpbGRjYXJkIDIiKTsKKyAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICBpdGVyID0gZGJ1c19uZXcwIChEQnVzRGlySXRlciwgMSk7CisgIGlmIChpdGVyID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmaWxlc3BlYyk7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLAorICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBkaXJlY3RvcnkgaXRlcmF0b3IiKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBpdGVyLT5maW5pc2hlZCA9IEZBTFNFOworICBpdGVyLT5vZmZzZXQgPSAwOworICBpdGVyLT5oYW5kbGUgPSBGaW5kRmlyc3RGaWxlQSAoX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmZmlsZXNwZWMpLCAmKGl0ZXItPmZpbGVpbmZvKSk7CisgIGlmIChpdGVyLT5oYW5kbGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpCisgICAgeworICAgICAgaWYgKEdldExhc3RFcnJvciAoKSA9PSBFUlJPUl9OT19NT1JFX0ZJTEVTKQorICAgICAgICBpdGVyLT5maW5pc2hlZCA9IFRSVUU7CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBjaGFyICplbXNnID0gX2RidXNfd2luX2Vycm9yX3N0cmluZyAoR2V0TGFzdEVycm9yICgpKTsKKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX3dpbl9lcnJvcl9mcm9tX2xhc3RfZXJyb3IgKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gcmVhZCBkaXJlY3RvcnkgXCIlc1wiOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoZmlsZW5hbWUpLCBlbXNnKTsKKyAgICAgICAgICBfZGJ1c193aW5fZnJlZV9lcnJvcl9zdHJpbmcgKGVtc2cpOworICAgICAgICAgIGRidXNfZnJlZSAoIGl0ZXIgKTsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmZpbGVzcGVjKTsKKyAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmaWxlc3BlYyk7CisgIHJldHVybiBpdGVyOworfQorCisvKioKKyAqIEdldCBuZXh0IGZpbGUgaW4gdGhlIGRpcmVjdG9yeS4gV2lsbCBub3QgcmV0dXJuICIuIiBvciAiLi4iICBvbgorICogVU5JWC4gSWYgYW4gZXJyb3Igb2NjdXJzLCB0aGUgY29udGVudHMgb2YgImZpbGVuYW1lIiBhcmUKKyAqIHVuZGVmaW5lZC4gVGhlIGVycm9yIGlzIG5ldmVyIHNldCBpZiB0aGUgZnVuY3Rpb24gc3VjY2VlZHMuCisgKgorICogQHBhcmFtIGl0ZXIgdGhlIGl0ZXJhdG9yCisgKiBAcGFyYW0gZmlsZW5hbWUgc3RyaW5nIHRvIGJlIHNldCB0byB0aGUgbmV4dCBmaWxlIGluIHRoZSBkaXIKKyAqIEBwYXJhbSBlcnJvciByZXR1cm4gbG9jYXRpb24gZm9yIGVycm9yCisgKiBAcmV0dXJucyAjVFJVRSBpZiBmaWxlbmFtZSB3YXMgZmlsbGVkIGluIHdpdGggYSBuZXcgZmlsZW5hbWUKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2RpcmVjdG9yeV9nZXRfbmV4dF9maWxlIChEQnVzRGlySXRlciAgICAgICppdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgKmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICBpbnQgc2F2ZWRfZXJyID0gR2V0TGFzdEVycm9yKCk7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKK2FnYWluOgorICBTZXRMYXN0RXJyb3IgKDApOworCisgIGlmICghaXRlciB8fCBpdGVyLT5maW5pc2hlZCkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoaXRlci0+b2Zmc2V0ID4gMCkKKyAgICB7CisgICAgICBpZiAoRmluZE5leHRGaWxlQSAoaXRlci0+aGFuZGxlLCAmKGl0ZXItPmZpbGVpbmZvKSkgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIGlmIChHZXRMYXN0RXJyb3IoKSA9PSBFUlJPUl9OT19NT1JFX0ZJTEVTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBTZXRMYXN0RXJyb3Ioc2F2ZWRfZXJyKTsKKyAgICAgICAgICAgICAgaXRlci0+ZmluaXNoZWQgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgY2hhciAqZW1zZyA9IF9kYnVzX3dpbl9lcnJvcl9zdHJpbmcgKEdldExhc3RFcnJvciAoKSk7CisgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfd2luX2Vycm9yX2Zyb21fbGFzdF9lcnJvciAoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBnZXQgbmV4dCBpbiBkaXJlY3Rvcnk6ICVzIiwgZW1zZyk7CisgICAgICAgICAgICAgIF9kYnVzX3dpbl9mcmVlX2Vycm9yX3N0cmluZyAoZW1zZyk7CisgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICBpdGVyLT5vZmZzZXQrKzsKKworICBpZiAoaXRlci0+ZmluaXNoZWQpCisgICAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKGl0ZXItPmZpbGVpbmZvLmNGaWxlTmFtZVswXSA9PSAnLicgJiYKKyAgICAgKGl0ZXItPmZpbGVpbmZvLmNGaWxlTmFtZVsxXSA9PSAnXDAnIHx8CisgICAgICAgIChpdGVyLT5maWxlaW5mby5jRmlsZU5hbWVbMV0gPT0gJy4nICYmIGl0ZXItPmZpbGVpbmZvLmNGaWxlTmFtZVsyXSA9PSAnXDAnKSkpCisgICAgICBnb3RvIGFnYWluOworCisgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoIChmaWxlbmFtZSwgMCk7CisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoZmlsZW5hbWUsIGl0ZXItPmZpbGVpbmZvLmNGaWxlTmFtZSkpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwKKyAgICAgICAgICAgICAgICAgICAgICAiTm8gbWVtb3J5IHRvIHJlYWQgZGlyZWN0b3J5IGVudHJ5Iik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIENsb3NlcyBhIGRpcmVjdG9yeSBpdGVyYXRpb24uCisgKi8KK3ZvaWQKK19kYnVzX2RpcmVjdG9yeV9jbG9zZSAoREJ1c0Rpckl0ZXIgKml0ZXIpCit7CisgIGlmICghaXRlcikKKyAgICAgIHJldHVybjsKKyAgRmluZENsb3NlKGl0ZXItPmhhbmRsZSk7CisgIGRidXNfZnJlZSAoaXRlcik7Cit9CisKKy8qKiBAfSAqLyAvKiBFbmQgb2YgREJ1c0ludGVybmFsc1V0aWxzIGZ1bmN0aW9ucyAqLworCisvKioKKyAqIEBhZGR0b2dyb3VwIERCdXNTdHJpbmcKKyAqCisgKiBAeworICovCisvKioKKyAqIEdldCB0aGUgZGlyZWN0b3J5IG5hbWUgZnJvbSBhIGNvbXBsZXRlIGZpbGVuYW1lCisgKiBAcGFyYW0gZmlsZW5hbWUgdGhlIGZpbGVuYW1lCisgKiBAcGFyYW0gZGlybmFtZSBzdHJpbmcgdG8gYXBwZW5kIGRpcmVjdG9yeSBuYW1lIHRvCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm8gbWVtb3J5CisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zdHJpbmdfZ2V0X2Rpcm5hbWUoY29uc3QgREJ1c1N0cmluZyAqZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAqZGlybmFtZSkKK3sKKyAgaW50IHNlcDsKKworICBfZGJ1c19hc3NlcnQgKGZpbGVuYW1lICE9IGRpcm5hbWUpOworICBfZGJ1c19hc3NlcnQgKGZpbGVuYW1lICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKGRpcm5hbWUgIT0gTlVMTCk7CisKKyAgLyogSWdub3JlIGFueSBzZXBhcmF0b3JzIG9uIHRoZSBlbmQgKi8KKyAgc2VwID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGZpbGVuYW1lKTsKKyAgaWYgKHNlcCA9PSAwKQorICAgIHJldHVybiBfZGJ1c19zdHJpbmdfYXBwZW5kIChkaXJuYW1lLCAiLiIpOyAvKiBlbXB0eSBzdHJpbmcgcGFzc2VkIGluICovCisKKyAgd2hpbGUgKHNlcCA+IDAgJiYKKyAgICAgICAgIChfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKGZpbGVuYW1lLCBzZXAgLSAxKSA9PSAnLycgfHwKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKGZpbGVuYW1lLCBzZXAgLSAxKSA9PSAnXFwnKSkKKyAgICAtLXNlcDsKKworICBfZGJ1c19hc3NlcnQgKHNlcCA+PSAwKTsKKworICBpZiAoc2VwID09IDAgfHwKKyAgICAgIChzZXAgPT0gMiAmJgorICAgICAgIF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoZmlsZW5hbWUsIDEpID09ICc6JyAmJgorICAgICAgIGlzYWxwaGEgKF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoZmlsZW5hbWUsIDApKSkpCisgICAgcmV0dXJuIF9kYnVzX3N0cmluZ19jb3B5X2xlbiAoZmlsZW5hbWUsIDAsIHNlcCArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlybmFtZSwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGRpcm5hbWUpKTsKKworICB7CisgICAgaW50IHNlcDEsIHNlcDI7CisgICAgX2RidXNfc3RyaW5nX2ZpbmRfYnl0ZV9iYWNrd2FyZCAoZmlsZW5hbWUsIHNlcCwgJy8nLCAmc2VwMSk7CisgICAgX2RidXNfc3RyaW5nX2ZpbmRfYnl0ZV9iYWNrd2FyZCAoZmlsZW5hbWUsIHNlcCwgJ1xcJywgJnNlcDIpOworCisgICAgc2VwID0gTUFYIChzZXAxLCBzZXAyKTsKKyAgfQorICBpZiAoc2VwIDwgMCkKKyAgICByZXR1cm4gX2RidXNfc3RyaW5nX2FwcGVuZCAoZGlybmFtZSwgIi4iKTsKKworICB3aGlsZSAoc2VwID4gMCAmJgorICAgICAgICAgKF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoZmlsZW5hbWUsIHNlcCAtIDEpID09ICcvJyB8fAorICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoZmlsZW5hbWUsIHNlcCAtIDEpID09ICdcXCcpKQorICAgIC0tc2VwOworCisgIF9kYnVzX2Fzc2VydCAoc2VwID49IDApOworCisgIGlmICgoc2VwID09IDAgfHwKKyAgICAgICAoc2VwID09IDIgJiYKKyAgICAgICAgX2RidXNfc3RyaW5nX2dldF9ieXRlIChmaWxlbmFtZSwgMSkgPT0gJzonICYmCisgICAgICAgIGlzYWxwaGEgKF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoZmlsZW5hbWUsIDApKSkpCisgICAgICAmJgorICAgICAgKF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAoZmlsZW5hbWUsIHNlcCkgPT0gJy8nIHx8CisgICAgICAgX2RidXNfc3RyaW5nX2dldF9ieXRlIChmaWxlbmFtZSwgc2VwKSA9PSAnXFwnKSkKKyAgICByZXR1cm4gX2RidXNfc3RyaW5nX2NvcHlfbGVuIChmaWxlbmFtZSwgMCwgc2VwICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJuYW1lLCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoZGlybmFtZSkpOworICBlbHNlCisgICAgcmV0dXJuIF9kYnVzX3N0cmluZ19jb3B5X2xlbiAoZmlsZW5hbWUsIDAsIHNlcCAtIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlybmFtZSwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGRpcm5hbWUpKTsKK30KKworCisvKioKKyAqIENoZWNrcyB0byBzZWUgaWYgdGhlIFVOSVggdXNlciBJRCBtYXRjaGVzIHRoZSBVSUQgb2YKKyAqIHRoZSBwcm9jZXNzLiBTaG91bGQgYWx3YXlzIHJldHVybiAjRkFMU0Ugb24gV2luZG93cy4KKyAqCisgKiBAcGFyYW0gdWlkIHRoZSBVTklYIHVzZXIgSUQKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoaXMgdWlkIG93bnMgdGhlIHByb2Nlc3MuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c191bml4X3VzZXJfaXNfcHJvY2Vzc19vd25lciAoZGJ1c191aWRfdCB1aWQpCit7CisgIHJldHVybiBGQUxTRTsKK30KKworZGJ1c19ib29sX3QgX2RidXNfd2luZG93c191c2VyX2lzX3Byb2Nlc3Nfb3duZXIgKGNvbnN0IGNoYXIgKndpbmRvd3Nfc2lkKQoreworICByZXR1cm4gVFJVRTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgdW5peCBlbXVsYXRpb24gZnVuY3Rpb25zIC0gc2hvdWxkIGJlIHJlbW92ZWQgc29tZXRpbWUgaW4gdGhlIGZ1dHVyZQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKgorICogQ2hlY2tzIHRvIHNlZSBpZiB0aGUgVU5JWCB1c2VyIElEIGlzIGF0IHRoZSBjb25zb2xlLgorICogU2hvdWxkIGFsd2F5cyBmYWlsIG9uIFdpbmRvd3MgKHNldCB0aGUgZXJyb3IgdG8KKyAqICNEQlVTX0VSUk9SX05PVF9TVVBQT1JURUQpLgorICoKKyAqIEBwYXJhbSB1aWQgVUlEIG9mIHBlcnNvbiB0byBjaGVjayAKKyAqIEBwYXJhbSBlcnJvciByZXR1cm4gbG9jYXRpb24gZm9yIGVycm9ycworICogQHJldHVybnMgI1RSVUUgaWYgdGhlIFVJRCBpcyB0aGUgc2FtZSBhcyB0aGUgY29uc29sZSB1c2VyIGFuZCB0aGVyZSBhcmUgbm8gZXJyb3JzCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c191bml4X3VzZXJfaXNfYXRfY29uc29sZSAoZGJ1c191aWRfdCAgICAgICAgIHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAqZXJyb3IpCit7CisgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT1RfU1VQUE9SVEVELAorICAgICAgICAgICAgICAgICAgIlVOSVggdXNlciBJRHMgbm90IHN1cHBvcnRlZCBvbiBXaW5kb3dzXG4iKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCisKKy8qKgorICogUGFyc2UgYSBVTklYIGdyb3VwIGZyb20gdGhlIGJ1cyBjb25maWcgZmlsZS4gT24gV2luZG93cywgdGhpcyBzaG91bGQKKyAqIHNpbXBseSBhbHdheXMgZmFpbCAoanVzdCByZXR1cm4gI0ZBTFNFKS4KKyAqCisgKiBAcGFyYW0gZ3JvdXBuYW1lIHRoZSBncm91cG5hbWUgdGV4dAorICogQHBhcmFtIGdpZF9wIHBsYWNlIHRvIHJldHVybiB0aGUgZ2lkCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19wYXJzZV91bml4X2dyb3VwX2Zyb21fY29uZmlnIChjb25zdCBEQnVzU3RyaW5nICAqZ3JvdXBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19naWRfdCAgICAgICAgKmdpZF9wKQoreworICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKgorICogUGFyc2UgYSBVTklYIHVzZXIgZnJvbSB0aGUgYnVzIGNvbmZpZyBmaWxlLiBPbiBXaW5kb3dzLCB0aGlzIHNob3VsZAorICogc2ltcGx5IGFsd2F5cyBmYWlsIChqdXN0IHJldHVybiAjRkFMU0UpLgorICoKKyAqIEBwYXJhbSB1c2VybmFtZSB0aGUgdXNlcm5hbWUgdGV4dAorICogQHBhcmFtIHVpZF9wIHBsYWNlIHRvIHJldHVybiB0aGUgdWlkCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19wYXJzZV91bml4X3VzZXJfZnJvbV9jb25maWcgKGNvbnN0IERCdXNTdHJpbmcgICp1c2VybmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aWRfdCAgICAgICAgKnVpZF9wKQoreworICByZXR1cm4gRkFMU0U7Cit9CisKKworLyoqCisgKiBHZXRzIGFsbCBncm91cHMgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gVU5JWCB1c2VyIElELiBPbiBVTklYLAorICoganVzdCBjYWxscyBfZGJ1c19ncm91cHNfZnJvbV91aWQoKS4gT24gV2luZG93cywgc2hvdWxkIGFsd2F5cworICogZmFpbCBzaW5jZSB3ZSBkb24ndCBrbm93IGFueSBVTklYIGdyb3Vwcy4KKyAqCisgKiBAcGFyYW0gdWlkIHRoZSBVSUQKKyAqIEBwYXJhbSBncm91cF9pZHMgcmV0dXJuIGxvY2F0aW9uIGZvciBhcnJheSBvZiBncm91cCBJRHMKKyAqIEBwYXJhbSBuX2dyb3VwX2lkcyByZXR1cm4gbG9jYXRpb24gZm9yIGxlbmd0aCBvZiByZXR1cm5lZCBhcnJheQorICogQHJldHVybnMgI1RSVUUgaWYgdGhlIFVJRCBleGlzdGVkIGFuZCB3ZSBnb3Qgc29tZSBjcmVkZW50aWFscworICovCitkYnVzX2Jvb2xfdAorX2RidXNfdW5peF9ncm91cHNfZnJvbV91aWQgKGRidXNfdWlkX3QgICAgICAgICAgICB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19naWRfdCAgICAgICAgICAqKmdyb3VwX2lkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAqbl9ncm91cF9pZHMpCit7CisgIHJldHVybiBGQUxTRTsKK30KKworCisKKy8qKiBAfSAqLyAvKiBEQnVzU3RyaW5nIHN0dWZmICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAKKyBlcnJvciBoYW5kbGluZworIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisKKworCisvKiBsYW4gbWFuYWdlciBlcnJvciBjb2RlcyAqLworY29uc3QgY2hhcioKK19kYnVzX2xtX3N0cmVycm9yKGludCBlcnJvcl9udW1iZXIpCit7CisjaWZkZWYgREJVU19XSU5DRQorICAvLyBUT0RPCisgIHJldHVybiAidW5rbm93biI7CisjZWxzZQorICBjb25zdCBjaGFyICptc2c7CisgIHN3aXRjaCAoZXJyb3JfbnVtYmVyKQorICAgIHsKKyAgICBjYXNlIE5FUlJfTmV0Tm90U3RhcnRlZDoKKyAgICAgIHJldHVybiAiVGhlIHdvcmtzdGF0aW9uIGRyaXZlciBpcyBub3QgaW5zdGFsbGVkLiI7CisgICAgY2FzZSBORVJSX1Vua25vd25TZXJ2ZXI6CisgICAgICByZXR1cm4gIlRoZSBzZXJ2ZXIgY291bGQgbm90IGJlIGxvY2F0ZWQuIjsKKyAgICBjYXNlIE5FUlJfU2hhcmVNZW06CisgICAgICByZXR1cm4gIkFuIGludGVybmFsIGVycm9yIG9jY3VycmVkLiBUaGUgbmV0d29yayBjYW5ub3QgYWNjZXNzIGEgc2hhcmVkIG1lbW9yeSBzZWdtZW50LiI7CisgICAgY2FzZSBORVJSX05vTmV0d29ya1Jlc291cmNlOgorICAgICAgcmV0dXJuICJBIG5ldHdvcmsgcmVzb3VyY2Ugc2hvcnRhZ2Ugb2NjdXJyZWQuIjsKKyAgICBjYXNlIE5FUlJfUmVtb3RlT25seToKKyAgICAgIHJldHVybiAiVGhpcyBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBvbiB3b3Jrc3RhdGlvbnMuIjsKKyAgICBjYXNlIE5FUlJfRGV2Tm90UmVkaXJlY3RlZDoKKyAgICAgIHJldHVybiAiVGhlIGRldmljZSBpcyBub3QgY29ubmVjdGVkLiI7CisgICAgY2FzZSBORVJSX1NlcnZlck5vdFN0YXJ0ZWQ6CisgICAgICByZXR1cm4gIlRoZSBTZXJ2ZXIgc2VydmljZSBpcyBub3Qgc3RhcnRlZC4iOworICAgIGNhc2UgTkVSUl9JdGVtTm90Rm91bmQ6CisgICAgICByZXR1cm4gIlRoZSBxdWV1ZSBpcyBlbXB0eS4iOworICAgIGNhc2UgTkVSUl9Vbmtub3duRGV2RGlyOgorICAgICAgcmV0dXJuICJUaGUgZGV2aWNlIG9yIGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdC4iOworICAgIGNhc2UgTkVSUl9SZWRpcmVjdGVkUGF0aDoKKyAgICAgIHJldHVybiAiVGhlIG9wZXJhdGlvbiBpcyBpbnZhbGlkIG9uIGEgcmVkaXJlY3RlZCByZXNvdXJjZS4iOworICAgIGNhc2UgTkVSUl9EdXBsaWNhdGVTaGFyZToKKyAgICAgIHJldHVybiAiVGhlIG5hbWUgaGFzIGFscmVhZHkgYmVlbiBzaGFyZWQuIjsKKyAgICBjYXNlIE5FUlJfTm9Sb29tOgorICAgICAgcmV0dXJuICJUaGUgc2VydmVyIGlzIGN1cnJlbnRseSBvdXQgb2YgdGhlIHJlcXVlc3RlZCByZXNvdXJjZS4iOworICAgIGNhc2UgTkVSUl9Ub29NYW55SXRlbXM6CisgICAgICByZXR1cm4gIlJlcXVlc3RlZCBhZGRpdGlvbiBvZiBpdGVtcyBleGNlZWRzIHRoZSBtYXhpbXVtIGFsbG93ZWQuIjsKKyAgICBjYXNlIE5FUlJfSW52YWxpZE1heFVzZXJzOgorICAgICAgcmV0dXJuICJUaGUgUGVlciBzZXJ2aWNlIHN1cHBvcnRzIG9ubHkgdHdvIHNpbXVsdGFuZW91cyB1c2Vycy4iOworICAgIGNhc2UgTkVSUl9CdWZUb29TbWFsbDoKKyAgICAgIHJldHVybiAiVGhlIEFQSSByZXR1cm4gYnVmZmVyIGlzIHRvbyBzbWFsbC4iOworICAgIGNhc2UgTkVSUl9SZW1vdGVFcnI6CisgICAgICByZXR1cm4gIkEgcmVtb3RlIEFQSSBlcnJvciBvY2N1cnJlZC4iOworICAgIGNhc2UgTkVSUl9MYW5tYW5JbmlFcnJvcjoKKyAgICAgIHJldHVybiAiQW4gZXJyb3Igb2NjdXJyZWQgd2hlbiBvcGVuaW5nIG9yIHJlYWRpbmcgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS4iOworICAgIGNhc2UgTkVSUl9OZXR3b3JrRXJyb3I6CisgICAgICByZXR1cm4gIkEgZ2VuZXJhbCBuZXR3b3JrIGVycm9yIG9jY3VycmVkLiI7CisgICAgY2FzZSBORVJSX1drc3RhSW5jb25zaXN0ZW50U3RhdGU6CisgICAgICByZXR1cm4gIlRoZSBXb3Jrc3RhdGlvbiBzZXJ2aWNlIGlzIGluIGFuIGluY29uc2lzdGVudCBzdGF0ZS4gUmVzdGFydCB0aGUgY29tcHV0ZXIgYmVmb3JlIHJlc3RhcnRpbmcgdGhlIFdvcmtzdGF0aW9uIHNlcnZpY2UuIjsKKyAgICBjYXNlIE5FUlJfV2tzdGFOb3RTdGFydGVkOgorICAgICAgcmV0dXJuICJUaGUgV29ya3N0YXRpb24gc2VydmljZSBoYXMgbm90IGJlZW4gc3RhcnRlZC4iOworICAgIGNhc2UgTkVSUl9Ccm93c2VyTm90U3RhcnRlZDoKKyAgICAgIHJldHVybiAiVGhlIHJlcXVlc3RlZCBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlLiI7CisgICAgY2FzZSBORVJSX0ludGVybmFsRXJyb3I6CisgICAgICByZXR1cm4gIkFuIGludGVybmFsIGVycm9yIG9jY3VycmVkLiI7CisgICAgY2FzZSBORVJSX0JhZFRyYW5zYWN0Q29uZmlnOgorICAgICAgcmV0dXJuICJUaGUgc2VydmVyIGlzIG5vdCBjb25maWd1cmVkIGZvciB0cmFuc2FjdGlvbnMuIjsKKyAgICBjYXNlIE5FUlJfSW52YWxpZEFQSToKKyAgICAgIHJldHVybiAiVGhlIHJlcXVlc3RlZCBBUEkgaXMgbm90IHN1cHBvcnRlZCBvbiB0aGUgcmVtb3RlIHNlcnZlci4iOworICAgIGNhc2UgTkVSUl9CYWRFdmVudE5hbWU6CisgICAgICByZXR1cm4gIlRoZSBldmVudCBuYW1lIGlzIGludmFsaWQuIjsKKyAgICBjYXNlIE5FUlJfRHVwTmFtZVJlYm9vdDoKKyAgICAgIHJldHVybiAiVGhlIGNvbXB1dGVyIG5hbWUgYWxyZWFkeSBleGlzdHMgb24gdGhlIG5ldHdvcmsuIENoYW5nZSBpdCBhbmQgcmVzdGFydCB0aGUgY29tcHV0ZXIuIjsKKyAgICBjYXNlIE5FUlJfQ2ZnQ29tcE5vdEZvdW5kOgorICAgICAgcmV0dXJuICJUaGUgc3BlY2lmaWVkIGNvbXBvbmVudCBjb3VsZCBub3QgYmUgZm91bmQgaW4gdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uIjsKKyAgICBjYXNlIE5FUlJfQ2ZnUGFyYW1Ob3RGb3VuZDoKKyAgICAgIHJldHVybiAiVGhlIHNwZWNpZmllZCBwYXJhbWV0ZXIgY291bGQgbm90IGJlIGZvdW5kIGluIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLiI7CisgICAgY2FzZSBORVJSX0xpbmVUb29Mb25nOgorICAgICAgcmV0dXJuICJBIGxpbmUgaW4gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBpcyB0b28gbG9uZy4iOworICAgIGNhc2UgTkVSUl9RTm90Rm91bmQ6CisgICAgICByZXR1cm4gIlRoZSBwcmludGVyIGRvZXMgbm90IGV4aXN0LiI7CisgICAgY2FzZSBORVJSX0pvYk5vdEZvdW5kOgorICAgICAgcmV0dXJuICJUaGUgcHJpbnQgam9iIGRvZXMgbm90IGV4aXN0LiI7CisgICAgY2FzZSBORVJSX0Rlc3ROb3RGb3VuZDoKKyAgICAgIHJldHVybiAiVGhlIHByaW50ZXIgZGVzdGluYXRpb24gY2Fubm90IGJlIGZvdW5kLiI7CisgICAgY2FzZSBORVJSX0Rlc3RFeGlzdHM6CisgICAgICByZXR1cm4gIlRoZSBwcmludGVyIGRlc3RpbmF0aW9uIGFscmVhZHkgZXhpc3RzLiI7CisgICAgY2FzZSBORVJSX1FFeGlzdHM6CisgICAgICByZXR1cm4gIlRoZSBwcmludGVyIHF1ZXVlIGFscmVhZHkgZXhpc3RzLiI7CisgICAgY2FzZSBORVJSX1FOb1Jvb206CisgICAgICByZXR1cm4gIk5vIG1vcmUgcHJpbnRlcnMgY2FuIGJlIGFkZGVkLiI7CisgICAgY2FzZSBORVJSX0pvYk5vUm9vbToKKyAgICAgIHJldHVybiAiTm8gbW9yZSBwcmludCBqb2JzIGNhbiBiZSBhZGRlZC4iOworICAgIGNhc2UgTkVSUl9EZXN0Tm9Sb29tOgorICAgICAgcmV0dXJuICJObyBtb3JlIHByaW50ZXIgZGVzdGluYXRpb25zIGNhbiBiZSBhZGRlZC4iOworICAgIGNhc2UgTkVSUl9EZXN0SWRsZToKKyAgICAgIHJldHVybiAiVGhpcyBwcmludGVyIGRlc3RpbmF0aW9uIGlzIGlkbGUgYW5kIGNhbm5vdCBhY2NlcHQgY29udHJvbCBvcGVyYXRpb25zLiI7CisgICAgY2FzZSBORVJSX0Rlc3RJbnZhbGlkT3A6CisgICAgICByZXR1cm4gIlRoaXMgcHJpbnRlciBkZXN0aW5hdGlvbiByZXF1ZXN0IGNvbnRhaW5zIGFuIGludmFsaWQgY29udHJvbCBmdW5jdGlvbi4iOworICAgIGNhc2UgTkVSUl9Qcm9jTm9SZXNwb25kOgorICAgICAgcmV0dXJuICJUaGUgcHJpbnQgcHJvY2Vzc29yIGlzIG5vdCByZXNwb25kaW5nLiI7CisgICAgY2FzZSBORVJSX1Nwb29sZXJOb3RMb2FkZWQ6CisgICAgICByZXR1cm4gIlRoZSBzcG9vbGVyIGlzIG5vdCBydW5uaW5nLiI7CisgICAgY2FzZSBORVJSX0Rlc3RJbnZhbGlkU3RhdGU6CisgICAgICByZXR1cm4gIlRoaXMgb3BlcmF0aW9uIGNhbm5vdCBiZSBwZXJmb3JtZWQgb24gdGhlIHByaW50IGRlc3RpbmF0aW9uIGluIGl0cyBjdXJyZW50IHN0YXRlLiI7CisgICAgY2FzZSBORVJSX1FJbnZhbGlkU3RhdGU6CisgICAgICByZXR1cm4gIlRoaXMgb3BlcmF0aW9uIGNhbm5vdCBiZSBwZXJmb3JtZWQgb24gdGhlIHByaW50ZXIgcXVldWUgaW4gaXRzIGN1cnJlbnQgc3RhdGUuIjsKKyAgICBjYXNlIE5FUlJfSm9iSW52YWxpZFN0YXRlOgorICAgICAgcmV0dXJuICJUaGlzIG9wZXJhdGlvbiBjYW5ub3QgYmUgcGVyZm9ybWVkIG9uIHRoZSBwcmludCBqb2IgaW4gaXRzIGN1cnJlbnQgc3RhdGUuIjsKKyAgICBjYXNlIE5FUlJfU3Bvb2xOb01lbW9yeToKKyAgICAgIHJldHVybiAiQSBzcG9vbGVyIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUgb2NjdXJyZWQuIjsKKyAgICBjYXNlIE5FUlJfRHJpdmVyTm90Rm91bmQ6CisgICAgICByZXR1cm4gIlRoZSBkZXZpY2UgZHJpdmVyIGRvZXMgbm90IGV4aXN0LiI7CisgICAgY2FzZSBORVJSX0RhdGFUeXBlSW52YWxpZDoKKyAgICAgIHJldHVybiAiVGhlIGRhdGEgdHlwZSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBwcmludCBwcm9jZXNzb3IuIjsKKyAgICBjYXNlIE5FUlJfUHJvY05vdEZvdW5kOgorICAgICAgcmV0dXJuICJUaGUgcHJpbnQgcHJvY2Vzc29yIGlzIG5vdCBpbnN0YWxsZWQuIjsKKyAgICBjYXNlIE5FUlJfU2VydmljZVRhYmxlTG9ja2VkOgorICAgICAgcmV0dXJuICJUaGUgc2VydmljZSBkYXRhYmFzZSBpcyBsb2NrZWQuIjsKKyAgICBjYXNlIE5FUlJfU2VydmljZVRhYmxlRnVsbDoKKyAgICAgIHJldHVybiAiVGhlIHNlcnZpY2UgdGFibGUgaXMgZnVsbC4iOworICAgIGNhc2UgTkVSUl9TZXJ2aWNlSW5zdGFsbGVkOgorICAgICAgcmV0dXJuICJUaGUgcmVxdWVzdGVkIHNlcnZpY2UgaGFzIGFscmVhZHkgYmVlbiBzdGFydGVkLiI7CisgICAgY2FzZSBORVJSX1NlcnZpY2VFbnRyeUxvY2tlZDoKKyAgICAgIHJldHVybiAiVGhlIHNlcnZpY2UgZG9lcyBub3QgcmVzcG9uZCB0byBjb250cm9sIGFjdGlvbnMuIjsKKyAgICBjYXNlIE5FUlJfU2VydmljZU5vdEluc3RhbGxlZDoKKyAgICAgIHJldHVybiAiVGhlIHNlcnZpY2UgaGFzIG5vdCBiZWVuIHN0YXJ0ZWQuIjsKKyAgICBjYXNlIE5FUlJfQmFkU2VydmljZU5hbWU6CisgICAgICByZXR1cm4gIlRoZSBzZXJ2aWNlIG5hbWUgaXMgaW52YWxpZC4iOworICAgIGNhc2UgTkVSUl9TZXJ2aWNlQ3RsVGltZW91dDoKKyAgICAgIHJldHVybiAiVGhlIHNlcnZpY2UgaXMgbm90IHJlc3BvbmRpbmcgdG8gdGhlIGNvbnRyb2wgZnVuY3Rpb24uIjsKKyAgICBjYXNlIE5FUlJfU2VydmljZUN0bEJ1c3k6CisgICAgICByZXR1cm4gIlRoZSBzZXJ2aWNlIGNvbnRyb2wgaXMgYnVzeS4iOworICAgIGNhc2UgTkVSUl9CYWRTZXJ2aWNlUHJvZ05hbWU6CisgICAgICByZXR1cm4gIlRoZSBjb25maWd1cmF0aW9uIGZpbGUgY29udGFpbnMgYW4gaW52YWxpZCBzZXJ2aWNlIHByb2dyYW0gbmFtZS4iOworICAgIGNhc2UgTkVSUl9TZXJ2aWNlTm90Q3RybDoKKyAgICAgIHJldHVybiAiVGhlIHNlcnZpY2UgY291bGQgbm90IGJlIGNvbnRyb2xsZWQgaW4gaXRzIHByZXNlbnQgc3RhdGUuIjsKKyAgICBjYXNlIE5FUlJfU2VydmljZUtpbGxQcm9jOgorICAgICAgcmV0dXJuICJUaGUgc2VydmljZSBlbmRlZCBhYm5vcm1hbGx5LiI7CisgICAgY2FzZSBORVJSX1NlcnZpY2VDdGxOb3RWYWxpZDoKKyAgICAgIHJldHVybiAiVGhlIHJlcXVlc3RlZCBwYXVzZSBvciBzdG9wIGlzIG5vdCB2YWxpZCBmb3IgdGhpcyBzZXJ2aWNlLiI7CisgICAgY2FzZSBORVJSX05vdEluRGlzcGF0Y2hUYmw6CisgICAgICByZXR1cm4gIlRoZSBzZXJ2aWNlIGNvbnRyb2wgZGlzcGF0Y2hlciBjb3VsZCBub3QgZmluZCB0aGUgc2VydmljZSBuYW1lIGluIHRoZSBkaXNwYXRjaCB0YWJsZS4iOworICAgIGNhc2UgTkVSUl9CYWRDb250cm9sUmVjdjoKKyAgICAgIHJldHVybiAiVGhlIHNlcnZpY2UgY29udHJvbCBkaXNwYXRjaGVyIHBpcGUgcmVhZCBmYWlsZWQuIjsKKyAgICBjYXNlIE5FUlJfU2VydmljZU5vdFN0YXJ0aW5nOgorICAgICAgcmV0dXJuICJBIHRocmVhZCBmb3IgdGhlIG5ldyBzZXJ2aWNlIGNvdWxkIG5vdCBiZSBjcmVhdGVkLiI7CisgICAgY2FzZSBORVJSX0FscmVhZHlMb2dnZWRPbjoKKyAgICAgIHJldHVybiAiVGhpcyB3b3Jrc3RhdGlvbiBpcyBhbHJlYWR5IGxvZ2dlZCBvbiB0byB0aGUgbG9jYWwtYXJlYSBuZXR3b3JrLiI7CisgICAgY2FzZSBORVJSX05vdExvZ2dlZE9uOgorICAgICAgcmV0dXJuICJUaGUgd29ya3N0YXRpb24gaXMgbm90IGxvZ2dlZCBvbiB0byB0aGUgbG9jYWwtYXJlYSBuZXR3b3JrLiI7CisgICAgY2FzZSBORVJSX0JhZFVzZXJuYW1lOgorICAgICAgcmV0dXJuICJUaGUgdXNlciBuYW1lIG9yIGdyb3VwIG5hbWUgcGFyYW1ldGVyIGlzIGludmFsaWQuIjsKKyAgICBjYXNlIE5FUlJfQmFkUGFzc3dvcmQ6CisgICAgICByZXR1cm4gIlRoZSBwYXNzd29yZCBwYXJhbWV0ZXIgaXMgaW52YWxpZC4iOworICAgIGNhc2UgTkVSUl9VbmFibGVUb0FkZE5hbWVfVzoKKyAgICAgIHJldHVybiAiQFcgVGhlIGxvZ29uIHByb2Nlc3NvciBkaWQgbm90IGFkZCB0aGUgbWVzc2FnZSBhbGlhcy4iOworICAgIGNhc2UgTkVSUl9VbmFibGVUb0FkZE5hbWVfRjoKKyAgICAgIHJldHVybiAiVGhlIGxvZ29uIHByb2Nlc3NvciBkaWQgbm90IGFkZCB0aGUgbWVzc2FnZSBhbGlhcy4iOworICAgIGNhc2UgTkVSUl9VbmFibGVUb0RlbE5hbWVfVzoKKyAgICAgIHJldHVybiAiQFcgVGhlIGxvZ29mZiBwcm9jZXNzb3IgZGlkIG5vdCBkZWxldGUgdGhlIG1lc3NhZ2UgYWxpYXMuIjsKKyAgICBjYXNlIE5FUlJfVW5hYmxlVG9EZWxOYW1lX0Y6CisgICAgICByZXR1cm4gIlRoZSBsb2dvZmYgcHJvY2Vzc29yIGRpZCBub3QgZGVsZXRlIHRoZSBtZXNzYWdlIGFsaWFzLiI7CisgICAgY2FzZSBORVJSX0xvZ29uc1BhdXNlZDoKKyAgICAgIHJldHVybiAiTmV0d29yayBsb2dvbnMgYXJlIHBhdXNlZC4iOworICAgIGNhc2UgTkVSUl9Mb2dvblNlcnZlckNvbmZsaWN0OgorICAgICAgcmV0dXJuICJBIGNlbnRyYWxpemVkIGxvZ29uLXNlcnZlciBjb25mbGljdCBvY2N1cnJlZC4iOworICAgIGNhc2UgTkVSUl9Mb2dvbk5vVXNlclBhdGg6CisgICAgICByZXR1cm4gIlRoZSBzZXJ2ZXIgaXMgY29uZmlndXJlZCB3aXRob3V0IGEgdmFsaWQgdXNlciBwYXRoLiI7CisgICAgY2FzZSBORVJSX0xvZ29uU2NyaXB0RXJyb3I6CisgICAgICByZXR1cm4gIkFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGxvYWRpbmcgb3IgcnVubmluZyB0aGUgbG9nb24gc2NyaXB0LiI7CisgICAgY2FzZSBORVJSX1N0YW5kYWxvbmVMb2dvbjoKKyAgICAgIHJldHVybiAiVGhlIGxvZ29uIHNlcnZlciB3YXMgbm90IHNwZWNpZmllZC4gWW91ciBjb21wdXRlciB3aWxsIGJlIGxvZ2dlZCBvbiBhcyBTVEFOREFMT05FLiI7CisgICAgY2FzZSBORVJSX0xvZ29uU2VydmVyTm90Rm91bmQ6CisgICAgICByZXR1cm4gIlRoZSBsb2dvbiBzZXJ2ZXIgY291bGQgbm90IGJlIGZvdW5kLiI7CisgICAgY2FzZSBORVJSX0xvZ29uRG9tYWluRXhpc3RzOgorICAgICAgcmV0dXJuICJUaGVyZSBpcyBhbHJlYWR5IGEgbG9nb24gZG9tYWluIGZvciB0aGlzIGNvbXB1dGVyLiI7CisgICAgY2FzZSBORVJSX05vblZhbGlkYXRlZExvZ29uOgorICAgICAgcmV0dXJuICJUaGUgbG9nb24gc2VydmVyIGNvdWxkIG5vdCB2YWxpZGF0ZSB0aGUgbG9nb24uIjsKKyAgICBjYXNlIE5FUlJfQUNGTm90Rm91bmQ6CisgICAgICByZXR1cm4gIlRoZSBzZWN1cml0eSBkYXRhYmFzZSBjb3VsZCBub3QgYmUgZm91bmQuIjsKKyAgICBjYXNlIE5FUlJfR3JvdXBOb3RGb3VuZDoKKyAgICAgIHJldHVybiAiVGhlIGdyb3VwIG5hbWUgY291bGQgbm90IGJlIGZvdW5kLiI7CisgICAgY2FzZSBORVJSX1VzZXJOb3RGb3VuZDoKKyAgICAgIHJldHVybiAiVGhlIHVzZXIgbmFtZSBjb3VsZCBub3QgYmUgZm91bmQuIjsKKyAgICBjYXNlIE5FUlJfUmVzb3VyY2VOb3RGb3VuZDoKKyAgICAgIHJldHVybiAiVGhlIHJlc291cmNlIG5hbWUgY291bGQgbm90IGJlIGZvdW5kLiI7CisgICAgY2FzZSBORVJSX0dyb3VwRXhpc3RzOgorICAgICAgcmV0dXJuICJUaGUgZ3JvdXAgYWxyZWFkeSBleGlzdHMuIjsKKyAgICBjYXNlIE5FUlJfVXNlckV4aXN0czoKKyAgICAgIHJldHVybiAiVGhlIHVzZXIgYWNjb3VudCBhbHJlYWR5IGV4aXN0cy4iOworICAgIGNhc2UgTkVSUl9SZXNvdXJjZUV4aXN0czoKKyAgICAgIHJldHVybiAiVGhlIHJlc291cmNlIHBlcm1pc3Npb24gbGlzdCBhbHJlYWR5IGV4aXN0cy4iOworICAgIGNhc2UgTkVSUl9Ob3RQcmltYXJ5OgorICAgICAgcmV0dXJuICJUaGlzIG9wZXJhdGlvbiBpcyBvbmx5IGFsbG93ZWQgb24gdGhlIHByaW1hcnkgZG9tYWluIGNvbnRyb2xsZXIgb2YgdGhlIGRvbWFpbi4iOworICAgIGNhc2UgTkVSUl9BQ0ZOb3RMb2FkZWQ6CisgICAgICByZXR1cm4gIlRoZSBzZWN1cml0eSBkYXRhYmFzZSBoYXMgbm90IGJlZW4gc3RhcnRlZC4iOworICAgIGNhc2UgTkVSUl9BQ0ZOb1Jvb206CisgICAgICByZXR1cm4gIlRoZXJlIGFyZSB0b28gbWFueSBuYW1lcyBpbiB0aGUgdXNlciBhY2NvdW50cyBkYXRhYmFzZS4iOworICAgIGNhc2UgTkVSUl9BQ0ZGaWxlSU9GYWlsOgorICAgICAgcmV0dXJuICJBIGRpc2sgSS9PIGZhaWx1cmUgb2NjdXJyZWQuIjsKKyAgICBjYXNlIE5FUlJfQUNGVG9vTWFueUxpc3RzOgorICAgICAgcmV0dXJuICJUaGUgbGltaXQgb2YgNjQgZW50cmllcyBwZXIgcmVzb3VyY2Ugd2FzIGV4Y2VlZGVkLiI7CisgICAgY2FzZSBORVJSX1VzZXJMb2dvbjoKKyAgICAgIHJldHVybiAiRGVsZXRpbmcgYSB1c2VyIHdpdGggYSBzZXNzaW9uIGlzIG5vdCBhbGxvd2VkLiI7CisgICAgY2FzZSBORVJSX0FDRk5vUGFyZW50OgorICAgICAgcmV0dXJuICJUaGUgcGFyZW50IGRpcmVjdG9yeSBjb3VsZCBub3QgYmUgbG9jYXRlZC4iOworICAgIGNhc2UgTkVSUl9DYW5Ob3RHcm93U2VnbWVudDoKKyAgICAgIHJldHVybiAiVW5hYmxlIHRvIGFkZCB0byB0aGUgc2VjdXJpdHkgZGF0YWJhc2Ugc2Vzc2lvbiBjYWNoZSBzZWdtZW50LiI7CisgICAgY2FzZSBORVJSX1NwZUdyb3VwT3A6CisgICAgICByZXR1cm4gIlRoaXMgb3BlcmF0aW9uIGlzIG5vdCBhbGxvd2VkIG9uIHRoaXMgc3BlY2lhbCBncm91cC4iOworICAgIGNhc2UgTkVSUl9Ob3RJbkNhY2hlOgorICAgICAgcmV0dXJuICJUaGlzIHVzZXIgaXMgbm90IGNhY2hlZCBpbiB1c2VyIGFjY291bnRzIGRhdGFiYXNlIHNlc3Npb24gY2FjaGUuIjsKKyAgICBjYXNlIE5FUlJfVXNlckluR3JvdXA6CisgICAgICByZXR1cm4gIlRoZSB1c2VyIGFscmVhZHkgYmVsb25ncyB0byB0aGlzIGdyb3VwLiI7CisgICAgY2FzZSBORVJSX1VzZXJOb3RJbkdyb3VwOgorICAgICAgcmV0dXJuICJUaGUgdXNlciBkb2VzIG5vdCBiZWxvbmcgdG8gdGhpcyBncm91cC4iOworICAgIGNhc2UgTkVSUl9BY2NvdW50VW5kZWZpbmVkOgorICAgICAgcmV0dXJuICJUaGlzIHVzZXIgYWNjb3VudCBpcyB1bmRlZmluZWQuIjsKKyAgICBjYXNlIE5FUlJfQWNjb3VudEV4cGlyZWQ6CisgICAgICByZXR1cm4gIlRoaXMgdXNlciBhY2NvdW50IGhhcyBleHBpcmVkLiI7CisgICAgY2FzZSBORVJSX0ludmFsaWRXb3Jrc3RhdGlvbjoKKyAgICAgIHJldHVybiAiVGhlIHVzZXIgaXMgbm90IGFsbG93ZWQgdG8gbG9nIG9uIGZyb20gdGhpcyB3b3Jrc3RhdGlvbi4iOworICAgIGNhc2UgTkVSUl9JbnZhbGlkTG9nb25Ib3VyczoKKyAgICAgIHJldHVybiAiVGhlIHVzZXIgaXMgbm90IGFsbG93ZWQgdG8gbG9nIG9uIGF0IHRoaXMgdGltZS4iOworICAgIGNhc2UgTkVSUl9QYXNzd29yZEV4cGlyZWQ6CisgICAgICByZXR1cm4gIlRoZSBwYXNzd29yZCBvZiB0aGlzIHVzZXIgaGFzIGV4cGlyZWQuIjsKKyAgICBjYXNlIE5FUlJfUGFzc3dvcmRDYW50Q2hhbmdlOgorICAgICAgcmV0dXJuICJUaGUgcGFzc3dvcmQgb2YgdGhpcyB1c2VyIGNhbm5vdCBjaGFuZ2UuIjsKKyAgICBjYXNlIE5FUlJfUGFzc3dvcmRIaXN0Q29uZmxpY3Q6CisgICAgICByZXR1cm4gIlRoaXMgcGFzc3dvcmQgY2Fubm90IGJlIHVzZWQgbm93LiI7CisgICAgY2FzZSBORVJSX1Bhc3N3b3JkVG9vU2hvcnQ6CisgICAgICByZXR1cm4gIlRoZSBwYXNzd29yZCBkb2VzIG5vdCBtZWV0IHRoZSBwYXNzd29yZCBwb2xpY3kgcmVxdWlyZW1lbnRzLiBDaGVjayB0aGUgbWluaW11bSBwYXNzd29yZCBsZW5ndGgsIHBhc3N3b3JkIGNvbXBsZXhpdHkgYW5kIHBhc3N3b3JkIGhpc3RvcnkgcmVxdWlyZW1lbnRzLiI7CisgICAgY2FzZSBORVJSX1Bhc3N3b3JkVG9vUmVjZW50OgorICAgICAgcmV0dXJuICJUaGUgcGFzc3dvcmQgb2YgdGhpcyB1c2VyIGlzIHRvbyByZWNlbnQgdG8gY2hhbmdlLiI7CisgICAgY2FzZSBORVJSX0ludmFsaWREYXRhYmFzZToKKyAgICAgIHJldHVybiAiVGhlIHNlY3VyaXR5IGRhdGFiYXNlIGlzIGNvcnJ1cHRlZC4iOworICAgIGNhc2UgTkVSUl9EYXRhYmFzZVVwVG9EYXRlOgorICAgICAgcmV0dXJuICJObyB1cGRhdGVzIGFyZSBuZWNlc3NhcnkgdG8gdGhpcyByZXBsaWNhbnQgbmV0d29yay9sb2NhbCBzZWN1cml0eSBkYXRhYmFzZS4iOworICAgIGNhc2UgTkVSUl9TeW5jUmVxdWlyZWQ6CisgICAgICByZXR1cm4gIlRoaXMgcmVwbGljYW50IGRhdGFiYXNlIGlzIG91dGRhdGVkOyBzeW5jaHJvbml6YXRpb24gaXMgcmVxdWlyZWQuIjsKKyAgICBjYXNlIE5FUlJfVXNlTm90Rm91bmQ6CisgICAgICByZXR1cm4gIlRoZSBuZXR3b3JrIGNvbm5lY3Rpb24gY291bGQgbm90IGJlIGZvdW5kLiI7CisgICAgY2FzZSBORVJSX0JhZEFzZ1R5cGU6CisgICAgICByZXR1cm4gIlRoaXMgYXNnX3R5cGUgaXMgaW52YWxpZC4iOworICAgIGNhc2UgTkVSUl9EZXZpY2VJc1NoYXJlZDoKKyAgICAgIHJldHVybiAiVGhpcyBkZXZpY2UgaXMgY3VycmVudGx5IGJlaW5nIHNoYXJlZC4iOworICAgIGNhc2UgTkVSUl9Ob0NvbXB1dGVyTmFtZToKKyAgICAgIHJldHVybiAiVGhlIGNvbXB1dGVyIG5hbWUgY291bGQgbm90IGJlIGFkZGVkIGFzIGEgbWVzc2FnZSBhbGlhcy4gVGhlIG5hbWUgbWF5IGFscmVhZHkgZXhpc3Qgb24gdGhlIG5ldHdvcmsuIjsKKyAgICBjYXNlIE5FUlJfTXNnQWxyZWFkeVN0YXJ0ZWQ6CisgICAgICByZXR1cm4gIlRoZSBNZXNzZW5nZXIgc2VydmljZSBpcyBhbHJlYWR5IHN0YXJ0ZWQuIjsKKyAgICBjYXNlIE5FUlJfTXNnSW5pdEZhaWxlZDoKKyAgICAgIHJldHVybiAiVGhlIE1lc3NlbmdlciBzZXJ2aWNlIGZhaWxlZCB0byBzdGFydC4iOworICAgIGNhc2UgTkVSUl9OYW1lTm90Rm91bmQ6CisgICAgICByZXR1cm4gIlRoZSBtZXNzYWdlIGFsaWFzIGNvdWxkIG5vdCBiZSBmb3VuZCBvbiB0aGUgbmV0d29yay4iOworICAgIGNhc2UgTkVSUl9BbHJlYWR5Rm9yd2FyZGVkOgorICAgICAgcmV0dXJuICJUaGlzIG1lc3NhZ2UgYWxpYXMgaGFzIGFscmVhZHkgYmVlbiBmb3J3YXJkZWQuIjsKKyAgICBjYXNlIE5FUlJfQWRkRm9yd2FyZGVkOgorICAgICAgcmV0dXJuICJUaGlzIG1lc3NhZ2UgYWxpYXMgaGFzIGJlZW4gYWRkZWQgYnV0IGlzIHN0aWxsIGZvcndhcmRlZC4iOworICAgIGNhc2UgTkVSUl9BbHJlYWR5RXhpc3RzOgorICAgICAgcmV0dXJuICJUaGlzIG1lc3NhZ2UgYWxpYXMgYWxyZWFkeSBleGlzdHMgbG9jYWxseS4iOworICAgIGNhc2UgTkVSUl9Ub29NYW55TmFtZXM6CisgICAgICByZXR1cm4gIlRoZSBtYXhpbXVtIG51bWJlciBvZiBhZGRlZCBtZXNzYWdlIGFsaWFzZXMgaGFzIGJlZW4gZXhjZWVkZWQuIjsKKyAgICBjYXNlIE5FUlJfRGVsQ29tcHV0ZXJOYW1lOgorICAgICAgcmV0dXJuICJUaGUgY29tcHV0ZXIgbmFtZSBjb3VsZCBub3QgYmUgZGVsZXRlZC4iOworICAgIGNhc2UgTkVSUl9Mb2NhbEZvcndhcmQ6CisgICAgICByZXR1cm4gIk1lc3NhZ2VzIGNhbm5vdCBiZSBmb3J3YXJkZWQgYmFjayB0byB0aGUgc2FtZSB3b3Jrc3RhdGlvbi4iOworICAgIGNhc2UgTkVSUl9HcnBNc2dQcm9jZXNzb3I6CisgICAgICByZXR1cm4gIkFuIGVycm9yIG9jY3VycmVkIGluIHRoZSBkb21haW4gbWVzc2FnZSBwcm9jZXNzb3IuIjsKKyAgICBjYXNlIE5FUlJfUGF1c2VkUmVtb3RlOgorICAgICAgcmV0dXJuICJUaGUgbWVzc2FnZSB3YXMgc2VudCwgYnV0IHRoZSByZWNpcGllbnQgaGFzIHBhdXNlZCB0aGUgTWVzc2VuZ2VyIHNlcnZpY2UuIjsKKyAgICBjYXNlIE5FUlJfQmFkUmVjZWl2ZToKKyAgICAgIHJldHVybiAiVGhlIG1lc3NhZ2Ugd2FzIHNlbnQgYnV0IG5vdCByZWNlaXZlZC4iOworICAgIGNhc2UgTkVSUl9OYW1lSW5Vc2U6CisgICAgICByZXR1cm4gIlRoZSBtZXNzYWdlIGFsaWFzIGlzIGN1cnJlbnRseSBpbiB1c2UuIFRyeSBhZ2FpbiBsYXRlci4iOworICAgIGNhc2UgTkVSUl9Nc2dOb3RTdGFydGVkOgorICAgICAgcmV0dXJuICJUaGUgTWVzc2VuZ2VyIHNlcnZpY2UgaGFzIG5vdCBiZWVuIHN0YXJ0ZWQuIjsKKyAgICBjYXNlIE5FUlJfTm90TG9jYWxOYW1lOgorICAgICAgcmV0dXJuICJUaGUgbmFtZSBpcyBub3Qgb24gdGhlIGxvY2FsIGNvbXB1dGVyLiI7CisgICAgY2FzZSBORVJSX05vRm9yd2FyZE5hbWU6CisgICAgICByZXR1cm4gIlRoZSBmb3J3YXJkZWQgbWVzc2FnZSBhbGlhcyBjb3VsZCBub3QgYmUgZm91bmQgb24gdGhlIG5ldHdvcmsuIjsKKyAgICBjYXNlIE5FUlJfUmVtb3RlRnVsbDoKKyAgICAgIHJldHVybiAiVGhlIG1lc3NhZ2UgYWxpYXMgdGFibGUgb24gdGhlIHJlbW90ZSBzdGF0aW9uIGlzIGZ1bGwuIjsKKyAgICBjYXNlIE5FUlJfTmFtZU5vdEZvcndhcmRlZDoKKyAgICAgIHJldHVybiAiTWVzc2FnZXMgZm9yIHRoaXMgYWxpYXMgYXJlIG5vdCBjdXJyZW50bHkgYmVpbmcgZm9yd2FyZGVkLiI7CisgICAgY2FzZSBORVJSX1RydW5jYXRlZEJyb2FkY2FzdDoKKyAgICAgIHJldHVybiAiVGhlIGJyb2FkY2FzdCBtZXNzYWdlIHdhcyB0cnVuY2F0ZWQuIjsKKyAgICBjYXNlIE5FUlJfSW52YWxpZERldmljZToKKyAgICAgIHJldHVybiAiVGhpcyBpcyBhbiBpbnZhbGlkIGRldmljZSBuYW1lLiI7CisgICAgY2FzZSBORVJSX1dyaXRlRmF1bHQ6CisgICAgICByZXR1cm4gIkEgd3JpdGUgZmF1bHQgb2NjdXJyZWQuIjsKKyAgICBjYXNlIE5FUlJfRHVwbGljYXRlTmFtZToKKyAgICAgIHJldHVybiAiQSBkdXBsaWNhdGUgbWVzc2FnZSBhbGlhcyBleGlzdHMgb24gdGhlIG5ldHdvcmsuIjsKKyAgICBjYXNlIE5FUlJfRGVsZXRlTGF0ZXI6CisgICAgICByZXR1cm4gIkBXIFRoaXMgbWVzc2FnZSBhbGlhcyB3aWxsIGJlIGRlbGV0ZWQgbGF0ZXIuIjsKKyAgICBjYXNlIE5FUlJfSW5jb21wbGV0ZURlbDoKKyAgICAgIHJldHVybiAiVGhlIG1lc3NhZ2UgYWxpYXMgd2FzIG5vdCBzdWNjZXNzZnVsbHkgZGVsZXRlZCBmcm9tIGFsbCBuZXR3b3Jrcy4iOworICAgIGNhc2UgTkVSUl9NdWx0aXBsZU5ldHM6CisgICAgICByZXR1cm4gIlRoaXMgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgb24gY29tcHV0ZXJzIHdpdGggbXVsdGlwbGUgbmV0d29ya3MuIjsKKyAgICBjYXNlIE5FUlJfTmV0TmFtZU5vdEZvdW5kOgorICAgICAgcmV0dXJuICJUaGlzIHNoYXJlZCByZXNvdXJjZSBkb2VzIG5vdCBleGlzdC4iOworICAgIGNhc2UgTkVSUl9EZXZpY2VOb3RTaGFyZWQ6CisgICAgICByZXR1cm4gIlRoaXMgZGV2aWNlIGlzIG5vdCBzaGFyZWQuIjsKKyAgICBjYXNlIE5FUlJfQ2xpZW50TmFtZU5vdEZvdW5kOgorICAgICAgcmV0dXJuICJBIHNlc3Npb24gZG9lcyBub3QgZXhpc3Qgd2l0aCB0aGF0IGNvbXB1dGVyIG5hbWUuIjsKKyAgICBjYXNlIE5FUlJfRmlsZUlkTm90Rm91bmQ6CisgICAgICByZXR1cm4gIlRoZXJlIGlzIG5vdCBhbiBvcGVuIGZpbGUgd2l0aCB0aGF0IGlkZW50aWZpY2F0aW9uIG51bWJlci4iOworICAgIGNhc2UgTkVSUl9FeGVjRmFpbHVyZToKKyAgICAgIHJldHVybiAiQSBmYWlsdXJlIG9jY3VycmVkIHdoZW4gZXhlY3V0aW5nIGEgcmVtb3RlIGFkbWluaXN0cmF0aW9uIGNvbW1hbmQuIjsKKyAgICBjYXNlIE5FUlJfVG1wRmlsZToKKyAgICAgIHJldHVybiAiQSBmYWlsdXJlIG9jY3VycmVkIHdoZW4gb3BlbmluZyBhIHJlbW90ZSB0ZW1wb3JhcnkgZmlsZS4iOworICAgIGNhc2UgTkVSUl9Ub29NdWNoRGF0YToKKyAgICAgIHJldHVybiAiVGhlIGRhdGEgcmV0dXJuZWQgZnJvbSBhIHJlbW90ZSBhZG1pbmlzdHJhdGlvbiBjb21tYW5kIGhhcyBiZWVuIHRydW5jYXRlZCB0byA2NEsuIjsKKyAgICBjYXNlIE5FUlJfRGV2aWNlU2hhcmVDb25mbGljdDoKKyAgICAgIHJldHVybiAiVGhpcyBkZXZpY2UgY2Fubm90IGJlIHNoYXJlZCBhcyBib3RoIGEgc3Bvb2xlZCBhbmQgYSBub24tc3Bvb2xlZCByZXNvdXJjZS4iOworICAgIGNhc2UgTkVSUl9Ccm93c2VyVGFibGVJbmNvbXBsZXRlOgorICAgICAgcmV0dXJuICJUaGUgaW5mb3JtYXRpb24gaW4gdGhlIGxpc3Qgb2Ygc2VydmVycyBtYXkgYmUgaW5jb3JyZWN0LiI7CisgICAgY2FzZSBORVJSX05vdExvY2FsRG9tYWluOgorICAgICAgcmV0dXJuICJUaGUgY29tcHV0ZXIgaXMgbm90IGFjdGl2ZSBpbiB0aGlzIGRvbWFpbi4iOworI2lmZGVmIE5FUlJfSXNEZnNTaGFyZQorCisgICAgY2FzZSBORVJSX0lzRGZzU2hhcmU6CisgICAgICByZXR1cm4gIlRoZSBzaGFyZSBtdXN0IGJlIHJlbW92ZWQgZnJvbSB0aGUgRGlzdHJpYnV0ZWQgRmlsZSBTeXN0ZW0gYmVmb3JlIGl0IGNhbiBiZSBkZWxldGVkLiI7CisjZW5kaWYKKworICAgIGNhc2UgTkVSUl9EZXZJbnZhbGlkT3BDb2RlOgorICAgICAgcmV0dXJuICJUaGUgb3BlcmF0aW9uIGlzIGludmFsaWQgZm9yIHRoaXMgZGV2aWNlLiI7CisgICAgY2FzZSBORVJSX0Rldk5vdEZvdW5kOgorICAgICAgcmV0dXJuICJUaGlzIGRldmljZSBjYW5ub3QgYmUgc2hhcmVkLiI7CisgICAgY2FzZSBORVJSX0Rldk5vdE9wZW46CisgICAgICByZXR1cm4gIlRoaXMgZGV2aWNlIHdhcyBub3Qgb3Blbi4iOworICAgIGNhc2UgTkVSUl9CYWRRdWV1ZURldlN0cmluZzoKKyAgICAgIHJldHVybiAiVGhpcyBkZXZpY2UgbmFtZSBsaXN0IGlzIGludmFsaWQuIjsKKyAgICBjYXNlIE5FUlJfQmFkUXVldWVQcmlvcml0eToKKyAgICAgIHJldHVybiAiVGhlIHF1ZXVlIHByaW9yaXR5IGlzIGludmFsaWQuIjsKKyAgICBjYXNlIE5FUlJfTm9Db21tRGV2czoKKyAgICAgIHJldHVybiAiVGhlcmUgYXJlIG5vIHNoYXJlZCBjb21tdW5pY2F0aW9uIGRldmljZXMuIjsKKyAgICBjYXNlIE5FUlJfUXVldWVOb3RGb3VuZDoKKyAgICAgIHJldHVybiAiVGhlIHF1ZXVlIHlvdSBzcGVjaWZpZWQgZG9lcyBub3QgZXhpc3QuIjsKKyAgICBjYXNlIE5FUlJfQmFkRGV2U3RyaW5nOgorICAgICAgcmV0dXJuICJUaGlzIGxpc3Qgb2YgZGV2aWNlcyBpcyBpbnZhbGlkLiI7CisgICAgY2FzZSBORVJSX0JhZERldjoKKyAgICAgIHJldHVybiAiVGhlIHJlcXVlc3RlZCBkZXZpY2UgaXMgaW52YWxpZC4iOworICAgIGNhc2UgTkVSUl9JblVzZUJ5U3Bvb2xlcjoKKyAgICAgIHJldHVybiAiVGhpcyBkZXZpY2UgaXMgYWxyZWFkeSBpbiB1c2UgYnkgdGhlIHNwb29sZXIuIjsKKyAgICBjYXNlIE5FUlJfQ29tbURldkluVXNlOgorICAgICAgcmV0dXJuICJUaGlzIGRldmljZSBpcyBhbHJlYWR5IGluIHVzZSBhcyBhIGNvbW11bmljYXRpb24gZGV2aWNlLiI7CisgICAgY2FzZSBORVJSX0ludmFsaWRDb21wdXRlcjoKKyAgICAgIHJldHVybiAiVGhpcyBjb21wdXRlciBuYW1lIGlzIGludmFsaWQuIjsKKyAgICBjYXNlIE5FUlJfTWF4TGVuRXhjZWVkZWQ6CisgICAgICByZXR1cm4gIlRoZSBzdHJpbmcgYW5kIHByZWZpeCBzcGVjaWZpZWQgYXJlIHRvbyBsb25nLiI7CisgICAgY2FzZSBORVJSX0JhZENvbXBvbmVudDoKKyAgICAgIHJldHVybiAiVGhpcyBwYXRoIGNvbXBvbmVudCBpcyBpbnZhbGlkLiI7CisgICAgY2FzZSBORVJSX0NhbnRUeXBlOgorICAgICAgcmV0dXJuICJDb3VsZCBub3QgZGV0ZXJtaW5lIHRoZSB0eXBlIG9mIGlucHV0LiI7CisgICAgY2FzZSBORVJSX1Rvb01hbnlFbnRyaWVzOgorICAgICAgcmV0dXJuICJUaGUgYnVmZmVyIGZvciB0eXBlcyBpcyBub3QgYmlnIGVub3VnaC4iOworICAgIGNhc2UgTkVSUl9Qcm9maWxlRmlsZVRvb0JpZzoKKyAgICAgIHJldHVybiAiUHJvZmlsZSBmaWxlcyBjYW5ub3QgZXhjZWVkIDY0Sy4iOworICAgIGNhc2UgTkVSUl9Qcm9maWxlT2Zmc2V0OgorICAgICAgcmV0dXJuICJUaGUgc3RhcnQgb2Zmc2V0IGlzIG91dCBvZiByYW5nZS4iOworICAgIGNhc2UgTkVSUl9Qcm9maWxlQ2xlYW51cDoKKyAgICAgIHJldHVybiAiVGhlIHN5c3RlbSBjYW5ub3QgZGVsZXRlIGN1cnJlbnQgY29ubmVjdGlvbnMgdG8gbmV0d29yayByZXNvdXJjZXMuIjsKKyAgICBjYXNlIE5FUlJfUHJvZmlsZVVua25vd25DbWQ6CisgICAgICByZXR1cm4gIlRoZSBzeXN0ZW0gd2FzIHVuYWJsZSB0byBwYXJzZSB0aGUgY29tbWFuZCBsaW5lIGluIHRoaXMgZmlsZS4iOworICAgIGNhc2UgTkVSUl9Qcm9maWxlTG9hZEVycjoKKyAgICAgIHJldHVybiAiQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgbG9hZGluZyB0aGUgcHJvZmlsZSBmaWxlLiI7CisgICAgY2FzZSBORVJSX1Byb2ZpbGVTYXZlRXJyOgorICAgICAgcmV0dXJuICJAVyBFcnJvcnMgb2NjdXJyZWQgd2hpbGUgc2F2aW5nIHRoZSBwcm9maWxlIGZpbGUuIFRoZSBwcm9maWxlIHdhcyBwYXJ0aWFsbHkgc2F2ZWQuIjsKKyAgICBjYXNlIE5FUlJfTG9nT3ZlcmZsb3c6CisgICAgICByZXR1cm4gIkxvZyBmaWxlICUxIGlzIGZ1bGwuIjsKKyAgICBjYXNlIE5FUlJfTG9nRmlsZUNoYW5nZWQ6CisgICAgICByZXR1cm4gIlRoaXMgbG9nIGZpbGUgaGFzIGNoYW5nZWQgYmV0d2VlbiByZWFkcy4iOworICAgIGNhc2UgTkVSUl9Mb2dGaWxlQ29ycnVwdDoKKyAgICAgIHJldHVybiAiTG9nIGZpbGUgJTEgaXMgY29ycnVwdC4iOworICAgIGNhc2UgTkVSUl9Tb3VyY2VJc0RpcjoKKyAgICAgIHJldHVybiAiVGhlIHNvdXJjZSBwYXRoIGNhbm5vdCBiZSBhIGRpcmVjdG9yeS4iOworICAgIGNhc2UgTkVSUl9CYWRTb3VyY2U6CisgICAgICByZXR1cm4gIlRoZSBzb3VyY2UgcGF0aCBpcyBpbGxlZ2FsLiI7CisgICAgY2FzZSBORVJSX0JhZERlc3Q6CisgICAgICByZXR1cm4gIlRoZSBkZXN0aW5hdGlvbiBwYXRoIGlzIGlsbGVnYWwuIjsKKyAgICBjYXNlIE5FUlJfRGlmZmVyZW50U2VydmVyczoKKyAgICAgIHJldHVybiAiVGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gcGF0aHMgYXJlIG9uIGRpZmZlcmVudCBzZXJ2ZXJzLiI7CisgICAgY2FzZSBORVJSX1J1blNydlBhdXNlZDoKKyAgICAgIHJldHVybiAiVGhlIFJ1biBzZXJ2ZXIgeW91IHJlcXVlc3RlZCBpcyBwYXVzZWQuIjsKKyAgICBjYXNlIE5FUlJfRXJyQ29tbVJ1blNydjoKKyAgICAgIHJldHVybiAiQW4gZXJyb3Igb2NjdXJyZWQgd2hlbiBjb21tdW5pY2F0aW5nIHdpdGggYSBSdW4gc2VydmVyLiI7CisgICAgY2FzZSBORVJSX0Vycm9yRXhlY2luZ0dob3N0OgorICAgICAgcmV0dXJuICJBbiBlcnJvciBvY2N1cnJlZCB3aGVuIHN0YXJ0aW5nIGEgYmFja2dyb3VuZCBwcm9jZXNzLiI7CisgICAgY2FzZSBORVJSX1NoYXJlTm90Rm91bmQ6CisgICAgICByZXR1cm4gIlRoZSBzaGFyZWQgcmVzb3VyY2UgeW91IGFyZSBjb25uZWN0ZWQgdG8gY291bGQgbm90IGJlIGZvdW5kLiI7CisgICAgY2FzZSBORVJSX0ludmFsaWRMYW5hOgorICAgICAgcmV0dXJuICJUaGUgTEFOIGFkYXB0ZXIgbnVtYmVyIGlzIGludmFsaWQuIjsKKyAgICBjYXNlIE5FUlJfT3BlbkZpbGVzOgorICAgICAgcmV0dXJuICJUaGVyZSBhcmUgb3BlbiBmaWxlcyBvbiB0aGUgY29ubmVjdGlvbi4iOworICAgIGNhc2UgTkVSUl9BY3RpdmVDb25uczoKKyAgICAgIHJldHVybiAiQWN0aXZlIGNvbm5lY3Rpb25zIHN0aWxsIGV4aXN0LiI7CisgICAgY2FzZSBORVJSX0JhZFBhc3N3b3JkQ29yZToKKyAgICAgIHJldHVybiAiVGhpcyBzaGFyZSBuYW1lIG9yIHBhc3N3b3JkIGlzIGludmFsaWQuIjsKKyAgICBjYXNlIE5FUlJfRGV2SW5Vc2U6CisgICAgICByZXR1cm4gIlRoZSBkZXZpY2UgaXMgYmVpbmcgYWNjZXNzZWQgYnkgYW4gYWN0aXZlIHByb2Nlc3MuIjsKKyAgICBjYXNlIE5FUlJfTG9jYWxEcml2ZToKKyAgICAgIHJldHVybiAiVGhlIGRyaXZlIGxldHRlciBpcyBpbiB1c2UgbG9jYWxseS4iOworICAgIGNhc2UgTkVSUl9BbGVydEV4aXN0czoKKyAgICAgIHJldHVybiAiVGhlIHNwZWNpZmllZCBjbGllbnQgaXMgYWxyZWFkeSByZWdpc3RlcmVkIGZvciB0aGUgc3BlY2lmaWVkIGV2ZW50LiI7CisgICAgY2FzZSBORVJSX1Rvb01hbnlBbGVydHM6CisgICAgICByZXR1cm4gIlRoZSBhbGVydCB0YWJsZSBpcyBmdWxsLiI7CisgICAgY2FzZSBORVJSX05vU3VjaEFsZXJ0OgorICAgICAgcmV0dXJuICJBbiBpbnZhbGlkIG9yIG5vbmV4aXN0ZW50IGFsZXJ0IG5hbWUgd2FzIHJhaXNlZC4iOworICAgIGNhc2UgTkVSUl9CYWRSZWNpcGllbnQ6CisgICAgICByZXR1cm4gIlRoZSBhbGVydCByZWNpcGllbnQgaXMgaW52YWxpZC4iOworICAgIGNhc2UgTkVSUl9BY2N0TGltaXRFeGNlZWRlZDoKKyAgICAgIHJldHVybiAiQSB1c2VyJ3Mgc2Vzc2lvbiB3aXRoIHRoaXMgc2VydmVyIGhhcyBiZWVuIGRlbGV0ZWQuIjsKKyAgICBjYXNlIE5FUlJfSW52YWxpZExvZ1NlZWs6CisgICAgICByZXR1cm4gIlRoZSBsb2cgZmlsZSBkb2VzIG5vdCBjb250YWluIHRoZSByZXF1ZXN0ZWQgcmVjb3JkIG51bWJlci4iOworICAgIGNhc2UgTkVSUl9CYWRVYXNDb25maWc6CisgICAgICByZXR1cm4gIlRoZSB1c2VyIGFjY291bnRzIGRhdGFiYXNlIGlzIG5vdCBjb25maWd1cmVkIGNvcnJlY3RseS4iOworICAgIGNhc2UgTkVSUl9JbnZhbGlkVUFTT3A6CisgICAgICByZXR1cm4gIlRoaXMgb3BlcmF0aW9uIGlzIG5vdCBwZXJtaXR0ZWQgd2hlbiB0aGUgTmV0bG9nb24gc2VydmljZSBpcyBydW5uaW5nLiI7CisgICAgY2FzZSBORVJSX0xhc3RBZG1pbjoKKyAgICAgIHJldHVybiAiVGhpcyBvcGVyYXRpb24gaXMgbm90IGFsbG93ZWQgb24gdGhlIGxhc3QgYWRtaW5pc3RyYXRpdmUgYWNjb3VudC4iOworICAgIGNhc2UgTkVSUl9EQ05vdEZvdW5kOgorICAgICAgcmV0dXJuICJDb3VsZCBub3QgZmluZCBkb21haW4gY29udHJvbGxlciBmb3IgdGhpcyBkb21haW4uIjsKKyAgICBjYXNlIE5FUlJfTG9nb25UcmFja2luZ0Vycm9yOgorICAgICAgcmV0dXJuICJDb3VsZCBub3Qgc2V0IGxvZ29uIGluZm9ybWF0aW9uIGZvciB0aGlzIHVzZXIuIjsKKyAgICBjYXNlIE5FUlJfTmV0bG9nb25Ob3RTdGFydGVkOgorICAgICAgcmV0dXJuICJUaGUgTmV0bG9nb24gc2VydmljZSBoYXMgbm90IGJlZW4gc3RhcnRlZC4iOworICAgIGNhc2UgTkVSUl9DYW5Ob3RHcm93VUFTRmlsZToKKyAgICAgIHJldHVybiAiVW5hYmxlIHRvIGFkZCB0byB0aGUgdXNlciBhY2NvdW50cyBkYXRhYmFzZS4iOworICAgIGNhc2UgTkVSUl9UaW1lRGlmZkF0REM6CisgICAgICByZXR1cm4gIlRoaXMgc2VydmVyJ3MgY2xvY2sgaXMgbm90IHN5bmNocm9uaXplZCB3aXRoIHRoZSBwcmltYXJ5IGRvbWFpbiBjb250cm9sbGVyJ3MgY2xvY2suIjsKKyAgICBjYXNlIE5FUlJfUGFzc3dvcmRNaXNtYXRjaDoKKyAgICAgIHJldHVybiAiQSBwYXNzd29yZCBtaXNtYXRjaCBoYXMgYmVlbiBkZXRlY3RlZC4iOworICAgIGNhc2UgTkVSUl9Ob1N1Y2hTZXJ2ZXI6CisgICAgICByZXR1cm4gIlRoZSBzZXJ2ZXIgaWRlbnRpZmljYXRpb24gZG9lcyBub3Qgc3BlY2lmeSBhIHZhbGlkIHNlcnZlci4iOworICAgIGNhc2UgTkVSUl9Ob1N1Y2hTZXNzaW9uOgorICAgICAgcmV0dXJuICJUaGUgc2Vzc2lvbiBpZGVudGlmaWNhdGlvbiBkb2VzIG5vdCBzcGVjaWZ5IGEgdmFsaWQgc2Vzc2lvbi4iOworICAgIGNhc2UgTkVSUl9Ob1N1Y2hDb25uZWN0aW9uOgorICAgICAgcmV0dXJuICJUaGUgY29ubmVjdGlvbiBpZGVudGlmaWNhdGlvbiBkb2VzIG5vdCBzcGVjaWZ5IGEgdmFsaWQgY29ubmVjdGlvbi4iOworICAgIGNhc2UgTkVSUl9Ub29NYW55U2VydmVyczoKKyAgICAgIHJldHVybiAiVGhlcmUgaXMgbm8gc3BhY2UgZm9yIGFub3RoZXIgZW50cnkgaW4gdGhlIHRhYmxlIG9mIGF2YWlsYWJsZSBzZXJ2ZXJzLiI7CisgICAgY2FzZSBORVJSX1Rvb01hbnlTZXNzaW9uczoKKyAgICAgIHJldHVybiAiVGhlIHNlcnZlciBoYXMgcmVhY2hlZCB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc2Vzc2lvbnMgaXQgc3VwcG9ydHMuIjsKKyAgICBjYXNlIE5FUlJfVG9vTWFueUNvbm5lY3Rpb25zOgorICAgICAgcmV0dXJuICJUaGUgc2VydmVyIGhhcyByZWFjaGVkIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjb25uZWN0aW9ucyBpdCBzdXBwb3J0cy4iOworICAgIGNhc2UgTkVSUl9Ub29NYW55RmlsZXM6CisgICAgICByZXR1cm4gIlRoZSBzZXJ2ZXIgY2Fubm90IG9wZW4gbW9yZSBmaWxlcyBiZWNhdXNlIGl0IGhhcyByZWFjaGVkIGl0cyBtYXhpbXVtIG51bWJlci4iOworICAgIGNhc2UgTkVSUl9Ob0FsdGVybmF0ZVNlcnZlcnM6CisgICAgICByZXR1cm4gIlRoZXJlIGFyZSBubyBhbHRlcm5hdGUgc2VydmVycyByZWdpc3RlcmVkIG9uIHRoaXMgc2VydmVyLiI7CisgICAgY2FzZSBORVJSX1RyeURvd25MZXZlbDoKKyAgICAgIHJldHVybiAiVHJ5IGRvd24tbGV2ZWwgKHJlbW90ZSBhZG1pbiBwcm90b2NvbCkgdmVyc2lvbiBvZiBBUEkgaW5zdGVhZC4iOworICAgIGNhc2UgTkVSUl9VUFNEcml2ZXJOb3RTdGFydGVkOgorICAgICAgcmV0dXJuICJUaGUgVVBTIGRyaXZlciBjb3VsZCBub3QgYmUgYWNjZXNzZWQgYnkgdGhlIFVQUyBzZXJ2aWNlLiI7CisgICAgY2FzZSBORVJSX1VQU0ludmFsaWRDb25maWc6CisgICAgICByZXR1cm4gIlRoZSBVUFMgc2VydmljZSBpcyBub3QgY29uZmlndXJlZCBjb3JyZWN0bHkuIjsKKyAgICBjYXNlIE5FUlJfVVBTSW52YWxpZENvbW1Qb3J0OgorICAgICAgcmV0dXJuICJUaGUgVVBTIHNlcnZpY2UgY291bGQgbm90IGFjY2VzcyB0aGUgc3BlY2lmaWVkIENvbW0gUG9ydC4iOworICAgIGNhc2UgTkVSUl9VUFNTaWduYWxBc3NlcnRlZDoKKyAgICAgIHJldHVybiAiVGhlIFVQUyBpbmRpY2F0ZWQgYSBsaW5lIGZhaWwgb3IgbG93IGJhdHRlcnkgc2l0dWF0aW9uLiBTZXJ2aWNlIG5vdCBzdGFydGVkLiI7CisgICAgY2FzZSBORVJSX1VQU1NodXRkb3duRmFpbGVkOgorICAgICAgcmV0dXJuICJUaGUgVVBTIHNlcnZpY2UgZmFpbGVkIHRvIHBlcmZvcm0gYSBzeXN0ZW0gc2h1dCBkb3duLiI7CisgICAgY2FzZSBORVJSX0JhZERvc1JldENvZGU6CisgICAgICByZXR1cm4gIlRoZSBwcm9ncmFtIGJlbG93IHJldHVybmVkIGFuIE1TLURPUyBlcnJvciBjb2RlOiI7CisgICAgY2FzZSBORVJSX1Byb2dOZWVkc0V4dHJhTWVtOgorICAgICAgcmV0dXJuICJUaGUgcHJvZ3JhbSBiZWxvdyBuZWVkcyBtb3JlIG1lbW9yeToiOworICAgIGNhc2UgTkVSUl9CYWREb3NGdW5jdGlvbjoKKyAgICAgIHJldHVybiAiVGhlIHByb2dyYW0gYmVsb3cgY2FsbGVkIGFuIHVuc3VwcG9ydGVkIE1TLURPUyBmdW5jdGlvbjoiOworICAgIGNhc2UgTkVSUl9SZW1vdGVCb290RmFpbGVkOgorICAgICAgcmV0dXJuICJUaGUgd29ya3N0YXRpb24gZmFpbGVkIHRvIGJvb3QuIjsKKyAgICBjYXNlIE5FUlJfQmFkRmlsZUNoZWNrU3VtOgorICAgICAgcmV0dXJuICJUaGUgZmlsZSBiZWxvdyBpcyBjb3JydXB0LiI7CisgICAgY2FzZSBORVJSX05vUnBsQm9vdFN5c3RlbToKKyAgICAgIHJldHVybiAiTm8gbG9hZGVyIGlzIHNwZWNpZmllZCBpbiB0aGUgYm9vdC1ibG9jayBkZWZpbml0aW9uIGZpbGUuIjsKKyAgICBjYXNlIE5FUlJfUnBsTG9hZHJOZXRCaW9zRXJyOgorICAgICAgcmV0dXJuICJOZXRCSU9TIHJldHVybmVkIGFuIGVycm9yOiAgICAgIFRoZSBOQ0IgYW5kIFNNQiBhcmUgZHVtcGVkIGFib3ZlLiI7CisgICAgY2FzZSBORVJSX1JwbExvYWRyRGlza0VycjoKKyAgICAgIHJldHVybiAiQSBkaXNrIEkvTyBlcnJvciBvY2N1cnJlZC4iOworICAgIGNhc2UgTkVSUl9JbWFnZVBhcmFtRXJyOgorICAgICAgcmV0dXJuICJJbWFnZSBwYXJhbWV0ZXIgc3Vic3RpdHV0aW9uIGZhaWxlZC4iOworICAgIGNhc2UgTkVSUl9Ub29NYW55SW1hZ2VQYXJhbXM6CisgICAgICByZXR1cm4gIlRvbyBtYW55IGltYWdlIHBhcmFtZXRlcnMgY3Jvc3MgZGlzayBzZWN0b3IgYm91bmRhcmllcy4iOworICAgIGNhc2UgTkVSUl9Ob25Eb3NGbG9wcHlVc2VkOgorICAgICAgcmV0dXJuICJUaGUgaW1hZ2Ugd2FzIG5vdCBnZW5lcmF0ZWQgZnJvbSBhbiBNUy1ET1MgZGlza2V0dGUgZm9ybWF0dGVkIHdpdGggL1MuIjsKKyAgICBjYXNlIE5FUlJfUnBsQm9vdFJlc3RhcnQ6CisgICAgICByZXR1cm4gIlJlbW90ZSBib290IHdpbGwgYmUgcmVzdGFydGVkIGxhdGVyLiI7CisgICAgY2FzZSBORVJSX1JwbFNydnJDYWxsRmFpbGVkOgorICAgICAgcmV0dXJuICJUaGUgY2FsbCB0byB0aGUgUmVtb3RlYm9vdCBzZXJ2ZXIgZmFpbGVkLiI7CisgICAgY2FzZSBORVJSX0NhbnRDb25uZWN0UnBsU3J2cjoKKyAgICAgIHJldHVybiAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIFJlbW90ZWJvb3Qgc2VydmVyLiI7CisgICAgY2FzZSBORVJSX0NhbnRPcGVuSW1hZ2VGaWxlOgorICAgICAgcmV0dXJuICJDYW5ub3Qgb3BlbiBpbWFnZSBmaWxlIG9uIHRoZSBSZW1vdGVib290IHNlcnZlci4iOworICAgIGNhc2UgTkVSUl9DYWxsaW5nUnBsU3J2cjoKKyAgICAgIHJldHVybiAiQ29ubmVjdGluZyB0byB0aGUgUmVtb3RlYm9vdCBzZXJ2ZXIuLi4iOworICAgIGNhc2UgTkVSUl9TdGFydGluZ1JwbEJvb3Q6CisgICAgICByZXR1cm4gIkNvbm5lY3RpbmcgdG8gdGhlIFJlbW90ZWJvb3Qgc2VydmVyLi4uIjsKKyAgICBjYXNlIE5FUlJfUnBsQm9vdFNlcnZpY2VUZXJtOgorICAgICAgcmV0dXJuICJSZW1vdGUgYm9vdCBzZXJ2aWNlIHdhcyBzdG9wcGVkOyBjaGVjayB0aGUgZXJyb3IgbG9nIGZvciB0aGUgY2F1c2Ugb2YgdGhlIHByb2JsZW0uIjsKKyAgICBjYXNlIE5FUlJfUnBsQm9vdFN0YXJ0RmFpbGVkOgorICAgICAgcmV0dXJuICJSZW1vdGUgYm9vdCBzdGFydHVwIGZhaWxlZDsgY2hlY2sgdGhlIGVycm9yIGxvZyBmb3IgdGhlIGNhdXNlIG9mIHRoZSBwcm9ibGVtLiI7CisgICAgY2FzZSBORVJSX1JQTF9DT05ORUNURUQ6CisgICAgICByZXR1cm4gIkEgc2Vjb25kIGNvbm5lY3Rpb24gdG8gYSBSZW1vdGVib290IHJlc291cmNlIGlzIG5vdCBhbGxvd2VkLiI7CisgICAgY2FzZSBORVJSX0Jyb3dzZXJDb25maWd1cmVkVG9Ob3RSdW46CisgICAgICByZXR1cm4gIlRoZSBicm93c2VyIHNlcnZpY2Ugd2FzIGNvbmZpZ3VyZWQgd2l0aCBNYWludGFpblNlcnZlckxpc3Q9Tm8uIjsKKyAgICBjYXNlIE5FUlJfUnBsTm9BZGFwdGVyc1N0YXJ0ZWQ6CisgICAgICByZXR1cm4gIlNlcnZpY2UgZmFpbGVkIHRvIHN0YXJ0IHNpbmNlIG5vbmUgb2YgdGhlIG5ldHdvcmsgYWRhcHRlcnMgc3RhcnRlZCB3aXRoIHRoaXMgc2VydmljZS4iOworICAgIGNhc2UgTkVSUl9ScGxCYWRSZWdpc3RyeToKKyAgICAgIHJldHVybiAiU2VydmljZSBmYWlsZWQgdG8gc3RhcnQgZHVlIHRvIGJhZCBzdGFydHVwIGluZm9ybWF0aW9uIGluIHRoZSByZWdpc3RyeS4iOworICAgIGNhc2UgTkVSUl9ScGxCYWREYXRhYmFzZToKKyAgICAgIHJldHVybiAiU2VydmljZSBmYWlsZWQgdG8gc3RhcnQgYmVjYXVzZSBpdHMgZGF0YWJhc2UgaXMgYWJzZW50IG9yIGNvcnJ1cHQuIjsKKyAgICBjYXNlIE5FUlJfUnBsUnBsZmlsZXNTaGFyZToKKyAgICAgIHJldHVybiAiU2VydmljZSBmYWlsZWQgdG8gc3RhcnQgYmVjYXVzZSBSUExGSUxFUyBzaGFyZSBpcyBhYnNlbnQuIjsKKyAgICBjYXNlIE5FUlJfUnBsTm90UnBsU2VydmVyOgorICAgICAgcmV0dXJuICJTZXJ2aWNlIGZhaWxlZCB0byBzdGFydCBiZWNhdXNlIFJQTFVTRVIgZ3JvdXAgaXMgYWJzZW50LiI7CisgICAgY2FzZSBORVJSX1JwbENhbm5vdEVudW06CisgICAgICByZXR1cm4gIkNhbm5vdCBlbnVtZXJhdGUgc2VydmljZSByZWNvcmRzLiI7CisgICAgY2FzZSBORVJSX1JwbFdrc3RhSW5mb0NvcnJ1cHRlZDoKKyAgICAgIHJldHVybiAiV29ya3N0YXRpb24gcmVjb3JkIGluZm9ybWF0aW9uIGhhcyBiZWVuIGNvcnJ1cHRlZC4iOworICAgIGNhc2UgTkVSUl9ScGxXa3N0YU5vdEZvdW5kOgorICAgICAgcmV0dXJuICJXb3Jrc3RhdGlvbiByZWNvcmQgd2FzIG5vdCBmb3VuZC4iOworICAgIGNhc2UgTkVSUl9ScGxXa3N0YU5hbWVVbmF2YWlsYWJsZToKKyAgICAgIHJldHVybiAiV29ya3N0YXRpb24gbmFtZSBpcyBpbiB1c2UgYnkgc29tZSBvdGhlciB3b3Jrc3RhdGlvbi4iOworICAgIGNhc2UgTkVSUl9ScGxQcm9maWxlSW5mb0NvcnJ1cHRlZDoKKyAgICAgIHJldHVybiAiUHJvZmlsZSByZWNvcmQgaW5mb3JtYXRpb24gaGFzIGJlZW4gY29ycnVwdGVkLiI7CisgICAgY2FzZSBORVJSX1JwbFByb2ZpbGVOb3RGb3VuZDoKKyAgICAgIHJldHVybiAiUHJvZmlsZSByZWNvcmQgd2FzIG5vdCBmb3VuZC4iOworICAgIGNhc2UgTkVSUl9ScGxQcm9maWxlTmFtZVVuYXZhaWxhYmxlOgorICAgICAgcmV0dXJuICJQcm9maWxlIG5hbWUgaXMgaW4gdXNlIGJ5IHNvbWUgb3RoZXIgcHJvZmlsZS4iOworICAgIGNhc2UgTkVSUl9ScGxQcm9maWxlTm90RW1wdHk6CisgICAgICByZXR1cm4gIlRoZXJlIGFyZSB3b3Jrc3RhdGlvbnMgdXNpbmcgdGhpcyBwcm9maWxlLiI7CisgICAgY2FzZSBORVJSX1JwbENvbmZpZ0luZm9Db3JydXB0ZWQ6CisgICAgICByZXR1cm4gIkNvbmZpZ3VyYXRpb24gcmVjb3JkIGluZm9ybWF0aW9uIGhhcyBiZWVuIGNvcnJ1cHRlZC4iOworICAgIGNhc2UgTkVSUl9ScGxDb25maWdOb3RGb3VuZDoKKyAgICAgIHJldHVybiAiQ29uZmlndXJhdGlvbiByZWNvcmQgd2FzIG5vdCBmb3VuZC4iOworICAgIGNhc2UgTkVSUl9ScGxBZGFwdGVySW5mb0NvcnJ1cHRlZDoKKyAgICAgIHJldHVybiAiQWRhcHRlciBJRCByZWNvcmQgaW5mb3JtYXRpb24gaGFzIGJlZW4gY29ycnVwdGVkLiI7CisgICAgY2FzZSBORVJSX1JwbEludGVybmFsOgorICAgICAgcmV0dXJuICJBbiBpbnRlcm5hbCBzZXJ2aWNlIGVycm9yIGhhcyBvY2N1cnJlZC4iOworICAgIGNhc2UgTkVSUl9ScGxWZW5kb3JJbmZvQ29ycnVwdGVkOgorICAgICAgcmV0dXJuICJWZW5kb3IgSUQgcmVjb3JkIGluZm9ybWF0aW9uIGhhcyBiZWVuIGNvcnJ1cHRlZC4iOworICAgIGNhc2UgTkVSUl9ScGxCb290SW5mb0NvcnJ1cHRlZDoKKyAgICAgIHJldHVybiAiQm9vdCBibG9jayByZWNvcmQgaW5mb3JtYXRpb24gaGFzIGJlZW4gY29ycnVwdGVkLiI7CisgICAgY2FzZSBORVJSX1JwbFdrc3RhTmVlZHNVc2VyQWNjdDoKKyAgICAgIHJldHVybiAiVGhlIHVzZXIgYWNjb3VudCBmb3IgdGhpcyB3b3Jrc3RhdGlvbiByZWNvcmQgaXMgbWlzc2luZy4iOworICAgIGNhc2UgTkVSUl9ScGxOZWVkc1JQTFVTRVJBY2N0OgorICAgICAgcmV0dXJuICJUaGUgUlBMVVNFUiBsb2NhbCBncm91cCBjb3VsZCBub3QgYmUgZm91bmQuIjsKKyAgICBjYXNlIE5FUlJfUnBsQm9vdE5vdEZvdW5kOgorICAgICAgcmV0dXJuICJCb290IGJsb2NrIHJlY29yZCB3YXMgbm90IGZvdW5kLiI7CisgICAgY2FzZSBORVJSX1JwbEluY29tcGF0aWJsZVByb2ZpbGU6CisgICAgICByZXR1cm4gIkNob3NlbiBwcm9maWxlIGlzIGluY29tcGF0aWJsZSB3aXRoIHRoaXMgd29ya3N0YXRpb24uIjsKKyAgICBjYXNlIE5FUlJfUnBsQWRhcHRlck5hbWVVbmF2YWlsYWJsZToKKyAgICAgIHJldHVybiAiQ2hvc2VuIG5ldHdvcmsgYWRhcHRlciBJRCBpcyBpbiB1c2UgYnkgc29tZSBvdGhlciB3b3Jrc3RhdGlvbi4iOworICAgIGNhc2UgTkVSUl9ScGxDb25maWdOb3RFbXB0eToKKyAgICAgIHJldHVybiAiVGhlcmUgYXJlIHByb2ZpbGVzIHVzaW5nIHRoaXMgY29uZmlndXJhdGlvbi4iOworICAgIGNhc2UgTkVSUl9ScGxCb290SW5Vc2U6CisgICAgICByZXR1cm4gIlRoZXJlIGFyZSB3b3Jrc3RhdGlvbnMsIHByb2ZpbGVzLCBvciBjb25maWd1cmF0aW9ucyB1c2luZyB0aGlzIGJvb3QgYmxvY2suIjsKKyAgICBjYXNlIE5FUlJfUnBsQmFja3VwRGF0YWJhc2U6CisgICAgICByZXR1cm4gIlNlcnZpY2UgZmFpbGVkIHRvIGJhY2t1cCBSZW1vdGVib290IGRhdGFiYXNlLiI7CisgICAgY2FzZSBORVJSX1JwbEFkYXB0ZXJOb3RGb3VuZDoKKyAgICAgIHJldHVybiAiQWRhcHRlciByZWNvcmQgd2FzIG5vdCBmb3VuZC4iOworICAgIGNhc2UgTkVSUl9ScGxWZW5kb3JOb3RGb3VuZDoKKyAgICAgIHJldHVybiAiVmVuZG9yIHJlY29yZCB3YXMgbm90IGZvdW5kLiI7CisgICAgY2FzZSBORVJSX1JwbFZlbmRvck5hbWVVbmF2YWlsYWJsZToKKyAgICAgIHJldHVybiAiVmVuZG9yIG5hbWUgaXMgaW4gdXNlIGJ5IHNvbWUgb3RoZXIgdmVuZG9yIHJlY29yZC4iOworICAgIGNhc2UgTkVSUl9ScGxCb290TmFtZVVuYXZhaWxhYmxlOgorICAgICAgcmV0dXJuICIoYm9vdCBuYW1lLCB2ZW5kb3IgSUQpIGlzIGluIHVzZSBieSBzb21lIG90aGVyIGJvb3QgYmxvY2sgcmVjb3JkLiI7CisgICAgY2FzZSBORVJSX1JwbENvbmZpZ05hbWVVbmF2YWlsYWJsZToKKyAgICAgIHJldHVybiAiQ29uZmlndXJhdGlvbiBuYW1lIGlzIGluIHVzZSBieSBzb21lIG90aGVyIGNvbmZpZ3VyYXRpb24uIjsKKyAgICBjYXNlIE5FUlJfRGZzSW50ZXJuYWxDb3JydXB0aW9uOgorICAgICAgcmV0dXJuICJUaGUgaW50ZXJuYWwgZGF0YWJhc2UgbWFpbnRhaW5lZCBieSB0aGUgRGZzIHNlcnZpY2UgaXMgY29ycnVwdC4iOworICAgIGNhc2UgTkVSUl9EZnNWb2x1bWVEYXRhQ29ycnVwdDoKKyAgICAgIHJldHVybiAiT25lIG9mIHRoZSByZWNvcmRzIGluIHRoZSBpbnRlcm5hbCBEZnMgZGF0YWJhc2UgaXMgY29ycnVwdC4iOworICAgIGNhc2UgTkVSUl9EZnNOb1N1Y2hWb2x1bWU6CisgICAgICByZXR1cm4gIlRoZXJlIGlzIG5vIERGUyBuYW1lIHdob3NlIGVudHJ5IHBhdGggbWF0Y2hlcyB0aGUgaW5wdXQgRW50cnkgUGF0aC4iOworICAgIGNhc2UgTkVSUl9EZnNWb2x1bWVBbHJlYWR5RXhpc3RzOgorICAgICAgcmV0dXJuICJBIHJvb3Qgb3IgbGluayB3aXRoIHRoZSBnaXZlbiBuYW1lIGFscmVhZHkgZXhpc3RzLiI7CisgICAgY2FzZSBORVJSX0Rmc0FscmVhZHlTaGFyZWQ6CisgICAgICByZXR1cm4gIlRoZSBzZXJ2ZXIgc2hhcmUgc3BlY2lmaWVkIGlzIGFscmVhZHkgc2hhcmVkIGluIHRoZSBEZnMuIjsKKyAgICBjYXNlIE5FUlJfRGZzTm9TdWNoU2hhcmU6CisgICAgICByZXR1cm4gIlRoZSBpbmRpY2F0ZWQgc2VydmVyIHNoYXJlIGRvZXMgbm90IHN1cHBvcnQgdGhlIGluZGljYXRlZCBERlMgbmFtZXNwYWNlLiI7CisgICAgY2FzZSBORVJSX0Rmc05vdEFMZWFmVm9sdW1lOgorICAgICAgcmV0dXJuICJUaGUgb3BlcmF0aW9uIGlzIG5vdCB2YWxpZCBvbiB0aGlzIHBvcnRpb24gb2YgdGhlIG5hbWVzcGFjZS4iOworICAgIGNhc2UgTkVSUl9EZnNMZWFmVm9sdW1lOgorICAgICAgcmV0dXJuICJUaGUgb3BlcmF0aW9uIGlzIG5vdCB2YWxpZCBvbiB0aGlzIHBvcnRpb24gb2YgdGhlIG5hbWVzcGFjZS4iOworICAgIGNhc2UgTkVSUl9EZnNWb2x1bWVIYXNNdWx0aXBsZVNlcnZlcnM6CisgICAgICByZXR1cm4gIlRoZSBvcGVyYXRpb24gaXMgYW1iaWd1b3VzIGJlY2F1c2UgdGhlIGxpbmsgaGFzIG11bHRpcGxlIHNlcnZlcnMuIjsKKyAgICBjYXNlIE5FUlJfRGZzQ2FudENyZWF0ZUp1bmN0aW9uUG9pbnQ6CisgICAgICByZXR1cm4gIlVuYWJsZSB0byBjcmVhdGUgYSBsaW5rLiI7CisgICAgY2FzZSBORVJSX0Rmc1NlcnZlck5vdERmc0F3YXJlOgorICAgICAgcmV0dXJuICJUaGUgc2VydmVyIGlzIG5vdCBEZnMgQXdhcmUuIjsKKyAgICBjYXNlIE5FUlJfRGZzQmFkUmVuYW1lUGF0aDoKKyAgICAgIHJldHVybiAiVGhlIHNwZWNpZmllZCByZW5hbWUgdGFyZ2V0IHBhdGggaXMgaW52YWxpZC4iOworICAgIGNhc2UgTkVSUl9EZnNWb2x1bWVJc09mZmxpbmU6CisgICAgICByZXR1cm4gIlRoZSBzcGVjaWZpZWQgREZTIGxpbmsgaXMgb2ZmbGluZS4iOworICAgIGNhc2UgTkVSUl9EZnNOb1N1Y2hTZXJ2ZXI6CisgICAgICByZXR1cm4gIlRoZSBzcGVjaWZpZWQgc2VydmVyIGlzIG5vdCBhIHNlcnZlciBmb3IgdGhpcyBsaW5rLiI7CisgICAgY2FzZSBORVJSX0Rmc0N5Y2xpY2FsTmFtZToKKyAgICAgIHJldHVybiAiQSBjeWNsZSBpbiB0aGUgRGZzIG5hbWUgd2FzIGRldGVjdGVkLiI7CisgICAgY2FzZSBORVJSX0Rmc05vdFN1cHBvcnRlZEluU2VydmVyRGZzOgorICAgICAgcmV0dXJuICJUaGUgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgb24gYSBzZXJ2ZXItYmFzZWQgRGZzLiI7CisgICAgY2FzZSBORVJSX0Rmc0R1cGxpY2F0ZVNlcnZpY2U6CisgICAgICByZXR1cm4gIlRoaXMgbGluayBpcyBhbHJlYWR5IHN1cHBvcnRlZCBieSB0aGUgc3BlY2lmaWVkIHNlcnZlci1zaGFyZS4iOworICAgIGNhc2UgTkVSUl9EZnNDYW50UmVtb3ZlTGFzdFNlcnZlclNoYXJlOgorICAgICAgcmV0dXJuICJDYW4ndCByZW1vdmUgdGhlIGxhc3Qgc2VydmVyLXNoYXJlIHN1cHBvcnRpbmcgdGhpcyByb290IG9yIGxpbmsuIjsKKyAgICBjYXNlIE5FUlJfRGZzVm9sdW1lSXNJbnRlckRmczoKKyAgICAgIHJldHVybiAiVGhlIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGZvciBhbiBJbnRlci1ERlMgbGluay4iOworICAgIGNhc2UgTkVSUl9EZnNJbmNvbnNpc3RlbnQ6CisgICAgICByZXR1cm4gIlRoZSBpbnRlcm5hbCBzdGF0ZSBvZiB0aGUgRGZzIFNlcnZpY2UgaGFzIGJlY29tZSBpbmNvbnNpc3RlbnQuIjsKKyAgICBjYXNlIE5FUlJfRGZzU2VydmVyVXBncmFkZWQ6CisgICAgICByZXR1cm4gIlRoZSBEZnMgU2VydmljZSBoYXMgYmVlbiBpbnN0YWxsZWQgb24gdGhlIHNwZWNpZmllZCBzZXJ2ZXIuIjsKKyAgICBjYXNlIE5FUlJfRGZzRGF0YUlzSWRlbnRpY2FsOgorICAgICAgcmV0dXJuICJUaGUgRGZzIGRhdGEgYmVpbmcgcmVjb25jaWxlZCBpcyBpZGVudGljYWwuIjsKKyAgICBjYXNlIE5FUlJfRGZzQ2FudFJlbW92ZURmc1Jvb3Q6CisgICAgICByZXR1cm4gIlRoZSBERlMgcm9vdCBjYW5ub3QgYmUgZGVsZXRlZC4gVW5pbnN0YWxsIERGUyBpZiByZXF1aXJlZC4iOworICAgIGNhc2UgTkVSUl9EZnNDaGlsZE9yUGFyZW50SW5EZnM6CisgICAgICByZXR1cm4gIkEgY2hpbGQgb3IgcGFyZW50IGRpcmVjdG9yeSBvZiB0aGUgc2hhcmUgaXMgYWxyZWFkeSBpbiBhIERmcy4iOworICAgIGNhc2UgTkVSUl9EZnNJbnRlcm5hbEVycm9yOgorICAgICAgcmV0dXJuICJEZnMgaW50ZXJuYWwgZXJyb3IuIjsKKyAgICAgIC8qIHRoZSBmb2xsb3dpbmcgYXJlIG5vdCBkZWZpbmVkIGluIG1pbmd3ICovCisjaWYgMAorCisgICAgY2FzZSBORVJSX1NldHVwQWxyZWFkeUpvaW5lZDoKKyAgICAgIHJldHVybiAiVGhpcyBtYWNoaW5lIGlzIGFscmVhZHkgam9pbmVkIHRvIGEgZG9tYWluLiI7CisgICAgY2FzZSBORVJSX1NldHVwTm90Sm9pbmVkOgorICAgICAgcmV0dXJuICJUaGlzIG1hY2hpbmUgaXMgbm90IGN1cnJlbnRseSBqb2luZWQgdG8gYSBkb21haW4uIjsKKyAgICBjYXNlIE5FUlJfU2V0dXBEb21haW5Db250cm9sbGVyOgorICAgICAgcmV0dXJuICJUaGlzIG1hY2hpbmUgaXMgYSBkb21haW4gY29udHJvbGxlciBhbmQgY2Fubm90IGJlIHVuam9pbmVkIGZyb20gYSBkb21haW4uIjsKKyAgICBjYXNlIE5FUlJfRGVmYXVsdEpvaW5SZXF1aXJlZDoKKyAgICAgIHJldHVybiAiVGhlIGRlc3RpbmF0aW9uIGRvbWFpbiBjb250cm9sbGVyIGRvZXMgbm90IHN1cHBvcnQgY3JlYXRpbmcgbWFjaGluZSBhY2NvdW50cyBpbiBPVXMuIjsKKyAgICBjYXNlIE5FUlJfSW52YWxpZFdvcmtncm91cE5hbWU6CisgICAgICByZXR1cm4gIlRoZSBzcGVjaWZpZWQgd29ya2dyb3VwIG5hbWUgaXMgaW52YWxpZC4iOworICAgIGNhc2UgTkVSUl9OYW1lVXNlc0luY29tcGF0aWJsZUNvZGVQYWdlOgorICAgICAgcmV0dXJuICJUaGUgc3BlY2lmaWVkIGNvbXB1dGVyIG5hbWUgaXMgaW5jb21wYXRpYmxlIHdpdGggdGhlIGRlZmF1bHQgbGFuZ3VhZ2UgdXNlZCBvbiB0aGUgZG9tYWluIGNvbnRyb2xsZXIuIjsKKyAgICBjYXNlIE5FUlJfQ29tcHV0ZXJBY2NvdW50Tm90Rm91bmQ6CisgICAgICByZXR1cm4gIlRoZSBzcGVjaWZpZWQgY29tcHV0ZXIgYWNjb3VudCBjb3VsZCBub3QgYmUgZm91bmQuIjsKKyAgICBjYXNlIE5FUlJfUGVyc29uYWxTa3U6CisgICAgICByZXR1cm4gIlRoaXMgdmVyc2lvbiBvZiBXaW5kb3dzIGNhbm5vdCBiZSBqb2luZWQgdG8gYSBkb21haW4uIjsKKyAgICBjYXNlIE5FUlJfUGFzc3dvcmRNdXN0Q2hhbmdlOgorICAgICAgcmV0dXJuICJUaGUgcGFzc3dvcmQgbXVzdCBjaGFuZ2UgYXQgdGhlIG5leHQgbG9nb24uIjsKKyAgICBjYXNlIE5FUlJfQWNjb3VudExvY2tlZE91dDoKKyAgICAgIHJldHVybiAiVGhlIGFjY291bnQgaXMgbG9ja2VkIG91dC4iOworICAgIGNhc2UgTkVSUl9QYXNzd29yZFRvb0xvbmc6CisgICAgICByZXR1cm4gIlRoZSBwYXNzd29yZCBpcyB0b28gbG9uZy4iOworICAgIGNhc2UgTkVSUl9QYXNzd29yZE5vdENvbXBsZXhFbm91Z2g6CisgICAgICByZXR1cm4gIlRoZSBwYXNzd29yZCBkb2VzIG5vdCBtZWV0IHRoZSBjb21wbGV4aXR5IHBvbGljeS4iOworICAgIGNhc2UgTkVSUl9QYXNzd29yZEZpbHRlckVycm9yOgorICAgICAgcmV0dXJuICJUaGUgcGFzc3dvcmQgZG9lcyBub3QgbWVldCB0aGUgcmVxdWlyZW1lbnRzIG9mIHRoZSBwYXNzd29yZCBmaWx0ZXIgRExMcy4iOworI2VuZGlmCisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIG1zZyA9IHN0cmVycm9yIChlcnJvcl9udW1iZXIpOworCisgICAgICAgIGlmIChtc2cgPT0gTlVMTCkKKyAgICAgICAgICBtc2cgPSAidW5rbm93biI7CisKKyAgICAgICAgcmV0dXJuIG1zZzsKKyAgICB9CisjZW5kaWYgLy9EQlVTX1dJTkNFCit9CisKKy8qKgorICogR2V0IGEgcHJpbnRhYmxlIHN0cmluZyBkZXNjcmliaW5nIHRoZSBjb21tYW5kIHVzZWQgdG8gZXhlY3V0ZQorICogdGhlIHByb2Nlc3Mgd2l0aCBwaWQuICBUaGlzIHN0cmluZyBzaG91bGQgb25seSBiZSB1c2VkIGZvcgorICogaW5mb3JtYXRpdmUgcHVycG9zZXMgc3VjaCBhcyBsb2dnaW5nOyBpdCBtYXkgbm90IGJlIHRydXN0ZWQuCisgKgorICogVGhlIGNvbW1hbmQgaXMgZ3VhcmFudGVlZCB0byBiZSBwcmludGFibGUgQVNDSUkgYW5kIG5vIGxvbmdlcgorICogdGhhbiBtYXhfbGVuLgorICoKKyAqIEBwYXJhbSBwaWQgUHJvY2VzcyBpZAorICogQHBhcmFtIHN0ciBBcHBlbmQgY29tbWFuZCB0byB0aGlzIHN0cmluZworICogQHBhcmFtIG1heF9sZW4gTWF4aW11bSBsZW5ndGggb2YgcmV0dXJuZWQgY29tbWFuZAorICogQHBhcmFtIGVycm9yIHJldHVybiBsb2NhdGlvbiBmb3IgZXJyb3JzCisgKiBAcmV0dXJucyAjRkFMU0Ugb24gZXJyb3IKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2NvbW1hbmRfZm9yX3BpZCAodW5zaWduZWQgbG9uZyAgcGlkLAorICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgIG1heF9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgKmVycm9yKQoreworICAvLyBGSVhNRQorICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKgorICogUmVwbGFjZSB0aGUgREJVU19QUkVGSVggaW4gdGhlIGdpdmVuIHBhdGgsIGluLXBsYWNlLCBieSB0aGUKKyAqIGN1cnJlbnQgRC1CdXMgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeS4gT24gVW5peCB0aGlzIGZ1bmN0aW9uCisgKiBkb2VzIG5vdGhpbmcsIHN1Y2Nlc3NmdWxseS4KKyAqCisgKiBAcGFyYW0gcGF0aCBwYXRoIHRvIGVkaXQKKyAqIEByZXR1cm4gI0ZBTFNFIG9uIE9PTQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfcmVwbGFjZV9pbnN0YWxsX3ByZWZpeCAoREJ1c1N0cmluZyAqcGF0aCkKK3sKKyNpZm5kZWYgREJVU19QUkVGSVgKKyAgLyogbGVhdmUgcGF0aCB1bmNoYW5nZWQgKi8KKyAgcmV0dXJuIFRSVUU7CisjZWxzZQorICBEQnVzU3RyaW5nIHJ1bnRpbWVfcHJlZml4OworICBpbnQgaTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmcnVudGltZV9wcmVmaXgpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIV9kYnVzX2dldF9pbnN0YWxsX3Jvb3QgKCZydW50aW1lX3ByZWZpeCkpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZydW50aW1lX3ByZWZpeCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnJ1bnRpbWVfcHJlZml4KSA9PSAwKQorICAgIHsKKyAgICAgIC8qIGNhbm5vdCBkZXRlcm1pbmUgaW5zdGFsbCByb290LCBsZWF2ZSBwYXRoIHVuY2hhbmdlZCAqLworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZydW50aW1lX3ByZWZpeCk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgaWYgKF9kYnVzX3N0cmluZ19zdGFydHNfd2l0aF9jX3N0ciAocGF0aCwgREJVU19QUkVGSVggIi8iKSkKKyAgICB7CisgICAgICAvKiBSZXBsYWNlIERCVVNfUFJFRklYICIvIiB3aXRoIHJ1bnRpbWVfcHJlZml4LgorICAgICAgICogTm90ZSB1bnVzdWFsIGNhbGxpbmcgY29udmVudGlvbjogc291cmNlIGlzIGZpcnN0LCB0aGVuIGRlc3QgKi8KKyAgICAgIGlmICghX2RidXNfc3RyaW5nX3JlcGxhY2VfbGVuICgKKyAgICAgICAgICAgICZydW50aW1lX3ByZWZpeCwgMCwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZydW50aW1lX3ByZWZpeCksCisgICAgICAgICAgICBwYXRoLCAwLCBzdHJsZW4gKERCVVNfUFJFRklYKSArIDEpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZydW50aW1lX3ByZWZpeCk7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgfQorCisgIC8qIFNvbWVob3csIGluIHNvbWUgc2l0dWF0aW9ucywgYmFja3NsYXNoZXMgZ2V0IGNvbGxhcHNlZCBpbiB0aGUgc3RyaW5nLgorICAgKiBTaW5jZSB3aW5kb3dzIEMgbGlicmFyeSBhY2NlcHRzIGJvdGggZm9yd2FyZCBhbmQgYmFja3NsYXNoZXMgYXMKKyAgICogcGF0aCBzZXBhcmF0b3JzLCBjb252ZXJ0IGFsbCBiYWNrc2xhc2hlcyB0byBmb3J3YXJkIHNsYXNoZXMuCisgICAqLworCisgIGZvciAoaSA9IDA7IGkgPCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAocGF0aCk7IGkrKykKKyAgICB7CisgICAgICBpZiAoX2RidXNfc3RyaW5nX2dldF9ieXRlIChwYXRoLCBpKSA9PSAnXFwnKQorICAgICAgICBfZGJ1c19zdHJpbmdfc2V0X2J5dGUgKHBhdGgsIGksICcvJyk7CisgICAgfQorCisgIF9kYnVzX3N0cmluZ19mcmVlICgmcnVudGltZV9wcmVmaXgpOworICByZXR1cm4gVFJVRTsKKyNlbmRpZgorfQorCisjZGVmaW5lIERCVVNfU1RBTkRBUkRfU0VTU0lPTl9TRVJWSUNFRElSICIvZGJ1cy0xL3NlcnZpY2VzIgorI2RlZmluZSBEQlVTX1NUQU5EQVJEX1NZU1RFTV9TRVJWSUNFRElSICIvZGJ1cy0xL3N5c3RlbS1zZXJ2aWNlcyIKKworLyoqCisgKiBSZXR1cm5zIHRoZSBzdGFuZGFyZCBkaXJlY3RvcmllcyBmb3IgYSBzZXNzaW9uIGJ1cyB0byBsb29rIGZvcgorICogdHJhbnNpZW50IHNlcnZpY2UgYWN0aXZhdGlvbiBmaWxlcy4gT24gV2luZG93cywgdGhlcmUgYXJlIG5vbmUuCisgKgorICogQHBhcmFtIGRpcnMgdGhlIGRpcmVjdG9yeSBsaXN0IHdlIGFyZSByZXR1cm5pbmcKKyAqIEByZXR1cm5zICNUUlVFCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zZXRfdXBfdHJhbnNpZW50X3Nlc3Npb25fc2VydmljZWRpcnMgKERCdXNMaXN0ICAqKmRpcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgKmVycm9yKQoreworICAvKiBOb3QgYW4gZXJyb3IsIHdlIGp1c3QgZG9uJ3QgaGF2ZSB0cmFuc2llbnQgc2Vzc2lvbiBzZXJ2aWNlcyBvbiBXaW5kb3dzICovCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIFJldHVybnMgdGhlIHN0YW5kYXJkIGRpcmVjdG9yaWVzIGZvciBhIHNlc3Npb24gYnVzIHRvIGxvb2sgZm9yIHNlcnZpY2UKKyAqIGFjdGl2YXRpb24gZmlsZXMKKyAqCisgKiBPbiBXaW5kb3dzIHRoaXMgc2hvdWxkIGJlIGRhdGEgZGlyZWN0b3JpZXM6CisgKgorICogJUNvbW1vblByb2dyYW1GaWxlcyUvZGJ1cworICoKKyAqIGFuZAorICoKKyAqIHJlbG9jYXRlZCBEQlVTX0RBVEFESVIKKyAqCisgKiBAcGFyYW0gZGlycyB0aGUgZGlyZWN0b3J5IGxpc3Qgd2UgYXJlIHJldHVybmluZworICogQHJldHVybnMgI0ZBTFNFIG9uIE9PTQorICovCisKK2RidXNfYm9vbF90CitfZGJ1c19nZXRfc3RhbmRhcmRfc2Vzc2lvbl9zZXJ2aWNlZGlycyAoREJ1c0xpc3QgKipkaXJzKQoreworICBjb25zdCBjaGFyICpjb21tb25fcHJvZ3M7CisgIERCdXNTdHJpbmcgc2VydmljZWRpcl9wYXRoOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZzZXJ2aWNlZGlyX3BhdGgpKQorICAgIHJldHVybiBGQUxTRTsKKworI2lmZGVmIERCVVNfV0lOQ0UKKyAgeworICAgIC8qIE9uIFdpbmRvd3MgQ0UsIHdlIGFkanVzdCBkYXRhZGlyIGR5bmFtaWNhbGx5IHRvIGluc3RhbGxhdGlvbiBsb2NhdGlvbi4gICovCisgICAgY29uc3QgY2hhciAqZGF0YV9kaXIgPSBfZGJ1c19nZXRlbnYgKCJEQlVTX0RBVEFESVIiKTsKKworICAgIGlmIChkYXRhX2RpciAhPSBOVUxMKQorICAgICAgeworICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZzZXJ2aWNlZGlyX3BhdGgsIGRhdGFfZGlyKSkKKyAgICAgICAgICBnb3RvIG9vbTsKKworICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZzZXJ2aWNlZGlyX3BhdGgsIF9EQlVTX1BBVEhfU0VQQVJBVE9SKSkKKyAgICAgICAgICBnb3RvIG9vbTsKKyAgICAgIH0KKyAgfQorI2Vsc2UKKyAgeworICAgIERCdXNTdHJpbmcgcDsKKworICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZwKSkKKyAgICAgIGdvdG8gb29tOworCisgICAgLyogREJVU19EQVRBRElSIGlzIGFzc3VtZWQgdG8gYmUgYWJzb2x1dGU7IHRoZSBidWlsZCBzeXN0ZW1zIHNob3VsZAorICAgICAqIGVuc3VyZSB0aGF0LiAqLworICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnAsIERCVVNfREFUQURJUikgfHwKKyAgICAgICAgIV9kYnVzX3JlcGxhY2VfaW5zdGFsbF9wcmVmaXggKCZwKSkKKyAgICAgIHsKKyAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwKTsKKyAgICAgICAgZ290byBvb207CisgICAgICB9CisKKyAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZzZXJ2aWNlZGlyX3BhdGgsCisgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmcCkpKQorICAgICAgeworICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnApOworICAgICAgICBnb3RvIG9vbTsKKyAgICAgIH0KKworICAgIF9kYnVzX3N0cmluZ19mcmVlICgmcCk7CisgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZzZXJ2aWNlZGlyX3BhdGgsIF9EQlVTX1BBVEhfU0VQQVJBVE9SKSkKKyAgICBnb3RvIG9vbTsKKyNlbmRpZgorCisgIGNvbW1vbl9wcm9ncyA9IF9kYnVzX2dldGVudiAoIkNvbW1vblByb2dyYW1GaWxlcyIpOworCisgIGlmIChjb21tb25fcHJvZ3MgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZzZXJ2aWNlZGlyX3BhdGgsIGNvbW1vbl9wcm9ncykpCisgICAgICAgIGdvdG8gb29tOworCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZzZXJ2aWNlZGlyX3BhdGgsIF9EQlVTX1BBVEhfU0VQQVJBVE9SKSkKKyAgICAgICAgZ290byBvb207CisgICAgfQorCisgIGlmICghX2RidXNfc3BsaXRfcGF0aHNfYW5kX2FwcGVuZCAoJnNlcnZpY2VkaXJfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1NUQU5EQVJEX1NFU1NJT05fU0VSVklDRURJUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJzKSkKKyAgICBnb3RvIG9vbTsKKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnNlcnZpY2VkaXJfcGF0aCk7CisgIHJldHVybiBUUlVFOworCisgb29tOgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJnNlcnZpY2VkaXJfcGF0aCk7CisgIHJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBSZXR1cm5zIHRoZSBzdGFuZGFyZCBkaXJlY3RvcmllcyBmb3IgYSBzeXN0ZW0gYnVzIHRvIGxvb2sgZm9yIHNlcnZpY2UKKyAqIGFjdGl2YXRpb24gZmlsZXMKKyAqCisgKiBPbiBVTklYIHRoaXMgc2hvdWxkIGJlIHRoZSBzdGFuZGFyZCB4ZGcgZnJlZWRlc2t0b3Aub3JnIGRhdGEgZGlyZWN0b3JpZXM6CisgKgorICogWERHX0RBVEFfRElSUz0ke1hER19EQVRBX0RJUlMtL3Vzci9sb2NhbC9zaGFyZTovdXNyL3NoYXJlfQorICoKKyAqIGFuZAorICoKKyAqIERCVVNfREFUQURJUgorICoKKyAqIE9uIFdpbmRvd3MgdGhlcmUgaXMgbm8gc3lzdGVtIGJ1cyBhbmQgdGhpcyBmdW5jdGlvbiBjYW4gcmV0dXJuIG5vdGhpbmcuCisgKgorICogQHBhcmFtIGRpcnMgdGhlIGRpcmVjdG9yeSBsaXN0IHdlIGFyZSByZXR1cm5pbmcKKyAqIEByZXR1cm5zICNGQUxTRSBvbiBPT00KKyAqLworCitkYnVzX2Jvb2xfdAorX2RidXNfZ2V0X3N0YW5kYXJkX3N5c3RlbV9zZXJ2aWNlZGlycyAoREJ1c0xpc3QgKipkaXJzKQoreworICAqZGlycyA9IE5VTEw7CisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK19kYnVzX2dldF9jb25maWdfZmlsZV9uYW1lIChEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYmFzZW5hbWUpCit7CisgIERCdXNTdHJpbmcgdG1wOworCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoc3RyLCBEQlVTX0RBVEFESVIpIHx8CisgICAgICAhX2RidXNfcmVwbGFjZV9pbnN0YWxsX3ByZWZpeCAoc3RyKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZ0bXAsICJkYnVzLTEiKTsKKworICBpZiAoIV9kYnVzX2NvbmNhdF9kaXJfYW5kX2ZpbGUgKHN0ciwgJnRtcCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmdG1wLCBiYXNlbmFtZSk7CisKKyAgaWYgKCFfZGJ1c19jb25jYXRfZGlyX2FuZF9maWxlIChzdHIsICZ0bXApKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBHZXQgdGhlIGFic29sdXRlIHBhdGggb2YgdGhlIHN5c3RlbS5jb25mIGZpbGUKKyAqICh0aGVyZSBpcyBubyBzeXN0ZW0gYnVzIG9uIFdpbmRvd3Mgc28gdGhpcyBjYW4ganVzdAorICogcmV0dXJuIEZBTFNFIGFuZCBwcmludCBhIHdhcm5pbmcgb3Igc29tZXRoaW5nKQorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZyB0byBhcHBlbmQgdG8sIHdoaWNoIG11c3QgYmUgZW1wdHkgb24gZW50cnkKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBubyBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2dldF9zeXN0ZW1fY29uZmlnX2ZpbGUgKERCdXNTdHJpbmcgKnN0cikKK3sKKyAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoc3RyKSA9PSAwKTsKKworICByZXR1cm4gX2RidXNfZ2V0X2NvbmZpZ19maWxlX25hbWUoc3RyLCAic3lzdGVtLmNvbmYiKTsKK30KKworLyoqCisgKiBHZXQgdGhlIGFic29sdXRlIHBhdGggb2YgdGhlIHNlc3Npb24uY29uZiBmaWxlLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZyB0byBhcHBlbmQgdG8sIHdoaWNoIG11c3QgYmUgZW1wdHkgb24gZW50cnkKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBubyBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2dldF9zZXNzaW9uX2NvbmZpZ19maWxlIChEQnVzU3RyaW5nICpzdHIpCit7CisgIF9kYnVzX2Fzc2VydCAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHN0cikgPT0gMCk7CisKKyAgcmV0dXJuIF9kYnVzX2dldF9jb25maWdfZmlsZV9uYW1lKHN0ciwgInNlc3Npb24uY29uZiIpOworfQorCisjaWZkZWYgREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMKKworI2RlZmluZSBBTk9OWU1PVVNfU0lEICJTLTEtNS03IgorI2RlZmluZSBMT0NBTF9TWVNURU1fU0lEICJTLTEtNS0xOCIKKworZGJ1c19ib29sX3QKK19kYnVzX3Rlc3RfYXBwZW5kX2RpZmZlcmVudF91aWQgKERCdXNTdHJpbmcgKnVpZCkKK3sKKyAgY2hhciAqc2lkID0gTlVMTDsKKyAgZGJ1c19ib29sX3QgcmV0OworCisgIGlmICghX2RidXNfZ2V0c2lkICgmc2lkLCBfZGJ1c19nZXRwaWQgKCkpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoc3RyY21wIChzaWQsIEFOT05ZTU9VU19TSUQpID09IDApCisgICAgcmV0ID0gX2RidXNfc3RyaW5nX2FwcGVuZCAodWlkLCBMT0NBTF9TWVNURU1fU0lEKTsKKyAgZWxzZQorICAgIHJldCA9IF9kYnVzX3N0cmluZ19hcHBlbmQgKHVpZCwgQU5PTllNT1VTX1NJRCk7CisKKyAgTG9jYWxGcmVlIChzaWQpOworICByZXR1cm4gcmV0OworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1zeXNkZXBzLXV0aWwuYyBiL2RidXMvZGJ1cy1zeXNkZXBzLXV0aWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGNjNmEyCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLXN5c2RlcHMtdXRpbC5jCkBAIC0wLDAgKzEsMjAxIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtc3lzZGVwcy11dGlsLmMgVGVzdHMgZm9yIGRidXMtc3lzZGVwcy5oIEFQSQorICogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUgIFJlZCBIYXQsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwMyBDb2RlRmFjdG9yeSBBQgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiZGJ1cy1zeXNkZXBzLmgiCisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKyNpbmNsdWRlICJkYnVzLXN0cmluZy5oIgorI2luY2x1ZGUgImRidXMtdGVzdC5oIgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpZmRlZiBEQlVTX1dJTgorICAvKiBkbyBub3RoaW5nLCBpdCdzIGluIHN0ZGxpYi5oICovCisjZWxpZiAoZGVmaW5lZCBfX0FQUExFX18pCisjIGluY2x1ZGUgPGNydF9leHRlcm5zLmg+CisjIGRlZmluZSBlbnZpcm9uICgqX05TR2V0RW52aXJvbigpKQorI2VsaWYgSEFWRV9ERUNMX0VOVklST04gJiYgZGVmaW5lZChIQVZFX1VOSVNURF9IKQorIyBpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbHNlCitleHRlcm4gY2hhciAqKmVudmlyb247CisjZW5kaWYKKworLyoqCisgKiBHZXRzIGEgI05VTEwtdGVybWluYXRlZCBsaXN0IG9mIGtleT12YWx1ZSBwYWlycyBmcm9tIHRoZQorICogZW52aXJvbm1lbnQuIFVzZSBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5IHRvIGZyZWUgaXQuCisgKgorICogQHJldHVybnMgdGhlIGVudmlyb25tZW50IG9yICNOVUxMIG9uIE9PTQorICovCitjaGFyICoqCitfZGJ1c19nZXRfZW52aXJvbm1lbnQgKHZvaWQpCit7CisgIGludCBpLCBsZW5ndGg7CisgIGNoYXIgKiplbnZpcm9ubWVudDsKKworICBfZGJ1c19hc3NlcnQgKGVudmlyb24gIT0gTlVMTCk7CisKKyAgZm9yIChsZW5ndGggPSAwOyBlbnZpcm9uW2xlbmd0aF0gIT0gTlVMTDsgbGVuZ3RoKyspOworCisgIC8qIEFkZCBvbmUgZm9yIE5VTEwgKi8KKyAgbGVuZ3RoKys7CisKKyAgZW52aXJvbm1lbnQgPSBkYnVzX25ldzAgKGNoYXIgKiwgbGVuZ3RoKTsKKworICBpZiAoZW52aXJvbm1lbnQgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBmb3IgKGkgPSAwOyBlbnZpcm9uW2ldICE9IE5VTEw7IGkrKykKKyAgICB7CisgICAgICBlbnZpcm9ubWVudFtpXSA9IF9kYnVzX3N0cmR1cCAoZW52aXJvbltpXSk7CisKKyAgICAgIGlmIChlbnZpcm9ubWVudFtpXSA9PSBOVUxMKQorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgaWYgKGVudmlyb25baV0gIT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5IChlbnZpcm9ubWVudCk7CisgICAgICBlbnZpcm9ubWVudCA9IE5VTEw7CisgICAgfQorCisgIHJldHVybiBlbnZpcm9ubWVudDsKK30KKworI2lmZGVmIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTCitzdGF0aWMgdm9pZAorY2hlY2tfZGlybmFtZSAoY29uc3QgY2hhciAqZmlsZW5hbWUsCisgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkaXJuYW1lKQoreworICBEQnVzU3RyaW5nIGYsIGQ7CisgIAorICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJmYsIGZpbGVuYW1lKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmZCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5Iik7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfZ2V0X2Rpcm5hbWUgKCZmLCAmZCkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgibm8gbWVtb3J5Iik7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfZXF1YWxfY19zdHIgKCZkLCBkaXJuYW1lKSkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiRm9yIGZpbGVuYW1lIFwiJXNcIiBnb3QgZGlybmFtZSBcIiVzXCIgYW5kIGV4cGVjdGVkIFwiJXNcIiIsCisgICAgICAgICAgICAgICAgICBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmQpLAorICAgICAgICAgICAgICAgICAgZGlybmFtZSk7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZkKTsKK30KKworc3RhdGljIHZvaWQKK2NoZWNrX3BhdGhfYWJzb2x1dGUgKGNvbnN0IGNoYXIgKnBhdGgsCisgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCBleHBlY3RlZCkKK3sKKyAgREJ1c1N0cmluZyBwOworCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmcCwgcGF0aCk7CisKKyAgaWYgKF9kYnVzX3BhdGhfaXNfYWJzb2x1dGUgKCZwKSAhPSBleHBlY3RlZCkKKyAgICB7CisgICAgICBfZGJ1c193YXJuICgiRm9yIHBhdGggXCIlc1wiIGV4cGVjdGVkIGFic29sdXRlID0gJWQgZ290ICVkIiwKKyAgICAgICAgICAgICAgICAgIHBhdGgsIGV4cGVjdGVkLCBfZGJ1c19wYXRoX2lzX2Fic29sdXRlICgmcCkpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorfQorCisvKioKKyAqIFVuaXQgdGVzdCBmb3IgZGJ1cy1zeXNkZXBzLmMuCisgKiAKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zeXNkZXBzX3Rlc3QgKHZvaWQpCit7CisjaWZkZWYgREJVU19XSU4KKyAgY2hlY2tfZGlybmFtZSAoImZvb1xcYmFyIiwgImZvbyIpOworICBjaGVja19kaXJuYW1lICgiZm9vXFxcXGJhciIsICJmb28iKTsKKyAgY2hlY2tfZGlybmFtZSAoImZvby9cXC9iYXIiLCAiZm9vIik7CisgIGNoZWNrX2Rpcm5hbWUgKCJmb29cXGJhci8iLCAiZm9vIik7CisgIGNoZWNrX2Rpcm5hbWUgKCJmb28vL2JhclxcIiwgImZvbyIpOworICBjaGVja19kaXJuYW1lICgiZm9vXFxiYXIvIiwgImZvbyIpOworICBjaGVja19kaXJuYW1lICgiZm9vL2JhclxcXFwiLCAiZm9vIik7CisgIGNoZWNrX2Rpcm5hbWUgKCJcXGZvbyIsICJcXCIpOworICBjaGVja19kaXJuYW1lICgiXFxcXGZvbyIsICJcXCIpOworICBjaGVja19kaXJuYW1lICgiXFwiLCAiXFwiKTsKKyAgY2hlY2tfZGlybmFtZSAoIlxcXFwiLCAiXFwiKTsKKyAgY2hlY2tfZGlybmFtZSAoIlxcLyIsICJcXCIpOworICBjaGVja19kaXJuYW1lICgiL1xcLyIsICIvIik7CisgIGNoZWNrX2Rpcm5hbWUgKCJjOlxcZm9vXFxiYXIiLCAiYzpcXGZvbyIpOworICBjaGVja19kaXJuYW1lICgiYzpcXGZvbyIsICJjOlxcIik7CisgIGNoZWNrX2Rpcm5hbWUgKCJjOi9mb28iLCAiYzovIik7CisgIGNoZWNrX2Rpcm5hbWUgKCJjOlxcIiwgImM6XFwiKTsKKyAgY2hlY2tfZGlybmFtZSAoImM6LyIsICJjOi8iKTsKKyAgY2hlY2tfZGlybmFtZSAoIiIsICIuIik7ICAKKyNlbHNlICAKKyAgY2hlY2tfZGlybmFtZSAoImZvbyIsICIuIik7CisgIGNoZWNrX2Rpcm5hbWUgKCJmb28vYmFyIiwgImZvbyIpOworICBjaGVja19kaXJuYW1lICgiZm9vLy9iYXIiLCAiZm9vIik7CisgIGNoZWNrX2Rpcm5hbWUgKCJmb28vLy9iYXIiLCAiZm9vIik7CisgIGNoZWNrX2Rpcm5hbWUgKCJmb28vYmFyLyIsICJmb28iKTsKKyAgY2hlY2tfZGlybmFtZSAoImZvby8vYmFyLyIsICJmb28iKTsKKyAgY2hlY2tfZGlybmFtZSAoImZvby8vL2Jhci8iLCAiZm9vIik7CisgIGNoZWNrX2Rpcm5hbWUgKCJmb28vYmFyLy8iLCAiZm9vIik7CisgIGNoZWNrX2Rpcm5hbWUgKCJmb28vL2Jhci8vLy8iLCAiZm9vIik7CisgIGNoZWNrX2Rpcm5hbWUgKCJmb28vLy9iYXIvLy8vLy8vIiwgImZvbyIpOworICBjaGVja19kaXJuYW1lICgiL2ZvbyIsICIvIik7CisgIGNoZWNrX2Rpcm5hbWUgKCIvLy8vZm9vIiwgIi8iKTsKKyAgY2hlY2tfZGlybmFtZSAoIi9mb28vYmFyIiwgIi9mb28iKTsKKyAgY2hlY2tfZGlybmFtZSAoIi9mb28vL2JhciIsICIvZm9vIik7CisgIGNoZWNrX2Rpcm5hbWUgKCIvZm9vLy8vYmFyIiwgIi9mb28iKTsKKyAgY2hlY2tfZGlybmFtZSAoIi8iLCAiLyIpOworICBjaGVja19kaXJuYW1lICgiLy8vIiwgIi8iKTsKKyAgY2hlY2tfZGlybmFtZSAoIiIsICIuIik7ICAKKyNlbmRpZgorCisjaWZkZWYgREJVU19XSU4KKyAgY2hlY2tfcGF0aF9hYnNvbHV0ZSAoImM6LyIsIFRSVUUpOworICBjaGVja19wYXRoX2Fic29sdXRlICgiYzovZm9vIiwgVFJVRSk7CisgIGNoZWNrX3BhdGhfYWJzb2x1dGUgKCIiLCBGQUxTRSk7CisgIGNoZWNrX3BhdGhfYWJzb2x1dGUgKCJmb28iLCBGQUxTRSk7CisgIGNoZWNrX3BhdGhfYWJzb2x1dGUgKCJmb28vYmFyIiwgRkFMU0UpOworICBjaGVja19wYXRoX2Fic29sdXRlICgiIiwgRkFMU0UpOworICBjaGVja19wYXRoX2Fic29sdXRlICgiZm9vXFxiYXIiLCBGQUxTRSk7CisgIGNoZWNrX3BhdGhfYWJzb2x1dGUgKCJjOlxcIiwgVFJVRSk7CisgIGNoZWNrX3BhdGhfYWJzb2x1dGUgKCJjOlxcZm9vIiwgVFJVRSk7CisgIGNoZWNrX3BhdGhfYWJzb2x1dGUgKCJjOiIsIFRSVUUpOworICBjaGVja19wYXRoX2Fic29sdXRlICgiYzpcXGZvb1xcYmFyIiwgVFJVRSk7CisgIGNoZWNrX3BhdGhfYWJzb2x1dGUgKCJcXCIsIFRSVUUpOworICBjaGVja19wYXRoX2Fic29sdXRlICgiLyIsIFRSVUUpOworI2Vsc2UgIAorICBjaGVja19wYXRoX2Fic29sdXRlICgiLyIsIFRSVUUpOworICBjaGVja19wYXRoX2Fic29sdXRlICgiL2ZvbyIsIFRSVUUpOworICBjaGVja19wYXRoX2Fic29sdXRlICgiIiwgRkFMU0UpOworICBjaGVja19wYXRoX2Fic29sdXRlICgiZm9vIiwgRkFMU0UpOworICBjaGVja19wYXRoX2Fic29sdXRlICgiZm9vL2JhciIsIEZBTFNFKTsKKyNlbmRpZgorICAKKyAgcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYgLyogREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMgKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy1zeXNkZXBzLXdpbi5jIGIvZGJ1cy9kYnVzLXN5c2RlcHMtd2luLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRlZWRlYQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy1zeXNkZXBzLXdpbi5jCkBAIC0wLDAgKzEsMzc0NiBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXN5c2RlcHMuYyBXcmFwcGVycyBhcm91bmQgc3lzdGVtL2xpYmMgZmVhdHVyZXMgKGludGVybmFsIHRvIEQtQlVTIGltcGxlbWVudGF0aW9uKQorICogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMgIFJlZCBIYXQsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwMyBDb2RlRmFjdG9yeSBBQgorICogQ29weXJpZ2h0IChDKSAyMDA1IE5vdmVsbCwgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDA2IFBldGVyIEvDvG1tZWwgIDxzeW50aGV0aWNwcEBnbXgubmV0PgorICogQ29weXJpZ2h0IChDKSAyMDA2IENocmlzdGlhbiBFaHJsaWNoZXIgPGNoLmVocmxpY2hlckBnbXguZGU+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMyBSYWxmIEhhYmFja2VyIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKworI2RlZmluZSBTVFJTQUZFX05PX0RFUFJFQ0FURQorCisjaWZuZGVmIERCVVNfV0lOQ0UKKyNpZm5kZWYgX1dJTjMyX1dJTk5UCisjZGVmaW5lIF9XSU4zMl9XSU5OVCAweDA1MDEKKyNlbmRpZgorI2VuZGlmCisKKyNpbmNsdWRlICJkYnVzLWludGVybmFscy5oIgorI2luY2x1ZGUgImRidXMtc2hhLmgiCisjaW5jbHVkZSAiZGJ1cy1zeXNkZXBzLmgiCisjaW5jbHVkZSAiZGJ1cy10aHJlYWRzLmgiCisjaW5jbHVkZSAiZGJ1cy1wcm90b2NvbC5oIgorI2luY2x1ZGUgImRidXMtc3RyaW5nLmgiCisjaW5jbHVkZSAiZGJ1cy1zeXNkZXBzLmgiCisjaW5jbHVkZSAiZGJ1cy1zeXNkZXBzLXdpbi5oIgorI2luY2x1ZGUgImRidXMtcHJvdG9jb2wuaCIKKyNpbmNsdWRlICJkYnVzLWhhc2guaCIKKyNpbmNsdWRlICJkYnVzLXNvY2tldHMtd2luLmgiCisjaW5jbHVkZSAiZGJ1cy1saXN0LmgiCisjaW5jbHVkZSAiZGJ1cy1ub25jZS5oIgorI2luY2x1ZGUgImRidXMtY3JlZGVudGlhbHMuaCIKKworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRlIDx3aW5jcnlwdC5oPgorI2luY2x1ZGUgPGlwaGxwYXBpLmg+CisKKy8qIERlY2xhcmF0aW9ucyBtaXNzaW5nIGluIG1pbmd3J3MgYW5kIHdpbmRvd3Mgc2RrIDcuMCBoZWFkZXJzICovCitleHRlcm4gQk9PTCBXSU5BUEkgQ29udmVydFN0cmluZ1NpZFRvU2lkQSAoTFBDU1RSICBTdHJpbmdTaWQsIFBTSUQgKlNpZCk7CitleHRlcm4gQk9PTCBXSU5BUEkgQ29udmVydFNpZFRvU3RyaW5nU2lkQSAoUFNJRCBTaWQsIExQU1RSICpTdHJpbmdTaWQpOworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2lmIEhBVkVfRVJSTk9fSAorI2luY2x1ZGUgPGVycm5vLmg+CisjZW5kaWYKKyNpZm5kZWYgREJVU19XSU5DRQorI2luY2x1ZGUgPG1ic3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9XUzJUQ1BJUF9ICisvKiBnZXRhZGRyaW5mbyBmb3IgV2luZG93cyBDRSAoYW5kIFdpbmRvd3MpLiAgKi8KKyNpbmNsdWRlIDx3czJ0Y3BpcC5oPgorI2VuZGlmCisKKyNpZm5kZWYgT19CSU5BUlkKKyNkZWZpbmUgT19CSU5BUlkgMAorI2VuZGlmCisKKyNpZm5kZWYgUFJPQ0VTU19RVUVSWV9MSU1JVEVEX0lORk9STUFUSU9OCisvKiBNaW5HVzMyIDwgNCBkb2VzIG5vdCBkZWZpbmUgdGhpcyB2YWx1ZSBpbiBpdHMgaGVhZGVycyAqLworI2RlZmluZSBQUk9DRVNTX1FVRVJZX0xJTUlURURfSU5GT1JNQVRJT04gKDB4MTAwMCkKKyNlbmRpZgorCit0eXBlZGVmIGludCBzb2NrbGVuX3Q7CisKKwordm9pZAorX2RidXNfd2luX3NldF9lcnJubyAoaW50IGVycikKK3sKKyNpZmRlZiBEQlVTX1dJTkNFCisgIFNldExhc3RFcnJvciAoZXJyKTsKKyNlbHNlCisgIGVycm5vID0gZXJyOworI2VuZGlmCit9CisKK3N0YXRpYyBCT09MIGlzX3dpbnhwX3NwM19vcl9sb3dlciAodm9pZCk7CisKKy8qCisgKiBfTUlCX1RDUFJPV19FWCBhbmQgZnJpZW5kcyBhcmUgbm90IGF2YWlsYWJsZSBpbiBzeXN0ZW0gaGVhZGVycworICogIGFuZCBhcmUgbWFwcGVkIHRvIGF0dHJpYnV0ZSBpZGVudGljYWwgLi4uT1dORVJfUElEIHR5cGVkZWZzLgorICovCit0eXBlZGVmIE1JQl9UQ1BST1dfT1dORVJfUElEIF9NSUJfVENQUk9XX0VYOwordHlwZWRlZiBNSUJfVENQVEFCTEVfT1dORVJfUElEIE1JQl9UQ1BUQUJMRV9FWDsKK3R5cGVkZWYgUE1JQl9UQ1BUQUJMRV9PV05FUl9QSUQgUE1JQl9UQ1BUQUJMRV9FWDsKK3R5cGVkZWYgRFdPUkQgKFdJTkFQSSAqUHJvY0FsbG9jYXRlQW5kR2V0VGNwRXh0VGFibGVGcm9tU3RhY2spKFBNSUJfVENQVEFCTEVfRVgqLEJPT0wsSEFORExFLERXT1JELERXT1JEKTsKK3N0YXRpYyBQcm9jQWxsb2NhdGVBbmRHZXRUY3BFeHRUYWJsZUZyb21TdGFjayBscGZuQWxsb2NhdGVBbmRHZXRUY3BFeFRhYmxlRnJvbVN0YWNrID0gTlVMTDsKKworLyoqCisgKiBBbGxvY2F0ZUFuZEdldFRjcEV4VGFibGVGcm9tU3RhY2soKSBpcyB1bmRvY3VtZW50ZWQgYW5kIG5vdCBleHBvcnRlZCwKKyAqIGJ1dCBpcyB0aGUgb25seSB3YXkgdG8gZG8gdGhpcyBpbiBvbGRlciBYUCB2ZXJzaW9ucy4KKyAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcHJvY2VkdXJlcyBjb3VsZCBiZSBsb2FkZWQKKyAqLworc3RhdGljIEJPT0wKK2xvYWRfZXhfaXBfaGVscGVyX3Byb2NlZHVyZXModm9pZCkKK3sKKyAgSE1PRFVMRSBoTW9kdWxlID0gTG9hZExpYnJhcnkgKCJpcGhscGFwaS5kbGwiKTsKKyAgaWYgKGhNb2R1bGUgPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiY291bGQgbm90IGxvYWQgaXBobHBhcGkuZGxsXG4iKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgbHBmbkFsbG9jYXRlQW5kR2V0VGNwRXhUYWJsZUZyb21TdGFjayA9IChQcm9jQWxsb2NhdGVBbmRHZXRUY3BFeHRUYWJsZUZyb21TdGFjaylHZXRQcm9jQWRkcmVzcyAoaE1vZHVsZSwgIkFsbG9jYXRlQW5kR2V0VGNwRXhUYWJsZUZyb21TdGFjayIpOworICBpZiAobHBmbkFsbG9jYXRlQW5kR2V0VGNwRXhUYWJsZUZyb21TdGFjayA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJjb3VsZCBub3QgZmluZCBmdW5jdGlvbiBBbGxvY2F0ZUFuZEdldFRjcEV4VGFibGVGcm9tU3RhY2sgaW4gaXBobHBhcGkuZGxsXG4iKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIGdldCBwaWQgZnJvbSBsb2NhbGhvc3QgdGNwIGNvbm5lY3Rpb24gdXNpbmcgcGVlcl9wb3J0CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGF2YWlsYWJsZSBvbiBXaW5YUCA+PSBTUDMKKyAqIEBwYXJhbSBwZWVyX3BvcnQgcGVlcnMgdGNwIHBvcnQKKyAqIEByZXR1cm4gcHJvY2VzcyBpZCBvciAwIGlmIGNvbm5lY3Rpb24gaGFzIG5vdCBiZWVuIGZvdW5kCisgKi8KK3N0YXRpYyBkYnVzX3BpZF90CitnZXRfcGlkX2Zyb21fZXh0ZW5kZWRfdGNwX3RhYmxlKGludCBwZWVyX3BvcnQpCit7CisgIGRidXNfcGlkX3QgcmVzdWx0OworICBEV09SRCBlcnJvckNvZGUsIHNpemUgPSAwLCBpOworICBNSUJfVENQVEFCTEVfT1dORVJfUElEICp0Y3BfdGFibGU7CisKKyAgaWYgKChlcnJvckNvZGUgPQorICAgICAgIEdldEV4dGVuZGVkVGNwVGFibGUgKE5VTEwsICZzaXplLCBUUlVFLCBBRl9JTkVULCBUQ1BfVEFCTEVfT1dORVJfUElEX0FMTCwgMCkpID09IEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpCisgICAgeworICAgICAgdGNwX3RhYmxlID0gKE1JQl9UQ1BUQUJMRV9PV05FUl9QSUQgKikgZGJ1c19tYWxsb2MgKHNpemUpOworICAgICAgaWYgKHRjcF90YWJsZSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkVycm9yIGFsbG9jYXRpbmcgbWVtb3J5XG4iKTsKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9kYnVzX3dpbl93YXJuX3dpbl9lcnJvciAoInVuZXhwZWN0ZWQgZXJyb3IgcmV0dXJuZWQgZnJvbSBHZXRFeHRlbmRlZFRjcFRhYmxlIiwgZXJyb3JDb2RlKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICBpZiAoKGVycm9yQ29kZSA9IEdldEV4dGVuZGVkVGNwVGFibGUgKHRjcF90YWJsZSwgJnNpemUsIFRSVUUsIEFGX0lORVQsIFRDUF9UQUJMRV9PV05FUl9QSURfQUxMLCAwKSkgIT0gTk9fRVJST1IpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIkVycm9yIGZldGNoaW5nIHRjcCB0YWJsZSAlZFxuIiwgKGludCllcnJvckNvZGUpOworICAgICAgZGJ1c19mcmVlICh0Y3BfdGFibGUpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIHJlc3VsdCA9IDA7CisgIGZvciAoaSA9IDA7IGkgPCB0Y3BfdGFibGUtPmR3TnVtRW50cmllczsgaSsrKQorICAgIHsKKyAgICAgIE1JQl9UQ1BST1dfT1dORVJfUElEICpwID0gJnRjcF90YWJsZS0+dGFibGVbaV07CisgICAgICBpbnQgbG9jYWxfYWRkcmVzcyA9IG50b2hsIChwLT5kd0xvY2FsQWRkcik7CisgICAgICBpbnQgbG9jYWxfcG9ydCA9IG50b2hzIChwLT5kd0xvY2FsUG9ydCk7CisgICAgICBpZiAocC0+ZHdTdGF0ZSA9PSBNSUJfVENQX1NUQVRFX0VTVEFCCisgICAgICAgICAgJiYgbG9jYWxfYWRkcmVzcyA9PSBJTkFERFJfTE9PUEJBQ0sgJiYgbG9jYWxfcG9ydCA9PSBwZWVyX3BvcnQpCisgICAgICAgICByZXN1bHQgPSBwLT5kd093bmluZ1BpZDsKKyAgICB9CisKKyAgZGJ1c19mcmVlICh0Y3BfdGFibGUpOworICBfZGJ1c192ZXJib3NlICgiZ290IHBpZCAlbHVcbiIsIHJlc3VsdCk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogZ2V0IHBpZCBmcm9tIGxvY2FsaG9zdCB0Y3AgY29ubmVjdGlvbiB1c2luZyBwZWVyX3BvcnQKKyAqIFRoaXMgZnVuY3Rpb24gaXMgYXZhaWxhYmxlIG9uIGFsbCBXaW5YUCB2ZXJzaW9ucywgYnV0CisgKiBub3QgaW4gd2luZSAoYXQgbGVhc3QgdmVyc2lvbiA8PSAxLjYuMCkKKyAqIEBwYXJhbSBwZWVyX3BvcnQgcGVlcnMgdGNwIHBvcnQKKyAqIEByZXR1cm4gcHJvY2VzcyBpZCBvciAwIGlmIGNvbm5lY3Rpb24gaGFzIG5vdCBiZWVuIGZvdW5kCisgKi8KK3N0YXRpYyBkYnVzX3BpZF90CitnZXRfcGlkX2Zyb21fdGNwX2V4X3RhYmxlKGludCBwZWVyX3BvcnQpCit7CisgIGRidXNfcGlkX3QgcmVzdWx0OworICBEV09SRCBlcnJvckNvZGUsIGk7CisgIFBNSUJfVENQVEFCTEVfRVggdGNwX3RhYmxlID0gTlVMTDsKKworICBpZiAoIWxvYWRfZXhfaXBfaGVscGVyX3Byb2NlZHVyZXMgKCkpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZQorICAgICAgICAoIkVycm9yIG5vdCBiZWVuIGFibGUgdG8gbG9hZCBpcGhlbHBlciBwcm9jZWR1cmVzXG4iKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICBlcnJvckNvZGUgPSBscGZuQWxsb2NhdGVBbmRHZXRUY3BFeFRhYmxlRnJvbVN0YWNrICgmdGNwX3RhYmxlLCBUUlVFLCBHZXRQcm9jZXNzSGVhcCgpLCAwLCAyKTsKKworICBpZiAoZXJyb3JDb2RlICE9IE5PX0VSUk9SKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UKKyAgICAgICAgKCJFcnJvciBub3QgYmVlbiBhYmxlIHRvIGNhbGwgQWxsb2NhdGVBbmRHZXRUY3BFeFRhYmxlRnJvbVN0YWNrKClcbiIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIHJlc3VsdCA9IDA7CisgIGZvciAoaSA9IDA7IGkgPCB0Y3BfdGFibGUtPmR3TnVtRW50cmllczsgaSsrKQorICAgIHsKKyAgICAgIF9NSUJfVENQUk9XX0VYICpwID0gJnRjcF90YWJsZS0+dGFibGVbaV07CisgICAgICBpbnQgbG9jYWxfcG9ydCA9IG50b2hzIChwLT5kd0xvY2FsUG9ydCk7CisgICAgICBpbnQgbG9jYWxfYWRkcmVzcyA9IG50b2hsIChwLT5kd0xvY2FsQWRkcik7CisgICAgICBpZiAobG9jYWxfYWRkcmVzcyA9PSBJTkFERFJfTE9PUEJBQ0sgJiYgbG9jYWxfcG9ydCA9PSBwZWVyX3BvcnQpCisgICAgICAgIHsKKyAgICAgICAgICByZXN1bHQgPSBwLT5kd093bmluZ1BpZDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICBIZWFwRnJlZSAoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgdGNwX3RhYmxlKTsKKyAgX2RidXNfdmVyYm9zZSAoImdvdCBwaWQgJWx1XG4iLCByZXN1bHQpOworICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIEBicmllZiByZXR1cm4gcGVlciBwcm9jZXNzIGlkIGZyb20gdGNwIGhhbmRsZSBmb3IgbG9jYWxob3N0IGNvbm5lY3Rpb25zCisgKiBAcGFyYW0gaGFuZGxlIHRjcCBzb2NrZXQgZGVzY3JpcHRvcgorICogQHJldHVybiBwcm9jZXNzIGlkIG9yIDAgaW4gY2FzZSB0aGUgcHJvY2VzcyBpZCBjb3VsZCBub3QgYmUgZmV0Y2hlZAorICovCitzdGF0aWMgZGJ1c19waWRfdAorX2RidXNfZ2V0X3BlZXJfcGlkX2Zyb21fdGNwX2hhbmRsZSAoaW50IGhhbmRsZSkKK3sKKyAgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgYWRkcjsKKyAgc29ja2xlbl90IGxlbiA9IHNpemVvZiAoYWRkcik7CisgIGludCBwZWVyX3BvcnQ7CisKKyAgZGJ1c19waWRfdCByZXN1bHQ7CisgIGRidXNfYm9vbF90IGlzX2xvY2FsaG9zdCA9IEZBTFNFOworCisgIGdldHBlZXJuYW1lIChoYW5kbGUsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmFkZHIsICZsZW4pOworCisgIGlmIChhZGRyLnNzX2ZhbWlseSA9PSBBRl9JTkVUKQorICAgIHsKKyAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbiAqcyA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgJmFkZHI7CisgICAgICBwZWVyX3BvcnQgPSBudG9ocyAocy0+c2luX3BvcnQpOworICAgICAgaXNfbG9jYWxob3N0ID0gKG50b2hsIChzLT5zaW5fYWRkci5zX2FkZHIpID09IElOQUREUl9MT09QQkFDSyk7CisgICAgfQorICBlbHNlIGlmIChhZGRyLnNzX2ZhbWlseSA9PSBBRl9JTkVUNikKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiRklYTUUgWzYxOTIyXTogSVBWNiBzdXBwb3J0IG5vdCB3b3JraW5nIG9uIHdpbmRvd3NcbiIpOworICAgICAgcmV0dXJuIDA7CisgICAgICAvKgorICAgICAgICAgc3RydWN0IHNvY2thZGRyX2luNiAqcyA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICogKSZhZGRyOworICAgICAgICAgcGVlcl9wb3J0ID0gbnRvaHMgKHMtPnNpbjZfcG9ydCk7CisgICAgICAgICBpc19sb2NhbGhvc3QgPSAobWVtY21wKHMtPnNpbjZfYWRkci5zNl9hZGRyLCBpbjZhZGRyX2xvb3BiYWNrLnM2X2FkZHIsIDE2KSA9PSAwKTsKKyAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJJUFY2ICUwOHggJTA4eFxuIiwgcy0+c2luNl9hZGRyLnM2X2FkZHIsIGluNmFkZHJfbG9vcGJhY2suczZfYWRkcik7CisgICAgICAgKi8KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgibm8gaWRlYSB3aGF0IGFkZHJlc3MgZmFtaWx5ICVkIGlzXG4iLCBhZGRyLnNzX2ZhbWlseSk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgaWYgKCFpc19sb2NhbGhvc3QpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoImNvdWxkIG5vdCBmZXRjaCBwcm9jZXNzIGlkIGZyb20gcmVtb3RlIHByb2Nlc3NcbiIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIGlmIChwZWVyX3BvcnQgPT0gMCkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlCisgICAgICAgICgiRXJyb3Igbm90IGJlZW4gYWJsZSB0byBmZXRjaCB0Y3AgcGVlciBwb3J0IGZyb20gY29ubmVjdGlvblxuIik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgX2RidXNfdmVyYm9zZSAoInRyeWluZyB0byBnZXQgcGVlcidzIHBpZFxuIik7CisKKyAgcmVzdWx0ID0gZ2V0X3BpZF9mcm9tX2V4dGVuZGVkX3RjcF90YWJsZSAocGVlcl9wb3J0KTsKKyAgaWYgKHJlc3VsdCA+IDApCisgICAgICByZXR1cm4gcmVzdWx0OworICByZXN1bHQgPSBnZXRfcGlkX2Zyb21fdGNwX2V4X3RhYmxlIChwZWVyX3BvcnQpOworICByZXR1cm4gcmVzdWx0OworfQorCisvKiBDb252ZXJ0IEdldExhc3RFcnJvcigpIHRvIGEgZGJ1cyBlcnJvci4gICovCitjb25zdCBjaGFyKgorX2RidXNfd2luX2Vycm9yX2Zyb21fbGFzdF9lcnJvciAodm9pZCkKK3sKKyAgc3dpdGNoIChHZXRMYXN0RXJyb3IoKSkKKyAgICB7CisgICAgY2FzZSAwOgorICAgICAgcmV0dXJuIERCVVNfRVJST1JfRkFJTEVEOworICAgIAorICAgIGNhc2UgRVJST1JfTk9fTU9SRV9GSUxFUzoKKyAgICBjYXNlIEVSUk9SX1RPT19NQU5ZX09QRU5fRklMRVM6CisgICAgICByZXR1cm4gREJVU19FUlJPUl9MSU1JVFNfRVhDRUVERUQ7IC8qIGtlcm5lbCBvdXQgb2YgbWVtb3J5ICovCisKKyAgICBjYXNlIEVSUk9SX0FDQ0VTU19ERU5JRUQ6CisgICAgY2FzZSBFUlJPUl9DQU5OT1RfTUFLRToKKyAgICAgIHJldHVybiBEQlVTX0VSUk9SX0FDQ0VTU19ERU5JRUQ7CisKKyAgICBjYXNlIEVSUk9SX05PVF9FTk9VR0hfTUVNT1JZOgorICAgICAgcmV0dXJuIERCVVNfRVJST1JfTk9fTUVNT1JZOworCisgICAgY2FzZSBFUlJPUl9GSUxFX0VYSVNUUzoKKyAgICAgIHJldHVybiBEQlVTX0VSUk9SX0ZJTEVfRVhJU1RTOworCisgICAgY2FzZSBFUlJPUl9GSUxFX05PVF9GT1VORDoKKyAgICBjYXNlIEVSUk9SX1BBVEhfTk9UX0ZPVU5EOgorICAgICAgcmV0dXJuIERCVVNfRVJST1JfRklMRV9OT1RfRk9VTkQ7CisKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIERCVVNfRVJST1JfRkFJTEVEOworICAgIH0KK30KKworCitjaGFyKgorX2RidXNfd2luX2Vycm9yX3N0cmluZyAoaW50IGVycm9yX251bWJlcikKK3sKKyAgY2hhciAqbXNnOworCisgIEZvcm1hdE1lc3NhZ2VBIChGT1JNQVRfTUVTU0FHRV9BTExPQ0FURV9CVUZGRVIgfAorICAgICAgICAgICAgICAgICAgRk9STUFUX01FU1NBR0VfSUdOT1JFX0lOU0VSVFMgfAorICAgICAgICAgICAgICAgICAgRk9STUFUX01FU1NBR0VfRlJPTV9TWVNURU0sCisgICAgICAgICAgICAgICAgICBOVUxMLCBlcnJvcl9udW1iZXIsIDAsCisgICAgICAgICAgICAgICAgICAoTFBTVFIpICZtc2csIDAsIE5VTEwpOworCisgIGlmIChtc2dbc3RybGVuIChtc2cpIC0gMV0gPT0gJ1xuJykKKyAgICBtc2dbc3RybGVuIChtc2cpIC0gMV0gPSAnXDAnOworICBpZiAobXNnW3N0cmxlbiAobXNnKSAtIDFdID09ICdccicpCisgICAgbXNnW3N0cmxlbiAobXNnKSAtIDFdID0gJ1wwJzsKKworICByZXR1cm4gbXNnOworfQorCit2b2lkCitfZGJ1c193aW5fZnJlZV9lcnJvcl9zdHJpbmcgKGNoYXIgKnN0cmluZykKK3sKKyAgTG9jYWxGcmVlIChzdHJpbmcpOworfQorCisvKioKKyAqIFNvY2tldCBpbnRlcmZhY2UKKyAqCisgKi8KKworLyoqCisgKiBUaGluIHdyYXBwZXIgYXJvdW5kIHRoZSByZWFkKCkgc3lzdGVtIGNhbGwgdGhhdCBhcHBlbmRzCisgKiB0aGUgZGF0YSBpdCByZWFkcyB0byB0aGUgREJ1c1N0cmluZyBidWZmZXIuIEl0IGFwcGVuZHMKKyAqIHVwIHRvIHRoZSBnaXZlbiBjb3VudCwgYW5kIHJldHVybnMgdGhlIHNhbWUgdmFsdWUKKyAqIGFuZCBzYW1lIGVycm5vIGFzIHJlYWQoKS4gVGhlIG9ubHkgZXhjZXB0aW9uIGlzIHRoYXQKKyAqIF9kYnVzX3JlYWRfc29ja2V0KCkgaGFuZGxlcyBFSU5UUiBmb3IgeW91LiAKKyAqIF9kYnVzX3JlYWRfc29ja2V0KCkgY2FuIHJldHVybiBFTk9NRU0sIGV2ZW4gdGhvdWdoIAorICogcmVndWxhciBVTklYIHJlYWQgZG9lc24ndC4KKyAqCisgKiBAcGFyYW0gZmQgdGhlIGZpbGUgZGVzY3JpcHRvciB0byByZWFkIGZyb20KKyAqIEBwYXJhbSBidWZmZXIgdGhlIGJ1ZmZlciB0byBhcHBlbmQgZGF0YSB0bworICogQHBhcmFtIGNvdW50IHRoZSBhbW91bnQgb2YgZGF0YSB0byByZWFkCisgKiBAcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgb3IgLTEKKyAqLworCitpbnQKK19kYnVzX3JlYWRfc29ja2V0IChEQnVzU29ja2V0ICAgICAgICBmZCwKKyAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgY291bnQpCit7CisgIGludCBieXRlc19yZWFkOworICBpbnQgc3RhcnQ7CisgIGNoYXIgKmRhdGE7CisKKyAgX2RidXNfYXNzZXJ0IChjb3VudCA+PSAwKTsKKworICBzdGFydCA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChidWZmZXIpOworCisgIGlmICghX2RidXNfc3RyaW5nX2xlbmd0aGVuIChidWZmZXIsIGNvdW50KSkKKyAgICB7CisgICAgICBfZGJ1c193aW5fc2V0X2Vycm5vIChFTk9NRU0pOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICBkYXRhID0gX2RidXNfc3RyaW5nX2dldF9kYXRhX2xlbiAoYnVmZmVyLCBzdGFydCwgY291bnQpOworCisgYWdhaW46CisgCisgIF9kYnVzX3ZlcmJvc2UgKCJyZWN2OiBjb3VudD0lZCBmZD0lSXVcbiIsIGNvdW50LCBmZC5zb2NrKTsKKyAgYnl0ZXNfcmVhZCA9IHJlY3YgKGZkLnNvY2ssIGRhdGEsIGNvdW50LCAwKTsKKyAgCisgIGlmIChieXRlc19yZWFkID09IFNPQ0tFVF9FUlJPUikKKwl7CisJICBEQlVTX1NPQ0tFVF9TRVRfRVJSTk8oKTsKKwkgIF9kYnVzX3ZlcmJvc2UgKCJyZWN2OiBmYWlsZWQ6ICVzICglZClcbiIsIF9kYnVzX3N0cmVycm9yIChlcnJubyksIGVycm5vKTsKKwkgIGJ5dGVzX3JlYWQgPSAtMTsKKwl9CisJZWxzZQorCSAgX2RidXNfdmVyYm9zZSAoInJlY3Y6ID0gJWRcbiIsIGJ5dGVzX3JlYWQpOworCisgIGlmIChieXRlc19yZWFkIDwgMCkKKyAgICB7CisgICAgICBpZiAoZXJybm8gPT0gRUlOVFIpCisgICAgICAgIGdvdG8gYWdhaW47CisgICAgICBlbHNlICAgIAkKKyAgICAgICAgeworICAgICAgICAgIC8qIHB1dCBsZW5ndGggYmFjayAobm90ZSB0aGF0IHRoaXMgZG9lc24ndCBhY3R1YWxseSByZWFsbG9jIGFueXRoaW5nKSAqLworICAgICAgICAgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoIChidWZmZXIsIHN0YXJ0KTsKKyAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBwdXQgbGVuZ3RoIGJhY2sgKGRvZXNuJ3QgYWN0dWFsbHkgcmVhbGxvYykgKi8KKyAgICAgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoIChidWZmZXIsIHN0YXJ0ICsgYnl0ZXNfcmVhZCk7CisKKyNpZiAwCisgICAgICBpZiAoYnl0ZXNfcmVhZCA+IDApCisgICAgICAgIF9kYnVzX3ZlcmJvc2VfYnl0ZXNfb2Zfc3RyaW5nIChidWZmZXIsIHN0YXJ0LCBieXRlc19yZWFkKTsKKyNlbmRpZgorCisgICAgICByZXR1cm4gYnl0ZXNfcmVhZDsKKyAgICB9Cit9CisKKy8qKgorICogVGhpbiB3cmFwcGVyIGFyb3VuZCB0aGUgd3JpdGUoKSBzeXN0ZW0gY2FsbCB0aGF0IHdyaXRlcyBhIHBhcnQgb2YgYQorICogREJ1c1N0cmluZyBhbmQgaGFuZGxlcyBFSU5UUiBmb3IgeW91LgorICogCisgKiBAcGFyYW0gZmQgdGhlIGZpbGUgZGVzY3JpcHRvciB0byB3cml0ZQorICogQHBhcmFtIGJ1ZmZlciB0aGUgYnVmZmVyIHRvIHdyaXRlIGRhdGEgZnJvbQorICogQHBhcmFtIHN0YXJ0IHRoZSBmaXJzdCBieXRlIGluIHRoZSBidWZmZXIgdG8gd3JpdGUKKyAqIEBwYXJhbSBsZW4gdGhlIG51bWJlciBvZiBieXRlcyB0byB0cnkgdG8gd3JpdGUKKyAqIEByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiBvciAtMSBvbiBlcnJvcgorICovCitpbnQKK19kYnVzX3dyaXRlX3NvY2tldCAoREJ1c1NvY2tldCAgICAgICAgZmQsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGxlbikKK3sKKyAgY29uc3QgY2hhciAqZGF0YTsKKyAgaW50IGJ5dGVzX3dyaXR0ZW47CisKKyAgZGF0YSA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YV9sZW4gKGJ1ZmZlciwgc3RhcnQsIGxlbik7CisKKyBhZ2FpbjoKKworICBfZGJ1c192ZXJib3NlICgic2VuZDogbGVuPSVkIGZkPSVJdVxuIiwgbGVuLCBmZC5zb2NrKTsKKyAgYnl0ZXNfd3JpdHRlbiA9IHNlbmQgKGZkLnNvY2ssIGRhdGEsIGxlbiwgMCk7CisKKyAgaWYgKGJ5dGVzX3dyaXR0ZW4gPT0gU09DS0VUX0VSUk9SKQorICAgIHsKKyAgICAgIERCVVNfU09DS0VUX1NFVF9FUlJOTygpOworICAgICAgX2RidXNfdmVyYm9zZSAoInNlbmQ6IGZhaWxlZDogJXNcbiIsIF9kYnVzX3N0cmVycm9yX2Zyb21fZXJybm8gKCkpOworICAgICAgYnl0ZXNfd3JpdHRlbiA9IC0xOworICAgIH0KKyAgICBlbHNlCisgICAgICBfZGJ1c192ZXJib3NlICgic2VuZDogPSAlZFxuIiwgYnl0ZXNfd3JpdHRlbik7CisKKyAgaWYgKGJ5dGVzX3dyaXR0ZW4gPCAwICYmIGVycm5vID09IEVJTlRSKQorICAgIGdvdG8gYWdhaW47CisgICAgCisjaWYgMAorICBpZiAoYnl0ZXNfd3JpdHRlbiA+IDApCisgICAgX2RidXNfdmVyYm9zZV9ieXRlc19vZl9zdHJpbmcgKGJ1ZmZlciwgc3RhcnQsIGJ5dGVzX3dyaXR0ZW4pOworI2VuZGlmCisKKyAgcmV0dXJuIGJ5dGVzX3dyaXR0ZW47Cit9CisKKworLyoqCisgKiBDbG9zZXMgYSBmaWxlIGRlc2NyaXB0b3IuCisgKgorICogQHBhcmFtIGZkIHRoZSBmaWxlIGRlc2NyaXB0b3IKKyAqIEBwYXJhbSBlcnJvciBlcnJvciBvYmplY3QKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBlcnJvciBzZXQKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2Nsb3NlX3NvY2tldCAoREJ1c1NvY2tldCBmZCwKKyAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICplcnJvcikKK3sKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyBhZ2FpbjoKKyAgaWYgKGNsb3Nlc29ja2V0IChmZC5zb2NrKSA9PSBTT0NLRVRfRVJST1IpCisgICAgeworICAgICAgREJVU19TT0NLRVRfU0VUX0VSUk5PICgpOworICAgICAgCisgICAgICBpZiAoZXJybm8gPT0gRUlOVFIpCisgICAgICAgIGdvdG8gYWdhaW47CisgICAgICAgIAorICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBjbG9zZSBzb2NrZXQ6IHNvY2tldD0lSXUsICwgJXMiLAorICAgICAgICAgICAgICAgICAgICAgIGZkLnNvY2ssIF9kYnVzX3N0cmVycm9yX2Zyb21fZXJybm8gKCkpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgX2RidXNfdmVyYm9zZSAoInNvY2tldD0lSXUsIFxuIiwgZmQuc29jayk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogU2V0cyB0aGUgZmlsZSBkZXNjcmlwdG9yIHRvIGJlIGNsb3NlCisgKiBvbiBleGVjLiBTaG91bGQgYmUgY2FsbGVkIGZvciBhbGwgZmlsZQorICogZGVzY3JpcHRvcnMgaW4gRC1CdXMgY29kZS4KKyAqCisgKiBAcGFyYW0gaGFuZGxlIHRoZSBXaW5kb3dzIEhBTkRMRSAoYSBTT0NLRVQgaXMgYWxzbyBPSykKKyAqLworc3RhdGljIHZvaWQKK19kYnVzX3dpbl9oYW5kbGVfc2V0X2Nsb3NlX29uX2V4ZWMgKEhBTkRMRSBoYW5kbGUpCit7CisgIGlmICggIVNldEhhbmRsZUluZm9ybWF0aW9uKCAoSEFORExFKSBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkxBR19JTkhFUklUIHwgSEFORExFX0ZMQUdfUFJPVEVDVF9GUk9NX0NMT1NFLAorICAgICAgICAgICAgICAgICAgICAgICAgMCAvKmRpc2FibGUgYm90aCBmbGFncyovICkgKQorICAgIHsKKyAgICAgIF9kYnVzX3dpbl93YXJuX3dpbl9lcnJvciAoIkRpc2FibGluZyBzb2NrZXQgaGFuZGxlIGluaGVyaXRhbmNlIGZhaWxlZDoiLCBHZXRMYXN0RXJyb3IoKSk7CisgICAgfQorfQorCisvKioKKyAqIFNldHMgYSBmaWxlIGRlc2NyaXB0b3IgdG8gYmUgbm9uYmxvY2tpbmcuCisgKgorICogQHBhcmFtIGhhbmRsZSB0aGUgZmlsZSBkZXNjcmlwdG9yLgorICogQHBhcmFtIGVycm9yIGFkZHJlc3Mgb2YgZXJyb3IgbG9jYXRpb24uCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzLgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc2V0X3NvY2tldF9ub25ibG9ja2luZyAoREJ1c1NvY2tldCAgICAgIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgdV9sb25nIG9uZSA9IDE7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgaWYgKGlvY3Rsc29ja2V0IChoYW5kbGUuc29jaywgRklPTkJJTywgJm9uZSkgPT0gU09DS0VUX0VSUk9SKQorICAgIHsKKyAgICAgIERCVVNfU09DS0VUX1NFVF9FUlJOTyAoKTsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gc2V0IHNvY2tldCAlSXUgdG8gbm9uYmxvY2tpbmc6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBoYW5kbGUuc29jaywgX2RidXNfc3RyZXJyb3JfZnJvbV9lcnJubyAoKSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCisKKy8qKgorICogTGlrZSBfZGJ1c193cml0ZSgpIGJ1dCB3aWxsIHVzZSB3cml0ZXYoKSBpZiBwb3NzaWJsZQorICogdG8gd3JpdGUgYm90aCBidWZmZXJzIGluIHNlcXVlbmNlLiBUaGUgcmV0dXJuIHZhbHVlCisgKiBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gaW4gdGhlIGZpcnN0IGJ1ZmZlciwKKyAqIHBsdXMgdGhlIG51bWJlciB3cml0dGVuIGluIHRoZSBzZWNvbmQuIElmIHRoZSBmaXJzdAorICogYnVmZmVyIGlzIHdyaXR0ZW4gc3VjY2Vzc2Z1bGx5IGFuZCBhbiBlcnJvciBvY2N1cnMKKyAqIHdyaXRpbmcgdGhlIHNlY29uZCwgdGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUgZmlyc3QKKyAqIGlzIHJldHVybmVkIChpLmUuIHRoZSBlcnJvciBpcyBpZ25vcmVkKSwgb24gc3lzdGVtcyB0aGF0CisgKiBkb24ndCBoYXZlIHdyaXRldi4gSGFuZGxlcyBFSU5UUiBmb3IgeW91LgorICogVGhlIHNlY29uZCBidWZmZXIgbWF5IGJlICNOVUxMLgorICoKKyAqIEBwYXJhbSBmZCB0aGUgZmlsZSBkZXNjcmlwdG9yCisgKiBAcGFyYW0gYnVmZmVyMSBmaXJzdCBidWZmZXIKKyAqIEBwYXJhbSBzdGFydDEgZmlyc3QgYnl0ZSB0byB3cml0ZSBpbiBmaXJzdCBidWZmZXIKKyAqIEBwYXJhbSBsZW4xIG51bWJlciBvZiBieXRlcyB0byB3cml0ZSBmcm9tIGZpcnN0IGJ1ZmZlcgorICogQHBhcmFtIGJ1ZmZlcjIgc2Vjb25kIGJ1ZmZlciwgb3IgI05VTEwKKyAqIEBwYXJhbSBzdGFydDIgZmlyc3QgYnl0ZSB0byB3cml0ZSBpbiBzZWNvbmQgYnVmZmVyCisgKiBAcGFyYW0gbGVuMiBudW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUgaW4gc2Vjb25kIGJ1ZmZlcgorICogQHJldHVybnMgdG90YWwgYnl0ZXMgd3JpdHRlbiBmcm9tIGJvdGggYnVmZmVycywgb3IgLTEgb24gZXJyb3IKKyAqLworaW50CitfZGJ1c193cml0ZV9zb2NrZXRfdHdvIChEQnVzU29ja2V0ICAgICAgICBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmJ1ZmZlcjEsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydDEsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBsZW4xLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqYnVmZmVyMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHN0YXJ0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGxlbjIpCit7CisgIFdTQUJVRiB2ZWN0b3JzWzJdOworICBjb25zdCBjaGFyICpkYXRhMTsKKyAgY29uc3QgY2hhciAqZGF0YTI7CisgIGludCByYzsKKyAgRFdPUkQgYnl0ZXNfd3JpdHRlbjsKKworICBfZGJ1c19hc3NlcnQgKGJ1ZmZlcjEgIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAoc3RhcnQxID49IDApOworICBfZGJ1c19hc3NlcnQgKHN0YXJ0MiA+PSAwKTsKKyAgX2RidXNfYXNzZXJ0IChsZW4xID49IDApOworICBfZGJ1c19hc3NlcnQgKGxlbjIgPj0gMCk7CisKKworICBkYXRhMSA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YV9sZW4gKGJ1ZmZlcjEsIHN0YXJ0MSwgbGVuMSk7CisKKyAgaWYgKGJ1ZmZlcjIgIT0gTlVMTCkKKyAgICBkYXRhMiA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YV9sZW4gKGJ1ZmZlcjIsIHN0YXJ0MiwgbGVuMik7CisgIGVsc2UKKyAgICB7CisgICAgICBkYXRhMiA9IE5VTEw7CisgICAgICBzdGFydDIgPSAwOworICAgICAgbGVuMiA9IDA7CisgICAgfQorCisgIHZlY3RvcnNbMF0uYnVmID0gKGNoYXIqKSBkYXRhMTsKKyAgdmVjdG9yc1swXS5sZW4gPSBsZW4xOworICB2ZWN0b3JzWzFdLmJ1ZiA9IChjaGFyKikgZGF0YTI7CisgIHZlY3RvcnNbMV0ubGVuID0gbGVuMjsKKworIGFnYWluOgorIAorICBfZGJ1c192ZXJib3NlICgiV1NBU2VuZDogbGVuMSsyPSVkKyVkIGZkPSVJdVxuIiwgbGVuMSwgbGVuMiwgZmQuc29jayk7CisgIHJjID0gV1NBU2VuZCAoZmQuc29jaywKKyAgICAgICAgICAgICAgICB2ZWN0b3JzLAorICAgICAgICAgICAgICAgIGRhdGEyID8gMiA6IDEsIAorICAgICAgICAgICAgICAgICZieXRlc193cml0dGVuLAorICAgICAgICAgICAgICAgIDAsIAorICAgICAgICAgICAgICAgIE5VTEwsIAorICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICAgICAgICAgIAorICBpZiAocmMgPT0gU09DS0VUX0VSUk9SKQorICAgIHsKKyAgICAgIERCVVNfU09DS0VUX1NFVF9FUlJOTyAoKTsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJXU0FTZW5kOiBmYWlsZWQ6ICVzXG4iLCBfZGJ1c19zdHJlcnJvcl9mcm9tX2Vycm5vICgpKTsKKyAgICAgIGJ5dGVzX3dyaXR0ZW4gPSAoRFdPUkQpIC0xOworICAgIH0KKyAgZWxzZQorICAgIF9kYnVzX3ZlcmJvc2UgKCJXU0FTZW5kOiA9ICVsZFxuIiwgYnl0ZXNfd3JpdHRlbik7CisgICAgCisgIGlmIChieXRlc193cml0dGVuID09IChEV09SRCkgLTEgJiYgZXJybm8gPT0gRUlOVFIpCisgICAgZ290byBhZ2FpbjsKKyAgICAgIAorICByZXR1cm4gYnl0ZXNfd3JpdHRlbjsKK30KKworI2lmIDAKKworLyoqCisgKiBPcGVucyB0aGUgY2xpZW50IHNpZGUgb2YgYSBXaW5kb3dzIG5hbWVkIHBpcGUuIFRoZSBjb25uZWN0aW9uIEQtQlVTCisgKiBmaWxlIGRlc2NyaXB0b3IgaW5kZXggaXMgcmV0dXJuZWQuIEl0IGlzIHNldCB1cCBhcyBub25ibG9ja2luZy4KKyAqIAorICogQHBhcmFtIHBhdGggdGhlIHBhdGggdG8gbmFtZWQgcGlwZSBzb2NrZXQKKyAqIEBwYXJhbSBlcnJvciByZXR1cm4gbG9jYXRpb24gZm9yIGVycm9yIGNvZGUKKyAqIEByZXR1cm5zIGNvbm5lY3Rpb24gRC1CVVMgZmlsZSBkZXNjcmlwdG9yIG9yIC0xIG9uIGVycm9yCisgKi8KK2ludAorX2RidXNfY29ubmVjdF9uYW1lZF9waXBlIChjb25zdCBjaGFyICAgICAqcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJub3QgaW1wbGVtZW50ZWQiKTsKK30KKworI2VuZGlmCisKKy8qKgorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfd2luX3N0YXJ0dXBfd2luc29jayAodm9pZCkKK3sKKyAgLyogU3RyYWlnaHQgZnJvbSBNU0ROLCBkZXVnbGlmaWVkICovCisKKyAgLyogUHJvdGVjdGVkIGJ5IF9EQlVTX0xPQ0tfc3lzZGVwcyAqLworICBzdGF0aWMgZGJ1c19ib29sX3QgYmVlbmhlcmUgPSBGQUxTRTsKKworICBXT1JEIHdWZXJzaW9uUmVxdWVzdGVkOworICBXU0FEQVRBIHdzYURhdGE7CisgIGludCBlcnI7CisKKyAgaWYgKCFfREJVU19MT0NLIChzeXNkZXBzKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKGJlZW5oZXJlKQorICAgIGdvdG8gb3V0OworCisgIHdWZXJzaW9uUmVxdWVzdGVkID0gTUFLRVdPUkQgKDIsIDApOworCisgIGVyciA9IFdTQVN0YXJ0dXAgKHdWZXJzaW9uUmVxdWVzdGVkLCAmd3NhRGF0YSk7CisgIGlmIChlcnIgIT0gMCkKKyAgICB7CisgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJDb3VsZCBub3QgaW5pdGlhbGl6ZSBXaW5Tb2NrIik7CisgICAgICBfZGJ1c19hYm9ydCAoKTsKKyAgICB9CisKKyAgLyogQ29uZmlybSB0aGF0IHRoZSBXaW5Tb2NrIERMTCBzdXBwb3J0cyAyLjAuICBOb3RlIHRoYXQgaWYgdGhlIERMTAorICAgKiBzdXBwb3J0cyB2ZXJzaW9ucyBncmVhdGVyIHRoYW4gMi4wIGluIGFkZGl0aW9uIHRvIDIuMCwgaXQgd2lsbAorICAgKiBzdGlsbCByZXR1cm4gMi4wIGluIHdWZXJzaW9uIHNpbmNlIHRoYXQgaXMgdGhlIHZlcnNpb24gd2UKKyAgICogcmVxdWVzdGVkLgorICAgKi8KKyAgaWYgKExPQllURSAod3NhRGF0YS53VmVyc2lvbikgIT0gMiB8fAorICAgICAgSElCWVRFICh3c2FEYXRhLndWZXJzaW9uKSAhPSAwKQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIk5vIHVzYWJsZSBXaW5Tb2NrIGZvdW5kIik7CisgICAgICBfZGJ1c19hYm9ydCAoKTsKKyAgICB9CisKKyAgYmVlbmhlcmUgPSBUUlVFOworCitvdXQ6CisgIF9EQlVTX1VOTE9DSyAoc3lzZGVwcyk7CisgIHJldHVybiBUUlVFOworfQorCisKKworCisKKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIAorIFVURiAvIHN0cmluZyBjb2RlCisgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIE1lYXN1cmUgdGhlIG1lc3NhZ2UgbGVuZ3RoIHdpdGhvdXQgdGVybWluYXRpbmcgbnVsIAorICovCitpbnQgX2RidXNfcHJpbnRmX3N0cmluZ191cHBlcl9ib3VuZCAoY29uc3QgY2hhciAqZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhX2xpc3QgYXJncykKK3sKKyAgLyogTVNWQ1JUJ3MgdnNucHJpbnRmIHNlbWFudGljcyBhcmUgYSBiaXQgZGlmZmVyZW50ICovCisgIGNoYXIgYnVmWzEwMjRdOworICBpbnQgYnVmc2l6ZTsKKyAgaW50IGxlbjsKKyAgdmFfbGlzdCBhcmdzX2NvcHk7CisKKyAgYnVmc2l6ZSA9IHNpemVvZiAoYnVmKTsKKyAgREJVU19WQV9DT1BZIChhcmdzX2NvcHksIGFyZ3MpOworICBsZW4gPSBfdnNucHJpbnRmIChidWYsIGJ1ZnNpemUgLSAxLCBmb3JtYXQsIGFyZ3NfY29weSk7CisgIHZhX2VuZCAoYXJnc19jb3B5KTsKKworICB3aGlsZSAobGVuID09IC0xKSAvKiB0cnkgYWdhaW4gKi8KKyAgICB7CisgICAgICBjaGFyICpwOworCisgICAgICBidWZzaXplICo9IDI7CisKKyAgICAgIHAgPSBtYWxsb2MgKGJ1ZnNpemUpOworCisgICAgICBpZiAocCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICAgIERCVVNfVkFfQ09QWSAoYXJnc19jb3B5LCBhcmdzKTsKKyAgICAgIGxlbiA9IF92c25wcmludGYgKHAsIGJ1ZnNpemUgLSAxLCBmb3JtYXQsIGFyZ3NfY29weSk7CisgICAgICB2YV9lbmQgKGFyZ3NfY29weSk7CisgICAgICBmcmVlIChwKTsKKyAgICB9CisKKyAgcmV0dXJuIGxlbjsKK30KKworCisvKioKKyAqIFJldHVybnMgdGhlIFVURi0xNiBmb3JtIG9mIGEgVVRGLTggc3RyaW5nLiBUaGUgcmVzdWx0IHNob3VsZCBiZQorICogZnJlZWQgd2l0aCBkYnVzX2ZyZWUoKSB3aGVuIG5vIGxvbmdlciBuZWVkZWQuCisgKgorICogQHBhcmFtIHN0ciB0aGUgVVRGLTggc3RyaW5nCisgKiBAcGFyYW0gZXJyb3IgcmV0dXJuIGxvY2F0aW9uIGZvciBlcnJvciBjb2RlCisgKi8KK3djaGFyX3QgKgorX2RidXNfd2luX3V0ZjhfdG9fdXRmMTYgKGNvbnN0IGNoYXIgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICplcnJvcikKK3sKKyAgREJ1c1N0cmluZyBzOworICBpbnQgbjsKKyAgd2NoYXJfdCAqcmV0dmFsOworCisgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmcywgc3RyKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ192YWxpZGF0ZV91dGY4ICgmcywgMCwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzKSkpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3JfY29uc3QgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwgIkludmFsaWQgVVRGLTgiKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBuID0gTXVsdGlCeXRlVG9XaWRlQ2hhciAoQ1BfVVRGOCwgMCwgc3RyLCAtMSwgTlVMTCwgMCk7CisKKyAgaWYgKG4gPT0gMCkKKyAgICB7CisgICAgICBfZGJ1c193aW5fc2V0X2Vycm9yX2Zyb21fd2luX2Vycm9yIChlcnJvciwgR2V0TGFzdEVycm9yICgpKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICByZXR2YWwgPSBkYnVzX25ldyAod2NoYXJfdCwgbik7CisKKyAgaWYgKCFyZXR2YWwpCisgICAgeworICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIGlmIChNdWx0aUJ5dGVUb1dpZGVDaGFyIChDUF9VVEY4LCAwLCBzdHIsIC0xLCByZXR2YWwsIG4pICE9IG4pCisgICAgeworICAgICAgZGJ1c19mcmVlIChyZXR2YWwpOworICAgICAgZGJ1c19zZXRfZXJyb3JfY29uc3QgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwgIk11bHRpQnl0ZVRvV2lkZUNoYXIgaW5jb25zaXN0ZW5jeSIpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIHJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogUmV0dXJucyB0aGUgVVRGLTggZm9ybSBvZiBhIFVURi0xNiBzdHJpbmcuIFRoZSByZXN1bHQgc2hvdWxkIGJlCisgKiBmcmVlZCB3aXRoIGRidXNfZnJlZSgpIHdoZW4gbm8gbG9uZ2VyIG5lZWRlZC4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBVVEYtMTYgc3RyaW5nCisgKiBAcGFyYW0gZXJyb3IgcmV0dXJuIGxvY2F0aW9uIGZvciBlcnJvciBjb2RlCisgKi8KK2NoYXIgKgorX2RidXNfd2luX3V0ZjE2X3RvX3V0ZjggKGNvbnN0IHdjaGFyX3QgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICplcnJvcikKK3sKKyAgaW50IG47CisgIGNoYXIgKnJldHZhbDsKKworICBuID0gV2lkZUNoYXJUb011bHRpQnl0ZSAoQ1BfVVRGOCwgMCwgc3RyLCAtMSwgTlVMTCwgMCwgTlVMTCwgTlVMTCk7CisKKyAgaWYgKG4gPT0gMCkKKyAgICB7CisgICAgICBfZGJ1c193aW5fc2V0X2Vycm9yX2Zyb21fd2luX2Vycm9yIChlcnJvciwgR2V0TGFzdEVycm9yICgpKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICByZXR2YWwgPSBkYnVzX21hbGxvYyAobik7CisKKyAgaWYgKCFyZXR2YWwpCisgICAgeworICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIGlmIChXaWRlQ2hhclRvTXVsdGlCeXRlIChDUF9VVEY4LCAwLCBzdHIsIC0xLCByZXR2YWwsIG4sIE5VTEwsIE5VTEwpICE9IG4pCisgICAgeworICAgICAgZGJ1c19mcmVlIChyZXR2YWwpOworICAgICAgZGJ1c19zZXRfZXJyb3JfY29uc3QgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwgIldpZGVDaGFyVG9NdWx0aUJ5dGUgaW5jb25zaXN0ZW5jeSIpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIHJldHVybiByZXR2YWw7Cit9CisKKworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgCisgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitkYnVzX2Jvb2xfdAorX2RidXNfd2luX2FjY291bnRfdG9fc2lkIChjb25zdCB3Y2hhcl90ICp3YWNjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgIAkgKipwcHNpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yIAkgICplcnJvcikKK3sKKyAgZGJ1c19ib29sX3QgcmV0dmFsID0gRkFMU0U7CisgIERXT1JEIHNpZF9sZW5ndGgsIHdkb21haW5fbGVuZ3RoOworICBTSURfTkFNRV9VU0UgdXNlOworICB3Y2hhcl90ICp3ZG9tYWluOworCisgICpwcHNpZCA9IE5VTEw7CisKKyAgc2lkX2xlbmd0aCA9IDA7CisgIHdkb21haW5fbGVuZ3RoID0gMDsKKyAgaWYgKCFMb29rdXBBY2NvdW50TmFtZVcgKE5VTEwsIHdhY2NvdW50LCBOVUxMLCAmc2lkX2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICZ3ZG9tYWluX2xlbmd0aCwgJnVzZSkgJiYKKyAgICAgIEdldExhc3RFcnJvciAoKSAhPSBFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKQorICAgIHsKKyAgICAgIF9kYnVzX3dpbl9zZXRfZXJyb3JfZnJvbV93aW5fZXJyb3IgKGVycm9yLCBHZXRMYXN0RXJyb3IgKCkpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAqcHBzaWQgPSBkYnVzX21hbGxvYyAoc2lkX2xlbmd0aCk7CisgIGlmICghKnBwc2lkKQorICAgIHsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgd2RvbWFpbiA9IGRidXNfbmV3ICh3Y2hhcl90LCB3ZG9tYWluX2xlbmd0aCk7CisgIGlmICghd2RvbWFpbikKKyAgICB7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBnb3RvIG91dDE7CisgICAgfQorCisgIGlmICghTG9va3VwQWNjb3VudE5hbWVXIChOVUxMLCB3YWNjb3VudCwgKFBTSUQpICpwcHNpZCwgJnNpZF9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZG9tYWluLCAmd2RvbWFpbl9sZW5ndGgsICZ1c2UpKQorICAgIHsKKyAgICAgIF9kYnVzX3dpbl9zZXRfZXJyb3JfZnJvbV93aW5fZXJyb3IgKGVycm9yLCBHZXRMYXN0RXJyb3IgKCkpOworICAgICAgZ290byBvdXQyOworICAgIH0KKworICBpZiAoIUlzVmFsaWRTaWQgKChQU0lEKSAqcHBzaWQpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yX2NvbnN0IChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsICJJbnZhbGlkIFNJRCIpOworICAgICAgZ290byBvdXQyOworICAgIH0KKworICByZXR2YWwgPSBUUlVFOworCitvdXQyOgorICBkYnVzX2ZyZWUgKHdkb21haW4pOworb3V0MToKKyAgaWYgKCFyZXR2YWwpCisgICAgeworICAgICAgZGJ1c19mcmVlICgqcHBzaWQpOworICAgICAgKnBwc2lkID0gTlVMTDsKKyAgICB9CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyoqIEB9IGVuZCBvZiBzeXNkZXBzLXdpbiAqLworCisKKy8qKgorICogVGhlIG9ubHkgcmVhc29uIHRoaXMgaXMgc2VwYXJhdGUgZnJvbSBfZGJ1c19nZXRwaWQoKSBpcyB0byBhbGxvdyBpdAorICogb24gV2luZG93cyBmb3IgbG9nZ2luZyBidXQgbm90IGZvciBvdGhlciBwdXJwb3Nlcy4KKyAqIAorICogQHJldHVybnMgcHJvY2VzcyBJRCB0byBwdXQgaW4gbG9nIG1lc3NhZ2VzCisgKi8KK3Vuc2lnbmVkIGxvbmcKK19kYnVzX3BpZF9mb3JfbG9nICh2b2lkKQoreworICByZXR1cm4gX2RidXNfZ2V0cGlkICgpOworfQorCisjaWZuZGVmIERCVVNfV0lOQ0UKKworc3RhdGljIEJPT0wKK2lzX3dpbnhwX3NwM19vcl9sb3dlciAodm9pZCkKK3sKKyAgIE9TVkVSU0lPTklORk9FWCBvc3ZpOworICAgRFdPUkRMT05HIGR3bENvbmRpdGlvbk1hc2sgPSAwOworICAgaW50IG9wPVZFUl9MRVNTX0VRVUFMOworCisgICAvLyBJbml0aWFsaXplIHRoZSBPU1ZFUlNJT05JTkZPRVggc3RydWN0dXJlLgorCisgICBaZXJvTWVtb3J5KCZvc3ZpLCBzaXplb2YoT1NWRVJTSU9OSU5GT0VYKSk7CisgICBvc3ZpLmR3T1NWZXJzaW9uSW5mb1NpemUgPSBzaXplb2YoT1NWRVJTSU9OSU5GT0VYKTsKKyAgIG9zdmkuZHdNYWpvclZlcnNpb24gPSA1OworICAgb3N2aS5kd01pbm9yVmVyc2lvbiA9IDE7CisgICBvc3ZpLndTZXJ2aWNlUGFja01ham9yID0gMzsKKyAgIG9zdmkud1NlcnZpY2VQYWNrTWlub3IgPSAwOworCisgICAvLyBJbml0aWFsaXplIHRoZSBjb25kaXRpb24gbWFzay4KKworICAgVkVSX1NFVF9DT05ESVRJT04oIGR3bENvbmRpdGlvbk1hc2ssIFZFUl9NQUpPUlZFUlNJT04sIG9wICk7CisgICBWRVJfU0VUX0NPTkRJVElPTiggZHdsQ29uZGl0aW9uTWFzaywgVkVSX01JTk9SVkVSU0lPTiwgb3AgKTsKKyAgIFZFUl9TRVRfQ09ORElUSU9OKCBkd2xDb25kaXRpb25NYXNrLCBWRVJfU0VSVklDRVBBQ0tNQUpPUiwgb3AgKTsKKyAgIFZFUl9TRVRfQ09ORElUSU9OKCBkd2xDb25kaXRpb25NYXNrLCBWRVJfU0VSVklDRVBBQ0tNSU5PUiwgb3AgKTsKKworICAgLy8gUGVyZm9ybSB0aGUgdGVzdC4KKworICAgcmV0dXJuIFZlcmlmeVZlcnNpb25JbmZvKAorICAgICAgJm9zdmksCisgICAgICBWRVJfTUFKT1JWRVJTSU9OIHwgVkVSX01JTk9SVkVSU0lPTiB8CisgICAgICBWRVJfU0VSVklDRVBBQ0tNQUpPUiB8IFZFUl9TRVJWSUNFUEFDS01JTk9SLAorICAgICAgZHdsQ29uZGl0aW9uTWFzayk7Cit9CisKKy8qKiBHZXRzIG91ciBTSUQKKyAqIEBwYXJhbSBzaWQgcG9pbnRzIHRvIHNpZCBidWZmZXIsIG5lZWQgdG8gYmUgZnJlZWQgd2l0aCBMb2NhbEZyZWUoKQorICogQHBhcmFtIHByb2Nlc3NfaWQgdGhlIHByb2Nlc3MgaWQgZm9yIHdoaWNoIHRoZSBzaWQgc2hvdWxkIGJlIHJldHVybmVkICh1c2UgMCBmb3IgY3VycmVudCBwcm9jZXNzKQorICogQHJldHVybnMgcHJvY2VzcyBzaWQKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2dldHNpZChjaGFyICoqc2lkLCBkYnVzX3BpZF90IHByb2Nlc3NfaWQpCit7CisgIEhBTkRMRSBwcm9jZXNzX3Rva2VuID0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CisgIFRPS0VOX1VTRVIgKnRva2VuX3VzZXIgPSBOVUxMOworICBEV09SRCBuOworICBQU0lEIHBzaWQ7CisgIGludCByZXR2YWwgPSBGQUxTRTsKKworICBIQU5ETEUgcHJvY2Vzc19oYW5kbGU7CisgIGlmIChwcm9jZXNzX2lkID09IDApCisgICAgcHJvY2Vzc19oYW5kbGUgPSBHZXRDdXJyZW50UHJvY2VzcygpOworICBlbHNlIGlmIChpc193aW54cF9zcDNfb3JfbG93ZXIoKSkKKyAgICBwcm9jZXNzX2hhbmRsZSA9IE9wZW5Qcm9jZXNzKFBST0NFU1NfUVVFUllfSU5GT1JNQVRJT04sIEZBTFNFLCBwcm9jZXNzX2lkKTsKKyAgZWxzZQorICAgIHByb2Nlc3NfaGFuZGxlID0gT3BlblByb2Nlc3MoUFJPQ0VTU19RVUVSWV9MSU1JVEVEX0lORk9STUFUSU9OLCBGQUxTRSwgcHJvY2Vzc19pZCk7CisKKyAgaWYgKCFPcGVuUHJvY2Vzc1Rva2VuIChwcm9jZXNzX2hhbmRsZSwgVE9LRU5fUVVFUlksICZwcm9jZXNzX3Rva2VuKSkKKyAgICB7CisgICAgICBfZGJ1c193aW5fd2Fybl93aW5fZXJyb3IgKCJPcGVuUHJvY2Vzc1Rva2VuIGZhaWxlZCIsIEdldExhc3RFcnJvciAoKSk7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisgIGlmICgoIUdldFRva2VuSW5mb3JtYXRpb24gKHByb2Nlc3NfdG9rZW4sIFRva2VuVXNlciwgTlVMTCwgMCwgJm4pCisgICAgICAgICAgICAmJiBHZXRMYXN0RXJyb3IgKCkgIT0gRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUikKKyAgICAgICAgICAgfHwgKHRva2VuX3VzZXIgPSBhbGxvY2EgKG4pKSA9PSBOVUxMCisgICAgICAgICAgIHx8ICFHZXRUb2tlbkluZm9ybWF0aW9uIChwcm9jZXNzX3Rva2VuLCBUb2tlblVzZXIsIHRva2VuX3VzZXIsIG4sICZuKSkKKyAgICB7CisgICAgICBfZGJ1c193aW5fd2Fybl93aW5fZXJyb3IgKCJHZXRUb2tlbkluZm9ybWF0aW9uIGZhaWxlZCIsIEdldExhc3RFcnJvciAoKSk7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisgIHBzaWQgPSB0b2tlbl91c2VyLT5Vc2VyLlNpZDsKKyAgaWYgKCFJc1ZhbGlkU2lkIChwc2lkKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlKCIlcyBpbnZhbGlkIHNpZFxuIixfX0ZVTkNUSU9OX18pOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorICBpZiAoIUNvbnZlcnRTaWRUb1N0cmluZ1NpZEEgKHBzaWQsIHNpZCkpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSgiJXMgaW52YWxpZCBzaWRcbiIsX19GVU5DVElPTl9fKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKy8vb2theToKKyAgcmV0dmFsID0gVFJVRTsKKworZmFpbGVkOgorICBDbG9zZUhhbmRsZSAocHJvY2Vzc19oYW5kbGUpOworICBpZiAocHJvY2Vzc190b2tlbiAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSkKKyAgICBDbG9zZUhhbmRsZSAocHJvY2Vzc190b2tlbik7CisKKyAgX2RidXNfdmVyYm9zZSgiX2RidXNfZ2V0c2lkKCkgZ290ICclcycgYW5kIHJldHVybnMgJWRcbiIsICpzaWQsIHJldHZhbCk7CisgIHJldHVybiByZXR2YWw7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIAorIHBpcGVzCisgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIENyZWF0ZXMgcGFpciBvZiBjb25uZWN0IHNvY2tldHMgKGFzIGluIHNvY2tldHBhaXIoKSkuCisgKiBTZXRzIGJvdGggZW5kcyBvZiB0aGUgcGFpciBub25ibG9ja2luZy4KKyAqCisgKiBNYXJrcyBib3RoIGZpbGUgZGVzY3JpcHRvcnMgYXMgY2xvc2Utb24tZXhlYworICoKKyAqIEBwYXJhbSBmZDEgcmV0dXJuIGxvY2F0aW9uIGZvciBvbmUgZW5kCisgKiBAcGFyYW0gZmQyIHJldHVybiBsb2NhdGlvbiBmb3IgdGhlIG90aGVyIGVuZAorICogQHBhcmFtIGJsb2NraW5nICNUUlVFIGlmIHBhaXIgc2hvdWxkIGJlIGJsb2NraW5nCisgKiBAcGFyYW0gZXJyb3IgZXJyb3IgcmV0dXJuCisgKiBAcmV0dXJucyAjRkFMU0Ugb24gZmFpbHVyZSAoaWYgZXJyb3IgaXMgc2V0KQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfc29ja2V0cGFpciAoREJ1c1NvY2tldCAqZmQxLAorICAgICAgICAgICAgICAgICAgREJ1c1NvY2tldCAqZmQyLAorICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgYmxvY2tpbmcsCisgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICplcnJvcikKK3sKKyAgU09DS0VUIHRlbXAsIHNvY2tldDEgPSAtMSwgc29ja2V0MiA9IC0xOworICBzdHJ1Y3Qgc29ja2FkZHJfaW4gc2FkZHI7CisgIGludCBsZW47CisgIHVfbG9uZyBhcmc7CisKKyAgaWYgKCFfZGJ1c193aW5fc3RhcnR1cF93aW5zb2NrICgpKQorICAgIHsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgdGVtcCA9IHNvY2tldCAoQUZfSU5FVCwgU09DS19TVFJFQU0sIDApOworICBpZiAodGVtcCA9PSBJTlZBTElEX1NPQ0tFVCkKKyAgICB7CisgICAgICBEQlVTX1NPQ0tFVF9TRVRfRVJSTk8gKCk7CisgICAgICBnb3RvIG91dDA7CisgICAgfQorCisgIF9EQlVTX1pFUk8gKHNhZGRyKTsKKyAgc2FkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisgIHNhZGRyLnNpbl9wb3J0ID0gMDsKKyAgc2FkZHIuc2luX2FkZHIuc19hZGRyID0gaHRvbmwgKElOQUREUl9MT09QQkFDSyk7CisKKyAgaWYgKGJpbmQgKHRlbXAsIChzdHJ1Y3Qgc29ja2FkZHIgKikmc2FkZHIsIHNpemVvZiAoc2FkZHIpKSA9PSBTT0NLRVRfRVJST1IpCisgICAgeworICAgICAgREJVU19TT0NLRVRfU0VUX0VSUk5PICgpOworICAgICAgZ290byBvdXQwOworICAgIH0KKworICBpZiAobGlzdGVuICh0ZW1wLCAxKSA9PSBTT0NLRVRfRVJST1IpCisgICAgeworICAgICAgREJVU19TT0NLRVRfU0VUX0VSUk5PICgpOworICAgICAgZ290byBvdXQwOworICAgIH0KKworICBsZW4gPSBzaXplb2YgKHNhZGRyKTsKKyAgaWYgKGdldHNvY2tuYW1lICh0ZW1wLCAoc3RydWN0IHNvY2thZGRyICopJnNhZGRyLCAmbGVuKSA9PSBTT0NLRVRfRVJST1IpCisgICAgeworICAgICAgREJVU19TT0NLRVRfU0VUX0VSUk5PICgpOworICAgICAgZ290byBvdXQwOworICAgIH0KKworICBzb2NrZXQxID0gc29ja2V0IChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCk7CisgIGlmIChzb2NrZXQxID09IElOVkFMSURfU09DS0VUKQorICAgIHsKKyAgICAgIERCVVNfU09DS0VUX1NFVF9FUlJOTyAoKTsKKyAgICAgIGdvdG8gb3V0MDsKKyAgICB9CisKKyAgaWYgKGNvbm5lY3QgKHNvY2tldDEsIChzdHJ1Y3Qgc29ja2FkZHIgICopJnNhZGRyLCBsZW4pID09IFNPQ0tFVF9FUlJPUikKKyAgICB7CisgICAgICBEQlVTX1NPQ0tFVF9TRVRfRVJSTk8gKCk7CisgICAgICBnb3RvIG91dDE7CisgICAgfQorCisgIHNvY2tldDIgPSBhY2NlcHQgKHRlbXAsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJnNhZGRyLCAmbGVuKTsKKyAgaWYgKHNvY2tldDIgPT0gSU5WQUxJRF9TT0NLRVQpCisgICAgeworICAgICAgREJVU19TT0NLRVRfU0VUX0VSUk5PICgpOworICAgICAgZ290byBvdXQxOworICAgIH0KKworICBpZiAoIWJsb2NraW5nKQorICAgIHsKKyAgICAgIGFyZyA9IDE7CisgICAgICBpZiAoaW9jdGxzb2NrZXQgKHNvY2tldDEsIEZJT05CSU8sICZhcmcpID09IFNPQ0tFVF9FUlJPUikKKyAgICAgICAgeworICAgICAgICAgIERCVVNfU09DS0VUX1NFVF9FUlJOTyAoKTsKKyAgICAgICAgICBnb3RvIG91dDI7CisgICAgICAgIH0KKworICAgICAgYXJnID0gMTsKKyAgICAgIGlmIChpb2N0bHNvY2tldCAoc29ja2V0MiwgRklPTkJJTywgJmFyZykgPT0gU09DS0VUX0VSUk9SKQorICAgICAgICB7CisgICAgICAgICAgREJVU19TT0NLRVRfU0VUX0VSUk5PICgpOworICAgICAgICAgIGdvdG8gb3V0MjsKKyAgICAgICAgfQorICAgIH0KKworICBmZDEtPnNvY2sgPSBzb2NrZXQxOworICBmZDItPnNvY2sgPSBzb2NrZXQyOworCisgIF9kYnVzX3ZlcmJvc2UgKCJmdWxsLWR1cGxleCBwaXBlICVJdTolSXUgPC0+ICVJdTolSXVcbiIsCisgICAgICAgICAgICAgICAgIGZkMS0+c29jaywgc29ja2V0MSwgZmQyLT5zb2NrLCBzb2NrZXQyKTsKKworICBjbG9zZXNvY2tldCAodGVtcCk7CisKKyAgcmV0dXJuIFRSVUU7CisKK291dDI6CisgIGNsb3Nlc29ja2V0IChzb2NrZXQyKTsKK291dDE6CisgIGNsb3Nlc29ja2V0IChzb2NrZXQxKTsKK291dDA6CisgIGNsb3Nlc29ja2V0ICh0ZW1wKTsKKworICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICJDb3VsZCBub3Qgc2V0dXAgc29ja2V0IHBhaXI6ICVzIiwKKyAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmVycm9yX2Zyb21fZXJybm8gKCkpOworCisgIHJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBXcmFwcGVyIGZvciBwb2xsKCkuCisgKgorICogQHBhcmFtIGZkcyB0aGUgZmlsZSBkZXNjcmlwdG9ycyB0byBwb2xsCisgKiBAcGFyYW0gbl9mZHMgbnVtYmVyIG9mIGRlc2NyaXB0b3JzIGluIHRoZSBhcnJheQorICogQHBhcmFtIHRpbWVvdXRfbWlsbGlzZWNvbmRzIHRpbWVvdXQgb3IgLTEgZm9yIGluZmluaXRlCisgKiBAcmV0dXJucyBudW1iZXJzIG9mIGZkcyB3aXRoIHJldmVudHMsIG9yIDwwIG9uIGVycm9yCisgKi8KK2ludAorX2RidXNfcG9sbCAoREJ1c1BvbGxGRCAqZmRzLAorICAgICAgICAgICAgaW50ICAgICAgICAgbl9mZHMsCisgICAgICAgICAgICBpbnQgICAgICAgICB0aW1lb3V0X21pbGxpc2Vjb25kcykKK3sKKyNkZWZpbmUgVVNFX0NIUklTX0lNUEwgMAorCisjaWYgVVNFX0NIUklTX0lNUEwKKworI2RlZmluZSBEQlVTX1BPTExfQ0hBUl9CVUZGRVJfU0laRSAyMDAwCisgIGNoYXIgbXNnW0RCVVNfUE9MTF9DSEFSX0JVRkZFUl9TSVpFXTsKKyAgY2hhciAqbXNncDsKKworICBpbnQgcmV0ID0gMDsKKyAgaW50IGk7CisgIHN0cnVjdCB0aW1ldmFsIHR2OworICBpbnQgcmVhZHk7CisKKyNkZWZpbmUgREJVU19TVEFDS19XU0FFVkVOVFMgMjU2CisgIFdTQUVWRU5UIGV2ZW50c09uU3RhY2tbREJVU19TVEFDS19XU0FFVkVOVFNdOworICBXU0FFVkVOVCAqcEV2ZW50cyA9IE5VTEw7CisgIGlmIChuX2ZkcyA+IERCVVNfU1RBQ0tfV1NBRVZFTlRTKQorICAgIHBFdmVudHMgPSBjYWxsb2Moc2l6ZW9mKFdTQUVWRU5UKSwgbl9mZHMpOworICBlbHNlCisgICAgcEV2ZW50cyA9IGV2ZW50c09uU3RhY2s7CisKKworI2lmZGVmIERCVVNfRU5BQkxFX1ZFUkJPU0VfTU9ERQorICBtc2dwID0gbXNnOworICBtc2dwICs9IHNwcmludGYgKG1zZ3AsICJXU0FFdmVudFNlbGVjdDogdG89JWRcblx0IiwgdGltZW91dF9taWxsaXNlY29uZHMpOworICBmb3IgKGkgPSAwOyBpIDwgbl9mZHM7IGkrKykKKyAgICB7CisgICAgICBEQnVzUG9sbEZEICpmZHAgPSAmZmRzW2ldOworCisKKyAgICAgIGlmIChmZHAtPmV2ZW50cyAmIF9EQlVTX1BPTExJTikKKyAgICAgICAgbXNncCArPSBzcHJpbnRmIChtc2dwLCAiUjolSXUgIiwgZmRwLT5mZC5zb2NrKTsKKworICAgICAgaWYgKGZkcC0+ZXZlbnRzICYgX0RCVVNfUE9MTE9VVCkKKyAgICAgICAgbXNncCArPSBzcHJpbnRmIChtc2dwLCAiVzolSXUgIiwgZmRwLT5mZC5zb2NrKTsKKworICAgICAgbXNncCArPSBzcHJpbnRmIChtc2dwLCAiRTolSXVcblx0IiwgZmRwLT5mZC5zb2NrKTsKKworICAgICAgLy8gRklYTUU6IG1vcmUgcm9idXN0IGNvZGUgZm9yIGxvbmcgIG1zZworICAgICAgLy8gICAgICAgIGNyZWF0ZSBvbiBoZWFwIHdoZW4gbXNnW10gYmVjb21lcyB0b28gc21hbGwKKyAgICAgIGlmIChtc2dwID49IG1zZyArIERCVVNfUE9MTF9DSEFSX0JVRkZFUl9TSVpFKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiYnVmZmVyIG92ZXJmbG93IGluIF9kYnVzX3BvbGwiKTsKKyAgICAgICAgfQorICAgIH0KKworICBtc2dwICs9IHNwcmludGYgKG1zZ3AsICJcbiIpOworICBfZGJ1c192ZXJib3NlICgiJXMiLG1zZyk7CisjZW5kaWYKKyAgZm9yIChpID0gMDsgaSA8IG5fZmRzOyBpKyspCisgICAgeworICAgICAgREJ1c1BvbGxGRCAqZmRwID0gJmZkc1tpXTsKKyAgICAgIFdTQUVWRU5UIGV2OworICAgICAgbG9uZyBsTmV0d29ya0V2ZW50cyA9IEZEX09PQjsKKworICAgICAgZXYgPSBXU0FDcmVhdGVFdmVudCgpOworCisgICAgICBpZiAoZmRwLT5ldmVudHMgJiBfREJVU19QT0xMSU4pCisgICAgICAgIGxOZXR3b3JrRXZlbnRzIHw9IEZEX1JFQUQgfCBGRF9BQ0NFUFQgfCBGRF9DTE9TRTsKKworICAgICAgaWYgKGZkcC0+ZXZlbnRzICYgX0RCVVNfUE9MTE9VVCkKKyAgICAgICAgbE5ldHdvcmtFdmVudHMgfD0gRkRfV1JJVEUgfCBGRF9DT05ORUNUOworCisgICAgICBXU0FFdmVudFNlbGVjdChmZHAtPmZkLnNvY2ssIGV2LCBsTmV0d29ya0V2ZW50cyk7CisKKyAgICAgIHBFdmVudHNbaV0gPSBldjsKKyAgICB9CisKKworICByZWFkeSA9IFdTQVdhaXRGb3JNdWx0aXBsZUV2ZW50cyAobl9mZHMsIHBFdmVudHMsIEZBTFNFLCB0aW1lb3V0X21pbGxpc2Vjb25kcywgRkFMU0UpOworCisgIGlmIChEQlVTX1NPQ0tFVF9BUElfUkVUVVJOU19FUlJPUiAocmVhZHkpKQorICAgIHsKKyAgICAgIERCVVNfU09DS0VUX1NFVF9FUlJOTyAoKTsKKyAgICAgIGlmIChlcnJubyAhPSBXU0FFV09VTERCTE9DSykKKyAgICAgICAgX2RidXNfdmVyYm9zZSAoIldTQVdhaXRGb3JNdWx0aXBsZUV2ZW50czogZmFpbGVkOiAlc1xuIiwgX2RidXNfc3RyZXJyb3JfZnJvbV9lcnJubyAoKSk7CisgICAgICByZXQgPSAtMTsKKyAgICB9CisgIGVsc2UgaWYgKHJlYWR5ID09IFdTQV9XQUlUX1RJTUVPVVQpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIldTQVdhaXRGb3JNdWx0aXBsZUV2ZW50czogV1NBX1dBSVRfVElNRU9VVFxuIik7CisgICAgICByZXQgPSAwOworICAgIH0KKyAgZWxzZSBpZiAocmVhZHkgPj0gV1NBX1dBSVRfRVZFTlRfMCAmJiByZWFkeSA8IChpbnQpKFdTQV9XQUlUX0VWRU5UXzAgKyBuX2ZkcykpCisgICAgeworICAgICAgbXNncCA9IG1zZzsKKyAgICAgIG1zZ3AgKz0gc3ByaW50ZiAobXNncCwgIldTQVdhaXRGb3JNdWx0aXBsZUV2ZW50czogPSVkXG5cdCIsIHJlYWR5KTsKKworICAgICAgZm9yIChpID0gMDsgaSA8IG5fZmRzOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICBEQnVzUG9sbEZEICpmZHAgPSAmZmRzW2ldOworICAgICAgICAgIFdTQU5FVFdPUktFVkVOVFMgbmU7CisKKyAgICAgICAgICBmZHAtPnJldmVudHMgPSAwOworCisgICAgICAgICAgV1NBRW51bU5ldHdvcmtFdmVudHMoZmRwLT5mZC5zb2NrLCBwRXZlbnRzW2ldLCAmbmUpOworCisgICAgICAgICAgaWYgKG5lLmxOZXR3b3JrRXZlbnRzICYgKEZEX1JFQUQgfCBGRF9BQ0NFUFQgfCBGRF9DTE9TRSkpCisgICAgICAgICAgICBmZHAtPnJldmVudHMgfD0gX0RCVVNfUE9MTElOOworCisgICAgICAgICAgaWYgKG5lLmxOZXR3b3JrRXZlbnRzICYgKEZEX1dSSVRFIHwgRkRfQ09OTkVDVCkpCisgICAgICAgICAgICBmZHAtPnJldmVudHMgfD0gX0RCVVNfUE9MTE9VVDsKKworICAgICAgICAgIGlmIChuZS5sTmV0d29ya0V2ZW50cyAmIChGRF9PT0IpKQorICAgICAgICAgICAgZmRwLT5yZXZlbnRzIHw9IF9EQlVTX1BPTExFUlI7CisKKyAgICAgICAgICBpZiAobmUubE5ldHdvcmtFdmVudHMgJiAoRkRfUkVBRCB8IEZEX0FDQ0VQVCB8IEZEX0NMT1NFKSkKKyAgICAgICAgICAgICAgbXNncCArPSBzcHJpbnRmIChtc2dwLCAiUjolSXUgIiwgZmRwLT5mZC5zb2NrKTsKKworICAgICAgICAgIGlmIChuZS5sTmV0d29ya0V2ZW50cyAmIChGRF9XUklURSB8IEZEX0NPTk5FQ1QpKQorICAgICAgICAgICAgICBtc2dwICs9IHNwcmludGYgKG1zZ3AsICJXOiVJdSAiLCBmZHAtPmZkLnNvY2spOworCisgICAgICAgICAgaWYgKG5lLmxOZXR3b3JrRXZlbnRzICYgKEZEX09PQikpCisgICAgICAgICAgICAgIG1zZ3AgKz0gc3ByaW50ZiAobXNncCwgIkU6JUl1ICIsIGZkcC0+ZmQuc29jayk7CisKKyAgICAgICAgICBtc2dwICs9IHNwcmludGYgKG1zZ3AsICJsTmV0d29ya0V2ZW50czolZCAiLCBuZS5sTmV0d29ya0V2ZW50cyk7CisKKyAgICAgICAgICBpZihuZS5sTmV0d29ya0V2ZW50cykKKyAgICAgICAgICAgIHJldCsrOworCisgICAgICAgICAgV1NBRXZlbnRTZWxlY3QoZmRwLT5mZC5zb2NrLCBwRXZlbnRzW2ldLCAwKTsKKyAgICAgICAgfQorCisgICAgICBtc2dwICs9IHNwcmludGYgKG1zZ3AsICJcbiIpOworICAgICAgX2RidXNfdmVyYm9zZSAoIiVzIixtc2cpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJXU0FXYWl0Rm9yTXVsdGlwbGVFdmVudHM6IGZhaWxlZCBmb3IgdW5rbm93biByZWFzb24hIik7CisgICAgICByZXQgPSAtMTsKKyAgICB9CisKKyAgZm9yKGkgPSAwOyBpIDwgbl9mZHM7IGkrKykKKyAgICB7CisgICAgICBXU0FDbG9zZUV2ZW50KHBFdmVudHNbaV0pOworICAgIH0KKworICBpZiAobl9mZHMgPiBEQlVTX1NUQUNLX1dTQUVWRU5UUykKKyAgICBmcmVlKHBFdmVudHMpOworCisgIHJldHVybiByZXQ7CisKKyNlbHNlICAgLyogVVNFX0NIUklTX0lNUEwgKi8KKworI2lmZGVmIERCVVNfRU5BQkxFX1ZFUkJPU0VfTU9ERQorI2RlZmluZSBEQlVTX1BPTExfQ0hBUl9CVUZGRVJfU0laRSAyMDAwCisgIGNoYXIgbXNnW0RCVVNfUE9MTF9DSEFSX0JVRkZFUl9TSVpFXTsKKyAgY2hhciAqbXNncDsKKyNlbmRpZgorCisgIGZkX3NldCByZWFkX3NldCwgd3JpdGVfc2V0LCBlcnJfc2V0OworICBTT0NLRVQgbWF4X2ZkID0gMDsKKyAgaW50IGk7CisgIHN0cnVjdCB0aW1ldmFsIHR2OworICBpbnQgcmVhZHk7CisKKyAgRkRfWkVSTyAoJnJlYWRfc2V0KTsKKyAgRkRfWkVSTyAoJndyaXRlX3NldCk7CisgIEZEX1pFUk8gKCZlcnJfc2V0KTsKKworCisjaWZkZWYgREJVU19FTkFCTEVfVkVSQk9TRV9NT0RFCisgIG1zZ3AgPSBtc2c7CisgIG1zZ3AgKz0gc3ByaW50ZiAobXNncCwgInNlbGVjdDogdG89JWRcblx0IiwgdGltZW91dF9taWxsaXNlY29uZHMpOworICBmb3IgKGkgPSAwOyBpIDwgbl9mZHM7IGkrKykKKyAgICB7CisgICAgICBEQnVzUG9sbEZEICpmZHAgPSAmZmRzW2ldOworCisKKyAgICAgIGlmIChmZHAtPmV2ZW50cyAmIF9EQlVTX1BPTExJTikKKyAgICAgICAgbXNncCArPSBzcHJpbnRmIChtc2dwLCAiUjolSXUgIiwgZmRwLT5mZC5zb2NrKTsKKworICAgICAgaWYgKGZkcC0+ZXZlbnRzICYgX0RCVVNfUE9MTE9VVCkKKyAgICAgICAgbXNncCArPSBzcHJpbnRmIChtc2dwLCAiVzolSXUgIiwgZmRwLT5mZC5zb2NrKTsKKworICAgICAgbXNncCArPSBzcHJpbnRmIChtc2dwLCAiRTolSXVcblx0IiwgZmRwLT5mZC5zb2NrKTsKKworICAgICAgLy8gRklYTUU6IG1vcmUgcm9idXN0IGNvZGUgZm9yIGxvbmcgIG1zZworICAgICAgLy8gICAgICAgIGNyZWF0ZSBvbiBoZWFwIHdoZW4gbXNnW10gYmVjb21lcyB0b28gc21hbGwKKyAgICAgIGlmIChtc2dwID49IG1zZyArIERCVVNfUE9MTF9DSEFSX0JVRkZFUl9TSVpFKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiYnVmZmVyIG92ZXJmbG93IGluIF9kYnVzX3BvbGwiKTsKKyAgICAgICAgfQorICAgIH0KKworICBtc2dwICs9IHNwcmludGYgKG1zZ3AsICJcbiIpOworICBfZGJ1c192ZXJib3NlICgiJXMiLG1zZyk7CisjZW5kaWYKKyAgZm9yIChpID0gMDsgaSA8IG5fZmRzOyBpKyspCisgICAgeworICAgICAgREJ1c1BvbGxGRCAqZmRwID0gJmZkc1tpXTsgCisKKyAgICAgIGlmIChmZHAtPmV2ZW50cyAmIF9EQlVTX1BPTExJTikKKyAgICAgICAgRkRfU0VUIChmZHAtPmZkLnNvY2ssICZyZWFkX3NldCk7CisKKyAgICAgIGlmIChmZHAtPmV2ZW50cyAmIF9EQlVTX1BPTExPVVQpCisgICAgICAgIEZEX1NFVCAoZmRwLT5mZC5zb2NrLCAmd3JpdGVfc2V0KTsKKworICAgICAgRkRfU0VUIChmZHAtPmZkLnNvY2ssICZlcnJfc2V0KTsKKworICAgICAgbWF4X2ZkID0gTUFYIChtYXhfZmQsIGZkcC0+ZmQuc29jayk7CisgICAgfQorCisgIC8vIEF2b2lkIHJhbmRvbSBsb2NrdXBzIHdpdGggc2VuZCgpLCBmb3IgbGFjayBvZiBhIGJldHRlciBzb2x1dGlvbiBzbyBmYXIKKyAgdHYudHZfc2VjID0gdGltZW91dF9taWxsaXNlY29uZHMgPCAwID8gMSA6IHRpbWVvdXRfbWlsbGlzZWNvbmRzIC8gMTAwMDsKKyAgdHYudHZfdXNlYyA9IHRpbWVvdXRfbWlsbGlzZWNvbmRzIDwgMCA/IDAgOiAodGltZW91dF9taWxsaXNlY29uZHMgJSAxMDAwKSAqIDEwMDA7CisKKyAgcmVhZHkgPSBzZWxlY3QgKG1heF9mZCArIDEsICZyZWFkX3NldCwgJndyaXRlX3NldCwgJmVycl9zZXQsICZ0dik7CisKKyAgaWYgKERCVVNfU09DS0VUX0FQSV9SRVRVUk5TX0VSUk9SIChyZWFkeSkpCisgICAgeworICAgICAgREJVU19TT0NLRVRfU0VUX0VSUk5PICgpOworICAgICAgaWYgKGVycm5vICE9IFdTQUVXT1VMREJMT0NLKQorICAgICAgICBfZGJ1c192ZXJib3NlICgic2VsZWN0OiBmYWlsZWQ6ICVzXG4iLCBfZGJ1c19zdHJlcnJvcl9mcm9tX2Vycm5vICgpKTsKKyAgICB9CisgIGVsc2UgaWYgKHJlYWR5ID09IDApCisgICAgX2RidXNfdmVyYm9zZSAoInNlbGVjdDogPSAwXG4iKTsKKyAgZWxzZQorICAgIGlmIChyZWFkeSA+IDApCisgICAgICB7CisjaWZkZWYgREJVU19FTkFCTEVfVkVSQk9TRV9NT0RFCisgICAgICAgIG1zZ3AgPSBtc2c7CisgICAgICAgIG1zZ3AgKz0gc3ByaW50ZiAobXNncCwgInNlbGVjdDogPSAlZDpcblx0IiwgcmVhZHkpOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuX2ZkczsgaSsrKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIERCdXNQb2xsRkQgKmZkcCA9ICZmZHNbaV07CisKKyAgICAgICAgICAgIGlmIChGRF9JU1NFVCAoZmRwLT5mZC5zb2NrLCAmcmVhZF9zZXQpKQorICAgICAgICAgICAgICBtc2dwICs9IHNwcmludGYgKG1zZ3AsICJSOiVJdSAiLCBmZHAtPmZkLnNvY2spOworCisgICAgICAgICAgICBpZiAoRkRfSVNTRVQgKGZkcC0+ZmQuc29jaywgJndyaXRlX3NldCkpCisgICAgICAgICAgICAgIG1zZ3AgKz0gc3ByaW50ZiAobXNncCwgIlc6JUl1ICIsIGZkcC0+ZmQuc29jayk7CisKKyAgICAgICAgICAgIGlmIChGRF9JU1NFVCAoZmRwLT5mZC5zb2NrLCAmZXJyX3NldCkpCisgICAgICAgICAgICAgIG1zZ3AgKz0gc3ByaW50ZiAobXNncCwgIkU6JUl1XG5cdCIsIGZkcC0+ZmQuc29jayk7CisgICAgICAgICAgfQorICAgICAgICBtc2dwICs9IHNwcmludGYgKG1zZ3AsICJcbiIpOworICAgICAgICBfZGJ1c192ZXJib3NlICgiJXMiLG1zZyk7CisjZW5kaWYKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbl9mZHM7IGkrKykKKyAgICAgICAgICB7CisgICAgICAgICAgICBEQnVzUG9sbEZEICpmZHAgPSAmZmRzW2ldOworCisgICAgICAgICAgICBmZHAtPnJldmVudHMgPSAwOworCisgICAgICAgICAgICBpZiAoRkRfSVNTRVQgKGZkcC0+ZmQuc29jaywgJnJlYWRfc2V0KSkKKyAgICAgICAgICAgICAgZmRwLT5yZXZlbnRzIHw9IF9EQlVTX1BPTExJTjsKKworICAgICAgICAgICAgaWYgKEZEX0lTU0VUIChmZHAtPmZkLnNvY2ssICZ3cml0ZV9zZXQpKQorICAgICAgICAgICAgICBmZHAtPnJldmVudHMgfD0gX0RCVVNfUE9MTE9VVDsKKworICAgICAgICAgICAgaWYgKEZEX0lTU0VUIChmZHAtPmZkLnNvY2ssICZlcnJfc2V0KSkKKyAgICAgICAgICAgICAgZmRwLT5yZXZlbnRzIHw9IF9EQlVTX1BPTExFUlI7CisgICAgICAgICAgfQorICAgICAgfQorICByZXR1cm4gcmVhZHk7CisjZW5kaWYgIC8qIFVTRV9DSFJJU19JTVBMICovCit9CisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAKK09yaWdpbmFsIENWUyB2ZXJzaW9uIG9mIGRidXMtc3lzZGVwcy5jCisgCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtc3lzZGVwcy5jIFdyYXBwZXJzIGFyb3VuZCBzeXN0ZW0vbGliYyBmZWF0dXJlcyAoaW50ZXJuYWwgdG8gRC1CdXMgaW1wbGVtZW50YXRpb24pCisgKiAKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMyAgUmVkIEhhdCwgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDAzIENvZGVGYWN0b3J5IEFCCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgTm92ZWxsLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKworLyoqCisgKiBFeGl0IHRoZSBwcm9jZXNzLCByZXR1cm5pbmcgdGhlIGdpdmVuIHZhbHVlLgorICoKKyAqIEBwYXJhbSBjb2RlIHRoZSBleGl0IGNvZGUKKyAqLwordm9pZAorX2RidXNfZXhpdCAoaW50IGNvZGUpCit7CisgIF9leGl0IChjb2RlKTsKK30KKworLyoqCisgKiBDcmVhdGVzIGEgc29ja2V0IGFuZCBjb25uZWN0cyB0byBhIHNvY2tldCBhdCB0aGUgZ2l2ZW4gaG9zdCAKKyAqIGFuZCBwb3J0LiBUaGUgY29ubmVjdGlvbiBmZCBpcyByZXR1cm5lZCwgYW5kIGlzIHNldCB1cCBhcworICogbm9uYmxvY2tpbmcuCisgKgorICogQHBhcmFtIGhvc3QgdGhlIGhvc3QgbmFtZSB0byBjb25uZWN0IHRvCisgKiBAcGFyYW0gcG9ydCB0aGUgcG9ydCB0byBjb25uZWN0IHRvCisgKiBAcGFyYW0gZmFtaWx5IHRoZSBhZGRyZXNzIGZhbWlseSB0byBsaXN0ZW4gb24sIE5VTEwgZm9yIGFsbAorICogQHBhcmFtIGVycm9yIHJldHVybiBsb2NhdGlvbiBmb3IgZXJyb3IgY29kZQorICogQHJldHVybnMgY29ubmVjdGlvbiBmaWxlIGRlc2NyaXB0b3Igb3IgLTEgb24gZXJyb3IKKyAqLworREJ1c1NvY2tldAorX2RidXNfY29ubmVjdF90Y3Bfc29ja2V0IChjb25zdCBjaGFyICAgICAqaG9zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKnBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpmYW1pbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcikKK3sKKyAgcmV0dXJuIF9kYnVzX2Nvbm5lY3RfdGNwX3NvY2tldF93aXRoX25vbmNlIChob3N0LCBwb3J0LCBmYW1pbHksIChjb25zdCBjaGFyKilOVUxMLCBlcnJvcik7Cit9CisKK0RCdXNTb2NrZXQKK19kYnVzX2Nvbm5lY3RfdGNwX3NvY2tldF93aXRoX25vbmNlIChjb25zdCBjaGFyICAgICAqaG9zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqZmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpub25jZWZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBEQnVzU29ja2V0IGZkID0gREJVU19TT0NLRVRfSU5JVDsKKyAgaW50IHJlczsKKyAgc3RydWN0IGFkZHJpbmZvIGhpbnRzOworICBzdHJ1Y3QgYWRkcmluZm8gKmFpLCAqdG1wOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIGlmICghX2RidXNfd2luX3N0YXJ0dXBfd2luc29jayAoKSkKKyAgICB7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gX2RidXNfc29ja2V0X2dldF9pbnZhbGlkICgpOworICAgIH0KKworICBfREJVU19aRVJPIChoaW50cyk7CisKKyAgaWYgKCFmYW1pbHkpCisgICAgaGludHMuYWlfZmFtaWx5ID0gQUZfVU5TUEVDOworICBlbHNlIGlmICghc3RyY21wKGZhbWlseSwgImlwdjQiKSkKKyAgICBoaW50cy5haV9mYW1pbHkgPSBBRl9JTkVUOworICBlbHNlIGlmICghc3RyY21wKGZhbWlseSwgImlwdjYiKSkKKyAgICBoaW50cy5haV9mYW1pbHkgPSBBRl9JTkVUNjsKKyAgZWxzZQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICBEQlVTX0VSUk9SX0lOVkFMSURfQVJHUywKKyAgICAgICAgICAgICAgICAgICAgICAiVW5rbm93biBhZGRyZXNzIGZhbWlseSAlcyIsIGZhbWlseSk7CisgICAgICByZXR1cm4gX2RidXNfc29ja2V0X2dldF9pbnZhbGlkICgpOworICAgIH0KKyAgaGludHMuYWlfcHJvdG9jb2wgPSBJUFBST1RPX1RDUDsKKyAgaGludHMuYWlfc29ja3R5cGUgPSBTT0NLX1NUUkVBTTsKKyNpZmRlZiBBSV9BRERSQ09ORklHCisgIGhpbnRzLmFpX2ZsYWdzID0gQUlfQUREUkNPTkZJRzsKKyNlbHNlCisgIGhpbnRzLmFpX2ZsYWdzID0gMDsKKyNlbmRpZgorCisgIGlmICgocmVzID0gZ2V0YWRkcmluZm8oaG9zdCwgcG9ydCwgJmhpbnRzLCAmYWkpKSAhPSAwIHx8ICFhaSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAocmVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGxvb2t1cCBob3N0L3BvcnQ6IFwiJXM6JXNcIjogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgaG9zdCwgcG9ydCwgX2RidXNfc3RyZXJyb3IocmVzKSwgcmVzKTsKKyAgICAgIHJldHVybiBfZGJ1c19zb2NrZXRfZ2V0X2ludmFsaWQgKCk7CisgICAgfQorCisgIHRtcCA9IGFpOworICB3aGlsZSAodG1wKQorICAgIHsKKyAgICAgIGlmICgoZmQuc29jayA9IHNvY2tldCAodG1wLT5haV9mYW1pbHksIFNPQ0tfU1RSRUFNLCAwKSkgPT0gSU5WQUxJRF9TT0NLRVQpCisgICAgICAgIHsKKyAgICAgICAgICBEQlVTX1NPQ0tFVF9TRVRfRVJSTk8gKCk7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gb3BlbiBzb2NrZXQ6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3JfZnJvbV9lcnJubyAoKSk7CisgICAgICAgICAgZnJlZWFkZHJpbmZvKGFpKTsKKyAgICAgICAgICByZXR1cm4gX2RidXNfc29ja2V0X2dldF9pbnZhbGlkICgpOworICAgICAgICB9CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIoZXJyb3IpOworCisgICAgICBpZiAoY29ubmVjdCAoZmQuc29jaywgKHN0cnVjdCBzb2NrYWRkciopIHRtcC0+YWlfYWRkciwgdG1wLT5haV9hZGRybGVuKSA9PSBTT0NLRVRfRVJST1IpCisgICAgICAgIHsKKyAgICAgICAgICBEQlVTX1NPQ0tFVF9TRVRfRVJSTk8gKCk7CisgICAgICAgICAgY2xvc2Vzb2NrZXQoZmQuc29jayk7CisgICAgICAgICAgZmQuc29jayA9IElOVkFMSURfU09DS0VUOworICAgICAgICAgIHRtcCA9IHRtcC0+YWlfbmV4dDsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICBicmVhazsKKyAgICB9CisgIGZyZWVhZGRyaW5mbyhhaSk7CisKKyAgaWYgKCFfZGJ1c19zb2NrZXRfaXNfdmFsaWQgKGZkKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gY29ubmVjdCB0byBzb2NrZXQgXCIlczolc1wiICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBob3N0LCBwb3J0LCBfZGJ1c19zdHJlcnJvcl9mcm9tX2Vycm5vICgpKTsKKyAgICAgIHJldHVybiBfZGJ1c19zb2NrZXRfZ2V0X2ludmFsaWQgKCk7CisgICAgfQorCisgIGlmIChub25jZWZpbGUgIT0gTlVMTCkKKyAgICB7CisgICAgICBEQnVzU3RyaW5nIG5vbmNlZmlsZVN0cjsKKyAgICAgIGRidXNfYm9vbF90IHJldDsKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZub25jZWZpbGVTdHIpIHx8CisgICAgICAgICAgIV9kYnVzX3N0cmluZ19hcHBlbmQoJm5vbmNlZmlsZVN0ciwgbm9uY2VmaWxlKSkKKyAgICAgICAgeworICAgICAgICAgIGNsb3Nlc29ja2V0IChmZC5zb2NrKTsKKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgICAgICByZXR1cm4gX2RidXNfc29ja2V0X2dldF9pbnZhbGlkICgpOworICAgICAgICB9CisKKyAgICAgIHJldCA9IF9kYnVzX3NlbmRfbm9uY2UgKGZkLCAmbm9uY2VmaWxlU3RyLCBlcnJvcik7CisKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmbm9uY2VmaWxlU3RyKTsKKworICAgICAgaWYgKCFyZXQpCisgICAgICAgIHsKKyAgICAgICAgICBjbG9zZXNvY2tldCAoZmQuc29jayk7CisgICAgICAgICAgcmV0dXJuIF9kYnVzX3NvY2tldF9nZXRfaW52YWxpZCAoKTsKKyAgICAgICAgfQorICAgIH0KKworICAvKiBFdmVyeSBTT0NLRVQgaXMgYWxzbyBhIEhBTkRMRS4gKi8KKyAgX2RidXNfd2luX2hhbmRsZV9zZXRfY2xvc2Vfb25fZXhlYyAoKEhBTkRMRSkgZmQuc29jayk7CisKKyAgaWYgKCFfZGJ1c19zZXRfc29ja2V0X25vbmJsb2NraW5nIChmZCwgZXJyb3IpKQorICAgIHsKKyAgICAgIGNsb3Nlc29ja2V0IChmZC5zb2NrKTsKKyAgICAgIHJldHVybiBfZGJ1c19zb2NrZXRfZ2V0X2ludmFsaWQgKCk7CisgICAgfQorCisgIHJldHVybiBmZDsKK30KKworLyoqCisgKiBDcmVhdGVzIGEgc29ja2V0IGFuZCBiaW5kcyBpdCB0byB0aGUgZ2l2ZW4gcGF0aCwgdGhlbiBsaXN0ZW5zIG9uCisgKiB0aGUgc29ja2V0LiBUaGUgc29ja2V0IGlzIHNldCB0byBiZSBub25ibG9ja2luZy4gIEluIGNhc2Ugb2YgcG9ydD0wCisgKiBhIHJhbmRvbSBmcmVlIHBvcnQgaXMgdXNlZCBhbmQgcmV0dXJuZWQgaW4gdGhlIHBvcnQgcGFyYW1ldGVyLgorICogSWYgaW5hZGRyX2FueSBpcyBzcGVjaWZpZWQsIHRoZSBob3N0bmFtZSBpcyBpZ25vcmVkLgorICoKKyAqIEBwYXJhbSBob3N0IHRoZSBob3N0IG5hbWUgdG8gbGlzdGVuIG9uCisgKiBAcGFyYW0gcG9ydCB0aGUgcG9ydCB0byBsaXN0ZW4gb24sIGlmIHplcm8gYSBmcmVlIHBvcnQgd2lsbCBiZSB1c2VkIAorICogQHBhcmFtIGZhbWlseSB0aGUgYWRkcmVzcyBmYW1pbHkgdG8gbGlzdGVuIG9uLCBOVUxMIGZvciBhbGwKKyAqIEBwYXJhbSByZXRwb3J0IHN0cmluZyB0byByZXR1cm4gdGhlIGFjdHVhbCBwb3J0IGxpc3RlbmVkIG9uCisgKiBAcGFyYW0gZmRzX3AgbG9jYXRpb24gdG8gc3RvcmUgcmV0dXJuZWQgZmlsZSBkZXNjcmlwdG9ycworICogQHBhcmFtIGVycm9yIHJldHVybiBsb2NhdGlvbiBmb3IgZXJyb3JzCisgKiBAcmV0dXJucyB0aGUgbnVtYmVyIG9mIGxpc3RlbmluZyBmaWxlIGRlc2NyaXB0b3JzIG9yIC0xIG9uIGVycm9yCisgKi8KKworaW50CitfZGJ1c19saXN0ZW5fdGNwX3NvY2tldCAoY29uc3QgY2hhciAgICAgKmhvc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKnBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKmZhbWlseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAqcmV0cG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU29ja2V0ICAgICoqZmRzX3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKQoreworICBEQnVzU29ja2V0ICpsaXN0ZW5fZmQgPSBOVUxMOworICBpbnQgbmxpc3Rlbl9mZCA9IDAsIHJlcywgaSwgcG9ydF9udW0gPSAtMTsKKyAgc3RydWN0IGFkZHJpbmZvIGhpbnRzOworICBzdHJ1Y3QgYWRkcmluZm8gKmFpLCAqdG1wOworCisgIC8vIE9uIFZpc3RhLCBzb2NrYWRkcl9nZW4gbXVzdCBiZSBhIHNvY2thZGRyX2luNiwgYW5kIG5vdCBhIHNvY2thZGRyX2luNl9vbGQKKyAgLy9UaGF0J3MgcmVxdWlyZWQgZm9yIGZhbWlseSA9PSBJUHY2KHdoaWNoIGlzIHRoZSBkZWZhdWx0IG9uIFZpc3RhIGlmIGZhbWlseSBpcyBub3QgZ2l2ZW4pCisgIC8vU28gd2UgdXNlIG91ciBvd24gdW5pb24gaW5zdGVhZCBvZiBzb2NrYWRkcl9nZW46CisKKyAgdHlwZWRlZiB1bmlvbiB7CisJc3RydWN0IHNvY2thZGRyIEFkZHJlc3M7CisJc3RydWN0IHNvY2thZGRyX2luIEFkZHJlc3NJbjsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW42IEFkZHJlc3NJbjY7CisgIH0gbXlzb2NrYWRkcl9nZW47CisKKyAgKmZkc19wID0gTlVMTDsKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgaWYgKCFfZGJ1c193aW5fc3RhcnR1cF93aW5zb2NrICgpKQorICAgIHsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgX0RCVVNfWkVSTyAoaGludHMpOworCisgIGlmICghZmFtaWx5KQorICAgIGhpbnRzLmFpX2ZhbWlseSA9IEFGX0lORVQ7CisgIGVsc2UgaWYgKCFzdHJjbXAoZmFtaWx5LCAiaXB2NCIpKQorICAgIGhpbnRzLmFpX2ZhbWlseSA9IEFGX0lORVQ7CisgIGVsc2UgaWYgKCFzdHJjbXAoZmFtaWx5LCAiaXB2NiIpKQorICAgIGhpbnRzLmFpX2ZhbWlseSA9IEFGX0lORVQ2OworICBlbHNlCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIERCVVNfRVJST1JfSU5WQUxJRF9BUkdTLAorICAgICAgICAgICAgICAgICAgICAgICJVbmtub3duIGFkZHJlc3MgZmFtaWx5ICVzIiwgZmFtaWx5KTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgaGludHMuYWlfcHJvdG9jb2wgPSBJUFBST1RPX1RDUDsKKyAgaGludHMuYWlfc29ja3R5cGUgPSBTT0NLX1NUUkVBTTsKKyNpZmRlZiBBSV9BRERSQ09ORklHCisgIGhpbnRzLmFpX2ZsYWdzID0gQUlfQUREUkNPTkZJRyB8IEFJX1BBU1NJVkU7CisjZWxzZQorICBoaW50cy5haV9mbGFncyA9IEFJX1BBU1NJVkU7CisjZW5kaWYKKworIHJlZG9fbG9va3VwX3dpdGhfcG9ydDoKKyAgaWYgKChyZXMgPSBnZXRhZGRyaW5mbyhob3N0LCBwb3J0LCAmaGludHMsICZhaSkpICE9IDAgfHwgIWFpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChyZXMpLAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gbG9va3VwIGhvc3QvcG9ydDogXCIlczolc1wiOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICBob3N0ID8gaG9zdCA6ICIqIiwgcG9ydCwgX2RidXNfc3RyZXJyb3IocmVzKSwgcmVzKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgdG1wID0gYWk7CisgIHdoaWxlICh0bXApCisgICAgeworICAgICAgREJ1c1NvY2tldCBmZCA9IERCVVNfU09DS0VUX0lOSVQsICpuZXdsaXN0ZW5fZmQ7CisgICAgICBpZiAoKGZkLnNvY2sgPSBzb2NrZXQgKHRtcC0+YWlfZmFtaWx5LCBTT0NLX1NUUkVBTSwgMCkpID09IElOVkFMSURfU09DS0VUKQorICAgICAgICB7CisgICAgICAgICAgREJVU19TT0NLRVRfU0VUX0VSUk5PICgpOworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gb3BlbiBzb2NrZXQ6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvcl9mcm9tX2Vycm5vICgpKTsKKyAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgfQorICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSKGVycm9yKTsKKworICAgICAgaWYgKGJpbmQgKGZkLnNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIqKSB0bXAtPmFpX2FkZHIsIHRtcC0+YWlfYWRkcmxlbikgPT0gU09DS0VUX0VSUk9SKQorICAgICAgICB7CisgICAgICAgICAgREJVU19TT0NLRVRfU0VUX0VSUk5PICgpOworICAgICAgICAgIGNsb3Nlc29ja2V0IChmZC5zb2NrKTsKKyAgICAgICAgICBpZiAoZXJybm8gPT0gV1NBRUFERFJJTlVTRSkKKyAgICAgICAgICB7CisgICAgICAgICAgICAgIC8qIENhbGxpbmcgdGhpcyBmdW5jdGlvbiB3aXRoIHBvcnQ9MCB0cmllcyB0bworICAgICAgICAgICAgICAgKiBiaW5kIHRoZSBzYW1lIHBvcnQgdHdpY2UsIHNvIHdlIHNob3VsZAorICAgICAgICAgICAgICAgKiBpZ25vcmUgdGhlIHNlY29uZCBiaW5kLgorICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgdG1wID0gdG1wLT5haV9uZXh0OworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChlcnJubyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gYmluZCBzb2NrZXQgXCIlczolc1wiOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3QgPyBob3N0IDogIioiLCBwb3J0LCBfZGJ1c19zdHJlcnJvcl9mcm9tX2Vycm5vICgpKTsKKyAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgICAgIGlmIChsaXN0ZW4gKGZkLnNvY2ssIDMwIC8qIGJhY2tsb2cgKi8pID09IFNPQ0tFVF9FUlJPUikKKyAgICAgICAgeworICAgICAgICAgIERCVVNfU09DS0VUX1NFVF9FUlJOTyAoKTsKKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBsaXN0ZW4gb24gc29ja2V0IFwiJXM6JXNcIjogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBob3N0ID8gaG9zdCA6ICIqIiwgcG9ydCwgX2RidXNfc3RyZXJyb3JfZnJvbV9lcnJubyAoKSk7CisgICAgICAgICAgY2xvc2Vzb2NrZXQgKGZkLnNvY2spOworICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICB9CisKKyAgICAgIG5ld2xpc3Rlbl9mZCA9IGRidXNfcmVhbGxvYyhsaXN0ZW5fZmQsIHNpemVvZihEQnVzU29ja2V0KSoobmxpc3Rlbl9mZCsxKSk7CisgICAgICBpZiAoIW5ld2xpc3Rlbl9mZCkKKyAgICAgICAgeworICAgICAgICAgIGNsb3Nlc29ja2V0IChmZC5zb2NrKTsKKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGFsbG9jYXRlIGZpbGUgaGFuZGxlIGFycmF5Iik7CisgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgIH0KKyAgICAgIGxpc3Rlbl9mZCA9IG5ld2xpc3Rlbl9mZDsKKyAgICAgIGxpc3Rlbl9mZFtubGlzdGVuX2ZkXSA9IGZkOworICAgICAgbmxpc3Rlbl9mZCsrOworCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoKHJldHBvcnQpKQorICAgICAgICB7CisgICAgICAgICAgLyogSWYgdGhlIHVzZXIgZGlkbid0IHNwZWNpZnkgYSBwb3J0LCBvciB1c2VkIDAsIHRoZW4KKyAgICAgICAgICAgICB0aGUga2VybmVsIGNob29zZXMgYSBwb3J0LiBBZnRlciB0aGUgZmlyc3QgYWRkcmVzcworICAgICAgICAgICAgIGlzIGJvdW5kIHRvLCB3ZSBuZWVkIHRvIGZvcmNlIGFsbCByZW1haW5pbmcgYWRkcmVzc2VzCisgICAgICAgICAgICAgdG8gdXNlIHRoZSBzYW1lIHBvcnQgKi8KKyAgICAgICAgICBpZiAoIXBvcnQgfHwgIXN0cmNtcChwb3J0LCAiMCIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBteXNvY2thZGRyX2dlbiBhZGRyOworICAgICAgICAgICAgICBzb2NrbGVuX3QgYWRkcmxlbiA9IHNpemVvZihhZGRyKTsKKyAgICAgICAgICAgICAgY2hhciBwb3J0YnVmW05JX01BWFNFUlZdOworCisgICAgICAgICAgICAgIGlmIChnZXRzb2NrbmFtZShmZC5zb2NrLCAmYWRkci5BZGRyZXNzLCAmYWRkcmxlbikgPT0gU09DS0VUX0VSUk9SIHx8CisgICAgICAgICAgICAgICAgKHJlcyA9IGdldG5hbWVpbmZvICgmYWRkci5BZGRyZXNzLCBhZGRybGVuLCBOVUxMLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydGJ1Ziwgc2l6ZW9mKHBvcnRidWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTklfTlVNRVJJQ1NFUlYpKSAhPSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIERCVVNfU09DS0VUX1NFVF9FUlJOTyAoKTsKKyAgICAgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gcmVzb2x2ZSBwb3J0IFwiJXM6JXNcIjogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3QgPyBob3N0IDogIioiLCBwb3J0LCBfZGJ1c19zdHJlcnJvcl9mcm9tX2Vycm5vKCkpOworICAgICAgICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQocmV0cG9ydCwgcG9ydGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgLyogUmVsZWFzZSBjdXJyZW50IGFkZHJlc3MgbGlzdCAmIHJlZG8gbG9va3VwICovCisgICAgICAgICAgICAgIHBvcnQgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEocmV0cG9ydCk7CisgICAgICAgICAgICAgIGZyZWVhZGRyaW5mbyhhaSk7CisgICAgICAgICAgICAgIGdvdG8gcmVkb19sb29rdXBfd2l0aF9wb3J0OworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kKHJldHBvcnQsIHBvcnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAKKyAgICAgIHRtcCA9IHRtcC0+YWlfbmV4dDsKKyAgICB9CisgIGZyZWVhZGRyaW5mbyhhaSk7CisgIGFpID0gTlVMTDsKKworICBpZiAoIW5saXN0ZW5fZmQpCisgICAgeworICAgICAgX2RidXNfd2luX3NldF9lcnJubyAoV1NBRUFERFJJTlVTRSk7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGJpbmQgc29ja2V0IFwiJXM6JXNcIjogJXMiLAorICAgICAgICAgICAgICAgICAgICAgIGhvc3QgPyBob3N0IDogIioiLCBwb3J0LCBfZGJ1c19zdHJlcnJvcl9mcm9tX2Vycm5vICgpKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgc3NjYW5mKF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YShyZXRwb3J0KSwgIiVkIiwgJnBvcnRfbnVtKTsKKworICBmb3IgKGkgPSAwIDsgaSA8IG5saXN0ZW5fZmQgOyBpKyspCisgICAgeworICAgICAgX2RidXNfd2luX2hhbmRsZV9zZXRfY2xvc2Vfb25fZXhlYyAoKEhBTkRMRSkgbGlzdGVuX2ZkW2ldLnNvY2spOworICAgICAgaWYgKCFfZGJ1c19zZXRfc29ja2V0X25vbmJsb2NraW5nIChsaXN0ZW5fZmRbaV0sIGVycm9yKSkKKyAgICAgICAgeworICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICB9CisgICAgfQorCisgICpmZHNfcCA9IGxpc3Rlbl9mZDsKKworICByZXR1cm4gbmxpc3Rlbl9mZDsKKworIGZhaWxlZDoKKyAgaWYgKGFpKQorICAgIGZyZWVhZGRyaW5mbyhhaSk7CisgIGZvciAoaSA9IDAgOyBpIDwgbmxpc3Rlbl9mZCA7IGkrKykKKyAgICBjbG9zZXNvY2tldCAobGlzdGVuX2ZkW2ldLnNvY2spOworICBkYnVzX2ZyZWUobGlzdGVuX2ZkKTsKKyAgcmV0dXJuIC0xOworfQorCisKKy8qKgorICogQWNjZXB0cyBhIGNvbm5lY3Rpb24gb24gYSBsaXN0ZW5pbmcgc29ja2V0LgorICogSGFuZGxlcyBFSU5UUiBmb3IgeW91LgorICoKKyAqIEBwYXJhbSBsaXN0ZW5fZmQgdGhlIGxpc3RlbiBmaWxlIGRlc2NyaXB0b3IKKyAqIEByZXR1cm5zIHRoZSBjb25uZWN0aW9uIGZkIG9mIHRoZSBjbGllbnQsIG9yIC0xIG9uIGVycm9yCisgKi8KK0RCdXNTb2NrZXQKK19kYnVzX2FjY2VwdCAgKERCdXNTb2NrZXQgbGlzdGVuX2ZkKQoreworICBEQnVzU29ja2V0IGNsaWVudF9mZDsKKworIHJldHJ5OgorICBjbGllbnRfZmQuc29jayA9IGFjY2VwdCAobGlzdGVuX2ZkLnNvY2ssIE5VTEwsIE5VTEwpOworCisgIGlmICghX2RidXNfc29ja2V0X2lzX3ZhbGlkIChjbGllbnRfZmQpKQorICAgIHsKKyAgICAgIERCVVNfU09DS0VUX1NFVF9FUlJOTyAoKTsKKyAgICAgIGlmIChlcnJubyA9PSBFSU5UUikKKyAgICAgICAgZ290byByZXRyeTsKKyAgICB9CisKKyAgX2RidXNfdmVyYm9zZSAoImNsaWVudCBmZCAlSXUgYWNjZXB0ZWRcbiIsIGNsaWVudF9mZC5zb2NrKTsKKyAgCisgIHJldHVybiBjbGllbnRfZmQ7Cit9CisKKworCisKK2RidXNfYm9vbF90CitfZGJ1c19zZW5kX2NyZWRlbnRpYWxzX3NvY2tldCAoREJ1c1NvY2tldCAgICAgIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisvKiBGSVhNRTogZm9yIHRoZSBzZXNzaW9uIGJ1cyBjcmVkZW50aWFscyBzaG91bGRuJ3QgbWF0dGVyICg/KSwgYnV0CisgKiBmb3IgdGhlIHN5c3RlbSBidXMgdGhleSBhcmUgcHJlc3VtYWJseSBlc3NlbnRpYWwuIEEgcm91Z2ggb3V0bGluZQorICogb2YgYSB3YXkgdG8gaW1wbGVtZW50IHRoZSBjcmVkZW50aWFsIHRyYW5zZmVyIHdvdWxkIGJlIHRoaXM6CisgKgorICogY2xpZW50IHdhaXRzIHRvICpyZWFkKiBhIGJ5dGUuCisgKgorICogc2VydmVyIGNyZWF0ZXMgYSBuYW1lZCBwaXBlIHdpdGggYSByYW5kb20gbmFtZSwgc2VuZHMgYSBieXRlCisgKiBjb250aW5pbmcgaXRzIGxlbmd0aCwgYW5kIGl0cyBuYW1lLgorICoKKyAqIGNsaWVudCByZWFkcyB0aGUgbmFtZSwgY29ubmVjdHMgdG8gaXQgKHVzaW5nIFdpbjMyIEFQSSkuCisgKgorICogc2VydmVyIHdhaXRzIGZvciBjb25uZWN0aW9uIHRvIHRoZSBuYW1lZCBwaXBlLCB0aGVuIGNhbGxzCisgKiBJbXBlcnNvbmF0ZU5hbWVkUGlwZUNsaWVudCgpLCBub3RlcyBpdHMgbm93LWN1cnJlbnQgY3JlZGVudGlhbHMsCisgKiBjYWxscyBSZXZlcnRUb1NlbGYoKSwgY2xvc2VzIGl0cyBoYW5kbGVzIHRvIHRoZSBuYW1lZCBwaXBlLCBhbmQKKyAqIGlzIGRvbmUuIChNYXliZSB0aGVyZSBpcyBzb21lIG90aGVyIHdheSB0byBnZXQgdGhlIFNJRCBvZiBhIG5hbWVkCisgKiBwaXBlIGNsaWVudCB3aXRob3V0IGhhdmluZyB0byB1c2UgaW1wZXJzb25hdGlvbj8pCisgKgorICogY2xpZW50IGNsb3NlcyBpdHMgaGFuZGxlcyBhbmQgaXMgZG9uZS4KKyAqIAorICogUmFsZjogV2h5IG5vdCBzZW5kaW5nIGNyZWRlbnRpYWxzIG92ZXIgdGhlIGdpdmVuIHRoaXMgY29ubmVjdGlvbiA/CisgKiBVc2luZyBuYW1lZCBwaXBlcyBtYWtlcyBpdCBpbXBvc3NpYmxlIHRvIGJlIGNvbm5lY3RlZCBmcm9tIGEgdW5peCBjbGllbnQuICAKKyAqCisgKi8KKyAgaW50IGJ5dGVzX3dyaXR0ZW47CisgIERCdXNTdHJpbmcgYnVmOyAKKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdF9sZW4gKCZidWYsICJcMCIsIDEpOworYWdhaW46CisgIGJ5dGVzX3dyaXR0ZW4gPSBfZGJ1c193cml0ZV9zb2NrZXQgKGhhbmRsZSwgJmJ1ZiwgMCwgMSApOworCisgIGlmIChieXRlc193cml0dGVuIDwgMCAmJiBlcnJubyA9PSBFSU5UUikKKyAgICBnb3RvIGFnYWluOworCisgIGlmIChieXRlc193cml0dGVuIDwgMCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGVycm5vKSwKKyAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHdyaXRlIGNyZWRlbnRpYWxzIGJ5dGU6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmVycm9yX2Zyb21fZXJybm8gKCkpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgZWxzZSBpZiAoYnl0ZXNfd3JpdHRlbiA9PSAwKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9JT19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAid3JvdGUgemVybyBieXRlcyB3cml0aW5nIGNyZWRlbnRpYWxzIGJ5dGUiKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfZGJ1c19hc3NlcnQgKGJ5dGVzX3dyaXR0ZW4gPT0gMSk7CisgICAgICBfZGJ1c192ZXJib3NlICgid3JvdGUgMSB6ZXJvIGJ5dGUsIGNyZWRlbnRpYWwgc2VuZGluZyBpc24ndCBpbXBsZW1lbnRlZCB5ZXRcbiIpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBSZWFkcyBhIHNpbmdsZSBieXRlIHdoaWNoIG11c3QgYmUgbnVsIChhbiBlcnJvciBvY2N1cnMgb3RoZXJ3aXNlKSwKKyAqIGFuZCByZWFkcyB1bml4IGNyZWRlbnRpYWxzIGlmIGF2YWlsYWJsZS4gRmlsbHMgaW4gcGlkL3VpZC9naWQgd2l0aAorICogLTEgaWYgbm8gY3JlZGVudGlhbHMgYXJlIGF2YWlsYWJsZS4gUmV0dXJuIHZhbHVlIGluZGljYXRlcyB3aGV0aGVyCisgKiBhIGJ5dGUgd2FzIHJlYWQsIG5vdCB3aGV0aGVyIHdlIGdvdCB2YWxpZCBjcmVkZW50aWFscy4gT24gc29tZQorICogc3lzdGVtcywgc3VjaCBhcyBMaW51eCwgcmVhZGluZy93cml0aW5nIHRoZSBieXRlIGlzbid0IGFjdHVhbGx5CisgKiByZXF1aXJlZCwgYnV0IHdlIGRvIGl0IGFueXdheSBqdXN0IHRvIGF2b2lkIG11bHRpcGxlIGNvZGVwYXRocy4KKyAqCisgKiBGYWlscyBpZiBubyBieXRlIGlzIGF2YWlsYWJsZSwgc28geW91IG11c3Qgc2VsZWN0KCkgZmlyc3QuCisgKgorICogVGhlIHBvaW50IG9mIHRoZSBieXRlIGlzIHRoYXQgb24gc29tZSBzeXN0ZW1zIHdlIGhhdmUgdG8KKyAqIHVzZSBzZW5kbXNnKCkvcmVjdm1zZygpIHRvIHRyYW5zbWl0IGNyZWRlbnRpYWxzLgorICoKKyAqIEBwYXJhbSBoYW5kbGUgdGhlIGNsaWVudCBmaWxlIGRlc2NyaXB0b3IKKyAqIEBwYXJhbSBjcmVkZW50aWFscyBzdHJ1Y3QgdG8gZmlsbCB3aXRoIGNyZWRlbnRpYWxzIG9mIGNsaWVudAorICogQHBhcmFtIGVycm9yIGxvY2F0aW9uIHRvIHN0b3JlIGVycm9yIGNvZGUKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3JlYWRfY3JlZGVudGlhbHNfc29ja2V0ICAoREJ1c1NvY2tldCAgICAgICBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDcmVkZW50aWFscyAqY3JlZGVudGlhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAqZXJyb3IpCit7CisgIGludCBieXRlc19yZWFkID0gMDsKKyAgREJ1c1N0cmluZyBidWY7CisKKyAgY2hhciAqc2lkID0gTlVMTDsKKyAgZGJ1c19waWRfdCBwaWQ7CisgIGludCByZXR2YWwgPSBGQUxTRTsKKworICAvLyBjb3VsZCBmYWlsIGR1ZSB0b28gT09NCisgIGlmIChfZGJ1c19zdHJpbmdfaW5pdCAoJmJ1ZikpCisgICAgeworICAgICAgYnl0ZXNfcmVhZCA9IF9kYnVzX3JlYWRfc29ja2V0IChoYW5kbGUsICZidWYsIDEgKTsKKworICAgICAgaWYgKGJ5dGVzX3JlYWQgPiAwKSAKKyAgICAgICAgX2RidXNfdmVyYm9zZSAoImdvdCBvbmUgemVybyBieXRlIGZyb20gc2VydmVyXG4iKTsKKworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZidWYpOworICAgIH0KKworICBwaWQgPSBfZGJ1c19nZXRfcGVlcl9waWRfZnJvbV90Y3BfaGFuZGxlIChoYW5kbGUuc29jayk7CisgIGlmIChwaWQgPT0gMCkKKyAgICByZXR1cm4gVFJVRTsKKworICBfZGJ1c19jcmVkZW50aWFsc19hZGRfcGlkIChjcmVkZW50aWFscywgcGlkKTsKKworICBpZiAoX2RidXNfZ2V0c2lkICgmc2lkLCBwaWQpKQorICAgIHsKKyAgICAgIGlmICghX2RidXNfY3JlZGVudGlhbHNfYWRkX3dpbmRvd3Nfc2lkIChjcmVkZW50aWFscywgc2lkKSkKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIHJldHZhbCA9IFRSVUU7CisKK291dDoKKyAgaWYgKHNpZCkKKyAgICBMb2NhbEZyZWUgKHNpZCk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisqIENoZWNrcyB0byBtYWtlIHN1cmUgdGhlIGdpdmVuIGRpcmVjdG9yeSBpcyAKKyogcHJpdmF0ZSB0byB0aGUgdXNlciAKKyoKKyogQHBhcmFtIGRpciB0aGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5CisqIEBwYXJhbSBlcnJvciBlcnJvciByZXR1cm4KKyogQHJldHVybnMgI0ZBTFNFIG9uIGZhaWx1cmUKKyoqLworZGJ1c19ib29sX3QKK19kYnVzX2NoZWNrX2Rpcl9pc19wcml2YXRlX3RvX3VzZXIgKERCdXNTdHJpbmcgKmRpciwgREJ1c0Vycm9yICplcnJvcikKK3sKKyAgLyogVE9ETyAqLworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKworLyoqCisgKiBBcHBlbmRzIHRoZSBnaXZlbiBmaWxlbmFtZSB0byB0aGUgZ2l2ZW4gZGlyZWN0b3J5LgorICoKKyAqIEB0b2RvIGl0IG1pZ2h0IGJlIGN1dGUgdG8gY29sbGFwc2UgbXVsdGlwbGUgJy8nIHN1Y2ggYXMgImZvby8vIgorICogY29uY2F0ICIvL2JhciIKKyAqCisgKiBAcGFyYW0gZGlyIHRoZSBkaXJlY3RvcnkgbmFtZQorICogQHBhcmFtIG5leHRfY29tcG9uZW50IHRoZSBmaWxlbmFtZQorICogQHJldHVybnMgI1RSVUUgb24gc3VjY2VzcworICovCitkYnVzX2Jvb2xfdAorX2RidXNfY29uY2F0X2Rpcl9hbmRfZmlsZSAoREJ1c1N0cmluZyAgICAgICAqZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqbmV4dF9jb21wb25lbnQpCit7CisgIGRidXNfYm9vbF90IGRpcl9lbmRzX2luX3NsYXNoOworICBkYnVzX2Jvb2xfdCBmaWxlX3N0YXJ0c193aXRoX3NsYXNoOworCisgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoZGlyKSA9PSAwIHx8CisgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAobmV4dF9jb21wb25lbnQpID09IDApCisgICAgcmV0dXJuIFRSVUU7CisKKyAgZGlyX2VuZHNfaW5fc2xhc2ggPQorICAgICgnLycgPT0gX2RidXNfc3RyaW5nX2dldF9ieXRlIChkaXIsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChkaXIpIC0gMSkgfHwKKyAgICAgJ1xcJyA9PSBfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKGRpciwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGRpcikgLSAxKSk7CisKKyAgZmlsZV9zdGFydHNfd2l0aF9zbGFzaCA9CisgICAgKCcvJyA9PSBfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKG5leHRfY29tcG9uZW50LCAwKSB8fAorICAgICAnXFwnID09IF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAobmV4dF9jb21wb25lbnQsIDApKTsKKworICBpZiAoZGlyX2VuZHNfaW5fc2xhc2ggJiYgZmlsZV9zdGFydHNfd2l0aF9zbGFzaCkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfc2hvcnRlbiAoZGlyLCAxKTsKKyAgICB9CisgIGVsc2UgaWYgKCEoZGlyX2VuZHNfaW5fc2xhc2ggfHwgZmlsZV9zdGFydHNfd2l0aF9zbGFzaCkpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kX2J5dGUgKGRpciwgJ1xcJykpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgcmV0dXJuIF9kYnVzX3N0cmluZ19jb3B5IChuZXh0X2NvbXBvbmVudCwgMCwgZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChkaXIpKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tIERCdXNDcmVkZW50aWFscyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqCisgKiBBZGRzIHRoZSBjcmVkZW50aWFscyBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiB1c2VybmFtZS4KKyAqCisgKiBAcGFyYW0gY3JlZGVudGlhbHMgY3JlZGVudGlhbHMgdG8gZmlsbCBpbiAKKyAqIEBwYXJhbSB1c2VybmFtZSB0aGUgdXNlcm5hbWUKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSB1c2VybmFtZSBleGlzdGVkIGFuZCB3ZSBnb3Qgc29tZSBjcmVkZW50aWFscworICovCitkYnVzX2Jvb2xfdAorX2RidXNfY3JlZGVudGlhbHNfYWRkX2Zyb21fdXNlciAoREJ1c0NyZWRlbnRpYWxzICAqY3JlZGVudGlhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqdXNlcm5hbWUpCit7CisgIHJldHVybiBfZGJ1c19jcmVkZW50aWFsc19hZGRfd2luZG93c19zaWQgKGNyZWRlbnRpYWxzLAorICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEodXNlcm5hbWUpKTsKK30KKworLyoqCisgKiBBZGRzIHRoZSBjcmVkZW50aWFscyBvZiB0aGUgY3VycmVudCBwcm9jZXNzIHRvIHRoZQorICogcGFzc2VkLWluIGNyZWRlbnRpYWxzIG9iamVjdC4KKyAqCisgKiBAcGFyYW0gY3JlZGVudGlhbHMgY3JlZGVudGlhbHMgdG8gYWRkIHRvCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm8gbWVtb3J5OyBkb2VzIG5vdCBwcm9wZXJseSByb2xsIGJhY2sgb24gZmFpbHVyZSwgc28gb25seSBzb21lIGNyZWRlbnRpYWxzIG1heSBoYXZlIGJlZW4gYWRkZWQKKyAqLworCitkYnVzX2Jvb2xfdAorX2RidXNfY3JlZGVudGlhbHNfYWRkX2Zyb21fY3VycmVudF9wcm9jZXNzIChEQnVzQ3JlZGVudGlhbHMgKmNyZWRlbnRpYWxzKQoreworICBkYnVzX2Jvb2xfdCByZXR2YWwgPSBGQUxTRTsKKyAgY2hhciAqc2lkID0gTlVMTDsKKworICBpZiAoIV9kYnVzX2dldHNpZCgmc2lkLCBfZGJ1c19nZXRwaWQoKSkpCisgICAgZ290byBmYWlsZWQ7CisKKyAgaWYgKCFfZGJ1c19jcmVkZW50aWFsc19hZGRfcGlkIChjcmVkZW50aWFscywgX2RidXNfZ2V0cGlkKCkpKQorICAgIGdvdG8gZmFpbGVkOworCisgIGlmICghX2RidXNfY3JlZGVudGlhbHNfYWRkX3dpbmRvd3Nfc2lkIChjcmVkZW50aWFscyxzaWQpKQorICAgIGdvdG8gZmFpbGVkOworCisgIHJldHZhbCA9IFRSVUU7CisgIGdvdG8gZW5kOworZmFpbGVkOgorICByZXR2YWwgPSBGQUxTRTsKK2VuZDoKKyAgaWYgKHNpZCkKKyAgICBMb2NhbEZyZWUoc2lkKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIEFwcGVuZCB0byB0aGUgc3RyaW5nIHRoZSBpZGVudGl0eSB3ZSB3b3VsZCBsaWtlIHRvIGhhdmUgd2hlbiB3ZQorICogYXV0aGVudGljYXRlLCBvbiBVTklYIHRoaXMgaXMgdGhlIGN1cnJlbnQgcHJvY2VzcyBVSUQgYW5kIG9uCisgKiBXaW5kb3dzIHNvbWV0aGluZyBlbHNlLCBwcm9iYWJseSBhIFdpbmRvd3MgU0lEIHN0cmluZy4gIE5vIGVzY2FwaW5nCisgKiBpcyByZXF1aXJlZCwgdGhhdCBpcyBkb25lIGluIGRidXMtYXV0aC5jLiBUaGUgdXNlcm5hbWUgaGVyZQorICogbmVlZCBub3QgYmUgYW55dGhpbmcgaHVtYW4tcmVhZGFibGUsIGl0IGNhbiBiZSB0aGUgbWFjaGluZS1yZWFkYWJsZQorICogZm9ybSBpLmUuIGEgdXNlciBpZC4KKyAqIAorICogQHBhcmFtIHN0ciB0aGUgc3RyaW5nIHRvIGFwcGVuZCB0bworICogQHJldHVybnMgI0ZBTFNFIG9uIG5vIG1lbW9yeQorICogQHRvZG8gdG8gd2hpY2ggY2xhc3MgYmVsb25ncyB0aGlzIAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfYXBwZW5kX3VzZXJfZnJvbV9jdXJyZW50X3Byb2Nlc3MgKERCdXNTdHJpbmcgKnN0cikKK3sKKyAgZGJ1c19ib29sX3QgcmV0dmFsID0gRkFMU0U7CisgIGNoYXIgKnNpZCA9IE5VTEw7CisKKyAgaWYgKCFfZGJ1c19nZXRzaWQoJnNpZCwgX2RidXNfZ2V0cGlkKCkpKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR2YWwgPSBfZGJ1c19zdHJpbmdfYXBwZW5kIChzdHIsc2lkKTsKKworICBMb2NhbEZyZWUoc2lkKTsKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBHZXRzIG91ciBwcm9jZXNzIElECisgKiBAcmV0dXJucyBwcm9jZXNzIElECisgKi8KK2RidXNfcGlkX3QKK19kYnVzX2dldHBpZCAodm9pZCkKK3sKKyAgcmV0dXJuIEdldEN1cnJlbnRQcm9jZXNzSWQgKCk7Cit9CisKKy8qKiBHZXRzIG91ciBVbml4IFVJRAorICogQHJldHVybnMgb24gV2luZG93cywganVzdCBEQlVTX1VJRF9VTlNFVAorICovCitkYnVzX3VpZF90CitfZGJ1c19nZXR1aWQgKHZvaWQpCit7CisgIHJldHVybiBEQlVTX1VJRF9VTlNFVDsKK30KKworLyoqIG5hbm9zZWNvbmRzIGluIGEgc2Vjb25kICovCisjZGVmaW5lIE5BTk9TRUNPTkRTX1BFUl9TRUNPTkQgICAgICAgMTAwMDAwMDAwMAorLyoqIG1pY3Jvc2Vjb25kcyBpbiBhIHNlY29uZCAqLworI2RlZmluZSBNSUNST1NFQ09ORFNfUEVSX1NFQ09ORCAgICAgIDEwMDAwMDAKKy8qKiBtaWxsaXNlY29uZHMgaW4gYSBzZWNvbmQgKi8KKyNkZWZpbmUgTUlMTElTRUNPTkRTX1BFUl9TRUNPTkQgICAgICAxMDAwCisvKiogbmFub3NlY29uZHMgaW4gYSBtaWxsaXNlY29uZCAqLworI2RlZmluZSBOQU5PU0VDT05EU19QRVJfTUlMTElTRUNPTkQgIDEwMDAwMDAKKy8qKiBtaWNyb3NlY29uZHMgaW4gYSBtaWxsaXNlY29uZCAqLworI2RlZmluZSBNSUNST1NFQ09ORFNfUEVSX01JTExJU0VDT05EIDEwMDAKKworLyoqCisgKiBTbGVlcHMgdGhlIGdpdmVuIG51bWJlciBvZiBtaWxsaXNlY29uZHMuCisgKiBAcGFyYW0gbWlsbGlzZWNvbmRzIG51bWJlciBvZiBtaWxsaXNlY29uZHMKKyAqLwordm9pZAorX2RidXNfc2xlZXBfbWlsbGlzZWNvbmRzIChpbnQgbWlsbGlzZWNvbmRzKQoreworICBTbGVlcCAobWlsbGlzZWNvbmRzKTsKK30KKworCisvKioKKyAqIEdldCBjdXJyZW50IHRpbWUsIGFzIGluIGdldHRpbWVvZmRheSgpLiBOZXZlciB1c2VzIHRoZSBtb25vdG9uaWMKKyAqIGNsb2NrLgorICoKKyAqIEBwYXJhbSB0dl9zZWMgcmV0dXJuIGxvY2F0aW9uIGZvciBudW1iZXIgb2Ygc2Vjb25kcworICogQHBhcmFtIHR2X3VzZWMgcmV0dXJuIGxvY2F0aW9uIGZvciBudW1iZXIgb2YgbWljcm9zZWNvbmRzCisgKi8KK3ZvaWQKK19kYnVzX2dldF9yZWFsX3RpbWUgKGxvbmcgKnR2X3NlYywKKyAgICAgICAgICAgICAgICAgICAgIGxvbmcgKnR2X3VzZWMpCit7CisgIEZJTEVUSU1FIGZ0OworICBkYnVzX3VpbnQ2NF90IHRpbWU2NDsKKworICBHZXRTeXN0ZW1UaW1lQXNGaWxlVGltZSAoJmZ0KTsKKworICBtZW1jcHkgKCZ0aW1lNjQsICZmdCwgc2l6ZW9mICh0aW1lNjQpKTsKKworICAvKiBDb252ZXJ0IGZyb20gMTAwcyBvZiBuYW5vc2Vjb25kcyBzaW5jZSAxNjAxLTAxLTAxCisgICogdG8gVW5peCBlcG9jaC4gWWVzLCB0aGlzIGlzIFkyMDM4IHVuc2FmZS4KKyAgKi8KKyAgdGltZTY0IC09IERCVVNfSU5UNjRfQ09OU1RBTlQgKDExNjQ0NDczNjAwMDAwMDAwMCk7CisgIHRpbWU2NCAvPSAxMDsKKworICBpZiAodHZfc2VjKQorICAgICp0dl9zZWMgPSB0aW1lNjQgLyAxMDAwMDAwOworCisgIGlmICh0dl91c2VjKQorICAgICp0dl91c2VjID0gdGltZTY0ICUgMTAwMDAwMDsKK30KKworLyoqCisgKiBHZXQgY3VycmVudCB0aW1lLCBhcyBpbiBnZXR0aW1lb2ZkYXkoKS4gVXNlIHRoZSBtb25vdG9uaWMgY2xvY2sgaWYKKyAqIGF2YWlsYWJsZSwgdG8gYXZvaWQgcHJvYmxlbXMgd2hlbiB0aGUgc3lzdGVtIHRpbWUgY2hhbmdlcy4KKyAqCisgKiBAcGFyYW0gdHZfc2VjIHJldHVybiBsb2NhdGlvbiBmb3IgbnVtYmVyIG9mIHNlY29uZHMKKyAqIEBwYXJhbSB0dl91c2VjIHJldHVybiBsb2NhdGlvbiBmb3IgbnVtYmVyIG9mIG1pY3Jvc2Vjb25kcworICovCit2b2lkCitfZGJ1c19nZXRfbW9ub3RvbmljX3RpbWUgKGxvbmcgKnR2X3NlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyAqdHZfdXNlYykKK3sKKyAgLyogbm8gaW1wbGVtZW50YXRpb24geWV0LCBmYWxsIGJhY2sgdG8gd2FsbC1jbG9jayB0aW1lICovCisgIF9kYnVzX2dldF9yZWFsX3RpbWUgKHR2X3NlYywgdHZfdXNlYyk7Cit9CisKKy8qKgorICogc2lnbmFsIChTSUdQSVBFLCBTSUdfSUdOKTsKKyAqLwordm9pZAorX2RidXNfZGlzYWJsZV9zaWdwaXBlICh2b2lkKQoreworfQorCisvKioKKyAqIENyZWF0ZXMgYSBkaXJlY3RvcnkuIFVubGlrZSBfZGJ1c19lbnN1cmVfZGlyZWN0b3J5KCksIHRoaXMgb25seSBzdWNjZWVkcworICogaWYgdGhlIGRpcmVjdG9yeSBpcyBnZW51aW5lbHkgbmV3bHktY3JlYXRlZC4KKyAqCisgKiBAcGFyYW0gZmlsZW5hbWUgZGlyZWN0b3J5IGZpbGVuYW1lCisgKiBAcGFyYW0gZXJyb3IgaW5pdGlhbGl6ZWQgZXJyb3Igb2JqZWN0CisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19jcmVhdGVfZGlyZWN0b3J5IChjb25zdCBEQnVzU3RyaW5nICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICBjb25zdCBjaGFyICpmaWxlbmFtZV9jOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIGZpbGVuYW1lX2MgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKGZpbGVuYW1lKTsKKworICBpZiAoIUNyZWF0ZURpcmVjdG9yeUEgKGZpbGVuYW1lX2MsIE5VTEwpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBjcmVhdGUgZGlyZWN0b3J5ICVzOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZV9jLCBfZGJ1c19zdHJlcnJvcl9mcm9tX2Vycm5vICgpKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBDcmVhdGVzIGEgZGlyZWN0b3J5OyBzdWNjZWVkcyBpZiB0aGUgZGlyZWN0b3J5CisgKiBpcyBjcmVhdGVkIG9yIGFscmVhZHkgZXhpc3RlZC4KKyAqCisgKiBAcGFyYW0gZmlsZW5hbWUgZGlyZWN0b3J5IGZpbGVuYW1lCisgKiBAcGFyYW0gZXJyb3IgaW5pdGlhbGl6ZWQgZXJyb3Igb2JqZWN0CisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19lbnN1cmVfZGlyZWN0b3J5IChjb25zdCBEQnVzU3RyaW5nICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworICBjb25zdCBjaGFyICpmaWxlbmFtZV9jOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIGZpbGVuYW1lX2MgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKGZpbGVuYW1lKTsKKworICBpZiAoIUNyZWF0ZURpcmVjdG9yeUEgKGZpbGVuYW1lX2MsIE5VTEwpKQorICAgIHsKKyAgICAgIGlmIChHZXRMYXN0RXJyb3IgKCkgPT0gRVJST1JfQUxSRUFEWV9FWElTVFMpCisgICAgICAgIHJldHVybiBUUlVFOworCisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gY3JlYXRlIGRpcmVjdG9yeSAlczogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWVfYywgX2RidXNfc3RyZXJyb3JfZnJvbV9lcnJubyAoKSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICBlbHNlCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKworLyoqCisgKiBHZW5lcmF0ZXMgdGhlIGdpdmVuIG51bWJlciBvZiByYW5kb20gYnl0ZXMsCisgKiB1c2luZyB0aGUgYmVzdCBtZWNoYW5pc20gd2UgY2FuIGNvbWUgdXAgd2l0aC4KKyAqCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcKKyAqIEBwYXJhbSBuX2J5dGVzIHRoZSBudW1iZXIgb2YgcmFuZG9tIGJ5dGVzIHRvIGFwcGVuZCB0byBzdHJpbmcKKyAqIEBwYXJhbSBlcnJvciBsb2NhdGlvbiB0byBzdG9yZSByZWFzb24gZm9yIGZhaWx1cmUKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2dlbmVyYXRlX3JhbmRvbV9ieXRlcyAoREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICBuX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICplcnJvcikKK3sKKyAgaW50IG9sZF9sZW47CisgIHVuc2lnbmVkIGNoYXIgKnA7CisgIEhDUllQVFBST1YgaHByb3Y7CisKKyAgb2xkX2xlbiA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChzdHIpOworCisgIGlmICghX2RidXNfc3RyaW5nX2xlbmd0aGVuIChzdHIsIG5fYnl0ZXMpKQorICAgIHsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgcCA9IF9kYnVzX3N0cmluZ19nZXRfdWRhdGFfbGVuIChzdHIsIG9sZF9sZW4sIG5fYnl0ZXMpOworCisgIGlmICghQ3J5cHRBY3F1aXJlQ29udGV4dCAoJmhwcm92LCBOVUxMLCBOVUxMLCBQUk9WX1JTQV9GVUxMLCBDUllQVF9WRVJJRllDT05URVhUKSkKKyAgICB7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghQ3J5cHRHZW5SYW5kb20gKGhwcm92LCBuX2J5dGVzLCBwKSkKKyAgICB7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICBDcnlwdFJlbGVhc2VDb250ZXh0IChocHJvdiwgMCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIENyeXB0UmVsZWFzZUNvbnRleHQgKGhwcm92LCAwKTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBHZXRzIHRoZSB0ZW1wb3JhcnkgZmlsZXMgZGlyZWN0b3J5IGJ5IGluc3BlY3RpbmcgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyAKKyAqIFRNUERJUiwgVE1QLCBhbmQgVEVNUCBpbiB0aGF0IG9yZGVyLiBJZiBub25lIG9mIHRob3NlIGFyZSBzZXQgIi90bXAiIGlzIHJldHVybmVkCisgKgorICogQHJldHVybnMgbG9jYXRpb24gb2YgdGVtcCBkaXJlY3RvcnksIG9yICNOVUxMIGlmIG5vIG1lbW9yeSBmb3IgbG9ja2luZworICovCitjb25zdCBjaGFyKgorX2RidXNfZ2V0X3RtcGRpcih2b2lkKQoreworICAvKiBQcm90ZWN0ZWQgYnkgX0RCVVNfTE9DS19zeXNkZXBzICovCisgIHN0YXRpYyBjb25zdCBjaGFyKiB0bXBkaXIgPSBOVUxMOworICBzdGF0aWMgY2hhciBidWZbMTAwMF07CisKKyAgaWYgKCFfREJVU19MT0NLIChzeXNkZXBzKSkKKyAgICByZXR1cm4gTlVMTDsKKworICBpZiAodG1wZGlyID09IE5VTEwpCisgICAgeworICAgICAgdW5zaWduZWQgY2hhciAqbGFzdF9zbGFzaDsKKyAgICAgIHVuc2lnbmVkIGNoYXIgKnAgPSAodW5zaWduZWQgY2hhciAqKWJ1ZjsKKworICAgICAgaWYgKCFHZXRUZW1wUGF0aEEgKHNpemVvZiAoYnVmKSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3dhcm4gKCJHZXRUZW1wUGF0aCBmYWlsZWQiKTsKKyAgICAgICAgICBfZGJ1c19hYm9ydCAoKTsKKyAgICAgICAgfQorCisgICAgICAvKiBEcm9wIHRlcm1pbmF0aW5nIGJhY2tzbGFzaCBvciBzbGFzaCAqLworICAgICAgbGFzdF9zbGFzaCA9IF9tYnNyY2hyIChwLCAnXFwnKTsKKyAgICAgIGlmIChsYXN0X3NsYXNoID4gcCAmJiBsYXN0X3NsYXNoWzFdID09ICdcMCcpCisgICAgICAgIGxhc3Rfc2xhc2hbMF0gPSAnXDAnOworICAgICAgbGFzdF9zbGFzaCA9IF9tYnNyY2hyIChwLCAnLycpOworICAgICAgaWYgKGxhc3Rfc2xhc2ggPiBwICYmIGxhc3Rfc2xhc2hbMV0gPT0gJ1wwJykKKyAgICAgICAgbGFzdF9zbGFzaFswXSA9ICdcMCc7CisKKyAgICAgIHRtcGRpciA9IGJ1ZjsKKyAgICB9CisKKyAgX0RCVVNfVU5MT0NLIChzeXNkZXBzKTsKKworICBfZGJ1c19hc3NlcnQodG1wZGlyICE9IE5VTEwpOworCisgIHJldHVybiB0bXBkaXI7Cit9CisKKworLyoqCisgKiBEZWxldGVzIHRoZSBnaXZlbiBmaWxlLgorICoKKyAqIEBwYXJhbSBmaWxlbmFtZSB0aGUgZmlsZW5hbWUKKyAqIEBwYXJhbSBlcnJvciBlcnJvciBsb2NhdGlvbgorICogCisgKiBAcmV0dXJucyAjVFJVRSBpZiB1bmxpbmsoKSBzdWNjZWVkZWQKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2RlbGV0ZV9maWxlIChjb25zdCBEQnVzU3RyaW5nICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgY29uc3QgY2hhciAqZmlsZW5hbWVfYzsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBmaWxlbmFtZV9jID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhIChmaWxlbmFtZSk7CisKKyAgaWYgKERlbGV0ZUZpbGVBIChmaWxlbmFtZV9jKSA9PSAwKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBkZWxldGUgZmlsZSAlczogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWVfYywgX2RidXNfc3RyZXJyb3JfZnJvbV9lcnJubyAoKSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICBlbHNlCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKyNpZiAhZGVmaW5lZCAoREJVU19ESVNBQkxFX0FTU0VSVCkgfHwgZGVmaW5lZChEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUykKKworI2lmIGRlZmluZWQoX01TQ19WRVIpIHx8IGRlZmluZWQoREJVU19XSU5DRSkKKyMgaWZkZWYgQkFDS1RSQUNFUworIyAgdW5kZWYgQkFDS1RSQUNFUworIyBlbmRpZgorI2Vsc2UKKyMgZGVmaW5lIEJBQ0tUUkFDRVMKKyNlbmRpZgorCisjaWZkZWYgQkFDS1RSQUNFUworLyoKKyAqIEJhY2t0cmFjZSBHZW5lcmF0b3IKKyAqCisgKiBDb3B5cmlnaHQgMjAwNCBFcmljIFBvZWNoCisgKiBDb3B5cmlnaHQgMjAwNCBSb2JlcnQgU2hlYXJtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisKKyNpbmNsdWRlIDx3aW52ZXIuaD4KKyNpbmNsdWRlIDxpbWFnZWhscC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNkZWZpbmUgRFBSSU5URihmbXQsIC4uLikgZnByaW50ZiAoc3RkZXJyLCBmbXQsICMjX19WQV9BUkdTX18pCisKKyNpZmRlZiBfTVNDX1ZFUgorI2RlZmluZSBCT09MIGludAorCisjZGVmaW5lIF9faTM4Nl9fCisjZW5kaWYKKworc3RhdGljIHZvaWQgZHVtcF9iYWNrdHJhY2VfZm9yX3RocmVhZCAoSEFORExFIGhUaHJlYWQpCit7CisgIEFERFJFU1Mgb2xkX2FkZHJlc3M7CisgIFNUQUNLRlJBTUUgc2Y7CisgIENPTlRFWFQgY29udGV4dDsKKyAgRFdPUkQgZHdJbWFnZVR5cGU7CisgIGludCBpID0gMDsKKworICBTeW1TZXRPcHRpb25zIChTWU1PUFRfVU5ETkFNRSB8IFNZTU9QVF9MT0FEX0xJTkVTKTsKKyAgU3ltSW5pdGlhbGl6ZSAoR2V0Q3VycmVudFByb2Nlc3MgKCksIE5VTEwsIFRSVUUpOworCisKKyAgLyogY2FuJ3QgdXNlIHRoaXMgZnVuY3Rpb24gZm9yIGN1cnJlbnQgdGhyZWFkIGFzIEdldFRocmVhZENvbnRleHQKKyAgICogZG9lc24ndCBzdXBwb3J0IGdldHRpbmcgY29udGV4dCBmcm9tIGN1cnJlbnQgdGhyZWFkICovCisgIGlmIChoVGhyZWFkID09IEdldEN1cnJlbnRUaHJlYWQoKSkKKyAgICByZXR1cm47CisKKyAgRFBSSU5URiAoIkJhY2t0cmFjZTpcbiIpOworCisgIF9EQlVTX1pFUk8gKG9sZF9hZGRyZXNzKTsKKyAgX0RCVVNfWkVSTyAoY29udGV4dCk7CisgIGNvbnRleHQuQ29udGV4dEZsYWdzID0gQ09OVEVYVF9GVUxMOworCisgIFN1c3BlbmRUaHJlYWQgKGhUaHJlYWQpOworCisgIGlmICghR2V0VGhyZWFkQ29udGV4dCAoaFRocmVhZCwgJmNvbnRleHQpKQorICAgIHsKKyAgICAgIERQUklOVEYgKCJDb3VsZG4ndCBnZXQgdGhyZWFkIGNvbnRleHQgKGVycm9yICVsZClcbiIsIEdldExhc3RFcnJvciAoKSk7CisgICAgICBSZXN1bWVUaHJlYWQgKGhUaHJlYWQpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBfREJVU19aRVJPIChzZik7CisKKyNpZmRlZiBfX2kzODZfXworICBkd0ltYWdlVHlwZSAgICAgICAgID0gSU1BR0VfRklMRV9NQUNISU5FX0kzODY7CisgIHNmLkFkZHJGcmFtZS5PZmZzZXQgPSBjb250ZXh0LkVicDsKKyAgc2YuQWRkckZyYW1lLk1vZGUgICA9IEFkZHJNb2RlRmxhdDsKKyAgc2YuQWRkclBDLk9mZnNldCAgICA9IGNvbnRleHQuRWlwOworICBzZi5BZGRyUEMuTW9kZSAgICAgID0gQWRkck1vZGVGbGF0OworI2VsaWYgZGVmaW5lZChfTV9YNjQpCisgIGR3SW1hZ2VUeXBlICAgICAgICAgPSBJTUFHRV9GSUxFX01BQ0hJTkVfQU1ENjQ7CisgIHNmLkFkZHJQQy5PZmZzZXQgICAgPSBjb250ZXh0LlJpcDsKKyAgc2YuQWRkclBDLk1vZGUgICAgICA9IEFkZHJNb2RlRmxhdDsKKyAgc2YuQWRkckZyYW1lLk9mZnNldCA9IGNvbnRleHQuUnNwOworICBzZi5BZGRyRnJhbWUuTW9kZSAgID0gQWRkck1vZGVGbGF0OworICBzZi5BZGRyU3RhY2suT2Zmc2V0ID0gY29udGV4dC5Sc3A7CisgIHNmLkFkZHJTdGFjay5Nb2RlICAgPSBBZGRyTW9kZUZsYXQ7CisjZWxpZiBkZWZpbmVkKF9NX0lBNjQpCisgIGR3SW1hZ2VUeXBlICAgICAgICAgPSBJTUFHRV9GSUxFX01BQ0hJTkVfSUE2NDsKKyAgc2YuQWRkclBDLk9mZnNldCAgICA9IGNvbnRleHQuU3RJSVA7CisgIHNmLkFkZHJQQy5Nb2RlICAgICAgPSBBZGRyTW9kZUZsYXQ7CisgIHNmLkFkZHJGcmFtZS5PZmZzZXQgPSBjb250ZXh0LkludFNwOworICBzZi5BZGRyRnJhbWUuTW9kZSAgID0gQWRkck1vZGVGbGF0OworICBzZi5BZGRyQlN0b3JlLk9mZnNldD0gY29udGV4dC5Sc0JTUDsKKyAgc2YuQWRkckJTdG9yZS5Nb2RlICA9IEFkZHJNb2RlRmxhdDsKKyAgc2YuQWRkclN0YWNrLk9mZnNldCA9IGNvbnRleHQuSW50U3A7CisgIHNmLkFkZHJTdGFjay5Nb2RlICAgPSBBZGRyTW9kZUZsYXQ7CisjZWxzZQorIyBlcnJvciBZb3UgbmVlZCB0byBmaWxsIGluIHRoZSBTVEFDS0ZSQU1FIHN0cnVjdHVyZSBmb3IgeW91ciBhcmNoaXRlY3R1cmUKKyNlbmRpZgorCisgIC8qCisgICAgYmFja3RyYWNlIGZvcm1hdAorICAgIDxsZXZlbD4gPGFkZHJlc3M+IDxzeW1ib2w+WytvZmZzZXRdIFsgJ1snIDxmaWxlPiAnOicgPGxpbmU+ICddJyBdIFsgJ2luJyA8bW9kdWxlPiBdCisgICAgZXhhbXBsZToKKyAgICAgIDYgMHhmNzVhZGU2YiB3aW5lX3N3aXRjaF90b19zdGFjaysweDJhIFsvdXNyL3NyYy9kZWJ1Zy93aW5lLXNuYXBzaG90L2xpYnMvd2luZS9wb3J0LmM6NTldIGluIGxpYndpbmUuc28uMQorICAqLworICB3aGlsZSAoU3RhY2tXYWxrIChkd0ltYWdlVHlwZSwgR2V0Q3VycmVudFByb2Nlc3MgKCksCisgICAgICAgICAgICAgICAgICAgIGhUaHJlYWQsICZzZiwgJmNvbnRleHQsIE5VTEwsIFN5bUZ1bmN0aW9uVGFibGVBY2Nlc3MsCisgICAgICAgICAgICAgICAgICAgIFN5bUdldE1vZHVsZUJhc2UsIE5VTEwpKQorICAgIHsKKyAgICAgIGNoYXIgYnVmZmVyW3NpemVvZihTWU1CT0xfSU5GTykgKyBNQVhfU1lNX05BTUUgKiBzaXplb2YoY2hhcildOworICAgICAgUFNZTUJPTF9JTkZPIHBTeW1ib2wgPSAoUFNZTUJPTF9JTkZPKWJ1ZmZlcjsKKyAgICAgIERXT1JENjQgZGlzcGxhY2VtZW50OworICAgICAgSU1BR0VITFBfTElORSBsaW5lOworICAgICAgRFdPUkQgZHdEaXNwbGFjZW1lbnQ7CisgICAgICBJTUFHRUhMUF9NT0RVTEUgbW9kdWxlSW5mbzsKKworICAgICAgLyoKKyAgICAgICAgIG9uIFdpbmU2NCB2ZXJzaW9uIDEuNy41NCwgd2UgZ2V0IGFuIGluZmluaXRlIG51bWJlciBvZiBzdGFjayBlbnRyaWVzCisgICAgICAgICBwb2ludGluZyB0byB0aGUgc2FtZSBzdGFjayBmcmFtZSAgKF9zdGFydCsweDI5IGluIDx3aW5lLWxvYWRlcj4pCisgICAgICAgICBzZWUgYnVnIGh0dHBzOi8vYnVncy53aW5laHEub3JnL3Nob3dfYnVnLmNnaT9pZD0zOTYwNgorICAgICAgKi8KKyNpZm5kZWYgX19pMzg2X18KKyAgICAgIGlmIChvbGRfYWRkcmVzcy5PZmZzZXQgPT0gc2YuQWRkclBDLk9mZnNldCkKKyAgICAgICAgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisjZW5kaWYKKworICAgICAgcFN5bWJvbC0+U2l6ZU9mU3RydWN0ID0gc2l6ZW9mKFNZTUJPTF9JTkZPKTsKKyAgICAgIHBTeW1ib2wtPk1heE5hbWVMZW4gPSBNQVhfU1lNX05BTUU7CisKKyAgICAgIGlmIChTeW1Gcm9tQWRkciAoR2V0Q3VycmVudFByb2Nlc3MgKCksIHNmLkFkZHJQQy5PZmZzZXQsICZkaXNwbGFjZW1lbnQsIHBTeW1ib2wpKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGRpc3BsYWNlbWVudCkKKyAgICAgICAgICAgIERQUklOVEYgKCIlM2QgJXMrMHglSTY0eCIsIGkrKywgcFN5bWJvbC0+TmFtZSwgZGlzcGxhY2VtZW50KTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBEUFJJTlRGICgiJTNkICVzIiwgaSsrLCBwU3ltYm9sLT5OYW1lKTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBEUFJJTlRGICgiJTNkIDB4JUl4IiwgaSsrLCBzZi5BZGRyUEMuT2Zmc2V0KTsKKworICAgICAgbGluZS5TaXplT2ZTdHJ1Y3QgPSBzaXplb2YoSU1BR0VITFBfTElORSk7CisgICAgICBpZiAoU3ltR2V0TGluZUZyb21BZGRyIChHZXRDdXJyZW50UHJvY2VzcyAoKSwgc2YuQWRkclBDLk9mZnNldCwgJmR3RGlzcGxhY2VtZW50LCAmbGluZSkpCisgICAgICAgIHsKKyAgICAgICAgICBEUFJJTlRGICgiIFslczolbGRdIiwgbGluZS5GaWxlTmFtZSwgbGluZS5MaW5lTnVtYmVyKTsKKyAgICAgICAgfQorCisgICAgICBtb2R1bGVJbmZvLlNpemVPZlN0cnVjdCA9IHNpemVvZihtb2R1bGVJbmZvKTsKKyAgICAgIGlmIChTeW1HZXRNb2R1bGVJbmZvIChHZXRDdXJyZW50UHJvY2VzcyAoKSwgc2YuQWRkclBDLk9mZnNldCwgJm1vZHVsZUluZm8pKQorICAgICAgICB7CisgICAgICAgICAgRFBSSU5URiAoIiBpbiAlcyIsIG1vZHVsZUluZm8uTW9kdWxlTmFtZSk7CisgICAgICAgIH0KKyAgICAgIERQUklOVEYgKCJcbiIpOworICAgICAgb2xkX2FkZHJlc3MgPSBzZi5BZGRyUEM7CisgICAgfQorICBSZXN1bWVUaHJlYWQgKGhUaHJlYWQpOworfQorCitzdGF0aWMgRFdPUkQgV0lOQVBJIGR1bXBfdGhyZWFkX3Byb2MgKExQVk9JRCBscFBhcmFtZXRlcikKK3sKKyAgZHVtcF9iYWNrdHJhY2VfZm9yX3RocmVhZCAoKEhBTkRMRSkgbHBQYXJhbWV0ZXIpOworICByZXR1cm4gMDsKK30KKworLyogY2Fubm90IGdldCB2YWxpZCBjb250ZXh0IGZyb20gY3VycmVudCB0aHJlYWQsIHNvIHdlIGhhdmUgdG8gZXhlY3V0ZQorICogYmFja3RyYWNlIGZyb20gYW5vdGhlciB0aHJlYWQgKi8KK3N0YXRpYyB2b2lkCitkdW1wX2JhY2t0cmFjZSAodm9pZCkKK3sKKyAgSEFORExFIGhDdXJyZW50VGhyZWFkOworICBIQU5ETEUgaFRocmVhZDsKKyAgRFdPUkQgZHdUaHJlYWRJZDsKKyAgRHVwbGljYXRlSGFuZGxlIChHZXRDdXJyZW50UHJvY2VzcyAoKSwgR2V0Q3VycmVudFRocmVhZCAoKSwKKyAgICAgICAgICAgICAgICAgICBHZXRDdXJyZW50UHJvY2VzcyAoKSwgJmhDdXJyZW50VGhyZWFkLAorICAgICAgICAgICAgICAgICAgIDAsIEZBTFNFLCBEVVBMSUNBVEVfU0FNRV9BQ0NFU1MpOworICBoVGhyZWFkID0gQ3JlYXRlVGhyZWFkIChOVUxMLCAwLCBkdW1wX3RocmVhZF9wcm9jLCAoTFBWT0lEKWhDdXJyZW50VGhyZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAmZHdUaHJlYWRJZCk7CisgIFdhaXRGb3JTaW5nbGVPYmplY3QgKGhUaHJlYWQsIElORklOSVRFKTsKKyAgQ2xvc2VIYW5kbGUgKGhUaHJlYWQpOworICBDbG9zZUhhbmRsZSAoaEN1cnJlbnRUaHJlYWQpOworfQorI2VuZGlmCisjZW5kaWYgLyogYXNzZXJ0cyBvciB0ZXN0cyBlbmFibGVkICovCisKKyNpZmRlZiBCQUNLVFJBQ0VTCit2b2lkIF9kYnVzX3ByaW50X2JhY2t0cmFjZSAodm9pZCkKK3sKKyAgZHVtcF9iYWNrdHJhY2UgKCk7Cit9CisjZWxzZQordm9pZCBfZGJ1c19wcmludF9iYWNrdHJhY2UgKHZvaWQpCit7CisgIF9kYnVzX3ZlcmJvc2UgKCIgIEQtQnVzIG5vdCBjb21waWxlZCB3aXRoIGJhY2t0cmFjZSBzdXBwb3J0XG4iKTsKK30KKyNlbmRpZgorCitzdGF0aWMgZGJ1c191aW50MzJfdCBmcm9tQXNjaWkoY2hhciBhc2NpaSkKK3sKKyAgICBpZihhc2NpaSA+PSAnMCcgJiYgYXNjaWkgPD0gJzknKQorICAgICAgICByZXR1cm4gYXNjaWkgLSAnMCc7CisgICAgaWYoYXNjaWkgPj0gJ0EnICYmIGFzY2lpIDw9ICdGJykKKyAgICAgICAgcmV0dXJuIGFzY2lpIC0gJ0EnICsgMTA7CisgICAgaWYoYXNjaWkgPj0gJ2EnICYmIGFzY2lpIDw9ICdmJykKKyAgICAgICAgcmV0dXJuIGFzY2lpIC0gJ2EnICsgMTA7CisgICAgcmV0dXJuIDA7ICAgIAorfQorCitkYnVzX2Jvb2xfdCBfZGJ1c19yZWFkX2xvY2FsX21hY2hpbmVfdXVpZCAgIChEQnVzR1VJRCAgICAgICAgICptYWNoaW5lX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgY3JlYXRlX2lmX25vdF9mb3VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKQoreworI2lmZGVmIERCVVNfV0lOQ0UKKwlyZXR1cm4gVFJVRTsKKyAgLy8gVE9ETworI2Vsc2UKKyAgICBIV19QUk9GSUxFX0lORk9BIGluZm87CisgICAgY2hhciAqbHBjID0gJmluZm8uc3pId1Byb2ZpbGVHdWlkWzBdOworICAgIGRidXNfdWludDMyX3QgdTsKKworICAgIC8vICB0aGUgaHctcHJvZmlsZSBndWlkIGxpdmVzIGxvbmcgZW5vdWdoCisgICAgaWYoIUdldEN1cnJlbnRId1Byb2ZpbGVBKCZpbmZvKSkKKyAgICAgIHsKKyAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7IC8vIEZJWE1FCisgICAgICAgIHJldHVybiBGQUxTRTsgIAorICAgICAgfQorCisgICAgLy8gRm9ybTogezEyMzQwMDAxLTQ5ODAtMTkyMC02Nzg4LTEyMzQ1Njc4OTAxMn0KKyAgICBscGMrKzsKKyAgICAvLyAxMjM0MDAwMQorICAgIHUgPSAoKGZyb21Bc2NpaShscGNbMF0pIDw8ICAwKSB8CisgICAgICAgICAoZnJvbUFzY2lpKGxwY1sxXSkgPDwgIDQpIHwKKyAgICAgICAgIChmcm9tQXNjaWkobHBjWzJdKSA8PCAgOCkgfAorICAgICAgICAgKGZyb21Bc2NpaShscGNbM10pIDw8IDEyKSB8CisgICAgICAgICAoZnJvbUFzY2lpKGxwY1s0XSkgPDwgMTYpIHwKKyAgICAgICAgIChmcm9tQXNjaWkobHBjWzVdKSA8PCAyMCkgfAorICAgICAgICAgKGZyb21Bc2NpaShscGNbNl0pIDw8IDI0KSB8CisgICAgICAgICAoZnJvbUFzY2lpKGxwY1s3XSkgPDwgMjgpKTsKKyAgICBtYWNoaW5lX2lkLT5hc191aW50MzJzWzBdID0gdTsKKworICAgIGxwYyArPSA5OworICAgIC8vIDQ5ODAtMTkyMAorICAgIHUgPSAoKGZyb21Bc2NpaShscGNbMF0pIDw8ICAwKSB8CisgICAgICAgICAoZnJvbUFzY2lpKGxwY1sxXSkgPDwgIDQpIHwKKyAgICAgICAgIChmcm9tQXNjaWkobHBjWzJdKSA8PCAgOCkgfAorICAgICAgICAgKGZyb21Bc2NpaShscGNbM10pIDw8IDEyKSB8CisgICAgICAgICAoZnJvbUFzY2lpKGxwY1s1XSkgPDwgMTYpIHwKKyAgICAgICAgIChmcm9tQXNjaWkobHBjWzZdKSA8PCAyMCkgfAorICAgICAgICAgKGZyb21Bc2NpaShscGNbN10pIDw8IDI0KSB8CisgICAgICAgICAoZnJvbUFzY2lpKGxwY1s4XSkgPDwgMjgpKTsKKyAgICBtYWNoaW5lX2lkLT5hc191aW50MzJzWzFdID0gdTsKKyAgICAKKyAgICBscGMgKz0gMTA7CisgICAgLy8gNjc4OC0xMjM0CisgICAgdSA9ICgoZnJvbUFzY2lpKGxwY1swXSkgPDwgIDApIHwKKyAgICAgICAgIChmcm9tQXNjaWkobHBjWzFdKSA8PCAgNCkgfAorICAgICAgICAgKGZyb21Bc2NpaShscGNbMl0pIDw8ICA4KSB8CisgICAgICAgICAoZnJvbUFzY2lpKGxwY1szXSkgPDwgMTIpIHwKKyAgICAgICAgIChmcm9tQXNjaWkobHBjWzVdKSA8PCAxNikgfAorICAgICAgICAgKGZyb21Bc2NpaShscGNbNl0pIDw8IDIwKSB8CisgICAgICAgICAoZnJvbUFzY2lpKGxwY1s3XSkgPDwgMjQpIHwKKyAgICAgICAgIChmcm9tQXNjaWkobHBjWzhdKSA8PCAyOCkpOworICAgIG1hY2hpbmVfaWQtPmFzX3VpbnQzMnNbMl0gPSB1OworICAgIAorICAgIGxwYyArPSA5OworICAgIC8vIDU2Nzg5MDEyCisgICAgdSA9ICgoZnJvbUFzY2lpKGxwY1swXSkgPDwgIDApIHwKKyAgICAgICAgIChmcm9tQXNjaWkobHBjWzFdKSA8PCAgNCkgfAorICAgICAgICAgKGZyb21Bc2NpaShscGNbMl0pIDw8ICA4KSB8CisgICAgICAgICAoZnJvbUFzY2lpKGxwY1szXSkgPDwgMTIpIHwKKyAgICAgICAgIChmcm9tQXNjaWkobHBjWzRdKSA8PCAxNikgfAorICAgICAgICAgKGZyb21Bc2NpaShscGNbNV0pIDw8IDIwKSB8CisgICAgICAgICAoZnJvbUFzY2lpKGxwY1s2XSkgPDwgMjQpIHwKKyAgICAgICAgIChmcm9tQXNjaWkobHBjWzddKSA8PCAyOCkpOworICAgIG1hY2hpbmVfaWQtPmFzX3VpbnQzMnNbM10gPSB1OworI2VuZGlmCisgICAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYworSEFORExFIF9kYnVzX2dsb2JhbF9sb2NrIChjb25zdCBjaGFyICptdXRleG5hbWUpCit7CisgIEhBTkRMRSBtdXRleDsKKyAgRFdPUkQgZ290TXV0ZXg7CisKKyAgbXV0ZXggPSBDcmVhdGVNdXRleEEoIE5VTEwsIEZBTFNFLCBtdXRleG5hbWUgKTsKKyAgaWYoICFtdXRleCApCisgICAgeworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgZ290TXV0ZXggPSBXYWl0Rm9yU2luZ2xlT2JqZWN0KCBtdXRleCwgSU5GSU5JVEUgKTsKKyAgIHN3aXRjaCggZ290TXV0ZXggKQorICAgICB7CisgICAgICAgY2FzZSBXQUlUX0FCQU5ET05FRDoKKyAgICAgICAgICAgICAgIFJlbGVhc2VNdXRleCAobXV0ZXgpOworICAgICAgICAgICAgICAgQ2xvc2VIYW5kbGUgKG11dGV4KTsKKyAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgIGNhc2UgV0FJVF9GQUlMRUQ6CisgICAgICAgY2FzZSBXQUlUX1RJTUVPVVQ6CisgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgcmV0dXJuIG11dGV4OworICAgICB9Cit9CisKK3N0YXRpYwordm9pZCBfZGJ1c19nbG9iYWxfdW5sb2NrIChIQU5ETEUgbXV0ZXgpCit7CisgIFJlbGVhc2VNdXRleCAobXV0ZXgpOworICBDbG9zZUhhbmRsZSAobXV0ZXgpOyAKK30KKworLy8gZm9yIHByb3BlciBjbGVhbnVwIGluIGRidXMtZGFlbW9uCitzdGF0aWMgSEFORExFIGhEQnVzRGFlbW9uTXV0ZXggPSBOVUxMOworc3RhdGljIEhBTkRMRSBoREJ1c1NoYXJlZE1lbSA9IE5VTEw7CisvLyBzeW5jIF9kYnVzX2RhZW1vbl9wdWJsaXNoX3Nlc3Npb25fYnVzX2FkZHJlc3MsIF9kYnVzX2RhZW1vbl91bnB1Ymxpc2hfc2Vzc2lvbl9idXNfYWRkcmVzcyBhbmQgX2RidXNfZGFlbW9uX2FscmVhZHlfcnVucworc3RhdGljIGNvbnN0IGNoYXIgKmNVbmlxdWVEQnVzSW5pdE11dGV4ID0gIlVuaXF1ZURCdXNJbml0TXV0ZXgiOworLy8gc3luYyBfZGJ1c19nZXRfYXV0b2xhdW5jaF9hZGRyZXNzCitzdGF0aWMgY29uc3QgY2hhciAqY0RCdXNBdXRvbGF1bmNoTXV0ZXggPSAiREJ1c0F1dG9sYXVuY2hNdXRleCI7CisvLyBtdXRleCB0byBkZXRlcm1pbmUgaWYgZGJ1cy1kYWVtb24gaXMgYWxyZWFkeSBzdGFydGVkIChwZXIgdXNlcikKK3N0YXRpYyBjb25zdCBjaGFyICpjREJ1c0RhZW1vbk11dGV4ID0gIkRCdXNEYWVtb25NdXRleCI7CisvLyBuYW1lZCBzaG0gZm9yIGRidXMgYWRyZXNzIGluZm8gKHBlciB1c2VyKQorc3RhdGljIGNvbnN0IGNoYXIgKmNEQnVzRGFlbW9uQWRkcmVzc0luZm8gPSAiREJ1c0RhZW1vbkFkZHJlc3NJbmZvIjsKKworc3RhdGljIGRidXNfYm9vbF90CitfZGJ1c19nZXRfaW5zdGFsbF9yb290X2FzX2hhc2goREJ1c1N0cmluZyAqb3V0KQoreworICAgIERCdXNTdHJpbmcgaW5zdGFsbF9wYXRoOworCisgICAgX2RidXNfc3RyaW5nX2luaXQoJmluc3RhbGxfcGF0aCk7CisKKyAgICBpZiAoIV9kYnVzX2dldF9pbnN0YWxsX3Jvb3QgKCZpbnN0YWxsX3BhdGgpIHx8CisgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmaW5zdGFsbF9wYXRoKSA9PSAwKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBfZGJ1c19zdHJpbmdfaW5pdChvdXQpOworICAgIF9kYnVzX3N0cmluZ190b2xvd2VyX2FzY2lpKCZpbnN0YWxsX3BhdGgsMCxfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCgmaW5zdGFsbF9wYXRoKSk7CisKKyAgICBpZiAoIV9kYnVzX3NoYV9jb21wdXRlICgmaW5zdGFsbF9wYXRoLCBvdXQpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitfZGJ1c19nZXRfYWRkcmVzc19zdHJpbmcgKERCdXNTdHJpbmcgKm91dCwgY29uc3QgY2hhciAqYmFzZXN0cmluZywgY29uc3QgY2hhciAqc2NvcGUpCit7CisgIF9kYnVzX3N0cmluZ19pbml0KG91dCk7CisgIF9kYnVzX3N0cmluZ19hcHBlbmQob3V0LGJhc2VzdHJpbmcpOworCisgIGlmICghc2NvcGUpCisgICAgeworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICBlbHNlIGlmIChzdHJjbXAoc2NvcGUsIippbnN0YWxsLXBhdGgiKSA9PSAwCisgICAgICAgIC8vIGZvciAxLjMgY29tcGF0aWJpbGl0eQorICAgICAgICB8fCBzdHJjbXAoc2NvcGUsImluc3RhbGwtcGF0aCIpID09IDApCisgICAgeworICAgICAgREJ1c1N0cmluZyB0ZW1wOworICAgICAgaWYgKCFfZGJ1c19nZXRfaW5zdGFsbF9yb290X2FzX2hhc2goJnRlbXApKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUob3V0KTsKKyAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICBfZGJ1c19zdHJpbmdfYXBwZW5kKG91dCwiLSIpOworICAgICAgX2RidXNfc3RyaW5nX2FwcGVuZChvdXQsX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhKCZ0ZW1wKSk7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSgmdGVtcCk7CisgICAgfQorICBlbHNlIGlmIChzdHJjbXAoc2NvcGUsIip1c2VyIikgPT0gMCkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfYXBwZW5kKG91dCwiLSIpOworICAgICAgaWYgKCFfZGJ1c19hcHBlbmRfdXNlcl9mcm9tX2N1cnJlbnRfcHJvY2VzcyhvdXQpKQorICAgICAgICB7CisgICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlKG91dCk7CisgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZSBpZiAoc3RybGVuKHNjb3BlKSA+IDApCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2FwcGVuZChvdXQsIi0iKTsKKyAgICAgIF9kYnVzX3N0cmluZ19hcHBlbmQob3V0LHNjb3BlKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorX2RidXNfZ2V0X3NobV9uYW1lIChEQnVzU3RyaW5nICpvdXQsY29uc3QgY2hhciAqc2NvcGUpCit7CisgIHJldHVybiBfZGJ1c19nZXRfYWRkcmVzc19zdHJpbmcgKG91dCxjREJ1c0RhZW1vbkFkZHJlc3NJbmZvLHNjb3BlKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitfZGJ1c19nZXRfbXV0ZXhfbmFtZSAoREJ1c1N0cmluZyAqb3V0LGNvbnN0IGNoYXIgKnNjb3BlKQoreworICByZXR1cm4gX2RidXNfZ2V0X2FkZHJlc3Nfc3RyaW5nIChvdXQsY0RCdXNEYWVtb25NdXRleCxzY29wZSk7Cit9CisKK2RidXNfYm9vbF90CitfZGJ1c19kYWVtb25faXNfc2Vzc2lvbl9idXNfYWRkcmVzc19wdWJsaXNoZWQgKGNvbnN0IGNoYXIgKnNjb3BlKQoreworICBIQU5ETEUgbG9jazsKKyAgREJ1c1N0cmluZyBtdXRleF9uYW1lOworCisgIGlmICghX2RidXNfZ2V0X211dGV4X25hbWUoJm11dGV4X25hbWUsc2NvcGUpKQorICAgIHsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlKCAmbXV0ZXhfbmFtZSApOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoaERCdXNEYWVtb25NdXRleCkKKyAgICAgIHJldHVybiBUUlVFOworCisgIC8vIHN5bmMgX2RidXNfZGFlbW9uX3B1Ymxpc2hfc2Vzc2lvbl9idXNfYWRkcmVzcywgX2RidXNfZGFlbW9uX3VucHVibGlzaF9zZXNzaW9uX2J1c19hZGRyZXNzIGFuZCBfZGJ1c19kYWVtb25fYWxyZWFkeV9ydW5zCisgIGxvY2sgPSBfZGJ1c19nbG9iYWxfbG9jayggY1VuaXF1ZURCdXNJbml0TXV0ZXggKTsKKworICAvLyB3ZSB1c2UgQ3JlYXRlTXV0ZXggaW5zdGVhZCBvZiBPcGVuTXV0ZXggYmVjYXVzZSBvZiBwb3NzaWJsZSByYWNlIGNvbmRpdGlvbnMsCisgIC8vIHNlZSBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXM2ODQzMTUlMjhWUy44NSUyOS5hc3B4CisgIGhEQnVzRGFlbW9uTXV0ZXggPSBDcmVhdGVNdXRleEEoIE5VTEwsIEZBTFNFLCBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEoJm11dGV4X25hbWUpICk7CisKKyAgLyogVGhlIGNsaWVudCB1c2VzIG11dGV4IG93bmVyc2hpcCB0byBkZXRlY3QgYSBydW5uaW5nIHNlcnZlciwgc28gdGhlIHNlcnZlciBzaG91bGQgZG8gc28gdG9vLgorICAgICBGb3J0dW5hbGx5IHRoZSBjbGllbnQgZGVsZXRlcyB0aGUgbXV0ZXggaW4gdGhlIGxvY2sgcHJvdGVjdGVkIGFyZWEsIHNvIGNoZWNraW5nIHByZXNlbmNlIAorICAgICB3aWxsIHdvcmsgdG9vLiAgKi8KKworICBfZGJ1c19nbG9iYWxfdW5sb2NrKCBsb2NrICk7CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUoICZtdXRleF9uYW1lICk7CisKKyAgaWYgKGhEQnVzRGFlbW9uTXV0ZXggID09IE5VTEwpCisgICAgICByZXR1cm4gRkFMU0U7CisgIGlmIChHZXRMYXN0RXJyb3IoKSA9PSBFUlJPUl9BTFJFQURZX0VYSVNUUykKKyAgICB7CisgICAgICBDbG9zZUhhbmRsZShoREJ1c0RhZW1vbk11dGV4KTsKKyAgICAgIGhEQnVzRGFlbW9uTXV0ZXggPSBOVUxMOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICAvLyBtdXRleCB3YXNuJ3QgY3JlYXRlZCBiZWZvcmUsIHNvIHJldHVybiBmYWxzZS4KKyAgLy8gV2UgbGVhdmUgdGhlIG11dGV4IG5hbWUgYWxsb2NhdGVkIGZvciBsYXRlciByZXVzYWdlCisgIC8vIGluIF9kYnVzX2RhZW1vbl9wdWJsaXNoX3Nlc3Npb25fYnVzX2FkZHJlc3MuCisgIHJldHVybiBGQUxTRTsKK30KKworZGJ1c19ib29sX3QKK19kYnVzX2RhZW1vbl9wdWJsaXNoX3Nlc3Npb25fYnVzX2FkZHJlc3MgKGNvbnN0IGNoYXIqIGFkZHJlc3MsIGNvbnN0IGNoYXIgKnNjb3BlKQoreworICBIQU5ETEUgbG9jazsKKyAgY2hhciAqc2hhcmVkX2FkZHIgPSBOVUxMOworICBEQnVzU3RyaW5nIHNobV9uYW1lOworICBEQnVzU3RyaW5nIG11dGV4X25hbWU7CisgIGRidXNfdWludDY0X3QgbGVuOworCisgIF9kYnVzX2Fzc2VydCAoYWRkcmVzcyk7CisKKyAgaWYgKCFfZGJ1c19nZXRfbXV0ZXhfbmFtZSgmbXV0ZXhfbmFtZSxzY29wZSkpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUoICZtdXRleF9uYW1lICk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIC8vIHN5bmMgX2RidXNfZGFlbW9uX3B1Ymxpc2hfc2Vzc2lvbl9idXNfYWRkcmVzcywgX2RidXNfZGFlbW9uX3VucHVibGlzaF9zZXNzaW9uX2J1c19hZGRyZXNzIGFuZCBfZGJ1c19kYWVtb25fYWxyZWFkeV9ydW5zCisgIGxvY2sgPSBfZGJ1c19nbG9iYWxfbG9jayggY1VuaXF1ZURCdXNJbml0TXV0ZXggKTsKKworICBpZiAoIWhEQnVzRGFlbW9uTXV0ZXgpCisgICAgeworICAgICAgaERCdXNEYWVtb25NdXRleCA9IENyZWF0ZU11dGV4QSggTlVMTCwgRkFMU0UsIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSgmbXV0ZXhfbmFtZSkgKTsKKyAgICB9CisgIF9kYnVzX3N0cmluZ19mcmVlKCAmbXV0ZXhfbmFtZSApOworCisgIC8vIGFjcXVpcmUgdGhlIG11dGV4CisgIGlmIChXYWl0Rm9yU2luZ2xlT2JqZWN0KCBoREJ1c0RhZW1vbk11dGV4LCAxMCApICE9IFdBSVRfT0JKRUNUXzApCisgICAgeworICAgICAgX2RidXNfZ2xvYmFsX3VubG9jayggbG9jayApOworICAgICAgQ2xvc2VIYW5kbGUoIGhEQnVzRGFlbW9uTXV0ZXggKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19nZXRfc2htX25hbWUoJnNobV9uYW1lLHNjb3BlKSkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSggJnNobV9uYW1lICk7CisgICAgICBfZGJ1c19nbG9iYWxfdW5sb2NrKCBsb2NrICk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIC8vIGNyZWF0ZSBzaG0KKyAgbGVuID0gc3RybGVuIChhZGRyZXNzKSArIDE7CisKKyAgaERCdXNTaGFyZWRNZW0gPSBDcmVhdGVGaWxlTWFwcGluZ0EoIElOVkFMSURfSEFORExFX1ZBTFVFLCBOVUxMLCBQQUdFX1JFQURXUklURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiA+PiAzMiwgbGVuICYgMHhmZmZmZmZmZnUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEoJnNobV9uYW1lKSApOworICBfZGJ1c19hc3NlcnQoIGhEQnVzU2hhcmVkTWVtICk7CisKKyAgc2hhcmVkX2FkZHIgPSBNYXBWaWV3T2ZGaWxlKCBoREJ1c1NoYXJlZE1lbSwgRklMRV9NQVBfV1JJVEUsIDAsIDAsIDAgKTsKKworICBfZGJ1c19hc3NlcnQgKHNoYXJlZF9hZGRyKTsKKworICBzdHJjcHkoIHNoYXJlZF9hZGRyLCBhZGRyZXNzKTsKKworICAvLyBjbGVhbnVwCisgIFVubWFwVmlld09mRmlsZSggc2hhcmVkX2FkZHIgKTsKKworICBfZGJ1c19nbG9iYWxfdW5sb2NrKCBsb2NrICk7CisgIF9kYnVzX3ZlcmJvc2UoICJwdWJsaXNoZWQgc2Vzc2lvbiBidXMgYWRkcmVzcyBhdCAlc1xuIixfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZzaG1fbmFtZSkgKTsKKworICBfZGJ1c19zdHJpbmdfZnJlZSggJnNobV9uYW1lICk7CisgIHJldHVybiBUUlVFOworfQorCit2b2lkCitfZGJ1c19kYWVtb25fdW5wdWJsaXNoX3Nlc3Npb25fYnVzX2FkZHJlc3MgKHZvaWQpCit7CisgIEhBTkRMRSBsb2NrOworCisgIC8vIHN5bmMgX2RidXNfZGFlbW9uX3B1Ymxpc2hfc2Vzc2lvbl9idXNfYWRkcmVzcywgX2RidXNfZGFlbW9uX3VucHVibGlzaF9zZXNzaW9uX2J1c19hZGRyZXNzIGFuZCBfZGJ1c19kYWVtb25fYWxyZWFkeV9ydW5zCisgIGxvY2sgPSBfZGJ1c19nbG9iYWxfbG9jayggY1VuaXF1ZURCdXNJbml0TXV0ZXggKTsKKworICBDbG9zZUhhbmRsZSggaERCdXNTaGFyZWRNZW0gKTsKKworICBoREJ1c1NoYXJlZE1lbSA9IE5VTEw7CisKKyAgUmVsZWFzZU11dGV4KCBoREJ1c0RhZW1vbk11dGV4ICk7CisKKyAgQ2xvc2VIYW5kbGUoIGhEQnVzRGFlbW9uTXV0ZXggKTsKKworICBoREJ1c0RhZW1vbk11dGV4ID0gTlVMTDsKKworICBfZGJ1c19nbG9iYWxfdW5sb2NrKCBsb2NrICk7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorX2RidXNfZ2V0X2F1dG9sYXVuY2hfc2htIChEQnVzU3RyaW5nICphZGRyZXNzLCBEQnVzU3RyaW5nICpzaG1fbmFtZSkKK3sKKyAgSEFORExFIHNoYXJlZE1lbTsKKyAgY2hhciAqc2hhcmVkX2FkZHI7CisgIGludCBpOworCisgIC8vIHJlYWQgc2htCisgIGZvcihpPTA7aTwyMDsrK2kpIHsKKyAgICAgIC8vIHdlIGtub3cgdGhhdCBkYnVzLWRhZW1vbiBpcyBhdmFpbGFibGUsIHNvIHdlIHdhaXQgdW50aWwgc2htIGlzIGF2YWlsYWJsZQorICAgICAgc2hhcmVkTWVtID0gT3BlbkZpbGVNYXBwaW5nQSggRklMRV9NQVBfUkVBRCwgRkFMU0UsIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YShzaG1fbmFtZSkpOworICAgICAgaWYoIHNoYXJlZE1lbSA9PSAwICkKKyAgICAgICAgICBTbGVlcCggMTAwICk7CisgICAgICBpZiAoIHNoYXJlZE1lbSAhPSAwKQorICAgICAgICAgIGJyZWFrOworICB9CisKKyAgaWYoIHNoYXJlZE1lbSA9PSAwICkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICBzaGFyZWRfYWRkciA9IE1hcFZpZXdPZkZpbGUoIHNoYXJlZE1lbSwgRklMRV9NQVBfUkVBRCwgMCwgMCwgMCApOworCisgIGlmKCAhc2hhcmVkX2FkZHIgKQorICAgICAgcmV0dXJuIEZBTFNFOworCisgIF9kYnVzX3N0cmluZ19pbml0KCBhZGRyZXNzICk7CisKKyAgX2RidXNfc3RyaW5nX2FwcGVuZCggYWRkcmVzcywgc2hhcmVkX2FkZHIgKTsKKworICAvLyBjbGVhbnVwCisgIFVubWFwVmlld09mRmlsZSggc2hhcmVkX2FkZHIgKTsKKworICBDbG9zZUhhbmRsZSggc2hhcmVkTWVtICk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorX2RidXNfZGFlbW9uX2FscmVhZHlfcnVucyAoREJ1c1N0cmluZyAqYWRkcmVzcywgREJ1c1N0cmluZyAqc2htX25hbWUsIGNvbnN0IGNoYXIgKnNjb3BlKQoreworICBIQU5ETEUgbG9jazsKKyAgSEFORExFIGRhZW1vbjsKKyAgREJ1c1N0cmluZyBtdXRleF9uYW1lOworICBkYnVzX2Jvb2xfdCBiUmV0ID0gVFJVRTsKKworICBpZiAoIV9kYnVzX2dldF9tdXRleF9uYW1lKCZtdXRleF9uYW1lLHNjb3BlKSkKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSggJm11dGV4X25hbWUgKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgLy8gc3luYyBfZGJ1c19kYWVtb25fcHVibGlzaF9zZXNzaW9uX2J1c19hZGRyZXNzLCBfZGJ1c19kYWVtb25fdW5wdWJsaXNoX3Nlc3Npb25fYnVzX2FkZHJlc3MgYW5kIF9kYnVzX2RhZW1vbl9hbHJlYWR5X3J1bnMKKyAgbG9jayA9IF9kYnVzX2dsb2JhbF9sb2NrKCBjVW5pcXVlREJ1c0luaXRNdXRleCApOworCisgIC8vIGRvIGNoZWNrcworICBkYWVtb24gPSBDcmVhdGVNdXRleEEoIE5VTEwsIEZBTFNFLCBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEoJm11dGV4X25hbWUpICk7CisgIGlmKFdhaXRGb3JTaW5nbGVPYmplY3QoIGRhZW1vbiwgMTAgKSAhPSBXQUlUX1RJTUVPVVQpCisgICAgeworICAgICAgUmVsZWFzZU11dGV4IChkYWVtb24pOworICAgICAgQ2xvc2VIYW5kbGUgKGRhZW1vbik7CisKKyAgICAgIF9kYnVzX2dsb2JhbF91bmxvY2soIGxvY2sgKTsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlKCAmbXV0ZXhfbmFtZSApOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAvLyByZWFkIHNobQorICBiUmV0ID0gX2RidXNfZ2V0X2F1dG9sYXVuY2hfc2htKCBhZGRyZXNzLCBzaG1fbmFtZSApOworCisgIC8vIGNsZWFudXAKKyAgQ2xvc2VIYW5kbGUgKCBkYWVtb24gKTsKKworICBfZGJ1c19nbG9iYWxfdW5sb2NrKCBsb2NrICk7CisgIF9kYnVzX3N0cmluZ19mcmVlKCAmbXV0ZXhfbmFtZSApOworCisgIHJldHVybiBiUmV0OworfQorCitkYnVzX2Jvb2xfdAorX2RidXNfZ2V0X2F1dG9sYXVuY2hfYWRkcmVzcyAoY29uc3QgY2hhciAqc2NvcGUsIERCdXNTdHJpbmcgKmFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgKmVycm9yKQoreworICBIQU5ETEUgbXV0ZXg7CisgIFNUQVJUVVBJTkZPQSBzaTsKKyAgUFJPQ0VTU19JTkZPUk1BVElPTiBwaTsKKyAgZGJ1c19ib29sX3QgcmV0dmFsID0gRkFMU0U7CisgIExQU1RSIGxwRmlsZTsKKyAgY2hhciBkYnVzX2V4ZV9wYXRoW01BWF9QQVRIXTsKKyAgY2hhciBkYnVzX2FyZ3NbTUFYX1BBVEggKiAyXTsKKyAgY29uc3QgY2hhciAqIGRhZW1vbl9uYW1lID0gREJVU19EQUVNT05fTkFNRSAiLmV4ZSI7CisgIERCdXNTdHJpbmcgc2htX25hbWU7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgaWYgKCFfZGJ1c19nZXRfc2htX25hbWUoJnNobV9uYW1lLHNjb3BlKSkKKyAgICB7CisgICAgICAgIGRidXNfc2V0X2Vycm9yX2NvbnN0IChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsICJjb3VsZCBub3QgZGV0ZXJtaW5lIHNobSBuYW1lIik7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgbXV0ZXggPSBfZGJ1c19nbG9iYWxfbG9jayAoIGNEQnVzQXV0b2xhdW5jaE11dGV4ICk7CisKKyAgaWYgKF9kYnVzX2RhZW1vbl9hbHJlYWR5X3J1bnMoYWRkcmVzcywmc2htX25hbWUsc2NvcGUpKQorICAgIHsKKyAgICAgICAgX2RidXNfdmVyYm9zZSggImZvdW5kIHJ1bm5pbmcgZGJ1cyBkYWVtb24gZm9yIHNjb3BlICclcycgYXQgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlID8gc2NvcGUgOiAiIiwgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICgmc2htX25hbWUpICk7CisgICAgICAgIHJldHZhbCA9IFRSVUU7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAoIVNlYXJjaFBhdGhBKE5VTEwsIGRhZW1vbl9uYW1lLCBOVUxMLCBzaXplb2YoZGJ1c19leGVfcGF0aCksIGRidXNfZXhlX3BhdGgsICZscEZpbGUpKQorICAgIHsKKyAgICAgIC8vIExvb2sgaW4gZGlyZWN0b3J5IGNvbnRhaW5pbmcgZGJ1cyBzaGFyZWQgbGlicmFyeQorICAgICAgSE1PRFVMRSBobW9kOworICAgICAgY2hhciBkYnVzX21vZHVsZV9wYXRoW01BWF9QQVRIXTsKKyAgICAgIERXT1JEIHJjOworCisgICAgICBfZGJ1c192ZXJib3NlKCAiZGlkIG5vdCBmb3VuZCBkYnVzIGRhZW1vbiBleGVjdXRhYmxlIG9uIGRlZmF1bHQgc2VhcmNoIHBhdGgsICIKKyAgICAgICAgICAgICJ0cnlpbmcgcGF0aCB3aGVyZSBkYnVzIHNoYXJlZCBsaWJyYXJ5IGlzIGxvY2F0ZWQiKTsKKworICAgICAgaG1vZCA9IF9kYnVzX3dpbl9nZXRfZGxsX2htb2R1bGUoKTsKKyAgICAgIHJjID0gR2V0TW9kdWxlRmlsZU5hbWVBKGhtb2QsIGRidXNfbW9kdWxlX3BhdGgsIHNpemVvZihkYnVzX21vZHVsZV9wYXRoKSk7CisgICAgICBpZiAocmMgPD0gMCkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfc2V0X2Vycm9yX2NvbnN0IChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsICJjb3VsZCBub3QgcmV0cmlldmUgZGJ1cyBzaGFyZWQgbGlicmFyeSBmaWxlIG5hbWUiKTsKKyAgICAgICAgICByZXR2YWwgPSBGQUxTRTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgY2hhciAqZXh0X2lkeCA9IHN0cnJjaHIoZGJ1c19tb2R1bGVfcGF0aCwgJ1xcJyk7CisgICAgICAgICAgaWYgKGV4dF9pZHgpCisgICAgICAgICAgKmV4dF9pZHggPSAnXDAnOworICAgICAgICAgIGlmICghU2VhcmNoUGF0aEEoZGJ1c19tb2R1bGVfcGF0aCwgZGFlbW9uX25hbWUsIE5VTEwsIHNpemVvZihkYnVzX2V4ZV9wYXRoKSwgZGJ1c19leGVfcGF0aCwgJmxwRmlsZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yX2NvbnN0IChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsICJjb3VsZCBub3QgZmluZCBkYnVzLWRhZW1vbiBleGVjdXRhYmxlIik7CisgICAgICAgICAgICAgIHJldHZhbCA9IEZBTFNFOworICAgICAgICAgICAgICBwcmludGYgKCJwbGVhc2UgYWRkIHRoZSBwYXRoIHRvICVzIHRvIHlvdXIgUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZVxuIiwgZGFlbW9uX25hbWUpOworICAgICAgICAgICAgICBwcmludGYgKCJvciBzdGFydCB0aGUgZGFlbW9uIG1hbnVhbGx5XG5cbiIpOworICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBfZGJ1c192ZXJib3NlKCAiZm91bmQgZGJ1cyBkYWVtb24gZXhlY3V0YWJsZSBhdCAlcyIsZGJ1c19tb2R1bGVfcGF0aCk7CisgICAgICAgIH0KKyAgICB9CisKKworICAvLyBDcmVhdGUgcHJvY2VzcworICBaZXJvTWVtb3J5KCAmc2ksIHNpemVvZihzaSkgKTsKKyAgc2kuY2IgPSBzaXplb2Yoc2kpOworICBaZXJvTWVtb3J5KCAmcGksIHNpemVvZihwaSkgKTsKKworICBfc25wcmludGYoZGJ1c19hcmdzLCBzaXplb2YoZGJ1c19hcmdzKSAtIDEsICJcIiVzXCIgJXMiLCBkYnVzX2V4ZV9wYXRoLCAgIiAtLXNlc3Npb24iKTsKKworLy8gIGFyZ3ZbaV0gPSAiLS1jb25maWctZmlsZT1idXNcXHNlc3Npb24uY29uZiI7CisvLyAgcHJpbnRmKCJjcmVhdGUgcHJvY2VzcyBcIiVzXCIgJXNcbiIsIGRidXNfZXhlX3BhdGgsIGRidXNfYXJncyk7CisgIGlmKENyZWF0ZVByb2Nlc3NBKGRidXNfZXhlX3BhdGgsIGRidXNfYXJncywgTlVMTCwgTlVMTCwgRkFMU0UsIENSRUFURV9OT19XSU5ET1csIE5VTEwsIE5VTEwsICZzaSwgJnBpKSkKKyAgICB7CisgICAgICBDbG9zZUhhbmRsZSAocGkuaFRocmVhZCk7CisgICAgICBDbG9zZUhhbmRsZSAocGkuaFByb2Nlc3MpOworICAgICAgcmV0dmFsID0gX2RidXNfZ2V0X2F1dG9sYXVuY2hfc2htKCBhZGRyZXNzLCAmc2htX25hbWUgKTsKKyAgICAgIGlmIChyZXR2YWwgPT0gRkFMU0UpCisgICAgICAgIGRidXNfc2V0X2Vycm9yX2NvbnN0IChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsICJGYWlsZWQgdG8gZ2V0IGF1dG9sYXVuY2ggYWRkcmVzcyBmcm9tIGxhdW5jaGVkIGRidXMtZGFlbW9uIik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3JfY29uc3QgKGVycm9yLCBEQlVTX0VSUk9SX0ZBSUxFRCwgIkZhaWxlZCB0byBsYXVuY2ggZGJ1cy1kYWVtb24iKTsKKyAgICAgIHJldHZhbCA9IEZBTFNFOworICAgIH0KKworb3V0OgorICBpZiAocmV0dmFsKQorICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworICBlbHNlCisgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAKKyAgX2RidXNfZ2xvYmFsX3VubG9jayAobXV0ZXgpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnNobV9uYW1lKTsKKworICByZXR1cm4gcmV0dmFsOworIH0KKworCisvKiogTWFrZXMgdGhlIGZpbGUgcmVhZGFibGUgYnkgZXZlcnkgdXNlciBpbiB0aGUgc3lzdGVtLgorICoKKyAqIEBwYXJhbSBmaWxlbmFtZSB0aGUgZmlsZW5hbWUKKyAqIEBwYXJhbSBlcnJvciBlcnJvciBsb2NhdGlvbgorICogQHJldHVybnMgI1RSVUUgaWYgdGhlIGZpbGUncyBwZXJtaXNzaW9ucyBjb3VsZCBiZSBjaGFuZ2VkLgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfbWFrZV9maWxlX3dvcmxkX3JlYWRhYmxlKGNvbnN0IERCdXNTdHJpbmcgKmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAqZXJyb3IpCit7CisgIC8vIFRPRE8KKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogQXRvbWljYWxseSBpbmNyZW1lbnRzIGFuIGludGVnZXIKKyAqCisgKiBAcGFyYW0gYXRvbWljIHBvaW50ZXIgdG8gdGhlIGludGVnZXIgdG8gaW5jcmVtZW50CisgKiBAcmV0dXJucyB0aGUgdmFsdWUgYmVmb3JlIGluY3JlbWVudGluZworICoKKyAqLworZGJ1c19pbnQzMl90CitfZGJ1c19hdG9taWNfaW5jIChEQnVzQXRvbWljICphdG9taWMpCit7CisgIC8vICsvLSAxIGlzIG5lZWRlZCBoZXJlIQorICAvLyBubyB2b2xhdGlsZSBhcmd1bWVudCB3aXRoIG1pbmd3CisgIHJldHVybiBJbnRlcmxvY2tlZEluY3JlbWVudCAoJmF0b21pYy0+dmFsdWUpIC0gMTsKK30KKworLyoqCisgKiBBdG9taWNhbGx5IGRlY3JlbWVudCBhbiBpbnRlZ2VyCisgKgorICogQHBhcmFtIGF0b21pYyBwb2ludGVyIHRvIHRoZSBpbnRlZ2VyIHRvIGRlY3JlbWVudAorICogQHJldHVybnMgdGhlIHZhbHVlIGJlZm9yZSBkZWNyZW1lbnRpbmcKKyAqCisgKi8KK2RidXNfaW50MzJfdAorX2RidXNfYXRvbWljX2RlYyAoREJ1c0F0b21pYyAqYXRvbWljKQoreworICAvLyArLy0gMSBpcyBuZWVkZWQgaGVyZSEKKyAgLy8gbm8gdm9sYXRpbGUgYXJndW1lbnQgd2l0aCBtaW5ndworICByZXR1cm4gSW50ZXJsb2NrZWREZWNyZW1lbnQgKCZhdG9taWMtPnZhbHVlKSArIDE7Cit9CisKKy8qKgorICogQXRvbWljYWxseSBnZXQgdGhlIHZhbHVlIG9mIGFuIGludGVnZXIuIEl0IG1heSBjaGFuZ2UgYXQgYW55IHRpbWUKKyAqIHRoZXJlYWZ0ZXIsIHNvIHRoaXMgaXMgbW9zdGx5IG9ubHkgdXNlZnVsIGZvciBhc3NlcnRpb25zLgorICoKKyAqIEBwYXJhbSBhdG9taWMgcG9pbnRlciB0byB0aGUgaW50ZWdlciB0byBnZXQKKyAqIEByZXR1cm5zIHRoZSB2YWx1ZSBhdCB0aGlzIG1vbWVudAorICovCitkYnVzX2ludDMyX3QKK19kYnVzX2F0b21pY19nZXQgKERCdXNBdG9taWMgKmF0b21pYykKK3sKKyAgLyogSW4gdGhpcyBzaXR1YXRpb24sIEdMaWIgaXNzdWVzIGEgTWVtb3J5QmFycmllcigpIGFuZCB0aGVuIHJldHVybnMKKyAgICogYXRvbWljLT52YWx1ZS4gSG93ZXZlciwgbWluZ3cgZnJvbSBtaW5ndy5vcmcgKG5vdCB0byBiZSBjb25mdXNlZCB3aXRoCisgICAqIG1pbmd3LXc2NCBmcm9tIG1pbmd3LXc2NC5zZi5uZXQpIGRvZXMgbm90IGhhdmUgTWVtb3J5QmFycmllciBpbiBpdHMKKyAgICogaGVhZGVycywgc28gd2UgaGF2ZSB0byBnZXQgYSBtZW1vcnkgYmFycmllciBzb21lIG90aGVyIHdheS4KKyAgICoKKyAgICogSW50ZXJsb2NrZWRJbmNyZW1lbnQgaXMgb2xkZXIsIGFuZCBpcyBkb2N1bWVudGVkIG9uIE1TRE4gdG8gYmUgYSBmdWxsCisgICAqIG1lbW9yeSBiYXJyaWVyLCBzbyBsZXQncyB1c2UgdGhhdC4KKyAgICovCisgIGxvbmcgZHVtbXkgPSAwOworCisgIEludGVybG9ja2VkRXhjaGFuZ2UgKCZkdW1teSwgMSk7CisKKyAgcmV0dXJuIGF0b21pYy0+dmFsdWU7Cit9CisKKy8qKgorICogQ2FsbGVkIHdoZW4gdGhlIGJ1cyBkYWVtb24gaXMgc2lnbmFsZWQgdG8gcmVsb2FkIGl0cyBjb25maWd1cmF0aW9uOyBhbnkKKyAqIGNhY2hlcyBzaG91bGQgYmUgbnVrZWQuIE9mIGNvdXJzZSBhbnkgY2FjaGVzIHRoYXQgbmVlZCBleHBsaWNpdCByZWxvYWQKKyAqIGFyZSBwcm9iYWJseSBicm9rZW4sIGJ1dCBjJ2VzdCBsYSB2aWUuCisgKgorICogCisgKi8KK3ZvaWQKK19kYnVzX2ZsdXNoX2NhY2hlcyAodm9pZCkKK3sKK30KKworLyoqCisgKiBTZWUgaWYgZXJybm8gaXMgRUFHQUlOIG9yIEVXT1VMREJMT0NLICh0aGlzIGhhcyB0byBiZSBkb25lIGRpZmZlcmVudGx5CisgKiBmb3IgV2luc29jayBzbyBpcyBhYnN0cmFjdGVkKQorICoKKyAqIEByZXR1cm5zICNUUlVFIGlmIGUgPT0gRUFHQUlOIG9yIGUgPT0gRVdPVUxEQkxPQ0sKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2dldF9pc19lcnJub19lYWdhaW5fb3JfZXdvdWxkYmxvY2sgKGludCBlKQoreworICByZXR1cm4gZSA9PSBXU0FFV09VTERCTE9DSzsKK30KKworLyoqCisgKiBGaWxsIHN0ciB3aXRoIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBELUJ1cyBpbnN0YWxsYXRpb24sIG9yIHRydW5jYXRlIHN0cgorICogdG8gemVybyBsZW5ndGggaWYgd2UgY2Fubm90IGRldGVybWluZSBpdC4KKyAqCisgKiBAcGFyYW0gc3RyIGJ1ZmZlciBmb3IgaW5zdGFsbGF0aW9uIHBhdGgKKyAqIEByZXR1cm5zICNGQUxTRSBvbiBPT00sICNUUlVFIGlmIG5vdCBPT00KKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2dldF9pbnN0YWxsX3Jvb3QgKERCdXNTdHJpbmcgKnN0cikKK3sKKyAgICAvKiB0aGlzIGlzIGp1c3QgYW4gaW5pdGlhbCBndWVzcyAqLworICAgIERXT1JEIHBhdGhMZW5ndGggPSBNQVhfUEFUSDsKKyAgICB1bnNpZ25lZCBjaGFyICpsYXN0U2xhc2g7CisgICAgdW5zaWduZWQgY2hhciAqcHJlZml4OworCisgICAgZG8KKyAgICAgIHsKKyAgICAgICAgLyogYWxsb2NhdGUgZW5vdWdoIHNwYWNlIGZvciBvdXIgYmVzdCBndWVzcyBhdCB0aGUgbGVuZ3RoICovCisgICAgICAgIGlmICghX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKHN0ciwgcGF0aExlbmd0aCkpCisgICAgICAgICAgeworICAgICAgICAgICAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKHN0ciwgMCk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgfQorCisgICAgICAgIFNldExhc3RFcnJvciAoMCk7CisgICAgICAgIHBhdGhMZW5ndGggPSBHZXRNb2R1bGVGaWxlTmFtZUEgKF9kYnVzX3dpbl9nZXRfZGxsX2htb2R1bGUgKCksCisgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2RhdGEgKHN0ciksIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChzdHIpKTsKKworICAgICAgICBpZiAocGF0aExlbmd0aCA9PSAwIHx8IEdldExhc3RFcnJvciAoKSAhPSAwKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGZhaWxlZCwgYnV0IG5vdCBPT00gKi8KKyAgICAgICAgICAgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoIChzdHIsIDApOworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgfQorCisgICAgICAgIC8qIGlmIHRoZSByZXR1cm4gaXMgc3RyaWN0bHkgbGVzcyB0aGFuIHRoZSBidWZmZXIgc2l6ZSwgaXQgaGFzCisgICAgICAgICAqIG5vdCBiZWVuIHRydW5jYXRlZCwgc28gd2UgY2FuIGNvbnRpbnVlICovCisgICAgICAgIGlmIChwYXRoTGVuZ3RoIDwgKERXT1JEKSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoc3RyKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiByZWR1Y2UgdGhlIGxlbmd0aCB0byBtYXRjaCB3aGF0IFdpbmRvd3MgZmlsbGVkIGluICovCisgICAgICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoIChzdHIsIHBhdGhMZW5ndGgpKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKHN0ciwgMCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKworICAgICAgICAvKiBlbHNlIGl0IG1heSBoYXZlIGJlZW4gdHJ1bmNhdGVkOyB0cnkgd2l0aCBhIGxhcmdlciBidWZmZXIgKi8KKyAgICAgICAgcGF0aExlbmd0aCAqPSAyOworICAgICAgfQorICAgIHdoaWxlIChUUlVFKTsKKworICAgIC8qIHRoZSByZXN0IG9mIHRoaXMgZnVuY3Rpb24gd29ya3MgYnkgZGlyZWN0IGJ5dGUgbWFuaXB1bGF0aW9uIG9mIHRoZQorICAgICAqIHVuZGVybHlpbmcgYnVmZmVyICovCisgICAgcHJlZml4ID0gX2RidXNfc3RyaW5nX2dldF91ZGF0YSAoc3RyKTsKKworICAgIGxhc3RTbGFzaCA9IF9tYnNyY2hyIChwcmVmaXgsICdcXCcpOworICAgIGlmIChsYXN0U2xhc2ggPT0gTlVMTCkgeworICAgICAgICAvKiBmYWlsZWQsIGJ1dCBub3QgT09NICovCisgICAgICAgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoIChzdHIsIDApOworICAgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgICAgLy9jdXQgb2ZmIGJpbmFyeSBuYW1lCisgICAgbGFzdFNsYXNoWzFdID0gMDsKKworICAgIC8vY3V0IHBvc3NpYmxlICJcXGJpbiIKKyAgICAvL3RoaXMgZmFpbHMgaWYgd2UgYXJlIGluIGEgZG91YmxlLWJ5dGUgc3lzdGVtIGNvZGVwYWdlIGFuZCB0aGUKKyAgICAvL2ZvbGRlcidzIG5hbWUgaGFwcGVucyB0byBlbmQgd2l0aCB0aGUgKmJ5dGVzKgorICAgIC8vIlxcYmluIi4uLiAoSS5lLiB0aGUgc2Vjb25kIGJ5dGUgb2Ygc29tZSBIYW4gY2hhcmFjdGVyIGFuZCB0aGVuCisgICAgLy90aGUgTGF0aW4gImJpbiIsIGJ1dCB0aGF0IGlzIG5vdCBsaWtlbHkgSSB0aGluay4uLgorICAgIGlmIChsYXN0U2xhc2ggLSBwcmVmaXggPj0gNCAmJiBfbWJzbmljbXAgKGxhc3RTbGFzaCAtIDQsIChjb25zdCB1bnNpZ25lZCBjaGFyICopIlxcYmluIiwgNCkgPT0gMCkKKyAgICAgICAgbGFzdFNsYXNoWy0zXSA9IDA7CisgICAgZWxzZSBpZiAobGFzdFNsYXNoIC0gcHJlZml4ID49IDEwICYmIF9tYnNuaWNtcCAobGFzdFNsYXNoIC0gMTAsIChjb25zdCB1bnNpZ25lZCBjaGFyICopIlxcYmluXFxkZWJ1ZyIsIDEwKSA9PSAwKQorICAgICAgICBsYXN0U2xhc2hbLTldID0gMDsKKyAgICBlbHNlIGlmIChsYXN0U2xhc2ggLSBwcmVmaXggPj0gMTIgJiYgX21ic25pY21wIChsYXN0U2xhc2ggLSAxMiwgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikiXFxiaW5cXHJlbGVhc2UiLCAxMikgPT0gMCkKKyAgICAgICAgbGFzdFNsYXNoWy0xMV0gPSAwOworCisgICAgLyogZml4IHVwIHRoZSBsZW5ndGggdG8gbWF0Y2ggdGhlIGJ5dGUtbWFuaXB1bGF0aW9uICovCisgICAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKHN0ciwgc3RybGVuICgoY2hhciAqKSBwcmVmaXgpKTsKKworICAgIHJldHVybiBUUlVFOworfQorCisvKiBTZWUgY29tbWVudCBpbiBkYnVzLXN5c2RlcHMtdW5peC5jICovCitkYnVzX2Jvb2xfdAorX2RidXNfbG9va3VwX3Nlc3Npb25fYWRkcmVzcyAoZGJ1c19ib29sX3QgKnN1cHBvcnRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICphZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgKmVycm9yKQoreworICAvKiBQcm9iYWJseSBmaWxsIHRoaXMgaW4gd2l0aCBzb21ldGhpbmcgYmFzZWQgb24gQ09NPyAqLworICAqc3VwcG9ydGVkID0gRkFMU0U7CisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIEFwcGVuZHMgdGhlIGRpcmVjdG9yeSBpbiB3aGljaCBhIGtleXJpbmcgZm9yIHRoZSBnaXZlbiBjcmVkZW50aWFscworICogc2hvdWxkIGJlIHN0b3JlZC4gIFRoZSBjcmVkZW50aWFscyBzaG91bGQgaGF2ZSBlaXRoZXIgYSBXaW5kb3dzIG9yCisgKiBVTklYIHVzZXIgaW4gdGhlbS4gIFRoZSBkaXJlY3Rvcnkgc2hvdWxkIGJlIGFuIGFic29sdXRlIHBhdGguCisgKgorICogT24gVU5JWCB0aGUgZGlyZWN0b3J5IGlzIH4vLmRidXMta2V5cmluZ3Mgd2hpbGUgb24gV2luZG93cyBpdCBzaG91bGQgcHJvYmFibHkKKyAqIGJlIHNvbWV0aGluZyBlbHNlLCBzaW5jZSB0aGUgZG90ZmlsZSBjb252ZW50aW9uIGlzIG5vdCBub3JtYWwgb24gV2luZG93cy4KKyAqIAorICogQHBhcmFtIGRpcmVjdG9yeSBzdHJpbmcgdG8gYXBwZW5kIGRpcmVjdG9yeSB0bworICogQHBhcmFtIGNyZWRlbnRpYWxzIGNyZWRlbnRpYWxzIHRoZSBkaXJlY3Rvcnkgc2hvdWxkIGJlIGZvcgorICogIAorICogQHJldHVybnMgI0ZBTFNFIG9uIG5vIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfYXBwZW5kX2tleXJpbmdfZGlyZWN0b3J5X2Zvcl9jcmVkZW50aWFscyAoREJ1c1N0cmluZyAgICAgICpkaXJlY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ3JlZGVudGlhbHMgKmNyZWRlbnRpYWxzKQoreworICBEQnVzU3RyaW5nIGhvbWVkaXI7CisgIERCdXNTdHJpbmcgZG90ZGlyOworICBjb25zdCBjaGFyICpob21lcGF0aDsKKyAgY29uc3QgY2hhciAqaG9tZWRyaXZlOworCisgIF9kYnVzX2Fzc2VydCAoY3JlZGVudGlhbHMgIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAoIV9kYnVzX2NyZWRlbnRpYWxzX2FyZV9hbm9ueW1vdXMgKGNyZWRlbnRpYWxzKSk7CisgIAorICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmaG9tZWRpcikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGhvbWVkcml2ZSA9IF9kYnVzX2dldGVudigiSE9NRURSSVZFIik7CisgIGlmIChob21lZHJpdmUgIT0gTlVMTCAmJiAqaG9tZWRyaXZlICE9ICdcMCcpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2FwcGVuZCgmaG9tZWRpcixob21lZHJpdmUpOworICAgIH0KKworICBob21lcGF0aCA9IF9kYnVzX2dldGVudigiSE9NRVBBVEgiKTsKKyAgaWYgKGhvbWVwYXRoICE9IE5VTEwgJiYgKmhvbWVwYXRoICE9ICdcMCcpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2FwcGVuZCgmaG9tZWRpcixob21lcGF0aCk7CisgICAgfQorICAKKyNpZmRlZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworICB7CisgICAgY29uc3QgY2hhciAqb3ZlcnJpZGU7CisgICAgCisgICAgb3ZlcnJpZGUgPSBfZGJ1c19nZXRlbnYgKCJEQlVTX1RFU1RfSE9NRURJUiIpOworICAgIGlmIChvdmVycmlkZSAhPSBOVUxMICYmICpvdmVycmlkZSAhPSAnXDAnKQorICAgICAgeworICAgICAgICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoJmhvbWVkaXIsIDApOworICAgICAgICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZob21lZGlyLCBvdmVycmlkZSkpCisgICAgICAgICAgZ290byBmYWlsZWQ7CisKKyAgICAgICAgX2RidXNfdmVyYm9zZSAoIlVzaW5nIGZha2UgaG9tZWRpciBmb3IgdGVzdGluZzogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJmhvbWVkaXIpKTsKKyAgICAgIH0KKyAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIE5vdCBzdHJpY3RseSB0aHJlYWQtc2FmZSwgYnV0IGlmIHdlIGZhaWwgYXQgdGhyZWFkLXNhZmV0eSBoZXJlLAorICAgICAgICAgKiB0aGUgd29yc3QgdGhhdCB3aWxsIGhhcHBlbiBpcyBzb21lIGV4dHJhIHdhcm5pbmdzLiAqLworICAgICAgICBzdGF0aWMgZGJ1c19ib29sX3QgYWxyZWFkeV93YXJuZWQgPSBGQUxTRTsKKyAgICAgICAgaWYgKCFhbHJlYWR5X3dhcm5lZCkKKyAgICAgICAgICB7CisgICAgICAgICAgICBfZGJ1c193YXJuICgiVXNpbmcgeW91ciByZWFsIGhvbWUgZGlyZWN0b3J5IGZvciB0ZXN0aW5nLCBzZXQgREJVU19URVNUX0hPTUVESVIgdG8gYXZvaWQiKTsKKyAgICAgICAgICAgIGFscmVhZHlfd2FybmVkID0gVFJVRTsKKyAgICAgICAgICB9CisgICAgICB9CisgIH0KKyNlbmRpZgorCisjaWZkZWYgREJVU19XSU5DRQorICAvKiBJdCdzIG5vdCBwb3NzaWJsZSB0byBjcmVhdGUgYSAuc29tZXRoaW5nIGRpcmVjdG9yeSBpbiBXaW5kb3dzIENFCisgICAgIHVzaW5nIHRoZSBmaWxlIGV4cGxvcmVyLiAgKi8KKyNkZWZpbmUgS0VZUklOR19ESVIgImRidXMta2V5cmluZ3MiCisjZWxzZQorI2RlZmluZSBLRVlSSU5HX0RJUiAiLmRidXMta2V5cmluZ3MiCisjZW5kaWYKKworICBfZGJ1c19zdHJpbmdfaW5pdF9jb25zdCAoJmRvdGRpciwgS0VZUklOR19ESVIpOworICBpZiAoIV9kYnVzX2NvbmNhdF9kaXJfYW5kX2ZpbGUgKCZob21lZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkb3RkaXIpKQorICAgIGdvdG8gZmFpbGVkOworICAKKyAgaWYgKCFfZGJ1c19zdHJpbmdfY29weSAoJmhvbWVkaXIsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yeSwgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGRpcmVjdG9yeSkpKSB7CisgICAgZ290byBmYWlsZWQ7CisgIH0KKworICBfZGJ1c19zdHJpbmdfZnJlZSAoJmhvbWVkaXIpOworICByZXR1cm4gVFJVRTsKKyAgCisgZmFpbGVkOiAKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZob21lZGlyKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKiogQ2hlY2tzIGlmIGEgZmlsZSBleGlzdHMKKyoKKyogQHBhcmFtIGZpbGUgZnVsbCBwYXRoIHRvIHRoZSBmaWxlCisqIEByZXR1cm5zICNUUlVFIGlmIGZpbGUgZXhpc3RzCisqLworZGJ1c19ib29sX3QgCitfZGJ1c19maWxlX2V4aXN0cyAoY29uc3QgY2hhciAqZmlsZSkKK3sKKyAgRFdPUkQgYXR0cmlidXRlcyA9IEdldEZpbGVBdHRyaWJ1dGVzQSAoZmlsZSk7CisKKyAgaWYgKGF0dHJpYnV0ZXMgIT0gSU5WQUxJRF9GSUxFX0FUVFJJQlVURVMgJiYgR2V0TGFzdEVycm9yKCkgIT0gRVJST1JfUEFUSF9OT1RfRk9VTkQpCisgICAgcmV0dXJuIFRSVUU7CisgIGVsc2UKKyAgICByZXR1cm4gRkFMU0U7ICAKK30KKworLyoqCisgKiBBIHdyYXBwZXIgYXJvdW5kIHN0cmVycm9yKCkgYmVjYXVzZSBzb21lIHBsYXRmb3JtcworICogbWF5IGJlIGxhbWUgYW5kIG5vdCBoYXZlIHN0cmVycm9yKCkuCisgKgorICogQHBhcmFtIGVycm9yX251bWJlciBlcnJuby4KKyAqIEByZXR1cm5zIGVycm9yIGRlc2NyaXB0aW9uLgorICovCitjb25zdCBjaGFyKgorX2RidXNfc3RyZXJyb3IgKGludCBlcnJvcl9udW1iZXIpCit7CisjaWZkZWYgREJVU19XSU5DRQorICAvLyBUT0RPCisgIHJldHVybiAidW5rbm93biI7CisjZWxzZQorICBjb25zdCBjaGFyICptc2c7CisKKyAgc3dpdGNoIChlcnJvcl9udW1iZXIpCisgICAgeworICAgIGNhc2UgV1NBRUlOVFI6CisgICAgICByZXR1cm4gIkludGVycnVwdGVkIGZ1bmN0aW9uIGNhbGwiOworICAgIGNhc2UgV1NBRUFDQ0VTOgorICAgICAgcmV0dXJuICJQZXJtaXNzaW9uIGRlbmllZCI7CisgICAgY2FzZSBXU0FFRkFVTFQ6CisgICAgICByZXR1cm4gIkJhZCBhZGRyZXNzIjsKKyAgICBjYXNlIFdTQUVJTlZBTDoKKyAgICAgIHJldHVybiAiSW52YWxpZCBhcmd1bWVudCI7CisgICAgY2FzZSBXU0FFTUZJTEU6CisgICAgICByZXR1cm4gIlRvbyBtYW55IG9wZW4gZmlsZXMiOworICAgIGNhc2UgV1NBRVdPVUxEQkxPQ0s6CisgICAgICByZXR1cm4gIlJlc291cmNlIHRlbXBvcmFyaWx5IHVuYXZhaWxhYmxlIjsKKyAgICBjYXNlIFdTQUVJTlBST0dSRVNTOgorICAgICAgcmV0dXJuICJPcGVyYXRpb24gbm93IGluIHByb2dyZXNzIjsKKyAgICBjYXNlIFdTQUVBTFJFQURZOgorICAgICAgcmV0dXJuICJPcGVyYXRpb24gYWxyZWFkeSBpbiBwcm9ncmVzcyI7CisgICAgY2FzZSBXU0FFTk9UU09DSzoKKyAgICAgIHJldHVybiAiU29ja2V0IG9wZXJhdGlvbiBvbiBub25zb2NrZXQiOworICAgIGNhc2UgV1NBRURFU1RBRERSUkVROgorICAgICAgcmV0dXJuICJEZXN0aW5hdGlvbiBhZGRyZXNzIHJlcXVpcmVkIjsKKyAgICBjYXNlIFdTQUVNU0dTSVpFOgorICAgICAgcmV0dXJuICJNZXNzYWdlIHRvbyBsb25nIjsKKyAgICBjYXNlIFdTQUVQUk9UT1RZUEU6CisgICAgICByZXR1cm4gIlByb3RvY29sIHdyb25nIHR5cGUgZm9yIHNvY2tldCI7CisgICAgY2FzZSBXU0FFTk9QUk9UT09QVDoKKyAgICAgIHJldHVybiAiQmFkIHByb3RvY29sIG9wdGlvbiI7CisgICAgY2FzZSBXU0FFUFJPVE9OT1NVUFBPUlQ6CisgICAgICByZXR1cm4gIlByb3RvY29sIG5vdCBzdXBwb3J0ZWQiOworICAgIGNhc2UgV1NBRVNPQ0tUTk9TVVBQT1JUOgorICAgICAgcmV0dXJuICJTb2NrZXQgdHlwZSBub3Qgc3VwcG9ydGVkIjsKKyAgICBjYXNlIFdTQUVPUE5PVFNVUFA6CisgICAgICByZXR1cm4gIk9wZXJhdGlvbiBub3Qgc3VwcG9ydGVkIjsKKyAgICBjYXNlIFdTQUVQRk5PU1VQUE9SVDoKKyAgICAgIHJldHVybiAiUHJvdG9jb2wgZmFtaWx5IG5vdCBzdXBwb3J0ZWQiOworICAgIGNhc2UgV1NBRUFGTk9TVVBQT1JUOgorICAgICAgcmV0dXJuICJBZGRyZXNzIGZhbWlseSBub3Qgc3VwcG9ydGVkIGJ5IHByb3RvY29sIGZhbWlseSI7CisgICAgY2FzZSBXU0FFQUREUklOVVNFOgorICAgICAgcmV0dXJuICJBZGRyZXNzIGFscmVhZHkgaW4gdXNlIjsKKyAgICBjYXNlIFdTQUVBRERSTk9UQVZBSUw6CisgICAgICByZXR1cm4gIkNhbm5vdCBhc3NpZ24gcmVxdWVzdGVkIGFkZHJlc3MiOworICAgIGNhc2UgV1NBRU5FVERPV046CisgICAgICByZXR1cm4gIk5ldHdvcmsgaXMgZG93biI7CisgICAgY2FzZSBXU0FFTkVUVU5SRUFDSDoKKyAgICAgIHJldHVybiAiTmV0d29yayBpcyB1bnJlYWNoYWJsZSI7CisgICAgY2FzZSBXU0FFTkVUUkVTRVQ6CisgICAgICByZXR1cm4gIk5ldHdvcmsgZHJvcHBlZCBjb25uZWN0aW9uIG9uIHJlc2V0IjsKKyAgICBjYXNlIFdTQUVDT05OQUJPUlRFRDoKKyAgICAgIHJldHVybiAiU29mdHdhcmUgY2F1c2VkIGNvbm5lY3Rpb24gYWJvcnQiOworICAgIGNhc2UgV1NBRUNPTk5SRVNFVDoKKyAgICAgIHJldHVybiAiQ29ubmVjdGlvbiByZXNldCBieSBwZWVyIjsKKyAgICBjYXNlIFdTQUVOT0JVRlM6CisgICAgICByZXR1cm4gIk5vIGJ1ZmZlciBzcGFjZSBhdmFpbGFibGUiOworICAgIGNhc2UgV1NBRUlTQ09OTjoKKyAgICAgIHJldHVybiAiU29ja2V0IGlzIGFscmVhZHkgY29ubmVjdGVkIjsKKyAgICBjYXNlIFdTQUVOT1RDT05OOgorICAgICAgcmV0dXJuICJTb2NrZXQgaXMgbm90IGNvbm5lY3RlZCI7CisgICAgY2FzZSBXU0FFU0hVVERPV046CisgICAgICByZXR1cm4gIkNhbm5vdCBzZW5kIGFmdGVyIHNvY2tldCBzaHV0ZG93biI7CisgICAgY2FzZSBXU0FFVElNRURPVVQ6CisgICAgICByZXR1cm4gIkNvbm5lY3Rpb24gdGltZWQgb3V0IjsKKyAgICBjYXNlIFdTQUVDT05OUkVGVVNFRDoKKyAgICAgIHJldHVybiAiQ29ubmVjdGlvbiByZWZ1c2VkIjsKKyAgICBjYXNlIFdTQUVIT1NURE9XTjoKKyAgICAgIHJldHVybiAiSG9zdCBpcyBkb3duIjsKKyAgICBjYXNlIFdTQUVIT1NUVU5SRUFDSDoKKyAgICAgIHJldHVybiAiTm8gcm91dGUgdG8gaG9zdCI7CisgICAgY2FzZSBXU0FFUFJPQ0xJTToKKyAgICAgIHJldHVybiAiVG9vIG1hbnkgcHJvY2Vzc2VzIjsKKyAgICBjYXNlIFdTQUVESVNDT046CisgICAgICByZXR1cm4gIkdyYWNlZnVsIHNodXRkb3duIGluIHByb2dyZXNzIjsKKyAgICBjYXNlIFdTQVRZUEVfTk9UX0ZPVU5EOgorICAgICAgcmV0dXJuICJDbGFzcyB0eXBlIG5vdCBmb3VuZCI7CisgICAgY2FzZSBXU0FIT1NUX05PVF9GT1VORDoKKyAgICAgIHJldHVybiAiSG9zdCBub3QgZm91bmQiOworICAgIGNhc2UgV1NBVFJZX0FHQUlOOgorICAgICAgcmV0dXJuICJOb25hdXRob3JpdGF0aXZlIGhvc3Qgbm90IGZvdW5kIjsKKyAgICBjYXNlIFdTQU5PX1JFQ09WRVJZOgorICAgICAgcmV0dXJuICJUaGlzIGlzIGEgbm9ucmVjb3ZlcmFibGUgZXJyb3IiOworICAgIGNhc2UgV1NBTk9fREFUQToKKyAgICAgIHJldHVybiAiVmFsaWQgbmFtZSwgbm8gZGF0YSByZWNvcmQgb2YgcmVxdWVzdGVkIHR5cGUiOworICAgIGNhc2UgV1NBX0lOVkFMSURfSEFORExFOgorICAgICAgcmV0dXJuICJTcGVjaWZpZWQgZXZlbnQgb2JqZWN0IGhhbmRsZSBpcyBpbnZhbGlkIjsKKyAgICBjYXNlIFdTQV9JTlZBTElEX1BBUkFNRVRFUjoKKyAgICAgIHJldHVybiAiT25lIG9yIG1vcmUgcGFyYW1ldGVycyBhcmUgaW52YWxpZCI7CisgICAgY2FzZSBXU0FfSU9fSU5DT01QTEVURToKKyAgICAgIHJldHVybiAiT3ZlcmxhcHBlZCBJL08gZXZlbnQgb2JqZWN0IG5vdCBpbiBzaWduYWxlZCBzdGF0ZSI7CisgICAgY2FzZSBXU0FfSU9fUEVORElORzoKKyAgICAgIHJldHVybiAiT3ZlcmxhcHBlZCBvcGVyYXRpb25zIHdpbGwgY29tcGxldGUgbGF0ZXIiOworICAgIGNhc2UgV1NBX05PVF9FTk9VR0hfTUVNT1JZOgorICAgICAgcmV0dXJuICJJbnN1ZmZpY2llbnQgbWVtb3J5IGF2YWlsYWJsZSI7CisgICAgY2FzZSBXU0FfT1BFUkFUSU9OX0FCT1JURUQ6CisgICAgICByZXR1cm4gIk92ZXJsYXBwZWQgb3BlcmF0aW9uIGFib3J0ZWQiOworI2lmZGVmIFdTQUlOVkFMSURQUk9DVEFCTEUKKworICAgIGNhc2UgV1NBSU5WQUxJRFBST0NUQUJMRToKKyAgICAgIHJldHVybiAiSW52YWxpZCBwcm9jZWR1cmUgdGFibGUgZnJvbSBzZXJ2aWNlIHByb3ZpZGVyIjsKKyNlbmRpZgorI2lmZGVmIFdTQUlOVkFMSURQUk9WSURFUgorCisgICAgY2FzZSBXU0FJTlZBTElEUFJPVklERVI6CisgICAgICByZXR1cm4gIkludmFsaWQgc2VydmljZSBwcm92aWRlciB2ZXJzaW9uIG51bWJlciI7CisjZW5kaWYKKyNpZmRlZiBXU0FQUk9WSURFUkZBSUxFRElOSVQKKworICAgIGNhc2UgV1NBUFJPVklERVJGQUlMRURJTklUOgorICAgICAgcmV0dXJuICJVbmFibGUgdG8gaW5pdGlhbGl6ZSBhIHNlcnZpY2UgcHJvdmlkZXIiOworI2VuZGlmCisKKyAgICBjYXNlIFdTQVNZU0NBTExGQUlMVVJFOgorICAgICAgcmV0dXJuICJTeXN0ZW0gY2FsbCBmYWlsdXJlIjsKKworICAgIGRlZmF1bHQ6CisgICAgICBtc2cgPSBzdHJlcnJvciAoZXJyb3JfbnVtYmVyKTsKKworICAgICAgaWYgKG1zZyA9PSBOVUxMKQorICAgICAgICBtc2cgPSAidW5rbm93biI7CisKKyAgICAgIHJldHVybiBtc2c7CisgICAgfQorI2VuZGlmIC8vREJVU19XSU5DRQorfQorCisvKioKKyAqIEFzc2lnbnMgYW4gZXJyb3IgbmFtZSBhbmQgbWVzc2FnZSBjb3JyZXNwb25kaW5nIHRvIGEgV2luMzIgZXJyb3IKKyAqIGNvZGUgdG8gYSBEQnVzRXJyb3IuIERvZXMgbm90aGluZyBpZiBlcnJvciBpcyAjTlVMTC4KKyAqCisgKiBAcGFyYW0gZXJyb3IgdGhlIGVycm9yLgorICogQHBhcmFtIGNvZGUgdGhlIFdpbjMyIGVycm9yIGNvZGUKKyAqLwordm9pZAorX2RidXNfd2luX3NldF9lcnJvcl9mcm9tX3dpbl9lcnJvciAoREJ1c0Vycm9yICplcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgY29kZSkKK3sKKyAgY2hhciAqbXNnOworCisgIC8qIEFzIHdlIHdhbnQgdGhlIEVuZ2xpc2ggbWVzc2FnZSwgdXNlIHRoZSBBIEFQSSAqLworICBGb3JtYXRNZXNzYWdlQSAoRk9STUFUX01FU1NBR0VfQUxMT0NBVEVfQlVGRkVSIHwKKyAgICAgICAgICAgICAgICAgIEZPUk1BVF9NRVNTQUdFX0lHTk9SRV9JTlNFUlRTIHwKKyAgICAgICAgICAgICAgICAgIEZPUk1BVF9NRVNTQUdFX0ZST01fU1lTVEVNLAorICAgICAgICAgICAgICAgICAgTlVMTCwgY29kZSwgTUFLRUxBTkdJRCAoTEFOR19FTkdMSVNILCBTVUJMQU5HX0VOR0xJU0hfVVMpLAorICAgICAgICAgICAgICAgICAgKExQU1RSKSAmbXNnLCAwLCBOVUxMKTsKKyAgaWYgKG1zZykKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsICJ3aW4zMi5lcnJvciIsICIlcyIsIG1zZyk7CisgICAgICBMb2NhbEZyZWUgKG1zZyk7CisgICAgfQorICBlbHNlCisgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCAid2luMzIuZXJyb3IiLCAiVW5rbm93biBlcnJvciBjb2RlICVkIG9yIEZvcm1hdE1lc3NhZ2UgZmFpbGVkIiwgY29kZSk7Cit9CisKK3ZvaWQKK19kYnVzX3dpbl93YXJuX3dpbl9lcnJvciAoY29uc3QgY2hhciAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBjb2RlKQoreworICBEQnVzRXJyb3IgZXJyb3I7CisKKyAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworICBfZGJ1c193aW5fc2V0X2Vycm9yX2Zyb21fd2luX2Vycm9yICgmZXJyb3IsIGNvZGUpOworICBfZGJ1c193YXJuICgiJXM6ICVzIiwgbWVzc2FnZSwgZXJyb3IubWVzc2FnZSk7CisgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKK30KKworLyoqCisgKiBSZW1vdmVzIGEgZGlyZWN0b3J5OyBEaXJlY3RvcnkgbXVzdCBiZSBlbXB0eQorICoKKyAqIEBwYXJhbSBmaWxlbmFtZSBkaXJlY3RvcnkgZmlsZW5hbWUKKyAqIEBwYXJhbSBlcnJvciBpbml0aWFsaXplZCBlcnJvciBvYmplY3QKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2RlbGV0ZV9kaXJlY3RvcnkgKGNvbnN0IERCdXNTdHJpbmcgKmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpCit7CisgIGNvbnN0IGNoYXIgKmZpbGVuYW1lX2M7CisKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgZmlsZW5hbWVfYyA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoZmlsZW5hbWUpOworCisgIGlmIChSZW1vdmVEaXJlY3RvcnlBIChmaWxlbmFtZV9jKSA9PSAwKQorICAgIHsKKyAgICAgIGNoYXIgKmVtc2cgPSBfZGJ1c193aW5fZXJyb3Jfc3RyaW5nIChHZXRMYXN0RXJyb3IgKCkpOworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c193aW5fZXJyb3JfZnJvbV9sYXN0X2Vycm9yICgpLAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gcmVtb3ZlIGRpcmVjdG9yeSAlczogJXMiLAorICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lX2MsIGVtc2cpOworICAgICAgX2RidXNfd2luX2ZyZWVfZXJyb3Jfc3RyaW5nIChlbXNnKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogQ2hlY2tzIHdoZXRoZXIgdGhlIGZpbGVuYW1lIGlzIGFuIGFic29sdXRlIHBhdGgKKyAqCisgKiBAcGFyYW0gZmlsZW5hbWUgdGhlIGZpbGVuYW1lCisgKiBAcmV0dXJucyAjVFJVRSBpZiBhbiBhYnNvbHV0ZSBwYXRoCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19wYXRoX2lzX2Fic29sdXRlIChjb25zdCBEQnVzU3RyaW5nICpmaWxlbmFtZSkKK3sKKyAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChmaWxlbmFtZSkgPiAwKQorICAgIHJldHVybiBfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKGZpbGVuYW1lLCAxKSA9PSAnOicKKyAgICAgICAgICAgfHwgX2RidXNfc3RyaW5nX2dldF9ieXRlIChmaWxlbmFtZSwgMCkgPT0gJ1xcJworICAgICAgICAgICB8fCBfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKGZpbGVuYW1lLCAwKSA9PSAnLyc7CisgIGVsc2UKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKK2RidXNfYm9vbF90CitfZGJ1c19jaGVja19zZXR1aWQgKHZvaWQpCit7CisgIHJldHVybiBGQUxTRTsKK30KKworaW50CitfZGJ1c19zYXZlX3NvY2tldF9lcnJubyAodm9pZCkKK3sKKyAgcmV0dXJuIGVycm5vOworfQorCit2b2lkCitfZGJ1c19yZXN0b3JlX3NvY2tldF9lcnJubyAoaW50IHNhdmVkX2Vycm5vKQoreworICBfZGJ1c193aW5fc2V0X2Vycm5vIChzYXZlZF9lcnJubyk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpsb2dfdGFnID0gImRidXMiOworc3RhdGljIERCdXNMb2dGbGFncyBsb2dfZmxhZ3MgPSBEQlVTX0xPR19GTEFHU19TVERFUlI7CisKKy8qKgorICogSW5pdGlhbGl6ZSB0aGUgc3lzdGVtIGxvZy4KKyAqCisgKiBUaGUgInRhZyIgaXMgbm90IGNvcGllZCwgYW5kIG11c3QgcmVtYWluIHZhbGlkIGZvciB0aGUgZW50aXJlIGxpZmV0aW1lIG9mCisgKiB0aGUgcHJvY2VzcyBvciB1bnRpbCBfZGJ1c19pbml0X3N5c3RlbV9sb2coKSBpcyBjYWxsZWQgYWdhaW4uIEluIHByYWN0aWNlCisgKiBpdCB3aWxsIG5vcm1hbGx5IGJlIGEgY29uc3RhbnQuCisgKgorICogQHBhcmFtIHRhZyB0aGUgbmFtZSBvZiB0aGUgZXhlY3V0YWJsZSAoc3lzbG9nIHRhZykKKyAqIEBwYXJhbSBtb2RlIHdoZXRoZXIgdG8gbG9nIHRvIHN0ZGVyciwgdGhlIHN5c3RlbSBsb2cgb3IgYm90aAorICovCit2b2lkCitfZGJ1c19pbml0X3N5c3RlbV9sb2cgKGNvbnN0IGNoYXIgICAqdGFnLAorICAgICAgICAgICAgICAgICAgICAgICBEQnVzTG9nRmxhZ3MgIGZsYWdzKQoreworICAvKiBXZSBuZXZlciB3YW50IHRvIHR1cm4gb2ZmIGxvZ2dpbmcgY29tcGxldGVseSAqLworICBfZGJ1c19hc3NlcnQgKAorICAgICAgKGZsYWdzICYgKERCVVNfTE9HX0ZMQUdTX1NUREVSUiB8IERCVVNfTE9HX0ZMQUdTX1NZU1RFTV9MT0cpKSAhPSAwKTsKKworICBsb2dfdGFnID0gdGFnOworICBsb2dfZmxhZ3MgPSBmbGFnczsKK30KKworLyoqCisgKiBMb2cgYSBtZXNzYWdlIHRvIHRoZSBzeXN0ZW0gbG9nIGZpbGUgKGUuZy4gc3lzbG9nIG9uIFVuaXgpLgorICoKKyAqIEBwYXJhbSBzZXZlcml0eSBhIHNldmVyaXR5IHZhbHVlCisgKiBAcGFyYW0gbXNnIGEgcHJpbnRmLXN0eWxlIGZvcm1hdCBzdHJpbmcKKyAqIEBwYXJhbSBhcmdzIGFyZ3VtZW50cyBmb3IgdGhlIGZvcm1hdCBzdHJpbmcKKyAqLwordm9pZAorX2RidXNfbG9ndiAoREJ1c1N5c3RlbUxvZ1NldmVyaXR5ICBzZXZlcml0eSwKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICAgICAqbXNnLAorICAgICAgICAgICAgdmFfbGlzdCAgICAgICAgICAgICAgICBhcmdzKQoreworICBjb25zdCBjaGFyICpzID0gIiI7CisgIHZhX2xpc3QgdG1wOworCisgIHN3aXRjaChzZXZlcml0eSkKKyAgIHsKKyAgICAgY2FzZSBEQlVTX1NZU1RFTV9MT0dfSU5GTzogcyA9ICJpbmZvIjsgYnJlYWs7CisgICAgIGNhc2UgREJVU19TWVNURU1fTE9HX1dBUk5JTkc6IHMgPSAid2FybmluZyI7IGJyZWFrOworICAgICBjYXNlIERCVVNfU1lTVEVNX0xPR19TRUNVUklUWTogcyA9ICJzZWN1cml0eSI7IGJyZWFrOworICAgICBjYXNlIERCVVNfU1lTVEVNX0xPR19FUlJPUjogcyA9ICJlcnJvciI7IGJyZWFrOworICAgICBkZWZhdWx0OiBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJpbnZhbGlkIGxvZyBzZXZlcml0eSIpOworICAgfQorCisgIGlmIChsb2dfZmxhZ3MgJiBEQlVTX0xPR19GTEFHU19TWVNURU1fTE9HKQorICAgIHsKKyAgICAgIGNoYXIgYnVmWzEwMjRdOworICAgICAgY2hhciBmb3JtYXRbMTAyNF07CisKKyAgICAgIERCVVNfVkFfQ09QWSAodG1wLCBhcmdzKTsKKyAgICAgIHNucHJpbnRmIChmb3JtYXQsIHNpemVvZiAoZm9ybWF0KSwgIiVzOiAlcyIsIHMsIG1zZyk7CisgICAgICB2c25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgZm9ybWF0LCB0bXApOworICAgICAgT3V0cHV0RGVidWdTdHJpbmdBKGJ1Zik7CisgICAgICB2YV9lbmQgKHRtcCk7CisgICAgfQorCisgIGlmIChsb2dfZmxhZ3MgJiBEQlVTX0xPR19GTEFHU19TVERFUlIpCisgICAgeworICAgICAgREJVU19WQV9DT1BZICh0bXAsIGFyZ3MpOworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXNbJWx1XTogJXM6ICIsIGxvZ190YWcsIF9kYnVzX3BpZF9mb3JfbG9nICgpLCBzKTsKKyAgICAgIHZmcHJpbnRmIChzdGRlcnIsIG1zZywgdG1wKTsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIlxuIik7CisgICAgICB2YV9lbmQgKHRtcCk7CisgICAgfQorfQorCisvKiogQH0gZW5kIG9mIHN5c2RlcHMtd2luICovCisvKiB0ZXN0cyBpbiBkYnVzLXN5c2RlcHMtdXRpbC5jICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtc3lzZGVwcy13aW4uaCBiL2RidXMvZGJ1cy1zeXNkZXBzLXdpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4ODYxYTEKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtc3lzZGVwcy13aW4uaApAQCAtMCwwICsxLDk1IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtc3lzZGVwcy5jIFdyYXBwZXJzIGFyb3VuZCBzeXN0ZW0vbGliYyBmZWF0dXJlcyAoaW50ZXJuYWwgdG8gRC1CVVMgaW1wbGVtZW50YXRpb24pCisgKiAKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMyAgUmVkIEhhdCwgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDAzIENvZGVGYWN0b3J5IEFCCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgTm92ZWxsLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpZm5kZWYgREJVU19TWVNERVBTX1dJTl9ICisjZGVmaW5lIERCVVNfU1lTREVQU19XSU5fSAorCitleHRlcm4gdm9pZCAqX2RidXNfd2luX2dldF9kbGxfaG1vZHVsZSAodm9pZCk7CisjZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4KKworI2luY2x1ZGUgImRidXMtaGFzaC5oIgorI2luY2x1ZGUgImRidXMtc3RyaW5nLmgiCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxtYWxsb2MuaD4KKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjdW5kZWYgaW50ZXJmYWNlCisKKyNkZWZpbmUgREJVU19DT05TT0xFX0RJUiAiL3Zhci9ydW4vY29uc29sZS8iCisKKwordm9pZCBfZGJ1c193aW5fc2V0X2Vycm5vIChpbnQgZXJyKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2NvbnN0IGNoYXIqIF9kYnVzX3dpbl9lcnJvcl9mcm9tX2xhc3RfZXJyb3IgKHZvaWQpOworCitkYnVzX2Jvb2xfdCBfZGJ1c193aW5fc3RhcnR1cF93aW5zb2NrICh2b2lkKTsKK3ZvaWQgX2RidXNfd2luX3dhcm5fd2luX2Vycm9yICAoY29uc3QgY2hhciAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBjb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitEQlVTX1BSSVZBVEVfRVhQT1JUCitjaGFyICogX2RidXNfd2luX2Vycm9yX3N0cmluZyAoaW50IGVycm9yX251bWJlcik7CitEQlVTX1BSSVZBVEVfRVhQT1JUCit2b2lkIF9kYnVzX3dpbl9mcmVlX2Vycm9yX3N0cmluZyAoY2hhciAqc3RyaW5nKTsKKworZXh0ZXJuIGNvbnN0IGNoYXIqIF9kYnVzX2xtX3N0cmVycm9yICAoaW50IGVycm9yX251bWJlcik7CisKKworZGJ1c19ib29sX3QgX2RidXNfd2luX2FjY291bnRfdG9fc2lkIChjb25zdCB3Y2hhcl90ICp3YWNjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICoqcHBzaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgKmVycm9yKTsKKworZGJ1c19ib29sX3QKK19kYnVzX3dpbjMyX3NpZF90b19uYW1lX2FuZF9kb21haW4gKGRidXNfdWlkX3QgIHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdjaGFyX3QgICAqKnduYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2NoYXJfdCAgICoqd2RvbWFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgKmVycm9yKTsKKworCisvKiBEb24ndCBkZWZpbmUgREJVU19DT05TT0xFX0RJUiBvbiBXaW4zMiAqLworCit3Y2hhcl90ICAgICpfZGJ1c193aW5fdXRmOF90b191dGYxNiAoY29uc3QgY2hhciAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAqZXJyb3IpOworY2hhciAgICAgICAqX2RidXNfd2luX3V0ZjE2X3RvX3V0ZjggKGNvbnN0IHdjaGFyX3QgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgKmVycm9yKTsKKworREJVU19QUklWQVRFX0VYUE9SVAordm9pZCAgICAgICAgX2RidXNfd2luX3NldF9lcnJvcl9mcm9tX3dpbl9lcnJvciAoREJ1c0Vycm9yICplcnJvciwgaW50IGNvZGUpOworCitkYnVzX2Jvb2xfdAorX2RidXNfd2luX3NpZF90b19uYW1lX2FuZF9kb21haW4gKGRidXNfdWlkX3QgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdjaGFyX3QgICoqd25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2NoYXJfdCAgKip3ZG9tYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAqZXJyb3IpOworCitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCBfZGJ1c19nZXRfaW5zdGFsbF9yb290IChEQnVzU3RyaW5nICpzdHIpOworCit2b2lkICAgICAgICBfZGJ1c190aHJlYWRzX3dpbmRvd3NfaW5pdF9nbG9iYWwgKHZvaWQpOwordm9pZCAgICAgICAgX2RidXNfdGhyZWFkc193aW5kb3dzX2Vuc3VyZV9jdG9yX2xpbmtlZCAodm9pZCk7CisKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90IF9kYnVzX2dldHNpZChjaGFyICoqc2lkLCBkYnVzX3BpZF90IHByb2Nlc3NfaWQpOworI2VuZGlmCisKKy8qKiBAfSBlbmQgb2Ygc3lzZGVwcy13aW4uaCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLXN5c2RlcHMtd2luY2UtZ2x1ZS5jIGIvZGJ1cy9kYnVzLXN5c2RlcHMtd2luY2UtZ2x1ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyNzZmMDQKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtc3lzZGVwcy13aW5jZS1nbHVlLmMKQEAgLTAsMCArMSwxMTY1IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtc3lzZGVwcy13aW5jZS1nbHVlLmMgV3JhcHBlcnMgZm9yIFdpbmRvd3MgQ0UgYXJvdW5kIHN5c3RlbS9saWJjIGZlYXR1cmVzIChpbnRlcm5hbCB0byBELUJVUyBpbXBsZW1lbnRhdGlvbikKKyAqIAorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzICBSZWQgSGF0LCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgQ29kZUZhY3RvcnkgQUIKKyAqIENvcHlyaWdodCAoQykgMjAwNSBOb3ZlbGwsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwNiBSYWxmIEhhYmFja2VyIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgUGV0ZXIgS8O8bW1lbCAgPHN5bnRoZXRpY3BwQGdteC5uZXQ+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgQ2hyaXN0aWFuIEVocmxpY2hlciA8Y2guZWhybGljaGVyQGdteC5kZT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgImRidXMtaW50ZXJuYWxzLmgiCisjaW5jbHVkZSAiZGJ1cy1zeXNkZXBzLmgiCisjaW5jbHVkZSAiZGJ1cy1zeXNkZXBzLXdpbi5oIgorCisjaW5jbHVkZSA8d2luZG93cy5oPgorLyogSW5jbHVkaW5nIHNobG9iai5oIGNyZWF0ZXMgdHJvdWJsZSBvbiBzb21lIGNvbXBpbGVycy4gIEp1c3QgY2hpY2tlbgorICAgb3V0IGhlcmUgYnkgZGVmaW5pbmcganVzdCB3aGF0IHdlIG5lZWQuICAqLworI2lmbmRlZiBDU0lETF9QRVJTT05BTAorI2RlZmluZSBDU0lETF9QRVJTT05BTCA1CisjZW5kaWYKKworCisvKiBDb3B5IFNSQyB0byBERVNULCByZXR1cm5pbmcgdGhlIGFkZHJlc3Mgb2YgdGhlIHRlcm1pbmF0aW5nICdcMCcgaW4gREVTVC4gICovCitzdGF0aWMgY2hhciAqCitzdHBjcHkgKGNoYXIgKmRlc3QsIGNvbnN0IGNoYXIgKnNyYykKK3sKKyAgY2hhciAqZCA9IGRlc3Q7CisgIGNvbnN0IGNoYXIgKnMgPSBzcmM7CisKKyAgZG8KKyAgICAqZCsrID0gKnM7CisgIHdoaWxlICgqcysrICE9ICdcMCcpOworCisgIHJldHVybiBkIC0gMTsKK30KKworCisvKiBUaGlzIGlzIHNwZWNpYWwgY2FzZWQsIGJlY2F1c2Ugd2UgbXVzdCBhdm9pZCB1c2luZyBtYW55IGRidXMKKyAgIGZ1bmN0aW9ucyAoc3VjaCBhcyBtZW1vcnkgYWxsb2NhdGlvbnMpOiBUaG9zZSBmdW5jdGlvbnMgbWF5IGluIHR1cm4KKyAgIGNhdXNlIHZlcmJvc2Ugb3V0cHV0IGFuZCBjaGVjayB0aGUgZmxhZyEgICovCitzdGF0aWMgY2hhciAqCitnZXRfdmVyYm9zZV9zZXR0aW5nKCkKK3sKKyAgY29uc3Qgd2NoYXJfdCBkaXJbXSA9IEwiU29mdHdhcmVcXGZyZWVkZXNrdG9wXFxEQnVzIjsKKyAgY29uc3Qgd2NoYXJfdCBuYW1lW10gPSBMIlZlcmJvc2UiOworICBIS0VZIHJvb3Rfa2V5OworICBIS0VZIGtleV9oYW5kbGU7CisgIERXT1JEIG5ieXRlczsKKyAgRFdPUkQgbjE7CisgIERXT1JEIHR5cGU7CisgIHdjaGFyX3QgKnJlc3VsdF93ID0gTlVMTDsKKyAgY2hhciAqcmVzdWx0OworICBpbnQgbGVuOworCisgIHJvb3Rfa2V5ID0gSEtFWV9MT0NBTF9NQUNISU5FOworICBpZiAoUmVnT3BlbktleUV4VyAocm9vdF9rZXksIGRpciwgMCwgS0VZX1JFQUQsICZrZXlfaGFuZGxlKSkKKyAgICByZXR1cm4gTlVMTDsKKworICBuYnl0ZXMgPSAxOworICBpZiAoUmVnUXVlcnlWYWx1ZUV4VyAoa2V5X2hhbmRsZSwgbmFtZSwgMCwgTlVMTCwgTlVMTCwgJm5ieXRlcykpCisgICAgeworICAgICAgUmVnQ2xvc2VLZXkgKGtleV9oYW5kbGUpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAvKiBSb3VuZCB1cCB0byBtdWx0aXBsZSBvZiB3Y2hhcl90LCBjb252ZXJ0IHRvIG51bWJlciBvZiB3Y2hhcl90J3MsIGFuZCBhZGQgMS4gICovCisgIG4xID0gKChuYnl0ZXMgKyBzaXplb2Yod2NoYXJfdCkgLSAxKSAvIHNpemVvZiAod2NoYXJfdCkpICsgMTsKKyAgcmVzdWx0X3cgPSBtYWxsb2MgKG4xICogc2l6ZW9mICh3Y2hhcl90KSk7CisgIGlmICghcmVzdWx0X3cpCisgICAgeworICAgICAgUmVnQ2xvc2VLZXkgKGtleV9oYW5kbGUpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICBpZiAoUmVnUXVlcnlWYWx1ZUV4VyAoa2V5X2hhbmRsZSwgbmFtZSwgMCwgJnR5cGUsIChMUEJZVEUpIHJlc3VsdF93LCAmbmJ5dGVzKSkKKyAgICB7CisgICAgICBSZWdDbG9zZUtleSAoa2V5X2hhbmRsZSk7CisgICAgICBmcmVlIChyZXN1bHRfdyk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIFJlZ0Nsb3NlS2V5IChrZXlfaGFuZGxlKTsKKyAgcmVzdWx0X3dbbjEgLSAxXSA9IDA7IC8qIE1ha2Ugc3VyZSBpdCBpcyByZWFsbHkgYSBzdHJpbmcuICAqLworCisgIC8qIE5PVEU6IFJFR19NVUxUSV9TWiBhbmQgUkVHX0VYUEFORF9TWiBub3Qgc3VwcG9ydGVkLCBiZWNhdXNlIHRoZXkKKyAgICAgYXJlIG5vdCBuZWVkZWQgaW4gdGhpcyBtb2R1bGUuICAqLworICBpZiAodHlwZSAhPSBSRUdfU1opCisgICAgeworICAgICAgZnJlZSAocmVzdWx0X3cpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIGxlbiA9IFdpZGVDaGFyVG9NdWx0aUJ5dGUgKENQX1VURjgsIDAsIHJlc3VsdF93LCAtMSwgTlVMTCwgMCwgTlVMTCwgTlVMTCk7CisgIGlmIChsZW4gPCAwKQorICAgIHsKKyAgICAgIGZyZWUgKHJlc3VsdF93KTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICByZXN1bHQgPSBtYWxsb2MgKGxlbiArIDEpOworICBpZiAoIXJlc3VsdCkKKyAgICB7CisgICAgICBmcmVlIChyZXN1bHRfdyk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgbGVuID0gV2lkZUNoYXJUb011bHRpQnl0ZSAoQ1BfVVRGOCwgMCwgcmVzdWx0X3csIC0xLCByZXN1bHQsIGxlbiwgTlVMTCwgTlVMTCk7CisgIGZyZWUgKHJlc3VsdF93KTsKKyAgaWYgKGxlbiA8IDApCisgICAgeworICAgICAgZnJlZSAocmVzdWx0KTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworCisvKiBSZXR1cm4gYSBzdHJpbmcgZnJvbSB0aGUgVzMyIFJlZ2lzdHJ5IG9yIE5VTEwgaW4gY2FzZSBvZiBlcnJvci4KKyAgIENhbGxlciBtdXN0IHJlbGVhc2UgdGhlIHJldHVybiB2YWx1ZS4gIEEgTlVMTCBmb3Igcm9vdCBpcyBhbiBhbGlhcworICAgZm9yIEhLRVlfQ1VSUkVOVF9VU0VSLCBIS0VZX0xPQ0FMX01BQ0hJTkUgaW4gdHVybi4gKi8KK3N0YXRpYyBjaGFyICoKK3JlYWRfdzMyX3JlZ2lzdHJ5X3N0cmluZyAoY29uc3QgY2hhciAqcm9vdCwgY29uc3QgY2hhciAqZGlyLCBjb25zdCBjaGFyICpuYW1lKQoreworICBIS0VZIHJvb3Rfa2V5LCBrZXlfaGFuZGxlOworICBEV09SRCBuMSwgbmJ5dGVzLCB0eXBlOworICBjaGFyICpyZXN1bHQgPSBOVUxMOworCQorICBpZiAoICFyb290ICkKKyAgICByb290X2tleSA9IEhLRVlfQ1VSUkVOVF9VU0VSOworICBlbHNlIGlmICggIXN0cmNtcCggcm9vdCwgIkhLRVlfQ0xBU1NFU19ST09UIiApICkKKyAgICByb290X2tleSA9IEhLRVlfQ0xBU1NFU19ST09UOworICBlbHNlIGlmICggIXN0cmNtcCggcm9vdCwgIkhLRVlfQ1VSUkVOVF9VU0VSIiApICkKKyAgICByb290X2tleSA9IEhLRVlfQ1VSUkVOVF9VU0VSOworICBlbHNlIGlmICggIXN0cmNtcCggcm9vdCwgIkhLRVlfTE9DQUxfTUFDSElORSIgKSApCisgICAgcm9vdF9rZXkgPSBIS0VZX0xPQ0FMX01BQ0hJTkU7CisgIGVsc2UgaWYgKCAhc3RyY21wKCByb290LCAiSEtFWV9VU0VSUyIgKSApCisgICAgcm9vdF9rZXkgPSBIS0VZX1VTRVJTOworICBlbHNlCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaWYgKFJlZ09wZW5LZXlFeEEgKHJvb3Rfa2V5LCBkaXIsIDAsIEtFWV9SRUFELCAma2V5X2hhbmRsZSkpCisgICAgeworICAgICAgaWYgKHJvb3QpCisgICAgICAgIHJldHVybiBOVUxMOyAvKiBubyBuZWVkIGZvciBhIFJlZ0Nsb3NlLCBzbyByZXR1cm4gZGlyZWN0ICovCisgICAgICAvKiBJdCBzZWVtcyB0byBiZSBjb21tb24gcHJhY3Rpc2UgdG8gZmFsbCBiYWNrIHRvIEhLTE0uICovCisgICAgICBpZiAoUmVnT3BlbktleUV4QSAoSEtFWV9MT0NBTF9NQUNISU5FLCBkaXIsIDAsIEtFWV9SRUFELCAma2V5X2hhbmRsZSkpCisgICAgICAgIHJldHVybiBOVUxMOyAvKiBzdGlsbCBubyBuZWVkIGZvciBhIFJlZ0Nsb3NlLCBzbyByZXR1cm4gZGlyZWN0ICovCisgICAgfQorCisgIG5ieXRlcyA9IDE7CisgIGlmIChSZWdRdWVyeVZhbHVlRXhBIChrZXlfaGFuZGxlLCBuYW1lLCAwLCBOVUxMLCBOVUxMLCAmbmJ5dGVzKSkKKyAgICB7CisgICAgICBpZiAocm9vdCkKKyAgICAgICAgZ290byBvdXQ7CisgICAgICAvKiBUcnkgdG8gZmFsbGJhY2sgdG8gSEtMTSBhbHNvIGZvciBhIG1pc3NpbmcgdmFsdWUuICAqLworICAgICAgUmVnQ2xvc2VLZXkgKGtleV9oYW5kbGUpOworICAgICAgaWYgKFJlZ09wZW5LZXlFeEEgKEhLRVlfTE9DQUxfTUFDSElORSwgZGlyLCAwLCBLRVlfUkVBRCwgJmtleV9oYW5kbGUpKQorICAgICAgICByZXR1cm4gTlVMTDsgLyogTm9wZS4gICovCisgICAgICBpZiAoUmVnUXVlcnlWYWx1ZUV4QSAoa2V5X2hhbmRsZSwgbmFtZSwgMCwgTlVMTCwgTlVMTCwgJm5ieXRlcykpCisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgbjEgPSBuYnl0ZXMgKyAxOworICByZXN1bHQgPSBtYWxsb2MgKG4xKTsKKyAgaWYgKCFyZXN1bHQpCisgICAgZ290byBvdXQ7CisgIGlmIChSZWdRdWVyeVZhbHVlRXhBIChrZXlfaGFuZGxlLCBuYW1lLCAwLCAmdHlwZSwgcmVzdWx0LCAmbjEpKQorICAgIHsKKyAgICAgIGZyZWUocmVzdWx0KTsKKyAgICAgIHJlc3VsdCA9IE5VTEw7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisgIHJlc3VsdFtuYnl0ZXNdID0gMDsgLyogTWFrZSBzdXJlIGl0IGlzIHJlYWxseSBhIHN0cmluZy4gICovCisKKyBvdXQ6CisgIFJlZ0Nsb3NlS2V5IChrZXlfaGFuZGxlKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworCitzdGF0aWMgY2hhciAqCitmaW5kX2luc3RfZGlyICgpCit7CisgIHJldHVybiByZWFkX3czMl9yZWdpc3RyeV9zdHJpbmcgKCJIS0VZX0xPQ0FMX01BQ0hJTkUiLAorCQkJCSAgIlNvZnR3YXJlXFxmcmVlZGVza3RvcFxcREJ1cyIsCisJCQkJICAiSW5zdGFsbCBEaXJlY3RvcnkiKTsKK30KKworCitzdGF0aWMgY2hhciAqCitmaW5kX2Vudl9pbl9yZWdpc3RyeSAoY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgcmV0dXJuIHJlYWRfdzMyX3JlZ2lzdHJ5X3N0cmluZyAoIkhLRVlfTE9DQUxfTUFDSElORSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTb2Z0d2FyZVxcZnJlZWRlc2t0b3BcXERCdXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKK30KKworCitzdGF0aWMgY2hhciAqCitmaW5kX3Byb2dyYW1faW5faW5zdF9kaXIgKGNvbnN0IGNoYXIgKm5hbWUpCit7CisgIGNoYXIgKnJlc3VsdCA9IE5VTEw7CisgIGNoYXIgKnRtcDsKKworICB0bXAgPSBmaW5kX2luc3RfZGlyICgpOworICBpZiAoIXRtcCkKKyAgICByZXR1cm4gTlVMTDsKKworICByZXN1bHQgPSBtYWxsb2MgKHN0cmxlbiAodG1wKSArIDUgKyBzdHJsZW4gKG5hbWUpICsgMSk7CisgIGlmICghcmVzdWx0KQorICAgIHsKKyAgICAgIGZyZWUgKHRtcCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgc3RyY3B5IChzdHBjcHkgKHN0cGNweSAocmVzdWx0LCB0bXApLCAiXFxiaW5cXCIpLCBuYW1lKTsKKyAgZnJlZSAodG1wKTsKKworICByZXR1cm4gcmVzdWx0OworfQorCisKK3N0YXRpYyBjaGFyICoKK2ZpbmRfaW5zdF9zdWJkaXIgKGNvbnN0IGNoYXIgKm5hbWUpCit7CisgIGNoYXIgKnJlc3VsdCA9IE5VTEw7CisgIGNoYXIgKnRtcDsKKworICB0bXAgPSBmaW5kX2luc3RfZGlyICgpOworICBpZiAoIXRtcCkKKyAgICByZXR1cm4gTlVMTDsKKworICByZXN1bHQgPSBtYWxsb2MgKHN0cmxlbiAodG1wKSArIDEgKyBzdHJsZW4gKG5hbWUpICsgMSk7CisgIGlmICghcmVzdWx0KQorICAgIHsKKyAgICAgIGZyZWUgKHRtcCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgc3RyY3B5IChzdHBjcHkgKHN0cGNweSAocmVzdWx0LCB0bXApLCAiXFwiKSwgbmFtZSk7CisgIGZyZWUgKHRtcCk7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworCitzdGF0aWMgY2hhciAqCitmaW5kX215X2RvY3VtZW50c19mb2xkZXIgKCkKK3sKKyAgLyogT25lIGZvciBzYWZldHksIGp1c3QgaW4gY2FzZS4gICovCisgIGNoYXIgZGlyW01BWF9QQVRIICsgMV07CisgIGNoYXIgKnJlc3VsdDsKKworICBkaXJbMF0gPSAnXDAnOworICAvKiBNYXkgcmV0dXJuIGZhbHNlIGV2ZW4gaWYgc3VjY2Vzc2Z1bC4gICovCisgIFNIR2V0U3BlY2lhbEZvbGRlclBhdGhBICgwLCBkaXIsIENTSURMX1BFUlNPTkFMLCAwKTsKKyAgaWYgKGRpclswXSA9PSAnXDAnKQorICAgIHJldHVybiBOVUxMOworCisgIHJlc3VsdCA9IG1hbGxvYyAoc3RybGVuIChkaXIpICsgMSk7CisgIGlmICghcmVzdWx0KQorICAgIHJldHVybiBOVUxMOworICBzdHJjcHkgKHJlc3VsdCwgZGlyKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworCisjZGVmaW5lIE1BWF9FTlYgMzAKKworY2hhciAqZW52aXJvbltNQVhfRU5WICsgMV07CisKK2NoYXIgKgorZ2V0ZW52IChjb25zdCBjaGFyICpuYW1lKQoreworICBzdGF0aWMgY2hhciAqcGFzdF9yZXN1bHQ7CisgIGNoYXIgKiplbnZwOworICBpbnQgaWR4OworCisgIGlmIChwYXN0X3Jlc3VsdCkKKyAgICB7CisgICAgICBmcmVlIChwYXN0X3Jlc3VsdCk7CisgICAgICBwYXN0X3Jlc3VsdCA9IE5VTEw7CisgICAgfQorCisgIGlmICghIHN0cmNtcCAobmFtZSwgIkRCVVNfVkVSQk9TRSIpKQorICAgIHJldHVybiBwYXN0X3Jlc3VsdCA9IGdldF92ZXJib3NlX3NldHRpbmcgKCk7CisgIGVsc2UgaWYgKCEgc3RyY21wIChuYW1lLCAiSE9NRVBBVEgiKSkKKyAgICByZXR1cm4gcGFzdF9yZXN1bHQgPSBmaW5kX215X2RvY3VtZW50c19mb2xkZXIgKCk7CisgIGVsc2UgaWYgKCEgc3RyY21wIChuYW1lLCAiREJVU19EQVRBRElSIikpCisgICAgcmV0dXJuIHBhc3RfcmVzdWx0ID0gZmluZF9pbnN0X3N1YmRpciAoInNoYXJlIik7CisKKyAgZm9yIChlbnZwID0gZW52aXJvbjsgKmVudnAgIT0gMDsgZW52cCsrKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKnZhcnAgPSBuYW1lOworICAgICAgY2hhciAqZXAgPSAqZW52cDsKKyAgICAgIGludCBzYW1lX25hbWUgPSAwOworCisgICAgICB3aGlsZSAoKnZhcnAgPT0gKmVwICYmICp2YXJwICE9ICdcMCcpCisJeworCSAgKytlcDsKKwkgICsrdmFycDsKKwl9OworCisgICAgICBpZiAoKnZhcnAgPT0gJ1wwJyAmJiAqZXAgPT0gJz0nKQorCXJldHVybiBlcCArIDE7CisgICAgfQorCisgIHJldHVybiBOVUxMOworfQorCisKK2ludAorcHV0ZW52IChjaGFyICpzdHIpCit7CisgIGNoYXIgKiplbnZwOworICBpbnQgaWR4OworICBmb3IgKGVudnAgPSBlbnZpcm9uOyAqZW52cCAhPSAwOyBlbnZwKyspCisgICAgeworICAgICAgY2hhciAqdmFycCA9IHN0cjsKKyAgICAgIGNoYXIgKmVwID0gKmVudnA7CisgICAgICBpbnQgc2FtZV9uYW1lID0gMDsKKworICAgICAgd2hpbGUgKCp2YXJwID09ICplcCAmJiAqdmFycCAhPSAnXDAnKQorCXsKKwkgIGlmICgqdmFycCA9PSAnPScpCisJICAgIHNhbWVfbmFtZSA9IDE7CisJICArK2VwOworCSAgKyt2YXJwOworCX07CisKKyAgICAgIGlmICgqdmFycCA9PSAqZXAgJiYgKnZhcnAgPT0gJ1wwJykKKwlyZXR1cm4gMDsKKyAgICAgIGlmIChzYW1lX25hbWUpCisJeworCSAgKmVudnAgPSBzdHI7CisJICByZXR1cm4gMDsKKwl9CisgICAgfQorCisgIGlkeCA9IGVudnAgLSBlbnZpcm9uOworICBpZiAoaWR4ID4gTUFYX0VOVikKKyAgICB7CisgICAgICBfZGJ1c193aW5fc2V0X2Vycm5vIChFTk9NRU0pOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICBlbnZpcm9uW2lkeF0gPSBzdHI7CisgIHJldHVybiAwOworfQorCisKK2Nsb2NrX3QKK2Nsb2NrICh2b2lkKQoreworICByZXR1cm4gR2V0VGlja0NvdW50ICgpOworfQorCisKK3ZvaWQKK2Fib3J0ICh2b2lkKQoreworICAvKiBUaGlzIGlzIHdoYXQgd2luZG93cyBkb2VzLiAgKi8KKyAgZXhpdCAoMyk7Cit9CisKKwordm9pZAorR2V0U3lzdGVtVGltZUFzRmlsZVRpbWUgKExQRklMRVRJTUUgZnRwKQoreworICBTWVNURU1USU1FIHN0OworICBHZXRTeXN0ZW1UaW1lICgmc3QpOworICBTeXN0ZW1UaW1lVG9GaWxlVGltZSAoJnN0LCBmdHApOworfQorCisKK3Vuc2lnbmVkIGNoYXIqCitfbWJzcmNociAoY29uc3QgdW5zaWduZWQgY2hhciogc3RyLCB1bnNpZ25lZCBpbnQgY2gpCit7CisgIC8qIEZJWE1FLiAgVGhpcyBpcyBub3QgbXVsdGktYnl0ZSBzYWZlLiAgKi8KKyAgcmV0dXJuIHN0cnJjaHIgKHN0ciwgY2gpOworfQorCisKK0hBTkRMRSBPcGVuRmlsZU1hcHBpbmdBKERXT1JEIGR3RGVzaXJlZEFjY2VzcywKKwkJCUJPT0wgYkluaGVyaXRIYW5kbGUsCisJCQlMUENTVFIgbHBOYW1lKQoreworICBEV09SRCBmbFByb3RlY3QgPSAwOworICBIQU5ETEUgaE1hcHBpbmc7CisKKyAgaWYgKGR3RGVzaXJlZEFjY2VzcyAmIEZJTEVfTUFQX1JFQUQpCisgICAgZmxQcm90ZWN0IHw9IFBBR0VfUkVBRE9OTFk7CisKKyAgaWYgKGR3RGVzaXJlZEFjY2VzcyAmIEZJTEVfTUFQX1dSSVRFKQorICAgIGZsUHJvdGVjdCB8PSBQQUdFX1JFQURXUklURTsKKworICBTZXRMYXN0RXJyb3IgKDApOworICBoTWFwcGluZyA9IENyZWF0ZUZpbGVNYXBwaW5nQShJTlZBTElEX0hBTkRMRV9WQUxVRSwKKwkJCQlOVUxMLCBmbFByb3RlY3QsIDAsIDAsIGxwTmFtZSk7CisgIGlmIChoTWFwcGluZyAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSkKKyAgICB7CisgICAgICAvKiBKdXN0IGluIGNhc2UgV2luZG93cyBDRSBjaGFuZ2VzIGl0cyBiZWhhdmlvdXIsIHdlIGNoZWNrIGZvcgorICAgICAgICAgdGhlIHJpZ2h0IGVycm9yIHZhbHVlIGhlcmUuICAqLworICAgICAgaWYgKEdldExhc3RFcnJvciAoKSAhPSBFUlJPUl9BTFJFQURZX0VYSVNUUykKKyAgICAgICAgeworICAgICAgICAgIENsb3NlSGFuZGxlKGhNYXBwaW5nKTsKKyAgICAgICAgICBoTWFwcGluZyA9IElOVkFMSURfSEFORExFX1ZBTFVFOworICAgICAgICB9CisgICAgfQorICByZXR1cm4gaE1hcHBpbmc7Cit9CisKKworQk9PTAorTW92ZUZpbGVFeEEgKExQQ1NUUiBscEV4aXN0aW5nRmlsZU5hbWUsIExQQ1NUUiBscE5ld0ZpbGVOYW1lLCBEV09SRCBkd0ZsYWdzKQoreworICBfZGJ1c19hc3NlcnQgKGR3RmxhZ3MgPT0gTU9WRUZJTEVfUkVQTEFDRV9FWElTVElORyk7CisKKyAgaWYgKF9kYnVzX2ZpbGVfZXhpc3RzIChscE5ld0ZpbGVOYW1lKSkKKyAgICB7CisgICAgICBCT09MIHJlc3VsdCA9IERlbGV0ZUZpbGVBIChscE5ld0ZpbGVOYW1lKTsKKyAgICAgIGlmIChyZXN1bHQgPT0gMCkKKwlyZXR1cm4gRkFMU0U7CisgICAgfQorICByZXR1cm4gTW92ZUZpbGVBIChscEV4aXN0aW5nRmlsZU5hbWUsIGxwTmV3RmlsZU5hbWUpOworfQorCisKK0JPT0wKK1NldEhhbmRsZUluZm9ybWF0aW9uIChIQU5ETEUgaE9iamVjdCwgRFdPUkQgZHdNYXNrLCBEV09SRCBkd0ZsYWdzKQoreworICBfZGJ1c19hc3NlcnQgKGR3TWFzayA9PSAoSEFORExFX0ZMQUdfSU5IRVJJVCB8IEhBTkRMRV9GTEFHX1BST1RFQ1RfRlJPTV9DTE9TRSkpOworICBfZGJ1c19hc3NlcnQgKGR3RmxhZ3MgPT0gMCk7CisKKyAgLyogTm90IHN1cHBvcnRlZCBvbiBXaW5kb3dzIENFLCBhbmQgYWN0dWFsbHkgdGhlIGRlZmF1bHQuICBTbyBqdXN0CisgICAgIHJldHVybiBvdmVyd2hlbG1pbmcgc3VjY2Vzcy4gICovCisgIHJldHVybiAxOworfQorCisKK0RXT1JECitTZWFyY2hQYXRoQSAoTFBDU1RSIGxwUGF0aCwgTFBDU1RSIGxwRmlsZU5hbWUsIExQQ1NUUiBscEV4dGVuc2lvbiwKKyAgICAgICAgICAgICBEV09SRCBuQnVmZmVyTGVuZ3RoLCBMUFNUUiBscEJ1ZmZlciwgTFBTVFIqIGxwRmlsZVBhcnQpCit7CisgIGNoYXIgKmZpbGVuYW1lOworICBjaGFyICpmaWxlcGFydDsKKyAgaW50IGZpbGVuYW1lX2xlbjsKKyAgCisgIF9kYnVzX2Fzc2VydCAobHBQYXRoID09IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKGxwRXh0ZW5zaW9uID09IE5VTEwpOworICAKKyAgZmlsZW5hbWUgPSBmaW5kX3Byb2dyYW1faW5faW5zdF9kaXIgKGxwRmlsZU5hbWUpOworICBpZiAoIWZpbGVuYW1lKQorICAgIHsKKyAgICAgIFNldExhc3RFcnJvciAoRVJST1JfRklMRV9OT1RfRk9VTkQpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIGZpbGVuYW1lX2xlbiA9IHN0cmxlbiAoZmlsZW5hbWUpICsgMTsKKyAgaWYgKGZpbGVuYW1lX2xlbiA+IG5CdWZmZXJMZW5ndGgpCisgICAgeworICAgICAgZnJlZSAoZmlsZW5hbWUpOworICAgICAgcmV0dXJuIGZpbGVuYW1lX2xlbjsKKyAgICB9CisKKyAgc3RyY3B5IChscEJ1ZmZlciwgZmlsZW5hbWUpOworICBmcmVlIChmaWxlbmFtZSk7CisKKyAgZmlsZXBhcnQgPSBfbWJzcmNociAobHBCdWZmZXIsICdcXCcpOworICBpZiAoIWZpbGVwYXJ0KQorICAgIGZpbGVwYXJ0ID0gbHBCdWZmZXI7CisgICpscEZpbGVQYXJ0ID0gZmlsZXBhcnQ7CisKKyAgcmV0dXJuIGZpbGVuYW1lX2xlbiAtIDE7Cit9CisKKworLyoqIEdldHMgb3VyIFNJRAorICogQHBhcmFtIHNpZCBwb2ludHMgdG8gc2lkIGJ1ZmZlciwgbmVlZCB0byBiZSBmcmVlZCB3aXRoIExvY2FsRnJlZSgpCisgKiBAcmV0dXJucyBwcm9jZXNzIHNpZAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfZ2V0c2lkKGNoYXIgKipzaWQpCit7CisgIC8qIFRoZXJlIGlzIG5vdGhpbmcgbGlrZSB0aGlzIG9uIFdpbmRvd3MgQ0UsIHNvIHdlIGZha2UgaXQuICAqLworICBzdGF0aWMgY29uc3QgY2hhciBhc2lkW10gPSAiUy0xLTUtMjEtNTE1OTY3ODk5LTkyMDAyNjI2Ni0xNzA4NTM3NzY4LTEwMDAiOworICBjaGFyICpidWYgPSBMb2NhbEFsbG9jIChMTUVNX0ZJWEVELCBzaXplb2YgKGFzaWQpKTsKKyAgaWYgKCFidWYpCisgICAgeworICAgICAgX2RidXNfd2luX3dhcm5fd2luX2Vycm9yICgiTG9jYWxBbGxvYyBmYWlsZWQiLCBHZXRMYXN0RXJyb3IgKCkpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBtZW1jcHkgKGJ1ZiwgYXNpZCwgc2l6ZW9mIChhc2lkKSk7CisgICpzaWQgPSBidWY7CisgIHJldHVybiBUUlVFOworfQorCisKK0JPT0wKK0xvb2t1cEFjY291bnROYW1lVyAoTFBDV1NUUiBscFN5c3RlbU5hbWUsIExQQ1dTVFIgbHBBY2NvdW50TmFtZSwgUFNJRCBTaWQsIFBEV09SRCBjYlNpZCwKKyAgICAgICAgICAgICAgICAgICAgTFBXU1RSIFJlZmVyZW5jZWREb21haW5OYW1lLCBQRFdPUkQgY2NoUmVmZXJlbmNlZERvbWFpbk5hbWUsIFBTSURfTkFNRV9VU0UgcGVVc2UpCit7CisgIC8qIEN1cnJlbnRseSBub3QgbmVlZGVkLiAgKi8KKyAgcmV0dXJuIEZBTFNFOworfQorCisKK0JPT0wKK0lzVmFsaWRTaWQgKFBTSUQgcHNpZCkKK3sKKyAgLyogQ3VycmVudGx5IG5vdCBuZWVkZWQuICAqLworICByZXR1cm4gRkFMU0U7Cit9CisKKworSEFORExFCitDcmVhdGVGaWxlQSAoTFBDU1RSIGxwRmlsZU5hbWUsIERXT1JEIGR3RGVzaXJlZEFjY2VzcywgRFdPUkQgZHdTaGFyZWRNb2RlLAorCSAgICAgTFBTRUNVUklUWV9BVFRSSUJVVEVTIGxwU2VjdXJpdHlBdHRyaWJ1dGVzLAorCSAgICAgRFdPUkQgZHdDcmVhdGlvbkRpc3Bvc2l0aW9uLCBEV09SRCBkd0ZsYWdzQW5kQXR0cmlidXRlcywKKwkgICAgIEhBTkRMRSBoVGVtcGxhdGVGaWxlKQoreworICB3Y2hhcl90ICpmaWxlbmFtZTsKKyAgSEFORExFIHJlc3VsdDsKKyAgaW50IGVycjsKKworICBmaWxlbmFtZSA9IF9kYnVzX3dpbl91dGY4X3RvX3V0ZjE2IChscEZpbGVOYW1lLCBOVUxMKTsKKyAgaWYgKCFmaWxlbmFtZSkKKyAgICByZXR1cm4gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CisKKyAgcmVzdWx0ID0gQ3JlYXRlRmlsZVcgKGZpbGVuYW1lLCBkd0Rlc2lyZWRBY2Nlc3MsIGR3U2hhcmVkTW9kZSwKKwkJCWxwU2VjdXJpdHlBdHRyaWJ1dGVzLCBkd0NyZWF0aW9uRGlzcG9zaXRpb24sCisJCQlkd0ZsYWdzQW5kQXR0cmlidXRlcywgaFRlbXBsYXRlRmlsZSk7CisKKyAgZXJyID0gR2V0TGFzdEVycm9yICgpOworICBkYnVzX2ZyZWUgKGZpbGVuYW1lKTsKKyAgU2V0TGFzdEVycm9yIChlcnIpOworICByZXR1cm4gcmVzdWx0OworfQorCisKK0JPT0wKK0RlbGV0ZUZpbGVBIChMUENTVFIgbHBGaWxlTmFtZSkKK3sKKyAgd2NoYXJfdCAqZmlsZW5hbWU7CisgIEJPT0wgcmVzdWx0OworICBpbnQgZXJyOworCisgIGZpbGVuYW1lID0gX2RidXNfd2luX3V0ZjhfdG9fdXRmMTYgKGxwRmlsZU5hbWUsIE5VTEwpOworICBpZiAoIWZpbGVuYW1lKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXN1bHQgPSBEZWxldGVGaWxlVyAoZmlsZW5hbWUpOworCisgIGVyciA9IEdldExhc3RFcnJvciAoKTsKKyAgZGJ1c19mcmVlIChmaWxlbmFtZSk7CisgIFNldExhc3RFcnJvciAoZXJyKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworCitCT09MCitNb3ZlRmlsZUEgKExQQ1NUUiBscEV4aXN0aW5nRmlsZU5hbWUsIExQQ1NUUiBscE5ld0ZpbGVOYW1lKQoreworICB3Y2hhcl90ICpleGlzdGluZ19maWxlbmFtZTsKKyAgd2NoYXJfdCAqbmV3X2ZpbGVuYW1lOworICBCT09MIHJlc3VsdDsKKyAgaW50IGVycjsKKworICBleGlzdGluZ19maWxlbmFtZSA9IF9kYnVzX3dpbl91dGY4X3RvX3V0ZjE2IChscEV4aXN0aW5nRmlsZU5hbWUsIE5VTEwpOworICBpZiAoISBleGlzdGluZ19maWxlbmFtZSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgbmV3X2ZpbGVuYW1lID0gX2RidXNfd2luX3V0ZjhfdG9fdXRmMTYgKGxwTmV3RmlsZU5hbWUsIE5VTEwpOworICBpZiAoISBuZXdfZmlsZW5hbWUpCisgICAgeworICAgICAgZGJ1c19mcmVlIChleGlzdGluZ19maWxlbmFtZSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHJlc3VsdCA9IE1vdmVGaWxlVyAoZXhpc3RpbmdfZmlsZW5hbWUsIG5ld19maWxlbmFtZSk7CisKKyAgZXJyID0gR2V0TGFzdEVycm9yICgpOworICBkYnVzX2ZyZWUgKGV4aXN0aW5nX2ZpbGVuYW1lKTsKKyAgZGJ1c19mcmVlIChuZXdfZmlsZW5hbWUpOworICBTZXRMYXN0RXJyb3IgKGVycik7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKworRFdPUkQKK0dldEZpbGVBdHRyaWJ1dGVzQShMUENTVFIgbHBGaWxlTmFtZSkKK3sKKyAgd2NoYXJfdCAqZmlsZW5hbWU7CisgIERXT1JEIHJlc3VsdDsKKyAgaW50IGVycjsKKworICBmaWxlbmFtZSA9IF9kYnVzX3dpbl91dGY4X3RvX3V0ZjE2IChscEZpbGVOYW1lLCBOVUxMKTsKKyAgaWYgKCFmaWxlbmFtZSkKKyAgICByZXR1cm4gSU5WQUxJRF9GSUxFX0FUVFJJQlVURVM7CisKKyAgcmVzdWx0ID0gR2V0RmlsZUF0dHJpYnV0ZXNXIChmaWxlbmFtZSk7CisKKyAgZXJyID0gR2V0TGFzdEVycm9yICgpOworICBkYnVzX2ZyZWUgKGZpbGVuYW1lKTsKKyAgU2V0TGFzdEVycm9yIChlcnIpOworICByZXR1cm4gcmVzdWx0OworfQorCisKK0JPT0wKK0dldEZpbGVBdHRyaWJ1dGVzRXhBIChMUENTVFIgbHBGaWxlTmFtZSwgR0VUX0ZJTEVFWF9JTkZPX0xFVkVMUyBmSW5mb0xldmVsSWQsCisgICAgICAgICAgICAgICAgICAgICAgUFZPSUQgbHBGaWxlSW5mb3JtYXRpb24pCit7CisgIHdjaGFyX3QgKmZpbGVuYW1lOworICBEV09SRCByZXN1bHQ7CisgIGludCBlcnI7CisKKyAgZmlsZW5hbWUgPSBfZGJ1c193aW5fdXRmOF90b191dGYxNiAobHBGaWxlTmFtZSwgTlVMTCk7CisgIGlmICghZmlsZW5hbWUpCisgICAgcmV0dXJuIElOVkFMSURfRklMRV9BVFRSSUJVVEVTOworCisgIHJlc3VsdCA9IEdldEZpbGVBdHRyaWJ1dGVzRXhXIChmaWxlbmFtZSwgZkluZm9MZXZlbElkLCBscEZpbGVJbmZvcm1hdGlvbik7CisKKyAgZXJyID0gR2V0TGFzdEVycm9yICgpOworICBkYnVzX2ZyZWUgKGZpbGVuYW1lKTsKKyAgU2V0TGFzdEVycm9yIChlcnIpOworICByZXR1cm4gcmVzdWx0OworfQorCisKK0hBTkRMRQorQ3JlYXRlRmlsZU1hcHBpbmdBIChIQU5ETEUgaEZpbGUsIExQU0VDVVJJVFlfQVRUUklCVVRFUyBscEF0dHJpYnV0ZXMsCisJCSAgICBEV09SRCBmbFByb3RlY3QsIERXT1JEIGR3TWF4aW11bVNpemVIaWdoLAorCQkgICAgRFdPUkQgZHdNYXhpbXVtU2l6ZUxvdywgTFBDU1RSIGxwTmFtZSkKK3sKKyAgd2NoYXJfdCAqbmFtZTsKKyAgSEFORExFIHJlc3VsdDsKKyAgaW50IGVycjsKKworICBpZiAobHBOYW1lKQorICAgIHsKKyAgICAgIG5hbWUgPSBfZGJ1c193aW5fdXRmOF90b191dGYxNiAobHBOYW1lLCBOVUxMKTsKKyAgICAgIGlmICghbmFtZSkKKwlyZXR1cm4gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CisgICAgfQorICBlbHNlCisgICAgbmFtZSA9IE5VTEw7CisKKyAgcmVzdWx0ID0gQ3JlYXRlRmlsZU1hcHBpbmdXIChoRmlsZSwgbHBBdHRyaWJ1dGVzLCBmbFByb3RlY3QsCisJCQkgICAgICAgZHdNYXhpbXVtU2l6ZUhpZ2gsIGR3TWF4aW11bVNpemVMb3csCisJCQkgICAgICAgbmFtZSk7CisKKyAgZXJyID0gR2V0TGFzdEVycm9yICgpOworICBkYnVzX2ZyZWUgKG5hbWUpOworICBTZXRMYXN0RXJyb3IgKGVycik7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKworQk9PTAorQ3JlYXRlRGlyZWN0b3J5QSAoTFBDU1RSIGxwUGF0aE5hbWUsIExQU0VDVVJJVFlfQVRUUklCVVRFUyBscFNlY3VyaXR5QXR0cmlidXRlcykKK3sKKyAgd2NoYXJfdCAqcGF0aG5hbWU7CisgIEJPT0wgcmVzdWx0OworICBpbnQgZXJyOworCisgIHBhdGhuYW1lID0gX2RidXNfd2luX3V0ZjhfdG9fdXRmMTYgKGxwUGF0aE5hbWUsIE5VTEwpOworICBpZiAoIXBhdGhuYW1lKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXN1bHQgPSBDcmVhdGVEaXJlY3RvcnlXIChwYXRobmFtZSwgbHBTZWN1cml0eUF0dHJpYnV0ZXMpOworCisgIGVyciA9IEdldExhc3RFcnJvciAoKTsKKyAgZGJ1c19mcmVlIChwYXRobmFtZSk7CisgIFNldExhc3RFcnJvciAoZXJyKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworCitCT09MCitSZW1vdmVEaXJlY3RvcnlBIChMUENTVFIgbHBQYXRoTmFtZSkKK3sKKyAgd2NoYXJfdCAqcGF0aG5hbWU7CisgIEJPT0wgcmVzdWx0OworICBpbnQgZXJyOworCisgIHBhdGhuYW1lID0gX2RidXNfd2luX3V0ZjhfdG9fdXRmMTYgKGxwUGF0aE5hbWUsIE5VTEwpOworICBpZiAoIXBhdGhuYW1lKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXN1bHQgPSBSZW1vdmVEaXJlY3RvcnlXIChwYXRobmFtZSk7CisKKyAgZXJyID0gR2V0TGFzdEVycm9yICgpOworICBkYnVzX2ZyZWUgKHBhdGhuYW1lKTsKKyAgU2V0TGFzdEVycm9yIChlcnIpOworICByZXR1cm4gcmVzdWx0OworfQorCisKK3N0YXRpYyBCT09MCitjb252ZXJ0X2ZpbmRfZGF0YSAoTFBXSU4zMl9GSU5EX0RBVEFXIGZkdywgTFBXSU4zMl9GSU5EX0RBVEFBIGZkYSkKK3sKKyAgY2hhciAqZmlsZW5hbWU7CisgIGludCBsZW47CisKKyAgZmRhLT5kd0ZpbGVBdHRyaWJ1dGVzID0gZmR3LT5kd0ZpbGVBdHRyaWJ1dGVzOworICBmZGEtPmZ0Q3JlYXRpb25UaW1lID0gZmR3LT5mdENyZWF0aW9uVGltZTsKKyAgZmRhLT5mdExhc3RBY2Nlc3NUaW1lID0gZmR3LT5mdExhc3RBY2Nlc3NUaW1lOworICBmZGEtPmZ0TGFzdFdyaXRlVGltZSA9IGZkdy0+ZnRMYXN0V3JpdGVUaW1lOworICBmZGEtPm5GaWxlU2l6ZUhpZ2ggPSBmZHctPm5GaWxlU2l6ZUhpZ2g7CisgIGZkYS0+bkZpbGVTaXplTG93ID0gZmR3LT5uRmlsZVNpemVMb3c7CisKKyAgZmlsZW5hbWUgPSBfZGJ1c193aW5fdXRmMTZfdG9fdXRmOCAoZmR3LT5jRmlsZU5hbWUsIE5VTEwpOworICBpZiAoIWZpbGVuYW1lKQorICAgIHJldHVybiBGQUxTRTsKKworICBsZW4gPSBzaXplb2YgKGZkYS0+Y0ZpbGVOYW1lKTsKKyAgc3RybmNweSAoZmRhLT5jRmlsZU5hbWUsIGZpbGVuYW1lLCBsZW4pOworICBmZGEtPmNGaWxlTmFtZVtsZW4gLSAxXSA9ICdcMCc7CisgIAorICByZXR1cm4gVFJVRTsKK30KKworCitIQU5ETEUKK0ZpbmRGaXJzdEZpbGVBIChMUENTVFIgbHBGaWxlTmFtZSwgTFBXSU4zMl9GSU5EX0RBVEFBIGxwRmluZEZpbGVEYXRhKQoreworICB3Y2hhcl90ICpwYXRobmFtZTsKKyAgV0lOMzJfRklORF9EQVRBVyBmaW5kX2ZpbGVfZGF0YTsKKyAgSEFORExFIHJlc3VsdDsKKyAgaW50IGVycjsKKworICBwYXRobmFtZSA9IF9kYnVzX3dpbl91dGY4X3RvX3V0ZjE2IChscEZpbGVOYW1lLCBOVUxMKTsKKyAgaWYgKCFwYXRobmFtZSkKKyAgICByZXR1cm4gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CisKKyAgcmVzdWx0ID0gRmluZEZpcnN0RmlsZVcgKHBhdGhuYW1lLCAmZmluZF9maWxlX2RhdGEpOworICBpZiAocmVzdWx0ICE9IElOVkFMSURfSEFORExFX1ZBTFVFKQorICAgIHsKKyAgICAgIEJPT0wgcmVzID0gY29udmVydF9maW5kX2RhdGEgKCZmaW5kX2ZpbGVfZGF0YSwgbHBGaW5kRmlsZURhdGEpOworICAgICAgaWYgKCEgcmVzKQorICAgICAgICB7CisgICAgICAgICAgZXJyID0gR2V0TGFzdEVycm9yICgpOworICAgICAgICAgIEZpbmRDbG9zZSAocmVzdWx0KTsKKyAgICAgICAgICBTZXRMYXN0RXJyb3IgKGVycik7CisgICAgICAgICAgcmVzdWx0ID0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CisgICAgICAgIH0KKyAgICB9CisKKyAgZXJyID0gR2V0TGFzdEVycm9yICgpOworICBkYnVzX2ZyZWUgKHBhdGhuYW1lKTsKKyAgU2V0TGFzdEVycm9yIChlcnIpOworICByZXR1cm4gcmVzdWx0OworfQorCisKK0JPT0wKK0ZpbmROZXh0RmlsZUEgKEhBTkRMRSBoRmluZEZpbGUsIExQV0lOMzJfRklORF9EQVRBQSBscEZpbmRGaWxlRGF0YSkKK3sKKyAgV0lOMzJfRklORF9EQVRBVyBmaW5kX2ZpbGVfZGF0YTsKKyAgQk9PTCByZXN1bHQ7CisgIGludCBlcnI7CisKKyAgcmVzdWx0ID0gRmluZE5leHRGaWxlVyAoaEZpbmRGaWxlLCAmZmluZF9maWxlX2RhdGEpOworICBpZiAocmVzdWx0KQorICAgIHJlc3VsdCA9IGNvbnZlcnRfZmluZF9kYXRhICgmZmluZF9maWxlX2RhdGEsIGxwRmluZEZpbGVEYXRhKTsKKworICByZXR1cm4gcmVzdWx0OyAgCit9CisKKworSEFORExFCitDcmVhdGVNdXRleEEgKExQU0VDVVJJVFlfQVRUUklCVVRFUyBscE11dGV4QXR0cmlidXRlcywgQk9PTCBiSW5pdGlhbE93bmVyLAorCSAgICAgIExQQ1NUUiBscE5hbWUpCit7CisgIHdjaGFyX3QgKm5hbWU7CisgIEhBTkRMRSByZXN1bHQ7CisgIGludCBlcnI7CisKKyAgaWYgKGxwTmFtZSkKKyAgICB7CisgICAgICBuYW1lID0gX2RidXNfd2luX3V0ZjhfdG9fdXRmMTYgKGxwTmFtZSwgTlVMTCk7CisgICAgICBpZiAoIW5hbWUpCisJcmV0dXJuIElOVkFMSURfSEFORExFX1ZBTFVFOworICAgIH0KKyAgZWxzZQorICAgIG5hbWUgPSBOVUxMOworCisgIHJlc3VsdCA9IENyZWF0ZU11dGV4VyAobHBNdXRleEF0dHJpYnV0ZXMsIGJJbml0aWFsT3duZXIsIG5hbWUpOworCisgIGVyciA9IEdldExhc3RFcnJvciAoKTsKKyAgZGJ1c19mcmVlIChuYW1lKTsKKyAgU2V0TGFzdEVycm9yIChlcnIpOworICByZXR1cm4gcmVzdWx0OworfQorCisKK0JPT0wKK0NyZWF0ZVByb2Nlc3NBIChMUENTVFIgcHN6SW1hZ2VOYW1lLCBMUFNUUiBwc3pDbWRMaW5lLAorICAgICAgICAgICAgICAgIExQU0VDVVJJVFlfQVRUUklCVVRFUyBwc2FQcm9jZXNzLAorICAgICAgICAgICAgICAgIExQU0VDVVJJVFlfQVRUUklCVVRFUyBwc2FUaHJlYWQsIEJPT0wgZkluaGVyaXRIYW5kbGVzLAorICAgICAgICAgICAgICAgIERXT1JEIGZkd0NyZWF0ZSwgUFZPSUQgcHZFbnZpcm9ubWVudCwgTFBDU1RSIHBzekN1ckRpciwKKyAgICAgICAgICAgICAgICBMUFNUQVJUVVBJTkZPQSBwc2lTdGFydEluZm8sCisgICAgICAgICAgICAgICAgTFBQUk9DRVNTX0lORk9STUFUSU9OIHBQcm9jSW5mbykKK3sKKyAgd2NoYXJfdCAqaW1hZ2VfbmFtZSA9IE5VTEw7CisgIHdjaGFyX3QgKmNtZF9saW5lID0gTlVMTDsKKyAgQk9PTCByZXN1bHQ7CisgIGludCBlcnI7CisKKyAgX2RidXNfYXNzZXJ0IChwc2FQcm9jZXNzID09IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKHBzYVRocmVhZCA9PSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0IChmSW5oZXJpdEhhbmRsZXMgPT0gRkFMU0UpOworICBfZGJ1c19hc3NlcnQgKHB2RW52aXJvbm1lbnQgPT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAocHN6Q3VyRGlyID09IE5VTEwpOworICAvKiBwc2lTdGFydEluZm8gaXMgZ2VuZXJhbGx5IG5vdCBOVUxMLiAgKi8KKworICBpZiAocHN6SW1hZ2VOYW1lKQorICAgIHsKKyAgICAgIGltYWdlX25hbWUgPSBfZGJ1c193aW5fdXRmOF90b191dGYxNiAocHN6SW1hZ2VOYW1lLCBOVUxMKTsKKyAgICAgIGlmICghaW1hZ2VfbmFtZSkKKwlyZXR1cm4gMDsKKyAgICB9CisgIGlmIChwc3pDbWRMaW5lKQorICAgIHsKKyAgICAgIGNtZF9saW5lID0gX2RidXNfd2luX3V0ZjhfdG9fdXRmMTYgKHBzekNtZExpbmUsIE5VTEwpOworICAgICAgaWYgKCFjbWRfbGluZSkKKyAgICAgICAgeworICAgICAgICAgIGlmIChpbWFnZV9uYW1lKQorICAgICAgICAgICAgZGJ1c19mcmVlIChpbWFnZV9uYW1lKTsKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworICByZXN1bHQgPSBDcmVhdGVQcm9jZXNzVyAoaW1hZ2VfbmFtZSwgY21kX2xpbmUsIE5VTEwsIE5VTEwsIEZBTFNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmR3Q3JlYXRlLCBOVUxMLCBOVUxMLCBOVUxMLCBwUHJvY0luZm8pOworCisgIGVyciA9IEdldExhc3RFcnJvciAoKTsKKyAgZGJ1c19mcmVlIChpbWFnZV9uYW1lKTsKKyAgZGJ1c19mcmVlIChjbWRfbGluZSk7CisgIFNldExhc3RFcnJvciAoZXJyKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworCitMT05HCitSZWdPcGVuS2V5RXhBIChIS0VZIGhLZXksIExQQ1NUUiBscFN1YktleSwgRFdPUkQgdWxPcHRpb25zLAorICAgICAgICAgICAgICAgUkVHU0FNIHNhbURlc2lyZWQsIFBIS0VZIHBoa1Jlc3VsdCkKK3sKKyAgd2NoYXJfdCAqc3Via2V5OworICBMT05HIHJlc3VsdDsKKyAgaW50IGVycjsKKworICBpZiAobHBTdWJLZXkpCisgICAgeworICAgICAgc3Via2V5ID0gX2RidXNfd2luX3V0ZjhfdG9fdXRmMTYgKGxwU3ViS2V5LCBOVUxMKTsKKyAgICAgIGlmICghc3Via2V5KQorCXJldHVybiAwOworICAgIH0KKyAgZWxzZQorICAgIHN1YmtleSA9IE5VTEw7CisKKyAgcmVzdWx0ID0gUmVnT3BlbktleUV4IChoS2V5LCBzdWJrZXksIHVsT3B0aW9ucywgc2FtRGVzaXJlZCwgcGhrUmVzdWx0KTsKKworICBlcnIgPSBHZXRMYXN0RXJyb3IgKCk7CisgIGRidXNfZnJlZSAoc3Via2V5KTsKKyAgU2V0TGFzdEVycm9yIChlcnIpOworICByZXR1cm4gcmVzdWx0OworfQorCisKK0xPTkcKK1JlZ1F1ZXJ5VmFsdWVFeEEgKEhLRVkgaEtleSwgTFBDU1RSIGxwVmFsdWVOYW1lLCBMUERXT1JEIGxwUmVzZXJ2ZWQsCisgICAgICAgICAgICAgICAgICBMUERXT1JEIGxwVHlwZSwgTFBCWVRFIGxwRGF0YSwgTFBEV09SRCBscGNiRGF0YSkKK3sKKyAgd2NoYXJfdCAqbmFtZTsKKyAgTE9ORyBlcnI7CisgIEJZVEUgKmRhdGE7CisgIERXT1JEIGRhdGFfbGVuOworICBEV09SRCB0eXBlOworCisgIGlmIChscFZhbHVlTmFtZSkKKyAgICB7CisgICAgICBuYW1lID0gX2RidXNfd2luX3V0ZjhfdG9fdXRmMTYgKGxwVmFsdWVOYW1lLCBOVUxMKTsKKyAgICAgIGlmICghbmFtZSkKKwlyZXR1cm4gR2V0TGFzdEVycm9yICgpOworICAgIH0KKyAgZWxzZQorICAgIG5hbWUgPSBOVUxMOworCisgIGRhdGFfbGVuID0gMDsKKyAgZXJyID0gUmVnUXVlcnlWYWx1ZUV4VyAoaEtleSwgbmFtZSwgbHBSZXNlcnZlZCwgbHBUeXBlLCBOVUxMLCAmZGF0YV9sZW4pOworICBpZiAoZXJyIHx8ICFscGNiRGF0YSkKKyAgICB7CisgICAgICBkYnVzX2ZyZWUgKG5hbWUpOworICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgZGF0YSA9IG1hbGxvYyAoZGF0YV9sZW4gKyBzaXplb2YgKHdjaGFyX3QpKTsKKyAgaWYgKCFkYXRhKQorICAgIHsKKyAgICAgIGRidXNfZnJlZSAobmFtZSk7CisgICAgICByZXR1cm4gRVJST1JfTk9UX0VOT1VHSF9NRU1PUlk7CisgICAgfQorICAKKyAgZXJyID0gUmVnUXVlcnlWYWx1ZUV4VyAoaEtleSwgbmFtZSwgbHBSZXNlcnZlZCwgJnR5cGUsIGRhdGEsICZkYXRhX2xlbik7CisgIGlmIChscFR5cGUpCisgICAgKmxwVHlwZSA9IHR5cGU7CisgIGRidXNfZnJlZSAobmFtZSk7CisgIC8qIElmIGVyciBpcyBFUlJPUl9NT1JFX0RBVEEsIHRoZXJlIHByb2JhYmx5IHdhcyBhIHJhY2UgY29uZGl0aW9uLgorICAgICBXZSBjYW4gcHVudCB0aGlzIHRvIHRoZSBjYWxsZXIganVzdCBhcyB3ZWxsLiAgKi8KKyAgaWYgKGVycikKKyAgICB7CisgICAgICBmcmVlIChkYXRhKTsKKyAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgIC8qIE5PVEU6IFJFR19NVUxUSV9TWiBhbmQgUkVHX0VYUEFORF9TWiBub3Qgc3VwcG9ydGVkLCBiZWNhdXNlIHRoZXkKKyAgICAgYXJlIG5vdCBuZWVkZWQgaW4gdGhpcyBtb2R1bGUuICAqLworICBpZiAodHlwZSA9PSBSRUdfU1opCisgICAgeworICAgICAgY2hhciAqZGF0YV9jOworICAgICAgaW50IGRhdGFfY19sZW47CisKKyAgICAgIC8qIFRoaXMgaXMgdmFsaWQgc2luY2Ugd2UgYWxsb2NhdGVkIG9uZSBtb3JlIGFib3ZlLiAgKi8KKyAgICAgIGRhdGFbZGF0YV9sZW5dID0gJ1wwJzsKKyAgICAgIGRhdGFbZGF0YV9sZW4gKyAxXSA9ICdcMCc7CisKKyAgICAgIC8qIFRoZSBjYXN0IGlzIHZhbGlkIGJlY2F1c2UgbWFsbG9jIGd1YXJhbnRlZXMgYWxpZ25tZW50IG9mCisgICAgICAgICBiYXNpYyB0eXBlcy4gICovCisgICAgICBkYXRhX2MgPSBfZGJ1c193aW5fdXRmMTZfdG9fdXRmOCAoKHdjaGFyX3QqKSBkYXRhLCBOVUxMKTsKKyAgICAgIGlmICghZGF0YV9jKQorICAgICAgICB7CisgICAgICAgICAgZnJlZSAoZGF0YSk7CisgICAgICAgICAgcmV0dXJuIEdldExhc3RFcnJvcigpOworICAgICAgICB9CisKKyAgICAgIGRhdGFfY19sZW4gPSBzdHJsZW4gKGRhdGFfYykgKyAxOworICAgICAgX2RidXNfYXNzZXJ0IChkYXRhX2NfbGVuIDw9IGRhdGFfbGVuICsgc2l6ZW9mICh3Y2hhcl90KSk7CisgICAgICBtZW1jcHkgKGRhdGEsIGRhdGFfYywgZGF0YV9jX2xlbik7CisgICAgICBkYXRhX2xlbiA9IGRhdGFfY19sZW47CisgICAgICBkYnVzX2ZyZWUgKGRhdGFfYyk7CisgICAgfQorCisgIC8qIERBVEEgYW5kIERBVEFfTEVOIG5vdyBjb250YWluIHRoZSByZXN1bHQuICAqLworICBpZiAobHBEYXRhKQorICAgIHsKKyAgICAgIGlmIChkYXRhX2xlbiA+ICpscGNiRGF0YSkKKyAgICAgICAgZXJyID0gRVJST1JfTU9SRV9EQVRBOworICAgICAgZWxzZQorICAgICAgICBtZW1jcHkgKGxwRGF0YSwgZGF0YSwgZGF0YV9sZW4pOworICAgIH0KKyAgZnJlZSAoZGF0YSk7CisgICpscGNiRGF0YSA9IGRhdGFfbGVuOworICByZXR1cm4gZXJyOworfQorCisKK0RXT1JECitGb3JtYXRNZXNzYWdlQSAoRFdPUkQgZHdGbGFncywgUENWT0lEIGxwU291cmNlLCBEV09SRCBkd01lc3NhZ2VJZCwKKwkJRFdPUkQgZHdMYW5ndWFnZUlkLCBMUFNUUiBscEJ1ZmZlciwgRFdPUkQgblNpemUsCisJCXZhX2xpc3QqIEFyZ3VtZW50cykKK3sKKyAgTFBXU1RSIGJ1ZmZlcl93ID0gTlVMTDsKKyAgTFBTVFIgYnVmZmVyX2M7CisgIERXT1JEIGxlbjsKKyAgY2hhciAqYnVmZmVyX25ldzsKKyAgRFdPUkQgYnVmZmVyX25ld19sZW47CisgIEJPT0wgYnVmZmVyX3dfZnJlZTsKKworICBsZW4gPSBGb3JtYXRNZXNzYWdlVyAoZHdGbGFncyB8IEZPUk1BVF9NRVNTQUdFX0FMTE9DQVRFX0JVRkZFUiwKKwkJCWxwU291cmNlLCBkd01lc3NhZ2VJZCwgZHdMYW5ndWFnZUlkLAorCQkJKExQV1NUUikgJmJ1ZmZlcl93LCAwLCBBcmd1bWVudHMpOworICBpZiAobGVuID09IDApCisgICAgcmV0dXJuIDA7CisKKyAgYnVmZmVyX2MgPSBfZGJ1c193aW5fdXRmMTZfdG9fdXRmOCAoYnVmZmVyX3csIE5VTEwpOworICBpZiAoISBidWZmZXJfYykKKyAgICB7CisgICAgICBMb2NhbEZyZWUgKGJ1ZmZlcl93KTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICBpZiAoZHdGbGFncyAmIEZPUk1BVF9NRVNTQUdFX0FMTE9DQVRFX0JVRkZFUikKKyAgICB7CisgICAgICAvKiBXZSBuZWVkIHRvIHJldHVybiBhIGJ1ZmZlciB0aGF0J3MgZnJlZWFibGUgd2l0aCBMb2NhbEZyZWUuICAqLworICAgICAgYnVmZmVyX25ldyA9IChjaGFyICopIGJ1ZmZlcl93OworICAgICAgYnVmZmVyX25ld19sZW4gPSBzaXplb2YgKHdjaGFyX3QpICogKGxlbiArIDEpOworICAgICAgYnVmZmVyX3dfZnJlZSA9IEZBTFNFOworICAgICAgLyogQXZvaWQgYWxpZ25tZW50IGlzc3VlIGJ5IHVzaW5nIG1lbWNweS4gICovCisgICAgICBtZW1jcHkgKGxwQnVmZmVyLCAmYnVmZmVyX25ldywgc2l6ZW9mIChidWZmZXJfbmV3KSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgYnVmZmVyX25ldyA9IGxwQnVmZmVyOworICAgICAgYnVmZmVyX25ld19sZW4gPSBuU2l6ZTsKKyAgICAgIGJ1ZmZlcl93X2ZyZWUgPSBUUlVFOworICAgIH0KKworICBzdHJuY3B5IChidWZmZXJfbmV3LCBidWZmZXJfYywgYnVmZmVyX25ld19sZW4pOworICBkYnVzX2ZyZWUgKGJ1ZmZlcl9jKTsKKyAgYnVmZmVyX25ld1tidWZmZXJfbmV3X2xlbiAtIDFdID0gJ1wwJzsKKyAgaWYgKGJ1ZmZlcl93X2ZyZWUpCisgICAgTG9jYWxGcmVlIChidWZmZXJfdyk7CisKKyAgLyogc3RybGVuIGlzIGNvcnJlY3QgKG5vdCBfbWJzdHJsZW4pLCBiZWNhdXNlIHdlIHdhbnQgc3RvcmFnZSBhbmQKKyAgICAgbm90IHN0cmluZyBsZW5ndGguICAqLworICByZXR1cm4gc3RybGVuIChidWZmZXJfbmV3KTsKK30KKworCitEV09SRAorR2V0TW9kdWxlRmlsZU5hbWVBIChISU5TVEFOQ0UgaE1vZHVsZSwgTFBTVFIgbHBGaWxlbmFtZSwgRFdPUkQgblNpemUpCit7CisgIHdjaGFyX3QgKmZpbGVuYW1lX3c7CisgIGNoYXIgKmZpbGVuYW1lX2M7CisgIERXT1JEIGxlbjsKKworICBpZiAoblNpemUgPT0gMCkKKyAgICB7CisgICAgICAvKiBXaW5kb3dzIFhQLzIwMDAuICAqLworICAgICAgU2V0TGFzdEVycm9yICgwKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICBmaWxlbmFtZV93ID0gbWFsbG9jIChzaXplb2YgKHdjaGFyX3QpICogblNpemUpOworICBpZiAoISBmaWxlbmFtZV93KQorICAgIHJldHVybiAwOworCisgIGxlbiA9IEdldE1vZHVsZUZpbGVOYW1lVyAoaE1vZHVsZSwgZmlsZW5hbWVfdywgblNpemUpOworICBpZiAobGVuID09IDApCisgICAgeworICAgICAgLyogTm90ZTogSWYgd2UgZmFpbCB3aXRoIEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIsIHRoaXMgaXMgc3RpbGwKKyAgICAgICAoYXBwcm94aW1hdGVseSkgY29ycmVjdC4gICovCisgICAgICBmcmVlIChmaWxlbmFtZV93KTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICBmaWxlbmFtZV93W25TaXplIC0gMV0gPSAnXDAnOworICBmaWxlbmFtZV9jID0gX2RidXNfd2luX3V0ZjE2X3RvX3V0ZjggKGZpbGVuYW1lX3csIE5VTEwpOworICBmcmVlIChmaWxlbmFtZV93KTsKKyAgaWYgKCEgZmlsZW5hbWVfYykKKyAgICByZXR1cm4gMDsKKworICBzdHJuY3B5IChscEZpbGVuYW1lLCBmaWxlbmFtZV9jLCBuU2l6ZSk7CisgIGRidXNfZnJlZSAoZmlsZW5hbWVfYyk7CisgIGxwRmlsZW5hbWVbblNpemUgLSAxXSA9ICdcMCc7CisgIC8qIHN0cmxlbiBpcyBjb3JyZWN0IChub3QgX21ic3RybGVuKSwgYmVjYXVzZSB3ZSB3YW50IHN0b3JhZ2UgYW5kCisgICAgIG5vdCBzdHJpbmcgbGVuZ3RoLiAgKi8KKyAgcmV0dXJuIHN0cmxlbiAobHBGaWxlbmFtZSk7Cit9CisKKworRFdPUkQKK0dldFRlbXBQYXRoQSAoRFdPUkQgbkJ1ZmZlckxlbmd0aCwgTFBTVFIgbHBCdWZmZXIpCit7CisgIHdjaGFyX3QgZHVtbXlbMV07CisgIERXT1JEIGxlbjsKKworICBsZW4gPSBHZXRUZW1wUGF0aFcgKDAsIGR1bW15KTsKKyAgaWYgKGxlbiA9PSAwKQorICAgIHJldHVybiAwOworCisgIF9kYnVzX2Fzc2VydCAobGVuIDw9IE1BWF9QQVRIKTsKKworICAvKiBCZXR0ZXIgYmUgc2FmZSB0aGFuIHNvcnJ5LiAgTVNETiBkb2Vzbid0IHNheSBpZiBsZW4gaXMgd2l0aCBvcgorICAgICB3aXRob3V0IHRlcm1pbmF0aW5nIDAuICAqLworICBsZW4rKzsKKworICB7CisgICAgd2NoYXJfdCAqYnVmZmVyX3c7CisgICAgRFdPUkQgbGVuX3c7CisgICAgY2hhciAqYnVmZmVyX2M7CisgICAgRFdPUkQgbGVuX2M7CisKKyAgICBidWZmZXJfdyA9IG1hbGxvYyAoc2l6ZW9mICh3Y2hhcl90KSAqIGxlbik7CisgICAgaWYgKCEgYnVmZmVyX3cpCisgICAgICByZXR1cm4gMDsKKworICAgIGxlbl93ID0gR2V0VGVtcFBhdGhXIChsZW4sIGJ1ZmZlcl93KTsKKyAgICAvKiBHaXZlIHVwIGlmIHdlIHN0aWxsIGNhbid0IGdldCBhdCBpdC4gICovCisgICAgaWYgKGxlbl93ID09IDAgfHwgbGVuX3cgPj0gbGVuKQorICAgICAgeworICAgICAgICBmcmVlIChidWZmZXJfdyk7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorCisgICAgLyogQmV0dGVyIGJlIHJlYWxseSBzYWZlLiAgKi8KKyAgICBidWZmZXJfd1tsZW5fd10gPSAnXDAnOworCisgICAgYnVmZmVyX2MgPSBfZGJ1c193aW5fdXRmMTZfdG9fdXRmOCAoYnVmZmVyX3csIE5VTEwpOworICAgIGZyZWUgKGJ1ZmZlcl93KTsKKyAgICBpZiAoISBidWZmZXJfYykKKyAgICAgIHJldHVybiAwOworCisgICAgLyogc3RybGVuIGlzIGNvcnJlY3QgKG5vdCBfbWJzdHJsZW4pLCBiZWNhdXNlIHdlIHdhbnQgc3RvcmFnZSBhbmQKKyAgICAgICBub3Qgc3RyaW5nIGxlbmd0aC4gICovCisgICAgbGVuX2MgPSBzdHJsZW4gKGJ1ZmZlcl9jKSArIDE7CisgICAgaWYgKGxlbl9jID4gbkJ1ZmZlckxlbmd0aCkKKyAgICAgIHJldHVybiBsZW5fYzsKKworICAgIHN0cmNweSAobHBCdWZmZXIsIGJ1ZmZlcl9jKTsKKyAgICBkYnVzX2ZyZWUgKGJ1ZmZlcl9jKTsKKyAgICByZXR1cm4gbGVuX2MgLSAxOworICB9Cit9CisKKworQk9PTAorU0hHZXRTcGVjaWFsRm9sZGVyUGF0aEEgKEhXTkQgaHduZE93bmVyLCBMUFNUUiBscHN6UGF0aCwgaW50IG5Gb2xkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTCBmQ3JlYXRlKQoreworICB3Y2hhcl90IHBhdGhbTUFYX1BBVEhdOworICBjaGFyICpwYXRoX2M7CisgIEJPT0wgcmVzdWx0OworCisgIHBhdGhbMF0gPSAod2NoYXJfdCkgMDsKKyAgcmVzdWx0ID0gU0hHZXRTcGVjaWFsRm9sZGVyUGF0aFcgKGh3bmRPd25lciwgcGF0aCwgbkZvbGRlciwgZkNyZWF0ZSk7CisgIC8qIE5vdGU6IE1heSByZXR1cm4gZmFsc2UgZXZlbiBpZiBzdWNjZWVkcy4gICovCisKKyAgcGF0aFtNQVhfUEFUSCAtIDFdID0gKHdjaGFyX3QpIDA7CisgIHBhdGhfYyA9IF9kYnVzX3dpbl91dGYxNl90b191dGY4IChwYXRoLCBOVUxMKTsKKyAgaWYgKCEgcGF0aF9jKQorICAgIHJldHVybiAwOworICAKKyAgc3RybmNweSAobHBzelBhdGgsIHBhdGhfYywgTUFYX1BBVEgpOworICBkYnVzX2ZyZWUgKHBhdGhfYyk7CisgIGxwc3pQYXRoW01BWF9QQVRIIC0gMV0gPSAnXDAnOworICByZXR1cm4gcmVzdWx0OworfQorCisKK3ZvaWQKK091dHB1dERlYnVnU3RyaW5nQSAoTFBDU1RSIGxwT3V0cHV0U3RyaW5nKQoreworICB3Y2hhcl90ICpzdHI7CisgIEhBTkRMRSByZXN1bHQ7CisgIGludCBlcnI7CisKKyAgc3RyID0gX2RidXNfd2luX3V0ZjhfdG9fdXRmMTYgKGxwT3V0cHV0U3RyaW5nLCBOVUxMKTsKKyAgaWYgKCFzdHIpCisgICAgcmV0dXJuOworCisgIE91dHB1dERlYnVnU3RyaW5nVyAoc3RyKTsKKworICBlcnIgPSBHZXRMYXN0RXJyb3IgKCk7CisgIGRidXNfZnJlZSAoc3RyKTsKKyAgU2V0TGFzdEVycm9yIChlcnIpOworfQpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLXN5c2RlcHMtd2luY2UtZ2x1ZS5oIGIvZGJ1cy9kYnVzLXN5c2RlcHMtd2luY2UtZ2x1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1YWM2YzgKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtc3lzZGVwcy13aW5jZS1nbHVlLmgKQEAgLTAsMCArMSwyNDYgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1zeXNkZXBzLXdpbmNlLWdsdWUuaCBFbXVsYXRpb24gb2Ygc3lzdGVtL2xpYmMgZmVhdHVyZXMgZm9yIFdpbmRvd3MgQ0UgKGludGVybmFsIHRvIEQtQnVzIGltcGxlbWVudGF0aW9uKQorICogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMgIFJlZCBIYXQsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwMyBDb2RlRmFjdG9yeSBBQgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaWZuZGVmIERCVVNfU1lTREVQU19XSU5DRV9HTFVFX0gKKyNkZWZpbmUgREJVU19TWVNERVBTX1dJTkNFX0dMVUVfSAorCisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisvKiBGb3IgZ2V0YWRkcmluZm8sIGNvbmZpZ3VyZS9jbWFrZSBkZWZpbmVkIF9XSU4zMl9XQ0UgdG8gc29tZXRoaW5nID49IDB4MDQwMS4gICovCisjaW5jbHVkZSA8d2luZG93cy5oPgorI3VuZGVmIGludGVyZmFjZQorCitEQlVTX0JFR0lOX0RFQ0xTCisKKy8qIHNobG9iai5oIGRlY2xhcmVzIHRoZXNlIG9ubHkgZm9yIF9XSU4zMl9JRSB0aGF0IHdlIGRvbid0IHdhbnQgdG8gZGVmaW5lLgorICAgSW4gYW55IGNhc2UsIHdpdGggbWluZ3czMmNlIHdlIG9ubHkgZ2V0IGEgU0hHZXRTcGVjaWFsRm9sZGVyUGF0aC4gICovCisjZGVmaW5lIFNIR2V0U3BlY2lhbEZvbGRlclBhdGhXIFNIR2V0U3BlY2lhbEZvbGRlclBhdGgKK0JPT0wgV0lOQVBJIFNIR2V0U3BlY2lhbEZvbGRlclBhdGhBKEhXTkQsTFBTVFIsaW50LEJPT0wpOworQk9PTCBXSU5BUEkgU0hHZXRTcGVjaWFsRm9sZGVyUGF0aFcoSFdORCxMUFdTVFIsaW50LEJPT0wpOworCisjaWZuZGVmIFRMU19PVVRfT0ZfSU5ERVhFUworI2RlZmluZSBUTFNfT1VUX09GX0lOREVYRVMgMHhmZmZmZmZmZgorI2VuZGlmCisKKworLyogU2VyaW91c2x5LiAgV2luZG93cyBDRSBkb2VzIG5vdCBoYXZlIGVycm5vLiAgRG9uJ3QgeW91IGhhdGUgaXQgd2hlbgorICAgdGhhdCBoYXBwZW5zPyAgKi8KKyNkZWZpbmUgZXJybm8gKChpbnQpR2V0TGFzdEVycm9yICgpKQorCisjZGVmaW5lIEVOT0VOVCAgICAgICAgICBFUlJPUl9GSUxFX05PVF9GT1VORAorI2RlZmluZSBFTUZJTEUgICAgICAgICAgRVJST1JfVE9PX01BTllfT1BFTl9GSUxFUworI2RlZmluZSBFQUNDRVMgICAgICAgICAgRVJST1JfQUNDRVNTX0RFTklFRAorI2RlZmluZSBFQkFERiAgICAgICAgICAgRVJST1JfSU5WQUxJRF9IQU5ETEUKKyNkZWZpbmUgRU5PTUVNICAgICAgICAgIEVSUk9SX05PVF9FTk9VR0hfTUVNT1JZCisjZGVmaW5lIEVYREVWICAgICAgICAgICBFUlJPUl9OT1RfU0FNRV9ERVZJQ0UKKyNkZWZpbmUgRU5GSUxFICAgICAgICAgIEVSUk9SX05PX01PUkVfRklMRVMKKyNkZWZpbmUgRVJPRlMgICAgICAgICAgIEVSUk9SX1dSSVRFX1BST1RFQ1QKKyNkZWZpbmUgRU5PTENLICAgICAgICAgIEVSUk9SX1NIQVJJTkdfQlVGRkVSX0VYQ0VFREVECisjZGVmaW5lIEVOT1NZUyAgICAgICAgICBFUlJPUl9OT1RfU1VQUE9SVEVECisjZGVmaW5lIEVFWElTVCAgICAgICAgICBFUlJPUl9GSUxFX0VYSVNUUworI2RlZmluZSBFUEVSTSAgICAgICAgICAgRVJST1JfQ0FOTk9UX01BS0UKKyNkZWZpbmUgRUlOVkFMICAgICAgICAgIEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSCisjZGVmaW5lIEVJTlRSICAgICAgICAgICBFUlJPUl9JTlZBTElEX0FUX0lOVEVSUlVQVF9USU1FCisjZGVmaW5lIEVQSVBFICAgICAgICAgICBFUlJPUl9CUk9LRU5fUElQRQorI2RlZmluZSBFTk9TUEMgICAgICAgICAgRVJST1JfRElTS19GVUxMCisjZGVmaW5lIEVOT1RFTVBUWSAgICAgICBFUlJPUl9ESVJfTk9UX0VNUFRZCisjZGVmaW5lIEVCVVNZICAgICAgICAgICBFUlJPUl9CVVNZCisjZGVmaW5lIEVOQU1FVE9PTE9ORyAgICBFUlJPUl9GSUxFTkFNRV9FWENFRF9SQU5HRQorI2RlZmluZSBFQUdBSU4gICAgICAgICAgRVJST1JfTU9SRV9EQVRBCisjZGVmaW5lIEVOT1RESVIgICAgICAgICBFUlJPUl9ESVJFQ1RPUlkKKyNkZWZpbmUgRVJBTkdFICAgICAgICAgIEVSUk9SX0FSSVRITUVUSUNfT1ZFUkZMT1cKKyNkZWZpbmUgRU5YSU8gICAgICAgICAgIEVSUk9SX0ZJTEVfSU5WQUxJRAorI2RlZmluZSBFRkFVTFQgICAgICAgICAgRVJST1JfUFJPQ0VTU19BQk9SVEVECisjZGVmaW5lIEVJTyAgICAgICAgICAgICBFUlJPUl9JT19ERVZJQ0UKKyNkZWZpbmUgRURFQURMT0NLICAgICAgIEVSUk9SX1BPU1NJQkxFX0RFQURMT0NLCisjZGVmaW5lIEVOT0RFViAgICAgICAgICBFUlJPUl9CQURfREVWSUNFCisKKy8qIFdpbmRvd3MgQ0UgaXMgbWlzc2luZyBtb3JlIHN0dWZmIHRoYXQgaXMgcHJldHR5IHN0YW5kYXJkLiAgKi8KKworI2RlZmluZSBzdHJkdXAgX3N0cmR1cAorI2RlZmluZSBzdHJpY21wIF9zdHJpY21wCisjZGVmaW5lIHN0cm5pY21wIF9zdHJuaWNtcAorCisjZGVmaW5lIGVudmlyb24gX2RidXNfd2luY2VfZW52aXJvbgorZXh0ZXJuIGNoYXIgKmVudmlyb25bXTsKKworI2RlZmluZSBnZXRlbnYgX2RidXNfd2luY2VfZ2V0ZW52CitjaGFyICpnZXRlbnYgKGNvbnN0IGNoYXIgKm5hbWUpOworCisjZGVmaW5lIHB1dGVudiBfZGJ1c193aW5jZV9wdXRlbnYKK2ludCBwdXRlbnYgKGNoYXIgKnN0cik7CisKKyNkZWZpbmUgY2xvY2sgX2RidXNfd2luY2VfY2xvY2sKK2Nsb2NrX3QgY2xvY2sgKHZvaWQpOworCisjZGVmaW5lIGFib3J0IF9kYnVzX3dpbmNlX2Fib3J0Cit2b2lkIGFib3J0ICh2b2lkKTsKKworI2RlZmluZSBfU19JRk1UICAgICAgICAgMDE3MDAwMCAgICAgICAgIC8qIGZpbGUgdHlwZSBtYXNrICovCisjZGVmaW5lIF9TX0lGRElSICAgICAgICAwMDQwMDAwICAgICAgICAgLyogZGlyZWN0b3J5ICovCisjZGVmaW5lIF9TX0lGQ0hSICAgICAgICAwMDIwMDAwICAgICAgICAgLyogY2hhcmFjdGVyIHNwZWNpYWwgKi8KKyNkZWZpbmUgX1NfSUZJRk8gICAgICAgIDAwMTAwMDAgICAgICAgICAvKiBwaXBlICovCisjZGVmaW5lIF9TX0lGUkVHICAgICAgICAwMTAwMDAwICAgICAgICAgLyogcmVndWxhciAqLworI2RlZmluZSBfU19JUkVBRCAgICAgICAgMDAwMDQwMCAgICAgICAgIC8qIHJlYWQgcGVybWlzc2lvbiwgb3duZXIgKi8KKyNkZWZpbmUgX1NfSVdSSVRFICAgICAgIDAwMDAyMDAgICAgICAgICAvKiB3cml0ZSBwZXJtaXNzaW9uLCBvd25lciAqLworI2RlZmluZSBfU19JRVhFQyAgICAgICAgMDAwMDEwMCAgICAgICAgIC8qIGV4ZWN1dGUvc2VhcmNoIHBlcm1pc3Npb24sIG93bmVyICovCisKKyNpZm5kZWYgX19PRkZfVF9ERUZJTkVECit0eXBlZGVmIGxvbmcgb2ZmX3Q7CisjZGVmaW5lIF9fT0ZGX1RfREVGSU5FRAorI2VuZGlmCisjaWZuZGVmIF9JTlRQVFJfVF9ERUZJTkVECit0eXBlZGVmIGludCBpbnRwdHJfdDsKKyNkZWZpbmUgX0lOVFBUUl9UX0RFRklORUQKKyNlbmRpZgorI2lmbmRlZiBfVUlOVFBUUl9UX0RFRklORUQKK3R5cGVkZWYgdW5zaWduZWQgaW50IHVpbnRwdHJfdDsKKyNkZWZpbmUgX1VJTlRQVFJfVF9ERUZJTkVECisjZW5kaWYKKworI2lmbmRlZiBfTUFYX0ZOQU1FCisjZGVmaW5lIF9NQVhfRk5BTUUgMjU2CisjZW5kaWYKKworI2lmbmRlZiBfSU9GQkYKKyNkZWZpbmUgX0lPRkJGCTAKKyNlbmRpZgorI2lmbmRlZiBfSU9MQkYKKyNkZWZpbmUgX0lPTEJGCTEKKyNlbmRpZgorI2lmbmRlZiBfSU9OQkYKKyNkZWZpbmUgX0lPTkJGCTIKKyNlbmRpZgorCisKKy8qIFdpbmRvd3MgQ0UgaXMgbWlzc2luZyBzb21lIFdpbmRvd3MgZnVuY3Rpb25zIHRoYXQgd2Ugd2FudC4gICovCisKKyNkZWZpbmUgR2V0U3lzdGVtVGltZUFzRmlsZVRpbWUgX2RidXNfd2luY2VfR2V0U3lzdGVtVGltZUFzRmlsZVRpbWUKK3ZvaWQgR2V0U3lzdGVtVGltZUFzRmlsZVRpbWUgKExQRklMRVRJTUUgZnRwKTsKKworI2RlZmluZSBfbWJzcmNociBfZGJ1c193aW5jZV9tYnNyY2hyCit1bnNpZ25lZCBjaGFyKiBfbWJzcmNociAoY29uc3QgdW5zaWduZWQgY2hhciosIHVuc2lnbmVkIGludCk7CisKKyNkZWZpbmUgT3BlbkZpbGVNYXBwaW5nQSBfZGJ1c193aW5jZV9PcGVuRmlsZU1hcHBpbmdBCitIQU5ETEUgT3BlbkZpbGVNYXBwaW5nQShEV09SRCxCT09MLExQQ1NUUik7CisKKyNkZWZpbmUgTW92ZUZpbGVFeEEgX2RidXNfd2luY2VfTW92ZUZpbGVFeEEKK0JPT0wgTW92ZUZpbGVFeEEoTFBDU1RSLExQQ1NUUixEV09SRCk7CisjaWZuZGVmIE1PVkVGSUxFX1JFUExBQ0VfRVhJU1RJTkcKKyNkZWZpbmUgTU9WRUZJTEVfUkVQTEFDRV9FWElTVElORyAweDAwMDAwMDAxCisjZW5kaWYKKworI2RlZmluZSBTZXRIYW5kbGVJbmZvcm1hdGlvbiBfZGJ1c193aW5jZV9TZXRIYW5kbGVJbmZvcm1hdGlvbgorQk9PTCBTZXRIYW5kbGVJbmZvcm1hdGlvbihIQU5ETEUsRFdPUkQsRFdPUkQpOworI2lmbmRlZiBIQU5ETEVfRkxBR19JTkhFUklUCisjZGVmaW5lIEhBTkRMRV9GTEFHX0lOSEVSSVQgMHgwMQorI2VuZGlmCisjaWZuZGVmIEhBTkRMRV9GTEFHX1BST1RFQ1QKKyNkZWZpbmUgSEFORExFX0ZMQUdfUFJPVEVDVF9GUk9NX0NMT1NFIDB4MDIKKyNlbmRpZgorCisjZGVmaW5lIFNlYXJjaFBhdGhBIF9kYnVzX3dpbmNlX1NlYXJjaFBhdGhBCitEV09SRCBTZWFyY2hQYXRoQShMUENTVFIsTFBDU1RSLExQQ1NUUixEV09SRCxMUFNUUixMUFNUUiopOworCisvKiBJbnN0ZWFkIG9mIGVtdWxhdGluZyBhbGwgZnVuY3Rpb25zIG5lZWRlZCBmb3IgdGhpcywgd2UgcmVwbGFjZSB0aGUKKyAgIHdob2xlIHRoaW5nLiAgKi8KK2RidXNfYm9vbF90IF9kYnVzX2dldHNpZChjaGFyICoqc2lkKTsKKworCisjZGVmaW5lIExvb2t1cEFjY291bnROYW1lVyBfZGJ1c193aW5jZV9Mb29rdXBBY2NvdW50TmFtZVcKK0JPT0wgTG9va3VwQWNjb3VudE5hbWVXKExQQ1dTVFIsTFBDV1NUUixQU0lELFBEV09SRCxMUFdTVFIsUERXT1JELFBTSURfTkFNRV9VU0UpOworCisjZGVmaW5lIElzVmFsaWRTaWQgX2RidXNfd2luY2VfSXNWYWxpZFNpZAorQk9PTCBJc1ZhbGlkU2lkKFBTSUQpOworCisKKy8qIFdpbmRvd3MgQ0UgZG9lcyBvbmx5IGhhdmUgdGhlIFVOSUNPREUgaW50ZXJmYWNlcyAoRm9vVyksIGJ1dCB3ZQorICAgd2FudCB0byB1c2UgdGhlIEFTQ0lJIGludGVyZmFjZXMgKEZvb0EpLiAgV2UgaW1wbGVtZW50IHRoZW0KKyAgIGhlcmUuICAqLworCisjZGVmaW5lIENyZWF0ZUZpbGVBIF9kYnVzX3dpbmNlX0NyZWF0ZUZpbGVBCitIQU5ETEUgQ3JlYXRlRmlsZUEoTFBDU1RSLERXT1JELERXT1JELExQU0VDVVJJVFlfQVRUUklCVVRFUyxEV09SRCxEV09SRCxIQU5ETEUpOworCisjZGVmaW5lIERlbGV0ZUZpbGVBIF9kYnVzX3dpbmNlX0RlbGV0ZUZpbGVBCitCT09MIERlbGV0ZUZpbGVBKExQQ1NUUik7CisKKyNkZWZpbmUgR2V0RmlsZUF0dHJpYnV0ZXNBIF9kYnVzX3dpbmNlX0dldEZpbGVBdHRyaWJ1dGVzQQorRFdPUkQgR2V0RmlsZUF0dHJpYnV0ZXNBKExQQ1NUUik7CisKKyNkZWZpbmUgR2V0RmlsZUF0dHJpYnV0ZXNFeEEgX2RidXNfd2luY2VfR2V0RmlsZUF0dHJpYnV0ZXNFeEEKK0JPT0wgR2V0RmlsZUF0dHJpYnV0ZXNFeEEoTFBDU1RSLEdFVF9GSUxFRVhfSU5GT19MRVZFTFMsUFZPSUQpOworCisjZGVmaW5lIENyZWF0ZUZpbGVNYXBwaW5nQSBfZGJ1c193aW5jZV9DcmVhdGVGaWxlTWFwcGluZ0EKK0hBTkRMRSBDcmVhdGVGaWxlTWFwcGluZ0EoSEFORExFLExQU0VDVVJJVFlfQVRUUklCVVRFUyxEV09SRCxEV09SRCxEV09SRCxMUENTVFIpOworCisjZGVmaW5lIENyZWF0ZURpcmVjdG9yeUEgX2RidXNfd2luY2VfQ3JlYXRlRGlyZWN0b3J5QQorQk9PTCBDcmVhdGVEaXJlY3RvcnlBKExQQ1NUUixMUFNFQ1VSSVRZX0FUVFJJQlVURVMpOworCisjZGVmaW5lIFJlbW92ZURpcmVjdG9yeUEgX2RidXNfd2luY2VfUmVtb3ZlRGlyZWN0b3J5QQorQk9PTCBSZW1vdmVEaXJlY3RvcnlBKExQQ1NUUik7CisKKyNkZWZpbmUgRmluZEZpcnN0RmlsZUEgX2RidXNfd2luY2VfRmluZEZpcnN0RmlsZUEKK0hBTkRMRSBGaW5kRmlyc3RGaWxlQShMUENTVFIsTFBXSU4zMl9GSU5EX0RBVEFBKTsKKworI2RlZmluZSBGaW5kTmV4dEZpbGVBIF9kYnVzX3dpbmNlX0ZpbmROZXh0RmlsZUEKK0JPT0wgRmluZE5leHRGaWxlQShIQU5ETEUsTFBXSU4zMl9GSU5EX0RBVEFBKTsKKworI2RlZmluZSBDcmVhdGVNdXRleEEgX2RidXNfd2luY2VfQ3JlYXRlTXV0ZXhBCitIQU5ETEUgQ3JlYXRlTXV0ZXhBKExQU0VDVVJJVFlfQVRUUklCVVRFUyxCT09MLExQQ1NUUik7CisKKyNkZWZpbmUgQ3JlYXRlUHJvY2Vzc0EgX2RidXNfd2luY2VfQ3JlYXRlUHJvY2Vzc0EKK0JPT0wgQ3JlYXRlUHJvY2Vzc0EoTFBDU1RSLExQU1RSLExQU0VDVVJJVFlfQVRUUklCVVRFUyxMUFNFQ1VSSVRZX0FUVFJJQlVURVMsQk9PTCxEV09SRCxQVk9JRCxMUENTVFIsTFBTVEFSVFVQSU5GT0EsTFBQUk9DRVNTX0lORk9STUFUSU9OKTsKKyNpZm5kZWYgQ1JFQVRFX05PX1dJTkRPVworI2RlZmluZSBDUkVBVEVfTk9fV0lORE9XIDB4MDgwMDAwMDAKKyNlbmRpZgorCisKKyNkZWZpbmUgUmVnT3BlbktleUV4QSBfZGJ1c193aW5jZV9SZWdPcGVuS2V5RXhBCitMT05HIFJlZ09wZW5LZXlFeEEoSEtFWSxMUENTVFIsRFdPUkQsUkVHU0FNLFBIS0VZKTsKKworI2RlZmluZSBSZWdRdWVyeVZhbHVlRXhBIF9kYnVzX3dpbmNlX1JlZ1F1ZXJ5VmFsdWVFeEEKK0xPTkcgV0lOQVBJIFJlZ1F1ZXJ5VmFsdWVFeEEoSEtFWSxMUENTVFIsTFBEV09SRCxMUERXT1JELExQQllURSxMUERXT1JEKTsKKworCisjZGVmaW5lIEZvcm1hdE1lc3NhZ2VBIF9kYnVzX3dpbmNlX0Zvcm1hdE1lc3NhZ2VBCitEV09SRCBGb3JtYXRNZXNzYWdlQShEV09SRCxQQ1ZPSUQsRFdPUkQsRFdPUkQsTFBTVFIsRFdPUkQsdmFfbGlzdCopOworCisjZGVmaW5lIEdldE1vZHVsZUZpbGVOYW1lQSBfZGJ1c193aW5jZV9HZXRNb2R1bGVGaWxlTmFtZUEKK0RXT1JEIEdldE1vZHVsZUZpbGVOYW1lQShISU5TVEFOQ0UsTFBTVFIsRFdPUkQpOworCisjZGVmaW5lIEdldFRlbXBQYXRoQSBfZGJ1c193aW5jZV9HZXRUZW1wUGF0aEEKK0RXT1JEIEdldFRlbXBQYXRoQShEV09SRCxMUFNUUik7CisKKyNkZWZpbmUgU0hHZXRTcGVjaWFsRm9sZGVyUGF0aEEgX2RidXNfd2luY2VfU0hHZXRTcGVjaWFsRm9sZGVyUGF0aEEKK0JPT0wgU0hHZXRTcGVjaWFsRm9sZGVyUGF0aEEoSFdORCxMUFNUUixpbnQsQk9PTCk7CisKKworI2RlZmluZSBPdXRwdXREZWJ1Z1N0cmluZ0EgX2RidXNfd2luY2VfT3V0cHV0RGVidWdTdHJpbmdBCit2b2lkIE91dHB1dERlYnVnU3RyaW5nQShMUENTVFIpOworCisKK0RCVVNfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBEQlVTX1NZU0RFUFNfV0lOQ0VfR0xVRV9IICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtc3lzZGVwcy5jIGIvZGJ1cy9kYnVzLXN5c2RlcHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGJiODk0Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLXN5c2RlcHMuYwpAQCAtMCwwICsxLDc3OCBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXN5c2RlcHMuYyBXcmFwcGVycyBhcm91bmQgc3lzdGVtL2xpYmMgZmVhdHVyZXMgc2hhcmVkIGJldHdlZW4gVU5JWCBhbmQgV2luZG93cyAoaW50ZXJuYWwgdG8gRC1CdXMgaW1wbGVtZW50YXRpb24pCisgKiAKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMywgMjAwNiAgUmVkIEhhdCwgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDAzIENvZGVGYWN0b3J5IEFCCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLWludGVybmFscy5oIgorI2luY2x1ZGUgImRidXMtc3lzZGVwcy5oIgorI2luY2x1ZGUgImRidXMtdGhyZWFkcy5oIgorI2luY2x1ZGUgImRidXMtcHJvdG9jb2wuaCIKKyNpbmNsdWRlICJkYnVzLXN0cmluZy5oIgorI2luY2x1ZGUgImRidXMtbGlzdC5oIgorI2luY2x1ZGUgImRidXMtbWlzYy5oIgorCisvKiBOT1RFOiBJZiB5b3UgaW5jbHVkZSBhbnkgdW5peC93aW5kb3dzLXNwZWNpZmljIGhlYWRlcnMgaGVyZSwgeW91IGFyZSBwcm9iYWJseSBkb2luZyBzb21ldGhpbmcKKyAqIHdyb25nIGFuZCBzaG91bGQgYmUgcHV0dGluZyBzb21lIGNvZGUgaW4gZGJ1cy1zeXNkZXBzLXVuaXguYyBvciBkYnVzLXN5c2RlcHMtd2luLmMuCisgKgorICogVGhlc2UgYXJlIHRoZSBzdGFuZGFyZCBBTlNJIEMgaGVhZGVycy4uLgorICovCisjaWYgSEFWRV9MT0NBTEVfSAorI2luY2x1ZGUgPGxvY2FsZS5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2lmZGVmIEhBVkVfRVJSTk9fSAorI2luY2x1ZGUgPGVycm5vLmg+CisjZW5kaWYKKworI2lmZGVmIERCVVNfV0lOCisgICNpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbGlmIChkZWZpbmVkIF9fQVBQTEVfXykKKyMgaW5jbHVkZSA8Y3J0X2V4dGVybnMuaD4KKyMgZGVmaW5lIGVudmlyb24gKCpfTlNHZXRFbnZpcm9uKCkpCisjZWxpZiBIQVZFX0RFQ0xfRU5WSVJPTiAmJiBkZWZpbmVkKEhBVkVfVU5JU1REX0gpCisjIGluY2x1ZGUgPHVuaXN0ZC5oPgorI2Vsc2UKK2V4dGVybiBjaGFyICoqZW52aXJvbjsKKyNlbmRpZgorCisvKioKKyAqIEBkZWZncm91cCBEQnVzU3lzZGVwcyBJbnRlcm5hbCBzeXN0ZW0tZGVwZW5kZW50IEFQSQorICogQGluZ3JvdXAgREJ1c0ludGVybmFscworICogQGJyaWVmIEludGVybmFsIHN5c3RlbS1kZXBlbmRlbnQgQVBJIGF2YWlsYWJsZSBvbiBVTklYIGFuZCBXaW5kb3dzCisgKgorICogVGhlIHN5c3RlbS1kZXBlbmRlbnQgQVBJIGhhcyBhIGR1YWwgcHVycG9zZS4gRmlyc3QsIGl0IGVuY2Fwc3VsYXRlcworICogYWxsIHVzYWdlIG9mIG9wZXJhdGluZyBzeXN0ZW0gQVBJcyBmb3IgZWFzZSBvZiBhdWRpdGluZyBhbmQgdG8KKyAqIGF2b2lkIGNsdXR0ZXJpbmcgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgd2l0aCBiaXphcnJlIE9TIHF1aXJrcyBhbmQKKyAqIGhlYWRlcnMuIFNlY29uZCwgaXQgYWJzdHJhY3RzIGRpZmZlcmVudCBvcGVyYXRpbmcgc3lzdGVtIEFQSXMgZm9yCisgKiBwb3J0YWJpbGl0eS4KKyAqIAorICogQHsKKyAqLworCisvKioKKyAqIEFib3J0cyB0aGUgcHJvZ3JhbSB3aXRoIFNJR0FCUlQgKGR1bXBpbmcgY29yZSkuCisgKi8KK3ZvaWQKK19kYnVzX2Fib3J0ICh2b2lkKQoreworICBjb25zdCBjaGFyICpzOworICAKKyAgX2RidXNfcHJpbnRfYmFja3RyYWNlICgpOworICAKKyAgcyA9IF9kYnVzX2dldGVudiAoIkRCVVNfQkxPQ0tfT05fQUJPUlQiKTsKKyAgaWYgKHMgJiYgKnMpCisgICAgeworICAgICAgLyogZG9uJ3QgdXNlIF9kYnVzX3dhcm4gaGVyZSBzaW5jZSBpdCBjYW4gX2RidXNfYWJvcnQoKSAqLworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiICBQcm9jZXNzICVsdSBzbGVlcGluZyBmb3IgZ2RiIGF0dGFjaFxuIiwgX2RidXNfcGlkX2Zvcl9sb2cgKCkpOworICAgICAgX2RidXNfc2xlZXBfbWlsbGlzZWNvbmRzICgxMDAwICogMTgwKTsKKyAgICB9CisgIAorICBhYm9ydCAoKTsKKyAgX2RidXNfZXhpdCAoMSk7IC8qIGluIGNhc2Ugc29tZW9uZSBtYW5hZ2VzIHRvIGlnbm9yZSBTSUdBQlJUID8gKi8KK30KKworLyoqCisgKiBAaW5ncm91cCBEQnVzTWlzYworICoKKyAqIFdyYXBwZXIgZm9yIHNldGVudigpLiBJZiB0aGUgdmFsdWUgaXMgI05VTEwsIHVuc2V0cworICogdGhlIGVudmlyb25tZW50IHZhcmlhYmxlLgorICoKKyAqIFRoZXJlIGlzIGFuIHVuZml4YWJsZSBtZW1sZWFrIGluIHRoYXQgaXQgaXMgdW5zYWZlIHRvCisgKiBmcmVlIG1lbW9yeSBtYWxsb2NlZCBmb3IgdXNlIHdpdGggc2V0ZW52LiBUaGlzIGlzIGJlY2F1c2UKKyAqIHdlIGNhbiBub3QgcmVseSBvbiBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIG9mCisgKiB0aGUgdW5kZXJseWluZyBsaWJjIGxpYnJhcnkuCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBub3QgdGhyZWFkLXNhZmUsIGJlY2F1c2UgYWx0ZXJpbmcgdGhlIGVudmlyb25tZW50CisgKiBpbiBVbml4IGlzIG5vdCB0aHJlYWQtc2FmZSBpbiBnZW5lcmFsLgorICoKKyAqIEBwYXJhbSB2YXJuYW1lIG5hbWUgb2YgZW52aXJvbm1lbnQgdmFyaWFibGUKKyAqIEBwYXJhbSB2YWx1ZSB2YWx1ZSBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZSwgb3IgI05VTEwgdG8gdW5zZXQKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MsICNGQUxTRSBpZiBub3QgZW5vdWdoIG1lbW9yeS4KKyAqLworZGJ1c19ib29sX3QKK2RidXNfc2V0ZW52IChjb25zdCBjaGFyICp2YXJuYW1lLAorICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZhbHVlKQoreworICBfZGJ1c19hc3NlcnQgKHZhcm5hbWUgIT0gTlVMTCk7CisgIAorICBpZiAodmFsdWUgPT0gTlVMTCkKKyAgICB7CisjaWZkZWYgSEFWRV9VTlNFVEVOVgorICAgICAgdW5zZXRlbnYgKHZhcm5hbWUpOworICAgICAgcmV0dXJuIFRSVUU7CisjZWxzZQorICAgICAgY2hhciAqcHV0ZW52X3ZhbHVlOworICAgICAgc2l6ZV90IGxlbjsKKworICAgICAgbGVuID0gc3RybGVuICh2YXJuYW1lKTsKKworICAgICAgLyogVXNlIHN5c3RlbSBtYWxsb2MgdG8gYXZvaWQgbWVtbGVha3MgdGhhdCBkYnVzX21hbGxvYworICAgICAgICogd2lsbCBnZXQgdXBzZXQgYWJvdXQuCisgICAgICAgKi8KKyAgICAgIAorICAgICAgcHV0ZW52X3ZhbHVlID0gbWFsbG9jIChsZW4gKyAyKTsKKyAgICAgIGlmIChwdXRlbnZfdmFsdWUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICBzdHJjcHkgKHB1dGVudl92YWx1ZSwgdmFybmFtZSk7CisjaWYgZGVmaW5lZChEQlVTX1dJTikKKyAgICAgIHN0cmNhdCAocHV0ZW52X3ZhbHVlLCAiPSIpOworI2VuZGlmCisgICAgICAKKyAgICAgIHJldHVybiAocHV0ZW52IChwdXRlbnZfdmFsdWUpID09IDApOworI2VuZGlmCisgICAgfQorICBlbHNlCisgICAgeworI2lmZGVmIEhBVkVfU0VURU5WCisgICAgICByZXR1cm4gKHNldGVudiAodmFybmFtZSwgdmFsdWUsIFRSVUUpID09IDApOworI2Vsc2UKKyAgICAgIGNoYXIgKnB1dGVudl92YWx1ZTsKKyAgICAgIHNpemVfdCBsZW47CisgICAgICBzaXplX3QgdmFybmFtZV9sZW47CisgICAgICBzaXplX3QgdmFsdWVfbGVuOworCisgICAgICB2YXJuYW1lX2xlbiA9IHN0cmxlbiAodmFybmFtZSk7CisgICAgICB2YWx1ZV9sZW4gPSBzdHJsZW4gKHZhbHVlKTsKKyAgICAgIAorICAgICAgbGVuID0gdmFybmFtZV9sZW4gKyB2YWx1ZV9sZW4gKyAxIC8qICc9JyAqLyA7CisKKyAgICAgIC8qIFVzZSBzeXN0ZW0gbWFsbG9jIHRvIGF2b2lkIG1lbWxlYWtzIHRoYXQgZGJ1c19tYWxsb2MKKyAgICAgICAqIHdpbGwgZ2V0IHVwc2V0IGFib3V0LgorICAgICAgICovCisgICAgICAKKyAgICAgIHB1dGVudl92YWx1ZSA9IG1hbGxvYyAobGVuICsgMSk7CisgICAgICBpZiAocHV0ZW52X3ZhbHVlID09IE5VTEwpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgc3RyY3B5IChwdXRlbnZfdmFsdWUsIHZhcm5hbWUpOworICAgICAgc3RyY3B5IChwdXRlbnZfdmFsdWUgKyB2YXJuYW1lX2xlbiwgIj0iKTsKKyAgICAgIHN0cmNweSAocHV0ZW52X3ZhbHVlICsgdmFybmFtZV9sZW4gKyAxLCB2YWx1ZSk7CisgICAgICAKKyAgICAgIHJldHVybiAocHV0ZW52IChwdXRlbnZfdmFsdWUpID09IDApOworI2VuZGlmCisgICAgfQorfQorCisvKioKKyAqIFdyYXBwZXIgZm9yIGdldGVudigpLgorICoKKyAqIEBwYXJhbSB2YXJuYW1lIG5hbWUgb2YgZW52aXJvbm1lbnQgdmFyaWFibGUKKyAqIEByZXR1cm5zIHZhbHVlIG9mIGVudmlyb25tZW50IHZhcmlhYmxlIG9yICNOVUxMIGlmIHVuc2V0CisgKi8KK2NvbnN0IGNoYXIqCitfZGJ1c19nZXRlbnYgKGNvbnN0IGNoYXIgKnZhcm5hbWUpCit7ICAKKyAgLyogRG9uJ3QgcmVzcGVjdCBhbnkgZW52aXJvbm1lbnQgdmFyaWFibGVzIGlmIHRoZSBjdXJyZW50IHByb2Nlc3MgaXMKKyAgICogc2V0dWlkLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiBnbGliYydzIF9fc2VjdXJlX2dldGVudigpLgorICAgKi8KKyAgaWYgKF9kYnVzX2NoZWNrX3NldHVpZCAoKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIGdldGVudiAodmFybmFtZSk7Cit9CisKKy8qKgorICogV3JhcHBlciBmb3IgY2xlYXJlbnYoKS4KKyAqCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzLgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfY2xlYXJlbnYgKHZvaWQpCit7CisgIGRidXNfYm9vbF90IHJjID0gVFJVRTsKKworI2lmZGVmIEhBVkVfQ0xFQVJFTlYKKyAgaWYgKGNsZWFyZW52ICgpICE9IDApCisgICAgIHJjID0gRkFMU0U7CisjZWxzZQorCisgIGlmIChlbnZpcm9uICE9IE5VTEwpCisgICAgZW52aXJvblswXSA9IE5VTEw7CisjZW5kaWYKKworICByZXR1cm4gcmM7Cit9CisKKy8qKgorICogU3BsaXQgcGF0aHMgaW50byBhIGxpc3Qgb2YgY2hhciBzdHJpbmdzCisgKiAKKyAqIEBwYXJhbSBkaXJzIHN0cmluZyB3aXRoIHBhdGhlcyAKKyAqIEBwYXJhbSBzdWZmaXggc3RyaW5nIGNvbmNhdGVkIHRvIGVhY2ggcGF0aCBpbiBkaXJzCisgKiBAcGFyYW0gZGlyX2xpc3QgY29udGFpbnMgYSBsaXN0IG9mIHNwbGl0dGVkIHBhdGhlcworICogcmV0dXJuICNUUlVFIGlzIHBhdGhlcyBjb3VsZCBiZSBzcGxpdHRlcywjRkFMU0UgaW4gb29tIGNhc2UgCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zcGxpdF9wYXRoc19hbmRfYXBwZW5kIChEQnVzU3RyaW5nICpkaXJzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnN1ZmZpeCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTGlzdCAgKipkaXJfbGlzdCkKK3sKKyAgIGludCBzdGFydDsKKyAgIGludCBpOworICAgaW50IGxlbjsKKyAgIGNoYXIgKmNwYXRoOworICAgREJ1c1N0cmluZyBmaWxlX3N1ZmZpeDsKKworICAgc3RhcnQgPSAwOworICAgaSA9IDA7CisKKyAgIF9kYnVzX3N0cmluZ19pbml0X2NvbnN0ICgmZmlsZV9zdWZmaXgsIHN1ZmZpeCk7CisKKyAgIGxlbiA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChkaXJzKTsKKworICAgd2hpbGUgKF9kYnVzX3N0cmluZ19maW5kIChkaXJzLCBzdGFydCwgX0RCVVNfUEFUSF9TRVBBUkFUT1IsICZpKSkKKyAgICAgeworICAgICAgIERCdXNTdHJpbmcgcGF0aDsKKworICAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZwYXRoKSkKKyAgICAgICAgICBnb3RvIG9vbTsKKworICAgICAgIGlmICghX2RidXNfc3RyaW5nX2NvcHlfbGVuIChkaXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSAtIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCkpCisgICAgICAgICAgeworICAgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwYXRoKTsKKyAgICAgICAgICAgIGdvdG8gb29tOworICAgICAgICAgIH0KKworICAgICAgICBfZGJ1c19zdHJpbmdfY2hvcF93aGl0ZSAoJnBhdGgpOworCisgICAgICAgIC8qIGNoZWNrIGZvciBhbiBlbXB0eSBwYXRoICovCisgICAgICAgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnBhdGgpID09IDApCisgICAgICAgICAgZ290byBuZXh0OworCisgICAgICAgIGlmICghX2RidXNfY29uY2F0X2Rpcl9hbmRfZmlsZSAoJnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpbGVfc3VmZml4KSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnBhdGgpOworICAgICAgICAgICAgZ290byBvb207CisgICAgICAgICAgfQorCisgICAgICAgIGlmICghX2RidXNfc3RyaW5nX2NvcHlfZGF0YSgmcGF0aCwgJmNwYXRoKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnBhdGgpOworICAgICAgICAgICAgZ290byBvb207CisgICAgICAgICAgfQorCisgICAgICAgIGlmICghX2RidXNfbGlzdF9hcHBlbmQgKGRpcl9saXN0LCBjcGF0aCkpCisgICAgICAgICAgeworICAgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwYXRoKTsgICAgICAgICAgICAgIAorICAgICAgICAgICAgZGJ1c19mcmVlIChjcGF0aCk7CisgICAgICAgICAgICBnb3RvIG9vbTsKKyAgICAgICAgICB9CisKKyAgICAgICBuZXh0OgorICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnBhdGgpOworICAgICAgICBzdGFydCA9IGkgKyAxOworICAgIH0gCisgICAgICAKKyAgaWYgKHN0YXJ0ICE9IGxlbikKKyAgICB7IAorICAgICAgREJ1c1N0cmluZyBwYXRoOworCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmcGF0aCkpCisgICAgICAgIGdvdG8gb29tOworCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19jb3B5X2xlbiAoZGlycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4gLSBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmcGF0aCk7CisgICAgICAgICAgZ290byBvb207CisgICAgICAgIH0KKworICAgICAgaWYgKCFfZGJ1c19jb25jYXRfZGlyX2FuZF9maWxlICgmcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpbGVfc3VmZml4KSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmcGF0aCk7CisgICAgICAgICAgZ290byBvb207CisgICAgICAgIH0KKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfY29weV9kYXRhKCZwYXRoLCAmY3BhdGgpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwYXRoKTsKKyAgICAgICAgICBnb3RvIG9vbTsKKyAgICAgICAgfQorCisgICAgICBpZiAoIV9kYnVzX2xpc3RfYXBwZW5kIChkaXJfbGlzdCwgY3BhdGgpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwYXRoKTsgICAgICAgICAgICAgIAorICAgICAgICAgIGRidXNfZnJlZSAoY3BhdGgpOworICAgICAgICAgIGdvdG8gb29tOworICAgICAgICB9CisKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmcGF0aCk7IAorICAgIH0KKworICByZXR1cm4gVFJVRTsKKworIG9vbToKKyAgX2RidXNfbGlzdF9mb3JlYWNoIChkaXJfbGlzdCwgKERCdXNGb3JlYWNoRnVuY3Rpb24pZGJ1c19mcmVlLCBOVUxMKTsgCisgIF9kYnVzX2xpc3RfY2xlYXIgKGRpcl9saXN0KTsKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKiogQH0gKi8KKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzU3RyaW5nCisgKgorICogQHsKKyAqLworLyoqCisgKiBBcHBlbmRzIGFuIGludGVnZXIgdG8gYSBEQnVzU3RyaW5nLgorICogCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcKKyAqIEBwYXJhbSB2YWx1ZSB0aGUgaW50ZWdlciB2YWx1ZQorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vdCBlbm91Z2ggbWVtb3J5IG9yIG90aGVyIGZhaWx1cmUuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zdHJpbmdfYXBwZW5kX2ludCAoREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgICAgICAgIHZhbHVlKQoreworICAvKiB0aGlzIGNhbGN1bGF0aW9uIGlzIGZyb20gY29tcC5sYW5nLmMgZmFxICovCisjZGVmaW5lIE1BWF9MT05HX0xFTiAoKHNpemVvZiAobG9uZykgKiA4ICsgMikgLyAzICsgMSkgIC8qICsxIGZvciAnLScgKi8KKyAgaW50IG9yaWdfbGVuOworICBpbnQgaTsKKyAgY2hhciAqYnVmOworICAKKyAgb3JpZ19sZW4gPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoc3RyKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19sZW5ndGhlbiAoc3RyLCBNQVhfTE9OR19MRU4pKQorICAgIHJldHVybiBGQUxTRTsKKworICBidWYgPSBfZGJ1c19zdHJpbmdfZ2V0X2RhdGFfbGVuIChzdHIsIG9yaWdfbGVuLCBNQVhfTE9OR19MRU4pOworCisgIHNucHJpbnRmIChidWYsIE1BWF9MT05HX0xFTiwgIiVsZCIsIHZhbHVlKTsKKworICBpID0gMDsKKyAgd2hpbGUgKCpidWYpCisgICAgeworICAgICAgKytidWY7CisgICAgICArK2k7CisgICAgfQorICAKKyAgX2RidXNfc3RyaW5nX3Nob3J0ZW4gKHN0ciwgTUFYX0xPTkdfTEVOIC0gaSk7CisgIAorICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBBcHBlbmRzIGFuIHVuc2lnbmVkIGludGVnZXIgdG8gYSBEQnVzU3RyaW5nLgorICogCisgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcKKyAqIEBwYXJhbSB2YWx1ZSB0aGUgaW50ZWdlciB2YWx1ZQorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vdCBlbm91Z2ggbWVtb3J5IG9yIG90aGVyIGZhaWx1cmUuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zdHJpbmdfYXBwZW5kX3VpbnQgKERCdXNTdHJpbmcgICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgdmFsdWUpCit7CisgIC8qIHRoaXMgaXMgd3JvbmcsIGJ1dCBkZWZpbml0ZWx5IG9uIHRoZSBoaWdoIHNpZGUuICovCisjZGVmaW5lIE1BWF9VTE9OR19MRU4gKE1BWF9MT05HX0xFTiAqIDIpCisgIGludCBvcmlnX2xlbjsKKyAgaW50IGk7CisgIGNoYXIgKmJ1ZjsKKyAgCisgIG9yaWdfbGVuID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHN0cik7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfbGVuZ3RoZW4gKHN0ciwgTUFYX1VMT05HX0xFTikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGJ1ZiA9IF9kYnVzX3N0cmluZ19nZXRfZGF0YV9sZW4gKHN0ciwgb3JpZ19sZW4sIE1BWF9VTE9OR19MRU4pOworCisgIHNucHJpbnRmIChidWYsIE1BWF9VTE9OR19MRU4sICIlbHUiLCB2YWx1ZSk7CisKKyAgaSA9IDA7CisgIHdoaWxlICgqYnVmKQorICAgIHsKKyAgICAgICsrYnVmOworICAgICAgKytpOworICAgIH0KKyAgCisgIF9kYnVzX3N0cmluZ19zaG9ydGVuIChzdHIsIE1BWF9VTE9OR19MRU4gLSBpKTsKKyAgCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIFBhcnNlcyBhbiBpbnRlZ2VyIGNvbnRhaW5lZCBpbiBhIERCdXNTdHJpbmcuIEVpdGhlciByZXR1cm4gcGFyYW1ldGVyCisgKiBtYXkgYmUgI05VTEwgaWYgeW91IGFyZW4ndCBpbnRlcmVzdGVkIGluIGl0LiBUaGUgaW50ZWdlciBpcyBwYXJzZWQKKyAqIGFuZCBzdG9yZWQgaW4gdmFsdWVfcmV0dXJuLiBSZXR1cm4gcGFyYW1ldGVycyBhcmUgbm90IGluaXRpYWxpemVkCisgKiBpZiB0aGUgZnVuY3Rpb24gcmV0dXJucyAjRkFMU0UuCisgKgorICogQHBhcmFtIHN0ciB0aGUgc3RyaW5nCisgKiBAcGFyYW0gc3RhcnQgdGhlIGJ5dGUgaW5kZXggb2YgdGhlIHN0YXJ0IG9mIHRoZSBpbnRlZ2VyCisgKiBAcGFyYW0gdmFsdWVfcmV0dXJuIHJldHVybiBsb2NhdGlvbiBvZiB0aGUgaW50ZWdlciB2YWx1ZSBvciAjTlVMTAorICogQHBhcmFtIGVuZF9yZXR1cm4gcmV0dXJuIGxvY2F0aW9uIG9mIHRoZSBlbmQgb2YgdGhlIGludGVnZXIsIG9yICNOVUxMCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19zdHJpbmdfcGFyc2VfaW50IChjb25zdCBEQnVzU3RyaW5nICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgICAgICAgICAgICAgKnZhbHVlX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgKmVuZF9yZXR1cm4pCit7CisgIGxvbmcgdjsKKyAgY29uc3QgY2hhciAqcDsKKyAgY2hhciAqZW5kOworCisgIHAgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuIChzdHIsIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHN0cikgLSBzdGFydCk7CisKKyAgZW5kID0gTlVMTDsKKyAgX2RidXNfc2V0X2Vycm5vX3RvX3plcm8gKCk7CisgIHYgPSBzdHJ0b2wgKHAsICZlbmQsIDApOworICBpZiAoZW5kID09IE5VTEwgfHwgZW5kID09IHAgfHwgZXJybm8gIT0gMCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKHZhbHVlX3JldHVybikKKyAgICAqdmFsdWVfcmV0dXJuID0gdjsKKyAgaWYgKGVuZF9yZXR1cm4pCisgICAgKmVuZF9yZXR1cm4gPSBzdGFydCArIChlbmQgLSBwKTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBQYXJzZXMgYW4gdW5zaWduZWQgaW50ZWdlciBjb250YWluZWQgaW4gYSBEQnVzU3RyaW5nLiBFaXRoZXIgcmV0dXJuCisgKiBwYXJhbWV0ZXIgbWF5IGJlICNOVUxMIGlmIHlvdSBhcmVuJ3QgaW50ZXJlc3RlZCBpbiBpdC4gVGhlIGludGVnZXIKKyAqIGlzIHBhcnNlZCBhbmQgc3RvcmVkIGluIHZhbHVlX3JldHVybi4gUmV0dXJuIHBhcmFtZXRlcnMgYXJlIG5vdAorICogaW5pdGlhbGl6ZWQgaWYgdGhlIGZ1bmN0aW9uIHJldHVybnMgI0ZBTFNFLgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZworICogQHBhcmFtIHN0YXJ0IHRoZSBieXRlIGluZGV4IG9mIHRoZSBzdGFydCBvZiB0aGUgaW50ZWdlcgorICogQHBhcmFtIHZhbHVlX3JldHVybiByZXR1cm4gbG9jYXRpb24gb2YgdGhlIGludGVnZXIgdmFsdWUgb3IgI05VTEwKKyAqIEBwYXJhbSBlbmRfcmV0dXJuIHJldHVybiBsb2NhdGlvbiBvZiB0aGUgZW5kIG9mIHRoZSBpbnRlZ2VyLCBvciAjTlVMTAorICogQHJldHVybnMgI1RSVUUgb24gc3VjY2VzcworICovCitkYnVzX2Jvb2xfdAorX2RidXNfc3RyaW5nX3BhcnNlX3VpbnQgKGNvbnN0IERCdXNTdHJpbmcgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgICp2YWx1ZV9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAqZW5kX3JldHVybikKK3sKKyAgdW5zaWduZWQgbG9uZyB2OworICBjb25zdCBjaGFyICpwOworICBjaGFyICplbmQ7CisKKyAgcCA9IF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YV9sZW4gKHN0ciwgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoc3RyKSAtIHN0YXJ0KTsKKworICBlbmQgPSBOVUxMOworICBfZGJ1c19zZXRfZXJybm9fdG9femVybyAoKTsKKyAgdiA9IHN0cnRvdWwgKHAsICZlbmQsIDApOworICBpZiAoZW5kID09IE5VTEwgfHwgZW5kID09IHAgfHwgZXJybm8gIT0gMCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKHZhbHVlX3JldHVybikKKyAgICAqdmFsdWVfcmV0dXJuID0gdjsKKyAgaWYgKGVuZF9yZXR1cm4pCisgICAgKmVuZF9yZXR1cm4gPSBzdGFydCArIChlbmQgLSBwKTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyoqIEB9ICovIC8qIERCdXNTdHJpbmcgZ3JvdXAgKi8KKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzSW50ZXJuYWxzVXRpbHMKKyAqIEB7CisgKi8KKworLyoqCisgKiBGaWxscyBuX2J5dGVzIG9mIHRoZSBnaXZlbiBidWZmZXIgd2l0aCByYW5kb20gYnl0ZXMuCisgKgorICogQHBhcmFtIGJ1ZmZlciBhbiBhbGxvY2F0ZWQgYnVmZmVyCisgKiBAcGFyYW0gbl9ieXRlcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIGJ1ZmZlciB0byB3cml0ZSB0bworICogQHBhcmFtIGVycm9yIGxvY2F0aW9uIHRvIHN0b3JlIHJlYXNvbiBmb3IgZmFpbHVyZQorICogQHJldHVybnMgI1RSVUUgb24gc3VjY2VzcworICovCitkYnVzX2Jvb2xfdAorX2RidXNfZ2VuZXJhdGVfcmFuZG9tX2J5dGVzX2J1ZmZlciAoY2hhciAgICAgICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgIG5fYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgKmVycm9yKQoreworICBEQnVzU3RyaW5nIHN0cjsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmc3RyKSkKKyAgICB7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghX2RidXNfZ2VuZXJhdGVfcmFuZG9tX2J5dGVzICgmc3RyLCBuX2J5dGVzLCBlcnJvcikpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZzdHIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBfZGJ1c19zdHJpbmdfY29weV90b19idWZmZXIgKCZzdHIsIGJ1ZmZlciwgbl9ieXRlcyk7CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZzdHIpOworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgdGhlIGdpdmVuIG51bWJlciBvZiByYW5kb20gYnl0ZXMsIHdoZXJlIHRoZSBieXRlcyBhcmUKKyAqIGNob3NlbiBmcm9tIHRoZSBhbHBoYW51bWVyaWMgQVNDSUkgc3Vic2V0LgorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZworICogQHBhcmFtIG5fYnl0ZXMgdGhlIG51bWJlciBvZiByYW5kb20gQVNDSUkgYnl0ZXMgdG8gYXBwZW5kIHRvIHN0cmluZworICogQHBhcmFtIGVycm9yIGxvY2F0aW9uIHRvIHN0b3JlIHJlYXNvbiBmb3IgZmFpbHVyZQorICogQHJldHVybnMgI1RSVUUgb24gc3VjY2VzcywgI0ZBTFNFIGlmIG5vIG1lbW9yeSBvciBvdGhlciBmYWlsdXJlCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19nZW5lcmF0ZV9yYW5kb21fYXNjaWkgKERCdXNTdHJpbmcgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgbl9ieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAqZXJyb3IpCit7CisgIHN0YXRpYyBjb25zdCBjaGFyIGxldHRlcnNbXSA9CisgICAgIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IjsKKyAgaW50IGk7CisgIGludCBsZW47CisgIAorICBpZiAoIV9kYnVzX2dlbmVyYXRlX3JhbmRvbV9ieXRlcyAoc3RyLCBuX2J5dGVzLCBlcnJvcikpCisgICAgcmV0dXJuIEZBTFNFOworICAKKyAgbGVuID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKHN0cik7CisgIGkgPSBsZW4gLSBuX2J5dGVzOworICB3aGlsZSAoaSA8IGxlbikKKyAgICB7CisgICAgICBfZGJ1c19zdHJpbmdfc2V0X2J5dGUgKHN0ciwgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0dGVyc1tfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKHN0ciwgaSkgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplb2YgKGxldHRlcnMpIC0gMSldKTsKKworICAgICAgKytpOworICAgIH0KKworICBfZGJ1c19hc3NlcnQgKF9kYnVzX3N0cmluZ192YWxpZGF0ZV9hc2NpaSAoc3RyLCBsZW4gLSBuX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbl9ieXRlcykpOworCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIENvbnZlcnRzIGEgVU5JWCBlcnJubywgb3IgV2luZG93cyBlcnJubyBvciBXaW5Tb2NrIGVycm9yIHZhbHVlIGludG8KKyAqIGEgI0RCdXNFcnJvciBuYW1lLgorICoKKyAqIEB0b2RvIHNob3VsZCBjb3ZlciBtb3JlIGVycm5vcywgc3BlY2lmaWNhbGx5IHRob3NlCisgKiBmcm9tIG9wZW4oKS4KKyAqIAorICogQHBhcmFtIGVycm9yX251bWJlciB0aGUgZXJybm8uCisgKiBAcmV0dXJucyBhbiBlcnJvciBuYW1lCisgKi8KK2NvbnN0IGNoYXIqCitfZGJ1c19lcnJvcl9mcm9tX2Vycm5vIChpbnQgZXJyb3JfbnVtYmVyKQoreworICBzd2l0Y2ggKGVycm9yX251bWJlcikKKyAgICB7CisgICAgY2FzZSAwOgorICAgICAgcmV0dXJuIERCVVNfRVJST1JfRkFJTEVEOworICAgICAgCisjaWZkZWYgRVBST1RPTk9TVVBQT1JUCisgICAgY2FzZSBFUFJPVE9OT1NVUFBPUlQ6CisgICAgICByZXR1cm4gREJVU19FUlJPUl9OT1RfU1VQUE9SVEVEOworI2VsaWYgZGVmaW5lZChXU0FFUFJPVE9OT1NVUFBPUlQpCisgICAgY2FzZSBXU0FFUFJPVE9OT1NVUFBPUlQ6CisgICAgICByZXR1cm4gREJVU19FUlJPUl9OT1RfU1VQUE9SVEVEOworI2VuZGlmCisjaWZkZWYgRUFGTk9TVVBQT1JUCisgICAgY2FzZSBFQUZOT1NVUFBPUlQ6CisgICAgICByZXR1cm4gREJVU19FUlJPUl9OT1RfU1VQUE9SVEVEOworI2VsaWYgZGVmaW5lZChXU0FFQUZOT1NVUFBPUlQpCisgICAgY2FzZSBXU0FFQUZOT1NVUFBPUlQ6CisgICAgICByZXR1cm4gREJVU19FUlJPUl9OT1RfU1VQUE9SVEVEOworI2VuZGlmCisjaWZkZWYgRU5GSUxFCisgICAgY2FzZSBFTkZJTEU6CisgICAgICByZXR1cm4gREJVU19FUlJPUl9MSU1JVFNfRVhDRUVERUQ7IC8qIGtlcm5lbCBvdXQgb2YgbWVtb3J5ICovCisjZW5kaWYKKyNpZmRlZiBFTUZJTEUKKyAgICBjYXNlIEVNRklMRToKKyAgICAgIHJldHVybiBEQlVTX0VSUk9SX0xJTUlUU19FWENFRURFRDsKKyNlbmRpZgorI2lmZGVmIEVBQ0NFUworICAgIGNhc2UgRUFDQ0VTOgorICAgICAgcmV0dXJuIERCVVNfRVJST1JfQUNDRVNTX0RFTklFRDsKKyNlbmRpZgorI2lmZGVmIEVQRVJNCisgICAgY2FzZSBFUEVSTToKKyAgICAgIHJldHVybiBEQlVTX0VSUk9SX0FDQ0VTU19ERU5JRUQ7CisjZW5kaWYKKyNpZmRlZiBFTk9CVUZTCisgICAgY2FzZSBFTk9CVUZTOgorICAgICAgcmV0dXJuIERCVVNfRVJST1JfTk9fTUVNT1JZOworI2VuZGlmCisjaWZkZWYgRU5PTUVNCisgICAgY2FzZSBFTk9NRU06CisgICAgICByZXR1cm4gREJVU19FUlJPUl9OT19NRU1PUlk7CisjZW5kaWYKKyNpZmRlZiBFQ09OTlJFRlVTRUQKKyAgICBjYXNlIEVDT05OUkVGVVNFRDoKKyAgICAgIHJldHVybiBEQlVTX0VSUk9SX05PX1NFUlZFUjsKKyNlbGlmIGRlZmluZWQoV1NBRUNPTk5SRUZVU0VEKQorICAgIGNhc2UgV1NBRUNPTk5SRUZVU0VEOgorICAgICAgcmV0dXJuIERCVVNfRVJST1JfTk9fU0VSVkVSOworI2VuZGlmCisjaWZkZWYgRVRJTUVET1VUCisgICAgY2FzZSBFVElNRURPVVQ6CisgICAgICByZXR1cm4gREJVU19FUlJPUl9USU1FT1VUOworI2VsaWYgZGVmaW5lZChXU0FFVElNRURPVVQpCisgICAgY2FzZSBXU0FFVElNRURPVVQ6CisgICAgICByZXR1cm4gREJVU19FUlJPUl9USU1FT1VUOworI2VuZGlmCisjaWZkZWYgRU5FVFVOUkVBQ0gKKyAgICBjYXNlIEVORVRVTlJFQUNIOgorICAgICAgcmV0dXJuIERCVVNfRVJST1JfTk9fTkVUV09SSzsKKyNlbGlmIGRlZmluZWQoV1NBRU5FVFVOUkVBQ0gpCisgICAgY2FzZSBXU0FFTkVUVU5SRUFDSDoKKyAgICAgIHJldHVybiBEQlVTX0VSUk9SX05PX05FVFdPUks7CisjZW5kaWYKKyNpZmRlZiBFQUREUklOVVNFCisgICAgY2FzZSBFQUREUklOVVNFOgorICAgICAgcmV0dXJuIERCVVNfRVJST1JfQUREUkVTU19JTl9VU0U7CisjZWxpZiBkZWZpbmVkKFdTQUVBRERSSU5VU0UpCisgICAgY2FzZSBXU0FFQUREUklOVVNFOgorICAgICAgcmV0dXJuIERCVVNfRVJST1JfQUREUkVTU19JTl9VU0U7CisjZW5kaWYKKyNpZmRlZiBFRVhJU1QKKyAgICBjYXNlIEVFWElTVDoKKyAgICAgIHJldHVybiBEQlVTX0VSUk9SX0ZJTEVfRVhJU1RTOworI2VuZGlmCisjaWZkZWYgRU5PRU5UCisgICAgY2FzZSBFTk9FTlQ6CisgICAgICByZXR1cm4gREJVU19FUlJPUl9GSUxFX05PVF9GT1VORDsKKyNlbmRpZgorICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gREJVU19FUlJPUl9GQUlMRUQ7CisgICAgfQorfQorCisvKioKKyAqIENvbnZlcnRzIHRoZSBjdXJyZW50IHN5c3RlbSBlcnJubyB2YWx1ZSBpbnRvIGEgI0RCdXNFcnJvciBuYW1lLgorICoKKyAqIEByZXR1cm5zIGFuIGVycm9yIG5hbWUKKyAqLworY29uc3QgY2hhcioKK19kYnVzX2Vycm9yX2Zyb21fc3lzdGVtX2Vycm5vICh2b2lkKQoreworICByZXR1cm4gX2RidXNfZXJyb3JfZnJvbV9lcnJubyAoZXJybm8pOworfQorCisvKioKKyAqIEFzc2lnbiAwIHRvIHRoZSBnbG9iYWwgZXJybm8gdmFyaWFibGUKKyAqLwordm9pZAorX2RidXNfc2V0X2Vycm5vX3RvX3plcm8gKHZvaWQpCit7CisjaWZkZWYgREJVU19XSU5DRQorICBTZXRMYXN0RXJyb3IgKDApOworI2Vsc2UKKyAgZXJybm8gPSAwOworI2VuZGlmCit9CisKKy8qKgorICogU2VlIGlmIGVycm5vIGlzIEVOT01FTQorICogQHJldHVybnMgI1RSVUUgaWYgZSA9PSBFTk9NRU0KKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2dldF9pc19lcnJub19lbm9tZW0gKGludCBlKQoreworICByZXR1cm4gZSA9PSBFTk9NRU07Cit9CisKKy8qKgorICogU2VlIGlmIGVycm5vIGlzIEVJTlRSCisgKiBAcmV0dXJucyAjVFJVRSBpZiBlID09IEVJTlRSCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19nZXRfaXNfZXJybm9fZWludHIgKGludCBlKQoreworICByZXR1cm4gZSA9PSBFSU5UUjsKK30KKworLyoqCisgKiBTZWUgaWYgZXJybm8gaXMgRVBJUEUKKyAqIEByZXR1cm5zICNUUlVFIGlmIGVycm5vID09IEVQSVBFCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19nZXRfaXNfZXJybm9fZXBpcGUgKGludCBlKQoreworICByZXR1cm4gZSA9PSBFUElQRTsKK30KKworLyoqCisgKiBTZWUgaWYgZXJybm8gaXMgRVRPT01BTllSRUZTCisgKiBAcmV0dXJucyAjVFJVRSBpZiBlcnJubyA9PSBFVE9PTUFOWVJFRlMKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2dldF9pc19lcnJub19ldG9vbWFueXJlZnMgKGludCBlKQoreworI2lmZGVmIEVUT09NQU5ZUkVGUworICByZXR1cm4gZSA9PSBFVE9PTUFOWVJFRlM7CisjZWxzZQorICByZXR1cm4gRkFMU0U7CisjZW5kaWYKK30KKworLyoqCisgKiBHZXQgZXJyb3IgbWVzc2FnZSBmcm9tIGVycm5vCisgKiBAcmV0dXJucyBfZGJ1c19zdHJlcnJvcihlcnJubykKKyAqLworY29uc3QgY2hhcioKK19kYnVzX3N0cmVycm9yX2Zyb21fZXJybm8gKHZvaWQpCit7CisgIHJldHVybiBfZGJ1c19zdHJlcnJvciAoZXJybm8pOworfQorCisvKioKKyAqIExvZyBhIG1lc3NhZ2UgdG8gdGhlIHN5c3RlbSBsb2cgZmlsZSAoZS5nLiBzeXNsb2cgb24gVW5peCkgYW5kL29yIHN0ZGVyci4KKyAqCisgKiBAcGFyYW0gc2V2ZXJpdHkgYSBzZXZlcml0eSB2YWx1ZQorICogQHBhcmFtIG1zZyBhIHByaW50Zi1zdHlsZSBmb3JtYXQgc3RyaW5nCisgKi8KK3ZvaWQKK19kYnVzX2xvZyAoREJ1c1N5c3RlbUxvZ1NldmVyaXR5ICBzZXZlcml0eSwKKyAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgICAgICptc2csCisgICAgICAgICAgIC4uLikKK3sKKyAgdmFfbGlzdCBhcmdzOworCisgIHZhX3N0YXJ0IChhcmdzLCBtc2cpOworCisgIF9kYnVzX2xvZ3YgKHNldmVyaXR5LCBtc2csIGFyZ3MpOworCisgIHZhX2VuZCAoYXJncyk7Cit9CisKKy8qKiBAfSBlbmQgb2Ygc3lzZGVwcyAqLworCisvKiB0ZXN0cyBpbiBkYnVzLXN5c2RlcHMtdXRpbC5jICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtc3lzZGVwcy5oIGIvZGJ1cy9kYnVzLXN5c2RlcHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGZiZWM2Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLXN5c2RlcHMuaApAQCAtMCwwICsxLDcyNSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXN5c2RlcHMuaCBXcmFwcGVycyBhcm91bmQgc3lzdGVtL2xpYmMgZmVhdHVyZXMgKGludGVybmFsIHRvIEQtQnVzIGltcGxlbWVudGF0aW9uKQorICogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMgIFJlZCBIYXQsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwMyBDb2RlRmFjdG9yeSBBQgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaWZuZGVmIERCVVNfU1lTREVQU19ICisjZGVmaW5lIERCVVNfU1lTREVQU19ICisKKyNpZm5kZWYgVkVSU0lPTgorI3dhcm5pbmcgUGxlYXNlIGluY2x1ZGUgY29uZmlnLmggYmVmb3JlIGRidXMtc3lzZGVwcy5oCisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2lmZGVmIEhBVkVfU1RESU5UX0gKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9JTlRUWVBFU19ICisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWVycm9ycy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1maWxlLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXN0cmluZy5oPgorCisvKiB0aGlzIGlzIHBlcmhhcHMgYm9ndXMsIGJ1dCBzdHJjbXAoKSBldGMuIGFyZSBmYXN0ZXIgaWYgd2UgdXNlIHRoZQorICogc3R1ZmYgc3RyYWlnaHQgb3V0IG9mIHN0cmluZy5oLCBzbyBoYXZlIHRoaXMgaGVyZSBmb3Igbm93LgorICovCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKyNpZiAhZGVmaW5lZChCUk9LRU5fUE9MTCkgJiYgKGRlZmluZWQoX19BUFBMRV9fKSB8fCBkZWZpbmVkKF9fSU5URVJJWCkpCisgIC8qIEZvbGxvd2luZyBsaWJjdXJsJ3MgZXhhbXBsZSwgd2UgYmxhY2tsaXN0IHBvbGwoKSBvbiBEYXJ3aW4KKyAgICogKG1hY09TLCBpT1MsIGV0Yy4pIGFuZCBJbnRlcml4IGR1ZSB0byBhIGhpc3Rvcnkgb2YgaW1wbGVtZW50YXRpb24KKyAgICogaXNzdWVzLgorICAgKiBodHRwczovL2dpdGh1Yi5jb20vY3VybC9jdXJsL2Jsb2IvbWFzdGVyL200L2N1cmwtZnVuY3Rpb25zLm00CisgICAqCisgICAqIE9uIHVuc3BlY2lmaWVkIG9sZGVyIG1hY09TIHZlcnNpb25zLCBwb2xsKCkgZmFpbGVkIGlmIGdpdmVuIGEKKyAgICogZGV2aWNlIG5vZGUgdG8gcG9sbC4KKyAgICoKKyAgICogT24gbWFjT1MgPCAxMC45LCBwb2xsKCkgd2l0aCBuZmRzPTAgZmFpbGVkIGluc3RlYWQgb2Ygd2FpdGluZyBmb3IKKyAgICogdGhlIHRpbWVvdXQgYW5kIHRoZW4gc3VjY2VlZGluZy4KKyAgICoKKyAgICogT24gbWFjT1MgPj0gMTAuMTIsIHBvbGwoKSB3aXRoIG5mZHM9MCBzdWNjZWVkZWQgaW1tZWRpYXRlbHkKKyAgICogaW5zdGVhZCBvZiB3YWl0aW5nIGZvciB0aGUgdGltZW91dCwgcmVzdWx0aW5nIGluIGJ1c3ktbG9vcGluZy4KKyAgICoKKyAgICogT24gSW50ZXJpeCwgcG9sbCgpIGFwcGFyZW50bHkgb25seSB3b3JrcyBmb3IgZmlsZXMgaW4gL3Byb2MuCisgICAqCisgICAqIFRoZSAibGVnYWN5IiBidWlsZCBmbGF2b3VyIGluIG91ciBDSSBtYWNoaW5lcnkgZGVmaW5lcyBCUk9LRU5fUE9MTAorICAgKiBvbiB3aGF0ZXZlciBwbGF0Zm9ybSBpcyBpbiB1c2UgKG5vcm1hbGx5IExpbnV4KSB0byBmb3JjZSB1c2Ugb2YgdGhlCisgICAqIHNhbWUgc2VsZWN0KCktYmFzZWQgcG9sbCgpIGVtdWxhdGlvbiB0aGF0IHdlIHVzZSBmb3IgbWFjT1MsIEludGVyaXgsCisgICAqIGFuZCBhbnkgcGxhdGZvcm0gdGhhdCBsYWNrcyBhIHJlYWwgcG9sbCgpLCBzbyB0aGF0IHdlIGNhbiB0ZXN0IGl0CisgICAqIG1vcmUgcmVndWxhcmx5LgorICAgKi8KKyMgZGVmaW5lIEJST0tFTl9QT0xMCisjZW5kaWYKKworLyogQUlYIHN5cy9wb2xsLmggZG9lcyAjZGVmaW5lIGV2ZW50cyByZXFldmVudHMsIGFuZCBvdGhlcgorICogd29uZGVyb3VzbmVzcywgc28gbXVzdCBpbmNsdWRlIHN5cy9wb2xsIGJlZm9yZSBkZWNsYXJpbmcKKyAqIERCdXNQb2xsRkQKKyAqLyAKKyNpZmRlZiBIQVZFX1BPTEwKKyNpbmNsdWRlIDxzeXMvcG9sbC5oPgorI2VuZGlmCisKKyNpZmRlZiBEQlVTX1dJTkNFCisvKiBXaW5kb3dzIENFIGxhY2tzIHNvbWUgc3lzdGVtIGZ1bmN0aW9ucyAoc3VjaCBhcyBlcnJubyBhbmQgY2xvY2spLgorICAgV2UgYnJpbmcgdGhlbSBpbiBoZXJlLiAgKi8KKyNpbmNsdWRlICJkYnVzLXN5c2RlcHMtd2luY2UtZ2x1ZS5oIgorI2VuZGlmCisKKyNpZmRlZiBEQlVTX1dJTgorI2luY2x1ZGUgPHdzMnRjcGlwLmg+CisjZW5kaWYKKworREJVU19CRUdJTl9ERUNMUworCisjaWZkZWYgREJVU19XSU4KKyNkZWZpbmUgX0RCVVNfUEFUSF9TRVBBUkFUT1IgIjsiCisjZWxzZQorI2RlZmluZSBfREJVU19QQVRIX1NFUEFSQVRPUiAiOiIKKyNlbmRpZgorCisvKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyAqLworCisKKy8qKiBBbiBvcGFxdWUgbGlzdCB0eXBlICovCit0eXBlZGVmIHN0cnVjdCBEQnVzTGlzdCBEQnVzTGlzdDsKKworLyoqIE9iamVjdCB0aGF0IGNvbnRhaW5zIGEgbGlzdCBvZiBjcmVkZW50aWFscyBzdWNoIGFzIFVOSVggb3IgV2luZG93cyB1c2VyIElEICovCit0eXBlZGVmIHN0cnVjdCBEQnVzQ3JlZGVudGlhbHMgREJ1c0NyZWRlbnRpYWxzOworCisvKiogQSB3cmFwcGVyIGFyb3VuZCBhIHBpcGUgZGVzY3JpcHRvciBvciBoYW5kbGUgKi8KK3R5cGVkZWYgc3RydWN0IERCdXNQaXBlIERCdXNQaXBlOworCisvKioKKyAqIEBhZGR0b2dyb3VwIERCdXNTeXNkZXBzCisgKgorICogQHsKKyAqLworCitEQlVTX1BSSVZBVEVfRVhQT1JUCit2b2lkIF9kYnVzX2Fib3J0ICh2b2lkKSBfREJVU19HTlVDX05PUkVUVVJOOworCitkYnVzX2Jvb2xfdCBfZGJ1c19jaGVja19zZXR1aWQgKHZvaWQpOworREJVU19QUklWQVRFX0VYUE9SVAorY29uc3QgY2hhciogX2RidXNfZ2V0ZW52IChjb25zdCBjaGFyICp2YXJuYW1lKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90IF9kYnVzX2NsZWFyZW52ICh2b2lkKTsKK2NoYXIgKiogICAgIF9kYnVzX2dldF9lbnZpcm9ubWVudCAodm9pZCk7CisKKy8qKiBBIHByb2Nlc3MgSUQgKi8KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBkYnVzX3BpZF90OworLyoqIEEgdXNlciBJRCAqLwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGRidXNfdWlkX3Q7CisvKiogQSBncm91cCBJRCAqLwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGRidXNfZ2lkX3Q7CisKKy8qKiBhbiBpbnZhbGlkIFBJRCB1c2VkIHRvIHJlcHJlc2VudCBhbiB1bmluaXRpYWxpemVkIGRidXNfcGlkX3QgZmllbGQgKi8KKyNkZWZpbmUgREJVU19QSURfVU5TRVQgKChkYnVzX3BpZF90KSAtMSkKKy8qKiBhbiBpbnZhbGlkIFVJRCB1c2VkIHRvIHJlcHJlc2VudCBhbiB1bmluaXRpYWxpemVkIGRidXNfdWlkX3QgZmllbGQgKi8KKyNkZWZpbmUgREJVU19VSURfVU5TRVQgKChkYnVzX3VpZF90KSAtMSkKKy8qKiBhbiBpbnZhbGlkIEdJRCB1c2VkIHRvIHJlcHJlc2VudCBhbiB1bmluaXRpYWxpemVkIGRidXNfZ2lkX3QgZmllbGQgKi8KKyNkZWZpbmUgREJVU19HSURfVU5TRVQgKChkYnVzX2dpZF90KSAtMSkKKworLyoqIGFuIGFwcHJvcHJpYXRlIHByaW50ZiBmb3JtYXQgZm9yIGRidXNfcGlkX3QgKi8KKyNkZWZpbmUgREJVU19QSURfRk9STUFUICIlbHUiCisvKiogYW4gYXBwcm9wcmlhdGUgcHJpbnRmIGZvcm1hdCBmb3IgZGJ1c191aWRfdCAqLworI2RlZmluZSBEQlVTX1VJRF9GT1JNQVQgIiVsdSIKKy8qKiBhbiBhcHByb3ByaWF0ZSBwcmludGYgZm9ybWF0IGZvciBkYnVzX2dpZF90ICovCisjZGVmaW5lIERCVVNfR0lEX0ZPUk1BVCAiJWx1IgorCisvKioKKyAqIFNvY2tldCBpbnRlcmZhY2UKKyAqLworI2lmZGVmIERCVVNfV0lOCisKK3R5cGVkZWYgc3RydWN0IHsgU09DS0VUIHNvY2s7IH0gREJ1c1NvY2tldDsKKyMgZGVmaW5lIERCVVNfU09DS0VUX0ZPUk1BVCAiSXUiCisjIGRlZmluZSBEQlVTX1NPQ0tFVF9JTklUIHsgSU5WQUxJRF9TT0NLRVQgfQorCitzdGF0aWMgaW5saW5lIFNPQ0tFVAorX2RidXNfc29ja2V0X3ByaW50YWJsZSAoREJ1c1NvY2tldCBzKSB7IHJldHVybiBzLnNvY2s7IH0KKworc3RhdGljIGlubGluZSBkYnVzX2Jvb2xfdAorX2RidXNfc29ja2V0X2lzX3ZhbGlkIChEQnVzU29ja2V0IHMpIHsgcmV0dXJuIHMuc29jayAhPSBJTlZBTElEX1NPQ0tFVDsgfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK19kYnVzX3NvY2tldF9pbnZhbGlkYXRlIChEQnVzU29ja2V0ICpzKSB7IHMtPnNvY2sgPSBJTlZBTElEX1NPQ0tFVDsgfQorCitzdGF0aWMgaW5saW5lIGludAorX2RidXNfc29ja2V0X2dldF9pbnQgKERCdXNTb2NrZXQgcykgeyByZXR1cm4gKGludClzLnNvY2s7IH0KKworI2Vsc2UgLyogbm90IERCVVNfV0lOICovCisKK3R5cGVkZWYgc3RydWN0IHsgaW50IGZkOyB9IERCdXNTb2NrZXQ7CisjIGRlZmluZSBEQlVTX1NPQ0tFVF9GT1JNQVQgImQiCisjIGRlZmluZSBEQlVTX1NPQ0tFVF9JTklUIHsgLTEgfQorCitzdGF0aWMgaW5saW5lIGludAorX2RidXNfc29ja2V0X3ByaW50YWJsZSAoREJ1c1NvY2tldCBzKSB7IHJldHVybiBzLmZkOyB9CisKK3N0YXRpYyBpbmxpbmUgZGJ1c19ib29sX3QKK19kYnVzX3NvY2tldF9pc192YWxpZCAoREJ1c1NvY2tldCBzKSB7IHJldHVybiBzLmZkID49IDA7IH0KKworc3RhdGljIGlubGluZSB2b2lkCitfZGJ1c19zb2NrZXRfaW52YWxpZGF0ZSAoREJ1c1NvY2tldCAqcykgeyBzLT5mZCA9IC0xOyB9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfZGJ1c19zb2NrZXRfZ2V0X2ludCAoREJ1c1NvY2tldCBzKSB7IHJldHVybiBzLmZkOyB9CisKKyNlbmRpZiAvKiBub3QgREJVU19XSU4gKi8KKworc3RhdGljIGlubGluZSBEQnVzU29ja2V0CitfZGJ1c19zb2NrZXRfZ2V0X2ludmFsaWQgKHZvaWQpCit7CisgIERCdXNTb2NrZXQgcyA9IERCVVNfU09DS0VUX0lOSVQ7CisKKyAgcmV0dXJuIHM7Cit9CisKK2RidXNfYm9vbF90IF9kYnVzX3NldF9zb2NrZXRfbm9uYmxvY2tpbmcgKERCdXNTb2NrZXQgICAgICBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICplcnJvcik7CisKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90IF9kYnVzX2Nsb3NlX3NvY2tldCAgICAgKERCdXNTb2NrZXQgICAgICAgIGZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpOworREJVU19QUklWQVRFX0VYUE9SVAoraW50ICAgICAgICAgX2RidXNfcmVhZF9zb2NrZXQgICAgICAoREJ1c1NvY2tldCAgICAgICAgZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBjb3VudCk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitpbnQgICAgICAgICBfZGJ1c193cml0ZV9zb2NrZXQgICAgIChEQnVzU29ja2V0ICAgICAgICBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgbGVuKTsKK2ludCAgICAgICAgIF9kYnVzX3dyaXRlX3NvY2tldF90d28gKERCdXNTb2NrZXQgICAgICAgIGZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqYnVmZmVyMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHN0YXJ0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGxlbjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpidWZmZXIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgc3RhcnQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgbGVuMik7CisKK2ludCBfZGJ1c19yZWFkX3NvY2tldF93aXRoX3VuaXhfZmRzICAgICAgKERCdXNTb2NrZXQgICAgICAgIGZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICpmZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgICAgICpuX2Zkcyk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitpbnQgX2RidXNfd3JpdGVfc29ja2V0X3dpdGhfdW5peF9mZHMgICAgIChEQnVzU29ja2V0ICAgICAgICBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICAgICAgICAqZmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgbl9mZHMpOworaW50IF9kYnVzX3dyaXRlX3NvY2tldF93aXRoX3VuaXhfZmRzX3R3byAoREJ1c1NvY2tldCAgICAgICAgZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICpidWZmZXIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgc3RhcnQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgbGVuMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmJ1ZmZlcjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBzdGFydDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBsZW4yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICAgICAgICAqZmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgbl9mZHMpOworCitEQnVzU29ja2V0IF9kYnVzX2Nvbm5lY3RfdGNwX3NvY2tldCAgKGNvbnN0IGNoYXIgICAgICpob3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKmZhbWlseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKTsKK0RCdXNTb2NrZXQgX2RidXNfY29ubmVjdF90Y3Bfc29ja2V0X3dpdGhfbm9uY2UgIChjb25zdCBjaGFyICAgICAqaG9zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqZmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpub25jZWZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgKmVycm9yKTsKK2ludCBfZGJ1c19saXN0ZW5fdGNwX3NvY2tldCAgIChjb25zdCBjaGFyICAgICAqaG9zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqZmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICpyZXRwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTb2NrZXQgICAgKipmZHNfcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpOworREJ1c1NvY2tldCBfZGJ1c19hY2NlcHQgICAgICAgKERCdXNTb2NrZXQgICAgICBsaXN0ZW5fZmQpOworCitkYnVzX2Jvb2xfdCBfZGJ1c19yZWFkX2NyZWRlbnRpYWxzX3NvY2tldCAoREJ1c1NvY2tldCAgICAgICAgY2xpZW50X2ZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDcmVkZW50aWFscyAgKmNyZWRlbnRpYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKTsKK2RidXNfYm9vbF90IF9kYnVzX3NlbmRfY3JlZGVudGlhbHNfc29ja2V0IChEQnVzU29ja2V0ICAgICAgIHNlcnZlcl9mZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgKmVycm9yKTsKKworZGJ1c19ib29sX3QgX2RidXNfY3JlZGVudGlhbHNfYWRkX2Zyb21fdXNlciAgICAgICAgICAgIChEQnVzQ3JlZGVudGlhbHMgICpjcmVkZW50aWFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqdXNlcm5hbWUpOworZGJ1c19ib29sX3QgX2RidXNfY3JlZGVudGlhbHNfYWRkX2Zyb21fY3VycmVudF9wcm9jZXNzIChEQnVzQ3JlZGVudGlhbHMgICpjcmVkZW50aWFscyk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCBfZGJ1c19hcHBlbmRfdXNlcl9mcm9tX2N1cnJlbnRfcHJvY2VzcyAgICAgKERCdXNTdHJpbmcgICAgICAgICpzdHIpOworCitkYnVzX2Jvb2xfdCBfZGJ1c19wYXJzZV91bml4X3VzZXJfZnJvbV9jb25maWcgICAoY29uc3QgREJ1c1N0cmluZyAgKnVzZXJuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWlkX3QgICAgICAgICp1aWRfcCk7CitkYnVzX2Jvb2xfdCBfZGJ1c19wYXJzZV91bml4X2dyb3VwX2Zyb21fY29uZmlnICAoY29uc3QgREJ1c1N0cmluZyAgKmdyb3VwbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2dpZF90ICAgICAgICAqZ2lkX3ApOworZGJ1c19ib29sX3QgX2RidXNfdW5peF9ncm91cHNfZnJvbV91aWQgICAgICAgICAgKGRidXNfdWlkX3QgICAgICAgICB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19naWRfdCAgICAgICAqKmdyb3VwX2lkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAqbl9ncm91cF9pZHMpOworZGJ1c19ib29sX3QgX2RidXNfdW5peF91c2VyX2lzX2F0X2NvbnNvbGUgICAgICAgKGRidXNfdWlkX3QgICAgICAgICB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgKmVycm9yKTsKK2RidXNfYm9vbF90IF9kYnVzX3VuaXhfdXNlcl9pc19wcm9jZXNzX293bmVyICAgIChkYnVzX3VpZF90ICAgICAgICAgdWlkKTsKK2RidXNfYm9vbF90IF9kYnVzX3dpbmRvd3NfdXNlcl9pc19wcm9jZXNzX293bmVyIChjb25zdCBjaGFyICAgICAgICAqd2luZG93c19zaWQpOworCitkYnVzX2Jvb2xfdCBfZGJ1c19hcHBlbmRfa2V5cmluZ19kaXJlY3RvcnlfZm9yX2NyZWRlbnRpYWxzIChEQnVzU3RyaW5nICAgICAgKmRpcmVjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDcmVkZW50aWFscyAqY3JlZGVudGlhbHMpOworCitkYnVzX2Jvb2xfdCBfZGJ1c19kYWVtb25faXNfc2Vzc2lvbl9idXNfYWRkcmVzc19wdWJsaXNoZWQgKGNvbnN0IGNoYXIgKnNjb3BlKTsKKworZGJ1c19ib29sX3QgX2RidXNfZGFlbW9uX3B1Ymxpc2hfc2Vzc2lvbl9idXNfYWRkcmVzcyAoY29uc3QgY2hhciogYWRkcmVzcywgY29uc3QgY2hhciogc2htX25hbWUpOworCit2b2lkIF9kYnVzX2RhZW1vbl91bnB1Ymxpc2hfc2Vzc2lvbl9idXNfYWRkcmVzcyAodm9pZCk7CisKK2RidXNfYm9vbF90IF9kYnVzX3NvY2tldF9jYW5fcGFzc191bml4X2ZkKERCdXNTb2NrZXQgZmQpOworCisvKiogT3BhcXVlIHR5cGUgcmVwcmVzZW50aW5nIGFuIGF0b21pY2FsbHktbW9kaWZpYWJsZSBpbnRlZ2VyCisgKiB0aGF0IGNhbiBiZSB1c2VkIGZyb20gbXVsdGlwbGUgdGhyZWFkcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgREJ1c0F0b21pYyBEQnVzQXRvbWljOworCisvKioKKyAqIEFuIGF0b21pYyBpbnRlZ2VyIHNhZmUgdG8gaW5jcmVtZW50IG9yIGRlY3JlbWVudCBmcm9tIG11bHRpcGxlIHRocmVhZHMuCisgKi8KK3N0cnVjdCBEQnVzQXRvbWljCit7CisjaWZkZWYgREJVU19XSU4KKyAgdm9sYXRpbGUgbG9uZyB2YWx1ZTsgLyoqPCBWYWx1ZSBvZiB0aGUgYXRvbWljIGludGVnZXIuICovCisjZWxzZQorICB2b2xhdGlsZSBkYnVzX2ludDMyX3QgdmFsdWU7IC8qKjwgVmFsdWUgb2YgdGhlIGF0b21pYyBpbnRlZ2VyLiAqLworI2VuZGlmCit9OworCitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2ludDMyX3QgX2RidXNfYXRvbWljX2luYyAoREJ1c0F0b21pYyAqYXRvbWljKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfaW50MzJfdCBfZGJ1c19hdG9taWNfZGVjIChEQnVzQXRvbWljICphdG9taWMpOworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19pbnQzMl90IF9kYnVzX2F0b21pY19nZXQgKERCdXNBdG9taWMgKmF0b21pYyk7CisKKyNpZmRlZiBEQlVTX1dJTgorCisvKiBPbiBXaW5kb3dzLCB5b3UgY2FuIG9ubHkgcG9sbCBzb2NrZXRzLiBXZSBlbXVsYXRlIFVuaXggcG9sbCgpIHVzaW5nCisgKiBzZWxlY3QoKSwgc28gaXQgZG9lc24ndCBtYXR0ZXIgd2hhdCBwcmVjaXNlIHR5cGUgd2UgcHV0IGluIERCdXNQb2xsRkQ7CisgKiB1c2UgREJ1c1NvY2tldCBzbyB0aGF0IHRoZSBjb21waWxlciBjYW4gY2hlY2sgd2UgYXJlIGRvaW5nIGl0IHJpZ2h0LgorICovCit0eXBlZGVmIERCdXNTb2NrZXQgREJ1c1BvbGxhYmxlOworIyBkZWZpbmUgREJVU19QT0xMQUJMRV9GT1JNQVQgIkl1IgorCitzdGF0aWMgaW5saW5lIERCdXNQb2xsYWJsZQorX2RidXNfc29ja2V0X2dldF9wb2xsYWJsZSAoREJ1c1NvY2tldCBzKSB7IHJldHVybiBzOyB9CisKK3N0YXRpYyBpbmxpbmUgU09DS0VUCitfZGJ1c19wb2xsYWJsZV9wcmludGFibGUgKERCdXNQb2xsYWJsZSBwKSB7IHJldHVybiBwLnNvY2s7IH0KKworc3RhdGljIGlubGluZSBkYnVzX2Jvb2xfdAorX2RidXNfcG9sbGFibGVfaXNfdmFsaWQgKERCdXNQb2xsYWJsZSBwKSB7IHJldHVybiBfZGJ1c19zb2NrZXRfaXNfdmFsaWQgKHApOyB9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX2RidXNfcG9sbGFibGVfaW52YWxpZGF0ZSAoREJ1c1BvbGxhYmxlICpwKSB7IF9kYnVzX3NvY2tldF9pbnZhbGlkYXRlIChwKTsgfQorCitzdGF0aWMgaW5saW5lIGRidXNfYm9vbF90CitfZGJ1c19wb2xsYWJsZV9lcXVhbHMgKERCdXNQb2xsYWJsZSBhLCBEQnVzUG9sbGFibGUgYikgeyByZXR1cm4gYS5zb2NrID09IGIuc29jazsgfQorCisjZWxzZSAvKiAhREJVU19XSU4gKi8KKworLyogT24gVW5peCwgeW91IGNhbiBwb2xsIHNvY2tldHMsIHBpcGVzLCBldGMuLCBhbmQgd2UgbXVzdCBwdXQgZXhhY3RseQorICogImludCIgaW4gREJ1c1BvbGxGRCBiZWNhdXNlIHdlJ3JlIHJlbHlpbmcgb24gaXRzIGxheW91dCBleGFjdGx5IG1hdGNoaW5nCisgKiBzdHJ1Y3QgcG9sbGZkLiAoVGhpcyBpcyBzaWxseSwgYW5kIG9uZSBkYXkgd2Ugc2hvdWxkIHVzZSBhIGJldHRlcgorICogYWJzdHJhY3Rpb24uKQorICovCit0eXBlZGVmIGludCBEQnVzUG9sbGFibGU7CisjIGRlZmluZSBEQlVTX1BPTExBQkxFX0ZPUk1BVCAiZCIKKworc3RhdGljIGlubGluZSBEQnVzUG9sbGFibGUKK19kYnVzX3NvY2tldF9nZXRfcG9sbGFibGUgKERCdXNTb2NrZXQgcykgeyByZXR1cm4gcy5mZDsgfQorCitzdGF0aWMgaW5saW5lIGludAorX2RidXNfcG9sbGFibGVfcHJpbnRhYmxlIChEQnVzUG9sbGFibGUgcCkgeyByZXR1cm4gcDsgfQorCitzdGF0aWMgaW5saW5lIGRidXNfYm9vbF90CitfZGJ1c19wb2xsYWJsZV9pc192YWxpZCAoREJ1c1BvbGxhYmxlIHApIHsgcmV0dXJuIHAgPj0gMDsgfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK19kYnVzX3BvbGxhYmxlX2ludmFsaWRhdGUgKERCdXNQb2xsYWJsZSAqcCkgeyAqcCA9IC0xOyB9CisKK3N0YXRpYyBpbmxpbmUgZGJ1c19ib29sX3QKK19kYnVzX3BvbGxhYmxlX2VxdWFscyAoREJ1c1BvbGxhYmxlIGEsIERCdXNQb2xsYWJsZSBiKSB7IHJldHVybiBhID09IGI7IH0KKworI2VuZGlmIC8qICFEQlVTX1dJTiAqLworCisjaWYgZGVmaW5lZChIQVZFX1BPTEwpICYmICFkZWZpbmVkKEJST0tFTl9QT0xMKQorLyoqCisgKiBBIHBvcnRhYmxlIHN0cnVjdCBwb2xsZmQgd3JhcHBlciwgb3IgYW4gZW11bGF0aW9uIG9mIHN0cnVjdCBwb2xsZmQKKyAqIG9uIHBsYXRmb3JtcyB3aGVyZSBwb2xsKCkgaXMgbWlzc2luZyBvciBicm9rZW4uCisgKi8KK3R5cGVkZWYgc3RydWN0IHBvbGxmZCBEQnVzUG9sbEZEOworCisvKiogVGhlcmUgaXMgZGF0YSB0byByZWFkICovCisjZGVmaW5lIF9EQlVTX1BPTExJTiAgICAgIFBPTExJTgorLyoqIFRoZXJlIGlzIHVyZ2VudCBkYXRhIHRvIHJlYWQgKi8KKyNkZWZpbmUgX0RCVVNfUE9MTFBSSSAgICAgUE9MTFBSSQorLyoqIFdyaXRpbmcgbm93IHdpbGwgbm90IGJsb2NrICovCisjZGVmaW5lIF9EQlVTX1BPTExPVVQgICAgIFBPTExPVVQKKy8qKiBFcnJvciBjb25kaXRpb24gKi8KKyNkZWZpbmUgX0RCVVNfUE9MTEVSUiAgICAgUE9MTEVSUgorLyoqIEh1bmcgdXAgKi8KKyNkZWZpbmUgX0RCVVNfUE9MTEhVUCAgICAgUE9MTEhVUAorLyoqIEludmFsaWQgcmVxdWVzdDogZmQgbm90IG9wZW4gKi8KKyNkZWZpbmUgX0RCVVNfUE9MTE5WQUwgICAgUE9MTE5WQUwKKyNlbHNlCisvKiBFbXVsYXRlIHBvbGwoKSB2aWEgc2VsZWN0KCkuIEJlY2F1c2Ugd2UgYXJlbid0IHJlYWxseSBnb2luZyB0byBjYWxsCisgKiBwb2xsKCksIGFueSBzaW1pbGFybHktc2hhcGVkIHN0cnVjdCBpcyBhY2NlcHRhYmxlLCBhbmQgYW55IHBvd2VyIG9mIDIKKyAqIHdpbGwgZG8gZm9yIHRoZSBldmVudHMvcmV2ZW50czsgdGhlc2UgdmFsdWVzIGhhcHBlbiB0byBtYXRjaCBMaW51eAorICogYW5kICpCU0QuICovCit0eXBlZGVmIHN0cnVjdAoreworICBEQnVzUG9sbGFibGUgZmQ7ICAgLyoqPCBGaWxlIGRlc2NyaXB0b3IgKi8KKyAgc2hvcnQgZXZlbnRzOyAgICAgIC8qKjwgRXZlbnRzIHRvIHBvbGwgZm9yICovCisgIHNob3J0IHJldmVudHM7ICAgICAvKio8IEV2ZW50cyB0aGF0IG9jY3VycmVkICovCit9IERCdXNQb2xsRkQ7CisKKy8qKiBUaGVyZSBpcyBkYXRhIHRvIHJlYWQgKi8KKyNkZWZpbmUgX0RCVVNfUE9MTElOICAgICAgMHgwMDAxCisvKiogVGhlcmUgaXMgdXJnZW50IGRhdGEgdG8gcmVhZCAqLworI2RlZmluZSBfREJVU19QT0xMUFJJICAgICAweDAwMDIKKy8qKiBXcml0aW5nIG5vdyB3aWxsIG5vdCBibG9jayAqLworI2RlZmluZSBfREJVU19QT0xMT1VUICAgICAweDAwMDQKKy8qKiBFcnJvciBjb25kaXRpb24gKi8KKyNkZWZpbmUgX0RCVVNfUE9MTEVSUiAgICAgMHgwMDA4CisvKiogSHVuZyB1cCAqLworI2RlZmluZSBfREJVU19QT0xMSFVQICAgICAweDAwMTAKKy8qKiBJbnZhbGlkIHJlcXVlc3Q6IGZkIG5vdCBvcGVuICovCisjZGVmaW5lIF9EQlVTX1BPTExOVkFMICAgIDB4MDAyMAorI2VuZGlmCisKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2ludCBfZGJ1c19wb2xsIChEQnVzUG9sbEZEICpmZHMsCisgICAgICAgICAgICAgICAgaW50ICAgICAgICAgbl9mZHMsCisgICAgICAgICAgICAgICAgaW50ICAgICAgICAgdGltZW91dF9taWxsaXNlY29uZHMpOworCitEQlVTX1BSSVZBVEVfRVhQT1JUCit2b2lkIF9kYnVzX3NsZWVwX21pbGxpc2Vjb25kcyAoaW50IG1pbGxpc2Vjb25kcyk7CisKK0RCVVNfUFJJVkFURV9FWFBPUlQKK3ZvaWQgX2RidXNfZ2V0X21vbm90b25pY190aW1lIChsb25nICp0dl9zZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyAqdHZfdXNlYyk7CisKK0RCVVNfUFJJVkFURV9FWFBPUlQKK3ZvaWQgX2RidXNfZ2V0X3JlYWxfdGltZSAobG9uZyAqdHZfc2VjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nICp0dl91c2VjKTsKKworLyoqCisgKiBkaXJlY3RvcnkgaW50ZXJmYWNlCisgKi8KK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90ICAgIF9kYnVzX2NyZWF0ZV9kaXJlY3RvcnkgICAgICAgIChjb25zdCBEQnVzU3RyaW5nICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcik7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCAgICBfZGJ1c19lbnN1cmVfZGlyZWN0b3J5ICAgICAgICAoY29uc3QgREJ1c1N0cmluZyAqZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpOworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgICAgX2RidXNfZGVsZXRlX2RpcmVjdG9yeSAgICAgICAgKGNvbnN0IERCdXNTdHJpbmcgKmZpbGVuYW1lLAorCQkJCQkgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcik7CisKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90IF9kYnVzX2NvbmNhdF9kaXJfYW5kX2ZpbGUgKERCdXNTdHJpbmcgICAgICAgKmRpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKm5leHRfY29tcG9uZW50KTsKK2RidXNfYm9vbF90IF9kYnVzX3N0cmluZ19nZXRfZGlybmFtZSAgKGNvbnN0IERCdXNTdHJpbmcgKmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAqZGlybmFtZSk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCBfZGJ1c19wYXRoX2lzX2Fic29sdXRlICAgIChjb25zdCBEQnVzU3RyaW5nICpmaWxlbmFtZSk7CisKK2RidXNfYm9vbF90IF9kYnVzX2dldF9zdGFuZGFyZF9zZXNzaW9uX3NlcnZpY2VkaXJzIChEQnVzTGlzdCAqKmRpcnMpOworZGJ1c19ib29sX3QgX2RidXNfZ2V0X3N0YW5kYXJkX3N5c3RlbV9zZXJ2aWNlZGlycyAoREJ1c0xpc3QgKipkaXJzKTsKK2RidXNfYm9vbF90IF9kYnVzX3NldF91cF90cmFuc2llbnRfc2Vzc2lvbl9zZXJ2aWNlZGlycyAoREJ1c0xpc3QgICoqZGlycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAqZXJyb3IpOworCitkYnVzX2Jvb2xfdCBfZGJ1c19nZXRfc3lzdGVtX2NvbmZpZ19maWxlICAoREJ1c1N0cmluZyAqc3RyKTsKK2RidXNfYm9vbF90IF9kYnVzX2dldF9zZXNzaW9uX2NvbmZpZ19maWxlIChEQnVzU3RyaW5nICpzdHIpOworCisvKiogT3BhcXVlIHR5cGUgZm9yIHJlYWRpbmcgYSBkaXJlY3RvcnkgbGlzdGluZyAqLwordHlwZWRlZiBzdHJ1Y3QgREJ1c0Rpckl0ZXIgREJ1c0Rpckl0ZXI7CisKK0RCdXNEaXJJdGVyKiBfZGJ1c19kaXJlY3Rvcnlfb3BlbiAgICAgICAgICAoY29uc3QgREJ1c1N0cmluZyAqZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKTsKK2RidXNfYm9vbF90ICBfZGJ1c19kaXJlY3RvcnlfZ2V0X25leHRfZmlsZSAoREJ1c0Rpckl0ZXIgICAgICAqaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICAgICAqZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKTsKK3ZvaWQgICAgICAgICBfZGJ1c19kaXJlY3RvcnlfY2xvc2UgICAgICAgICAoREJ1c0Rpckl0ZXIgICAgICAqaXRlcik7CisKK2RidXNfYm9vbF90ICBfZGJ1c19jaGVja19kaXJfaXNfcHJpdmF0ZV90b191c2VyICAgIChEQnVzU3RyaW5nICpkaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICplcnJvcik7CisKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2NvbnN0IGNoYXIqIF9kYnVzX2dldF90bXBkaXIgICAgICAodm9pZCk7CisKKy8qKgorICogUmFuZG9tIG51bWJlcnMgCisgKi8KK19EQlVTX0dOVUNfV0FSTl9VTlVTRURfUkVTVUxUCitkYnVzX2Jvb2xfdCBfZGJ1c19nZW5lcmF0ZV9yYW5kb21fYnl0ZXNfYnVmZmVyIChjaGFyICAgICAgICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICBuX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAqZXJyb3IpOworZGJ1c19ib29sX3QgX2RidXNfZ2VuZXJhdGVfcmFuZG9tX2J5dGVzICAgICAgICAoREJ1c1N0cmluZyAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgbl9ieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgKmVycm9yKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90IF9kYnVzX2dlbmVyYXRlX3JhbmRvbV9hc2NpaSAgICAgICAgKERCdXNTdHJpbmcgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIG5fYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICplcnJvcik7CisKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2NvbnN0IGNoYXIqIF9kYnVzX2Vycm9yX2Zyb21fZXJybm8gKGludCBlcnJvcl9udW1iZXIpOworREJVU19QUklWQVRFX0VYUE9SVAorY29uc3QgY2hhciogX2RidXNfZXJyb3JfZnJvbV9zeXN0ZW1fZXJybm8gKHZvaWQpOworCitpbnQgICAgICAgICBfZGJ1c19zYXZlX3NvY2tldF9lcnJubyAgICAgICAgICAgICAgICAgICh2b2lkKTsKK3ZvaWQgICAgICAgIF9kYnVzX3Jlc3RvcmVfc29ja2V0X2Vycm5vICAgICAgICAgICAgICAgKGludCBzYXZlZF9lcnJubyk7Cit2b2lkICAgICAgICBfZGJ1c19zZXRfZXJybm9fdG9femVybyAgICAgICAgICAgICAgICAgICh2b2lkKTsKK2RidXNfYm9vbF90IF9kYnVzX2dldF9pc19lcnJub19lYWdhaW5fb3JfZXdvdWxkYmxvY2sgKGludCBlKTsKK2RidXNfYm9vbF90IF9kYnVzX2dldF9pc19lcnJub19lbm9tZW0gICAgICAgICAgICAgICAgKGludCBlKTsKK2RidXNfYm9vbF90IF9kYnVzX2dldF9pc19lcnJub19laW50ciAgICAgICAgICAgICAgICAgKGludCBlKTsKK2RidXNfYm9vbF90IF9kYnVzX2dldF9pc19lcnJub19lcGlwZSAgICAgICAgICAgICAgICAgKGludCBlKTsKK2RidXNfYm9vbF90IF9kYnVzX2dldF9pc19lcnJub19ldG9vbWFueXJlZnMgICAgICAgICAgKGludCBlKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2NvbnN0IGNoYXIqIF9kYnVzX3N0cmVycm9yX2Zyb21fZXJybm8gICAgICAgICAgICAgICAgKHZvaWQpOworCit2b2lkIF9kYnVzX2Rpc2FibGVfc2lncGlwZSAodm9pZCk7CisKK0RCVVNfUFJJVkFURV9FWFBPUlQKK3ZvaWQgX2RidXNfZXhpdCAoaW50IGNvZGUpIF9EQlVTX0dOVUNfTk9SRVRVUk47CisKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2ludCBfZGJ1c19wcmludGZfc3RyaW5nX3VwcGVyX2JvdW5kIChjb25zdCBjaGFyICpmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCBhcmdzKSBfREJVU19HTlVDX1BSSU5URiAoMSwgMCk7CisKKyNpZmRlZiBEQlVTX0VOQUJMRV9WRVJCT1NFX01PREUKK0RCVVNfUFJJVkFURV9FWFBPUlQKK3ZvaWQgX2RidXNfcHJpbnRfdGhyZWFkICh2b2lkKTsKKyNlbmRpZgorCisvKioKKyAqIFBvcnRhYmxlIHN0cnVjdCB3aXRoIHN0YXQoKSByZXN1bHRzCisgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVuc2lnbmVkIGxvbmcgbW9kZTsgIC8qKjwgRmlsZSBtb2RlICovCisgIHVuc2lnbmVkIGxvbmcgbmxpbms7IC8qKjwgTnVtYmVyIG9mIGhhcmQgbGlua3MgKi8KKyAgZGJ1c191aWRfdCAgICB1aWQ7ICAgLyoqPCBVc2VyIG93bmluZyBmaWxlICovCisgIGRidXNfZ2lkX3QgICAgZ2lkOyAgIC8qKjwgR3JvdXAgb3duaW5nIGZpbGUgKi8KKyAgdW5zaWduZWQgbG9uZyBzaXplOyAgLyoqPCBTaXplIG9mIGZpbGUgKi8KKyAgdW5zaWduZWQgbG9uZyBhdGltZTsgLyoqPCBBY2Nlc3MgdGltZSAqLworICB1bnNpZ25lZCBsb25nIG10aW1lOyAvKio8IE1vZGlmeSB0aW1lICovCisgIHVuc2lnbmVkIGxvbmcgY3RpbWU7IC8qKjwgQ3JlYXRpb24gdGltZSAqLworfSBEQnVzU3RhdDsKKworZGJ1c19ib29sX3QgX2RidXNfc3RhdCAgICAgICAgICAgICAoY29uc3QgREJ1c1N0cmluZyAqZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RhdCAgICAgICAgICpzdGF0YnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpOworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgX2RidXNfc29ja2V0cGFpciAoREJ1c1NvY2tldCAgICAgICAqZmQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1NvY2tldCAgICAgICAqZmQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgYmxvY2tpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcik7CisKK0RCVVNfUFJJVkFURV9FWFBPUlQKK3ZvaWQgICAgICAgIF9kYnVzX3ByaW50X2JhY2t0cmFjZSAgKHZvaWQpOworCitkYnVzX2Jvb2xfdCBfZGJ1c19iZWNvbWVfZGFlbW9uICAgKGNvbnN0IERCdXNTdHJpbmcgKnBpZGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNQaXBlICAgICAgICAgKnByaW50X3BpZF9waXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAga2VlcF91bWFzayk7CisKK2RidXNfYm9vbF90IF9kYnVzX3ZlcmlmeV9kYWVtb25fdXNlciAgICAoY29uc3QgY2hhciAqdXNlcik7CitkYnVzX2Jvb2xfdCBfZGJ1c19jaGFuZ2VfdG9fZGFlbW9uX3VzZXIgKGNvbnN0IGNoYXIgKnVzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgKmVycm9yKTsKKworZGJ1c19ib29sX3QgX2RidXNfd3JpdGVfcGlkX3RvX2ZpbGVfYW5kX3BpcGUgKGNvbnN0IERCdXNTdHJpbmcgKnBpZGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1BpcGUgICAgICAgICAqcHJpbnRfcGlkX3BpcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19waWRfdCAgICAgICAgcGlkX3RvX3dyaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKTsKKworZGJ1c19ib29sX3QgX2RidXNfY29tbWFuZF9mb3JfcGlkICh1bnNpZ25lZCBsb25nICBwaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgbWF4X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAqZXJyb3IpOworCitkYnVzX2Jvb2xfdCBfZGJ1c191c2VyX2F0X2NvbnNvbGUgKGNvbnN0IGNoYXIgKnVzZXJuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICplcnJvcik7CisKK3R5cGVkZWYgZW51bSB7CisgIERCVVNfTE9HX0ZMQUdTX1NUREVSUiA9ICgxIDw8IDApLAorICBEQlVTX0xPR19GTEFHU19TWVNURU1fTE9HID0gKDEgPDwgMSkKK30gREJ1c0xvZ0ZsYWdzOworCitEQlVTX1BSSVZBVEVfRVhQT1JUCit2b2lkIF9kYnVzX2luaXRfc3lzdGVtX2xvZyAoY29uc3QgY2hhciAgICp0YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0xvZ0ZsYWdzICBmbGFncyk7CisKK3R5cGVkZWYgZW51bSB7CisgIERCVVNfU1lTVEVNX0xPR19JTkZPLAorICBEQlVTX1NZU1RFTV9MT0dfV0FSTklORywKKyAgREJVU19TWVNURU1fTE9HX1NFQ1VSSVRZLAorICBEQlVTX1NZU1RFTV9MT0dfRVJST1IKK30gREJ1c1N5c3RlbUxvZ1NldmVyaXR5OworCitEQlVTX1BSSVZBVEVfRVhQT1JUCit2b2lkIF9kYnVzX2xvZyAgKERCdXNTeXN0ZW1Mb2dTZXZlcml0eSAgc2V2ZXJpdHksCisgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICAgICAqbXNnLAorICAgICAgICAgICAgICAgICAuLi4pIF9EQlVTX0dOVUNfUFJJTlRGICgyLCAzKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK3ZvaWQgX2RidXNfbG9ndiAoREJ1c1N5c3RlbUxvZ1NldmVyaXR5ICBzZXZlcml0eSwKKyAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgICAgICptc2csCisgICAgICAgICAgICAgICAgIHZhX2xpc3QgYXJncykgX0RCVVNfR05VQ19QUklOVEYgKDIsIDApOworCisvKiBEZWZpbmUgREJVU19WQV9DT1BZKCkgdG8gZG8gdGhlIHJpZ2h0IHRoaW5nIGZvciBjb3B5aW5nIHZhX2xpc3QgdmFyaWFibGVzLgorICogY29uZmlnLmggbWF5IGhhdmUgYWxyZWFkeSBkZWZpbmVkIERCVVNfVkFfQ09QWSBhcyB2YV9jb3B5IG9yIF9fdmFfY29weS4KKyAqLworI2lmICFkZWZpbmVkIChEQlVTX1ZBX0NPUFkpCisjICBpZiBkZWZpbmVkIChfX0dOVUNfXykgJiYgZGVmaW5lZCAoX19QUENfXykgJiYgKGRlZmluZWQgKF9DQUxMX1NZU1YpIHx8IGRlZmluZWQgKF9XSU4zMikpCisjICAgIGRlZmluZSBEQlVTX1ZBX0NPUFkoYXAxLCBhcDIpICAgKCooYXAxKSA9ICooYXAyKSkKKyMgIGVsaWYgZGVmaW5lZCAoREJVU19WQV9DT1BZX0FTX0FSUkFZKQorIyAgICBkZWZpbmUgREJVU19WQV9DT1BZKGFwMSwgYXAyKSAgIG1lbWNweSAoKGFwMSksIChhcDIpLCBzaXplb2YgKHZhX2xpc3QpKQorIyAgZWxzZSAvKiB2YV9saXN0IGlzIGEgcG9pbnRlciAqLworIyAgICBkZWZpbmUgREJVU19WQV9DT1BZKGFwMSwgYXAyKSAgICgoYXAxKSA9IChhcDIpKQorIyAgZW5kaWYgLyogdmFfbGlzdCBpcyBhIHBvaW50ZXIgKi8KKyNlbmRpZiAvKiAhREJVU19WQV9DT1BZICovCisKKworLyoqCisgKiBDYXN0cyBhIHByaW1pdGl2ZSBDIHR5cGUgdG8gYSBieXRlIGFycmF5IGFuZCB0aGVuIGluZGV4ZXMKKyAqIGEgcGFydGljdWxhciBieXRlIG9mIHRoZSBhcnJheS4KKyAqLworI2RlZmluZSBfREJVU19CWVRFX09GX1BSSU1JVElWRShwLCBpKSBcCisgICAgKCgoY29uc3QgY2hhciopJihwKSlbKGkpXSkKKy8qKiBPbiB4ODYgdGhlcmUgaXMgYW4gODAtYml0IEZQVSwgYW5kIGlmIHlvdSBkbyAiYSA9PSBiIiBpdCBtYXkgaGF2ZSBhCisgKiBvciBiIGluIGFuIDgwLWJpdCByZWdpc3RlciwgdGh1cyBmYWlsaW5nIHRvIGNvbXBhcmUgdGhlIHR3byA2NC1iaXQKKyAqIGRvdWJsZXMgZm9yIGJpdHdpc2UgZXF1YWxpdHkuIFNvIHRoaXMgbWFjcm8gY29tcGFyZXMgdGhlIHR3byBkb3VibGVzCisgKiBiaXR3aXNlLgorICovCisjZGVmaW5lIF9EQlVTX0RPVUJMRVNfQklUV0lTRV9FUVVBTChhLCBiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKF9EQlVTX0JZVEVfT0ZfUFJJTUlUSVZFIChhLCAwKSA9PSBfREJVU19CWVRFX09GX1BSSU1JVElWRSAoYiwgMCkgJiYgICAgICAgXAorICAgICAgX0RCVVNfQllURV9PRl9QUklNSVRJVkUgKGEsIDEpID09IF9EQlVTX0JZVEVfT0ZfUFJJTUlUSVZFIChiLCAxKSAmJiAgICAgICBcCisgICAgICBfREJVU19CWVRFX09GX1BSSU1JVElWRSAoYSwgMikgPT0gX0RCVVNfQllURV9PRl9QUklNSVRJVkUgKGIsIDIpICYmICAgICAgIFwKKyAgICAgIF9EQlVTX0JZVEVfT0ZfUFJJTUlUSVZFIChhLCAzKSA9PSBfREJVU19CWVRFX09GX1BSSU1JVElWRSAoYiwgMykgJiYgICAgICAgXAorICAgICAgX0RCVVNfQllURV9PRl9QUklNSVRJVkUgKGEsIDQpID09IF9EQlVTX0JZVEVfT0ZfUFJJTUlUSVZFIChiLCA0KSAmJiAgICAgICBcCisgICAgICBfREJVU19CWVRFX09GX1BSSU1JVElWRSAoYSwgNSkgPT0gX0RCVVNfQllURV9PRl9QUklNSVRJVkUgKGIsIDUpICYmICAgICAgIFwKKyAgICAgIF9EQlVTX0JZVEVfT0ZfUFJJTUlUSVZFIChhLCA2KSA9PSBfREJVU19CWVRFX09GX1BSSU1JVElWRSAoYiwgNikgJiYgICAgICAgXAorICAgICAgX0RCVVNfQllURV9PRl9QUklNSVRJVkUgKGEsIDcpID09IF9EQlVTX0JZVEVfT0ZfUFJJTUlUSVZFIChiLCA3KSkKKworZGJ1c19ib29sX3QgX2RidXNfZ2V0X2F1dG9sYXVuY2hfYWRkcmVzcyAoY29uc3QgY2hhciAqc2NvcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICphZGRyZXNzLAorCQkJCQkgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAqZXJyb3IpOworCitkYnVzX2Jvb2xfdCBfZGJ1c19sb29rdXBfc2Vzc2lvbl9hZGRyZXNzIChkYnVzX2Jvb2xfdCAqc3VwcG9ydGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgKmFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAqZXJyb3IpOworCisvKiogVHlwZSByZXByZXNlbnRpbmcgYSB1bml2ZXJzYWxseSB1bmlxdWUgSUQKKyAqIEB0b2RvIHJlbmFtZSB0byBVVUlEIGluc3RlYWQgb2YgR1VJRAorICovCit0eXBlZGVmIHVuaW9uIERCdXNHVUlEIERCdXNHVUlEOworCitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCBfZGJ1c19yZWFkX2xvY2FsX21hY2hpbmVfdXVpZCAgIChEQnVzR1VJRCAgICAgICAgICptYWNoaW5lX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgY3JlYXRlX2lmX25vdF9mb3VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKTsKKworLyoqCisgKiBJbml0aWFsaXplIHRocmVhZHMgYXMgaW4gZGJ1c190aHJlYWRzX2luaXRfZGVmYXVsdCgpLCBhcHByb3ByaWF0ZWx5CisgKiBmb3IgdGhlIHBsYXRmb3JtLgorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdCBfZGJ1c190aHJlYWRzX2luaXRfcGxhdGZvcm1fc3BlY2lmaWMgKHZvaWQpOworCisvKioKKyAqIExvY2sgYSBzdGF0aWMgbXV0ZXggdXNlZCB0byBwcm90ZWN0IF9kYnVzX3RocmVhZHNfaW5pdF9wbGF0Zm9ybV9zcGVjaWZpYygpLgorICovCit2b2lkIF9kYnVzX3RocmVhZHNfbG9ja19wbGF0Zm9ybV9zcGVjaWZpYyAodm9pZCk7CisKKy8qKgorICogVW5kbyBfZGJ1c190aHJlYWRzX2xvY2tfcGxhdGZvcm1fc3BlY2lmaWMoKS4KKyAqLwordm9pZCBfZGJ1c190aHJlYWRzX3VubG9ja19wbGF0Zm9ybV9zcGVjaWZpYyAodm9pZCk7CisKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90IF9kYnVzX3NwbGl0X3BhdGhzX2FuZF9hcHBlbmQgKERCdXNTdHJpbmcgKmRpcnMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc3VmZml4LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNMaXN0ICoqZGlyX2xpc3QpOworCit1bnNpZ25lZCBsb25nIF9kYnVzX3BpZF9mb3JfbG9nICh2b2lkKTsKKworLyogRklYTUUgbW92ZSBiYWNrIHRvIGRidXMtc3lzZGVwcy11bml4LmggcHJvYmFibHkgLQorICogdGhlIFBJRCBmaWxlIGhhbmRsaW5nIGp1c3QgbmVlZHMgYSBsaXR0bGUgbW9yZSBhYnN0cmFjdGlvbgorICogaW4gdGhlIGJ1cyBkYWVtb24gZmlyc3QuCisgKi8KK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfcGlkX3QgICAgX2RidXNfZ2V0cGlkICh2b2lkKTsKKworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c191aWRfdCAgICBfZGJ1c19nZXR1aWQgKHZvaWQpOworCitEQlVTX1BSSVZBVEVfRVhQT1JUCit2b2lkIF9kYnVzX2ZsdXNoX2NhY2hlcyAodm9pZCk7CisKK2RidXNfYm9vbF90IF9kYnVzX3JlcGxhY2VfaW5zdGFsbF9wcmVmaXggKERCdXNTdHJpbmcgKnBhdGgpOworCisvKiBEbyBub3Qgc2V0IHRoaXMgdG9vIGhpZ2g6IGl0IGlzIGEgZGVuaWFsLW9mLXNlcnZpY2Ugcmlzay4KKyAqIFNlZSA8aHR0cHM6Ly9idWdzLmZyZWVkZXNrdG9wLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9ODI4MjA+CisgKgorICogKFRoaXMgbmVlZHMgdG8gYmUgaW4gdGhlIG5vbi1Vbml4LXNwZWNpZmljIGhlYWRlciBzbyB0aGF0CisgKiB0aGUgY29uZmlnLXBhcnNlciBjYW4gdXNlIGl0LikKKyAqLworI2RlZmluZSBEQlVTX0RFRkFVTFRfTUVTU0FHRV9VTklYX0ZEUyAxNgorCit0eXBlZGVmIHN0cnVjdCBEQnVzUkxpbWl0IERCdXNSTGltaXQ7CisKK0RCdXNSTGltaXQgICAgICpfZGJ1c19ybGltaXRfc2F2ZV9mZF9saW1pdCAgICAgICAgICAgICAgICAgKERCdXNFcnJvciAgICAqZXJyb3IpOworZGJ1c19ib29sX3QgICAgIF9kYnVzX3JsaW1pdF9yYWlzZV9mZF9saW1pdCAgICAgICAgICAgICAgICAoREJ1c0Vycm9yICAgICplcnJvcik7CitkYnVzX2Jvb2xfdCAgICAgX2RidXNfcmxpbWl0X3Jlc3RvcmVfZmRfbGltaXQgICAgICAgICAgICAgIChEQnVzUkxpbWl0ICAgKnNhdmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICplcnJvcik7Cit2b2lkICAgICAgICAgICAgX2RidXNfcmxpbWl0X2ZyZWUgICAgICAgICAgICAgICAgICAgICAgICAgIChEQnVzUkxpbWl0ICAgKmxpbSk7CisKKyNpZmRlZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworX0RCVVNfR05VQ19XQVJOX1VOVVNFRF9SRVNVTFQKK2RidXNfYm9vbF90IF9kYnVzX3Rlc3RfYXBwZW5kX2RpZmZlcmVudF91aWQgKERCdXNTdHJpbmcgKnVpZCk7CisKKyNpZmRlZiBEQlVTX1VOSVgKK19EQlVTX0dOVUNfV0FSTl9VTlVTRURfUkVTVUxUCitkYnVzX2Jvb2xfdCBfZGJ1c190ZXN0X2FwcGVuZF9kaWZmZXJlbnRfdXNlcm5hbWUgKERCdXNTdHJpbmcgKnVzZXJuYW1lKTsKKyNlbmRpZgorI2VuZGlmICAvKiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUyAqLworCisvKiogQH0gKi8KKworREJVU19FTkRfREVDTFMKKworCisjaWZkZWYgREJVU19XSU4KKyNpbmNsdWRlICJkYnVzLXN5c2RlcHMtd2luLmgiCisjZW5kaWYKKworI2VuZGlmIC8qIERCVVNfU1lTREVQU19IICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtdGVzdC1tYWluLmMgYi9kYnVzL2RidXMtdGVzdC1tYWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgwODhmOAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy10ZXN0LW1haW4uYwpAQCAtMCwwICsxLDY4IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtdGVzdC5jICBQcm9ncmFtIHRvIHJ1biBhbGwgdGVzdHMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgIFJlZCBIYXQgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLXR5cGVzLmgiCisjaW5jbHVkZSAiZGJ1cy10ZXN0LmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpZiBIQVZFX0xPQ0FMRV9ICisjaW5jbHVkZSA8bG9jYWxlLmg+CisjZW5kaWYKKworI2lmZGVmIERCVVNfVU5JWAorIyBpbmNsdWRlIDxkYnVzL2RidXMtc3lzZGVwcy11bml4Lmg+CisjZW5kaWYKKworaW50CittYWluIChpbnQgICAgYXJnYywKKyAgICAgIGNoYXIgKiphcmd2KQoreworICBjb25zdCBjaGFyICp0ZXN0X2RhdGFfZGlyOworICBjb25zdCBjaGFyICpzcGVjaWZpY190ZXN0OworCisjaWZkZWYgREJVU19VTklYCisgIC8qIGNsb3NlIGFueSBpbmhlcml0ZWQgZmRzIHNvIGRidXMtc3Bhd24ncyBjaGVjayBmb3IgY2xvc2Utb24tZXhlYyB3b3JrcyAqLworICBfZGJ1c19jbG9zZV9hbGwgKCk7CisjZW5kaWYKKworI2lmIEhBVkVfU0VUTE9DQUxFCisgIHNldGxvY2FsZShMQ19BTEwsICIiKTsKKyNlbmRpZgorICAKKyAgaWYgKGFyZ2MgPiAxICYmIHN0cmNtcCAoYXJndlsxXSwgIi0tdGFwIikgIT0gMCkKKyAgICB0ZXN0X2RhdGFfZGlyID0gYXJndlsxXTsKKyAgZWxzZQorICAgIHRlc3RfZGF0YV9kaXIgPSBOVUxMOworCisgIGlmIChhcmdjID4gMikKKyAgICBzcGVjaWZpY190ZXN0ID0gYXJndlsyXTsKKyAgZWxzZQorICAgIHNwZWNpZmljX3Rlc3QgPSBOVUxMOworICAKKyAgZGJ1c19pbnRlcm5hbF9kb19ub3RfdXNlX3J1bl90ZXN0cyAodGVzdF9kYXRhX2Rpciwgc3BlY2lmaWNfdGVzdCk7CisgIAorICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy10ZXN0LmMgYi9kYnVzL2RidXMtdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjMGQ3MWYKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtdGVzdC5jCkBAIC0wLDAgKzEsMTc1IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtdGVzdC5jICBQcm9ncmFtIHRvIHJ1biBhbGwgdGVzdHMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUgIFJlZCBIYXQgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiZGJ1cy10ZXN0LmgiCisjaW5jbHVkZSAiZGJ1cy1zeXNkZXBzLmgiCisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaWZkZWYgREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMKK3N0YXRpYyB2b2lkIGRpZSAoY29uc3QgY2hhciAqZmFpbHVyZSkgX0RCVVNfR05VQ19OT1JFVFVSTjsKKworc3RhdGljIHZvaWQKK2RpZSAoY29uc3QgY2hhciAqZmFpbHVyZSkKK3sKKyAgZnByaW50ZiAoc3RkZXJyLCAiVW5pdCB0ZXN0IGZhaWxlZDogJXNcbiIsIGZhaWx1cmUpOworICBleGl0ICgxKTsKK30KKworc3RhdGljIHZvaWQKK2NoZWNrX21lbWxlYWtzICh2b2lkKQoreworICBkYnVzX3NodXRkb3duICgpOworCisgIHByaW50ZiAoIiVzOiBjaGVja2luZyBmb3IgbWVtbGVha3NcbiIsICJ0ZXN0LWRidXMiKTsKKyAgaWYgKF9kYnVzX2dldF9tYWxsb2NfYmxvY2tzX291dHN0YW5kaW5nICgpICE9IDApCisgICAgeworICAgICAgX2RidXNfd2FybiAoIiVkIGRidXNfbWFsbG9jIGJsb2NrcyB3ZXJlIG5vdCBmcmVlZCIsCisgICAgICAgICAgICAgICAgICBfZGJ1c19nZXRfbWFsbG9jX2Jsb2Nrc19vdXRzdGFuZGluZyAoKSk7CisgICAgICBkaWUgKCJtZW1sZWFrcyIpOworICAgIH0KK30KKwordHlwZWRlZiBkYnVzX2Jvb2xfdCAoKlRlc3RGdW5jKSh2b2lkKTsKK3R5cGVkZWYgZGJ1c19ib29sX3QgKCpUZXN0RGF0YUZ1bmMpKGNvbnN0IGNoYXIgKmRhdGEpOworCitzdGF0aWMgdm9pZAorcnVuX3Rlc3QgKGNvbnN0IGNoYXIgICAgICAgICAgICAgKnRlc3RfbmFtZSwKKwkgIGNvbnN0IGNoYXIgICAgICAgICAgICAgKnNwZWNpZmljX3Rlc3QsCisJICBUZXN0RnVuYyAgICAgICAgICAgICAgICB0ZXN0KQoreworICBpZiAoIXNwZWNpZmljX3Rlc3QgfHwgc3RyY21wIChzcGVjaWZpY190ZXN0LCB0ZXN0X25hbWUpID09IDApCisgICAgeworICAgICAgcHJpbnRmICgiJXM6IHJ1bm5pbmcgJXMgdGVzdHNcbiIsICJ0ZXN0LWRidXMiLCB0ZXN0X25hbWUpOworICAgICAgaWYgKCF0ZXN0ICgpKQorCWRpZSAodGVzdF9uYW1lKTsKKworICAgICAgY2hlY2tfbWVtbGVha3MgKCk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorcnVuX2RhdGFfdGVzdCAoY29uc3QgY2hhciAgICAgICAgICAgICAqdGVzdF9uYW1lLAorCSAgICAgICBjb25zdCBjaGFyICAgICAgICAgICAgICpzcGVjaWZpY190ZXN0LAorCSAgICAgICBUZXN0RGF0YUZ1bmMgICAgICAgICAgICB0ZXN0LAorCSAgICAgICBjb25zdCBjaGFyICAgICAgICAgICAgICp0ZXN0X2RhdGFfZGlyKQoreworICBpZiAoIXNwZWNpZmljX3Rlc3QgfHwgc3RyY21wIChzcGVjaWZpY190ZXN0LCB0ZXN0X25hbWUpID09IDApCisgICAgeworICAgICAgcHJpbnRmICgiJXM6IHJ1bm5pbmcgJXMgdGVzdHNcbiIsICJ0ZXN0LWRidXMiLCB0ZXN0X25hbWUpOworICAgICAgaWYgKCF0ZXN0ICh0ZXN0X2RhdGFfZGlyKSkKKwlkaWUgKHRlc3RfbmFtZSk7CisKKyAgICAgIGNoZWNrX21lbWxlYWtzICgpOworICAgIH0KK30KKworI2VuZGlmIC8qIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTICovCisKKy8qKgorICogQW4gZXhwb3J0ZWQgc3ltYm9sIHRvIGJlIHJ1biBpbiBvcmRlciB0byBleGVjdXRlCisgKiB1bml0IHRlc3RzLiBTaG91bGQgbm90IGJlIHVzZWQgYnkKKyAqIGFueSBhcHAgb3RoZXIgdGhhbiBvdXIgdGVzdCBhcHAsIHRoaXMgc3ltYm9sCisgKiB3b24ndCBleGlzdCBpbiBzb21lIGJ1aWxkcyBvZiB0aGUgbGlicmFyeS4KKyAqICh3aXRoIC0tZW5hYmxlLXRlc3RzPW5vKQorICoKKyAqIEBwYXJhbSB0ZXN0X2RhdGFfZGlyIHRoZSBkaXJlY3Rvcnkgd2l0aCB0ZXN0IGRhdGEgKHRlc3QvZGF0YSBub3JtYWxseSkKKyAqIEBwYXJhbSBzcGVjaWZpY190ZXN0IHJ1biBzcGVjaWZpYyB0ZXN0IG9yICNOVUxMIHRvIHJ1biBhbGwgdGVzdHMKKyAqLwordm9pZAorZGJ1c19pbnRlcm5hbF9kb19ub3RfdXNlX3J1bl90ZXN0cyAoY29uc3QgY2hhciAqdGVzdF9kYXRhX2RpciwgY29uc3QgY2hhciAqc3BlY2lmaWNfdGVzdCkKK3sKKyNpZmRlZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworICBpZiAoIV9kYnVzX3RocmVhZHNfaW5pdF9kZWJ1ZyAoKSkKKyAgICBkaWUgKCJkZWJ1ZyB0aHJlYWRzIGluaXQiKTsKKyAgCisgIGlmICh0ZXN0X2RhdGFfZGlyID09IE5VTEwpCisgICAgdGVzdF9kYXRhX2RpciA9IF9kYnVzX2dldGVudiAoIkRCVVNfVEVTVF9EQVRBIik7CisKKyAgaWYgKHRlc3RfZGF0YV9kaXIgIT0gTlVMTCkKKyAgICBwcmludGYgKCJUZXN0IGRhdGEgaW4gJXNcbiIsIHRlc3RfZGF0YV9kaXIpOworICBlbHNlCisgICAgcHJpbnRmICgiTm8gdGVzdCBkYXRhIVxuIik7CisKKyAgcnVuX3Rlc3QgKCJzdHJpbmciLCBzcGVjaWZpY190ZXN0LCBfZGJ1c19zdHJpbmdfdGVzdCk7CisgIAorICBydW5fdGVzdCAoInN5c2RlcHMiLCBzcGVjaWZpY190ZXN0LCBfZGJ1c19zeXNkZXBzX3Rlc3QpOworICAKKyAgcnVuX3Rlc3QgKCJkYXRhLXNsb3QiLCBzcGVjaWZpY190ZXN0LCBfZGJ1c19kYXRhX3Nsb3RfdGVzdCk7CisKKyAgcnVuX3Rlc3QgKCJtaXNjIiwgc3BlY2lmaWNfdGVzdCwgX2RidXNfbWlzY190ZXN0KTsKKyAgCisgIHJ1bl90ZXN0ICgiYWRkcmVzcyIsIHNwZWNpZmljX3Rlc3QsIF9kYnVzX2FkZHJlc3NfdGVzdCk7CisKKyAgcnVuX3Rlc3QgKCJzZXJ2ZXIiLCBzcGVjaWZpY190ZXN0LCBfZGJ1c19zZXJ2ZXJfdGVzdCk7CisKKyAgcnVuX3Rlc3QgKCJvYmplY3QtdHJlZSIsIHNwZWNpZmljX3Rlc3QsIF9kYnVzX29iamVjdF90cmVlX3Rlc3QpOworCisgIHJ1bl90ZXN0ICgic2lnbmF0dXJlIiwgc3BlY2lmaWNfdGVzdCwgX2RidXNfc2lnbmF0dXJlX3Rlc3QpOworICAKKyAgcnVuX3Rlc3QgKCJtYXJzaGFsbGluZyIsIHNwZWNpZmljX3Rlc3QsIF9kYnVzX21hcnNoYWxfdGVzdCk7CisKKyAgcnVuX3Rlc3QgKCJtYXJzaGFsLXJlY3Vyc2l2ZSIsIHNwZWNpZmljX3Rlc3QsIF9kYnVzX21hcnNoYWxfcmVjdXJzaXZlX3Rlc3QpOworCisgIHJ1bl90ZXN0ICgiYnl0ZXN3YXAiLCBzcGVjaWZpY190ZXN0LCBfZGJ1c19tYXJzaGFsX2J5dGVzd2FwX3Rlc3QpOworICAKKyAgcnVuX3Rlc3QgKCJtZW1vcnkiLCBzcGVjaWZpY190ZXN0LCBfZGJ1c19tZW1vcnlfdGVzdCk7CisKKyNpZiAxCisgIHJ1bl90ZXN0ICgibWVtLXBvb2wiLCBzcGVjaWZpY190ZXN0LCBfZGJ1c19tZW1fcG9vbF90ZXN0KTsKKyNlbmRpZgorICAKKyAgcnVuX3Rlc3QgKCJsaXN0Iiwgc3BlY2lmaWNfdGVzdCwgX2RidXNfbGlzdF90ZXN0KTsKKworICBydW5fdGVzdCAoIm1hcnNoYWwtdmFsaWRhdGUiLCBzcGVjaWZpY190ZXN0LCBfZGJ1c19tYXJzaGFsX3ZhbGlkYXRlX3Rlc3QpOworCisgIHJ1bl9kYXRhX3Rlc3QgKCJtZXNzYWdlIiwgc3BlY2lmaWNfdGVzdCwgX2RidXNfbWVzc2FnZV90ZXN0LCB0ZXN0X2RhdGFfZGlyKTsKKyAgCisgIHJ1bl90ZXN0ICgiaGFzaCIsIHNwZWNpZmljX3Rlc3QsIF9kYnVzX2hhc2hfdGVzdCk7CisKKyNpZiAhZGVmaW5lZChEQlVTX1dJTkNFKQorICBydW5fZGF0YV90ZXN0ICgic3Bhd24iLCBzcGVjaWZpY190ZXN0LCBfZGJ1c19zcGF3bl90ZXN0LCB0ZXN0X2RhdGFfZGlyKTsKKyNlbmRpZgorICAKKyAgcnVuX2RhdGFfdGVzdCAoImNyZWRlbnRpYWxzIiwgc3BlY2lmaWNfdGVzdCwgX2RidXNfY3JlZGVudGlhbHNfdGVzdCwgdGVzdF9kYXRhX2Rpcik7CisKKyNpZmRlZiBEQlVTX1VOSVgKKyAgcnVuX2RhdGFfdGVzdCAoInVzZXJkYiIsIHNwZWNpZmljX3Rlc3QsIF9kYnVzX3VzZXJkYl90ZXN0LCB0ZXN0X2RhdGFfZGlyKTsKKworICBydW5fdGVzdCAoInRyYW5zcG9ydC11bml4Iiwgc3BlY2lmaWNfdGVzdCwgX2RidXNfdHJhbnNwb3J0X3VuaXhfdGVzdCk7CisjZW5kaWYKKyAgCisgIHJ1bl90ZXN0ICgia2V5cmluZyIsIHNwZWNpZmljX3Rlc3QsIF9kYnVzX2tleXJpbmdfdGVzdCk7CisKKyAgcnVuX2RhdGFfdGVzdCAoInNoYSIsIHNwZWNpZmljX3Rlc3QsIF9kYnVzX3NoYV90ZXN0LCB0ZXN0X2RhdGFfZGlyKTsKKyAgCisgIHJ1bl9kYXRhX3Rlc3QgKCJhdXRoIiwgc3BlY2lmaWNfdGVzdCwgX2RidXNfYXV0aF90ZXN0LCB0ZXN0X2RhdGFfZGlyKTsKKworICBwcmludGYgKCIlczogY29tcGxldGVkIHN1Y2Nlc3NmdWxseVxuIiwgInRlc3QtZGJ1cyIpOworI2Vsc2UKKyAgcHJpbnRmICgiTm90IGNvbXBpbGVkIHdpdGggdW5pdCB0ZXN0cywgbm90IHJ1bm5pbmcgYW55XG4iKTsKKyNlbmRpZgorfQorCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtdGVzdC5oIGIvZGJ1cy9kYnVzLXRlc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTg3NmExCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLXRlc3QuaApAQCAtMCwwICsxLDEyMyBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXRlc3QuaCAgRGVjbGFyYXRpb25zIG9mIHRlc3QgZnVuY3Rpb25zLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiAgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpZm5kZWYgREJVU19URVNUX0gKKyNkZWZpbmUgREJVU19URVNUX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy10eXBlcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zdHJpbmcuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbWFyc2hhbC12YWxpZGF0ZS5oPgorCisvKiBPbmx5IHRoaW5ncyB0aGF0IGFyZSBpbiBsaWJkYnVzLTEubGEgYW5kIHVzZWQgZnJvbSBsaWJkYnVzLWludGVybmFsLmxhCisgKiBuZWVkIHRvIGhhdmUgREJVU19QUklWQVRFX0VYUE9SVC4gSWYgeW91IGdldAorICoKKyAqIHdhcm5pbmc6ICdmb28nIHJlZGVjbGFyZWQgd2l0aG91dCBkbGxpbXBvcnQgYXR0cmlidXRlOiBwcmV2aW91cworICogZGxsaW1wb3J0IGlnbm9yZWQgWy1XYXR0cmlidXRlc10KKyAqCisgKiB0aGVuIHlvdSBoYXZlIGFkZGVkIHRvbyBtYW55LgorICovCisKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90IF9kYnVzX2hhc2hfdGVzdCAgICAgICAgICAgICAgKHZvaWQpOworCitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCBfZGJ1c19saXN0X3Rlc3QgICAgICAgICAgICAgICh2b2lkKTsKKworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgX2RidXNfbWFyc2hhbF90ZXN0ICAgICAgICAgICAodm9pZCk7CisKK2RidXNfYm9vbF90IF9kYnVzX21hcnNoYWxfcmVjdXJzaXZlX3Rlc3QgKHZvaWQpOworZGJ1c19ib29sX3QgX2RidXNfbWFyc2hhbF9ieXRlc3dhcF90ZXN0ICAodm9pZCk7CitkYnVzX2Jvb2xfdCBfZGJ1c19tYXJzaGFsX3ZhbGlkYXRlX3Rlc3QgICh2b2lkKTsKKworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgX2RidXNfbWlzY190ZXN0ICAgICAgICAgICAgICAodm9pZCk7CisKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90IF9kYnVzX3NpZ25hdHVyZV90ZXN0ICAgICAgICAgKHZvaWQpOworCitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCBfZGJ1c19tZW1fcG9vbF90ZXN0ICAgICAgICAgICh2b2lkKTsKKworZGJ1c19ib29sX3QgX2RidXNfc3RyaW5nX3Rlc3QgICAgICAgICAgICAodm9pZCk7CisKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90IF9kYnVzX2FkZHJlc3NfdGVzdCAgICAgICAgICAgKHZvaWQpOworCitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCBfZGJ1c19zZXJ2ZXJfdGVzdCAgICAgICAgICAgICh2b2lkKTsKKworZGJ1c19ib29sX3QgX2RidXNfbWVzc2FnZV90ZXN0ICAgICAgICAgICAoY29uc3QgY2hhciAqdGVzdF9kYXRhX2Rpcik7CitkYnVzX2Jvb2xfdCBfZGJ1c19hdXRoX3Rlc3QgICAgICAgICAgICAgIChjb25zdCBjaGFyICp0ZXN0X2RhdGFfZGlyKTsKKworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgX2RidXNfc2hhX3Rlc3QgICAgICAgICAgICAgICAoY29uc3QgY2hhciAqdGVzdF9kYXRhX2Rpcik7CisKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90IF9kYnVzX2tleXJpbmdfdGVzdCAgICAgICAgICAgKHZvaWQpOworCitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCBfZGJ1c19kYXRhX3Nsb3RfdGVzdCAgICAgICAgICh2b2lkKTsKKworZGJ1c19ib29sX3QgX2RidXNfc3lzZGVwc190ZXN0ICAgICAgICAgICAodm9pZCk7CitkYnVzX2Jvb2xfdCBfZGJ1c19zcGF3bl90ZXN0ICAgICAgICAgICAgIChjb25zdCBjaGFyICp0ZXN0X2RhdGFfZGlyKTsKKworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgX2RidXNfdXNlcmRiX3Rlc3QgICAgICAgICAgICAoY29uc3QgY2hhciAqdGVzdF9kYXRhX2Rpcik7CisKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90IF9kYnVzX3RyYW5zcG9ydF91bml4X3Rlc3QgICAgKHZvaWQpOworCitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCBfZGJ1c19tZW1vcnlfdGVzdCAgICAgICAgICAgICh2b2lkKTsKKworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgX2RidXNfb2JqZWN0X3RyZWVfdGVzdCAgICAgICAodm9pZCk7CisKK2RidXNfYm9vbF90IF9kYnVzX2NyZWRlbnRpYWxzX3Rlc3QgICAgICAgKGNvbnN0IGNoYXIgKnRlc3RfZGF0YV9kaXIpOworCit2b2lkICAgICAgICBkYnVzX2ludGVybmFsX2RvX25vdF91c2VfcnVuX3Rlc3RzICAgICAgICAgKGNvbnN0IGNoYXIgICAgICAgICAgKnRlc3RfZGF0YV9kaXIsCisJCQkJCQkJY29uc3QgY2hhciAgICAgICAgICAqc3BlY2lmaWNfdGVzdCk7CitkYnVzX2Jvb2xfdCBkYnVzX2ludGVybmFsX2RvX25vdF91c2VfdHJ5X21lc3NhZ2VfZmlsZSAgKGNvbnN0IERCdXNTdHJpbmcgICAgKmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVmFsaWRpdHkgICAgICAgICBleHBlY3RlZF92YWxpZGl0eSk7CitkYnVzX2Jvb2xfdCBkYnVzX2ludGVybmFsX2RvX25vdF91c2VfdHJ5X21lc3NhZ2VfZGF0YSAgKGNvbnN0IERCdXNTdHJpbmcgICAgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNWYWxpZGl0eSAgICAgICAgIGV4cGVjdGVkX3ZhbGlkaXR5KTsKK2RidXNfYm9vbF90IGRidXNfaW50ZXJuYWxfZG9fbm90X3VzZV9sb2FkX21lc3NhZ2VfZmlsZSAoY29uc3QgREJ1c1N0cmluZyAgICAqZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgICAgKmRhdGEpOworCisKKy8qIHJldHVybnMgRkFMU0Ugb24gZmF0YWwgZmFpbHVyZSAqLwordHlwZWRlZiBkYnVzX2Jvb2xfdCAoKiBEQnVzRm9yZWFjaE1lc3NhZ2VGaWxlRnVuYykgKGNvbnN0IERCdXNTdHJpbmcgICAqZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1ZhbGlkaXR5ICAgICAgICBleHBlY3RlZF92YWxpZGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgKmRhdGEpOworCitkYnVzX2Jvb2xfdCBkYnVzX2ludGVybmFsX2RvX25vdF91c2VfZm9yZWFjaF9tZXNzYWdlX2ZpbGUgKGNvbnN0IGNoYXIgICAgICAgICAgICAgICAgICp0ZXN0X2RhdGFfZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRm9yZWFjaE1lc3NhZ2VGaWxlRnVuYyAgZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgKnVzZXJfZGF0YSk7CitkYnVzX2Jvb2xfdCBkYnVzX2ludGVybmFsX2RvX25vdF91c2VfZ2VuZXJhdGVfYm9kaWVzICAgIChpbnQgICAgICAgICAgIHNlcXVlbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICBieXRlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1N0cmluZyAgICpzaWduYXR1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgKmJvZHkpOworCisKKyNlbmRpZiAvKiBEQlVTX1RFU1RfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLXRocmVhZHMtaW50ZXJuYWwuaCBiL2RidXMvZGJ1cy10aHJlYWRzLWludGVybmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc2YWNkMgotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy10aHJlYWRzLWludGVybmFsLmgKQEAgLTAsMCArMSw5NyBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXRocmVhZHMtaW50ZXJuYWwuaCAgRC1CdXMgdGhyZWFkIHByaW1pdGl2ZXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDUgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaWZuZGVmIERCVVNfVEhSRUFEU19JTlRFUk5BTF9ICisjZGVmaW5lIERCVVNfVEhSRUFEU19JTlRFUk5BTF9ICisKKyNpbmNsdWRlIDxkYnVzL2RidXMtbWFjcm9zLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXR5cGVzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXRocmVhZHMuaD4KKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzVGhyZWFkc0ludGVybmFscworICogQHsKKyAqLworCisvKioKKyAqIEEgbXV0ZXggd2hpY2ggaXMgcmVjdXJzaXZlIGlmIHBvc3NpYmxlLCBlbHNlIG5vbi1yZWN1cnNpdmUuCisgKiBUaGlzIGlzIHR5cGljYWxseSByZWN1cnNpdmUsIGJ1dCB0aGF0IGNhbm5vdCBiZSByZWxpZWQgdXBvbi4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgREJ1c1JNdXRleCBEQnVzUk11dGV4OworCisvKioKKyAqIEEgbXV0ZXggc3VpdGFibGUgZm9yIHVzZSB3aXRoIGNvbmRpdGlvbiB2YXJpYWJsZXMuCisgKiBUaGlzIGlzIHR5cGljYWxseSBub24tcmVjdXJzaXZlLgorICovCit0eXBlZGVmIHN0cnVjdCBEQnVzQ011dGV4IERCdXNDTXV0ZXg7CisKKy8qKiBAfSAqLworCitEQlVTX0JFR0lOX0RFQ0xTCisKK0RCVVNfUFJJVkFURV9FWFBPUlQKK3ZvaWQgICAgICAgICBfZGJ1c19ybXV0ZXhfbG9jayAgICAgICAgICAgICAgIChEQnVzUk11dGV4ICAgICAgICptdXRleCk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCit2b2lkICAgICAgICAgX2RidXNfcm11dGV4X3VubG9jayAgICAgICAgICAgICAoREJ1c1JNdXRleCAgICAgICAqbXV0ZXgpOwordm9pZCAgICAgICAgIF9kYnVzX3JtdXRleF9uZXdfYXRfbG9jYXRpb24gICAgKERCdXNSTXV0ZXggICAgICAqKmxvY2F0aW9uX3ApOwordm9pZCAgICAgICAgIF9kYnVzX3JtdXRleF9mcmVlX2F0X2xvY2F0aW9uICAgKERCdXNSTXV0ZXggICAgICAqKmxvY2F0aW9uX3ApOworCit2b2lkICAgICAgICAgX2RidXNfY211dGV4X2xvY2sgICAgICAgICAgICAgICAoREJ1c0NNdXRleCAgICAgICAqbXV0ZXgpOwordm9pZCAgICAgICAgIF9kYnVzX2NtdXRleF91bmxvY2sgICAgICAgICAgICAgKERCdXNDTXV0ZXggICAgICAgKm11dGV4KTsKK3ZvaWQgICAgICAgICBfZGJ1c19jbXV0ZXhfbmV3X2F0X2xvY2F0aW9uICAgIChEQnVzQ011dGV4ICAgICAgKipsb2NhdGlvbl9wKTsKK3ZvaWQgICAgICAgICBfZGJ1c19jbXV0ZXhfZnJlZV9hdF9sb2NhdGlvbiAgIChEQnVzQ011dGV4ICAgICAgKipsb2NhdGlvbl9wKTsKKworREJ1c0NvbmRWYXIqIF9kYnVzX2NvbmR2YXJfbmV3ICAgICAgICAgICAgICAgKHZvaWQpOwordm9pZCAgICAgICAgIF9kYnVzX2NvbmR2YXJfZnJlZSAgICAgICAgICAgICAgKERCdXNDb25kVmFyICAgICAgICpjb25kKTsKK3ZvaWQgICAgICAgICBfZGJ1c19jb25kdmFyX3dhaXQgICAgICAgICAgICAgIChEQnVzQ29uZFZhciAgICAgICAqY29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ011dGV4ICAgICAgICAqbXV0ZXgpOworZGJ1c19ib29sX3QgIF9kYnVzX2NvbmR2YXJfd2FpdF90aW1lb3V0ICAgICAgKERCdXNDb25kVmFyICAgICAgICpjb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDTXV0ZXggICAgICAgICptdXRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgdGltZW91dF9taWxsaXNlY29uZHMpOwordm9pZCAgICAgICAgIF9kYnVzX2NvbmR2YXJfd2FrZV9vbmUgICAgICAgICAgKERCdXNDb25kVmFyICAgICAgICpjb25kKTsKK3ZvaWQgICAgICAgICBfZGJ1c19jb25kdmFyX25ld19hdF9sb2NhdGlvbiAgIChEQnVzQ29uZFZhciAgICAgICoqbG9jYXRpb25fcCk7Cit2b2lkICAgICAgICAgX2RidXNfY29uZHZhcl9mcmVlX2F0X2xvY2F0aW9uICAoREJ1c0NvbmRWYXIgICAgICAqKmxvY2F0aW9uX3ApOworCisvKiBQcml2YXRlIHRvIHRocmVhZGluZyBpbXBsZW1lbnRhdGlvbnMgYW5kIGRidXMtdGhyZWFkcy5jICovCisKK0RCdXNSTXV0ZXggICpfZGJ1c19wbGF0Zm9ybV9ybXV0ZXhfbmV3ICAgICAgICh2b2lkKTsKK3ZvaWQgICAgICAgICBfZGJ1c19wbGF0Zm9ybV9ybXV0ZXhfZnJlZSAgICAgIChEQnVzUk11dGV4ICAgICAgICptdXRleCk7Cit2b2lkICAgICAgICAgX2RidXNfcGxhdGZvcm1fcm11dGV4X2xvY2sgICAgICAoREJ1c1JNdXRleCAgICAgICAqbXV0ZXgpOwordm9pZCAgICAgICAgIF9kYnVzX3BsYXRmb3JtX3JtdXRleF91bmxvY2sgICAgKERCdXNSTXV0ZXggICAgICAgKm11dGV4KTsKKworREJ1c0NNdXRleCAgKl9kYnVzX3BsYXRmb3JtX2NtdXRleF9uZXcgICAgICAgKHZvaWQpOwordm9pZCAgICAgICAgIF9kYnVzX3BsYXRmb3JtX2NtdXRleF9mcmVlICAgICAgKERCdXNDTXV0ZXggICAgICAgKm11dGV4KTsKK3ZvaWQgICAgICAgICBfZGJ1c19wbGF0Zm9ybV9jbXV0ZXhfbG9jayAgICAgIChEQnVzQ011dGV4ICAgICAgICptdXRleCk7Cit2b2lkICAgICAgICAgX2RidXNfcGxhdGZvcm1fY211dGV4X3VubG9jayAgICAoREJ1c0NNdXRleCAgICAgICAqbXV0ZXgpOworCitEQnVzQ29uZFZhciogX2RidXNfcGxhdGZvcm1fY29uZHZhcl9uZXcgICAgICAodm9pZCk7Cit2b2lkICAgICAgICAgX2RidXNfcGxhdGZvcm1fY29uZHZhcl9mcmVlICAgICAoREJ1c0NvbmRWYXIgICAgICAgKmNvbmQpOwordm9pZCAgICAgICAgIF9kYnVzX3BsYXRmb3JtX2NvbmR2YXJfd2FpdCAgICAgKERCdXNDb25kVmFyICAgICAgICpjb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDTXV0ZXggICAgICAgICptdXRleCk7CitkYnVzX2Jvb2xfdCAgX2RidXNfcGxhdGZvcm1fY29uZHZhcl93YWl0X3RpbWVvdXQgKERCdXNDb25kVmFyICAgKmNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0NNdXRleCAgICAgICAgKm11dGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICB0aW1lb3V0X21pbGxpc2Vjb25kcyk7Cit2b2lkICAgICAgICAgX2RidXNfcGxhdGZvcm1fY29uZHZhcl93YWtlX29uZSAoREJ1c0NvbmRWYXIgICAgICAgKmNvbmQpOworCitEQlVTX0VORF9ERUNMUworCisjZW5kaWYgLyogREJVU19USFJFQURTX0lOVEVSTkFMX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy10aHJlYWRzLmMgYi9kYnVzL2RidXMtdGhyZWFkcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyZDQwNDkKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtdGhyZWFkcy5jCkBAIC0wLDAgKzEsNDU0IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtdGhyZWFkcy5oICBELUJ1cyB0aHJlYWRzIGhhbmRsaW5nCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzLCAyMDA2IFJlZCBIYXQgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgImRidXMtdGhyZWFkcy5oIgorI2luY2x1ZGUgImRidXMtaW50ZXJuYWxzLmgiCisjaW5jbHVkZSAiZGJ1cy10aHJlYWRzLWludGVybmFsLmgiCisjaW5jbHVkZSAiZGJ1cy1saXN0LmgiCisKK3N0YXRpYyBpbnQgdGhyZWFkX2luaXRfZ2VuZXJhdGlvbiA9IDA7CisKKy8qKgorICogQGRlZmdyb3VwIERCdXNUaHJlYWRzSW50ZXJuYWxzIFRocmVhZCBmdW5jdGlvbnMKKyAqIEBpbmdyb3VwICBEQnVzSW50ZXJuYWxzCisgKiBAYnJpZWYgX2RidXNfcm11dGV4X2xvY2soKSwgZXRjLgorICoKKyAqIEZ1bmN0aW9ucyBhbmQgbWFjcm9zIHJlbGF0ZWQgdG8gdGhyZWFkcyBhbmQgdGhyZWFkIGxvY2tzLgorICoKKyAqIEB7CisgKi8KKworLyoqCisgKiBDcmVhdGVzIGEgbmV3IG11dGV4CisgKiBvciBjcmVhdGVzIGEgbm8tb3AgbXV0ZXggaWYgdGhyZWFkcyBhcmUgbm90IGluaXRpYWxpemVkLgorICogTWF5IHJldHVybiAjTlVMTCBldmVuIGlmIHRocmVhZHMgYXJlIGluaXRpYWxpemVkLCBpbmRpY2F0aW5nCisgKiBvdXQtb2YtbWVtb3J5LgorICoKKyAqIElmIHBvc3NpYmxlLCB0aGUgbXV0ZXggcmV0dXJuZWQgYnkgdGhpcyBmdW5jdGlvbiBpcyByZWN1cnNpdmUsIHRvCisgKiBhdm9pZCBkZWFkbG9ja3MuIEhvd2V2ZXIsIHRoYXQgY2Fubm90IGJlIHJlbGllZCBvbi4KKyAqCisgKiBAcGFyYW0gbG9jYXRpb25fcCB0aGUgbG9jYXRpb24gb2YgdGhlIG5ldyBtdXRleCwgY2FuIHJldHVybiAjTlVMTCBvbiBPT00KKyAqLwordm9pZAorX2RidXNfcm11dGV4X25ld19hdF9sb2NhdGlvbiAoREJ1c1JNdXRleCAqKmxvY2F0aW9uX3ApCit7CisgIF9kYnVzX2Fzc2VydCAobG9jYXRpb25fcCAhPSBOVUxMKTsKKworICBpZiAoIWRidXNfdGhyZWFkc19pbml0X2RlZmF1bHQgKCkpCisgICAgeworICAgICAgKmxvY2F0aW9uX3AgPSBOVUxMOworICAgICAgcmV0dXJuOworICAgIH0KKworICAqbG9jYXRpb25fcCA9IF9kYnVzX3BsYXRmb3JtX3JtdXRleF9uZXcgKCk7Cit9CisKKy8qKgorICogQ3JlYXRlcyBhIG5ldyBtdXRleAorICogb3IgY3JlYXRlcyBhIG5vLW9wIG11dGV4IGlmIHRocmVhZHMgYXJlIG5vdCBpbml0aWFsaXplZC4KKyAqIE1heSByZXR1cm4gI05VTEwgZXZlbiBpZiB0aHJlYWRzIGFyZSBpbml0aWFsaXplZCwgaW5kaWNhdGluZworICogb3V0LW9mLW1lbW9yeS4KKyAqCisgKiBUaGUgcmV0dXJuZWQgbXV0ZXggaXMgc3VpdGFibGUgZm9yIHVzZSB3aXRoIGNvbmRpdGlvbiB2YXJpYWJsZXMuCisgKgorICogQHBhcmFtIGxvY2F0aW9uX3AgdGhlIGxvY2F0aW9uIG9mIHRoZSBuZXcgbXV0ZXgsIGNhbiByZXR1cm4gI05VTEwgb24gT09NCisgKi8KK3ZvaWQKK19kYnVzX2NtdXRleF9uZXdfYXRfbG9jYXRpb24gKERCdXNDTXV0ZXggKipsb2NhdGlvbl9wKQoreworICBfZGJ1c19hc3NlcnQgKGxvY2F0aW9uX3AgIT0gTlVMTCk7CisKKyAgaWYgKCFkYnVzX3RocmVhZHNfaW5pdF9kZWZhdWx0ICgpKQorICAgIHsKKyAgICAgICpsb2NhdGlvbl9wID0gTlVMTDsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgKmxvY2F0aW9uX3AgPSBfZGJ1c19wbGF0Zm9ybV9jbXV0ZXhfbmV3ICgpOworfQorCisvKioKKyAqIEZyZWVzIGEgREJ1c1JNdXRleDsgZG9lcyBub3RoaW5nIGlmIHBhc3NlZCBhICNOVUxMIHBvaW50ZXIuCisgKi8KK3ZvaWQKK19kYnVzX3JtdXRleF9mcmVlX2F0X2xvY2F0aW9uIChEQnVzUk11dGV4ICoqbG9jYXRpb25fcCkKK3sKKyAgaWYgKGxvY2F0aW9uX3AgPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAgaWYgKCpsb2NhdGlvbl9wICE9IE5VTEwpCisgICAgX2RidXNfcGxhdGZvcm1fcm11dGV4X2ZyZWUgKCpsb2NhdGlvbl9wKTsKK30KKworLyoqCisgKiBGcmVlcyBhIERCdXNDTXV0ZXg7IGRvZXMgbm90aGluZyBpZiBwYXNzZWQgYSAjTlVMTCBwb2ludGVyLgorICovCit2b2lkCitfZGJ1c19jbXV0ZXhfZnJlZV9hdF9sb2NhdGlvbiAoREJ1c0NNdXRleCAqKmxvY2F0aW9uX3ApCit7CisgIGlmIChsb2NhdGlvbl9wID09IE5VTEwpCisgICAgcmV0dXJuOworCisgIGlmICgqbG9jYXRpb25fcCAhPSBOVUxMKQorICAgIF9kYnVzX3BsYXRmb3JtX2NtdXRleF9mcmVlICgqbG9jYXRpb25fcCk7Cit9CisKKy8qKgorICogTG9ja3MgYSBtdXRleC4gRG9lcyBub3RoaW5nIGlmIHBhc3NlZCBhICNOVUxMIHBvaW50ZXIuCisgKiBMb2NrcyBtYXkgYmUgcmVjdXJzaXZlIGlmIHRocmVhZGluZyBpbXBsZW1lbnRhdGlvbiBpbml0aWFsaXplZAorICogcmVjdXJzaXZlIGxvY2tzLgorICovCit2b2lkCitfZGJ1c19ybXV0ZXhfbG9jayAoREJ1c1JNdXRleCAqbXV0ZXgpCit7CisgIGlmIChtdXRleCA9PSBOVUxMKQorICAgIHJldHVybjsKKworICBfZGJ1c19wbGF0Zm9ybV9ybXV0ZXhfbG9jayAobXV0ZXgpOworfQorCisvKioKKyAqIExvY2tzIGEgbXV0ZXguIERvZXMgbm90aGluZyBpZiBwYXNzZWQgYSAjTlVMTCBwb2ludGVyLgorICogTG9ja3MgbWF5IGJlIHJlY3Vyc2l2ZSBpZiB0aHJlYWRpbmcgaW1wbGVtZW50YXRpb24gaW5pdGlhbGl6ZWQKKyAqIHJlY3Vyc2l2ZSBsb2Nrcy4KKyAqLwordm9pZAorX2RidXNfY211dGV4X2xvY2sgKERCdXNDTXV0ZXggKm11dGV4KQoreworICBpZiAobXV0ZXggPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAgX2RidXNfcGxhdGZvcm1fY211dGV4X2xvY2sgKG11dGV4KTsKK30KKworLyoqCisgKiBVbmxvY2tzIGEgbXV0ZXguIERvZXMgbm90aGluZyBpZiBwYXNzZWQgYSAjTlVMTCBwb2ludGVyLgorICoKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MKKyAqLwordm9pZAorX2RidXNfcm11dGV4X3VubG9jayAoREJ1c1JNdXRleCAqbXV0ZXgpCit7CisgIGlmIChtdXRleCA9PSBOVUxMKQorICAgIHJldHVybjsKKworICBfZGJ1c19wbGF0Zm9ybV9ybXV0ZXhfdW5sb2NrIChtdXRleCk7Cit9CisKKy8qKgorICogVW5sb2NrcyBhIG11dGV4LiBEb2VzIG5vdGhpbmcgaWYgcGFzc2VkIGEgI05VTEwgcG9pbnRlci4KKyAqCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzCisgKi8KK3ZvaWQKK19kYnVzX2NtdXRleF91bmxvY2sgKERCdXNDTXV0ZXggKm11dGV4KQoreworICBpZiAobXV0ZXggPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAgX2RidXNfcGxhdGZvcm1fY211dGV4X3VubG9jayAobXV0ZXgpOworfQorCisvKioKKyAqIENyZWF0ZXMgYSBuZXcgY29uZGl0aW9uIHZhcmlhYmxlIHVzaW5nIHRoZSBmdW5jdGlvbiBzdXBwbGllZAorICogdG8gZGJ1c190aHJlYWRzX2luaXQoKSwgb3IgY3JlYXRlcyBhIG5vLW9wIGNvbmRpdGlvbiB2YXJpYWJsZQorICogaWYgdGhyZWFkcyBhcmUgbm90IGluaXRpYWxpemVkLiBNYXkgcmV0dXJuICNOVUxMIGV2ZW4gaWYKKyAqIHRocmVhZHMgYXJlIGluaXRpYWxpemVkLCBpbmRpY2F0aW5nIG91dC1vZi1tZW1vcnkuCisgKgorICogQHJldHVybnMgbmV3IG11dGV4IG9yICNOVUxMCisgKi8KK0RCdXNDb25kVmFyICoKK19kYnVzX2NvbmR2YXJfbmV3ICh2b2lkKQoreworICBpZiAoIWRidXNfdGhyZWFkc19pbml0X2RlZmF1bHQgKCkpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgcmV0dXJuIF9kYnVzX3BsYXRmb3JtX2NvbmR2YXJfbmV3ICgpOworfQorCisKKy8qKgorICogVGhpcyBkb2VzIHRoZSBzYW1lIHRoaW5nIGFzIF9kYnVzX2NvbmR2YXJfbmV3LiAgSXQgaG93ZXZlcgorICogZ2l2ZXMgYW5vdGhlciBsZXZlbCBvZiBpbmRpcmVjdGlvbiBieSBhbGxvY2F0aW5nIGEgcG9pbnRlcgorICogdG8gcG9pbnQgdG8gdGhlIGNvbmR2YXIgbG9jYXRpb247IHRoaXMgdXNlZCB0byBiZSB1c2VmdWwuCisgKgorICogQHJldHVybnMgdGhlIGxvY2F0aW9uIG9mIGEgbmV3IGNvbmR2YXIgb3IgI05VTEwgb24gT09NCisgKi8KKwordm9pZCAKK19kYnVzX2NvbmR2YXJfbmV3X2F0X2xvY2F0aW9uIChEQnVzQ29uZFZhciAqKmxvY2F0aW9uX3ApCit7CisgIF9kYnVzX2Fzc2VydCAobG9jYXRpb25fcCAhPSBOVUxMKTsKKworICAqbG9jYXRpb25fcCA9IF9kYnVzX2NvbmR2YXJfbmV3KCk7Cit9CisKKworLyoqCisgKiBGcmVlcyBhIGNvbmRpdGlvbmFsIHZhcmlhYmxlIGNyZWF0ZWQgd2l0aCBkYnVzX2NvbmR2YXJfbmV3KCk7IGRvZXMKKyAqIG5vdGhpbmcgaWYgcGFzc2VkIGEgI05VTEwgcG9pbnRlci4KKyAqLwordm9pZAorX2RidXNfY29uZHZhcl9mcmVlIChEQnVzQ29uZFZhciAqY29uZCkKK3sKKyAgaWYgKGNvbmQgPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAgX2RidXNfcGxhdGZvcm1fY29uZHZhcl9mcmVlIChjb25kKTsKK30KKworLyoqCisgKiBGcmVlcyBhIGNvbmRpdGlvbiB2YXJpYWJsZTsgZG9lcyBub3RoaW5nIGlmIHBhc3NlZCBhICNOVUxMIHBvaW50ZXIuCisgKi8KK3ZvaWQKK19kYnVzX2NvbmR2YXJfZnJlZV9hdF9sb2NhdGlvbiAoREJ1c0NvbmRWYXIgKipsb2NhdGlvbl9wKQoreworICBpZiAobG9jYXRpb25fcCA9PSBOVUxMKQorICAgIHJldHVybjsKKworICBpZiAoKmxvY2F0aW9uX3AgIT0gTlVMTCkKKyAgICBfZGJ1c19wbGF0Zm9ybV9jb25kdmFyX2ZyZWUgKCpsb2NhdGlvbl9wKTsKK30KKworLyoqCisgKiBBdG9taWNhbGx5IHVubG9ja3MgdGhlIG11dGV4IGFuZCB3YWl0cyBmb3IgdGhlIGNvbmRpdGlvbnMKKyAqIHZhcmlhYmxlIHRvIGJlIHNpZ25hbGxlZC4gTG9ja3MgdGhlIG11dGV4IGFnYWluIGJlZm9yZQorICogcmV0dXJuaW5nLgorICogRG9lcyBub3RoaW5nIGlmIHBhc3NlZCBhICNOVUxMIHBvaW50ZXIuCisgKi8KK3ZvaWQKK19kYnVzX2NvbmR2YXJfd2FpdCAoREJ1c0NvbmRWYXIgKmNvbmQsCisgICAgICAgICAgICAgICAgICAgIERCdXNDTXV0ZXggICptdXRleCkKK3sKKyAgaWYgKGNvbmQgPT0gTlVMTCB8fCBtdXRleCA9PSBOVUxMKQorICAgIHJldHVybjsKKworICBfZGJ1c19wbGF0Zm9ybV9jb25kdmFyX3dhaXQgKGNvbmQsIG11dGV4KTsKK30KKworLyoqCisgKiBBdG9taWNhbGx5IHVubG9ja3MgdGhlIG11dGV4IGFuZCB3YWl0cyBmb3IgdGhlIGNvbmRpdGlvbnMgdmFyaWFibGUKKyAqIHRvIGJlIHNpZ25hbGxlZCwgb3IgZm9yIGEgdGltZW91dC4gTG9ja3MgdGhlIG11dGV4IGFnYWluIGJlZm9yZQorICogcmV0dXJuaW5nLiAgRG9lcyBub3RoaW5nIGlmIHBhc3NlZCBhICNOVUxMIHBvaW50ZXIuICBSZXR1cm4gdmFsdWUKKyAqIGlzICNGQUxTRSBpZiB3ZSB0aW1lZCBvdXQsICNUUlVFIG90aGVyd2lzZS4KKyAqCisgKiBAcGFyYW0gY29uZCB0aGUgY29uZGl0aW9uIHZhcmlhYmxlCisgKiBAcGFyYW0gbXV0ZXggdGhlIG11dGV4CisgKiBAcGFyYW0gdGltZW91dF9taWxsaXNlY29uZHMgdGhlIG1heGltdW0gdGltZSB0byB3YWl0CisgKiBAcmV0dXJucyAjRkFMU0UgaWYgdGhlIHRpbWVvdXQgb2NjdXJyZWQsICNUUlVFIGlmIG5vdAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfY29uZHZhcl93YWl0X3RpbWVvdXQgKERCdXNDb25kVmFyICAgICAgICAgICAgICAgKmNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0NNdXRleCAgICAgICAgICAgICAgICAqbXV0ZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dF9taWxsaXNlY29uZHMpCit7CisgIGlmIChjb25kID09IE5VTEwgfHwgbXV0ZXggPT0gTlVMTCkKKyAgICByZXR1cm4gVFJVRTsKKworICByZXR1cm4gX2RidXNfcGxhdGZvcm1fY29uZHZhcl93YWl0X3RpbWVvdXQgKGNvbmQsIG11dGV4LAorICAgICAgdGltZW91dF9taWxsaXNlY29uZHMpOworfQorCisvKioKKyAqIElmIHRoZXJlIGFyZSB0aHJlYWRzIHdhaXRpbmcgb24gdGhlIGNvbmRpdGlvbiB2YXJpYWJsZSwgd2FrZQorICogdXAgZXhhY3RseSBvbmUuIAorICogRG9lcyBub3RoaW5nIGlmIHBhc3NlZCBhICNOVUxMIHBvaW50ZXIuCisgKi8KK3ZvaWQKK19kYnVzX2NvbmR2YXJfd2FrZV9vbmUgKERCdXNDb25kVmFyICpjb25kKQoreworICBpZiAoY29uZCA9PSBOVUxMKQorICAgIHJldHVybjsKKworICBfZGJ1c19wbGF0Zm9ybV9jb25kdmFyX3dha2Vfb25lIChjb25kKTsKK30KKworc3RhdGljIERCdXNSTXV0ZXggKmdsb2JhbF9sb2Nrc1tfREJVU19OX0dMT0JBTF9MT0NLU10gPSB7IE5VTEwgfTsKKworc3RhdGljIHZvaWQKK3NodXRkb3duX2dsb2JhbF9sb2NrcyAodm9pZCAqbmlsKQoreworICBpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgX0RCVVNfTl9HTE9CQUxfTE9DS1M7IGkrKykKKyAgICB7CisgICAgICBfZGJ1c19hc3NlcnQgKGdsb2JhbF9sb2Nrc1tpXSAhPSBOVUxMKTsKKyAgICAgIF9kYnVzX3BsYXRmb3JtX3JtdXRleF9mcmVlIChnbG9iYWxfbG9ja3NbaV0pOworICAgICAgZ2xvYmFsX2xvY2tzW2ldID0gTlVMTDsKKyAgICB9Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAoraW5pdF9nbG9iYWxfbG9ja3MgKHZvaWQpCit7CisgIGludCBpOworICBkYnVzX2Jvb2xfdCBvazsKKworICBmb3IgKGkgPSAwOyBpIDwgX0RCVVNfTl9HTE9CQUxfTE9DS1M7IGkrKykKKyAgICB7CisgICAgICBfZGJ1c19hc3NlcnQgKGdsb2JhbF9sb2Nrc1tpXSA9PSBOVUxMKTsKKworICAgICAgZ2xvYmFsX2xvY2tzW2ldID0gX2RidXNfcGxhdGZvcm1fcm11dGV4X25ldyAoKTsKKworICAgICAgaWYgKGdsb2JhbF9sb2Nrc1tpXSA9PSBOVUxMKQorICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgX2RidXNfcGxhdGZvcm1fcm11dGV4X2xvY2sgKGdsb2JhbF9sb2Nrc1tfREJVU19MT0NLX3NodXRkb3duX2Z1bmNzXSk7CisgIG9rID0gX2RidXNfcmVnaXN0ZXJfc2h1dGRvd25fZnVuY191bmxvY2tlZCAoc2h1dGRvd25fZ2xvYmFsX2xvY2tzLCBOVUxMKTsKKyAgX2RidXNfcGxhdGZvcm1fcm11dGV4X3VubG9jayAoZ2xvYmFsX2xvY2tzW19EQlVTX0xPQ0tfc2h1dGRvd25fZnVuY3NdKTsKKworICBpZiAoIW9rKQorICAgIGdvdG8gZmFpbGVkOworCisgIHJldHVybiBUUlVFOworCisgZmFpbGVkOgorICBmb3IgKGkgPSBpIC0gMTsgaSA+PSAwOyBpLS0pCisgICAgeworICAgICAgX2RidXNfcGxhdGZvcm1fcm11dGV4X2ZyZWUgKGdsb2JhbF9sb2Nrc1tpXSk7CisgICAgICBnbG9iYWxfbG9ja3NbaV0gPSBOVUxMOworICAgIH0KKworICByZXR1cm4gRkFMU0U7Cit9CisKK2RidXNfYm9vbF90CitfZGJ1c19sb2NrIChEQnVzR2xvYmFsTG9jayBsb2NrKQoreworICBfZGJ1c19hc3NlcnQgKGxvY2sgPj0gMCk7CisgIF9kYnVzX2Fzc2VydCAobG9jayA8IF9EQlVTX05fR0xPQkFMX0xPQ0tTKTsKKworICBpZiAodGhyZWFkX2luaXRfZ2VuZXJhdGlvbiAhPSBfZGJ1c19jdXJyZW50X2dlbmVyYXRpb24gJiYKKyAgICAgICFkYnVzX3RocmVhZHNfaW5pdF9kZWZhdWx0ICgpKQorICAgIHJldHVybiBGQUxTRTsKKworICBfZGJ1c19wbGF0Zm9ybV9ybXV0ZXhfbG9jayAoZ2xvYmFsX2xvY2tzW2xvY2tdKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3ZvaWQKK19kYnVzX3VubG9jayAoREJ1c0dsb2JhbExvY2sgbG9jaykKK3sKKyAgX2RidXNfYXNzZXJ0IChsb2NrID49IDApOworICBfZGJ1c19hc3NlcnQgKGxvY2sgPCBfREJVU19OX0dMT0JBTF9MT0NLUyk7CisKKyAgX2RidXNfcGxhdGZvcm1fcm11dGV4X3VubG9jayAoZ2xvYmFsX2xvY2tzW2xvY2tdKTsKK30KKworLyoqIEB9ICovIC8qIGVuZCBvZiBpbnRlcm5hbHMgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c1RocmVhZHMgVGhyZWFkIGZ1bmN0aW9ucworICogQGluZ3JvdXAgIERCdXMKKyAqIEBicmllZiBkYnVzX3RocmVhZHNfaW5pdCgpIGFuZCBkYnVzX3RocmVhZHNfaW5pdF9kZWZhdWx0KCkKKyAqCisgKiBGdW5jdGlvbnMgYW5kIG1hY3JvcyByZWxhdGVkIHRvIHRocmVhZHMgYW5kIHRocmVhZCBsb2Nrcy4KKyAqCisgKiBJZiB0aHJlYWRzIGFyZSBpbml0aWFsaXplZCwgdGhlIEQtQnVzIGxpYnJhcnkgaGFzIGxvY2tzIG9uIGFsbAorICogZ2xvYmFsIGRhdGEgc3RydWN0dXJlcy4gIEluIGFkZGl0aW9uLCBlYWNoICNEQnVzQ29ubmVjdGlvbiBoYXMgYQorICogbG9jaywgc28gb25seSBvbmUgdGhyZWFkIGF0IGEgdGltZSBjYW4gdG91Y2ggdGhlIGNvbm5lY3Rpb24uICAoU2VlCisgKiBAcmVmIERCdXNDb25uZWN0aW9uIGZvciBtb3JlIG9uIGNvbm5lY3Rpb24gbG9ja2luZy4pCisgKgorICogTW9zdCBvdGhlciBvYmplY3RzLCBob3dldmVyLCBkbyBub3QgaGF2ZSBsb2NrcyAtIHRoZXkgY2FuIG9ubHkgYmUKKyAqIHVzZWQgZnJvbSBhIHNpbmdsZSB0aHJlYWQgYXQgYSB0aW1lLCB1bmxlc3MgeW91IGxvY2sgdGhlbSB5b3Vyc2VsZi4KKyAqIEZvciBleGFtcGxlLCBhICNEQnVzTWVzc2FnZSBjYW4ndCBiZSBtb2RpZmllZCBmcm9tIHR3byB0aHJlYWRzCisgKiBhdCBvbmNlLgorICogCisgKiBAeworICovCisKKy8qKgorICogSW5pdGlhbGl6ZXMgdGhyZWFkcywgbGlrZSBkYnVzX3RocmVhZHNfaW5pdF9kZWZhdWx0KCkuCisgKiBUaGlzIHZlcnNpb24gcHJldmlvdXNseSBhbGxvd2VkIHVzZXItc3BlY2lmaWVkIHRocmVhZGluZworICogcHJpbWl0aXZlcywgYnV0IHNpbmNlIEQtQnVzIDEuNiBpdCBpZ25vcmVzIHRoZW0gYW5kIGJlaGF2ZXMKKyAqIGV4YWN0bHkgbGlrZSBkYnVzX3RocmVhZHNfaW5pdF9kZWZhdWx0KCkuCisgKgorICogQHBhcmFtIGZ1bmN0aW9ucyBpZ25vcmVkLCBmb3JtZXJseSBmdW5jdGlvbnMgZm9yIHVzaW5nIHRocmVhZHMKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MsICNGQUxTRSBpZiBubyBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK2RidXNfdGhyZWFkc19pbml0IChjb25zdCBEQnVzVGhyZWFkRnVuY3Rpb25zICpmdW5jdGlvbnMpCit7CisgIF9kYnVzX3RocmVhZHNfbG9ja19wbGF0Zm9ybV9zcGVjaWZpYyAoKTsKKworICBpZiAodGhyZWFkX2luaXRfZ2VuZXJhdGlvbiA9PSBfZGJ1c19jdXJyZW50X2dlbmVyYXRpb24pCisgICAgeworICAgICAgX2RidXNfdGhyZWFkc191bmxvY2tfcGxhdGZvcm1fc3BlY2lmaWMgKCk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c190aHJlYWRzX2luaXRfcGxhdGZvcm1fc3BlY2lmaWMoKSB8fAorICAgICAgIWluaXRfZ2xvYmFsX2xvY2tzICgpKQorICAgIHsKKyAgICAgIF9kYnVzX3RocmVhZHNfdW5sb2NrX3BsYXRmb3JtX3NwZWNpZmljICgpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICB0aHJlYWRfaW5pdF9nZW5lcmF0aW9uID0gX2RidXNfY3VycmVudF9nZW5lcmF0aW9uOworCisgIF9kYnVzX3RocmVhZHNfdW5sb2NrX3BsYXRmb3JtX3NwZWNpZmljICgpOworICByZXR1cm4gVFJVRTsKK30KKworCisKKy8qIERlZmF1bHQgdGhyZWFkIGltcGxlbWVuYXRpb24gKi8KKworLyoqCisgKiBJbml0aWFsaXplcyB0aHJlYWRzLiBJZiB0aGlzIGZ1bmN0aW9uIGlzIG5vdCBjYWxsZWQsIHRoZSBELUJ1cworICogbGlicmFyeSB3aWxsIG5vdCBsb2NrIGFueSBkYXRhIHN0cnVjdHVyZXMuICBJZiBpdCBpcyBjYWxsZWQsIEQtQnVzCisgKiB3aWxsIGRvIGxvY2tpbmcsIGF0IHNvbWUgY29zdCBpbiBlZmZpY2llbmN5LgorICoKKyAqIFNpbmNlIEQtQnVzIDEuNyBpdCBpcyBzYWZlIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiBmcm9tIGFueSB0aHJlYWQsCisgKiBhbnkgbnVtYmVyIG9mIHRpbWVzIChidXQgaXQgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGFueSBvdGhlcgorICogbGliZGJ1cyBBUEkgaXMgdXNlZCkuCisgKgorICogSW4gRC1CdXMgMS42IG9yIG9sZGVyLCB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGluIHRoZSBtYWluIHRocmVhZAorICogYmVmb3JlIGFueSBvdGhlciB0aHJlYWQgc3RhcnRzLiBBcyBhIHJlc3VsdCwgaXQgaXMgbm90IHN1ZmZpY2llbnQgdG8KKyAqIGNhbGwgdGhpcyBmdW5jdGlvbiBpbiBhIGxpYnJhcnkgb3IgcGx1Z2luLCB1bmxlc3MgdGhlIGxpYnJhcnkgb3IgcGx1Z2luCisgKiBpbXBvc2VzIGEgc2ltaWxhciByZXF1aXJlbWVudCBvbiBpdHMgY2FsbGVycy4KKyAqCisgKiBkYnVzX3NodXRkb3duKCkgcmV2ZXJzZXMgdGhlIGVmZmVjdHMgb2YgdGhpcyBmdW5jdGlvbiB3aGVuIGl0CisgKiByZXNldHMgYWxsIGdsb2JhbCBzdGF0ZSBpbiBsaWJkYnVzLgorICogCisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzLCAjRkFMU0UgaWYgbm90IGVub3VnaCBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK2RidXNfdGhyZWFkc19pbml0X2RlZmF1bHQgKHZvaWQpCit7CisgIHJldHVybiBkYnVzX3RocmVhZHNfaW5pdCAoTlVMTCk7Cit9CisKKworLyoqIEB9ICovCisKKyNpZmRlZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworCitkYnVzX2Jvb2xfdAorX2RidXNfdGhyZWFkc19pbml0X2RlYnVnICh2b2lkKQoreworICByZXR1cm4gZGJ1c190aHJlYWRzX2luaXQgKE5VTEwpOworfQorCisjZW5kaWYgLyogREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMgKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy10aHJlYWRzLmggYi9kYnVzL2RidXMtdGhyZWFkcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkMjhhMGIKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtdGhyZWFkcy5oCkBAIC0wLDAgKzEsMTg5IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtdGhyZWFkcy5oICBELUJ1cyB0aHJlYWRzIGhhbmRsaW5nCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyICBSZWQgSGF0IEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKyNpZiAhZGVmaW5lZCAoREJVU19JTlNJREVfREJVU19IKSAmJiAhZGVmaW5lZCAoREJVU19DT01QSUxBVElPTikKKyNlcnJvciAiT25seSA8ZGJ1cy9kYnVzLmg+IGNhbiBiZSBpbmNsdWRlZCBkaXJlY3RseSwgdGhpcyBmaWxlIG1heSBkaXNhcHBlYXIgb3IgY2hhbmdlIGNvbnRlbnRzLiIKKyNlbmRpZgorCisjaWZuZGVmIERCVVNfVEhSRUFEU19ICisjZGVmaW5lIERCVVNfVEhSRUFEU19ICisKKyNpbmNsdWRlIDxkYnVzL2RidXMtbWFjcm9zLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXR5cGVzLmg+CisKK0RCVVNfQkVHSU5fREVDTFMKKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzVGhyZWFkcworICogQHsKKyAqLworCisvKiogQW4gb3BhcXVlIG11dGV4IHR5cGUgcHJvdmlkZWQgYnkgdGhlICNEQnVzVGhyZWFkRnVuY3Rpb25zIGltcGxlbWVudGF0aW9uIGluc3RhbGxlZCBieSBkYnVzX3RocmVhZHNfaW5pdCgpLiAqLwordHlwZWRlZiBzdHJ1Y3QgREJ1c011dGV4IERCdXNNdXRleDsKKy8qKiBBbiBvcGFxdWUgY29uZGl0aW9uIHZhcmlhYmxlIHR5cGUgcHJvdmlkZWQgYnkgdGhlICNEQnVzVGhyZWFkRnVuY3Rpb25zIGltcGxlbWVudGF0aW9uIGluc3RhbGxlZCBieSBkYnVzX3RocmVhZHNfaW5pdCgpLiAqLwordHlwZWRlZiBzdHJ1Y3QgREJ1c0NvbmRWYXIgREJ1c0NvbmRWYXI7CisKKy8qKiBEZXByZWNhdGVkLCBwcm92aWRlIERCdXNSZWN1cnNpdmVNdXRleE5ld0Z1bmN0aW9uIGluc3RlYWQuICovCit0eXBlZGVmIERCdXNNdXRleCogICgqIERCdXNNdXRleE5ld0Z1bmN0aW9uKSAgICAodm9pZCk7CisvKiogRGVwcmVjYXRlZCwgcHJvdmlkZSBEQnVzUmVjdXJzaXZlTXV0ZXhGcmVlRnVuY3Rpb24gaW5zdGVhZC4gKi8KK3R5cGVkZWYgdm9pZCAgICAgICAgKCogREJ1c011dGV4RnJlZUZ1bmN0aW9uKSAgIChEQnVzTXV0ZXggKm11dGV4KTsKKy8qKiBEZXByZWNhdGVkLCBwcm92aWRlIERCdXNSZWN1cnNpdmVNdXRleExvY2tGdW5jdGlvbiBpbnN0ZWFkLiBSZXR1cm4gdmFsdWUgaXMgbG9jayBzdWNjZXNzLCBidXQgZ2V0cyBpZ25vcmVkIGluIHByYWN0aWNlLiAqLwordHlwZWRlZiBkYnVzX2Jvb2xfdCAoKiBEQnVzTXV0ZXhMb2NrRnVuY3Rpb24pICAgKERCdXNNdXRleCAqbXV0ZXgpOworLyoqIERlcHJlY2F0ZWQsIHByb3ZpZGUgREJ1c1JlY3Vyc2l2ZU11dGV4VW5sb2NrRnVuY3Rpb24gaW5zdGVhZC4gUmV0dXJuIHZhbHVlIGlzIHVubG9jayBzdWNjZXNzLCBidXQgZ2V0cyBpZ25vcmVkIGluIHByYWN0aWNlLiAqLwordHlwZWRlZiBkYnVzX2Jvb2xfdCAoKiBEQnVzTXV0ZXhVbmxvY2tGdW5jdGlvbikgKERCdXNNdXRleCAqbXV0ZXgpOworCisvKiogQ3JlYXRlcyBhIG5ldyByZWN1cnNpdmVseS1sb2NrYWJsZSBtdXRleCwgb3IgcmV0dXJucyAjTlVMTCBpZiBub3QKKyAqIGVub3VnaCBtZW1vcnkuICBDYW4gb25seSBmYWlsIGR1ZSB0byBsYWNrIG9mIG1lbW9yeS4gIEZvdW5kIGluCisgKiAjREJ1c1RocmVhZEZ1bmN0aW9ucy4gRG8gbm90IGp1c3QgdXNlIFBUSFJFQURfTVVURVhfUkVDVVJTSVZFIGZvcgorICogdGhpcywgYmVjYXVzZSBpdCBkb2VzIG5vdCBzYXZlL3Jlc3RvcmUgdGhlIHJlY3Vyc2lvbiBjb3VudCB3aGVuCisgKiB3YWl0aW5nIG9uIGEgY29uZGl0aW9uLiBsaWJkYnVzIHJlcXVpcmVzIHRoZSBKYXZhLXN0eWxlIGJlaGF2aW9yCisgKiB3aGVyZSB0aGUgbXV0ZXggaXMgZnVsbHkgdW5sb2NrZWQgdG8gd2FpdCBvbiBhIGNvbmRpdGlvbi4KKyAqLwordHlwZWRlZiBEQnVzTXV0ZXgqICAoKiBEQnVzUmVjdXJzaXZlTXV0ZXhOZXdGdW5jdGlvbikgICAgKHZvaWQpOworLyoqIEZyZWVzIGEgcmVjdXJzaXZlbHktbG9ja2FibGUgbXV0ZXguICBGb3VuZCBpbiAjREJ1c1RocmVhZEZ1bmN0aW9ucy4KKyAqLwordHlwZWRlZiB2b2lkICAgICAgICAoKiBEQnVzUmVjdXJzaXZlTXV0ZXhGcmVlRnVuY3Rpb24pICAgKERCdXNNdXRleCAqbXV0ZXgpOworLyoqIExvY2tzIGEgcmVjdXJzaXZlbHktbG9ja2FibGUgbXV0ZXguICBGb3VuZCBpbiAjREJ1c1RocmVhZEZ1bmN0aW9ucy4KKyAqIENhbiBvbmx5IGZhaWwgZHVlIHRvIGxhY2sgb2YgbWVtb3J5LgorICovCit0eXBlZGVmIHZvaWQgICAgICAgICgqIERCdXNSZWN1cnNpdmVNdXRleExvY2tGdW5jdGlvbikgICAoREJ1c011dGV4ICptdXRleCk7CisvKiogVW5sb2NrcyBhIHJlY3Vyc2l2ZWx5LWxvY2thYmxlIG11dGV4LiAgRm91bmQgaW4gI0RCdXNUaHJlYWRGdW5jdGlvbnMuCisgKiBDYW4gb25seSBmYWlsIGR1ZSB0byBsYWNrIG9mIG1lbW9yeS4KKyAqLwordHlwZWRlZiB2b2lkICAgICAgICAoKiBEQnVzUmVjdXJzaXZlTXV0ZXhVbmxvY2tGdW5jdGlvbikgKERCdXNNdXRleCAqbXV0ZXgpOworCisvKiogQ3JlYXRlcyBhIG5ldyBjb25kaXRpb24gdmFyaWFibGUuICBGb3VuZCBpbiAjREJ1c1RocmVhZEZ1bmN0aW9ucy4KKyAqIENhbiBvbmx5IGZhaWwgKHJldHVybmluZyAjTlVMTCkgZHVlIHRvIGxhY2sgb2YgbWVtb3J5LgorICovCit0eXBlZGVmIERCdXNDb25kVmFyKiAgKCogREJ1c0NvbmRWYXJOZXdGdW5jdGlvbikgICAgICAgICAodm9pZCk7CisvKiogRnJlZXMgYSBjb25kaXRpb24gdmFyaWFibGUuICBGb3VuZCBpbiAjREJ1c1RocmVhZEZ1bmN0aW9ucy4KKyAqLwordHlwZWRlZiB2b2lkICAgICAgICAgICgqIERCdXNDb25kVmFyRnJlZUZ1bmN0aW9uKSAgICAgICAgKERCdXNDb25kVmFyICpjb25kKTsKKworLyoqIFdhaXRzIG9uIGEgY29uZGl0aW9uIHZhcmlhYmxlLiAgRm91bmQgaW4KKyAqICNEQnVzVGhyZWFkRnVuY3Rpb25zLiBNdXN0IHdvcmsgd2l0aCBlaXRoZXIgYSByZWN1cnNpdmUgb3IKKyAqIG5vbnJlY3Vyc2l2ZSBtdXRleCwgd2hpY2hldmVyIHRoZSB0aHJlYWQgaW1wbGVtZW50YXRpb24KKyAqIHByb3ZpZGVzLiBOb3RlIHRoYXQgUFRIUkVBRF9NVVRFWF9SRUNVUlNJVkUgZG9lcyBub3Qgd29yayB3aXRoCisgKiBjb25kaXRpb24gdmFyaWFibGVzIChkb2VzIG5vdCBzYXZlL3Jlc3RvcmUgdGhlIHJlY3Vyc2lvbiBjb3VudCkgc28KKyAqIGRvbid0IHRyeSB1c2luZyBzaW1wbHkgcHRocmVhZF9jb25kX3dhaXQoKSBhbmQgYQorICogUFRIUkVBRF9NVVRFWF9SRUNVUlNJVkUgdG8gaW1wbGVtZW50IHRoaXMsIGl0IHdvbid0IHdvcmsgcmlnaHQuCisgKgorICogSGFzIG5vIGVycm9yIGNvbmRpdGlvbnMuIE11c3Qgc3VjY2VlZCBpZiBpdCByZXR1cm5zLgorICovCit0eXBlZGVmIHZvaWQgICAgICAgICAgKCogREJ1c0NvbmRWYXJXYWl0RnVuY3Rpb24pICAgICAgICAoREJ1c0NvbmRWYXIgKmNvbmQsCisJCQkJCQkJICBEQnVzTXV0ZXggICAqbXV0ZXgpOworCisvKiogV2FpdHMgb24gYSBjb25kaXRpb24gdmFyaWFibGUgd2l0aCBhIHRpbWVvdXQuICBGb3VuZCBpbgorICogICNEQnVzVGhyZWFkRnVuY3Rpb25zLiBSZXR1cm5zICNUUlVFIGlmIHRoZSB3YWl0IGRpZCBub3QKKyAqICB0aW1lIG91dCwgYW5kICNGQUxTRSBpZiBpdCBkaWQuCisgKgorICogSGFzIG5vIGVycm9yIGNvbmRpdGlvbnMuIE11c3Qgc3VjY2VlZCBpZiBpdCByZXR1cm5zLiAKKyAqLwordHlwZWRlZiBkYnVzX2Jvb2xfdCAgICgqIERCdXNDb25kVmFyV2FpdFRpbWVvdXRGdW5jdGlvbikgKERCdXNDb25kVmFyICpjb25kLAorCQkJCQkJCSAgREJ1c011dGV4ICAgKm11dGV4LAorCQkJCQkJCSAgaW50ICAgICAgICAgIHRpbWVvdXRfbWlsbGlzZWNvbmRzKTsKKy8qKiBXYWtlcyBvbmUgd2FpdGluZyB0aHJlYWQgb24gYSBjb25kaXRpb24gdmFyaWFibGUuICBGb3VuZCBpbiAjREJ1c1RocmVhZEZ1bmN0aW9ucy4KKyAqCisgKiBIYXMgbm8gZXJyb3IgY29uZGl0aW9ucy4gTXVzdCBzdWNjZWVkIGlmIGl0IHJldHVybnMuCisgKi8KK3R5cGVkZWYgdm9pZCAgICAgICAgICAoKiBEQnVzQ29uZFZhcldha2VPbmVGdW5jdGlvbikgKERCdXNDb25kVmFyICpjb25kKTsKKworLyoqIFdha2VzIGFsbCB3YWl0aW5nIHRocmVhZHMgb24gYSBjb25kaXRpb24gdmFyaWFibGUuICBGb3VuZCBpbiAjREJ1c1RocmVhZEZ1bmN0aW9ucy4KKyAqCisgKiBIYXMgbm8gZXJyb3IgY29uZGl0aW9ucy4gTXVzdCBzdWNjZWVkIGlmIGl0IHJldHVybnMuCisgKi8KK3R5cGVkZWYgdm9pZCAgICAgICAgICAoKiBEQnVzQ29uZFZhcldha2VBbGxGdW5jdGlvbikgKERCdXNDb25kVmFyICpjb25kKTsKKworLyoqCisgKiBGbGFncyBpbmRpY2F0aW5nIHdoaWNoIGZ1bmN0aW9ucyBhcmUgcHJlc2VudCBpbiAjREJ1c1RocmVhZEZ1bmN0aW9ucy4gVXNlZCB0byBhbGxvdworICogdGhlIGxpYnJhcnkgdG8gZGV0ZWN0IG9sZGVyIGNhbGxlcnMgb2YgZGJ1c190aHJlYWRzX2luaXQoKSBpZiBuZXcgcG9zc2libGUgZnVuY3Rpb25zCisgKiBhcmUgYWRkZWQgdG8gI0RCdXNUaHJlYWRGdW5jdGlvbnMuCisgKi8KK3R5cGVkZWYgZW51bSAKK3sKKyAgREJVU19USFJFQURfRlVOQ1RJT05TX01VVEVYX05FV19NQVNLICAgICAgPSAxIDw8IDAsCisgIERCVVNfVEhSRUFEX0ZVTkNUSU9OU19NVVRFWF9GUkVFX01BU0sgICAgID0gMSA8PCAxLAorICBEQlVTX1RIUkVBRF9GVU5DVElPTlNfTVVURVhfTE9DS19NQVNLICAgICA9IDEgPDwgMiwKKyAgREJVU19USFJFQURfRlVOQ1RJT05TX01VVEVYX1VOTE9DS19NQVNLICAgPSAxIDw8IDMsCisgIERCVVNfVEhSRUFEX0ZVTkNUSU9OU19DT05EVkFSX05FV19NQVNLICAgID0gMSA8PCA0LAorICBEQlVTX1RIUkVBRF9GVU5DVElPTlNfQ09ORFZBUl9GUkVFX01BU0sgICA9IDEgPDwgNSwKKyAgREJVU19USFJFQURfRlVOQ1RJT05TX0NPTkRWQVJfV0FJVF9NQVNLICAgPSAxIDw8IDYsCisgIERCVVNfVEhSRUFEX0ZVTkNUSU9OU19DT05EVkFSX1dBSVRfVElNRU9VVF9NQVNLICAgPSAxIDw8IDcsCisgIERCVVNfVEhSRUFEX0ZVTkNUSU9OU19DT05EVkFSX1dBS0VfT05FX01BU0sgPSAxIDw8IDgsCisgIERCVVNfVEhSRUFEX0ZVTkNUSU9OU19DT05EVkFSX1dBS0VfQUxMX01BU0sgPSAxIDw8IDksCisgIERCVVNfVEhSRUFEX0ZVTkNUSU9OU19SRUNVUlNJVkVfTVVURVhfTkVXX01BU0sgICAgPSAxIDw8IDEwLAorICBEQlVTX1RIUkVBRF9GVU5DVElPTlNfUkVDVVJTSVZFX01VVEVYX0ZSRUVfTUFTSyAgID0gMSA8PCAxMSwKKyAgREJVU19USFJFQURfRlVOQ1RJT05TX1JFQ1VSU0lWRV9NVVRFWF9MT0NLX01BU0sgICA9IDEgPDwgMTIsCisgIERCVVNfVEhSRUFEX0ZVTkNUSU9OU19SRUNVUlNJVkVfTVVURVhfVU5MT0NLX01BU0sgPSAxIDw8IDEzLAorICBEQlVTX1RIUkVBRF9GVU5DVElPTlNfQUxMX01BU0sgICAgID0gKDEgPDwgMTQpIC0gMQorfSBEQnVzVGhyZWFkRnVuY3Rpb25zTWFzazsKKworLyoqCisgKiBGdW5jdGlvbnMgdGhhdCBtdXN0IGJlIGltcGxlbWVudGVkIHRvIG1ha2UgdGhlIEQtQnVzIGxpYnJhcnkKKyAqIHRocmVhZC1hd2FyZS4KKyAqCisgKiBJZiB5b3Ugc3VwcGx5IGJvdGggcmVjdXJzaXZlIGFuZCBub24tcmVjdXJzaXZlIG11dGV4ZXMsCisgKiBsaWJkYnVzIHdpbGwgdXNlIHRoZSBub24tcmVjdXJzaXZlIHZlcnNpb24gZm9yIGNvbmRpdGlvbiB2YXJpYWJsZXMsCisgKiBhbmQgdGhlIHJlY3Vyc2l2ZSB2ZXJzaW9uIGluIG90aGVyIGNvbnRleHRzLgorICoKKyAqIFRoZSBjb25kaXRpb24gdmFyaWFibGUgZnVuY3Rpb25zIGhhdmUgdG8gd29yayB3aXRoIG5vbnJlY3Vyc2l2ZQorICogbXV0ZXhlcyBpZiB5b3UgcHJvdmlkZSB0aG9zZSwgb3Igd2l0aCByZWN1cnNpdmUgbXV0ZXhlcyBpZiB5b3UKKyAqIGRvbid0LgorICovCit0eXBlZGVmIHN0cnVjdAoreworICB1bnNpZ25lZCBpbnQgbWFzazsgLyoqPCBNYXNrIGluZGljYXRpbmcgd2hpY2ggZnVuY3Rpb25zIGFyZSBwcmVzZW50LiAqLworCisgIERCdXNNdXRleE5ld0Z1bmN0aW9uIG11dGV4X25ldzsgLyoqPCBGdW5jdGlvbiB0byBjcmVhdGUgYSBtdXRleDsgb3B0aW9uYWwgYW5kIGRlcHJlY2F0ZWQuICovCisgIERCdXNNdXRleEZyZWVGdW5jdGlvbiBtdXRleF9mcmVlOyAvKio8IEZ1bmN0aW9uIHRvIGZyZWUgYSBtdXRleDsgb3B0aW9uYWwgYW5kIGRlcHJlY2F0ZWQuICovCisgIERCdXNNdXRleExvY2tGdW5jdGlvbiBtdXRleF9sb2NrOyAvKio8IEZ1bmN0aW9uIHRvIGxvY2sgYSBtdXRleDsgb3B0aW9uYWwgYW5kIGRlcHJlY2F0ZWQuICovCisgIERCdXNNdXRleFVubG9ja0Z1bmN0aW9uIG11dGV4X3VubG9jazsgLyoqPCBGdW5jdGlvbiB0byB1bmxvY2sgYSBtdXRleDsgb3B0aW9uYWwgYW5kIGRlcHJlY2F0ZWQuICovCisKKyAgREJ1c0NvbmRWYXJOZXdGdW5jdGlvbiBjb25kdmFyX25ldzsgLyoqPCBGdW5jdGlvbiB0byBjcmVhdGUgYSBjb25kaXRpb24gdmFyaWFibGUgKi8KKyAgREJ1c0NvbmRWYXJGcmVlRnVuY3Rpb24gY29uZHZhcl9mcmVlOyAvKio8IEZ1bmN0aW9uIHRvIGZyZWUgYSBjb25kaXRpb24gdmFyaWFibGUgKi8KKyAgREJ1c0NvbmRWYXJXYWl0RnVuY3Rpb24gY29uZHZhcl93YWl0OyAvKio8IEZ1bmN0aW9uIHRvIHdhaXQgb24gYSBjb25kaXRpb24gKi8KKyAgREJ1c0NvbmRWYXJXYWl0VGltZW91dEZ1bmN0aW9uIGNvbmR2YXJfd2FpdF90aW1lb3V0OyAvKio8IEZ1bmN0aW9uIHRvIHdhaXQgb24gYSBjb25kaXRpb24gd2l0aCBhIHRpbWVvdXQgKi8KKyAgREJ1c0NvbmRWYXJXYWtlT25lRnVuY3Rpb24gY29uZHZhcl93YWtlX29uZTsgLyoqPCBGdW5jdGlvbiB0byB3YWtlIG9uZSB0aHJlYWQgd2FpdGluZyBvbiB0aGUgY29uZGl0aW9uICovCisgIERCdXNDb25kVmFyV2FrZUFsbEZ1bmN0aW9uIGNvbmR2YXJfd2FrZV9hbGw7IC8qKjwgRnVuY3Rpb24gdG8gd2FrZSBhbGwgdGhyZWFkcyB3YWl0aW5nIG9uIHRoZSBjb25kaXRpb24gKi8KKyAKKyAgREJ1c1JlY3Vyc2l2ZU11dGV4TmV3RnVuY3Rpb24gcmVjdXJzaXZlX211dGV4X25ldzsgLyoqPCBGdW5jdGlvbiB0byBjcmVhdGUgYSByZWN1cnNpdmUgbXV0ZXggKi8KKyAgREJ1c1JlY3Vyc2l2ZU11dGV4RnJlZUZ1bmN0aW9uIHJlY3Vyc2l2ZV9tdXRleF9mcmVlOyAvKio8IEZ1bmN0aW9uIHRvIGZyZWUgYSByZWN1cnNpdmUgbXV0ZXggKi8KKyAgREJ1c1JlY3Vyc2l2ZU11dGV4TG9ja0Z1bmN0aW9uIHJlY3Vyc2l2ZV9tdXRleF9sb2NrOyAvKio8IEZ1bmN0aW9uIHRvIGxvY2sgYSByZWN1cnNpdmUgbXV0ZXggKi8KKyAgREJ1c1JlY3Vyc2l2ZU11dGV4VW5sb2NrRnVuY3Rpb24gcmVjdXJzaXZlX211dGV4X3VubG9jazsgLyoqPCBGdW5jdGlvbiB0byB1bmxvY2sgYSByZWN1cnNpdmUgbXV0ZXggKi8KKworICB2b2lkICgqIHBhZGRpbmcxKSAodm9pZCk7IC8qKjwgUmVzZXJ2ZWQgZm9yIGZ1dHVyZSBleHBhbnNpb24gKi8KKyAgdm9pZCAoKiBwYWRkaW5nMikgKHZvaWQpOyAvKio8IFJlc2VydmVkIGZvciBmdXR1cmUgZXhwYW5zaW9uICovCisgIHZvaWQgKCogcGFkZGluZzMpICh2b2lkKTsgLyoqPCBSZXNlcnZlZCBmb3IgZnV0dXJlIGV4cGFuc2lvbiAqLworICB2b2lkICgqIHBhZGRpbmc0KSAodm9pZCk7IC8qKjwgUmVzZXJ2ZWQgZm9yIGZ1dHVyZSBleHBhbnNpb24gKi8KKyAgCit9IERCdXNUaHJlYWRGdW5jdGlvbnM7CisKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCAgZGJ1c190aHJlYWRzX2luaXQgICAgICAgICAoY29uc3QgREJ1c1RocmVhZEZ1bmN0aW9ucyAqZnVuY3Rpb25zKTsKK0RCVVNfRVhQT1JUCitkYnVzX2Jvb2xfdCAgZGJ1c190aHJlYWRzX2luaXRfZGVmYXVsdCAodm9pZCk7CisKKy8qKiBAfSAqLworCitEQlVTX0VORF9ERUNMUworCisjZW5kaWYgLyogREJVU19USFJFQURTX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy10aW1lb3V0LmMgYi9kYnVzL2RidXMtdGltZW91dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzY2E2ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtdGltZW91dC5jCkBAIC0wLDAgKzEsNTE5IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtdGltZW91dC5jIERCdXNUaW1lb3V0IGltcGxlbWVudGF0aW9uCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzICBDb2RlRmFjdG9yeSBBQgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKyNpbmNsdWRlICJkYnVzLXRpbWVvdXQuaCIKKyNpbmNsdWRlICJkYnVzLWxpc3QuaCIKKworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c1RpbWVvdXRJbnRlcm5hbHMgREJ1c1RpbWVvdXQgaW1wbGVtZW50YXRpb24gZGV0YWlscworICogQGluZ3JvdXAgIERCdXNJbnRlcm5hbHMKKyAqIEBicmllZiBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIGZvciBEQnVzVGltZW91dAorICogCisgKiBAeworICovCisKKy8qKgorICogSW50ZXJuYWxzIG9mIERCdXNUaW1lb3V0CisgKi8KK3N0cnVjdCBEQnVzVGltZW91dAoreworICBpbnQgcmVmY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFJlZmVyZW5jZSBjb3VudCAqLworICBpbnQgaW50ZXJ2YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFRpbWVvdXQgaW50ZXJ2YWwgaW4gbWlsbGlzZWNvbmRzLiAqLworCisgIERCdXNUaW1lb3V0SGFuZGxlciBoYW5kbGVyOyAgICAgICAgICAgICAgICAgIC8qKjwgVGltZW91dCBoYW5kbGVyLiAqLworICB2b2lkICpoYW5kbGVyX2RhdGE7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFRpbWVvdXQgaGFuZGxlciBkYXRhLiAqLworICBEQnVzRnJlZUZ1bmN0aW9uIGZyZWVfaGFuZGxlcl9kYXRhX2Z1bmN0aW9uOyAvKio8IEZyZWUgdGhlIHRpbWVvdXQgaGFuZGxlciBkYXRhLiAqLworICAKKyAgdm9pZCAqZGF0YTsJCSAgIAkgICAgICAgICAgICAgICAvKio8IEFwcGxpY2F0aW9uIGRhdGEuICovCisgIERCdXNGcmVlRnVuY3Rpb24gZnJlZV9kYXRhX2Z1bmN0aW9uOyAgICAgICAgIC8qKjwgRnJlZSB0aGUgYXBwbGljYXRpb24gZGF0YS4gKi8KKyAgdW5zaWduZWQgaW50IGVuYWJsZWQgOiAxOyAgICAgICAgICAgICAgICAgICAgLyoqPCBUcnVlIGlmIHRpbWVvdXQgaXMgYWN0aXZlLiAqLworICB1bnNpZ25lZCBpbnQgbmVlZHNfcmVzdGFydCA6IDE7ICAgICAgICAgICAgICAvKio8IEZsYWcgdGhhdCB0aW1lb3V0IHNob3VsZCBiZSByZXN0YXJ0ZWQgYWZ0ZXIgcmUtZW5hYmxpbmcuICovCit9OworCisvKioKKyAqIENyZWF0ZXMgYSBuZXcgREJ1c1RpbWVvdXQsIGVuYWJsZWQgYnkgZGVmYXVsdC4KKyAqIEBwYXJhbSBpbnRlcnZhbCB0aGUgdGltZW91dCBpbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMuCisgKiBAcGFyYW0gaGFuZGxlciBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIHRpbWVvdXQgb2NjdXJzLgorICogQHBhcmFtIGRhdGEgZGF0YSB0byBwYXNzIHRvIHRoZSBoYW5kbGVyCisgKiBAcGFyYW0gZnJlZV9kYXRhX2Z1bmN0aW9uIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB0byBmcmVlIHRoZSBkYXRhLgorICogQHJldHVybnMgdGhlIG5ldyBEQnVzVGltZW91dCBvYmplY3QsCisgKi8KK0RCdXNUaW1lb3V0KgorX2RidXNfdGltZW91dF9uZXcgKGludCAgICAgICAgICAgICAgICAgaW50ZXJ2YWwsCisJCSAgIERCdXNUaW1lb3V0SGFuZGxlciAgaGFuZGxlciwKKwkJICAgdm9pZCAgICAgICAgICAgICAgICpkYXRhLAorCQkgICBEQnVzRnJlZUZ1bmN0aW9uICAgIGZyZWVfZGF0YV9mdW5jdGlvbikKK3sKKyAgREJ1c1RpbWVvdXQgKnRpbWVvdXQ7CisKKyAgdGltZW91dCA9IGRidXNfbmV3MCAoREJ1c1RpbWVvdXQsIDEpOworICBpZiAodGltZW91dCA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworICAKKyAgdGltZW91dC0+cmVmY291bnQgPSAxOworICB0aW1lb3V0LT5pbnRlcnZhbCA9IGludGVydmFsOworCisgIHRpbWVvdXQtPmhhbmRsZXIgPSBoYW5kbGVyOworICB0aW1lb3V0LT5oYW5kbGVyX2RhdGEgPSBkYXRhOworICB0aW1lb3V0LT5mcmVlX2hhbmRsZXJfZGF0YV9mdW5jdGlvbiA9IGZyZWVfZGF0YV9mdW5jdGlvbjsKKworICB0aW1lb3V0LT5lbmFibGVkID0gVFJVRTsKKyAgdGltZW91dC0+bmVlZHNfcmVzdGFydCA9IEZBTFNFOworICAKKyAgcmV0dXJuIHRpbWVvdXQ7Cit9CisKKy8qKgorICogSW5jcmVtZW50cyB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIGEgREJ1c1RpbWVvdXQgb2JqZWN0LgorICoKKyAqIEBwYXJhbSB0aW1lb3V0IHRoZSB0aW1lb3V0IG9iamVjdC4KKyAqIEByZXR1cm5zIHRoZSB0aW1lb3V0IG9iamVjdC4KKyAqLworREJ1c1RpbWVvdXQgKgorX2RidXNfdGltZW91dF9yZWYgKERCdXNUaW1lb3V0ICp0aW1lb3V0KQoreworICB0aW1lb3V0LT5yZWZjb3VudCArPSAxOworCisgIHJldHVybiB0aW1lb3V0OworfQorCisvKioKKyAqIERlY3JlbWVudHMgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiBhIERCdXNUaW1lb3V0IG9iamVjdAorICogYW5kIGZpbmFsaXplcyB0aGUgb2JqZWN0IGlmIHRoZSBjb3VudCByZWFjaGVzIHplcm8uCisgKgorICogQHBhcmFtIHRpbWVvdXQgdGhlIHRpbWVvdXQgb2JqZWN0LgorICovCit2b2lkCitfZGJ1c190aW1lb3V0X3VucmVmIChEQnVzVGltZW91dCAqdGltZW91dCkKK3sKKyAgX2RidXNfYXNzZXJ0ICh0aW1lb3V0ICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKHRpbWVvdXQtPnJlZmNvdW50ID4gMCk7CisgIAorICB0aW1lb3V0LT5yZWZjb3VudCAtPSAxOworICBpZiAodGltZW91dC0+cmVmY291bnQgPT0gMCkKKyAgICB7CisgICAgICBkYnVzX3RpbWVvdXRfc2V0X2RhdGEgKHRpbWVvdXQsIE5VTEwsIE5VTEwpOyAvKiBjYWxsIGZyZWVfZGF0YV9mdW5jdGlvbiAqLworCisgICAgICBpZiAodGltZW91dC0+ZnJlZV9oYW5kbGVyX2RhdGFfZnVuY3Rpb24pCisJKCogdGltZW91dC0+ZnJlZV9oYW5kbGVyX2RhdGFfZnVuY3Rpb24pICh0aW1lb3V0LT5oYW5kbGVyX2RhdGEpOworICAgICAgCisgICAgICBkYnVzX2ZyZWUgKHRpbWVvdXQpOworICAgIH0KK30KKworLyoqCisgKiBDaGFuZ2UgdGhlIHRpbWVvdXQgaW50ZXJ2YWwgdG8gYmUgaW50ZXJ2YWwgbWlsbGlzZWNvbmRzIGZyb20gbm93CisgKiAoZm9yZ2V0dGluZyB3aGVuIHRoZSB0aW1lb3V0IHdhcyBpbml0aWFsbHkgc3RhcnRlZCksIGFuZCBlbmFibGUgaXQuCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBvbmx5IHZhbGlkIHdoZW4gdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIERCdXNMb29wOgorICogaXQgY2FuIGJlIHVzZWQgaW4gdGhlIG1lc3NhZ2UgYnVzIGRhZW1vbiBpbXBsZW1lbnRhdGlvbiBvciBpbiB1bml0IHRlc3RzLAorICogYnV0IGl0IGNhbm5vdCBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggYW4gYXBwbGljYXRpb24gbWFpbiBsb29wLgorICoKKyAqIEBwYXJhbSB0aW1lb3V0IHRoZSB0aW1lb3V0CisgKiBAcGFyYW0gaW50ZXJ2YWwgdGhlIG5ldyBpbnRlcnZhbAorICovCit2b2lkCitfZGJ1c190aW1lb3V0X3Jlc3RhcnQgKERCdXNUaW1lb3V0ICp0aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgaW50ZXJ2YWwpCit7CisgIF9kYnVzX2Fzc2VydCAoaW50ZXJ2YWwgPj0gMCk7CisgIAorICB0aW1lb3V0LT5pbnRlcnZhbCA9IGludGVydmFsOworICB0aW1lb3V0LT5lbmFibGVkID0gVFJVRTsKKyAgdGltZW91dC0+bmVlZHNfcmVzdGFydCA9IFRSVUU7Cit9CisKKy8qKgorICogRGlzYWJsZSB0aGUgdGltZW91dC4gTm90ZSB0aGF0IHlvdSBzaG91bGQgdXNlCisgKiBfZGJ1c19jb25uZWN0aW9uX3RvZ2dsZV90aW1lb3V0X3VubG9ja2VkKCkgZXRjLiBpbnN0ZWFkLCBpZgorICogdGhlIHRpbWVvdXQgaXMgcGFzc2VkIG91dCB0byBhbiBhcHBsaWNhdGlvbiBtYWluIGxvb3AuCisgKiBpLmUuIHlvdSBjYW4ndCB1c2UgdGhpcyBmdW5jdGlvbiBpbiB0aGUgRC1CdXMgbGlicmFyeSwgaXQncworICogb25seSB1c2VkIGluIHRoZSBtZXNzYWdlIGJ1cyBkYWVtb24gaW1wbGVtZW50YXRpb24uCisgKgorICogQHBhcmFtIHRpbWVvdXQgdGhlIHRpbWVvdXQKKyAqIEBwYXJhbSBlbmFibGVkICNUUlVFIGlmIHRpbWVvdXQgc2hvdWxkIGJlIGVuYWJsZWQuCisgKi8KK3ZvaWQKK19kYnVzX3RpbWVvdXRfZGlzYWJsZSAoREJ1c1RpbWVvdXQgICp0aW1lb3V0KQoreworICB0aW1lb3V0LT5lbmFibGVkID0gRkFMU0U7Cit9CisKKy8qKgorICogQHR5cGVkZWYgREJ1c1RpbWVvdXRMaXN0CisgKgorICogT3BhcXVlIGRhdGEgdHlwZSByZXByZXNlbnRpbmcgYSBsaXN0IG9mIHRpbWVvdXRzCisgKiBhbmQgYSBzZXQgb2YgREJ1c0FkZFRpbWVvdXRGdW5jdGlvbi9EQnVzUmVtb3ZlVGltZW91dEZ1bmN0aW9uLgorICogQXV0b21hdGljYWxseSBoYW5kbGVzIHJlbW92aW5nL3JlLWFkZGluZyB0aW1lb3V0cworICogd2hlbiB0aGUgREJ1c0FkZFRpbWVvdXRGdW5jdGlvbiBpcyB1cGRhdGVkIG9yIGNoYW5nZWQuCisgKiBIb2xkcyBhIHJlZmVyZW5jZSBjb3VudCB0byBlYWNoIHRpbWVvdXQuCisgKgorICovCisKKy8qKgorICogREJ1c1RpbWVvdXRMaXN0IGltcGxlbWVudGF0aW9uIGRldGFpbHMuIEFsbCBmaWVsZHMKKyAqIGFyZSBwcml2YXRlLgorICoKKyAqLworc3RydWN0IERCdXNUaW1lb3V0TGlzdAoreworICBEQnVzTGlzdCAqdGltZW91dHM7IC8qKjwgVGltZW91dCBvYmplY3RzLiAqLworCisgIERCdXNBZGRUaW1lb3V0RnVuY3Rpb24gYWRkX3RpbWVvdXRfZnVuY3Rpb247ICAgICAgIC8qKjwgQ2FsbGJhY2sgZm9yIGFkZGluZyBhIHRpbWVvdXQuICovCisgIERCdXNSZW1vdmVUaW1lb3V0RnVuY3Rpb24gcmVtb3ZlX3RpbWVvdXRfZnVuY3Rpb247IC8qKjwgQ2FsbGJhY2sgZm9yIHJlbW92aW5nIGEgdGltZW91dC4gKi8KKyAgREJ1c1RpbWVvdXRUb2dnbGVkRnVuY3Rpb24gdGltZW91dF90b2dnbGVkX2Z1bmN0aW9uOyAvKio8IENhbGxiYWNrIHdoZW4gdGltZW91dCBpcyBlbmFibGVkL2Rpc2FibGVkIG9yIGNoYW5nZXMgaW50ZXJ2YWwgKi8KKyAgdm9pZCAqdGltZW91dF9kYXRhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBEYXRhIGZvciB0aW1lb3V0IGNhbGxiYWNrcyAqLworICBEQnVzRnJlZUZ1bmN0aW9uIHRpbWVvdXRfZnJlZV9kYXRhX2Z1bmN0aW9uOyAgICAgICAvKio8IEZyZWUgZnVuY3Rpb24gZm9yIHRpbWVvdXQgY2FsbGJhY2sgZGF0YSAqLworfTsKKworLyoqCisgKiBDcmVhdGVzIGEgbmV3IHRpbWVvdXQgbGlzdC4gUmV0dXJucyAjTlVMTCBpZiBpbnN1ZmZpY2llbnQKKyAqIG1lbW9yeSBleGlzdHMuCisgKgorICogQHJldHVybnMgdGhlIG5ldyB0aW1lb3V0IGxpc3QsIG9yICNOVUxMIG9uIGZhaWx1cmUuCisgKi8KK0RCdXNUaW1lb3V0TGlzdCoKK19kYnVzX3RpbWVvdXRfbGlzdF9uZXcgKHZvaWQpCit7CisgIERCdXNUaW1lb3V0TGlzdCAqdGltZW91dF9saXN0OworCisgIHRpbWVvdXRfbGlzdCA9IGRidXNfbmV3MCAoREJ1c1RpbWVvdXRMaXN0LCAxKTsKKyAgaWYgKHRpbWVvdXRfbGlzdCA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIHJldHVybiB0aW1lb3V0X2xpc3Q7Cit9CisKKy8qKgorICogRnJlZXMgYSBEQnVzVGltZW91dExpc3QuCisgKgorICogQHBhcmFtIHRpbWVvdXRfbGlzdCB0aGUgdGltZW91dCBsaXN0LgorICovCit2b2lkCitfZGJ1c190aW1lb3V0X2xpc3RfZnJlZSAoREJ1c1RpbWVvdXRMaXN0ICp0aW1lb3V0X2xpc3QpCit7CisgIC8qIGZyZWUgdGltZW91dF9kYXRhIGFuZCByZW1vdmUgdGltZW91dHMgYXMgYSBzaWRlIGVmZmVjdCAqLworICBfZGJ1c190aW1lb3V0X2xpc3Rfc2V0X2Z1bmN0aW9ucyAodGltZW91dF9saXN0LAorCQkJCSAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKKworICBfZGJ1c19saXN0X2ZvcmVhY2ggKCZ0aW1lb3V0X2xpc3QtPnRpbWVvdXRzLAorCQkgICAgICAoREJ1c0ZvcmVhY2hGdW5jdGlvbikgX2RidXNfdGltZW91dF91bnJlZiwKKwkJICAgICAgTlVMTCk7CisgIF9kYnVzX2xpc3RfY2xlYXIgKCZ0aW1lb3V0X2xpc3QtPnRpbWVvdXRzKTsKKworICBkYnVzX2ZyZWUgKHRpbWVvdXRfbGlzdCk7Cit9CisKKy8qKgorICogU2V0cyB0aGUgdGltZW91dCBmdW5jdGlvbnMuIFRoaXMgZnVuY3Rpb24gaXMgdGhlICJiYWNrZW5kIgorICogZm9yIGRidXNfY29ubmVjdGlvbl9zZXRfdGltZW91dF9mdW5jdGlvbnMoKS4KKyAqCisgKiBAcGFyYW0gdGltZW91dF9saXN0IHRoZSB0aW1lb3V0IGxpc3QKKyAqIEBwYXJhbSBhZGRfZnVuY3Rpb24gdGhlIGFkZCB0aW1lb3V0IGZ1bmN0aW9uLgorICogQHBhcmFtIHJlbW92ZV9mdW5jdGlvbiB0aGUgcmVtb3ZlIHRpbWVvdXQgZnVuY3Rpb24uCisgKiBAcGFyYW0gdG9nZ2xlZF9mdW5jdGlvbiB0b2dnbGUgbm90aWZ5IGZ1bmN0aW9uLCBvciAjTlVMTAorICogQHBhcmFtIGRhdGEgdGhlIGRhdGEgZm9yIHRob3NlIGZ1bmN0aW9ucy4KKyAqIEBwYXJhbSBmcmVlX2RhdGFfZnVuY3Rpb24gdGhlIGZ1bmN0aW9uIHRvIGZyZWUgdGhlIGRhdGEuCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgbm8gbWVtb3J5CisgKgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfdGltZW91dF9saXN0X3NldF9mdW5jdGlvbnMgKERCdXNUaW1lb3V0TGlzdCAgICAgICAgICAgKnRpbWVvdXRfbGlzdCwKKwkJCQkgIERCdXNBZGRUaW1lb3V0RnVuY3Rpb24gICAgIGFkZF9mdW5jdGlvbiwKKwkJCQkgIERCdXNSZW1vdmVUaW1lb3V0RnVuY3Rpb24gIHJlbW92ZV9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVGltZW91dFRvZ2dsZWRGdW5jdGlvbiB0b2dnbGVkX2Z1bmN0aW9uLAorCQkJCSAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAqZGF0YSwKKwkJCQkgIERCdXNGcmVlRnVuY3Rpb24gICAgICAgICAgIGZyZWVfZGF0YV9mdW5jdGlvbikKK3sKKyAgLyogQWRkIHRpbWVvdXRzIHdpdGggdGhlIG5ldyBmdW5jdGlvbiwgZmFpbGluZyBvbiBPT00gKi8KKyAgaWYgKGFkZF9mdW5jdGlvbiAhPSBOVUxMKQorICAgIHsKKyAgICAgIERCdXNMaXN0ICpsaW5rOworICAgICAgCisgICAgICBsaW5rID0gX2RidXNfbGlzdF9nZXRfZmlyc3RfbGluayAoJnRpbWVvdXRfbGlzdC0+dGltZW91dHMpOworICAgICAgd2hpbGUgKGxpbmsgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIERCdXNMaXN0ICpuZXh0ID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmdGltZW91dF9saXN0LT50aW1lb3V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluayk7CisgICAgICAKKyAgICAgICAgICBpZiAoISgqIGFkZF9mdW5jdGlvbikgKGxpbmstPmRhdGEsIGRhdGEpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvKiByZW1vdmUgaXQgYWxsIGFnYWluIGFuZCByZXR1cm4gRkFMU0UgKi8KKyAgICAgICAgICAgICAgREJ1c0xpc3QgKmxpbmsyOworICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgbGluazIgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmdGltZW91dF9saXN0LT50aW1lb3V0cyk7CisgICAgICAgICAgICAgIHdoaWxlIChsaW5rMiAhPSBsaW5rKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIERCdXNMaXN0ICpuZXh0MiA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJnRpbWVvdXRfbGlzdC0+dGltZW91dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmsyKTsKKworICAgICAgICAgICAgICAgICAgKCogcmVtb3ZlX2Z1bmN0aW9uKSAobGluazItPmRhdGEsIGRhdGEpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICBsaW5rMiA9IG5leHQyOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAKKyAgICAgICAgICBsaW5rID0gbmV4dDsKKyAgICAgICAgfQorICAgIH0KKyAgCisgIC8qIFJlbW92ZSBhbGwgY3VycmVudCB0aW1lb3V0cyBmcm9tIHByZXZpb3VzIHRpbWVvdXQgaGFuZGxlcnMgKi8KKworICBpZiAodGltZW91dF9saXN0LT5yZW1vdmVfdGltZW91dF9mdW5jdGlvbiAhPSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX2xpc3RfZm9yZWFjaCAoJnRpbWVvdXRfbGlzdC0+dGltZW91dHMsCisJCQkgIChEQnVzRm9yZWFjaEZ1bmN0aW9uKSB0aW1lb3V0X2xpc3QtPnJlbW92ZV90aW1lb3V0X2Z1bmN0aW9uLAorCQkJICB0aW1lb3V0X2xpc3QtPnRpbWVvdXRfZGF0YSk7CisgICAgfQorCisgIGlmICh0aW1lb3V0X2xpc3QtPnRpbWVvdXRfZnJlZV9kYXRhX2Z1bmN0aW9uICE9IE5VTEwpCisgICAgKCogdGltZW91dF9saXN0LT50aW1lb3V0X2ZyZWVfZGF0YV9mdW5jdGlvbikgKHRpbWVvdXRfbGlzdC0+dGltZW91dF9kYXRhKTsKKworICB0aW1lb3V0X2xpc3QtPmFkZF90aW1lb3V0X2Z1bmN0aW9uID0gYWRkX2Z1bmN0aW9uOworICB0aW1lb3V0X2xpc3QtPnJlbW92ZV90aW1lb3V0X2Z1bmN0aW9uID0gcmVtb3ZlX2Z1bmN0aW9uOworICB0aW1lb3V0X2xpc3QtPnRpbWVvdXRfdG9nZ2xlZF9mdW5jdGlvbiA9IHRvZ2dsZWRfZnVuY3Rpb247CisgIHRpbWVvdXRfbGlzdC0+dGltZW91dF9kYXRhID0gZGF0YTsKKyAgdGltZW91dF9saXN0LT50aW1lb3V0X2ZyZWVfZGF0YV9mdW5jdGlvbiA9IGZyZWVfZGF0YV9mdW5jdGlvbjsKKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBBZGRzIGEgbmV3IHRpbWVvdXQgdG8gdGhlIHRpbWVvdXQgbGlzdCwgaW52b2tpbmcgdGhlCisgKiBhcHBsaWNhdGlvbiBEQnVzQWRkVGltZW91dEZ1bmN0aW9uIGlmIGFwcHJvcHJpYXRlLgorICoKKyAqIEBwYXJhbSB0aW1lb3V0X2xpc3QgdGhlIHRpbWVvdXQgbGlzdC4KKyAqIEBwYXJhbSB0aW1lb3V0IHRoZSB0aW1lb3V0IHRvIGFkZC4KKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MsICNGQUxTRSBJZiBubyBtZW1vcnkuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c190aW1lb3V0X2xpc3RfYWRkX3RpbWVvdXQgKERCdXNUaW1lb3V0TGlzdCAqdGltZW91dF9saXN0LAorCQkJCURCdXNUaW1lb3V0ICAgICAqdGltZW91dCkKK3sKKyAgaWYgKCFfZGJ1c19saXN0X2FwcGVuZCAoJnRpbWVvdXRfbGlzdC0+dGltZW91dHMsIHRpbWVvdXQpKQorICAgIHJldHVybiBGQUxTRTsKKworICBfZGJ1c190aW1lb3V0X3JlZiAodGltZW91dCk7CisKKyAgaWYgKHRpbWVvdXRfbGlzdC0+YWRkX3RpbWVvdXRfZnVuY3Rpb24gIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoISgqIHRpbWVvdXRfbGlzdC0+YWRkX3RpbWVvdXRfZnVuY3Rpb24pICh0aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dF9saXN0LT50aW1lb3V0X2RhdGEpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfbGlzdF9yZW1vdmVfbGFzdCAoJnRpbWVvdXRfbGlzdC0+dGltZW91dHMsIHRpbWVvdXQpOworICAgICAgICAgIF9kYnVzX3RpbWVvdXRfdW5yZWYgKHRpbWVvdXQpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBSZW1vdmVzIGEgdGltZW91dCBmcm9tIHRoZSB0aW1lb3V0IGxpc3QsIGludm9raW5nIHRoZQorICogYXBwbGljYXRpb24ncyBEQnVzUmVtb3ZlVGltZW91dEZ1bmN0aW9uIGlmIGFwcHJvcHJpYXRlLgorICoKKyAqIEBwYXJhbSB0aW1lb3V0X2xpc3QgdGhlIHRpbWVvdXQgbGlzdC4KKyAqIEBwYXJhbSB0aW1lb3V0IHRoZSB0aW1lb3V0IHRvIHJlbW92ZS4KKyAqLwordm9pZAorX2RidXNfdGltZW91dF9saXN0X3JlbW92ZV90aW1lb3V0IChEQnVzVGltZW91dExpc3QgKnRpbWVvdXRfbGlzdCwKKwkJCQkgICBEQnVzVGltZW91dCAgICAgKnRpbWVvdXQpCit7CisgIGlmICghX2RidXNfbGlzdF9yZW1vdmUgKCZ0aW1lb3V0X2xpc3QtPnRpbWVvdXRzLCB0aW1lb3V0KSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJOb25leGlzdGVudCB0aW1lb3V0IHdhcyByZW1vdmVkIik7CisKKyAgaWYgKHRpbWVvdXRfbGlzdC0+cmVtb3ZlX3RpbWVvdXRfZnVuY3Rpb24gIT0gTlVMTCkKKyAgICAoKiB0aW1lb3V0X2xpc3QtPnJlbW92ZV90aW1lb3V0X2Z1bmN0aW9uKSAodGltZW91dCwKKwkJCQkJICAgICAgIHRpbWVvdXRfbGlzdC0+dGltZW91dF9kYXRhKTsKKworICBfZGJ1c190aW1lb3V0X3VucmVmICh0aW1lb3V0KTsKK30KKworLyoqCisgKiBTZXRzIGEgdGltZW91dCB0byB0aGUgZ2l2ZW4gZW5hYmxlZCBzdGF0ZSwgaW52b2tpbmcgdGhlCisgKiBhcHBsaWNhdGlvbidzIERCdXNUaW1lb3V0VG9nZ2xlZEZ1bmN0aW9uIGlmIGFwcHJvcHJpYXRlLgorICoKKyAqIEBwYXJhbSB0aW1lb3V0X2xpc3QgdGhlIHRpbWVvdXQgbGlzdC4KKyAqIEBwYXJhbSB0aW1lb3V0IHRoZSB0aW1lb3V0IHRvIHRvZ2dsZS4KKyAqIEBwYXJhbSBlbmFibGVkICNUUlVFIHRvIGVuYWJsZQorICovCit2b2lkCitfZGJ1c190aW1lb3V0X2xpc3RfdG9nZ2xlX3RpbWVvdXQgKERCdXNUaW1lb3V0TGlzdCAgICAgICAgICAgKnRpbWVvdXRfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1RpbWVvdXQgICAgICAgICAgICAgICAqdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgICAgICAgICAgZW5hYmxlZCkKK3sKKyAgZW5hYmxlZCA9ICEhZW5hYmxlZDsKKyAgCisgIGlmIChlbmFibGVkID09IHRpbWVvdXQtPmVuYWJsZWQpCisgICAgcmV0dXJuOworCisgIHRpbWVvdXQtPmVuYWJsZWQgPSBlbmFibGVkOworICAKKyAgaWYgKHRpbWVvdXRfbGlzdC0+dGltZW91dF90b2dnbGVkX2Z1bmN0aW9uICE9IE5VTEwpCisgICAgKCogdGltZW91dF9saXN0LT50aW1lb3V0X3RvZ2dsZWRfZnVuY3Rpb24pICh0aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dF9saXN0LT50aW1lb3V0X2RhdGEpOworfQorCisvKioKKyAqIFJldHVybnMgd2hldGhlciBhIHRpbWVvdXQgbmVlZHMgcmVzdGFydCB0aW1lIGNvdW50aW5nIGluIHRoZSBldmVudCBsb29wLgorICoKKyAqIEBwYXJhbSB0aW1lb3V0IHRoZSBEQnVzVGltZW91dCBvYmplY3QKKyAqIEByZXR1cm5zICNUUlVFIGlmIHJlc3RhcnQgaXMgbmVlZGVkCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c190aW1lb3V0X25lZWRzX3Jlc3RhcnQgKERCdXNUaW1lb3V0ICp0aW1lb3V0KQoreworICByZXR1cm4gdGltZW91dC0+bmVlZHNfcmVzdGFydDsKK30KKworLyoqCisgKiBNYXJrIHRpbWVvdXQgYXMgcmVzdGFydGVkIChzZXR0aW5nIHRpbWVzdGFtcHMgaXMgcmVzcG9uc2liaWxpdHkgb2YgdGhlIGV2ZW50CisgKiBsb29wKS4KKyAqCisgKiBAcGFyYW0gdGltZW91dCB0aGUgREJ1c1RpbWVvdXQgb2JqZWN0CisgKi8KK3ZvaWQKK19kYnVzX3RpbWVvdXRfcmVzdGFydGVkIChEQnVzVGltZW91dCAqdGltZW91dCkKK3sKKyAgdGltZW91dC0+bmVlZHNfcmVzdGFydCA9IEZBTFNFOworfQorCisvKiogQH0gKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c1RpbWVvdXQgREJ1c1RpbWVvdXQKKyAqIEBpbmdyb3VwICBEQnVzCisgKiBAYnJpZWYgT2JqZWN0IHJlcHJlc2VudGluZyBhIHRpbWVvdXQKKyAqCisgKiBUeXBlcyBhbmQgZnVuY3Rpb25zIHJlbGF0ZWQgdG8gREJ1c1RpbWVvdXQuIEEgdGltZW91dAorICogcmVwcmVzZW50cyBhIHRpbWVvdXQgdGhhdCB0aGUgbWFpbiBsb29wIG5lZWRzIHRvIG1vbml0b3IsCisgKiBhcyBpbiBRdCdzIFFUaW1lciBvciBHTGliJ3MgZ190aW1lb3V0X2FkZCgpLgorICoKKyAqIFVzZSBkYnVzX2Nvbm5lY3Rpb25fc2V0X3RpbWVvdXRfZnVuY3Rpb25zKCkgb3IgZGJ1c19zZXJ2ZXJfc2V0X3RpbWVvdXRfZnVuY3Rpb25zKCkKKyAqIHRvIGJlIG5vdGlmaWVkIHdoZW4gbGliZGJ1cyBuZWVkcyB0byBhZGQgb3IgcmVtb3ZlIHRpbWVvdXRzLgorICogCisgKiBAeworICovCisKKworLyoqCisgKiBAdHlwZWRlZiBEQnVzVGltZW91dAorICoKKyAqIE9wYXF1ZSBvYmplY3QgcmVwcmVzZW50aW5nIGEgdGltZW91dC4KKyAqLworCisvKioKKyAqIEdldHMgdGhlIHRpbWVvdXQgaW50ZXJ2YWwuIFRoZSBkYnVzX3RpbWVvdXRfaGFuZGxlKCkKKyAqIHNob3VsZCBiZSBjYWxsZWQgZWFjaCB0aW1lIHRoaXMgaW50ZXJ2YWwgZWxhcHNlcywKKyAqIHN0YXJ0aW5nIGFmdGVyIGl0IGVsYXBzZXMgb25jZS4KKyAqCisgKiBUaGUgaW50ZXJ2YWwgbWF5IGNoYW5nZSBkdXJpbmcgdGhlIGxpZmUgb2YgdGhlCisgKiB0aW1lb3V0OyBpZiBzbywgdGhlIHRpbWVvdXQgd2lsbCBiZSBkaXNhYmxlZCBhbmQKKyAqIHJlLWVuYWJsZWQgKGNhbGxpbmcgdGhlICJ0aW1lb3V0IHRvZ2dsZWQgZnVuY3Rpb24iKQorICogdG8gbm90aWZ5IHlvdSBvZiB0aGUgY2hhbmdlLgorICoKKyAqIEBwYXJhbSB0aW1lb3V0IHRoZSBEQnVzVGltZW91dCBvYmplY3QuCisgKiBAcmV0dXJucyB0aGUgaW50ZXJ2YWwgaW4gbWlsbGlzZWNvbmRzLgorICovCitpbnQKK2RidXNfdGltZW91dF9nZXRfaW50ZXJ2YWwgKERCdXNUaW1lb3V0ICp0aW1lb3V0KQoreworICByZXR1cm4gdGltZW91dC0+aW50ZXJ2YWw7Cit9CisKKy8qKgorICogR2V0cyBkYXRhIHByZXZpb3VzbHkgc2V0IHdpdGggZGJ1c190aW1lb3V0X3NldF9kYXRhKCkKKyAqIG9yICNOVUxMIGlmIG5vbmUuCisgKgorICogQHBhcmFtIHRpbWVvdXQgdGhlIERCdXNUaW1lb3V0IG9iamVjdC4KKyAqIEByZXR1cm5zIHByZXZpb3VzbHktc2V0IGRhdGEuCisgKi8KK3ZvaWQqCitkYnVzX3RpbWVvdXRfZ2V0X2RhdGEgKERCdXNUaW1lb3V0ICp0aW1lb3V0KQoreworICByZXR1cm4gdGltZW91dC0+ZGF0YTsKK30KKworLyoqCisgKiBTZXRzIGRhdGEgd2hpY2ggY2FuIGJlIHJldHJpZXZlZCB3aXRoIGRidXNfdGltZW91dF9nZXRfZGF0YSgpLgorICogSW50ZW5kZWQgZm9yIHVzZSBieSB0aGUgREJ1c0FkZFRpbWVvdXRGdW5jdGlvbiBhbmQKKyAqIERCdXNSZW1vdmVUaW1lb3V0RnVuY3Rpb24gdG8gc3RvcmUgdGhlaXIgb3duIGRhdGEuICBGb3IgZXhhbXBsZSB3aXRoCisgKiBRdCB5b3UgbWlnaHQgc3RvcmUgdGhlIFFUaW1lciBmb3IgdGhpcyB0aW1lb3V0IGFuZCB3aXRoIEdMaWIKKyAqIHlvdSBtaWdodCBzdG9yZSBhIGdfdGltZW91dF9hZGQgcmVzdWx0IGlkLgorICoKKyAqIEBwYXJhbSB0aW1lb3V0IHRoZSBEQnVzVGltZW91dCBvYmplY3QuCisgKiBAcGFyYW0gZGF0YSB0aGUgZGF0YS4KKyAqIEBwYXJhbSBmcmVlX2RhdGFfZnVuY3Rpb24gZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHRvIGZyZWUgdGhlIGRhdGEuCisgKi8KK3ZvaWQKK2RidXNfdGltZW91dF9zZXRfZGF0YSAoREJ1c1RpbWVvdXQgICAgICAqdGltZW91dCwKKwkJICAgICAgIHZvaWQgICAgICAgICAgICAgKmRhdGEsCisJCSAgICAgICBEQnVzRnJlZUZ1bmN0aW9uICBmcmVlX2RhdGFfZnVuY3Rpb24pCit7CisgIGlmICh0aW1lb3V0LT5mcmVlX2RhdGFfZnVuY3Rpb24gIT0gTlVMTCkKKyAgICAoKiB0aW1lb3V0LT5mcmVlX2RhdGFfZnVuY3Rpb24pICh0aW1lb3V0LT5kYXRhKTsKKworICB0aW1lb3V0LT5kYXRhID0gZGF0YTsKKyAgdGltZW91dC0+ZnJlZV9kYXRhX2Z1bmN0aW9uID0gZnJlZV9kYXRhX2Z1bmN0aW9uOworfQorCisvKioKKyAqIENhbGxzIHRoZSB0aW1lb3V0IGhhbmRsZXIgZm9yIHRoaXMgdGltZW91dC4KKyAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCB3aGVuIHRoZSB0aW1lb3V0CisgKiBvY2N1cnMuCisgKgorICogSWYgdGhpcyBmdW5jdGlvbiByZXR1cm5zICNGQUxTRSwgdGhlbiB0aGVyZSB3YXNuJ3QKKyAqIGVub3VnaCBtZW1vcnkgdG8gaGFuZGxlIHRoZSB0aW1lb3V0LiBUeXBpY2FsbHkganVzdAorICogbGV0dGluZyB0aGUgdGltZW91dCBmaXJlIGFnYWluIG5leHQgdGltZSBpdCBuYXR1cmFsbHkKKyAqIHRpbWVzIG91dCBpcyBhbiBhZGVxdWF0ZSByZXNwb25zZSB0byB0aGF0IHByb2JsZW0sCisgKiBidXQgeW91IGNvdWxkIHRyeSB0byBkbyBtb3JlIGlmIHlvdSB3YW50ZWQuCisgKgorICogQHBhcmFtIHRpbWVvdXQgdGhlIERCdXNUaW1lb3V0IG9iamVjdC4KKyAqIEByZXR1cm5zICNGQUxTRSBpZiB0aGVyZSB3YXNuJ3QgZW5vdWdoIG1lbW9yeSAKKyAqLworZGJ1c19ib29sX3QKK2RidXNfdGltZW91dF9oYW5kbGUgKERCdXNUaW1lb3V0ICp0aW1lb3V0KQoreworICByZXR1cm4gKCogdGltZW91dC0+aGFuZGxlcikgKHRpbWVvdXQtPmhhbmRsZXJfZGF0YSk7Cit9CisKKworLyoqCisgKiBSZXR1cm5zIHdoZXRoZXIgYSB0aW1lb3V0IGlzIGVuYWJsZWQgb3Igbm90LiBJZiBub3QKKyAqIGVuYWJsZWQsIGl0IHNob3VsZCBub3QgYmUgcG9sbGVkIGJ5IHRoZSBtYWluIGxvb3AuCisgKgorICogQHBhcmFtIHRpbWVvdXQgdGhlIERCdXNUaW1lb3V0IG9iamVjdAorICogQHJldHVybnMgI1RSVUUgaWYgdGhlIHRpbWVvdXQgaXMgZW5hYmxlZAorICovCitkYnVzX2Jvb2xfdAorZGJ1c190aW1lb3V0X2dldF9lbmFibGVkIChEQnVzVGltZW91dCAqdGltZW91dCkKK3sKKyAgcmV0dXJuIHRpbWVvdXQtPmVuYWJsZWQ7Cit9CisKKy8qKiBAfSBlbmQgcHVibGljIEFQSSBkb2NzICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtdGltZW91dC5oIGIvZGJ1cy9kYnVzLXRpbWVvdXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDBiOGI0Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLXRpbWVvdXQuaApAQCAtMCwwICsxLDgyIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtdGltZW91dC5oIERCdXNUaW1lb3V0IGludGVybmFsIGludGVyZmFjZXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgIENvZGVGYWN0b3J5IEFCCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaWZuZGVmIERCVVNfVElNRU9VVF9ICisjZGVmaW5lIERCVVNfVElNRU9VVF9ICisKKyNpbmNsdWRlIDxkYnVzL2RidXMtY29ubmVjdGlvbi5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1pbnRlcm5hbHMuaD4KKworREJVU19CRUdJTl9ERUNMUworCisvKioKKyAqIEBhZGR0b2dyb3VwIERCdXNUaW1lb3V0SW50ZXJuYWxzCisgKiBAeworICovCisKKy8qIFB1YmxpYyBtZXRob2RzIG9uIERCdXNUaW1lb3V0IGFyZSBpbiBkYnVzLWNvbm5lY3Rpb24uaCAqLworCit0eXBlZGVmIHN0cnVjdCBEQnVzVGltZW91dExpc3QgREJ1c1RpbWVvdXRMaXN0OworCisvKiogZnVuY3Rpb24gdG8gcnVuIHdoZW4gdGhlIHRpbWVvdXQgaXMgaGFuZGxlZCAqLwordHlwZWRlZiBkYnVzX2Jvb2xfdCAoKiBEQnVzVGltZW91dEhhbmRsZXIpICh2b2lkICpkYXRhKTsKKworREJVU19QUklWQVRFX0VYUE9SVAorREJ1c1RpbWVvdXQqIF9kYnVzX3RpbWVvdXRfbmV3ICAgICAgICAgIChpbnQgICAgICAgICAgICAgICAgIGludGVydmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVGltZW91dEhhbmRsZXIgIGhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgICBmcmVlX2RhdGFfZnVuY3Rpb24pOworREJ1c1RpbWVvdXQqIF9kYnVzX3RpbWVvdXRfcmVmICAgICAgICAgIChEQnVzVGltZW91dCAgICAgICAgKnRpbWVvdXQpOworREJVU19QUklWQVRFX0VYUE9SVAordm9pZCAgICAgICAgIF9kYnVzX3RpbWVvdXRfdW5yZWYgICAgICAgIChEQnVzVGltZW91dCAgICAgICAgKnRpbWVvdXQpOworREJVU19QUklWQVRFX0VYUE9SVAordm9pZCAgICAgICAgIF9kYnVzX3RpbWVvdXRfcmVzdGFydCAgICAgIChEQnVzVGltZW91dCAgICAgICAgKnRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgaW50ZXJ2YWwpOworREJVU19QUklWQVRFX0VYUE9SVAordm9pZCAgICAgICAgIF9kYnVzX3RpbWVvdXRfZGlzYWJsZSAgICAgIChEQnVzVGltZW91dCAgICAgICAgKnRpbWVvdXQpOworCitEQnVzVGltZW91dExpc3QgKl9kYnVzX3RpbWVvdXRfbGlzdF9uZXcgICAgICAgICAgICAodm9pZCk7Cit2b2lkICAgICAgICAgICAgIF9kYnVzX3RpbWVvdXRfbGlzdF9mcmVlICAgICAgICAgICAoREJ1c1RpbWVvdXRMaXN0ICAgICAgICAgICAqdGltZW91dF9saXN0KTsKK2RidXNfYm9vbF90ICAgICAgX2RidXNfdGltZW91dF9saXN0X3NldF9mdW5jdGlvbnMgIChEQnVzVGltZW91dExpc3QgICAgICAgICAgICp0aW1lb3V0X2xpc3QsCisJCQkJCQkgICAgREJ1c0FkZFRpbWVvdXRGdW5jdGlvbiAgICAgYWRkX2Z1bmN0aW9uLAorCQkJCQkJICAgIERCdXNSZW1vdmVUaW1lb3V0RnVuY3Rpb24gIHJlbW92ZV9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVGltZW91dFRvZ2dsZWRGdW5jdGlvbiB0b2dnbGVkX2Z1bmN0aW9uLAorCQkJCQkJICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgKmRhdGEsCisJCQkJCQkgICAgREJ1c0ZyZWVGdW5jdGlvbiAgICAgICAgICAgZnJlZV9kYXRhX2Z1bmN0aW9uKTsKK2RidXNfYm9vbF90ICAgICAgX2RidXNfdGltZW91dF9saXN0X2FkZF90aW1lb3V0ICAgIChEQnVzVGltZW91dExpc3QgICAgICAgICAgICp0aW1lb3V0X2xpc3QsCisJCQkJCQkgICAgREJ1c1RpbWVvdXQgICAgICAgICAgICAgICAqdGltZW91dCk7Cit2b2lkICAgICAgICAgICAgIF9kYnVzX3RpbWVvdXRfbGlzdF9yZW1vdmVfdGltZW91dCAoREJ1c1RpbWVvdXRMaXN0ICAgICAgICAgICAqdGltZW91dF9saXN0LAorCQkJCQkJICAgIERCdXNUaW1lb3V0ICAgICAgICAgICAgICAgKnRpbWVvdXQpOwordm9pZCAgICAgICAgICAgICBfZGJ1c190aW1lb3V0X2xpc3RfdG9nZ2xlX3RpbWVvdXQgKERCdXNUaW1lb3V0TGlzdCAgICAgICAgICAgKnRpbWVvdXRfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVGltZW91dCAgICAgICAgICAgICAgICp0aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgICAgICAgICAgIGVuYWJsZWQpOworCitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCBfZGJ1c190aW1lb3V0X25lZWRzX3Jlc3RhcnQgKERCdXNUaW1lb3V0ICp0aW1lb3V0KTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK3ZvaWQgICAgICAgIF9kYnVzX3RpbWVvdXRfcmVzdGFydGVkICAgICAoREJ1c1RpbWVvdXQgKnRpbWVvdXQpOworCisvKiogQH0gKi8KKworREJVU19FTkRfREVDTFMKKworI2VuZGlmIC8qIERCVVNfVElNRU9VVF9IICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtdHJhbnNwb3J0LXByb3RlY3RlZC5oIGIvZGJ1cy9kYnVzLXRyYW5zcG9ydC1wcm90ZWN0ZWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTYyN2EzCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLXRyYW5zcG9ydC1wcm90ZWN0ZWQuaApAQCAtMCwwICsxLDE0NiBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXRyYW5zcG9ydC1wcm90ZWN0ZWQuaCBVc2VkIGJ5IHN1YmNsYXNzZXMgb2YgREJ1c1RyYW5zcG9ydCBvYmplY3QgKGludGVybmFsIHRvIEQtQnVzIGltcGxlbWVudGF0aW9uKQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwNCAgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaWZuZGVmIERCVVNfVFJBTlNQT1JUX1BST1RFQ1RFRF9ICisjZGVmaW5lIERCVVNfVFJBTlNQT1JUX1BST1RFQ1RFRF9ICisKKyNpbmNsdWRlIDxkYnVzL2RidXMtaW50ZXJuYWxzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWVycm9ycy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy10cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbWVzc2FnZS1pbnRlcm5hbC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1hdXRoLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXJlc291cmNlcy5oPgorCitEQlVTX0JFR0lOX0RFQ0xTCisKK3R5cGVkZWYgc3RydWN0IERCdXNUcmFuc3BvcnRWVGFibGUgREJ1c1RyYW5zcG9ydFZUYWJsZTsKKworLyoqCisgKiBUaGUgdmlydHVhbCB0YWJsZSB0aGF0IG11c3QgYmUgaW1wbGVtZW50ZWQgdG8KKyAqIGNyZWF0ZSBhIG5ldyBraW5kIG9mIHRyYW5zcG9ydC4KKyAqLworc3RydWN0IERCdXNUcmFuc3BvcnRWVGFibGUKK3sKKyAgdm9pZCAgICAgICAgKCogZmluYWxpemUpICAgICAgICAgICAgICAoREJ1c1RyYW5zcG9ydCAqdHJhbnNwb3J0KTsKKyAgLyoqPCBUaGUgZmluYWxpemUgbWV0aG9kIG11c3QgZnJlZSB0aGUgdHJhbnNwb3J0LiAqLworCisgIGRidXNfYm9vbF90ICgqIGhhbmRsZV93YXRjaCkgICAgICAgICAgKERCdXNUcmFuc3BvcnQgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1dhdGNoICAgICAqd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgIGZsYWdzKTsKKyAgLyoqPCBUaGUgaGFuZGxlX3dhdGNoIG1ldGhvZCBoYW5kbGVzIHJlYWRpbmcvd3JpdGluZworICAgKiBkYXRhIGFzIGluZGljYXRlZCBieSB0aGUgZmxhZ3MuCisgICAqLworCisgIHZvaWQgICAgICAgICgqIGRpc2Nvbm5lY3QpICAgICAgICAgICAgKERCdXNUcmFuc3BvcnQgKnRyYW5zcG9ydCk7CisgIC8qKjwgRGlzY29ubmVjdCB0aGlzIHRyYW5zcG9ydC4gKi8KKworICBkYnVzX2Jvb2xfdCAoKiBjb25uZWN0aW9uX3NldCkgICAgICAgIChEQnVzVHJhbnNwb3J0ICp0cmFuc3BvcnQpOworICAvKio8IENhbGxlZCB3aGVuIHRyYW5zcG9ydC0+Y29ubmVjdGlvbiBoYXMgYmVlbiBmaWxsZWQgaW4gKi8KKworICB2b2lkICAgICAgICAoKiBkb19pdGVyYXRpb24pICAgICAgICAgIChEQnVzVHJhbnNwb3J0ICp0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICB0aW1lb3V0X21pbGxpc2Vjb25kcyk7CisgIC8qKjwgQ2FsbGVkIHRvIGRvIGEgc2luZ2xlICJpdGVyYXRpb24iIChibG9jayBvbiBzZWxlY3QvcG9sbAorICAgKiBmb2xsb3dlZCBieSByZWFkaW5nIG9yIHdyaXRpbmcgZGF0YSkuCisgICAqLworCisgIHZvaWQgICAgICAgICgqIGxpdmVfbWVzc2FnZXNfY2hhbmdlZCkgKERCdXNUcmFuc3BvcnQgKnRyYW5zcG9ydCk7CisgIC8qKjwgT3V0c3RhbmRpbmcgbWVzc2FnZXMgY291bnRlciBjaGFuZ2VkICovCisKKyAgZGJ1c19ib29sX3QgKCogZ2V0X3NvY2tldF9mZCkgKERCdXNUcmFuc3BvcnQgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTb2NrZXQgICAgKmZkX3ApOworICAvKio8IEdldCBzb2NrZXQgZmlsZSBkZXNjcmlwdG9yICovCit9OworCisvKioKKyAqIE9iamVjdCByZXByZXNlbnRpbmcgYSB0cmFuc3BvcnQgc3VjaCBhcyBhIHNvY2tldC4KKyAqIEEgdHJhbnNwb3J0IGNhbiBzaHV0dGxlIG1lc3NhZ2VzIGZyb20gcG9pbnQgQSB0byBwb2ludCBCLAorICogYW5kIGlzIHRoZSBiYWNrZW5kIGZvciBhICNEQnVzQ29ubmVjdGlvbi4KKyAqCisgKi8KK3N0cnVjdCBEQnVzVHJhbnNwb3J0Cit7CisgIGludCByZWZjb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBSZWZlcmVuY2UgY291bnQuICovCisKKyAgY29uc3QgREJ1c1RyYW5zcG9ydFZUYWJsZSAqdnRhYmxlOyAgICAgICAgICAvKio8IFZpcnR1YWwgbWV0aG9kcyBmb3IgdGhpcyBpbnN0YW5jZS4gKi8KKworICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbjsgICAgICAgICAgICAgICAgIC8qKjwgQ29ubmVjdGlvbiBvd25pbmcgdGhpcyB0cmFuc3BvcnQuICovCisKKyAgREJ1c01lc3NhZ2VMb2FkZXIgKmxvYWRlcjsgICAgICAgICAgICAgICAgICAvKio8IE1lc3NhZ2UtbG9hZGluZyBidWZmZXIuICovCisKKyAgREJ1c0F1dGggKmF1dGg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEF1dGhlbnRpY2F0aW9uIGNvbnZlcnNhdGlvbiAqLworCisgIERCdXNDcmVkZW50aWFscyAqY3JlZGVudGlhbHM7ICAgICAgICAgICAgICAgLyoqPCBDcmVkZW50aWFscyBvZiBvdGhlciBlbmQgcmVhZCBmcm9tIHRoZSBzb2NrZXQgKi8gIAorCisgIGxvbmcgbWF4X2xpdmVfbWVzc2FnZXNfc2l6ZTsgICAgICAgICAgICAgICAgLyoqPCBNYXggdG90YWwgc2l6ZSBvZiByZWNlaXZlZCBtZXNzYWdlcy4gKi8KKyAgbG9uZyBtYXhfbGl2ZV9tZXNzYWdlc191bml4X2ZkczsgICAgICAgICAgICAvKio8IE1heCB0b3RhbCB1bml4IGZkcyBvZiByZWNlaXZlZCBtZXNzYWdlcy4gKi8KKworICBEQnVzQ291bnRlciAqbGl2ZV9tZXNzYWdlczsgICAgICAgICAgICAgICAgIC8qKjwgQ291bnRlciBmb3Igc2l6ZS91bml4IGZkcyBvZiBhbGwgbGl2ZSBtZXNzYWdlcy4gKi8KKworICBjaGFyICphZGRyZXNzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQWRkcmVzcyBvZiB0aGUgc2VydmVyIHdlIGFyZSBjb25uZWN0aW5nIHRvICgjTlVMTCBmb3IgdGhlIHNlcnZlciBzaWRlIG9mIGEgdHJhbnNwb3J0KSAqLworCisgIGNoYXIgKmV4cGVjdGVkX2d1aWQ7ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBHVUlEIHdlIGV4cGVjdCB0aGUgc2VydmVyIHRvIGhhdmUsICNOVUxMIG9uIHNlcnZlciBzaWRlIG9yIGlmIHdlIGRvbid0IGhhdmUgYW4gZXhwZWN0YXRpb24gKi8KKyAgCisgIERCdXNBbGxvd1VuaXhVc2VyRnVuY3Rpb24gdW5peF91c2VyX2Z1bmN0aW9uOyAvKio8IEZ1bmN0aW9uIGZvciBjaGVja2luZyB3aGV0aGVyIGEgdXNlciBpcyBhdXRob3JpemVkLiAqLworICB2b2lkICp1bml4X3VzZXJfZGF0YTsgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBEYXRhIGZvciB1bml4X3VzZXJfZnVuY3Rpb24gKi8KKyAgCisgIERCdXNGcmVlRnVuY3Rpb24gZnJlZV91bml4X3VzZXJfZGF0YTsgICAgICAgICAvKio8IEZ1bmN0aW9uIHRvIGZyZWUgdW5peF91c2VyX2RhdGEgKi8KKworICBEQnVzQWxsb3dXaW5kb3dzVXNlckZ1bmN0aW9uIHdpbmRvd3NfdXNlcl9mdW5jdGlvbjsgLyoqPCBGdW5jdGlvbiBmb3IgY2hlY2tpbmcgd2hldGhlciBhIHVzZXIgaXMgYXV0aG9yaXplZC4gKi8KKyAgdm9pZCAqd2luZG93c191c2VyX2RhdGE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgRGF0YSBmb3Igd2luZG93c191c2VyX2Z1bmN0aW9uICovCisgIAorICBEQnVzRnJlZUZ1bmN0aW9uIGZyZWVfd2luZG93c191c2VyX2RhdGE7ICAgICAgICAgICAgLyoqPCBGdW5jdGlvbiB0byBmcmVlIHdpbmRvd3NfdXNlcl9kYXRhICovCisgIAorICB1bnNpZ25lZCBpbnQgZGlzY29ubmVjdGVkIDogMTsgICAgICAgICAgICAgIC8qKjwgI1RSVUUgaWYgd2UgYXJlIGRpc2Nvbm5lY3RlZC4gKi8KKyAgdW5zaWduZWQgaW50IGF1dGhlbnRpY2F0ZWQgOiAxOyAgICAgICAgICAgICAvKio8IENhY2hlIG9mIGF1dGggc3RhdGU7IHVzZSBfZGJ1c190cmFuc3BvcnRfcGVla19pc19hdXRoZW50aWNhdGVkKCkgdG8gcXVlcnkgdmFsdWUgKi8KKyAgdW5zaWduZWQgaW50IHNlbmRfY3JlZGVudGlhbHNfcGVuZGluZyA6IDE7ICAvKio8ICNUUlVFIGlmIHdlIG5lZWQgdG8gc2VuZCBjcmVkZW50aWFscyAqLworICB1bnNpZ25lZCBpbnQgcmVjZWl2ZV9jcmVkZW50aWFsc19wZW5kaW5nIDogMTsgLyoqPCAjVFJVRSBpZiB3ZSBuZWVkIHRvIHJlY2VpdmUgY3JlZGVudGlhbHMgKi8KKyAgdW5zaWduZWQgaW50IGlzX3NlcnZlciA6IDE7ICAgICAgICAgICAgICAgICAvKio8ICNUUlVFIGlmIG9uIHRoZSBzZXJ2ZXIgc2lkZSAqLworICB1bnNpZ25lZCBpbnQgdW51c2VkX2J5dGVzX3JlY292ZXJlZCA6IDE7ICAgIC8qKjwgI1RSVUUgaWYgd2UndmUgcmVjb3ZlcmVkIHVudXNlZCBieXRlcyBmcm9tIGF1dGggKi8KKyAgdW5zaWduZWQgaW50IGFsbG93X2Fub255bW91cyA6IDE7ICAgICAgICAgICAvKio8ICNUUlVFIGlmIGFuIGFub255bW91cyBjbGllbnQgY2FuIGNvbm5lY3QgKi8KK307CisKK2RidXNfYm9vbF90IF9kYnVzX3RyYW5zcG9ydF9pbml0X2Jhc2UgICAgIChEQnVzVHJhbnNwb3J0ICAgICAgICAgICAgICp0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1RyYW5zcG9ydFZUYWJsZSAqdnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICAgICAgICAgKnNlcnZlcl9ndWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICAgICAgICAgKmFkZHJlc3MpOwordm9pZCAgICAgICAgX2RidXNfdHJhbnNwb3J0X2ZpbmFsaXplX2Jhc2UgKERCdXNUcmFuc3BvcnQgICAgICAgICAgICAgKnRyYW5zcG9ydCk7CisKKwordHlwZWRlZiBlbnVtCit7CisgIERCVVNfVFJBTlNQT1JUX09QRU5fTk9UX0hBTkRMRUQsICAgIC8qKjwgd2UgYXJlbid0IGluIGNoYXJnZSBvZiB0aGlzIGFkZHJlc3MgdHlwZSAqLworICBEQlVTX1RSQU5TUE9SVF9PUEVOX09LLCAgICAgICAgICAgICAvKio8IHdlIHNldCB1cCB0aGUgbGlzdGVuICovCisgIERCVVNfVFJBTlNQT1JUX09QRU5fQkFEX0FERFJFU1MsICAgIC8qKjwgbWFsZm9ybWVkIGFkZHJlc3MgKi8KKyAgREJVU19UUkFOU1BPUlRfT1BFTl9ESURfTk9UX0NPTk5FQ1QgLyoqPCB3ZWxsLWZvcm1lZCBhZGRyZXNzIGJ1dCBmYWlsZWQgdG8gc2V0IGl0IHVwICovCit9IERCdXNUcmFuc3BvcnRPcGVuUmVzdWx0OworCitEQnVzVHJhbnNwb3J0T3BlblJlc3VsdCBfZGJ1c190cmFuc3BvcnRfb3Blbl9wbGF0Zm9ybV9zcGVjaWZpYyAoREJ1c0FkZHJlc3NFbnRyeSAgKmVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUcmFuc3BvcnQgICAgKip0cmFuc3BvcnRfcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAqZXJyb3IpOworCisjZGVmaW5lIERCVVNfVFJBTlNQT1JUX0NBTl9TRU5EX1VOSVhfRkQoeCkgICAgICBcCisgIF9kYnVzX2F1dGhfZ2V0X3VuaXhfZmRfbmVnb3RpYXRlZCgoeCktPmF1dGgpCisKK0RCVVNfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBEQlVTX1RSQU5TUE9SVF9QUk9URUNURURfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLXRyYW5zcG9ydC1zb2NrZXQuYyBiL2RidXMvZGJ1cy10cmFuc3BvcnQtc29ja2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM4OTY1MAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy10cmFuc3BvcnQtc29ja2V0LmMKQEAgLTAsMCArMSwxNDk3IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtdHJhbnNwb3J0LXNvY2tldC5jICBTb2NrZXQgc3ViY2xhc3NlcyBvZiBEQnVzVHJhbnNwb3J0CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzLCAyMDA0LCAyMDA2ICBSZWQgSGF0IEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgImRidXMtaW50ZXJuYWxzLmgiCisjaW5jbHVkZSAiZGJ1cy1jb25uZWN0aW9uLWludGVybmFsLmgiCisjaW5jbHVkZSAiZGJ1cy1ub25jZS5oIgorI2luY2x1ZGUgImRidXMtdHJhbnNwb3J0LXNvY2tldC5oIgorI2luY2x1ZGUgImRidXMtdHJhbnNwb3J0LXByb3RlY3RlZC5oIgorI2luY2x1ZGUgImRidXMtd2F0Y2guaCIKKyNpbmNsdWRlICJkYnVzLWNyZWRlbnRpYWxzLmgiCisKKy8qKgorICogQGRlZmdyb3VwIERCdXNUcmFuc3BvcnRTb2NrZXQgREJ1c1RyYW5zcG9ydCBpbXBsZW1lbnRhdGlvbnMgZm9yIHNvY2tldHMKKyAqIEBpbmdyb3VwICBEQnVzSW50ZXJuYWxzCisgKiBAYnJpZWYgSW1wbGVtZW50YXRpb24gZGV0YWlscyBvZiBEQnVzVHJhbnNwb3J0IG9uIHNvY2tldHMKKyAqCisgKiBAeworICovCisKKy8qKgorICogT3BhcXVlIG9iamVjdCByZXByZXNlbnRpbmcgYSBzb2NrZXQgZmlsZSBkZXNjcmlwdG9yIHRyYW5zcG9ydC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgREJ1c1RyYW5zcG9ydFNvY2tldCBEQnVzVHJhbnNwb3J0U29ja2V0OworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIGRldGFpbHMgb2YgREJ1c1RyYW5zcG9ydFNvY2tldC4gQWxsIG1lbWJlcnMgYXJlIHByaXZhdGUuCisgKi8KK3N0cnVjdCBEQnVzVHJhbnNwb3J0U29ja2V0Cit7CisgIERCdXNUcmFuc3BvcnQgYmFzZTsgICAgICAgICAgICAgICAgICAgLyoqPCBQYXJlbnQgaW5zdGFuY2UgKi8KKyAgREJ1c1NvY2tldCBmZDsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEZpbGUgZGVzY3JpcHRvci4gKi8KKyAgREJ1c1dhdGNoICpyZWFkX3dhdGNoOyAgICAgICAgICAgICAgICAvKio8IFdhdGNoIGZvciByZWFkYWJpbGl0eS4gKi8KKyAgREJ1c1dhdGNoICp3cml0ZV93YXRjaDsgICAgICAgICAgICAgICAvKio8IFdhdGNoIGZvciB3cml0YWJpbGl0eS4gKi8KKworICBpbnQgbWF4X2J5dGVzX3JlYWRfcGVyX2l0ZXJhdGlvbjsgICAgIC8qKjwgVG8gYXZvaWQgYmxvY2tpbmcgdG9vIGxvbmcuICovCisgIGludCBtYXhfYnl0ZXNfd3JpdHRlbl9wZXJfaXRlcmF0aW9uOyAgLyoqPCBUbyBhdm9pZCBibG9ja2luZyB0b28gbG9uZy4gKi8KKworICBpbnQgbWVzc2FnZV9ieXRlc193cml0dGVuOyAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGJ5dGVzIG9mIGN1cnJlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIG91dGdvaW5nIG1lc3NhZ2UgdGhhdCBoYXZlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBiZWVuIHdyaXR0ZW4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIERCdXNTdHJpbmcgZW5jb2RlZF9vdXRnb2luZzsgICAgICAgICAgLyoqPCBFbmNvZGVkIHZlcnNpb24gb2YgY3VycmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgb3V0Z29pbmcgbWVzc2FnZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgREJ1c1N0cmluZyBlbmNvZGVkX2luY29taW5nOyAgICAgICAgICAvKio8IEVuY29kZWQgdmVyc2lvbiBvZiBjdXJyZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBpbmNvbWluZyBkYXRhLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworfTsKKworc3RhdGljIHZvaWQKK2ZyZWVfd2F0Y2hlcyAoREJ1c1RyYW5zcG9ydCAqdHJhbnNwb3J0KQoreworICBEQnVzVHJhbnNwb3J0U29ja2V0ICpzb2NrZXRfdHJhbnNwb3J0ID0gKERCdXNUcmFuc3BvcnRTb2NrZXQqKSB0cmFuc3BvcnQ7CisKKyAgX2RidXNfdmVyYm9zZSAoInN0YXJ0XG4iKTsKKyAgCisgIGlmIChzb2NrZXRfdHJhbnNwb3J0LT5yZWFkX3dhdGNoKQorICAgIHsKKyAgICAgIGlmICh0cmFuc3BvcnQtPmNvbm5lY3Rpb24pCisgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fcmVtb3ZlX3dhdGNoX3VubG9ja2VkICh0cmFuc3BvcnQtPmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXRfdHJhbnNwb3J0LT5yZWFkX3dhdGNoKTsKKyAgICAgIF9kYnVzX3dhdGNoX2ludmFsaWRhdGUgKHNvY2tldF90cmFuc3BvcnQtPnJlYWRfd2F0Y2gpOworICAgICAgX2RidXNfd2F0Y2hfdW5yZWYgKHNvY2tldF90cmFuc3BvcnQtPnJlYWRfd2F0Y2gpOworICAgICAgc29ja2V0X3RyYW5zcG9ydC0+cmVhZF93YXRjaCA9IE5VTEw7CisgICAgfQorCisgIGlmIChzb2NrZXRfdHJhbnNwb3J0LT53cml0ZV93YXRjaCkKKyAgICB7CisgICAgICBpZiAodHJhbnNwb3J0LT5jb25uZWN0aW9uKQorICAgICAgICBfZGJ1c19jb25uZWN0aW9uX3JlbW92ZV93YXRjaF91bmxvY2tlZCAodHJhbnNwb3J0LT5jb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0X3RyYW5zcG9ydC0+d3JpdGVfd2F0Y2gpOworICAgICAgX2RidXNfd2F0Y2hfaW52YWxpZGF0ZSAoc29ja2V0X3RyYW5zcG9ydC0+d3JpdGVfd2F0Y2gpOworICAgICAgX2RidXNfd2F0Y2hfdW5yZWYgKHNvY2tldF90cmFuc3BvcnQtPndyaXRlX3dhdGNoKTsKKyAgICAgIHNvY2tldF90cmFuc3BvcnQtPndyaXRlX3dhdGNoID0gTlVMTDsKKyAgICB9CisKKyAgX2RidXNfdmVyYm9zZSAoImVuZFxuIik7Cit9CisKK3N0YXRpYyB2b2lkCitzb2NrZXRfZmluYWxpemUgKERCdXNUcmFuc3BvcnQgKnRyYW5zcG9ydCkKK3sKKyAgREJ1c1RyYW5zcG9ydFNvY2tldCAqc29ja2V0X3RyYW5zcG9ydCA9IChEQnVzVHJhbnNwb3J0U29ja2V0KikgdHJhbnNwb3J0OworCisgIF9kYnVzX3ZlcmJvc2UgKCJcbiIpOworICAKKyAgZnJlZV93YXRjaGVzICh0cmFuc3BvcnQpOworCisgIF9kYnVzX3N0cmluZ19mcmVlICgmc29ja2V0X3RyYW5zcG9ydC0+ZW5jb2RlZF9vdXRnb2luZyk7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmc29ja2V0X3RyYW5zcG9ydC0+ZW5jb2RlZF9pbmNvbWluZyk7CisgIAorICBfZGJ1c190cmFuc3BvcnRfZmluYWxpemVfYmFzZSAodHJhbnNwb3J0KTsKKworICBfZGJ1c19hc3NlcnQgKHNvY2tldF90cmFuc3BvcnQtPnJlYWRfd2F0Y2ggPT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAoc29ja2V0X3RyYW5zcG9ydC0+d3JpdGVfd2F0Y2ggPT0gTlVMTCk7CisgIAorICBkYnVzX2ZyZWUgKHRyYW5zcG9ydCk7Cit9CisKK3N0YXRpYyB2b2lkCitjaGVja193cml0ZV93YXRjaCAoREJ1c1RyYW5zcG9ydCAqdHJhbnNwb3J0KQoreworICBEQnVzVHJhbnNwb3J0U29ja2V0ICpzb2NrZXRfdHJhbnNwb3J0ID0gKERCdXNUcmFuc3BvcnRTb2NrZXQqKSB0cmFuc3BvcnQ7CisgIGRidXNfYm9vbF90IG5lZWRlZDsKKworICBpZiAodHJhbnNwb3J0LT5jb25uZWN0aW9uID09IE5VTEwpCisgICAgcmV0dXJuOworCisgIGlmICh0cmFuc3BvcnQtPmRpc2Nvbm5lY3RlZCkKKyAgICB7CisgICAgICBfZGJ1c19hc3NlcnQgKHNvY2tldF90cmFuc3BvcnQtPndyaXRlX3dhdGNoID09IE5VTEwpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgCisgIF9kYnVzX3RyYW5zcG9ydF9yZWYgKHRyYW5zcG9ydCk7CisKKyAgaWYgKF9kYnVzX3RyYW5zcG9ydF90cnlfdG9fYXV0aGVudGljYXRlICh0cmFuc3BvcnQpKQorICAgIG5lZWRlZCA9IF9kYnVzX2Nvbm5lY3Rpb25faGFzX21lc3NhZ2VzX3RvX3NlbmRfdW5sb2NrZWQgKHRyYW5zcG9ydC0+Y29ubmVjdGlvbik7CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAodHJhbnNwb3J0LT5zZW5kX2NyZWRlbnRpYWxzX3BlbmRpbmcpCisgICAgICAgIG5lZWRlZCA9IFRSVUU7CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBEQnVzQXV0aFN0YXRlIGF1dGhfc3RhdGU7CisgICAgICAgICAgCisgICAgICAgICAgYXV0aF9zdGF0ZSA9IF9kYnVzX2F1dGhfZG9fd29yayAodHJhbnNwb3J0LT5hdXRoKTsKKyAgICAgICAgICAKKyAgICAgICAgICAvKiBJZiB3ZSBuZWVkIG1lbW9yeSB3ZSBpbnN0YWxsIHRoZSB3cml0ZSB3YXRjaCBqdXN0IGluIGNhc2UsCisgICAgICAgICAgICogaWYgdGhlcmUncyBubyBuZWVkIGZvciBpdCwgaXQgd2lsbCBnZXQgZGUtaW5zdGFsbGVkCisgICAgICAgICAgICogbmV4dCB0aW1lIHdlIHRyeSByZWFkaW5nLgorICAgICAgICAgICAqLworICAgICAgICAgIGlmIChhdXRoX3N0YXRlID09IERCVVNfQVVUSF9TVEFURV9IQVZFX0JZVEVTX1RPX1NFTkQgfHwKKyAgICAgICAgICAgICAgYXV0aF9zdGF0ZSA9PSBEQlVTX0FVVEhfU1RBVEVfV0FJVElOR19GT1JfTUVNT1JZKQorICAgICAgICAgICAgbmVlZGVkID0gVFJVRTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBuZWVkZWQgPSBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICBfZGJ1c192ZXJib3NlICgiY2hlY2tfd3JpdGVfd2F0Y2goKTogbmVlZGVkID0gJWQgb24gY29ubmVjdGlvbiAlcCB3YXRjaCAlcCBmZCA9ICUiIERCVVNfU09DS0VUX0ZPUk1BVCAiIG91dGdvaW5nIG1lc3NhZ2VzIGV4aXN0ICVkXG4iLAorICAgICAgICAgICAgICAgICBuZWVkZWQsIHRyYW5zcG9ydC0+Y29ubmVjdGlvbiwgc29ja2V0X3RyYW5zcG9ydC0+d3JpdGVfd2F0Y2gsCisgICAgICAgICAgICAgICAgIF9kYnVzX3NvY2tldF9wcmludGFibGUgKHNvY2tldF90cmFuc3BvcnQtPmZkKSwKKyAgICAgICAgICAgICAgICAgX2RidXNfY29ubmVjdGlvbl9oYXNfbWVzc2FnZXNfdG9fc2VuZF91bmxvY2tlZCAodHJhbnNwb3J0LT5jb25uZWN0aW9uKSk7CisKKyAgX2RidXNfY29ubmVjdGlvbl90b2dnbGVfd2F0Y2hfdW5sb2NrZWQgKHRyYW5zcG9ydC0+Y29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldF90cmFuc3BvcnQtPndyaXRlX3dhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZGVkKTsKKworICBfZGJ1c190cmFuc3BvcnRfdW5yZWYgKHRyYW5zcG9ydCk7Cit9CisKK3N0YXRpYyB2b2lkCitjaGVja19yZWFkX3dhdGNoIChEQnVzVHJhbnNwb3J0ICp0cmFuc3BvcnQpCit7CisgIERCdXNUcmFuc3BvcnRTb2NrZXQgKnNvY2tldF90cmFuc3BvcnQgPSAoREJ1c1RyYW5zcG9ydFNvY2tldCopIHRyYW5zcG9ydDsKKyAgZGJ1c19ib29sX3QgbmVlZF9yZWFkX3dhdGNoOworCisgIF9kYnVzX3ZlcmJvc2UgKCJmZCA9ICUiIERCVVNfU09DS0VUX0ZPUk1BVCAiXG4iLAorICAgICAgICAgICAgICAgICBfZGJ1c19zb2NrZXRfcHJpbnRhYmxlIChzb2NrZXRfdHJhbnNwb3J0LT5mZCkpOworICAKKyAgaWYgKHRyYW5zcG9ydC0+Y29ubmVjdGlvbiA9PSBOVUxMKQorICAgIHJldHVybjsKKworICBpZiAodHJhbnNwb3J0LT5kaXNjb25uZWN0ZWQpCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0IChzb2NrZXRfdHJhbnNwb3J0LT5yZWFkX3dhdGNoID09IE5VTEwpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgCisgIF9kYnVzX3RyYW5zcG9ydF9yZWYgKHRyYW5zcG9ydCk7CisKKyAgaWYgKF9kYnVzX3RyYW5zcG9ydF90cnlfdG9fYXV0aGVudGljYXRlICh0cmFuc3BvcnQpKQorICAgIG5lZWRfcmVhZF93YXRjaCA9CisgICAgICAoX2RidXNfY291bnRlcl9nZXRfc2l6ZV92YWx1ZSAodHJhbnNwb3J0LT5saXZlX21lc3NhZ2VzKSA8IHRyYW5zcG9ydC0+bWF4X2xpdmVfbWVzc2FnZXNfc2l6ZSkgJiYKKyAgICAgIChfZGJ1c19jb3VudGVyX2dldF91bml4X2ZkX3ZhbHVlICh0cmFuc3BvcnQtPmxpdmVfbWVzc2FnZXMpIDwgdHJhbnNwb3J0LT5tYXhfbGl2ZV9tZXNzYWdlc191bml4X2Zkcyk7CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAodHJhbnNwb3J0LT5yZWNlaXZlX2NyZWRlbnRpYWxzX3BlbmRpbmcpCisgICAgICAgIG5lZWRfcmVhZF93YXRjaCA9IFRSVUU7CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvKiBUaGUgcmVhc29uIHRvIGRpc2FibGUgbmVlZF9yZWFkX3dhdGNoIHdoZW4gbm90IFdBSVRJTkdfRk9SX0lOUFVUCisgICAgICAgICAgICogaXMgdG8gYXZvaWQgc3Bpbm5pbmcgb24gdGhlIGZpbGUgZGVzY3JpcHRvciB3aGVuIHdlJ3JlIHdhaXRpbmcKKyAgICAgICAgICAgKiB0byB3cml0ZSBvciBmb3Igc29tZSBvdGhlciBwYXJ0IG9mIHRoZSBhdXRoIHByb2Nlc3MKKyAgICAgICAgICAgKi8KKyAgICAgICAgICBEQnVzQXV0aFN0YXRlIGF1dGhfc3RhdGU7CisgICAgICAgICAgCisgICAgICAgICAgYXV0aF9zdGF0ZSA9IF9kYnVzX2F1dGhfZG9fd29yayAodHJhbnNwb3J0LT5hdXRoKTsKKworICAgICAgICAgIC8qIElmIHdlIG5lZWQgbWVtb3J5IHdlIGluc3RhbGwgdGhlIHJlYWQgd2F0Y2gganVzdCBpbiBjYXNlLAorICAgICAgICAgICAqIGlmIHRoZXJlJ3Mgbm8gbmVlZCBmb3IgaXQsIGl0IHdpbGwgZ2V0IGRlLWluc3RhbGxlZAorICAgICAgICAgICAqIG5leHQgdGltZSB3ZSB0cnkgcmVhZGluZy4gSWYgd2UncmUgYXV0aGVudGljYXRlZCB3ZQorICAgICAgICAgICAqIGluc3RhbGwgaXQgc2luY2Ugd2Ugbm9ybWFsbHkgaGF2ZSBpdCBpbnN0YWxsZWQgd2hpbGUKKyAgICAgICAgICAgKiBhdXRoZW50aWNhdGVkLgorICAgICAgICAgICAqLworICAgICAgICAgIGlmIChhdXRoX3N0YXRlID09IERCVVNfQVVUSF9TVEFURV9XQUlUSU5HX0ZPUl9JTlBVVCB8fAorICAgICAgICAgICAgICBhdXRoX3N0YXRlID09IERCVVNfQVVUSF9TVEFURV9XQUlUSU5HX0ZPUl9NRU1PUlkgfHwKKyAgICAgICAgICAgICAgYXV0aF9zdGF0ZSA9PSBEQlVTX0FVVEhfU1RBVEVfQVVUSEVOVElDQVRFRCkKKyAgICAgICAgICAgIG5lZWRfcmVhZF93YXRjaCA9IFRSVUU7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgbmVlZF9yZWFkX3dhdGNoID0gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgX2RidXNfdmVyYm9zZSAoIiAgc2V0dGluZyByZWFkIHdhdGNoIGVuYWJsZWQgPSAlZFxuIiwgbmVlZF9yZWFkX3dhdGNoKTsKKyAgX2RidXNfY29ubmVjdGlvbl90b2dnbGVfd2F0Y2hfdW5sb2NrZWQgKHRyYW5zcG9ydC0+Y29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldF90cmFuc3BvcnQtPnJlYWRfd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkX3JlYWRfd2F0Y2gpOworCisgIF9kYnVzX3RyYW5zcG9ydF91bnJlZiAodHJhbnNwb3J0KTsKK30KKworc3RhdGljIHZvaWQKK2RvX2lvX2Vycm9yIChEQnVzVHJhbnNwb3J0ICp0cmFuc3BvcnQpCit7CisgIF9kYnVzX3RyYW5zcG9ydF9yZWYgKHRyYW5zcG9ydCk7CisgIF9kYnVzX3RyYW5zcG9ydF9kaXNjb25uZWN0ICh0cmFuc3BvcnQpOworICBfZGJ1c190cmFuc3BvcnRfdW5yZWYgKHRyYW5zcG9ydCk7Cit9CisKKy8qIHJldHVybiB2YWx1ZSBpcyB3aGV0aGVyIHdlIHN1Y2Nlc3NmdWxseSByZWFkIGFueSBuZXcgZGF0YS4gKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAorcmVhZF9kYXRhX2ludG9fYXV0aCAoREJ1c1RyYW5zcG9ydCAqdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAqb29tKQoreworICBEQnVzVHJhbnNwb3J0U29ja2V0ICpzb2NrZXRfdHJhbnNwb3J0ID0gKERCdXNUcmFuc3BvcnRTb2NrZXQqKSB0cmFuc3BvcnQ7CisgIERCdXNTdHJpbmcgKmJ1ZmZlcjsKKyAgaW50IGJ5dGVzX3JlYWQ7CisgIGludCBzYXZlZF9lcnJubzsKKworICAqb29tID0gRkFMU0U7CisKKyAgX2RidXNfYXV0aF9nZXRfYnVmZmVyICh0cmFuc3BvcnQtPmF1dGgsICZidWZmZXIpOworICAKKyAgYnl0ZXNfcmVhZCA9IF9kYnVzX3JlYWRfc29ja2V0IChzb2NrZXRfdHJhbnNwb3J0LT5mZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsIHNvY2tldF90cmFuc3BvcnQtPm1heF9ieXRlc19yZWFkX3Blcl9pdGVyYXRpb24pOworICBzYXZlZF9lcnJubyA9IF9kYnVzX3NhdmVfc29ja2V0X2Vycm5vICgpOworCisgIF9kYnVzX2F1dGhfcmV0dXJuX2J1ZmZlciAodHJhbnNwb3J0LT5hdXRoLCBidWZmZXIpOworCisgIGlmIChieXRlc19yZWFkID4gMCkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiIHJlYWQgJWQgYnl0ZXMgaW4gYXV0aCBwaGFzZVxuIiwgYnl0ZXNfcmVhZCk7CisKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgZWxzZSBpZiAoYnl0ZXNfcmVhZCA8IDApCisgICAgeworICAgICAgLyogRUlOVFIgYWxyZWFkeSBoYW5kbGVkIGZvciB1cyAqLworCisgICAgICBpZiAoX2RidXNfZ2V0X2lzX2Vycm5vX2Vub21lbSAoc2F2ZWRfZXJybm8pKQorICAgICAgICB7CisgICAgICAgICAgKm9vbSA9IFRSVUU7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKF9kYnVzX2dldF9pc19lcnJub19lYWdhaW5fb3JfZXdvdWxkYmxvY2sgKHNhdmVkX2Vycm5vKSkKKyAgICAgICAgOyAvKiBkbyBub3RoaW5nLCBqdXN0IHJldHVybiBGQUxTRSBiZWxvdyAqLworICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkVycm9yIHJlYWRpbmcgZnJvbSByZW1vdGUgYXBwOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvciAoc2F2ZWRfZXJybm8pKTsKKyAgICAgICAgICBkb19pb19lcnJvciAodHJhbnNwb3J0KTsKKyAgICAgICAgfQorCisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0IChieXRlc19yZWFkID09IDApOworICAgICAgCisgICAgICBfZGJ1c192ZXJib3NlICgiRGlzY29ubmVjdGVkIGZyb20gcmVtb3RlIGFwcFxuIik7CisgICAgICBkb19pb19lcnJvciAodHJhbnNwb3J0KTsKKworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KK30KKworLyogUmV0dXJuIHZhbHVlIGlzIHdoZXRoZXIgd2Ugc3VjY2Vzc2Z1bGx5IHdyb3RlIGFueSBieXRlcyAqLworc3RhdGljIGRidXNfYm9vbF90Cit3cml0ZV9kYXRhX2Zyb21fYXV0aCAoREJ1c1RyYW5zcG9ydCAqdHJhbnNwb3J0KQoreworICBEQnVzVHJhbnNwb3J0U29ja2V0ICpzb2NrZXRfdHJhbnNwb3J0ID0gKERCdXNUcmFuc3BvcnRTb2NrZXQqKSB0cmFuc3BvcnQ7CisgIGludCBieXRlc193cml0dGVuOworICBpbnQgc2F2ZWRfZXJybm87CisgIGNvbnN0IERCdXNTdHJpbmcgKmJ1ZmZlcjsKKworICBpZiAoIV9kYnVzX2F1dGhfZ2V0X2J5dGVzX3RvX3NlbmQgKHRyYW5zcG9ydC0+YXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmZmVyKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIAorICBieXRlc193cml0dGVuID0gX2RidXNfd3JpdGVfc29ja2V0IChzb2NrZXRfdHJhbnNwb3J0LT5mZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoYnVmZmVyKSk7CisgIHNhdmVkX2Vycm5vID0gX2RidXNfc2F2ZV9zb2NrZXRfZXJybm8gKCk7CisKKyAgaWYgKGJ5dGVzX3dyaXR0ZW4gPiAwKQorICAgIHsKKyAgICAgIF9kYnVzX2F1dGhfYnl0ZXNfc2VudCAodHJhbnNwb3J0LT5hdXRoLCBieXRlc193cml0dGVuKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgZWxzZSBpZiAoYnl0ZXNfd3JpdHRlbiA8IDApCisgICAgeworICAgICAgLyogRUlOVFIgYWxyZWFkeSBoYW5kbGVkIGZvciB1cyAqLworICAgICAgCisgICAgICBpZiAoX2RidXNfZ2V0X2lzX2Vycm5vX2VhZ2Fpbl9vcl9ld291bGRibG9jayAoc2F2ZWRfZXJybm8pKQorICAgICAgICA7CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiRXJyb3Igd3JpdGluZyB0byByZW1vdGUgYXBwOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvciAoc2F2ZWRfZXJybm8pKTsKKyAgICAgICAgICBkb19pb19lcnJvciAodHJhbnNwb3J0KTsKKyAgICAgICAgfQorICAgIH0KKworICByZXR1cm4gRkFMU0U7Cit9CisKKy8qIEZBTFNFIG9uIE9PTSAqLworc3RhdGljIGRidXNfYm9vbF90CitleGNoYW5nZV9jcmVkZW50aWFscyAoREJ1c1RyYW5zcG9ydCAqdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgIGRvX3JlYWRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgZG9fd3JpdGluZykKK3sKKyAgREJ1c1RyYW5zcG9ydFNvY2tldCAqc29ja2V0X3RyYW5zcG9ydCA9IChEQnVzVHJhbnNwb3J0U29ja2V0KikgdHJhbnNwb3J0OworICBEQnVzRXJyb3IgZXJyb3IgPSBEQlVTX0VSUk9SX0lOSVQ7CisKKyAgX2RidXNfdmVyYm9zZSAoImV4Y2hhbmdlX2NyZWRlbnRpYWxzOiBkb19yZWFkaW5nID0gJWQsIGRvX3dyaXRpbmcgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgIGRvX3JlYWRpbmcsIGRvX3dyaXRpbmcpOworCisgIGlmIChkb193cml0aW5nICYmIHRyYW5zcG9ydC0+c2VuZF9jcmVkZW50aWFsc19wZW5kaW5nKQorICAgIHsKKyAgICAgIGlmIChfZGJ1c19zZW5kX2NyZWRlbnRpYWxzX3NvY2tldCAoc29ja2V0X3RyYW5zcG9ydC0+ZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcikpCisgICAgICAgIHsKKyAgICAgICAgICB0cmFuc3BvcnQtPnNlbmRfY3JlZGVudGlhbHNfcGVuZGluZyA9IEZBTFNFOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiRmFpbGVkIHRvIHdyaXRlIGNyZWRlbnRpYWxzOiAlc1xuIiwgZXJyb3IubWVzc2FnZSk7CisgICAgICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgICAgIGRvX2lvX2Vycm9yICh0cmFuc3BvcnQpOworICAgICAgICB9CisgICAgfQorICAKKyAgaWYgKGRvX3JlYWRpbmcgJiYgdHJhbnNwb3J0LT5yZWNlaXZlX2NyZWRlbnRpYWxzX3BlbmRpbmcpCisgICAgeworICAgICAgLyogRklYTUUgdGhpcyBjYW4gZmFpbCBkdWUgdG8gSU8gZXJyb3IgX29yXyBPT00sIGJyb2tlbgorICAgICAgICogKHNvbWV3aGF0IHRyaWNreSB0byBmaXggc2luY2UgdGhlIE9PTSBlcnJvciBjYW4gYmUgc2V0IGFmdGVyCisgICAgICAgKiB3ZSBhbHJlYWR5IHJlYWQgdGhlIGNyZWRlbnRpYWxzIGJ5dGUsIHNvIGJhc2ljYWxseSB3ZSBuZWVkIHRvCisgICAgICAgKiBzZXBhcmF0ZSByZWFkaW5nIHRoZSBieXRlIGFuZCBzdG9yaW5nIGl0IGluIHRoZQorICAgICAgICogdHJhbnNwb3J0LT5jcmVkZW50aWFscykuIERvZXMgbm90IHJlYWxseSBtYXR0ZXIgZm9yIG5vdworICAgICAgICogYmVjYXVzZSBzdG9yaW5nIGluIGNyZWRlbnRpYWxzIG5ldmVyIGFjdHVhbGx5IGZhaWxzIG9uIHVuaXguCisgICAgICAgKi8gICAgICAKKyAgICAgIGlmIChfZGJ1c19yZWFkX2NyZWRlbnRpYWxzX3NvY2tldCAoc29ja2V0X3RyYW5zcG9ydC0+ZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydC0+Y3JlZGVudGlhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcikpCisgICAgICAgIHsKKyAgICAgICAgICB0cmFuc3BvcnQtPnJlY2VpdmVfY3JlZGVudGlhbHNfcGVuZGluZyA9IEZBTFNFOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiRmFpbGVkIHRvIHJlYWQgY3JlZGVudGlhbHMgJXNcbiIsIGVycm9yLm1lc3NhZ2UpOworICAgICAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgICAgICBkb19pb19lcnJvciAodHJhbnNwb3J0KTsKKyAgICAgICAgfQorICAgIH0KKworICBpZiAoISh0cmFuc3BvcnQtPnNlbmRfY3JlZGVudGlhbHNfcGVuZGluZyB8fAorICAgICAgICB0cmFuc3BvcnQtPnJlY2VpdmVfY3JlZGVudGlhbHNfcGVuZGluZykpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19hdXRoX3NldF9jcmVkZW50aWFscyAodHJhbnNwb3J0LT5hdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0LT5jcmVkZW50aWFscykpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorZG9fYXV0aGVudGljYXRpb24gKERCdXNUcmFuc3BvcnQgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICBkb19yZWFkaW5nLAorICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgIGRvX3dyaXRpbmcsCisJCSAgIGRidXNfYm9vbF90ICAgKmF1dGhfY29tcGxldGVkKQoreworICBkYnVzX2Jvb2xfdCBvb207CisgIGRidXNfYm9vbF90IG9yaWdfYXV0aF9zdGF0ZTsKKworICBvb20gPSBGQUxTRTsKKyAgCisgIG9yaWdfYXV0aF9zdGF0ZSA9IF9kYnVzX3RyYW5zcG9ydF90cnlfdG9fYXV0aGVudGljYXRlICh0cmFuc3BvcnQpOworCisgIC8qIFRoaXMgaXMgZXNzZW50aWFsIHRvIGF2b2lkIHRoZSBjaGVja193cml0ZV93YXRjaCgpIGF0IHRoZSBlbmQsCisgICAqIHdlIGRvbid0IHdhbnQgdG8gYWRkIGEgd3JpdGUgd2F0Y2ggaW4gZG9faXRlcmF0aW9uIGJlZm9yZQorICAgKiB3ZSB0cnkgd3JpdGluZyBhbmQgZ2V0IEVBR0FJTgorICAgKi8KKyAgaWYgKG9yaWdfYXV0aF9zdGF0ZSkKKyAgICB7CisgICAgICBpZiAoYXV0aF9jb21wbGV0ZWQpCisgICAgICAgICphdXRoX2NvbXBsZXRlZCA9IEZBTFNFOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICAKKyAgX2RidXNfdHJhbnNwb3J0X3JlZiAodHJhbnNwb3J0KTsKKyAgCisgIHdoaWxlICghX2RidXNfdHJhbnNwb3J0X3RyeV90b19hdXRoZW50aWNhdGUgKHRyYW5zcG9ydCkgJiYKKyAgICAgICAgIF9kYnVzX3RyYW5zcG9ydF9nZXRfaXNfY29ubmVjdGVkICh0cmFuc3BvcnQpKQorICAgIHsgICAgICAKKyAgICAgIGlmICghZXhjaGFuZ2VfY3JlZGVudGlhbHMgKHRyYW5zcG9ydCwgZG9fcmVhZGluZywgZG9fd3JpdGluZykpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBPT00gKi8KKyAgICAgICAgICBvb20gPSBUUlVFOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgICAKKyAgICAgIGlmICh0cmFuc3BvcnQtPnNlbmRfY3JlZGVudGlhbHNfcGVuZGluZyB8fAorICAgICAgICAgIHRyYW5zcG9ydC0+cmVjZWl2ZV9jcmVkZW50aWFsc19wZW5kaW5nKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoInNlbmRfY3JlZGVudGlhbHNfcGVuZGluZyA9ICVkIHJlY2VpdmVfY3JlZGVudGlhbHNfcGVuZGluZyA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydC0+c2VuZF9jcmVkZW50aWFsc19wZW5kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydC0+cmVjZWl2ZV9jcmVkZW50aWFsc19wZW5kaW5nKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisjZGVmaW5lIFRSQU5TUE9SVF9TSURFKHQpICgodCktPmlzX3NlcnZlciA/ICJzZXJ2ZXIiIDogImNsaWVudCIpCisgICAgICBzd2l0Y2ggKF9kYnVzX2F1dGhfZG9fd29yayAodHJhbnNwb3J0LT5hdXRoKSkKKyAgICAgICAgeworICAgICAgICBjYXNlIERCVVNfQVVUSF9TVEFURV9XQUlUSU5HX0ZPUl9JTlBVVDoKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiICVzIGF1dGggc3RhdGU6IHdhaXRpbmcgZm9yIGlucHV0XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRSQU5TUE9SVF9TSURFICh0cmFuc3BvcnQpKTsKKyAgICAgICAgICBpZiAoIWRvX3JlYWRpbmcgfHwgIXJlYWRfZGF0YV9pbnRvX2F1dGggKHRyYW5zcG9ydCwgJm9vbSkpCisgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICBicmVhazsKKyAgICAgIAorICAgICAgICBjYXNlIERCVVNfQVVUSF9TVEFURV9XQUlUSU5HX0ZPUl9NRU1PUlk6CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIiAlcyBhdXRoIHN0YXRlOiB3YWl0aW5nIGZvciBtZW1vcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgVFJBTlNQT1JUX1NJREUgKHRyYW5zcG9ydCkpOworICAgICAgICAgIG9vbSA9IFRSVUU7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgYnJlYWs7CisgICAgICAKKyAgICAgICAgY2FzZSBEQlVTX0FVVEhfU1RBVEVfSEFWRV9CWVRFU19UT19TRU5EOgorICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgJXMgYXV0aCBzdGF0ZTogYnl0ZXMgdG8gc2VuZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUUkFOU1BPUlRfU0lERSAodHJhbnNwb3J0KSk7CisgICAgICAgICAgaWYgKCFkb193cml0aW5nIHx8ICF3cml0ZV9kYXRhX2Zyb21fYXV0aCAodHJhbnNwb3J0KSkKKyAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgIGJyZWFrOworICAgICAgCisgICAgICAgIGNhc2UgREJVU19BVVRIX1NUQVRFX05FRURfRElTQ09OTkVDVDoKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiICVzIGF1dGggc3RhdGU6IG5lZWQgdG8gZGlzY29ubmVjdFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUUkFOU1BPUlRfU0lERSAodHJhbnNwb3J0KSk7CisgICAgICAgICAgZG9faW9fZXJyb3IgKHRyYW5zcG9ydCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAKKyAgICAgICAgY2FzZSBEQlVTX0FVVEhfU1RBVEVfQVVUSEVOVElDQVRFRDoKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiICVzIGF1dGggc3RhdGU6IGF1dGhlbnRpY2F0ZWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgVFJBTlNQT1JUX1NJREUgKHRyYW5zcG9ydCkpOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgREJVU19BVVRIX1NUQVRFX0lOVkFMSUQ6CisgICAgICAgICAgLyogZmFsbCB0aHJvdWdoICovCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiaW52YWxpZCBhdXRoIHN0YXRlIik7CisgICAgICAgIH0KKyAgICB9CisKKyBvdXQ6CisgIGlmIChhdXRoX2NvbXBsZXRlZCkKKyAgICAqYXV0aF9jb21wbGV0ZWQgPSAob3JpZ19hdXRoX3N0YXRlICE9IF9kYnVzX3RyYW5zcG9ydF90cnlfdG9fYXV0aGVudGljYXRlICh0cmFuc3BvcnQpKTsKKyAgCisgIGNoZWNrX3JlYWRfd2F0Y2ggKHRyYW5zcG9ydCk7CisgIGNoZWNrX3dyaXRlX3dhdGNoICh0cmFuc3BvcnQpOworICBfZGJ1c190cmFuc3BvcnRfdW5yZWYgKHRyYW5zcG9ydCk7CisKKyAgaWYgKG9vbSkKKyAgICByZXR1cm4gRkFMU0U7CisgIGVsc2UKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyogcmV0dXJucyBmYWxzZSBvbiBvb20gKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAorZG9fd3JpdGluZyAoREJ1c1RyYW5zcG9ydCAqdHJhbnNwb3J0KQoreworICBpbnQgdG90YWw7CisgIERCdXNUcmFuc3BvcnRTb2NrZXQgKnNvY2tldF90cmFuc3BvcnQgPSAoREJ1c1RyYW5zcG9ydFNvY2tldCopIHRyYW5zcG9ydDsKKyAgZGJ1c19ib29sX3Qgb29tOworICAKKyAgLyogTm8gbWVzc2FnZXMgd2l0aG91dCBhdXRoZW50aWNhdGlvbiEgKi8KKyAgaWYgKCFfZGJ1c190cmFuc3BvcnRfdHJ5X3RvX2F1dGhlbnRpY2F0ZSAodHJhbnNwb3J0KSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiTm90IGF1dGhlbnRpY2F0ZWQsIG5vdCB3cml0aW5nIGFueXRoaW5nXG4iKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICBpZiAodHJhbnNwb3J0LT5kaXNjb25uZWN0ZWQpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIk5vdCBjb25uZWN0ZWQsIG5vdCB3cml0aW5nIGFueXRoaW5nXG4iKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworI2lmIDEKKyAgX2RidXNfdmVyYm9zZSAoImRvX3dyaXRpbmcoKSwgaGF2ZV9tZXNzYWdlcyA9ICVkLCBmZCA9ICUiIERCVVNfU09DS0VUX0ZPUk1BVCAiXG4iLAorICAgICAgICAgICAgICAgICBfZGJ1c19jb25uZWN0aW9uX2hhc19tZXNzYWdlc190b19zZW5kX3VubG9ja2VkICh0cmFuc3BvcnQtPmNvbm5lY3Rpb24pLAorICAgICAgICAgICAgICAgICBfZGJ1c19zb2NrZXRfcHJpbnRhYmxlIChzb2NrZXRfdHJhbnNwb3J0LT5mZCkpOworI2VuZGlmCisgIAorICBvb20gPSBGQUxTRTsKKyAgdG90YWwgPSAwOworCisgIHdoaWxlICghdHJhbnNwb3J0LT5kaXNjb25uZWN0ZWQgJiYKKyAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25faGFzX21lc3NhZ2VzX3RvX3NlbmRfdW5sb2NrZWQgKHRyYW5zcG9ydC0+Y29ubmVjdGlvbikpCisgICAgeworICAgICAgaW50IGJ5dGVzX3dyaXR0ZW47CisgICAgICBEQnVzTWVzc2FnZSAqbWVzc2FnZTsKKyAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmhlYWRlcjsKKyAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmJvZHk7CisgICAgICBpbnQgaGVhZGVyX2xlbiwgYm9keV9sZW47CisgICAgICBpbnQgdG90YWxfYnl0ZXNfdG9fd3JpdGU7CisgICAgICBpbnQgc2F2ZWRfZXJybm87CisgICAgICAKKyAgICAgIGlmICh0b3RhbCA+IHNvY2tldF90cmFuc3BvcnQtPm1heF9ieXRlc193cml0dGVuX3Blcl9pdGVyYXRpb24pCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiJWQgYnl0ZXMgZXhjZWVkcyAlZCBieXRlcyB3cml0dGVuIHBlciBpdGVyYXRpb24sIHJldHVybmluZ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbCwgc29ja2V0X3RyYW5zcG9ydC0+bWF4X2J5dGVzX3dyaXR0ZW5fcGVyX2l0ZXJhdGlvbik7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgbWVzc2FnZSA9IF9kYnVzX2Nvbm5lY3Rpb25fZ2V0X21lc3NhZ2VfdG9fc2VuZCAodHJhbnNwb3J0LT5jb25uZWN0aW9uKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAobWVzc2FnZSAhPSBOVUxMKTsKKyAgICAgIGRidXNfbWVzc2FnZV9sb2NrIChtZXNzYWdlKTsKKworI2lmIDAKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJ3cml0aW5nIG1lc3NhZ2UgJXBcbiIsIG1lc3NhZ2UpOworI2VuZGlmCisgICAgICAKKyAgICAgIF9kYnVzX21lc3NhZ2VfZ2V0X25ldHdvcmtfZGF0YSAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhlYWRlciwgJmJvZHkpOworCisgICAgICBoZWFkZXJfbGVuID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGhlYWRlcik7CisgICAgICBib2R5X2xlbiA9IF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChib2R5KTsKKworICAgICAgaWYgKF9kYnVzX2F1dGhfbmVlZHNfZW5jb2RpbmcgKHRyYW5zcG9ydC0+YXV0aCkpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBEb2VzIGZkIHBhc3NpbmcgZXZlbiBtYWtlIHNlbnNlIHdpdGggZW5jb2RlZCBkYXRhPyAqLworICAgICAgICAgIF9kYnVzX2Fzc2VydCghREJVU19UUkFOU1BPUlRfQ0FOX1NFTkRfVU5JWF9GRCh0cmFuc3BvcnQpKTsKKworICAgICAgICAgIGlmIChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnNvY2tldF90cmFuc3BvcnQtPmVuY29kZWRfb3V0Z29pbmcpID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmICghX2RidXNfYXV0aF9lbmNvZGVfZGF0YSAodHJhbnNwb3J0LT5hdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlciwgJnNvY2tldF90cmFuc3BvcnQtPmVuY29kZWRfb3V0Z29pbmcpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIG9vbSA9IFRSVUU7CisgICAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBpZiAoIV9kYnVzX2F1dGhfZW5jb2RlX2RhdGEgKHRyYW5zcG9ydC0+YXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2R5LCAmc29ja2V0X3RyYW5zcG9ydC0+ZW5jb2RlZF9vdXRnb2luZykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKCZzb2NrZXRfdHJhbnNwb3J0LT5lbmNvZGVkX291dGdvaW5nLCAwKTsKKyAgICAgICAgICAgICAgICAgIG9vbSA9IFRSVUU7CisgICAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgCisgICAgICAgICAgdG90YWxfYnl0ZXNfdG9fd3JpdGUgPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnNvY2tldF90cmFuc3BvcnQtPmVuY29kZWRfb3V0Z29pbmcpOworCisjaWYgMAorICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJlbmNvZGVkIG1lc3NhZ2UgaXMgJWQgYnl0ZXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxfYnl0ZXNfdG9fd3JpdGUpOworI2VuZGlmCisgICAgICAgICAgCisgICAgICAgICAgYnl0ZXNfd3JpdHRlbiA9CisgICAgICAgICAgICBfZGJ1c193cml0ZV9zb2NrZXQgKHNvY2tldF90cmFuc3BvcnQtPmZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc29ja2V0X3RyYW5zcG9ydC0+ZW5jb2RlZF9vdXRnb2luZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0X3RyYW5zcG9ydC0+bWVzc2FnZV9ieXRlc193cml0dGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbF9ieXRlc190b193cml0ZSAtIHNvY2tldF90cmFuc3BvcnQtPm1lc3NhZ2VfYnl0ZXNfd3JpdHRlbik7CisgICAgICAgICAgc2F2ZWRfZXJybm8gPSBfZGJ1c19zYXZlX3NvY2tldF9lcnJubyAoKTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgdG90YWxfYnl0ZXNfdG9fd3JpdGUgPSBoZWFkZXJfbGVuICsgYm9keV9sZW47CisKKyNpZiAwCisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIm1lc3NhZ2UgaXMgJWQgYnl0ZXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxfYnl0ZXNfdG9fd3JpdGUpOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX1VOSVhfRkRfUEFTU0lORworICAgICAgICAgIGlmIChzb2NrZXRfdHJhbnNwb3J0LT5tZXNzYWdlX2J5dGVzX3dyaXR0ZW4gPD0gMCAmJiBEQlVTX1RSQU5TUE9SVF9DQU5fU0VORF9VTklYX0ZEKHRyYW5zcG9ydCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8qIFNlbmQgdGhlIGZkcyBhbG9uZyB3aXRoIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBtZXNzYWdlICovCisgICAgICAgICAgICAgIGNvbnN0IGludCAqdW5peF9mZHM7CisgICAgICAgICAgICAgIHVuc2lnbmVkIG47CisKKyAgICAgICAgICAgICAgX2RidXNfbWVzc2FnZV9nZXRfdW5peF9mZHMobWVzc2FnZSwgJnVuaXhfZmRzLCAmbik7CisKKyAgICAgICAgICAgICAgYnl0ZXNfd3JpdHRlbiA9CisgICAgICAgICAgICAgICAgX2RidXNfd3JpdGVfc29ja2V0X3dpdGhfdW5peF9mZHNfdHdvIChzb2NrZXRfdHJhbnNwb3J0LT5mZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldF90cmFuc3BvcnQtPm1lc3NhZ2VfYnl0ZXNfd3JpdHRlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcl9sZW4gLSBzb2NrZXRfdHJhbnNwb3J0LT5tZXNzYWdlX2J5dGVzX3dyaXR0ZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgYm9keV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml4X2ZkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4pOworICAgICAgICAgICAgICBzYXZlZF9lcnJubyA9IF9kYnVzX3NhdmVfc29ja2V0X2Vycm5vICgpOworCisgICAgICAgICAgICAgIGlmIChieXRlc193cml0dGVuID4gMCAmJiBuID4gMCkKKyAgICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlKCJXcm90ZSAlaSB1bml4IGZkc1xuIiwgbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorI2VuZGlmCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmIChzb2NrZXRfdHJhbnNwb3J0LT5tZXNzYWdlX2J5dGVzX3dyaXR0ZW4gPCBoZWFkZXJfbGVuKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGJ5dGVzX3dyaXR0ZW4gPQorICAgICAgICAgICAgICAgICAgICBfZGJ1c193cml0ZV9zb2NrZXRfdHdvIChzb2NrZXRfdHJhbnNwb3J0LT5mZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXRfdHJhbnNwb3J0LT5tZXNzYWdlX2J5dGVzX3dyaXR0ZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcl9sZW4gLSBzb2NrZXRfdHJhbnNwb3J0LT5tZXNzYWdlX2J5dGVzX3dyaXR0ZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIGJvZHlfbGVuKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBieXRlc193cml0dGVuID0KKyAgICAgICAgICAgICAgICAgICAgX2RidXNfd3JpdGVfc29ja2V0IChzb2NrZXRfdHJhbnNwb3J0LT5mZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzb2NrZXRfdHJhbnNwb3J0LT5tZXNzYWdlX2J5dGVzX3dyaXR0ZW4gLSBoZWFkZXJfbGVuKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2R5X2xlbiAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNvY2tldF90cmFuc3BvcnQtPm1lc3NhZ2VfYnl0ZXNfd3JpdHRlbiAtIGhlYWRlcl9sZW4pKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgc2F2ZWRfZXJybm8gPSBfZGJ1c19zYXZlX3NvY2tldF9lcnJubyAoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICBpZiAoYnl0ZXNfd3JpdHRlbiA8IDApCisgICAgICAgIHsKKyAgICAgICAgICAvKiBFSU5UUiBhbHJlYWR5IGhhbmRsZWQgZm9yIHVzICovCisgICAgICAgICAgCisgICAgICAgICAgLyogSWYgdGhlIG90aGVyIGVuZCBjbG9zZWQgdGhlIHNvY2tldCB3aXRoIGNsb3NlKCkgb3Igc2h1dGRvd24oKSwgd2UKKyAgICAgICAgICAgKiByZWNlaXZlIEVQSVBFIGhlcmUgYnV0IHdlIG11c3Qgbm90IGNsb3NlIHRoZSBzb2NrZXQgeWV0OiB0aGVyZQorICAgICAgICAgICAqIG1pZ2h0IHN0aWxsIGJlIHNvbWUgZGF0YSB0byByZWFkLiBTZWU6CisgICAgICAgICAgICogaHR0cDovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9hcmNoaXZlcy9kYnVzLzIwMDgtTWFyY2gvMDA5NTI2Lmh0bWwKKyAgICAgICAgICAgKi8KKyAgICAgICAgICAKKyAgICAgICAgICBpZiAoX2RidXNfZ2V0X2lzX2Vycm5vX2VhZ2Fpbl9vcl9ld291bGRibG9jayAoc2F2ZWRfZXJybm8pIHx8IF9kYnVzX2dldF9pc19lcnJub19lcGlwZSAoc2F2ZWRfZXJybm8pKQorICAgICAgICAgICAgZ290byBvdXQ7CisKKyAgICAgICAgICAvKiBTaW5jZSBMaW51eCBjb21taXQgMjU4ODhlIChmcm9tIDIuNi4zNy1yYzQsIE5vdiAyMDEwKSwgc2VuZG1zZygpCisgICAgICAgICAgICogb24gVW5peCBzb2NrZXRzIHJldHVybnMgLTEgZXJybm89RVRPT01BTllSRUZTIHdoZW4gdGhlIHBhc3NmZAorICAgICAgICAgICAqIG1lY2hhbmlzbSAoU0NNX1JJR0hUUykgaXMgdXNlZCByZWN1cnNpdmVseSB3aXRoIGEgcmVjdXJzaW9uIGxldmVsCisgICAgICAgICAgICogb2YgbWF4aW11bSA0LiBUaGUga2VybmVsIGRvZXMgbm90IGhhdmUgYW4gQVBJIHRvIGNoZWNrIHdoZXRoZXIKKyAgICAgICAgICAgKiB0aGUgcGFzc2VkIGZkcyBjYW4gYmUgZm9yd2FyZGVkIGFuZCBpdCBjYW4gY2hhbmdlIGFzeW5jaHJvbm91c2x5LgorICAgICAgICAgICAqIFNlZToKKyAgICAgICAgICAgKiBodHRwczovL2J1Z3MuZnJlZWRlc2t0b3Aub3JnL3Nob3dfYnVnLmNnaT9pZD04MDE2MworICAgICAgICAgICAqLworCisgICAgICAgICAgZWxzZSBpZiAoX2RidXNfZ2V0X2lzX2Vycm5vX2V0b29tYW55cmVmcyAoc2F2ZWRfZXJybm8pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvKiBXZSBvbmx5IHNlbmQgZmRzIGluIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBtZXNzYWdlLgorICAgICAgICAgICAgICAgKiBFVE9PTUFOWVJFRlMgY2Fubm90IGhhcHBlbiBhZnRlci4KKyAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgIF9kYnVzX2Fzc2VydCAoc29ja2V0X3RyYW5zcG9ydC0+bWVzc2FnZV9ieXRlc193cml0dGVuID09IDApOworCisgICAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgZGlzY2FyZCBtZXNzYWdlIG9mICVkIGJ5dGVzIGR1ZSB0byBFVE9PTUFOWVJFRlNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsX2J5dGVzX3RvX3dyaXRlKTsKKworICAgICAgICAgICAgICBzb2NrZXRfdHJhbnNwb3J0LT5tZXNzYWdlX2J5dGVzX3dyaXR0ZW4gPSAwOworICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfc2V0X2xlbmd0aCAoJnNvY2tldF90cmFuc3BvcnQtPmVuY29kZWRfb3V0Z29pbmcsIDApOworICAgICAgICAgICAgICBfZGJ1c19zdHJpbmdfY29tcGFjdCAoJnNvY2tldF90cmFuc3BvcnQtPmVuY29kZWRfb3V0Z29pbmcsIDIwNDgpOworCisgICAgICAgICAgICAgIC8qIFRoZSBtZXNzYWdlIHdhcyBub3QgYWN0dWFsbHkgc2VudCBidXQgaXQgbmVlZHMgdG8gYmUgcmVtb3ZlZAorICAgICAgICAgICAgICAgKiBmcm9tIHRoZSBvdXRnb2luZyBxdWV1ZQorICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgX2RidXNfY29ubmVjdGlvbl9tZXNzYWdlX3NlbnRfdW5sb2NrZWQgKHRyYW5zcG9ydC0+Y29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UpOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkVycm9yIHdyaXRpbmcgdG8gcmVtb3RlIGFwcDogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmVycm9yIChzYXZlZF9lcnJubykpOworICAgICAgICAgICAgICBkb19pb19lcnJvciAodHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgd3JvdGUgJWQgYnl0ZXMgb2YgJWRcbiIsIGJ5dGVzX3dyaXR0ZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxfYnl0ZXNfdG9fd3JpdGUpOworICAgICAgICAgIAorICAgICAgICAgIHRvdGFsICs9IGJ5dGVzX3dyaXR0ZW47CisgICAgICAgICAgc29ja2V0X3RyYW5zcG9ydC0+bWVzc2FnZV9ieXRlc193cml0dGVuICs9IGJ5dGVzX3dyaXR0ZW47CisKKyAgICAgICAgICBfZGJ1c19hc3NlcnQgKHNvY2tldF90cmFuc3BvcnQtPm1lc3NhZ2VfYnl0ZXNfd3JpdHRlbiA8PQorICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxfYnl0ZXNfdG9fd3JpdGUpOworICAgICAgICAgIAorICAgICAgICAgIGlmIChzb2NrZXRfdHJhbnNwb3J0LT5tZXNzYWdlX2J5dGVzX3dyaXR0ZW4gPT0gdG90YWxfYnl0ZXNfdG9fd3JpdGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHNvY2tldF90cmFuc3BvcnQtPm1lc3NhZ2VfYnl0ZXNfd3JpdHRlbiA9IDA7CisgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19zZXRfbGVuZ3RoICgmc29ja2V0X3RyYW5zcG9ydC0+ZW5jb2RlZF9vdXRnb2luZywgMCk7CisgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19jb21wYWN0ICgmc29ja2V0X3RyYW5zcG9ydC0+ZW5jb2RlZF9vdXRnb2luZywgMjA0OCk7CisKKyAgICAgICAgICAgICAgX2RidXNfY29ubmVjdGlvbl9tZXNzYWdlX3NlbnRfdW5sb2NrZWQgKHRyYW5zcG9ydC0+Y29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgb3V0OgorICBpZiAob29tKQorICAgIHJldHVybiBGQUxTRTsKKyAgZWxzZQorICAgIHJldHVybiBUUlVFOworfQorCisvKiByZXR1cm5zIGZhbHNlIG9uIG91dC1vZi1tZW1vcnkgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAorZG9fcmVhZGluZyAoREJ1c1RyYW5zcG9ydCAqdHJhbnNwb3J0KQoreworICBEQnVzVHJhbnNwb3J0U29ja2V0ICpzb2NrZXRfdHJhbnNwb3J0ID0gKERCdXNUcmFuc3BvcnRTb2NrZXQqKSB0cmFuc3BvcnQ7CisgIERCdXNTdHJpbmcgKmJ1ZmZlcjsKKyAgaW50IGJ5dGVzX3JlYWQ7CisgIGludCB0b3RhbDsKKyAgZGJ1c19ib29sX3Qgb29tOworICBpbnQgc2F2ZWRfZXJybm87CisKKyAgX2RidXNfdmVyYm9zZSAoImZkID0gJSIgREJVU19TT0NLRVRfRk9STUFUICJcbiIsCisgICAgICAgICAgICAgICAgIF9kYnVzX3NvY2tldF9wcmludGFibGUgKHNvY2tldF90cmFuc3BvcnQtPmZkKSk7CisgIAorICAvKiBObyBtZXNzYWdlcyB3aXRob3V0IGF1dGhlbnRpY2F0aW9uISAqLworICBpZiAoIV9kYnVzX3RyYW5zcG9ydF90cnlfdG9fYXV0aGVudGljYXRlICh0cmFuc3BvcnQpKQorICAgIHJldHVybiBUUlVFOworCisgIG9vbSA9IEZBTFNFOworICAKKyAgdG90YWwgPSAwOworCisgYWdhaW46CisgIAorICAvKiBTZWUgaWYgd2UndmUgZXhjZWVkZWQgbWF4IG1lc3NhZ2VzIGFuZCBuZWVkIHRvIGRpc2FibGUgcmVhZGluZyAqLworICBjaGVja19yZWFkX3dhdGNoICh0cmFuc3BvcnQpOworICAKKyAgaWYgKHRvdGFsID4gc29ja2V0X3RyYW5zcG9ydC0+bWF4X2J5dGVzX3JlYWRfcGVyX2l0ZXJhdGlvbikKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiJWQgYnl0ZXMgZXhjZWVkcyAlZCBieXRlcyByZWFkIHBlciBpdGVyYXRpb24sIHJldHVybmluZ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgIHRvdGFsLCBzb2NrZXRfdHJhbnNwb3J0LT5tYXhfYnl0ZXNfcmVhZF9wZXJfaXRlcmF0aW9uKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBfZGJ1c19hc3NlcnQgKHNvY2tldF90cmFuc3BvcnQtPnJlYWRfd2F0Y2ggIT0gTlVMTCB8fAorICAgICAgICAgICAgICAgIHRyYW5zcG9ydC0+ZGlzY29ubmVjdGVkKTsKKyAgCisgIGlmICh0cmFuc3BvcnQtPmRpc2Nvbm5lY3RlZCkKKyAgICBnb3RvIG91dDsKKworICBpZiAoIWRidXNfd2F0Y2hfZ2V0X2VuYWJsZWQgKHNvY2tldF90cmFuc3BvcnQtPnJlYWRfd2F0Y2gpKQorICAgIHJldHVybiBUUlVFOworICAKKyAgaWYgKF9kYnVzX2F1dGhfbmVlZHNfZGVjb2RpbmcgKHRyYW5zcG9ydC0+YXV0aCkpCisgICAgeworICAgICAgLyogRG9lcyBmZCBwYXNzaW5nIGV2ZW4gbWFrZSBzZW5zZSB3aXRoIGVuY29kZWQgZGF0YT8gKi8KKyAgICAgIF9kYnVzX2Fzc2VydCghREJVU19UUkFOU1BPUlRfQ0FOX1NFTkRfVU5JWF9GRCh0cmFuc3BvcnQpKTsKKworICAgICAgaWYgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoICgmc29ja2V0X3RyYW5zcG9ydC0+ZW5jb2RlZF9pbmNvbWluZykgPiAwKQorICAgICAgICBieXRlc19yZWFkID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZzb2NrZXRfdHJhbnNwb3J0LT5lbmNvZGVkX2luY29taW5nKTsKKyAgICAgIGVsc2UKKyAgICAgICAgYnl0ZXNfcmVhZCA9IF9kYnVzX3JlYWRfc29ja2V0IChzb2NrZXRfdHJhbnNwb3J0LT5mZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc29ja2V0X3RyYW5zcG9ydC0+ZW5jb2RlZF9pbmNvbWluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXRfdHJhbnNwb3J0LT5tYXhfYnl0ZXNfcmVhZF9wZXJfaXRlcmF0aW9uKTsKKworICAgICAgc2F2ZWRfZXJybm8gPSBfZGJ1c19zYXZlX3NvY2tldF9lcnJubyAoKTsKKworICAgICAgX2RidXNfYXNzZXJ0IChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoJnNvY2tldF90cmFuc3BvcnQtPmVuY29kZWRfaW5jb21pbmcpID09CisgICAgICAgICAgICAgICAgICAgIGJ5dGVzX3JlYWQpOworICAgICAgCisgICAgICBpZiAoYnl0ZXNfcmVhZCA+IDApCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19tZXNzYWdlX2xvYWRlcl9nZXRfYnVmZmVyICh0cmFuc3BvcnQtPmxvYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgICAgICAgICBpZiAoIV9kYnVzX2F1dGhfZGVjb2RlX2RhdGEgKHRyYW5zcG9ydC0+YXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzb2NrZXRfdHJhbnNwb3J0LT5lbmNvZGVkX2luY29taW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIk91dCBvZiBtZW1vcnkgZGVjb2RpbmcgaW5jb21pbmcgZGF0YVxuIik7CisgICAgICAgICAgICAgIF9kYnVzX21lc3NhZ2VfbG9hZGVyX3JldHVybl9idWZmZXIgKHRyYW5zcG9ydC0+bG9hZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcik7CisKKyAgICAgICAgICAgICAgb29tID0gVFJVRTsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBfZGJ1c19tZXNzYWdlX2xvYWRlcl9yZXR1cm5fYnVmZmVyICh0cmFuc3BvcnQtPmxvYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIpOworCisgICAgICAgICAgX2RidXNfc3RyaW5nX3NldF9sZW5ndGggKCZzb2NrZXRfdHJhbnNwb3J0LT5lbmNvZGVkX2luY29taW5nLCAwKTsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfY29tcGFjdCAoJnNvY2tldF90cmFuc3BvcnQtPmVuY29kZWRfaW5jb21pbmcsIDIwNDgpOworICAgICAgICB9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaW50IG1heF90b19yZWFkID0gREJVU19NQVhJTVVNX01FU1NBR0VfTEVOR1RIOworICAgICAgZGJ1c19ib29sX3QgbWF5X3JlYWRfdW5peF9mZHMgPSBUUlVFOworCisgICAgICBfZGJ1c19tZXNzYWdlX2xvYWRlcl9nZXRfYnVmZmVyICh0cmFuc3BvcnQtPmxvYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWF4X3RvX3JlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWF5X3JlYWRfdW5peF9mZHMpOworCisgICAgICBpZiAobWF4X3RvX3JlYWQgPiBzb2NrZXRfdHJhbnNwb3J0LT5tYXhfYnl0ZXNfcmVhZF9wZXJfaXRlcmF0aW9uKQorICAgICAgICBtYXhfdG9fcmVhZCA9IHNvY2tldF90cmFuc3BvcnQtPm1heF9ieXRlc19yZWFkX3Blcl9pdGVyYXRpb247CisKKyNpZmRlZiBIQVZFX1VOSVhfRkRfUEFTU0lORworICAgICAgaWYgKERCVVNfVFJBTlNQT1JUX0NBTl9TRU5EX1VOSVhfRkQodHJhbnNwb3J0KSAmJiBtYXlfcmVhZF91bml4X2ZkcykKKyAgICAgICAgeworICAgICAgICAgIGludCAqZmRzOworICAgICAgICAgIHVuc2lnbmVkIGludCBuX2ZkczsKKworICAgICAgICAgIGlmICghX2RidXNfbWVzc2FnZV9sb2FkZXJfZ2V0X3VuaXhfZmRzKHRyYW5zcG9ydC0+bG9hZGVyLCAmZmRzLCAmbl9mZHMpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiT3V0IG9mIG1lbW9yeSByZWFkaW5nIGZpbGUgZGVzY3JpcHRvcnNcbiIpOworICAgICAgICAgICAgICBfZGJ1c19tZXNzYWdlX2xvYWRlcl9yZXR1cm5fYnVmZmVyICh0cmFuc3BvcnQtPmxvYWRlciwgYnVmZmVyKTsKKyAgICAgICAgICAgICAgb29tID0gVFJVRTsKKyAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBieXRlc19yZWFkID0gX2RidXNfcmVhZF9zb2NrZXRfd2l0aF91bml4X2Zkcyhzb2NrZXRfdHJhbnNwb3J0LT5mZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X3RvX3JlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmRzLCAmbl9mZHMpOworICAgICAgICAgIHNhdmVkX2Vycm5vID0gX2RidXNfc2F2ZV9zb2NrZXRfZXJybm8gKCk7CisKKyAgICAgICAgICBpZiAoYnl0ZXNfcmVhZCA+PSAwICYmIG5fZmRzID4gMCkKKyAgICAgICAgICAgIF9kYnVzX3ZlcmJvc2UoIlJlYWQgJWkgdW5peCBmZHNcbiIsIG5fZmRzKTsKKworICAgICAgICAgIF9kYnVzX21lc3NhZ2VfbG9hZGVyX3JldHVybl91bml4X2Zkcyh0cmFuc3BvcnQtPmxvYWRlciwgZmRzLCBieXRlc19yZWFkIDwgMCA/IDAgOiBuX2Zkcyk7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgICB7CisgICAgICAgICAgYnl0ZXNfcmVhZCA9IF9kYnVzX3JlYWRfc29ja2V0IChzb2NrZXRfdHJhbnNwb3J0LT5mZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwgbWF4X3RvX3JlYWQpOworICAgICAgICAgIHNhdmVkX2Vycm5vID0gX2RidXNfc2F2ZV9zb2NrZXRfZXJybm8gKCk7CisgICAgICAgIH0KKworICAgICAgX2RidXNfbWVzc2FnZV9sb2FkZXJfcmV0dXJuX2J1ZmZlciAodHJhbnNwb3J0LT5sb2FkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIpOworICAgIH0KKworICBpZiAoYnl0ZXNfcmVhZCA8IDApCisgICAgeworICAgICAgLyogRUlOVFIgYWxyZWFkeSBoYW5kbGVkIGZvciB1cyAqLworCisgICAgICBpZiAoX2RidXNfZ2V0X2lzX2Vycm5vX2Vub21lbSAoc2F2ZWRfZXJybm8pKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIk91dCBvZiBtZW1vcnkgaW4gcmVhZCgpL2RvX3JlYWRpbmcoKVxuIik7CisgICAgICAgICAgb29tID0gVFJVRTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoX2RidXNfZ2V0X2lzX2Vycm5vX2VhZ2Fpbl9vcl9ld291bGRibG9jayAoc2F2ZWRfZXJybm8pKQorICAgICAgICBnb3RvIG91dDsKKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJFcnJvciByZWFkaW5nIGZyb20gcmVtb3RlIGFwcDogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKHNhdmVkX2Vycm5vKSk7CisgICAgICAgICAgZG9faW9fZXJyb3IgKHRyYW5zcG9ydCk7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UgaWYgKGJ5dGVzX3JlYWQgPT0gMCkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiRGlzY29ubmVjdGVkIGZyb20gcmVtb3RlIGFwcFxuIik7CisgICAgICBkb19pb19lcnJvciAodHJhbnNwb3J0KTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgcmVhZCAlZCBieXRlc1xuIiwgYnl0ZXNfcmVhZCk7CisgICAgICAKKyAgICAgIHRvdGFsICs9IGJ5dGVzX3JlYWQ7ICAgICAgCisKKyAgICAgIGlmICghX2RidXNfdHJhbnNwb3J0X3F1ZXVlX21lc3NhZ2VzICh0cmFuc3BvcnQpKQorICAgICAgICB7CisgICAgICAgICAgb29tID0gVFJVRTsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiIG91dCBvZiBtZW1vcnkgd2hlbiBxdWV1ZWluZyBtZXNzYWdlcyB3ZSBqdXN0IHJlYWQgaW4gdGhlIHRyYW5zcG9ydFxuIik7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgLyogVHJ5IHJlYWRpbmcgbW9yZSBkYXRhIHVudGlsIHdlIGdldCBFQUdBSU4gYW5kIHJldHVybiwgb3IKKyAgICAgICAqIGV4Y2VlZCBtYXggYnl0ZXMgcGVyIGl0ZXJhdGlvbi4gIElmIGluIGJsb2NraW5nIG1vZGUgb2YKKyAgICAgICAqIGNvdXJzZSB3ZSdsbCBibG9jayBpbnN0ZWFkIG9mIHJldHVybmluZy4KKyAgICAgICAqLworICAgICAgZ290byBhZ2FpbjsKKyAgICB9CisKKyBvdXQ6CisgIGlmIChvb20pCisgICAgcmV0dXJuIEZBTFNFOworICBlbHNlCisgICAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAordW5peF9lcnJvcl93aXRoX3JlYWRfdG9fY29tZSAoREJ1c1RyYW5zcG9ydCAqaXRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNXYXRjaCAgICAgKndhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICAgZmxhZ3MpCit7CisgIERCdXNUcmFuc3BvcnRTb2NrZXQgKnRyYW5zcG9ydCA9IChEQnVzVHJhbnNwb3J0U29ja2V0ICopIGl0cmFuc3BvcnQ7CisKKyAgaWYgKCEoZmxhZ3MgJiBEQlVTX1dBVENIX0hBTkdVUCB8fCBmbGFncyAmIERCVVNfV0FUQ0hfRVJST1IpKQorICAgIHJldHVybiBGQUxTRTsKKyAgIAorICAvKiBJZiB3ZSBoYXZlIGEgcmVhZCB3YXRjaCBlbmFibGVkIC4uLgorICAgICB3ZSAtbWlnaHQgaGF2ZSBkYXRhIGluY29taW5nIC4uLiA9PiBoYW5kbGUgdGhlIEhBTkdVUCB0aGVyZSAqLworICBpZiAod2F0Y2ggIT0gdHJhbnNwb3J0LT5yZWFkX3dhdGNoICYmCisgICAgICBfZGJ1c193YXRjaF9nZXRfZW5hYmxlZCAodHJhbnNwb3J0LT5yZWFkX3dhdGNoKSkKKyAgICByZXR1cm4gRkFMU0U7CisgICAgICAKKyAgcmV0dXJuIFRSVUU7IAorfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3NvY2tldF9oYW5kbGVfd2F0Y2ggKERCdXNUcmFuc3BvcnQgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICBEQnVzV2F0Y2ggICAgICp3YXRjaCwKKyAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgICBmbGFncykKK3sKKyAgREJ1c1RyYW5zcG9ydFNvY2tldCAqc29ja2V0X3RyYW5zcG9ydCA9IChEQnVzVHJhbnNwb3J0U29ja2V0KikgdHJhbnNwb3J0OworCisgIF9kYnVzX2Fzc2VydCAod2F0Y2ggPT0gc29ja2V0X3RyYW5zcG9ydC0+cmVhZF93YXRjaCB8fAorICAgICAgICAgICAgICAgIHdhdGNoID09IHNvY2tldF90cmFuc3BvcnQtPndyaXRlX3dhdGNoKTsKKyAgX2RidXNfYXNzZXJ0ICh3YXRjaCAhPSBOVUxMKTsKKyAgCisgIC8qIElmIHdlIGhpdCBhbiBlcnJvciBoZXJlIG9uIGEgd3JpdGUgd2F0Y2gsIGRvbid0IGRpc2Nvbm5lY3QgdGhlIHRyYW5zcG9ydCB5ZXQgYmVjYXVzZSBkYXRhIGNhbgorICAgKiBzdGlsbCBiZSBpbiB0aGUgYnVmZmVyIGFuZCBkb19yZWFkaW5nIG1heSBuZWVkIHNldmVyYWwgaXRlcmF0aW9uIHRvIHJlYWQKKyAgICogaXQgYWxsIChiZWNhdXNlIG9mIGl0cyBtYXhfYnl0ZXNfcmVhZF9wZXJfaXRlcmF0aW9uIGxpbWl0KS4gCisgICAqLworICBpZiAoIShmbGFncyAmIERCVVNfV0FUQ0hfUkVBREFCTEUpICYmIHVuaXhfZXJyb3Jfd2l0aF9yZWFkX3RvX2NvbWUgKHRyYW5zcG9ydCwgd2F0Y2gsIGZsYWdzKSkKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiSGFuZyB1cCBvciBlcnJvciBvbiB3YXRjaFxuIik7CisgICAgICBfZGJ1c190cmFuc3BvcnRfZGlzY29ubmVjdCAodHJhbnNwb3J0KTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgCisgIGlmICh3YXRjaCA9PSBzb2NrZXRfdHJhbnNwb3J0LT5yZWFkX3dhdGNoICYmCisgICAgICAoZmxhZ3MgJiBEQlVTX1dBVENIX1JFQURBQkxFKSkKKyAgICB7CisgICAgICBkYnVzX2Jvb2xfdCBhdXRoX2ZpbmlzaGVkOworI2lmIDEKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJoYW5kbGluZyByZWFkIHdhdGNoICVwIGZsYWdzID0gJXhcbiIsCisgICAgICAgICAgICAgICAgICAgICB3YXRjaCwgZmxhZ3MpOworI2VuZGlmCisgICAgICBpZiAoIWRvX2F1dGhlbnRpY2F0aW9uICh0cmFuc3BvcnQsIFRSVUUsIEZBTFNFLCAmYXV0aF9maW5pc2hlZCkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgLyogV2UgZG9uJ3Qgd2FudCB0byBkbyBhIHJlYWQgaW1tZWRpYXRlbHkgZm9sbG93aW5nCisgICAgICAgKiBhIHN1Y2Nlc3NmdWwgYXV0aGVudGljYXRpb24uICBUaGlzIGlzIHNvIHdlCisgICAgICAgKiBoYXZlIGEgY2hhbmNlIHRvIHByb3BhZ2F0ZSB0aGUgYXV0aGVudGljYXRpb24KKyAgICAgICAqIHN0YXRlIGZ1cnRoZXIgdXAuICBTcGVjaWZpY2FsbHksIHdlIG5lZWQgdG8KKyAgICAgICAqIHByb2Nlc3MgYW55IHBlbmRpbmcgZGF0YSBmcm9tIHRoZSBhdXRoIG9iamVjdC4KKyAgICAgICAqLworICAgICAgaWYgKCFhdXRoX2ZpbmlzaGVkKQorCXsKKwkgIGlmICghZG9fcmVhZGluZyAodHJhbnNwb3J0KSkKKwkgICAgeworCSAgICAgIF9kYnVzX3ZlcmJvc2UgKCJubyBtZW1vcnkgdG8gcmVhZFxuIik7CisJICAgICAgcmV0dXJuIEZBTFNFOworCSAgICB9CisJfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIk5vdCByZWFkaW5nIGFueXRoaW5nIHNpbmNlIHdlIGp1c3QgY29tcGxldGVkIHRoZSBhdXRoZW50aWNhdGlvblxuIik7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UgaWYgKHdhdGNoID09IHNvY2tldF90cmFuc3BvcnQtPndyaXRlX3dhdGNoICYmCisgICAgICAgICAgIChmbGFncyAmIERCVVNfV0FUQ0hfV1JJVEFCTEUpKQorICAgIHsKKyNpZiAxCisgICAgICBfZGJ1c192ZXJib3NlICgiaGFuZGxpbmcgd3JpdGUgd2F0Y2gsIGhhdmVfb3V0Z29pbmdfbWVzc2FnZXMgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25faGFzX21lc3NhZ2VzX3RvX3NlbmRfdW5sb2NrZWQgKHRyYW5zcG9ydC0+Y29ubmVjdGlvbikpOworI2VuZGlmCisgICAgICBpZiAoIWRvX2F1dGhlbnRpY2F0aW9uICh0cmFuc3BvcnQsIEZBTFNFLCBUUlVFLCBOVUxMKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgCisgICAgICBpZiAoIWRvX3dyaXRpbmcgKHRyYW5zcG9ydCkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgibm8gbWVtb3J5IHRvIHdyaXRlXG4iKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgLyogU2VlIGlmIHdlIHN0aWxsIG5lZWQgdGhlIHdyaXRlIHdhdGNoICovCisgICAgICBjaGVja193cml0ZV93YXRjaCAodHJhbnNwb3J0KTsKKyAgICB9CisjaWZkZWYgREJVU19FTkFCTEVfVkVSQk9TRV9NT0RFCisgIGVsc2UKKyAgICB7CisgICAgICBpZiAod2F0Y2ggPT0gc29ja2V0X3RyYW5zcG9ydC0+cmVhZF93YXRjaCkKKyAgICAgICAgX2RidXNfdmVyYm9zZSAoImFza2VkIHRvIGhhbmRsZSByZWFkIHdhdGNoIHdpdGggbm9uLXJlYWQgY29uZGl0aW9uIDB4JXhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICAgIGVsc2UgaWYgKHdhdGNoID09IHNvY2tldF90cmFuc3BvcnQtPndyaXRlX3dhdGNoKQorICAgICAgICBfZGJ1c192ZXJib3NlICgiYXNrZWQgdG8gaGFuZGxlIHdyaXRlIHdhdGNoIHdpdGggbm9uLXdyaXRlIGNvbmRpdGlvbiAweCV4XG4iLAorICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CisgICAgICBlbHNlCisgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJhc2tlZCB0byBoYW5kbGUgd2F0Y2ggJXAgb24gZmQgJSIgREJVU19TT0NLRVRfRk9STUFUICIgdGhhdCB3ZSBkb24ndCByZWNvZ25pemVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIHdhdGNoLCBfZGJ1c19zb2NrZXRfcHJpbnRhYmxlIChfZGJ1c193YXRjaF9nZXRfc29ja2V0ICh3YXRjaCkpKTsKKyAgICB9CisjZW5kaWYgLyogREJVU19FTkFCTEVfVkVSQk9TRV9NT0RFICovCisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitzb2NrZXRfZGlzY29ubmVjdCAoREJ1c1RyYW5zcG9ydCAqdHJhbnNwb3J0KQoreworICBEQnVzVHJhbnNwb3J0U29ja2V0ICpzb2NrZXRfdHJhbnNwb3J0ID0gKERCdXNUcmFuc3BvcnRTb2NrZXQqKSB0cmFuc3BvcnQ7CisKKyAgX2RidXNfdmVyYm9zZSAoIlxuIik7CisgIAorICBmcmVlX3dhdGNoZXMgKHRyYW5zcG9ydCk7CisgIAorICBfZGJ1c19jbG9zZV9zb2NrZXQgKHNvY2tldF90cmFuc3BvcnQtPmZkLCBOVUxMKTsKKyAgX2RidXNfc29ja2V0X2ludmFsaWRhdGUgKCZzb2NrZXRfdHJhbnNwb3J0LT5mZCk7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorc29ja2V0X2Nvbm5lY3Rpb25fc2V0IChEQnVzVHJhbnNwb3J0ICp0cmFuc3BvcnQpCit7CisgIERCdXNUcmFuc3BvcnRTb2NrZXQgKnNvY2tldF90cmFuc3BvcnQgPSAoREJ1c1RyYW5zcG9ydFNvY2tldCopIHRyYW5zcG9ydDsKKworICBfZGJ1c193YXRjaF9zZXRfaGFuZGxlciAoc29ja2V0X3RyYW5zcG9ydC0+d3JpdGVfd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19jb25uZWN0aW9uX2hhbmRsZV93YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydC0+Y29ubmVjdGlvbiwgTlVMTCk7CisKKyAgX2RidXNfd2F0Y2hfc2V0X2hhbmRsZXIgKHNvY2tldF90cmFuc3BvcnQtPnJlYWRfd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19jb25uZWN0aW9uX2hhbmRsZV93YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydC0+Y29ubmVjdGlvbiwgTlVMTCk7CisgIAorICBpZiAoIV9kYnVzX2Nvbm5lY3Rpb25fYWRkX3dhdGNoX3VubG9ja2VkICh0cmFuc3BvcnQtPmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldF90cmFuc3BvcnQtPndyaXRlX3dhdGNoKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFfZGJ1c19jb25uZWN0aW9uX2FkZF93YXRjaF91bmxvY2tlZCAodHJhbnNwb3J0LT5jb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXRfdHJhbnNwb3J0LT5yZWFkX3dhdGNoKSkKKyAgICB7CisgICAgICBfZGJ1c19jb25uZWN0aW9uX3JlbW92ZV93YXRjaF91bmxvY2tlZCAodHJhbnNwb3J0LT5jb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldF90cmFuc3BvcnQtPndyaXRlX3dhdGNoKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgY2hlY2tfcmVhZF93YXRjaCAodHJhbnNwb3J0KTsKKyAgY2hlY2tfd3JpdGVfd2F0Y2ggKHRyYW5zcG9ydCk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogQHRvZG8gV2UgbmVlZCB0byBoYXZlIGEgd2F5IHRvIHdha2UgdXAgdGhlIHNlbGVjdCBzbGVlcCBpZgorICogYSBuZXcgaXRlcmF0aW9uIHJlcXVlc3QgY29tZXMgaW4gd2l0aCBhIGZsYWcgKHJlYWQvd3JpdGUpIHRoYXQKKyAqIHdlJ3JlIG5vdCBjdXJyZW50bHkgc2VydmluZy4gT3RoZXJ3aXNlIGEgY2FsbCB0aGF0IGp1c3QgcmVhZHMKKyAqIGNvdWxkIGJsb2NrIGEgd3JpdGUgY2FsbCBmb3JldmVyIChpZiB0aGVyZSBhcmUgbm8gaW5jb21pbmcKKyAqIG1lc3NhZ2VzKS4KKyAqLworc3RhdGljICB2b2lkCitzb2NrZXRfZG9faXRlcmF0aW9uIChEQnVzVHJhbnNwb3J0ICp0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgdGltZW91dF9taWxsaXNlY29uZHMpCit7CisgIERCdXNUcmFuc3BvcnRTb2NrZXQgKnNvY2tldF90cmFuc3BvcnQgPSAoREJ1c1RyYW5zcG9ydFNvY2tldCopIHRyYW5zcG9ydDsKKyAgREJ1c1BvbGxGRCBwb2xsX2ZkOworICBpbnQgcG9sbF9yZXM7CisgIGludCBwb2xsX3RpbWVvdXQ7CisKKyAgX2RidXNfdmVyYm9zZSAoIiBpdGVyYXRpb24gZmxhZ3MgPSAlcyVzIHRpbWVvdXQgPSAlZCByZWFkX3dhdGNoID0gJXAgd3JpdGVfd2F0Y2ggPSAlcCBmZCA9ICUiIERCVVNfU09DS0VUX0ZPUk1BVCAiXG4iLAorICAgICAgICAgICAgICAgICBmbGFncyAmIERCVVNfSVRFUkFUSU9OX0RPX1JFQURJTkcgPyAicmVhZCIgOiAiIiwKKyAgICAgICAgICAgICAgICAgZmxhZ3MgJiBEQlVTX0lURVJBVElPTl9ET19XUklUSU5HID8gIndyaXRlIiA6ICIiLAorICAgICAgICAgICAgICAgICB0aW1lb3V0X21pbGxpc2Vjb25kcywKKyAgICAgICAgICAgICAgICAgc29ja2V0X3RyYW5zcG9ydC0+cmVhZF93YXRjaCwKKyAgICAgICAgICAgICAgICAgc29ja2V0X3RyYW5zcG9ydC0+d3JpdGVfd2F0Y2gsCisgICAgICAgICAgICAgICAgIF9kYnVzX3NvY2tldF9wcmludGFibGUgKHNvY2tldF90cmFuc3BvcnQtPmZkKSk7CisgIAorICAvKiB0aGUgcGFzc2VkIGluIERPX1JFQURJTkcvRE9fV1JJVElORyBmbGFncyBpbmRpY2F0ZSB3aGV0aGVyIHRvCisgICAqIHJlYWQvd3JpdGUgbWVzc2FnZXMsIGJ1dCByZWdhcmRsZXNzIG9mIHRob3NlIHdlIG1heSBuZWVkIHRvIGJsb2NrCisgICAqIGZvciByZWFkaW5nL3dyaXRpbmcgdG8gZG8gYXV0aC4gIEJ1dCBpZiB3ZSBkbyByZWFkaW5nIGZvciBhdXRoLAorICAgKiB3ZSBkb24ndCB3YW50IHRvIHJlYWQgYW55IG1lc3NhZ2VzIHlldCBpZiBub3QgZ2l2ZW4gRE9fUkVBRElORy4KKyAgICovCisKKyAgcG9sbF9mZC5mZCA9IF9kYnVzX3NvY2tldF9nZXRfcG9sbGFibGUgKHNvY2tldF90cmFuc3BvcnQtPmZkKTsKKyAgcG9sbF9mZC5ldmVudHMgPSAwOworICAKKyAgaWYgKF9kYnVzX3RyYW5zcG9ydF90cnlfdG9fYXV0aGVudGljYXRlICh0cmFuc3BvcnQpKQorICAgIHsKKyAgICAgIC8qIFRoaXMgaXMga2luZCBvZiBhIGhhY2s7IGlmIHdlIGhhdmUgc3R1ZmYgdG8gd3JpdGUsIHRoZW4gdHJ5CisgICAgICAgKiB0byBhdm9pZCB0aGUgcG9sbC4gVGhpcyBpcyBwcm9iYWJseSBhYm91dCBhIDUlIHNwZWVkdXAgb24gYW4KKyAgICAgICAqIGVjaG8gY2xpZW50L3NlcnZlci4KKyAgICAgICAqCisgICAgICAgKiBJZiBib3RoIHJlYWRpbmcgYW5kIHdyaXRpbmcgd2VyZSByZXF1ZXN0ZWQsIHdlIHdhbnQgdG8gYXZvaWQgdGhpcworICAgICAgICogc2luY2UgaXQgY291bGQgaGF2ZSBmdW5reSBlZmZlY3RzOgorICAgICAgICogICAtIGJvdGggZW5kcyBzcGlubmluZyB3YWl0aW5nIGZvciB0aGUgb3RoZXIgb25lIHRvIHJlYWQKKyAgICAgICAqICAgICBkYXRhIHNvIHRoZXkgY2FuIGZpbmlzaCB3cml0aW5nCisgICAgICAgKiAgIC0gcHJpb3JpdGl6aW5nIGFsbCB3cml0aW5nIGFoZWFkIG9mIHJlYWRpbmcKKyAgICAgICAqLworICAgICAgaWYgKChmbGFncyAmIERCVVNfSVRFUkFUSU9OX0RPX1dSSVRJTkcpICYmCisgICAgICAgICAgIShmbGFncyAmIChEQlVTX0lURVJBVElPTl9ET19SRUFESU5HIHwgREJVU19JVEVSQVRJT05fQkxPQ0spKSAmJgorICAgICAgICAgICF0cmFuc3BvcnQtPmRpc2Nvbm5lY3RlZCAmJgorICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25faGFzX21lc3NhZ2VzX3RvX3NlbmRfdW5sb2NrZWQgKHRyYW5zcG9ydC0+Y29ubmVjdGlvbikpCisgICAgICAgIHsKKyAgICAgICAgICBkb193cml0aW5nICh0cmFuc3BvcnQpOworCisgICAgICAgICAgaWYgKHRyYW5zcG9ydC0+ZGlzY29ubmVjdGVkIHx8CisgICAgICAgICAgICAgICFfZGJ1c19jb25uZWN0aW9uX2hhc19tZXNzYWdlc190b19zZW5kX3VubG9ja2VkICh0cmFuc3BvcnQtPmNvbm5lY3Rpb24pKQorICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgICAgLyogSWYgd2UgZ2V0IGhlcmUsIHdlIGRlY2lkZWQgdG8gZG8gdGhlIHBvbGwoKSBhZnRlciBhbGwgKi8KKyAgICAgIF9kYnVzX2Fzc2VydCAoc29ja2V0X3RyYW5zcG9ydC0+cmVhZF93YXRjaCk7CisgICAgICBpZiAoZmxhZ3MgJiBEQlVTX0lURVJBVElPTl9ET19SRUFESU5HKQorCXBvbGxfZmQuZXZlbnRzIHw9IF9EQlVTX1BPTExJTjsKKworICAgICAgX2RidXNfYXNzZXJ0IChzb2NrZXRfdHJhbnNwb3J0LT53cml0ZV93YXRjaCk7CisgICAgICBpZiAoZmxhZ3MgJiBEQlVTX0lURVJBVElPTl9ET19XUklUSU5HKQorICAgICAgICBwb2xsX2ZkLmV2ZW50cyB8PSBfREJVU19QT0xMT1VUOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIERCdXNBdXRoU3RhdGUgYXV0aF9zdGF0ZTsKKyAgICAgIAorICAgICAgYXV0aF9zdGF0ZSA9IF9kYnVzX2F1dGhfZG9fd29yayAodHJhbnNwb3J0LT5hdXRoKTsKKworICAgICAgaWYgKHRyYW5zcG9ydC0+cmVjZWl2ZV9jcmVkZW50aWFsc19wZW5kaW5nIHx8CisgICAgICAgICAgYXV0aF9zdGF0ZSA9PSBEQlVTX0FVVEhfU1RBVEVfV0FJVElOR19GT1JfSU5QVVQpCisJcG9sbF9mZC5ldmVudHMgfD0gX0RCVVNfUE9MTElOOworCisgICAgICBpZiAodHJhbnNwb3J0LT5zZW5kX2NyZWRlbnRpYWxzX3BlbmRpbmcgfHwKKyAgICAgICAgICBhdXRoX3N0YXRlID09IERCVVNfQVVUSF9TVEFURV9IQVZFX0JZVEVTX1RPX1NFTkQpCisJcG9sbF9mZC5ldmVudHMgfD0gX0RCVVNfUE9MTE9VVDsKKyAgICB9CisKKyAgaWYgKHBvbGxfZmQuZXZlbnRzKQorICAgIHsKKyAgICAgIGludCBzYXZlZF9lcnJubzsKKworICAgICAgaWYgKGZsYWdzICYgREJVU19JVEVSQVRJT05fQkxPQ0spCisJcG9sbF90aW1lb3V0ID0gdGltZW91dF9taWxsaXNlY29uZHM7CisgICAgICBlbHNlCisJcG9sbF90aW1lb3V0ID0gMDsKKworICAgICAgLyogRm9yIGJsb2NraW5nIHNlbGVjdHMgd2UgZHJvcCB0aGUgY29ubmVjdGlvbiBsb2NrIGhlcmUKKyAgICAgICAqIHRvIGF2b2lkIGJsb2NraW5nIG91dCBjb25uZWN0aW9uIGFjY2VzcyBkdXJpbmcgYSBwb3RlbnRpYWxseQorICAgICAgICogaW5kZWZpbml0ZSBibG9ja2luZyBjYWxsLiBUaGUgaW8gcGF0aCBpcyBzdGlsbCBwcm90ZWN0ZWQKKyAgICAgICAqIGJ5IHRoZSBpb19wYXRoX2NvbmQgY29uZHZhciwgc28gd2Ugd29uJ3QgcmVlbnRlciB0aGlzLgorICAgICAgICovCisgICAgICBpZiAoZmxhZ3MgJiBEQlVTX0lURVJBVElPTl9CTE9DSykKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJ1bmxvY2sgcHJlIHBvbGxcbiIpOworICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fdW5sb2NrICh0cmFuc3BvcnQtPmNvbm5lY3Rpb24pOworICAgICAgICB9CisgICAgICAKKyAgICBhZ2FpbjoKKyAgICAgIHBvbGxfcmVzID0gX2RidXNfcG9sbCAoJnBvbGxfZmQsIDEsIHBvbGxfdGltZW91dCk7CisgICAgICBzYXZlZF9lcnJubyA9IF9kYnVzX3NhdmVfc29ja2V0X2Vycm5vICgpOworCisgICAgICBpZiAocG9sbF9yZXMgPCAwICYmIF9kYnVzX2dldF9pc19lcnJub19laW50ciAoc2F2ZWRfZXJybm8pKQorCWdvdG8gYWdhaW47CisKKyAgICAgIGlmIChmbGFncyAmIERCVVNfSVRFUkFUSU9OX0JMT0NLKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoImxvY2sgcG9zdCBwb2xsXG4iKTsKKyAgICAgICAgICBfZGJ1c19jb25uZWN0aW9uX2xvY2sgKHRyYW5zcG9ydC0+Y29ubmVjdGlvbik7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgaWYgKHBvbGxfcmVzID49IDApCisgICAgICAgIHsKKyAgICAgICAgICBpZiAocG9sbF9yZXMgPT0gMCkKKyAgICAgICAgICAgIHBvbGxfZmQucmV2ZW50cyA9IDA7IC8qIHNvbWUgY29uY2VybiB0aGF0IHBvc2l4IGRvZXMgbm90IGd1YXJhbnRlZSB0aGlzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogdmFsZ3JpbmQgZmxhZ3MgaXQgYXMgYW4gZXJyb3IuIHRob3VnaCBpdCBwcm9iYWJseQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogaXMgZ3VhcmFudGVlZCBvbiBsaW51eCBhdCBsZWFzdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgIAorICAgICAgICAgIGlmIChwb2xsX2ZkLnJldmVudHMgJiBfREJVU19QT0xMRVJSKQorICAgICAgICAgICAgZG9faW9fZXJyb3IgKHRyYW5zcG9ydCk7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCBuZWVkX3JlYWQgPSAocG9sbF9mZC5yZXZlbnRzICYgX0RCVVNfUE9MTElOKSA+IDA7CisgICAgICAgICAgICAgIGRidXNfYm9vbF90IG5lZWRfd3JpdGUgPSAocG9sbF9mZC5yZXZlbnRzICYgX0RCVVNfUE9MTE9VVCkgPiAwOworCSAgICAgIGRidXNfYm9vbF90IGF1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZDsKKworICAgICAgICAgICAgICBfZGJ1c192ZXJib3NlICgiaW4gaXRlcmF0aW9uLCBuZWVkX3JlYWQ9JWQgbmVlZF93cml0ZT0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZF9yZWFkLCBuZWVkX3dyaXRlKTsKKyAgICAgICAgICAgICAgZG9fYXV0aGVudGljYXRpb24gKHRyYW5zcG9ydCwgbmVlZF9yZWFkLCBuZWVkX3dyaXRlLAorCQkJCSAmYXV0aGVudGljYXRpb25fY29tcGxldGVkKTsKKworCSAgICAgIC8qIFNlZSBjb21tZW50IGluIHNvY2tldF9oYW5kbGVfd2F0Y2guICovCisJICAgICAgaWYgKGF1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZCkKKyAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBpZiAobmVlZF9yZWFkICYmIChmbGFncyAmIERCVVNfSVRFUkFUSU9OX0RPX1JFQURJTkcpKQorICAgICAgICAgICAgICAgIGRvX3JlYWRpbmcgKHRyYW5zcG9ydCk7CisgICAgICAgICAgICAgIGlmIChuZWVkX3dyaXRlICYmIChmbGFncyAmIERCVVNfSVRFUkFUSU9OX0RPX1dSSVRJTkcpKQorICAgICAgICAgICAgICAgIGRvX3dyaXRpbmcgKHRyYW5zcG9ydCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJFcnJvciBmcm9tIF9kYnVzX3BvbGwoKTogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyZXJyb3IgKHNhdmVkX2Vycm5vKSk7CisgICAgICAgIH0KKyAgICB9CisKKworIG91dDoKKyAgLyogV2UgbmVlZCB0byBpbnN0YWxsIHRoZSB3cml0ZSB3YXRjaCBvbmx5IGlmIHdlIGRpZCBub3QKKyAgICogc3VjY2Vzc2Z1bGx5IHdyaXRlIGV2ZXJ5dGhpbmcuIE5vdGUgd2UgbmVlZCB0byBiZSBjYXJlZnVsIHRoYXQgd2UKKyAgICogZG9uJ3QgY2FsbCBjaGVja193cml0ZV93YXRjaCAqYmVmb3JlKiBkb193cml0aW5nLCBzaW5jZSBpdCdzCisgICAqIGluZWZmaWNpZW50IHRvIGFkZCB0aGUgd3JpdGUgd2F0Y2gsIGFuZCB3ZSBjYW4gYXZvaWQgaXQgbW9zdCBvZgorICAgKiB0aGUgdGltZSBzaW5jZSB3ZSBjYW4gd3JpdGUgaW1tZWRpYXRlbHkuCisgICAqIAorICAgKiBIb3dldmVyLCB3ZSBNVVNUIGFsd2F5cyBjYWxsIGNoZWNrX3dyaXRlX3dhdGNoKCk7IERCdXNDb25uZWN0aW9uIGNvZGUKKyAgICogcmVsaWVzIG9uIHRoZSBmYWN0IHRoYXQgcnVubmluZyBhbiBpdGVyYXRpb24gd2lsbCBub3RpY2UgdGhhdAorICAgKiBtZXNzYWdlcyBhcmUgcGVuZGluZy4KKyAgICovCisgIGNoZWNrX3dyaXRlX3dhdGNoICh0cmFuc3BvcnQpOworCisgIF9kYnVzX3ZlcmJvc2UgKCIgLi4uIGxlYXZpbmcgZG9faXRlcmF0aW9uKClcbiIpOworfQorCitzdGF0aWMgdm9pZAorc29ja2V0X2xpdmVfbWVzc2FnZXNfY2hhbmdlZCAoREJ1c1RyYW5zcG9ydCAqdHJhbnNwb3J0KQoreworICAvKiBTZWUgaWYgd2Ugc2hvdWxkIGxvb2sgZm9yIGluY29taW5nIG1lc3NhZ2VzIGFnYWluICovCisgIGNoZWNrX3JlYWRfd2F0Y2ggKHRyYW5zcG9ydCk7Cit9CisKKworc3RhdGljIGRidXNfYm9vbF90Citzb2NrZXRfZ2V0X3NvY2tldF9mZCAoREJ1c1RyYW5zcG9ydCAqdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgIERCdXNTb2NrZXQgICAgKmZkX3ApCit7CisgIERCdXNUcmFuc3BvcnRTb2NrZXQgKnNvY2tldF90cmFuc3BvcnQgPSAoREJ1c1RyYW5zcG9ydFNvY2tldCopIHRyYW5zcG9ydDsKKyAgCisgICpmZF9wID0gc29ja2V0X3RyYW5zcG9ydC0+ZmQ7CisgIAorICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGNvbnN0IERCdXNUcmFuc3BvcnRWVGFibGUgc29ja2V0X3Z0YWJsZSA9IHsKKyAgc29ja2V0X2ZpbmFsaXplLAorICBzb2NrZXRfaGFuZGxlX3dhdGNoLAorICBzb2NrZXRfZGlzY29ubmVjdCwKKyAgc29ja2V0X2Nvbm5lY3Rpb25fc2V0LAorICBzb2NrZXRfZG9faXRlcmF0aW9uLAorICBzb2NrZXRfbGl2ZV9tZXNzYWdlc19jaGFuZ2VkLAorICBzb2NrZXRfZ2V0X3NvY2tldF9mZAorfTsKKworLyoqCisgKiBDcmVhdGVzIGEgbmV3IHRyYW5zcG9ydCBmb3IgdGhlIGdpdmVuIHNvY2tldCBmaWxlIGRlc2NyaXB0b3IuICBUaGUgZmlsZQorICogZGVzY3JpcHRvciBtdXN0IGJlIG5vbmJsb2NraW5nICh1c2UgX2RidXNfc2V0X2ZkX25vbmJsb2NraW5nKCkgdG8KKyAqIG1ha2UgaXQgc28pLiBUaGlzIGZ1bmN0aW9uIGlzIHNoYXJlZCBieSB2YXJpb3VzIHRyYW5zcG9ydHMgdGhhdAorICogYm9pbCBkb3duIHRvIGEgZnVsbCBkdXBsZXggZmlsZSBkZXNjcmlwdG9yLgorICoKKyAqIEBwYXJhbSBmZCB0aGUgZmlsZSBkZXNjcmlwdG9yLgorICogQHBhcmFtIHNlcnZlcl9ndWlkIG5vbi0jTlVMTCBpZiB0aGlzIHRyYW5zcG9ydCBpcyBvbiB0aGUgc2VydmVyIHNpZGUgb2YgYSBjb25uZWN0aW9uCisgKiBAcGFyYW0gYWRkcmVzcyB0aGUgdHJhbnNwb3J0J3MgYWRkcmVzcworICogQHJldHVybnMgdGhlIG5ldyB0cmFuc3BvcnQsIG9yICNOVUxMIGlmIG5vIG1lbW9yeS4KKyAqLworREJ1c1RyYW5zcG9ydCoKK19kYnVzX3RyYW5zcG9ydF9uZXdfZm9yX3NvY2tldCAoREJ1c1NvY2tldCAgICAgICAgZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKnNlcnZlcl9ndWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICphZGRyZXNzKQoreworICBEQnVzVHJhbnNwb3J0U29ja2V0ICpzb2NrZXRfdHJhbnNwb3J0OworICAKKyAgc29ja2V0X3RyYW5zcG9ydCA9IGRidXNfbmV3MCAoREJ1c1RyYW5zcG9ydFNvY2tldCwgMSk7CisgIGlmIChzb2NrZXRfdHJhbnNwb3J0ID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnNvY2tldF90cmFuc3BvcnQtPmVuY29kZWRfb3V0Z29pbmcpKQorICAgIGdvdG8gZmFpbGVkXzA7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnNvY2tldF90cmFuc3BvcnQtPmVuY29kZWRfaW5jb21pbmcpKQorICAgIGdvdG8gZmFpbGVkXzE7CisgIAorICBzb2NrZXRfdHJhbnNwb3J0LT53cml0ZV93YXRjaCA9IF9kYnVzX3dhdGNoX25ldyAoX2RidXNfc29ja2V0X2dldF9wb2xsYWJsZSAoZmQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfV0FUQ0hfV1JJVEFCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCk7CisgIGlmIChzb2NrZXRfdHJhbnNwb3J0LT53cml0ZV93YXRjaCA9PSBOVUxMKQorICAgIGdvdG8gZmFpbGVkXzI7CisgIAorICBzb2NrZXRfdHJhbnNwb3J0LT5yZWFkX3dhdGNoID0gX2RidXNfd2F0Y2hfbmV3IChfZGJ1c19zb2NrZXRfZ2V0X3BvbGxhYmxlIChmZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1dBVENIX1JFQURBQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgaWYgKHNvY2tldF90cmFuc3BvcnQtPnJlYWRfd2F0Y2ggPT0gTlVMTCkKKyAgICBnb3RvIGZhaWxlZF8zOworCisgIGlmICghX2RidXNfdHJhbnNwb3J0X2luaXRfYmFzZSAoJnNvY2tldF90cmFuc3BvcnQtPmJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNvY2tldF92dGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyX2d1aWQsIGFkZHJlc3MpKQorICAgIGdvdG8gZmFpbGVkXzQ7CisKKyNpZmRlZiBIQVZFX1VOSVhfRkRfUEFTU0lORworICBfZGJ1c19hdXRoX3NldF91bml4X2ZkX3Bvc3NpYmxlKHNvY2tldF90cmFuc3BvcnQtPmJhc2UuYXV0aCwgX2RidXNfc29ja2V0X2Nhbl9wYXNzX3VuaXhfZmQoZmQpKTsKKyNlbmRpZgorCisgIHNvY2tldF90cmFuc3BvcnQtPmZkID0gZmQ7CisgIHNvY2tldF90cmFuc3BvcnQtPm1lc3NhZ2VfYnl0ZXNfd3JpdHRlbiA9IDA7CisgIAorICAvKiBUaGVzZSB2YWx1ZXMgc2hvdWxkIHByb2JhYmx5IGJlIHR1bmFibGUgb3Igc29tZXRoaW5nLiAqLyAgICAgCisgIHNvY2tldF90cmFuc3BvcnQtPm1heF9ieXRlc19yZWFkX3Blcl9pdGVyYXRpb24gPSAyMDQ4OworICBzb2NrZXRfdHJhbnNwb3J0LT5tYXhfYnl0ZXNfd3JpdHRlbl9wZXJfaXRlcmF0aW9uID0gMjA0ODsKKyAgCisgIHJldHVybiAoREJ1c1RyYW5zcG9ydCopIHNvY2tldF90cmFuc3BvcnQ7CisKKyBmYWlsZWRfNDoKKyAgX2RidXNfd2F0Y2hfaW52YWxpZGF0ZSAoc29ja2V0X3RyYW5zcG9ydC0+cmVhZF93YXRjaCk7CisgIF9kYnVzX3dhdGNoX3VucmVmIChzb2NrZXRfdHJhbnNwb3J0LT5yZWFkX3dhdGNoKTsKKyBmYWlsZWRfMzoKKyAgX2RidXNfd2F0Y2hfaW52YWxpZGF0ZSAoc29ja2V0X3RyYW5zcG9ydC0+d3JpdGVfd2F0Y2gpOworICBfZGJ1c193YXRjaF91bnJlZiAoc29ja2V0X3RyYW5zcG9ydC0+d3JpdGVfd2F0Y2gpOworIGZhaWxlZF8yOgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJnNvY2tldF90cmFuc3BvcnQtPmVuY29kZWRfaW5jb21pbmcpOworIGZhaWxlZF8xOgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJnNvY2tldF90cmFuc3BvcnQtPmVuY29kZWRfb3V0Z29pbmcpOworIGZhaWxlZF8wOgorICBkYnVzX2ZyZWUgKHNvY2tldF90cmFuc3BvcnQpOworICByZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiBDcmVhdGVzIGEgbmV3IHRyYW5zcG9ydCBmb3IgdGhlIGdpdmVuIGhvc3RuYW1lIGFuZCBwb3J0LgorICogSWYgaG9zdCBpcyBOVUxMLCBpdCB3aWxsIGRlZmF1bHQgdG8gbG9jYWxob3N0CisgKgorICogQHBhcmFtIGhvc3QgdGhlIGhvc3QgdG8gY29ubmVjdCB0bworICogQHBhcmFtIHBvcnQgdGhlIHBvcnQgdG8gY29ubmVjdCB0bworICogQHBhcmFtIGZhbWlseSB0aGUgYWRkcmVzcyBmYW1pbHkgdG8gY29ubmVjdCB0bworICogQHBhcmFtIG5vbmNlZmlsZSBwYXRoIHRvIG5vbmNlIGZpbGUKKyAqIEBwYXJhbSBlcnJvciBsb2NhdGlvbiB0byBzdG9yZSByZWFzb24gZm9yIGZhaWx1cmUuCisgKiBAcmV0dXJucyBhIG5ldyB0cmFuc3BvcnQsIG9yICNOVUxMIG9uIGZhaWx1cmUuCisgKi8KK0RCdXNUcmFuc3BvcnQqCitfZGJ1c190cmFuc3BvcnRfbmV3X2Zvcl90Y3Bfc29ja2V0IChjb25zdCBjaGFyICAgICAqaG9zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKmZhbWlseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpub25jZWZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIERCdXNTb2NrZXQgZmQ7CisgIERCdXNUcmFuc3BvcnQgKnRyYW5zcG9ydDsKKyAgREJ1c1N0cmluZyBhZGRyZXNzOworICAKKyAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmFkZHJlc3MpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIGlmIChob3N0ID09IE5VTEwpCisgICAgaG9zdCA9ICJsb2NhbGhvc3QiOworCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmFkZHJlc3MsIG5vbmNlZmlsZSA/ICJub25jZS10Y3A6IiA6ICJ0Y3A6IikpCisgICAgZ290byBlcnJvcjsKKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhZGRyZXNzLCAiaG9zdD0iKSB8fAorICAgICAgIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhZGRyZXNzLCBob3N0KSkKKyAgICBnb3RvIGVycm9yOworCisgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJmFkZHJlc3MsICIscG9ydD0iKSB8fAorICAgICAgIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhZGRyZXNzLCBwb3J0KSkKKyAgICBnb3RvIGVycm9yOworCisgIGlmIChmYW1pbHkgIT0gTlVMTCAmJgorICAgICAgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmYWRkcmVzcywgIixmYW1pbHk9IikgfHwKKyAgICAgICAhX2RidXNfc3RyaW5nX2FwcGVuZCAoJmFkZHJlc3MsIGZhbWlseSkpKQorICAgIGdvdG8gZXJyb3I7CisKKyAgaWYgKG5vbmNlZmlsZSAhPSBOVUxMICYmCisgICAgICAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhZGRyZXNzLCAiLG5vbmNlZmlsZT0iKSB8fAorICAgICAgICFfZGJ1c19zdHJpbmdfYXBwZW5kICgmYWRkcmVzcywgbm9uY2VmaWxlKSkpCisgICAgZ290byBlcnJvcjsKKworICBmZCA9IF9kYnVzX2Nvbm5lY3RfdGNwX3NvY2tldF93aXRoX25vbmNlIChob3N0LCBwb3J0LCBmYW1pbHksIG5vbmNlZmlsZSwgZXJyb3IpOworICBpZiAoIV9kYnVzX3NvY2tldF9pc192YWxpZCAoZmQpKQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmYWRkcmVzcyk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgX2RidXNfdmVyYm9zZSAoIlN1Y2Nlc3NmdWxseSBjb25uZWN0ZWQgdG8gdGNwIHNvY2tldCAlczolc1xuIiwKKyAgICAgICAgICAgICAgICAgaG9zdCwgcG9ydCk7CisgIAorICB0cmFuc3BvcnQgPSBfZGJ1c190cmFuc3BvcnRfbmV3X2Zvcl9zb2NrZXQgKGZkLCBOVUxMLCAmYWRkcmVzcyk7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmYWRkcmVzcyk7CisgIGlmICh0cmFuc3BvcnQgPT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgIF9kYnVzX2Nsb3NlX3NvY2tldCAoZmQsIE5VTEwpOworICAgICAgX2RidXNfc29ja2V0X2ludmFsaWRhdGUgKCZmZCk7CisgICAgfQorCisgIHJldHVybiB0cmFuc3BvcnQ7CisKK2Vycm9yOgorICBfZGJ1c19zdHJpbmdfZnJlZSAoJmFkZHJlc3MpOworICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogT3BlbnMgYSBUQ1Agc29ja2V0IHRyYW5zcG9ydC4KKyAqIAorICogQHBhcmFtIGVudHJ5IHRoZSBhZGRyZXNzIGVudHJ5IHRvIHRyeSBvcGVuaW5nIGFzIGEgdGNwIHRyYW5zcG9ydC4KKyAqIEBwYXJhbSB0cmFuc3BvcnRfcCByZXR1cm4gbG9jYXRpb24gZm9yIHRoZSBvcGVuZWQgdHJhbnNwb3J0CisgKiBAcGFyYW0gZXJyb3IgZXJyb3IgdG8gYmUgc2V0CisgKiBAcmV0dXJucyByZXN1bHQgb2YgdGhlIGF0dGVtcHQKKyAqLworREJ1c1RyYW5zcG9ydE9wZW5SZXN1bHQKK19kYnVzX3RyYW5zcG9ydF9vcGVuX3NvY2tldChEQnVzQWRkcmVzc0VudHJ5ICAqZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1RyYW5zcG9ydCAgICAqKnRyYW5zcG9ydF9wLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAqZXJyb3IpCit7CisgIGNvbnN0IGNoYXIgKm1ldGhvZDsKKyAgZGJ1c19ib29sX3QgaXNUY3A7CisgIGRidXNfYm9vbF90IGlzTm9uY2VUY3A7CisgIAorICBtZXRob2QgPSBkYnVzX2FkZHJlc3NfZW50cnlfZ2V0X21ldGhvZCAoZW50cnkpOworICBfZGJ1c19hc3NlcnQgKG1ldGhvZCAhPSBOVUxMKTsKKworICBpc1RjcCA9IHN0cmNtcCAobWV0aG9kLCAidGNwIikgPT0gMDsKKyAgaXNOb25jZVRjcCA9IHN0cmNtcCAobWV0aG9kLCAibm9uY2UtdGNwIikgPT0gMDsKKworICBpZiAoaXNUY3AgfHwgaXNOb25jZVRjcCkKKyAgICB7CisgICAgICBjb25zdCBjaGFyICpob3N0ID0gZGJ1c19hZGRyZXNzX2VudHJ5X2dldF92YWx1ZSAoZW50cnksICJob3N0Iik7CisgICAgICBjb25zdCBjaGFyICpwb3J0ID0gZGJ1c19hZGRyZXNzX2VudHJ5X2dldF92YWx1ZSAoZW50cnksICJwb3J0Iik7CisgICAgICBjb25zdCBjaGFyICpmYW1pbHkgPSBkYnVzX2FkZHJlc3NfZW50cnlfZ2V0X3ZhbHVlIChlbnRyeSwgImZhbWlseSIpOworICAgICAgY29uc3QgY2hhciAqbm9uY2VmaWxlID0gZGJ1c19hZGRyZXNzX2VudHJ5X2dldF92YWx1ZSAoZW50cnksICJub25jZWZpbGUiKTsKKworICAgICAgaWYgKChpc05vbmNlVGNwID09IFRSVUUpICE9IChub25jZWZpbGUgIT0gTlVMTCkpIHsKKyAgICAgICAgICBfZGJ1c19zZXRfYmFkX2FkZHJlc3MgKGVycm9yLCBtZXRob2QsICJub25jZWZpbGUiLCBOVUxMKTsKKyAgICAgICAgICByZXR1cm4gREJVU19UUkFOU1BPUlRfT1BFTl9CQURfQUREUkVTUzsKKyAgICAgIH0KKworICAgICAgaWYgKHBvcnQgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3NldF9iYWRfYWRkcmVzcyAoZXJyb3IsIG1ldGhvZCwgInBvcnQiLCBOVUxMKTsKKyAgICAgICAgICByZXR1cm4gREJVU19UUkFOU1BPUlRfT1BFTl9CQURfQUREUkVTUzsKKyAgICAgICAgfQorCisgICAgICAqdHJhbnNwb3J0X3AgPSBfZGJ1c190cmFuc3BvcnRfbmV3X2Zvcl90Y3Bfc29ja2V0IChob3N0LCBwb3J0LCBmYW1pbHksIG5vbmNlZmlsZSwgZXJyb3IpOworICAgICAgaWYgKCp0cmFuc3BvcnRfcCA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgICAgIHJldHVybiBEQlVTX1RSQU5TUE9SVF9PUEVOX0RJRF9OT1RfQ09OTkVDVDsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisgICAgICAgICAgcmV0dXJuIERCVVNfVFJBTlNQT1JUX09QRU5fT0s7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgICAgIHJldHVybiBEQlVTX1RSQU5TUE9SVF9PUEVOX05PVF9IQU5ETEVEOworICAgIH0KK30KKworLyoqIEB9ICovCisKZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy10cmFuc3BvcnQtc29ja2V0LmggYi9kYnVzL2RidXMtdHJhbnNwb3J0LXNvY2tldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4MjY3ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtdHJhbnNwb3J0LXNvY2tldC5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy10cmFuc3BvcnQtc29ja2V0LmggU29ja2V0IHN1YmNsYXNzZXMgb2YgREJ1c1RyYW5zcG9ydAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwNiAgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaWZuZGVmIERCVVNfVFJBTlNQT1JUX1NPQ0tFVF9ICisjZGVmaW5lIERCVVNfVFJBTlNQT1JUX1NPQ0tFVF9ICisKKyNpbmNsdWRlIDxkYnVzL2RidXMtdHJhbnNwb3J0LXByb3RlY3RlZC5oPgorCitEQlVTX0JFR0lOX0RFQ0xTCisKK0RCdXNUcmFuc3BvcnQqICAgICAgICAgIF9kYnVzX3RyYW5zcG9ydF9uZXdfZm9yX3NvY2tldCAgICAgKERCdXNTb2NrZXQgICAgICAgICBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICpzZXJ2ZXJfZ3VpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICphZGRyZXNzKTsKK0RCdXNUcmFuc3BvcnQqICAgICAgICAgIF9kYnVzX3RyYW5zcG9ydF9uZXdfZm9yX3RjcF9zb2NrZXQgKGNvbnN0IGNoYXIgICAgICAgICpob3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgKnBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAqZmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgKm5vbmNlZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICplcnJvcik7CitEQnVzVHJhbnNwb3J0T3BlblJlc3VsdCBfZGJ1c190cmFuc3BvcnRfb3Blbl9zb2NrZXQgICAgICAgIChEQnVzQWRkcmVzc0VudHJ5ICAqZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzVHJhbnNwb3J0ICAgICoqdHJhbnNwb3J0X3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAqZXJyb3IpOworCisKKworREJVU19FTkRfREVDTFMKKworI2VuZGlmIC8qIERCVVNfVFJBTlNQT1JUX1NPQ0tFVF9IICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtdHJhbnNwb3J0LXVuaXguYyBiL2RidXMvZGJ1cy10cmFuc3BvcnQtdW5peC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyYjFmMDkKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtdHJhbnNwb3J0LXVuaXguYwpAQCAtMCwwICsxLDQzOCBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXRyYW5zcG9ydC11bml4LmMgVU5JWCBzb2NrZXQgc3ViY2xhc3NlcyBvZiBEQnVzVHJhbnNwb3J0CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzLCAyMDA0ICBSZWQgSGF0IEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImRidXMtaW50ZXJuYWxzLmgiCisjaW5jbHVkZSAiZGJ1cy1jb25uZWN0aW9uLWludGVybmFsLmgiCisjaW5jbHVkZSAiZGJ1cy10cmFuc3BvcnQtdW5peC5oIgorI2luY2x1ZGUgImRidXMtdHJhbnNwb3J0LXNvY2tldC5oIgorI2luY2x1ZGUgImRidXMtdHJhbnNwb3J0LXByb3RlY3RlZC5oIgorI2luY2x1ZGUgImRidXMtd2F0Y2guaCIKKyNpbmNsdWRlICJkYnVzLXN5c2RlcHMtdW5peC5oIgorI2luY2x1ZGUgImRidXMtdGVzdC5oIgorCisvKioKKyAqIEBkZWZncm91cCBEQnVzVHJhbnNwb3J0VW5peCBEQnVzVHJhbnNwb3J0IGltcGxlbWVudGF0aW9ucyBmb3IgVU5JWAorICogQGluZ3JvdXAgIERCdXNJbnRlcm5hbHMKKyAqIEBicmllZiBJbXBsZW1lbnRhdGlvbiBkZXRhaWxzIG9mIERCdXNUcmFuc3BvcnQgb24gVU5JWAorICoKKyAqIEB7CisgKi8KKworLyoqCisgKiBDcmVhdGVzIGEgbmV3IHRyYW5zcG9ydCBmb3IgdGhlIGdpdmVuIFVuaXggZG9tYWluIHNvY2tldAorICogcGF0aC4gVGhpcyBjcmVhdGVzIGEgY2xpZW50LXNpZGUgb2YgYSB0cmFuc3BvcnQuCisgKgorICogQHRvZG8gb25jZSB3ZSBhZGQgYSB3YXkgdG8gZXNjYXBlIHBhdGhzIGluIGEgZGJ1cworICogYWRkcmVzcywgdGhpcyBmdW5jdGlvbiBuZWVkcyB0byBkbyBlc2NhcGluZy4KKyAqCisgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aCB0byB0aGUgZG9tYWluIHNvY2tldC4KKyAqIEBwYXJhbSBhYnN0cmFjdCAjVFJVRSB0byB1c2UgYWJzdHJhY3Qgc29ja2V0IG5hbWVzcGFjZQorICogQHBhcmFtIGVycm9yIGFkZHJlc3Mgd2hlcmUgYW4gZXJyb3IgY2FuIGJlIHJldHVybmVkLgorICogQHJldHVybnMgYSBuZXcgdHJhbnNwb3J0LCBvciAjTlVMTCBvbiBmYWlsdXJlLgorICovCitEQnVzVHJhbnNwb3J0KgorX2RidXNfdHJhbnNwb3J0X25ld19mb3JfZG9tYWluX3NvY2tldCAoY29uc3QgY2hhciAgICAgKnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgYWJzdHJhY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIERCdXNTb2NrZXQgZmQgPSBEQlVTX1NPQ0tFVF9JTklUOworICBEQnVzVHJhbnNwb3J0ICp0cmFuc3BvcnQ7CisgIERCdXNTdHJpbmcgYWRkcmVzczsKKyAgCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZhZGRyZXNzKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBpZiAoKGFic3RyYWN0ICYmCisgICAgICAgIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZhZGRyZXNzLCAidW5peDphYnN0cmFjdD0iKSkgfHwKKyAgICAgICghYWJzdHJhY3QgJiYKKyAgICAgICAhX2RidXNfc3RyaW5nX2FwcGVuZCAoJmFkZHJlc3MsICJ1bml4OnBhdGg9IikpIHx8CisgICAgICAhX2RidXNfc3RyaW5nX2FwcGVuZCAoJmFkZHJlc3MsIHBhdGgpKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgZ290byBmYWlsZWRfMDsKKyAgICB9CisgIAorICBmZC5mZCA9IF9kYnVzX2Nvbm5lY3RfdW5peF9zb2NrZXQgKHBhdGgsIGFic3RyYWN0LCBlcnJvcik7CisgIGlmIChmZC5mZCA8IDApCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgZ290byBmYWlsZWRfMDsKKyAgICB9CisKKyAgX2RidXNfdmVyYm9zZSAoIlN1Y2Nlc3NmdWxseSBjb25uZWN0ZWQgdG8gdW5peCBzb2NrZXQgJXNcbiIsCisgICAgICAgICAgICAgICAgIHBhdGgpOworCisgIHRyYW5zcG9ydCA9IF9kYnVzX3RyYW5zcG9ydF9uZXdfZm9yX3NvY2tldCAoZmQsIE5VTEwsICZhZGRyZXNzKTsKKyAgaWYgKHRyYW5zcG9ydCA9PSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgZ290byBmYWlsZWRfMTsKKyAgICB9CisgIAorICBfZGJ1c19zdHJpbmdfZnJlZSAoJmFkZHJlc3MpOworICAKKyAgcmV0dXJuIHRyYW5zcG9ydDsKKworIGZhaWxlZF8xOgorICBfZGJ1c19jbG9zZV9zb2NrZXQgKGZkLCBOVUxMKTsKKyBmYWlsZWRfMDoKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZhZGRyZXNzKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogQ3JlYXRlcyBhIG5ldyB0cmFuc3BvcnQgZm9yIHRoZSBnaXZlbiBiaW5hcnkgYW5kIGFyZ3VtZW50cy4gVGhpcworICogY3JlYXRlcyBhIGNsaWVudC1zaWRlIG9mIGEgdHJhbnNwb3J0LiBUaGUgcHJvY2VzcyB3aWxsIGJlIGZvcmtlZAorICogb2ZmIGFuZCBleGVjdXRlZCB3aXRoIHN0ZGluL3N0ZG91dCBjb25uZWN0ZWQgdG8gYSBsb2NhbCBBRl9VTklYCisgKiBzb2NrZXQuCisgKgorICogQHBhcmFtIHBhdGggdGhlIHBhdGggdG8gdGhlIGRvbWFpbiBzb2NrZXQuCisgKiBAcGFyYW0gYXJndiBQYXJhbWV0ZXJzIGxpc3QKKyAqIEBwYXJhbSBlcnJvciBhZGRyZXNzIHdoZXJlIGFuIGVycm9yIGNhbiBiZSByZXR1cm5lZC4KKyAqIEByZXR1cm5zIGEgbmV3IHRyYW5zcG9ydCwgb3IgI05VTEwgb24gZmFpbHVyZS4KKyAqLworc3RhdGljIERCdXNUcmFuc3BvcnQqCitfZGJ1c190cmFuc3BvcnRfbmV3X2Zvcl9leGVjIChjb25zdCBjaGFyICAgICAqcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmNvbnN0ICAgICBhcmd2W10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAqZXJyb3IpCit7CisgIERCdXNTb2NrZXQgZmQgPSBEQlVTX1NPQ0tFVF9JTklUOworICBEQnVzVHJhbnNwb3J0ICp0cmFuc3BvcnQ7CisgIERCdXNTdHJpbmcgYWRkcmVzczsKKyAgdW5zaWduZWQgaTsKKyAgY2hhciAqZXNjYXBlZDsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmYWRkcmVzcykpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgZXNjYXBlZCA9IGRidXNfYWRkcmVzc19lc2NhcGVfdmFsdWUgKHBhdGgpOworICBpZiAoIWVzY2FwZWQpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmYWRkcmVzcywgInVuaXhleGVjOnBhdGg9IikgfHwKKyAgICAgICFfZGJ1c19zdHJpbmdfYXBwZW5kICgmYWRkcmVzcywgZXNjYXBlZCkpCisgICAgeworICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICBkYnVzX2ZyZWUgKGVzY2FwZWQpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIGRidXNfZnJlZSAoZXNjYXBlZCk7CisKKyAgaWYgKGFyZ3YpCisgICAgeworICAgICAgZm9yIChpID0gMDsgYXJndltpXTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19ib29sX3Qgc3VjY2VzczsKKworICAgICAgICAgIGVzY2FwZWQgPSBkYnVzX2FkZHJlc3NfZXNjYXBlX3ZhbHVlIChhcmd2W2ldKTsKKyAgICAgICAgICBpZiAoIWVzY2FwZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIHN1Y2Nlc3MgPSBfZGJ1c19zdHJpbmdfYXBwZW5kX3ByaW50ZiAoJmFkZHJlc3MsICIsYXJndiV1PSVzIiwgaSwgZXNjYXBlZCk7CisgICAgICAgICAgZGJ1c19mcmVlIChlc2NhcGVkKTsKKworICAgICAgICAgIGlmICghc3VjY2VzcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgIGZkLmZkID0gX2RidXNfY29ubmVjdF9leGVjIChwYXRoLCBhcmd2LCBlcnJvcik7CisgIGlmIChmZC5mZCA8IDApCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIF9kYnVzX3ZlcmJvc2UgKCJTdWNjZXNzZnVsbHkgY29ubmVjdGVkIHRvIHByb2Nlc3MgJXNcbiIsCisgICAgICAgICAgICAgICAgIHBhdGgpOworCisgIHRyYW5zcG9ydCA9IF9kYnVzX3RyYW5zcG9ydF9uZXdfZm9yX3NvY2tldCAoZmQsIE5VTEwsICZhZGRyZXNzKTsKKyAgaWYgKHRyYW5zcG9ydCA9PSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgIF9kYnVzX3N0cmluZ19mcmVlICgmYWRkcmVzcyk7CisKKyAgcmV0dXJuIHRyYW5zcG9ydDsKKworIGZhaWxlZDoKKyAgaWYgKGZkLmZkID49IDApCisgICAgX2RidXNfY2xvc2Vfc29ja2V0IChmZCwgTlVMTCk7CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZhZGRyZXNzKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogT3BlbnMgcGxhdGZvcm0gc3BlY2lmaWMgdHJhbnNwb3J0IHR5cGVzLgorICogCisgKiBAcGFyYW0gZW50cnkgdGhlIGFkZHJlc3MgZW50cnkgdG8gdHJ5IG9wZW5pbmcKKyAqIEBwYXJhbSB0cmFuc3BvcnRfcCByZXR1cm4gbG9jYXRpb24gZm9yIHRoZSBvcGVuZWQgdHJhbnNwb3J0CisgKiBAcGFyYW0gZXJyb3IgZXJyb3IgdG8gYmUgc2V0CisgKiBAcmV0dXJucyByZXN1bHQgb2YgdGhlIGF0dGVtcHQKKyAqLworREJ1c1RyYW5zcG9ydE9wZW5SZXN1bHQKK19kYnVzX3RyYW5zcG9ydF9vcGVuX3BsYXRmb3JtX3NwZWNpZmljIChEQnVzQWRkcmVzc0VudHJ5ICAqZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1RyYW5zcG9ydCAgICAqKnRyYW5zcG9ydF9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICplcnJvcikKK3sKKyAgY29uc3QgY2hhciAqbWV0aG9kOworICAKKyAgbWV0aG9kID0gZGJ1c19hZGRyZXNzX2VudHJ5X2dldF9tZXRob2QgKGVudHJ5KTsKKyAgX2RidXNfYXNzZXJ0IChtZXRob2QgIT0gTlVMTCk7CisKKyAgaWYgKHN0cmNtcCAobWV0aG9kLCAidW5peCIpID09IDApCisgICAgeworICAgICAgY29uc3QgY2hhciAqcGF0aCA9IGRidXNfYWRkcmVzc19lbnRyeV9nZXRfdmFsdWUgKGVudHJ5LCAicGF0aCIpOworICAgICAgY29uc3QgY2hhciAqdG1wZGlyID0gZGJ1c19hZGRyZXNzX2VudHJ5X2dldF92YWx1ZSAoZW50cnksICJ0bXBkaXIiKTsKKyAgICAgIGNvbnN0IGNoYXIgKmFic3RyYWN0ID0gZGJ1c19hZGRyZXNzX2VudHJ5X2dldF92YWx1ZSAoZW50cnksICJhYnN0cmFjdCIpOworICAgICAgICAgIAorICAgICAgaWYgKHRtcGRpciAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfc2V0X2JhZF9hZGRyZXNzIChlcnJvciwgTlVMTCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjYW5ub3QgdXNlIHRoZSBcInRtcGRpclwiIG9wdGlvbiBmb3IgYW4gYWRkcmVzcyB0byBjb25uZWN0IHRvLCBvbmx5IGluIGFuIGFkZHJlc3MgdG8gbGlzdGVuIG9uIik7CisgICAgICAgICAgcmV0dXJuIERCVVNfVFJBTlNQT1JUX09QRU5fQkFEX0FERFJFU1M7CisgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgIGlmIChwYXRoID09IE5VTEwgJiYgYWJzdHJhY3QgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3NldF9iYWRfYWRkcmVzcyAoZXJyb3IsICJ1bml4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXRoIG9yIGFic3RyYWN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICAgIHJldHVybiBEQlVTX1RSQU5TUE9SVF9PUEVOX0JBRF9BRERSRVNTOworICAgICAgICB9CisKKyAgICAgIGlmIChwYXRoICE9IE5VTEwgJiYgYWJzdHJhY3QgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3NldF9iYWRfYWRkcmVzcyAoZXJyb3IsIE5VTEwsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2FuJ3Qgc3BlY2lmeSBib3RoIFwicGF0aFwiIGFuZCBcImFic3RyYWN0XCIgb3B0aW9ucyBpbiBhbiBhZGRyZXNzIik7CisgICAgICAgICAgcmV0dXJuIERCVVNfVFJBTlNQT1JUX09QRU5fQkFEX0FERFJFU1M7CisgICAgICAgIH0KKworICAgICAgaWYgKHBhdGgpCisgICAgICAgICp0cmFuc3BvcnRfcCA9IF9kYnVzX3RyYW5zcG9ydF9uZXdfZm9yX2RvbWFpbl9zb2NrZXQgKHBhdGgsIEZBTFNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7CisgICAgICBlbHNlCisgICAgICAgICp0cmFuc3BvcnRfcCA9IF9kYnVzX3RyYW5zcG9ydF9uZXdfZm9yX2RvbWFpbl9zb2NrZXQgKGFic3RyYWN0LCBUUlVFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7CisgICAgICBpZiAoKnRyYW5zcG9ydF9wID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICAgICAgcmV0dXJuIERCVVNfVFJBTlNQT1JUX09QRU5fRElEX05PVF9DT05ORUNUOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gREJVU19UUkFOU1BPUlRfT1BFTl9PSzsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZSBpZiAoc3RyY21wIChtZXRob2QsICJ1bml4ZXhlYyIpID09IDApCisgICAgeworICAgICAgY29uc3QgY2hhciAqcGF0aDsKKyAgICAgIHVuc2lnbmVkIGk7CisgICAgICBjaGFyICoqYXJndjsKKworICAgICAgcGF0aCA9IGRidXNfYWRkcmVzc19lbnRyeV9nZXRfdmFsdWUgKGVudHJ5LCAicGF0aCIpOworICAgICAgaWYgKHBhdGggPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3NldF9iYWRfYWRkcmVzcyAoZXJyb3IsIE5VTEwsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm8gcHJvY2VzcyBwYXRoIHNwZWNpZmllZCIpOworICAgICAgICAgIHJldHVybiBEQlVTX1RSQU5TUE9SVF9PUEVOX0JBRF9BRERSRVNTOworICAgICAgICB9CisKKyAgICAgIC8qIEZpcnN0IGNvdW50IGFyZ3YgYXJndW1lbnRzICovCisgICAgICBmb3IgKGkgPSAxOyA7IGkrKykKKyAgICAgICAgeworICAgICAgICAgIGNoYXIgdFs0KzIwKzFdOyAvKiAiYXJndiIgcGx1cyBzcGFjZSBmb3IgYSBmb3JtYXR0ZWQgYmFzZSAxMCA2NGJpdCBpbnRlZ2VyLCBwbHVzIE5VTCAqLworCisgICAgICAgICAgc25wcmludGYgKHQsIHNpemVvZih0KSwgImFyZ3YldSIsIGkpOworCisgICAgICAgICAgaWYgKCFkYnVzX2FkZHJlc3NfZW50cnlfZ2V0X3ZhbHVlIChlbnRyeSwgdCkpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAvKiBBbGxvY2F0ZSBzdHJpbmcgYXJyYXkgKi8KKyAgICAgIGFyZ3YgPSBkYnVzX25ldzAgKGNoYXIqLCBpKzEpOworICAgICAgaWYgKCFhcmd2KQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICAgICAgcmV0dXJuIERCVVNfVFJBTlNQT1JUX09QRU5fRElEX05PVF9DT05ORUNUOworICAgICAgICB9CisKKyAgICAgIC8qIEZpbGwgaW4gc3RyaW5nIGFycmF5ICovCisgICAgICBmb3IgKGkgPSAwOyA7IGkrKykKKyAgICAgICAgeworICAgICAgICAgIGNoYXIgdFs0KzIwKzFdOworICAgICAgICAgIGNvbnN0IGNoYXIgKnA7CisKKyAgICAgICAgICBzbnByaW50ZiAodCwgc2l6ZW9mKHQpLCAiYXJndiV1IiwgaSk7CisKKyAgICAgICAgICBwID0gZGJ1c19hZGRyZXNzX2VudHJ5X2dldF92YWx1ZSAoZW50cnksIHQpOworICAgICAgICAgIGlmICghcCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKGkgPT0gMCkKKyAgICAgICAgICAgICAgICAvKiBJZiBhcmd2MCBpc24ndCBzcGVjaWZpZWQsIGZpbGwgaW4gdGhlIHBhdGggaW5zdGVhZCAqLworICAgICAgICAgICAgICAgIHAgPSBwYXRoOworICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBhcmd2W2ldID0gX2RidXNfc3RyZHVwIChwKTsKKyAgICAgICAgICBpZiAoIWFyZ3ZbaV0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfZnJlZV9zdHJpbmdfYXJyYXkgKGFyZ3YpOworICAgICAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgICAgICAgICAgcmV0dXJuIERCVVNfVFJBTlNQT1JUX09QRU5fRElEX05PVF9DT05ORUNUOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICp0cmFuc3BvcnRfcCA9IF9kYnVzX3RyYW5zcG9ydF9uZXdfZm9yX2V4ZWMgKHBhdGgsIGFyZ3YsIGVycm9yKTsKKyAgICAgIGRidXNfZnJlZV9zdHJpbmdfYXJyYXkgKGFyZ3YpOworCisgICAgICBpZiAoKnRyYW5zcG9ydF9wID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICAgICAgcmV0dXJuIERCVVNfVFJBTlNQT1JUX09QRU5fRElEX05PVF9DT05ORUNUOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gREJVU19UUkFOU1BPUlRfT1BFTl9PSzsKKyAgICAgICAgfQorICAgIH0KKyNpZmRlZiBEQlVTX0VOQUJMRV9MQVVOQ0hECisgIGVsc2UgaWYgKHN0cmNtcCAobWV0aG9kLCAibGF1bmNoZCIpID09IDApCisgICAgeworICAgICAgREJ1c0Vycm9yIHRtcF9lcnJvciA9IERCVVNfRVJST1JfSU5JVDsKKyAgICAgIGNvbnN0IGNoYXIgKmxhdW5jaGRfZW52X3ZhciA9IGRidXNfYWRkcmVzc19lbnRyeV9nZXRfdmFsdWUgKGVudHJ5LCAiZW52Iik7CisgICAgICBjb25zdCBjaGFyICpsYXVuY2hkX3NvY2tldDsKKyAgICAgIERCdXNTdHJpbmcgc29ja2V0X3BhdGg7CisgICAgICBkYnVzX2Jvb2xfdCB2YWxpZF9zb2NrZXQ7CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZzb2NrZXRfcGF0aCkpCisgICAgICAgIHsKKyAgICAgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIGlmIChsYXVuY2hkX2Vudl92YXIgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3NldF9iYWRfYWRkcmVzcyAoZXJyb3IsICJsYXVuY2hkIiwgImVudiIsIE5VTEwpOworICAgICAgICAgIHJldHVybiBEQlVTX1RSQU5TUE9SVF9PUEVOX0JBRF9BRERSRVNTOworICAgICAgICB9CisKKyAgICAgIHZhbGlkX3NvY2tldCA9IF9kYnVzX2xvb2t1cF9sYXVuY2hkX3NvY2tldCAoJnNvY2tldF9wYXRoLCBsYXVuY2hkX2Vudl92YXIsIGVycm9yKTsKKworICAgICAgaWYgKGRidXNfZXJyb3JfaXNfc2V0KGVycm9yKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlKCZzb2NrZXRfcGF0aCk7CisgICAgICAgICAgcmV0dXJuIERCVVNfVFJBTlNQT1JUX09QRU5fRElEX05PVF9DT05ORUNUOworICAgICAgICB9CisKKyAgICAgIGlmICghdmFsaWRfc29ja2V0KQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IoJnRtcF9lcnJvciwgREJVU19FUlJPUl9CQURfQUREUkVTUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAibGF1bmNoZCdzIGVudiB2YXIgJXMgZG9lcyBub3QgZXhpc3QiLCBsYXVuY2hkX2Vudl92YXIpOworICAgICAgICAgIGRidXNfZXJyb3JfZnJlZShlcnJvcik7CisgICAgICAgICAgZGJ1c19tb3ZlX2Vycm9yKCZ0bXBfZXJyb3IsIGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gREJVU19UUkFOU1BPUlRfT1BFTl9ESURfTk9UX0NPTk5FQ1Q7CisgICAgICAgIH0KKworICAgICAgbGF1bmNoZF9zb2NrZXQgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEoJnNvY2tldF9wYXRoKTsKKyAgICAgICp0cmFuc3BvcnRfcCA9IF9kYnVzX3RyYW5zcG9ydF9uZXdfZm9yX2RvbWFpbl9zb2NrZXQgKGxhdW5jaGRfc29ja2V0LCBGQUxTRSwgZXJyb3IpOworCisgICAgICBpZiAoKnRyYW5zcG9ydF9wID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICAgICAgcmV0dXJuIERCVVNfVFJBTlNQT1JUX09QRU5fRElEX05PVF9DT05ORUNUOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgICAgICAgICByZXR1cm4gREJVU19UUkFOU1BPUlRfT1BFTl9PSzsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorICBlbHNlCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisgICAgICByZXR1cm4gREJVU19UUkFOU1BPUlRfT1BFTl9OT1RfSEFORExFRDsKKyAgICB9Cit9CisKKy8qKiBAfSAqLworCisjaWZkZWYgREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMKKworZGJ1c19ib29sX3QKK19kYnVzX3RyYW5zcG9ydF91bml4X3Rlc3QgKHZvaWQpCit7CisgIERCdXNDb25uZWN0aW9uICpjOworICBEQnVzRXJyb3IgZXJyb3I7CisgIGRidXNfYm9vbF90IHJldDsKKyAgY29uc3QgY2hhciAqYWRkcmVzczsKKworICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisKKyAgYyA9IGRidXNfY29ubmVjdGlvbl9vcGVuICgidW5peGV4ZWM6YXJndjA9ZmFsc2UsYXJndjE9Zm9vYmFyLHBhdGg9L2Jpbi9mYWxzZSIsICZlcnJvcik7CisgIF9kYnVzX2Fzc2VydCAoYyAhPSBOVUxMKTsKKyAgX2RidXNfYXNzZXJ0ICghZGJ1c19lcnJvcl9pc19zZXQgKCZlcnJvcikpOworCisgIGFkZHJlc3MgPSBfZGJ1c19jb25uZWN0aW9uX2dldF9hZGRyZXNzIChjKTsKKyAgX2RidXNfYXNzZXJ0IChhZGRyZXNzICE9IE5VTEwpOworCisgIC8qIExldCdzIHNlZSBpZiB0aGUgYWRkcmVzcyBnb3QgcGFyc2VkLCByZW9yZGVyZWQgYW5kIGZvcm1hdHRlZCBjb3JyZWN0bHkgKi8KKyAgcmV0ID0gc3RyY21wIChhZGRyZXNzLCAidW5peGV4ZWM6cGF0aD0vYmluL2ZhbHNlLGFyZ3YwPWZhbHNlLGFyZ3YxPWZvb2JhciIpID09IDA7CisKKyAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChjKTsKKworICByZXR1cm4gcmV0OworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy10cmFuc3BvcnQtdW5peC5oIGIvZGJ1cy9kYnVzLXRyYW5zcG9ydC11bml4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzgzYTgzMQotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy10cmFuc3BvcnQtdW5peC5oCkBAIC0wLDAgKzEsMzcgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy10cmFuc3BvcnQtdW5peC5oIFVOSVggc29ja2V0IHN1YmNsYXNzZXMgb2YgREJ1c1RyYW5zcG9ydAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiAgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaWZuZGVmIERCVVNfVFJBTlNQT1JUX1VOSVhfSAorI2RlZmluZSBEQlVTX1RSQU5TUE9SVF9VTklYX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy10cmFuc3BvcnQuaD4KKworREJVU19CRUdJTl9ERUNMUworCitEQnVzVHJhbnNwb3J0KiBfZGJ1c190cmFuc3BvcnRfbmV3X2Zvcl9kb21haW5fc29ja2V0IChjb25zdCBjaGFyICAgICAgICpwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgYWJzdHJhY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcik7CisKKworREJVU19FTkRfREVDTFMKKworI2VuZGlmIC8qIERCVVNfVFJBTlNQT1JUX1VOSVhfSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLXRyYW5zcG9ydC13aW4uYyBiL2RidXMvZGJ1cy10cmFuc3BvcnQtd2luLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZjMTU3NAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy10cmFuc3BvcnQtd2luLmMKQEAgLTAsMCArMSw1OCBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXRyYW5zcG9ydC13aW4uYyBXaW5kb3dzIHNvY2tldCBzdWJjbGFzc2VzIG9mIERCdXNUcmFuc3BvcnQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMsIDIwMDQgIFJlZCBIYXQgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJhbGYgSGFiYWNrZXIgPHJhbGYuaGFiYWNrZXJAZnJlZW5ldC5kZT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgImRidXMtaW50ZXJuYWxzLmgiCisjaW5jbHVkZSAiZGJ1cy1jb25uZWN0aW9uLWludGVybmFsLmgiCisjaW5jbHVkZSAiZGJ1cy10cmFuc3BvcnQtc29ja2V0LmgiCisjaW5jbHVkZSAiZGJ1cy10cmFuc3BvcnQtcHJvdGVjdGVkLmgiCisjaW5jbHVkZSAiZGJ1cy13YXRjaC5oIgorI2luY2x1ZGUgImRidXMtc3lzZGVwcy13aW4uaCIKKworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c1RyYW5zcG9ydFVuaXggREJ1c1RyYW5zcG9ydCBpbXBsZW1lbnRhdGlvbnMgZm9yIFVOSVgKKyAqIEBpbmdyb3VwICBEQnVzSW50ZXJuYWxzCisgKiBAYnJpZWYgSW1wbGVtZW50YXRpb24gZGV0YWlscyBvZiBEQnVzVHJhbnNwb3J0IG9uIFVOSVgKKyAqCisgKiBAeworICovCisKKy8qKgorICogT3BlbnMgcGxhdGZvcm0gc3BlY2lmaWMgdHJhbnNwb3J0IHR5cGVzLgorICogCisgKiBAcGFyYW0gZW50cnkgdGhlIGFkZHJlc3MgZW50cnkgdG8gdHJ5IG9wZW5pbmcKKyAqIEBwYXJhbSB0cmFuc3BvcnRfcCByZXR1cm4gbG9jYXRpb24gZm9yIHRoZSBvcGVuZWQgdHJhbnNwb3J0CisgKiBAcGFyYW0gZXJyb3IgZXJyb3IgdG8gYmUgc2V0CisgKiBAcmV0dXJucyByZXN1bHQgb2YgdGhlIGF0dGVtcHQKKyAqLworREJ1c1RyYW5zcG9ydE9wZW5SZXN1bHQKK19kYnVzX3RyYW5zcG9ydF9vcGVuX3BsYXRmb3JtX3NwZWNpZmljIChEQnVzQWRkcmVzc0VudHJ5ICAqZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1RyYW5zcG9ydCAgICAqKnRyYW5zcG9ydF9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgICplcnJvcikKK3sKKyAgLyogY3VycmVudGx5IG5vIFdpbmRvd3Mtc3BlY2lmaWMgdHJhbnNwb3J0cyAqLworICByZXR1cm4gREJVU19UUkFOU1BPUlRfT1BFTl9OT1RfSEFORExFRDsKK30KKworLyoqIEB9ICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtdHJhbnNwb3J0LXdpbi5oIGIvZGJ1cy9kYnVzLXRyYW5zcG9ydC13aW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjk5N2EyCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLXRyYW5zcG9ydC13aW4uaApAQCAtMCwwICsxLDMzIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtdHJhbnNwb3J0LXdpbi5oIFdpbmRvd3Mgc29ja2V0IHN1YmNsYXNzZXMgb2YgREJ1c1RyYW5zcG9ydAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiAgUmVkIEhhdCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmFsZiBIYWJhY2tlciA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworI2lmbmRlZiBEQlVTX1RSQU5TUE9SVF9XSU5fSAorI2RlZmluZSBEQlVTX1RSQU5TUE9SVF9XSU5fSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXRyYW5zcG9ydC5oPgorCitEQlVTX0JFR0lOX0RFQ0xTCisKK0RCVVNfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBEQlVTX1RSQU5TUE9SVF9XSU5fSCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLXRyYW5zcG9ydC5jIGIvZGJ1cy9kYnVzLXRyYW5zcG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyYTk2MTUKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtdHJhbnNwb3J0LmMKQEAgLTAsMCArMSwxNjE0IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtdHJhbnNwb3J0LmMgREJ1c1RyYW5zcG9ydCBvYmplY3QgKGludGVybmFsIHRvIEQtQnVzIGltcGxlbWVudGF0aW9uKQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMyAgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLXRyYW5zcG9ydC1wcm90ZWN0ZWQuaCIKKyNpbmNsdWRlICJkYnVzLXRyYW5zcG9ydC11bml4LmgiCisjaW5jbHVkZSAiZGJ1cy10cmFuc3BvcnQtc29ja2V0LmgiCisjaW5jbHVkZSAiZGJ1cy1jb25uZWN0aW9uLWludGVybmFsLmgiCisjaW5jbHVkZSAiZGJ1cy13YXRjaC5oIgorI2luY2x1ZGUgImRidXMtYXV0aC5oIgorI2luY2x1ZGUgImRidXMtYWRkcmVzcy5oIgorI2luY2x1ZGUgImRidXMtY3JlZGVudGlhbHMuaCIKKyNpbmNsdWRlICJkYnVzLW1haW5sb29wLmgiCisjaW5jbHVkZSAiZGJ1cy1tZXNzYWdlLmgiCisjaWZkZWYgREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMKKyNpbmNsdWRlICJkYnVzLXNlcnZlci1kZWJ1Zy1waXBlLmgiCisjZW5kaWYKKworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c1RyYW5zcG9ydCBEQnVzVHJhbnNwb3J0IG9iamVjdAorICogQGluZ3JvdXAgIERCdXNJbnRlcm5hbHMKKyAqIEBicmllZiAiQmFja2VuZCIgZm9yIGEgREJ1c0Nvbm5lY3Rpb24uCisgKgorICogVHlwZXMgYW5kIGZ1bmN0aW9ucyByZWxhdGVkIHRvIERCdXNUcmFuc3BvcnQuICBBIHRyYW5zcG9ydCBpcyBhbgorICogYWJzdHJhY3Rpb24gdGhhdCBjYW4gc2VuZCBhbmQgcmVjZWl2ZSBkYXRhIHZpYSB2YXJpb3VzIGtpbmRzIG9mCisgKiBuZXR3b3JrIGNvbm5lY3Rpb25zIG9yIG90aGVyIElQQyBtZWNoYW5pc21zLgorICogCisgKiBAeworICovCisKKy8qKgorICogQHR5cGVkZWYgREJ1c1RyYW5zcG9ydAorICoKKyAqIE9wYXF1ZSBvYmplY3QgcmVwcmVzZW50aW5nIGEgd2F5IG1lc3NhZ2Ugc3RyZWFtLgorICogREJ1c1RyYW5zcG9ydCBhYnN0cmFjdHMgdmFyaW91cyBraW5kcyBvZiBhY3R1YWwKKyAqIHRyYW5zcG9ydCBtZWNoYW5pc20sIHN1Y2ggYXMgZGlmZmVyZW50IG5ldHdvcmsgcHJvdG9jb2xzLAorICogb3IgZW5jcnlwdGlvbiBzY2hlbWVzLgorICovCisKK3N0YXRpYyB2b2lkCitsaXZlX21lc3NhZ2VzX25vdGlmeSAoREJ1c0NvdW50ZXIgKmNvdW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAqdXNlcl9kYXRhKQoreworICBEQnVzVHJhbnNwb3J0ICp0cmFuc3BvcnQgPSB1c2VyX2RhdGE7CisKKyAgX2RidXNfY29ubmVjdGlvbl9sb2NrICh0cmFuc3BvcnQtPmNvbm5lY3Rpb24pOworICBfZGJ1c190cmFuc3BvcnRfcmVmICh0cmFuc3BvcnQpOworCisjaWYgMAorICBfZGJ1c192ZXJib3NlICgiU2l6ZSBjb3VudGVyIHZhbHVlIGlzIG5vdyAlZFxuIiwKKyAgICAgICAgICAgICAgICAgKGludCkgX2RidXNfY291bnRlcl9nZXRfc2l6ZV92YWx1ZSAoY291bnRlcikpOworICBfZGJ1c192ZXJib3NlICgiVW5peCBGRCBjb3VudGVyIHZhbHVlIGlzIG5vdyAlZFxuIiwKKyAgICAgICAgICAgICAgICAgKGludCkgX2RidXNfY291bnRlcl9nZXRfdW5peF9mZF92YWx1ZSAoY291bnRlcikpOworI2VuZGlmCisKKyAgLyogZGlzYWJsZSBvciByZS1lbmFibGUgdGhlIHJlYWQgd2F0Y2ggZm9yIHRoZSB0cmFuc3BvcnQgaWYKKyAgICogcmVxdWlyZWQuCisgICAqLworICBpZiAodHJhbnNwb3J0LT52dGFibGUtPmxpdmVfbWVzc2FnZXNfY2hhbmdlZCkKKyAgICB7CisgICAgICAoKiB0cmFuc3BvcnQtPnZ0YWJsZS0+bGl2ZV9tZXNzYWdlc19jaGFuZ2VkKSAodHJhbnNwb3J0KTsKKyAgICB9CisKKyAgX2RidXNfdHJhbnNwb3J0X3VucmVmICh0cmFuc3BvcnQpOworICBfZGJ1c19jb25uZWN0aW9uX3VubG9jayAodHJhbnNwb3J0LT5jb25uZWN0aW9uKTsKK30KKworLyoqCisgKiBJbml0aWFsaXplcyB0aGUgYmFzZSBjbGFzcyBtZW1iZXJzIG9mIERCdXNUcmFuc3BvcnQuICBDaGFpbmVkIHVwIHRvCisgKiBieSBzdWJjbGFzc2VzIGluIHRoZWlyIGNvbnN0cnVjdG9yLiAgVGhlIHNlcnZlciBHVUlEIGlzIHRoZQorICogZ2xvYmFsbHkgdW5pcXVlIElEIGZvciB0aGUgc2VydmVyIGNyZWF0aW5nIHRoaXMgY29ubmVjdGlvbgorICogYW5kIHdpbGwgYmUgI05VTEwgZm9yIHRoZSBjbGllbnQgc2lkZSBvZiBhIGNvbm5lY3Rpb24uIFRoZSBHVUlECisgKiBpcyBpbiBoZXggZm9ybWF0LgorICoKKyAqIEBwYXJhbSB0cmFuc3BvcnQgdGhlIHRyYW5zcG9ydCBiZWluZyBjcmVhdGVkLgorICogQHBhcmFtIHZ0YWJsZSB0aGUgc3ViY2xhc3MgdnRhYmxlLgorICogQHBhcmFtIHNlcnZlcl9ndWlkIG5vbi0jTlVMTCBpZiB0aGlzIHRyYW5zcG9ydCBpcyBvbiB0aGUgc2VydmVyIHNpZGUgb2YgYSBjb25uZWN0aW9uCisgKiBAcGFyYW0gYWRkcmVzcyB0aGUgYWRkcmVzcyBvZiB0aGUgdHJhbnNwb3J0CisgKiBAcmV0dXJucyAjVFJVRSBvbiBzdWNjZXNzLgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfdHJhbnNwb3J0X2luaXRfYmFzZSAoREJ1c1RyYW5zcG9ydCAgICAgICAgICAgICAqdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1RyYW5zcG9ydFZUYWJsZSAqdnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAgICAgICAgICAqc2VydmVyX2d1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICAgICAgICAgICphZGRyZXNzKQoreworICBEQnVzTWVzc2FnZUxvYWRlciAqbG9hZGVyOworICBEQnVzQXV0aCAqYXV0aDsKKyAgREJ1c0NvdW50ZXIgKmNvdW50ZXI7CisgIGNoYXIgKmFkZHJlc3NfY29weTsKKyAgREJ1c0NyZWRlbnRpYWxzICpjcmVkczsKKyAgCisgIGxvYWRlciA9IF9kYnVzX21lc3NhZ2VfbG9hZGVyX25ldyAoKTsKKyAgaWYgKGxvYWRlciA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKyAgCisgIGlmIChzZXJ2ZXJfZ3VpZCkKKyAgICBhdXRoID0gX2RidXNfYXV0aF9zZXJ2ZXJfbmV3IChzZXJ2ZXJfZ3VpZCk7CisgIGVsc2UKKyAgICBhdXRoID0gX2RidXNfYXV0aF9jbGllbnRfbmV3ICgpOworICBpZiAoYXV0aCA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX21lc3NhZ2VfbG9hZGVyX3VucmVmIChsb2FkZXIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBjb3VudGVyID0gX2RidXNfY291bnRlcl9uZXcgKCk7CisgIGlmIChjb3VudGVyID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfYXV0aF91bnJlZiAoYXV0aCk7CisgICAgICBfZGJ1c19tZXNzYWdlX2xvYWRlcl91bnJlZiAobG9hZGVyKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9ICAKKworICBjcmVkcyA9IF9kYnVzX2NyZWRlbnRpYWxzX25ldyAoKTsKKyAgaWYgKGNyZWRzID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfY291bnRlcl91bnJlZiAoY291bnRlcik7CisgICAgICBfZGJ1c19hdXRoX3VucmVmIChhdXRoKTsKKyAgICAgIF9kYnVzX21lc3NhZ2VfbG9hZGVyX3VucmVmIChsb2FkZXIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgCisgIGlmIChzZXJ2ZXJfZ3VpZCkKKyAgICB7CisgICAgICBfZGJ1c19hc3NlcnQgKGFkZHJlc3MgPT0gTlVMTCk7CisgICAgICBhZGRyZXNzX2NvcHkgPSBOVUxMOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydCAoYWRkcmVzcyAhPSBOVUxMKTsKKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfY29weV9kYXRhIChhZGRyZXNzLCAmYWRkcmVzc19jb3B5KSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX2NyZWRlbnRpYWxzX3VucmVmIChjcmVkcyk7CisgICAgICAgICAgX2RidXNfY291bnRlcl91bnJlZiAoY291bnRlcik7CisgICAgICAgICAgX2RidXNfYXV0aF91bnJlZiAoYXV0aCk7CisgICAgICAgICAgX2RidXNfbWVzc2FnZV9sb2FkZXJfdW5yZWYgKGxvYWRlcik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgfQorICAKKyAgdHJhbnNwb3J0LT5yZWZjb3VudCA9IDE7CisgIHRyYW5zcG9ydC0+dnRhYmxlID0gdnRhYmxlOworICB0cmFuc3BvcnQtPmxvYWRlciA9IGxvYWRlcjsKKyAgdHJhbnNwb3J0LT5hdXRoID0gYXV0aDsKKyAgdHJhbnNwb3J0LT5saXZlX21lc3NhZ2VzID0gY291bnRlcjsKKyAgdHJhbnNwb3J0LT5hdXRoZW50aWNhdGVkID0gRkFMU0U7CisgIHRyYW5zcG9ydC0+ZGlzY29ubmVjdGVkID0gRkFMU0U7CisgIHRyYW5zcG9ydC0+aXNfc2VydmVyID0gKHNlcnZlcl9ndWlkICE9IE5VTEwpOworICB0cmFuc3BvcnQtPnNlbmRfY3JlZGVudGlhbHNfcGVuZGluZyA9ICF0cmFuc3BvcnQtPmlzX3NlcnZlcjsKKyAgdHJhbnNwb3J0LT5yZWNlaXZlX2NyZWRlbnRpYWxzX3BlbmRpbmcgPSB0cmFuc3BvcnQtPmlzX3NlcnZlcjsKKyAgdHJhbnNwb3J0LT5hZGRyZXNzID0gYWRkcmVzc19jb3B5OworICAKKyAgdHJhbnNwb3J0LT51bml4X3VzZXJfZnVuY3Rpb24gPSBOVUxMOworICB0cmFuc3BvcnQtPnVuaXhfdXNlcl9kYXRhID0gTlVMTDsKKyAgdHJhbnNwb3J0LT5mcmVlX3VuaXhfdXNlcl9kYXRhID0gTlVMTDsKKworICB0cmFuc3BvcnQtPndpbmRvd3NfdXNlcl9mdW5jdGlvbiA9IE5VTEw7CisgIHRyYW5zcG9ydC0+d2luZG93c191c2VyX2RhdGEgPSBOVUxMOworICB0cmFuc3BvcnQtPmZyZWVfd2luZG93c191c2VyX2RhdGEgPSBOVUxMOworICAKKyAgdHJhbnNwb3J0LT5leHBlY3RlZF9ndWlkID0gTlVMTDsKKyAgCisgIC8qIFRyeSB0byBkZWZhdWx0IHRvIHNvbWV0aGluZyB0aGF0IHdvbid0IHRvdGFsbHkgaG9zZSB0aGUgc3lzdGVtLAorICAgKiBidXQgZG9lc24ndCBpbXBvc2UgdG9vIG11Y2ggb2YgYSBsaW1pdGF0aW9uLgorICAgKi8KKyAgdHJhbnNwb3J0LT5tYXhfbGl2ZV9tZXNzYWdlc19zaXplID0gX0RCVVNfT05FX01FR0FCWVRFICogNjM7CisKKyAgLyogT24gTGludXggUkxJTUlUX05PRklMRSBkZWZhdWx0cyB0byAxMDI0LCBzbyBhbGxvd2luZyA0MDk2IGZkcyBsaXZlCisgICAgIHNob3VsZCBiZSBtb3JlIHRoYW4gZW5vdWdoICovCisgIHRyYW5zcG9ydC0+bWF4X2xpdmVfbWVzc2FnZXNfdW5peF9mZHMgPSA0MDk2OworCisgIC8qIGNyZWRlbnRpYWxzIHJlYWQgZnJvbSBzb2NrZXQgaWYgYW55ICovCisgIHRyYW5zcG9ydC0+Y3JlZGVudGlhbHMgPSBjcmVkczsKKworICBfZGJ1c19jb3VudGVyX3NldF9ub3RpZnkgKHRyYW5zcG9ydC0+bGl2ZV9tZXNzYWdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQtPm1heF9saXZlX21lc3NhZ2VzX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0LT5tYXhfbGl2ZV9tZXNzYWdlc191bml4X2ZkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXZlX21lc3NhZ2VzX25vdGlmeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQpOworCisgIGlmICh0cmFuc3BvcnQtPmFkZHJlc3MpCisgICAgX2RidXNfdmVyYm9zZSAoIkluaXRpYWxpemVkIHRyYW5zcG9ydCBvbiBhZGRyZXNzICVzXG4iLCB0cmFuc3BvcnQtPmFkZHJlc3MpOworCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIEZpbmFsaXplcyBiYXNlIGNsYXNzIG1lbWJlcnMgb2YgREJ1c1RyYW5zcG9ydC4KKyAqIENoYWluZWQgdXAgdG8gZnJvbSBzdWJjbGFzcyBmaW5hbGl6ZXJzLgorICoKKyAqIEBwYXJhbSB0cmFuc3BvcnQgdGhlIHRyYW5zcG9ydC4KKyAqLwordm9pZAorX2RidXNfdHJhbnNwb3J0X2ZpbmFsaXplX2Jhc2UgKERCdXNUcmFuc3BvcnQgKnRyYW5zcG9ydCkKK3sKKyAgaWYgKCF0cmFuc3BvcnQtPmRpc2Nvbm5lY3RlZCkKKyAgICBfZGJ1c190cmFuc3BvcnRfZGlzY29ubmVjdCAodHJhbnNwb3J0KTsKKworICBpZiAodHJhbnNwb3J0LT5mcmVlX3VuaXhfdXNlcl9kYXRhICE9IE5VTEwpCisgICAgKCogdHJhbnNwb3J0LT5mcmVlX3VuaXhfdXNlcl9kYXRhKSAodHJhbnNwb3J0LT51bml4X3VzZXJfZGF0YSk7CisKKyAgaWYgKHRyYW5zcG9ydC0+ZnJlZV93aW5kb3dzX3VzZXJfZGF0YSAhPSBOVUxMKQorICAgICgqIHRyYW5zcG9ydC0+ZnJlZV93aW5kb3dzX3VzZXJfZGF0YSkgKHRyYW5zcG9ydC0+d2luZG93c191c2VyX2RhdGEpOworICAKKyAgX2RidXNfbWVzc2FnZV9sb2FkZXJfdW5yZWYgKHRyYW5zcG9ydC0+bG9hZGVyKTsKKyAgX2RidXNfYXV0aF91bnJlZiAodHJhbnNwb3J0LT5hdXRoKTsKKyAgX2RidXNfY291bnRlcl9zZXRfbm90aWZ5ICh0cmFuc3BvcnQtPmxpdmVfbWVzc2FnZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgTlVMTCwgTlVMTCk7CisgIF9kYnVzX2NvdW50ZXJfdW5yZWYgKHRyYW5zcG9ydC0+bGl2ZV9tZXNzYWdlcyk7CisgIGRidXNfZnJlZSAodHJhbnNwb3J0LT5hZGRyZXNzKTsKKyAgZGJ1c19mcmVlICh0cmFuc3BvcnQtPmV4cGVjdGVkX2d1aWQpOworICBpZiAodHJhbnNwb3J0LT5jcmVkZW50aWFscykKKyAgICBfZGJ1c19jcmVkZW50aWFsc191bnJlZiAodHJhbnNwb3J0LT5jcmVkZW50aWFscyk7Cit9CisKKworLyoqCisgKiBWZXJpZmllcyBpZiBhIGdpdmVuIEQtQnVzIGFkZHJlc3MgaXMgYSB2YWxpZCBhZGRyZXNzCisgKiBieSBhdHRlbXB0aW5nIHRvIGNvbm5lY3QgdG8gaXQuIElmIGl0IGlzLCByZXR1cm5zIHRoZQorICogb3BlbmVkIERCdXNUcmFuc3BvcnQgb2JqZWN0LiBJZiBpdCBpc24ndCwgcmV0dXJucyAjTlVMTAorICogYW5kIHNldHMgQHAgZXJyb3IuCisgKgorICogQHBhcmFtIGFkZHJlc3MgdGhlIGFkZHJlc3MgdG8gYmUgY2hlY2tlZC4KKyAqIEBwYXJhbSBlcnJvciBhZGRyZXNzIHdoZXJlIGFuIGVycm9yIGNhbiBiZSByZXR1cm5lZC4KKyAqIEByZXR1cm5zIGEgbmV3IHRyYW5zcG9ydCwgb3IgI05VTEwgb24gZmFpbHVyZS4KKyAqLworc3RhdGljIERCdXNUcmFuc3BvcnQqCitjaGVja19hZGRyZXNzIChjb25zdCBjaGFyICphZGRyZXNzLCBEQnVzRXJyb3IgKmVycm9yKQoreworICBEQnVzQWRkcmVzc0VudHJ5ICoqZW50cmllczsKKyAgREJ1c1RyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKKyAgaW50IGxlbiwgaTsKKworICBfZGJ1c19hc3NlcnQgKGFkZHJlc3MgIT0gTlVMTCk7CisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIGlmICghZGJ1c19wYXJzZV9hZGRyZXNzIChhZGRyZXNzLCAmZW50cmllcywgJmxlbiwgZXJyb3IpKQorICAgIHJldHVybiBOVUxMOyAgICAgICAgICAgICAgLyogbm90IGEgdmFsaWQgYWRkcmVzcyAqLworCisgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKyAgICB7CisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKGVycm9yKTsKKyAgICAgIHRyYW5zcG9ydCA9IF9kYnVzX3RyYW5zcG9ydF9vcGVuIChlbnRyaWVzW2ldLCBlcnJvcik7CisKKyAgICAgIGlmICh0cmFuc3BvcnQgIT0gTlVMTCkKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgIGRidXNfYWRkcmVzc19lbnRyaWVzX2ZyZWUgKGVudHJpZXMpOworICByZXR1cm4gdHJhbnNwb3J0OworfQorCisvKioKKyAqIENyZWF0ZXMgYSBuZXcgdHJhbnNwb3J0IGZvciB0aGUgImF1dG9zdGFydCIgbWV0aG9kLgorICogVGhpcyBjcmVhdGVzIGEgY2xpZW50LXNpZGUgb2YgYSB0cmFuc3BvcnQuCisgKgorICogQHBhcmFtIHNjb3BlIHNjb3BlIG9mIGF1dG9sYXVuY2ggKFdpbmRvd3Mgb25seSkKKyAqIEBwYXJhbSBlcnJvciBhZGRyZXNzIHdoZXJlIGFuIGVycm9yIGNhbiBiZSByZXR1cm5lZC4KKyAqIEByZXR1cm5zIGEgbmV3IHRyYW5zcG9ydCwgb3IgI05VTEwgb24gZmFpbHVyZS4KKyAqLworc3RhdGljIERCdXNUcmFuc3BvcnQqCitfZGJ1c190cmFuc3BvcnRfbmV3X2Zvcl9hdXRvbGF1bmNoIChjb25zdCBjaGFyICpzY29wZSwgREJ1c0Vycm9yICplcnJvcikKK3sKKyAgREJ1c1N0cmluZyBhZGRyZXNzOworICBEQnVzVHJhbnNwb3J0ICpyZXN1bHQgPSBOVUxMOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZhZGRyZXNzKSkKKyAgICB7CisgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBpZiAoIV9kYnVzX2dldF9hdXRvbGF1bmNoX2FkZHJlc3MgKHNjb3BlLCAmYWRkcmVzcywgZXJyb3IpKQorICAgIHsKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICByZXN1bHQgPSBjaGVja19hZGRyZXNzIChfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZhZGRyZXNzKSwgZXJyb3IpOworICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICBlbHNlCisgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisKKyBvdXQ6CisgIF9kYnVzX3N0cmluZ19mcmVlICgmYWRkcmVzcyk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBEQnVzVHJhbnNwb3J0T3BlblJlc3VsdAorX2RidXNfdHJhbnNwb3J0X29wZW5fYXV0b2xhdW5jaCAoREJ1c0FkZHJlc3NFbnRyeSAgKmVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1RyYW5zcG9ydCAgICAqKnRyYW5zcG9ydF9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgKmVycm9yKQoreworICBjb25zdCBjaGFyICptZXRob2Q7CisgIAorICBtZXRob2QgPSBkYnVzX2FkZHJlc3NfZW50cnlfZ2V0X21ldGhvZCAoZW50cnkpOworICBfZGJ1c19hc3NlcnQgKG1ldGhvZCAhPSBOVUxMKTsKKworICBpZiAoc3RyY21wIChtZXRob2QsICJhdXRvbGF1bmNoIikgPT0gMCkKKyAgICB7CisgICAgICBjb25zdCBjaGFyICpzY29wZSA9IGRidXNfYWRkcmVzc19lbnRyeV9nZXRfdmFsdWUgKGVudHJ5LCAic2NvcGUiKTsKKworICAgICAgKnRyYW5zcG9ydF9wID0gX2RidXNfdHJhbnNwb3J0X25ld19mb3JfYXV0b2xhdW5jaCAoc2NvcGUsIGVycm9yKTsKKworICAgICAgaWYgKCp0cmFuc3BvcnRfcCA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgICAgIHJldHVybiBEQlVTX1RSQU5TUE9SVF9PUEVOX0RJRF9OT1RfQ09OTkVDVDsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSIChlcnJvcik7CisgICAgICAgICAgcmV0dXJuIERCVVNfVFJBTlNQT1JUX09QRU5fT0s7CisgICAgICAgIH0gICAgICAKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKyAgICAgIHJldHVybiBEQlVTX1RSQU5TUE9SVF9PUEVOX05PVF9IQU5ETEVEOworICAgIH0KK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCB7CisgIERCdXNUcmFuc3BvcnRPcGVuUmVzdWx0ICgqIGZ1bmMpIChEQnVzQWRkcmVzc0VudHJ5ICplbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNUcmFuc3BvcnQgICAqKnRyYW5zcG9ydF9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAqZXJyb3IpOworfSBvcGVuX2Z1bmNzW10gPSB7CisgIHsgX2RidXNfdHJhbnNwb3J0X29wZW5fc29ja2V0IH0sCisgIHsgX2RidXNfdHJhbnNwb3J0X29wZW5fcGxhdGZvcm1fc3BlY2lmaWMgfSwKKyAgeyBfZGJ1c190cmFuc3BvcnRfb3Blbl9hdXRvbGF1bmNoIH0KKyNpZmRlZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworICAsIHsgX2RidXNfdHJhbnNwb3J0X29wZW5fZGVidWdfcGlwZSB9CisjZW5kaWYKK307CisKKy8qKgorICogVHJ5IHRvIG9wZW4gYSBuZXcgdHJhbnNwb3J0IGZvciB0aGUgZ2l2ZW4gYWRkcmVzcyBlbnRyeS4gIChUaGlzCisgKiBvcGVucyBhIGNsaWVudC1zaWRlLW9mLXRoZS1jb25uZWN0aW9uIHRyYW5zcG9ydC4pCisgKiAKKyAqIEBwYXJhbSBlbnRyeSB0aGUgYWRkcmVzcyBlbnRyeQorICogQHBhcmFtIGVycm9yIGxvY2F0aW9uIHRvIHN0b3JlIHJlYXNvbiBmb3IgZmFpbHVyZS4KKyAqIEByZXR1cm5zIG5ldyB0cmFuc3BvcnQgb2YgI05VTEwgb24gZmFpbHVyZS4KKyAqLworREJ1c1RyYW5zcG9ydCoKK19kYnVzX3RyYW5zcG9ydF9vcGVuIChEQnVzQWRkcmVzc0VudHJ5ICplbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgREJ1c1RyYW5zcG9ydCAqdHJhbnNwb3J0OworICBjb25zdCBjaGFyICpleHBlY3RlZF9ndWlkX29yaWc7CisgIGNoYXIgKmV4cGVjdGVkX2d1aWQ7CisgIGludCBpOworICBEQnVzRXJyb3IgdG1wX2Vycm9yID0gREJVU19FUlJPUl9JTklUOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworICAKKyAgdHJhbnNwb3J0ID0gTlVMTDsKKyAgZXhwZWN0ZWRfZ3VpZF9vcmlnID0gZGJ1c19hZGRyZXNzX2VudHJ5X2dldF92YWx1ZSAoZW50cnksICJndWlkIik7CisgIGV4cGVjdGVkX2d1aWQgPSBfZGJ1c19zdHJkdXAgKGV4cGVjdGVkX2d1aWRfb3JpZyk7CisKKyAgaWYgKGV4cGVjdGVkX2d1aWRfb3JpZyAhPSBOVUxMICYmIGV4cGVjdGVkX2d1aWQgPT0gTlVMTCkKKyAgICB7CisgICAgICBfREJVU19TRVRfT09NIChlcnJvcik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgZm9yIChpID0gMDsgaSA8IChpbnQpIF9EQlVTX05fRUxFTUVOVFMgKG9wZW5fZnVuY3MpOyArK2kpCisgICAgeworICAgICAgREJ1c1RyYW5zcG9ydE9wZW5SZXN1bHQgcmVzdWx0OworCisgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKCZ0bXBfZXJyb3IpOworICAgICAgcmVzdWx0ID0gKCogb3Blbl9mdW5jc1tpXS5mdW5jKSAoZW50cnksICZ0cmFuc3BvcnQsICZ0bXBfZXJyb3IpOworCisgICAgICBzd2l0Y2ggKHJlc3VsdCkKKyAgICAgICAgeworICAgICAgICBjYXNlIERCVVNfVFJBTlNQT1JUX09QRU5fT0s6CisgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSICgmdG1wX2Vycm9yKTsKKyAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBEQlVTX1RSQU5TUE9SVF9PUEVOX05PVF9IQU5ETEVEOgorICAgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoJnRtcF9lcnJvcik7CisgICAgICAgICAgLyoga2VlcCBnb2luZyB0aHJvdWdoIHRoZSBsb29wIG9mIG9wZW4gZnVuY3MgKi8KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBEQlVTX1RSQU5TUE9SVF9PUEVOX0JBRF9BRERSRVNTOgorICAgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKCZ0bXBfZXJyb3IpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIERCVVNfVFJBTlNQT1JUX09QRU5fRElEX05PVF9DT05ORUNUOgorICAgICAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKCZ0bXBfZXJyb3IpOworICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImludmFsaWQgdHJhbnNwb3J0IG9wZW4gcmVzdWx0Iik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyBvdXQ6CisgIAorICBpZiAodHJhbnNwb3J0ID09IE5VTEwpCisgICAgeworICAgICAgaWYgKCFkYnVzX2Vycm9yX2lzX3NldCAoJnRtcF9lcnJvcikpCisgICAgICAgIF9kYnVzX3NldF9iYWRfYWRkcmVzcyAoJnRtcF9lcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmtub3duIGFkZHJlc3MgdHlwZSAoZXhhbXBsZXMgb2YgdmFsaWQgdHlwZXMgYXJlIFwidGNwXCIgYW5kIG9uIFVOSVggXCJ1bml4XCIpIik7CisgICAgICAKKyAgICAgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKCZ0bXBfZXJyb3IpOworICAgICAgZGJ1c19tb3ZlX2Vycm9yKCZ0bXBfZXJyb3IsIGVycm9yKTsKKyAgICAgIGRidXNfZnJlZSAoZXhwZWN0ZWRfZ3VpZCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX0NMRUFSICgmdG1wX2Vycm9yKTsKKworICAgICAgLyogSW4gdGhlIGNhc2Ugb2YgYXV0b3N0YXJ0IHRoZSBpbml0aWFsIGd1aWQgaXMgTlVMTAorICAgICAgICogYW5kIHRoZSBhdXRvc3RhcnQgdHJhbnNwb3J0IHJlY3Vyc2l2ZWx5IGNhbGxzCisgICAgICAgKiBfZGJ1c19vcGVuX3RyYW5zcG9ydCB3aWNoIHJldHVybnMgYSB0cmFuc3BvcnQKKyAgICAgICAqIHdpdGggYSBndWlkLiAgVGhhdCBndWlkIGlzIHRoZSBkZWZpbml0aXZlIG9uZS4KKyAgICAgICAqCisgICAgICAgKiBGSVhNRTogaWYgbW9yZSB0cmFuc3BvcnRzIGFyZSBhZGRlZCB0aGV5IG1heSBoYXZlCisgICAgICAgKiBhbiBlZmZlY3Qgb24gdGhlIGV4cGVjdGVkX2d1aWQgc2VtYW50aWNzIChpLmUuIAorICAgICAgICogZXhwZWN0ZWRfZ3VpZCBhbmQgdHJhbnNwb3J0LT5leHBlY3RlZF9ndWlkIG1heQorICAgICAgICogYm90aCBoYXZlIHZhbHVlcykuICBUaGlzIGlzIHZlcnkgdW5saWtlbHkgdGhvdWdoCisgICAgICAgKiB3ZSBzaG91bGQgZWl0aGVyIHRocm93IGFzc2VydHMgaGVyZSBmb3IgdGhvc2UgCisgICAgICAgKiBjb3JuZXIgY2FzZXMgb3IgcmVmYWN0b3IgdGhlIGNvZGUgc28gaXQgaXMgCisgICAgICAgKiBjbGVhcmVyIG9uIHdoYXQgaXMgZXhwZWN0ZWQgYW5kIHdoYXQgaXMgbm90CisgICAgICAgKi8KKyAgICAgIGlmKGV4cGVjdGVkX2d1aWQpCisgICAgICAgIHRyYW5zcG9ydC0+ZXhwZWN0ZWRfZ3VpZCA9IGV4cGVjdGVkX2d1aWQ7CisgICAgfQorCisgIHJldHVybiB0cmFuc3BvcnQ7Cit9CisKKy8qKgorICogSW5jcmVtZW50cyB0aGUgcmVmZXJlbmNlIGNvdW50IGZvciB0aGUgdHJhbnNwb3J0LgorICoKKyAqIEBwYXJhbSB0cmFuc3BvcnQgdGhlIHRyYW5zcG9ydC4KKyAqIEByZXR1cm5zIHRoZSB0cmFuc3BvcnQuCisgKi8KK0RCdXNUcmFuc3BvcnQgKgorX2RidXNfdHJhbnNwb3J0X3JlZiAoREJ1c1RyYW5zcG9ydCAqdHJhbnNwb3J0KQoreworICBfZGJ1c19hc3NlcnQgKHRyYW5zcG9ydC0+cmVmY291bnQgPiAwKTsKKyAgCisgIHRyYW5zcG9ydC0+cmVmY291bnQgKz0gMTsKKworICByZXR1cm4gdHJhbnNwb3J0OworfQorCisvKioKKyAqIERlY3JlbWVudHMgdGhlIHJlZmVyZW5jZSBjb3VudCBmb3IgdGhlIHRyYW5zcG9ydC4KKyAqIERpc2Nvbm5lY3RzIGFuZCBmaW5hbGl6ZXMgdGhlIHRyYW5zcG9ydCBpZgorICogdGhlIHJlZmVyZW5jZSBjb3VudCByZWFjaGVzIHplcm8uCisgKgorICogQHBhcmFtIHRyYW5zcG9ydCB0aGUgdHJhbnNwb3J0LgorICovCit2b2lkCitfZGJ1c190cmFuc3BvcnRfdW5yZWYgKERCdXNUcmFuc3BvcnQgKnRyYW5zcG9ydCkKK3sKKyAgX2RidXNfYXNzZXJ0ICh0cmFuc3BvcnQgIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAodHJhbnNwb3J0LT5yZWZjb3VudCA+IDApOworICAKKyAgdHJhbnNwb3J0LT5yZWZjb3VudCAtPSAxOworICBpZiAodHJhbnNwb3J0LT5yZWZjb3VudCA9PSAwKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJmaW5hbGl6aW5nXG4iKTsKKyAgICAgIAorICAgICAgX2RidXNfYXNzZXJ0ICh0cmFuc3BvcnQtPnZ0YWJsZS0+ZmluYWxpemUgIT0gTlVMTCk7CisgICAgICAKKyAgICAgICgqIHRyYW5zcG9ydC0+dnRhYmxlLT5maW5hbGl6ZSkgKHRyYW5zcG9ydCk7CisgICAgfQorfQorCisvKioKKyAqIENsb3NlcyBvdXIgZW5kIG9mIHRoZSBjb25uZWN0aW9uIHRvIGEgcmVtb3RlIGFwcGxpY2F0aW9uLiBGdXJ0aGVyCisgKiBhdHRlbXB0cyB0byB1c2UgdGhpcyB0cmFuc3BvcnQgd2lsbCBmYWlsLiBPbmx5IHRoZSBmaXJzdCBjYWxsIHRvCisgKiBfZGJ1c190cmFuc3BvcnRfZGlzY29ubmVjdCgpIHdpbGwgaGF2ZSBhbiBlZmZlY3QuCisgKgorICogQHBhcmFtIHRyYW5zcG9ydCB0aGUgdHJhbnNwb3J0LgorICogCisgKi8KK3ZvaWQKK19kYnVzX3RyYW5zcG9ydF9kaXNjb25uZWN0IChEQnVzVHJhbnNwb3J0ICp0cmFuc3BvcnQpCit7CisgIF9kYnVzX3ZlcmJvc2UgKCJzdGFydFxuIik7CisgIAorICBfZGJ1c19hc3NlcnQgKHRyYW5zcG9ydC0+dnRhYmxlLT5kaXNjb25uZWN0ICE9IE5VTEwpOworICAKKyAgaWYgKHRyYW5zcG9ydC0+ZGlzY29ubmVjdGVkKQorICAgIHJldHVybjsKKworICAoKiB0cmFuc3BvcnQtPnZ0YWJsZS0+ZGlzY29ubmVjdCkgKHRyYW5zcG9ydCk7CisgIAorICB0cmFuc3BvcnQtPmRpc2Nvbm5lY3RlZCA9IFRSVUU7CisKKyAgX2RidXNfdmVyYm9zZSAoImVuZFxuIik7Cit9CisKKy8qKgorICogUmV0dXJucyAjVFJVRSBpZiB0aGUgdHJhbnNwb3J0IGhhcyBub3QgYmVlbiBkaXNjb25uZWN0ZWQuCisgKiBEaXNjb25uZWN0aW9uIGNhbiByZXN1bHQgZnJvbSBfZGJ1c190cmFuc3BvcnRfZGlzY29ubmVjdCgpCisgKiBvciBiZWNhdXNlIHRoZSBzZXJ2ZXIgZHJvcHMgaXRzIGVuZCBvZiB0aGUgY29ubmVjdGlvbi4KKyAqCisgKiBAcGFyYW0gdHJhbnNwb3J0IHRoZSB0cmFuc3BvcnQuCisgKiBAcmV0dXJucyB3aGV0aGVyIHdlJ3JlIGNvbm5lY3RlZAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfdHJhbnNwb3J0X2dldF9pc19jb25uZWN0ZWQgKERCdXNUcmFuc3BvcnQgKnRyYW5zcG9ydCkKK3sKKyAgcmV0dXJuICF0cmFuc3BvcnQtPmRpc2Nvbm5lY3RlZDsKK30KKworc3RhdGljIGRidXNfYm9vbF90CithdXRoX3ZpYV91bml4X3VzZXJfZnVuY3Rpb24gKERCdXNUcmFuc3BvcnQgKnRyYW5zcG9ydCkKK3sKKyAgREJ1c0NyZWRlbnRpYWxzICphdXRoX2lkZW50aXR5OworICBkYnVzX2Jvb2xfdCBhbGxvdzsKKyAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisgIERCdXNBbGxvd1VuaXhVc2VyRnVuY3Rpb24gdW5peF91c2VyX2Z1bmN0aW9uOworICB2b2lkICp1bml4X3VzZXJfZGF0YTsKKyAgZGJ1c191aWRfdCB1aWQ7CisKKyAgLyogRHJvcHBpbmcgdGhlIGxvY2sgaGVyZSBwcm9iYWJseSBpc24ndCB0aGF0IHNhZmUuICovCisgIAorICBhdXRoX2lkZW50aXR5ID0gX2RidXNfYXV0aF9nZXRfaWRlbnRpdHkgKHRyYW5zcG9ydC0+YXV0aCk7CisgIF9kYnVzX2Fzc2VydCAoYXV0aF9pZGVudGl0eSAhPSBOVUxMKTsKKworICBjb25uZWN0aW9uID0gdHJhbnNwb3J0LT5jb25uZWN0aW9uOworICB1bml4X3VzZXJfZnVuY3Rpb24gPSB0cmFuc3BvcnQtPnVuaXhfdXNlcl9mdW5jdGlvbjsKKyAgdW5peF91c2VyX2RhdGEgPSB0cmFuc3BvcnQtPnVuaXhfdXNlcl9kYXRhOworICB1aWQgPSBfZGJ1c19jcmVkZW50aWFsc19nZXRfdW5peF91aWQgKGF1dGhfaWRlbnRpdHkpOworICAgICAgICAgICAgICAKKyAgX2RidXNfdmVyYm9zZSAoInVubG9ja1xuIik7CisgIF9kYnVzX2Nvbm5lY3Rpb25fdW5sb2NrIChjb25uZWN0aW9uKTsKKworICBhbGxvdyA9ICgqIHVuaXhfdXNlcl9mdW5jdGlvbikgKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXhfdXNlcl9kYXRhKTsKKyAgICAgICAgICAgICAgCisgIF9kYnVzX3ZlcmJvc2UgKCJsb2NrIHBvc3QgdW5peCB1c2VyIGZ1bmN0aW9uXG4iKTsKKyAgX2RidXNfY29ubmVjdGlvbl9sb2NrIChjb25uZWN0aW9uKTsKKworICBpZiAoYWxsb3cpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIkNsaWVudCBVSUQgIkRCVVNfVUlEX0ZPUk1BVCIgYXV0aG9yaXplZFxuIiwgdWlkKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfZGJ1c192ZXJib3NlICgiQ2xpZW50IFVJRCAiREJVU19VSURfRk9STUFUCisgICAgICAgICAgICAgICAgICAgICAiIHdhcyByZWplY3RlZCwgZGlzY29ubmVjdGluZ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgIF9kYnVzX2NyZWRlbnRpYWxzX2dldF91bml4X3VpZCAoYXV0aF9pZGVudGl0eSkpOworICAgICAgX2RidXNfdHJhbnNwb3J0X2Rpc2Nvbm5lY3QgKHRyYW5zcG9ydCk7CisgICAgfQorCisgIHJldHVybiBhbGxvdzsKK30KKworc3RhdGljIGRidXNfYm9vbF90CithdXRoX3ZpYV93aW5kb3dzX3VzZXJfZnVuY3Rpb24gKERCdXNUcmFuc3BvcnQgKnRyYW5zcG9ydCkKK3sKKyAgREJ1c0NyZWRlbnRpYWxzICphdXRoX2lkZW50aXR5OyAgCisgIGRidXNfYm9vbF90IGFsbG93OworICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKyAgREJ1c0FsbG93V2luZG93c1VzZXJGdW5jdGlvbiB3aW5kb3dzX3VzZXJfZnVuY3Rpb247CisgIHZvaWQgKndpbmRvd3NfdXNlcl9kYXRhOworICBjaGFyICp3aW5kb3dzX3NpZDsKKworICAvKiBEcm9wcGluZyB0aGUgbG9jayBoZXJlIHByb2JhYmx5IGlzbid0IHRoYXQgc2FmZS4gKi8KKyAgCisgIGF1dGhfaWRlbnRpdHkgPSBfZGJ1c19hdXRoX2dldF9pZGVudGl0eSAodHJhbnNwb3J0LT5hdXRoKTsKKyAgX2RidXNfYXNzZXJ0IChhdXRoX2lkZW50aXR5ICE9IE5VTEwpOworCisgIGNvbm5lY3Rpb24gPSB0cmFuc3BvcnQtPmNvbm5lY3Rpb247CisgIHdpbmRvd3NfdXNlcl9mdW5jdGlvbiA9IHRyYW5zcG9ydC0+d2luZG93c191c2VyX2Z1bmN0aW9uOworICB3aW5kb3dzX3VzZXJfZGF0YSA9IHRyYW5zcG9ydC0+dW5peF91c2VyX2RhdGE7CisgIHdpbmRvd3Nfc2lkID0gX2RidXNfc3RyZHVwIChfZGJ1c19jcmVkZW50aWFsc19nZXRfd2luZG93c19zaWQgKGF1dGhfaWRlbnRpdHkpKTsKKworICBpZiAod2luZG93c19zaWQgPT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBPT00gKi8KKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgICAgICAgICAgICAgCisgIF9kYnVzX3ZlcmJvc2UgKCJ1bmxvY2tcbiIpOworICBfZGJ1c19jb25uZWN0aW9uX3VubG9jayAoY29ubmVjdGlvbik7CisKKyAgYWxsb3cgPSAoKiB3aW5kb3dzX3VzZXJfZnVuY3Rpb24pIChjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvd3Nfc2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvd3NfdXNlcl9kYXRhKTsKKyAgICAgICAgICAgICAgCisgIF9kYnVzX3ZlcmJvc2UgKCJsb2NrIHBvc3Qgd2luZG93cyB1c2VyIGZ1bmN0aW9uXG4iKTsKKyAgX2RidXNfY29ubmVjdGlvbl9sb2NrIChjb25uZWN0aW9uKTsKKworICBpZiAoYWxsb3cpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIkNsaWVudCBTSUQgJyVzJyBhdXRob3JpemVkXG4iLCB3aW5kb3dzX3NpZCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIkNsaWVudCBTSUQgJyVzJyB3YXMgcmVqZWN0ZWQsIGRpc2Nvbm5lY3RpbmdcbiIsCisgICAgICAgICAgICAgICAgICAgICBfZGJ1c19jcmVkZW50aWFsc19nZXRfd2luZG93c19zaWQgKGF1dGhfaWRlbnRpdHkpKTsKKyAgICAgIF9kYnVzX3RyYW5zcG9ydF9kaXNjb25uZWN0ICh0cmFuc3BvcnQpOworICAgIH0KKworICByZXR1cm4gYWxsb3c7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYXV0aF92aWFfZGVmYXVsdF9ydWxlcyAoREJ1c1RyYW5zcG9ydCAqdHJhbnNwb3J0KQoreworICBEQnVzQ3JlZGVudGlhbHMgKmF1dGhfaWRlbnRpdHk7CisgIERCdXNDcmVkZW50aWFscyAqb3VyX2lkZW50aXR5OworICBkYnVzX2Jvb2xfdCBhbGxvdzsKKyAgCisgIGF1dGhfaWRlbnRpdHkgPSBfZGJ1c19hdXRoX2dldF9pZGVudGl0eSAodHJhbnNwb3J0LT5hdXRoKTsKKyAgX2RidXNfYXNzZXJ0IChhdXRoX2lkZW50aXR5ICE9IE5VTEwpOworCisgIC8qIEJ5IGRlZmF1bHQsIGNvbm5lY3Rpb24gaXMgYWxsb3dlZCBpZiB0aGUgY2xpZW50IGlzIDEpIHJvb3Qgb3IgMikKKyAgICogaGFzIHRoZSBzYW1lIFVJRCBhcyB1cyBvciAzKSBhbm9ueW1vdXMgaXMgYWxsb3dlZC4KKyAgICovCisgIAorICBvdXJfaWRlbnRpdHkgPSBfZGJ1c19jcmVkZW50aWFsc19uZXdfZnJvbV9jdXJyZW50X3Byb2Nlc3MgKCk7CisgIGlmIChvdXJfaWRlbnRpdHkgPT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBPT00gKi8KKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgICAgICAgICAgIAorICBpZiAodHJhbnNwb3J0LT5hbGxvd19hbm9ueW1vdXMgfHwKKyAgICAgIF9kYnVzX2NyZWRlbnRpYWxzX2dldF91bml4X3VpZCAoYXV0aF9pZGVudGl0eSkgPT0gMCB8fAorICAgICAgX2RidXNfY3JlZGVudGlhbHNfc2FtZV91c2VyIChvdXJfaWRlbnRpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhfaWRlbnRpdHkpKQorICAgIHsKKyAgICAgIGlmIChfZGJ1c19jcmVkZW50aWFsc19pbmNsdWRlKG91cl9pZGVudGl0eSxEQlVTX0NSRURFTlRJQUxfV0lORE9XU19TSUQpKQorICAgICAgICAgIF9kYnVzX3ZlcmJvc2UgKCJDbGllbnQgYXV0aG9yaXplZCBhcyBTSUQgJyVzJyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAibWF0Y2hpbmcgb3VyIFNJRCAnJXMnXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX2NyZWRlbnRpYWxzX2dldF93aW5kb3dzX3NpZChhdXRoX2lkZW50aXR5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19jcmVkZW50aWFsc19nZXRfd2luZG93c19zaWQob3VyX2lkZW50aXR5KSk7CisgICAgICBlbHNlCisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkNsaWVudCBhdXRob3JpemVkIGFzIFVJRCAiREJVU19VSURfRk9STUFUCisgICAgICAgICAgICAgICAgICAgICAgICAgIiBtYXRjaGluZyBvdXIgVUlEICJEQlVTX1VJRF9GT1JNQVQiXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX2NyZWRlbnRpYWxzX2dldF91bml4X3VpZChhdXRoX2lkZW50aXR5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19jcmVkZW50aWFsc19nZXRfdW5peF91aWQob3VyX2lkZW50aXR5KSk7CisgICAgICAvKiBXZSBoYXZlIGF1dGhlbnRpY2F0ZWQhICovCisgICAgICBhbGxvdyA9IFRSVUU7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKF9kYnVzX2NyZWRlbnRpYWxzX2luY2x1ZGUob3VyX2lkZW50aXR5LERCVVNfQ1JFREVOVElBTF9XSU5ET1dTX1NJRCkpCisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkNsaWVudCBhdXRob3JpemVkIGFzIFNJRCAnJXMnIgorICAgICAgICAgICAgICAgICAgICAgICAgICIgYnV0IG91ciBTSUQgaXMgJyVzJywgZGlzY29ubmVjdGluZ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoX2RidXNfY3JlZGVudGlhbHNfZ2V0X3dpbmRvd3Nfc2lkKGF1dGhfaWRlbnRpdHkpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfY3JlZGVudGlhbHNfZ2V0X3dpbmRvd3Nfc2lkKGF1dGhfaWRlbnRpdHkpIDogIjxudWxsPiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIChfZGJ1c19jcmVkZW50aWFsc19nZXRfd2luZG93c19zaWQob3VyX2lkZW50aXR5KSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX2NyZWRlbnRpYWxzX2dldF93aW5kb3dzX3NpZChvdXJfaWRlbnRpdHkpIDogIjxudWxsPiIpKTsKKyAgICAgIGVsc2UKKyAgICAgICAgICBfZGJ1c192ZXJib3NlICgiQ2xpZW50IGF1dGhvcml6ZWQgYXMgVUlEICJEQlVTX1VJRF9GT1JNQVQKKyAgICAgICAgICAgICAgICAgICAgICAgICAiIGJ1dCBvdXIgVUlEIGlzICJEQlVTX1VJRF9GT1JNQVQiLCBkaXNjb25uZWN0aW5nXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX2NyZWRlbnRpYWxzX2dldF91bml4X3VpZChhdXRoX2lkZW50aXR5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19jcmVkZW50aWFsc19nZXRfdW5peF91aWQob3VyX2lkZW50aXR5KSk7CisgICAgICBfZGJ1c190cmFuc3BvcnRfZGlzY29ubmVjdCAodHJhbnNwb3J0KTsKKyAgICAgIGFsbG93ID0gRkFMU0U7CisgICAgfSAgCisKKyAgX2RidXNfY3JlZGVudGlhbHNfdW5yZWYgKG91cl9pZGVudGl0eSk7CisgIAorICByZXR1cm4gYWxsb3c7Cit9CisKKy8qKgorICogUmV0dXJucyAjVFJVRSBpZiB3ZSBoYXZlIGJlZW4gYXV0aGVudGljYXRlZC4gSXQgd2lsbCByZXR1cm4gI1RSVUUgZXZlbiBpZgorICogdGhlIHRyYW5zcG9ydCBpcyBub3cgZGlzY29ubmVjdGVkLCBidXQgd2FzIGV2ZXIgYXV0aGVudGljYXRlZCBiZWZvcmUKKyAqIGRpc2Nvbm5lY3RpbmcuCisgKgorICogVGhpcyByZXBsYWNlcyB0aGUgb2xkZXIgX2RidXNfdHJhbnNwb3J0X2dldF9pc19hdXRoZW50aWNhdGVkKCkgd2hpY2gKKyAqIGhhZCBzaWRlLWVmZmVjdHMuCisgKgorICogQHBhcmFtIHRyYW5zcG9ydCB0aGUgdHJhbnNwb3J0CisgKiBAcmV0dXJucyB3aGV0aGVyIHdlJ3JlIGF1dGhlbnRpY2F0ZWQKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3RyYW5zcG9ydF9wZWVrX2lzX2F1dGhlbnRpY2F0ZWQgKERCdXNUcmFuc3BvcnQgKnRyYW5zcG9ydCkKK3sKKyAgcmV0dXJuIHRyYW5zcG9ydC0+YXV0aGVudGljYXRlZDsKK30KKworLyoqCisgKiBSZXR1cm5zICNUUlVFIGlmIHdlIGhhdmUgYmVlbiBhdXRoZW50aWNhdGVkLiBJdCB3aWxsIHJldHVybiAjVFJVRSBldmVuIGlmCisgKiB0aGUgdHJhbnNwb3J0IGlzIG5vdyBkaXNjb25uZWN0ZWQsIGJ1dCB3YXMgZXZlciBhdXRoZW50aWNhdGVkIGJlZm9yZQorICogZGlzY29ubmVjdGluZy4KKyAqCisgKiBJZiB3ZSBoYXZlIG5vdCBmaW5pc2hlZCBhdXRoZW50aWNhdGluZywgYnV0IHdlIGhhdmUgZW5vdWdoIGJ1ZmZlcmVkIGlucHV0CisgKiB0byBmaW5pc2ggdGhlIGpvYiwgdGhlbiB0aGlzIGZ1bmN0aW9uIHdpbGwgZG8gc28gYmVmb3JlIGl0IHJldHVybnMuCisgKgorICogVGhpcyB1c2VkIHRvIGJlIGNhbGxlZCBfZGJ1c190cmFuc3BvcnRfZ2V0X2lzX2F1dGhlbnRpY2F0ZWQoKSwgYnV0IHRoYXQKKyAqIG5hbWUgc2VlbXMgaW5hcHByb3ByaWF0ZSBmb3IgYSBmdW5jdGlvbiB3aXRoIHNpZGUtZWZmZWN0cy4KKyAqCisgKiBAdG9kbyB3ZSBkcm9wIGNvbm5lY3Rpb24tPm11dGV4IHdoZW4gY2FsbGluZyB0aGUgdW5peF91c2VyX2Z1bmN0aW9uLAorICogYW5kIHdpbmRvd3NfdXNlcl9mdW5jdGlvbiwgd2hpY2ggbWF5IG5vdCBiZSBzYWZlIHJlYWxseS4KKyAqCisgKiBAcGFyYW0gdHJhbnNwb3J0IHRoZSB0cmFuc3BvcnQKKyAqIEByZXR1cm5zIHdoZXRoZXIgd2UncmUgYXV0aGVudGljYXRlZAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfdHJhbnNwb3J0X3RyeV90b19hdXRoZW50aWNhdGUgKERCdXNUcmFuc3BvcnQgKnRyYW5zcG9ydCkKK3sgIAorICBpZiAodHJhbnNwb3J0LT5hdXRoZW50aWNhdGVkKQorICAgIHJldHVybiBUUlVFOworICBlbHNlCisgICAgeworICAgICAgZGJ1c19ib29sX3QgbWF5YmVfYXV0aGVudGljYXRlZDsKKyAgICAgIAorICAgICAgaWYgKHRyYW5zcG9ydC0+ZGlzY29ubmVjdGVkKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIC8qIHBhcmFub2lhIHJlZiBzaW5jZSB3ZSBjYWxsIHVzZXIgY2FsbGJhY2tzIHNvbWV0aW1lcyAqLworICAgICAgX2RidXNfY29ubmVjdGlvbl9yZWZfdW5sb2NrZWQgKHRyYW5zcG9ydC0+Y29ubmVjdGlvbik7CisgICAgICAKKyAgICAgIG1heWJlX2F1dGhlbnRpY2F0ZWQgPQorICAgICAgICAoISh0cmFuc3BvcnQtPnNlbmRfY3JlZGVudGlhbHNfcGVuZGluZyB8fAorICAgICAgICAgICB0cmFuc3BvcnQtPnJlY2VpdmVfY3JlZGVudGlhbHNfcGVuZGluZykpOworCisgICAgICBpZiAobWF5YmVfYXV0aGVudGljYXRlZCkKKyAgICAgICAgeworICAgICAgICAgIHN3aXRjaCAoX2RidXNfYXV0aF9kb193b3JrICh0cmFuc3BvcnQtPmF1dGgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSBEQlVTX0FVVEhfU1RBVEVfQVVUSEVOVElDQVRFRDoKKyAgICAgICAgICAgICAgLyogbGVhdmUgYXMgbWF5YmVfYXV0aGVudGljYXRlZCAqLworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBEQlVTX0FVVEhfU1RBVEVfV0FJVElOR19GT1JfSU5QVVQ6CisgICAgICAgICAgICBjYXNlIERCVVNfQVVUSF9TVEFURV9XQUlUSU5HX0ZPUl9NRU1PUlk6CisgICAgICAgICAgICBjYXNlIERCVVNfQVVUSF9TVEFURV9IQVZFX0JZVEVTX1RPX1NFTkQ6CisgICAgICAgICAgICBjYXNlIERCVVNfQVVUSF9TVEFURV9ORUVEX0RJU0NPTk5FQ1Q6CisgICAgICAgICAgICAgIG1heWJlX2F1dGhlbnRpY2F0ZWQgPSBGQUxTRTsKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgREJVU19BVVRIX1NUQVRFX0lOVkFMSUQ6CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJpbnZhbGlkIGF1dGhlbnRpY2F0aW9uIHN0YXRlIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgLyogSWYgd2UncmUgdGhlIGNsaWVudCwgdmVyaWZ5IHRoZSBHVUlECisgICAgICAgKi8KKyAgICAgIGlmIChtYXliZV9hdXRoZW50aWNhdGVkICYmICF0cmFuc3BvcnQtPmlzX3NlcnZlcikKKyAgICAgICAgeworICAgICAgICAgIGNvbnN0IGNoYXIgKnNlcnZlcl9ndWlkOworCisgICAgICAgICAgc2VydmVyX2d1aWQgPSBfZGJ1c19hdXRoX2dldF9ndWlkX2Zyb21fc2VydmVyICh0cmFuc3BvcnQtPmF1dGgpOworICAgICAgICAgIF9kYnVzX2Fzc2VydCAoc2VydmVyX2d1aWQgIT0gTlVMTCk7CisKKyAgICAgICAgICBpZiAodHJhbnNwb3J0LT5leHBlY3RlZF9ndWlkICYmCisgICAgICAgICAgICAgIHN0cmNtcCAodHJhbnNwb3J0LT5leHBlY3RlZF9ndWlkLCBzZXJ2ZXJfZ3VpZCkgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkNsaWVudCBleHBlY3RlZCBHVUlEICclcycgYW5kIHdlIGdvdCAnJXMnIGZyb20gdGhlIHNlcnZlclxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0LT5leHBlY3RlZF9ndWlkLCBzZXJ2ZXJfZ3VpZCk7CisgICAgICAgICAgICAgIF9kYnVzX3RyYW5zcG9ydF9kaXNjb25uZWN0ICh0cmFuc3BvcnQpOworICAgICAgICAgICAgICBfZGJ1c19jb25uZWN0aW9uX3VucmVmX3VubG9ja2VkICh0cmFuc3BvcnQtPmNvbm5lY3Rpb24pOworICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgLyogSWYgd2UncmUgdGhlIHNlcnZlciwgc2VlIGlmIHdlIHdhbnQgdG8gYWxsb3cgdGhpcyBpZGVudGl0eSB0byBwcm9jZWVkLgorICAgICAgICovCisgICAgICBpZiAobWF5YmVfYXV0aGVudGljYXRlZCAmJiB0cmFuc3BvcnQtPmlzX3NlcnZlcikKKyAgICAgICAgeworICAgICAgICAgIGRidXNfYm9vbF90IGFsbG93OworICAgICAgICAgIERCdXNDcmVkZW50aWFscyAqYXV0aF9pZGVudGl0eTsKKyAgICAgICAgICAKKyAgICAgICAgICBhdXRoX2lkZW50aXR5ID0gX2RidXNfYXV0aF9nZXRfaWRlbnRpdHkgKHRyYW5zcG9ydC0+YXV0aCk7CisgICAgICAgICAgX2RidXNfYXNzZXJ0IChhdXRoX2lkZW50aXR5ICE9IE5VTEwpOworICAgICAgICAgIAorICAgICAgICAgIC8qIElmIHdlIGhhdmUgYW4gYXV0aCdkIHVzZXIgYW5kIGEgdXNlciBmdW5jdGlvbiwgZGVsZWdhdGUKKyAgICAgICAgICAgKiBkZWNpZGluZyB3aGV0aGVyIGF1dGggY3JlZGVudGlhbHMgYXJlIGdvb2QgZW5vdWdoIHRvIHRoZQorICAgICAgICAgICAqIGFwcDsgb3RoZXJ3aXNlLCB1c2Ugb3VyIGRlZmF1bHQgZGVjaXNpb24gcHJvY2Vzcy4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBpZiAodHJhbnNwb3J0LT51bml4X3VzZXJfZnVuY3Rpb24gIT0gTlVMTCAmJgorICAgICAgICAgICAgICBfZGJ1c19jcmVkZW50aWFsc19pbmNsdWRlIChhdXRoX2lkZW50aXR5LCBEQlVTX0NSRURFTlRJQUxfVU5JWF9VU0VSX0lEKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgYWxsb3cgPSBhdXRoX3ZpYV91bml4X3VzZXJfZnVuY3Rpb24gKHRyYW5zcG9ydCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZSBpZiAodHJhbnNwb3J0LT53aW5kb3dzX3VzZXJfZnVuY3Rpb24gIT0gTlVMTCAmJgorICAgICAgICAgICAgICAgICAgIF9kYnVzX2NyZWRlbnRpYWxzX2luY2x1ZGUgKGF1dGhfaWRlbnRpdHksIERCVVNfQ1JFREVOVElBTF9XSU5ET1dTX1NJRCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGFsbG93ID0gYXV0aF92aWFfd2luZG93c191c2VyX2Z1bmN0aW9uICh0cmFuc3BvcnQpOworICAgICAgICAgICAgfSAgICAgIAorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgYWxsb3cgPSBhdXRoX3ZpYV9kZWZhdWx0X3J1bGVzICh0cmFuc3BvcnQpOworICAgICAgICAgICAgfQorICAgICAgICAgIAorICAgICAgICAgIGlmICghYWxsb3cpCisgICAgICAgICAgICBtYXliZV9hdXRoZW50aWNhdGVkID0gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgdHJhbnNwb3J0LT5hdXRoZW50aWNhdGVkID0gbWF5YmVfYXV0aGVudGljYXRlZDsKKworICAgICAgX2RidXNfY29ubmVjdGlvbl91bnJlZl91bmxvY2tlZCAodHJhbnNwb3J0LT5jb25uZWN0aW9uKTsKKyAgICAgIHJldHVybiBtYXliZV9hdXRoZW50aWNhdGVkOworICAgIH0KK30KKworLyoqCisgKiBTZWUgZGJ1c19jb25uZWN0aW9uX2dldF9pc19hbm9ueW1vdXMoKS4KKyAqCisgKiBAcGFyYW0gdHJhbnNwb3J0IHRoZSB0cmFuc3BvcnQKKyAqIEByZXR1cm5zICNUUlVFIGlmIG5vdCBhdXRoZW50aWNhdGVkIG9yIGF1dGhlbnRpY2F0ZWQgYXMgYW5vbnltb3VzCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c190cmFuc3BvcnRfZ2V0X2lzX2Fub255bW91cyAoREJ1c1RyYW5zcG9ydCAqdHJhbnNwb3J0KQoreworICBEQnVzQ3JlZGVudGlhbHMgKmF1dGhfaWRlbnRpdHk7CisgIAorICBpZiAoIXRyYW5zcG9ydC0+YXV0aGVudGljYXRlZCkKKyAgICByZXR1cm4gVFJVRTsKKyAgCisgIGF1dGhfaWRlbnRpdHkgPSBfZGJ1c19hdXRoX2dldF9pZGVudGl0eSAodHJhbnNwb3J0LT5hdXRoKTsKKworICBpZiAoX2RidXNfY3JlZGVudGlhbHNfYXJlX2Fub255bW91cyAoYXV0aF9pZGVudGl0eSkpCisgICAgcmV0dXJuIFRSVUU7CisgIGVsc2UKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKgorICogUmV0dXJucyBUUlVFIGlmIHRoZSB0cmFuc3BvcnQgc3VwcG9ydHMgc2VuZGluZyB1bml4IGZkcy4KKyAqCisgKiBAcGFyYW0gdHJhbnNwb3J0IHRoZSB0cmFuc3BvcnQKKyAqIEByZXR1cm5zICNUUlVFIGlmIFRSVUUgaXQgaXMgcG9zc2libGUgdG8gc2VuZCB1bml4IGZkcyBhY3Jvc3MgdGhlIHRyYW5zcG9ydC4KKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3RyYW5zcG9ydF9jYW5fcGFzc191bml4X2ZkKERCdXNUcmFuc3BvcnQgKnRyYW5zcG9ydCkKK3sKKyAgcmV0dXJuIERCVVNfVFJBTlNQT1JUX0NBTl9TRU5EX1VOSVhfRkQodHJhbnNwb3J0KTsKK30KKworLyoqCisgKiBHZXRzIHRoZSBhZGRyZXNzIG9mIGEgdHJhbnNwb3J0LiBJdCB3aWxsIGJlCisgKiAjTlVMTCBmb3IgYSBzZXJ2ZXItc2lkZSB0cmFuc3BvcnQuCisgKgorICogQHBhcmFtIHRyYW5zcG9ydCB0aGUgdHJhbnNwb3J0CisgKiBAcmV0dXJucyB0cmFuc3BvcnQncyBhZGRyZXNzCisgKi8KK2NvbnN0IGNoYXIqCitfZGJ1c190cmFuc3BvcnRfZ2V0X2FkZHJlc3MgKERCdXNUcmFuc3BvcnQgKnRyYW5zcG9ydCkKK3sKKyAgcmV0dXJuIHRyYW5zcG9ydC0+YWRkcmVzczsKK30KKworLyoqCisgKiBHZXRzIHRoZSBpZCBvZiB0aGUgc2VydmVyIHdlIGFyZSBjb25uZWN0ZWQgdG8gKHNlZQorICogZGJ1c19zZXJ2ZXJfZ2V0X2lkKCkpLiBPbmx5IHdvcmtzIG9uIGNsaWVudCBzaWRlLgorICoKKyAqIEBwYXJhbSB0cmFuc3BvcnQgdGhlIHRyYW5zcG9ydAorICogQHJldHVybnMgdHJhbnNwb3J0J3Mgc2VydmVyJ3MgaWQgb3IgI05VTEwgaWYgd2UgYXJlIHRoZSBzZXJ2ZXIgc2lkZQorICovCitjb25zdCBjaGFyKgorX2RidXNfdHJhbnNwb3J0X2dldF9zZXJ2ZXJfaWQgKERCdXNUcmFuc3BvcnQgKnRyYW5zcG9ydCkKK3sKKyAgaWYgKHRyYW5zcG9ydC0+aXNfc2VydmVyKQorICAgIHJldHVybiBOVUxMOworICBlbHNlIGlmICh0cmFuc3BvcnQtPmF1dGhlbnRpY2F0ZWQpCisgICAgcmV0dXJuIF9kYnVzX2F1dGhfZ2V0X2d1aWRfZnJvbV9zZXJ2ZXIgKHRyYW5zcG9ydC0+YXV0aCk7CisgIGVsc2UKKyAgICByZXR1cm4gdHJhbnNwb3J0LT5leHBlY3RlZF9ndWlkOworfQorCisvKioKKyAqIEhhbmRsZXMgYSB3YXRjaCBieSByZWFkaW5nIGRhdGEsIHdyaXRpbmcgZGF0YSwgb3IgZGlzY29ubmVjdGluZworICogdGhlIHRyYW5zcG9ydCwgYXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBnaXZlbiBjb25kaXRpb24uCisgKgorICogQHBhcmFtIHRyYW5zcG9ydCB0aGUgdHJhbnNwb3J0LgorICogQHBhcmFtIHdhdGNoIHRoZSB3YXRjaC4KKyAqIEBwYXJhbSBjb25kaXRpb24gdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHdhdGNoZWQgZmlsZSBkZXNjcmlwdG9yLgorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGZ1bGx5IGhhbmRsZSB0aGUgd2F0Y2gKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3RyYW5zcG9ydF9oYW5kbGVfd2F0Y2ggKERCdXNUcmFuc3BvcnQgICAgICAgICAgICp0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzV2F0Y2ggICAgICAgICAgICAgICAqd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgY29uZGl0aW9uKQoreworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIAorICBfZGJ1c19hc3NlcnQgKHRyYW5zcG9ydC0+dnRhYmxlLT5oYW5kbGVfd2F0Y2ggIT0gTlVMTCk7CisKKyAgaWYgKHRyYW5zcG9ydC0+ZGlzY29ubmVjdGVkKQorICAgIHJldHVybiBUUlVFOworCisgIGlmIChkYnVzX3dhdGNoX2dldF9zb2NrZXQgKHdhdGNoKSA8IDApCisgICAgeworICAgICAgX2RidXNfd2Fybl9jaGVja19mYWlsZWQgKCJUcmllZCB0byBoYW5kbGUgYW4gaW52YWxpZGF0ZWQgd2F0Y2g7IHRoaXMgd2F0Y2ggc2hvdWxkIGhhdmUgYmVlbiByZW1vdmVkIik7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIAorICBfZGJ1c193YXRjaF9zYW5pdGl6ZV9jb25kaXRpb24gKHdhdGNoLCAmY29uZGl0aW9uKTsKKworICBfZGJ1c190cmFuc3BvcnRfcmVmICh0cmFuc3BvcnQpOworICBfZGJ1c193YXRjaF9yZWYgKHdhdGNoKTsKKyAgcmV0dmFsID0gKCogdHJhbnNwb3J0LT52dGFibGUtPmhhbmRsZV93YXRjaCkgKHRyYW5zcG9ydCwgd2F0Y2gsIGNvbmRpdGlvbik7CisgIF9kYnVzX3dhdGNoX3VucmVmICh3YXRjaCk7CisgIF9kYnVzX3RyYW5zcG9ydF91bnJlZiAodHJhbnNwb3J0KTsKKworICByZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIFNldHMgdGhlIGNvbm5lY3Rpb24gdXNpbmcgdGhpcyB0cmFuc3BvcnQuIEFsbG93cyB0aGUgdHJhbnNwb3J0CisgKiB0byBhZGQgd2F0Y2hlcyB0byB0aGUgY29ubmVjdGlvbiwgcXVldWUgaW5jb21pbmcgbWVzc2FnZXMsCisgKiBhbmQgcHVsbCBvdXRnb2luZyBtZXNzYWdlcy4KKyAqCisgKiBAcGFyYW0gdHJhbnNwb3J0IHRoZSB0cmFuc3BvcnQuCisgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgY29ubmVjdGlvbi4KKyAqIEByZXR1cm5zICNGQUxTRSBpZiBub3QgZW5vdWdoIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfdHJhbnNwb3J0X3NldF9jb25uZWN0aW9uIChEQnVzVHJhbnNwb3J0ICAqdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgX2RidXNfYXNzZXJ0ICh0cmFuc3BvcnQtPnZ0YWJsZS0+Y29ubmVjdGlvbl9zZXQgIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAodHJhbnNwb3J0LT5jb25uZWN0aW9uID09IE5VTEwpOworICAKKyAgdHJhbnNwb3J0LT5jb25uZWN0aW9uID0gY29ubmVjdGlvbjsKKworICBfZGJ1c190cmFuc3BvcnRfcmVmICh0cmFuc3BvcnQpOworICBpZiAoISgqIHRyYW5zcG9ydC0+dnRhYmxlLT5jb25uZWN0aW9uX3NldCkgKHRyYW5zcG9ydCkpCisgICAgdHJhbnNwb3J0LT5jb25uZWN0aW9uID0gTlVMTDsKKyAgX2RidXNfdHJhbnNwb3J0X3VucmVmICh0cmFuc3BvcnQpOworCisgIHJldHVybiB0cmFuc3BvcnQtPmNvbm5lY3Rpb24gIT0gTlVMTDsKK30KKworLyoqCisgKiBHZXQgdGhlIHNvY2tldCBmaWxlIGRlc2NyaXB0b3IsIGlmIGFueS4KKyAqCisgKiBAcGFyYW0gdHJhbnNwb3J0IHRoZSB0cmFuc3BvcnQKKyAqIEBwYXJhbSBmZF9wIHBvaW50ZXIgdG8gZmlsbCBpbiB3aXRoIHRoZSBkZXNjcmlwdG9yCisgKiBAcmV0dXJucyAjVFJVRSBpZiBhIGRlc2NyaXB0b3Igd2FzIGF2YWlsYWJsZQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfdHJhbnNwb3J0X2dldF9zb2NrZXRfZmQgKERCdXNUcmFuc3BvcnQgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU29ja2V0ICAgICpmZF9wKQoreworICBkYnVzX2Jvb2xfdCByZXR2YWw7CisgIAorICBpZiAodHJhbnNwb3J0LT52dGFibGUtPmdldF9zb2NrZXRfZmQgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKHRyYW5zcG9ydC0+ZGlzY29ubmVjdGVkKQorICAgIHJldHVybiBGQUxTRTsKKworICBfZGJ1c190cmFuc3BvcnRfcmVmICh0cmFuc3BvcnQpOworCisgIHJldHZhbCA9ICgqIHRyYW5zcG9ydC0+dnRhYmxlLT5nZXRfc29ja2V0X2ZkKSAodHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZkX3ApOworICAKKyAgX2RidXNfdHJhbnNwb3J0X3VucmVmICh0cmFuc3BvcnQpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogUGVyZm9ybXMgYSBzaW5nbGUgcG9sbCgpL3NlbGVjdCgpIG9uIHRoZSB0cmFuc3BvcnQncyBmaWxlCisgKiBkZXNjcmlwdG9ycyBhbmQgdGhlbiByZWFkcy93cml0ZXMgZGF0YSBhcyBhcHByb3ByaWF0ZSwKKyAqIHF1ZXVlaW5nIGluY29taW5nIG1lc3NhZ2VzIGFuZCBzZW5kaW5nIG91dGdvaW5nIG1lc3NhZ2VzLgorICogVGhpcyBpcyB0aGUgYmFja2VuZCBmb3IgX2RidXNfY29ubmVjdGlvbl9kb19pdGVyYXRpb24oKS4KKyAqIFNlZSBfZGJ1c19jb25uZWN0aW9uX2RvX2l0ZXJhdGlvbigpIGZvciBmdWxsIGRldGFpbHMuCisgKgorICogQHBhcmFtIHRyYW5zcG9ydCB0aGUgdHJhbnNwb3J0LgorICogQHBhcmFtIGZsYWdzIGluZGljYXRlcyB3aGV0aGVyIHRvIHJlYWQgb3Igd3JpdGUsIGFuZCB3aGV0aGVyIHRvIGJsb2NrLgorICogQHBhcmFtIHRpbWVvdXRfbWlsbGlzZWNvbmRzIGlmIGJsb2NraW5nLCB0aW1lb3V0IG9yIC0xIGZvciBubyB0aW1lb3V0LgorICovCit2b2lkCitfZGJ1c190cmFuc3BvcnRfZG9faXRlcmF0aW9uIChEQnVzVHJhbnNwb3J0ICAqdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHRpbWVvdXRfbWlsbGlzZWNvbmRzKQoreworICBfZGJ1c19hc3NlcnQgKHRyYW5zcG9ydC0+dnRhYmxlLT5kb19pdGVyYXRpb24gIT0gTlVMTCk7CisKKyAgX2RidXNfdmVyYm9zZSAoIlRyYW5zcG9ydCBpdGVyYXRpb24gZmxhZ3MgMHgleCB0aW1lb3V0ICVkIGNvbm5lY3RlZCA9ICVkXG4iLAorICAgICAgICAgICAgICAgICBmbGFncywgdGltZW91dF9taWxsaXNlY29uZHMsICF0cmFuc3BvcnQtPmRpc2Nvbm5lY3RlZCk7CisgIAorICBpZiAoKGZsYWdzICYgKERCVVNfSVRFUkFUSU9OX0RPX1dSSVRJTkcgfAorICAgICAgICAgICAgICAgIERCVVNfSVRFUkFUSU9OX0RPX1JFQURJTkcpKSA9PSAwKQorICAgIHJldHVybjsgLyogTm90aGluZyB0byBkbyAqLworCisgIGlmICh0cmFuc3BvcnQtPmRpc2Nvbm5lY3RlZCkKKyAgICByZXR1cm47CisKKyAgX2RidXNfdHJhbnNwb3J0X3JlZiAodHJhbnNwb3J0KTsKKyAgKCogdHJhbnNwb3J0LT52dGFibGUtPmRvX2l0ZXJhdGlvbikgKHRyYW5zcG9ydCwgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0X21pbGxpc2Vjb25kcyk7CisgIF9kYnVzX3RyYW5zcG9ydF91bnJlZiAodHJhbnNwb3J0KTsKKworICBfZGJ1c192ZXJib3NlICgiZW5kXG4iKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CityZWNvdmVyX3VudXNlZF9ieXRlcyAoREJ1c1RyYW5zcG9ydCAqdHJhbnNwb3J0KQoreworICBpZiAoX2RidXNfYXV0aF9uZWVkc19kZWNvZGluZyAodHJhbnNwb3J0LT5hdXRoKSkKKyAgICB7CisgICAgICBEQnVzU3RyaW5nIHBsYWludGV4dDsKKyAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmVuY29kZWQ7CisgICAgICBEQnVzU3RyaW5nICpidWZmZXI7CisgICAgICBpbnQgb3JpZ19sZW47CisgICAgICAKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZwbGFpbnRleHQpKQorICAgICAgICBnb3RvIG5vbWVtOworICAgICAgCisgICAgICBfZGJ1c19hdXRoX2dldF91bnVzZWRfYnl0ZXMgKHRyYW5zcG9ydC0+YXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuY29kZWQpOworCisgICAgICBpZiAoIV9kYnVzX2F1dGhfZGVjb2RlX2RhdGEgKHRyYW5zcG9ydC0+YXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlZCwgJnBsYWludGV4dCkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnBsYWludGV4dCk7CisgICAgICAgICAgZ290byBub21lbTsKKyAgICAgICAgfQorICAgICAgCisgICAgICBfZGJ1c19tZXNzYWdlX2xvYWRlcl9nZXRfYnVmZmVyICh0cmFuc3BvcnQtPmxvYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAKKyAgICAgIG9yaWdfbGVuID0gX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGJ1ZmZlcik7CisgICAgICAKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX21vdmUgKCZwbGFpbnRleHQsIDAsIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdfbGVuKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmcGxhaW50ZXh0KTsKKyAgICAgICAgICBnb3RvIG5vbWVtOworICAgICAgICB9CisgICAgICAKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgJWQgdW51c2VkIGJ5dGVzIHNlbnQgdG8gbWVzc2FnZSBsb2FkZXJcbiIsIAorICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGJ1ZmZlcikgLQorICAgICAgICAgICAgICAgICAgICAgb3JpZ19sZW4pOworICAgICAgCisgICAgICBfZGJ1c19tZXNzYWdlX2xvYWRlcl9yZXR1cm5fYnVmZmVyICh0cmFuc3BvcnQtPmxvYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcik7CisKKyAgICAgIF9kYnVzX2F1dGhfZGVsZXRlX3VudXNlZF9ieXRlcyAodHJhbnNwb3J0LT5hdXRoKTsKKyAgICAgIAorICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwbGFpbnRleHQpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmJ5dGVzOworICAgICAgREJ1c1N0cmluZyAqYnVmZmVyOworI2lmZGVmIERCVVNfRU5BQkxFX1ZFUkJPU0VfTU9ERQorICAgICAgaW50IG9yaWdfbGVuOworI2VuZGlmCisgICAgICBkYnVzX2Jvb2xfdCBzdWNjZWVkZWQ7CisKKyAgICAgIF9kYnVzX21lc3NhZ2VfbG9hZGVyX2dldF9idWZmZXIgKHRyYW5zcG9ydC0+bG9hZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworI2lmZGVmIERCVVNfRU5BQkxFX1ZFUkJPU0VfTU9ERQorICAgICAgb3JpZ19sZW4gPSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoYnVmZmVyKTsKKyNlbmRpZgorCisgICAgICBfZGJ1c19hdXRoX2dldF91bnVzZWRfYnl0ZXMgKHRyYW5zcG9ydC0+YXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ5dGVzKTsKKworICAgICAgc3VjY2VlZGVkID0gVFJVRTsKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2NvcHkgKGJ5dGVzLCAwLCBidWZmZXIsIF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChidWZmZXIpKSkKKyAgICAgICAgc3VjY2VlZGVkID0gRkFMU0U7CisgICAgICAKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCIgJWQgdW51c2VkIGJ5dGVzIHNlbnQgdG8gbWVzc2FnZSBsb2FkZXJcbiIsIAorICAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKGJ1ZmZlcikgLQorICAgICAgICAgICAgICAgICAgICAgb3JpZ19sZW4pOworICAgICAgCisgICAgICBfZGJ1c19tZXNzYWdlX2xvYWRlcl9yZXR1cm5fYnVmZmVyICh0cmFuc3BvcnQtPmxvYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcik7CisKKyAgICAgIGlmIChzdWNjZWVkZWQpCisgICAgICAgIF9kYnVzX2F1dGhfZGVsZXRlX3VudXNlZF9ieXRlcyAodHJhbnNwb3J0LT5hdXRoKTsKKyAgICAgIGVsc2UKKyAgICAgICAgZ290byBub21lbTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7CisKKyBub21lbToKKyAgX2RidXNfdmVyYm9zZSAoIk5vdCBlbm91Z2ggbWVtb3J5IHRvIHRyYW5zZmVyIHVudXNlZCBieXRlcyBmcm9tIGF1dGggY29udmVyc2F0aW9uXG4iKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKioKKyAqIFJlcG9ydHMgb3VyIGN1cnJlbnQgZGlzcGF0Y2ggc3RhdHVzICh3aGV0aGVyIHRoZXJlJ3MgYnVmZmVyZWQKKyAqIGRhdGEgdG8gYmUgcXVldWVkIGFzIG1lc3NhZ2VzLCBvciBub3QsIG9yIHdlIG5lZWQgbWVtb3J5KS4KKyAqCisgKiBAcGFyYW0gdHJhbnNwb3J0IHRoZSB0cmFuc3BvcnQKKyAqIEByZXR1cm5zIGN1cnJlbnQgc3RhdHVzCisgKi8KK0RCdXNEaXNwYXRjaFN0YXR1cworX2RidXNfdHJhbnNwb3J0X2dldF9kaXNwYXRjaF9zdGF0dXMgKERCdXNUcmFuc3BvcnQgKnRyYW5zcG9ydCkKK3sKKyAgaWYgKF9kYnVzX2NvdW50ZXJfZ2V0X3NpemVfdmFsdWUgKHRyYW5zcG9ydC0+bGl2ZV9tZXNzYWdlcykgPj0gdHJhbnNwb3J0LT5tYXhfbGl2ZV9tZXNzYWdlc19zaXplIHx8CisgICAgICBfZGJ1c19jb3VudGVyX2dldF91bml4X2ZkX3ZhbHVlICh0cmFuc3BvcnQtPmxpdmVfbWVzc2FnZXMpID49IHRyYW5zcG9ydC0+bWF4X2xpdmVfbWVzc2FnZXNfdW5peF9mZHMpCisgICAgcmV0dXJuIERCVVNfRElTUEFUQ0hfQ09NUExFVEU7IC8qIGNvbXBsZXRlIGZvciBub3cgKi8KKworICBpZiAoIV9kYnVzX3RyYW5zcG9ydF90cnlfdG9fYXV0aGVudGljYXRlICh0cmFuc3BvcnQpKQorICAgIHsKKyAgICAgIGlmIChfZGJ1c19hdXRoX2RvX3dvcmsgKHRyYW5zcG9ydC0+YXV0aCkgPT0KKyAgICAgICAgICBEQlVTX0FVVEhfU1RBVEVfV0FJVElOR19GT1JfTUVNT1JZKQorICAgICAgICByZXR1cm4gREJVU19ESVNQQVRDSF9ORUVEX01FTU9SWTsKKyAgICAgIGVsc2UgaWYgKCFfZGJ1c190cmFuc3BvcnRfdHJ5X3RvX2F1dGhlbnRpY2F0ZSAodHJhbnNwb3J0KSkKKyAgICAgICAgcmV0dXJuIERCVVNfRElTUEFUQ0hfQ09NUExFVEU7CisgICAgfQorCisgIGlmICghdHJhbnNwb3J0LT51bnVzZWRfYnl0ZXNfcmVjb3ZlcmVkICYmCisgICAgICAhcmVjb3Zlcl91bnVzZWRfYnl0ZXMgKHRyYW5zcG9ydCkpCisgICAgcmV0dXJuIERCVVNfRElTUEFUQ0hfTkVFRF9NRU1PUlk7CisKKyAgdHJhbnNwb3J0LT51bnVzZWRfYnl0ZXNfcmVjb3ZlcmVkID0gVFJVRTsKKyAgCisgIGlmICghX2RidXNfbWVzc2FnZV9sb2FkZXJfcXVldWVfbWVzc2FnZXMgKHRyYW5zcG9ydC0+bG9hZGVyKSkKKyAgICByZXR1cm4gREJVU19ESVNQQVRDSF9ORUVEX01FTU9SWTsKKworICBpZiAoX2RidXNfbWVzc2FnZV9sb2FkZXJfcGVla19tZXNzYWdlICh0cmFuc3BvcnQtPmxvYWRlcikgIT0gTlVMTCkKKyAgICByZXR1cm4gREJVU19ESVNQQVRDSF9EQVRBX1JFTUFJTlM7CisgIGVsc2UKKyAgICByZXR1cm4gREJVU19ESVNQQVRDSF9DT01QTEVURTsKK30KKworLyoqCisgKiBQcm9jZXNzZXMgZGF0YSB3ZSd2ZSByZWFkIHdoaWxlIGhhbmRsaW5nIGEgd2F0Y2gsIHBvdGVudGlhbGx5CisgKiBjb252ZXJ0aW5nIHNvbWUgb2YgaXQgdG8gbWVzc2FnZXMgYW5kIHF1ZXVlaW5nIHRob3NlIG1lc3NhZ2VzIG9uCisgKiB0aGUgY29ubmVjdGlvbi4KKyAqCisgKiBAcGFyYW0gdHJhbnNwb3J0IHRoZSB0cmFuc3BvcnQKKyAqIEByZXR1cm5zICNUUlVFIGlmIHdlIGhhZCBlbm91Z2ggbWVtb3J5IHRvIHF1ZXVlIGFsbCBtZXNzYWdlcworICovCitkYnVzX2Jvb2xfdAorX2RidXNfdHJhbnNwb3J0X3F1ZXVlX21lc3NhZ2VzIChEQnVzVHJhbnNwb3J0ICp0cmFuc3BvcnQpCit7CisgIERCdXNEaXNwYXRjaFN0YXR1cyBzdGF0dXM7CisKKyNpZiAwCisgIF9kYnVzX3ZlcmJvc2UgKCJlbnRlclxuIik7CisjZW5kaWYKKworICAvKiBRdWV1ZSBhbnkgbWVzc2FnZXMgKi8KKyAgd2hpbGUgKChzdGF0dXMgPSBfZGJ1c190cmFuc3BvcnRfZ2V0X2Rpc3BhdGNoX3N0YXR1cyAodHJhbnNwb3J0KSkgPT0gREJVU19ESVNQQVRDSF9EQVRBX1JFTUFJTlMpCisgICAgeworICAgICAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisgICAgICBEQnVzTGlzdCAqbGluazsKKworICAgICAgbGluayA9IF9kYnVzX21lc3NhZ2VfbG9hZGVyX3BvcF9tZXNzYWdlX2xpbmsgKHRyYW5zcG9ydC0+bG9hZGVyKTsKKyAgICAgIF9kYnVzX2Fzc2VydCAobGluayAhPSBOVUxMKTsKKyAgICAgIAorICAgICAgbWVzc2FnZSA9IGxpbmstPmRhdGE7CisgICAgICAKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJxdWV1ZWluZyByZWNlaXZlZCBtZXNzYWdlICVwXG4iLCBtZXNzYWdlKTsKKworICAgICAgaWYgKCFfZGJ1c19tZXNzYWdlX2FkZF9jb3VudGVyIChtZXNzYWdlLCB0cmFuc3BvcnQtPmxpdmVfbWVzc2FnZXMpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfbWVzc2FnZV9sb2FkZXJfcHV0YmFja19tZXNzYWdlX2xpbmsgKHRyYW5zcG9ydC0+bG9hZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rKTsKKyAgICAgICAgICBzdGF0dXMgPSBEQlVTX0RJU1BBVENIX05FRURfTUVNT1JZOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvKiBXZSBkaWRuJ3QgY2FsbCB0aGUgbm90aWZ5IGZ1bmN0aW9uIHdoZW4gd2UgYWRkZWQgdGhlIGNvdW50ZXIsIHNvCisgICAgICAgICAgICogY2F0Y2ggdXAgbm93LiBTaW5jZSB3ZSBoYXZlIHRoZSBjb25uZWN0aW9uJ3MgbG9jaywgaXQncyBkZXNpcmFibGUKKyAgICAgICAgICAgKiB0aGF0IHdlIGJ5cGFzcyB0aGUgbm90aWZ5IGZ1bmN0aW9uIGFuZCBjYWxsIHRoaXMgdmlydHVhbCBtZXRob2QKKyAgICAgICAgICAgKiBkaXJlY3RseS4gKi8KKyAgICAgICAgICBpZiAodHJhbnNwb3J0LT52dGFibGUtPmxpdmVfbWVzc2FnZXNfY2hhbmdlZCkKKyAgICAgICAgICAgICgqIHRyYW5zcG9ydC0+dnRhYmxlLT5saXZlX21lc3NhZ2VzX2NoYW5nZWQpICh0cmFuc3BvcnQpOworCisgICAgICAgICAgLyogcGFzcyBvd25lcnNoaXAgb2YgbGluayBhbmQgbWVzc2FnZSByZWYgdG8gY29ubmVjdGlvbiAqLworICAgICAgICAgIF9kYnVzX2Nvbm5lY3Rpb25fcXVldWVfcmVjZWl2ZWRfbWVzc2FnZV9saW5rICh0cmFuc3BvcnQtPmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmspOworICAgICAgICB9CisgICAgfQorCisgIGlmIChfZGJ1c19tZXNzYWdlX2xvYWRlcl9nZXRfaXNfY29ycnVwdGVkICh0cmFuc3BvcnQtPmxvYWRlcikpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIkNvcnJ1cHRlZCBtZXNzYWdlIHN0cmVhbSwgZGlzY29ubmVjdGluZ1xuIik7CisgICAgICBfZGJ1c190cmFuc3BvcnRfZGlzY29ubmVjdCAodHJhbnNwb3J0KTsKKyAgICB9CisKKyAgcmV0dXJuIHN0YXR1cyAhPSBEQlVTX0RJU1BBVENIX05FRURfTUVNT1JZOworfQorCisvKioKKyAqIFNlZSBkYnVzX2Nvbm5lY3Rpb25fc2V0X21heF9tZXNzYWdlX3NpemUoKS4KKyAqCisgKiBAcGFyYW0gdHJhbnNwb3J0IHRoZSB0cmFuc3BvcnQKKyAqIEBwYXJhbSBzaXplIHRoZSBtYXggc2l6ZSBvZiBhIHNpbmdsZSBtZXNzYWdlCisgKi8KK3ZvaWQKK19kYnVzX3RyYW5zcG9ydF9zZXRfbWF4X21lc3NhZ2Vfc2l6ZSAoREJ1c1RyYW5zcG9ydCAgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyAgICAgICAgICAgIHNpemUpCit7CisgIF9kYnVzX21lc3NhZ2VfbG9hZGVyX3NldF9tYXhfbWVzc2FnZV9zaXplICh0cmFuc3BvcnQtPmxvYWRlciwgc2l6ZSk7Cit9CisKKy8qKgorICogU2VlIGRidXNfY29ubmVjdGlvbl9zZXRfbWF4X21lc3NhZ2VfdW5peF9mZHMoKS4KKyAqCisgKiBAcGFyYW0gdHJhbnNwb3J0IHRoZSB0cmFuc3BvcnQKKyAqIEBwYXJhbSBuIHRoZSBtYXggbnVtYmVyIG9mIHVuaXggZmRzIG9mIGEgc2luZ2xlIG1lc3NhZ2UKKyAqLwordm9pZAorX2RidXNfdHJhbnNwb3J0X3NldF9tYXhfbWVzc2FnZV91bml4X2ZkcyAoREJ1c1RyYW5zcG9ydCAgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgICAgICAgICAgICBuKQoreworICBfZGJ1c19tZXNzYWdlX2xvYWRlcl9zZXRfbWF4X21lc3NhZ2VfdW5peF9mZHMgKHRyYW5zcG9ydC0+bG9hZGVyLCBuKTsKK30KKworLyoqCisgKiBTZWUgZGJ1c19jb25uZWN0aW9uX2dldF9tYXhfbWVzc2FnZV9zaXplKCkuCisgKgorICogQHBhcmFtIHRyYW5zcG9ydCB0aGUgdHJhbnNwb3J0CisgKiBAcmV0dXJucyBtYXggbWVzc2FnZSBzaXplCisgKi8KK2xvbmcKK19kYnVzX3RyYW5zcG9ydF9nZXRfbWF4X21lc3NhZ2Vfc2l6ZSAoREJ1c1RyYW5zcG9ydCAgKnRyYW5zcG9ydCkKK3sKKyAgcmV0dXJuIF9kYnVzX21lc3NhZ2VfbG9hZGVyX2dldF9tYXhfbWVzc2FnZV9zaXplICh0cmFuc3BvcnQtPmxvYWRlcik7Cit9CisKKy8qKgorICogU2VlIGRidXNfY29ubmVjdGlvbl9nZXRfbWF4X21lc3NhZ2VfdW5peF9mZHMoKS4KKyAqCisgKiBAcGFyYW0gdHJhbnNwb3J0IHRoZSB0cmFuc3BvcnQKKyAqIEByZXR1cm5zIG1heCBtZXNzYWdlIHVuaXggZmRzCisgKi8KK2xvbmcKK19kYnVzX3RyYW5zcG9ydF9nZXRfbWF4X21lc3NhZ2VfdW5peF9mZHMgKERCdXNUcmFuc3BvcnQgICp0cmFuc3BvcnQpCit7CisgIHJldHVybiBfZGJ1c19tZXNzYWdlX2xvYWRlcl9nZXRfbWF4X21lc3NhZ2VfdW5peF9mZHMgKHRyYW5zcG9ydC0+bG9hZGVyKTsKK30KKworLyoqCisgKiBTZWUgZGJ1c19jb25uZWN0aW9uX3NldF9tYXhfcmVjZWl2ZWRfc2l6ZSgpLgorICoKKyAqIEBwYXJhbSB0cmFuc3BvcnQgdGhlIHRyYW5zcG9ydAorICogQHBhcmFtIHNpemUgdGhlIG1heCBzaXplIG9mIGFsbCBpbmNvbWluZyBtZXNzYWdlcworICovCit2b2lkCitfZGJ1c190cmFuc3BvcnRfc2V0X21heF9yZWNlaXZlZF9zaXplIChEQnVzVHJhbnNwb3J0ICAqdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyAgICAgICAgICAgIHNpemUpCit7CisgIHRyYW5zcG9ydC0+bWF4X2xpdmVfbWVzc2FnZXNfc2l6ZSA9IHNpemU7CisgIF9kYnVzX2NvdW50ZXJfc2V0X25vdGlmeSAodHJhbnNwb3J0LT5saXZlX21lc3NhZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydC0+bWF4X2xpdmVfbWVzc2FnZXNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQtPm1heF9saXZlX21lc3NhZ2VzX3VuaXhfZmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpdmVfbWVzc2FnZXNfbm90aWZ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydCk7Cit9CisKKy8qKgorICogU2VlIGRidXNfY29ubmVjdGlvbl9zZXRfbWF4X3JlY2VpdmVkX3VuaXhfZmRzKCkuCisgKgorICogQHBhcmFtIHRyYW5zcG9ydCB0aGUgdHJhbnNwb3J0CisgKiBAcGFyYW0gbiB0aGUgbWF4IHVuaXggZmRzIG9mIGFsbCBpbmNvbWluZyBtZXNzYWdlcworICovCit2b2lkCitfZGJ1c190cmFuc3BvcnRfc2V0X21heF9yZWNlaXZlZF91bml4X2ZkcyAoREJ1c1RyYW5zcG9ydCAgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nICAgICAgICAgICAgbikKK3sKKyAgdHJhbnNwb3J0LT5tYXhfbGl2ZV9tZXNzYWdlc191bml4X2ZkcyA9IG47CisgIF9kYnVzX2NvdW50ZXJfc2V0X25vdGlmeSAodHJhbnNwb3J0LT5saXZlX21lc3NhZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydC0+bWF4X2xpdmVfbWVzc2FnZXNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQtPm1heF9saXZlX21lc3NhZ2VzX3VuaXhfZmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpdmVfbWVzc2FnZXNfbm90aWZ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydCk7Cit9CisKKy8qKgorICogU2VlIGRidXNfY29ubmVjdGlvbl9nZXRfbWF4X3JlY2VpdmVkX3NpemUoKS4KKyAqCisgKiBAcGFyYW0gdHJhbnNwb3J0IHRoZSB0cmFuc3BvcnQKKyAqIEByZXR1cm5zIG1heCBieXRlcyBmb3IgYWxsIGxpdmUgbWVzc2FnZXMKKyAqLworbG9uZworX2RidXNfdHJhbnNwb3J0X2dldF9tYXhfcmVjZWl2ZWRfc2l6ZSAoREJ1c1RyYW5zcG9ydCAgKnRyYW5zcG9ydCkKK3sKKyAgcmV0dXJuIHRyYW5zcG9ydC0+bWF4X2xpdmVfbWVzc2FnZXNfc2l6ZTsKK30KKworLyoqCisgKiBTZWUgZGJ1c19jb25uZWN0aW9uX3NldF9tYXhfcmVjZWl2ZWRfdW5peF9mZHMoKS4KKyAqCisgKiBAcGFyYW0gdHJhbnNwb3J0IHRoZSB0cmFuc3BvcnQKKyAqIEByZXR1cm5zIG1heCB1bml4IGZkcyBmb3IgYWxsIGxpdmUgbWVzc2FnZXMKKyAqLworbG9uZworX2RidXNfdHJhbnNwb3J0X2dldF9tYXhfcmVjZWl2ZWRfdW5peF9mZHMgKERCdXNUcmFuc3BvcnQgICp0cmFuc3BvcnQpCit7CisgIHJldHVybiB0cmFuc3BvcnQtPm1heF9saXZlX21lc3NhZ2VzX3VuaXhfZmRzOworfQorCisvKioKKyAqIFNlZSBkYnVzX2Nvbm5lY3Rpb25fZ2V0X3VuaXhfdXNlcigpLgorICoKKyAqIEBwYXJhbSB0cmFuc3BvcnQgdGhlIHRyYW5zcG9ydAorICogQHBhcmFtIHVpZCByZXR1cm4gbG9jYXRpb24gZm9yIHRoZSB1c2VyIElECisgKiBAcmV0dXJucyAjVFJVRSBpZiB1aWQgaXMgZmlsbGVkIGluIHdpdGggYSB2YWxpZCB1c2VyIElECisgKi8KK2RidXNfYm9vbF90CitfZGJ1c190cmFuc3BvcnRfZ2V0X3VuaXhfdXNlciAoREJ1c1RyYW5zcG9ydCAqdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgKnVpZCkKK3sKKyAgREJ1c0NyZWRlbnRpYWxzICphdXRoX2lkZW50aXR5OworCisgICp1aWQgPSBfREJVU19JTlQzMl9NQVg7IC8qIGJldHRlciB0aGFuIHNvbWUgcm9vdCBvciBzeXN0ZW0gdXNlciBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBjYXNlIG9mIGJ1Z3MgaW4gdGhlIGNhbGxlci4gQ2FsbGVyIHNob3VsZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBuZXZlciB1c2UgdGhpcyB2YWx1ZSBvbiBwdXJwb3NlLCBob3dldmVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgCisgIGlmICghdHJhbnNwb3J0LT5hdXRoZW50aWNhdGVkKQorICAgIHJldHVybiBGQUxTRTsKKyAgCisgIGF1dGhfaWRlbnRpdHkgPSBfZGJ1c19hdXRoX2dldF9pZGVudGl0eSAodHJhbnNwb3J0LT5hdXRoKTsKKworICBpZiAoX2RidXNfY3JlZGVudGlhbHNfaW5jbHVkZSAoYXV0aF9pZGVudGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfQ1JFREVOVElBTF9VTklYX1VTRVJfSUQpKQorICAgIHsKKyAgICAgICp1aWQgPSBfZGJ1c19jcmVkZW50aWFsc19nZXRfdW5peF91aWQgKGF1dGhfaWRlbnRpdHkpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICBlbHNlCisgICAgcmV0dXJuIEZBTFNFOworfQorCisvKioKKyAqIFNlZSBkYnVzX2Nvbm5lY3Rpb25fZ2V0X3VuaXhfcHJvY2Vzc19pZCgpLgorICoKKyAqIEBwYXJhbSB0cmFuc3BvcnQgdGhlIHRyYW5zcG9ydAorICogQHBhcmFtIHBpZCByZXR1cm4gbG9jYXRpb24gZm9yIHRoZSBwcm9jZXNzIElECisgKiBAcmV0dXJucyAjVFJVRSBpZiB1aWQgaXMgZmlsbGVkIGluIHdpdGggYSB2YWxpZCBwcm9jZXNzIElECisgKi8KK2RidXNfYm9vbF90CitfZGJ1c190cmFuc3BvcnRfZ2V0X3VuaXhfcHJvY2Vzc19pZCAoREJ1c1RyYW5zcG9ydCAqdHJhbnNwb3J0LAorCQkJCSAgICAgdW5zaWduZWQgbG9uZyAqcGlkKQoreworICBEQnVzQ3JlZGVudGlhbHMgKmF1dGhfaWRlbnRpdHk7CisKKyAgKnBpZCA9IERCVVNfUElEX1VOU0VUOyAvKiBDYWxsZXIgc2hvdWxkIG5ldmVyIHVzZSB0aGlzIHZhbHVlIG9uIHB1cnBvc2UsCisJCQkgICogYnV0IHdlIHNldCBpdCB0byBhIHNhZmUgbnVtYmVyLCBJTlRfTUFYLAorCQkJICAqIGp1c3QgdG8gcm9vdCBvdXQgcG9zc2libGUgYnVncyBpbiBiYWQgY2FsbGVycy4KKwkJCSAgKi8KKyAgCisgIGlmICghdHJhbnNwb3J0LT5hdXRoZW50aWNhdGVkKQorICAgIHJldHVybiBGQUxTRTsKKyAgCisgIGF1dGhfaWRlbnRpdHkgPSBfZGJ1c19hdXRoX2dldF9pZGVudGl0eSAodHJhbnNwb3J0LT5hdXRoKTsKKworICBpZiAoX2RidXNfY3JlZGVudGlhbHNfaW5jbHVkZSAoYXV0aF9pZGVudGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfQ1JFREVOVElBTF9VTklYX1BST0NFU1NfSUQpKQorICAgIHsKKyAgICAgICpwaWQgPSBfZGJ1c19jcmVkZW50aWFsc19nZXRfcGlkIChhdXRoX2lkZW50aXR5KTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgZWxzZQorICAgIHJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBTZWUgZGJ1c19jb25uZWN0aW9uX2dldF9hZHRfYXVkaXRfc2Vzc2lvbl9kYXRhKCkuCisgKgorICogQHBhcmFtIHRyYW5zcG9ydCB0aGUgdHJhbnNwb3J0CisgKiBAcGFyYW0gZGF0YSByZXR1cm4gbG9jYXRpb24gZm9yIHRoZSBBRFQgYXVkaXQgZGF0YSAKKyAqIEBwYXJhbSBkYXRhX3NpemUgcmV0dXJuIGxlbmd0aCBvZiBhdWRpdCBkYXRhCisgKiBAcmV0dXJucyAjVFJVRSBpZiBhdWRpdCBkYXRhIGlzIGZpbGxlZCBpbiB3aXRoIGEgdmFsaWQgdWNyZWQKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3RyYW5zcG9ydF9nZXRfYWR0X2F1ZGl0X3Nlc3Npb25fZGF0YSAoREJ1c1RyYW5zcG9ydCAgICAgICp0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICoqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICpkYXRhX3NpemUpCit7CisgIERCdXNDcmVkZW50aWFscyAqYXV0aF9pZGVudGl0eTsKKworICAqZGF0YSA9IE5VTEw7CisgICpkYXRhX3NpemUgPSAwOworICAKKyAgaWYgKCF0cmFuc3BvcnQtPmF1dGhlbnRpY2F0ZWQpCisgICAgcmV0dXJuIEZBTFNFOworICAKKyAgYXV0aF9pZGVudGl0eSA9IF9kYnVzX2F1dGhfZ2V0X2lkZW50aXR5ICh0cmFuc3BvcnQtPmF1dGgpOworCisgIGlmIChfZGJ1c19jcmVkZW50aWFsc19pbmNsdWRlIChhdXRoX2lkZW50aXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19DUkVERU5USUFMX0FEVF9BVURJVF9EQVRBX0lEKSkKKyAgICB7CisgICAgICAqZGF0YSA9ICh2b2lkICopIF9kYnVzX2NyZWRlbnRpYWxzX2dldF9hZHRfYXVkaXRfZGF0YSAoYXV0aF9pZGVudGl0eSk7CisgICAgICAqZGF0YV9zaXplID0gX2RidXNfY3JlZGVudGlhbHNfZ2V0X2FkdF9hdWRpdF9kYXRhX3NpemUgKGF1dGhfaWRlbnRpdHkpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICBlbHNlCisgICAgcmV0dXJuIEZBTFNFOworfQorCisvKioKKyAqIFNlZSBkYnVzX2Nvbm5lY3Rpb25fc2V0X3VuaXhfdXNlcl9mdW5jdGlvbigpLgorICoKKyAqIEBwYXJhbSB0cmFuc3BvcnQgdGhlIHRyYW5zcG9ydAorICogQHBhcmFtIGZ1bmN0aW9uIHRoZSBwcmVkaWNhdGUKKyAqIEBwYXJhbSBkYXRhIGRhdGEgdG8gcGFzcyB0byB0aGUgcHJlZGljYXRlCisgKiBAcGFyYW0gZnJlZV9kYXRhX2Z1bmN0aW9uIGZ1bmN0aW9uIHRvIGZyZWUgdGhlIGRhdGEKKyAqIEBwYXJhbSBvbGRfZGF0YSB0aGUgb2xkIHVzZXIgZGF0YSB0byBiZSBmcmVlZAorICogQHBhcmFtIG9sZF9mcmVlX2RhdGFfZnVuY3Rpb24gb2xkIGZyZWUgZGF0YSBmdW5jdGlvbiB0byBmcmVlIGl0IHdpdGgKKyAqLwordm9pZAorX2RidXNfdHJhbnNwb3J0X3NldF91bml4X3VzZXJfZnVuY3Rpb24gKERCdXNUcmFuc3BvcnQgICAgICAgICAgICAgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQWxsb3dVbml4VXNlckZ1bmN0aW9uICBmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNGcmVlRnVuY3Rpb24gICAgICAgICAgIGZyZWVfZGF0YV9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgKipvbGRfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRnJlZUZ1bmN0aW9uICAgICAgICAgICpvbGRfZnJlZV9kYXRhX2Z1bmN0aW9uKQoreyAgCisgICpvbGRfZGF0YSA9IHRyYW5zcG9ydC0+dW5peF91c2VyX2RhdGE7CisgICpvbGRfZnJlZV9kYXRhX2Z1bmN0aW9uID0gdHJhbnNwb3J0LT5mcmVlX3VuaXhfdXNlcl9kYXRhOworCisgIHRyYW5zcG9ydC0+dW5peF91c2VyX2Z1bmN0aW9uID0gZnVuY3Rpb247CisgIHRyYW5zcG9ydC0+dW5peF91c2VyX2RhdGEgPSBkYXRhOworICB0cmFuc3BvcnQtPmZyZWVfdW5peF91c2VyX2RhdGEgPSBmcmVlX2RhdGFfZnVuY3Rpb247Cit9CisKK2RidXNfYm9vbF90CitfZGJ1c190cmFuc3BvcnRfZ2V0X2xpbnV4X3NlY3VyaXR5X2xhYmVsIChEQnVzVHJhbnNwb3J0ICAqdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAgICAqKmxhYmVsX3ApCit7CisgIERCdXNDcmVkZW50aWFscyAqYXV0aF9pZGVudGl0eTsKKworICAqbGFiZWxfcCA9IE5VTEw7CisKKyAgaWYgKCF0cmFuc3BvcnQtPmF1dGhlbnRpY2F0ZWQpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGF1dGhfaWRlbnRpdHkgPSBfZGJ1c19hdXRoX2dldF9pZGVudGl0eSAodHJhbnNwb3J0LT5hdXRoKTsKKworICBpZiAoX2RidXNfY3JlZGVudGlhbHNfaW5jbHVkZSAoYXV0aF9pZGVudGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfQ1JFREVOVElBTF9MSU5VWF9TRUNVUklUWV9MQUJFTCkpCisgICAgeworICAgICAgLyogSWYgbm8gbWVtb3J5LCB3ZSBhcmUgc3VwcG9zZWQgdG8gcmV0dXJuIFRSVUUgYW5kIHNldCBOVUxMICovCisgICAgICAqbGFiZWxfcCA9IF9kYnVzX3N0cmR1cCAoX2RidXNfY3JlZGVudGlhbHNfZ2V0X2xpbnV4X3NlY3VyaXR5X2xhYmVsIChhdXRoX2lkZW50aXR5KSk7CisKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9Cit9CisKKy8qKgorICogU2VlIGRidXNfY29ubmVjdGlvbl9nZXRfd2luZG93c191c2VyKCkuCisgKgorICogQHBhcmFtIHRyYW5zcG9ydCB0aGUgdHJhbnNwb3J0CisgKiBAcGFyYW0gd2luZG93c19zaWRfcCByZXR1cm4gbG9jYXRpb24gZm9yIHRoZSB1c2VyIElECisgKiBAcmV0dXJucyAjVFJVRSBpZiB1c2VyIGlzIGF2YWlsYWJsZTsgdGhlIHJldHVybmVkIHZhbHVlIG1heSBzdGlsbCBiZSAjTlVMTCBpZiBubyBtZW1vcnkgdG8gY29weSBpdAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfdHJhbnNwb3J0X2dldF93aW5kb3dzX3VzZXIgKERCdXNUcmFuc3BvcnQgICAgICAgICAgICAgICp0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAgICAgICAgICAgICAgICAqKndpbmRvd3Nfc2lkX3ApCit7CisgIERCdXNDcmVkZW50aWFscyAqYXV0aF9pZGVudGl0eTsKKworICAqd2luZG93c19zaWRfcCA9IE5VTEw7CisgIAorICBpZiAoIXRyYW5zcG9ydC0+YXV0aGVudGljYXRlZCkKKyAgICByZXR1cm4gRkFMU0U7CisgIAorICBhdXRoX2lkZW50aXR5ID0gX2RidXNfYXV0aF9nZXRfaWRlbnRpdHkgKHRyYW5zcG9ydC0+YXV0aCk7CisKKyAgaWYgKF9kYnVzX2NyZWRlbnRpYWxzX2luY2x1ZGUgKGF1dGhfaWRlbnRpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0NSRURFTlRJQUxfV0lORE9XU19TSUQpKQorICAgIHsKKyAgICAgIC8qIElmIG5vIG1lbW9yeSwgd2UgYXJlIHN1cHBvc2VkIHRvIHJldHVybiBUUlVFIGFuZCBzZXQgTlVMTCAqLworICAgICAgKndpbmRvd3Nfc2lkX3AgPSBfZGJ1c19zdHJkdXAgKF9kYnVzX2NyZWRlbnRpYWxzX2dldF93aW5kb3dzX3NpZCAoYXV0aF9pZGVudGl0eSkpOworCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKgorICogU2VlIGRidXNfY29ubmVjdGlvbl9zZXRfd2luZG93c191c2VyX2Z1bmN0aW9uKCkuCisgKgorICogQHBhcmFtIHRyYW5zcG9ydCB0aGUgdHJhbnNwb3J0CisgKiBAcGFyYW0gZnVuY3Rpb24gdGhlIHByZWRpY2F0ZQorICogQHBhcmFtIGRhdGEgZGF0YSB0byBwYXNzIHRvIHRoZSBwcmVkaWNhdGUKKyAqIEBwYXJhbSBmcmVlX2RhdGFfZnVuY3Rpb24gZnVuY3Rpb24gdG8gZnJlZSB0aGUgZGF0YQorICogQHBhcmFtIG9sZF9kYXRhIHRoZSBvbGQgdXNlciBkYXRhIHRvIGJlIGZyZWVkCisgKiBAcGFyYW0gb2xkX2ZyZWVfZGF0YV9mdW5jdGlvbiBvbGQgZnJlZSBkYXRhIGZ1bmN0aW9uIHRvIGZyZWUgaXQgd2l0aAorICovCisKK3ZvaWQKK19kYnVzX3RyYW5zcG9ydF9zZXRfd2luZG93c191c2VyX2Z1bmN0aW9uIChEQnVzVHJhbnNwb3J0ICAgICAgICAgICAgICAqdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNBbGxvd1dpbmRvd3NVc2VyRnVuY3Rpb24gICBmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRnJlZUZ1bmN0aW9uICAgICAgICAgICAgZnJlZV9kYXRhX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgKipvbGRfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRnJlZUZ1bmN0aW9uICAgICAgICAgICAqb2xkX2ZyZWVfZGF0YV9mdW5jdGlvbikKK3sKKyAgKm9sZF9kYXRhID0gdHJhbnNwb3J0LT53aW5kb3dzX3VzZXJfZGF0YTsKKyAgKm9sZF9mcmVlX2RhdGFfZnVuY3Rpb24gPSB0cmFuc3BvcnQtPmZyZWVfd2luZG93c191c2VyX2RhdGE7CisKKyAgdHJhbnNwb3J0LT53aW5kb3dzX3VzZXJfZnVuY3Rpb24gPSBmdW5jdGlvbjsKKyAgdHJhbnNwb3J0LT53aW5kb3dzX3VzZXJfZGF0YSA9IGRhdGE7CisgIHRyYW5zcG9ydC0+ZnJlZV93aW5kb3dzX3VzZXJfZGF0YSA9IGZyZWVfZGF0YV9mdW5jdGlvbjsKK30KKworLyoqCisgKiBTZXRzIHRoZSBTQVNMIGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbXMgc3VwcG9ydGVkIGJ5IHRoaXMgdHJhbnNwb3J0LgorICoKKyAqIEBwYXJhbSB0cmFuc3BvcnQgdGhlIHRyYW5zcG9ydAorICogQHBhcmFtIG1lY2hhbmlzbXMgdGhlICNOVUxMLXRlcm1pbmF0ZWQgYXJyYXkgb2YgbWVjaGFuaXNtcworICoKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBubyBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3RyYW5zcG9ydF9zZXRfYXV0aF9tZWNoYW5pc21zIChEQnVzVHJhbnNwb3J0ICAqdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgKiptZWNoYW5pc21zKQoreworICByZXR1cm4gX2RidXNfYXV0aF9zZXRfbWVjaGFuaXNtcyAodHJhbnNwb3J0LT5hdXRoLCBtZWNoYW5pc21zKTsKK30KKworLyoqCisgKiBTZWUgZGJ1c19jb25uZWN0aW9uX3NldF9hbGxvd19hbm9ueW1vdXMoKQorICoKKyAqIEBwYXJhbSB0cmFuc3BvcnQgdGhlIHRyYW5zcG9ydAorICogQHBhcmFtIHZhbHVlICNUUlVFIHRvIGFsbG93IGFub255bW91cyBjb25uZWN0aW9uCisgKi8KK3ZvaWQKK19kYnVzX3RyYW5zcG9ydF9zZXRfYWxsb3dfYW5vbnltb3VzIChEQnVzVHJhbnNwb3J0ICAgICAgICAgICAgICAqdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgICAgICAgICAgICB2YWx1ZSkKK3sKKyAgdHJhbnNwb3J0LT5hbGxvd19hbm9ueW1vdXMgPSB2YWx1ZSAhPSBGQUxTRTsKK30KKworLyoqCisgKiBSZXR1cm4gaG93IG1hbnkgZmlsZSBkZXNjcmlwdG9ycyBhcmUgcGVuZGluZyBpbiB0aGUgbG9hZGVyCisgKgorICogQHBhcmFtIHRyYW5zcG9ydCB0aGUgdHJhbnNwb3J0CisgKi8KK2ludAorX2RidXNfdHJhbnNwb3J0X2dldF9wZW5kaW5nX2Zkc19jb3VudCAoREJ1c1RyYW5zcG9ydCAqdHJhbnNwb3J0KQoreworICByZXR1cm4gX2RidXNfbWVzc2FnZV9sb2FkZXJfZ2V0X3BlbmRpbmdfZmRzX2NvdW50ICh0cmFuc3BvcnQtPmxvYWRlcik7Cit9CisKKy8qKgorICogUmVnaXN0ZXIgYSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbmV2ZXIgdGhlIG51bWJlciBvZiBwZW5kaW5nIGZpbGUKKyAqIGRlc2NyaXB0b3JzIGluIHRoZSBsb2FkZXIgY2hhbmdlLgorICoKKyAqIEBwYXJhbSB0cmFuc3BvcnQgdGhlIHRyYW5zcG9ydAorICogQHBhcmFtIGNhbGxiYWNrIHRoZSBjYWxsYmFjaworICovCit2b2lkCitfZGJ1c190cmFuc3BvcnRfc2V0X3BlbmRpbmdfZmRzX2Z1bmN0aW9uIChEQnVzVHJhbnNwb3J0ICp0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoKiBjYWxsYmFjaykgKHZvaWQgKiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSkKK3sKKyAgX2RidXNfbWVzc2FnZV9sb2FkZXJfc2V0X3BlbmRpbmdfZmRzX2Z1bmN0aW9uICh0cmFuc3BvcnQtPmxvYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaywgZGF0YSk7Cit9CisKKyNpZmRlZiBEQlVTX0VOQUJMRV9TVEFUUwordm9pZAorX2RidXNfdHJhbnNwb3J0X2dldF9zdGF0cyAoREJ1c1RyYW5zcG9ydCAgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgICpxdWV1ZV9ieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgICpxdWV1ZV9mZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90ICAqcGVha19xdWV1ZV9ieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgICpwZWFrX3F1ZXVlX2ZkcykKK3sKKyAgaWYgKHF1ZXVlX2J5dGVzICE9IE5VTEwpCisgICAgKnF1ZXVlX2J5dGVzID0gX2RidXNfY291bnRlcl9nZXRfc2l6ZV92YWx1ZSAodHJhbnNwb3J0LT5saXZlX21lc3NhZ2VzKTsKKworICBpZiAocXVldWVfZmRzICE9IE5VTEwpCisgICAgKnF1ZXVlX2ZkcyA9IF9kYnVzX2NvdW50ZXJfZ2V0X3VuaXhfZmRfdmFsdWUgKHRyYW5zcG9ydC0+bGl2ZV9tZXNzYWdlcyk7CisKKyAgaWYgKHBlYWtfcXVldWVfYnl0ZXMgIT0gTlVMTCkKKyAgICAqcGVha19xdWV1ZV9ieXRlcyA9IF9kYnVzX2NvdW50ZXJfZ2V0X3BlYWtfc2l6ZV92YWx1ZSAodHJhbnNwb3J0LT5saXZlX21lc3NhZ2VzKTsKKworICBpZiAocGVha19xdWV1ZV9mZHMgIT0gTlVMTCkKKyAgICAqcGVha19xdWV1ZV9mZHMgPSBfZGJ1c19jb3VudGVyX2dldF9wZWFrX3VuaXhfZmRfdmFsdWUgKHRyYW5zcG9ydC0+bGl2ZV9tZXNzYWdlcyk7Cit9CisjZW5kaWYgLyogREJVU19FTkFCTEVfU1RBVFMgKi8KKworLyoqIEB9ICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtdHJhbnNwb3J0LmggYi9kYnVzL2RidXMtdHJhbnNwb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUzNzg3ZAotLS0gL2Rldi9udWxsCisrKyBiL2RidXMvZGJ1cy10cmFuc3BvcnQuaApAQCAtMCwwICsxLDExNyBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXRyYW5zcG9ydC5oIERCdXNUcmFuc3BvcnQgb2JqZWN0IChpbnRlcm5hbCB0byBELUJVUyBpbXBsZW1lbnRhdGlvbikKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDQgIFJlZCBIYXQgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworI2lmbmRlZiBEQlVTX1RSQU5TUE9SVF9ICisjZGVmaW5lIERCVVNfVFJBTlNQT1JUX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy1pbnRlcm5hbHMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtY29ubmVjdGlvbi5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1wcm90b2NvbC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1hZGRyZXNzLmg+CisKK0RCVVNfQkVHSU5fREVDTFMKKwordHlwZWRlZiBzdHJ1Y3QgREJ1c1RyYW5zcG9ydCBEQnVzVHJhbnNwb3J0OworCitEQnVzVHJhbnNwb3J0KiAgICAgX2RidXNfdHJhbnNwb3J0X29wZW4gICAgICAgICAgICAgICAgICAgKERCdXNBZGRyZXNzRW50cnkgICAgICAgICAgICplbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgICAgICAgICAgKmVycm9yKTsKK0RCdXNUcmFuc3BvcnQqICAgICBfZGJ1c190cmFuc3BvcnRfcmVmICAgICAgICAgICAgICAgICAgICAoREJ1c1RyYW5zcG9ydCAgICAgICAgICAgICAgKnRyYW5zcG9ydCk7Cit2b2lkICAgICAgICAgICAgICAgX2RidXNfdHJhbnNwb3J0X3VucmVmICAgICAgICAgICAgICAgICAgKERCdXNUcmFuc3BvcnQgICAgICAgICAgICAgICp0cmFuc3BvcnQpOwordm9pZCAgICAgICAgICAgICAgIF9kYnVzX3RyYW5zcG9ydF9kaXNjb25uZWN0ICAgICAgICAgICAgIChEQnVzVHJhbnNwb3J0ICAgICAgICAgICAgICAqdHJhbnNwb3J0KTsKK2RidXNfYm9vbF90ICAgICAgICBfZGJ1c190cmFuc3BvcnRfZ2V0X2lzX2Nvbm5lY3RlZCAgICAgICAoREJ1c1RyYW5zcG9ydCAgICAgICAgICAgICAgKnRyYW5zcG9ydCk7CitkYnVzX2Jvb2xfdCAgICAgICAgX2RidXNfdHJhbnNwb3J0X3BlZWtfaXNfYXV0aGVudGljYXRlZCAgKERCdXNUcmFuc3BvcnQgICAgICAgICAgICAgICp0cmFuc3BvcnQpOworZGJ1c19ib29sX3QgICAgICAgIF9kYnVzX3RyYW5zcG9ydF90cnlfdG9fYXV0aGVudGljYXRlICAgIChEQnVzVHJhbnNwb3J0ICAgICAgICAgICAgICAqdHJhbnNwb3J0KTsKK2RidXNfYm9vbF90ICAgICAgICBfZGJ1c190cmFuc3BvcnRfZ2V0X2lzX2Fub255bW91cyAgICAgICAoREJ1c1RyYW5zcG9ydCAgICAgICAgICAgICAgKnRyYW5zcG9ydCk7CitkYnVzX2Jvb2xfdCAgICAgICAgX2RidXNfdHJhbnNwb3J0X2Nhbl9wYXNzX3VuaXhfZmQgICAgICAgKERCdXNUcmFuc3BvcnQgICAgICAgICAgICAgICp0cmFuc3BvcnQpOworCitjb25zdCBjaGFyKiAgICAgICAgX2RidXNfdHJhbnNwb3J0X2dldF9hZGRyZXNzICAgICAgICAgICAgKERCdXNUcmFuc3BvcnQgICAgICAgICAgICAgICp0cmFuc3BvcnQpOworY29uc3QgY2hhciogICAgICAgIF9kYnVzX3RyYW5zcG9ydF9nZXRfc2VydmVyX2lkICAgICAgICAgIChEQnVzVHJhbnNwb3J0ICAgICAgICAgICAgICAqdHJhbnNwb3J0KTsKK2RidXNfYm9vbF90ICAgICAgICBfZGJ1c190cmFuc3BvcnRfaGFuZGxlX3dhdGNoICAgICAgICAgICAoREJ1c1RyYW5zcG9ydCAgICAgICAgICAgICAgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1dhdGNoICAgICAgICAgICAgICAgICAgKndhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICAgY29uZGl0aW9uKTsKK2RidXNfYm9vbF90ICAgICAgICBfZGJ1c190cmFuc3BvcnRfc2V0X2Nvbm5lY3Rpb24gICAgICAgICAoREJ1c1RyYW5zcG9ydCAgICAgICAgICAgICAgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gICAgICAgICAgICAgKmNvbm5lY3Rpb24pOwordm9pZCAgICAgICAgICAgICAgIF9kYnVzX3RyYW5zcG9ydF9kb19pdGVyYXRpb24gICAgICAgICAgIChEQnVzVHJhbnNwb3J0ICAgICAgICAgICAgICAqdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0X21pbGxpc2Vjb25kcyk7CitEQnVzRGlzcGF0Y2hTdGF0dXMgX2RidXNfdHJhbnNwb3J0X2dldF9kaXNwYXRjaF9zdGF0dXMgICAgKERCdXNUcmFuc3BvcnQgICAgICAgICAgICAgICp0cmFuc3BvcnQpOworZGJ1c19ib29sX3QgICAgICAgIF9kYnVzX3RyYW5zcG9ydF9xdWV1ZV9tZXNzYWdlcyAgICAgICAgIChEQnVzVHJhbnNwb3J0ICAgICAgICAgICAgICAqdHJhbnNwb3J0KTsKKwordm9pZCAgICAgICAgICAgICAgIF9kYnVzX3RyYW5zcG9ydF9zZXRfbWF4X21lc3NhZ2Vfc2l6ZSAgIChEQnVzVHJhbnNwb3J0ICAgICAgICAgICAgICAqdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSk7Citsb25nICAgICAgICAgICAgICAgX2RidXNfdHJhbnNwb3J0X2dldF9tYXhfbWVzc2FnZV9zaXplICAgKERCdXNUcmFuc3BvcnQgICAgICAgICAgICAgICp0cmFuc3BvcnQpOwordm9pZCAgICAgICAgICAgICAgIF9kYnVzX3RyYW5zcG9ydF9zZXRfbWF4X3JlY2VpdmVkX3NpemUgIChEQnVzVHJhbnNwb3J0ICAgICAgICAgICAgICAqdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSk7Citsb25nICAgICAgICAgICAgICAgX2RidXNfdHJhbnNwb3J0X2dldF9tYXhfcmVjZWl2ZWRfc2l6ZSAgKERCdXNUcmFuc3BvcnQgICAgICAgICAgICAgICp0cmFuc3BvcnQpOworCit2b2lkICAgICAgICAgICAgICAgX2RidXNfdHJhbnNwb3J0X3NldF9tYXhfbWVzc2FnZV91bml4X2ZkcyAoREJ1c1RyYW5zcG9ydCAgICAgICAgICAgICAgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nICAgICAgICAgICAgICAgICAgICAgICAgbik7Citsb25nICAgICAgICAgICAgICAgX2RidXNfdHJhbnNwb3J0X2dldF9tYXhfbWVzc2FnZV91bml4X2ZkcyAoREJ1c1RyYW5zcG9ydCAgICAgICAgICAgICAgKnRyYW5zcG9ydCk7Cit2b2lkICAgICAgICAgICAgICAgX2RidXNfdHJhbnNwb3J0X3NldF9tYXhfcmVjZWl2ZWRfdW5peF9mZHMoREJ1c1RyYW5zcG9ydCAgICAgICAgICAgICAgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nICAgICAgICAgICAgICAgICAgICAgICAgbik7Citsb25nICAgICAgICAgICAgICAgX2RidXNfdHJhbnNwb3J0X2dldF9tYXhfcmVjZWl2ZWRfdW5peF9mZHMoREJ1c1RyYW5zcG9ydCAgICAgICAgICAgICAgKnRyYW5zcG9ydCk7CisKK2RidXNfYm9vbF90ICAgICAgICBfZGJ1c190cmFuc3BvcnRfZ2V0X3NvY2tldF9mZCAgICAgICAgICAoREJ1c1RyYW5zcG9ydCAgICAgICAgICAgICAgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1NvY2tldCAgICAgICAgICAgICAgICAgKmZkX3ApOworZGJ1c19ib29sX3QgICAgICAgIF9kYnVzX3RyYW5zcG9ydF9nZXRfdW5peF91c2VyICAgICAgICAgIChEQnVzVHJhbnNwb3J0ICAgICAgICAgICAgICAqdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAqdWlkKTsKK2RidXNfYm9vbF90ICAgICAgICBfZGJ1c190cmFuc3BvcnRfZ2V0X3VuaXhfcHJvY2Vzc19pZCAgICAgKERCdXNUcmFuc3BvcnQgICAgICAgICAgICAgICp0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgICAgICpwaWQpOworZGJ1c19ib29sX3QgICAgICAgIF9kYnVzX3RyYW5zcG9ydF9nZXRfYWR0X2F1ZGl0X3Nlc3Npb25fZGF0YSAoREJ1c1RyYW5zcG9ydCAgICAgICAgICAgICAgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgKipkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSk7Cit2b2lkICAgICAgICAgICAgICAgX2RidXNfdHJhbnNwb3J0X3NldF91bml4X3VzZXJfZnVuY3Rpb24gKERCdXNUcmFuc3BvcnQgICAgICAgICAgICAgICp0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNBbGxvd1VuaXhVc2VyRnVuY3Rpb24gICBmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNGcmVlRnVuY3Rpb24gICAgICAgICAgICBmcmVlX2RhdGFfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgKipvbGRfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgICAgICAgICAgKm9sZF9mcmVlX2RhdGFfZnVuY3Rpb24pOworZGJ1c19ib29sX3QgICAgICAgIF9kYnVzX3RyYW5zcG9ydF9nZXRfd2luZG93c191c2VyICAgICAgIChEQnVzVHJhbnNwb3J0ICAgICAgICAgICAgICAqdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICAgICAgICAgICAgICAgICoqd2luZG93c19zaWRfcCk7CitkYnVzX2Jvb2xfdCAgICAgICAgX2RidXNfdHJhbnNwb3J0X2dldF9saW51eF9zZWN1cml0eV9sYWJlbCAoREJ1c1RyYW5zcG9ydCAgICAgICAgICAgICp0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICAgICAgICAgICAgICAgKipsYWJlbF9wKTsKKwordm9pZCAgICAgICAgICAgICAgIF9kYnVzX3RyYW5zcG9ydF9zZXRfd2luZG93c191c2VyX2Z1bmN0aW9uIChEQnVzVHJhbnNwb3J0ICAgICAgICAgICAgICAqdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQWxsb3dXaW5kb3dzVXNlckZ1bmN0aW9uICAgZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRnJlZUZ1bmN0aW9uICAgICAgICAgICAgZnJlZV9kYXRhX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICoqb2xkX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNGcmVlRnVuY3Rpb24gICAgICAgICAgICpvbGRfZnJlZV9kYXRhX2Z1bmN0aW9uKTsKK2RidXNfYm9vbF90ICAgICAgICBfZGJ1c190cmFuc3BvcnRfc2V0X2F1dGhfbWVjaGFuaXNtcyAgICAoREJ1c1RyYW5zcG9ydCAgICAgICAgICAgICAgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgICAgICAgICAqKm1lY2hhbmlzbXMpOwordm9pZCAgICAgICAgICAgICAgIF9kYnVzX3RyYW5zcG9ydF9zZXRfYWxsb3dfYW5vbnltb3VzICAgIChEQnVzVHJhbnNwb3J0ICAgICAgICAgICAgICAqdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICAgICAgICAgICAgdmFsdWUpOworaW50ICAgICAgICAgICAgICAgIF9kYnVzX3RyYW5zcG9ydF9nZXRfcGVuZGluZ19mZHNfY291bnQgIChEQnVzVHJhbnNwb3J0ICAgICAgICAgICAgICAqdHJhbnNwb3J0KTsKK3ZvaWQgICAgICAgICAgICAgICBfZGJ1c190cmFuc3BvcnRfc2V0X3BlbmRpbmdfZmRzX2Z1bmN0aW9uIChEQnVzVHJhbnNwb3J0ICp0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoKiBjYWxsYmFjaykgKHZvaWQgKiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSk7CisKKy8qIGlmIERCVVNfRU5BQkxFX1NUQVRTICovCit2b2lkIF9kYnVzX3RyYW5zcG9ydF9nZXRfc3RhdHMgKERCdXNUcmFuc3BvcnQgICp0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgICpxdWV1ZV9ieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgKnF1ZXVlX2ZkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCAgKnBlYWtfcXVldWVfYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWludDMyX3QgICpwZWFrX3F1ZXVlX2Zkcyk7CisKK0RCVVNfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBEQlVTX1RSQU5TUE9SVF9IICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtdHlwZXMuaCBiL2RidXMvZGJ1cy10eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyMWE1NWEKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtdHlwZXMuaApAQCAtMCwwICsxLDE1NiBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXR5cGVzLmggIHR5cGVzIHN1Y2ggYXMgZGJ1c19ib29sX3QKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgIFJlZCBIYXQgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworI2lmICFkZWZpbmVkIChEQlVTX0lOU0lERV9EQlVTX0gpICYmICFkZWZpbmVkIChEQlVTX0NPTVBJTEFUSU9OKQorI2Vycm9yICJPbmx5IDxkYnVzL2RidXMuaD4gY2FuIGJlIGluY2x1ZGVkIGRpcmVjdGx5LCB0aGlzIGZpbGUgbWF5IGRpc2FwcGVhciBvciBjaGFuZ2UgY29udGVudHMuIgorI2VuZGlmCisKKyNpZm5kZWYgREJVU19UWVBFU19ICisjZGVmaW5lIERCVVNfVFlQRVNfSAorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWFyY2gtZGVwcy5oPgorCit0eXBlZGVmIGRidXNfdWludDMyX3QgIGRidXNfdW5pY2hhcl90OworLyogYm9vbGVhbiBzaXplIG11c3QgYmUgZml4ZWQgYXQgNCBieXRlcyBkdWUgdG8gd2lyZSBwcm90b2NvbCEgKi8KK3R5cGVkZWYgZGJ1c191aW50MzJfdCAgZGJ1c19ib29sX3Q7CisKKy8qIE5vcm1hbGx5IGRvY3MgYXJlIGluIC5jIGZpbGVzLCBidXQgdGhlcmUgaXNuJ3QgYSAuYyBmaWxlIGZvciB0aGlzLiAqLworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c1R5cGVzIEJhc2ljIHR5cGVzCisgKiBAaW5ncm91cCAgREJ1cworICogQGJyaWVmIGRidXNfYm9vbF90LCBkYnVzX2ludDMyX3QsIGV0Yy4KKyAqCisgKiBUeXBlZGVmcyBmb3IgY29tbW9uIHByaW1pdGl2ZSB0eXBlcy4KKyAqCisgKiBAeworICovCisKKy8qKgorICogQHR5cGVkZWYgZGJ1c19ib29sX3QKKyAqCisgKiBBIGJvb2xlYW4sIHZhbGlkIHZhbHVlcyBhcmUgI1RSVUUgYW5kICNGQUxTRS4KKyAqLworCisvKioKKyAqIEB0eXBlZGVmIGRidXNfdWludDMyX3QKKyAqCisgKiBBIDMyLWJpdCB1bnNpZ25lZCBpbnRlZ2VyIG9uIGFsbCBwbGF0Zm9ybXMuCisgKi8KKworLyoqCisgKiBAdHlwZWRlZiBkYnVzX2ludDMyX3QKKyAqCisgKiBBIDMyLWJpdCBzaWduZWQgaW50ZWdlciBvbiBhbGwgcGxhdGZvcm1zLgorICovCisKKy8qKgorICogQHR5cGVkZWYgZGJ1c191aW50MTZfdAorICoKKyAqIEEgMTYtYml0IHVuc2lnbmVkIGludGVnZXIgb24gYWxsIHBsYXRmb3Jtcy4KKyAqLworCisvKioKKyAqIEB0eXBlZGVmIGRidXNfaW50MTZfdAorICoKKyAqIEEgMTYtYml0IHNpZ25lZCBpbnRlZ2VyIG9uIGFsbCBwbGF0Zm9ybXMuCisgKi8KKworCisvKioKKyAqIEB0eXBlZGVmIGRidXNfdWludDY0X3QKKyAqCisgKiBBIDY0LWJpdCB1bnNpZ25lZCBpbnRlZ2VyLgorICovCisKKy8qKgorICogQHR5cGVkZWYgZGJ1c19pbnQ2NF90CisgKgorICogQSA2NC1iaXQgc2lnbmVkIGludGVnZXIuCisgKi8KKworLyoqCisgKiBAZGVmIERCVVNfSEFWRV9JTlQ2NAorICoKKyAqIEFsd2F5cyBkZWZpbmVkLgorICoKKyAqIEluIG9sZGVyIGxpYmRidXMgdmVyc2lvbnMsIHRoaXMgd291bGQgYmUgdW5kZWZpbmVkIGlmIHRoZXJlIHdhcyBubworICogNjQtYml0IGludGVnZXIgdHlwZSBvbiB0aGF0IHBsYXRmb3JtLiBsaWJkYnVzIG5vIGxvbmdlciBzdXBwb3J0cworICogc3VjaCBwbGF0Zm9ybXMuCisgKi8KKworLyoqCisgKiBAZGVmIERCVVNfSU5UNjRfQ09OU1RBTlQKKyAqCisgKiBEZWNsYXJlIGEgNjQtYml0IHNpZ25lZCBpbnRlZ2VyIGNvbnN0YW50LiBUaGUgbWFjcm8KKyAqIGFkZHMgdGhlIG5lY2Vzc2FyeSAiTEwiIG9yIHdoYXRldmVyIGFmdGVyIHRoZSBpbnRlZ2VyLAorICogZ2l2aW5nIGEgbGl0ZXJhbCBzdWNoIGFzICIzMjUxNDUyNDY3NjVMTCIKKyAqLworCisvKioKKyAqIEBkZWYgREJVU19VSU5UNjRfQ09OU1RBTlQKKyAqCisgKiBEZWNsYXJlIGEgNjQtYml0IHVuc2lnbmVkIGludGVnZXIgY29uc3RhbnQuIFRoZSBtYWNybworICogYWRkcyB0aGUgbmVjZXNzYXJ5ICJVTEwiIG9yIHdoYXRldmVyIGFmdGVyIHRoZSBpbnRlZ2VyLAorICogZ2l2aW5nIGEgbGl0ZXJhbCBzdWNoIGFzICIzMjUxNDUyNDY3NjVVTEwiCisgKi8KKworLyoqCisgKiBBbiA4LWJ5dGUgc3RydWN0IHlvdSBjb3VsZCB1c2UgdG8gYWNjZXNzIGludDY0IHdpdGhvdXQgaGF2aW5nCisgKiBpbnQ2NCBzdXBwb3J0LiBVc2UgI2RidXNfaW50NjRfdCBvciAjZGJ1c191aW50NjRfdCBpbnN0ZWFkLgorICovCit0eXBlZGVmIHN0cnVjdAoreworICBkYnVzX3VpbnQzMl90IGZpcnN0MzI7ICAvKio8IGZpcnN0IDMyIGJpdHMgaW4gdGhlIDggYnl0ZXMgKGJld2FyZSBlbmRpYW4gaXNzdWVzKSAqLworICBkYnVzX3VpbnQzMl90IHNlY29uZDMyOyAvKio8IHNlY29uZCAzMiBiaXRzIGluIHRoZSA4IGJ5dGVzIChiZXdhcmUgZW5kaWFuIGlzc3VlcykgKi8KK30gREJ1czhCeXRlU3RydWN0OworCisvKioKKyAqIEEgc2ltcGxlIHZhbHVlIHVuaW9uIHRoYXQgbGV0cyB5b3UgYWNjZXNzIGJ5dGVzIGFzIGlmIHRoZXkKKyAqIHdlcmUgdmFyaW91cyB0eXBlczsgdXNlZnVsIHdoZW4gZGVhbGluZyB3aXRoIGJhc2ljIHR5cGVzIHZpYQorICogdm9pZCBwb2ludGVycyBhbmQgdmFyYXJncy4KKyAqCisgKiBUaGlzIHVuaW9uIGFsc28gY29udGFpbnMgYSBwb2ludGVyIG1lbWJlciAod2hpY2ggY2FuIGJlIHVzZWQKKyAqIHRvIHJldHJpZXZlIGEgc3RyaW5nIGZyb20gZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2Jhc2ljKCksIGZvcgorICogaW5zdGFuY2UpLCBzbyBvbiBmdXR1cmUgcGxhdGZvcm1zIGl0IGNvdWxkIGNvbmNlaXZhYmx5IGJlIGxhcmdlcgorICogdGhhbiA4IGJ5dGVzLgorICovCit0eXBlZGVmIHVuaW9uCit7CisgIHVuc2lnbmVkIGNoYXIgYnl0ZXNbOF07IC8qKjwgYXMgOCBpbmRpdmlkdWFsIGJ5dGVzICovCisgIGRidXNfaW50MTZfdCAgaTE2OyAgIC8qKjwgYXMgaW50MTYgKi8KKyAgZGJ1c191aW50MTZfdCB1MTY7ICAgLyoqPCBhcyBpbnQxNiAqLworICBkYnVzX2ludDMyX3QgIGkzMjsgICAvKio8IGFzIGludDMyICovCisgIGRidXNfdWludDMyX3QgdTMyOyAgIC8qKjwgYXMgaW50MzIgKi8KKyAgZGJ1c19ib29sX3QgICBib29sX3ZhbDsgLyoqPCBhcyBib29sZWFuICovCisgIGRidXNfaW50NjRfdCAgaTY0OyAgIC8qKjwgYXMgaW50NjQgKi8KKyAgZGJ1c191aW50NjRfdCB1NjQ7ICAgLyoqPCBhcyBpbnQ2NCAqLworICBEQnVzOEJ5dGVTdHJ1Y3QgZWlnaHQ7IC8qKjwgYXMgOC1ieXRlIHN0cnVjdCAqLworICBkb3VibGUgZGJsOyAgICAgICAgICAvKio8IGFzIGRvdWJsZSAqLworICB1bnNpZ25lZCBjaGFyIGJ5dDsgICAvKio8IGFzIGJ5dGUgKi8KKyAgY2hhciAqc3RyOyAgICAgICAgICAgLyoqPCBhcyBjaGFyKiAoc3RyaW5nLCBvYmplY3QgcGF0aCBvciBzaWduYXR1cmUpICovCisgIGludCBmZDsgICAgICAgICAgICAgIC8qKjwgYXMgVW5peCBmaWxlIGRlc2NyaXB0b3IgKi8KK30gREJ1c0Jhc2ljVmFsdWU7CisKKy8qKiBAfSAqLworCisjZW5kaWYgLyogREJVU19UWVBFU19IICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtdXNlcmRiLXV0aWwuYyBiL2RidXMvZGJ1cy11c2VyZGItdXRpbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3MGQyMzMKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtdXNlcmRiLXV0aWwuYwpAQCAtMCwwICsxLDUxMyBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXVzZXJkYi11dGlsLmMgV291bGQgYmUgaW4gZGJ1cy11c2VyZGIuYywgYnV0IG5vdCB1c2VkIGluIGxpYmRidXMKKyAqIAorICogQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0LCAyMDA1ICBSZWQgSGF0LCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZGVmaW5lIERCVVNfVVNFUkRCX0lOQ0xVREVTX1BSSVZBVEUgMQorI2luY2x1ZGUgImRidXMtdXNlcmRiLmgiCisjaW5jbHVkZSAiZGJ1cy10ZXN0LmgiCisjaW5jbHVkZSAiZGJ1cy1pbnRlcm5hbHMuaCIKKyNpbmNsdWRlICJkYnVzLXByb3RvY29sLmgiCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpZmRlZiBIQVZFX1NZU1RFTUQKKyNpbmNsdWRlIDxzeXN0ZW1kL3NkLWxvZ2luLmg+CisjZW5kaWYKKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzSW50ZXJuYWxzVXRpbHMKKyAqIEB7CisgKi8KKworc3RhdGljIERCdXNHcm91cEluZm8gKgorX2RidXNfZ3JvdXBfaW5mb19yZWYgKERCdXNHcm91cEluZm8gKmluZm8pCit7CisgIF9kYnVzX2Fzc2VydCAoaW5mby0+cmVmY291bnQgPiAwKTsKKyAgX2RidXNfYXNzZXJ0IChpbmZvLT5yZWZjb3VudCA8IFNJWkVfTUFYKTsKKyAgaW5mby0+cmVmY291bnQrKzsKKyAgcmV0dXJuIGluZm87Cit9CisKKy8qKgorICogQ2hlY2tzIHRvIHNlZSBpZiB0aGUgVUlEIHNlbnQgaW4gaXMgdGhlIGNvbnNvbGUgdXNlcgorICoKKyAqIEBwYXJhbSB1aWQgVUlEIG9mIHBlcnNvbiB0byBjaGVjayAKKyAqIEBwYXJhbSBlcnJvciByZXR1cm4gbG9jYXRpb24gZm9yIGVycm9ycworICogQHJldHVybnMgI1RSVUUgaWYgdGhlIFVJRCBpcyB0aGUgc2FtZSBhcyB0aGUgY29uc29sZSB1c2VyIGFuZCB0aGVyZSBhcmUgbm8gZXJyb3JzCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19pc19jb25zb2xlX3VzZXIgKGRidXNfdWlkX3QgdWlkLAorCQkgICAgICAgREJ1c0Vycm9yICplcnJvcikKK3sKKworICBEQnVzVXNlckRhdGFiYXNlICpkYjsKKyAgY29uc3QgREJ1c1VzZXJJbmZvICppbmZvOworICBkYnVzX2Jvb2xfdCByZXN1bHQgPSBGQUxTRTsKKworI2lmZGVmIEhBVkVfU1lTVEVNRAorICAvKiBjaGVjayBpZiB3ZSBoYXZlIGxvZ2luZCAqLworICBpZiAoYWNjZXNzICgiL3J1bi9zeXN0ZW1kL3NlYXRzLyIsIEZfT0spID49IDApCisgICAgeworICAgICAgaW50IHI7CisKKyAgICAgIC8qIENoZWNrIHdoZXRoZXIgdGhpcyB1c2VyIGlzIGxvZ2dlZCBpbiBvbiBhdCBsZWFzdCBvbmUgcGh5c2ljYWwKKyAgICAgICAgIHNlYXQgKi8KKyAgICAgIHIgPSBzZF91aWRfZ2V0X3NlYXRzICh1aWQsIDAsIE5VTEwpOworICAgICAgaWYgKHIgPCAwKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBfZGJ1c19lcnJvcl9mcm9tX2Vycm5vICgtciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZGV0ZXJtaW5lIHNlYXRzIG9mIHVzZXIgXCIiIERCVVNfVUlEX0ZPUk1BVCAiXCI6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19zdHJlcnJvciAoLXIpKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgcmV0dXJuIChyID4gMCk7CisgICAgfQorI2VuZGlmCisKKyNpZmRlZiBIQVZFX0NPTlNPTEVfT1dORVJfRklMRQorCisgIERCdXNTdHJpbmcgZjsKKyAgREJ1c1N0YXQgc3Q7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmYpKQorICAgIHsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kKCZmLCBEQlVTX0NPTlNPTEVfT1dORVJfRklMRSkpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUoJmYpOworICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoX2RidXNfc3RhdCgmZiwgJnN0LCBOVUxMKSAmJiAoc3QudWlkID09IHVpZCkpCisgICAgeworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUoJmYpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIF9kYnVzX3N0cmluZ19mcmVlKCZmKTsKKworI2VuZGlmIC8qIEhBVkVfQ09OU09MRV9PV05FUl9GSUxFICovCisKKyAgaWYgKCFfZGJ1c191c2VyX2RhdGFiYXNlX2xvY2tfc3lzdGVtICgpKQorICAgIHsKKyAgICAgIF9EQlVTX1NFVF9PT00gKGVycm9yKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgZGIgPSBfZGJ1c191c2VyX2RhdGFiYXNlX2dldF9zeXN0ZW0gKCk7CisgIGlmIChkYiA9PSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9GQUlMRUQsICJDb3VsZCBub3QgZ2V0IHN5c3RlbSBkYXRhYmFzZS4iKTsKKyAgICAgIF9kYnVzX3VzZXJfZGF0YWJhc2VfdW5sb2NrX3N5c3RlbSAoKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgLyogVFBURDogdGhpcyBzaG91bGQgYmUgY2FjaGUtc2FmZSwgd2UndmUgbG9ja2VkIHRoZSBEQiBhbmQKKyAgICBfZGJ1c191c2VyX2F0X2NvbnNvbGUgZG9lc24ndCBwYXNzIGl0IG9uLiAqLworICBpbmZvID0gX2RidXNfdXNlcl9kYXRhYmFzZV9sb29rdXAgKGRiLCB1aWQsIE5VTEwsIGVycm9yKTsKKworICBpZiAoaW5mbyA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3VzZXJfZGF0YWJhc2VfdW5sb2NrX3N5c3RlbSAoKTsKKyAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHJlc3VsdCA9IF9kYnVzX3VzZXJfYXRfY29uc29sZSAoaW5mby0+dXNlcm5hbWUsIGVycm9yKTsKKworICBfZGJ1c191c2VyX2RhdGFiYXNlX3VubG9ja19zeXN0ZW0gKCk7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBHZXRzIHVzZXIgSUQgZ2l2ZW4gdXNlcm5hbWUKKyAqCisgKiBAcGFyYW0gdXNlcm5hbWUgdGhlIHVzZXJuYW1lCisgKiBAcGFyYW0gdWlkIHJldHVybiBsb2NhdGlvbiBmb3IgVUlECisgKiBAcmV0dXJucyAjVFJVRSBpZiB1c2VybmFtZSBleGlzdGVkIGFuZCB3ZSBnb3QgdGhlIFVJRAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfZ2V0X3VzZXJfaWQgKGNvbnN0IERCdXNTdHJpbmcgICp1c2VybmFtZSwKKyAgICAgICAgICAgICAgICAgICBkYnVzX3VpZF90ICAgICAgICAqdWlkKQoreworICByZXR1cm4gX2RidXNfZ2V0X3VzZXJfaWRfYW5kX3ByaW1hcnlfZ3JvdXAgKHVzZXJuYW1lLCB1aWQsIE5VTEwpOworfQorCisvKioKKyAqIEdldHMgZ3JvdXAgSUQgZ2l2ZW4gZ3JvdXBuYW1lCisgKgorICogQHBhcmFtIGdyb3VwbmFtZSB0aGUgZ3JvdXBuYW1lCisgKiBAcGFyYW0gZ2lkIHJldHVybiBsb2NhdGlvbiBmb3IgR0lECisgKiBAcmV0dXJucyAjVFJVRSBpZiBncm91cCBuYW1lIGV4aXN0ZWQgYW5kIHdlIGdvdCB0aGUgR0lECisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19nZXRfZ3JvdXBfaWQgKGNvbnN0IERCdXNTdHJpbmcgICpncm91cG5hbWUsCisgICAgICAgICAgICAgICAgICAgIGRidXNfZ2lkX3QgICAgICAgICpnaWQpCit7CisgIERCdXNVc2VyRGF0YWJhc2UgKmRiOworICBjb25zdCBEQnVzR3JvdXBJbmZvICppbmZvOworCisgIC8qIEZJWE1FOiB0aGlzIGNhbid0IGRpc3Rpbmd1aXNoIEVOT01FTSBmcm9tIG90aGVyIGVycm9ycyAqLworICBpZiAoIV9kYnVzX3VzZXJfZGF0YWJhc2VfbG9ja19zeXN0ZW0gKCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGRiID0gX2RidXNfdXNlcl9kYXRhYmFzZV9nZXRfc3lzdGVtICgpOworICBpZiAoZGIgPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c191c2VyX2RhdGFiYXNlX3VubG9ja19zeXN0ZW0gKCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghX2RidXNfdXNlcl9kYXRhYmFzZV9nZXRfZ3JvdXBuYW1lIChkYiwgZ3JvdXBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZm8sIE5VTEwpKQorICAgIHsKKyAgICAgIF9kYnVzX3VzZXJfZGF0YWJhc2VfdW5sb2NrX3N5c3RlbSAoKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgKmdpZCA9IGluZm8tPmdpZDsKKyAgCisgIF9kYnVzX3VzZXJfZGF0YWJhc2VfdW5sb2NrX3N5c3RlbSAoKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogR2V0cyB1c2VyIElEIGFuZCBwcmltYXJ5IGdyb3VwIGdpdmVuIHVzZXJuYW1lCisgKgorICogQHBhcmFtIHVzZXJuYW1lIHRoZSB1c2VybmFtZQorICogQHBhcmFtIHVpZF9wIHJldHVybiBsb2NhdGlvbiBmb3IgVUlECisgKiBAcGFyYW0gZ2lkX3AgcmV0dXJuIGxvY2F0aW9uIGZvciBHSUQKKyAqIEByZXR1cm5zICNUUlVFIGlmIHVzZXJuYW1lIGV4aXN0ZWQgYW5kIHdlIGdvdCB0aGUgVUlEIGFuZCBHSUQKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2dldF91c2VyX2lkX2FuZF9wcmltYXJ5X2dyb3VwIChjb25zdCBEQnVzU3RyaW5nICAqdXNlcm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aWRfdCAgICAgICAgKnVpZF9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfZ2lkX3QgICAgICAgICpnaWRfcCkKK3sKKyAgREJ1c1VzZXJEYXRhYmFzZSAqZGI7CisgIGNvbnN0IERCdXNVc2VySW5mbyAqaW5mbzsKKworICAvKiBGSVhNRTogdGhpcyBjYW4ndCBkaXN0aW5ndWlzaCBFTk9NRU0gZnJvbSBvdGhlciBlcnJvcnMgKi8KKyAgaWYgKCFfZGJ1c191c2VyX2RhdGFiYXNlX2xvY2tfc3lzdGVtICgpKQorICAgIHJldHVybiBGQUxTRTsKKworICBkYiA9IF9kYnVzX3VzZXJfZGF0YWJhc2VfZ2V0X3N5c3RlbSAoKTsKKyAgaWYgKGRiID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfdXNlcl9kYXRhYmFzZV91bmxvY2tfc3lzdGVtICgpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIV9kYnVzX3VzZXJfZGF0YWJhc2VfZ2V0X3VzZXJuYW1lIChkYiwgdXNlcm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmZvLCBOVUxMKSkKKyAgICB7CisgICAgICBfZGJ1c191c2VyX2RhdGFiYXNlX3VubG9ja19zeXN0ZW0gKCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICh1aWRfcCkKKyAgICAqdWlkX3AgPSBpbmZvLT51aWQ7CisgIGlmIChnaWRfcCkKKyAgICAqZ2lkX3AgPSBpbmZvLT5wcmltYXJ5X2dpZDsKKyAgCisgIF9kYnVzX3VzZXJfZGF0YWJhc2VfdW5sb2NrX3N5c3RlbSAoKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogTG9va3MgdXAgYSBnaWQgb3IgZ3JvdXAgbmFtZSBpbiB0aGUgdXNlciBkYXRhYmFzZS4gIE9ubHkgb25lIG9mCisgKiBuYW1lIG9yIEdJRCBjYW4gYmUgcHJvdmlkZWQuIFRoZXJlIGFyZSB3cmFwcGVyIGZ1bmN0aW9ucyBmb3IgdGhpcworICogdGhhdCBhcmUgYmV0dGVyIHRvIHVzZSwgdGhpcyBvbmUgZG9lcyBubyBsb2NraW5nIG9yIGFueXRoaW5nIG9uIHRoZQorICogZGF0YWJhc2UgYW5kIG90aGVyd2lzZSBzb3J0IG9mIHN1Y2tzLgorICoKKyAqIEBwYXJhbSBkYiB0aGUgZGF0YWJhc2UKKyAqIEBwYXJhbSBnaWQgdGhlIGdyb3VwIElEIG9yICNEQlVTX0dJRF9VTlNFVAorICogQHBhcmFtIGdyb3VwbmFtZSBncm91cCBuYW1lIG9yICNOVUxMIAorICogQHBhcmFtIGVycm9yIGVycm9yIHRvIGZpbGwgaW4KKyAqIEByZXR1cm5zIHRoZSBlbnRyeSBpbiB0aGUgZGF0YWJhc2UgKGJvcnJvd2VkLCBkbyBub3QgZnJlZSkKKyAqLworY29uc3QgREJ1c0dyb3VwSW5mbyAqCitfZGJ1c191c2VyX2RhdGFiYXNlX2xvb2t1cF9ncm91cCAoREJ1c1VzZXJEYXRhYmFzZSAqZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19naWRfdCAgICAgICAgZ2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKmdyb3VwbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgREJ1c0dyb3VwSW5mbyAqaW5mbzsKKworICBfREJVU19BU1NFUlRfRVJST1JfSVNfQ0xFQVIgKGVycm9yKTsKKworICAgLyogU2VlIGlmIHRoZSBncm91cCBpcyByZWFsbHkgYSBudW1iZXIgKi8KKyAgIGlmIChnaWQgPT0gREJVU19VSURfVU5TRVQpCisgICAgeworICAgICAgdW5zaWduZWQgbG9uZyBuOworCisgICAgICBpZiAoX2RidXNfaXNfYV9udW1iZXIgKGdyb3VwbmFtZSwgJm4pKQorICAgICAgICBnaWQgPSBuOworICAgIH0KKworICBpZiAoZ2lkICE9IERCVVNfR0lEX1VOU0VUKQorICAgIGluZm8gPSBfZGJ1c19oYXNoX3RhYmxlX2xvb2t1cF91aW50cHRyIChkYi0+Z3JvdXBzLCBnaWQpOworICBlbHNlCisgICAgaW5mbyA9IF9kYnVzX2hhc2hfdGFibGVfbG9va3VwX3N0cmluZyAoZGItPmdyb3Vwc19ieV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoZ3JvdXBuYW1lKSk7CisgIGlmIChpbmZvKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJVc2luZyBjYWNoZSBmb3IgR0lEICJEQlVTX0dJRF9GT1JNQVQiIGluZm9ybWF0aW9uXG4iLAorICAgICAgICAgICAgICAgICAgICAgaW5mby0+Z2lkKTsKKyAgICAgIHJldHVybiBpbmZvOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmIChnaWQgIT0gREJVU19HSURfVU5TRVQpCisJX2RidXNfdmVyYm9zZSAoIk5vIGNhY2hlIGZvciBHSUQgIkRCVVNfR0lEX0ZPUk1BVCJcbiIsCisJCSAgICAgICBnaWQpOworICAgICAgZWxzZQorCV9kYnVzX3ZlcmJvc2UgKCJObyBjYWNoZSBmb3IgZ3JvdXBuYW1lIFwiJXNcIlxuIiwKKwkJICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoZ3JvdXBuYW1lKSk7CisgICAgICAKKyAgICAgIGluZm8gPSBkYnVzX25ldzAgKERCdXNHcm91cEluZm8sIDEpOworICAgICAgaWYgKGluZm8gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICBpbmZvLT5yZWZjb3VudCA9IDE7CisKKyAgICAgIGlmIChnaWQgIT0gREJVU19HSURfVU5TRVQpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIV9kYnVzX2dyb3VwX2luZm9fZmlsbF9naWQgKGluZm8sIGdpZCwgZXJyb3IpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICAgICAgICAgIF9kYnVzX2dyb3VwX2luZm9fdW5yZWYgKGluZm8pOworICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgaWYgKCFfZGJ1c19ncm91cF9pbmZvX2ZpbGwgKGluZm8sIGdyb3VwbmFtZSwgZXJyb3IpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfREJVU19BU1NFUlRfRVJST1JfSVNfU0VUIChlcnJvcik7CisgICAgICAgICAgICAgIF9kYnVzX2dyb3VwX2luZm9fdW5yZWYgKGluZm8pOworICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAvKiBkb24ndCB1c2UgdGhlc2UgcGFzdCBoZXJlICovCisgICAgICBnaWQgPSBEQlVTX0dJRF9VTlNFVDsKKyAgICAgIGdyb3VwbmFtZSA9IE5VTEw7CisKKyAgICAgIGlmIChfZGJ1c19oYXNoX3RhYmxlX2luc2VydF91aW50cHRyIChkYi0+Z3JvdXBzLCBpbmZvLT5naWQsIGluZm8pKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfZ3JvdXBfaW5mb19yZWYgKGluZm8pOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgICAgICBfZGJ1c19ncm91cF9pbmZvX3VucmVmIChpbmZvKTsKKyAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisKKyAgICAgIGlmIChfZGJ1c19oYXNoX3RhYmxlX2luc2VydF9zdHJpbmcgKGRiLT5ncm91cHNfYnlfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPmdyb3VwbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8pKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfZ3JvdXBfaW5mb19yZWYgKGluZm8pOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19oYXNoX3RhYmxlX3JlbW92ZV91aW50cHRyIChkYi0+Z3JvdXBzLCBpbmZvLT5naWQpOworICAgICAgICAgIF9kYnVzX2dyb3VwX2luZm9fdW5yZWYgKGluZm8pOworICAgICAgICAgIGRidXNfc2V0X2Vycm9yIChlcnJvciwgREJVU19FUlJPUl9OT19NRU1PUlksIE5VTEwpOworICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgIC8qIFJlbGVhc2UgdGhlIG9yaWdpbmFsIHJlZmVyZW5jZSAqLworICAgICAgX2RidXNfZ3JvdXBfaW5mb191bnJlZiAoaW5mbyk7CisKKyAgICAgIC8qIFJldHVybiBhIGJvcnJvd2VkIHJlZmVyZW5jZSB0byB0aGUgREJ1c0dyb3VwSW5mbyBvd25lZCBieSB0aGUKKyAgICAgICAqIHR3byBoYXNoIHRhYmxlcyAqLworICAgICAgcmV0dXJuIGluZm87CisgICAgfQorfQorCisKKy8qKgorICogR2V0cyB0aGUgdXNlciBpbmZvcm1hdGlvbiBmb3IgdGhlIGdpdmVuIGdyb3VwIG5hbWUsCisgKiByZXR1cm5lZCBncm91cCBpbmZvIHNob3VsZCBub3QgYmUgZnJlZWQuIAorICoKKyAqIEBwYXJhbSBkYiB1c2VyIGRhdGFiYXNlCisgKiBAcGFyYW0gZ3JvdXBuYW1lIHRoZSBncm91cCBuYW1lCisgKiBAcGFyYW0gaW5mbyByZXR1cm4gbG9jYXRpb24gZm9yIGNvbnN0IHJlZiB0byBncm91cCBpbmZvCisgKiBAcGFyYW0gZXJyb3IgZXJyb3IgbG9jYXRpb24KKyAqIEByZXR1cm5zICNGQUxTRSBpZiBlcnJvciBpcyBzZXQKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3VzZXJfZGF0YWJhc2VfZ2V0X2dyb3VwbmFtZSAoREJ1c1VzZXJEYXRhYmFzZSAgICAgKmRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICAgICAqZ3JvdXBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzR3JvdXBJbmZvICoqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgICAgKmVycm9yKQoreworICAqaW5mbyA9IF9kYnVzX3VzZXJfZGF0YWJhc2VfbG9va3VwX2dyb3VwIChkYiwgREJVU19HSURfVU5TRVQsIGdyb3VwbmFtZSwgZXJyb3IpOworICByZXR1cm4gKmluZm8gIT0gTlVMTDsKK30KKworLyoqCisgKiBHZXRzIHRoZSB1c2VyIGluZm9ybWF0aW9uIGZvciB0aGUgZ2l2ZW4gR0lELAorICogcmV0dXJuZWQgZ3JvdXAgaW5mbyBzaG91bGQgbm90IGJlIGZyZWVkLiAKKyAqCisgKiBAcGFyYW0gZGIgdXNlciBkYXRhYmFzZQorICogQHBhcmFtIGdpZCB0aGUgZ3JvdXAgSUQKKyAqIEBwYXJhbSBpbmZvIHJldHVybiBsb2NhdGlvbiBmb3IgY29uc3QgcmVmIHRvIGdyb3VwIGluZm8KKyAqIEBwYXJhbSBlcnJvciBlcnJvciBsb2NhdGlvbgorICogQHJldHVybnMgI0ZBTFNFIGlmIGVycm9yIGlzIHNldAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfdXNlcl9kYXRhYmFzZV9nZXRfZ2lkIChEQnVzVXNlckRhdGFiYXNlICAgICAqZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfZ2lkX3QgICAgICAgICAgICBnaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNHcm91cEluZm8gKippbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAgICAqZXJyb3IpCit7CisgICppbmZvID0gX2RidXNfdXNlcl9kYXRhYmFzZV9sb29rdXBfZ3JvdXAgKGRiLCBnaWQsIE5VTEwsIGVycm9yKTsKKyAgcmV0dXJuICppbmZvICE9IE5VTEw7Cit9CisKKworLyoqCisgKiBHZXRzIGFsbCBncm91cHMgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIFVJRC4gUmV0dXJucyAjRkFMU0UKKyAqIGlmIG5vIG1lbW9yeSwgb3IgdXNlciBpc24ndCBrbm93biwgYnV0IGFsd2F5cyBpbml0aWFsaXplcworICogZ3JvdXBfaWRzIHRvIGEgTlVMTCBhcnJheS4gCisgKgorICogQHBhcmFtIHVpZCB0aGUgVUlECisgKiBAcGFyYW0gZ3JvdXBfaWRzIHJldHVybiBsb2NhdGlvbiBmb3IgYXJyYXkgb2YgZ3JvdXAgSURzCisgKiBAcGFyYW0gbl9ncm91cF9pZHMgcmV0dXJuIGxvY2F0aW9uIGZvciBsZW5ndGggb2YgcmV0dXJuZWQgYXJyYXkKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSBVSUQgZXhpc3RlZCBhbmQgd2UgZ290IHNvbWUgY3JlZGVudGlhbHMKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2dyb3Vwc19mcm9tX3VpZCAoZGJ1c191aWRfdCAgICAgICAgIHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19naWRfdCAgICAgICAqKmdyb3VwX2lkcywKKyAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgKm5fZ3JvdXBfaWRzKQoreworICBEQnVzVXNlckRhdGFiYXNlICpkYjsKKyAgY29uc3QgREJ1c1VzZXJJbmZvICppbmZvOworICAqZ3JvdXBfaWRzID0gTlVMTDsKKyAgKm5fZ3JvdXBfaWRzID0gMDsKKworICAvKiBGSVhNRTogdGhpcyBjYW4ndCBkaXN0aW5ndWlzaCBFTk9NRU0gZnJvbSBvdGhlciBlcnJvcnMgKi8KKyAgaWYgKCFfZGJ1c191c2VyX2RhdGFiYXNlX2xvY2tfc3lzdGVtICgpKQorICAgIHJldHVybiBGQUxTRTsKKworICBkYiA9IF9kYnVzX3VzZXJfZGF0YWJhc2VfZ2V0X3N5c3RlbSAoKTsKKyAgaWYgKGRiID09IE5VTEwpCisgICAgeworICAgICAgX2RidXNfdXNlcl9kYXRhYmFzZV91bmxvY2tfc3lzdGVtICgpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIV9kYnVzX3VzZXJfZGF0YWJhc2VfZ2V0X3VpZCAoZGIsIHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmZvLCBOVUxMKSkKKyAgICB7CisgICAgICBfZGJ1c191c2VyX2RhdGFiYXNlX3VubG9ja19zeXN0ZW0gKCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIF9kYnVzX2Fzc2VydCAoaW5mby0+dWlkID09IHVpZCk7CisgIAorICBpZiAoaW5mby0+bl9ncm91cF9pZHMgPiAwKQorICAgIHsKKyAgICAgICpncm91cF9pZHMgPSBkYnVzX25ldyAoZGJ1c19naWRfdCwgaW5mby0+bl9ncm91cF9pZHMpOworICAgICAgaWYgKCpncm91cF9pZHMgPT0gTlVMTCkKKyAgICAgICAgeworCSAgX2RidXNfdXNlcl9kYXRhYmFzZV91bmxvY2tfc3lzdGVtICgpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICAqbl9ncm91cF9pZHMgPSBpbmZvLT5uX2dyb3VwX2lkczsKKworICAgICAgbWVtY3B5ICgqZ3JvdXBfaWRzLCBpbmZvLT5ncm91cF9pZHMsIGluZm8tPm5fZ3JvdXBfaWRzICogc2l6ZW9mIChkYnVzX2dpZF90KSk7CisgICAgfQorCisgIF9kYnVzX3VzZXJfZGF0YWJhc2VfdW5sb2NrX3N5c3RlbSAoKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisvKiogQH0gKi8KKworI2lmZGVmIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTCisjaW5jbHVkZSA8c3RkaW8uaD4KKworLyoqCisgKiBVbml0IHRlc3QgZm9yIGRidXMtdXNlcmRiLmMuCisgKiAKKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c191c2VyZGJfdGVzdCAoY29uc3QgY2hhciAqdGVzdF9kYXRhX2RpcikKK3sKKyAgY29uc3QgREJ1c1N0cmluZyAqdXNlcm5hbWU7CisgIGNvbnN0IERCdXNTdHJpbmcgKmhvbWVkaXI7CisgIGRidXNfdWlkX3QgdWlkOworICB1bnNpZ25lZCBsb25nICpncm91cF9pZHM7CisgIGludCBuX2dyb3VwX2lkcywgaTsKKyAgREJ1c0Vycm9yIGVycm9yOworCisgIGlmICghX2RidXNfdXNlcm5hbWVfZnJvbV9jdXJyZW50X3Byb2Nlc3MgKCZ1c2VybmFtZSkpCisgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiZGlkbid0IGdldCB1c2VybmFtZSIpOworCisgIGlmICghX2RidXNfaG9tZWRpcl9mcm9tX2N1cnJlbnRfcHJvY2VzcyAoJmhvbWVkaXIpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImRpZG4ndCBnZXQgaG9tZWRpciIpOyAgCisKKyAgaWYgKCFfZGJ1c19nZXRfdXNlcl9pZCAodXNlcm5hbWUsICZ1aWQpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImRpZG4ndCBnZXQgdWlkIik7CisKKyAgaWYgKCFfZGJ1c19ncm91cHNfZnJvbV91aWQgKHVpZCwgJmdyb3VwX2lkcywgJm5fZ3JvdXBfaWRzKSkKKyAgICBfZGJ1c19hc3NlcnRfbm90X3JlYWNoZWQgKCJkaWRuJ3QgZ2V0IGdyb3VwcyIpOworCisgIHByaW50ZiAoIiAgICBDdXJyZW50IHVzZXI6ICVzIGhvbWVkaXI6ICVzIGdpZHM6IiwKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKHVzZXJuYW1lKSwKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKGhvbWVkaXIpKTsKKworICBmb3IgKGk9MDsgaTxuX2dyb3VwX2lkczsgaSsrKQorICAgICAgcHJpbnRmKCIgJWxkIiwgZ3JvdXBfaWRzW2ldKTsKKworICBwcmludGYgKCJcbiIpOworCisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKyAgcHJpbnRmICgiSXMgQ29uc29sZSB1c2VyOiAlaVxuIiwKKyAgICAgICAgICBfZGJ1c19pc19jb25zb2xlX3VzZXIgKHVpZCwgJmVycm9yKSk7CisgIHByaW50ZiAoIkludm9jYXRpb24gd2FzIE9LOiAlc1xuIiwgZXJyb3IubWVzc2FnZSA/IGVycm9yLm1lc3NhZ2UgOiAieWVzIik7CisgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgcHJpbnRmICgiSXMgQ29uc29sZSB1c2VyIDQ3MTE6ICVpXG4iLAorICAgICAgICAgIF9kYnVzX2lzX2NvbnNvbGVfdXNlciAoNDcxMSwgJmVycm9yKSk7CisgIHByaW50ZiAoIkludm9jYXRpb24gd2FzIE9LOiAlc1xuIiwgZXJyb3IubWVzc2FnZSA/IGVycm9yLm1lc3NhZ2UgOiAieWVzIik7CisgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKworICBkYnVzX2ZyZWUgKGdyb3VwX2lkcyk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYgLyogREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMgKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy11c2VyZGIuYyBiL2RidXMvZGJ1cy11c2VyZGIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDQzNGJiCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLXVzZXJkYi5jCkBAIC0wLDAgKzEsNzM0IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtdXNlcmRiLmMgVXNlciBkYXRhYmFzZSBhYnN0cmFjdGlvbgorICogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQgIFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKyNpbmNsdWRlIDxjb25maWcuaD4KKyNkZWZpbmUgREJVU19VU0VSREJfSU5DTFVERVNfUFJJVkFURSAxCisjaW5jbHVkZSAiZGJ1cy11c2VyZGIuaCIKKyNpbmNsdWRlICJkYnVzLWhhc2guaCIKKyNpbmNsdWRlICJkYnVzLXRlc3QuaCIKKyNpbmNsdWRlICJkYnVzLWludGVybmFscy5oIgorI2luY2x1ZGUgImRidXMtcHJvdG9jb2wuaCIKKyNpbmNsdWRlICJkYnVzLWNyZWRlbnRpYWxzLmgiCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKy8qKgorICogQGFkZHRvZ3JvdXAgREJ1c0ludGVybmFsc1V0aWxzCisgKiBAeworICovCisKK3N0YXRpYyBEQnVzVXNlckluZm8gKgorX2RidXNfdXNlcl9pbmZvX3JlZiAoREJ1c1VzZXJJbmZvICppbmZvKQoreworICBfZGJ1c19hc3NlcnQgKGluZm8tPnJlZmNvdW50ID4gMCk7CisgIF9kYnVzX2Fzc2VydCAoaW5mby0+cmVmY291bnQgPCBTSVpFX01BWCk7CisgIGluZm8tPnJlZmNvdW50Kys7CisgIHJldHVybiBpbmZvOworfQorCisvKioKKyAqIERlY3JlbWVudHMgdGhlIHJlZmVyZW5jZSBjb3VudC4gSWYgaXQgcmVhY2hlcyAwLAorICogZnJlZXMgdGhlIGdpdmVuICNEQnVzVXNlckluZm8ncyBtZW1iZXJzIHdpdGggX2RidXNfdXNlcl9pbmZvX2ZyZWUoKQorICogYW5kIGFsc28gY2FsbHMgZGJ1c19mcmVlKCkgb24gdGhlIGJsb2NrIGl0c2VsZgorICoKKyAqIEBwYXJhbSBpbmZvIHRoZSBpbmZvCisgKi8KK3ZvaWQKK19kYnVzX3VzZXJfaW5mb191bnJlZiAoREJ1c1VzZXJJbmZvICppbmZvKQoreworICBpZiAoaW5mbyA9PSBOVUxMKSAvKiBoYXNoIHRhYmxlIHdpbGwgcGFzcyBOVUxMICovCisgICAgcmV0dXJuOworCisgIF9kYnVzX2Fzc2VydCAoaW5mby0+cmVmY291bnQgPiAwKTsKKyAgX2RidXNfYXNzZXJ0IChpbmZvLT5yZWZjb3VudCA8IFNJWkVfTUFYKTsKKworICBpZiAoLS1pbmZvLT5yZWZjb3VudCA+IDApCisgICAgcmV0dXJuOworCisgIF9kYnVzX3VzZXJfaW5mb19mcmVlIChpbmZvKTsKKyAgZGJ1c19mcmVlIChpbmZvKTsKK30KKworLyoqCisgKiBEZWNyZW1lbnRzIHRoZSByZWZlcmVuY2UgY291bnQuIElmIGl0IHJlYWNoZXMgMCwKKyAqIGZyZWVzIHRoZSBnaXZlbiAjREJ1c0dyb3VwSW5mbydzIG1lbWJlcnMgd2l0aCBfZGJ1c19ncm91cF9pbmZvX2ZyZWUoKQorICogYW5kIGFsc28gY2FsbHMgZGJ1c19mcmVlKCkgb24gdGhlIGJsb2NrIGl0c2VsZgorICoKKyAqIEBwYXJhbSBpbmZvIHRoZSBpbmZvCisgKi8KK3ZvaWQKK19kYnVzX2dyb3VwX2luZm9fdW5yZWYgKERCdXNHcm91cEluZm8gKmluZm8pCit7CisgIGlmIChpbmZvID09IE5VTEwpIC8qIGhhc2ggdGFibGUgd2lsbCBwYXNzIE5VTEwgKi8KKyAgICByZXR1cm47CisKKyAgX2RidXNfYXNzZXJ0IChpbmZvLT5yZWZjb3VudCA+IDApOworICBfZGJ1c19hc3NlcnQgKGluZm8tPnJlZmNvdW50IDwgU0laRV9NQVgpOworCisgIGlmICgtLWluZm8tPnJlZmNvdW50ID4gMCkKKyAgICByZXR1cm47CisKKyAgX2RidXNfZ3JvdXBfaW5mb19mcmVlIChpbmZvKTsKKyAgZGJ1c19mcmVlIChpbmZvKTsKK30KKworLyoqCisgKiBGcmVlcyB0aGUgbWVtYmVycyBvZiBpbmZvCisgKiAoYnV0IG5vdCBpbmZvIGl0c2VsZikKKyAqIEBwYXJhbSBpbmZvIHRoZSB1c2VyIGluZm8gc3RydWN0CisgKi8KK3ZvaWQKK19kYnVzX3VzZXJfaW5mb19mcmVlIChEQnVzVXNlckluZm8gKmluZm8pCit7CisgIGRidXNfZnJlZSAoaW5mby0+Z3JvdXBfaWRzKTsKKyAgZGJ1c19mcmVlIChpbmZvLT51c2VybmFtZSk7CisgIGRidXNfZnJlZSAoaW5mby0+aG9tZWRpcik7Cit9CisKKy8qKgorICogRnJlZXMgdGhlIG1lbWJlcnMgb2YgaW5mbyAoYnV0IG5vdCBpbmZvIGl0c2VsZikuCisgKgorICogQHBhcmFtIGluZm8gdGhlIGdyb3VwIGluZm8KKyAqLwordm9pZAorX2RidXNfZ3JvdXBfaW5mb19mcmVlIChEQnVzR3JvdXBJbmZvICAgICppbmZvKQoreworICBkYnVzX2ZyZWUgKGluZm8tPmdyb3VwbmFtZSk7Cit9CisKKy8qKgorICogQ2hlY2tzIGlmIGEgZ2l2ZW4gc3RyaW5nIGlzIGFjdHVhbGx5IGEgbnVtYmVyIAorICogYW5kIGNvbnZlcnRzIGl0IGlmIGl0IGlzIAorICoKKyAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZyB0byBjaGVjaworICogQHBhcmFtIG51bSB0aGUgbWVtb3J5IGxvY2F0aW9uIG9mIHRoZSB1bnNpZ25lZCBsb25nIHRvIGZpbGwgaW4KKyAqIEByZXR1cm5zIFRSVUUgaWYgc3RyIGlzIGEgbnVtYmVyIGFuZCBudW0gaXMgZmlsbGVkIGluIAorICovCitkYnVzX2Jvb2xfdAorX2RidXNfaXNfYV9udW1iZXIgKGNvbnN0IERCdXNTdHJpbmcgKnN0ciwKKyAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgICpudW0pCit7CisgIGludCBlbmQ7CisKKyAgaWYgKF9kYnVzX3N0cmluZ19wYXJzZV91aW50IChzdHIsIDAsIG51bSwgJmVuZCkgJiYKKyAgICAgIGVuZCA9PSBfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAoc3RyKSkKKyAgICByZXR1cm4gVFJVRTsKKyAgZWxzZQorICAgIHJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBMb29rcyB1cCBhIHVpZCBvciB1c2VybmFtZSBpbiB0aGUgdXNlciBkYXRhYmFzZS4gIE9ubHkgb25lIG9mIG5hbWUKKyAqIG9yIFVJRCBjYW4gYmUgcHJvdmlkZWQuIFRoZXJlIGFyZSB3cmFwcGVyIGZ1bmN0aW9ucyBmb3IgdGhpcyB0aGF0CisgKiBhcmUgYmV0dGVyIHRvIHVzZSwgdGhpcyBvbmUgZG9lcyBubyBsb2NraW5nIG9yIGFueXRoaW5nIG9uIHRoZQorICogZGF0YWJhc2UgYW5kIG90aGVyd2lzZSBzb3J0IG9mIHN1Y2tzLgorICoKKyAqIEBwYXJhbSBkYiB0aGUgZGF0YWJhc2UKKyAqIEBwYXJhbSB1aWQgdGhlIHVzZXIgSUQgb3IgI0RCVVNfVUlEX1VOU0VUCisgKiBAcGFyYW0gdXNlcm5hbWUgdXNlcm5hbWUgb3IgI05VTEwgCisgKiBAcGFyYW0gZXJyb3IgZXJyb3IgdG8gZmlsbCBpbgorICogQHJldHVybnMgdGhlIGVudHJ5IGluIHRoZSBkYXRhYmFzZSAoYm9ycm93ZWQsIGRvIG5vdCBmcmVlKQorICovCitjb25zdCBEQnVzVXNlckluZm8gKgorX2RidXNfdXNlcl9kYXRhYmFzZV9sb29rdXAgKERCdXNVc2VyRGF0YWJhc2UgKmRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWlkX3QgICAgICAgIHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICp1c2VybmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICplcnJvcikKK3sKKyAgREJ1c1VzZXJJbmZvICppbmZvOworCisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19DTEVBUiAoZXJyb3IpOworICBfZGJ1c19hc3NlcnQgKHVpZCAhPSBEQlVTX1VJRF9VTlNFVCB8fCB1c2VybmFtZSAhPSBOVUxMKTsKKworICAvKiBTZWUgaWYgdGhlIHVzZXJuYW1lIGlzIHJlYWxseSBhIG51bWJlciAqLworICBpZiAodWlkID09IERCVVNfVUlEX1VOU0VUKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGxvbmcgbjsKKworICAgICAgaWYgKF9kYnVzX2lzX2FfbnVtYmVyICh1c2VybmFtZSwgJm4pKQorICAgICAgICB1aWQgPSBuOworICAgIH0KKworICBpZiAodWlkICE9IERCVVNfVUlEX1VOU0VUKQorICAgIGluZm8gPSBfZGJ1c19oYXNoX3RhYmxlX2xvb2t1cF91aW50cHRyIChkYi0+dXNlcnMsIHVpZCk7CisgIGVsc2UKKyAgICBpbmZvID0gX2RidXNfaGFzaF90YWJsZV9sb29rdXBfc3RyaW5nIChkYi0+dXNlcnNfYnlfbmFtZSwgX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhICh1c2VybmFtZSkpOworCisgIGlmIChpbmZvKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJVc2luZyBjYWNoZSBmb3IgVUlEICJEQlVTX1VJRF9GT1JNQVQiIGluZm9ybWF0aW9uXG4iLAorICAgICAgICAgICAgICAgICAgICAgaW5mby0+dWlkKTsKKyAgICAgIHJldHVybiBpbmZvOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmICh1aWQgIT0gREJVU19VSURfVU5TRVQpCisJX2RidXNfdmVyYm9zZSAoIk5vIGNhY2hlIGZvciBVSUQgIkRCVVNfVUlEX0ZPUk1BVCJcbiIsCisJCSAgICAgICB1aWQpOworICAgICAgZWxzZQorCV9kYnVzX3ZlcmJvc2UgKCJObyBjYWNoZSBmb3IgdXNlciBcIiVzXCJcbiIsCisJCSAgICAgICBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKHVzZXJuYW1lKSk7CisgICAgICAKKyAgICAgIGluZm8gPSBkYnVzX25ldzAgKERCdXNVc2VySW5mbywgMSk7CisgICAgICBpZiAoaW5mbyA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgIGluZm8tPnJlZmNvdW50ID0gMTsKKworICAgICAgaWYgKHVpZCAhPSBEQlVTX1VJRF9VTlNFVCkKKyAgICAgICAgeworICAgICAgICAgIGlmICghX2RidXNfdXNlcl9pbmZvX2ZpbGxfdWlkIChpbmZvLCB1aWQsIGVycm9yKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgICAgICAgICBfZGJ1c191c2VyX2luZm9fdW5yZWYgKGluZm8pOworICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgaWYgKCFfZGJ1c191c2VyX2luZm9fZmlsbCAoaW5mbywgdXNlcm5hbWUsIGVycm9yKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX0RCVVNfQVNTRVJUX0VSUk9SX0lTX1NFVCAoZXJyb3IpOworICAgICAgICAgICAgICBfZGJ1c191c2VyX2luZm9fdW5yZWYgKGluZm8pOworICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAvKiBiZSBzdXJlIHdlIGRvbid0IHVzZSB0aGVzZSBhZnRlciBoZXJlICovCisgICAgICB1aWQgPSBEQlVTX1VJRF9VTlNFVDsKKyAgICAgIHVzZXJuYW1lID0gTlVMTDsKKworICAgICAgLyogaW5zZXJ0IGludG8gaGFzaCAqLworICAgICAgaWYgKF9kYnVzX2hhc2hfdGFibGVfaW5zZXJ0X3VpbnRwdHIgKGRiLT51c2VycywgaW5mby0+dWlkLCBpbmZvKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3VzZXJfaW5mb19yZWYgKGluZm8pOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX3NldF9lcnJvciAoZXJyb3IsIERCVVNfRVJST1JfTk9fTUVNT1JZLCBOVUxMKTsKKyAgICAgICAgICBfZGJ1c191c2VyX2luZm9fdW5yZWYgKGluZm8pOworICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgIGlmIChfZGJ1c19oYXNoX3RhYmxlX2luc2VydF9zdHJpbmcgKGRiLT51c2Vyc19ieV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+dXNlcm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3VzZXJfaW5mb19yZWYgKGluZm8pOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19oYXNoX3RhYmxlX3JlbW92ZV91aW50cHRyIChkYi0+dXNlcnMsIGluZm8tPnVpZCk7CisgICAgICAgICAgZGJ1c19zZXRfZXJyb3IgKGVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSwgTlVMTCk7CisgICAgICAgICAgX2RidXNfdXNlcl9pbmZvX3VucmVmIChpbmZvKTsKKyAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICBfZGJ1c191c2VyX2luZm9fdW5yZWYgKGluZm8pOworCisgICAgICAvKiBSZXR1cm4gYSBib3Jyb3dlZCBwb2ludGVyIHRvIHRoZSBEQnVzVXNlckluZm8gb3duZWQgYnkgdGhlCisgICAgICAgKiBoYXNoIHRhYmxlcyAqLworICAgICAgcmV0dXJuIGluZm87CisgICAgfQorfQorCitzdGF0aWMgZGJ1c19ib29sX3QgZGF0YWJhc2VfbG9ja2VkID0gRkFMU0U7CitzdGF0aWMgREJ1c1VzZXJEYXRhYmFzZSAqc3lzdGVtX2RiID0gTlVMTDsKK3N0YXRpYyBEQnVzU3RyaW5nIHByb2Nlc3NfdXNlcm5hbWU7CitzdGF0aWMgREJ1c1N0cmluZyBwcm9jZXNzX2hvbWVkaXI7CisgICAgICAKK3N0YXRpYyB2b2lkCitzaHV0ZG93bl9zeXN0ZW1fZGIgKHZvaWQgKmRhdGEpCit7CisgIGlmIChzeXN0ZW1fZGIgIT0gTlVMTCkKKyAgICBfZGJ1c191c2VyX2RhdGFiYXNlX3VucmVmIChzeXN0ZW1fZGIpOworICBzeXN0ZW1fZGIgPSBOVUxMOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnByb2Nlc3NfdXNlcm5hbWUpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnByb2Nlc3NfaG9tZWRpcik7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAoraW5pdF9zeXN0ZW1fZGIgKHZvaWQpCit7CisgIF9kYnVzX2Fzc2VydCAoZGF0YWJhc2VfbG9ja2VkKTsKKyAgICAKKyAgaWYgKHN5c3RlbV9kYiA9PSBOVUxMKQorICAgIHsKKyAgICAgIERCdXNFcnJvciBlcnJvciA9IERCVVNfRVJST1JfSU5JVDsKKyAgICAgIGNvbnN0IERCdXNVc2VySW5mbyAqaW5mbzsKKyAgICAgIAorICAgICAgc3lzdGVtX2RiID0gX2RidXNfdXNlcl9kYXRhYmFzZV9uZXcgKCk7CisgICAgICBpZiAoc3lzdGVtX2RiID09IE5VTEwpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgaWYgKCFfZGJ1c191c2VyX2RhdGFiYXNlX2dldF91aWQgKHN5c3RlbV9kYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGJ1c19nZXR1aWQgKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKSkKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3VzZXJfZGF0YWJhc2VfdW5yZWYgKHN5c3RlbV9kYik7CisgICAgICAgICAgc3lzdGVtX2RiID0gTlVMTDsKKyAgICAgICAgICAKKyAgICAgICAgICBpZiAoZGJ1c19lcnJvcl9oYXNfbmFtZSAoJmVycm9yLCBEQlVTX0VSUk9SX05PX01FTU9SWSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogVGhpcyByZWFsbHkgc2hvdWxkIG5vdCBoYXBwZW4uICovCisgICAgICAgICAgICAgIF9kYnVzX3dhcm4gKCJDb3VsZCBub3QgZ2V0IHBhc3N3b3JkIGRhdGFiYXNlIGluZm9ybWF0aW9uIGZvciBVSUQgb2YgY3VycmVudCBwcm9jZXNzOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLm1lc3NhZ2UpOworICAgICAgICAgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmcHJvY2Vzc191c2VybmFtZSkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c191c2VyX2RhdGFiYXNlX3VucmVmIChzeXN0ZW1fZGIpOworICAgICAgICAgIHN5c3RlbV9kYiA9IE5VTEw7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZwcm9jZXNzX2hvbWVkaXIpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwcm9jZXNzX3VzZXJuYW1lKTsKKyAgICAgICAgICBfZGJ1c191c2VyX2RhdGFiYXNlX3VucmVmIChzeXN0ZW1fZGIpOworICAgICAgICAgIHN5c3RlbV9kYiA9IE5VTEw7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2FwcGVuZCAoJnByb2Nlc3NfdXNlcm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPnVzZXJuYW1lKSB8fAorICAgICAgICAgICFfZGJ1c19zdHJpbmdfYXBwZW5kICgmcHJvY2Vzc19ob21lZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5ob21lZGlyKSB8fAorICAgICAgICAgICFfZGJ1c19yZWdpc3Rlcl9zaHV0ZG93bl9mdW5jIChzaHV0ZG93bl9zeXN0ZW1fZGIsIE5VTEwpKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZwcm9jZXNzX3VzZXJuYW1lKTsKKyAgICAgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJnByb2Nlc3NfaG9tZWRpcik7CisgICAgICAgICAgX2RidXNfdXNlcl9kYXRhYmFzZV91bnJlZiAoc3lzdGVtX2RiKTsKKyAgICAgICAgICBzeXN0ZW1fZGIgPSBOVUxMOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBMb2NrcyBnbG9iYWwgc3lzdGVtIHVzZXIgZGF0YWJhc2UuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c191c2VyX2RhdGFiYXNlX2xvY2tfc3lzdGVtICh2b2lkKQoreworICBpZiAoX0RCVVNfTE9DSyAoc3lzdGVtX3VzZXJzKSkKKyAgICB7CisgICAgICBkYXRhYmFzZV9sb2NrZWQgPSBUUlVFOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KK30KKworLyoqCisgKiBVbmxvY2tzIGdsb2JhbCBzeXN0ZW0gdXNlciBkYXRhYmFzZS4KKyAqLwordm9pZAorX2RidXNfdXNlcl9kYXRhYmFzZV91bmxvY2tfc3lzdGVtICh2b2lkKQoreworICBkYXRhYmFzZV9sb2NrZWQgPSBGQUxTRTsKKyAgX0RCVVNfVU5MT0NLIChzeXN0ZW1fdXNlcnMpOworfQorCisvKioKKyAqIEdldHMgdGhlIHN5c3RlbSBnbG9iYWwgdXNlciBkYXRhYmFzZTsKKyAqIG11c3QgYmUgY2FsbGVkIHdpdGggbG9jayBoZWxkIChfZGJ1c191c2VyX2RhdGFiYXNlX2xvY2tfc3lzdGVtKCkpLgorICoKKyAqIEByZXR1cm5zIHRoZSBkYXRhYmFzZSBvciAjTlVMTCBpZiBubyBtZW1vcnkKKyAqLworREJ1c1VzZXJEYXRhYmFzZSoKK19kYnVzX3VzZXJfZGF0YWJhc2VfZ2V0X3N5c3RlbSAodm9pZCkKK3sKKyAgX2RidXNfYXNzZXJ0IChkYXRhYmFzZV9sb2NrZWQpOworCisgIGluaXRfc3lzdGVtX2RiICgpOworICAKKyAgcmV0dXJuIHN5c3RlbV9kYjsKK30KKworLyoqCisgKiBGbHVzaGVzIHRoZSBzeXN0ZW0gZ2xvYmFsIHVzZXIgZGF0YWJhc2U7CisgKi8KK3ZvaWQKK19kYnVzX3VzZXJfZGF0YWJhc2VfZmx1c2hfc3lzdGVtICh2b2lkKQoreworICBpZiAoIV9kYnVzX3VzZXJfZGF0YWJhc2VfbG9ja19zeXN0ZW0gKCkpCisgICAgeworICAgICAgLyogbm90aGluZyB0byBmbHVzaCAqLworICAgICAgcmV0dXJuOworICAgIH0KKworICAgaWYgKHN5c3RlbV9kYiAhPSBOVUxMKQorICAgIF9kYnVzX3VzZXJfZGF0YWJhc2VfZmx1c2ggKHN5c3RlbV9kYik7CisKKyAgX2RidXNfdXNlcl9kYXRhYmFzZV91bmxvY2tfc3lzdGVtICgpOworfQorCisvKioKKyAqIEdldHMgdXNlcm5hbWUgb2YgdXNlciBvd25pbmcgY3VycmVudCBwcm9jZXNzLiAgVGhlIHJldHVybmVkIHN0cmluZworICogaXMgdmFsaWQgdW50aWwgZGJ1c19zaHV0ZG93bigpIGlzIGNhbGxlZC4KKyAqCisgKiBAcGFyYW0gdXNlcm5hbWUgcGxhY2UgdG8gc3RvcmUgcG9pbnRlciB0byB1c2VybmFtZQorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vIG1lbW9yeQorICovCitkYnVzX2Jvb2xfdAorX2RidXNfdXNlcm5hbWVfZnJvbV9jdXJyZW50X3Byb2Nlc3MgKGNvbnN0IERCdXNTdHJpbmcgKip1c2VybmFtZSkKK3sKKyAgaWYgKCFfZGJ1c191c2VyX2RhdGFiYXNlX2xvY2tfc3lzdGVtICgpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWluaXRfc3lzdGVtX2RiICgpKQorICAgIHsKKyAgICAgIF9kYnVzX3VzZXJfZGF0YWJhc2VfdW5sb2NrX3N5c3RlbSAoKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICp1c2VybmFtZSA9ICZwcm9jZXNzX3VzZXJuYW1lOworICBfZGJ1c191c2VyX2RhdGFiYXNlX3VubG9ja19zeXN0ZW0gKCk7ICAKKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBHZXRzIGhvbWVkaXIgb2YgdXNlciBvd25pbmcgY3VycmVudCBwcm9jZXNzLiAgVGhlIHJldHVybmVkIHN0cmluZworICogaXMgdmFsaWQgdW50aWwgZGJ1c19zaHV0ZG93bigpIGlzIGNhbGxlZC4KKyAqCisgKiBAcGFyYW0gaG9tZWRpciBwbGFjZSB0byBzdG9yZSBwb2ludGVyIHRvIGhvbWVkaXIKKyAqIEByZXR1cm5zICNGQUxTRSBpZiBubyBtZW1vcnkKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2hvbWVkaXJfZnJvbV9jdXJyZW50X3Byb2Nlc3MgKGNvbnN0IERCdXNTdHJpbmcgICoqaG9tZWRpcikKK3sKKyAgaWYgKCFfZGJ1c191c2VyX2RhdGFiYXNlX2xvY2tfc3lzdGVtICgpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWluaXRfc3lzdGVtX2RiICgpKQorICAgIHsKKyAgICAgIF9kYnVzX3VzZXJfZGF0YWJhc2VfdW5sb2NrX3N5c3RlbSAoKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICpob21lZGlyID0gJnByb2Nlc3NfaG9tZWRpcjsKKyAgX2RidXNfdXNlcl9kYXRhYmFzZV91bmxvY2tfc3lzdGVtICgpOworCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIEdldHMgdGhlIGhvbWUgZGlyZWN0b3J5IGZvciB0aGUgZ2l2ZW4gdXNlci4KKyAqCisgKiBAcGFyYW0gdXNlcm5hbWUgdGhlIHVzZXJuYW1lCisgKiBAcGFyYW0gaG9tZWRpciBzdHJpbmcgdG8gYXBwZW5kIGhvbWUgZGlyZWN0b3J5IHRvCisgKiBAcmV0dXJucyAjVFJVRSBpZiB1c2VyIGV4aXN0ZWQgYW5kIHdlIGFwcGVuZGVkIHRoZWlyIGhvbWVkaXIKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX2hvbWVkaXJfZnJvbV91c2VybmFtZSAoY29uc3QgREJ1c1N0cmluZyAqdXNlcm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgKmhvbWVkaXIpCit7CisgIERCdXNVc2VyRGF0YWJhc2UgKmRiOworICBjb25zdCBEQnVzVXNlckluZm8gKmluZm87CisKKyAgLyogRklYTUU6IHRoaXMgY2FuJ3QgZGlzdGluZ3Vpc2ggRU5PTUVNIGZyb20gb3RoZXIgZXJyb3JzICovCisgIGlmICghX2RidXNfdXNlcl9kYXRhYmFzZV9sb2NrX3N5c3RlbSAoKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgZGIgPSBfZGJ1c191c2VyX2RhdGFiYXNlX2dldF9zeXN0ZW0gKCk7CisgIGlmIChkYiA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3VzZXJfZGF0YWJhc2VfdW5sb2NrX3N5c3RlbSAoKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c191c2VyX2RhdGFiYXNlX2dldF91c2VybmFtZSAoZGIsIHVzZXJuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5mbywgTlVMTCkpCisgICAgeworICAgICAgX2RidXNfdXNlcl9kYXRhYmFzZV91bmxvY2tfc3lzdGVtICgpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKGhvbWVkaXIsIGluZm8tPmhvbWVkaXIpKQorICAgIHsKKyAgICAgIF9kYnVzX3VzZXJfZGF0YWJhc2VfdW5sb2NrX3N5c3RlbSAoKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIAorICBfZGJ1c191c2VyX2RhdGFiYXNlX3VubG9ja19zeXN0ZW0gKCk7CisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIEdldHMgdGhlIGhvbWUgZGlyZWN0b3J5IGZvciB0aGUgZ2l2ZW4gdXNlci4KKyAqCisgKiBAcGFyYW0gdWlkIHRoZSB1aWQKKyAqIEBwYXJhbSBob21lZGlyIHN0cmluZyB0byBhcHBlbmQgaG9tZSBkaXJlY3RvcnkgdG8KKyAqIEByZXR1cm5zICNUUlVFIGlmIHVzZXIgZXhpc3RlZCBhbmQgd2UgYXBwZW5kZWQgdGhlaXIgaG9tZWRpcgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfaG9tZWRpcl9mcm9tX3VpZCAoZGJ1c191aWRfdCAgICAgICAgIHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgICpob21lZGlyKQoreworICBEQnVzVXNlckRhdGFiYXNlICpkYjsKKyAgY29uc3QgREJ1c1VzZXJJbmZvICppbmZvOworCisgIGlmICh1aWQgPT0gX2RidXNfZ2V0dWlkICgpICYmIHVpZCA9PSBfZGJ1c19nZXRldWlkICgpKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKmZyb21fZW52aXJvbm1lbnQ7CisKKyAgICAgIGZyb21fZW52aXJvbm1lbnQgPSBfZGJ1c19nZXRlbnYgKCJIT01FIik7CisKKyAgICAgIGlmIChmcm9tX2Vudmlyb25tZW50ICE9IE5VTEwpCisgICAgICAgIHJldHVybiBfZGJ1c19zdHJpbmdfYXBwZW5kIChob21lZGlyLCBmcm9tX2Vudmlyb25tZW50KTsKKyAgICB9CisKKyAgLyogRklYTUU6IHRoaXMgY2FuJ3QgZGlzdGluZ3Vpc2ggRU5PTUVNIGZyb20gb3RoZXIgZXJyb3JzICovCisgIGlmICghX2RidXNfdXNlcl9kYXRhYmFzZV9sb2NrX3N5c3RlbSAoKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgZGIgPSBfZGJ1c191c2VyX2RhdGFiYXNlX2dldF9zeXN0ZW0gKCk7CisgIGlmIChkYiA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3VzZXJfZGF0YWJhc2VfdW5sb2NrX3N5c3RlbSAoKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c191c2VyX2RhdGFiYXNlX2dldF91aWQgKGRiLCB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5mbywgTlVMTCkpCisgICAgeworICAgICAgX2RidXNfdXNlcl9kYXRhYmFzZV91bmxvY2tfc3lzdGVtICgpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKGhvbWVkaXIsIGluZm8tPmhvbWVkaXIpKQorICAgIHsKKyAgICAgIF9kYnVzX3VzZXJfZGF0YWJhc2VfdW5sb2NrX3N5c3RlbSAoKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIAorICBfZGJ1c191c2VyX2RhdGFiYXNlX3VubG9ja19zeXN0ZW0gKCk7CisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIEFkZHMgdGhlIGNyZWRlbnRpYWxzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIHVzZXJuYW1lLgorICoKKyAqIFVzZWQgYW1vbmcgb3RoZXIgcHVycG9zZXMgdG8gcGFyc2VzIGEgZGVzaXJlZCBpZGVudGl0eSBwcm92aWRlZAorICogZnJvbSBhIGNsaWVudCBpbiB0aGUgYXV0aCBwcm90b2NvbC4gT24gVU5JWCB0aGlzIG1lYW5zIHBhcnNpbmcgYQorICogVUlELCBvbiBXaW5kb3dzIHByb2JhYmx5IHBhcnNpbmcgYW4gU0lEIHN0cmluZy4KKyAqIAorICogQHRvZG8gdGhpcyBpcyBicm9rZW4gYmVjYXVzZSBpdCB0cmVhdHMgT09NIGFuZCBwYXJzZSBlcnJvcgorICogdGhlIHNhbWUgd2F5LiBOZWVkcyBhICNEQnVzRXJyb3IuCisgKiAKKyAqIEBwYXJhbSBjcmVkZW50aWFscyBjcmVkZW50aWFscyB0byBmaWxsIGluIAorICogQHBhcmFtIHVzZXJuYW1lIHRoZSB1c2VybmFtZQorICogQHJldHVybnMgI1RSVUUgaWYgdGhlIHVzZXJuYW1lIGV4aXN0ZWQgYW5kIHdlIGdvdCBzb21lIGNyZWRlbnRpYWxzCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c19jcmVkZW50aWFsc19hZGRfZnJvbV91c2VyIChEQnVzQ3JlZGVudGlhbHMgICpjcmVkZW50aWFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKnVzZXJuYW1lKQoreworICBEQnVzVXNlckRhdGFiYXNlICpkYjsKKyAgY29uc3QgREJ1c1VzZXJJbmZvICppbmZvOworCisgIC8qIEZJWE1FOiB0aGlzIGNhbid0IGRpc3Rpbmd1aXNoIEVOT01FTSBmcm9tIG90aGVyIGVycm9ycyAqLworICBpZiAoIV9kYnVzX3VzZXJfZGF0YWJhc2VfbG9ja19zeXN0ZW0gKCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGRiID0gX2RidXNfdXNlcl9kYXRhYmFzZV9nZXRfc3lzdGVtICgpOworICBpZiAoZGIgPT0gTlVMTCkKKyAgICB7CisgICAgICBfZGJ1c191c2VyX2RhdGFiYXNlX3VubG9ja19zeXN0ZW0gKCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGlmICghX2RidXNfdXNlcl9kYXRhYmFzZV9nZXRfdXNlcm5hbWUgKGRiLCB1c2VybmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZm8sIE5VTEwpKQorICAgIHsKKyAgICAgIF9kYnVzX3VzZXJfZGF0YWJhc2VfdW5sb2NrX3N5c3RlbSAoKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19jcmVkZW50aWFsc19hZGRfdW5peF91aWQoY3JlZGVudGlhbHMsIGluZm8tPnVpZCkpCisgICAgeworICAgICAgX2RidXNfdXNlcl9kYXRhYmFzZV91bmxvY2tfc3lzdGVtICgpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgCisgIF9kYnVzX3VzZXJfZGF0YWJhc2VfdW5sb2NrX3N5c3RlbSAoKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogQ3JlYXRlcyBhIG5ldyB1c2VyIGRhdGFiYXNlIG9iamVjdCB1c2VkIHRvIGxvb2sgdXAgYW5kCisgKiBjYWNoZSB1c2VyIGluZm9ybWF0aW9uLgorICogQHJldHVybnMgbmV3IGRhdGFiYXNlLCBvciAjTlVMTCBvbiBvdXQgb2YgbWVtb3J5CisgKi8KK0RCdXNVc2VyRGF0YWJhc2UqCitfZGJ1c191c2VyX2RhdGFiYXNlX25ldyAodm9pZCkKK3sKKyAgREJ1c1VzZXJEYXRhYmFzZSAqZGI7CisgIAorICBkYiA9IGRidXNfbmV3MCAoREJ1c1VzZXJEYXRhYmFzZSwgMSk7CisgIGlmIChkYiA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIGRiLT5yZWZjb3VudCA9IDE7CisKKyAgZGItPnVzZXJzID0gX2RidXNfaGFzaF90YWJsZV9uZXcgKERCVVNfSEFTSF9VSU5UUFRSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgKERCdXNGcmVlRnVuY3Rpb24pIF9kYnVzX3VzZXJfaW5mb191bnJlZik7CisgIAorICBpZiAoZGItPnVzZXJzID09IE5VTEwpCisgICAgZ290byBmYWlsZWQ7CisKKyAgZGItPmdyb3VwcyA9IF9kYnVzX2hhc2hfdGFibGVfbmV3IChEQlVTX0hBU0hfVUlOVFBUUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAoREJ1c0ZyZWVGdW5jdGlvbikgX2RidXNfZ3JvdXBfaW5mb191bnJlZik7CisgIAorICBpZiAoZGItPmdyb3VwcyA9PSBOVUxMKQorICAgIGdvdG8gZmFpbGVkOworCisgIGRiLT51c2Vyc19ieV9uYW1lID0gX2RidXNfaGFzaF90YWJsZV9uZXcgKERCVVNfSEFTSF9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIChEQnVzRnJlZUZ1bmN0aW9uKSBfZGJ1c191c2VyX2luZm9fdW5yZWYpOworICBpZiAoZGItPnVzZXJzX2J5X25hbWUgPT0gTlVMTCkKKyAgICBnb3RvIGZhaWxlZDsKKyAgCisgIGRiLT5ncm91cHNfYnlfbmFtZSA9IF9kYnVzX2hhc2hfdGFibGVfbmV3IChEQlVTX0hBU0hfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgKERCdXNGcmVlRnVuY3Rpb24pIF9kYnVzX2dyb3VwX2luZm9fdW5yZWYpOworICBpZiAoZGItPmdyb3Vwc19ieV9uYW1lID09IE5VTEwpCisgICAgZ290byBmYWlsZWQ7CisgIAorICByZXR1cm4gZGI7CisgIAorIGZhaWxlZDoKKyAgX2RidXNfdXNlcl9kYXRhYmFzZV91bnJlZiAoZGIpOworICByZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiBGbHVzaCBhbGwgaW5mb3JtYXRpb24gb3V0IG9mIHRoZSB1c2VyIGRhdGFiYXNlLiAKKyAqLwordm9pZAorX2RidXNfdXNlcl9kYXRhYmFzZV9mbHVzaCAoREJ1c1VzZXJEYXRhYmFzZSAqZGIpIAoreworICBfZGJ1c19oYXNoX3RhYmxlX3JlbW92ZV9hbGwoZGItPnVzZXJzX2J5X25hbWUpOworICBfZGJ1c19oYXNoX3RhYmxlX3JlbW92ZV9hbGwoZGItPmdyb3Vwc19ieV9uYW1lKTsKKyAgX2RidXNfaGFzaF90YWJsZV9yZW1vdmVfYWxsKGRiLT51c2Vycyk7CisgIF9kYnVzX2hhc2hfdGFibGVfcmVtb3ZlX2FsbChkYi0+Z3JvdXBzKTsKK30KKworI2lmZGVmIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTCisvKioKKyAqIEluY3JlbWVudHMgcmVmY291bnQgb2YgdXNlciBkYXRhYmFzZS4KKyAqIEBwYXJhbSBkYiB0aGUgZGF0YWJhc2UKKyAqIEByZXR1cm5zIHRoZSBkYXRhYmFzZQorICovCitEQnVzVXNlckRhdGFiYXNlICoKK19kYnVzX3VzZXJfZGF0YWJhc2VfcmVmIChEQnVzVXNlckRhdGFiYXNlICAqZGIpCit7CisgIF9kYnVzX2Fzc2VydCAoZGItPnJlZmNvdW50ID4gMCk7CisKKyAgZGItPnJlZmNvdW50ICs9IDE7CisKKyAgcmV0dXJuIGRiOworfQorI2VuZGlmIC8qIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTICovCisKKy8qKgorICogRGVjcmVtZW50cyByZWZjb3VudCBvZiB1c2VyIGRhdGFiYXNlLgorICogQHBhcmFtIGRiIHRoZSBkYXRhYmFzZQorICovCit2b2lkCitfZGJ1c191c2VyX2RhdGFiYXNlX3VucmVmIChEQnVzVXNlckRhdGFiYXNlICAqZGIpCit7CisgIF9kYnVzX2Fzc2VydCAoZGItPnJlZmNvdW50ID4gMCk7CisKKyAgZGItPnJlZmNvdW50IC09IDE7CisgIGlmIChkYi0+cmVmY291bnQgPT0gMCkKKyAgICB7CisgICAgICBpZiAoZGItPnVzZXJzKQorICAgICAgICBfZGJ1c19oYXNoX3RhYmxlX3VucmVmIChkYi0+dXNlcnMpOworCisgICAgICBpZiAoZGItPmdyb3VwcykKKyAgICAgICAgX2RidXNfaGFzaF90YWJsZV91bnJlZiAoZGItPmdyb3Vwcyk7CisKKyAgICAgIGlmIChkYi0+dXNlcnNfYnlfbmFtZSkKKyAgICAgICAgX2RidXNfaGFzaF90YWJsZV91bnJlZiAoZGItPnVzZXJzX2J5X25hbWUpOworCisgICAgICBpZiAoZGItPmdyb3Vwc19ieV9uYW1lKQorICAgICAgICBfZGJ1c19oYXNoX3RhYmxlX3VucmVmIChkYi0+Z3JvdXBzX2J5X25hbWUpOworICAgICAgCisgICAgICBkYnVzX2ZyZWUgKGRiKTsKKyAgICB9Cit9CisKKy8qKgorICogR2V0cyB0aGUgdXNlciBpbmZvcm1hdGlvbiBmb3IgdGhlIGdpdmVuIFVJRCwKKyAqIHJldHVybmVkIHVzZXIgaW5mbyBzaG91bGQgbm90IGJlIGZyZWVkLiAKKyAqCisgKiBAcGFyYW0gZGIgdXNlciBkYXRhYmFzZQorICogQHBhcmFtIHVpZCB0aGUgdXNlciBJRAorICogQHBhcmFtIGluZm8gcmV0dXJuIGxvY2F0aW9uIGZvciBjb25zdCByZWYgdG8gdXNlciBpbmZvCisgKiBAcGFyYW0gZXJyb3IgZXJyb3IgbG9jYXRpb24KKyAqIEByZXR1cm5zICNGQUxTRSBpZiBlcnJvciBpcyBzZXQKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3VzZXJfZGF0YWJhc2VfZ2V0X3VpZCAoREJ1c1VzZXJEYXRhYmFzZSAgICAqZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfdWlkX3QgICAgICAgICAgIHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1VzZXJJbmZvICoqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgICAqZXJyb3IpCit7CisgICppbmZvID0gX2RidXNfdXNlcl9kYXRhYmFzZV9sb29rdXAgKGRiLCB1aWQsIE5VTEwsIGVycm9yKTsKKyAgcmV0dXJuICppbmZvICE9IE5VTEw7Cit9CisKKy8qKgorICogR2V0cyB0aGUgdXNlciBpbmZvcm1hdGlvbiBmb3IgdGhlIGdpdmVuIHVzZXJuYW1lLgorICoKKyAqIEBwYXJhbSBkYiB1c2VyIGRhdGFiYXNlCisgKiBAcGFyYW0gdXNlcm5hbWUgdGhlIHVzZXIgbmFtZQorICogQHBhcmFtIGluZm8gcmV0dXJuIGxvY2F0aW9uIGZvciBjb25zdCByZWYgdG8gdXNlciBpbmZvCisgKiBAcGFyYW0gZXJyb3IgZXJyb3IgbG9jYXRpb24KKyAqIEByZXR1cm5zICNGQUxTRSBpZiBlcnJvciBpcyBzZXQKKyAqLworZGJ1c19ib29sX3QKK19kYnVzX3VzZXJfZGF0YWJhc2VfZ2V0X3VzZXJuYW1lICAoREJ1c1VzZXJEYXRhYmFzZSAgICAgKmRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICAgICAqdXNlcm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNVc2VySW5mbyAgKippbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAgICAqZXJyb3IpCit7CisgICppbmZvID0gX2RidXNfdXNlcl9kYXRhYmFzZV9sb29rdXAgKGRiLCBEQlVTX1VJRF9VTlNFVCwgdXNlcm5hbWUsIGVycm9yKTsKKyAgcmV0dXJuICppbmZvICE9IE5VTEw7Cit9CisKKy8qKiBAfSAqLworCisvKiBUZXN0cyBpbiBkYnVzLXVzZXJkYi11dGlsLmMgKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy11c2VyZGIuaCBiL2RidXMvZGJ1cy11c2VyZGIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzhlM2QxCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLXVzZXJkYi5oCkBAIC0wLDAgKzEsMTM1IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtdXNlcmRiLmggVXNlciBkYXRhYmFzZSBhYnN0cmFjdGlvbgorICogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgIFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBEQlVTX1VTRVJEQl9ICisjZGVmaW5lIERCVVNfVVNFUkRCX0gKKworI2luY2x1ZGUgPGRidXMvZGJ1cy1zeXNkZXBzLXVuaXguaD4KKworI2lmZGVmIERCVVNfV0lOCisjZXJyb3IgIkRvbid0IGluY2x1ZGUgdGhpcyBvbiBXaW5kb3dzIgorI2VuZGlmCisKK0RCVVNfQkVHSU5fREVDTFMKKwordHlwZWRlZiBzdHJ1Y3QgREJ1c1VzZXJEYXRhYmFzZSBEQnVzVXNlckRhdGFiYXNlOworCisjaWZkZWYgREJVU19VU0VSREJfSU5DTFVERVNfUFJJVkFURQorI2luY2x1ZGUgPGRidXMvZGJ1cy1oYXNoLmg+CisKKy8qKgorICogSW50ZXJuYWxzIG9mIERCdXNVc2VyRGF0YWJhc2UKKyAqLworc3RydWN0IERCdXNVc2VyRGF0YWJhc2UKK3sKKyAgaW50IHJlZmNvdW50OyAvKio8IFJlZmVyZW5jZSBjb3VudCAqLworCisgIERCdXNIYXNoVGFibGUgKnVzZXJzOyAvKio8IFVzZXJzIGluIHRoZSBkYXRhYmFzZSBieSBVSUQgKi8KKyAgREJ1c0hhc2hUYWJsZSAqZ3JvdXBzOyAvKio8IEdyb3VwcyBpbiB0aGUgZGF0YWJhc2UgYnkgR0lEICovCisgIERCdXNIYXNoVGFibGUgKnVzZXJzX2J5X25hbWU7IC8qKjwgVXNlcnMgaW4gdGhlIGRhdGFiYXNlIGJ5IG5hbWUgKi8KKyAgREJ1c0hhc2hUYWJsZSAqZ3JvdXBzX2J5X25hbWU7IC8qKjwgR3JvdXBzIGluIHRoZSBkYXRhYmFzZSBieSBuYW1lICovCisKK307CisKKworREJ1c1VzZXJEYXRhYmFzZSogX2RidXNfdXNlcl9kYXRhYmFzZV9uZXcgICAgICAgICAgICh2b2lkKTsKK0RCdXNVc2VyRGF0YWJhc2UqIF9kYnVzX3VzZXJfZGF0YWJhc2VfcmVmICAgICAgICAgICAoREJ1c1VzZXJEYXRhYmFzZSAgICAgKmRiKTsKK3ZvaWQgICAgICAgICAgICAgIF9kYnVzX3VzZXJfZGF0YWJhc2VfZmx1c2ggICAgICAgICAoREJ1c1VzZXJEYXRhYmFzZSAgICAgKmRiKTsKK3ZvaWQgICAgICAgICAgICAgIF9kYnVzX3VzZXJfZGF0YWJhc2VfdW5yZWYgICAgICAgICAoREJ1c1VzZXJEYXRhYmFzZSAgICAgKmRiKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90ICAgICAgIF9kYnVzX3VzZXJfZGF0YWJhc2VfZ2V0X3VpZCAgICAgICAoREJ1c1VzZXJEYXRhYmFzZSAgICAgKmRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpZF90ICAgICAgICAgICAgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzVXNlckluZm8gICoqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgICAgKmVycm9yKTsKK2RidXNfYm9vbF90ICAgICAgIF9kYnVzX3VzZXJfZGF0YWJhc2VfZ2V0X2dpZCAgICAgICAoREJ1c1VzZXJEYXRhYmFzZSAgICAgKmRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2dpZF90ICAgICAgICAgICAgZ2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzR3JvdXBJbmZvICoqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgICAgKmVycm9yKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90ICAgICAgIF9kYnVzX3VzZXJfZGF0YWJhc2VfZ2V0X3VzZXJuYW1lICAoREJ1c1VzZXJEYXRhYmFzZSAgICAgKmRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEQnVzU3RyaW5nICAgICAqdXNlcm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNVc2VySW5mbyAgKippbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAgICAqZXJyb3IpOworZGJ1c19ib29sX3QgICAgICAgX2RidXNfdXNlcl9kYXRhYmFzZV9nZXRfZ3JvdXBuYW1lIChEQnVzVXNlckRhdGFiYXNlICAgICAqZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgICAgICpncm91cG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNHcm91cEluZm8gKippbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICAgICAgICAgICAqZXJyb3IpOworCitEQlVTX1BSSVZBVEVfRVhQT1JUCitjb25zdCBEQnVzVXNlckluZm8gKl9kYnVzX3VzZXJfZGF0YWJhc2VfbG9va3VwICAoREJ1c1VzZXJEYXRhYmFzZSAqZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aWRfdCAgICAgICAgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERCdXNTdHJpbmcgKnVzZXJuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2NvbnN0IERCdXNHcm91cEluZm8qIF9kYnVzX3VzZXJfZGF0YWJhc2VfbG9va3VwX2dyb3VwIChEQnVzVXNlckRhdGFiYXNlICpkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2dpZF90ICAgICAgICBnaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREJ1c1N0cmluZyAqZ3JvdXBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgICAgICAgKmVycm9yKTsKKwordm9pZCAgICAgICAgICAgX2RidXNfdXNlcl9pbmZvX3VucmVmICAgICAgICAgICAgKERCdXNVc2VySW5mbyAgICAgKmluZm8pOworREJVU19QUklWQVRFX0VYUE9SVAordm9pZCAgICAgICAgICAgX2RidXNfZ3JvdXBfaW5mb191bnJlZiAgICAgICAgICAgKERCdXNHcm91cEluZm8gICAgKmluZm8pOworI2VuZGlmIC8qIERCVVNfVVNFUkRCX0lOQ0xVREVTX1BSSVZBVEUgKi8KKworREJVU19QUklWQVRFX0VYUE9SVAorREJ1c1VzZXJEYXRhYmFzZSogX2RidXNfdXNlcl9kYXRhYmFzZV9nZXRfc3lzdGVtICAgICh2b2lkKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90ICAgICAgIF9kYnVzX3VzZXJfZGF0YWJhc2VfbG9ja19zeXN0ZW0gICAodm9pZCkgX0RCVVNfR05VQ19XQVJOX1VOVVNFRF9SRVNVTFQ7CitEQlVTX1BSSVZBVEVfRVhQT1JUCit2b2lkICAgICAgICAgICAgICBfZGJ1c191c2VyX2RhdGFiYXNlX3VubG9ja19zeXN0ZW0gKHZvaWQpOwordm9pZCAgICAgICAgICAgICAgX2RidXNfdXNlcl9kYXRhYmFzZV9mbHVzaF9zeXN0ZW0gICh2b2lkKTsKKworZGJ1c19ib29sX3QgX2RidXNfZ2V0X3VzZXJfaWQgICAgICAgICAgICAgICAgICAgKGNvbnN0IERCdXNTdHJpbmcgICp1c2VybmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX3VpZF90ICAgICAgICAqdWlkKTsKK2RidXNfYm9vbF90IF9kYnVzX2dldF9ncm91cF9pZCAgICAgICAgICAgICAgICAgIChjb25zdCBEQnVzU3RyaW5nICAqZ3JvdXBfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2dpZF90ICAgICAgICAqZ2lkKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90IF9kYnVzX2dldF91c2VyX2lkX2FuZF9wcmltYXJ5X2dyb3VwIChjb25zdCBEQnVzU3RyaW5nICAqdXNlcm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c191aWRfdCAgICAgICAgKnVpZF9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfZ2lkX3QgICAgICAgICpnaWRfcCk7CitkYnVzX2Jvb2xfdCBfZGJ1c19jcmVkZW50aWFsc19mcm9tX3VpZCAgICAgICAgICAoZGJ1c191aWRfdCAgICAgICAgIHVzZXJfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0NyZWRlbnRpYWxzICAgKmNyZWRlbnRpYWxzKTsKK2RidXNfYm9vbF90IF9kYnVzX2dyb3Vwc19mcm9tX3VpZAkJKGRidXNfdWlkX3QgICAgICAgICAgICB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19naWRfdCAgICAgICAgICAqKmdyb3VwX2lkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAqbl9ncm91cF9pZHMpOworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgX2RidXNfaXNfY29uc29sZV91c2VyICAgICAgICAgICAgICAgKGRidXNfdWlkX3QgICAgICAgICB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAgICAgICAgKmVycm9yKTsKKworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgX2RidXNfaXNfYV9udW1iZXIgICAgICAgICAgICAgICAgICAgKGNvbnN0IERCdXNTdHJpbmcgKnN0ciwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgICAqbnVtKTsKKworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgX2RidXNfdXNlcm5hbWVfZnJvbV9jdXJyZW50X3Byb2Nlc3MgKGNvbnN0IERCdXNTdHJpbmcgKip1c2VybmFtZSk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitkYnVzX2Jvb2xfdCBfZGJ1c19ob21lZGlyX2Zyb21fY3VycmVudF9wcm9jZXNzICAoY29uc3QgREJ1c1N0cmluZyAqKmhvbWVkaXIpOworZGJ1c19ib29sX3QgX2RidXNfaG9tZWRpcl9mcm9tX3VzZXJuYW1lICAgICAgICAgKGNvbnN0IERCdXNTdHJpbmcgICp1c2VybmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzU3RyaW5nICAgICAgICAqaG9tZWRpcik7CisKK2RidXNfYm9vbF90IF9kYnVzX2hvbWVkaXJfZnJvbV91aWQgICAgICAgICAgICAgIChkYnVzX3VpZF90ICAgICAgICAgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTdHJpbmcgICAgICAgICpob21lZGlyKTsKKworREJVU19FTkRfREVDTFMKKworI2VuZGlmIC8qIERCVVNfVVNFUkRCX0ggKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy11dWlkZ2VuLmMgYi9kYnVzL2RidXMtdXVpZGdlbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0MDQxNjMKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtdXVpZGdlbi5jCkBAIC0wLDAgKzEsMTMwIEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtdXVpZGdlbi5jICBUaGUgZ3V0cyBvZiB0aGUgZGJ1cy11dWlkZ2VuIGJpbmFyeSBsaXZlIGluIGxpYmRidXMsIGluIHRoaXMgZmlsZS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgIFJlZCBIYXQsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLXV1aWRnZW4uaCIKKyNpbmNsdWRlICJkYnVzLWludGVybmFscy5oIgorI2luY2x1ZGUgImRidXMtc3RyaW5nLmgiCisjaW5jbHVkZSAiZGJ1cy1wcm90b2NvbC5oIgorCisjaWZkZWYgREJVU19XSU4KKyNlcnJvciAiZGJ1cy11dWlkZ2VuIHNob3VsZCBub3QgYmUgbmVlZGVkIG9uIFdpbmRvd3MiCisjZW5kaWYKKworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c0ludGVybmFsc1V1aWRnZW4gZGJ1cy11dWlkZ2VuIGltcGxlbWVudGF0aW9uCisgKiBAaW5ncm91cCBEQnVzSW50ZXJuYWxzCisgKiBAYnJpZWYgRnVuY3Rpb25zIGZvciBkYnVzLXV1aWRnZW4gYmluYXJ5CisgKgorICogVGhlc2UgYXJlIG5vdCBjb25zaWRlcmVkIHBhcnQgb2YgdGhlIEFCSSwgYW5kIGlmIHlvdSBjYWxsIHRoZW0KKyAqIHlvdSB3aWxsIGdldCBzY3Jld2VkIGJ5IGZ1dHVyZSBjaGFuZ2VzLgorICogCisgKiBAeworICovCisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorcmV0dXJuX3V1aWQgKERCdXNHVUlEICAgKnV1aWQsCisgICAgICAgICAgICAgY2hhciAgICAgICoqdXVpZF9wLAorICAgICAgICAgICAgIERCdXNFcnJvciAgKmVycm9yKQoreworICBpZiAodXVpZF9wKQorICAgIHsKKyAgICAgIERCdXNTdHJpbmcgZW5jb2RlZDsKKworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmVuY29kZWQpKQorICAgICAgICB7CisgICAgICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICBpZiAoIV9kYnVzX3V1aWRfZW5jb2RlICh1dWlkLCAmZW5jb2RlZCkgfHwKKyAgICAgICAgICAhX2RidXNfc3RyaW5nX3N0ZWFsX2RhdGEgKCZlbmNvZGVkLCB1dWlkX3ApKQorICAgICAgICB7CisgICAgICAgICAgX0RCVVNfU0VUX09PTSAoZXJyb3IpOworICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmZW5jb2RlZCk7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICBfZGJ1c19zdHJpbmdfZnJlZSAoJmVuY29kZWQpOworICAgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogRm9yIHVzZSBieSB0aGUgZGJ1cy11dWlkZ2VuIGJpbmFyeSBPTkxZLCBkbyBub3QgY2FsbCB0aGlzLgorICogV2UgY2FuIGFuZCB3aWxsIGNoYW5nZSB0aGlzIGZ1bmN0aW9uIHdpdGhvdXQgbW9kaWZ5aW5nCisgKiB0aGUgbGliZGJ1cyBzb25hbWUuCisgKgorICogQHBhcmFtIGZpbGVuYW1lIHRoZSBmaWxlIG9yICNOVUxMIGZvciB0aGUgbWFjaGluZSBJRCBmaWxlCisgKiBAcGFyYW0gdXVpZF9wIG91dCBwYXJhbSB0byByZXR1cm4gdGhlIHV1aWQKKyAqIEBwYXJhbSBjcmVhdGVfaWZfbm90X2ZvdW5kIHdoZXRoZXIgdG8gY3JlYXRlIGl0IGlmIG5vdCBhbHJlYWR5IHRoZXJlCisgKiBAcGFyYW0gZXJyb3IgZXJyb3IgcmV0dXJuCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgZXJyb3IgaXMgc2V0CisgKi8KK2RidXNfYm9vbF90CitkYnVzX2ludGVybmFsX2RvX25vdF91c2VfZ2V0X3V1aWQgKGNvbnN0IGNoYXIgKmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgKip1dWlkX3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90IGNyZWF0ZV9pZl9ub3RfZm91bmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgKmVycm9yKQoreworICBEQnVzR1VJRCB1dWlkOworICAKKyAgaWYgKGZpbGVuYW1lKQorICAgIHsKKyAgICAgIERCdXNTdHJpbmcgZmlsZW5hbWVfc3RyOworICAgICAgX2RidXNfc3RyaW5nX2luaXRfY29uc3QgKCZmaWxlbmFtZV9zdHIsIGZpbGVuYW1lKTsKKyAgICAgIGlmICghX2RidXNfcmVhZF91dWlkX2ZpbGUgKCZmaWxlbmFtZV9zdHIsICZ1dWlkLCBjcmVhdGVfaWZfbm90X2ZvdW5kLCBlcnJvcikpCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKCFfZGJ1c19yZWFkX2xvY2FsX21hY2hpbmVfdXVpZCAoJnV1aWQsIGNyZWF0ZV9pZl9ub3RfZm91bmQsIGVycm9yKSkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgaWYgKCFyZXR1cm5fdXVpZCgmdXVpZCwgdXVpZF9wLCBlcnJvcikpCisgICAgZ290byBlcnJvcjsKKworICByZXR1cm4gVFJVRTsKKyAgCisgZXJyb3I6CisgIF9EQlVTX0FTU0VSVF9FUlJPUl9JU19TRVQgKGVycm9yKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKioKKyAqIEBwYXJhbSB1dWlkX3Agb3V0IHBhcmFtIHRvIHJldHVybiB0aGUgdXVpZAorICogQHBhcmFtIGVycm9yIGxvY2F0aW9uIHRvIHN0b3JlIHJlYXNvbiBmb3IgZmFpbHVyZQorICogQHJldHVybnMgI1RSVUUgb24gc3VjY2VzcworICovCitkYnVzX2Jvb2xfdAorX2RidXNfY3JlYXRlX3V1aWQgKGNoYXIgICAgICAqKnV1aWRfcCwKKyAgICAgICAgICAgICAgICAgICBEQnVzRXJyb3IgICplcnJvcikKK3sKKyAgREJ1c0dVSUQgdXVpZDsKKworICBpZiAoIV9kYnVzX2dlbmVyYXRlX3V1aWQgKCZ1dWlkLCBlcnJvcikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJldHVybiByZXR1cm5fdXVpZCAoJnV1aWQsIHV1aWRfcCwgZXJyb3IpOworfQorCisvKiogQH0gKi8KZGlmZiAtLWdpdCBhL2RidXMvZGJ1cy11dWlkZ2VuLmggYi9kYnVzL2RidXMtdXVpZGdlbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwMDNmMTYKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtdXVpZGdlbi5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy11dWlkZ2VuLmggIFRoZSBndXRzIG9mIHRoZSBkYnVzLXV1aWRnZW4gYmluYXJ5IGxpdmUgaW4gbGliZGJ1cywgaW4gdGhpcyBmaWxlLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiAgUmVkIEhhdCwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworI2lmZGVmIERCVVNfSU5TSURFX0RCVVNfSAorI2Vycm9yICJZb3UgY2FuJ3QgaW5jbHVkZSBkYnVzLXV1aWRnZW4uaCBpbiB0aGUgcHVibGljIGhlYWRlciBkYnVzLmgiCisjZW5kaWYKKworI2lmbmRlZiBEQlVTX1VVSURHRU5fSAorI2RlZmluZSBEQlVTX1VVSURHRU5fSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXR5cGVzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWVycm9ycy5oPgorCitEQlVTX0JFR0lOX0RFQ0xTCisKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90IGRidXNfaW50ZXJuYWxfZG9fbm90X3VzZV9nZXRfdXVpZCAgICAoY29uc3QgY2hhciAqZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAqKnV1aWRfcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgY3JlYXRlX2lmX25vdF9mb3VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Vycm9yICAqZXJyb3IpOworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgX2RidXNfY3JlYXRlX3V1aWQgICAgICAgICAgICAgICAgICAgIChjaGFyICAgICAgKip1dWlkX3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNFcnJvciAgKmVycm9yKTsKKworREJVU19FTkRfREVDTFMKKworI2VuZGlmIC8qIERCVVNfVVVJREdFTl9IICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMtdmFsZ3JpbmQtaW50ZXJuYWwuaCBiL2RidXMvZGJ1cy12YWxncmluZC1pbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3NjBiNDAKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMtdmFsZ3JpbmQtaW50ZXJuYWwuaApAQCAtMCwwICsxLDY3IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtdmFsZ3JpbmQtaW50ZXJuYWwuaCAtIHZhbGdyaW5kIGdsdWUKKyAqCisgKiBDb3B5cmlnaHQgwqkgMjAxMSBOb2tpYSBDb3Jwb3JhdGlvbgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBEQlVTX1ZBTEdSSU5EX0lOVEVSTkFMX0gKKyNkZWZpbmUgREJVU19WQUxHUklORF9JTlRFUk5BTF9ICisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJkYnVzLWludGVybmFscy5oIgorCisjaWZkZWYgV0lUSF9WQUxHUklORAorIyAgIGluY2x1ZGUgPG1lbWNoZWNrLmg+CisjICAgaW5jbHVkZSA8dmFsZ3JpbmQuaD4KKyNlbHNlCisjICAgZGVmaW5lIFZBTEdSSU5EX0NSRUFURV9NRU1QT09MKF8xLCBfMiwgXzMpIGRvIHsgfSB3aGlsZSAoMCkKKyMgICBkZWZpbmUgVkFMR1JJTkRfREVTVFJPWV9NRU1QT09MKF8xKSBkbyB7IH0gd2hpbGUgKDApCisjICAgZGVmaW5lIFZBTEdSSU5EX01FTVBPT0xfQUxMT0MoXzEsIF8yLCBfMykgZG8geyB9IHdoaWxlICgwKQorIyAgIGRlZmluZSBWQUxHUklORF9NRU1QT09MX0ZSRUUoXzEsIF8yKSBkbyB7IH0gd2hpbGUgKDApCisKKy8qIFJlY2VudCBnY2Mgd2lsbCB3YXJuIGlmIHlvdSBoYXZlIGEgc3RhdGVtZW50IHRoYXQncyBqdXN0IGEgbWFjcm8KKyAqIGV4cGFuZGluZyB0byAoMCksIGJ1dCBub3QgaWYgeW91IGhhdmUgYW4gaW5saW5lIHN0dWIgZnVuY3Rpb24gdGhhdAorICogYWx3YXlzIHJldHVybnMgMCwgc28gbGV0J3MgZG8gdGhlIGxhdHRlci4gKi8KK3N0YXRpYyBpbmxpbmUgaW50CitWQUxHUklORF9NQUtFX01FTV9VTkRFRklORUQgKHZvaWQgICAqYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICBsZW4pCit7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludAorVkFMR1JJTkRfUFJJTlRGIChjb25zdCBjaGFyICpmb3JtYXQsCisgICAgICAgICAgICAgICAgIC4uLikKK3sKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitWQUxHUklORF9QUklOVEZfQkFDS1RSQUNFIChjb25zdCBjaGFyICpmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4pCit7CisgIHJldHVybiAwOworfQorCisjICAgZGVmaW5lIFJVTk5JTkdfT05fVkFMR1JJTkQgMAorI2VuZGlmIC8qIFdJVEhfVkFMR1JJTkQgKi8KKworI2VuZGlmIC8qIGhlYWRlciBndWFyZCAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLXdhdGNoLmMgYi9kYnVzL2RidXMtd2F0Y2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODQyMjk2Ci0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLXdhdGNoLmMKQEAgLTAsMCArMSw3NjMgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy13YXRjaC5jIERCdXNXYXRjaCBpbXBsZW1lbnRhdGlvbgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMyAgUmVkIEhhdCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJkYnVzLWludGVybmFscy5oIgorI2luY2x1ZGUgImRidXMtd2F0Y2guaCIKKyNpbmNsdWRlICJkYnVzLWxpc3QuaCIKKworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c1dhdGNoSW50ZXJuYWxzIERCdXNXYXRjaCBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzCisgKiBAaW5ncm91cCAgREJ1c0ludGVybmFscworICogQGJyaWVmIGltcGxlbWVudGF0aW9uIGRldGFpbHMgZm9yIERCdXNXYXRjaAorICogCisgKiBAeworICovCisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgREJ1c1dhdGNoCisgKi8KK3N0cnVjdCBEQnVzV2F0Y2gKK3sKKyAgaW50IHJlZmNvdW50OyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgUmVmZXJlbmNlIGNvdW50ICovCisgIERCdXNQb2xsYWJsZSBmZDsgICAgICAgICAgICAgICAgICAgICAvKio8IEZpbGUgZGVzY3JpcHRvci4gKi8KKyAgdW5zaWduZWQgaW50IGZsYWdzOyAgICAgICAgICAgICAgICAgIC8qKjwgQ29uZGl0aW9ucyB0byB3YXRjaC4gKi8KKworICBEQnVzV2F0Y2hIYW5kbGVyIGhhbmRsZXI7ICAgICAgICAgICAgICAgICAgICAvKio8IFdhdGNoIGhhbmRsZXIuICovCisgIHZvaWQgKmhhbmRsZXJfZGF0YTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgV2F0Y2ggaGFuZGxlciBkYXRhLiAqLworICBEQnVzRnJlZUZ1bmN0aW9uIGZyZWVfaGFuZGxlcl9kYXRhX2Z1bmN0aW9uOyAvKio8IEZyZWUgdGhlIHdhdGNoIGhhbmRsZXIgZGF0YS4gKi8KKyAgCisgIHZvaWQgKmRhdGE7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEFwcGxpY2F0aW9uIGRhdGEuICovCisgIERCdXNGcmVlRnVuY3Rpb24gZnJlZV9kYXRhX2Z1bmN0aW9uOyAvKio8IEZyZWUgdGhlIGFwcGxpY2F0aW9uIGRhdGEuICovCisgIHVuc2lnbmVkIGludCBlbmFibGVkIDogMTsgICAgICAgICAgICAvKio8IFdoZXRoZXIgaXQncyBlbmFibGVkLiAqLworICB1bnNpZ25lZCBpbnQgb29tX2xhc3RfdGltZSA6IDE7ICAgICAgLyoqPCBXaGV0aGVyIGl0IHdhcyBPT00gbGFzdCB0aW1lLiAqLworfTsKKworZGJ1c19ib29sX3QKK19kYnVzX3dhdGNoX2dldF9lbmFibGVkIChEQnVzV2F0Y2ggKndhdGNoKQoreworICByZXR1cm4gd2F0Y2gtPmVuYWJsZWQ7Cit9CisKK2RidXNfYm9vbF90CitfZGJ1c193YXRjaF9nZXRfb29tX2xhc3RfdGltZSAoREJ1c1dhdGNoICp3YXRjaCkKK3sKKyAgcmV0dXJuIHdhdGNoLT5vb21fbGFzdF90aW1lOworfQorCit2b2lkCitfZGJ1c193YXRjaF9zZXRfb29tX2xhc3RfdGltZSAoREJ1c1dhdGNoICAgKndhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICBvb20pCit7CisgIHdhdGNoLT5vb21fbGFzdF90aW1lID0gb29tOworfQorCisvKioKKyAqIENyZWF0ZXMgYSBuZXcgREJ1c1dhdGNoLiBVc2VkIHRvIGFkZCBhIGZpbGUgZGVzY3JpcHRvciB0byBiZSBwb2xsZWQKKyAqIGJ5IGEgbWFpbiBsb29wLgorICogCisgKiBAcGFyYW0gZmQgdGhlIGZpbGUgZGVzY3JpcHRvciB0byBiZSB3YXRjaGVkLgorICogQHBhcmFtIGZsYWdzIHRoZSBjb25kaXRpb25zIHRvIHdhdGNoIGZvciBvbiB0aGUgZGVzY3JpcHRvci4KKyAqIEBwYXJhbSBlbmFibGVkIHRoZSBpbml0aWFsIGVuYWJsZWQgc3RhdGUKKyAqIEBwYXJhbSBoYW5kbGVyIHRoZSBoYW5kbGVyIGZ1bmN0aW9uCisgKiBAcGFyYW0gZGF0YSBkYXRhIGZvciBoYW5kbGVyIGZ1bmN0aW9uCisgKiBAcGFyYW0gZnJlZV9kYXRhX2Z1bmN0aW9uIGZ1bmN0aW9uIHRvIGZyZWUgdGhlIGRhdGEKKyAqIEByZXR1cm5zIHRoZSBuZXcgREJ1c1dhdGNoIG9iamVjdC4KKyAqLworREJ1c1dhdGNoKgorX2RidXNfd2F0Y2hfbmV3IChEQnVzUG9sbGFibGUgICAgICBmZCwKKyAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICAgICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgIGVuYWJsZWQsCisgICAgICAgICAgICAgICAgIERCdXNXYXRjaEhhbmRsZXIgIGhhbmRsZXIsCisgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgKmRhdGEsCisgICAgICAgICAgICAgICAgIERCdXNGcmVlRnVuY3Rpb24gIGZyZWVfZGF0YV9mdW5jdGlvbikKK3sKKyAgREJ1c1dhdGNoICp3YXRjaDsKKworI2RlZmluZSBWQUxJRF9XQVRDSF9GTEFHUyAoREJVU19XQVRDSF9XUklUQUJMRSB8IERCVVNfV0FUQ0hfUkVBREFCTEUpCisgIAorICBfZGJ1c19hc3NlcnQgKChmbGFncyAmIFZBTElEX1dBVENIX0ZMQUdTKSA9PSBmbGFncyk7CisgIAorICB3YXRjaCA9IGRidXNfbmV3MCAoREJ1c1dhdGNoLCAxKTsKKyAgaWYgKHdhdGNoID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisgIAorICB3YXRjaC0+cmVmY291bnQgPSAxOworICB3YXRjaC0+ZmQgPSBmZDsKKyAgd2F0Y2gtPmZsYWdzID0gZmxhZ3M7CisgIHdhdGNoLT5lbmFibGVkID0gZW5hYmxlZDsKKworICB3YXRjaC0+aGFuZGxlciA9IGhhbmRsZXI7CisgIHdhdGNoLT5oYW5kbGVyX2RhdGEgPSBkYXRhOworICB3YXRjaC0+ZnJlZV9oYW5kbGVyX2RhdGFfZnVuY3Rpb24gPSBmcmVlX2RhdGFfZnVuY3Rpb247CisgIAorICByZXR1cm4gd2F0Y2g7Cit9CisKKy8qKgorICogSW5jcmVtZW50cyB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIGEgREJ1c1dhdGNoIG9iamVjdC4KKyAqCisgKiBAcGFyYW0gd2F0Y2ggdGhlIHdhdGNoIG9iamVjdC4KKyAqIEByZXR1cm5zIHRoZSB3YXRjaCBvYmplY3QuCisgKi8KK0RCdXNXYXRjaCAqCitfZGJ1c193YXRjaF9yZWYgKERCdXNXYXRjaCAqd2F0Y2gpCit7CisgIHdhdGNoLT5yZWZjb3VudCArPSAxOworCisgIHJldHVybiB3YXRjaDsKK30KKworLyoqCisgKiBEZWNyZW1lbnRzIHRoZSByZWZlcmVuY2UgY291bnQgb2YgYSBEQnVzV2F0Y2ggb2JqZWN0CisgKiBhbmQgZmluYWxpemVzIHRoZSBvYmplY3QgaWYgdGhlIGNvdW50IHJlYWNoZXMgemVyby4KKyAqCisgKiBAcGFyYW0gd2F0Y2ggdGhlIHdhdGNoIG9iamVjdC4KKyAqLwordm9pZAorX2RidXNfd2F0Y2hfdW5yZWYgKERCdXNXYXRjaCAqd2F0Y2gpCit7CisgIF9kYnVzX2Fzc2VydCAod2F0Y2ggIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAod2F0Y2gtPnJlZmNvdW50ID4gMCk7CisKKyAgd2F0Y2gtPnJlZmNvdW50IC09IDE7CisgIGlmICh3YXRjaC0+cmVmY291bnQgPT0gMCkKKyAgICB7CisgICAgICBpZiAoX2RidXNfcG9sbGFibGVfaXNfdmFsaWQgKHdhdGNoLT5mZCkpCisgICAgICAgIF9kYnVzX3dhcm4gKCJ0aGlzIHdhdGNoIHNob3VsZCBoYXZlIGJlZW4gaW52YWxpZGF0ZWQiKTsKKworICAgICAgZGJ1c193YXRjaF9zZXRfZGF0YSAod2F0Y2gsIE5VTEwsIE5VTEwpOyAvKiBjYWxsIGZyZWVfZGF0YV9mdW5jdGlvbiAqLworCisgICAgICBpZiAod2F0Y2gtPmZyZWVfaGFuZGxlcl9kYXRhX2Z1bmN0aW9uKQorCSgqIHdhdGNoLT5mcmVlX2hhbmRsZXJfZGF0YV9mdW5jdGlvbikgKHdhdGNoLT5oYW5kbGVyX2RhdGEpOworICAgICAgCisgICAgICBkYnVzX2ZyZWUgKHdhdGNoKTsKKyAgICB9Cit9CisKKy8qKgorICogQ2xlYXJzIHRoZSBmaWxlIGRlc2NyaXB0b3IgZnJvbSBhIG5vdy1pbnZhbGlkIHdhdGNoIG9iamVjdCBzbyB0aGF0CisgKiBubyBvbmUgdHJpZXMgdG8gdXNlIGl0LiAgVGhpcyBpcyBiZWNhdXNlIGEgd2F0Y2ggbWF5IHN0YXkgYWxpdmUgZHVlCisgKiB0byByZWZlcmVuY2UgY291bnRzIGFmdGVyIHRoZSBmaWxlIGRlc2NyaXB0b3IgaXMgY2xvc2VkLgorICogSW52YWxpZGF0aW9uIG1ha2VzIGl0IGVhc2llciB0byBjYXRjaCBidWdzLiBJdCBhbHNvCisgKiBrZWVwcyBwZW9wbGUgZnJvbSBkb2luZyBkb3JreSB0aGluZ3MgbGlrZSBhc3N1bWluZyBmaWxlIGRlc2NyaXB0b3JzCisgKiBhcmUgdW5pcXVlIChuZXZlciByZWN5Y2xlZCkuCisgKgorICogQHBhcmFtIHdhdGNoIHRoZSB3YXRjaCBvYmplY3QuCisgKi8KK3ZvaWQKK19kYnVzX3dhdGNoX2ludmFsaWRhdGUgKERCdXNXYXRjaCAqd2F0Y2gpCit7CisgIF9kYnVzX3BvbGxhYmxlX2ludmFsaWRhdGUgKCZ3YXRjaC0+ZmQpOworICB3YXRjaC0+ZmxhZ3MgPSAwOworfQorCisvKioKKyAqIFNhbml0aXplcyB0aGUgZ2l2ZW4gY29uZGl0aW9uIHNvIHRoYXQgaXQgb25seSBjb250YWlucworICogZmxhZ3MgdGhhdCB0aGUgREJ1c1dhdGNoIHJlcXVlc3RlZC4gZS5nLiBpZiB0aGUKKyAqIHdhdGNoIGlzIGEgREJVU19XQVRDSF9SRUFEQUJMRSB3YXRjaCB0aGVuCisgKiBEQlVTX1dBVENIX1dSSVRBQkxFIHdpbGwgYmUgc3RyaXBwZWQgZnJvbSB0aGUgY29uZGl0aW9uLgorICoKKyAqIEBwYXJhbSB3YXRjaCB0aGUgd2F0Y2ggb2JqZWN0LgorICogQHBhcmFtIGNvbmRpdGlvbiBhZGRyZXNzIG9mIHRoZSBjb25kaXRpb24gdG8gc2FuaXRpemUuCisgKi8KK3ZvaWQKK19kYnVzX3dhdGNoX3Nhbml0aXplX2NvbmRpdGlvbiAoREJ1c1dhdGNoICAgICp3YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpjb25kaXRpb24pCit7CisgIGlmICghKHdhdGNoLT5mbGFncyAmIERCVVNfV0FUQ0hfUkVBREFCTEUpKQorICAgICpjb25kaXRpb24gJj0gfkRCVVNfV0FUQ0hfUkVBREFCTEU7CisgIGlmICghKHdhdGNoLT5mbGFncyAmIERCVVNfV0FUQ0hfV1JJVEFCTEUpKQorICAgICpjb25kaXRpb24gJj0gfkRCVVNfV0FUQ0hfV1JJVEFCTEU7Cit9CisKKworLyoqCisgKiBAdHlwZWRlZiBEQnVzV2F0Y2hMaXN0CisgKgorICogT3BhcXVlIGRhdGEgdHlwZSByZXByZXNlbnRpbmcgYSBsaXN0IG9mIHdhdGNoZXMKKyAqIGFuZCBhIHNldCBvZiBEQnVzQWRkV2F0Y2hGdW5jdGlvbi9EQnVzUmVtb3ZlV2F0Y2hGdW5jdGlvbi4KKyAqIEF1dG9tYXRpY2FsbHkgaGFuZGxlcyByZW1vdmluZy9yZS1hZGRpbmcgd2F0Y2hlcworICogd2hlbiB0aGUgREJ1c0FkZFdhdGNoRnVuY3Rpb24gaXMgdXBkYXRlZCBvciBjaGFuZ2VkLgorICogSG9sZHMgYSByZWZlcmVuY2UgY291bnQgdG8gZWFjaCB3YXRjaC4KKyAqCisgKiBVc2VkIGluIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBib3RoIERCdXNTZXJ2ZXIgYW5kCisgKiBEQnVzQ2xpZW50LgorICoKKyAqLworCisvKioKKyAqIERCdXNXYXRjaExpc3QgaW1wbGVtZW50YXRpb24gZGV0YWlscy4gQWxsIGZpZWxkcworICogYXJlIHByaXZhdGUuCisgKgorICovCitzdHJ1Y3QgREJ1c1dhdGNoTGlzdAoreworICBEQnVzTGlzdCAqd2F0Y2hlczsgICAgICAgICAgIC8qKjwgV2F0Y2ggb2JqZWN0cy4gKi8KKworICBEQnVzQWRkV2F0Y2hGdW5jdGlvbiBhZGRfd2F0Y2hfZnVuY3Rpb247ICAgIC8qKjwgQ2FsbGJhY2sgZm9yIGFkZGluZyBhIHdhdGNoLiAqLworICBEQnVzUmVtb3ZlV2F0Y2hGdW5jdGlvbiByZW1vdmVfd2F0Y2hfZnVuY3Rpb247IC8qKjwgQ2FsbGJhY2sgZm9yIHJlbW92aW5nIGEgd2F0Y2guICovCisgIERCdXNXYXRjaFRvZ2dsZWRGdW5jdGlvbiB3YXRjaF90b2dnbGVkX2Z1bmN0aW9uOyAvKio8IENhbGxiYWNrIG9uIHRvZ2dsaW5nIGVuYWJsZW1lbnQgKi8KKyAgdm9pZCAqd2F0Y2hfZGF0YTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IERhdGEgZm9yIHdhdGNoIGNhbGxiYWNrcyAqLworICBEQnVzRnJlZUZ1bmN0aW9uIHdhdGNoX2ZyZWVfZGF0YV9mdW5jdGlvbjsgIC8qKjwgRnJlZSBmdW5jdGlvbiBmb3Igd2F0Y2ggY2FsbGJhY2sgZGF0YSAqLworfTsKKworLyoqCisgKiBDcmVhdGVzIGEgbmV3IHdhdGNoIGxpc3QuIFJldHVybnMgI05VTEwgaWYgaW5zdWZmaWNpZW50CisgKiBtZW1vcnkgZXhpc3RzLgorICoKKyAqIEByZXR1cm5zIHRoZSBuZXcgd2F0Y2ggbGlzdCwgb3IgI05VTEwgb24gZmFpbHVyZS4KKyAqLworREJ1c1dhdGNoTGlzdCoKK19kYnVzX3dhdGNoX2xpc3RfbmV3ICh2b2lkKQoreworICBEQnVzV2F0Y2hMaXN0ICp3YXRjaF9saXN0OworCisgIHdhdGNoX2xpc3QgPSBkYnVzX25ldzAgKERCdXNXYXRjaExpc3QsIDEpOworICBpZiAod2F0Y2hfbGlzdCA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIHJldHVybiB3YXRjaF9saXN0OworfQorCisvKioKKyAqIEZyZWVzIGEgREJ1c1dhdGNoTGlzdC4KKyAqCisgKiBAcGFyYW0gd2F0Y2hfbGlzdCB0aGUgd2F0Y2ggbGlzdC4KKyAqLwordm9pZAorX2RidXNfd2F0Y2hfbGlzdF9mcmVlIChEQnVzV2F0Y2hMaXN0ICp3YXRjaF9saXN0KQoreworICAvKiBmcmVlIHdhdGNoX2RhdGEgYW5kIHJlbW92ZXMgd2F0Y2hlcyBhcyBhIHNpZGUgZWZmZWN0ICovCisgIF9kYnVzX3dhdGNoX2xpc3Rfc2V0X2Z1bmN0aW9ucyAod2F0Y2hfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgX2RidXNfbGlzdF9mb3JlYWNoICgmd2F0Y2hfbGlzdC0+d2F0Y2hlcywKKyAgICAgICAgICAgICAgICAgICAgICAoREJ1c0ZvcmVhY2hGdW5jdGlvbikgX2RidXNfd2F0Y2hfdW5yZWYsCisgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgIF9kYnVzX2xpc3RfY2xlYXIgKCZ3YXRjaF9saXN0LT53YXRjaGVzKTsKKworICBkYnVzX2ZyZWUgKHdhdGNoX2xpc3QpOworfQorCisjaWZkZWYgREJVU19FTkFCTEVfVkVSQk9TRV9NT0RFCitzdGF0aWMgY29uc3QgY2hhcioKK3dhdGNoX2ZsYWdzX3RvX3N0cmluZyAoaW50IGZsYWdzKQoreworICBjb25zdCBjaGFyICp3YXRjaF90eXBlOworCisgIGlmICgoZmxhZ3MgJiBEQlVTX1dBVENIX1JFQURBQkxFKSAmJgorICAgICAgKGZsYWdzICYgREJVU19XQVRDSF9XUklUQUJMRSkpCisgICAgd2F0Y2hfdHlwZSA9ICJyZWFkd3JpdGUiOworICBlbHNlIGlmIChmbGFncyAmIERCVVNfV0FUQ0hfUkVBREFCTEUpCisgICAgd2F0Y2hfdHlwZSA9ICJyZWFkIjsKKyAgZWxzZSBpZiAoZmxhZ3MgJiBEQlVTX1dBVENIX1dSSVRBQkxFKQorICAgIHdhdGNoX3R5cGUgPSAid3JpdGUiOworICBlbHNlCisgICAgd2F0Y2hfdHlwZSA9ICJub3QgcmVhZCBvciB3cml0ZSI7CisgIHJldHVybiB3YXRjaF90eXBlOworfQorI2VuZGlmIC8qIERCVVNfRU5BQkxFX1ZFUkJPU0VfTU9ERSAqLworCisvKioKKyAqIFNldHMgdGhlIHdhdGNoIGZ1bmN0aW9ucy4gVGhpcyBmdW5jdGlvbiBpcyB0aGUgImJhY2tlbmQiCisgKiBmb3IgZGJ1c19jb25uZWN0aW9uX3NldF93YXRjaF9mdW5jdGlvbnMoKSBhbmQKKyAqIGRidXNfc2VydmVyX3NldF93YXRjaF9mdW5jdGlvbnMoKS4KKyAqCisgKiBAcGFyYW0gd2F0Y2hfbGlzdCB0aGUgd2F0Y2ggbGlzdC4KKyAqIEBwYXJhbSBhZGRfZnVuY3Rpb24gdGhlIGFkZCB3YXRjaCBmdW5jdGlvbi4KKyAqIEBwYXJhbSByZW1vdmVfZnVuY3Rpb24gdGhlIHJlbW92ZSB3YXRjaCBmdW5jdGlvbi4KKyAqIEBwYXJhbSB0b2dnbGVkX2Z1bmN0aW9uIGZ1bmN0aW9uIG9uIHRvZ2dsaW5nIGVuYWJsZWQgZmxhZywgb3IgI05VTEwKKyAqIEBwYXJhbSBkYXRhIHRoZSBkYXRhIGZvciB0aG9zZSBmdW5jdGlvbnMuCisgKiBAcGFyYW0gZnJlZV9kYXRhX2Z1bmN0aW9uIHRoZSBmdW5jdGlvbiB0byBmcmVlIHRoZSBkYXRhLgorICogQHJldHVybnMgI0ZBTFNFIGlmIG5vdCBlbm91Z2ggbWVtb3J5CisgKgorICovCitkYnVzX2Jvb2xfdAorX2RidXNfd2F0Y2hfbGlzdF9zZXRfZnVuY3Rpb25zIChEQnVzV2F0Y2hMaXN0ICAgICAgICAgICAqd2F0Y2hfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0FkZFdhdGNoRnVuY3Rpb24gICAgIGFkZF9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1JlbW92ZVdhdGNoRnVuY3Rpb24gIHJlbW92ZV9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1dhdGNoVG9nZ2xlZEZ1bmN0aW9uIHRvZ2dsZWRfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRnJlZUZ1bmN0aW9uICAgICAgICAgZnJlZV9kYXRhX2Z1bmN0aW9uKQoreworICAvKiBBZGQgd2F0Y2hlcyB3aXRoIHRoZSBuZXcgd2F0Y2ggZnVuY3Rpb24sIGZhaWxpbmcgb24gT09NICovCisgIGlmIChhZGRfZnVuY3Rpb24gIT0gTlVMTCkKKyAgICB7CisgICAgICBEQnVzTGlzdCAqbGluazsKKyAgICAgIAorICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZ3YXRjaF9saXN0LT53YXRjaGVzKTsKKyAgICAgIHdoaWxlIChsaW5rICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBEQnVzTGlzdCAqbmV4dCA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJndhdGNoX2xpc3QtPndhdGNoZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmspOworI2lmZGVmIERCVVNfRU5BQkxFX1ZFUkJPU0VfTU9ERQorICAgICAgICAgIERCdXNXYXRjaCAqd2F0Y2ggPSBsaW5rLT5kYXRhOworCisgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIkFkZGluZyBhICVzIHdhdGNoIG9uIGZkICUiIERCVVNfUE9MTEFCTEVfRk9STUFUICIgdXNpbmcgbmV3bHktc2V0IGFkZCB3YXRjaCBmdW5jdGlvblxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB3YXRjaF9mbGFnc190b19zdHJpbmcgKGRidXNfd2F0Y2hfZ2V0X2ZsYWdzIChsaW5rLT5kYXRhKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgX2RidXNfcG9sbGFibGVfcHJpbnRhYmxlICh3YXRjaC0+ZmQpKTsKKyNlbmRpZgorICAgICAgICAgIAorICAgICAgICAgIGlmICghKCogYWRkX2Z1bmN0aW9uKSAobGluay0+ZGF0YSwgZGF0YSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8qIHJlbW92ZSBpdCBhbGwgYWdhaW4gYW5kIHJldHVybiBGQUxTRSAqLworICAgICAgICAgICAgICBEQnVzTGlzdCAqbGluazI7CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBsaW5rMiA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZ3YXRjaF9saXN0LT53YXRjaGVzKTsKKyAgICAgICAgICAgICAgd2hpbGUgKGxpbmsyICE9IGxpbmspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgREJ1c0xpc3QgKm5leHQyID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmd2F0Y2hfbGlzdC0+d2F0Y2hlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluazIpOworI2lmZGVmIERCVVNfRU5BQkxFX1ZFUkJPU0VfTU9ERQorICAgICAgICAgICAgICAgICAgREJ1c1dhdGNoICp3YXRjaDIgPSBsaW5rMi0+ZGF0YTsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgX2RidXNfdmVyYm9zZSAoIlJlbW92aW5nIHdhdGNoIG9uIGZkICUiIERCVVNfUE9MTEFCTEVfRk9STUFUICIgdXNpbmcgbmV3bHktc2V0IHJlbW92ZSBmdW5jdGlvbiBiZWNhdXNlIGluaXRpYWwgYWRkIGZhaWxlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYnVzX3BvbGxhYmxlX3ByaW50YWJsZSAod2F0Y2gyLT5mZCkpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICgqIHJlbW92ZV9mdW5jdGlvbikgKGxpbmsyLT5kYXRhLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgbGluazIgPSBuZXh0MjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorICAgICAgCisgICAgICAgICAgbGluayA9IG5leHQ7CisgICAgICAgIH0KKyAgICB9CisgIAorICAvKiBSZW1vdmUgYWxsIGN1cnJlbnQgd2F0Y2hlcyBmcm9tIHByZXZpb3VzIHdhdGNoIGhhbmRsZXJzICovCisKKyAgaWYgKHdhdGNoX2xpc3QtPnJlbW92ZV93YXRjaF9mdW5jdGlvbiAhPSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJSZW1vdmluZyBhbGwgcHJlLWV4aXN0aW5nIHdhdGNoZXNcbiIpOworICAgICAgCisgICAgICBfZGJ1c19saXN0X2ZvcmVhY2ggKCZ3YXRjaF9saXN0LT53YXRjaGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoREJ1c0ZvcmVhY2hGdW5jdGlvbikgd2F0Y2hfbGlzdC0+cmVtb3ZlX3dhdGNoX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICB3YXRjaF9saXN0LT53YXRjaF9kYXRhKTsKKyAgICB9CisKKyAgaWYgKHdhdGNoX2xpc3QtPndhdGNoX2ZyZWVfZGF0YV9mdW5jdGlvbiAhPSBOVUxMKQorICAgICgqIHdhdGNoX2xpc3QtPndhdGNoX2ZyZWVfZGF0YV9mdW5jdGlvbikgKHdhdGNoX2xpc3QtPndhdGNoX2RhdGEpOworICAKKyAgd2F0Y2hfbGlzdC0+YWRkX3dhdGNoX2Z1bmN0aW9uID0gYWRkX2Z1bmN0aW9uOworICB3YXRjaF9saXN0LT5yZW1vdmVfd2F0Y2hfZnVuY3Rpb24gPSByZW1vdmVfZnVuY3Rpb247CisgIHdhdGNoX2xpc3QtPndhdGNoX3RvZ2dsZWRfZnVuY3Rpb24gPSB0b2dnbGVkX2Z1bmN0aW9uOworICB3YXRjaF9saXN0LT53YXRjaF9kYXRhID0gZGF0YTsKKyAgd2F0Y2hfbGlzdC0+d2F0Y2hfZnJlZV9kYXRhX2Z1bmN0aW9uID0gZnJlZV9kYXRhX2Z1bmN0aW9uOworCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIEFkZHMgYSBuZXcgd2F0Y2ggdG8gdGhlIHdhdGNoIGxpc3QsIGludm9raW5nIHRoZQorICogYXBwbGljYXRpb24gREJ1c0FkZFdhdGNoRnVuY3Rpb24gaWYgYXBwcm9wcmlhdGUuCisgKgorICogQHBhcmFtIHdhdGNoX2xpc3QgdGhlIHdhdGNoIGxpc3QuCisgKiBAcGFyYW0gd2F0Y2ggdGhlIHdhdGNoIHRvIGFkZC4KKyAqIEByZXR1cm5zICNUUlVFIG9uIHN1Y2Nlc3MsICNGQUxTRSBpZiBubyBtZW1vcnkuCisgKi8KK2RidXNfYm9vbF90CitfZGJ1c193YXRjaF9saXN0X2FkZF93YXRjaCAoREJ1c1dhdGNoTGlzdCAqd2F0Y2hfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzV2F0Y2ggICAgICp3YXRjaCkKK3sKKyAgaWYgKCFfZGJ1c19saXN0X2FwcGVuZCAoJndhdGNoX2xpc3QtPndhdGNoZXMsIHdhdGNoKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIAorICBfZGJ1c193YXRjaF9yZWYgKHdhdGNoKTsKKworICBpZiAod2F0Y2hfbGlzdC0+YWRkX3dhdGNoX2Z1bmN0aW9uICE9IE5VTEwpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIkFkZGluZyB3YXRjaCBvbiBmZCAlIiBEQlVTX1BPTExBQkxFX0ZPUk1BVCAiXG4iLAorICAgICAgICAgICAgICAgICAgICAgX2RidXNfcG9sbGFibGVfcHJpbnRhYmxlICh3YXRjaC0+ZmQpKTsKKyAgICAgIAorICAgICAgaWYgKCEoKiB3YXRjaF9saXN0LT5hZGRfd2F0Y2hfZnVuY3Rpb24pICh3YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2F0Y2hfbGlzdC0+d2F0Y2hfZGF0YSkpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c19saXN0X3JlbW92ZV9sYXN0ICgmd2F0Y2hfbGlzdC0+d2F0Y2hlcywgd2F0Y2gpOworICAgICAgICAgIF9kYnVzX3dhdGNoX3VucmVmICh3YXRjaCk7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgfQorICAKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogUmVtb3ZlcyBhIHdhdGNoIGZyb20gdGhlIHdhdGNoIGxpc3QsIGludm9raW5nIHRoZQorICogYXBwbGljYXRpb24ncyBEQnVzUmVtb3ZlV2F0Y2hGdW5jdGlvbiBpZiBhcHByb3ByaWF0ZS4KKyAqCisgKiBAcGFyYW0gd2F0Y2hfbGlzdCB0aGUgd2F0Y2ggbGlzdC4KKyAqIEBwYXJhbSB3YXRjaCB0aGUgd2F0Y2ggdG8gcmVtb3ZlLgorICovCit2b2lkCitfZGJ1c193YXRjaF9saXN0X3JlbW92ZV93YXRjaCAgKERCdXNXYXRjaExpc3QgKndhdGNoX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNXYXRjaCAgICAgKndhdGNoKQoreworICBpZiAoIV9kYnVzX2xpc3RfcmVtb3ZlICgmd2F0Y2hfbGlzdC0+d2F0Y2hlcywgd2F0Y2gpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIk5vbmV4aXN0ZW50IHdhdGNoIHdhcyByZW1vdmVkIik7CisgIAorICBpZiAod2F0Y2hfbGlzdC0+cmVtb3ZlX3dhdGNoX2Z1bmN0aW9uICE9IE5VTEwpCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIlJlbW92aW5nIHdhdGNoIG9uIGZkICUiIERCVVNfUE9MTEFCTEVfRk9STUFUICJcbiIsCisgICAgICAgICAgICAgICAgICAgICBfZGJ1c19wb2xsYWJsZV9wcmludGFibGUgKHdhdGNoLT5mZCkpOworICAgICAgCisgICAgICAoKiB3YXRjaF9saXN0LT5yZW1vdmVfd2F0Y2hfZnVuY3Rpb24pICh3YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhdGNoX2xpc3QtPndhdGNoX2RhdGEpOworICAgIH0KKyAgCisgIF9kYnVzX3dhdGNoX3VucmVmICh3YXRjaCk7Cit9CisKKy8qKgorICogU2V0cyBhIHdhdGNoIHRvIHRoZSBnaXZlbiBlbmFibGVkIHN0YXRlLCBpbnZva2luZyB0aGUKKyAqIGFwcGxpY2F0aW9uJ3MgREJ1c1dhdGNoVG9nZ2xlZEZ1bmN0aW9uIGlmIGFwcHJvcHJpYXRlLgorICoKKyAqIEBwYXJhbSB3YXRjaF9saXN0IHRoZSB3YXRjaCBsaXN0LgorICogQHBhcmFtIHdhdGNoIHRoZSB3YXRjaCB0byB0b2dnbGUuCisgKiBAcGFyYW0gZW5hYmxlZCAjVFJVRSB0byBlbmFibGUKKyAqLwordm9pZAorX2RidXNfd2F0Y2hfbGlzdF90b2dnbGVfd2F0Y2ggKERCdXNXYXRjaExpc3QgICAgICAgICAgICp3YXRjaF9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNXYXRjaCAgICAgICAgICAgICAgICp3YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICAgICAgICAgZW5hYmxlZCkKK3sKKyAgZW5hYmxlZCA9ICEhZW5hYmxlZDsKKyAgCisgIGlmIChlbmFibGVkID09IHdhdGNoLT5lbmFibGVkKQorICAgIHJldHVybjsKKworICB3YXRjaC0+ZW5hYmxlZCA9IGVuYWJsZWQ7CisgIAorICBpZiAod2F0Y2hfbGlzdC0+d2F0Y2hfdG9nZ2xlZF9mdW5jdGlvbiAhPSBOVUxMKQorICAgIHsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCJUb2dnbGluZyB3YXRjaCAlcCBvbiBmZCAlIiBEQlVTX1BPTExBQkxFX0ZPUk1BVCAiIHRvICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICBfZGJ1c19wb2xsYWJsZV9wcmludGFibGUgKHdhdGNoLT5mZCksCisgICAgICAgICAgICAgICAgICAgICB3YXRjaC0+ZW5hYmxlZCk7CisgICAgICAKKyAgICAgICgqIHdhdGNoX2xpc3QtPndhdGNoX3RvZ2dsZWRfZnVuY3Rpb24pICh3YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXRjaF9saXN0LT53YXRjaF9kYXRhKTsKKyAgICB9Cit9CisKKy8qKgorICogU2V0cyBhbGwgd2F0Y2hlcyB0byB0aGUgZ2l2ZW4gZW5hYmxlZCBzdGF0ZSwgaW52b2tpbmcgdGhlCisgKiBhcHBsaWNhdGlvbidzIERCdXNXYXRjaFRvZ2dsZWRGdW5jdGlvbiBpZiBhcHByb3ByaWF0ZS4KKyAqCisgKiBAcGFyYW0gd2F0Y2hfbGlzdCB0aGUgd2F0Y2ggbGlzdC4KKyAqIEBwYXJhbSBlbmFibGVkICNUUlVFIHRvIGVuYWJsZQorICovCit2b2lkCitfZGJ1c193YXRjaF9saXN0X3RvZ2dsZV9hbGxfd2F0Y2hlcyAoREJ1c1dhdGNoTGlzdCAgICAgICAgICAgKndhdGNoX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICAgICAgICAgIGVuYWJsZWQpCit7CisgIERCdXNMaXN0ICpsaW5rOworCisgIGZvciAobGluayA9IF9kYnVzX2xpc3RfZ2V0X2ZpcnN0X2xpbmsgKCZ3YXRjaF9saXN0LT53YXRjaGVzKTsKKyAgICAgICBsaW5rICE9IE5VTEw7CisgICAgICAgbGluayA9IF9kYnVzX2xpc3RfZ2V0X25leHRfbGluayAoJndhdGNoX2xpc3QtPndhdGNoZXMsIGxpbmspKQorICAgIHsKKyAgICAgIF9kYnVzX3dhdGNoX2xpc3RfdG9nZ2xlX3dhdGNoICh3YXRjaF9saXN0LCBsaW5rLT5kYXRhLCBlbmFibGVkKTsKKyAgICB9Cit9CisKKy8qKgorICogU2V0cyB0aGUgaGFuZGxlciBmb3IgdGhlIHdhdGNoLgorICoKKyAqIEB0b2RvIHRoaXMgZnVuY3Rpb24gb25seSBleGlzdHMgYmVjYXVzZSBvZiB0aGUgd2VpcmQKKyAqIHdheSBjb25uZWN0aW9uIHdhdGNoZXMgYXJlIGRvbmUsIHNlZSB0aGUgbm90ZQorICogaW4gZG9jcyBmb3IgX2RidXNfY29ubmVjdGlvbl9oYW5kbGVfd2F0Y2goKS4KKyAqCisgKiBAcGFyYW0gd2F0Y2ggdGhlIHdhdGNoCisgKiBAcGFyYW0gaGFuZGxlciB0aGUgbmV3IGhhbmRsZXIKKyAqIEBwYXJhbSBkYXRhIHRoZSBkYXRhCisgKiBAcGFyYW0gZnJlZV9kYXRhX2Z1bmN0aW9uIGZyZWUgZGF0YSB3aXRoIHRoaXMKKyAqLwordm9pZAorX2RidXNfd2F0Y2hfc2V0X2hhbmRsZXIgKERCdXNXYXRjaCAgICAgICAgKndhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNXYXRjaEhhbmRsZXIgIGhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRnJlZUZ1bmN0aW9uICBmcmVlX2RhdGFfZnVuY3Rpb24pCit7CisgIGlmICh3YXRjaC0+ZnJlZV9oYW5kbGVyX2RhdGFfZnVuY3Rpb24pCisgICAgKCogd2F0Y2gtPmZyZWVfaGFuZGxlcl9kYXRhX2Z1bmN0aW9uKSAod2F0Y2gtPmhhbmRsZXJfZGF0YSk7CisKKyAgd2F0Y2gtPmhhbmRsZXIgPSBoYW5kbGVyOworICB3YXRjaC0+aGFuZGxlcl9kYXRhID0gZGF0YTsKKyAgd2F0Y2gtPmZyZWVfaGFuZGxlcl9kYXRhX2Z1bmN0aW9uID0gZnJlZV9kYXRhX2Z1bmN0aW9uOworfQorCisvKiogQH0gKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgREJ1c1dhdGNoIERCdXNXYXRjaAorICogQGluZ3JvdXAgIERCdXMKKyAqIEBicmllZiBPYmplY3QgcmVwcmVzZW50aW5nIGEgZmlsZSBkZXNjcmlwdG9yIHRvIGJlIHdhdGNoZWQuCisgKgorICogVHlwZXMgYW5kIGZ1bmN0aW9ucyByZWxhdGVkIHRvIERCdXNXYXRjaC4gQSB3YXRjaCByZXByZXNlbnRzCisgKiBhIGZpbGUgZGVzY3JpcHRvciB0aGF0IHRoZSBtYWluIGxvb3AgbmVlZHMgdG8gbW9uaXRvciwKKyAqIGFzIGluIFF0J3MgUVNvY2tldE5vdGlmaWVyIG9yIEdMaWIncyBnX2lvX2FkZF93YXRjaCgpLgorICoKKyAqIFVzZSBkYnVzX2Nvbm5lY3Rpb25fc2V0X3dhdGNoX2Z1bmN0aW9ucygpIG9yIGRidXNfc2VydmVyX3NldF93YXRjaF9mdW5jdGlvbnMoKQorICogdG8gYmUgbm90aWZpZWQgd2hlbiBsaWJkYnVzIG5lZWRzIHRvIGFkZCBvciByZW1vdmUgd2F0Y2hlcy4KKyAqIAorICogQHsKKyAqLworCisvKioKKyAqIEB0eXBlZGVmIERCdXNXYXRjaAorICoKKyAqIE9wYXF1ZSBvYmplY3QgcmVwcmVzZW50aW5nIGEgZmlsZSBkZXNjcmlwdG9yCisgKiB0byBiZSB3YXRjaGVkIGZvciBjaGFuZ2VzIGluIHJlYWRhYmlsaXR5LAorICogd3JpdGFiaWxpdHksIG9yIGhhbmd1cC4KKyAqLworCisvKioKKyAqIERlcHJlY2F0ZWQgZm9ybWVyIG5hbWUgb2YgZGJ1c193YXRjaF9nZXRfdW5peF9mZCgpLgorICogCisgKiBAcGFyYW0gd2F0Y2ggdGhlIERCdXNXYXRjaCBvYmplY3QuCisgKiBAcmV0dXJucyB0aGUgZmlsZSBkZXNjcmlwdG9yIHRvIHdhdGNoLgorICovCitpbnQKK2RidXNfd2F0Y2hfZ2V0X2ZkIChEQnVzV2F0Y2ggKndhdGNoKQoreworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHdhdGNoICE9IE5VTEwsIC0xKTsKKworICByZXR1cm4gZGJ1c193YXRjaF9nZXRfdW5peF9mZCh3YXRjaCk7Cit9CisKKy8qKgorICogUmV0dXJucyBhIFVOSVggZmlsZSBkZXNjcmlwdG9yIHRvIGJlIHdhdGNoZWQsCisgKiB3aGljaCBtYXkgYmUgYSBwaXBlLCBzb2NrZXQsIG9yIG90aGVyIHR5cGUgb2YKKyAqIGRlc2NyaXB0b3IuIE9uIFVOSVggdGhpcyBpcyBwcmVmZXJyZWQgdG8KKyAqIGRidXNfd2F0Y2hfZ2V0X3NvY2tldCgpIHNpbmNlIGl0IHdvcmtzIHdpdGgKKyAqIG1vcmUga2luZHMgb2YgI0RCdXNXYXRjaC4KKyAqCisgKiBBbHdheXMgcmV0dXJucyAtMSBvbiBXaW5kb3dzLiBPbiBXaW5kb3dzIHlvdSB1c2UKKyAqIGRidXNfd2F0Y2hfZ2V0X3NvY2tldCgpIHRvIGdldCBhIFdpbnNvY2sgc29ja2V0IHRvIHdhdGNoLgorICogCisgKiBAcGFyYW0gd2F0Y2ggdGhlIERCdXNXYXRjaCBvYmplY3QuCisgKiBAcmV0dXJucyB0aGUgZmlsZSBkZXNjcmlwdG9yIHRvIHdhdGNoLgorICovCitpbnQKK2RidXNfd2F0Y2hfZ2V0X3VuaXhfZmQgKERCdXNXYXRjaCAqd2F0Y2gpCit7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAod2F0Y2ggIT0gTlVMTCwgLTEpOworCisgIC8qIEZJWE1FIHJlbW92ZSAjaWZkZWYgYW5kIGRvIHRoaXMgb24gYSBsb3dlciBsZXZlbAorICAgKiAod2F0Y2ggc2hvdWxkIGhhdmUgc2V0X3NvY2tldCBhbmQgc2V0X3VuaXhfZmQgYW5kIHRyYWNrCisgICAqIHdoaWNoIGl0IGhhcywgYW5kIHRoZSB0cmFuc3BvcnQgc2hvdWxkIHByb3ZpZGUgdGhlCisgICAqIGFwcHJvcHJpYXRlIHdhdGNoIHR5cGUpCisgICAqLworI2lmZGVmIERCVVNfVU5JWAorICByZXR1cm4gd2F0Y2gtPmZkOworI2Vsc2UKKyAgcmV0dXJuIGRidXNfd2F0Y2hfZ2V0X3NvY2tldCggd2F0Y2ggKTsKKyNlbmRpZgorfQorCisvKioKKyAqIFJldHVybnMgYSBzb2NrZXQgdG8gYmUgd2F0Y2hlZCwgb24gVU5JWCB0aGlzIHdpbGwgcmV0dXJuIC0xIGlmIG91cgorICogdHJhbnNwb3J0IGlzIG5vdCBzb2NrZXQtYmFzZWQgc28gZGJ1c193YXRjaF9nZXRfdW5peF9mZCgpIGlzCisgKiBwcmVmZXJyZWQuCisgKgorICogT24gV2luZG93cywgZGJ1c193YXRjaF9nZXRfdW5peF9mZCgpIHJldHVybnMgLTEgYnV0IHRoaXMgZnVuY3Rpb24KKyAqIHJldHVybnMgYSBXaW5zb2NrIHNvY2tldCAoYXNzdW1pbmcgdGhlIHRyYW5zcG9ydCBpcyBzb2NrZXQtYmFzZWQsCisgKiBhcyBpdCBhbHdheXMgaXMgZm9yIG5vdykuCisgKiAKKyAqIEBwYXJhbSB3YXRjaCB0aGUgREJ1c1dhdGNoIG9iamVjdC4KKyAqIEByZXR1cm5zIHRoZSBzb2NrZXQgdG8gd2F0Y2guCisgKi8KK2ludAorZGJ1c193YXRjaF9nZXRfc29ja2V0IChEQnVzV2F0Y2ggKndhdGNoKQoreworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHdhdGNoICE9IE5VTEwsIC0xKTsKKworI2lmZGVmIERCVVNfVU5JWAorICByZXR1cm4gd2F0Y2gtPmZkOworI2Vsc2UKKyAgcmV0dXJuIF9kYnVzX3NvY2tldF9nZXRfaW50ICh3YXRjaC0+ZmQpOworI2VuZGlmCit9CisKK0RCdXNTb2NrZXQKK19kYnVzX3dhdGNoX2dldF9zb2NrZXQgKERCdXNXYXRjaCAqd2F0Y2gpCit7CisgIERCdXNTb2NrZXQgczsKKworICBfZGJ1c19hc3NlcnQgKHdhdGNoICE9IE5VTEwpOworCisjaWZkZWYgREJVU19VTklYCisgIHMuZmQgPSB3YXRjaC0+ZmQ7CisjZWxzZQorICBzID0gd2F0Y2gtPmZkOworI2VuZGlmCisKKyAgcmV0dXJuIHM7Cit9CisKK0RCdXNQb2xsYWJsZQorX2RidXNfd2F0Y2hfZ2V0X3BvbGxhYmxlIChEQnVzV2F0Y2ggKndhdGNoKQoreworICBfZGJ1c19hc3NlcnQgKHdhdGNoICE9IE5VTEwpOworCisgIHJldHVybiB3YXRjaC0+ZmQ7Cit9CisKKy8qKgorICogR2V0cyBmbGFncyBmcm9tIERCdXNXYXRjaEZsYWdzIGluZGljYXRpbmcKKyAqIHdoYXQgY29uZGl0aW9ucyBzaG91bGQgYmUgbW9uaXRvcmVkIG9uIHRoZQorICogZmlsZSBkZXNjcmlwdG9yLgorICogCisgKiBUaGUgZmxhZ3MgcmV0dXJuZWQgd2lsbCBvbmx5IGNvbnRhaW4gREJVU19XQVRDSF9SRUFEQUJMRQorICogYW5kIERCVVNfV0FUQ0hfV1JJVEFCTEUsIG5ldmVyIERCVVNfV0FUQ0hfSEFOR1VQIG9yCisgKiBEQlVTX1dBVENIX0VSUk9SOyBhbGwgd2F0Y2hlcyBpbXBsaWNpdGx5IGluY2x1ZGUgYSB3YXRjaAorICogZm9yIGhhbmd1cHMsIGVycm9ycywgYW5kIG90aGVyIGV4Y2VwdGlvbmFsIGNvbmRpdGlvbnMuCisgKgorICogQHBhcmFtIHdhdGNoIHRoZSBEQnVzV2F0Y2ggb2JqZWN0LgorICogQHJldHVybnMgdGhlIGNvbmRpdGlvbnMgdG8gd2F0Y2guCisgKi8KK3Vuc2lnbmVkIGludAorZGJ1c193YXRjaF9nZXRfZmxhZ3MgKERCdXNXYXRjaCAqd2F0Y2gpCit7CisgIF9kYnVzX3JldHVybl92YWxfaWZfZmFpbCAod2F0Y2ggIT0gTlVMTCwgMCk7CisgIF9kYnVzX2Fzc2VydCAoKHdhdGNoLT5mbGFncyAmIFZBTElEX1dBVENIX0ZMQUdTKSA9PSB3YXRjaC0+ZmxhZ3MpOworCisgIHJldHVybiB3YXRjaC0+ZmxhZ3M7Cit9CisKKy8qKgorICogR2V0cyBkYXRhIHByZXZpb3VzbHkgc2V0IHdpdGggZGJ1c193YXRjaF9zZXRfZGF0YSgpCisgKiBvciAjTlVMTCBpZiBub25lLgorICoKKyAqIEBwYXJhbSB3YXRjaCB0aGUgREJ1c1dhdGNoIG9iamVjdC4KKyAqIEByZXR1cm5zIHByZXZpb3VzbHktc2V0IGRhdGEuCisgKi8KK3ZvaWQqCitkYnVzX3dhdGNoX2dldF9kYXRhIChEQnVzV2F0Y2ggKndhdGNoKQoreworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHdhdGNoICE9IE5VTEwsIE5VTEwpOworCisgIHJldHVybiB3YXRjaC0+ZGF0YTsKK30KKworLyoqCisgKiBTZXRzIGRhdGEgd2hpY2ggY2FuIGJlIHJldHJpZXZlZCB3aXRoIGRidXNfd2F0Y2hfZ2V0X2RhdGEoKS4KKyAqIEludGVuZGVkIGZvciB1c2UgYnkgdGhlIERCdXNBZGRXYXRjaEZ1bmN0aW9uIGFuZAorICogREJ1c1JlbW92ZVdhdGNoRnVuY3Rpb24gdG8gc3RvcmUgdGhlaXIgb3duIGRhdGEuICBGb3IgZXhhbXBsZSB3aXRoCisgKiBRdCB5b3UgbWlnaHQgc3RvcmUgdGhlIFFTb2NrZXROb3RpZmllciBmb3IgdGhpcyB3YXRjaCBhbmQgd2l0aCBHTGliCisgKiB5b3UgbWlnaHQgc3RvcmUgYSBHU291cmNlLgorICoKKyAqIEBwYXJhbSB3YXRjaCB0aGUgREJ1c1dhdGNoIG9iamVjdC4KKyAqIEBwYXJhbSBkYXRhIHRoZSBkYXRhLgorICogQHBhcmFtIGZyZWVfZGF0YV9mdW5jdGlvbiBmdW5jdGlvbiB0byBiZSBjYWxsZWQgdG8gZnJlZSB0aGUgZGF0YS4KKyAqLwordm9pZAorZGJ1c193YXRjaF9zZXRfZGF0YSAoREJ1c1dhdGNoICAgICAgICAqd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgREJ1c0ZyZWVGdW5jdGlvbiAgZnJlZV9kYXRhX2Z1bmN0aW9uKQoreworICBfZGJ1c19yZXR1cm5faWZfZmFpbCAod2F0Y2ggIT0gTlVMTCk7CisKKyAgX2RidXNfdmVyYm9zZSAoIlNldHRpbmcgd2F0Y2ggZmQgJSIgREJVU19QT0xMQUJMRV9GT1JNQVQgIiBkYXRhIHRvIGRhdGEgPSAlcCBmdW5jdGlvbiA9ICVwIGZyb20gZGF0YSA9ICVwIGZ1bmN0aW9uID0gJXBcbiIsCisgICAgICAgICAgICAgICAgIF9kYnVzX3BvbGxhYmxlX3ByaW50YWJsZSAod2F0Y2gtPmZkKSwKKyAgICAgICAgICAgICAgICAgZGF0YSwgZnJlZV9kYXRhX2Z1bmN0aW9uLCB3YXRjaC0+ZGF0YSwgd2F0Y2gtPmZyZWVfZGF0YV9mdW5jdGlvbik7CisgIAorICBpZiAod2F0Y2gtPmZyZWVfZGF0YV9mdW5jdGlvbiAhPSBOVUxMKQorICAgICgqIHdhdGNoLT5mcmVlX2RhdGFfZnVuY3Rpb24pICh3YXRjaC0+ZGF0YSk7CisgIAorICB3YXRjaC0+ZGF0YSA9IGRhdGE7CisgIHdhdGNoLT5mcmVlX2RhdGFfZnVuY3Rpb24gPSBmcmVlX2RhdGFfZnVuY3Rpb247Cit9CisKKy8qKgorICogUmV0dXJucyB3aGV0aGVyIGEgd2F0Y2ggaXMgZW5hYmxlZCBvciBub3QuIElmIG5vdAorICogZW5hYmxlZCwgaXQgc2hvdWxkIG5vdCBiZSBwb2xsZWQgYnkgdGhlIG1haW4gbG9vcC4KKyAqCisgKiBAcGFyYW0gd2F0Y2ggdGhlIERCdXNXYXRjaCBvYmplY3QKKyAqIEByZXR1cm5zICNUUlVFIGlmIHRoZSB3YXRjaCBpcyBlbmFibGVkCisgKi8KK2RidXNfYm9vbF90CitkYnVzX3dhdGNoX2dldF9lbmFibGVkIChEQnVzV2F0Y2ggKndhdGNoKQoreworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHdhdGNoICE9IE5VTEwsIEZBTFNFKTsKKworICByZXR1cm4gd2F0Y2gtPmVuYWJsZWQ7Cit9CisKKworLyoqCisgKiBDYWxsZWQgdG8gbm90aWZ5IHRoZSBELUJ1cyBsaWJyYXJ5IHdoZW4gYSBwcmV2aW91c2x5LWFkZGVkIHdhdGNoIGlzCisgKiByZWFkeSBmb3IgcmVhZGluZyBvciB3cml0aW5nLCBvciBoYXMgYW4gZXhjZXB0aW9uIHN1Y2ggYXMgYSBoYW5ndXAuCisgKiAKKyAqIElmIHRoaXMgZnVuY3Rpb24gcmV0dXJucyAjRkFMU0UsIHRoZW4gdGhlIGZpbGUgZGVzY3JpcHRvciBtYXkgc3RpbGwKKyAqIGJlIHJlYWR5IGZvciByZWFkaW5nIG9yIHdyaXRpbmcsIGJ1dCBtb3JlIG1lbW9yeSBpcyBuZWVkZWQgaW4gb3JkZXIKKyAqIHRvIGRvIHRoZSByZWFkaW5nIG9yIHdyaXRpbmcuIElmIHlvdSBpZ25vcmUgdGhlICNGQUxTRSByZXR1cm4sIHlvdXIKKyAqIGFwcGxpY2F0aW9uIG1heSBzcGluIGluIGEgYnVzeSBsb29wIG9uIHRoZSBmaWxlIGRlc2NyaXB0b3IgdW50aWwKKyAqIG1lbW9yeSBiZWNvbWVzIGF2YWlsYWJsZSwgYnV0IG5vdGhpbmcgbW9yZSBjYXRhc3Ryb3BoaWMgc2hvdWxkCisgKiBoYXBwZW4uCisgKgorICogZGJ1c193YXRjaF9oYW5kbGUoKSBjYW5ub3QgYmUgY2FsbGVkIGR1cmluZyB0aGUKKyAqIERCdXNBZGRXYXRjaEZ1bmN0aW9uLCBhcyB0aGUgY29ubmVjdGlvbiB3aWxsIG5vdCBiZSByZWFkeSB0byBoYW5kbGUKKyAqIHRoYXQgd2F0Y2ggeWV0LgorICogCisgKiBJdCBpcyBub3QgYWxsb3dlZCB0byByZWZlcmVuY2UgYSBEQnVzV2F0Y2ggYWZ0ZXIgaXQgaGFzIGJlZW4gcGFzc2VkCisgKiB0byByZW1vdmVfZnVuY3Rpb24uCisgKgorICogQHBhcmFtIHdhdGNoIHRoZSBEQnVzV2F0Y2ggb2JqZWN0LgorICogQHBhcmFtIGZsYWdzIHRoZSBwb2xsIGNvbmRpdGlvbiB1c2luZyAjREJ1c1dhdGNoRmxhZ3MgdmFsdWVzCisgKiBAcmV0dXJucyAjRkFMU0UgaWYgdGhlcmUgd2Fzbid0IGVub3VnaCBtZW1vcnkgCisgKi8KK2RidXNfYm9vbF90CitkYnVzX3dhdGNoX2hhbmRsZSAoREJ1c1dhdGNoICAgICp3YXRjaCwKKyAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgIGZsYWdzKQoreworICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKHdhdGNoICE9IE5VTEwsIEZBTFNFKTsKKworI2lmbmRlZiBEQlVTX0RJU0FCTEVfQ0hFQ0tTCisgIGlmICghX2RidXNfcG9sbGFibGVfaXNfdmFsaWQgKHdhdGNoLT5mZCkgfHwgd2F0Y2gtPmZsYWdzID09IDApCisgICAgeworICAgICAgX2RidXNfd2Fybl9jaGVja19mYWlsZWQgKCJXYXRjaCBpcyBpbnZhbGlkLCBpdCBzaG91bGQgaGF2ZSBiZWVuIHJlbW92ZWQiKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyNlbmRpZgorICAgIAorICBfZGJ1c19yZXR1cm5fdmFsX2lmX2ZhaWwgKF9kYnVzX3BvbGxhYmxlX2lzX3ZhbGlkICh3YXRjaC0+ZmQpIC8qIGZhaWxzIGlmIHdhdGNoIHdhcyByZW1vdmVkICovLCBUUlVFKTsKKyAgCisgIF9kYnVzX3dhdGNoX3Nhbml0aXplX2NvbmRpdGlvbiAod2F0Y2gsICZmbGFncyk7CisKKyAgaWYgKGZsYWdzID09IDApCisgICAgeworICAgICAgX2RidXNfdmVyYm9zZSAoIkFmdGVyIHNhbml0aXphdGlvbiwgd2F0Y2ggZmxhZ3Mgb24gZmQgJSIgREJVU19QT0xMQUJMRV9GT1JNQVQgIiB3ZXJlIDBcbiIsCisgICAgICAgICAgICAgICAgICAgICBfZGJ1c19wb2xsYWJsZV9wcmludGFibGUgKHdhdGNoLT5mZCkpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICBlbHNlCisgICAgcmV0dXJuICgqIHdhdGNoLT5oYW5kbGVyKSAod2F0Y2gsIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhdGNoLT5oYW5kbGVyX2RhdGEpOworfQorCisKKy8qKiBAfSAqLwpkaWZmIC0tZ2l0IGEvZGJ1cy9kYnVzLXdhdGNoLmggYi9kYnVzL2RidXMtd2F0Y2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDhiYmYyCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy9kYnVzLXdhdGNoLmgKQEAgLTAsMCArMSwxMDYgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy13YXRjaC5oIERCdXNXYXRjaCBpbnRlcm5hbCBpbnRlcmZhY2VzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyICBSZWQgSGF0IEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKyNpZm5kZWYgREJVU19XQVRDSF9ICisjZGVmaW5lIERCVVNfV0FUQ0hfSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWludGVybmFscy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1jb25uZWN0aW9uLmg+CisKK0RCVVNfQkVHSU5fREVDTFMKKworLyoqCisgKiBAYWRkdG9ncm91cCBEQnVzV2F0Y2hJbnRlcm5hbHMKKyAqIEB7CisgKi8KKworLyogUHVibGljIG1ldGhvZHMgb24gREJ1c1dhdGNoIGFyZSBpbiBkYnVzLWNvbm5lY3Rpb24uaCAqLworCit0eXBlZGVmIHN0cnVjdCBEQnVzV2F0Y2hMaXN0IERCdXNXYXRjaExpc3Q7CisKKyNkZWZpbmUgX0RCVVNfV0FUQ0hfTlZBTCAoMTw8NCkKKworLyoqIGZ1bmN0aW9uIHRvIHJ1biB3aGVuIHRoZSB3YXRjaCBpcyBoYW5kbGVkICovCit0eXBlZGVmIGRidXNfYm9vbF90ICgqIERCdXNXYXRjaEhhbmRsZXIpIChEQnVzV2F0Y2ggICAgKndhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAqZGF0YSk7CisKK0RCVVNfUFJJVkFURV9FWFBPUlQKK0RCdXNXYXRjaCogX2RidXNfd2F0Y2hfbmV3ICAgICAgICAgICAgICAgIChEQnVzUG9sbGFibGUgICAgICBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICBlbmFibGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNXYXRjaEhhbmRsZXIgIGhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRnJlZUZ1bmN0aW9uICBmcmVlX2RhdGFfZnVuY3Rpb24pOworREJVU19QUklWQVRFX0VYUE9SVAorREJ1c1dhdGNoKiBfZGJ1c193YXRjaF9yZWYgICAgICAgICAgICAgICAgKERCdXNXYXRjaCAgICAgICAgKndhdGNoKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK3ZvaWQgICAgICAgX2RidXNfd2F0Y2hfdW5yZWYgICAgICAgICAgICAgIChEQnVzV2F0Y2ggICAgICAgICp3YXRjaCk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCit2b2lkICAgICAgIF9kYnVzX3dhdGNoX2ludmFsaWRhdGUgICAgICAgICAoREJ1c1dhdGNoICAgICAgICAqd2F0Y2gpOwordm9pZCAgICAgICBfZGJ1c193YXRjaF9zYW5pdGl6ZV9jb25kaXRpb24gKERCdXNXYXRjaCAgICAgICAgKndhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgICAgKmNvbmRpdGlvbik7Cit2b2lkICAgICAgIF9kYnVzX3dhdGNoX3NldF9oYW5kbGVyICAgICAgICAoREJ1c1dhdGNoICAgICAgICAqd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1dhdGNoSGFuZGxlciAgaGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNGcmVlRnVuY3Rpb24gIGZyZWVfZGF0YV9mdW5jdGlvbik7CisKKworREJVU19QUklWQVRFX0VYUE9SVAorREJ1c1dhdGNoTGlzdCogX2RidXNfd2F0Y2hfbGlzdF9uZXcgICAgICAgICAgICh2b2lkKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK3ZvaWQgICAgICAgICAgIF9kYnVzX3dhdGNoX2xpc3RfZnJlZSAgICAgICAgICAoREJ1c1dhdGNoTGlzdCAgICAgICAgICAgKndhdGNoX2xpc3QpOworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgICAgX2RidXNfd2F0Y2hfbGlzdF9zZXRfZnVuY3Rpb25zIChEQnVzV2F0Y2hMaXN0ICAgICAgICAgICAqd2F0Y2hfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0FkZFdhdGNoRnVuY3Rpb24gICAgIGFkZF9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1JlbW92ZVdhdGNoRnVuY3Rpb24gIHJlbW92ZV9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1dhdGNoVG9nZ2xlZEZ1bmN0aW9uIHRvZ2dsZWRfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRnJlZUZ1bmN0aW9uICAgICAgICAgZnJlZV9kYXRhX2Z1bmN0aW9uKTsKK0RCVVNfUFJJVkFURV9FWFBPUlQKK2RidXNfYm9vbF90ICAgIF9kYnVzX3dhdGNoX2xpc3RfYWRkX3dhdGNoICAgICAoREJ1c1dhdGNoTGlzdCAgICAgICAgICAgKndhdGNoX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNXYXRjaCAgICAgICAgICAgICAgICp3YXRjaCk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCit2b2lkICAgICAgICAgICBfZGJ1c193YXRjaF9saXN0X3JlbW92ZV93YXRjaCAgKERCdXNXYXRjaExpc3QgICAgICAgICAgICp3YXRjaF9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzV2F0Y2ggICAgICAgICAgICAgICAqd2F0Y2gpOwordm9pZCAgICAgICAgICAgX2RidXNfd2F0Y2hfbGlzdF90b2dnbGVfd2F0Y2ggIChEQnVzV2F0Y2hMaXN0ICAgICAgICAgICAqd2F0Y2hfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c1dhdGNoICAgICAgICAgICAgICAgKndhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICAgICAgICAgZW5hYmxlZCk7Cit2b2lkICAgICAgICAgICBfZGJ1c193YXRjaF9saXN0X3RvZ2dsZV9hbGxfd2F0Y2hlcyAoREJ1c1dhdGNoTGlzdCAgICAgICp3YXRjaF9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVzX2Jvb2xfdCAgICAgICAgICAgICAgZW5hYmxlZCk7CitkYnVzX2Jvb2xfdCAgICBfZGJ1c193YXRjaF9nZXRfZW5hYmxlZCAgICAgICAgKERCdXNXYXRjaCAgICAgICAgICAgICAgKndhdGNoKTsKKworREJVU19QUklWQVRFX0VYUE9SVAorZGJ1c19ib29sX3QgICAgX2RidXNfd2F0Y2hfZ2V0X29vbV9sYXN0X3RpbWUgIChEQnVzV2F0Y2ggICAgICAgICAgICAgICAqd2F0Y2gpOworREJVU19QUklWQVRFX0VYUE9SVAordm9pZCAgICAgICAgICAgX2RidXNfd2F0Y2hfc2V0X29vbV9sYXN0X3RpbWUgIChEQnVzV2F0Y2ggICAgICAgICAgICAgICAqd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgICAgICAgICBvb20pOworCitEQnVzU29ja2V0ICAgICBfZGJ1c193YXRjaF9nZXRfc29ja2V0ICAgICAgICAgKERCdXNXYXRjaCAgICAgICAgICAgICAgICp3YXRjaCk7CitEQlVTX1BSSVZBVEVfRVhQT1JUCitEQnVzUG9sbGFibGUgICBfZGJ1c193YXRjaF9nZXRfcG9sbGFibGUgICAgICAgKERCdXNXYXRjaCAgICAgICAgICAgICAgICp3YXRjaCk7CisKKy8qKiBAfSAqLworCitEQlVTX0VORF9ERUNMUworCisjZW5kaWYgLyogREJVU19XQVRDSF9IICovCmRpZmYgLS1naXQgYS9kYnVzL2RidXMuaCBiL2RidXMvZGJ1cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxYWE0ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9kYnVzL2RidXMuaApAQCAtMCwwICsxLDEwNCBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLmggIENvbnZlbmllbmNlIGhlYWRlciBpbmNsdWRpbmcgYWxsIG90aGVyIGhlYWRlcnMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMgIFJlZCBIYXQgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaWZuZGVmIERCVVNfSAorI2RlZmluZSBEQlVTX0gKKworI2RlZmluZSBEQlVTX0lOU0lERV9EQlVTX0ggMQorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWFyY2gtZGVwcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1hZGRyZXNzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWJ1cy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1jb25uZWN0aW9uLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWVycm9ycy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1tYWNyb3MuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbWVzc2FnZS5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1taXNjLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXBlbmRpbmctY2FsbC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1wcm90b2NvbC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zZXJ2ZXIuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc2hhcmVkLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXNpZ25hdHVyZS5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zeW50YXguaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtdGhyZWFkcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy10eXBlcy5oPgorCisjdW5kZWYgREJVU19JTlNJREVfREJVU19ICisKKy8qKgorICogQGRlZmdyb3VwIERCdXMgRC1CdXMgbG93LWxldmVsIHB1YmxpYyBBUEkKKyAqIEBicmllZiBUaGUgbG93LWxldmVsIHB1YmxpYyBBUEkgb2YgdGhlIEQtQnVzIGxpYnJhcnkKKyAqCisgKiBsaWJkYnVzIHByb3ZpZGVzIGEgbG93LWxldmVsIEMgQVBJIGludGVuZGVkIHByaW1hcmlseSBmb3IgdXNlIGJ5CisgKiBiaW5kaW5ncyB0byBzcGVjaWZpYyBvYmplY3Qgc3lzdGVtcyBhbmQgbGFuZ3VhZ2VzLiAgRC1CdXMgaXMgbW9zdAorICogY29udmVuaWVudCB3aGVuIHVzZWQgd2l0aCB0aGUgR0xpYiBiaW5kaW5ncywgUHl0aG9uIGJpbmRpbmdzLCBRdAorICogYmluZGluZ3MsIE1vbm8gYmluZGluZ3MsIGFuZCBzbyBmb3J0aC4gIFRoaXMgbG93LWxldmVsIEFQSSBoYXMgYQorICogbG90IG9mIGNvbXBsZXhpdHkgdXNlZnVsIG9ubHkgZm9yIGJpbmRpbmdzLgorICogCisgKiBAeworICovCisKKy8qKiBAfSAqLworCisvKioKKyAqIEBtYWlucGFnZQorICoKKyAqIFRoaXMgbWFudWFsIGRvY3VtZW50cyB0aGUgPGVtPmxvdy1sZXZlbDwvZW0+IEQtQnVzIEMgQVBJLiA8Yj5JZiB5b3UgdXNlCisgKiB0aGlzIGxvdy1sZXZlbCBBUEkgZGlyZWN0bHksIHlvdSdyZSBzaWduaW5nIHVwIGZvciBzb21lIHBhaW4uPC9iPgorICoKKyAqIENhdmVhdHMgYXNpZGUsIHlvdSBtaWdodCBnZXQgc3RhcnRlZCBsZWFybmluZyB0aGUgbG93LWxldmVsIEFQSSBieSByZWFkaW5nCisgKiBhYm91dCBAcmVmIERCdXNDb25uZWN0aW9uIGFuZCBAcmVmIERCdXNNZXNzYWdlLgorICogCisgKiBUaGVyZSBhcmUgc2V2ZXJhbCBvdGhlciBwbGFjZXMgdG8gbG9vayBmb3IgRC1CdXMgaW5mb3JtYXRpb24sIHN1Y2gKKyAqIGFzIHRoZSB0dXRvcmlhbCBhbmQgdGhlIHNwZWNpZmljYXRpb247IHRob3NlIGNhbiBiZSBmb3VuZCBhdCA8YQorICogaHJlZj0iaHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvd2lraS9Tb2Z0d2FyZS9kYnVzIj50aGUgRC1CdXMKKyAqIHdlYnNpdGU8L2E+LiBJZiB5b3UncmUgaW50ZXJlc3RlZCBpbiBhIHN5c2FkbWluIG9yIHBhY2thZ2UKKyAqIG1haW50YWluZXIncyBwZXJzcGVjdGl2ZSBvbiB0aGUgZGJ1cy1kYWVtb24gaXRzZWxmIGFuZCBpdHMKKyAqIGNvbmZpZ3VyYXRpb24sIGJlIHN1cmUgdG8gY2hlY2sgb3V0IHRoZSBtYW4gcGFnZXMgYXMgd2VsbC4KKyAqCisgKiBUaGUgbG93LWxldmVsIEFQSSBkb2N1bWVudGVkIGluIHRoaXMgbWFudWFsIGRlbGliZXJhdGVseSBsYWNrcworICogbW9zdCBjb252ZW5pZW5jZSBmdW5jdGlvbnMgLSB0aG9zZSBhcmUgbGVmdCB1cCB0byBoaWdoZXItbGV2ZWwgbGlicmFyaWVzCisgKiBiYXNlZCBvbiBmcmFtZXdvcmtzIHN1Y2ggYXMgR0xpYiwgUXQsIFB5dGhvbiwgTW9ubywgSmF2YSwKKyAqIGV0Yy4gVGhlc2UgaGlnaGVyLWxldmVsIGxpYnJhcmllcyAob2Z0ZW4gY2FsbGVkICJELUJ1cyBiaW5kaW5ncyIpCisgKiBoYXZlIGZlYXR1cmVzIHN1Y2ggYXMgb2JqZWN0IHN5c3RlbXMgYW5kIG1haW4gbG9vcHMgdGhhdCBhbGxvdyBhCisgKiA8ZW0+bXVjaDwvZW0+IG1vcmUgY29udmVuaWVudCBBUEkuCisgKiAKKyAqIFRoZSBsb3ctbGV2ZWwgQVBJIGFsc28gY29udGFpbnMgcGxlbnR5IG9mIGNsdXR0ZXIgdG8gc3VwcG9ydAorICogaW50ZWdyYXRpb24gd2l0aCBhcmJpdHJhcnkgb2JqZWN0IHN5c3RlbXMsIGxhbmd1YWdlcywgbWFpbiBsb29wcywKKyAqIGFuZCBzbyBmb3J0aC4gVGhlc2UgZmVhdHVyZXMgYWRkIGEgbG90IG9mIG5vaXNlIHRvIHRoZSBBUEkgdGhhdCB5b3UKKyAqIHByb2JhYmx5IGRvbid0IGNhcmUgYWJvdXQgdW5sZXNzIHlvdSdyZSBjb2RpbmcgYSBiaW5kaW5nLgorICoKKyAqIFRoaXMgbWFudWFsIGFsc28gY29udGFpbnMgZG9jcyBmb3IgQHJlZiBEQnVzSW50ZXJuYWxzICJELUJ1cyBpbnRlcm5hbHMiLAorICogc28geW91IGNhbiB1c2UgaXQgdG8gZ2V0IG9yaWVudGVkIHRvIHRoZSBELUJ1cyBzb3VyY2UgY29kZSBpZiB5b3UncmUKKyAqIGludGVyZXN0ZWQgaW4gcGF0Y2hpbmcgdGhlIGNvZGUuIFlvdSBzaG91bGQgYWxzbyByZWFkIHRoZQorICogZmlsZSBDT05UUklCVVRJTkcubWQgd2hpY2ggY29tZXMgd2l0aCB0aGUgc291cmNlIGNvZGUgaWYgeW91IHBsYW4gdG8KKyAqIGNvbnRyaWJ1dGUgdG8gRC1CdXMuCisgKgorICogQXMgeW91IHJlYWQgdGhlIGNvZGUsIHlvdSBjYW4gaWRlbnRpZnkgaW50ZXJuYWwgRC1CdXMgZnVuY3Rpb25zCisgKiBiZWNhdXNlIHRoZXkgc3RhcnQgd2l0aCBhbiB1bmRlcnNjb3JlICgnXycpIGNoYXJhY3Rlci4gQWxzbywgYW55CisgKiBpZGVudGlmaWVyIG9yIG1hY3JvIHRoYXQgbGFja3MgYSBEQnVzLCBkYnVzXywgb3IgREJVU18gbmFtZXBhY2UKKyAqIHByZWZpeCBpcyBpbnRlcm5hbCwgd2l0aCBhIGNvdXBsZSBvZiBleGNlcHRpb25zIHN1Y2ggYXMgI05VTEwsCisgKiAjVFJVRSwgYW5kICNGQUxTRS4KKyAqLworCisjZW5kaWYgLyogREJVU19IICovCmRpZmYgLS1naXQgYS9kYnVzL3ZlcnNpb25pbmZvLnJjLmluIGIvZGJ1cy92ZXJzaW9uaW5mby5yYy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWYyYmVlCi0tLSAvZGV2L251bGwKKysrIGIvZGJ1cy92ZXJzaW9uaW5mby5yYy5pbgpAQCAtMCwwICsxLDU0IEBACisvKiB2ZXJzaW9uaW5mby5yYy5pbiAtIGZvciBkYnVzCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgZzEwIENvZGUgR21iSAorICogCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0aGUgYXV0aG9yIGdpdmVzCisgKiB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQgZXZlbiB0aGUKKyAqIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisgCisvKiBUaGlzIGZpbGUgaXMgcHJvY2Vzc2VkIGJ5IGNvbmZpZ3VyZSB0byBjcmVhdGUgdmVyc2lvbmluZm8ucmMgKi8KKworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworVlNfVkVSU0lPTl9JTkZPIFZFUlNJT05JTkZPCisgRklMRVZFUlNJT04gQEJVSUxEX0ZJTEVWRVJTSU9OQAorIFBST0RVQ1RWRVJTSU9OIEBCVUlMRF9GSUxFVkVSU0lPTkAKKyBGSUxFRkxBR1NNQVNLIDB4M2ZMCisjaWZkZWYgX0RFQlVHCisgRklMRUZMQUdTIFZTX0ZGX0RFQlVHCisjZWxzZQorIEZJTEVGTEFHUyAweDBMCisjZW5kaWYKKyBGSUxFT1MgVk9TX19XSU5ET1dTMzIKKyBGSUxFVFlQRSBWRlRfRExMCisgRklMRVNVQlRZUEUgMHgwTAorQkVHSU4KKyAgICBCTE9DSyAiU3RyaW5nRmlsZUluZm8iCisgICAgQkVHSU4KKyAgICAgICAgLyogc3RyaW5nIG5lZWQgdG8gbWF0Y2ggY29uY2F0ZWQgaGV4IHZhbHVlcyBpbiAnVmFyRmlsZUluZm8nIGJsb2NrICovCisgICAgICAgIEJMT0NLICIwNDA5MDRlNCIKKyAgICAgICAgQkVHSU4KKyAgICAgICAgICAgIFZBTFVFICJDb21tZW50cyIsICJQcm92aWRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSA+PSAyLjAgb3IgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xXDAiCisgICAgICAgICAgICBWQUxVRSAiQ29tcGFueU5hbWUiLCAiZnJlZWRlc2t0b3Aub3JnXDAiCisgICAgICAgICAgICBWQUxVRSAiRmlsZURlc2NyaXB0aW9uIiwgImRidXMgLSBGcmVlRGVza3RvcCBtZXNzYWdlIGJ1cyBzeXN0ZW1cMCIKKyAgICAgICAgICAgIFZBTFVFICJGaWxlVmVyc2lvbiIsICJAREJVU19WRVJTSU9OQFwwIgorICAgICAgICAgICAgVkFMVUUgIkludGVybmFsTmFtZSIsICJsaWJkYnVzLTEtM1wwIgorICAgICAgICAgICAgVkFMVUUgIkxlZ2FsQ29weXJpZ2h0IiwgIkNvcHlyaWdodCCpIDE5OTQtMjAxNyBkYnVzIGNvbnRyaWJ1dG9ycywgc2VlIGRidXMgc291cmNlIGNvZGUgZm9yIGRldGFpbHNcMCIKKyAgICAgICAgICAgIFZBTFVFICJMZWdhbFRyYWRlbWFya3MiLCAiXDAiCisgICAgICAgICAgICBWQUxVRSAiT3JpZ2luYWxGaWxlbmFtZSIsICJsaWJkYnVzLTEtMy5kbGxcMCIKKyAgICAgICAgICAgIFZBTFVFICJQcm9kdWN0TmFtZSIsICJkYnVzXDAiCisgICAgICAgICAgICBWQUxVRSAiUHJvZHVjdFZlcnNpb24iLCAiQERCVVNfVkVSU0lPTkBcMCIKKyAgICAgICAgICAgIFZBTFVFICJTcGVjaWFsQnVpbGQiLCAiQEJVSUxEX1RJTUVTVEFNUEBcMCIKKyAgICAgICAgRU5ECisgICAgRU5ECisgICAgQkxPQ0sgIlZhckZpbGVJbmZvIgorICAgIEJFR0lOCisgICAgICAgIC8qIHN1cHBvcnRzIEVuZ2xpc2ggbGFuZ3VhZ2UgKDB4NDA5KSBpbiB0aGUgV2luZG93cyBBTlNJIGNvZGVwYWdlICgxMjUyKS4gKi8KKyAgICAgICAgVkFMVUUgIlRyYW5zbGF0aW9uIiwgMHg0MDksIDEyNTIKKyAgICBFTkQKK0VORAorCmRpZmYgLS1naXQgYS9kb2MvLmdpdGlnbm9yZSBiL2RvYy8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiYzgyODYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvLmdpdGlnbm9yZQpAQCAtMCwwICsxLDMwIEBACisuZGVwcworLmxpYnMKK01ha2VmaWxlCitNYWtlZmlsZS5pbgorKi4xCisqLjEueG1sCisqLjEuaHRtbAorKi5sbworKi5sYQorKi5vCithcGkKK2RidXMuZGV2aGVscAorL2RidXMuZGV2aGVscDIKK2RidXMtc3BlY2lmaWNhdGlvbi5odG1sCitkYnVzLXRlc3QtcGxhbi5odG1sCitkYnVzLXR1dG9yaWFsLmh0bWwKK2RidXMtZmFxLmh0bWwKK2RidXMtZG9jcworZGJ1cy1kb2NzLnRhci5negorZG94eWdlbi5zdGFtcAorZGJ1cy1hcGktZGVzaWduLnBhZ2UKK2RidXMtYXBpLWRlc2lnbi5odG1sCisvaGlnaGxpZ2h0LnBhY2suanMKK2pxdWVyeS5qcworanF1ZXJ5LnN5bnRheC5icnVzaC5odG1sLmpzCitqcXVlcnkuc3ludGF4LmNvcmUuanMKK2pxdWVyeS5zeW50YXguanMKK2pxdWVyeS5zeW50YXgubGF5b3V0LnllbHAuanMKK3llbHAuanMKK0MuY3NzCmRpZmYgLS1naXQgYS9kb2MvTWFrZWZpbGUuYW0gYi9kb2MvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdkZmE5YQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDIwOCBAQAorYXBpZGlyID0gQGh0bWxkaXJAL2FwaQorCittYW5fcGFnZXMgPSBcCisJZGJ1cy1jbGVhbnVwLXNvY2tldHMuMSBcCisJZGJ1cy1kYWVtb24uMSBcCisJZGJ1cy1sYXVuY2guMSBcCisJZGJ1cy1tb25pdG9yLjEgXAorCWRidXMtcnVuLXNlc3Npb24uMSBcCisJZGJ1cy1zZW5kLjEgXAorCWRidXMtdGVzdC10b29sLjEgXAorCWRidXMtdXBkYXRlLWFjdGl2YXRpb24tZW52aXJvbm1lbnQuMSBcCisJZGJ1cy11dWlkZ2VuLjEgXAorCSQoTlVMTCkKKworTUFOX1hNTF9GSUxFUyA9ICQocGF0c3Vic3QgJS4xLCUuMS54bWwsJChtYW5fcGFnZXMpKQorCitpZiBEQlVTX1hNTF9ET0NTX0VOQUJMRUQKK21hbjFfTUFOUyA9ICQobWFuX3BhZ2VzKQorZW5kaWYKKworTUFOX0hUTUxfRklMRVMgPSAkKHBhdHN1YnN0ICUuMSwlLjEuaHRtbCwkKG1hbl9wYWdlcykpCisKK2R0ZGRpciA9ICQoZGF0YWRpcikveG1sL2RidXMtMQorZGlzdF9kdGRfREFUQSA9IFwKKwlidXNjb25maWcuZHRkIFwKKwlpbnRyb3NwZWN0LmR0ZAorCitkaXN0X2RvY19EQVRBID0gc3lzdGVtLWFjdGl2YXRpb24udHh0CisKKyMgdXBsb2FkZWQgYW5kIGRpc3RyaWJ1dGVkLCBidXQgbm90IGluc3RhbGxlZAorU1RBVElDX0RPQ1MgPSBcCisJZGJ1cy1mYXEueG1sIFwKKwlkYnVzLXNwZWNpZmljYXRpb24ueG1sIFwKKwlkYnVzLXRlc3QtcGxhbi54bWwgXAorCWRidXMtdHV0b3JpYWwueG1sIFwKKwlkYnVzLWFwaS1kZXNpZ24uZHVjayBcCisJZGNvcC1ob3d0by50eHQgXAorCWludHJvc3BlY3QueHNsCisKK0VYVFJBX0RJU1QgPSBcCisJZmlsZS1ib2lsZXJwbGF0ZS5jIFwKKwlkb3h5Z2VuX3RvX2RldmhlbHAueHNsIFwKKwkkKFNUQVRJQ19ET0NTKQorCitodG1sX0RBVEEgPQorCitkaXN0X2h0bWxfREFUQSA9CisKKyMgZGlhZ3JhbS5wbmcvZGlhZ3JhbS5zdmcgYXJlbid0IHJlYWxseSBIVE1MLCBidXQgbXVzdCBnbyBpbiB0aGUgc2FtZQorIyBkaXJlY3RvcnkgYXMgdGhlIEhUTUwgdG8gYXZvaWQgYnJva2VuIGxpbmtzCitTVEFUSUNfSFRNTCA9IFwKKwlkaWFncmFtLnBuZyBcCisJZGlhZ3JhbS5zdmcgXAorCSQoTlVMTCkKKworIyBTdGF0aWMgSFRNTCBoZWxwZXIgZmlsZXMgZ2VuZXJhdGVkIGJ5IHllbHAtYnVpbGQuCitZRUxQX1NUQVRJQ19IVE1MID0gXAorCXllbHAuanMgXAorCUMuY3NzIFwKKwloaWdobGlnaHQucGFjay5qcyBcCisJanF1ZXJ5LmpzIFwKKwlqcXVlcnkuc3ludGF4LmpzIFwKKwlqcXVlcnkuc3ludGF4LmJydXNoLmh0bWwuanMgXAorCWpxdWVyeS5zeW50YXguY29yZS5qcyBcCisJanF1ZXJ5LnN5bnRheC5sYXlvdXQueWVscC5qcyBcCisJJChOVUxMKQorCitkaXN0X2h0bWxfREFUQSArPSAkKFNUQVRJQ19IVE1MKQorCisjIENvbnRlbnQgSFRNTCBmaWxlcyBnZW5lcmF0ZWQgYnkgeWVscC1idWlsZC4KK1lFTFBfSFRNTCA9IFwKKwlkYnVzLWFwaS1kZXNpZ24uaHRtbCBcCisJJChOVUxMKQorCitYTUxUT19IVE1MID0JCQkJCVwKKwlkYnVzLWZhcS5odG1sCQkJCVwKKwlkYnVzLXNwZWNpZmljYXRpb24uaHRtbAkJCVwKKwlkYnVzLXRlc3QtcGxhbi5odG1sCQkJXAorCWRidXMtdHV0b3JpYWwuaHRtbAkJCVwKKwkkKE1BTl9IVE1MX0ZJTEVTKQkJCVwKKwkkKE5VTEwpCisKK2lmIERCVVNfWE1MX0RPQ1NfRU5BQkxFRAoraHRtbF9EQVRBICs9ICQoWE1MVE9fSFRNTCkKKworJS5odG1sOiAlLnhtbAorCSQoWE1MVE8pIGh0bWwtbm9jaHVua3MgJDwKKworJS4xOiAlLjEueG1sCisJJChYTUxUTykgbWFuICQ8CitlbmRpZgorCitpZiBEQlVTX0RPWFlHRU5fRE9DU19FTkFCTEVECithbGwtbG9jYWw6OiBkb3h5Z2VuLnN0YW1wCisKK2RveHlnZW4uc3RhbXA6ICQod2lsZGNhcmQgJCh0b3Bfc3JjZGlyKS9kYnVzLyouW2NoXSkKKwkkKEFNX1ZfR0VOKWNkICQodG9wX2J1aWxkZGlyKSAmJiBkb3h5Z2VuIERveHlmaWxlCisJQHRvdWNoICRACisKK2lmIERCVVNfSEFWRV9YU0xUUFJPQworaHRtbF9EQVRBICs9IGRidXMuZGV2aGVscDIKKworZGJ1cy5kZXZoZWxwMjogJChzcmNkaXIpL2RveHlnZW5fdG9fZGV2aGVscC54c2wgZG94eWdlbi5zdGFtcAorCSQoWFNMVFBST0MpIC1vICRAICQ8IGFwaS94bWwvaW5kZXgueG1sCitlbmRpZgorCitpZiBEQlVTX0RVQ0tUWVBFX0RPQ1NfRU5BQkxFRAoraHRtbF9EQVRBICs9ICQoWUVMUF9IVE1MKQorCislLnBhZ2U6ICUuZHVjaworCSQoRFVDS1RZUEUpIC1vICRAICQ8CislLmh0bWw6ICUucGFnZQorCSQoWUVMUF9CVUlMRCkgaHRtbCAkPAorJChZRUxQX1NUQVRJQ19IVE1MKTogJChZRUxQX0hUTUwpCitlbmRpZgorCisjIHRoaXMgYXNzdW1lcyBDUkVBVEVfU1VCRElSUyBpc24ndCBzZXQgdG8gWUVTIGluIERveHlmaWxlCisjICh3aGljaCBpdCBpc24ndCBjdXJyZW50bHkpCitpbnN0YWxsLWRhdGEtbG9jYWw6OiBkb3h5Z2VuLnN0YW1wCisJJChNS0RJUl9QKSAkKERFU1RESVIpJChhcGlkaXIpCisJJChJTlNUQUxMX0RBVEEpIGFwaS9odG1sLyogJChERVNURElSKSQoYXBpZGlyKQoraWYgREJVU19EVUNLVFlQRV9ET0NTX0VOQUJMRUQKKwkkKEFNX1ZfYXQpZm9yIHggaW4gJChZRUxQX1NUQVRJQ19IVE1MKTsgZG8gXAorCQlpZiB0ZXN0IC1lICIkJHgiOyB0aGVuIFwKKwkJCSQoSU5TVEFMTF9EQVRBKSAiJCR4IiAkKERFU1RESVIpJChodG1sZGlyKTsgXAorCQlmaTsgXAorCWRvbmUKK2VuZGlmCisKK3VuaW5zdGFsbC1sb2NhbDo6CisJcm0gLWYgJChERVNURElSKSQoYXBpZGlyKS8qLmh0bWwKKwlybSAtZiAkKERFU1RESVIpJChhcGlkaXIpLyoucG5nCisJcm0gLWYgJChERVNURElSKSQoYXBpZGlyKS8qLmNzcworCXJtIC1mICQoREVTVERJUikkKGFwaWRpcikvKi5qcworCXJtIC1mICQoREVTVERJUikkKGh0bWxkaXIpLyouY3NzCisJcm0gLWYgJChERVNURElSKSQoaHRtbGRpcikvKi5qcworCXJtIC1mICQoREVTVERJUikkKGh0bWxkaXIpLyouaHRtbAorCXJtIC1mICQoREVTVERJUikkKGRvY2RpcikvKi50eHQKKwlybSAtZiAkKERFU1RESVIpJChodG1sZGlyKS8qLnBuZworCXJtIC1mICQoREVTVERJUikkKGh0bWxkaXIpLyouc3ZnCisJcm1kaXIgLS1pZ25vcmUtZmFpbC1vbi1ub24tZW1wdHkgJChERVNURElSKSQoYXBpZGlyKSB8fCBcCisJCXJtZGlyICQoREVTVERJUikkKGFwaWRpcikKK2VuZGlmCisKK2lmIERCVVNfQ0FOX1VQTE9BRF9ET0NTCitCT05VU19GSUxFUyA9IFwKKwkkKHRvcF9zcmNkaXIpL1JFQURNRSBcCisJJCh0b3Bfc3JjZGlyKS9DT05UUklCVVRJTkcubWQgXAorCSQodG9wX3NyY2RpcikvQVVUSE9SUyBcCisJJCh0b3Bfc3JjZGlyKS9ORVdTIFwKKwkkKHRvcF9zcmNkaXIpL0NPUFlJTkcgXAorCSQodG9wX3NyY2RpcikvQ2hhbmdlTG9nCisKK2RidXMtZG9jczogJChTVEFUSUNfRE9DUykgJChkaXN0X2R0ZF9EQVRBKSAkKE1BTl9YTUxfRklMRVMpICQoZGlzdF9kb2NfREFUQSkgJChkaXN0X2h0bWxfREFUQSkgJChNQU5fSFRNTF9GSUxFUykgJChCT05VU19GSUxFUykgZG94eWdlbi5zdGFtcCAkKFhNTFRPX0hUTUwpICQoWUVMUF9IVE1MKQorCSQoQU1fVl9hdClybSAtcmYgJEAgJEAudG1wCisJJChBTV9WX0dFTikkKE1LRElSX1ApICRALnRtcC9hcGkKKwkkKEFNX1ZfYXQpY2QgJChzcmNkaXIpICYmIGNwICQoU1RBVElDX0RPQ1MpIEBhYnNfYnVpbGRkaXJALyRALnRtcAorCSQoQU1fVl9hdCljZCAkKHNyY2RpcikgJiYgY3AgJChkaXN0X2R0ZF9EQVRBKSBAYWJzX2J1aWxkZGlyQC8kQC50bXAKKwkkKEFNX1ZfYXQpY2QgJChzcmNkaXIpICYmIGNwICQoZGlzdF9kb2NfREFUQSkgQGFic19idWlsZGRpckAvJEAudG1wCisJJChBTV9WX2F0KWNkICQoc3JjZGlyKSAmJiBjcCAkKFNUQVRJQ19IVE1MKSBAYWJzX2J1aWxkZGlyQC8kQC50bXAKKwkkKEFNX1ZfYXQpY3AgJChYTUxUT19IVE1MKSBAYWJzX2J1aWxkZGlyQC8kQC50bXAKKwkkKEFNX1ZfYXQpY3AgJChZRUxQX0hUTUwpIEBhYnNfYnVpbGRkaXJALyRALnRtcAorCSQoQU1fVl9hdClmb3IgeCBpbiAkKFlFTFBfU1RBVElDX0hUTUwpOyBkbyBcCisJCWlmIHRlc3QgLWUgIiQkeCI7IHRoZW4gXAorCQkJY3AgIiQkeCIgQGFic19idWlsZGRpckAvJEAudG1wOyBcCisJCWZpOyBcCisJZG9uZQorCSQoQU1fVl9hdCljcCAkKE1BTl9IVE1MX0ZJTEVTKSBAYWJzX2J1aWxkZGlyQC8kQC50bXAKKwkkKEFNX1ZfYXQpY3AgJChNQU5fWE1MX0ZJTEVTKSBAYWJzX2J1aWxkZGlyQC8kQC50bXAKKwkkKEFNX1ZfYXQpY3AgJChCT05VU19GSUxFUykgQGFic19idWlsZGRpckAvJEAudG1wCisJJChBTV9WX2F0KWNwIC1yIGFwaS9odG1sIEBhYnNfYnVpbGRkaXJALyRALnRtcC9hcGkKKwkkKEFNX1ZfYXQpbXYgJEAudG1wICRACisKK2RidXMtZG9jcy50YXIuZ3o6IGRidXMtZG9jcworCSQoQU1fVl9HRU4pdGFyIGN6ZiAkQCAkPAorCitET0NfU0VSVkVSID0gZGJ1cy5mcmVlZGVza3RvcC5vcmcKK0RPQ19XV1dfRElSID0gL3Nydi9kYnVzLmZyZWVkZXNrdG9wLm9yZy93d3cKKworU1BFQ0lGSUNBVElPTl9TRVJWRVIgPSBzcGVjaWZpY2F0aW9ucy5mcmVlZGVza3RvcC5vcmcKK1NQRUNJRklDQVRJT05fUEFUSCA9IC9zcnYvc3BlY2lmaWNhdGlvbnMuZnJlZWRlc2t0b3Aub3JnL3d3dy9kYnVzLzEuMAorCittYWludGFpbmVyLXVwbG9hZC1kb2NzOiBkYnVzLWRvY3MudGFyLmd6IGRidXMtZG9jcworCXNjcCBkYnVzLWRvY3MudGFyLmd6ICQoRE9DX1NFUlZFUik6JChET0NfV1dXX0RJUikvCisJcnN5bmMgLXJwdnpQIC0tY2htb2Q9RGcrcyx1Zytyd1gsbz1yWCBcCisJCWRidXMtZG9jcy8gJChET0NfU0VSVkVSKTokKERPQ19XV1dfRElSKS9kb2MvCisJY2QgJChzcmNkaXIpICYmIHNjcCAtcCAkKGRpc3RfZHRkX0RBVEEpICQoU1BFQ0lGSUNBVElPTl9TRVJWRVIpOiQoU1BFQ0lGSUNBVElPTl9QQVRIKS8KK2Vsc2UKK21haW50YWluZXItdXBsb2FkLWRvY3M6CisJQGVjaG8gIkNhbid0IHVwbG9hZCBkb2N1bWVudGF0aW9uISBSZS1ydW4gY29uZmlndXJlIHdpdGgiCisJQGVjaG8gIiAgLS1lbmFibGUtZG94eWdlbi1kb2NzIC0tZW5hYmxlLXhtbC1kb2NzIC0tZW5hYmxlLWR1Y2t0eXBlLWRvY3MiCisJQGZhbHNlCitlbmRpZgorCitDTEVBTkZJTEVTID0gXAorCSQobWFuMV9NQU5TKSBcCisJJChNQU5fWE1MX0ZJTEVTKSBcCisJJChYTUxUT19IVE1MKSBcCisJJChZRUxQX0hUTUwpIFwKKwkkKFlFTFBfU1RBVElDX0hUTUwpIFwKKwkkKE5VTEwpCisKK2NsZWFuLWxvY2FsOgorCXJtIC1mICQoaHRtbF9EQVRBKQorCXJtIC1yZiBhcGkKKwlybSAtcmYgZGJ1cy1kb2NzIGRidXMtZG9jcy50bXAKKwlybSAtZiAqLjEuaHRtbAorCXJtIC1mIGRveHlnZW4uc3RhbXAKZGlmZiAtLWdpdCBhL2RvYy9UT0RPIGIvZG9jL1RPRE8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI0ZTc5NwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9UT0RPCkBAIC0wLDAgKzEsMTU1IEBACitJbXBvcnRhbnQgZm9yIDEuMgorPT09CisKKyAtIFN5c3RlbSBidXMgYWN0aXZhdGlvbgorCisgLSBXaW5kb3dzIHBvcnQKKworSW1wb3J0YW50IGZvciAxLjAgR0xpYiBCaW5kaW5ncworPT09CisKKyAtIFRlc3QgcG9pbnQtdG8tcG9pbnQgbW9kZQorCisgLSBBZGQgc3VwcG9ydCBmb3IgZ2V0dGluZyBzZW5kZXIKKworIC0gZm9ybWF0X3ZlcnNpb24gaW4gdGhlIG9iamVjdCBpbmZvIGRvZXNuJ3QgbG9vayBsaWtlIGl0J3MgaGFuZGxlZCBjb3JyZWN0bHkuIFRoZSBjcmVhdG9yCisgICBvZiB0aGUgb2JqZWN0IGluZm8gc2hvdWxkIHNwZWNpZnkgc29tZSBmaXhlZCBudW1iZXIgcGVyIHN0cnVjdCB2ZXJzaW9uOyB0aGUgbGlicmFyeQorICAgc2hvdWxkIGhhbmRsZSBvbmx5IHNwZWNpZmljIG51bWJlcnMgaXQga25vd3MgYWJvdXQuIFRoZXJlJ3Mgbm8gYXNzdW1wdGlvbiB0aGF0IGFsbCAKKyAgIG51bWJlcnMgPj0gdGhlIGdpdmVuIG9uZSBhcmUgY29tcGF0aWJsZS4gVGhlIGlkZWEgaXMgdGhhdCBuZXcgdmVyc2lvbnMgb2YgdGhlIGxpYgorICAgY2FuIG9mZmVyIHRvdGFsbHkgZGlmZmVyZW50IG9iamVjdCBpbmZvIHN0cnVjdHMsIGJ1dCBvbGQgdmVyc2lvbnMKKyAgIGtlZXAgd29ya2luZy4KKworSW1wb3J0YW50IGZvciAxLjAgUHl0aG9uIGJpbmRpbmdzCis9PT0KKworIC0gSGFtbWVyIGRvd24gQVBJCisKKyAtIEZpeCByZW1vdmluZyBvZiBzaWduYWxzIGZyb20gdGhlIG1hdGNoIHRyZWUKKworIC0gRml4IHJlZmNvdW50aW5nIGFuZCB1c2VyZGF0YSBsaWZlY3ljbGVzCisKKyAtIFdyaXRlIGEgZ2VuZXJpYyBtYWlubG9vcAorCitNaWdodCBhcyBXZWxsIGZvciAxLjAKKz09PQorCisgLSBwcm90b2NvbCB2ZXJzaW9uIGluIGVhY2ggbWVzc2FnZSBpcyBwcmV0dHkgc2lsbHkKKworQ2FuIEJlIFBvc3QgMS4wCis9PT0KKworIC0gcmV2YW1wIGRidXMtbGF1bmNoIGEgYml0LAorICAgc2VlIGh0dHA6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvYXJjaGl2ZXMvZGJ1cy8yMDA2LU9jdG9iZXIvMDA1OTA2Lmh0bWwKKyAgIGZvciBzb21lIHRob3VnaHRzLgorCisgLSBjbGVhbiB1cCB0aGUgY3JlZHMgaXNzdWUgb24gKkJTRCdzIGluIGRidXMvZGJ1cy1zeXNkZXBzLXVuaXguYy4KKyAgIFRoZXkgc2hvdWxkIHdvcmsgYXMgaXMgYnV0IHdlIG5lZWQgdG8gcmVhcmFuZ2UgaXQgdG8gbWFrZSBpdAorICAgY2xlYXJlciB3aGljaCBtZXRob2QgaXMgYmVpbmcgdXNlZC4gIGNvbmZpZ3VyZS5pbiBzaG91bGQKKyAgIGJlIGZpeGVkIHVwIHRvIG1ha2UgdGhhdCBkZWNpdGlvbi4KKworIC0gX2RidXNfY29ubmVjdGlvbl91bnJlZl91bmxvY2tlZCgpIGlzIGVzc2VudGlhbGx5IGFsd2F5cyBicm9rZW4gYmVjYXVzZQorICAgdGhlIGNvbm5lY3Rpb24gZmluYWxpemVyIGNhbGxzIG5vbi11bmxvY2tlZCBmdW5jdGlvbnMuIE9uZSBmaXggaXMgdG8gbWFrZSAKKyAgIHRoZSBmaW5hbGl6ZXIgcnVuIHdpdGggdGhlIGxvY2sgaGVsZCwgYnV0IHNpbmNlIGl0IGNhbGxzIG91dCB0byB0aGUgYXBwIHRoYXQgbWF5IAorICAgYmUgcHJldHR5IGJyb2tlbi4gTW9yZSBsaWtlbHkgYWxsIHRoZSB1c2VzIG9mIHVucmVmX3VubG9ja2VkIGFyZSBqdXN0IHdyb25nLgorCisgLSBpZiB0aGUgR1VJRCBpcyBvYnRhaW5lZCBvbmx5IGR1cmluZyBhdXRoZW50aWNhdGlvbiwgbm90IGluIHRoZSBhZGRyZXNzLCAKKyAgIHdlIGNvdWxkIHN0aWxsIHNoYXJlIHRoZSBjb25uZWN0aW9uCisKKyAtIEFsbG93IGEgZGJ1c19nX3Byb3h5X3RvX3N0cmluZygpL2dfb2JqZWN0X3RvX3N0cmluZygpIHRoYXQKKyAgIHdvdWxkIGNvbnZlcnQgdGhlIHByb3h5IHRvIGFuICJJT1IiIGFuZCBkYnVzX2dfcHJveHlfZnJvbV9zdHJpbmcoKQorICAgdGhhdCB3b3VsZCBkZWNvZGU7IHVzaW5nIHRoZXNlLCBkYnVzLWdsaWIgdXNlcnMgY291bGQgYXZvaWQKKyAgIERCdXNDb25uZWN0aW9uIGVudGlyZWx5LiBPZiBjb3Vyc2UgdGhlIHNhbWUgYXBwbGllcyB0byBvdGhlciBraW5kcworICAgb2YgYmluZGluZy4gVGhpcyB3b3VsZCB1c2UgZGJ1c19jb25uZWN0aW9uX29wZW4oKSdzIGNvbm5lY3Rpb24tc2hhcmluZworICAgZmVhdHVyZSB0byBhdm9pZCBtYXNzaXZlIHByb2xpZmVyYXRpb24gb2YgY29ubmVjdGlvbnMuCisKKyAtIERCdXNXYXRjaExpc3QvVGltZW91dExpc3QgZHVwbGljYXRlIGEgbG90IG9mIGNvZGUsIGFzIGRvCisgICBwcm90ZWN0ZWRfY2hhbmdlX3dhdGNoL3Byb3RlY3RlZF9jaGFuZ2VfdGltZW91dCBpbiBkYnVzLWNvbm5lY3Rpb24uYworICAgYW5kIGRidXMtc2VydmVyLmMuIFRoaXMgY291bGQgYWxsIGJlIG1vcHBlZCB1cCwgY3V0LWFuZC1wYXN0ZSAKKyAgIGZpeGVkLCBjb2RlIHNpemUgcmVkdWNlZC4KKworIC0gY2hhbmdlIC5zZXJ2aWNlIGZpbGVzIHRvIGFsbG93IE5hbWVzPWxpc3QgaW4gYWRkaXRpb24gdG8gTmFtZT1zdHJpbmcKKworIC0gVGhlIG1lc3NhZ2UgYnVzIGludGVybmFsIGNvZGUgc3RpbGwgc2F5cyAic2VydmljZSIgZm9yIAorICAgIm5hbWUiLCAiYmFzZSBzZXJ2aWNlIiBmb3IgInVuaXF1ZSBuYW1lIiwgImFjdGl2YXRlIiBmb3IgCisgICAic3RhcnQiOyB3b3VsZCBiZSBuaWNlIHRvIGNsZWFuIHVwLgorCisgLSBQcm9wZXJ0eSBsaXN0IGZlYXR1cmUgb24gbWVzc2FnZSBidXMgKGxpc3Qgb2YgcHJvcGVydGllcyBhc3NvY2lhdGVkIAorICAgd2l0aCBhIGNvbm5lY3Rpb24pLiBNYXkgYWxzbyBpbmNsdWRlIG1lc3NhZ2UgbWF0Y2hpbmcgcnVsZXMgCisgICB0aGF0IGludm9sdmUgdGhlIHByb3BlcnRpZXMgb2YgdGhlIHNvdXJjZSBvciBkZXN0aW5hdGlvbgorICAgY29ubmVjdGlvbi4KKworIC0gRGlzY29ubmVjdGluZyB0aGUgcmVtb3RlIGVuZCBvbiBpbnZhbGlkIFVURi04IGlzIHByb2JhYmx5IG5vdCBhIGdvb2QgCisgICBpZGVhLiBUaGUgZGVmaW5pdGlvbiBvZiAidmFsaWQiIGlzIHNsaWdodGx5IGZ1enp5LiBJIHRoaW5rIGl0IG1pZ2h0IAorICAgYmUgYmV0dGVyIHRvIGp1c3Qgc2lsZW50bHkgImZpeCIgdGhlIFVURi04LCBvciBwZXJoYXBzIHJldHVybiBhbiBlcnJvci4KKworIC0gYnVpbGQgYW5kIGluc3RhbGwgdGhlIERveHlnZW4gbWFudWFsIGluIE1ha2VmaWxlIHdoZW4gLS1lbmFibGUtZG9jcworCisgLSBpZiB5b3Ugc2VuZCB0aGUgc2FtZSBtZXNzYWdlIHRvIG11bHRpcGxlIGNvbm5lY3Rpb25zLCB0aGUgc2VyaWFsIG51bWJlciAKKyAgIHdpbGwgb25seSBiZSByaWdodCBmb3Igb25lIG9mIHRoZW0uIFByb2JhYmx5IG5lZWQgdG8ganVzdCB3cml0ZSgpIHRoZSBzZXJpYWwgCisgICBudW1iZXIsIHJhdGhlciB0aGFuIHB1dHRpbmcgaXQgaW4gdGhlIERCdXNNZXNzYWdlLCBvciBzb21ldGhpbmcuCisKKyAtIHBlcmhhcHMgdGhlIGJ1cyBkcml2ZXIgc2hvdWxkIGhhdmUgcHJvcGVydGllcyB0aGF0IHJlZmxlY3QgYXR0cmlidXRlcworICAgb2YgdGhlIHNlc3Npb24sIHN1Y2ggYXMgaG9zdG5hbWUsIGFyY2hpdGVjdHVyZSwgb3BlcmF0aW5nIHN5c3RlbSwgCisgICBldGMuIENvdWxkIGJlIHVzZWZ1bCBmb3IgY29kZSB0aGF0IHdhbnRzIHRvIHNwZWNpYWwtY2FzZSBiZWhhdmlvciAKKyAgIGZvciBhIHBhcnRpY3VsYXIgaG9zdCBvciBjbGFzcyBvZiBob3N0cywgZm9yIGV4YW1wbGUuCisKKyAtIGN1cnJlbnRseSB0aGUgc2VjdXJpdHkgcG9saWN5IHN0dWZmIGZvciBtZXNzYWdlcyB0by9mcm9tIAorICAgdGhlIGJ1cyBkcml2ZXIgaXMga2luZCBvZiBzdHJhbmdlOyBiYXNpY2FsbHkgaXQncyBoYXJkY29kZWQgdGhhdCAKKyAgIHlvdSBjYW4gYWx3YXlzIHRhbGsgdG8gdGhlIGRyaXZlciwgYnV0IHRoZSBkZWZhdWx0IGNvbmZpZyBmaWxlIAorICAgaGFzIHJ1bGVzIGZvciBpdCBhbnl3YXksIG9yIHNvbWV0aGluZy4gaXQncyBjb25jZXB0dWFsbHkgCisgICBzY3Jld3kgYXQgdGhlIG1vbWVudC4KKworIC0gd2hlbiBtYWtpbmcgYSBtZXRob2QgY2FsbCwgaWYgdGhlIGNhbGwgc2VyaWFsIHdlcmUgZ2xvYmFsbHkgdW5pcXVlLAorICAgd2UgY291bGQgZm9yd2FyZCB0aGUgY2FsbCBzZXJpYWwgYWxvbmcgd2l0aCBhbnkgbWV0aG9kIGNhbGxzIG1hZGUKKyAgIGFzIGEgcmVzdWx0IG9mIHRoZSBmaXJzdCBtZXRob2QgY2FsbCwgYW5kIGFsbG93IHJlZW50cmFuY3kgdGhhdCB3YXMKKyAgIHN0cmljdGx5IHBhcnQgb2YgdGhlIGNhbGwgc3RhY2sgb2Ygc2FpZCBtZXRob2QgY2FsbC4gQnV0IEkgZG9uJ3QKKyAgIHJlYWxseSBzZWUgaG93IHRvIGRvIHRoaXMgd2l0aG91dCBtYWtpbmcgdGhlIHVzZXIgcGFzcyBhcm91bmQgdGhlCisgICBjYWxsIHNlcmlhbCB0byBhbGwgbWV0aG9kIGNhbGxzIGFsbCB0aGUgdGltZSwgb3IgZGlzYWxsb3dpbmcgCisgICBhc3luYyBjYWxscy4KKworICAgSWYgZG9uZSBwb3N0IDEuMCB3aWxsIHByb2JhYmx5IGJlIGFuIG9wdGlvbmFsL3VnbHktQVBJIHR5cGUgCisgICBvZiB0aGluZy4KKworIC0gSSBkb24ndCB3YW50IHRvIGludHJvZHVjZSBEQnVzT2JqZWN0LCBidXQgcmVmY291bnRpbmcgYW5kIG9iamVjdAorICAgZGF0YSBjb3VsZCBzdGlsbCBiZSBmYWN0b3JlZCBvdXQgaW50byBhbiBpbnRlcm5hbCAiYmFzZSBjbGFzcyIgCisgICBwZXJoYXBzLgorCisgLSBLZWVwIGNvbnZlbmllbmNlIHdyYXBwZXJzIGluIHN5bmMgd2l0aCBidXMgbWV0aG9kcworCisgLSBkb2N1bWVudCB0aGUgYXV0aCBwcm90b2NvbCBhcyBhIHNldCBvZiBzdGF0ZXMgYW5kIHRyYW5zaXRpb25zLCBhbmQKKyAgIHRoZW4gcmVpbXBsZW1lbnQgaXQgaW4gdGhvc2UgdGVybXMKKworIC0gcmVjdXJzaXZlIGRpc3BhdGNoLCBzZWUgZGJ1c19jb25uZWN0aW9uX2Rpc3BhdGNoKCkKKworIC0gZG8gd2UgbmVlZCBwZXItZGlzcGxheSBhY3RpdmF0aW9uOyBpZiBzbyBJJ2QgbGlrZSB0byBkbyB0aGlzIGJ5IHNldHRpbmcgYQorICAgImRpc3BsYXkgSUQiIHByb3BlcnR5IG9uIHNjcmVlbiAwLCB3aXRoIGEgR1VJRCwgYW5kIGtleWluZyBhY3RpdmF0aW9uIGJ5IAorICAgc2FpZCBHVUlELiBPdGhlcndpc2UgeW91IGdldCBhbGwga2luZHMgb2YgdW5yb2J1c3QKKyAgIHN0cmluZy9ob3N0bmFtZS1iYXNlZCBtZXNzLiBwZXItc2NyZWVuIGlzIHRoZW4gZG9uZSBieSBhcHBlbmRpbmcgc2NyZWVuIG51bWJlcgorICAgdG8gdGhlIGRpc3BsYXkuIElmIGRpc3BsYXlzIGhhdmUgYSBkZXRlcm1pbmlzdGljIElEIGxpa2UgdGhpcywgeW91IGNhbiAKKyAgIGRvIHBlci1kaXNwbGF5IGJ5IHNpbXBseSBpbmNsdWRpbmcgR1VJRCBpbiB0aGUgc2VydmljZSBuYW1lLgorCisgLSBvcHRpbWl6YXRpb24gYW5kIHByb2ZpbGluZyEKKworIC0gTWF0Y2ggcnVsZXMgYXJlbid0IGluIHRoZSBzcGVjIChwcm9iYWJseSBhIGxvdCBvZiBtZXRob2RzIG9uIHRoZSBidXMKKyAgIGFyZSBub3QpCisKKyAtIHRoZSAiYnJlYWsgbG9hZGVyIiBhbmQgdmFsaWQvaW52YWxpZCBtZXNzYWdlIHRlc3RzIGFyZSBhbGwgZGlzYWJsZWQ7CisgICB0aGV5IG5lZWQgdG8gYmUgZml4ZWQgYW5kIHJlLWVuYWJsZWQgd2l0aCB0aGUgbmV3IG1lc3NhZ2UgYXJncyBzdHVmZi4KKyAgIEkgdGhpbmsgSSB3YW50IHRvIGRyb3AgdGhlIC5tZXNzYWdlIGZpbGVzIHRoaW5nIGFuZCBqdXN0IGhhdmUgY29kZQorICAgdGhhdCBnZW5lcmF0ZXMgbWVzc2FnZXMsIG1vcmUgbGlrZSB0aGUgdGVzdHMgZm9yCisgICBkYnVzLW1hcnNoYWwtcmVjdXJzaXZlLmMgKHRoaXMgaXMgbW9zdGx5IGRvbmUgbm93LCBqdXN0IG5lZWRzIHNvbWUKKyAgIGNsZWFudXApCisKKyAtIGp1c3QgYmVmb3JlIDEuMCwgdHJ5IGEgSEFWRV9JTlQ2ND0wIGJ1aWxkIGFuZCBiZSBzdXJlIGl0IHJ1bnMKKworIC0gV2luZG93cyBwb3J0IG5lZWRzIHJlY3Vyc2l2ZSBtdXRleGVzCisKK1Nob3VsZCBCZSBQb3N0IDEuMAorPT09CisKKyAtIGxvb2sgaW50byBzdXBwb3J0aW5nIHRoZSBjb25jZXB0IG9mIGEgImNvbm5lY3Rpb24iIGdlbmVyaWNhbGx5CisgICAod2hhdCBkb2VzIHRoaXMgVE9ETyBpdGVtIG1lYW4/KQorCisgLSB0ZXN0L25hbWUtdGVzdCBzaG91bGQgYmUgbmFtZWQgdGVzdC93aXRoLWJ1cyBvciBzb21ldGhpbmcgbGlrZSB0aGF0CisKKwpkaWZmIC0tZ2l0IGEvZG9jL2J1c2NvbmZpZy5kdGQgYi9kb2MvYnVzY29uZmlnLmR0ZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzVhYzMzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2J1c2NvbmZpZy5kdGQKQEAgLTAsMCArMSw3MCBAQAorPCFFTEVNRU5UIGJ1c2NvbmZpZyAodXNlciB8CisgICAgICAgICAgICAgICAgICAgICB0eXBlIHwKKyAgICAgICAgICAgICAgICAgICAgIGZvcmsgfAorICAgICAgICAgICAgICAgICAgICAga2VlcF91bWFzayB8CisgICAgICAgICAgICAgICAgICAgICBsaXN0ZW4gfCAKKyAgICAgICAgICAgICAgICAgICAgIHBpZGZpbGUgfAorICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZWRpciB8CisgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlZGlyIHwKKyAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VoZWxwZXIgfAorICAgICAgICAgICAgICAgICAgICAgYXV0aCB8CisgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlIHwKKyAgICAgICAgICAgICAgICAgICAgIHBvbGljeSB8CisgICAgICAgICAgICAgICAgICAgICBsaW1pdCB8CisgICAgICAgICAgICAgICAgICAgICBzZWxpbnV4IHwKKyAgICAgICAgICAgICAgICAgICAgIGFwcGFybW9yKSo+CisKKzwhRUxFTUVOVCB1c2VyICgjUENEQVRBKT4KKzwhRUxFTUVOVCBsaXN0ZW4gKCNQQ0RBVEEpPgorPCFFTEVNRU5UIGluY2x1ZGVkaXIgKCNQQ0RBVEEpPgorPCFFTEVNRU5UIHNlcnZpY2VkaXIgKCNQQ0RBVEEpPgorPCFFTEVNRU5UIHNlcnZpY2VoZWxwZXIgKCNQQ0RBVEEpPgorPCFFTEVNRU5UIGF1dGggKCNQQ0RBVEEpPgorPCFFTEVNRU5UIHR5cGUgKCNQQ0RBVEEpPgorPCFFTEVNRU5UIHBpZGZpbGUgKCNQQ0RBVEEpPgorPCFFTEVNRU5UIGZvcmsgRU1QVFk+Cis8IUVMRU1FTlQga2VlcF91bWFzayBFTVBUWT4KKworPCFFTEVNRU5UIGluY2x1ZGUgKCNQQ0RBVEEpPgorPCFBVFRMSVNUIGluY2x1ZGUgCisgICAgICAgICAgaWdub3JlX21pc3NpbmcgKHllc3xubykgIm5vIgorICAgICAgICAgIGlmX3NlbGludXhfZW5hYmxlZCAoeWVzfG5vKSAibm8iCisgICAgICAgICAgc2VsaW51eF9yb290X3JlbGF0aXZlICh5ZXN8bm8pICJubyI+CisKKzwhRUxFTUVOVCBwb2xpY3kgKGFsbG93fGRlbnkpKj4KKzwhQVRUTElTVCBwb2xpY3kgCisgICAgICAgICAgY29udGV4dCAoZGVmYXVsdHxtYW5kYXRvcnkpICNJTVBMSUVECisgICAgICAgICAgdXNlciBDREFUQSAjSU1QTElFRAorICAgICAgICAgIGdyb3VwIENEQVRBICNJTVBMSUVECisgICAgICAgICAgYXRfY29uc29sZSAoeWVzfG5vKSAjSU1QTElFRD4KKworPCFFTEVNRU5UIGFsbG93IEVNUFRZPgorPCFBVFRMSVNUIGFsbG93IAorICAgICAgICAgIHVzZXIgQ0RBVEEgI0lNUExJRUQKKyAgICAgICAgICBzZW5kIENEQVRBICNJTVBMSUVECisgICAgICAgICAgcmVjZWl2ZSBDREFUQSAjSU1QTElFRAorICAgICAgICAgIG93biBDREFUQSAjSU1QTElFRAorICAgICAgICAgIHNlbmRfdG8gQ0RBVEEgI0lNUExJRUQKKyAgICAgICAgICByZWNlaXZlX2Zyb20gQ0RBVEEgI0lNUExJRUQ+CisKKzwhRUxFTUVOVCBkZW55IEVNUFRZPgorPCFBVFRMSVNUIGRlbnkKKyAgICAgICAgICB1c2VyIENEQVRBICNJTVBMSUVECisgICAgICAgICAgc2VuZCBDREFUQSAjSU1QTElFRAorICAgICAgICAgIHJlY2VpdmUgQ0RBVEEgI0lNUExJRUQKKyAgICAgICAgICBvd24gQ0RBVEEgI0lNUExJRUQKKyAgICAgICAgICBzZW5kX3RvIENEQVRBICNJTVBMSUVECisgICAgICAgICAgcmVjZWl2ZV9mcm9tIENEQVRBICNJTVBMSUVEPgorCis8IUVMRU1FTlQgbGltaXQgKCNQQ0RBVEEpPgorPCFBVFRMSVNUIGxpbWl0IG5hbWUgQ0RBVEEgI1JFUVVJUkVEPgorCis8IUVMRU1FTlQgc2VsaW51eCAoYXNzb2NpYXRlKSo+Cis8IUVMRU1FTlQgYXNzb2NpYXRlIEVNUFRZPgorPCFBVFRMSVNUIGFzc29jaWF0ZQorICAgICAgICAgIG93biBDREFUQSAjUkVRVUlSRUQKKyAgICAgICAgICBjb250ZXh0IENEQVRBICNSRVFVSVJFRD4KKworPCFFTEVNRU5UIGFwcGFybW9yIEVNUFRZPgorPCFBVFRMSVNUIGFwcGFybW9yCisgICAgICAgICAgbW9kZSAocmVxdWlyZWR8ZW5hYmxlZHxkaXNhYmxlZCkgImVuYWJsZWQiPgpkaWZmIC0tZ2l0IGEvZG9jL2RidXMtYXBpLWRlc2lnbi5kdWNrIGIvZG9jL2RidXMtYXBpLWRlc2lnbi5kdWNrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyYTM2ODcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZGJ1cy1hcGktZGVzaWduLmR1Y2sKQEAgLTAsMCArMSw4OTMgQEAKKz0gRC1CdXMgQVBJIERlc2lnbiBHdWlkZWxpbmVzCitAbGlua1tndWlkZSA+aW5kZXhdCitAY3JlZGl0W3R5cGU9ImF1dGhvciBjb3B5cmlnaHQiXQorICBAbmFtZSBQaGlsaXAgV2l0aG5hbGwKKyAgQGVtYWlsIHBoaWxpcC53aXRobmFsbEBjb2xsYWJvcmEuY28udWsKKyAgQHllYXJzIDIwMTUKK0BkZXNjIEd1aWRlbGluZXMgZm9yIHdyaXRpbmcgaGlnaCBxdWFsaXR5IEQtQnVzIEFQSXMKK0ByZXZpc2lvbltkYXRlPTIwMTUtMDItMDUgc3RhdHVzPWRyYWZ0XQorCitbc3lub3BzaXNdCisgIFt0aXRsZV0KKyAgU3VtbWFyeQorCisgIFRoZSBtb3N0IGNvbW1vbiB1c2UgZm9yIEQtQnVzIGlzIGluIGltcGxlbWVudGluZyBhIHNlcnZpY2Ugd2hpY2ggd2lsbCBiZQorICBjb25zdW1lZCBieSBtdWx0aXBsZSBjbGllbnQgcHJvZ3JhbXMsIGFuZCBoZW5jZSBhbGwgaW50ZXJmYWNlcyBleHBvcnRlZCBvbiB0aGUKKyAgYnVzIGZvcm0gYSBwdWJsaWMgQVBJLiBEZXNpZ25pbmcgYSBELUJ1cyBBUEkgaXMgbGlrZSBkZXNpZ25pbmcgYW55IG90aGVyIEFQSToKKyAgdGhlcmUgaXMgYSBsb3Qgb2YgZmxleGliaWxpdHksIGJ1dCB0aGVyZSBhcmUgZGVzaWduIHBhdHRlcm5zIHRvIGZvbGxvdyBhbmQKKyAgYW50aS1wYXR0ZXJucyB0byBhdm9pZC4KKworICBUaGlzIGd1aWRlIGFpbXMgdG8gZXhwbGFpbiB0aGUgYmVzdCBwcmFjdGljZXMgZm9yIHdyaXRpbmcgRC1CdXMgQVBJcy4gVGhlc2UKKyAgaGF2ZSBiZWVuIHJlZmluZWQgb3ZlciBzZXZlcmFsIHllYXJzIG9mIHVzZSBvZiBELUJ1cyBpbiBtYW55IHByb2plY3RzLgorICBQb2ludGVycyB3aWxsIGJlIGdpdmVuIGZvciBpbXBsZW1lbnRpbmcgQVBJcyB1c2luZyBjb21tb24gRC1CdXMKKyAgbGlicmFyaWVzIGxpa2UKKyAgJGxpbmtbPj5odHRwczovL2RldmVsb3Blci5nbm9tZS5vcmcvZ2lvL3N0YWJsZS9nZGJ1cy1jb252ZW5pZW5jZS5odG1sXShHREJ1cyksCisgIGJ1dCBkZXRhaWxlZCBpbXBsZW1lbnRhdGlvbiBpbnN0cnVjdGlvbnMgYXJlIGxlZnQgdG8gdGhlIGxpYnJhcmllc+KAmQorICBkb2N1bWVudGF0aW9uLiBOb3RlIHRoYXQgeW91IHNob3VsZCAkZW0obm90KSB1c2UgZGJ1cy1nbGliIHRvIGltcGxlbWVudCBELUJ1cworICBzZXJ2aWNlcyBhcyBpdCBpcyBkZXByZWNhdGVkIGFuZCB1bm1haW50YWluZWQuIE1vc3Qgc2VydmljZXMgc2hvdWxkIGFsc28gYXZvaWQKKyAgbGliZGJ1cyAoZGJ1cy0xKSwgd2hpY2ggaXMgYSBsb3ctbGV2ZWwgbGlicmFyeSBhbmQgaXMgYXdrd2FyZCB0byB1c2UKKyAgY29ycmVjdGx5OiBpdCBpcyBkZXNpZ25lZCB0byBiZSB1c2VkIHZpYSBhIGxhbmd1YWdlIGJpbmRpbmcgc3VjaCBhcworICAkbGlua1s+Pmh0dHA6Ly9xdC1wcm9qZWN0Lm9yZy9kb2MvcXQtNC44L3F0ZGJ1cy5odG1sXShRdERCdXMpLgorCisgIEZvciBkb2N1bWVudGF0aW9uIG9uIEQtQnVzIGl0c2VsZiwgc2VlIHRoZQorICAkbGlua1s+Pmh0dHA6Ly9kYnVzLmZyZWVkZXNrdG9wLm9yZy9kb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLmh0bWxdKEQtQnVzCisgIHNwZWNpZmljYXRpb24pLgorCitbbGlua3Mgc2VjdGlvbl0KKworPT0gQVBJcworICAgW2lkPSJhcGlzIl0KKworQSBELUJ1cyBBUEkgaXMgYSBzcGVjaWZpY2F0aW9uIG9mIG9uZSBvciBtb3JlIGludGVyZmFjZXMsIHdoaWNoIHdpbGwgYmUKK2ltcGxlbWVudGVkIGJ5IG9iamVjdHMgZXhwb3NlZCBieSBhIHNlcnZpY2Ugb24gdGhlIGJ1cy4gVHlwaWNhbGx5IGFuIEFQSSBpcworZGVzaWduZWQgYXMgYSBzZXQgb2YgJGxpbmtbPiNpbnRlcmZhY2UtZmlsZXNdKGludGVyZmFjZSBmaWxlcyksIGFuZCB0aGUKK2ltcGxlbWVudGF0aW9uIG9mIHRoZSBzZXJ2aWNlIGZvbGxvd3MgdGhvc2UgZmlsZXMuIFNvbWUgcHJvamVjdHMsIGhvd2V2ZXIsCitjaG9vc2UgdG8gZGVmaW5lIHRoZSBBUEkgaW4gdGhlIGNvZGUgZm9yIHRoZSBzZXJ2aWNlLCBhbmQgdG8gZXhwb3J0IFhNTAoraW50ZXJmYWNlIGZpbGVzIGZyb20gdGhlIHJ1bm5pbmcgc2VydmljZQorJGxpbmtbPj5odHRwOi8vZGJ1cy5mcmVlZGVza3RvcC5vcmcvZG9jL2RidXMtc3BlY2lmaWNhdGlvbi5odG1sI3N0YW5kYXJkLWludGVyZmFjZXMtaW50cm9zcGVjdGFibGVdKHVzaW5nCitELUJ1cyBpbnRyb3NwZWN0aW9uKS4gQm90aCBhcmUgdmFsaWQgYXBwcm9hY2hlcy4KKworRm9yIHNpbXBsaWNpdHksIHRoaXMgZG9jdW1lbnQgdXNlcyB0aGUgWE1MIGRlc2NyaXB0aW9ucyBvZiBELUJ1cyBpbnRlcmZhY2VzIGFzCit0aGUgY2Fub25pY2FsIHJlcHJlc2VudGF0aW9uLgorCis9PSBJbnRlcmZhY2UgZmlsZXMKKyAgIFtpZD0iaW50ZXJmYWNlLWZpbGVzIl0KKworQSBELUJ1cyBpbnRlcmZhY2UgZmlsZSBpcyBhbiBYTUwgZmlsZSB3aGljaCBkZXNjcmliZXMgb25lIG9yIG1vcmUgRC1CdXMKK2ludGVyZmFjZXMsIGFuZCBpcyB0aGUgYmVzdCB3YXkgb2YgZGVzY3JpYmluZyBhIEQtQnVzIEFQSSBpbiBhIG1hY2hpbmUKK3JlYWRhYmxlIHdheS4gVGhlIGZvcm1hdCBpcyBkZXNjcmliZWQgaW4gdGhlCiskbGlua1s+Pmh0dHA6Ly9kYnVzLmZyZWVkZXNrdG9wLm9yZy9kb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLmh0bWwjaW50cm9zcGVjdGlvbi1mb3JtYXRdKEQtQnVzCitzcGVjaWZpY2F0aW9uKSwgYW5kIGlzIHN1cHBvcnRlZCBieSB0b29scyBzdWNoIGFzICRjbWQoZ2RidXMtY29kZWdlbikuCisKK0ludGVyZmFjZSBmaWxlcyBmb3IgcHVibGljIEFQSSBzaG91bGQgYmUgaW5zdGFsbGVkIHRvCiskY29kZSgkdmFyKCQkKGRhdGFkaXIpKS9kYnVzLTEvaW50ZXJmYWNlcykgc28gdGhhdCBvdGhlciBzZXJ2aWNlcyBjYW4gbG9hZAordGhlbS4gUHJpdmF0ZSBBUElzIHNob3VsZCBub3QgYmUgaW5zdGFsbGVkLiBUaGVyZSBzaG91bGQgYmUgb25lIGZpbGUgaW5zdGFsbGVkCitwZXIgRC1CdXMgaW50ZXJmYWNlLCBuYW1lZCBhZnRlciB0aGUgaW50ZXJmYWNlLCBjb250YWluaW5nIGEgc2luZ2xlIHRvcC1sZXZlbAorJGNvZGUoPG5vZGU+KSBlbGVtZW50IHdpdGggYSBzaW5nbGUgJGNvZGUoPGludGVyZmFjZT4pIGJlbmVhdGggaXQuIEZvciBleGFtcGxlLAoraW50ZXJmYWNlICRjb2RlKGNvbS5leGFtcGxlLk15U2VydmljZTEuTWFuYWdlcikgd291bGQgYmUgZGVzY3JpYmVkIGJ5IGZpbGUKKyRmaWxlKCR2YXIoJCQoZGF0YWRpcikpL2RidXMtMS9pbnRlcmZhY2VzL2NvbS5leGFtcGxlLk15U2VydmljZTEuTWFuYWdlci54bWwpOgorCitbbGlzdGluZ10KKyAgW3RpdGxlXQorICAgIEV4YW1wbGUgRC1CdXMgSW50ZXJmYWNlIFhNTAorICBbZGVzY10KKyAgICBBIGJyaWVmIGV4YW1wbGUgaW50ZXJmYWNlIFhNTCBkb2N1bWVudC4KKyAgW2NvZGUgbWltZT0iYXBwbGljYXRpb24veG1sIl0KKyAgICA8IURPQ1RZUEUgbm9kZSBQVUJMSUMKKyAgICAgICAgIi0vL2ZyZWVkZXNrdG9wLy9EVEQgRC1CVVMgT2JqZWN0IEludHJvc3BlY3Rpb24gMS4wLy9FTiIKKyAgICAgICAgImh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3N0YW5kYXJkcy9kYnVzLzEuMC9pbnRyb3NwZWN0LmR0ZCIgPgorICAgIDxub2RlIHhtbG5zOmRvYz0iaHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvZGJ1cy8xLjAvZG9jLmR0ZCI+CisgICAgICA8aW50ZXJmYWNlIG5hbWU9ImNvbS5leGFtcGxlLk15U2VydmljZTEuSW50ZXJlc3RpbmdJbnRlcmZhY2UiPgorICAgICAgICA8bWV0aG9kIG5hbWU9IkFkZENvbnRhY3QiPgorICAgICAgICAgIDxhcmcgbmFtZT0ibmFtZSIgZGlyZWN0aW9uPSJpbiIgdHlwZT0icyI+CisgICAgICAgICAgICA8ZG9jOmRvYz48ZG9jOnN1bW1hcnk+TmFtZSBvZiBuZXcgY29udGFjdDwvZG9jOnN1bW1hcnk+PC9kb2M6ZG9jPgorICAgICAgICAgIDwvYXJnPgorICAgICAgICAgIDxhcmcgbmFtZT0iZW1haWwiIGRpcmVjdGlvbj0iaW4iIHR5cGU9InMiPgorICAgICAgICAgICAgPGRvYzpkb2M+PGRvYzpzdW1tYXJ5PkUtbWFpbCBhZGRyZXNzIG9mIG5ldyBjb250YWN0PC9kb2M6c3VtbWFyeT48L2RvYzpkb2M+CisgICAgICAgICAgPC9hcmc+CisgICAgICAgICAgPGFyZyBuYW1lPSJpZCIgZGlyZWN0aW9uPSJvdXQiIHR5cGU9InUiPgorICAgICAgICAgICAgPGRvYzpkb2M+PGRvYzpzdW1tYXJ5PklEIG9mIG5ld2x5IGFkZGVkIGNvbnRhY3Q8L2RvYzpzdW1tYXJ5PjwvZG9jOmRvYz4KKyAgICAgICAgICA8L2FyZz4KKyAgICAgICAgICA8ZG9jOmRvYz4KKyAgICAgICAgICAgIDxkb2M6ZGVzY3JpcHRpb24+CisgICAgICAgICAgICAgIDxkb2M6cGFyYT4KKyAgICAgICAgICAgICAgICBBZGRzIGEgbmV3IGNvbnRhY3QgdG8gdGhlIGFkZHJlc3MgYm9vayB3aXRoIHRoZWlyIG5hbWUgYW5kCisgICAgICAgICAgICAgICAgZS1tYWlsIGFkZHJlc3MuCisgICAgICAgICAgICAgIDwvZG9jOnBhcmE+CisgICAgICAgICAgICA8L2RvYzpkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8L2RvYzpkb2M+CisgICAgICAgIDwvbWV0aG9kPgorICAgICAgPC9pbnRlcmZhY2U+CisgICAgPC9ub2RlPgorCitJZiBhbiBpbnRlcmZhY2UgZGVmaW5lZCBieSBzZXJ2aWNlIEEgbmVlZHMgdG8gYmUgdXNlZCBieSBjbGllbnQgQiwgY2xpZW50IEIKK3Nob3VsZCBkZWNsYXJlIGEgYnVpbGQgdGltZSBkZXBlbmRlbmN5IG9uIHNlcnZpY2UgQSwgYW5kIHVzZSB0aGUgaW5zdGFsbGVkIGNvcHkKK29mIHRoZSBpbnRlcmZhY2UgZmlsZSBmb3IgYW55IGNvZGUgZ2VuZXJhdGlvbiBpdCBoYXMgdG8gZG8uIEl0IHNob3VsZCAkZW0obm90KQoraGF2ZSBhIGxvY2FsIGNvcHkgb2YgdGhlIGludGVyZmFjZSwgYXMgdGhhdCBjb3VsZCB0aGVuIGdvIG91dCBvZiBzeW5jIHdpdGggdGhlCitjYW5vbmljYWwgY29weSBpbiBzZXJ2aWNlIEHigJlzIGdpdCByZXBvc2l0b3J5LgorCis9PSBBUEkgdmVyc2lvbmluZworICAgW2lkPSJhcGktdmVyc2lvbmluZyJdCisKKyRsaW5rWz4+aHR0cDovL29tZXRlci5jb20vcGFyYWxsZWwuaHRtbF0oSnVzdCBsaWtlIEMgQVBJcyksIEQtQnVzIGludGVyZmFjZXMKK3Nob3VsZCBiZSBkZXNpZ25lZCB0byBiZSB1c2FibGUgaW4gcGFyYWxsZWwgd2l0aCBBUEktaW5jb21wYXRpYmxlIHZlcnNpb25zLiBUaGlzCitpcyBhY2hpZXZlZCBieSBpbmNsdWRpbmcgYSB2ZXJzaW9uIG51bWJlciBpbiBlYWNoIGludGVyZmFjZSBuYW1lLCBzZXJ2aWNlIG5hbWUKK2FuZCBvYmplY3QgcGF0aCB3aGljaCBpcyBpbmNyZW1lbnRlZCBvbiBldmVyeSBiYWNrd2FyZHMtaW5jb21wYXRpYmxlIGNoYW5nZS4KKworVmVyc2lvbiBudW1iZXJzIHNob3VsZCBiZSBpbmNsdWRlZCBpbiBhbGwgQVBJcyBmcm9tIHRoZSBmaXJzdCByZWxlYXNlLCBhcyB0aGF0CittZWFucyBtb3ZpbmcgdG8gYSBuZXcgdmVyc2lvbiBpcyBhcyBzaW1wbGUgYXMgaW5jcmVtZW50aW5nIHRoZSBudW1iZXIsIHJhdGhlcgordGhhbiBpbnNlcnRpbmcgYSBudW1iZXIgZXZlcnl3aGVyZSwgd2hpY2ggdGFrZXMgbW9yZSBlZmZvcnQuCisKK05ldyBBUEkgY2FuIGJlIGFkZGVkIHRvIGEgRC1CdXMgaW50ZXJmYWNlIHdpdGhvdXQgaW5jcmVtZW50aW5nIHRoZSB2ZXJzaW9uCitudW1iZXIsIGFzIHN1Y2ggYWRkaXRpb25zIGFyZSBzdGlsbCBiYWNrd2FyZHMtY29tcGF0aWJsZS4gSG93ZXZlciwgY2xpZW50cworc2hvdWxkIGdyYWNlZnVsbHkgaGFuZGxlIHRoZSAkY29kZShvcmcuZnJlZWRlc2t0b3AuREJ1cy5FcnJvci5Vbmtub3duTWV0aG9kKQorZXJyb3IgcmVwbHkgZnJvbSBhbGwgRC1CdXMgbWV0aG9kIGNhbGxzIGlmIHRoZXkgd2FudCB0byBydW4gYWdhaW5zdCBvbGRlcgordmVyc2lvbnMgb2YgdGhlIHNlcnZpY2Ugd2hpY2ggZG9u4oCZdCBpbXBsZW1lbnQgbmV3IG1ldGhvZHMuIChUaGlzIGFsc28gcHJldmVudHMKK3VzZSBvZiBnZW5lcmF0ZWQgYmluZGluZ3M7IGFueSBtZXRob2Qgd2hpY2ggYSBjbGllbnQgd2FudHMgdG8gZ3JhY2VmdWxseSBmYWxsCitiYWNrIGZyb20gc2hvdWxkIGJlIGNhbGxlZCB1c2luZyBhIGdlbmVyaWMgRC1CdXMgbWV0aG9kIGludm9jYXRpb24gcmF0aGVyIHRoYW4KK2Egc3BlY2lmaWMgZ2VuZXJhdGVkIGJpbmRpbmcuKQorCitXaGVuIEFQSSBpcyBicm9rZW4sIGNoYW5nZWQgb3IgcmVtb3ZlZCwgdGhlIHNlcnZpY2XigJlzIHZlcnNpb24gbnVtYmVyIG11c3QgYmUKK2J1bXBlZDsgZm9yIGV4YW1wbGUsIGZyb20gJGNvZGUoY29tLmV4YW1wbGUuTXlTZXJ2aWNlMSkKK3RvICRjb2RlKGNvbS5leGFtcGxlLk15U2VydmljZTIpLiBJZiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBpcyBtYWludGFpbmVkIGluCit0aGUgc2VydmljZSBieSBpbXBsZW1lbnRpbmcgYm90aCB0aGUgb2xkIGFuZCBuZXcgaW50ZXJmYWNlcywgdGhlIHNlcnZpY2UgY2FuCitvd24gJGVtKGJvdGgpIHdlbGwta25vd24gbmFtZXMgYW5kIGNsaWVudHMgY2FuIHVzZSB3aGljaGV2ZXIgdGhleSBzdXBwb3J0LgorCitBcyBkaXNjdXNzZWQgaW4gJGxpbmtbPiNhbm5vdGF0aW9uc10sIG5ldyBvciBkZXByZWNhdGVkIEFQSXMgc2hvdWxkIGJlIG1hcmtlZCBpbgordGhlIGludGVyZmFjZSBYTUwgdXNpbmcgYW5ub3RhdGlvbnMuCisKK05vdGUsIGhvd2V2ZXIsIHRoYXQgc3VwcG9ydGluZyBtdWx0aXBsZSBpbnRlcmZhY2UgdmVyc2lvbnMgc2ltdWx0YW5lb3VzbHkKK3JlcXVpcmVzIHRoYXQgJGVtKG9iamVjdCBwYXRocykgYXJlIHZlcnNpb25lZCBhcyB3ZWxsLCBzbyBvYmplY3RzICRlbShtdXN0IG5vdCkKK2JlIHB1dCBvbiB0aGUgYnVzIGF0IHRoZSByb290IHBhdGggKOKAmC/igJkpLiBUaGlzIGlzIGZvciB0ZWNobmljYWwgcmVhc29uczogc2lnbmFscworc2VudCBmcm9tIGEgRC1CdXMgc2VydmljZSBoYXZlIHRoZSBvcmlnaW5hdGluZyBzZXJ2aWNlIG5hbWUgb3ZlcndyaXR0ZW4gYnkgaXRzCit1bmlxdWUgbmFtZSAoZS5nLiAkY29kZShjb20uZXhhbXBsZS5NeVNlcnZpY2UyKSBpcyBvdmVyd3JpdHRlbiBieSAkY29kZSg6MToxNSkpLgorSWYgb2JqZWN0IHBhdGhzIGFyZSBzaGFyZWQgYmV0d2VlbiBvYmplY3RzIGltcGxlbWVudGluZyB0d28gdmVyc2lvbnMgb2YgdGhlCitzZXJ2aWNl4oCZcyBpbnRlcmZhY2UsIGNsaWVudCBwcm9ncmFtcyBjYW5ub3QgdGVsbCB3aGljaCBvYmplY3QgYSBzaWduYWwgaGFzIGNvbWUKK2Zyb20uIFRoZSBzb2x1dGlvbiBpcyB0byBpbmNsdWRlIHRoZSB2ZXJzaW9uIG51bWJlciBpbiBhbGwgb2JqZWN0IHBhdGhzLCBmb3IKK2V4YW1wbGUgJGNvZGUoL2NvbS9leGFtcGxlL015U2VydmljZTEvTWFuYWdlcikgaW5zdGVhZCBvZiAkY29kZSgvKSBvcgorJGNvZGUoL2NvbS9leGFtcGxlL015U2VydmljZS9NYW5hZ2VyKS4KKworSW4gc3VtbWFyeSwgdmVyc2lvbiBudW1iZXJzIHNob3VsZCBiZSBpbmNsdWRlZCBpbiBhbGwgc2VydmljZSBuYW1lcywgaW50ZXJmYWNlCituYW1lcyBhbmQgb2JqZWN0IHBhdGhzOgorW2xpc3RdCisqICRjb2RlKGNvbS5leGFtcGxlLk15U2VydmljZTEpCisqICRjb2RlKGNvbS5leGFtcGxlLk15U2VydmljZTEuSW50ZXJlc3RpbmdJbnRlcmZhY2UpCisqICRjb2RlKGNvbS5leGFtcGxlLk15U2VydmljZTEuT3RoZXJJbnRlcmZhY2UpCisqICRjb2RlKC9jb20vZXhhbXBsZS9NeVNlcnZpY2UxL01hbmFnZXIpCisqICRjb2RlKC9jb20vZXhhbXBsZS9NeVNlcnZpY2UxL090aGVyT2JqZWN0KQorCis9PSBBUEkgZGVzaWduCisgICBbaWQ9ImFwaS1kZXNpZ24iXQorCitELUJ1cyBBUEkgZGVzaWduIGlzIGJyb2FkbHkgdGhlIHNhbWUgYXMgQyBBUEkgZGVzaWduLCBidXQgdGhlcmUgYXJlIGEgZmV3CithZGRpdGlvbmFsIHBvaW50cyB0byBiZWFyIGluIG1pbmQgd2hpY2ggYXJpc2UgYm90aCBmcm9tIEQtQnVz4oCZIGZlYXR1cmVzCisoZXhwbGljaXQgZXJyb3JzLCBzaWduYWxzIGFuZCBwcm9wZXJ0aWVzKSwgYW5kIGZyb20gaXRzIGltcGxlbWVudGF0aW9uIGFzIGFuIElQQworc3lzdGVtLgorCitELUJ1cyBtZXRob2QgY2FsbHMgYXJlIG11Y2ggbW9yZSBleHBlbnNpdmUgdGhhbiBDIGZ1bmN0aW9uIGNhbGxzLCB0eXBpY2FsbHkKK3Rha2luZyBvbiB0aGUgb3JkZXIgb2YgbWlsbGlzZWNvbmRzIHRvIGNvbXBsZXRlIGEgcm91bmQgdHJpcC4gVGhlcmVmb3JlLCB0aGUKK2Rlc2lnbiBzaG91bGQgbWluaW1pemUgdGhlIG51bWJlciBvZiBtZXRob2QgY2FsbHMgbmVlZGVkIHRvIHBlcmZvcm0gYW4KK29wZXJhdGlvbi4KKworVGhlIHR5cGUgc3lzdGVtIGlzIHZlcnkgZXhwcmVzc2l2ZSwgZXNwZWNpYWxseSBjb21wYXJlZCB0byBD4oCZcywgYW5kIEFQSXMgc2hvdWxkCit0YWtlIGZ1bGwgYWR2YW50YWdlIG9mIGl0LgorCitTaW1pbGFybHksIGl0cyBzdXBwb3J0IGZvciBzaWduYWxzIGFuZCBwcm9wZXJ0aWVzIGRpZmZlcmVudGlhdGVzIGl0IGZyb20gbm9ybWFsCitDIEFQSXMsIGFuZCB3ZWxsIHdyaXR0ZW4gRC1CdXMgQVBJcyBtYWtlIGZ1bGwgdXNlIG9mIHRoZXNlIGZlYXR1cmVzIHdoZXJlCithcHByb3ByaWF0ZS4gVGhleSBjYW4gYmUgY291cGxlZCB3aXRoIHN0YW5kYXJkIGludGVyZmFjZXMgZGVmaW5lZCBpbiB0aGUgRC1CdXMKK3NwZWNpZmljYXRpb24gdG8gYWxsb3cgZm9yIGNvbnNpc3RlbnQgYWNjZXNzIHRvIHByb3BlcnRpZXMgYW5kIG9iamVjdHMgaW4gYQoraGllcmFyY2h5LgorCis9PT0gTWluaW1pemluZyBSb3VuZCBUcmlwcworICAgIFtpZD0icm91bmQtdHJpcHMiXQorCitFYWNoIEQtQnVzIG1ldGhvZCBjYWxsIGlzIGEgcm91bmQgdHJpcCBmcm9tIGEgY2xpZW50IHByb2dyYW0gdG8gYSBzZXJ2aWNlIGFuZAorYmFjayBhZ2Fpbiwgd2hpY2ggaXMgZXhwZW5zaXZlIOKAlCB0YWtpbmcgb24gdGhlIG9yZGVyIG9mIGEgbWlsbGlzZWNvbmQuIE9uZSBvZgordGhlIHRvcCBwcmlvcml0aWVzIGluIEQtQnVzIEFQSSBkZXNpZ24gaXMgdG8gbWluaW1pemUgdGhlIG51bWJlciBvZiByb3VuZCB0cmlwcworbmVlZGVkIGJ5IGNsaWVudHMuIFRoaXMgY2FuIGJlIGFjaGlldmVkIGJ5IGEgY29tYmluYXRpb24gb2YgcHJvdmlkaW5nIHNwZWNpZmljCitjb252ZW5pZW5jZSBBUElzIGFuZCBkZXNpZ25pbmcgQVBJcyB3aGljaCBvcGVyYXRlIG9uIGxhcmdlIGRhdGEgc2V0cyBpbiBhIHNpbmdsZQorY2FsbCwgcmF0aGVyIHRoYW4gcmVxdWlyaW5nIGFzIG1hbnkgY2FsbHMgYXMgZWxlbWVudHMgaW4gdGhlIGRhdGEgc2V0LgorCitDb25zaWRlciBhbiBhZGRyZXNzIGJvb2sgQVBJLCAkY29kZShjb20uZXhhbXBsZS5NeVNlcnZpY2UxLkFkZHJlc3NCb29rKS4gSXQKK21pZ2h0IGhhdmUgYW4gJGNvZGUoQWRkQ29udGFjdChzcykg4oaSICh1KSkgbWV0aG9kIHRvIGFkZCBhIGNvbnRhY3QgKHRha2luZyBuYW1lCithbmQgZS1tYWlsIGFkZHJlc3MgcGFyYW1ldGVycyBhbmQgcmV0dXJuaW5nIGEgdW5pcXVlIGNvbnRhY3QgSUQpLCBhbmQgYQorJGNvZGUoUmVtb3ZlQ29udGFjdCh1KSkgbWV0aG9kIHRvIHJlbW92ZSBvbmUgYnkgSUQuIEluIHRoZSBub3JtYWwgY2FzZSBvZgorb3BlcmF0aW5nIG9uIHNpbmdsZSBjb250YWN0cyBpbiB0aGUgYWRkcmVzcyBib29rLCB0aGVzZSBjYWxscyBhcmUgb3B0aW1hbC4KK0hvd2V2ZXIsIGlmIHRoZSB1c2VyIHdhbnRzIHRvIGltcG9ydCBhIGxpc3Qgb2YgY29udGFjdHMsIG9yIGRlbGV0ZSBtdWx0aXBsZQorY29udGFjdHMgc2ltdWx0YW5lb3VzbHksIG9uZSBjYWxsIGhhcyB0byBiZSBtYWRlIHBlciBjb250YWN0IOKAlCB0aGlzIGNvdWxkIHRha2UKK2EgbG9uZyB0aW1lIGZvciBsYXJnZSBjb250YWN0IGxpc3RzLgorCitJbnN0ZWFkIG9mIHRoZSAkY29kZShBZGRDb250YWN0KSBhbmQgJGNvZGUoUmVtb3ZlQ29udGFjdCkgbWV0aG9kcywgdGhlIGludGVyZmFjZQorY291bGQgaGF2ZSBhbiAkY29kZShVcGRhdGVDb250YWN0cyhhKHNzKWF1KSDihpIgKGF1KSkgbWV0aG9kLCB3aGljaCB0YWtlcyBhbiBhcnJheQorb2Ygc3RydWN0cyBjb250YWluaW5nIHRoZSBuZXcgY29udGFjdHPigJkgZGV0YWlscywgYW5kIGFuIGFycmF5IG9mIElEcyBvZiB0aGUKK2NvbnRhY3RzIHRvIGRlbGV0ZSwgYW5kIHJldHVybnMgYW4gYXJyYXkgb2YgSURzIGZvciB0aGUgbmV3IGNvbnRhY3RzLiBUaGlzCityZWR1Y2VzIHRoZSBudW1iZXIgb2Ygcm91bmQgdHJpcHMgbmVlZGVkIHRvIG9uZS4KKworQWRkaW5nIGNvbnZlbmllbmNlIEFQSXMgdG8gcmVwbGFjZSBhIHNlcmllcyBvZiBjb21tb24gbWV0aG9kIGNhbGxzIHdpdGggYSBzaW5nbGUKK21ldGhvZCBjYWxsIHNwZWNpZmljYWxseSBmb3IgdGhhdCB0YXNrIGlzIGJlc3QgZG9uZSBhZnRlciB0aGUgQVBJIGhhcyBiZWVuCitwcm9maWxlZCBhbmQgYm90dGxlbmVja3MgaWRlbnRpZmllZCwgb3RoZXJ3aXNlIGl0IGNvdWxkIGxlYWQgdG8gcHJlbWF0dXJlCitvcHRpbWl6YXRpb24uIE9uZSBhcmVhIHdoZXJlIGNvbnZlbmllbmNlIG1ldGhvZHMgY2FuIHR5cGljYWxseSBiZSBhZGRlZAoraXMgZHVyaW5nIGluaXRpYWxpemF0aW9uIG9mIGEgY2xpZW50LCB3aGVyZSBtdWx0aXBsZSBtZXRob2QgY2FsbHMgYXJlIG5lZWRlZCB0bworZXN0YWJsaXNoIGl0cyBzdGF0ZSB3aXRoIHRoZSBzZXJ2aWNlLgorCis9PT0gVGFraW5nIEFkdmFudGFnZSBvZiB0aGUgVHlwZSBTeXN0ZW0KKyAgICBbaWQ9InR5cGUtc3lzdGVtIl0KKworRC1CdXPigJkgdHlwZSBzeXN0ZW0gaXMgc2ltaWxhciB0byBQeXRob27igJlzLCBidXQgd2l0aCBhIHRlcnNlciBzeW50YXggd2hpY2ggbWF5IGJlCit1bmZhbWlsaWFyIHRvIEMgZGV2ZWxvcGVycy4gVGhlIGtleSB0byB1c2luZyB0aGUgdHlwZSBzeXN0ZW0gZWZmZWN0aXZlbHkgaXMKK3RvIGV4cG9zZSBhcyBtdWNoIHN0cnVjdHVyZSBpbiB0eXBlcyBhcyBwb3NzaWJsZS4gSW4gcGFydGljdWxhciwgc2VuZGluZworc3RydWN0dXJlZCBzdHJpbmdzIG92ZXIgRC1CdXMgc2hvdWxkIGJlIGF2b2lkZWQsIGFzIHRoZXkgbmVlZCB0byBiZSBidWlsdCBhbmQKK3BhcnNlZDsgYm90aCBhcmUgY29tcGxleCBvcGVyYXRpb25zIHdoaWNoIGFyZSBwcm9uZSB0byBidWdzLgorCitGb3IgQVBJcyBiZWluZyB1c2VkIGluIGNvbnN0cmFpbmVkIHNpdHVhdGlvbnMsIGVudW1lcmF0ZWQgdmFsdWVzIHNob3VsZCBiZQordHJhbnNtaXR0ZWQgYXMgdW5zaWduZWQgaW50ZWdlcnMuIEZvciBBUElzIHdoaWNoIG5lZWQgdG8gYmUgZXh0ZW5kZWQgYnkgdGhpcmQKK3BhcnRpZXMgb3Igd2hpY2ggYXJlIHVzZWQgaW4gbW9yZSBsb29zZWx5IGNvdXBsZWQgc3lzdGVtcywgZW51bWVyYXRlZCB2YWx1ZXMKK3Nob3VsZCBiZSBzdHJpbmdzIGluIHNvbWUgZGVmaW5lZCBmb3JtYXQuCisKK1RyYW5zbWl0dGluZyB2YWx1ZXMgYXMgaW50ZWdlcnMgbWVhbnMgc3RyaW5nIHBhcnNpbmcgYW5kIG1hdGNoaW5nIGNhbiBiZQorYXZvaWRlZCwgdGhlIG1lc3NhZ2VzIGFyZSBtb3JlIGNvbXBhY3QsIGFuZCB0eXBvcyBjYW4gYmUgbW9yZSBlYXNpbHkgYXZvaWRlZCBieQorZGV2ZWxvcGVycyAoaWYsIGZvciBleGFtcGxlLCBDIGVudW1zIGFyZSB1c2VkIGluIHRoZSBpbXBsZW1lbnRhdGlvbikuCisKK1RyYW5zbWl0dGluZyB2YWx1ZXMgYXMgc3RyaW5ncyBtZWFucyBhZGRpdGlvbmFsIHZhbHVlcyBjYW4gYmUgZGVmaW5lZCBieSB0aGlyZAorcGFydGllcyB3aXRob3V0IGZlYXIgb2YgY29uZmxpY3Rpbmcgb3ZlciBpbnRlZ2VyIHZhbHVlczsgZm9yIGluc3RhbmNlIGJ5IHVzaW5nCit0aGUgc2FtZSByZXZlcnNlLWRvbWFpbi1uYW1lIG5hbWVzcGFjaW5nIGFzIEQtQnVzIGludGVyZmFjZXMuCisKK0luIGJvdGggY2FzZXMsIHRoZSBpbnRlcmZhY2UgZG9jdW1lbnRhdGlvbiBzaG91bGQgZGVzY3JpYmUgdGhlIG1lYW5pbmcgb2YgZWFjaAordmFsdWUuIEl0IHNob3VsZCBzdGF0ZSB3aGV0aGVyIHRoZSB0eXBlIGNhbiBiZSBleHRlbmRlZCBpbiBmdXR1cmUgYW5kLCBpZiBzbywKK2hvdyB0aGUgc2VydmljZSBhbmQgY2xpZW50IHNob3VsZCBoYW5kbGUgdW5yZWNvZ25pemVkIHZhbHVlcyDigJQgdHlwaWNhbGx5IGJ5Citjb25zaWRlcmluZyB0aGVtIGVxdWFsIHRvIGFuIOKAmHVua25vd27igJkgb3Ig4oCYZmFpbHVyZeKAmSB2YWx1ZS4gQ29udmVudGlvbmFsbHksIHplcm8KK2lzIHVzZWQgYXMgdGhlIOKAmHVua25vd27igJkgdmFsdWUuCisKK1tleGFtcGxlXQorICBGb3IgZXhhbXBsZSwgaW5zdGVhZCBvZjoKKyAgW2NvZGUgc3R5bGU9ImludmFsaWQiIG1pbWU9ImFwcGxpY2F0aW9uL3htbCJdCisgICAgPCEtLQorICAgICAgICBTdGF0dXM6CisKKyAgICAgICAgU3RhdHVzIG9mIHRoZSBvYmplY3QuCisgICAgICAgIFZhbGlkIHN0YXR1c2VzOiDigJh1bmtub3du4oCZLCDigJhyZWFkeeKAmSwg4oCYY29tcGxldGXigJkuCisgICAgLS0+CisgICAgPHByb3BlcnR5IG5hbWU9IlN0YXR1cyIgdHlwZT0icyIgYWNjZXNzPSJyZWFkIiAvPgorCisgIFVzZToKKyAgW2NvZGUgc3R5bGU9InZhbGlkIiBtaW1lPSJhcHBsaWNhdGlvbi94bWwiXQorICAgIDwhLS0KKyAgICAgICAgU3RhdHVzOgorCisgICAgICAgIFN0YXR1cyBvZiB0aGUgb2JqZWN0LgorICAgICAgICBWYWxpZCBzdGF0dXNlczogMCA9IFVua25vd24sIDEgPSBSZWFkeSwgMiA9IENvbXBsZXRlLgorICAgICAgICBVbnJlY29nbml6ZWQgc3RhdHVzZXMgc2hvdWxkIGJlIGNvbnNpZGVyZWQgZXF1YWwgdG8gVW5rbm93bi4KKyAgICAtLT4KKyAgICA8cHJvcGVydHkgbmFtZT0iU3RhdHVzIiB0eXBlPSJ1IiBhY2Nlc3M9InJlYWQiIC8+CisKK1NpbWlsYXJseSwgZW51bWVyYXRlZCB2YWx1ZXMgc2hvdWxkIGJlIHVzZWQgaW5zdGVhZCBvZiBib29sZWFucywgYXMgdGhleSBhbGxvdworZXh0cmEgdmFsdWVzIHRvIGJlIGFkZGVkIGluIGZ1dHVyZSwgYW5kIHRoZXJlIGlzIG5vIGFtYmlndWl0eSBhYm91dCB0aGUgc2Vuc2Ugb2YKK3RoZSBib29sZWFuIHZhbHVlLgorCitbZXhhbXBsZV0KKyAgRm9yIGV4YW1wbGUsIGluc3RlYWQgb2Y6CisgIFtjb2RlIHN0eWxlPSJpbnZhbGlkIiBtaW1lPSJhcHBsaWNhdGlvbi94bWwiXQorICAgIDwhLS0KKyAgICAgICBNb3ZlQWRkcmVzc0Jvb2s6CisgICAgICAgQGRpcmVjdGlvbjogJVRSVUUgdG8gbW92ZSBpdCB1cCBpbiB0aGUgbGlzdCwgJUZBTFNFIHRvIG1vdmUgaXQgZG93bgorCisgICAgICAgTW92ZSB0aGlzIGFkZHJlc3MgYm9vayB1cCBvciBkb3duIGluIHRoZSB1c2Vy4oCZcyBsaXN0IG9mIGFkZHJlc3MgYm9va3MuCisgICAgICAgSGlnaGVyIGFkZHJlc3MgYm9va3MgaGF2ZSB0aGVpciBjb250YWN0cyBkaXNwbGF5ZWQgZmlyc3QgaW4gc2VhcmNoCisgICAgICAgcmVzdWx0cy4KKyAgICAtLT4KKyAgICA8bWV0aG9kIG5hbWU9Ik1vdmVBZGRyZXNzQm9vayI+CisgICAgICA8YXJnIG5hbWU9ImRpcmVjdGlvbiIgdHlwZT0iYiIgZGlyZWN0aW9uPSJpbiIgLz4KKyAgICA8L21ldGhvZD4KKworICBCZSBtb3JlIGV4cGxpY2l0IHRoYW4gYSBib29sZWFuOgorICBbY29kZSBzdHlsZT0idmFsaWQiIG1pbWU9ImFwcGxpY2F0aW9uL3htbCJdCisgICAgPCEtLQorICAgICAgIE1vdmVBZGRyZXNzQm9vazoKKyAgICAgICBAZGlyZWN0aW9uOiAwID0gTW92ZSBpdCB1cCBpbiB0aGUgbGlzdCwgMSA9IE1vdmUgaXQgZG93bgorCisgICAgICAgTW92ZSB0aGlzIGFkZHJlc3MgYm9vayB1cCBvciBkb3duIGluIHRoZSB1c2Vy4oCZcyBsaXN0IG9mIGFkZHJlc3MgYm9va3MuCisgICAgICAgSGlnaGVyIGFkZHJlc3MgYm9va3MgaGF2ZSB0aGVpciBjb250YWN0cyBkaXNwbGF5ZWQgZmlyc3QgaW4gc2VhcmNoCisgICAgICAgcmVzdWx0cy4KKworICAgICAgIFVucmVjb2duaXplZCBlbnVtIHZhbHVlcyBmb3IgQGRpcmVjdGlvbiB3aWxsIHJlc3VsdCBpbiB0aGUgYWRkcmVzcyBib29rCisgICAgICAgbm90IG1vdmluZy4KKyAgICAtLT4KKyAgICA8bWV0aG9kIG5hbWU9Ik1vdmVBZGRyZXNzQm9vayI+CisgICAgICA8YXJnIG5hbWU9ImRpcmVjdGlvbiIgdHlwZT0idSIgZGlyZWN0aW9uPSJpbiIgLz4KKyAgICA8L21ldGhvZD4KKworRW51bWVyYXRlZCB2YWx1ZXMgc2hvdWxkIGFsc28gYmUgdXNlZCBpbnN0ZWFkIG9mICRlbShodW1hbiByZWFkYWJsZSkgc3RyaW5ncywKK3doaWNoIHNob3VsZCBub3QgYmUgc2VudCBvdmVyIHRoZSBidXMgaWYgcG9zc2libGUuIFRoZSBzZXJ2aWNlIGFuZCBjbGllbnQgY291bGQKK2JlIHJ1bm5pbmcgaW4gZGlmZmVyZW50IGxvY2FsZXMsIGFuZCBoZW5jZSBpbnRlcnByZXQgYW55IGh1bWFuIHJlYWRhYmxlIHN0cmluZ3MKK2RpZmZlcmVudGx5LCBvciBwcmVzZW50IHRoZW0gdG8gdGhlIHVzZXIgaW4gdGhlIHdyb25nIGxhbmd1YWdlLiBUcmFuc21pdCBhbgorZW51bWVyYXRlZCB2YWx1ZSBhbmQgY29udmVydCBpdCB0byBhIGh1bWFuIHJlYWRhYmxlIHN0cmluZyBpbiB0aGUgY2xpZW50LgorCitJbiBzaXR1YXRpb25zIHdoZXJlIGEgc2VydmljZSBoYXMgcmVjZWl2ZWQgYSBodW1hbiByZWFkYWJsZSBzdHJpbmcgZnJvbQorc29tZXdoZXJlIGVsc2UsIGl0IHNob3VsZCBwYXNzIGl0IG9uIHVubW9kaWZpZWQgdG8gdGhlIGNsaWVudCwgaWRlYWxseSB3aXRoIGl0cworbG9jYWxlIGFsb25nc2lkZS4gUGFzc2luZyBodW1hbiByZWFkYWJsZSBpbmZvcm1hdGlvbiB0byBhIGNsaWVudCBpcyBiZXR0ZXIgdGhhbgorcGFzc2luZyBub3RoaW5nLgorCitbZXhhbXBsZV0KKyAgRm9yIGV4YW1wbGUsIGluc3RlYWQgb2Y6CisgIFtjb2RlIHN0eWxlPSJpbnZhbGlkIiBtaW1lPSJhcHBsaWNhdGlvbi94bWwiXQorICAgIDwhLS0KKyAgICAgICBQcm9ncmVzc05vdGlmaWNhdGlvbjoKKyAgICAgICBAcHJvZ3Jlc3NfbWVzc2FnZTogSHVtYW4gcmVhZGFibGUgcHJvZ3Jlc3MgbWVzc2FnZSBzdHJpbmcuCisKKyAgICAgICBFbWl0dGVkIHdoZW5ldmVyIHNpZ25pZmljYW50IHByb2dyZXNzIGlzIG1hZGUgd2l0aCBzb21lIGV4YW1wbGUKKyAgICAgICBvcGVyYXRpb24uIFRoZSBAcHJvZ3Jlc3NfbWVzc2FnZSBjYW4gYmUgZGlzcGxheWVkIGluIGEgVUkgZGlhbG9ndWUgdG8KKyAgICAgICBwbGVhc2UgdGhlIHVzZXIuCisgICAgLS0+CisgICAgPHNpZ25hbCBuYW1lPSJQcm9ncmVzc05vdGlmaWNhdGlvbiI+CisgICAgICA8YXJnIG5hbWU9InByb2dyZXNzX21lc3NhZ2UiIHR5cGU9InMiIC8+CisgICAgPC9tZXRob2Q+CisKKyAgVGhlIHByb2dyZXNzIHNob3VsZCBiZSByZXBvcnRlZCBhcyBhbiBlbnVtZXJhdGVkIHZhbHVlOgorICBbY29kZSBzdHlsZT0idmFsaWQiIG1pbWU9ImFwcGxpY2F0aW9uL3htbCJdCisgICAgPCEtLQorICAgICAgIFByb2dyZXNzTm90aWZpY2F0aW9uOgorICAgICAgIEBwcm9ncmVzc19zdGF0ZTogMCA9IFByZXBhcmluZywgMSA9IEluIHByb2dyZXNzLCAyID0gRmluaXNoZWQKKworICAgICAgIEVtaXR0ZWQgd2hlbmV2ZXIgc2lnbmlmaWNhbnQgcHJvZ3Jlc3MgaXMgbWFkZSB3aXRoIHNvbWUgZXhhbXBsZQorICAgICAgIG9wZXJhdGlvbi4gVGhlIEBwcm9ncmVzc19zdGF0ZSBpcyB0eXBpY2FsbHkgY29udmVydGVkIHRvIGEgaHVtYW4gcmVhZGFibGUKKyAgICAgICBzdHJpbmcgYW5kIHByZXNlbnRlZCB0byB0aGUgdXNlci4gVW5yZWNvZ25pemVkIEBwcm9ncmVzc19zdGF0ZSB2YWx1ZXMKKyAgICAgICBzaG91bGQgYmUgdHJlYXRlZCBhcyBzdGF0ZSAxLCBpbiBwcm9ncmVzcy4KKyAgICAtLT4KKyAgICA8c2lnbmFsIG5hbWU9IlByb2dyZXNzTm90aWZpY2F0aW9uIj4KKyAgICAgIDxhcmcgbmFtZT0icHJvZ3Jlc3Nfc3RhdGUiIHR5cGU9InUiIC8+CisgICAgPC9tZXRob2Q+CisKK0QtQnVzIGhhcyBub25lIG9mIHRoZSBwcm9ibGVtcyBvZiBzaWduZWQgdmVyc3VzIHVuc2lnbmVkIGludGVnZXJzIHdoaWNoIEMgaGFzCisoc3BlY2lmaWNhbGx5LCBpdCBkb2VzIG5vdCBkbyBpbXBsaWNpdCBzaWduIGNvbnZlcnNpb24pLCBzbyBpbnRlZ2VyIHR5cGVzIHNob3VsZAorYWx3YXlzIGJlIGNob3NlbiB0byBiZSBhbiBhcHByb3ByaWF0ZSBzaXplIGFuZCBzaWduZWRuZXNzIGZvciB0aGUgZGF0YSB0aGV5Citjb3VsZCBwb3NzaWJseSBjb250YWluLiBUeXBpY2FsbHksIHVuc2lnbmVkIHZhbHVlcyBhcmUgbW9yZSBmcmVxdWVudGx5IG5lZWRlZAordGhhbiBzaWduZWQgdmFsdWVzLgorCitTdHJ1Y3R1cmVzIGNhbiBiZSB1c2VkIGFsbW9zdCBhbnl3aGVyZSBpbiBhIEQtQnVzIHR5cGUsIGFuZCBhcnJheXMgb2Ygc3RydWN0dXJlcworYXJlIHBhcnRpY3VsYXJseSB1c2VmdWwuIFN0cnVjdHVyZXMgc2hvdWxkIGJlIHVzZWQgd2hlcmV2ZXIgZGF0YSBmaWVsZHMgYXJlCityZWxhdGVkLiBOb3RlLCBob3dldmVyLCB0aGF0IHN0cnVjdHVyZXMgYXJlIG5vdCBleHRlbnNpYmxlIGluIGZ1dHVyZSwgc28gYWx3YXlzCitjb25zaWRlciAkbGlua1s+I2V4dGVuc2liaWxpdHldLgorCitbZXhhbXBsZV0KKyAgRm9yIGV4YW1wbGUsIGluc3RlYWQgb2Ygc2V2ZXJhbCBpZGVudGljYWxseS1pbmRleGVkIGFycmF5cyBjb250YWluaW5nCisgIGRpZmZlcmVudCBwcm9wZXJ0aWVzIG9mIHRoZSBzYW1lIHNldCBvZiBpdGVtczoKKyAgW2NvZGUgc3R5bGU9ImludmFsaWQiIG1pbWU9ImFwcGxpY2F0aW9uL3htbCJdCisgICAgPCEtLQorICAgICAgIEFkZENvbnRhY3RzOgorICAgICAgIEBuYW1lczogQXJyYXkgb2YgY29udGFjdCBuYW1lcyB0byBhZGQuCisgICAgICAgQGVtYWlsczogQ29ycmVzcG9uZGluZyBhcnJheSBvZiBjb250YWN0IGUtbWFpbCBhZGRyZXNzZXMuCisgICAgICAgQGlkczogUmV0dXJuZWQgYXJyYXkgb2YgdGhlIElEcyBvZiB0aGUgbmV3IGNvbnRhY3RzLiBUaGlzIHdpbGwgYmUgdGhlCisgICAgICAgICBzYW1lIGxlbmd0aCBhcyBAbmFtZXMuCisKKyAgICAgICBBZGQgemVybyBvciBtb3JlIGNvbnRhY3RzIHRvIHRoZSBhZGRyZXNzIGJvb2ssIHVzaW5nIHRoZWlyIG5hbWVzIGFuZAorICAgICAgIGUtbWFpbCBhZGRyZXNzZXMuIEBuYW1lcyBhbmQgQGVtYWlscyBtdXN0IGJlIHRoZSBzYW1lIGxlbmd0aC4KKyAgICAtLT4KKyAgICA8bWV0aG9kIG5hbWU9IkFkZENvbnRhY3RzIj4KKyAgICAgIDxhcmcgbmFtZT0ibmFtZXMiIHR5cGU9ImFzIiBkaXJlY3Rpb249ImluIiAvPgorICAgICAgPGFyZyBuYW1lPSJlbWFpbHMiIHR5cGU9ImFzIiBkaXJlY3Rpb249ImluIiAvPgorICAgICAgPGFyZyBuYW1lPSJpZHMiIHR5cGU9ImF1IiBkaXJlY3Rpb249Im91dCIgLz4KKyAgICA8L21ldGhvZD4KKworICBUaGUgYXJyYXlzIGNhbiBiZSBjb21iaW5lZCBpbnRvIGEgc2luZ2xlIGFycmF5IG9mIHN0cnVjdHVyZXM6CisgIFtjb2RlIHN0eWxlPSJpbnZhbGlkIiBtaW1lPSJhcHBsaWNhdGlvbi94bWwiXQorICAgIDwhLS0KKyAgICAgICBBZGRDb250YWN0czoKKyAgICAgICBAZGV0YWlsczogQXJyYXkgb2YgKGNvbnRhY3QgbmFtZSwgY29udGFjdCBlLW1haWwgYWRkcmVzcykgdG8gYWRkLgorICAgICAgIEBpZHM6IFJldHVybmVkIGFycmF5IG9mIHRoZSBJRHMgb2YgdGhlIG5ldyBjb250YWN0cy4gVGhpcyB3aWxsIGJlIHRoZQorICAgICAgICAgc2FtZSBsZW5ndGggYXMgQGRldGFpbHMuCisKKyAgICAgICBBZGQgemVybyBvciBtb3JlIGNvbnRhY3RzIHRvIHRoZSBhZGRyZXNzIGJvb2ssIHVzaW5nIHRoZWlyIG5hbWVzIGFuZAorICAgICAgIGUtbWFpbCBhZGRyZXNzZXMuCisgICAgLS0+CisgICAgPG1ldGhvZCBuYW1lPSJBZGRDb250YWN0cyI+CisgICAgICA8YXJnIG5hbWU9ImRldGFpbHMiIHR5cGU9ImEoc3MpIiBkaXJlY3Rpb249ImluIiAvPgorICAgICAgPGFyZyBuYW1lPSJpZHMiIHR5cGU9ImF1IiBkaXJlY3Rpb249Im91dCIgLz4KKyAgICA8L21ldGhvZD4KKworTm90ZSB0aGF0IEQtQnVzIGFycmF5cyBhcmUgYXV0b21hdGljYWxseSB0cmFuc21pdHRlZCB3aXRoIHRoZWlyIGxlbmd0aCwgc28gdGhlcmUKK2lzIG5vIG5lZWQgdG8gbnVsbC10ZXJtaW5hdGUgdGhlbSBvciBlbmNvZGUgdGhlaXIgbGVuZ3RoIHNlcGFyYXRlbHkuCisKK1tjb21tZW50XQorICBGSVhNRTogTWVudGlvbiBtYXliZSB0eXBlcyBhbmQgdGhlIGV4dGVuZGVkIGtkYnVzL0dWYXJpYW50IHR5cGUgc3lzdGVtIG9uY2UKKyAgdGhhdOKAmXMgc3RhYmxlIGFuZCByb3VuZC10cmlwLWFiaWxpdHkgaXMgbm8gbG9uZ2VyIGEgY29uY2Vybi4KKworPT09IEV4dGVuc2liaWxpdHkKKyAgICBbaWQ9ImV4dGVuc2liaWxpdHkiXQorCitTb21lIEQtQnVzIEFQSXMgaGF2ZSB2ZXJ5IHdlbGwtZGVmaW5lZCB1c2UgY2FzZXMsIGFuZCB3aWxsIG5ldmVyIG5lZWQgZXh0ZW5zaW9uLgorT3RoZXJzIGFyZSB1c2VkIGluIG1vcmUgbG9vc2VseSBjb3VwbGVkIHN5c3RlbXMgd2hpY2ggbWF5IGNoYW5nZSBvdmVyIHRpbWUsIGFuZAoraGVuY2Ugc2hvdWxkIGJlIGRlc2lnbmVkIHRvIGJlIGV4dGVuc2libGUgZnJvbSB0aGUgYmVnaW5uaW5nIHdpdGhvdXQgdGhlIG5lZWQKK3RvIGJyZWFrIEFQSSBpbiBmdXR1cmUuIFRoaXMgaXMgYSB0cmFkZSBvZmYgYmV0d2VlbiBoYXZpbmcgYSBtb3JlIGNvbXBsZXggQVBJLAorYW5kIGJlaW5nIGFibGUgdG8gZWFzaWx5IGV4dGVuZCBpdCBpbiBmdXR1cmUuCisKK1RoZSBrZXkgdG9vbCBmb3IgZXh0ZW5zaWJpbGl0eSBpbiBELUJ1cyBpcyAkY29kZShhe3N2fSksIHRoZSBkaWN0aW9uYXJ5IG1hcHBpbmcKK3N0cmluZ3MgdG8gdmFyaWFudHMuIElmIHdlbGwtZGVmaW5lZCBuYW1lc3BhY2VkIHN0cmluZ3MgYXJlIHVzZWQgYXMgdGhlCitkaWN0aW9uYXJ5IGtleXMsIGFyYml0cmFyeSBELUJ1cyBwZWVycyBjYW4gYWRkIHdoYXRldmVyIGluZm9ybWF0aW9uIHRoZXkgbmVlZAoraW50byB0aGUgZGljdGlvbmFyeS4gQW55IG90aGVyIHBlZXIgd2hpY2ggdW5kZXJzdGFuZHMgaXQgY2FuIHF1ZXJ5IGFuZCByZXRyaWV2ZQordGhlIGluZm9ybWF0aW9uOyBvdGhlciBwZWVycyB3aWxsIGlnbm9yZSBpdC4KKworVGhlIGNhbm9uaWNhbCBleGFtcGxlIG9mIGFuIGV4dGVuc2libGUgQVBJIHVzaW5nICRjb2RlKGF7c3Z9KSBpcworJGxpbmtbPj5odHRwOi8vdGVsZXBhdGh5LmZyZWVkZXNrdG9wLm9yZy9zcGVjL10oVGVsZXBhdGh5KS7CoEl0IHVzZXMgJGNvZGUoYXtzdn0pCit2YWx1ZXMgYXMgdGhlIGZpbmFsIGVsZW1lbnQgaW4gc3RydWN0dXJlcyB0byBhbGxvdyB0aGVtIHRvIGJlIGV4dGVuZGVkIGluCitmdXR1cmUuCisKK0Egc2Vjb25kYXJ5IHRvb2wgaXMgdGhlIHVzZSBvZiBmbGFnIGZpZWxkcyBpbiBtZXRob2QgY2FsbHMuIFRoZSBzZXQgb2YgYWNjZXB0ZWQKK2ZsYWdzIGlzIGVudGlyZWx5IHVuZGVyIHRoZSBjb250cm9sIG9mIHRoZSBpbnRlcmZhY2UgZGVzaWduZXIgYW5kLCBhcyB3aXRoCitlbnVtZXJhdGVkIHR5cGVzLCBjYW4gYmUgZXh0ZW5kZWQgaW4gZnV0dXJlIHdpdGhvdXQgYnJlYWtpbmcgQVBJLiBBZGRpbmcgbW9yZQorZmxhZ3MgYWxsb3dzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIHRoZSBtZXRob2QgY2FsbCB0byBiZSB0d2Vha2VkLgorCis9PT0gVXNpbmcgU2lnbmFscywgUHJvcGVydGllcyBhbmQgRXJyb3JzCisgICAgW2lkPSJ1c2luZy10aGUtZmVhdHVyZXMiXQorCitELUJ1cyBtZXRob2QgY2FsbHMgYXJlIGV4cGxpY2l0bHkgYXN5bmNocm9ub3VzIGR1ZSB0byB0aGUgbGF0ZW5jeSBpbmhlcmVudCBpbgorSVBDLiBUaGlzIG1lYW5zIHRoYXQgcGVlcnMgc2hvdWxkIG5vdCBibG9jayBvbiByZWNlaXZpbmcgYSByZXBseSBmcm9tIGEgbWV0aG9kCitjYWxsOyB0aGV5IHNob3VsZCBzY2hlZHVsZSBvdGhlciB3b3JrIChpbiBhIG1haW4gbG9vcCkgYW5kIGhhbmRsZSB0aGUgcmVwbHkgd2hlbgoraXQgaXMgcmVjZWl2ZWQuIEV2ZW4gdGhvdWdoIG1ldGhvZCByZXBsaWVzIG1heSB0YWtlIGEgd2hpbGUsIHRoZSBjYWxsZXIgaXMKKyRlbShndWFyYW50ZWVkKSB0byByZWNlaXZlIGV4YWN0bHkgb25lIHJlcGx5IGV2ZW50dWFsbHkuIFRoaXMgcmVwbHkgY291bGQgYmUgdGhlCityZXR1cm4gdmFsdWUgZnJvbSB0aGUgbWV0aG9kLCBhbiBlcnJvciBmcm9tIHRoZSBtZXRob2QsIG9yIGFuIGVycm9yIGZyb20gdGhlCitELUJ1cyBkYWVtb24gaW5kaWNhdGluZyB0aGUgc2VydmljZSBmYWlsZWQgaW4gc29tZSB3YXkgKGUuZy4gZHVlIHRvIGNyYXNoaW5nKS4KKworQmVjYXVzZSBvZiB0aGlzLCBzZXJ2aWNlIGltcGxlbWVudGF0aW9ucyBzaG91bGQgYmUgY2FyZWZ1bCB0byBhbHdheXMgcmVwbHkKK2V4YWN0bHkgb25jZSB0byBlYWNoIG1ldGhvZCBjYWxsLiBSZXBseWluZyBhdCB0aGUgZW5kIG9mIGEgbG9uZy1ydW5uaW5nCitvcGVyYXRpb24gaXMgY29ycmVjdCDigJQgdGhlIGNsaWVudCB3aWxsIHBhdGllbnRseSB3YWl0IHVudGlsIHRoZSBvcGVyYXRpb24gaGFzCitmaW5pc2hlZCBhbmQgdGhlIHJlcGx5IGlzIHJlY2VpdmVkLgorCitOb3RlIHRoYXQgRC1CdXMgY2xpZW50IGJpbmRpbmdzIG1heSBpbXBsZW1lbnQgc3ludGhldGljIHRpbWVvdXRzIG9mIHNldmVyYWwKK3RlbnMgb2Ygc2Vjb25kcywgdW5sZXNzIGV4cGxpY2l0bHkgZGlzYWJsZWQgZm9yIGEgY2FsbC4gRm9yIHZlcnkgbG9uZy1ydW5uaW5nCitvcGVyYXRpb25zLCB5b3Ugc2hvdWxkIGRpc2FibGUgdGhlIGNsaWVudCBiaW5kaW5nc+KAmSB0aW1lb3V0IGFuZCBtYWtlIGl0IGNsZWFyCitpbiB0aGUgY2xpZW504oCZcyBVSSB0aGF0IHRoZSBhcHBsaWNhdGlvbiBoYXMgbm90IGZyb3plbiBhbmQgaXMgc2ltcGx5IHJ1bm5pbmcgYQorbG9uZyBvcGVyYXRpb24uCisKK0FuIGFudGktcGF0dGVybiB0byBhdm9pZCBpbiB0aGlzIHNpdHVhdGlvbiBpcyB0byBzdGFydCBhIGxvbmctcnVubmluZyBvcGVyYXRpb24KK3doZW4gYSBtZXRob2QgY2FsbCBpcyByZWNlaXZlZCwgdGhlbiB0byBuZXZlciByZXBseSB0byB0aGUgbWV0aG9kIGNhbGwgYW5kCitpbnN0ZWFkIG5vdGlmeSB0aGUgY2xpZW50IG9mIGNvbXBsZXRpb24gb2YgdGhlIG9wZXJhdGlvbiB2aWEgYSBzaWduYWwuIFRoaXMKK2FwcHJvYWNoIGlzIGluY29ycmVjdCBhcyBzaWduYWwgZW1pc3Npb25zIGRvIG5vdCBoYXZlIGEgb25lLXRvLW9uZSByZWxhdGlvbnNoaXAKK3dpdGggbWV0aG9kIGNhbGxzIOKAlCB0aGUgc2lnbmFsIGNvdWxkIHRoZW9yZXRpY2FsbHkgYmUgZW1pdHRlZCBtdWx0aXBsZSB0aW1lcywgb3IKK25ldmVyLCB3aGljaCB0aGUgY2xpZW50IHdvdWxkIG5vdCBiZSBhYmxlIHRvIGhhbmRsZS4KKworU2ltaWxhcmx5LCB1c2UgYSBELUJ1cyBlcnJvciByZXBseSB0byBzaWduaWZ5IGZhaWx1cmUgb2YgYW4gb3BlcmF0aW9uIHRyaWdnZXJlZAorYnkgYSBtZXRob2QgY2FsbCwgcmF0aGVyIHRoYW4gdXNpbmcgYSBjdXN0b20gZXJyb3IgY29kZSBpbiB0aGUgbWV0aG9k4oCZcworcmVwbHkuIFRoaXMgbWVhbnMgdGhhdCBhIHJlcGx5IGFsd2F5cyBpbmRpY2F0ZXMgc3VjY2VzcywgYW5kIGFuIGVycm9yIGFsd2F5cworaW5kaWNhdGVzIGZhaWx1cmUg4oCUIHJhdGhlciB0aGFuIGEgcmVwbHkgaW5kaWNhdGluZyBlaXRoZXIgZGVwZW5kaW5nIG9uIGl0cworcGFyYW1ldGVycywgYW5kIGhhdmluZyB0byByZXR1cm4gZHVtbXkgdmFsdWVzIGluIHRoZSBvdGhlciBwYXJhbWV0ZXJzLiBVc2luZworRC1CdXMgZXJyb3IgcmVwbGllcyBhbHNvIG1lYW5zIHN1Y2ggZmFpbHVyZXMgY2FuIGJlIGhpZ2hsaWdodGVkIGluIGRlYnVnZ2luZwordG9vbHMsIHNpbXBsaWZ5aW5nIGRlYnVnZ2luZy4KKworQ2xpZW50cyBzaG91bGQgaGFuZGxlIGFsbCBwb3NzaWJsZSBzdGFuZGFyZCBhbmQgZG9jdW1lbnRlZCBELUJ1cyBlcnJvcnMgZm9yIGVhY2gKK21ldGhvZCBjYWxsLiBJUEMgaW5oZXJlbnRseSBoYXMgbW9yZSBwb3RlbnRpYWwgZmFpbHVyZXMgdGhhbiBub3JtYWwgQyBmdW5jdGlvbgorY2FsbHMsIGFuZCBjbGllbnRzIHNob3VsZCBiZSBwcmVwYXJlZCB0byBoYW5kbGUgYWxsIG9mIHRoZW0gZ3JhY2VmdWxseS4KKworPT09IFVzaW5nIFN0YW5kYXJkIEludGVyZmFjZXMKKyAgICBbaWQ9InN0YW5kYXJkLWludGVyZmFjZXMiXQorCitVc2Ugc3RhbmRhcmQgRC1CdXMgaW50ZXJmYWNlcyB3aGVyZSBwb3NzaWJsZS4KKworPT09PSBQcm9wZXJ0aWVzCisgICAgIFtpZD0iaW50ZXJmYWNlLXByb3BlcnRpZXMiXQorCitUaGUgRC1CdXMgc3BlY2lmaWNhdGlvbiBkZWZpbmVzIHRoZQorJGxpbmtbPj5odHRwOi8vZGJ1cy5mcmVlZGVza3RvcC5vcmcvZG9jL2RidXMtc3BlY2lmaWNhdGlvbi5odG1sI3N0YW5kYXJkLWludGVyZmFjZXMtcHJvcGVydGllc10oJGNvZGUob3JnLmZyZWVkZXNrdG9wLkRCdXMuUHJvcGVydGllcykpCitpbnRlcmZhY2UsIHdoaWNoIHNob3VsZCBiZSB1c2VkIGJ5IGFsbCBvYmplY3RzIHRvIG5vdGlmeSBjbGllbnRzIG9mIGNoYW5nZXMKK3RvIHRoZWlyIHByb3BlcnR5IHZhbHVlcywgd2l0aCB0aGUgJGNvZGUoUHJvcGVydGllc0NoYW5nZWQpIHNpZ25hbC4gVGhpcyBzaWduYWwKK2VsaW1pbmF0ZXMgdGhlIG5lZWQgZm9yIGluZGl2aWR1YWwgJGNvZGUoJHZhcihQcm9wZXJ0eU5hbWUpQ2hhbmdlZCkgc2lnbmFscywgYW5kCithbGxvd3MgbXVsdGlwbGUgcHJvcGVydGllcyB0byBiZSBub3RpZmllZCBpbiBhIHNpbmdsZSBzaWduYWwgZW1pc3Npb24sIHJlZHVjaW5nCitJUEMgcm91bmQgdHJpcHMuIFNpbWlsYXJseSwgdGhlICRjb2RlKEdldCkgYW5kICRjb2RlKFNldCkgbWV0aG9kcyBjYW4gYmUgdXNlZCB0bworbWFuaXB1bGF0ZSBwcm9wZXJ0aWVzIG9uIGFuIG9iamVjdCwgZWxpbWluYXRpbmcgcmVkdW5kYW50CiskY29kZShHZXQkdmFyKFByb3BlcnR5TmFtZSkpIGFuZCAkY29kZShTZXQkdmFyKFByb3BlcnR5TmFtZSkpIG1ldGhvZHMuCisKK1tleGFtcGxlXQorICBGb3IgZXhhbXBsZSwgY29uc2lkZXIgYW4gb2JqZWN0IGltcGxlbWVudGluZyBhbiBpbnRlcmZhY2UKKyAgJGNvZGUoY29tLmV4YW1wbGUuTXlTZXJ2aWNlMS5Tb21lSW50ZXJmYWNlKSB3aXRoIG1ldGhvZHM6CisgIFtsaXN0XQorICAqICRjb2RlKEdldE5hbWUoKSDihpIgKHMpKQorICAqICRjb2RlKFNldE5hbWUocykg4oaSICgpKQorICAqICRjb2RlKEdldFN0YXR1cygpIOKGkiAodSkpCisgICogJGNvZGUoUnVuT3BlcmF0aW9uKHNzKSDihpIgKHUpKQorICBhbmQgc2lnbmFsczoKKyAgW2xpc3RdCisgICogJGNvZGUoTmFtZUNoYW5nZWQodSkpCisgICogJGNvZGUoU3RhdHVzQ2hhbmdlZCh1KSkKKworICBUaGUgaW50ZXJmYWNlIGNvdWxkIGJlIGN1dCBkb3duIHRvIGEgc2luZ2xlIG1ldGhvZDoKKyAgW2xpc3RdCisgICogJGNvZGUoUnVuT3BlcmF0aW9uKHNzKSDihpIgKHUpKQorICBUaGUgb2JqZWN0IGNvdWxkIHRoZW4gaW1wbGVtZW50IHRoZSAkY29kZShvcmcuZnJlZWRlc2t0b3AuREJ1cy5Qcm9wZXJ0aWVzKQorICBpbnRlcmZhY2UgYW5kIGRlZmluZSBwcm9wZXJ0aWVzOgorICBbbGlzdF0KKyAgKiAkY29kZShOYW1lKSBvZiB0eXBlICRjb2RlKHMpLCByZWFk4oCTd3JpdGUKKyAgKiAkY29kZShTdGF0dXMpIG9mIHR5cGUgJGNvZGUodSksIHJlYWQtb25seQorCisgIFRoZSAkY29kZShOYW1lQ2hhbmdlZCkgYW5kICRjb2RlKFN0YXR1c0NoYW5nZWQpIHNpZ25hbHMgd291bGQgYmUgcmVwbGFjZWQgYnkKKyAgJGNvZGUob3JnLmZyZWVkZXNrdG9wLkRCdXMuUHJvcGVydGllcy5Qcm9wZXJ0aWVzQ2hhbmdlZCkuCisKKz09PT0gT2JqZWN0IE1hbmFnZXIKKyAgICAgW2lkPSJpbnRlcmZhY2Utb2JqZWN0LW1hbmFnZXIiXQorCitUaGUgc3BlY2lmaWNhdGlvbiBhbHNvIGRlZmluZXMgdGhlCiskbGlua1s+Pmh0dHA6Ly9kYnVzLmZyZWVkZXNrdG9wLm9yZy9kb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLmh0bWwjc3RhbmRhcmQtaW50ZXJmYWNlcy1vYmplY3RtYW5hZ2VyXSgkY29kZShvcmcuZnJlZWRlc2t0b3AuREJ1cy5PYmplY3RNYW5hZ2VyKSkKK2ludGVyZmFjZSwgd2hpY2ggc2hvdWxkIGJlIHVzZWQgd2hlbmV2ZXIgYSBzZXJ2aWNlIG5lZWRzIHRvIGV4cG9zZSBhIHZhcmlhYmxlCitudW1iZXIgb2Ygb2JqZWN0cyBvZiB0aGUgc2FtZSBjbGFzcyBpbiBhIGZsYXQgb3IgdHJlZS1saWtlIHN0cnVjdHVyZSwgYW5kCitjbGllbnRzIGFyZSBleHBlY3RlZCB0byBiZSBpbnRlcmVzdGVkIGluIG1vc3Qgb3IgYWxsIG9mIHRoZSBvYmplY3RzLiBGb3IKK2V4YW1wbGUsIHRoaXMgY291bGQgYmUgdXNlZCBieSBhbiBhZGRyZXNzIGJvb2sgc2VydmljZSB3aGljaCBleHBvc2VzIG11bHRpcGxlCithZGRyZXNzIGJvb2tzLCBlYWNoIGFzIGEgc2VwYXJhdGUgb2JqZWN0LiBUaGUgJGNvZGUoR2V0TWFuYWdlZE9iamVjdHMpIG1ldGhvZAorYWxsb3dzIHRoZSBmdWxsIG9iamVjdCB0cmVlIHRvIGJlIHF1ZXJpZWQsIHJldHVybmluZyBhbGwgdGhlIG9iamVjdHPigJkgcHJvcGVydGllcwordG9vLCBlbGltaW5hdGluZyB0aGUgbmVlZCBmb3IgZnVydGhlciBJUEMgcm91bmQgdHJpcHMgdG8gcXVlcnkgdGhlIHByb3BlcnRpZXMuCisKK0lmIGNsaWVudHMgYXJlIG5vdCBleHBlY3RlZCB0byBiZSBpbnRlcmVzdGVkIGluIG1vc3Qgb2YgdGhlIGV4cG9zZWQgb2JqZWN0cywKKyRjb2RlKE9iamVjdE1hbmFnZXIpIHNob3VsZCAkZW0obm90KSBiZSB1c2VkLCBhcyBpdCB3aWxsIHNlbmQgYWxsIG9mIHRoZSBvYmplY3RzCit0byBlYWNoIGNsaWVudCBhbnl3YXksIHdhc3RpbmcgYnVzIGJhbmR3aWR0aC4gQSBmaWxlIG1hbmFnZXIsIHRoZXJlZm9yZSwgc2hvdWxkCitub3QgZXhwb3NlIHRoZSBlbnRpcmUgZmlsZSBzeXN0ZW0gaGllcmFyY2h5IHVzaW5nICRjb2RlKE9iamVjdE1hbmFnZXIpLgorCitbZXhhbXBsZV0KKyAgRm9yIGV4YW1wbGUsIGNvbnNpZGVyIGFuIG9iamVjdCBpbXBsZW1lbnRpbmcgYW4gaW50ZXJmYWNlCisgICRjb2RlKGNvbS5leGFtcGxlLk15U2VydmljZTEuQWRkcmVzc0Jvb2tNYW5hZ2VyKSB3aXRoIG1ldGhvZHM6CisgIFtsaXN0XQorICAqICRjb2RlKEdldEFkZHJlc3NCb29rcygpIOKGkiAoYW8pKQorICBhbmQgc2lnbmFsczoKKyAgW2xpc3RdCisgICogJGNvZGUoQWRkcmVzc0Jvb2tBZGRlZChvKSkKKyAgKiAkY29kZShBZGRyZXNzQm9va1JlbW92ZWQobykpCisKKyAgSWYgdGhlIG1hbmFnZXIgb2JqZWN0IGlzIGF0IHBhdGgKKyAgJGNvZGUoL2NvbS9leGFtcGxlL015U2VydmljZTEvQWRkcmVzc0Jvb2tNYW5hZ2VyKSwgZWFjaCBhZGRyZXNzIGJvb2sgaXMgYQorICBjaGlsZCBvYmplY3QsIGUuZy4KKyAgJGNvZGUoL2NvbS9leGFtcGxlL015U2VydmljZTEvQWRkcmVzc0Jvb2tNYW5hZ2VyL1NvbWVBZGRyZXNzQm9vaykuCisKKyAgVGhlIGludGVyZmFjZSBjb3VsZCBiZSBlbGltaW5hdGVkLCBhbmQgdGhlCisgICRjb2RlKG9yZy5mcmVlZGVza3RvcC5EQnVzLk9iamVjdE1hbmFnZXIpIGludGVyZmFjZSBpbXBsZW1lbnRlZCBvbiB0aGUgbWFuYWdlcgorICBvYmplY3QgaW5zdGVhZC4KKworICBDYWxscyB0byAkY29kZShHZXRBZGRyZXNzQm9va3MpIHdvdWxkIGJlY29tZSBjYWxscyB0byAkY29kZShHZXRNYW5hZ2VkT2JqZWN0cykKKyAgYW5kIGVtaXNzaW9ucyBvZiB0aGUgJGNvZGUoQWRkcmVzc0Jvb2tBZGRlZCkgYW5kICRjb2RlKEFkZHJlc3NCb29rUmVtb3ZlZCkKKyAgc2lnbmFscyB3b3VsZCBiZWNvbWUgZW1pc3Npb25zIG9mICRjb2RlKEludGVyZmFjZXNBZGRlZCkgYW5kCisgICRjb2RlKEludGVyZmFjZXNSZW1vdmVkKS4KKworPT09IE5hbWluZyBDb252ZW50aW9ucworICAgIFtpZD0ibmFtaW5nLWNvbnZlbnRpb25zIl0KKworQWxsIEQtQnVzIG5hbWVzLCBmcm9tIHNlcnZpY2UgbmFtZXMgdGhyb3VnaCB0byBtZXRob2QgcGFyYW1ldGVycywgZm9sbG93IGEgc2V0CitvZiBjb252ZW50aW9ucy4gRm9sbG93aW5nIHRoZXNlIGNvbnZlbnRpb25zIG1ha2VzIEFQSXMgbW9yZSBuYXR1cmFsIHRvIHVzZSBhbmQKK2NvbnNpc3RlbnQgd2l0aCBhbGwgb3RoZXIgc2VydmljZXMgb24gdGhlIHN5c3RlbS4KKworU2VydmljZXMgdXNlIHJldmVyc2UtZG9tYWluLW5hbWUgbm90YXRpb24sIGJhc2VkIG9uIHRoZSBkb21haW4gbmFtZSBvZiB0aGUKK3Byb2plY3QgcHJvdmlkaW5nIHRoZSBzZXJ2aWNlIChhbGwgaW4gbG93ZXIgY2FzZSksIHBsdXMgYSB1bmlxdWUgbmFtZSBmb3IgdGhlCitzZXJ2aWNlIChpbiBjYW1lbCBjYXNlKS4KKworW2V4YW1wbGVdCisgIEZvciBleGFtcGxlLCB2ZXJzaW9uIDIgb2YgYW4gYWRkcmVzcyBib29rIGFwcGxpY2F0aW9uIGNhbGxlZCAkY29kZShDb250YWN0RGV4KQorICBwcm92aWRlZCBieSBhIHNvZnR3YXJlIHZlbmRvciB3aG9zZSB3ZWJzaXRlIGlzICRjb2RlKGNob2NvbGF0ZXRlYXBvdC5jb20pCisgIHdvdWxkIHVzZSBzZXJ2aWNlIG5hbWUgJGNvZGUoY29tLmNob2NvbGF0ZXRlYXBvdC5Db250YWN0RGV4MikuCisKK0FsbW9zdCBhbGwgbmFtZXMgdXNlIGNhbWVsIGNhc2Ugd2l0aCBubyB1bmRlcnNjb3JlcywgYXMgaW4gdGhlIGV4YW1wbGVzIGJlbG93LgorTWV0aG9kIGFuZCBzaWduYWwgcGFyYW1ldGVycyBhcmUgYW4gZXhjZXB0aW9uLCB1c2luZworJGNvZGUobG93ZXJjYXNlX3dpdGhfdW5kZXJzY29yZXMpLiBUeXBlIGluZm9ybWF0aW9uIGlzIG5ldmVyIGVuY29kZWQgaW4gdGhlCitwYXJhbWV0ZXIgbmFtZSAoaS5lLiAkZW0obm90KQorJGxpbmtbPj5odHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0h1bmdhcmlhbl9ub3RhdGlvbl0oSHVuZ2FyaWFuIG5vdGF0aW9uKSkuCisKK1tleGFtcGxlXQorICBbdGVybXNdCisgIC0gU2VydmljZSBOYW1lCisgICogJGNvZGUoY29tLmV4YW1wbGUuTXlTZXJ2aWNlMSkKKyAgLSBJbnRlcmZhY2UgTmFtZQorICAqICRjb2RlKGNvbS5leGFtcGxlLk15U2VydmljZTEuU29tZUludGVyZmFjZSkKKyAgLSBPYmplY3QgUGF0aCAoUm9vdCBPYmplY3QpCisgICogJGNvZGUoL2NvbS9leGFtcGxlL015U2VydmljZTEpCisgIC0gT2JqZWN0IFBhdGggKENoaWxkIE9iamVjdCkKKyAgKiAkY29kZSgvY29tL2V4YW1wbGUvTXlTZXJ2aWNlMS9Tb21lQ2hpbGQpCisgIC0gT2JqZWN0IFBhdGggKEdyYW5kY2hpbGQgT2JqZWN0KQorICAqICRjb2RlKC9jb20vZXhhbXBsZS9NeVNlcnZpY2UxL0Fub3RoZXJDaGlsZC9HcmFuZGNoaWxkMSkKKyAgLSBNZXRob2QgTmFtZQorICAqICRjb2RlKGNvbS5leGFtcGxlLk15U2VydmljZTEuU29tZUludGVyZmFjZS5NZXRob2ROYW1lKQorICAtIFNpZ25hbCBOYW1lCisgICogJGNvZGUoY29tLmV4YW1wbGUuTXlTZXJ2aWNlMS5Tb21lSW50ZXJmYWNlLlNpZ25hbE5hbWUpCisgIC0gUHJvcGVydHkgTmFtZQorICAqICRjb2RlKGNvbS5leGFtcGxlLk15U2VydmljZTEuU29tZUludGVyZmFjZS5Qcm9wZXJ0eU5hbWUpCisKK1NlZSBhbHNvOiAkbGlua1s+I2FwaS12ZXJzaW9uaW5nXS4KKworPT0gQ29kZSBnZW5lcmF0aW9uCisgICBbaWQ9ImNvZGUtZ2VuZXJhdGlvbiJdCisKK1JhdGhlciB0aGFuIG1hbnVhbGx5IGltcGxlbWVudGluZyBib3RoIHRoZSBzZXJ2ZXIgYW5kIGNsaWVudCBzaWRlcyBvZiBhIEQtQnVzCitpbnRlcmZhY2UsIGl0IGlzIG9mdGVuIGVhc2llciB0byB3cml0ZSB0aGUgaW50ZXJmYWNlIFhNTCBkZXNjcmlwdGlvbiBhbmQgdXNlIGEKK3Rvb2wgc3VjaCBhcworJGxpbmtbPj5odHRwczovL2RldmVsb3Blci5nbm9tZS5vcmcvZ2lvL3N0YWJsZS9nZGJ1cy1jb2RlZ2VuLmh0bWxdKCRjbWQoZ2RidXMtY29kZWdlbikpCit0byBnZW5lcmF0ZSB0eXBlLXNhZmUgQyBBUElzLCB0aGVuIGJ1aWxkIHRoZSBpbXBsZW1lbnRhdGlvbiB1c2luZyB0aG9zZS4gVGhpcworYXZvaWRzIHRoZSB0ZWRpb3VzIGFuZCBlcnJvci1wcm9uZSBwcm9jZXNzIG9mIHdyaXRpbmcgY29kZSB0byBidWlsZCBhbmQgcmVhZAorRC1CdXMgcGFyYW1ldGVyIHZhcmlhbnRzIGZvciBlYWNoIG1ldGhvZCBjYWxsLgorCitVc2Ugb2YgY29kZSBnZW5lcmF0b3JzIGlzIGJleW9uZCB0aGUgc2NvcGUgb2YgdGhpcyBndWlkZTsgZm9yIG1vcmUgaW5mb3JtYXRpb24sCitzZWUgdGhlCiskbGlua1s+Pmh0dHBzOi8vZGV2ZWxvcGVyLmdub21lLm9yZy9naW8vc3RhYmxlL2dkYnVzLWNvZGVnZW4uaHRtbF0oJGNtZChnZGJ1cy1jb2RlZ2VuKQorbWFudWFsKS4KKworPT0gQW5ub3RhdGlvbnMKKyAgIFtpZD0iYW5ub3RhdGlvbnMiXQorCitBbm5vdGF0aW9ucyBtYXkgYmUgYWRkZWQgdG8gdGhlIGludGVyZmFjZSBYTUwgdG8gZXhwb3NlIG1ldGFkYXRhIG9uIHRoZSBBUEkKK3doaWNoIGNhbiBiZSB1c2VkIGJ5IGRvY3VtZW50YXRpb24gb3IgY29kZSBnZW5lcmF0aW9uIHRvb2xzIHRvIG1vZGlmeSB0aGVpcgorb3V0cHV0LiBTb21lIHN0YW5kYXJkIGFubm90YXRpb25zIGFyZSBnaXZlbiBpbiB0aGUKKyRsaW5rWz4+aHR0cDovL2RidXMuZnJlZWRlc2t0b3Aub3JnL2RvYy9kYnVzLXNwZWNpZmljYXRpb24uaHRtbCNpbnRyb3NwZWN0aW9uLWZvcm1hdF0oRC1CdXMKK3NwZWNpZmljYXRpb24pLCBidXQgZnVydGhlciBhbm5vdGF0aW9ucyBtYXkgYmUgZGVmaW5lZCBieSBzcGVjaWZpYyB0b29scy4KKworRm9yIGV4YW1wbGUsICRjbWQoZ2RidXMtY29kZWdlbikgZGVmaW5lcyBzZXZlcmFsIHVzZWZ1bCBhbm5vdGF0aW9ucywgbGlzdGVkIG9uCitpdHMgbWFuIHBhZ2UuCisKK1RoZSBmb2xsb3dpbmcgYW5ub3RhdGlvbnMgYXJlIHRoZSBtb3N0IHVzZWZ1bDoKKworW3Rlcm1zXQorLSAkY29kZShvcmcuZnJlZWRlc2t0b3AuREJ1cy5EZXByZWNhdGVkKQorKiBNYXJrIGEgc3ltYm9sIGFzIGRlcHJlY2F0ZWQuIFRoaXMgc2hvdWxkIGJlIHVzZWQgd2hlbmV2ZXIgdGhlIEFQSSBpcyBjaGFuZ2VkLAorICBzcGVjaWZ5aW5nIHRoZSB2ZXJzaW9uIGludHJvZHVjaW5nIHRoZSBkZXByZWNhdGlvbiwgdGhlIHJlYXNvbiBmb3IKKyAgZGVwcmVjYXRpb24sIGFuZCBhIHJlcGxhY2VtZW50IHN5bWJvbCB0byB1c2UuCistICRjb2RlKG9yZy5ndGsuR0RCdXMuU2luY2UpCisqIE1hcmsgYSBzeW1ib2wgYXMgaGF2aW5nIGJlZW4gYWRkZWQgdG8gdGhlIEFQSSBhZnRlciB0aGUgaW5pdGlhbCByZWxlYXNlLiBUaGlzCisgIHNob3VsZCBpbmNsdWRlIHRoZSB2ZXJzaW9uIHRoZSBzeW1ib2wgd2FzIGZpcnN0IGFkZGVkIGluLgorLSAkY29kZShvcmcuZ3RrLkdEQnVzLkMuTmFtZSkgYW5kICRjb2RlKG9yZy5mcmVlZGVza3RvcC5EQnVzLkdMaWIuQ1N5bWJvbCkKKyogQm90aCB1c2VkIGludGVyY2hhbmdlYWJseSB0byBoaW50IGF0IGEgQyBmdW5jdGlvbiBuYW1lIHRvIHVzZSB3aGVuIGdlbmVyYXRpbmcKKyAgY29kZSBmb3IgYSBzeW1ib2wuIFVzZSBvZiB0aGlzIGFubm90YXRpb24gY2FuIG1ha2UgZ2VuZXJhdGVkIGJpbmRpbmdzIGEgbG90CisgIG1vcmUgcGxlYXNhbnQgdG8gdXNlLgorLSAkY29kZShvcmcuZnJlZWRlc2t0b3AuREJ1cy5Qcm9wZXJ0eS5FbWl0c0NoYW5nZWRTaWduYWwpCisqIEluZGljYXRlIHdoZXRoZXIgYSBwcm9wZXJ0eSBpcyBleHBlY3RlZCB0byBlbWl0IGNoYW5nZSBzaWduYWxzLiBUaGlzIGNhbgorICBhZmZlY3QgY29kZSBnZW5lcmF0aW9uLCBidXQgaXMgYWxzbyB1c2VmdWwgZG9jdW1lbnRhdGlvbiwgYXMgY2xpZW50IHByb2dyYW1zCisgIHRoZW4ga25vdyB3aGVuIHRvIGV4cGVjdCBwcm9wZXJ0eSBjaGFuZ2Ugbm90aWZpY2F0aW9ucyBhbmQgd2hlbiB0aGV5IGhhdmUgdG8KKyAgcmVxdWVyeS4KKworPT0gRG9jdW1lbnRhdGlvbgorICAgW2lkPSJkb2N1bWVudGF0aW9uIl0KKworQWxzbyBqdXN0IGxpa2UgQyBBUElzLCBELUJ1cyBBUElzIG11c3QgYmUgZG9jdW1lbnRlZC4gVGhlcmUgYXJlIHNldmVyYWwgbWV0aG9kcworZm9yIGRvY3VtZW50aW5nIHRoZSBpbnRlcmZhY2VzLCBtZXRob2RzLCBwcm9wZXJ0aWVzIGFuZCBzaWduYWxzIGluIGEgRC1CdXMKK2ludGVyZmFjZSBYTUwgZmlsZSwgZWFjaCB1bmZvcnR1bmF0ZWx5IHdpdGggdGhlaXIgb3duIGRvd25zaWRlcy4gWW91IHNob3VsZAorY2hvb3NlIHRoZSBtZXRob2Qgd2hpY2ggYmVzdCBtYXRjaGVzIHRoZSB0b29saW5nIGFuZCB3b3JrZmxvdyB5b3UgYXJlIHVzaW5nLgorCis9PT0gWE1MIENvbW1lbnRzCisKK1hNTCBjb21tZW50cyBjb250YWluaW5nIGRvY3VtZW50YXRpb24gaW4gdGhlCiskbGlua1s+Pmh0dHBzOi8vZGV2ZWxvcGVyLmdub21lLm9yZy9ndGstZG9jLW1hbnVhbC9zdGFibGUvZG9jdW1lbnRpbmdfc3ludGF4Lmh0bWwuZW5dKGd0ay1kb2MKK2Zvcm1hdCkgaXMgdGhlIHJlY29tbWVuZGVkIGZvcm1hdCBmb3IgdXNlIHdpdGgKKyRsaW5rWz4+aHR0cHM6Ly9kZXZlbG9wZXIuZ25vbWUub3JnL2dpby9zdGFibGUvZ2RidXMtY29kZWdlbi5odG1sXSgkY21kKGdkYnVzLWNvZGVnZW4pKS4KK1VzaW5nICRjbWQoZ2RidXMtY29kZWdlbiksIHRoZXNlIGNvbW1lbnRzIGNhbiBiZSBleHRyYWN0ZWQsIGNvbnZlcnRlZCB0byBEb2NCb29rCitmb3JtYXQgYW5kIGluY2x1ZGVkIGluIHRoZSBwcm9qZWN04oCZcyBBUEkgbWFudWFsLiBGb3IgZXhhbXBsZToKKworW2xpc3RpbmddCisgIFt0aXRsZV0KKyAgICBEb2N1bWVudGF0aW9uIENvbW1lbnRzIGluIEQtQnVzIEludGVyZmFjZSBYTUwKKyAgW2Rlc2NdCisgICAgRXhhbXBsZSBndGstZG9j4oCTc3R5bGUgZG9jdW1lbnRhdGlvbiBjb21tZW50cyBpbiB0aGUgaW50cm9zcGVjdGlvbiBYTUwgZm9yCisgICAgdGhlICRjb2RlKG9yZy5mcmVlZGVza3RvcC5EQnVzLlByb3BlcnRpZXMpIGludGVyZmFjZS4KKyAgW2NvZGUgbWltZT0iYXBwbGljYXRpb24veG1sIl0KKyAgICA8IS0tCisgICAgICAgIG9yZy5mcmVlZGVza3RvcC5EQnVzLlByb3BlcnRpZXM6CisgICAgICAgIEBzaG9ydF9kZXNjcmlwdGlvbjogU3RhbmRhcmQgcHJvcGVydHkgZ2V0dGVyL3NldHRlciBpbnRlcmZhY2UKKworICAgICAgICBJbnRlcmZhY2UgZm9yIGFsbCBvYmplY3RzIHdoaWNoIGV4cG9zZSBwcm9wZXJ0aWVzIG9uIHRoZSBidXMsIGFsbG93aW5nCisgICAgICAgIHRob3NlIHByb3BlcnRpZXMgdG8gYmUgZ290LCBzZXQsIGFuZCBzaWduYWxzIGVtaXR0ZWQgdG8gbm90aWZ5IG9mIGNoYW5nZXMKKyAgICAgICAgdG8gdGhlIHByb3BlcnR5IHZhbHVlcy4KKyAgICAtLT4KKyAgICA8aW50ZXJmYWNlIG5hbWU9Im9yZy5mcmVlZGVza3RvcC5EQnVzLlByb3BlcnRpZXMiPgorICAgICAgPCEtLQorICAgICAgICAgIEdldDoKKyAgICAgICAgICBAaW50ZXJmYWNlX25hbWU6IE5hbWUgb2YgdGhlIGludGVyZmFjZSB0aGUgcHJvcGVydHkgaXMgZGVmaW5lZCBvbi4KKyAgICAgICAgICBAcHJvcGVydHlfbmFtZTogTmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LgorICAgICAgICAgIEB2YWx1ZTogUHJvcGVydHkgdmFsdWUsIHdyYXBwZWQgaW4gYSB2YXJpYW50LgorCisgICAgICAgICAgUmV0cmlldmVzIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgYXQgQHByb3BlcnR5X25hbWUgb24KKyAgICAgICAgICBAaW50ZXJmYWNlX25hbWUgb24gdGhpcyBvYmplY3QuIElmIEBpbnRlcmZhY2VfbmFtZSBpcyBhbiBlbXB0eSBzdHJpbmcsCisgICAgICAgICAgYWxsIGludGVyZmFjZXMgd2lsbCBiZSBzZWFyY2hlZCBmb3IgQHByb3BlcnR5X25hbWU7IGlmIG11bHRpcGxlCisgICAgICAgICAgcHJvcGVydGllcyBtYXRjaCwgdGhlIHJlc3VsdCBpcyB1bmRlZmluZWQuCisKKyAgICAgICAgICBJZiBAaW50ZXJmYWNlX25hbWUgb3IgQHByb3BlcnR5X25hbWUgZG8gbm90IGV4aXN0LCBhCisgICAgICAgICAgI29yZy5mcmVlZGVza3RvcC5EQnVzLkVycm9yLkludmFsaWRBcmdzIGVycm9yIGlzIHJldHVybmVkLgorICAgICAgLS0+CisgICAgICA8bWV0aG9kIG5hbWU9IkdldCI+CisgICAgICAgIDxhcmcgdHlwZT0icyIgbmFtZT0iaW50ZXJmYWNlX25hbWUiIGRpcmVjdGlvbj0iaW4iLz4KKyAgICAgICAgPGFyZyB0eXBlPSJzIiBuYW1lPSJwcm9wZXJ0eV9uYW1lIiBkaXJlY3Rpb249ImluIi8+CisgICAgICAgIDxhcmcgdHlwZT0idiIgbmFtZT0idmFsdWUiIGRpcmVjdGlvbj0ib3V0Ii8+CisgICAgICA8L21ldGhvZD4KKworICAgICAgPCEtLQorICAgICAgICAgIFByb3BlcnRpZXNDaGFuZ2VkOgorICAgICAgICAgIEBpbnRlcmZhY2VfbmFtZTogTmFtZSBvZiB0aGUgaW50ZXJmYWNlIHRoZSBwcm9wZXJ0aWVzIGNoYW5nZWQgb24uCisgICAgICAgICAgQGNoYW5nZWRfcHJvcGVydGllczogTWFwIG9mIHByb3BlcnR5IG5hbWUgdG8gdXBkYXRlZCB2YWx1ZSBmb3IgdGhlCisgICAgICAgICAgICBjaGFuZ2VkIHByb3BlcnRpZXMuCisgICAgICAgICAgQGludmFsaWRhdGVkX3Byb3BlcnRpZXM6IExpc3Qgb2YgbmFtZXMgb2Ygb3RoZXIgcHJvcGVydGllcyB3aGljaCBoYXZlCisgICAgICAgICAgICBjaGFuZ2VkLCBidXQgd2hvc2UgdXBkYXRlZCB2YWx1ZXMgYXJlIG5vdCBub3RpZmllZC4KKworICAgICAgICAgIEVtaXR0ZWQgd2hlbiBvbmUgb3IgbW9yZSBwcm9wZXJ0aWVzIGNoYW5nZSB2YWx1ZXMgb24gQGludGVyZmFjZV9uYW1lLgorICAgICAgICAgIEEgcHJvcGVydHkgbWF5IGJlIGxpc3RlZCBpbiBAY2hhbmdlZF9wcm9wZXJ0aWVzIG9yCisgICAgICAgICAgQGludmFsaWRhdGVkX3Byb3BlcnRpZXMgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIHNlcnZpY2Ugd2FudHMgdG8KKyAgICAgICAgICBicm9hZGNhc3QgdGhlIHByb3BlcnR54oCZcyBuZXcgdmFsdWUuIElmIGEgdmFsdWUgaXMgbGFyZ2Ugb3IgaW5mcmVxdWVudGx5CisgICAgICAgICAgdXNlZCwgdGhlIHNlcnZpY2UgbWlnaHQgbm90IHdhbnQgdG8gYnJvYWRjYXN0IGl0LCBhbmQgd2lsbCB3YWl0IGZvcgorICAgICAgICAgIGNsaWVudHMgdG8gcmVxdWVzdCBpdCBpbnN0ZWFkLgorICAgICAgLS0+CisgICAgICA8c2lnbmFsIG5hbWU9IlByb3BlcnRpZXNDaGFuZ2VkIj4KKyAgICAgICAgPGFyZyB0eXBlPSJzIiBuYW1lPSJpbnRlcmZhY2VfbmFtZSIvPgorICAgICAgICA8YXJnIHR5cGU9ImF7c3Z9IiBuYW1lPSJjaGFuZ2VkX3Byb3BlcnRpZXMiLz4KKyAgICAgICAgPGFyZyB0eXBlPSJhcyIgbmFtZT0iaW52YWxpZGF0ZWRfcHJvcGVydGllcyIvPgorICAgICAgPC9zaWduYWw+CisgICAgPC9pbnRlcmZhY2U+CisKK1tjb21tZW50XQorICBGSVhNRTogVGhpcyBpcyBvbmx5IHByZXNlbnQgdG8gZml4CisgICRsaW5rWz4+aHR0cHM6Ly9naXRodWIuY29tL3Byb2plY3RtYWxsYXJkL21hbGxhcmQtZHVja3R5cGUvaXNzdWVzLzJdLgorCis9PT0gWE1MIEFubm90YXRpb25zCisKK0RvY3VtZW50YXRpb24gY2FuIGFsc28gYmUgYWRkZWQgYXMgYW5ub3RhdGlvbiBlbGVtZW50cyBpbiB0aGUgWE1MLiBUaGlzIGZvcm1hdAoraXMgYWxzbyBzdXBwb3J0ZWQgYnkgJGNtZChnZGJ1cy1jb2RlZ2VuKSwgYnV0IGd0ay1kb2MgY29tbWVudHMgYXJlIHByZWZlcnJlZC4KK0ZvciBleGFtcGxlOgorCitbbGlzdGluZ10KKyAgW3RpdGxlXQorICAgIERvY3VtZW50YXRpb24gQW5ub3RhdGlvbnMgaW4gRC1CdXMgSW50ZXJmYWNlIFhNTAorICBbZGVzY10KKyAgICBFeGFtcGxlIEdEQnVzIGRvY3VtZW50YXRpb24gYW5ub3RhdGlvbnMgaW4gdGhlIGludHJvc3BlY3Rpb24gWE1MIGZvcgorICAgIHRoZSAkY29kZShvcmcuZnJlZWRlc2t0b3AuREJ1cy5Qcm9wZXJ0aWVzKSBpbnRlcmZhY2UuCisgIFtjb2RlIG1pbWU9ImFwcGxpY2F0aW9uL3htbCJdCisgICAgPGludGVyZmFjZSBuYW1lPSJvcmcuZnJlZWRlc2t0b3AuREJ1cy5Qcm9wZXJ0aWVzIj4KKyAgICAgIDxhbm5vdGF0aW9uIG5hbWU9Im9yZy5ndGsuR0RCdXMuRG9jU3RyaW5nIiB2YWx1ZT0iSW50ZXJmYWNlIGZvciBhbGwKKyAgICAgICAgb2JqZWN0cyB3aGljaCBleHBvc2UgcHJvcGVydGllcyBvbiB0aGUgYnVzLCBhbGxvd2luZyB0aG9zZSBwcm9wZXJ0aWVzIHRvCisgICAgICAgIGJlIGdvdCwgc2V0LCBhbmQgc2lnbmFscyBlbWl0dGVkIHRvIG5vdGlmeSBvZiBjaGFuZ2VzIHRvIHRoZSBwcm9wZXJ0eQorICAgICAgICB2YWx1ZXMuIi8+CisgICAgICA8YW5ub3RhdGlvbiBuYW1lPSJvcmcuZ3RrLkdEQnVzLkRvY1N0cmluZy5TaG9ydCIKKyAgICAgICAgdmFsdWU9IlN0YW5kYXJkIHByb3BlcnR5IGdldHRlci9zZXR0ZXIgaW50ZXJmYWNlIi8+CisKKyAgICAgIDxtZXRob2QgbmFtZT0iR2V0Ij4KKyAgICAgICAgPGFubm90YXRpb24gbmFtZT0ib3JnLmd0ay5HREJ1cy5Eb2NTdHJpbmciIHZhbHVlPSJSZXRyaWV2ZXMgdGhlIHZhbHVlIG9mCisgICAgICAgICAgdGhlIHByb3BlcnR5IGF0IEBwcm9wZXJ0eV9uYW1lIG9uIEBpbnRlcmZhY2VfbmFtZSBvbiB0aGlzIG9iamVjdC4gSWYKKyAgICAgICAgICBAaW50ZXJmYWNlX25hbWUgaXMgYW4gZW1wdHkgc3RyaW5nLCBhbGwgaW50ZXJmYWNlcyB3aWxsIGJlIHNlYXJjaGVkCisgICAgICAgICAgZm9yIEBwcm9wZXJ0eV9uYW1lOyBpZiBtdWx0aXBsZSBwcm9wZXJ0aWVzIG1hdGNoLCB0aGUgcmVzdWx0IGlzCisgICAgICAgICAgdW5kZWZpbmVkLgorCisgICAgICAgICAgSWYgQGludGVyZmFjZV9uYW1lIG9yIEBwcm9wZXJ0eV9uYW1lIGRvIG5vdCBleGlzdCwgYQorICAgICAgICAgICNvcmcuZnJlZWRlc2t0b3AuREJ1cy5FcnJvci5JbnZhbGlkQXJncyBlcnJvciBpcyByZXR1cm5lZC4iLz4KKworICAgICAgICA8YXJnIHR5cGU9InMiIG5hbWU9ImludGVyZmFjZV9uYW1lIiBkaXJlY3Rpb249ImluIj4KKyAgICAgICAgICA8YW5ub3RhdGlvbiBuYW1lPSJvcmcuZ3RrLkdEQnVzLkRvY1N0cmluZyIKKyAgICAgICAgICAgIHZhbHVlPSJOYW1lIG9mIHRoZSBpbnRlcmZhY2UgdGhlIHByb3BlcnR5IGlzIGRlZmluZWQgb24uIi8+CisgICAgICAgIDwvYXJnPgorCisgICAgICAgIDxhcmcgdHlwZT0icyIgbmFtZT0icHJvcGVydHlfbmFtZSIgZGlyZWN0aW9uPSJpbiI+CisgICAgICAgICAgPGFubm90YXRpb24gbmFtZT0ib3JnLmd0ay5HREJ1cy5Eb2NTdHJpbmciCisgICAgICAgICAgICB2YWx1ZT0iTmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LiIvPgorICAgICAgICA8L2FyZz4KKworICAgICAgICA8YXJnIHR5cGU9InYiIG5hbWU9InZhbHVlIiBkaXJlY3Rpb249Im91dCI+CisgICAgICAgICAgPGFubm90YXRpb24gbmFtZT0ib3JnLmd0ay5HREJ1cy5Eb2NTdHJpbmciCisgICAgICAgICAgICB2YWx1ZT0iUHJvcGVydHkgdmFsdWUsIHdyYXBwZWQgaW4gYSB2YXJpYW50LiIvPgorICAgICAgICA8L2FyZz4KKyAgICAgIDwvbWV0aG9kPgorCisgICAgICA8c2lnbmFsIG5hbWU9IlByb3BlcnRpZXNDaGFuZ2VkIj4KKyAgICAgICAgPGFubm90YXRpb24gbmFtZT0ib3JnLmd0ay5HREJ1cy5Eb2NTdHJpbmciIHZhbHVlPSJFbWl0dGVkIHdoZW4gb25lIG9yCisgICAgICAgICAgbW9yZSBwcm9wZXJ0aWVzIGNoYW5nZSB2YWx1ZXMgb24gQGludGVyZmFjZV9uYW1lLiBBIHByb3BlcnR5IG1heSBiZQorICAgICAgICAgIGxpc3RlZCBpbiBAY2hhbmdlZF9wcm9wZXJ0aWVzIG9yIEBpbnZhbGlkYXRlZF9wcm9wZXJ0aWVzIGRlcGVuZGluZyBvbgorICAgICAgICAgIHdoZXRoZXIgdGhlIHNlcnZpY2Ugd2FudHMgdG8gYnJvYWRjYXN0IHRoZSBwcm9wZXJ0eeKAmXMgbmV3IHZhbHVlLiBJZiBhCisgICAgICAgICAgdmFsdWUgaXMgbGFyZ2Ugb3IgaW5mcmVxdWVudGx5IHVzZWQsIHRoZSBzZXJ2aWNlIG1pZ2h0IG5vdCB3YW50IHRvCisgICAgICAgICAgYnJvYWRjYXN0IGl0LCBhbmQgd2lsbCB3YWl0IGZvciBjbGllbnRzIHRvIHJlcXVlc3QgaXQgaW5zdGVhZC4iLz4KKworICAgICAgICA8YXJnIHR5cGU9InMiIG5hbWU9ImludGVyZmFjZV9uYW1lIj4KKyAgICAgICAgICA8YW5ub3RhdGlvbiBuYW1lPSJvcmcuZ3RrLkdEQnVzLkRvY1N0cmluZyIKKyAgICAgICAgICAgIHZhbHVlPSJOYW1lIG9mIHRoZSBpbnRlcmZhY2UgdGhlIHByb3BlcnRpZXMgY2hhbmdlZCBvbi4iLz4KKyAgICAgICAgPC9hcmc+CisKKyAgICAgICAgPGFyZyB0eXBlPSJhe3N2fSIgbmFtZT0iY2hhbmdlZF9wcm9wZXJ0aWVzIj4KKyAgICAgICAgICA8YW5ub3RhdGlvbiBuYW1lPSJvcmcuZ3RrLkdEQnVzLkRvY1N0cmluZyIKKyAgICAgICAgICAgIHZhbHVlPSJNYXAgb2YgcHJvcGVydHkgbmFtZSB0byB1cGRhdGVkIHZhbHVlIGZvciB0aGUgY2hhbmdlZAorICAgICAgICAgICAgICBwcm9wZXJ0aWVzLiIvPgorICAgICAgICA8L2FyZz4KKworICAgICAgICA8YXJnIHR5cGU9ImFzIiBuYW1lPSJpbnZhbGlkYXRlZF9wcm9wZXJ0aWVzIj4KKyAgICAgICAgICA8YW5ub3RhdGlvbiBuYW1lPSJvcmcuZ3RrLkdEQnVzLkRvY1N0cmluZyIKKyAgICAgICAgICAgIHZhbHVlPSJMaXN0IG9mIG5hbWVzIG9mIG90aGVyIHByb3BlcnRpZXMgd2hpY2ggaGF2ZSBjaGFuZ2VkLCBidXQKKyAgICAgICAgICAgICAgd2hvc2UgdXBkYXRlZCB2YWx1ZXMgYXJlIG5vdCBub3RpZmllZC4iLz4KKyAgICAgICAgPC9hcmc+CisgICAgICA8L3NpZ25hbD4KKyAgICA8L2ludGVyZmFjZT4KKworW2NvbW1lbnRdCisgIEZJWE1FOiBUaGlzIGlzIG9ubHkgcHJlc2VudCB0byBmaXgKKyAgJGxpbmtbPj5odHRwczovL2dpdGh1Yi5jb20vcHJvamVjdG1hbGxhcmQvbWFsbGFyZC1kdWNrdHlwZS9pc3N1ZXMvMl0uCisKKz09IFNlcnZpY2UgZmlsZXMKKyAgIFtpZD0ic2VydmljZS1maWxlcyJdCisKK0VhY2ggRC1CdXMgc2VydmljZSBtdXN0IGluc3RhbGwgYSAkZmlsZSguc2VydmljZSkgZmlsZSBkZXNjcmliaW5nIGl0cyBzZXJ2aWNlCituYW1lIGFuZCB0aGUgY29tbWFuZCB0byBydW4gdG8gc3RhcnQgdGhlIHNlcnZpY2UuIFRoaXMgYWxsb3dzIGZvciBzZXJ2aWNlCithY3RpdmF0aW9uIChzZWUgdGhlCiskbGlua1s+Pmh0dHA6Ly9kYnVzLmZyZWVkZXNrdG9wLm9yZy9kb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLmh0bWwjbWVzc2FnZS1idXMtc3RhcnRpbmctc2VydmljZXNdKEQtQnVzCitzcGVjaWZpY2F0aW9uKSkuCisKK1NlcnZpY2UgZmlsZXMgbXVzdCBiZSBuYW1lZCBhZnRlciB0aGUgc2VydmljZeKAmXMgd2VsbC1rbm93biBuYW1lLCBmb3IgZXhhbXBsZQorZmlsZSAkZmlsZShjb20uZXhhbXBsZS5NeVNlcnZpY2UxLnNlcnZpY2UpIGZvciB3ZWxsLWtub3duIG5hbWUKKyRjb2RlKGNvbS5leGFtcGxlLk15U2VydmljZTEpLiBGaWxlcyBtdXN0IGJlIGluc3RhbGxlZCBpbgorJGZpbGUoJHZhcigkJChkYXRhZGlyKSkvZGJ1cy0xL3NlcnZpY2VzKSBmb3IgdGhlIHNlc3Npb24gYnVzIGFuZAorJGZpbGUoJHZhcigkJChkYXRhZGlyKSkvZGJ1cy0xL3N5c3RlbS1zZXJ2aWNlcykgZm9yIHRoZSBzeXN0ZW0gYnVzLiBOb3RlLCBob3dldmVyLAordGhhdCBzZXJ2aWNlcyBvbiB0aGUgc3lzdGVtIGJ1cyBhbG1vc3QgYWx3YXlzIG5lZWQgYQorJGxpbmtbPiNzZWN1cml0eS1wb2xpY2llc10oc2VjdXJpdHkgcG9saWN5KSBhcyB3ZWxsLgorCis9PSBTZWN1cml0eSBQb2xpY2llcworICAgW2lkPSJzZWN1cml0eS1wb2xpY2llcyJdCisKK0F0IGEgaGlnaCBsZXZlbCwgdGhlIEQtQnVzIHNlY3VyaXR5IG1vZGVsIGlzOgorW2xpc3RdCisqIFRoZXJlIGlzIGEgc3lzdGVtIGJ1cywgYW5kIHplcm8gb3IgbW9yZSBzZXNzaW9uIGJ1c2VzLgorKiBBbnkgcHJvY2VzcyBtYXkgY29ubmVjdCB0byB0aGUgc3lzdGVtIGJ1cy4gVGhlIHN5c3RlbSBidXMgbGltaXRzIHdoaWNoIGNhbiBvd24KKyAgbmFtZXMgb3Igc2VuZCBtZXRob2QgY2FsbHMsIGFuZCBvbmx5IHByb2Nlc3NlcyBydW5uaW5nIGFzIHByaXZpbGVnZWQgdXNlcnMgY2FuCisgIHJlY2VpdmUgdW5pY2FzdCBtZXNzYWdlcyBub3QgYWRkcmVzc2VkIHRvIHRoZW0uIEV2ZXJ5IHByb2Nlc3MgbWF5IHJlY2VpdmUKKyAgYnJvYWRjYXN0cy4KKyogRWFjaCBzZXNzaW9uIGJ1cyBoYXMgYW4gb3duZXIgKGEgdXNlcikuIE9ubHkgaXRzIG93bmVyIG1heSBjb25uZWN0OyBvbgorICBnZW5lcmFsLXB1cnBvc2UgTGludXgsIGEgc2Vzc2lvbiBidXMgaXMgbm90IHRyZWF0ZWQgYXMgYSBwcml2aWxlZ2UgYm91bmRhcnksCisgIHNvIHRoZXJlIGlzIG5vIGZ1cnRoZXIgcHJpdmlsZWdlIHNlcGFyYXRpb24gYmV0d2VlbiBwcm9jZXNzZXMgb24gaXQuCisKK0Z1bGwgY292ZXJhZ2Ugb2Ygc2VjdXJpbmcgRC1CdXMgc2VydmljZXMgaXMgYmV5b25kIHRoZSBzY29wZSBvZiB0aGlzIGd1aWRlLAoraG93ZXZlciB0aGVyZSBhcmUgc29tZSBzdGVwcyB3aGljaCB5b3UgY2FuIHRha2Ugd2hlbiBkZXNpZ25pbmcgYW4gQVBJIHRvIGVhc2UKK3NlY3VyaXR5IHBvbGljeSBpbXBsZW1lbnRhdGlvbi4KKworRC1CdXMgc2VjdXJpdHkgcG9saWNpZXMgYXJlIHdyaXR0ZW4gYXMgWE1MIGZpbGVzIGluCiskZmlsZSgkdmFyKCQkKGRhdGFkaXIpL2RidXMtMS9zeXN0ZW0uZCkpLAorJGZpbGUoJHZhcigkJChkYXRhZGlyKS9kYnVzLTEvc2Vzc2lvbi5kKSksCiskZmlsZSgkdmFyKCQkKHN5c2NvbmZkaXIpL2RidXMtMS9zeXN0ZW0uZCkpIGFuZAorJGZpbGUoJHZhcigkJChzeXNjb25mZGlyKS9kYnVzLTEvc2Vzc2lvbi5kKSkgYW5kIHVzZSBhbiBhbGxvdy9kZW55IG1vZGVsLCB3aGVyZQorZWFjaCBtZXNzYWdlIChtZXRob2QgY2FsbCwgc2lnbmFsIGVtaXNzaW9uLCBldGMuKSBjYW4gYmUgYWxsb3dlZCBvciBkZW5pZWQKK2FjY29yZGluZyB0byB0aGUgc3VtIG9mIGFsbCBwb2xpY3kgcnVsZXMgd2hpY2ggbWF0Y2ggaXQuIEVhY2ggJGNvZGUoPGFsbG93Pikgb3IKKyRjb2RlKDxkZW55PikgcnVsZSBpbiB0aGUgcG9saWN5IHNob3VsZCBoYXZlIHRoZSAkY29kZShvd24pLAorJGNvZGUoc2VuZF9kZXN0aW5hdGlvbikgb3IgJGNvZGUocmVjZWl2ZV9zZW5kZXIpIGF0dHJpYnV0ZSBzZXQuCisKK1doZW4gZGVzaWduaW5nIGFuIEFQSSwgYmVhciBpbiBtaW5kIHRoZSBuZWVkIHRvIHdyaXRlIGFuZCBpbnN0YWxsIHN1Y2ggYQorc2VjdXJpdHkgcG9saWN5LCBhbmQgY29uc2lkZXIgc3BsaXR0aW5nIHVwIG1ldGhvZHMgb3IgcHJvdmlkaW5nIG1vcmUgcmVzdHJpY3RlZAordmVyc2lvbnMgd2hpY2ggYWNjZXB0IGNvbnN0cmFpbmVkIHBhcmFtZXRlcnMsIHNvIHRoYXQgdGhleSBjYW4gYmUgZXhwb3NlZCB3aXRoCitsZXNzIHJlc3RyaWN0aXZlIHNlY3VyaXR5IHBvbGljaWVzIGlmIG5lZWRlZCBieSBsZXNzIHRydXN0ZWQgY2xpZW50cy4gU2luY2UKK2RidXMtZGFlbW9uIDEuMTAsIHNlY3VyaXR5IHBvbGljaWVzIHNob3VsZCBiZSBpbnN0YWxsZWQgdG8KKyRmaWxlKCR2YXIoJCQoZGF0YWRpcikpKSByYXRoZXIgdGhhbiAkKGZpbGUoJHZhcigkJChzeXNjb25mZGlyKSkpOyB0aGUgbGF0dGVyCitpcyBpbnRlbmRlZCBmb3Igc3lzdGVtIGFkbWluaXN0YXRvcnMuCisKK1NlY29uZGx5LCB0aGUgZGVmYXVsdCBELUJ1cyBzZWN1cml0eSBwb2xpY3kgZm9yIHRoZSBzeXN0ZW0gYnVzIGlzIHJlc3RyaWN0aXZlCitlbm91Z2ggdG8gYWxsb3cgc2Vuc2l0aXZlIGRhdGEsIHN1Y2ggYXMgcGFzc3dvcmRzLCB0byBiZSBzYWZlbHkgc2VudCBvdmVyIHRoZQorYnVzIGluIHVuaWNhc3QgbWVzc2FnZXMgKGluY2x1ZGluZyB1bmljYXN0IHNpZ25hbHMpOyBzbyB0aGVyZSBpcyBubyBuZWVkIHRvCitjb21wbGljYXRlIEFQSXMgYnkgaW1wbGVtZW50aW5nIGV4dHJhIHNlY3VyaXR5LiBOb3RlLCBob3dldmVyLCB0aGF0IHNlbnNpdGl2ZQorZGF0YSBtdXN0ICRlbShub3QpIGJlIHNlbnQgaW4gYnJvYWRjYXN0IHNpZ25hbHMsIGFzIHRoZXkgY2FuIGJlIHNlZW4gYnkgYWxsCitwZWVycyBvbiB0aGUgYnVzLiBUaGUgZGVmYXVsdCBwb2xpY3kgZm9yIHRoZSBzZXNzaW9uIGJ1cyBpcyBub3QgcmVzdHJpY3RpdmUsIGJ1dAoraXQgaXMgdHlwaWNhbGx5IG5vdCBhIHNlY3VyaXR5IGJvdW5kYXJ5LgorCis9PSBEZWJ1Z2dpbmcKKyAgIFtpZD0iZGVidWdnaW5nIl0KKworRGVidWdnaW5nIHNlcnZpY2VzIHJ1bm5pbmcgb24gRC1CdXMgY2FuIGJlIHRyaWNreSwgZXNwZWNpYWxseSBpZiB0aGV5IGFyZQorbGF1bmNoZWQgdmlhIHNlcnZpY2UgYWN0aXZhdGlvbiBhbmQgaGVuY2UgaW4gYW4gZW52aXJvbm1lbnQgb3V0IG9mIHlvdXIgY29udHJvbC4KKworVGhyZWUgbWFpbiB0b29scyBhcmUgYXZhaWxhYmxlOiBELUJ1cyBNb25pdG9yLCBCdXN0bGUgYW5kIEQtRmVldC4KKworPT09IEQtQnVzIE1vbml0b3IKKyAgICBbaWQ9ImRidXMtbW9uaXRvciJdCisKKyRsaW5rWz4+aHR0cDovL2RidXMuZnJlZWRlc2t0b3Aub3JnL2RvYy9kYnVzLW1vbml0b3IuMS5odG1sXSgkY21kKGRidXMtbW9uaXRvcikpCitpcyBhIGNvcmUgRC1CdXMgdG9vbCwgYW5kIGFsbG93cyBlYXZlc2Ryb3BwaW5nIG9uIHRoZSBzZXNzaW9uIG9yIHN5c3RlbSBidXMsCitwcmludGluZyBhbGwgbWVzc2FnZXMgaXQgc2Vlcy4gVGhlIG1lc3NhZ2VzIG1heSBiZSBmaWx0ZXJlZCB1c2luZyBhIHN0YW5kYXJkCiskbGlua1s+Pmh0dHA6Ly9kYnVzLmZyZWVkZXNrdG9wLm9yZy9kb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLmh0bWwjbWVzc2FnZS1idXMtcm91dGluZy1tYXRjaC1ydWxlc10oRC1CdXMKK21hdGNoIHJ1bGUpIHRvIG1ha2UgdGhlIHN0cmVhbSBtb3JlIG1hbmFnZWFibGUuCisKK1ByZXZpb3VzIHZlcnNpb25zIG9mIEQtQnVzIGhhdmUgcmVxdWlyZWQgdGhlIHNlY3VyaXR5IHBvbGljeSBmb3IgdGhlIHN5c3RlbSBidXMKK3RvIGJlIG1hbnVhbGx5IHJlbGF4ZWQgdG8gYWxsb3cgZWF2ZXNkcm9wcGluZyBvbiBhbGwgbWVzc2FnZXMuIFRoaXMgbWVhbnQgdGhhdAorZGVidWdnaW5nIGl0IHdhcyBkaWZmaWN1bHQgYW5kIGluc2VjdXJlLiBUaGUgbGF0ZXN0IHZlcnNpb25zIG9mIEQtQnVzIGFkZAorc3VwcG9ydCBmb3IgbW9uaXRvci1vbmx5IGNvbm5lY3Rpb25zIGZvciB0aGUgcm9vdCB1c2VyLCB3aGljaCBtZWFucyB0aGF0CiskY21kKGRidXMtbW9uaXRvcikgY2FuIGJlIHJ1biBhcyByb290IHRvIHBhaW5sZXNzbHkgbW9uaXRvciBhbGwgbWVzc2FnZXMgb24gdGhlCitzeXN0ZW0gYnVzIHdpdGhvdXQgbW9kaWZ5aW5nIGl0cyBzZWN1cml0eSBwb2xpY3kuCisKKz09PSBCdXN0bGUKKyAgICBbaWQ9ImJ1c3RsZSJdCisKKyRsaW5rWz4+aHR0cDovL3dpbGx0aG9tcHNvbi5jby51ay9idXN0bGUvXShCdXN0bGUpIGlzIGEgZ3JhcGhpY2FsIHZlcnNpb24gb2YKKyRjbWQoZGJ1cy1tb25pdG9yKSwgd2l0aCBhIFVJIGZvY3VzZWQgb24gcHJvZmlsaW5nIEQtQnVzIHBlcmZvcm1hbmNlIGJ5IHBsb3R0aW5nCittZXNzYWdlcyBvbiBhIHRpbWVsaW5lLiBJdCBpcyBpZGVhbCBmb3IgZmluZGluZyBib3R0bGVuZWNrcyBpbiBJUEMgcGVyZm9ybWFuY2UKK2JldHdlZW4gYSBzZXJ2aWNlIGFuZCBjbGllbnQuCisKKz09PSBELUZlZXQKKyAgICBbaWQ9ImQtZmVldCJdCisKKyRsaW5rWz4+aHR0cHM6Ly93aWtpLmdub21lLm9yZy9BcHBzL0RGZWV0XShELUZlZXQpIGlzIGFuIGludHJvc3BlY3Rpb24gdG9vbCBmb3IKK0QtQnVzLCB3aGljaCBkaXNwbGF5cyBhbGwgcGVlcnMgb24gdGhlIGJ1cyBncmFwaGljYWxseSwgd2l0aCB0aGVpciBvYmplY3RzLAoraW50ZXJmYWNlcywgbWV0aG9kcywgc2lnbmFscyBhbmQgcHJvcGVydGllcyBsaXN0ZWQgZm9yIGV4YW1pbmF0aW9uLiBJdCBpcyB1c2VmdWwKK2ZvciBkZWJ1Z2dpbmcgYWxsIGtpbmRzIG9mIGlzc3VlcyByZWxhdGVkIHRvIHByZXNlbmNlIG9mIHNlcnZpY2VzIG9uIHRoZSBidXMKK2FuZCB0aGUgb2JqZWN0cyB0aGV5IGV4cG9zZS4KZGlmZiAtLWdpdCBhL2RvYy9kYnVzLWNsZWFudXAtc29ja2V0cy4xLnhtbC5pbiBiL2RvYy9kYnVzLWNsZWFudXAtc29ja2V0cy4xLnhtbC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDk4MDgzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2RidXMtY2xlYW51cC1zb2NrZXRzLjEueG1sLmluCkBAIC0wLDAgKzEsNjUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4KKzwhRE9DVFlQRSByZWZlbnRyeSBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRG9jQm9vayBYTUwgVjQuNC8vRU4iCisgICAgICAgICAgICAgICAgICAgImh0dHA6Ly93d3cub2FzaXMtb3Blbi5vcmcvZG9jYm9vay94bWwvNC40L2RvY2Jvb2t4LmR0ZCI+Cis8cmVmZW50cnkgaWQ9J2RidXNjbGVhbnVwc29ja2V0czEnPgorCis8IS0tICBkYnVzJmJzb2w7LWNsZWFudXAmYnNvbDstc29ja2V0cyBtYW51YWwgcGFnZS4KKyBDb3B5cmlnaHQgKEMpIDIwMDMgUmVkIEhhdCwgSW5jLiAtLT4KKworPHJlZm1ldGE+Cis8cmVmZW50cnl0aXRsZT5kYnVzLWNsZWFudXAtc29ja2V0czwvcmVmZW50cnl0aXRsZT4KKzxtYW52b2xudW0+MTwvbWFudm9sbnVtPgorPHJlZm1pc2NpbmZvIGNsYXNzPSJtYW51YWwiPlVzZXIgQ29tbWFuZHM8L3JlZm1pc2NpbmZvPgorPHJlZm1pc2NpbmZvIGNsYXNzPSJzb3VyY2UiPkQtQnVzPC9yZWZtaXNjaW5mbz4KKzxyZWZtaXNjaW5mbyBjbGFzcz0idmVyc2lvbiI+QERCVVNfVkVSU0lPTkA8L3JlZm1pc2NpbmZvPgorPC9yZWZtZXRhPgorPHJlZm5hbWVkaXY+Cis8cmVmbmFtZT5kYnVzLWNsZWFudXAtc29ja2V0czwvcmVmbmFtZT4KKzxyZWZwdXJwb3NlPmNsZWFuIHVwIGxlZnRvdmVyIHNvY2tldHMgaW4gYSBkaXJlY3Rvcnk8L3JlZnB1cnBvc2U+Cis8L3JlZm5hbWVkaXY+Cis8IS0tIGJvZHkgYmVnaW5zIGhlcmUgLS0+Cis8cmVmc3lub3BzaXNkaXYgaWQ9J3N5bm9wc2lzJz4KKzxjbWRzeW5vcHNpcz4KKyAgPGNvbW1hbmQ+ZGJ1cy1jbGVhbnVwLXNvY2tldHM8L2NvbW1hbmQ+ICAgIDxhcmcgY2hvaWNlPSdvcHQnPjxyZXBsYWNlYWJsZT5ESVJFQ1RPUlk8L3JlcGxhY2VhYmxlPjwvYXJnPgorICAgIDxzYnIvPgorPC9jbWRzeW5vcHNpcz4KKzwvcmVmc3lub3BzaXNkaXY+CisKKworPHJlZnNlY3QxIGlkPSdkZXNjcmlwdGlvbic+PHRpdGxlPkRFU0NSSVBUSU9OPC90aXRsZT4KKzxwYXJhPlRoZSA8Y29tbWFuZD5kYnVzLWNsZWFudXAtc29ja2V0czwvY29tbWFuZD4gY29tbWFuZCBjbGVhbnMgdXAgdW51c2VkIEQtQnVzCitjb25uZWN0aW9uIHNvY2tldHMuIFNlZSA8dWxpbmsgdXJsPSdodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zb2Z0d2FyZS9kYnVzLyc+aHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc29mdHdhcmUvZGJ1cy88L3VsaW5rPiBmb3IKK21vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGJpZyBwaWN0dXJlLjwvcGFyYT4KKworCis8cGFyYT5JZiBnaXZlbiBubyBhcmd1bWVudHMsIDxjb21tYW5kPmRidXMtY2xlYW51cC1zb2NrZXRzPC9jb21tYW5kPiBjbGVhbnMgdXAgc29ja2V0cworaW4gdGhlIHN0YW5kYXJkIGRlZmF1bHQgc29ja2V0IGRpcmVjdG9yeSBmb3IgdGhlCitwZXItdXNlci1sb2dpbi1zZXNzaW9uIG1lc3NhZ2UgYnVzOyB0aGlzIGlzIHVzdWFsbHkgL3RtcC4KK09wdGlvbmFsbHksIHlvdSBjYW4gcGFzcyBhIGRpZmZlcmVudCBkaXJlY3Rvcnkgb24gdGhlIGNvbW1hbmQgbGluZS48L3BhcmE+CisKKworPHBhcmE+T24gTGludXgsIHRoaXMgcHJvZ3JhbSBpcyBlc3NlbnRpYWxseSB1c2VsZXNzLCBiZWNhdXNlIEQtQnVzIGRlZmF1bHRzCit0byB1c2luZyAiYWJzdHJhY3Qgc29ja2V0cyIgdGhhdCBleGlzdCBvbmx5IGluIG1lbW9yeSBhbmQgZG9uJ3QgaGF2ZSBhCitjb3JyZXNwb25kaW5nIGZpbGUgaW4gL3RtcC48L3BhcmE+CisKKworPHBhcmE+T24gbW9zdCBvdGhlciBmbGF2b3JzIG9mIFVOSVgsIGl0J3MgcG9zc2libGUgZm9yIHRoZSBzb2NrZXQgZmlsZXMgdG8KK2xlYWsgd2hlbiBwcm9ncmFtcyB1c2luZyBELUJ1cyBleGl0IGFibm9ybWFsbHkgb3Igd2l0aG91dCBjbG9zaW5nCit0aGVpciBELUJ1cyBjb25uZWN0aW9ucy4gVGh1cywgaXQgbWlnaHQgYmUgaW50ZXJlc3RpbmcgdG8gcnVuCitkYnVzLWNsZWFudXAtc29ja2V0cyBpbiBhIGNyb24gam9iIHRvIG1vcCB1cCBhbnkgbGVha2VkIHNvY2tldHMuCitPciB5b3UgY2FuIGp1c3QgaWdub3JlIHRoZSBsZWFrZWQgc29ja2V0cywgdGhleSBhcmVuJ3QgcmVhbGx5IGh1cnRpbmcKK2FueXRoaW5nLCBvdGhlciB0aGFuIGNsdXR0ZXJpbmcgdGhlIG91dHB1dCBvZiAibHMgL3RtcCI8L3BhcmE+CisKKzwvcmVmc2VjdDE+CisKKzxyZWZzZWN0MSBpZD0nYXV0aG9yJz48dGl0bGU+QVVUSE9SPC90aXRsZT4KKzxwYXJhPmRidXMtY2xlYW51cC1zb2NrZXRzIHdhcyBhZGFwdGVkIGJ5IEhhdm9jIFBlbm5pbmd0b24gZnJvbQorbGluYy1jbGVhbnVwLXNvY2tldHMgd3JpdHRlbiBieSBNaWNoYWVsIE1lZWtzLjwvcGFyYT4KKworPC9yZWZzZWN0MT4KKworPHJlZnNlY3QxIGlkPSdidWdzJz48dGl0bGU+QlVHUzwvdGl0bGU+Cis8cGFyYT5QbGVhc2Ugc2VuZCBidWcgcmVwb3J0cyB0byB0aGUgRC1CdXMgbWFpbGluZyBsaXN0IG9yIGJ1ZyB0cmFja2VyLAorc2VlIDx1bGluayB1cmw9J2h0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3NvZnR3YXJlL2RidXMvJz5odHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zb2Z0d2FyZS9kYnVzLzwvdWxpbms+PC9wYXJhPgorPC9yZWZzZWN0MT4KKzwvcmVmZW50cnk+CmRpZmYgLS1naXQgYS9kb2MvZGJ1cy1kYWVtb24uMS54bWwuaW4gYi9kb2MvZGJ1cy1kYWVtb24uMS54bWwuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZjZGEyZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9kYnVzLWRhZW1vbi4xLnhtbC5pbgpAQCAtMCwwICsxLDEzMjkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4KKzwhRE9DVFlQRSByZWZlbnRyeSBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRG9jQm9vayBYTUwgVjQuNC8vRU4iCisgICAgICAgICAgICAgICAgICAgImh0dHA6Ly93d3cub2FzaXMtb3Blbi5vcmcvZG9jYm9vay94bWwvNC40L2RvY2Jvb2t4LmR0ZCI+Cis8cmVmZW50cnkgaWQ9J2RidXNkYWVtb24xJz4KKworPCEtLSAgZGJ1cyZic29sOy1kYWVtb24gbWFudWFsIHBhZ2UuCisgQ29weXJpZ2h0IChDKSAyMDAzLDIwMDggUmVkIEhhdCwgSW5jLiAtLT4KKworPHJlZm1ldGE+Cis8cmVmZW50cnl0aXRsZT5kYnVzLWRhZW1vbjwvcmVmZW50cnl0aXRsZT4KKzxtYW52b2xudW0+MTwvbWFudm9sbnVtPgorPHJlZm1pc2NpbmZvIGNsYXNzPSJtYW51YWwiPlVzZXIgQ29tbWFuZHM8L3JlZm1pc2NpbmZvPgorPHJlZm1pc2NpbmZvIGNsYXNzPSJzb3VyY2UiPkQtQnVzPC9yZWZtaXNjaW5mbz4KKzxyZWZtaXNjaW5mbyBjbGFzcz0idmVyc2lvbiI+QERCVVNfVkVSU0lPTkA8L3JlZm1pc2NpbmZvPgorPC9yZWZtZXRhPgorPHJlZm5hbWVkaXY+Cis8cmVmbmFtZT5kYnVzLWRhZW1vbjwvcmVmbmFtZT4KKzxyZWZwdXJwb3NlPk1lc3NhZ2UgYnVzIGRhZW1vbjwvcmVmcHVycG9zZT4KKzwvcmVmbmFtZWRpdj4KKzwhLS0gYm9keSBiZWdpbnMgaGVyZSAtLT4KKzxyZWZzeW5vcHNpc2RpdiBpZD0nc3lub3BzaXMnPgorPGNtZHN5bm9wc2lzPgorICA8Y29tbWFuZD5kYnVzLWRhZW1vbjwvY29tbWFuZD48L2NtZHN5bm9wc2lzPgorPGNtZHN5bm9wc2lzPgorICA8Y29tbWFuZD5kYnVzLWRhZW1vbjwvY29tbWFuZD4gICAgPGFyZyBjaG9pY2U9J29wdCc+LS12ZXJzaW9uIDwvYXJnPgorICAgIDxhcmcgY2hvaWNlPSdvcHQnPi0tc2Vzc2lvbiA8L2FyZz4KKyAgICA8YXJnIGNob2ljZT0nb3B0Jz4tLXN5c3RlbSA8L2FyZz4KKyAgICA8YXJnIGNob2ljZT0nb3B0Jz4tLWNvbmZpZy1maWxlPTxyZXBsYWNlYWJsZT5GSUxFPC9yZXBsYWNlYWJsZT48L2FyZz4KKyAgICA8YXJnIGNob2ljZT0nb3B0Jz48YXJnIGNob2ljZT0ncGxhaW4nPi0tcHJpbnQtYWRkcmVzcyA8L2FyZz48YXJnIGNob2ljZT0nb3B0Jz48cmVwbGFjZWFibGU+PURFU0NSSVBUT1I8L3JlcGxhY2VhYmxlPjwvYXJnPjwvYXJnPgorICAgIDxhcmcgY2hvaWNlPSdvcHQnPjxhcmcgY2hvaWNlPSdwbGFpbic+LS1wcmludC1waWQgPC9hcmc+PGFyZyBjaG9pY2U9J29wdCc+PHJlcGxhY2VhYmxlPj1ERVNDUklQVE9SPC9yZXBsYWNlYWJsZT48L2FyZz48L2FyZz4KKyAgICA8YXJnIGNob2ljZT0nb3B0Jz4tLWZvcmsgPC9hcmc+CisgICAgPGFyZyBjaG9pY2U9J29wdCc+LS1ub3N5c2xvZyA8L2FyZz4KKyAgICA8YXJnIGNob2ljZT0nb3B0Jz4tLXN5c2xvZyA8L2FyZz4KKyAgICA8YXJnIGNob2ljZT0nb3B0Jz4tLXN5c2xvZy1vbmx5IDwvYXJnPgorICAgIDxzYnIvPgorPC9jbWRzeW5vcHNpcz4KKzwvcmVmc3lub3BzaXNkaXY+CisKKworPHJlZnNlY3QxIGlkPSdkZXNjcmlwdGlvbic+PHRpdGxlPkRFU0NSSVBUSU9OPC90aXRsZT4KKzxwYXJhPjxjb21tYW5kPmRidXMtZGFlbW9uPC9jb21tYW5kPiBpcyB0aGUgRC1CdXMgbWVzc2FnZSBidXMgZGFlbW9uLiBTZWUKKzx1bGluayB1cmw9J2h0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3NvZnR3YXJlL2RidXMvJz5odHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zb2Z0d2FyZS9kYnVzLzwvdWxpbms+IGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0Cit0aGUgYmlnIHBpY3R1cmUuIEQtQnVzIGlzIGZpcnN0IGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIG9uZS10by1vbmUKK2NvbW11bmljYXRpb24gYmV0d2VlbiBhbnkgdHdvIGFwcGxpY2F0aW9uczsgPGNvbW1hbmQ+ZGJ1cy1kYWVtb248L2NvbW1hbmQ+IGlzIGFuCithcHBsaWNhdGlvbiB0aGF0IHVzZXMgdGhpcyBsaWJyYXJ5IHRvIGltcGxlbWVudCBhIG1lc3NhZ2UgYnVzCitkYWVtb24uIE11bHRpcGxlIHByb2dyYW1zIGNvbm5lY3QgdG8gdGhlIG1lc3NhZ2UgYnVzIGRhZW1vbiBhbmQgY2FuCitleGNoYW5nZSBtZXNzYWdlcyB3aXRoIG9uZSBhbm90aGVyLjwvcGFyYT4KKworPHBhcmE+VGhlcmUgYXJlIHR3byBzdGFuZGFyZCBtZXNzYWdlIGJ1cyBpbnN0YW5jZXM6IHRoZSBzeXN0ZW13aWRlIG1lc3NhZ2UgYnVzCisoaW5zdGFsbGVkIG9uIG1hbnkgc3lzdGVtcyBhcyB0aGUgIm1lc3NhZ2VidXMiIGluaXQgc2VydmljZSkgYW5kIHRoZQorcGVyLXVzZXItbG9naW4tc2Vzc2lvbiBtZXNzYWdlIGJ1cyAoc3RhcnRlZCBlYWNoIHRpbWUgYSB1c2VyIGxvZ3MgaW4pLgorPGNvbW1hbmQ+ZGJ1cy1kYWVtb248L2NvbW1hbmQ+IGlzIHVzZWQgZm9yIGJvdGggb2YgdGhlc2UgaW5zdGFuY2VzLCBidXQgd2l0aAorYSBkaWZmZXJlbnQgY29uZmlndXJhdGlvbiBmaWxlLjwvcGFyYT4KKworPHBhcmE+VGhlIC0tc2Vzc2lvbiBvcHRpb24gaXMgZXF1aXZhbGVudCB0bworIi0tY29uZmlnLWZpbGU9QEVYUEFOREVEX0RBVEFESVJAL2RidXMtMS9zZXNzaW9uLmNvbmYiIGFuZCB0aGUgLS1zeXN0ZW0KK29wdGlvbiBpcyBlcXVpdmFsZW50IHRvCisiLS1jb25maWctZmlsZT1ARVhQQU5ERURfREFUQURJUkAvZGJ1cy0xL3N5c3RlbS5jb25mIi4gQnkgY3JlYXRpbmcKK2FkZGl0aW9uYWwgY29uZmlndXJhdGlvbiBmaWxlcyBhbmQgdXNpbmcgdGhlIC0tY29uZmlnLWZpbGUgb3B0aW9uLAorYWRkaXRpb25hbCBzcGVjaWFsLXB1cnBvc2UgbWVzc2FnZSBidXMgZGFlbW9ucyBjb3VsZCBiZSBjcmVhdGVkLjwvcGFyYT4KKworPHBhcmE+VGhlIHN5c3RlbXdpZGUgZGFlbW9uIGlzIG5vcm1hbGx5IGxhdW5jaGVkIGJ5IGFuIGluaXQgc2NyaXB0LAorc3RhbmRhcmRseSBjYWxsZWQgc2ltcGx5ICJtZXNzYWdlYnVzIi48L3BhcmE+CisKKzxwYXJhPlRoZSBzeXN0ZW13aWRlIGRhZW1vbiBpcyBsYXJnZWx5IHVzZWQgZm9yIGJyb2FkY2FzdGluZyBzeXN0ZW0gZXZlbnRzLAorc3VjaCBhcyBjaGFuZ2VzIHRvIHRoZSBwcmludGVyIHF1ZXVlLCBvciBhZGRpbmcvcmVtb3ZpbmcgZGV2aWNlcy48L3BhcmE+CisKKzxwYXJhPlRoZSBwZXItc2Vzc2lvbiBkYWVtb24gaXMgdXNlZCBmb3IgdmFyaW91cyBpbnRlcnByb2Nlc3MgY29tbXVuaWNhdGlvbgorYW1vbmcgZGVza3RvcCBhcHBsaWNhdGlvbnMgKGhvd2V2ZXIsIGl0IGlzIG5vdCB0aWVkIHRvIFggb3IgdGhlIEdVSQoraW4gYW55IHdheSkuPC9wYXJhPgorCis8cGFyYT5TSUdIVVAgd2lsbCBjYXVzZSB0aGUgRC1CdXMgZGFlbW9uIHRvIFBBUlRJQUxMWSByZWxvYWQgaXRzCitjb25maWd1cmF0aW9uIGZpbGUgYW5kIHRvIGZsdXNoIGl0cyB1c2VyL2dyb3VwIGluZm9ybWF0aW9uIGNhY2hlcy4gU29tZQorY29uZmlndXJhdGlvbiBjaGFuZ2VzIHdvdWxkIHJlcXVpcmUga2lja2luZyBhbGwgYXBwcyBvZmYgdGhlIGJ1czsgc28gdGhleSB3aWxsCitvbmx5IHRha2UgZWZmZWN0IGlmIHlvdSByZXN0YXJ0IHRoZSBkYWVtb24uIFBvbGljeSBjaGFuZ2VzIHNob3VsZCB0YWtlIGVmZmVjdAord2l0aCBTSUdIVVAuPC9wYXJhPgorCis8L3JlZnNlY3QxPgorCis8cmVmc2VjdDEgaWQ9J29wdGlvbnMnPjx0aXRsZT5PUFRJT05TPC90aXRsZT4KKzxwYXJhPlRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgc3VwcG9ydGVkOjwvcGFyYT4KKzx2YXJpYWJsZWxpc3QgcmVtYXA9J1RQJz4KKyAgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PG9wdGlvbj4tLWNvbmZpZy1maWxlPUZJTEU8L29wdGlvbj48L3Rlcm0+CisgIDxsaXN0aXRlbT4KKzxwYXJhPlVzZSB0aGUgZ2l2ZW4gY29uZmlndXJhdGlvbiBmaWxlLjwvcGFyYT4KKyAgPC9saXN0aXRlbT4KKyAgPC92YXJsaXN0ZW50cnk+CisgIDx2YXJsaXN0ZW50cnk+CisgIDx0ZXJtPjxvcHRpb24+LS1mb3JrPC9vcHRpb24+PC90ZXJtPgorICA8bGlzdGl0ZW0+Cis8cGFyYT5Gb3JjZSB0aGUgbWVzc2FnZSBidXMgdG8gZm9yayBhbmQgYmVjb21lIGEgZGFlbW9uLCBldmVuIGlmCit0aGUgY29uZmlndXJhdGlvbiBmaWxlIGRvZXMgbm90IHNwZWNpZnkgdGhhdCBpdCBzaG91bGQuCitJbiBtb3N0IGNvbnRleHRzIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgYWxyZWFkeSBnZXRzIHRoaXMKK3JpZ2h0LCB0aG91Z2guIFRoaXMgb3B0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgb24gV2luZG93cy48L3BhcmE+CisgIDwvbGlzdGl0ZW0+CisgIDwvdmFybGlzdGVudHJ5PgorICA8dmFybGlzdGVudHJ5PgorICA8dGVybT48b3B0aW9uPi0tbm9mb3JrPC9vcHRpb24+PC90ZXJtPgorICA8bGlzdGl0ZW0+CisgICAgPHBhcmE+Rm9yY2UgdGhlIG1lc3NhZ2UgYnVzIG5vdCB0byBmb3JrIGFuZCBiZWNvbWUgYSBkYWVtb24sIGV2ZW4gaWYKKyAgICAgIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgc3BlY2lmaWVzIHRoYXQgaXQgc2hvdWxkLiBPbiBXaW5kb3dzLAorICAgICAgdGhlIGRidXMtZGFlbW9uIG5ldmVyIGZvcmtzLCBzbyB0aGlzIG9wdGlvbiBpcyBhbGxvd2VkIGJ1dCBkb2VzCisgICAgICBub3RoaW5nLjwvcGFyYT4KKyAgPC9saXN0aXRlbT4KKyAgPC92YXJsaXN0ZW50cnk+CisgIDx2YXJsaXN0ZW50cnk+CisgIDx0ZXJtPjxvcHRpb24+LS1wcmludC1hZGRyZXNzWz1ERVNDUklQVE9SXTwvb3B0aW9uPjwvdGVybT4KKyAgPGxpc3RpdGVtPgorPHBhcmE+UHJpbnQgdGhlIGFkZHJlc3Mgb2YgdGhlIG1lc3NhZ2UgYnVzIHRvIHN0YW5kYXJkIG91dHB1dCwgb3IKK3RvIHRoZSBnaXZlbiBmaWxlIGRlc2NyaXB0b3IuIFRoaXMgaXMgdXNlZCBieSBwcm9ncmFtcyB0aGF0CitsYXVuY2ggdGhlIG1lc3NhZ2UgYnVzLjwvcGFyYT4KKyAgPC9saXN0aXRlbT4KKyAgPC92YXJsaXN0ZW50cnk+CisgIDx2YXJsaXN0ZW50cnk+CisgIDx0ZXJtPjxvcHRpb24+LS1wcmludC1waWRbPURFU0NSSVBUT1JdPC9vcHRpb24+PC90ZXJtPgorICA8bGlzdGl0ZW0+Cis8cGFyYT5QcmludCB0aGUgcHJvY2VzcyBJRCBvZiB0aGUgbWVzc2FnZSBidXMgdG8gc3RhbmRhcmQgb3V0cHV0LCBvcgordG8gdGhlIGdpdmVuIGZpbGUgZGVzY3JpcHRvci4gVGhpcyBpcyB1c2VkIGJ5IHByb2dyYW1zIHRoYXQKK2xhdW5jaCB0aGUgbWVzc2FnZSBidXMuPC9wYXJhPgorICA8L2xpc3RpdGVtPgorICA8L3Zhcmxpc3RlbnRyeT4KKyAgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PG9wdGlvbj4tLXNlc3Npb248L29wdGlvbj48L3Rlcm0+CisgIDxsaXN0aXRlbT4KKzxwYXJhPlVzZSB0aGUgc3RhbmRhcmQgY29uZmlndXJhdGlvbiBmaWxlIGZvciB0aGUgcGVyLWxvZ2luLXNlc3Npb24gbWVzc2FnZQorYnVzLjwvcGFyYT4KKyAgPC9saXN0aXRlbT4KKyAgPC92YXJsaXN0ZW50cnk+CisgIDx2YXJsaXN0ZW50cnk+CisgIDx0ZXJtPjxvcHRpb24+LS1zeXN0ZW08L29wdGlvbj48L3Rlcm0+CisgIDxsaXN0aXRlbT4KKzxwYXJhPlVzZSB0aGUgc3RhbmRhcmQgY29uZmlndXJhdGlvbiBmaWxlIGZvciB0aGUgc3lzdGVtd2lkZSBtZXNzYWdlIGJ1cy48L3BhcmE+CisgIDwvbGlzdGl0ZW0+CisgIDwvdmFybGlzdGVudHJ5PgorICA8dmFybGlzdGVudHJ5PgorICA8dGVybT48b3B0aW9uPi0tdmVyc2lvbjwvb3B0aW9uPjwvdGVybT4KKyAgPGxpc3RpdGVtPgorPHBhcmE+UHJpbnQgdGhlIHZlcnNpb24gb2YgdGhlIGRhZW1vbi48L3BhcmE+CisgIDwvbGlzdGl0ZW0+CisgIDwvdmFybGlzdGVudHJ5PgorICA8dmFybGlzdGVudHJ5PgorICA8dGVybT48b3B0aW9uPi0taW50cm9zcGVjdDwvb3B0aW9uPjwvdGVybT4KKyAgPGxpc3RpdGVtPgorPHBhcmE+UHJpbnQgdGhlIGludHJvc3BlY3Rpb24gaW5mb3JtYXRpb24gZm9yIGFsbCBELUJ1cyBpbnRlcm5hbCBpbnRlcmZhY2VzLjwvcGFyYT4KKyAgPC9saXN0aXRlbT4KKyAgPC92YXJsaXN0ZW50cnk+CisgIDx2YXJsaXN0ZW50cnk+CisgIDx0ZXJtPjxvcHRpb24+LS1hZGRyZXNzWz1BRERSRVNTXTwvb3B0aW9uPjwvdGVybT4KKyAgPGxpc3RpdGVtPgorICAgIDxwYXJhPlNldCB0aGUgYWRkcmVzcyB0byBsaXN0ZW4gb24uIFRoaXMgb3B0aW9uIG92ZXJyaWRlcyB0aGUgYWRkcmVzcworICAgICAgY29uZmlndXJlZCBpbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlIHZpYSB0aGUKKyAgICAgIDxsaXRlcmFsPiZsdDtsaXN0ZW4mZ3Q7PC9saXRlcmFsPiBkaXJlY3RpdmUuCisgICAgICBTZWUgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhhdCBkaXJlY3RpdmUgZm9yIG1vcmUgZGV0YWlscy48L3BhcmE+CisgIDwvbGlzdGl0ZW0+CisgIDwvdmFybGlzdGVudHJ5PgorICA8dmFybGlzdGVudHJ5PgorICA8dGVybT48b3B0aW9uPi0tc3lzdGVtZC1hY3RpdmF0aW9uPC9vcHRpb24+PC90ZXJtPgorICA8bGlzdGl0ZW0+Cis8cGFyYT5FbmFibGUgc3lzdGVtZC1zdHlsZSBzZXJ2aWNlIGFjdGl2YXRpb24uIE9ubHkgdXNlZnVsIGluIGNvbmp1bmN0aW9uCit3aXRoIHRoZSBzeXN0ZW1kIHN5c3RlbSBhbmQgc2Vzc2lvbiBtYW5hZ2VyIG9uIExpbnV4LjwvcGFyYT4KKyAgPC9saXN0aXRlbT4KKyAgPC92YXJsaXN0ZW50cnk+CisgIDx2YXJsaXN0ZW50cnk+CisgIDx0ZXJtPjxvcHRpb24+LS1ub3BpZGZpbGU8L29wdGlvbj48L3Rlcm0+CisgIDxsaXN0aXRlbT4KKzxwYXJhPkRvbid0IHdyaXRlIGEgUElEIGZpbGUgZXZlbiBpZiBvbmUgaXMgY29uZmlndXJlZCBpbiB0aGUgY29uZmlndXJhdGlvbgorZmlsZXMuPC9wYXJhPgorCisgIDwvbGlzdGl0ZW0+CisgIDwvdmFybGlzdGVudHJ5PgorCisgIDx2YXJsaXN0ZW50cnk+CisgICAgPHRlcm0+PG9wdGlvbj4tLXN5c2xvZzwvb3B0aW9uPjwvdGVybT4KKyAgICA8bGlzdGl0ZW0+CisgICAgICA8cGFyYT5Gb3JjZSB0aGUgbWVzc2FnZSBidXMgdG8gdXNlIHRoZSBzeXN0ZW0gbG9nIGZvciBtZXNzYWdlcywKKyAgICAgICAgaW4gYWRkaXRpb24gdG8gd3JpdGluZyB0byBzdGFuZGFyZCBlcnJvciwgZXZlbiBpZiB0aGUgY29uZmlndXJhdGlvbgorICAgICAgICBmaWxlIGRvZXMgbm90IHNwZWNpZnkgdGhhdCBpdCBzaG91bGQuIE9uIFVuaXgsIHRoaXMgdXNlcworICAgICAgICB0aGUgc3lzbG9nOyBvbiBXaW5kb3dzLCB0aGlzIHVzZXMgT3V0cHV0RGVidWdTdHJpbmcoKS48L3BhcmE+CisgICAgPC9saXN0aXRlbT4KKyAgPC92YXJsaXN0ZW50cnk+CisKKyAgPHZhcmxpc3RlbnRyeT4KKyAgICA8dGVybT48b3B0aW9uPi0tc3lzbG9nLW9ubHk8L29wdGlvbj48L3Rlcm0+CisgICAgPGxpc3RpdGVtPgorICAgICAgPHBhcmE+Rm9yY2UgdGhlIG1lc3NhZ2UgYnVzIHRvIHVzZSB0aGUgc3lzdGVtIGxvZyBmb3IgbWVzc2FnZXMsCisgICAgICAgIGFuZCA8ZW1waGFzaXM+bm90PC9lbXBoYXNpcz4gZHVwbGljYXRlIHRoZW0gdG8gc3RhbmRhcmQgZXJyb3IuCisgICAgICAgIE9uIFVuaXgsIHRoaXMgdXNlcyB0aGUgc3lzbG9nOyBvbiBXaW5kb3dzLCB0aGlzIHVzZXMKKyAgICAgICAgT3V0cHV0RGVidWdTdHJpbmcoKS48L3BhcmE+CisgICAgPC9saXN0aXRlbT4KKyAgPC92YXJsaXN0ZW50cnk+CisKKyAgPHZhcmxpc3RlbnRyeT4KKyAgICA8dGVybT48b3B0aW9uPi0tbm9zeXNsb2c8L29wdGlvbj48L3Rlcm0+CisgICAgPGxpc3RpdGVtPgorICAgICAgPHBhcmE+Rm9yY2UgdGhlIG1lc3NhZ2UgYnVzIHRvIHVzZSBvbmx5IHN0YW5kYXJkIGVycm9yIGZvciBtZXNzYWdlcywKKyAgICAgICAgZXZlbiBpZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlIHNwZWNpZmllcyB0aGF0IGl0IHNob3VsZCB1c2UKKyAgICAgICAgdGhlIHN5c3RlbSBsb2cuPC9wYXJhPgorICAgIDwvbGlzdGl0ZW0+CisgIDwvdmFybGlzdGVudHJ5PgorCis8L3ZhcmlhYmxlbGlzdD4KKzwvcmVmc2VjdDE+CisKKzxyZWZzZWN0MSBpZD0nY29uZmlndXJhdGlvbl9maWxlJz48dGl0bGU+Q09ORklHVVJBVElPTiBGSUxFPC90aXRsZT4KKzxwYXJhPkEgbWVzc2FnZSBidXMgZGFlbW9uIGhhcyBhIGNvbmZpZ3VyYXRpb24gZmlsZSB0aGF0IHNwZWNpYWxpemVzIGl0Citmb3IgYSBwYXJ0aWN1bGFyIGFwcGxpY2F0aW9uLiBGb3IgZXhhbXBsZSwgb25lIGNvbmZpZ3VyYXRpb24KK2ZpbGUgbWlnaHQgc2V0IHVwIHRoZSBtZXNzYWdlIGJ1cyB0byBiZSBhIHN5c3RlbXdpZGUgbWVzc2FnZSBidXMsCit3aGlsZSBhbm90aGVyIG1pZ2h0IHNldCBpdCB1cCB0byBiZSBhIHBlci11c2VyLWxvZ2luLXNlc3Npb24gYnVzLjwvcGFyYT4KKworPHBhcmE+VGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBhbHNvIGVzdGFibGlzaGVzIHJlc291cmNlIGxpbWl0cywgc2VjdXJpdHkKK3BhcmFtZXRlcnMsIGFuZCBzbyBmb3J0aC48L3BhcmE+CisKKzxwYXJhPlRoZSBjb25maWd1cmF0aW9uIGZpbGUgaXMgbm90IHBhcnQgb2YgYW55IGludGVyb3BlcmFiaWxpdHkKK3NwZWNpZmljYXRpb24gYW5kIGl0cyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGlzIG5vdCBndWFyYW50ZWVkOyB0aGlzCitkb2N1bWVudCBpcyBkb2N1bWVudGF0aW9uLCBub3Qgc3BlY2lmaWNhdGlvbi48L3BhcmE+CisKKzxwYXJhPlRoZSBzdGFuZGFyZCBzeXN0ZW13aWRlIGFuZCBwZXItc2Vzc2lvbiBtZXNzYWdlIGJ1cyBzZXR1cHMgYXJlCitjb25maWd1cmVkIGluIHRoZSBmaWxlcyAiQEVYUEFOREVEX0RBVEFESVJAL2RidXMtMS9zeXN0ZW0uY29uZiIgYW5kCisiQEVYUEFOREVEX0RBVEFESVJAL2RidXMtMS9zZXNzaW9uLmNvbmYiLiAgVGhlc2UgZmlsZXMgbm9ybWFsbHkKKyZsdDtpbmNsdWRlJmd0OyBhIHN5c3RlbS1sb2NhbC5jb25mIG9yIHNlc3Npb24tbG9jYWwuY29uZiBpbgorQEVYUEFOREVEX1NZU0NPTkZESVJAL2RidXMtMTsgeW91IGNhbiBwdXQgbG9jYWwKK292ZXJyaWRlcyBpbiB0aG9zZSBmaWxlcyB0byBhdm9pZCBtb2RpZnlpbmcgdGhlIHByaW1hcnkgY29uZmlndXJhdGlvbgorZmlsZXMuPC9wYXJhPgorCisKKzxwYXJhPlRoZSBjb25maWd1cmF0aW9uIGZpbGUgaXMgYW4gWE1MIGRvY3VtZW50LiBJdCBtdXN0IGhhdmUgdGhlIGZvbGxvd2luZworZG9jdHlwZSBkZWNsYXJhdGlvbjo8L3BhcmE+Cis8bGl0ZXJhbGxheW91dCByZW1hcD0nLm5mJz4KKworICAgJmx0OyFET0NUWVBFIGJ1c2NvbmZpZyBQVUJMSUMgIi0vL2ZyZWVkZXNrdG9wLy9EVEQgRC1CdXMgQnVzIENvbmZpZ3VyYXRpb24gMS4wLy9FTiIKKyAgICAiPHVsaW5rIHVybD0naHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc3RhbmRhcmRzL2RidXMvMS4wL2J1c2NvbmZpZy5kdGQnPmh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3N0YW5kYXJkcy9kYnVzLzEuMC9idXNjb25maWcuZHRkPC91bGluaz4iJmd0OworCis8L2xpdGVyYWxsYXlvdXQ+IDwhLS0gLmZpIC0tPgorCisKKzxwYXJhPlRoZSBmb2xsb3dpbmcgZWxlbWVudHMgbWF5IGJlIHByZXNlbnQgaW4gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS48L3BhcmE+CisKKzxpdGVtaXplZGxpc3QgcmVtYXA9J1RQJz4KKworICA8bGlzdGl0ZW0+PHBhcmE+PGVtcGhhc2lzIHJlbWFwPSdJJz4mbHQ7YnVzY29uZmlnJmd0OzwvZW1waGFzaXM+PC9wYXJhPjwvbGlzdGl0ZW0+CisKKworPC9pdGVtaXplZGxpc3Q+CisKKzxwYXJhPlJvb3QgZWxlbWVudC48L3BhcmE+CisKKzxpdGVtaXplZGxpc3QgcmVtYXA9J1RQJz4KKworICA8bGlzdGl0ZW0+PHBhcmE+PGVtcGhhc2lzIHJlbWFwPSdJJz4mbHQ7dHlwZSZndDs8L2VtcGhhc2lzPjwvcGFyYT48L2xpc3RpdGVtPgorCisKKzwvaXRlbWl6ZWRsaXN0PgorCis8cGFyYT5UaGUgd2VsbC1rbm93biB0eXBlIG9mIHRoZSBtZXNzYWdlIGJ1cy4gQ3VycmVudGx5IGtub3duIHZhbHVlcyBhcmUKKyJzeXN0ZW0iIGFuZCAic2Vzc2lvbiI7IGlmIG90aGVyIHZhbHVlcyBhcmUgc2V0LCB0aGV5IHNob3VsZCBiZQorZWl0aGVyIGFkZGVkIHRvIHRoZSBELUJ1cyBzcGVjaWZpY2F0aW9uLCBvciBuYW1lc3BhY2VkLiAgVGhlIGxhc3QKKyZsdDt0eXBlJmd0OyBlbGVtZW50ICJ3aW5zIiAocHJldmlvdXMgdmFsdWVzIGFyZSBpZ25vcmVkKS4gVGhpcyBlbGVtZW50Citvbmx5IGNvbnRyb2xzIHdoaWNoIG1lc3NhZ2UgYnVzIHNwZWNpZmljIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUKK3NldCBpbiBhY3RpdmF0ZWQgY2xpZW50cy4gIE1vc3Qgb2YgdGhlIHBvbGljeSB0aGF0IGRpc3Rpbmd1aXNoZXMgYQorc2Vzc2lvbiBidXMgZnJvbSB0aGUgc3lzdGVtIGJ1cyBpcyBjb250cm9sbGVkIGZyb20gdGhlIG90aGVyIGVsZW1lbnRzCitpbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlLjwvcGFyYT4KKworCis8cGFyYT5JZiB0aGUgd2VsbC1rbm93biB0eXBlIG9mIHRoZSBtZXNzYWdlIGJ1cyBpcyAic2Vzc2lvbiIsIHRoZW4gdGhlCitEQlVTX1NUQVJURVJfQlVTX1RZUEUgZW52aXJvbm1lbnQgdmFyaWFibGUgd2lsbCBiZSBzZXQgdG8gInNlc3Npb24iCithbmQgdGhlIERCVVNfU0VTU0lPTl9CVVNfQUREUkVTUyBlbnZpcm9ubWVudCB2YXJpYWJsZSB3aWxsIGJlIHNldAordG8gdGhlIGFkZHJlc3Mgb2YgdGhlIHNlc3Npb24gYnVzLiAgTGlrZXdpc2UsIGlmIHRoZSB0eXBlIG9mIHRoZQorbWVzc2FnZSBidXMgaXMgInN5c3RlbSIsIHRoZW4gdGhlIERCVVNfU1RBUlRFUl9CVVNfVFlQRSBlbnZpcm9ubWVudAordmFyaWFibGUgd2lsbCBiZSBzZXQgdG8gInN5c3RlbSIgYW5kIHRoZSBEQlVTX1NZU1RFTV9CVVNfQUREUkVTUworZW52aXJvbm1lbnQgdmFyaWFibGUgd2lsbCBiZSBzZXQgdG8gdGhlIGFkZHJlc3Mgb2YgdGhlIHN5c3RlbSBidXMKKyh3aGljaCBpcyBub3JtYWxseSB3ZWxsIGtub3duIGFueXdheSkuPC9wYXJhPgorCisKKzxwYXJhPkV4YW1wbGU6ICZsdDt0eXBlJmd0O3Nlc3Npb24mbHQ7L3R5cGUmZ3Q7PC9wYXJhPgorCis8aXRlbWl6ZWRsaXN0IHJlbWFwPSdUUCc+CisKKyAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcyByZW1hcD0nSSc+Jmx0O2luY2x1ZGUmZ3Q7PC9lbXBoYXNpcz48L3BhcmE+PC9saXN0aXRlbT4KKworCis8L2l0ZW1pemVkbGlzdD4KKworPHBhcmE+SW5jbHVkZSBhIGZpbGUgJmx0O2luY2x1ZGUmZ3Q7ZmlsZW5hbWUuY29uZiZsdDsvaW5jbHVkZSZndDsgYXQgdGhpcyBwb2ludC4gIElmIHRoZQorZmlsZW5hbWUgaXMgcmVsYXRpdmUsIGl0IGlzIGxvY2F0ZWQgcmVsYXRpdmUgdG8gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZQorZG9pbmcgdGhlIGluY2x1ZGluZy48L3BhcmE+CisKKworPHBhcmE+Jmx0O2luY2x1ZGUmZ3Q7IGhhcyBhbiBvcHRpb25hbCBhdHRyaWJ1dGUgImlnbm9yZV9taXNzaW5nPSh5ZXN8bm8pIgord2hpY2ggZGVmYXVsdHMgdG8gIm5vIiBpZiBub3QgcHJvdmlkZWQuIFRoaXMgYXR0cmlidXRlCitjb250cm9scyB3aGV0aGVyIGl0J3MgYSBmYXRhbCBlcnJvciBmb3IgdGhlIGluY2x1ZGVkIGZpbGUKK3RvIGJlIGFic2VudC48L3BhcmE+CisKKzxpdGVtaXplZGxpc3QgcmVtYXA9J1RQJz4KKworICA8bGlzdGl0ZW0+PHBhcmE+PGVtcGhhc2lzIHJlbWFwPSdJJz4mbHQ7aW5jbHVkZWRpciZndDs8L2VtcGhhc2lzPjwvcGFyYT48L2xpc3RpdGVtPgorCisKKzwvaXRlbWl6ZWRsaXN0PgorCis8cGFyYT5JbmNsdWRlIGFsbCBmaWxlcyBpbiAmbHQ7aW5jbHVkZWRpciZndDtmb28uZCZsdDsvaW5jbHVkZWRpciZndDsgYXQgdGhpcworcG9pbnQuIEZpbGVzIGluIHRoZSBkaXJlY3RvcnkgYXJlIGluY2x1ZGVkIGluIHVuZGVmaW5lZCBvcmRlci4KK09ubHkgZmlsZXMgZW5kaW5nIGluICIuY29uZiIgYXJlIGluY2x1ZGVkLjwvcGFyYT4KKworCis8cGFyYT5UaGlzIGlzIGludGVuZGVkIHRvIGFsbG93IGV4dGVuc2lvbiBvZiB0aGUgc3lzdGVtIGJ1cyBieSBwYXJ0aWN1bGFyCitwYWNrYWdlcy4gRm9yIGV4YW1wbGUsIGlmIENVUFMgd2FudHMgdG8gYmUgYWJsZSB0byBzZW5kIG91dAorbm90aWZpY2F0aW9uIG9mIHByaW50ZXIgcXVldWUgY2hhbmdlcywgaXQgY291bGQgaW5zdGFsbCBhIGZpbGUgdG8KK0BFWFBBTkRFRF9EQVRBRElSQC9kYnVzLTEvc3lzdGVtLmQgb3IKK0BFWFBBTkRFRF9TWVNDT05GRElSQC9kYnVzLTEvc3lzdGVtLmQgdGhhdCBhbGxvd2VkIGFsbCBhcHBzIHRvIHJlY2VpdmUKK3RoaXMgbWVzc2FnZSBhbmQgYWxsb3dlZCB0aGUgcHJpbnRlciBkYWVtb24gdXNlciB0byBzZW5kIGl0LjwvcGFyYT4KKworPGl0ZW1pemVkbGlzdCByZW1hcD0nVFAnPgorCisgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXMgcmVtYXA9J0knPiZsdDt1c2VyJmd0OzwvZW1waGFzaXM+PC9wYXJhPjwvbGlzdGl0ZW0+CisKKworPC9pdGVtaXplZGxpc3Q+CisKKzxwYXJhPlRoZSB1c2VyIGFjY291bnQgdGhlIGRhZW1vbiBzaG91bGQgcnVuIGFzLCBhcyBlaXRoZXIgYSB1c2VybmFtZSBvciBhCitVSUQuIElmIHRoZSBkYWVtb24gY2Fubm90IGNoYW5nZSB0byB0aGlzIFVJRCBvbiBzdGFydHVwLCBpdCB3aWxsIGV4aXQuCitJZiB0aGlzIGVsZW1lbnQgaXMgbm90IHByZXNlbnQsIHRoZSBkYWVtb24gd2lsbCBub3QgY2hhbmdlIG9yIGNhcmUKK2Fib3V0IGl0cyBVSUQuPC9wYXJhPgorCisKKzxwYXJhPlRoZSBsYXN0ICZsdDt1c2VyJmd0OyBlbnRyeSBpbiB0aGUgZmlsZSAid2lucyIsIHRoZSBvdGhlcnMgYXJlIGlnbm9yZWQuPC9wYXJhPgorCisKKzxwYXJhPlRoZSB1c2VyIGlzIGNoYW5nZWQgYWZ0ZXIgdGhlIGJ1cyBoYXMgY29tcGxldGVkIGluaXRpYWxpemF0aW9uLiAgU28KK3NvY2tldHMgZXRjLiB3aWxsIGJlIGNyZWF0ZWQgYmVmb3JlIGNoYW5naW5nIHVzZXIsIGJ1dCBubyBkYXRhIHdpbGwgYmUKK3JlYWQgZnJvbSBjbGllbnRzIGJlZm9yZSBjaGFuZ2luZyB1c2VyLiBUaGlzIG1lYW5zIHRoYXQgc29ja2V0cworYW5kIFBJRCBmaWxlcyBjYW4gYmUgY3JlYXRlZCBpbiBhIGxvY2F0aW9uIHRoYXQgcmVxdWlyZXMgcm9vdAorcHJpdmlsZWdlcyBmb3Igd3JpdGluZy48L3BhcmE+CisKKzxpdGVtaXplZGxpc3QgcmVtYXA9J1RQJz4KKworICA8bGlzdGl0ZW0+PHBhcmE+PGVtcGhhc2lzIHJlbWFwPSdJJz4mbHQ7Zm9yayZndDs8L2VtcGhhc2lzPjwvcGFyYT48L2xpc3RpdGVtPgorCisKKzwvaXRlbWl6ZWRsaXN0PgorCis8cGFyYT5JZiBwcmVzZW50LCB0aGUgYnVzIGRhZW1vbiBiZWNvbWVzIGEgcmVhbCBkYWVtb24gKGZvcmtzCitpbnRvIHRoZSBiYWNrZ3JvdW5kLCBldGMuKS4gVGhpcyBpcyBnZW5lcmFsbHkgdXNlZAorcmF0aGVyIHRoYW4gdGhlIC0tZm9yayBjb21tYW5kIGxpbmUgb3B0aW9uLjwvcGFyYT4KKworPGl0ZW1pemVkbGlzdCByZW1hcD0nVFAnPgorCisgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXMgcmVtYXA9J0knPiZsdDtrZWVwX3VtYXNrJmd0OzwvZW1waGFzaXM+PC9wYXJhPjwvbGlzdGl0ZW0+CisKKworPC9pdGVtaXplZGxpc3Q+CisKKzxwYXJhPklmIHByZXNlbnQsIHRoZSBidXMgZGFlbW9uIGtlZXBzIGl0cyBvcmlnaW5hbCB1bWFzayB3aGVuIGZvcmtpbmcuCitUaGlzIG1heSBiZSB1c2VmdWwgdG8gYXZvaWQgYWZmZWN0aW5nIHRoZSBiZWhhdmlvciBvZiBjaGlsZCBwcm9jZXNzZXMuPC9wYXJhPgorCis8aXRlbWl6ZWRsaXN0IHJlbWFwPSdUUCc+CisKKyAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcyByZW1hcD0nSSc+Jmx0O3N5c2xvZyZndDs8L2VtcGhhc2lzPjwvcGFyYT48L2xpc3RpdGVtPgorCisKKzwvaXRlbWl6ZWRsaXN0PgorCis8cGFyYT5JZiBwcmVzZW50LCB0aGUgYnVzIGRhZW1vbiB3aWxsIGxvZyB0byBzeXNsb2cuIFRoZQorICAtLXN5c2xvZywgLS1zeXNsb2ctb25seSBhbmQgLS1ub3N5c2xvZyBjb21tYW5kLWxpbmUgb3B0aW9ucyB0YWtlIHByZWNlZGVuY2UKKyAgb3ZlciB0aGlzIHNldHRpbmcuPC9wYXJhPgorCis8aXRlbWl6ZWRsaXN0IHJlbWFwPSdUUCc+CisKKyAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcyByZW1hcD0nSSc+Jmx0O3BpZGZpbGUmZ3Q7PC9lbXBoYXNpcz48L3BhcmE+PC9saXN0aXRlbT4KKworCis8L2l0ZW1pemVkbGlzdD4KKworPHBhcmE+SWYgcHJlc2VudCwgdGhlIGJ1cyBkYWVtb24gd2lsbCB3cml0ZSBpdHMgcGlkIHRvIHRoZSBzcGVjaWZpZWQgZmlsZS4KK1RoZSAtLW5vcGlkZmlsZSBjb21tYW5kLWxpbmUgb3B0aW9uIHRha2VzIHByZWNlZGVuY2Ugb3ZlciB0aGlzIHNldHRpbmcuPC9wYXJhPgorCis8aXRlbWl6ZWRsaXN0IHJlbWFwPSdUUCc+CisKKyAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcyByZW1hcD0nSSc+Jmx0O2FsbG93X2Fub255bW91cyZndDs8L2VtcGhhc2lzPjwvcGFyYT48L2xpc3RpdGVtPgorCisKKzwvaXRlbWl6ZWRsaXN0PgorCis8cGFyYT5JZiBwcmVzZW50LCBjb25uZWN0aW9ucyB0aGF0IGF1dGhlbnRpY2F0ZWQgdXNpbmcgdGhlIEFOT05ZTU9VUworbWVjaGFuaXNtIHdpbGwgYmUgYXV0aG9yaXplZCB0byBjb25uZWN0LiBUaGlzIG9wdGlvbiBoYXMgbm8gcHJhY3RpY2FsCitlZmZlY3QgdW5sZXNzIHRoZSBBTk9OWU1PVVMgbWVjaGFuaXNtIGhhcyBhbHNvIGJlZW4gZW5hYmxlZCB1c2luZyB0aGUKKzxlbXBoYXNpcyByZW1hcD0nSSc+Jmx0O2F1dGgmZ3Q7PC9lbXBoYXNpcz4gZWxlbWVudCwgZGVzY3JpYmVkIGJlbG93LjwvcGFyYT4KKworPHBhcmE+VXNpbmcgdGhpcyBkaXJlY3RpdmUgaW4gdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIHdlbGwta25vd24KKyAgc3lzdGVtIGJ1cyBvciB0aGUgd2VsbC1rbm93biBzZXNzaW9uIGJ1cyB3aWxsIG1ha2UgdGhhdCBidXMgaW5zZWN1cmUKKyAgYW5kIHNob3VsZCBuZXZlciBiZSBkb25lLiBTaW1pbGFybHksIG9uIGN1c3RvbSBidXMgdHlwZXMsIHVzaW5nIHRoaXMKKyAgZGlyZWN0aXZlIHdpbGwgdXN1YWxseSBtYWtlIHRoZSBjdXN0b20gYnVzIGluc2VjdXJlLCB1bmxlc3MgaXRzCisgIGNvbmZpZ3VyYXRpb24gaGFzIGJlZW4gc3BlY2lmaWNhbGx5IGRlc2lnbmVkIHRvIHByZXZlbnQgYW5vbnltb3VzCisgIHVzZXJzIGZyb20gY2F1c2luZyBkYW1hZ2Ugb3IgZXNjYWxhdGluZyBwcml2aWxlZ2VzLjwvcGFyYT4KKworPGl0ZW1pemVkbGlzdCByZW1hcD0nVFAnPgorCisgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXMgcmVtYXA9J0knPiZsdDtsaXN0ZW4mZ3Q7PC9lbXBoYXNpcz48L3BhcmE+PC9saXN0aXRlbT4KKworCis8L2l0ZW1pemVkbGlzdD4KKworPHBhcmE+QWRkIGFuIGFkZHJlc3MgdGhhdCB0aGUgYnVzIHNob3VsZCBsaXN0ZW4gb24uIFRoZQorYWRkcmVzcyBpcyBpbiB0aGUgc3RhbmRhcmQgRC1CdXMgZm9ybWF0IHRoYXQgY29udGFpbnMKK2EgdHJhbnNwb3J0IG5hbWUgcGx1cyBwb3NzaWJsZSBwYXJhbWV0ZXJzL29wdGlvbnMuPC9wYXJhPgorCis8cGFyYT5PbiBwbGF0Zm9ybXMgb3RoZXIgdGhhbiBXaW5kb3dzLCA8bGl0ZXJhbD51bml4PC9saXRlcmFsPi1iYXNlZAorICB0cmFuc3BvcnRzICg8bGl0ZXJhbD51bml4PC9saXRlcmFsPiwgPGxpdGVyYWw+c3lzdGVtZDwvbGl0ZXJhbD4sCisgIDxsaXRlcmFsPmxhdW5jaGQ8L2xpdGVyYWw+KSBhcmUgdGhlIGRlZmF1bHQgZm9yIGJvdGggdGhlIHdlbGwta25vd24KKyAgc3lzdGVtIGJ1cyBhbmQgdGhlIHdlbGwta25vd24gc2Vzc2lvbiBidXMsIGFuZCBhcmUgc3Ryb25nbHkKKyAgcmVjb21tZW5kZWQuPC9wYXJhPgorCis8cGFyYT4KKyAgT24gV2luZG93cywgPGxpdGVyYWw+dW5peDwvbGl0ZXJhbD4tYmFzZWQgdHJhbnNwb3J0cyBhcmUgbm90IGF2YWlsYWJsZSwKKyAgc28gVENQLWJhc2VkIHRyYW5zcG9ydHMgbXVzdCBiZSB1c2VkLgorICBTaW1pbGFyIHRvIHJlbW90ZSBYMTEsIHRoZSA8bGl0ZXJhbD50Y3A8L2xpdGVyYWw+IGFuZAorICA8bGl0ZXJhbD5ub25jZS10Y3A8L2xpdGVyYWw+IHRyYW5zcG9ydHMgaGF2ZSBubyBpbnRlZ3JpdHkgb3IKKyAgY29uZmlkZW50aWFsaXR5IHByb3RlY3Rpb24sIHNvIHRoZXkgc2hvdWxkIG5vcm1hbGx5IG9ubHkgYmUKKyAgdXNlZCBhY3Jvc3MgdGhlIGxvY2FsIGxvb3BiYWNrIGludGVyZmFjZSwgZm9yIGV4YW1wbGUgdXNpbmcgYW4KKyAgYWRkcmVzcyBsaWtlIDxsaXRlcmFsPnRjcDpob3N0PTEyNy4wLjAuMTwvbGl0ZXJhbD4gb3IKKyAgPGxpdGVyYWw+bm9uY2UtdGNwOmhvc3Q9bG9jYWxob3N0PC9saXRlcmFsPi4gSW4gcGFydGljdWxhciwKKyAgY29uZmlndXJpbmcgdGhlIHdlbGwta25vd24gc3lzdGVtIGJ1cyBvciB0aGUgd2VsbC1rbm93biBzZXNzaW9uCisgIGJ1cyB0byBsaXN0ZW4gb24gYSBub24tbG9vcGJhY2sgVENQIGFkZHJlc3MgaXMgaW5zZWN1cmUuCis8L3BhcmE+Cis8cGFyYT4KKyAgRGV2ZWxvcGVycyBhcmUgc29tZXRpbWVzIHRlbXB0ZWQgdG8gdXNlIHJlbW90ZSBUQ1AgYXMgYSBkZWJ1Z2dpbmcKKyAgdG9vbC4gSG93ZXZlciwgaWYgdGhpcyBmdW5jdGlvbmFsaXR5IGlzIGxlZnQgZW5hYmxlZCBpbiBmaW5pc2hlZAorICBwcm9kdWN0cywgdGhlIHJlc3VsdCB3aWxsIGJlIGRhbmdlcm91c2x5IGluc2VjdXJlLiBJbnN0ZWFkIG9mCisgIHVzaW5nIHJlbW90ZSBUQ1AsIGRldmVsb3BlcnMgc2hvdWxkIDx1bGluaworICAgIHVybD0iaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvYXJjaGl2ZXMvZGJ1cy8yMDE4LUFwcmlsLzAxNzQ0Ny5odG1sIgorICAgID5yZWxheSBjb25uZWN0aW9ucyB2aWEgU2VjdXJlIFNoZWxsIG9yIGEgc2ltaWxhciBwcm90b2NvbDwvdWxpbms+LgorICA8IS0tIFRPRE86IElkZWFsbHkgc29tZW9uZSB3b3VsZCB3cml0ZSBhIG1vcmUgZm9ybWFsIGd1aWRlIHRvCisgICAgICAgcmVtb3RlIEQtQnVzIGRlYnVnZ2luZywgYW5kIHdlIGNvdWxkIGxpbmsgdG8gdGhhdCBpbnN0ZWFkIC0tPgorPC9wYXJhPgorPHBhcmE+CisgIFJlbW90ZSBUQ1AgY29ubmVjdGlvbnMgd2VyZSBoaXN0b3JpY2FsbHkgc29tZXRpbWVzIHVzZWQgdG8gc2hhcmUKKyAgYSBzaW5nbGUgc2Vzc2lvbiBidXMgYmV0d2VlbiBsb2dpbiBzZXNzaW9ucyBvZiB0aGUgc2FtZSB1c2VyIG9uCisgIGRpZmZlcmVudCBtYWNoaW5lcyB3aXRoaW4gYSB0cnVzdGVkIGxvY2FsIGFyZWEgbmV0d29yaywgaW4KKyAgY29uanVuY3Rpb24gd2l0aCB1bmVuY3J5cHRlZCByZW1vdGUgWDExLCBhIE5GUy1zaGFyZWQgaG9tZQorICBkaXJlY3RvcnkgYW5kIE5JUyAoWVApIGF1dGhlbnRpY2F0aW9uLiBUaGlzIGlzIGluc2VjdXJlIGFnYWluc3QKKyAgYW4gYXR0YWNrZXIgb24gdGhlIHNhbWUgTEFOIGFuZCBzaG91bGQgYmUgY29uc2lkZXJlZCBzdHJvbmdseQorICBkZXByZWNhdGVkOyBtb3JlIHNwZWNpZmljYWxseSwgaXQgaXMgaW5zZWN1cmUgaW4gdGhlIHNhbWUgd2F5cworICBhbmQgZm9yIHRoZSBzYW1lIHJlYXNvbnMgYXMgdW5lbmNyeXB0ZWQgcmVtb3RlIFgxMSBhbmQgTkZTdjIvTkZTdjMuCisgIFRoZSBELUJ1cyBtYWludGFpbmVycworICByZWNvbW1lbmQgdXNpbmcgYSBzZXBhcmF0ZSBzZXNzaW9uIGJ1cyBwZXIgKHVzZXIsIG1hY2hpbmUpIHBhaXIsCisgIG9ubHkgYWNjZXNzaWJsZSBmcm9tIHdpdGhpbiB0aGF0IG1hY2hpbmUuCis8L3BhcmE+CisKKzxwYXJhPkV4YW1wbGU6ICZsdDtsaXN0ZW4mZ3Q7dW5peDpwYXRoPS90bXAvZm9vJmx0Oy9saXN0ZW4mZ3Q7PC9wYXJhPgorCisKKzxwYXJhPkV4YW1wbGU6ICZsdDtsaXN0ZW4mZ3Q7dGNwOmhvc3Q9bG9jYWxob3N0LHBvcnQ9MTIzNCZsdDsvbGlzdGVuJmd0OzwvcGFyYT4KKworCis8cGFyYT5JZiB0aGVyZSBhcmUgbXVsdGlwbGUgJmx0O2xpc3RlbiZndDsgZWxlbWVudHMsIHRoZW4gdGhlIGJ1cyBsaXN0ZW5zCitvbiBtdWx0aXBsZSBhZGRyZXNzZXMuIFRoZSBidXMgd2lsbCBwYXNzIGl0cyBhZGRyZXNzIHRvCitzdGFydGVkIHNlcnZpY2VzIG9yIG90aGVyIGludGVyZXN0ZWQgcGFydGllcyB3aXRoCit0aGUgbGFzdCBhZGRyZXNzIGdpdmVuIGluICZsdDtsaXN0ZW4mZ3Q7IGZpcnN0LiBUaGF0IGlzLAorYXBwcyB3aWxsIHRyeSB0byBjb25uZWN0IHRvIHRoZSBsYXN0ICZsdDtsaXN0ZW4mZ3Q7IGFkZHJlc3MgZmlyc3QuPC9wYXJhPgorCisKKzxwYXJhPnRjcCBzb2NrZXRzIGNhbiBhY2NlcHQgSVB2NCBhZGRyZXNzZXMsIElQdjYgYWRkcmVzc2VzIG9yIGhvc3RuYW1lcy4KK0lmIGEgaG9zdG5hbWUgcmVzb2x2ZXMgdG8gbXVsdGlwbGUgYWRkcmVzc2VzLCB0aGUgc2VydmVyIHdpbGwgYmluZAordG8gYWxsIG9mIHRoZW0uIFRoZSBmYW1pbHk9aXB2NCBvciBmYW1pbHk9aXB2NiBvcHRpb25zIGNhbiBiZSB1c2VkCit0byBmb3JjZSBpdCB0byBiaW5kIHRvIGEgc3Vic2V0IG9mIGFkZHJlc3NlczwvcGFyYT4KKworCis8cGFyYT5FeGFtcGxlOiAmbHQ7bGlzdGVuJmd0O3RjcDpob3N0PWxvY2FsaG9zdCxwb3J0PTAsZmFtaWx5PWlwdjQmbHQ7L2xpc3RlbiZndDs8L3BhcmE+CisKKworPHBhcmE+QSBzcGVjaWFsIGNhc2UgaXMgdXNpbmcgYSBwb3J0IG51bWJlciBvZiB6ZXJvIChvciBvbWl0dGluZyB0aGUgcG9ydCksCit3aGljaCBtZWFucyB0byBjaG9vc2UgYW4gYXZhaWxhYmxlIHBvcnQgc2VsZWN0ZWQgYnkgdGhlIG9wZXJhdGluZworc3lzdGVtLiBUaGUgcG9ydCBudW1iZXIgY2hvc2VuIGNhbiBiZSBvYnRhaW5lZCB3aXRoIHRoZQorLS1wcmludC1hZGRyZXNzIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXIgYW5kIHdpbGwgYmUgcHJlc2VudCBpbiBvdGhlcgorY2FzZXMgd2hlcmUgdGhlIHNlcnZlciByZXBvcnRzIGl0cyBvd24gYWRkcmVzcywgc3VjaCBhcyB3aGVuCitEQlVTX1NFU1NJT05fQlVTX0FERFJFU1MgaXMgc2V0LjwvcGFyYT4KKworCis8cGFyYT5FeGFtcGxlOiAmbHQ7bGlzdGVuJmd0O3RjcDpob3N0PWxvY2FsaG9zdCxwb3J0PTAmbHQ7L2xpc3RlbiZndDs8L3BhcmE+CisKKworPHBhcmE+dGNwL25vbmNlLXRjcCBhZGRyZXNzZXMgYWxzbyBhbGxvdyBhIGJpbmQ9aG9zdG5hbWUgb3B0aW9uLAordXNlZCBpbiBhIGxpc3RlbmFibGUgYWRkcmVzcyB0byBjb25maWd1cmUgdGhlIGludGVyZmFjZSBvbiB3aGljaAordGhlIHNlcnZlciB3aWxsIGxpc3RlbjogZWl0aGVyIHRoZSBob3N0bmFtZSBpcyB0aGUgSVAgYWRkcmVzcyBvZgorb25lIG9mIHRoZSBsb2NhbCBtYWNoaW5lJ3MgaW50ZXJmYWNlcyAobW9zdCBjb21tb25seSAxMjcuMC4wLjEpLAorYSBETlMgbmFtZSB0aGF0IHJlc29sdmVzIHRvIG9uZSBvZiB0aG9zZSBJUCBhZGRyZXNzZXMsICcwLjAuMC4wJwordG8gbGlzdGVuIG9uIGFsbCBJUHY0IGludGVyZmFjZXMgc2ltdWx0YW5lb3VzbHksIG9yICc6OicKK3RvIGxpc3RlbiBvbiBhbGwgSVB2NCBhbmQgSVB2NiBpbnRlcmZhY2VzIHNpbXVsdGFuZW91c2x5IChpZiBzdXBwb3J0ZWQKK2J5IHRoZSBPUykuICBJZiBub3Qgc3BlY2lmaWVkLAordGhlIGRlZmF1bHQgaXMgdGhlIHNhbWUgdmFsdWUgYXMgImhvc3QiLjwvcGFyYT4KKworCis8cGFyYT5FeGFtcGxlOiAmbHQ7bGlzdGVuJmd0O3RjcDpob3N0PWxvY2FsaG9zdCxiaW5kPTAuMC4wLjAscG9ydD0wJmx0Oy9saXN0ZW4mZ3Q7PC9wYXJhPgorCis8aXRlbWl6ZWRsaXN0IHJlbWFwPSdUUCc+CisKKyAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcyByZW1hcD0nSSc+Jmx0O2F1dGgmZ3Q7PC9lbXBoYXNpcz48L3BhcmE+PC9saXN0aXRlbT4KKworCis8L2l0ZW1pemVkbGlzdD4KKworPHBhcmE+TGlzdHMgcGVybWl0dGVkIGF1dGhvcml6YXRpb24gbWVjaGFuaXNtcy4gSWYgdGhpcyBlbGVtZW50IGRvZXNuJ3QKK2V4aXN0LCB0aGVuIGFsbCBrbm93biBtZWNoYW5pc21zIGFyZSBhbGxvd2VkLiAgSWYgdGhlcmUgYXJlIG11bHRpcGxlCismbHQ7YXV0aCZndDsgZWxlbWVudHMsIGFsbCB0aGUgbGlzdGVkIG1lY2hhbmlzbXMgYXJlIGFsbG93ZWQuICBUaGUgb3JkZXIgaW4KK3doaWNoIG1lY2hhbmlzbXMgYXJlIGxpc3RlZCBpcyBub3QgbWVhbmluZ2Z1bC48L3BhcmE+CisKKzxwYXJhPk9uIG5vbi1XaW5kb3dzIG9wZXJhdGluZyBzeXN0ZW1zLCBhbGxvd2luZyBvbmx5IHRoZQorICA8bGl0ZXJhbD5FWFRFUk5BTDwvbGl0ZXJhbD4gYXV0aGVudGljYXRpb24KKyAgbWVjaGFuaXNtIGlzIHN0cm9uZ2x5IHJlY29tbWVuZGVkLiBUaGlzIGlzIHRoZSBkZWZhdWx0IGZvciB0aGUKKyAgd2VsbC1rbm93biBzeXN0ZW0gYnVzIGFuZCBmb3IgdGhlIHdlbGwta25vd24gc2Vzc2lvbiBidXMuPC9wYXJhPgorCis8cGFyYT5FeGFtcGxlOiAmbHQ7YXV0aCZndDtFWFRFUk5BTCZsdDsvYXV0aCZndDs8L3BhcmE+CisKKworPHBhcmE+RXhhbXBsZTogJmx0O2F1dGgmZ3Q7REJVU19DT09LSUVfU0hBMSZsdDsvYXV0aCZndDs8L3BhcmE+CisKKzxpdGVtaXplZGxpc3QgcmVtYXA9J1RQJz4KKworICA8bGlzdGl0ZW0+PHBhcmE+PGVtcGhhc2lzIHJlbWFwPSdJJz4mbHQ7c2VydmljZWRpciZndDs8L2VtcGhhc2lzPjwvcGFyYT48L2xpc3RpdGVtPgorCisKKzwvaXRlbWl6ZWRsaXN0PgorCis8cGFyYT4KKyAgQWRkcyBhIGRpcmVjdG9yeSB0byBzZWFyY2ggZm9yIC5zZXJ2aWNlIGZpbGVzLCB3aGljaCB0ZWxsIHRoZQorICBkYnVzLWRhZW1vbiBob3cgdG8gc3RhcnQgYSBwcm9ncmFtIHRvIHByb3ZpZGUgYSBwYXJ0aWN1bGFyIHdlbGwta25vd24KKyAgYnVzIG5hbWUuIFNlZSB0aGUgRC1CdXMgU3BlY2lmaWNhdGlvbiBmb3IgbW9yZSBkZXRhaWxzIGFib3V0IHRoZQorICBjb250ZW50cyBvZiAuc2VydmljZSBmaWxlcy4KKzwvcGFyYT4KKworPHBhcmE+CisgIElmIGEgcGFydGljdWxhciBzZXJ2aWNlIGlzIGZvdW5kIGluIG1vcmUgdGhhbiBvbmUgJmx0O3NlcnZpY2VkaXImZ3Q7LAorICB0aGUgZmlyc3QgZGlyZWN0b3J5IGxpc3RlZCBpbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlIHRha2VzIHByZWNlZGVuY2UuCisgIElmIHR3byBzZXJ2aWNlIGZpbGVzIHByb3ZpZGluZyB0aGUgc2FtZSB3ZWxsLWtub3duIGJ1cyBuYW1lIGFyZSBmb3VuZAorICBpbiB0aGUgc2FtZSBkaXJlY3RvcnksIGl0IGlzIGFyYml0cmFyeSB3aGljaCBvbmUgd2lsbCBiZSBjaG9zZW4KKyAgKHRoaXMgY2FuIG9ubHkgaGFwcGVuIGlmIGF0IGxlYXN0IG9uZSBvZiB0aGUgc2VydmljZSBmaWxlcyBkb2VzIG5vdAorICBoYXZlIHRoZSByZWNvbW1lbmRlZCBuYW1lLCB3aGljaCBpcyBpdHMgd2VsbC1rbm93biBidXMgbmFtZSBmb2xsb3dlZAorICBieSAiLnNlcnZpY2UiKS4KKzwvcGFyYT4KKworPGl0ZW1pemVkbGlzdCByZW1hcD0nVFAnPgorCisgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXMgcmVtYXA9J0knPiZsdDtzdGFuZGFyZF9zZXNzaW9uX3NlcnZpY2VkaXJzLyZndDs8L2VtcGhhc2lzPjwvcGFyYT48L2xpc3RpdGVtPgorCisKKzwvaXRlbWl6ZWRsaXN0PgorCis8cGFyYT4KKyAgJmx0O3N0YW5kYXJkX3Nlc3Npb25fc2VydmljZWRpcnMvJmd0OyByZXF1ZXN0cyBhIHN0YW5kYXJkIHNldCBvZgorICBzZXNzaW9uIHNlcnZpY2UgZGlyZWN0b3JpZXMuIEl0cyBlZmZlY3QgaXMgc2ltaWxhciB0byBzcGVjaWZ5aW5nIGEgc2VyaWVzCisgIG9mICZsdDtzZXJ2aWNlZGlyLyZndDsgZWxlbWVudHMgZm9yIGVhY2ggb2YgdGhlIGRhdGEgZGlyZWN0b3JpZXMsCisgIGluIHRoZSBvcmRlciBnaXZlbiBoZXJlLgorICBJdCBpcyBub3QgZXhhY3RseSBlcXVpdmFsZW50LCBiZWNhdXNlIHRoZXJlIGlzIGN1cnJlbnRseSBubyB3YXkKKyAgdG8gZGlzYWJsZSBkaXJlY3RvcnkgbW9uaXRvcmluZyBvciBlbmZvcmNlIHN0cmljdCBzZXJ2aWNlIGZpbGUgbmFtaW5nCisgIGZvciBhICZsdDtzZXJ2aWNlZGlyLyZndDsuCis8L3BhcmE+CisKKzxwYXJhPgorICBBcyB3aXRoICZsdDtzZXJ2aWNlZGlyLyZndDsgZWxlbWVudHMsIGlmIGEgcGFydGljdWxhciBzZXJ2aWNlIGlzIGZvdW5kCisgIGluIG1vcmUgdGhhbiBvbmUgc2VydmljZSBkaXJlY3RvcnksIHRoZSBmaXJzdCBkaXJlY3RvcnkgdGFrZXMgcHJlY2VkZW5jZS4KKyAgSWYgdHdvIHNlcnZpY2UgZmlsZXMgcHJvdmlkaW5nIHRoZSBzYW1lIHdlbGwta25vd24gYnVzIG5hbWUgYXJlIGZvdW5kCisgIGluIHRoZSBzYW1lIGRpcmVjdG9yeSwgaXQgaXMgYXJiaXRyYXJ5IHdoaWNoIG9uZSB3aWxsIGJlIGNob3NlbgorICAodGhpcyBjYW4gb25seSBoYXBwZW4gaWYgYXQgbGVhc3Qgb25lIG9mIHRoZSBzZXJ2aWNlIGZpbGVzIGRvZXMgbm90CisgIGhhdmUgdGhlIHJlY29tbWVuZGVkIG5hbWUsIHdoaWNoIGlzIGl0cyB3ZWxsLWtub3duIGJ1cyBuYW1lIGZvbGxvd2VkCisgIGJ5ICIuc2VydmljZSIpLgorPC9wYXJhPgorCis8cGFyYT4KKyAgT24gVW5peCwgdGhlIHN0YW5kYXJkIHNlc3Npb24gc2VydmljZSBkaXJlY3RvcmllcyBhcmU6CisgIDxpdGVtaXplZGxpc3Q+CisgICAgPGxpc3RpdGVtPgorICAgICAgPHBhcmE+CisgICAgICAgIDxlbXBoYXNpcz4kWERHX1JVTlRJTUVfRElSPC9lbXBoYXNpcz4vZGJ1cy0xL3NlcnZpY2VzLAorICAgICAgICBpZiBYREdfUlVOVElNRV9ESVIgaXMgc2V0IChzZWUgdGhlIFhERyBCYXNlIERpcmVjdG9yeQorICAgICAgICBTcGVjaWZpY2F0aW9uIGZvciBkZXRhaWxzIG9mIFhER19SVU5USU1FX0RJUik6CisgICAgICAgIHRoaXMgbG9jYXRpb24gaXMgc3VpdGFibGUgZm9yIHRyYW5zaWVudCBzZXJ2aWNlcyBjcmVhdGVkIGF0IHJ1bnRpbWUKKyAgICAgICAgYnkgc3lzdGVtZCBnZW5lcmF0b3JzIChzZWUKKyAgICAgICAgPGNpdGVyZWZlbnRyeT4KKyAgICAgICAgICA8cmVmZW50cnl0aXRsZT5zeXN0ZW1kLmdlbmVyYXRvcjwvcmVmZW50cnl0aXRsZT4KKyAgICAgICAgICA8bWFudm9sbnVtPjc8L21hbnZvbG51bT4KKyAgICAgICAgPC9jaXRlcmVmZW50cnk+KSwKKyAgICAgICAgc2Vzc2lvbiBtYW5hZ2VycyBvciBvdGhlciBzZXNzaW9uIGluZnJhc3RydWN0dXJlLgorICAgICAgICBJdCBpcyBhbiBleHRlbnNpb24gcHJvdmlkZWQgYnkgdGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbgorICAgICAgICBvZiBkYnVzLWRhZW1vbiwgYW5kIGlzIG5vdCBzdGFuZGFyZGl6ZWQgaW4gdGhlIEQtQnVzIFNwZWNpZmljYXRpb24uCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgVW5saWtlIHRoZSBvdGhlciBzdGFuZGFyZCBzZXNzaW9uIHNlcnZpY2UgZGlyZWN0b3JpZXMsIHRoaXMgZGlyZWN0b3J5CisgICAgICAgIGVuZm9yY2VzIHN0cmljdCBuYW1pbmcgZm9yIHRoZSBzZXJ2aWNlIGZpbGVzOiB0aGUgZmlsZW5hbWUgbXVzdCBiZQorICAgICAgICBleGFjdGx5IHRoZSB3ZWxsLWtub3duIGJ1cyBuYW1lIG9mIHRoZSBzZXJ2aWNlLCBmb2xsb3dlZCBieQorICAgICAgICAiLnNlcnZpY2UiLgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIEFsc28gdW5saWtlIHRoZSBvdGhlciBzdGFuZGFyZCBzZXNzaW9uIHNlcnZpY2UgZGlyZWN0b3JpZXMsIHRoaXMKKyAgICAgICAgZGlyZWN0b3J5IGlzIG5ldmVyIG1vbml0b3JlZCB3aXRoCisgICAgICAgIDxjaXRlcmVmZW50cnk+CisgICAgICAgICAgPHJlZmVudHJ5dGl0bGU+aW5vdGlmeTwvcmVmZW50cnl0aXRsZT4KKyAgICAgICAgICA8bWFudm9sbnVtPjc8L21hbnZvbG51bT4KKyAgICAgICAgPC9jaXRlcmVmZW50cnk+CisgICAgICAgIG9yIHNpbWlsYXIgQVBJcy4gUHJvZ3JhbXMgdGhhdCBjcmVhdGUgc2VydmljZSBmaWxlcyBpbiB0aGlzIGRpcmVjdG9yeQorICAgICAgICB3aGlsZSBhIGRidXMtZGFlbW9uIGlzIHJ1bm5pbmcgYXJlIGV4cGVjdGVkIHRvIGNhbGwgdGhlIGRidXMtZGFlbW9uJ3MKKyAgICAgICAgUmVsb2FkQ29uZmlnKCkgbWV0aG9kIGFmdGVyIHRoZXkgaGF2ZSBtYWRlIGNoYW5nZXMuCisgICAgICA8L3BhcmE+CisgICAgPC9saXN0aXRlbT4KKyAgICA8bGlzdGl0ZW0+CisgICAgICA8cGFyYT4KKyAgICAgICAgPGVtcGhhc2lzPiRYREdfREFUQV9IT01FPC9lbXBoYXNpcz4vZGJ1cy0xL3NlcnZpY2VzLAorICAgICAgICB3aGVyZSBYREdfREFUQV9IT01FIGRlZmF1bHRzIHRvIH4vLmxvY2FsL3NoYXJlCisgICAgICAgIChzZWUgdGhlIFhERyBCYXNlIERpcmVjdG9yeSBTcGVjaWZpY2F0aW9uKTogdGhpcyBsb2NhdGlvbiBpcworICAgICAgICBzcGVjaWZpZWQgYnkgdGhlIEQtQnVzIFNwZWNpZmljYXRpb24sIGFuZCBpcyBzdWl0YWJsZSBmb3IgcGVyLXVzZXIsCisgICAgICAgIGxvY2FsbHktaW5zdGFsbGVkIHNvZnR3YXJlLgorICAgICAgPC9wYXJhPgorICAgIDwvbGlzdGl0ZW0+CisgICAgPGxpc3RpdGVtPgorICAgICAgPHBhcmE+CisgICAgICAgIDxlbXBoYXNpcz5kaXJlY3Rvcnk8L2VtcGhhc2lzPi9kYnVzLTEvc2VydmljZXMgZm9yIGVhY2gKKyAgICAgICAgZGlyZWN0b3J5IGluIFhER19EQVRBX0RJUlMsIHdoZXJlIFhER19EQVRBX0RJUlMgZGVmYXVsdHMgdG8KKyAgICAgICAgL3Vzci9sb2NhbC9zaGFyZTovdXNyL3NoYXJlCisgICAgICAgIChzZWUgdGhlIFhERyBCYXNlIERpcmVjdG9yeSBTcGVjaWZpY2F0aW9uKTogdGhlc2UgbG9jYXRpb25zIGFyZQorICAgICAgICBzcGVjaWZpZWQgYnkgdGhlIEQtQnVzIFNwZWNpZmljYXRpb24uIFRoZSBkZWZhdWx0cyBhcmUgc3VpdGFibGUKKyAgICAgICAgZm9yIHNvZnR3YXJlIGluc3RhbGxlZCBsb2NhbGx5IGJ5IGEgc3lzdGVtIGFkbWluaXN0cmF0b3IKKyAgICAgICAgKC91c3IvbG9jYWwvc2hhcmUpIG9yIGZvciBzb2Z0d2FyZSBpbnN0YWxsZWQgZnJvbSBvcGVyYXRpbmcgc3lzdGVtCisgICAgICAgIHBhY2thZ2VzICgvdXNyL3NoYXJlKS4gUGVyLXVzZXIgb3Igc3lzdGVtLXdpZGUgY29uZmlndXJhdGlvbiB0aGF0CisgICAgICAgIHNldHMgdGhlIFhER19EQVRBX0RJUlMgZW52aXJvbm1lbnQgdmFyaWFibGUgY2FuIGV4dGVuZCB0aGlzIHNlYXJjaAorICAgICAgICBwYXRoIHRvIGNvdmVyIGluc3RhbGxhdGlvbnMgaW4gb3RoZXIgbG9jYXRpb25zLCBmb3IgZXhhbXBsZQorICAgICAgICB+Ly5sb2NhbC9zaGFyZS9mbGF0cGFrL2V4cG9ydHMvc2hhcmUvIGFuZAorICAgICAgICAvdmFyL2xpYi9mbGF0cGFrL2V4cG9ydHMvc2hhcmUvIHdoZW4KKyAgICAgICAgPGNpdGVyZWZlbnRyeT4KKyAgICAgICAgICA8cmVmZW50cnl0aXRsZT5mbGF0cGFrPC9yZWZlbnRyeXRpdGxlPgorICAgICAgICAgIDxtYW52b2xudW0+MTwvbWFudm9sbnVtPgorICAgICAgICA8L2NpdGVyZWZlbnRyeT4KKyAgICAgICAgaXMgdXNlZC4KKyAgICAgIDwvcGFyYT4KKyAgICA8L2xpc3RpdGVtPgorICAgIDxsaXN0aXRlbT4KKyAgICAgIDxwYXJhPgorICAgICAgICA8ZW1waGFzaXM+JHtkYXRhZGlyfTwvZW1waGFzaXM+L2RidXMtMS9zZXJ2aWNlcworICAgICAgICBmb3IgdGhlIDxlbXBoYXNpcz4ke2RhdGFkaXJ9PC9lbXBoYXNpcz4gdGhhdCB3YXMgc3BlY2lmaWVkIHdoZW4KKyAgICAgICAgZGJ1cyB3YXMgY29tcGlsZWQsIHR5cGljYWxseSAvdXNyL3NoYXJlOiB0aGlzIGxvY2F0aW9uIGlzIGFuCisgICAgICAgIGV4dGVuc2lvbiBwcm92aWRlZCBieSB0aGUgcmVmZXJlbmNlIGRidXMtZGFlbW9uIGltcGxlbWVudGF0aW9uLAorICAgICAgICBhbmQgaXMgc3VpdGFibGUgZm9yIHNvZnR3YXJlIHN0YWNrcyBpbnN0YWxsZWQgYWxvbmdzaWRlIGRidXMtZGFlbW9uLgorICAgICAgPC9wYXJhPgorICAgIDwvbGlzdGl0ZW0+CisgIDwvaXRlbWl6ZWRsaXN0PgorPC9wYXJhPgorCis8cGFyYT5UaGUgIlhERyBCYXNlIERpcmVjdG9yeSBTcGVjaWZpY2F0aW9uIiBjYW4gYmUgZm91bmQgYXQKKzx1bGluayB1cmw9J2h0dHA6Ly9mcmVlZGVza3RvcC5vcmcvd2lraS9TdGFuZGFyZHMvYmFzZWRpci1zcGVjJz5odHRwOi8vZnJlZWRlc2t0b3Aub3JnL3dpa2kvU3RhbmRhcmRzL2Jhc2VkaXItc3BlYzwvdWxpbms+IGlmIGl0IGhhc24ndCBtb3ZlZCwKK290aGVyd2lzZSB0cnkgeW91ciBmYXZvcml0ZSBzZWFyY2ggZW5naW5lLjwvcGFyYT4KKworPHBhcmE+CisgIE9uIFdpbmRvd3MsIHRoZSBzdGFuZGFyZCBzZXNzaW9uIHNlcnZpY2UgZGlyZWN0b3JpZXMgYXJlOgorICA8aXRlbWl6ZWRsaXN0PgorICAgIDxsaXN0aXRlbT4KKyAgICAgIDxwYXJhPgorICAgICAgICA8ZW1waGFzaXM+JUNvbW1vblByb2dyYW1GaWxlcyU8L2VtcGhhc2lzPi9kYnVzLTEvc2VydmljZXMKKyAgICAgICAgaWYgJUNvbW1vblByb2dyYW1GaWxlcyUgaXMgc2V0OiB0aGlzIGxvY2F0aW9uIGlzIHN1aXRhYmxlIGZvcgorICAgICAgICBzeXN0ZW0td2lkZSBpbnN0YWxsZWQgc29mdHdhcmUgcGFja2FnZXMKKyAgICAgIDwvcGFyYT4KKyAgICA8L2xpc3RpdGVtPgorICAgIDxsaXN0aXRlbT4KKyAgICAgIDxwYXJhPgorICAgICAgICBBIHNoYXJlL2RidXMtMS9zZXJ2aWNlcyBkaXJlY3RvcnkgZm91bmQgaW4gdGhlIHNhbWUKKyAgICAgICAgZGlyZWN0b3J5IGhpZXJhcmNoeSAocHJlZml4KSBhcyB0aGUgZGJ1cy1kYWVtb246IHRoaXMgbG9jYXRpb24KKyAgICAgICAgaXMgc3VpdGFibGUgZm9yIHNvZnR3YXJlIHN0YWNrcyBpbnN0YWxsZWQgYWxvbmdzaWRlIGRidXMtZGFlbW9uCisgICAgICA8L3BhcmE+CisgICAgPC9saXN0aXRlbT4KKyAgPC9pdGVtaXplZGxpc3Q+Cis8L3BhcmE+CisKKworPHBhcmE+VGhlICZsdDtzdGFuZGFyZF9zZXNzaW9uX3NlcnZpY2VkaXJzLyZndDsgb3B0aW9uIGlzIG9ubHkgcmVsZXZhbnQgdG8gdGhlCitwZXItdXNlci1zZXNzaW9uIGJ1cyBkYWVtb24gZGVmaW5lZCBpbgorQEVYUEFOREVEX1NZU0NPTkZESVJAL2RidXMtMS9zZXNzaW9uLmNvbmYuIFB1dHRpbmcgaXQgaW4gYW55IG90aGVyCitjb25maWd1cmF0aW9uIGZpbGUgd291bGQgcHJvYmFibHkgYmUgbm9uc2Vuc2UuPC9wYXJhPgorCis8aXRlbWl6ZWRsaXN0IHJlbWFwPSdUUCc+CisKKyAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcyByZW1hcD0nSSc+Jmx0O3N0YW5kYXJkX3N5c3RlbV9zZXJ2aWNlZGlycy8mZ3Q7PC9lbXBoYXNpcz48L3BhcmE+PC9saXN0aXRlbT4KKworCis8L2l0ZW1pemVkbGlzdD4KKworPHBhcmE+Jmx0O3N0YW5kYXJkX3N5c3RlbV9zZXJ2aWNlZGlycy8mZ3Q7IHNwZWNpZmllcyB0aGUgc3RhbmRhcmQgc3lzdGVtLXdpZGUKKyAgYWN0aXZhdGlvbiBkaXJlY3RvcmllcyB0aGF0IHNob3VsZCBiZSBzZWFyY2hlZCBmb3Igc2VydmljZSBmaWxlcy4KKyAgQXMgd2l0aCBzZXNzaW9uIHNlcnZpY2VzLCB0aGUgZmlyc3QgZGlyZWN0b3J5IGxpc3RlZCBoYXMgaGlnaGVzdAorICBwcmVjZWRlbmNlLjwvcGFyYT4KKworPHBhcmE+CisgIE9uIFVuaXgsIHRoZSBzdGFuZGFyZCBzZXNzaW9uIHNlcnZpY2UgZGlyZWN0b3JpZXMgYXJlOgorICA8aXRlbWl6ZWRsaXN0PgorICAgIDxsaXN0aXRlbT4KKyAgICAgIDxwYXJhPgorICAgICAgICAvdXNyL2xvY2FsL3NoYXJlL2RidXMtMS9zeXN0ZW0tc2VydmljZXM6IHRoaXMgbG9jYXRpb24gaXMKKyAgICAgICAgc3BlY2lmaWVkIGJ5IHRoZSBELUJ1cyBTcGVjaWZpY2F0aW9uLCBhbmQgaXMgc3VpdGFibGUgZm9yCisgICAgICAgIHNvZnR3YXJlIGluc3RhbGxlZCBsb2NhbGx5IGJ5IHRoZSBzeXN0ZW0gYWRtaW5pc3RyYXRvcgorICAgICAgPC9wYXJhPgorICAgIDwvbGlzdGl0ZW0+CisgICAgPGxpc3RpdGVtPgorICAgICAgPHBhcmE+CisgICAgICAgIC91c3Ivc2hhcmUvZGJ1cy0xL3N5c3RlbS1zZXJ2aWNlczogdGhpcyBsb2NhdGlvbiBpcworICAgICAgICBzcGVjaWZpZWQgYnkgdGhlIEQtQnVzIFNwZWNpZmljYXRpb24sIGFuZCBpcyBzdWl0YWJsZSBmb3IKKyAgICAgICAgc29mdHdhcmUgaW5zdGFsbGVkIGJ5IG9wZXJhdGluZyBzeXN0ZW0gcGFja2FnZXMKKyAgICAgIDwvcGFyYT4KKyAgICA8L2xpc3RpdGVtPgorICAgIDxsaXN0aXRlbT4KKyAgICAgIDxwYXJhPgorICAgICAgICA8ZW1waGFzaXM+JHtkYXRhZGlyfTwvZW1waGFzaXM+L2RidXMtMS9zeXN0ZW0tc2VydmljZXMKKyAgICAgICAgZm9yIHRoZSA8ZW1waGFzaXM+JHtkYXRhZGlyfTwvZW1waGFzaXM+IHRoYXQgd2FzIHNwZWNpZmllZCB3aGVuCisgICAgICAgIGRidXMgd2FzIGNvbXBpbGVkLCB0eXBpY2FsbHkgL3Vzci9zaGFyZTogdGhpcyBsb2NhdGlvbiBpcyBhbgorICAgICAgICBleHRlbnNpb24gcHJvdmlkZWQgYnkgdGhlIHJlZmVyZW5jZSBkYnVzLWRhZW1vbiBpbXBsZW1lbnRhdGlvbiwKKyAgICAgICAgYW5kIGlzIHN1aXRhYmxlIGZvciBzb2Z0d2FyZSBzdGFja3MgaW5zdGFsbGVkIGFsb25nc2lkZSBkYnVzLWRhZW1vbgorICAgICAgPC9wYXJhPgorICAgIDwvbGlzdGl0ZW0+CisgICAgPGxpc3RpdGVtPgorICAgICAgPHBhcmE+CisgICAgICAgIC9saWIvZGJ1cy0xL3N5c3RlbS1zZXJ2aWNlczogdGhpcyBsb2NhdGlvbiBpcworICAgICAgICBzcGVjaWZpZWQgYnkgdGhlIEQtQnVzIFNwZWNpZmljYXRpb24sIGFuZCB3YXMgaW50ZW5kZWQgZm9yCisgICAgICAgIHNvZnR3YXJlIGluc3RhbGxlZCBieSBvcGVyYXRpbmcgc3lzdGVtIHBhY2thZ2VzIGFuZCB1c2VkIGR1cmluZworICAgICAgICBlYXJseSBib290IChidXQgaXQgc2hvdWxkIGJlIGNvbnNpZGVyZWQgZGVwcmVjYXRlZCwgYmVjYXVzZQorICAgICAgICB0aGUgcmVmZXJlbmNlIGRidXMtZGFlbW9uIGlzIG5vdCBkZXNpZ25lZCB0byBiZSBhdmFpbGFibGUgZHVyaW5nCisgICAgICAgIGVhcmx5IGJvb3QpCisgICAgICA8L3BhcmE+CisgICAgPC9saXN0aXRlbT4KKyAgPC9pdGVtaXplZGxpc3Q+Cis8L3BhcmE+CisKKzxwYXJhPgorICBPbiBXaW5kb3dzLCB0aGVyZSBpcyBubyBzdGFuZGFyZCBzeXN0ZW0gYnVzLCBzbyB0aGVyZSBhcmUgbm8gc3RhbmRhcmQKKyAgc3lzdGVtIGJ1cyBkaXJlY3RvcmllcyBlaXRoZXIuCis8L3BhcmE+CisKKzxwYXJhPlRoZSAmbHQ7c3RhbmRhcmRfc3lzdGVtX3NlcnZpY2VkaXJzLyZndDsgb3B0aW9uIGlzIG9ubHkgcmVsZXZhbnQgdG8gdGhlCitwZXItc3lzdGVtIGJ1cyBkYWVtb24gZGVmaW5lZCBpbgorQEVYUEFOREVEX0RBVEFESVJAL2RidXMtMS9zeXN0ZW0uY29uZi4gUHV0dGluZyBpdCBpbiBhbnkgb3RoZXIKK2NvbmZpZ3VyYXRpb24gZmlsZSB3b3VsZCBwcm9iYWJseSBiZSBub25zZW5zZS48L3BhcmE+CisKKzxpdGVtaXplZGxpc3QgcmVtYXA9J1RQJz4KKworICA8bGlzdGl0ZW0+PHBhcmE+PGVtcGhhc2lzIHJlbWFwPSdJJz4mbHQ7c2VydmljZWhlbHBlci8mZ3Q7PC9lbXBoYXNpcz48L3BhcmE+PC9saXN0aXRlbT4KKworCis8L2l0ZW1pemVkbGlzdD4KKworPHBhcmE+Jmx0O3NlcnZpY2VoZWxwZXIvJmd0OyBzcGVjaWZpZXMgdGhlIHNldHVpZCBoZWxwZXIgdGhhdCBpcyB1c2VkIHRvIGxhdW5jaAorc3lzdGVtIGRhZW1vbnMgd2l0aCBhbiBhbHRlcm5hdGUgdXNlci4gVHlwaWNhbGx5IHRoaXMgc2hvdWxkIGJlCit0aGUgZGJ1cy1kYWVtb24tbGF1bmNoLWhlbHBlciBleGVjdXRhYmxlIGluIGxvY2F0ZWQgaW4gbGliZXhlYy48L3BhcmE+CisKKworPHBhcmE+VGhlICZsdDtzZXJ2aWNlaGVscGVyLyZndDsgb3B0aW9uIGlzIG9ubHkgcmVsZXZhbnQgdG8gdGhlIHBlci1zeXN0ZW0gYnVzIGRhZW1vbgorZGVmaW5lZCBpbiBARVhQQU5ERURfREFUQURJUkAvZGJ1cy0xL3N5c3RlbS5jb25mLiBQdXR0aW5nIGl0IGluIGFueSBvdGhlcgorY29uZmlndXJhdGlvbiBmaWxlIHdvdWxkIHByb2JhYmx5IGJlIG5vbnNlbnNlLjwvcGFyYT4KKworPGl0ZW1pemVkbGlzdCByZW1hcD0nVFAnPgorCisgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXMgcmVtYXA9J0knPiZsdDtsaW1pdCZndDs8L2VtcGhhc2lzPjwvcGFyYT48L2xpc3RpdGVtPgorCisKKzwvaXRlbWl6ZWRsaXN0PgorCis8cGFyYT4mbHQ7bGltaXQmZ3Q7IGVzdGFibGlzaGVzIGEgcmVzb3VyY2UgbGltaXQuIEZvciBleGFtcGxlOjwvcGFyYT4KKzxsaXRlcmFsbGF5b3V0IHJlbWFwPScubmYnPgorICAmbHQ7bGltaXQgbmFtZT0ibWF4X21lc3NhZ2Vfc2l6ZSImZ3Q7NjQmbHQ7L2xpbWl0Jmd0OworICAmbHQ7bGltaXQgbmFtZT0ibWF4X2NvbXBsZXRlZF9jb25uZWN0aW9ucyImZ3Q7NTEyJmx0Oy9saW1pdCZndDsKKzwvbGl0ZXJhbGxheW91dD4gPCEtLSAuZmkgLS0+CisKKworPHBhcmE+VGhlIG5hbWUgYXR0cmlidXRlIGlzIG1hbmRhdG9yeS4KK0F2YWlsYWJsZSBsaW1pdCBuYW1lcyBhcmU6PC9wYXJhPgorPGxpdGVyYWxsYXlvdXQgcmVtYXA9Jy5uZic+CisgICAgICAibWF4X2luY29taW5nX2J5dGVzIiAgICAgICAgIDogdG90YWwgc2l6ZSBpbiBieXRlcyBvZiBtZXNzYWdlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY29taW5nIGZyb20gYSBzaW5nbGUgY29ubmVjdGlvbgorICAgICAgIm1heF9pbmNvbWluZ191bml4X2ZkcyIgICAgICA6IHRvdGFsIG51bWJlciBvZiB1bml4IGZkcyBvZiBtZXNzYWdlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY29taW5nIGZyb20gYSBzaW5nbGUgY29ubmVjdGlvbgorICAgICAgIm1heF9vdXRnb2luZ19ieXRlcyIgICAgICAgICA6IHRvdGFsIHNpemUgaW4gYnl0ZXMgb2YgbWVzc2FnZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZWQgdXAgZm9yIGEgc2luZ2xlIGNvbm5lY3Rpb24KKyAgICAgICJtYXhfb3V0Z29pbmdfdW5peF9mZHMiICAgICAgOiB0b3RhbCBudW1iZXIgb2YgdW5peCBmZHMgb2YgbWVzc2FnZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZWQgdXAgZm9yIGEgc2luZ2xlIGNvbm5lY3Rpb24KKyAgICAgICJtYXhfbWVzc2FnZV9zaXplIiAgICAgICAgICAgOiBtYXggc2l6ZSBvZiBhIHNpbmdsZSBtZXNzYWdlIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXMKKyAgICAgICJtYXhfbWVzc2FnZV91bml4X2ZkcyIgICAgICAgOiBtYXggdW5peCBmZHMgb2YgYSBzaW5nbGUgbWVzc2FnZQorICAgICAgInNlcnZpY2Vfc3RhcnRfdGltZW91dCIgICAgICA6IG1pbGxpc2Vjb25kcyAodGhvdXNhbmR0aHMpIHVudGlsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBzdGFydGVkIHNlcnZpY2UgaGFzIHRvIGNvbm5lY3QKKyAgICAgICJhdXRoX3RpbWVvdXQiICAgICAgICAgICAgICAgOiBtaWxsaXNlY29uZHMgKHRob3VzYW5kdGhzKSBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiBpcyBnaXZlbiB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0ZQorICAgICAgInBlbmRpbmdfZmRfdGltZW91dCIgICAgICAgICA6IG1pbGxpc2Vjb25kcyAodGhvdXNhbmR0aHMpIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZCBpcyBnaXZlbiB0byBiZSB0cmFuc21pdHRlZCB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXMtZGFlbW9uIGJlZm9yZSBkaXNjb25uZWN0aW5nIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24KKyAgICAgICJtYXhfY29tcGxldGVkX2Nvbm5lY3Rpb25zIiAgOiBtYXggbnVtYmVyIG9mIGF1dGhlbnRpY2F0ZWQgY29ubmVjdGlvbnMKKyAgICAgICJtYXhfaW5jb21wbGV0ZV9jb25uZWN0aW9ucyIgOiBtYXggbnVtYmVyIG9mIHVuYXV0aGVudGljYXRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25zCisgICAgICAibWF4X2Nvbm5lY3Rpb25zX3Blcl91c2VyIiAgIDogbWF4IG51bWJlciBvZiBjb21wbGV0ZWQgY29ubmVjdGlvbnMgZnJvbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzYW1lIHVzZXIKKyAgICAgICJtYXhfcGVuZGluZ19zZXJ2aWNlX3N0YXJ0cyIgOiBtYXggbnVtYmVyIG9mIHNlcnZpY2UgbGF1bmNoZXMgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmVzcyBhdCB0aGUgc2FtZSB0aW1lCisgICAgICAibWF4X25hbWVzX3Blcl9jb25uZWN0aW9uIiAgIDogbWF4IG51bWJlciBvZiBuYW1lcyBhIHNpbmdsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24gY2FuIG93bgorICAgICAgIm1heF9tYXRjaF9ydWxlc19wZXJfY29ubmVjdGlvbiI6IG1heCBudW1iZXIgb2YgbWF0Y2ggcnVsZXMgZm9yIGEgc2luZ2xlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbgorICAgICAgIm1heF9yZXBsaWVzX3Blcl9jb25uZWN0aW9uIiA6IG1heCBudW1iZXIgb2YgcGVuZGluZyBtZXRob2QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsaWVzIHBlciBjb25uZWN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG51bWJlciBvZiBjYWxscy1pbi1wcm9ncmVzcykKKyAgICAgICJyZXBseV90aW1lb3V0IiAgICAgICAgICAgICAgOiBtaWxsaXNlY29uZHMgKHRob3VzYW5kdGhzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVudGlsIGEgbWV0aG9kIGNhbGwgdGltZXMgb3V0Cis8L2xpdGVyYWxsYXlvdXQ+IDwhLS0gLmZpIC0tPgorCisKKzxwYXJhPlRoZSBtYXggaW5jb21pbmcvb3V0Z29pbmcgcXVldWUgc2l6ZXMgYWxsb3cgYSBuZXcgbWVzc2FnZSB0byBiZSBxdWV1ZWQKK2lmIG9uZSBieXRlIHJlbWFpbnMgYmVsb3cgdGhlIG1heC4gU28geW91IGNhbiBpbiBmYWN0IGV4Y2VlZCB0aGUgbWF4CitieSBtYXhfbWVzc2FnZV9zaXplLjwvcGFyYT4KKworCis8cGFyYT5tYXhfY29tcGxldGVkX2Nvbm5lY3Rpb25zIGRpdmlkZWQgYnkgbWF4X2Nvbm5lY3Rpb25zX3Blcl91c2VyIGlzIHRoZQorbnVtYmVyIG9mIHVzZXJzIHRoYXQgY2FuIHdvcmsgdG9nZXRoZXIgdG8gZGVuaWFsLW9mLXNlcnZpY2UgYWxsIG90aGVyIHVzZXJzIGJ5IHVzaW5nCit1cCBhbGwgY29ubmVjdGlvbnMgb24gdGhlIHN5c3RlbXdpZGUgYnVzLjwvcGFyYT4KKworCis8cGFyYT5MaW1pdHMgYXJlIG5vcm1hbGx5IG9ubHkgb2YgaW50ZXJlc3Qgb24gdGhlIHN5c3RlbXdpZGUgYnVzLCBub3QgdGhlIHVzZXIgc2Vzc2lvbgorYnVzZXMuPC9wYXJhPgorCis8aXRlbWl6ZWRsaXN0IHJlbWFwPSdUUCc+CisKKyAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcyByZW1hcD0nSSc+Jmx0O3BvbGljeSZndDs8L2VtcGhhc2lzPjwvcGFyYT48L2xpc3RpdGVtPgorCisKKzwvaXRlbWl6ZWRsaXN0PgorCis8cGFyYT5UaGUgJmx0O3BvbGljeSZndDsgZWxlbWVudCBkZWZpbmVzIGEgc2VjdXJpdHkgcG9saWN5IHRvIGJlIGFwcGxpZWQgdG8gYSBwYXJ0aWN1bGFyCitzZXQgb2YgY29ubmVjdGlvbnMgdG8gdGhlIGJ1cy4gQSBwb2xpY3kgaXMgbWFkZSB1cCBvZgorJmx0O2FsbG93Jmd0OyBhbmQgJmx0O2RlbnkmZ3Q7IGVsZW1lbnRzLiBQb2xpY2llcyBhcmUgbm9ybWFsbHkgdXNlZCB3aXRoIHRoZSBzeXN0ZW13aWRlIGJ1czsKK3RoZXkgYXJlIGFuYWxvZ291cyB0byBhIGZpcmV3YWxsIGluIHRoYXQgdGhleSBhbGxvdyBleHBlY3RlZCB0cmFmZmljCithbmQgcHJldmVudCB1bmV4cGVjdGVkIHRyYWZmaWMuPC9wYXJhPgorCisKKzxwYXJhPgorICBDdXJyZW50bHksIHRoZSBzeXN0ZW0gYnVzIGhhcyBhIGRlZmF1bHQtZGVueSBwb2xpY3kgZm9yIHNlbmRpbmcgbWV0aG9kIGNhbGxzCisgIGFuZCBvd25pbmcgYnVzIG5hbWVzLCBhbmQgYSBkZWZhdWx0LWFsbG93IHBvbGljeSBmb3IgcmVjZWl2aW5nIG1lc3NhZ2VzLAorICBzZW5kaW5nIHNpZ25hbHMsIGFuZCBzZW5kaW5nIGEgc2luZ2xlIHN1Y2Nlc3Mgb3IgZXJyb3IgcmVwbHkgZm9yIGVhY2gKKyAgbWV0aG9kIGNhbGwgdGhhdCBkb2VzIG5vdCBoYXZlIHRoZSA8bGl0ZXJhbD5OT19SRVBMWTwvbGl0ZXJhbD4gZmxhZy4KKyAgU2VuZGluZyBtb3JlIHRoYW4gdGhlIGV4cGVjdGVkIG51bWJlciBvZiByZXBsaWVzIGlzIG5vdCBhbGxvd2VkLgorPC9wYXJhPgorCisKKzxwYXJhPkluIGdlbmVyYWwsIGl0IGlzIGJlc3QgdG8ga2VlcCBzeXN0ZW0gc2VydmljZXMgYXMgc21hbGwsIHRhcmdldGVkIHByb2dyYW1zIHdoaWNoCitydW4gaW4gdGhlaXIgb3duIHByb2Nlc3MgYW5kIHByb3ZpZGUgYSBzaW5nbGUgYnVzIG5hbWUuICBUaGVuLCBhbGwgdGhhdCBpcyBuZWVkZWQKK2lzIGFuICZsdDthbGxvdyZndDsgcnVsZSBmb3IgdGhlICJvd24iIHBlcm1pc3Npb24gdG8gbGV0IHRoZSBwcm9jZXNzIGNsYWltIHRoZSBidXMKK25hbWUsIGFuZCBhICJzZW5kX2Rlc3RpbmF0aW9uIiBydWxlIHRvIGFsbG93IHRyYWZmaWMgZnJvbSBzb21lIG9yIGFsbCB1aWRzIHRvCit5b3VyIHNlcnZpY2UuPC9wYXJhPgorCisKKzxwYXJhPlRoZSAmbHQ7cG9saWN5Jmd0OyBlbGVtZW50IGhhcyBvbmUgb2YgZm91ciBhdHRyaWJ1dGVzOjwvcGFyYT4KKzxsaXRlcmFsbGF5b3V0IHJlbWFwPScubmYnPgorICBjb250ZXh0PSIoZGVmYXVsdHxtYW5kYXRvcnkpIgorICBhdF9jb25zb2xlPSIodHJ1ZXxmYWxzZSkiCisgIHVzZXI9InVzZXJuYW1lIG9yIHVzZXJpZCIKKyAgZ3JvdXA9Imdyb3VwIG5hbWUgb3IgZ2lkIgorPC9saXRlcmFsbGF5b3V0PiA8IS0tIC5maSAtLT4KKworCis8cGFyYT5Qb2xpY2llcyBhcmUgYXBwbGllZCB0byBhIGNvbm5lY3Rpb24gYXMgZm9sbG93czo8L3BhcmE+Cis8bGl0ZXJhbGxheW91dCByZW1hcD0nLm5mJz4KKyAgIC0gYWxsIGNvbnRleHQ9ImRlZmF1bHQiIHBvbGljaWVzIGFyZSBhcHBsaWVkCisgICAtIGFsbCBncm91cD0iY29ubmVjdGlvbidzIHVzZXIncyBncm91cCIgcG9saWNpZXMgYXJlIGFwcGxpZWQKKyAgICAgaW4gdW5kZWZpbmVkIG9yZGVyCisgICAtIGFsbCB1c2VyPSJjb25uZWN0aW9uJ3MgYXV0aCB1c2VyIiBwb2xpY2llcyBhcmUgYXBwbGllZAorICAgICBpbiB1bmRlZmluZWQgb3JkZXIKKyAgIC0gYWxsIGF0X2NvbnNvbGU9InRydWUiIHBvbGljaWVzIGFyZSBhcHBsaWVkCisgICAtIGFsbCBhdF9jb25zb2xlPSJmYWxzZSIgcG9saWNpZXMgYXJlIGFwcGxpZWQKKyAgIC0gYWxsIGNvbnRleHQ9Im1hbmRhdG9yeSIgcG9saWNpZXMgYXJlIGFwcGxpZWQKKzwvbGl0ZXJhbGxheW91dD4gPCEtLSAuZmkgLS0+CisKKworPHBhcmE+UG9saWNpZXMgYXBwbGllZCBsYXRlciB3aWxsIG92ZXJyaWRlIHRob3NlIGFwcGxpZWQgZWFybGllciwKK3doZW4gdGhlIHBvbGljaWVzIG92ZXJsYXAuIE11bHRpcGxlIHBvbGljaWVzIHdpdGggdGhlIHNhbWUKK3VzZXIvZ3JvdXAvY29udGV4dCBhcmUgYXBwbGllZCBpbiB0aGUgb3JkZXIgdGhleSBhcHBlYXIKK2luIHRoZSBjb25maWcgZmlsZS48L3BhcmE+CisKKzx2YXJpYWJsZWxpc3QgcmVtYXA9J1RQJz4KKyAgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PGVtcGhhc2lzIHJlbWFwPSdJJz4mbHQ7ZGVueSZndDs8L2VtcGhhc2lzPjwvdGVybT4KKyAgPGxpc3RpdGVtPgorPHBhcmE+PGVtcGhhc2lzIHJlbWFwPSdJJz4mbHQ7YWxsb3cmZ3Q7PC9lbXBoYXNpcz48L3BhcmE+CisKKyAgPC9saXN0aXRlbT4KKyAgPC92YXJsaXN0ZW50cnk+Cis8L3ZhcmlhYmxlbGlzdD4KKworPHBhcmE+QSAmbHQ7ZGVueSZndDsgZWxlbWVudCBhcHBlYXJzIGJlbG93IGEgJmx0O3BvbGljeSZndDsgZWxlbWVudCBhbmQgcHJvaGliaXRzIHNvbWUKK2FjdGlvbi4gVGhlICZsdDthbGxvdyZndDsgZWxlbWVudCBtYWtlcyBhbiBleGNlcHRpb24gdG8gcHJldmlvdXMgJmx0O2RlbnkmZ3Q7CitzdGF0ZW1lbnRzLCBhbmQgd29ya3MganVzdCBsaWtlICZsdDtkZW55Jmd0OyBidXQgd2l0aCB0aGUgaW52ZXJzZSBtZWFuaW5nLjwvcGFyYT4KKworCis8cGFyYT5UaGUgcG9zc2libGUgYXR0cmlidXRlcyBvZiB0aGVzZSBlbGVtZW50cyBhcmU6PC9wYXJhPgorPGxpdGVyYWxsYXlvdXQgcmVtYXA9Jy5uZic+CisgICBzZW5kX2ludGVyZmFjZT0iaW50ZXJmYWNlX25hbWUiIHwgIioiCisgICBzZW5kX21lbWJlcj0ibWV0aG9kX29yX3NpZ25hbF9uYW1lIiB8ICIqIgorICAgc2VuZF9lcnJvcj0iZXJyb3JfbmFtZSIgfCAiKiIKKyAgIHNlbmRfYnJvYWRjYXN0PSJ0cnVlIiB8ICJmYWxzZSIKKyAgIHNlbmRfZGVzdGluYXRpb249Im5hbWUiIHwgIioiCisgICBzZW5kX3R5cGU9Im1ldGhvZF9jYWxsIiB8ICJtZXRob2RfcmV0dXJuIiB8ICJzaWduYWwiIHwgImVycm9yIiB8ICIqIgorICAgc2VuZF9wYXRoPSIvcGF0aC9uYW1lIiB8ICIqIgorCisgICByZWNlaXZlX2ludGVyZmFjZT0iaW50ZXJmYWNlX25hbWUiIHwgIioiCisgICByZWNlaXZlX21lbWJlcj0ibWV0aG9kX29yX3NpZ25hbF9uYW1lIiB8ICIqIgorICAgcmVjZWl2ZV9lcnJvcj0iZXJyb3JfbmFtZSIgfCAiKiIKKyAgIHJlY2VpdmVfc2VuZGVyPSJuYW1lIiB8ICIqIgorICAgcmVjZWl2ZV90eXBlPSJtZXRob2RfY2FsbCIgfCAibWV0aG9kX3JldHVybiIgfCAic2lnbmFsIiB8ICJlcnJvciIgfCAiKiIKKyAgIHJlY2VpdmVfcGF0aD0iL3BhdGgvbmFtZSIgfCAiKiIKKworICAgc2VuZF9yZXF1ZXN0ZWRfcmVwbHk9InRydWUiIHwgImZhbHNlIgorICAgcmVjZWl2ZV9yZXF1ZXN0ZWRfcmVwbHk9InRydWUiIHwgImZhbHNlIgorCisgICBlYXZlc2Ryb3A9InRydWUiIHwgImZhbHNlIgorCisgICBvd249Im5hbWUiIHwgIioiCisgICBvd25fcHJlZml4PSJuYW1lIgorICAgdXNlcj0idXNlcm5hbWUiIHwgIioiCisgICBncm91cD0iZ3JvdXBuYW1lIiB8ICIqIgorPC9saXRlcmFsbGF5b3V0PiA8IS0tIC5maSAtLT4KKworCis8cGFyYT5FeGFtcGxlczo8L3BhcmE+Cis8bGl0ZXJhbGxheW91dCByZW1hcD0nLm5mJz4KKyAgICZsdDtkZW55IHNlbmRfZGVzdGluYXRpb249Im9yZy5mcmVlZGVza3RvcC5TZXJ2aWNlIiBzZW5kX2ludGVyZmFjZT0ib3JnLmZyZWVkZXNrdG9wLlN5c3RlbSIgc2VuZF9tZW1iZXI9IlJlYm9vdCIvJmd0OworICAgJmx0O2Rlbnkgc2VuZF9kZXN0aW5hdGlvbj0ib3JnLmZyZWVkZXNrdG9wLlN5c3RlbSIvJmd0OworICAgJmx0O2RlbnkgcmVjZWl2ZV9zZW5kZXI9Im9yZy5mcmVlZGVza3RvcC5TeXN0ZW0iLyZndDsKKyAgICZsdDtkZW55IHVzZXI9ImpvaG4iLyZndDsKKyAgICZsdDtkZW55IGdyb3VwPSJlbmVtaWVzIi8mZ3Q7Cis8L2xpdGVyYWxsYXlvdXQ+IDwhLS0gLmZpIC0tPgorCisKKzxwYXJhPlRoZSAmbHQ7ZGVueSZndDsgZWxlbWVudCdzIGF0dHJpYnV0ZXMgZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGRlbnkgIm1hdGNoZXMiIGEKK3BhcnRpY3VsYXIgYWN0aW9uLiBJZiBpdCBtYXRjaGVzLCB0aGUgYWN0aW9uIGlzIGRlbmllZCAodW5sZXNzIGxhdGVyCitydWxlcyBpbiB0aGUgY29uZmlnIGZpbGUgYWxsb3cgaXQpLjwvcGFyYT4KKworPHBhcmE+CisgIFJ1bGVzIHdpdGggb25lIG9yIG1vcmUgb2YgdGhlIDxsaXRlcmFsPnNlbmRfPC9saXRlcmFsPiogZmFtaWx5IG9mIGF0dHJpYnV0ZXMKKyAgYXJlIGNoZWNrZWQgaW4gb3JkZXIgd2hlbiBhIGNvbm5lY3Rpb24gYXR0ZW1wdHMgdG8gc2VuZCBhIG1lc3NhZ2UuIFRoZSBsYXN0CisgIHJ1bGUgdGhhdCBtYXRjaGVzIHRoZSBtZXNzYWdlIGRldGVybWluZXMgd2hldGhlciBpdCBtYXkgYmUgc2VudC4KKyAgVGhlIHdlbGwta25vd24gc2Vzc2lvbiBidXMgbm9ybWFsbHkgYWxsb3dzIHNlbmRpbmcgYW55IG1lc3NhZ2UuCisgIFRoZSB3ZWxsLWtub3duIHN5c3RlbSBidXMgbm9ybWFsbHkgYWxsb3dzIHNlbmRpbmcgYW55IHNpZ25hbCwgc2VsZWN0ZWQKKyAgbWV0aG9kIGNhbGxzIHRvIHRoZSA8Y29tbWFuZD5kYnVzLWRhZW1vbjwvY29tbWFuZD4sIGFuZCBleGFjdGx5IG9uZQorICByZXBseSB0byBlYWNoIHByZXZpb3VzbHktc2VudCBtZXRob2QgY2FsbCAoZWl0aGVyIHN1Y2Nlc3Mgb3IgYW4gZXJyb3IpLgorICBFaXRoZXIgb2YgdGhlc2UgY2FuIGJlIG92ZXJyaWRkZW4gYnkgY29uZmlndXJhdGlvbjsgb24gdGhlIHN5c3RlbSBidXMsCisgIHNlcnZpY2VzIHRoYXQgd2lsbCByZWNlaXZlIG1ldGhvZCBjYWxscyBtdXN0IGluc3RhbGwgY29uZmlndXJhdGlvbiB0aGF0CisgIGFsbG93cyB0aGVtIHRvIGRvIHNvLCB1c3VhbGx5IHZpYSBydWxlcyBvZiB0aGUgZm9ybQorICA8bGl0ZXJhbD4mbHQ7cG9saWN5IGNvbnRleHQ9ImRlZmF1bHQiJmd0OyZsdDthbGxvdyBzZW5kX2Rlc3RpbmF0aW9uPSImaGVsbGlwOyIvJmd0OyZsdDtwb2xpY3kmZ3Q7PC9saXRlcmFsPi4KKzwvcGFyYT4KKworPHBhcmE+CisgIFJ1bGVzIHdpdGggb25lIG9yIG1vcmUgb2YgdGhlIDxsaXRlcmFsPnJlY2VpdmVfPC9saXRlcmFsPiogZmFtaWx5IG9mCisgIGF0dHJpYnV0ZXMsIG9yIHdpdGggdGhlIDxsaXRlcmFsPmVhdmVzZHJvcDwvbGl0ZXJhbD4gYXR0cmlidXRlIGFuZCBubyBvdGhlcnMsCisgIGFyZSBjaGVja2VkIGZvciBlYWNoIHJlY2lwaWVudCBvZiBhIG1lc3NhZ2UgKHRoZXJlIG1pZ2h0IGJlIG1vcmUgdGhhbiBvbmUKKyAgcmVjaXBpZW50IGlmIHRoZSBtZXNzYWdlIGlzIGEgYnJvYWRjYXN0IG9yIGEgY29ubmVjdGlvbiBpcyBlYXZlc2Ryb3BwaW5nKS4KKyAgVGhlIGxhc3QgcnVsZSB0aGF0IG1hdGNoZXMgdGhlIG1lc3NhZ2UgZGV0ZXJtaW5lcyB3aGV0aGVyIGl0IG1heSBiZSByZWNlaXZlZC4KKyAgVGhlIHdlbGwta25vd24gc2Vzc2lvbiBidXMgbm9ybWFsbHkgYWxsb3dzIHJlY2VpdmluZyBhbnkgbWVzc2FnZSwgaW5jbHVkaW5nCisgIGVhdmVzZHJvcHBpbmcuIFRoZSB3ZWxsLWtub3duIHN5c3RlbSBidXMgbm9ybWFsbHkgYWxsb3dzIHJlY2VpdmluZyBhbnkKKyAgbWVzc2FnZSB0aGF0IHdhcyBub3QgZWF2ZXNkcm9wcGVkIChhbnkgdW5pY2FzdCBtZXNzYWdlIGFkZHJlc3NlZCB0byB0aGUKKyAgcmVjaXBpZW50LCBhbmQgYW55IGJyb2FkY2FzdCBtZXNzYWdlKS4KKzwvcGFyYT4KKworPHBhcmE+CisgIFRoZSA8bGl0ZXJhbD5lYXZlc2Ryb3A8L2xpdGVyYWw+LCA8bGl0ZXJhbD5taW5fZmRzPC9saXRlcmFsPiBhbmQKKyAgPGxpdGVyYWw+bWF4X2ZkczwvbGl0ZXJhbD4gYXR0cmlidXRlcyBhcmUgbW9kaWZpZXJzIHRoYXQgY2FuIGJlIGFwcGxpZWQKKyAgdG8gZWl0aGVyIDxsaXRlcmFsPnNlbmRfPC9saXRlcmFsPiogb3IgPGxpdGVyYWw+cmVjZWl2ZV88L2xpdGVyYWw+KgorICBydWxlcywgYW5kIGFyZSBkb2N1bWVudGVkIGJlbG93LgorPC9wYXJhPgorCis8cGFyYT5zZW5kX2Rlc3RpbmF0aW9uIGFuZCByZWNlaXZlX3NlbmRlciBydWxlcyBtZWFuIHRoYXQgbWVzc2FnZXMgbWF5IG5vdCBiZQorc2VudCB0byBvciByZWNlaXZlZCBmcm9tIHRoZSAqb3duZXIqIG9mIHRoZSBnaXZlbiBuYW1lLCBub3QgdGhhdAordGhleSBtYXkgbm90IGJlIHNlbnQgKnRvIHRoYXQgbmFtZSouIFRoYXQgaXMsIGlmIGEgY29ubmVjdGlvbgorb3ducyBzZXJ2aWNlcyBBLCBCLCBDLCBhbmQgc2VuZGluZyB0byBBIGlzIGRlbmllZCwgc2VuZGluZyB0byBCIG9yIEMKK3dpbGwgbm90IHdvcmsgZWl0aGVyLiBBcyBhIHNwZWNpYWwgY2FzZSwKKzxsaXRlcmFsPnNlbmRfZGVzdGluYXRpb249IioiPC9saXRlcmFsPiBtYXRjaGVzIGFueSBtZXNzYWdlCisod2hldGhlciBpdCBoYXMgYSBkZXN0aW5hdGlvbiBzcGVjaWZpZWQgb3Igbm90KSwgYW5kCis8bGl0ZXJhbD5yZWNlaXZlX3NlbmRlcj0iKiI8L2xpdGVyYWw+IHNpbWlsYXJseSBtYXRjaGVzIGFueSBtZXNzYWdlLjwvcGFyYT4KKworPHBhcmE+CisgIFJ1bGVzIHdpdGggPGxpdGVyYWw+c2VuZF9icm9hZGNhc3Q9InRydWUiPC9saXRlcmFsPiBtYXRjaCBzaWduYWwgbWVzc2FnZXMKKyAgd2l0aCBubyBkZXN0aW5hdGlvbiAoYnJvYWRjYXN0cykuIFJ1bGVzIHdpdGgKKyAgPGxpdGVyYWw+c2VuZF9icm9hZGNhc3Q9ImZhbHNlIjwvbGl0ZXJhbD4gYXJlIHRoZSBpbnZlcnNlOiB0aGV5IG1hdGNoIGFueQorICB1bmljYXN0IGRlc3RpbmF0aW9uICh1bmljYXN0IHNpZ25hbHMsIHRvZ2V0aGVyIHdpdGggYWxsIG1ldGhvZCBjYWxscywgcmVwbGllcworICBhbmQgZXJyb3JzKSBidXQgZG8gbm90IG1hdGNoIG1lc3NhZ2VzIHdpdGggbm8gZGVzdGluYXRpb24gKGJyb2FkY2FzdHMpLiBUaGlzCisgIGlzIG5vdCB0aGUgc2FtZSBhcyA8bGl0ZXJhbD5zZW5kX2Rlc3RpbmF0aW9uPSIqIjwvbGl0ZXJhbD4sIHdoaWNoIG1hdGNoZXMgYW55CisgIHNlbnQgbWVzc2FnZSwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGhhcyBhIGRlc3RpbmF0aW9uIG9yIG5vdC4KKzwvcGFyYT4KKworPHBhcmE+CisgIFRoZSBvdGhlciA8bGl0ZXJhbD5zZW5kXzwvbGl0ZXJhbD4qIGFuZCA8bGl0ZXJhbD5yZWNlaXZlXzwvbGl0ZXJhbD4qCisgIGF0dHJpYnV0ZXMgYXJlIHB1cmVseSB0ZXh0dWFsL2J5LXZhbHVlIG1hdGNoZXMgYWdhaW5zdCB0aGUgZ2l2ZW4gZmllbGQgaW4KKyAgdGhlIG1lc3NhZ2UgaGVhZGVyLCBleGNlcHQgdGhhdCBmb3IgdGhlIGF0dHJpYnV0ZXMgd2hlcmUgaXQgaXMgYWxsb3dlZCwKKyAgPGxpdGVyYWw+KjwvbGl0ZXJhbD4gbWF0Y2hlcyBhbnkgbWVzc2FnZSAod2hldGhlciBpdCBoYXMgdGhlIHJlbGV2YW50CisgIGhlYWRlciBmaWVsZCBvciBub3QpLiBGb3IgZXhhbXBsZSwgPGxpdGVyYWw+c2VuZF9pbnRlcmZhY2U9IioiPC9saXRlcmFsPgorICBtYXRjaGVzIGFueSBzZW50IG1lc3NhZ2UsIGV2ZW4gaWYgaXQgZG9lcyBub3QgY29udGFpbiBhbiBpbnRlcmZhY2UgaGVhZGVyCisgIGZpZWxkLiBNb3JlIGNvbXBsZXggZ2xvYiBtYXRjaGluZyBzdWNoIGFzIDxsaXRlcmFsPmZvby5iYXIuKjwvbGl0ZXJhbD4gaXMKKyAgbm90IGFsbG93ZWQuCis8L3BhcmE+CisKKzxwYXJhPiJFYXZlc2Ryb3BwaW5nIiBvY2N1cnMgd2hlbiBhbiBhcHBsaWNhdGlvbiByZWNlaXZlcyBhIG1lc3NhZ2UgdGhhdAord2FzIGV4cGxpY2l0bHkgYWRkcmVzc2VkIHRvIGEgbmFtZSB0aGUgYXBwbGljYXRpb24gZG9lcyBub3Qgb3duLCBvcgoraXMgYSByZXBseSB0byBzdWNoIGEgbWVzc2FnZS4gRWF2ZXNkcm9wcGluZyB0aHVzIG9ubHkgYXBwbGllcyB0bworbWVzc2FnZXMgdGhhdCBhcmUgYWRkcmVzc2VkIHRvIHNlcnZpY2VzIGFuZCByZXBsaWVzIHRvIHN1Y2ggbWVzc2FnZXMKKyhpLmUuIGl0IGRvZXMgbm90IGFwcGx5IHRvIHNpZ25hbHMpLjwvcGFyYT4KKworPHBhcmE+Rm9yICZsdDthbGxvdyZndDssIGVhdmVzZHJvcD0idHJ1ZSIgaW5kaWNhdGVzIHRoYXQgdGhlIHJ1bGUgbWF0Y2hlcyBldmVuCit3aGVuIGVhdmVzZHJvcHBpbmcuIGVhdmVzZHJvcD0iZmFsc2UiIGlzIHRoZSBkZWZhdWx0IGFuZCBtZWFucyB0aGF0Cit0aGUgcnVsZSBvbmx5IGFsbG93cyBtZXNzYWdlcyB0byBnbyB0byB0aGVpciBzcGVjaWZpZWQgcmVjaXBpZW50LgorRm9yICZsdDtkZW55Jmd0OywgZWF2ZXNkcm9wPSJ0cnVlIiBpbmRpY2F0ZXMgdGhhdCB0aGUgcnVsZSBtYXRjaGVzCitvbmx5IHdoZW4gZWF2ZXNkcm9wcGluZy4gZWF2ZXNkcm9wPSJmYWxzZSIgaXMgdGhlIGRlZmF1bHQgZm9yICZsdDtkZW55Jmd0OworYWxzbywgYnV0IGhlcmUgaXQgbWVhbnMgdGhhdCB0aGUgcnVsZSBhcHBsaWVzIGFsd2F5cywgZXZlbiB3aGVuCitub3QgZWF2ZXNkcm9wcGluZy4gVGhlIGVhdmVzZHJvcCBhdHRyaWJ1dGUgY2FuIG9ubHkgYmUgY29tYmluZWQgd2l0aAorc2VuZCBhbmQgcmVjZWl2ZSBydWxlcyAod2l0aCBzZW5kXyogYW5kIHJlY2VpdmVfKiBhdHRyaWJ1dGVzKS48L3BhcmE+CisKKzxwYXJhPlRoZSBbc2VuZHxyZWNlaXZlXV9yZXF1ZXN0ZWRfcmVwbHkgYXR0cmlidXRlIHdvcmtzIHNpbWlsYXJseSB0byB0aGUgZWF2ZXNkcm9wCithdHRyaWJ1dGUuIEl0IGNvbnRyb2xzIHdoZXRoZXIgdGhlICZsdDtkZW55Jmd0OyBvciAmbHQ7YWxsb3cmZ3Q7IG1hdGNoZXMgYSByZXBseQordGhhdCBpcyBleHBlY3RlZCAoY29ycmVzcG9uZHMgdG8gYSBwcmV2aW91cyBtZXRob2QgY2FsbCBtZXNzYWdlKS4KK1RoaXMgYXR0cmlidXRlIG9ubHkgbWFrZXMgc2Vuc2UgZm9yIHJlcGx5IG1lc3NhZ2VzIChlcnJvcnMgYW5kIG1ldGhvZAorcmV0dXJucyksIGFuZCBpcyBpZ25vcmVkIGZvciBvdGhlciBtZXNzYWdlIHR5cGVzLjwvcGFyYT4KKworCis8cGFyYT5Gb3IgJmx0O2FsbG93Jmd0OywgW3NlbmR8cmVjZWl2ZV1fcmVxdWVzdGVkX3JlcGx5PSJ0cnVlIiBpcyB0aGUgZGVmYXVsdCBhbmQgaW5kaWNhdGVzIHRoYXQKK29ubHkgcmVxdWVzdGVkIHJlcGxpZXMgYXJlIGFsbG93ZWQgYnkgdGhlCitydWxlLiBbc2VuZHxyZWNlaXZlXV9yZXF1ZXN0ZWRfcmVwbHk9ImZhbHNlIiBtZWFucyB0aGF0IHRoZSBydWxlIGFsbG93cyBhbnkgcmVwbHkKK2V2ZW4gaWYgdW5leHBlY3RlZC48L3BhcmE+CisKKworPHBhcmE+Rm9yICZsdDtkZW55Jmd0OywgW3NlbmR8cmVjZWl2ZV1fcmVxdWVzdGVkX3JlcGx5PSJmYWxzZSIgaXMgdGhlIGRlZmF1bHQgYnV0IGluZGljYXRlcyB0aGF0Cit0aGUgcnVsZSBtYXRjaGVzIG9ubHkgd2hlbiB0aGUgcmVwbHkgd2FzIG5vdAorcmVxdWVzdGVkLiBbc2VuZHxyZWNlaXZlXV9yZXF1ZXN0ZWRfcmVwbHk9InRydWUiIGluZGljYXRlcyB0aGF0IHRoZSBydWxlIGFwcGxpZXMKK2Fsd2F5cywgcmVnYXJkbGVzcyBvZiBwZW5kaW5nIHJlcGx5IHN0YXRlLjwvcGFyYT4KKworPHBhcmE+CisgIFRoZSA8bGl0ZXJhbD5taW5fZmRzPC9saXRlcmFsPiBhbmQgPGxpdGVyYWw+bWF4X2ZkczwvbGl0ZXJhbD4gYXR0cmlidXRlcworICBtb2RpZnkgZWl0aGVyIDxsaXRlcmFsPnNlbmRfPC9saXRlcmFsPiogb3IgPGxpdGVyYWw+cmVjZWl2ZV88L2xpdGVyYWw+KgorICBydWxlcy4gQSBydWxlIHdpdGggdGhlIDxsaXRlcmFsPm1pbl9mZHM8L2xpdGVyYWw+IGF0dHJpYnV0ZSBvbmx5IG1hdGNoZXMKKyAgbWVzc2FnZXMgaWYgdGhleSBoYXZlIGF0IGxlYXN0IHRoYXQgbWFueSBVbml4IGZpbGUgZGVzY3JpcHRvcnMgYXR0YWNoZWQuCisgIENvbnZlcnNlbHksIGEgcnVsZSB3aXRoIHRoZSA8bGl0ZXJhbD5tYXhfZmRzPC9saXRlcmFsPiBhdHRyaWJ1dGUgb25seQorICBtYXRjaGVzIG1lc3NhZ2VzIGlmIHRoZXkgaGF2ZSBubyBtb3JlIHRoYW4gdGhhdCBtYW55IGZpbGUgZGVzY3JpcHRvcnMKKyAgYXR0YWNoZWQuIEluIHByYWN0aWNlLCBydWxlcyB3aXRoIHRoZXNlIGF0dHJpYnV0ZXMgd2lsbCBtb3N0IGNvbW1vbmx5CisgIHRha2UgdGhlIGZvcm0KKyAgPGxpdGVyYWw+Jmx0O2FsbG93IHNlbmRfZGVzdGluYXRpb249IiZoZWxsaXA7IiBtYXhfZmRzPSIwIi8mZ3Q7PC9saXRlcmFsPiwKKyAgPGxpdGVyYWw+Jmx0O2Rlbnkgc2VuZF9kZXN0aW5hdGlvbj0iJmhlbGxpcDsiIG1pbl9mZHM9IjEiLyZndDs8L2xpdGVyYWw+IG9yCisgIDxsaXRlcmFsPiZsdDtkZW55IHJlY2VpdmVfc2VuZGVyPSIqIiBtaW5fZmRzPSIxIi8mZ3Q7PC9saXRlcmFsPi4KKzwvcGFyYT4KKworPHBhcmE+CisgIFJ1bGVzIHdpdGggdGhlIDxsaXRlcmFsPnVzZXI8L2xpdGVyYWw+IG9yIDxsaXRlcmFsPmdyb3VwPC9saXRlcmFsPgorICBhdHRyaWJ1dGUgYXJlIGNoZWNrZWQgd2hlbiBhIG5ldyBjb25uZWN0aW9uIHRvIHRoZSBtZXNzYWdlIGJ1cyBpcworICBlc3RhYmxpc2hlZCwgYW5kIGNvbnRyb2wgd2hldGhlciB0aGUgY29ubmVjdGlvbiBjYW4gY29udGludWUuCisgIEVhY2ggb2YgdGhlc2UgYXR0cmlidXRlcyBjYW5ub3QgYmUgY29tYmluZWQgd2l0aCBhbnkgb3RoZXIKKyAgYXR0cmlidXRlLiBBcyBhIHNwZWNpYWwgY2FzZSwgYm90aCA8bGl0ZXJhbD51c2VyPSIqIjwvbGl0ZXJhbD4gYW5kCisgIDxsaXRlcmFsPmdyb3VwPSIqIjwvbGl0ZXJhbD4gbWF0Y2ggYW55IGNvbm5lY3Rpb24uIElmIHRoZXJlIGFyZQorICBubyBydWxlcyBvZiB0aGlzIGZvcm0sIHRoZSBkZWZhdWx0IGlzIHRvIGFsbG93IGNvbm5lY3Rpb25zIGZyb20gdGhlIHNhbWUKKyAgdXNlciBJRCB0aGF0IG93bnMgdGhlIDxjb21tYW5kPmRidXMtZGFlbW9uPC9jb21tYW5kPiBwcm9jZXNzLiBUaGUgd2VsbC1rbm93bgorICBzZXNzaW9uIGJ1cyBub3JtYWxseSB1c2VzIHRoYXQgZGVmYXVsdCBiZWhhdmlvdXIsIHdoaWxlIHRoZSB3ZWxsLWtub3duCisgIHN5c3RlbSBidXMgbm9ybWFsbHkgYWxsb3dzIGFueSBjb25uZWN0aW9uLgorPC9wYXJhPgorCis8cGFyYT4KKyAgUnVsZXMgd2l0aCB0aGUgPGxpdGVyYWw+b3duPC9saXRlcmFsPiBvciA8bGl0ZXJhbD5vd25fcHJlZml4PC9saXRlcmFsPgorICBhdHRyaWJ1dGUgYXJlIGNoZWNrZWQgd2hlbiBhIGNvbm5lY3Rpb24gYXR0ZW1wdHMgdG8gb3duIGEgd2VsbC1rbm93biBidXMKKyAgbmFtZXMuIEFzIGEgc3BlY2lhbCBjYXNlLCA8bGl0ZXJhbD5vd249IioiPC9saXRlcmFsPiBtYXRjaGVzIGFueSB3ZWxsLWtub3duCisgIGJ1cyBuYW1lLiBUaGUgd2VsbC1rbm93biBzZXNzaW9uIGJ1cyBub3JtYWxseSBhbGxvd3MgYW55IGNvbm5lY3Rpb24gdG8KKyAgb3duIGFueSBuYW1lLCB3aGlsZSB0aGUgd2VsbC1rbm93biBzeXN0ZW0gYnVzIG5vcm1hbGx5IGRvZXMgbm90IGFsbG93IGFueQorICBjb25uZWN0aW9uIHRvIG93biBhbnkgbmFtZSwgZXhjZXB0IHdoZXJlIGFsbG93ZWQgYnkgZnVydGhlciBjb25maWd1cmF0aW9uLgorICBTeXN0ZW0gc2VydmljZXMgdGhhdCB3aWxsIG93biBhIG5hbWUgbXVzdCBpbnN0YWxsIGNvbmZpZ3VyYXRpb24gdGhhdCBhbGxvd3MKKyAgdGhlbSB0byBkbyBzbywgdXN1YWxseSB2aWEgcnVsZXMgb2YgdGhlIGZvcm0KKyAgPGxpdGVyYWw+Jmx0O3BvbGljeSB1c2VyPSJzb21lLXN5c3RlbS11c2VyIiZndDsmbHQ7YWxsb3cgb3duPSImaGVsbGlwOyIvJmd0OyZsdDsvcG9saWN5Jmd0OzwvbGl0ZXJhbD4uCis8L3BhcmE+CisKKzxwYXJhPiZsdDthbGxvdyBvd25fcHJlZml4PSJhLmIiLyZndDsgYWxsb3dzIHlvdSB0byBvd24gdGhlIG5hbWUgImEuYiIgb3IgYW55CituYW1lIHdob3NlIGZpcnN0IGRvdC1zZXBhcmF0ZWQgZWxlbWVudHMgYXJlICJhLmIiOiBpbiBwYXJ0aWN1bGFyLAoreW91IGNhbiBvd24gImEuYi5jIiBvciAiYS5iLmMuZCIsIGJ1dCBub3QgImEuYmMiIG9yICJhLmMiLgorVGhpcyBpcyB1c2VmdWwgd2hlbiBzZXJ2aWNlcyBsaWtlIFRlbGVwYXRoeSBhbmQgUmVzZXJ2ZURldmljZQorZGVmaW5lIGEgbWVhbmluZyBmb3Igc3VidHJlZXMgb2Ygd2VsbC1rbm93biBuYW1lcywgc3VjaCBhcworb3JnLmZyZWVkZXNrdG9wLlRlbGVwYXRoeS5Db25uZWN0aW9uTWFuYWdlci4oYW55dGhpbmcpCithbmQgb3JnLmZyZWVkZXNrdG9wLlJlc2VydmVEZXZpY2UxLihhbnl0aGluZykuPC9wYXJhPgorCisKKzxwYXJhPkl0IGRvZXMgbm90IG1ha2Ugc2Vuc2UgdG8gZGVueSBhIHVzZXIgb3IgZ3JvdXAgaW5zaWRlIGEgJmx0O3BvbGljeSZndDsKK2ZvciBhIHVzZXIgb3IgZ3JvdXA7IHVzZXIvZ3JvdXAgZGVuaWFscyBjYW4gb25seSBiZSBpbnNpZGUKK2NvbnRleHQ9ImRlZmF1bHQiIG9yIGNvbnRleHQ9Im1hbmRhdG9yeSIgcG9saWNpZXMuPC9wYXJhPgorCisKKzxwYXJhPkEgc2luZ2xlICZsdDtkZW55Jmd0OyBydWxlIG1heSBzcGVjaWZ5IGNvbWJpbmF0aW9ucyBvZiBhdHRyaWJ1dGVzIHN1Y2ggYXMKK3NlbmRfZGVzdGluYXRpb24gYW5kIHNlbmRfaW50ZXJmYWNlIGFuZCBzZW5kX3R5cGUuIEluIHRoaXMgY2FzZSwgdGhlCitkZW5pYWwgYXBwbGllcyBvbmx5IGlmIGJvdGggYXR0cmlidXRlcyBtYXRjaCB0aGUgbWVzc2FnZSBiZWluZyBkZW5pZWQuCitlLmcuICZsdDtkZW55IHNlbmRfaW50ZXJmYWNlPSJmb28uYmFyIiBzZW5kX2Rlc3RpbmF0aW9uPSJmb28uYmxhaCIvJmd0OyB3b3VsZAorZGVueSBtZXNzYWdlcyB3aXRoIHRoZSBnaXZlbiBpbnRlcmZhY2UgQU5EIHRoZSBnaXZlbiBidXMgbmFtZS4KK1RvIGdldCBhbiBPUiBlZmZlY3QgeW91IHNwZWNpZnkgbXVsdGlwbGUgJmx0O2RlbnkmZ3Q7IHJ1bGVzLjwvcGFyYT4KKworCis8cGFyYT5Zb3UgY2FuJ3QgaW5jbHVkZSBib3RoIHNlbmRfIGFuZCByZWNlaXZlXyBhdHRyaWJ1dGVzIG9uIHRoZSBzYW1lCitydWxlLCBzaW5jZSAid2hldGhlciB0aGUgbWVzc2FnZSBjYW4gYmUgc2VudCIgYW5kICJ3aGV0aGVyIGl0IGNhbiBiZQorcmVjZWl2ZWQiIGFyZSBldmFsdWF0ZWQgc2VwYXJhdGVseS48L3BhcmE+CisKKworPHBhcmE+QmUgY2FyZWZ1bCB3aXRoIHNlbmRfaW50ZXJmYWNlL3JlY2VpdmVfaW50ZXJmYWNlLCBiZWNhdXNlIHRoZQoraW50ZXJmYWNlIGZpZWxkIGluIG1lc3NhZ2VzIGlzIG9wdGlvbmFsLiAgSW4gcGFydGljdWxhciwgZG8gTk9UCitzcGVjaWZ5ICZsdDtkZW55IHNlbmRfaW50ZXJmYWNlPSJvcmcuZm9vLkJhciIvJmd0OyEgIFRoaXMgd2lsbCBjYXVzZQorbm8taW50ZXJmYWNlIG1lc3NhZ2VzIHRvIGJlIGJsb2NrZWQgZm9yIGFsbCBzZXJ2aWNlcywgd2hpY2ggaXMKK2FsbW9zdCBjZXJ0YWlubHkgbm90IHdoYXQgeW91IGludGVuZGVkLiAgQWx3YXlzIHVzZSBydWxlcyBvZgordGhlIGZvcm06ICZsdDtkZW55IHNlbmRfaW50ZXJmYWNlPSJvcmcuZm9vLkJhciIgc2VuZF9kZXN0aW5hdGlvbj0ib3JnLmZvby5TZXJ2aWNlIi8mZ3Q7PC9wYXJhPgorCis8aXRlbWl6ZWRsaXN0IHJlbWFwPSdUUCc+CisKKyAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcyByZW1hcD0nSSc+Jmx0O3NlbGludXgmZ3Q7PC9lbXBoYXNpcz48L3BhcmE+PC9saXN0aXRlbT4KKworCis8L2l0ZW1pemVkbGlzdD4KKworPHBhcmE+VGhlICZsdDtzZWxpbnV4Jmd0OyBlbGVtZW50IGNvbnRhaW5zIHNldHRpbmdzIHJlbGF0ZWQgdG8gU2VjdXJpdHkgRW5oYW5jZWQgTGludXguCitNb3JlIGRldGFpbHMgYmVsb3cuPC9wYXJhPgorCis8aXRlbWl6ZWRsaXN0IHJlbWFwPSdUUCc+CisKKyAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcyByZW1hcD0nSSc+Jmx0O2Fzc29jaWF0ZSZndDs8L2VtcGhhc2lzPjwvcGFyYT48L2xpc3RpdGVtPgorCisKKzwvaXRlbWl6ZWRsaXN0PgorCis8cGFyYT5BbiAmbHQ7YXNzb2NpYXRlJmd0OyBlbGVtZW50IGFwcGVhcnMgYmVsb3cgYW4gJmx0O3NlbGludXgmZ3Q7IGVsZW1lbnQgYW5kCitjcmVhdGVzIGEgbWFwcGluZy4gUmlnaHQgbm93IG9ubHkgb25lIGtpbmQgb2YgYXNzb2NpYXRpb24gaXMgcG9zc2libGU6PC9wYXJhPgorPGxpdGVyYWxsYXlvdXQgcmVtYXA9Jy5uZic+CisgICAmbHQ7YXNzb2NpYXRlIG93bj0ib3JnLmZyZWVkZXNrdG9wLkZvb2JhciIgY29udGV4dD0iZm9vX3QiLyZndDsKKzwvbGl0ZXJhbGxheW91dD4gPCEtLSAuZmkgLS0+CisKKworPHBhcmE+VGhpcyBtZWFucyB0aGF0IGlmIGEgY29ubmVjdGlvbiBhc2tzIHRvIG93biB0aGUgbmFtZQorIm9yZy5mcmVlZGVza3RvcC5Gb29iYXIiIHRoZW4gdGhlIHNvdXJjZSBjb250ZXh0IHdpbGwgYmUgdGhlIGNvbnRleHQKK29mIHRoZSBjb25uZWN0aW9uIGFuZCB0aGUgdGFyZ2V0IGNvbnRleHQgd2lsbCBiZSAiZm9vX3QiIC0gc2VlIHRoZQorc2hvcnQgZGlzY3Vzc2lvbiBvZiBTRUxpbnV4IGJlbG93LjwvcGFyYT4KKworCis8cGFyYT5Ob3RlLCB0aGUgY29udGV4dCBoZXJlIGlzIHRoZSB0YXJnZXQgY29udGV4dCB3aGVuIHJlcXVlc3RpbmcgYSBuYW1lLAorTk9UIHRoZSBjb250ZXh0IG9mIHRoZSBjb25uZWN0aW9uIG93bmluZyB0aGUgbmFtZS48L3BhcmE+CisKKworPHBhcmE+VGhlcmUncyBjdXJyZW50bHkgbm8gd2F5IHRvIHNldCBhIGRlZmF1bHQgZm9yIG93bmluZyBhbnkgbmFtZSwgaWYKK3dlIGFkZCB0aGlzIHN5bnRheCBpdCB3aWxsIGxvb2sgbGlrZTo8L3BhcmE+Cis8bGl0ZXJhbGxheW91dCByZW1hcD0nLm5mJz4KKyAgICZsdDthc3NvY2lhdGUgb3duPSIqIiBjb250ZXh0PSJmb29fdCIvJmd0OworPC9saXRlcmFsbGF5b3V0PiA8IS0tIC5maSAtLT4KKzxwYXJhPklmIHlvdSBmaW5kIGEgcmVhc29uIHRoaXMgaXMgdXNlZnVsLCBsZXQgdGhlIGRldmVsb3BlcnMga25vdy4KK1JpZ2h0IG5vdyB0aGUgZGVmYXVsdCB3aWxsIGJlIHRoZSBzZWN1cml0eSBjb250ZXh0IG9mIHRoZSBidXMgaXRzZWxmLjwvcGFyYT4KKworCis8cGFyYT5JZiB0d28gJmx0O2Fzc29jaWF0ZSZndDsgZWxlbWVudHMgc3BlY2lmeSB0aGUgc2FtZSBuYW1lLCB0aGUgZWxlbWVudAorYXBwZWFyaW5nIGxhdGVyIGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgd2lsbCBiZSB1c2VkLjwvcGFyYT4KKworPGl0ZW1pemVkbGlzdCByZW1hcD0nVFAnPgorCisgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXMgcmVtYXA9J0knPiZsdDthcHBhcm1vciZndDs8L2VtcGhhc2lzPjwvcGFyYT48L2xpc3RpdGVtPgorCisKKzwvaXRlbWl6ZWRsaXN0PgorCis8cGFyYT5UaGUgJmx0O2FwcGFybW9yJmd0OyBlbGVtZW50IGlzIHVzZWQgdG8gY29uZmlndXJlIEFwcEFybW9yIG1lZGlhdGlvbiBvbgordGhlIGJ1cy4gSXQgY2FuIGNvbnRhaW4gb25lIGF0dHJpYnV0ZSB0aGF0IHNwZWNpZmllcyB0aGUgbWVkaWF0aW9uIG1vZGU6PC9wYXJhPgorCis8bGl0ZXJhbGxheW91dCByZW1hcD0nLm5mJz4KKyAgICZsdDthcHBhcm1vciBtb2RlPSIoZW5hYmxlZHxkaXNhYmxlZHxyZXF1aXJlZCkiLyZndDsKKzwvbGl0ZXJhbGxheW91dD4gPCEtLSAuZmkgLS0+CisKKzxwYXJhPlRoZSBkZWZhdWx0IG1vZGUgaXMgImVuYWJsZWQiLiBJbiAiZW5hYmxlZCIgbW9kZSwgQXBwQXJtb3IgbWVkaWF0aW9uCit3aWxsIGJlIHBlcmZvcm1lZCBpZiBBcHBBcm1vciBzdXBwb3J0IGlzIGF2YWlsYWJsZSBpbiB0aGUga2VybmVsLiBJZiBpdCBpcyBub3QKK2F2YWlsYWJsZSwgZGJ1cy1kYWVtb24gd2lsbCBzdGFydCBidXQgQXBwQXJtb3IgbWVkaWF0aW9uIHdpbGwgbm90IG9jY3VyLiBJbgorImRpc2FibGVkIiBtb2RlLCBBcHBBcm1vciBtZWRpYXRpb24gaXMgZGlzYWJsZWQuIEluICJyZXF1aXJlZCIgbW9kZSwgQXBwQXJtb3IKK21lZGlhdGlvbiB3aWxsIGJlIGVuYWJsZWQgaWYgQXBwQXJtb3Igc3VwcG9ydCBpcyBhdmFpbGFibGUsIG90aGVyd2lzZQorZGJ1cy1kYWVtb24gd2lsbCByZWZ1c2UgdG8gc3RhcnQuPC9wYXJhPgorCis8cGFyYT5UaGUgQXBwQXJtb3IgbWVkaWF0aW9uIG1vZGUgb2YgdGhlIGJ1cyBjYW5ub3QgYmUgY2hhbmdlZCBhZnRlciB0aGUgYnVzCitzdGFydHMuIE1vZGlmeWluZyB0aGUgbW9kZSBpbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlIGFuZCBzZW5kaW5nIGEgU0lHSFVQCitzaWduYWwgdG8gdGhlIGRhZW1vbiBoYXMgbm8gZWZmZWN0IG9uIHRoZSBtZWRpYXRpb24gbW9kZS48L3BhcmE+CisKKzwvcmVmc2VjdDE+CisKKzxyZWZzZWN0MSBpZD0nc2VsaW51eCc+PHRpdGxlPlNFTGludXg8L3RpdGxlPgorPHBhcmE+U2VlIDx1bGluayB1cmw9J2h0dHA6Ly93d3cubnNhLmdvdi9zZWxpbnV4Lyc+aHR0cDovL3d3dy5uc2EuZ292L3NlbGludXgvPC91bGluaz4gZm9yIGZ1bGwgZGV0YWlscyBvbiBTRUxpbnV4LiBTb21lIHVzZWZ1bCBleGNlcnB0czo8L3BhcmE+CisKKworPHBhcmE+RXZlcnkgc3ViamVjdCAocHJvY2VzcykgYW5kIG9iamVjdCAoZS5nLiBmaWxlLCBzb2NrZXQsIElQQyBvYmplY3QsCitldGMpIGluIHRoZSBzeXN0ZW0gaXMgYXNzaWduZWQgYSBjb2xsZWN0aW9uIG9mIHNlY3VyaXR5IGF0dHJpYnV0ZXMsCitrbm93biBhcyBhIHNlY3VyaXR5IGNvbnRleHQuIEEgc2VjdXJpdHkgY29udGV4dCBjb250YWlucyBhbGwgb2YgdGhlCitzZWN1cml0eSBhdHRyaWJ1dGVzIGFzc29jaWF0ZWQgd2l0aCBhIHBhcnRpY3VsYXIgc3ViamVjdCBvciBvYmplY3QKK3RoYXQgYXJlIHJlbGV2YW50IHRvIHRoZSBzZWN1cml0eSBwb2xpY3kuPC9wYXJhPgorCisKKzxwYXJhPkluIG9yZGVyIHRvIGJldHRlciBlbmNhcHN1bGF0ZSBzZWN1cml0eSBjb250ZXh0cyBhbmQgdG8gcHJvdmlkZQorZ3JlYXRlciBlZmZpY2llbmN5LCB0aGUgcG9saWN5IGVuZm9yY2VtZW50IGNvZGUgb2YgU0VMaW51eCB0eXBpY2FsbHkKK2hhbmRsZXMgc2VjdXJpdHkgaWRlbnRpZmllcnMgKFNJRHMpIHJhdGhlciB0aGFuIHNlY3VyaXR5IGNvbnRleHRzLiBBCitTSUQgaXMgYW4gaW50ZWdlciB0aGF0IGlzIG1hcHBlZCBieSB0aGUgc2VjdXJpdHkgc2VydmVyIHRvIGEgc2VjdXJpdHkKK2NvbnRleHQgYXQgcnVudGltZS48L3BhcmE+CisKKworPHBhcmE+V2hlbiBhIHNlY3VyaXR5IGRlY2lzaW9uIGlzIHJlcXVpcmVkLCB0aGUgcG9saWN5IGVuZm9yY2VtZW50IGNvZGUKK3Bhc3NlcyBhIHBhaXIgb2YgU0lEcyAodHlwaWNhbGx5IHRoZSBTSUQgb2YgYSBzdWJqZWN0IGFuZCB0aGUgU0lEIG9mCithbiBvYmplY3QsIGJ1dCBzb21ldGltZXMgYSBwYWlyIG9mIHN1YmplY3QgU0lEcyBvciBhIHBhaXIgb2Ygb2JqZWN0CitTSURzKSwgYW5kIGFuIG9iamVjdCBzZWN1cml0eSBjbGFzcyB0byB0aGUgc2VjdXJpdHkgc2VydmVyLiBUaGUgb2JqZWN0CitzZWN1cml0eSBjbGFzcyBpbmRpY2F0ZXMgdGhlIGtpbmQgb2Ygb2JqZWN0LCBlLmcuIGEgcHJvY2VzcywgYSByZWd1bGFyCitmaWxlLCBhIGRpcmVjdG9yeSwgYSBUQ1Agc29ja2V0LCBldGMuPC9wYXJhPgorCisKKzxwYXJhPkFjY2VzcyBkZWNpc2lvbnMgc3BlY2lmeSB3aGV0aGVyIG9yIG5vdCBhIHBlcm1pc3Npb24gaXMgZ3JhbnRlZCBmb3IgYQorZ2l2ZW4gcGFpciBvZiBTSURzIGFuZCBjbGFzcy4gRWFjaCBvYmplY3QgY2xhc3MgaGFzIGEgc2V0IG9mCithc3NvY2lhdGVkIHBlcm1pc3Npb25zIGRlZmluZWQgdG8gY29udHJvbCBvcGVyYXRpb25zIG9uIG9iamVjdHMgd2l0aAordGhhdCBjbGFzcy48L3BhcmE+CisKKworPHBhcmE+RC1CdXMgcGVyZm9ybXMgU0VMaW51eCBzZWN1cml0eSBjaGVja3MgaW4gdHdvIHBsYWNlcy48L3BhcmE+CisKKworPHBhcmE+Rmlyc3QsIGFueSB0aW1lIGEgbWVzc2FnZSBpcyByb3V0ZWQgZnJvbSBvbmUgY29ubmVjdGlvbiB0byBhbm90aGVyCitjb25uZWN0aW9uLCB0aGUgYnVzIGRhZW1vbiB3aWxsIGNoZWNrIHBlcm1pc3Npb25zIHdpdGggdGhlIHNlY3VyaXR5IGNvbnRleHQgb2YKK3RoZSBmaXJzdCBjb25uZWN0aW9uIGFzIHNvdXJjZSwgc2VjdXJpdHkgY29udGV4dCBvZiB0aGUgc2Vjb25kIGNvbm5lY3Rpb24KK2FzIHRhcmdldCwgb2JqZWN0IGNsYXNzICJkYnVzIiBhbmQgcmVxdWVzdGVkIHBlcm1pc3Npb24gInNlbmRfbXNnIi48L3BhcmE+CisKKworPHBhcmE+SWYgYSBzZWN1cml0eSBjb250ZXh0IGlzIG5vdCBhdmFpbGFibGUgZm9yIGEgY29ubmVjdGlvbgorKGltcG9zc2libGUgd2hlbiB1c2luZyBVTklYIGRvbWFpbiBzb2NrZXRzKSwgdGhlbiB0aGUgdGFyZ2V0Citjb250ZXh0IHVzZWQgaXMgdGhlIGNvbnRleHQgb2YgdGhlIGJ1cyBkYWVtb24gaXRzZWxmLgorVGhlcmUgaXMgY3VycmVudGx5IG5vIHdheSB0byBjaGFuZ2UgdGhpcyBkZWZhdWx0LCBiZWNhdXNlIHdlJ3JlCithc3N1bWluZyB0aGF0IG9ubHkgVU5JWCBkb21haW4gc29ja2V0cyB3aWxsIGJlIHVzZWQgdG8KK2Nvbm5lY3QgdG8gdGhlIHN5c3RlbXdpZGUgYnVzLiBJZiB0aGlzIGNoYW5nZXMsIHdlJ2xsCitwcm9iYWJseSBhZGQgYSB3YXkgdG8gc2V0IHRoZSBkZWZhdWx0IGNvbm5lY3Rpb24gY29udGV4dC48L3BhcmE+CisKKworPHBhcmE+U2Vjb25kLCBhbnkgdGltZSBhIGNvbm5lY3Rpb24gYXNrcyB0byBvd24gYSBuYW1lLAordGhlIGJ1cyBkYWVtb24gd2lsbCBjaGVjayBwZXJtaXNzaW9ucyB3aXRoIHRoZSBzZWN1cml0eQorY29udGV4dCBvZiB0aGUgY29ubmVjdGlvbiBhcyBzb3VyY2UsIHRoZSBzZWN1cml0eSBjb250ZXh0IHNwZWNpZmllZAorZm9yIHRoZSBuYW1lIGluIHRoZSBjb25maWcgZmlsZSBhcyB0YXJnZXQsIG9iamVjdAorY2xhc3MgImRidXMiIGFuZCByZXF1ZXN0ZWQgcGVybWlzc2lvbiAiYWNxdWlyZV9zdmMiLjwvcGFyYT4KKworCis8cGFyYT5UaGUgc2VjdXJpdHkgY29udGV4dCBmb3IgYSBidXMgbmFtZSBpcyBzcGVjaWZpZWQgd2l0aCB0aGUKKyZsdDthc3NvY2lhdGUmZ3Q7IGVsZW1lbnQgZGVzY3JpYmVkIGVhcmxpZXIgaW4gdGhpcyBkb2N1bWVudC4KK0lmIGEgbmFtZSBoYXMgbm8gc2VjdXJpdHkgY29udGV4dCBhc3NvY2lhdGVkIGluIHRoZQorY29uZmlndXJhdGlvbiBmaWxlLCB0aGUgc2VjdXJpdHkgY29udGV4dCBvZiB0aGUgYnVzIGRhZW1vbgoraXRzZWxmIHdpbGwgYmUgdXNlZC48L3BhcmE+CisKKzwvcmVmc2VjdDE+CisKKzxyZWZzZWN0MSBpZD0nYXBwYXJtb3InPjx0aXRsZT5BcHBBcm1vcjwvdGl0bGU+Cis8cGFyYT5UaGUgQXBwQXJtb3IgY29uZmluZW1lbnQgY29udGV4dCBpcyBzdG9yZWQgd2hlbiBhcHBsaWNhdGlvbnMgY29ubmVjdCB0bwordGhlIGJ1cy4gVGhlIGNvbmZpbmVtZW50IGNvbnRleHQgY29uc2lzdHMgb2YgYSBsYWJlbCBhbmQgYSBjb25maW5lbWVudCBtb2RlLgorV2hlbiBhIHNlY3VyaXR5IGRlY2lzaW9uIGlzIHJlcXVpcmVkLCB0aGUgZGFlbW9uIHVzZXMgdGhlIGNvbmZpbmVtZW50IGNvbnRleHQKK3RvIHF1ZXJ5IHRoZSBBcHBBcm1vciBwb2xpY3kgdG8gZGV0ZXJtaW5lIGlmIHRoZSBhY3Rpb24gc2hvdWxkIGJlIGFsbG93ZWQgb3IKK2RlbmllZCBhbmQgaWYgdGhlIGFjdGlvbiBzaG91bGQgYmUgYXVkaXRlZC48L3BhcmE+CisKKzxwYXJhPlRoZSBkYWVtb24gcGVyZm9ybXMgQXBwQXJtb3Igc2VjdXJpdHkgY2hlY2tzIGluIHRocmVlIHBsYWNlcy48L3BhcmE+CisKKzxwYXJhPkZpcnN0LCBhbnkgdGltZSBhIG1lc3NhZ2UgaXMgcm91dGVkIGZyb20gb25lIGNvbm5lY3Rpb24gdG8gYW5vdGhlcgorY29ubmVjdGlvbiwgdGhlIGJ1cyBkYWVtb24gd2lsbCBjaGVjayBwZXJtaXNzaW9ucyB3aXRoIHRoZSBsYWJlbCBvZiB0aGUgZmlyc3QKK2Nvbm5lY3Rpb24gYXMgc291cmNlLCBsYWJlbCBhbmQvb3IgY29ubmVjdGlvbiBuYW1lIG9mIHRoZSBzZWNvbmQgY29ubmVjdGlvbiBhcwordGFyZ2V0LCBhbG9uZyB3aXRoIHRoZSBidXMgbmFtZSwgdGhlIHBhdGggbmFtZSwgdGhlIGludGVyZmFjZSBuYW1lLCBhbmQgdGhlCittZW1iZXIgbmFtZS4gUmVwbHkgbWVzc2FnZXMsIHN1Y2ggYXMgbWV0aG9kX3JldHVybiBhbmQgZXJyb3IgbWVzc2FnZXMsIGFyZQoraW1wbGljaXRseSBhbGxvd2VkIGlmIHRoZXkgYXJlIGluIHJlc3BvbnNlIHRvIGEgbWVzc2FnZSB0aGF0IGhhcyBhbHJlYWR5IGJlZW4KK2FsbG93ZWQuPC9wYXJhPgorCis8cGFyYT5TZWNvbmQsIGFueSB0aW1lIGEgY29ubmVjdGlvbiBhc2tzIHRvIG93biBhIG5hbWUsIHRoZSBidXMgZGFlbW9uIHdpbGwKK2NoZWNrIHBlcm1pc3Npb25zIHdpdGggdGhlIGxhYmVsIG9mIHRoZSBjb25uZWN0aW9uIGFzIHNvdXJjZSwgdGhlIHJlcXVlc3RlZAorbmFtZSBhcyB0YXJnZXQsIGFsb25nIHdpdGggdGhlIGJ1cyBuYW1lLjwvcGFyYT4KKworPHBhcmE+VGhpcmQsIGFueSB0aW1lIGEgY29ubmVjdGlvbiBhdHRlbXB0cyB0byBlYXZlc2Ryb3AsIHRoZSBidXMgZGFlbW9uIHdpbGwKK2NoZWNrIHBlcm1pc3Npb25zIHdpdGggdGhlIGxhYmVsIG9mIHRoZSBjb25uZWN0aW9uIGFzIHRoZSBzb3VyY2UsIGFsb25nIHdpdGgKK3RoZSBidXMgbmFtZS48L3BhcmE+CisKKzxwYXJhPkFwcEFybW9yIHJ1bGVzIGZvciBidXMgbWVkaWF0aW9uIGFyZSBub3Qgc3RvcmVkIGluIHRoZSBidXMgY29uZmlndXJhdGlvbgorZmlsZXMuIFRoZXkgYXJlIHN0b3JlZCBpbiB0aGUgYXBwbGljYXRpb24ncyBBcHBBcm1vciBwcm9maWxlLiBQbGVhc2Ugc2VlCis8ZW1waGFzaXMgcmVtYXA9J0knPmFwcGFybW9yLmQoNSk8L2VtcGhhc2lzPiBmb3IgbW9yZSBkZXRhaWxzLjwvcGFyYT4KKworPC9yZWZzZWN0MT4KKworPHJlZnNlY3QxIGlkPSdkZWJ1Z2dpbmcnPjx0aXRsZT5ERUJVR0dJTkc8L3RpdGxlPgorPHBhcmE+SWYgeW91J3JlIHRyeWluZyB0byBmaWd1cmUgb3V0IHdoZXJlIHlvdXIgbWVzc2FnZXMgYXJlIGdvaW5nIG9yIHdoeQoreW91IGFyZW4ndCBnZXR0aW5nIG1lc3NhZ2VzLCB0aGVyZSBhcmUgc2V2ZXJhbCB0aGluZ3MgeW91IGNhbiB0cnkuPC9wYXJhPgorCis8cGFyYT5SZW1lbWJlciB0aGF0IHRoZSBzeXN0ZW0gYnVzIGlzIGhlYXZpbHkgbG9ja2VkIGRvd24gYW5kIGlmIHlvdQoraGF2ZW4ndCBpbnN0YWxsZWQgYSBzZWN1cml0eSBwb2xpY3kgZmlsZSB0byBhbGxvdyB5b3VyIG1lc3NhZ2UKK3Rocm91Z2gsIGl0IHdvbid0IHdvcmsuIEZvciB0aGUgc2Vzc2lvbiBidXMsIHRoaXMgaXMgbm90IGEgY29uY2Vybi48L3BhcmE+CisKKzxwYXJhPlRoZSBzaW1wbGVzdCB3YXkgdG8gZmlndXJlIG91dCB3aGF0J3MgaGFwcGVuaW5nIG9uIHRoZSBidXMgaXMgdG8gcnVuCit0aGUgPGVtcGhhc2lzIHJlbWFwPSdJJz5kYnVzLW1vbml0b3I8L2VtcGhhc2lzPiBwcm9ncmFtLCB3aGljaCBjb21lcyB3aXRoIHRoZSBELUJ1cworcGFja2FnZS4gWW91IGNhbiBhbHNvIHNlbmQgdGVzdCBtZXNzYWdlcyB3aXRoIDxlbXBoYXNpcyByZW1hcD0nSSc+ZGJ1cy1zZW5kPC9lbXBoYXNpcz4uIFRoZXNlCitwcm9ncmFtcyBoYXZlIHRoZWlyIG93biBtYW4gcGFnZXMuPC9wYXJhPgorCis8cGFyYT5JZiB5b3Ugd2FudCB0byBrbm93IHdoYXQgdGhlIGRhZW1vbiBpdHNlbGYgaXMgZG9pbmcsIHlvdSBtaWdodCBjb25zaWRlcgorcnVubmluZyBhIHNlcGFyYXRlIGNvcHkgb2YgdGhlIGRhZW1vbiB0byB0ZXN0IGFnYWluc3QuIFRoaXMgd2lsbCBhbGxvdyB5b3UKK3RvIHB1dCB0aGUgZGFlbW9uIHVuZGVyIGEgZGVidWdnZXIsIG9yIHJ1biBpdCB3aXRoIHZlcmJvc2Ugb3V0cHV0LCB3aXRob3V0CittZXNzaW5nIHVwIHlvdXIgcmVhbCBzZXNzaW9uIGFuZCBzeXN0ZW0gZGFlbW9ucy48L3BhcmE+CisKKzxwYXJhPlRvIHJ1biBhIHNlcGFyYXRlIHRlc3QgY29weSBvZiB0aGUgZGFlbW9uLCBmb3IgZXhhbXBsZSB5b3UgbWlnaHQgb3BlbiBhIHRlcm1pbmFsCithbmQgdHlwZTo8L3BhcmE+Cis8bGl0ZXJhbGxheW91dCByZW1hcD0nLm5mJz4KKyAgREJVU19WRVJCT1NFPTEgZGJ1cy1kYWVtb24gLS1zZXNzaW9uIC0tcHJpbnQtYWRkcmVzcworPC9saXRlcmFsbGF5b3V0PiA8IS0tIC5maSAtLT4KKworPHBhcmE+VGhlIHRlc3QgZGFlbW9uIGFkZHJlc3Mgd2lsbCBiZSBwcmludGVkIHdoZW4gdGhlIGRhZW1vbiBzdGFydHMuIFlvdSB3aWxsIG5lZWQKK3RvIGNvcHktYW5kLXBhc3RlIHRoaXMgYWRkcmVzcyBhbmQgdXNlIGl0IGFzIHRoZSB2YWx1ZSBvZiB0aGUKK0RCVVNfU0VTU0lPTl9CVVNfQUREUkVTUyBlbnZpcm9ubWVudCB2YXJpYWJsZSB3aGVuIHlvdSBsYXVuY2ggdGhlIGFwcGxpY2F0aW9ucworeW91IHdhbnQgdG8gdGVzdC4gVGhpcyB3aWxsIGNhdXNlIHRob3NlIGFwcGxpY2F0aW9ucyB0byBjb25uZWN0IHRvIHlvdXIKK3Rlc3QgYnVzIGluc3RlYWQgb2YgdGhlIERCVVNfU0VTU0lPTl9CVVNfQUREUkVTUyBvZiB5b3VyIHJlYWwgc2Vzc2lvbiBidXMuPC9wYXJhPgorCis8cGFyYT5EQlVTX1ZFUkJPU0U9MSB3aWxsIGhhdmUgTk8gRUZGRUNUIHVubGVzcyB5b3VyIGNvcHkgb2YgRC1CdXMKK3dhcyBjb21waWxlZCB3aXRoIHZlcmJvc2UgbW9kZSBlbmFibGVkLiBUaGlzIGlzIG5vdCByZWNvbW1lbmRlZCBpbgorcHJvZHVjdGlvbiBidWlsZHMgZHVlIHRvIHBlcmZvcm1hbmNlIGltcGFjdC4gWW91IG1heSBuZWVkIHRvIHJlYnVpbGQKK0QtQnVzIGlmIHlvdXIgY29weSB3YXMgbm90IGJ1aWx0IHdpdGggZGVidWdnaW5nIGluIG1pbmQuIChEQlVTX1ZFUkJPU0UKK2Fsc28gYWZmZWN0cyB0aGUgRC1CdXMgbGlicmFyeSBhbmQgdGh1cyBhcHBsaWNhdGlvbnMgdXNpbmcgRC1CdXM7IGl0IG1heQorYmUgdXNlZnVsIHRvIHNlZSB2ZXJib3NlIG91dHB1dCBvbiBib3RoIHRoZSBjbGllbnQgc2lkZSBhbmQgZnJvbSB0aGUgZGFlbW9uLik8L3BhcmE+CisKKzxwYXJhPklmIHlvdSB3YW50IHRvIGdldCBmYW5jeSwgeW91IGNhbiBjcmVhdGUgYSBjdXN0b20gYnVzCitjb25maWd1cmF0aW9uIGZvciB5b3VyIHRlc3QgYnVzIChzZWUgdGhlIHNlc3Npb24uY29uZiBhbmQgc3lzdGVtLmNvbmYKK2ZpbGVzIHRoYXQgZGVmaW5lIHRoZSB0d28gZGVmYXVsdCBjb25maWd1cmF0aW9ucyBmb3IgZXhhbXBsZSkuIFRoaXMKK3dvdWxkIGFsbG93IHlvdSB0byBzcGVjaWZ5IGEgZGlmZmVyZW50IGRpcmVjdG9yeSBmb3IgLnNlcnZpY2UgZmlsZXMsCitmb3IgZXhhbXBsZS48L3BhcmE+CisKKzwvcmVmc2VjdDE+CisKKzxyZWZzZWN0MSBpZD0nYXV0aG9yJz48dGl0bGU+QVVUSE9SPC90aXRsZT4KKzxwYXJhPlNlZSA8dWxpbmsgdXJsPSdodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zb2Z0d2FyZS9kYnVzL2RvYy9BVVRIT1JTJz5odHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zb2Z0d2FyZS9kYnVzL2RvYy9BVVRIT1JTPC91bGluaz48L3BhcmE+CisKKzwvcmVmc2VjdDE+CisKKzxyZWZzZWN0MSBpZD0nYnVncyc+PHRpdGxlPkJVR1M8L3RpdGxlPgorPHBhcmE+UGxlYXNlIHNlbmQgYnVnIHJlcG9ydHMgdG8gdGhlIEQtQnVzIG1haWxpbmcgbGlzdCBvciBidWcgdHJhY2tlciwKK3NlZSA8dWxpbmsgdXJsPSdodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zb2Z0d2FyZS9kYnVzLyc+aHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc29mdHdhcmUvZGJ1cy88L3VsaW5rPjwvcGFyYT4KKzwvcmVmc2VjdDE+Cis8L3JlZmVudHJ5PgpkaWZmIC0tZ2l0IGEvZG9jL2RidXMtZmFxLnhtbCBiL2RvYy9kYnVzLWZhcS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQyOTZkOQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9kYnVzLWZhcS54bWwKQEAgLTAsMCArMSw2NzQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgc3RhbmRhbG9uZT0ibm8iPz4KKzwhRE9DVFlQRSBhcnRpY2xlIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBEb2NCb29rIFhNTCBWNC40Ly9FTiIKKyJodHRwOi8vd3d3Lm9hc2lzLW9wZW4ub3JnL2RvY2Jvb2sveG1sLzQuNC9kb2Nib29reC5kdGQiCitbCitdPgorCis8YXJ0aWNsZSBpZD0iaW5kZXgiPgorICA8YXJ0aWNsZWluZm8+CisgICAgPHRpdGxlPkQtQnVzIEZBUTwvdGl0bGU+CisgICAgPHJlbGVhc2VpbmZvPlZlcnNpb24gMC4zPC9yZWxlYXNlaW5mbz4KKyAgICA8ZGF0ZT4xNyBOb3ZlbWJlciAyMDA2PC9kYXRlPgorICAgIDxhdXRob3Jncm91cD4KKyAgICAgIDxhdXRob3I+CisJPGZpcnN0bmFtZT5IYXZvYzwvZmlyc3RuYW1lPgorCTxzdXJuYW1lPlBlbm5pbmd0b248L3N1cm5hbWU+CisJPGFmZmlsaWF0aW9uPgorCSAgPG9yZ25hbWU+UmVkIEhhdCwgSW5jLjwvb3JnbmFtZT4KKwkgIDxhZGRyZXNzPgorCSAgICA8ZW1haWw+aHBAcG9ib3guY29tPC9lbWFpbD4KKwkgIDwvYWRkcmVzcz4KKwk8L2FmZmlsaWF0aW9uPgorICAgICAgPC9hdXRob3I+CisgICAgICA8YXV0aG9yPgorCTxmaXJzdG5hbWU+RGF2aWQ8L2ZpcnN0bmFtZT4KKyAgICAgICAgPG90aGVybmFtZSByb2xlPSJtaSI+QTwvb3RoZXJuYW1lPgorCTxzdXJuYW1lPldoZWVsZXI8L3N1cm5hbWU+CisgICAgICA8L2F1dGhvcj4KKyAgICA8L2F1dGhvcmdyb3VwPgorICA8L2FydGljbGVpbmZvPgorCisgIDxxYW5kYXNldCBpZD0iZmFxIj4KKworICAgIDxxYW5kYWVudHJ5PgorICAgICAgPHF1ZXN0aW9uPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBXaGF0IGlzIEQtQnVzPworICAgICAgICA8L3BhcmE+CisgICAgICA8L3F1ZXN0aW9uPgorICAgICAgPGFuc3dlcj4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgVGhpcyBpcyBwcm9iYWJseSBiZXN0IGFuc3dlcmVkIGJ5IHJlYWRpbmcgdGhlIEQtQnVzIDx1bGluayB1cmw9ImRidXMtdHV0b3JpYWwuaHRtbCI+dHV0b3JpYWw8L3VsaW5rPiBvcgorICAgICAgICAgIHRoZSBpbnRyb2R1Y3Rpb24gdG8gdGhlIDx1bGluayB1cmw9ImRidXMtc3BlY2lmaWNhdGlvbi5odG1sIj5zcGVjaWZpY2F0aW9uPC91bGluaz4uIEluCisgICAgICAgICAgc2hvcnQsIGl0IGlzIGEgc3lzdGVtIGNvbnNpc3Rpbmcgb2YgMSkgYSB3aXJlIHByb3RvY29sIGZvciBleHBvc2luZyBhCisgICAgICAgICAgdHlwaWNhbCBvYmplY3Qtb3JpZW50ZWQgbGFuZ3VhZ2UvZnJhbWV3b3JrIHRvIG90aGVyIGFwcGxpY2F0aW9uczsgYW5kCisgICAgICAgICAgMikgYSBidXMgZGFlbW9uIHRoYXQgYWxsb3dzIGFwcGxpY2F0aW9ucyB0byBmaW5kIGFuZCBtb25pdG9yIG9uZSBhbm90aGVyLgorICAgICAgICAgIFBocmFzZWQgZGlmZmVyZW50bHksIEQtQnVzIGlzIDEpIGFuIGludGVycHJvY2VzcyBjb21tdW5pY2F0aW9uIChJUEMpIHN5c3RlbSBhbmQgMikgc29tZSBoaWdoZXItbGV2ZWwgCisgICAgICAgICAgc3RydWN0dXJlIChsaWZlY3ljbGUgdHJhY2tpbmcsIHNlcnZpY2UgYWN0aXZhdGlvbiwgc2VjdXJpdHkgcG9saWN5KSBwcm92aWRlZCBieSB0d28gYnVzIGRhZW1vbnMsCisgICAgICAgICAgb25lIHN5c3RlbXdpZGUgYW5kIG9uZSBwZXItdXNlci1zZXNzaW9uLgorICAgICAgICA8L3BhcmE+CisgICAgICA8L2Fuc3dlcj4KKyAgICA8L3FhbmRhZW50cnk+CisKKyAgICA8cWFuZGFlbnRyeT4KKyAgICAgIDxxdWVzdGlvbj4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgSXMgRC1CdXMgc3RhYmxlL2ZpbmlzaGVkPworICAgICAgICA8L3BhcmE+CisgICAgICA8L3F1ZXN0aW9uPgorICAgICAgPGFuc3dlcj4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgVGhlIGxvdy1sZXZlbCBsaWJyYXJ5ICJsaWJkYnVzIiBhbmQgdGhlIHByb3RvY29sIHNwZWNpZmljYXRpb24gYXJlIGNvbnNpZGVyZWQgCisgICAgICAgICAgQUJJIHN0YWJsZS4gVGhlIDx1bGluayB1cmw9IlJFQURNRSI+UkVBRE1FPC91bGluaz4KKyAgICAgICAgICBmaWxlIGhhcyBhIGRpc2N1c3Npb24gb2YgdGhlIEFQSS9BQkkgc3RhYmlsaXR5IGd1YXJhbnRlZXMuCisgICAgICAgICAgSGlnaGVyLWxldmVsIGJpbmRpbmdzIChzdWNoIGFzIHRob3NlIGZvciBRdCwgR0xpYiwgUHl0aG9uLCBKYXZhLCBDIykgZWFjaCAKKyAgICAgICAgICBoYXZlIHRoZWlyIG93biByZWxlYXNlIHNjaGVkdWxlcyBhbmQgZGVncmVlIG9mIG1hdHVyaXR5LCBub3QgbGlua2VkIHRvIAorICAgICAgICAgIHRoZSBsb3ctbGV2ZWwgbGlicmFyeSBhbmQgYnVzIGRhZW1vbiByZWxlYXNlLiBDaGVjayB0aGUgcHJvamVjdCBwYWdlIGZvcgorICAgICAgICAgIHRoZSBiaW5kaW5nIHlvdSdyZSBjb25zaWRlcmluZyB0byB1bmRlcnN0YW5kIHRoYXQgcHJvamVjdCdzIHBvbGljaWVzLgorICAgICAgICA8L3BhcmE+CisgICAgICA8L2Fuc3dlcj4KKyAgICA8L3FhbmRhZW50cnk+CisKKyAgICA8cWFuZGFlbnRyeT4KKyAgICAgIDxxdWVzdGlvbj4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgSG93IGlzIHRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gbGljZW5zZWQ/IENhbiBJIHVzZSBpdCBpbiAKKyAgICAgICAgICBwcm9wcmlldGFyeSBhcHBsaWNhdGlvbnM/CisgICAgICAgIDwvcGFyYT4KKyAgICAgIDwvcXVlc3Rpb24+CisgICAgICA8YW5zd2VyPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBUaGUgc2hvcnQgYW5zd2VyIGlzIHllcywgeW91IGNhbiB1c2UgaXQgaW4gcHJvcHJpZXRhcnkgYXBwbGljYXRpb25zLgorICAgICAgICAgIFlvdSBzaG91bGQgcmVhZCB0aGUgPHVsaW5rIHVybD0iQ09QWUlORyI+Q09QWUlORzwvdWxpbms+IGZpbGUsIHdoaWNoCisgICAgICAgICAgb2ZmZXJzIHlvdSB0aGUgY2hvaWNlIG9mIHR3byBsaWNlbnNlcy4gVGhlc2UgYXJlIHRoZSBHUEwgYW5kIHRoZQorICAgICAgICAgIEFGTC4gVGhlIEdQTCByZXF1aXJlcyB0aGF0IHlvdXIgYXBwbGljYXRpb24gYmUgbGljZW5zZWQgdW5kZXIgdGhlIEdQTAorICAgICAgICAgIGFzIHdlbGwuIFRoZSBBRkwgaXMgYW4gIlgtc3R5bGUiIG9yICJCU0Qtc3R5bGUiIGxpY2Vuc2UgY29tcGF0aWJsZQorICAgICAgICAgIHdpdGggcHJvcHJpZXRhcnkgbGljZW5zaW5nLCBidXQgaXQgZG9lcyBoYXZlIHNvbWUgcmVxdWlyZW1lbnRzOyBpbgorICAgICAgICAgIHBhcnRpY3VsYXIgaXQgcHJvaGliaXRzIHlvdSBmcm9tIGZpbGluZyBhIGxhd3N1aXQgYWxsZWdpbmcgdGhhdCB0aGUKKyAgICAgICAgICBELUJ1cyBzb2Z0d2FyZSBpbmZyaW5nZXMgeW91ciBwYXRlbnRzIDxlbXBoYXNpcz53aGlsZSB5b3UgY29udGludWUgdG8KKyAgICAgICAgICB1c2UgRC1CdXM8L2VtcGhhc2lzPi4gIElmIHlvdSdyZSBnb2luZyB0byBzdWUsIHlvdSBoYXZlIHRvIHN0b3AgdXNpbmcKKyAgICAgICAgICB0aGUgc29mdHdhcmUuIFJlYWQgdGhlIGxpY2Vuc2VzIHRvIGRldGVybWluZSB0aGVpciBtZWFuaW5nLCB0aGlzIEZBUQorICAgICAgICAgIGVudHJ5IGlzIG5vdCBpbnRlbmRlZCB0byBjaGFuZ2UgdGhlIG1lYW5pbmcgb3IgdGVybXMgb2YgdGhlIGxpY2Vuc2VzLgorICAgICAgICA8L3BhcmE+CisgICAgICA8L2Fuc3dlcj4KKyAgICA8L3FhbmRhZW50cnk+CisKKyAgICA8cWFuZGFlbnRyeT4KKyAgICAgIDxxdWVzdGlvbj4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgV2hhdCBpcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGEgYnVzIG5hbWUsIGFuZCBvYmplY3QgcGF0aCwgCisgICAgICAgICAgYW5kIGFuIGludGVyZmFjZT8KKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9xdWVzdGlvbj4KKyAgICAgIDxhbnN3ZXI+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIElmIHlvdSBpbWFnaW5lIGEgQysrIHByb2dyYW0gdGhhdCBpbXBsZW1lbnRzIGEgbmV0d29yayBzZXJ2aWNlLCB0aGVuCisgICAgICAgICAgdGhlIGJ1cyBuYW1lIGlzIHRoZSBob3N0bmFtZSBvZiB0aGUgY29tcHV0ZXIgcnVubmluZyB0aGlzIEMrKyBwcm9ncmFtLAorICAgICAgICAgIHRoZSBvYmplY3QgcGF0aCBpcyBhIEMrKyBvYmplY3QgaW5zdGFuY2UgcG9pbnRlciwgYW5kIGFuIGludGVyZmFjZSBpcworICAgICAgICAgIGEgQysrIGNsYXNzIChhIHB1cmUgdmlydHVhbCBvciBhYnN0cmFjdCBjbGFzcywgdG8gYmUgZXhhY3QpLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEluIEphdmEgdGVybXMsIHRoZSBvYmplY3QgcGF0aCBpcyBhbiBvYmplY3QgcmVmZXJlbmNlLCAKKyAgICAgICAgICBhbmQgYW4gaW50ZXJmYWNlIGlzIGEgSmF2YSBpbnRlcmZhY2UuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgUGVvcGxlIGdldCBjb25mdXNlZCBiZWNhdXNlIGlmIHRoZXkgd3JpdGUgYW4gYXBwbGljYXRpb24gCisgICAgICAgICAgd2l0aCBhIHNpbmdsZSBvYmplY3QgaW5zdGFuY2UgYW5kIGEgc2luZ2xlIGludGVyZmFjZSwgCisgICAgICAgICAgdGhlbiB0aGUgYnVzIG5hbWUsIG9iamVjdCBwYXRoLCBhbmQgaW50ZXJmYWNlIGxvb2sgCisgICAgICAgICAgcmVkdW5kYW50LiBGb3IgZXhhbXBsZSwgeW91IG1pZ2h0IGhhdmUgYSB0ZXh0IGVkaXRvciAKKyAgICAgICAgICB0aGF0IHVzZXMgdGhlIGJ1cyBuYW1lIDxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5UZXh0RWRpdG9yPC9saXRlcmFsPiwKKyAgICAgICAgICBoYXMgYSBnbG9iYWwgc2luZ2xldG9uIG9iamVjdCBjYWxsZWQgCisgICAgICAgICAgPGxpdGVyYWw+L29yZy9mcmVlZGVza3RvcC9UZXh0RWRpdG9yPC9saXRlcmFsPiwgYW5kIAorICAgICAgICAgIHRoYXQgc2luZ2xldG9uIG9iamVjdCBjb3VsZCBpbXBsZW1lbnQgdGhlIGludGVyZmFjZSAKKyAgICAgICAgICA8bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuVGV4dEVkaXRvcjwvbGl0ZXJhbD4uCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgSG93ZXZlciwgYSB0ZXh0IGVkaXRvciBhcHBsaWNhdGlvbiBjb3VsZCBhcyBlYXNpbHkgb3duIG11bHRpcGxlIGJ1cworICAgICAgICAgIG5hbWVzIChmb3IgZXhhbXBsZSwgPGxpdGVyYWw+b3JnLmtkZS5LV3JpdGU8L2xpdGVyYWw+IGluIGFkZGl0aW9uIHRvCisgICAgICAgICAgZ2VuZXJpYyA8bGl0ZXJhbD5UZXh0RWRpdG9yPC9saXRlcmFsPiksIGhhdmUgbXVsdGlwbGUgb2JqZWN0cyAobWF5YmUKKyAgICAgICAgICA8bGl0ZXJhbD4vb3JnL2tkZS9kb2N1bWVudHMvNDM1MjwvbGl0ZXJhbD4gd2hlcmUgdGhlIG51bWJlciBjaGFuZ2VzCisgICAgICAgICAgYWNjb3JkaW5nIHRvIHRoZSBkb2N1bWVudCksIGFuZCBlYWNoIG9iamVjdCBjb3VsZCBpbXBsZW1lbnQgbXVsdGlwbGUKKyAgICAgICAgICBpbnRlcmZhY2VzLCBzdWNoIGFzIDxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzLkludHJvc3BlY3RhYmxlPC9saXRlcmFsPiwKKyAgICAgICAgICA8bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuQmFzaWNUZXh0RmllbGQ8L2xpdGVyYWw+LAorICAgICAgICAgIDxsaXRlcmFsPm9yZy5rZGUuUmljaFRleHREb2N1bWVudDwvbGl0ZXJhbD4uCisgICAgICAgIDwvcGFyYT4KKyAgICAgIDwvYW5zd2VyPgorICAgIDwvcWFuZGFlbnRyeT4KKworCisgICAgPHFhbmRhZW50cnkgaWQ9InNlcnZpY2UiPgorICAgICAgPHF1ZXN0aW9uPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBXaGF0IGlzIGEgInNlcnZpY2UiPworICAgICAgICA8L3BhcmE+CisgICAgICA8L3F1ZXN0aW9uPgorICAgICAgPGFuc3dlcj4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgQSBzZXJ2aWNlIGlzIGEgcHJvZ3JhbSB0aGF0IGNhbiBiZSBsYXVuY2hlZCBieSB0aGUgYnVzIGRhZW1vbiAKKyAgICAgICAgICB0byBwcm92aWRlIHNvbWUgZnVuY3Rpb25hbGl0eSB0byBvdGhlciBwcm9ncmFtcy4gU2VydmljZXMKKyAgICAgICAgICBhcmUgbm9ybWFsbHkgbGF1bmNoZWQgYWNjb3JkaW5nIHRvIHRoZSBidXMgbmFtZSB0aGV5IHdpbGwgCisgICAgICAgICAgaGF2ZS4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBQZW9wbGUgb2Z0ZW4gbWlzdXNlIHRoZSB3b3JkICJzZXJ2aWNlIiBmb3IgYW55IAorICAgICAgICAgIGJ1cyBuYW1lLCBidXQgdGhpcyB0ZW5kcyB0byBiZSBhbWJpZ3VvdXMgYW5kIGNvbmZ1c2luZyBzbyBpcyBkaXNjb3VyYWdlZC4KKyAgICAgICAgICBJbiB0aGUgRC1CdXMgZG9jcyB3ZSB0cnkgdG8gdXNlICJzZXJ2aWNlIiBvbmx5IHdoZW4gdGFsa2luZyBhYm91dCAKKyAgICAgICAgICBwcm9ncmFtcyB0aGUgYnVzIGtub3dzIGhvdyB0byBsYXVuY2gsIGkuZS4gYSBzZXJ2aWNlIGFsd2F5cyBoYXMgYSAKKyAgICAgICAgICAuc2VydmljZSBmaWxlLgorICAgICAgICA8L3BhcmE+CisgICAgICA8L2Fuc3dlcj4KKyAgICA8L3FhbmRhZW50cnk+CisKKyAgICA8cWFuZGFlbnRyeSBpZD0iY29tcG9uZW50cyI+CisgICAgICA8cXVlc3Rpb24+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIElzIEQtQnVzIGEgImNvbXBvbmVudCBzeXN0ZW0iPworICAgICAgICA8L3BhcmE+CisgICAgICA8L3F1ZXN0aW9uPgorICAgICAgPGFuc3dlcj4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgSXQgaGVscHMgdG8ga2VlcCB0aGVzZSBjb25jZXB0cyBzZXBhcmF0ZSBpbiB5b3VyIG1pbmQ6CisgICAgICAgICAgPG9yZGVyZWRsaXN0PgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBPYmplY3QvY29tcG9uZW50IHN5c3RlbQorICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBHVUkgY29udHJvbC93aWRnZXQgZW1iZWRkaW5nIGludGVyZmFjZXMKKyAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgSW50ZXJwcm9jZXNzIGNvbW11bmljYXRpb24gc3lzdGVtIG9yIHdpcmUgcHJvdG9jb2wKKyAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICA8L29yZGVyZWRsaXN0PgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEQtQnVzIGlzIG5vdCBhIGNvbXBvbmVudCBzeXN0ZW0uICJDb21wb25lbnQgc3lzdGVtIiB3YXMgb3JpZ2luYWxseQorICAgICAgICAgIGRlZmluZWQgYnkgQ09NLCBhbmQgd2FzIGVzc2VudGlhbGx5IGEgd29ya2Fyb3VuZCBmb3IgdGhlIGxpbWl0YXRpb25zCisgICAgICAgICAgb2YgdGhlIEMrKyBvYmplY3Qgc3lzdGVtIChhZGRpbmcgaW50cm9zcGVjdGlvbiwgcnVudGltZSBsb2NhdGlvbiBvZgorICAgICAgICAgIG9iamVjdHMsIEFCSSBndWFyYW50ZWVzLCBhbmQgc28gZm9ydGgpLiBXaXRoIHRoZSBDIyBsYW5ndWFnZSBhbmQgQ0xSLAorICAgICAgICAgIE1pY3Jvc29mdCBhZGRlZCB0aGVzZSBmZWF0dXJlcyB0byB0aGUgcHJpbWFyeSBvYmplY3Qgc3lzdGVtLCBsZWF2aW5nCisgICAgICAgICAgQ09NIG9ic29sZXRlLiBTaW1pbGFybHksIEphdmEgaGFzIG11Y2ggbGVzcyBuZWVkIGZvciBzb21ldGhpbmcgbGlrZQorICAgICAgICAgIENPTSB0aGFuIEMrKyBkaWQuIEV2ZW4gUU9iamVjdCAoZnJvbSBRdCkgYW5kIEdPYmplY3QgKGZyb20gR0xpYikgb2ZmZXIKKyAgICAgICAgICBzb21lIG9mIHRoZSBzYW1lIGZlYXR1cmVzIGZvdW5kIGluIENPTS4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBDb21wb25lbnQgc3lzdGVtcyBhcmUgbm90IGFib3V0IEdVSSBjb250cm9sIGVtYmVkZGluZy4gRW1iZWRkaW5nCisgICAgICAgICAgYSBzcHJlYWRzaGVldCBpbiBhIHdvcmQgcHJvY2Vzc29yIGRvY3VtZW50IGlzIGEgbWF0dGVyIG9mIGRlZmluaW5nCisgICAgICAgICAgc29tZSBzcGVjaWZpYyA8ZW1waGFzaXM+aW50ZXJmYWNlczwvZW1waGFzaXM+IHRoYXQgb2JqZWN0cworICAgICAgICAgIGNhbiBpbXBsZW1lbnQuIFRoZXNlIGludGVyZmFjZXMgcHJvdmlkZSBtZXRob2RzIHJlbGF0ZWQgdG8gCisgICAgICAgICAgR1VJIGNvbnRyb2xzLiBTbyBhbiBvYmplY3QgaW1wbGVtZW50aW5nIHRob3NlIGludGVyZmFjZXMgCisgICAgICAgICAgY2FuIGJlIGVtYmVkZGVkLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIFRoZSB3b3JkICJjb21wb25lbnQiIGp1c3QgbWVhbnMgIm9iamVjdCB3aXRoIHNvbWUgZmFuY3kgZmVhdHVyZXMiIGFuZAorICAgICAgICAgIGluIG1vZGVybiBsYW5ndWFnZXMgYWxsIG9iamVjdHMgYXJlIGVmZmVjdGl2ZWx5ICJjb21wb25lbnRzLiIKKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBTbyBjb21wb25lbnRzIGFyZSBmYW5jeSBvYmplY3RzLCBhbmQgc29tZSBvYmplY3RzIGFyZSBHVUkgY29udHJvbHMuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgQSB0aGlyZCwgdW5yZWxhdGVkIGZlYXR1cmUgaXMgaW50ZXJwcm9jZXNzIGNvbW11bmljYXRpb24gb3IgSVBDLgorICAgICAgICAgIEQtQnVzIGlzIGFuIElQQyBzeXN0ZW0uIEdpdmVuIGFuIG9iamVjdCAob3IgImNvbXBvbmVudCIgaWYgeW91IG11c3QpLCAKKyAgICAgICAgICB5b3UgY2FuIGV4cG9zZSB0aGUgZnVuY3Rpb25hbGl0eSBvZiB0aGF0IG9iamVjdCBvdmVyIGFuIElQQyBzeXN0ZW0uCisgICAgICAgICAgRXhhbXBsZXMgb2YgSVBDIHN5c3RlbXMgYXJlIERDT00sIENPUkJBLCBTT0FQLCBYTUwtUlBDLCBhbmQgRC1CdXMuCisgICAgICAgICAgWW91IGNhbiB1c2UgYW55IG9mIHRoZXNlIElQQyBzeXN0ZW1zIHdpdGggYW55IG9iamVjdC9jb21wb25lbnQgc3lzdGVtLAorICAgICAgICAgIHRob3VnaCBzb21lIG9mIHRoZW0gYXJlICJ0dW5lZCIgZm9yIHNwZWNpZmljIG9iamVjdCBzeXN0ZW1zLgorICAgICAgICAgIFlvdSBjYW4gdGhpbmsgb2YgYW4gSVBDIHN5c3RlbSBwcmltYXJpbHkgYXMgYSB3aXJlIHByb3RvY29sLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIElmIHlvdSBjb21iaW5lIGFuIElQQyBzeXN0ZW0gd2l0aCBhIHNldCBvZiBHVUkgY29udHJvbCBpbnRlcmZhY2VzLCAKKyAgICAgICAgICB0aGVuIHlvdSBjYW4gaGF2ZSBhbiBvdXQtb2YtcHJvY2VzcyBvciBkeW5hbWljYWxseS1sb2FkZWQgR1VJIGNvbnRyb2wuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgQW5vdGhlciByZWxhdGVkIGNvbmNlcHQgaXMgdGhlIDxmaXJzdHRlcm0+cGx1Z2luPC9maXJzdHRlcm0+IG9yCisgICAgICAgICAgPGZpcnN0dGVybT5leHRlbnNpb248L2ZpcnN0dGVybT4uICBHZW5lcmljIHBsdWdpbiBzeXN0ZW1zIHN1Y2ggYXMgdGhlCisgICAgICAgICAgPHVsaW5rIHVybD0iaHR0cDovL2VjbGlwc2Uub3JnIj5FY2xpcHNlPC91bGluaz4gc3lzdGVtIGFyZSBub3Qgc28gZGlmZmVyZW50CisgICAgICAgICAgZnJvbSBjb21wb25lbnQvb2JqZWN0IHN5c3RlbXMsIHRob3VnaCBwZXJoYXBzIGEgInBsdWdpbiIgdGVuZHMgdG8gYmUgYQorICAgICAgICAgIGJ1bmRsZSBvZiBvYmplY3RzIHdpdGggYSB1c2VyLXZpc2libGUgbmFtZSBhbmQgY2FuIGJlCisgICAgICAgICAgZG93bmxvYWRlZC9wYWNrYWdlZCBhcyBhIHVuaXQuCisgICAgICAgIDwvcGFyYT4KKyAgICAgIDwvYW5zd2VyPgorICAgIDwvcWFuZGFlbnRyeT4KKworICAgIDxxYW5kYWVudHJ5IGlkPSJzcGVlZCI+CisgICAgICA8cXVlc3Rpb24+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEhvdyBmYXN0IGlzIHRoZSBELUJ1cyByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24/CisgICAgICAgIDwvcGFyYT4KKyAgICAgIDwvcXVlc3Rpb24+CisgICAgICA8YW5zd2VyPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBPZiBjb3Vyc2UgaXQgZGVwZW5kcyBhIGJpdCBvbiB3aGF0IHlvdSdyZSBkb2luZy4gCisgICAgICAgICAgPHVsaW5rIHVybD0iaHR0cDovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9waXBlcm1haWwvZGJ1cy8yMDA0LU5vdmVtYmVyLzAwMTc3OS5odG1sIj4KKyAgICAgICAgICAgIFRoaXMgbWFpbDwvdWxpbms+IGNvbnRhaW5zIHNvbWUgYmVuY2htYXJraW5nLiAgQXQgdGhlIHRpbWUgb2YgdGhhdAorICAgICAgICAgIGJlbmNobWFyaywgRC1CdXMgb25lLXRvLW9uZSBjb21tdW5pY2F0aW9uIHdhcyBhYm91dCAyLjV4IHNsb3dlciB0aGFuCisgICAgICAgICAgc2ltcGx5IHB1c2hpbmcgdGhlIGRhdGEgcmF3IG92ZXIgYSBzb2NrZXQuIEFmdGVyIHRoZSByZWNlbnQgcmV3cml0ZSBvZgorICAgICAgICAgIHRoZSBtYXJzaGFsaW5nIGNvZGUsIEQtQnVzIGlzIHNsb3dlciB0aGFuIHRoYXQgYmVjYXVzZSBhIGxvdCBvZgorICAgICAgICAgIG9wdGltaXphdGlvbiB3b3JrIHdhcyBsb3N0LiBCdXQgaXQgY2FuIHByb2JhYmx5IGJlIHNwZWQgdXAgYWdhaW4uCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgRC1CdXMgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSBpbnRlcm1lZGlhdGUgYnVzIGRhZW1vbiBzaG91bGQgYmUgCisgICAgICAgICAgKGFuZCBhcyBsYXN0IHByb2ZpbGVkLCB3YXMpIGFib3V0IHR3aWNlIGFzIHNsb3cgYXMgb25lLXRvLW9uZSAKKyAgICAgICAgICBtb2RlLCBiZWNhdXNlIGEgcm91bmQgdHJpcCBpbnZvbHZlcyBmb3VyIHNvY2tldCByZWFkcy93cml0ZXMgcmF0aGVyIAorICAgICAgICAgIHRoYW4gdHdvIHNvY2tldCByZWFkcy93cml0ZXMuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgVGhlIG92ZXJoZWFkIGNvbWVzIGZyb20gYSBjb3VwbGUgb2YgcGxhY2VzOyBwYXJ0IG9mIGl0IGlzIHNpbXBseSAKKyAgICAgICAgICAiYWJzdHJhY3Rpb24gcGVuYWx0eSIgKHRoZXJlIGFyZSBsYXllcnMgb2YgY29kZSB0byBzdXBwb3J0IAorICAgICAgICAgIG11bHRpcGxlIG1haW4gbG9vcHMsIG11bHRpcGxlIHRyYW5zcG9ydCB0eXBlcywgc2VjdXJpdHksIGV0Yy4pLgorICAgICAgICAgIFByb2JhYmx5IHRoZSBsYXJnZXN0IHBhcnQgY29tZXMgZnJvbSBkYXRhIHZhbGlkYXRpb24KKyAgICAgICAgICAoYmVjYXVzZSB0aGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IHRydXN0IGluY29taW5nIGRhdGEpLgorICAgICAgICAgIEl0IHdvdWxkIGJlIHNpbXBsZSB0byBhZGQgYSAibm8gdmFsaWRhdGlvbiIgbW9kZSwgYnV0IHByb2JhYmx5IAorICAgICAgICAgIG5vdCBhIGdvb2QgaWRlYSBhbGwgdGhpbmdzIGNvbnNpZGVyZWQuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgUmF3IGJhbmR3aWR0aCBpc24ndCB0aGUgb25seSBjb25jZXJuOyBELUJ1cyBpcyBkZXNpZ25lZCB0byAKKyAgICAgICAgICBlbmFibGUgYXN5bmNocm9ub3VzIGNvbW11bmljYXRpb24gYW5kIGF2b2lkIHJvdW5kIHRyaXBzLgorICAgICAgICAgIFRoaXMgaXMgZnJlcXVlbnRseSBhIG1vcmUgaW1wb3J0YW50IHBlcmZvcm1hbmNlIGlzc3VlIAorICAgICAgICAgIHRoYW4gdGhyb3VnaHB1dC4KKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9hbnN3ZXI+CisgICAgPC9xYW5kYWVudHJ5PgorCisKKyAgICA8cWFuZGFlbnRyeSBpZD0ic2l6ZSI+CisgICAgICA8cXVlc3Rpb24+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEhvdyBsYXJnZSBpcyB0aGUgRC1CdXMgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uPworICAgICAgICA8L3BhcmE+CisgICAgICA8L3F1ZXN0aW9uPgorICAgICAgPGFuc3dlcj4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgQSBwcm9kdWN0aW9uIGJ1aWxkICh3aXRoIGFzc2VydGlvbnMsIHVuaXQgdGVzdHMsIGFuZCB2ZXJib3NlIGxvZ2dpbmcKKyAgICAgICAgICBkaXNhYmxlZCkgaXMgb24gdGhlIG9yZGVyIG9mIGEgMTUwSyBzaGFyZWQgbGlicmFyeS4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBBIG11Y2gsIG11Y2ggc21hbGxlciBpbXBsZW1lbnRhdGlvbiB3b3VsZCBiZSBwb3NzaWJsZSBieSBvbWl0dGluZyBvdXQKKyAgICAgICAgICBvZiBtZW1vcnkgaGFuZGxpbmcsIGhhcmRjb2RpbmcgYSBtYWluIGxvb3AgKG9yIGFsd2F5cyB1c2luZyBibG9ja2luZworICAgICAgICAgIEkvTyksIHNraXBwaW5nIHZhbGlkYXRpb24sIGFuZCBvdGhlcndpc2Ugc2ltcGxpZnlpbmcgdGhpbmdzLgorICAgICAgICA8L3BhcmE+CisgICAgICA8L2Fuc3dlcj4KKyAgICA8L3FhbmRhZW50cnk+CisgICAgCisgICAgPHFhbmRhZW50cnkgaWQ9Im90aGVyLWlwYyI+CisgICAgICA8cXVlc3Rpb24+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEhvdyBkb2VzIEQtQnVzIGRpZmZlciBmcm9tIG90aGVyIGludGVycHJvY2VzcyBjb21tdW5pY2F0aW9uCisgICAgICAgICAgb3IgbmV0d29ya2luZyBwcm90b2NvbHM/CisgICAgICAgIDwvcGFyYT4KKyAgICAgIDwvcXVlc3Rpb24+CisgICAgICA8YW5zd2VyPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBLZWVwIGluIG1pbmQsIGl0IGlzIG5vdCBvbmx5IGFuIElQQyBzeXN0ZW07IGl0IGFsc28gaW5jbHVkZXMKKyAgICAgICAgICBsaWZlY3ljbGUgdHJhY2tpbmcsIHNlcnZpY2UgYWN0aXZhdGlvbiwgc2VjdXJpdHkgcG9saWN5LCBhbmQgb3RoZXIKKyAgICAgICAgICBoaWdoZXItbGV2ZWwgc3RydWN0dXJlIGFuZCBhc3N1bXB0aW9ucy4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBUaGUgYmVzdCBwbGFjZSB0byBzdGFydCBpcyB0byByZWFkIHRoZSBELUJ1cyA8dWxpbmsgdXJsPSJkYnVzLXR1dG9yaWFsLmh0bWwiPnR1dG9yaWFsPC91bGluaz4sIHNvIAorICAgICAgICAgIHlvdSBoYXZlIGEgY29uY3JldGUgaWRlYSB3aGF0IEQtQnVzIGFjdHVhbGx5IGlzLiBJZiB5b3UgCisgICAgICAgICAgdW5kZXJzdGFuZCBvdGhlciBwcm90b2NvbHMgb24gYSB3aXJlIGZvcm1hdCBsZXZlbCwgeW91IAorICAgICAgICAgIG1heSBhbHNvIHdhbnQgdG8gcmVhZCB0aGUgRC1CdXMgPHVsaW5rIHVybD0iZGJ1cy1zcGVjaWZpY2F0aW9uLmh0bWwiPnNwZWNpZmljYXRpb248L3VsaW5rPiB0byBzZWUgd2hhdCAKKyAgICAgICAgICBELUJ1cyBsb29rcyBsaWtlIG9uIGEgbG93IGxldmVsLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEFzIHRoZSA8dWxpbmsgdXJsPSJkYnVzLXR1dG9yaWFsLmh0bWwiPnR1dG9yaWFsPC91bGluaz4gYW5kIDx1bGluayB1cmw9ImRidXMtc3BlY2lmaWNhdGlvbi5odG1sIj5zcGVjaWZpY2F0aW9uPC91bGluaz4gYm90aCBleHBsYWluLCBELUJ1cyBpcyB0dW5lZCAKKyAgICAgICAgICBmb3Igc29tZSBzcGVjaWZpYyB1c2UgY2FzZXMuIFRodXMsIGl0IHByb2JhYmx5IGlzbid0IHR1bmVkIAorICAgICAgICAgIGZvciB3aGF0IHlvdSB3YW50IHRvIGRvLCB1bmxlc3MgeW91IGFyZSBkb2luZyB0aGUgdGhpbmdzIAorICAgICAgICAgIEQtQnVzIHdhcyBkZXNpZ25lZCBmb3IuIERvbid0IG1ha2UgdGhlIG1pc3Rha2Ugb2YgdGhpbmtpbmcgCisgICAgICAgICAgdGhhdCBhbnkgc3lzdGVtIGludm9sdmluZyAiSVBDIiBpcyB0aGUgc2FtZSB0aGluZy4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBUaGUgRC1CdXMgYXV0aG9ycyB3b3VsZCBub3QgcmVjb21tZW5kIHVzaW5nIEQtQnVzIAorICAgICAgICAgIGZvciBhcHBsaWNhdGlvbnMgd2hlcmUgaXQgZG9lc24ndCBtYWtlIHNlbnNlLgorICAgICAgICAgIFRoZSBmb2xsb3dpbmcgcXVlc3Rpb25zIGNvbXBhcmUgRC1CdXMgdG8gc29tZSBvdGhlciAKKyAgICAgICAgICBwcm90b2NvbHMgcHJpbWFyaWx5IHRvIGhlbHAgeW91IHVuZGVyc3RhbmQgRC1CdXMgCisgICAgICAgICAgYW5kIGRlY2lkZSB3aGV0aGVyIGl0J3MgYXBwcm9wcmlhdGU7IEQtQnVzIGlzIG5laXRoZXIgaW50ZW5kZWQKKyAgICAgICAgICBub3IgY2xhaW1lZCB0byBiZSB0aGUgcmlnaHQgY2hvaWNlIGZvciBldmVyeSBhcHBsaWNhdGlvbi4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBJdCBzaG91bGQgYmUgcG9zc2libGUgdG8gYnJpZGdlIEQtQnVzIHRvIG90aGVyIElQQyBzeXN0ZW1zLCAKKyAgICAgICAgICBqdXN0IGFzIEQtQnVzIGNhbiBiZSBicmlkZ2VkIHRvIG9iamVjdCBzeXN0ZW1zLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIE5vdGU6IHRoZSBELUJ1cyBtYWlsaW5nIGxpc3Qgc3Vic2NyaWJlcnMgYXJlIDxlbXBoYXNpcz52ZXJ5IG11Y2ggbm90CisgICAgICAgICAgaW50ZXJlc3RlZDwvZW1waGFzaXM+IGluIGRlYmF0aW5nIHdoaWNoIElQQyBzeXN0ZW0gaXMgdGhlIE9uZSBUcnVlCisgICAgICAgICAgU3lzdGVtLiBTbyBpZiB5b3Ugd2FudCB0byBkaXNjdXNzIHRoYXQsIHBsZWFzZSB1c2UgYW5vdGhlciBmb3J1bS4KKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9hbnN3ZXI+ICAgICAgCisgICAgPC9xYW5kYWVudHJ5PgorCisgICAgCisgICAgPHFhbmRhZW50cnkgaWQ9ImNvcmJhIj4KKyAgICAgIDxxdWVzdGlvbj4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgSG93IGRvZXMgRC1CdXMgZGlmZmVyIGZyb20gQ09SQkE/CisgICAgICAgIDwvcGFyYT4KKyAgICAgIDwvcXVlc3Rpb24+CisgICAgICA8YW5zd2VyPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBTdGFydCBieSByZWFkaW5nIDx4cmVmIGxpbmtlbmQ9Im90aGVyLWlwYyIvPi4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICA8dWxpbmsgdXJsPSJodHRwOi8vd3d3Lm9tZy5vcmciPkNPUkJBPC91bGluaz4gaXMgZGVzaWduZWQgdG8gc3VwcG9ydAorICAgICAgICAgb2JqZWN0LW9yaWVudGVkIElQQyBiZXR3ZWVuIG9iamVjdHMsIGF1dG9tYXRpY2FsbHkgbWFyc2hhbGxpbmcKKyAgICAgICAgIHBhcmFtZXRlcnMgYXMgbmVjZXNzYXJ5LiBDT1JCQSBpcyBzdHJvbmdseSBzdXBwb3J0ZWQgYnkgdGhlIDx1bGluaworICAgICAgICAgdXJsPSJodHRwOi8vd3d3Lm9tZy5vcmciPk9wZW4gTWFuYWdlbWVudCBHcm91cCAoT01HKTwvdWxpbms+LCB3aGljaAorICAgICAgICAgcHJvZHVjZXMgdmFyaW91cyBzdGFuZGFyZHMgYW5kIHN1cHBvcnRpbmcgZG9jdW1lbnRzIGZvciBDT1JCQSBhbmQgaGFzCisgICAgICAgICB0aGUgYmFja2luZyBvZiBtYW55IGxhcmdlIG9yZ2FuaXphdGlvbnMuICBUaGVyZSBhcmUgbWFueSBDT1JCQSBPUkJzCisgICAgICAgICBhdmFpbGFibGUsIGJvdGggcHJvcHJpZXRhcnkgT1JCcyBhbmQgZnJlZSAvIG9wZW4gc291cmNlIHNvZnR3YXJlIE9SQnMKKyAgICAgICAgICh0aGUgbGF0dGVyIGluY2x1ZGUgPHVsaW5rCisgICAgICAgICB1cmw9Imh0dHA6Ly9vcmJpdC1yZXNvdXJjZS5zb3VyY2Vmb3JnZS5uZXQvIj5PUkJpdDwvdWxpbms+LCA8dWxpbmsKKyAgICAgICAgIHVybD0iaHR0cDovL3d3dy5taWNvLm9yZy8iPk1JQ088L3VsaW5rPiwgYW5kIDx1bGluaworICAgICAgICAgdXJsPSJodHRwOi8vd3d3LnRoZWFjZW9yYi5jb20vIj5UaGUgQUNFIE9yYiAoVEFPKTwvdWxpbms+KS4gIE1hbnkKKyAgICAgICAgIG9yZ2FuaXphdGlvbnMgY29udGludWUgdG8gdXNlIENPUkJBIE9SQnMgZm9yIHZhcmlvdXMga2luZHMgb2YgSVBDLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEJvdGggR05PTUUgYW5kIEtERSBoYXZlIHVzZWQgQ09SQkEgYW5kIHRoZW4gbW92ZWQgYXdheSBmcm9tIGl0LiAgS0RFCisgICAgICAgICAgaGFkIG1vcmUgc3VjY2VzcyB3aXRoIGEgc3lzdGVtIGNhbGxlZCBEQ09QLCBhbmQgR05PTUUgbGF5ZXJlZCBhIHN5c3RlbQorICAgICAgICAgIGNhbGxlZCBCb25vYm8gb24gdG9wIG9mIENPUkJBLiBXaXRob3V0IGN1c3RvbSBleHRlbnNpb25zLCBDT1JCQSBkb2VzCisgICAgICAgICAgbm90IHN1cHBvcnQgbWFueSBvZiB0aGUgdGhpbmdzIG9uZSB3YW50cyB0byBkbyBpbiBhIGRlc2t0b3AKKyAgICAgICAgICBlbnZpcm9ubWVudCB3aXRoIHRoZSBHTk9NRS9LREUgYXJjaGl0ZWN0dXJlLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIENPUkJBIG9uIHRoZSBvdGhlciBoYW5kIGhhcyBhIG51bWJlciBvZiBmZWF0dXJlcyBvZiBpbnRlcmVzdCBmb3IKKyAgICAgICAgICBlbnRlcnByaXNlIGFuZCB3ZWIgYXBwbGljYXRpb24gZGV2ZWxvcG1lbnQsIHRob3VnaCBYTUwgc3lzdGVtcyBzdWNoIGFzCisgICAgICAgICAgU09BUCBhcmUgdGhlIGxhdGVzdCBmYWQuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgTGlrZSBELUJ1cywgQ09SQkEgdXNlcyBhIGZhc3QgYmluYXJ5IHByb3RvY29sIChJSU9QKS4gQm90aCBzeXN0ZW1zCisgICAgICAgICAgd29yayBpbiB0ZXJtcyBvZiBvYmplY3RzIGFuZCBtZXRob2RzLCBhbmQgaGF2ZSBjb25jZXB0cyBzdWNoIGFzCisgICAgICAgICAgIm9uZXdheSIgY2FsbHMuIE9ubHkgRC1CdXMgaGFzIGRpcmVjdCBzdXBwb3J0IGZvciAic2lnbmFscyIgYXMgaW4KKyAgICAgICAgICBHTGliL1F0IChvciBKYXZhIGxpc3RlbmVycywgb3IgQyMgZGVsZWdhdGVzKS4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBELUJ1cyBoYXJkY29kZXMgYW5kIHNwZWNpZmllcyBhIGxvdCBvZiB0aGluZ3MgdGhhdCBDT1JCQSBsZWF2ZXMgb3Blbi1lbmRlZCwKKyAgICAgICAgICBiZWNhdXNlIENPUkJBIGlzIG1vcmUgZ2VuZXJpYyBhbmQgRC1CdXMgaGFzIHR3byBzcGVjaWZpYyB1c2UtY2FzZXMgaW4gbWluZC4KKyAgICAgICAgICBUaGlzIG1ha2VzIEQtQnVzIGEgYml0IHNpbXBsZXIuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgSG93ZXZlciwgdW5saWtlIENPUkJBIEQtQnVzIGRvZXMgPGVtcGhhc2lzPm5vdDwvZW1waGFzaXM+IHNwZWNpZnkgdGhlCisgICAgICAgICAgQVBJIGZvciB0aGUgbGFuZ3VhZ2UgYmluZGluZ3MuIEluc3RlYWQsICJuYXRpdmUiIGJpbmRpbmdzIGFkYXB0ZWQKKyAgICAgICAgICBzcGVjaWZpY2FsbHkgdG8gdGhlIGNvbnZlbnRpb25zIG9mIGEgZnJhbWV3b3JrIHN1Y2ggYXMgUU9iamVjdCwKKyAgICAgICAgICBHT2JqZWN0LCBDIywgSmF2YSwgUHl0aG9uLCBldGMuIGFyZSBlbmNvdXJhZ2VkLiBUaGUgbGliZGJ1cyByZWZlcmVuY2UKKyAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBpcyBkZXNpZ25lZCB0byBiZSBhIGJhY2tlbmQgZm9yIGJpbmRpbmdzIG9mIHRoaXMKKyAgICAgICAgICBuYXR1cmUsIHJhdGhlciB0aGFuIHRvIGJlIHVzZWQgZGlyZWN0bHkuIFRoZSByYXRpb25hbGUgaXMgdGhhdCBhbiBJUEMKKyAgICAgICAgICBzeXN0ZW0gQVBJIHNob3VsZCBub3QgImxlYWsiIGFsbCBvdmVyIGEgcHJvZ3JhbTsgaXQgc2hvdWxkIGNvbWUgaW50bworICAgICAgICAgIHBsYXkgb25seSBqdXN0IGJlZm9yZSBkYXRhIGdvZXMgb3ZlciB0aGUgd2lyZS4gQXMgYW4gYXNpZGUsIE9NRyBpcworICAgICAgICAgIGFwcGFyZW50bHkgd29ya2luZyBvbiBhIHNpbXBsZXIgQysrIGJpbmRpbmcgZm9yIENPUkJBLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIE1hbnkgQ09SQkEgaW1wbGVtZW50YXRpb25zIHN1Y2ggYXMgT1JCaXQgYXJlIGZhc3RlciB0aGFuIHRoZSBsaWJkYnVzCisgICAgICAgICAgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uLiAgT25lIHJlYXNvbiBpcyB0aGF0IEQtQnVzIGNvbnNpZGVycyBkYXRhCisgICAgICAgICAgZnJvbSB0aGUgb3RoZXIgZW5kIG9mIHRoZSBjb25uZWN0aW9uIHRvIGJlIHVudHJ1c3RlZCBhbmQgZXh0ZW5zaXZlbHkKKyAgICAgICAgICB2YWxpZGF0ZXMgaXQuIEJ1dCBnZW5lcmFsbHkgc3BlYWtpbmcgb3RoZXIgcHJpb3JpdGllcyB3ZXJlIHBsYWNlZAorICAgICAgICAgIGFoZWFkIG9mIHJhdyBzcGVlZCBpbiB0aGUgbGliZGJ1cyBpbXBsZW1lbnRhdGlvbi4gQSBmYXN0IEQtQnVzCisgICAgICAgICAgaW1wbGVtZW50YXRpb24gYWxvbmcgdGhlIGxpbmVzIG9mIE9SQml0IHNob3VsZCBiZSBwb3NzaWJsZSwgb2YgY291cnNlLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIE9uIGEgbW9yZSB0cml2aWFsIG5vdGUsIEQtQnVzIGludm9sdmVzIHN1YnN0YW50aWFsbHkgZmV3ZXIgYWNyb255bXMKKyAgICAgICAgICB0aGFuIENPUkJBLgorICAgICAgICA8L3BhcmE+CisgICAgICA8L2Fuc3dlcj4KKyAgICA8L3FhbmRhZW50cnk+CisKKworICAgIDxxYW5kYWVudHJ5IGlkPSJ4bWxycGNzb2FwIj4KKyAgICAgIDxxdWVzdGlvbj4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgSG93IGRvZXMgRC1CdXMgZGlmZmVyIGZyb20gWE1MLVJQQyBhbmQgU09BUD8KKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9xdWVzdGlvbj4KKyAgICAgIDxhbnN3ZXI+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIFN0YXJ0IGJ5IHJlYWRpbmcgPHhyZWYgbGlua2VuZD0ib3RoZXItaXBjIi8+LgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEluIDx1bGluayB1cmw9Imh0dHA6Ly93d3cudzMub3JnL1RSL1NPQVAvIj5TT0FQPC91bGluaz4gYW5kIDx1bGluaworICAgICAgICAgICAgdXJsPSJodHRwOi8vd3d3LnhtbHJwYy5jb20iPlhNTC1SUEM8L3VsaW5rPiwgUlBDIGNhbGxzIGFyZSB0cmFuc2Zvcm1lZAorICAgICAgICAgIGludG8gYW4gWE1MLWJhc2VkIGZvcm1hdCwgdGhlbiBzZW50IG92ZXIgdGhlIHdpcmUgKHR5cGljYWxseSB1c2luZyB0aGUKKyAgICAgICAgICBIVFRQIHByb3RvY29sKSwgd2hlcmUgdGhleSBhcmUgcHJvY2Vzc2VkIGFuZCByZXR1cm5lZC4gIFhNTC1SUEMgaXMgdGhlCisgICAgICAgICAgc2ltcGxlIHByb3RvY29sIChpdHMgc3BlYyBpcyBvbmx5IGEgcGFnZSBvciB0d28pLCBhbmQgU09BUCBpcyB0aGUKKyAgICAgICAgICBmdWxsLWZlYXR1cmVkIHByb3RvY29sLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIFhNTC1SUEMgYW5kIFNPQVAgaW1wb3NlIFhNTCBwYXJzaW5nIG92ZXJoZWFkIHRoYXQgaXMgbm9ybWFsbHkKKyAgICAgICAgICBpcnJlbGV2YW50IGluIHRoZSBjb250ZXh0IG9mIHRoZSBJbnRlcm5ldCwgYnV0IHNpZ25pZmljYW50IGZvcgorICAgICAgICAgIGNvbnN0YW50IGZpbmUtZ3JhaW5lZCBJUEMgYW1vbmcgYXBwbGljYXRpb25zIGluIGEgZGVza3RvcCBzZXNzaW9uLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEQtQnVzIG9mZmVycyBwZXJzaXN0ZW50IGNvbm5lY3Rpb25zIGFuZCB3aXRoIHRoZSBidXMgZGFlbW9uIAorICAgICAgICAgIHN1cHBvcnRzIGxpZmVjeWNsZSB0cmFja2luZyBvZiBvdGhlciBhcHBsaWNhdGlvbnMgY29ubmVjdGVkCisgICAgICAgICAgdG8gdGhlIGJ1cy4gV2l0aCBYTUwtUlBDIGFuZCBTT0FQLCB0eXBpY2FsbHkgZWFjaCBtZXRob2QgY2FsbCAKKyAgICAgICAgICBleGlzdHMgaW4gaXNvbGF0aW9uIGFuZCBoYXMgaXRzIG93biBIVFRQIGNvbm5lY3Rpb24uCisgICAgICAgIDwvcGFyYT4KKyAgICAgIDwvYW5zd2VyPgorICAgIDwvcWFuZGFlbnRyeT4KKworICAgIDxxYW5kYWVudHJ5IGlkPSJkY2UiPgorICAgICAgPHF1ZXN0aW9uPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBIb3cgZG9lcyBELUJ1cyBkaWZmZXIgZnJvbSBEQ0U/CisgICAgICAgIDwvcGFyYT4KKyAgICAgIDwvcXVlc3Rpb24+CisgICAgICA8YW5zd2VyPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBTdGFydCBieSByZWFkaW5nIDx4cmVmIGxpbmtlbmQ9Im90aGVyLWlwYyIvPi4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICA8dWxpbmsgdXJsPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvZGNlLyI+RGlzdHJpYnV0ZWQgQ29tcHV0aW5nCisgICAgICAgICAgRW52aXJvbm1lbnQgKERDRSk8L3VsaW5rPiBpcyBhbiBpbmR1c3RyeS1zdGFuZGFyZCB2ZW5kb3ItbmV1dHJhbAorICAgICAgICAgIHN0YW5kYXJkIHRoYXQgaW5jbHVkZXMgYW4gSVBDIG1lY2hhbmlzbS4gIDx1bGluaworICAgICAgICAgIHVybD0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL2NvbW0vcHJlc3MvMDUtMDEtMTIuaHRtIj5UaGUgT3BlbiBHcm91cAorICAgICAgICAgIGhhcyByZWxlYXNlZCBhbiBpbXBsZW1lbnRhdGlvbiBhcyBvcGVuIHNvdXJjZSBzb2Z0d2FyZTwvdWxpbms+LiAgRENFCisgICAgICAgICAgaXMgcXVpdGUgY2FwYWJsZSwgYW5kIGluY2x1ZGVzIGEgdmFzdCBhbW91bnQgb2YgZnVuY3Rpb25hbGl0eSBzdWNoIGFzCisgICAgICAgICAgYSBkaXN0cmlidXRlZCB0aW1lIHNlcnZpY2UuICBBcyB0aGUgbmFtZSBpbXBsaWVzLCBEQ0UgaXMgaW50ZW5kZWQgZm9yCisgICAgICAgICAgdXNlIGluIGEgbGFyZ2UsIG11bHRpLWNvbXB1dGVyIGRpc3RyaWJ1dGVkIGFwcGxpY2F0aW9uLiBELUJ1cyB3b3VsZAorICAgICAgICAgIG5vdCBiZSB3ZWxsLXN1aXRlZCBmb3IgdGhpcy4KKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9hbnN3ZXI+CisgICAgPC9xYW5kYWVudHJ5PiAgICAKKworCisgICAgPHFhbmRhZW50cnkgaWQ9ImRjb20iPgorICAgICAgPHF1ZXN0aW9uPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBIb3cgZG9lcyBELUJ1cyBkaWZmZXIgZnJvbSBEQ09NIGFuZCBDT00/CisgICAgICAgIDwvcGFyYT4KKyAgICAgIDwvcXVlc3Rpb24+CisgICAgICA8YW5zd2VyPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBTdGFydCBieSByZWFkaW5nIDx4cmVmIGxpbmtlbmQ9Im90aGVyLWlwYyIvPi4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBDb21wYXJpbmcgRC1CdXMgdG8gQ09NIGlzIGFwcGxlcyBhbmQgb3JhbmdlczsgCisgICAgICAgICAgc2VlIDx4cmVmIGxpbmtlbmQ9ImNvbXBvbmVudHMiLz4uCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgRENPTSAoZGlzdHJpYnV0ZWQgQ09NKSBpcyBhIFdpbmRvd3MgSVBDIHN5c3RlbSBkZXNpZ25lZCBmb3IgdXNlIHdpdGgKKyAgICAgICAgICB0aGUgQ09NIG9iamVjdCBzeXN0ZW0uIEl0J3Mgc2ltaWxhciBpbiBzb21lIHdheXMgdG8gRENFIGFuZCBDT1JCQS4KKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9hbnN3ZXI+CisgICAgPC9xYW5kYWVudHJ5PiAgICAKKworICAgIDxxYW5kYWVudHJ5IGlkPSJpbnRlcm5ldC1jb21tdW5pY2F0aW9ucy1lbmdpbmUiPgorICAgICAgPHF1ZXN0aW9uPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBIb3cgZG9lcyBELUJ1cyBkaWZmZXIgZnJvbSBaZXJvQydzIEludGVybmV0IENvbW11bmljYXRpb25zIEVuZ2luZSAoSWNlKQorICAgICAgICA8L3BhcmE+CisgICAgICA8L3F1ZXN0aW9uPgorICAgICAgPGFuc3dlcj4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgU3RhcnQgYnkgcmVhZGluZyA8eHJlZiBsaW5rZW5kPSJvdGhlci1pcGMiLz4uCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgVGhlIDx1bGluayB1cmw9Imh0dHA6Ly93d3cuemVyb2MuY29tL2ljZS5odG1sIj4gSW50ZXJuZXQKKyAgICAgICAgICBDb21tdW5pY2F0aW9ucyBFbmdpbmUgKEljZSk8L3VsaW5rPiBpcyBhIHBvd2VyZnVsIElQQyBtZWNoYW5pc20gbW9yZQorICAgICAgICAgIG9uIHRoZSBsZXZlbCBvZiBTT0FQIG9yIENPUkJBIHRoYW4gRC1CdXMuICBJY2UgaGFzIGEgImR1YWwtbGljZW5zZSIKKyAgICAgICAgICBidXNpbmVzcyBhcm91bmQgaXQ7IGkuZS4geW91IGNhbiB1c2UgaXQgdW5kZXIgdGhlIEdQTCwgb3IgcGF5IGZvciBhCisgICAgICAgICAgcHJvcHJpZXRhcnkgbGljZW5zZS4KKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9hbnN3ZXI+CisgICAgPC9xYW5kYWVudHJ5PiAgICAKKworICAgIDxxYW5kYWVudHJ5IGlkPSJpbnRlci1jbGllbnQtZXhjaGFuZ2UiPgorICAgICAgPHF1ZXN0aW9uPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBIb3cgZG9lcyBELUJ1cyBkaWZmZXIgZnJvbSBJbnRlci1DbGllbnQgRXhjaGFuZ2UgKElDRSk/CisgICAgICAgIDwvcGFyYT4KKyAgICAgIDwvcXVlc3Rpb24+CisgICAgICA8YW5zd2VyPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICA8dWxpbmsgdXJsPSJodHRwOi8vd3d3Lngub3JnL1gxMVI2LjguMS9kb2NzL0lDRS9pY2UucGRmIj5JQ0U8L3VsaW5rPgorICAgICAgICAgIHdhcyBkZXZlbG9wZWQgZm9yIHRoZSBYIFNlc3Npb24gTWFuYWdlbWVudCBwcm90b2NvbCAoWFNNUCksIGFzIHBhcnQgb2YKKyAgICAgICAgICB0aGUgWCBXaW5kb3cgU3lzdGVtIChYMTFSNi4xKS4gVGhlIGlkZWEgd2FzIHRvIGFsbG93IGRlc2t0b3Agc2Vzc2lvbnMKKyAgICAgICAgICB0byBjb250YWluIG5vbmdyYXBoaWNhbCBjbGllbnRzIGluIGFkZGl0aW9uIHRvIFggY2xpZW50cy4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBJQ0UgaXMgYSBiaW5hcnkgcHJvdG9jb2wgZGVzaWduZWQgZm9yIGRlc2t0b3AgdXNlLCBhbmQgS0RFJ3MgRENPUAorICAgICAgICAgIGJ1aWxkcyBvbiBJQ0UuICBJQ0UgaXMgc3Vic3RhbnRpYWxseSBzaW1wbGVyIHRoYW4gRC1CdXMgKGluIGNvbnRyYXN0CisgICAgICAgICAgdG8gbW9zdCBvZiB0aGUgb3RoZXIgSVBDIHN5c3RlbXMgbWVudGlvbmVkIGhlcmUsIHdoaWNoIGFyZSBtb3JlCisgICAgICAgICAgY29tcGxleCkuIElDRSBkb2Vzbid0IHJlYWxseSBkZWZpbmUgYSBtYXBwaW5nIHRvIG9iamVjdHMgYW5kIG1ldGhvZHMKKyAgICAgICAgICAoRENPUCBhZGRzIHRoYXQgbGF5ZXIpLiAgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBvZiBJQ0UgKGxpYklDRSkKKyAgICAgICAgICBpcyBvZnRlbiBjb25zaWRlcmVkIHRvIGJlIGhvcnJpYmxlIChhbmQgaG9ycmlibHkgaW5zZWN1cmUpLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIERDT1AgYW5kIFhTTVAgYXJlIHRoZSBvbmx5IHR3byB3aWRlbHktdXNlZCBhcHBsaWNhdGlvbnMgb2YgSUNFLAorICAgICAgICAgIGFuZCBib3RoIGNvdWxkIGluIHByaW5jaXBsZSBiZSByZXBsYWNlZCBieSBELUJ1cy4gKFRob3VnaCB3aGV0aGVyIAorICAgICAgICAgIEdOT01FIGFuZCBLREUgd2lsbCBib3RoZXIgaXMgYW4gb3BlbiBxdWVzdGlvbi4pCisgICAgICAgIDwvcGFyYT4KKyAgICAgIDwvYW5zd2VyPgorICAgIDwvcWFuZGFlbnRyeT4KKworICAgIAorCisgICAgPHFhbmRhZW50cnkgaWQ9ImRjb3AiPgorICAgICAgPHF1ZXN0aW9uPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBIb3cgZG9lcyBELUJ1cyBkaWZmZXIgZnJvbSBEQ09QPworICAgICAgICA8L3BhcmE+CisgICAgICA8L3F1ZXN0aW9uPgorICAgICAgPGFuc3dlcj4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgU3RhcnQgYnkgcmVhZGluZyA8eHJlZiBsaW5rZW5kPSJvdGhlci1pcGMiLz4uCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgRC1CdXMgaXMgaW50ZW50aW9uYWxseSBwcmV0dHkgc2ltaWxhciB0byA8dWxpbmsKKyAgICAgICAgICB1cmw9Imh0dHA6Ly9kZXZlbG9wZXIua2RlLm9yZy9kb2N1bWVudGF0aW9uL2xpYnJhcnkva2RlcXQvZGNvcC5odG1sIj5EQ09QPC91bGluaz4sCisgICAgICAgICAgYW5kIGNhbiBiZSB0aG91Z2h0IG9mIGFzIGEgIkRDT1AgdGhlIG5leHQgZ2VuZXJhdGlvbiIgc3VpdGFibGUgZm9yIAorICAgICAgICAgIHNoYXJpbmcgYmV0d2VlbiB0aGUgdmFyaW91cyBvcGVuIHNvdXJjZSBkZXNrdG9wIHByb2plY3RzLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEQtQnVzIGlzIGEgYml0IG1vcmUgY29tcGxleCB0aGFuIERDT1AsIHRob3VnaCB0aGUgUXQgYmluZGluZyBmb3IgRC1CdXMKKyAgICAgICAgICBzaG91bGQgbm90IGJlIG1vcmUgY29tcGxleCBmb3IgcHJvZ3JhbW1lcnMuIFRoZSBhZGRpdGlvbmFsIGNvbXBsZXhpdHkKKyAgICAgICAgICBvZiBELUJ1cyBhcmlzZXMgZnJvbSBpdHMgc2VwYXJhdGlvbiBvZiBvYmplY3QgcmVmZXJlbmNlcyB2cy4gYnVzIG5hbWVzCisgICAgICAgICAgdnMuIGludGVyZmFjZXMgYXMgZGlzdGluY3QgY29uY2VwdHMsIGFuZCBpdHMgc3VwcG9ydCBmb3Igb25lLXRvLW9uZQorICAgICAgICAgIGNvbm5lY3Rpb25zIGluIGFkZGl0aW9uIHRvIGNvbm5lY3Rpb25zIG92ZXIgdGhlIGJ1cy4gVGhlIGxpYmRidXMKKyAgICAgICAgICByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIGEgbG90IG9mIEFQSSB0byBzdXBwb3J0IG11bHRpcGxlIGJpbmRpbmdzCisgICAgICAgICAgYW5kIG1haW4gbG9vcHMsIGFuZCBwZXJmb3JtcyBkYXRhIHZhbGlkYXRpb24gYW5kIG91dC1vZi1tZW1vcnkgaGFuZGxpbmcgCisgICAgICAgICAgaW4gb3JkZXIgdG8gc3VwcG9ydCBzZWN1cmUgYXBwbGljYXRpb25zIHN1Y2ggYXMgdGhlIHN5c3RlbXdpZGUgYnVzLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEQtQnVzIGlzIHByb2JhYmx5IHNvbWV3aGF0IHNsb3dlciB0aGFuIERDT1AgZHVlIHRvIGRhdGEgdmFsaWRhdGlvbiAKKyAgICAgICAgICBhbmQgbW9yZSAibGF5ZXJzIiBpbiB0aGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uLiBBIGNvbXBhcmlzb24gCisgICAgICAgICAgaGFzbid0IGJlZW4gcG9zdGVkIHRvIHRoZSBsaXN0IHRob3VnaC4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBBdCB0aGlzIHRpbWUsIEtERSBoYXMgbm90IGNvbW1pdHRlZCB0byB1c2luZyBELUJ1cywgYnV0IHRoZXJlIGhhdmUKKyAgICAgICAgICBiZWVuIGRpc2N1c3Npb25zIG9mIEtERSBicmlkZ2luZyBELUJ1cyBhbmQgRENPUCwgb3IgZXZlbiBjaGFuZ2luZworICAgICAgICAgIERDT1AncyBpbXBsZW1lbnRhdGlvbiB0byB1c2UgRC1CdXMgaW50ZXJuYWxseSAoc28gdGhhdCBHTk9NRSBhbmQgS0RFCisgICAgICAgICAgd291bGQgZW5kIHVwIHVzaW5nIGV4YWN0bHkgdGhlIHNhbWUgYnVzKS4gU2VlIHRoZSBLREUgbWFpbGluZyBsaXN0IAorICAgICAgICAgIGFyY2hpdmVzIGZvciBzb21lIG9mIHRoZXNlIGRpc2N1c3Npb25zLgorICAgICAgICA8L3BhcmE+CisgICAgICA8L2Fuc3dlcj4KKyAgICA8L3FhbmRhZW50cnk+CisKKworICAgIDxxYW5kYWVudHJ5IGlkPSJ5ZXQtbW9yZS1pcGMiPgorICAgICAgPHF1ZXN0aW9uPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBIb3cgZG9lcyBELUJ1cyBkaWZmZXIgZnJvbSBbeWV0IG1vcmUgSVBDIG1lY2hhbmlzbXNdPworICAgICAgICA8L3BhcmE+CisgICAgICA8L3F1ZXN0aW9uPgorICAgICAgPGFuc3dlcj4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgU3RhcnQgYnkgcmVhZGluZyA8eHJlZiBsaW5rZW5kPSJvdGhlci1pcGMiLz4uCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgVGhlcmUgYXJlIGNvdW50bGVzcyB1c2VzIG9mIG5ldHdvcmsgc29ja2V0cyBpbiB0aGUgd29ybGQuICA8dWxpbmsKKyAgICAgICAgICB1cmw9Imh0dHA6Ly93d3cubWJ1cy5vcmcvIj5NQlVTPC91bGluaz4sIFN1biBPTkMvUlBDLCBKYWJiZXIvWE1QUCwKKyAgICAgICAgICBTSVAsIGFyZSBzb21lIHdlIGNhbiB0aGluayBvZiBxdWlja2x5LgorICAgICAgICA8L3BhcmE+CisgICAgICA8L2Fuc3dlcj4KKyAgICA8L3FhbmRhZW50cnk+CisKKworICAgIDxxYW5kYWVudHJ5IGlkPSJ3aGljaC1pcGMiPgorICAgICAgPHF1ZXN0aW9uPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBXaGljaCBJUEMgbWVjaGFuaXNtIHNob3VsZCBJIHVzZT8KKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9xdWVzdGlvbj4KKyAgICAgIDxhbnN3ZXI+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIFN0YXJ0IGJ5IHJlYWRpbmcgPHhyZWYgbGlua2VuZD0ib3RoZXItaXBjIi8+LgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIElmIHlvdSdyZSB3cml0aW5nIGFuIEludGVybmV0IG9yIEludHJhbmV0IGFwcGxpY2F0aW9uLCBYTUwtUlBDIG9yIFNPQVAKKyAgICAgICAgICB3b3JrIGZvciBtYW55IHBlb3BsZS4gVGhlc2UgYXJlIHN0YW5kYXJkLCBhdmFpbGFibGUgZm9yIG1vc3QKKyAgICAgICAgICBsYW5ndWFnZXMsIHNpbXBsZSB0byBkZWJ1ZyBhbmQgZWFzeSB0byB1c2UuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgSWYgeW91J3JlIHdyaXRpbmcgYSBkZXNrdG9wIGFwcGxpY2F0aW9uIGZvciBVTklYLCAKKyAgICAgICAgICB0aGVuIEQtQnVzIGlzIG9mIGNvdXJzZSBvdXIgcmVjb21tZW5kYXRpb24gZm9yIAorICAgICAgICAgIHRhbGtpbmcgdG8gb3RoZXIgcGFydHMgb2YgdGhlIGRlc2t0b3Agc2Vzc2lvbi4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBELUJ1cyBpcyBhbHNvIGRlc2lnbmVkIGZvciBjb21tdW5pY2F0aW9ucyBiZXR3ZWVuIHN5c3RlbSBkYWVtb25zIGFuZAorICAgICAgICAgIGNvbW11bmljYXRpb25zIGJldHdlZW4gdGhlIGRlc2t0b3AgYW5kIHN5c3RlbSBkYWVtb25zLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIElmIHlvdSdyZSBkb2luZyBzb21ldGhpbmcgY29tcGxpY2F0ZWQgc3VjaCBhcyBjbHVzdGVyaW5nLCAKKyAgICAgICAgICBkaXN0cmlidXRlZCBzd2FybXMsIHBlZXItdG8tcGVlciwgb3Igd2hhdGV2ZXIgdGhlbiAKKyAgICAgICAgICB0aGUgYXV0aG9ycyBvZiB0aGlzIEZBUSBkb24ndCBoYXZlIGV4cGVydGlzZSBpbiB0aGVzZQorICAgICAgICAgIGFyZWFzIGFuZCB5b3Ugc2hvdWxkIGFzayBzb21lb25lIGVsc2Ugb3IgdHJ5IGEgc2VhcmNoIGVuZ2luZS4KKyAgICAgICAgICBELUJ1cyBpcyBtb3N0IGxpa2VseSBhIHBvb3IgY2hvaWNlIGJ1dCBjb3VsZCBiZSBhcHByb3ByaWF0ZQorICAgICAgICAgIGZvciBzb21lIHRoaW5ncy4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBOb3RlOiB0aGUgRC1CdXMgbWFpbGluZyBsaXN0IGlzIHByb2JhYmx5IG5vdCB0aGUgcGxhY2UgdG8gCisgICAgICAgICAgZGlzY3VzcyB3aGljaCBzeXN0ZW0gaXMgYXBwcm9wcmlhdGUgZm9yIHlvdXIgYXBwbGljYXRpb24sIAorICAgICAgICAgIHRob3VnaCB5b3UgYXJlIHdlbGNvbWUgdG8gYXNrIHNwZWNpZmljIHF1ZXN0aW9ucyBhYm91dCAKKyAgICAgICAgICBELUJ1cyA8ZW1waGFzaXM+YWZ0ZXIgcmVhZGluZyB0aGlzIEZBUSwgdGhlIHR1dG9yaWFsLCBhbmQgCisgICAgICAgICAgICBzZWFyY2hpbmcgdGhlIGxpc3QgYXJjaGl2ZXM8L2VtcGhhc2lzPi4gVGhlIGJlc3Qgd2F5IAorICAgICAgICAgIHRvIHNlYXJjaCB0aGUgbGlzdCBhcmNoaXZlcyBpcyBwcm9iYWJseSB0byB1c2UgCisgICAgICAgICAgYW4gSW50ZXJuZXQgZW5naW5lIHN1Y2ggYXMgR29vZ2xlLiBPbiBHb29nbGUsIAorICAgICAgICAgIGluY2x1ZGUgInNpdGU6ZnJlZWRlc2t0b3Aub3JnIiBpbiB5b3VyIHNlYXJjaC4KKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9hbnN3ZXI+CisgICAgPC9xYW5kYWVudHJ5PgorCisKKyAgICA8cWFuZGFlbnRyeT4KKyAgICAgIDxxdWVzdGlvbj4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgSG93IGNhbiBJIHN1Ym1pdCBhIGJ1ZyBvciBwYXRjaD8KKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9xdWVzdGlvbj4KKyAgICAgIDxhbnN3ZXI+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIFRoZSBELUJ1cyA8dWxpbmsgdXJsPSJodHRwOi8vZGJ1cy5mcmVlZGVza3RvcC5vcmciPndlYiBzaXRlPC91bGluaz4KKyAgICAgICAgICBoYXMgYSBsaW5rIHRvIHRoZSBidWcgdHJhY2tlciwgd2hpY2ggaXMgdGhlIGJlc3QgcGxhY2UgdG8gc3RvcmUKKyAgICAgICAgICBwYXRjaGVzLiAgWW91IGNhbiBhbHNvIHBvc3QgdGhlbSB0byB0aGUgbGlzdCwgZXNwZWNpYWxseSBpZiB5b3Ugd2FudAorICAgICAgICAgIHRvIGRpc2N1c3MgdGhlIHBhdGNoIG9yIGdldCBmZWVkYmFjay4KKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9hbnN3ZXI+CisgICAgPC9xYW5kYWVudHJ5PgorCisgIDwvcWFuZGFzZXQ+CisKKzwvYXJ0aWNsZT4KZGlmZiAtLWdpdCBhL2RvYy9kYnVzLWxhdW5jaC4xLnhtbC5pbiBiL2RvYy9kYnVzLWxhdW5jaC4xLnhtbC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmNlYTAzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2RidXMtbGF1bmNoLjEueG1sLmluCkBAIC0wLDAgKzEsMzA4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+Cis8IURPQ1RZUEUgcmVmZW50cnkgUFVCTElDICItLy9PQVNJUy8vRFREIERvY0Jvb2sgWE1MIFY0LjQvL0VOIgorICAgICAgICAgICAgICAgICAgICJodHRwOi8vd3d3Lm9hc2lzLW9wZW4ub3JnL2RvY2Jvb2sveG1sLzQuNC9kb2Nib29reC5kdGQiPgorPHJlZmVudHJ5IGlkPSdkYnVzbGF1bmNoMSc+CisKKzwhLS0gIGRidXMmYnNvbDstbGF1bmNoIG1hbnVhbCBwYWdlLgorIENvcHlyaWdodCAoQykgMjAwMyBSZWQgSGF0LCBJbmMuIC0tPgorCis8cmVmbWV0YT4KKzxyZWZlbnRyeXRpdGxlPmRidXMtbGF1bmNoPC9yZWZlbnRyeXRpdGxlPgorPG1hbnZvbG51bT4xPC9tYW52b2xudW0+Cis8cmVmbWlzY2luZm8gY2xhc3M9Im1hbnVhbCI+VXNlciBDb21tYW5kczwvcmVmbWlzY2luZm8+Cis8cmVmbWlzY2luZm8gY2xhc3M9InNvdXJjZSI+RC1CdXM8L3JlZm1pc2NpbmZvPgorPHJlZm1pc2NpbmZvIGNsYXNzPSJ2ZXJzaW9uIj5AREJVU19WRVJTSU9OQDwvcmVmbWlzY2luZm8+Cis8L3JlZm1ldGE+Cis8cmVmbmFtZWRpdj4KKzxyZWZuYW1lPmRidXMtbGF1bmNoPC9yZWZuYW1lPgorPHJlZnB1cnBvc2U+VXRpbGl0eSB0byBzdGFydCBhIG1lc3NhZ2UgYnVzIGZyb20gYSBzaGVsbCBzY3JpcHQ8L3JlZnB1cnBvc2U+Cis8L3JlZm5hbWVkaXY+Cis8IS0tIGJvZHkgYmVnaW5zIGhlcmUgLS0+Cis8cmVmc3lub3BzaXNkaXYgaWQ9J3N5bm9wc2lzJz4KKzxjbWRzeW5vcHNpcz4KKyAgPGNvbW1hbmQ+ZGJ1cy1sYXVuY2g8L2NvbW1hbmQ+CisgICAgPGFyZyBjaG9pY2U9J29wdCc+LS12ZXJzaW9uIDwvYXJnPgorICAgIDxhcmcgY2hvaWNlPSdvcHQnPi0taGVscCA8L2FyZz4KKyAgICA8YXJnIGNob2ljZT0nb3B0Jz4tLXNoLXN5bnRheCA8L2FyZz4KKyAgICA8YXJnIGNob2ljZT0nb3B0Jz4tLWNzaC1zeW50YXggPC9hcmc+CisgICAgPGFyZyBjaG9pY2U9J29wdCc+LS1hdXRvLXN5bnRheCA8L2FyZz4KKyAgICA8YXJnIGNob2ljZT0nb3B0Jz4tLWJpbmFyeS1zeW50YXggPC9hcmc+CisgICAgPGFyZyBjaG9pY2U9J29wdCc+LS1jbG9zZS1zdGRlcnIgPC9hcmc+CisgICAgPGFyZyBjaG9pY2U9J29wdCc+LS1leGl0LXdpdGgtc2Vzc2lvbiA8L2FyZz4KKyAgICA8YXJnIGNob2ljZT0nb3B0Jz4tLWV4aXQtd2l0aC14MTEgPC9hcmc+CisgICAgPGFyZyBjaG9pY2U9J29wdCc+LS1hdXRvbGF1bmNoPTxyZXBsYWNlYWJsZT5NQUNISU5FSUQ8L3JlcGxhY2VhYmxlPjwvYXJnPgorICAgIDxhcmcgY2hvaWNlPSdvcHQnPi0tY29uZmlnLWZpbGU9PHJlcGxhY2VhYmxlPkZJTEVOQU1FPC9yZXBsYWNlYWJsZT48L2FyZz4KKyAgICA8YXJnIGNob2ljZT0nb3B0Jz48cmVwbGFjZWFibGU+UFJPR1JBTTwvcmVwbGFjZWFibGU+PC9hcmc+CisgICAgPGFyZyBjaG9pY2U9J29wdCcgcmVwPSdyZXBlYXQnPjxyZXBsYWNlYWJsZT5BUkdTPC9yZXBsYWNlYWJsZT48L2FyZz4KKyAgICA8c2JyLz4KKzwvY21kc3lub3BzaXM+Cis8L3JlZnN5bm9wc2lzZGl2PgorCisKKzxyZWZzZWN0MSBpZD0nZGVzY3JpcHRpb24nPjx0aXRsZT5ERVNDUklQVElPTjwvdGl0bGU+Cis8cGFyYT5UaGUgPGNvbW1hbmQ+ZGJ1cy1sYXVuY2g8L2NvbW1hbmQ+IGNvbW1hbmQgaXMgdXNlZCB0byBzdGFydCBhIHNlc3Npb24gYnVzCitpbnN0YW5jZSBvZiA8ZW1waGFzaXMgcmVtYXA9J0knPmRidXMtZGFlbW9uPC9lbXBoYXNpcz4gZnJvbSBhIHNoZWxsIHNjcmlwdC4KK0l0IHdvdWxkIG5vcm1hbGx5IGJlIGNhbGxlZCBmcm9tIGEgdXNlcidzIGxvZ2luCitzY3JpcHRzLiBVbmxpa2UgdGhlIGRhZW1vbiBpdHNlbGYsIDxjb21tYW5kPmRidXMtbGF1bmNoPC9jb21tYW5kPiBleGl0cywgc28KK2JhY2t0aWNrcyBvciB0aGUgJCgpIGNvbnN0cnVjdCBjYW4gYmUgdXNlZCB0byByZWFkIGluZm9ybWF0aW9uIGZyb20KKzxjb21tYW5kPmRidXMtbGF1bmNoPC9jb21tYW5kPi48L3BhcmE+CisKKzxwYXJhPldpdGggbm8gYXJndW1lbnRzLCA8Y29tbWFuZD5kYnVzLWxhdW5jaDwvY29tbWFuZD4gd2lsbCBsYXVuY2ggYSBzZXNzaW9uIGJ1cworaW5zdGFuY2UgYW5kIHByaW50IHRoZSBhZGRyZXNzIGFuZCBQSUQgb2YgdGhhdCBpbnN0YW5jZSB0byBzdGFuZGFyZAorb3V0cHV0LjwvcGFyYT4KKworPHBhcmE+WW91IG1heSBzcGVjaWZ5IGEgcHJvZ3JhbSB0byBiZSBydW47IGluIHRoaXMgY2FzZSwgPGNvbW1hbmQ+ZGJ1cy1sYXVuY2g8L2NvbW1hbmQ+Cit3aWxsIGxhdW5jaCBhIHNlc3Npb24gYnVzIGluc3RhbmNlLCBzZXQgdGhlIGFwcHJvcHJpYXRlIGVudmlyb25tZW50Cit2YXJpYWJsZXMgc28gdGhlIHNwZWNpZmllZCBwcm9ncmFtIGNhbiBmaW5kIHRoZSBidXMsIGFuZCB0aGVuIGV4ZWN1dGUgdGhlCitzcGVjaWZpZWQgcHJvZ3JhbSwgd2l0aCB0aGUgc3BlY2lmaWVkIGFyZ3VtZW50cy4gIFNlZSBiZWxvdyBmb3IKK2V4YW1wbGVzLjwvcGFyYT4KKworPHBhcmE+SWYgeW91IGxhdW5jaCBhIHByb2dyYW0sIDxjb21tYW5kPmRidXMtbGF1bmNoPC9jb21tYW5kPiB3aWxsIG5vdCBwcmludCB0aGUKK2luZm9ybWF0aW9uIGFib3V0IHRoZSBuZXcgYnVzIHRvIHN0YW5kYXJkIG91dHB1dC48L3BhcmE+CisKKzxwYXJhPldoZW4gPGNvbW1hbmQ+ZGJ1cy1sYXVuY2g8L2NvbW1hbmQ+IHByaW50cyBidXMgaW5mb3JtYXRpb24gdG8gc3RhbmRhcmQgb3V0cHV0LCBieQorZGVmYXVsdCBpdCBpcyBpbiBhIHNpbXBsZSBrZXktdmFsdWUgcGFpcnMgZm9ybWF0LiBIb3dldmVyLCB5b3UgbWF5CityZXF1ZXN0IHNldmVyYWwgYWx0ZXJuYXRlIHN5bnRheGVzIHVzaW5nIHRoZSAtLXNoLXN5bnRheCwgLS1jc2gtc3ludGF4LAorLS1iaW5hcnktc3ludGF4LCBvcgorLS1hdXRvLXN5bnRheCBvcHRpb25zLiBTZXZlcmFsIG9mIHRoZXNlIGNhdXNlIDxjb21tYW5kPmRidXMtbGF1bmNoPC9jb21tYW5kPiB0byBlbWl0IHNoZWxsIGNvZGUKK3RvIHNldCB1cCB0aGUgZW52aXJvbm1lbnQuPC9wYXJhPgorCis8cGFyYT5XaXRoIHRoZSAtLWF1dG8tc3ludGF4IG9wdGlvbiwgPGNvbW1hbmQ+ZGJ1cy1sYXVuY2g8L2NvbW1hbmQ+IGxvb2tzIGF0IHRoZSB2YWx1ZQorb2YgdGhlIFNIRUxMIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIGRldGVybWluZSB3aGljaCBzaGVsbCBzeW50YXgKK3Nob3VsZCBiZSB1c2VkLiAgSWYgU0hFTEwgZW5kcyBpbiAiY3NoIiwgdGhlbiBjc2gtY29tcGF0aWJsZSBjb2RlIGlzCitlbWl0dGVkOyBvdGhlcndpc2UgQm91cm5lIHNoZWxsIGNvZGUgaXMgZW1pdHRlZC4gIEluc3RlYWQgb2YgcGFzc2luZworLS1hdXRvLXN5bnRheCwgeW91IG1heSBleHBsaWNpdGx5IHNwZWNpZnkgYSBwYXJ0aWN1bGFyIG9uZSBieSB1c2luZworLS1zaC1zeW50YXggZm9yIEJvdXJuZSBzeW50YXgsIG9yIC0tY3NoLXN5bnRheCBmb3IgY3NoIHN5bnRheC4KK0luIHNjcmlwdHMsIGl0J3MgbW9yZSByb2J1c3QgdG8gYXZvaWQgLS1hdXRvLXN5bnRheCBhbmQgeW91IGhvcGVmdWxseQora25vdyB3aGljaCBzaGVsbCB5b3VyIHNjcmlwdCBpcyB3cml0dGVuIGluLjwvcGFyYT4KKworCis8cGFyYT5TZWUgPHVsaW5rIHVybD0naHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc29mdHdhcmUvZGJ1cy8nPmh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3NvZnR3YXJlL2RidXMvPC91bGluaz4gZm9yIG1vcmUgaW5mb3JtYXRpb24KK2Fib3V0IEQtQnVzLiBTZWUgYWxzbyB0aGUgbWFuIHBhZ2UgZm9yIDxlbXBoYXNpcyByZW1hcD0nSSc+ZGJ1cy1kYWVtb248L2VtcGhhc2lzPi48L3BhcmE+CisKKzwvcmVmc2VjdDE+CisKKzxyZWZzZWN0MSBpZD0nZXhhbXBsZXMnPjx0aXRsZT5FWEFNUExFUzwvdGl0bGU+Cis8cGFyYT5EaXN0cmlidXRpb25zIHJ1bm5pbmcKKzxjb21tYW5kPmRidXMtbGF1bmNoPC9jb21tYW5kPgorYXMgcGFydCBvZiBhIHN0YW5kYXJkIFggc2Vzc2lvbiBzaG91bGQgcnVuCis8ZW1waGFzaXMgcmVtYXA9J0InPmRidXMtbGF1bmNoIC0tZXhpdC13aXRoLXNlc3Npb248L2VtcGhhc2lzPgorYWZ0ZXIgdGhlIFggc2VydmVyIGhhcyBzdGFydGVkIGFuZCBiZWNvbWUgYXZhaWxhYmxlLCBhcyBhIHdyYXBwZXIgYXJvdW5kCit0aGUgIm1haW4iIFggY2xpZW50ICh0eXBpY2FsbHkgYSBzZXNzaW9uIG1hbmFnZXIgb3Igd2luZG93IG1hbmFnZXIpLCBhcyBpbgordGhlc2UgZXhhbXBsZXM6PC9wYXJhPgorCisgIDxibG9ja3F1b3RlIHJlbWFwPSdSUyc+Cis8cGFyYT48ZW1waGFzaXMgcmVtYXA9J0InPmRidXMtbGF1bmNoIC0tZXhpdC13aXRoLXNlc3Npb24gZ25vbWUtc2Vzc2lvbjwvZW1waGFzaXM+PC9wYXJhPgorCis8cGFyYT48ZW1waGFzaXMgcmVtYXA9J0InPmRidXMtbGF1bmNoIC0tZXhpdC13aXRoLXNlc3Npb24gb3BlbmJveDwvZW1waGFzaXM+PC9wYXJhPgorCis8cGFyYT48ZW1waGFzaXMgcmVtYXA9J0InPmRidXMtbGF1bmNoIC0tZXhpdC13aXRoLXNlc3Npb24gfi8ueHNlc3Npb248L2VtcGhhc2lzPgorICA8L3BhcmE+PC9ibG9ja3F1b3RlPiA8IS0tIHJlbWFwPSdSRScgLS0+CisKKzxwYXJhPklmIHlvdXIgZGlzdHJpYnV0aW9uIGRvZXMgbm90IGRvIHRoaXMsIHlvdSBjYW4gYWNoaWV2ZSBzaW1pbGFyIHJlc3VsdHMKK2J5IHJ1bm5pbmcgeW91ciBzZXNzaW9uIG9yIHdpbmRvdyBtYW5hZ2VyIGluIHRoZSBzYW1lIHdheSBpbiBhIHNjcmlwdAorcnVuIGJ5IHlvdXIgWCBzZXNzaW9uLCBzdWNoIGFzCis8ZmlsZW5hbWU+fi8ueHNlc3Npb248L2ZpbGVuYW1lPiwKKzxmaWxlbmFtZT5+Ly54aW5pdHJjPC9maWxlbmFtZT4KK29yCis8ZmlsZW5hbWU+fi8uWGNsaWVudHM8L2ZpbGVuYW1lPi48L3BhcmE+CisKKzxwYXJhPlRvIHN0YXJ0IGEgRC1CdXMgc2Vzc2lvbiB3aXRoaW4gYSB0ZXh0LW1vZGUgc2Vzc2lvbiwKKyAgZG8gbm90IHVzZSA8ZW1waGFzaXMgcmVtYXA9J0InPmRidXMtbGF1bmNoPC9lbXBoYXNpcz4uCisgIEluc3RlYWQsIHNlZSA8Y2l0ZXJlZmVudHJ5PjxyZWZlbnRyeXRpdGxlPmRidXMtcnVuLXNlc3Npb248L3JlZmVudHJ5dGl0bGU+PG1hbnZvbG51bT4xPC9tYW52b2xudW0+PC9jaXRlcmVmZW50cnk+LgorPC9wYXJhPgorCis8bGl0ZXJhbGxheW91dCByZW1hcD0nLm5mJz4KKyAgIyMgdGVzdCBmb3IgYW4gZXhpc3RpbmcgYnVzIGRhZW1vbiwganVzdCB0byBiZSBzYWZlCisgIGlmIHRlc3QgLXogIiREQlVTX1NFU1NJT05fQlVTX0FERFJFU1MiIDsgdGhlbgorICAgICAgIyMgaWYgbm90IGZvdW5kLCBsYXVuY2ggYSBuZXcgb25lCisgICAgICBldmFsIGBkYnVzLWxhdW5jaCAtLXNoLXN5bnRheGAKKyAgICAgIGVjaG8gIkQtQnVzIHBlci1zZXNzaW9uIGRhZW1vbiBhZGRyZXNzIGlzOiAkREJVU19TRVNTSU9OX0JVU19BRERSRVNTIgorICBmaQorPC9saXRlcmFsbGF5b3V0PiA8IS0tIC5maSAtLT4KKzxwYXJhPk5vdGUgdGhhdCBpbiB0aGlzIGNhc2UsIGRidXMtbGF1bmNoIHdpbGwgZXhpdCwgYW5kIGRidXMtZGFlbW9uIHdpbGwgbm90IGJlCit0ZXJtaW5hdGVkIGF1dG9tYXRpY2FsbHkgb24gbG9nb3V0LjwvcGFyYT4KKworPC9yZWZzZWN0MT4KKworPHJlZnNlY3QxIGlkPSdhdXRvbWF0aWNfbGF1bmNoaW5nJz48dGl0bGU+QVVUT01BVElDIExBVU5DSElORzwvdGl0bGU+Cis8cGFyYT5JZiBEQlVTX1NFU1NJT05fQlVTX0FERFJFU1MgaXMgbm90IHNldCBmb3IgYSBwcm9jZXNzIHRoYXQgdHJpZXMgdG8gdXNlCitELUJ1cywgYnkgZGVmYXVsdCB0aGUgcHJvY2VzcyB3aWxsIGF0dGVtcHQgdG8gaW52b2tlIGRidXMtbGF1bmNoIHdpdGgKK3RoZSAtLWF1dG9sYXVuY2ggb3B0aW9uIHRvIHN0YXJ0IHVwIGEgbmV3IHNlc3Npb24gYnVzIG9yIGZpbmQgdGhlCitleGlzdGluZyBidXMgYWRkcmVzcyBvbiB0aGUgWCBkaXNwbGF5IG9yIGluIGEgZmlsZSBpbgorfi8uZGJ1cy9zZXNzaW9uLWJ1cy88L3BhcmE+CisKKworPHBhcmE+V2hlbmV2ZXIgYW4gYXV0b2xhdW5jaCBvY2N1cnMsIHRoZSBhcHBsaWNhdGlvbiB0aGF0IGhhZCB0bworc3RhcnQgYSBuZXcgYnVzIHdpbGwgYmUgaW4gaXRzIG93biBsaXR0bGUgd29ybGQ7IGl0IGNhbiBlZmZlY3RpdmVseQorZW5kIHVwIHN0YXJ0aW5nIGEgd2hvbGUgbmV3IHNlc3Npb24gaWYgaXQgdHJpZXMgdG8gdXNlIGEgbG90IG9mCitidXMgc2VydmljZXMuIFRoaXMgY2FuIGJlIHN1Ym9wdGltYWwgb3IgZXZlbiB0b3RhbGx5IGJyb2tlbiwgZGVwZW5kaW5nCitvbiB0aGUgYXBwIGFuZCB3aGF0IGl0IHRyaWVzIHRvIGRvLjwvcGFyYT4KKworCis8cGFyYT5UaGVyZSBhcmUgdHdvIGNvbW1vbiByZWFzb25zIGZvciBhdXRvbGF1bmNoLiBPbmUgaXMgc3NoIHRvIGEgcmVtb3RlCittYWNoaW5lLiBUaGUgaWRlYWwgZml4IGZvciB0aGF0IHdvdWxkIGJlIGZvcndhcmRpbmcgb2YKK0RCVVNfU0VTU0lPTl9CVVNfQUREUkVTUyBpbiB0aGUgc2FtZSB3YXkgdGhhdCBESVNQTEFZIGlzIGZvcndhcmRlZC4KK0luIHRoZSBtZWFudGltZSwgeW91IGNhbiBlZGl0IHRoZSBzZXNzaW9uLmNvbmYgY29uZmlnIGZpbGUgdG8KK2hhdmUgeW91ciBzZXNzaW9uIGJ1cyBsaXN0ZW4gb24gVENQLCBhbmQgbWFudWFsbHkgc2V0CitEQlVTX1NFU1NJT05fQlVTX0FERFJFU1MsIGlmIHlvdSBsaWtlLjwvcGFyYT4KKworCis8cGFyYT5UaGUgc2Vjb25kIGNvbW1vbiByZWFzb24gZm9yIGF1dG9sYXVuY2ggaXMgYW4gc3UgdG8gYW5vdGhlciB1c2VyLCBhbmQKK2Rpc3BsYXkgb2YgWCBhcHBsaWNhdGlvbnMgcnVubmluZyBhcyB0aGUgc2Vjb25kIHVzZXIgb24gdGhlIGRpc3BsYXkKK2JlbG9uZ2luZyB0byB0aGUgZmlyc3QgdXNlci4gUGVyaGFwcyB0aGUgaWRlYWwgZml4IGluIHRoaXMgY2FzZQord291bGQgYmUgdG8gYWxsb3cgdGhlIHNlY29uZCB1c2VyIHRvIGNvbm5lY3QgdG8gdGhlIHNlc3Npb24gYnVzIG9mIHRoZQorZmlyc3QgdXNlciwganVzdCBhcyB0aGV5IGNhbiBjb25uZWN0IHRvIHRoZSBmaXJzdCB1c2VyJ3MgZGlzcGxheS4KK0hvd2V2ZXIsIGEgbWVjaGFuaXNtIGZvciB0aGF0IGhhcyBub3QgYmVlbiBjb2RlZC48L3BhcmE+CisKKworPHBhcmE+WW91IGNhbiBhbHdheXMgYXZvaWQgYXV0b2xhdW5jaCBieSBtYW51YWxseSBzZXR0aW5nCitEQlVTX1NFU1NJT05fQlVTX0FERFJFU1MuIEF1dG9sYXVuY2ggaGFwcGVucyBiZWNhdXNlIHRoZSBkZWZhdWx0CithZGRyZXNzIGlmIG5vbmUgaXMgc2V0IGlzICJhdXRvbGF1bmNoOiIsIHNvIGlmIGFueSBvdGhlciBhZGRyZXNzIGlzCitzZXQgdGhlcmUgd2lsbCBiZSBubyBhdXRvbGF1bmNoLiBZb3UgY2FuIGhvd2V2ZXIgaW5jbHVkZSBhdXRvbGF1bmNoIGluCithbiBleHBsaWNpdCBzZXNzaW9uIGJ1cyBhZGRyZXNzIGFzIGEgZmFsbGJhY2ssIGZvciBleGFtcGxlCitEQlVTX1NFU1NJT05fQlVTX0FERFJFU1M9InNvbWV0aGluZzosYXV0b2xhdW5jaDoiIC0gaW4gdGhhdCBjYXNlIGlmCit0aGUgZmlyc3QgYWRkcmVzcyBkb2Vzbid0IHdvcmssIHByb2Nlc3NlcyB3aWxsIGF1dG9sYXVuY2guIChUaGUgYnVzCithZGRyZXNzIHZhcmlhYmxlIGNvbnRhaW5zIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgYWRkcmVzc2VzIHRvIHRyeS4pPC9wYXJhPgorCisKKzxwYXJhPlRoZSAtLWF1dG9sYXVuY2ggb3B0aW9uIGlzIGNvbnNpZGVyZWQgYW4gaW50ZXJuYWwgaW1wbGVtZW50YXRpb24KK2RldGFpbCBvZiBsaWJkYnVzLCBhbmQgaW4gZmFjdCB0aGVyZSBhcmUgcGxhbnMgdG8gY2hhbmdlIGl0LiBUaGVyZSdzCitubyByZWFsIHJlYXNvbiB0byB1c2UgaXQgb3V0c2lkZSBvZiB0aGUgbGliZGJ1cyBpbXBsZW1lbnRhdGlvbiBhbnlob3cuPC9wYXJhPgorCis8L3JlZnNlY3QxPgorCis8cmVmc2VjdDEgaWQ9J29wdGlvbnMnPjx0aXRsZT5PUFRJT05TPC90aXRsZT4KKzxwYXJhPlRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgc3VwcG9ydGVkOjwvcGFyYT4KKzx2YXJpYWJsZWxpc3QgcmVtYXA9J1RQJz4KKyAgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PG9wdGlvbj4tLWF1dG8tc3ludGF4PC9vcHRpb24+PC90ZXJtPgorICA8bGlzdGl0ZW0+Cis8cGFyYT5DaG9vc2UgLS1jc2gtc3ludGF4IG9yIC0tc2gtc3ludGF4IGJhc2VkIG9uIHRoZSBTSEVMTCBlbnZpcm9ubWVudCB2YXJpYWJsZS48L3BhcmE+CisKKyAgPC9saXN0aXRlbT4KKyAgPC92YXJsaXN0ZW50cnk+CisgIDx2YXJsaXN0ZW50cnk+CisgIDx0ZXJtPjxvcHRpb24+LS1iaW5hcnktc3ludGF4PC9vcHRpb24+PC90ZXJtPgorICA8bGlzdGl0ZW0+Cis8cGFyYT5Xcml0ZSB0byBzdGRvdXQgYSBudWwtdGVybWluYXRlZCBidXMgYWRkcmVzcywgdGhlbiB0aGUgYnVzIFBJRCBhcyBhCitiaW5hcnkgaW50ZWdlciBvZiBzaXplIHNpemVvZihwaWRfdCksIHRoZW4gdGhlIGJ1cyBYIHdpbmRvdyBJRCBhcyBhCitiaW5hcnkgaW50ZWdlciBvZiBzaXplIHNpemVvZihsb25nKS4gSW50ZWdlcnMgYXJlIGluIHRoZSBtYWNoaW5lJ3MKK2J5dGUgb3JkZXIsIG5vdCBuZXR3b3JrIGJ5dGUgb3JkZXIgb3IgYW55IG90aGVyIGNhbm9uaWNhbCBieXRlIG9yZGVyLjwvcGFyYT4KKworICA8L2xpc3RpdGVtPgorICA8L3Zhcmxpc3RlbnRyeT4KKyAgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PG9wdGlvbj4tLWNsb3NlLXN0ZGVycjwvb3B0aW9uPjwvdGVybT4KKyAgPGxpc3RpdGVtPgorPHBhcmE+Q2xvc2UgdGhlIHN0YW5kYXJkIGVycm9yIG91dHB1dCBzdHJlYW0gYmVmb3JlIHN0YXJ0aW5nIHRoZSBELUJ1cworZGFlbW9uLiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3Ugd2FudCB0byBjYXB0dXJlIGRidXMtbGF1bmNoIGVycm9yCittZXNzYWdlcyBidXQgeW91IGRvbid0IHdhbnQgZGJ1cy1kYWVtb24gdG8ga2VlcCB0aGUgc3RyZWFtIG9wZW4gdG8KK3lvdXIgYXBwbGljYXRpb24uPC9wYXJhPgorCisgIDwvbGlzdGl0ZW0+CisgIDwvdmFybGlzdGVudHJ5PgorICA8dmFybGlzdGVudHJ5PgorICA8dGVybT48b3B0aW9uPi0tY29uZmlnLWZpbGU9RklMRU5BTUU8L29wdGlvbj48L3Rlcm0+CisgIDxsaXN0aXRlbT4KKzxwYXJhPlBhc3MgLS1jb25maWctZmlsZT1GSUxFTkFNRSB0byB0aGUgYnVzIGRhZW1vbiwgaW5zdGVhZCBvZiBwYXNzaW5nIGl0Cit0aGUgLS1zZXNzaW9uIGFyZ3VtZW50LiBTZWUgdGhlIG1hbiBwYWdlIGZvciBkYnVzLWRhZW1vbjwvcGFyYT4KKworICA8L2xpc3RpdGVtPgorICA8L3Zhcmxpc3RlbnRyeT4KKyAgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PG9wdGlvbj4tLWNzaC1zeW50YXg8L29wdGlvbj48L3Rlcm0+CisgIDxsaXN0aXRlbT4KKzxwYXJhPkVtaXQgY3NoIGNvbXBhdGlibGUgY29kZSB0byBzZXQgdXAgZW52aXJvbm1lbnQgdmFyaWFibGVzLjwvcGFyYT4KKworICA8L2xpc3RpdGVtPgorICA8L3Zhcmxpc3RlbnRyeT4KKworICA8dmFybGlzdGVudHJ5PgorICAgIDx0ZXJtPjxvcHRpb24+LS1leGl0LXdpdGgteDExPC9vcHRpb24+PC90ZXJtPgorICAgIDxsaXN0aXRlbT4KKyAgICAgIDxwYXJhPklmIHRoaXMgb3B0aW9uIGlzIHByb3ZpZGVkLCBhIHBlcnNpc3RlbnQgImJhYnlzaXR0ZXIiIHByb2Nlc3MKKyAgICAgICAgd2lsbCBiZSBjcmVhdGVkLCBhbmQgd2lsbCBjb25uZWN0IHRvIHRoZSBYIHNlcnZlci4gSWYgaXQgY2Fubm90CisgICAgICAgIGRvIHNvLCBsYXVuY2hpbmcgZmFpbHMuIElmIHRoZSAiYmFieXNpdHRlciIgcHJvY2VzcyBsb3NlcyBpdHMKKyAgICAgICAgWCBjb25uZWN0aW9uLCBpdCBraWxscyB0aGUgbWVzc2FnZSBidXMgZGFlbW9uLCBkaXNjb25uZWN0aW5nCisgICAgICAgIGFsbCBvZiBpdHMgY2xpZW50cyAod2hpY2ggc2hvdWxkIGV4aXQgaW4gcmVzcG9uc2UpLiBUaGlzIGF2b2lkcworICAgICAgICBoYXZpbmcgbGVmdG92ZXIgZGFlbW9uIHByb2Nlc3NlcyBmcm9tIGEgdXNlciBYIHNlc3Npb24sIGFmdGVyCisgICAgICAgIHRoZSBYIHNlc3Npb24gaGFzIGVuZGVkLjwvcGFyYT4KKyAgICA8L2xpc3RpdGVtPgorICA8L3Zhcmxpc3RlbnRyeT4KKworICA8dmFybGlzdGVudHJ5PgorICAgIDx0ZXJtPjxvcHRpb24+LS1leGl0LXdpdGgtc2Vzc2lvbjwvb3B0aW9uPjwvdGVybT4KKyAgICA8bGlzdGl0ZW0+CisgICAgICA8cGFyYT4KKyAgICAgICAgSWYgdGhpcyBvcHRpb24gaXMgcHJvdmlkZWQsIGEgcGVyc2lzdGVudCAiYmFieXNpdHRlciIgcHJvY2VzcyB3aWxsCisgICAgICAgIGJlIGNyZWF0ZWQsIGFzIGlmIGZvciAtLWV4aXQtd2l0aC14MTEuIElmIGl0IGNhbm5vdCBjb25uZWN0IHRvCisgICAgICAgIHRoZSBYIHNlcnZlciwgaXQgd2lsbCBtb25pdG9yIHRoZSB0ZXJtaW5hbCBmcm9tIHdoaWNoIGRidXMtbGF1bmNoCisgICAgICAgIHdhcyBzdGFydGVkIGluc3RlYWQsIGFuZCBpZiBpdCBnZXRzIGEgSFVQIG9uIHN0ZGluLCB0aGUgbWVzc2FnZQorICAgICAgICBidXMgZGFlbW9uIHdpbGwgYmUga2lsbGVkLiBUaGlzIG9wdGlvbiBpcyBub3QgcmVjb21tZW5kZWQsIHNpbmNlCisgICAgICAgIGl0IHdpbGwgY29uc3VtZSBpbnB1dCBmcm9tIHRoZSB0ZXJtaW5hbCB3aGVyZSBpdCB3YXMgc3RhcnRlZDsKKyAgICAgICAgaXQgaXMgbWFpbmx5IHByb3ZpZGVkIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KKyAgICAgIDwvcGFyYT4KKyAgICA8L2xpc3RpdGVtPgorICA8L3Zhcmxpc3RlbnRyeT4KKworICA8dmFybGlzdGVudHJ5PgorICA8dGVybT48b3B0aW9uPi0tYXV0b2xhdW5jaD1NQUNISU5FSUQ8L29wdGlvbj48L3Rlcm0+CisgIDxsaXN0aXRlbT4KKzxwYXJhPlRoaXMgb3B0aW9uIGltcGxpZXMgdGhhdCA8Y29tbWFuZD5kYnVzLWxhdW5jaDwvY29tbWFuZD4gc2hvdWxkIHNjYW4gZm9yIGEKK3ByZXZpb3VzbHktc3RhcnRlZCBzZXNzaW9uIGFuZCByZXVzZSB0aGUgdmFsdWVzIGZvdW5kIHRoZXJlLiBJZiBubworc2Vzc2lvbiBpcyBmb3VuZCwgaXQgd2lsbCBzdGFydCBhIG5ldyBzZXNzaW9uLiBUaGUKKy0tZXhpdC13aXRoLXNlc3Npb24gb3B0aW9uIGlzIGltcGxpZWQgaWYgLS1hdXRvbGF1bmNoIGlzIGdpdmVuLgorVGhpcyBvcHRpb24gaXMgZm9yIHRoZSBleGNsdXNpdmUgdXNlIG9mIGxpYmRidXMsIHlvdSBkbyBub3Qgd2FudCB0bwordXNlIGl0IG1hbnVhbGx5LiBJdCBtYXkgY2hhbmdlIGluIHRoZSBmdXR1cmUuPC9wYXJhPgorCisgIDwvbGlzdGl0ZW0+CisgIDwvdmFybGlzdGVudHJ5PgorICA8dmFybGlzdGVudHJ5PgorICA8dGVybT48b3B0aW9uPi0tc2gtc3ludGF4PC9vcHRpb24+PC90ZXJtPgorICA8bGlzdGl0ZW0+Cis8cGFyYT5FbWl0IEJvdXJuZS1zaGVsbCBjb21wYXRpYmxlIGNvZGUgdG8gc2V0IHVwIGVudmlyb25tZW50IHZhcmlhYmxlcy48L3BhcmE+CisKKyAgPC9saXN0aXRlbT4KKyAgPC92YXJsaXN0ZW50cnk+CisgIDx2YXJsaXN0ZW50cnk+CisgIDx0ZXJtPjxvcHRpb24+LS12ZXJzaW9uPC9vcHRpb24+PC90ZXJtPgorICA8bGlzdGl0ZW0+Cis8cGFyYT5QcmludCB0aGUgdmVyc2lvbiBvZiBkYnVzLWxhdW5jaDwvcGFyYT4KKworICA8L2xpc3RpdGVtPgorICA8L3Zhcmxpc3RlbnRyeT4KKyAgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PG9wdGlvbj4tLWhlbHA8L29wdGlvbj48L3Rlcm0+CisgIDxsaXN0aXRlbT4KKzxwYXJhPlByaW50IHRoZSBoZWxwIGluZm8gb2YgZGJ1cy1sYXVuY2g8L3BhcmE+CisKKyAgPC9saXN0aXRlbT4KKyAgPC92YXJsaXN0ZW50cnk+Cis8L3ZhcmlhYmxlbGlzdD4KKzwvcmVmc2VjdDE+CisKKzxyZWZzZWN0MSBpZD0nbm90ZXMnPjx0aXRsZT5OT1RFUzwvdGl0bGU+Cis8cGFyYT5JZiB5b3UgcnVuCis8ZW1waGFzaXMgcmVtYXA9J0InPmRidXMtbGF1bmNoIG15YXBwPC9lbXBoYXNpcz4KKyh3aXRoIGFueSBvdGhlciBvcHRpb25zKSwgZGJ1cy1kYWVtb24gd2lsbAorPGVtcGhhc2lzIHJlbWFwPSdJJz5ub3Q8L2VtcGhhc2lzPgorZXhpdCB3aGVuCis8ZW1waGFzaXMgcmVtYXA9J0InPm15YXBwPC9lbXBoYXNpcz4KK3Rlcm1pbmF0ZXM6IHRoaXMgaXMgYmVjYXVzZQorPGVtcGhhc2lzIHJlbWFwPSdCJz5teWFwcDwvZW1waGFzaXM+CitpcyBhc3N1bWVkIHRvIGJlIHBhcnQgb2YgYSBsYXJnZXIgc2Vzc2lvbiwgcmF0aGVyIHRoYW4gYSBzZXNzaW9uIGluIGl0cworb3duIHJpZ2h0LjwvcGFyYT4KKworPC9yZWZzZWN0MT4KKworPHJlZnNlY3QxIGlkPSdhdXRob3InPjx0aXRsZT5BVVRIT1I8L3RpdGxlPgorPHBhcmE+U2VlIDx1bGluayB1cmw9J2h0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3NvZnR3YXJlL2RidXMvZG9jL0FVVEhPUlMnPmh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3NvZnR3YXJlL2RidXMvZG9jL0FVVEhPUlM8L3VsaW5rPjwvcGFyYT4KKworPC9yZWZzZWN0MT4KKworPHJlZnNlY3QxIGlkPSdidWdzJz48dGl0bGU+QlVHUzwvdGl0bGU+Cis8cGFyYT5QbGVhc2Ugc2VuZCBidWcgcmVwb3J0cyB0byB0aGUgRC1CdXMgbWFpbGluZyBsaXN0IG9yIGJ1ZyB0cmFja2VyLAorc2VlIDx1bGluayB1cmw9J2h0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3NvZnR3YXJlL2RidXMvJz5odHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zb2Z0d2FyZS9kYnVzLzwvdWxpbms+PC9wYXJhPgorPC9yZWZzZWN0MT4KKzwvcmVmZW50cnk+CmRpZmYgLS1naXQgYS9kb2MvZGJ1cy1tb25pdG9yLjEueG1sLmluIGIvZG9jL2RidXMtbW9uaXRvci4xLnhtbC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjgwN2QyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2RidXMtbW9uaXRvci4xLnhtbC5pbgpAQCAtMCwwICsxLDEzMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgorPCFET0NUWVBFIHJlZmVudHJ5IFBVQkxJQyAiLS8vT0FTSVMvL0RURCBEb2NCb29rIFhNTCBWNC40Ly9FTiIKKyAgICAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy5vYXNpcy1vcGVuLm9yZy9kb2Nib29rL3htbC80LjQvZG9jYm9va3guZHRkIj4KKzxyZWZlbnRyeSBpZD0nZGJ1c21vbml0b3IxJz4KKworPCEtLSAgZGJ1cyZic29sOy1tb25pdG9yIG1hbnVhbCBwYWdlLgorIENvcHlyaWdodCAoQykgMjAwMyBSZWQgSGF0LCBJbmMuIC0tPgorCis8cmVmbWV0YT4KKzxyZWZlbnRyeXRpdGxlPmRidXMtbW9uaXRvcjwvcmVmZW50cnl0aXRsZT4KKzxtYW52b2xudW0+MTwvbWFudm9sbnVtPgorPHJlZm1pc2NpbmZvIGNsYXNzPSJtYW51YWwiPlVzZXIgQ29tbWFuZHM8L3JlZm1pc2NpbmZvPgorPHJlZm1pc2NpbmZvIGNsYXNzPSJzb3VyY2UiPkQtQnVzPC9yZWZtaXNjaW5mbz4KKzxyZWZtaXNjaW5mbyBjbGFzcz0idmVyc2lvbiI+QERCVVNfVkVSU0lPTkA8L3JlZm1pc2NpbmZvPgorPC9yZWZtZXRhPgorPHJlZm5hbWVkaXY+Cis8cmVmbmFtZT5kYnVzLW1vbml0b3I8L3JlZm5hbWU+Cis8cmVmcHVycG9zZT5kZWJ1ZyBwcm9iZSB0byBwcmludCBtZXNzYWdlIGJ1cyBtZXNzYWdlczwvcmVmcHVycG9zZT4KKzwvcmVmbmFtZWRpdj4KKzwhLS0gYm9keSBiZWdpbnMgaGVyZSAtLT4KKzxyZWZzeW5vcHNpc2RpdiBpZD0nc3lub3BzaXMnPgorPGNtZHN5bm9wc2lzPgorICA8Y29tbWFuZD5kYnVzLW1vbml0b3I8L2NvbW1hbmQ+CisgICAgPGdyb3VwIGNob2ljZT0nb3B0Jz48YXJnIGNob2ljZT0ncGxhaW4nPi0tc3lzdGVtIDwvYXJnPjxhcmcgY2hvaWNlPSdwbGFpbic+LS1zZXNzaW9uIDwvYXJnPjxhcmcgY2hvaWNlPSdwbGFpbic+LS1hZGRyZXNzIDxyZXBsYWNlYWJsZT5BRERSRVNTPC9yZXBsYWNlYWJsZT48L2FyZz48L2dyb3VwPgorICAgIDxncm91cCBjaG9pY2U9J29wdCc+PGFyZyBjaG9pY2U9J3BsYWluJz4tLXByb2ZpbGUgPC9hcmc+PGFyZyBjaG9pY2U9J3BsYWluJz4tLW1vbml0b3IgPC9hcmc+PGFyZyBjaG9pY2U9J3BsYWluJz4tLXBjYXAgPC9hcmc+PGFyZyBjaG9pY2U9J3BsYWluJz4tLWJpbmFyeSA8L2FyZz48L2dyb3VwPgorICAgIDxhcmcgY2hvaWNlPSdvcHQnPjxhcmcgY2hvaWNlPSdwbGFpbic+PHJlcGxhY2VhYmxlPndhdGNoPC9yZXBsYWNlYWJsZT48L2FyZz48YXJnIGNob2ljZT0ncGxhaW4nPjxyZXBsYWNlYWJsZT5leHByZXNzaW9uczwvcmVwbGFjZWFibGU+PC9hcmc+PC9hcmc+CisgICAgPHNici8+Cis8L2NtZHN5bm9wc2lzPgorPC9yZWZzeW5vcHNpc2Rpdj4KKworCis8cmVmc2VjdDEgaWQ9J2Rlc2NyaXB0aW9uJz48dGl0bGU+REVTQ1JJUFRJT048L3RpdGxlPgorPHBhcmE+VGhlIDxjb21tYW5kPmRidXMtbW9uaXRvcjwvY29tbWFuZD4gY29tbWFuZCBpcyB1c2VkIHRvIG1vbml0b3IgbWVzc2FnZXMgZ29pbmcKK3Rocm91Z2ggYSBELUJ1cyBtZXNzYWdlIGJ1cy4gIFNlZQorPHVsaW5rIHVybD0naHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc29mdHdhcmUvZGJ1cy8nPmh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3NvZnR3YXJlL2RidXMvPC91bGluaz4gZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQKK3RoZSBiaWcgcGljdHVyZS48L3BhcmE+CisKKworPHBhcmE+VGhlcmUgYXJlIHR3byB3ZWxsLWtub3duIG1lc3NhZ2UgYnVzZXM6IHRoZSBzeXN0ZW13aWRlIG1lc3NhZ2UgYnVzCisoaW5zdGFsbGVkIG9uIG1hbnkgc3lzdGVtcyBhcyB0aGUgIm1lc3NhZ2VidXMiIHNlcnZpY2UpIGFuZCB0aGUKK3Blci11c2VyLWxvZ2luLXNlc3Npb24gbWVzc2FnZSBidXMgKHN0YXJ0ZWQgZWFjaCB0aW1lIGEgdXNlciBsb2dzIGluKS4KK1RoZSAtLXN5c3RlbSBhbmQgLS1zZXNzaW9uIG9wdGlvbnMgZGlyZWN0IDxjb21tYW5kPmRidXMtbW9uaXRvcjwvY29tbWFuZD4gdG8KK21vbml0b3IgdGhlIHN5c3RlbSBvciBzZXNzaW9uIGJ1c2VzIHJlc3BlY3RpdmVseS4gIElmIG5laXRoZXIgaXMKK3NwZWNpZmllZCwgPGNvbW1hbmQ+ZGJ1cy1tb25pdG9yPC9jb21tYW5kPiBtb25pdG9ycyB0aGUgc2Vzc2lvbiBidXMuPC9wYXJhPgorCisKKzxwYXJhPjxjb21tYW5kPmRidXMtbW9uaXRvcjwvY29tbWFuZD4gaGFzIHR3byBkaWZmZXJlbnQgdGV4dCBvdXRwdXQKK21vZGVzOiB0aGUgJ2NsYXNzaWMnLXN0eWxlCittb25pdG9yaW5nIG1vZGUsIGFuZCBwcm9maWxpbmcgbW9kZS4gVGhlIHByb2ZpbGluZyBmb3JtYXQgaXMgYSBjb21wYWN0Citmb3JtYXQgd2l0aCBhIHNpbmdsZSBsaW5lIHBlciBtZXNzYWdlIGFuZCBtaWNyb3NlY29uZC1yZXNvbHV0aW9uIHRpbWluZworaW5mb3JtYXRpb24uIFRoZSAtLXByb2ZpbGUgYW5kIC0tbW9uaXRvciBvcHRpb25zIHNlbGVjdCB0aGUgcHJvZmlsaW5nCithbmQgbW9uaXRvcmluZyBvdXRwdXQgZm9ybWF0IHJlc3BlY3RpdmVseS48L3BhcmE+CisKKzxwYXJhPjxjb21tYW5kPmRidXMtbW9uaXRvcjwvY29tbWFuZD4gYWxzbyBoYXMgdHdvIGJpbmFyeSBvdXRwdXQgbW9kZXMuCisgIFRoZSBiaW5hcnkgbW9kZSwgc2VsZWN0ZWQgYnkgPGxpdGVyYWw+LS1iaW5hcnk8L2xpdGVyYWw+LCBvdXRwdXRzIHRoZQorICBlbnRpcmUgYmluYXJ5IG1lc3NhZ2Ugc3RyZWFtICh3aXRob3V0IHRoZSBpbml0aWFsIGF1dGhlbnRpY2F0aW9uIGhhbmRzaGFrZSkuCisgIFRoZSBQQ0FQIG1vZGUsIHNlbGVjdGVkIGJ5IDxsaXRlcmFsPi0tcGNhcDwvbGl0ZXJhbD4sIGFkZHMgYQorICBQQ0FQIGZpbGUgaGVhZGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG91dHB1dCwgYW5kIHByZXBlbmRzIGEgUENBUAorICBtZXNzYWdlIGhlYWRlciB0byBlYWNoIG1lc3NhZ2U7IHRoaXMgcHJvZHVjZXMgYSBiaW5hcnkgZmlsZSB0aGF0IGNhbgorICBiZSByZWFkIGJ5LCBmb3IgaW5zdGFuY2UsIFdpcmVzaGFyay48L3BhcmE+CisKKzxwYXJhPklmIG5vIG1vZGUgaXMgc3BlY2lmaWVkLAorPGNvbW1hbmQ+ZGJ1cy1tb25pdG9yPC9jb21tYW5kPiB1c2VzIHRoZSBtb25pdG9yaW5nIG91dHB1dCBmb3JtYXQuPC9wYXJhPgorCisKKzxwYXJhPkluIG9yZGVyIHRvIGdldCA8Y29tbWFuZD5kYnVzLW1vbml0b3I8L2NvbW1hbmQ+IHRvIHNlZSB0aGUgbWVzc2FnZXMgeW91IGFyZSBpbnRlcmVzdGVkCitpbiwgeW91IHNob3VsZCBzcGVjaWZ5IGEgc2V0IG9mIHdhdGNoIGV4cHJlc3Npb25zIGFzIHlvdSB3b3VsZCBleHBlY3QgdG8KK2JlIHBhc3NlZCB0byB0aGUgPGVtcGhhc2lzIHJlbWFwPSdJJz5kYnVzX2J1c19hZGRfbWF0Y2g8L2VtcGhhc2lzPiBmdW5jdGlvbi48L3BhcmE+CisKKworPHBhcmE+VGhlIG1lc3NhZ2UgYnVzIGNvbmZpZ3VyYXRpb24gbWF5IGtlZXAgPGNvbW1hbmQ+ZGJ1cy1tb25pdG9yPC9jb21tYW5kPiBmcm9tIHNlZWluZworYWxsIG1lc3NhZ2VzLCBlc3BlY2lhbGx5IGlmIHlvdSBydW4gdGhlIG1vbml0b3IgYXMgYSBub24tcm9vdCB1c2VyLjwvcGFyYT4KKworPC9yZWZzZWN0MT4KKworPHJlZnNlY3QxIGlkPSdvcHRpb25zJz48dGl0bGU+T1BUSU9OUzwvdGl0bGU+Cis8dmFyaWFibGVsaXN0IHJlbWFwPSdUUCc+CisgIDx2YXJsaXN0ZW50cnk+CisgIDx0ZXJtPjxvcHRpb24+LS1zeXN0ZW08L29wdGlvbj48L3Rlcm0+CisgIDxsaXN0aXRlbT4KKzxwYXJhPk1vbml0b3IgdGhlIHN5c3RlbSBtZXNzYWdlIGJ1cy48L3BhcmE+CisgIDwvbGlzdGl0ZW0+CisgIDwvdmFybGlzdGVudHJ5PgorICA8dmFybGlzdGVudHJ5PgorICA8dGVybT48b3B0aW9uPi0tc2Vzc2lvbjwvb3B0aW9uPjwvdGVybT4KKyAgPGxpc3RpdGVtPgorPHBhcmE+TW9uaXRvciB0aGUgc2Vzc2lvbiBtZXNzYWdlIGJ1cy4gIChUaGlzIGlzIHRoZSBkZWZhdWx0Lik8L3BhcmE+CisgIDwvbGlzdGl0ZW0+CisgIDwvdmFybGlzdGVudHJ5PgorICA8dmFybGlzdGVudHJ5PgorICA8dGVybT48b3B0aW9uPi0tYWRkcmVzcyBBRERSRVNTPC9vcHRpb24+PC90ZXJtPgorICA8bGlzdGl0ZW0+Cis8cGFyYT5Nb25pdG9yIGFuIGFyYml0cmFyeSBtZXNzYWdlIGJ1cyBnaXZlbiBhdCBBRERSRVNTLjwvcGFyYT4KKyAgPC9saXN0aXRlbT4KKyAgPC92YXJsaXN0ZW50cnk+CisgIDx2YXJsaXN0ZW50cnk+CisgIDx0ZXJtPjxvcHRpb24+LS1wcm9maWxlPC9vcHRpb24+PC90ZXJtPgorICA8bGlzdGl0ZW0+Cis8cGFyYT5Vc2UgdGhlIHByb2ZpbGluZyBvdXRwdXQgZm9ybWF0LjwvcGFyYT4KKyAgPC9saXN0aXRlbT4KKyAgPC92YXJsaXN0ZW50cnk+CisgIDx2YXJsaXN0ZW50cnk+CisgIDx0ZXJtPjxvcHRpb24+LS1tb25pdG9yPC9vcHRpb24+PC90ZXJtPgorICA8bGlzdGl0ZW0+Cis8cGFyYT5Vc2UgdGhlIG1vbml0b3Jpbmcgb3V0cHV0IGZvcm1hdC4gIChUaGlzIGlzIHRoZSBkZWZhdWx0Lik8L3BhcmE+CisKKyAgPC9saXN0aXRlbT4KKyAgPC92YXJsaXN0ZW50cnk+Cis8L3ZhcmlhYmxlbGlzdD4KKzwvcmVmc2VjdDE+CisKKzxyZWZzZWN0MSBpZD0nZXhhbXBsZSc+PHRpdGxlPkVYQU1QTEU8L3RpdGxlPgorPHBhcmE+SGVyZSBpcyBhbiBleGFtcGxlIG9mIHVzaW5nIGRidXMtbW9uaXRvciB0byB3YXRjaCBmb3IgdGhlIGdub21lIHR5cGluZworbW9uaXRvciB0byBzYXkgdGhpbmdzPC9wYXJhPgorPGxpdGVyYWxsYXlvdXQgcmVtYXA9Jy5uZic+CisKKyAgZGJ1cy1tb25pdG9yICJ0eXBlPSdzaWduYWwnLHNlbmRlcj0nb3JnLmdub21lLlR5cGluZ01vbml0b3InLGludGVyZmFjZT0nb3JnLmdub21lLlR5cGluZ01vbml0b3InIgorCis8L2xpdGVyYWxsYXlvdXQ+IDwhLS0gLmZpIC0tPgorCis8L3JlZnNlY3QxPgorCis8cmVmc2VjdDEgaWQ9J2F1dGhvcic+PHRpdGxlPkFVVEhPUjwvdGl0bGU+Cis8cGFyYT5kYnVzLW1vbml0b3Igd2FzIHdyaXR0ZW4gYnkgUGhpbGlwIEJsdW5kZWxsLgorVGhlIHByb2ZpbGluZyBvdXRwdXQgbW9kZSB3YXMgYWRkZWQgYnkgT2xsaSBTYWxsaS48L3BhcmE+CisKKzwvcmVmc2VjdDE+CisKKzxyZWZzZWN0MSBpZD0nYnVncyc+PHRpdGxlPkJVR1M8L3RpdGxlPgorPHBhcmE+UGxlYXNlIHNlbmQgYnVnIHJlcG9ydHMgdG8gdGhlIEQtQnVzIG1haWxpbmcgbGlzdCBvciBidWcgdHJhY2tlciwKK3NlZSA8dWxpbmsgdXJsPSdodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zb2Z0d2FyZS9kYnVzLyc+aHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc29mdHdhcmUvZGJ1cy88L3VsaW5rPjwvcGFyYT4KKzwvcmVmc2VjdDE+Cis8L3JlZmVudHJ5PgpkaWZmIC0tZ2l0IGEvZG9jL2RidXMtcnVuLXNlc3Npb24uMS54bWwuaW4gYi9kb2MvZGJ1cy1ydW4tc2Vzc2lvbi4xLnhtbC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2VjMjhhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2RidXMtcnVuLXNlc3Npb24uMS54bWwuaW4KQEAgLTAsMCArMSwxNTIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4KKzwhRE9DVFlQRSByZWZlbnRyeSBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRG9jQm9vayBYTUwgVjQuNC8vRU4iCisgICAgICAgICAgICAgICAgICAgImh0dHA6Ly93d3cub2FzaXMtb3Blbi5vcmcvZG9jYm9vay94bWwvNC40L2RvY2Jvb2t4LmR0ZCI+Cis8cmVmZW50cnkgaWQ9J2RidXNydW5zZXNzaW9uMSc+Cis8cmVmbWV0YT4KKzxyZWZlbnRyeXRpdGxlPmRidXMtcnVuLXNlc3Npb248L3JlZmVudHJ5dGl0bGU+Cis8bWFudm9sbnVtPjE8L21hbnZvbG51bT4KKzxyZWZtaXNjaW5mbyBjbGFzcz0ibWFudWFsIj5Vc2VyIENvbW1hbmRzPC9yZWZtaXNjaW5mbz4KKzxyZWZtaXNjaW5mbyBjbGFzcz0ic291cmNlIj5ELUJ1czwvcmVmbWlzY2luZm8+Cis8cmVmbWlzY2luZm8gY2xhc3M9InZlcnNpb24iPkBEQlVTX1ZFUlNJT05APC9yZWZtaXNjaW5mbz4KKzwvcmVmbWV0YT4KKzxyZWZuYW1lZGl2PgorPHJlZm5hbWU+ZGJ1cy1ydW4tc2Vzc2lvbjwvcmVmbmFtZT4KKzxyZWZwdXJwb3NlPnN0YXJ0IGEgcHJvY2VzcyBhcyBhIG5ldyBELUJ1cyBzZXNzaW9uPC9yZWZwdXJwb3NlPgorPC9yZWZuYW1lZGl2PgorPCEtLSBib2R5IGJlZ2lucyBoZXJlIC0tPgorPHJlZnN5bm9wc2lzZGl2IGlkPSdzeW5vcHNpcyc+Cis8Y21kc3lub3BzaXM+CisgIDxjb21tYW5kPmRidXMtcnVuLXNlc3Npb248L2NvbW1hbmQ+CisgICAgPGFyZyBjaG9pY2U9J29wdCc+PGFyZyBjaG9pY2U9J3BsYWluJz4tLWNvbmZpZy1maWxlIDwvYXJnPjxhcmcgY2hvaWNlPSdwbGFpbic+PHJlcGxhY2VhYmxlPkZJTEVOQU1FPC9yZXBsYWNlYWJsZT48L2FyZz48L2FyZz4KKyAgICA8YXJnIGNob2ljZT0nb3B0Jz48YXJnIGNob2ljZT0ncGxhaW4nPi0tZGJ1cy1kYWVtb24gPC9hcmc+PGFyZyBjaG9pY2U9J3BsYWluJz48cmVwbGFjZWFibGU+QklOQVJZPC9yZXBsYWNlYWJsZT48L2FyZz48L2FyZz4KKyAgICA8YXJnIGNob2ljZT0nb3B0Jz4tLSA8L2FyZz4KKyAgICA8YXJnIGNob2ljZT0ncGxhaW4nPjxyZXBsYWNlYWJsZT5QUk9HUkFNPC9yZXBsYWNlYWJsZT48L2FyZz4KKyAgICA8YXJnIGNob2ljZT0nb3B0JyByZXA9J3JlcGVhdCc+PHJlcGxhY2VhYmxlPkFSR1VNRU5UUzwvcmVwbGFjZWFibGU+PC9hcmc+Cis8L2NtZHN5bm9wc2lzPgorPGNtZHN5bm9wc2lzPgorICA8Y29tbWFuZD5kYnVzLXJ1bi1zZXNzaW9uPC9jb21tYW5kPiAgICA8YXJnIGNob2ljZT0ncGxhaW4nPi0taGVscCA8L2FyZz4KKzwvY21kc3lub3BzaXM+Cis8Y21kc3lub3BzaXM+CisgIDxjb21tYW5kPmRidXMtcnVuLXNlc3Npb248L2NvbW1hbmQ+ICAgIDxhcmcgY2hvaWNlPSdwbGFpbic+LS12ZXJzaW9uIDwvYXJnPgorPC9jbWRzeW5vcHNpcz4KKzwvcmVmc3lub3BzaXNkaXY+CisKKworPHJlZnNlY3QxIGlkPSdkZXNjcmlwdGlvbic+PHRpdGxlPkRFU0NSSVBUSU9OPC90aXRsZT4KKzxwYXJhPjxjb21tYW5kPmRidXMtcnVuLXNlc3Npb248L2NvbW1hbmQ+CitpcyB1c2VkIHRvIHN0YXJ0IGEgc2Vzc2lvbiBidXMgaW5zdGFuY2Ugb2YKKzxlbXBoYXNpcyByZW1hcD0nQic+ZGJ1cy1kYWVtb248L2VtcGhhc2lzPgorZnJvbSBhIHNoZWxsIHNjcmlwdCwgYW5kIHN0YXJ0IGEgc3BlY2lmaWVkIHByb2dyYW0gaW4gdGhhdCBzZXNzaW9uLiBUaGUKKzxlbXBoYXNpcyByZW1hcD0nQic+ZGJ1cy1kYWVtb248L2VtcGhhc2lzPgord2lsbCBydW4gZm9yIGFzIGxvbmcgYXMgdGhlIHByb2dyYW0gZG9lcywgYWZ0ZXIgd2hpY2ggaXQgd2lsbCB0ZXJtaW5hdGUuPC9wYXJhPgorCis8cGFyYT5PbmUgdXNlIGlzIHRvIHJ1biBhIHNoZWxsIHdpdGggaXRzIG93bgorPGVtcGhhc2lzIHJlbWFwPSdCJz5kYnVzLWRhZW1vbjwvZW1waGFzaXM+CitpbiBhIHRleHQmaHlwaGVuO21vZGUgb3IgU1NIIHNlc3Npb24sIGFuZCBoYXZlIHRoZQorPGVtcGhhc2lzIHJlbWFwPSdCJz5kYnVzLWRhZW1vbjwvZW1waGFzaXM+Cit0ZXJtaW5hdGUgYXV0b21hdGljYWxseSBvbiBsZWF2aW5nIHRoZSBzdWImaHlwaGVuO3NoZWxsLCBsaWtlIHRoaXM6PC9wYXJhPgorCis8cGFyYT4gICAgZGJ1cy1ydW4tc2Vzc2lvbiAtLSBiYXNoPC9wYXJhPgorCis8cGFyYT5vciB0byByZXBsYWNlIHRoZSBsb2dpbiBzaGVsbCBhbHRvZ2V0aGVyLCBieSBjb21iaW5pbmcgPGNvbW1hbmQ+ZGJ1cy1ydW4tc2Vzc2lvbjwvY29tbWFuZD4KK3dpdGggdGhlIDxlbXBoYXNpcyByZW1hcD0nQic+ZXhlYzwvZW1waGFzaXM+IGJ1aWx0aW46PC9wYXJhPgorCis8cGFyYT4gICAgZXhlYyBkYnVzLXJ1bi1zZXNzaW9uIC0tIGJhc2g8L3BhcmE+CisKKzxwYXJhPkFub3RoZXIgdXNlIGlzIHRvIHJ1biByZWdyZXNzaW9uIHRlc3RzIGFuZCBzaW1pbGFyIHRoaW5ncyBpbiBhbiBpc29sYXRlZAorRC1CdXMgc2Vzc2lvbiwgdG8gYXZvaWQgZWl0aGVyIGludGVyZmVyaW5nIHdpdGggdGhlICJyZWFsIiBELUJ1cyBzZXNzaW9uCitvciByZWx5aW5nIG9uIHRoZXJlIGFscmVhZHkgYmVpbmcgYSBELUJ1cyBzZXNzaW9uIGFjdGl2ZSwgZm9yIGluc3RhbmNlOjwvcGFyYT4KKworPHBhcmE+ICAgIGRidXMtcnVuLXNlc3Npb24gLS0gbWFrZSBjaGVjazwvcGFyYT4KKworPHBhcmE+b3IgKGluCis8Y2l0ZXJlZmVudHJ5PjxyZWZlbnRyeXRpdGxlPmF1dG9tYWtlPC9yZWZlbnRyeXRpdGxlPjxtYW52b2xudW0+MTwvbWFudm9sbnVtPjwvY2l0ZXJlZmVudHJ5Pik6PC9wYXJhPgorCis8bGl0ZXJhbGxheW91dCByZW1hcD0nLm5mJz4KKyAgQU1fVEVTVFNfRU5WSVJPTk1FTlQgPSBleHBvcnQgTVlfREVCVUc9YWxsOworICBMT0dfQ09NUElMRVIgPSBkYnVzLXJ1bi1zZXNzaW9uCisgIEFNX0xPR19GTEFHUyA9IC0tCis8L2xpdGVyYWxsYXlvdXQ+PC9yZWZzZWN0MT4KKworPHJlZnNlY3QxIGlkPSdvcHRpb25zJz48dGl0bGU+T1BUSU9OUzwvdGl0bGU+Cis8dmFyaWFibGVsaXN0IHJlbWFwPSdUUCc+CisgIDx2YXJsaXN0ZW50cnk+CisgIDx0ZXJtPjxvcHRpb24+LS1jb25maWctZmlsZT08L29wdGlvbj48cmVwbGFjZWFibGU+RklMRU5BTUU8L3JlcGxhY2VhYmxlPiwgPG9wdGlvbj4tLWNvbmZpZy1maWxlPC9vcHRpb24+IDxyZXBsYWNlYWJsZT5GSUxFTkFNRTwvcmVwbGFjZWFibGU+PC90ZXJtPgorICA8bGlzdGl0ZW0+Cis8cGFyYT5QYXNzCis8b3B0aW9uPi0tY29uZmlnLWZpbGU9PC9vcHRpb24+PHJlcGxhY2VhYmxlPkZJTEVOQU1FPC9yZXBsYWNlYWJsZT4KK3RvIHRoZSBidXMgZGFlbW9uLCBpbnN0ZWFkIG9mIHBhc3NpbmcgaXQgdGhlCis8b3B0aW9uPi0tc2Vzc2lvbjwvb3B0aW9uPgorYXJndW1lbnQuIFNlZQorPGNpdGVyZWZlbnRyeT48cmVmZW50cnl0aXRsZT5kYnVzLWRhZW1vbjwvcmVmZW50cnl0aXRsZT48bWFudm9sbnVtPjE8L21hbnZvbG51bT48L2NpdGVyZWZlbnRyeT4uPC9wYXJhPgorICA8L2xpc3RpdGVtPgorICA8L3Zhcmxpc3RlbnRyeT4KKyAgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PG9wdGlvbj4tLWRidXMtZGFlbW9uPTwvb3B0aW9uPjxyZXBsYWNlYWJsZT5CSU5BUlk8L3JlcGxhY2VhYmxlPiwgPG9wdGlvbj4tLWRidXMtZGFlbW9uPC9vcHRpb24+IDxyZXBsYWNlYWJsZT5CSU5BUlk8L3JlcGxhY2VhYmxlPjwvdGVybT4KKyAgPGxpc3RpdGVtPgorPHBhcmE+UnVuIDxlbXBoYXNpcyByZW1hcD0nSSc+QklOQVJZPC9lbXBoYXNpcz4gYXMgPGNpdGVyZWZlbnRyeT48cmVmZW50cnl0aXRsZT5kYnVzLWRhZW1vbjwvcmVmZW50cnl0aXRsZT48bWFudm9sbnVtPjE8L21hbnZvbG51bT48L2NpdGVyZWZlbnRyeT4sIGluc3RlYWQgb2Ygc2VhcmNoaW5nIHRoZSA8ZW52YXI+UEFUSDwvZW52YXI+CitpbiB0aGUgdXN1YWwgd2F5IGZvciBhbiBleGVjdXRhYmxlIGNhbGxlZCA8ZW1waGFzaXMgcmVtYXA9J0InPmRidXMtZGFlbW9uPC9lbXBoYXNpcz4uPC9wYXJhPgorICA8L2xpc3RpdGVtPgorICA8L3Zhcmxpc3RlbnRyeT4KKyAgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PG9wdGlvbj4tLWhlbHA8L29wdGlvbj48L3Rlcm0+CisgIDxsaXN0aXRlbT4KKzxwYXJhPlByaW50IHVzYWdlIGluZm9ybWF0aW9uIGFuZCBleGl0LjwvcGFyYT4KKyAgPC9saXN0aXRlbT4KKyAgPC92YXJsaXN0ZW50cnk+CisgIDx2YXJsaXN0ZW50cnk+CisgIDx0ZXJtPjxvcHRpb24+LS12ZXJzaW9uPC9vcHRpb24+PC90ZXJtPgorICA8bGlzdGl0ZW0+Cis8cGFyYT5QcmludCB0aGUgdmVyc2lvbiBvZiBkYnVzLXJ1bi1zZXNzaW9uIGFuZCBleGl0LjwvcGFyYT4KKyAgPC9saXN0aXRlbT4KKyAgPC92YXJsaXN0ZW50cnk+Cis8L3ZhcmlhYmxlbGlzdD4KKzwvcmVmc2VjdDE+CisKKzxyZWZzZWN0MSBpZD0nZXhpdF9zdGF0dXMnPjx0aXRsZT5FWElUIFNUQVRVUzwvdGl0bGU+Cis8cGFyYT48Y29tbWFuZD5kYnVzLXJ1bi1zZXNzaW9uPC9jb21tYW5kPgorZXhpdHMgd2l0aCB0aGUgZXhpdCBzdGF0dXMgb2YKKzxlbXBoYXNpcyByZW1hcD0nSSc+UFJPR1JBTTwvZW1waGFzaXM+LAorMCBpZiB0aGUKKzxvcHRpb24+LS1oZWxwPC9vcHRpb24+IG9yIDxvcHRpb24+LS12ZXJzaW9uPC9vcHRpb24+CitvcHRpb25zIHdlcmUgdXNlZCwgMTI3IG9uIGFuIGVycm9yIHdpdGhpbgorPGNvbW1hbmQ+ZGJ1cy1ydW4tc2Vzc2lvbjwvY29tbWFuZD4KK2l0c2VsZiwgb3IKKzEyOCs8ZW1waGFzaXMgcmVtYXA9J0knPm48L2VtcGhhc2lzPgoraWYgdGhlCis8ZW1waGFzaXMgcmVtYXA9J0knPlBST0dSQU08L2VtcGhhc2lzPgord2FzIGtpbGxlZCBieSBzaWduYWwKKzxlbXBoYXNpcyByZW1hcD0nSSc+bjwvZW1waGFzaXM+LjwvcGFyYT4KKzwvcmVmc2VjdDE+CisKKzxyZWZzZWN0MSBpZD0nZW52aXJvbm1lbnQnPjx0aXRsZT5FTlZJUk9OTUVOVDwvdGl0bGU+Cis8cGFyYT48ZW52YXI+UEFUSDwvZW52YXI+CitpcyBzZWFyY2hlZCB0byBmaW5kCis8ZW1waGFzaXMgcmVtYXA9J0knPlBST0dSQU08L2VtcGhhc2lzPiwKK2FuZCAoaWYgdGhlIC0tZGJ1cy1kYWVtb24gb3B0aW9uIGlzIG5vdCB1c2VkIG9yIGl0cyBhcmd1bWVudCBkb2VzIG5vdAorY29udGFpbiBhCis8ZW1waGFzaXMgcmVtYXA9J0InPi88L2VtcGhhc2lzPiBjaGFyYWN0ZXIpIHRvIGZpbmQgPGVtcGhhc2lzIHJlbWFwPSdCJz5kYnVzLWRhZW1vbjwvZW1waGFzaXM+LjwvcGFyYT4KKworPHBhcmE+VGhlIHNlc3Npb24gYnVzJyBhZGRyZXNzIGlzIG1hZGUgYXZhaWxhYmxlIHRvCis8ZW1waGFzaXMgcmVtYXA9J0knPlBST0dSQU08L2VtcGhhc2lzPgoraW4gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlCis8ZW1waGFzaXMgcmVtYXA9J0InPkRCVVNfU0VTU0lPTl9CVVNfQUREUkVTUzwvZW1waGFzaXM+LjwvcGFyYT4KKworPHBhcmE+VGhlIHZhcmlhYmxlcworICA8ZW1waGFzaXMgcmVtYXA9J0InPkRCVVNfU0VTU0lPTl9CVVNfUElEPC9lbXBoYXNpcz4sCisgIDxlbXBoYXNpcyByZW1hcD0nQic+REJVU19TRVNTSU9OX0JVU19XSU5ET1dJRDwvZW1waGFzaXM+LAorICA8ZW1waGFzaXMgcmVtYXA9J0InPkRCVVNfU1RBUlRFUl9CVVNfVFlQRTwvZW1waGFzaXM+IGFuZAorICA8ZW1waGFzaXMgcmVtYXA9J0InPkRCVVNfU1RBUlRFUl9BRERSRVNTPC9lbXBoYXNpcz4KKyAgYXJlIHJlbW92ZWQgZnJvbSB0aGUgZW52aXJvbm1lbnQsIGlmIHByZXNlbnQuPC9wYXJhPgorPC9yZWZzZWN0MT4KKworPHJlZnNlY3QxIGlkPSdidWdzJz48dGl0bGU+QlVHUzwvdGl0bGU+Cis8cGFyYT5QbGVhc2Ugc2VuZCBidWcgcmVwb3J0cyB0byB0aGUgRC1CdXMgbWFpbGluZyBsaXN0IG9yIGJ1ZyB0cmFja2VyLAorc2VlIDx1bGluayB1cmw9J2h0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3NvZnR3YXJlL2RidXMvJz5odHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zb2Z0d2FyZS9kYnVzLzwvdWxpbms+PC9wYXJhPgorPC9yZWZzZWN0MT4KKworPHJlZnNlY3QxIGlkPSdzZWVfYWxzbyc+PHRpdGxlPlNFRSBBTFNPPC90aXRsZT4KKzxwYXJhPjxjaXRlcmVmZW50cnk+PHJlZmVudHJ5dGl0bGU+ZGJ1cy1kYWVtb248L3JlZmVudHJ5dGl0bGU+PG1hbnZvbG51bT4xPC9tYW52b2xudW0+PC9jaXRlcmVmZW50cnk+LAorPGNpdGVyZWZlbnRyeT48cmVmZW50cnl0aXRsZT5kYnVzLWxhdW5jaDwvcmVmZW50cnl0aXRsZT48bWFudm9sbnVtPjE8L21hbnZvbG51bT48L2NpdGVyZWZlbnRyeT48L3BhcmE+Cis8L3JlZnNlY3QxPgorPC9yZWZlbnRyeT4KZGlmZiAtLWdpdCBhL2RvYy9kYnVzLXNlbmQuMS54bWwuaW4gYi9kb2MvZGJ1cy1zZW5kLjEueG1sLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0YzRiOTkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZGJ1cy1zZW5kLjEueG1sLmluCkBAIC0wLDAgKzEsMTcwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+Cis8IURPQ1RZUEUgcmVmZW50cnkgUFVCTElDICItLy9PQVNJUy8vRFREIERvY0Jvb2sgWE1MIFY0LjQvL0VOIgorICAgICAgICAgICAgICAgICAgICJodHRwOi8vd3d3Lm9hc2lzLW9wZW4ub3JnL2RvY2Jvb2sveG1sLzQuNC9kb2Nib29reC5kdGQiPgorPHJlZmVudHJ5IGlkPSdkYnVzc2VuZDEnPgorCis8IS0tICBkYnVzJmJzb2w7LXNlbmQgbWFudWFsIHBhZ2UuCisgQ29weXJpZ2h0IChDKSAyMDAzIFJlZCBIYXQsIEluYy4gLS0+CisKKzxyZWZtZXRhPgorPHJlZmVudHJ5dGl0bGU+ZGJ1cy1zZW5kPC9yZWZlbnRyeXRpdGxlPgorPG1hbnZvbG51bT4xPC9tYW52b2xudW0+Cis8cmVmbWlzY2luZm8gY2xhc3M9Im1hbnVhbCI+VXNlciBDb21tYW5kczwvcmVmbWlzY2luZm8+Cis8cmVmbWlzY2luZm8gY2xhc3M9InNvdXJjZSI+RC1CdXM8L3JlZm1pc2NpbmZvPgorPHJlZm1pc2NpbmZvIGNsYXNzPSJ2ZXJzaW9uIj5AREJVU19WRVJTSU9OQDwvcmVmbWlzY2luZm8+Cis8L3JlZm1ldGE+Cis8cmVmbmFtZWRpdj4KKzxyZWZuYW1lPmRidXMtc2VuZDwvcmVmbmFtZT4KKzxyZWZwdXJwb3NlPlNlbmQgYSBtZXNzYWdlIHRvIGEgbWVzc2FnZSBidXM8L3JlZnB1cnBvc2U+Cis8L3JlZm5hbWVkaXY+Cis8IS0tIGJvZHkgYmVnaW5zIGhlcmUgLS0+Cis8cmVmc3lub3BzaXNkaXYgaWQ9J3N5bm9wc2lzJz4KKzxjbWRzeW5vcHNpcz4KKyAgPGNvbW1hbmQ+ZGJ1cy1zZW5kPC9jb21tYW5kPgorICA8Z3JvdXAgY2hvaWNlPSdvcHQnPjxhcmcgY2hvaWNlPSdwbGFpbic+LS1zeXN0ZW0gPC9hcmc+PGFyZyBjaG9pY2U9J3BsYWluJz4tLXNlc3Npb24gPC9hcmc+PGFyZyBjaG9pY2U9J3BsYWluJz4tLWJ1cz08cmVwbGFjZWFibGU+QUREUkVTUzwvcmVwbGFjZWFibGU+PC9hcmc+PGFyZyBjaG9pY2U9J3BsYWluJz4tLXBlZXI9PHJlcGxhY2VhYmxlPkFERFJFU1M8L3JlcGxhY2VhYmxlPjwvYXJnPjwvZ3JvdXA+CisgICAgPGFyZyBjaG9pY2U9J29wdCc+LS1kZXN0PTxyZXBsYWNlYWJsZT5OQU1FPC9yZXBsYWNlYWJsZT48L2FyZz4KKyAgICA8YXJnIGNob2ljZT0nb3B0Jz48YXJnIGNob2ljZT0ncGxhaW4nPi0tcHJpbnQtcmVwbHkgPC9hcmc+PGFyZyBjaG9pY2U9J29wdCc+PHJlcGxhY2VhYmxlPj1saXRlcmFsPC9yZXBsYWNlYWJsZT48L2FyZz48L2FyZz4KKyAgICA8YXJnIGNob2ljZT0nb3B0Jz4tLXJlcGx5LXRpbWVvdXQ9PHJlcGxhY2VhYmxlPk1TRUM8L3JlcGxhY2VhYmxlPjwvYXJnPgorICAgIDxhcmcgY2hvaWNlPSdvcHQnPi0tdHlwZT08cmVwbGFjZWFibGU+VFlQRTwvcmVwbGFjZWFibGU+PC9hcmc+CisgICAgPGFyZyBjaG9pY2U9J3BsYWluJz48cmVwbGFjZWFibGU+T0JKRUNUX1BBVEg8L3JlcGxhY2VhYmxlPjwvYXJnPgorICAgIDxhcmcgY2hvaWNlPSdwbGFpbic+PHJlcGxhY2VhYmxlPklOVEVSRkFDRS5NRU1CRVI8L3JlcGxhY2VhYmxlPjwvYXJnPgorICAgIDxhcmcgY2hvaWNlPSdvcHQnIHJlcD0ncmVwZWF0Jz48cmVwbGFjZWFibGU+Q09OVEVOVFM8L3JlcGxhY2VhYmxlPjwvYXJnPgorICAgIDxzYnIvPgorPC9jbWRzeW5vcHNpcz4KKzwvcmVmc3lub3BzaXNkaXY+CisKKworPHJlZnNlY3QxIGlkPSdkZXNjcmlwdGlvbic+PHRpdGxlPkRFU0NSSVBUSU9OPC90aXRsZT4KKzxwYXJhPlRoZSA8Y29tbWFuZD5kYnVzLXNlbmQ8L2NvbW1hbmQ+IGNvbW1hbmQgaXMgdXNlZCB0byBzZW5kIGEgbWVzc2FnZSB0byBhIEQtQnVzIG1lc3NhZ2UKK2J1cy4gU2VlIDx1bGluayB1cmw9J2h0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3NvZnR3YXJlL2RidXMvJz5odHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zb2Z0d2FyZS9kYnVzLzwvdWxpbms+IGZvciBtb3JlCitpbmZvcm1hdGlvbiBhYm91dCB0aGUgYmlnIHBpY3R1cmUuPC9wYXJhPgorCisKKzxwYXJhPlRoZXJlIGFyZSB0d28gd2VsbC1rbm93biBtZXNzYWdlIGJ1c2VzOiB0aGUgc3lzdGVtd2lkZSBtZXNzYWdlIGJ1cworKGluc3RhbGxlZCBvbiBtYW55IHN5c3RlbXMgYXMgdGhlICJtZXNzYWdlYnVzIiBzZXJ2aWNlKSBhbmQgdGhlCitwZXItdXNlci1sb2dpbi1zZXNzaW9uIG1lc3NhZ2UgYnVzIChzdGFydGVkIGVhY2ggdGltZSBhIHVzZXIgbG9ncyBpbikuCitUaGUgPG9wdGlvbj4tLXN5c3RlbTwvb3B0aW9uPiBhbmQgPG9wdGlvbj4tLXNlc3Npb248L29wdGlvbj4gb3B0aW9ucyBkaXJlY3QKKzxjb21tYW5kPmRidXMtc2VuZDwvY29tbWFuZD4gdG8gc2VuZCBtZXNzYWdlcyB0byB0aGUgc3lzdGVtIG9yIHNlc3Npb24gYnVzZXMgcmVzcGVjdGl2ZWx5LgorSWYgbmVpdGhlciBpcyBzcGVjaWZpZWQsIDxjb21tYW5kPmRidXMtc2VuZDwvY29tbWFuZD4gc2VuZHMgdG8gdGhlIHNlc3Npb24gYnVzLjwvcGFyYT4KKworCis8cGFyYT5OZWFybHkgYWxsIHVzZXMgb2YgPGNvbW1hbmQ+ZGJ1cy1zZW5kPC9jb21tYW5kPiBtdXN0IHByb3ZpZGUgdGhlIDxvcHRpb24+LS1kZXN0PC9vcHRpb24+IGFyZ3VtZW50Cit3aGljaCBpcyB0aGUgbmFtZSBvZiBhIGNvbm5lY3Rpb24gb24gdGhlIGJ1cyB0byBzZW5kIHRoZSBtZXNzYWdlIHRvLiBJZgorPG9wdGlvbj4tLWRlc3Q8L29wdGlvbj4gaXMgb21pdHRlZCwgbm8gZGVzdGluYXRpb24gaXMgc2V0LjwvcGFyYT4KKworCis8cGFyYT5UaGUgb2JqZWN0IHBhdGggYW5kIHRoZSBuYW1lIG9mIHRoZSBtZXNzYWdlIHRvIHNlbmQgbXVzdCBhbHdheXMgYmUKK3NwZWNpZmllZC4gRm9sbG93aW5nIGFyZ3VtZW50cywgaWYgYW55LCBhcmUgdGhlIG1lc3NhZ2UgY29udGVudHMKKyhtZXNzYWdlIGFyZ3VtZW50cykuICBUaGVzZSBhcmUgZ2l2ZW4gYXMgdHlwZS1zcGVjaWZpZWQgdmFsdWVzIGFuZAorbWF5IGluY2x1ZGUgY29udGFpbmVycyAoYXJyYXlzLCBkaWN0cywgYW5kIHZhcmlhbnRzKSBhcyBkZXNjcmliZWQgYmVsb3cuPC9wYXJhPgorCis8bGl0ZXJhbGxheW91dCByZW1hcD0nLm5mJz4KKyZsdDtjb250ZW50cyZndDsgICA6Oj0gJmx0O2l0ZW0mZ3Q7IHwgJmx0O2NvbnRhaW5lciZndDsgWyAmbHQ7aXRlbSZndDsgfCAmbHQ7Y29udGFpbmVyJmd0Oy4uLl0KKyZsdDtpdGVtJmd0OyAgICAgICA6Oj0gJmx0O3R5cGUmZ3Q7OiZsdDt2YWx1ZSZndDsKKyZsdDtjb250YWluZXImZ3Q7ICA6Oj0gJmx0O2FycmF5Jmd0OyB8ICZsdDtkaWN0Jmd0OyB8ICZsdDt2YXJpYW50Jmd0OworJmx0O2FycmF5Jmd0OyAgICAgIDo6PSBhcnJheTombHQ7dHlwZSZndDs6Jmx0O3ZhbHVlJmd0O1ssJmx0O3ZhbHVlJmd0Oy4uLl0KKyZsdDtkaWN0Jmd0OyAgICAgICA6Oj0gZGljdDombHQ7dHlwZSZndDs6Jmx0O3R5cGUmZ3Q7OiZsdDtrZXkmZ3Q7LCZsdDt2YWx1ZSZndDtbLCZsdDtrZXkmZ3Q7LCZsdDt2YWx1ZSZndDsuLi5dCismbHQ7dmFyaWFudCZndDsgICAgOjo9IHZhcmlhbnQ6Jmx0O3R5cGUmZ3Q7OiZsdDt2YWx1ZSZndDsKKyZsdDt0eXBlJmd0OyAgICAgICA6Oj0gc3RyaW5nIHwgaW50MTYgfCB1aW50MTYgfCBpbnQzMiB8IHVpbnQzMiB8IGludDY0IHwgdWludDY0IHwgZG91YmxlIHwgYnl0ZSB8IGJvb2xlYW4gfCBvYmpwYXRoCis8L2xpdGVyYWxsYXlvdXQ+IDwhLS0gLmZpIC0tPgorCis8cGFyYT5ELUJ1cyBzdXBwb3J0cyBtb3JlIHR5cGVzIHRoYW4gdGhlc2UsIGJ1dCA8Y29tbWFuZD5kYnVzLXNlbmQ8L2NvbW1hbmQ+IGN1cnJlbnRseQorZG9lcyBub3QuICBBbHNvLCA8Y29tbWFuZD5kYnVzLXNlbmQ8L2NvbW1hbmQ+IGRvZXMgbm90IHBlcm1pdCBlbXB0eSBjb250YWluZXJzCitvciBuZXN0ZWQgY29udGFpbmVycyAoZS5nLiBhcnJheXMgb2YgdmFyaWFudHMpLjwvcGFyYT4KKworCis8cGFyYT5IZXJlIGlzIGFuIGV4YW1wbGUgaW52b2NhdGlvbjo8L3BhcmE+Cis8bGl0ZXJhbGxheW91dCByZW1hcD0nLm5mJz4KKworICBkYnVzLXNlbmQgLS1kZXN0PW9yZy5mcmVlZGVza3RvcC5FeGFtcGxlTmFtZSAgICAgICAgICAgICAgICZic29sOworICAgICAgICAgICAgL29yZy9mcmVlZGVza3RvcC9zYW1wbGUvb2JqZWN0L25hbWUgICAgICAgICAgICAgICZic29sOworICAgICAgICAgICAgb3JnLmZyZWVkZXNrdG9wLkV4YW1wbGVJbnRlcmZhY2UuRXhhbXBsZU1ldGhvZCAgICZic29sOworICAgICAgICAgICAgaW50MzI6NDcgc3RyaW5nOidoZWxsbyB3b3JsZCcgZG91YmxlOjY1LjMyICAgICAgICZic29sOworICAgICAgICAgICAgYXJyYXk6c3RyaW5nOiIxc3QgaXRlbSIsIm5leHQgaXRlbSIsImxhc3QgaXRlbSIgICZic29sOworICAgICAgICAgICAgZGljdDpzdHJpbmc6aW50MzI6Im9uZSIsMSwidHdvIiwyLCJ0aHJlZSIsMyAgICAgICZic29sOworICAgICAgICAgICAgdmFyaWFudDppbnQzMjotOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZic29sOworICAgICAgICAgICAgb2JqcGF0aDovb3JnL2ZyZWVkZXNrdG9wL3NhbXBsZS9vYmplY3QvbmFtZQorCis8L2xpdGVyYWxsYXlvdXQ+IDwhLS0gLmZpIC0tPgorCis8cGFyYT5Ob3RlIHRoYXQgdGhlIGludGVyZmFjZSBpcyBzZXBhcmF0ZWQgZnJvbSBhIG1ldGhvZCBvciBzaWduYWwKK25hbWUgYnkgYSBkb3QsIHRob3VnaCBpbiB0aGUgYWN0dWFsIHByb3RvY29sIHRoZSBpbnRlcmZhY2UKK2FuZCB0aGUgaW50ZXJmYWNlIG1lbWJlciBhcmUgc2VwYXJhdGUgZmllbGRzLjwvcGFyYT4KKworPC9yZWZzZWN0MT4KKworPHJlZnNlY3QxIGlkPSdvcHRpb25zJz48dGl0bGU+T1BUSU9OUzwvdGl0bGU+Cis8cGFyYT5UaGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIHN1cHBvcnRlZDo8L3BhcmE+Cis8dmFyaWFibGVsaXN0IHJlbWFwPSdUUCc+CisgIDx2YXJsaXN0ZW50cnk+CisgIDx0ZXJtPjxvcHRpb24+LS1kZXN0PTwvb3B0aW9uPjxyZXBsYWNlYWJsZT5OQU1FPC9yZXBsYWNlYWJsZT48L3Rlcm0+CisgIDxsaXN0aXRlbT4KKzxwYXJhPlNwZWNpZnkgdGhlIG5hbWUgb2YgdGhlIGNvbm5lY3Rpb24gdG8gcmVjZWl2ZSB0aGUgbWVzc2FnZS48L3BhcmE+CisgIDwvbGlzdGl0ZW0+CisgIDwvdmFybGlzdGVudHJ5PgorICA8dmFybGlzdGVudHJ5PgorICA8dGVybT48b3B0aW9uPi0tcHJpbnQtcmVwbHk8L29wdGlvbj48L3Rlcm0+CisgIDxsaXN0aXRlbT4KKzxwYXJhPkJsb2NrIGZvciBhIHJlcGx5IHRvIHRoZSBtZXNzYWdlIHNlbnQsIGFuZCBwcmludCBhbnkgcmVwbHkgcmVjZWl2ZWQKK2luIGEgaHVtYW4tcmVhZGFibGUgZm9ybS4gSXQgYWxzbyBtZWFucyB0aGUgbWVzc2FnZSB0eXBlICg8b3B0aW9uPi0tdHlwZT08L29wdGlvbj4pIGlzIDxlbXBoYXNpcyByZW1hcD0nQic+bWV0aG9kX2NhbGw8L2VtcGhhc2lzPi48L3BhcmE+CisgIDwvbGlzdGl0ZW0+CisgIDwvdmFybGlzdGVudHJ5PgorICA8dmFybGlzdGVudHJ5PgorICA8dGVybT48b3B0aW9uPi0tcHJpbnQtcmVwbHk9bGl0ZXJhbDwvb3B0aW9uPjwvdGVybT4KKyAgPGxpc3RpdGVtPgorPHBhcmE+QmxvY2sgZm9yIGEgcmVwbHkgdG8gdGhlIG1lc3NhZ2Ugc2VudCwgYW5kIHByaW50IHRoZSBib2R5IG9mIHRoZQorcmVwbHkuIElmIHRoZSByZXBseSBpcyBhbiBvYmplY3QgcGF0aCBvciBhIHN0cmluZywgaXQgaXMgcHJpbnRlZAorbGl0ZXJhbGx5LCB3aXRoIG5vIHB1bmN0dWF0aW9uLCBlc2NhcGUgY2hhcmFjdGVycyBldGMuPC9wYXJhPgorICA8L2xpc3RpdGVtPgorICA8L3Zhcmxpc3RlbnRyeT4KKyAgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PG9wdGlvbj4tLXJlcGx5LXRpbWVvdXQ9PC9vcHRpb24+PHJlcGxhY2VhYmxlPk1TRUM8L3JlcGxhY2VhYmxlPjwvdGVybT4KKyAgPGxpc3RpdGVtPgorPHBhcmE+V2FpdCBmb3IgYSByZXBseSBmb3IgdXAgdG8gPGVtcGhhc2lzIHJlbWFwPSdJJz5NU0VDPC9lbXBoYXNpcz4gbWlsbGlzZWNvbmRzLgorVGhlIGRlZmF1bHQgaXMgaW1wbGVtZW50YXRpb24maHlwaGVuO2RlZmluZWQsIHR5cGljYWxseSAyNSBzZWNvbmRzLjwvcGFyYT4KKyAgPC9saXN0aXRlbT4KKyAgPC92YXJsaXN0ZW50cnk+CisgIDx2YXJsaXN0ZW50cnk+CisgIDx0ZXJtPjxvcHRpb24+LS1zeXN0ZW08L29wdGlvbj48L3Rlcm0+CisgIDxsaXN0aXRlbT4KKzxwYXJhPlNlbmQgdG8gdGhlIHN5c3RlbSBtZXNzYWdlIGJ1cy48L3BhcmE+CisgIDwvbGlzdGl0ZW0+CisgIDwvdmFybGlzdGVudHJ5PgorICA8dmFybGlzdGVudHJ5PgorICA8dGVybT48b3B0aW9uPi0tc2Vzc2lvbjwvb3B0aW9uPjwvdGVybT4KKyAgPGxpc3RpdGVtPgorPHBhcmE+U2VuZCB0byB0aGUgc2Vzc2lvbiBtZXNzYWdlIGJ1cy4gIChUaGlzIGlzIHRoZSBkZWZhdWx0Lik8L3BhcmE+CisgIDwvbGlzdGl0ZW0+CisgIDwvdmFybGlzdGVudHJ5PgorICA8dmFybGlzdGVudHJ5PgorICA8dGVybT48b3B0aW9uPi0tYnVzPTwvb3B0aW9uPjxyZXBsYWNlYWJsZT5BRERSRVNTPC9yZXBsYWNlYWJsZT48L3Rlcm0+CisgIDxsaXN0aXRlbT4KKzxwYXJhPlJlZ2lzdGVyIG9uIGEgbWVzc2FnZSBidXMgYXQgPHJlcGxhY2VhYmxlPkFERFJFU1M8L3JlcGxhY2VhYmxlPiwgdHlwaWNhbGx5IGEgPGNvbW1hbmQ+ZGJ1cy1kYWVtb248L2NvbW1hbmQ+LjwvcGFyYT4KKyAgPC9saXN0aXRlbT4KKyAgPC92YXJsaXN0ZW50cnk+CisgIDx2YXJsaXN0ZW50cnk+CisgIDx0ZXJtPjxvcHRpb24+LS1wZWVyPTwvb3B0aW9uPjxyZXBsYWNlYWJsZT5BRERSRVNTPC9yZXBsYWNlYWJsZT48L3Rlcm0+CisgIDxsaXN0aXRlbT4KKzxwYXJhPlNlbmQgdG8gYSBub24tbWVzc2FnZS1idXMgRC1CdXMgc2VydmVyIGF0IDxyZXBsYWNlYWJsZT5BRERSRVNTPC9yZXBsYWNlYWJsZT4uIEluIHRoaXMgY2FzZSA8Y29tbWFuZD5kYnVzLXNlbmQ8L2NvbW1hbmQ+IHdpbGwgbm90IGNhbGwgdGhlIDxsaXRlcmFsPkhlbGxvPC9saXRlcmFsPiBtZXRob2QuPC9wYXJhPgorICA8L2xpc3RpdGVtPgorICA8L3Zhcmxpc3RlbnRyeT4KKyAgPHZhcmxpc3RlbnRyeT4KKyAgPHRlcm0+PG9wdGlvbj4tLXR5cGU9PC9vcHRpb24+PHJlcGxhY2VhYmxlPlRZUEU8L3JlcGxhY2VhYmxlPjwvdGVybT4KKyAgPGxpc3RpdGVtPgorPHBhcmE+U3BlY2lmeSA8ZW1waGFzaXMgcmVtYXA9J0InPm1ldGhvZF9jYWxsPC9lbXBoYXNpcz4gb3IgPGVtcGhhc2lzIHJlbWFwPSdCJz5zaWduYWw8L2VtcGhhc2lzPiAoZGVmYXVsdHMgdG8gIjxlbXBoYXNpcyByZW1hcD0nQic+c2lnbmFsPC9lbXBoYXNpcz4iKS48L3BhcmE+CisKKyAgPC9saXN0aXRlbT4KKyAgPC92YXJsaXN0ZW50cnk+Cis8L3ZhcmlhYmxlbGlzdD4KKzwvcmVmc2VjdDE+CisKKzxyZWZzZWN0MSBpZD0nYXV0aG9yJz48dGl0bGU+QVVUSE9SPC90aXRsZT4KKzxwYXJhPmRidXMtc2VuZCB3YXMgd3JpdHRlbiBieSBQaGlsaXAgQmx1bmRlbGwuPC9wYXJhPgorCis8L3JlZnNlY3QxPgorCis8cmVmc2VjdDEgaWQ9J2J1Z3MnPjx0aXRsZT5CVUdTPC90aXRsZT4KKzxwYXJhPlBsZWFzZSBzZW5kIGJ1ZyByZXBvcnRzIHRvIHRoZSBELUJ1cyBtYWlsaW5nIGxpc3Qgb3IgYnVnIHRyYWNrZXIsCitzZWUgPHVsaW5rIHVybD0naHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc29mdHdhcmUvZGJ1cy8nPmh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3NvZnR3YXJlL2RidXMvPC91bGluaz48L3BhcmE+Cis8L3JlZnNlY3QxPgorPC9yZWZlbnRyeT4KZGlmZiAtLWdpdCBhL2RvYy9kYnVzLXNwZWNpZmljYXRpb24ueG1sIGIvZG9jL2RidXMtc3BlY2lmaWNhdGlvbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzMzZjBhMAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9kYnVzLXNwZWNpZmljYXRpb24ueG1sCkBAIC0wLDAgKzEsNzAyOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyIgPz4KKzwhRE9DVFlQRSBhcnRpY2xlIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBEb2NCb29rIFhNTCBWNC40Ly9FTiIKKyJodHRwOi8vd3d3Lm9hc2lzLW9wZW4ub3JnL2RvY2Jvb2sveG1sLzQuNC9kb2Nib29reC5kdGQiCitbCitdPgorPGFydGljbGUgaWQ9ImluZGV4Ij4KKyAgPGFydGljbGVpbmZvPgorICAgIDx0aXRsZT5ELUJ1cyBTcGVjaWZpY2F0aW9uPC90aXRsZT4KKyAgICA8cmVsZWFzZWluZm8+VmVyc2lvbiAwLjMyPC9yZWxlYXNlaW5mbz4KKyAgICA8ZGF0ZT4obm90IHlldCByZWxlYXNlZCk8L2RhdGU+CisgICAgPGF1dGhvcmdyb3VwPgorICAgICAgPGF1dGhvcj4KKyAgICAgICAgPGZpcnN0bmFtZT5IYXZvYzwvZmlyc3RuYW1lPgorICAgICAgICA8c3VybmFtZT5QZW5uaW5ndG9uPC9zdXJuYW1lPgorICAgICAgICA8YWZmaWxpYXRpb24+CisgICAgICAgICAgPG9yZ25hbWU+UmVkIEhhdCwgSW5jLjwvb3JnbmFtZT4KKyAgICAgICAgICA8YWRkcmVzcz4KKyAgICAgICAgICAgIDxlbWFpbD5ocEBwb2JveC5jb208L2VtYWlsPgorICAgICAgICAgIDwvYWRkcmVzcz4KKyAgICAgICAgPC9hZmZpbGlhdGlvbj4KKyAgICAgIDwvYXV0aG9yPgorICAgICAgPGF1dGhvcj4KKyAgICAgICAgPGZpcnN0bmFtZT5BbmRlcnM8L2ZpcnN0bmFtZT4KKyAgICAgICAgPHN1cm5hbWU+Q2FybHNzb248L3N1cm5hbWU+CisgICAgICAgIDxhZmZpbGlhdGlvbj4KKyAgICAgICAgICA8b3JnbmFtZT5Db2RlRmFjdG9yeSBBQjwvb3JnbmFtZT4KKyAgICAgICAgICA8YWRkcmVzcz4KKyAgICAgICAgICAgIDxlbWFpbD5hbmRlcnNjYUBjb2RlZmFjdG9yeS5zZTwvZW1haWw+CisgICAgICAgICAgPC9hZGRyZXNzPgorICAgICAgICA8L2FmZmlsaWF0aW9uPgorICAgICAgPC9hdXRob3I+CisgICAgICA8YXV0aG9yPgorICAgICAgICA8Zmlyc3RuYW1lPkFsZXhhbmRlcjwvZmlyc3RuYW1lPgorICAgICAgICA8c3VybmFtZT5MYXJzc29uPC9zdXJuYW1lPgorICAgICAgICA8YWZmaWxpYXRpb24+CisgICAgICAgICAgPG9yZ25hbWU+UmVkIEhhdCwgSW5jLjwvb3JnbmFtZT4KKyAgICAgICAgICA8YWRkcmVzcz4KKyAgICAgICAgICAgIDxlbWFpbD5hbGV4bEByZWRoYXQuY29tPC9lbWFpbD4KKyAgICAgICAgICA8L2FkZHJlc3M+CisgICAgICAgIDwvYWZmaWxpYXRpb24+CisgICAgICA8L2F1dGhvcj4KKyAgICAgIDxhdXRob3I+CisgICAgICAgIDxmaXJzdG5hbWU+U3ZlbjwvZmlyc3RuYW1lPgorICAgICAgICA8c3VybmFtZT5IZXJ6YmVyZzwvc3VybmFtZT4KKyAgICAgICAgPGFmZmlsaWF0aW9uPgorICAgICAgICAgIDxvcmduYW1lPkltZW5kaW8gQUI8L29yZ25hbWU+CisgICAgICAgICAgPGFkZHJlc3M+CisgICAgICAgICAgICA8ZW1haWw+c3ZlbkBpbWVuZGlvLmNvbTwvZW1haWw+CisgICAgICAgICAgPC9hZGRyZXNzPgorICAgICAgICA8L2FmZmlsaWF0aW9uPgorICAgICAgPC9hdXRob3I+CisgICAgICA8YXV0aG9yPgorICAgICAgICA8Zmlyc3RuYW1lPlNpbW9uPC9maXJzdG5hbWU+CisgICAgICAgIDxzdXJuYW1lPk1jVml0dGllPC9zdXJuYW1lPgorICAgICAgICA8YWZmaWxpYXRpb24+CisgICAgICAgICAgPG9yZ25hbWU+Q29sbGFib3JhIEx0ZC48L29yZ25hbWU+CisgICAgICAgICAgPGFkZHJlc3M+CisgICAgICAgICAgICA8ZW1haWw+c21jdkBjb2xsYWJvcmEuY29tPC9lbWFpbD4KKyAgICAgICAgICA8L2FkZHJlc3M+CisgICAgICAgIDwvYWZmaWxpYXRpb24+CisgICAgICA8L2F1dGhvcj4KKyAgICAgIDxhdXRob3I+CisgICAgICAgIDxmaXJzdG5hbWU+RGF2aWQ8L2ZpcnN0bmFtZT4KKyAgICAgICAgPHN1cm5hbWU+WmV1dGhlbjwvc3VybmFtZT4KKyAgICAgICAgPGFmZmlsaWF0aW9uPgorICAgICAgICAgIDxhZGRyZXNzPgorICAgICAgICAgICAgPGVtYWlsPnpldXRoZW5AZ21haWwuY29tPC9lbWFpbD4KKyAgICAgICAgICA8L2FkZHJlc3M+CisgICAgICAgIDwvYWZmaWxpYXRpb24+CisgICAgICA8L2F1dGhvcj4KKyAgICA8L2F1dGhvcmdyb3VwPgorICAgPHJldmhpc3Rvcnk+CisgICAgIDxyZXZpc2lvbj4KKyAgICAgICA8cmV2bnVtYmVyPmxhdGVzdDwvcmV2bnVtYmVyPgorICAgICAgIDxkYXRlPihub3QgeWV0IHJlbGVhc2VkKTwvZGF0ZT4KKyAgICAgICA8YXV0aG9yaW5pdGlhbHM+bi9hPC9hdXRob3Jpbml0aWFscz4KKyAgICAgICA8cmV2cmVtYXJrPgorICAgICAgICAgU2VlIDx1bGluayB1cmw9J2h0dHA6Ly9jZ2l0LmZyZWVkZXNrdG9wLm9yZy9kYnVzL2RidXMvbG9nL2RvYy9kYnVzLXNwZWNpZmljYXRpb24ueG1sJz5jb21taXQgbG9nPC91bGluaz4KKyAgICAgICA8L3JldnJlbWFyaz4KKyAgICAgPC9yZXZpc2lvbj4KKyAgICAgPHJldmlzaW9uPgorICAgICAgIDxyZXZudW1iZXI+MC4zMTwvcmV2bnVtYmVyPgorICAgICAgIDxkYXRlPjIwMTctMDYtMjk8L2RhdGU+CisgICAgICAgPGF1dGhvcmluaXRpYWxzPnNtY3YsIFRHPC9hdXRob3Jpbml0aWFscz4KKyAgICAgICA8cmV2ZGVzY3JpcHRpb24+CisgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICA8bGlzdGl0ZW0+PHNpbXBhcmE+RG9uJ3QgcmVxdWlyZSBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpYyBzZWFyY2gKKyAgICAgICAgICAgICAgIHBhdGhzIHRvIGJlIGxvd2VzdCBwcmlvcml0eTwvc2ltcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICA8bGlzdGl0ZW0+PHNpbXBhcmE+Q29ycmVjdCByZWdleCBzeW50YXggZm9yIG9wdGlvbmFsbHktZXNjYXBlZAorICAgICAgICAgICAgICAgYnl0ZXMgaW4gYWRkcmVzc2VzIHNvIGl0IGluY2x1ZGVzIGh5cGhlbi1taW51cywgZm9yd2FyZCBzbGFzaAorICAgICAgICAgICAgICAgYW5kIHVuZGVyc2NvcmUgYXMgaW50ZW5kZWQ8L3NpbXBhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgPGxpc3RpdGVtPjxzaW1wYXJhPkRlc2NyaWJlIGFsbCBtZXNzYWdlIGJ1cyBtZXRob2RzIGluIHRoZSBzYW1lCisgICAgICAgICAgICAgICBzZWN0aW9uPC9zaW1wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgIDxsaXN0aXRlbT48c2ltcGFyYT5DbGFyaWZ5IHRoZSBjb3JyZWN0IG9iamVjdCBwYXRoIGZvciBtZXRob2QgY2FsbHMKKyAgICAgICAgICAgICAgIHRvIHRoZSBtZXNzYWdlIGJ1czwvc2ltcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICA8bGlzdGl0ZW0+PHNpbXBhcmE+RG9jdW1lbnQgdGhhdCB0aGUgbWVzc2FnZSBidXMgaW1wbGVtZW50cworICAgICAgICAgICAgICAgSW50cm9zcGVjdGFibGUsIFBlZXIgYW5kIFByb3BlcnRpZXM8L3NpbXBhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgPGxpc3RpdGVtPjxzaW1wYXJhPkFkZCBuZXcgRmVhdHVyZXMgYW5kIEludGVyZmFjZXMgcHJvcGVydGllcyBmb3IKKyAgICAgICAgICAgICAgIG1lc3NhZ2UgYnVzIGZlYXR1cmUtZGlzY292ZXJ5PC9zaW1wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgIDxsaXN0aXRlbT48c2ltcGFyYT5BZGQgdW5peDpkaXI9Li4uLCB3aGljaCByZXNlbWJsZXMKKyAgICAgICAgICAgICAgIHVuaXg6dG1wZGlyPS4uLiBidXQgbmV2ZXIgdXNlcyBhYnN0cmFjdAorICAgICAgICAgICAgICAgc29ja2V0czwvc2ltcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICA8bGlzdGl0ZW0+PHNpbXBhcmE+RG9uJ3QgcmVxdWlyZSBlYXZlc2Ryb3A9J3RydWUnIHRvIGJlIGFjY2VwdGVkCisgICAgICAgICAgICAgICBmcm9tIGNvbm5lY3Rpb25zIG5vdCBzdWZmaWNpZW50bHkgcHJpdmlsZWdlZCB0byB1c2UgaXQKKyAgICAgICAgICAgICAgIHN1Y2Nlc3NmdWxseTwvc2ltcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICA8bGlzdGl0ZW0+PHNpbXBhcmE+Rm9ybWFsbHkgZGVwcmVjYXRlIGVhdmVzZHJvcHBpbmcgaW4gZmF2b3VyIG9mCisgICAgICAgICAgICAgICBCZWNvbWVNb25pdG9yPC9zaW1wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICA8L3JldmRlc2NyaXB0aW9uPgorICAgICA8L3JldmlzaW9uPgorICAgICA8cmV2aXNpb24+CisgICAgICAgPHJldm51bWJlcj4wLjMwPC9yZXZudW1iZXI+CisgICAgICAgPGRhdGU+MjAxNi0xMS0yODwvZGF0ZT4KKyAgICAgICA8YXV0aG9yaW5pdGlhbHM+c21jdiwgUFc8L2F1dGhvcmluaXRpYWxzPgorICAgICAgIDxyZXZyZW1hcms+CisgICAgICAgICBEZWZpbmUgdGhlIGphcmdvbiB0ZXJtcyBzZXJ2aWNlIGFjdGl2YXRpb24gYW5kIGF1dG8tc3RhcnRpbmcgbW9yZQorICAgICAgICAgY2xlYXJseS4gRG9jdW1lbnQgdGhlIFN5c3RlbWRTZXJ2aWNlIGtleSBpbiBzZXJ2aWNlIGZpbGVzLgorICAgICAgICAgRG9jdW1lbnQgaG93IEFwcEFybW9yIGludGVyYWN0cyB3aXRoIHNlcnZpY2UgYWN0aXZhdGlvbiwgYW5kIHRoZQorICAgICAgICAgbmV3IEFzc3VtZWRBcHBBcm1vckxhYmVsIGtleSBpbiBzZXJ2aWNlIGZpbGVzIChkYnVzLWRhZW1vbiAxLjExLjgpLgorICAgICAgICAgQ2xhcmlmeSBpbnRlbmRlZCBiZWhhdmlvdXIgb2YgUHJvcGVydGllcy5HZXRBbGwuCisgICAgICAgICBVc2UgdmVyc2lvbmVkIGludGVyZmFjZSBhbmQgYnVzIG5hbWVzIGluIG1vc3QgZXhhbXBsZXMuCisgICAgICAgPC9yZXZyZW1hcms+CisgICAgIDwvcmV2aXNpb24+CisgICAgIDxyZXZpc2lvbj4KKyAgICAgICA8cmV2bnVtYmVyPjAuMjk8L3Jldm51bWJlcj4KKyAgICAgICA8ZGF0ZT4yMDE2LTEwLTEwPC9kYXRlPgorICAgICAgIDxhdXRob3Jpbml0aWFscz5QVzwvYXV0aG9yaW5pdGlhbHM+CisgICAgICAgPHJldnJlbWFyaz4KKyAgICAgICAgIEludHJvc3BlY3Rpb24gYXJndW1lbnRzIG1heSBjb250YWluIGFubm90YXRpb25zOyByZWNvbW1lbmQgYWdhaW5zdAorICAgICAgICAgdXNpbmcgdGhlIG9iamVjdCBwYXRoICcvJworICAgICAgIDwvcmV2cmVtYXJrPgorICAgICA8L3JldmlzaW9uPgorICAgICA8cmV2aXNpb24+CisgICAgICAgPHJldm51bWJlcj4wLjI4PC9yZXZudW1iZXI+CisgICAgICAgPGRhdGU+MjAxNi0wOC0xNTwvZGF0ZT4KKyAgICAgICA8YXV0aG9yaW5pdGlhbHM+UFc8L2F1dGhvcmluaXRpYWxzPgorICAgICAgIDxyZXZyZW1hcms+Q2xhcmlmeSBzZXJpYWxpemF0aW9uPC9yZXZyZW1hcms+CisgICAgIDwvcmV2aXNpb24+CisgICAgIDxyZXZpc2lvbj4KKyAgICAgICA8cmV2bnVtYmVyPjAuMjc8L3Jldm51bWJlcj4KKyAgICAgICA8ZGF0ZT4yMDE1LTEyLTAyPC9kYXRlPgorICAgICAgIDxhdXRob3Jpbml0aWFscz5MVTwvYXV0aG9yaW5pdGlhbHM+CisgICAgICAgPHJldnJlbWFyaz5TZXJ2aWNlcyBzaG91bGQgbm90IHNlbmQgdW53YW50ZWQgcmVwbGllczwvcmV2cmVtYXJrPgorICAgICA8L3JldmlzaW9uPgorICAgICA8cmV2aXNpb24+CisgICAgICAgPHJldm51bWJlcj4wLjI2PC9yZXZudW1iZXI+CisgICAgICAgPGRhdGU+MjAxNS0wMi0xOTwvZGF0ZT4KKyAgICAgICA8YXV0aG9yaW5pdGlhbHM+c21jdiwgcmg8L2F1dGhvcmluaXRpYWxzPgorICAgICAgIDxyZXZyZW1hcms+CisgICAgICAgICBHZXRDb25uZWN0aW9uQ3JlZGVudGlhbHMgY2FuIHJldHVybiBMaW51eFNlY3VyaXR5TGFiZWwgb3IKKyAgICAgICAgIFdpbmRvd3NTSUQ7IGFkZCBwcml2aWxlZ2VkIEJlY29tZU1vbml0b3IgbWV0aG9kCisgICAgICAgPC9yZXZyZW1hcms+CisgICAgIDwvcmV2aXNpb24+CisgICAgIDxyZXZpc2lvbj4KKyAgICAgICA8cmV2bnVtYmVyPjAuMjU8L3Jldm51bWJlcj4KKyAgICAgICA8ZGF0ZT4yMDE0LTExLTEwPC9kYXRlPgorICAgICAgIDxhdXRob3Jpbml0aWFscz5zbWN2LCBsZW5uYXJ0PC9hdXRob3Jpbml0aWFscz4KKyAgICAgICA8cmV2cmVtYXJrPgorICAgICAgICAgQUxMT1dfSU5URVJBQ1RJVkVfQVVUSE9SSVpBVElPTiBmbGFnLCBFbWl0c0NoYW5nZWRTaWduYWw9Y29uc3QKKyAgICAgICA8L3JldnJlbWFyaz4KKyAgICAgPC9yZXZpc2lvbj4KKyAgICAgPHJldmlzaW9uPgorICAgICAgIDxyZXZudW1iZXI+MC4yNDwvcmV2bnVtYmVyPgorICAgICAgIDxkYXRlPjIwMTQtMTAtMDE8L2RhdGU+CisgICAgICAgPGF1dGhvcmluaXRpYWxzPlNNY1Y8L2F1dGhvcmluaXRpYWxzPgorICAgICAgIDxyZXZyZW1hcms+CisgICAgICAgICBub24tbWV0aG9kLWNhbGxzIG5ldmVyIGV4cGVjdCBhIHJlcGx5IGV2ZW4gd2l0aG91dCBOT19SRVBMWV9FWFBFQ1RFRDsKKyAgICAgICAgIGRvY3VtZW50IGhvdyB0byBxdW90ZSBtYXRjaCBydWxlcworICAgICAgIDwvcmV2cmVtYXJrPgorICAgICA8L3JldmlzaW9uPgorICAgICA8cmV2aXNpb24+CisgICAgICAgPHJldm51bWJlcj4wLjIzPC9yZXZudW1iZXI+CisgICAgICAgPGRhdGU+MjAxNC0wMS0wNjwvZGF0ZT4KKyAgICAgICA8YXV0aG9yaW5pdGlhbHM+U01jViwgQ1k8L2F1dGhvcmluaXRpYWxzPgorICAgICAgIDxyZXZyZW1hcms+CisgICAgICAgICBtZXRob2QgY2FsbCBtZXNzYWdlcyB3aXRoIG5vIElOVEVSRkFDRSBtYXkgYmUgY29uc2lkZXJlZCBhbiBlcnJvcjsKKyAgICAgICAgIGRvY3VtZW50IHRjcDpiaW5kPS4uLiBhbmQgbm9uY2UtdGNwOmJpbmQ9Li4uOyBkZWZpbmUgbGlzdGVuYWJsZQorICAgICAgICAgYW5kIGNvbm5lY3RhYmxlIGFkZHJlc3NlcworICAgICAgIDwvcmV2cmVtYXJrPgorICAgICA8L3JldmlzaW9uPgorICAgICA8cmV2aXNpb24+CisgICAgICAgPHJldm51bWJlcj4wLjIyPC9yZXZudW1iZXI+CisgICAgICAgPGRhdGU+MjAxMy0xMC0wOTwvZGF0ZT4KKyAgICAgICA8YXV0aG9yaW5pdGlhbHM+PC9hdXRob3Jpbml0aWFscz4KKyAgICAgICA8cmV2cmVtYXJrPmFkZCBHZXRDb25uZWN0aW9uQ3JlZGVudGlhbHMsIGRvY3VtZW50CisgICAgICAgIEdldEF0ZEF1ZGl0U2Vzc2lvbkRhdGEsIGRvY3VtZW50IEdldENvbm5lY3Rpb25TRUxpbnV4U2VjdXJpdHlDb250ZXh0LAorICAgICAgICBkb2N1bWVudCBhbmQgY29ycmVjdCAuc2VydmljZSBmaWxlIHN5bnRheCBhbmQgbmFtaW5nCisgICAgICA8L3JldnJlbWFyaz4KKyAgICAgPC9yZXZpc2lvbj4KKyAgICAgPHJldmlzaW9uPgorICAgICAgIDxyZXZudW1iZXI+MC4yMTwvcmV2bnVtYmVyPgorICAgICAgIDxkYXRlPjIwMTMtMDQtMjU8L2RhdGU+CisgICAgICAgPGF1dGhvcmluaXRpYWxzPnNtY3Y8L2F1dGhvcmluaXRpYWxzPgorICAgICAgIDxyZXZyZW1hcms+YWxsb3cgVW5pY29kZSBub25jaGFyYWN0ZXJzIGluIFVURi04IChVbmljb2RlCisgICAgICAgICBDb3JyaWdlbmR1bSAjOSk8L3JldnJlbWFyaz4KKyAgICAgPC9yZXZpc2lvbj4KKyAgICAgPHJldmlzaW9uPgorICAgICAgIDxyZXZudW1iZXI+MC4yMDwvcmV2bnVtYmVyPgorICAgICAgIDxkYXRlPjIyIEZlYnJ1YXJ5IDIwMTM8L2RhdGU+CisgICAgICAgPGF1dGhvcmluaXRpYWxzPnNtY3YsIHdhbHRlcnM8L2F1dGhvcmluaXRpYWxzPgorICAgICAgIDxyZXZyZW1hcms+cmVvcmdhbmlzZSBmb3IgY2xhcml0eSwgcmVtb3ZlIGZhbHNlIGNsYWltcyBhYm91dAorICAgICAgICAgYmFzaWMgdHlwZXMsIG1lbnRpb24gL28vZmQvREJ1czwvcmV2cmVtYXJrPgorICAgICA8L3JldmlzaW9uPgorICAgICA8cmV2aXNpb24+CisgICAgICAgPHJldm51bWJlcj4wLjE5PC9yZXZudW1iZXI+CisgICAgICAgPGRhdGU+MjAgRmVicnVhcnkgMjAxMjwvZGF0ZT4KKyAgICAgICA8YXV0aG9yaW5pdGlhbHM+c21jdi9scDwvYXV0aG9yaW5pdGlhbHM+CisgICAgICAgPHJldnJlbWFyaz5mb3JtYWxseSBkZWZpbmUgdW5pcXVlIGNvbm5lY3Rpb24gbmFtZXMgYW5kIHdlbGwta25vd24KKyAgICAgICAgYnVzIG5hbWVzOyBkb2N1bWVudCBiZXN0IHByYWN0aWNlcyBmb3IgaW50ZXJmYWNlLCBidXMsIG1lbWJlciBhbmQKKyAgICAgICAgZXJyb3IgbmFtZXMsIGFuZCBvYmplY3QgcGF0aHM7IGRvY3VtZW50IHRoZSBzZWFyY2ggcGF0aCBmb3Igc2Vzc2lvbgorICAgICAgICBhbmQgc3lzdGVtIHNlcnZpY2VzIG9uIFVuaXg7IGRvY3VtZW50IHRoZSBzeXN0ZW1kIHRyYW5zcG9ydDwvcmV2cmVtYXJrPgorICAgICA8L3JldmlzaW9uPgorICAgICA8cmV2aXNpb24+CisgICAgICAgPHJldm51bWJlcj4wLjE4PC9yZXZudW1iZXI+CisgICAgICAgPGRhdGU+MjkgSnVseSAyMDExPC9kYXRlPgorICAgICAgIDxhdXRob3Jpbml0aWFscz5zbWN2PC9hdXRob3Jpbml0aWFscz4KKyAgICAgICA8cmV2cmVtYXJrPmRlZmluZSBlYXZlc2Ryb3BwaW5nLCB1bmljYXN0LCBicm9hZGNhc3Q7IGFkZCBlYXZlc2Ryb3AKKyAgICAgICAgIG1hdGNoIGtleXdvcmQ7IHByb21vdGUgdHlwZSBzeXN0ZW0gdG8gYSB0b3AtbGV2ZWwgc2VjdGlvbjwvcmV2cmVtYXJrPgorICAgICA8L3JldmlzaW9uPgorICAgICA8cmV2aXNpb24+CisgICAgICAgPHJldm51bWJlcj4wLjE3PC9yZXZudW1iZXI+CisgICAgICAgPGRhdGU+MSBKdW5lIDIwMTE8L2RhdGU+CisgICAgICAgPGF1dGhvcmluaXRpYWxzPnNtY3YvZGF2aWR6PC9hdXRob3Jpbml0aWFscz4KKyAgICAgICA8cmV2cmVtYXJrPmRlZmluZSBPYmplY3RNYW5hZ2VyOyByZXNlcnZlIGV4dHJhIHBzZXVkby10eXBlLWNvZGVzIHVzZWQKKyAgICAgICAgIGJ5IEdWYXJpYW50PC9yZXZyZW1hcms+CisgICAgIDwvcmV2aXNpb24+CisgICAgIDxyZXZpc2lvbj4KKyAgICAgICA8cmV2bnVtYmVyPjAuMTY8L3Jldm51bWJlcj4KKyAgICAgICA8ZGF0ZT4xMSBBcHJpbCAyMDExPC9kYXRlPgorICAgICAgIDxhdXRob3Jpbml0aWFscz48L2F1dGhvcmluaXRpYWxzPgorICAgICAgIDxyZXZyZW1hcms+YWRkIHBhdGhfbmFtZXNwYWNlLCBhcmcwbmFtZXNwYWNlOyBhcmdOcGF0aCBtYXRjaGVzIG9iamVjdAorICAgICAgICBwYXRoczwvcmV2cmVtYXJrPgorICAgICA8L3JldmlzaW9uPgorICAgICA8cmV2aXNpb24+CisgICAgICAgPHJldm51bWJlcj4wLjE1PC9yZXZudW1iZXI+CisgICAgICAgPGRhdGU+MyBOb3ZlbWJlciAyMDEwPC9kYXRlPgorICAgICAgIDxhdXRob3Jpbml0aWFscz48L2F1dGhvcmluaXRpYWxzPgorICAgICAgIDxyZXZyZW1hcms+PC9yZXZyZW1hcms+CisgICAgIDwvcmV2aXNpb24+CisgICAgIDxyZXZpc2lvbj4KKyAgICAgICA8cmV2bnVtYmVyPjAuMTQ8L3Jldm51bWJlcj4KKyAgICAgICA8ZGF0ZT4xMiBNYXkgMjAxMDwvZGF0ZT4KKyAgICAgICA8YXV0aG9yaW5pdGlhbHM+PC9hdXRob3Jpbml0aWFscz4KKyAgICAgICA8cmV2cmVtYXJrPjwvcmV2cmVtYXJrPgorICAgICA8L3JldmlzaW9uPgorICAgICA8cmV2aXNpb24+CisgICAgICAgPHJldm51bWJlcj4wLjEzPC9yZXZudW1iZXI+CisgICAgICAgPGRhdGU+MjMgRGV6ZW1iZXIgMjAwOTwvZGF0ZT4KKyAgICAgICA8YXV0aG9yaW5pdGlhbHM+PC9hdXRob3Jpbml0aWFscz4KKyAgICAgICA8cmV2cmVtYXJrPjwvcmV2cmVtYXJrPgorICAgICA8L3JldmlzaW9uPgorICAgICA8cmV2aXNpb24+CisgICAgICAgPHJldm51bWJlcj4wLjEyPC9yZXZudW1iZXI+CisgICAgICAgPGRhdGU+NyBOb3ZlbWJlciwgMjAwNjwvZGF0ZT4KKyAgICAgICA8YXV0aG9yaW5pdGlhbHM+PC9hdXRob3Jpbml0aWFscz4KKyAgICAgICA8cmV2cmVtYXJrPjwvcmV2cmVtYXJrPgorICAgICA8L3JldmlzaW9uPgorICAgICA8cmV2aXNpb24+CisgICAgICAgPHJldm51bWJlcj4wLjExPC9yZXZudW1iZXI+CisgICAgICAgPGRhdGU+NiBGZWJydWFyeSAyMDA1PC9kYXRlPgorICAgICAgIDxhdXRob3Jpbml0aWFscz48L2F1dGhvcmluaXRpYWxzPgorICAgICAgIDxyZXZyZW1hcms+PC9yZXZyZW1hcms+CisgICAgIDwvcmV2aXNpb24+CisgICAgIDxyZXZpc2lvbj4KKyAgICAgICA8cmV2bnVtYmVyPjAuMTA8L3Jldm51bWJlcj4KKyAgICAgICA8ZGF0ZT4yOCBKYW51YXJ5IDIwMDU8L2RhdGU+CisgICAgICAgPGF1dGhvcmluaXRpYWxzPjwvYXV0aG9yaW5pdGlhbHM+CisgICAgICAgPHJldnJlbWFyaz48L3JldnJlbWFyaz4KKyAgICAgPC9yZXZpc2lvbj4KKyAgICAgPHJldmlzaW9uPgorICAgICAgIDxyZXZudW1iZXI+MC45PC9yZXZudW1iZXI+CisgICAgICAgPGRhdGU+NyBKYW51YXIgMjAwNTwvZGF0ZT4KKyAgICAgICA8YXV0aG9yaW5pdGlhbHM+PC9hdXRob3Jpbml0aWFscz4KKyAgICAgICA8cmV2cmVtYXJrPjwvcmV2cmVtYXJrPgorICAgICA8L3JldmlzaW9uPgorICAgICA8cmV2aXNpb24+CisgICAgICAgPHJldm51bWJlcj4wLjg8L3Jldm51bWJlcj4KKyAgICAgICA8ZGF0ZT4wNiBTZXB0ZW1iZXIgMjAwMzwvZGF0ZT4KKyAgICAgICA8YXV0aG9yaW5pdGlhbHM+PC9hdXRob3Jpbml0aWFscz4KKyAgICAgICA8cmV2cmVtYXJrPkZpcnN0IHJlbGVhc2VkIGRvY3VtZW50LjwvcmV2cmVtYXJrPgorICAgICA8L3JldmlzaW9uPgorICAgPC9yZXZoaXN0b3J5PgorICA8L2FydGljbGVpbmZvPgorCisgIDxzZWN0MSBpZD0iaW50cm9kdWN0aW9uIj4KKyAgICA8dGl0bGU+SW50cm9kdWN0aW9uPC90aXRsZT4KKyAgICA8cGFyYT4KKyAgICAgIEQtQnVzIGlzIGEgc3lzdGVtIGZvciBsb3ctb3ZlcmhlYWQsIGVhc3kgdG8gdXNlCisgICAgICBpbnRlcnByb2Nlc3MgY29tbXVuaWNhdGlvbiAoSVBDKS4gSW4gbW9yZSBkZXRhaWw6CisgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBELUJ1cyBpcyA8ZW1waGFzaXM+bG93LW92ZXJoZWFkPC9lbXBoYXNpcz4gYmVjYXVzZSBpdCB1c2VzIGEKKyAgICAgICAgICAgIGJpbmFyeSBwcm90b2NvbCwgYW5kIGRvZXMgbm90IGhhdmUgdG8gY29udmVydCB0byBhbmQgZnJvbSBhIHRleHQKKyAgICAgICAgICAgIGZvcm1hdCBzdWNoIGFzIFhNTC4gQmVjYXVzZSBELUJ1cyBpcyBpbnRlbmRlZCBmb3IgcG90ZW50aWFsbHkKKyAgICAgICAgICAgIGhpZ2gtcmVzb2x1dGlvbiBzYW1lLW1hY2hpbmUgSVBDLCBub3QgcHJpbWFyaWx5IGZvciBJbnRlcm5ldCBJUEMsCisgICAgICAgICAgICB0aGlzIGlzIGFuIGludGVyZXN0aW5nIG9wdGltaXphdGlvbi4gRC1CdXMgaXMgYWxzbyBkZXNpZ25lZCB0bworICAgICAgICAgICAgYXZvaWQgcm91bmQgdHJpcHMgYW5kIGFsbG93IGFzeW5jaHJvbm91cyBvcGVyYXRpb24sIG11Y2ggbGlrZQorICAgICAgICAgICAgdGhlIFggcHJvdG9jb2wuCisgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBELUJ1cyBpcyA8ZW1waGFzaXM+ZWFzeSB0byB1c2U8L2VtcGhhc2lzPiBiZWNhdXNlIGl0IHdvcmtzIGluIHRlcm1zCisgICAgICAgICAgICBvZiA8Zmlyc3R0ZXJtPm1lc3NhZ2VzPC9maXJzdHRlcm0+IHJhdGhlciB0aGFuIGJ5dGUgc3RyZWFtcywgYW5kCisgICAgICAgICAgICBhdXRvbWF0aWNhbGx5IGhhbmRsZXMgYSBsb3Qgb2YgdGhlIGhhcmQgSVBDIGlzc3Vlcy4gQWxzbywgdGhlIEQtQnVzCisgICAgICAgICAgICBsaWJyYXJ5IGlzIGRlc2lnbmVkIHRvIGJlIHdyYXBwZWQgaW4gYSB3YXkgdGhhdCBsZXRzIGRldmVsb3BlcnMgdXNlCisgICAgICAgICAgICB0aGVpciBmcmFtZXdvcmsncyBleGlzdGluZyBvYmplY3QvdHlwZSBzeXN0ZW0sIHJhdGhlciB0aGFuIGxlYXJuaW5nCisgICAgICAgICAgICBhIG5ldyBvbmUgc3BlY2lmaWNhbGx5IGZvciBJUEMuCisgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgPC9wYXJhPgorCisgICAgPHBhcmE+CisgICAgICBUaGUgYmFzZSBELUJ1cyBwcm90b2NvbCBpcyBhIG9uZS10by1vbmUgKHBlZXItdG8tcGVlciBvciBjbGllbnQtc2VydmVyKQorICAgICAgcHJvdG9jb2wsIHNwZWNpZmllZCBpbiA8eHJlZiBsaW5rZW5kPSJtZXNzYWdlLXByb3RvY29sIi8+LiBUaGF0IGlzLCBpdCBpcworICAgICAgYSBzeXN0ZW0gZm9yIG9uZSBhcHBsaWNhdGlvbiB0byB0YWxrIHRvIGEgc2luZ2xlIG90aGVyCisgICAgICBhcHBsaWNhdGlvbi4gSG93ZXZlciwgdGhlIHByaW1hcnkgaW50ZW5kZWQgYXBwbGljYXRpb24gb2YgdGhlIHByb3RvY29sIGlzIHRoZQorICAgICAgRC1CdXMgPGZpcnN0dGVybT5tZXNzYWdlIGJ1czwvZmlyc3R0ZXJtPiwgc3BlY2lmaWVkIGluIDx4cmVmCisgICAgICBsaW5rZW5kPSJtZXNzYWdlLWJ1cyIvPi4gVGhlIG1lc3NhZ2UgYnVzIGlzIGEgc3BlY2lhbCBhcHBsaWNhdGlvbiB0aGF0CisgICAgICBhY2NlcHRzIGNvbm5lY3Rpb25zIGZyb20gbXVsdGlwbGUgb3RoZXIgYXBwbGljYXRpb25zLCBhbmQgZm9yd2FyZHMKKyAgICAgIG1lc3NhZ2VzIGFtb25nIHRoZW0uCisgICAgPC9wYXJhPgorCisgICAgPHBhcmE+CisgICAgICBVc2VzIG9mIEQtQnVzIGluY2x1ZGUgbm90aWZpY2F0aW9uIG9mIHN5c3RlbSBjaGFuZ2VzIChub3RpZmljYXRpb24gb2Ygd2hlbgorICAgICAgYSBjYW1lcmEgaXMgcGx1Z2dlZCBpbiB0byBhIGNvbXB1dGVyLCBvciBhIG5ldyB2ZXJzaW9uIG9mIHNvbWUgc29mdHdhcmUKKyAgICAgIGhhcyBiZWVuIGluc3RhbGxlZCksIG9yIGRlc2t0b3AgaW50ZXJvcGVyYWJpbGl0eSwgZm9yIGV4YW1wbGUgYSBmaWxlCisgICAgICBtb25pdG9yaW5nIHNlcnZpY2Ugb3IgYSBjb25maWd1cmF0aW9uIHNlcnZpY2UuCisgICAgPC9wYXJhPgorCisgICAgPHBhcmE+CisgICAgICBELUJ1cyBpcyBkZXNpZ25lZCBmb3IgdHdvIHNwZWNpZmljIHVzZSBjYXNlczoKKyAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEEgInN5c3RlbSBidXMiIGZvciBub3RpZmljYXRpb25zIGZyb20gdGhlIHN5c3RlbSB0byB1c2VyIHNlc3Npb25zLAorICAgICAgICAgICAgYW5kIHRvIGFsbG93IHRoZSBzeXN0ZW0gdG8gcmVxdWVzdCBpbnB1dCBmcm9tIHVzZXIgc2Vzc2lvbnMuCisgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBBICJzZXNzaW9uIGJ1cyIgdXNlZCB0byBpbXBsZW1lbnQgZGVza3RvcCBlbnZpcm9ubWVudHMgc3VjaCBhcworICAgICAgICAgICAgR05PTUUgYW5kIEtERS4KKyAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgIEQtQnVzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBhIGdlbmVyaWMgSVBDIHN5c3RlbSBmb3IgYW55IHBvc3NpYmxlCisgICAgICBhcHBsaWNhdGlvbiwgYW5kIGludGVudGlvbmFsbHkgb21pdHMgbWFueSBmZWF0dXJlcyBmb3VuZCBpbiBvdGhlcgorICAgICAgSVBDIHN5c3RlbXMgZm9yIHRoaXMgcmVhc29uLgorICAgIDwvcGFyYT4KKworICAgIDxwYXJhPgorICAgICAgQXQgdGhlIHNhbWUgdGltZSwgdGhlIGJ1cyBkYWVtb25zIG9mZmVyIGEgbnVtYmVyIG9mIGZlYXR1cmVzIG5vdCBmb3VuZCBpbgorICAgICAgb3RoZXIgSVBDIHN5c3RlbXMsIHN1Y2ggYXMgc2luZ2xlLW93bmVyICJidXMgbmFtZXMiIChzaW1pbGFyIHRvIFgKKyAgICAgIHNlbGVjdGlvbnMpLCBvbi1kZW1hbmQgc3RhcnR1cCBvZiBzZXJ2aWNlcywgYW5kIHNlY3VyaXR5IHBvbGljaWVzLgorICAgICAgSW4gbWFueSB3YXlzLCB0aGVzZSBmZWF0dXJlcyBhcmUgdGhlIHByaW1hcnkgbW90aXZhdGlvbiBmb3IgZGV2ZWxvcGluZworICAgICAgRC1CdXM7IG90aGVyIHN5c3RlbXMgd291bGQgaGF2ZSBzdWZmaWNlZCBpZiBJUEMgd2VyZSB0aGUgb25seSBnb2FsLgorICAgIDwvcGFyYT4KKworICAgIDxwYXJhPgorICAgICAgRC1CdXMgbWF5IHR1cm4gb3V0IHRvIGJlIHVzZWZ1bCBpbiB1bmFudGljaXBhdGVkIGFwcGxpY2F0aW9ucywgYnV0IGZ1dHVyZQorICAgICAgdmVyc2lvbnMgb2YgdGhpcyBzcGVjIGFuZCB0aGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHByb2JhYmx5IHdpbGwgbm90CisgICAgICBpbmNvcnBvcmF0ZSBmZWF0dXJlcyB0aGF0IGludGVyZmVyZSB3aXRoIHRoZSBjb3JlIHVzZSBjYXNlcy4KKyAgICA8L3BhcmE+CisKKyAgICA8cGFyYT4KKyAgICAgIFRoZSBrZXkgd29yZHMgIk1VU1QiLCAiTVVTVCBOT1QiLCAiUkVRVUlSRUQiLCAiU0hBTEwiLCAiU0hBTEwgTk9UIiwKKyAgICAgICJTSE9VTEQiLCAiU0hPVUxEIE5PVCIsICJSRUNPTU1FTkRFRCIsICJNQVkiLCBhbmQgIk9QVElPTkFMIiBpbiB0aGlzCisgICAgICBkb2N1bWVudCBhcmUgdG8gYmUgaW50ZXJwcmV0ZWQgYXMgZGVzY3JpYmVkIGluIFJGQyAyMTE5LiBIb3dldmVyLCB0aGUKKyAgICAgIGRvY3VtZW50IGNvdWxkIHVzZSBhIHNlcmlvdXMgYXVkaXQgdG8gYmUgc3VyZSBpdCBtYWtlcyBzZW5zZSB0byBkbworICAgICAgc28uIEFsc28sIHRoZXkgYXJlIG5vdCBjYXBpdGFsaXplZC4KKyAgICA8L3BhcmE+CisKKyAgICA8c2VjdDIgaWQ9InN0YWJpbGl0eSI+CisgICAgICA8dGl0bGU+UHJvdG9jb2wgYW5kIFNwZWNpZmljYXRpb24gU3RhYmlsaXR5PC90aXRsZT4KKyAgICAgIDxwYXJhPgorICAgICAgICBUaGUgRC1CdXMgcHJvdG9jb2wgaXMgZnJvemVuIChvbmx5IGNvbXBhdGlibGUgZXh0ZW5zaW9ucyBhcmUgYWxsb3dlZCkgYXMKKyAgICAgICAgb2YgTm92ZW1iZXIgOCwgMjAwNi4gIEhvd2V2ZXIsIHRoaXMgc3BlY2lmaWNhdGlvbiBjb3VsZCBzdGlsbCB1c2UgYSBmYWlyCisgICAgICAgIGJpdCBvZiB3b3JrIHRvIG1ha2UgaW50ZXJvcGVyYWJsZSByZWltcGxlbWVudGF0aW9uIHBvc3NpYmxlIHdpdGhvdXQKKyAgICAgICAgcmVmZXJlbmNlIHRvIHRoZSBELUJ1cyByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24uIFRodXMsIHRoaXMKKyAgICAgICAgc3BlY2lmaWNhdGlvbiBpcyBub3QgbWFya2VkIDEuMC4gVG8gbWFyayBpdCAxLjAsIHdlJ2QgbGlrZSB0byBzZWUKKyAgICAgICAgc29tZW9uZSBpbnZlc3Qgc2lnbmlmaWNhbnQgZWZmb3J0IGluIGNsYXJpZnlpbmcgdGhlIHNwZWNpZmljYXRpb24KKyAgICAgICAgbGFuZ3VhZ2UsIGFuZCBncm93aW5nIHRoZSBzcGVjaWZpY2F0aW9uIHRvIGNvdmVyIG1vcmUgYXNwZWN0cyBvZiB0aGUKKyAgICAgICAgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uJ3MgYmVoYXZpb3IuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgVW50aWwgdGhpcyB3b3JrIGlzIGNvbXBsZXRlLCBhbnkgYXR0ZW1wdCB0byByZWltcGxlbWVudCBELUJ1cyB3aWxsCisgICAgICAgIHByb2JhYmx5IHJlcXVpcmUgbG9va2luZyBhdCB0aGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGFuZC9vciBhc2tpbmcKKyAgICAgICAgcXVlc3Rpb25zIG9uIHRoZSBELUJ1cyBtYWlsaW5nIGxpc3QgYWJvdXQgaW50ZW5kZWQgYmVoYXZpb3IuCisgICAgICAgIFF1ZXN0aW9ucyBvbiB0aGUgbGlzdCBhcmUgdmVyeSB3ZWxjb21lLgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIE5vbmV0aGVsZXNzLCB0aGlzIGRvY3VtZW50IHNob3VsZCBiZSBhIHVzZWZ1bCBzdGFydGluZyBwb2ludCBhbmQgaXMKKyAgICAgICAgdG8gb3VyIGtub3dsZWRnZSBhY2N1cmF0ZSwgdGhvdWdoIGluY29tcGxldGUuCisgICAgICA8L3BhcmE+CisgICAgPC9zZWN0Mj4KKworICA8L3NlY3QxPgorCisgIDxzZWN0MSBpZD0idHlwZS1zeXN0ZW0iPgorICAgIDx0aXRsZT5UeXBlIFN5c3RlbTwvdGl0bGU+CisKKyAgICA8cGFyYT4KKyAgICAgIEQtQnVzIGhhcyBhIHR5cGUgc3lzdGVtLCBpbiB3aGljaCB2YWx1ZXMgb2YgdmFyaW91cyB0eXBlcyBjYW4gYmUKKyAgICAgIHNlcmlhbGl6ZWQgaW50byBhIHNlcXVlbmNlIG9mIGJ5dGVzIHJlZmVycmVkIHRvIGFzIHRoZQorICAgICAgPGZpcnN0dGVybT53aXJlIGZvcm1hdDwvZmlyc3R0ZXJtPiBpbiBhIHN0YW5kYXJkIHdheS4KKyAgICAgIENvbnZlcnRpbmcgYSB2YWx1ZSBmcm9tIHNvbWUgb3RoZXIgcmVwcmVzZW50YXRpb24gaW50byB0aGUgd2lyZQorICAgICAgZm9ybWF0IGlzIGNhbGxlZCA8Zmlyc3R0ZXJtPm1hcnNoYWxpbmc8L2ZpcnN0dGVybT4gYW5kIGNvbnZlcnRpbmcKKyAgICAgIGl0IGJhY2sgZnJvbSB0aGUgd2lyZSBmb3JtYXQgaXMgPGZpcnN0dGVybT51bm1hcnNoYWxpbmc8L2ZpcnN0dGVybT4uCisgICAgPC9wYXJhPgorCisgICAgPHBhcmE+CisgICAgICBUaGUgRC1CdXMgcHJvdG9jb2wgZG9lcyBub3QgaW5jbHVkZSB0eXBlIHRhZ3MgaW4gdGhlIG1hcnNoYWxlZCBkYXRhOyBhCisgICAgICBibG9jayBvZiBtYXJzaGFsZWQgdmFsdWVzIG11c3QgaGF2ZSBhIGtub3duIDxmaXJzdHRlcm0+dHlwZQorICAgICAgICBzaWduYXR1cmU8L2ZpcnN0dGVybT4uIFRoZSB0eXBlIHNpZ25hdHVyZSBpcyBtYWRlIHVwIG9mIHplcm8gb3IgbW9yZQorICAgICAgPGZpcnN0dGVybSBpZD0idGVybS1zaW5nbGUtY29tcGxldGUtdHlwZSI+c2luZ2xlIGNvbXBsZXRlCisgICAgICAgIHR5cGVzPC9maXJzdHRlcm0+LCBlYWNoIG1hZGUgdXAgb2Ygb25lIG9yIG1vcmUKKyAgICAgIDxmaXJzdHRlcm0+dHlwZSBjb2RlczwvZmlyc3R0ZXJtPi4KKyAgICA8L3BhcmE+CisKKyAgICA8cGFyYT4KKyAgICAgIEEgdHlwZSBjb2RlIGlzIGFuIEFTQ0lJIGNoYXJhY3RlciByZXByZXNlbnRpbmcgdGhlCisgICAgICB0eXBlIG9mIGEgdmFsdWUuIEJlY2F1c2UgQVNDSUkgY2hhcmFjdGVycyBhcmUgdXNlZCwgdGhlIHR5cGUgc2lnbmF0dXJlCisgICAgICB3aWxsIGFsd2F5cyBmb3JtIGEgdmFsaWQgQVNDSUkgc3RyaW5nLiBBIHNpbXBsZSBzdHJpbmcgY29tcGFyZQorICAgICAgZGV0ZXJtaW5lcyB3aGV0aGVyIHR3byB0eXBlIHNpZ25hdHVyZXMgYXJlIGVxdWl2YWxlbnQuCisgICAgPC9wYXJhPgorCisgICAgPHBhcmE+CisgICAgICBBIHNpbmdsZSBjb21wbGV0ZSB0eXBlIGlzIGEgc2VxdWVuY2Ugb2YgdHlwZSBjb2RlcyB0aGF0IGZ1bGx5IGRlc2NyaWJlcworICAgICAgb25lIHR5cGU6IGVpdGhlciBhIGJhc2ljIHR5cGUsIG9yIGEgc2luZ2xlIGZ1bGx5LWRlc2NyaWJlZCBjb250YWluZXIgdHlwZS4KKyAgICAgIEEgc2luZ2xlIGNvbXBsZXRlIHR5cGUgaXMgYSBiYXNpYyB0eXBlIGNvZGUsIGEgdmFyaWFudCB0eXBlIGNvZGUsCisgICAgICBhbiBhcnJheSB3aXRoIGl0cyBlbGVtZW50IHR5cGUsIG9yIGEgc3RydWN0IHdpdGggaXRzIGZpZWxkcyAoYWxsIG9mIHdoaWNoCisgICAgICBhcmUgZGVmaW5lZCBiZWxvdykuIFNvIHRoZSBmb2xsb3dpbmcgc2lnbmF0dXJlcyBhcmUgbm90IHNpbmdsZSBjb21wbGV0ZQorICAgICAgdHlwZXM6CisgICAgICA8cHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICJhYSIKKyAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICA8cHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICIoaWkiCisgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgPHByb2dyYW1saXN0aW5nPgorICAgICAgICAiaWkpIgorICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgIEFuZCB0aGUgZm9sbG93aW5nIHNpZ25hdHVyZXMgY29udGFpbiBtdWx0aXBsZSBjb21wbGV0ZSB0eXBlczoKKyAgICAgIDxwcm9ncmFtbGlzdGluZz4KKyAgICAgICAgImlpIgorICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgIDxwcm9ncmFtbGlzdGluZz4KKyAgICAgICAgImFpYWkiCisgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgPHByb2dyYW1saXN0aW5nPgorICAgICAgICAiKGlpKShpaSkiCisgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgTm90ZSBob3dldmVyIHRoYXQgYSBzaW5nbGUgY29tcGxldGUgdHlwZSBtYXkgPGVtcGhhc2lzPmNvbnRhaW48L2VtcGhhc2lzPgorICAgICAgbXVsdGlwbGUgb3RoZXIgc2luZ2xlIGNvbXBsZXRlIHR5cGVzLCBieSBjb250YWluaW5nIGEgc3RydWN0IG9yIGRpY3QKKyAgICAgIGVudHJ5LgorICAgIDwvcGFyYT4KKworICAgIDxzZWN0MiBpZD0iYmFzaWMtdHlwZXMiPgorICAgICAgPHRpdGxlPkJhc2ljIHR5cGVzPC90aXRsZT4KKworICAgICAgPHBhcmE+CisgICAgICAgIFRoZSBzaW1wbGVzdCB0eXBlIGNvZGVzIGFyZSB0aGUgPGZpcnN0dGVybSBpZD0idGVybS1iYXNpYy10eXBlIj5iYXNpYworICAgICAgICAgIHR5cGVzPC9maXJzdHRlcm0+LCB3aGljaCBhcmUgdGhlIHR5cGVzIHdob3NlIHN0cnVjdHVyZSBpcyBlbnRpcmVseQorICAgICAgICBkZWZpbmVkIGJ5IHRoZWlyIDEtY2hhcmFjdGVyIHR5cGUgY29kZS4gQmFzaWMgdHlwZXMgY29uc2lzdCBvZgorICAgICAgICBmaXhlZCB0eXBlcyBhbmQgc3RyaW5nLWxpa2UgdHlwZXMuCisgICAgICA8L3BhcmE+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBUaGUgPGZpcnN0dGVybSBpZD0idGVybS1maXhlZC10eXBlIj5maXhlZCB0eXBlczwvZmlyc3R0ZXJtPgorICAgICAgICBhcmUgYmFzaWMgdHlwZXMgd2hvc2UgdmFsdWVzIGhhdmUgYSBmaXhlZCBsZW5ndGgsIG5hbWVseSBCWVRFLAorICAgICAgICBCT09MRUFOLCBET1VCTEUsIFVOSVhfRkQsIGFuZCBzaWduZWQgb3IgdW5zaWduZWQgaW50ZWdlcnMgb2YgbGVuZ3RoCisgICAgICAgIDE2LCAzMiBvciA2NCBiaXRzLgorICAgICAgPC9wYXJhPgorCisgICAgICA8cGFyYT4KKyAgICAgICAgQXMgYSBzaW1wbGUgZXhhbXBsZSwgdGhlIHR5cGUgY29kZSBmb3IgMzItYml0IGludGVnZXIgKDxsaXRlcmFsPklOVDMyPC9saXRlcmFsPikgaXMKKyAgICAgICAgdGhlIEFTQ0lJIGNoYXJhY3RlciAnaScuIFNvIHRoZSBzaWduYXR1cmUgZm9yIGEgYmxvY2sgb2YgdmFsdWVzCisgICAgICAgIGNvbnRhaW5pbmcgYSBzaW5nbGUgPGxpdGVyYWw+SU5UMzI8L2xpdGVyYWw+IHdvdWxkIGJlOgorICAgICAgICA8cHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgImkiCisgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgIEEgYmxvY2sgb2YgdmFsdWVzIGNvbnRhaW5pbmcgdHdvIDxsaXRlcmFsPklOVDMyPC9saXRlcmFsPiB3b3VsZCBoYXZlIHRoaXMgc2lnbmF0dXJlOgorICAgICAgICA8cHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgImlpIgorICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgPC9wYXJhPgorCisgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIGNoYXJhY3RlcmlzdGljcyBvZiB0aGUgZml4ZWQgdHlwZXMgYXJlIGxpc3RlZCBpbiB0aGlzIHRhYmxlLgorCisgICAgICAgIDxpbmZvcm1hbHRhYmxlPgorICAgICAgICAgIDx0Z3JvdXAgY29scz0iMyI+CisgICAgICAgICAgICA8dGhlYWQ+CisgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PkNvbnZlbnRpb25hbCBuYW1lPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+QVNDSUkgdHlwZS1jb2RlPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+RW5jb2Rpbmc8L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgIDwvdGhlYWQ+CisgICAgICAgICAgICA8dGJvZHk+CisgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPkJZVEU8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+eTwvbGl0ZXJhbD4gKDEyMSk8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5VbnNpZ25lZCA4LWJpdCBpbnRlZ2VyPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPkJPT0xFQU48L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+YjwvbGl0ZXJhbD4gKDk4KTwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PkJvb2xlYW4gdmFsdWU6IDAgaXMgZmFsc2UsIDEgaXMgdHJ1ZSwgYW55IG90aGVyIHZhbHVlCisgICAgICAgICAgICAgICAgICBhbGxvd2VkIGJ5IHRoZSBtYXJzaGFsbGluZyBmb3JtYXQgaXMgaW52YWxpZDwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5JTlQxNjwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5uPC9saXRlcmFsPiAoMTEwKTwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PlNpZ25lZCAodHdvJ3MgY29tcGxlbWVudCkgMTYtYml0IGludGVnZXI8L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+VUlOVDE2PC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPnE8L2xpdGVyYWw+ICgxMTMpPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+VW5zaWduZWQgMTYtYml0IGludGVnZXI8L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+SU5UMzI8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+aTwvbGl0ZXJhbD4gKDEwNSk8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5TaWduZWQgKHR3bydzIGNvbXBsZW1lbnQpIDMyLWJpdCBpbnRlZ2VyPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPlVJTlQzMjwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD51PC9saXRlcmFsPiAoMTE3KTwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PlVuc2lnbmVkIDMyLWJpdCBpbnRlZ2VyPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPklOVDY0PC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPng8L2xpdGVyYWw+ICgxMjApPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+U2lnbmVkICh0d28ncyBjb21wbGVtZW50KSA2NC1iaXQgaW50ZWdlcgorICAgICAgICAgICAgICAgICAgKG1uZW1vbmljOiB4IGFuZCB0IGFyZSB0aGUgZmlyc3QgY2hhcmFjdGVycyBpbiAic2l4dHkiIG5vdAorICAgICAgICAgICAgICAgICAgYWxyZWFkeSB1c2VkIGZvciBzb21ldGhpbmcgbW9yZSBjb21tb24pPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPlVJTlQ2NDwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD50PC9saXRlcmFsPiAoMTE2KTwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PlVuc2lnbmVkIDY0LWJpdCBpbnRlZ2VyPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPkRPVUJMRTwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5kPC9saXRlcmFsPiAoMTAwKTwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PklFRUUgNzU0IGRvdWJsZS1wcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQ8L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+VU5JWF9GRDwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5oPC9saXRlcmFsPiAoMTA0KTwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PlVuc2lnbmVkIDMyLWJpdCBpbnRlZ2VyIHJlcHJlc2VudGluZyBhbiBpbmRleCBpbnRvIGFuCisgICAgICAgICAgICAgICAgICBvdXQtb2YtYmFuZCBhcnJheSBvZiBmaWxlIGRlc2NyaXB0b3JzLCB0cmFuc2ZlcnJlZCB2aWEgc29tZQorICAgICAgICAgICAgICAgICAgcGxhdGZvcm0tc3BlY2lmaWMgbWVjaGFuaXNtIChtbmVtb25pYzogaCBmb3IgaGFuZGxlKTwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgPC90Ym9keT4KKyAgICAgICAgICA8L3Rncm91cD4KKyAgICAgICAgPC9pbmZvcm1hbHRhYmxlPgorICAgICAgPC9wYXJhPgorCisgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIDxmaXJzdHRlcm0gaWQ9InRlcm0tc3RyaW5nLWxpa2UtdHlwZSI+c3RyaW5nLWxpa2UgdHlwZXM8L2ZpcnN0dGVybT4KKyAgICAgICAgYXJlIGJhc2ljIHR5cGVzIHdpdGggYSB2YXJpYWJsZSBsZW5ndGguIFRoZSB2YWx1ZSBvZiBhbnkgc3RyaW5nLWxpa2UKKyAgICAgICAgdHlwZSBpcyBjb25jZXB0dWFsbHkgMCBvciBtb3JlIFVuaWNvZGUgY29kZXBvaW50cyBlbmNvZGVkIGluIFVURi04LAorICAgICAgICBub25lIG9mIHdoaWNoIG1heSBiZSBVKzAwMDAuIFRoZSBVVEYtOCB0ZXh0IG11c3QgYmUgdmFsaWRhdGVkCisgICAgICAgIHN0cmljdGx5OiBpbiBwYXJ0aWN1bGFyLCBpdCBtdXN0IG5vdCBjb250YWluIG92ZXJsb25nIHNlcXVlbmNlcworICAgICAgICBvciBjb2RlcG9pbnRzIGFib3ZlIFUrMTBGRkZGLgorICAgICAgPC9wYXJhPgorCisgICAgICA8cGFyYT4KKyAgICAgICAgU2luY2UgRC1CdXMgU3BlY2lmaWNhdGlvbiB2ZXJzaW9uIDAuMjEsIGluIGFjY29yZGFuY2Ugd2l0aCBVbmljb2RlCisgICAgICAgIENvcnJpZ2VuZHVtICM5LCB0aGUgIm5vbmNoYXJhY3RlcnMiIFUrRkREMC4uVStGREVGLCBVK25GRkZFIGFuZAorICAgICAgICBVK25GRkZGIGFyZSBhbGxvd2VkIGluIFVURi04IHN0cmluZ3MgKGJ1dCBub3RlIHRoYXQgb2xkZXIgdmVyc2lvbnMgb2YKKyAgICAgICAgRC1CdXMgcmVqZWN0ZWQgdGhlc2Ugbm9uY2hhcmFjdGVycykuCisgICAgICA8L3BhcmE+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBUaGUgbWFyc2hhbGxpbmcgZm9ybWF0cyBmb3IgdGhlIHN0cmluZy1saWtlIHR5cGVzIGFsbCBlbmQgd2l0aCBhCisgICAgICAgIHNpbmdsZSB6ZXJvIChOVUwpIGJ5dGUsIGJ1dCB0aGF0IGJ5dGUgaXMgbm90IGNvbnNpZGVyZWQgdG8gYmUgcGFydCBvZgorICAgICAgICB0aGUgdGV4dC4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIFRoZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIHN0cmluZy1saWtlIHR5cGVzIGFyZSBsaXN0ZWQgaW4gdGhpcyB0YWJsZS4KKworICAgICAgICA8aW5mb3JtYWx0YWJsZT4KKyAgICAgICAgICA8dGdyb3VwIGNvbHM9IjMiPgorICAgICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT5Db252ZW50aW9uYWwgbmFtZTwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PkFTQ0lJIHR5cGUtY29kZTwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PlZhbGlkaXR5IGNvbnN0cmFpbnRzPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5TVFJJTkc8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+czwvbGl0ZXJhbD4gKDExNSk8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5ObyBleHRyYSBjb25zdHJhaW50czwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5PQkpFQ1RfUEFUSDwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5vPC9saXRlcmFsPiAoMTExKTwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5Pk11c3QgYmUKKyAgICAgICAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9Im1lc3NhZ2UtcHJvdG9jb2wtbWFyc2hhbGluZy1vYmplY3QtcGF0aCI+YQorICAgICAgICAgICAgICAgICAgICBzeW50YWN0aWNhbGx5IHZhbGlkIG9iamVjdCBwYXRoPC9saW5rPjwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5TSUdOQVRVUkU8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+ZzwvbGl0ZXJhbD4gKDEwMyk8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5aZXJvIG9yIG1vcmUKKyAgICAgICAgICAgICAgICAgIDxmaXJzdHRlcm0gbGlua2VuZD0idGVybS1zaW5nbGUtY29tcGxldGUtdHlwZSI+c2luZ2xlCisgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlIHR5cGVzPC9maXJzdHRlcm0+PC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICA8L3Rib2R5PgorICAgICAgICAgIDwvdGdyb3VwPgorICAgICAgICA8L2luZm9ybWFsdGFibGU+CisgICAgICA8L3BhcmE+CisKKyAgICAgIDxzZWN0MyBpZD0ibWVzc2FnZS1wcm90b2NvbC1tYXJzaGFsaW5nLW9iamVjdC1wYXRoIj4KKyAgICAgICAgPHRpdGxlPlZhbGlkIE9iamVjdCBQYXRoczwvdGl0bGU+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgQW4gb2JqZWN0IHBhdGggaXMgYSBuYW1lIHVzZWQgdG8gcmVmZXIgdG8gYW4gb2JqZWN0IGluc3RhbmNlLgorICAgICAgICAgIENvbmNlcHR1YWxseSwgZWFjaCBwYXJ0aWNpcGFudCBpbiBhIEQtQnVzIG1lc3NhZ2UgZXhjaGFuZ2UgbWF5IGhhdmUKKyAgICAgICAgICBhbnkgbnVtYmVyIG9mIG9iamVjdCBpbnN0YW5jZXMgKHRoaW5rIG9mIEMrKyBvciBKYXZhIG9iamVjdHMpIGFuZCBlYWNoCisgICAgICAgICAgc3VjaCBpbnN0YW5jZSB3aWxsIGhhdmUgYSBwYXRoLiBMaWtlIGEgZmlsZXN5c3RlbSwgdGhlIG9iamVjdAorICAgICAgICAgIGluc3RhbmNlcyBpbiBhbiBhcHBsaWNhdGlvbiBmb3JtIGEgaGllcmFyY2hpY2FsIHRyZWUuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICBPYmplY3QgcGF0aHMgYXJlIG9mdGVuIG5hbWVzcGFjZWQgYnkgc3RhcnRpbmcgd2l0aCBhIHJldmVyc2VkCisgICAgICAgICAgZG9tYWluIG5hbWUgYW5kIGNvbnRhaW5pbmcgYW4gaW50ZXJmYWNlIHZlcnNpb24gbnVtYmVyLCBpbiB0aGUKKyAgICAgICAgICBzYW1lIHdheSBhcworICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9Im1lc3NhZ2UtcHJvdG9jb2wtbmFtZXMtaW50ZXJmYWNlIj5pbnRlcmZhY2UKKyAgICAgICAgICAgIG5hbWVzPC9saW5rPiBhbmQKKyAgICAgICAgICA8bGluayBsaW5rZW5kPSJtZXNzYWdlLXByb3RvY29sLW5hbWVzLWJ1cyI+d2VsbC1rbm93bgorICAgICAgICAgICAgYnVzIG5hbWVzPC9saW5rPi4KKyAgICAgICAgICBUaGlzIG1ha2VzIGl0IHBvc3NpYmxlIHRvIGltcGxlbWVudCBtb3JlIHRoYW4gb25lIHNlcnZpY2UsIG9yCisgICAgICAgICAgbW9yZSB0aGFuIG9uZSB2ZXJzaW9uIG9mIGEgc2VydmljZSwgaW4gdGhlIHNhbWUgcHJvY2VzcywKKyAgICAgICAgICBldmVuIGlmIHRoZSBzZXJ2aWNlcyBzaGFyZSBhIGNvbm5lY3Rpb24gYnV0IGNhbm5vdCBvdGhlcndpc2UKKyAgICAgICAgICBjby1vcGVyYXRlIChmb3IgaW5zdGFuY2UsIGlmIHRoZXkgYXJlIGltcGxlbWVudGVkIGJ5IGRpZmZlcmVudAorICAgICAgICAgIHBsdWdpbnMpLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgVXNpbmcgYW4gb2JqZWN0IHBhdGggb2YgPGxpdGVyYWw+LzwvbGl0ZXJhbD4gaXMgYWxsb3dlZCwgYnV0CisgICAgICAgICAgcmVjb21tZW5kZWQgYWdhaW5zdCwgYXMgaXQgbWFrZXMgdmVyc2lvbmluZyBvZiBpbnRlcmZhY2VzIGhhcmQuIEFueQorICAgICAgICAgIHNpZ25hbHMgZW1pdHRlZCBmcm9tIGEgRC1CdXMgb2JqZWN0IGhhdmUgdGhlIHNlcnZpY2XigJlzIHVuaXF1ZSBidXMgbmFtZQorICAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCB0aGVtLCByYXRoZXIgdGhhbiBpdHMgd2VsbC1rbm93biBuYW1lLiBUaGlzIG1lYW5zIHRoYXQKKyAgICAgICAgICByZWNlaXBpZW50cyBvZiB0aGUgc2lnbmFscyBtdXN0IHJlbHkgZW50aXJlbHkgb24gdGhlIHNpZ25hbCBuYW1lIGFuZAorICAgICAgICAgIG9iamVjdCBwYXRoIHRvIHdvcmsgb3V0IHdoaWNoIGludGVyZmFjZSB0aGUgc2lnbmFsIG9yaWdpbmF0ZWQgZnJvbS4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEZvciBpbnN0YW5jZSwgaWYgdGhlIG93bmVyIG9mIDxsaXRlcmFsPmV4YW1wbGUuY29tPC9saXRlcmFsPiBpcworICAgICAgICAgIGRldmVsb3BpbmcgYSBELUJ1cyBBUEkgZm9yIGEgbXVzaWMgcGxheWVyLCB0aGV5IG1pZ2h0IHVzZSB0aGUKKyAgICAgICAgICBoaWVyYXJjaHkgb2Ygb2JqZWN0IHBhdGhzIHRoYXQgc3RhcnQgd2l0aAorICAgICAgICAgIDxsaXRlcmFsPi9jb20vZXhhbXBsZS9NdXNpY1BsYXllcjE8L2xpdGVyYWw+IGZvciBpdHMgb2JqZWN0cy4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgIFRoZSBmb2xsb3dpbmcgcnVsZXMgZGVmaW5lIGEgdmFsaWQgb2JqZWN0IHBhdGguIEltcGxlbWVudGF0aW9ucyBtdXN0CisgICAgICAgICAgbm90IHNlbmQgb3IgYWNjZXB0IG1lc3NhZ2VzIHdpdGggaW52YWxpZCBvYmplY3QgcGF0aHMuCisgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgVGhlIHBhdGggbWF5IGJlIG9mIGFueSBsZW5ndGguCisgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFRoZSBwYXRoIG11c3QgYmVnaW4gd2l0aCBhbiBBU0NJSSAnLycgKGludGVnZXIgNDcpIGNoYXJhY3RlciwKKyAgICAgICAgICAgICAgICBhbmQgbXVzdCBjb25zaXN0IG9mIGVsZW1lbnRzIHNlcGFyYXRlZCBieSBzbGFzaCBjaGFyYWN0ZXJzLgorICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBFYWNoIGVsZW1lbnQgbXVzdCBvbmx5IGNvbnRhaW4gdGhlIEFTQ0lJIGNoYXJhY3RlcnMKKyAgICAgICAgICAgICAgICAiW0EtWl1bYS16XVswLTldXyIKKyAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgTm8gZWxlbWVudCBtYXkgYmUgdGhlIGVtcHR5IHN0cmluZy4KKyAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgTXVsdGlwbGUgJy8nIGNoYXJhY3RlcnMgY2Fubm90IG9jY3VyIGluIHNlcXVlbmNlLgorICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBBIHRyYWlsaW5nICcvJyBjaGFyYWN0ZXIgaXMgbm90IGFsbG93ZWQgdW5sZXNzIHRoZQorICAgICAgICAgICAgICAgIHBhdGggaXMgdGhlIHJvb3QgcGF0aCAoYSBzaW5nbGUgJy8nIGNoYXJhY3RlcikuCisgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgIDwvcGFyYT4KKworICAgICAgPC9zZWN0Mz4KKworICAgICAgPHNlY3QzIGlkPSJtZXNzYWdlLXByb3RvY29sLW1hcnNoYWxpbmctc2lnbmF0dXJlIj4KKyAgICAgICAgPHRpdGxlPlZhbGlkIFNpZ25hdHVyZXM8L3RpdGxlPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBBbiBpbXBsZW1lbnRhdGlvbiBtdXN0IG5vdCBzZW5kIG9yIGFjY2VwdCBpbnZhbGlkIHNpZ25hdHVyZXMuCisgICAgICAgICAgVmFsaWQgc2lnbmF0dXJlcyB3aWxsIGNvbmZvcm0gdG8gdGhlIGZvbGxvd2luZyBydWxlczoKKyAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBUaGUgc2lnbmF0dXJlIGlzIGEgbGlzdCBvZiBzaW5nbGUgY29tcGxldGUgdHlwZXMuCisgICAgICAgICAgICAgICAgQXJyYXlzIG11c3QgaGF2ZSBlbGVtZW50IHR5cGVzLCBhbmQgc3RydWN0cyBtdXN0CisgICAgICAgICAgICAgICAgaGF2ZSBib3RoIG9wZW4gYW5kIGNsb3NlIHBhcmVudGhlc2VzLgorICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBPbmx5IHR5cGUgY29kZXMsIG9wZW4gYW5kIGNsb3NlIHBhcmVudGhlc2VzLCBhbmQgb3BlbiBhbmQKKyAgICAgICAgICAgICAgICBjbG9zZSBjdXJseSBicmFja2V0cyBhcmUgYWxsb3dlZCBpbiB0aGUgc2lnbmF0dXJlLiBUaGUKKyAgICAgICAgICAgICAgICA8bGl0ZXJhbD5TVFJVQ1Q8L2xpdGVyYWw+IHR5cGUgY29kZQorICAgICAgICAgICAgICAgIGlzIG5vdCBhbGxvd2VkIGluIHNpZ25hdHVyZXMsIGJlY2F1c2UgcGFyZW50aGVzZXMKKyAgICAgICAgICAgICAgICBhcmUgdXNlZCBpbnN0ZWFkLiBTaW1pbGFybHksIHRoZQorICAgICAgICAgICAgICAgIDxsaXRlcmFsPkRJQ1RfRU5UUlk8L2xpdGVyYWw+IHR5cGUgY29kZSBpcyBub3QgYWxsb3dlZCBpbgorICAgICAgICAgICAgICAgIHNpZ25hdHVyZXMsIGJlY2F1c2UgY3VybHkgYnJhY2tldHMgYXJlIHVzZWQgaW5zdGVhZC4KKyAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgVGhlIG1heGltdW0gZGVwdGggb2YgY29udGFpbmVyIHR5cGUgbmVzdGluZyBpcyAzMiBhcnJheSB0eXBlCisgICAgICAgICAgICAgICAgY29kZXMgYW5kIDMyIG9wZW4gcGFyZW50aGVzZXMuIFRoaXMgaW1wbGllcyB0aGF0IHRoZSBtYXhpbXVtCisgICAgICAgICAgICAgICAgdG90YWwgZGVwdGggb2YgcmVjdXJzaW9uIGlzIDY0LCBmb3IgYW4gImFycmF5IG9mIGFycmF5IG9mIGFycmF5CisgICAgICAgICAgICAgICAgb2YgLi4uIHN0cnVjdCBvZiBzdHJ1Y3Qgb2Ygc3RydWN0IG9mIC4uLiIgIHdoZXJlIHRoZXJlIGFyZSAzMgorICAgICAgICAgICAgICAgIGFycmF5IGFuZCAzMiBzdHJ1Y3QuCisgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFRoZSBtYXhpbXVtIGxlbmd0aCBvZiBhIHNpZ25hdHVyZSBpcyAyNTUuCisgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICBXaGVuIHNpZ25hdHVyZXMgYXBwZWFyIGluIG1lc3NhZ2VzLCB0aGUgbWFyc2hhbGxpbmcgZm9ybWF0CisgICAgICAgICAgZ3VhcmFudGVlcyB0aGF0IHRoZXkgd2lsbCBiZSBmb2xsb3dlZCBieSBhIG51bCBieXRlICh3aGljaCBjYW4KKyAgICAgICAgICBiZSBpbnRlcnByZXRlZCBhcyBlaXRoZXIgQy1zdHlsZSBzdHJpbmcgdGVybWluYXRpb24gb3IgdGhlIElOVkFMSUQKKyAgICAgICAgICB0eXBlLWNvZGUpLCBidXQgdGhpcyBpcyBub3QgY29uY2VwdHVhbGx5IHBhcnQgb2YgdGhlIHNpZ25hdHVyZS4KKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9zZWN0Mz4KKworICAgIDwvc2VjdDI+CisKKyAgICA8c2VjdDIgaWQ9ImNvbnRhaW5lci10eXBlcyI+CisgICAgICA8dGl0bGU+Q29udGFpbmVyIHR5cGVzPC90aXRsZT4KKworICAgICAgPHBhcmE+CisgICAgICAgIEluIGFkZGl0aW9uIHRvIGJhc2ljIHR5cGVzLCB0aGVyZSBhcmUgZm91ciA8Zmlyc3R0ZXJtPmNvbnRhaW5lcjwvZmlyc3R0ZXJtPgorICAgICAgICB0eXBlczogPGxpdGVyYWw+U1RSVUNUPC9saXRlcmFsPiwgPGxpdGVyYWw+QVJSQVk8L2xpdGVyYWw+LCA8bGl0ZXJhbD5WQVJJQU5UPC9saXRlcmFsPiwKKyAgICAgICAgYW5kIDxsaXRlcmFsPkRJQ1RfRU5UUlk8L2xpdGVyYWw+LgorICAgICAgPC9wYXJhPgorCisgICAgICA8cGFyYT4KKyAgICAgICAgPGxpdGVyYWw+U1RSVUNUPC9saXRlcmFsPiBoYXMgYSB0eXBlIGNvZGUsIEFTQ0lJIGNoYXJhY3RlciAncicsIGJ1dCB0aGlzIHR5cGUKKyAgICAgICAgY29kZSBkb2VzIG5vdCBhcHBlYXIgaW4gc2lnbmF0dXJlcy4gSW5zdGVhZCwgQVNDSUkgY2hhcmFjdGVycworICAgICAgICAnKCcgYW5kICcpJyBhcmUgdXNlZCB0byBtYXJrIHRoZSBiZWdpbm5pbmcgYW5kIGVuZCBvZiB0aGUgc3RydWN0LgorICAgICAgICBTbyBmb3IgZXhhbXBsZSwgYSBzdHJ1Y3QgY29udGFpbmluZyB0d28gaW50ZWdlcnMgd291bGQgaGF2ZSB0aGlzCisgICAgICAgIHNpZ25hdHVyZToKKyAgICAgICAgPHByb2dyYW1saXN0aW5nPgorICAgICAgICAgICIoaWkpIgorICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICBTdHJ1Y3RzIGNhbiBiZSBuZXN0ZWQsIHNvIGZvciBleGFtcGxlIGEgc3RydWN0IGNvbnRhaW5pbmcKKyAgICAgICAgYW4gaW50ZWdlciBhbmQgYW5vdGhlciBzdHJ1Y3Q6CisgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAiKGkoaWkpKSIKKyAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgVGhlIHZhbHVlIGJsb2NrIHN0b3JpbmcgdGhhdCBzdHJ1Y3Qgd291bGQgY29udGFpbiB0aHJlZSBpbnRlZ2VyczsgdGhlCisgICAgICAgIHR5cGUgc2lnbmF0dXJlIGFsbG93cyB5b3UgdG8gZGlzdGluZ3Vpc2ggIihpKGlpKSkiIGZyb20gIigoaWkpaSkiIG9yCisgICAgICAgICIoaWlpKSIgb3IgImlpaSIuCisgICAgICA8L3BhcmE+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBUaGUgPGxpdGVyYWw+U1RSVUNUPC9saXRlcmFsPiB0eXBlIGNvZGUgJ3InIGlzIG5vdCBjdXJyZW50bHkgdXNlZCBpbiB0aGUgRC1CdXMgcHJvdG9jb2wsCisgICAgICAgIGJ1dCBpcyB1c2VmdWwgaW4gY29kZSB0aGF0IGltcGxlbWVudHMgdGhlIHByb3RvY29sLiBUaGlzIHR5cGUgY29kZQorICAgICAgICBpcyBzcGVjaWZpZWQgdG8gYWxsb3cgc3VjaCBjb2RlIHRvIGludGVyb3BlcmF0ZSBpbiBub24tcHJvdG9jb2wgY29udGV4dHMuCisgICAgICA8L3BhcmE+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBFbXB0eSBzdHJ1Y3R1cmVzIGFyZSBub3QgYWxsb3dlZDsgdGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUKKyAgICAgICAgdHlwZSBjb2RlIGJldHdlZW4gdGhlIHBhcmVudGhlc2VzLgorICAgICAgPC9wYXJhPgorCisgICAgICA8cGFyYT4KKyAgICAgICAgPGxpdGVyYWw+QVJSQVk8L2xpdGVyYWw+IGhhcyBBU0NJSSBjaGFyYWN0ZXIgJ2EnIGFzIHR5cGUgY29kZS4gVGhlIGFycmF5IHR5cGUgY29kZSBtdXN0IGJlCisgICAgICAgIGZvbGxvd2VkIGJ5IGEgPGZpcnN0dGVybT5zaW5nbGUgY29tcGxldGUgdHlwZTwvZmlyc3R0ZXJtPi4gVGhlIHNpbmdsZQorICAgICAgICBjb21wbGV0ZSB0eXBlIGZvbGxvd2luZyB0aGUgYXJyYXkgaXMgdGhlIHR5cGUgb2YgZWFjaCBhcnJheSBlbGVtZW50LiBTbworICAgICAgICB0aGUgc2ltcGxlIGV4YW1wbGUgaXM6CisgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAiYWkiCisgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgIHdoaWNoIGlzIGFuIGFycmF5IG9mIDMyLWJpdCBpbnRlZ2Vycy4gQnV0IGFuIGFycmF5IGNhbiBiZSBvZiBhbnkgdHlwZSwKKyAgICAgICAgc3VjaCBhcyB0aGlzIGFycmF5LW9mLXN0cnVjdC13aXRoLXR3by1pbnQzMi1maWVsZHM6CisgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAiYShpaSkiCisgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgIE9yIHRoaXMgYXJyYXkgb2YgYXJyYXkgb2YgaW50ZWdlcjoKKyAgICAgICAgPHByb2dyYW1saXN0aW5nPgorICAgICAgICAgICJhYWkiCisgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICA8L3BhcmE+CisKKyAgICAgIDxwYXJhPgorICAgICAgICA8bGl0ZXJhbD5WQVJJQU5UPC9saXRlcmFsPiBoYXMgQVNDSUkgY2hhcmFjdGVyICd2JyBhcyBpdHMgdHlwZSBjb2RlLiBBIG1hcnNoYWxlZCB2YWx1ZSBvZgorICAgICAgICB0eXBlIDxsaXRlcmFsPlZBUklBTlQ8L2xpdGVyYWw+IHdpbGwgaGF2ZSB0aGUgc2lnbmF0dXJlIG9mIGEgc2luZ2xlIGNvbXBsZXRlIHR5cGUgYXMgcGFydAorICAgICAgICBvZiB0aGUgPGVtcGhhc2lzPnZhbHVlPC9lbXBoYXNpcz4uICBUaGlzIHNpZ25hdHVyZSB3aWxsIGJlIGZvbGxvd2VkIGJ5IGEKKyAgICAgICAgbWFyc2hhbGVkIHZhbHVlIG9mIHRoYXQgdHlwZS4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIFVubGlrZSBhIG1lc3NhZ2Ugc2lnbmF0dXJlLCB0aGUgdmFyaWFudCBzaWduYXR1cmUgY2FuCisgICAgICAgIGNvbnRhaW4gb25seSBhIHNpbmdsZSBjb21wbGV0ZSB0eXBlLiAgU28gImkiLCAiYWkiCisgICAgICAgIG9yICIoaWkpIiBpcyBPSywgYnV0ICJpaSIgaXMgbm90LiAgVXNlIG9mIHZhcmlhbnRzIG1heSBub3QKKyAgICAgICAgY2F1c2UgYSB0b3RhbCBtZXNzYWdlIGRlcHRoIHRvIGJlIGxhcmdlciB0aGFuIDY0LCBpbmNsdWRpbmcKKyAgICAgICAgb3RoZXIgY29udGFpbmVyIHR5cGVzIHN1Y2ggYXMgc3RydWN0dXJlcy4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIEEgPGxpdGVyYWw+RElDVF9FTlRSWTwvbGl0ZXJhbD4gd29ya3MgZXhhY3RseSBsaWtlIGEgc3RydWN0LCBidXQgcmF0aGVyCisgICAgICAgIHRoYW4gcGFyZW50aGVzZXMgaXQgdXNlcyBjdXJseSBicmFjZXMsIGFuZCBpdCBoYXMgbW9yZSByZXN0cmljdGlvbnMuCisgICAgICAgIFRoZSByZXN0cmljdGlvbnMgYXJlOiBpdCBvY2N1cnMgb25seSBhcyBhbiBhcnJheSBlbGVtZW50IHR5cGU7IGl0IGhhcworICAgICAgICBleGFjdGx5IHR3byBzaW5nbGUgY29tcGxldGUgdHlwZXMgaW5zaWRlIHRoZSBjdXJseSBicmFjZXM7IHRoZSBmaXJzdAorICAgICAgICBzaW5nbGUgY29tcGxldGUgdHlwZSAodGhlICJrZXkiKSBtdXN0IGJlIGEgYmFzaWMgdHlwZSByYXRoZXIgdGhhbiBhCisgICAgICAgIGNvbnRhaW5lciB0eXBlLiBJbXBsZW1lbnRhdGlvbnMgbXVzdCBub3QgYWNjZXB0IGRpY3QgZW50cmllcyBvdXRzaWRlIG9mCisgICAgICAgIGFycmF5cywgbXVzdCBub3QgYWNjZXB0IGRpY3QgZW50cmllcyB3aXRoIHplcm8sIG9uZSwgb3IgbW9yZSB0aGFuIHR3bworICAgICAgICBmaWVsZHMsIGFuZCBtdXN0IG5vdCBhY2NlcHQgZGljdCBlbnRyaWVzIHdpdGggbm9uLWJhc2ljLXR5cGVkIGtleXMuIEEKKyAgICAgICAgZGljdCBlbnRyeSBpcyBhbHdheXMgYSBrZXktdmFsdWUgcGFpci4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIFRoZSBmaXJzdCBmaWVsZCBpbiB0aGUgPGxpdGVyYWw+RElDVF9FTlRSWTwvbGl0ZXJhbD4gaXMgYWx3YXlzIHRoZSBrZXkuCisgICAgICAgIEEgbWVzc2FnZSBpcyBjb25zaWRlcmVkIGNvcnJ1cHQgaWYgdGhlIHNhbWUga2V5IG9jY3VycyB0d2ljZSBpbiB0aGUgc2FtZQorICAgICAgICBhcnJheSBvZiA8bGl0ZXJhbD5ESUNUX0VOVFJZPC9saXRlcmFsPi4gSG93ZXZlciwgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMKKyAgICAgICAgaW1wbGVtZW50YXRpb25zIGFyZSBub3QgcmVxdWlyZWQgdG8gcmVqZWN0IGRpY3RzIHdpdGggZHVwbGljYXRlIGtleXMuCisgICAgICA8L3BhcmE+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBJbiBtb3N0IGxhbmd1YWdlcywgYW4gYXJyYXkgb2YgZGljdCBlbnRyeSB3b3VsZCBiZSByZXByZXNlbnRlZCBhcyBhCisgICAgICAgIG1hcCwgaGFzaCB0YWJsZSwgb3IgZGljdCBvYmplY3QuCisgICAgICA8L3BhcmE+CisgICAgPC9zZWN0Mj4KKworICAgIDxzZWN0Mj4KKyAgICAgIDx0aXRsZT5TdW1tYXJ5IG9mIHR5cGVzPC90aXRsZT4KKworICAgICAgPHBhcmE+CisgICAgICAgIFRoZSBmb2xsb3dpbmcgdGFibGUgc3VtbWFyaXplcyB0aGUgRC1CdXMgdHlwZXMuCisgICAgICAgIDxpbmZvcm1hbHRhYmxlPgorICAgICAgICAgIDx0Z3JvdXAgY29scz0iMyI+CisgICAgICAgICAgICA8dGhlYWQ+CisgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PkNhdGVnb3J5PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+Q29udmVudGlvbmFsIE5hbWU8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5Db2RlPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+RGVzY3JpcHRpb248L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgIDwvdGhlYWQ+CisgICAgICAgICAgICA8dGJvZHk+CisgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PnJlc2VydmVkPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+SU5WQUxJRDwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT4wIChBU0NJSSBOVUwpPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+Tm90IGEgdmFsaWQgdHlwZSBjb2RlLCB1c2VkIHRvIHRlcm1pbmF0ZSBzaWduYXR1cmVzPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+PHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+Zml4ZWQsIGJhc2ljPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+QllURTwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT4xMjEgKEFTQ0lJICd5Jyk8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT44LWJpdCB1bnNpZ25lZCBpbnRlZ2VyPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+PHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+Zml4ZWQsIGJhc2ljPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+Qk9PTEVBTjwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT45OCAoQVNDSUkgJ2InKTwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PkJvb2xlYW4gdmFsdWUsIDAgaXMgPGxpdGVyYWw+RkFMU0U8L2xpdGVyYWw+IGFuZCAxIGlzIDxsaXRlcmFsPlRSVUU8L2xpdGVyYWw+LiBFdmVyeXRoaW5nIGVsc2UgaXMgaW52YWxpZC48L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz48cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT5maXhlZCwgYmFzaWM8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5JTlQxNjwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT4xMTAgKEFTQ0lJICduJyk8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT4xNi1iaXQgc2lnbmVkIGludGVnZXI8L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz48cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT5maXhlZCwgYmFzaWM8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5VSU5UMTY8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+MTEzIChBU0NJSSAncScpPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+MTYtYml0IHVuc2lnbmVkIGludGVnZXI8L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz48cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT5maXhlZCwgYmFzaWM8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5JTlQzMjwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT4xMDUgKEFTQ0lJICdpJyk8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT4zMi1iaXQgc2lnbmVkIGludGVnZXI8L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz48cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT5maXhlZCwgYmFzaWM8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5VSU5UMzI8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+MTE3IChBU0NJSSAndScpPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+MzItYml0IHVuc2lnbmVkIGludGVnZXI8L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz48cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT5maXhlZCwgYmFzaWM8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5JTlQ2NDwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT4xMjAgKEFTQ0lJICd4Jyk8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT42NC1iaXQgc2lnbmVkIGludGVnZXI8L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz48cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT5maXhlZCwgYmFzaWM8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5VSU5UNjQ8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+MTE2IChBU0NJSSAndCcpPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+NjQtYml0IHVuc2lnbmVkIGludGVnZXI8L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz48cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT5maXhlZCwgYmFzaWM8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5ET1VCTEU8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+MTAwIChBU0NJSSAnZCcpPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+SUVFRSA3NTQgZG91YmxlPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+PHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+c3RyaW5nLWxpa2UsIGJhc2ljPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+U1RSSU5HPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PjExNSAoQVNDSUkgJ3MnKTwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PlVURi04IHN0cmluZyAoPGVtcGhhc2lzPm11c3Q8L2VtcGhhc2lzPiBiZSB2YWxpZCBVVEYtOCkuIE11c3QgYmUgbnVsIHRlcm1pbmF0ZWQgYW5kIGNvbnRhaW4gbm8gb3RoZXIgbnVsIGJ5dGVzLjwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93Pjxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PnN0cmluZy1saWtlLCBiYXNpYzwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPk9CSkVDVF9QQVRIPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PjExMSAoQVNDSUkgJ28nKTwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5Pk5hbWUgb2YgYW4gb2JqZWN0IGluc3RhbmNlPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+PHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+c3RyaW5nLWxpa2UsIGJhc2ljPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+U0lHTkFUVVJFPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PjEwMyAoQVNDSUkgJ2cnKTwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PkEgdHlwZSBzaWduYXR1cmU8L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz48cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT5jb250YWluZXI8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5BUlJBWTwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT45NyAoQVNDSUkgJ2EnKTwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PkFycmF5PC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+PHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+Y29udGFpbmVyPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+U1RSVUNUPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PjExNCAoQVNDSUkgJ3InKSwgNDAgKEFTQ0lJICcoJyksIDQxIChBU0NJSSAnKScpPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+U3RydWN0OyB0eXBlIGNvZGUgMTE0ICdyJyBpcyByZXNlcnZlZCBmb3IgdXNlIGluCisgICAgICAgICAgICAgICAgICBiaW5kaW5ncyBhbmQgaW1wbGVtZW50YXRpb25zIHRvIHJlcHJlc2VudCB0aGUgZ2VuZXJhbAorICAgICAgICAgICAgICAgICAgY29uY2VwdCBvZiBhIHN0cnVjdCwgYW5kIG11c3Qgbm90IGFwcGVhciBpbiBzaWduYXR1cmVzCisgICAgICAgICAgICAgICAgICB1c2VkIG9uIEQtQnVzLjwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93Pjxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PmNvbnRhaW5lcjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPlZBUklBTlQ8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+MTE4IChBU0NJSSAndicpIDwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PlZhcmlhbnQgdHlwZSAodGhlIHR5cGUgb2YgdGhlIHZhbHVlIGlzIHBhcnQgb2YgdGhlIHZhbHVlIGl0c2VsZik8L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz48cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT5jb250YWluZXI8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5ESUNUX0VOVFJZPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PjEwMSAoQVNDSUkgJ2UnKSwgMTIzIChBU0NJSSAneycpLCAxMjUgKEFTQ0lJICd9JykgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+RW50cnkgaW4gYSBkaWN0IG9yIG1hcCAoYXJyYXkgb2Yga2V5LXZhbHVlIHBhaXJzKS4KKyAgICAgICAgICAgICAgICAgIFR5cGUgY29kZSAxMDEgJ2UnIGlzIHJlc2VydmVkIGZvciB1c2UgaW4gYmluZGluZ3MgYW5kCisgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbnMgdG8gcmVwcmVzZW50IHRoZSBnZW5lcmFsIGNvbmNlcHQgb2YgYQorICAgICAgICAgICAgICAgICAgZGljdCBvciBkaWN0LWVudHJ5LCBhbmQgbXVzdCBub3QgYXBwZWFyIGluIHNpZ25hdHVyZXMKKyAgICAgICAgICAgICAgICAgIHVzZWQgb24gRC1CdXMuPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+PHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+Zml4ZWQsIGJhc2ljPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+VU5JWF9GRDwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT4xMDQgKEFTQ0lJICdoJyk8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5Vbml4IGZpbGUgZGVzY3JpcHRvcjwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT5yZXNlcnZlZDwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PihyZXNlcnZlZCk8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT4xMDkgKEFTQ0lJICdtJyk8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5SZXNlcnZlZCBmb3IgPHVsaW5rCisgICAgICAgICAgICAgICAgICAgIHVybD0iaHR0cHM6Ly9idWdzLmZyZWVkZXNrdG9wLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Mjc4NTciPmEKKyAgICAgICAgICAgICAgICAgICdtYXliZScgdHlwZSBjb21wYXRpYmxlIHdpdGggdGhlIG9uZSBpbiBHVmFyaWFudDwvdWxpbms+LAorICAgICAgICAgICAgICAgICAgYW5kIG11c3Qgbm90IGFwcGVhciBpbiBzaWduYXR1cmVzIHVzZWQgb24gRC1CdXMgdW50aWwKKyAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCBoZXJlPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PnJlc2VydmVkPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+KHJlc2VydmVkKTwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PjQyIChBU0NJSSAnKicpPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+UmVzZXJ2ZWQgZm9yIHVzZSBpbiBiaW5kaW5ncy9pbXBsZW1lbnRhdGlvbnMgdG8KKyAgICAgICAgICAgICAgICAgIHJlcHJlc2VudCBhbnkgPGZpcnN0dGVybT5zaW5nbGUgY29tcGxldGUgdHlwZTwvZmlyc3R0ZXJtPiwKKyAgICAgICAgICAgICAgICAgIGFuZCBtdXN0IG5vdCBhcHBlYXIgaW4gc2lnbmF0dXJlcyB1c2VkIG9uIEQtQnVzLjwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT5yZXNlcnZlZDwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PihyZXNlcnZlZCk8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT42MyAoQVNDSUkgJz8nKTwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PlJlc2VydmVkIGZvciB1c2UgaW4gYmluZGluZ3MvaW1wbGVtZW50YXRpb25zIHRvCisgICAgICAgICAgICAgICAgICByZXByZXNlbnQgYW55IDxmaXJzdHRlcm0+YmFzaWMgdHlwZTwvZmlyc3R0ZXJtPiwgYW5kIG11c3QKKyAgICAgICAgICAgICAgICAgIG5vdCBhcHBlYXIgaW4gc2lnbmF0dXJlcyB1c2VkIG9uIEQtQnVzLjwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT5yZXNlcnZlZDwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PihyZXNlcnZlZCk8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT42NCAoQVNDSUkgJ0AnKSwgMzggKEFTQ0lJICcmYW1wOycpLAorICAgICAgICAgICAgICAgICAgOTQgKEFTQ0lJICdeJyk8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5SZXNlcnZlZCBmb3IgaW50ZXJuYWwgdXNlIGJ5IGJpbmRpbmdzL2ltcGxlbWVudGF0aW9ucywKKyAgICAgICAgICAgICAgICAgIGFuZCBtdXN0IG5vdCBhcHBlYXIgaW4gc2lnbmF0dXJlcyB1c2VkIG9uIEQtQnVzLgorICAgICAgICAgICAgICAgICAgR1ZhcmlhbnQgdXNlcyB0aGVzZSB0eXBlLWNvZGVzIHRvIGVuY29kZSBjYWxsaW5nCisgICAgICAgICAgICAgICAgICBjb252ZW50aW9ucy48L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgIDwvdGJvZHk+CisgICAgICAgICAgPC90Z3JvdXA+CisgICAgICAgIDwvaW5mb3JtYWx0YWJsZT4KKyAgICAgIDwvcGFyYT4KKworICAgIDwvc2VjdDI+CisgIDwvc2VjdDE+CisKKyAgPHNlY3QxIGlkPSJtZXNzYWdlLXByb3RvY29sLW1hcnNoYWxpbmciPgorICAgIDx0aXRsZT5NYXJzaGFsaW5nIChXaXJlIEZvcm1hdCk8L3RpdGxlPgorCisgICAgPHBhcmE+CisgICAgICBELUJ1cyBkZWZpbmVzIGEgbWFyc2hhbGxpbmcgZm9ybWF0IGZvciBpdHMgdHlwZSBzeXN0ZW0sIHdoaWNoIGlzCisgICAgICB1c2VkIGluIEQtQnVzIG1lc3NhZ2VzLiBUaGlzIGlzIG5vdCB0aGUgb25seSBwb3NzaWJsZSBtYXJzaGFsbGluZworICAgICAgZm9ybWF0IGZvciB0aGUgdHlwZSBzeXN0ZW06IGZvciBpbnN0YW5jZSwgR1ZhcmlhbnQgKHBhcnQgb2YgR0xpYikKKyAgICAgIHJlLXVzZXMgdGhlIEQtQnVzIHR5cGUgc3lzdGVtIGJ1dCBpbXBsZW1lbnRzIGFuIGFsdGVybmF0aXZlIG1hcnNoYWxsaW5nCisgICAgICBmb3JtYXQuCisgICAgPC9wYXJhPgorCisgICAgPHNlY3QyPgorICAgICAgPHRpdGxlPkJ5dGUgb3JkZXIgYW5kIGFsaWdubWVudDwvdGl0bGU+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBHaXZlbiBhIHR5cGUgc2lnbmF0dXJlLCBhIGJsb2NrIG9mIGJ5dGVzIGNhbiBiZSBjb252ZXJ0ZWQgaW50byB0eXBlZAorICAgICAgICB2YWx1ZXMuIFRoaXMgc2VjdGlvbiBkZXNjcmliZXMgdGhlIGZvcm1hdCBvZiB0aGUgYmxvY2sgb2YgYnl0ZXMuICBCeXRlCisgICAgICAgIG9yZGVyIGFuZCBhbGlnbm1lbnQgaXNzdWVzIGFyZSBoYW5kbGVkIHVuaWZvcm1seSBmb3IgYWxsIEQtQnVzIHR5cGVzLgorICAgICAgPC9wYXJhPgorCisgICAgICA8cGFyYT4KKyAgICAgICAgQSBibG9jayBvZiBieXRlcyBoYXMgYW4gYXNzb2NpYXRlZCBieXRlIG9yZGVyLiBUaGUgYnl0ZSBvcmRlcgorICAgICAgICBoYXMgdG8gYmUgZGlzY292ZXJlZCBpbiBzb21lIHdheTsgZm9yIEQtQnVzIG1lc3NhZ2VzLCB0aGUKKyAgICAgICAgYnl0ZSBvcmRlciBpcyBwYXJ0IG9mIHRoZSBtZXNzYWdlIGhlYWRlciBhcyBkZXNjcmliZWQgaW4KKyAgICAgICAgPHhyZWYgbGlua2VuZD0ibWVzc2FnZS1wcm90b2NvbC1tZXNzYWdlcyIvPi4gRm9yIG5vdywgYXNzdW1lCisgICAgICAgIHRoYXQgdGhlIGJ5dGUgb3JkZXIgaXMga25vd24gdG8gYmUgZWl0aGVyIGxpdHRsZSBlbmRpYW4gb3IgYmlnCisgICAgICAgICAgZW5kaWFuLgorICAgICAgPC9wYXJhPgorCisgICAgICA8cGFyYT4KKyAgICAgICAgRWFjaCB2YWx1ZSBpbiBhIGJsb2NrIG9mIGJ5dGVzIGlzIGFsaWduZWQgIm5hdHVyYWxseSwiIGZvciBleGFtcGxlCisgICAgICAgIDQtYnl0ZSB2YWx1ZXMgYXJlIGFsaWduZWQgdG8gYSA0LWJ5dGUgYm91bmRhcnksIGFuZCA4LWJ5dGUgdmFsdWVzIHRvIGFuCisgICAgICAgIDgtYnl0ZSBib3VuZGFyeS4gQm91bmRhcmllcyBhcmUgY2FsY3VsYXRlZCBnbG9iYWxseSwgd2l0aCByZXNwZWN0IHRvCisgICAgICAgIHRoZSBmaXJzdCBieXRlIGluIHRoZSBtZXNzYWdlLiBUbyBwcm9wZXJseSBhbGlnbiBhIHZhbHVlLAorICAgICAgICA8Zmlyc3R0ZXJtPmFsaWdubWVudCBwYWRkaW5nPC9maXJzdHRlcm0+IG1heSBiZSBuZWNlc3NhcnkgYmVmb3JlIHRoZQorICAgICAgICB2YWx1ZS4gVGhlIGFsaWdubWVudCBwYWRkaW5nIG11c3QgYWx3YXlzCisgICAgICAgIGJlIHRoZSBtaW5pbXVtIHJlcXVpcmVkIHBhZGRpbmcgdG8gcHJvcGVybHkgYWxpZ24gdGhlIGZvbGxvd2luZyB2YWx1ZTsKKyAgICAgICAgYW5kIGl0IG11c3QgYWx3YXlzIGJlIG1hZGUgdXAgb2YgbnVsIGJ5dGVzLiBUaGUgYWxpZ25tZW50IHBhZGRpbmcgbXVzdAorICAgICAgICBub3QgYmUgbGVmdCB1bmluaXRpYWxpemVkIChpdCBjYW4ndCBjb250YWluIGdhcmJhZ2UpLCBhbmQgbW9yZSBwYWRkaW5nCisgICAgICAgIHRoYW4gcmVxdWlyZWQgbXVzdCBub3QgYmUgdXNlZC4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIEFzIGFuIGV4Y2VwdGlvbiB0byBuYXR1cmFsIGFsaWdubWVudCwgPGxpdGVyYWw+U1RSVUNUPC9saXRlcmFsPiBhbmQKKyAgICAgICAgPGxpdGVyYWw+RElDVF9FTlRSWTwvbGl0ZXJhbD4gdmFsdWVzIGFyZSBhbHdheXMgYWxpZ25lZCB0byBhbiA4LWJ5dGUKKyAgICAgICAgYm91bmRhcnksIHJlZ2FyZGxlc3Mgb2YgdGhlIGFsaWdubWVudHMgb2YgdGhlaXIgY29udGVudHMuCisgICAgICA8L3BhcmE+CisgICAgPC9zZWN0Mj4KKworICAgIDxzZWN0Mj4KKyAgICAgIDx0aXRsZT5NYXJzaGFsbGluZyBiYXNpYyB0eXBlczwvdGl0bGU+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBUbyBtYXJzaGFsIGFuZCB1bm1hcnNoYWwgZml4ZWQgdHlwZXMsIHlvdSBzaW1wbHkgcmVhZCBvbmUgdmFsdWUKKyAgICAgICAgZnJvbSB0aGUgZGF0YSBibG9jayBjb3JyZXNwb25kaW5nIHRvIGVhY2ggdHlwZSBjb2RlIGluIHRoZSBzaWduYXR1cmUuCisgICAgICAgIEFsbCBzaWduZWQgaW50ZWdlciB2YWx1ZXMgYXJlIGVuY29kZWQgaW4gdHdvJ3MgY29tcGxlbWVudCwgRE9VQkxFCisgICAgICAgIHZhbHVlcyBhcmUgSUVFRSA3NTQgZG91YmxlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCwgYW5kIEJPT0xFQU4KKyAgICAgICAgdmFsdWVzIGFyZSBlbmNvZGVkIGluIDMyIGJpdHMgKG9mIHdoaWNoIG9ubHkgdGhlIGxlYXN0IHNpZ25pZmljYW50CisgICAgICAgIGJpdCBpcyB1c2VkKS4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIFRoZSBzdHJpbmctbGlrZSB0eXBlcyAoU1RSSU5HLCBPQkpFQ1RfUEFUSCBhbmQgU0lHTkFUVVJFKSBhcmUgYWxsCisgICAgICAgIG1hcnNoYWxsZWQgYXMgYQorICAgICAgICBmaXhlZC1sZW5ndGggdW5zaWduZWQgaW50ZWdlciA8dmFybmFtZT5uPC92YXJuYW1lPiBnaXZpbmcgdGhlCisgICAgICAgIGxlbmd0aCBvZiB0aGUgdmFyaWFibGUgcGFydCwgZm9sbG93ZWQgYnkgPHZhcm5hbWU+bjwvdmFybmFtZT4KKyAgICAgICAgbm9uemVybyBieXRlcyBvZiBVVEYtOCB0ZXh0LCBmb2xsb3dlZCBieSBhIHNpbmdsZSB6ZXJvIChudWwpIGJ5dGUKKyAgICAgICAgd2hpY2ggaXMgbm90IGNvbnNpZGVyZWQgdG8gYmUgcGFydCBvZiB0aGUgdGV4dC4gVGhlIGFsaWdubWVudAorICAgICAgICBvZiB0aGUgc3RyaW5nLWxpa2UgdHlwZSBpcyB0aGUgc2FtZSBhcyB0aGUgYWxpZ25tZW50IG9mCisgICAgICAgIDx2YXJuYW1lPm48L3Zhcm5hbWU+OiBhbnkgcGFkZGluZyByZXF1aXJlZCBmb3IgPHZhcm5hbWU+bjwvdmFybmFtZT4KKyAgICAgICAgYXBwZWFycyBpbW1lZGlhdGVseSBiZWZvcmUgPHZhcm5hbWU+bjwvdmFybmFtZT4gaXRzZWxmLiBUaGVyZSBpcyBuZXZlcgorICAgICAgICBhbnkgYWxpZ25tZW50IHBhZGRpbmcgYmV0d2VlbiA8dmFybmFtZT5uPC92YXJuYW1lPiBhbmQgdGhlIHN0cmluZyB0ZXh0LAorICAgICAgICBvciBiZXR3ZWVuIHRoZSBzdHJpbmcgdGV4dCBhbmQgdGhlIHRyYWlsaW5nIG51bC4gVGhlIGFsaWdubWVudCBwYWRkaW5nCisgICAgICAgIGZvciB0aGUgbmV4dCB2YWx1ZSBpbiB0aGUgbWVzc2FnZSAoaWYgdGhlcmUgaXMgb25lKSBzdGFydHMgYWZ0ZXIgdGhlCisgICAgICAgIHRyYWlsaW5nIG51bC4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIEZvciB0aGUgU1RSSU5HIGFuZCBPQkpFQ1RfUEFUSCB0eXBlcywgPHZhcm5hbWU+bjwvdmFybmFtZT4gaXMKKyAgICAgICAgZW5jb2RlZCBpbiA0IGJ5dGVzIChhIDxsaXRlcmFsPlVJTlQzMjwvbGl0ZXJhbD4pLCBsZWFkaW5nIHRvIDQtYnl0ZQorICAgICAgICBhbGlnbm1lbnQuIEZvciB0aGUgU0lHTkFUVVJFIHR5cGUsIDx2YXJuYW1lPm48L3Zhcm5hbWU+IGlzIGVuY29kZWQgYXMgYQorICAgICAgICBzaW5nbGUgYnl0ZSAoYSA8bGl0ZXJhbD5VSU5UODwvbGl0ZXJhbD4pLiBBcyBhIHJlc3VsdCwgYWxpZ25tZW50CisgICAgICAgIHBhZGRpbmcgaXMgbmV2ZXIgcmVxdWlyZWQgYmVmb3JlIGEgU0lHTkFUVVJFLgorICAgICAgPC9wYXJhPgorCisgICAgICA8cGFyYT4KKyAgICAgICAgRm9yIGV4YW1wbGUsIGlmIHRoZSBjdXJyZW50IHBvc2l0aW9uIGlzIGEgbXVsdGlwbGUgb2YgOCBieXRlcyBmcm9tIHRoZQorICAgICAgICBiZWdpbm5pbmcgb2YgYSBsaXR0bGUtZW5kaWFuIG1lc3NhZ2UsIHN0cmluZ3Mg4oCYZm9v4oCZLCDigJgr4oCZIGFuZCDigJhiYXLigJkKKyAgICAgICAgd291bGQgYmUgc2VyaWFsaXplZCBpbiBzZXF1ZW5jZSBhcyBmb2xsb3dzOgorCisgICAgICAgIDxzY3JlZW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGluZWFubm90YXRpb24+bm8gcGFkZGluZyByZXF1aXJlZCwgd2UgYXJlIGFscmVhZHkgYXQgYSBtdWx0aXBsZSBvZiA0PC9saW5lYW5ub3RhdGlvbj4KKzB4MDMgMHgwMCAweDAwIDB4MDAgICAgICAgICAgICAgICAgICAgICAgIDxsaW5lYW5ub3RhdGlvbj5sZW5ndGggb2Yg4oCYZm9v4oCZID0gMzwvbGluZWFubm90YXRpb24+CisgICAgICAgICAgICAgICAgICAgIDB4NjYgMHg2ZiAweDZmICAgICAgICA8bGluZWFubm90YXRpb24+4oCYZm9v4oCZPC9saW5lYW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCAgIDxsaW5lYW5ub3RhdGlvbj50cmFpbGluZyBudWw8L2xpbmVhbm5vdGF0aW9uPgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGluZWFubm90YXRpb24+bm8gcGFkZGluZyByZXF1aXJlZCwgd2UgYXJlIGFscmVhZHkgYXQgYSBtdWx0aXBsZSBvZiA0PC9saW5lYW5ub3RhdGlvbj4KKzB4MDEgMHgwMCAweDAwIDB4MDAgICAgICAgICAgICAgICAgICAgICAgIDxsaW5lYW5ub3RhdGlvbj5sZW5ndGggb2Yg4oCYK+KAmSA9IDE8L2xpbmVhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgICAgICAweDJiICAgICAgICAgICAgICAgICAgPGxpbmVhbm5vdGF0aW9uPuKAmCvigJk8L2xpbmVhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgICAgICAgICAgICAgPGxpbmVhbm5vdGF0aW9uPnRyYWlsaW5nIG51bDwvbGluZWFubm90YXRpb24+CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIDB4MDAgIDxsaW5lYW5ub3RhdGlvbj4yIGJ5dGVzIG9mIHBhZGRpbmcgdG8gcmVhY2ggbmV4dCBtdWx0aXBsZSBvZiA0PC9saW5lYW5ub3RhdGlvbj4KKzB4MDMgMHgwMCAweDAwIDB4MDAgICAgICAgICAgICAgICAgICAgICAgIDxsaW5lYW5ub3RhdGlvbj5sZW5ndGggb2Yg4oCYYmFy4oCZID0gMTwvbGluZWFubm90YXRpb24+CisgICAgICAgICAgICAgICAgICAgIDB4NjIgMHg2MSAweDcyICAgICAgICA8bGluZWFubm90YXRpb24+4oCYYmFy4oCZPC9saW5lYW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgIDxsaW5lYW5ub3RhdGlvbj50cmFpbGluZyBudWw8L2xpbmVhbm5vdGF0aW9uPgorICAgICAgICA8L3NjcmVlbj4KKyAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3QyPgorCisgICAgPHNlY3QyPgorICAgICAgPHRpdGxlPk1hcnNoYWxsaW5nIGNvbnRhaW5lcnM8L3RpdGxlPgorCisgICAgICA8cGFyYT4KKyAgICAgICAgQXJyYXlzIGFyZSBtYXJzaGFsbGVkIGFzIGEgPGxpdGVyYWw+VUlOVDMyPC9saXRlcmFsPgorICAgICAgICA8dmFybmFtZT5uPC92YXJuYW1lPiBnaXZpbmcgdGhlIGxlbmd0aCBvZiB0aGUgYXJyYXkgZGF0YSBpbiBieXRlcywKKyAgICAgICAgZm9sbG93ZWQgYnkgYWxpZ25tZW50IHBhZGRpbmcgdG8gdGhlIGFsaWdubWVudCBib3VuZGFyeSBvZiB0aGUgYXJyYXkKKyAgICAgICAgZWxlbWVudCB0eXBlLCBmb2xsb3dlZCBieSB0aGUgPHZhcm5hbWU+bjwvdmFybmFtZT4gYnl0ZXMgb2YgdGhlCisgICAgICAgIGFycmF5IGVsZW1lbnRzIG1hcnNoYWxsZWQgaW4gc2VxdWVuY2UuIDx2YXJuYW1lPm48L3Zhcm5hbWU+IGRvZXMgbm90CisgICAgICAgIGluY2x1ZGUgdGhlIHBhZGRpbmcgYWZ0ZXIgdGhlIGxlbmd0aCwgb3IgYW55IHBhZGRpbmcgYWZ0ZXIgdGhlCisgICAgICAgIGxhc3QgZWxlbWVudC4gaS5lLiA8dmFybmFtZT5uPC92YXJuYW1lPiBzaG91bGQgYmUgZGl2aXNpYmxlIGJ5IHRoZQorICAgICAgICBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGFycmF5LgorICAgICAgPC9wYXJhPgorCisgICAgICA8cGFyYT4KKyAgICAgICAgRm9yIGluc3RhbmNlLCBpZiB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgbWVzc2FnZSBpcyBhIG11bHRpcGxlCisgICAgICAgIG9mIDggYnl0ZXMgYW5kIHRoZSBieXRlLW9yZGVyIGlzIGJpZy1lbmRpYW4sIGFuIGFycmF5IGNvbnRhaW5pbmcgb25seQorICAgICAgICB0aGUgNjQtYml0IGludGVnZXIgNSB3b3VsZCBiZSBtYXJzaGFsbGVkIGFzOgorCisgICAgICAgIDxzY3JlZW4+CiswMCAwMCAwMCAwOCAgICAgICAgICAgICAgIDxsaW5lYW5ub3RhdGlvbj48dmFybmFtZT5uPC92YXJuYW1lPiA9IDggYnl0ZXMgb2YgZGF0YTwvbGluZWFubm90YXRpb24+CiswMCAwMCAwMCAwMCAgICAgICAgICAgICAgIDxsaW5lYW5ub3RhdGlvbj5wYWRkaW5nIHRvIDgtYnl0ZSBib3VuZGFyeTwvbGluZWFubm90YXRpb24+CiswMCAwMCAwMCAwMCAgMDAgMDAgMDAgMDUgIDxsaW5lYW5ub3RhdGlvbj5maXJzdCBlbGVtZW50ID0gNTwvbGluZWFubm90YXRpb24+CisgICAgICAgIDwvc2NyZWVuPgorICAgICAgPC9wYXJhPgorCisgICAgICA8cGFyYT4KKyAgICAgICAgQXJyYXlzIGhhdmUgYSBtYXhpbXVtIGxlbmd0aCBkZWZpbmVkIHRvIGJlIDIgdG8gdGhlIDI2dGggcG93ZXIgb3IKKyAgICAgICAgNjcxMDg4NjQgKDY0IE1pQikuIEltcGxlbWVudGF0aW9ucyBtdXN0IG5vdCBzZW5kIG9yIGFjY2VwdCBhcnJheXMKKyAgICAgICAgZXhjZWVkaW5nIHRoaXMgbGVuZ3RoLgorICAgICAgPC9wYXJhPgorCisgICAgICA8cGFyYT4KKyAgICAgICAgU3RydWN0cyBhbmQgZGljdCBlbnRyaWVzIGFyZSBtYXJzaGFsbGVkIGluIHRoZSBzYW1lIHdheSBhcyB0aGVpcgorICAgICAgICBjb250ZW50cywgYnV0IHRoZWlyIGFsaWdubWVudCBpcyBhbHdheXMgdG8gYW4gOC1ieXRlIGJvdW5kYXJ5LAorICAgICAgICBldmVuIGlmIHRoZWlyIGNvbnRlbnRzIHdvdWxkIG5vcm1hbGx5IGJlIGxlc3Mgc3RyaWN0bHkgYWxpZ25lZC4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIFZhcmlhbnRzIGFyZSBtYXJzaGFsbGVkIGFzIHRoZSA8bGl0ZXJhbD5TSUdOQVRVUkU8L2xpdGVyYWw+IG9mCisgICAgICAgIHRoZSBjb250ZW50cyAod2hpY2ggbXVzdCBiZSBhIHNpbmdsZSBjb21wbGV0ZSB0eXBlKSwgZm9sbG93ZWQgYnkgYQorICAgICAgICBtYXJzaGFsbGVkIHZhbHVlIHdpdGggdGhlIHR5cGUgZ2l2ZW4gYnkgdGhhdCBzaWduYXR1cmUuIFRoZQorICAgICAgICB2YXJpYW50IGhhcyB0aGUgc2FtZSAxLWJ5dGUgYWxpZ25tZW50IGFzIHRoZSBzaWduYXR1cmUsIHdoaWNoIG1lYW5zCisgICAgICAgIHRoYXQgYWxpZ25tZW50IHBhZGRpbmcgYmVmb3JlIGEgdmFyaWFudCBpcyBuZXZlciBuZWVkZWQuCisgICAgICAgIFVzZSBvZiB2YXJpYW50cyBtdXN0IG5vdCBjYXVzZSBhIHRvdGFsIG1lc3NhZ2UgZGVwdGggdG8gYmUgbGFyZ2VyCisgICAgICAgIHRoYW4gNjQsIGluY2x1ZGluZyBvdGhlciBjb250YWluZXIgdHlwZXMgc3VjaCBhcyBzdHJ1Y3R1cmVzLgorICAgICAgICAoU2VlIDxsaW5rIGxpbmtlbmQ9Im1lc3NhZ2UtcHJvdG9jb2wtbWFyc2hhbGluZy1zaWduYXR1cmUiPlZhbGlkCisgICAgICAgIFNpZ25hdHVyZXM8L2xpbms+LikKKyAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3QyPgorCisgICAgPHNlY3QyPgorICAgICAgPHRpdGxlPlN1bW1hcnkgb2YgRC1CdXMgbWFyc2hhbGxpbmc8L3RpdGxlPgorCisgICAgICA8cGFyYT4KKyAgICAgICAgR2l2ZW4gYWxsIHRoaXMsIHRoZSB0eXBlcyBhcmUgbWFyc2hhbGVkIG9uIHRoZSB3aXJlIGFzIGZvbGxvd3M6CisgICAgICAgIDxpbmZvcm1hbHRhYmxlPgorICAgICAgICAgIDx0Z3JvdXAgY29scz0iMyI+CisgICAgICAgICAgICA8dGhlYWQ+CisgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PkNvbnZlbnRpb25hbCBOYW1lPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+RW5jb2Rpbmc8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5BbGlnbm1lbnQ8L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgIDwvdGhlYWQ+CisgICAgICAgICAgICA8dGJvZHk+CisgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPklOVkFMSUQ8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+Tm90IGFwcGxpY2FibGU7IGNhbm5vdCBiZSBtYXJzaGFsZWQuPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+Ti9BPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+PHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+QllURTwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5BIHNpbmdsZSA4LWJpdCBieXRlLjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PjE8L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz48cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5CT09MRUFOPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PkFzIGZvciA8bGl0ZXJhbD5VSU5UMzI8L2xpdGVyYWw+LCBidXQgb25seSAwIGFuZCAxIGFyZSB2YWxpZCB2YWx1ZXMuPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+NDwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93Pjxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPklOVDE2PC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PjE2LWJpdCBzaWduZWQgaW50ZWdlciBpbiB0aGUgbWVzc2FnZSdzIGJ5dGUgb3JkZXIuPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+MjwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93Pjxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPlVJTlQxNjwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT4xNi1iaXQgdW5zaWduZWQgaW50ZWdlciBpbiB0aGUgbWVzc2FnZSdzIGJ5dGUgb3JkZXIuPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+MjwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93Pjxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPklOVDMyPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PjMyLWJpdCBzaWduZWQgaW50ZWdlciBpbiB0aGUgbWVzc2FnZSdzIGJ5dGUgb3JkZXIuPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+NDwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93Pjxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPlVJTlQzMjwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT4zMi1iaXQgdW5zaWduZWQgaW50ZWdlciBpbiB0aGUgbWVzc2FnZSdzIGJ5dGUgb3JkZXIuPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+NDwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93Pjxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPklOVDY0PC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PjY0LWJpdCBzaWduZWQgaW50ZWdlciBpbiB0aGUgbWVzc2FnZSdzIGJ5dGUgb3JkZXIuPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+ODwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93Pjxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPlVJTlQ2NDwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT42NC1iaXQgdW5zaWduZWQgaW50ZWdlciBpbiB0aGUgbWVzc2FnZSdzIGJ5dGUgb3JkZXIuPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+ODwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93Pjxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPkRPVUJMRTwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT42NC1iaXQgSUVFRSA3NTQgZG91YmxlIGluIHRoZSBtZXNzYWdlJ3MgYnl0ZSBvcmRlci48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT44PC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+PHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+U1RSSU5HPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PkEgPGxpdGVyYWw+VUlOVDMyPC9saXRlcmFsPiBpbmRpY2F0aW5nIHRoZSBzdHJpbmcncworICAgICAgICAgICAgICAgICAgbGVuZ3RoIGluIGJ5dGVzIGV4Y2x1ZGluZyBpdHMgdGVybWluYXRpbmcgbnVsLCBmb2xsb3dlZCBieQorICAgICAgICAgICAgICAgICAgbm9uLW51bCBzdHJpbmcgZGF0YSBvZiB0aGUgZ2l2ZW4gbGVuZ3RoLCBmb2xsb3dlZCBieSBhIHRlcm1pbmF0aW5nIG51bAorICAgICAgICAgICAgICAgICAgYnl0ZS4KKyAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT4KKyAgICAgICAgICAgICAgICAgIDQgKGZvciB0aGUgbGVuZ3RoKQorICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93Pjxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPk9CSkVDVF9QQVRIPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PkV4YWN0bHkgdGhlIHNhbWUgYXMgPGxpdGVyYWw+U1RSSU5HPC9saXRlcmFsPiBleGNlcHQgdGhlCisgICAgICAgICAgICAgICAgICBjb250ZW50IG11c3QgYmUgYSB2YWxpZCBvYmplY3QgcGF0aCAoc2VlIGFib3ZlKS4KKyAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT4KKyAgICAgICAgICAgICAgICAgIDQgKGZvciB0aGUgbGVuZ3RoKQorICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93Pjxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPlNJR05BVFVSRTwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5UaGUgc2FtZSBhcyA8bGl0ZXJhbD5TVFJJTkc8L2xpdGVyYWw+IGV4Y2VwdCB0aGUgbGVuZ3RoIGlzIGEgc2luZ2xlCisgICAgICAgICAgICAgICAgICBieXRlICh0aHVzIHNpZ25hdHVyZXMgaGF2ZSBhIG1heGltdW0gbGVuZ3RoIG9mIDI1NSkKKyAgICAgICAgICAgICAgICAgIGFuZCB0aGUgY29udGVudCBtdXN0IGJlIGEgdmFsaWQgc2lnbmF0dXJlIChzZWUgYWJvdmUpLgorICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICAgICAgMQorICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93Pjxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPkFSUkFZPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICAgICAgQSA8bGl0ZXJhbD5VSU5UMzI8L2xpdGVyYWw+IGdpdmluZyB0aGUgbGVuZ3RoIG9mIHRoZSBhcnJheSBkYXRhIGluIGJ5dGVzLCBmb2xsb3dlZCBieQorICAgICAgICAgICAgICAgICAgYWxpZ25tZW50IHBhZGRpbmcgdG8gdGhlIGFsaWdubWVudCBib3VuZGFyeSBvZiB0aGUgYXJyYXkgZWxlbWVudCB0eXBlLAorICAgICAgICAgICAgICAgICAgZm9sbG93ZWQgYnkgZWFjaCBhcnJheSBlbGVtZW50LgorICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICAgICAgNCAoZm9yIHRoZSBsZW5ndGgpCisgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+PHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+U1RSVUNUPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICAgICAgQSBzdHJ1Y3QgbXVzdCBzdGFydCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkgcmVnYXJkbGVzcyBvZiB0aGUKKyAgICAgICAgICAgICAgICAgIHR5cGUgb2YgdGhlIHN0cnVjdCBmaWVsZHMuIFRoZSBzdHJ1Y3QgdmFsdWUgY29uc2lzdHMgb2YgZWFjaAorICAgICAgICAgICAgICAgICAgZmllbGQgbWFyc2hhbGVkIGluIHNlcXVlbmNlIHN0YXJ0aW5nIGZyb20gdGhhdCA4LWJ5dGUKKyAgICAgICAgICAgICAgICAgIGFsaWdubWVudCBib3VuZGFyeS4KKyAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT4KKyAgICAgICAgICAgICAgICAgIDgKKyAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz48cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5WQVJJQU5UPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICAgICAgVGhlIG1hcnNoYWxlZCA8bGl0ZXJhbD5TSUdOQVRVUkU8L2xpdGVyYWw+IG9mIGEgc2luZ2xlCisgICAgICAgICAgICAgICAgICBjb21wbGV0ZSB0eXBlLCBmb2xsb3dlZCBieSBhIG1hcnNoYWxlZCB2YWx1ZSB3aXRoIHRoZSB0eXBlCisgICAgICAgICAgICAgICAgICBnaXZlbiBpbiB0aGUgc2lnbmF0dXJlLgorICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICAgICAgMSAoYWxpZ25tZW50IG9mIHRoZSBzaWduYXR1cmUpCisgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+PHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+RElDVF9FTlRSWTwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT4KKyAgICAgICAgICAgICAgICAgIElkZW50aWNhbCB0byBTVFJVQ1QuCisgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+CisgICAgICAgICAgICAgICAgICA4CisgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+PHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+VU5JWF9GRDwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT4zMi1iaXQgdW5zaWduZWQgaW50ZWdlciBpbiB0aGUgbWVzc2FnZSdzIGJ5dGUKKyAgICAgICAgICAgICAgICBvcmRlci4gVGhlIGFjdHVhbCBmaWxlIGRlc2NyaXB0b3JzIG5lZWQgdG8gYmUKKyAgICAgICAgICAgICAgICB0cmFuc2ZlcnJlZCBvdXQtb2YtYmFuZCB2aWEgc29tZSBwbGF0Zm9ybSBzcGVjaWZpYworICAgICAgICAgICAgICAgIG1lY2hhbmlzbS4gT24gdGhlIHdpcmUsIHZhbHVlcyBvZiB0aGlzIHR5cGUgc3RvcmUgdGhlIGluZGV4IHRvIHRoZQorICAgICAgICAgICAgICAgIGZpbGUgZGVzY3JpcHRvciBpbiB0aGUgYXJyYXkgb2YgZmlsZSBkZXNjcmlwdG9ycyB0aGF0CisgICAgICAgICAgICAgICAgYWNjb21wYW55IHRoZSBtZXNzYWdlLjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PjQ8L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgIDwvdGJvZHk+CisgICAgICAgICAgPC90Z3JvdXA+CisgICAgICAgIDwvaW5mb3JtYWx0YWJsZT4KKyAgICAgIDwvcGFyYT4KKworICAgIDwvc2VjdDI+CisKKyAgPC9zZWN0MT4KKworICA8c2VjdDEgaWQ9Im1lc3NhZ2UtcHJvdG9jb2wiPgorICAgIDx0aXRsZT5NZXNzYWdlIFByb3RvY29sPC90aXRsZT4KKworICAgIDxwYXJhPgorICAgICAgQSA8Zmlyc3R0ZXJtPm1lc3NhZ2U8L2ZpcnN0dGVybT4gY29uc2lzdHMgb2YgYQorICAgICAgPGZpcnN0dGVybT5oZWFkZXI8L2ZpcnN0dGVybT4gYW5kIGEgPGZpcnN0dGVybT5ib2R5PC9maXJzdHRlcm0+LiBJZiB5b3UKKyAgICAgIHRoaW5rIG9mIGEgbWVzc2FnZSBhcyBhIHBhY2thZ2UsIHRoZSBoZWFkZXIgaXMgdGhlIGFkZHJlc3MsIGFuZCB0aGUgYm9keQorICAgICAgY29udGFpbnMgdGhlIHBhY2thZ2UgY29udGVudHMuIFRoZSBtZXNzYWdlIGRlbGl2ZXJ5IHN5c3RlbSB1c2VzIHRoZSBoZWFkZXIKKyAgICAgIGluZm9ybWF0aW9uIHRvIGZpZ3VyZSBvdXQgd2hlcmUgdG8gc2VuZCB0aGUgbWVzc2FnZSBhbmQgaG93IHRvIGludGVycHJldAorICAgICAgaXQ7IHRoZSByZWNpcGllbnQgaW50ZXJwcmV0cyB0aGUgYm9keSBvZiB0aGUgbWVzc2FnZS4KKyAgICA8L3BhcmE+CisKKyAgICA8cGFyYT4KKyAgICAgIFRoZSBib2R5IG9mIHRoZSBtZXNzYWdlIGlzIG1hZGUgdXAgb2YgemVybyBvciBtb3JlCisgICAgICA8Zmlyc3R0ZXJtPmFyZ3VtZW50czwvZmlyc3R0ZXJtPiwgd2hpY2ggYXJlIHR5cGVkIHZhbHVlcywgc3VjaCBhcyBhbgorICAgICAgaW50ZWdlciBvciBhIGJ5dGUgYXJyYXkuCisgICAgPC9wYXJhPgorCisgICAgPHBhcmE+CisgICAgICBCb3RoIGhlYWRlciBhbmQgYm9keSB1c2UgdGhlIEQtQnVzIDxsaW5rIGxpbmtlbmQ9InR5cGUtc3lzdGVtIj50eXBlCisgICAgICAgIHN5c3RlbTwvbGluaz4gYW5kIGZvcm1hdCBmb3Igc2VyaWFsaXppbmcgZGF0YS4KKyAgICA8L3BhcmE+CisKKyAgICA8c2VjdDIgaWQ9Im1lc3NhZ2UtcHJvdG9jb2wtbWVzc2FnZXMiPgorICAgICAgPHRpdGxlPk1lc3NhZ2UgRm9ybWF0PC90aXRsZT4KKworICAgICAgPHBhcmE+CisgICAgICAgIEEgbWVzc2FnZSBjb25zaXN0cyBvZiBhIGhlYWRlciBhbmQgYSBib2R5LiBUaGUgaGVhZGVyIGlzIGEgYmxvY2sgb2YKKyAgICAgICAgdmFsdWVzIHdpdGggYSBmaXhlZCBzaWduYXR1cmUgYW5kIG1lYW5pbmcuICBUaGUgYm9keSBpcyBhIHNlcGFyYXRlIGJsb2NrCisgICAgICAgIG9mIHZhbHVlcywgd2l0aCBhIHNpZ25hdHVyZSBzcGVjaWZpZWQgaW4gdGhlIGhlYWRlci4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIFRoZSBsZW5ndGggb2YgdGhlIGhlYWRlciBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOCwgYWxsb3dpbmcgdGhlIGJvZHkgdG8KKyAgICAgICAgYmVnaW4gb24gYW4gOC1ieXRlIGJvdW5kYXJ5IHdoZW4gc3RvcmluZyB0aGUgZW50aXJlIG1lc3NhZ2UgaW4gYSBzaW5nbGUKKyAgICAgICAgYnVmZmVyLiBJZiB0aGUgaGVhZGVyIGRvZXMgbm90IG5hdHVyYWxseSBlbmQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5CisgICAgICAgIHVwIHRvIDcgYnl0ZXMgb2YgbnVsLWluaXRpYWxpemVkIGFsaWdubWVudCBwYWRkaW5nIG11c3QgYmUgYWRkZWQuCisgICAgICA8L3BhcmE+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBUaGUgbWVzc2FnZSBib2R5IG5lZWQgbm90IGVuZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuCisgICAgICA8L3BhcmE+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBUaGUgbWF4aW11bSBsZW5ndGggb2YgYSBtZXNzYWdlLCBpbmNsdWRpbmcgaGVhZGVyLCBoZWFkZXIgYWxpZ25tZW50IHBhZGRpbmcsCisgICAgICAgIGFuZCBib2R5IGlzIDIgdG8gdGhlIDI3dGggcG93ZXIgb3IgMTM0MjE3NzI4ICgxMjggTWlCKS4KKyAgICAgICAgSW1wbGVtZW50YXRpb25zIG11c3Qgbm90IHNlbmQgb3IgYWNjZXB0IG1lc3NhZ2VzIGV4Y2VlZGluZyB0aGlzIHNpemUuCisgICAgICA8L3BhcmE+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBUaGUgc2lnbmF0dXJlIG9mIHRoZSBoZWFkZXIgaXM6CisgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAieXl5eXV1YSh5dikiCisgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgIFdyaXR0ZW4gb3V0IG1vcmUgcmVhZGFibHksIHRoaXMgaXM6CisgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICBCWVRFLCBCWVRFLCBCWVRFLCBCWVRFLCBVSU5UMzIsIFVJTlQzMiwgQVJSQVkgb2YgU1RSVUNUIG9mIChCWVRFLFZBUklBTlQpCisgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICA8L3BhcmE+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBUaGVzZSB2YWx1ZXMgaGF2ZSB0aGUgZm9sbG93aW5nIG1lYW5pbmdzOgorICAgICAgICA8aW5mb3JtYWx0YWJsZT4KKyAgICAgICAgICA8dGdyb3VwIGNvbHM9IjIiPgorICAgICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT5WYWx1ZTwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PkRlc2NyaXB0aW9uPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT4xc3QgPGxpdGVyYWw+QllURTwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5FbmRpYW5uZXNzIGZsYWc7IEFTQ0lJICdsJyBmb3IgbGl0dGxlLWVuZGlhbgorICAgICAgICAgICAgICAgICAgb3IgQVNDSUkgJ0InIGZvciBiaWctZW5kaWFuLiBCb3RoIGhlYWRlciBhbmQgYm9keSBhcmUKKyAgICAgICAgICAgICAgICBpbiB0aGlzIGVuZGlhbm5lc3MuPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PjJuZCA8bGl0ZXJhbD5CWVRFPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PjxmaXJzdHRlcm0+TWVzc2FnZSB0eXBlPC9maXJzdHRlcm0+LiBVbmtub3duIHR5cGVzIG11c3QgYmUgaWdub3JlZC4KKyAgICAgICAgICAgICAgICAgIEN1cnJlbnRseS1kZWZpbmVkIHR5cGVzIGFyZSBkZXNjcmliZWQgYmVsb3cuCisgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PjNyZCA8bGl0ZXJhbD5CWVRFPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PkJpdHdpc2UgT1Igb2YgZmxhZ3MuIFVua25vd24gZmxhZ3MKKyAgICAgICAgICAgICAgICAgIG11c3QgYmUgaWdub3JlZC4gQ3VycmVudGx5LWRlZmluZWQgZmxhZ3MgYXJlIGRlc2NyaWJlZCBiZWxvdy4KKyAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+NHRoIDxsaXRlcmFsPkJZVEU8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+TWFqb3IgcHJvdG9jb2wgdmVyc2lvbiBvZiB0aGUgc2VuZGluZyBhcHBsaWNhdGlvbi4gIElmCisgICAgICAgICAgICAgICAgdGhlIG1ham9yIHByb3RvY29sIHZlcnNpb24gb2YgdGhlIHJlY2VpdmluZyBhcHBsaWNhdGlvbiBkb2VzIG5vdAorICAgICAgICAgICAgICAgIG1hdGNoLCB0aGUgYXBwbGljYXRpb25zIHdpbGwgbm90IGJlIGFibGUgdG8gY29tbXVuaWNhdGUgYW5kIHRoZQorICAgICAgICAgICAgICAgIEQtQnVzIGNvbm5lY3Rpb24gbXVzdCBiZSBkaXNjb25uZWN0ZWQuIFRoZSBtYWpvciBwcm90b2NvbAorICAgICAgICAgICAgICAgIHZlcnNpb24gZm9yIHRoaXMgdmVyc2lvbiBvZiB0aGUgc3BlY2lmaWNhdGlvbiBpcyAxLgorICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT4xc3QgPGxpdGVyYWw+VUlOVDMyPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5Pkxlbmd0aCBpbiBieXRlcyBvZiB0aGUgbWVzc2FnZSBib2R5LCBzdGFydGluZworICAgICAgICAgICAgICAgICAgZnJvbSB0aGUgZW5kIG9mIHRoZSBoZWFkZXIuIFRoZSBoZWFkZXIgZW5kcyBhZnRlcgorICAgICAgICAgICAgICAgICAgaXRzIGFsaWdubWVudCBwYWRkaW5nIHRvIGFuIDgtYm91bmRhcnkuCisgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PjJuZCA8bGl0ZXJhbD5VSU5UMzI8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+VGhlIHNlcmlhbCBvZiB0aGlzIG1lc3NhZ2UsIHVzZWQgYXMgYSBjb29raWUKKyAgICAgICAgICAgICAgICAgIGJ5IHRoZSBzZW5kZXIgdG8gaWRlbnRpZnkgdGhlIHJlcGx5IGNvcnJlc3BvbmRpbmcKKyAgICAgICAgICAgICAgICAgIHRvIHRoaXMgcmVxdWVzdC4gVGhpcyBtdXN0IG5vdCBiZSB6ZXJvLgorICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5BUlJBWTwvbGl0ZXJhbD4gb2YgPGxpdGVyYWw+U1RSVUNUPC9saXRlcmFsPiBvZiAoPGxpdGVyYWw+QllURTwvbGl0ZXJhbD4sPGxpdGVyYWw+VkFSSUFOVDwvbGl0ZXJhbD4pPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+QW4gYXJyYXkgb2YgemVybyBvciBtb3JlIDxmaXJzdHRlcm0+aGVhZGVyCisgICAgICAgICAgICAgICAgICBmaWVsZHM8L2ZpcnN0dGVybT4gd2hlcmUgdGhlIGJ5dGUgaXMgdGhlIGZpZWxkIGNvZGUsIGFuZCB0aGUKKyAgICAgICAgICAgICAgICAgIHZhcmlhbnQgaXMgdGhlIGZpZWxkIHZhbHVlLiBUaGUgbWVzc2FnZSB0eXBlIGRldGVybWluZXMKKyAgICAgICAgICAgICAgICAgIHdoaWNoIGZpZWxkcyBhcmUgcmVxdWlyZWQuCisgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICA8L3Rib2R5PgorICAgICAgICAgIDwvdGdyb3VwPgorICAgICAgICA8L2luZm9ybWFsdGFibGU+CisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgPGZpcnN0dGVybT5NZXNzYWdlIHR5cGVzPC9maXJzdHRlcm0+IHRoYXQgY2FuIGFwcGVhciBpbiB0aGUgc2Vjb25kIGJ5dGUKKyAgICAgICAgb2YgdGhlIGhlYWRlciBhcmU6CisgICAgICAgIDxpbmZvcm1hbHRhYmxlPgorICAgICAgICAgIDx0Z3JvdXAgY29scz0iMyI+CisgICAgICAgICAgICA8dGhlYWQ+CisgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PkNvbnZlbnRpb25hbCBuYW1lPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+RGVjaW1hbCB2YWx1ZTwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PkRlc2NyaXB0aW9uPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5JTlZBTElEPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PjA8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5UaGlzIGlzIGFuIGludmFsaWQgdHlwZS48L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+TUVUSE9EX0NBTEw8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+MTwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5Pk1ldGhvZCBjYWxsLiBUaGlzIG1lc3NhZ2UgdHlwZSBtYXkgcHJvbXB0IGEKKyAgICAgICAgICAgICAgICAgIHJlcGx5LjwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5NRVRIT0RfUkVUVVJOPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PjI8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5NZXRob2QgcmVwbHkgd2l0aCByZXR1cm5lZCBkYXRhLjwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5FUlJPUjwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT4zPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+RXJyb3IgcmVwbHkuIElmIHRoZSBmaXJzdCBhcmd1bWVudCBleGlzdHMgYW5kIGlzIGEKKyAgICAgICAgICAgICAgICBzdHJpbmcsIGl0IGlzIGFuIGVycm9yIG1lc3NhZ2UuPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPlNJR05BTDwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT40PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+U2lnbmFsIGVtaXNzaW9uLjwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgPC90Ym9keT4KKyAgICAgICAgICA8L3Rncm91cD4KKyAgICAgICAgPC9pbmZvcm1hbHRhYmxlPgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIEZsYWdzIHRoYXQgY2FuIGFwcGVhciBpbiB0aGUgdGhpcmQgYnl0ZSBvZiB0aGUgaGVhZGVyOgorICAgICAgICA8aW5mb3JtYWx0YWJsZT4KKyAgICAgICAgICA8dGdyb3VwIGNvbHM9IjMiPgorICAgICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT5Db252ZW50aW9uYWwgbmFtZTwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PkhleCB2YWx1ZTwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PkRlc2NyaXB0aW9uPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5OT19SRVBMWV9FWFBFQ1RFRDwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT4weDE8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBUaGlzIG1lc3NhZ2UgZG9lcyBub3QgZXhwZWN0IG1ldGhvZCByZXR1cm4gcmVwbGllcyBvcgorICAgICAgICAgICAgICAgICAgICBlcnJvciByZXBsaWVzLCBldmVuIGlmIGl0IGlzIG9mIGEgdHlwZSB0aGF0IGNhbgorICAgICAgICAgICAgICAgICAgICBoYXZlIGEgcmVwbHk7IHRoZSByZXBseSBzaG91bGQgYmUgb21pdHRlZC4KKyAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBOb3RlIHRoYXQgTUVUSE9EX0NBTEwgaXMgdGhlIG9ubHkgbWVzc2FnZSB0eXBlIGN1cnJlbnRseQorICAgICAgICAgICAgICAgICAgICBkZWZpbmVkIGluIHRoaXMgc3BlY2lmaWNhdGlvbiB0aGF0IGNhbiBleHBlY3QgYSByZXBseSwKKyAgICAgICAgICAgICAgICAgICAgc28gdGhlIHByZXNlbmNlIG9yIGFic2VuY2Ugb2YgdGhpcyBmbGFnIGluIHRoZSBvdGhlcgorICAgICAgICAgICAgICAgICAgICB0aHJlZSBtZXNzYWdlIHR5cGVzIHRoYXQgYXJlIGN1cnJlbnRseQorICAgICAgICAgICAgICAgICAgICBkb2N1bWVudGVkIGlzIG1lYW5pbmdsZXNzOiByZXBsaWVzIHRvIHRob3NlIG1lc3NhZ2UKKyAgICAgICAgICAgICAgICAgICAgdHlwZXMgc2hvdWxkIG5vdCBiZSBzZW50LCB3aGV0aGVyIHRoaXMgZmxhZyBpcyBwcmVzZW50CisgICAgICAgICAgICAgICAgICAgIG9yIG5vdC4KKyAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+Tk9fQVVUT19TVEFSVDwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT4weDI8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5UaGUgYnVzIG11c3Qgbm90IGxhdW5jaCBhbiBvd25lcgorICAgICAgICAgICAgICAgICAgZm9yIHRoZSBkZXN0aW5hdGlvbiBuYW1lIGluIHJlc3BvbnNlIHRvIHRoaXMgbWVzc2FnZS4KKyAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+QUxMT1dfSU5URVJBQ1RJVkVfQVVUSE9SSVpBVElPTjwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT4weDQ8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBUaGlzIGZsYWcgbWF5IGJlIHNldCBvbiBhIG1ldGhvZCBjYWxsIG1lc3NhZ2UgdG8KKyAgICAgICAgICAgICAgICAgICAgaW5mb3JtIHRoZSByZWNlaXZpbmcgc2lkZSB0aGF0IHRoZSBjYWxsZXIgaXMgcHJlcGFyZWQKKyAgICAgICAgICAgICAgICAgICAgdG8gd2FpdCBmb3IgaW50ZXJhY3RpdmUgYXV0aG9yaXphdGlvbiwgd2hpY2ggbWlnaHQKKyAgICAgICAgICAgICAgICAgICAgdGFrZSBhIGNvbnNpZGVyYWJsZSB0aW1lIHRvIGNvbXBsZXRlLiBGb3IgaW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgIGlmIHRoaXMgZmxhZyBpcyBzZXQsIGl0IHdvdWxkIGJlIGFwcHJvcHJpYXRlIHRvCisgICAgICAgICAgICAgICAgICAgIHF1ZXJ5IHRoZSB1c2VyIGZvciBwYXNzd29yZHMgb3IgY29uZmlybWF0aW9uIHZpYQorICAgICAgICAgICAgICAgICAgICBQb2xraXQgb3IgYSBzaW1pbGFyIGZyYW1ld29yay4KKyAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBUaGlzIGZsYWcgaXMgb25seSB1c2VmdWwgd2hlbgorICAgICAgICAgICAgICAgICAgICB1bnByaXZpbGVnZWQgY29kZSBjYWxscyBhIG1vcmUgcHJpdmlsZWdlZCBtZXRob2QgY2FsbCwKKyAgICAgICAgICAgICAgICAgICAgYW5kIGFuIGF1dGhvcml6YXRpb24gZnJhbWV3b3JrIGlzIGRlcGxveWVkIHRoYXQgYWxsb3dzCisgICAgICAgICAgICAgICAgICAgIHBvc3NpYmx5IGludGVyYWN0aXZlIGF1dGhvcml6YXRpb24uIElmIG5vIHN1Y2ggZnJhbWV3b3JrCisgICAgICAgICAgICAgICAgICAgIGlzIGRlcGxveWVkIGl0IGhhcyBubyBlZmZlY3QuIFRoaXMgZmxhZyBzaG91bGQgbm90CisgICAgICAgICAgICAgICAgICAgIGJlIHNldCBieSBkZWZhdWx0IGJ5IGNsaWVudCBpbXBsZW1lbnRhdGlvbnMuIElmIGl0IGlzCisgICAgICAgICAgICAgICAgICAgIHNldCwgdGhlIGNhbGxlciBzaG91bGQgYWxzbyBzZXQgYSBzdWl0YWJseSBsb25nIHRpbWVvdXQKKyAgICAgICAgICAgICAgICAgICAgb24gdGhlIG1ldGhvZCBjYWxsIHRvIG1ha2Ugc3VyZSB0aGUgdXNlciBpbnRlcmFjdGlvbgorICAgICAgICAgICAgICAgICAgICBtYXkgY29tcGxldGUuIFRoaXMgZmxhZyBpcyBvbmx5IHZhbGlkIGZvciBtZXRob2QgY2FsbAorICAgICAgICAgICAgICAgICAgICBtZXNzYWdlcywgYW5kIHNoYWxsIGJlIGlnbm9yZWQgb3RoZXJ3aXNlLgorICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIEludGVyYWN0aW9uIHRoYXQgdGFrZXMgcGxhY2UgYXMgYSBwYXJ0IG9mIHRoZQorICAgICAgICAgICAgICAgICAgICBlZmZlY3Qgb2YgdGhlIG1ldGhvZCBiZWluZyBjYWxsZWQgaXMgb3V0c2lkZSB0aGUgc2NvcGUKKyAgICAgICAgICAgICAgICAgICAgb2YgdGhpcyBmbGFnLCBldmVuIGlmIGl0IGNvdWxkIGFsc28gYmUgY2hhcmFjdGVyaXplZAorICAgICAgICAgICAgICAgICAgICBhcyBhdXRoZW50aWNhdGlvbiBvciBhdXRob3JpemF0aW9uLiBGb3IgaW5zdGFuY2UsIGluCisgICAgICAgICAgICAgICAgICAgIGEgbWV0aG9kIGNhbGwgdGhhdCBkaXJlY3RzIGEgbmV0d29yayBtYW5hZ2VtZW50IHNlcnZpY2UKKyAgICAgICAgICAgICAgICAgICAgdG8gYXR0ZW1wdCB0byBjb25uZWN0IHRvIGEgdmlydHVhbCBwcml2YXRlIG5ldHdvcmssCisgICAgICAgICAgICAgICAgICAgIHRoaXMgZmxhZyBzaG91bGQgY29udHJvbCBob3cgdGhlIG5ldHdvcmsgbWFuYWdlbWVudAorICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlIG1ha2VzIHRoZSBkZWNpc2lvbiAiaXMgdGhpcyB1c2VyIGFsbG93ZWQgdG8KKyAgICAgICAgICAgICAgICAgICAgY2hhbmdlIHN5c3RlbSBuZXR3b3JrIGNvbmZpZ3VyYXRpb24/IiwgYnV0IGl0IHNob3VsZAorICAgICAgICAgICAgICAgICAgICBub3QgYWZmZWN0IGhvdyBvciB3aGV0aGVyIHRoZSBuZXR3b3JrIG1hbmFnZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgc2VydmljZSBpbnRlcmFjdHMgd2l0aCB0aGUgdXNlciB0byBvYnRhaW4gdGhlIGNyZWRlbnRpYWxzCisgICAgICAgICAgICAgICAgICAgIHRoYXQgYXJlIHJlcXVpcmVkIGZvciBhY2Nlc3MgdG8gdGhlIFZQTi4KKyAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBJZiBhIHRoaXMgZmxhZyBpcyBub3Qgc2V0IG9uIGEgbWV0aG9kIGNhbGwsIGFuZCBhCisgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UgZGV0ZXJtaW5lcyB0aGF0IHRoZSByZXF1ZXN0ZWQgb3BlcmF0aW9uIGlzCisgICAgICAgICAgICAgICAgICAgIG5vdCBhbGxvd2VkIHdpdGhvdXQgaW50ZXJhY3RpdmUgYXV0aG9yaXphdGlvbiwgYnV0CisgICAgICAgICAgICAgICAgICAgIGNvdWxkIGJlIGFsbG93ZWQgYWZ0ZXIgc3VjY2Vzc2Z1bCBpbnRlcmFjdGl2ZQorICAgICAgICAgICAgICAgICAgICBhdXRob3JpemF0aW9uLCBpdCBtYXkgcmV0dXJuIHRoZQorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuREJ1cy5FcnJvci5JbnRlcmFjdGl2ZUF1dGhvcml6YXRpb25SZXF1aXJlZDwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgZXJyb3IuCisgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgVGhlIGFic2VuY2Ugb2YgdGhpcyBmbGFnIGRvZXMgbm90IGd1YXJhbnRlZSB0aGF0CisgICAgICAgICAgICAgICAgICAgIGludGVyYWN0aXZlIGF1dGhvcml6YXRpb24gd2lsbCBub3QgYmUgYXBwbGllZCwgc2luY2UKKyAgICAgICAgICAgICAgICAgICAgZXhpc3Rpbmcgc2VydmljZXMgdGhhdCBwcmUtZGF0ZSB0aGlzIGZsYWcgbWlnaHQKKyAgICAgICAgICAgICAgICAgICAgYWxyZWFkeSB1c2UgaW50ZXJhY3RpdmUgYXV0aG9yaXphdGlvbi4gSG93ZXZlciwKKyAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcgRC1CdXMgQVBJcyB0aGF0IHdpbGwgdXNlIGludGVyYWN0aXZlCisgICAgICAgICAgICAgICAgICAgIGF1dGhvcml6YXRpb24gc2hvdWxkIGRvY3VtZW50IHRoYXQgdGhlIGNhbGwgbWF5IHRha2UKKyAgICAgICAgICAgICAgICAgICAgbG9uZ2VyIHRoYW4gdXN1YWwsIGFuZCBuZXcgRC1CdXMgQVBJcyBzaG91bGQgYXZvaWQKKyAgICAgICAgICAgICAgICAgICAgaW50ZXJhY3RpdmUgYXV0aG9yaXphdGlvbiBpbiB0aGUgYWJzZW5jZSBvZiB0aGlzIGZsYWcuCisgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICA8L3Rib2R5PgorICAgICAgICAgIDwvdGdyb3VwPgorICAgICAgICA8L2luZm9ybWFsdGFibGU+CisgICAgICA8L3BhcmE+CisKKyAgICAgIDxzZWN0MyBpZD0ibWVzc2FnZS1wcm90b2NvbC1oZWFkZXItZmllbGRzIj4KKyAgICAgICAgPHRpdGxlPkhlYWRlciBGaWVsZHM8L3RpdGxlPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgIFRoZSBhcnJheSBhdCB0aGUgZW5kIG9mIHRoZSBoZWFkZXIgY29udGFpbnMgPGZpcnN0dGVybT5oZWFkZXIKKyAgICAgICAgICBmaWVsZHM8L2ZpcnN0dGVybT4sIHdoZXJlIGVhY2ggZmllbGQgaXMgYSAxLWJ5dGUgZmllbGQgY29kZSBmb2xsb3dlZAorICAgICAgICAgIGJ5IGEgZmllbGQgdmFsdWUuIEEgaGVhZGVyIG11c3QgY29udGFpbiB0aGUgcmVxdWlyZWQgaGVhZGVyIGZpZWxkcyBmb3IKKyAgICAgICAgICBpdHMgbWVzc2FnZSB0eXBlLCBhbmQgemVybyBvciBtb3JlIG9mIGFueSBvcHRpb25hbCBoZWFkZXIKKyAgICAgICAgICBmaWVsZHMuIEZ1dHVyZSB2ZXJzaW9ucyBvZiB0aGlzIHByb3RvY29sIHNwZWNpZmljYXRpb24gbWF5IGFkZCBuZXcKKyAgICAgICAgICBmaWVsZHMuIEltcGxlbWVudGF0aW9ucyBtdXN0IGlnbm9yZSBmaWVsZHMgdGhleSBkbyBub3QKKyAgICAgICAgICB1bmRlcnN0YW5kLiBJbXBsZW1lbnRhdGlvbnMgbXVzdCBub3QgaW52ZW50IHRoZWlyIG93biBoZWFkZXIgZmllbGRzOworICAgICAgICAgIG9ubHkgY2hhbmdlcyB0byB0aGlzIHNwZWNpZmljYXRpb24gbWF5IGludHJvZHVjZSBuZXcgaGVhZGVyIGZpZWxkcy4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEFnYWluLCBpZiBhbiBpbXBsZW1lbnRhdGlvbiBzZWVzIGEgaGVhZGVyIGZpZWxkIGNvZGUgdGhhdCBpdCBkb2VzIG5vdAorICAgICAgICAgIGV4cGVjdCwgaXQgbXVzdCBpZ25vcmUgdGhhdCBmaWVsZCwgYXMgaXQgd2lsbCBiZSBwYXJ0IG9mIGEgbmV3CisgICAgICAgICAgKGJ1dCBjb21wYXRpYmxlKSB2ZXJzaW9uIG9mIHRoaXMgc3BlY2lmaWNhdGlvbi4gVGhpcyBhbHNvIGFwcGxpZXMKKyAgICAgICAgICB0byBrbm93biBoZWFkZXIgZmllbGRzIGFwcGVhcmluZyBpbiB1bmV4cGVjdGVkIG1lc3NhZ2VzLCBmb3IKKyAgICAgICAgICBleGFtcGxlOiBpZiBhIHNpZ25hbCBoYXMgYSByZXBseSBzZXJpYWwgaXQgbXVzdCBiZSBpZ25vcmVkCisgICAgICAgICAgZXZlbiB0aG91Z2ggaXQgaGFzIG5vIG1lYW5pbmcgYXMgb2YgdGhpcyB2ZXJzaW9uIG9mIHRoZSBzcGVjLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgSG93ZXZlciwgaW1wbGVtZW50YXRpb25zIG11c3Qgbm90IHNlbmQgb3IgYWNjZXB0IGtub3duIGhlYWRlciBmaWVsZHMKKyAgICAgICAgICB3aXRoIHRoZSB3cm9uZyB0eXBlIHN0b3JlZCBpbiB0aGUgZmllbGQgdmFsdWUuIFNvIGZvciBleGFtcGxlIGEKKyAgICAgICAgICBtZXNzYWdlIHdpdGggYW4gPGxpdGVyYWw+SU5URVJGQUNFPC9saXRlcmFsPiBmaWVsZCBvZiB0eXBlCisgICAgICAgICAgPGxpdGVyYWw+VUlOVDMyPC9saXRlcmFsPiB3b3VsZCBiZSBjb25zaWRlcmVkIGNvcnJ1cHQuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICBIZXJlIGFyZSB0aGUgY3VycmVudGx5LWRlZmluZWQgaGVhZGVyIGZpZWxkczoKKyAgICAgICAgICA8aW5mb3JtYWx0YWJsZT4KKyAgICAgICAgICAgIDx0Z3JvdXAgY29scz0iNSI+CisgICAgICAgICAgICAgIDx0aGVhZD4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkNvbnZlbnRpb25hbCBOYW1lPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5EZWNpbWFsIENvZGU8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlR5cGU8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlJlcXVpcmVkIEluPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5EZXNjcmlwdGlvbjwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDwvdGhlYWQ+CisgICAgICAgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPklOVkFMSUQ8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT4wPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5OL0E8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5Pm5vdCBhbGxvd2VkPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5Ob3QgYSB2YWxpZCBmaWVsZCBuYW1lIChlcnJvciBpZiBpdCBhcHBlYXJzIGluIGEgbWVzc2FnZSk8L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+UEFUSDwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjE8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPk9CSkVDVF9QQVRIPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+TUVUSE9EX0NBTEw8L2xpdGVyYWw+LCA8bGl0ZXJhbD5TSUdOQUw8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5UaGUgb2JqZWN0IHRvIHNlbmQgYSBjYWxsIHRvLAorICAgICAgICAgICAgICAgICAgICBvciB0aGUgb2JqZWN0IGEgc2lnbmFsIGlzIGVtaXR0ZWQgZnJvbS4KKyAgICAgICAgICAgICAgICAgICAgVGhlIHNwZWNpYWwgcGF0aAorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD4vb3JnL2ZyZWVkZXNrdG9wL0RCdXMvTG9jYWw8L2xpdGVyYWw+IGlzIHJlc2VydmVkOworICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbnMgc2hvdWxkIG5vdCBzZW5kIG1lc3NhZ2VzIHdpdGggdGhpcyBwYXRoLAorICAgICAgICAgICAgICAgICAgICBhbmQgdGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgYnVzIGRhZW1vbiB3aWxsCisgICAgICAgICAgICAgICAgICAgIGRpc2Nvbm5lY3QgYW55IGFwcGxpY2F0aW9uIHRoYXQgYXR0ZW1wdHMgdG8gZG8gc28uCisgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+SU5URVJGQUNFPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+MjwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+U1RSSU5HPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+U0lHTkFMPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+CisgICAgICAgICAgICAgICAgICAgIFRoZSBpbnRlcmZhY2UgdG8gaW52b2tlIGEgbWV0aG9kIGNhbGwgb24sIG9yCisgICAgICAgICAgICAgICAgICAgIHRoYXQgYSBzaWduYWwgaXMgZW1pdHRlZCBmcm9tLiBPcHRpb25hbCBmb3IKKyAgICAgICAgICAgICAgICAgICAgbWV0aG9kIGNhbGxzLCByZXF1aXJlZCBmb3Igc2lnbmFscy4KKyAgICAgICAgICAgICAgICAgICAgVGhlIHNwZWNpYWwgaW50ZXJmYWNlCisgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzLkxvY2FsPC9saXRlcmFsPiBpcyByZXNlcnZlZDsKKyAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb25zIHNob3VsZCBub3Qgc2VuZCBtZXNzYWdlcyB3aXRoIHRoaXMKKyAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlLCBhbmQgdGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgYnVzCisgICAgICAgICAgICAgICAgICAgIGRhZW1vbiB3aWxsIGRpc2Nvbm5lY3QgYW55IGFwcGxpY2F0aW9uIHRoYXQgYXR0ZW1wdHMgdG8KKyAgICAgICAgICAgICAgICAgICAgZG8gc28uCisgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+TUVNQkVSPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+MzwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+U1RSSU5HPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+TUVUSE9EX0NBTEw8L2xpdGVyYWw+LCA8bGl0ZXJhbD5TSUdOQUw8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5UaGUgbWVtYmVyLCBlaXRoZXIgdGhlIG1ldGhvZCBuYW1lIG9yIHNpZ25hbCBuYW1lLjwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5FUlJPUl9OQU1FPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+NDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+U1RSSU5HPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+RVJST1I8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5UaGUgbmFtZSBvZiB0aGUgZXJyb3IgdGhhdCBvY2N1cnJlZCwgZm9yIGVycm9yczwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5SRVBMWV9TRVJJQUw8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT41PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5VSU5UMzI8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5FUlJPUjwvbGl0ZXJhbD4sIDxsaXRlcmFsPk1FVEhPRF9SRVRVUk48L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5UaGUgc2VyaWFsIG51bWJlciBvZiB0aGUgbWVzc2FnZSB0aGlzIG1lc3NhZ2UgaXMgYSByZXBseQorICAgICAgICAgICAgICAgICAgICB0by4gKFRoZSBzZXJpYWwgbnVtYmVyIGlzIHRoZSBzZWNvbmQgPGxpdGVyYWw+VUlOVDMyPC9saXRlcmFsPiBpbiB0aGUgaGVhZGVyLik8L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+REVTVElOQVRJT048L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT42PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5TVFJJTkc8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5vcHRpb25hbDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+VGhlIG5hbWUgb2YgdGhlIGNvbm5lY3Rpb24gdGhpcyBtZXNzYWdlIGlzIGludGVuZGVkIGZvci4KKyAgICAgICAgICAgICAgICAgICAgT25seSB1c2VkIGluIGNvbWJpbmF0aW9uIHdpdGggdGhlIG1lc3NhZ2UgYnVzLCBzZWUKKyAgICAgICAgICAgICAgICAgICAgPHhyZWYgbGlua2VuZD0ibWVzc2FnZS1idXMiLz4uPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPlNFTkRFUjwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5Pjc8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPlNUUklORzwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5Pm9wdGlvbmFsPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5VbmlxdWUgbmFtZSBvZiB0aGUgc2VuZGluZyBjb25uZWN0aW9uLgorICAgICAgICAgICAgICAgICAgICBUaGUgbWVzc2FnZSBidXMgZmlsbHMgaW4gdGhpcyBmaWVsZCBzbyBpdCBpcyByZWxpYWJsZTsgdGhlIGZpZWxkIGlzCisgICAgICAgICAgICAgICAgICAgIG9ubHkgbWVhbmluZ2Z1bCBpbiBjb21iaW5hdGlvbiB3aXRoIHRoZSBtZXNzYWdlIGJ1cy48L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+U0lHTkFUVVJFPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+ODwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+U0lHTkFUVVJFPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+b3B0aW9uYWw8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlRoZSBzaWduYXR1cmUgb2YgdGhlIG1lc3NhZ2UgYm9keS4KKyAgICAgICAgICAgICAgICAgIElmIG9taXR0ZWQsIGl0IGlzIGFzc3VtZWQgdG8gYmUgdGhlCisgICAgICAgICAgICAgICAgICBlbXB0eSBzaWduYXR1cmUgIiIgKGkuZS4gdGhlIGJvZHkgbXVzdCBiZSAwLWxlbmd0aCkuPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPlVOSVhfRkRTPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+OTwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+VUlOVDMyPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+b3B0aW9uYWw8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlRoZSBudW1iZXIgb2YgVW5peCBmaWxlIGRlc2NyaXB0b3JzIHRoYXQKKyAgICAgICAgICAgICAgICAgIGFjY29tcGFueSB0aGUgbWVzc2FnZS4gIElmIG9taXR0ZWQsIGl0IGlzIGFzc3VtZWQKKyAgICAgICAgICAgICAgICAgIHRoYXQgbm8gVW5peCBmaWxlIGRlc2NyaXB0b3JzIGFjY29tcGFueSB0aGUKKyAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuIFRoZSBhY3R1YWwgZmlsZSBkZXNjcmlwdG9ycyBuZWVkIHRvIGJlCisgICAgICAgICAgICAgICAgICB0cmFuc2ZlcnJlZCB2aWEgcGxhdGZvcm0gc3BlY2lmaWMgbWVjaGFuaXNtCisgICAgICAgICAgICAgICAgICBvdXQtb2YtYmFuZC4gVGhleSBtdXN0IGJlIHNlbnQgYXQgdGhlIHNhbWUgdGltZSBhcworICAgICAgICAgICAgICAgICAgcGFydCBvZiB0aGUgbWVzc2FnZSBpdHNlbGYuIFRoZXkgbWF5IG5vdCBiZSBzZW50CisgICAgICAgICAgICAgICAgICBiZWZvcmUgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIG1lc3NhZ2UgaXRzZWxmIGlzCisgICAgICAgICAgICAgICAgICB0cmFuc2ZlcnJlZCBvciBhZnRlciB0aGUgbGFzdCBieXRlIG9mIHRoZSBtZXNzYWdlCisgICAgICAgICAgICAgICAgICBpdHNlbGYuPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPC90Ym9keT4KKyAgICAgICAgICAgIDwvdGdyb3VwPgorICAgICAgICAgIDwvaW5mb3JtYWx0YWJsZT4KKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9zZWN0Mz4KKyAgICA8L3NlY3QyPgorCisgICAgPHNlY3QyIGlkPSJtZXNzYWdlLXByb3RvY29sLW5hbWVzIj4KKyAgICAgIDx0aXRsZT5WYWxpZCBOYW1lczwvdGl0bGU+CisgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIHZhcmlvdXMgbmFtZXMgaW4gRC1CdXMgbWVzc2FnZXMgaGF2ZSBzb21lIHJlc3RyaWN0aW9ucy4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBUaGVyZSBpcyBhIDxmaXJzdHRlcm0+bWF4aW11bSBuYW1lIGxlbmd0aDwvZmlyc3R0ZXJtPgorICAgICAgICBvZiAyNTUgd2hpY2ggYXBwbGllcyB0byBidXMgbmFtZXMsIGludGVyZmFjZXMsIGFuZCBtZW1iZXJzLgorICAgICAgPC9wYXJhPgorICAgICAgPHNlY3QzIGlkPSJtZXNzYWdlLXByb3RvY29sLW5hbWVzLWludGVyZmFjZSI+CisgICAgICAgIDx0aXRsZT5JbnRlcmZhY2UgbmFtZXM8L3RpdGxlPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBJbnRlcmZhY2VzIGhhdmUgbmFtZXMgd2l0aCB0eXBlIDxsaXRlcmFsPlNUUklORzwvbGl0ZXJhbD4sIG1lYW5pbmcgdGhhdAorICAgICAgICAgIHRoZXkgbXVzdCBiZSB2YWxpZCBVVEYtOC4gSG93ZXZlciwgdGhlcmUgYXJlIGFsc28gc29tZQorICAgICAgICAgIGFkZGl0aW9uYWwgcmVzdHJpY3Rpb25zIHRoYXQgYXBwbHkgdG8gaW50ZXJmYWNlIG5hbWVzCisgICAgICAgICAgc3BlY2lmaWNhbGx5OgorICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+SW50ZXJmYWNlIG5hbWVzIGFyZSBjb21wb3NlZCBvZiAxIG9yIG1vcmUgZWxlbWVudHMgc2VwYXJhdGVkIGJ5CisgICAgICAgICAgICAgICAgYSBwZXJpb2QgKCcuJykgY2hhcmFjdGVyLiBBbGwgZWxlbWVudHMgbXVzdCBjb250YWluIGF0IGxlYXN0CisgICAgICAgICAgICAgICAgb25lIGNoYXJhY3Rlci4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPkVhY2ggZWxlbWVudCBtdXN0IG9ubHkgY29udGFpbiB0aGUgQVNDSUkgY2hhcmFjdGVycworICAgICAgICAgICAgICAgICJbQS1aXVthLXpdWzAtOV1fIiBhbmQgbXVzdCBub3QgYmVnaW4gd2l0aCBhIGRpZ2l0LgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisKKyAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT5JbnRlcmZhY2UgbmFtZXMgbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSAnLicgKHBlcmlvZCkKKyAgICAgICAgICAgICAgY2hhcmFjdGVyIChhbmQgdGh1cyBhdCBsZWFzdCB0d28gZWxlbWVudHMpLgorICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKworICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPkludGVyZmFjZSBuYW1lcyBtdXN0IG5vdCBiZWdpbiB3aXRoIGEgJy4nIChwZXJpb2QpIGNoYXJhY3Rlci48L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT5JbnRlcmZhY2UgbmFtZXMgbXVzdCBub3QgZXhjZWVkIHRoZSBtYXhpbXVtIG5hbWUgbGVuZ3RoLjwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgSW50ZXJmYWNlIG5hbWVzIHNob3VsZCBzdGFydCB3aXRoIHRoZSByZXZlcnNlZCBETlMgZG9tYWluIG5hbWUgb2YKKyAgICAgICAgICB0aGUgYXV0aG9yIG9mIHRoZSBpbnRlcmZhY2UgKGluIGxvd2VyLWNhc2UpLCBsaWtlIGludGVyZmFjZSBuYW1lcworICAgICAgICAgIGluIEphdmEuIEl0IGlzIGNvbnZlbnRpb25hbCBmb3IgdGhlIHJlc3Qgb2YgdGhlIGludGVyZmFjZSBuYW1lCisgICAgICAgICAgdG8gY29uc2lzdCBvZiB3b3JkcyBydW4gdG9nZXRoZXIsIHdpdGggaW5pdGlhbCBjYXBpdGFsIGxldHRlcnMKKyAgICAgICAgICBvbiBhbGwgd29yZHMgKCJDYW1lbENhc2UiKS4gU2V2ZXJhbCBsZXZlbHMgb2YgaGllcmFyY2h5IGNhbiBiZSB1c2VkLgorICAgICAgICAgIEl0IGlzIGFsc28gYSBnb29kIGlkZWEgdG8gaW5jbHVkZSB0aGUgbWFqb3IgdmVyc2lvbiBvZiB0aGUgaW50ZXJmYWNlCisgICAgICAgICAgaW4gdGhlIG5hbWUsIGFuZCBpbmNyZW1lbnQgaXQgaWYgaW5jb21wYXRpYmxlIGNoYW5nZXMgYXJlIG1hZGU7CisgICAgICAgICAgdGhpcyB3YXksIGEgc2luZ2xlIG9iamVjdCBjYW4gaW1wbGVtZW50IHNldmVyYWwgdmVyc2lvbnMgb2YgYW4KKyAgICAgICAgICBpbnRlcmZhY2UgaW4gcGFyYWxsZWwsIGlmIG5lY2Vzc2FyeS4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEZvciBpbnN0YW5jZSwgaWYgdGhlIG93bmVyIG9mIDxsaXRlcmFsPmV4YW1wbGUuY29tPC9saXRlcmFsPiBpcworICAgICAgICAgIGRldmVsb3BpbmcgYSBELUJ1cyBBUEkgZm9yIGEgbXVzaWMgcGxheWVyLCB0aGV5IG1pZ2h0IGRlZmluZQorICAgICAgICAgIGludGVyZmFjZXMgY2FsbGVkIDxsaXRlcmFsPmNvbS5leGFtcGxlLk11c2ljUGxheWVyMTwvbGl0ZXJhbD4sCisgICAgICAgICAgPGxpdGVyYWw+Y29tLmV4YW1wbGUuTXVzaWNQbGF5ZXIxLlRyYWNrPC9saXRlcmFsPiBhbmQKKyAgICAgICAgICA8bGl0ZXJhbD5jb20uZXhhbXBsZS5NdXNpY1BsYXllcjEuU2Vla2FibGU8L2xpdGVyYWw+LgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgRC1CdXMgZG9lcyBub3QgZGlzdGluZ3Vpc2ggYmV0d2VlbiB0aGUgY29uY2VwdHMgdGhhdCB3b3VsZCBiZQorICAgICAgICAgIGNhbGxlZCBjbGFzc2VzIGFuZCBpbnRlcmZhY2VzIGluIEphdmE6IGVpdGhlciBjYW4gYmUgaWRlbnRpZmllZCBvbgorICAgICAgICAgIEQtQnVzIGJ5IGFuIGludGVyZmFjZSBuYW1lLgorICAgICAgICA8L3BhcmE+CisgICAgICA8L3NlY3QzPgorICAgICAgPHNlY3QzIGlkPSJtZXNzYWdlLXByb3RvY29sLW5hbWVzLWJ1cyI+CisgICAgICAgIDx0aXRsZT5CdXMgbmFtZXM8L3RpdGxlPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBDb25uZWN0aW9ucyBoYXZlIG9uZSBvciBtb3JlIGJ1cyBuYW1lcyBhc3NvY2lhdGVkIHdpdGggdGhlbS4KKyAgICAgICAgICBBIGNvbm5lY3Rpb24gaGFzIGV4YWN0bHkgb25lIGJ1cyBuYW1lIHRoYXQgaXMgYSA8Zmlyc3R0ZXJtPnVuaXF1ZQorICAgICAgICAgICAgY29ubmVjdGlvbiBuYW1lPC9maXJzdHRlcm0+LiBUaGUgdW5pcXVlIGNvbm5lY3Rpb24gbmFtZSByZW1haW5zCisgICAgICAgICAgd2l0aCB0aGUgY29ubmVjdGlvbiBmb3IgaXRzIGVudGlyZSBsaWZldGltZS4KKyAgICAgICAgICBBIGJ1cyBuYW1lIGlzIG9mIHR5cGUgPGxpdGVyYWw+U1RSSU5HPC9saXRlcmFsPiwKKyAgICAgICAgICBtZWFuaW5nIHRoYXQgaXQgbXVzdCBiZSB2YWxpZCBVVEYtOC4gSG93ZXZlciwgdGhlcmUgYXJlIGFsc28KKyAgICAgICAgICBzb21lIGFkZGl0aW9uYWwgcmVzdHJpY3Rpb25zIHRoYXQgYXBwbHkgdG8gYnVzIG5hbWVzCisgICAgICAgICAgc3BlY2lmaWNhbGx5OgorICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+QnVzIG5hbWVzIHRoYXQgc3RhcnQgd2l0aCBhIGNvbG9uICgnOicpCisgICAgICAgICAgICAgICAgY2hhcmFjdGVyIGFyZSB1bmlxdWUgY29ubmVjdGlvbiBuYW1lcy4gT3RoZXIgYnVzIG5hbWVzCisgICAgICAgICAgICAgICAgYXJlIGNhbGxlZCA8Zmlyc3R0ZXJtPndlbGwta25vd24gYnVzIG5hbWVzPC9maXJzdHRlcm0+LgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+QnVzIG5hbWVzIGFyZSBjb21wb3NlZCBvZiAxIG9yIG1vcmUgZWxlbWVudHMgc2VwYXJhdGVkIGJ5CisgICAgICAgICAgICAgICAgYSBwZXJpb2QgKCcuJykgY2hhcmFjdGVyLiBBbGwgZWxlbWVudHMgbXVzdCBjb250YWluIGF0IGxlYXN0CisgICAgICAgICAgICAgICAgb25lIGNoYXJhY3Rlci4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPkVhY2ggZWxlbWVudCBtdXN0IG9ubHkgY29udGFpbiB0aGUgQVNDSUkgY2hhcmFjdGVycworICAgICAgICAgICAgICAgICJbQS1aXVthLXpdWzAtOV1fLSIuIE9ubHkgZWxlbWVudHMgdGhhdCBhcmUgcGFydCBvZiBhIHVuaXF1ZQorICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24gbmFtZSBtYXkgYmVnaW4gd2l0aCBhIGRpZ2l0LCBlbGVtZW50cyBpbgorICAgICAgICAgICAgICAgIG90aGVyIGJ1cyBuYW1lcyBtdXN0IG5vdCBiZWdpbiB3aXRoIGEgZGlnaXQuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKworICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPkJ1cyBuYW1lcyBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lICcuJyAocGVyaW9kKQorICAgICAgICAgICAgICBjaGFyYWN0ZXIgKGFuZCB0aHVzIGF0IGxlYXN0IHR3byBlbGVtZW50cykuCisgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorCisgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+QnVzIG5hbWVzIG11c3Qgbm90IGJlZ2luIHdpdGggYSAnLicgKHBlcmlvZCkgY2hhcmFjdGVyLjwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPkJ1cyBuYW1lcyBtdXN0IG5vdCBleGNlZWQgdGhlIG1heGltdW0gbmFtZSBsZW5ndGguPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgTm90ZSB0aGF0IHRoZSBoeXBoZW4gKCctJykgY2hhcmFjdGVyIGlzIGFsbG93ZWQgaW4gYnVzIG5hbWVzIGJ1dAorICAgICAgICAgIG5vdCBpbiBpbnRlcmZhY2UgbmFtZXMuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICBMaWtlIDxsaW5rIGxpbmtlbmQ9Im1lc3NhZ2UtcHJvdG9jb2wtbmFtZXMtaW50ZXJmYWNlIj5pbnRlcmZhY2UKKyAgICAgICAgICAgIG5hbWVzPC9saW5rPiwgd2VsbC1rbm93biBidXMgbmFtZXMgc2hvdWxkIHN0YXJ0IHdpdGggdGhlCisgICAgICAgICAgcmV2ZXJzZWQgRE5TIGRvbWFpbiBuYW1lIG9mIHRoZSBhdXRob3Igb2YgdGhlIGludGVyZmFjZSAoaW4KKyAgICAgICAgICBsb3dlci1jYXNlKSwgYW5kIGl0IGlzIGNvbnZlbnRpb25hbCBmb3IgdGhlIHJlc3Qgb2YgdGhlIHdlbGwta25vd24KKyAgICAgICAgICBidXMgbmFtZSB0byBjb25zaXN0IG9mIHdvcmRzIHJ1biB0b2dldGhlciwgd2l0aCBpbml0aWFsCisgICAgICAgICAgY2FwaXRhbCBsZXR0ZXJzLiBBcyB3aXRoIGludGVyZmFjZSBuYW1lcywgaW5jbHVkaW5nIGEgdmVyc2lvbgorICAgICAgICAgIG51bWJlciBpbiB3ZWxsLWtub3duIGJ1cyBuYW1lcyBpcyBhIGdvb2QgaWRlYTsgaXQncyBwb3NzaWJsZSB0bworICAgICAgICAgIGhhdmUgdGhlIHdlbGwta25vd24gYnVzIG5hbWUgZm9yIG1vcmUgdGhhbiBvbmUgdmVyc2lvbgorICAgICAgICAgIHNpbXVsdGFuZW91c2x5IGlmIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGlzIHJlcXVpcmVkLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgSWYgYSB3ZWxsLWtub3duIGJ1cyBuYW1lIGltcGxpZXMgdGhlIHByZXNlbmNlIG9mIGEgIm1haW4iIGludGVyZmFjZSwKKyAgICAgICAgICB0aGF0ICJtYWluIiBpbnRlcmZhY2UgaXMgb2Z0ZW4gZ2l2ZW4gdGhlIHNhbWUgbmFtZSBhcworICAgICAgICAgIHRoZSB3ZWxsLWtub3duIGJ1cyBuYW1lLCBhbmQgc2l0dWF0ZWQgYXQgdGhlIGNvcnJlc3BvbmRpbmcgb2JqZWN0CisgICAgICAgICAgcGF0aC4gRm9yIGluc3RhbmNlLCBpZiB0aGUgb3duZXIgb2YgPGxpdGVyYWw+ZXhhbXBsZS5jb208L2xpdGVyYWw+CisgICAgICAgICAgaXMgZGV2ZWxvcGluZyBhIEQtQnVzIEFQSSBmb3IgYSBtdXNpYyBwbGF5ZXIsIHRoZXkgbWlnaHQgZGVmaW5lCisgICAgICAgICAgdGhhdCBhbnkgYXBwbGljYXRpb24gdGhhdCB0YWtlcyB0aGUgd2VsbC1rbm93biBuYW1lCisgICAgICAgICAgPGxpdGVyYWw+Y29tLmV4YW1wbGUuTXVzaWNQbGF5ZXIxPC9saXRlcmFsPiBzaG91bGQgaGF2ZSBhbiBvYmplY3QKKyAgICAgICAgICBhdCB0aGUgb2JqZWN0IHBhdGggPGxpdGVyYWw+L2NvbS9leGFtcGxlL011c2ljUGxheWVyMTwvbGl0ZXJhbD4KKyAgICAgICAgICB3aGljaCBpbXBsZW1lbnRzIHRoZSBpbnRlcmZhY2UKKyAgICAgICAgICA8bGl0ZXJhbD5jb20uZXhhbXBsZS5NdXNpY1BsYXllcjE8L2xpdGVyYWw+LgorICAgICAgICA8L3BhcmE+CisgICAgICA8L3NlY3QzPgorICAgICAgPHNlY3QzIGlkPSJtZXNzYWdlLXByb3RvY29sLW5hbWVzLW1lbWJlciI+CisgICAgICAgIDx0aXRsZT5NZW1iZXIgbmFtZXM8L3RpdGxlPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBNZW1iZXIgKGkuZS4gbWV0aG9kIG9yIHNpZ25hbCkgbmFtZXM6CisgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT5NdXN0IG9ubHkgY29udGFpbiB0aGUgQVNDSUkgY2hhcmFjdGVycworICAgICAgICAgICAgICAgICJbQS1aXVthLXpdWzAtOV1fIiBhbmQgbWF5IG5vdCBiZWdpbiB3aXRoIGEKKyAgICAgICAgICAgICAgICBkaWdpdC48L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT5NdXN0IG5vdCBjb250YWluIHRoZSAnLicgKHBlcmlvZCkgY2hhcmFjdGVyLjwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPk11c3Qgbm90IGV4Y2VlZCB0aGUgbWF4aW11bSBuYW1lIGxlbmd0aC48L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT5NdXN0IGJlIGF0IGxlYXN0IDEgYnl0ZSBpbiBsZW5ndGguPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICBJdCBpcyBjb252ZW50aW9uYWwgZm9yIG1lbWJlciBuYW1lcyBvbiBELUJ1cyB0byBjb25zaXN0IG9mCisgICAgICAgICAgY2FwaXRhbGl6ZWQgd29yZHMgd2l0aCBubyBwdW5jdHVhdGlvbiAoImNhbWVsLWNhc2UiKS4KKyAgICAgICAgICBNZXRob2QgbmFtZXMgc2hvdWxkIHVzdWFsbHkgYmUgdmVyYnMsIHN1Y2ggYXMKKyAgICAgICAgICA8bGl0ZXJhbD5HZXRJdGVtczwvbGl0ZXJhbD4sIGFuZCBzaWduYWwgbmFtZXMgc2hvdWxkIHVzdWFsbHkgYmUKKyAgICAgICAgICBhIGRlc2NyaXB0aW9uIG9mIGFuIGV2ZW50LCBzdWNoIGFzIDxsaXRlcmFsPkl0ZW1zQ2hhbmdlZDwvbGl0ZXJhbD4uCisgICAgICAgIDwvcGFyYT4KKyAgICAgIDwvc2VjdDM+CisgICAgICA8c2VjdDMgaWQ9Im1lc3NhZ2UtcHJvdG9jb2wtbmFtZXMtZXJyb3IiPgorICAgICAgICA8dGl0bGU+RXJyb3IgbmFtZXM8L3RpdGxlPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBFcnJvciBuYW1lcyBoYXZlIHRoZSBzYW1lIHJlc3RyaWN0aW9ucyBhcyBpbnRlcmZhY2UgbmFtZXMuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICBFcnJvciBuYW1lcyBoYXZlIHRoZSBzYW1lIG5hbWluZyBjb252ZW50aW9ucyBhcyBpbnRlcmZhY2UKKyAgICAgICAgICBuYW1lcywgYW5kIG9mdGVuIGNvbnRhaW4gPGxpdGVyYWw+LkVycm9yLjwvbGl0ZXJhbD47IGZvciBpbnN0YW5jZSwKKyAgICAgICAgICB0aGUgb3duZXIgb2YgPGxpdGVyYWw+ZXhhbXBsZS5jb208L2xpdGVyYWw+IG1pZ2h0IGRlZmluZSB0aGUKKyAgICAgICAgICBlcnJvcnMgPGxpdGVyYWw+Y29tLmV4YW1wbGUuTXVzaWNQbGF5ZXIxLkVycm9yLkZpbGVOb3RGb3VuZDwvbGl0ZXJhbD4KKyAgICAgICAgICBhbmQgPGxpdGVyYWw+Y29tLmV4YW1wbGUuTXVzaWNQbGF5ZXIxLkVycm9yLk91dE9mTWVtb3J5PC9saXRlcmFsPi4KKyAgICAgICAgICBUaGUgZXJyb3JzIGRlZmluZWQgYnkgRC1CdXMgaXRzZWxmLCBzdWNoIGFzCisgICAgICAgICAgPGxpdGVyYWw+b3JnLmZyZWVkZXNrdG9wLkRCdXMuRXJyb3IuRmFpbGVkPC9saXRlcmFsPiwgZm9sbG93IGEKKyAgICAgICAgICBzaW1pbGFyIHBhdHRlcm4uCisgICAgICAgIDwvcGFyYT4KKyAgICAgIDwvc2VjdDM+CisgICAgPC9zZWN0Mj4KKworICAgIDxzZWN0MiBpZD0ibWVzc2FnZS1wcm90b2NvbC10eXBlcyI+CisgICAgICA8dGl0bGU+TWVzc2FnZSBUeXBlczwvdGl0bGU+CisgICAgICA8cGFyYT4KKyAgICAgICAgRWFjaCBvZiB0aGUgbWVzc2FnZSB0eXBlcyAoPGxpdGVyYWw+TUVUSE9EX0NBTEw8L2xpdGVyYWw+LCA8bGl0ZXJhbD5NRVRIT0RfUkVUVVJOPC9saXRlcmFsPiwgPGxpdGVyYWw+RVJST1I8L2xpdGVyYWw+LCBhbmQKKyAgICAgICAgPGxpdGVyYWw+U0lHTkFMPC9saXRlcmFsPikgaGFzIGl0cyBvd24gZXhwZWN0ZWQgdXNhZ2UgY29udmVudGlvbnMgYW5kIGhlYWRlciBmaWVsZHMuCisgICAgICAgIFRoaXMgc2VjdGlvbiBkZXNjcmliZXMgdGhlc2UgY29udmVudGlvbnMuCisgICAgICA8L3BhcmE+CisgICAgICA8c2VjdDMgaWQ9Im1lc3NhZ2UtcHJvdG9jb2wtdHlwZXMtbWV0aG9kIj4KKyAgICAgICAgPHRpdGxlPk1ldGhvZCBDYWxsczwvdGl0bGU+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIFNvbWUgbWVzc2FnZXMgaW52b2tlIGFuIG9wZXJhdGlvbiBvbiBhIHJlbW90ZSBvYmplY3QuICBUaGVzZSBhcmUKKyAgICAgICAgICBjYWxsZWQgbWV0aG9kIGNhbGwgbWVzc2FnZXMgYW5kIGhhdmUgdGhlIHR5cGUgdGFnIDxsaXRlcmFsPk1FVEhPRF9DQUxMPC9saXRlcmFsPi4gU3VjaAorICAgICAgICAgIG1lc3NhZ2VzIG1hcCBuYXR1cmFsbHkgdG8gbWV0aG9kcyBvbiBvYmplY3RzIGluIGEgdHlwaWNhbCBwcm9ncmFtLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEEgbWV0aG9kIGNhbGwgbWVzc2FnZSBpcyByZXF1aXJlZCB0byBoYXZlIGEgPGxpdGVyYWw+TUVNQkVSPC9saXRlcmFsPiBoZWFkZXIgZmllbGQKKyAgICAgICAgICBpbmRpY2F0aW5nIHRoZSBuYW1lIG9mIHRoZSBtZXRob2QuIE9wdGlvbmFsbHksIHRoZSBtZXNzYWdlIGhhcyBhbgorICAgICAgICAgIDxsaXRlcmFsPklOVEVSRkFDRTwvbGl0ZXJhbD4gZmllbGQgZ2l2aW5nIHRoZSBpbnRlcmZhY2UgdGhlIG1ldGhvZCBpcyBhIHBhcnQgb2YuCisgICAgICAgICAgSW5jbHVkaW5nIHRoZSA8bGl0ZXJhbD5JTlRFUkZBQ0U8L2xpdGVyYWw+IGluIGFsbCBtZXRob2QgY2FsbAorICAgICAgICAgIG1lc3NhZ2VzIGlzIHN0cm9uZ2x5IHJlY29tbWVuZGVkLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEluIHRoZSBhYnNlbmNlIG9mIGFuIDxsaXRlcmFsPklOVEVSRkFDRTwvbGl0ZXJhbD4gZmllbGQsIGlmIHR3bworICAgICAgICAgIG9yIG1vcmUgaW50ZXJmYWNlcyBvbiB0aGUgc2FtZSBvYmplY3QgaGF2ZSBhIG1ldGhvZCB3aXRoIHRoZSBzYW1lCisgICAgICAgICAgbmFtZSwgaXQgaXMgdW5kZWZpbmVkIHdoaWNoIG9mIHRob3NlIG1ldGhvZHMgd2lsbCBiZSBpbnZva2VkLgorICAgICAgICAgIEltcGxlbWVudGF0aW9ucyBtYXkgY2hvb3NlIHRvIGVpdGhlciByZXR1cm4gYW4gZXJyb3IsIG9yIGRlbGl2ZXIgdGhlCisgICAgICAgICAgbWVzc2FnZSBhcyB0aG91Z2ggaXQgaGFkIGFuIGFyYml0cmFyeSBvbmUgb2YgdGhvc2UgaW50ZXJmYWNlcy4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBJbiBzb21lIHNpdHVhdGlvbnMgKHN1Y2ggYXMgdGhlIHdlbGwta25vd24gc3lzdGVtIGJ1cyksIG1lc3NhZ2VzCisgICAgICAgICAgYXJlIGZpbHRlcmVkIHRocm91Z2ggYW4gYWNjZXNzLWNvbnRyb2wgbGlzdCBleHRlcm5hbCB0byB0aGUKKyAgICAgICAgICByZW1vdGUgb2JqZWN0IGltcGxlbWVudGF0aW9uLiBJZiB0aGF0IGZpbHRlciByZWplY3RzIGNlcnRhaW4KKyAgICAgICAgICBtZXNzYWdlcyBieSBtYXRjaGluZyB0aGVpciBpbnRlcmZhY2UsIG9yIGFjY2VwdHMgb25seSBtZXNzYWdlcworICAgICAgICAgIHRvIHNwZWNpZmljIGludGVyZmFjZXMsIGl0IG11c3QgYWxzbyByZWplY3QgbWVzc2FnZXMgdGhhdCBoYXZlIG5vCisgICAgICAgICAgPGxpdGVyYWw+SU5URVJGQUNFPC9saXRlcmFsPjogb3RoZXJ3aXNlLCBtYWxpY2lvdXMKKyAgICAgICAgICBhcHBsaWNhdGlvbnMgY291bGQgdXNlIHRoaXMgdG8gYnlwYXNzIHRoZSBmaWx0ZXIuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgTWV0aG9kIGNhbGwgbWVzc2FnZXMgYWxzbyBpbmNsdWRlIGEgPGxpdGVyYWw+UEFUSDwvbGl0ZXJhbD4gZmllbGQKKyAgICAgICAgICBpbmRpY2F0aW5nIHRoZSBvYmplY3QgdG8gaW52b2tlIHRoZSBtZXRob2Qgb24uIElmIHRoZSBjYWxsIGlzIHBhc3NpbmcKKyAgICAgICAgICB0aHJvdWdoIGEgbWVzc2FnZSBidXMsIHRoZSBtZXNzYWdlIHdpbGwgYWxzbyBoYXZlIGEKKyAgICAgICAgICA8bGl0ZXJhbD5ERVNUSU5BVElPTjwvbGl0ZXJhbD4gZmllbGQgZ2l2aW5nIHRoZSBuYW1lIG9mIHRoZSBjb25uZWN0aW9uCisgICAgICAgICAgdG8gcmVjZWl2ZSB0aGUgbWVzc2FnZS4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBXaGVuIGFuIGFwcGxpY2F0aW9uIGhhbmRsZXMgYSBtZXRob2QgY2FsbCBtZXNzYWdlLCBpdCBpcyByZXF1aXJlZCB0bworICAgICAgICAgIHJldHVybiBhIHJlcGx5LiBUaGUgcmVwbHkgaXMgaWRlbnRpZmllZCBieSBhIDxsaXRlcmFsPlJFUExZX1NFUklBTDwvbGl0ZXJhbD4gaGVhZGVyIGZpZWxkCisgICAgICAgICAgaW5kaWNhdGluZyB0aGUgc2VyaWFsIG51bWJlciBvZiB0aGUgPGxpdGVyYWw+TUVUSE9EX0NBTEw8L2xpdGVyYWw+IGJlaW5nIHJlcGxpZWQgdG8uIFRoZQorICAgICAgICAgIHJlcGx5IGNhbiBoYXZlIG9uZSBvZiB0d28gdHlwZXM7IGVpdGhlciA8bGl0ZXJhbD5NRVRIT0RfUkVUVVJOPC9saXRlcmFsPiBvciA8bGl0ZXJhbD5FUlJPUjwvbGl0ZXJhbD4uCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgSWYgdGhlIHJlcGx5IGhhcyB0eXBlIDxsaXRlcmFsPk1FVEhPRF9SRVRVUk48L2xpdGVyYWw+LCB0aGUgYXJndW1lbnRzIHRvIHRoZSByZXBseSBtZXNzYWdlCisgICAgICAgICAgYXJlIHRoZSByZXR1cm4gdmFsdWUocykgb3IgIm91dCBwYXJhbWV0ZXJzIiBvZiB0aGUgbWV0aG9kIGNhbGwuCisgICAgICAgICAgSWYgdGhlIHJlcGx5IGhhcyB0eXBlIDxsaXRlcmFsPkVSUk9SPC9saXRlcmFsPiwgdGhlbiBhbiAiZXhjZXB0aW9uIiBoYXMgYmVlbiB0aHJvd24sCisgICAgICAgICAgYW5kIHRoZSBjYWxsIGZhaWxzOyBubyByZXR1cm4gdmFsdWUgd2lsbCBiZSBwcm92aWRlZC4gSXQgbWFrZXMKKyAgICAgICAgICBubyBzZW5zZSB0byBzZW5kIG11bHRpcGxlIHJlcGxpZXMgdG8gdGhlIHNhbWUgbWV0aG9kIGNhbGwuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgRXZlbiBpZiBhIG1ldGhvZCBjYWxsIGhhcyBubyByZXR1cm4gdmFsdWVzLCBhIDxsaXRlcmFsPk1FVEhPRF9SRVRVUk48L2xpdGVyYWw+CisgICAgICAgICAgcmVwbHkgaXMgcmVxdWlyZWQsIHNvIHRoZSBjYWxsZXIgd2lsbCBrbm93IHRoZSBtZXRob2QKKyAgICAgICAgICB3YXMgc3VjY2Vzc2Z1bGx5IHByb2Nlc3NlZC4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBUaGUgPGxpdGVyYWw+TUVUSE9EX1JFVFVSTjwvbGl0ZXJhbD4gb3IgPGxpdGVyYWw+RVJST1I8L2xpdGVyYWw+IHJlcGx5IG1lc3NhZ2UgbXVzdCBoYXZlIHRoZSA8bGl0ZXJhbD5SRVBMWV9TRVJJQUw8L2xpdGVyYWw+CisgICAgICAgICAgaGVhZGVyIGZpZWxkLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIElmIGEgPGxpdGVyYWw+TUVUSE9EX0NBTEw8L2xpdGVyYWw+IG1lc3NhZ2UgaGFzIHRoZSBmbGFnIDxsaXRlcmFsPk5PX1JFUExZX0VYUEVDVEVEPC9saXRlcmFsPiwKKyAgICAgICAgICB0aGVuIHRoZSBhcHBsaWNhdGlvbiByZWNlaXZpbmcgdGhlIG1ldGhvZCBzaG91bGQgbm90IHNlbmQgdGhlIHJlcGx5IG1lc3NhZ2UgKHJlZ2FyZGxlc3Mgb2YKKyAgICAgICAgICB3aGV0aGVyIHRoZSByZXBseSB3b3VsZCBoYXZlIGJlZW4gPGxpdGVyYWw+TUVUSE9EX1JFVFVSTjwvbGl0ZXJhbD4gb3IgPGxpdGVyYWw+RVJST1I8L2xpdGVyYWw+KS4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBVbmxlc3MgYSBtZXNzYWdlIGhhcyB0aGUgZmxhZyA8bGl0ZXJhbD5OT19BVVRPX1NUQVJUPC9saXRlcmFsPiwgaWYgdGhlCisgICAgICAgICAgZGVzdGluYXRpb24gbmFtZSBkb2VzIG5vdCBleGlzdCB0aGVuIGEgcHJvZ3JhbSB0byBvd24gdGhlIGRlc3RpbmF0aW9uCisgICAgICAgICAgbmFtZSB3aWxsIGJlIHN0YXJ0ZWQgKGFjdGl2YXRlZCkgYmVmb3JlIHRoZSBtZXNzYWdlIGlzIGRlbGl2ZXJlZC4gU2VlCisgICAgICAgICAgPHhyZWYgbGlua2VuZD0ibWVzc2FnZS1idXMtc3RhcnRpbmctc2VydmljZXMiLz4uCisgICAgICAgICAgVGhlIG1lc3NhZ2UKKyAgICAgICAgICB3aWxsIGJlIGhlbGQgdW50aWwgdGhlIG5ldyBwcm9ncmFtIGlzIHN1Y2Nlc3NmdWxseSBzdGFydGVkIG9yIGhhcworICAgICAgICAgIGZhaWxlZCB0byBzdGFydDsgaW4gY2FzZSBvZiBmYWlsdXJlLCBhbiBlcnJvciB3aWxsIGJlIHJldHVybmVkLiBUaGlzCisgICAgICAgICAgZmxhZyBpcyBvbmx5IHJlbGV2YW50IGluIHRoZSBjb250ZXh0IG9mIGEgbWVzc2FnZSBidXMsIGl0IGlzIGlnbm9yZWQKKyAgICAgICAgICBkdXJpbmcgb25lLXRvLW9uZSBjb21tdW5pY2F0aW9uIHdpdGggbm8gaW50ZXJtZWRpYXRlIGJ1cy4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8c2VjdDQgaWQ9Im1lc3NhZ2UtcHJvdG9jb2wtdHlwZXMtbWV0aG9kLWFwaXMiPgorICAgICAgICAgIDx0aXRsZT5NYXBwaW5nIG1ldGhvZCBjYWxscyB0byBuYXRpdmUgQVBJczwvdGl0bGU+CisgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBBUElzIGZvciBELUJ1cyBtYXkgbWFwIG1ldGhvZCBjYWxscyB0byBhIG1ldGhvZCBjYWxsIGluIGEgc3BlY2lmaWMKKyAgICAgICAgICAgIHByb2dyYW1taW5nIGxhbmd1YWdlLCBzdWNoIGFzIEMrKywgb3IgbWF5IG1hcCBhIG1ldGhvZCBjYWxsIHdyaXR0ZW4KKyAgICAgICAgICAgIGluIGFuIElETCB0byBhIEQtQnVzIG1lc3NhZ2UuCisgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgSW4gQVBJcyBvZiB0aGlzIG5hdHVyZSwgYXJndW1lbnRzIHRvIGEgbWV0aG9kIGFyZSBvZnRlbiB0ZXJtZWQgImluIgorICAgICAgICAgICAgKHdoaWNoIGltcGxpZXMgc2VudCBpbiB0aGUgPGxpdGVyYWw+TUVUSE9EX0NBTEw8L2xpdGVyYWw+KSwgb3IgIm91dCIgKHdoaWNoIGltcGxpZXMKKyAgICAgICAgICAgIHJldHVybmVkIGluIHRoZSA8bGl0ZXJhbD5NRVRIT0RfUkVUVVJOPC9saXRlcmFsPikuIFNvbWUgQVBJcyBzdWNoIGFzIENPUkJBIGFsc28gaGF2ZQorICAgICAgICAgICAgImlub3V0IiBhcmd1bWVudHMsIHdoaWNoIGFyZSBib3RoIHNlbnQgYW5kIHJlY2VpdmVkLCBpLmUuIHRoZSBjYWxsZXIKKyAgICAgICAgICAgIHBhc3NlcyBpbiBhIHZhbHVlIHdoaWNoIGlzIG1vZGlmaWVkLiBNYXBwZWQgdG8gRC1CdXMsIGFuICJpbm91dCIKKyAgICAgICAgICAgIGFyZ3VtZW50IGlzIGVxdWl2YWxlbnQgdG8gYW4gImluIiBhcmd1bWVudCwgZm9sbG93ZWQgYnkgYW4gIm91dCIKKyAgICAgICAgICAgIGFyZ3VtZW50LiBZb3UgY2FuJ3QgcGFzcyB0aGluZ3MgImJ5IHJlZmVyZW5jZSIgb3ZlciB0aGUgd2lyZSwgc28KKyAgICAgICAgICAgICJpbm91dCIgaXMgcHVyZWx5IGFuIGlsbHVzaW9uIG9mIHRoZSBpbi1wcm9jZXNzIEFQSS4KKyAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBHaXZlbiBhIG1ldGhvZCB3aXRoIHplcm8gb3Igb25lIHJldHVybiB2YWx1ZXMsIGZvbGxvd2VkIGJ5IHplcm8gb3IgbW9yZQorICAgICAgICAgICAgYXJndW1lbnRzLCB3aGVyZSBlYWNoIGFyZ3VtZW50IG1heSBiZSAiaW4iLCAib3V0Iiwgb3IgImlub3V0IiwgdGhlCisgICAgICAgICAgICBjYWxsZXIgY29uc3RydWN0cyBhIG1lc3NhZ2UgYnkgYXBwZW5kaW5nIGVhY2ggImluIiBvciAiaW5vdXQiIGFyZ3VtZW50LAorICAgICAgICAgICAgaW4gb3JkZXIuICJvdXQiIGFyZ3VtZW50cyBhcmUgbm90IHJlcHJlc2VudGVkIGluIHRoZSBjYWxsZXIncyBtZXNzYWdlLgorICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFRoZSByZWNpcGllbnQgY29uc3RydWN0cyBhIHJlcGx5IGJ5IGFwcGVuZGluZyBmaXJzdCB0aGUgcmV0dXJuIHZhbHVlCisgICAgICAgICAgICBpZiBhbnksIHRoZW4gZWFjaCAib3V0IiBvciAiaW5vdXQiIGFyZ3VtZW50LCBpbiBvcmRlci4KKyAgICAgICAgICAgICJpbiIgYXJndW1lbnRzIGFyZSBub3QgcmVwcmVzZW50ZWQgaW4gdGhlIHJlcGx5IG1lc3NhZ2UuCisgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgRXJyb3IgcmVwbGllcyBhcmUgbm9ybWFsbHkgbWFwcGVkIHRvIGV4Y2VwdGlvbnMgaW4gbGFuZ3VhZ2VzIHRoYXQgaGF2ZQorICAgICAgICAgICAgZXhjZXB0aW9ucy4KKyAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBJbiBjb252ZXJ0aW5nIGZyb20gbmF0aXZlIEFQSXMgdG8gRC1CdXMsIGl0IGlzIHBlcmhhcHMgbmljZSB0bworICAgICAgICAgICAgbWFwIEQtQnVzIG5hbWluZyBjb252ZW50aW9ucyAoIkZvb0JhciIpIHRvIG5hdGl2ZSBjb252ZW50aW9ucworICAgICAgICAgICAgc3VjaCBhcyAiZm9vQmFyIiBvciAiZm9vX2JhciIgYXV0b21hdGljYWxseS4gVGhpcyBpcyBPSworICAgICAgICAgICAgYXMgbG9uZyBhcyB5b3UgY2FuIHNheSB0aGF0IHRoZSBuYXRpdmUgQVBJIGlzIG9uZSB0aGF0CisgICAgICAgICAgICB3YXMgc3BlY2lmaWNhbGx5IHdyaXR0ZW4gZm9yIEQtQnVzLiBJdCBtYWtlcyB0aGUgbW9zdCBzZW5zZQorICAgICAgICAgICAgd2hlbiB3cml0aW5nIG9iamVjdCBpbXBsZW1lbnRhdGlvbnMgdGhhdCB3aWxsIGJlIGV4cG9ydGVkCisgICAgICAgICAgICBvdmVyIHRoZSBidXMuIE9iamVjdCBwcm94aWVzIHVzZWQgdG8gaW52b2tlIHJlbW90ZSBELUJ1cworICAgICAgICAgICAgb2JqZWN0cyBwcm9iYWJseSBuZWVkIHRoZSBhYmlsaXR5IHRvIGNhbGwgYW55IEQtQnVzIG1ldGhvZCwKKyAgICAgICAgICAgIGFuZCB0aHVzIGEgbWFnaWMgbmFtZSBtYXBwaW5nIGxpa2UgdGhpcyBjb3VsZCBiZSBhIHByb2JsZW0uCisgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgVGhpcyBzcGVjaWZpY2F0aW9uIGRvZXNuJ3QgcmVxdWlyZSBhbnl0aGluZyBvZiBuYXRpdmUgQVBJIGJpbmRpbmdzOworICAgICAgICAgICAgdGhlIHByZWNlZGluZyBpcyBvbmx5IGEgc3VnZ2VzdGVkIGNvbnZlbnRpb24gZm9yIGNvbnNpc3RlbmN5CisgICAgICAgICAgICBhbW9uZyBiaW5kaW5ncy4KKyAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdDQ+CisgICAgICA8L3NlY3QzPgorCisgICAgICA8c2VjdDMgaWQ9Im1lc3NhZ2UtcHJvdG9jb2wtdHlwZXMtc2lnbmFsIj4KKyAgICAgICAgPHRpdGxlPlNpZ25hbCBFbWlzc2lvbjwvdGl0bGU+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIFVubGlrZSBtZXRob2QgY2FsbHMsIHNpZ25hbCBlbWlzc2lvbnMgaGF2ZSBubyByZXBsaWVzLgorICAgICAgICAgIEEgc2lnbmFsIGVtaXNzaW9uIGlzIHNpbXBseSBhIHNpbmdsZSBtZXNzYWdlIG9mIHR5cGUgPGxpdGVyYWw+U0lHTkFMPC9saXRlcmFsPi4KKyAgICAgICAgICBJdCBtdXN0IGhhdmUgdGhyZWUgaGVhZGVyIGZpZWxkczogPGxpdGVyYWw+UEFUSDwvbGl0ZXJhbD4gZ2l2aW5nIHRoZSBvYmplY3QKKyAgICAgICAgICB0aGUgc2lnbmFsIHdhcyBlbWl0dGVkIGZyb20sIHBsdXMgPGxpdGVyYWw+SU5URVJGQUNFPC9saXRlcmFsPiBhbmQgPGxpdGVyYWw+TUVNQkVSPC9saXRlcmFsPiBnaXZpbmcKKyAgICAgICAgICB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIHNpZ25hbC4gVGhlIDxsaXRlcmFsPklOVEVSRkFDRTwvbGl0ZXJhbD4gaGVhZGVyIGlzIHJlcXVpcmVkCisgICAgICAgICAgZm9yIHNpZ25hbHMsIHRob3VnaCBpdCBpcyBvcHRpb25hbCBmb3IgbWV0aG9kIGNhbGxzLgorICAgICAgICA8L3BhcmE+CisgICAgICA8L3NlY3QzPgorCisgICAgICA8c2VjdDMgaWQ9Im1lc3NhZ2UtcHJvdG9jb2wtdHlwZXMtZXJyb3JzIj4KKyAgICAgICAgPHRpdGxlPkVycm9yczwvdGl0bGU+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIE1lc3NhZ2VzIG9mIHR5cGUgPGxpdGVyYWw+RVJST1I8L2xpdGVyYWw+IGFyZSBtb3N0IGNvbW1vbmx5IHJlcGxpZXMKKyAgICAgICAgICB0byBhIDxsaXRlcmFsPk1FVEhPRF9DQUxMPC9saXRlcmFsPiwgYnV0IG1heSBiZSByZXR1cm5lZCBpbiByZXBseQorICAgICAgICAgIHRvIGFueSBraW5kIG9mIG1lc3NhZ2UuIFRoZSBtZXNzYWdlIGJ1cyBmb3IgZXhhbXBsZQorICAgICAgICAgIHdpbGwgcmV0dXJuIGFuIDxsaXRlcmFsPkVSUk9SPC9saXRlcmFsPiBpbiByZXBseSB0byBhIHNpZ25hbCBlbWlzc2lvbiBpZgorICAgICAgICAgIHRoZSBidXMgZG9lcyBub3QgaGF2ZSBlbm91Z2ggbWVtb3J5IHRvIHNlbmQgdGhlIHNpZ25hbC4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBBbiA8bGl0ZXJhbD5FUlJPUjwvbGl0ZXJhbD4gbWF5IGhhdmUgYW55IGFyZ3VtZW50cywgYnV0IGlmIHRoZSBmaXJzdAorICAgICAgICAgIGFyZ3VtZW50IGlzIGEgPGxpdGVyYWw+U1RSSU5HPC9saXRlcmFsPiwgaXQgbXVzdCBiZSBhbiBlcnJvciBtZXNzYWdlLgorICAgICAgICAgIFRoZSBlcnJvciBtZXNzYWdlIG1heSBiZSBsb2dnZWQgb3Igc2hvd24gdG8gdGhlIHVzZXIKKyAgICAgICAgICBpbiBzb21lIHdheS4KKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9zZWN0Mz4KKworICAgICAgPHNlY3QzIGlkPSJtZXNzYWdlLXByb3RvY29sLXR5cGVzLW5vdGF0aW9uIj4KKyAgICAgICAgPHRpdGxlPk5vdGF0aW9uIGluIHRoaXMgZG9jdW1lbnQ8L3RpdGxlPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBUaGlzIGRvY3VtZW50IHVzZXMgYSBzaW1wbGUgcHNldWRvLUlETCB0byBkZXNjcmliZSBwYXJ0aWN1bGFyIG1ldGhvZAorICAgICAgICAgIGNhbGxzIGFuZCBzaWduYWxzLiBIZXJlIGlzIGFuIGV4YW1wbGUgb2YgYSBtZXRob2QgY2FsbDoKKyAgICAgICAgICA8cHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICBvcmcuZnJlZWRlc2t0b3AuREJ1cy5TdGFydFNlcnZpY2VCeU5hbWUgKGluIFNUUklORyBuYW1lLCBpbiBVSU5UMzIgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dCBVSU5UMzIgcmVzdWx0Y29kZSkKKyAgICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgIFRoaXMgbWVhbnMgPGxpdGVyYWw+SU5URVJGQUNFPC9saXRlcmFsPiA9IG9yZy5mcmVlZGVza3RvcC5EQnVzLCA8bGl0ZXJhbD5NRU1CRVI8L2xpdGVyYWw+ID0gU3RhcnRTZXJ2aWNlQnlOYW1lLAorICAgICAgICAgIDxsaXRlcmFsPk1FVEhPRF9DQUxMPC9saXRlcmFsPiBhcmd1bWVudHMgYXJlIDxsaXRlcmFsPlNUUklORzwvbGl0ZXJhbD4gYW5kIDxsaXRlcmFsPlVJTlQzMjwvbGl0ZXJhbD4sIDxsaXRlcmFsPk1FVEhPRF9SRVRVUk48L2xpdGVyYWw+IGFyZ3VtZW50CisgICAgICAgICAgaXMgPGxpdGVyYWw+VUlOVDMyPC9saXRlcmFsPi4gUmVtZW1iZXIgdGhhdCB0aGUgPGxpdGVyYWw+TUVNQkVSPC9saXRlcmFsPiBmaWVsZCBjYW4ndCBjb250YWluIGFueSAnLicgKHBlcmlvZCkKKyAgICAgICAgICBjaGFyYWN0ZXJzIHNvIGl0J3Mga25vd24gdGhhdCB0aGUgbGFzdCBwYXJ0IG9mIHRoZSBuYW1lIGluCisgICAgICAgICAgdGhlICJJREwiIGlzIHRoZSBtZW1iZXIgbmFtZS4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBJbiBDKysgdGhhdCBtaWdodCBlbmQgdXAgbG9va2luZyBsaWtlIHRoaXM6CisgICAgICAgICAgPHByb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgdW5zaWduZWQgaW50IG9yZzo6ZnJlZWRlc2t0b3A6OkRCdXM6OlN0YXJ0U2VydmljZUJ5TmFtZSAoY29uc3QgY2hhciAgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MpOworICAgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgb3IgZXF1YWxseSB2YWxpZCwgdGhlIHJldHVybiB2YWx1ZSBjb3VsZCBiZSBkb25lIGFzIGFuIGFyZ3VtZW50OgorICAgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIHZvaWQgb3JnOjpmcmVlZGVza3RvcDo6REJ1czo6U3RhcnRTZXJ2aWNlQnlOYW1lIChjb25zdCBjaGFyICAgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKnJlc3VsdGNvZGUpOworICAgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgSXQncyByZWFsbHkgdXAgdG8gdGhlIEFQSSBkZXNpZ25lciBob3cgdGhleSB3YW50IHRvIG1ha2UKKyAgICAgICAgICB0aGlzIGxvb2suIFlvdSBjb3VsZCBkZXNpZ24gYW4gQVBJIHdoZXJlIHRoZSBuYW1lc3BhY2Ugd2Fzbid0IHVzZWQKKyAgICAgICAgICBpbiBDKyssIHVzaW5nIFNUTCBvciBRdCwgdXNpbmcgdmFyYXJncywgb3Igd2hhdGV2ZXIgeW91IHdhbnRlZC4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBTaWduYWxzIGFyZSB3cml0dGVuIGFzIGZvbGxvd3M6CisgICAgICAgICAgPHByb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgb3JnLmZyZWVkZXNrdG9wLkRCdXMuTmFtZUxvc3QgKFNUUklORyBuYW1lKQorICAgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgU2lnbmFscyBkb24ndCBzcGVjaWZ5ICJpbiIgdnMuICJvdXQiIGJlY2F1c2Ugb25seQorICAgICAgICAgIGEgc2luZ2xlIGRpcmVjdGlvbiBpcyBwb3NzaWJsZS4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBJdCBpc24ndCBlc3BlY2lhbGx5IGVuY291cmFnZWQgdG8gdXNlIHRoaXMgbGFtZSBwc2V1ZG8tSURMIGluIGFjdHVhbAorICAgICAgICAgIEFQSSBpbXBsZW1lbnRhdGlvbnM7IHlvdSBtaWdodCB1c2UgdGhlIG5hdGl2ZSBub3RhdGlvbiBmb3IgdGhlCisgICAgICAgICAgbGFuZ3VhZ2UgeW91J3JlIHVzaW5nLCBvciB5b3UgbWlnaHQgdXNlIENPTSBvciBDT1JCQSBJREwsIGZvciBleGFtcGxlLgorICAgICAgICA8L3BhcmE+CisgICAgICA8L3NlY3QzPgorICAgIDwvc2VjdDI+CisKKyAgICA8c2VjdDIgaWQ9Im1lc3NhZ2UtcHJvdG9jb2wtaGFuZGxpbmctaW52YWxpZCI+CisgICAgICA8dGl0bGU+SW52YWxpZCBQcm90b2NvbCBhbmQgU3BlYyBFeHRlbnNpb25zPC90aXRsZT4KKworICAgICAgPHBhcmE+CisgICAgICAgIEZvciBzZWN1cml0eSByZWFzb25zLCB0aGUgRC1CdXMgcHJvdG9jb2wgc2hvdWxkIGJlIHN0cmljdGx5IHBhcnNlZCBhbmQKKyAgICAgICAgdmFsaWRhdGVkLCB3aXRoIHRoZSBleGNlcHRpb24gb2YgZGVmaW5lZCBleHRlbnNpb24gcG9pbnRzLiBBbnkgaW52YWxpZAorICAgICAgICBwcm90b2NvbCBvciBzcGVjIHZpb2xhdGlvbnMgc2hvdWxkIHJlc3VsdCBpbiBpbW1lZGlhdGVseSBkcm9wcGluZyB0aGUKKyAgICAgICAgY29ubmVjdGlvbiB3aXRob3V0IG5vdGljZSB0byB0aGUgb3RoZXIgZW5kLiBFeGNlcHRpb25zIHNob3VsZCBiZQorICAgICAgICBjYXJlZnVsbHkgY29uc2lkZXJlZCwgZS5nLiBhbiBleGNlcHRpb24gbWF5IGJlIHdhcnJhbnRlZCBmb3IgYQorICAgICAgICB3ZWxsLXVuZGVyc3Rvb2QgaWRpb3N5bmNyYXN5IG9mIGEgd2lkZWx5LWRlcGxveWVkIGltcGxlbWVudGF0aW9uLiAgSW4KKyAgICAgICAgY2FzZXMgd2hlcmUgdGhlIG90aGVyIGVuZCBvZiBhIGNvbm5lY3Rpb24gaXMgMTAwJSB0cnVzdGVkIGFuZCBrbm93biB0bworICAgICAgICBiZSBmcmllbmRseSwgc2tpcHBpbmcgdmFsaWRhdGlvbiBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucyBjb3VsZCBhbHNvIG1ha2UKKyAgICAgICAgc2Vuc2UgaW4gY2VydGFpbiBjYXNlcy4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIEdlbmVyYWxseSBzcGVha2luZyB2aW9sYXRpb25zIG9mIHRoZSAibXVzdCIgcmVxdWlyZW1lbnRzIGluIHRoaXMgc3BlYworICAgICAgICBzaG91bGQgYmUgY29uc2lkZXJlZCBwb3NzaWJsZSBhdHRlbXB0cyB0byBleHBsb2l0IHNlY3VyaXR5LCBhbmQgdmlvbGF0aW9ucworICAgICAgICBvZiB0aGUgInNob3VsZCIgc3VnZ2VzdGlvbnMgc2hvdWxkIGJlIGNvbnNpZGVyZWQgbGVnaXRpbWF0ZSAodGhvdWdoIHBlcmhhcHMKKyAgICAgICAgdGhleSBzaG91bGQgZ2VuZXJhdGUgYW4gZXJyb3IgaW4gc29tZSBjYXNlcykuCisgICAgICA8L3BhcmE+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBUaGUgZm9sbG93aW5nIGV4dGVuc2lvbiBwb2ludHMgYXJlIGJ1aWx0IGluIHRvIEQtQnVzIG9uIHB1cnBvc2UgYW5kIG11c3QKKyAgICAgICAgbm90IGJlIHRyZWF0ZWQgYXMgaW52YWxpZCBwcm90b2NvbC4gVGhlIGV4dGVuc2lvbiBwb2ludHMgYXJlIGludGVuZGVkCisgICAgICAgIGZvciB1c2UgYnkgZnV0dXJlIHZlcnNpb25zIG9mIHRoaXMgc3BlYywgdGhleSBhcmUgbm90IGludGVuZGVkIGZvciB0aGlyZAorICAgICAgICBwYXJ0aWVzLiAgQXQgdGhlIG1vbWVudCwgdGhlIG9ubHkgd2F5IGEgdGhpcmQgcGFydHkgY291bGQgZXh0ZW5kIEQtQnVzCisgICAgICAgIHdpdGhvdXQgYnJlYWtpbmcgaW50ZXJvcGVyYWJpbGl0eSB3b3VsZCBiZSB0byBpbnRyb2R1Y2UgYSB3YXkgdG8gbmVnb3RpYXRlIG5ldworICAgICAgICBmZWF0dXJlIHN1cHBvcnQgYXMgcGFydCBvZiB0aGUgYXV0aCBwcm90b2NvbCwgdXNpbmcgRVhURU5TSU9OXy1wcmVmaXhlZAorICAgICAgICBjb21tYW5kcy4gVGhlcmUgaXMgbm90IHlldCBhIHN0YW5kYXJkIHdheSB0byBuZWdvdGlhdGUgZmVhdHVyZXMuCisgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgIEluIHRoZSBhdXRoZW50aWNhdGlvbiBwcm90b2NvbCAoc2VlIDx4cmVmIGxpbmtlbmQ9ImF1dGgtcHJvdG9jb2wiLz4pIHVua25vd24KKyAgICAgICAgICAgICAgICBjb21tYW5kcyByZXN1bHQgaW4gYW4gRVJST1IgcmF0aGVyIHRoYW4gYSBkaXNjb25uZWN0LiBUaGlzIGVuYWJsZXMKKyAgICAgICAgICAgICAgICBmdXR1cmUgZXh0ZW5zaW9ucyB0byB0aGUgcHJvdG9jb2wuIENvbW1hbmRzIHN0YXJ0aW5nIHdpdGggRVhURU5TSU9OXyBhcmUKKyAgICAgICAgICAgICAgICByZXNlcnZlZCBmb3IgdGhpcmQgcGFydGllcy4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICBUaGUgYXV0aGVudGljYXRpb24gcHJvdG9jb2wgc3VwcG9ydHMgcGx1Z2dhYmxlIGF1dGggbWVjaGFuaXNtcy4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICBUaGUgYWRkcmVzcyBmb3JtYXQgKHNlZSA8eHJlZiBsaW5rZW5kPSJhZGRyZXNzZXMiLz4pIHN1cHBvcnRzIG5ldworICAgICAgICAgICAgICBraW5kcyBvZiB0cmFuc3BvcnQuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgTWVzc2FnZXMgd2l0aCBhbiB1bmtub3duIHR5cGUgKHNvbWV0aGluZyBvdGhlciB0aGFuCisgICAgICAgICAgICAgIDxsaXRlcmFsPk1FVEhPRF9DQUxMPC9saXRlcmFsPiwgPGxpdGVyYWw+TUVUSE9EX1JFVFVSTjwvbGl0ZXJhbD4sCisgICAgICAgICAgICAgIDxsaXRlcmFsPkVSUk9SPC9saXRlcmFsPiwgPGxpdGVyYWw+U0lHTkFMPC9saXRlcmFsPikgYXJlIGlnbm9yZWQuCisgICAgICAgICAgICAgIFVua25vd24tdHlwZSBtZXNzYWdlcyBtdXN0IHN0aWxsIGJlIHdlbGwtZm9ybWVkIGluIHRoZSBzYW1lIHdheQorICAgICAgICAgICAgICBhcyB0aGUga25vd24gbWVzc2FnZXMsIGhvd2V2ZXIuIFRoZXkgc3RpbGwgaGF2ZSB0aGUgbm9ybWFsCisgICAgICAgICAgICAgIGhlYWRlciBhbmQgYm9keS4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICBIZWFkZXIgZmllbGRzIHdpdGggYW4gdW5rbm93biBvciB1bmV4cGVjdGVkIGZpZWxkIGNvZGUgbXVzdCBiZSBpZ25vcmVkLAorICAgICAgICAgICAgICB0aG91Z2ggYWdhaW4gdGhleSBtdXN0IHN0aWxsIGJlIHdlbGwtZm9ybWVkLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgIE5ldyBzdGFuZGFyZCBpbnRlcmZhY2VzICh3aXRoIG5ldyBtZXRob2RzIGFuZCBzaWduYWxzKSBjYW4gb2YgY291cnNlIGJlIGFkZGVkLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgPC9wYXJhPgorCisgICAgPC9zZWN0Mj4KKworICA8L3NlY3QxPgorCisgIDxzZWN0MSBpZD0iYXV0aC1wcm90b2NvbCI+CisgICAgPHRpdGxlPkF1dGhlbnRpY2F0aW9uIFByb3RvY29sPC90aXRsZT4KKyAgICA8cGFyYT4KKyAgICAgIEJlZm9yZSB0aGUgZmxvdyBvZiBtZXNzYWdlcyBiZWdpbnMsIHR3byBhcHBsaWNhdGlvbnMgbXVzdAorICAgICAgYXV0aGVudGljYXRlLiBBIHNpbXBsZSBwbGFpbi10ZXh0IHByb3RvY29sIGlzIHVzZWQgZm9yCisgICAgICBhdXRoZW50aWNhdGlvbjsgdGhpcyBwcm90b2NvbCBpcyBhIFNBU0wgcHJvZmlsZSwgYW5kIG1hcHMgZmFpcmx5CisgICAgICBkaXJlY3RseSBmcm9tIHRoZSBTQVNMIHNwZWNpZmljYXRpb24uIFRoZSBtZXNzYWdlIGVuY29kaW5nIGlzCisgICAgICBOT1QgdXNlZCBoZXJlLCBvbmx5IHBsYWluIHRleHQgbWVzc2FnZXMuCisgICAgPC9wYXJhPgorICAgIDxwYXJhPgorICAgICAgSW4gZXhhbXBsZXMsICJDOiIgYW5kICJTOiIgaW5kaWNhdGUgbGluZXMgc2VudCBieSB0aGUgY2xpZW50IGFuZAorICAgICAgc2VydmVyIHJlc3BlY3RpdmVseS4KKyAgICA8L3BhcmE+CisgICAgPHNlY3QyIGlkPSJhdXRoLXByb3RvY29sLW92ZXJ2aWV3Ij4KKyAgICAgIDx0aXRsZT5Qcm90b2NvbCBPdmVydmlldzwvdGl0bGU+CisgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIHByb3RvY29sIGlzIGEgbGluZS1iYXNlZCBwcm90b2NvbCwgd2hlcmUgZWFjaCBsaW5lIGVuZHMgd2l0aAorICAgICAgICBcclxuLiBFYWNoIGxpbmUgYmVnaW5zIHdpdGggYW4gYWxsLWNhcHMgQVNDSUkgY29tbWFuZCBuYW1lIGNvbnRhaW5pbmcKKyAgICAgICAgb25seSB0aGUgY2hhcmFjdGVyIHJhbmdlIFtBLVpfXSwgYSBzcGFjZSwgdGhlbiBhbnkgYXJndW1lbnRzIGZvciB0aGUKKyAgICAgICAgY29tbWFuZCwgdGhlbiB0aGUgXHJcbiBlbmRpbmcgdGhlIGxpbmUuIFRoZSBwcm90b2NvbCBpcworICAgICAgICBjYXNlLXNlbnNpdGl2ZS4gQWxsIGJ5dGVzIG11c3QgYmUgaW4gdGhlIEFTQ0lJIGNoYXJhY3RlciBzZXQuCisKKyAgICAgICAgQ29tbWFuZHMgZnJvbSB0aGUgY2xpZW50IHRvIHRoZSBzZXJ2ZXIgYXJlIGFzIGZvbGxvd3M6CisKKyAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+QVVUSCBbbWVjaGFuaXNtXSBbaW5pdGlhbC1yZXNwb25zZV08L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+Q0FOQ0VMPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPkJFR0lOPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPkRBVEEgJmx0O2RhdGEgaW4gaGV4IGVuY29kaW5nJmd0OzwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT5FUlJPUiBbaHVtYW4tcmVhZGFibGUgZXJyb3IgZXhwbGFuYXRpb25dPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPk5FR09USUFURV9VTklYX0ZEPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorCisgICAgICAgIEZyb20gc2VydmVyIHRvIGNsaWVudCBhcmUgYXMgZm9sbG93czoKKworICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT5SRUpFQ1RFRCAmbHQ7c3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgbWVjaGFuaXNtIG5hbWVzJmd0OzwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT5PSyAmbHQ7R1VJRCBpbiBoZXgmZ3Q7PC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPkRBVEEgJmx0O2RhdGEgaW4gaGV4IGVuY29kaW5nJmd0OzwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT5FUlJPUjwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT5BR1JFRV9VTklYX0ZEPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIFVub2ZmaWNpYWwgZXh0ZW5zaW9ucyB0byB0aGUgY29tbWFuZCBzZXQgbXVzdCBiZWdpbiB3aXRoIHRoZSBsZXR0ZXJzCisgICAgICAgICJFWFRFTlNJT05fIiwgdG8gYXZvaWQgY29uZmxpY3RzIHdpdGggZnV0dXJlIG9mZmljaWFsIGNvbW1hbmRzLgorICAgICAgICBGb3IgZXhhbXBsZSwgIkVYVEVOU0lPTl9DT01fTVlET01BSU5fRE9fU1RVRkYiLgorICAgICAgPC9wYXJhPgorICAgIDwvc2VjdDI+CisgICAgPHNlY3QyIGlkPSJhdXRoLW51bC1ieXRlIj4KKyAgICAgIDx0aXRsZT5TcGVjaWFsIGNyZWRlbnRpYWxzLXBhc3NpbmcgbnVsIGJ5dGU8L3RpdGxlPgorICAgICAgPHBhcmE+CisgICAgICAgIEltbWVkaWF0ZWx5IGFmdGVyIGNvbm5lY3RpbmcgdG8gdGhlIHNlcnZlciwgdGhlIGNsaWVudCBtdXN0IHNlbmQgYQorICAgICAgICBzaW5nbGUgbnVsIGJ5dGUuIFRoaXMgYnl0ZSBtYXkgYmUgYWNjb21wYW5pZWQgYnkgY3JlZGVudGlhbHMKKyAgICAgICAgaW5mb3JtYXRpb24gb24gc29tZSBvcGVyYXRpbmcgc3lzdGVtcyB0aGF0IHVzZSBzZW5kbXNnKCkgd2l0aAorICAgICAgICBTQ01fQ1JFRFMgb3IgU0NNX0NSRURFTlRJQUxTIHRvIHBhc3MgY3JlZGVudGlhbHMgb3ZlciBVTklYIGRvbWFpbgorICAgICAgICBzb2NrZXRzLiBIb3dldmVyLCB0aGUgbnVsIGJ5dGUgbXVzdCBiZSBzZW50IGV2ZW4gb24gb3RoZXIga2luZHMgb2YKKyAgICAgICAgc29ja2V0LCBhbmQgZXZlbiBvbiBvcGVyYXRpbmcgc3lzdGVtcyB0aGF0IGRvIG5vdCByZXF1aXJlIGEgYnl0ZSB0byBiZQorICAgICAgICBzZW50IGluIG9yZGVyIHRvIHRyYW5zbWl0IGNyZWRlbnRpYWxzLiBUaGUgdGV4dCBwcm90b2NvbCBkZXNjcmliZWQgaW4KKyAgICAgICAgdGhpcyBkb2N1bWVudCBiZWdpbnMgYWZ0ZXIgdGhlIHNpbmdsZSBudWwgYnl0ZS4gSWYgdGhlIGZpcnN0IGJ5dGUKKyAgICAgICAgcmVjZWl2ZWQgZnJvbSB0aGUgY2xpZW50IGlzIG5vdCBhIG51bCBieXRlLCB0aGUgc2VydmVyIG1heSBkaXNjb25uZWN0CisgICAgICAgIHRoYXQgY2xpZW50LgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIEEgbnVsIGJ5dGUgaW4gYW55IGNvbnRleHQgb3RoZXIgdGhhbiB0aGUgaW5pdGlhbCBieXRlIGlzIGFuIGVycm9yOworICAgICAgICB0aGUgcHJvdG9jb2wgaXMgQVNDSUktb25seS4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBUaGUgY3JlZGVudGlhbHMgc2VudCBhbG9uZyB3aXRoIHRoZSBudWwgYnl0ZSBtYXkgYmUgdXNlZCB3aXRoIHRoZQorICAgICAgICBTQVNMIG1lY2hhbmlzbSBFWFRFUk5BTC4KKyAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3QyPgorICAgIDxzZWN0MiBpZD0iYXV0aC1jb21tYW5kLWF1dGgiPgorICAgICAgPHRpdGxlPkFVVEggY29tbWFuZDwvdGl0bGU+CisgICAgICA8cGFyYT4KKyAgICAgICAgSWYgYW4gQVVUSCBjb21tYW5kIGhhcyBubyBhcmd1bWVudHMsIGl0IGlzIGEgcmVxdWVzdCB0byBsaXN0CisgICAgICAgIGF2YWlsYWJsZSBtZWNoYW5pc21zLiBUaGUgc2VydmVyIG11c3QgcmVzcG9uZCB3aXRoIGEgUkVKRUNURUQKKyAgICAgICAgY29tbWFuZCBsaXN0aW5nIHRoZSBtZWNoYW5pc21zIGl0IHVuZGVyc3RhbmRzLCBvciB3aXRoIGFuIGVycm9yLgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIElmIGFuIEFVVEggY29tbWFuZCBzcGVjaWZpZXMgYSBtZWNoYW5pc20sIGFuZCB0aGUgc2VydmVyIHN1cHBvcnRzCisgICAgICAgIHNhaWQgbWVjaGFuaXNtLCB0aGUgc2VydmVyIHNob3VsZCBiZWdpbiBleGNoYW5naW5nIFNBU0wKKyAgICAgICAgY2hhbGxlbmdlLXJlc3BvbnNlIGRhdGEgd2l0aCB0aGUgY2xpZW50IHVzaW5nIERBVEEgY29tbWFuZHMuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgSWYgdGhlIHNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IHRoZSBtZWNoYW5pc20gZ2l2ZW4gaW4gdGhlIEFVVEgKKyAgICAgICAgY29tbWFuZCwgaXQgbXVzdCBzZW5kIGVpdGhlciBhIFJFSkVDVEVEIGNvbW1hbmQgbGlzdGluZyB0aGUgbWVjaGFuaXNtcworICAgICAgICBpdCBkb2VzIHN1cHBvcnQsIG9yIGFuIGVycm9yLgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIElmIHRoZSBbaW5pdGlhbC1yZXNwb25zZV0gYXJndW1lbnQgaXMgcHJvdmlkZWQsIGl0IGlzIGludGVuZGVkIGZvciB1c2UKKyAgICAgICAgd2l0aCBtZWNoYW5pc21zIHRoYXQgaGF2ZSBubyBpbml0aWFsIGNoYWxsZW5nZSAob3IgYW4gZW1wdHkgaW5pdGlhbAorICAgICAgICBjaGFsbGVuZ2UpLCBhcyBpZiBpdCB3ZXJlIHRoZSBhcmd1bWVudCB0byBhbiBpbml0aWFsIERBVEEgY29tbWFuZC4gSWYKKyAgICAgICAgdGhlIHNlbGVjdGVkIG1lY2hhbmlzbSBoYXMgYW4gaW5pdGlhbCBjaGFsbGVuZ2UgYW5kIFtpbml0aWFsLXJlc3BvbnNlXQorICAgICAgICB3YXMgcHJvdmlkZWQsIHRoZSBzZXJ2ZXIgc2hvdWxkIHJlamVjdCBhdXRoZW50aWNhdGlvbiBieSBzZW5kaW5nCisgICAgICAgIFJFSkVDVEVELgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIElmIGF1dGhlbnRpY2F0aW9uIHN1Y2NlZWRzIGFmdGVyIGV4Y2hhbmdpbmcgREFUQSBjb21tYW5kcywKKyAgICAgICAgYW4gT0sgY29tbWFuZCBtdXN0IGJlIHNlbnQgdG8gdGhlIGNsaWVudC4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBUaGUgZmlyc3Qgb2N0ZXQgcmVjZWl2ZWQgYnkgdGhlIHNlcnZlciBhZnRlciB0aGUgXHJcbiBvZiB0aGUgQkVHSU4KKyAgICAgICAgY29tbWFuZCBmcm9tIHRoZSBjbGllbnQgbXVzdCBiZSB0aGUgZmlyc3Qgb2N0ZXQgb2YgdGhlCisgICAgICAgIGF1dGhlbnRpY2F0ZWQvZW5jcnlwdGVkIHN0cmVhbSBvZiBELUJ1cyBtZXNzYWdlcy4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBJZiBCRUdJTiBpcyByZWNlaXZlZCBieSB0aGUgc2VydmVyLCB0aGUgZmlyc3Qgb2N0ZXQgcmVjZWl2ZWQKKyAgICAgICAgYnkgdGhlIGNsaWVudCBhZnRlciB0aGUgXHJcbiBvZiB0aGUgT0sgY29tbWFuZCBtdXN0IGJlIHRoZQorICAgICAgICBmaXJzdCBvY3RldCBvZiB0aGUgYXV0aGVudGljYXRlZC9lbmNyeXB0ZWQgc3RyZWFtIG9mIEQtQnVzCisgICAgICAgIG1lc3NhZ2VzLgorICAgICAgPC9wYXJhPgorICAgIDwvc2VjdDI+CisgICAgPHNlY3QyIGlkPSJhdXRoLWNvbW1hbmQtY2FuY2VsIj4KKyAgICAgIDx0aXRsZT5DQU5DRUwgQ29tbWFuZDwvdGl0bGU+CisgICAgICA8cGFyYT4KKyAgICAgICAgQXQgYW55IHRpbWUgdXAgdG8gc2VuZGluZyB0aGUgQkVHSU4gY29tbWFuZCwgdGhlIGNsaWVudCBtYXkgc2VuZCBhCisgICAgICAgIENBTkNFTCBjb21tYW5kLiBPbiByZWNlaXZpbmcgdGhlIENBTkNFTCBjb21tYW5kLCB0aGUgc2VydmVyIG11c3QKKyAgICAgICAgc2VuZCBhIFJFSkVDVEVEIGNvbW1hbmQgYW5kIGFib3J0IHRoZSBjdXJyZW50IGF1dGhlbnRpY2F0aW9uCisgICAgICAgIGV4Y2hhbmdlLgorICAgICAgPC9wYXJhPgorICAgIDwvc2VjdDI+CisgICAgPHNlY3QyIGlkPSJhdXRoLWNvbW1hbmQtZGF0YSI+CisgICAgICA8dGl0bGU+REFUQSBDb21tYW5kPC90aXRsZT4KKyAgICAgIDxwYXJhPgorICAgICAgICBUaGUgREFUQSBjb21tYW5kIG1heSBjb21lIGZyb20gZWl0aGVyIGNsaWVudCBvciBzZXJ2ZXIsIGFuZCBzaW1wbHkKKyAgICAgICAgY29udGFpbnMgYSBoZXgtZW5jb2RlZCBibG9jayBvZiBkYXRhIHRvIGJlIGludGVycHJldGVkCisgICAgICAgIGFjY29yZGluZyB0byB0aGUgU0FTTCBtZWNoYW5pc20gaW4gdXNlLgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIFNvbWUgU0FTTCBtZWNoYW5pc21zIHN1cHBvcnQgc2VuZGluZyBhbiAiZW1wdHkgc3RyaW5nIjsKKyAgICAgICAgRklYTUUgd2UgbmVlZCBzb21lIHdheSB0byBkbyB0aGlzLgorICAgICAgPC9wYXJhPgorICAgIDwvc2VjdDI+CisgICAgPHNlY3QyIGlkPSJhdXRoLWNvbW1hbmQtYmVnaW4iPgorICAgICAgPHRpdGxlPkJFR0lOIENvbW1hbmQ8L3RpdGxlPgorICAgICAgPHBhcmE+CisgICAgICAgIFRoZSBCRUdJTiBjb21tYW5kIGFja25vd2xlZGdlcyB0aGF0IHRoZSBjbGllbnQgaGFzIHJlY2VpdmVkIGFuCisgICAgICAgIE9LIGNvbW1hbmQgZnJvbSB0aGUgc2VydmVyLCBhbmQgdGhhdCB0aGUgc3RyZWFtIG9mIG1lc3NhZ2VzCisgICAgICAgIGlzIGFib3V0IHRvIGJlZ2luLgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIFRoZSBmaXJzdCBvY3RldCByZWNlaXZlZCBieSB0aGUgc2VydmVyIGFmdGVyIHRoZSBcclxuIG9mIHRoZSBCRUdJTgorICAgICAgICBjb21tYW5kIGZyb20gdGhlIGNsaWVudCBtdXN0IGJlIHRoZSBmaXJzdCBvY3RldCBvZiB0aGUKKyAgICAgICAgYXV0aGVudGljYXRlZC9lbmNyeXB0ZWQgc3RyZWFtIG9mIEQtQnVzIG1lc3NhZ2VzLgorICAgICAgPC9wYXJhPgorICAgIDwvc2VjdDI+CisgICAgPHNlY3QyIGlkPSJhdXRoLWNvbW1hbmQtcmVqZWN0ZWQiPgorICAgICAgPHRpdGxlPlJFSkVDVEVEIENvbW1hbmQ8L3RpdGxlPgorICAgICAgPHBhcmE+CisgICAgICAgIFRoZSBSRUpFQ1RFRCBjb21tYW5kIGluZGljYXRlcyB0aGF0IHRoZSBjdXJyZW50IGF1dGhlbnRpY2F0aW9uCisgICAgICAgIGV4Y2hhbmdlIGhhcyBmYWlsZWQsIGFuZCBmdXJ0aGVyIGV4Y2hhbmdlIG9mIERBVEEgaXMgaW5hcHByb3ByaWF0ZS4KKyAgICAgICAgVGhlIGNsaWVudCB3b3VsZCBub3JtYWxseSB0cnkgYW5vdGhlciBtZWNoYW5pc20sIG9yIHRyeSBwcm92aWRpbmcKKyAgICAgICAgZGlmZmVyZW50IHJlc3BvbnNlcyB0byBjaGFsbGVuZ2VzLgorICAgICAgPC9wYXJhPjxwYXJhPgorICAgICAgICBPcHRpb25hbGx5LCB0aGUgUkVKRUNURUQgY29tbWFuZCBoYXMgYSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZgorICAgICAgICBhdmFpbGFibGUgYXV0aCBtZWNoYW5pc21zIGFzIGFyZ3VtZW50cy4gSWYgYSBzZXJ2ZXIgZXZlciBwcm92aWRlcworICAgICAgICBhIGxpc3Qgb2Ygc3VwcG9ydGVkIG1lY2hhbmlzbXMsIGl0IG11c3QgcHJvdmlkZSB0aGUgc2FtZSBsaXN0CisgICAgICAgIGVhY2ggdGltZSBpdCBzZW5kcyBhIFJFSkVDVEVEIG1lc3NhZ2UuIENsaWVudHMgYXJlIGZyZWUgdG8KKyAgICAgICAgaWdub3JlIGFsbCBsaXN0cyByZWNlaXZlZCBhZnRlciB0aGUgZmlyc3QuCisgICAgICA8L3BhcmE+CisgICAgPC9zZWN0Mj4KKyAgICA8c2VjdDIgaWQ9ImF1dGgtY29tbWFuZC1vayI+CisgICAgICA8dGl0bGU+T0sgQ29tbWFuZDwvdGl0bGU+CisgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIE9LIGNvbW1hbmQgaW5kaWNhdGVzIHRoYXQgdGhlIGNsaWVudCBoYXMgYmVlbgorICAgICAgICBhdXRoZW50aWNhdGVkLiBUaGUgY2xpZW50IG1heSBub3cgcHJvY2VlZCB3aXRoIG5lZ290aWF0aW5nCisgICAgICAgIFVuaXggZmlsZSBkZXNjcmlwdG9yIHBhc3NpbmcuIFRvIGRvIHRoYXQgaXQgc2hhbGwgc2VuZAorICAgICAgICBORUdPVElBVEVfVU5JWF9GRCB0byB0aGUgc2VydmVyLgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIE90aGVyd2lzZSwgdGhlIGNsaWVudCBtdXN0IHJlc3BvbmQgdG8gdGhlIE9LIGNvbW1hbmQgYnkKKyAgICAgICAgc2VuZGluZyBhIEJFR0lOIGNvbW1hbmQsIGZvbGxvd2VkIGJ5IGl0cyBzdHJlYW0gb2YgbWVzc2FnZXMsCisgICAgICAgIG9yIGJ5IGRpc2Nvbm5lY3RpbmcuICBUaGUgc2VydmVyIG11c3Qgbm90IGFjY2VwdCBhZGRpdGlvbmFsCisgICAgICAgIGNvbW1hbmRzIHVzaW5nIHRoaXMgcHJvdG9jb2wgYWZ0ZXIgdGhlIEJFR0lOIGNvbW1hbmQgaGFzIGJlZW4KKyAgICAgICAgcmVjZWl2ZWQuIEZ1cnRoZXIgY29tbXVuaWNhdGlvbiB3aWxsIGJlIGEgc3RyZWFtIG9mIEQtQnVzCisgICAgICAgIG1lc3NhZ2VzIChvcHRpb25hbGx5IGVuY3J5cHRlZCwgYXMgbmVnb3RpYXRlZCkgcmF0aGVyIHRoYW4KKyAgICAgICAgdGhpcyBwcm90b2NvbC4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBJZiBhIGNsaWVudCBzZW5kcyBCRUdJTiB0aGUgZmlyc3Qgb2N0ZXQgcmVjZWl2ZWQgYnkgdGhlIGNsaWVudAorICAgICAgICBhZnRlciB0aGUgXHJcbiBvZiB0aGUgT0sgY29tbWFuZCBtdXN0IGJlIHRoZSBmaXJzdCBvY3RldCBvZgorICAgICAgICB0aGUgYXV0aGVudGljYXRlZC9lbmNyeXB0ZWQgc3RyZWFtIG9mIEQtQnVzIG1lc3NhZ2VzLgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIFRoZSBPSyBjb21tYW5kIGhhcyBvbmUgYXJndW1lbnQsIHdoaWNoIGlzIHRoZSBHVUlEIG9mIHRoZSBzZXJ2ZXIuCisgICAgICAgIFNlZSA8eHJlZiBsaW5rZW5kPSJhZGRyZXNzZXMiLz4gZm9yIG1vcmUgb24gc2VydmVyIEdVSURzLgorICAgICAgPC9wYXJhPgorICAgIDwvc2VjdDI+CisgICAgPHNlY3QyIGlkPSJhdXRoLWNvbW1hbmQtZXJyb3IiPgorICAgICAgPHRpdGxlPkVSUk9SIENvbW1hbmQ8L3RpdGxlPgorICAgICAgPHBhcmE+CisgICAgICAgIFRoZSBFUlJPUiBjb21tYW5kIGluZGljYXRlcyB0aGF0IGVpdGhlciBzZXJ2ZXIgb3IgY2xpZW50IGRpZCBub3QKKyAgICAgICAga25vdyBhIGNvbW1hbmQsIGRvZXMgbm90IGFjY2VwdCB0aGUgZ2l2ZW4gY29tbWFuZCBpbiB0aGUgY3VycmVudAorICAgICAgICBjb250ZXh0LCBvciBkaWQgbm90IHVuZGVyc3RhbmQgdGhlIGFyZ3VtZW50cyB0byB0aGUgY29tbWFuZC4gVGhpcworICAgICAgICBhbGxvd3MgdGhlIHByb3RvY29sIHRvIGJlIGV4dGVuZGVkOyBhIGNsaWVudCBvciBzZXJ2ZXIgY2FuIHNlbmQgYQorICAgICAgICBjb21tYW5kIHByZXNlbnQgb3IgcGVybWl0dGVkIG9ubHkgaW4gbmV3IHByb3RvY29sIHZlcnNpb25zLCBhbmQgaWYKKyAgICAgICAgYW4gRVJST1IgaXMgcmVjZWl2ZWQgaW5zdGVhZCBvZiBhbiBhcHByb3ByaWF0ZSByZXNwb25zZSwgZmFsbCBiYWNrCisgICAgICAgIHRvIHVzaW5nIHNvbWUgb3RoZXIgdGVjaG5pcXVlLgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIElmIGFuIEVSUk9SIGlzIHNlbnQsIHRoZSBzZXJ2ZXIgb3IgY2xpZW50IHRoYXQgc2VudCB0aGUKKyAgICAgICAgZXJyb3IgbXVzdCBjb250aW51ZSBhcyBpZiB0aGUgY29tbWFuZCBjYXVzaW5nIHRoZSBFUlJPUiBoYWQgbmV2ZXIgYmVlbgorICAgICAgICByZWNlaXZlZC4gSG93ZXZlciwgdGhlIHRoZSBzZXJ2ZXIgb3IgY2xpZW50IHJlY2VpdmluZyB0aGUgZXJyb3IKKyAgICAgICAgc2hvdWxkIHRyeSBzb21ldGhpbmcgb3RoZXIgdGhhbiB3aGF0ZXZlciBjYXVzZWQgdGhlIGVycm9yOworICAgICAgICBpZiBvbmx5IGNhbmNlbGluZy9yZWplY3RpbmcgdGhlIGF1dGhlbnRpY2F0aW9uLgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIElmIHRoZSBELUJ1cyBwcm90b2NvbCBjaGFuZ2VzIGluY29tcGF0aWJseSBhdCBzb21lIGZ1dHVyZSB0aW1lLAorICAgICAgICBhcHBsaWNhdGlvbnMgaW1wbGVtZW50aW5nIHRoZSBuZXcgcHJvdG9jb2wgd291bGQgcHJvYmFibHkgYmUgYWJsZSB0bworICAgICAgICBjaGVjayBmb3Igc3VwcG9ydCBvZiB0aGUgbmV3IHByb3RvY29sIGJ5IHNlbmRpbmcgYSBuZXcgY29tbWFuZCBhbmQKKyAgICAgICAgcmVjZWl2aW5nIGFuIEVSUk9SIGZyb20gYXBwbGljYXRpb25zIHRoYXQgZG9uJ3QgdW5kZXJzdGFuZCBpdC4gVGh1cyB0aGUKKyAgICAgICAgRVJST1IgZmVhdHVyZSBvZiB0aGUgYXV0aCBwcm90b2NvbCBpcyBhbiBlc2NhcGUgaGF0Y2ggdGhhdCBsZXRzIHVzCisgICAgICAgIG5lZ290aWF0ZSBleHRlbnNpb25zIG9yIGNoYW5nZXMgdG8gdGhlIEQtQnVzIHByb3RvY29sIGluIHRoZSBmdXR1cmUuCisgICAgICA8L3BhcmE+CisgICAgPC9zZWN0Mj4KKyAgICA8c2VjdDIgaWQ9ImF1dGgtY29tbWFuZC1uZWdvdGlhdGUtdW5peC1mZCI+CisgICAgICA8dGl0bGU+TkVHT1RJQVRFX1VOSVhfRkQgQ29tbWFuZDwvdGl0bGU+CisgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIE5FR09USUFURV9VTklYX0ZEIGNvbW1hbmQgaW5kaWNhdGVzIHRoYXQgdGhlIGNsaWVudAorICAgICAgICBzdXBwb3J0cyBVbml4IGZpbGUgZGVzY3JpcHRvciBwYXNzaW5nLiBUaGlzIGNvbW1hbmQgbWF5IG9ubHkKKyAgICAgICAgYmUgc2VudCBhZnRlciB0aGUgY29ubmVjdGlvbiBpcyBhdXRoZW50aWNhdGVkLCBpLmUuIGFmdGVyIE9LCisgICAgICAgIHdhcyByZWNlaXZlZCBieSB0aGUgY2xpZW50LiBUaGlzIGNvbW1hbmQgbWF5IG9ubHkgYmUgc2VudCBvbgorICAgICAgICB0cmFuc3BvcnRzIHRoYXQgc3VwcG9ydCBVbml4IGZpbGUgZGVzY3JpcHRvciBwYXNzaW5nLgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIE9uIHJlY2VpdmluZyBORUdPVElBVEVfVU5JWF9GRCB0aGUgc2VydmVyIG11c3QgcmVzcG9uZCB3aXRoCisgICAgICAgIGVpdGhlciBBR1JFRV9VTklYX0ZEIG9yIEVSUk9SLiBJdCBzaGFsbCByZXNwb25kIHRoZSBmb3JtZXIgaWYKKyAgICAgICAgdGhlIHRyYW5zcG9ydCBjaG9zZW4gc3VwcG9ydHMgVW5peCBmaWxlIGRlc2NyaXB0b3IgcGFzc2luZyBhbmQKKyAgICAgICAgdGhlIHNlcnZlciBzdXBwb3J0cyB0aGlzIGZlYXR1cmUuIEl0IHNoYWxsIHJlc3BvbmQgdGhlIGxhdHRlcgorICAgICAgICBpZiB0aGUgdHJhbnNwb3J0IGRvZXMgbm90IHN1cHBvcnQgVW5peCBmaWxlIGRlc2NyaXB0b3IKKyAgICAgICAgcGFzc2luZywgdGhlIHNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZSwgb3IgdGhlCisgICAgICAgIHNlcnZlciBkZWNpZGVzIG5vdCB0byBlbmFibGUgZmlsZSBkZXNjcmlwdG9yIHBhc3NpbmcgZHVlIHRvCisgICAgICAgIHNlY3VyaXR5IG9yIG90aGVyIHJlYXNvbnMuCisgICAgICA8L3BhcmE+CisgICAgPC9zZWN0Mj4KKyAgICA8c2VjdDIgaWQ9ImF1dGgtY29tbWFuZC1hZ3JlZS11bml4LWZkIj4KKyAgICAgIDx0aXRsZT5BR1JFRV9VTklYX0ZEIENvbW1hbmQ8L3RpdGxlPgorICAgICAgPHBhcmE+CisgICAgICAgIFRoZSBBR1JFRV9VTklYX0ZEIGNvbW1hbmQgaW5kaWNhdGVzIHRoYXQgdGhlIHNlcnZlciBzdXBwb3J0cworICAgICAgICBVbml4IGZpbGUgZGVzY3JpcHRvciBwYXNzaW5nLiBUaGlzIGNvbW1hbmQgbWF5IG9ubHkgYmUgc2VudAorICAgICAgICBhZnRlciB0aGUgY29ubmVjdGlvbiBpcyBhdXRoZW50aWNhdGVkLCBhbmQgdGhlIGNsaWVudCBzZW50CisgICAgICAgIE5FR09USUFURV9VTklYX0ZEIHRvIGVuYWJsZSBVbml4IGZpbGUgZGVzY3JpcHRvciBwYXNzaW5nLiBUaGlzCisgICAgICAgIGNvbW1hbmQgbWF5IG9ubHkgYmUgc2VudCBvbiB0cmFuc3BvcnRzIHRoYXQgc3VwcG9ydCBVbml4IGZpbGUKKyAgICAgICAgZGVzY3JpcHRvciBwYXNzaW5nLgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIE9uIHJlY2VpdmluZyBBR1JFRV9VTklYX0ZEIHRoZSBjbGllbnQgbXVzdCByZXNwb25kIHdpdGggQkVHSU4sCisgICAgICAgIGZvbGxvd2VkIGJ5IGl0cyBzdHJlYW0gb2YgbWVzc2FnZXMsIG9yIGJ5IGRpc2Nvbm5lY3RpbmcuICBUaGUKKyAgICAgICAgc2VydmVyIG11c3Qgbm90IGFjY2VwdCBhZGRpdGlvbmFsIGNvbW1hbmRzIHVzaW5nIHRoaXMgcHJvdG9jb2wKKyAgICAgICAgYWZ0ZXIgdGhlIEJFR0lOIGNvbW1hbmQgaGFzIGJlZW4gcmVjZWl2ZWQuIEZ1cnRoZXIKKyAgICAgICAgY29tbXVuaWNhdGlvbiB3aWxsIGJlIGEgc3RyZWFtIG9mIEQtQnVzIG1lc3NhZ2VzIChvcHRpb25hbGx5CisgICAgICAgIGVuY3J5cHRlZCwgYXMgbmVnb3RpYXRlZCkgcmF0aGVyIHRoYW4gdGhpcyBwcm90b2NvbC4KKyAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3QyPgorICAgIDxzZWN0MiBpZD0iYXV0aC1jb21tYW5kLWZ1dHVyZSI+CisgICAgICA8dGl0bGU+RnV0dXJlIEV4dGVuc2lvbnM8L3RpdGxlPgorICAgICAgPHBhcmE+CisgICAgICAgIEZ1dHVyZSBleHRlbnNpb25zIHRvIHRoZSBhdXRoZW50aWNhdGlvbiBhbmQgbmVnb3RpYXRpb24KKyAgICAgICAgcHJvdG9jb2wgYXJlIHBvc3NpYmxlLiBGb3IgdGhhdCBuZXcgY29tbWFuZHMgbWF5IGJlCisgICAgICAgIGludHJvZHVjZWQuIElmIGEgY2xpZW50IG9yIHNlcnZlciByZWNlaXZlcyBhbiB1bmtub3duIGNvbW1hbmQKKyAgICAgICAgaXQgc2hhbGwgcmVzcG9uZCB3aXRoIEVSUk9SIGFuZCBub3QgY29uc2lkZXIgdGhpcyBmYXRhbC4gTmV3CisgICAgICAgIGNvbW1hbmRzIG1heSBiZSBpbnRyb2R1Y2VkIGJvdGggYmVmb3JlLCBhbmQgYWZ0ZXIKKyAgICAgICAgYXV0aGVudGljYXRpb24sIGkuZS4gYm90aCBiZWZvcmUgYW5kIGFmdGVyIHRoZSBPSyBjb21tYW5kLgorICAgICAgPC9wYXJhPgorICAgIDwvc2VjdDI+CisgICAgPHNlY3QyIGlkPSJhdXRoLWV4YW1wbGVzIj4KKyAgICAgIDx0aXRsZT5BdXRoZW50aWNhdGlvbiBleGFtcGxlczwvdGl0bGU+CisKKyAgICAgIDxwYXJhPgorICAgICAgICA8ZmlndXJlPgorICAgICAgICAgIDx0aXRsZT5FeGFtcGxlIG9mIHN1Y2Nlc3NmdWwgbWFnaWMgY29va2llIGF1dGhlbnRpY2F0aW9uPC90aXRsZT4KKyAgICAgICAgICA8cHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAoTUFHSUNfQ09PS0lFIGlzIGEgbWFkZSB1cCBtZWNoYW5pc20pCisKKyAgICAgICAgICAgIEM6IEFVVEggTUFHSUNfQ09PS0lFIDMxMzgzNjM5MzUzMzMxMzczOTM2MzUzODM2MzQKKyAgICAgICAgICAgIFM6IE9LIDEyMzRkZWFkYmVlZgorICAgICAgICAgICAgQzogQkVHSU4KKyAgICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICA8L2ZpZ3VyZT4KKyAgICAgICAgPGZpZ3VyZT4KKyAgICAgICAgICA8dGl0bGU+RXhhbXBsZSBvZiBmaW5kaW5nIG91dCBtZWNoYW5pc21zIHRoZW4gcGlja2luZyBvbmU8L3RpdGxlPgorICAgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIEM6IEFVVEgKKyAgICAgICAgICAgIFM6IFJFSkVDVEVEIEtFUkJFUk9TX1Y0IFNLRVkKKyAgICAgICAgICAgIEM6IEFVVEggU0tFWSA3YWI4M2YzMmVlCisgICAgICAgICAgICBTOiBEQVRBIDg3OTljYWJiMmVhOTNlCisgICAgICAgICAgICBDOiBEQVRBIDhhYzg3NmU4ZjY4ZWU5ODA5YmZhODc2ZTZmOTg3Nmc4ZmE4ZTc2ZTk4ZgorICAgICAgICAgICAgUzogT0sgMTIzNGRlYWRiZWVmCisgICAgICAgICAgICBDOiBCRUdJTgorICAgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgIDwvZmlndXJlPgorICAgICAgICA8ZmlndXJlPgorICAgICAgICAgIDx0aXRsZT5FeGFtcGxlIG9mIGNsaWVudCBzZW5kcyB1bmtub3duIGNvbW1hbmQgdGhlbiBmYWxscyBiYWNrIHRvIHJlZ3VsYXIgYXV0aDwvdGl0bGU+CisgICAgICAgICAgPHByb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgQzogRk9PQkFSCisgICAgICAgICAgICBTOiBFUlJPUgorICAgICAgICAgICAgQzogQVVUSCBNQUdJQ19DT09LSUUgMzczNjM0MzQzNTMxMzIzMDMzMzAzOQorICAgICAgICAgICAgUzogT0sgMTIzNGRlYWRiZWVmCisgICAgICAgICAgICBDOiBCRUdJTgorICAgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgIDwvZmlndXJlPgorICAgICAgICA8ZmlndXJlPgorICAgICAgICAgIDx0aXRsZT5FeGFtcGxlIG9mIHNlcnZlciBkb2Vzbid0IHN1cHBvcnQgaW5pdGlhbCBhdXRoIG1lY2hhbmlzbTwvdGl0bGU+CisgICAgICAgICAgPHByb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgQzogQVVUSCBNQUdJQ19DT09LSUUgMzczNjM0MzQzNTMxMzIzMDMzMzAzOQorICAgICAgICAgICAgUzogUkVKRUNURUQgS0VSQkVST1NfVjQgU0tFWQorICAgICAgICAgICAgQzogQVVUSCBTS0VZIDdhYjgzZjMyZWUKKyAgICAgICAgICAgIFM6IERBVEEgODc5OWNhYmIyZWE5M2UKKyAgICAgICAgICAgIEM6IERBVEEgOGFjODc2ZThmNjhlZTk4MDliZmE4NzZlNmY5ODc2ZzhmYThlNzZlOThmCisgICAgICAgICAgICBTOiBPSyAxMjM0ZGVhZGJlZWYKKyAgICAgICAgICAgIEM6IEJFR0lOCisgICAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgPC9maWd1cmU+CisgICAgICAgIDxmaWd1cmU+CisgICAgICAgICAgPHRpdGxlPkV4YW1wbGUgb2Ygd3JvbmcgcGFzc3dvcmQgb3IgdGhlIGxpa2UgZm9sbG93ZWQgYnkgc3VjY2Vzc2Z1bCByZXRyeTwvdGl0bGU+CisgICAgICAgICAgPHByb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgQzogQVVUSCBNQUdJQ19DT09LSUUgMzczNjM0MzQzNTMxMzIzMDMzMzAzOQorICAgICAgICAgICAgUzogUkVKRUNURUQgS0VSQkVST1NfVjQgU0tFWQorICAgICAgICAgICAgQzogQVVUSCBTS0VZIDdhYjgzZjMyZWUKKyAgICAgICAgICAgIFM6IERBVEEgODc5OWNhYmIyZWE5M2UKKyAgICAgICAgICAgIEM6IERBVEEgOGFjODc2ZThmNjhlZTk4MDliZmE4NzZlNmY5ODc2ZzhmYThlNzZlOThmCisgICAgICAgICAgICBTOiBSRUpFQ1RFRAorICAgICAgICAgICAgQzogQVVUSCBTS0VZIDdhYjgzZjMyZWUKKyAgICAgICAgICAgIFM6IERBVEEgODc5OWNhYmIyZWE5M2UKKyAgICAgICAgICAgIEM6IERBVEEgOGFjODc2ZThmNjhlZTk4MDliZmE4NzZlNmY5ODc2ZzhmYThlNzZlOThmCisgICAgICAgICAgICBTOiBPSyAxMjM0ZGVhZGJlZWYKKyAgICAgICAgICAgIEM6IEJFR0lOCisgICAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgPC9maWd1cmU+CisgICAgICAgIDxmaWd1cmU+CisgICAgICAgICAgPHRpdGxlPkV4YW1wbGUgb2Ygc2tleSBjYW5jZWxsZWQgYW5kIHJlc3RhcnRlZDwvdGl0bGU+CisgICAgICAgICAgPHByb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgQzogQVVUSCBNQUdJQ19DT09LSUUgMzczNjM0MzQzNTMxMzIzMDMzMzAzOQorICAgICAgICAgICAgUzogUkVKRUNURUQgS0VSQkVST1NfVjQgU0tFWQorICAgICAgICAgICAgQzogQVVUSCBTS0VZIDdhYjgzZjMyZWUKKyAgICAgICAgICAgIFM6IERBVEEgODc5OWNhYmIyZWE5M2UKKyAgICAgICAgICAgIEM6IENBTkNFTAorICAgICAgICAgICAgUzogUkVKRUNURUQKKyAgICAgICAgICAgIEM6IEFVVEggU0tFWSA3YWI4M2YzMmVlCisgICAgICAgICAgICBTOiBEQVRBIDg3OTljYWJiMmVhOTNlCisgICAgICAgICAgICBDOiBEQVRBIDhhYzg3NmU4ZjY4ZWU5ODA5YmZhODc2ZTZmOTg3Nmc4ZmE4ZTc2ZTk4ZgorICAgICAgICAgICAgUzogT0sgMTIzNGRlYWRiZWVmCisgICAgICAgICAgICBDOiBCRUdJTgorICAgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgIDwvZmlndXJlPgorICAgICAgICA8ZmlndXJlPgorICAgICAgICAgIDx0aXRsZT5FeGFtcGxlIG9mIHN1Y2Nlc3NmdWwgbWFnaWMgY29va2llIGF1dGhlbnRpY2F0aW9uIHdpdGggc3VjY2Vzc2Z1bCBuZWdvdGlhdGlvbiBvZiBVbml4IEZEIHBhc3Npbmc8L3RpdGxlPgorICAgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIChNQUdJQ19DT09LSUUgaXMgYSBtYWRlIHVwIG1lY2hhbmlzbSkKKworICAgICAgICAgICAgQzogQVVUSCBNQUdJQ19DT09LSUUgMzEzODM2MzkzNTMzMzEzNzM5MzYzNTM4MzYzNAorICAgICAgICAgICAgUzogT0sgMTIzNGRlYWRiZWVmCisgICAgICAgICAgICBDOiBORUdPVElBVEVfVU5JWF9GRAorICAgICAgICAgICAgUzogQUdSRUVfVU5JWF9GRAorICAgICAgICAgICAgQzogQkVHSU4KKyAgICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICA8L2ZpZ3VyZT4KKyAgICAgICAgPGZpZ3VyZT4KKyAgICAgICAgICA8dGl0bGU+RXhhbXBsZSBvZiBzdWNjZXNzZnVsIG1hZ2ljIGNvb2tpZSBhdXRoZW50aWNhdGlvbiB3aXRoIHVuc3VjY2Vzc2Z1bCBuZWdvdGlhdGlvbiBvZiBVbml4IEZEIHBhc3Npbmc8L3RpdGxlPgorICAgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIChNQUdJQ19DT09LSUUgaXMgYSBtYWRlIHVwIG1lY2hhbmlzbSkKKworICAgICAgICAgICAgQzogQVVUSCBNQUdJQ19DT09LSUUgMzEzODM2MzkzNTMzMzEzNzM5MzYzNTM4MzYzNAorICAgICAgICAgICAgUzogT0sgMTIzNGRlYWRiZWVmCisgICAgICAgICAgICBDOiBORUdPVElBVEVfVU5JWF9GRAorICAgICAgICAgICAgUzogRVJST1IKKyAgICAgICAgICAgIEM6IEJFR0lOCisgICAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgPC9maWd1cmU+CisgICAgICA8L3BhcmE+CisgICAgPC9zZWN0Mj4KKyAgICA8c2VjdDIgaWQ9ImF1dGgtc3RhdGVzIj4KKyAgICAgIDx0aXRsZT5BdXRoZW50aWNhdGlvbiBzdGF0ZSBkaWFncmFtczwvdGl0bGU+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBUaGlzIHNlY3Rpb24gZG9jdW1lbnRzIHRoZSBhdXRoIHByb3RvY29sIGluIHRlcm1zIG9mCisgICAgICAgIGEgc3RhdGUgbWFjaGluZSBmb3IgdGhlIGNsaWVudCBhbmQgdGhlIHNlcnZlci4gVGhpcyBpcworICAgICAgICBwcm9iYWJseSB0aGUgbW9zdCByb2J1c3Qgd2F5IHRvIGltcGxlbWVudCB0aGUgcHJvdG9jb2wuCisgICAgICA8L3BhcmE+CisKKyAgICAgIDxzZWN0MyBpZD0iYXV0aC1zdGF0ZXMtY2xpZW50Ij4KKyAgICAgICAgPHRpdGxlPkNsaWVudCBzdGF0ZXM8L3RpdGxlPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgIFRvIG1vcmUgcHJlY2lzZWx5IGRlc2NyaWJlIHRoZSBpbnRlcmFjdGlvbiBiZXR3ZWVuIHRoZQorICAgICAgICAgIHByb3RvY29sIHN0YXRlIG1hY2hpbmUgYW5kIHRoZSBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc21zIHRoZQorICAgICAgICAgIGZvbGxvd2luZyBub3RhdGlvbiBpcyB1c2VkOiBNRUNIKENIQUxMKSBtZWFucyB0aGF0IHRoZQorICAgICAgICAgIHNlcnZlciBjaGFsbGVuZ2UgQ0hBTEwgd2FzIGZlZCB0byB0aGUgbWVjaGFuaXNtIE1FQ0gsIHdoaWNoCisgICAgICAgICAgcmV0dXJucyBvbmUgb2YKKworICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIENPTlRJTlVFKFJFU1ApIG1lYW5zIGNvbnRpbnVlIHRoZSBhdXRoIGNvbnZlcnNhdGlvbgorICAgICAgICAgICAgICAgIGFuZCBzZW5kIFJFU1AgYXMgdGhlIHJlc3BvbnNlIHRvIHRoZSBzZXJ2ZXI7CisgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisKKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgT0soUkVTUCkgbWVhbnMgdGhhdCBhZnRlciBzZW5kaW5nIFJFU1AgdG8gdGhlIHNlcnZlcgorICAgICAgICAgICAgICAgIHRoZSBjbGllbnQgc2lkZSBvZiB0aGUgYXV0aCBjb252ZXJzYXRpb24gaXMgZmluaXNoZWQKKyAgICAgICAgICAgICAgICBhbmQgdGhlIHNlcnZlciBzaG91bGQgcmV0dXJuICJPSyI7CisgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisKKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgRVJST1IgbWVhbnMgdGhhdCBDSEFMTCB3YXMgaW52YWxpZCBhbmQgY291bGQgbm90IGJlCisgICAgICAgICAgICAgICAgcHJvY2Vzc2VkLgorICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorCisgICAgICAgICAgQm90aCBSRVNQIGFuZCBDSEFMTCBtYXkgYmUgZW1wdHkuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICBUaGUgQ2xpZW50IHN0YXJ0cyBieSBnZXR0aW5nIGFuIGluaXRpYWwgcmVzcG9uc2UgZnJvbSB0aGUKKyAgICAgICAgICBkZWZhdWx0IG1lY2hhbmlzbSBhbmQgc2VuZHMgQVVUSCBNRUNIIFJFU1AsIG9yIEFVVEggTUVDSCBpZgorICAgICAgICAgIHRoZSBtZWNoYW5pc20gZGlkIG5vdCBwcm92aWRlIGFuIGluaXRpYWwgcmVzcG9uc2UuICBJZiB0aGUKKyAgICAgICAgICBtZWNoYW5pc20gcmV0dXJucyBDT05USU5VRSwgdGhlIGNsaWVudCBzdGFydHMgaW4gc3RhdGUKKyAgICAgICAgICA8ZW1waGFzaXM+V2FpdGluZ0ZvckRhdGE8L2VtcGhhc2lzPiwgaWYgdGhlIG1lY2hhbmlzbQorICAgICAgICAgIHJldHVybnMgT0sgdGhlIGNsaWVudCBzdGFydHMgaW4gc3RhdGUKKyAgICAgICAgICA8ZW1waGFzaXM+V2FpdGluZ0Zvck9LPC9lbXBoYXNpcz4uCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICBUaGUgY2xpZW50IHNob3VsZCBrZWVwIHRyYWNrIG9mIGF2YWlsYWJsZSBtZWNoYW5pc21zIGFuZAorICAgICAgICAgIHdoaWNoIGl0IG1lY2hhbmlzbXMgaXQgaGFzIGFscmVhZHkgYXR0ZW1wdGVkLiBUaGlzIGxpc3QgaXMKKyAgICAgICAgICB1c2VkIHRvIGRlY2lkZSB3aGljaCBBVVRIIGNvbW1hbmQgdG8gc2VuZC4gV2hlbiB0aGUgbGlzdCBpcworICAgICAgICAgIGV4aGF1c3RlZCwgdGhlIGNsaWVudCBzaG91bGQgZ2l2ZSB1cCBhbmQgY2xvc2UgdGhlCisgICAgICAgICAgY29ubmVjdGlvbi4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxmb3JtYWxwYXJhPgorICAgICAgICAgIDx0aXRsZT48ZW1waGFzaXM+V2FpdGluZ0ZvckRhdGE8L2VtcGhhc2lzPjwvdGl0bGU+CisgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICBSZWNlaXZlIERBVEEgQ0hBTEwKKyAgICAgICAgICAgICAgICAgIDxzaW1wbGVsaXN0PgorICAgICAgICAgICAgICAgICAgICA8bWVtYmVyPgorICAgICAgICAgICAgICAgICAgICAgIE1FQ0goQ0hBTEwpIHJldHVybnMgQ09OVElOVUUoUkVTUCkgJnJhcnI7IHNlbmQKKyAgICAgICAgICAgICAgICAgICAgICBEQVRBIFJFU1AsIGdvdG8KKyAgICAgICAgICAgICAgICAgICAgICA8ZW1waGFzaXM+V2FpdGluZ0ZvckRhdGE8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICA8L21lbWJlcj4KKworICAgICAgICAgICAgICAgICAgICA8bWVtYmVyPgorICAgICAgICAgICAgICAgICAgICAgIE1FQ0goQ0hBTEwpIHJldHVybnMgT0soUkVTUCkgJnJhcnI7IHNlbmQgREFUQQorICAgICAgICAgICAgICAgICAgICAgIFJFU1AsIGdvdG8gPGVtcGhhc2lzPldhaXRpbmdGb3JPSzwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgIDwvbWVtYmVyPgorCisgICAgICAgICAgICAgICAgICAgIDxtZW1iZXI+CisgICAgICAgICAgICAgICAgICAgICAgTUVDSChDSEFMTCkgcmV0dXJucyBFUlJPUiAmcmFycjsgc2VuZCBFUlJPUgorICAgICAgICAgICAgICAgICAgICAgIFttc2ddLCBnb3RvIDxlbXBoYXNpcz5XYWl0aW5nRm9yRGF0YTwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgIDwvbWVtYmVyPgorICAgICAgICAgICAgICAgICAgPC9zaW1wbGVsaXN0PgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKworICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICBSZWNlaXZlIFJFSkVDVEVEIFttZWNoc10gJnJhcnI7CisgICAgICAgICAgICAgICAgICBzZW5kIEFVVEggW25leHQgbWVjaF0sIGdvdG8KKyAgICAgICAgICAgICAgICAgIFdhaXRpbmdGb3JEYXRhIG9yIDxlbXBoYXNpcz5XYWl0aW5nRm9yT0s8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgUmVjZWl2ZSBFUlJPUiAmcmFycjsgc2VuZAorICAgICAgICAgICAgICAgICAgQ0FOQ0VMLCBnb3RvCisgICAgICAgICAgICAgICAgICA8ZW1waGFzaXM+V2FpdGluZ0ZvclJlamVjdDwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICBSZWNlaXZlIE9LICZyYXJyOyBzZW5kCisgICAgICAgICAgICAgICAgICBCRUdJTiwgdGVybWluYXRlIGF1dGgKKyAgICAgICAgICAgICAgICAgIGNvbnZlcnNhdGlvbiwgYXV0aGVudGljYXRlZAorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgUmVjZWl2ZSBhbnl0aGluZyBlbHNlICZyYXJyOyBzZW5kCisgICAgICAgICAgICAgICAgICBFUlJPUiwgZ290bworICAgICAgICAgICAgICAgICAgPGVtcGhhc2lzPldhaXRpbmdGb3JEYXRhPC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvZm9ybWFscGFyYT4KKworICAgICAgICA8Zm9ybWFscGFyYT4KKyAgICAgICAgICA8dGl0bGU+PGVtcGhhc2lzPldhaXRpbmdGb3JPSzwvZW1waGFzaXM+PC90aXRsZT4KKyAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgIFJlY2VpdmUgT0sgJnJhcnI7IHNlbmQgQkVHSU4sIHRlcm1pbmF0ZSBhdXRoCisgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb24sIDxlbXBoYXNpcz5hdXRoZW50aWNhdGVkPC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgIFJlY2VpdmUgUkVKRUNURUQgW21lY2hzXSAmcmFycjsgc2VuZCBBVVRIIFtuZXh0IG1lY2hdLAorICAgICAgICAgICAgICAgICAgZ290byA8ZW1waGFzaXM+V2FpdGluZ0ZvckRhdGE8L2VtcGhhc2lzPiBvcgorICAgICAgICAgICAgICAgICAgPGVtcGhhc2lzPldhaXRpbmdGb3JPSzwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorCisgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgIFJlY2VpdmUgREFUQSAmcmFycjsgc2VuZCBDQU5DRUwsIGdvdG8KKyAgICAgICAgICAgICAgICAgIDxlbXBoYXNpcz5XYWl0aW5nRm9yUmVqZWN0PC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisKKyAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgUmVjZWl2ZSBFUlJPUiAmcmFycjsgc2VuZCBDQU5DRUwsIGdvdG8KKyAgICAgICAgICAgICAgICAgIDxlbXBoYXNpcz5XYWl0aW5nRm9yUmVqZWN0PC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisKKyAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgUmVjZWl2ZSBhbnl0aGluZyBlbHNlICZyYXJyOyBzZW5kIEVSUk9SLCBnb3RvCisgICAgICAgICAgICAgICAgICA8ZW1waGFzaXM+V2FpdGluZ0Zvck9LPC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvZm9ybWFscGFyYT4KKworICAgICAgICA8Zm9ybWFscGFyYT4KKyAgICAgICAgICA8dGl0bGU+PGVtcGhhc2lzPldhaXRpbmdGb3JSZWplY3Q8L2VtcGhhc2lzPjwvdGl0bGU+CisgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICBSZWNlaXZlIFJFSkVDVEVEIFttZWNoc10gJnJhcnI7IHNlbmQgQVVUSCBbbmV4dCBtZWNoXSwKKyAgICAgICAgICAgICAgICAgIGdvdG8gPGVtcGhhc2lzPldhaXRpbmdGb3JEYXRhPC9lbXBoYXNpcz4gb3IKKyAgICAgICAgICAgICAgICAgIDxlbXBoYXNpcz5XYWl0aW5nRm9yT0s8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKworICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICBSZWNlaXZlIGFueXRoaW5nIGVsc2UgJnJhcnI7IHRlcm1pbmF0ZSBhdXRoCisgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb24sIGRpc2Nvbm5lY3QKKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvZm9ybWFscGFyYT4KKworICAgICAgPC9zZWN0Mz4KKworICAgICAgPHNlY3QzIGlkPSJhdXRoLXN0YXRlcy1zZXJ2ZXIiPgorICAgICAgICA8dGl0bGU+U2VydmVyIHN0YXRlczwvdGl0bGU+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgRm9yIHRoZSBzZXJ2ZXIgTUVDSChSRVNQKSBtZWFucyB0aGF0IHRoZSBjbGllbnQgcmVzcG9uc2UKKyAgICAgICAgICBSRVNQIHdhcyBmZWQgdG8gdGhlIHRoZSBtZWNoYW5pc20gTUVDSCwgd2hpY2ggcmV0dXJucyBvbmUgb2YKKworICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIENPTlRJTlVFKENIQUxMKSBtZWFucyBjb250aW51ZSB0aGUgYXV0aCBjb252ZXJzYXRpb24gYW5kCisgICAgICAgICAgICAgICAgc2VuZCBDSEFMTCBhcyB0aGUgY2hhbGxlbmdlIHRvIHRoZSBjbGllbnQ7CisgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisKKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgT0sgbWVhbnMgdGhhdCB0aGUgY2xpZW50IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseQorICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0ZWQ7CisgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisKKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgUkVKRUNURUQgbWVhbnMgdGhhdCB0aGUgY2xpZW50IGZhaWxlZCB0byBhdXRoZW50aWNhdGUgb3IKKyAgICAgICAgICAgICAgICB0aGVyZSB3YXMgYW4gZXJyb3IgaW4gUkVTUC4KKyAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKworICAgICAgICAgIFRoZSBzZXJ2ZXIgc3RhcnRzIG91dCBpbiBzdGF0ZQorICAgICAgICAgIDxlbXBoYXNpcz5XYWl0aW5nRm9yQXV0aDwvZW1waGFzaXM+LiAgSWYgdGhlIGNsaWVudCBpcworICAgICAgICAgIHJlamVjdGVkIHRvbyBtYW55IHRpbWVzIHRoZSBzZXJ2ZXIgbXVzdCBkaXNjb25uZWN0IHRoZQorICAgICAgICAgIGNsaWVudC4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxmb3JtYWxwYXJhPgorICAgICAgICAgIDx0aXRsZT48ZW1waGFzaXM+V2FpdGluZ0ZvckF1dGg8L2VtcGhhc2lzPjwvdGl0bGU+CisgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorCisgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgIFJlY2VpdmUgQVVUSCAmcmFycjsgc2VuZCBSRUpFQ1RFRCBbbWVjaHNdLCBnb3RvCisgICAgICAgICAgICAgICAgICA8ZW1waGFzaXM+V2FpdGluZ0ZvckF1dGg8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKworICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICBSZWNlaXZlIEFVVEggTUVDSCBSRVNQCisKKyAgICAgICAgICAgICAgICAgIDxzaW1wbGVsaXN0PgorICAgICAgICAgICAgICAgICAgICA8bWVtYmVyPgorICAgICAgICAgICAgICAgICAgICAgIE1FQ0ggbm90IHZhbGlkIG1lY2hhbmlzbSAmcmFycjsgc2VuZCBSRUpFQ1RFRAorICAgICAgICAgICAgICAgICAgICAgIFttZWNoc10sIGdvdG8KKyAgICAgICAgICAgICAgICAgICAgICA8ZW1waGFzaXM+V2FpdGluZ0ZvckF1dGg8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICA8L21lbWJlcj4KKworICAgICAgICAgICAgICAgICAgICA8bWVtYmVyPgorICAgICAgICAgICAgICAgICAgICAgIE1FQ0goUkVTUCkgcmV0dXJucyBDT05USU5VRShDSEFMTCkgJnJhcnI7IHNlbmQKKyAgICAgICAgICAgICAgICAgICAgICBEQVRBIENIQUxMLCBnb3RvCisgICAgICAgICAgICAgICAgICAgICAgPGVtcGhhc2lzPldhaXRpbmdGb3JEYXRhPC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgPC9tZW1iZXI+CisKKyAgICAgICAgICAgICAgICAgICAgPG1lbWJlcj4KKyAgICAgICAgICAgICAgICAgICAgICBNRUNIKFJFU1ApIHJldHVybnMgT0sgJnJhcnI7IHNlbmQgT0ssIGdvdG8KKyAgICAgICAgICAgICAgICAgICAgICA8ZW1waGFzaXM+V2FpdGluZ0ZvckJlZ2luPC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgPC9tZW1iZXI+CisKKyAgICAgICAgICAgICAgICAgICAgPG1lbWJlcj4KKyAgICAgICAgICAgICAgICAgICAgICBNRUNIKFJFU1ApIHJldHVybnMgUkVKRUNURUQgJnJhcnI7IHNlbmQgUkVKRUNURUQKKyAgICAgICAgICAgICAgICAgICAgICBbbWVjaHNdLCBnb3RvCisgICAgICAgICAgICAgICAgICAgICAgPGVtcGhhc2lzPldhaXRpbmdGb3JBdXRoPC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgPC9tZW1iZXI+CisgICAgICAgICAgICAgICAgICA8L3NpbXBsZWxpc3Q+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorCisgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgIFJlY2VpdmUgQkVHSU4gJnJhcnI7IHRlcm1pbmF0ZQorICAgICAgICAgICAgICAgICAgYXV0aCBjb252ZXJzYXRpb24sIGRpc2Nvbm5lY3QKKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisKKyAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgUmVjZWl2ZSBFUlJPUiAmcmFycjsgc2VuZCBSRUpFQ1RFRCBbbWVjaHNdLCBnb3RvCisgICAgICAgICAgICAgICAgICA8ZW1waGFzaXM+V2FpdGluZ0ZvckF1dGg8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKworICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICBSZWNlaXZlIGFueXRoaW5nIGVsc2UgJnJhcnI7IHNlbmQKKyAgICAgICAgICAgICAgICAgIEVSUk9SLCBnb3RvCisgICAgICAgICAgICAgICAgICA8ZW1waGFzaXM+V2FpdGluZ0ZvckF1dGg8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9mb3JtYWxwYXJhPgorCisKKyAgICAgICAgPGZvcm1hbHBhcmE+CisgICAgICAgICAgPHRpdGxlPjxlbXBoYXNpcz5XYWl0aW5nRm9yRGF0YTwvZW1waGFzaXM+PC90aXRsZT4KKyAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgIFJlY2VpdmUgREFUQSBSRVNQCisgICAgICAgICAgICAgICAgICA8c2ltcGxlbGlzdD4KKyAgICAgICAgICAgICAgICAgICAgPG1lbWJlcj4KKyAgICAgICAgICAgICAgICAgICAgICBNRUNIKFJFU1ApIHJldHVybnMgQ09OVElOVUUoQ0hBTEwpICZyYXJyOyBzZW5kCisgICAgICAgICAgICAgICAgICAgICAgREFUQSBDSEFMTCwgZ290bworICAgICAgICAgICAgICAgICAgICAgIDxlbXBoYXNpcz5XYWl0aW5nRm9yRGF0YTwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgIDwvbWVtYmVyPgorCisgICAgICAgICAgICAgICAgICAgIDxtZW1iZXI+CisgICAgICAgICAgICAgICAgICAgICAgTUVDSChSRVNQKSByZXR1cm5zIE9LICZyYXJyOyBzZW5kIE9LLCBnb3RvCisgICAgICAgICAgICAgICAgICAgICAgPGVtcGhhc2lzPldhaXRpbmdGb3JCZWdpbjwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgIDwvbWVtYmVyPgorCisgICAgICAgICAgICAgICAgICAgIDxtZW1iZXI+CisgICAgICAgICAgICAgICAgICAgICAgTUVDSChSRVNQKSByZXR1cm5zIFJFSkVDVEVEICZyYXJyOyBzZW5kIFJFSkVDVEVECisgICAgICAgICAgICAgICAgICAgICAgW21lY2hzXSwgZ290bworICAgICAgICAgICAgICAgICAgICAgIDxlbXBoYXNpcz5XYWl0aW5nRm9yQXV0aDwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgIDwvbWVtYmVyPgorICAgICAgICAgICAgICAgICAgPC9zaW1wbGVsaXN0PgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKworICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICBSZWNlaXZlIEJFR0lOICZyYXJyOyB0ZXJtaW5hdGUgYXV0aCBjb252ZXJzYXRpb24sCisgICAgICAgICAgICAgICAgICBkaXNjb25uZWN0CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorCisgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgIFJlY2VpdmUgQ0FOQ0VMICZyYXJyOyBzZW5kIFJFSkVDVEVEIFttZWNoc10sIGdvdG8KKyAgICAgICAgICAgICAgICAgIDxlbXBoYXNpcz5XYWl0aW5nRm9yQXV0aDwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorCisgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgIFJlY2VpdmUgRVJST1IgJnJhcnI7IHNlbmQgUkVKRUNURUQgW21lY2hzXSwgZ290bworICAgICAgICAgICAgICAgICAgPGVtcGhhc2lzPldhaXRpbmdGb3JBdXRoPC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisKKyAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgUmVjZWl2ZSBhbnl0aGluZyBlbHNlICZyYXJyOyBzZW5kIEVSUk9SLCBnb3RvCisgICAgICAgICAgICAgICAgICA8ZW1waGFzaXM+V2FpdGluZ0ZvckRhdGE8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9mb3JtYWxwYXJhPgorCisgICAgICAgIDxmb3JtYWxwYXJhPgorICAgICAgICAgIDx0aXRsZT48ZW1waGFzaXM+V2FpdGluZ0ZvckJlZ2luPC9lbXBoYXNpcz48L3RpdGxlPgorICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgUmVjZWl2ZSBCRUdJTiAmcmFycjsgdGVybWluYXRlIGF1dGggY29udmVyc2F0aW9uLAorICAgICAgICAgICAgICAgICAgY2xpZW50IGF1dGhlbnRpY2F0ZWQKKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisKKyAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgUmVjZWl2ZSBDQU5DRUwgJnJhcnI7IHNlbmQgUkVKRUNURUQgW21lY2hzXSwgZ290bworICAgICAgICAgICAgICAgICAgPGVtcGhhc2lzPldhaXRpbmdGb3JBdXRoPC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisKKyAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgUmVjZWl2ZSBFUlJPUiAmcmFycjsgc2VuZCBSRUpFQ1RFRCBbbWVjaHNdLCBnb3RvCisgICAgICAgICAgICAgICAgICA8ZW1waGFzaXM+V2FpdGluZ0ZvckF1dGg8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKworICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICBSZWNlaXZlIGFueXRoaW5nIGVsc2UgJnJhcnI7IHNlbmQgRVJST1IsIGdvdG8KKyAgICAgICAgICAgICAgICAgIDxlbXBoYXNpcz5XYWl0aW5nRm9yQmVnaW48L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9mb3JtYWxwYXJhPgorCisgICAgICA8L3NlY3QzPgorCisgICAgPC9zZWN0Mj4KKyAgICA8c2VjdDIgaWQ9ImF1dGgtbWVjaGFuaXNtcyI+CisgICAgICA8dGl0bGU+QXV0aGVudGljYXRpb24gbWVjaGFuaXNtczwvdGl0bGU+CisgICAgICA8cGFyYT4KKyAgICAgICAgVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyBzb21lIG5ldyBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc21zLgorICAgICAgICBELUJ1cyBhbHNvIGFsbG93cyBhbnkgc3RhbmRhcmQgU0FTTCBtZWNoYW5pc20gb2YgY291cnNlLgorICAgICAgPC9wYXJhPgorICAgICAgPHNlY3QzIGlkPSJhdXRoLW1lY2hhbmlzbXMtc2hhIj4KKyAgICAgICAgPHRpdGxlPkRCVVNfQ09PS0lFX1NIQTE8L3RpdGxlPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBUaGUgREJVU19DT09LSUVfU0hBMSBtZWNoYW5pc20gaXMgZGVzaWduZWQgdG8gZXN0YWJsaXNoIHRoYXQgYSBjbGllbnQKKyAgICAgICAgICBoYXMgdGhlIGFiaWxpdHkgdG8gcmVhZCBhIHByaXZhdGUgZmlsZSBvd25lZCBieSB0aGUgdXNlciBiZWluZworICAgICAgICAgIGF1dGhlbnRpY2F0ZWQuIElmIHRoZSBjbGllbnQgY2FuIHByb3ZlIHRoYXQgaXQgaGFzIGFjY2VzcyB0byBhIHNlY3JldAorICAgICAgICAgIGNvb2tpZSBzdG9yZWQgaW4gdGhpcyBmaWxlLCB0aGVuIHRoZSBjbGllbnQgaXMgYXV0aGVudGljYXRlZC4KKyAgICAgICAgICBUaHVzIHRoZSBzZWN1cml0eSBvZiBEQlVTX0NPT0tJRV9TSEExIGRlcGVuZHMgb24gYSBzZWN1cmUgaG9tZQorICAgICAgICAgIGRpcmVjdG9yeS4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBUaHJvdWdob3V0IHRoaXMgZGVzY3JpcHRpb24sICJoZXggZW5jb2RpbmciIG11c3Qgb3V0cHV0IHRoZSBkaWdpdHMKKyAgICAgICAgICBmcm9tIGEgdG8gZiBpbiBsb3dlci1jYXNlOyB0aGUgZGlnaXRzIEEgdG8gRiBtdXN0IG5vdCBiZSB1c2VkCisgICAgICAgICAgaW4gdGhlIERCVVNfQ09PS0lFX1NIQTEgbWVjaGFuaXNtLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEF1dGhlbnRpY2F0aW9uIHByb2NlZWRzIGFzIGZvbGxvd3M6CisgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgVGhlIGNsaWVudCBzZW5kcyB0aGUgdXNlcm5hbWUgaXQgd291bGQgbGlrZSB0byBhdXRoZW50aWNhdGUKKyAgICAgICAgICAgICAgICBhcywgaGV4LWVuY29kZWQuCisgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFRoZSBzZXJ2ZXIgc2VuZHMgdGhlIG5hbWUgb2YgaXRzICJjb29raWUgY29udGV4dCIgKHNlZSBiZWxvdyk7IGEKKyAgICAgICAgICAgICAgICBzcGFjZSBjaGFyYWN0ZXI7IHRoZSBpbnRlZ2VyIElEIG9mIHRoZSBzZWNyZXQgY29va2llIHRoZSBjbGllbnQKKyAgICAgICAgICAgICAgICBtdXN0IGRlbW9uc3RyYXRlIGtub3dsZWRnZSBvZjsgYSBzcGFjZSBjaGFyYWN0ZXI7IHRoZW4gYQorICAgICAgICAgICAgICAgIHJhbmRvbWx5LWdlbmVyYXRlZCBjaGFsbGVuZ2Ugc3RyaW5nLCBhbGwgb2YgdGhpcyBoZXgtZW5jb2RlZCBpbnRvCisgICAgICAgICAgICAgICAgb25lLCBzaW5nbGUgc3RyaW5nLgorICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBUaGUgY2xpZW50IGxvY2F0ZXMgdGhlIGNvb2tpZSBhbmQgZ2VuZXJhdGVzIGl0cyBvd24KKyAgICAgICAgICAgICAgICByYW5kb21seS1nZW5lcmF0ZWQgY2hhbGxlbmdlIHN0cmluZy4gVGhlIGNsaWVudCB0aGVuIGNvbmNhdGVuYXRlcworICAgICAgICAgICAgICAgIHRoZSBzZXJ2ZXIncyBkZWNvZGVkIGNoYWxsZW5nZSwgYSAiOiIgY2hhcmFjdGVyLCBpdHMgb3duIGNoYWxsZW5nZSwKKyAgICAgICAgICAgICAgICBhbm90aGVyICI6IiBjaGFyYWN0ZXIsIGFuZCB0aGUgY29va2llLiBJdCBjb21wdXRlcyB0aGUgU0hBLTEgaGFzaAorICAgICAgICAgICAgICAgIG9mIHRoaXMgY29tcG9zaXRlIHN0cmluZyBhcyBhIGhleCBkaWdlc3QuIEl0IGNvbmNhdGVuYXRlcyB0aGUKKyAgICAgICAgICAgICAgICBjbGllbnQncyBjaGFsbGVuZ2Ugc3RyaW5nLCBhIHNwYWNlIGNoYXJhY3RlciwgYW5kIHRoZSBTSEEtMSBoZXgKKyAgICAgICAgICAgICAgICBkaWdlc3QsIGhleC1lbmNvZGVzIHRoZSByZXN1bHQgYW5kIHNlbmRzIGl0IGJhY2sgdG8gdGhlIHNlcnZlci4KKyAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgVGhlIHNlcnZlciBnZW5lcmF0ZXMgdGhlIHNhbWUgY29uY2F0ZW5hdGVkIHN0cmluZyB1c2VkIGJ5IHRoZQorICAgICAgICAgICAgICAgIGNsaWVudCBhbmQgY29tcHV0ZXMgaXRzIFNIQS0xIGhhc2guIEl0IGNvbXBhcmVzIHRoZSBoYXNoIHdpdGgKKyAgICAgICAgICAgICAgICB0aGUgaGFzaCByZWNlaXZlZCBmcm9tIHRoZSBjbGllbnQ7IGlmIHRoZSB0d28gaGFzaGVzIG1hdGNoLCB0aGUKKyAgICAgICAgICAgICAgICBjbGllbnQgaXMgYXV0aGVudGljYXRlZC4KKyAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBFYWNoIHNlcnZlciBoYXMgYSAiY29va2llIGNvbnRleHQsIiB3aGljaCBpcyBhIG5hbWUgdGhhdCBpZGVudGlmaWVzIGEKKyAgICAgICAgICBzZXQgb2YgY29va2llcyB0aGF0IGFwcGx5IHRvIHRoYXQgc2VydmVyLiBBIHNhbXBsZSBjb250ZXh0IG1pZ2h0IGJlCisgICAgICAgICAgIm9yZ19mcmVlZGVza3RvcF9zZXNzaW9uX2J1cyIuIENvbnRleHQgbmFtZXMgbXVzdCBiZSB2YWxpZCBBU0NJSSwKKyAgICAgICAgICBub256ZXJvIGxlbmd0aCwgYW5kIG1heSBub3QgY29udGFpbiB0aGUgY2hhcmFjdGVycyBzbGFzaCAoIi8iKSwKKyAgICAgICAgICBiYWNrc2xhc2ggKCJcIiksIHNwYWNlICgiICIpLCBuZXdsaW5lICgiXG4iKSwgY2FycmlhZ2UgcmV0dXJuICgiXHIiKSwKKyAgICAgICAgICB0YWIgKCJcdCIpLCBvciBwZXJpb2QgKCIuIikuIFRoZXJlIGlzIGEgZGVmYXVsdCBjb250ZXh0LAorICAgICAgICAgICJvcmdfZnJlZWRlc2t0b3BfZ2VuZXJhbCIgdGhhdCdzIHVzZWQgYnkgc2VydmVycyB0aGF0IGRvIG5vdCBzcGVjaWZ5CisgICAgICAgICAgb3RoZXJ3aXNlLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIENvb2tpZXMgYXJlIHN0b3JlZCBpbiBhIHVzZXIncyBob21lIGRpcmVjdG9yeSwgaW4gdGhlIGRpcmVjdG9yeQorICAgICAgICAgIDxmaWxlbmFtZT5+Ly5kYnVzLWtleXJpbmdzLzwvZmlsZW5hbWU+LiBUaGlzIGRpcmVjdG9yeSBtdXN0CisgICAgICAgICAgbm90IGJlIHJlYWRhYmxlIG9yIHdyaXRhYmxlIGJ5IG90aGVyIHVzZXJzLiBJZiBpdCBpcywKKyAgICAgICAgICBjbGllbnRzIGFuZCBzZXJ2ZXJzIG11c3QgaWdub3JlIGl0LiBUaGUgZGlyZWN0b3J5CisgICAgICAgICAgY29udGFpbnMgY29va2llIGZpbGVzIG5hbWVkIGFmdGVyIHRoZSBjb29raWUgY29udGV4dC4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBBIGNvb2tpZSBmaWxlIGNvbnRhaW5zIG9uZSBjb29raWUgcGVyIGxpbmUuIEVhY2ggbGluZQorICAgICAgICAgIGhhcyB0aHJlZSBzcGFjZS1zZXBhcmF0ZWQgZmllbGRzOgorICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFRoZSBjb29raWUgSUQgbnVtYmVyLCB3aGljaCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIgYW5kCisgICAgICAgICAgICAgICAgbWF5IG5vdCBiZSB1c2VkIHR3aWNlIGluIHRoZSBzYW1lIGZpbGUuCisgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFRoZSBjb29raWUncyBjcmVhdGlvbiB0aW1lLCBpbiBVTklYIHNlY29uZHMtc2luY2UtdGhlLWVwb2NoCisgICAgICAgICAgICAgICAgZm9ybWF0LgorICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBUaGUgY29va2llIGl0c2VsZiwgYSBoZXgtZW5jb2RlZCByYW5kb20gYmxvY2sgb2YgYnl0ZXMuIFRoZSBjb29raWUKKyAgICAgICAgICAgICAgICBtYXkgYmUgb2YgYW55IGxlbmd0aCwgdGhvdWdoIG9idmlvdXNseSBzZWN1cml0eSBpbmNyZWFzZXMKKyAgICAgICAgICAgICAgICBhcyB0aGUgbGVuZ3RoIGluY3JlYXNlcy4KKyAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBPbmx5IHNlcnZlciBwcm9jZXNzZXMgbW9kaWZ5IHRoZSBjb29raWUgZmlsZS4KKyAgICAgICAgICBUaGV5IG11c3QgZG8gc28gd2l0aCB0aGlzIHByb2NlZHVyZToKKyAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBDcmVhdGUgYSBsb2NrZmlsZSBuYW1lIGJ5IGFwcGVuZGluZyAiLmxvY2siIHRvIHRoZSBuYW1lIG9mIHRoZQorICAgICAgICAgICAgICAgIGNvb2tpZSBmaWxlLiAgVGhlIHNlcnZlciBzaG91bGQgYXR0ZW1wdCB0byBjcmVhdGUgdGhpcyBmaWxlCisgICAgICAgICAgICAgICAgdXNpbmcgPGxpdGVyYWw+T19DUkVBVCB8IE9fRVhDTDwvbGl0ZXJhbD4uICBJZiBmaWxlIGNyZWF0aW9uCisgICAgICAgICAgICAgICAgZmFpbHMsIHRoZSBsb2NrIGZhaWxzLiBTZXJ2ZXJzIHNob3VsZCByZXRyeSBmb3IgYSByZWFzb25hYmxlCisgICAgICAgICAgICAgICAgcGVyaW9kIG9mIHRpbWUsIHRoZW4gdGhleSBtYXkgY2hvb3NlIHRvIGRlbGV0ZSBhbiBleGlzdGluZyBsb2NrCisgICAgICAgICAgICAgICAgdG8ga2VlcCB1c2VycyBmcm9tIGhhdmluZyB0byBtYW51YWxseSBkZWxldGUgYSBzdGFsZQorICAgICAgICAgICAgICAgIGxvY2suIDxmb290bm90ZT48cGFyYT5Mb2NrZmlsZXMgYXJlIHVzZWQgaW5zdGVhZCBvZiByZWFsIGZpbGUKKyAgICAgICAgICAgICAgICBsb2NraW5nIDxsaXRlcmFsPmZjbnRsKCk8L2xpdGVyYWw+IGJlY2F1c2UgcmVhbCBsb2NraW5nCisgICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb25zIGFyZSBzdGlsbCBmbGFreSBvbiBuZXR3b3JrCisgICAgICAgICAgICAgICAgZmlsZXN5c3RlbXMuPC9wYXJhPjwvZm9vdG5vdGU+CisgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIE9uY2UgdGhlIGxvY2tmaWxlIGhhcyBiZWVuIGNyZWF0ZWQsIHRoZSBzZXJ2ZXIgbG9hZHMgdGhlIGNvb2tpZQorICAgICAgICAgICAgICAgIGZpbGUuIEl0IHNob3VsZCB0aGVuIGRlbGV0ZSBhbnkgY29va2llcyB0aGF0IGFyZSBvbGQgKHRoZQorICAgICAgICAgICAgICAgIHRpbWVvdXQgY2FuIGJlIGZhaXJseSBzaG9ydCksIG9yIG1vcmUgdGhhbiBhIHJlYXNvbmFibGUKKyAgICAgICAgICAgICAgICB0aW1lIGluIHRoZSBmdXR1cmUgKHNvIHRoYXQgY29va2llcyBuZXZlciBhY2NpZGVudGFsbHkKKyAgICAgICAgICAgICAgICBiZWNvbWUgcGVybWFuZW50LCBpZiB0aGUgY2xvY2sgd2FzIHNldCBmYXIgaW50byB0aGUgZnV0dXJlCisgICAgICAgICAgICAgICAgYXQgc29tZSBwb2ludCkuIElmIG5vIHJlY2VudCBrZXlzIHJlbWFpbiwgdGhlCisgICAgICAgICAgICAgICAgc2VydmVyIG1heSBnZW5lcmF0ZSBhIG5ldyBrZXkuCisgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFRoZSBwcnVuZWQgYW5kIHBvc3NpYmx5IGFkZGVkLXRvIGNvb2tpZSBmaWxlCisgICAgICAgICAgICAgICAgbXVzdCBiZSByZXNhdmVkIGF0b21pY2FsbHkgKHVzaW5nIGEgdGVtcG9yYXJ5CisgICAgICAgICAgICAgICAgZmlsZSB3aGljaCBpcyByZW5hbWUoKSdkKS4KKyAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgVGhlIGxvY2sgbXVzdCBiZSBkcm9wcGVkIGJ5IGRlbGV0aW5nIHRoZSBsb2NrZmlsZS4KKyAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBDbGllbnRzIG5lZWQgbm90IGxvY2sgdGhlIGZpbGUgaW4gb3JkZXIgdG8gbG9hZCBpdCwKKyAgICAgICAgICBiZWNhdXNlIHNlcnZlcnMgYXJlIHJlcXVpcmVkIHRvIHNhdmUgdGhlIGZpbGUgYXRvbWljYWxseS4KKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9zZWN0Mz4KKyAgICA8L3NlY3QyPgorICA8L3NlY3QxPgorICA8c2VjdDEgaWQ9ImFkZHJlc3NlcyI+CisgICAgPHRpdGxlPlNlcnZlciBBZGRyZXNzZXM8L3RpdGxlPgorICAgIDxwYXJhPgorICAgICAgU2VydmVyIGFkZHJlc3NlcyBjb25zaXN0IG9mIGEgdHJhbnNwb3J0IG5hbWUgZm9sbG93ZWQgYnkgYSBjb2xvbiwgYW5kCisgICAgICB0aGVuIGFuIG9wdGlvbmFsLCBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBrZXlzIGFuZCB2YWx1ZXMgaW4gdGhlIGZvcm0ga2V5PXZhbHVlLgorICAgICAgRWFjaCB2YWx1ZSBpcyBlc2NhcGVkLgorICAgIDwvcGFyYT4KKyAgICA8cGFyYT4KKyAgICAgIEZvciBleGFtcGxlOgorICAgICAgPHByb2dyYW1saXN0aW5nPnVuaXg6cGF0aD0vdG1wL2RidXMtdGVzdDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICBXaGljaCBpcyB0aGUgYWRkcmVzcyB0byBhIHVuaXggc29ja2V0IHdpdGggdGhlIHBhdGggL3RtcC9kYnVzLXRlc3QuCisgICAgPC9wYXJhPgorICAgIDxwYXJhPgorICAgICAgVmFsdWUgZXNjYXBpbmcgaXMgc2ltaWxhciB0byBVUkkgZXNjYXBpbmcgYnV0IHNpbXBsZXIuCisgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBUaGUgc2V0IG9mIG9wdGlvbmFsbHktZXNjYXBlZCBieXRlcyBpczoKKyAgICAgICAgICAgIDxsaXRlcmFsPlstMC05QS1aYS16Xy8uXF08L2xpdGVyYWw+LiBUbyBlc2NhcGUsIGVhY2gKKyAgICAgICAgICAgIDxlbXBoYXNpcz5ieXRlPC9lbXBoYXNpcz4gKG5vdGUsIG5vdCBjaGFyYWN0ZXIpIHdoaWNoIGlzIG5vdCBpbiB0aGUKKyAgICAgICAgICAgIHNldCBvZiBvcHRpb25hbGx5LWVzY2FwZWQgYnl0ZXMgbXVzdCBiZSByZXBsYWNlZCB3aXRoIGFuIEFTQ0lJCisgICAgICAgICAgICBwZXJjZW50ICg8bGl0ZXJhbD4lPC9saXRlcmFsPikgYW5kIHRoZSB2YWx1ZSBvZiB0aGUgYnl0ZSBpbiBoZXguCisgICAgICAgICAgICBUaGUgaGV4IHZhbHVlIG11c3QgYWx3YXlzIGJlIHR3byBkaWdpdHMsIGV2ZW4gaWYgdGhlIGZpcnN0IGRpZ2l0IGlzCisgICAgICAgICAgICB6ZXJvLiBUaGUgb3B0aW9uYWxseS1lc2NhcGVkIGJ5dGVzIG1heSBiZSBlc2NhcGVkIGlmIGRlc2lyZWQuCisgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBUbyB1bmVzY2FwZSwgYXBwZW5kIGVhY2ggYnl0ZSBpbiB0aGUgdmFsdWU7IGlmIGEgYnl0ZSBpcyBhbiBBU0NJSQorICAgICAgICAgICAgcGVyY2VudCAoPGxpdGVyYWw+JTwvbGl0ZXJhbD4pIGNoYXJhY3RlciB0aGVuIGFwcGVuZCB0aGUgZm9sbG93aW5nCisgICAgICAgICAgICBoZXggdmFsdWUgaW5zdGVhZC4gSXQgaXMgYW4gZXJyb3IgaWYgYSA8bGl0ZXJhbD4lPC9saXRlcmFsPiBieXRlCisgICAgICAgICAgICBkb2VzIG5vdCBoYXZlIHR3byBoZXggZGlnaXRzIGZvbGxvd2luZy4gSXQgaXMgYW4gZXJyb3IgaWYgYQorICAgICAgICAgICAgbm9uLW9wdGlvbmFsbHktZXNjYXBlZCBieXRlIGlzIHNlZW4gdW5lc2NhcGVkLgorICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgVGhlIHNldCBvZiBvcHRpb25hbGx5LWVzY2FwZWQgYnl0ZXMgaXMgaW50ZW5kZWQgdG8gcHJlc2VydmUgYWRkcmVzcworICAgICAgcmVhZGFiaWxpdHkgYW5kIGNvbnZlbmllbmNlLgorICAgIDwvcGFyYT4KKworICAgIDxwYXJhPgorICAgICAgQSBzZXJ2ZXIgbWF5IHNwZWNpZnkgYSBrZXktdmFsdWUgcGFpciB3aXRoIHRoZSBrZXkgPGxpdGVyYWw+Z3VpZDwvbGl0ZXJhbD4KKyAgICAgIGFuZCB0aGUgdmFsdWUgYSBoZXgtZW5jb2RlZCAxNi1ieXRlIHNlcXVlbmNlLiA8eHJlZiBsaW5rZW5kPSJ1dWlkcyIvPgorICAgICAgZGVzY3JpYmVzIHRoZSBmb3JtYXQgb2YgdGhlIDxsaXRlcmFsPmd1aWQ8L2xpdGVyYWw+IGZpZWxkLiAgSWYgcHJlc2VudCwKKyAgICAgIHRoaXMgVVVJRCBtYXkgYmUgdXNlZCB0byBkaXN0aW5ndWlzaCBvbmUgc2VydmVyIGFkZHJlc3MgZnJvbSBhbm90aGVyLiBBCisgICAgICBzZXJ2ZXIgc2hvdWxkIHVzZSBhIGRpZmZlcmVudCBVVUlEIGZvciBlYWNoIGFkZHJlc3MgaXQgbGlzdGVucyBvbi4gRm9yCisgICAgICBleGFtcGxlLCBpZiBhIG1lc3NhZ2UgYnVzIGRhZW1vbiBvZmZlcnMgYm90aCBVTklYIGRvbWFpbiBzb2NrZXQgYW5kIFRDUAorICAgICAgY29ubmVjdGlvbnMsIGJ1dCB0cmVhdHMgY2xpZW50cyB0aGUgc2FtZSByZWdhcmRsZXNzIG9mIGhvdyB0aGV5IGNvbm5lY3QsCisgICAgICB0aG9zZSB0d28gY29ubmVjdGlvbnMgYXJlIGVxdWl2YWxlbnQgcG9zdC1jb25uZWN0aW9uIGJ1dCBzaG91bGQgaGF2ZQorICAgICAgZGlzdGluY3QgVVVJRHMgdG8gZGlzdGluZ3Vpc2ggdGhlIGtpbmRzIG9mIGNvbm5lY3Rpb24uCisgICAgPC9wYXJhPgorCisgICAgPHBhcmE+CisgICAgICBUaGUgaW50ZW50IG9mIHRoZSBhZGRyZXNzIFVVSUQgZmVhdHVyZSBpcyB0byBhbGxvdyBhIGNsaWVudCB0byBhdm9pZAorICAgICAgb3BlbmluZyBtdWx0aXBsZSBpZGVudGljYWwgY29ubmVjdGlvbnMgdG8gdGhlIHNhbWUgc2VydmVyLCBieSBhbGxvd2luZyB0aGUKKyAgICAgIGNsaWVudCB0byBjaGVjayB3aGV0aGVyIGFuIGFkZHJlc3MgY29ycmVzcG9uZHMgdG8gYW4gYWxyZWFkeS1leGlzdGluZworICAgICAgY29ubmVjdGlvbi4gIENvbXBhcmluZyB0d28gYWRkcmVzc2VzIGlzIGluc3VmZmljaWVudCwgYmVjYXVzZSBhZGRyZXNzZXMKKyAgICAgIGNhbiBiZSByZWN5Y2xlZCBieSBkaXN0aW5jdCBzZXJ2ZXJzLCBhbmQgZXF1aXZhbGVudCBhZGRyZXNzZXMgbWF5IGxvb2sKKyAgICAgIGRpZmZlcmVudCBpZiBzaW1wbHkgY29tcGFyZWQgYXMgc3RyaW5ncyAoZm9yIGV4YW1wbGUsIHRoZSBob3N0IGluIGEgVENQCisgICAgICBhZGRyZXNzIGNhbiBiZSBnaXZlbiBhcyBhbiBJUCBhZGRyZXNzIG9yIGFzIGEgaG9zdG5hbWUpLgorICAgIDwvcGFyYT4KKworICAgIDxwYXJhPgorICAgICAgTm90ZSB0aGF0IHRoZSBhZGRyZXNzIGtleSBpcyA8bGl0ZXJhbD5ndWlkPC9saXRlcmFsPiBldmVuIHRob3VnaCB0aGUKKyAgICAgIHJlc3Qgb2YgdGhlIEFQSSBhbmQgZG9jdW1lbnRhdGlvbiBzYXlzICJVVUlELCIgZm9yIGhpc3RvcmljYWwgcmVhc29ucy4KKyAgICA8L3BhcmE+CisKKyAgICA8cGFyYT4KKyAgICAgIFtGSVhNRSBjbGFyaWZ5IGlmIGF0dGVtcHRpbmcgdG8gY29ubmVjdCB0byBlYWNoIGlzIGEgcmVxdWlyZW1lbnQKKyAgICAgIG9yIGp1c3QgYSBzdWdnZXN0aW9uXQorICAgICAgV2hlbiBjb25uZWN0aW5nIHRvIGEgc2VydmVyLCBtdWx0aXBsZSBzZXJ2ZXIgYWRkcmVzc2VzIGNhbiBiZQorICAgICAgc2VwYXJhdGVkIGJ5IGEgc2VtaS1jb2xvbi4gVGhlIGxpYnJhcnkgd2lsbCB0aGVuIHRyeSB0byBjb25uZWN0CisgICAgICB0byB0aGUgZmlyc3QgYWRkcmVzcyBhbmQgaWYgdGhhdCBmYWlscywgaXQnbGwgdHJ5IHRvIGNvbm5lY3QgdG8KKyAgICAgIHRoZSBuZXh0IG9uZSBzcGVjaWZpZWQsIGFuZCBzbyBmb3J0aC4gRm9yIGV4YW1wbGUKKyAgICAgIDxwcm9ncmFtbGlzdGluZz51bml4OnBhdGg9L3RtcC9kYnVzLXRlc3Q7dW5peDpwYXRoPS90bXAvZGJ1cy10ZXN0MjwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgPC9wYXJhPgorCisgICAgPHBhcmE+CisgICAgICBTb21lIGFkZHJlc3NlcyBhcmUgPGZpcnN0dGVybT5jb25uZWN0YWJsZTwvZmlyc3R0ZXJtPi4gQSBjb25uZWN0YWJsZQorICAgICAgYWRkcmVzcyBpcyBvbmUgY29udGFpbmluZyBlbm91Z2ggaW5mb3JtYXRpb24gZm9yIGEgY2xpZW50IHRvIGNvbm5lY3QKKyAgICAgIHRvIGl0LiBGb3IgaW5zdGFuY2UsIDxsaXRlcmFsPnRjcDpob3N0PTEyNy4wLjAuMSxwb3J0PTQyNDI8L2xpdGVyYWw+CisgICAgICBpcyBhIGNvbm5lY3RhYmxlIGFkZHJlc3MuIEl0IGlzIG5vdCBuZWNlc3NhcmlseSBwb3NzaWJsZSB0byBsaXN0ZW4KKyAgICAgIG9uIGV2ZXJ5IGNvbm5lY3RhYmxlIGFkZHJlc3M6IGZvciBpbnN0YW5jZSwgaXQgaXMgbm90IHBvc3NpYmxlIHRvCisgICAgICBsaXN0ZW4gb24gYSA8bGl0ZXJhbD51bml4ZXhlYzo8L2xpdGVyYWw+IGFkZHJlc3MuCisgICAgPC9wYXJhPgorCisgICAgPHBhcmE+CisgICAgICBTb21lIGFkZHJlc3NlcyBhcmUgPGZpcnN0dGVybT5saXN0ZW5hYmxlPC9maXJzdHRlcm0+LiBBIGxpc3RlbmFibGUKKyAgICAgIGFkZHJlc3MgaXMgb25lIGNvbnRhaW5pbmcgZW5vdWdoIGluZm9ybWF0aW9uIGZvciBhIHNlcnZlciB0byBsaXN0ZW4gb24KKyAgICAgIGl0LCBwcm9kdWNpbmcgYSBjb25uZWN0YWJsZSBhZGRyZXNzICh3aGljaCBtYXkgZGlmZmVyIGZyb20gdGhlCisgICAgICBvcmlnaW5hbCBhZGRyZXNzKS4gTWFueSBsaXN0ZW5hYmxlIGFkZHJlc3NlcyBhcmUgbm90IGNvbm5lY3RhYmxlOgorICAgICAgZm9yIGluc3RhbmNlLCA8bGl0ZXJhbD50Y3A6aG9zdD0xMjcuMC4wLjE8L2xpdGVyYWw+CisgICAgICBpcyBsaXN0ZW5hYmxlLCBidXQgbm90IGNvbm5lY3RhYmxlIChiZWNhdXNlIGl0IGRvZXMgbm90IHNwZWNpZnkKKyAgICAgIGEgcG9ydCBudW1iZXIpLgorICAgIDwvcGFyYT4KKworICAgIDxwYXJhPgorICAgICAgTGlzdGVuaW5nIG9uIGFuIGFkZHJlc3MgdGhhdCBpcyBub3QgY29ubmVjdGFibGUgd2lsbCByZXN1bHQgaW4gYQorICAgICAgY29ubmVjdGFibGUgYWRkcmVzcyB0aGF0IGlzIG5vdCB0aGUgc2FtZSBhcyB0aGUgbGlzdGVuYWJsZSBhZGRyZXNzLgorICAgICAgRm9yIGluc3RhbmNlLCBsaXN0ZW5pbmcgb24gPGxpdGVyYWw+dGNwOmhvc3Q9MTI3LjAuMC4xPC9saXRlcmFsPgorICAgICAgbWlnaHQgcmVzdWx0IGluIHRoZSBjb25uZWN0YWJsZSBhZGRyZXNzCisgICAgICA8bGl0ZXJhbD50Y3A6aG9zdD0xMjcuMC4wLjEscG9ydD0zMDk1ODwvbGl0ZXJhbD4sCisgICAgICBsaXN0ZW5pbmcgb24gPGxpdGVyYWw+dW5peDp0bXBkaXI9L3RtcDwvbGl0ZXJhbD4KKyAgICAgIG1pZ2h0IHJlc3VsdCBpbiB0aGUgY29ubmVjdGFibGUgYWRkcmVzcworICAgICAgPGxpdGVyYWw+dW5peDphYnN0cmFjdD0vdG1wL2RidXMtVThPU2RtZjc8L2xpdGVyYWw+LCBvcgorICAgICAgbGlzdGVuaW5nIG9uIDxsaXRlcmFsPnVuaXg6cnVudGltZT15ZXM8L2xpdGVyYWw+CisgICAgICBtaWdodCByZXN1bHQgaW4gdGhlIGNvbm5lY3RhYmxlIGFkZHJlc3MKKyAgICAgIDxsaXRlcmFsPnVuaXg6cGF0aD0vcnVuL3VzZXIvMTIzNC9idXM8L2xpdGVyYWw+LgorICAgIDwvcGFyYT4KKyAgPC9zZWN0MT4KKworICA8c2VjdDEgaWQ9InRyYW5zcG9ydHMiPgorICAgIDx0aXRsZT5UcmFuc3BvcnRzPC90aXRsZT4KKyAgICA8cGFyYT4KKyAgICAgIFtGSVhNRSB3ZSBuZWVkIHRvIHNwZWNpZnkgaW4gZGV0YWlsIGVhY2ggdHJhbnNwb3J0IGFuZCBpdHMgcG9zc2libGUgYXJndW1lbnRzXQorCisgICAgICBDdXJyZW50IHRyYW5zcG9ydHMgaW5jbHVkZTogdW5peCBkb21haW4gc29ja2V0cyAoaW5jbHVkaW5nCisgICAgICBhYnN0cmFjdCBuYW1lc3BhY2Ugb24gbGludXgpLCBsYXVuY2hkLCBzeXN0ZW1kLCBUQ1AvSVAsIGFuIGV4ZWN1dGVkIHN1YnByb2Nlc3MgYW5kIGEgZGVidWcvdGVzdGluZyB0cmFuc3BvcnQKKyAgICAgIHVzaW5nIGluLXByb2Nlc3MgcGlwZXMuIEZ1dHVyZSBwb3NzaWJsZSB0cmFuc3BvcnRzIGluY2x1ZGUgb25lIHRoYXQKKyAgICAgIHR1bm5lbHMgb3ZlciBYMTEgcHJvdG9jb2wuCisgICAgPC9wYXJhPgorCisgICAgPHNlY3QyIGlkPSJ0cmFuc3BvcnRzLXVuaXgtZG9tYWluLXNvY2tldHMiPgorICAgICAgPHRpdGxlPlVuaXggRG9tYWluIFNvY2tldHM8L3RpdGxlPgorICAgICAgPHBhcmE+CisgICAgICAgIFVuaXggZG9tYWluIHNvY2tldHMgY2FuIGJlIGVpdGhlciBwYXRocyBpbiB0aGUgZmlsZSBzeXN0ZW0gb3Igb24gTGludXgKKyAgICAgICAga2VybmVscywgdGhleSBjYW4gYmUgYWJzdHJhY3Qgd2hpY2ggYXJlIHNpbWlsYXIgdG8gcGF0aHMgYnV0CisgICAgICAgIGRvIG5vdCBzaG93IHVwIGluIHRoZSBmaWxlIHN5c3RlbS4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIFdoZW4gYSBzb2NrZXQgaXMgb3BlbmVkIGJ5IHRoZSBELUJ1cyBsaWJyYXJ5IGl0IHRydW5jYXRlcyB0aGUgcGF0aAorICAgICAgICBuYW1lIHJpZ2h0IGJlZm9yZSB0aGUgZmlyc3QgdHJhaWxpbmcgTnVsIGJ5dGUuICBUaGlzIGlzIHRydWUgZm9yIGJvdGgKKyAgICAgICAgbm9ybWFsIHBhdGhzIGFuZCBhYnN0cmFjdCBwYXRocy4gIE5vdGUgdGhhdCB0aGlzIGlzIGEgZGVwYXJ0dXJlIGZyb20KKyAgICAgICAgcHJldmlvdXMgdmVyc2lvbnMgb2YgRC1CdXMgdGhhdCB3b3VsZCBjcmVhdGUgc29ja2V0cyB3aXRoIGEgZml4ZWQKKyAgICAgICAgbGVuZ3RoIHBhdGggbmFtZS4gIE5hbWVzIHdoaWNoIHdlcmUgc2hvcnRlciB0aGFuIHRoZSBmaXhlZCBsZW5ndGgKKyAgICAgICAgd291bGQgYmUgcGFkZGVkIGJ5IE51bCBieXRlcy4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBVbml4IGRvbWFpbiBzb2NrZXRzIGFyZSBub3QgYXZhaWxhYmxlIG9uIFdpbmRvd3MuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgVW5peCBhZGRyZXNzZXMgdGhhdCBzcGVjaWZ5IDxsaXRlcmFsPnBhdGg8L2xpdGVyYWw+IG9yCisgICAgICAgIDxsaXRlcmFsPmFic3RyYWN0PC9saXRlcmFsPiBhcmUgYm90aCBsaXN0ZW5hYmxlIGFuZCBjb25uZWN0YWJsZS4KKyAgICAgICAgVW5peCBhZGRyZXNzZXMgdGhhdCBzcGVjaWZ5IDxsaXRlcmFsPnRtcGRpcjwvbGl0ZXJhbD4KKyAgICAgICAgb3IgPGxpdGVyYWw+ZGlyPC9saXRlcmFsPiBhcmUgb25seQorICAgICAgICBsaXN0ZW5hYmxlOiB0aGUgY29ycmVzcG9uZGluZyBjb25uZWN0YWJsZSBhZGRyZXNzIHdpbGwgc3BlY2lmeQorICAgICAgICBlaXRoZXIgPGxpdGVyYWw+cGF0aDwvbGl0ZXJhbD4gb3IgPGxpdGVyYWw+YWJzdHJhY3Q8L2xpdGVyYWw+LgorICAgICAgICBTaW1pbGFybHksIFVuaXggYWRkcmVzc2VzIHRoYXQgc3BlY2lmeSA8bGl0ZXJhbD5ydW50aW1lPC9saXRlcmFsPgorICAgICAgICBhcmUgb25seSBsaXN0ZW5hYmxlLCBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgY29ubmVjdGFibGUgYWRkcmVzcworICAgICAgICB3aWxsIHNwZWNpZnkgPGxpdGVyYWw+cGF0aDwvbGl0ZXJhbD4uCisgICAgICA8L3BhcmE+CisgICAgICA8c2VjdDMgaWQ9InRyYW5zcG9ydHMtdW5peC1kb21haW4tc29ja2V0cy1hZGRyZXNzZXMiPgorICAgICAgICA8dGl0bGU+U2VydmVyIEFkZHJlc3MgRm9ybWF0PC90aXRsZT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgVW5peCBkb21haW4gc29ja2V0IGFkZHJlc3NlcyBhcmUgaWRlbnRpZmllZCBieSB0aGUgInVuaXg6IiBwcmVmaXgKKyAgICAgICAgICBhbmQgc3VwcG9ydCB0aGUgZm9sbG93aW5nIGtleS92YWx1ZSBwYWlyczoKKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8aW5mb3JtYWx0YWJsZT4KKyAgICAgICAgIDx0Z3JvdXAgY29scz0iMyI+CisgICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgPGVudHJ5Pk5hbWU8L2VudHJ5PgorICAgICAgICAgICAgPGVudHJ5PlZhbHVlczwvZW50cnk+CisgICAgICAgICAgICA8ZW50cnk+RGVzY3JpcHRpb248L2VudHJ5PgorICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgIDxlbnRyeT5wYXRoPC9lbnRyeT4KKyAgICAgICAgICAgIDxlbnRyeT4ocGF0aCk8L2VudHJ5PgorICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICBQYXRoIG9mIHRoZSB1bml4IGRvbWFpbiBzb2NrZXQuCisgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgIDwvcm93PgorICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICA8ZW50cnk+ZGlyPC9lbnRyeT4KKyAgICAgICAgICAgIDxlbnRyeT4ocGF0aCk8L2VudHJ5PgorICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICBEaXJlY3RvcnkgaW4gd2hpY2ggYSBzb2NrZXQgZmlsZSB3aXRoIGEgcmFuZG9tIGZpbGUgbmFtZQorICAgICAgICAgICAgICBzdGFydGluZyB3aXRoICdkYnVzLScgd2lsbCBiZSBjcmVhdGVkIGJ5IHRoZSBzZXJ2ZXIuIFRoaXMga2V5CisgICAgICAgICAgICAgIGNhbiBvbmx5IGJlIHVzZWQgaW4gc2VydmVyIGFkZHJlc3Nlcywgbm90IGluIGNsaWVudCBhZGRyZXNzZXM7CisgICAgICAgICAgICAgIHRoZSByZXN1bHRpbmcgY2xpZW50IGFkZHJlc3Mgd2lsbCBoYXZlIHRoZSAicGF0aCIga2V5IGluc3RlYWQuCisgICAgICAgICAgICAgIGJlIHNldC4KKyAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgIDxlbnRyeT50bXBkaXI8L2VudHJ5PgorICAgICAgICAgICAgPGVudHJ5PihwYXRoKTwvZW50cnk+CisgICAgICAgICAgICA8ZW50cnk+CisgICAgICAgICAgICAgIFRoZSBzYW1lIGFzICJkaXIiLCBleGNlcHQgdGhhdCBvbiBwbGF0Zm9ybXMgd2l0aAorICAgICAgICAgICAgICBhYnN0cmFjdCBzb2NrZXRzLCB0aGUgc2VydmVyIG1heSBhdHRlbXB0IHRvIGNyZWF0ZSBhbgorICAgICAgICAgICAgICBhYnN0cmFjdCBzb2NrZXQgd2hvc2UgbmFtZSBzdGFydHMgd2l0aCB0aGlzIGRpcmVjdG9yeSBpbnN0ZWFkCisgICAgICAgICAgICAgIG9mIGEgcGF0aC1iYXNlZCBzb2NrZXQuIFRoaXMga2V5IGNhbiBvbmx5IGJlIHVzZWQgaW4gc2VydmVyCisgICAgICAgICAgICAgIGFkZHJlc3Nlcywgbm90IGluIGNsaWVudCBhZGRyZXNzZXM7IHRoZSByZXN1bHRpbmcgY2xpZW50IGFkZHJlc3MKKyAgICAgICAgICAgICAgd2lsbCBoYXZlIHRoZSAiYWJzdHJhY3QiIG9yICJwYXRoIiBrZXkgaW5zdGVhZC4KKyAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgIDxlbnRyeT5hYnN0cmFjdDwvZW50cnk+CisgICAgICAgICAgICA8ZW50cnk+KHN0cmluZyk8L2VudHJ5PgorICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICBVbmlxdWUgc3RyaW5nIGluIHRoZSBhYnN0cmFjdCBuYW1lc3BhY2UsIG9mdGVuIHN5bnRhY3RpY2FsbHkKKyAgICAgICAgICAgICAgcmVzZW1ibGluZyBhIHBhdGggYnV0IHVuY29ubmVjdGVkIHRvIHRoZSBmaWxlc3lzdGVtIG5hbWVzcGFjZS4KKyAgICAgICAgICAgICAgVGhpcyBrZXkgaXMgb25seSBzdXBwb3J0ZWQgb24gcGxhdGZvcm1zIHdpdGggYWJzdHJhY3QgVW5peAorICAgICAgICAgICAgICBzb2NrZXRzLCBvZiB3aGljaCBMaW51eCBpcyB0aGUgb25seSBrbm93biBleGFtcGxlLgorICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICA8cm93PgorICAgICAgICAgICAgPGVudHJ5PnJ1bnRpbWU8L2VudHJ5PgorICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPnllczwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgPGVudHJ5PklmIGdpdmVuLCBUaGlzIGtleSBjYW4gb25seSBiZSB1c2VkIGluIHNlcnZlciBhZGRyZXNzZXMsIG5vdCBpbiBjbGllbnQgYWRkcmVzc2VzLiBJZiBzZXQsIGl0cyB2YWx1ZSBtdXN0IGJlIDxsaXRlcmFsPnllczwvbGl0ZXJhbD4uIFRoaXMgaXMgdHlwaWNhbGx5IHVzZWQgaW4gYW4gYWRkcmVzcyBzdHJpbmcgbGlrZSA8bGl0ZXJhbD51bml4OnJ1bnRpbWU9eWVzO3VuaXg6dG1wZGlyPS90bXA8L2xpdGVyYWw+IHNvIHRoYXQgdGhlcmUgY2FuIGJlIGEgZmFsbGJhY2sgaWYgPGxpdGVyYWw+WERHX1JVTlRJTUVfRElSPC9saXRlcmFsPiBpcyBub3Qgc2V0LjwvZW50cnk+CisgICAgICAgICAgPC9yb3c+CisgICAgICAgIDwvdGJvZHk+CisgICAgICAgIDwvdGdyb3VwPgorICAgICAgIDwvaW5mb3JtYWx0YWJsZT4KKyAgICAgICA8cGFyYT4KKyAgICAgICAgIEV4YWN0bHkgb25lIG9mIHRoZSBrZXlzIDxsaXRlcmFsPnBhdGg8L2xpdGVyYWw+LAorICAgICAgICAgPGxpdGVyYWw+YWJzdHJhY3Q8L2xpdGVyYWw+LCA8bGl0ZXJhbD5ydW50aW1lPC9saXRlcmFsPiwKKyAgICAgICAgIDxsaXRlcmFsPmRpcjwvbGl0ZXJhbD4gb3IgPGxpdGVyYWw+dG1wZGlyPC9saXRlcmFsPiBtdXN0IGJlIHByb3ZpZGVkLgorICAgICAgIDwvcGFyYT4KKyAgICAgIDwvc2VjdDM+CisgICAgPC9zZWN0Mj4KKyAgICA8c2VjdDIgaWQ9InRyYW5zcG9ydHMtbGF1bmNoZCI+CisgICAgICA8dGl0bGU+bGF1bmNoZDwvdGl0bGU+CisgICAgICA8cGFyYT4KKyAgICAgICAgbGF1bmNoZCBpcyBhbiBvcGVuLXNvdXJjZSBzZXJ2ZXIgbWFuYWdlbWVudCBzeXN0ZW0gdGhhdCByZXBsYWNlcyBpbml0LCBpbmV0ZAorICAgICAgICBhbmQgY3JvbiBvbiBBcHBsZSBNYWMgT1MgWCB2ZXJzaW9ucyAxMC40IGFuZCBhYm92ZS4gSXQgcHJvdmlkZXMgYSBjb21tb24gc2Vzc2lvbgorICAgICAgICBidXMgYWRkcmVzcyBmb3IgZWFjaCB1c2VyIGFuZCBkZXByZWNhdGVzIHRoZSBYMTEtZW5hYmxlZCBELUJ1cyBsYXVuY2hlciBvbiBPU1guCisgICAgICA8L3BhcmE+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBsYXVuY2hkIGFsbG9jYXRlcyBhIHNvY2tldCBhbmQgcHJvdmlkZXMgaXQgd2l0aCB0aGUgdW5peCBwYXRoIHRocm91Z2ggdGhlCisgICAgICAgIERCVVNfTEFVTkNIRF9TRVNTSU9OX0JVU19TT0NLRVQgdmFyaWFibGUgaW4gbGF1bmNoZCdzIGVudmlyb25tZW50LiBFdmVyeSBwcm9jZXNzCisgICAgICAgIHNwYXduZWQgYnkgbGF1bmNoZCAob3IgZGJ1cy1kYWVtb24sIGlmIGl0IHdhcyBzdGFydGVkIGJ5IGxhdW5jaGQpIGNhbiBhY2Nlc3MKKyAgICAgICAgaXQgdGhyb3VnaCBpdHMgZW52aXJvbm1lbnQuCisgICAgICAgIE90aGVyIHByb2Nlc3NlcyBjYW4gcXVlcnkgZm9yIHRoZSBsYXVuY2hkIHNvY2tldCBieSBleGVjdXRpbmc6CisgICAgICAgICQgbGF1bmNoY3RsIGdldGVudiBEQlVTX0xBVU5DSERfU0VTU0lPTl9CVVNfU09DS0VUCisgICAgICAgIFRoaXMgaXMgbm9ybWFsbHkgZG9uZSBieSB0aGUgRC1CdXMgY2xpZW50IGxpYnJhcnkgc28gZG9lc24ndCBoYXZlIHRvIGJlIGRvbmUKKyAgICAgICAgbWFudWFsbHkuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgbGF1bmNoZCBpcyBub3QgYXZhaWxhYmxlIG9uIE1pY3Jvc29mdCBXaW5kb3dzLgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIGxhdW5jaGQgYWRkcmVzc2VzIGFyZSBsaXN0ZW5hYmxlIGFuZCBjb25uZWN0YWJsZS4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxzZWN0MyBpZD0idHJhbnNwb3J0cy1sYXVuY2hkLWFkZHJlc3NlcyI+CisgICAgICAgIDx0aXRsZT5TZXJ2ZXIgQWRkcmVzcyBGb3JtYXQ8L3RpdGxlPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBsYXVuY2hkIGFkZHJlc3NlcyBhcmUgaWRlbnRpZmllZCBieSB0aGUgImxhdW5jaGQ6IiBwcmVmaXgKKyAgICAgICAgICBhbmQgc3VwcG9ydCB0aGUgZm9sbG93aW5nIGtleS92YWx1ZSBwYWlyczoKKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8aW5mb3JtYWx0YWJsZT4KKyAgICAgICAgIDx0Z3JvdXAgY29scz0iMyI+CisgICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgPGVudHJ5Pk5hbWU8L2VudHJ5PgorICAgICAgICAgICAgPGVudHJ5PlZhbHVlczwvZW50cnk+CisgICAgICAgICAgICA8ZW50cnk+RGVzY3JpcHRpb248L2VudHJ5PgorICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgIDxlbnRyeT5lbnY8L2VudHJ5PgorICAgICAgICAgICAgPGVudHJ5PihlbnZpcm9ubWVudCB2YXJpYWJsZSk8L2VudHJ5PgorICAgICAgICAgICAgPGVudHJ5PnBhdGggb2YgdGhlIHVuaXggZG9tYWluIHNvY2tldCBmb3IgdGhlIGxhdW5jaGQgY3JlYXRlZCBkYnVzLWRhZW1vbi48L2VudHJ5PgorICAgICAgICAgIDwvcm93PgorICAgICAgICA8L3Rib2R5PgorICAgICAgICA8L3Rncm91cD4KKyAgICAgICA8L2luZm9ybWFsdGFibGU+CisgICAgICAgPHBhcmE+CisgICAgICAgICBUaGUgPGxpdGVyYWw+ZW52PC9saXRlcmFsPiBrZXkgaXMgcmVxdWlyZWQuCisgICAgICAgPC9wYXJhPgorICAgICAgPC9zZWN0Mz4KKyAgICA8L3NlY3QyPgorICAgIDxzZWN0MiBpZD0idHJhbnNwb3J0cy1zeXN0ZW1kIj4KKyAgICAgIDx0aXRsZT5zeXN0ZW1kPC90aXRsZT4KKyAgICAgIDxwYXJhPgorICAgICAgICBzeXN0ZW1kIGlzIGFuIG9wZW4tc291cmNlIHNlcnZlciBtYW5hZ2VtZW50IHN5c3RlbSB0aGF0CisgICAgICAgIHJlcGxhY2VzIGluaXQgYW5kIGluZXRkIG9uIG5ld2VyIExpbnV4IHN5c3RlbXMuIEl0IHN1cHBvcnRzCisgICAgICAgIHNvY2tldCBhY3RpdmF0aW9uLiBUaGUgRC1CdXMgc3lzdGVtZCB0cmFuc3BvcnQgaXMgdXNlZCB0byBhY3F1aXJlCisgICAgICAgIHNvY2tldCBhY3RpdmF0aW9uIGZpbGUgZGVzY3JpcHRvcnMgZnJvbSBzeXN0ZW1kIGFuZCB1c2UgdGhlbQorICAgICAgICBhcyBELUJ1cyB0cmFuc3BvcnQgd2hlbiB0aGUgY3VycmVudCBwcm9jZXNzIGlzIHNwYXduZWQgYnkKKyAgICAgICAgc29ja2V0IGFjdGl2YXRpb24gZnJvbSBpdC4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBUaGUgc3lzdGVtZCB0cmFuc3BvcnQgYWNjZXB0cyBvbmx5IG9uZSBvciBtb3JlIFVuaXggZG9tYWluIG9yCisgICAgICAgIFRDUCBzdHJlYW1zIHNvY2tldHMgcGFzc2VkIGluIHZpYSBzb2NrZXQgYWN0aXZhdGlvbi4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBUaGUgc3lzdGVtZCB0cmFuc3BvcnQgaXMgbm90IGF2YWlsYWJsZSBvbiBub24tTGludXggb3BlcmF0aW5nIHN5c3RlbXMuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIHN5c3RlbWQgdHJhbnNwb3J0IGRlZmluZXMgbm8gcGFyYW1ldGVyIGtleXMuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgc3lzdGVtZCBhZGRyZXNzZXMgYXJlIGxpc3RlbmFibGUsIGJ1dCBub3QgY29ubmVjdGFibGUuIFRoZQorICAgICAgICBjb3JyZXNwb25kaW5nIGNvbm5lY3RhYmxlIGFkZHJlc3MgaXMgdGhlIDxsaXRlcmFsPnVuaXg8L2xpdGVyYWw+CisgICAgICAgIG9yIDxsaXRlcmFsPnRjcDwvbGl0ZXJhbD4gYWRkcmVzcyBvZiB0aGUgc29ja2V0LgorICAgICAgPC9wYXJhPgorICAgIDwvc2VjdDI+CisgICAgPHNlY3QyIGlkPSJ0cmFuc3BvcnRzLXRjcC1zb2NrZXRzIj4KKyAgICAgIDx0aXRsZT5UQ1AgU29ja2V0czwvdGl0bGU+CisgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIHRjcCB0cmFuc3BvcnQgcHJvdmlkZXMgVENQL0lQIGJhc2VkIGNvbm5lY3Rpb25zIGJldHdlZW4gY2xpZW50cworICAgICAgICBsb2NhdGVkIG9uIHRoZSBzYW1lIG9yIGRpZmZlcmVudCBob3N0cy4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBVc2luZyB0Y3AgdHJhbnNwb3J0IHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgc2VjdXJlIGF1dGhlbnRpZmljYXRpb24gbWVjaGFuaXNtdXMKKyAgICAgICAgb3ZlciBhIG5ldHdvcmsgaXMgdW5zZWN1cmUuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgT24gV2luZG93cyBhbmQgbW9zdCBVbml4IHBsYXRmb3JtcywgdGhlIFRDUCBzdGFjayBpcyB1bmFibGUgdG8gdHJhbnNmZXIKKyAgICAgICAgY3JlZGVudGlhbHMgb3ZlciBhIFRDUCBjb25uZWN0aW9uLCBzbyB0aGUgRVhURVJOQUwgYXV0aGVudGljYXRpb24KKyAgICAgICAgbWVjaGFuaXNtIGRvZXMgbm90IHdvcmsgZm9yIHRoaXMgdHJhbnNwb3J0LgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIEFsbCA8bGl0ZXJhbD50Y3A8L2xpdGVyYWw+IGFkZHJlc3NlcyBhcmUgbGlzdGVuYWJsZS4KKyAgICAgICAgPGxpdGVyYWw+dGNwPC9saXRlcmFsPiBhZGRyZXNzZXMgaW4gd2hpY2ggYm90aAorICAgICAgICA8bGl0ZXJhbD5ob3N0PC9saXRlcmFsPiBhbmQgPGxpdGVyYWw+cG9ydDwvbGl0ZXJhbD4gYXJlCisgICAgICAgIHNwZWNpZmllZCwgYW5kIDxsaXRlcmFsPnBvcnQ8L2xpdGVyYWw+IGlzIG5vbi16ZXJvLAorICAgICAgICBhcmUgYWxzbyBjb25uZWN0YWJsZS4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxzZWN0MyBpZD0idHJhbnNwb3J0cy10Y3Atc29ja2V0cy1hZGRyZXNzZXMiPgorICAgICAgICA8dGl0bGU+U2VydmVyIEFkZHJlc3MgRm9ybWF0PC90aXRsZT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICBUQ1AvSVAgc29ja2V0IGFkZHJlc3NlcyBhcmUgaWRlbnRpZmllZCBieSB0aGUgInRjcDoiIHByZWZpeAorICAgICAgICAgYW5kIHN1cHBvcnQgdGhlIGZvbGxvd2luZyBrZXkvdmFsdWUgcGFpcnM6CisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPGluZm9ybWFsdGFibGU+CisgICAgICAgICA8dGdyb3VwIGNvbHM9IjMiPgorICAgICAgICAgIDx0aGVhZD4KKyAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgIDxlbnRyeT5OYW1lPC9lbnRyeT4KKyAgICAgICAgICAgIDxlbnRyeT5WYWx1ZXM8L2VudHJ5PgorICAgICAgICAgICAgPGVudHJ5PkRlc2NyaXB0aW9uPC9lbnRyeT4KKyAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgPC90aGVhZD4KKyAgICAgICAgICA8dGJvZHk+CisgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICA8ZW50cnk+aG9zdDwvZW50cnk+CisgICAgICAgICAgICA8ZW50cnk+KHN0cmluZyk8L2VudHJ5PgorICAgICAgICAgICAgPGVudHJ5PkROUyBuYW1lIG9yIElQIGFkZHJlc3M8L2VudHJ5PgorICAgICAgICAgIDwvcm93PgorICAgICAgICAgIDxyb3c+CisgICAgICAgICAgIDxlbnRyeT5iaW5kPC9lbnRyeT4KKyAgICAgICAgICAgPGVudHJ5PihzdHJpbmcpPC9lbnRyeT4KKyAgICAgICAgICAgPGVudHJ5PlVzZWQgaW4gYSBsaXN0ZW5hYmxlIGFkZHJlc3MgdG8gY29uZmlndXJlIHRoZSBpbnRlcmZhY2UKKyAgICAgICAgICAgIG9uIHdoaWNoIHRoZSBzZXJ2ZXIgd2lsbCBsaXN0ZW46IGVpdGhlciB0aGUgSVAgYWRkcmVzcyBvZiBvbmUgb2YKKyAgICAgICAgICAgIHRoZSBsb2NhbCBtYWNoaW5lJ3MgaW50ZXJmYWNlcyAobW9zdCBjb21tb25seSA8bGl0ZXJhbD4xMjcuMC4wLjEKKyAgICAgICAgICAgIDwvbGl0ZXJhbD4pLCBvciBhIEROUyBuYW1lIHRoYXQgcmVzb2x2ZXMgdG8gb25lIG9mIHRob3NlIElQCisgICAgICAgICAgICBhZGRyZXNzZXMsIG9yICcqJyB0byBsaXN0ZW4gb24gYWxsIGludGVyZmFjZXMgc2ltdWx0YW5lb3VzbHkuCisgICAgICAgICAgICBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCBpcyB0aGUgc2FtZSB2YWx1ZSBhcyAiaG9zdCIuCisgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgPGVudHJ5PnBvcnQ8L2VudHJ5PgorICAgICAgICAgICA8ZW50cnk+KG51bWJlcik8L2VudHJ5PgorICAgICAgICAgICA8ZW50cnk+VGhlIHRjcCBwb3J0IHRoZSBzZXJ2ZXIgd2lsbCBvcGVuLiBBIHplcm8gdmFsdWUgbGV0IHRoZSBzZXJ2ZXIKKyAgICAgICAgICAgIGNob29zZSBhIGZyZWUgcG9ydCBwcm92aWRlZCBmcm9tIHRoZSB1bmRlcmxheWluZyBvcGVyYXRpbmcgc3lzdGVtLgorICAgICAgICAgICAgbGliZGJ1cyBpcyBhYmxlIHRvIHJldHJpZXZlIHRoZSByZWFsIHVzZWQgcG9ydCBmcm9tIHRoZSBzZXJ2ZXIuCisgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgPGVudHJ5PmZhbWlseTwvZW50cnk+CisgICAgICAgICAgIDxlbnRyeT4oc3RyaW5nKTwvZW50cnk+CisgICAgICAgICAgIDxlbnRyeT5JZiBzZXQsIHByb3ZpZGUgdGhlIHR5cGUgb2Ygc29ja2V0IGZhbWlseSBlaXRoZXIgImlwdjQiIG9yICJpcHY2Ii4gSWYgdW5zZXQsIHRoZSBmYW1pbHkgaXMgdW5zcGVjaWZpZWQuPC9lbnRyeT4KKyAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgIDwvdGJvZHk+CisgICAgICAgIDwvdGdyb3VwPgorICAgICAgIDwvaW5mb3JtYWx0YWJsZT4KKyAgICAgIDwvc2VjdDM+CisgICAgPC9zZWN0Mj4KKyAgICA8c2VjdDIgaWQ9InRyYW5zcG9ydHMtbm9uY2UtdGNwLXNvY2tldHMiPgorICAgICAgPHRpdGxlPk5vbmNlLXNlY3VyZWQgVENQIFNvY2tldHM8L3RpdGxlPgorICAgICAgPHBhcmE+CisgICAgICAgIFRoZSBub25jZS10Y3AgdHJhbnNwb3J0IHByb3ZpZGVzIGEgc2VjdXJlZCBUQ1AgdHJhbnNwb3J0LCB1c2luZyBhCisgICAgICAgIHNpbXBsZSBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc20gdG8gZW5zdXJlIHRoYXQgb25seSBjbGllbnRzIHdpdGggcmVhZAorICAgICAgICBhY2Nlc3MgdG8gYSBjZXJ0YWluIGxvY2F0aW9uIGluIHRoZSBmaWxlc3lzdGVtIGNhbiBjb25uZWN0IHRvIHRoZSBzZXJ2ZXIuCisgICAgICAgIFRoZSBzZXJ2ZXIgd3JpdGVzIGEgc2VjcmV0LCB0aGUgbm9uY2UsIHRvIGEgZmlsZSBhbmQgYW4gaW5jb21pbmcgY2xpZW50CisgICAgICAgIGNvbm5lY3Rpb24gaXMgb25seSBhY2NlcHRlZCBpZiB0aGUgY2xpZW50IHNlbmRzIHRoZSBub25jZSByaWdodCBhZnRlcgorICAgICAgICB0aGUgY29ubmVjdC4gVGhlIG5vbmNlIG1lY2hhbmlzbSByZXF1aXJlcyBubyBzZXR1cCBhbmQgaXMgb3J0aG9nb25hbCB0bworICAgICAgICB0aGUgaGlnaGVyLWxldmVsIGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbXMgZGVzY3JpYmVkIGluIHRoZQorICAgICAgICBBdXRoZW50aWNhdGlvbiBzZWN0aW9uLgorICAgICAgPC9wYXJhPgorCisgICAgICA8cGFyYT4KKyAgICAgICAgT24gc3RhcnQsIHRoZSBzZXJ2ZXIgZ2VuZXJhdGVzIGEgcmFuZG9tIDE2IGJ5dGUgbm9uY2UgYW5kIHdyaXRlcyBpdAorICAgICAgICB0byBhIGZpbGUgaW4gdGhlIHVzZXIncyB0ZW1wb3JhcnkgZGlyZWN0b3J5LiBUaGUgbm9uY2UgZmlsZSBsb2NhdGlvbgorICAgICAgICBpcyBwdWJsaXNoZWQgYXMgcGFydCBvZiB0aGUgc2VydmVyJ3MgRC1CdXMgYWRkcmVzcyB1c2luZyB0aGUKKyAgICAgICAgIm5vbmNlZmlsZSIga2V5LXZhbHVlIHBhaXIuCisKKyAgICAgICAgQWZ0ZXIgYW4gYWNjZXB0LCB0aGUgc2VydmVyIHJlYWRzIDE2IGJ5dGVzIGZyb20gdGhlIHNvY2tldC4gSWYgdGhlCisgICAgICAgIHJlYWQgYnl0ZXMgZG8gbm90IG1hdGNoIHRoZSBub25jZSBzdG9yZWQgaW4gdGhlIG5vbmNlIGZpbGUsIHRoZQorICAgICAgICBzZXJ2ZXIgTVVTVCBpbW1lZGlhdGVseSBkcm9wIHRoZSBjb25uZWN0aW9uLgorICAgICAgICBJZiB0aGUgbm9uY2UgbWF0Y2ggdGhlIHJlY2VpdmVkIGJ5dGUgc2VxdWVuY2UsIHRoZSBjbGllbnQgaXMgYWNjZXB0ZWQKKyAgICAgICAgYW5kIHRoZSB0cmFuc3BvcnQgYmVoYXZlcyBsaWtlIGFuIHVuc2VjdXJlZCB0Y3AgdHJhbnNwb3J0LgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIEFmdGVyIGEgc3VjY2Vzc2Z1bCBjb25uZWN0IHRvIHRoZSBzZXJ2ZXIgc29ja2V0LCB0aGUgY2xpZW50IE1VU1QgcmVhZAorICAgICAgICB0aGUgbm9uY2UgZnJvbSB0aGUgZmlsZSBwdWJsaXNoZWQgYnkgdGhlIHNlcnZlciB2aWEgdGhlIG5vbmNlZmlsZT0KKyAgICAgICAga2V5LXZhbHVlIHBhaXIgYW5kIHNlbmQgaXQgb3ZlciB0aGUgc29ja2V0LiBBZnRlciB0aGF0LCB0aGUKKyAgICAgICAgdHJhbnNwb3J0IGJlaGF2ZXMgbGlrZSBhbiB1bnNlY3VyZWQgdGNwIHRyYW5zcG9ydC4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBBbGwgbm9uY2UtdGNwIGFkZHJlc3NlcyBhcmUgbGlzdGVuYWJsZS4gbm9uY2UtdGNwIGFkZHJlc3NlcyBpbiB3aGljaAorICAgICAgICA8bGl0ZXJhbD5ob3N0PC9saXRlcmFsPiwgPGxpdGVyYWw+cG9ydDwvbGl0ZXJhbD4gYW5kCisgICAgICAgIDxsaXRlcmFsPm5vbmNlZmlsZTwvbGl0ZXJhbD4gYXJlIGFsbCBzcGVjaWZpZWQsCisgICAgICAgIGFuZCA8bGl0ZXJhbD5wb3J0PC9saXRlcmFsPiBpcyBub256ZXJvLCBhcmUgYWxzbyBjb25uZWN0YWJsZS4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxzZWN0MyBpZD0idHJhbnNwb3J0cy1ub25jZS10Y3Atc29ja2V0cy1hZGRyZXNzZXMiPgorICAgICAgICA8dGl0bGU+U2VydmVyIEFkZHJlc3MgRm9ybWF0PC90aXRsZT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICBOb25jZSBUQ1AvSVAgc29ja2V0IGFkZHJlc3NlcyB1c2VzIHRoZSAibm9uY2UtdGNwOiIgcHJlZml4CisgICAgICAgICBhbmQgc3VwcG9ydCB0aGUgZm9sbG93aW5nIGtleS92YWx1ZSBwYWlyczoKKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8aW5mb3JtYWx0YWJsZT4KKyAgICAgICAgIDx0Z3JvdXAgY29scz0iMyI+CisgICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgPGVudHJ5Pk5hbWU8L2VudHJ5PgorICAgICAgICAgICAgPGVudHJ5PlZhbHVlczwvZW50cnk+CisgICAgICAgICAgICA8ZW50cnk+RGVzY3JpcHRpb248L2VudHJ5PgorICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgIDxlbnRyeT5ob3N0PC9lbnRyeT4KKyAgICAgICAgICAgIDxlbnRyeT4oc3RyaW5nKTwvZW50cnk+CisgICAgICAgICAgICA8ZW50cnk+RE5TIG5hbWUgb3IgSVAgYWRkcmVzczwvZW50cnk+CisgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgPGVudHJ5PmJpbmQ8L2VudHJ5PgorICAgICAgICAgICA8ZW50cnk+KHN0cmluZyk8L2VudHJ5PgorICAgICAgICAgICA8ZW50cnk+VGhlIHNhbWUgYXMgZm9yIHRjcDogYWRkcmVzc2VzCisgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgPGVudHJ5PnBvcnQ8L2VudHJ5PgorICAgICAgICAgICA8ZW50cnk+KG51bWJlcik8L2VudHJ5PgorICAgICAgICAgICA8ZW50cnk+VGhlIHRjcCBwb3J0IHRoZSBzZXJ2ZXIgd2lsbCBvcGVuLiBBIHplcm8gdmFsdWUgbGV0IHRoZSBzZXJ2ZXIKKyAgICAgICAgICAgIGNob29zZSBhIGZyZWUgcG9ydCBwcm92aWRlZCBmcm9tIHRoZSB1bmRlcmxheWluZyBvcGVyYXRpbmcgc3lzdGVtLgorICAgICAgICAgICAgbGliZGJ1cyBpcyBhYmxlIHRvIHJldHJpZXZlIHRoZSByZWFsIHVzZWQgcG9ydCBmcm9tIHRoZSBzZXJ2ZXIuCisgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgPGVudHJ5PmZhbWlseTwvZW50cnk+CisgICAgICAgICAgIDxlbnRyeT4oc3RyaW5nKTwvZW50cnk+CisgICAgICAgICAgIDxlbnRyeT5JZiBzZXQsIHByb3ZpZGUgdGhlIHR5cGUgb2Ygc29ja2V0IGZhbWlseSBlaXRoZXIgImlwdjQiIG9yICJpcHY2Ii4gSWYgdW5zZXQsIHRoZSBmYW1pbHkgaXMgdW5zcGVjaWZpZWQuPC9lbnRyeT4KKyAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICA8cm93PgorICAgICAgICAgICA8ZW50cnk+bm9uY2VmaWxlPC9lbnRyeT4KKyAgICAgICAgICAgPGVudHJ5PihwYXRoKTwvZW50cnk+CisgICAgICAgICAgIDxlbnRyeT5GaWxlIGxvY2F0aW9uIGNvbnRhaW5pbmcgdGhlIHNlY3JldC4KKyAgICAgICAgICAgICBUaGlzIGlzIG9ubHkgbWVhbmluZ2Z1bCBpbiBjb25uZWN0YWJsZSBhZGRyZXNzZXM6CisgICAgICAgICAgICAgYSBsaXN0ZW5pbmcgRC1CdXMgc2VydmVyIHRoYXQgb2ZmZXJzIHRoaXMgdHJhbnNwb3J0CisgICAgICAgICAgICAgd2lsbCBhbHdheXMgY3JlYXRlIGEgbmV3IG5vbmNlIGZpbGUuPC9lbnRyeT4KKyAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgIDwvdGJvZHk+CisgICAgICAgIDwvdGdyb3VwPgorICAgICAgIDwvaW5mb3JtYWx0YWJsZT4KKyAgICAgIDwvc2VjdDM+CisgICAgPC9zZWN0Mj4KKyAgICA8c2VjdDIgaWQ9InRyYW5zcG9ydHMtZXhlYyI+CisgICAgICA8dGl0bGU+RXhlY3V0ZWQgU3VicHJvY2Vzc2VzIG9uIFVuaXg8L3RpdGxlPgorICAgICAgPHBhcmE+CisgICAgICAgIFRoaXMgdHJhbnNwb3J0IGZvcmtzIG9mZiBhIHByb2Nlc3MgYW5kIGNvbm5lY3RzIGl0cyBzdGFuZGFyZAorICAgICAgICBpbnB1dCBhbmQgc3RhbmRhcmQgb3V0cHV0IHdpdGggYW4gYW5vbnltb3VzIFVuaXggZG9tYWluCisgICAgICAgIHNvY2tldC4gVGhpcyBzb2NrZXQgaXMgdGhlbiB1c2VkIGZvciBjb21tdW5pY2F0aW9uIGJ5IHRoZQorICAgICAgICB0cmFuc3BvcnQuIFRoaXMgdHJhbnNwb3J0IG1heSBiZSB1c2VkIHRvIHVzZSBvdXQtb2YtcHJvY2VzcworICAgICAgICBmb3J3YXJkZXIgcHJvZ3JhbXMgYXMgYmFzaXMgZm9yIHRoZSBELUJ1cyBwcm90b2NvbC4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBUaGUgZm9ya2VkIHByb2Nlc3Mgd2lsbCBpbmhlcml0IHRoZSBzdGFuZGFyZCBlcnJvciBvdXRwdXQgYW5kCisgICAgICAgIHByb2Nlc3MgZ3JvdXAgZnJvbSB0aGUgcGFyZW50IHByb2Nlc3MuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgRXhlY3V0ZWQgc3VicHJvY2Vzc2VzIGFyZSBub3QgYXZhaWxhYmxlIG9uIFdpbmRvd3MuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgPGxpdGVyYWw+dW5peGV4ZWM8L2xpdGVyYWw+IGFkZHJlc3NlcyBhcmUgY29ubmVjdGFibGUsIGJ1dCBhcmUgbm90CisgICAgICAgIGxpc3RlbmFibGUuCisgICAgICA8L3BhcmE+CisgICAgICA8c2VjdDMgaWQ9InRyYW5zcG9ydHMtZXhlYy1hZGRyZXNzZXMiPgorICAgICAgICA8dGl0bGU+U2VydmVyIEFkZHJlc3MgRm9ybWF0PC90aXRsZT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgRXhlY3V0ZWQgc3VicHJvY2VzcyBhZGRyZXNzZXMgYXJlIGlkZW50aWZpZWQgYnkgdGhlICJ1bml4ZXhlYzoiIHByZWZpeAorICAgICAgICAgIGFuZCBzdXBwb3J0IHRoZSBmb2xsb3dpbmcga2V5L3ZhbHVlIHBhaXJzOgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxpbmZvcm1hbHRhYmxlPgorICAgICAgICAgPHRncm91cCBjb2xzPSIzIj4KKyAgICAgICAgICA8dGhlYWQ+CisgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICA8ZW50cnk+TmFtZTwvZW50cnk+CisgICAgICAgICAgICA8ZW50cnk+VmFsdWVzPC9lbnRyeT4KKyAgICAgICAgICAgIDxlbnRyeT5EZXNjcmlwdGlvbjwvZW50cnk+CisgICAgICAgICAgIDwvcm93PgorICAgICAgICAgIDwvdGhlYWQ+CisgICAgICAgICAgPHRib2R5PgorICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgPGVudHJ5PnBhdGg8L2VudHJ5PgorICAgICAgICAgICAgPGVudHJ5PihwYXRoKTwvZW50cnk+CisgICAgICAgICAgICA8ZW50cnk+UGF0aCBvZiB0aGUgYmluYXJ5IHRvIGV4ZWN1dGUsIGVpdGhlciBhbiBhYnNvbHV0ZQorICAgICAgICAgICAgcGF0aCBvciBhIGJpbmFyeSBuYW1lIHRoYXQgaXMgc2VhcmNoZWQgZm9yIGluIHRoZSBkZWZhdWx0CisgICAgICAgICAgICBzZWFyY2ggcGF0aCBvZiB0aGUgT1MuIFRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIGZpcnN0CisgICAgICAgICAgICBhcmd1bWVudCBvZiBleGVjbHAoKS4gVGhpcyBrZXkgaXMgbWFuZGF0b3J5LjwvZW50cnk+CisgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgIDxlbnRyeT5hcmd2MDwvZW50cnk+CisgICAgICAgICAgICA8ZW50cnk+KHN0cmluZyk8L2VudHJ5PgorICAgICAgICAgICAgPGVudHJ5PlRoZSBwcm9ncmFtIG5hbWUgdG8gdXNlIHdoZW4gZXhlY3V0aW5nIHRoZQorICAgICAgICAgICAgYmluYXJ5LiBJZiBvbWl0dGVkIHRoZSBzYW1lIHZhbHVlIGFzIHNwZWNpZmllZCBmb3IgcGF0aD0KKyAgICAgICAgICAgIHdpbGwgYmUgdXNlZC4gVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgc2Vjb25kIGFyZ3VtZW50IG9mCisgICAgICAgICAgICBleGVjbHAoKS48L2VudHJ5PgorICAgICAgICAgIDwvcm93PgorICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICA8ZW50cnk+YXJndjEsIGFyZ3YyLCAuLi48L2VudHJ5PgorICAgICAgICAgICAgPGVudHJ5PihzdHJpbmcpPC9lbnRyeT4KKyAgICAgICAgICAgIDxlbnRyeT5Bcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgYmluYXJ5LiBUaGlzIGNvcnJlc3BvbmRzCisgICAgICAgICAgICB0byB0aGUgdGhpcmQgYW5kIGxhdGVyIGFyZ3VtZW50cyBvZiBleGVjbHAoKS4gSWYgYQorICAgICAgICAgICAgc3BlY2lmaWMgYXJndlggaXMgbm90IHNwZWNpZmllZCBubyBmdXJ0aGVyIGFyZ3ZZIGZvciBZID4gWAorICAgICAgICAgICAgYXJlIHRha2VuIGludG8gYWNjb3VudC48L2VudHJ5PgorICAgICAgICAgIDwvcm93PgorICAgICAgICA8L3Rib2R5PgorICAgICAgICA8L3Rncm91cD4KKyAgICAgICA8L2luZm9ybWFsdGFibGU+CisgICAgICA8L3NlY3QzPgorICAgIDwvc2VjdDI+CisgICA8L3NlY3QxPgorICAgPHNlY3QxIGlkPSJtZXRhLXRyYW5zcG9ydHMiPgorICAgIDx0aXRsZT5NZXRhIFRyYW5zcG9ydHM8L3RpdGxlPgorICAgIDxwYXJhPgorICAgICAgTWV0YSB0cmFuc3BvcnRzIGFyZSBhIGtpbmQgb2YgdHJhbnNwb3J0IHdpdGggc3BlY2lhbCBlbmhhbmNlbWVudHMgb3IKKyAgICAgIGJlaGF2aW9yLiBDdXJyZW50bHkgYXZhaWxhYmxlIG1ldGEgdHJhbnNwb3J0cyBpbmNsdWRlOiBhdXRvbGF1bmNoCisgICAgPC9wYXJhPgorCisgICAgPHNlY3QyIGlkPSJtZXRhLXRyYW5zcG9ydHMtYXV0b2xhdW5jaCI+CisgICAgIDx0aXRsZT5BdXRvbGF1bmNoPC90aXRsZT4KKyAgICAgPHBhcmE+VGhlIGF1dG9sYXVuY2ggdHJhbnNwb3J0IHByb3ZpZGVzIGEgd2F5IGZvciBkYnVzIGNsaWVudHMgdG8gYXV0b2RldGVjdAorICAgICAgIGEgcnVubmluZyBkYnVzIHNlc3Npb24gYnVzIGFuZCB0byBhdXRvbGF1bmNoIGEgc2Vzc2lvbiBidXMgaWYgbm90IHByZXNlbnQuCisgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBPbiBVbml4LCA8bGl0ZXJhbD5hdXRvbGF1bmNoPC9saXRlcmFsPiBhZGRyZXNzZXMgYXJlIGNvbm5lY3RhYmxlLAorICAgICAgICBidXQgbm90IGxpc3RlbmFibGUuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgT24gV2luZG93cywgPGxpdGVyYWw+YXV0b2xhdW5jaDwvbGl0ZXJhbD4gYWRkcmVzc2VzIGFyZSBib3RoCisgICAgICAgIGNvbm5lY3RhYmxlIGFuZCBsaXN0ZW5hYmxlLgorICAgICAgPC9wYXJhPgorCisgICAgIDxzZWN0MyBpZD0ibWV0YS10cmFuc3BvcnRzLWF1dG9sYXVuY2gtYWRkcmVzc2VzIj4KKyAgICAgICA8dGl0bGU+U2VydmVyIEFkZHJlc3MgRm9ybWF0PC90aXRsZT4KKyAgICAgICA8cGFyYT4KKyAgICAgICAgIEF1dG9sYXVuY2ggYWRkcmVzc2VzIHVzZXMgdGhlICJhdXRvbGF1bmNoOiIgcHJlZml4IGFuZCBzdXBwb3J0IHRoZQorICAgICAgICAgZm9sbG93aW5nIGtleS92YWx1ZSBwYWlyczoKKyAgICAgICA8L3BhcmE+CisgICAgICAgPGluZm9ybWFsdGFibGU+CisgICAgICAgIDx0Z3JvdXAgY29scz0iMyI+CisgICAgICAgICA8dGhlYWQ+CisgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgPGVudHJ5Pk5hbWU8L2VudHJ5PgorICAgICAgICAgICA8ZW50cnk+VmFsdWVzPC9lbnRyeT4KKyAgICAgICAgICAgPGVudHJ5PkRlc2NyaXB0aW9uPC9lbnRyeT4KKyAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgIDwvdGhlYWQ+CisgICAgICAgICA8dGJvZHk+CisgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgPGVudHJ5PnNjb3BlPC9lbnRyeT4KKyAgICAgICAgICAgPGVudHJ5PihzdHJpbmcpPC9lbnRyeT4KKyAgICAgICAgICAgPGVudHJ5PnNjb3BlIG9mIGF1dG9sYXVuY2ggKFdpbmRvd3Mgb25seSkKKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICIqaW5zdGFsbC1wYXRoIiAtIGxpbWl0IHNlc3Npb24gYnVzIHRvIGRidXMgaW5zdGFsbGF0aW9uIHBhdGguCisgICAgICAgICAgICAgICBUaGUgZGJ1cyBpbnN0YWxsYXRpb24gcGF0aCBpcyBkZXRlcm1pbmVkIGZyb20gdGhlIGxvY2F0aW9uIG9mCisgICAgICAgICAgICAgICB0aGUgc2hhcmVkIGRidXMgbGlicmFyeS4gSWYgdGhlIGxpYnJhcnkgaXMgbG9jYXRlZCBpbiBhICdiaW4nCisgICAgICAgICAgICAgICBzdWJkaXJlY3RvcnkgdGhlIGluc3RhbGxhdGlvbiByb290IGlzIHRoZSBkaXJlY3RvcnkgYWJvdmUsCisgICAgICAgICAgICAgICBvdGhlcndpc2UgdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgbGlicmFyeSBsaXZlcyBpcyB0YWtlbiBhcworICAgICAgICAgICAgICAgaW5zdGFsbGF0aW9uIHJvb3QuCisgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgICAgJmx0O2luc3RhbGwtcm9vdCZndDsvYmluL1tsaWJdZGJ1cy0xLmRsbAorICAgICAgICAgICAgICAgICAgICZsdDtpbnN0YWxsLXJvb3QmZ3Q7L1tsaWJdZGJ1cy0xLmRsbAorICAgICAgICAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICIqdXNlciIgLSBsaW1pdCBzZXNzaW9uIGJ1cyB0byB0aGUgcmVjZW50IHVzZXIuCisgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICBvdGhlciB2YWx1ZXMgLSBzcGVjaWZ5IGRlZGljYXRlZCBzZXNzaW9uIGJ1cyBsaWtlICJyZWxlYXNlIiwKKyAgICAgICAgICAgICAgICJkZWJ1ZyIgb3Igb3RoZXIKKyAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgIDwvcm93PgorICAgICAgICA8L3Rib2R5PgorICAgICAgIDwvdGdyb3VwPgorICAgICAgPC9pbmZvcm1hbHRhYmxlPgorICAgICA8L3NlY3QzPgorCisgICAgIDxzZWN0MyBpZD0ibWV0YS10cmFuc3BvcnRzLWF1dG9sYXVuY2gtd2luZG93cy1pbXBsZW1lbnRhdGlvbiI+CisgICAgICA8dGl0bGU+V2luZG93cyBpbXBsZW1lbnRhdGlvbjwvdGl0bGU+CisgICAgICA8cGFyYT4KKyAgICAgICAgT24gc3RhcnQsIHRoZSBzZXJ2ZXIgb3BlbnMgYSBwbGF0Zm9ybSBzcGVjaWZpYyB0cmFuc3BvcnQsIGNyZWF0ZXMgYSBtdXRleAorICAgICAgICBhbmQgYSBzaGFyZWQgbWVtb3J5IHNlY3Rpb24gY29udGFpbmluZyB0aGUgcmVsYXRlZCBzZXNzaW9uIGJ1cyBhZGRyZXNzLgorICAgICAgICBUaGlzIG11dGV4IHdpbGwgYmUgaW5zcGVjdGVkIGJ5IHRoZSBkYnVzIGNsaWVudCBsaWJyYXJ5IHRvIGRldGVjdCBhCisgICAgICAgIHJ1bm5pbmcgZGJ1cyBzZXNzaW9uIGJ1cy4gVGhlIGFjY2VzcyB0byB0aGUgbXV0ZXggYW5kIHRoZSBzaGFyZWQgbWVtb3J5CisgICAgICAgIHNlY3Rpb24gYXJlIHByb3RlY3RlZCBieSBnbG9iYWwgbG9ja3MuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICBJbiB0aGUgcmVjZW50IGltcGxlbWVudGF0aW9uIHRoZSBhdXRvbGF1bmNoIHRyYW5zcG9ydCB1c2VzIGEgdGNwIHRyYW5zcG9ydAorICAgICAgIG9uIGxvY2FsaG9zdCB3aXRoIGEgcG9ydCBjaG9vc2VuIGZyb20gdGhlIG9wZXJhdGluZyBzeXN0ZW0uIFRoaXMgZGV0YWlsIG1heQorICAgICAgIGNoYW5nZSBpbiB0aGUgZnV0dXJlLgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIERpc2NsYWltZXI6IFRoZSByZWNlbnQgaW1wbGVtZW50YXRpb24gaXMgaW4gYW4gZWFybHkgc3RhdGUgYW5kIG1heSBub3QKKyAgICAgICAgd29yayBpbiBhbGwgY2lydW1zdGFuY2VzIGFuZC9vciBtYXkgaGF2ZSBzZWN1cml0eSBpc3N1ZXMuIEJlY2F1c2Ugb2YgdGhpcworICAgICAgICB0aGUgaW1wbGVtZW50YXRpb24gaXMgbm90IGRvY3VtZW50YXRlZCB5ZXQuCisgICAgICA8L3BhcmE+CisgICAgIDwvc2VjdDM+CisgICAgPC9zZWN0Mj4KKyAgIDwvc2VjdDE+CisKKyAgPHNlY3QxIGlkPSJ1dWlkcyI+CisgICAgPHRpdGxlPlVVSURzPC90aXRsZT4KKyAgICA8cGFyYT4KKyAgICAgIEEgd29ya2luZyBELUJ1cyBpbXBsZW1lbnRhdGlvbiB1c2VzIHVuaXZlcnNhbGx5LXVuaXF1ZSBJRHMgaW4gdHdvIHBsYWNlcy4KKyAgICAgIEZpcnN0LCBlYWNoIHNlcnZlciBhZGRyZXNzIGhhcyBhIFVVSUQgaWRlbnRpZnlpbmcgdGhlIGFkZHJlc3MsCisgICAgICBhcyBkZXNjcmliZWQgaW4gPHhyZWYgbGlua2VuZD0iYWRkcmVzc2VzIi8+LiBTZWNvbmQsIGVhY2ggb3BlcmF0aW5nCisgICAgICBzeXN0ZW0ga2VybmVsIGluc3RhbmNlIHJ1bm5pbmcgYSBELUJ1cyBjbGllbnQgb3Igc2VydmVyIGhhcyBhIFVVSUQKKyAgICAgIGlkZW50aWZ5aW5nIHRoYXQga2VybmVsLCByZXRyaWV2ZWQgYnkgaW52b2tpbmcgdGhlIG1ldGhvZAorICAgICAgb3JnLmZyZWVkZXNrdG9wLkRCdXMuUGVlci5HZXRNYWNoaW5lSWQoKSAoc2VlIDx4cmVmCisgICAgICBsaW5rZW5kPSJzdGFuZGFyZC1pbnRlcmZhY2VzLXBlZXIiLz4pLgorICAgIDwvcGFyYT4KKyAgICA8cGFyYT4KKyAgICAgIFRoZSB0ZXJtICJVVUlEIiBpbiB0aGlzIGRvY3VtZW50IGlzIGludGVuZGVkIGxpdGVyYWxseSwgaS5lLiBhbgorICAgICAgaWRlbnRpZmllciB0aGF0IGlzIHVuaXZlcnNhbGx5IHVuaXF1ZS4gSXQgaXMgbm90IGludGVuZGVkIHRvIHJlZmVyIHRvCisgICAgICBSRkM0MTIyLCBhbmQgaW4gZmFjdCB0aGUgRC1CdXMgVVVJRCBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoYXQgUkZDLgorICAgIDwvcGFyYT4KKyAgICA8cGFyYT4KKyAgICAgIFRoZSBVVUlEIG11c3QgY29udGFpbiAxMjggYml0cyBvZiBkYXRhIGFuZCBiZSBoZXgtZW5jb2RlZC4gIFRoZQorICAgICAgaGV4LWVuY29kZWQgc3RyaW5nIG1heSBub3QgY29udGFpbiBoeXBoZW5zIG9yIG90aGVyIG5vbi1oZXgtZGlnaXQKKyAgICAgIGNoYXJhY3RlcnMsIGFuZCBpdCBtdXN0IGJlIGV4YWN0bHkgMzIgY2hhcmFjdGVycyBsb25nLiAgVG8gZ2VuZXJhdGUgYQorICAgICAgVVVJRCwgdGhlIGN1cnJlbnQgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGNvbmNhdGVuYXRlcyA5NiBiaXRzIG9mIHJhbmRvbQorICAgICAgZGF0YSBmb2xsb3dlZCBieSB0aGUgMzItYml0IHRpbWUgaW4gc2Vjb25kcyBzaW5jZSB0aGUgVU5JWCBlcG9jaCAoaW4gYmlnCisgICAgICBlbmRpYW4gYnl0ZSBvcmRlcikuCisgICAgPC9wYXJhPgorICAgIDxwYXJhPgorICAgICAgSXQgd291bGQgYWxzbyBiZSBhY2NlcHRhYmxlIGFuZCBwcm9iYWJseSBiZXR0ZXIgdG8gc2ltcGx5IGdlbmVyYXRlIDEyOAorICAgICAgYml0cyBvZiByYW5kb20gZGF0YSwgYXMgbG9uZyBhcyB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgaXMgb2YgaGlnaAorICAgICAgcXVhbGl0eS4gVGhlIHRpbWVzdGFtcCBjb3VsZCBjb25jZWl2YWJseSBoZWxwIGlmIHRoZSByYW5kb20gYml0cyBhcmUgbm90CisgICAgICB2ZXJ5IHJhbmRvbS4gV2l0aCBhIHF1YWxpdHkgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IsIGNvbGxpc2lvbnMgYXJlCisgICAgICBleHRyZW1lbHkgdW5saWtlbHkgZXZlbiB3aXRoIG9ubHkgOTYgYml0cywgc28gaXQncyBzb21ld2hhdCBhY2FkZW1pYy4KKyAgICA8L3BhcmE+CisgICAgPHBhcmE+CisgICAgICBJbXBsZW1lbnRhdGlvbnMgc2hvdWxkLCBob3dldmVyLCBzdGljayB0byByYW5kb20gZGF0YSBmb3IgdGhlIGZpcnN0IDk2IGJpdHMKKyAgICAgIG9mIHRoZSBVVUlELgorICAgIDwvcGFyYT4KKyAgPC9zZWN0MT4KKworICA8c2VjdDEgaWQ9InN0YW5kYXJkLWludGVyZmFjZXMiPgorICAgIDx0aXRsZT5TdGFuZGFyZCBJbnRlcmZhY2VzPC90aXRsZT4KKyAgICA8cGFyYT4KKyAgICAgIFNlZSA8eHJlZiBsaW5rZW5kPSJtZXNzYWdlLXByb3RvY29sLXR5cGVzLW5vdGF0aW9uIi8+IGZvciBkZXRhaWxzIG9uCisgICAgICAgdGhlIG5vdGF0aW9uIHVzZWQgaW4gdGhpcyBzZWN0aW9uLiBUaGVyZSBhcmUgc29tZSBzdGFuZGFyZCBpbnRlcmZhY2VzCisgICAgICB0aGF0IG1heSBiZSB1c2VmdWwgYWNyb3NzIHZhcmlvdXMgRC1CdXMgYXBwbGljYXRpb25zLgorICAgIDwvcGFyYT4KKyAgICA8c2VjdDIgaWQ9InN0YW5kYXJkLWludGVyZmFjZXMtcGVlciI+CisgICAgICA8dGl0bGU+PGxpdGVyYWw+b3JnLmZyZWVkZXNrdG9wLkRCdXMuUGVlcjwvbGl0ZXJhbD48L3RpdGxlPgorICAgICAgPHBhcmE+CisgICAgICAgIFRoZSA8bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuREJ1cy5QZWVyPC9saXRlcmFsPiBpbnRlcmZhY2UKKyAgICAgICAgaGFzIHR3byBtZXRob2RzOgorICAgICAgICA8cHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgb3JnLmZyZWVkZXNrdG9wLkRCdXMuUGVlci5QaW5nICgpCisgICAgICAgICAgb3JnLmZyZWVkZXNrdG9wLkRCdXMuUGVlci5HZXRNYWNoaW5lSWQgKG91dCBTVFJJTkcgbWFjaGluZV91dWlkKQorICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIE9uIHJlY2VpcHQgb2YgdGhlIDxsaXRlcmFsPk1FVEhPRF9DQUxMPC9saXRlcmFsPiBtZXNzYWdlCisgICAgICAgIDxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzLlBlZXIuUGluZzwvbGl0ZXJhbD4sIGFuIGFwcGxpY2F0aW9uIHNob3VsZCBkbworICAgICAgICBub3RoaW5nIG90aGVyIHRoYW4gcmVwbHkgd2l0aCBhIDxsaXRlcmFsPk1FVEhPRF9SRVRVUk48L2xpdGVyYWw+IGFzCisgICAgICAgIHVzdWFsLiAgSXQgZG9lcyBub3QgbWF0dGVyIHdoaWNoIG9iamVjdCBwYXRoIGEgcGluZyBpcyBzZW50IHRvLiAgVGhlCisgICAgICAgIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYW5kbGVzIHRoaXMgbWV0aG9kIGF1dG9tYXRpY2FsbHkuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgT24gcmVjZWlwdCBvZiB0aGUgPGxpdGVyYWw+TUVUSE9EX0NBTEw8L2xpdGVyYWw+IG1lc3NhZ2UKKyAgICAgICAgPGxpdGVyYWw+b3JnLmZyZWVkZXNrdG9wLkRCdXMuUGVlci5HZXRNYWNoaW5lSWQ8L2xpdGVyYWw+LCBhbiBhcHBsaWNhdGlvbiBzaG91bGQKKyAgICAgICAgcmVwbHkgd2l0aCBhIDxsaXRlcmFsPk1FVEhPRF9SRVRVUk48L2xpdGVyYWw+IGNvbnRhaW5pbmcgYSBoZXgtZW5jb2RlZAorICAgICAgICBVVUlEIHJlcHJlc2VudGluZyB0aGUgaWRlbnRpdHkgb2YgdGhlIG1hY2hpbmUgdGhlIHByb2Nlc3MgaXMgcnVubmluZyBvbi4KKyAgICAgICAgVGhpcyBVVUlEIG11c3QgYmUgdGhlIHNhbWUgZm9yIGFsbCBwcm9jZXNzZXMgb24gYSBzaW5nbGUgc3lzdGVtIGF0IGxlYXN0CisgICAgICAgIHVudGlsIHRoYXQgc3lzdGVtIG5leHQgcmVib290cy4gSXQgc2hvdWxkIGJlIHRoZSBzYW1lIGFjcm9zcyByZWJvb3RzCisgICAgICAgIGlmIHBvc3NpYmxlLCBidXQgdGhpcyBpcyBub3QgYWx3YXlzIHBvc3NpYmxlIHRvIGltcGxlbWVudCBhbmQgaXMgbm90CisgICAgICAgIGd1YXJhbnRlZWQuCisgICAgICAgIEl0IGRvZXMgbm90IG1hdHRlciB3aGljaCBvYmplY3QgcGF0aCBhIEdldE1hY2hpbmVJZCBpcyBzZW50IHRvLiAgVGhlCisgICAgICAgIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYW5kbGVzIHRoaXMgbWV0aG9kIGF1dG9tYXRpY2FsbHkuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIFVVSUQgaXMgaW50ZW5kZWQgdG8gYmUgcGVyLWluc3RhbmNlLW9mLXRoZS1vcGVyYXRpbmctc3lzdGVtLCBzbyBtYXkgcmVwcmVzZW50CisgICAgICAgIGEgdmlydHVhbCBtYWNoaW5lIHJ1bm5pbmcgb24gYSBoeXBlcnZpc29yLCByYXRoZXIgdGhhbiBhIHBoeXNpY2FsIG1hY2hpbmUuCisgICAgICAgIEJhc2ljYWxseSBpZiB0d28gcHJvY2Vzc2VzIHNlZSB0aGUgc2FtZSBVVUlELCB0aGV5IHNob3VsZCBhbHNvIHNlZSB0aGUgc2FtZQorICAgICAgICBzaGFyZWQgbWVtb3J5LCBVTklYIGRvbWFpbiBzb2NrZXRzLCBwcm9jZXNzIElEcywgYW5kIG90aGVyIGZlYXR1cmVzIHRoYXQgcmVxdWlyZQorICAgICAgICBhIHJ1bm5pbmcgT1Mga2VybmVsIGluIGNvbW1vbiBiZXR3ZWVuIHRoZSBwcm9jZXNzZXMuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIFVVSUQgaXMgb2Z0ZW4gdXNlZCB3aGVyZSBvdGhlciBwcm9ncmFtcyBtaWdodCB1c2UgYSBob3N0bmFtZS4gSG9zdG5hbWVzCisgICAgICAgIGNhbiBjaGFuZ2Ugd2l0aG91dCByZWJvb3RpbmcsIGhvd2V2ZXIsIG9yIGp1c3QgYmUgImxvY2FsaG9zdCIgLSBzbyB0aGUgVVVJRAorICAgICAgICBpcyBtb3JlIHJvYnVzdC4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICA8eHJlZiBsaW5rZW5kPSJ1dWlkcyIvPiBleHBsYWlucyB0aGUgZm9ybWF0IG9mIHRoZSBVVUlELgorICAgICAgPC9wYXJhPgorICAgIDwvc2VjdDI+CisKKyAgICA8c2VjdDIgaWQ9InN0YW5kYXJkLWludGVyZmFjZXMtaW50cm9zcGVjdGFibGUiPgorICAgICAgPHRpdGxlPjxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzLkludHJvc3BlY3RhYmxlPC9saXRlcmFsPjwvdGl0bGU+CisgICAgICA8cGFyYT4KKyAgICAgICAgVGhpcyBpbnRlcmZhY2UgaGFzIG9uZSBtZXRob2Q6CisgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICBvcmcuZnJlZWRlc2t0b3AuREJ1cy5JbnRyb3NwZWN0YWJsZS5JbnRyb3NwZWN0IChvdXQgU1RSSU5HIHhtbF9kYXRhKQorICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIE9iamVjdHMgaW5zdGFuY2VzIG1heSBpbXBsZW1lbnQKKyAgICAgICAgPGxpdGVyYWw+SW50cm9zcGVjdDwvbGl0ZXJhbD4gd2hpY2ggcmV0dXJucyBhbiBYTUwgZGVzY3JpcHRpb24gb2YKKyAgICAgICAgdGhlIG9iamVjdCwgaW5jbHVkaW5nIGl0cyBpbnRlcmZhY2VzICh3aXRoIHNpZ25hbHMgYW5kIG1ldGhvZHMpLCBvYmplY3RzCisgICAgICAgIGJlbG93IGl0IGluIHRoZSBvYmplY3QgcGF0aCB0cmVlLCBhbmQgaXRzIHByb3BlcnRpZXMuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgPHhyZWYgbGlua2VuZD0iaW50cm9zcGVjdGlvbi1mb3JtYXQiLz4gZGVzY3JpYmVzIHRoZSBmb3JtYXQgb2YgdGhpcyBYTUwgc3RyaW5nLgorICAgICAgPC9wYXJhPgorICAgIDwvc2VjdDI+CisgICAgPHNlY3QyIGlkPSJzdGFuZGFyZC1pbnRlcmZhY2VzLXByb3BlcnRpZXMiPgorICAgICAgPHRpdGxlPjxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzLlByb3BlcnRpZXM8L2xpdGVyYWw+PC90aXRsZT4KKyAgICAgIDxwYXJhPgorICAgICAgICBNYW55IG5hdGl2ZSBBUElzIHdpbGwgaGF2ZSBhIGNvbmNlcHQgb2Ygb2JqZWN0IDxmaXJzdHRlcm0+cHJvcGVydGllczwvZmlyc3R0ZXJtPgorICAgICAgICBvciA8Zmlyc3R0ZXJtPmF0dHJpYnV0ZXM8L2ZpcnN0dGVybT4uIFRoZXNlIGNhbiBiZSBleHBvc2VkIHZpYSB0aGUKKyAgICAgICAgPGxpdGVyYWw+b3JnLmZyZWVkZXNrdG9wLkRCdXMuUHJvcGVydGllczwvbGl0ZXJhbD4gaW50ZXJmYWNlLgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgb3JnLmZyZWVkZXNrdG9wLkRCdXMuUHJvcGVydGllcy5HZXQgKGluIFNUUklORyBpbnRlcmZhY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIFNUUklORyBwcm9wZXJ0eV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0IFZBUklBTlQgdmFsdWUpOworICAgICAgICAgICAgICBvcmcuZnJlZWRlc2t0b3AuREJ1cy5Qcm9wZXJ0aWVzLlNldCAoaW4gU1RSSU5HIGludGVyZmFjZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gU1RSSU5HIHByb3BlcnR5X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBWQVJJQU5UIHZhbHVlKTsKKyAgICAgICAgICAgICAgb3JnLmZyZWVkZXNrdG9wLkRCdXMuUHJvcGVydGllcy5HZXRBbGwgKGluIFNUUklORyBpbnRlcmZhY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dCBESUNUJmx0O1NUUklORyxWQVJJQU5UJmd0OyBwcm9wcyk7CisgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgSXQgaXMgY29udmVudGlvbmFsIHRvIGdpdmUgRC1CdXMgcHJvcGVydGllcyBuYW1lcyBjb25zaXN0aW5nIG9mCisgICAgICAgIGNhcGl0YWxpemVkIHdvcmRzIHdpdGhvdXQgcHVuY3R1YXRpb24gKCJDYW1lbENhc2UiKSwgbGlrZQorICAgICAgICA8bGluayBsaW5rZW5kPSJtZXNzYWdlLXByb3RvY29sLW5hbWVzLW1lbWJlciI+bWVtYmVyIG5hbWVzPC9saW5rPi4KKyAgICAgICAgRm9yIGluc3RhbmNlLCB0aGUgR09iamVjdCBwcm9wZXJ0eQorICAgICAgICA8bGl0ZXJhbD5jb25uZWN0aW9uLXN0YXR1czwvbGl0ZXJhbD4gb3IgdGhlIFF0IHByb3BlcnR5CisgICAgICAgIDxsaXRlcmFsPmNvbm5lY3Rpb25TdGF0dXM8L2xpdGVyYWw+IGNvdWxkIGJlIHJlcHJlc2VudGVkIG9uIEQtQnVzCisgICAgICAgIGFzIDxsaXRlcmFsPkNvbm5lY3Rpb25TdGF0dXM8L2xpdGVyYWw+LgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIFN0cmljdGx5IHNwZWFraW5nLCBELUJ1cyBwcm9wZXJ0eSBuYW1lcyBhcmUgbm90IHJlcXVpcmVkIHRvIGZvbGxvdworICAgICAgICB0aGUgc2FtZSBuYW1pbmcgcmVzdHJpY3Rpb25zIGFzIG1lbWJlciBuYW1lcywgYnV0IEQtQnVzIHByb3BlcnR5CisgICAgICAgIG5hbWVzIHRoYXQgd291bGQgbm90IGJlIHZhbGlkIG1lbWJlciBuYW1lcyAoaW4gcGFydGljdWxhciwKKyAgICAgICAgR09iamVjdC1zdHlsZSBkYXNoLXNlcGFyYXRlZCBwcm9wZXJ0eSBuYW1lcykgY2FuIGNhdXNlIGludGVyb3BlcmFiaWxpdHkKKyAgICAgICAgcHJvYmxlbXMgYW5kIHNob3VsZCBiZSBhdm9pZGVkLgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIFRoZSBhdmFpbGFibGUgcHJvcGVydGllcyBhbmQgd2hldGhlciB0aGV5IGFyZSB3cml0YWJsZSBjYW4gYmUgZGV0ZXJtaW5lZAorICAgICAgICBieSBjYWxsaW5nIDxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzLkludHJvc3BlY3RhYmxlLkludHJvc3BlY3Q8L2xpdGVyYWw+LAorICAgICAgICBzZWUgPHhyZWYgbGlua2VuZD0ic3RhbmRhcmQtaW50ZXJmYWNlcy1pbnRyb3NwZWN0YWJsZSIvPi4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBBbiBlbXB0eSBzdHJpbmcgbWF5IGJlIHByb3ZpZGVkIGZvciB0aGUgaW50ZXJmYWNlIG5hbWU7IGluIHRoaXMgY2FzZSwKKyAgICAgICAgaWYgdGhlcmUgYXJlIG11bHRpcGxlIHByb3BlcnRpZXMgb24gYW4gb2JqZWN0IHdpdGggdGhlIHNhbWUgbmFtZSwKKyAgICAgICAgdGhlIHJlc3VsdHMgYXJlIHVuZGVmaW5lZCAocGlja2luZyBvbmUgYnkgYWNjb3JkaW5nIHRvIGFuIGFyYml0cmFyeQorICAgICAgICBkZXRlcm1pbmlzdGljIHJ1bGUsIG9yIHJldHVybmluZyBhbiBlcnJvciwgYXJlIHRoZSByZWFzb25hYmxlCisgICAgICAgIHBvc3NpYmlsaXRpZXMpLgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIElmIDxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzLlByb3BlcnRpZXMuR2V0QWxsPC9saXRlcmFsPiBpcyBjYWxsZWQKKyAgICAgICAgd2l0aCBhIHZhbGlkIGludGVyZmFjZSBuYW1lIHdoaWNoIGNvbnRhaW5zIG5vIHByb3BlcnRpZXMsIGFuIGVtcHR5IGFycmF5CisgICAgICAgIHNob3VsZCBiZSByZXR1cm5lZC4gSWYgaXQgaXMgY2FsbGVkIHdpdGggYSB2YWxpZCBpbnRlcmZhY2UgbmFtZSBmb3IKKyAgICAgICAgd2hpY2ggc29tZSBwcm9wZXJ0aWVzIGFyZSBub3QgYWNjZXNzaWJsZSB0byB0aGUgY2FsbGVyIChmb3IgZXhhbXBsZSwgZHVlCisgICAgICAgIHRvIHBlci1wcm9wZXJ0eSBhY2Nlc3MgY29udHJvbCBpbXBsZW1lbnRlZCBpbiB0aGUgc2VydmljZSksIHRob3NlCisgICAgICAgIHByb3BlcnRpZXMgc2hvdWxkIGJlIHNpbGVudGx5IG9taXR0ZWQgZnJvbSB0aGUgcmVzdWx0IGFycmF5LgorICAgICAgICBJZiA8bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuREJ1cy5Qcm9wZXJ0aWVzLkdldDwvbGl0ZXJhbD4gaXMgY2FsbGVkIGZvcgorICAgICAgICBhbnkgc3VjaCBwcm9wZXJ0aWVzLCBhbiBhcHByb3ByaWF0ZSBhY2Nlc3MgY29udHJvbCBlcnJvciBzaG91bGQgYmUKKyAgICAgICAgcmV0dXJuZWQuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgSWYgb25lIG9yIG1vcmUgcHJvcGVydGllcyBjaGFuZ2Ugb24gYW4gb2JqZWN0LCB0aGUKKyAgICAgICAgPGxpdGVyYWw+b3JnLmZyZWVkZXNrdG9wLkRCdXMuUHJvcGVydGllcy5Qcm9wZXJ0aWVzQ2hhbmdlZDwvbGl0ZXJhbD4KKyAgICAgICAgc2lnbmFsIG1heSBiZSBlbWl0dGVkICh0aGlzIHNpZ25hbCB3YXMgYWRkZWQgaW4gMC4xNCk6CisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgPHByb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICBvcmcuZnJlZWRlc2t0b3AuREJ1cy5Qcm9wZXJ0aWVzLlByb3BlcnRpZXNDaGFuZ2VkIChTVFJJTkcgaW50ZXJmYWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJQ1QmbHQ7U1RSSU5HLFZBUklBTlQmZ3Q7IGNoYW5nZWRfcHJvcGVydGllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJSQVkmbHQ7U1RSSU5HJmd0OyBpbnZhbGlkYXRlZF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICB3aGVyZSA8bGl0ZXJhbD5jaGFuZ2VkX3Byb3BlcnRpZXM8L2xpdGVyYWw+IGlzIGEgZGljdGlvbmFyeQorICAgICAgICBjb250YWluaW5nIHRoZSBjaGFuZ2VkIHByb3BlcnRpZXMgd2l0aCB0aGUgbmV3IHZhbHVlcyBhbmQKKyAgICAgICAgPGxpdGVyYWw+aW52YWxpZGF0ZWRfcHJvcGVydGllczwvbGl0ZXJhbD4gaXMgYW4gYXJyYXkgb2YKKyAgICAgICAgcHJvcGVydGllcyB0aGF0IGNoYW5nZWQgYnV0IHRoZSB2YWx1ZSBpcyBub3QgY29udmV5ZWQuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgV2hldGhlciB0aGUgPGxpdGVyYWw+UHJvcGVydGllc0NoYW5nZWQ8L2xpdGVyYWw+IHNpZ25hbCBpcworICAgICAgICBzdXBwb3J0ZWQgY2FuIGJlIGRldGVybWluZWQgYnkgY2FsbGluZworICAgICAgICA8bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuREJ1cy5JbnRyb3NwZWN0YWJsZS5JbnRyb3NwZWN0PC9saXRlcmFsPi4gTm90ZQorICAgICAgICB0aGF0IHRoZSBzaWduYWwgbWF5IGJlIHN1cHBvcnRlZCBmb3IgYW4gb2JqZWN0IGJ1dCBpdCBtYXkKKyAgICAgICAgZGlmZmVyIGhvdyB3aGV0aGVyIGFuZCBob3cgaXQgaXMgdXNlZCBvbiBhIHBlci1wcm9wZXJ0eSBiYXNpcworICAgICAgICAoZm9yIGUuZy4gcGVyZm9ybWFuY2Ugb3Igc2VjdXJpdHkgcmVhc29ucykuIEVhY2ggcHJvcGVydHkgKG9yCisgICAgICAgIHRoZSBwYXJlbnQgaW50ZXJmYWNlKSBtdXN0IGJlIGFubm90YXRlZCB3aXRoIHRoZQorICAgICAgICA8bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuREJ1cy5Qcm9wZXJ0eS5FbWl0c0NoYW5nZWRTaWduYWw8L2xpdGVyYWw+CisgICAgICAgIGFubm90YXRpb24gdG8gY29udmV5IHRoaXMgKHVzdWFsbHkgdGhlIGRlZmF1bHQgdmFsdWUKKyAgICAgICAgPGxpdGVyYWw+dHJ1ZTwvbGl0ZXJhbD4gaXMgc3VmZmljaWVudCBtZWFuaW5nIHRoYXQgdGhlCisgICAgICAgIGFubm90YXRpb24gZG9lcyBub3QgbmVlZCB0byBiZSB1c2VkKS4gU2VlIDx4cmVmCisgICAgICAgIGxpbmtlbmQ9ImludHJvc3BlY3Rpb24tZm9ybWF0Ii8+IGZvciBkZXRhaWxzIG9uIHRoaXMKKyAgICAgICAgYW5ub3RhdGlvbi4KKyAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3QyPgorCisgICAgPHNlY3QyIGlkPSJzdGFuZGFyZC1pbnRlcmZhY2VzLW9iamVjdG1hbmFnZXIiPgorICAgICAgPHRpdGxlPjxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzLk9iamVjdE1hbmFnZXI8L2xpdGVyYWw+PC90aXRsZT4KKyAgICAgIDxwYXJhPgorICAgICAgICBBbiBBUEkgY2FuIG9wdGlvbmFsbHkgbWFrZSB1c2Ugb2YgdGhpcyBpbnRlcmZhY2UgZm9yIG9uZSBvcgorICAgICAgICBtb3JlIHN1Yi10cmVlcyBvZiBvYmplY3RzLiBUaGUgcm9vdCBvZiBlYWNoIHN1Yi10cmVlIGltcGxlbWVudHMKKyAgICAgICAgdGhpcyBpbnRlcmZhY2Ugc28gb3RoZXIgYXBwbGljYXRpb25zIGNhbiBnZXQgYWxsIG9iamVjdHMsCisgICAgICAgIGludGVyZmFjZXMgYW5kIHByb3BlcnRpZXMgaW4gYSBzaW5nbGUgbWV0aG9kIGNhbGwuICBJdCBpcworICAgICAgICBhcHByb3ByaWF0ZSB0byB1c2UgdGhpcyBpbnRlcmZhY2UgaWYgdXNlcnMgb2YgdGhlIHRyZWUgb2YKKyAgICAgICAgb2JqZWN0cyBhcmUgZXhwZWN0ZWQgdG8gYmUgaW50ZXJlc3RlZCBpbiBhbGwgaW50ZXJmYWNlcyBvZiBhbGwKKyAgICAgICAgb2JqZWN0cyBpbiB0aGUgdHJlZTsgYSBtb3JlIGdyYW51bGFyIEFQSSBzaG91bGQgYmUgdXNlZCBpZgorICAgICAgICB1c2VycyBvZiB0aGUgb2JqZWN0cyBhcmUgZXhwZWN0ZWQgdG8gYmUgaW50ZXJlc3RlZCBpbiBhIHNtYWxsCisgICAgICAgIHN1YnNldCBvZiB0aGUgb2JqZWN0cywgYSBzbWFsbCBzdWJzZXQgb2YgdGhlaXIgaW50ZXJmYWNlcywgb3IKKyAgICAgICAgYm90aC4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBUaGUgbWV0aG9kIHRoYXQgYXBwbGljYXRpb25zIGNhbiB1c2UgdG8gZ2V0IGFsbCBvYmplY3RzIGFuZAorICAgICAgICBwcm9wZXJ0aWVzIGlzIDxsaXRlcmFsPkdldE1hbmFnZWRPYmplY3RzPC9saXRlcmFsPjoKKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICA8cHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgb3JnLmZyZWVkZXNrdG9wLkRCdXMuT2JqZWN0TWFuYWdlci5HZXRNYW5hZ2VkT2JqZWN0cyAob3V0IERJQ1QmbHQ7T0JKUEFUSCxESUNUJmx0O1NUUklORyxESUNUJmx0O1NUUklORyxWQVJJQU5UJmd0OyZndDsmZ3Q7IG9ianBhdGhfaW50ZXJmYWNlc19hbmRfcHJvcGVydGllcyk7CisgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIHJldHVybiB2YWx1ZSBvZiB0aGlzIG1ldGhvZCBpcyBhIGRpY3Qgd2hvc2Uga2V5cyBhcmUKKyAgICAgICAgb2JqZWN0IHBhdGhzLiBBbGwgcmV0dXJuZWQgb2JqZWN0IHBhdGhzIGFyZSBjaGlsZHJlbiBvZiB0aGUKKyAgICAgICAgb2JqZWN0IHBhdGggaW1wbGVtZW50aW5nIHRoaXMgaW50ZXJmYWNlLCBpLmUuIHRoZWlyIG9iamVjdAorICAgICAgICBwYXRocyBzdGFydCB3aXRoIHRoZSBPYmplY3RNYW5hZ2VyJ3Mgb2JqZWN0IHBhdGggcGx1cyAnLycuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgRWFjaCB2YWx1ZSBpcyBhIGRpY3Qgd2hvc2Uga2V5cyBhcmUgaW50ZXJmYWNlcyBuYW1lcy4gIEVhY2gKKyAgICAgICAgdmFsdWUgaW4gdGhpcyBpbm5lciBkaWN0IGlzIHRoZSBzYW1lIGRpY3QgdGhhdCB3b3VsZCBiZQorICAgICAgICByZXR1cm5lZCBieSB0aGUgPGxpbmsKKyAgICAgICAgbGlua2VuZD0ic3RhbmRhcmQtaW50ZXJmYWNlcy1wcm9wZXJ0aWVzIj5vcmcuZnJlZWRlc2t0b3AuREJ1cy5Qcm9wZXJ0aWVzLkdldEFsbCgpPC9saW5rPgorICAgICAgICBtZXRob2QgZm9yIHRoYXQgY29tYmluYXRpb24gb2Ygb2JqZWN0IHBhdGggYW5kIGludGVyZmFjZS4gSWYKKyAgICAgICAgYW4gaW50ZXJmYWNlIGhhcyBubyBwcm9wZXJ0aWVzLCB0aGUgZW1wdHkgZGljdCBpcyByZXR1cm5lZC4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBDaGFuZ2VzIGFyZSBlbWl0dGVkIHVzaW5nIHRoZSBmb2xsb3dpbmcgdHdvIHNpZ25hbHM6CisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgPHByb2dyYW1saXN0aW5nPgorICAgICAgICAgIG9yZy5mcmVlZGVza3RvcC5EQnVzLk9iamVjdE1hbmFnZXIuSW50ZXJmYWNlc0FkZGVkIChPQkpQQVRIIG9iamVjdF9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESUNUJmx0O1NUUklORyxESUNUJmx0O1NUUklORyxWQVJJQU5UJmd0OyZndDsgaW50ZXJmYWNlc19hbmRfcHJvcGVydGllcyk7CisgICAgICAgICAgb3JnLmZyZWVkZXNrdG9wLkRCdXMuT2JqZWN0TWFuYWdlci5JbnRlcmZhY2VzUmVtb3ZlZCAoT0JKUEFUSCBvYmplY3RfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUlJBWSZsdDtTVFJJTkcmZ3Q7IGludGVyZmFjZXMpOworICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIFRoZSA8bGl0ZXJhbD5JbnRlcmZhY2VzQWRkZWQ8L2xpdGVyYWw+IHNpZ25hbCBpcyBlbWl0dGVkIHdoZW4KKyAgICAgICAgZWl0aGVyIGEgbmV3IG9iamVjdCBpcyBhZGRlZCBvciB3aGVuIGFuIGV4aXN0aW5nIG9iamVjdCBnYWlucworICAgICAgICBvbmUgb3IgbW9yZSBpbnRlcmZhY2VzLiBUaGUKKyAgICAgICAgPGxpdGVyYWw+SW50ZXJmYWNlc1JlbW92ZWQ8L2xpdGVyYWw+IHNpZ25hbCBpcyBlbWl0dGVkCisgICAgICAgIHdoZW5ldmVyIGFuIG9iamVjdCBpcyByZW1vdmVkIG9yIGl0IGxvc2VzIG9uZSBvciBtb3JlCisgICAgICAgIGludGVyZmFjZXMuIFRoZSBzZWNvbmQgcGFyYW1ldGVyIG9mIHRoZQorICAgICAgICA8bGl0ZXJhbD5JbnRlcmZhY2VzQWRkZWQ8L2xpdGVyYWw+IHNpZ25hbCBjb250YWlucyBhIGRpY3Qgd2l0aAorICAgICAgICB0aGUgaW50ZXJmYWNlcyBhbmQgcHJvcGVydGllcyAoaWYgYW55KSB0aGF0IGhhdmUgYmVlbiBhZGRlZCB0bworICAgICAgICB0aGUgZ2l2ZW4gb2JqZWN0IHBhdGguIFNpbWlsYXJseSwgdGhlIHNlY29uZCBwYXJhbWV0ZXIgb2YgdGhlCisgICAgICAgIDxsaXRlcmFsPkludGVyZmFjZXNSZW1vdmVkPC9saXRlcmFsPiBzaWduYWwgY29udGFpbnMgYW4gYXJyYXkKKyAgICAgICAgb2YgdGhlIGludGVyZmFjZXMgdGhhdCB3ZXJlIHJlbW92ZWQuIE5vdGUgdGhhdCBjaGFuZ2VzIG9uCisgICAgICAgIHByb3BlcnRpZXMgb24gZXhpc3RpbmcgaW50ZXJmYWNlcyBhcmUgbm90IHJlcG9ydGVkIHVzaW5nIHRoaXMKKyAgICAgICAgaW50ZXJmYWNlIC0gYW4gYXBwbGljYXRpb24gc2hvdWxkIGFsc28gbW9uaXRvciB0aGUgZXhpc3RpbmcgPGxpbmsKKyAgICAgICAgbGlua2VuZD0ic3RhbmRhcmQtaW50ZXJmYWNlcy1wcm9wZXJ0aWVzIj5Qcm9wZXJ0aWVzQ2hhbmdlZDwvbGluaz4KKyAgICAgICAgc2lnbmFsIG9uIGVhY2ggb2JqZWN0LgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIEFwcGxpY2F0aW9ucyBTSE9VTEQgTk9UIGV4cG9ydCBvYmplY3RzIHRoYXQgYXJlIGNoaWxkcmVuIG9mIGFuCisgICAgICAgIG9iamVjdCAoZGlyZWN0bHkgb3Igb3RoZXJ3aXNlKSBpbXBsZW1lbnRpbmcgdGhpcyBpbnRlcmZhY2UgYnV0CisgICAgICAgIHdoaWNoIGFyZSBub3QgcmV0dXJuZWQgaW4gdGhlIHJlcGx5IGZyb20gdGhlCisgICAgICAgIDxsaXRlcmFsPkdldE1hbmFnZWRPYmplY3RzKCk8L2xpdGVyYWw+IG1ldGhvZCBvZiB0aGlzCisgICAgICAgIGludGVyZmFjZSBvbiB0aGUgZ2l2ZW4gb2JqZWN0LgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIFRoZSBpbnRlbnQgb2YgdGhlIDxsaXRlcmFsPk9iamVjdE1hbmFnZXI8L2xpdGVyYWw+IGludGVyZmFjZQorICAgICAgICBpcyB0byBtYWtlIGl0IGVhc3kgdG8gd3JpdGUgYSByb2J1c3QgY2xpZW50CisgICAgICAgIGltcGxlbWVudGF0aW9uLiBUaGUgdHJpdmlhbCBjbGllbnQgaW1wbGVtZW50YXRpb24gb25seSBuZWVkcworICAgICAgICB0byBtYWtlIHR3byBtZXRob2QgY2FsbHM6CisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgPHByb2dyYW1saXN0aW5nPgorICAgICAgICAgIG9yZy5mcmVlZGVza3RvcC5EQnVzLkFkZE1hdGNoIChidXNfcHJveHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlPSdzaWduYWwnLG5hbWU9J29yZy5leGFtcGxlLkFwcDInLHBhdGhfbmFtZXNwYWNlPScvb3JnL2V4YW1wbGUvQXBwMiciKTsKKyAgICAgICAgICBvYmplY3RzID0gb3JnLmZyZWVkZXNrdG9wLkRCdXMuT2JqZWN0TWFuYWdlci5HZXRNYW5hZ2VkT2JqZWN0cyAoYXBwX3Byb3h5KTsKKyAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBvbiB0aGUgbWVzc2FnZSBidXMgYW5kIHRoZSByZW1vdGUgYXBwbGljYXRpb24ncworICAgICAgICA8bGl0ZXJhbD5PYmplY3RNYW5hZ2VyPC9saXRlcmFsPiwgcmVzcGVjdGl2ZWx5LiBXaGVuZXZlciBhIG5ldworICAgICAgICByZW1vdGUgb2JqZWN0IGlzIGNyZWF0ZWQgKG9yIGFuIGV4aXN0aW5nIG9iamVjdCBnYWlucyBhIG5ldworICAgICAgICBpbnRlcmZhY2UpLCB0aGUgPGxpdGVyYWw+SW50ZXJmYWNlc0FkZGVkPC9saXRlcmFsPiBzaWduYWwgaXMKKyAgICAgICAgZW1pdHRlZCwgYW5kIHNpbmNlIHRoaXMgc2lnbmFsIGNvbnRhaW5zIGFsbCBwcm9wZXJ0aWVzIGZvciB0aGUKKyAgICAgICAgaW50ZXJmYWNlcywgbm8gY2FsbHMgdG8gdGhlCisgICAgICAgIDxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5Qcm9wZXJ0aWVzPC9saXRlcmFsPiBpbnRlcmZhY2Ugb24gdGhlCisgICAgICAgIHJlbW90ZSBvYmplY3QgYXJlIG5lZWRlZC4gQWRkaXRpb25hbGx5LCBzaW5jZSB0aGUgaW5pdGlhbAorICAgICAgICA8bGl0ZXJhbD5BZGRNYXRjaCgpPC9saXRlcmFsPiBydWxlIGFscmVhZHkgaW5jbHVkZXMgc2lnbmFsCisgICAgICAgIG1lc3NhZ2VzIGZyb20gdGhlIG5ld2x5IGNyZWF0ZWQgY2hpbGQgb2JqZWN0LCBubyBuZXcKKyAgICAgICAgPGxpdGVyYWw+QWRkTWF0Y2goKTwvbGl0ZXJhbD4gY2FsbCBpcyBuZWVkZWQuCisgICAgICA8L3BhcmE+CisKKyAgICAgIDxwYXJhPgorICAgICAgICA8ZW1waGFzaXM+CisgICAgICAgICAgVGhlIDxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzLk9iamVjdE1hbmFnZXI8L2xpdGVyYWw+CisgICAgICAgICAgaW50ZXJmYWNlIHdhcyBhZGRlZCBpbiB2ZXJzaW9uIDAuMTcgb2YgdGhlIEQtQnVzCisgICAgICAgICAgc3BlY2lmaWNhdGlvbi4KKyAgICAgICAgPC9lbXBoYXNpcz4KKyAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3QyPgorICA8L3NlY3QxPgorCisgIDxzZWN0MSBpZD0iaW50cm9zcGVjdGlvbi1mb3JtYXQiPgorICAgIDx0aXRsZT5JbnRyb3NwZWN0aW9uIERhdGEgRm9ybWF0PC90aXRsZT4KKyAgICA8cGFyYT4KKyAgICAgIEFzIGRlc2NyaWJlZCBpbiA8eHJlZiBsaW5rZW5kPSJzdGFuZGFyZC1pbnRlcmZhY2VzLWludHJvc3BlY3RhYmxlIi8+LAorICAgICAgb2JqZWN0cyBtYXkgYmUgaW50cm9zcGVjdGVkIGF0IHJ1bnRpbWUsIHJldHVybmluZyBhbiBYTUwgc3RyaW5nCisgICAgICB0aGF0IGRlc2NyaWJlcyB0aGUgb2JqZWN0LiBUaGUgc2FtZSBYTUwgZm9ybWF0IG1heSBiZSB1c2VkIGluCisgICAgICBvdGhlciBjb250ZXh0cyBhcyB3ZWxsLCBmb3IgZXhhbXBsZSBhcyBhbiAiSURMIiBmb3IgZ2VuZXJhdGluZworICAgICAgc3RhdGljIGxhbmd1YWdlIGJpbmRpbmdzLgorICAgIDwvcGFyYT4KKyAgICA8cGFyYT4KKyAgICAgIEhlcmUgaXMgYW4gZXhhbXBsZSBvZiBpbnRyb3NwZWN0aW9uIGRhdGE6CisgICAgICA8cHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICZsdDshRE9DVFlQRSBub2RlIFBVQkxJQyAiLS8vZnJlZWRlc2t0b3AvL0RURCBELUJVUyBPYmplY3QgSW50cm9zcGVjdGlvbiAxLjAvL0VOIgorICAgICAgICAgImh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3N0YW5kYXJkcy9kYnVzLzEuMC9pbnRyb3NwZWN0LmR0ZCImZ3Q7CisgICAgICAgICZsdDtub2RlIG5hbWU9Ii9jb20vZXhhbXBsZS9zYW1wbGVfb2JqZWN0MCImZ3Q7CisgICAgICAgICAgJmx0O2ludGVyZmFjZSBuYW1lPSJjb20uZXhhbXBsZS5TYW1wbGVJbnRlcmZhY2UwIiZndDsKKyAgICAgICAgICAgICZsdDttZXRob2QgbmFtZT0iRnJvYmF0ZSImZ3Q7CisgICAgICAgICAgICAgICZsdDthcmcgbmFtZT0iZm9vIiB0eXBlPSJpIiBkaXJlY3Rpb249ImluIi8mZ3Q7CisgICAgICAgICAgICAgICZsdDthcmcgbmFtZT0iYmFyIiB0eXBlPSJzIiBkaXJlY3Rpb249Im91dCIvJmd0OworICAgICAgICAgICAgICAmbHQ7YXJnIG5hbWU9ImJheiIgdHlwZT0iYXt1c30iIGRpcmVjdGlvbj0ib3V0Ii8mZ3Q7CisgICAgICAgICAgICAgICZsdDthbm5vdGF0aW9uIG5hbWU9Im9yZy5mcmVlZGVza3RvcC5EQnVzLkRlcHJlY2F0ZWQiIHZhbHVlPSJ0cnVlIi8mZ3Q7CisgICAgICAgICAgICAmbHQ7L21ldGhvZCZndDsKKyAgICAgICAgICAgICZsdDttZXRob2QgbmFtZT0iQmF6aWZ5IiZndDsKKyAgICAgICAgICAgICAgJmx0O2FyZyBuYW1lPSJiYXIiIHR5cGU9IihpaXUpIiBkaXJlY3Rpb249ImluIi8mZ3Q7CisgICAgICAgICAgICAgICZsdDthcmcgbmFtZT0iYmFyIiB0eXBlPSJ2IiBkaXJlY3Rpb249Im91dCIvJmd0OworICAgICAgICAgICAgJmx0Oy9tZXRob2QmZ3Q7CisgICAgICAgICAgICAmbHQ7bWV0aG9kIG5hbWU9Ik1vZ3JpZnkiJmd0OworICAgICAgICAgICAgICAmbHQ7YXJnIG5hbWU9ImJhciIgdHlwZT0iKGlpYXYpIiBkaXJlY3Rpb249ImluIi8mZ3Q7CisgICAgICAgICAgICAmbHQ7L21ldGhvZCZndDsKKyAgICAgICAgICAgICZsdDtzaWduYWwgbmFtZT0iQ2hhbmdlZCImZ3Q7CisgICAgICAgICAgICAgICZsdDthcmcgbmFtZT0ibmV3X3ZhbHVlIiB0eXBlPSJiIi8mZ3Q7CisgICAgICAgICAgICAmbHQ7L3NpZ25hbCZndDsKKyAgICAgICAgICAgICZsdDtwcm9wZXJ0eSBuYW1lPSJCYXIiIHR5cGU9InkiIGFjY2Vzcz0icmVhZHdyaXRlIi8mZ3Q7CisgICAgICAgICAgJmx0Oy9pbnRlcmZhY2UmZ3Q7CisgICAgICAgICAgJmx0O25vZGUgbmFtZT0iY2hpbGRfb2Zfc2FtcGxlX29iamVjdCIvJmd0OworICAgICAgICAgICZsdDtub2RlIG5hbWU9ImFub3RoZXJfY2hpbGRfb2Zfc2FtcGxlX29iamVjdCIvJmd0OworICAgICAgICZsdDsvbm9kZSZndDsKKyAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgPC9wYXJhPgorICAgIDxwYXJhPgorICAgICAgQSBtb3JlIGZvcm1hbCBEVEQgYW5kIHNwZWMgbmVlZHMgd3JpdGluZywgYnV0IGhlcmUgYXJlIHNvbWUgcXVpY2sgbm90ZXMuCisgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBPbmx5IHRoZSByb290ICZsdDtub2RlJmd0OyBlbGVtZW50IGNhbiBvbWl0IHRoZSBub2RlIG5hbWUsIGFzIGl0J3MKKyAgICAgICAgICAgIGtub3duIHRvIGJlIHRoZSBvYmplY3QgdGhhdCB3YXMgaW50cm9zcGVjdGVkLiAgSWYgdGhlIHJvb3QKKyAgICAgICAgICAgICZsdDtub2RlJmd0OyBkb2VzIGhhdmUgYSBuYW1lIGF0dHJpYnV0ZSwgaXQgbXVzdCBiZSBhbiBhYnNvbHV0ZQorICAgICAgICAgICAgb2JqZWN0IHBhdGguIElmIGNoaWxkICZsdDtub2RlJmd0OyBoYXZlIG9iamVjdCBwYXRocywgdGhleSBtdXN0IGJlCisgICAgICAgICAgICByZWxhdGl2ZS4KKyAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIElmIGEgY2hpbGQgJmx0O25vZGUmZ3Q7IGhhcyBhbnkgc3ViLWVsZW1lbnRzLCB0aGVuIHRoZXkKKyAgICAgICAgICAgIG11c3QgcmVwcmVzZW50IGEgY29tcGxldGUgaW50cm9zcGVjdGlvbiBvZiB0aGUgY2hpbGQuCisgICAgICAgICAgICBJZiBhIGNoaWxkICZsdDtub2RlJmd0OyBpcyBlbXB0eSwgdGhlbiBpdCBtYXkgb3IgbWF5CisgICAgICAgICAgICBub3QgaGF2ZSBzdWItZWxlbWVudHM7IHRoZSBjaGlsZCBtdXN0IGJlIGludHJvc3BlY3RlZAorICAgICAgICAgICAgaW4gb3JkZXIgdG8gZmluZCBvdXQuIFRoZSBpbnRlbnQgaXMgdGhhdCBpZiBhbiBvYmplY3QKKyAgICAgICAgICAgIGtub3dzIHRoYXQgaXRzIGNoaWxkcmVuIGFyZSAiZmFzdCIgdG8gaW50cm9zcGVjdAorICAgICAgICAgICAgaXQgY2FuIGdvIGFoZWFkIGFuZCByZXR1cm4gdGhlaXIgaW5mb3JtYXRpb24sIGJ1dAorICAgICAgICAgICAgb3RoZXJ3aXNlIGl0IGNhbiBvbWl0IGl0LgorICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgVGhlIGRpcmVjdGlvbiBlbGVtZW50IG9uICZsdDthcmcmZ3Q7IG1heSBiZSBvbWl0dGVkLAorICAgICAgICAgICAgaW4gd2hpY2ggY2FzZSBpdCBkZWZhdWx0cyB0byAiaW4iIGZvciBtZXRob2QgY2FsbHMKKyAgICAgICAgICAgIGFuZCAib3V0IiBmb3Igc2lnbmFscy4gU2lnbmFscyBvbmx5IGFsbG93ICJvdXQiCisgICAgICAgICAgICBzbyB3aGlsZSBkaXJlY3Rpb24gbWF5IGJlIHNwZWNpZmllZCwgaXQncyBwb2ludGxlc3MuCisgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBUaGUgcG9zc2libGUgZGlyZWN0aW9ucyBhcmUgImluIiBhbmQgIm91dCIsCisgICAgICAgICAgICB1bmxpa2UgQ09SQkEgdGhlcmUgaXMgbm8gImlub3V0IgorICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgVGhlIHBvc3NpYmxlIHByb3BlcnR5IGFjY2VzcyBmbGFncyBhcmUKKyAgICAgICAgICAgICJyZWFkd3JpdGUiLCAicmVhZCIsIGFuZCAid3JpdGUiCisgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBNdWx0aXBsZSBpbnRlcmZhY2VzIGNhbiBvZiBjb3Vyc2UgYmUgbGlzdGVkIGZvcgorICAgICAgICAgICAgb25lICZsdDtub2RlJmd0Oy4KKyAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFRoZSAibmFtZSIgYXR0cmlidXRlIG9uIGFyZ3VtZW50cyBpcyBvcHRpb25hbC4KKyAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICA8L3BhcmE+CisgICAgPHBhcmE+CisgICAgICAgIE1ldGhvZCwgaW50ZXJmYWNlLCBwcm9wZXJ0eSwgc2lnbmFsLCBhbmQgYXJndW1lbnQgZWxlbWVudHMgbWF5IGhhdmUKKyAgICAgICAgImFubm90YXRpb25zIiwgd2hpY2ggYXJlIGdlbmVyaWMga2V5L3ZhbHVlIHBhaXJzIG9mIG1ldGFkYXRhLgorICAgICAgICBUaGV5IGFyZSBzaW1pbGFyIGNvbmNlcHR1YWxseSB0byBKYXZhJ3MgYW5ub3RhdGlvbnMgYW5kIEMjIGF0dHJpYnV0ZXMuCisgICAgICAgIFdlbGwta25vd24gYW5ub3RhdGlvbnM6CisgICAgIDwvcGFyYT4KKyAgICAgPGluZm9ybWFsdGFibGU+CisgICAgICAgPHRncm91cCBjb2xzPSIzIj4KKyAgICAgICAgIDx0aGVhZD4KKyAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICA8ZW50cnk+TmFtZTwvZW50cnk+CisgICAgICAgICAgICAgPGVudHJ5PlZhbHVlcyAoc2VwYXJhdGVkIGJ5ICwpPC9lbnRyeT4KKyAgICAgICAgICAgICA8ZW50cnk+RGVzY3JpcHRpb248L2VudHJ5PgorICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgIDwvdGhlYWQ+CisgICAgICAgICA8dGJvZHk+CisgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgPGVudHJ5Pm9yZy5mcmVlZGVza3RvcC5EQnVzLkRlcHJlY2F0ZWQ8L2VudHJ5PgorICAgICAgICAgICAgIDxlbnRyeT50cnVlLGZhbHNlPC9lbnRyeT4KKyAgICAgICAgICAgICA8ZW50cnk+V2hldGhlciBvciBub3QgdGhlIGVudGl0eSBpcyBkZXByZWNhdGVkOyBkZWZhdWx0cyB0byBmYWxzZTwvZW50cnk+CisgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgIDxlbnRyeT5vcmcuZnJlZWRlc2t0b3AuREJ1cy5HTGliLkNTeW1ib2w8L2VudHJ5PgorICAgICAgICAgICAgIDxlbnRyeT4oc3RyaW5nKTwvZW50cnk+CisgICAgICAgICAgICAgPGVudHJ5PlRoZSBDIHN5bWJvbDsgbWF5IGJlIHVzZWQgZm9yIG1ldGhvZHMgYW5kIGludGVyZmFjZXM8L2VudHJ5PgorICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICA8ZW50cnk+b3JnLmZyZWVkZXNrdG9wLkRCdXMuTWV0aG9kLk5vUmVwbHk8L2VudHJ5PgorICAgICAgICAgICAgIDxlbnRyeT50cnVlLGZhbHNlPC9lbnRyeT4KKyAgICAgICAgICAgICA8ZW50cnk+SWYgc2V0LCBkb24ndCBleHBlY3QgYSByZXBseSB0byB0aGUgbWV0aG9kIGNhbGw7IGRlZmF1bHRzIHRvIGZhbHNlLjwvZW50cnk+CisgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgIDxlbnRyeT5vcmcuZnJlZWRlc2t0b3AuREJ1cy5Qcm9wZXJ0eS5FbWl0c0NoYW5nZWRTaWduYWw8L2VudHJ5PgorICAgICAgICAgICAgIDxlbnRyeT50cnVlLGludmFsaWRhdGVzLGNvbnN0LGZhbHNlPC9lbnRyeT4KKyAgICAgICAgICAgICA8ZW50cnk+CisgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgSWYgc2V0IHRvIDxsaXRlcmFsPmZhbHNlPC9saXRlcmFsPiwgdGhlCisgICAgICAgICAgICAgICAgIDxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzLlByb3BlcnRpZXMuUHJvcGVydGllc0NoYW5nZWQ8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgIHNpZ25hbCwgc2VlIDx4cmVmCisgICAgICAgICAgICAgICAgIGxpbmtlbmQ9InN0YW5kYXJkLWludGVyZmFjZXMtcHJvcGVydGllcyIvPiBpcyBub3QKKyAgICAgICAgICAgICAgICAgZ3VhcmFudGVlZCB0byBiZSBlbWl0dGVkIGlmIHRoZSBwcm9wZXJ0eSBjaGFuZ2VzLgorICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgIElmIHNldCB0byA8bGl0ZXJhbD5jb25zdDwvbGl0ZXJhbD4gdGhlIHByb3BlcnR5IG5ldmVyCisgICAgICAgICAgICAgICAgIGNoYW5nZXMgdmFsdWUgZHVyaW5nIHRoZSBsaWZldGltZSBvZiB0aGUgb2JqZWN0IGl0CisgICAgICAgICAgICAgICAgIGJlbG9uZ3MgdG8sIGFuZCBoZW5jZSB0aGUgc2lnbmFsIGlzIG5ldmVyIGVtaXR0ZWQgZm9yCisgICAgICAgICAgICAgICAgIGl0LgorICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgIElmIHNldCB0byA8bGl0ZXJhbD5pbnZhbGlkYXRlczwvbGl0ZXJhbD4gdGhlIHNpZ25hbAorICAgICAgICAgICAgICAgICBpcyBlbWl0dGVkIGJ1dCB0aGUgdmFsdWUgaXMgbm90IGluY2x1ZGVkIGluIHRoZQorICAgICAgICAgICAgICAgICBzaWduYWwuCisgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgSWYgc2V0IHRvIDxsaXRlcmFsPnRydWU8L2xpdGVyYWw+IHRoZSBzaWduYWwgaXMKKyAgICAgICAgICAgICAgICAgZW1pdHRlZCB3aXRoIHRoZSB2YWx1ZSBpbmNsdWRlZC4KKyAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICBUaGUgdmFsdWUgZm9yIHRoZSBhbm5vdGF0aW9uIGRlZmF1bHRzIHRvCisgICAgICAgICAgICAgICAgIDxsaXRlcmFsPnRydWU8L2xpdGVyYWw+IGlmIHRoZSBlbmNsb3NpbmcgaW50ZXJmYWNlCisgICAgICAgICAgICAgICAgIGVsZW1lbnQgZG9lcyBub3Qgc3BlY2lmeSB0aGUgYW5ub3RhdGlvbi4gT3RoZXJ3aXNlIGl0CisgICAgICAgICAgICAgICAgIGRlZmF1bHRzIHRvIHRoZSB2YWx1ZSBzcGVjaWZpZWQgaW4gdGhlIGVuY2xvc2luZworICAgICAgICAgICAgICAgICBpbnRlcmZhY2UgZWxlbWVudC4KKyAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICBUaGlzIGFubm90YXRpb24gaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBieSBjb2RlCisgICAgICAgICAgICAgICAgIGdlbmVyYXRvcnMgdG8gaW1wbGVtZW50IGNsaWVudC1zaWRlIGNhY2hpbmcgb2YKKyAgICAgICAgICAgICAgICAgcHJvcGVydHkgdmFsdWVzLiBGb3IgYWxsIHByb3BlcnRpZXMgZm9yIHdoaWNoIHRoZQorICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uIGlzIHNldCB0byA8bGl0ZXJhbD5jb25zdDwvbGl0ZXJhbD4sCisgICAgICAgICAgICAgICAgIDxsaXRlcmFsPmludmFsaWRhdGVzPC9saXRlcmFsPiBvcgorICAgICAgICAgICAgICAgICA8bGl0ZXJhbD50cnVlPC9saXRlcmFsPiB0aGUgY2xpZW50IG1heQorICAgICAgICAgICAgICAgICB1bmNvbmRpdGlvbmFsbHkgY2FjaGUgdGhlIHZhbHVlcyBhcyB0aGUgcHJvcGVydGllcworICAgICAgICAgICAgICAgICBkb24ndCBjaGFuZ2Ugb3Igbm90aWZpY2F0aW9ucyBhcmUgZ2VuZXJhdGVkIGZvciB0aGVtCisgICAgICAgICAgICAgICAgIGlmIHRoZXkgZG8uCisgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgPC9yb3c+CisgICAgICAgICA8L3Rib2R5PgorICAgICAgIDwvdGdyb3VwPgorICAgICA8L2luZm9ybWFsdGFibGU+CisgIDwvc2VjdDE+CisgIDxzZWN0MSBpZD0ibWVzc2FnZS1idXMiPgorICAgIDx0aXRsZT5NZXNzYWdlIEJ1cyBTcGVjaWZpY2F0aW9uPC90aXRsZT4KKyAgICA8c2VjdDIgaWQ9Im1lc3NhZ2UtYnVzLW92ZXJ2aWV3Ij4KKyAgICAgIDx0aXRsZT5NZXNzYWdlIEJ1cyBPdmVydmlldzwvdGl0bGU+CisgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIG1lc3NhZ2UgYnVzIGFjY2VwdHMgY29ubmVjdGlvbnMgZnJvbSBvbmUgb3IgbW9yZSBhcHBsaWNhdGlvbnMuCisgICAgICAgIE9uY2UgY29ubmVjdGVkLCBhcHBsaWNhdGlvbnMgY2FuIGV4Y2hhbmdlIG1lc3NhZ2VzIHdpdGggb3RoZXIKKyAgICAgICAgYXBwbGljYXRpb25zIHRoYXQgYXJlIGFsc28gY29ubmVjdGVkIHRvIHRoZSBidXMuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgSW4gb3JkZXIgdG8gcm91dGUgbWVzc2FnZXMgYW1vbmcgY29ubmVjdGlvbnMsIHRoZSBtZXNzYWdlIGJ1cyBrZWVwcyBhCisgICAgICAgIG1hcHBpbmcgZnJvbSBuYW1lcyB0byBjb25uZWN0aW9ucy4gRWFjaCBjb25uZWN0aW9uIGhhcyBvbmUKKyAgICAgICAgdW5pcXVlLWZvci10aGUtbGlmZXRpbWUtb2YtdGhlLWJ1cyBuYW1lIGF1dG9tYXRpY2FsbHkgYXNzaWduZWQuCisgICAgICAgIEFwcGxpY2F0aW9ucyBtYXkgcmVxdWVzdCBhZGRpdGlvbmFsIG5hbWVzIGZvciBhIGNvbm5lY3Rpb24uIEFkZGl0aW9uYWwKKyAgICAgICAgbmFtZXMgYXJlIHVzdWFsbHkgIndlbGwta25vd24gbmFtZXMiIHN1Y2ggYXMKKyAgICAgICAgImNvbS5leGFtcGxlLlRleHRFZGl0b3IxIi4gV2hlbiBhIG5hbWUgaXMgYm91bmQgdG8gYSBjb25uZWN0aW9uLAorICAgICAgICB0aGF0IGNvbm5lY3Rpb24gaXMgc2FpZCB0byA8Zmlyc3R0ZXJtPm93bjwvZmlyc3R0ZXJtPiB0aGUgbmFtZS4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBUaGUgYnVzIGl0c2VsZiBvd25zIGEgc3BlY2lhbCBuYW1lLAorICAgICAgICA8bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuREJ1czwvbGl0ZXJhbD4sIHdpdGggYW4gb2JqZWN0CisgICAgICAgIGxvY2F0ZWQgYXQgPGxpdGVyYWw+L29yZy9mcmVlZGVza3RvcC9EQnVzPC9saXRlcmFsPiB0aGF0CisgICAgICAgIGltcGxlbWVudHMgdGhlIDxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzPC9saXRlcmFsPgorICAgICAgICBpbnRlcmZhY2UuIFRoaXMgc2VydmljZSBhbGxvd3MgYXBwbGljYXRpb25zIHRvIG1ha2UKKyAgICAgICAgYWRtaW5pc3RyYXRpdmUgcmVxdWVzdHMgb2YgdGhlIGJ1cyBpdHNlbGYuIEZvciBleGFtcGxlLAorICAgICAgICBhcHBsaWNhdGlvbnMgY2FuIGFzayB0aGUgYnVzIHRvIGFzc2lnbiBhIG5hbWUgdG8gYSBjb25uZWN0aW9uLgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIEVhY2ggbmFtZSBtYXkgaGF2ZSA8Zmlyc3R0ZXJtPnF1ZXVlZCBvd25lcnM8L2ZpcnN0dGVybT4uICBXaGVuIGFuCisgICAgICAgIGFwcGxpY2F0aW9uIHJlcXVlc3RzIGEgbmFtZSBmb3IgYSBjb25uZWN0aW9uIGFuZCB0aGUgbmFtZSBpcyBhbHJlYWR5IGluCisgICAgICAgIHVzZSwgdGhlIGJ1cyB3aWxsIG9wdGlvbmFsbHkgYWRkIHRoZSBjb25uZWN0aW9uIHRvIGEgcXVldWUgd2FpdGluZyBmb3IKKyAgICAgICAgdGhlIG5hbWUuIElmIHRoZSBjdXJyZW50IG93bmVyIG9mIHRoZSBuYW1lIGRpc2Nvbm5lY3RzIG9yIHJlbGVhc2VzCisgICAgICAgIHRoZSBuYW1lLCB0aGUgbmV4dCBjb25uZWN0aW9uIGluIHRoZSBxdWV1ZSB3aWxsIGJlY29tZSB0aGUgbmV3IG93bmVyLgorICAgICAgPC9wYXJhPgorCisgICAgICA8cGFyYT4KKyAgICAgICAgVGhpcyBmZWF0dXJlIGNhdXNlcyB0aGUgcmlnaHQgdGhpbmcgdG8gaGFwcGVuIGlmIHlvdSBzdGFydCB0d28gdGV4dAorICAgICAgICBlZGl0b3JzIGZvciBleGFtcGxlOyB0aGUgZmlyc3Qgb25lIG1heSByZXF1ZXN0ICJjb20uZXhhbXBsZS5UZXh0RWRpdG9yMSIsCisgICAgICAgIGFuZCB0aGUgc2Vjb25kIHdpbGwgYmUgcXVldWVkIGFzIGEgcG9zc2libGUgb3duZXIgb2YgdGhhdCBuYW1lLiBXaGVuCisgICAgICAgIHRoZSBmaXJzdCBleGl0cywgdGhlIHNlY29uZCB3aWxsIHRha2Ugb3Zlci4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIEFwcGxpY2F0aW9ucyBtYXkgc2VuZCA8Zmlyc3R0ZXJtPnVuaWNhc3QgbWVzc2FnZXM8L2ZpcnN0dGVybT4gdG8KKyAgICAgICAgYSBzcGVjaWZpYyByZWNpcGllbnQgb3IgdG8gdGhlIG1lc3NhZ2UgYnVzIGl0c2VsZiwgb3IKKyAgICAgICAgPGZpcnN0dGVybT5icm9hZGNhc3QgbWVzc2FnZXM8L2ZpcnN0dGVybT4gdG8gYWxsIGludGVyZXN0ZWQgcmVjaXBpZW50cy4KKyAgICAgICAgU2VlIDx4cmVmIGxpbmtlbmQ9Im1lc3NhZ2UtYnVzLXJvdXRpbmciLz4gZm9yIGRldGFpbHMuCisgICAgICA8L3BhcmE+CisgICAgPC9zZWN0Mj4KKworICAgIDxzZWN0MiBpZD0ibWVzc2FnZS1idXMtbmFtZXMiPgorICAgICAgPHRpdGxlPk1lc3NhZ2UgQnVzIE5hbWVzPC90aXRsZT4KKyAgICAgIDxwYXJhPgorICAgICAgICBFYWNoIGNvbm5lY3Rpb24gaGFzIGF0IGxlYXN0IG9uZSBuYW1lLCBhc3NpZ25lZCBhdCBjb25uZWN0aW9uIHRpbWUgYW5kCisgICAgICAgIHJldHVybmVkIGluIHJlc3BvbnNlIHRvIHRoZQorICAgICAgICA8bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuREJ1cy5IZWxsbzwvbGl0ZXJhbD4gbWV0aG9kIGNhbGwuICBUaGlzCisgICAgICAgIGF1dG9tYXRpY2FsbHktYXNzaWduZWQgbmFtZSBpcyBjYWxsZWQgdGhlIGNvbm5lY3Rpb24ncyA8Zmlyc3R0ZXJtPnVuaXF1ZQorICAgICAgICBuYW1lPC9maXJzdHRlcm0+LiAgVW5pcXVlIG5hbWVzIGFyZSBuZXZlciByZXVzZWQgZm9yIHR3byBkaWZmZXJlbnQKKyAgICAgICAgY29ubmVjdGlvbnMgdG8gdGhlIHNhbWUgYnVzLgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIE93bmVyc2hpcCBvZiBhIHVuaXF1ZSBuYW1lIGlzIGEgcHJlcmVxdWlzaXRlIGZvciBpbnRlcmFjdGlvbiB3aXRoCisgICAgICAgIHRoZSBtZXNzYWdlIGJ1cy4gSXQgbG9naWNhbGx5IGZvbGxvd3MgdGhhdCB0aGUgdW5pcXVlIG5hbWUgaXMgYWx3YXlzCisgICAgICAgIHRoZSBmaXJzdCBuYW1lIHRoYXQgYW4gYXBwbGljYXRpb24gY29tZXMgdG8gb3duLCBhbmQgdGhlIGxhc3QKKyAgICAgICAgb25lIHRoYXQgaXQgbG9zZXMgb3duZXJzaGlwIG9mLgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIFVuaXF1ZSBjb25uZWN0aW9uIG5hbWVzIG11c3QgYmVnaW4gd2l0aCB0aGUgY2hhcmFjdGVyICc6JyAoQVNDSUkgY29sb24KKyAgICAgICAgY2hhcmFjdGVyKTsgYnVzIG5hbWVzIHRoYXQgYXJlIG5vdCB1bmlxdWUgbmFtZXMgbXVzdCBub3QgYmVnaW4KKyAgICAgICAgd2l0aCB0aGlzIGNoYXJhY3Rlci4gKFRoZSBidXMgbXVzdCByZWplY3QgYW55IGF0dGVtcHQgYnkgYW4gYXBwbGljYXRpb24KKyAgICAgICAgdG8gbWFudWFsbHkgcmVxdWVzdCBhIG5hbWUgYmVnaW5uaW5nIHdpdGggJzonLikgVGhpcyByZXN0cmljdGlvbgorICAgICAgICBjYXRlZ29yaWNhbGx5IHByZXZlbnRzICJzcG9vZmluZyI7IG1lc3NhZ2VzIHNlbnQgdG8gYSB1bmlxdWUgbmFtZQorICAgICAgICB3aWxsIGFsd2F5cyBnbyB0byB0aGUgZXhwZWN0ZWQgY29ubmVjdGlvbi4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBXaGVuIGEgY29ubmVjdGlvbiBpcyBjbG9zZWQsIGFsbCB0aGUgbmFtZXMgdGhhdCBpdCBvd25zIGFyZSBkZWxldGVkIChvcgorICAgICAgICB0cmFuc2ZlcnJlZCB0byB0aGUgbmV4dCBjb25uZWN0aW9uIGluIHRoZSBxdWV1ZSBpZiBhbnkpLgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIEEgY29ubmVjdGlvbiBjYW4gcmVxdWVzdCBhZGRpdGlvbmFsIG5hbWVzIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCBpdCB1c2luZworICAgICAgICB0aGUgPGxpdGVyYWw+b3JnLmZyZWVkZXNrdG9wLkRCdXMuUmVxdWVzdE5hbWU8L2xpdGVyYWw+IG1lc3NhZ2UuIDx4cmVmCisgICAgICAgIGxpbmtlbmQ9Im1lc3NhZ2UtcHJvdG9jb2wtbmFtZXMtYnVzIi8+IGRlc2NyaWJlcyB0aGUgZm9ybWF0IG9mIGEgdmFsaWQKKyAgICAgICAgbmFtZS4gVGhlc2UgbmFtZXMgY2FuIGJlIHJlbGVhc2VkIGFnYWluIHVzaW5nIHRoZQorICAgICAgICA8bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuREJ1cy5SZWxlYXNlTmFtZTwvbGl0ZXJhbD4gbWVzc2FnZS4KKyAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3QyPgorCisgICAgPHNlY3QyIGlkPSJtZXNzYWdlLWJ1cy1yb3V0aW5nIj4KKyAgICAgIDx0aXRsZT5NZXNzYWdlIEJ1cyBNZXNzYWdlIFJvdXRpbmc8L3RpdGxlPgorCisgICAgICA8cGFyYT4KKyAgICAgICAgTWVzc2FnZXMgbWF5IGhhdmUgYSA8bGl0ZXJhbD5ERVNUSU5BVElPTjwvbGl0ZXJhbD4gZmllbGQgKHNlZSA8eHJlZgorICAgICAgICAgIGxpbmtlbmQ9Im1lc3NhZ2UtcHJvdG9jb2wtaGVhZGVyLWZpZWxkcyIvPiksIHJlc3VsdGluZyBpbiBhCisgICAgICAgIDxmaXJzdHRlcm0+dW5pY2FzdCBtZXNzYWdlPC9maXJzdHRlcm0+LiAgSWYgdGhlCisgICAgICAgIDxsaXRlcmFsPkRFU1RJTkFUSU9OPC9saXRlcmFsPiBmaWVsZCBpcyBwcmVzZW50LCBpdCBzcGVjaWZpZXMgYSBtZXNzYWdlCisgICAgICAgIHJlY2lwaWVudCBieSBuYW1lLiBNZXRob2QgY2FsbHMgYW5kIHJlcGxpZXMgbm9ybWFsbHkgc3BlY2lmeSB0aGlzIGZpZWxkLgorICAgICAgICBUaGUgbWVzc2FnZSBidXMgbXVzdCBzZW5kIG1lc3NhZ2VzIChvZiBhbnkgdHlwZSkgd2l0aCB0aGUKKyAgICAgICAgPGxpdGVyYWw+REVTVElOQVRJT048L2xpdGVyYWw+IGZpZWxkIHNldCB0byB0aGUgc3BlY2lmaWVkIHJlY2lwaWVudCwKKyAgICAgICAgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSByZWNpcGllbnQgaGFzIHNldCB1cCBhIG1hdGNoIHJ1bGUgbWF0Y2hpbmcKKyAgICAgICAgdGhlIG1lc3NhZ2UuCisgICAgICA8L3BhcmE+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBXaGVuIHRoZSBtZXNzYWdlIGJ1cyByZWNlaXZlcyBhIHNpZ25hbCwgaWYgdGhlCisgICAgICAgIDxsaXRlcmFsPkRFU1RJTkFUSU9OPC9saXRlcmFsPiBmaWVsZCBpcyBhYnNlbnQsIGl0IGlzIGNvbnNpZGVyZWQgdG8KKyAgICAgICAgYmUgYSA8Zmlyc3R0ZXJtPmJyb2FkY2FzdCBzaWduYWw8L2ZpcnN0dGVybT4sIGFuZCBpcyBzZW50IHRvIGFsbAorICAgICAgICBhcHBsaWNhdGlvbnMgd2l0aCA8Zmlyc3R0ZXJtPm1lc3NhZ2UgbWF0Y2hpbmcgcnVsZXM8L2ZpcnN0dGVybT4gdGhhdAorICAgICAgICBtYXRjaCB0aGUgbWVzc2FnZS4gTW9zdCBzaWduYWwgbWVzc2FnZXMgYXJlIGJyb2FkY2FzdHMsIGFuZAorICAgICAgICBubyBvdGhlciBtZXNzYWdlIHR5cGVzIGN1cnJlbnRseSBkZWZpbmVkIGluIHRoaXMgc3BlY2lmaWNhdGlvbgorICAgICAgICBtYXkgYmUgYnJvYWRjYXN0LgorICAgICAgPC9wYXJhPgorCisgICAgICA8cGFyYT4KKyAgICAgICAgVW5pY2FzdCBzaWduYWwgbWVzc2FnZXMgKHRob3NlIHdpdGggYSA8bGl0ZXJhbD5ERVNUSU5BVElPTjwvbGl0ZXJhbD4KKyAgICAgICAgZmllbGQpIGFyZSBub3QgY29tbW9ubHkgdXNlZCwgYnV0IHRoZXkgYXJlIHRyZWF0ZWQgbGlrZSBhbnkgdW5pY2FzdAorICAgICAgICBtZXNzYWdlOiB0aGV5IGFyZSBkZWxpdmVyZWQgdG8gdGhlIHNwZWNpZmllZCByZWNlaXBpZW50LAorICAgICAgICByZWdhcmRsZXNzIG9mIGl0cyBtYXRjaCBydWxlcy4gIE9uZSB1c2UgZm9yIHVuaWNhc3Qgc2lnbmFscyBpcyB0bworICAgICAgICBhdm9pZCBhIHJhY2UgY29uZGl0aW9uIGluIHdoaWNoIGEgc2lnbmFsIGlzIGVtaXR0ZWQgYmVmb3JlIHRoZSBpbnRlbmRlZAorICAgICAgICByZWNpcGllbnQgY2FuIGNhbGwgPHhyZWYgbGlua2VuZD0iYnVzLW1lc3NhZ2VzLWFkZC1tYXRjaCIvPiB0bworICAgICAgICByZWNlaXZlIHRoYXQgc2lnbmFsOiBpZiB0aGUgc2lnbmFsIGlzIHNlbnQgZGlyZWN0bHkgdG8gdGhhdCByZWNpcGllbnQKKyAgICAgICAgdXNpbmcgYSB1bmljYXN0IG1lc3NhZ2UsIGl0IGRvZXMgbm90IG5lZWQgdG8gYWRkIGEgbWF0Y2ggcnVsZSBhdCBhbGwsCisgICAgICAgIGFuZCB0aGVyZSBpcyBubyByYWNlIGNvbmRpdGlvbi4gIEFub3RoZXIgdXNlIGZvciB1bmljYXN0IHNpZ25hbHMsCisgICAgICAgIG9uIG1lc3NhZ2UgYnVzZXMgd2hvc2Ugc2VjdXJpdHkgcG9saWN5IHByZXZlbnRzIGVhdmVzZHJvcHBpbmcsIGlzIHRvCisgICAgICAgIHNlbmQgc2Vuc2l0aXZlIGluZm9ybWF0aW9uIHdoaWNoIHNob3VsZCBvbmx5IGJlIHZpc2libGUgdG8gb25lCisgICAgICAgIHJlY2lwaWVudC4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIFdoZW4gdGhlIG1lc3NhZ2UgYnVzIHJlY2VpdmVzIGEgbWV0aG9kIGNhbGwsIGlmIHRoZQorICAgICAgICA8bGl0ZXJhbD5ERVNUSU5BVElPTjwvbGl0ZXJhbD4gZmllbGQgaXMgYWJzZW50LCB0aGUgY2FsbCBpcyB0YWtlbiB0byBiZQorICAgICAgICBhIHN0YW5kYXJkIG9uZS10by1vbmUgbWVzc2FnZSBhbmQgaW50ZXJwcmV0ZWQgYnkgdGhlIG1lc3NhZ2UgYnVzCisgICAgICAgIGl0c2VsZi4gRm9yIGV4YW1wbGUsIHNlbmRpbmcgYW4KKyAgICAgICAgPGxpdGVyYWw+b3JnLmZyZWVkZXNrdG9wLkRCdXMuUGVlci5QaW5nPC9saXRlcmFsPiBtZXNzYWdlIHdpdGggbm8KKyAgICAgICAgPGxpdGVyYWw+REVTVElOQVRJT048L2xpdGVyYWw+IHdpbGwgY2F1c2UgdGhlIG1lc3NhZ2UgYnVzIGl0c2VsZiB0bworICAgICAgICByZXBseSB0byB0aGUgcGluZyBpbW1lZGlhdGVseTsgdGhlIG1lc3NhZ2UgYnVzIHdpbGwgbm90IG1ha2UgdGhpcworICAgICAgICBtZXNzYWdlIHZpc2libGUgdG8gb3RoZXIgYXBwbGljYXRpb25zLgorICAgICAgPC9wYXJhPgorCisgICAgICA8cGFyYT4KKyAgICAgICAgQ29udGludWluZyB0aGUgPGxpdGVyYWw+b3JnLmZyZWVkZXNrdG9wLkRCdXMuUGVlci5QaW5nPC9saXRlcmFsPiBleGFtcGxlLCBpZgorICAgICAgICB0aGUgcGluZyBtZXNzYWdlIHdlcmUgc2VudCB3aXRoIGEgPGxpdGVyYWw+REVTVElOQVRJT048L2xpdGVyYWw+IG5hbWUgb2YKKyAgICAgICAgPGxpdGVyYWw+Y29tLnlveW9keW5lLlNjcmVlbnNhdmVyPC9saXRlcmFsPiwgdGhlbiB0aGUgcGluZyB3b3VsZCBiZQorICAgICAgICBmb3J3YXJkZWQsIGFuZCB0aGUgWW95b2R5bmUgQ29ycG9yYXRpb24gc2NyZWVuc2F2ZXIgYXBwbGljYXRpb24gd291bGQgYmUKKyAgICAgICAgZXhwZWN0ZWQgdG8gcmVwbHkgdG8gdGhlIHBpbmcuCisgICAgICA8L3BhcmE+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBNZXNzYWdlIGJ1cyBpbXBsZW1lbnRhdGlvbnMgbWF5IGltcG9zZSBhIHNlY3VyaXR5IHBvbGljeSB3aGljaAorICAgICAgICBwcmV2ZW50cyBjZXJ0YWluIG1lc3NhZ2VzIGZyb20gYmVpbmcgc2VudCBvciByZWNlaXZlZC4KKyAgICAgICAgV2hlbiBhIG1ldGhvZCBjYWxsIG1lc3NhZ2UgY2Fubm90IGJlIHNlbnQgb3IgcmVjZWl2ZWQgZHVlIHRvIGEgc2VjdXJpdHkKKyAgICAgICAgcG9saWN5LCB0aGUgbWVzc2FnZSBidXMgc2hvdWxkIHNlbmQgYW4gZXJyb3IgcmVwbHksIHVubGVzcyB0aGUKKyAgICAgICAgb3JpZ2luYWwgbWVzc2FnZSBoYWQgdGhlIDxsaXRlcmFsPk5PX1JFUExZPC9saXRlcmFsPiBmbGFnLgorICAgICAgPC9wYXJhPgorCisgICAgICA8c2VjdDMgaWQ9Im1lc3NhZ2UtYnVzLXJvdXRpbmctZWF2ZXNkcm9wcGluZyI+CisgICAgICAgIDx0aXRsZT5FYXZlc2Ryb3BwaW5nPC90aXRsZT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgUmVjZWl2aW5nIGEgdW5pY2FzdCBtZXNzYWdlIHdob3NlIDxsaXRlcmFsPkRFU1RJTkFUSU9OPC9saXRlcmFsPgorICAgICAgICAgIGluZGljYXRlcyBhIGRpZmZlcmVudCByZWNpcGllbnQgaXMgY2FsbGVkCisgICAgICAgICAgPGZpcnN0dGVybT5lYXZlc2Ryb3BwaW5nPC9maXJzdHRlcm0+LiBPbiBhIG1lc3NhZ2UgYnVzIHdoaWNoIGFjdHMgYXMKKyAgICAgICAgICBhIHNlY3VyaXR5IGJvdW5kYXJ5IChsaWtlIHRoZSBzdGFuZGFyZCBzeXN0ZW0gYnVzKSwgdGhlIHNlY3VyaXR5CisgICAgICAgICAgcG9saWN5IHNob3VsZCB1c3VhbGx5IHByZXZlbnQgZWF2ZXNkcm9wcGluZywgc2luY2UgdW5pY2FzdCBtZXNzYWdlcworICAgICAgICAgIGFyZSBub3JtYWxseSBrZXB0IHByaXZhdGUgYW5kIG1heSBjb250YWluIHNlY3VyaXR5LXNlbnNpdGl2ZQorICAgICAgICAgIGluZm9ybWF0aW9uLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgRWF2ZXNkcm9wcGluZyBpbnRlcmFjdHMgcG9vcmx5IHdpdGggYnVzZXMgd2l0aCBub24tdHJpdmlhbAorICAgICAgICAgIGFjY2VzcyBjb250cm9sIHJlc3RyaWN0aW9ucywgYW5kIGlzIGRlcHJlY2F0ZWQuIFRoZQorICAgICAgICAgIDxsaXRlcmFsPkJlY29tZU1vbml0b3I8L2xpdGVyYWw+IG1ldGhvZCAoc2VlCisgICAgICAgICAgPHhyZWYgbGlua2VuZD0iYnVzLW1lc3NhZ2VzLWJlY29tZS1tb25pdG9yIi8+KSBwcm92aWRlcworICAgICAgICAgIGEgcHJlZmVyYWJsZSB3YXkgdG8gbW9uaXRvciBidXNlcy4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEVhdmVzZHJvcHBpbmcgaXMgbWFpbmx5IHVzZWZ1bCBmb3IgZGVidWdnaW5nIHRvb2xzLCBzdWNoIGFzCisgICAgICAgICAgdGhlIDxsaXRlcmFsPmRidXMtbW9uaXRvcjwvbGl0ZXJhbD4gdG9vbCBpbiB0aGUgcmVmZXJlbmNlCisgICAgICAgICAgaW1wbGVtZW50YXRpb24gb2YgRC1CdXMuIFRvb2xzIHdoaWNoIGVhdmVzZHJvcCBvbiB0aGUgbWVzc2FnZSBidXMKKyAgICAgICAgICBzaG91bGQgYmUgY2FyZWZ1bCB0byBhdm9pZCBzZW5kaW5nIGEgcmVwbHkgb3IgZXJyb3IgaW4gcmVzcG9uc2UgdG8KKyAgICAgICAgICBtZXNzYWdlcyBpbnRlbmRlZCBmb3IgYSBkaWZmZXJlbnQgY2xpZW50LgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgQ2xpZW50cyBtYXkgYXR0ZW1wdCB0byBlYXZlc2Ryb3AgYnkgYWRkaW5nIG1hdGNoIHJ1bGVzCisgICAgICAgICAgKHNlZSA8eHJlZiBsaW5rZW5kPSJtZXNzYWdlLWJ1cy1yb3V0aW5nLW1hdGNoLXJ1bGVzIi8+KSBjb250YWluaW5nCisgICAgICAgICAgdGhlIDxsaXRlcmFsPmVhdmVzZHJvcD0ndHJ1ZSc8L2xpdGVyYWw+IG1hdGNoLiBGb3IKKyAgICAgICAgICBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgbWVzc2FnZSBidXMgaW1wbGVtZW50YXRpb25zLCBpZiBhZGRpbmcgc3VjaAorICAgICAgICAgIGEgbWF0Y2ggcnVsZSByZXN1bHRzIGluIGFuIGVycm9yIHJlcGx5LCB0aGUgY2xpZW50IG1heSBmYWxsIGJhY2sgdG8KKyAgICAgICAgICBhZGRpbmcgdGhlIHNhbWUgcnVsZSB3aXRoIHRoZSA8bGl0ZXJhbD5lYXZlc2Ryb3A8L2xpdGVyYWw+IG1hdGNoCisgICAgICAgICAgb21pdHRlZC4KKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9zZWN0Mz4KKworICAgICAgPHNlY3QzIGlkPSJtZXNzYWdlLWJ1cy1yb3V0aW5nLW1hdGNoLXJ1bGVzIj4KKyAgICAgICAgPHRpdGxlPk1hdGNoIFJ1bGVzPC90aXRsZT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgQW4gaW1wb3J0YW50IHBhcnQgb2YgdGhlIG1lc3NhZ2UgYnVzIHJvdXRpbmcgcHJvdG9jb2wgaXMgbWF0Y2gKKyAgICAgICAgICBydWxlcy4gTWF0Y2ggcnVsZXMgZGVzY3JpYmUgdGhlIG1lc3NhZ2VzIHRoYXQgc2hvdWxkIGJlIHNlbnQgdG8gYQorICAgICAgICAgIGNsaWVudCwgYmFzZWQgb24gdGhlIGNvbnRlbnRzIG9mIHRoZSBtZXNzYWdlLiAgQnJvYWRjYXN0IHNpZ25hbHMKKyAgICAgICAgICBhcmUgb25seSBzZW50IHRvIGNsaWVudHMgd2hpY2ggaGF2ZSBhIHN1aXRhYmxlIG1hdGNoIHJ1bGU6IHRoaXMKKyAgICAgICAgICBhdm9pZHMgd2FraW5nIHVwIGNsaWVudCBwcm9jZXNzZXMgdG8gZGVhbCB3aXRoIHNpZ25hbHMgdGhhdCBhcmUKKyAgICAgICAgICBub3QgcmVsZXZhbnQgdG8gdGhhdCBjbGllbnQuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgTWVzc2FnZXMgdGhhdCBsaXN0IGEgY2xpZW50IGFzIHRoZWlyIDxsaXRlcmFsPkRFU1RJTkFUSU9OPC9saXRlcmFsPgorICAgICAgICAgIGRvIG5vdCBuZWVkIHRvIG1hdGNoIHRoZSBjbGllbnQncyBtYXRjaCBydWxlcywgYW5kIGFyZSBzZW50IHRvIHRoYXQKKyAgICAgICAgICBjbGllbnQgcmVnYXJkbGVzcy4gQXMgYSByZXN1bHQsIG1hdGNoIHJ1bGVzIGFyZSBtYWlubHkgdXNlZCB0bworICAgICAgICAgIHJlY2VpdmUgYSBzdWJzZXQgb2YgYnJvYWRjYXN0IHNpZ25hbHMuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgTWF0Y2ggcnVsZXMgY2FuIGFsc28gYmUgdXNlZCBmb3IgZWF2ZXNkcm9wcGluZworICAgICAgICAgIChzZWUgPHhyZWYgbGlua2VuZD0ibWVzc2FnZS1idXMtcm91dGluZy1lYXZlc2Ryb3BwaW5nIi8+KSwKKyAgICAgICAgICBpZiB0aGUgc2VjdXJpdHkgcG9saWN5IG9mIHRoZSBtZXNzYWdlIGJ1cyBhbGxvd3MgaXQsIGJ1dCB0aGlzCisgICAgICAgICAgdXNhZ2UgaXMgZGVwcmVjYXRlZCBpbiBmYXZvdXIgb2YgdGhlIDxsaXRlcmFsPkJlY29tZU1vbml0b3I8L2xpdGVyYWw+CisgICAgICAgICAgbWV0aG9kIChzZWUgPHhyZWYgbGlua2VuZD0iYnVzLW1lc3NhZ2VzLWJlY29tZS1tb25pdG9yIi8+KS4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBNYXRjaCBydWxlcyBhcmUgYWRkZWQgdXNpbmcgdGhlIEFkZE1hdGNoIGJ1cyBtZXRob2QKKyAgICAgICAgICAoc2VlIDx4cmVmIGxpbmtlbmQ9ImJ1cy1tZXNzYWdlcy1hZGQtbWF0Y2giLz4pLiAgUnVsZXMgYXJlCisgICAgICAgICAgc3BlY2lmaWVkIGFzIGEgc3RyaW5nIG9mIGNvbW1hIHNlcGFyYXRlZCBrZXkvdmFsdWUgcGFpcnMuCisgICAgICAgICAgRXhjbHVkaW5nIGEga2V5IGZyb20gdGhlIHJ1bGUgaW5kaWNhdGVzIGEgd2lsZGNhcmQgbWF0Y2guCisgICAgICAgICAgRm9yIGluc3RhbmNlIGV4Y2x1ZGluZyB0aGUgdGhlIG1lbWJlciBmcm9tIGEgbWF0Y2ggcnVsZSBidXQKKyAgICAgICAgICBhZGRpbmcgYSBzZW5kZXIgd291bGQgbGV0IGFsbCBtZXNzYWdlcyBmcm9tIHRoYXQgc2VuZGVyIHRocm91Z2guCisgICAgICAgICAgQW4gZXhhbXBsZSBvZiBhIGNvbXBsZXRlIHJ1bGUgd291bGQgYmUKKyAgICAgICAgICAidHlwZT0nc2lnbmFsJyxzZW5kZXI9J29yZy5mcmVlZGVza3RvcC5EQnVzJyxpbnRlcmZhY2U9J29yZy5mcmVlZGVza3RvcC5EQnVzJyxtZW1iZXI9J0ZvbycscGF0aD0nL2Jhci9mb28nLGRlc3RpbmF0aW9uPSc6NDUyMzQ1LjM0JyxhcmcyPSdiYXInIgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIFdpdGhpbiBzaW5nbGUgcXVvdGVzIChBU0NJSSBhcG9zdHJvcGhlLCBVKzAwMjcpLCBhIGJhY2tzbGFzaAorICAgICAgICAgIChVKzAwNUMpIHJlcHJlc2VudHMgaXRzZWxmLCBhbmQgYW4gYXBvc3Ryb3BoZSBlbmRzIHRoZSBxdW90ZWQKKyAgICAgICAgICBzZWN0aW9uLiBPdXRzaWRlIHNpbmdsZSBxdW90ZXMsIFwnIChiYWNrc2xhc2gsIGFwb3N0cm9waGUpCisgICAgICAgICAgcmVwcmVzZW50cyBhbiBhcG9zdHJvcGhlLCBhbmQgYW55IGJhY2tzbGFzaCBub3QgZm9sbG93ZWQgYnkKKyAgICAgICAgICBhbiBhcG9zdHJvcGhlIHJlcHJlc2VudHMgaXRzZWxmLiBGb3IgaW5zdGFuY2UsIHRoZSBtYXRjaCBydWxlcworICAgICAgICAgIDxsaXRlcmFsPmFyZzA9JydcJycnLGFyZzE9J1wnLGFyZzI9JywnLGFyZzM9J1xcJzwvbGl0ZXJhbD4gYW5kCisgICAgICAgICAgPGxpdGVyYWw+YXJnMD1cJyxhcmcxPVwsYXJnMj0nLCcsYXJnMz1cXDwvbGl0ZXJhbD4KKyAgICAgICAgICBib3RoIG1hdGNoIG1lc3NhZ2VzIHdoZXJlIHRoZSBhcmd1bWVudHMgYXJlIGEgMS1jaGFyYWN0ZXIgc3RyaW5nCisgICAgICAgICAgY29udGFpbmluZyBhbiBhcG9zdHJvcGhlLCBhIDEtY2hhcmFjdGVyIHN0cmluZyBjb250YWluaW5nIGEKKyAgICAgICAgICBiYWNrc2xhc2gsIGEgMS1jaGFyYWN0ZXIgc3RyaW5nIGNvbnRhaW5pbmcgYSBjb21tYSwgYW5kIGEKKyAgICAgICAgICAyLWNoYXJhY3RlciBzdHJpbmcgY29udGFpbmluZyB0d28gYmFja3NsYXNoZXM8Zm9vdG5vdGU+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgVGhpcyBpZGlvc3luY3JhdGljIHF1b3Rpbmcgc3R5bGUgaXMgYmFzZWQgb24gdGhlIHJ1bGVzIGZvcgorICAgICAgICAgICAgICBlc2NhcGluZyBpdGVtcyB0byBhcHBlYXIgaW5zaWRlIHNpbmdsZS1xdW90ZWQgc3RyaW5ncworICAgICAgICAgICAgICBpbiBQT1NJWCA8bGl0ZXJhbD4vYmluL3NoPC9saXRlcmFsPiwgYnV0IHBsZWFzZQorICAgICAgICAgICAgICBub3RlIHRoYXQgYmFja3NsYXNoZXMgdGhhdCBhcmUgbm90IGluc2lkZSBzaW5nbGUgcXVvdGVzIGhhdmUKKyAgICAgICAgICAgICAgZGlmZmVyZW50IGJlaGF2aW91ci4gVGhpcyBzeW50YXggZG9lcyBub3Qgb2ZmZXIgYW55IHdheSB0bworICAgICAgICAgICAgICByZXByZXNlbnQgYW4gYXBvc3Ryb3BoZSBpbnNpZGUgc2luZ2xlIHF1b3RlcyAoaXQgaXMgbmVjZXNzYXJ5CisgICAgICAgICAgICAgIHRvIGxlYXZlIHRoZSBzaW5nbGUtcXVvdGVkIHNlY3Rpb24sIGJhY2tzbGFzaC1lc2NhcGUgdGhlCisgICAgICAgICAgICAgIGFwb3N0cm9waGUgYW5kIHJlLWVudGVyIHNpbmdsZSBxdW90ZXMpLCBvciB0byByZXByZXNlbnQgYQorICAgICAgICAgICAgICBjb21tYSBvdXRzaWRlIHNpbmdsZSBxdW90ZXMgKGl0IGlzIG5lY2Vzc2FyeSB0byB3cmFwIGl0IGluCisgICAgICAgICAgICAgIGEgc2luZ2xlLXF1b3RlZCBzZWN0aW9uKS4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICA8L2Zvb3Rub3RlPi4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBUaGUgZm9sbG93aW5nIHRhYmxlIGRlc2NyaWJlcyB0aGUga2V5cyB0aGF0IGNhbiBiZSB1c2VkIHRvIGNyZWF0ZQorICAgICAgICAgIGEgbWF0Y2ggcnVsZS4KKyAgICAgICAgICA8aW5mb3JtYWx0YWJsZT4KKyAgICAgICAgICAgIDx0Z3JvdXAgY29scz0iMyI+CisgICAgICAgICAgICAgIDx0aGVhZD4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PktleTwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+UG9zc2libGUgVmFsdWVzPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5EZXNjcmlwdGlvbjwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDwvdGhlYWQ+CisgICAgICAgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPnR5cGU8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT4nc2lnbmFsJywgJ21ldGhvZF9jYWxsJywgJ21ldGhvZF9yZXR1cm4nLCAnZXJyb3InPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5NYXRjaCBvbiB0aGUgbWVzc2FnZSB0eXBlLiAgQW4gZXhhbXBsZSBvZiBhIHR5cGUgbWF0Y2ggaXMgdHlwZT0nc2lnbmFsJzwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5zZW5kZXI8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5BIGJ1cyBvciB1bmlxdWUgbmFtZSAoc2VlIDx4cmVmIGxpbmtlbmQ9InRlcm0tYnVzLW5hbWUiLz4KKyAgICAgICAgICAgICAgICAgIGFuZCA8eHJlZiBsaW5rZW5kPSJ0ZXJtLXVuaXF1ZS1uYW1lIi8+IHJlc3BlY3RpdmVseSkKKyAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+TWF0Y2ggbWVzc2FnZXMgc2VudCBieSBhIHBhcnRpY3VsYXIgc2VuZGVyLiAgQW4gZXhhbXBsZSBvZiBhIHNlbmRlciBtYXRjaAorICAgICAgICAgICAgICAgICAgaXMgc2VuZGVyPSdvcmcuZnJlZWRlc2t0b3AuSGFsJzwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5pbnRlcmZhY2U8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5BbiBpbnRlcmZhY2UgbmFtZSAoc2VlIDx4cmVmIGxpbmtlbmQ9Im1lc3NhZ2UtcHJvdG9jb2wtbmFtZXMtaW50ZXJmYWNlIi8+KTwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+TWF0Y2ggbWVzc2FnZXMgc2VudCBvdmVyIG9yIHRvIGEgcGFydGljdWxhciBpbnRlcmZhY2UuICBBbiBleGFtcGxlIG9mIGFuCisgICAgICAgICAgICAgICAgICBpbnRlcmZhY2UgbWF0Y2ggaXMgaW50ZXJmYWNlPSdvcmcuZnJlZWRlc2t0b3AuSGFsLk1hbmFnZXInLgorICAgICAgICAgICAgICAgICAgSWYgYSBtZXNzYWdlIG9taXRzIHRoZSBpbnRlcmZhY2UgaGVhZGVyLCBpdCBtdXN0IG5vdCBtYXRjaCBhbnkgcnVsZQorICAgICAgICAgICAgICAgICAgdGhhdCBzcGVjaWZpZXMgdGhpcyBrZXkuPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPm1lbWJlcjwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkFueSB2YWxpZCBtZXRob2Qgb3Igc2lnbmFsIG5hbWU8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5Pk1hdGNoZXMgbWVzc2FnZXMgd2hpY2ggaGF2ZSB0aGUgZ2l2ZSBtZXRob2Qgb3Igc2lnbmFsIG5hbWUuIEFuIGV4YW1wbGUgb2YKKyAgICAgICAgICAgICAgICAgIGEgbWVtYmVyIG1hdGNoIGlzIG1lbWJlcj0nTmFtZU93bmVyQ2hhbmdlZCc8L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+cGF0aDwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkFuIG9iamVjdCBwYXRoIChzZWUgPHhyZWYgbGlua2VuZD0ibWVzc2FnZS1wcm90b2NvbC1tYXJzaGFsaW5nLW9iamVjdC1wYXRoIi8+KTwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+TWF0Y2hlcyBtZXNzYWdlcyB3aGljaCBhcmUgc2VudCBmcm9tIG9yIHRvIHRoZSBnaXZlbiBvYmplY3QuIEFuIGV4YW1wbGUgb2YgYQorICAgICAgICAgICAgICAgICAgcGF0aCBtYXRjaCBpcyBwYXRoPScvb3JnL2ZyZWVkZXNrdG9wL0hhbC9NYW5hZ2VyJzwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5wYXRoX25hbWVzcGFjZTwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkFuIG9iamVjdCBwYXRoPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hlcyBtZXNzYWdlcyB3aGljaCBhcmUgc2VudCBmcm9tIG9yIHRvIGFuCisgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0IGZvciB3aGljaCB0aGUgb2JqZWN0IHBhdGggaXMgZWl0aGVyIHRoZQorICAgICAgICAgICAgICAgICAgICAgIGdpdmVuIHZhbHVlLCBvciB0aGF0IHZhbHVlIGZvbGxvd2VkIGJ5IG9uZSBvcgorICAgICAgICAgICAgICAgICAgICAgIG1vcmUgcGF0aCBjb21wb25lbnRzLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgRm9yIGV4YW1wbGUsCisgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+cGF0aF9uYW1lc3BhY2U9Jy9jb20vZXhhbXBsZS9mb28nPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgIHdvdWxkIG1hdGNoIHNpZ25hbHMgc2VudCBieQorICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPi9jb20vZXhhbXBsZS9mb288L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgb3IgYnkKKyAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD4vY29tL2V4YW1wbGUvZm9vL2JhcjwvbGl0ZXJhbD4sCisgICAgICAgICAgICAgICAgICAgICAgYnV0IG5vdCBieQorICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPi9jb20vZXhhbXBsZS9mb29iYXI8L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgVXNpbmcgYm90aCA8bGl0ZXJhbD5wYXRoPC9saXRlcmFsPiBhbmQKKyAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5wYXRoX25hbWVzcGFjZTwvbGl0ZXJhbD4gaW4gdGhlIHNhbWUgbWF0Y2gKKyAgICAgICAgICAgICAgICAgICAgICBydWxlIGlzIG5vdCBhbGxvd2VkLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgPGVtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBtYXRjaCBrZXkgd2FzIGFkZGVkIGluIHZlcnNpb24gMC4xNiBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgIEQtQnVzIHNwZWNpZmljYXRpb24gYW5kIGltcGxlbWVudGVkIGJ5IHRoZSBidXMKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhZW1vbiBpbiBkYnVzIDEuNS4wIGFuZCBsYXRlci4KKyAgICAgICAgICAgICAgICAgICAgICA8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPmRlc3RpbmF0aW9uPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+QSB1bmlxdWUgbmFtZSAoc2VlIDx4cmVmIGxpbmtlbmQ9InRlcm0tdW5pcXVlLW5hbWUiLz4pPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5NYXRjaGVzIG1lc3NhZ2VzIHdoaWNoIGFyZSBiZWluZyBzZW50IHRvIHRoZSBnaXZlbiB1bmlxdWUgbmFtZS4gQW4KKyAgICAgICAgICAgICAgICAgIGV4YW1wbGUgb2YgYSBkZXN0aW5hdGlvbiBtYXRjaCBpcyBkZXN0aW5hdGlvbj0nOjEuMCc8L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+YXJnWzAsIDEsIDIsIDMsIC4uLl08L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5Bbnkgc3RyaW5nPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5BcmcgbWF0Y2hlcyBhcmUgc3BlY2lhbCBhbmQgYXJlIHVzZWQgZm9yIGZ1cnRoZXIgcmVzdHJpY3RpbmcgdGhlCisgICAgICAgICAgICAgICAgICBtYXRjaCBiYXNlZCBvbiB0aGUgYXJndW1lbnRzIGluIHRoZSBib2R5IG9mIGEgbWVzc2FnZS4gT25seSBhcmd1bWVudHMgb2YgdHlwZQorICAgICAgICAgICAgICAgICAgU1RSSU5HIGNhbiBiZSBtYXRjaGVkIGluIHRoaXMgd2F5LiBBbiBleGFtcGxlIG9mIGFuIGFyZ3VtZW50IG1hdGNoCisgICAgICAgICAgICAgICAgICB3b3VsZCBiZSBhcmczPSdGb28nLiBPbmx5IGFyZ3VtZW50IGluZGV4ZXMgZnJvbSAwIHRvIDYzIHNob3VsZCBiZQorICAgICAgICAgICAgICAgICAgYWNjZXB0ZWQuPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPmFyZ1swLCAxLCAyLCAzLCAuLi5dcGF0aDwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkFueSBzdHJpbmc8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICAgICAgICA8cGFyYT5Bcmd1bWVudCBwYXRoIG1hdGNoZXMgcHJvdmlkZSBhIHNwZWNpYWxpc2VkIGZvcm0gb2Ygd2lsZGNhcmQgbWF0Y2hpbmcgZm9yCisgICAgICAgICAgICAgICAgICAgICAgcGF0aC1saWtlIG5hbWVzcGFjZXMuIFRoZXkgY2FuIG1hdGNoIGFyZ3VtZW50cyB3aG9zZSB0eXBlIGlzIGVpdGhlciBTVFJJTkcgb3IKKyAgICAgICAgICAgICAgICAgICAgICBPQkpFQ1RfUEFUSC4gQXMgd2l0aCBub3JtYWwgYXJndW1lbnQgbWF0Y2hlcywKKyAgICAgICAgICAgICAgICAgICAgICBpZiB0aGUgYXJndW1lbnQgaXMgZXhhY3RseSBlcXVhbCB0byB0aGUgc3RyaW5nIGdpdmVuIGluIHRoZSBtYXRjaAorICAgICAgICAgICAgICAgICAgICAgIHJ1bGUgdGhlbiB0aGUgcnVsZSBpcyBzYXRpc2ZpZWQuIEFkZGl0aW9uYWxseSwgdGhlcmUgaXMgYWxzbyBhCisgICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggd2hlbiBlaXRoZXIgdGhlIHN0cmluZyBnaXZlbiBpbiB0aGUgbWF0Y2ggcnVsZSBvciB0aGUKKyAgICAgICAgICAgICAgICAgICAgICBhcHByb3ByaWF0ZSBtZXNzYWdlIGFyZ3VtZW50IGVuZHMgd2l0aCAnLycgYW5kIGlzIGEgcHJlZml4IG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgIG90aGVyLiBBbiBleGFtcGxlIGFyZ3VtZW50IHBhdGggbWF0Y2ggaXMgYXJnMHBhdGg9Jy9hYS9iYi8nLiBUaGlzCisgICAgICAgICAgICAgICAgICAgICAgd291bGQgbWF0Y2ggbWVzc2FnZXMgd2l0aCBmaXJzdCBhcmd1bWVudHMgb2YgJy8nLCAnL2FhLycsCisgICAgICAgICAgICAgICAgICAgICAgJy9hYS9iYi8nLCAnL2FhL2JiL2NjLycgYW5kICcvYWEvYmIvY2MnLiBJdCB3b3VsZCBub3QgbWF0Y2gKKyAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlcyB3aXRoIGZpcnN0IGFyZ3VtZW50cyBvZiAnL2FhL2InLCAnL2FhJyBvciBldmVuICcvYWEvYmInLjwvcGFyYT4KKworICAgICAgICAgICAgICAgICAgICA8cGFyYT5UaGlzIGlzIGludGVuZGVkIGZvciBtb25pdG9yaW5nIOKAnGRpcmVjdG9yaWVz4oCdIGluIGZpbGUgc3lzdGVtLWxpa2UKKyAgICAgICAgICAgICAgICAgICAgICBoaWVyYXJjaGllcywgYXMgdXNlZCBpbiB0aGUgPGNpdGV0aXRsZT5kY29uZjwvY2l0ZXRpdGxlPiBjb25maWd1cmF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgc3lzdGVtLiBBbiBhcHBsaWNhdGlvbiBpbnRlcmVzdGVkIGluIGFsbCBub2RlcyBpbiBhIHBhcnRpY3VsYXIgaGllcmFyY2h5IHdvdWxkCisgICAgICAgICAgICAgICAgICAgICAgbW9uaXRvciA8bGl0ZXJhbD5hcmcwcGF0aD0nL2NhL2V4YW1wbGUvZm9vLyc8L2xpdGVyYWw+LiBUaGVuIHRoZSBzZXJ2aWNlIGNvdWxkCisgICAgICAgICAgICAgICAgICAgICAgZW1pdCBhIHNpZ25hbCB3aXRoIHplcm90aCBhcmd1bWVudCA8bGl0ZXJhbD4iL2NhL2V4YW1wbGUvZm9vL2JhciI8L2xpdGVyYWw+IHRvCisgICAgICAgICAgICAgICAgICAgICAgcmVwcmVzZW50IGEgbW9kaWZpY2F0aW9uIHRvIHRoZSDigJxiYXLigJ0gcHJvcGVydHksIG9yIGEgc2lnbmFsIHdpdGggemVyb3RoCisgICAgICAgICAgICAgICAgICAgICAgYXJndW1lbnQgPGxpdGVyYWw+Ii9jYS9leGFtcGxlLyI8L2xpdGVyYWw+IHRvIHJlcHJlc2VudCBhdG9taWMgbW9kaWZpY2F0aW9uIG9mCisgICAgICAgICAgICAgICAgICAgICAgbWFueSBwcm9wZXJ0aWVzIHdpdGhpbiB0aGF0IGRpcmVjdG9yeSwgYW5kIHRoZSBpbnRlcmVzdGVkIGFwcGxpY2F0aW9uIHdvdWxkIGJlCisgICAgICAgICAgICAgICAgICAgICAgbm90aWZpZWQgaW4gYm90aCBjYXNlcy48L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgIDxlbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgbWF0Y2gga2V5IHdhcyBhZGRlZCBpbiB2ZXJzaW9uIDAuMTIgb2YgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICBELUJ1cyBzcGVjaWZpY2F0aW9uLCBpbXBsZW1lbnRlZCBmb3IgU1RSSU5HCisgICAgICAgICAgICAgICAgICAgICAgICBhcmd1bWVudHMgYnkgdGhlIGJ1cyBkYWVtb24gaW4gZGJ1cyAxLjIuMCBhbmQgbGF0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBhbmQgaW1wbGVtZW50ZWQgZm9yIE9CSkVDVF9QQVRIIGFyZ3VtZW50cyBpbiBkYnVzIDEuNS4wCisgICAgICAgICAgICAgICAgICAgICAgICBhbmQgbGF0ZXIuCisgICAgICAgICAgICAgICAgICAgICAgPC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPmFyZzBuYW1lc3BhY2U8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5MaWtlIGEgYnVzIG5hbWUsIGV4Y2VwdCB0aGF0IHRoZSBzdHJpbmcgaXMgbm90CisgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkIHRvIGNvbnRhaW4gYSAnLicgKHBlcmlvZCk8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICAgICAgICA8cGFyYT5NYXRjaCBtZXNzYWdlcyB3aG9zZSBmaXJzdCBhcmd1bWVudCBpcyBvZiB0eXBlIFNUUklORywgYW5kIGlzIGEgYnVzIG5hbWUKKyAgICAgICAgICAgICAgICAgICAgICBvciBpbnRlcmZhY2UgbmFtZSB3aXRoaW4gdGhlIHNwZWNpZmllZCBuYW1lc3BhY2UuIFRoaXMgaXMgcHJpbWFyaWx5IGludGVuZGVkCisgICAgICAgICAgICAgICAgICAgICAgZm9yIHdhdGNoaW5nIG5hbWUgb3duZXIgY2hhbmdlcyBmb3IgYSBncm91cCBvZiByZWxhdGVkIGJ1cyBuYW1lcywgcmF0aGVyIHRoYW4KKyAgICAgICAgICAgICAgICAgICAgICBmb3IgYSBzaW5nbGUgbmFtZSBvciBhbGwgbmFtZSBjaGFuZ2VzLjwvcGFyYT4KKworICAgICAgICAgICAgICAgICAgICA8cGFyYT5CZWNhdXNlIGV2ZXJ5IHZhbGlkIGludGVyZmFjZSBuYW1lIGlzIGFsc28gYSB2YWxpZAorICAgICAgICAgICAgICAgICAgICAgIGJ1cyBuYW1lLCB0aGlzIGNhbiBhbHNvIGJlIHVzZWQgZm9yIG1lc3NhZ2VzIHdob3NlCisgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgYXJndW1lbnQgaXMgYW4gaW50ZXJmYWNlIG5hbWUuPC9wYXJhPgorCisgICAgICAgICAgICAgICAgICAgIDxwYXJhPkZvciBleGFtcGxlLCB0aGUgbWF0Y2ggcnVsZQorICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPm1lbWJlcj0nTmFtZU93bmVyQ2hhbmdlZCcsYXJnMG5hbWVzcGFjZT0nY29tLmV4YW1wbGUuYmFja2VuZDEnPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZXMgbmFtZSBvd25lciBjaGFuZ2VzIGZvciBidXMgbmFtZXMgc3VjaCBhcworICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPmNvbS5leGFtcGxlLmJhY2tlbmQxLmZvbzwvbGl0ZXJhbD4sCisgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+Y29tLmV4YW1wbGUuYmFja2VuZDEuZm9vLmJhcjwvbGl0ZXJhbD4sIGFuZAorICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPmNvbS5leGFtcGxlLmJhY2tlbmQxPC9saXRlcmFsPiBpdHNlbGYuPC9wYXJhPgorCisgICAgICAgICAgICAgICAgICAgIDxwYXJhPlNlZSBhbHNvIDx4cmVmIGxpbmtlbmQ9J2J1cy1tZXNzYWdlcy1uYW1lLW93bmVyLWNoYW5nZWQnLz4uPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICA8ZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIG1hdGNoIGtleSB3YXMgYWRkZWQgaW4gdmVyc2lvbiAwLjE2IG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgRC1CdXMgc3BlY2lmaWNhdGlvbiBhbmQgaW1wbGVtZW50ZWQgYnkgdGhlIGJ1cworICAgICAgICAgICAgICAgICAgICAgICAgZGFlbW9uIGluIGRidXMgMS41LjAgYW5kIGxhdGVyLgorICAgICAgICAgICAgICAgICAgICAgIDwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5lYXZlc2Ryb3A8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD4ndHJ1ZSc8L2xpdGVyYWw+LCA8bGl0ZXJhbD4nZmFsc2UnPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgIFNpbmNlIEQtQnVzIDEuNS42LCBtYXRjaCBydWxlcyBkbyBub3QKKyAgICAgICAgICAgICAgICAgICAgICBtYXRjaCBtZXNzYWdlcyB3aGljaCBoYXZlIGEgPGxpdGVyYWw+REVTVElOQVRJT048L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgZmllbGQgdW5sZXNzIHRoZSBtYXRjaCBydWxlIHNwZWNpZmljYWxseQorICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RzIHRoaXMKKyAgICAgICAgICAgICAgICAgICAgICAoc2VlIDx4cmVmIGxpbmtlbmQ9Im1lc3NhZ2UtYnVzLXJvdXRpbmctZWF2ZXNkcm9wcGluZyIvPikKKyAgICAgICAgICAgICAgICAgICAgICBieSBzcGVjaWZ5aW5nIDxsaXRlcmFsPmVhdmVzZHJvcD0ndHJ1ZSc8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIG1hdGNoIHJ1bGUuICA8bGl0ZXJhbD5lYXZlc2Ryb3A9J2ZhbHNlJzwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICByZXN0b3JlcyB0aGUgZGVmYXVsdCBiZWhhdmlvdXIuIE1lc3NhZ2VzIGFyZQorICAgICAgICAgICAgICAgICAgICAgIGRlbGl2ZXJlZCB0byB0aGVpciA8bGl0ZXJhbD5ERVNUSU5BVElPTjwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICByZWdhcmRsZXNzIG9mIG1hdGNoIHJ1bGVzLCBzbyB0aGlzIG1hdGNoIGRvZXMgbm90CisgICAgICAgICAgICAgICAgICAgICAgYWZmZWN0IG5vcm1hbCBkZWxpdmVyeSBvZiB1bmljYXN0IG1lc3NhZ2VzLgorICAgICAgICAgICAgICAgICAgICAgIEluIG9sZGVyIHZlcnNpb25zIG9mIEQtQnVzLCB0aGlzIG1hdGNoIHdhcyBub3QgYWxsb3dlZAorICAgICAgICAgICAgICAgICAgICAgIGluIG1hdGNoIHJ1bGVzLCBhbmQgYWxsIG1hdGNoIHJ1bGVzIGJlaGF2ZWQgYXMgaWYKKyAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5lYXZlc2Ryb3A9J3RydWUnPC9saXRlcmFsPiBoYWQgYmVlbiB1c2VkLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgIFVzZSBvZiA8bGl0ZXJhbD5lYXZlc2Ryb3A9J3RydWUnPC9saXRlcmFsPiBpcworICAgICAgICAgICAgICAgICAgICAgIGRlcHJlY2F0ZWQuIE1vbml0b3JzIHNob3VsZCBwcmVmZXIgdG8gdXNlIHRoZQorICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPkJlY29tZU1vbml0b3I8L2xpdGVyYWw+IG1ldGhvZCAoc2VlCisgICAgICAgICAgICAgICAgICAgICAgPHhyZWYgbGlua2VuZD0iYnVzLW1lc3NhZ2VzLWJlY29tZS1tb25pdG9yIi8+KSwKKyAgICAgICAgICAgICAgICAgICAgICB3aGljaCB3YXMgaW50cm9kdWNlZCBpbiB2ZXJzaW9uIDAuMjYgb2YgdGhlIEQtQnVzCisgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWNhdGlvbiBhbmQgdmVyc2lvbiAxLjkuMTAgb2YgdGhlIHJlZmVyZW5jZQorICAgICAgICAgICAgICAgICAgICAgIGRidXMtZGFlbW9uLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgYnVzIGltcGxlbWVudGF0aW9ucyBtYXkgcmVzdHJpY3QgbWF0Y2ggcnVsZXMKKyAgICAgICAgICAgICAgICAgICAgICB3aXRoIDxsaXRlcmFsPmVhdmVzZHJvcD0ndHJ1ZSc8L2xpdGVyYWw+IHNvIHRoYXQgdGhleQorICAgICAgICAgICAgICAgICAgICAgIGNhbiBvbmx5IGJlIGFkZGVkIGJ5IHByaXZpbGVnZWQgY29ubmVjdGlvbnMuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgPGVtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBtYXRjaCBrZXkgd2FzIGFkZGVkIGluIHZlcnNpb24gMC4xOCBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgIEQtQnVzIHNwZWNpZmljYXRpb24gYW5kIGltcGxlbWVudGVkIGJ5IHRoZSBidXMKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhZW1vbiBpbiBkYnVzIDEuNS42IGFuZCBsYXRlci4KKyAgICAgICAgICAgICAgICAgICAgICA8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8L3Rib2R5PgorICAgICAgICAgICAgPC90Z3JvdXA+CisgICAgICAgICAgPC9pbmZvcm1hbHRhYmxlPgorICAgICAgICA8L3BhcmE+CisgICAgICA8L3NlY3QzPgorICAgIDwvc2VjdDI+CisgICAgPHNlY3QyIGlkPSJtZXNzYWdlLWJ1cy1zdGFydGluZy1zZXJ2aWNlcyI+CisgICAgICA8dGl0bGU+TWVzc2FnZSBCdXMgU3RhcnRpbmcgU2VydmljZXMgKEFjdGl2YXRpb24pPC90aXRsZT4KKyAgICAgIDxwYXJhPgorICAgICAgICBUaGUgbWVzc2FnZSBidXMgY2FuIHN0YXJ0IGFwcGxpY2F0aW9ucyBvbiBiZWhhbGYgb2Ygb3RoZXIgYXBwbGljYXRpb25zLgorICAgICAgICBUaGlzIGlzIHJlZmVycmVkIHRvIGFzIDxmaXJzdHRlcm0+c2VydmljZSBhY3RpdmF0aW9uPC9maXJzdHRlcm0+IG9yCisgICAgICAgIDxmaXJzdHRlcm0+YWN0aXZhdGlvbjwvZmlyc3R0ZXJtPi4KKyAgICAgICAgQW4gYXBwbGljYXRpb24gdGhhdCBjYW4gYmUgc3RhcnRlZCBpbiB0aGlzIHdheSBpcyBjYWxsZWQgYQorICAgICAgICA8Zmlyc3R0ZXJtPnNlcnZpY2U8L2ZpcnN0dGVybT4gb3IgYW4KKyAgICAgICAgPGZpcnN0dGVybT5hY3RpdmF0YWJsZSBzZXJ2aWNlPC9maXJzdHRlcm0+LgorICAgICAgPC9wYXJhPgorCisgICAgICA8cGFyYT4KKyAgICAgICAgPGZpcnN0dGVybT5TdGFydGluZyBhIHNlcnZpY2U8L2ZpcnN0dGVybT4gc2hvdWxkIGJlIHJlYWQgYXMgc3lub255bW91cworICAgICAgICB3aXRoIHNlcnZpY2UgYWN0aXZhdGlvbi4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIEluIEQtQnVzLCBzZXJ2aWNlIGFjdGl2YXRpb24gaXMgbm9ybWFsbHkgZG9uZSBieQorICAgICAgICA8Zmlyc3R0ZXJtPmF1dG8tc3RhcnRpbmc8L2ZpcnN0dGVybT4uCisgICAgICAgIEluIGF1dG8tc3RhcnRpbmcsIGFwcGxpY2F0aW9ucyBzZW5kIGEKKyAgICAgICAgbWVzc2FnZSB0byBhIHBhcnRpY3VsYXIgd2VsbC1rbm93biBuYW1lLCBzdWNoIGFzCisgICAgICAgIDxsaXRlcmFsPmNvbS5leGFtcGxlLlRleHRFZGl0b3IxPC9saXRlcmFsPiwgd2l0aG91dCBzcGVjaWZ5aW5nIHRoZQorICAgICAgICA8bGl0ZXJhbD5OT19BVVRPX1NUQVJUPC9saXRlcmFsPiBmbGFnIGluIHRoZSBtZXNzYWdlIGhlYWRlci4KKyAgICAgICAgSWYgbm8gYXBwbGljYXRpb24gb24gdGhlIGJ1cyBvd25zIHRoZSByZXF1ZXN0ZWQgbmFtZSwgYnV0IHRoZSBidXMKKyAgICAgICAgZGFlbW9uIGRvZXMga25vdyBob3cgdG8gc3RhcnQgYW4gYWN0aXZhdGFibGUgc2VydmljZSBmb3IgdGhhdCBuYW1lLAorICAgICAgICB0aGVuIHRoZSBidXMgZGFlbW9uIHdpbGwgc3RhcnQgdGhhdCBzZXJ2aWNlLCB3YWl0IGZvciBpdCB0byByZXF1ZXN0CisgICAgICAgIHRoYXQgbmFtZSwgYW5kIGRlbGl2ZXIgdGhlIG1lc3NhZ2UgdG8gaXQuCisgICAgICA8L3BhcmE+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBJdCBpcyBhbHNvIHBvc3NpYmxlIGZvciBhcHBsaWNhdGlvbnMgdG8gc2VuZCBhbiBleHBsaWNpdCByZXF1ZXN0IHRvCisgICAgICAgIHN0YXJ0IGEgc2VydmljZTogdGhpcyBpcyBhbm90aGVyIGZvcm0gb2YgYWN0aXZhdGlvbiwgZGlzdGluY3QgZnJvbQorICAgICAgICBhdXRvLXN0YXJ0aW5nLiBTZWUKKyAgICAgICAgPHhyZWYgbGlua2VuZD0iYnVzLW1lc3NhZ2VzLXN0YXJ0LXNlcnZpY2UtYnktbmFtZSIvPiBmb3IgZGV0YWlscy4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIEluIGVpdGhlciBjYXNlLCB0aGlzIGltcGxpZXMgYSBjb250cmFjdCBkb2N1bWVudGVkIGFsb25nIHdpdGggdGhlIG5hbWUKKyAgICAgICAgPGxpdGVyYWw+Y29tLmV4YW1wbGUuVGV4dEVkaXRvcjE8L2xpdGVyYWw+IGZvciB3aGljaCBvYmplY3QKKyAgICAgICAgdGhlIG93bmVyIG9mIHRoYXQgbmFtZSB3aWxsIHByb3ZpZGUsIGFuZCB3aGF0IGludGVyZmFjZXMgdGhvc2UKKyAgICAgICAgb2JqZWN0cyB3aWxsIGhhdmUuCisgICAgICA8L3BhcmE+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBUbyBmaW5kIGFuIGV4ZWN1dGFibGUgY29ycmVzcG9uZGluZyB0byBhIHBhcnRpY3VsYXIgbmFtZSwgdGhlIGJ1cyBkYWVtb24KKyAgICAgICAgbG9va3MgZm9yIDxmaXJzdHRlcm0+c2VydmljZSBkZXNjcmlwdGlvbiBmaWxlczwvZmlyc3R0ZXJtPi4gIFNlcnZpY2UKKyAgICAgICAgZGVzY3JpcHRpb24gZmlsZXMgZGVmaW5lIGEgbWFwcGluZyBmcm9tIG5hbWVzIHRvIGV4ZWN1dGFibGVzLiBEaWZmZXJlbnQKKyAgICAgICAga2luZHMgb2YgbWVzc2FnZSBidXMgd2lsbCBsb29rIGZvciB0aGVzZSBmaWxlcyBpbiBkaWZmZXJlbnQgcGxhY2VzLCBzZWUKKyAgICAgICAgPHhyZWYgbGlua2VuZD0ibWVzc2FnZS1idXMtdHlwZXMiLz4uCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgU2VydmljZSBkZXNjcmlwdGlvbiBmaWxlcyBoYXZlIHRoZSAiLnNlcnZpY2UiIGZpbGUKKyAgICAgICAgZXh0ZW5zaW9uLiBUaGUgbWVzc2FnZSBidXMgd2lsbCBvbmx5IGxvYWQgc2VydmljZSBkZXNjcmlwdGlvbiBmaWxlcworICAgICAgICBlbmRpbmcgd2l0aCAuc2VydmljZTsgYWxsIG90aGVyIGZpbGVzIHdpbGwgYmUgaWdub3JlZC4gIFRoZSBmaWxlIGZvcm1hdAorICAgICAgICBpcyBzaW1pbGFyIHRvIHRoYXQgb2YgPHVsaW5rCisgICAgICAgIHVybD0iaHR0cDovL3N0YW5kYXJkcy5mcmVlZGVza3RvcC5vcmcvZGVza3RvcC1lbnRyeS1zcGVjL2Rlc2t0b3AtZW50cnktc3BlYy1sYXRlc3QuaHRtbCI+ZGVza3RvcAorICAgICAgICBlbnRyaWVzPC91bGluaz4uIEFsbCBzZXJ2aWNlIGRlc2NyaXB0aW9uIGZpbGVzIG11c3QgYmUgaW4gVVRGLTgKKyAgICAgICAgZW5jb2RpbmcuIFRvIGVuc3VyZSB0aGF0IHRoZXJlIHdpbGwgYmUgbm8gbmFtZSBjb2xsaXNpb25zLCBzZXJ2aWNlIGZpbGVzCisgICAgICAgIG11c3QgYmUgbmFtZXNwYWNlZCB1c2luZyB0aGUgc2FtZSBtZWNoYW5pc20gYXMgbWVzc2FnZXMgYW5kIHNlcnZpY2UKKyAgICAgICAgbmFtZXMuCisgICAgICA8L3BhcmE+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBPbiB0aGUgd2VsbC1rbm93biBzeXN0ZW0gYnVzLCB0aGUgbmFtZSBvZiBhIHNlcnZpY2UgZGVzY3JpcHRpb24gZmlsZQorICAgICAgICBtdXN0IGJlIGl0cyB3ZWxsLWtub3duIG5hbWUgcGx1cyA8bGl0ZXJhbD4uc2VydmljZTwvbGl0ZXJhbD4sCisgICAgICAgIGZvciBpbnN0YW5jZQorICAgICAgICA8bGl0ZXJhbD5jb20uZXhhbXBsZS5Db25maWd1cmF0aW9uRGF0YWJhc2UxLnNlcnZpY2U8L2xpdGVyYWw+LgorICAgICAgPC9wYXJhPgorCisgICAgICA8cGFyYT4KKyAgICAgICAgT24gdGhlIHdlbGwta25vd24gc2Vzc2lvbiBidXMsIHNlcnZpY2VzIHNob3VsZCBmb2xsb3cgdGhlIHNhbWUKKyAgICAgICAgc2VydmljZSBkZXNjcmlwdGlvbiBmaWxlIG5hbWluZyBjb252ZW50aW9uIGFzIG9uIHRoZSBzeXN0ZW0gYnVzLAorICAgICAgICBidXQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHRoZXkgYXJlIG5vdCByZXF1aXJlZCB0byBkbyBzby4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIFtGSVhNRSB0aGUgZmlsZSBmb3JtYXQgc2hvdWxkIGJlIG11Y2ggYmV0dGVyIHNwZWNpZmllZCB0aGFuICJzaW1pbGFyIHRvCisgICAgICAgIC5kZXNrdG9wIGVudHJpZXMiIGVzcC4gc2luY2UgZGVza3RvcCBlbnRyaWVzIGFyZSBhbHJlYWR5CisgICAgICAgIGJhZGx5LXNwZWNpZmllZC4gOy0pXQorICAgICAgICBUaGVzZSBzZWN0aW9ucyBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uIGFwcGx5IHRvIHNlcnZpY2UgZmlsZXMgYXMgd2VsbDoKKworICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT5HZW5lcmFsIHN5bnRheDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT5Db21tZW50IGZvcm1hdDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKworICAgICAgICBTZXJ2aWNlIGRlc2NyaXB0aW9uIGZpbGVzIG11c3QgY29udGFpbiBhCisgICAgICAgIDxsaXRlcmFsPkQtQlVTIFNlcnZpY2U8L2xpdGVyYWw+IGdyb3VwIHdpdGggYXQgbGVhc3QgdGhlIGtleXMKKyAgICAgICAgPGxpdGVyYWw+TmFtZTwvbGl0ZXJhbD4gKHRoZSB3ZWxsLWtub3duIG5hbWUgb2YgdGhlIHNlcnZpY2UpCisgICAgICAgIGFuZCA8bGl0ZXJhbD5FeGVjPC9saXRlcmFsPiAodGhlIGNvbW1hbmQgdG8gYmUgZXhlY3V0ZWQpLgorCisgICAgICAgIDxmaWd1cmU+CisgICAgICAgICAgPHRpdGxlPkV4YW1wbGUgc2VydmljZSBkZXNjcmlwdGlvbiBmaWxlPC90aXRsZT4KKyAgICAgICAgICA8cHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAjIFNhbXBsZSBzZXJ2aWNlIGRlc2NyaXB0aW9uIGZpbGUKKyAgICAgICAgICAgIFtELUJVUyBTZXJ2aWNlXQorICAgICAgICAgICAgTmFtZT1jb20uZXhhbXBsZS5Db25maWd1cmF0aW9uRGF0YWJhc2UxCisgICAgICAgICAgICBFeGVjPS91c3IvYmluL3NhbXBsZS1jb25maWdkCisgICAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgPC9maWd1cmU+CisgICAgICA8L3BhcmE+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBBZGRpdGlvbmFsbHksIHNlcnZpY2UgZGVzY3JpcHRpb24gZmlsZXMgZm9yIHRoZSB3ZWxsLWtub3duIHN5c3RlbQorICAgICAgICBidXMgb24gVW5peCBtdXN0IGNvbnRhaW4gYSA8bGl0ZXJhbD5Vc2VyPC9saXRlcmFsPiBrZXksIHdob3NlIHZhbHVlCisgICAgICAgIGlzIHRoZSBuYW1lIG9mIGEgdXNlciBhY2NvdW50IChlLmcuIDxsaXRlcmFsPnJvb3Q8L2xpdGVyYWw+KS4KKyAgICAgICAgVGhlIHN5c3RlbSBzZXJ2aWNlIHdpbGwgYmUgcnVuIGFzIHRoYXQgdXNlci4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIFdoZW4gYW4gYXBwbGljYXRpb24gYXNrcyB0byBzdGFydCBhIHNlcnZpY2UgYnkgbmFtZSwgdGhlIGJ1cyBkYWVtb24gdHJpZXMgdG8KKyAgICAgICAgZmluZCBhIHNlcnZpY2UgdGhhdCB3aWxsIG93biB0aGF0IG5hbWUuIEl0IHRoZW4gdHJpZXMgdG8gc3Bhd24gdGhlCisgICAgICAgIGV4ZWN1dGFibGUgYXNzb2NpYXRlZCB3aXRoIGl0LiBJZiB0aGlzIGZhaWxzLCBpdCB3aWxsIHJlcG9ydCBhbgorICAgICAgICBlcnJvci4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIE9uIHRoZSB3ZWxsLWtub3duIHN5c3RlbSBidXMsIGl0IGlzIG5vdCBwb3NzaWJsZSBmb3IgdHdvIC5zZXJ2aWNlIGZpbGVzCisgICAgICAgIGluIHRoZSBzYW1lIGRpcmVjdG9yeSB0byBvZmZlciB0aGUgc2FtZSBzZXJ2aWNlLCBiZWNhdXNlIHRoZXkgYXJlCisgICAgICAgIGNvbnN0cmFpbmVkIHRvIGhhdmUgbmFtZXMgdGhhdCBtYXRjaCB0aGUgc2VydmljZSBuYW1lLgorICAgICAgPC9wYXJhPgorCisgICAgICA8cGFyYT4KKyAgICAgICAgT24gdGhlIHdlbGwta25vd24gc2Vzc2lvbiBidXMsIGlmIHR3byAuc2VydmljZSBmaWxlcyBpbiB0aGUgc2FtZQorICAgICAgICBkaXJlY3Rvcnkgb2ZmZXIgdGhlIHNhbWUgc2VydmljZSBuYW1lLCB0aGUgcmVzdWx0IGlzIHVuZGVmaW5lZC4KKyAgICAgICAgRGlzdHJpYnV0b3JzIHNob3VsZCBhdm9pZCB0aGlzIHNpdHVhdGlvbiwgZm9yIGluc3RhbmNlIGJ5IG5hbWluZworICAgICAgICBzZXNzaW9uIHNlcnZpY2VzJyAuc2VydmljZSBmaWxlcyBhY2NvcmRpbmcgdG8gdGhlaXIgc2VydmljZSBuYW1lLgorICAgICAgPC9wYXJhPgorCisgICAgICA8cGFyYT4KKyAgICAgICAgSWYgdHdvIC5zZXJ2aWNlIGZpbGVzIGluIGRpZmZlcmVudCBkaXJlY3RvcmllcyBvZmZlciB0aGUgc2FtZQorICAgICAgICBzZXJ2aWNlIG5hbWUsIHRoZSBvbmUgaW4gdGhlIGhpZ2hlci1wcmlvcml0eSBkaXJlY3RvcnkgaXMgdXNlZDoKKyAgICAgICAgZm9yIGluc3RhbmNlLCBvbiB0aGUgc3lzdGVtIGJ1cywgLnNlcnZpY2UgZmlsZXMgaW4KKyAgICAgICAgL3Vzci9sb2NhbC9zaGFyZS9kYnVzLTEvc3lzdGVtLXNlcnZpY2VzIHRha2UgcHJlY2VkZW5jZSBvdmVyIHRob3NlCisgICAgICAgIGluIC91c3Ivc2hhcmUvZGJ1cy0xL3N5c3RlbS1zZXJ2aWNlcy4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBUaGUgZXhlY3V0YWJsZSBsYXVuY2hlZCB3aWxsIGhhdmUgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlCisgICAgICAgIDxsaXRlcmFsPkRCVVNfU1RBUlRFUl9BRERSRVNTPC9saXRlcmFsPiBzZXQgdG8gdGhlIGFkZHJlc3Mgb2YgdGhlCisgICAgICAgIG1lc3NhZ2UgYnVzIHNvIGl0IGNhbiBjb25uZWN0IGFuZCByZXF1ZXN0IHRoZSBhcHByb3ByaWF0ZSBuYW1lcy4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBUaGUgZXhlY3V0YWJsZSBiZWluZyBsYXVuY2hlZCBtYXkgd2FudCB0byBrbm93IHdoZXRoZXIgdGhlIG1lc3NhZ2UgYnVzCisgICAgICAgIHN0YXJ0aW5nIGl0IGlzIG9uZSBvZiB0aGUgd2VsbC1rbm93biBtZXNzYWdlIGJ1c2VzIChzZWUgPHhyZWYKKyAgICAgICAgbGlua2VuZD0ibWVzc2FnZS1idXMtdHlwZXMiLz4pLiBUbyBmYWNpbGl0YXRlIHRoaXMsIHRoZSBidXMgbXVzdCBhbHNvIHNldAorICAgICAgICB0aGUgPGxpdGVyYWw+REJVU19TVEFSVEVSX0JVU19UWVBFPC9saXRlcmFsPiBlbnZpcm9ubWVudCB2YXJpYWJsZSBpZiBpdCBpcyBvbmUKKyAgICAgICAgb2YgdGhlIHdlbGwta25vd24gYnVzZXMuIFRoZSBjdXJyZW50bHktZGVmaW5lZCB2YWx1ZXMgZm9yIHRoaXMgdmFyaWFibGUKKyAgICAgICAgYXJlIDxsaXRlcmFsPnN5c3RlbTwvbGl0ZXJhbD4gZm9yIHRoZSBzeXN0ZW13aWRlIG1lc3NhZ2UgYnVzLAorICAgICAgICBhbmQgPGxpdGVyYWw+c2Vzc2lvbjwvbGl0ZXJhbD4gZm9yIHRoZSBwZXItbG9naW4tc2Vzc2lvbiBtZXNzYWdlCisgICAgICAgIGJ1cy4gVGhlIG5ldyBleGVjdXRhYmxlIG11c3Qgc3RpbGwgY29ubmVjdCB0byB0aGUgYWRkcmVzcyBnaXZlbgorICAgICAgICBpbiA8bGl0ZXJhbD5EQlVTX1NUQVJURVJfQUREUkVTUzwvbGl0ZXJhbD4sIGJ1dCBtYXkgYXNzdW1lIHRoYXQgdGhlCisgICAgICAgIHJlc3VsdGluZyBjb25uZWN0aW9uIGlzIHRvIHRoZSB3ZWxsLWtub3duIGJ1cy4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBbRklYTUUgdGhlcmUgc2hvdWxkIGJlIGEgdGltZW91dCBzb21ld2hlcmUsIGVpdGhlciBzcGVjaWZpZWQKKyAgICAgICAgaW4gdGhlIC5zZXJ2aWNlIGZpbGUsIGJ5IHRoZSBjbGllbnQsIG9yIGp1c3QgYSBnbG9iYWwgdmFsdWUKKyAgICAgICAgYW5kIGlmIHRoZSBjbGllbnQgYmVpbmcgYWN0aXZhdGVkIGZhaWxzIHRvIGNvbm5lY3Qgd2l0aGluIHRoYXQKKyAgICAgICAgdGltZW91dCwgYW4gZXJyb3Igc2hvdWxkIGJlIHNlbnQgYmFjay5dCisgICAgICA8L3BhcmE+CisKKyAgICAgIDxzZWN0MyBpZD0ibWVzc2FnZS1idXMtc3RhcnRpbmctc2VydmljZXMtc2NvcGUiPgorICAgICAgICA8dGl0bGU+TWVzc2FnZSBCdXMgU2VydmljZSBTY29wZTwvdGl0bGU+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIFRoZSAic2NvcGUiIG9mIGEgc2VydmljZSBpcyBpdHMgInBlci0iLCBzdWNoIGFzIHBlci1zZXNzaW9uLAorICAgICAgICAgIHBlci1tYWNoaW5lLCBwZXItaG9tZS1kaXJlY3RvcnksIG9yIHBlci1kaXNwbGF5LiBUaGUgcmVmZXJlbmNlCisgICAgICAgICAgaW1wbGVtZW50YXRpb24gZG9lc24ndCB5ZXQgc3VwcG9ydCBzdGFydGluZyBzZXJ2aWNlcyBpbiBhIGRpZmZlcmVudAorICAgICAgICAgIHNjb3BlIGZyb20gdGhlIG1lc3NhZ2UgYnVzIGl0c2VsZi4gU28gZS5nLiBpZiB5b3Ugc3RhcnQgYSBzZXJ2aWNlCisgICAgICAgICAgb24gdGhlIHNlc3Npb24gYnVzIGl0cyBzY29wZSBpcyBwZXItc2Vzc2lvbi4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBXZSBjb3VsZCBhZGQgYW4gb3B0aW9uYWwgc2NvcGUgdG8gYSBidXMgbmFtZS4gRm9yIGV4YW1wbGUsIGZvcgorICAgICAgICAgIHBlci0oZGlzcGxheSxzZXNzaW9uIHBhaXIpLCB3ZSBjb3VsZCBoYXZlIGEgdW5pcXVlIElEIGZvciBlYWNoIGRpc3BsYXkKKyAgICAgICAgICBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSBhdCBsb2dpbiBhbmQgc2V0IG9uIHNjcmVlbiAwIGJ5IGV4ZWN1dGluZyBhCisgICAgICAgICAgc3BlY2lhbCAic2V0IGRpc3BsYXkgSUQiIGJpbmFyeS4gVGhlIElEIHdvdWxkIGJlIHN0b3JlZCBpbiBhCisgICAgICAgICAgPGxpdGVyYWw+X0RCVVNfRElTUExBWV9JRDwvbGl0ZXJhbD4gcHJvcGVydHkgYW5kIHdvdWxkIGJlIGEgc3RyaW5nIG9mCisgICAgICAgICAgcmFuZG9tIGJ5dGVzLiBUaGlzIElEIHdvdWxkIHRoZW4gYmUgdXNlZCB0byBzY29wZSBuYW1lcy4KKyAgICAgICAgICBTdGFydGluZy9sb2NhdGluZyBhIHNlcnZpY2UgY291bGQgYmUgZG9uZSBieSBJRC1uYW1lIHBhaXIgcmF0aGVyIHRoYW4KKyAgICAgICAgICBvbmx5IGJ5IG5hbWUuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgQ29udHJhc3QgdGhpcyB3aXRoIGEgcGVyLWRpc3BsYXkgc2NvcGUuIFRvIGFjaGlldmUgdGhhdCwgd2Ugd291bGQKKyAgICAgICAgICB3YW50IGEgc2luZ2xlIGJ1cyBzcGFubmluZyBhbGwgc2Vzc2lvbnMgdXNpbmcgYSBnaXZlbiBkaXNwbGF5LgorICAgICAgICAgIFNvIHdlIG1pZ2h0IHNldCBhIDxsaXRlcmFsPl9EQlVTX0RJU1BMQVlfQlVTX0FERFJFU1M8L2xpdGVyYWw+CisgICAgICAgICAgcHJvcGVydHkgb24gc2NyZWVuIDAgb2YgdGhlIGRpc3BsYXksIHBvaW50aW5nIHRvIHRoaXMgYnVzLgorICAgICAgICA8L3BhcmE+CisgICAgICA8L3NlY3QzPgorCisgICAgICA8c2VjdDMgaWQ9Im1lc3NhZ2UtYnVzLXN0YXJ0aW5nLXNlcnZpY2VzLXN5c3RlbWQiPgorICAgICAgICA8dGl0bGU+c3lzdGVtZCBBY3RpdmF0aW9uPC90aXRsZT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICBTZXJ2aWNlIGRlc2NyaXB0aW9uIGZpbGVzIG1heSBjb250YWluIGEKKyAgICAgICAgICA8bGl0ZXJhbD5TeXN0ZW1kU2VydmljZTwvbGl0ZXJhbD4ga2V5LiBJdHMgdmFsdWUgaXMgdGhlIG5hbWUgb2YgYQorICAgICAgICAgIDx1bGluaworICAgICAgICAgICAgdXJsPSJodHRwczovL3d3dy5mcmVlZGVza3RvcC5vcmcvd2lraS9Tb2Z0d2FyZS9zeXN0ZW1kLyI+c3lzdGVtZDwvdWxpbms+CisgICAgICAgICAgc2VydmljZSwgZm9yIGV4YW1wbGUKKyAgICAgICAgICA8bGl0ZXJhbD5kYnVzLWNvbS5leGFtcGxlLk15RGFlbW9uLnNlcnZpY2U8L2xpdGVyYWw+LgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgSWYgdGhpcyBrZXkgaXMgcHJlc2VudCwgdGhlIGJ1cyBkYWVtb24gbWF5IGNhcnJ5IG91dCBhY3RpdmF0aW9uIGZvcgorICAgICAgICAgIHRoaXMgRC1CdXMgc2VydmljZSBieSBzZW5kaW5nIGEgcmVxdWVzdCB0byBzeXN0ZW1kIGFza2luZyBpdCB0bworICAgICAgICAgIHN0YXJ0IHRoZSBzeXN0ZW1kIHNlcnZpY2Ugd2hvc2UgbmFtZSBpcyB0aGUgdmFsdWUgb2YKKyAgICAgICAgICA8bGl0ZXJhbD5TeXN0ZW1kU2VydmljZTwvbGl0ZXJhbD4uIEZvciBleGFtcGxlLCB0aGUgcmVmZXJlbmNlCisgICAgICAgICAgPGxpdGVyYWw+ZGJ1cy1kYWVtb248L2xpdGVyYWw+IGhhcyBhCisgICAgICAgICAgPGxpdGVyYWw+LS1zeXN0ZW1kLWFjdGl2YXRpb248L2xpdGVyYWw+IG9wdGlvbiB0aGF0IGVuYWJsZXMgdGhpcworICAgICAgICAgIGZlYXR1cmUsIGFuZCB0aGF0IG9wdGlvbiBpcyBnaXZlbiB3aGVuIGl0IGlzIHN0YXJ0ZWQgYnkgc3lzdGVtZC4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgIE9uIHRoZSB3ZWxsLWtub3duIHN5c3RlbSBidXMsIGl0IGlzIGEgY29tbW9uIHByYWN0aWNlIHRvIHNldAorICAgICAgICAgIDxsaXRlcmFsPlN5c3RlbWRTZXJ2aWNlPC9saXRlcmFsPiB0byA8bGl0ZXJhbD5kYnVzLTwvbGl0ZXJhbD4sCisgICAgICAgICAgZm9sbG93ZWQgYnkgdGhlIHdlbGwta25vd24gYnVzIG5hbWUsIGZvbGxvd2VkIGJ5CisgICAgICAgICAgPGxpdGVyYWw+LnNlcnZpY2U8L2xpdGVyYWw+LCB0aGVuIHJlZ2lzdGVyIHRoYXQgbmFtZSBhcyBhbiBhbGlhcworICAgICAgICAgIGZvciB0aGUgcmVhbCBzeXN0ZW1kIHNlcnZpY2UuIFRoaXMgYWxsb3dzIEQtQnVzIGFjdGl2YXRpb24gb2YgYQorICAgICAgICAgIHNlcnZpY2UgdG8gYmUgZW5hYmxlZCBvciBkaXNhYmxlZCBpbmRlcGVuZGVudGx5IG9mIHdoZXRoZXIgdGhlCisgICAgICAgICAgc2VydmljZSBpcyBzdGFydGVkIGJ5IHN5c3RlbWQgZHVyaW5nIGJvb3QuCisgICAgICAgIDwvcGFyYT4KKyAgICAgIDwvc2VjdDM+CisKKyAgICAgIDxzZWN0MyBpZD0ibWVzc2FnZS1idXMtc3RhcnRpbmctc2VydmljZXMtYXBwYXJtb3IiPgorICAgICAgICA8dGl0bGU+TWVkaWF0aW5nIEFjdGl2YXRpb24gd2l0aCBBcHBBcm1vcjwvdGl0bGU+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgUGxlYXNlIHJlZmVyIHRvCisgICAgICAgICAgPHVsaW5rIHVybD0iaHR0cDovL3dpa2kuYXBwYXJtb3IubmV0L2luZGV4LnBocC9Eb2N1bWVudGF0aW9uIj5BcHBBcm1vciBkb2N1bWVudGF0aW9uPC91bGluaz4KKyAgICAgICAgICBmb3IgZ2VuZXJhbCBpbmZvcm1hdGlvbiBvbiBBcHBBcm1vciwgYW5kIGhvdyBpdCBtZWRpYXRlcyBELUJ1cworICAgICAgICAgIG1lc3NhZ2VzIHdoZW4gdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGEga2VybmVsIGFuZAorICAgICAgICAgIDxsaXRlcmFsPmRidXMtZGFlbW9uPC9saXRlcmFsPiB0aGF0IHN1cHBvcnQgdGhpcy4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEluIHJlY2VudCB2ZXJzaW9ucyBvZiB0aGUgcmVmZXJlbmNlIDxsaXRlcmFsPmRidXMtZGFlbW9uPC9saXRlcmFsPiwKKyAgICAgICAgICBBcHBBcm1vciBwb2xpY3kgcnVsZXMgb2YgdHlwZSA8bGl0ZXJhbD5kYnVzIHNlbmQ8L2xpdGVyYWw+CisgICAgICAgICAgYXJlIGFsc28gdXNlZCB0byBjb250cm9sIGF1dG8tc3RhcnRpbmc6IGlmIGEgbWVzc2FnZSBpcyBzZW50IHRvCisgICAgICAgICAgdGhlIHdlbGwta25vd24gbmFtZSBvZiBhbiBhY3RpdmF0YWJsZSBzZXJ2aWNlLCB0aGUKKyAgICAgICAgICA8bGl0ZXJhbD5kYnVzLWRhZW1vbjwvbGl0ZXJhbD4gd2lsbCBhdHRlbXB0IHRvIGRldGVybWluZSB3aGV0aGVyCisgICAgICAgICAgaXQgd291bGQgZGVsaXZlciB0aGUgbWVzc2FnZSB0byB0aGF0IHNlcnZpY2UKKyAgICAgICAgICA8ZW1waGFzaXM+YmVmb3JlPC9lbXBoYXNpcz5hdXRvLXN0YXJ0aW5nIGl0LCBieSBtYWtpbmcgc29tZQorICAgICAgICAgIGFzc3VtcHRpb25zIGFib3V0IHRoZSByZXN1bHRpbmcgcHJvY2VzcydzIGNyZWRlbnRpYWxzLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgSWYgaXQgZG9lcyBwcm9jZWVkIHdpdGggYXV0by1zdGFydGluZywgd2hlbiB0aGUgc2VydmljZSBhcHBlYXJzLCB0aGUKKyAgICAgICAgICA8bGl0ZXJhbD5kYnVzLWRhZW1vbjwvbGl0ZXJhbD4gcmVwZWF0cyB0aGUgcG9saWN5IGNoZWNrICh3aXRoCisgICAgICAgICAgdGhlIHNlcnZpY2UncyB0cnVlIGNyZWRlbnRpYWxzLCB3aGljaCBtaWdodCBub3QgYmUgaWRlbnRpY2FsKQorICAgICAgICAgIGJlZm9yZSBkZWxpdmVyaW5nIHRoZSBtZXNzYWdlLiBJbiBwcmFjdGljZSwgdGhpcyBzZWNvbmQgY2hlY2sgd2lsbAorICAgICAgICAgIHVzdWFsbHkgYmUgbW9yZSBzdHJpY3QgdGhhbiB0aGUgZmlyc3Q7IHRoZSBmaXJzdCBjaGVjayB3b3VsZCBvbmx5CisgICAgICAgICAgYmUgbW9yZSBzdHJpY3QgaWYgdGhlcmUgYXJlICJibGFja2xpc3QiLXN0eWxlIHJ1bGVzIGxpa2UKKyAgICAgICAgICA8bGl0ZXJhbD5kZW55IGRidXMgc2VuZCBwZWVyPShsYWJlbD0vdXNyL2Jpbi9wcm90ZWN0ZWQpPC9saXRlcmFsPgorICAgICAgICAgIHRoYXQgbWF0Y2ggb24gdGhlIHBlZXIncyBzcGVjaWZpYyBjcmVkZW50aWFscywgYnV0IEFwcEFybW9yIGlzCisgICAgICAgICAgbm9ybWFsbHkgdXNlZCBpbiBhICJ3aGl0ZWxpc3QiIHN0eWxlIHdoZXJlIHRoaXMgZG9lcyBub3QgYXBwbHkuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICBUbyBzdXBwb3J0IHRoaXMgcHJvY2Vzcywgc2VydmljZSBkZXNjcmlwdGlvbiBmaWxlcyBtYXkgY29udGFpbiBhCisgICAgICAgICAgPGxpdGVyYWw+QXNzdW1lZEFwcEFybW9yTGFiZWw8L2xpdGVyYWw+IGtleS4gSXRzIHZhbHVlIGlzIHRoZSBuYW1lCisgICAgICAgICAgb2YgYW4gQXBwQXJtb3IgbGFiZWwsIGZvciBleGFtcGxlCisgICAgICAgICAgPGxpdGVyYWw+L3Vzci9zYmluL215ZGFlbW9uPC9saXRlcmFsPi4KKyAgICAgICAgICBJZiBwcmVzZW50LCBBcHBBcm1vciBtZWRpYXRpb24gb2YgbWVzc2FnZXMgdGhhdCBhdXRvLXN0YXJ0IGEKKyAgICAgICAgICBzZXJ2aWNlIHdpbGwgZGVjaWRlIHdoZXRoZXIgdG8gYWxsb3cgYXV0by1zdGFydGluZyB0byBvY2N1ciBiYXNlZAorICAgICAgICAgIG9uIHRoZSBhc3N1bXB0aW9uIHRoYXQgdGhlIGFjdGl2YXRlZCBzZXJ2aWNlIHdpbGwgYmUgY29uZmluZWQKKyAgICAgICAgICB1bmRlciB0aGUgc3BlY2lmaWVkIGxhYmVsOyBpbiBwYXJ0aWN1bGFyLCBydWxlcyBvZiB0aGUgZm9ybQorICAgICAgICAgIDxsaXRlcmFsPmRidXMgc2VuZCBwZWVyPShsYWJlbD0vdXNyL3NiaW4vbXlkYWVtb24pPC9saXRlcmFsPiBvcgorICAgICAgICAgIDxsaXRlcmFsPmRlbnkgZGJ1cyBzZW5kIHBlZXI9KGxhYmVsPS91c3Ivc2Jpbi9teWRhZW1vbik8L2xpdGVyYWw+CisgICAgICAgICAgd2lsbCBtYXRjaCBpdCwgYWxsb3dpbmcgb3IgZGVueWluZyBhcyBhcHByb3ByaWF0ZQorICAgICAgICAgIChldmVuIGlmIHRoZXJlIGlzIGluIGZhY3Qgbm8gcHJvZmlsZSBvZiB0aGF0IG5hbWUgbG9hZGVkKS4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgIE90aGVyd2lzZSwgQXBwQXJtb3IgbWVkaWF0aW9uIG9mIG1lc3NhZ2VzIHRoYXQgYXV0by1zdGFydCBhCisgICAgICAgICAgc2VydmljZSB3aWxsIGRlY2lkZSB3aGV0aGVyIHRvIGFsbG93IGF1dG8tc3RhcnRpbmcgdG8gb2NjdXIKKyAgICAgICAgICB3aXRob3V0IHNwZWNpZnlpbmcgYW55IHBhcnRpY3VsYXIgbGFiZWwuIEluIHBhcnRpY3VsYXIsIGFueSBydWxlIG9mCisgICAgICAgICAgdGhlIGZvcm0gPGxpdGVyYWw+ZGJ1cyBzZW5kIHBlZXI9KGxhYmVsPVgpPC9saXRlcmFsPiBvcgorICAgICAgICAgIDxsaXRlcmFsPmRlbnkgZGJ1cyBzZW5kIHBlZXI9KGxhYmVsPVgpPC9saXRlcmFsPgorICAgICAgICAgIChmb3IgYW55IHZhbHVlIG9mIFgsIGluY2x1ZGluZyB0aGUgc3BlY2lhbCBsYWJlbAorICAgICAgICAgIDxsaXRlcmFsPnVuY29uZmluZWQ8L2xpdGVyYWw+KSB3aWxsIG5vdCBpbmZsdWVuY2Ugd2hldGhlciB0aGUKKyAgICAgICAgICBhdXRvLXN0YXJ0IGlzIGFsbG93ZWQuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICBSdWxlcyBvZiB0eXBlIDxsaXRlcmFsPmRidXMgcmVjZWl2ZTwvbGl0ZXJhbD4gYXJlIG5vdCBjaGVja2VkCisgICAgICAgICAgd2hlbiBkZWNpZGluZyB3aGV0aGVyIHRvIGFsbG93IGF1dG8tc3RhcnRpbmc7IHRoZXkgYXJlIG9ubHkgY2hlY2tlZAorICAgICAgICAgIGFnYWluc3QgdGhlIHNlcnZpY2UncyBwcm9maWxlIGFmdGVyIHRoZSBzZXJ2aWNlIGhhcyBzdGFydGVkLCB3aGVuCisgICAgICAgICAgZGVjaWRpbmcgd2hldGhlciB0byBkZWxpdmVyIHRoZSBtZXNzYWdlIHRoYXQgY2F1c2VkIHRoZSBhdXRvLXN0YXJ0aW5nCisgICAgICAgICAgb3BlcmF0aW9uLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgRXhwbGljaXQgYWN0aXZhdGlvbiB2aWEKKyAgICAgICAgICA8eHJlZiBsaW5rZW5kPSJidXMtbWVzc2FnZXMtc3RhcnQtc2VydmljZS1ieS1uYW1lIi8+IGlzIG5vdCBjdXJyZW50bHkKKyAgICAgICAgICBhZmZlY3RlZCBieSB0aGlzIG1lZGlhdGlvbjogaWYgYSBjb25maW5lZCBwcm9jZXNzIGlzIHRvIGJlIHByZXZlbnRlZAorICAgICAgICAgIGZyb20gc3RhcnRpbmcgYXJiaXRyYXJ5IHNlcnZpY2VzLCB0aGVuIGl0IG11c3Qgbm90IGJlIGFsbG93ZWQgdG8gY2FsbAorICAgICAgICAgIHRoYXQgbWV0aG9kLgorICAgICAgICA8L3BhcmE+CisgICAgICA8L3NlY3QzPgorICAgIDwvc2VjdDI+CisKKyAgICA8c2VjdDIgaWQ9Im1lc3NhZ2UtYnVzLXR5cGVzIj4KKyAgICAgIDx0aXRsZT5XZWxsLWtub3duIE1lc3NhZ2UgQnVzIEluc3RhbmNlczwvdGl0bGU+CisgICAgICA8cGFyYT4KKyAgICAgICAgVHdvIHN0YW5kYXJkIG1lc3NhZ2UgYnVzIGluc3RhbmNlcyBhcmUgZGVmaW5lZCBoZXJlLCBhbG9uZyB3aXRoIGhvdworICAgICAgICB0byBsb2NhdGUgdGhlbSBhbmQgd2hlcmUgdGhlaXIgc2VydmljZSBmaWxlcyBsaXZlLgorICAgICAgPC9wYXJhPgorICAgICAgPHNlY3QzIGlkPSJtZXNzYWdlLWJ1cy10eXBlcy1sb2dpbiI+CisgICAgICAgIDx0aXRsZT5Mb2dpbiBzZXNzaW9uIG1lc3NhZ2UgYnVzPC90aXRsZT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgRWFjaCB0aW1lIGEgdXNlciBsb2dzIGluLCBhIDxmaXJzdHRlcm0+bG9naW4gc2Vzc2lvbiBtZXNzYWdlCisgICAgICAgICAgICBidXM8L2ZpcnN0dGVybT4gbWF5IGJlIHN0YXJ0ZWQuIEFsbCBhcHBsaWNhdGlvbnMgaW4gdGhlIHVzZXIncyBsb2dpbgorICAgICAgICAgIHNlc3Npb24gbWF5IGludGVyYWN0IHdpdGggb25lIGFub3RoZXIgdXNpbmcgdGhpcyBtZXNzYWdlIGJ1cy4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBUaGUgYWRkcmVzcyBvZiB0aGUgbG9naW4gc2Vzc2lvbiBtZXNzYWdlIGJ1cyBpcyBnaXZlbgorICAgICAgICAgIGluIHRoZSA8bGl0ZXJhbD5EQlVTX1NFU1NJT05fQlVTX0FERFJFU1M8L2xpdGVyYWw+IGVudmlyb25tZW50CisgICAgICAgICAgdmFyaWFibGUuIElmIHRoYXQgdmFyaWFibGUgaXMgbm90IHNldCwgYXBwbGljYXRpb25zIG1heQorICAgICAgICAgIGFsc28gdHJ5IHRvIHJlYWQgdGhlIGFkZHJlc3MgZnJvbSB0aGUgWCBXaW5kb3cgU3lzdGVtIHJvb3QKKyAgICAgICAgICB3aW5kb3cgcHJvcGVydHkgPGxpdGVyYWw+X0RCVVNfU0VTU0lPTl9CVVNfQUREUkVTUzwvbGl0ZXJhbD4uCisgICAgICAgICAgVGhlIHJvb3Qgd2luZG93IHByb3BlcnR5IG11c3QgaGF2ZSB0eXBlIDxsaXRlcmFsPlNUUklORzwvbGl0ZXJhbD4uCisgICAgICAgICAgVGhlIGVudmlyb25tZW50IHZhcmlhYmxlIHNob3VsZCBoYXZlIHByZWNlZGVuY2Ugb3ZlciB0aGUKKyAgICAgICAgICByb290IHdpbmRvdyBwcm9wZXJ0eS4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT5UaGUgYWRkcmVzcyBvZiB0aGUgbG9naW4gc2Vzc2lvbiBtZXNzYWdlIGJ1cyBpcyBnaXZlbiBpbiB0aGUKKyAgICAgICAgPGxpdGVyYWw+REJVU19TRVNTSU9OX0JVU19BRERSRVNTPC9saXRlcmFsPiBlbnZpcm9ubWVudCB2YXJpYWJsZS4gSWYKKyAgICAgICAgREJVU19TRVNTSU9OX0JVU19BRERSRVNTIGlzIG5vdCBzZXQsIG9yIGlmIGl0J3Mgc2V0IHRvIHRoZSBzdHJpbmcKKyAgICAgICAgImF1dG9sYXVuY2g6IiwgdGhlIHN5c3RlbSBzaG91bGQgdXNlIHBsYXRmb3JtLXNwZWNpZmljIG1ldGhvZHMgb2YKKyAgICAgICAgbG9jYXRpbmcgYSBydW5uaW5nIEQtQnVzIHNlc3Npb24gc2VydmVyLCBvciBzdGFydGluZyBvbmUgaWYgYSBydW5uaW5nCisgICAgICAgIGluc3RhbmNlIGNhbm5vdCBiZSBmb3VuZC4gTm90ZSB0aGF0IHRoaXMgbWVjaGFuaXNtIGlzIG5vdCByZWNvbW1lbmRlZAorICAgICAgICBmb3IgYXR0ZW1wdGluZyB0byBkZXRlcm1pbmUgaWYgYSBkYWVtb24gaXMgcnVubmluZy4gSXQgaXMgaW5oZXJlbnRseQorICAgICAgICByYWN5IHRvIGF0dGVtcHQgdG8gbWFrZSB0aGlzIGRldGVybWluYXRpb24sIHNpbmNlIHRoZSBidXMgZGFlbW9uIG1heQorICAgICAgICBiZSBzdGFydGVkIGp1c3QgYmVmb3JlIG9yIGp1c3QgYWZ0ZXIgdGhlIGRldGVybWluYXRpb24gaXMgbWFkZS4KKyAgICAgICAgVGhlcmVmb3JlLCBpdCBpcyByZWNvbW1lbmRlZCB0aGF0IGFwcGxpY2F0aW9ucyBkbyBub3QgdHJ5IHRvIG1ha2UgdGhpcworICAgICAgICBkZXRlcm1pbmF0aW9uIGZvciB0aGVpciBmdW5jdGlvbmFsaXR5IHB1cnBvc2VzLCBhbmQgaW5zdGVhZCB0aGV5CisgICAgICAgIHNob3VsZCBhdHRlbXB0IHRvIHN0YXJ0IHRoZSBzZXJ2ZXIuPC9wYXJhPgorCisgICAgICAgIDxzZWN0NCBpZD0ibWVzc2FnZS1idXMtdHlwZXMtbG9naW4teC13aW5kb3dzIj4KKyAgICAgICAgICA8dGl0bGU+WCBXaW5kb3dpbmcgU3lzdGVtPC90aXRsZT4KKyAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEZvciB0aGUgWCBXaW5kb3dpbmcgU3lzdGVtLCB0aGUgYXBwbGljYXRpb24gbXVzdCBsb2NhdGUgdGhlCisgICAgICAgICAgICB3aW5kb3cgb3duZXIgb2YgdGhlIHNlbGVjdGlvbiByZXByZXNlbnRlZCBieSB0aGUgYXRvbSBmb3JtZWQgYnkKKyAgICAgICAgICAgIGNvbmNhdGVuYXRpbmc6CisgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+dGhlIGxpdGVyYWwgc3RyaW5nICJfREJVU19TRVNTSU9OX0JVU19TRUxFQ1RJT05fIjwvcGFyYT4KKyAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKworICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+dGhlIGN1cnJlbnQgdXNlcidzIHVzZXJuYW1lPC9wYXJhPgorICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorCisgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT50aGUgbGl0ZXJhbCBjaGFyYWN0ZXIgJ18nICh1bmRlcnNjb3JlKTwvcGFyYT4KKyAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKworICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+dGhlIG1hY2hpbmUncyBJRDwvcGFyYT4KKyAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIGFyZSBkZWZpbmVkIGZvciB0aGUgd2luZG93IHRoYXQgb3ducworICAgICAgICAgICAgdGhpcyBYIHNlbGVjdGlvbjoKKyAgICAgICAgICAgIDxpbmZvcm1hbHRhYmxlIGZyYW1lPSJhbGwiPgorICAgICAgICAgICAgICA8dGdyb3VwIGNvbHM9IjIiPgorICAgICAgICAgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICA8cGFyYT5BdG9tPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorCisgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICA8cGFyYT5tZWFuaW5nPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPC9yb3c+CisKKyAgICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICA8cGFyYT5fREJVU19TRVNTSU9OX0JVU19BRERSRVNTPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorCisgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICA8cGFyYT50aGUgYWN0dWFsIGFkZHJlc3Mgb2YgdGhlIHNlcnZlciBzb2NrZXQ8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8L3Jvdz4KKworICAgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPl9EQlVTX1NFU1NJT05fQlVTX1BJRDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKworICAgICAgICAgICAgICAgICAgICA8ZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+dGhlIFBJRCBvZiB0aGUgc2VydmVyIHByb2Nlc3M8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICA8L3Rib2R5PgorICAgICAgICAgICAgICA8L3Rncm91cD4KKyAgICAgICAgICAgIDwvaW5mb3JtYWx0YWJsZT4KKyAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEF0IGxlYXN0IHRoZSBfREJVU19TRVNTSU9OX0JVU19BRERSRVNTIHByb3BlcnR5IE1VU1QgYmUKKyAgICAgICAgICAgIHByZXNlbnQgaW4gdGhpcyB3aW5kb3cuCisgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBJZiB0aGUgWCBzZWxlY3Rpb24gY2Fubm90IGJlIGxvY2F0ZWQgb3IgaWYgcmVhZGluZyB0aGUKKyAgICAgICAgICAgIHByb3BlcnRpZXMgZnJvbSB0aGUgd2luZG93IGZhaWxzLCB0aGUgaW1wbGVtZW50YXRpb24gTVVTVCBjb25jbHVkZQorICAgICAgICAgICAgdGhhdCB0aGVyZSBpcyBubyBELUJ1cyBzZXJ2ZXIgcnVubmluZyBhbmQgcHJvY2VlZCB0byBzdGFydCBhIG5ldworICAgICAgICAgICAgc2VydmVyLiAoU2VlIGJlbG93IG9uIGNvbmN1cnJlbmN5IGlzc3VlcykKKyAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEZhaWx1cmUgdG8gY29ubmVjdCB0byB0aGUgRC1CdXMgc2VydmVyIGFkZHJlc3MgdGh1cyBvYnRhaW5lZAorICAgICAgICAgICAgTVVTVCBiZSB0cmVhdGVkIGFzIGEgZmF0YWwgY29ubmVjdGlvbiBlcnJvciBhbmQgc2hvdWxkIGJlIHJlcG9ydGVkCisgICAgICAgICAgICB0byB0aGUgYXBwbGljYXRpb24uCisgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBBcyBhbiBhbHRlcm5hdGl2ZSwgYW4gaW1wbGVtZW50YXRpb24gTUFZIGZpbmQgdGhlIGluZm9ybWF0aW9uCisgICAgICAgICAgICBpbiB0aGUgZm9sbG93aW5nIGZpbGUgbG9jYXRlZCBpbiB0aGUgY3VycmVudCB1c2VyJ3MgaG9tZSBkaXJlY3RvcnksCisgICAgICAgICAgICBpbiBzdWJkaXJlY3RvcnkgLmRidXMvc2Vzc2lvbi1idXMvOgorICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPnRoZSBtYWNoaW5lJ3MgSUQ8L3BhcmE+CisgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisKKyAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPnRoZSBsaXRlcmFsIGNoYXJhY3RlciAnLScgKGRhc2gpPC9wYXJhPgorICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorCisgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT50aGUgWCBkaXNwbGF5IHdpdGhvdXQgdGhlIHNjcmVlbiBudW1iZXIsIHdpdGggdGhlCisgICAgICAgICAgICAgICAgZm9sbG93aW5nIHByZWZpeGVzIHJlbW92ZWQsIGlmIHByZXNlbnQ6ICI6IiwgImxvY2FsaG9zdDoiCisgICAgICAgICAgICAgICAgLiJsb2NhbGhvc3QubG9jYWxkb21haW46Ii4gVGhhdCBpcywgYSBkaXNwbGF5IG9mCisgICAgICAgICAgICAgICAgImxvY2FsaG9zdDoxMC4wIiBwcm9kdWNlcyBqdXN0IHRoZSBudW1iZXIgIjEwIjwvcGFyYT4KKyAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBOQU1FPXZhbHVlIGFzc2lnbm1lbnQgcGFpcnMgYW5kCisgICAgICAgICAgICBsaW5lcyBzdGFydGluZyB3aXRoICMgYXJlIGNvbW1lbnRzIChubyBjb21tZW50cyBhcmUgYWxsb3dlZAorICAgICAgICAgICAgb3RoZXJ3aXNlKS4gVGhlIGZvbGxvd2luZyB2YXJpYWJsZSBuYW1lcyBhcmUgZGVmaW5lZDoKKyAgICAgICAgICAgIDxpbmZvcm1hbHRhYmxlCisgICAgICAgICAgICAgIGZyYW1lPSJhbGwiPgorICAgICAgICAgICAgICA8dGdyb3VwIGNvbHM9IjIiPgorICAgICAgICAgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICA8cGFyYT5WYXJpYWJsZTwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKworICAgICAgICAgICAgICAgICAgICA8ZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+bWVhbmluZzwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDwvcm93PgorCisgICAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgICA8ZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+REJVU19TRVNTSU9OX0JVU19BRERSRVNTPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorCisgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICA8cGFyYT50aGUgYWN0dWFsIGFkZHJlc3Mgb2YgdGhlIHNlcnZlciBzb2NrZXQ8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8L3Jvdz4KKworICAgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPkRCVVNfU0VTU0lPTl9CVVNfUElEPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorCisgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICA8cGFyYT50aGUgUElEIG9mIHRoZSBzZXJ2ZXIgcHJvY2VzczwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDwvcm93PgorCisgICAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgICA8ZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+REJVU19TRVNTSU9OX0JVU19XSU5ET1dJRDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKworICAgICAgICAgICAgICAgICAgICA8ZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+dGhlIHdpbmRvdyBJRDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgIDwvdGJvZHk+CisgICAgICAgICAgICAgIDwvdGdyb3VwPgorICAgICAgICAgICAgPC9pbmZvcm1hbHRhYmxlPgorICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgQXQgbGVhc3QgdGhlIERCVVNfU0VTU0lPTl9CVVNfQUREUkVTUyB2YXJpYWJsZSBNVVNUIGJlIHByZXNlbnQKKyAgICAgICAgICAgIGluIHRoaXMgZmlsZS4KKyAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEZhaWx1cmUgdG8gb3BlbiB0aGlzIGZpbGUgTVVTVCBiZSBpbnRlcnByZXRlZCBhcyBhYnNlbmNlIG9mIGEKKyAgICAgICAgICAgIHJ1bm5pbmcgc2VydmVyLiBUaGVyZWZvcmUsIHRoZSBpbXBsZW1lbnRhdGlvbiBNVVNUIHByb2NlZWQgdG8KKyAgICAgICAgICAgIGF0dGVtcHRpbmcgdG8gbGF1bmNoIGEgbmV3IGJ1cyBzZXJ2ZXIgaWYgdGhlIGZpbGUgY2Fubm90IGJlCisgICAgICAgICAgICBvcGVuZWQuCisgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBIb3dldmVyLCBzdWNjZXNzIGluIG9wZW5pbmcgdGhpcyBmaWxlIE1VU1QgTk9UIGxlYWQgdG8gdGhlCisgICAgICAgICAgICBjb25jbHVzaW9uIHRoYXQgdGhlIHNlcnZlciBpcyBydW5uaW5nLiBUaHVzLCBhIGZhaWx1cmUgdG8gY29ubmVjdCB0bworICAgICAgICAgICAgdGhlIGJ1cyBhZGRyZXNzIG9idGFpbmVkIGJ5IHRoZSBhbHRlcm5hdGl2ZSBtZXRob2QgTVVTVCBOT1QgYmUKKyAgICAgICAgICAgIGNvbnNpZGVyZWQgYSBmYXRhbCBlcnJvci4gSWYgdGhlIGNvbm5lY3Rpb24gY2Fubm90IGJlIGVzdGFibGlzaGVkLAorICAgICAgICAgICAgdGhlIGltcGxlbWVudGF0aW9uIE1VU1QgcHJvY2VlZCB0byBjaGVjayB0aGUgWCBzZWxlY3Rpb24gc2V0dGluZ3Mgb3IKKyAgICAgICAgICAgIHRvIHN0YXJ0IHRoZSBzZXJ2ZXIgb24gaXRzIG93bi4KKyAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIElmIHRoZSBpbXBsZW1lbnRhdGlvbiBjb25jbHVkZXMgdGhhdCB0aGUgRC1CdXMgc2VydmVyIGlzIG5vdAorICAgICAgICAgICAgcnVubmluZyBpdCBNVVNUIGF0dGVtcHQgdG8gc3RhcnQgYSBuZXcgc2VydmVyIGFuZCBpdCBNVVNUIGFsc28KKyAgICAgICAgICAgIGVuc3VyZSB0aGF0IHRoZSBkYWVtb24gc3RhcnRlZCBhcyBhbiBlZmZlY3Qgb2YgdGhlICJhdXRvbGF1bmNoIgorICAgICAgICAgICAgbWVjaGFuaXNtIHByb3ZpZGVzIHRoZSBsb29rdXAgbWVjaGFuaXNtcyBkZXNjcmliZWQgYWJvdmUsIHNvCisgICAgICAgICAgICBzdWJzZXF1ZW50IGNhbGxzIGNhbiBsb2NhdGUgdGhlIG5ld2x5IHN0YXJ0ZWQgc2VydmVyLiBUaGUKKyAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIE1VU1QgYWxzbyBlbnN1cmUgdGhhdCBpZiB0d28gb3IgbW9yZSBjb25jdXJyZW50CisgICAgICAgICAgICBpbml0aWF0aW9ucyBoYXBwZW4sIG9ubHkgb25lIHNlcnZlciByZW1haW5zIHJ1bm5pbmcgYW5kIGFsbCBvdGhlcgorICAgICAgICAgICAgaW5pdGlhdGlvbnMgYXJlIGFibGUgdG8gb2J0YWluIHRoZSBhZGRyZXNzIG9mIHRoaXMgc2VydmVyIGFuZAorICAgICAgICAgICAgY29ubmVjdCB0byBpdC4gSW4gb3RoZXIgd29yZHMsIHRoZSBpbXBsZW1lbnRhdGlvbiBNVVNUIGVuc3VyZSB0aGF0CisgICAgICAgICAgICB0aGUgWCBzZWxlY3Rpb24gaXMgbm90IHByZXNlbnQgd2hlbiBpdCBhdHRlbXB0cyB0byBzZXQgaXQsIHdpdGhvdXQKKyAgICAgICAgICAgIGFsbG93aW5nIGFub3RoZXIgcHJvY2VzcyB0byBzZXQgdGhlIHNlbGVjdGlvbiBiZXR3ZWVuIHRoZQorICAgICAgICAgICAgdmVyaWZpY2F0aW9uIGFuZCB0aGUgc2V0dGluZyAoZS5nLiwgYnkgdXNpbmcgWEdyYWJTZXJ2ZXIgLworICAgICAgICAgICAgWHVuZ3JhYlNlcnZlcikuCisgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Q0PgorICAgICAgICA8c2VjdDQ+CisgICAgICAgICAgPHRpdGxlPkZpbmRpbmcgc2Vzc2lvbiBzZXJ2aWNlczwvdGl0bGU+CisgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBPbiBVbml4IHN5c3RlbXMsIHRoZSBzZXNzaW9uIGJ1cyBzaG91bGQgc2VhcmNoIGZvciAuc2VydmljZSBmaWxlcworICAgICAgICAgICAgaW4gPGxpdGVyYWw+JFhER19EQVRBX0RJUlMvZGJ1cy0xL3NlcnZpY2VzPC9saXRlcmFsPiBhcyBkZWZpbmVkCisgICAgICAgICAgICBieSB0aGUKKyAgICAgICAgICAgIDx1bGluayB1cmw9Imh0dHA6Ly9zdGFuZGFyZHMuZnJlZWRlc2t0b3Aub3JnL2Jhc2VkaXItc3BlYy9iYXNlZGlyLXNwZWMtbGF0ZXN0Lmh0bWwiPlhERyBCYXNlIERpcmVjdG9yeSBTcGVjaWZpY2F0aW9uPC91bGluaz4uCisgICAgICAgICAgICBJbXBsZW1lbnRhdGlvbnMgbWF5IGFsc28gc2VhcmNoIGFkZGl0aW9uYWwgbG9jYXRpb25zLAorICAgICAgICAgICAgd2l0aCBhIGhpZ2hlciBvciBsb3dlciBwcmlvcml0eSB0aGFuIHRoZSBYREcgZGlyZWN0b3JpZXMuCisgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgQXMgZGVzY3JpYmVkIGluIHRoZSBYREcgQmFzZSBEaXJlY3RvcnkgU3BlY2lmaWNhdGlvbiwgc29mdHdhcmUKKyAgICAgICAgICAgIHBhY2thZ2VzIHNob3VsZCBpbnN0YWxsIHRoZWlyIHNlc3Npb24gLnNlcnZpY2UgZmlsZXMgdG8gdGhlaXIKKyAgICAgICAgICAgIGNvbmZpZ3VyZWQgPGxpdGVyYWw+JHtkYXRhZGlyfS9kYnVzLTEvc2VydmljZXM8L2xpdGVyYWw+LAorICAgICAgICAgICAgd2hlcmUgPGxpdGVyYWw+JHtkYXRhZGlyfTwvbGl0ZXJhbD4gaXMgYXMgZGVmaW5lZCBieSB0aGUgR05VCisgICAgICAgICAgICBjb2Rpbmcgc3RhbmRhcmRzLiBTeXN0ZW0gYWRtaW5pc3RyYXRvcnMgb3IgdXNlcnMgY2FuIGFycmFuZ2UKKyAgICAgICAgICAgIGZvciB0aGVzZSBzZXJ2aWNlIGZpbGVzIHRvIGJlIHJlYWQgYnkgc2V0dGluZyBYREdfREFUQV9ESVJTIG9yIGJ5CisgICAgICAgICAgICBzeW1saW5raW5nIHRoZW0gaW50byB0aGUgZGVmYXVsdCBsb2NhdGlvbnMuCisgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Q0PgorICAgICAgPC9zZWN0Mz4KKyAgICAgIDxzZWN0MyBpZD0ibWVzc2FnZS1idXMtdHlwZXMtc3lzdGVtIj4KKyAgICAgICAgPHRpdGxlPlN5c3RlbSBtZXNzYWdlIGJ1czwvdGl0bGU+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEEgY29tcHV0ZXIgbWF5IGhhdmUgYSA8Zmlyc3R0ZXJtPnN5c3RlbSBtZXNzYWdlIGJ1czwvZmlyc3R0ZXJtPiwKKyAgICAgICAgICBhY2Nlc3NpYmxlIHRvIGFsbCBhcHBsaWNhdGlvbnMgb24gdGhlIHN5c3RlbS4gVGhpcyBtZXNzYWdlIGJ1cyBtYXkgYmUKKyAgICAgICAgICB1c2VkIHRvIGJyb2FkY2FzdCBzeXN0ZW0gZXZlbnRzLCBzdWNoIGFzIGFkZGluZyBuZXcgaGFyZHdhcmUgZGV2aWNlcywKKyAgICAgICAgICBjaGFuZ2VzIGluIHRoZSBwcmludGVyIHF1ZXVlLCBhbmQgc28gZm9ydGguCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgVGhlIGFkZHJlc3Mgb2YgdGhlIHN5c3RlbSBtZXNzYWdlIGJ1cyBpcyBnaXZlbgorICAgICAgICAgIGluIHRoZSA8bGl0ZXJhbD5EQlVTX1NZU1RFTV9CVVNfQUREUkVTUzwvbGl0ZXJhbD4gZW52aXJvbm1lbnQKKyAgICAgICAgICB2YXJpYWJsZS4gSWYgdGhhdCB2YXJpYWJsZSBpcyBub3Qgc2V0LCBhcHBsaWNhdGlvbnMgc2hvdWxkIHRyeQorICAgICAgICAgIHRvIGNvbm5lY3QgdG8gdGhlIHdlbGwta25vd24gYWRkcmVzcworICAgICAgICAgIDxsaXRlcmFsPnVuaXg6cGF0aD0vdmFyL3J1bi9kYnVzL3N5c3RlbV9idXNfc29ja2V0PC9saXRlcmFsPi4KKyAgICAgICAgICA8Zm9vdG5vdGU+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgVGhlIEQtQnVzIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBhY3R1YWxseSBob25vcnMgdGhlCisgICAgICAgICAgICAgIDxsaXRlcmFsPiQobG9jYWxzdGF0ZWRpcik8L2xpdGVyYWw+IGNvbmZpZ3VyZSBvcHRpb24KKyAgICAgICAgICAgICAgZm9yIHRoaXMgYWRkcmVzcywgb24gYm90aCBjbGllbnQgYW5kIHNlcnZlciBzaWRlLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgIDwvZm9vdG5vdGU+CisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgT24gVW5peCBzeXN0ZW1zLCB0aGUgc3lzdGVtIGJ1cyBzaG91bGQgZGVmYXVsdCB0byBzZWFyY2hpbmcKKyAgICAgICAgICBmb3IgLnNlcnZpY2UgZmlsZXMgaW4KKyAgICAgICAgICA8bGl0ZXJhbD4vdXNyL2xvY2FsL3NoYXJlL2RidXMtMS9zeXN0ZW0tc2VydmljZXM8L2xpdGVyYWw+LAorICAgICAgICAgIDxsaXRlcmFsPi91c3Ivc2hhcmUvZGJ1cy0xL3N5c3RlbS1zZXJ2aWNlczwvbGl0ZXJhbD4gYW5kCisgICAgICAgICAgPGxpdGVyYWw+L2xpYi9kYnVzLTEvc3lzdGVtLXNlcnZpY2VzPC9saXRlcmFsPiwgd2l0aCB0aGF0IG9yZGVyCisgICAgICAgICAgb2YgcHJlY2VkZW5jZS4gSXQgbWF5IGFsc28gc2VhcmNoIG90aGVyIGltcGxlbWVudGF0aW9uLXNwZWNpZmljCisgICAgICAgICAgbG9jYXRpb25zLCBidXQgc2hvdWxkIG5vdCB2YXJ5IHRoZXNlIGxvY2F0aW9ucyBiYXNlZCBvbiBlbnZpcm9ubWVudAorICAgICAgICAgIHZhcmlhYmxlcy4KKyAgICAgICAgICA8Zm9vdG5vdGU+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgVGhlIHN5c3RlbSBidXMgaXMgc2VjdXJpdHktc2Vuc2l0aXZlIGFuZCBpcyB0eXBpY2FsbHkgZXhlY3V0ZWQKKyAgICAgICAgICAgICAgYnkgYW4gaW5pdCBzeXN0ZW0gd2l0aCBhIGNsZWFuIGVudmlyb25tZW50LiBJdHMgbGF1bmNoIGhlbHBlcgorICAgICAgICAgICAgICBwcm9jZXNzIGlzIHBhcnRpY3VsYXJseSBzZWN1cml0eS1zZW5zaXRpdmUsIGFuZCBzcGVjaWZpY2FsbHkKKyAgICAgICAgICAgICAgY2xlYXJzIGl0cyBvd24gZW52aXJvbm1lbnQuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgPC9mb290bm90ZT4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBTb2Z0d2FyZSBwYWNrYWdlcyBzaG91bGQgaW5zdGFsbCB0aGVpciBzeXN0ZW0gLnNlcnZpY2UKKyAgICAgICAgICBmaWxlcyB0byB0aGVpciBjb25maWd1cmVkCisgICAgICAgICAgPGxpdGVyYWw+JHtkYXRhZGlyfS9kYnVzLTEvc3lzdGVtLXNlcnZpY2VzPC9saXRlcmFsPiwKKyAgICAgICAgICB3aGVyZSA8bGl0ZXJhbD4ke2RhdGFkaXJ9PC9saXRlcmFsPiBpcyBhcyBkZWZpbmVkIGJ5IHRoZSBHTlUKKyAgICAgICAgICBjb2Rpbmcgc3RhbmRhcmRzLiBTeXN0ZW0gYWRtaW5pc3RyYXRvcnMgY2FuIGFycmFuZ2UKKyAgICAgICAgICBmb3IgdGhlc2Ugc2VydmljZSBmaWxlcyB0byBiZSByZWFkIGJ5IGVkaXRpbmcgdGhlIHN5c3RlbSBidXMnCisgICAgICAgICAgY29uZmlndXJhdGlvbiBmaWxlIG9yIGJ5IHN5bWxpbmtpbmcgdGhlbSBpbnRvIHRoZSBkZWZhdWx0CisgICAgICAgICAgbG9jYXRpb25zLgorICAgICAgICA8L3BhcmE+CisgICAgICA8L3NlY3QzPgorICAgIDwvc2VjdDI+CisKKyAgICA8c2VjdDIgaWQ9Im1lc3NhZ2UtYnVzLW1lc3NhZ2VzIj4KKyAgICAgIDx0aXRsZT5NZXNzYWdlIEJ1cyBNZXNzYWdlczwvdGl0bGU+CisgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIHNwZWNpYWwgbWVzc2FnZSBidXMgbmFtZSA8bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuREJ1czwvbGl0ZXJhbD4KKyAgICAgICAgcmVzcG9uZHMgdG8gYSBudW1iZXIgb2YgYWRkaXRpb25hbCBtZXNzYWdlcyBhdCB0aGUgb2JqZWN0IHBhdGgKKyAgICAgICAgPGxpdGVyYWw+L29yZy9mcmVlZGVza3RvcC9EQnVzPC9saXRlcmFsPi4KKyAgICAgICAgVGhhdCBvYmplY3QgcGF0aCBpcyBhbHNvIHVzZWQgd2hlbiBlbWl0dGluZyB0aGUKKyAgICAgICAgPHhyZWYgbGlua2VuZD0nYnVzLW1lc3NhZ2VzLW5hbWUtb3duZXItY2hhbmdlZCcvPiBzaWduYWwuCisgICAgICA8L3BhcmE+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBGb3IgaGlzdG9yaWNhbCByZWFzb25zLCBzb21lIG9mIHRoZSBtZXRob2RzIGluIHRoZQorICAgICAgICA8bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuREJ1czwvbGl0ZXJhbD4gaW50ZXJmYWNlIGFyZSBhdmFpbGFibGUKKyAgICAgICAgb24gbXVsdGlwbGUgb2JqZWN0IHBhdGhzLiBNZXNzYWdlIGJ1cyBpbXBsZW1lbnRhdGlvbnMgc2hvdWxkCisgICAgICAgIGFjY2VwdCBtZXRob2QgY2FsbHMgdGhhdCB3ZXJlIGFkZGVkIGJlZm9yZSBzcGVjaWZpY2F0aW9uIHZlcnNpb24KKyAgICAgICAgMC4yNiBvbiBhbnkgb2JqZWN0IHBhdGguIE1lc3NhZ2UgYnVzIGltcGxlbWVudGF0aW9ucyBzaG91bGQKKyAgICAgICAgbm90IGFjY2VwdCBuZXdlciBtZXRob2QgY2FsbHMgb24gdW5leHBlY3RlZCBvYmplY3QgcGF0aHMsCisgICAgICAgIGFuZCBhcyBhIHNlY3VyaXR5IGhhcmRlbmluZyBtZWFzdXJlLCBvbGRlciBtZXRob2QgY2FsbHMKKyAgICAgICAgdGhhdCBhcmUgc2VjdXJpdHktc2Vuc2l0aXZlIG1heSBiZSByZWplY3RlZCB3aXRoIHRoZSBlcnJvcgorICAgICAgICA8bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuREJ1cy5FcnJvci5BY2Nlc3NEZW5pZWQ8L2xpdGVyYWw+IHdoZW4KKyAgICAgICAgY2FsbGVkIG9uIGFuIHVuZXhwZWN0ZWQgb2JqZWN0IHBhdGguIENsaWVudCBzb2Z0d2FyZSBzaG91bGQgc2VuZAorICAgICAgICBhbGwgbWV0aG9kIGNhbGxzIHRvIDxsaXRlcmFsPi9vcmcvZnJlZWRlc2t0b3AvREJ1czwvbGl0ZXJhbD4KKyAgICAgICAgaW5zdGVhZCBvZiByZWx5aW5nIG9uIHRoaXMuCisgICAgICA8L3BhcmE+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBJbiBhZGRpdGlvbiB0byB0aGUgbWV0aG9kIGNhbGxzIGxpc3RlZCBiZWxvdywgdGhlIG1lc3NhZ2UgYnVzCisgICAgICAgIHNob3VsZCBpbXBsZW1lbnQgdGhlIHN0YW5kYXJkIEludHJvc3BlY3RhYmxlLCBQcm9wZXJ0aWVzIGFuZCBQZWVyCisgICAgICAgIGludGVyZmFjZXMgKHNlZSA8eHJlZiBsaW5rZW5kPSJzdGFuZGFyZC1pbnRlcmZhY2VzIi8+KS4KKyAgICAgICAgU3VwcG9ydCBmb3IgdGhlIFByb3BlcnRpZXMgYW5kIFBlZXIgaW50ZXJmYWNlcyB3YXMgYWRkZWQgaW4gdmVyc2lvbgorICAgICAgICAxLjExLnggb2YgdGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbWVzc2FnZSBidXMuCisgICAgICA8L3BhcmE+CisKKyAgICAgIDxzZWN0MyBpZD0iYnVzLW1lc3NhZ2VzLWhlbGxvIj4KKyAgICAgICAgPHRpdGxlPjxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzLkhlbGxvPC9saXRlcmFsPjwvdGl0bGU+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEFzIGEgbWV0aG9kOgorICAgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIFNUUklORyBIZWxsbyAoKQorICAgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgUmVwbHkgYXJndW1lbnRzOgorICAgICAgICAgIDxpbmZvcm1hbHRhYmxlPgorICAgICAgICAgICAgPHRncm91cCBjb2xzPSIzIj4KKyAgICAgICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+QXJndW1lbnQ8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlR5cGU8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkRlc2NyaXB0aW9uPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPC90aGVhZD4KKyAgICAgICAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+MDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+U1RSSU5HPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5VbmlxdWUgbmFtZSBhc3NpZ25lZCB0byB0aGUgY29ubmVjdGlvbjwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDwvdGJvZHk+CisgICAgICAgICAgICA8L3Rncm91cD4KKyAgICAgICAgICA8L2luZm9ybWFsdGFibGU+CisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgQmVmb3JlIGFuIGFwcGxpY2F0aW9uIGlzIGFibGUgdG8gc2VuZCBtZXNzYWdlcyB0byBvdGhlciBhcHBsaWNhdGlvbnMKKyAgICAgICAgICBpdCBtdXN0IHNlbmQgdGhlIDxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzLkhlbGxvPC9saXRlcmFsPiBtZXNzYWdlCisgICAgICAgICAgdG8gdGhlIG1lc3NhZ2UgYnVzIHRvIG9idGFpbiBhIHVuaXF1ZSBuYW1lLiBJZiBhbiBhcHBsaWNhdGlvbiB3aXRob3V0CisgICAgICAgICAgYSB1bmlxdWUgbmFtZSB0cmllcyB0byBzZW5kIGEgbWVzc2FnZSB0byBhbm90aGVyIGFwcGxpY2F0aW9uLCBvciBhCisgICAgICAgICAgbWVzc2FnZSB0byB0aGUgbWVzc2FnZSBidXMgaXRzZWxmIHRoYXQgaXNuJ3QgdGhlCisgICAgICAgICAgPGxpdGVyYWw+b3JnLmZyZWVkZXNrdG9wLkRCdXMuSGVsbG88L2xpdGVyYWw+IG1lc3NhZ2UsIGl0IHdpbGwgYmUKKyAgICAgICAgICBkaXNjb25uZWN0ZWQgZnJvbSB0aGUgYnVzLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIFRoZXJlIGlzIG5vIGNvcnJlc3BvbmRpbmcgImRpc2Nvbm5lY3QiIHJlcXVlc3Q7IGlmIGEgY2xpZW50IHdpc2hlcyB0bworICAgICAgICAgIGRpc2Nvbm5lY3QgZnJvbSB0aGUgYnVzLCBpdCBzaW1wbHkgY2xvc2VzIHRoZSBzb2NrZXQgKG9yIG90aGVyCisgICAgICAgICAgY29tbXVuaWNhdGlvbiBjaGFubmVsKS4KKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9zZWN0Mz4KKworICAgICAgPHNlY3QzIGlkPSJidXMtbWVzc2FnZXMtcmVxdWVzdC1uYW1lIj4KKyAgICAgICAgPHRpdGxlPjxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzLlJlcXVlc3ROYW1lPC9saXRlcmFsPjwvdGl0bGU+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEFzIGEgbWV0aG9kOgorICAgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIFVJTlQzMiBSZXF1ZXN0TmFtZSAoaW4gU1RSSU5HIG5hbWUsIGluIFVJTlQzMiBmbGFncykKKyAgICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgIE1lc3NhZ2UgYXJndW1lbnRzOgorICAgICAgICAgIDxpbmZvcm1hbHRhYmxlPgorICAgICAgICAgICAgPHRncm91cCBjb2xzPSIzIj4KKyAgICAgICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+QXJndW1lbnQ8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlR5cGU8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkRlc2NyaXB0aW9uPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPC90aGVhZD4KKyAgICAgICAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+MDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+U1RSSU5HPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5OYW1lIHRvIHJlcXVlc3Q8L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+MTwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+VUlOVDMyPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5GbGFnczwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDwvdGJvZHk+CisgICAgICAgICAgICA8L3Rncm91cD4KKyAgICAgICAgICA8L2luZm9ybWFsdGFibGU+CisgICAgICAgICAgUmVwbHkgYXJndW1lbnRzOgorICAgICAgICAgIDxpbmZvcm1hbHRhYmxlPgorICAgICAgICAgICAgPHRncm91cCBjb2xzPSIzIj4KKyAgICAgICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+QXJndW1lbnQ8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlR5cGU8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkRlc2NyaXB0aW9uPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPC90aGVhZD4KKyAgICAgICAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+MDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+VUlOVDMyPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5SZXR1cm4gdmFsdWU8L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8L3Rib2R5PgorICAgICAgICAgICAgPC90Z3JvdXA+CisgICAgICAgICAgPC9pbmZvcm1hbHRhYmxlPgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEFzayB0aGUgbWVzc2FnZSBidXMgdG8gYXNzaWduIHRoZSBnaXZlbiBuYW1lIHRvIHRoZSBtZXRob2QgY2FsbGVyLiBFYWNoCisgICAgICAgICAgbmFtZSBtYWludGFpbnMgYSBxdWV1ZSBvZiBwb3NzaWJsZSBvd25lcnMsIHdoZXJlIHRoZSBoZWFkIG9mIHRoZSBxdWV1ZSBpcworICAgICAgICAgIHRoZSBwcmltYXJ5IG9yIGN1cnJlbnQgb3duZXIgb2YgdGhlIG5hbWUuIEVhY2ggcG90ZW50aWFsIG93bmVyIGluIHRoZQorICAgICAgICAgIHF1ZXVlIG1haW50YWlucyB0aGUgREJVU19OQU1FX0ZMQUdfQUxMT1dfUkVQTEFDRU1FTlQgYW5kCisgICAgICAgICAgREJVU19OQU1FX0ZMQUdfRE9fTk9UX1FVRVVFIHNldHRpbmdzIGZyb20gaXRzIGxhdGVzdCBSZXF1ZXN0TmFtZSBjYWxsLgorICAgICAgICAgIFdoZW4gUmVxdWVzdE5hbWUgaXMgaW52b2tlZCB0aGUgZm9sbG93aW5nIG9jY3VyczoKKyAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBJZiB0aGUgbWV0aG9kIGNhbGxlciBpcyBjdXJyZW50bHkgdGhlIHByaW1hcnkgb3duZXIgb2YgdGhlIG5hbWUsCisgICAgICAgICAgICAgICAgdGhlIERCVVNfTkFNRV9GTEFHX0FMTE9XX1JFUExBQ0VNRU5UIGFuZCBEQlVTX05BTUVfRkxBR19ET19OT1RfUVVFVUUKKyAgICAgICAgICAgICAgICB2YWx1ZXMgYXJlIHVwZGF0ZWQgd2l0aCB0aGUgdmFsdWVzIGZyb20gdGhlIG5ldyBSZXF1ZXN0TmFtZSBjYWxsLAorICAgICAgICAgICAgICAgIGFuZCBub3RoaW5nIGZ1cnRoZXIgaGFwcGVucy4KKyAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKworICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBJZiB0aGUgY3VycmVudCBwcmltYXJ5IG93bmVyIChoZWFkIG9mIHRoZSBxdWV1ZSkgaGFzCisgICAgICAgICAgICAgICAgREJVU19OQU1FX0ZMQUdfQUxMT1dfUkVQTEFDRU1FTlQgc2V0LCBhbmQgdGhlIFJlcXVlc3ROYW1lCisgICAgICAgICAgICAgICAgaW52b2NhdGlvbiBoYXMgdGhlIERCVVNfTkFNRV9GTEFHX1JFUExBQ0VfRVhJU1RJTkcgZmxhZywgdGhlbgorICAgICAgICAgICAgICAgIHRoZSBjYWxsZXIgb2YgUmVxdWVzdE5hbWUgcmVwbGFjZXMgdGhlIGN1cnJlbnQgcHJpbWFyeSBvd25lciBhdAorICAgICAgICAgICAgICAgIHRoZSBoZWFkIG9mIHRoZSBxdWV1ZSBhbmQgdGhlIGN1cnJlbnQgcHJpbWFyeSBvd25lciBtb3ZlcyB0byB0aGUKKyAgICAgICAgICAgICAgICBzZWNvbmQgcG9zaXRpb24gaW4gdGhlIHF1ZXVlLiBJZiB0aGUgY2FsbGVyIG9mIFJlcXVlc3ROYW1lIHdhcworICAgICAgICAgICAgICAgIGluIHRoZSBxdWV1ZSBwcmV2aW91c2x5IGl0cyBmbGFncyBhcmUgdXBkYXRlZCB3aXRoIHRoZSB2YWx1ZXMgZnJvbQorICAgICAgICAgICAgICAgIHRoZSBuZXcgUmVxdWVzdE5hbWUgaW4gYWRkaXRpb24gdG8gbW92aW5nIGl0IHRvIHRoZSBoZWFkIG9mIHRoZSBxdWV1ZS4KKyAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9saXN0aXRlbT4KKworICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBJZiByZXBsYWNlbWVudCBpcyBub3QgcG9zc2libGUsIGFuZCB0aGUgbWV0aG9kIGNhbGxlciBpcworICAgICAgICAgICAgICAgIGN1cnJlbnRseSBpbiB0aGUgcXVldWUgYnV0IG5vdCB0aGUgcHJpbWFyeSBvd25lciwgaXRzIGZsYWdzIGFyZQorICAgICAgICAgICAgICAgIHVwZGF0ZWQgd2l0aCB0aGUgdmFsdWVzIGZyb20gdGhlIG5ldyBSZXF1ZXN0TmFtZSBjYWxsLgorICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorCisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIElmIHJlcGxhY2VtZW50IGlzIG5vdCBwb3NzaWJsZSwgYW5kIHRoZSBtZXRob2QgY2FsbGVyIGlzCisgICAgICAgICAgICAgICAgY3VycmVudGx5IG5vdCBpbiB0aGUgcXVldWUsIHRoZSBtZXRob2QgY2FsbGVyIGlzIGFwcGVuZGVkIHRvIHRoZQorICAgICAgICAgICAgICAgIHF1ZXVlLgorICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorCisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIElmIGFueSBjb25uZWN0aW9uIGluIHRoZSBxdWV1ZSBoYXMgREJVU19OQU1FX0ZMQUdfRE9fTk9UX1FVRVVFCisgICAgICAgICAgICAgICAgc2V0IGFuZCBpcyBub3QgdGhlIHByaW1hcnkgb3duZXIsIGl0IGlzIHJlbW92ZWQgZnJvbSB0aGUKKyAgICAgICAgICAgICAgICBxdWV1ZS4gVGhpcyBjYW4gYXBwbHkgdG8gdGhlIHByZXZpb3VzIHByaW1hcnkgb3duZXIgKGlmIGl0CisgICAgICAgICAgICAgICAgd2FzIHJlcGxhY2VkKSBvciB0aGUgbWV0aG9kIGNhbGxlciAoaWYgaXQgdXBkYXRlZCB0aGUKKyAgICAgICAgICAgICAgICBEQlVTX05BTUVfRkxBR19ET19OT1RfUVVFVUUgZmxhZyB3aGlsZSBzdGlsbCBzdHVjayBpbiB0aGUKKyAgICAgICAgICAgICAgICBxdWV1ZSwgb3IgaWYgaXQgd2FzIGp1c3QgYWRkZWQgdG8gdGhlIHF1ZXVlIHdpdGggdGhhdCBmbGFnIHNldCkuCisgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgTm90ZSB0aGF0IERCVVNfTkFNRV9GTEFHX1JFUExBQ0VfRVhJU1RJTkcgcmVzdWx0cyBpbiAianVtcGluZyB0aGUKKyAgICAgICAgICBxdWV1ZSwiIGV2ZW4gaWYgYW5vdGhlciBhcHBsaWNhdGlvbiBhbHJlYWR5IGluIHRoZSBxdWV1ZSBoYWQgc3BlY2lmaWVkCisgICAgICAgICAgREJVU19OQU1FX0ZMQUdfUkVQTEFDRV9FWElTVElORy4gIFRoaXMgY29tZXMgdXAgaWYgYSBwcmltYXJ5IG93bmVyCisgICAgICAgICAgdGhhdCBkb2VzIG5vdCBhbGxvdyByZXBsYWNlbWVudCBnb2VzIGF3YXksIGFuZCB0aGUgbmV4dCBwcmltYXJ5IG93bmVyCisgICAgICAgICAgZG9lcyBhbGxvdyByZXBsYWNlbWVudC4gSW4gdGhpcyBjYXNlLCBxdWV1ZWQgaXRlbXMgdGhhdCBzcGVjaWZpZWQKKyAgICAgICAgICBEQlVTX05BTUVfRkxBR19SRVBMQUNFX0VYSVNUSU5HIDxlbXBoYXNpcz5kbyBub3Q8L2VtcGhhc2lzPgorICAgICAgICAgIGF1dG9tYXRpY2FsbHkgcmVwbGFjZSB0aGUgbmV3IHByaW1hcnkgb3duZXIuIEluIG90aGVyIHdvcmRzLAorICAgICAgICAgIERCVVNfTkFNRV9GTEFHX1JFUExBQ0VfRVhJU1RJTkcgaXMgbm90IHNhdmVkLCBpdCBpcyBvbmx5IHVzZWQgYXQgdGhlCisgICAgICAgICAgdGltZSBSZXF1ZXN0TmFtZSBpcyBjYWxsZWQuIFRoaXMgaXMgZGVsaWJlcmF0ZSB0byBhdm9pZCBhbiBpbmZpbml0ZSBsb29wCisgICAgICAgICAgYW55dGltZSB0d28gYXBwbGljYXRpb25zIGFyZSBib3RoIERCVVNfTkFNRV9GTEFHX0FMTE9XX1JFUExBQ0VNRU5UCisgICAgICAgICAgYW5kIERCVVNfTkFNRV9GTEFHX1JFUExBQ0VfRVhJU1RJTkcuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgVGhlIGZsYWdzIGFyZ3VtZW50IGNvbnRhaW5zIGFueSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcyBsb2dpY2FsbHkgT1JlZAorICAgICAgICAgIHRvZ2V0aGVyOgorCisgICAgICAgICAgPGluZm9ybWFsdGFibGU+CisgICAgICAgICAgICA8dGdyb3VwIGNvbHM9IjMiPgorICAgICAgICAgICAgICA8dGhlYWQ+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5Db252ZW50aW9uYWwgTmFtZTwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+VmFsdWU8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkRlc2NyaXB0aW9uPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPC90aGVhZD4KKyAgICAgICAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+REJVU19OQU1FX0ZMQUdfQUxMT1dfUkVQTEFDRU1FTlQ8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjB4MTwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+CisKKyAgICAgICAgICAgICAgICAgICAgSWYgYW4gYXBwbGljYXRpb24gQSBzcGVjaWZpZXMgdGhpcyBmbGFnIGFuZCBzdWNjZWVkcyBpbgorICAgICAgICAgICAgICAgICAgICBiZWNvbWluZyB0aGUgb3duZXIgb2YgdGhlIG5hbWUsIGFuZCBhbm90aGVyIGFwcGxpY2F0aW9uIEIKKyAgICAgICAgICAgICAgICAgICAgbGF0ZXIgY2FsbHMgUmVxdWVzdE5hbWUgd2l0aCB0aGUKKyAgICAgICAgICAgICAgICAgICAgREJVU19OQU1FX0ZMQUdfUkVQTEFDRV9FWElTVElORyBmbGFnLCB0aGVuIGFwcGxpY2F0aW9uIEEKKyAgICAgICAgICAgICAgICAgICAgd2lsbCBsb3NlIG93bmVyc2hpcCBhbmQgcmVjZWl2ZSBhCisgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzLk5hbWVMb3N0PC9saXRlcmFsPiBzaWduYWwsIGFuZAorICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiBCIHdpbGwgYmVjb21lIHRoZSBuZXcgb3duZXIuIElmIERCVVNfTkFNRV9GTEFHX0FMTE9XX1JFUExBQ0VNRU5UCisgICAgICAgICAgICAgICAgICAgIGlzIG5vdCBzcGVjaWZpZWQgYnkgYXBwbGljYXRpb24gQSwgb3IgREJVU19OQU1FX0ZMQUdfUkVQTEFDRV9FWElTVElORworICAgICAgICAgICAgICAgICAgICBpcyBub3Qgc3BlY2lmaWVkIGJ5IGFwcGxpY2F0aW9uIEIsIHRoZW4gYXBwbGljYXRpb24gQiB3aWxsIG5vdCByZXBsYWNlCisgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIEEgYXMgdGhlIG93bmVyLgorCisgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+REJVU19OQU1FX0ZMQUdfUkVQTEFDRV9FWElTVElORzwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+MHgyPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT4KKworICAgICAgICAgICAgICAgICAgICBUcnkgdG8gcmVwbGFjZSB0aGUgY3VycmVudCBvd25lciBpZiB0aGVyZSBpcyBvbmUuIElmIHRoaXMKKyAgICAgICAgICAgICAgICAgICAgZmxhZyBpcyBub3Qgc2V0IHRoZSBhcHBsaWNhdGlvbiB3aWxsIG9ubHkgYmVjb21lIHRoZSBvd25lciBvZgorICAgICAgICAgICAgICAgICAgICB0aGUgbmFtZSBpZiB0aGVyZSBpcyBubyBjdXJyZW50IG93bmVyLiBJZiB0aGlzIGZsYWcgaXMgc2V0LAorICAgICAgICAgICAgICAgICAgICB0aGUgYXBwbGljYXRpb24gd2lsbCByZXBsYWNlIHRoZSBjdXJyZW50IG93bmVyIGlmCisgICAgICAgICAgICAgICAgICAgIHRoZSBjdXJyZW50IG93bmVyIHNwZWNpZmllZCBEQlVTX05BTUVfRkxBR19BTExPV19SRVBMQUNFTUVOVC4KKworICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkRCVVNfTkFNRV9GTEFHX0RPX05PVF9RVUVVRTwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+MHg0PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT4KKworICAgICAgICAgICAgICAgICAgICBXaXRob3V0IHRoaXMgZmxhZywgaWYgYW4gYXBwbGljYXRpb24gcmVxdWVzdHMgYSBuYW1lIHRoYXQgaXMKKyAgICAgICAgICAgICAgICAgICAgYWxyZWFkeSBvd25lZCwgdGhlIGFwcGxpY2F0aW9uIHdpbGwgYmUgcGxhY2VkIGluIGEgcXVldWUgdG8KKyAgICAgICAgICAgICAgICAgICAgb3duIHRoZSBuYW1lIHdoZW4gdGhlIGN1cnJlbnQgb3duZXIgZ2l2ZXMgaXQgdXAuIElmIHRoaXMKKyAgICAgICAgICAgICAgICAgICAgZmxhZyBpcyBnaXZlbiwgdGhlIGFwcGxpY2F0aW9uIHdpbGwgbm90IGJlIHBsYWNlZCBpbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgcXVldWUsIHRoZSByZXF1ZXN0IGZvciB0aGUgbmFtZSB3aWxsIHNpbXBseSBmYWlsLiAgVGhpcyBmbGFnCisgICAgICAgICAgICAgICAgICAgIGFsc28gYWZmZWN0cyBiZWhhdmlvciB3aGVuIGFuIGFwcGxpY2F0aW9uIGlzIHJlcGxhY2VkIGFzCisgICAgICAgICAgICAgICAgICAgIG5hbWUgb3duZXI7IGJ5IGRlZmF1bHQgdGhlIGFwcGxpY2F0aW9uIG1vdmVzIGJhY2sgaW50byB0aGUKKyAgICAgICAgICAgICAgICAgICAgd2FpdGluZyBxdWV1ZSwgdW5sZXNzIHRoaXMgZmxhZyB3YXMgcHJvdmlkZWQgd2hlbiB0aGUgYXBwbGljYXRpb24KKyAgICAgICAgICAgICAgICAgICAgYmVjYW1lIHRoZSBuYW1lIG93bmVyLgorCisgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8L3Rib2R5PgorICAgICAgICAgICAgPC90Z3JvdXA+CisgICAgICAgICAgPC9pbmZvcm1hbHRhYmxlPgorCisgICAgICAgICAgVGhlIHJldHVybiBjb2RlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisKKyAgICAgICAgICA8aW5mb3JtYWx0YWJsZT4KKyAgICAgICAgICAgIDx0Z3JvdXAgY29scz0iMyI+CisgICAgICAgICAgICAgIDx0aGVhZD4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkNvbnZlbnRpb25hbCBOYW1lPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5WYWx1ZTwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+RGVzY3JpcHRpb248L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgICAgICA8dGJvZHk+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5EQlVTX1JFUVVFU1RfTkFNRV9SRVBMWV9QUklNQVJZX09XTkVSPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT4xPC9lbnRyeT4gPGVudHJ5PlRoZSBjYWxsZXIgaXMgbm93IHRoZSBwcmltYXJ5IG93bmVyIG9mCisgICAgICAgICAgICAgICAgICB0aGUgbmFtZSwgcmVwbGFjaW5nIGFueSBwcmV2aW91cyBvd25lci4gRWl0aGVyIHRoZSBuYW1lIGhhZCBubworICAgICAgICAgICAgICAgICAgb3duZXIgYmVmb3JlLCBvciB0aGUgY2FsbGVyIHNwZWNpZmllZAorICAgICAgICAgICAgICAgICAgREJVU19OQU1FX0ZMQUdfUkVQTEFDRV9FWElTVElORyBhbmQgdGhlIGN1cnJlbnQgb3duZXIgc3BlY2lmaWVkCisgICAgICAgICAgICAgICAgICBEQlVTX05BTUVfRkxBR19BTExPV19SRVBMQUNFTUVOVC48L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+REJVU19SRVFVRVNUX05BTUVfUkVQTFlfSU5fUVVFVUU8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjI8L2VudHJ5PgorCisgICAgICAgICAgICAgICAgICA8ZW50cnk+VGhlIG5hbWUgYWxyZWFkeSBoYWQgYW4gb3duZXIsCisgICAgICAgICAgICAgICAgICAgIERCVVNfTkFNRV9GTEFHX0RPX05PVF9RVUVVRSB3YXMgbm90IHNwZWNpZmllZCwgYW5kIGVpdGhlcgorICAgICAgICAgICAgICAgICAgICB0aGUgY3VycmVudCBvd25lciBkaWQgbm90IHNwZWNpZnkKKyAgICAgICAgICAgICAgICAgICAgREJVU19OQU1FX0ZMQUdfQUxMT1dfUkVQTEFDRU1FTlQgb3IgdGhlIHJlcXVlc3RpbmcKKyAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb24gZGlkIG5vdCBzcGVjaWZ5IERCVVNfTkFNRV9GTEFHX1JFUExBQ0VfRVhJU1RJTkcuCisgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5EQlVTX1JFUVVFU1RfTkFNRV9SRVBMWV9FWElTVFM8L2VudHJ5PiA8ZW50cnk+MzwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+VGhlIG5hbWUgYWxyZWFkeSBoYXMgYW4gb3duZXIsCisgICAgICAgICAgICAgICAgICBEQlVTX05BTUVfRkxBR19ET19OT1RfUVVFVUUgd2FzIHNwZWNpZmllZCwgYW5kIGVpdGhlcgorICAgICAgICAgICAgICAgICAgREJVU19OQU1FX0ZMQUdfQUxMT1dfUkVQTEFDRU1FTlQgd2FzIG5vdCBzcGVjaWZpZWQgYnkgdGhlCisgICAgICAgICAgICAgICAgICBjdXJyZW50IG93bmVyLCBvciBEQlVTX05BTUVfRkxBR19SRVBMQUNFX0VYSVNUSU5HIHdhcyBub3QKKyAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCBieSB0aGUgcmVxdWVzdGluZyBhcHBsaWNhdGlvbi48L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+REJVU19SRVFVRVNUX05BTUVfUkVQTFlfQUxSRUFEWV9PV05FUjwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+NDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+VGhlIGFwcGxpY2F0aW9uIHRyeWluZyB0byByZXF1ZXN0IG93bmVyc2hpcCBvZiBhIG5hbWUgaXMgYWxyZWFkeSB0aGUgb3duZXIgb2YgaXQuPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPC90Ym9keT4KKyAgICAgICAgICAgIDwvdGdyb3VwPgorICAgICAgICAgIDwvaW5mb3JtYWx0YWJsZT4KKyAgICAgICAgPC9wYXJhPgorICAgICAgIDwvc2VjdDM+CisKKyAgICAgICA8c2VjdDMgaWQ9ImJ1cy1tZXNzYWdlcy1yZWxlYXNlLW5hbWUiPgorICAgICAgICA8dGl0bGU+PGxpdGVyYWw+b3JnLmZyZWVkZXNrdG9wLkRCdXMuUmVsZWFzZU5hbWU8L2xpdGVyYWw+PC90aXRsZT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgQXMgYSBtZXRob2Q6CisgICAgICAgICAgPHByb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgVUlOVDMyIFJlbGVhc2VOYW1lIChpbiBTVFJJTkcgbmFtZSkKKyAgICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgIE1lc3NhZ2UgYXJndW1lbnRzOgorICAgICAgICAgIDxpbmZvcm1hbHRhYmxlPgorICAgICAgICAgICAgPHRncm91cCBjb2xzPSIzIj4KKyAgICAgICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+QXJndW1lbnQ8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlR5cGU8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkRlc2NyaXB0aW9uPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPC90aGVhZD4KKyAgICAgICAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+MDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+U1RSSU5HPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5OYW1lIHRvIHJlbGVhc2U8L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8L3Rib2R5PgorICAgICAgICAgICAgPC90Z3JvdXA+CisgICAgICAgICAgPC9pbmZvcm1hbHRhYmxlPgorICAgICAgICAgIFJlcGx5IGFyZ3VtZW50czoKKyAgICAgICAgICA8aW5mb3JtYWx0YWJsZT4KKyAgICAgICAgICAgIDx0Z3JvdXAgY29scz0iMyI+CisgICAgICAgICAgICAgIDx0aGVhZD4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkFyZ3VtZW50PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5UeXBlPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5EZXNjcmlwdGlvbjwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDwvdGhlYWQ+CisgICAgICAgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlVJTlQzMjwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+UmV0dXJuIHZhbHVlPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPC90Ym9keT4KKyAgICAgICAgICAgIDwvdGdyb3VwPgorICAgICAgICAgIDwvaW5mb3JtYWx0YWJsZT4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBBc2sgdGhlIG1lc3NhZ2UgYnVzIHRvIHJlbGVhc2UgdGhlIG1ldGhvZCBjYWxsZXIncyBjbGFpbSB0byB0aGUgZ2l2ZW4KKyAgICAgICAgICBuYW1lLiBJZiB0aGUgY2FsbGVyIGlzIHRoZSBwcmltYXJ5IG93bmVyLCBhIG5ldyBwcmltYXJ5IG93bmVyIHdpbGwgYmUKKyAgICAgICAgICBzZWxlY3RlZCBmcm9tIHRoZSBxdWV1ZSBpZiBhbnkgb3RoZXIgb3duZXJzIGFyZSB3YWl0aW5nLiBJZiB0aGUKKyAgICAgICAgICBjYWxsZXIgaXMgd2FpdGluZyBpbiB0aGUgcXVldWUgZm9yIHRoZSBuYW1lLCB0aGUgY2FsbGVyIHdpbGwgcmVtb3ZlZAorICAgICAgICAgIGZyb20gdGhlIHF1ZXVlIGFuZCB3aWxsIG5vdCBiZSBtYWRlIGFuIG93bmVyIG9mIHRoZSBuYW1lIGlmIGl0IGxhdGVyCisgICAgICAgICAgYmVjb21lcyBhdmFpbGFibGUuIElmIHRoZXJlIGFyZSBubyBvdGhlciBvd25lcnMgaW4gdGhlIHF1ZXVlIGZvciB0aGUKKyAgICAgICAgICBuYW1lLCBpdCB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgYnVzIGVudGlyZWx5LgorCisgICAgICAgICAgVGhlIHJldHVybiBjb2RlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisKKyAgICAgICAgICA8aW5mb3JtYWx0YWJsZT4KKyAgICAgICAgICAgIDx0Z3JvdXAgY29scz0iMyI+CisgICAgICAgICAgICAgIDx0aGVhZD4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkNvbnZlbnRpb25hbCBOYW1lPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5WYWx1ZTwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+RGVzY3JpcHRpb248L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgICAgICA8dGJvZHk+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5EQlVTX1JFTEVBU0VfTkFNRV9SRVBMWV9SRUxFQVNFRDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+MTwvZW50cnk+IDxlbnRyeT5UaGUgY2FsbGVyIGhhcyByZWxlYXNlZCBoaXMgY2xhaW0gb24KKyAgICAgICAgICAgICAgICAgIHRoZSBnaXZlbiBuYW1lLiBFaXRoZXIgdGhlIGNhbGxlciB3YXMgdGhlIHByaW1hcnkgb3duZXIgb2YKKyAgICAgICAgICAgICAgICAgIHRoZSBuYW1lLCBhbmQgdGhlIG5hbWUgaXMgbm93IHVudXNlZCBvciB0YWtlbiBieSBzb21lYm9keQorICAgICAgICAgICAgICAgICAgd2FpdGluZyBpbiB0aGUgcXVldWUgZm9yIHRoZSBuYW1lLCBvciB0aGUgY2FsbGVyIHdhcyB3YWl0aW5nCisgICAgICAgICAgICAgICAgICBpbiB0aGUgcXVldWUgZm9yIHRoZSBuYW1lIGFuZCBoYXMgbm93IGJlZW4gcmVtb3ZlZCBmcm9tIHRoZQorICAgICAgICAgICAgICAgICAgcXVldWUuPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkRCVVNfUkVMRUFTRV9OQU1FX1JFUExZX05PTl9FWElTVEVOVDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+MjwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+VGhlIGdpdmVuIG5hbWUgZG9lcyBub3QgZXhpc3Qgb24gdGhpcyBidXMuPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkRCVVNfUkVMRUFTRV9OQU1FX1JFUExZX05PVF9PV05FUjwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+MzwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+VGhlIGNhbGxlciB3YXMgbm90IHRoZSBwcmltYXJ5IG93bmVyIG9mIHRoaXMgbmFtZSwKKyAgICAgICAgICAgICAgICAgIGFuZCB3YXMgYWxzbyBub3Qgd2FpdGluZyBpbiB0aGUgcXVldWUgdG8gb3duIHRoaXMgbmFtZS48L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8L3Rib2R5PgorICAgICAgICAgICAgPC90Z3JvdXA+CisgICAgICAgICAgPC9pbmZvcm1hbHRhYmxlPgorICAgICAgICA8L3BhcmE+CisgICAgICAgPC9zZWN0Mz4KKworICAgICAgIDxzZWN0MyBpZD0iYnVzLW1lc3NhZ2VzLWxpc3QtcXVldWVkLW93bmVycyI+CisgICAgICAgIDx0aXRsZT48bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuREJ1cy5MaXN0UXVldWVkT3duZXJzPC9saXRlcmFsPjwvdGl0bGU+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEFzIGEgbWV0aG9kOgorICAgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIEFSUkFZIG9mIFNUUklORyBMaXN0UXVldWVkT3duZXJzIChpbiBTVFJJTkcgbmFtZSkKKyAgICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgIE1lc3NhZ2UgYXJndW1lbnRzOgorICAgICAgICAgIDxpbmZvcm1hbHRhYmxlPgorICAgICAgICAgICAgPHRncm91cCBjb2xzPSIzIj4KKyAgICAgICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+QXJndW1lbnQ8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlR5cGU8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkRlc2NyaXB0aW9uPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPC90aGVhZD4KKyAgICAgICAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+MDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+U1RSSU5HPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5UaGUgd2VsbC1rbm93biBidXMgbmFtZSB0byBxdWVyeSwgc3VjaCBhcworICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5jb20uZXhhbXBsZS5jYXBwdWNjaW5vPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDwvdGJvZHk+CisgICAgICAgICAgICA8L3Rncm91cD4KKyAgICAgICAgICA8L2luZm9ybWFsdGFibGU+CisgICAgICAgICAgUmVwbHkgYXJndW1lbnRzOgorICAgICAgICAgIDxpbmZvcm1hbHRhYmxlPgorICAgICAgICAgICAgPHRncm91cCBjb2xzPSIzIj4KKyAgICAgICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+QXJndW1lbnQ8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlR5cGU8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkRlc2NyaXB0aW9uPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPC90aGVhZD4KKyAgICAgICAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+MDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+QVJSQVkgb2YgU1RSSU5HPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5UaGUgdW5pcXVlIGJ1cyBuYW1lcyBvZiBjb25uZWN0aW9ucyBjdXJyZW50bHkgcXVldWVkCisgICAgICAgICAgICAgICAgICAgIGZvciB0aGUgbmFtZTwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDwvdGJvZHk+CisgICAgICAgICAgICA8L3Rncm91cD4KKyAgICAgICAgICA8L2luZm9ybWFsdGFibGU+CisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgTGlzdCB0aGUgY29ubmVjdGlvbnMgY3VycmVudGx5IHF1ZXVlZCBmb3IgYSBidXMgbmFtZSAoc2VlCisgICAgICAgICAgPHhyZWYgbGlua2VuZD0idGVybS1xdWV1ZWQtb3duZXIiLz4pLgorICAgICAgICA8L3BhcmE+CisgICAgICA8L3NlY3QzPgorCisgICAgICA8c2VjdDMgaWQ9ImJ1cy1tZXNzYWdlcy1saXN0LW5hbWVzIj4KKyAgICAgICAgPHRpdGxlPjxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzLkxpc3ROYW1lczwvbGl0ZXJhbD48L3RpdGxlPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBBcyBhIG1ldGhvZDoKKyAgICAgICAgICA8cHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICBBUlJBWSBvZiBTVFJJTkcgTGlzdE5hbWVzICgpCisgICAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICBSZXBseSBhcmd1bWVudHM6CisgICAgICAgICAgPGluZm9ybWFsdGFibGU+CisgICAgICAgICAgICA8dGdyb3VwIGNvbHM9IjMiPgorICAgICAgICAgICAgICA8dGhlYWQ+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5Bcmd1bWVudDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+VHlwZTwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+RGVzY3JpcHRpb248L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgICAgICA8dGJvZHk+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT4wPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5BUlJBWSBvZiBTVFJJTkc8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkFycmF5IG9mIHN0cmluZ3Mgd2hlcmUgZWFjaCBzdHJpbmcgaXMgYSBidXMgbmFtZTwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDwvdGJvZHk+CisgICAgICAgICAgICA8L3Rncm91cD4KKyAgICAgICAgICA8L2luZm9ybWFsdGFibGU+CisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgUmV0dXJucyBhIGxpc3Qgb2YgYWxsIGN1cnJlbnRseS1vd25lZCBuYW1lcyBvbiB0aGUgYnVzLgorICAgICAgICA8L3BhcmE+CisgICAgICA8L3NlY3QzPgorICAgICAgPHNlY3QzIGlkPSJidXMtbWVzc2FnZXMtbGlzdC1hY3RpdmF0YWJsZS1uYW1lcyI+CisgICAgICAgIDx0aXRsZT48bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuREJ1cy5MaXN0QWN0aXZhdGFibGVOYW1lczwvbGl0ZXJhbD48L3RpdGxlPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBBcyBhIG1ldGhvZDoKKyAgICAgICAgICA8cHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICBBUlJBWSBvZiBTVFJJTkcgTGlzdEFjdGl2YXRhYmxlTmFtZXMgKCkKKyAgICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgIFJlcGx5IGFyZ3VtZW50czoKKyAgICAgICAgICA8aW5mb3JtYWx0YWJsZT4KKyAgICAgICAgICAgIDx0Z3JvdXAgY29scz0iMyI+CisgICAgICAgICAgICAgIDx0aGVhZD4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkFyZ3VtZW50PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5UeXBlPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5EZXNjcmlwdGlvbjwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDwvdGhlYWQ+CisgICAgICAgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkFSUkFZIG9mIFNUUklORzwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+QXJyYXkgb2Ygc3RyaW5ncyB3aGVyZSBlYWNoIHN0cmluZyBpcyBhIGJ1cyBuYW1lPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPC90Ym9keT4KKyAgICAgICAgICAgIDwvdGdyb3VwPgorICAgICAgICAgIDwvaW5mb3JtYWx0YWJsZT4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgbmFtZXMgdGhhdCBjYW4gYmUgYWN0aXZhdGVkIG9uIHRoZSBidXMuCisgICAgICAgIDwvcGFyYT4KKyAgICAgIDwvc2VjdDM+CisgICAgICA8c2VjdDMgaWQ9ImJ1cy1tZXNzYWdlcy1uYW1lLWV4aXN0cyI+CisgICAgICAgIDx0aXRsZT48bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuREJ1cy5OYW1lSGFzT3duZXI8L2xpdGVyYWw+PC90aXRsZT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgQXMgYSBtZXRob2Q6CisgICAgICAgICAgPHByb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgQk9PTEVBTiBOYW1lSGFzT3duZXIgKGluIFNUUklORyBuYW1lKQorICAgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgTWVzc2FnZSBhcmd1bWVudHM6CisgICAgICAgICAgPGluZm9ybWFsdGFibGU+CisgICAgICAgICAgICA8dGdyb3VwIGNvbHM9IjMiPgorICAgICAgICAgICAgICA8dGhlYWQ+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5Bcmd1bWVudDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+VHlwZTwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+RGVzY3JpcHRpb248L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgICAgICA8dGJvZHk+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT4wPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5TVFJJTkc8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5Pk5hbWUgdG8gY2hlY2s8L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8L3Rib2R5PgorICAgICAgICAgICAgPC90Z3JvdXA+CisgICAgICAgICAgPC9pbmZvcm1hbHRhYmxlPgorICAgICAgICAgIFJlcGx5IGFyZ3VtZW50czoKKyAgICAgICAgICA8aW5mb3JtYWx0YWJsZT4KKyAgICAgICAgICAgIDx0Z3JvdXAgY29scz0iMyI+CisgICAgICAgICAgICAgIDx0aGVhZD4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkFyZ3VtZW50PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5UeXBlPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5EZXNjcmlwdGlvbjwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDwvdGhlYWQ+CisgICAgICAgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkJPT0xFQU48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlJldHVybiB2YWx1ZSwgdHJ1ZSBpZiB0aGUgbmFtZSBleGlzdHM8L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8L3Rib2R5PgorICAgICAgICAgICAgPC90Z3JvdXA+CisgICAgICAgICAgPC9pbmZvcm1hbHRhYmxlPgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIENoZWNrcyBpZiB0aGUgc3BlY2lmaWVkIG5hbWUgZXhpc3RzIChjdXJyZW50bHkgaGFzIGFuIG93bmVyKS4KKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9zZWN0Mz4KKworICAgICAgPHNlY3QzIGlkPSJidXMtbWVzc2FnZXMtbmFtZS1vd25lci1jaGFuZ2VkIj4KKyAgICAgICAgPHRpdGxlPjxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzLk5hbWVPd25lckNoYW5nZWQ8L2xpdGVyYWw+PC90aXRsZT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgVGhpcyBpcyBhIHNpZ25hbDoKKyAgICAgICAgICA8cHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICBOYW1lT3duZXJDaGFuZ2VkIChTVFJJTkcgbmFtZSwgU1RSSU5HIG9sZF9vd25lciwgU1RSSU5HIG5ld19vd25lcikKKyAgICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgIE1lc3NhZ2UgYXJndW1lbnRzOgorICAgICAgICAgIDxpbmZvcm1hbHRhYmxlPgorICAgICAgICAgICAgPHRncm91cCBjb2xzPSIzIj4KKyAgICAgICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+QXJndW1lbnQ8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlR5cGU8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkRlc2NyaXB0aW9uPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPC90aGVhZD4KKyAgICAgICAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+MDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+U1RSSU5HPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5OYW1lIHdpdGggYSBuZXcgb3duZXI8L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+MTwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+U1RSSU5HPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5PbGQgb3duZXIgb3IgZW1wdHkgc3RyaW5nIGlmIG5vbmU8L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+MjwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+U1RSSU5HPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5OZXcgb3duZXIgb3IgZW1wdHkgc3RyaW5nIGlmIG5vbmU8L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8L3Rib2R5PgorICAgICAgICAgICAgPC90Z3JvdXA+CisgICAgICAgICAgPC9pbmZvcm1hbHRhYmxlPgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIFRoaXMgc2lnbmFsIGluZGljYXRlcyB0aGF0IHRoZSBvd25lciBvZiBhIG5hbWUgaGFzIGNoYW5nZWQuCisgICAgICAgICAgSXQncyBhbHNvIHRoZSBzaWduYWwgdG8gdXNlIHRvIGRldGVjdCB0aGUgYXBwZWFyYW5jZSBvZgorICAgICAgICAgIG5ldyBuYW1lcyBvbiB0aGUgYnVzLgorICAgICAgICA8L3BhcmE+CisgICAgICA8L3NlY3QzPgorICAgICAgPHNlY3QzIGlkPSJidXMtbWVzc2FnZXMtbmFtZS1sb3N0Ij4KKyAgICAgICAgPHRpdGxlPjxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzLk5hbWVMb3N0PC9saXRlcmFsPjwvdGl0bGU+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIFRoaXMgaXMgYSBzaWduYWw6CisgICAgICAgICAgPHByb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgTmFtZUxvc3QgKFNUUklORyBuYW1lKQorICAgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgTWVzc2FnZSBhcmd1bWVudHM6CisgICAgICAgICAgPGluZm9ybWFsdGFibGU+CisgICAgICAgICAgICA8dGdyb3VwIGNvbHM9IjMiPgorICAgICAgICAgICAgICA8dGhlYWQ+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5Bcmd1bWVudDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+VHlwZTwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+RGVzY3JpcHRpb248L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgICAgICA8dGJvZHk+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT4wPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5TVFJJTkc8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5Pk5hbWUgd2hpY2ggd2FzIGxvc3Q8L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8L3Rib2R5PgorICAgICAgICAgICAgPC90Z3JvdXA+CisgICAgICAgICAgPC9pbmZvcm1hbHRhYmxlPgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIFRoaXMgc2lnbmFsIGlzIHNlbnQgdG8gYSBzcGVjaWZpYyBhcHBsaWNhdGlvbiB3aGVuIGl0IGxvc2VzCisgICAgICAgICAgb3duZXJzaGlwIG9mIGEgbmFtZS4KKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9zZWN0Mz4KKworICAgICAgPHNlY3QzIGlkPSJidXMtbWVzc2FnZXMtbmFtZS1hY3F1aXJlZCI+CisgICAgICAgIDx0aXRsZT48bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuREJ1cy5OYW1lQWNxdWlyZWQ8L2xpdGVyYWw+PC90aXRsZT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgVGhpcyBpcyBhIHNpZ25hbDoKKyAgICAgICAgICA8cHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICBOYW1lQWNxdWlyZWQgKFNUUklORyBuYW1lKQorICAgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgTWVzc2FnZSBhcmd1bWVudHM6CisgICAgICAgICAgPGluZm9ybWFsdGFibGU+CisgICAgICAgICAgICA8dGdyb3VwIGNvbHM9IjMiPgorICAgICAgICAgICAgICA8dGhlYWQ+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5Bcmd1bWVudDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+VHlwZTwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+RGVzY3JpcHRpb248L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgICAgICA8dGJvZHk+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT4wPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5TVFJJTkc8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5Pk5hbWUgd2hpY2ggd2FzIGFjcXVpcmVkPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPC90Ym9keT4KKyAgICAgICAgICAgIDwvdGdyb3VwPgorICAgICAgICAgIDwvaW5mb3JtYWx0YWJsZT4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBUaGlzIHNpZ25hbCBpcyBzZW50IHRvIGEgc3BlY2lmaWMgYXBwbGljYXRpb24gd2hlbiBpdCBnYWlucworICAgICAgICAgIG93bmVyc2hpcCBvZiBhIG5hbWUuCisgICAgICAgIDwvcGFyYT4KKyAgICAgIDwvc2VjdDM+CisKKyAgICAgIDxzZWN0MyBpZD0iYnVzLW1lc3NhZ2VzLXN0YXJ0LXNlcnZpY2UtYnktbmFtZSI+CisgICAgICAgIDx0aXRsZT48bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuREJ1cy5TdGFydFNlcnZpY2VCeU5hbWU8L2xpdGVyYWw+PC90aXRsZT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgQXMgYSBtZXRob2Q6CisgICAgICAgICAgPHByb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgVUlOVDMyIFN0YXJ0U2VydmljZUJ5TmFtZSAoaW4gU1RSSU5HIG5hbWUsIGluIFVJTlQzMiBmbGFncykKKyAgICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgIE1lc3NhZ2UgYXJndW1lbnRzOgorICAgICAgICAgIDxpbmZvcm1hbHRhYmxlPgorICAgICAgICAgICAgPHRncm91cCBjb2xzPSIzIj4KKyAgICAgICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+QXJndW1lbnQ8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlR5cGU8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkRlc2NyaXB0aW9uPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPC90aGVhZD4KKyAgICAgICAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+MDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+U1RSSU5HPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5OYW1lIG9mIHRoZSBzZXJ2aWNlIHRvIHN0YXJ0PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjE8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlVJTlQzMjwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+RmxhZ3MgKGN1cnJlbnRseSBub3QgdXNlZCk8L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8L3Rib2R5PgorICAgICAgICAgICAgPC90Z3JvdXA+CisgICAgICAgICAgPC9pbmZvcm1hbHRhYmxlPgorICAgICAgICBSZXBseSBhcmd1bWVudHM6CisgICAgICAgIDxpbmZvcm1hbHRhYmxlPgorICAgICAgICAgIDx0Z3JvdXAgY29scz0iMyI+CisgICAgICAgICAgICA8dGhlYWQ+CisgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PkFyZ3VtZW50PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+VHlwZTwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PkRlc2NyaXB0aW9uPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT4wPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+VUlOVDMyPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+UmV0dXJuIHZhbHVlPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICA8L3Rib2R5PgorICAgICAgICAgIDwvdGdyb3VwPgorICAgICAgICA8L2luZm9ybWFsdGFibGU+CisgICAgICAgIFRyaWVzIHRvIGxhdW5jaCB0aGUgZXhlY3V0YWJsZSBhc3NvY2lhdGVkIHdpdGggYSBuYW1lIChzZXJ2aWNlCisgICAgICAgIGFjdGl2YXRpb24pLCBhcyBhbiBleHBsaWNpdCByZXF1ZXN0LiBUaGlzIGlzIGFuIGFsdGVybmF0aXZlIHRvCisgICAgICAgIHJlbHlpbmcgb24gYXV0by1zdGFydGluZy4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gaG93IHNlcnZpY2VzCisgICAgICAgIGFyZSBhY3RpdmF0ZWQgYW5kIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYXV0by1zdGFydGluZyBhbmQgZXhwbGljaXQKKyAgICAgICAgYWN0aXZhdGlvbiwgc2VlCisgICAgICAgIDx4cmVmIGxpbmtlbmQ9Im1lc3NhZ2UtYnVzLXN0YXJ0aW5nLXNlcnZpY2VzIi8+LgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEl0IGlzIG9mdGVuIHByZWZlcmFibGUgdG8gY2Fycnkgb3V0IGF1dG8tc3RhcnRpbmcKKyAgICAgICAgICBpbnN0ZWFkIG9mIGNhbGxpbmcgdGhpcyBtZXRob2QuIFRoaXMgaXMgYmVjYXVzZSBjYWxsaW5nIHRoaXMgbWV0aG9kCisgICAgICAgICAgaXMgc3ViamVjdCB0byBhCisgICAgICAgICAgPHVsaW5rIHVybD0iaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVGltZV9vZl9jaGVja190b190aW1lX29mX3VzZSI+dGltZS1vZi1jaGVjay90aW1lLW9mLXVzZTwvdWxpbms+CisgICAgICAgICAgaXNzdWU6IGlmIGEgY2FsbGVyIGFza3MgdGhlIG1lc3NhZ2UgYnVzIHRvIHN0YXJ0IGEgc2VydmljZSBzbyB0aGF0CisgICAgICAgICAgdGhlIHNhbWUgY2FsbGVyIGNhbiBtYWtlIGZvbGxvdy11cCBtZXRob2QgY2FsbHMgdG8gdGhhdCBzZXJ2aWNlLAorICAgICAgICAgIHRoZSBmYWN0IHRoYXQgdGhlIG1lc3NhZ2UgYnVzIHdhcyBhYmxlIHRvIHN0YXJ0IHRoZSByZXF1aXJlZAorICAgICAgICAgIHNlcnZpY2UgaXMgbm8gZ3VhcmFudGVlIHRoYXQgaXQgd2lsbCBub3QgaGF2ZSBjcmFzaGVkIG9yIG90aGVyd2lzZQorICAgICAgICAgIGV4aXRlZCBieSB0aGUgdGltZSB0aGUgY2FsbGVyIG1ha2VzIHRob3NlIGZvbGxvdy11cCBtZXRob2QgY2FsbHMuCisgICAgICAgICAgQXMgYSByZXN1bHQsIGNhbGxpbmcgdGhpcyBtZXRob2QgZG9lcyBub3QgcmVtb3ZlIHRoZSBuZWVkIGZvcgorICAgICAgICAgIHRoZSBjYWxsZXIgdG8gaGFuZGxlIGVycm9ycyBmcm9tIG1ldGhvZCBjYWxscy4gR2l2ZW4gdGhhdCBmYWN0LAorICAgICAgICAgIGl0IGlzIHVzdWFsbHkgc2ltcGxlciB0byByZWx5IG9uIGF1dG8tc3RhcnRpbmcsIGluIHdoaWNoIHRoZQorICAgICAgICAgIHJlcXVpcmVkIHNlcnZpY2Ugc3RhcnRzIGFzIGEgc2lkZS1lZmZlY3Qgb2YgdGhlIGZpcnN0IG1ldGhvZCBjYWxsLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIFRoZSByZXR1cm4gdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgICAgICAgICA8aW5mb3JtYWx0YWJsZT4KKyAgICAgICAgICAgIDx0Z3JvdXAgY29scz0iMyI+CisgICAgICAgICAgICAgIDx0aGVhZD4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PklkZW50aWZpZXI8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlZhbHVlPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5EZXNjcmlwdGlvbjwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDwvdGhlYWQ+CisgICAgICAgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkRCVVNfU1RBUlRfUkVQTFlfU1VDQ0VTUzwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+MTwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+VGhlIHNlcnZpY2Ugd2FzIHN1Y2Nlc3NmdWxseSBzdGFydGVkLjwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5EQlVTX1NUQVJUX1JFUExZX0FMUkVBRFlfUlVOTklORzwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+MjwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+QSBjb25uZWN0aW9uIGFscmVhZHkgb3ducyB0aGUgZ2l2ZW4gbmFtZS48L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8L3Rib2R5PgorICAgICAgICAgICAgIDwvdGdyb3VwPgorICAgICAgICAgICA8L2luZm9ybWFsdGFibGU+CisgICAgICAgIDwvcGFyYT4KKworICAgICAgPC9zZWN0Mz4KKworICAgICAgPHNlY3QzIGlkPSJidXMtbWVzc2FnZXMtdXBkYXRlLWFjdGl2YXRpb24tZW52aXJvbm1lbnQiPgorICAgICAgICA8dGl0bGU+PGxpdGVyYWw+b3JnLmZyZWVkZXNrdG9wLkRCdXMuVXBkYXRlQWN0aXZhdGlvbkVudmlyb25tZW50PC9saXRlcmFsPjwvdGl0bGU+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEFzIGEgbWV0aG9kOgorICAgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIFVwZGF0ZUFjdGl2YXRpb25FbnZpcm9ubWVudCAoaW4gQVJSQVkgb2YgRElDVCZsdDtTVFJJTkcsU1RSSU5HJmd0OyBlbnZpcm9ubWVudCkKKyAgICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgIE1lc3NhZ2UgYXJndW1lbnRzOgorICAgICAgICAgIDxpbmZvcm1hbHRhYmxlPgorICAgICAgICAgICAgPHRncm91cCBjb2xzPSIzIj4KKyAgICAgICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+QXJndW1lbnQ8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlR5cGU8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkRlc2NyaXB0aW9uPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPC90aGVhZD4KKyAgICAgICAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+MDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+QVJSQVkgb2YgRElDVCZsdDtTVFJJTkcsU1RSSU5HJmd0OzwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+RW52aXJvbm1lbnQgdG8gYWRkIG9yIHVwZGF0ZTwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDwvdGJvZHk+CisgICAgICAgICAgICA8L3Rncm91cD4KKyAgICAgICAgICAgIDwvaW5mb3JtYWx0YWJsZT4KKyAgICAgICAgICAgIE5vcm1hbGx5LCBzZXNzaW9uIGJ1cyBhY3RpdmF0ZWQgc2VydmljZXMgaW5oZXJpdCB0aGUgZW52aXJvbm1lbnQgb2YgdGhlIGJ1cyBkYWVtb24uICBUaGlzIG1ldGhvZCBhZGRzIHRvIG9yIG1vZGlmaWVzIHRoYXQgZW52aXJvbm1lbnQgd2hlbiBhY3RpdmF0aW5nIHNlcnZpY2VzLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIFNvbWUgYnVzIGluc3RhbmNlcywgc3VjaCBhcyB0aGUgc3RhbmRhcmQgc3lzdGVtIGJ1cywgbWF5IGRpc2FibGUgYWNjZXNzIHRvIHRoaXMgbWV0aG9kIGZvciBzb21lIG9yIGFsbCBjYWxsZXJzLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIE5vdGUsIGJvdGggdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIG5hbWVzIGFuZCB2YWx1ZXMgbXVzdCBiZSB2YWxpZCBVVEYtOC4gIFRoZXJlJ3Mgbm8gd2F5IHRvIHVwZGF0ZSB0aGUgYWN0aXZhdGlvbiBlbnZpcm9ubWVudCB3aXRoIGRhdGEgdGhhdCBpcyBpbnZhbGlkIFVURi04LgorICAgICAgICA8L3BhcmE+CisKKyAgICAgIDwvc2VjdDM+CisKKyAgICAgIDxzZWN0MyBpZD0iYnVzLW1lc3NhZ2VzLWdldC1uYW1lLW93bmVyIj4KKyAgICAgICAgPHRpdGxlPjxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzLkdldE5hbWVPd25lcjwvbGl0ZXJhbD48L3RpdGxlPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBBcyBhIG1ldGhvZDoKKyAgICAgICAgICA8cHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICBTVFJJTkcgR2V0TmFtZU93bmVyIChpbiBTVFJJTkcgbmFtZSkKKyAgICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgIE1lc3NhZ2UgYXJndW1lbnRzOgorICAgICAgICAgIDxpbmZvcm1hbHRhYmxlPgorICAgICAgICAgICAgPHRncm91cCBjb2xzPSIzIj4KKyAgICAgICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+QXJndW1lbnQ8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlR5cGU8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkRlc2NyaXB0aW9uPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPC90aGVhZD4KKyAgICAgICAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+MDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+U1RSSU5HPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5OYW1lIHRvIGdldCB0aGUgb3duZXIgb2Y8L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8L3Rib2R5PgorICAgICAgICAgICAgPC90Z3JvdXA+CisgICAgICAgICAgPC9pbmZvcm1hbHRhYmxlPgorICAgICAgICBSZXBseSBhcmd1bWVudHM6CisgICAgICAgIDxpbmZvcm1hbHRhYmxlPgorICAgICAgICAgIDx0Z3JvdXAgY29scz0iMyI+CisgICAgICAgICAgICA8dGhlYWQ+CisgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PkFyZ3VtZW50PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+VHlwZTwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PkRlc2NyaXB0aW9uPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT4wPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+U1RSSU5HPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+UmV0dXJuIHZhbHVlLCBhIHVuaXF1ZSBjb25uZWN0aW9uIG5hbWU8L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgIDwvdGJvZHk+CisgICAgICAgICAgPC90Z3JvdXA+CisgICAgICAgIDwvaW5mb3JtYWx0YWJsZT4KKyAgICAgICAgUmV0dXJucyB0aGUgdW5pcXVlIGNvbm5lY3Rpb24gbmFtZSBvZiB0aGUgcHJpbWFyeSBvd25lciBvZiB0aGUgbmFtZQorICAgICAgICBnaXZlbi4gSWYgdGhlIHJlcXVlc3RlZCBuYW1lIGRvZXNuJ3QgaGF2ZSBhbiBvd25lciwgcmV0dXJucyBhCisgICAgICAgIDxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzLkVycm9yLk5hbWVIYXNOb093bmVyPC9saXRlcmFsPiBlcnJvci4KKyAgICAgICA8L3BhcmE+CisgICAgICA8L3NlY3QzPgorCisgICAgICA8c2VjdDMgaWQ9ImJ1cy1tZXNzYWdlcy1nZXQtY29ubmVjdGlvbi11bml4LXVzZXIiPgorICAgICAgICA8dGl0bGU+PGxpdGVyYWw+b3JnLmZyZWVkZXNrdG9wLkRCdXMuR2V0Q29ubmVjdGlvblVuaXhVc2VyPC9saXRlcmFsPjwvdGl0bGU+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEFzIGEgbWV0aG9kOgorICAgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIFVJTlQzMiBHZXRDb25uZWN0aW9uVW5peFVzZXIgKGluIFNUUklORyBidXNfbmFtZSkKKyAgICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgIE1lc3NhZ2UgYXJndW1lbnRzOgorICAgICAgICAgIDxpbmZvcm1hbHRhYmxlPgorICAgICAgICAgICAgPHRncm91cCBjb2xzPSIzIj4KKyAgICAgICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+QXJndW1lbnQ8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlR5cGU8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkRlc2NyaXB0aW9uPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPC90aGVhZD4KKyAgICAgICAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+MDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+U1RSSU5HPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5VbmlxdWUgb3Igd2VsbC1rbm93biBidXMgbmFtZSBvZiB0aGUgY29ubmVjdGlvbiB0bworICAgICAgICAgICAgICAgICAgICBxdWVyeSwgc3VjaCBhcyA8bGl0ZXJhbD46MTIuMzQ8L2xpdGVyYWw+IG9yCisgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPmNvbS5leGFtcGxlLnRlYTwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8L3Rib2R5PgorICAgICAgICAgICAgPC90Z3JvdXA+CisgICAgICAgICAgPC9pbmZvcm1hbHRhYmxlPgorICAgICAgICBSZXBseSBhcmd1bWVudHM6CisgICAgICAgIDxpbmZvcm1hbHRhYmxlPgorICAgICAgICAgIDx0Z3JvdXAgY29scz0iMyI+CisgICAgICAgICAgICA8dGhlYWQ+CisgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PkFyZ3VtZW50PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+VHlwZTwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PkRlc2NyaXB0aW9uPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT4wPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+VUlOVDMyPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+VW5peCB1c2VyIElEPC9lbnRyeT4KKyAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICA8L3Rib2R5PgorICAgICAgICAgIDwvdGdyb3VwPgorICAgICAgICA8L2luZm9ybWFsdGFibGU+CisgICAgICAgIFJldHVybnMgdGhlIFVuaXggdXNlciBJRCBvZiB0aGUgcHJvY2VzcyBjb25uZWN0ZWQgdG8gdGhlIHNlcnZlci4gSWYKKyAgICAgICAgdW5hYmxlIHRvIGRldGVybWluZSBpdCAoZm9yIGluc3RhbmNlLCBiZWNhdXNlIHRoZSBwcm9jZXNzIGlzIG5vdCBvbiB0aGUKKyAgICAgICAgc2FtZSBtYWNoaW5lIGFzIHRoZSBidXMgZGFlbW9uKSwgYW4gZXJyb3IgaXMgcmV0dXJuZWQuCisgICAgICAgPC9wYXJhPgorICAgICAgPC9zZWN0Mz4KKworICAgICAgPHNlY3QzIGlkPSJidXMtbWVzc2FnZXMtZ2V0LWNvbm5lY3Rpb24tdW5peC1wcm9jZXNzLWlkIj4KKyAgICAgICAgPHRpdGxlPjxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzLkdldENvbm5lY3Rpb25Vbml4UHJvY2Vzc0lEPC9saXRlcmFsPjwvdGl0bGU+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEFzIGEgbWV0aG9kOgorICAgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIFVJTlQzMiBHZXRDb25uZWN0aW9uVW5peFByb2Nlc3NJRCAoaW4gU1RSSU5HIGJ1c19uYW1lKQorICAgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgTWVzc2FnZSBhcmd1bWVudHM6CisgICAgICAgICAgPGluZm9ybWFsdGFibGU+CisgICAgICAgICAgICA8dGdyb3VwIGNvbHM9IjMiPgorICAgICAgICAgICAgICA8dGhlYWQ+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5Bcmd1bWVudDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+VHlwZTwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+RGVzY3JpcHRpb248L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgICAgICA8dGJvZHk+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT4wPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5TVFJJTkc8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlVuaXF1ZSBvciB3ZWxsLWtub3duIGJ1cyBuYW1lIG9mIHRoZSBjb25uZWN0aW9uIHRvCisgICAgICAgICAgICAgICAgICAgIHF1ZXJ5LCBzdWNoIGFzIDxsaXRlcmFsPjoxMi4zNDwvbGl0ZXJhbD4gb3IKKyAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+Y29tLmV4YW1wbGUudGVhPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDwvdGJvZHk+CisgICAgICAgICAgICA8L3Rncm91cD4KKyAgICAgICAgICA8L2luZm9ybWFsdGFibGU+CisgICAgICAgIFJlcGx5IGFyZ3VtZW50czoKKyAgICAgICAgPGluZm9ybWFsdGFibGU+CisgICAgICAgICAgPHRncm91cCBjb2xzPSIzIj4KKyAgICAgICAgICAgIDx0aGVhZD4KKyAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+QXJndW1lbnQ8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5UeXBlPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+RGVzY3JpcHRpb248L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgIDwvdGhlYWQ+CisgICAgICAgICAgICA8dGJvZHk+CisgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PjA8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5VSU5UMzI8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5Vbml4IHByb2Nlc3MgaWQ8L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgIDwvdGJvZHk+CisgICAgICAgICAgPC90Z3JvdXA+CisgICAgICAgIDwvaW5mb3JtYWx0YWJsZT4KKyAgICAgICAgUmV0dXJucyB0aGUgVW5peCBwcm9jZXNzIElEIG9mIHRoZSBwcm9jZXNzIGNvbm5lY3RlZCB0byB0aGUgc2VydmVyLiBJZgorICAgICAgICB1bmFibGUgdG8gZGV0ZXJtaW5lIGl0IChmb3IgaW5zdGFuY2UsIGJlY2F1c2UgdGhlIHByb2Nlc3MgaXMgbm90IG9uIHRoZQorICAgICAgICBzYW1lIG1hY2hpbmUgYXMgdGhlIGJ1cyBkYWVtb24pLCBhbiBlcnJvciBpcyByZXR1cm5lZC4KKyAgICAgICA8L3BhcmE+CisgICAgICA8L3NlY3QzPgorCisgICAgICA8c2VjdDMgaWQ9ImJ1cy1tZXNzYWdlcy1nZXQtY29ubmVjdGlvbi1jcmVkZW50aWFscyI+CisgICAgICAgIDx0aXRsZT48bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuREJ1cy5HZXRDb25uZWN0aW9uQ3JlZGVudGlhbHM8L2xpdGVyYWw+PC90aXRsZT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgQXMgYSBtZXRob2Q6CisgICAgICAgICAgPHByb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgRElDVCZsdDtTVFJJTkcsVkFSSUFOVCZndDsgR2V0Q29ubmVjdGlvbkNyZWRlbnRpYWxzIChpbiBTVFJJTkcgYnVzX25hbWUpCisgICAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICBNZXNzYWdlIGFyZ3VtZW50czoKKyAgICAgICAgICA8aW5mb3JtYWx0YWJsZT4KKyAgICAgICAgICAgIDx0Z3JvdXAgY29scz0iMyI+CisgICAgICAgICAgICAgIDx0aGVhZD4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkFyZ3VtZW50PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5UeXBlPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5EZXNjcmlwdGlvbjwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDwvdGhlYWQ+CisgICAgICAgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlNUUklORzwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+VW5pcXVlIG9yIHdlbGwta25vd24gYnVzIG5hbWUgb2YgdGhlIGNvbm5lY3Rpb24gdG8KKyAgICAgICAgICAgICAgICAgICAgcXVlcnksIHN1Y2ggYXMgPGxpdGVyYWw+OjEyLjM0PC9saXRlcmFsPiBvcgorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5jb20uZXhhbXBsZS50ZWE8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPC90Ym9keT4KKyAgICAgICAgICAgIDwvdGdyb3VwPgorICAgICAgICAgIDwvaW5mb3JtYWx0YWJsZT4KKyAgICAgICAgUmVwbHkgYXJndW1lbnRzOgorICAgICAgICA8aW5mb3JtYWx0YWJsZT4KKyAgICAgICAgICA8dGdyb3VwIGNvbHM9IjMiPgorICAgICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT5Bcmd1bWVudDwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PlR5cGU8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5EZXNjcmlwdGlvbjwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgPC90aGVhZD4KKyAgICAgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+MDwvZW50cnk+CisgICAgICAgICAgICAgICAgPGVudHJ5PkRJQ1QmbHQ7U1RSSU5HLFZBUklBTlQmZ3Q7PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+Q3JlZGVudGlhbHM8L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgIDwvdGJvZHk+CisgICAgICAgICAgPC90Z3JvdXA+CisgICAgICAgIDwvaW5mb3JtYWx0YWJsZT4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIFJldHVybnMgYXMgbWFueSBjcmVkZW50aWFscyBhcyBwb3NzaWJsZSBmb3IgdGhlIHByb2Nlc3MgY29ubmVjdGVkIHRvCisgICAgICAgIHRoZSBzZXJ2ZXIuIElmIHVuYWJsZSB0byBkZXRlcm1pbmUgY2VydGFpbiBjcmVkZW50aWFscyAoZm9yIGluc3RhbmNlLAorICAgICAgICBiZWNhdXNlIHRoZSBwcm9jZXNzIGlzIG5vdCBvbiB0aGUgc2FtZSBtYWNoaW5lIGFzIHRoZSBidXMgZGFlbW9uLAorICAgICAgICBvciBiZWNhdXNlIHRoaXMgdmVyc2lvbiBvZiB0aGUgYnVzIGRhZW1vbiBkb2VzIG5vdCBzdXBwb3J0IGEKKyAgICAgICAgcGFydGljdWxhciBzZWN1cml0eSBmcmFtZXdvcmspLCBvciBpZiB0aGUgdmFsdWVzIG9mIHRob3NlIGNyZWRlbnRpYWxzCisgICAgICAgIGNhbm5vdCBiZSByZXByZXNlbnRlZCBhcyBkb2N1bWVudGVkIGhlcmUsIHRoZW4gdGhvc2UgY3JlZGVudGlhbHMKKyAgICAgICAgYXJlIG9taXR0ZWQuCisgICAgICA8L3BhcmE+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBLZXlzIGluIHRoZSByZXR1cm5lZCBkaWN0aW9uYXJ5IG5vdCBjb250YWluaW5nICIuIiBhcmUgZGVmaW5lZAorICAgICAgICBieSB0aGlzIHNwZWNpZmljYXRpb24uIEJ1cyBkYWVtb24gaW1wbGVtZW50b3JzIHN1cHBvcnRpbmcKKyAgICAgICAgY3JlZGVudGlhbHMgZnJhbWV3b3JrcyBub3QgbWVudGlvbmVkIGluIHRoaXMgZG9jdW1lbnQgc2hvdWxkIGVpdGhlcgorICAgICAgICBjb250cmlidXRlIHBhdGNoZXMgdG8gdGhpcyBzcGVjaWZpY2F0aW9uLCBvciB1c2Uga2V5cyBjb250YWluaW5nCisgICAgICAgICIuIiBhbmQgc3RhcnRpbmcgd2l0aCBhIHJldmVyc2VkIGRvbWFpbiBuYW1lLgorICAgICAgICA8aW5mb3JtYWx0YWJsZT4KKyAgICAgICAgICA8dGdyb3VwIGNvbHM9IjMiPgorICAgICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT5LZXk8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5WYWx1ZSB0eXBlPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+VmFsdWU8L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgIDwvdGhlYWQ+CisgICAgICAgICAgICA8dGJvZHk+CisgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PlVuaXhVc2VySUQ8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5VSU5UMzI8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5UaGUgbnVtZXJpYyBVbml4IHVzZXIgSUQsIGFzIGRlZmluZWQgYnkgUE9TSVg8L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+UHJvY2Vzc0lEPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+VUlOVDMyPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+VGhlIG51bWVyaWMgcHJvY2VzcyBJRCwgb24gcGxhdGZvcm1zIHRoYXQgaGF2ZQorICAgICAgICAgICAgICAgICAgdGhpcyBjb25jZXB0LiBPbiBVbml4LCB0aGlzIGlzIHRoZSBwcm9jZXNzIElEIGRlZmluZWQgYnkKKyAgICAgICAgICAgICAgICAgIFBPU0lYLjwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT5XaW5kb3dzU0lEPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+U1RSSU5HPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+VGhlIFdpbmRvd3Mgc2VjdXJpdHkgaWRlbnRpZmllciBpbiBpdHMgc3RyaW5nIGZvcm0sCisgICAgICAgICAgICAgICAgZS5nLiAiUy0xLTUtMjEtMzYyMzgxMTAxNS0zMzYxMDQ0MzQ4LTMwMzAwODIwLTEwMTMiIGZvcgorICAgICAgICAgICAgICAgIGEgZG9tYWluIG9yIGxvY2FsIGNvbXB1dGVyIHVzZXIgb3IgIlMtMS01LTE4IiBmb3IgdGhlCisgICAgICAgICAgICAgICAgTE9DQUxfU1lTVEVNIHVzZXI8L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz4KKworICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeT5MaW51eFNlY3VyaXR5TGFiZWw8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5BUlJBWSBvZiBCWVRFPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+CisgICAgICAgICAgICAgICAgICA8cGFyYT5PbiBMaW51eCBzeXN0ZW1zLCB0aGUgc2VjdXJpdHkgbGFiZWwgdGhhdCB3b3VsZCByZXN1bHQKKyAgICAgICAgICAgICAgICAgICAgZnJvbSB0aGUgU09fUEVFUlNFQyBnZXRzb2Nrb3B0IGNhbGwuIFRoZSBhcnJheSBjb250YWlucworICAgICAgICAgICAgICAgICAgICB0aGUgbm9uLXplcm8gYnl0ZXMgb2YgdGhlIHNlY3VyaXR5IGxhYmVsIGluIGFuIHVuc3BlY2lmaWVkCisgICAgICAgICAgICAgICAgICAgIEFTQ0lJLWNvbXBhdGlibGUgZW5jb2Rpbmc8Zm9vdG5vdGU+CisgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+SXQgY291bGQgYmUgQVNDSUkgb3IgVVRGLTgsIGJ1dCBjb3VsZCBhbHNvIGJlCisgICAgICAgICAgICAgICAgICAgICAgICBJU08gTGF0aW4tMSBvciBhbnkgb3RoZXIgZW5jb2RpbmcuPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2Zvb3Rub3RlPiwgZm9sbG93ZWQgYnkgYSBzaW5nbGUgemVybyBieXRlLjwvcGFyYT4KKyAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBGb3IgZXhhbXBsZSwgdGhlIFNFTGludXggY29udGV4dAorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5zeXN0ZW1fdTpzeXN0ZW1fcjppbml0X3Q6czA8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgIChhIHN0cmluZyBvZiBsZW5ndGggMjcpIHdvdWxkIGJlIGVuY29kZWQgYXMgMjggYnl0ZXMKKyAgICAgICAgICAgICAgICAgICAgZW5kaW5nIHdpdGggJzonLCAncycsICcwJywgJ1x4MDAnLjxmb290bm90ZT4KKyAgICAgICAgICAgICAgICAgICAgICA8cGFyYT5Ob3RlIHRoYXQgdGhpcyBpcyBub3QgdGhlIHNhbWUgYXMgdGhlIG9sZGVyCisgICAgICAgICAgICAgICAgICAgICAgICBHZXRDb25uZWN0aW9uU0VMaW51eENvbnRleHQgbWV0aG9kLCB3aGljaCBkb2VzCisgICAgICAgICAgICAgICAgICAgICAgICBub3QgYXBwZW5kIHRoZSB6ZXJvIGJ5dGUuIEFsd2F5cyBhcHBlbmRpbmcgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICB6ZXJvIGJ5dGUgYWxsb3dzIGNhbGxlcnMgdG8gcmVhZCB0aGUgc3RyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHRoZSBtZXNzYWdlIHBheWxvYWQgd2l0aG91dCBjb3B5aW5nLjwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9mb290bm90ZT4KKyAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBPbiBTRUxpbnV4IHN5c3RlbXMgdGhpcyBpcyB0aGUgU0VMaW51eCBjb250ZXh0LCBhcyBvdXRwdXQKKyAgICAgICAgICAgICAgICAgICAgYnkgPGxpdGVyYWw+cHMgLVo8L2xpdGVyYWw+IG9yIDxsaXRlcmFsPmxzIC1aPC9saXRlcmFsPi4KKyAgICAgICAgICAgICAgICAgICAgVHlwaWNhbCB2YWx1ZXMgbWlnaHQgaW5jbHVkZQorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5zeXN0ZW1fdTpzeXN0ZW1fcjppbml0X3Q6czA8L2xpdGVyYWw+LAorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD51bmNvbmZpbmVkX3U6dW5jb25maW5lZF9yOnVuY29uZmluZWRfdDpzMC1zMDpjMC5jMTAyMzwvbGl0ZXJhbD4sCisgICAgICAgICAgICAgICAgICAgIG9yCisgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPnVuY29uZmluZWRfdTp1bmNvbmZpbmVkX3I6Y2hyb21lX3NhbmRib3hfdDpzMC1zMDpjMC5jMTAyMzwvbGl0ZXJhbD4uCisgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgT24gU21hY2sgc3lzdGVtcywgdGhpcyBpcyB0aGUgU21hY2sgbGFiZWwuCisgICAgICAgICAgICAgICAgICAgIFR5cGljYWwgdmFsdWVzIG1pZ2h0IGluY2x1ZGUKKyAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+XzwvbGl0ZXJhbD4sIDxsaXRlcmFsPio8L2xpdGVyYWw+LAorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5Vc2VyPC9saXRlcmFsPiwgPGxpdGVyYWw+U3lzdGVtPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICBvciA8bGl0ZXJhbD5TeXN0ZW06OlNoYXJlZDwvbGl0ZXJhbD4uCisgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgT24gQXBwQXJtb3Igc3lzdGVtcywgdGhpcyBpcyB0aGUgQXBwQXJtb3IgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgYSBjb21wb3NpdGUgc3RyaW5nIGVuY29kaW5nIHRoZSBBcHBBcm1vciBsYWJlbCAob25lIG9yIG1vcmUKKyAgICAgICAgICAgICAgICAgICAgcHJvZmlsZXMpIGFuZCB0aGUgZW5mb3JjZW1lbnQgbW9kZS4KKyAgICAgICAgICAgICAgICAgICAgVHlwaWNhbCB2YWx1ZXMgbWlnaHQgaW5jbHVkZSA8bGl0ZXJhbD51bmNvbmZpbmVkPC9saXRlcmFsPiwKKyAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+L3Vzci9iaW4vZmlyZWZveCAoZW5mb3JjZSk8L2xpdGVyYWw+IG9yCisgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPnVzZXIxIChjb21wbGFpbik8L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgIDwvcm93PgorCisgICAgICAgICAgICA8L3Rib2R5PgorICAgICAgICAgIDwvdGdyb3VwPgorICAgICAgICA8L2luZm9ybWFsdGFibGU+CisgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgIFRoaXMgbWV0aG9kIHdhcyBhZGRlZCBpbiBELUJ1cyAxLjcgdG8gcmVkdWNlIHRoZSByb3VuZC10cmlwcworICAgICAgICAgIHJlcXVpcmVkIHRvIGxpc3QgYSBwcm9jZXNzJ3MgY3JlZGVudGlhbHMuIEluIG9sZGVyIHZlcnNpb25zLCBjYWxsaW5nCisgICAgICAgICAgdGhpcyBtZXRob2Qgd2lsbCBmYWlsOiBhcHBsaWNhdGlvbnMgc2hvdWxkIHJlY292ZXIgYnkgdXNpbmcgdGhlCisgICAgICAgICAgc2VwYXJhdGUgbWV0aG9kcyBzdWNoIGFzCisgICAgICAgICAgPHhyZWYgbGlua2VuZD0iYnVzLW1lc3NhZ2VzLWdldC1jb25uZWN0aW9uLXVuaXgtdXNlciIvPgorICAgICAgICAgIGluc3RlYWQuCisgICAgICAgIDwvcGFyYT4KKyAgICAgIDwvc2VjdDM+CisKKyAgICAgIDxzZWN0MyBpZD0iYnVzLW1lc3NhZ2VzLWdldC1hZHQtYXVkaXQtc2Vzc2lvbi1kYXRhIj4KKyAgICAgICAgPHRpdGxlPjxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzLkdldEFkdEF1ZGl0U2Vzc2lvbkRhdGE8L2xpdGVyYWw+PC90aXRsZT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgQXMgYSBtZXRob2Q6CisgICAgICAgICAgPHByb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgQVJSQVkgb2YgQllURSBHZXRBZHRBdWRpdFNlc3Npb25EYXRhIChpbiBTVFJJTkcgYnVzX25hbWUpCisgICAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICBNZXNzYWdlIGFyZ3VtZW50czoKKyAgICAgICAgICA8aW5mb3JtYWx0YWJsZT4KKyAgICAgICAgICAgIDx0Z3JvdXAgY29scz0iMyI+CisgICAgICAgICAgICAgIDx0aGVhZD4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkFyZ3VtZW50PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5UeXBlPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5EZXNjcmlwdGlvbjwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDwvdGhlYWQ+CisgICAgICAgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlNUUklORzwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+VW5pcXVlIG9yIHdlbGwta25vd24gYnVzIG5hbWUgb2YgdGhlIGNvbm5lY3Rpb24gdG8KKyAgICAgICAgICAgICAgICAgICAgcXVlcnksIHN1Y2ggYXMgPGxpdGVyYWw+OjEyLjM0PC9saXRlcmFsPiBvcgorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5jb20uZXhhbXBsZS50ZWE8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPC90Ym9keT4KKyAgICAgICAgICAgIDwvdGdyb3VwPgorICAgICAgICAgIDwvaW5mb3JtYWx0YWJsZT4KKyAgICAgICAgICBSZXBseSBhcmd1bWVudHM6CisgICAgICAgICAgPGluZm9ybWFsdGFibGU+CisgICAgICAgICAgICA8dGdyb3VwIGNvbHM9IjMiPgorICAgICAgICAgICAgICA8dGhlYWQ+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5Bcmd1bWVudDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+VHlwZTwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+RGVzY3JpcHRpb248L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgICAgICA8dGJvZHk+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT4wPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5BUlJBWSBvZiBCWVRFPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5hdWRpdGluZyBkYXRhIGFzIHJldHVybmVkIGJ5CisgICAgICAgICAgICAgICAgICAgIGFkdF9leHBvcnRfc2Vzc2lvbl9kYXRhKCk8L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8L3Rib2R5PgorICAgICAgICAgICAgPC90Z3JvdXA+CisgICAgICAgICAgPC9pbmZvcm1hbHRhYmxlPgorICAgICAgICAgIFJldHVybnMgYXVkaXRpbmcgZGF0YSB1c2VkIGJ5IFNvbGFyaXMgQURULCBpbiBhbiB1bnNwZWNpZmllZAorICAgICAgICAgIGJpbmFyeSBmb3JtYXQuIElmIHlvdSBrbm93IHdoYXQgdGhpcyBtZWFucywgcGxlYXNlIGNvbnRyaWJ1dGUKKyAgICAgICAgICBkb2N1bWVudGF0aW9uIHZpYSB0aGUgRC1CdXMgYnVnIHRyYWNraW5nIHN5c3RlbS4KKyAgICAgICAgICBUaGlzIG1ldGhvZCBpcyBvbiB0aGUgY29yZSBEQnVzIGludGVyZmFjZSBmb3IgaGlzdG9yaWNhbCByZWFzb25zOworICAgICAgICAgIHRoZSBzYW1lIGluZm9ybWF0aW9uIHNob3VsZCBiZSBtYWRlIGF2YWlsYWJsZSB2aWEKKyAgICAgICAgICA8eHJlZiBsaW5rZW5kPSJidXMtbWVzc2FnZXMtZ2V0LWNvbm5lY3Rpb24tY3JlZGVudGlhbHMiLz4KKyAgICAgICAgICBpbiBmdXR1cmUuCisgICAgICAgIDwvcGFyYT4KKyAgICAgIDwvc2VjdDM+CisKKyAgICAgIDxzZWN0MyBpZD0iYnVzLW1lc3NhZ2VzLWdldC1jb25uZWN0aW9uLXNlbGludXgtc2VjdXJpdHktY29udGV4dCI+CisgICAgICAgIDx0aXRsZT48bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuREJ1cy5HZXRDb25uZWN0aW9uU0VMaW51eFNlY3VyaXR5Q29udGV4dDwvbGl0ZXJhbD48L3RpdGxlPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBBcyBhIG1ldGhvZDoKKyAgICAgICAgICA8cHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICBBUlJBWSBvZiBCWVRFIEdldENvbm5lY3Rpb25TRUxpbnV4U2VjdXJpdHlDb250ZXh0IChpbiBTVFJJTkcgYnVzX25hbWUpCisgICAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICBNZXNzYWdlIGFyZ3VtZW50czoKKyAgICAgICAgICA8aW5mb3JtYWx0YWJsZT4KKyAgICAgICAgICAgIDx0Z3JvdXAgY29scz0iMyI+CisgICAgICAgICAgICAgIDx0aGVhZD4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkFyZ3VtZW50PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5UeXBlPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5EZXNjcmlwdGlvbjwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDwvdGhlYWQ+CisgICAgICAgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlNUUklORzwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+VW5pcXVlIG9yIHdlbGwta25vd24gYnVzIG5hbWUgb2YgdGhlIGNvbm5lY3Rpb24gdG8KKyAgICAgICAgICAgICAgICAgICAgcXVlcnksIHN1Y2ggYXMgPGxpdGVyYWw+OjEyLjM0PC9saXRlcmFsPiBvcgorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5jb20uZXhhbXBsZS50ZWE8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPC90Ym9keT4KKyAgICAgICAgICAgIDwvdGdyb3VwPgorICAgICAgICAgIDwvaW5mb3JtYWx0YWJsZT4KKyAgICAgICAgICBSZXBseSBhcmd1bWVudHM6CisgICAgICAgICAgPGluZm9ybWFsdGFibGU+CisgICAgICAgICAgICA8dGdyb3VwIGNvbHM9IjMiPgorICAgICAgICAgICAgICA8dGhlYWQ+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5Bcmd1bWVudDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+VHlwZTwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+RGVzY3JpcHRpb248L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgICAgICA8dGJvZHk+CisgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT4wPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5BUlJBWSBvZiBCWVRFPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5zb21lIHNvcnQgb2Ygc3RyaW5nIG9mIGJ5dGVzLCBub3QgbmVjZXNzYXJpbHkgVVRGLTgsCisgICAgICAgICAgICAgICAgICAgIG5vdCBpbmNsdWRpbmcgJ1wwJzwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDwvdGJvZHk+CisgICAgICAgICAgICA8L3Rncm91cD4KKyAgICAgICAgICA8L2luZm9ybWFsdGFibGU+CisgICAgICAgICAgUmV0dXJucyB0aGUgc2VjdXJpdHkgY29udGV4dCB1c2VkIGJ5IFNFTGludXgsIGluIGFuIHVuc3BlY2lmaWVkCisgICAgICAgICAgZm9ybWF0LiBJZiB5b3Uga25vdyB3aGF0IHRoaXMgbWVhbnMsIHBsZWFzZSBjb250cmlidXRlCisgICAgICAgICAgZG9jdW1lbnRhdGlvbiB2aWEgdGhlIEQtQnVzIGJ1ZyB0cmFja2luZyBzeXN0ZW0uCisgICAgICAgICAgVGhpcyBtZXRob2QgaXMgb24gdGhlIGNvcmUgREJ1cyBpbnRlcmZhY2UgZm9yIGhpc3RvcmljYWwgcmVhc29uczsKKyAgICAgICAgICB0aGUgc2FtZSBpbmZvcm1hdGlvbiBzaG91bGQgYmUgbWFkZSBhdmFpbGFibGUgdmlhCisgICAgICAgICAgPHhyZWYgbGlua2VuZD0iYnVzLW1lc3NhZ2VzLWdldC1jb25uZWN0aW9uLWNyZWRlbnRpYWxzIi8+CisgICAgICAgICAgaW4gZnV0dXJlLgorICAgICAgICA8L3BhcmE+CisgICAgICA8L3NlY3QzPgorCisKKyAgICAgIDxzZWN0MyBpZD0iYnVzLW1lc3NhZ2VzLWFkZC1tYXRjaCI+CisgICAgICAgIDx0aXRsZT48bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuREJ1cy5BZGRNYXRjaDwvbGl0ZXJhbD48L3RpdGxlPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBBcyBhIG1ldGhvZDoKKyAgICAgICAgICA8cHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICBBZGRNYXRjaCAoaW4gU1RSSU5HIHJ1bGUpCisgICAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICBNZXNzYWdlIGFyZ3VtZW50czoKKyAgICAgICAgICA8aW5mb3JtYWx0YWJsZT4KKyAgICAgICAgICAgIDx0Z3JvdXAgY29scz0iMyI+CisgICAgICAgICAgICAgIDx0aGVhZD4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkFyZ3VtZW50PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5UeXBlPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5EZXNjcmlwdGlvbjwvZW50cnk+CisgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgIDwvdGhlYWQ+CisgICAgICAgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PjA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlNUUklORzwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+TWF0Y2ggcnVsZSB0byBhZGQgdG8gdGhlIGNvbm5lY3Rpb248L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICA8L3Rib2R5PgorICAgICAgICAgICAgPC90Z3JvdXA+CisgICAgICAgICAgPC9pbmZvcm1hbHRhYmxlPgorICAgICAgICBBZGRzIGEgbWF0Y2ggcnVsZSB0byBtYXRjaCBtZXNzYWdlcyBnb2luZyB0aHJvdWdoIHRoZSBtZXNzYWdlIGJ1cyAoc2VlIDx4cmVmIGxpbmtlbmQ9J21lc3NhZ2UtYnVzLXJvdXRpbmctbWF0Y2gtcnVsZXMnLz4pLgorICAgICAgICBJZiB0aGUgYnVzIGRvZXMgbm90IGhhdmUgZW5vdWdoIHJlc291cmNlcyB0aGUgPGxpdGVyYWw+b3JnLmZyZWVkZXNrdG9wLkRCdXMuRXJyb3IuT09NPC9saXRlcmFsPgorICAgICAgICBlcnJvciBpcyByZXR1cm5lZC4KKyAgICAgICA8L3BhcmE+CisgICAgICA8L3NlY3QzPgorICAgICAgPHNlY3QzIGlkPSJidXMtbWVzc2FnZXMtcmVtb3ZlLW1hdGNoIj4KKyAgICAgICAgPHRpdGxlPjxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzLlJlbW92ZU1hdGNoPC9saXRlcmFsPjwvdGl0bGU+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEFzIGEgbWV0aG9kOgorICAgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIFJlbW92ZU1hdGNoIChpbiBTVFJJTkcgcnVsZSkKKyAgICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgIE1lc3NhZ2UgYXJndW1lbnRzOgorICAgICAgICAgIDxpbmZvcm1hbHRhYmxlPgorICAgICAgICAgICAgPHRncm91cCBjb2xzPSIzIj4KKyAgICAgICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+QXJndW1lbnQ8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlR5cGU8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkRlc2NyaXB0aW9uPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPC90aGVhZD4KKyAgICAgICAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+MDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+U1RSSU5HPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5NYXRjaCBydWxlIHRvIHJlbW92ZSBmcm9tIHRoZSBjb25uZWN0aW9uPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPC90Ym9keT4KKyAgICAgICAgICAgIDwvdGdyb3VwPgorICAgICAgICAgIDwvaW5mb3JtYWx0YWJsZT4KKyAgICAgICAgUmVtb3ZlcyB0aGUgZmlyc3QgcnVsZSB0aGF0IG1hdGNoZXMgKHNlZSA8eHJlZiBsaW5rZW5kPSdtZXNzYWdlLWJ1cy1yb3V0aW5nLW1hdGNoLXJ1bGVzJy8+KS4KKyAgICAgICAgSWYgdGhlIHJ1bGUgaXMgbm90IGZvdW5kIHRoZSA8bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuREJ1cy5FcnJvci5NYXRjaFJ1bGVOb3RGb3VuZDwvbGl0ZXJhbD4KKyAgICAgICAgZXJyb3IgaXMgcmV0dXJuZWQuCisgICAgICAgPC9wYXJhPgorICAgICAgPC9zZWN0Mz4KKworICAgICAgPHNlY3QzIGlkPSJidXMtbWVzc2FnZXMtZ2V0LWlkIj4KKyAgICAgICAgPHRpdGxlPjxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzLkdldElkPC9saXRlcmFsPjwvdGl0bGU+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEFzIGEgbWV0aG9kOgorICAgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIEdldElkIChvdXQgU1RSSU5HIGlkKQorICAgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgIFJlcGx5IGFyZ3VtZW50czoKKyAgICAgICAgPGluZm9ybWFsdGFibGU+CisgICAgICAgICAgPHRncm91cCBjb2xzPSIzIj4KKyAgICAgICAgICAgIDx0aGVhZD4KKyAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnk+QXJndW1lbnQ8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5UeXBlPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8ZW50cnk+RGVzY3JpcHRpb248L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgIDwvdGhlYWQ+CisgICAgICAgICAgICA8dGJvZHk+CisgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5PjA8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5TVFJJTkc8L2VudHJ5PgorICAgICAgICAgICAgICAgIDxlbnRyeT5VbmlxdWUgSUQgaWRlbnRpZnlpbmcgdGhlIGJ1cyBkYWVtb248L2VudHJ5PgorICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgIDwvdGJvZHk+CisgICAgICAgICAgPC90Z3JvdXA+CisgICAgICAgIDwvaW5mb3JtYWx0YWJsZT4KKyAgICAgICAgR2V0cyB0aGUgdW5pcXVlIElEIG9mIHRoZSBidXMuIFRoZSB1bmlxdWUgSUQgaGVyZSBpcyBzaGFyZWQgYW1vbmcgYWxsIGFkZHJlc3NlcyB0aGUKKyAgICAgICAgYnVzIGRhZW1vbiBpcyBsaXN0ZW5pbmcgb24gKFRDUCwgVU5JWCBkb21haW4gc29ja2V0LCBldGMuKSBhbmQgaXRzIGZvcm1hdCBpcyBkZXNjcmliZWQgaW4KKyAgICAgICAgPHhyZWYgbGlua2VuZD0idXVpZHMiLz4uIEVhY2ggYWRkcmVzcyB0aGUgYnVzIGlzIGxpc3RlbmluZyBvbiBhbHNvIGhhcyBpdHMgb3duIHVuaXF1ZQorICAgICAgICBJRCwgYXMgZGVzY3JpYmVkIGluIDx4cmVmIGxpbmtlbmQ9ImFkZHJlc3NlcyIvPi4gVGhlIHBlci1idXMgYW5kIHBlci1hZGRyZXNzIElEcyBhcmUgbm90IHJlbGF0ZWQuCisgICAgICAgIFRoZXJlIGlzIGFsc28gYSBwZXItbWFjaGluZSBJRCwgZGVzY3JpYmVkIGluIDx4cmVmIGxpbmtlbmQ9InN0YW5kYXJkLWludGVyZmFjZXMtcGVlciIvPiBhbmQgcmV0dXJuZWQKKyAgICAgICAgYnkgb3JnLmZyZWVkZXNrdG9wLkRCdXMuUGVlci5HZXRNYWNoaW5lSWQoKS4KKyAgICAgICAgRm9yIGEgZGVza3RvcCBzZXNzaW9uIGJ1cywgdGhlIGJ1cyBJRCBjYW4gYmUgdXNlZCBhcyBhIHdheSB0byB1bmlxdWVseSBpZGVudGlmeSBhIHVzZXIncyBzZXNzaW9uLgorICAgICAgICA8L3BhcmE+CisgICAgICA8L3NlY3QzPgorCisgICAgICA8c2VjdDMgaWQ9ImJ1cy1tZXNzYWdlcy1iZWNvbWUtbW9uaXRvciI+CisgICAgICAgIDx0aXRsZT48bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuREJ1cy5Nb25pdG9yaW5nLkJlY29tZU1vbml0b3I8L2xpdGVyYWw+PC90aXRsZT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgQXMgYSBtZXRob2Q6CisgICAgICAgICAgPHByb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgQmVjb21lTW9uaXRvciAoaW4gQVJSQVkgb2YgU1RSSU5HIHJ1bGUsIGluIFVJTlQzMiBmbGFncykKKyAgICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgIE1lc3NhZ2UgYXJndW1lbnRzOgorICAgICAgICAgIDxpbmZvcm1hbHRhYmxlPgorICAgICAgICAgICAgPHRncm91cCBjb2xzPSIzIj4KKyAgICAgICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+QXJndW1lbnQ8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PlR5cGU8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgPGVudHJ5PkRlc2NyaXB0aW9uPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPC90aGVhZD4KKyAgICAgICAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+MDwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+QVJSQVkgb2YgU1RSSU5HPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5NYXRjaCBydWxlcyB0byBhZGQgdG8gdGhlIGNvbm5lY3Rpb248L2VudHJ5PgorICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+MTwvZW50cnk+CisgICAgICAgICAgICAgICAgICA8ZW50cnk+VUlOVDMyPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgIDxlbnRyeT5Ob3QgdXNlZCwgbXVzdCBiZSAwPC9lbnRyeT4KKyAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgPC90Ym9keT4KKyAgICAgICAgICAgIDwvdGdyb3VwPgorICAgICAgICAgIDwvaW5mb3JtYWx0YWJsZT4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgIENvbnZlcnRzIHRoZSBjb25uZWN0aW9uIGludG8gYSA8ZW1waGFzaXM+bW9uaXRvcgorICAgICAgICAgICAgY29ubmVjdGlvbjwvZW1waGFzaXM+IHdoaWNoIGNhbiBiZSB1c2VkIGFzIGEgZGVidWdnaW5nL21vbml0b3JpbmcKKyAgICAgICAgICB0b29sLiBPbmx5IGEgdXNlciB3aG8gaXMgcHJpdmlsZWdlZCBvbiB0aGlzCisgICAgICAgICAgYnVzIChieSBzb21lIGltcGxlbWVudGF0aW9uLXNwZWNpZmljIGRlZmluaXRpb24pIG1heSBjcmVhdGUKKyAgICAgICAgICBtb25pdG9yIGNvbm5lY3Rpb25zPGZvb3Rub3RlPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgIEluIHRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24sCisgICAgICAgICAgICAgIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gaXMgdGhhdCBlYWNoIHVzZXIgKGlkZW50aWZpZWQgYnkKKyAgICAgICAgICAgICAgbnVtZXJpYyB1c2VyIElEKSBtYXkgbW9uaXRvciB0aGVpciBvd24gc2Vzc2lvbiBidXMsCisgICAgICAgICAgICAgIGFuZCB0aGUgcm9vdCB1c2VyICh1c2VyIElEIHplcm8pIG1heSBtb25pdG9yIHRoZQorICAgICAgICAgICAgICBzeXN0ZW0gYnVzLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgIDwvZm9vdG5vdGU+LgorICAgICAgIDwvcGFyYT4KKworICAgICAgIDxwYXJhPgorICAgICAgICAgTW9uaXRvciBjb25uZWN0aW9ucyBsb3NlIGFsbCB0aGVpciBidXMgbmFtZXMsIGluY2x1ZGluZyB0aGUgdW5pcXVlCisgICAgICAgICBjb25uZWN0aW9uIG5hbWUsIGFuZCBhbGwgdGhlaXIgbWF0Y2ggcnVsZXMuIFNlbmRpbmcgbWVzc2FnZXMgb24gYQorICAgICAgICAgbW9uaXRvciBjb25uZWN0aW9uIGlzIG5vdCBhbGxvd2VkOiBhcHBsaWNhdGlvbnMgc2hvdWxkIHVzZSBhIHByaXZhdGUKKyAgICAgICAgIGNvbm5lY3Rpb24gZm9yIG1vbml0b3JpbmcuCisgICAgICAgPC9wYXJhPgorCisgICAgICAgPHBhcmE+CisgICAgICAgICBNb25pdG9yIGNvbm5lY3Rpb25zIG1heSByZWNlaXZlIGFsbCBtZXNzYWdlcywgZXZlbiBtZXNzYWdlcyB0aGF0CisgICAgICAgICBzaG91bGQgb25seSBoYXZlIGdvbmUgdG8gc29tZSBvdGhlciBjb25uZWN0aW9uICgiZWF2ZXNkcm9wcGluZyIpLgorICAgICAgICAgVGhlIGZpcnN0IGFyZ3VtZW50IGlzIGEgbGlzdCBvZiBtYXRjaCBydWxlcywgd2hpY2ggcmVwbGFjZSBhbnkKKyAgICAgICAgIG1hdGNoIHJ1bGVzIHRoYXQgd2VyZSBwcmV2aW91c2x5IGFjdGl2ZSBmb3IgdGhpcyBjb25uZWN0aW9uLgorICAgICAgICAgVGhlc2UgbWF0Y2ggcnVsZXMgYXJlIGFsd2F5cyB0cmVhdGVkIGFzIGlmIHRoZXkgY29udGFpbmVkIHRoZQorICAgICAgICAgc3BlY2lhbCA8bGl0ZXJhbD5lYXZlc2Ryb3A9J3RydWUnPC9saXRlcmFsPiBtZW1iZXIuCisgICAgICAgPC9wYXJhPgorCisgICAgICAgPHBhcmE+CisgICAgICAgICBBcyBhIHNwZWNpYWwgY2FzZSwgYW4gZW1wdHkgbGlzdCBvZiBtYXRjaCBydWxlcyAod2hpY2ggd291bGQKKyAgICAgICAgIG90aGVyd2lzZSBtYXRjaCBub3RoaW5nLCBtYWtpbmcgdGhlIG1vbml0b3IgdXNlbGVzcykgaXMgdHJlYXRlZAorICAgICAgICAgYXMgYSBzaG9ydGhhbmQgZm9yIG1hdGNoaW5nIGFsbCBtZXNzYWdlcy4KKyAgICAgICA8L3BhcmE+CisKKyAgICAgICA8cGFyYT4KKyAgICAgICAgIFRoZSBzZWNvbmQgYXJndW1lbnQgbWlnaHQgYmUgdXNlZCBmb3IgZmxhZ3MgdG8gaW5mbHVlbmNlIHRoZQorICAgICAgICAgYmVoYXZpb3VyIG9mIHRoZSBtb25pdG9yIGNvbm5lY3Rpb24gaW4gZnV0dXJlIEQtQnVzIHZlcnNpb25zLgorICAgICAgIDwvcGFyYT4KKworICAgICAgIDxwYXJhPgorICAgICAgICAgTWVzc2FnZSBidXMgaW1wbGVtZW50YXRpb25zIHNob3VsZCBhdHRlbXB0IHRvIG1pbmltaXplIHRoZQorICAgICAgICAgc2lkZS1lZmZlY3RzIG9mIG1vbml0b3Jpbmcg4oCUIGluIHBhcnRpY3VsYXIsIHVubGlrZSBvcmRpbmFyeQorICAgICAgICAgZWF2ZXNkcm9wcGluZywgbW9uaXRvcmluZyB0aGUgc3lzdGVtIGJ1cyBkb2VzIG5vdCByZXF1aXJlIHRoZQorICAgICAgICAgYWNjZXNzIGNvbnRyb2wgcnVsZXMgdG8gYmUgcmVsYXhlZCwgd2hpY2ggd291bGQgY2hhbmdlIHRoZSBzZXQKKyAgICAgICAgIG9mIG1lc3NhZ2VzIHRoYXQgY2FuIGJlIGRlbGl2ZXJlZCB0byB0aGVpciAobm9uLW1vbml0b3IpCisgICAgICAgICBkZXN0aW5hdGlvbnMuIEhvd2V2ZXIsIGl0IGlzIHVuYXZvaWRhYmxlIHRoYXQgbW9uaXRvcmluZworICAgICAgICAgd2lsbCBpbmNyZWFzZSB0aGUgbWVzc2FnZSBidXMncyByZXNvdXJjZSBjb25zdW1wdGlvbi4gSW4KKyAgICAgICAgIGVkZ2UgY2FzZXMgd2hlcmUgdGhlcmUgd2FzIGJhcmVseSBlbm91Z2ggdGltZSBvciBtZW1vcnkgd2l0aG91dAorICAgICAgICAgbW9uaXRvcmluZywgdGhpcyBtaWdodCByZXN1bHQgaW4gbWVzc2FnZSBkZWxpdmVyaWVzIGZhaWxpbmcKKyAgICAgICAgIHdoZW4gdGhleSB3b3VsZCBvdGhlcndpc2UgaGF2ZSBzdWNjZWVkZWQuCisgICAgICAgPC9wYXJhPgorICAgICAgPC9zZWN0Mz4KKworICAgIDwvc2VjdDI+CisKKyAgICA8c2VjdDIgaWQ9Im1lc3NhZ2UtYnVzLXByb3BlcnRpZXMiPgorICAgICAgPHRpdGxlPk1lc3NhZ2UgQnVzIFByb3BlcnRpZXM8L3RpdGxlPgorICAgICAgPHBhcmE+CisgICAgICAgIFRoZSBzcGVjaWFsIG1lc3NhZ2UgYnVzIG5hbWUgPGxpdGVyYWw+b3JnLmZyZWVkZXNrdG9wLkRCdXM8L2xpdGVyYWw+CisgICAgICAgIGV4cG9ydHMgc2V2ZXJhbCBwcm9wZXJ0aWVzIChzZWUKKyAgICAgICAgPHhyZWYgbGlua2VuZD0ic3RhbmRhcmQtaW50ZXJmYWNlcy1wcm9wZXJ0aWVzIi8+KSBvbiB0aGUgb2JqZWN0IHBhdGgKKyAgICAgICAgPGxpdGVyYWw+L29yZy9mcmVlZGVza3RvcC9EQnVzPC9saXRlcmFsPi4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHNlY3QzIGlkPSJtZXNzYWdlLWJ1cy1wcm9wZXJ0aWVzLWZlYXR1cmVzIj4KKyAgICAgICAgPHRpdGxlPjxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzLkZlYXR1cmVzPC9saXRlcmFsPjwvdGl0bGU+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEFzIGEgcHJvcGVydHk6CisgICAgICAgICAgPHByb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgUmVhZC1vbmx5IGNvbnN0YW50IEFSUkFZIG9mIFNUUklORyBGZWF0dXJlcworICAgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgVGhpcyBwcm9wZXJ0eSBsaXN0cyBhYnN0cmFjdCDigJxmZWF0dXJlc+KAnSBwcm92aWRlZCBieSB0aGUgbWVzc2FnZQorICAgICAgICAgIGJ1cywgYW5kIGNhbiBiZSB1c2VkIGJ5IGNsaWVudHMgdG8gZGV0ZWN0IHRoZSBjYXBhYmlsaXRpZXMKKyAgICAgICAgICBvZiB0aGUgbWVzc2FnZSBidXMgd2l0aCB3aGljaCB0aGV5IGFyZSBjb21tdW5pY2F0aW5nLgorICAgICAgICAgIFRoaXMgcHJvcGVydHkgd2FzIGFkZGVkIGluIHZlcnNpb24gMS4xMS54IG9mIHRoZSByZWZlcmVuY2UKKyAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbWVzc2FnZSBidXMuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICBJdGVtcyBpbiB0aGUgcmV0dXJuZWQgYXJyYXkgbm90IGNvbnRhaW5pbmcg4oCcLuKAnSBhcmUgZGVmaW5lZAorICAgICAgICAgIGJ5IHRoaXMgc3BlY2lmaWNhdGlvbi4gQnVzIGRhZW1vbiBpbXBsZW1lbnRvcnMgd2lzaGluZyB0byBhZHZlcnRpc2UKKyAgICAgICAgICBmZWF0dXJlcyBub3QgbWVudGlvbmVkIGluIHRoaXMgZG9jdW1lbnQgc2hvdWxkIGVpdGhlciBjb250cmlidXRlCisgICAgICAgICAgcGF0Y2hlcyB0byB0aGlzIHNwZWNpZmljYXRpb24sIG9yIHVzZSBrZXlzIGNvbnRhaW5pbmcg4oCcLuKAnSBhbmQKKyAgICAgICAgICBzdGFydGluZyB3aXRoIHRoZWlyIG93biByZXZlcnNlZCBkb21haW4gbmFtZSwgZm9yIGV4YW1wbGUKKyAgICAgICAgICA8bGl0ZXJhbD5jb20uZXhhbXBsZS5NeUJ1cy5TdWJsaW1pbmFsTWVzc2FnZXM8L2xpdGVyYWw+LgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgVGhlIGZlYXR1cmVzIGN1cnJlbnRseSBkZWZpbmVkIGluIHRoaXMgc3BlY2lmaWNhdGlvbiBhcmUgYXMgZm9sbG93czoKKyAgICAgICAgICA8dmFyaWFibGVsaXN0PgorCisgICAgICAgICAgICA8dmFybGlzdGVudHJ5PgorICAgICAgICAgICAgICA8dGVybT48bGl0ZXJhbD5BcHBBcm1vcjwvbGl0ZXJhbD48L3Rlcm0+CisgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgIFRoaXMgbWVzc2FnZSBidXMgZmlsdGVycyBtZXNzYWdlcyB2aWEgdGhlCisgICAgICAgICAgICAgICAgICA8dWxpbmsgdXJsPSJodHRwOi8vd2lraS5hcHBhcm1vci5uZXQvIj5BcHBBcm1vcjwvdWxpbms+CisgICAgICAgICAgICAgICAgICBzZWN1cml0eSBmcmFtZXdvcmsuIFRoaXMgZmVhdHVyZSBzaG91bGQgb25seSBiZQorICAgICAgICAgICAgICAgICAgYWR2ZXJ0aXNlZCBpZiBBcHBBcm1vciBtZWRpYXRpb24gaXMgZW5hYmxlZCBhbmQKKyAgICAgICAgICAgICAgICAgIGFjdGl2ZSBhdCBydW50aW1lOyBtZXJlbHkgY29tcGlsaW5nIGluIHN1cHBvcnQKKyAgICAgICAgICAgICAgICAgIGZvciBBcHBBcm1vciBzaG91bGQgbm90IHJlc3VsdCBpbiB0aGlzIGZlYXR1cmUgYmVpbmcKKyAgICAgICAgICAgICAgICAgIGFkdmVydGlzZWQgb24gbWVzc2FnZSBidXMgaW5zdGFuY2VzIHdoZXJlIGl0IGlzIGRpc2FibGVkIGJ5CisgICAgICAgICAgICAgICAgICBtZXNzYWdlIGJ1cyBvciBvcGVyYXRpbmcgc3lzdGVtIGNvbmZpZ3VyYXRpb24uCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPC92YXJsaXN0ZW50cnk+CisKKyAgICAgICAgICAgIDx2YXJsaXN0ZW50cnk+CisgICAgICAgICAgICAgIDx0ZXJtPjxsaXRlcmFsPlNFTGludXg8L2xpdGVyYWw+PC90ZXJtPgorICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICBUaGlzIG1lc3NhZ2UgYnVzIGZpbHRlcnMgbWVzc2FnZXMgdmlhIHRoZQorICAgICAgICAgICAgICAgICAgPHVsaW5rIHVybD0iaHR0cHM6Ly9zZWxpbnV4cHJvamVjdC5vcmcvIj5TRUxpbnV4PC91bGluaz4KKyAgICAgICAgICAgICAgICAgIHNlY3VyaXR5IGZyYW1ld29yay4gU2ltaWxhciB0byA8bGl0ZXJhbD5hcHBhcm1vcjwvbGl0ZXJhbD4sCisgICAgICAgICAgICAgICAgICB0aGlzIGZlYXR1cmUgc2hvdWxkIG9ubHkgYmUgYWR2ZXJ0aXNlZCBpZiBTRUxpbnV4IG1lZGlhdGlvbgorICAgICAgICAgICAgICAgICAgaXMgZW5hYmxlZCBhbmQgYWN0aXZlIGF0IHJ1bnRpbWUgKGlmIFNFTGludXggaXMgcGxhY2VkIGluCisgICAgICAgICAgICAgICAgICBwZXJtaXNzaXZlIG1vZGUsIHRoYXQgaXMgc3RpbGwgY29uc2lkZXJlZCB0byBiZSBhY3RpdmUpLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvdmFybGlzdGVudHJ5PgorCisgICAgICAgICAgICA8dmFybGlzdGVudHJ5PgorICAgICAgICAgICAgICA8dGVybT48bGl0ZXJhbD5TeXN0ZW1kQWN0aXZhdGlvbjwvbGl0ZXJhbD48L3Rlcm0+CisgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgIFdoZW4gYXNrZWQgdG8gYWN0aXZhdGUgYSBzZXJ2aWNlIHRoYXQgaGFzIHRoZQorICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+U3lzdGVtZFNlcnZpY2U8L2xpdGVyYWw+IGZpZWxkIGluIGl0cworICAgICAgICAgICAgICAgICAgPGZpbGVuYW1lPi5zZXJ2aWNlPC9maWxlbmFtZT4gZmlsZSwgdGhpcyBtZXNzYWdlIGJ1cyB3aWxsCisgICAgICAgICAgICAgICAgICBjYXJyeSBvdXQgc3lzdGVtZCBhY3RpdmF0aW9uIChmb3IgZGV0YWlscyBzZWUKKyAgICAgICAgICAgICAgICAgIDx4cmVmIGxpbmtlbmQ9Im1lc3NhZ2UtYnVzLXN0YXJ0aW5nLXNlcnZpY2VzLXN5c3RlbWQiLz4pLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvdmFybGlzdGVudHJ5PgorCisgICAgICAgICAgPC92YXJpYWJsZWxpc3Q+CisgICAgICAgIDwvcGFyYT4KKyAgICAgIDwvc2VjdDM+CisKKyAgICAgIDxzZWN0MyBpZD0ibWVzc2FnZS1idXMtcHJvcGVydGllcy1pbnRlcmZhY2VzIj4KKyAgICAgICAgPHRpdGxlPjxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzLkludGVyZmFjZXM8L2xpdGVyYWw+PC90aXRsZT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgQXMgYSBwcm9wZXJ0eToKKyAgICAgICAgICA8cHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICBSZWFkLW9ubHkgY29uc3RhbnQgQVJSQVkgb2YgU1RSSU5HIEludGVyZmFjZXMKKyAgICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgIFRoaXMgcHJvcGVydHkgbGlzdHMgaW50ZXJmYWNlcyBwcm92aWRlZCBieSB0aGUKKyAgICAgICAgICA8bGl0ZXJhbD4vb3JnL2ZyZWVkZXNrdG9wL0RCdXM8L2xpdGVyYWw+IG9iamVjdCwKKyAgICAgICAgICBhbmQgY2FuIGJlIHVzZWQgYnkgY2xpZW50cyB0byBkZXRlY3QgdGhlIGNhcGFiaWxpdGllcworICAgICAgICAgIG9mIHRoZSBtZXNzYWdlIGJ1cyB3aXRoIHdoaWNoIHRoZXkgYXJlIGNvbW11bmljYXRpbmcuCisgICAgICAgICAgVW5saWtlIHRoZSBzdGFuZGFyZCBJbnRyb3NwZWN0YWJsZSBpbnRlcmZhY2UsIHF1ZXJ5aW5nIHRoaXMKKyAgICAgICAgICBwcm9wZXJ0eSBkb2VzIG5vdCByZXF1aXJlIHBhcnNpbmcgWE1MLgorICAgICAgICAgIFRoaXMgcHJvcGVydHkgd2FzIGFkZGVkIGluIHZlcnNpb24gMS4xMS54IG9mIHRoZSByZWZlcmVuY2UKKyAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbWVzc2FnZSBidXMuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICBUaGUgc3RhbmRhcmQgPGxpdGVyYWw+b3JnLmZyZWVkZXNrdG9wLkRCdXM8L2xpdGVyYWw+IGFuZAorICAgICAgICAgIDxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5EQnVzLlByb3BlcnRpZXM8L2xpdGVyYWw+IGludGVyZmFjZXMKKyAgICAgICAgICBhcmUgbm90IGluY2x1ZGVkIGluIHRoZSB2YWx1ZSBvZiB0aGlzIHByb3BlcnR5LCBiZWNhdXNlIHRoZWlyCisgICAgICAgICAgcHJlc2VuY2UgY2FuIGJlIGluZmVycmVkIGZyb20gdGhlIGZhY3QgdGhhdCBhIG1ldGhvZCBjYWxsIG9uCisgICAgICAgICAgPGxpdGVyYWw+b3JnLmZyZWVkZXNrdG9wLkRCdXMuUHJvcGVydGllczwvbGl0ZXJhbD4gYXNraW5nIGZvcgorICAgICAgICAgIHByb3BlcnRpZXMgb2YgPGxpdGVyYWw+b3JnLmZyZWVkZXNrdG9wLkRCdXM8L2xpdGVyYWw+IHdhcworICAgICAgICAgIHN1Y2Nlc3NmdWwuIFRoZSBzdGFuZGFyZCA8bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuREJ1cy5QZWVyPC9saXRlcmFsPgorICAgICAgICAgIGFuZCA8bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuREJ1cy5JbnRyb3NwZWN0YWJsZTwvbGl0ZXJhbD4KKyAgICAgICAgICBpbnRlcmZhY2VzIGFyZSBub3QgaW5jbHVkZWQgaW4gdGhlIHZhbHVlIG9mIHRoaXMgcHJvcGVydHkgZWl0aGVyLAorICAgICAgICAgIGJlY2F1c2UgdGhleSBkbyBub3QgaW5kaWNhdGUgZmVhdHVyZXMgb2YgdGhlIG1lc3NhZ2UgYnVzCisgICAgICAgICAgaW1wbGVtZW50YXRpb24uCisgICAgICAgIDwvcGFyYT4KKyAgICAgIDwvc2VjdDM+CisgICAgPC9zZWN0Mj4KKworICA8L3NlY3QxPgorPCEtLQorICA8YXBwZW5kaXggaWQ9ImltcGxlbWVudGF0aW9uLW5vdGVzIj4KKyAgICA8dGl0bGU+SW1wbGVtZW50YXRpb24gbm90ZXM8L3RpdGxlPgorICAgIDxzZWN0MSBpZD0iaW1wbGVtZW50YXRpb24tbm90ZXMtc3Vic2VjdGlvbiI+CisgICAgICA8dGl0bGU+PC90aXRsZT4KKyAgICAgIDxwYXJhPgorICAgICAgPC9wYXJhPgorICAgIDwvc2VjdDE+CisgIDwvYXBwZW5kaXg+CistLT4KKworICA8Z2xvc3Nhcnk+PHRpdGxlPkdsb3NzYXJ5PC90aXRsZT4KKyAgICA8cGFyYT4KKyAgICAgIFRoaXMgZ2xvc3NhcnkgZGVmaW5lcyBzb21lIG9mIHRoZSB0ZXJtcyB1c2VkIGluIHRoaXMgc3BlY2lmaWNhdGlvbi4KKyAgICA8L3BhcmE+CisKKyAgICA8Z2xvc3NlbnRyeSBpZD0idGVybS1idXMtbmFtZSI+PGdsb3NzdGVybT5CdXMgTmFtZTwvZ2xvc3N0ZXJtPgorICAgICAgPGdsb3NzZGVmPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBUaGUgbWVzc2FnZSBidXMgbWFpbnRhaW5zIGFuIGFzc29jaWF0aW9uIGJldHdlZW4gbmFtZXMgYW5kCisgICAgICAgICAgY29ubmVjdGlvbnMuIChOb3JtYWxseSwgdGhlcmUncyBvbmUgY29ubmVjdGlvbiBwZXIgYXBwbGljYXRpb24uKSAgQQorICAgICAgICAgIGJ1cyBuYW1lIGlzIHNpbXBseSBhbiBpZGVudGlmaWVyIHVzZWQgdG8gbG9jYXRlIGNvbm5lY3Rpb25zLiBGb3IKKyAgICAgICAgICBleGFtcGxlLCB0aGUgaHlwb3RoZXRpY2FsIDxsaXRlcmFsPmNvbS55b3lvZHluZS5TY3JlZW5zYXZlcjwvbGl0ZXJhbD4KKyAgICAgICAgICBuYW1lIG1pZ2h0IGJlIHVzZWQgdG8gc2VuZCBhIG1lc3NhZ2UgdG8gYSBzY3JlZW5zYXZlciBmcm9tIFlveW9keW5lCisgICAgICAgICAgQ29ycG9yYXRpb24uICBBbiBhcHBsaWNhdGlvbiBpcyBzYWlkIHRvIDxmaXJzdHRlcm0+b3duPC9maXJzdHRlcm0+IGEKKyAgICAgICAgICBuYW1lIGlmIHRoZSBtZXNzYWdlIGJ1cyBoYXMgYXNzb2NpYXRlZCB0aGUgYXBwbGljYXRpb24ncyBjb25uZWN0aW9uCisgICAgICAgICAgd2l0aCB0aGUgbmFtZS4gIE5hbWVzIG1heSBhbHNvIGhhdmUgPGZpcnN0dGVybT5xdWV1ZWQKKyAgICAgICAgICBvd25lcnM8L2ZpcnN0dGVybT4gKHNlZSA8eHJlZiBsaW5rZW5kPSJ0ZXJtLXF1ZXVlZC1vd25lciIvPikuCisgICAgICAgICAgICBUaGUgYnVzIGFzc2lnbnMgYSB1bmlxdWUgbmFtZSB0byBlYWNoIGNvbm5lY3Rpb24sCisgICAgICAgICAgICBzZWUgPHhyZWYgbGlua2VuZD0idGVybS11bmlxdWUtbmFtZSIvPi4gT3RoZXIgbmFtZXMKKyAgICAgICAgICAgICAgY2FuIGJlIHRob3VnaHQgb2YgYXMgIndlbGwta25vd24gbmFtZXMiIGFuZCBhcmUKKyAgICAgICAgICAgICAgdXNlZCB0byBmaW5kIGFwcGxpY2F0aW9ucyB0aGF0IG9mZmVyIHNwZWNpZmljIGZ1bmN0aW9uYWxpdHkuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICBTZWUgPHhyZWYgbGlua2VuZD0ibWVzc2FnZS1wcm90b2NvbC1uYW1lcy1idXMiLz4gZm9yIGRldGFpbHMgb2YKKyAgICAgICAgICB0aGUgc3ludGF4IGFuZCBuYW1pbmcgY29udmVudGlvbnMgZm9yIGJ1cyBuYW1lcy4KKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9nbG9zc2RlZj4KKyAgICA8L2dsb3NzZW50cnk+CisKKyAgICA8Z2xvc3NlbnRyeSBpZD0idGVybS1tZXNzYWdlIj48Z2xvc3N0ZXJtPk1lc3NhZ2U8L2dsb3NzdGVybT4KKyAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgQSBtZXNzYWdlIGlzIHRoZSBhdG9taWMgdW5pdCBvZiBjb21tdW5pY2F0aW9uIHZpYSB0aGUgRC1CdXMKKyAgICAgICAgICBwcm90b2NvbC4gSXQgY29uc2lzdHMgb2YgYSA8Zmlyc3R0ZXJtPmhlYWRlcjwvZmlyc3R0ZXJtPiBhbmQgYQorICAgICAgICAgIDxmaXJzdHRlcm0+Ym9keTwvZmlyc3R0ZXJtPjsgdGhlIGJvZHkgaXMgbWFkZSB1cCBvZgorICAgICAgICAgIDxmaXJzdHRlcm0+YXJndW1lbnRzPC9maXJzdHRlcm0+LgorICAgICAgICA8L3BhcmE+CisgICAgICA8L2dsb3NzZGVmPgorICAgIDwvZ2xvc3NlbnRyeT4KKworICAgIDxnbG9zc2VudHJ5IGlkPSJ0ZXJtLW1lc3NhZ2UtYnVzIj48Z2xvc3N0ZXJtPk1lc3NhZ2UgQnVzPC9nbG9zc3Rlcm0+CisgICAgICA8Z2xvc3NkZWY+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIFRoZSBtZXNzYWdlIGJ1cyBpcyBhIHNwZWNpYWwgYXBwbGljYXRpb24gdGhhdCBmb3J3YXJkcworICAgICAgICAgIG9yIHJvdXRlcyBtZXNzYWdlcyBiZXR3ZWVuIGEgZ3JvdXAgb2YgYXBwbGljYXRpb25zCisgICAgICAgICAgY29ubmVjdGVkIHRvIHRoZSBtZXNzYWdlIGJ1cy4gSXQgYWxzbyBtYW5hZ2VzCisgICAgICAgICAgPGZpcnN0dGVybT5uYW1lczwvZmlyc3R0ZXJtPiB1c2VkIGZvciByb3V0aW5nCisgICAgICAgICAgbWVzc2FnZXMuCisgICAgICAgIDwvcGFyYT4KKyAgICAgIDwvZ2xvc3NkZWY+CisgICAgPC9nbG9zc2VudHJ5PgorCisgICAgPGdsb3NzZW50cnkgaWQ9InRlcm0tbmFtZSI+PGdsb3NzdGVybT5OYW1lPC9nbG9zc3Rlcm0+CisgICAgICA8Z2xvc3NkZWY+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIFNlZSA8eHJlZiBsaW5rZW5kPSJ0ZXJtLWJ1cy1uYW1lIi8+LiAiTmFtZSIgbWF5CisgICAgICAgICAgICBhbHNvIGJlIHVzZWQgdG8gcmVmZXIgdG8gc29tZSBvZiB0aGUgb3RoZXIgbmFtZXMKKyAgICAgICAgICAgIGluIEQtQnVzLCBzdWNoIGFzIGludGVyZmFjZSBuYW1lcy4KKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9nbG9zc2RlZj4KKyAgICA8L2dsb3NzZW50cnk+CisKKyAgICA8Z2xvc3NlbnRyeSBpZD0ibmFtZXNwYWNlIj48Z2xvc3N0ZXJtPk5hbWVzcGFjZTwvZ2xvc3N0ZXJtPgorICAgICAgPGdsb3NzZGVmPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBVc2VkIHRvIHByZXZlbnQgY29sbGlzaW9ucyB3aGVuIGRlZmluaW5nIG5ldyBpbnRlcmZhY2VzLCBidXMgbmFtZXMKKyAgICAgICAgICBldGMuIFRoZSBjb252ZW50aW9uIHVzZWQgaXMgdGhlIHNhbWUgb25lIEphdmEgdXNlcyBmb3IgZGVmaW5pbmcKKyAgICAgICAgICBjbGFzc2VzOiBhIHJldmVyc2VkIGRvbWFpbiBuYW1lLgorICAgICAgICAgIFNlZSA8eHJlZiBsaW5rZW5kPSJtZXNzYWdlLXByb3RvY29sLW5hbWVzLWJ1cyIvPiwKKyAgICAgICAgICA8eHJlZiBsaW5rZW5kPSJtZXNzYWdlLXByb3RvY29sLW5hbWVzLWludGVyZmFjZSIvPiwKKyAgICAgICAgICA8eHJlZiBsaW5rZW5kPSJtZXNzYWdlLXByb3RvY29sLW5hbWVzLWVycm9yIi8+LAorICAgICAgICAgIDx4cmVmIGxpbmtlbmQ9Im1lc3NhZ2UtcHJvdG9jb2wtbWFyc2hhbGluZy1vYmplY3QtcGF0aCIvPi4KKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9nbG9zc2RlZj4KKyAgICA8L2dsb3NzZW50cnk+CisKKyAgICA8Z2xvc3NlbnRyeSBpZD0idGVybS1vYmplY3QiPjxnbG9zc3Rlcm0+T2JqZWN0PC9nbG9zc3Rlcm0+CisgICAgICA8Z2xvc3NkZWY+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEVhY2ggYXBwbGljYXRpb24gY29udGFpbnMgPGZpcnN0dGVybT5vYmplY3RzPC9maXJzdHRlcm0+LCB3aGljaCBoYXZlCisgICAgICAgICAgPGZpcnN0dGVybT5pbnRlcmZhY2VzPC9maXJzdHRlcm0+IGFuZAorICAgICAgICAgIDxmaXJzdHRlcm0+bWV0aG9kczwvZmlyc3R0ZXJtPi4gT2JqZWN0cyBhcmUgcmVmZXJyZWQgdG8gYnkgYSBuYW1lLAorICAgICAgICAgIGNhbGxlZCBhIDxmaXJzdHRlcm0+cGF0aDwvZmlyc3R0ZXJtPi4KKyAgICAgICAgPC9wYXJhPgorICAgICAgPC9nbG9zc2RlZj4KKyAgICA8L2dsb3NzZW50cnk+CisKKyAgICA8Z2xvc3NlbnRyeSBpZD0ib25lLXRvLW9uZSI+PGdsb3NzdGVybT5PbmUtdG8tT25lPC9nbG9zc3Rlcm0+CisgICAgICA8Z2xvc3NkZWY+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEFuIGFwcGxpY2F0aW9uIHRhbGtpbmcgZGlyZWN0bHkgdG8gYW5vdGhlciBhcHBsaWNhdGlvbiwgd2l0aG91dCBnb2luZworICAgICAgICAgIHRocm91Z2ggYSBtZXNzYWdlIGJ1cy4gT25lLXRvLW9uZSBjb25uZWN0aW9ucyBtYXkgYmUgInBlZXIgdG8gcGVlciIgb3IKKyAgICAgICAgICAiY2xpZW50IHRvIHNlcnZlci4iIFRoZSBELUJ1cyBwcm90b2NvbCBoYXMgbm8gY29uY2VwdCBvZiBjbGllbnQKKyAgICAgICAgICB2cy4gc2VydmVyIGFmdGVyIGEgY29ubmVjdGlvbiBoYXMgYXV0aGVudGljYXRlZDsgdGhlIGZsb3cgb2YgbWVzc2FnZXMKKyAgICAgICAgICBpcyBzeW1tZXRyaWNhbCAoZnVsbCBkdXBsZXgpLgorICAgICAgICA8L3BhcmE+CisgICAgICA8L2dsb3NzZGVmPgorICAgIDwvZ2xvc3NlbnRyeT4KKworICAgIDxnbG9zc2VudHJ5IGlkPSJ0ZXJtLXBhdGgiPjxnbG9zc3Rlcm0+UGF0aDwvZ2xvc3N0ZXJtPgorICAgICAgPGdsb3NzZGVmPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBPYmplY3QgcmVmZXJlbmNlcyAob2JqZWN0IG5hbWVzKSBpbiBELUJ1cyBhcmUgb3JnYW5pemVkIGludG8gYQorICAgICAgICAgIGZpbGVzeXN0ZW0tc3R5bGUgaGllcmFyY2h5LCBzbyBlYWNoIG9iamVjdCBpcyBuYW1lZCBieSBhIHBhdGguIEFzIGluCisgICAgICAgICAgTERBUCwgdGhlcmUncyBubyBkaWZmZXJlbmNlIGJldHdlZW4gImZpbGVzIiBhbmQgImRpcmVjdG9yaWVzIjsgYSBwYXRoCisgICAgICAgICAgY2FuIHJlZmVyIHRvIGFuIG9iamVjdCwgd2hpbGUgc3RpbGwgaGF2aW5nIGNoaWxkIG9iamVjdHMgYmVsb3cgaXQuCisgICAgICAgIDwvcGFyYT4KKyAgICAgIDwvZ2xvc3NkZWY+CisgICAgPC9nbG9zc2VudHJ5PgorCisgICAgPGdsb3NzZW50cnkgaWQ9InRlcm0tcXVldWVkLW93bmVyIj48Z2xvc3N0ZXJtPlF1ZXVlZCBOYW1lIE93bmVyPC9nbG9zc3Rlcm0+CisgICAgICA8Z2xvc3NkZWY+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEVhY2ggYnVzIG5hbWUgaGFzIGEgcHJpbWFyeSBvd25lcjsgbWVzc2FnZXMgc2VudCB0byB0aGUgbmFtZSBnbyB0byB0aGUKKyAgICAgICAgICBwcmltYXJ5IG93bmVyLiBIb3dldmVyLCBjZXJ0YWluIG5hbWVzIGFsc28gbWFpbnRhaW4gYSBxdWV1ZSBvZgorICAgICAgICAgIHNlY29uZGFyeSBvd25lcnMgIndhaXRpbmcgaW4gdGhlIHdpbmdzLiIgSWYgdGhlIHByaW1hcnkgb3duZXIgcmVsZWFzZXMKKyAgICAgICAgICB0aGUgbmFtZSwgdGhlbiB0aGUgZmlyc3Qgc2Vjb25kYXJ5IG93bmVyIGluIHRoZSBxdWV1ZSBhdXRvbWF0aWNhbGx5CisgICAgICAgICAgYmVjb21lcyB0aGUgbmV3IG93bmVyIG9mIHRoZSBuYW1lLgorICAgICAgICA8L3BhcmE+CisgICAgICA8L2dsb3NzZGVmPgorICAgIDwvZ2xvc3NlbnRyeT4KKworICAgIDxnbG9zc2VudHJ5IGlkPSJ0ZXJtLXNlcnZpY2UiPjxnbG9zc3Rlcm0+U2VydmljZTwvZ2xvc3N0ZXJtPgorICAgICAgPGdsb3NzZGVmPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBBIHNlcnZpY2UgaXMgYW4gZXhlY3V0YWJsZSB0aGF0IGNhbiBiZSBsYXVuY2hlZCBieSB0aGUgYnVzIGRhZW1vbi4KKyAgICAgICAgICBTZXJ2aWNlcyBub3JtYWxseSBndWFyYW50ZWUgc29tZSBwYXJ0aWN1bGFyIGZlYXR1cmVzLCBmb3IgZXhhbXBsZSB0aGV5CisgICAgICAgICAgbWF5IGd1YXJhbnRlZSB0aGF0IHRoZXkgd2lsbCByZXF1ZXN0IGEgc3BlY2lmaWMgbmFtZSBzdWNoIGFzCisgICAgICAgICAgImNvbS5leGFtcGxlLlNjcmVlbnNhdmVyMSIsIGhhdmUgYSBzaW5nbGV0b24gb2JqZWN0CisgICAgICAgICAgIi9jb20vZXhhbXBsZS9TY3JlZW5zYXZlcjEiLCBhbmQgdGhhdCBvYmplY3Qgd2lsbCBpbXBsZW1lbnQgdGhlCisgICAgICAgICAgaW50ZXJmYWNlICJjb20uZXhhbXBsZS5TY3JlZW5zYXZlcjEuQ29udHJvbCIuCisgICAgICAgIDwvcGFyYT4KKyAgICAgIDwvZ2xvc3NkZWY+CisgICAgPC9nbG9zc2VudHJ5PgorCisgICAgPGdsb3NzZW50cnkgaWQ9InRlcm0tc2VydmljZS1kZXNjcmlwdGlvbi1maWxlcyI+PGdsb3NzdGVybT5TZXJ2aWNlIERlc2NyaXB0aW9uIEZpbGVzPC9nbG9zc3Rlcm0+CisgICAgICA8Z2xvc3NkZWY+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgICIuc2VydmljZSBmaWxlcyIgdGVsbCB0aGUgYnVzIGFib3V0IHNlcnZpY2UgYXBwbGljYXRpb25zIHRoYXQgY2FuIGJlCisgICAgICAgICAgbGF1bmNoZWQgKHNlZSA8eHJlZiBsaW5rZW5kPSJ0ZXJtLXNlcnZpY2UiLz4pLiBNb3N0IGltcG9ydGFudGx5IHRoZXkKKyAgICAgICAgICBwcm92aWRlIGEgbWFwcGluZyBmcm9tIGJ1cyBuYW1lcyB0byBzZXJ2aWNlcyB0aGF0IHdpbGwgcmVxdWVzdCB0aG9zZQorICAgICAgICAgICAgbmFtZXMgd2hlbiB0aGV5IHN0YXJ0IHVwLgorICAgICAgICA8L3BhcmE+CisgICAgICA8L2dsb3NzZGVmPgorICAgIDwvZ2xvc3NlbnRyeT4KKworICAgIDxnbG9zc2VudHJ5IGlkPSJ0ZXJtLXVuaXF1ZS1uYW1lIj48Z2xvc3N0ZXJtPlVuaXF1ZSBDb25uZWN0aW9uIE5hbWU8L2dsb3NzdGVybT4KKyAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgVGhlIHNwZWNpYWwgbmFtZSBhdXRvbWF0aWNhbGx5IGFzc2lnbmVkIHRvIGVhY2ggY29ubmVjdGlvbiBieSB0aGUKKyAgICAgICAgICBtZXNzYWdlIGJ1cy4gVGhpcyBuYW1lIHdpbGwgbmV2ZXIgY2hhbmdlIG93bmVyLCBhbmQgd2lsbCBiZSB1bmlxdWUKKyAgICAgICAgICAobmV2ZXIgcmV1c2VkIGR1cmluZyB0aGUgbGlmZXRpbWUgb2YgdGhlIG1lc3NhZ2UgYnVzKS4KKyAgICAgICAgICBJdCB3aWxsIGJlZ2luIHdpdGggYSAnOicgY2hhcmFjdGVyLgorICAgICAgICA8L3BhcmE+CisgICAgICA8L2dsb3NzZGVmPgorICAgIDwvZ2xvc3NlbnRyeT4KKworICA8L2dsb3NzYXJ5PgorPC9hcnRpY2xlPgpkaWZmIC0tZ2l0IGEvZG9jL2RidXMtdGVzdC1wbGFuLnhtbCBiL2RvYy9kYnVzLXRlc3QtcGxhbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNlZmQyYwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9kYnVzLXRlc3QtcGxhbi54bWwKQEAgLTAsMCArMSwyMzIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgc3RhbmRhbG9uZT0ibm8iPz4KKzwhRE9DVFlQRSBhcnRpY2xlIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBEb2NCb29rIFhNTCBWNC40Ly9FTiIKKyJodHRwOi8vd3d3Lm9hc2lzLW9wZW4ub3JnL2RvY2Jvb2sveG1sLzQuNC9kb2Nib29reC5kdGQiCitbCitdPgorCis8YXJ0aWNsZSBpZD0iaW5kZXgiPgorICA8YXJ0aWNsZWluZm8+CisgICAgPHRpdGxlPkQtQnVzIFRlc3QgUGxhbjwvdGl0bGU+CisgICAgPGRhdGU+MTQgRmVicnVhcnkgMjAwMzwvZGF0ZT4KKyAgICA8YXV0aG9yZ3JvdXA+CisgICAgICA8YXV0aG9yPgorCTxmaXJzdG5hbWU+QW5kZXJzPC9maXJzdG5hbWU+CisJPHN1cm5hbWU+Q2FybHNzb248L3N1cm5hbWU+CisJPGFmZmlsaWF0aW9uPgorCSAgPG9yZ25hbWU+Q29kZUZhY3RvcnkgQUI8L29yZ25hbWU+CisJICA8YWRkcmVzcz48ZW1haWw+YW5kZXJzY2FAY29kZWZhY3Rvcnkuc2U8L2VtYWlsPjwvYWRkcmVzcz4KKwk8L2FmZmlsaWF0aW9uPgorICAgICAgPC9hdXRob3I+CisgICAgPC9hdXRob3Jncm91cD4KKyAgPC9hcnRpY2xlaW5mbz4KKyAgPHNlY3QxIGlkPSJpbnRyb2R1Y3Rpb24iPgorICAgIDx0aXRsZT5JbnRyb2R1Y3Rpb248L3RpdGxlPgorICAgIDxwYXJhPgorICAgICAgVGhpcyBkb2N1bWVudCB0cmllcyB0byBleHBsYWluIHRoZSBkZXRhaWxzIG9mIHRoZSB0ZXN0IHBsYW4gZm9yIEQtQnVzCisgICAgPC9wYXJhPgorICAgIDxzZWN0MiBpZD0iaW1wb3J0YW5jZS1vZi10ZXN0aW5nIj4KKyAgICAgIDx0aXRsZT5UaGUgaW1wb3J0YW5jZSBvZiB0ZXN0aW5nPC90aXRsZT4KKyAgICAgIDxwYXJhPgorICAgICAgICBBcyB3aXRoIGFueSBiaWcgbGlicmFyeSBvciBwcm9ncmFtLCB0ZXN0aW5nIGlzIGltcG9ydGFudC4gSXQKKyAgICAgICAgY2FuIGhlbHAgZmluZCBidWdzIGFuZCByZWdyZXNzaW9ucyBhbmQgbWFrZSB0aGUgY29kZSBiZXR0ZXIKKyAgICAgICAgb3ZlcmFsbC4gCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgRC1CdXMgaXMgYSBsYXJnZSBhbmQgY29tcGxleCBwaWVjZSBvZiBzb2Z0d2FyZSAoYWJvdXQgMjUsMDAwCisgICAgICAgIGxpbmVzIG9mIGNvZGUgZm9yIHRoZSBjbGllbnQgbGlicmFyeSwgYW5kIDIsNTAwIGxpbmVzIG9mIGNvZGUKKyAgICAgICAgZm9yIHRoZSBidXMgZGFlbW9uKSBhbmQgaXQncyB0aGVyZWZvcmUgaW1wb3J0YW50IHRvIHRyeSB0byBtYWtlIHN1cmUKKyAgICAgICAgdGhhdCBhbGwgcGFydHMgb2YgdGhlIHNvZnR3YXJlIGlzIGZ1bmN0aW9uaW5nIGNvcnJlY3RseS4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBELUJ1cyBjYW4gYmUgYnVpbHQgd2l0aCBzdXBwb3J0IGZvciB0ZXN0aW5nIGJ5IHBhc3NpbmcKKyAgICAgICAgPGxpdGVyYWw+LS1lbmFibGUtdGVzdHM8L2xpdGVyYWw+LiB0byB0aGUgY29uZmlndXJlIHNjcmlwdC4gSXQKKyAgICAgICAgaXMgcmVjb21tZW5kZWQgdGhhdCBwcm9kdWN0aW9uIHN5c3RlbXMgYnVpbGQgd2l0aG91dCB0ZXN0aW5nCisgICAgICAgIHNpbmNlIHRoYXQgcmVkdWNlcyB0aGUgRC1CdXMgY2xpZW50IGxpYnJhcnkgc2l6ZS4KKyAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3QyPgorICA8L3NlY3QxPgorICA8c2VjdDEgaWQ9ImNsaWVudC1saWJyYXJ5Ij4KKyAgICA8dGl0bGU+VGVzdGluZyB0aGUgRC1CdXMgY2xpZW50IGxpYnJhcnk8L3RpdGxlPgorICAgIDxwYXJhPgorICAgICAgVGhlIHRlc3RzIGZvciB0aGUgY2xpZW50IGxpYnJhcnkgY29uc2lzdCBvZiB0aGUgdGVzdC1kYnVzCisgICAgICBwcm9ncmFtIHdoaWNoIGlzIGEgdW5pdCB0ZXN0IGZvciBhbGwgYXNwZWN0cyBvZiB0aGUgY2xpZW50CisgICAgICBsaWJyYXJ5LiBXaGVuZXZlciBhIGJ1ZyBpbiB0aGUgY2xpZW50IGxpYnJhcnkgaXMgZm91bmQgYW5kCisgICAgICBmaXhlZCwgYSB0ZXN0IGlzIGFkZGVkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBidWcgd29uJ3Qgb2NjdXIgYWdhaW4uCisgICAgPC9wYXJhPgorICAgIDxzZWN0MiBpZD0iZGF0YS1zdHJ1Y3R1cmVzIj4KKyAgICAgIDx0aXRsZT5EYXRhIFN0cnVjdHVyZXM8L3RpdGxlPgorICAgICAgPHBhcmE+CisgICAgICBUaGUgRC1CdXMgY2xpZW50IGxpYnJhcnkgY29uc2lzdHMgb2Ygc29tZSBkYXRhIHN0cnVjdHVyZXMgdGhhdAorICAgICAgYXJlIHVzZWQgaW50ZXJuYWxseTsgYSBsaW5rZWQgbGlzdCBjbGFzcywgYSBoYXNodGFibGUgY2xhc3MgYW5kCisgICAgICBhIHN0cmluZyBjbGFzcy4gQWxsIGFzcGVjdHMgb2YgdGhvc2UgYXJlIHRlc3RlZCBieSB0ZXN0LWRidXMuCisgICAgICA8L3BhcmE+CisgICAgPC9zZWN0Mj4KKyAgICA8c2VjdDIgaWQ9Im1lc3NhZ2UtbG9hZGVyIj4KKyAgICAgIDx0aXRsZT5NZXNzYWdlIGxvYWRlcjwvdGl0bGU+CisgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIG1lc3NhZ2UgbG9hZGVyIGlzIHRoZSBwYXJ0IG9mIEQtQnVzIHRoYXQgdGFrZXMgbWVzc2FnZXMgaW4KKyAgICAgICAgcmF3IGNoYXJhY3RlciBmb3JtIGFuZCBwYXJzZXMgdGhlbSwgdHVybmluZyB0aGVtIGludG8gREJ1c01lc3NhZ2VzLgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIFRoaXMgaXMgb25lIG9mIHRoZSBwYXJ0cyBvZiBELUJ1cyB0aGF0CisgICAgICAgIDxlbXBoYXNpcz5tdXN0PC9lbXBoYXNpcz4gYmUgYWJzb2x1dGVseSBidWctZnJlZSBhbmQKKyAgICAgICAgcm9idXN0LiBUaGUgbWVzc2FnZSBsb2FkZXIgc2hvdWxkIGJlIGFibGUgdG8gaGFuZGxlIGludmFsaWQKKyAgICAgICAgYW5kIGluY29tcGxldGUgbWVzc2FnZXMgd2l0aG91dCBjcmFzaGluZy4gTm90IGRvaW5nIHNvIGlzIGEKKyAgICAgICAgc2VyaW91cyBpc3N1ZSBhbmQgY2FuIGVhc2lseSByZXN1bHQgaW4gRC1CdXMgYmVpbmcgZXhwbG9pdGFibGUKKyAgICAgICAgdG8gRG9TIGF0dGFja3MuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgVG8gc29sdmUgdGhlc2UgcHJvYmxlbXMsIHRoZXJlIGlzIGEgdGVzdGluZyBmZWF0dXJlIGNhbGxlZCB0aGUKKyAgICAgICAgTWVzc2FnZSBCdWlsZGVyLiBUaGUgbWVzc2FnZSBidWlsZGVyIGNhbiB0YWtlIGEgc2VyaWFsaXplZAorICAgICAgICBtZXNzYWdlIGluIHN0cmluZy1mb3JtIGFuZCBjb252ZXJ0IGl0IGludG8gYSByYXcgY2hhcmFjdGVyCisgICAgICAgIHN0cmluZyB3aGljaCBjYW4gdGhlbiBiZSBsb2FkZWQgYnkgdGhlIG1lc3NhZ2UgbG9hZGVyLiAKKyAgICAgIDwvcGFyYT4KKyAgICAgIDxmaWd1cmU+CisJPHRpdGxlPkV4YW1wbGUgb2YgYSBtZXNzYWdlIGluIHN0cmluZyBmb3JtPC90aXRsZT4KKwk8cHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgIyBTdGFuZGFyZCBvcmcuZnJlZWRlc2t0b3AuREJ1cy5IZWxsbyBtZXNzYWdlCisKKyAgICAgICAgICBWQUxJRF9IRUFERVIKKyAgICAgICAgICBGSUVMRF9OQU1FIG5hbWUKKyAgICAgICAgICBUWVBFIFNUUklORworICAgICAgICAgIFNUUklORyAnb3JnLmZyZWVkZXNrdG9wLkRCdXMuSGVsbG8nCisgICAgICAgICAgRklFTERfTkFNRSBzcnZjCisgICAgICAgICAgVFlQRSBTVFJJTkcKKyAgICAgICAgICBTVFJJTkcgJ29yZy5mcmVlZGVza3RvcC5EQnVzJworICAgICAgICAgIEFMSUdOIDgKKyAgICAgICAgICBFTkRfTEVOR1RIIEhlYWRlcgorICAgICAgICAgIFNUQVJUX0xFTkdUSCBCb2R5CisgICAgICAgICAgRU5EX0xFTkdUSCBCb2R5CisgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICA8L2ZpZ3VyZT4KKyAgICAgIDxwYXJhPgorICAgICAgICBUaGUgZmlsZSBmb3JtYXQgb2YgbWVzc2FnZXMgaW4gc3RyaW5nIGZvcm0gaXMgZG9jdW1lbnRlZCBpbgorICAgICAgICB0aGUgRC1CdXMgUmVmZXJlbmNlIE1hbnVhbC4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBUaGUgbWVzc2FnZSB0ZXN0IHBhcnQgb2YgdGVzdC1kYnVzIGlzIHVzaW5nIHRoZSBtZXNzYWdlCisgICAgICAgIGJ1aWxkZXIgdG8gYnVpbGQgZGlmZmVyZW50IGtpbmRzIG9mIG1lc3NhZ2VzLCBib3RoIHZhbGlkLAorICAgICAgICBpbnZhbGlkLCBhbmQgaW52YWxpZCBvbmVzLCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgbG9hZGVyIHdvbid0CisgICAgICAgIGNyYXNoIG9yIGxlYWsgbWVtb3J5IG9mIGFueSBvZiB0aG9zZSwgYW5kIHRoYXQgdGhlIGxvYWRlcgorICAgICAgICBrbm93cyBpZiBhIG1lc3NhZ2UgaXMgdmFsaWQgb3Igbm90LgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIFRoZXJlIGlzIGFsc28gYSB0ZXN0IHByb2dyYW0gY2FsbGVkCisgICAgICAgIDxsaXRlcmFsPmJyZWFrLWxvYWRlcjwvbGl0ZXJhbD4gdGhhdCBsb2FkcyBhIG1lc3NhZ2UgaW4KKyAgICAgICAgc3RyaW5nLWZvcm0gaW50byByYXcgY2hhcmFjdGVyIGZvcm0gdXNpbmcgdGhlIG1lc3NhZ2UKKyAgICAgICAgYnVpbGRlci4gSXQgdGhlbiByYW5kb21seSBjaGFuZ2VzIHRoZSBtZXNzYWdlLCBpdCBjYW4gZm9yCisgICAgICAgIGV4YW1wbGUgcmVwbGFjZSBzaW5nbGUgYnl0ZXMgb2YgZGF0YSBvciBtb2RpZnkgdGhlIGxlbmd0aCBvZgorICAgICAgICB0aGUgbWVzc2FnZS4gVGhpcyBpcyB0byBzaW11bGF0ZSBuZXR3b3JrIGVycm9ycy4gVGhlCisgICAgICAgIGJyZWFrLWxvYWRlciBwcm9ncmFtIHNhdmVzIGFsbCB0aGUgbWVzc2FnZXMgbGVhZGluZyB0byBlcnJvcnMKKyAgICAgICAgc28gaXQgY2FuIGVhc2lseSBiZSBydW4gZm9yIGEgbG9uZyBwZXJpb2Qgb2YgdGltZS4KKyAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3QyPgorICAgIDxzZWN0MiBpZD0iYXV0aGVudGljYXRpb24iPgorICAgICAgPHRpdGxlPkF1dGhlbnRpY2F0aW9uPC90aXRsZT4KKyAgICAgIDxwYXJhPgorICAgICAgICBGb3IgdGVzdGluZyBhdXRoZW50aWNhdGlvbiwgdGhlcmUgaXMgYSB0ZXN0aW5nIGZlYXR1cmUgdGhhdAorICAgICAgICBjYW4gcmVhZCBhdXRoZW50aWNhdGlvbiBzZXF1ZW5jZXMgZnJvbSBhIGZpbGUgYW5kIHBsYXkgdGhlbQorICAgICAgICBiYWNrIHRvIGEgZHVtbXkgc2VydmVyIGFuZCBjbGllbnQgdG8gbWFrZSBzdXJlIHRoYXQKKyAgICAgICAgYXV0aGVudGljYXRpb24gaXMgd29ya2luZyBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmljYXRpb24uCisgICAgICA8L3BhcmE+CisgICAgICA8ZmlndXJlPgorCTx0aXRsZT5FeGFtcGxlIG9mIGFuIGF1dGhlbnRpY2F0aW9uIHNjcmlwdDwvdGl0bGU+CisJPHByb2dyYW1saXN0aW5nPgorICAgICAgICAgICMjIHRoaXMgdGVzdHMgYSBzdWNjZXNzZnVsIGF1dGggb2YgdHlwZSBFWFRFUk5BTAorICAgICAgICAgIAorICAgICAgICAgIFNFUlZFUgorICAgICAgICAgIFNFTkQgJ0FVVEggRVhURVJOQUwgVVNFUk5BTUVfSEVYJworICAgICAgICAgIEVYUEVDVF9DT01NQU5EIE9LCisgICAgICAgICAgRVhQRUNUX1NUQVRFIFdBSVRJTkdfRk9SX0lOUFVUCisgICAgICAgICAgU0VORCAnQkVHSU4nCisgICAgICAgICAgRVhQRUNUX1NUQVRFIEFVVEhFTlRJQ0FURUQKKyAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgIDwvZmlndXJlPgorICAgIDwvc2VjdDI+CisgIDwvc2VjdDE+CisgIDxzZWN0MSBpZD0iZGFlbW9uIj4KKyAgICA8dGl0bGU+VGVzdGluZyB0aGUgRC1CdXMgYnVzIGRhZW1vbjwvdGl0bGU+CisgICAgPHBhcmE+CisgICAgICBTaW5jZSB0aGUgRC1CdXMgYnVzIGRhZW1vbiBpcyB1c2luZyB0aGUgRC1CdXMgY2xpZW50IGxpYnJhcnkgaXQKKyAgICAgIHdpbGwgYmVuZWZpdCBmcm9tIGFsbCB0ZXN0cyBkb25lIG9uIHRoZSBjbGllbnQgbGlicmFyeSwgYnV0CisgICAgICB0aGVyZSBpcyBzdGlsbCB0aGUgaXNzdWUgb2YgdGVzdGluZyBjbGllbnQtc2VydmVyIGNvbW11bmljYXRpb24uCisgICAgICBUaGlzIGlzIG1vcmUgY29tcGxpY2F0ZWQgc2luY2UgaXQgaXQgbWF5IHJlcXVpcmUgYW5vdGhlciBwcm9jZXNzCisgICAgICBydW5uaW5nLgorICAgIDwvcGFyYT4KKyAgICA8c2VjdDIgaWQ9ImRlYnVnLXRyYW5zcG9ydCI+CisgICAgICA8dGl0bGU+VGhlIGRlYnVnIHRyYW5zcG9ydDwvdGl0bGU+CisgICAgICA8cGFyYT4KKyAgICAgICAgSW4gRC1CdXMsIGEgPGVtcGhhc2lzPnRyYW5zcG9ydDwvZW1waGFzaXM+IGlzIGEgY2xhc3MgdGhhdAorICAgICAgICBoYW5kbGVzIHNlbmRpbmcgYW5kIHJlY2VpdmluZyByYXcgZGF0YSBvdmVyIGEgY2VydGFpbgorICAgICAgICBtZWRpdW0uIFRoZSB0cmFuc3BvcnQgdGhhdCBpcyB1c2VkIG1vc3QgaW4gRC1CdXMgaXMgdGhlIFVOSVgKKyAgICAgICAgdHJhbnNwb3J0IHdpdGggc2VuZHMgYW5kIHJlY2V2aWVzIGRhdGEgb3ZlciBhIFVOSVggc29ja2V0LiBBCisgICAgICAgIHRyYW5zcG9ydCB0aGF0IHR1bm5lbHMgZGF0YSB0aHJvdWdoIFgxMSBjbGllbnQgbWVzc2FnZXMgaXMKKyAgICAgICAgYWxzbyB1bmRlciBkZXZlbG9wbWVudC4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBUaGUgRC1CdXMgZGVidWcgdHJhbnNwb3J0IGlzIGEgc3BlY2lhbGl6ZWQgdHJhbnNwb3J0IHRoYXQKKyAgICAgICAgd29ya3MgaW4tcHJvY2Vzcy4gVGhpcyBtZWFucyB0aGF0IGEgY2xpZW50IGFuZCBzZXJ2ZXIgdGhhdAorICAgICAgICBleGlzdHMgaW4gdGhlIHNhbWUgcHJvY2VzcyBjYW4gdGFsayB0byBlYWNob3RoZXIgd2l0aG91dCB1c2luZworICAgICAgICBhIHNvY2tldC4KKyAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3QyPgorICAgIDxzZWN0MiBpZD0idGVzdC1idXMiPgorICAgICAgPHRpdGxlPlRoZSB0ZXN0LWJ1cyBwcm9ncmFtPC90aXRsZT4KKyAgICAgIDxwYXJhPgorICAgICAgICBUaGUgdGVzdC1idXMgcHJvZ3JhbSBpcyBhIHByb2dyYW0gdGhhdCBpcyB1c2VkIHRvIHRlc3QgdmFyaW91cworICAgICAgICBwYXJ0cyBvZiB0aGUgRC1CdXMgYnVzIGRhZW1vbjsgcm9idXN0bmVzcyBhbmQgdGhhdCBpdCBjb25mb3JtcworICAgICAgICB0byB0aGUgc3BlY2lmaWNhdGlvbnMuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIHRlc3QgcHJvZ3JhbSBoYXMgdGhlIG5lY2Vzc2FyeSBjb2RlIGZyb20gdGhlIGJ1cyBkYWVtb24KKyAgICAgICAgbGlua2VkIGluLCBhbmQgaXQgdXNlcyB0aGUgZGVidWcgdHJhbnNwb3J0IGZvcgorICAgICAgICBjb21tdW5pY2F0aW9uLiBUaGlzIG1lYW5zIHRoYXQgdGhlIGJ1cyBkYWVtb24gY29kZSBjYW4gYmUKKyAgICAgICAgdGVzdGVkIHdpdGhvdXQgdGhlIHJlYWwgYnVzIGFjdHVhbGx5IHJ1bm5pbmcsIHdoaWNoIG1ha2VzCisgICAgICAgIHRlc3RpbmcgZWFzaWVyLgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIFRoZSB0ZXN0LWJ1cyBwcm9ncmFtIHNob3VsZCB0ZXN0IGFsbCBtYWpvciBmZWF0dXJlcyBvZiB0aGUKKyAgICAgICAgYnVzLCBzdWNoIGFzIHNlcnZpY2UgcmVnaXN0cmF0aW9uLCBub3RpZmljYXRpb24gd2hlbiB0aGluZ3MKKyAgICAgICAgb2NjdXJzIGFuZCBtZXNzYWdlIG1hdGNoaW5nLgorICAgICAgPC9wYXJhPgorICAgIDwvc2VjdDI+CisgIDwvc2VjdDE+CisgIDxzZWN0MSBpZD0ib3RoZXItdGVzdHMiPgorICAgIDx0aXRsZT5PdGhlciB0ZXN0czwvdGl0bGU+CisKKyAgICA8c2VjdDIgaWQ9Im9vbS1yb2J1c3RuZXNzIj4KKyAgICAgIDx0aXRsZT5PdXQtT2YtTWVtb3J5IHJvYnVzdG5lc3M8L3RpdGxlPgorICAgICAgPHBhcmE+CisgICAgICAgIFNpbmNlIEQtQnVzIHNob3VsZCBiZSBhYmxlIHRvIGJlIHVzZWQgaW4gZW1iZWRkZWQgZGV2aWNlcywgYW5kCisgICAgICAgIGFsc28gYXMgYSBzeXN0ZW0gc2VydmljZSwgaXQgc2hvdWxkIGJlIGFibGUgdG8gY29wZSB3aXRoCisgICAgICAgIGxvdy1tZW1vcnkgc2l0dWF0aW9ucyB3aXRob3V0IGV4aXRpbmcgb3IgY3Jhc2hpbmcuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgSW4gcHJhY3RpY2UsIHRoaXMgbWVhbnMgdGhhdCBib3RoIHRoZSBjbGllbnQgYW5kIHNlcnZlciBjb2RlCisgICAgICAgIG11c3QgYmUgYWJsZSB0byBoYW5kbGUgZGJ1c19tYWxsb2MgcmV0dXJuaW5nIE5VTEwuIAorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIFRvIHRlc3QgdGhpcywgdHdvIGVudmlyb25tZW50IHZhcmlhYmxlcworICAgICAgICBleGlzdC4gPGxpdGVyYWw+REJVU19NQUxMT0NfRkFJTF9OVEg8L2xpdGVyYWw+IHdpbGwgbWFrZSBldmVyeQorICAgICAgICBudGggY2FsbCB0byBkYnVzX21hbGxvYyByZXR1cm4gTlVMTCwgYW5kCisgICAgICAgIDxsaXRlcmFsPkRCVVNfTUFMTE9DX0ZBSUxfR1JFQVRFUl9USEFOPC9saXRlcmFsPiB3aWxsIG1ha2UgYW55CisgICAgICAgIGRidXNfbWFsbG9jIGNhbGwgd2l0aCBhIHJlcXVlc3QgZm9yIG1vcmUgdGhhbiB0aGUgc3BlY2lmaWVkCisgICAgICAgIG51bWJlciBvZiBieXRlcyBmYWlsLgorICAgICAgPC9wYXJhPgorICAgIDwvc2VjdDI+CisKKyAgICA8c2VjdDIgaWQ9ImxlYWtzLWFuZC1vdGhlci1zdHVmZiI+CisgICAgICA8dGl0bGU+TWVtb3J5IGxlYWtzIGFuZCBjb2RlIHJvYnVzdG5lc3M8L3RpdGxlPiAKKyAgICAgIDxwYXJhPgorICAgICAgICBOYXR1cmFsbHkgdGhlcmUgYXJlIHNvbWUgdGhpbmdzIHRoYXQgdGVzdHMgY2FuJ3QgYmUgd3JpdHRlbgorICAgICAgICBmb3IsIGZvciBleGFtcGxlIHRoaW5ncyBsaWtlIG1lbW9yeSBsZWFrcyBhbmQgb3V0LW9mLWJvdW5kcworICAgICAgICBtZW1vcnkgcmVhZGluZyBvciB3cml0aW5nLgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIEx1Y2tpbHkgdGhlcmUgZXhpc3RzIGdvb2QgdG9vbHMgZm9yIGNhdGNoaW5nIHN1Y2ggZXJyb3JzLiBPbmUKKyAgICAgICAgZnJlZSBnb29kIHRvb2wgaXMgPHVsaW5rIHVybD0iaHR0cDovL2RldmVsLWhvbWUua2RlLm9yZy9+c2V3YXJkai8iPlZhbGdyaW5kPC91bGluaz4sIHdoaWNoIHJ1bnMgdGhlIHByb2dyYW0gaW4gYQorICAgICAgICB2aXJ0dWFsIENQVSB3aGljaCBtYWtlcyBjYXRjaGluZyBlcnJvcnMgZWFzeS4gQWxsIHRlc3QgcHJvZ3JhbXMgY2FuIGJlIHJ1biB1bmRlciBWYWxncmluZCwgCisgICAgICA8L3BhcmE+CisgICAgPC9zZWN0Mj4KKyAgPC9zZWN0MT4KKzwvYXJ0aWNsZT4KZGlmZiAtLWdpdCBhL2RvYy9kYnVzLXRlc3QtdG9vbC4xLnhtbC5pbiBiL2RvYy9kYnVzLXRlc3QtdG9vbC4xLnhtbC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjdjNDNlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2RidXMtdGVzdC10b29sLjEueG1sLmluCkBAIC0wLDAgKzEsMzI1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+Cis8IURPQ1RZUEUgcmVmZW50cnkgUFVCTElDICItLy9PQVNJUy8vRFREIERvY0Jvb2sgWE1MIFY0LjQvL0VOIiAiaHR0cDovL3d3dy5vYXNpcy1vcGVuLm9yZy9kb2Nib29rL3htbC80LjQvZG9jYm9va3guZHRkIj4KKzxyZWZlbnRyeSBpZD0iZGJ1cy10ZXN0LXRvb2wuMSI+CisgIDxyZWZlbnRyeWluZm8+CisgICAgPGNvcHlyaWdodD4KKyAgICAgIDx5ZWFyPjIwMTU8L3llYXI+CisgICAgICA8aG9sZGVyPkNvbGxhYm9yYSBMdGQuPC9ob2xkZXI+CisgICAgPC9jb3B5cmlnaHQ+CisgICAgPGxlZ2Fsbm90aWNlPgorICAgICAgPHBhcmE+VGhpcyBtYW4gcGFnZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgc2FtZSB0ZXJtcyBhcworICAgICAgICBkYnVzLXRlc3QtdG9vbCAoR1BMLTIrKS4gVGhlcmUgaXMgTk8gV0FSUkFOVFksIHRvIHRoZSBleHRlbnQKKyAgICAgICAgcGVybWl0dGVkIGJ5IGxhdy48L3BhcmE+CisgICAgPC9sZWdhbG5vdGljZT4KKyAgPC9yZWZlbnRyeWluZm8+CisKKyAgPHJlZm1ldGE+CisgICAgPHJlZmVudHJ5dGl0bGU+ZGJ1cy10ZXN0LXRvb2w8L3JlZmVudHJ5dGl0bGU+CisgICAgPG1hbnZvbG51bT4xPC9tYW52b2xudW0+CisgICAgPHJlZm1pc2NpbmZvIGNsYXNzPSJtYW51YWwiPlVzZXIgQ29tbWFuZHM8L3JlZm1pc2NpbmZvPgorICAgIDxyZWZtaXNjaW5mbyBjbGFzcz0ic291cmNlIj5ELUJ1czwvcmVmbWlzY2luZm8+CisgICAgPHJlZm1pc2NpbmZvIGNsYXNzPSJ2ZXJzaW9uIj5AREJVU19WRVJTSU9OQDwvcmVmbWlzY2luZm8+CisgIDwvcmVmbWV0YT4KKyAgPHJlZm5hbWVkaXY+CisgICAgPHJlZm5hbWU+ZGJ1cy10ZXN0LXRvb2w8L3JlZm5hbWU+CisgICAgPHJlZnB1cnBvc2U+RC1CdXMgdHJhZmZpYyBnZW5lcmF0b3IgYW5kIHRlc3QgdG9vbDwvcmVmcHVycG9zZT4KKyAgPC9yZWZuYW1lZGl2PgorCisgIDxyZWZzeW5vcHNpc2RpdiBpZD0ic3lub3BzaXMiPgorICAgIDxjbWRzeW5vcHNpcz4KKyAgICAgIDxjb21tYW5kPmRidXMtdGVzdC10b29sPC9jb21tYW5kPgorICAgICAgPGFyZyBjaG9pY2U9InBsYWluIj5ibGFjay1ob2xlPC9hcmc+CisgICAgICA8Z3JvdXAgY2hvaWNlPSJvcHQiPgorICAgICAgICA8YXJnIGNob2ljZT0icGxhaW4iPi0tc2Vzc2lvbjwvYXJnPgorICAgICAgICA8YXJnIGNob2ljZT0icGxhaW4iPi0tc3lzdGVtPC9hcmc+CisgICAgICA8L2dyb3VwPgorICAgICAgPGFyZyBjaG9pY2U9Im9wdCI+LS1uYW1lPTxyZXBsYWNlYWJsZT5OQU1FPC9yZXBsYWNlYWJsZT48L2FyZz4KKyAgICAgIDxhcmcgY2hvaWNlPSJvcHQiPi0tbm8tcmVhZDwvYXJnPgorICAgIDwvY21kc3lub3BzaXM+CisKKyAgICA8Y21kc3lub3BzaXM+CisgICAgICA8Y29tbWFuZD5kYnVzLXRlc3QtdG9vbDwvY29tbWFuZD4KKyAgICAgIDxhcmcgY2hvaWNlPSJwbGFpbiI+ZWNobzwvYXJnPgorICAgICAgPGdyb3VwIGNob2ljZT0ib3B0Ij4KKyAgICAgICAgPGFyZyBjaG9pY2U9InBsYWluIj4tLXNlc3Npb248L2FyZz4KKyAgICAgICAgPGFyZyBjaG9pY2U9InBsYWluIj4tLXN5c3RlbTwvYXJnPgorICAgICAgPC9ncm91cD4KKyAgICAgIDxhcmcgY2hvaWNlPSJvcHQiPi0tbmFtZT08cmVwbGFjZWFibGU+TkFNRTwvcmVwbGFjZWFibGU+PC9hcmc+CisgICAgICA8YXJnIGNob2ljZT0ib3B0Ij4tLXNsZWVwLW1zPTxyZXBsYWNlYWJsZT5NUzwvcmVwbGFjZWFibGU+PC9hcmc+CisgICAgPC9jbWRzeW5vcHNpcz4KKworICAgIDxjbWRzeW5vcHNpcz4KKyAgICAgIDxjb21tYW5kPmRidXMtdGVzdC10b29sPC9jb21tYW5kPgorICAgICAgPGFyZyBjaG9pY2U9InBsYWluIj5zcGFtPC9hcmc+CisgICAgICA8Z3JvdXAgY2hvaWNlPSJvcHQiPgorICAgICAgICA8YXJnIGNob2ljZT0icGxhaW4iPi0tc2Vzc2lvbjwvYXJnPgorICAgICAgICA8YXJnIGNob2ljZT0icGxhaW4iPi0tc3lzdGVtPC9hcmc+CisgICAgICA8L2dyb3VwPgorICAgICAgPGFyZyBjaG9pY2U9Im9wdCI+LS1kZXN0PTxyZXBsYWNlYWJsZT5OQU1FPC9yZXBsYWNlYWJsZT48L2FyZz4KKyAgICAgIDxhcmcgY2hvaWNlPSJvcHQiPi0tY291bnQ9PHJlcGxhY2VhYmxlPk48L3JlcGxhY2VhYmxlPjwvYXJnPgorICAgICAgPGFyZyBjaG9pY2U9Im9wdCI+LS1mbG9vZDwvYXJnPgorICAgICAgPGFyZyBjaG9pY2U9Im9wdCI+LS1pZ25vcmUtZXJyb3JzPC9hcmc+CisgICAgICA8YXJnIGNob2ljZT0ib3B0Ij4tLW1lc3NhZ2VzLXBlci1jb25uPTxyZXBsYWNlYWJsZT5OPC9yZXBsYWNlYWJsZT48L2FyZz4KKyAgICAgIDxhcmcgY2hvaWNlPSJvcHQiPi0tbm8tcmVwbHk8L2FyZz4KKyAgICAgIDxhcmcgY2hvaWNlPSJvcHQiPi0tcXVldWU9PHJlcGxhY2VhYmxlPk48L3JlcGxhY2VhYmxlPjwvYXJnPgorICAgICAgPGFyZyBjaG9pY2U9Im9wdCI+LS1zZWVkPTxyZXBsYWNlYWJsZT5TRUVEPC9yZXBsYWNlYWJsZT48L2FyZz4KKyAgICAgIDxncm91cCBjaG9pY2U9Im9wdCI+CisgICAgICAgIDxhcmcgY2hvaWNlPSJwbGFpbiI+LS1zdHJpbmc8L2FyZz4KKyAgICAgICAgPGFyZyBjaG9pY2U9InBsYWluIj4tLWJ5dGVzPC9hcmc+CisgICAgICAgIDxhcmcgY2hvaWNlPSJwbGFpbiI+LS1lbXB0eTwvYXJnPgorICAgICAgPC9ncm91cD4KKyAgICAgIDxncm91cCBjaG9pY2U9Im9wdCI+CisgICAgICAgIDxhcmcgY2hvaWNlPSJwbGFpbiI+LS1wYXlsb2FkPTxyZXBsYWNlYWJsZT5TPC9yZXBsYWNlYWJsZT48L2FyZz4KKyAgICAgICAgPGFyZyBjaG9pY2U9InBsYWluIj4tLXN0ZGluPC9hcmc+CisgICAgICAgIDxhcmcgY2hvaWNlPSJwbGFpbiI+LS1tZXNzYWdlLXN0ZGluPC9hcmc+CisgICAgICAgIDxhcmcgY2hvaWNlPSJwbGFpbiI+LS1yYW5kb20tc2l6ZTwvYXJnPgorICAgICAgPC9ncm91cD4KKyAgICA8L2NtZHN5bm9wc2lzPgorICA8L3JlZnN5bm9wc2lzZGl2PgorCisgIDxyZWZzZWN0MSBpZD0iZGVzY3JpcHRpb24iPgorICAgIDx0aXRsZT5ERVNDUklQVElPTjwvdGl0bGU+CisgICAgPHBhcmE+PGNvbW1hbmQ+ZGJ1cy10ZXN0LXRvb2w8L2NvbW1hbmQ+IGlzIGEgbXVsdGktcHVycG9zZSB0b29sCisgICAgICBmb3IgZGVidWdnaW5nIGFuZCBwcm9maWxpbmcgRC1CdXMuPC9wYXJhPgorCisgICAgPHBhcmE+PGNvbW1hbmQ+ZGJ1cy10ZXN0LXRvb2wgYmxhY2staG9sZTwvY29tbWFuZD4KKyAgICAgIGNvbm5lY3RzIHRvIEQtQnVzLCBvcHRpb25hbGx5IHJlcXVlc3RzIGEgbmFtZSwgdGhlbiBkb2VzIG5vdAorICAgICAgcmVwbHkgdG8gbWVzc2FnZXMuIEl0IG5vcm1hbGx5IHJlYWRzIGFuZCBkaXNjYXJkcyBtZXNzYWdlcyBmcm9tCisgICAgICBpdHMgRC1CdXMgc29ja2V0LCBidXQgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gc2xlZXAgZm9yZXZlciB3aXRob3V0CisgICAgICByZWFkaW5nLjwvcGFyYT4KKworICAgIDxwYXJhPjxjb21tYW5kPmRidXMtdGVzdC10b29sIGVjaG88L2NvbW1hbmQ+CisgICAgICBjb25uZWN0cyB0byBELUJ1cywgb3B0aW9uYWxseSByZXF1ZXN0cyBhIG5hbWUsIHRoZW4gc2VuZHMgYmFjayBhbgorICAgICAgZW1wdHkgcmVwbHkgdG8gZXZlcnkgbWV0aG9kIGNhbGwsIGFmdGVyIGFuIG9wdGlvbmFsIGRlbGF5LjwvcGFyYT4KKworICAgIDxwYXJhPjxjb21tYW5kPmRidXMtdGVzdC10b29sIHNwYW08L2NvbW1hbmQ+CisgICAgICBjb25uZWN0cyB0byBELUJ1cyBhbmQgbWFrZXMgcmVwZWF0ZWQgbWV0aG9kIGNhbGxzLAorICAgICAgbm9ybWFsbHkgbmFtZWQgPGxpdGVyYWw+Y29tLmV4YW1wbGUuU3BhbTwvbGl0ZXJhbD4uPC9wYXJhPgorICA8L3JlZnNlY3QxPgorCisgIDxyZWZzZWN0MSBpZD0ib3B0aW9ucyI+CisgICAgPHRpdGxlPk9QVElPTlM8L3RpdGxlPgorICAgIDxyZWZzZWN0Mj4KKyAgICAgIDx0aXRsZT5Db21tb24gb3B0aW9uczwvdGl0bGU+CisgICAgICA8dmFyaWFibGVsaXN0IHJlbWFwPSJUUCI+CisKKyAgICAgICAgPHZhcmxpc3RlbnRyeT4KKyAgICAgICAgICA8dGVybT48b3B0aW9uPi0tc2Vzc2lvbjwvb3B0aW9uPjwvdGVybT4KKyAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICA8cGFyYT5Db25uZWN0IHRvIHRoZSBzZXNzaW9uIGJ1cy4gVGhpcyBpcyB0aGUgZGVmYXVsdC48L3BhcmE+CisgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgPC92YXJsaXN0ZW50cnk+CisKKyAgICAgICAgPHZhcmxpc3RlbnRyeT4KKyAgICAgICAgICA8dGVybT48b3B0aW9uPi0tc3lzdGVtPC9vcHRpb24+PC90ZXJtPgorICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgIDxwYXJhPkNvbm5lY3QgdG8gdGhlIHN5c3RlbSBidXMuPC9wYXJhPgorICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgIDwvdmFybGlzdGVudHJ5PgorCisgICAgICA8L3ZhcmlhYmxlbGlzdD4KKyAgICA8L3JlZnNlY3QyPgorCisgICAgPHJlZnNlY3QyPgorICAgICAgPHRpdGxlPmJsYWNrLWhvbGUgbW9kZTwvdGl0bGU+CisgICAgICA8dmFyaWFibGVsaXN0IHJlbWFwPSJUUCI+CisKKyAgICAgICAgPHZhcmxpc3RlbnRyeT4KKyAgICAgICAgICA8dGVybT48b3B0aW9uPi0tbmFtZT08L29wdGlvbj48cmVwbGFjZWFibGU+TkFNRTwvcmVwbGFjZWFibGU+PC90ZXJtPgorICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgIDxwYXJhPkJlZm9yZSBwcm9jZWVkaW5nLCByZXF1ZXN0IG93bmVyc2hpcCBvZiB0aGUgd2VsbC1rbm93bgorICAgICAgICAgICAgICBidXMgbmFtZSA8cmVwbGFjZWFibGU+TkFNRTwvcmVwbGFjZWFibGU+LCBmb3IgZXhhbXBsZQorICAgICAgICAgICAgICA8bGl0ZXJhbD5jb20uZXhhbXBsZS5Ob1JlcGx5PC9saXRlcmFsPi4gQnkgZGVmYXVsdCwKKyAgICAgICAgICAgICAgbm8gbmFtZSBpcyByZXF1ZXN0ZWQsIGFuZCB0aGUgdG9vbCBjYW4gb25seSBiZSBhZGRyZXNzZWQgYnkKKyAgICAgICAgICAgICAgYSB1bmlxdWUgYnVzIG5hbWUgc3VjaCBhcyA8bGl0ZXJhbD46MS4yMzwvbGl0ZXJhbD4uPC9wYXJhPgorICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgIDwvdmFybGlzdGVudHJ5PgorCisgICAgICAgIDx2YXJsaXN0ZW50cnk+CisgICAgICAgICAgPHRlcm0+PG9wdGlvbj4tLW5vLXJlYWQ8L29wdGlvbj48L3Rlcm0+CisgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgPHBhcmE+RG8gbm90IHJlYWQgZnJvbSB0aGUgRC1CdXMgc29ja2V0LjwvcGFyYT4KKyAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICA8L3Zhcmxpc3RlbnRyeT4KKworICAgICAgPC92YXJpYWJsZWxpc3Q+CisgICAgPC9yZWZzZWN0Mj4KKworICAgIDxyZWZzZWN0Mj4KKyAgICAgIDx0aXRsZT5lY2hvIG1vZGU8L3RpdGxlPgorICAgICAgPHZhcmlhYmxlbGlzdCByZW1hcD0iVFAiPgorCisgICAgICAgIDx2YXJsaXN0ZW50cnk+CisgICAgICAgICAgPHRlcm0+PG9wdGlvbj4tLW5hbWU9PC9vcHRpb24+PHJlcGxhY2VhYmxlPk5BTUU8L3JlcGxhY2VhYmxlPjwvdGVybT4KKyAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICA8cGFyYT5CZWZvcmUgcHJvY2VlZGluZywgcmVxdWVzdCBvd25lcnNoaXAgb2YgdGhlIHdlbGwta25vd24KKyAgICAgICAgICAgICAgYnVzIG5hbWUgPHJlcGxhY2VhYmxlPk5BTUU8L3JlcGxhY2VhYmxlPiwgZm9yIGV4YW1wbGUKKyAgICAgICAgICAgICAgPGxpdGVyYWw+Y29tLmV4YW1wbGUuRWNobzwvbGl0ZXJhbD4uIEJ5IGRlZmF1bHQsCisgICAgICAgICAgICAgIG5vIG5hbWUgaXMgcmVxdWVzdGVkLCBhbmQgdGhlIHRvb2wgY2FuIG9ubHkgYmUgYWRkcmVzc2VkIGJ5CisgICAgICAgICAgICAgIGEgdW5pcXVlIGJ1cyBuYW1lIHN1Y2ggYXMgPGxpdGVyYWw+OjEuMjM8L2xpdGVyYWw+LjwvcGFyYT4KKyAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICA8L3Zhcmxpc3RlbnRyeT4KKworICAgICAgICA8dmFybGlzdGVudHJ5PgorICAgICAgICAgIDx0ZXJtPjxvcHRpb24+LS1zbGVlcC1tcz08L29wdGlvbj48cmVwbGFjZWFibGU+TVM8L3JlcGxhY2VhYmxlPjwvdGVybT4KKyAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICA8cGFyYT5CbG9jayBmb3IgPHJlcGxhY2VhYmxlPk1TPC9yZXBsYWNlYWJsZT4gbWlsbGlzZWNvbmRzCisgICAgICAgICAgICAgIGJlZm9yZSByZXBseWluZyB0byBhIG1ldGhvZCBjYWxsLjwvcGFyYT4KKyAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICA8L3Zhcmxpc3RlbnRyeT4KKworICAgICAgPC92YXJpYWJsZWxpc3Q+CisgICAgPC9yZWZzZWN0Mj4KKworICAgIDxyZWZzZWN0Mj4KKyAgICAgIDx0aXRsZT5zcGFtIG1vZGU8L3RpdGxlPgorICAgICAgPHZhcmlhYmxlbGlzdCByZW1hcD0iVFAiPgorCisgICAgICAgIDx2YXJsaXN0ZW50cnk+CisgICAgICAgICAgPHRlcm0+PG9wdGlvbj4tLWRlc3Q9PC9vcHRpb24+PHJlcGxhY2VhYmxlPk5BTUU8L3JlcGxhY2VhYmxlPjwvdGVybT4KKyAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICA8cGFyYT5TZW5kIG1ldGhvZCBjYWxscyB0byB0aGUgd2VsbC1rbm93biBvciB1bmlxdWUKKyAgICAgICAgICAgICAgYnVzIG5hbWUgPHJlcGxhY2VhYmxlPk5BTUU8L3JlcGxhY2VhYmxlPi4KKyAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgaXMgdGhlIGRidXMtZGFlbW9uLAorICAgICAgICAgICAgICA8bGl0ZXJhbD5vcmcuZnJlZWRlc2t0b3AuREJ1czwvbGl0ZXJhbD4uPC9wYXJhPgorICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgIDwvdmFybGlzdGVudHJ5PgorCisgICAgICAgIDx2YXJsaXN0ZW50cnk+CisgICAgICAgICAgPHRlcm0+PG9wdGlvbj4tLWNvdW50PTwvb3B0aW9uPjxyZXBsYWNlYWJsZT5OPC9yZXBsYWNlYWJsZT48L3Rlcm0+CisgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgPHBhcmE+U2VuZCA8cmVwbGFjZWFibGU+TjwvcmVwbGFjZWFibGU+IG1ldGhvZCBjYWxscyBpbiB0b3RhbC4KKyAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgaXMgMS48L3BhcmE+CisgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgPC92YXJsaXN0ZW50cnk+CisKKyAgICAgICAgPHZhcmxpc3RlbnRyeT4KKyAgICAgICAgICA8dGVybT48b3B0aW9uPi0tcXVldWU9PC9vcHRpb24+PHJlcGxhY2VhYmxlPk48L3JlcGxhY2VhYmxlPjwvdGVybT4KKyAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICA8cGFyYT5TZW5kIDxyZXBsYWNlYWJsZT5OPC9yZXBsYWNlYWJsZT4gbWV0aG9kIGNhbGxzIGJlZm9yZQorICAgICAgICAgICAgICB3YWl0aW5nIGZvciBhbnkgcmVwbGllcywgdGhlbiBzZW5kIG9uZSBuZXcgY2FsbCBwZXIgcmVwbHkKKyAgICAgICAgICAgICAgcmVjZWl2ZWQsIGtlZXBpbmcgPHJlcGxhY2VhYmxlPk48L3JlcGxhY2VhYmxlPiBtZXRob2QgY2FsbHMKKyAgICAgICAgICAgICAgImluIGZsaWdodCIgYXQgYWxsIHRpbWVzIHVudGlsIHRoZSBudW1iZXIgb2YgbWVzc2FnZXMgc3BlY2lmaWVkCisgICAgICAgICAgICAgIHdpdGggdGhlIDxvcHRpb24+LS1jb3VudDwvb3B0aW9uPiBvcHRpb24gaGF2ZSBiZWVuIHNlbnQuCisgICAgICAgICAgICAgIFRoZSBkZWZhdWx0IGlzIDEsIHVubGVzcyA8b3B0aW9uPi0tZmxvb2Q8L29wdGlvbj4KKyAgICAgICAgICAgICAgaXMgdXNlZC48L3BhcmE+CisgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgPC92YXJsaXN0ZW50cnk+CisKKyAgICAgICAgPHZhcmxpc3RlbnRyeT4KKyAgICAgICAgICA8dGVybT48b3B0aW9uPi0tZmxvb2Q8L29wdGlvbj48L3Rlcm0+CisgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgPHBhcmE+U2VuZCBhbGwgbWVzc2FnZXMgd2l0aG91dCB3YWl0aW5nIGZvciBhIHJlcGx5LAorICAgICAgICAgICAgICBlcXVpdmFsZW50IHRvIDxvcHRpb24+LS1xdWV1ZTwvb3B0aW9uPiB3aXRoIGFuIGFyYml0cmFyaWx5CisgICAgICAgICAgICAgIGxhcmdlIDxyZXBsYWNlYWJsZT5OPC9yZXBsYWNlYWJsZT4uPC9wYXJhPgorICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgIDwvdmFybGlzdGVudHJ5PgorCisgICAgICAgIDx2YXJsaXN0ZW50cnk+CisgICAgICAgICAgPHRlcm0+PG9wdGlvbj4tLW5vLXJlcGx5PC9vcHRpb24+PC90ZXJtPgorICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgIDxwYXJhPlNldCB0aGUgIm5vIHJlcGx5IGRlc2lyZWQiIGZsYWcgb24gdGhlIG1lc3NhZ2VzLgorICAgICAgICAgICAgICBUaGlzIGltcGxpZXMgPG9wdGlvbj4tLWZsb29kPC9vcHRpb24+LCBzaW5jZSBpdCBkaXNhYmxlcworICAgICAgICAgICAgICB0aGUgcmVwbGllcyB0aGF0IHdvdWxkIGJlIHVzZWQgZm9yIGEgZmluaXRlCisgICAgICAgICAgICAgIDxvcHRpb24+LS1xdWV1ZTwvb3B0aW9uPiBsZW5ndGguPC9wYXJhPgorICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgIDwvdmFybGlzdGVudHJ5PgorCisgICAgICAgIDx2YXJsaXN0ZW50cnk+CisgICAgICAgICAgPHRlcm0+PG9wdGlvbj4tLW1lc3NhZ2VzLXBlci1jb25uPTwvb3B0aW9uPjxyZXBsYWNlYWJsZT5OPC9yZXBsYWNlYWJsZT48L3Rlcm0+CisgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgPHBhcmE+SWYgZ2l2ZW4sIHNlbmQgPHJlcGxhY2VhYmxlPk48L3JlcGxhY2VhYmxlPiBtZXRob2QgY2FsbHMKKyAgICAgICAgICAgICAgb24gdGhlIHNhbWUgY29ubmVjdGlvbiwgdGhlbiBkaXNjb25uZWN0IGFuZCByZWNvbm5lY3QuCisgICAgICAgICAgICAgIFRoZSBkZWZhdWx0IGlzIHRvIHVzZSB0aGUgc2FtZSBjb25uZWN0aW9uIGZvciBhbGwgbWV0aG9kCisgICAgICAgICAgICAgIGNhbGxzLjwvcGFyYT4KKyAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICA8L3Zhcmxpc3RlbnRyeT4KKworICAgICAgICA8dmFybGlzdGVudHJ5PgorICAgICAgICAgIDx0ZXJtPjxvcHRpb24+LS1zdHJpbmc8L29wdGlvbj48L3Rlcm0+CisgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgPHBhcmE+VGhlIHBheWxvYWQgb2YgZWFjaCBtZXNzYWdlIGlzIGEgVVRGLTggc3RyaW5nLiBUaGlzIGlzIHRoZQorICAgICAgICAgICAgICBkZWZhdWx0LiBUaGUgYWN0dWFsIHN0cmluZyB1c2VkIGlzIGdpdmVuIGJ5IHRoZQorICAgICAgICAgICAgICA8b3B0aW9uPi0tcGF5bG9hZDwvb3B0aW9uPiBvciA8b3B0aW9uPi0tc3RkaW48L29wdGlvbj4KKyAgICAgICAgICAgICAgb3B0aW9uLCBkZWZhdWx0aW5nIHRvICJoZWxsbywgd29ybGQhIi48L3BhcmE+CisgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgPC92YXJsaXN0ZW50cnk+CisKKyAgICAgICAgPHZhcmxpc3RlbnRyeT4KKyAgICAgICAgICA8dGVybT48b3B0aW9uPi0tYnl0ZXM8L29wdGlvbj48L3Rlcm0+CisgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgPHBhcmE+VGhlIHBheWxvYWQgb2YgZWFjaCBtZXNzYWdlIGlzIGEgYnl0ZS1hcnJheS4KKyAgICAgICAgICAgICAgVGhlIGFjdHVhbCBieXRlcyB1c2VkIGFyZSBnaXZlbiBieSB0aGUKKyAgICAgICAgICAgICAgPG9wdGlvbj4tLXBheWxvYWQ8L29wdGlvbj4gb3IgPG9wdGlvbj4tLXN0ZGluPC9vcHRpb24+CisgICAgICAgICAgICAgIG9wdGlvbiwgZGVmYXVsdGluZyB0byB0aGUgQVNDSUkgZW5jb2Rpbmcgb2YKKyAgICAgICAgICAgICAgImhlbGxvLCB3b3JsZCEiLjwvcGFyYT4KKyAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICA8L3Zhcmxpc3RlbnRyeT4KKworICAgICAgICA8dmFybGlzdGVudHJ5PgorICAgICAgICAgIDx0ZXJtPjxvcHRpb24+LS1lbXB0eTwvb3B0aW9uPjwvdGVybT4KKyAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICA8cGFyYT5UaGUgbWVzc2FnZXMgaGF2ZSBubyBwYXlsb2FkLjwvcGFyYT4KKyAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICA8L3Zhcmxpc3RlbnRyeT4KKworICAgICAgICA8dmFybGlzdGVudHJ5PgorICAgICAgICAgIDx0ZXJtPjxvcHRpb24+LS1wYXlsb2FkPTwvb3B0aW9uPjxyZXBsYWNlYWJsZT5TPC9yZXBsYWNlYWJsZT48L3Rlcm0+CisgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgPHBhcmE+VXNlIDxyZXBsYWNlYWJsZT5TPC9yZXBsYWNlYWJsZT4gYXMgdGhlCisgICAgICAgICAgICAgIDxvcHRpb24+LS1zdHJpbmc8L29wdGlvbj4gb3IgPG9wdGlvbj4tLWJ5dGVzPC9vcHRpb24+CisgICAgICAgICAgICAgIGluIHRoZSBtZXNzYWdlcy4gVGhlIGRlZmF1bHQgaXMgImhlbGxvLCB3b3JsZCEiLjwvcGFyYT4KKyAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICA8L3Zhcmxpc3RlbnRyeT4KKworICAgICAgICA8dmFybGlzdGVudHJ5PgorICAgICAgICAgIDx0ZXJtPjxvcHRpb24+LS1zdGRpbjwvb3B0aW9uPjwvdGVybT4KKyAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICA8cGFyYT5SZWFkIGZyb20gc3RhbmRhcmQgaW5wdXQgdW50aWwgZW5kLW9mLWZpbGUgaXMgcmVhY2hlZCwKKyAgICAgICAgICAgICAgYW5kIHVzZSB0aGF0IGFzIHRoZSA8b3B0aW9uPi0tc3RyaW5nPC9vcHRpb24+IG9yCisgICAgICAgICAgICAgIDxvcHRpb24+LS1ieXRlczwvb3B0aW9uPiBpbiB0aGUgbWVzc2FnZXMuPC9wYXJhPgorICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgIDwvdmFybGlzdGVudHJ5PgorCisgICAgICAgIDx2YXJsaXN0ZW50cnk+CisgICAgICAgICAgPHRlcm0+PG9wdGlvbj4tLW1lc3NhZ2Utc3RkaW48L29wdGlvbj48L3Rlcm0+CisgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgPHBhcmE+UmVhZCBhIGNvbXBsZXRlIGJpbmFyeSBELUJ1cyBtZXRob2QgY2FsbCBtZXNzYWdlIGZyb20KKyAgICAgICAgICAgICAgc3RhbmRhcmQgaW5wdXQsIGFuZCB1c2UgdGhhdCBmb3IgZWFjaCBtZXRob2QgY2FsbC48L3BhcmE+CisgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgPC92YXJsaXN0ZW50cnk+CisKKyAgICAgICAgPHZhcmxpc3RlbnRyeT4KKyAgICAgICAgICA8dGVybT48b3B0aW9uPi0tcmFuZG9tLXNpemU8L29wdGlvbj48L3Rlcm0+CisgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgPHBhcmE+UmVhZCB3aGl0ZXNwYWNlLXNlcGFyYXRlZCBBU0NJSSBkZWNpbWFsIG51bWJlcnMgZnJvbQorICAgICAgICAgICAgICBzdGFuZGFyZCBpbnB1dCwgY2hvb3NlIG9uZSBhdCByYW5kb20gZm9yIGVhY2ggbWVzc2FnZSwKKyAgICAgICAgICAgICAgYW5kIHNlbmQgYSBtZXNzYWdlIHdob3NlIHBheWxvYWQgaXMgYSBzdHJpbmcgb2YgdGhhdAorICAgICAgICAgICAgICBsZW5ndGguPC9wYXJhPgorICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgIDwvdmFybGlzdGVudHJ5PgorCisgICAgICAgIDx2YXJsaXN0ZW50cnk+CisgICAgICAgICAgPHRlcm0+PG9wdGlvbj4tLXNlZWQ9PC9vcHRpb24+PHJlcGxhY2VhYmxlPlNFRUQ8L3JlcGxhY2VhYmxlPjwvdGVybT4KKyAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICA8cGFyYT5Vc2UgPHJlcGxhY2VhYmxlPlNFRUQ8L3JlcGxhY2VhYmxlPiBhcyB0aGUgc2VlZAorICAgICAgICAgICAgICBmb3IgdGhlIHBzZXVkb3JhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLCB0byBoYXZlIHNvbWV3aGF0CisgICAgICAgICAgICAgIHJlcGVhdGFibGUgc2VxdWVuY2VzIG9mIHJhbmRvbSBtZXNzYWdlcy48L3BhcmE+CisgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgPC92YXJsaXN0ZW50cnk+CisKKyAgICAgIDwvdmFyaWFibGVsaXN0PgorICAgIDwvcmVmc2VjdDI+CisgIDwvcmVmc2VjdDE+CisKKyAgPHJlZnNlY3QxIGlkPSJidWdzIj4KKyAgICA8dGl0bGU+QlVHUzwvdGl0bGU+CisgICAgICA8cGFyYT5QbGVhc2Ugc2VuZCBidWcgcmVwb3J0cyB0byB0aGUgRC1CdXMgYnVnIHRyYWNrZXIgb3IgbWFpbGluZyBsaXN0LgorICAgICAgICBTZWUgPHVsaW5rIHVybD0iaHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc29mdHdhcmUvZGJ1cy8iPmh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3NvZnR3YXJlL2RidXMvPC91bGluaz4uPC9wYXJhPgorICA8L3JlZnNlY3QxPgorCisgIDxyZWZzZWN0MSBpZD0ic2VlX2Fsc28iPgorICAgIDx0aXRsZT5TRUUgQUxTTzwvdGl0bGU+CisgICAgPHBhcmE+PGNpdGVyZWZlbnRyeT48cmVmZW50cnl0aXRsZT5kYnVzLXNlbmQ8L3JlZmVudHJ5dGl0bGU+PG1hbnZvbG51bT4xPC9tYW52b2xudW0+PC9jaXRlcmVmZW50cnk+PC9wYXJhPgorICA8L3JlZnNlY3QxPgorPC9yZWZlbnRyeT4KZGlmZiAtLWdpdCBhL2RvYy9kYnVzLXR1dG9yaWFsLnhtbCBiL2RvYy9kYnVzLXR1dG9yaWFsLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGQ5NTA0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2RidXMtdHV0b3JpYWwueG1sCkBAIC0wLDAgKzEsNzQxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIHN0YW5kYWxvbmU9Im5vIj8+Cis8IURPQ1RZUEUgYXJ0aWNsZSBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRG9jQm9vayBYTUwgVjQuNC8vRU4iCisiaHR0cDovL3d3dy5vYXNpcy1vcGVuLm9yZy9kb2Nib29rL3htbC80LjQvZG9jYm9va3guZHRkIgorWworXT4KKworPGFydGljbGUgaWQ9ImluZGV4Ij4KKyAgPGFydGljbGVpbmZvPgorICAgIDx0aXRsZT5ELUJ1cyBUdXRvcmlhbDwvdGl0bGU+CisgICAgPHJlbGVhc2VpbmZvPlZlcnNpb24gMC41LjA8L3JlbGVhc2VpbmZvPgorICAgIDxkYXRlPjIwIEF1Z3VzdCAyMDA2PC9kYXRlPgorICAgIDxhdXRob3Jncm91cD4KKyAgICAgIDxhdXRob3I+CisJPGZpcnN0bmFtZT5IYXZvYzwvZmlyc3RuYW1lPgorCTxzdXJuYW1lPlBlbm5pbmd0b248L3N1cm5hbWU+CisJPGFmZmlsaWF0aW9uPgorCSAgPG9yZ25hbWU+UmVkIEhhdCwgSW5jLjwvb3JnbmFtZT4KKwkgIDxhZGRyZXNzPjxlbWFpbD5ocEBwb2JveC5jb208L2VtYWlsPjwvYWRkcmVzcz4KKwk8L2FmZmlsaWF0aW9uPgorICAgICAgPC9hdXRob3I+CisgICAgICA8YXV0aG9yPgorCTxmaXJzdG5hbWU+RGF2aWQ8L2ZpcnN0bmFtZT4KKwk8c3VybmFtZT5XaGVlbGVyPC9zdXJuYW1lPgorICAgICAgPC9hdXRob3I+CisgICAgICA8YXV0aG9yPgorCTxmaXJzdG5hbWU+Sm9objwvZmlyc3RuYW1lPgorCTxzdXJuYW1lPlBhbG1pZXJpPC9zdXJuYW1lPgorCTxhZmZpbGlhdGlvbj4KKwkgIDxvcmduYW1lPlJlZCBIYXQsIEluYy48L29yZ25hbWU+CisJICA8YWRkcmVzcz48ZW1haWw+am9obnBAcmVkaGF0LmNvbTwvZW1haWw+PC9hZGRyZXNzPgorCTwvYWZmaWxpYXRpb24+CisgICAgICA8L2F1dGhvcj4KKyAgICAgIDxhdXRob3I+CisJPGZpcnN0bmFtZT5Db2xpbjwvZmlyc3RuYW1lPgorCTxzdXJuYW1lPldhbHRlcnM8L3N1cm5hbWU+CisJPGFmZmlsaWF0aW9uPgorCSAgPG9yZ25hbWU+UmVkIEhhdCwgSW5jLjwvb3JnbmFtZT4KKwkgIDxhZGRyZXNzPjxlbWFpbD53YWx0ZXJzQHJlZGhhdC5jb208L2VtYWlsPjwvYWRkcmVzcz4KKwk8L2FmZmlsaWF0aW9uPgorICAgICAgPC9hdXRob3I+CisgICAgPC9hdXRob3Jncm91cD4KKyAgPC9hcnRpY2xlaW5mbz4KKworICA8c2VjdDEgaWQ9Im1ldGEiPgorICAgIDx0aXRsZT5UdXRvcmlhbCBXb3JrIEluIFByb2dyZXNzPC90aXRsZT4KKyAgICAKKyAgICA8cGFyYT4KKyAgICAgIFRoaXMgdHV0b3JpYWwgaXMgbm90IGNvbXBsZXRlOyBpdCBwcm9iYWJseSBjb250YWlucyBzb21lIHVzZWZ1bCBpbmZvcm1hdGlvbiwgYnV0IAorICAgICAgYWxzbyBoYXMgcGxlbnR5IG9mIGdhcHMuIFJpZ2h0IG5vdywgeW91J2xsIGFsc28gbmVlZCB0byByZWZlciB0byB0aGUgRC1CdXMgc3BlY2lmaWNhdGlvbiwKKyAgICAgIERveHlnZW4gcmVmZXJlbmNlIGRvY3VtZW50YXRpb24sIGFuZCBsb29rIGF0IHNvbWUgZXhhbXBsZXMgb2YgaG93IG90aGVyIGFwcHMgdXNlIEQtQnVzLgorICAgIDwvcGFyYT4KKworICAgIDxwYXJhPgorICAgICAgRW5oYW5jaW5nIHRoZSB0dXRvcmlhbCBpcyBkZWZpbml0ZWx5IGVuY291cmFnZWQgLSBzZW5kIHlvdXIgcGF0Y2hlcyBvciBzdWdnZXN0aW9ucyB0byB0aGUKKyAgICAgIG1haWxpbmcgbGlzdC4gSWYgeW91IGNyZWF0ZSBhIEQtQnVzIGJpbmRpbmcsIHBsZWFzZSBhZGQgYSBzZWN0aW9uIHRvIHRoZSB0dXRvcmlhbCBmb3IgeW91ciAKKyAgICAgIGJpbmRpbmcsIGlmIG9ubHkgYSBzaG9ydCBzZWN0aW9uIHdpdGggYSBjb3VwbGUgb2YgZXhhbXBsZXMuCisgICAgPC9wYXJhPgorCisgIDwvc2VjdDE+CisKKyAgPHNlY3QxIGlkPSJ3aGF0aXMiPgorICAgIDx0aXRsZT5XaGF0IGlzIEQtQnVzPzwvdGl0bGU+CisgICAgPHBhcmE+CisgICAgICBELUJ1cyBpcyBhIHN5c3RlbSBmb3IgPGZpcnN0dGVybT5pbnRlcnByb2Nlc3MgY29tbXVuaWNhdGlvbjwvZmlyc3R0ZXJtPgorICAgICAgKElQQykuIEFyY2hpdGVjdHVyYWxseSwgaXQgaGFzIHNldmVyYWwgbGF5ZXJzOgorCisgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBBIGxpYnJhcnksIDxmaXJzdHRlcm0+bGliZGJ1czwvZmlyc3R0ZXJtPiwgdGhhdCBhbGxvd3MgdHdvCisgICAgICAgICAgICBhcHBsaWNhdGlvbnMgdG8gY29ubmVjdCB0byBlYWNoIG90aGVyIGFuZCBleGNoYW5nZSBtZXNzYWdlcy4KKyAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEEgPGZpcnN0dGVybT5tZXNzYWdlIGJ1cyBkYWVtb248L2ZpcnN0dGVybT4gZXhlY3V0YWJsZSwgYnVpbHQgb24KKyAgICAgICAgICAgIGxpYmRidXMsIHRoYXQgbXVsdGlwbGUgYXBwbGljYXRpb25zIGNhbiBjb25uZWN0IHRvLiBUaGUgZGFlbW9uIGNhbgorICAgICAgICAgICAgcm91dGUgbWVzc2FnZXMgZnJvbSBvbmUgYXBwbGljYXRpb24gdG8gemVybyBvciBtb3JlIG90aGVyCisgICAgICAgICAgICBhcHBsaWNhdGlvbnMuCisgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICA8Zmlyc3R0ZXJtPldyYXBwZXIgbGlicmFyaWVzPC9maXJzdHRlcm0+IG9yIDxmaXJzdHRlcm0+YmluZGluZ3M8L2ZpcnN0dGVybT4gCisgICAgICAgICAgICBiYXNlZCBvbiBwYXJ0aWN1bGFyIGFwcGxpY2F0aW9uIGZyYW1ld29ya3MuICBGb3IgZXhhbXBsZSwgbGliZGJ1cy1nbGliIGFuZAorICAgICAgICAgICAgbGliZGJ1cy1xdC4gVGhlcmUgYXJlIGFsc28gYmluZGluZ3MgdG8gbGFuZ3VhZ2VzIHN1Y2ggYXMKKyAgICAgICAgICAgIFB5dGhvbi4gVGhlc2Ugd3JhcHBlciBsaWJyYXJpZXMgYXJlIHRoZSBBUEkgbW9zdCBwZW9wbGUgc2hvdWxkIHVzZSwKKyAgICAgICAgICAgIGFzIHRoZXkgc2ltcGxpZnkgdGhlIGRldGFpbHMgb2YgRC1CdXMgcHJvZ3JhbW1pbmcuIGxpYmRidXMgaXMgCisgICAgICAgICAgICBpbnRlbmRlZCB0byBiZSBhIGxvdy1sZXZlbCBiYWNrZW5kIGZvciB0aGUgaGlnaGVyIGxldmVsIGJpbmRpbmdzLgorICAgICAgICAgICAgTXVjaCBvZiB0aGUgbGliZGJ1cyBBUEkgaXMgb25seSB1c2VmdWwgZm9yIGJpbmRpbmcgaW1wbGVtZW50YXRpb24uCisgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgPC9wYXJhPgorCisgICAgPHBhcmE+CisgICAgICBsaWJkYnVzIG9ubHkgc3VwcG9ydHMgb25lLXRvLW9uZSBjb25uZWN0aW9ucywganVzdCBsaWtlIGEgcmF3IG5ldHdvcmsKKyAgICAgIHNvY2tldC4gSG93ZXZlciwgcmF0aGVyIHRoYW4gc2VuZGluZyBieXRlIHN0cmVhbXMgb3ZlciB0aGUgY29ubmVjdGlvbiwgeW91CisgICAgICBzZW5kIDxmaXJzdHRlcm0+bWVzc2FnZXM8L2ZpcnN0dGVybT4uIE1lc3NhZ2VzIGhhdmUgYSBoZWFkZXIgaWRlbnRpZnlpbmcKKyAgICAgIHRoZSBraW5kIG9mIG1lc3NhZ2UsIGFuZCBhIGJvZHkgY29udGFpbmluZyBhIGRhdGEgcGF5bG9hZC4gbGliZGJ1cyBhbHNvCisgICAgICBhYnN0cmFjdHMgdGhlIGV4YWN0IHRyYW5zcG9ydCB1c2VkIChzb2NrZXRzIHZzLiB3aGF0ZXZlciBlbHNlKSwgYW5kCisgICAgICBoYW5kbGVzIGRldGFpbHMgc3VjaCBhcyBhdXRoZW50aWNhdGlvbi4KKyAgICA8L3BhcmE+CisKKyAgICA8cGFyYT4KKyAgICAgIFRoZSBtZXNzYWdlIGJ1cyBkYWVtb24gZm9ybXMgdGhlIGh1YiBvZiBhIHdoZWVsLiBFYWNoIHNwb2tlIG9mIHRoZSB3aGVlbAorICAgICAgaXMgYSBvbmUtdG8tb25lIGNvbm5lY3Rpb24gdG8gYW4gYXBwbGljYXRpb24gdXNpbmcgbGliZGJ1cy4gIEFuCisgICAgICBhcHBsaWNhdGlvbiBzZW5kcyBhIG1lc3NhZ2UgdG8gdGhlIGJ1cyBkYWVtb24gb3ZlciBpdHMgc3Bva2UsIGFuZCB0aGUgYnVzCisgICAgICBkYWVtb24gZm9yd2FyZHMgdGhlIG1lc3NhZ2UgdG8gb3RoZXIgY29ubmVjdGVkIGFwcGxpY2F0aW9ucyBhcworICAgICAgYXBwcm9wcmlhdGUuIFRoaW5rIG9mIHRoZSBkYWVtb24gYXMgYSByb3V0ZXIuCisgICAgPC9wYXJhPgorCisgICAgPHBhcmE+CisgICAgICBUaGUgYnVzIGRhZW1vbiBoYXMgbXVsdGlwbGUgaW5zdGFuY2VzIG9uIGEgdHlwaWNhbCBjb21wdXRlci4gIFRoZQorICAgICAgZmlyc3QgaW5zdGFuY2UgaXMgYSBtYWNoaW5lLWdsb2JhbCBzaW5nbGV0b24sIHRoYXQgaXMsIGEgc3lzdGVtIGRhZW1vbgorICAgICAgc2ltaWxhciB0byBzZW5kbWFpbCBvciBBcGFjaGUuIFRoaXMgaW5zdGFuY2UgaGFzIGhlYXZ5IHNlY3VyaXR5CisgICAgICByZXN0cmljdGlvbnMgb24gd2hhdCBtZXNzYWdlcyBpdCB3aWxsIGFjY2VwdCwgYW5kIGlzIHVzZWQgZm9yIHN5c3RlbXdpZGUKKyAgICAgIGNvbW11bmljYXRpb24uIFRoZSBvdGhlciBpbnN0YW5jZXMgYXJlIGNyZWF0ZWQgb25lIHBlciB1c2VyIGxvZ2luIHNlc3Npb24uCisgICAgICBUaGVzZSBpbnN0YW5jZXMgYWxsb3cgYXBwbGljYXRpb25zIGluIHRoZSB1c2VyJ3Mgc2Vzc2lvbiB0byBjb21tdW5pY2F0ZSAKKyAgICAgIHdpdGggb25lIGFub3RoZXIuCisgICAgPC9wYXJhPgorCisgICAgPHBhcmE+CisgICAgICBUaGUgc3lzdGVtd2lkZSBhbmQgcGVyLXVzZXIgZGFlbW9ucyBhcmUgc2VwYXJhdGUuICBOb3JtYWwgd2l0aGluLXNlc3Npb24KKyAgICAgIElQQyBkb2VzIG5vdCBpbnZvbHZlIHRoZSBzeXN0ZW13aWRlIG1lc3NhZ2UgYnVzIHByb2Nlc3MgYW5kIHZpY2UgdmVyc2EuCisgICAgPC9wYXJhPgorCisgICAgPHNlY3QyIGlkPSJ1c2VzIj4KKyAgICAgIDx0aXRsZT5ELUJ1cyBhcHBsaWNhdGlvbnM8L3RpdGxlPgorICAgICAgPHBhcmE+CisgICAgICAgIFRoZXJlIGFyZSBtYW55LCBtYW55IHRlY2hub2xvZ2llcyBpbiB0aGUgd29ybGQgdGhhdCBoYXZlICJJbnRlci1wcm9jZXNzCisgICAgICAgIGNvbW11bmljYXRpb24iIG9yICJuZXR3b3JraW5nIiBpbiB0aGVpciBzdGF0ZWQgcHVycG9zZTogPHVsaW5rCisgICAgICAgIHVybD0iaHR0cDovL3d3dy5vbWcub3JnIj5DT1JCQTwvdWxpbms+LCA8dWxpbmsKKyAgICAgICAgdXJsPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvZGNlLyI+RENFPC91bGluaz4sIDx1bGluaworICAgICAgICB1cmw9Imh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9jb20vIj5EQ09NPC91bGluaz4sIDx1bGluaworICAgICAgICB1cmw9Imh0dHA6Ly9kZXZlbG9wZXIua2RlLm9yZy9kb2N1bWVudGF0aW9uL2xpYnJhcnkva2RlcXQvZGNvcC5odG1sIj5EQ09QPC91bGluaz4sIDx1bGluaworICAgICAgICB1cmw9Imh0dHA6Ly93d3cueG1scnBjLmNvbSI+WE1MLVJQQzwvdWxpbms+LCA8dWxpbmsKKyAgICAgICAgdXJsPSJodHRwOi8vd3d3LnczLm9yZy9UUi9TT0FQLyI+U09BUDwvdWxpbms+LCA8dWxpbmsKKyAgICAgICAgdXJsPSJodHRwOi8vd3d3Lm1idXMub3JnLyI+TUJVUzwvdWxpbms+LCA8dWxpbmsKKyAgICAgICAgdXJsPSJodHRwOi8vd3d3Lnplcm9jLmNvbS9pY2UuaHRtbCI+SW50ZXJuZXQgQ29tbXVuaWNhdGlvbnMgRW5naW5lIChJQ0UpPC91bGluaz4sCisgICAgICAgIGFuZCBwcm9iYWJseSBodW5kcmVkcyBtb3JlLgorICAgICAgICBFYWNoIG9mIHRoZXNlIGlzIHRhaWxvcmVkIGZvciBwYXJ0aWN1bGFyIGtpbmRzIG9mIGFwcGxpY2F0aW9uLgorICAgICAgICBELUJ1cyBpcyBkZXNpZ25lZCBmb3IgdHdvIHNwZWNpZmljIGNhc2VzOgorICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICBDb21tdW5pY2F0aW9uIGJldHdlZW4gZGVza3RvcCBhcHBsaWNhdGlvbnMgaW4gdGhlIHNhbWUgZGVza3RvcAorICAgICAgICAgICAgICBzZXNzaW9uOyB0byBhbGxvdyBpbnRlZ3JhdGlvbiBvZiB0aGUgZGVza3RvcCBzZXNzaW9uIGFzIGEgd2hvbGUsCisgICAgICAgICAgICAgIGFuZCBhZGRyZXNzIGlzc3VlcyBvZiBwcm9jZXNzIGxpZmVjeWNsZSAod2hlbiBkbyBkZXNrdG9wIGNvbXBvbmVudHMgCisgICAgICAgICAgICAgIHN0YXJ0IGFuZCBzdG9wIHJ1bm5pbmcpLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgIENvbW11bmljYXRpb24gYmV0d2VlbiB0aGUgZGVza3RvcCBzZXNzaW9uIGFuZCB0aGUgb3BlcmF0aW5nIHN5c3RlbSwgCisgICAgICAgICAgICAgIHdoZXJlIHRoZSBvcGVyYXRpbmcgc3lzdGVtIHdvdWxkIHR5cGljYWxseSBpbmNsdWRlIHRoZSBrZXJuZWwgCisgICAgICAgICAgICAgIGFuZCBhbnkgc3lzdGVtIGRhZW1vbnMgb3IgcHJvY2Vzc2VzLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIEZvciB0aGUgd2l0aGluLWRlc2t0b3Atc2Vzc2lvbiB1c2UgY2FzZSwgdGhlIEdOT01FIGFuZCBLREUgZGVza3RvcHMgCisgICAgICAgIGhhdmUgc2lnbmlmaWNhbnQgcHJldmlvdXMgZXhwZXJpZW5jZSB3aXRoIGRpZmZlcmVudCBJUEMgc29sdXRpb25zCisgICAgICAgIHN1Y2ggYXMgQ09SQkEgYW5kIERDT1AuIEQtQnVzIGlzIGJ1aWx0IG9uIHRoYXQgZXhwZXJpZW5jZSBhbmQgCisgICAgICAgIGNhcmVmdWxseSB0YWlsb3JlZCB0byBtZWV0IHRoZSBuZWVkcyBvZiB0aGVzZSBkZXNrdG9wIHByb2plY3RzIAorICAgICAgICBpbiBwYXJ0aWN1bGFyLiBELUJ1cyBtYXkgb3IgbWF5IG5vdCBiZSBhcHByb3ByaWF0ZSBmb3Igb3RoZXIgCisgICAgICAgIGFwcGxpY2F0aW9uczsgdGhlIEZBUSBoYXMgc29tZSBjb21wYXJpc29ucyB0byBvdGhlciBJUEMgc3lzdGVtcy4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBUaGUgcHJvYmxlbSBzb2x2ZWQgYnkgdGhlIHN5c3RlbXdpZGUgb3IgY29tbXVuaWNhdGlvbi13aXRoLXRoZS1PUyBjYXNlIAorICAgICAgICBpcyBleHBsYWluZWQgd2VsbCBieSB0aGUgZm9sbG93aW5nIHRleHQgZnJvbSB0aGUgTGludXggSG90cGx1ZyBwcm9qZWN0OgorICAgICAgICA8YmxvY2txdW90ZT4KKyAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgQSBnYXAgaW4gY3VycmVudCBMaW51eCBzdXBwb3J0IGlzIHRoYXQgcG9saWNpZXMgd2l0aCBhbnkgc29ydCBvZgorICAgICAgICAgICBkeW5hbWljICJpbnRlcmFjdCB3aXRoIHVzZXIiIGNvbXBvbmVudCBhcmVuJ3QgY3VycmVudGx5CisgICAgICAgICAgIHN1cHBvcnRlZC4gRm9yIGV4YW1wbGUsIHRoYXQncyBvZnRlbiBuZWVkZWQgdGhlIGZpcnN0IHRpbWUgYSBuZXR3b3JrCisgICAgICAgICAgIGFkYXB0ZXIgb3IgcHJpbnRlciBpcyBjb25uZWN0ZWQsIGFuZCB0byBkZXRlcm1pbmUgYXBwcm9wcmlhdGUgcGxhY2VzCisgICAgICAgICAgIHRvIG1vdW50IGRpc2sgZHJpdmVzLiBJdCB3b3VsZCBzZWVtIHRoYXQgc3VjaCBhY3Rpb25zIGNvdWxkIGJlCisgICAgICAgICAgIHN1cHBvcnRlZCBmb3IgYW55IGNhc2Ugd2hlcmUgYSByZXNwb25zaWJsZSBodW1hbiBjYW4gYmUgaWRlbnRpZmllZDoKKyAgICAgICAgICAgc2luZ2xlIHVzZXIgd29ya3N0YXRpb25zLCBvciBhbnkgc3lzdGVtIHdoaWNoIGlzIHJlbW90ZWx5CisgICAgICAgICAgIGFkbWluaXN0ZXJlZC4KKyAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFRoaXMgaXMgYSBjbGFzc2ljICJyZW1vdGUgc3lzYWRtaW4iIHByb2JsZW0sIHdoZXJlIGluIHRoaXMgY2FzZQorICAgICAgICAgICAgaG90cGx1Z2dpbmcgbmVlZHMgdG8gZGVsaXZlciBhbiBldmVudCBmcm9tIG9uZSBzZWN1cml0eSBkb21haW4KKyAgICAgICAgICAgIChvcGVyYXRpbmcgc3lzdGVtIGtlcm5lbCwgaW4gdGhpcyBjYXNlKSB0byBhbm90aGVyIChkZXNrdG9wIGZvcgorICAgICAgICAgICAgbG9nZ2VkLWluIHVzZXIsIG9yIHJlbW90ZSBzeXNhZG1pbikuIEFueSBlZmZlY3RpdmUgcmVzcG9uc2UgbXVzdCBnbworICAgICAgICAgICAgdGhlIG90aGVyIHdheTogdGhlIHJlbW90ZSBkb21haW4gdGFraW5nIHNvbWUgYWN0aW9uIHRoYXQgbGV0cyB0aGUKKyAgICAgICAgICAgIGtlcm5lbCBleHBvc2UgdGhlIGRlc2lyZWQgZGV2aWNlIGNhcGFiaWxpdGllcy4gKFRoZSBhY3Rpb24gY2FuIG9mdGVuCisgICAgICAgICAgICBiZSB0YWtlbiBhc3luY2hyb25vdXNseSwgZm9yIGV4YW1wbGUgbGV0dGluZyBuZXcgaGFyZHdhcmUgYmUgaWRsZQorICAgICAgICAgICAgdW50aWwgYSBtZWV0aW5nIGZpbmlzaGVzLikgQXQgdGhpcyB3cml0aW5nLCBMaW51eCBkb2Vzbid0IGhhdmUKKyAgICAgICAgICAgIHdpZGVseSBhZG9wdGVkIHNvbHV0aW9ucyB0byBzdWNoIHByb2JsZW1zLiBIb3dldmVyLCB0aGUgbmV3IEQtQnVzCisgICAgICAgICAgICB3b3JrIG1heSBiZWdpbiB0byBzb2x2ZSB0aGF0IHByb2JsZW0uCisgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L2Jsb2NrcXVvdGU+CisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgRC1CdXMgbWF5IGhhcHBlbiB0byBiZSB1c2VmdWwgZm9yIHB1cnBvc2VzIG90aGVyIHRoYW4gdGhlIG9uZSBpdCB3YXMKKyAgICAgICAgZGVzaWduZWQgZm9yLiBJdHMgZ2VuZXJhbCBwcm9wZXJ0aWVzIHRoYXQgZGlzdGluZ3Vpc2ggaXQgZnJvbSAKKyAgICAgICAgb3RoZXIgZm9ybXMgb2YgSVBDIGFyZToKKyAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgQmluYXJ5IHByb3RvY29sIGRlc2lnbmVkIHRvIGJlIHVzZWQgYXN5bmNocm9ub3VzbHkgCisgICAgICAgICAgICAgIChzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgWCBXaW5kb3cgU3lzdGVtIHByb3RvY29sKS4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICBTdGF0ZWZ1bCwgcmVsaWFibGUgY29ubmVjdGlvbnMgaGVsZCBvcGVuIG92ZXIgdGltZS4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICBUaGUgbWVzc2FnZSBidXMgaXMgYSBkYWVtb24sIG5vdCBhICJzd2FybSIgb3IgCisgICAgICAgICAgICAgIGRpc3RyaWJ1dGVkIGFyY2hpdGVjdHVyZS4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICBNYW55IGltcGxlbWVudGF0aW9uIGFuZCBkZXBsb3ltZW50IGlzc3VlcyBhcmUgc3BlY2lmaWVkIHJhdGhlcgorICAgICAgICAgICAgICB0aGFuIGxlZnQgYW1iaWd1b3VzL2NvbmZpZ3VyYWJsZS9wbHVnZ2FibGUuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgU2VtYW50aWNzIGFyZSBzaW1pbGFyIHRvIHRoZSBleGlzdGluZyBEQ09QIHN5c3RlbSwgYWxsb3dpbmcgCisgICAgICAgICAgICAgIEtERSB0byBhZG9wdCBpdCBtb3JlIGVhc2lseS4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICBTZWN1cml0eSBmZWF0dXJlcyB0byBzdXBwb3J0IHRoZSBzeXN0ZW13aWRlIG1vZGUgb2YgdGhlIAorICAgICAgICAgICAgICBtZXNzYWdlIGJ1cy4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3QyPgorICA8L3NlY3QxPgorICA8c2VjdDEgaWQ9ImNvbmNlcHRzIj4KKyAgICA8dGl0bGU+Q29uY2VwdHM8L3RpdGxlPgorICAgIDxwYXJhPgorICAgICAgU29tZSBiYXNpYyBjb25jZXB0cyBhcHBseSBubyBtYXR0ZXIgd2hhdCBhcHBsaWNhdGlvbiBmcmFtZXdvcmsgeW91J3JlCisgICAgICB1c2luZyB0byB3cml0ZSBhIEQtQnVzIGFwcGxpY2F0aW9uLiBUaGUgZXhhY3QgY29kZSB5b3Ugd3JpdGUgd2lsbCBiZQorICAgICAgZGlmZmVyZW50IGZvciBHTGliIHZzLiBRdCB2cy4gUHl0aG9uIGFwcGxpY2F0aW9ucywgaG93ZXZlci4KKyAgICA8L3BhcmE+CisgICAgCisgICAgPHBhcmE+CisgICAgICBIZXJlIGlzIGEgZGlhZ3JhbSAoPHVsaW5rIHVybD0iZGlhZ3JhbS5wbmciPnBuZzwvdWxpbms+IDx1bGluaworICAgICAgdXJsPSJkaWFncmFtLnN2ZyI+c3ZnPC91bGluaz4pIHRoYXQgbWF5IGhlbHAgeW91IHZpc3VhbGl6ZSB0aGUgY29uY2VwdHMKKyAgICAgIHRoYXQgZm9sbG93LgorICAgIDwvcGFyYT4KKworICAgIDxzZWN0MiBpZD0ib2JqZWN0cyI+CisgICAgICA8dGl0bGU+TmF0aXZlIE9iamVjdHMgYW5kIE9iamVjdCBQYXRoczwvdGl0bGU+CisgICAgICA8cGFyYT4KKyAgICAgICAgWW91ciBwcm9ncmFtbWluZyBmcmFtZXdvcmsgcHJvYmFibHkgZGVmaW5lcyB3aGF0IGFuICJvYmplY3QiIGlzIGxpa2U7CisgICAgICAgIHVzdWFsbHkgd2l0aCBhIGJhc2UgY2xhc3MuIEZvciBleGFtcGxlOiBqYXZhLmxhbmcuT2JqZWN0LCBHT2JqZWN0LCBRT2JqZWN0LAorICAgICAgICBweXRob24ncyBiYXNlIE9iamVjdCwgb3Igd2hhdGV2ZXIuIExldCdzIGNhbGwgdGhpcyBhIDxmaXJzdHRlcm0+bmF0aXZlIG9iamVjdDwvZmlyc3R0ZXJtPi4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBUaGUgbG93LWxldmVsIEQtQnVzIHByb3RvY29sLCBhbmQgY29ycmVzcG9uZGluZyBsaWJkYnVzIEFQSSwgZG9lcyBub3QgY2FyZSBhYm91dCBuYXRpdmUgb2JqZWN0cy4gCisgICAgICAgIEhvd2V2ZXIsIGl0IHByb3ZpZGVzIGEgY29uY2VwdCBjYWxsZWQgYW4gCisgICAgICAgIDxmaXJzdHRlcm0+b2JqZWN0IHBhdGg8L2ZpcnN0dGVybT4uIFRoZSBpZGVhIG9mIGFuIG9iamVjdCBwYXRoIGlzIHRoYXQgCisgICAgICAgIGhpZ2hlci1sZXZlbCBiaW5kaW5ncyBjYW4gbmFtZSBuYXRpdmUgb2JqZWN0IGluc3RhbmNlcywgYW5kIGFsbG93IHJlbW90ZSBhcHBsaWNhdGlvbnMgCisgICAgICAgIHRvIHJlZmVyIHRvIHRoZW0uCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIG9iamVjdCBwYXRoCisgICAgICAgIGxvb2tzIGxpa2UgYSBmaWxlc3lzdGVtIHBhdGgsIGZvciBleGFtcGxlIGFuIG9iamVjdCBjb3VsZCBiZSAKKyAgICAgICAgbmFtZWQgPGxpdGVyYWw+L29yZy9rZGUva3NwcmVhZC9zaGVldHMvMy9jZWxscy80LzU8L2xpdGVyYWw+LiAKKyAgICAgICAgSHVtYW4tcmVhZGFibGUgcGF0aHMgYXJlIG5pY2UsIGJ1dCB5b3UgYXJlIGZyZWUgdG8gY3JlYXRlIGFuIAorICAgICAgICBvYmplY3QgbmFtZWQgPGxpdGVyYWw+L2NvbS9teWNvbXBhbnkvYzV5bzgxN3kwYzF5MWM1YjwvbGl0ZXJhbD4gCisgICAgICAgIGlmIGl0IG1ha2VzIHNlbnNlIGZvciB5b3VyIGFwcGxpY2F0aW9uLgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIE5hbWVzcGFjaW5nIG9iamVjdCBwYXRocyBpcyBzbWFydCwgYnkgc3RhcnRpbmcgdGhlbSB3aXRoIHRoZSBjb21wb25lbnRzCisgICAgICAgIG9mIGEgZG9tYWluIG5hbWUgeW91IG93biAoZS5nLiA8bGl0ZXJhbD4vb3JnL2tkZTwvbGl0ZXJhbD4pLiBUaGlzIAorICAgICAgICBrZWVwcyBkaWZmZXJlbnQgY29kZSBtb2R1bGVzIGluIHRoZSBzYW1lIHByb2Nlc3MgZnJvbSBzdGVwcGluZyAKKyAgICAgICAgb24gb25lIGFub3RoZXIncyB0b2VzLgorICAgICAgPC9wYXJhPgorICAgIDwvc2VjdDI+ICAgIAorCisgICAgPHNlY3QyIGlkPSJtZW1iZXJzIj4KKyAgICAgIDx0aXRsZT5NZXRob2RzIGFuZCBTaWduYWxzPC90aXRsZT4KKworICAgICAgPHBhcmE+CisgICAgICAgIEVhY2ggb2JqZWN0IGhhcyA8Zmlyc3R0ZXJtPm1lbWJlcnM8L2ZpcnN0dGVybT47IHRoZSB0d28ga2luZHMgb2YgbWVtYmVyCisgICAgICAgIGFyZSA8Zmlyc3R0ZXJtPm1ldGhvZHM8L2ZpcnN0dGVybT4gYW5kCisgICAgICAgIDxmaXJzdHRlcm0+c2lnbmFsczwvZmlyc3R0ZXJtPi4gTWV0aG9kcyBhcmUgb3BlcmF0aW9ucyB0aGF0IGNhbiBiZQorICAgICAgICBpbnZva2VkIG9uIGFuIG9iamVjdCwgd2l0aCBvcHRpb25hbCBpbnB1dCAoYWthIGFyZ3VtZW50cyBvciAiaW4KKyAgICAgICAgcGFyYW1ldGVycyIpIGFuZCBvdXRwdXQgKGFrYSByZXR1cm4gdmFsdWVzIG9yICJvdXQgcGFyYW1ldGVycyIpLgorICAgICAgICBTaWduYWxzIGFyZSBicm9hZGNhc3RzIGZyb20gdGhlIG9iamVjdCB0byBhbnkgaW50ZXJlc3RlZCBvYnNlcnZlcnMgCisgICAgICAgIG9mIHRoZSBvYmplY3Q7IHNpZ25hbHMgbWF5IGNvbnRhaW4gYSBkYXRhIHBheWxvYWQuCisgICAgICA8L3BhcmE+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBCb3RoIG1ldGhvZHMgYW5kIHNpZ25hbHMgYXJlIHJlZmVycmVkIHRvIGJ5IG5hbWUsIHN1Y2ggYXMgCisgICAgICAgICJGcm9iYXRlIiBvciAiT25DbGlja2VkIi4KKyAgICAgIDwvcGFyYT4KKworICAgIDwvc2VjdDI+CisKKyAgICA8c2VjdDIgaWQ9ImludGVyZmFjZXMiPgorICAgICAgPHRpdGxlPkludGVyZmFjZXM8L3RpdGxlPgorICAgICAgPHBhcmE+CisgICAgICAgIEVhY2ggb2JqZWN0IHN1cHBvcnRzIG9uZSBvciBtb3JlIDxmaXJzdHRlcm0+aW50ZXJmYWNlczwvZmlyc3R0ZXJtPi4KKyAgICAgICAgVGhpbmsgb2YgYW4gaW50ZXJmYWNlIGFzIGEgbmFtZWQgZ3JvdXAgb2YgbWV0aG9kcyBhbmQgc2lnbmFscywgCisgICAgICAgIGp1c3QgYXMgaXQgaXMgaW4gR0xpYiBvciBRdCBvciBKYXZhLiBJbnRlcmZhY2VzIGRlZmluZSB0aGUgCisgICAgICAgIDxlbXBoYXNpcz50eXBlPC9lbXBoYXNpcz4gb2YgYW4gb2JqZWN0IGluc3RhbmNlLgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIERCdXMgaWRlbnRpZmllcyBpbnRlcmZhY2VzIHdpdGggYSBzaW1wbGUgbmFtZXNwYWNlZCBzdHJpbmcsCisgICAgICAgIHNvbWV0aGluZyBsaWtlIDxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5JbnRyb3NwZWN0YWJsZTwvbGl0ZXJhbD4uCisgICAgICAgIE1vc3QgYmluZGluZ3Mgd2lsbCBtYXAgdGhlc2UgaW50ZXJmYWNlIG5hbWVzIGRpcmVjdGx5IHRvIAorICAgICAgICB0aGUgYXBwcm9wcmlhdGUgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgY29uc3RydWN0LCBmb3IgZXhhbXBsZSAKKyAgICAgICAgdG8gSmF2YSBpbnRlcmZhY2VzIG9yIEMrKyBwdXJlIHZpcnR1YWwgY2xhc3Nlcy4KKyAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3QyPgorCisgICAgPHNlY3QyIGlkPSJwcm94aWVzIj4KKyAgICAgIDx0aXRsZT5Qcm94aWVzPC90aXRsZT4KKyAgICAgIDxwYXJhPgorICAgICAgICBBIDxmaXJzdHRlcm0+cHJveHkgb2JqZWN0PC9maXJzdHRlcm0+IGlzIGEgY29udmVuaWVudCBuYXRpdmUgb2JqZWN0IGNyZWF0ZWQgdG8gCisgICAgICAgIHJlcHJlc2VudCBhIHJlbW90ZSBvYmplY3QgaW4gYW5vdGhlciBwcm9jZXNzLiBUaGUgbG93LWxldmVsIERCdXMgQVBJIGludm9sdmVzIG1hbnVhbGx5IGNyZWF0aW5nIAorICAgICAgICBhIG1ldGhvZCBjYWxsIG1lc3NhZ2UsIHNlbmRpbmcgaXQsIHRoZW4gbWFudWFsbHkgcmVjZWl2aW5nIGFuZCBwcm9jZXNzaW5nIAorICAgICAgICB0aGUgbWV0aG9kIHJlcGx5IG1lc3NhZ2UuIEhpZ2hlci1sZXZlbCBiaW5kaW5ncyBwcm92aWRlIHByb3hpZXMgYXMgYW4gYWx0ZXJuYXRpdmUuCisgICAgICAgIFByb3hpZXMgbG9vayBsaWtlIGEgbm9ybWFsIG5hdGl2ZSBvYmplY3Q7IGJ1dCB3aGVuIHlvdSBpbnZva2UgYSBtZXRob2Qgb24gdGhlIHByb3h5IAorICAgICAgICBvYmplY3QsIHRoZSBiaW5kaW5nIGNvbnZlcnRzIGl0IGludG8gYSBEQnVzIG1ldGhvZCBjYWxsIG1lc3NhZ2UsIHdhaXRzIGZvciB0aGUgcmVwbHkgCisgICAgICAgIG1lc3NhZ2UsIHVucGFja3MgdGhlIHJldHVybiB2YWx1ZSwgYW5kIHJldHVybnMgaXQgZnJvbSB0aGUgbmF0aXZlIG1ldGhvZC4uCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgSW4gcHNldWRvY29kZSwgcHJvZ3JhbW1pbmcgd2l0aG91dCBwcm94aWVzIG1pZ2h0IGxvb2sgbGlrZSB0aGlzOgorICAgICAgICA8cHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gbmV3IE1lc3NhZ2UoIi9yZW1vdGUvb2JqZWN0L3BhdGgiLCAiTWV0aG9kTmFtZSIsIGFyZzEsIGFyZzIpOworICAgICAgICAgIENvbm5lY3Rpb24gY29ubmVjdGlvbiA9IGdldEJ1c0Nvbm5lY3Rpb24oKTsKKyAgICAgICAgICBjb25uZWN0aW9uLnNlbmQobWVzc2FnZSk7CisgICAgICAgICAgTWVzc2FnZSByZXBseSA9IGNvbm5lY3Rpb24ud2FpdEZvclJlcGx5KG1lc3NhZ2UpOworICAgICAgICAgIGlmIChyZXBseS5pc0Vycm9yKCkpIHsKKyAgICAgICAgICAgICAKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgIE9iamVjdCByZXR1cm5WYWx1ZSA9IHJlcGx5LmdldFJldHVyblZhbHVlKCk7CisgICAgICAgICAgfQorICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgIFByb2dyYW1taW5nIHdpdGggcHJveGllcyBtaWdodCBsb29rIGxpa2UgdGhpczoKKyAgICAgICAgPHByb2dyYW1saXN0aW5nPgorICAgICAgICAgIFByb3h5IHByb3h5ID0gbmV3IFByb3h5KGdldEJ1c0Nvbm5lY3Rpb24oKSwgIi9yZW1vdGUvb2JqZWN0L3BhdGgiKTsKKyAgICAgICAgICBPYmplY3QgcmV0dXJuVmFsdWUgPSBwcm94eS5NZXRob2ROYW1lKGFyZzEsIGFyZzIpOworICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgPC9wYXJhPgorICAgIDwvc2VjdDI+CisKKyAgICA8c2VjdDIgaWQ9ImJ1cy1uYW1lcyI+CisgICAgICA8dGl0bGU+QnVzIE5hbWVzPC90aXRsZT4KKworICAgICAgPHBhcmE+CisgICAgICAgIFdoZW4gZWFjaCBhcHBsaWNhdGlvbiBjb25uZWN0cyB0byB0aGUgYnVzIGRhZW1vbiwgdGhlIGRhZW1vbiBpbW1lZGlhdGVseQorICAgICAgICBhc3NpZ25zIGl0IGEgbmFtZSwgY2FsbGVkIHRoZSA8Zmlyc3R0ZXJtPnVuaXF1ZSBjb25uZWN0aW9uIG5hbWU8L2ZpcnN0dGVybT4uCisgICAgICAgIEEgdW5pcXVlIG5hbWUgYmVnaW5zIHdpdGggYSAnOicgKGNvbG9uKSBjaGFyYWN0ZXIuIFRoZXNlIG5hbWVzIGFyZSBuZXZlciAKKyAgICAgICAgcmV1c2VkIGR1cmluZyB0aGUgbGlmZXRpbWUgb2YgdGhlIGJ1cyBkYWVtb24gLSB0aGF0IGlzLCB5b3Uga25vdyAKKyAgICAgICAgYSBnaXZlbiBuYW1lIHdpbGwgYWx3YXlzIHJlZmVyIHRvIHRoZSBzYW1lIGFwcGxpY2F0aW9uLgorICAgICAgICBBbiBleGFtcGxlIG9mIGEgdW5pcXVlIG5hbWUgbWlnaHQgYmUKKyAgICAgICAgPGxpdGVyYWw+OjM0LTkwNzwvbGl0ZXJhbD4uIFRoZSBudW1iZXJzIGFmdGVyIHRoZSBjb2xvbiBoYXZlIAorICAgICAgICBubyBtZWFuaW5nIG90aGVyIHRoYW4gdGhlaXIgdW5pcXVlbmVzcy4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIFdoZW4gYSBuYW1lIGlzIG1hcHBlZCAKKyAgICAgICAgdG8gYSBwYXJ0aWN1bGFyIGFwcGxpY2F0aW9uJ3MgY29ubmVjdGlvbiwgdGhhdCBhcHBsaWNhdGlvbiBpcyBzYWlkIHRvIAorICAgICAgICA8Zmlyc3R0ZXJtPm93bjwvZmlyc3R0ZXJtPiB0aGF0IG5hbWUuCisgICAgICA8L3BhcmE+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBBcHBsaWNhdGlvbnMgbWF5IGFzayB0byBvd24gYWRkaXRpb25hbCA8Zmlyc3R0ZXJtPndlbGwta25vd24KKyAgICAgICAgbmFtZXM8L2ZpcnN0dGVybT4uIEZvciBleGFtcGxlLCB5b3UgY291bGQgd3JpdGUgYSBzcGVjaWZpY2F0aW9uIHRvCisgICAgICAgIGRlZmluZSBhIG5hbWUgY2FsbGVkIDxsaXRlcmFsPmNvbS5teWNvbXBhbnkuVGV4dEVkaXRvcjwvbGl0ZXJhbD4uCisgICAgICAgIFlvdXIgZGVmaW5pdGlvbiBjb3VsZCBzcGVjaWZ5IHRoYXQgdG8gb3duIHRoaXMgbmFtZSwgYW4gYXBwbGljYXRpb24KKyAgICAgICAgc2hvdWxkIGhhdmUgYW4gb2JqZWN0IGF0IHRoZSBwYXRoCisgICAgICAgIDxsaXRlcmFsPi9jb20vbXljb21wYW55L1RleHRGaWxlTWFuYWdlcjwvbGl0ZXJhbD4gc3VwcG9ydGluZyB0aGUKKyAgICAgICAgaW50ZXJmYWNlIDxsaXRlcmFsPm9yZy5mcmVlZGVza3RvcC5GaWxlSGFuZGxlcjwvbGl0ZXJhbD4uCisgICAgICA8L3BhcmE+CisgICAgICAKKyAgICAgIDxwYXJhPgorICAgICAgICBBcHBsaWNhdGlvbnMgY291bGQgdGhlbiBzZW5kIG1lc3NhZ2VzIHRvIHRoaXMgYnVzIG5hbWUsIAorICAgICAgICBvYmplY3QsIGFuZCBpbnRlcmZhY2UgdG8gZXhlY3V0ZSBtZXRob2QgY2FsbHMuCisgICAgICA8L3BhcmE+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBZb3UgY291bGQgdGhpbmsgb2YgdGhlIHVuaXF1ZSBuYW1lcyBhcyBJUCBhZGRyZXNzZXMsIGFuZCB0aGUKKyAgICAgICAgd2VsbC1rbm93biBuYW1lcyBhcyBkb21haW4gbmFtZXMuIFNvCisgICAgICAgIDxsaXRlcmFsPmNvbS5teWNvbXBhbnkuVGV4dEVkaXRvcjwvbGl0ZXJhbD4gbWlnaHQgbWFwIHRvIHNvbWV0aGluZyBsaWtlCisgICAgICAgIDxsaXRlcmFsPjozNC05MDc8L2xpdGVyYWw+IGp1c3QgYXMgPGxpdGVyYWw+bXljb21wYW55LmNvbTwvbGl0ZXJhbD4gbWFwcworICAgICAgICB0byBzb21ldGhpbmcgbGlrZSA8bGl0ZXJhbD4xOTIuMTY4LjAuNTwvbGl0ZXJhbD4uCisgICAgICA8L3BhcmE+CisgICAgICAKKyAgICAgIDxwYXJhPgorICAgICAgICBOYW1lcyBoYXZlIGEgc2Vjb25kIGltcG9ydGFudCB1c2UsIG90aGVyIHRoYW4gcm91dGluZyBtZXNzYWdlcy4gIFRoZXkKKyAgICAgICAgYXJlIHVzZWQgdG8gdHJhY2sgbGlmZWN5Y2xlLiBXaGVuIGFuIGFwcGxpY2F0aW9uIGV4aXRzIChvciBjcmFzaGVzKSwgaXRzCisgICAgICAgIGNvbm5lY3Rpb24gdG8gdGhlIG1lc3NhZ2UgYnVzIHdpbGwgYmUgY2xvc2VkIGJ5IHRoZSBvcGVyYXRpbmcgc3lzdGVtCisgICAgICAgIGtlcm5lbC4gVGhlIG1lc3NhZ2UgYnVzIHRoZW4gc2VuZHMgb3V0IG5vdGlmaWNhdGlvbiBtZXNzYWdlcyB0ZWxsaW5nCisgICAgICAgIHJlbWFpbmluZyBhcHBsaWNhdGlvbnMgdGhhdCB0aGUgYXBwbGljYXRpb24ncyBuYW1lcyBoYXZlIGxvc3QgdGhlaXIKKyAgICAgICAgb3duZXIuIEJ5IHRyYWNraW5nIHRoZXNlIG5vdGlmaWNhdGlvbnMsIHlvdXIgYXBwbGljYXRpb24gY2FuIHJlbGlhYmx5CisgICAgICAgIG1vbml0b3IgdGhlIGxpZmV0aW1lIG9mIG90aGVyIGFwcGxpY2F0aW9ucy4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIEJ1cyBuYW1lcyBjYW4gYWxzbyBiZSB1c2VkIHRvIGNvb3JkaW5hdGUgc2luZ2xlLWluc3RhbmNlIGFwcGxpY2F0aW9ucy4KKyAgICAgICAgSWYgeW91IHdhbnQgdG8gYmUgc3VyZSBvbmx5IG9uZQorICAgICAgICA8bGl0ZXJhbD5jb20ubXljb21wYW55LlRleHRFZGl0b3I8L2xpdGVyYWw+IGFwcGxpY2F0aW9uIGlzIHJ1bm5pbmcgZm9yCisgICAgICAgIGV4YW1wbGUsIGhhdmUgdGhlIHRleHQgZWRpdG9yIGFwcGxpY2F0aW9uIGV4aXQgaWYgdGhlIGJ1cyBuYW1lIGFscmVhZHkKKyAgICAgICAgaGFzIGFuIG93bmVyLgorICAgICAgPC9wYXJhPgorCisgICAgPC9zZWN0Mj4KKworICAgIDxzZWN0MiBpZD0iYWRkcmVzc2VzIj4KKyAgICAgIDx0aXRsZT5BZGRyZXNzZXM8L3RpdGxlPgorCisgICAgICA8cGFyYT4KKyAgICAgICAgQXBwbGljYXRpb25zIHVzaW5nIEQtQnVzIGFyZSBlaXRoZXIgc2VydmVycyBvciBjbGllbnRzLiAgQSBzZXJ2ZXIKKyAgICAgICAgbGlzdGVucyBmb3IgaW5jb21pbmcgY29ubmVjdGlvbnM7IGEgY2xpZW50IGNvbm5lY3RzIHRvIGEgc2VydmVyLiBPbmNlCisgICAgICAgIHRoZSBjb25uZWN0aW9uIGlzIGVzdGFibGlzaGVkLCBpdCBpcyBhIHN5bW1ldHJpYyBmbG93IG9mIG1lc3NhZ2VzOyB0aGUKKyAgICAgICAgY2xpZW50LXNlcnZlciBkaXN0aW5jdGlvbiBvbmx5IG1hdHRlcnMgd2hlbiBzZXR0aW5nIHVwIHRoZSAKKyAgICAgICAgY29ubmVjdGlvbi4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIElmIHlvdSdyZSB1c2luZyB0aGUgYnVzIGRhZW1vbiwgYXMgeW91IHByb2JhYmx5IGFyZSwgeW91ciBhcHBsaWNhdGlvbiAKKyAgICAgICAgd2lsbCBiZSBhIGNsaWVudCBvZiB0aGUgYnVzIGRhZW1vbi4gVGhhdCBpcywgdGhlIGJ1cyBkYWVtb24gbGlzdGVucyAKKyAgICAgICAgZm9yIGNvbm5lY3Rpb25zIGFuZCB5b3VyIGFwcGxpY2F0aW9uIGluaXRpYXRlcyBhIGNvbm5lY3Rpb24gdG8gdGhlIGJ1cyAKKyAgICAgICAgZGFlbW9uLgorICAgICAgPC9wYXJhPgorCisgICAgICA8cGFyYT4KKyAgICAgICAgQSBELUJ1cyA8Zmlyc3R0ZXJtPmFkZHJlc3M8L2ZpcnN0dGVybT4gc3BlY2lmaWVzIHdoZXJlIGEgc2VydmVyIHdpbGwKKyAgICAgICAgbGlzdGVuLCBhbmQgd2hlcmUgYSBjbGllbnQgd2lsbCBjb25uZWN0LiAgRm9yIGV4YW1wbGUsIHRoZSBhZGRyZXNzCisgICAgICAgIDxsaXRlcmFsPnVuaXg6cGF0aD0vdG1wL2FiY2RlZjwvbGl0ZXJhbD4gc3BlY2lmaWVzIHRoYXQgdGhlIHNlcnZlciB3aWxsCisgICAgICAgIGxpc3RlbiBvbiBhIFVOSVggZG9tYWluIHNvY2tldCBhdCB0aGUgcGF0aAorICAgICAgICA8bGl0ZXJhbD4vdG1wL2FiY2RlZjwvbGl0ZXJhbD4gYW5kIHRoZSBjbGllbnQgd2lsbCBjb25uZWN0IHRvIHRoYXQKKyAgICAgICAgc29ja2V0LiBBbiBhZGRyZXNzIGNhbiBhbHNvIHNwZWNpZnkgVENQL0lQIHNvY2tldHMsIG9yIGFueSBvdGhlcgorICAgICAgICB0cmFuc3BvcnQgZGVmaW5lZCBpbiBmdXR1cmUgaXRlcmF0aW9ucyBvZiB0aGUgRC1CdXMgc3BlY2lmaWNhdGlvbi4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIFdoZW4gdXNpbmcgRC1CdXMgd2l0aCBhIG1lc3NhZ2UgYnVzIGRhZW1vbiwKKyAgICAgICAgbGliZGJ1cyBhdXRvbWF0aWNhbGx5IGRpc2NvdmVycyB0aGUgYWRkcmVzcyBvZiB0aGUgcGVyLXNlc3Npb24gYnVzIAorICAgICAgICBkYWVtb24gYnkgcmVhZGluZyBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZS4gSXQgZGlzY292ZXJzIHRoZSAKKyAgICAgICAgc3lzdGVtd2lkZSBidXMgZGFlbW9uIGJ5IGNoZWNraW5nIGEgd2VsbC1rbm93biBVTklYIGRvbWFpbiBzb2NrZXQgcGF0aAorICAgICAgICAodGhvdWdoIHlvdSBjYW4gb3ZlcnJpZGUgdGhpcyBhZGRyZXNzIHdpdGggYW4gZW52aXJvbm1lbnQgdmFyaWFibGUpLgorICAgICAgPC9wYXJhPgorCisgICAgICA8cGFyYT4KKyAgICAgICAgSWYgeW91J3JlIHVzaW5nIEQtQnVzIHdpdGhvdXQgYSBidXMgZGFlbW9uLCBpdCdzIHVwIHRvIHlvdSB0byAKKyAgICAgICAgZGVmaW5lIHdoaWNoIGFwcGxpY2F0aW9uIHdpbGwgYmUgdGhlIHNlcnZlciBhbmQgd2hpY2ggd2lsbCBiZSAKKyAgICAgICAgdGhlIGNsaWVudCwgYW5kIHNwZWNpZnkgYSBtZWNoYW5pc20gZm9yIHRoZW0gdG8gYWdyZWUgb24gCisgICAgICAgIHRoZSBzZXJ2ZXIncyBhZGRyZXNzLiBUaGlzIGlzIGFuIHVudXN1YWwgY2FzZS4KKyAgICAgIDwvcGFyYT4KKworICAgIDwvc2VjdDI+CisKKyAgICA8c2VjdDIgaWQ9ImJpZ3BpY3R1cmUiPgorICAgICAgPHRpdGxlPkJpZyBDb25jZXB0dWFsIFBpY3R1cmU8L3RpdGxlPgorCisgICAgICA8cGFyYT4KKyAgICAgICAgUHVsbGluZyBhbGwgdGhlc2UgY29uY2VwdHMgdG9nZXRoZXIsIHRvIHNwZWNpZnkgYSBwYXJ0aWN1bGFyIAorICAgICAgICBtZXRob2QgY2FsbCBvbiBhIHBhcnRpY3VsYXIgb2JqZWN0IGluc3RhbmNlLCBhIG51bWJlciBvZiAKKyAgICAgICAgbmVzdGVkIGNvbXBvbmVudHMgaGF2ZSB0byBiZSBuYW1lZDoKKyAgICAgICAgPHByb2dyYW1saXN0aW5nPgorICAgICAgICAgIEFkZHJlc3MgLSZndDsgW0J1cyBOYW1lXSAtJmd0OyBQYXRoIC0mZ3Q7IEludGVyZmFjZSAtJmd0OyBNZXRob2QKKyAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgVGhlIGJ1cyBuYW1lIGlzIGluIGJyYWNrZXRzIHRvIGluZGljYXRlIHRoYXQgaXQncyBvcHRpb25hbCAtLSB5b3Ugb25seQorICAgICAgICBwcm92aWRlIGEgbmFtZSB0byByb3V0ZSB0aGUgbWV0aG9kIGNhbGwgdG8gdGhlIHJpZ2h0IGFwcGxpY2F0aW9uCisgICAgICAgIHdoZW4gdXNpbmcgdGhlIGJ1cyBkYWVtb24uIElmIHlvdSBoYXZlIGEgZGlyZWN0IGNvbm5lY3Rpb24gdG8gYW5vdGhlcgorICAgICAgICBhcHBsaWNhdGlvbiwgYnVzIG5hbWVzIGFyZW4ndCB1c2VkOyB0aGVyZSdzIG5vIGJ1cyBkYWVtb24uCisgICAgICA8L3BhcmE+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBUaGUgaW50ZXJmYWNlIGlzIGFsc28gb3B0aW9uYWwsIHByaW1hcmlseSBmb3IgaGlzdG9yaWNhbCAKKyAgICAgICAgcmVhc29uczsgRENPUCBkb2VzIG5vdCByZXF1aXJlIHNwZWNpZnlpbmcgdGhlIGludGVyZmFjZSwgCisgICAgICAgIGluc3RlYWQgc2ltcGx5IGZvcmJpZGRpbmcgZHVwbGljYXRlIG1ldGhvZCBuYW1lcyAKKyAgICAgICAgb24gdGhlIHNhbWUgb2JqZWN0IGluc3RhbmNlLiBELUJ1cyB3aWxsIHRodXMgbGV0IHlvdSAKKyAgICAgICAgb21pdCB0aGUgaW50ZXJmYWNlLCBidXQgaWYgeW91ciBtZXRob2QgbmFtZSBpcyBhbWJpZ3VvdXMgCisgICAgICAgIGl0IGlzIHVuZGVmaW5lZCB3aGljaCBtZXRob2Qgd2lsbCBiZSBpbnZva2VkLgorICAgICAgPC9wYXJhPgorCisgICAgPC9zZWN0Mj4KKworICAgIDxzZWN0MiBpZD0ibWVzc2FnZXMiPgorICAgICAgPHRpdGxlPk1lc3NhZ2VzIC0gQmVoaW5kIHRoZSBTY2VuZXM8L3RpdGxlPgorICAgICAgPHBhcmE+CisgICAgICAgIEQtQnVzIHdvcmtzIGJ5IHNlbmRpbmcgbWVzc2FnZXMgYmV0d2VlbiBwcm9jZXNzZXMuIElmIHlvdSdyZSB1c2luZyAKKyAgICAgICAgYSBzdWZmaWNpZW50bHkgaGlnaC1sZXZlbCBiaW5kaW5nLCB5b3UgbWF5IG5ldmVyIHdvcmsgd2l0aCBtZXNzYWdlcyBkaXJlY3RseS4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBUaGVyZSBhcmUgNCBtZXNzYWdlIHR5cGVzOgorICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICBNZXRob2QgY2FsbCBtZXNzYWdlcyBhc2sgdG8gaW52b2tlIGEgbWV0aG9kIAorICAgICAgICAgICAgICBvbiBhbiBvYmplY3QuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgTWV0aG9kIHJldHVybiBtZXNzYWdlcyByZXR1cm4gdGhlIHJlc3VsdHMgCisgICAgICAgICAgICAgIG9mIGludm9raW5nIGEgbWV0aG9kLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgIEVycm9yIG1lc3NhZ2VzIHJldHVybiBhbiBleGNlcHRpb24gY2F1c2VkIGJ5IAorICAgICAgICAgICAgICBpbnZva2luZyBhIG1ldGhvZC4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICBTaWduYWwgbWVzc2FnZXMgYXJlIG5vdGlmaWNhdGlvbnMgdGhhdCBhIGdpdmVuIHNpZ25hbCAKKyAgICAgICAgICAgICAgaGFzIGJlZW4gZW1pdHRlZCAodGhhdCBhbiBldmVudCBoYXMgb2NjdXJyZWQpLiAKKyAgICAgICAgICAgICAgWW91IGNvdWxkIGFsc28gdGhpbmsgb2YgdGhlc2UgYXMgImV2ZW50IiBtZXNzYWdlcy4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBBIG1ldGhvZCBjYWxsIG1hcHMgdmVyeSBzaW1wbHkgdG8gbWVzc2FnZXM6IHlvdSBzZW5kIGEgbWV0aG9kIGNhbGwKKyAgICAgICAgbWVzc2FnZSwgYW5kIHJlY2VpdmUgZWl0aGVyIGEgbWV0aG9kIHJldHVybiBtZXNzYWdlIG9yIGFuIGVycm9yIG1lc3NhZ2UKKyAgICAgICAgaW4gcmVwbHkuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgRWFjaCBtZXNzYWdlIGhhcyBhIDxmaXJzdHRlcm0+aGVhZGVyPC9maXJzdHRlcm0+LCBpbmNsdWRpbmcgPGZpcnN0dGVybT5maWVsZHM8L2ZpcnN0dGVybT4sIAorICAgICAgICBhbmQgYSA8Zmlyc3R0ZXJtPmJvZHk8L2ZpcnN0dGVybT4sIGluY2x1ZGluZyA8Zmlyc3R0ZXJtPmFyZ3VtZW50czwvZmlyc3R0ZXJtPi4gWW91IGNhbiB0aGluayAKKyAgICAgICAgb2YgdGhlIGhlYWRlciBhcyB0aGUgcm91dGluZyBpbmZvcm1hdGlvbiBmb3IgdGhlIG1lc3NhZ2UsIGFuZCB0aGUgYm9keSBhcyB0aGUgcGF5bG9hZC4KKyAgICAgICAgSGVhZGVyIGZpZWxkcyBtaWdodCBpbmNsdWRlIHRoZSBzZW5kZXIgYnVzIG5hbWUsIGRlc3RpbmF0aW9uIGJ1cyBuYW1lLCBtZXRob2Qgb3Igc2lnbmFsIG5hbWUsIAorICAgICAgICBhbmQgc28gZm9ydGguIE9uZSBvZiB0aGUgaGVhZGVyIGZpZWxkcyBpcyBhIDxmaXJzdHRlcm0+dHlwZSBzaWduYXR1cmU8L2ZpcnN0dGVybT4gZGVzY3JpYmluZyB0aGUgCisgICAgICAgIHZhbHVlcyBmb3VuZCBpbiB0aGUgYm9keS4gRm9yIGV4YW1wbGUsIHRoZSBsZXR0ZXIgImkiIG1lYW5zICIzMi1iaXQgaW50ZWdlciIgc28gdGhlIHNpZ25hdHVyZSAKKyAgICAgICAgImlpIiBtZWFucyB0aGUgcGF5bG9hZCBoYXMgdHdvIDMyLWJpdCBpbnRlZ2Vycy4KKyAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3QyPgorCisgICAgPHNlY3QyIGlkPSJjYWxscHJvY2VkdXJlIj4KKyAgICAgIDx0aXRsZT5DYWxsaW5nIGEgTWV0aG9kIC0gQmVoaW5kIHRoZSBTY2VuZXM8L3RpdGxlPgorCisgICAgICA8cGFyYT4KKyAgICAgICAgQSBtZXRob2QgY2FsbCBpbiBEQnVzIGNvbnNpc3RzIG9mIHR3byBtZXNzYWdlczsgYSBtZXRob2QgY2FsbCBtZXNzYWdlIHNlbnQgZnJvbSBwcm9jZXNzIEEgdG8gcHJvY2VzcyBCLCAKKyAgICAgICAgYW5kIGEgbWF0Y2hpbmcgbWV0aG9kIHJlcGx5IG1lc3NhZ2Ugc2VudCBmcm9tIHByb2Nlc3MgQiB0byBwcm9jZXNzIEEuIEJvdGggdGhlIGNhbGwgYW5kIHRoZSByZXBseSBtZXNzYWdlcworICAgICAgICBhcmUgcm91dGVkIHRocm91Z2ggdGhlIGJ1cyBkYWVtb24uIFRoZSBjYWxsZXIgaW5jbHVkZXMgYSBkaWZmZXJlbnQgc2VyaWFsIG51bWJlciBpbiBlYWNoIGNhbGwgbWVzc2FnZSwgYW5kIHRoZQorICAgICAgICByZXBseSBtZXNzYWdlIGluY2x1ZGVzIHRoaXMgbnVtYmVyIHRvIGFsbG93IHRoZSBjYWxsZXIgdG8gbWF0Y2ggcmVwbGllcyB0byBjYWxscy4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIFRoZSBjYWxsIG1lc3NhZ2Ugd2lsbCBjb250YWluIGFueSBhcmd1bWVudHMgdG8gdGhlIG1ldGhvZC4KKyAgICAgICAgVGhlIHJlcGx5IG1lc3NhZ2UgbWF5IGluZGljYXRlIGFuIGVycm9yLCBvciBtYXkgY29udGFpbiBkYXRhIHJldHVybmVkIGJ5IHRoZSBtZXRob2QuCisgICAgICA8L3BhcmE+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBBIG1ldGhvZCBpbnZvY2F0aW9uIGluIERCdXMgaGFwcGVucyBhcyBmb2xsb3dzOgorICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICBUaGUgbGFuZ3VhZ2UgYmluZGluZyBtYXkgcHJvdmlkZSBhIHByb3h5LCBzdWNoIHRoYXQgaW52b2tpbmcgYSBtZXRob2Qgb24gCisgICAgICAgICAgICAgIGFuIGluLXByb2Nlc3Mgb2JqZWN0IGludm9rZXMgYSBtZXRob2Qgb24gYSByZW1vdGUgb2JqZWN0IGluIGFub3RoZXIgcHJvY2Vzcy4gSWYgc28sIHRoZSAKKyAgICAgICAgICAgICAgYXBwbGljYXRpb24gY2FsbHMgYSBtZXRob2Qgb24gdGhlIHByb3h5LCBhbmQgdGhlIHByb3h5CisgICAgICAgICAgICAgIGNvbnN0cnVjdHMgYSBtZXRob2QgY2FsbCBtZXNzYWdlIHRvIHNlbmQgdG8gdGhlIHJlbW90ZSBwcm9jZXNzLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgIEZvciBtb3JlIGxvdy1sZXZlbCBBUElzLCB0aGUgYXBwbGljYXRpb24gbWF5IGNvbnN0cnVjdCBhIG1ldGhvZCBjYWxsIG1lc3NhZ2UgaXRzZWxmLCB3aXRob3V0CisgICAgICAgICAgICAgIHVzaW5nIGEgcHJveHkuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgSW4gZWl0aGVyIGNhc2UsIHRoZSBtZXRob2QgY2FsbCBtZXNzYWdlIGNvbnRhaW5zOiBhIGJ1cyBuYW1lIGJlbG9uZ2luZyB0byB0aGUgcmVtb3RlIHByb2Nlc3M7IHRoZSBuYW1lIG9mIHRoZSBtZXRob2Q7IAorICAgICAgICAgICAgICB0aGUgYXJndW1lbnRzIHRvIHRoZSBtZXRob2Q7IGFuIG9iamVjdCBwYXRoIGluc2lkZSB0aGUgcmVtb3RlIHByb2Nlc3M7IGFuZCBvcHRpb25hbGx5IHRoZSBuYW1lIG9mIHRoZSAKKyAgICAgICAgICAgICAgaW50ZXJmYWNlIHRoYXQgc3BlY2lmaWVzIHRoZSBtZXRob2QuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgVGhlIG1ldGhvZCBjYWxsIG1lc3NhZ2UgaXMgc2VudCB0byB0aGUgYnVzIGRhZW1vbi4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICBUaGUgYnVzIGRhZW1vbiBsb29rcyBhdCB0aGUgZGVzdGluYXRpb24gYnVzIG5hbWUuIElmIGEgcHJvY2VzcyBvd25zIHRoYXQgbmFtZSwgCisgICAgICAgICAgICAgIHRoZSBidXMgZGFlbW9uIGZvcndhcmRzIHRoZSBtZXRob2QgY2FsbCB0byB0aGF0IHByb2Nlc3MuIE90aGVyd2lzZSwgdGhlIGJ1cyBkYWVtb24KKyAgICAgICAgICAgICAgY3JlYXRlcyBhbiBlcnJvciBtZXNzYWdlIGFuZCBzZW5kcyBpdCBiYWNrIGFzIHRoZSByZXBseSB0byB0aGUgbWV0aG9kIGNhbGwgbWVzc2FnZS4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICBUaGUgcmVjZWl2aW5nIHByb2Nlc3MgdW5wYWNrcyB0aGUgbWV0aG9kIGNhbGwgbWVzc2FnZS4gSW4gYSBzaW1wbGUgbG93LWxldmVsIEFQSSBzaXR1YXRpb24sIGl0IAorICAgICAgICAgICAgICBtYXkgaW1tZWRpYXRlbHkgcnVuIHRoZSBtZXRob2QgYW5kIHNlbmQgYSBtZXRob2QgcmVwbHkgbWVzc2FnZSB0byB0aGUgYnVzIGRhZW1vbi4KKyAgICAgICAgICAgICAgV2hlbiB1c2luZyBhIGhpZ2gtbGV2ZWwgYmluZGluZyBBUEksIHRoZSBiaW5kaW5nIG1pZ2h0IGV4YW1pbmUgdGhlIG9iamVjdCBwYXRoLCBpbnRlcmZhY2UsCisgICAgICAgICAgICAgIGFuZCBtZXRob2QgbmFtZSwgYW5kIGNvbnZlcnQgdGhlIG1ldGhvZCBjYWxsIG1lc3NhZ2UgaW50byBhbiBpbnZvY2F0aW9uIG9mIGEgbWV0aG9kIG9uIAorICAgICAgICAgICAgICBhIG5hdGl2ZSBvYmplY3QgKEdPYmplY3QsIGphdmEubGFuZy5PYmplY3QsIFFPYmplY3QsIGV0Yy4pLCB0aGVuIGNvbnZlcnQgdGhlIHJldHVybiAKKyAgICAgICAgICAgICAgdmFsdWUgZnJvbSB0aGUgbmF0aXZlIG1ldGhvZCBpbnRvIGEgbWV0aG9kIHJlcGx5IG1lc3NhZ2UuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgVGhlIGJ1cyBkYWVtb24gcmVjZWl2ZXMgdGhlIG1ldGhvZCByZXBseSBtZXNzYWdlIGFuZCBzZW5kcyBpdCB0byB0aGUgcHJvY2VzcyB0aGF0IAorICAgICAgICAgICAgICBtYWRlIHRoZSBtZXRob2QgY2FsbC4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICBUaGUgcHJvY2VzcyB0aGF0IG1hZGUgdGhlIG1ldGhvZCBjYWxsIGxvb2tzIGF0IHRoZSBtZXRob2QgcmVwbHkgYW5kIG1ha2VzIHVzZSBvZiBhbnkgCisgICAgICAgICAgICAgIHJldHVybiB2YWx1ZXMgaW5jbHVkZWQgaW4gdGhlIHJlcGx5LiBUaGUgcmVwbHkgbWF5IGFsc28gaW5kaWNhdGUgdGhhdCBhbiBlcnJvciBvY2N1cnJlZC4KKyAgICAgICAgICAgICAgV2hlbiB1c2luZyBhIGJpbmRpbmcsIHRoZSBtZXRob2QgcmVwbHkgbWVzc2FnZSBtYXkgYmUgY29udmVydGVkIGludG8gdGhlIHJldHVybiB2YWx1ZSBvZiAKKyAgICAgICAgICAgICAgb2YgYSBwcm94eSBtZXRob2QsIG9yIGludG8gYW4gZXhjZXB0aW9uLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgPC9wYXJhPgorCisgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIGJ1cyBkYWVtb24gbmV2ZXIgcmVvcmRlcnMgbWVzc2FnZXMuIFRoYXQgaXMsIGlmIHlvdSBzZW5kIHR3byBtZXRob2QgY2FsbCBtZXNzYWdlcyB0byB0aGUgc2FtZSByZWNpcGllbnQsIAorICAgICAgICB0aGV5IHdpbGwgYmUgcmVjZWl2ZWQgaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSBzZW50LiBUaGUgcmVjaXBpZW50IGlzIG5vdCByZXF1aXJlZCB0byByZXBseSB0byB0aGUgY2FsbHMKKyAgICAgICAgaW4gb3JkZXIsIGhvd2V2ZXI7IGZvciBleGFtcGxlLCBpdCBtYXkgcHJvY2VzcyBlYWNoIG1ldGhvZCBjYWxsIGluIGEgc2VwYXJhdGUgdGhyZWFkLCBhbmQgcmV0dXJuIHJlcGx5IG1lc3NhZ2VzCisgICAgICAgIGluIGFuIHVuZGVmaW5lZCBvcmRlciBkZXBlbmRpbmcgb24gd2hlbiB0aGUgdGhyZWFkcyBjb21wbGV0ZS4gTWV0aG9kIGNhbGxzIGhhdmUgYSB1bmlxdWUgc2VyaWFsIAorICAgICAgICBudW1iZXIgdXNlZCBieSB0aGUgbWV0aG9kIGNhbGxlciB0byBtYXRjaCByZXBseSBtZXNzYWdlcyB0byBjYWxsIG1lc3NhZ2VzLgorICAgICAgPC9wYXJhPgorCisgICAgPC9zZWN0Mj4KKworICAgIDxzZWN0MiBpZD0ic2lnbmFscHJvY2VkdXJlIj4KKyAgICAgIDx0aXRsZT5FbWl0dGluZyBhIFNpZ25hbCAtIEJlaGluZCB0aGUgU2NlbmVzPC90aXRsZT4KKworICAgICAgPHBhcmE+CisgICAgICAgIEEgc2lnbmFsIGluIERCdXMgY29uc2lzdHMgb2YgYSBzaW5nbGUgbWVzc2FnZSwgc2VudCBieSBvbmUgcHJvY2VzcyB0byBhbnkgbnVtYmVyIG9mIG90aGVyIHByb2Nlc3Nlcy4gCisgICAgICAgIFRoYXQgaXMsIGEgc2lnbmFsIGlzIGEgdW5pZGlyZWN0aW9uYWwgYnJvYWRjYXN0LiBUaGUgc2lnbmFsIG1heSBjb250YWluIGFyZ3VtZW50cyAoYSBkYXRhIHBheWxvYWQpLCBidXQgCisgICAgICAgIGJlY2F1c2UgaXQgaXMgYSBicm9hZGNhc3QsIGl0IG5ldmVyIGhhcyBhICJyZXR1cm4gdmFsdWUuIiBDb250cmFzdCB0aGlzIHdpdGggYSBtZXRob2QgY2FsbCAKKyAgICAgICAgKHNlZSA8eHJlZiBsaW5rZW5kPSJjYWxscHJvY2VkdXJlIi8+KSB3aGVyZSB0aGUgbWV0aG9kIGNhbGwgbWVzc2FnZSBoYXMgYSBtYXRjaGluZyBtZXRob2QgcmVwbHkgbWVzc2FnZS4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIFRoZSBlbWl0dGVyIChha2Egc2VuZGVyKSBvZiBhIHNpZ25hbCBoYXMgbm8ga25vd2xlZGdlIG9mIHRoZSBzaWduYWwgcmVjaXBpZW50cy4gUmVjaXBpZW50cyByZWdpc3RlcgorICAgICAgICB3aXRoIHRoZSBidXMgZGFlbW9uIHRvIHJlY2VpdmUgc2lnbmFscyBiYXNlZCBvbiAibWF0Y2ggcnVsZXMiIC0gdGhlc2UgcnVsZXMgd291bGQgdHlwaWNhbGx5IGluY2x1ZGUgdGhlIHNlbmRlciBhbmQgCisgICAgICAgIHRoZSBzaWduYWwgbmFtZS4gVGhlIGJ1cyBkYWVtb24gc2VuZHMgZWFjaCBzaWduYWwgb25seSB0byByZWNpcGllbnRzIHdobyBoYXZlIGV4cHJlc3NlZCBpbnRlcmVzdCBpbiB0aGF0IAorICAgICAgICBzaWduYWwuCisgICAgICA8L3BhcmE+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBBIHNpZ25hbCBpbiBEQnVzIGhhcHBlbnMgYXMgZm9sbG93czoKKyAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgQSBzaWduYWwgbWVzc2FnZSBpcyBjcmVhdGVkIGFuZCBzZW50IHRvIHRoZSBidXMgZGFlbW9uLiBXaGVuIHVzaW5nIHRoZSBsb3ctbGV2ZWwgQVBJIHRoaXMgbWF5IGJlIAorICAgICAgICAgICAgICBkb25lIG1hbnVhbGx5LCB3aXRoIGNlcnRhaW4gYmluZGluZ3MgaXQgbWF5IGJlIGRvbmUgZm9yIHlvdSBieSB0aGUgYmluZGluZyB3aGVuIGEgbmF0aXZlIG9iamVjdAorICAgICAgICAgICAgICBlbWl0cyBhIG5hdGl2ZSBzaWduYWwgb3IgZXZlbnQuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgVGhlIHNpZ25hbCBtZXNzYWdlIGNvbnRhaW5zIHRoZSBuYW1lIG9mIHRoZSBpbnRlcmZhY2UgdGhhdCBzcGVjaWZpZXMgdGhlIHNpZ25hbDsKKyAgICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHNpZ25hbDsgdGhlIGJ1cyBuYW1lIG9mIHRoZSBwcm9jZXNzIHNlbmRpbmcgdGhlIHNpZ25hbDsgYW5kIAorICAgICAgICAgICAgICBhbnkgYXJndW1lbnRzIAorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgIEFueSBwcm9jZXNzIG9uIHRoZSBtZXNzYWdlIGJ1cyBjYW4gcmVnaXN0ZXIgIm1hdGNoIHJ1bGVzIiBpbmRpY2F0aW5nIHdoaWNoIHNpZ25hbHMgaXQgCisgICAgICAgICAgICAgIGlzIGludGVyZXN0ZWQgaW4uIFRoZSBidXMgaGFzIGEgbGlzdCBvZiByZWdpc3RlcmVkIG1hdGNoIHJ1bGVzLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgIFRoZSBidXMgZGFlbW9uIGV4YW1pbmVzIHRoZSBzaWduYWwgYW5kIGRldGVybWluZXMgd2hpY2ggcHJvY2Vzc2VzIGFyZSBpbnRlcmVzdGVkIGluIGl0LgorICAgICAgICAgICAgICBJdCBzZW5kcyB0aGUgc2lnbmFsIG1lc3NhZ2UgdG8gdGhlc2UgcHJvY2Vzc2VzLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgIEVhY2ggcHJvY2VzcyByZWNlaXZpbmcgdGhlIHNpZ25hbCBkZWNpZGVzIHdoYXQgdG8gZG8gd2l0aCBpdDsgaWYgdXNpbmcgYSBiaW5kaW5nLCAKKyAgICAgICAgICAgICAgdGhlIGJpbmRpbmcgbWF5IGNob29zZSB0byBlbWl0IGEgbmF0aXZlIHNpZ25hbCBvbiBhIHByb3h5IG9iamVjdC4gSWYgdXNpbmcgdGhlIAorICAgICAgICAgICAgICBsb3ctbGV2ZWwgQVBJLCB0aGUgcHJvY2VzcyBtYXkganVzdCBsb29rIGF0IHRoZSBzaWduYWwgc2VuZGVyIGFuZCBuYW1lIGFuZCBkZWNpZGUKKyAgICAgICAgICAgICAgd2hhdCB0byBkbyBiYXNlZCBvbiB0aGF0LgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgPC9wYXJhPgorCisgICAgPC9zZWN0Mj4KKworICAgIDxzZWN0MiBpZD0iaW50cm9zcGVjdGlvbiI+CisgICAgICA8dGl0bGU+SW50cm9zcGVjdGlvbjwvdGl0bGU+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBELUJ1cyBvYmplY3RzIG1heSBzdXBwb3J0IHRoZSBpbnRlcmZhY2UgPGxpdGVyYWw+b3JnLmZyZWVkZXNrdG9wLkRCdXMuSW50cm9zcGVjdGFibGU8L2xpdGVyYWw+LgorICAgICAgICBUaGlzIGludGVyZmFjZSBoYXMgb25lIG1ldGhvZCA8bGl0ZXJhbD5JbnRyb3NwZWN0PC9saXRlcmFsPiB3aGljaCB0YWtlcyBubyBhcmd1bWVudHMgYW5kIHJldHVybnMKKyAgICAgICAgYW4gWE1MIHN0cmluZy4gVGhlIFhNTCBzdHJpbmcgZGVzY3JpYmVzIHRoZSBpbnRlcmZhY2VzLCBtZXRob2RzLCBhbmQgc2lnbmFscyBvZiB0aGUgb2JqZWN0LgorICAgICAgICBTZWUgdGhlIEQtQnVzIHNwZWNpZmljYXRpb24gZm9yIG1vcmUgZGV0YWlscyBvbiB0aGlzIGludHJvc3BlY3Rpb24gZm9ybWF0LgorICAgICAgPC9wYXJhPgorCisgICAgPC9zZWN0Mj4KKworICA8L3NlY3QxPgorCisgIDxzZWN0MSBpZD0iZ2xpYi1jbGllbnQiPgorICAgIDx0aXRsZT5HTGliIEFQSXM8L3RpdGxlPgorICAgIDxwYXJhPgorICAgICAgVGhlIHJlY29tbWVuZGVkIEdMaWIgQVBJIGZvciBELUJ1cyBpcyBHREJ1cywgd2hpY2ggaGFzIGJlZW4KKyAgICAgIGRpc3RyaWJ1dGVkIHdpdGggR0xpYiBzaW5jZSB2ZXJzaW9uIDIuMjYuIEl0IGlzIG5vdCBkb2N1bWVudGVkIGhlcmUuCisgICAgICBTZWUgPHVsaW5rIHVybD0iaHR0cHM6Ly9kZXZlbG9wZXIuZ25vbWUub3JnL2dpby9zdGFibGUvZ2RidXMtY29udmVuaWVuY2UuaHRtbCI+dGhlCisgICAgICAgIEdMaWIgZG9jdW1lbnRhdGlvbjwvdWxpbms+IGZvciBkZXRhaWxzIG9mIGhvdyB0byB1c2UgR0RCdXMuCisgICAgPC9wYXJhPgorCisgICAgPHBhcmE+CisgICAgICBBbiBvbGRlciBBUEksIGRidXMtZ2xpYiwgYWxzbyBleGlzdHMuIEl0IGlzIGRlcHJlY2F0ZWQgYW5kIHNob3VsZAorICAgICAgbm90IGJlIHVzZWQgaW4gbmV3IGNvZGUuIFdoZW5ldmVyIHBvc3NpYmxlLCBwb3J0aW5nIGV4aXN0aW5nIGNvZGUKKyAgICAgIGZyb20gZGJ1cy1nbGliIHRvIEdEQnVzIGlzIGFsc28gcmVjb21tZW5kZWQuCisgICAgPC9wYXJhPgorICA8L3NlY3QxPgorCisgIDxzZWN0MSBpZD0icHl0aG9uLWNsaWVudCI+CisgICAgPHRpdGxlPlB5dGhvbiBBUEk8L3RpdGxlPgorICAgIDxwYXJhPgorICAgICAgVGhlIFB5dGhvbiBBUEksIGRidXMtcHl0aG9uLCBpcyBub3cgZG9jdW1lbnRlZCBzZXBhcmF0ZWx5IGluCisgICAgICA8dWxpbmsgdXJsPSJodHRwOi8vZGJ1cy5mcmVlZGVza3RvcC5vcmcvZG9jL2RidXMtcHl0aG9uL2RvYy90dXRvcmlhbC5odG1sIj50aGUgZGJ1cy1weXRob24gdHV0b3JpYWw8L3VsaW5rPiAoYWxzbyBhdmFpbGFibGUgaW4gZG9jL3R1dG9yaWFsLnR4dCwKKyAgICAgIGFuZCBkb2MvdHV0b3JpYWwuaHRtbCBpZiBidWlsdCB3aXRoIHB5dGhvbi1kb2N1dGlscywgaW4gdGhlIGRidXMtcHl0aG9uCisgICAgICBzb3VyY2UgZGlzdHJpYnV0aW9uKS4KKyAgICA8L3BhcmE+CisgIDwvc2VjdDE+CisKKyAgPHNlY3QxIGlkPSJxdC1jbGllbnQiPgorICAgIDx0aXRsZT5RdCBBUEk8L3RpdGxlPgorICAgIDxwYXJhPgorICAgICAgVGhlIFF0IGJpbmRpbmcgZm9yIGxpYmRidXMsIFF0REJ1cywgaGFzIGJlZW4gZGlzdHJpYnV0ZWQgd2l0aCBRdAorICAgICAgc2luY2UgdmVyc2lvbiA0LjIuIEl0IGlzIG5vdCBkb2N1bWVudGVkIGhlcmUuIFNlZQorICAgICAgPHVsaW5rIHVybD0iaHR0cDovL3F0LXByb2plY3Qub3JnL2RvYy9xdC01L3F0ZGJ1cy1pbmRleC5odG1sIj50aGUgUXQKKyAgICAgICAgZG9jdW1lbnRhdGlvbjwvdWxpbms+IGZvciBkZXRhaWxzIG9mIGhvdyB0byB1c2UgUXREQnVzLgorICAgIDwvcGFyYT4KKyAgPC9zZWN0MT4KKzwvYXJ0aWNsZT4KZGlmZiAtLWdpdCBhL2RvYy9kYnVzLXVwZGF0ZS1hY3RpdmF0aW9uLWVudmlyb25tZW50LjEueG1sLmluIGIvZG9jL2RidXMtdXBkYXRlLWFjdGl2YXRpb24tZW52aXJvbm1lbnQuMS54bWwuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE0OTVkZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9kYnVzLXVwZGF0ZS1hY3RpdmF0aW9uLWVudmlyb25tZW50LjEueG1sLmluCkBAIC0wLDAgKzEsMjEzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+Cis8IURPQ1RZUEUgcmVmZW50cnkgUFVCTElDICItLy9PQVNJUy8vRFREIERvY0Jvb2sgWE1MIFY0LjQvL0VOIiAiaHR0cDovL3d3dy5vYXNpcy1vcGVuLm9yZy9kb2Nib29rL3htbC80LjQvZG9jYm9va3guZHRkIj4KKzxyZWZlbnRyeSBpZD0iZGJ1cy11cGRhdGUtYWN0aXZhdGlvbi1lbnZpcm9ubWVudC4xIj4KKyAgPHJlZmVudHJ5aW5mbz4KKyAgICA8Y29weXJpZ2h0PgorICAgICAgPHllYXI+MjAxNTwveWVhcj4KKyAgICAgIDxob2xkZXI+Q29sbGFib3JhIEx0ZC48L2hvbGRlcj4KKyAgICA8L2NvcHlyaWdodD4KKyAgICA8bGVnYWxub3RpY2U+CisgICAgICA8cGFyYT5UaGlzIG1hbiBwYWdlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBzYW1lIHRlcm1zIGFzCisgICAgICAgIGRidXMtdXBkYXRlLWFjdGl2YXRpb24tZW52aXJvbm1lbnQgKE1JVC9YMTEpLiBUaGVyZSBpcyBOTyBXQVJSQU5UWSwKKyAgICAgICAgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3LjwvcGFyYT4KKyAgICA8L2xlZ2Fsbm90aWNlPgorICA8L3JlZmVudHJ5aW5mbz4KKworICA8cmVmbWV0YT4KKyAgICA8cmVmZW50cnl0aXRsZT5kYnVzLXVwZGF0ZS1hY3RpdmF0aW9uLWVudmlyb25tZW50PC9yZWZlbnRyeXRpdGxlPgorICAgIDxtYW52b2xudW0+MTwvbWFudm9sbnVtPgorICAgIDxyZWZtaXNjaW5mbyBjbGFzcz0ibWFudWFsIj5Vc2VyIENvbW1hbmRzPC9yZWZtaXNjaW5mbz4KKyAgICA8cmVmbWlzY2luZm8gY2xhc3M9InNvdXJjZSI+RC1CdXM8L3JlZm1pc2NpbmZvPgorICAgIDxyZWZtaXNjaW5mbyBjbGFzcz0idmVyc2lvbiI+QERCVVNfVkVSU0lPTkA8L3JlZm1pc2NpbmZvPgorICA8L3JlZm1ldGE+CisgIDxyZWZuYW1lZGl2PgorICAgIDxyZWZuYW1lPmRidXMtdXBkYXRlLWFjdGl2YXRpb24tZW52aXJvbm1lbnQ8L3JlZm5hbWU+CisgICAgPHJlZnB1cnBvc2U+dXBkYXRlIGVudmlyb25tZW50IHVzZWQgZm9yIEQtQnVzIHNlc3Npb24gc2VydmljZXM8L3JlZnB1cnBvc2U+CisgIDwvcmVmbmFtZWRpdj4KKworICA8cmVmc3lub3BzaXNkaXYgaWQ9InN5bm9wc2lzIj4KKyAgICA8Y21kc3lub3BzaXM+CisgICAgICA8Y29tbWFuZD5kYnVzLXVwZGF0ZS1hY3RpdmF0aW9uLWVudmlyb25tZW50PC9jb21tYW5kPgorICAgICAgPGFyZyBjaG9pY2U9Im9wdCI+LS1zeXN0ZW1kPC9hcmc+CisgICAgICA8YXJnIGNob2ljZT0ib3B0Ij4tLXZlcmJvc2U8L2FyZz4KKyAgICAgIDxncm91cCBjaG9pY2U9InBsYWluIj4KKyAgICAgICAgPGFyZyBjaG9pY2U9InBsYWluIj4tLWFsbDwvYXJnPgorICAgICAgICA8YXJnIGNob2ljZT0icGxhaW4iIHJlcD0icmVwZWF0Ij48cmVwbGFjZWFibGU+VkFSPC9yZXBsYWNlYWJsZT48L2FyZz4KKyAgICAgICAgPGFyZyBjaG9pY2U9InBsYWluIiByZXA9InJlcGVhdCI+PHJlcGxhY2VhYmxlPlZBUjwvcmVwbGFjZWFibGU+PTxyZXBsYWNlYWJsZT5WQUw8L3JlcGxhY2VhYmxlPjwvYXJnPgorICAgICAgPC9ncm91cD4KKyAgICA8L2NtZHN5bm9wc2lzPgorICA8L3JlZnN5bm9wc2lzZGl2PgorCisgIDxyZWZzZWN0MSBpZD0iZGVzY3JpcHRpb24iPgorICAgIDx0aXRsZT5ERVNDUklQVElPTjwvdGl0bGU+CisgICAgPHBhcmE+PGNvbW1hbmQ+ZGJ1cy11cGRhdGUtYWN0aXZhdGlvbi1lbnZpcm9ubWVudDwvY29tbWFuZD4KKyAgICAgIHVwZGF0ZXMgdGhlIGxpc3Qgb2YgZW52aXJvbm1lbnQgdmFyaWFibGVzIHVzZWQgYnkKKyAgICAgIDxjb21tYW5kPmRidXMtZGFlbW9uIC0tc2Vzc2lvbjwvY29tbWFuZD4KKyAgICAgIHdoZW4gaXQgYWN0aXZhdGVzIHNlc3Npb24gc2VydmljZXMgd2l0aG91dCB1c2luZworICAgICAgPGNvbW1hbmQ+c3lzdGVtZDwvY29tbWFuZD4uPC9wYXJhPgorCisgICAgPHBhcmE+V2l0aCB0aGUgPG9wdGlvbj4tLXN5c3RlbWQ8L29wdGlvbj4gb3B0aW9uLAorICAgICAgaWYgYW4gaW5zdGFuY2Ugb2YgPGNvbW1hbmQ+c3lzdGVtZCAtLXVzZXI8L2NvbW1hbmQ+IGlzCisgICAgICBhdmFpbGFibGUgb24gRC1CdXMsIGl0IGFsc28gdXBkYXRlcyB0aGUgbGlzdCBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZXMKKyAgICAgIHVzZWQgYnkgPGNvbW1hbmQ+c3lzdGVtZCAtLXVzZXI8L2NvbW1hbmQ+CisgICAgICB3aGVuIGl0IGFjdGl2YXRlcyB1c2VyIHNlcnZpY2VzLCBpbmNsdWRpbmcgRC1CdXMgc2Vzc2lvbiBzZXJ2aWNlcworICAgICAgZm9yIHdoaWNoIDxjb21tYW5kPmRidXMtZGFlbW9uPC9jb21tYW5kPiBoYXMgYmVlbiBjb25maWd1cmVkIHRvCisgICAgICBkZWxlZ2F0ZSBhY3RpdmF0aW9uIHRvIDxjb21tYW5kPnN5c3RlbWQ8L2NvbW1hbmQ+LgorICAgICAgVGhpcyBpcyB2ZXJ5IHNpbWlsYXIgdG8gdGhlIDxvcHRpb24+aW1wb3J0LWVudmlyb25tZW50PC9vcHRpb24+CisgICAgICBjb21tYW5kIHByb3ZpZGVkIGJ5CisgICAgICA8Y2l0ZXJlZmVudHJ5PjxyZWZlbnRyeXRpdGxlPnN5c3RlbWN0bDwvcmVmZW50cnl0aXRsZT48bWFudm9sbnVtPjE8L21hbnZvbG51bT48L2NpdGVyZWZlbnRyeT4pLjwvcGFyYT4KKworICAgIDxwYXJhPlZhcmlhYmxlcyB0aGF0IGFyZSBzcGVjaWFsIHRvIDxjb21tYW5kPmRidXMtZGFlbW9uPC9jb21tYW5kPgorICAgICAgb3IgPGNvbW1hbmQ+c3lzdGVtZDwvY29tbWFuZD4gbWF5IGJlIHNldCwgYnV0IHRoZWlyIHZhbHVlcyB3aWxsCisgICAgICBiZSBvdmVycmlkZGVuIHdoZW4gYSBzZXJ2aWNlIGlzIHN0YXJ0ZWQuIEZvciBpbnN0YW5jZSwgaXQgaXMKKyAgICAgIG5vdCB1c2VmdWwgdG8gYWRkIDxlbnZhcj5EQlVTX1NFU1NJT05fQlVTX0FERFJFU1M8L2VudmFyPiB0bworICAgICAgPGNvbW1hbmQ+ZGJ1cy1kYWVtb248L2NvbW1hbmQ+J3MgYWN0aXZhdGlvbiBlbnZpcm9ubWVudCwKKyAgICAgIGFsdGhvdWdoIGl0IG1pZ2h0IHN0aWxsIGJlIHVzZWZ1bCB0byBhZGQgaXQgdG8KKyAgICAgIDxjb21tYW5kPnN5c3RlbWQ8L2NvbW1hbmQ+J3MgYWN0aXZhdGlvbiBlbnZpcm9ubWVudC48L3BhcmE+CisgIDwvcmVmc2VjdDE+CisKKyAgPHJlZnNlY3QxIGlkPSJvcHRpb25zIj4KKyAgICA8dGl0bGU+T1BUSU9OUzwvdGl0bGU+CisgICAgPHZhcmlhYmxlbGlzdCByZW1hcD0iVFAiPgorCisgICAgICA8dmFybGlzdGVudHJ5PgorICAgICAgICA8dGVybT48b3B0aW9uPi0tYWxsPC9vcHRpb24+PC90ZXJtPgorICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgPHBhcmE+U2V0IGFsbCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgcHJlc2VudCBpbgorICAgICAgICAgICAgdGhlIGVudmlyb25tZW50IHVzZWQgYnkKKyAgICAgICAgICAgIDxjb21tYW5kPmRidXMtdXBkYXRlLWFjdGl2YXRpb24tZW52aXJvbm1lbnQ8L2NvbW1hbmQ+LgorICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgIDwvdmFybGlzdGVudHJ5PgorCisgICAgICA8dmFybGlzdGVudHJ5PgorICAgICAgICA8dGVybT48b3B0aW9uPi0tc3lzdGVtZDwvb3B0aW9uPjwvdGVybT4KKyAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgIDxwYXJhPlNldCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIHN5c3RlbWQgdXNlciBzZXJ2aWNlcyBhcyB3ZWxsIGFzCisgICAgICAgICAgICBmb3IgdHJhZGl0aW9uYWwgRC1CdXMgc2Vzc2lvbiBzZXJ2aWNlcy48L3BhcmE+CisgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICA8L3Zhcmxpc3RlbnRyeT4KKworICAgICAgPHZhcmxpc3RlbnRyeT4KKyAgICAgICAgPHRlcm0+PG9wdGlvbj4tLXZlcmJvc2U8L29wdGlvbj48L3Rlcm0+CisgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICA8cGFyYT5PdXRwdXQgbWVzc2FnZXMgdG8gc3RhbmRhcmQgZXJyb3IgZXhwbGFpbmluZyB3aGF0CisgICAgICAgICAgICBkYnVzLXVwZGF0ZS1hY3RpdmF0aW9uLWVudmlyb25tZW50IGlzIGRvaW5nLjwvcGFyYT4KKyAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgIDwvdmFybGlzdGVudHJ5PgorCisgICAgICA8dmFybGlzdGVudHJ5PgorICAgICAgICA8dGVybT48cmVwbGFjZWFibGU+VkFSPC9yZXBsYWNlYWJsZT48L3Rlcm0+CisgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICA8cGFyYT5JZiA8cmVwbGFjZWFibGU+VkFSPC9yZXBsYWNlYWJsZT4gaXMgcHJlc2VudCBpbiB0aGUKKyAgICAgICAgICAgIGVudmlyb25tZW50IG9mIDxjb21tYW5kPmRidXMtdXBkYXRlLWFjdGl2YXRpb24tZW52aXJvbm1lbnQ8L2NvbW1hbmQ+LAorICAgICAgICAgICAgc2V0IGl0IHRvIHRoZSBzYW1lIHZhbHVlIGZvciBELUJ1cyBzZXJ2aWNlcy4gSXRzIHZhbHVlIG11c3QgYmUKKyAgICAgICAgICAgIFVURi04IChpZiBub3QsIGl0IGlzIHNraXBwZWQgd2l0aCBhIHdhcm5pbmcpLiBJZgorICAgICAgICAgICAgPHJlcGxhY2VhYmxlPlZBUjwvcmVwbGFjZWFibGU+IGlzIG5vdCBwcmVzZW50CisgICAgICAgICAgICBpbiB0aGUgZW52aXJvbm1lbnQsIHRoaXMgYXJndW1lbnQgaXMgc2lsZW50bHkgaWdub3JlZC4KKyAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICA8L3Zhcmxpc3RlbnRyeT4KKworICAgICAgPHZhcmxpc3RlbnRyeT4KKyAgICAgICAgPHRlcm0+PHJlcGxhY2VhYmxlPlZBUjwvcmVwbGFjZWFibGU+PTxyZXBsYWNlYWJsZT5WQUw8L3JlcGxhY2VhYmxlPjwvdGVybT4KKyAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgIDxwYXJhPlNldCA8cmVwbGFjZWFibGU+VkFSPC9yZXBsYWNlYWJsZT4gdG8gPHJlcGxhY2VhYmxlPlZBTDwvcmVwbGFjZWFibGU+LAorICAgICAgICAgICAgd2hpY2ggbXVzdCBiZSBVVEYtOC48L3BhcmE+CisgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICA8L3Zhcmxpc3RlbnRyeT4KKworICAgIDwvdmFyaWFibGVsaXN0PgorICA8L3JlZnNlY3QxPgorCisgIDxyZWZzZWN0MSBpZD0iZXhhbXBsZXMiPgorICAgIDx0aXRsZT5FWEFNUExFUzwvdGl0bGU+CisgICAgPHBhcmE+CisgICAgICA8Y29tbWFuZD5kYnVzLXVwZGF0ZS1hY3RpdmF0aW9uLWVudmlyb25tZW50PC9jb21tYW5kPiBpcworICAgICAgcHJpbWFyaWx5IGRlc2lnbmVkIHRvIGJlIHVzZWQgaW4gTGludXggZGlzdHJpYnV0aW9ucycgWDExIHNlc3Npb24KKyAgICAgIHN0YXJ0dXAgc2NyaXB0cywgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgInVzZXIgYnVzIiBkZXNpZ24uCisgICAgPC9wYXJhPgorCisgICAgPHBhcmE+VG8gcHJvcGFnYXRlIDxlbnZhcj5ESVNQTEFZPC9lbnZhcj4gYW5kIDxlbnZhcj5YQVVUSE9SSVRZPC9lbnZhcj4KKyAgICAgIHRvIDxjb21tYW5kPmRidXMtZGFlbW9uPC9jb21tYW5kPgorICAgICAgYW5kLCBpZiBwcmVzZW50LCA8Y29tbWFuZD5zeXN0ZW1kPC9jb21tYW5kPiwKKyAgICAgIGFuZCBwcm9wYWdhdGUgPGVudmFyPkRCVVNfU0VTU0lPTl9CVVNfQUREUkVTUzwvZW52YXI+IHRvCisgICAgICA8Y29tbWFuZD5zeXN0ZW1kPC9jb21tYW5kPjoKKyAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0ic2giPgorICAgICAgICBkYnVzLXVwZGF0ZS1hY3RpdmF0aW9uLWVudmlyb25tZW50IC0tc3lzdGVtZCBcCisgICAgICAgICAgICBEQlVTX1NFU1NJT05fQlVTX0FERFJFU1MgRElTUExBWSBYQVVUSE9SSVRZCisgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgIDwvcGFyYT4KKworICAgIDxwYXJhPlRvIHByb3BhZ2F0ZSBhbGwgZW52aXJvbm1lbnQgdmFyaWFibGVzIGV4Y2VwdAorICAgICAgPGVudmFyPlhER19TRUFUPC9lbnZhcj4sIDxlbnZhcj5YREdfU0VTU0lPTl9JRDwvZW52YXI+CisgICAgICBhbmQgPGVudmFyPlhER19WVE5SPC9lbnZhcj4gdG8gPGNvbW1hbmQ+ZGJ1cy1kYWVtb248L2NvbW1hbmQ+CisgICAgICAoYW5kLCBpZiBwcmVzZW50LCA8Y29tbWFuZD5zeXN0ZW1kPC9jb21tYW5kPikgZm9yIGNvbXBhdGliaWxpdHkKKyAgICAgIHdpdGggbGVnYWN5IFgxMSBzZXNzaW9uIHN0YXJ0dXAgc2NyaXB0czoKKyAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0ic2giPgorICAgICAgICAjIGluIGEgc3Vic2hlbGwgc28gdGhlIHZhcmlhYmxlcyByZW1haW4gc2V0IGluIHRoZQorICAgICAgICAjIHBhcmVudCBzY3JpcHQKKyAgICAgICAgKAorICAgICAgICAgIHVuc2V0IFhER19TRUFUCisgICAgICAgICAgdW5zZXQgWERHX1NFU1NJT05fSUQKKyAgICAgICAgICB1bnNldCBYREdfVlROUgorCisgICAgICAgICAgZGJ1cy11cGRhdGUtYWN0aXZhdGlvbi1lbnZpcm9ubWVudCAtLXN5c3RlbWQgLS1hbGwKKyAgICAgICAgKQorICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICA8L3BhcmE+CisgIDwvcmVmc2VjdDE+CisKKyAgPHJlZnNlY3QxIGlkPSJleGl0X3N0YXR1cyI+CisgICAgPHRpdGxlPkVYSVQgU1RBVFVTPC90aXRsZT4KKyAgICA8cGFyYT4KKyAgICAgIDxjb21tYW5kPmRidXMtdXBkYXRlLWFjdGl2YXRpb24tZW52aXJvbm1lbnQ8L2NvbW1hbmQ+CisgICAgICBleGl0cyB3aXRoIHN0YXR1cyAwIG9uIHN1Y2Nlc3MsIEVYX1VTQUdFICg2NCkgb24gaW52YWxpZAorICAgICAgY29tbWFuZC1saW5lIG9wdGlvbnMsIEVYX09TRVJSICg3MSkgaWYgdW5hYmxlIHRvIGNvbm5lY3QKKyAgICAgIHRvIHRoZSBzZXNzaW9uIGJ1cywgb3IgRVhfVU5BVkFJTEFCTEUgKDY5KSBpZiB1bmFibGUgdG8KKyAgICAgIHNldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzLiBPdGhlciBub256ZXJvIGV4aXQgY29kZXMgbWlnaHQgYmUKKyAgICAgIGFkZGVkIGluIGZ1dHVyZSB2ZXJzaW9ucy48L3BhcmE+CisgIDwvcmVmc2VjdDE+CisKKyAgPHJlZnNlY3QxIGlkPSJlbnZpcm9ubWVudCI+CisgICAgPHRpdGxlPkVOVklST05NRU5UPC90aXRsZT4KKyAgICAgIDxwYXJhPjxlbnZhcj5EQlVTX1NFU1NJT05fQlVTX0FERFJFU1M8L2VudmFyPiwKKyAgICAgICAgPGVudmFyPlhER19SVU5USU1FX0RJUjwvZW52YXI+IGFuZC9vciA8ZW52YXI+RElTUExBWTwvZW52YXI+CisgICAgICAgIGFyZSB1c2VkIHRvIGZpbmQgdGhlIGFkZHJlc3Mgb2YgdGhlIHNlc3Npb24gYnVzLjwvcGFyYT4KKyAgPC9yZWZzZWN0MT4KKworICA8cmVmc2VjdDEgaWQ9ImxpbWl0YXRpb25zIj4KKyAgICA8dGl0bGU+TElNSVRBVElPTlM8L3RpdGxlPgorICAgIDxwYXJhPgorICAgICAgPGNvbW1hbmQ+ZGJ1cy1kYWVtb248L2NvbW1hbmQ+IGRvZXMgbm90IHByb3ZpZGUgYSB3YXkgdG8gdW5zZXQKKyAgICAgIGVudmlyb25tZW50IHZhcmlhYmxlcyBhZnRlciB0aGV5IGhhdmUgYmVlbiBzZXQgKGFsdGhvdWdoCisgICAgICA8Y29tbWFuZD5zeXN0ZW1kPC9jb21tYW5kPiBkb2VzKSwgc28KKyAgICAgIDxjb21tYW5kPmRidXMtdXBkYXRlLWFjdGl2YXRpb24tZW52aXJvbm1lbnQ8L2NvbW1hbmQ+IGRvZXMgbm90CisgICAgICBvZmZlciB0aGlzIGZ1bmN0aW9uYWxpdHkgZWl0aGVyLgorICAgIDwvcGFyYT4KKworICAgIDxwYXJhPgorICAgICAgUE9TSVggZG9lcyBub3Qgc3BlY2lmeSB0aGUgZW5jb2Rpbmcgb2Ygbm9uLUFTQ0lJIGVudmlyb25tZW50IHZhcmlhYmxlCisgICAgICBuYW1lcyBvciB2YWx1ZXMgYW5kIGFsbG93cyB0aGVtIHRvIGNvbnRhaW4gYW55IG5vbi16ZXJvIGJ5dGUsIGJ1dAorICAgICAgbmVpdGhlciA8Y29tbWFuZD5kYnVzLWRhZW1vbjwvY29tbWFuZD4gbm9yIDxjb21tYW5kPnN5c3RlbWQ8L2NvbW1hbmQ+CisgICAgICBzdXBwb3J0cyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgd2l0aCBub24tVVRGLTggbmFtZXMgb3IgdmFsdWVzLgorICAgICAgQWNjb3JkaW5nbHksIDxjb21tYW5kPmRidXMtdXBkYXRlLWFjdGl2YXRpb24tZW52aXJvbm1lbnQ8L2NvbW1hbmQ+CisgICAgICBhc3N1bWVzIHRoYXQgYW55IG5hbWUgb3IgdmFsdWUgdGhhdCBhcHBlYXJzIHRvIGJlIHZhbGlkIFVURi04IGlzCisgICAgICBpbnRlbmRlZCB0byBiZSBVVEYtOCwgYW5kIGlnbm9yZXMgb3RoZXIgbmFtZXMgb3IgdmFsdWVzIHdpdGggYSB3YXJuaW5nLgorICAgIDwvcGFyYT4KKyAgPC9yZWZzZWN0MT4KKworICA8cmVmc2VjdDEgaWQ9ImJ1Z3MiPgorICAgIDx0aXRsZT5CVUdTPC90aXRsZT4KKyAgICAgIDxwYXJhPlBsZWFzZSBzZW5kIGJ1ZyByZXBvcnRzIHRvIHRoZSBELUJ1cyBidWcgdHJhY2tlciBvciBtYWlsaW5nIGxpc3QuCisgICAgICAgIFNlZSA8dWxpbmsgdXJsPSJodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zb2Z0d2FyZS9kYnVzLyI+aHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc29mdHdhcmUvZGJ1cy88L3VsaW5rPi48L3BhcmE+CisgIDwvcmVmc2VjdDE+CisKKyAgPHJlZnNlY3QxIGlkPSJzZWVfYWxzbyI+CisgICAgPHRpdGxlPlNFRSBBTFNPPC90aXRsZT4KKyAgICA8cGFyYT48Y2l0ZXJlZmVudHJ5PjxyZWZlbnRyeXRpdGxlPmRidXMtZGFlbW9uPC9yZWZlbnRyeXRpdGxlPjxtYW52b2xudW0+MTwvbWFudm9sbnVtPjwvY2l0ZXJlZmVudHJ5PiwKKyAgICAgIDxjaXRlcmVmZW50cnk+PHJlZmVudHJ5dGl0bGU+c3lzdGVtZDwvcmVmZW50cnl0aXRsZT48bWFudm9sbnVtPjE8L21hbnZvbG51bT48L2NpdGVyZWZlbnRyeT4sCisgICAgICB0aGUgPG9wdGlvbj5pbXBvcnQtZW52aXJvbm1lbnQ8L29wdGlvbj4gY29tbWFuZCBvZgorICAgICAgPGNpdGVyZWZlbnRyeT48cmVmZW50cnl0aXRsZT5zeXN0ZW1jdGw8L3JlZmVudHJ5dGl0bGU+PG1hbnZvbG51bT4xPC9tYW52b2xudW0+PC9jaXRlcmVmZW50cnk+PC9wYXJhPgorICA8L3JlZnNlY3QxPgorPC9yZWZlbnRyeT4KZGlmZiAtLWdpdCBhL2RvYy9kYnVzLXV1aWRnZW4uMS54bWwuaW4gYi9kb2MvZGJ1cy11dWlkZ2VuLjEueG1sLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiZDI2ODEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZGJ1cy11dWlkZ2VuLjEueG1sLmluCkBAIC0wLDAgKzEsMTI2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+Cis8IURPQ1RZUEUgcmVmZW50cnkgUFVCTElDICItLy9PQVNJUy8vRFREIERvY0Jvb2sgWE1MIFY0LjQvL0VOIgorICAgICAgICAgICAgICAgICAgICJodHRwOi8vd3d3Lm9hc2lzLW9wZW4ub3JnL2RvY2Jvb2sveG1sLzQuNC9kb2Nib29reC5kdGQiPgorPHJlZmVudHJ5IGlkPSdkYnVzdXVpZGdlbjEnPgorCis8IS0tICBkYnVzJmJzb2w7LXV1aWRnZW4gbWFudWFsIHBhZ2UuCisgQ29weXJpZ2h0IChDKSAyMDA2IFJlZCBIYXQsIEluYy4gLS0+CisKKzxyZWZtZXRhPgorPHJlZmVudHJ5dGl0bGU+ZGJ1cy11dWlkZ2VuPC9yZWZlbnRyeXRpdGxlPgorPG1hbnZvbG51bT4xPC9tYW52b2xudW0+Cis8cmVmbWlzY2luZm8gY2xhc3M9Im1hbnVhbCI+VXNlciBDb21tYW5kczwvcmVmbWlzY2luZm8+Cis8cmVmbWlzY2luZm8gY2xhc3M9InNvdXJjZSI+RC1CdXM8L3JlZm1pc2NpbmZvPgorPHJlZm1pc2NpbmZvIGNsYXNzPSJ2ZXJzaW9uIj5AREJVU19WRVJTSU9OQDwvcmVmbWlzY2luZm8+Cis8L3JlZm1ldGE+Cis8cmVmbmFtZWRpdj4KKzxyZWZuYW1lPmRidXMtdXVpZGdlbjwvcmVmbmFtZT4KKzxyZWZwdXJwb3NlPlV0aWxpdHkgdG8gZ2VuZXJhdGUgVVVJRHM8L3JlZnB1cnBvc2U+Cis8L3JlZm5hbWVkaXY+Cis8IS0tIGJvZHkgYmVnaW5zIGhlcmUgLS0+Cis8cmVmc3lub3BzaXNkaXYgaWQ9J3N5bm9wc2lzJz4KKzxjbWRzeW5vcHNpcz4KKyAgPGNvbW1hbmQ+ZGJ1cy11dWlkZ2VuPC9jb21tYW5kPiAgICA8YXJnIGNob2ljZT0nb3B0Jz4tLXZlcnNpb24gPC9hcmc+CisgICAgPGFyZyBjaG9pY2U9J29wdCc+PGFyZyBjaG9pY2U9J3BsYWluJz4tLWVuc3VyZSA8L2FyZz48YXJnIGNob2ljZT0nb3B0Jz48cmVwbGFjZWFibGU+PUZJTEVOQU1FPC9yZXBsYWNlYWJsZT48L2FyZz48L2FyZz4KKyAgICA8YXJnIGNob2ljZT0nb3B0Jz48YXJnIGNob2ljZT0ncGxhaW4nPi0tZ2V0IDwvYXJnPjxhcmcgY2hvaWNlPSdvcHQnPjxyZXBsYWNlYWJsZT49RklMRU5BTUU8L3JlcGxhY2VhYmxlPjwvYXJnPjwvYXJnPgorICAgIDxzYnIvPgorPC9jbWRzeW5vcHNpcz4KKzwvcmVmc3lub3BzaXNkaXY+CisKKworPHJlZnNlY3QxIGlkPSdkZXNjcmlwdGlvbic+PHRpdGxlPkRFU0NSSVBUSU9OPC90aXRsZT4KKzxwYXJhPlRoZSA8Y29tbWFuZD5kYnVzLXV1aWRnZW48L2NvbW1hbmQ+IGNvbW1hbmQgZ2VuZXJhdGVzIG9yIHJlYWRzIGEgdW5pdmVyc2FsbHkgdW5pcXVlIElELjwvcGFyYT4KKworCis8cGFyYT5Ob3RlIHRoYXQgdGhlIEQtQnVzIFVVSUQgaGFzIG5vIHJlbGF0aW9uc2hpcCB0byBSRkMgNDEyMiBhbmQgZG9lcyBub3QgZ2VuZXJhdGUKK1VVSURzIGNvbXBhdGlibGUgd2l0aCB0aGF0IHNwZWMuIE1hbnkgc3lzdGVtcyBoYXZlIGEgc2VwYXJhdGUgY29tbWFuZAorZm9yIHRoYXQgKG9mdGVuIGNhbGxlZCAidXVpZGdlbiIpLjwvcGFyYT4KKworCis8cGFyYT5TZWUgPHVsaW5rIHVybD0naHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc29mdHdhcmUvZGJ1cy8nPmh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3NvZnR3YXJlL2RidXMvPC91bGluaz4gZm9yIG1vcmUgaW5mb3JtYXRpb24KK2Fib3V0IEQtQnVzLjwvcGFyYT4KKworCis8cGFyYT5UaGUgcHJpbWFyeSB1c2FnZSBvZiA8Y29tbWFuZD5kYnVzLXV1aWRnZW48L2NvbW1hbmQ+IGlzIHRvIHJ1biBpbiB0aGUgcG9zdC1pbnN0YWxsCitzY3JpcHQgb2YgYSBELUJ1cyBwYWNrYWdlIGxpa2UgdGhpczo8L3BhcmE+Cis8bGl0ZXJhbGxheW91dCByZW1hcD0nLm5mJz4KKyAgZGJ1cy11dWlkZ2VuIC0tZW5zdXJlCis8L2xpdGVyYWxsYXlvdXQ+IDwhLS0gLmZpIC0tPgorCisKKzxwYXJhPlRoaXMgd2lsbCBlbnN1cmUgdGhhdCAvdmFyL2xpYi9kYnVzL21hY2hpbmUtaWQgZXhpc3RzIGFuZCBoYXMgdGhlIHV1aWQgaW4gaXQuCitJdCB3b24ndCBvdmVyd3JpdGUgYW4gZXhpc3RpbmcgdXVpZCwgc2luY2UgdGhpcyBpZCBzaG91bGQgcmVtYWluIGZpeGVkCitmb3IgYSBzaW5nbGUgbWFjaGluZSB1bnRpbCB0aGUgbmV4dCByZWJvb3QgYXQgbGVhc3QuPC9wYXJhPgorCisKKzxwYXJhPlRoZSBpbXBvcnRhbnQgcHJvcGVydGllcyBvZiB0aGUgbWFjaGluZSBVVUlEIGFyZSB0aGF0IDEpIGl0IHJlbWFpbnMKK3VuY2hhbmdlZCB1bnRpbCB0aGUgbmV4dCByZWJvb3QgYW5kIDIpIGl0IGlzIGRpZmZlcmVudCBmb3IgYW55IHR3bworcnVubmluZyBpbnN0YW5jZXMgb2YgdGhlIE9TIGtlcm5lbC4gVGhhdCBpcywgaWYgdHdvIHByb2Nlc3NlcyBzZWUgdGhlCitzYW1lIFVVSUQsIHRoZXkgc2hvdWxkIGFsc28gc2VlIHRoZSBzYW1lIHNoYXJlZCBtZW1vcnksIFVOSVggZG9tYWluCitzb2NrZXRzLCBsb2NhbCBYIGRpc3BsYXlzLCBsb2NhbGhvc3QubG9jYWxkb21haW4gcmVzb2x1dGlvbiwgcHJvY2VzcworSURzLCBhbmQgc28gZm9ydGguPC9wYXJhPgorCisKKzxwYXJhPklmIHlvdSBydW4gPGNvbW1hbmQ+ZGJ1cy11dWlkZ2VuPC9jb21tYW5kPiB3aXRoIG5vIG9wdGlvbnMgaXQganVzdCBwcmludHMgYSBuZXcgdXVpZCBtYWRlCit1cCBvdXQgb2YgdGhpbiBhaXIuPC9wYXJhPgorCisKKzxwYXJhPklmIHlvdSBydW4gaXQgd2l0aCAtLWdldCwgaXQgcHJpbnRzIHRoZSBtYWNoaW5lIFVVSUQgYnkgZGVmYXVsdCwgb3IKK3RoZSBVVUlEIGluIHRoZSBzcGVjaWZpZWQgZmlsZSBpZiB5b3Ugc3BlY2lmeSBhIGZpbGUuPC9wYXJhPgorCisKKzxwYXJhPklmIHlvdSB0cnkgdG8gY2hhbmdlIGFuIGV4aXN0aW5nIG1hY2hpbmUtaWQgb24gYSBydW5uaW5nIHN5c3RlbSwgaXQgd2lsbAorcHJvYmFibHkgcmVzdWx0IGluIGJhZCB0aGluZ3MgaGFwcGVuaW5nLiBEb24ndCB0cnkgdG8gY2hhbmdlIHRoaXMgZmlsZS4gQWxzbywKK2Rvbid0IG1ha2UgaXQgdGhlIHNhbWUgb24gdHdvIGRpZmZlcmVudCBzeXN0ZW1zOyBpdCBuZWVkcyB0byBiZSBkaWZmZXJlbnQKK2FueXRpbWUgdGhlcmUgYXJlIHR3byBkaWZmZXJlbnQga2VybmVscyBydW5uaW5nLjwvcGFyYT4KKworCis8cGFyYT5UaGUgVVVJRCBzaG91bGQgYmUgZGlmZmVyZW50IG9uIHR3byBkaWZmZXJlbnQgdmlydHVhbCBtYWNoaW5lcywKK2JlY2F1c2UgdGhlcmUgYXJlIHR3byBkaWZmZXJlbnQga2VybmVscy48L3BhcmE+CisKKzwvcmVmc2VjdDE+CisKKzxyZWZzZWN0MSBpZD0nb3B0aW9ucyc+PHRpdGxlPk9QVElPTlM8L3RpdGxlPgorPHBhcmE+VGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSBzdXBwb3J0ZWQ6PC9wYXJhPgorPHZhcmlhYmxlbGlzdCByZW1hcD0nVFAnPgorICA8dmFybGlzdGVudHJ5PgorICA8dGVybT48b3B0aW9uPi0tZ2V0Wz1GSUxFTkFNRV08L29wdGlvbj48L3Rlcm0+CisgIDxsaXN0aXRlbT4KKzxwYXJhPklmIGEgZmlsZW5hbWUgaXMgbm90IGdpdmVuLCBkZWZhdWx0cyB0byBsb2NhbHN0YXRlZGlyL2xpYi9kYnVzL21hY2hpbmUtaWQKKyhsb2NhbHN0YXRlZGlyIGlzIHVzdWFsbHkgL3ZhcikuIElmIHRoaXMgZmlsZSBleGlzdHMgYW5kIGlzIHZhbGlkLCB0aGUKK3V1aWQgaW4gdGhlIGZpbGUgaXMgcHJpbnRlZCBvbiBzdGRvdXQuIE90aGVyd2lzZSwgdGhlIGNvbW1hbmQgZXhpdHMKK3dpdGggYSBub256ZXJvIHN0YXR1cy48L3BhcmE+CisKKyAgPC9saXN0aXRlbT4KKyAgPC92YXJsaXN0ZW50cnk+CisgIDx2YXJsaXN0ZW50cnk+CisgIDx0ZXJtPjxvcHRpb24+LS1lbnN1cmVbPUZJTEVOQU1FXTwvb3B0aW9uPjwvdGVybT4KKyAgPGxpc3RpdGVtPgorPHBhcmE+SWYgYSBmaWxlbmFtZSBpcyBub3QgZ2l2ZW4sIGRlZmF1bHRzIHRvIGxvY2Fsc3RhdGVkaXIvbGliL2RidXMvbWFjaGluZS1pZAorKGxvY2Fsc3RhdGVkaXIgaXMgdXN1YWxseSAvdmFyKS4gSWYgdGhpcyBmaWxlIGV4aXN0cyB0aGVuIGl0IHdpbGwgYmUKK3ZhbGlkYXRlZCwgYW5kIGEgZmFpbHVyZSBjb2RlIHJldHVybmVkIGlmIGl0IGNvbnRhaW5zIHRoZSB3cm9uZyB0aGluZy4KK0lmIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0LCBpdCB3aWxsIGJlIGNyZWF0ZWQgd2l0aCBhIG5ldyB1dWlkIGluIGl0LgorT24gc3VjY2VzcywgcHJpbnRzIG5vIG91dHB1dC48L3BhcmE+CisKKyAgPC9saXN0aXRlbT4KKyAgPC92YXJsaXN0ZW50cnk+CisgIDx2YXJsaXN0ZW50cnk+CisgIDx0ZXJtPjxvcHRpb24+LS12ZXJzaW9uPC9vcHRpb24+PC90ZXJtPgorICA8bGlzdGl0ZW0+Cis8cGFyYT5QcmludCB0aGUgdmVyc2lvbiBvZiBkYnVzLXV1aWRnZW48L3BhcmE+CisKKyAgPC9saXN0aXRlbT4KKyAgPC92YXJsaXN0ZW50cnk+Cis8L3ZhcmlhYmxlbGlzdD4KKzwvcmVmc2VjdDE+CisKKzxyZWZzZWN0MSBpZD0nYXV0aG9yJz48dGl0bGU+QVVUSE9SPC90aXRsZT4KKzxwYXJhPlNlZSA8dWxpbmsgdXJsPSdodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zb2Z0d2FyZS9kYnVzL2RvYy9BVVRIT1JTJz5odHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zb2Z0d2FyZS9kYnVzL2RvYy9BVVRIT1JTPC91bGluaz48L3BhcmE+CisKKzwvcmVmc2VjdDE+CisKKzxyZWZzZWN0MSBpZD0nYnVncyc+PHRpdGxlPkJVR1M8L3RpdGxlPgorPHBhcmE+UGxlYXNlIHNlbmQgYnVnIHJlcG9ydHMgdG8gdGhlIEQtQnVzIG1haWxpbmcgbGlzdCBvciBidWcgdHJhY2tlciwKK3NlZSA8dWxpbmsgdXJsPSdodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zb2Z0d2FyZS9kYnVzLyc+aHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc29mdHdhcmUvZGJ1cy88L3VsaW5rPjwvcGFyYT4KKzwvcmVmc2VjdDE+Cis8L3JlZmVudHJ5PgpkaWZmIC0tZ2l0IGEvZG9jL2Rjb3AtaG93dG8udHh0IGIvZG9jL2Rjb3AtaG93dG8udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmZDNiY2YKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZGNvcC1ob3d0by50eHQKQEAgLTAsMCArMSw1NTkgQEAKKwkJRENPUDogRGVza3RvcCBDT21tdW5pY2F0aW9ucyBQcm90b2NvbAorCisJCSAgICBQcmVzdG9uIEJyb3duIDxwYnJvd25Aa2RlLm9yZz4KKwkJCSAgIE9jdG9iZXIgMTQsIDE5OTkKKworCSBSZXZpc2VkIGFuZCBleHRlbmRlZCBieSBNYXR0aGlhcyBFdHRyaWNoIDxldHRyaWNoQGtkZS5vcmc+CisJCQkgICBNYXIgMjksIDIwMDAKKworICAgICAgICBFeHRlbmRlZCB3aXRoIERDT1AgU2lnbmFscyBieSBXYWxkbyBCYXN0aWFuIDxiYXN0aWFuQGtkZS5vcmc+CisgICAgICAgICAgICAgICAgICAgICAgICAgICBGZWIgMTksIDIwMDEKKworCitNb3RpdmF0aW9uIGFuZCBCYWNrZ3JvdW5kOgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIG1vdGl2YXRpb24gYmVoaW5kIGJ1aWxkaW5nIGEgcHJvdG9jb2wgbGlrZSBEQ09QIGlzIHNpbXBsZS4gIEZvcgordGhlIHBhc3QgeWVhciwgd2UgaGF2ZSBiZWVuIGF0dGVtcHRpbmcgdG8gZW5hYmxlIGludGVycHJvY2VzcworY29tbXVuaWNhdGlvbiBiZXR3ZWVuIEtERSBhcHBsaWNhdGlvbnMuIEtERSBhbHJlYWR5IGhhcyBhbiBleHRyZW1lbHkKK3NpbXBsZSBJUEMgbWVjaGFuaXNtIGNhbGxlZCBLV01jb20sIHdoaWNoIGlzICh3YXMhKSB1c2VkIGZvciBjb21tdW5pY2F0aW5nCitiZXR3ZWVuIHRoZSBwYW5lbCBhbmQgdGhlIHdpbmRvdyBtYW5hZ2VyIGZvciBpbnN0YW5jZS4gIEl0IGlzIGFib3V0IGFzCitzaW1wbGUgYXMgaXQgZ2V0cywgcGFzc2luZyBtZXNzYWdlcyB2aWEgWCBBdG9tcy4gIEZvciB0aGlzIHJlYXNvbiBpdAoraXMgbGltaXRlZCBpbiB0aGUgc2l6ZSBhbmQgY29tcGxleGl0eSBvZiB0aGUgZGF0YSB0aGF0IGNhbiBiZSBwYXNzZWQKKyhYIGF0b21zIG11c3QgYmUgc21hbGwgdG8gcmVtYWluIGVmZmljaWVudCkgYW5kIGl0IGFsc28gbWFrZXMgaXQgc28KK3RoYXQgWCBpcyByZXF1aXJlZC4gIENPUkJBIHdhcyB0aG91Z2h0IHRvIGJlIGEgbW9yZSBlZmZlY3RpdmUgSVBDL1JQQworc29sdXRpb24uICBIb3dldmVyLCBhZnRlciBhIHllYXIgb2YgYXR0ZW1wdGluZyB0byBtYWtlIGhlYXZ5IHVzZSBvZgorQ09SQkEgaW4gS0RFLCB3ZSBoYXZlIHJlYWxpemVkIHRoYXQgaXQgaXMgYSBiaXQgc2xvdyBhbmQgbWVtb3J5CitpbnRlbnNpdmUgZm9yIHNpbXBsZSB1c2UuICBJdCBhbHNvIGhhcyBubyBhdXRoZW50aWNhdGlvbiBhdmFpbGFibGUuCisKK1doYXQgd2UgcmVhbGx5IG5lZWRlZCB3YXMgYW4gZXh0cmVtZWx5IHNpbXBsZSBwcm90b2NvbCB3aXRoIGJhc2ljCithdXRob3JpemF0aW9uLCBhbG9uZyB0aGUgbGluZXMgb2YgTUlULU1BR0lDLUNPT0tJRSwgYXMgdXNlZCBieSBYLiAgSXQKK3dvdWxkIG5vdCBiZSBhYmxlIHRvIGRvIE5FQVJMWSB3aGF0IENPUkJBIHdhcyBhYmxlIHRvIGRvLCBidXQgZm9yIHRoZQorc2ltcGxlIHRhc2tzIHJlcXVpcmVkIGl0IHdvdWxkIGJlIHN1ZmZpY2llbnQuIFNvbWUgZXhhbXBsZXMgb2Ygc3VjaAordGFza3MgbWlnaHQgYmUgYW4gYXBwbGljYXRpb24gc2VuZGluZyBhIG1lc3NhZ2UgdG8gdGhlIHBhbmVsIHNheWluZywKKyJJIGhhdmUgc3RhcnRlZCwgc3RvcCBkaXNwbGF5aW5nIHRoZSAnYXBwbGljYXRpb24gc3RhcnRpbmcnIHdhaXQKK3N0YXRlLCIgb3IgaGF2aW5nIGEgbmV3IGFwcGxpY2F0aW9uIHRoYXQgc3RhcnRzIHF1ZXJ5IHRvIHNlZSBpZiBhbnkKK290aGVyIGFwcGxpY2F0aW9ucyBvZiB0aGUgc2FtZSBuYW1lIGFyZSBydW5uaW5nLiAgSWYgdGhleSBhcmUsIHNpbXBseQorY2FsbCBhIGZ1bmN0aW9uIG9uIHRoZSByZW1vdGUgYXBwbGljYXRpb24gdG8gY3JlYXRlIGEgbmV3IHdpbmRvdywKK3JhdGhlciB0aGFuIHN0YXJ0aW5nIGEgbmV3IHByb2Nlc3MuCisKK0ltcGxlbWVudGF0aW9uOgorLS0tLS0tLS0tLS0tLS0tCisKK0RDT1AgaXMgYSBzaW1wbGUgSVBDL1JQQyBtZWNoYW5pc20gYnVpbHQgdG8gb3BlcmF0ZSBvdmVyIHNvY2tldHMuCitFaXRoZXIgdW5peCBkb21haW4gc29ja2V0cyBvciB0Y3AvaXAgc29ja2V0cyBhcmUgc3VwcG9ydGVkLiBEQ09QIGlzCitidWlsdCBvbiB0b3Agb2YgdGhlIEludGVyIENsaWVudCBFeGNoYW5nZSAoSUNFKSBwcm90b2NvbCwgd2hpY2ggY29tZXMKK3N0YW5kYXJkIGFzIGEgcGFydCBvZiBYMTFSNiBhbmQgbGF0ZXIuIEl0IGFsc28gZGVwZW5kcyBvbiBRdCwgYnV0CitiZXlvbmQgdGhhdCBpdCBkb2VzIG5vdCByZXF1aXJlIGFueSBvdGhlciBsaWJyYXJpZXMuIEJlY2F1c2Ugb2YgdGhpcywKK2l0IGlzIGV4dHJlbWVseSBsaWdodHdlaWdodCwgZW5hYmxpbmcgaXQgdG8gYmUgbGlua2VkIGludG8gYWxsIEtERQorYXBwbGljYXRpb25zIHdpdGggbG93IG92ZXJoZWFkLgorCitNb2RlbDoKKy0tLS0tLQorCitUaGUgbW9kZWwgaXMgc2ltcGxlLiAgRWFjaCBhcHBsaWNhdGlvbiB1c2luZyBEQ09QIGlzIGEgY2xpZW50LiAgVGhleQorY29tbXVuaWNhdGUgdG8gZWFjaCBvdGhlciB0aHJvdWdoIGEgRENPUCBzZXJ2ZXIsIHdoaWNoIGZ1bmN0aW9ucyBsaWtlCithIHRyYWZmaWMgZGlyZWN0b3IsIGRpc3BhdGNoaW5nIG1lc3NhZ2VzL2NhbGxzIHRvIHRoZSBwcm9wZXIKK2Rlc3RpbmF0aW9ucy4gIEFsbCBjbGllbnRzIGFyZSBwZWVycyBvZiBlYWNoIG90aGVyLgorCitUd28gdHlwZXMgb2YgYWN0aW9ucyBhcmUgcG9zc2libGUgd2l0aCBEQ09QOiAic2VuZCBhbmQgZm9yZ2V0IgorbWVzc2FnZXMsIHdoaWNoIGRvIG5vdCBibG9jaywgYW5kICJjYWxscywiIHdoaWNoIGJsb2NrIHdhaXRpbmcgZm9yCitzb21lIGRhdGEgdG8gYmUgcmV0dXJuZWQuCisKK0FueSBkYXRhIHRoYXQgd2lsbCBiZSBzZW50IGlzIHNlcmlhbGl6ZWQgKG1hcnNoYWxsZWQsIGZvciB5b3UgQ09SQkEKK3R5cGVzKSB1c2luZyB0aGUgYnVpbHQtaW4gUURhdGFTdHJlYW0gb3BlcmF0b3JzIGF2YWlsYWJsZSBpbiBhbGwgb2YKK3RoZSBRdCBjbGFzc2VzLiAgVGhpcyBpcyBmYXN0IGFuZCBlYXN5LiAgSW4gZmFjdCBpdCdzIHNvIGxpdHRsZSB3b3JrCit0aGF0IHlvdSBjYW4gZWFzaWx5IHdyaXRlIHRoZSBtYXJzaGFsbGluZyBjb2RlIGJ5IGhhbmQuIEluIGFkZGl0aW9uLAordGhlcmUncyBhIHNpbXBsZSBJREwtbGlrZSBjb21waWxlciBhdmFpbGFibGUgKGRjb3BpZGwgYW5kIGRjb3BpZGwyY3BwKQordGhhdCBnZW5lcmF0ZXMgc3R1YnMgYW5kIHNrZWxldG9ucyBmb3IgeW91LiBVc2luZyB0aGUgZGNvcGlkbCBjb21waWxlcgoraGFzIHRoZSBhZGRpdGlvbmFsIGJlbmVmaXQgb2YgdHlwZSBzYWZldHkuCisKK1RoaXMgSE9XVE8gZGVzY3JpYmVzIHRoZSBtYW51YWwgbWV0aG9kIGZpcnN0IGFuZCBjb3ZlcnMgdGhlIGRjb3BpZGwKK2NvbXBpbGVyIGxhdGVyLgorCitFc3RhYmxpc2hpbmcgdGhlIENvbm5lY3Rpb246CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0tBcHBsaWNhdGlvbiBoYXMgZ2FpbmVkIGEgbWV0aG9kIGNhbGxlZCAiS0FwcGxpY2F0aW9uOjpkY29wQ2xpZW50KCkiCit3aGljaCByZXR1cm5zIGEgcG9pbnRlciB0byBhIERDT1BDbGllbnQgaW5zdGFuY2UuICBUaGUgZmlyc3QgdGltZSB0aGlzCittZXRob2QgaXMgY2FsbGVkLCB0aGUgY2xpZW50IGNsYXNzIHdpbGwgYmUgY3JlYXRlZC4gIERDT1BDbGllbnRzIGhhdmUKK3VuaXF1ZSBpZGVudGlmaWVycyBhdHRhY2hlZCB0byB0aGVtIHdoaWNoIGFyZSBiYXNlZCBvbiB3aGF0CitLQXBwbGljYXRpb246Om5hbWUoKSByZXR1cm5zLiAgSW4gZmFjdCwgaWYgdGhlcmUgaXMgb25seSBhIHNpbmdsZQoraW5zdGFuY2Ugb2YgdGhlIHByb2dyYW0gcnVubmluZywgdGhlIGFwcElkIHdpbGwgYmUgZXF1YWwgdG8KK0tBcHBsaWNhdGlvbjo6bmFtZSgpLgorCitUbyBhY3R1YWxseSBlbmFibGUgRENPUCBjb21tdW5pY2F0aW9uIHRvIGJlZ2luLCB5b3UgbXVzdCB1c2UKK0RDT1BDbGllbnQ6OmF0dGFjaCgpLiAgVGhpcyB3aWxsIGF0dGVtcHQgdG8gYXR0YWNoIHRvIHRoZSBEQ09QIHNlcnZlci4KK0lmIG5vIHNlcnZlciBpcyBmb3VuZCBvciB0aGVyZSBpcyBhbnkgb3RoZXIgdHlwZSBvZiBlcnJvciwgYXR0YWNoKCkKK3dpbGwgcmV0dXJuIGZhbHNlLiBLQXBwbGljYXRpb24gd2lsbCBjYXRjaCBhIGRjb3Agc2lnbmFsIGFuZCBkaXNwbGF5IGFuCithcHByb3ByaWF0ZSBlcnJvciBtZXNzYWdlIGJveCBpbiB0aGF0IGNhc2UuCisKK0FmdGVyIGNvbm5lY3Rpbmcgd2l0aCB0aGUgc2VydmVyIHZpYSBEQ09QQ2xpZW50OjphdHRhY2goKSwgeW91IG5lZWQgdG8KK3JlZ2lzdGVyIHRoaXMgYXBwSWQgd2l0aCB0aGUgc2VydmVyIHNvIGl0IGtub3dzIGFib3V0IHlvdS4gIE90aGVyd2lzZSwKK3lvdSBhcmUgY29tbXVuaWNhdGluZyBhbm9ueW1vdXNseS4gIFVzZSB0aGUKK0RDT1BDbGllbnQ6OnJlZ2lzdGVyQXMoY29uc3QgUUNTdHJpbmcgJm5hbWUpIHRvIGRvIHNvLiAgSW4gdGhlIHNpbXBsZQorY2FzZToKKworLyoKKyAqIHJldHVybnMgdGhlIGFwcElkIHRoYXQgaXMgYWN0dWFsbHkgcmVnaXN0ZXJlZCwgd2hpY2ggX21heV8gYmUKKyAqIGRpZmZlcmVudCBmcm9tIHdoYXQgeW91IHBhc3NlZAorICovCithcHBJZCA9IGNsaWVudC0+cmVnaXN0ZXJBcyhrQXBwLT5uYW1lKCkpOworCitJZiB5b3UgbmV2ZXIgcmV0cmlldmUgdGhlIERDT1BDbGllbnQgcG9pbnRlciBmcm9tIEtBcHBsaWNhdGlvbiwgdGhlCitvYmplY3Qgd2lsbCBub3QgYmUgY3JlYXRlZCBhbmQgdGh1cyB0aGVyZSB3aWxsIGJlIG5vIG1lbW9yeSBvdmVyaGVhZC4KKworWW91IG1heSBhbHNvIGRldGFjaCBmcm9tIHRoZSBzZXJ2ZXIgYnkgY2FsbGluZyBEQ09QQ2xpZW50OjpkZXRhY2goKS4KK0lmIHlvdSB3aXNoIHRvIGF0dGFjaCBhZ2FpbiB5b3Ugd2lsbCBuZWVkIHRvIHJlLXJlZ2lzdGVyIGFzIHdlbGwuICBJZgoreW91IG9ubHkgd2lzaCB0byBjaGFuZ2UgdGhlIElEIHVuZGVyIHdoaWNoIHlvdSBhcmUgcmVnaXN0ZXJlZCwgc2ltcGx5CitjYWxsIERDT1BDbGllbnQ6OnJlZ2lzdGVyQXMoKSB3aXRoIHRoZSBuZXcgbmFtZS4KKworS1VuaXF1ZUFwcGxpY2F0aW9uIGF1dG9tYXRpY2FsbHkgcmVnaXN0ZXJzIGl0c2VsZiB0byBEQ09QLiBJZiB5b3UKK2FyZSB1c2luZyBLVW5pcXVlQXBwbGljYXRpb24geW91IHNob3VsZCBub3QgYXR0YWNoIG9yIHJlZ2lzdGVyCit5b3Vyc2VsZiwgdGhpcyBpcyBhbHJlYWR5IGRvbmUuIFRoZSBhcHBJZCBpcyBieSBkZWZpbml0aW9uCitlcXVhbCB0byBrYXBwLT5uYW1lKCkuIFlvdSBjYW4gcmV0cmlldmUgdGhlIHJlZ2lzdGVyZWQgRENPUCBjbGllbnQKK2J5IGNhbGxpbmcga2FwcC0+ZGNvcENsaWVudCgpLgorCitTZW5kaW5nIERhdGEgdG8gYSBSZW1vdGUgQXBwbGljYXRpb246CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RvIGFjdHVhbGx5IGNvbW11bmljYXRlLCB5b3UgaGF2ZSBvbmUgb2YgdHdvIGNob2ljZXMuICBZb3UgbWF5IGVpdGhlcgorY2FsbCB0aGUgInNlbmQiIG9yIHRoZSAiY2FsbCIgbWV0aG9kLiAgQm90aCBtZXRob2RzIHJlcXVpcmUgdGhyZWUKK2lkZW50aWZpY2F0aW9uIHBhcmFtZXRlcnM6IGFuIGFwcGxpY2F0aW9uIGlkZW50aWZpZXIsIGEgcmVtb3RlIG9iamVjdCwKK2EgcmVtb3RlIGZ1bmN0aW9uLiBTZW5kaW5nIGlzIGFzeW5jaHJvbm91cyAoaS5lLiBpdCByZXR1cm5zIGltbWVkaWF0ZWx5KQorYW5kIG1heSBvciBtYXkgbm90IHJlc3VsdCBpbiB5b3VyIG93biBhcHBsaWNhdGlvbiBiZWluZyBzZW50IGEgbWVzc2FnZSBhdAorc29tZSBwb2ludCBpbiB0aGUgZnV0dXJlLiBUaGVuICJzZW5kIiByZXF1aXJlcyBvbmUgYW5kICJjYWxsIiByZXF1aXJlcwordHdvIGRhdGEgcGFyYW1ldGVycy4KKworVGhlIHJlbW90ZSBvYmplY3QgbXVzdCBiZSBzcGVjaWZpZWQgYXMgYW4gb2JqZWN0IGhpZXJhcmNoeS4gIFRoYXQgaXMsCitpZiB0aGUgdG9wbGV2ZWwgb2JqZWN0IGlzIGNhbGxlZCAiZm9vT2JqZWN0IiBhbmQgaGFzIHRoZSBjaGlsZAorImJhck9iamVjdCIsIHlvdSB3b3VsZCByZWZlcmVuY2UgdGhpcyBvYmplY3QgYXMgImZvb09iamVjdC9iYXJPYmplY3QiLgorRnVuY3Rpb25zIG11c3QgYmUgZGVzY3JpYmVkIGJ5IGEgZnVsbCBmdW5jdGlvbiBzaWduYXR1cmUuICBJZiB0aGUKK3JlbW90ZSBmdW5jdGlvbiBpcyBjYWxsZWQgImRvSXQiLCBhbmQgaXQgdGFrZXMgYW4gaW50LCBpdCB3b3VsZCBiZQorZGVzY3JpYmVkIGFzICJkb0l0KGludCkiLiAgUGxlYXNlIG5vdGUgdGhhdCB0aGUgcmV0dXJuIHR5cGUgaXMgbm90CitzcGVjaWZpZWQgaGVyZSwgYXMgaXQgaXMgbm90IHBhcnQgb2YgdGhlIGZ1bmN0aW9uIHNpZ25hdHVyZSAob3IgYXQKK2xlYXN0IHRoZSBDKysgdW5kZXJzdGFuZGluZyBvZiBhIGZ1bmN0aW9uIHNpZ25hdHVyZSkuICBZb3Ugd2lsbCBnZXQKK3RoZSByZXR1cm4gdHlwZSBvZiBhIGZ1bmN0aW9uIGJhY2sgYXMgYW4gZXh0cmEgcGFyYW1ldGVyIHRvCitEQ09QQ2xpZW50OjpjYWxsKCkuICBTZWUgdGhlIHNlY3Rpb24gb24gY2FsbCgpIGZvciBtb3JlIGRldGFpbHMuCisKK0luIG9yZGVyIHRvIGFjdHVhbGx5IGdldCB0aGUgZGF0YSB0byB0aGUgcmVtb3RlIGNsaWVudCwgaXQgbXVzdCBiZQorInNlcmlhbGl6ZWQiIHZpYSBhIFFEYXRhU3RyZWFtIG9wZXJhdGluZyBvbiBhIFFCeXRlQXJyYXkuIFRoaXMgaXMgaG93Cit0aGUgZGF0YSBwYXJhbWV0ZXIgaXMgImJ1aWx0Ii4gQSBmZXcgZXhhbXBsZXMgd2lsbCBtYWtlIGNsZWFyIGhvdyB0aGlzCit3b3Jrcy4KKworU2F5IHlvdSB3YW50IHRvIGNhbGwgImRvSXQiIGFzIGRlc2NyaWJlZCBhYm92ZSwgYW5kIG5vdCBibG9jayAob3Igd2FpdAorZm9yIGEgcmVzcG9uc2UpLiAgWW91IHdpbGwgbm90IHJlY2VpdmUgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgcmVtb3RlbHkKK2NhbGxlZCBmdW5jdGlvbiwgYnV0IHlvdSB3aWxsIG5vdCBoYW5nIHdoaWxlIHRoZSBSUEMgaXMgcHJvY2Vzc2VkIGVpdGhlci4KK1RoZSByZXR1cm4gdmFsdWUgb2Ygc2VuZCgpIGluZGljYXRlcyB3aGV0aGVyIERDT1AgY29tbXVuaWNhdGlvbiBzdWNjZWVkZWQKK29yIG5vdC4KKworUUJ5dGVBcnJheSBkYXRhOworUURhdGFTdHJlYW0gYXJnKGRhdGEsIElPX1dyaXRlT25seSk7CithcmcgPDwgNTsKK2lmICghY2xpZW50LT5zZW5kKCJzb21lQXBwSWQiLCAiZm9vT2JqZWN0L2Jhck9iamVjdCIsICJkb0l0KGludCkiLAorCSAgICAgICAgICBkYXRhKSkKKyAgcURlYnVnKCJ0aGVyZSB3YXMgc29tZSBlcnJvciB1c2luZyBEQ09QLiIpOworCitPSywgbm93IGxldCdzIHNheSB3ZSB3YW50ZWQgdG8gZ2V0IHRoZSBkYXRhIGJhY2sgZnJvbSB0aGUgcmVtb3RlbHkKK2NhbGxlZCBmdW5jdGlvbi4gIFlvdSBoYXZlIHRvIGV4ZWN1dGUgYSBjYWxsKCkgaW5zdGVhZCBvZiBhIHNlbmQoKS4KK1RoZSByZXR1cm5lZCB2YWx1ZSB3aWxsIHRoZW4gYmUgYXZhaWxhYmxlIGluIHRoZSBkYXRhIHBhcmFtZXRlciAicmVwbHkiLgorVGhlIGFjdHVhbCByZXR1cm4gdmFsdWUgb2YgY2FsbCgpIGlzIHN0aWxsIHdoZXRoZXIgb3Igbm90IERDT1AKK2NvbW11bmljYXRpb24gd2FzIHN1Y2Nlc3NmdWwuCisKK1FCeXRlQXJyYXkgZGF0YSwgcmVwbHlEYXRhOworUUNTdHJpbmcgcmVwbHlUeXBlOworUURhdGFTdHJlYW0gYXJnKGRhdGEsIElPX1dyaXRlT25seSk7CithcmcgPDwgNTsKK2lmICghY2xpZW50LT5jYWxsKCJzb21lQXBwSWQiLCAiZm9vT2JqZWN0L2Jhck9iamVjdCIsICJkb0l0KGludCkiLAorICAgICAgICAgICAgICAgICAgZGF0YSwgcmVwbHlUeXBlLCByZXBseURhdGEpKQorICBxRGVidWcoInRoZXJlIHdhcyBzb21lIGVycm9yIHVzaW5nIERDT1AuIik7CitlbHNlIHsKKyAgUURhdGFTdHJlYW0gcmVwbHkocmVwbHlEYXRhLCBJT19SZWFkT25seSk7CisgIGlmIChyZXBseVR5cGUgPT0gIlFTdHJpbmciKSB7CisgICAgUVN0cmluZyByZXN1bHQ7CisgICAgcmVwbHkgPj4gcmVzdWx0OworICAgIHByaW50KCJ0aGUgcmVzdWx0IGlzOiAlcyIscmVzdWx0LmxhdGluMSgpKTsKKyAgfSBlbHNlCisgICAgcURlYnVnKCJkb0l0IHJldHVybmVkIGFuIHVuZXhwZWN0ZWQgdHlwZSBvZiByZXBseSEiKTsKK30KKworTi5CLjogWW91IGNhbm5vdCBjYWxsKCkgYSBtZXRob2QgYmVsb25naW5nIHRvIGFuIGFwcGxpY2F0aW9uIHdoaWNoIGhhcworcmVnaXN0ZXJlZCB3aXRoIGFuIHVuaXF1ZSBudW1lcmljIGlkIGFwcGVuZGVkIHRvIGl0cyB0ZXh0dWFsIG5hbWUgKHNlZQorZGNvcGNsaWVudC5oIGZvciBtb3JlIGluZm8pLiBJbiB0aGlzIGNhc2UsIERDT1Agd291bGQgbm90IGtub3cgd2hpY2gKK2FwcGxpY2F0aW9uIGl0IHNob3VsZCBjb25uZWN0IHdpdGggdG8gY2FsbCB0aGUgbWV0aG9kLiBUaGlzIGlzIG5vdCBhbiBpc3N1ZQord2l0aCBzZW5kKCksIGFzIHlvdSBjYW4gYnJvYWRjYXN0IHRvIGFsbCBhcHBsaWNhdGlvbnMgdGhhdCBoYXZlIHJlZ2lzdGVyZWQKK3dpdGggYXBwbmFtZS08bnVtZXJpY19pZD4gYnkgdXNpbmcgYSB3aWxkY2FyZCAoZS5nLiAna29uc29sZS0qJyksIHdoaWNoCit3aWxsIHNlbmQgeW91ciBzaWduYWwgdG8gYWxsIGFwcGxpY2F0aW9ucyBjYWxsZWQgJ2tvbnNvbGUnLgorCitSZWNlaXZpbmcgRGF0YSB2aWEgRENPUDoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitDdXJyZW50bHkgdGhlIG9ubHkgcmVhbCB3YXkgdG8gcmVjZWl2ZSBkYXRhIGZyb20gRENPUCBpcyB0byBtdWx0aXBseQoraW5oZXJpdCBmcm9tIHRoZSBub3JtYWwgY2xhc3MgdGhhdCB5b3UgYXJlIGluaGVyaXRpbmcgKHVzdWFsbHkgc29tZQorc29ydCBvZiBRV2lkZ2V0IHN1YmNsYXNzIG9yIFFPYmplY3QpIGFzIHdlbGwgYXMgdGhlIERDT1BPYmplY3QgY2xhc3MuCitEQ09QT2JqZWN0IHByb3ZpZGVzIG9uZSB2ZXJ5IGltcG9ydGFudCBtZXRob2Q6IERDT1BPYmplY3Q6OnByb2Nlc3MoKS4KK1RoaXMgaXMgYSBwdXJlIHZpcnR1YWwgbWV0aG9kIHRoYXQgeW91IG11c3QgaW1wbGVtZW50IGluIG9yZGVyIHRvCitwcm9jZXNzIERDT1AgbWVzc2FnZXMgdGhhdCB5b3UgcmVjZWl2ZS4gIEl0IHRha2VzIGEgZnVuY3Rpb24KK3NpZ25hdHVyZSwgUUJ5dGVBcnJheSBvZiBwYXJhbWV0ZXJzLCBhbmQgYSByZWZlcmVuY2UgdG8gYSBRQnl0ZUFycmF5Citmb3IgdGhlIHJlcGx5IGRhdGEgdGhhdCB5b3UgbXVzdCBmaWxsIGluLgorCitUaGluayBvZiBEQ09QT2JqZWN0Ojpwcm9jZXNzKCkgYXMgYSBzb3J0IG9mIGRpc3BhdGNoIGFnZW50LiAgSW4gdGhlCitmdXR1cmUsIHRoZXJlIHdpbGwgcHJvYmFibHkgYmUgYSBwcmVjb21waWxlciBmb3IgeW91ciBzb3VyY2VzIHRvIHdyaXRlCit0aGlzIG1ldGhvZCBmb3IgeW91LiAgSG93ZXZlciwgdW50aWwgdGhhdCBwb2ludCB5b3UgbmVlZCB0byBleGFtaW5lCit0aGUgaW5jb21pbmcgZnVuY3Rpb24gc2lnbmF0dXJlIGFuZCB0YWtlIGFjdGlvbiBhY2NvcmRpbmdseS4gIEhlcmUgaXMKK2FuIGV4YW1wbGUgaW1wbGVtZW50YXRpb24uCisKK2Jvb2wgQmFyT2JqZWN0Ojpwcm9jZXNzKGNvbnN0IFFDU3RyaW5nICZmdW4sIGNvbnN0IFFCeXRlQXJyYXkgJmRhdGEsCisJCSAgICAgICAgUUNTdHJpbmcgJnJlcGx5VHlwZSwgUUJ5dGVBcnJheSAmcmVwbHlEYXRhKQoreworICBpZiAoZnVuID09ICJkb0l0KGludCkiKSB7CisgICAgUURhdGFTdHJlYW0gYXJnKGRhdGEsIElPX1JlYWRPbmx5KTsKKyAgICBpbnQgaTsgLy8gcGFyYW1ldGVyCisgICAgYXJnID4+IGk7CisgICAgUVN0cmluZyByZXN1bHQgPSBzZWxmLT5kb0l0IChpKTsKKyAgICBRRGF0YVN0cmVhbSByZXBseShyZXBseURhdGEsIElPX1dyaXRlT25seSk7CisgICAgcmVwbHkgPDwgcmVzdWx0OworICAgIHJlcGx5VHlwZSA9ICJRU3RyaW5nIjsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSBlbHNlIHsKKyAgICBxRGVidWcoInVua25vd24gZnVuY3Rpb24gY2FsbCB0byBCYXJPYmplY3Q6OnByb2Nlc3MoKSIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCitSZWNlaXZpbmcgQ2FsbHMgYW5kIHByb2Nlc3NpbmcgdGhlbToKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJZiB5b3VyIGFwcGxpY2F0aW9ucyBpcyBhYmxlIHRvIHByb2Nlc3MgaW5jb21pbmcgZnVuY3Rpb24gY2FsbHMKK3JpZ2h0IGF3YXkgdGhlIGFib3ZlIGNvZGUgaXMgYWxsIHlvdSBuZWVkLiBXaGVuIHlvdXIgYXBwbGljYXRpb24KK25lZWRzIHRvIGRvIG1vcmUgY29tcGxleCB0YXNrcyB5b3UgbWlnaHQgd2FudCB0byBkbyB0aGUgcHJvY2Vzc2luZworb3V0IG9mICdwcm9jZXNzJyBmdW5jdGlvbiBjYWxsIGFuZCBzZW5kIHRoZSByZXN1bHQgYmFjayBsYXRlciB3aGVuCitpdCBiZWNvbWVzIGF2YWlsYWJsZS4KKworRm9yIHRoaXMgeW91IGNhbiBhc2sgeW91ciBEQ09QQ2xpZW50IGZvciBhIHRyYW5zYWN0aW9uSWQuIFlvdSBjYW4KK3RoZW4gcmV0dXJuIGZyb20gdGhlICdwcm9jZXNzJyBmdW5jdGlvbiBhbmQgd2hlbiB0aGUgcmVzdWx0IGlzCithdmFpbGFibGUgZmluaXNoIHRoZSB0cmFuc2FjdGlvbi4gSW4gdGhlIG1lYW4gdGltZSB5b3VyIGFwcGxpY2F0aW9uCitjYW4gcmVjZWl2ZSBpbmNvbWluZyBEQ09QIGZ1bmN0aW9uIGNhbGxzIGZyb20gb3RoZXIgY2xpZW50cy4KKworU3VjaCBjb2RlIGNvdWxkIGxpa2UgdGhpczoKKworYm9vbCBCYXJPYmplY3Q6OnByb2Nlc3MoY29uc3QgUUNTdHJpbmcgJmZ1biwgY29uc3QgUUJ5dGVBcnJheSAmZGF0YSwKKwkJICAgICAgICBRQ1N0cmluZyAmLCBRQnl0ZUFycmF5ICYpCit7CisgIGlmIChmdW4gPT0gImRvSXQoaW50KSIpIHsKKyAgICBRRGF0YVN0cmVhbSBhcmcoZGF0YSwgSU9fUmVhZE9ubHkpOworICAgIGludCBpOyAvLyBwYXJhbWV0ZXIKKyAgICBhcmcgPj4gaTsKKyAgICBRU3RyaW5nIHJlc3VsdCA9IHNlbGYtPmRvSXQoaSk7CisKKyAgICBEQ09QQ2xpZW50VHJhbnNhY3Rpb24gKm15VHJhbnNhY3Rpb247CisgICAgbXlUcmFuc2FjdGlvbiA9IGthcHAtPmRjb3BDbGllbnQoKS0+YmVnaW5UcmFuc2FjdGlvbigpOworCisgICAgLy8gc3RhcnQgcHJvY2Vzc2luZy4uLgorICAgIC8vIENhbGxzIHNsb3RQcm9jZXNzaW5nRG9uZSB3aGVuIGZpbmlzaGVkLgorICAgIHN0YXJ0UHJvY2Vzc2luZyggbXlUcmFuc2FjdGlvbiwgaSk7CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSBlbHNlIHsKKyAgICBxRGVidWcoInVua25vd24gZnVuY3Rpb24gY2FsbCB0byBCYXJPYmplY3Q6OnByb2Nlc3MoKSIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCitzbG90UHJvY2Vzc2luZ0RvbmUoRENPUENsaWVudFRyYW5zYWN0aW9uICpteVRyYW5zYWN0aW9uLCBjb25zdCBRU3RyaW5nICZyZXN1bHQpCit7CisgICAgUUNTdHJpbmcgcmVwbHlUeXBlID0gIlFTdHJpbmciOworICAgIFFCeXRlQXJyYXkgcmVwbHlEYXRhOworICAgIFFEYXRhU3RyZWFtIHJlcGx5KHJlcGx5RGF0YSwgSU9fV3JpdGVPbmx5KTsKKyAgICByZXBseSA8PCByZXN1bHQ7CisgICAga2FwcC0+ZGNvcENsaWVudCgpLT5lbmRUcmFuc2FjdGlvbiggbXlUcmFuc2FjdGlvbiwgcmVwbHlUeXBlLCByZXBseURhdGEgKTsKK30KKworRENPUCBTaWduYWxzCistLS0tLS0tLS0tLS0KKworU29tZXRpbWVzIGEgY29tcG9uZW50IHdhbnRzIHRvIHNlbmQgbm90aWZpY2F0aW9ucyB2aWEgRENPUCB0byBvdGhlcgorY29tcG9uZW50cyBidXQgZG9lcyBub3Qga25vdyB3aGljaCBjb21wb25lbnRzIHdpbGwgYmUgaW50ZXJlc3RlZCBpbiB0aGVzZQorbm90aWZpY2F0aW9ucy4gT25lIGNvdWxkIHVzZSBhIGJyb2FkY2FzdCBpbiBzdWNoIGEgY2FzZSBidXQgdGhpcyBpcyBhIHZlcnkKK2NydWRlIG1ldGhvZC4gRm9yIGEgbW9yZSBzb3BoaXN0aWNhdGVkIG1ldGhvZCBEQ09QIHNpZ25hbHMgaGF2ZSBiZWVuIGludmVudGVkLgorCitEQ09QIHNpZ25hbHMgYXJlIHZlcnkgc2ltaWxhaXIgdG8gUXQgc2lnbmFscywgdGhlcmUgYXJlIHNvbWUgZGlmZmVyZW5jZXMgCit0aG91Z2guIEEgRENPUCBzaWduYWwgY2FuIGJlIGNvbm5lY3RlZCB0byBhIERDT1AgZnVuY3Rpb24uIFdoZW5ldmVyIHRoZSBEQ09QCitzaWduYWwgZ2V0cyBlbWl0dGVkLCB0aGUgRENPUCBmdW5jdGlvbnMgdG8gd2hpY2ggdGhlIHNpZ25hbCBpcyBjb25uZWN0ZWQgYXJlCitiZWluZyBjYWxsZWQuIERDT1Agc2lnbmFscyBhcmUsIGp1c3QgbGlrZSBRdCBzaWduYWxzLCBvbmUgd2F5LiBUaGV5IGRvIG5vdAorcHJvdmlkZSBhIHJldHVybiB2YWx1ZS4gCisKK0EgRENPUCBzaWduYWwgb3JpZ2luYXRlcyBmcm9tIGEgRENPUCBPYmplY3QvRENPUCBDbGllbnQgY29tYmluYXRpb24gKHNlbmRlcikuIAorSXQgY2FuIGJlIGNvbm5lY3RlZCB0byBhIGZ1bmN0aW9uIG9mIGFub3RoZXIgRENPUCBPYmplY3QvRENPUCBDbGllbnQgCitjb21iaW5hdGlvbiAocmVjZWl2ZXIpLgorCitUaGVyZSBhcmUgdHdvIG1ham9yIGRpZmZlcmVuY2VzIGJldHdlZW4gY29ubmVjdGlvbnMgb2YgUXQgc2lnbmFscyBhbmQgCitjb25uZWN0aW9ucyBvZiBEQ09QIHNpZ25hbHMuIEluIERDT1AsIHVubGlrZSBRdCwgYSBzaWduYWwgY29ubmVjdGlvbnMgY2FuCitoYXZlIGFuIGFub255bW91cyBzZW5kZXIgYW5kLCB1bmxpa2UgUXQsIGEgRENPUCBzaWduYWwgY29ubmVjdGlvbiBjYW4gYmUKK25vbi12b2xhdGlsZS4KKworV2l0aCBEQ09QIG9uZSBjYW4gY29ubmVjdCBhIHNpZ25hbCB3aXRob3V0IHNwZWNpZnlpbmcgdGhlIHNlbmRpbmcgRENPUCBPYmplY3QgCitvciBEQ09QIENsaWVudC4gSW4gdGhhdCBjYXNlIHNpZ25hbHMgZnJvbSBhbnkgRENPUCBPYmplY3QgYW5kL29yIERDT1AgQ2xpZW50Cit3aWxsIGJlIGRlbGl2ZXJlZC4gVGhpcyBhbGxvd3MgdGhlIHNwZWNpZmljYXRpb24gb2YgY2VydGFpbiBldmVudHMgd2l0aG91dAordHlpbmcgb25lc2VsZiB0byBhIGNlcnRhaW4gb2JqZWN0IHRoYXQgaW1wbGVtZW50ZXMgdGhlIGV2ZW50cy4KKworQW5vdGhlciBEQ09QIGZlYXR1cmUgYXJlIHNvIGNhbGxlZCBub24tdm9sYXRpbGUgY29ubmVjdGlvbnMuIFdpdGggUXQgc2lnbmFsCitjb25uZWN0aW9ucywgdGhlIGNvbm5lY3Rpb24gZ2V0cyBkZWxldGVkIHdoZW4gZWl0aGVyIHNlbmRlciBvciByZWNlaXZlciBvZgordGhlIHNpZ25hbCBnZXRzIGRlbGV0ZWQuIEEgdm9sYXRpbGUgRENPUCBzaWduYWwgY29ubmVjdGlvbiB3aWxsIGJlaGF2ZSB0aGUKK3NhbWUuIEhvd2V2ZXIsIGEgbm9uLXZvbGF0aWxlIERDT1Agc2lnbmFsIGNvbm5lY3Rpb24gd2lsbCBub3QgZ2V0IGRlbGV0ZWQgCit3aGVuIHRoZSBzZW5kaW5nIG9iamVjdCBnZXRzIGRlbGV0ZWQuIE9uY2UgYSBuZXcgb2JqZWN0IGdldHMgY3JlYXRlZCB3aXRoIAordGhlIHNhbWUgbmFtZSBhcyB0aGUgb3JpZ2luYWwgc2VuZGluZyBvYmplY3QsIHRoZSBjb25uZWN0aW9uIHdpbGwgYmUgcmVzdG9yZWQuCitUaGVyZSBpcyBubyBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHR3byB3aGVuIHRoZSByZWNlaXZpbmcgb2JqZWN0IGdldHMgZGVsZXRlZCwKK2luIHRoYXQgY2FzZSB0aGUgc2lnbmFsIGNvbm5lY3Rpb24gd2lsbCBhbHdheXMgYmUgZGVsZXRlZC4KKworQSByZWNlaXZlciBjYW4gY3JlYXRlIGEgbm9uLXZvbGF0aWxlIGNvbm5lY3Rpb24gd2hpbGUgdGhlIHNlbmRlciBkb2Vzbid0ICh5ZXQpCitleGlzdC4gQW4gYW5vbnltb3VzIERDT1AgY29ubmVjdGlvbiBzaG91bGQgYWx3YXlzIGJlIG5vbi12b2xhdGlsZS4KKworVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGhvdyBLTGF1bmNoZXIgZW1pdHMgYSBzaWduYWwgd2hlbmV2ZXIgaXQgbm90aWNlcwordGhhdCBhbiBhcHBsaWNhdGlvbiB0aGF0IHdhcyBzdGFydGVkIHZpYSBLTGF1bmNoZXIgdGVybWluYXRlcy4KKworICAgUUJ5dGVBcnJheSBwYXJhbXM7CisgICBRRGF0YVN0cmVhbSBzdHJlYW0ocGFyYW1zLCBJT19Xcml0ZU9ubHkpOworICAgc3RyZWFtIDw8IHBpZDsKKyAgIGthcHAtPmRjb3BDbGllbnQoKS0+ZW1pdERDT1BTaWduYWwoImNsaWVudERpZWQocGlkX3QpIiwgcGFyYW1zKTsKKworVGhlIHRhc2sgbWFuYWdlciBvZiB0aGUgS0RFIHBhbmVsIGNvbm5lY3RzIHRvIHRoaXMgc2lnbmFsLiBJdCB1c2VzIGFuIAorYW5vbnltb3VzIGNvbm5lY3Rpb24gKGl0IGRvZXNuJ3QgcmVxdWlyZSB0aGF0IHRoZSBzaWduYWwgaXMgYmVpbmcgZW1pdHRlZAorYnkgS0xhdW5jaGVyKSB0aGF0IGlzIG5vbi12b2xhdGlsZToKKworICAgY29ubmVjdERDT1BTaWduYWwoMCwgMCwgImNsaWVudERpZWQocGlkX3QpIiwgImNsaWVudERpZWQocGlkX3QpIiwgZmFsc2UpOworCitJdCBjb25uZWN0cyB0aGUgY2xpZW50RGllZChwaWRfdCkgc2lnbmFsIHRvIGl0cyBvd24gY2xpZW50RGllZChwaWRfdCkgRENPUAorZnVuY3Rpb24uIEluIHRoaXMgY2FzZSB0aGUgc2lnbmFsIGFuZCB0aGUgZnVuY3Rpb24gdG8gY2FsbCBoYXZlIHRoZSBzYW1lIG5hbWUuCitUaGlzIGlzbid0IG5lZWRlZCBhcyBsb25nIGFzIHRoZSBhcmd1bWVudHMgb2YgYm90aCBzaWduYWwgYW5kIHJlY2VpdmluZyBmdW5jdGlvbgorbWF0Y2guIFRoZSByZWNlaXZpbmcgZnVuY3Rpb24gbWF5IGlnbm9yZSBvbmUgb3IgbW9yZSBvZiB0aGUgdHJhaWxpbmcgYXJndW1lbnRzCitvZiB0aGUgc2lnbmFsLiBFLmcuIGl0IGlzIGFsbG93ZWQgdG8gY29ubmVjdCB0aGUgY2xpZW50RGllZChwaWRfdCkgc2lnbmFsIHRvCithIGNsaWVudERpZWQodm9pZCkgRENPUCBmdW5jdGlvbi4KKworVXNpbmcgdGhlIGRjb3BpZGwgY29tcGlsZXIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitkY29waWRsIG1ha2VzIHNldHRpbmcgdXAgYSBEQ09QIHNlcnZlciBlYXN5LiBJbnN0ZWFkIG9mIGhhdmluZyB0byBpbXBsZW1lbnQKK3RoZSBwcm9jZXNzKCkgbWV0aG9kIGFuZCB1bm1hcnNoYWxsaW5nIChyZXRyaWV2aW5nIGZyb20gUUJ5dGVBcnJheSkgcGFyYW1ldGVycworbWFudWFsbHksIHlvdSBjYW4gbGV0IGRjb3BpZGwgY3JlYXRlIHRoZSBuZWNlc3NhcnkgY29kZSBvbiB5b3VyIGJlaGFsZi4KKworVGhpcyBhbHNvIGFsbG93cyB5b3UgdG8gZGVzY3JpYmUgdGhlIGludGVyZmFjZSBmb3IgeW91ciBjbGFzcyBpbiBhCitzaW5nbGUsIHNlcGFyYXRlIGhlYWRlciBmaWxlLgorCitXcml0aW5nIGFuIElETCBmaWxlIGlzIHZlcnkgc2ltaWxhciB0byB3cml0aW5nIGEgbm9ybWFsIEMrKyBoZWFkZXIuIEFuCitleGNlcHRpb24gaXMgdGhlIGtleXdvcmQgJ0FTWU5DJy4gSXQgaW5kaWNhdGVzIHRoYXQgYSBjYWxsIHRvIHRoaXMKK2Z1bmN0aW9uIHNoYWxsIGJlIHByb2Nlc3NlZCBhc3luY2hyb25vdXNseS4gRm9yIHRoZSBDKysgY29tcGlsZXIsIGl0CitleHBhbmRzIHRvICd2b2lkJy4KKworRXhhbXBsZToKKworI2lmbmRlZiBNWV9JTlRFUkZBQ0VfSAorI2RlZmluZSBNWV9JTlRFUkZBQ0VfSAorCisjaW5jbHVkZSA8ZGNvcG9iamVjdC5oPgorCitjbGFzcyBNeUludGVyZmFjZSA6IHZpcnR1YWwgcHVibGljIERDT1BPYmplY3QKK3sKKyAgS19EQ09QCisKKyAga19kY29wOgorCisgICAgdmlydHVhbCBBU1lOQyBteUFzeW5jaHJvbm91c01ldGhvZChRU3RyaW5nIHNvbWVQYXJhbWV0ZXIpID0gMDsKKyAgICB2aXJ0dWFsIFFSZWN0IG15U3luY2hyb25vdXNNZXRob2QoKSA9IDA7Cit9OworCisjZW5kaWYKKworQXMgeW91IGNhbiBzZWUsIHlvdSdyZSBlc3NlbnRpYWxseSBkZWNsYXJpbmcgYW4gYWJzdHJhY3QgYmFzZSBjbGFzcywgd2hpY2gKK3ZpcnR1YWxseSBpbmhlcml0cyBmcm9tIERDT1BPYmplY3QuCisKK0lmIHlvdSdyZSB1c2luZyB0aGUgc3RhbmRhcmQgS0RFIGJ1aWxkIHNjcmlwdHMsIHRoZW4geW91IGNhbiBzaW1wbHkKK2FkZCB0aGlzIGZpbGUgKHdoaWNoIHlvdSB3b3VsZCBjYWxsIE15SW50ZXJmYWNlLmgpIHRvIHlvdXIgc291cmNlcworZGlyZWN0b3J5LiBUaGVuIHlvdSBlZGl0IHlvdXIgTWFrZWZpbGUuYW0sIGFkZGluZyAnTXlJbnRlcmZhY2Uuc2tlbCcKK3RvIHlvdXIgU09VUkNFUyBsaXN0IGFuZCBNeUludGVyZmFjZS5oIHRvIGluY2x1ZGVfSEVBREVSUy4KKworVGhlIGJ1aWxkIHNjcmlwdHMgd2lsbCB1c2UgZGNvcGlkbCB0byBwYXJzZSBNeUludGVyZmFjZS5oLCBjb252ZXJ0aW5nCitpdCB0byBhbiBYTUwgZGVzY3JpcHRpb24gaW4gTXlJbnRlcmZhY2Uua2lkbC4gTmV4dCwgYSBmaWxlIGNhbGxlZAorTXlJbnRlcmZhY2Vfc2tlbC5jcHAgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGNyZWF0ZWQsIGNvbXBpbGVkIGFuZAorbGlua2VkIHdpdGggeW91ciBiaW5hcnkuCisKK1RoZSBuZXh0IHRoaW5nIHlvdSBoYXZlIHRvIGRvIGlzIHRvIGNob29zZSB3aGljaCBvZiB5b3VyIGNsYXNzZXMgd2lsbAoraW1wbGVtZW50IHRoZSBpbnRlcmZhY2UgZGVzY3JpYmVkIGluIE15SW50ZXJmYWNlLmguIEFsdGVyIHRoZSBpbmhlcml0YW5jZQorb2YgdGhpcyBjbGFzcyBzdWNoIHRoYXQgaXQgdmlydHVhbGx5IGluaGVyaXRzIGZyb20gTXlJbnRlcmZhY2UuIFRoZW4KK2FkZCBkZWNsYXJhdGlvbnMgdG8geW91ciBjbGFzcyBpbnRlcmZhY2Ugc2ltaWxhciB0byB0aG9zZSBvbiBNeUludGVyZmFjZS5oLAorYnV0IHZpcnR1YWwsIG5vdCBwdXJlIHZpcnR1YWwuCisKK0V4YW1wbGU6CisKK2NsYXNzIE15Q2xhc3M6IHB1YmxpYyBRT2JqZWN0LCB2aXJ0dWFsIHB1YmxpYyBNeUludGVyZmFjZQoreworICBRX09CSkVDVAorICAKKyAgcHVibGljOgorICAgIE15Q2xhc3MoKTsgCisgICAgfk15Q2xhc3MoKTsKKworICAgIEFTWU5DIG15QXN5bmNocm9ub3VzTWV0aG9kKFFTdHJpbmcgc29tZVBhcmFtZXRlcik7CisgICAgUVJlY3QgbXlTeW5jaHJvbm91c01ldGhvZCgpOworfTsKKworTm90ZTogKFF0IGlzc3VlKSBSZW1lbWJlciB0aGF0IGlmIHlvdSBhcmUgaW5oZXJpdGluZyBmcm9tIFFPYmplY3QsIHlvdSBtdXN0CitwbGFjZSBpdCBmaXJzdCBpbiB0aGUgbGlzdCBvZiBpbmhlcml0ZWQgY2xhc3Nlcy4KKworSW4gdGhlIGltcGxlbWVudGF0aW9uIG9mIHlvdXIgY2xhc3MnIGN0b3IsIHlvdSBtdXN0IGV4cGxpY2l0bHkgaW5pdGlhbGl6ZQordGhvc2UgY2xhc3NlcyBmcm9tIHdoaWNoIHlvdSBhcmUgaW5oZXJpdGluZyBmcm9tLiBUaGlzIGlzLCBvZiBjb3Vyc2UsIGdvb2QKK3ByYWN0aXNlLCBidXQgaXQgaXMgZXNzZW50aWFsIGhlcmUgYXMgeW91IG5lZWQgdG8gdGVsbCBEQ09QT2JqZWN0IHRoZSBuYW1lIG9mCit0aGUgaW50ZXJmYWNlIHdoaWNoIHlvdXIgYXJlIGltcGxlbWVudGluZy4KKworRXhhbXBsZToKKworTXlDbGFzczo6TXlDbGFzcygpCisgIDogUU9iamVjdCgpLAorICAgIERDT1BPYmplY3QoIk15SW50ZXJmYWNlIikKK3sKKyAgLy8gd2hhdGV2ZXIuLi4KK30KKworTm93IHlvdSBjYW4gc2ltcGx5IGltcGxlbWVudCB0aGUgbWV0aG9kcyB5b3UgaGF2ZSBkZWNsYXJlZCBpbiB5b3VyIGludGVyZmFjZSwKK2V4YWN0bHkgdGhlIHNhbWUgYXMgeW91IHdvdWxkIG5vcm1hbGx5LgorCitFeGFtcGxlOgorCit2b2lkIE15Q2xhc3M6Om15QXN5bmNocm9ub3VzTWV0aG9kKFFTdHJpbmcgc29tZVBhcmFtZXRlcikKK3sKKyAgcURlYnVnKCJteUFzeW5jTWV0aG9kIGNhbGxlZCB3aXRoIHBhcmFtIGAiICsgc29tZVBhcmFtZXRlciArICInIik7Cit9CisKKworSXQgaXMgbm90IG5lY2Vzc2FyeSAodGhvdWdoIHZlcnkgY2xlYW4pIHRvIGRlZmluZSBhbiBpbnRlcmZhY2UgYXMgYW4KK2Fic3RyYWN0IGNsYXNzIG9mIGl0cyBvd24sIGxpa2Ugd2UgZGlkIGluIHRoZSBleGFtcGxlIGFib3ZlLiBXZSBjb3VsZAoranVzdCBhcyB3ZWxsIGhhdmUgZGVmaW5lZCBhIGtfZGNvcCBzZWN0aW9uIGRpcmVjdGx5IHdpdGhpbiBNeUNsYXNzOgorCitjbGFzcyBNeUNsYXNzOiBwdWJsaWMgUU9iamVjdCwgdmlydHVhbCBwdWJsaWMgRENPUE9iamVjdAoreworICBRX09CSkVDVAorICBLX0RDT1AKKworICBwdWJsaWM6CisgICAgTXlDbGFzcygpOyAKKyAgICB+TXlDbGFzcygpOworCisgIGtfZGNvcDoKKyAgICBBU1lOQyBteUFzeW5jaHJvbm91c01ldGhvZChRU3RyaW5nIHNvbWVQYXJhbWV0ZXIpOworICAgIFFSZWN0IG15U3luY2hyb25vdXNNZXRob2QoKTsKK307CisKK0luIGFkZGl0aW9uIHRvIHNrZWxldG9ucywgZGNvcGlkbDJjcHAgYWxzbyBnZW5lcmF0ZSBzdHVicy4gVGhvc2UgbWFrZQoraXQgZWFzeSB0byBjYWxsIGEgRENPUCBpbnRlcmZhY2Ugd2l0aG91dCBkb2luZyB0aGUgbWFyc2hhbGxpbmcKK21hbnVhbGx5LiBUbyB1c2UgYSBzdHViLCBhZGQgTXlJbnRlcmZhY2Uuc3R1YiB0byB0aGUgU09VUkNFUyBsaXN0IG9mCit5b3VyIE1ha2VmaWxlLmFtLiBUaGUgc3R1YiBjbGFzcyB3aWxsIHRoZW4gYmUgY2FsbGVkIE15SW50ZXJmYWNlX3N0dWIuCisKK0NvbmNsdXNpb246CistLS0tLS0tLS0tLQorCitIb3BlZnVsbHkgdGhpcyBkb2N1bWVudCB3aWxsIGdldCB5b3Ugd2VsbCBvbiB5b3VyIHdheSBpbnRvIHRoZSB3b3JsZAorb2YgaW50ZXItcHJvY2VzcyBjb21tdW5pY2F0aW9uIHdpdGggS0RFISAgUGxlYXNlIGRpcmVjdCBhbGwgY29tbWVudHMKK2FuZC9vciBzdWdnZXN0aW9ucyB0byBQcmVzdG9uIEJyb3duIDxwYnJvd25Aa2RlLm9yZz4gYW5kIE1hdHRoaWFzCitFdHRyaWNoIDxldHRyaWNoQGtkZS5vcmc+LgorCisKK0ludGVyLXVzZXIgY29tbXVuaWNhdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1NvbWV0aW1lcyBpdCBtaWdodCBiZSBpbnRlcmVzdGluZyB0byB1c2UgRENPUCBiZXR3ZWVuIHByb2Nlc3NlcworYmVsb25naW5nIHRvIGRpZmZlcmVudCB1c2VycywgZS5nLiBhIGZyb250ZW5kIHByb2Nlc3MgcnVubmluZword2l0aCB0aGUgdXNlcidzIGlkLCBhbmQgYSBiYWNrZW5kIHByb2Nlc3MgcnVubmluZyBhcyByb290LgorCitUbyBkbyB0aGlzLCB0d28gc3RlcHMgaGF2ZSB0byBiZSB0YWtlbjoKKworYSkgYm90aCBwcm9jZXNzZXMgbmVlZCB0byB0YWxrIHRvIHRoZSBzYW1lIERDT1Agc2VydmVyCitiKSB0aGUgYXV0aGVudGljYXRpb24gbXVzdCBiZSBlbnN1cmVkCisKK0ZvciB0aGUgZmlyc3Qgc3RlcCwgeW91IHNpbXBseSBwYXNzIHRoZSBzZXJ2ZXIgYWRkcmVzcyAoYXMKK2ZvdW5kIGluIC5EQ09Qc2VydmVyKSB0byB0aGUgc2Vjb25kIHByb2Nlc3MuIEZvciB0aGUgYXV0aGVudGljYXRpb24sCit5b3UgY2FuIHVzZSB0aGUgSUNFQVVUSE9SSVRZIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHRlbGwgdGhlCitzZWNvbmQgcHJvY2VzcyB3aGVyZSB0byBmaW5kIHRoZSBhdXRoZW50aWNhdGlvbiBpbmZvcm1hdGlvbi4KKyhOb3RlIHRoYXQgdGhpcyBpbXBsaWVzIHRoYXQgdGhlIHNlY29uZCBwcm9jZXNzIGlzIGFibGUgdG8KK3JlYWQgdGhlIGF1dGhlbnRpY2F0aW9uIGZpbGUsIHNvIGl0IHdpbGwgcHJvYmFibHkgb25seSB3b3JrCitpZiB0aGUgc2Vjb25kIHByb2Nlc3MgcnVucyBhcyByb290LiBJZiBpdCBzaG91bGQgcnVuIGFzIGFub3RoZXIKK3VzZXIsIGEgc2ltaWxhciBhcHByb2FjaCB0byB3aGF0IGtkZXN1IGRvZXMgd2l0aCB4YXV0aCBtdXN0CitiZSB0YWtlbi4gSW4gZmFjdCwgaXQgd291bGQgYmUgYSB2ZXJ5IGdvb2QgaWRlYSB0byBhZGQgRENPUAorc3VwcG9ydCB0byBrZGVzdSEpCisKK0ZvciBleGFtcGxlCisKK0lDRUFVVEhPUklUWT1+dXNlci8uSUNFYXV0aG9yaXR5IGtkZXN1IHJvb3QgLWMga2Ntcm9vdCAtZGNvcHNlcnZlciBgY2F0IH51c2VyLy5EQ09Qc2VydmVyYAorCit3aWxsLCBhZnRlciBrZGVzdSBnb3QgdGhlIHJvb3QgcGFzc3dvcmQsIGV4ZWN1dGUga2Ntcm9vdCBhcyByb290LCB0YWxraW5nCit0byB0aGUgdXNlcidzIGRjb3Agc2VydmVyLgorCisKK05PVEU6IERDT1AgY29tbXVuaWNhdGlvbiBpcyBub3QgZW5jcnlwdGVkLCBzbyBwbGVhc2UgZG8gbm90CitwYXNzIGltcG9ydGFudCBpbmZvcm1hdGlvbiBhcm91bmQgdGhpcyB3YXkuCisKKworUGVyZm9ybWFuY2UgVGVzdHM6CistLS0tLS0tLS0tLS0tLS0tLS0KK0EgZmV3IGJhY2stb2YtdGhlLW5hcGtpbiB0ZXN0cyBmb2xrczoKKworQ29kZToKKworI2luY2x1ZGUgPGthcHBsaWNhdGlvbi5oPgorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgIEtBcHBsaWNhdGlvbiAqYXBwOworCisgIGFwcCA9IG5ldyBLQXBwbGljYXRpb24oYXJnYywgYXJndiwgInRlc3RpdCIpOworICByZXR1cm4gYXBwLT5leGVjKCk7Cit9CisKK0NvbXBpbGVkIHdpdGg6CisKK2crKyAtTzIgLW8gdGVzdGl0IHRlc3RpdC5jcHAgLUkkUVRESVIvaW5jbHVkZSAtTCRRVERJUi9saWIgLWxrZGVjb3JlCisKK29uIExpbnV4IHlpZWxkcyB0aGUgZm9sbG93aW5nIG1lbW9yeSB1c2Ugc3RhdGlzdGljczoKKworVm1TaXplOiAgICAgODA3NiBrQgorVm1MY2s6ICAgICAgICAgMCBrQgorVm1SU1M6ICAgICAgNDUzMiBrQgorVm1EYXRhOiAgICAgIDIwOCBrQgorVm1TdGs6ICAgICAgICAyMCBrQgorVm1FeGU6ICAgICAgICAgNCBrQgorVm1MaWI6ICAgICAgNjU4OCBrQgorCitJZiBJIGNyZWF0ZSB0aGUgS0FwcGxpY2F0aW9uJ3MgRENPUENsaWVudCwgYW5kIGNhbGwgYXR0YWNoKCkgYW5kCityZWdpc3RlckFzKCksIGl0IGNoYW5nZXMgdG8gdGhpczoKKworVm1TaXplOiAgICAgODA4MCBrQgorVm1MY2s6ICAgICAgICAgMCBrQgorVm1SU1M6ICAgICAgNDYyNCBrQgorVm1EYXRhOiAgICAgIDIwOCBrQgorVm1TdGs6ICAgICAgICAyMCBrQgorVm1FeGU6ICAgICAgICAgNCBrQgorVm1MaWI6ICAgICAgNjU4OCBrQgorCitCYXNpY2FsbHkgaXQgYXBwZWFycyB0aGF0IHVzaW5nIERDT1AgY2F1c2VzIDEwMGsgbW9yZSBtZW1vcnkgdG8gYmUKK3Jlc2lkZW50LCBidXQgbm8gbW9yZSBkYXRhIG9yIHN0YWNrLiAgU28gdGhpcyB3aWxsIGJlIHNoYXJlZCBiZXR3ZWVuIGFsbAorcHJvY2Vzc2VzLCByaWdodD8gIDEwMGsgdG8gZW5hYmxlIERDT1AgaW4gYWxsIGFwcHMgZG9lc24ndCBzZWVtIGJhZCBhdAorYWxsLiA6KQorCitPSyBub3cgZm9yIHNvbWUgdGltaW5ncy4gIEp1c3QgY3JlYXRpbmcgYSBLQXBwbGljYXRpb24gYW5kIHRoZW4gZXhpdGluZworKGkuZS4gcmVtb3ZpbmcgdGhlIGNhbGwgdG8gS0FwcGxpY2F0aW9uOjpleGVjKSB0YWtlcyB0aGlzIG11Y2ggdGltZToKKworMC4yOHVzZXIgMC4wMnN5c3RlbSAwOjAwLjMyZWxhcHNlZCA5MiVDUFUgKDBhdmd0ZXh0KzBhdmdkYXRhIDBtYXhyZXNpZGVudClrCiswaW5wdXRzKzBvdXRwdXRzICgxMDg0bWFqb3IrNjJtaW5vcilwYWdlZmF1bHRzIDBzd2FwcworCitJLmUuIGFib3V0IDEvMyBvZiBhIHNlY29uZCBvbiBteSBQSUktMjMzLiAgTm93LCBpZiB3ZSBjcmVhdGUgb3VyIERDT1AKK29iamVjdCBhbmQgYXR0YWNoIHRvIHRoZSBzZXJ2ZXIsIGl0IHRha2VzIHRoaXMgbG9uZzoKKworMC4yN3VzZXIgMC4wM3N5c3RlbSAwOjAwLjM0ZWxhcHNlZCA4NyVDUFUgKDBhdmd0ZXh0KzBhdmdkYXRhIDBtYXhyZXNpZGVudClrCiswaW5wdXRzKzBvdXRwdXRzICgxMTA3bWFqb3IrNjVtaW5vcilwYWdlZmF1bHRzIDBzd2FwcworCitJLmUuIGFib3V0IDEvMyBvZiBhIHNlY29uZC4gIEJhc2ljYWxseSBEQ09QQ2xpZW50IGNyZWF0aW9uIGFuZCBhdHRhY2hpbmcKK2dldHMgbG9zdCBpbiB0aGUgc3RhdGlzdGljYWwgdmFyaWF0aW9uICgibm9pc2UiKS4gIEkgd2FzIGdldHRpbmcgdGltZXMKK2JldHdlZW4gLjMyIGFuZCAuNDggb3ZlciBzZXZlcmFsIHJ1bnMgZm9yIGJvdGggb2YgdGhlIGV4YW1wbGUgcHJvZ3JhbXMsIHNvCitvYnZpb3VzbHkgc3lzdGVtIGxvYWQgaXMgbW9yZSByZWxldmFudCB0aGFuIHRoZSBleHRyYSB0d28gY2FsbHMgdG8KK0RDT1BDbGllbnQ6OmF0dGFjaCBhbmQgRENPUENsaWVudDo6cmVnaXN0ZXJBcywgYXMgd2VsbCBhcyB0aGUgYWN0dWFsCitEQ09QQ2xpZW50IGNvbnN0cnVjdG9yIHRpbWUuCisKZGlmZiAtLWdpdCBhL2RvYy9kaWFncmFtLnBuZyBiL2RvYy9kaWFncmFtLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2I4NGE5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2RpYWdyYW0ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9kaWFncmFtLnN2ZyBiL2RvYy9kaWFncmFtLnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTNjNTY3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2RpYWdyYW0uc3ZnCkBAIC0wLDAgKzEsNTkwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KKzwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4wLy9FTiIKKyJodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1JFQy1TVkctMjAwMTA5MDQvRFREL3N2ZzEwLmR0ZCI+Cis8IS0tIENyZWF0ZWQgd2l0aCBJbmtzY2FwZSAoaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvKSAtLT4KKzxzdmcKKyAgIGlkPSJzdmcxIgorICAgc29kaXBvZGk6dmVyc2lvbj0iMC4zMiIKKyAgIGlua3NjYXBlOnZlcnNpb249IjAuMzkiCisgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCisgICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCisgICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKKyAgIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIgorICAgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIgorICAgeG1sbnM6Y2M9Imh0dHA6Ly93ZWIucmVzb3VyY2Uub3JnL2NjLyIKKyAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKKyAgIHdpZHRoPSI4NDEuODg5NzVwdCIKKyAgIGhlaWdodD0iNTk1LjI3NTU5cHQiCisgICBzb2RpcG9kaTpkb2NiYXNlPSIvaG9tZS9ocC9kYnVzLWN2cy9kYnVzL2RvYyIKKyAgIHNvZGlwb2RpOmRvY25hbWU9ImRpYWdyYW0uc3ZnIj4KKyAgPGRlZnMKKyAgICAgaWQ9ImRlZnMzIj4KKyAgICA8bWFya2VyCisgICAgICAgc3R5bGU9Im92ZXJmbG93OnZpc2libGU7IgorICAgICAgIGlkPSJBcnJvdzFNIgorICAgICAgIHJlZlg9IjAuMCIKKyAgICAgICByZWZZPSIwLjAiCisgICAgICAgb3JpZW50PSJhdXRvIgorICAgICAgIGlua3NjYXBlOnN0b2NraWQ9IkFycm93MU0iPgorICAgICAgPHBhdGgKKyAgICAgICAgIHRyYW5zZm9ybT0ic2NhbGUoMC40KSIKKyAgICAgICAgIHN0eWxlPSJmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MS4wcHQ7bWFya2VyLXN0YXJ0Om5vbmU7IgorICAgICAgICAgZD0iTSAwLjAsMC4wIEwgNS4wLC01LjAgTCAtMTIuNSwwLjAgTCA1LjAsNS4wIEwgMC4wLDAuMCB6ICIKKyAgICAgICAgIGlkPSJwYXRoMzUxOSIKKyAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2MiIC8+CisgICAgPC9tYXJrZXI+CisgICAgPG1hcmtlcgorICAgICAgIHN0eWxlPSJvdmVyZmxvdzp2aXNpYmxlOyIKKyAgICAgICBpZD0iQXJyb3cyTCIKKyAgICAgICByZWZYPSIwLjAiCisgICAgICAgcmVmWT0iMC4wIgorICAgICAgIG9yaWVudD0iYXV0byIKKyAgICAgICBpbmtzY2FwZTpzdG9ja2lkPSJBcnJvdzJMIj4KKyAgICAgIDxwYXRoCisgICAgICAgICB0cmFuc2Zvcm09InNjYWxlKDEuMSkgdHJhbnNsYXRlKC01LDApIgorICAgICAgICAgZD0iTSA4LjcxODU4NzgsNC4wMzM3MzUyIEwgLTIuMjA3Mjg5NSwwLjAxNjAxMzI1NiBMIDguNzE4NTg4NCwtNC4wMDE3MDc4IEMgNi45NzMwOTAwLC0xLjYyOTY0NjkgNi45ODMxNDc2LDEuNjE1NzQ0MSA4LjcxODU4NzgsNC4wMzM3MzUyIHogIgorICAgICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMi4wO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZS13aWR0aDowLjYyNTAwMDAwO3N0cm9rZS1saW5lam9pbjpyb3VuZDsiCisgICAgICAgICBpZD0icGF0aDM1MTUiCisgICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2MiIC8+CisgICAgPC9tYXJrZXI+CisgIDwvZGVmcz4KKyAgPHNvZGlwb2RpOm5hbWVkdmlldworICAgICBpZD0iYmFzZSIKKyAgICAgcGFnZWNvbG9yPSIjZmZmZmZmIgorICAgICBib3JkZXJjb2xvcj0iIzY2NjY2NiIKKyAgICAgYm9yZGVyb3BhY2l0eT0iMS4wIgorICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMC4wIgorICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgorICAgICBpbmtzY2FwZTp6b29tPSIwLjkwMjEwMzE4IgorICAgICBpbmtzY2FwZTpjeD0iNDIwLjk0NDg3IgorICAgICBpbmtzY2FwZTpjeT0iMjk3LjYzNzc5IgorICAgICBpbmtzY2FwZTp3aW5kb3ctd2lkdGg9IjEwMjQiCisgICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9IjcwMSIKKyAgICAgc2hvd2dyaWQ9ImZhbHNlIgorICAgICBpbmtzY2FwZTpncmlkLWJib3g9ImZhbHNlIgorICAgICBpbmtzY2FwZTpncmlkLXBvaW50cz0idHJ1ZSIKKyAgICAgaW5rc2NhcGU6d2luZG93LXg9IjAiCisgICAgIGlua3NjYXBlOndpbmRvdy15PSIyNCIKKyAgICAgZ3JpZHNwYWNpbmd5PSIyLjUwMDAwMDBtbSIKKyAgICAgZ3JpZHNwYWNpbmd4PSIyLjUwMDAwMDBtbSIKKyAgICAgc2hvd2d1aWRlcz0idHJ1ZSIKKyAgICAgaW5rc2NhcGU6Z3VpZGUtYmJveD0idHJ1ZSI+CisgICAgPHNvZGlwb2RpOmd1aWRlCisgICAgICAgb3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgcG9zaXRpb249IjI2OC44NTc5NyIKKyAgICAgICBpZD0iZ3VpZGUzNTY2IiAvPgorICAgIDxzb2RpcG9kaTpndWlkZQorICAgICAgIG9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgIHBvc2l0aW9uPSIyOTQuMzEyMjMiCisgICAgICAgaWQ9Imd1aWRlNDIzNSIgLz4KKyAgICA8c29kaXBvZGk6Z3VpZGUKKyAgICAgICBvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICBwb3NpdGlvbj0iMzAwLjQwOTA5IgorICAgICAgIGlkPSJndWlkZTQ4ODIiIC8+CisgIDwvc29kaXBvZGk6bmFtZWR2aWV3PgorICA8bWV0YWRhdGEKKyAgICAgaWQ9Im1ldGFkYXRhNCI+CisgICAgPHJkZjpSREYKKyAgICAgICBpZD0iUkRGNSI+CisgICAgICA8Y2M6V29yaworICAgICAgICAgcmRmOmFib3V0PSIiCisgICAgICAgICBpZD0iV29yazYiPgorICAgICAgICA8ZGM6Zm9ybWF0CisgICAgICAgICAgIGlkPSJmb3JtYXQ3Ij5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CisgICAgICAgIDxkYzp0eXBlCisgICAgICAgICAgIGlkPSJ0eXBlOSIKKyAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KKyAgICAgIDwvY2M6V29yaz4KKyAgICA8L3JkZjpSREY+CisgIDwvbWV0YWRhdGE+CisgIDxyZWN0CisgICAgIHN0eWxlPSJmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjAuNzUwMDAwMDA7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjMuNzUwMDAwMDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0LjAwMDAwMDA7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwOyIKKyAgICAgaWQ9InJlY3Q5MDgiCisgICAgIHdpZHRoPSIzMjUuMjMyMDMiCisgICAgIGhlaWdodD0iMzU0LjMzMDcyIgorICAgICB4PSIxNy43MTY1MzYiCisgICAgIHk9IjM3Mi4wNDcyNCIgLz4KKyAgPHRleHQKKyAgICAgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIKKyAgICAgc3R5bGU9ImZvbnQtc2l6ZToxOC4wMDAwMDA7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpib2xkO2ZvbnQtc3RyZXRjaDpub3JtYWw7ZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxLjAwMDAwMDA7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMHB0O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEuMDAwMDAwMDtmb250LWZhbWlseTpCaXRzdHJlYW0gVmVyYSBTYW5zO3RleHQtYW5jaG9yOnN0YXJ0O3dyaXRpbmctbW9kZTpscjsiCisgICAgIHg9IjcwLjc3ODI1MiIKKyAgICAgeT0iNzEyLjczOTIwIgorICAgICBpZD0idGV4dDE1MzIiCisgICAgIHNvZGlwb2RpOmxpbmVzcGFjaW5nPSIxMDAlIj48dHNwYW4KKyAgICAgICBpZD0idHNwYW4xNTMzIj5BcHBsaWNhdGlvbiBQcm9jZXNzIDE8L3RzcGFuPjwvdGV4dD4KKyAgPHJlY3QKKyAgICAgc3R5bGU9ImZpbGw6bm9uZTtmaWxsLW9wYWNpdHk6MC43NTAwMDAwMDtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6Mi41MDAwMDAwO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQuMDAwMDAwMDtzdHJva2UtZGFzaGFycmF5OjIuNTAwMDAwMCAyLjUwMDAwMDAgO3N0cm9rZS1kYXNob2Zmc2V0OjAuMDAwMDAwMDtzdHJva2Utb3BhY2l0eToxLjAwMDAwMDA7IgorICAgICBpZD0icmVjdDE1MzUiCisgICAgIHdpZHRoPSIxNDguNDYyNTkiCisgICAgIGhlaWdodD0iNDYuNjU2ODQ5IgorICAgICB4PSIxMDYuMjk5MjEiCisgICAgIHk9IjM3OC41NDAwMSIgLz4KKyAgPHRleHQKKyAgICAgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIKKyAgICAgc3R5bGU9ImZvbnQtc2l6ZToxNC4wMDAwMDA7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zdHJldGNoOm5vcm1hbDtmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjEuMDAwMDAwMDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS4wMDAwMDAwcHQ7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwO2ZvbnQtZmFtaWx5OkJpdHN0cmVhbSBWZXJhIFNhbnM7dGV4dC1hbmNob3I6bWlkZGxlO3dyaXRpbmctbW9kZTpscjsiCisgICAgIHg9IjE4MC42MTM4OSIKKyAgICAgeT0iNDAwLjQwMDQ4IgorICAgICBpZD0idGV4dDIxNTgiCisgICAgIHNvZGlwb2RpOmxpbmVzcGFjaW5nPSIxMDAlIj48dHNwYW4KKyAgICAgICBpZD0idHNwYW4yMTU5Ij5EQnVzQ29ubmVjdGlvbjwvdHNwYW4+PHRzcGFuCisgICAgICAgc29kaXBvZGk6cm9sZT0ibGluZSIKKyAgICAgICBpZD0idHNwYW4yMTYxIgorICAgICAgIHg9IjE4MC42MTM4OSIKKyAgICAgICB5PSI0MTQuNDAwNDgiPkluc3RhbmNlPC90c3Bhbj48L3RleHQ+CisgIDxyZWN0CisgICAgIHN0eWxlPSJmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjAuNzUwMDAwMDA7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjIuOTk1MDkyOTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0LjAwMDAwMDA7c3Ryb2tlLWRhc2hhcnJheToyLjk5NTA5MjggMi45OTUwOTI4IDtzdHJva2UtZGFzaG9mZnNldDowLjAwMDAwMDA7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwOyIKKyAgICAgaWQ9InJlY3QyMTcwIgorICAgICB3aWR0aD0iMTQ4LjQ2MjU5IgorICAgICBoZWlnaHQ9IjY2Ljk2NjI0MCIKKyAgICAgeD0iMjguNzAyNzY4IgorICAgICB5PSI1NDkuMjEyNTkiIC8+CisgIDx0ZXh0CisgICAgIHhtbDpzcGFjZT0icHJlc2VydmUiCisgICAgIHN0eWxlPSJmb250LXNpemU6MTQuMDAwMDAwO2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtdmFyaWFudDpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc3RyZXRjaDpub3JtYWw7ZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxLjAwMDAwMDA7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMHB0O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEuMDAwMDAwMDtmb250LWZhbWlseTpCaXRzdHJlYW0gVmVyYSBTYW5zO3RleHQtYW5jaG9yOm1pZGRsZTt3cml0aW5nLW1vZGU6bHI7IgorICAgICB4PSIxMDMuMDE3NDUiCisgICAgIHk9IjU3Ny41NjU4NiIKKyAgICAgaWQ9InRleHQyMTcxIgorICAgICBzb2RpcG9kaTpsaW5lc3BhY2luZz0iMTAwJSI+PHRzcGFuCisgICAgICAgeD0iMTAzLjAxNzQ1IgorICAgICAgIHk9IjU3Ny41NjU4NiIKKyAgICAgICBzb2RpcG9kaTpyb2xlPSJsaW5lIgorICAgICAgIGlkPSJ0c3BhbjIxNzYiPkMvQysrL1B5dGhvbi9ldGMuPC90c3Bhbj48dHNwYW4KKyAgICAgICB4PSIxMDMuMDE3NDUiCisgICAgICAgeT0iNTkxLjU2NTg2IgorICAgICAgIHNvZGlwb2RpOnJvbGU9ImxpbmUiCisgICAgICAgaWQ9InRzcGFuMjE3OCI+T2JqZWN0IEluc3RhbmNlPC90c3Bhbj48L3RleHQ+CisgIDxwYXRoCisgICAgIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjEuMDAwMDAwMDtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS4wMDAwMDAwcHQ7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwOyIKKyAgICAgaWQ9InBhdGgzNTM1IgorICAgICBkPSJNIDk4LjkzODk1Miw0MDguNjE0NzkgQyA5OC43NDQ3NTMsNDA5LjIwMzAzIDk3LjkxNzg4Niw0MDkuNjcyOTUgOTcuNDQwOTQ1LDQxMC4xMTQzNSBDIDk1LjUzNDk0Nyw0MTEuOTQ3NjMgOTQuMjY2OTM0LDQxNC4xMTU1NSA5My4xNzI2MTQsNDE2LjMzODU4IEMgOTEuOTAyMDU2LDQxOS4wMjcyNSA5MC45NjkyODEsNDIxLjc5OTQ0IDkwLjEwNzI1Miw0MjQuNTkyMjkgQyA4OS41ODkxMDUsNDI2LjI3Mzc0IDg4Ljk4MzUzNCw0MjcuOTA2MzQgODguMjY2OTA3LDQyOS41MzcwMCBDIDg3LjkxOTY2Nyw0MzAuMzM0MzggODcuNjIyNTkzLDQzMS4xNzU5OCA4Ny4xMjA0NjQsNDMxLjkxOTcwIEMgODYuODMyMjIyLDQzMi4zMDY2NSA4Ni40Njk0MjIsNDMyLjY1MTQ1IDg2LjE2Nzk4NSw0MzMuMDMxODQgQyA4Ni4wMTU5MzEsNDMzLjIyMjU0IDg1Ljg2ODk5Nyw0MzMuNDE1NjMgODUuNzIyMTMxLDQzMy42MDg5OCBMIDgyLjkxNDMzNiw0MzMuMTE3NDMgQyA4My4wNjM0MDIsNDMyLjkxODc5IDgzLjIxMzQyOCw0MzIuNzIwNjkgODMuMzY4MTIxLDQzMi41MjQ5OCBDIDgzLjY1NDY4MSw0MzIuMTUzMDggODMuOTgwNzM3LDQzMS44MDgzNCA4NC4yODUzODksNDMxLjQ0NzMxIEMgODQuODExOTU3LDQzMC43NzE3NSA4NS4xMjI1MjMsNDI5Ljk3OTE0IDg1LjQ4MjQwMCw0MjkuMjM4NzIgQyA4Ni4yNTMwNTYsNDI3LjY0OTI5IDg2LjkwMzA4NCw0MjYuMDM4NjEgODcuNDc0NTc4LDQyNC4zOTMyMSBDIDg4LjQzOTU0OCw0MjEuNTg1NTIgODkuNDQyODQzLDQxOC43ODc5MiA5MC43MDM5MzgsNDE2LjA1ODk4IEMgOTEuODEwOTY2LDQxMy43NzUyNSA5Mi45OTkxOTEsNDExLjQ1OTYxIDk0Ljg0OTQ2NCw0MDkuNTA3NDggQyA5NS4wOTQ3MDQsNDA5LjI0ODc2IDk2LjA5MTc4OSw0MDcuOTAxNDkgOTUuODY1NzM3LDQwOC42MTQ3OSBMIDk4LjkzODk1Miw0MDguNjE0NzkgeiAiIC8+CisgIDx0ZXh0CisgICAgIHhtbDpzcGFjZT0icHJlc2VydmUiCisgICAgIHN0eWxlPSJmb250LXNpemU6MTIuMDAwMDAwO2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjEuMDAwMDAwMDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS4wMDAwMDAwcHQ7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwO2ZvbnQtZmFtaWx5OkJpdHN0cmVhbSBWZXJhIFNhbnM7IgorICAgICB4PSIzNC4xMDk0OTciCisgICAgIHk9IjQ0Ni4xMzM4MiIKKyAgICAgaWQ9InRleHQzNTM2Ij48dHNwYW4KKyAgICAgICBpZD0idHNwYW4zNTM3Ij5Mb2NhdGUgT2JqZWN0PC90c3Bhbj48dHNwYW4KKyAgICAgICBzb2RpcG9kaTpyb2xlPSJsaW5lIgorICAgICAgIGlkPSJ0c3BhbjM1MzkiCisgICAgICAgeD0iMzQuMTA5NDk3IgorICAgICAgIHk9IjQ1OC4xMzM4MiI+dmlhIE9iamVjdCBQYXRoPC90c3Bhbj48L3RleHQ+CisgIDxwYXRoCisgICAgIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjEuMDAwMDAwMDtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS4wMDAwMDAwcHQ7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwOyIKKyAgICAgaWQ9InBhdGgzNTQxIgorICAgICBkPSJNIDYwLjUwOTg2Nyw0NjIuNzg3NjcgQyA2MC43MDQwNjYsNDYzLjM3NTkxIDYxLjUzMDkzMyw0NjMuODQ1ODMgNjIuMDA3ODc0LDQ2NC4yODcyMyBDIDYzLjkxMzg3Miw0NjYuMTIwNTEgNjUuMTgxODg1LDQ2OC4yODg0MyA2Ni4yNzYyMDUsNDcwLjUxMTQ2IEMgNjcuNTQ2NzYzLDQ3My4yMDAxMyA2OC40Nzk1MzgsNDc1Ljk3MjMyIDY5LjM0MTU2Nyw0NzguNzY1MTcgQyA2OS44NTk3MTQsNDgwLjQ0NjYyIDcwLjQ2NTI4NSw0ODIuMDc5MjIgNzEuMTgxOTEyLDQ4My43MDk4OCBDIDcxLjUyOTE1Miw0ODQuNTA3MjYgNzEuODI2MjI2LDQ4NS4zNDg4NiA3Mi4zMjgzNTUsNDg2LjA5MjU4IEMgNzIuNjE2NTk3LDQ4Ni40Nzk1MyA3Mi45NzkzOTcsNDg2LjgyNDMzIDczLjI4MDgzNCw0ODcuMjA0NzIgQyA3My40MzI4ODgsNDg3LjM5NTQyIDczLjU3OTgyMiw0ODcuNTg4NTEgNzMuNzI2Njg4LDQ4Ny43ODE4NiBMIDc2LjUzNDQ4Myw0ODcuMjkwMzEgQyA3Ni4zODU0MTcsNDg3LjA5MTY3IDc2LjIzNTM5MSw0ODYuODkzNTcgNzYuMDgwNjk4LDQ4Ni42OTc4NiBDIDc1Ljc5NDEzOCw0ODYuMzI1OTYgNzUuNDY4MDgyLDQ4NS45ODEyMiA3NS4xNjM0MzAsNDg1LjYyMDE5IEMgNzQuNjM2ODYyLDQ4NC45NDQ2MyA3NC4zMjYyOTYsNDg0LjE1MjAyIDczLjk2NjQxOSw0ODMuNDExNjAgQyA3My4xOTU3NjMsNDgxLjgyMjE3IDcyLjU0NTczNSw0ODAuMjExNDkgNzEuOTc0MjQxLDQ3OC41NjYwOSBDIDcxLjAwOTI3MSw0NzUuNzU4NDAgNzAuMDA1OTc2LDQ3Mi45NjA4MCA2OC43NDQ4ODEsNDcwLjIzMTg2IEMgNjcuNjM3ODUzLDQ2Ny45NDgxMyA2Ni40NDk2MjgsNDY1LjYzMjQ5IDY0LjU5OTM1NSw0NjMuNjgwMzYgQyA2NC4zNTQxMTUsNDYzLjQyMTY0IDYzLjM1NzAzMCw0NjIuMDc0MzcgNjMuNTgzMDgyLDQ2Mi43ODc2NyBMIDYwLjUwOTg2Nyw0NjIuNzg3NjcgeiAiIC8+CisgIDx0ZXh0CisgICAgIHhtbDpzcGFjZT0icHJlc2VydmUiCisgICAgIHN0eWxlPSJmb250LXNpemU6MTIuMDAwMDAwO2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtdmFyaWFudDpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc3RyZXRjaDpub3JtYWw7ZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxLjAwMDAwMDA7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMHB0O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEuMDAwMDAwMDtmb250LWZhbWlseTpCaXRzdHJlYW0gVmVyYSBTYW5zO3RleHQtYW5jaG9yOnN0YXJ0O3dyaXRpbmctbW9kZTpscjsiCisgICAgIHg9IjQ5LjEwMDMxNSIKKyAgICAgeT0iNTAxLjYwOTU5IgorICAgICBpZD0idGV4dDM1NDIiCisgICAgIHNvZGlwb2RpOmxpbmVzcGFjaW5nPSIxMDAlIj48dHNwYW4KKyAgICAgICB4PSI0OS4xMDAzMTUiCisgICAgICAgeT0iNTAxLjYwOTU5IgorICAgICAgIHNvZGlwb2RpOnJvbGU9ImxpbmUiCisgICAgICAgaWQ9InRzcGFuMzU0NyI+QmluZGluZ3MgTWFyc2hhbDwvdHNwYW4+PHRzcGFuCisgICAgICAgeD0iNDkuMTAwMzE1IgorICAgICAgIHk9IjUxMy42MDk1OSIKKyAgICAgICBzb2RpcG9kaTpyb2xlPSJsaW5lIgorICAgICAgIGlkPSJ0c3BhbjM1NDkiPnRvIE1ldGhvZCBDYWxsPC90c3Bhbj48L3RleHQ+CisgIDxwYXRoCisgICAgIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjEuMDAwMDAwMDtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS4wMDAwMDAwcHQ7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwOyIKKyAgICAgaWQ9InBhdGgzNTUxIgorICAgICBkPSJNIDk1LjI5NTIzOSw1MTkuNDMyMTEgQyA5NS4xMDEwMzksNTIwLjAyMDM1IDk0LjI3NDE2OSw1MjAuNDkwMjcgOTMuNzk3MjI5LDUyMC45MzE2NyBDIDkxLjg5MTIzOSw1MjIuNzY0OTUgOTAuNjIzMjE5LDUyNC45MzI4NyA4OS41Mjg4OTksNTI3LjE1NTkwIEMgODguMjU4MzM5LDUyOS44NDQ1NyA4Ny4zMjU1NjksNTMyLjYxNjc2IDg2LjQ2MzUzOSw1MzUuNDA5NjEgQyA4NS45NDUzODksNTM3LjA5MTA2IDg1LjMzOTgxOSw1MzguNzIzNjYgODQuNjIzMTk5LDU0MC4zNTQzMiBDIDg0LjI3NTk1OSw1NDEuMTUxNzAgODMuOTc4ODc5LDU0MS45OTMzMCA4My40NzY3NDksNTQyLjczNzAyIEMgODMuMTg4NTA5LDU0My4xMjM5NyA4Mi44MjU3MDksNTQzLjQ2ODc3IDgyLjUyNDI2OSw1NDMuODQ5MTYgQyA4Mi4zNzIyMTksNTQ0LjAzOTg2IDgyLjIyNTI4OSw1NDQuMjMyOTUgODIuMDc4NDE5LDU0NC40MjYzMCBMIDc5LjI3MDYxOSw1NDMuOTM0NzUgQyA3OS40MTk2ODksNTQzLjczNjExIDc5LjU2OTcxOSw1NDMuNTM4MDEgNzkuNzI0NDA5LDU0My4zNDIzMCBDIDgwLjAxMDk2OSw1NDIuOTcwNDAgODAuMzM3MDI5LDU0Mi42MjU2NiA4MC42NDE2NzksNTQyLjI2NDYzIEMgODEuMTY4MjQ5LDU0MS41ODkwNyA4MS40Nzg4MDksNTQwLjc5NjQ2IDgxLjgzODY4OSw1NDAuMDU2MDQgQyA4Mi42MDkzMzksNTM4LjQ2NjYxIDgzLjI1OTM2OSw1MzYuODU1OTMgODMuODMwODY5LDUzNS4yMTA1MyBDIDg0Ljc5NTgzOSw1MzIuNDAyODQgODUuNzk5MTI5LDUyOS42MDUyNCA4Ny4wNjAyMjksNTI2Ljg3NjMwIEMgODguMTY3MjQ5LDUyNC41OTI1NyA4OS4zNTU0NzksNTIyLjI3NjkzIDkxLjIwNTc0OSw1MjAuMzI0ODAgQyA5MS40NTA5ODksNTIwLjA2NjA4IDkyLjQ0ODA3OSw1MTguNzE4ODEgOTIuMjIyMDI5LDUxOS40MzIxMSBMIDk1LjI5NTIzOSw1MTkuNDMyMTEgeiAiIC8+CisgIDxwYXRoCisgICAgIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjEuMDAwMDAwMDtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS4wMDAwMDAwcHQ7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwOyIKKyAgICAgaWQ9InBhdGgzNTUyIgorICAgICBkPSJNIDI2MS44MzUzMyw0MDguNjE0NzkgQyAyNjIuMDI5NTMsNDA5LjIwMzAzIDI2Mi44NTY0MCw0MDkuNjcyOTUgMjYzLjMzMzM0LDQxMC4xMTQzNSBDIDI2NS4yMzkzNCw0MTEuOTQ3NjMgMjY2LjUwNzM1LDQxNC4xMTU1NSAyNjcuNjAxNjcsNDE2LjMzODU4IEMgMjY4Ljg3MjIzLDQxOS4wMjcyNSAyNjkuODA1MDEsNDIxLjc5OTQ0IDI3MC42NjcwMyw0MjQuNTkyMjkgQyAyNzEuMTg1MTgsNDI2LjI3Mzc0IDI3MS43OTA3NSw0MjcuOTA2MzQgMjcyLjUwNzM4LDQyOS41MzcwMCBDIDI3Mi44NTQ2Miw0MzAuMzM0MzggMjczLjE1MTY5LDQzMS4xNzU5OCAyNzMuNjUzODIsNDMxLjkxOTcwIEMgMjczLjk0MjA2LDQzMi4zMDY2NSAyNzQuMzA0ODYsNDMyLjY1MTQ1IDI3NC42MDYzMCw0MzMuMDMxODQgQyAyNzQuNzU4MzYsNDMzLjIyMjU0IDI3NC45MDUyOSw0MzMuNDE1NjMgMjc1LjA1MjE2LDQzMy42MDg5OCBMIDI3Ny44NTk5NSw0MzMuMTE3NDMgQyAyNzcuNzEwODgsNDMyLjkxODc5IDI3Ny41NjA4Niw0MzIuNzIwNjkgMjc3LjQwNjE3LDQzMi41MjQ5OCBDIDI3Ny4xMTk2MSw0MzIuMTUzMDggMjc2Ljc5MzU1LDQzMS44MDgzNCAyNzYuNDg4OTAsNDMxLjQ0NzMxIEMgMjc1Ljk2MjMzLDQzMC43NzE3NSAyNzUuNjUxNzYsNDI5Ljk3OTE0IDI3NS4yOTE4OSw0MjkuMjM4NzIgQyAyNzQuNTIxMjMsNDI3LjY0OTI5IDI3My44NzEyMCw0MjYuMDM4NjEgMjczLjI5OTcxLDQyNC4zOTMyMSBDIDI3Mi4zMzQ3NCw0MjEuNTg1NTIgMjcxLjMzMTQ0LDQxOC43ODc5MiAyNzAuMDcwMzUsNDE2LjA1ODk4IEMgMjY4Ljk2MzMyLDQxMy43NzUyNSAyNjcuNzc1MTAsNDExLjQ1OTYxIDI2NS45MjQ4Miw0MDkuNTA3NDggQyAyNjUuNjc5NTgsNDA5LjI0ODc2IDI2NC42ODI1MCw0MDcuOTAxNDkgMjY0LjkwODU1LDQwOC42MTQ3OSBMIDI2MS44MzUzMyw0MDguNjE0NzkgeiAiIC8+CisgIDx0ZXh0CisgICAgIHhtbDpzcGFjZT0icHJlc2VydmUiCisgICAgIHN0eWxlPSJmb250LXNpemU6MTIuMDAwMDAwO2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtdmFyaWFudDpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc3RyZXRjaDpub3JtYWw7ZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxLjAwMDAwMDA7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMHB0O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEuMDAwMDAwMDtmb250LWZhbWlseTpCaXRzdHJlYW0gVmVyYSBTYW5zO3RleHQtYW5jaG9yOnN0YXJ0O3dyaXRpbmctbW9kZTpscjsiCisgICAgIHg9IjIyMy45ODc0OSIKKyAgICAgeT0iNDQ2LjEzMzgyIgorICAgICBpZD0idGV4dDM1NTMiCisgICAgIHNvZGlwb2RpOmxpbmVzcGFjaW5nPSIxMDAlIj48dHNwYW4KKyAgICAgICB4PSIyMjMuOTg3NDkiCisgICAgICAgeT0iNDQ2LjEzMzgyIgorICAgICAgIHNvZGlwb2RpOnJvbGU9ImxpbmUiCisgICAgICAgaWQ9InRzcGFuMzU2MiI+TWFyc2hhbCBNZXRob2Q8L3RzcGFuPjx0c3BhbgorICAgICAgIHg9IjIyMy45ODc0OSIKKyAgICAgICB5PSI0NTguMTMzODIiCisgICAgICAgc29kaXBvZGk6cm9sZT0ibGluZSIKKyAgICAgICBpZD0idHNwYW4zNTY0Ij5DYWxsIHRvIE1lc3NhZ2U8L3RzcGFuPjwvdGV4dD4KKyAgPHBhdGgKKyAgICAgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MS4wMDAwMDAwO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxLjAwMDAwMDBwdDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxLjAwMDAwMDA7IgorICAgICBpZD0icGF0aDM1NjciCisgICAgIGQ9Ik0gMjc4Ljk2NDg1LDQ2My4yOTQ1MyBDIDI3OC43NzA2NSw0NjMuODgyNzcgMjc3Ljk0Mzc4LDQ2NC4zNTI2OSAyNzcuNDY2ODQsNDY0Ljc5NDA5IEMgMjc1LjU2MDg1LDQ2Ni42MjczNyAyNzQuMjkyODMsNDY4Ljc5NTI5IDI3My4xOTg1MSw0NzEuMDE4MzIgQyAyNzEuOTI3OTUsNDczLjcwNjk5IDI3MC45OTUxOCw0NzYuNDc5MTggMjcwLjEzMzE1LDQ3OS4yNzIwMyBDIDI2OS42MTUwMCw0ODAuOTUzNDggMjY5LjAwOTQzLDQ4Mi41ODYwOCAyNjguMjkyODEsNDg0LjIxNjc0IEMgMjY3Ljk0NTU3LDQ4NS4wMTQxMiAyNjcuNjQ4NDksNDg1Ljg1NTcyIDI2Ny4xNDYzNiw0ODYuNTk5NDQgQyAyNjYuODU4MTIsNDg2Ljk4NjM5IDI2Ni40OTUzMiw0ODcuMzMxMTkgMjY2LjE5Mzg4LDQ4Ny43MTE1OCBDIDI2Ni4wNDE4Myw0ODcuOTAyMjggMjY1Ljg5NDkwLDQ4OC4wOTUzNyAyNjUuNzQ4MDMsNDg4LjI4ODcyIEwgMjYyLjk0MDIzLDQ4Ny43OTcxNyBDIDI2My4wODkzMCw0ODcuNTk4NTMgMjYzLjIzOTMzLDQ4Ny40MDA0MyAyNjMuMzk0MDIsNDg3LjIwNDcyIEMgMjYzLjY4MDU4LDQ4Ni44MzI4MiAyNjQuMDA2NjQsNDg2LjQ4ODA4IDI2NC4zMTEyOSw0ODYuMTI3MDUgQyAyNjQuODM3ODYsNDg1LjQ1MTQ5IDI2NS4xNDg0Miw0ODQuNjU4ODggMjY1LjUwODMwLDQ4My45MTg0NiBDIDI2Ni4yNzg5NSw0ODIuMzI5MDMgMjY2LjkyODk4LDQ4MC43MTgzNSAyNjcuNTAwNDgsNDc5LjA3Mjk1IEMgMjY4LjQ2NTQ1LDQ3Ni4yNjUyNiAyNjkuNDY4NzQsNDczLjQ2NzY2IDI3MC43Mjk4NCw0NzAuNzM4NzIgQyAyNzEuODM2ODYsNDY4LjQ1NDk5IDI3My4wMjUwOSw0NjYuMTM5MzUgMjc0Ljg3NTM2LDQ2NC4xODcyMiBDIDI3NS4xMjA2MCw0NjMuOTI4NTAgMjc2LjExNzY5LDQ2Mi41ODEyMyAyNzUuODkxNjQsNDYzLjI5NDUzIEwgMjc4Ljk2NDg1LDQ2My4yOTQ1MyB6ICIgLz4KKyAgPHJlY3QKKyAgICAgc3R5bGU9ImZpbGw6bm9uZTtmaWxsLW9wYWNpdHk6MC43NTAwMDAwMDtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6Mi43Mzc3MDg2O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQuMDAwMDAwMDtzdHJva2UtZGFzaGFycmF5OjIuNzM3NzA4NCAyLjczNzcwODQgO3N0cm9rZS1kYXNob2Zmc2V0OjAuMDAwMDAwMDtzdHJva2Utb3BhY2l0eToxLjAwMDAwMDA7IgorICAgICBpZD0icmVjdDM1NjgiCisgICAgIHdpZHRoPSIxMjQuMDE3NDYiCisgICAgIGhlaWdodD0iNjYuOTc5ODEzIgorICAgICB4PSIxODkuNzkyNjUiCisgICAgIHk9IjQ5NS4wODkwMiIgLz4KKyAgPHRleHQKKyAgICAgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIKKyAgICAgc3R5bGU9ImZvbnQtc2l6ZToxNC4wMDAwMDA7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zdHJldGNoOm5vcm1hbDtmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjEuMDAwMDAwMDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS4wMDAwMDAwcHQ7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwO2ZvbnQtZmFtaWx5OkJpdHN0cmVhbSBWZXJhIFNhbnM7dGV4dC1hbmNob3I6bWlkZGxlO3dyaXRpbmctbW9kZTpscjsiCisgICAgIHg9IjI0OC45NDA0OSIKKyAgICAgeT0iNTIzLjQ0MjIwIgorICAgICBpZD0idGV4dDM1NjkiCisgICAgIHNvZGlwb2RpOmxpbmVzcGFjaW5nPSIxMDAlIj48dHNwYW4KKyAgICAgICB4PSIyNDguOTQwNDkiCisgICAgICAgeT0iNTIzLjQ0MjIwIgorICAgICAgIHNvZGlwb2RpOnJvbGU9ImxpbmUiCisgICAgICAgaWQ9InRzcGFuMzU3NCI+QmluZGluZ3MgUHJveHk8L3RzcGFuPjx0c3BhbgorICAgICAgIHg9IjI0OC45NDA0OSIKKyAgICAgICB5PSI1MzcuNDQyMjAiCisgICAgICAgc29kaXBvZGk6cm9sZT0ibGluZSIKKyAgICAgICBpZD0idHNwYW4zNTc2Ij5PYmplY3QgSW5zdGFuY2U8L3RzcGFuPjwvdGV4dD4KKyAgPHBhdGgKKyAgICAgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MS4wMDAwMDAwO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxLjAwMDAwMDBwdDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxLjAwMDAwMDA7IgorICAgICBpZD0icGF0aDM1NzgiCisgICAgIGQ9Ik0gMjU5LjAzNTQ3LDU2Ni45MjkxMyBDIDI1OS4yMjk2Nyw1NjcuNTE3MzcgMjYwLjA1NjUzLDU2Ny45ODcyOSAyNjAuNTMzNDgsNTY4LjQyODY5IEMgMjYyLjQzOTQ3LDU3MC4yNjE5NyAyNjMuNzA3NDksNTcyLjQyOTg5IDI2NC44MDE4MSw1NzQuNjUyOTIgQyAyNjYuMDcyMzYsNTc3LjM0MTU5IDI2Ny4wMDUxNCw1ODAuMTEzNzggMjY3Ljg2NzE3LDU4Mi45MDY2MyBDIDI2OC4zODUzMiw1ODQuNTg4MDggMjY4Ljk5MDg5LDU4Ni4yMjA2OCAyNjkuNzA3NTEsNTg3Ljg1MTM0IEMgMjcwLjA1NDc1LDU4OC42NDg3MiAyNzAuMzUxODMsNTg5LjQ5MDMyIDI3MC44NTM5Niw1OTAuMjM0MDQgQyAyNzEuMTQyMjAsNTkwLjYyMDk5IDI3MS41MDUwMCw1OTAuOTY1NzkgMjcxLjgwNjQ0LDU5MS4zNDYxOCBDIDI3MS45NTg0OSw1OTEuNTM2ODggMjcyLjEwNTQyLDU5MS43Mjk5NyAyNzIuMjUyMjksNTkxLjkyMzMyIEwgMjc1LjA2MDA4LDU5MS40MzE3NyBDIDI3NC45MTEwMiw1OTEuMjMzMTMgMjc0Ljc2MDk5LDU5MS4wMzUwMyAyNzQuNjA2MzAsNTkwLjgzOTMyIEMgMjc0LjMxOTc0LDU5MC40Njc0MiAyNzMuOTkzNjgsNTkwLjEyMjY4IDI3My42ODkwMyw1ODkuNzYxNjUgQyAyNzMuMTYyNDYsNTg5LjA4NjA5IDI3Mi44NTE5MCw1ODguMjkzNDggMjcyLjQ5MjAyLDU4Ny41NTMwNiBDIDI3MS43MjEzNiw1ODUuOTYzNjMgMjcxLjA3MTM0LDU4NC4zNTI5NSAyNzAuNDk5ODQsNTgyLjcwNzU1IEMgMjY5LjUzNDg3LDU3OS44OTk4NiAyNjguNTMxNTgsNTc3LjEwMjI2IDI2Ny4yNzA0OCw1NzQuMzczMzIgQyAyNjYuMTYzNDUsNTcyLjA4OTU5IDI2NC45NzUyMyw1NjkuNzczOTUgMjYzLjEyNDk2LDU2Ny44MjE4MiBDIDI2Mi44Nzk3Miw1NjcuNTYzMTAgMjYxLjg4MjYzLDU2Ni4yMTU4MyAyNjIuMTA4NjgsNTY2LjkyOTEzIEwgMjU5LjAzNTQ3LDU2Ni45MjkxMyB6ICIgLz4KKyAgPHRleHQKKyAgICAgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIKKyAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMi4wMDAwMDA7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zdHJldGNoOm5vcm1hbDtmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjEuMDAwMDAwMDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS4wMDAwMDAwcHQ7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwO2ZvbnQtZmFtaWx5OkJpdHN0cmVhbSBWZXJhIFNhbnM7dGV4dC1hbmNob3I6c3RhcnQ7d3JpdGluZy1tb2RlOmxyOyIKKyAgICAgeD0iMjE3LjQwNzQxIgorICAgICB5PSI2MDcuOTA4ODEiCisgICAgIGlkPSJ0ZXh0MzU3OSIKKyAgICAgc29kaXBvZGk6bGluZXNwYWNpbmc9IjEwMCUiPjx0c3BhbgorICAgICAgIHg9IjIxNy40MDc0MSIKKyAgICAgICB5PSI2MDcuOTA4ODEiCisgICAgICAgc29kaXBvZGk6cm9sZT0ibGluZSIKKyAgICAgICBpZD0idHNwYW4zNTg0Ij5BcHBsaWNhdGlvbiBDb2RlPC90c3Bhbj48L3RleHQ+CisgIDxwYXRoCisgICAgIHN0eWxlPSJmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjAuNzUwMDAwMDA7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuOTYxNzIwMjhwdDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxLjAwMDAwMDA7bWFya2VyLWVuZDp1cmwoI0Fycm93MU0pOyIKKyAgICAgZD0iTSAyNi41NzQ4MDMsNDA4LjYwMDA5IEMgMjYuNTc0ODAzLDUzOS42ODkxMiAyNi41NzQ4MDMsNTM5LjY4OTExIDI2LjU3NDgwMyw1MzEuNDk2MDYiCisgICAgIGlkPSJwYXRoMzU4NiIKKyAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KKyAgPHRleHQKKyAgICAgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIKKyAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMi4wMDAwMDA7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpib2xkO2ZvbnQtc3RyZXRjaDpub3JtYWw7ZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxLjAwMDAwMDA7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMHB0O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEuMDAwMDAwMDtmb250LWZhbWlseTpCaXRzdHJlYW0gVmVyYSBTYW5zO3RleHQtYW5jaG9yOnN0YXJ0O3dyaXRpbmctbW9kZTpscjsiCisgICAgIHg9IjI1Ljk3NzE0NiIKKyAgICAgeT0iMzg2LjQ1MjEyIgorICAgICBpZD0idGV4dDQyMjAiCisgICAgIHNvZGlwb2RpOmxpbmVzcGFjaW5nPSIxMDAlIj48dHNwYW4KKyAgICAgICBpZD0idHNwYW40MjIxIj5JbmNvbWluZzwvdHNwYW4+PHRzcGFuCisgICAgICAgc29kaXBvZGk6cm9sZT0ibGluZSIKKyAgICAgICBpZD0idHNwYW40MjIzIgorICAgICAgIHg9IjI1Ljk3NzE0NiIKKyAgICAgICB5PSIzOTguNDUyMTIiPkNhbGw8L3RzcGFuPjwvdGV4dD4KKyAgPHRleHQKKyAgICAgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIKKyAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMi4wMDAwMDA7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpib2xkO2ZvbnQtc3RyZXRjaDpub3JtYWw7ZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxLjAwMDAwMDA7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMHB0O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEuMDAwMDAwMDtmb250LWZhbWlseTpCaXRzdHJlYW0gVmVyYSBTYW5zO3RleHQtYW5jaG9yOmVuZDt3cml0aW5nLW1vZGU6bHI7IgorICAgICB4PSIzMzUuNjE0MTEiCisgICAgIHk9IjM4Ni40NTIxMiIKKyAgICAgaWQ9InRleHQ0MjI2IgorICAgICBzb2RpcG9kaTpsaW5lc3BhY2luZz0iMTAwJSI+PHRzcGFuCisgICAgICAgeD0iMzM1LjYxNDExIgorICAgICAgIHk9IjM4Ni40NTIxMiIKKyAgICAgICBzb2RpcG9kaTpyb2xlPSJsaW5lIgorICAgICAgIGlkPSJ0c3BhbjQyMzEiPk91dGdvaW5nPC90c3Bhbj48dHNwYW4KKyAgICAgICB4PSIzMzUuNjE0MTEiCisgICAgICAgeT0iMzk4LjQ1MjEyIgorICAgICAgIHNvZGlwb2RpOnJvbGU9ImxpbmUiCisgICAgICAgaWQ9InRzcGFuNDIzMyI+Q2FsbDwvdHNwYW4+PC90ZXh0PgorICA8cGF0aAorICAgICBzdHlsZT0iZmlsbDpub25lO2ZpbGwtb3BhY2l0eTowLjc1MDAwMDAwO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjk2MTcyMDI4cHQ7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwO21hcmtlci1zdGFydDp1cmwoI0Fycm93MU0pO21hcmtlci1lbmQ6bm9uZTsiCisgICAgIGQ9Ik0gMzI3Ljc1NTkxLDQxNi4zMzg1OCBDIDMyNy43NTU5MSw1NDcuNDI3NjEgMzI3Ljc1NTkxLDU0Ny40Mjc2MCAzMjcuNzU1OTEsNTM5LjIzNDU1IgorICAgICBpZD0icGF0aDQyMzYiCisgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+CisgIDxyZWN0CisgICAgIHN0eWxlPSJmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjAuNzUwMDAwMDA7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjUuNzkxNDMxMDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0LjAwMDAwMDA7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwOyIKKyAgICAgaWQ9InJlY3Q0ODcwIgorICAgICB3aWR0aD0iODg1Ljg2NTkxIgorICAgICBoZWlnaHQ9IjMxMC4yNzI1MiIKKyAgICAgeD0iODguNTgyNjgwIgorICAgICB5PSI4Ljg1ODI2MjEiIC8+CisgIDx0ZXh0CisgICAgIHhtbDpzcGFjZT0icHJlc2VydmUiCisgICAgIHN0eWxlPSJmb250LXNpemU6MTguMDAwMDAwO2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtdmFyaWFudDpub3JtYWw7Zm9udC13ZWlnaHQ6Ym9sZDtmb250LXN0cmV0Y2g6bm9ybWFsO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MS4wMDAwMDAwO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxLjAwMDAwMDBwdDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxLjAwMDAwMDA7Zm9udC1mYW1pbHk6Qml0c3RyZWFtIFZlcmEgU2Fuczt0ZXh0LWFuY2hvcjptaWRkbGU7d3JpdGluZy1tb2RlOmxyOyIKKyAgICAgeD0iNTE1LjQyNzM3IgorICAgICB5PSIzMDUuNDQ0ODkiCisgICAgIGlkPSJ0ZXh0NDg3MSIKKyAgICAgc29kaXBvZGk6bGluZXNwYWNpbmc9IjEwMCUiPjx0c3BhbgorICAgICAgIHg9IjUxNS40MjczNyIKKyAgICAgICB5PSIzMDUuNDQ0ODkiCisgICAgICAgc29kaXBvZGk6cm9sZT0ibGluZSIKKyAgICAgICBpZD0idHNwYW40ODc0Ij5CdXMgRGFlbW9uIFByb2Nlc3M8L3RzcGFuPjwvdGV4dD4KKyAgPHJlY3QKKyAgICAgc3R5bGU9ImZpbGw6bm9uZTtmaWxsLW9wYWNpdHk6MC43NTAwMDAwMDtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6My43NTAwMDAwO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQuMDAwMDAwMDtzdHJva2Utb3BhY2l0eToxLjAwMDAwMDA7IgorICAgICBpZD0icmVjdDQ4NzYiCisgICAgIHdpZHRoPSIzMjUuMjMyMDMiCisgICAgIGhlaWdodD0iMzU0LjMzMDcyIgorICAgICB4PSI3MDguNjYxNDQiCisgICAgIHk9IjM3My4wODM1OSIgLz4KKyAgPHRleHQKKyAgICAgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIKKyAgICAgc3R5bGU9ImZvbnQtc2l6ZToxOC4wMDAwMDA7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpib2xkO2ZvbnQtc3RyZXRjaDpub3JtYWw7ZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxLjAwMDAwMDA7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMHB0O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEuMDAwMDAwMDtmb250LWZhbWlseTpCaXRzdHJlYW0gVmVyYSBTYW5zO3RleHQtYW5jaG9yOnN0YXJ0O3dyaXRpbmctbW9kZTpscjsiCisgICAgIHg9Ijc2MS43MjMxNCIKKyAgICAgeT0iNzEzLjc3NTUxIgorICAgICBpZD0idGV4dDQ4NzciCisgICAgIHNvZGlwb2RpOmxpbmVzcGFjaW5nPSIxMDAlIj48dHNwYW4KKyAgICAgICB4PSI3NjEuNzIzMTQiCisgICAgICAgeT0iNzEzLjc3NTUxIgorICAgICAgIHNvZGlwb2RpOnJvbGU9ImxpbmUiCisgICAgICAgaWQ9InRzcGFuNDg4MCI+QXBwbGljYXRpb24gUHJvY2VzcyAyPC90c3Bhbj48L3RleHQ+CisgIDx0ZXh0CisgICAgIHhtbDpzcGFjZT0icHJlc2VydmUiCisgICAgIHN0eWxlPSJmb250LXNpemU6MTIuMDAwMDAwO2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtdmFyaWFudDpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc3RyZXRjaDpub3JtYWw7ZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxLjAwMDAwMDA7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMHB0O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEuMDAwMDAwMDtmb250LWZhbWlseTpCaXRzdHJlYW0gVmVyYSBTYW5zO3RleHQtYW5jaG9yOnN0YXJ0O3dyaXRpbmctbW9kZTpscjsiCisgICAgIHg9IjgyMy40OTY2NCIKKyAgICAgeT0iNTA1LjE4MDE4IgorICAgICBpZD0idGV4dDQ4ODMiCisgICAgIHNvZGlwb2RpOmxpbmVzcGFjaW5nPSIxMDAlIj48dHNwYW4KKyAgICAgICB4PSI4MjMuNDk2NjQiCisgICAgICAgeT0iNTA1LjE4MDE4IgorICAgICAgIHNvZGlwb2RpOnJvbGU9ImxpbmUiCisgICAgICAgaWQ9InRzcGFuNDg4OCI+U2FtZSBTdHVmZiBhcyBpbjwvdHNwYW4+PHRzcGFuCisgICAgICAgeD0iODIzLjQ5NjY0IgorICAgICAgIHk9IjUxNy4xODAxOCIKKyAgICAgICBzb2RpcG9kaTpyb2xlPSJsaW5lIgorICAgICAgIGlkPSJ0c3BhbjQ4OTAiPlByb2Nlc3MgMTwvdHNwYW4+PC90ZXh0PgorICA8dGV4dAorICAgICB4bWw6c3BhY2U9InByZXNlcnZlIgorICAgICBzdHlsZT0iZm9udC1zaXplOjEyLjAwMDAwMDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXN0cmV0Y2g6bm9ybWFsO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MS4wMDAwMDAwO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxLjAwMDAwMDBwdDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxLjAwMDAwMDA7Zm9udC1mYW1pbHk6Qml0c3RyZWFtIFZlcmEgU2Fuczt0ZXh0LWFuY2hvcjpzdGFydDt3cml0aW5nLW1vZGU6bHI7IgorICAgICB4PSI0Ny44OTEwNzEiCisgICAgIHk9IjYzOC4wNTQyMCIKKyAgICAgaWQ9InRleHQ0ODkyIgorICAgICBzb2RpcG9kaTpsaW5lc3BhY2luZz0iMTAwJSI+PHRzcGFuCisgICAgICAgeD0iNDcuODkxMDcxIgorICAgICAgIHk9IjYzOC4wNTQyMCIKKyAgICAgICBzb2RpcG9kaTpyb2xlPSJsaW5lIgorICAgICAgIGlkPSJ0c3BhbjQ5MDEiPihPYmplY3QgSW5zdGFuY2UgSGFzPC90c3Bhbj48dHNwYW4KKyAgICAgICB4PSI0Ny44OTEwNzEiCisgICAgICAgeT0iNjUwLjA1NDIwIgorICAgICAgIHNvZGlwb2RpOnJvbGU9ImxpbmUiCisgICAgICAgaWQ9InRzcGFuNDkwMyI+MSBvciBNb3JlIEludGVyZmFjZXMpPC90c3Bhbj48L3RleHQ+CisgIDxwYXRoCisgICAgIHN0eWxlPSJmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjAuNzUwMDAwMDA7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjEuMjUwMDAwMDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0LjAwMDAwMDA7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwO21hcmtlci1zdGFydDp1cmwoI0Fycm93MU0pO21hcmtlci1lbmQ6dXJsKCNBcnJvdzFNKTtzdHJva2UtZGFzaGFycmF5Om5vbmU7IgorICAgICBkPSJNIDE2Mi41NzI2MCwzNTguMDIwNDEgQyAxNjUuMjUyMTMsMzU0LjYwNTE2IDE4Ni4wMTg1OCwzMjguMTM2ODggMTg0LjAwODkzLDMzMC42OTgzMiIKKyAgICAgaWQ9InBhdGg0OTA1IgorICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgorICA8dGV4dAorICAgICB4bWw6c3BhY2U9InByZXNlcnZlIgorICAgICBzdHlsZT0iZm9udC1zaXplOjEyLjAwMDAwMDtmb250LXN0eWxlOm5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7ZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxLjAwMDAwMDA7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMHB0O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEuMDAwMDAwMDtmb250LWZhbWlseTpCaXRzdHJlYW0gVmVyYSBTYW5zOyIKKyAgICAgeD0iMTkwLjU3MTcwIgorICAgICB5PSIzNDIuNjIwMTgiCisgICAgIGlkPSJ0ZXh0NTUzOSI+PHRzcGFuCisgICAgICAgaWQ9InRzcGFuNTU0MCI+U29ja2V0PC90c3Bhbj48dHNwYW4KKyAgICAgICBzb2RpcG9kaTpyb2xlPSJsaW5lIgorICAgICAgIGlkPSJ0c3BhbjU1NDQiCisgICAgICAgeD0iMTkwLjU3MTcwIgorICAgICAgIHk9IjM1NC42MjAxOCI+KEJpZGlyZWN0aW9uYWwgTWVzc2FnZSBTdHJlYW0pPC90c3Bhbj48L3RleHQ+CisgIDxwYXRoCisgICAgIHN0eWxlPSJmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjAuNzUwMDAwMDA7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjEuMjUwMDAwMDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0LjAwMDAwMDA7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwO21hcmtlci1zdGFydDp1cmwoI0Fycm93MU0pO21hcmtlci1lbmQ6dXJsKCNBcnJvdzFNKTsiCisgICAgIGQ9Ik0gODI3LjUzODc2LDM2My4xODg5NyBDIDgyNC44NTkxNiwzNTkuNzczNzIgODA0LjA5Mjc2LDMzMy4zMDU0NCA4MDYuMTAyMzYsMzM1Ljg2Njg4IgorICAgICBpZD0icGF0aDU1NDYiCisgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+CisgIDx0ZXh0CisgICAgIHhtbDpzcGFjZT0icHJlc2VydmUiCisgICAgIHN0eWxlPSJmb250LXNpemU6MTIuMDAwMDAwO2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjEuMDAwMDAwMDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS4wMDAwMDAwcHQ7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwO2ZvbnQtZmFtaWx5OkJpdHN0cmVhbSBWZXJhIFNhbnM7IgorICAgICB4PSI4NDAuNzkxNTAiCisgICAgIHk9IjM0NS43MzEzNSIKKyAgICAgaWQ9InRleHQ1NTQ3Ij48dHNwYW4KKyAgICAgICBpZD0idHNwYW41NTQ4Ij5Tb2NrZXQ8L3RzcGFuPjx0c3BhbgorICAgICAgIHNvZGlwb2RpOnJvbGU9ImxpbmUiCisgICAgICAgaWQ9InRzcGFuNTU1MCIKKyAgICAgICB4PSI4NDAuNzkxNTAiCisgICAgICAgeT0iMzU3LjczMTM1Ij4oQmlkaXJlY3Rpb25hbCBNZXNzYWdlIFN0cmVhbSk8L3RzcGFuPjwvdGV4dD4KKyAgPHJlY3QKKyAgICAgc3R5bGU9ImZpbGw6bm9uZTtmaWxsLW9wYWNpdHk6MC43NTAwMDAwMDtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6Mi41MDAwMDAwO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQuMDAwMDAwMDtzdHJva2UtZGFzaGFycmF5OjIuNTAwMDAwMCAyLjUwMDAwMDAgO3N0cm9rZS1kYXNob2Zmc2V0OjAuMDAwMDAwMDtzdHJva2Utb3BhY2l0eToxLjAwMDAwMDA7IgorICAgICBpZD0icmVjdDU1NTIiCisgICAgIHdpZHRoPSIxNDguNDYyNTkiCisgICAgIGhlaWdodD0iNDYuNjU2ODQ5IgorICAgICB4PSIxMjQuMDE1NzUiCisgICAgIHk9IjI2My4zODI1MSIgLz4KKyAgPHRleHQKKyAgICAgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIKKyAgICAgc3R5bGU9ImZvbnQtc2l6ZToxNC4wMDAwMDA7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zdHJldGNoOm5vcm1hbDtmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjEuMDAwMDAwMDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS4wMDAwMDAwcHQ7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwO2ZvbnQtZmFtaWx5OkJpdHN0cmVhbSBWZXJhIFNhbnM7dGV4dC1hbmNob3I6bWlkZGxlO3dyaXRpbmctbW9kZTpscjsiCisgICAgIHg9IjE5OC4zMzA0MyIKKyAgICAgeT0iMjg1LjI0Mjk4IgorICAgICBpZD0idGV4dDU1NTMiCisgICAgIHNvZGlwb2RpOmxpbmVzcGFjaW5nPSIxMDAlIj48dHNwYW4KKyAgICAgICBpZD0idHNwYW41NTU0Ij5EQnVzQ29ubmVjdGlvbjwvdHNwYW4+PHRzcGFuCisgICAgICAgc29kaXBvZGk6cm9sZT0ibGluZSIKKyAgICAgICBpZD0idHNwYW41NTU2IgorICAgICAgIHg9IjE5OC4zMzA0MyIKKyAgICAgICB5PSIyOTkuMjQyOTgiPkluc3RhbmNlPC90c3Bhbj48L3RleHQ+CisgIDxyZWN0CisgICAgIHN0eWxlPSJmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjAuNzUwMDAwMDA7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjIuNTAwMDAwMDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0LjAwMDAwMDA7c3Ryb2tlLWRhc2hhcnJheToyLjUwMDAwMDAgMi41MDAwMDAwIDtzdHJva2UtZGFzaG9mZnNldDowLjAwMDAwMDA7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwOyIKKyAgICAgaWQ9InJlY3Q1NTU4IgorICAgICB3aWR0aD0iMTQ4LjQ2MjU5IgorICAgICBoZWlnaHQ9IjQ2LjY1Njg0OSIKKyAgICAgeD0iNzE5LjY0NzY0IgorICAgICB5PSIyNjMuMzgyNTEiIC8+CisgIDx0ZXh0CisgICAgIHhtbDpzcGFjZT0icHJlc2VydmUiCisgICAgIHN0eWxlPSJmb250LXNpemU6MTQuMDAwMDAwO2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtdmFyaWFudDpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc3RyZXRjaDpub3JtYWw7ZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxLjAwMDAwMDA7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMHB0O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEuMDAwMDAwMDtmb250LWZhbWlseTpCaXRzdHJlYW0gVmVyYSBTYW5zO3RleHQtYW5jaG9yOm1pZGRsZTt3cml0aW5nLW1vZGU6bHI7IgorICAgICB4PSI3OTMuOTYyMzQiCisgICAgIHk9IjI4NS4yNDI5OCIKKyAgICAgaWQ9InRleHQ1NTU5IgorICAgICBzb2RpcG9kaTpsaW5lc3BhY2luZz0iMTAwJSI+PHRzcGFuCisgICAgICAgaWQ9InRzcGFuNTU2MCI+REJ1c0Nvbm5lY3Rpb248L3RzcGFuPjx0c3BhbgorICAgICAgIHNvZGlwb2RpOnJvbGU9ImxpbmUiCisgICAgICAgaWQ9InRzcGFuNTU2MiIKKyAgICAgICB4PSI3OTMuOTYyMzQiCisgICAgICAgeT0iMjk5LjI0Mjk4Ij5JbnN0YW5jZTwvdHNwYW4+PC90ZXh0PgorICA8cmVjdAorICAgICBzdHlsZT0iZmlsbDpub25lO2ZpbGwtb3BhY2l0eTowLjc1MDAwMDAwO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyLjUwMDAwMDA7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NC4wMDAwMDAwO3N0cm9rZS1kYXNoYXJyYXk6Mi41MDAwMDAwIDIuNTAwMDAwMCA7c3Ryb2tlLWRhc2hvZmZzZXQ6MC4wMDAwMDAwO3N0cm9rZS1vcGFjaXR5OjEuMDAwMDAwMDsiCisgICAgIGlkPSJyZWN0NTU2NCIKKyAgICAgd2lkdGg9IjE0OC40NjI1OSIKKyAgICAgaGVpZ2h0PSI0Ni42NTY4NDkiCisgICAgIHg9Ijc2My43NzIyMiIKKyAgICAgeT0iMzc4LjU0MDAxIiAvPgorICA8dGV4dAorICAgICB4bWw6c3BhY2U9InByZXNlcnZlIgorICAgICBzdHlsZT0iZm9udC1zaXplOjE0LjAwMDAwMDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXN0cmV0Y2g6bm9ybWFsO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MS4wMDAwMDAwO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxLjAwMDAwMDBwdDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxLjAwMDAwMDA7Zm9udC1mYW1pbHk6Qml0c3RyZWFtIFZlcmEgU2Fuczt0ZXh0LWFuY2hvcjptaWRkbGU7d3JpdGluZy1tb2RlOmxyOyIKKyAgICAgeD0iODM4LjA4NjkxIgorICAgICB5PSI0MDAuNDAwNDgiCisgICAgIGlkPSJ0ZXh0NTU2NSIKKyAgICAgc29kaXBvZGk6bGluZXNwYWNpbmc9IjEwMCUiPjx0c3BhbgorICAgICAgIGlkPSJ0c3BhbjU1NjYiPkRCdXNDb25uZWN0aW9uPC90c3Bhbj48dHNwYW4KKyAgICAgICBzb2RpcG9kaTpyb2xlPSJsaW5lIgorICAgICAgIGlkPSJ0c3BhbjU1NjgiCisgICAgICAgeD0iODM4LjA4NjkxIgorICAgICAgIHk9IjQxNC40MDA0OCI+SW5zdGFuY2U8L3RzcGFuPjwvdGV4dD4KKyAgPHBhdGgKKyAgICAgc3R5bGU9ImZpbGw6bm9uZTtmaWxsLW9wYWNpdHk6MC43NTAwMDAwMDtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MS4wMDAwMDAwcHQ7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwO21hcmtlci1lbmQ6dXJsKCNBcnJvdzFNKTsiCisgICAgIGQ9Ik0gMTg2LjAyMzYyLDI0OC4wMzE0OSBDIDEwNi4yOTkyMSwyNi41NzQ3OTcgMzcyLjA0NzI0LDI2LjU3NDc5NyAzNzIuMDQ3MjQsMjYuNTc0Nzk3IgorICAgICBpZD0icGF0aDU1NzEiCisgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+CisgIDxyZWN0CisgICAgIHN0eWxlPSJmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjAuNzUwMDAwMDA7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjIuMTg1NDk2MTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0LjAwMDAwMDA7c3Ryb2tlLWRhc2hhcnJheToyLjE4NTQ5NjAgMi4xODU0OTYwIDtzdHJva2UtZGFzaG9mZnNldDowLjAwMDAwMDA7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwOyIKKyAgICAgaWQ9InJlY3Q2MjA1IgorICAgICB3aWR0aD0iMTQ4LjQ2MjU5IgorICAgICBoZWlnaHQ9IjM1LjY1NjIyNyIKKyAgICAgeD0iMzkxLjg5MTc1IgorICAgICB5PSIxNy40OTMzNzQiIC8+CisgIDx0ZXh0CisgICAgIHhtbDpzcGFjZT0icHJlc2VydmUiCisgICAgIHN0eWxlPSJmb250LXNpemU6MTQuMDAwMDAwO2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtdmFyaWFudDpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc3RyZXRjaDpub3JtYWw7ZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxLjAwMDAwMDA7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMHB0O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEuMDAwMDAwMDtmb250LWZhbWlseTpCaXRzdHJlYW0gVmVyYSBTYW5zO3RleHQtYW5jaG9yOm1pZGRsZTt3cml0aW5nLW1vZGU6bHI7IgorICAgICB4PSI0NjYuMjA2NDIiCisgICAgIHk9IjM5LjU3NzAwMyIKKyAgICAgaWQ9InRleHQ2MjA2IgorICAgICBzb2RpcG9kaTpsaW5lc3BhY2luZz0iMTAwJSI+PHRzcGFuCisgICAgICAgeD0iNDY2LjIwNjQyIgorICAgICAgIHk9IjM5LjU3NzAwMyIKKyAgICAgICBzb2RpcG9kaTpyb2xlPSJsaW5lIgorICAgICAgIGlkPSJ0c3BhbjYyMTEiPk1lc3NhZ2UgRGlzcGF0Y2hlcjwvdHNwYW4+PC90ZXh0PgorICA8cGF0aAorICAgICBzdHlsZT0iZmlsbDpub25lO2ZpbGwtb3BhY2l0eTowLjc1MDAwMDAwO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoxLjAwMDAwMDBwdDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxLjAwMDAwMDA7bWFya2VyLWVuZDp1cmwoI0Fycm93MU0pOyIKKyAgICAgZD0iTSA4MDYuMTAyMzYsMjQ4LjAzMTQ5IEMgODE0Ljk2MDYzLDE3LjcxNjUzMCA1NDkuMjEyNjAsMjYuNTc0Nzk3IDU1OC4wNzA4NywyNi41NzQ3OTciCisgICAgIGlkPSJwYXRoNjIxMyIKKyAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KKyAgPHRleHQKKyAgICAgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIKKyAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMi4wMDAwMDA7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zdHJldGNoOm5vcm1hbDtmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjEuMDAwMDAwMDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS4wMDAwMDAwcHQ7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwO2ZvbnQtZmFtaWx5OkJpdHN0cmVhbSBWZXJhIFNhbnM7dGV4dC1hbmNob3I6c3RhcnQ7d3JpdGluZy1tb2RlOmxyOyIKKyAgICAgeD0iMzgwLjI0MzQxIgorICAgICB5PSI3MS4xMjUwNTMiCisgICAgIGlkPSJ0ZXh0NjIxNCIKKyAgICAgc29kaXBvZGk6bGluZXNwYWNpbmc9IjEwMCUiPjx0c3BhbgorICAgICAgIHg9IjM4MC4yNDM0MSIKKyAgICAgICB5PSI3MS4xMjUwNTMiCisgICAgICAgc29kaXBvZGk6cm9sZT0ibGluZSIKKyAgICAgICBpZD0idHNwYW42ODYwIj5pZiAobWVzc2FnZSBpcyBzaWduYWwpPC90c3Bhbj48dHNwYW4KKyAgICAgICB4PSIzODAuMjQzNDEiCisgICAgICAgeT0iODMuMTI1MDUzIgorICAgICAgIHNvZGlwb2RpOnJvbGU9ImxpbmUiCisgICAgICAgaWQ9InRzcGFuNjg2MiI+ICBicm9hZGNhc3Q8L3RzcGFuPjx0c3BhbgorICAgICAgIHg9IjM4MC4yNDM0MSIKKyAgICAgICB5PSI5NS4xMjUwNTMiCisgICAgICAgc29kaXBvZGk6cm9sZT0ibGluZSIKKyAgICAgICBpZD0idHNwYW42ODY0Ij5lbHNlPC90c3Bhbj48dHNwYW4KKyAgICAgICB4PSIzODAuMjQzNDEiCisgICAgICAgeT0iMTA3LjEyNTA1IgorICAgICAgIHNvZGlwb2RpOnJvbGU9ImxpbmUiCisgICAgICAgaWQ9InRzcGFuNjg2NiI+ICBmaW5kIGRlc3RpbmF0aW9uIG5hbWVkIGJ5IG1lc3NhZ2U8L3RzcGFuPjwvdGV4dD4KKyAgPHBhdGgKKyAgICAgc3R5bGU9ImZpbGw6bm9uZTtmaWxsLW9wYWNpdHk6MC43NTAwMDAwMDtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MS4wMDAwMDAwcHQ7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwO21hcmtlci1lbmQ6dXJsKCNBcnJvdzFNKTsiCisgICAgIGQ9Ik0gMzgwLjkwNTUxLDc5LjcyNDQwNCBDIDE3Ny4xNjUzNiw1My4xNDk2MDEgMjAzLjc0MDE2LDI1Ni44ODk3NiAyMDMuNzQwMTYsMjQ4LjAzMTQ5IgorICAgICBpZD0icGF0aDY4NjgiCisgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+CisgIDxwYXRoCisgICAgIHN0eWxlPSJmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjAuNzUwMDAwMDA7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMHB0O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEuMDAwMDAwMDttYXJrZXItZW5kOnVybCgjQXJyb3cxTSk7IgorICAgICBkPSJNIDQ1MS43NzE2NSw3OS43MjQ0MDQgQyA3ODguMzg1ODMsNDQuMjkxMzMzIDc3OS41Mjc1NiwyNTYuODg5NzYgNzc5LjUyNzU2LDI0OC4wMzE0OSIKKyAgICAgaWQ9InBhdGg2ODY5IgorICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgorICA8cmVjdAorICAgICBzdHlsZT0iZmlsbDpub25lO2ZpbGwtb3BhY2l0eTowLjc1MDAwMDAwO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojNmE2YTZhO3N0cm9rZS13aWR0aDoyLjUwMDAwMDA7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwO3N0cm9rZS1taXRlcmxpbWl0OjQuMDAwMDAwMDtzdHJva2UtZGFzaGFycmF5OjEuMjUwMDAwMCwxLjI1MDAwMDA7c3Ryb2tlLWRhc2hvZmZzZXQ6MC4wMDAwMDAwOyIKKyAgICAgaWQ9InJlY3Q3NTAzIgorICAgICB3aWR0aD0iMzE4Ljg5NzY0IgorICAgICBoZWlnaHQ9IjE2OC4zMDcwOCIKKyAgICAgeD0iMzQ1LjQ3MjQ0IgorICAgICB5PSIxMTUuMTU3NDgiIC8+CisgIDx0ZXh0CisgICAgIHhtbDpzcGFjZT0icHJlc2VydmUiCisgICAgIHN0eWxlPSJmb250LXNpemU6MTIuMDAwMDAwO2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtdmFyaWFudDpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc3RyZXRjaDpub3JtYWw7ZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxLjAwMDAwMDA7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMHB0O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEuMDAwMDAwMDtmb250LWZhbWlseTpCaXRzdHJlYW0gVmVyYSBTYW5zO3RleHQtYW5jaG9yOm1pZGRsZTt3cml0aW5nLW1vZGU6bHI7IgorICAgICB4PSI1MDcuMTAwMTYiCisgICAgIHk9IjEzMi43MDQwOSIKKyAgICAgaWQ9InRleHQ4MTM3IgorICAgICBzb2RpcG9kaTpsaW5lc3BhY2luZz0iMTAwJSI+PHRzcGFuCisgICAgICAgaWQ9InRzcGFuODEzOCI+RGVzdGluYXRpb24gVGFibGU8L3RzcGFuPjwvdGV4dD4KKyAgPHRleHQKKyAgICAgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIKKyAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMi4wMDAwMDA7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MS4wMDAwMDAwO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxLjAwMDAwMDBwdDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxLjAwMDAwMDA7Zm9udC1mYW1pbHk6Qml0c3RyZWFtIFZlcmEgU2Fucztmb250LXN0cmV0Y2g6bm9ybWFsO2ZvbnQtdmFyaWFudDpub3JtYWw7dGV4dC1hbmNob3I6c3RhcnQ7d3JpdGluZy1tb2RlOmxyOyIKKyAgICAgeD0iNDIyLjcxMTI0IgorICAgICB5PSIxNTguMzkzNjYiCisgICAgIGlkPSJ0ZXh0ODE0MCIKKyAgICAgc29kaXBvZGk6bGluZXNwYWNpbmc9IjEyMCUiPjx0c3BhbgorICAgICAgIHg9IjQyMi43MTEyNCIKKyAgICAgICB5PSIxNTguMzkzNjYiCisgICAgICAgc29kaXBvZGk6cm9sZT0ibGluZSIKKyAgICAgICBpZD0idHNwYW44ODE4Ij5Db25uZWN0aW9uIDE8L3RzcGFuPjx0c3BhbgorICAgICAgIHg9IjQyMi43MTEyNCIKKyAgICAgICB5PSIxNzIuNzkzNjYiCisgICAgICAgc29kaXBvZGk6cm9sZT0ibGluZSIKKyAgICAgICBpZD0idHNwYW44ODIwIj5Db25uZWN0aW9uIDI8L3RzcGFuPjx0c3BhbgorICAgICAgIHg9IjQyMi43MTEyNCIKKyAgICAgICB5PSIxODcuMTkzNjYiCisgICAgICAgc29kaXBvZGk6cm9sZT0ibGluZSIKKyAgICAgICBpZD0idHNwYW44ODIyIj4mcXVvdDtUaGUgU2Vzc2lvbiBNYW5hZ2VyJnF1b3Q7PC90c3Bhbj48dHNwYW4KKyAgICAgICB4PSI0MjIuNzExMjQiCisgICAgICAgeT0iMjAxLjU5MzY2IgorICAgICAgIHNvZGlwb2RpOnJvbGU9ImxpbmUiCisgICAgICAgaWQ9InRzcGFuODgyNCI+JnF1b3Q7VGhlIFdpbmRvdyBNYW5hZ2VyJnF1b3Q7PC90c3Bhbj48dHNwYW4KKyAgICAgICB4PSI0MjIuNzExMjQiCisgICAgICAgeT0iMjE1Ljk5MzY2IgorICAgICAgIHNvZGlwb2RpOnJvbGU9ImxpbmUiCisgICAgICAgaWQ9InRzcGFuODgyNiI+JnF1b3Q7VGhlIFNjcmVlbnNhdmVyJnF1b3Q7PC90c3Bhbj48dHNwYW4KKyAgICAgICB4PSI0MjIuNzExMjQiCisgICAgICAgeT0iMjMwLjM5MzY2IgorICAgICAgIHNvZGlwb2RpOnJvbGU9ImxpbmUiCisgICAgICAgaWQ9InRzcGFuODgyOCI+JnF1b3Q7VGhlIFRleHQgRWRpdG9yJnF1b3Q7PC90c3Bhbj48dHNwYW4KKyAgICAgICB4PSI0MjIuNzExMjQiCisgICAgICAgeT0iMjQ0Ljc5MzY2IgorICAgICAgIHNvZGlwb2RpOnJvbGU9ImxpbmUiCisgICAgICAgaWQ9InRzcGFuODgzMCI+JnF1b3Q7VGhlIEhhcmR3YXJlIERpcmVjdG9yeSZxdW90OzwvdHNwYW4+PHRzcGFuCisgICAgICAgeD0iNDIyLjcxMTI0IgorICAgICAgIHk9IjI1OS4xOTM2NyIKKyAgICAgICBzb2RpcG9kaTpyb2xlPSJsaW5lIgorICAgICAgIGlkPSJ0c3Bhbjg4MzIiPiZxdW90O1RoZSBBZGRyZXNzIEJvb2smcXVvdDs8L3RzcGFuPjx0c3BhbgorICAgICAgIHg9IjQyMi43MTEyNCIKKyAgICAgICB5PSIyNzMuNTkzNjciCisgICAgICAgc29kaXBvZGk6cm9sZT0ibGluZSIKKyAgICAgICBpZD0idHNwYW44ODM0Ij4mcXVvdDtUaGUgRGljdGlvbmFyeSZxdW90OzwvdHNwYW4+PC90ZXh0PgorICA8cGF0aAorICAgICBzdHlsZT0iZmlsbDpub25lO2ZpbGwtb3BhY2l0eTowLjc1MDAwMDAwO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoxLjAwMDAwMDBwdDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxLjAwMDAwMDA7bWFya2VyLWVuZDp1cmwoI0Fycm93MU0pOyIKKyAgICAgZD0iTSA0MTYuMzM4NTgsMTUwLjU5MDU1IEMgMjM5LjE3MzIzLDk3LjQ0MDkzNSAyMjEuNDU2NjksMjU2Ljg4OTc2IDIyMS40NTY2OSwyNDguMDMxNDkiCisgICAgIGlkPSJwYXRoODE3OSIKKyAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KKyAgPHBhdGgKKyAgICAgc3R5bGU9ImZpbGw6bm9uZTtmaWxsLW9wYWNpdHk6MC43NTAwMDAwMDtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MS4wMDAwMDAwcHQ7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwO21hcmtlci1lbmQ6dXJsKCNBcnJvdzFNKTsiCisgICAgIGQ9Ik0gNTA0LjkyMTI2LDE2OC4zMDcwOCBDIDcyNi4zNzc5NSwxMDYuMjk5MjEgNzcwLjY2OTI5LDI2NS43NDgwMiA3NjEuODExMDIsMjM5LjE3MzIyIgorICAgICBpZD0icGF0aDgxODAiCisgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+CisgIDxwYXRoCisgICAgIHN0eWxlPSJmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjAuNzUwMDAwMDA7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMHB0O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEuMDAwMDAwMDsiCisgICAgIGQ9IiIKKyAgICAgaWQ9InBhdGg4MTgxIgorICAgICBzb2RpcG9kaTpub2RldHlwZXM9IiIgLz4KKyAgPHBhdGgKKyAgICAgc3R5bGU9ImZpbGw6bm9uZTtmaWxsLW9wYWNpdHk6MC43NTAwMDAwMDtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MS4wMDAwMDAwcHQ7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MS4wMDAwMDAwO21hcmtlci1lbmQ6dXJsKCNBcnJvdzFNKTsiCisgICAgIGQ9Ik0gNTg0LjY0NTY3LDIzOS4xNzMyMiBDIDcxNy41MTk2OSwxOTQuODgxODggNzYxLjgxMTAyLDI1Ni44ODk3NiA3NTIuOTUyNzYsMjQ4LjAzMTQ5IgorICAgICBpZD0icGF0aDgxODIiCisgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+CisgIDxwYXRoCisgICAgIHN0eWxlPSJmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjAuNzUwMDAwMDA7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjEuMDAwMDAwMHB0O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEuMDAwMDAwMDttYXJrZXItZW5kOnVybCgjQXJyb3cxTSk7IgorICAgICBkPSJNIDQxNi4zMzg1OCwxNzcuMTY1MzUgQyAzMDEuMTgxMTEsMTI0LjAxNTc0IDIzMC4zMTQ5NiwyNjUuNzQ4MDMgMjM5LjE3MzIzLDI0OC4wMzE0OSIKKyAgICAgaWQ9InBhdGg4MTg0IgorICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgorPC9zdmc+CmRpZmYgLS1naXQgYS9kb2MvZG94eWdlbl90b19kZXZoZWxwLnhzbCBiL2RvYy9kb3h5Z2VuX3RvX2RldmhlbHAueHNsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkMzNiY2UKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZG94eWdlbl90b19kZXZoZWxwLnhzbApAQCAtMCwwICsxLDQ2IEBACis8eHNsOnN0eWxlc2hlZXQKKyAgICB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKKyAgICB4bWxuczpmbz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvRm9ybWF0IgorICAgIHZlcnNpb249IjEuMCI+CisKKzx4c2w6b3V0cHV0IG1ldGhvZD0ieG1sIiB2ZXJzaW9uPSIxLjAiIGluZGVudD0ieWVzIi8+CisKKzx4c2w6cGFyYW0gbmFtZT0icHJlZml4Ij48L3hzbDpwYXJhbT4KKworPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLyI+CisgIDxib29rIHRpdGxlPSJELUJ1czogQSBzeXN0ZW0gZm9yIGludGVycHJvY2VzcyBjb21tdW5pY2F0aW9uIgorICAgICAgICBuYW1lPSJkYnVzIgorICAgICAgICBsaW5rPSJ7JHByZWZpeH0vYXBpL2luZGV4Lmh0bWwiCisgICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LmRldmhlbHAubmV0L2Jvb2siCisgICAgICAgIHZlcnNpb249IjIiCisgICAgICAgIG9ubGluZT0iaHR0cHM6Ly9kYnVzLmZyZWVkZXNrdG9wLm9yZy9kb2MvIgorICAgICAgICBhdXRob3I9IkQtQnVzIGNvbnRyaWJ1dG9ycyIKKyAgICAgICAgbGFuZ3VhZ2U9ImMiCisgICAgICAgID4KKyAgPGNoYXB0ZXJzPgorICAgICA8c3ViIG5hbWU9IlR1dG9yaWFsIiBsaW5rPSJ7JHByZWZpeH1kYnVzLXR1dG9yaWFsLmh0bWwiLz4KKyAgICAgPHN1YiBuYW1lPSJGQVEiIGxpbms9InskcHJlZml4fWRidXMtZmFxLmh0bWwiLz4KKyAgICAgPHN1YiBuYW1lPSJTcGVjaWZpY2F0aW9uIiBsaW5rPSJ7JHByZWZpeH1kYnVzLXNwZWNpZmljYXRpb24uaHRtbCIvPgorICAgICA8c3ViIG5hbWU9IkFQSSBSZWZlcmVuY2UiIGxpbms9InskcHJlZml4fWFwaS9pbmRleC5odG1sIi8+CisgIDwvY2hhcHRlcnM+CisKKyAgPGZ1bmN0aW9ucz4KKyAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImRveHlnZW5pbmRleC9jb21wb3VuZFtAa2luZD0nZ3JvdXAnXS9tZW1iZXJbQGtpbmQ9J2Z1bmN0aW9uJ10iLz4KKyAgPC9mdW5jdGlvbnM+CisgIDwvYm9vaz4KKzwveHNsOnRlbXBsYXRlPgorCis8eHNsOnRlbXBsYXRlIG1hdGNoPSJtZW1iZXIiPgorICA8eHNsOnBhcmFtIG5hbWU9Im5hbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJuYW1lIi8+PC94c2w6cGFyYW0+CisgIDx4c2w6cGFyYW0gbmFtZT0icmVmaWQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcmVmaWQiLz48L3hzbDpwYXJhbT4KKyAgPHhzbDpwYXJhbSBuYW1lPSJiZWZvcmUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdWJzdHJpbmctYmVmb3JlKCRyZWZpZCwnXzEnKSIvPjwveHNsOnBhcmFtPgorICA8eHNsOnBhcmFtIG5hbWU9ImFmdGVyIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWFmdGVyKCRyZWZpZCwnXzEnKSIvPjwveHNsOnBhcmFtPgorICA8eHNsOnBhcmFtIG5hbWU9ImxpbmsiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYmVmb3JlIi8+Lmh0bWwjPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRhZnRlciIvPjwveHNsOnBhcmFtPgorICA8eHNsOmlmIHRlc3Q9InN0YXJ0cy13aXRoKCRuYW1lLCdkYnVzJykgb3Igc3RhcnRzLXdpdGgoJG5hbWUsICdEQnVzJykiPgorICAgIDx4c2w6aWYgdGVzdD0ic3RhcnRzLXdpdGgoJHJlZmlkLCdncm91cF9fJykgYW5kIGNvbnRhaW5zKCRyZWZpZCwgJ18xJykiPgorICAgICAgIDxrZXl3b3JkIHhtbG5zPSJodHRwOi8vd3d3LmRldmhlbHAubmV0L2Jvb2siIHR5cGU9ImZ1bmN0aW9uIiBuYW1lPSJ7JG5hbWV9IiBsaW5rPSJ7JHByZWZpeH1hcGkveyRsaW5rfSIvPgorICAgIDwveHNsOmlmPgorICA8L3hzbDppZj4KKzwveHNsOnRlbXBsYXRlPgorCis8L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvZG9jL2ZpbGUtYm9pbGVycGxhdGUuYyBiL2RvYy9maWxlLWJvaWxlcnBsYXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmMzNjVmOAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9maWxlLWJvaWxlcnBsYXRlLmMKQEAgLTAsMCArMSwyNyBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBGSUxFTkFNRSAgQlJJRUYgRklMRSBERVNDUklQVElPTgorICoKKyAqIENvcHlyaWdodCAoQykgWUVBUiAgQ09QWVJJR0hUIEhPTERFUgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaWZuZGVmIERCVVNfRk9PX0gKKyNkZWZpbmUgREJVU19GT09fSAorCisjZW5kaWYgLyogREJVU19GT09fSCAqLwpkaWZmIC0tZ2l0IGEvZG9jL2ludHJvc3BlY3QuZHRkIGIvZG9jL2ludHJvc3BlY3QuZHRkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkMzk2ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaW50cm9zcGVjdC5kdGQKQEAgLTAsMCArMSwzNyBAQAorPCEtLSBEVEQgZm9yIEQtQnVzIEludHJvc3BlY3Rpb24gZGF0YSAtLT4KKzwhLS0gKEMpIDIwMDUtMDItMDIgRGF2aWQgQS4gV2hlZWxlcjsgcmVsZWFzZWQgdW5kZXIgdGhlIEQtQnVzIGxpY2Vuc2VzLAorICAgICAgICAgR05VIEdQTCB2ZXJzaW9uIDIgKG9yIGdyZWF0ZXIpIGFuZCBBRkwgMS4xIChvciBncmVhdGVyKSAtLT4KKworPCEtLSBzZWUgRC1CdXMgc3BlY2lmaWNhdGlvbiBmb3IgZG9jdW1lbnRhdGlvbiAtLT4KKworPCFFTEVNRU5UIG5vZGUgKG5vZGV8aW50ZXJmYWNlKSo+Cis8IUFUVExJU1Qgbm9kZSBuYW1lIENEQVRBICNJTVBMSUVEPgorCis8IUVMRU1FTlQgaW50ZXJmYWNlIChtZXRob2R8c2lnbmFsfHByb3BlcnR5fGFubm90YXRpb24pKj4KKzwhQVRUTElTVCBpbnRlcmZhY2UgbmFtZSBDREFUQSAjUkVRVUlSRUQ+CisKKzwhRUxFTUVOVCBtZXRob2QgKGFyZ3xhbm5vdGF0aW9uKSo+Cis8IUFUVExJU1QgbWV0aG9kIG5hbWUgQ0RBVEEgI1JFUVVJUkVEPgorCis8IUVMRU1FTlQgc2lnbmFsIChhcmd8YW5ub3RhdGlvbikqPgorPCFBVFRMSVNUIHNpZ25hbCBuYW1lIENEQVRBICNSRVFVSVJFRD4KKworPCFFTEVNRU5UIGFyZyAoYW5ub3RhdGlvbikqPgorPCFBVFRMSVNUIGFyZyBuYW1lIENEQVRBICNJTVBMSUVEPgorPCFBVFRMSVNUIGFyZyB0eXBlIENEQVRBICNSRVFVSVJFRD4KKzwhLS0gTWV0aG9kIGFyZ3VtZW50cyBTSE9VTEQgaW5jbHVkZSAiZGlyZWN0aW9uIiwKKyAgICAgd2hpbGUgc2lnbmFsIGFuZCBlcnJvciBhcmd1bWVudHMgU0hPVUxEIG5vdCAoc2luY2UgdGhlcmUncyBubyBwb2ludCkuCisgICAgIFRoZSBEVEQgZm9ybWF0IGNhbid0IGV4cHJlc3MgdGhhdCBzdWJ0bGV0eS4gLS0+Cis8IUFUVExJU1QgYXJnIGRpcmVjdGlvbiAoaW58b3V0KSAiaW4iPgorCis8IS0tIEFLQSAiYXR0cmlidXRlIiAtLT4KKzwhRUxFTUVOVCBwcm9wZXJ0eSAoYW5ub3RhdGlvbikqPgorPCFBVFRMSVNUIHByb3BlcnR5IG5hbWUgQ0RBVEEgI1JFUVVJUkVEPgorPCFBVFRMSVNUIHByb3BlcnR5IHR5cGUgQ0RBVEEgI1JFUVVJUkVEPiAKKzwhQVRUTElTVCBwcm9wZXJ0eSBhY2Nlc3MgKHJlYWR8d3JpdGV8cmVhZHdyaXRlKSAjUkVRVUlSRUQ+CisKKzwhRUxFTUVOVCBhbm5vdGF0aW9uIEVNUFRZPiAgPCEtLSBHZW5lcmljIG1ldGFkYXRhIC0tPgorPCFBVFRMSVNUIGFubm90YXRpb24gbmFtZSBDREFUQSAjUkVRVUlSRUQ+Cis8IUFUVExJU1QgYW5ub3RhdGlvbiB2YWx1ZSBDREFUQSAjUkVRVUlSRUQ+CisKKwpkaWZmIC0tZ2l0IGEvZG9jL2ludHJvc3BlY3QueHNsIGIvZG9jL2ludHJvc3BlY3QueHNsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5YjY4NDQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaW50cm9zcGVjdC54c2wKQEAgLTAsMCArMSwxMTIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTE1Ij8+Cis8eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIiB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgorCis8IS0tIAorIENvcHlyaWdodCAoQykgMjAwNSBMZW5uYXJ0IFBvZXR0ZXJpbmcuCisKKyBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisKKyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKy0tPgorCis8IS0tICRJZCQgLS0+CisKKzx4c2w6b3V0cHV0IG1ldGhvZD0ieG1sIiB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJpc28tODg1OS0xNSIgZG9jdHlwZS1wdWJsaWM9Ii0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiBkb2N0eXBlLXN5c3RlbT0iaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCIgaW5kZW50PSJ5ZXMiLz4KKworPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLyI+CisgIDxodG1sPgorICAgIDxoZWFkPgorICAgICAgPHRpdGxlPkRCVVMgSW50cm9zcGVjdGlvbiBkYXRhPC90aXRsZT4KKyAgICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CisgICAgICAgIGJvZHkgeyBjb2xvcjogYmxhY2s7IGJhY2tncm91bmQtY29sb3I6IHdoaXRlIH0gCisgICAgICAgIGgxIHsgZm9udC1mYW1pbHk6IHNhbnMtc2VyaWYgfQorICAgICAgICB1bCB7IGxpc3Qtc3R5bGUtdHlwZTogbm9uZTsgbWFyZ2luLWJvdHRvbTogMTBweCB9CisgICAgICAgIGxpIHsgZm9udC1mYW1pbHk6IHNhbnMtc2VyaWYgfQorICAgICAgICAua2V5d29yZCB7IGZvbnQtc3R5bGU6IGl0YWxpYyB9CisgICAgICAgIC50eXBlIHsgZm9udC13ZWlnaHQ6IGJvbGQgfQorICAgICAgICAuc3ltYm9sIHsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZSB9CisgICAgICAgIC5pbnRlcmZhY2UgeyBwYWRkaW5nOiAxMHB4OyBtYXJnaW46IDEwcHggfQorICAgICAgPC9zdHlsZT4KKyAgICA8L2hlYWQ+CisgICAgPGJvZHk+CisgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0ibm9kZS9pbnRlcmZhY2UiPgorICAgICAgICA8ZGl2IGNsYXNzPSJpbnRlcmZhY2UiPgorICAgICAgICAgIDxoMT4KKyAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJrZXl3b3JkIj5pbnRlcmZhY2U8L3NwYW4+PHhzbDp0ZXh0PiA8L3hzbDp0ZXh0PgorICAgICAgICAgICAgPHNwYW4gY2xhc3M9InN5bWJvbCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC9zcGFuPgorICAgICAgICAgIDwvaDE+ICAgCisgICAgICAgICAgCisgICAgICAgICAgPHVsPgorCisgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImFubm90YXRpb24iLz4gCisKKyAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJtZXRob2R8c2lnbmFsfHByb3BlcnR5Ij4KKyAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJrZXl3b3JkIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0ibmFtZSgpIi8+PC9zcGFuPgorICAgICAgICAgICAgICAgIDx4c2w6dGV4dD4gPC94c2w6dGV4dD4KKyAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic3ltYm9sIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L3NwYW4+CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgPHVsPgorICAgICAgICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJhbm5vdGF0aW9uIi8+IAorICAgICAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImFyZyI+CisgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ia2V5d29yZCI+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBkaXJlY3Rpb24gIT0gJnF1b3Q7JnF1b3Q7Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGRpcmVjdGlvbiIvPiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9Im5hbWUoLi4pID0gJnF1b3Q7c2lnbmFsJnF1b3Q7Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgorICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj4KKworICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dGV4dD4gPC94c2w6dGV4dD4KKyAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0idHlwZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+PC9zcGFuPjx4c2w6dGV4dD4gPC94c2w6dGV4dD4KKyAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic3ltYm9sIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L3NwYW4+PHhzbDp0ZXh0PiA8L3hzbDp0ZXh0PgorCisgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJhbm5vdGF0aW9uIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJhbm5vdGF0aW9uIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3VsPgorICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgorICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+CisgICAgICAgICAgICAgICAgPC91bD4KKworICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+CisKKyAgICAgICAgICA8L3VsPgorICAgICAgICA8L2Rpdj4KKyAgICAgIDwveHNsOmZvci1lYWNoPgorICAgIDwvYm9keT4KKyAgPC9odG1sPgorPC94c2w6dGVtcGxhdGU+CisKKworPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iYW5ub3RhdGlvbiI+IAorICA8bGk+CisgICAgPHNwYW4gY2xhc3M9ImtleXdvcmQiPmFubm90YXRpb248L3NwYW4+PHhzbDp0ZXh0PiA8L3hzbDp0ZXh0PgorICAgIDxjb2RlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwvY29kZT48eHNsOnRleHQ+ID0gPC94c2w6dGV4dD4KKyAgICA8Y29kZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHZhbHVlIi8+PC9jb2RlPgorICA8L2xpPgorPC94c2w6dGVtcGxhdGU+CisKKzwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS9kb2Mvc3lzdGVtLWFjdGl2YXRpb24udHh0IGIvZG9jL3N5c3RlbS1hY3RpdmF0aW9uLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGU2NDhlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3N5c3RlbS1hY3RpdmF0aW9uLnR4dApAQCAtMCwwICsxLDgxIEBACitELUJVUyBTeXN0ZW0gQWN0aXZhdGlvbgorCitJbnRyb2R1Y3Rpb246CisKK1RoZSBkYnVzLWRhZW1vbiBydW5zIGFzIHRoZSBkYnVzIHVzZXIsIGFuZCBpcyB0aGVyZWZvcmUgdW5wcml2aWxlZ2VkLgorRWFybGllciBhdHRlbXB0cyBbMV0gYnkgRGF2aWQgWmV1dGhlbiBhdCBsYXVuY2hpbmcgc3lzdGVtIHNjcmlwdHMgdXNpbmcgYQorY3VzdG9tIERCVVMgcHJvdG9jb2wgd2VyZSByZXZpZXdlZCwgYnV0IGRlZW1lZCB0b28gZGlmZmljdWx0IHRvIGF1ZGl0LCBhbmQKK2Fsc28gZHVlIHRvIGEgbXVsdGktdGhyZWFkZWQgZGVzaWduLCB0b28gZGlmZmljdWx0IHRvIHRlc3QuCitJbiB0aGUgbmV4dCBmZXcgcGFyYWdyYXBocyBJIHdpbGwgb3V0bGluZSBhIHNpbXBsZXIgc2V0dWlkIGFwcHJvYWNoIGZvcgorbGF1bmNoaW5nIGRhZW1vbnMgYXMgYSBjb25maWd1cmVkIHVzZXIuCisKK1Njb3BlOgorCitMYXVuY2hpbmcgcHJvZ3JhbXMgdXNpbmcgZGJ1cyBoYXMgYmVlbiBhIHRvcGljIG9mIGludGVyZXN0IGZvciBtYW55IG1vbnRocy4KK1RoaXMgd291bGQgYWxsb3cgc2ltcGxlIHN5c3RlbXMgdG8gb25seSBzdGFydCBzZXJ2aWNlcyB0aGF0IGFyZSBuZWVkZWQsCithbmQgdGhhdCBhcmUgYXV0b21hdGljYWxseSBzdGFydGVkIG9ubHkgd2hlbiBmaXJzdCByZXF1ZXN0ZWQuCitUaGlzIHJlbW92ZXMgdGhlIG5lZWQgZm9yIGFuIGluaXQgc3lzdGVtLCBhbmQgbWVhbnMgdGhhdCB3ZSBjYW4gdHJpdmlhbGx5CitzdGFydHVwIHNlcnZpY2VzIGluIHBhcmFsbGVsLgorVGhpcyBoYXMgaW1tZWRpYXRlIHByZXNzaW5nIG5lZWQgZm9yIE9MUEMsIHdpdGggYSBsb25nZXIgdGVybSBldmFsdWF0aW9uIGZvcgorcGVyaGFwcyBGZWRvcmEgYW5kIFJIRUwuCisKK0RldGFpbHM6CisKK1NldHVpZCBhcHBsaWNhdGlvbnMgaGF2ZSB0byB1c2VkIG9ubHkgd2hlbiBhYnNvbHV0ZWx5IG5lY2Vzc2FyeS4KK0luIHRoaXMgaW1wbGVtZW50YXRpb24gSSBoYXZlIGFuIHNpbmdsZSBleGVjdXRhYmxlLAorZGJ1cy1kYWVtb24tbGF1bmNoLWhlbHBlciwgd2l0aCB0aGUgb3duZXJzaGlwIHJvb3Q6ZGJ1cy4KK1RoaXMgaGFzIHRoZSBwZXJtaXNzaW9ucyA0NzUwLCBpLmUuIHUrcnd4IGcrcnggK3NldHVpZC4KK0l0IGlzIGxvY2F0ZWQgaW4gL3Vzci9saWJleGVjLyBhbmQgdGh1cyBpcyBub3QgZGVzaWduZWQgdG8gYmUgaW52b2tlZCBieSBhCit1c2VyIGRpcmVjdGx5LgorCitUaGUgaGVscGVyIG11c3Qgbm90IGJlIHBhc3NlZCBpbnB1dCB0aGF0IGNhbiBiZSBjaGFuZ2VkIG1hbGljaW91c2x5LCBhbmQKK3RoZXJlZm9yZSBwYXNzaW5nIGEgcmFuZG9tIHBhdGggd2l0aCB1c2VyIGlkIGlzIHRvdGFsbHkgb3V0IG9mIHRoZSBxdWVzdGlvbi4KK0luIHRoaXMgaW1wbGVtZW50YXRpb24gYSBzaW1pbGFyIGlkZWEgYXMgZGlzY3Vzc2VkIHdpdGggRGF2aWRzJyBwYXRjaCB3YXMKK3Rha2VuLCB0aGF0IHRvIHBhc3MgYSBzaW5nbGUgbmFtZSBhcmd1bWVudCB0byB0aGUgaGVscGVyLgorVGhlIHNlcnZpY2UgZmlsZW5hbWUgb2YgIm9yZy5tZS50ZXN0LnNlcnZpY2UiIGlzIHRoZW4gc2VhcmNoZWQgZm9yIGluCisvdXNyL3NoYXJlL2RidXMtMS9zeXN0ZW0tc2VydmljZXMgb3Igb3RoZXIgc3BlY2lmaWVkIGRpcmVjdG9yaWVzLgorCitJZiBhcHBsaWNhdGlvbnMgd2FudCB0byBiZSBhY3RpdmF0ZWQgb24gdGhlIHN5c3RlbSBfYW5kXyBzZXNzaW9uIGJ1c3NlcywgdGhlbgorc2VydmljZSBmaWxlcyBzaG91bGQgYmUgaW5zdGFsbGVkIGluIGJvdGggZGlyZWN0b3JpZXMuCisKK0EgdHlwaWNhbCBzZXJ2aWNlIGZpbGUgd291bGQgbG9vayBsaWtlOgorCitbRC1CVVMgU2VydmljZV0KK05hbWU9b3JnLm1lLnRlc3QKK0V4ZWM9L3Vzci9zYmluL2RidXMtdGVzdC1zZXJ2ZXIucHkKK1VzZXI9ZnRwCisKK1RoaXMgZ2l2ZXMgdGhlIHVzZXIgdG8gc3dpdGNoIHRvLCBhbmQgYWxzbyB0aGUgcGF0aCBvZiB0aGUgZXhlY3V0YWJsZS4KK1RoZSBzZXJ2aWNlIG5hbWUgbXVzdCBtYXRjaCB0aGF0IHNwZWNpZmllZCBpbiB0aGUgL2V0Yy9kYnVzLTEvc3lzdGVtLmQgb3IKKy91c3Ivc2hhcmUvZGJ1cy0xL3N5c3RlbS5kIGNvbmYgZmlsZS4KKworUHJlY2F1dGlvbnMgdGFrZW46CisKKyogT25seSB0aGUgYnVzIG5hbWUgaXMgcGFzc2VkIHRvIHRoZSBoZWxwZXIsIGFuZCB0aGlzIGlzIHZhbGlkYXRlZAorKiBXZSBhcmUgc3VwZXIgcGFyYW5vaWQgYWJvdXQgdGhlIHVzZXIgdGhhdCBjYWxsZWQgdXMsIGFuZCB3aGF0IHBlcm1pc3Npb25zIHdlIGhhdmUuCisqIFdlIGNsZWFyIGFsbCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZXhjZXB0IGZvciBEQlVTX1ZFUkJPU0Ugd2hpY2ggaXMgdXNlZCBmb3IgZGVidWdnaW5nCisqIEFueXRoaW5nIG91dCBvZiB0aGUgb3JkaW5hcnkgY2F1c2VzIHRoZSBoZWxwZXIgdG8gYWJvcnQuCisKK0xhdW5jaGluZyBzZXJ2aWNlczoKKworVHJpdmlhbCBtZXRob2RzIG9uIHNlcnZpY2VzIGNhbiBiZSBjYWxsZWQgZGlyZWN0bHkgYW5kIHRoZSBsYXVuY2ggaGVscGVyIHdpbGwKK3N0YXJ0IHRoZSBzZXJ2aWNlIGFuZCBleGVjdXRlIHRoZSBtZXRob2Qgb24gdGhlIHNlcnZpY2UuIFRoZSBsYXVjaGluZyBvZiB0aGUKK3NlcnZpY2UgaXMgY29tcGxldGVseSB0cmFuc3BhcmVudCB0byB0aGUgY2FsbGVyLCBlLmcuOgorCitkYnVzLXNlbmQgLS1zeXN0ZW0gLS1wcmludC1yZXBseQkJCVwKKwktLWRlc3Q9b3JnLmZyZWVkZXNrdG9wLkhhbAkJCVwKKwkvb3JnL2ZyZWVkZXNrdG9wL0hhbC9NYW5hZ2VyCQkJXAorCW9yZy5mcmVlZGVza3RvcC5IYWwuTWFuYWdlci5EZXZpY2VFeGlzdHMJXAorCXN0cmluZzovb3JnL2ZyZWVkZXNrdG9wL0hhbC9kZXZpY2VzL2NvbXB1dGVyCisKK0lmIHlvdSB3aXNoIHRvIGFjdGl2YXRlIHRoZSBzZXJ2aWNlIHdpdGhvdXQgY2FsbGluZyBhIHdlbGwga25vd24gbWV0aG9kLAordGhlIHN0YW5kYXJkIGRidXMgbWV0aG9kIFN0YXJ0U2VydmljZUJ5TmFtZSBjYW4gYmUgdXNlZDoKKworZGJ1cy1zZW5kIC0tc3lzdGVtIC0tcHJpbnQtcmVwbHkJCQlcCisJLS1kZXN0PW9yZy5mcmVlZGVza3RvcC5EQnVzCQkJXAorCS9vcmcvZnJlZWRlc2t0b3AvREJ1cwkJCQlcCisJb3JnLmZyZWVkZXNrdG9wLkRCdXMuU3RhcnRTZXJ2aWNlQnlOYW1lCQlcCisJc3RyaW5nOm9yZy5mcmVlZGVza3RvcC5IYWwgdWludDMyOjAKKworWzFdIGh0dHA6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvYXJjaGl2ZXMvZGJ1cy8yMDA2LU9jdG9iZXIvMDA2MDk2Lmh0bWwKKwpkaWZmIC0tZ2l0IGEvbTQvYXMtYWMtZXhwYW5kLm00IGIvbTQvYXMtYWMtZXhwYW5kLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlZWJkMmIKLS0tIC9kZXYvbnVsbAorKysgYi9tNC9hcy1hYy1leHBhbmQubTQKQEAgLTAsMCArMSw0OSBAQAorZG5sIGFzLWFjLWV4cGFuZC5tNCAwLjIuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSotIGF1dG9jb25mIC0qLQorZG5sIGF1dG9zdGFycyBtNCBtYWNybyBmb3IgZXhwYW5kaW5nIGRpcmVjdG9yaWVzIHVzaW5nIGNvbmZpZ3VyZSdzIHByZWZpeAorCitkbmwgKEMpIDIwMDMsIDIwMDQsIDIwMDUgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCitkbmwgQ29weWluZyBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoaXMgZmlsZSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2RubCBhcmUgcGVybWl0dGVkIGluIGFueSBtZWRpdW0gd2l0aG91dCByb3lhbHR5IHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQKK2RubCBub3RpY2UgYW5kIHRoaXMgbm90aWNlIGFyZSBwcmVzZXJ2ZWQuCisKK2RubCBBU19BQ19FWFBBTkQoVkFSLCBDT05GSUdVUkVfVkFSKQorCitkbmwgZXhhbXBsZToKK2RubCBBU19BQ19FWFBBTkQoU1lTQ09ORkRJUiwgJHN5c2NvbmZkaXIpCitkbmwgd2lsbCBzZXQgU1lTQ09ORkRJUiB0byAvdXNyL2xvY2FsL2V0YyBpZiBwcmVmaXg9L3Vzci9sb2NhbAorCitBQ19ERUZVTihbQVNfQUNfRVhQQU5EXSwKK1sKKyAgRVhQX1ZBUj1bJDFdCisgIEZST01fVkFSPVskMl0KKworICBkbmwgZmlyc3QgZXhwYW5kIHByZWZpeCBhbmQgZXhlY19wcmVmaXggaWYgbmVjZXNzYXJ5CisgIHByZWZpeF9zYXZlPSRwcmVmaXgKKyAgZXhlY19wcmVmaXhfc2F2ZT0kZXhlY19wcmVmaXgKKworICBkbmwgaWYgbm8gcHJlZml4IGdpdmVuLCB0aGVuIHVzZSAvdXNyL2xvY2FsLCB0aGUgZGVmYXVsdCBwcmVmaXgKKyAgaWYgdGVzdCAieCRwcmVmaXgiID0gInhOT05FIjsgdGhlbgorICAgIHByZWZpeD0iJGFjX2RlZmF1bHRfcHJlZml4IgorICBmaQorICBkbmwgaWYgbm8gZXhlY19wcmVmaXggZ2l2ZW4sIHRoZW4gdXNlIHByZWZpeAorICBpZiB0ZXN0ICJ4JGV4ZWNfcHJlZml4IiA9ICJ4Tk9ORSI7IHRoZW4KKyAgICBleGVjX3ByZWZpeD0kcHJlZml4CisgIGZpCisKKyAgZnVsbF92YXI9IiRGUk9NX1ZBUiIKKyAgZG5sIGxvb3AgdW50aWwgaXQgZG9lc24ndCBjaGFuZ2UgYW55bW9yZQorICB3aGlsZSB0cnVlOyBkbworICAgIG5ld19mdWxsX3Zhcj0iYGV2YWwgZWNobyAkZnVsbF92YXJgIgorICAgIGlmIHRlc3QgIngkbmV3X2Z1bGxfdmFyIiA9ICJ4JGZ1bGxfdmFyIjsgdGhlbiBicmVhazsgZmkKKyAgICBmdWxsX3Zhcj0kbmV3X2Z1bGxfdmFyCisgIGRvbmUKKworICBkbmwgY2xlYW4gdXAKKyAgZnVsbF92YXI9JG5ld19mdWxsX3ZhcgorICBBQ19TVUJTVChbJDFdLCAiJGZ1bGxfdmFyIikKKworICBkbmwgcmVzdG9yZSBwcmVmaXggYW5kIGV4ZWNfcHJlZml4CisgIHByZWZpeD0kcHJlZml4X3NhdmUKKyAgZXhlY19wcmVmaXg9JGV4ZWNfcHJlZml4X3NhdmUKK10pCmRpZmYgLS1naXQgYS9tNC9heF9hY19hcHBlbmRfdG9fZmlsZS5tNCBiL200L2F4X2FjX2FwcGVuZF90b19maWxlLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MmIzZDUKLS0tIC9kZXYvbnVsbAorKysgYi9tNC9heF9hY19hcHBlbmRfdG9fZmlsZS5tNApAQCAtMCwwICsxLDMyIEBACisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvYXV0b2NvbmYtYXJjaGl2ZS9heF9hY19hcHBlbmRfdG9fZmlsZS5odG1sCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBTWU5PUFNJUworIworIyAgIEFYX0FDX0FQUEVORF9UT19GSUxFKFtGSUxFXSxbREFUQV0pCisjCisjIERFU0NSSVBUSU9OCisjCisjICAgQXBwZW5kcyB0aGUgc3BlY2lmaWVkIGRhdGEgdG8gdGhlIHNwZWNpZmllZCBBdXRvY29uZiBpcyBydW4uIElmIHlvdSB3YW50CisjICAgdG8gYXBwZW5kIHRvIGEgZmlsZSB3aGVuIGNvbmZpZ3VyZSBpcyBydW4gdXNlIEFYX0FQUEVORF9UT19GSUxFIGluc3RlYWQuCisjCisjIExJQ0VOU0UKKyMKKyMgICBDb3B5cmlnaHQgKGMpIDIwMDkgQWxsYW4gQ2FmZmVlIDxhbGxhbi5jYWZmZWVAZ21haWwuY29tPgorIworIyAgIENvcHlpbmcgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGlzIGZpbGUsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZQorIyAgIHBlcm1pdHRlZCBpbiBhbnkgbWVkaXVtIHdpdGhvdXQgcm95YWx0eSBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZQorIyAgIGFuZCB0aGlzIG5vdGljZSBhcmUgcHJlc2VydmVkLiBUaGlzIGZpbGUgaXMgb2ZmZXJlZCBhcy1pcywgd2l0aG91dCBhbnkKKyMgICB3YXJyYW50eS4KKworI3NlcmlhbCAxMAorCitBQ19ERUZVTihbQVhfQUNfQVBQRU5EX1RPX0ZJTEVdLFsKK0FDX1JFUVVJUkUoW0FYX0ZJTEVfRVNDQVBFU10pCittNF9lc3lzY21kKAorQVhfRklMRV9FU0NBUEVTCitbCitwcmludGYgIiVzIiAiJDIiID4+ICIkMSIKK10pCitdKQpkaWZmIC0tZ2l0IGEvbTQvYXhfYWNfcHJpbnRfdG9fZmlsZS5tNCBiL200L2F4X2FjX3ByaW50X3RvX2ZpbGUubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQyZGZjMQotLS0gL2Rldi9udWxsCisrKyBiL200L2F4X2FjX3ByaW50X3RvX2ZpbGUubTQKQEAgLTAsMCArMSwzMiBAQAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2F1dG9jb25mLWFyY2hpdmUvYXhfYWNfcHJpbnRfdG9fZmlsZS5odG1sCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBTWU5PUFNJUworIworIyAgIEFYX0FDX1BSSU5UX1RPX0ZJTEUoW0ZJTEVdLFtEQVRBXSkKKyMKKyMgREVTQ1JJUFRJT04KKyMKKyMgICBXcml0ZXMgdGhlIHNwZWNpZmllZCBkYXRhIHRvIHRoZSBzcGVjaWZpZWQgZmlsZSB3aGVuIEF1dG9jb25mIGlzIHJ1bi4gSWYKKyMgICB5b3Ugd2FudCB0byBwcmludCB0byBhIGZpbGUgd2hlbiBjb25maWd1cmUgaXMgcnVuIHVzZSBBWF9QUklOVF9UT19GSUxFCisjICAgaW5zdGVhZC4KKyMKKyMgTElDRU5TRQorIworIyAgIENvcHlyaWdodCAoYykgMjAwOSBBbGxhbiBDYWZmZWUgPGFsbGFuLmNhZmZlZUBnbWFpbC5jb20+CisjCisjICAgQ29weWluZyBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoaXMgZmlsZSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlCisjICAgcGVybWl0dGVkIGluIGFueSBtZWRpdW0gd2l0aG91dCByb3lhbHR5IHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlCisjICAgYW5kIHRoaXMgbm90aWNlIGFyZSBwcmVzZXJ2ZWQuIFRoaXMgZmlsZSBpcyBvZmZlcmVkIGFzLWlzLCB3aXRob3V0IGFueQorIyAgIHdhcnJhbnR5LgorCisjc2VyaWFsIDEwCisKK0FDX0RFRlVOKFtBWF9BQ19QUklOVF9UT19GSUxFXSxbCittNF9lc3lzY21kKAorQUNfUkVRVUlSRShbQVhfRklMRV9FU0NBUEVTXSkKK1sKK3ByaW50ZiAiJXMiICIkMiIgPiAiJDEiCitdKQorXSkKZGlmZiAtLWdpdCBhL200L2F4X2FkZF9hbV9tYWNyb19zdGF0aWMubTQgYi9tNC9heF9hZGRfYW1fbWFjcm9fc3RhdGljLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0NDJkMjQKLS0tIC9kZXYvbnVsbAorKysgYi9tNC9heF9hZGRfYW1fbWFjcm9fc3RhdGljLm00CkBAIC0wLDAgKzEsMjggQEAKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2F1dG9jb25mLWFyY2hpdmUvYXhfYWRkX2FtX21hY3JvX3N0YXRpYy5odG1sCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBTWU5PUFNJUworIworIyAgIEFYX0FERF9BTV9NQUNST19TVEFUSUMoW1JVTEVdKQorIworIyBERVNDUklQVElPTgorIworIyAgIEFkZHMgdGhlIHNwZWNpZmllZCBydWxlIHRvICRBTUlOQ0xVREUuCisjCisjIExJQ0VOU0UKKyMKKyMgICBDb3B5cmlnaHQgKGMpIDIwMDkgVG9tIEhvd2FyZCA8dG9taG93YXJkQHVzZXJzLnNmLm5ldD4KKyMgICBDb3B5cmlnaHQgKGMpIDIwMDkgQWxsYW4gQ2FmZmVlIDxhbGxhbi5jYWZmZWVAZ21haWwuY29tPgorIworIyAgIENvcHlpbmcgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGlzIGZpbGUsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZQorIyAgIHBlcm1pdHRlZCBpbiBhbnkgbWVkaXVtIHdpdGhvdXQgcm95YWx0eSBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZQorIyAgIGFuZCB0aGlzIG5vdGljZSBhcmUgcHJlc2VydmVkLiBUaGlzIGZpbGUgaXMgb2ZmZXJlZCBhcy1pcywgd2l0aG91dCBhbnkKKyMgICB3YXJyYW50eS4KKworI3NlcmlhbCA4CisKK0FDX0RFRlVOKFtBWF9BRERfQU1fTUFDUk9fU1RBVElDXSxbCisgIEFDX1JFUVVJUkUoW0FYX0FNX01BQ1JPU19TVEFUSUNdKQorICBBWF9BQ19BUFBFTkRfVE9fRklMRShBTUlOQ0xVREVfU1RBVElDLFskMV0pCitdKQpkaWZmIC0tZ2l0IGEvbTQvYXhfYW1fbWFjcm9zX3N0YXRpYy5tNCBiL200L2F4X2FtX21hY3Jvc19zdGF0aWMubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRjZWU4YwotLS0gL2Rldi9udWxsCisrKyBiL200L2F4X2FtX21hY3Jvc19zdGF0aWMubTQKQEAgLTAsMCArMSwzOCBAQAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2F1dG9jb25mLWFyY2hpdmUvYXhfYW1fbWFjcm9zX3N0YXRpYy5odG1sCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBTWU5PUFNJUworIworIyAgIEFYX0FNX01BQ1JPU19TVEFUSUMKKyMKKyMgREVTQ1JJUFRJT04KKyMKKyMgICBBZGRzIHN1cHBvcnQgZm9yIG1hY3JvcyB0aGF0IGNyZWF0ZSBBdXRvbWFrZSBydWxlcy4gWW91IG11c3QgbWFudWFsbHkKKyMgICBhZGQgdGhlIGZvbGxvd2luZyBsaW5lCisjCisjICAgICBpbmNsdWRlICQodG9wX3NyY2RpcikvYW1pbmNsdWRlX3N0YXRpYy5hbQorIworIyAgIHRvIHlvdXIgTWFrZWZpbGUuYW0gZmlsZXMuCisjCisjIExJQ0VOU0UKKyMKKyMgICBDb3B5cmlnaHQgKGMpIDIwMDkgVG9tIEhvd2FyZCA8dG9taG93YXJkQHVzZXJzLnNmLm5ldD4KKyMgICBDb3B5cmlnaHQgKGMpIDIwMDkgQWxsYW4gQ2FmZmVlIDxhbGxhbi5jYWZmZWVAZ21haWwuY29tPgorIworIyAgIENvcHlpbmcgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGlzIGZpbGUsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZQorIyAgIHBlcm1pdHRlZCBpbiBhbnkgbWVkaXVtIHdpdGhvdXQgcm95YWx0eSBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZQorIyAgIGFuZCB0aGlzIG5vdGljZSBhcmUgcHJlc2VydmVkLiBUaGlzIGZpbGUgaXMgb2ZmZXJlZCBhcy1pcywgd2l0aG91dCBhbnkKKyMgICB3YXJyYW50eS4KKworI3NlcmlhbCAxMQorCitBQ19ERUZVTihbQU1JTkNMVURFX1NUQVRJQ10sW2FtaW5jbHVkZV9zdGF0aWMuYW1dKQorCitBQ19ERUZVTihbQVhfQU1fTUFDUk9TX1NUQVRJQ10sCitbCitBWF9BQ19QUklOVF9UT19GSUxFKEFNSU5DTFVERV9TVEFUSUMsWworIyBdQU1JTkNMVURFX1NUQVRJQ1sgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgQXV0b2NvbmYKKyMgZnJvbSBBWF9BTV9NQUNST1NfU1RBVElDIG9uIF1tNF9lc3lzY21kKFtMQ19BTEw9QyBkYXRlXSlbCitdKQorXSkKZGlmZiAtLWdpdCBhL200L2F4X2NvZGVfY292ZXJhZ2UubTQgYi9tNC9heF9jb2RlX2NvdmVyYWdlLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMzY5MjQKLS0tIC9kZXYvbnVsbAorKysgYi9tNC9heF9jb2RlX2NvdmVyYWdlLm00CkBAIC0wLDAgKzEsMjcyIEBACisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyAgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9hdXRvY29uZi1hcmNoaXZlL2F4X2NvZGVfY292ZXJhZ2UuaHRtbAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgU1lOT1BTSVMKKyMKKyMgICBBWF9DT0RFX0NPVkVSQUdFKCkKKyMKKyMgREVTQ1JJUFRJT04KKyMKKyMgICBEZWZpbmVzIENPREVfQ09WRVJBR0VfQ1BQRkxBR1MsIENPREVfQ09WRVJBR0VfQ0ZMQUdTLAorIyAgIENPREVfQ09WRVJBR0VfQ1hYRkxBR1MgYW5kIENPREVfQ09WRVJBR0VfTElCUyB3aGljaCBzaG91bGQgYmUgaW5jbHVkZWQKKyMgICBpbiB0aGUgQ1BQRkxBR1MsIENGTEFHUyBDWFhGTEFHUyBhbmQgTElCUy9MSUJBREQgdmFyaWFibGVzIG9mIGV2ZXJ5CisjICAgYnVpbGQgdGFyZ2V0IChwcm9ncmFtIG9yIGxpYnJhcnkpIHdoaWNoIHNob3VsZCBiZSBidWlsdCB3aXRoIGNvZGUKKyMgICBjb3ZlcmFnZSBzdXBwb3J0LiBBbHNvIGFkZCBydWxlcyB1c2luZyBBWF9BRERfQU1fTUFDUk9fU1RBVElDOyBhbmQKKyMgICAkZW5hYmxlX2NvZGVfY292ZXJhZ2Ugd2hpY2ggY2FuIGJlIHVzZWQgaW4gc3Vic2VxdWVudCBjb25maWd1cmUgb3V0cHV0LgorIyAgIENPREVfQ09WRVJBR0VfRU5BQkxFRCBpcyBkZWZpbmVkIGFuZCBzdWJzdGl0dXRlZCwgYW5kIGNvcnJlc3BvbmRzIHRvIHRoZQorIyAgIHZhbHVlIG9mIHRoZSAtLWVuYWJsZS1jb2RlLWNvdmVyYWdlIG9wdGlvbiwgd2hpY2ggZGVmYXVsdHMgdG8gYmVpbmcKKyMgICBkaXNhYmxlZC4KKyMKKyMgICBUZXN0IGFsc28gZm9yIGdjb3YgcHJvZ3JhbSBhbmQgY3JlYXRlIEdDT1YgdmFyaWFibGUgdGhhdCBjb3VsZCBiZQorIyAgIHN1YnN0aXR1dGVkLgorIworIyAgIE5vdGUgdGhhdCBhbGwgb3B0aW1pemF0aW9uIGZsYWdzIGluIENGTEFHUyBtdXN0IGJlIGRpc2FibGVkIHdoZW4gY29kZQorIyAgIGNvdmVyYWdlIGlzIGVuYWJsZWQuCisjCisjICAgVXNhZ2UgZXhhbXBsZToKKyMKKyMgICBjb25maWd1cmUuYWM6CisjCisjICAgICBBWF9DT0RFX0NPVkVSQUdFCisjCisjICAgTWFrZWZpbGUuYW06CisjCisjICAgICBpbmNsdWRlICQodG9wX3NyY2RpcikvYW1pbmNsdWRlX3N0YXRpYy5hbQorIworIyAgICAgbXlfcHJvZ3JhbV9MSUJTID0gLi4uICQoQ09ERV9DT1ZFUkFHRV9MSUJTKSAuLi4KKyMgICAgIG15X3Byb2dyYW1fQ1BQRkxBR1MgPSAuLi4gJChDT0RFX0NPVkVSQUdFX0NQUEZMQUdTKSAuLi4KKyMgICAgIG15X3Byb2dyYW1fQ0ZMQUdTID0gLi4uICQoQ09ERV9DT1ZFUkFHRV9DRkxBR1MpIC4uLgorIyAgICAgbXlfcHJvZ3JhbV9DWFhGTEFHUyA9IC4uLiAkKENPREVfQ09WRVJBR0VfQ1hYRkxBR1MpIC4uLgorIworIyAgICAgY2xlYW4tbG9jYWw6IGNvZGUtY292ZXJhZ2UtY2xlYW4KKyMgICAgIGRpc3RjbGVhbi1sb2NhbDogY29kZS1jb3ZlcmFnZS1kaXN0LWNsZWFuCisjCisjICAgVGhpcyByZXN1bHRzIGluIGEgImNoZWNrLWNvZGUtY292ZXJhZ2UiIHJ1bGUgYmVpbmcgYWRkZWQgdG8gYW55CisjICAgTWFrZWZpbGUuYW0gd2hpY2ggZG8gImluY2x1ZGUgJCh0b3Bfc3JjZGlyKS9hbWluY2x1ZGVfc3RhdGljLmFtIgorIyAgIChhc3N1bWluZyB0aGUgbW9kdWxlIGhhcyBiZWVuIGNvbmZpZ3VyZWQgd2l0aCAtLWVuYWJsZS1jb2RlLWNvdmVyYWdlKS4KKyMgICBSdW5uaW5nIGBtYWtlIGNoZWNrLWNvZGUtY292ZXJhZ2VgIGluIHRoYXQgZGlyZWN0b3J5IHdpbGwgcnVuIHRoZQorIyAgIG1vZHVsZSdzIHRlc3Qgc3VpdGUgKGBtYWtlIGNoZWNrYCkgYW5kIGJ1aWxkIGEgY29kZSBjb3ZlcmFnZSByZXBvcnQKKyMgICBkZXRhaWxpbmcgdGhlIGNvZGUgd2hpY2ggd2FzIHRvdWNoZWQsIHRoZW4gcHJpbnQgdGhlIFVSSSBmb3IgdGhlIHJlcG9ydC4KKyMKKyMgICBUaGlzIGNvZGUgd2FzIGRlcml2ZWQgZnJvbSBNYWtlZmlsZS5kZWNsIGluIEdMaWIsIG9yaWdpbmFsbHkgbGljZW5zZWQKKyMgICB1bmRlciBMR1BMdjIuMSsuCisjCisjIExJQ0VOU0UKKyMKKyMgICBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTYgUGhpbGlwIFdpdGhuYWxsCisjICAgQ29weXJpZ2h0IChjKSAyMDEyIFhhbiBMb3BlegorIyAgIENvcHlyaWdodCAoYykgMjAxMiBDaHJpc3RpYW4gUGVyc2NoCisjICAgQ29weXJpZ2h0IChjKSAyMDEyIFBhb2xvIEJvcmVsbGkKKyMgICBDb3B5cmlnaHQgKGMpIDIwMTIgRGFuIFdpbnNoaXAKKyMgICBDb3B5cmlnaHQgKGMpIDIwMTUsMjAxOCBCYXN0aWVuIFJPVUNBUklFUworIworIyAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisjICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyMgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorIyAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIExlc3NlcgorIyAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworI3NlcmlhbCAzMgorCittNF9kZWZpbmUoX0FYX0NPREVfQ09WRVJBR0VfUlVMRVMsWworQVhfQUREX0FNX01BQ1JPX1NUQVRJQyhbCisjIENvZGUgY292ZXJhZ2UKKyMKKyMgT3B0aW9uYWw6CisjICAtIENPREVfQ09WRVJBR0VfRElSRUNUT1JZOiBUb3AtbGV2ZWwgZGlyZWN0b3J5IGZvciBjb2RlIGNvdmVyYWdlIHJlcG9ydGluZy4KKyMgICAgTXVsdGlwbGUgZGlyZWN0b3JpZXMgbWF5IGJlIHNwZWNpZmllZCwgc2VwYXJhdGVkIGJ5IHdoaXRlc3BhY2UuCisjICAgIChEZWZhdWx0OiBcJCh0b3BfYnVpbGRkaXIpKQorIyAgLSBDT0RFX0NPVkVSQUdFX09VVFBVVF9GSUxFOiBGaWxlbmFtZSBhbmQgcGF0aCBmb3IgdGhlIC5pbmZvIGZpbGUgZ2VuZXJhdGVkCisjICAgIGJ5IGxjb3YgZm9yIGNvZGUgY292ZXJhZ2UuIChEZWZhdWx0OgorIyAgICBcJChQQUNLQUdFX05BTUUpLVwkKFBBQ0tBR0VfVkVSU0lPTiktY292ZXJhZ2UuaW5mbykKKyMgIC0gQ09ERV9DT1ZFUkFHRV9PVVRQVVRfRElSRUNUT1JZOiBEaXJlY3RvcnkgZm9yIGdlbmVyYXRlZCBjb2RlIGNvdmVyYWdlCisjICAgIHJlcG9ydHMgdG8gYmUgY3JlYXRlZC4gKERlZmF1bHQ6CisjICAgIFwkKFBBQ0tBR0VfTkFNRSktXCQoUEFDS0FHRV9WRVJTSU9OKS1jb3ZlcmFnZSkKKyMgIC0gQ09ERV9DT1ZFUkFHRV9CUkFOQ0hfQ09WRVJBR0U6IFNldCB0byAxIHRvIGVuZm9yY2UgYnJhbmNoIGNvdmVyYWdlLAorIyAgICBzZXQgdG8gMCB0byBkaXNhYmxlIGl0IGFuZCBsZWF2ZSBlbXB0eSB0byBzdGF5IHdpdGggdGhlIGRlZmF1bHQuCisjICAgIChEZWZhdWx0OiBlbXB0eSkKKyMgIC0gQ09ERV9DT1ZFUkFHRV9MQ09WX1NIT1BUU19ERUZBVUxUOiBFeHRyYSBvcHRpb25zIHNoYXJlZCBiZXR3ZWVuIGJvdGggbGNvdgorIyAgICBpbnN0YW5jZXMuIChEZWZhdWx0OiBiYXNlZCBvbiAkQ09ERV9DT1ZFUkFHRV9CUkFOQ0hfQ09WRVJBR0UpCisjICAtIENPREVfQ09WRVJBR0VfTENPVl9TSE9QVFM6IEV4dHJhIG9wdGlvbnMgdG8gc2hhcmVkIGJldHdlZW4gYm90aCBsY292CisjICAgIGluc3RhbmNlcy4gKERlZmF1bHQ6ICRDT0RFX0NPVkVSQUdFX0xDT1ZfU0hPUFRTX0RFRkFVTFQpCisjICAtIENPREVfQ09WRVJBR0VfTENPVl9PUFRJT05TX0dDT1ZQQVRIOiAtLWdjb3YtdG9vbCBwYXRodG9nY292CisjICAtIENPREVfQ09WRVJBR0VfTENPVl9PUFRJT05TX0RFRkFVTFQ6IEV4dHJhIG9wdGlvbnMgdG8gcGFzcyB0byB0aGUKKyMgICAgY29sbGVjdGluZyBsY292IGluc3RhbmNlLiAoRGVmYXVsdDogJENPREVfQ09WRVJBR0VfTENPVl9PUFRJT05TX0dDT1ZQQVRIKQorIyAgLSBDT0RFX0NPVkVSQUdFX0xDT1ZfT1BUSU9OUzogRXh0cmEgb3B0aW9ucyB0byBwYXNzIHRvIHRoZSBjb2xsZWN0aW5nIGxjb3YKKyMgICAgaW5zdGFuY2UuIChEZWZhdWx0OiAkQ09ERV9DT1ZFUkFHRV9MQ09WX09QVElPTlNfREVGQVVMVCkKKyMgIC0gQ09ERV9DT1ZFUkFHRV9MQ09WX1JNT1BUU19ERUZBVUxUOiBFeHRyYSBvcHRpb25zIHRvIHBhc3MgdG8gdGhlIGZpbHRlcmluZworIyAgICBsY292IGluc3RhbmNlLiAoRGVmYXVsdDogZW1wdHkpCisjICAtIENPREVfQ09WRVJBR0VfTENPVl9STU9QVFM6IEV4dHJhIG9wdGlvbnMgdG8gcGFzcyB0byB0aGUgZmlsdGVyaW5nIGxjb3YKKyMgICAgaW5zdGFuY2UuIChEZWZhdWx0OiAkQ09ERV9DT1ZFUkFHRV9MQ09WX1JNT1BUU19ERUZBVUxUKQorIyAgLSBDT0RFX0NPVkVSQUdFX0dFTkhUTUxfT1BUSU9OU19ERUZBVUxUOiBFeHRyYSBvcHRpb25zIHRvIHBhc3MgdG8gdGhlCisjICAgIGdlbmh0bWwgaW5zdGFuY2UuIChEZWZhdWx0OiBiYXNlZCBvbiAkQ09ERV9DT1ZFUkFHRV9CUkFOQ0hfQ09WRVJBR0UpCisjICAtIENPREVfQ09WRVJBR0VfR0VOSFRNTF9PUFRJT05TOiBFeHRyYSBvcHRpb25zIHRvIHBhc3MgdG8gdGhlIGdlbmh0bWwKKyMgICAgaW5zdGFuY2UuIChEZWZhdWx0OiAkQ09ERV9DT1ZFUkFHRV9HRU5IVE1MX09QVElPTlNfREVGQVVMVCkKKyMgIC0gQ09ERV9DT1ZFUkFHRV9JR05PUkVfUEFUVEVSTjogRXh0cmEgZ2xvYiBwYXR0ZXJuIG9mIGZpbGVzIHRvIGlnbm9yZQorIworIyBUaGUgZ2VuZXJhdGVkIHJlcG9ydCB3aWxsIGJlIHRpdGxlZCB1c2luZyB0aGUgXCQoUEFDS0FHRV9OQU1FKSBhbmQKKyMgXCQoUEFDS0FHRV9WRVJTSU9OKS4gSW4gb3JkZXIgdG8gYWRkIHRoZSBjdXJyZW50IGdpdCBoYXNoIHRvIHRoZSB0aXRsZSwKKyMgdXNlIHRoZSBnaXQtdmVyc2lvbi1nZW4gc2NyaXB0LCBhdmFpbGFibGUgb25saW5lLgorIyBPcHRpb25hbCB2YXJpYWJsZXMKKyMgcnVuIG9ubHkgb24gdG9wIGRpcgoraWYgQ09ERV9DT1ZFUkFHRV9FTkFCTEVECisgaWZlcSAoXCQoYWJzX2J1aWxkZGlyKSwgXCQoYWJzX3RvcF9idWlsZGRpcikpCitDT0RFX0NPVkVSQUdFX0RJUkVDVE9SWSA/PSBcJCh0b3BfYnVpbGRkaXIpCitDT0RFX0NPVkVSQUdFX09VVFBVVF9GSUxFID89IFwkKFBBQ0tBR0VfTkFNRSktXCQoUEFDS0FHRV9WRVJTSU9OKS1jb3ZlcmFnZS5pbmZvCitDT0RFX0NPVkVSQUdFX09VVFBVVF9ESVJFQ1RPUlkgPz0gXCQoUEFDS0FHRV9OQU1FKS1cJChQQUNLQUdFX1ZFUlNJT04pLWNvdmVyYWdlCisKK0NPREVfQ09WRVJBR0VfQlJBTkNIX0NPVkVSQUdFID89CitDT0RFX0NPVkVSQUdFX0xDT1ZfU0hPUFRTX0RFRkFVTFQgPz0gXCQoaWYgXCQoQ09ERV9DT1ZFUkFHRV9CUkFOQ0hfQ09WRVJBR0UpLFwKKy0tcmMgbGNvdl9icmFuY2hfY292ZXJhZ2U9XCQoQ09ERV9DT1ZFUkFHRV9CUkFOQ0hfQ09WRVJBR0UpKQorQ09ERV9DT1ZFUkFHRV9MQ09WX1NIT1BUUyA/PSBcJChDT0RFX0NPVkVSQUdFX0xDT1ZfU0hPUFRTX0RFRkFVTFQpCitDT0RFX0NPVkVSQUdFX0xDT1ZfT1BUSU9OU19HQ09WUEFUSCA/PSAtLWdjb3YtdG9vbCBcIlwkKEdDT1YpXCIKK0NPREVfQ09WRVJBR0VfTENPVl9PUFRJT05TX0RFRkFVTFQgPz0gXCQoQ09ERV9DT1ZFUkFHRV9MQ09WX09QVElPTlNfR0NPVlBBVEgpCitDT0RFX0NPVkVSQUdFX0xDT1ZfT1BUSU9OUyA/PSBcJChDT0RFX0NPVkVSQUdFX0xDT1ZfT1BUSU9OU19ERUZBVUxUKQorQ09ERV9DT1ZFUkFHRV9MQ09WX1JNT1BUU19ERUZBVUxUID89CitDT0RFX0NPVkVSQUdFX0xDT1ZfUk1PUFRTID89IFwkKENPREVfQ09WRVJBR0VfTENPVl9STU9QVFNfREVGQVVMVCkKK0NPREVfQ09WRVJBR0VfR0VOSFRNTF9PUFRJT05TX0RFRkFVTFQgPz1cCitcJChpZiBcJChDT0RFX0NPVkVSQUdFX0JSQU5DSF9DT1ZFUkFHRSksXAorLS1yYyBnZW5odG1sX2JyYW5jaF9jb3ZlcmFnZT1cJChDT0RFX0NPVkVSQUdFX0JSQU5DSF9DT1ZFUkFHRSkpCitDT0RFX0NPVkVSQUdFX0dFTkhUTUxfT1BUSU9OUyA/PSBcJChDT0RFX0NPVkVSQUdFX0dFTkhUTUxfT1BUSU9OU19ERUZBVUxUKQorQ09ERV9DT1ZFUkFHRV9JR05PUkVfUEFUVEVSTiA/PQorCitHSVRJR05PUkVGSUxFUyA9IFwkKEdJVElHTk9SRUZJTEVTKSBcJChDT0RFX0NPVkVSQUdFX09VVFBVVF9GSUxFKSBcJChDT0RFX0NPVkVSQUdFX09VVFBVVF9ESVJFQ1RPUlkpCitjb2RlX2NvdmVyYWdlX3ZfbGNvdl9jYXAgPSBcJChjb2RlX2NvdmVyYWdlX3ZfbGNvdl9jYXBfXCQoVikpCitjb2RlX2NvdmVyYWdlX3ZfbGNvdl9jYXBfID0gXCQoY29kZV9jb3ZlcmFnZV92X2xjb3ZfY2FwX1wkKEFNX0RFRkFVTFRfVkVSQk9TSVRZKSkKK2NvZGVfY292ZXJhZ2Vfdl9sY292X2NhcF8wID0gQGVjaG8gXCIgIExDT1YgICAtLWNhcHR1cmVcIiBcJChDT0RFX0NPVkVSQUdFX09VVFBVVF9GSUxFKTsKK2NvZGVfY292ZXJhZ2Vfdl9sY292X2lnbiA9IFwkKGNvZGVfY292ZXJhZ2Vfdl9sY292X2lnbl9cJChWKSkKK2NvZGVfY292ZXJhZ2Vfdl9sY292X2lnbl8gPSBcJChjb2RlX2NvdmVyYWdlX3ZfbGNvdl9pZ25fXCQoQU1fREVGQVVMVF9WRVJCT1NJVFkpKQorY29kZV9jb3ZlcmFnZV92X2xjb3ZfaWduXzAgPSBAZWNobyBcIiAgTENPViAgIC0tcmVtb3ZlIC90bXAvKlwiIFwkKENPREVfQ09WRVJBR0VfSUdOT1JFX1BBVFRFUk4pOworY29kZV9jb3ZlcmFnZV92X2dlbmh0bWwgPSBcJChjb2RlX2NvdmVyYWdlX3ZfZ2VuaHRtbF9cJChWKSkKK2NvZGVfY292ZXJhZ2Vfdl9nZW5odG1sXyA9IFwkKGNvZGVfY292ZXJhZ2Vfdl9nZW5odG1sX1wkKEFNX0RFRkFVTFRfVkVSQk9TSVRZKSkKK2NvZGVfY292ZXJhZ2Vfdl9nZW5odG1sXzAgPSBAZWNobyBcIiAgR0VOICAgXCIgXCJcJChDT0RFX0NPVkVSQUdFX09VVFBVVF9ESVJFQ1RPUlkpXCI7Citjb2RlX2NvdmVyYWdlX3F1aWV0ID0gXCQoY29kZV9jb3ZlcmFnZV9xdWlldF9cJChWKSkKK2NvZGVfY292ZXJhZ2VfcXVpZXRfID0gXCQoY29kZV9jb3ZlcmFnZV9xdWlldF9cJChBTV9ERUZBVUxUX1ZFUkJPU0lUWSkpCitjb2RlX2NvdmVyYWdlX3F1aWV0XzAgPSAtLXF1aWV0CisKKyMgc2FuaXRpemVzIHRoZSB0ZXN0LW5hbWU6IHJlcGxhY2VzIHdpdGggdW5kZXJzY29yZXM6IGRhc2hlcyBhbmQgZG90cworY29kZV9jb3ZlcmFnZV9zYW5pdGl6ZSA9IFwkKHN1YnN0IC0sXyxcJChzdWJzdCAuLF8sXCQoMSkpKQorCisjIFVzZSByZWN1cnNpdmUgbWFrZXMgaW4gb3JkZXIgdG8gaWdub3JlIGVycm9ycyBkdXJpbmcgY2hlY2sKK2NoZWNrLWNvZGUtY292ZXJhZ2U6CisJLVwkKEFNX1ZfYXQpXCQoTUFLRSkgXCQoQU1fTUFLRUZMQUdTKSAtayBjaGVjaworCVwkKEFNX1ZfYXQpXCQoTUFLRSkgXCQoQU1fTUFLRUZMQUdTKSBjb2RlLWNvdmVyYWdlLWNhcHR1cmUKKworIyBDYXB0dXJlIGNvZGUgY292ZXJhZ2UgZGF0YQorY29kZS1jb3ZlcmFnZS1jYXB0dXJlOiBjb2RlLWNvdmVyYWdlLWNhcHR1cmUtaG9vaworCVwkKGNvZGVfY292ZXJhZ2Vfdl9sY292X2NhcClcJChMQ09WKSBcJChjb2RlX2NvdmVyYWdlX3F1aWV0KSBcJChhZGRwcmVmaXggLS1kaXJlY3RvcnkgLFwkKENPREVfQ09WRVJBR0VfRElSRUNUT1JZKSkgLS1jYXB0dXJlIC0tb3V0cHV0LWZpbGUgXCJcJChDT0RFX0NPVkVSQUdFX09VVFBVVF9GSUxFKS50bXBcIiAtLXRlc3QtbmFtZSBcIlwkKGNhbGwgY29kZV9jb3ZlcmFnZV9zYW5pdGl6ZSxcJChQQUNLQUdFX05BTUUpLVwkKFBBQ0tBR0VfVkVSU0lPTikpXCIgLS1uby1jaGVja3N1bSAtLWNvbXBhdC1saWJ0b29sIFwkKENPREVfQ09WRVJBR0VfTENPVl9TSE9QVFMpIFwkKENPREVfQ09WRVJBR0VfTENPVl9PUFRJT05TKQorCVwkKGNvZGVfY292ZXJhZ2Vfdl9sY292X2lnbilcJChMQ09WKSBcJChjb2RlX2NvdmVyYWdlX3F1aWV0KSBcJChhZGRwcmVmaXggLS1kaXJlY3RvcnkgLFwkKENPREVfQ09WRVJBR0VfRElSRUNUT1JZKSkgLS1yZW1vdmUgXCJcJChDT0RFX0NPVkVSQUdFX09VVFBVVF9GSUxFKS50bXBcIiBcIi90bXAvKlwiIFwkKENPREVfQ09WRVJBR0VfSUdOT1JFX1BBVFRFUk4pIC0tb3V0cHV0LWZpbGUgXCJcJChDT0RFX0NPVkVSQUdFX09VVFBVVF9GSUxFKVwiIFwkKENPREVfQ09WRVJBR0VfTENPVl9TSE9QVFMpIFwkKENPREVfQ09WRVJBR0VfTENPVl9STU9QVFMpCisJLUBybSAtZiBcIlwkKENPREVfQ09WRVJBR0VfT1VUUFVUX0ZJTEUpLnRtcFwiCisJXCQoY29kZV9jb3ZlcmFnZV92X2dlbmh0bWwpTEFORz1DIFwkKEdFTkhUTUwpIFwkKGNvZGVfY292ZXJhZ2VfcXVpZXQpIFwkKGFkZHByZWZpeCAtLXByZWZpeCAsXCQoQ09ERV9DT1ZFUkFHRV9ESVJFQ1RPUlkpKSAtLW91dHB1dC1kaXJlY3RvcnkgXCJcJChDT0RFX0NPVkVSQUdFX09VVFBVVF9ESVJFQ1RPUlkpXCIgLS10aXRsZSBcIlwkKFBBQ0tBR0VfTkFNRSktXCQoUEFDS0FHRV9WRVJTSU9OKSBDb2RlIENvdmVyYWdlXCIgLS1sZWdlbmQgLS1zaG93LWRldGFpbHMgXCJcJChDT0RFX0NPVkVSQUdFX09VVFBVVF9GSUxFKVwiIFwkKENPREVfQ09WRVJBR0VfR0VOSFRNTF9PUFRJT05TKQorCUBlY2hvIFwiZmlsZTovL1wkKGFic19idWlsZGRpcikvXCQoQ09ERV9DT1ZFUkFHRV9PVVRQVVRfRElSRUNUT1JZKS9pbmRleC5odG1sXCIKKworY29kZS1jb3ZlcmFnZS1jbGVhbjoKKwktXCQoTENPVikgLS1kaXJlY3RvcnkgXCQodG9wX2J1aWxkZGlyKSAtegorCS1ybSAtcmYgXCJcJChDT0RFX0NPVkVSQUdFX09VVFBVVF9GSUxFKVwiIFwiXCQoQ09ERV9DT1ZFUkFHRV9PVVRQVVRfRklMRSkudG1wXCIgXCJcJChDT0RFX0NPVkVSQUdFX09VVFBVVF9ESVJFQ1RPUlkpXCIKKwktZmluZCAuIFxcKCAtbmFtZSBcIiouZ2NkYVwiIC1vIC1uYW1lIFwiKi5nY25vXCIgLW8gLW5hbWUgXCIqLmdjb3ZcIiBcXCkgLWRlbGV0ZQorCitjb2RlLWNvdmVyYWdlLWRpc3QtY2xlYW46CisKK0FdW01fRElTVENIRUNLX0NPTkZJR1VSRV9GTEFHUyA9IFwkKEFdW01fRElTVENIRUNLX0NPTkZJR1VSRV9GTEFHUykgLS1kaXNhYmxlLWNvZGUtY292ZXJhZ2UKKyBlbHNlICMgaWZuZXEgKFwkKGFic19idWlsZGRpciksIFwkKGFic190b3BfYnVpbGRkaXIpKQorY2hlY2stY29kZS1jb3ZlcmFnZToKKworY29kZS1jb3ZlcmFnZS1jYXB0dXJlOiBjb2RlLWNvdmVyYWdlLWNhcHR1cmUtaG9vaworCitjb2RlLWNvdmVyYWdlLWNsZWFuOgorCitjb2RlLWNvdmVyYWdlLWRpc3QtY2xlYW46CisgZW5kaWYgIyBpZmVxIChcJChhYnNfYnVpbGRkaXIpLCBcJChhYnNfdG9wX2J1aWxkZGlyKSkKK2Vsc2UgIyEgQ09ERV9DT1ZFUkFHRV9FTkFCTEVECisjIFVzZSByZWN1cnNpdmUgbWFrZXMgaW4gb3JkZXIgdG8gaWdub3JlIGVycm9ycyBkdXJpbmcgY2hlY2sKK2NoZWNrLWNvZGUtY292ZXJhZ2U6CisJQGVjaG8gXCJOZWVkIHRvIHJlY29uZmlndXJlIHdpdGggLS1lbmFibGUtY29kZS1jb3ZlcmFnZVwiCisjIENhcHR1cmUgY29kZSBjb3ZlcmFnZSBkYXRhCitjb2RlLWNvdmVyYWdlLWNhcHR1cmU6IGNvZGUtY292ZXJhZ2UtY2FwdHVyZS1ob29rCisJQGVjaG8gXCJOZWVkIHRvIHJlY29uZmlndXJlIHdpdGggLS1lbmFibGUtY29kZS1jb3ZlcmFnZVwiCisKK2NvZGUtY292ZXJhZ2UtY2xlYW46CisKK2NvZGUtY292ZXJhZ2UtZGlzdC1jbGVhbjoKKworZW5kaWYgI0NPREVfQ09WRVJBR0VfRU5BQkxFRAorIyBIb29rIHJ1bGUgZXhlY3V0ZWQgYmVmb3JlIGNvZGUtY292ZXJhZ2UtY2FwdHVyZSwgb3ZlcnJpZGFibGUgYnkgdGhlIHVzZXIKK2NvZGUtY292ZXJhZ2UtY2FwdHVyZS1ob29rOgorCisuUEhPTlk6IGNoZWNrLWNvZGUtY292ZXJhZ2UgY29kZS1jb3ZlcmFnZS1jYXB0dXJlIGNvZGUtY292ZXJhZ2UtZGlzdC1jbGVhbiBjb2RlLWNvdmVyYWdlLWNsZWFuIGNvZGUtY292ZXJhZ2UtY2FwdHVyZS1ob29rCitdKQorXSkKKworQUNfREVGVU4oW19BWF9DT0RFX0NPVkVSQUdFX0VOQUJMRURdLFsKKwlBWF9DSEVDS19HTlVfTUFLRShbXSxbQUNfTVNHX0VSUk9SKFtub3QgdXNpbmcgR05VIG1ha2UgdGhhdCBpcyBuZWVkZWQgZm9yIGNvdmVyYWdlXSldKQorCUFDX1JFUVVJUkUoW0FYX0FERF9BTV9NQUNST19TVEFUSUNdKQorCSMgY2hlY2sgZm9yIGdjb3YKKwlBQ19DSEVDS19UT09MKFtHQ09WXSwKKwkJICBbJF9BWF9DT0RFX0NPVkVSQUdFX0dDT1ZfUFJPR19XSVRIXSwKKwkJICBbOl0pCisJQVNfSUYoW3Rlc3QgIlgkR0NPViIgPSAiWDoiXSwKKwkgICAgICBbQUNfTVNHX0VSUk9SKFtnY292IGlzIG5lZWRlZCB0byBkbyBjb3ZlcmFnZV0pXSkKKwlBQ19TVUJTVChbR0NPVl0pCisKKwlkbmwgQ2hlY2sgaWYgZ2NjIGlzIGJlaW5nIHVzZWQKKwlBU19JRihbIHRlc3QgIiRHQ0MiID0gIm5vIiBdLCBbCisJCUFDX01TR19FUlJPUihbbm90IGNvbXBpbGluZyB3aXRoIGdjYywgd2hpY2ggaXMgcmVxdWlyZWQgZm9yIGdjb3YgY29kZSBjb3ZlcmFnZV0pCisJICAgICAgXSkKKworCUFDX0NIRUNLX1BST0coW0xDT1ZdLCBbbGNvdl0sIFtsY292XSkKKwlBQ19DSEVDS19QUk9HKFtHRU5IVE1MXSwgW2dlbmh0bWxdLCBbZ2VuaHRtbF0pCisKKwlBU19JRihbIHRlc3QgeCIkTENPViIgPSB4IF0sIFsKKwkJQUNfTVNHX0VSUk9SKFtUbyBlbmFibGUgY29kZSBjb3ZlcmFnZSByZXBvcnRpbmcgeW91IG11c3QgaGF2ZSBsY292IGluc3RhbGxlZF0pCisJICAgICAgXSkKKworCUFTX0lGKFsgdGVzdCB4IiRHRU5IVE1MIiA9IHggXSwgWworCQlBQ19NU0dfRVJST1IoW0NvdWxkIG5vdCBmaW5kIGdlbmh0bWwgZnJvbSB0aGUgbGNvdiBwYWNrYWdlXSkKKwldKQorCisJZG5sIEJ1aWxkIHRoZSBjb2RlIGNvdmVyYWdlIGZsYWdzCisJZG5sIERlZmluZSBDT0RFX0NPVkVSQUdFX0xERkxBR1MgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CisJQ09ERV9DT1ZFUkFHRV9DUFBGTEFHUz0iLUROREVCVUciCisJQ09ERV9DT1ZFUkFHRV9DRkxBR1M9Ii1PMCAtZyAtZnByb2ZpbGUtYXJjcyAtZnRlc3QtY292ZXJhZ2UiCisJQ09ERV9DT1ZFUkFHRV9DWFhGTEFHUz0iLU8wIC1nIC1mcHJvZmlsZS1hcmNzIC1mdGVzdC1jb3ZlcmFnZSIKKwlDT0RFX0NPVkVSQUdFX0xJQlM9Ii1sZ2NvdiIKKworCUFDX1NVQlNUKFtDT0RFX0NPVkVSQUdFX0NQUEZMQUdTXSkKKwlBQ19TVUJTVChbQ09ERV9DT1ZFUkFHRV9DRkxBR1NdKQorCUFDX1NVQlNUKFtDT0RFX0NPVkVSQUdFX0NYWEZMQUdTXSkKKwlBQ19TVUJTVChbQ09ERV9DT1ZFUkFHRV9MSUJTXSkKK10pCisKK0FDX0RFRlVOKFtBWF9DT0RFX0NPVkVSQUdFXSxbCisJZG5sIENoZWNrIGZvciAtLWVuYWJsZS1jb2RlLWNvdmVyYWdlCisKKwkjIGFsbG93IHRvIG92ZXJyaWRlIGdjb3YgbG9jYXRpb24KKwlBQ19BUkdfV0lUSChbZ2Nvdl0sCisJICBbQVNfSEVMUF9TVFJJTkcoWy0td2l0aC1nY292Wz1HQ09WXV0sIFt1c2UgZ2l2ZW4gR0NPViBmb3IgY292ZXJhZ2UgKEdDT1Y9Z2NvdikuXSldLAorCSAgW19BWF9DT0RFX0NPVkVSQUdFX0dDT1ZfUFJPR19XSVRIPSR3aXRoX2djb3ZdLAorCSAgW19BWF9DT0RFX0NPVkVSQUdFX0dDT1ZfUFJPR19XSVRIPWdjb3ZdKQorCisJQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRvIGJ1aWxkIHdpdGggY29kZSBjb3ZlcmFnZSBzdXBwb3J0XSkKKwlBQ19BUkdfRU5BQkxFKFtjb2RlLWNvdmVyYWdlXSwKKwkgIEFTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1jb2RlLWNvdmVyYWdlXSwKKwkgIFtXaGV0aGVyIHRvIGVuYWJsZSBjb2RlIGNvdmVyYWdlIHN1cHBvcnRdKSwsCisJICBlbmFibGVfY29kZV9jb3ZlcmFnZT1ubykKKworCUFNX0NPTkRJVElPTkFMKFtDT0RFX0NPVkVSQUdFX0VOQUJMRURdLCBbdGVzdCAieCRlbmFibGVfY29kZV9jb3ZlcmFnZSIgPSB4eWVzXSkKKwlBQ19TVUJTVChbQ09ERV9DT1ZFUkFHRV9FTkFCTEVEXSwgWyRlbmFibGVfY29kZV9jb3ZlcmFnZV0pCisJQUNfTVNHX1JFU1VMVCgkZW5hYmxlX2NvZGVfY292ZXJhZ2UpCisKKwlBU19JRihbIHRlc3QgIngkZW5hYmxlX2NvZGVfY292ZXJhZ2UiID0geHllcyBdLCBbCisJCV9BWF9DT0RFX0NPVkVSQUdFX0VOQUJMRUQKKwkgICAgICBdKQorCisJX0FYX0NPREVfQ09WRVJBR0VfUlVMRVMKK10pCmRpZmYgLS1naXQgYS9tNC9heF9maWxlX2VzY2FwZXMubTQgYi9tNC9heF9maWxlX2VzY2FwZXMubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg2ZmRjMwotLS0gL2Rldi9udWxsCisrKyBiL200L2F4X2ZpbGVfZXNjYXBlcy5tNApAQCAtMCwwICsxLDMwIEBACisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyAgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9hdXRvY29uZi1hcmNoaXZlL2F4X2ZpbGVfZXNjYXBlcy5odG1sCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBTWU5PUFNJUworIworIyAgIEFYX0ZJTEVfRVNDQVBFUworIworIyBERVNDUklQVElPTgorIworIyAgIFdyaXRlcyB0aGUgc3BlY2lmaWVkIGRhdGEgdG8gdGhlIHNwZWNpZmllZCBmaWxlLgorIworIyBMSUNFTlNFCisjCisjICAgQ29weXJpZ2h0IChjKSAyMDA4IFRvbSBIb3dhcmQgPHRvbWhvd2FyZEB1c2Vycy5zZi5uZXQ+CisjCisjICAgQ29weWluZyBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoaXMgZmlsZSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlCisjICAgcGVybWl0dGVkIGluIGFueSBtZWRpdW0gd2l0aG91dCByb3lhbHR5IHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlCisjICAgYW5kIHRoaXMgbm90aWNlIGFyZSBwcmVzZXJ2ZWQuIFRoaXMgZmlsZSBpcyBvZmZlcmVkIGFzLWlzLCB3aXRob3V0IGFueQorIyAgIHdhcnJhbnR5LgorCisjc2VyaWFsIDgKKworQUNfREVGVU4oW0FYX0ZJTEVfRVNDQVBFU10sWworQVhfRE9MTEFSPSJcJCIKK0FYX1NSQj0iXFwxMzUiCitBWF9TTEI9IlxcMTMzIgorQVhfQlM9IlxcXFwiCitBWF9EUT0iXCIiCitdKQpkaWZmIC0tZ2l0IGEvbTQvbGQtdmVyc2lvbi1zY3JpcHQubTQgYi9tNC9sZC12ZXJzaW9uLXNjcmlwdC5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjhmNTJmCi0tLSAvZGV2L251bGwKKysrIGIvbTQvbGQtdmVyc2lvbi1zY3JpcHQubTQKQEAgLTAsMCArMSw0MyBAQAorIyBsZC12ZXJzaW9uLXNjcmlwdC5tNCBzZXJpYWwgMQorZG5sIENvcHlyaWdodCAoQykgMjAwOCwgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK2RubCBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorZG5sIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCitkbmwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCitkbmwgRnJvbSBTaW1vbiBKb3NlZnNzb24KKworIyBGSVhNRTogVGhlIHRlc3QgYmVsb3cgcmV0dXJucyBhIGZhbHNlIHBvc2l0aXZlIGZvciBtaW5ndworIyBjcm9zcy1jb21waWxlcywgJ2xvY2FsOicgc3RhdGVtZW50cyBkb2VzIG5vdCByZWR1Y2UgbnVtYmVyIG9mCisjIGV4cG9ydGVkIHN5bWJvbHMgaW4gYSBETEwuICBVc2UgLS1kaXNhYmxlLWxkLXZlcnNpb24tc2NyaXB0IHRvIHdvcmsKKyMgYXJvdW5kIHRoZSBwcm9ibGVtLgorCisjIGdsX0xEX1ZFUlNJT05fU0NSSVBUCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENoZWNrIGlmIExEIHN1cHBvcnRzIGxpbmtlciBzY3JpcHRzLCBhbmQgZGVmaW5lIGF1dG9tYWtlIGNvbmRpdGlvbmFsCisjIEhBVkVfTERfVkVSU0lPTl9TQ1JJUFQgaWYgc28uCitBQ19ERUZVTihbZ2xfTERfVkVSU0lPTl9TQ1JJUFRdLAorWworICBBQ19BUkdfRU5BQkxFKFtsZC12ZXJzaW9uLXNjcmlwdF0sCisgICAgQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLWxkLXZlcnNpb24tc2NyaXB0XSwKKyAgICAgIFtlbmFibGUgbGlua2VyIHZlcnNpb24gc2NyaXB0IChkZWZhdWx0IGlzIGVuYWJsZWQgd2hlbiBwb3NzaWJsZSldKSwKKyAgICAgIFtoYXZlX2xkX3ZlcnNpb25fc2NyaXB0PSRlbmFibGV2YWxdLCBbXSkKKyAgaWYgdGVzdCAteiAiJGhhdmVfbGRfdmVyc2lvbl9zY3JpcHQiOyB0aGVuCisgICAgQUNfTVNHX0NIRUNLSU5HKFtpZiBMRCAtV2wsLS12ZXJzaW9uLXNjcmlwdCB3b3Jrc10pCisgICAgc2F2ZV9MREZMQUdTPSIkTERGTEFHUyIKKyAgICBMREZMQUdTPSIkTERGTEFHUyAtV2wsLS12ZXJzaW9uLXNjcmlwdD1jb25mdGVzdC5tYXAiCisgICAgY2F0ID4gY29uZnRlc3QubWFwIDw8RU9GCitWRVJTXzEgeworCWdsb2JhbDogc3ltOworfTsKKworVkVSU18yIHsKKyAgICAgICAgZ2xvYmFsOiBzeW07Cit9IFZFUlNfMTsKK0VPRgorICAgIEFDX0xJTktfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1tdXSwgW1tdXSldLAorICAgICAgICAgICAgICAgICAgIFtoYXZlX2xkX3ZlcnNpb25fc2NyaXB0PXllc10sIFtoYXZlX2xkX3ZlcnNpb25fc2NyaXB0PW5vXSkKKyAgICBybSAtZiBjb25mdGVzdC5tYXAKKyAgICBMREZMQUdTPSIkc2F2ZV9MREZMQUdTIgorICAgIEFDX01TR19SRVNVTFQoJGhhdmVfbGRfdmVyc2lvbl9zY3JpcHQpCisgIGZpCitdKQpkaWZmIC0tZ2l0IGEvbTQvcGtnLm00IGIvbTQvcGtnLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0YmU3NDcKLS0tIC9kZXYvbnVsbAorKysgYi9tNC9wa2cubTQKQEAgLTAsMCArMSwxNTUgQEAKKyMgcGtnLm00IC0gTWFjcm9zIHRvIGxvY2F0ZSBhbmQgdXRpbGlzZSBwa2ctY29uZmlnLiAgICAgICAgICAgIC0qLSBBdXRvY29uZiAtKi0KKyMKKyMgQ29weXJpZ2h0IMKpIDIwMDQgU2NvdHQgSmFtZXMgUmVtbmFudCA8c2NvdHRAbmV0c3BsaXQuY29tPi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisjIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyMKKyMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQorIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKKyMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKKyMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorCisjIFBLR19QUk9HX1BLR19DT05GSUcoW01JTi1WRVJTSU9OXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQUNfREVGVU4oW1BLR19QUk9HX1BLR19DT05GSUddLAorW200X3BhdHRlcm5fZm9yYmlkKFteXz9QS0dfW0EtWl9dKyRdKQorbTRfcGF0dGVybl9hbGxvdyhbXlBLR19DT05GSUcoX1BBVEgpPyRdKQorQUNfQVJHX1ZBUihbUEtHX0NPTkZJR10sIFtwYXRoIHRvIHBrZy1jb25maWcgdXRpbGl0eV0pZG5sCitpZiB0ZXN0ICJ4JGFjX2N2X2Vudl9QS0dfQ09ORklHX3NldCIgIT0gInhzZXQiOyB0aGVuCisJQUNfUEFUSF9UT09MKFtQS0dfQ09ORklHXSwgW3BrZy1jb25maWddKQorZmkKK2lmIHRlc3QgLW4gIiRQS0dfQ09ORklHIjsgdGhlbgorCV9wa2dfbWluX3ZlcnNpb249bTRfZGVmYXVsdChbJDFdLCBbMC45LjBdKQorCUFDX01TR19DSEVDS0lORyhbcGtnLWNvbmZpZyBpcyBhdCBsZWFzdCB2ZXJzaW9uICRfcGtnX21pbl92ZXJzaW9uXSkKKwlpZiAkUEtHX0NPTkZJRyAtLWF0bGVhc3QtcGtnY29uZmlnLXZlcnNpb24gJF9wa2dfbWluX3ZlcnNpb247IHRoZW4KKwkJQUNfTVNHX1JFU1VMVChbeWVzXSkKKwllbHNlCisJCUFDX01TR19SRVNVTFQoW25vXSkKKwkJUEtHX0NPTkZJRz0iIgorCWZpCisKK2ZpW11kbmwKK10pIyBQS0dfUFJPR19QS0dfQ09ORklHCisKKyMgUEtHX0NIRUNLX0VYSVNUUyhNT0RVTEVTLCBbQUNUSU9OLUlGLUZPVU5EXSwgW0FDVElPTi1JRi1OT1QtRk9VTkRdKQorIworIyBDaGVjayB0byBzZWUgd2hldGhlciBhIHBhcnRpY3VsYXIgc2V0IG9mIG1vZHVsZXMgZXhpc3RzLiAgU2ltaWxhcgorIyB0byBQS0dfQ0hFQ0tfTU9EVUxFUygpLCBidXQgZG9lcyBub3Qgc2V0IHZhcmlhYmxlcyBvciBwcmludCBlcnJvcnMuCisjCisjCisjIFNpbWlsYXIgdG8gUEtHX0NIRUNLX01PRFVMRVMsIG1ha2Ugc3VyZSB0aGF0IHRoZSBmaXJzdCBpbnN0YW5jZSBvZgorIyB0aGlzIG9yIFBLR19DSEVDS19NT0RVTEVTIGlzIGNhbGxlZCwgb3IgbWFrZSBzdXJlIHRvIGNhbGwKKyMgUEtHX0NIRUNLX0VYSVNUUyBtYW51YWxseQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQUNfREVGVU4oW1BLR19DSEVDS19FWElTVFNdLAorW0FDX1JFUVVJUkUoW1BLR19QUk9HX1BLR19DT05GSUddKWRubAoraWYgdGVzdCAtbiAiJFBLR19DT05GSUciICYmIFwKKyAgICBBQ19SVU5fTE9HKFskUEtHX0NPTkZJRyAtLWV4aXN0cyAtLXByaW50LWVycm9ycyAiJDEiXSk7IHRoZW4KKyAgbTRfaWZ2YWwoWyQyXSwgWyQyXSwgWzpdKQorbTRfaWZ2YWxuKFskM10sIFtlbHNlCisgICQzXSlkbmwKK2ZpXSkKKworCisjIF9QS0dfQ09ORklHKFtWQVJJQUJMRV0sIFtDT01NQU5EXSwgW01PRFVMRVNdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZmluZShbX1BLR19DT05GSUddLAorW2lmIHRlc3QgLW4gIiQkMSI7IHRoZW4KKyAgICBwa2dfY3ZfW10kMT0iJCQxIgorIGVsaWYgdGVzdCAtbiAiJFBLR19DT05GSUciOyB0aGVuCisgICAgUEtHX0NIRUNLX0VYSVNUUyhbJDNdLAorICAgICAgICAgICAgICAgICAgICAgW3BrZ19jdl9bXSQxPWAkUEtHX0NPTkZJRyAtLVtdJDIgIiQzIiAyPi9kZXYvbnVsbGBdLAorCQkgICAgIFtwa2dfZmFpbGVkPXllc10pCisgZWxzZQorICAgIHBrZ19mYWlsZWQ9dW50cmllZAorZmlbXWRubAorXSkjIF9QS0dfQ09ORklHCisKKyMgX1BLR19TSE9SVF9FUlJPUlNfU1VQUE9SVEVECisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBQ19ERUZVTihbX1BLR19TSE9SVF9FUlJPUlNfU1VQUE9SVEVEXSwKK1tBQ19SRVFVSVJFKFtQS0dfUFJPR19QS0dfQ09ORklHXSkKK2lmICRQS0dfQ09ORklHIC0tYXRsZWFzdC1wa2djb25maWctdmVyc2lvbiAwLjIwOyB0aGVuCisgICAgICAgIF9wa2dfc2hvcnRfZXJyb3JzX3N1cHBvcnRlZD15ZXMKK2Vsc2UKKyAgICAgICAgX3BrZ19zaG9ydF9lcnJvcnNfc3VwcG9ydGVkPW5vCitmaVtdZG5sCitdKSMgX1BLR19TSE9SVF9FUlJPUlNfU1VQUE9SVEVECisKKworIyBQS0dfQ0hFQ0tfTU9EVUxFUyhWQVJJQUJMRS1QUkVGSVgsIE1PRFVMRVMsIFtBQ1RJT04tSUYtRk9VTkRdLAorIyBbQUNUSU9OLUlGLU5PVC1GT1VORF0pCisjCisjCisjIE5vdGUgdGhhdCBpZiB0aGVyZSBpcyBhIHBvc3NpYmlsaXR5IHRoZSBmaXJzdCBjYWxsIHRvCisjIFBLR19DSEVDS19NT0RVTEVTIG1pZ2h0IG5vdCBoYXBwZW4sIHlvdSBzaG91bGQgYmUgc3VyZSB0byBpbmNsdWRlIGFuCisjIGV4cGxpY2l0IGNhbGwgdG8gUEtHX1BST0dfUEtHX0NPTkZJRyBpbiB5b3VyIGNvbmZpZ3VyZS5hYworIworIworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQUNfREVGVU4oW1BLR19DSEVDS19NT0RVTEVTXSwKK1tBQ19SRVFVSVJFKFtQS0dfUFJPR19QS0dfQ09ORklHXSlkbmwKK0FDX0FSR19WQVIoWyQxXVtfQ0ZMQUdTXSwgW0MgY29tcGlsZXIgZmxhZ3MgZm9yICQxLCBvdmVycmlkaW5nIHBrZy1jb25maWddKWRubAorQUNfQVJHX1ZBUihbJDFdW19MSUJTXSwgW2xpbmtlciBmbGFncyBmb3IgJDEsIG92ZXJyaWRpbmcgcGtnLWNvbmZpZ10pZG5sCisKK3BrZ19mYWlsZWQ9bm8KK0FDX01TR19DSEVDS0lORyhbZm9yICQxXSkKKworX1BLR19DT05GSUcoWyQxXVtfQ0ZMQUdTXSwgW2NmbGFnc10sIFskMl0pCitfUEtHX0NPTkZJRyhbJDFdW19MSUJTXSwgW2xpYnNdLCBbJDJdKQorCittNF9kZWZpbmUoW19QS0dfVEVYVF0sIFtBbHRlcm5hdGl2ZWx5LCB5b3UgbWF5IHNldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzICQxW11fQ0ZMQUdTCithbmQgJDFbXV9MSUJTIHRvIGF2b2lkIHRoZSBuZWVkIHRvIGNhbGwgcGtnLWNvbmZpZy4KK1NlZSB0aGUgcGtnLWNvbmZpZyBtYW4gcGFnZSBmb3IgbW9yZSBkZXRhaWxzLl0pCisKK2lmIHRlc3QgJHBrZ19mYWlsZWQgPSB5ZXM7IHRoZW4KKyAgICAgICAgX1BLR19TSE9SVF9FUlJPUlNfU1VQUE9SVEVECisgICAgICAgIGlmIHRlc3QgJF9wa2dfc2hvcnRfZXJyb3JzX3N1cHBvcnRlZCA9IHllczsgdGhlbgorCSAgICAgICAgJDFbXV9QS0dfRVJST1JTPWAkUEtHX0NPTkZJRyAtLXNob3J0LWVycm9ycyAtLXByaW50LWVycm9ycyAiJDIiIDI+JjFgCisgICAgICAgIGVsc2UKKwkgICAgICAgICQxW11fUEtHX0VSUk9SUz1gJFBLR19DT05GSUcgLS1wcmludC1lcnJvcnMgIiQyIiAyPiYxYAorICAgICAgICBmaQorCSMgUHV0IHRoZSBuYXN0eSBlcnJvciBtZXNzYWdlIGluIGNvbmZpZy5sb2cgd2hlcmUgaXQgYmVsb25ncworCWVjaG8gIiQkMVtdX1BLR19FUlJPUlMiID4mQVNfTUVTU0FHRV9MT0dfRkQKKworCWlmZWxzZShbJDRdLCAsIFtBQ19NU0dfRVJST1IoZG5sCitbUGFja2FnZSByZXF1aXJlbWVudHMgKCQyKSB3ZXJlIG5vdCBtZXQ6CisKKyQkMV9QS0dfRVJST1JTCisKK0NvbnNpZGVyIGFkanVzdGluZyB0aGUgUEtHX0NPTkZJR19QQVRIIGVudmlyb25tZW50IHZhcmlhYmxlIGlmIHlvdQoraW5zdGFsbGVkIHNvZnR3YXJlIGluIGEgbm9uLXN0YW5kYXJkIHByZWZpeC4KKworX1BLR19URVhUCitdKV0sCisJCVtBQ19NU0dfUkVTVUxUKFtub10pCisgICAgICAgICAgICAgICAgJDRdKQorZWxpZiB0ZXN0ICRwa2dfZmFpbGVkID0gdW50cmllZDsgdGhlbgorCWlmZWxzZShbJDRdLCAsIFtBQ19NU0dfRkFJTFVSRShkbmwKK1tUaGUgcGtnLWNvbmZpZyBzY3JpcHQgY291bGQgbm90IGJlIGZvdW5kIG9yIGlzIHRvbyBvbGQuICBNYWtlIHN1cmUgaXQKK2lzIGluIHlvdXIgUEFUSCBvciBzZXQgdGhlIFBLR19DT05GSUcgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gdGhlIGZ1bGwKK3BhdGggdG8gcGtnLWNvbmZpZy4KKworX1BLR19URVhUCisKK1RvIGdldCBwa2ctY29uZmlnLCBzZWUgPGh0dHA6Ly9wa2ctY29uZmlnLmZyZWVkZXNrdG9wLm9yZy8+Ll0pXSwKKwkJWyQ0XSkKK2Vsc2UKKwkkMVtdX0NGTEFHUz0kcGtnX2N2X1tdJDFbXV9DRkxBR1MKKwkkMVtdX0xJQlM9JHBrZ19jdl9bXSQxW11fTElCUworICAgICAgICBBQ19NU0dfUkVTVUxUKFt5ZXNdKQorCWlmZWxzZShbJDNdLCAsIDosIFskM10pCitmaVtdZG5sCitdKSMgUEtHX0NIRUNLX01PRFVMRVMKZGlmZiAtLWdpdCBhL200L3Zpc2liaWxpdHkubTQgYi9tNC92aXNpYmlsaXR5Lm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1MmUzOTcKLS0tIC9kZXYvbnVsbAorKysgYi9tNC92aXNpYmlsaXR5Lm00CkBAIC0wLDAgKzEsNzcgQEAKKyMgdmlzaWJpbGl0eS5tNCBzZXJpYWwgNSAoZ2V0dGV4dC0wLjE4LjIpCitkbmwgQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA4LCAyMDEwLTIwMTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCitkbmwgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KK2RubCBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorZG5sIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworZG5sIEZyb20gQnJ1bm8gSGFpYmxlLgorCitkbmwgVGVzdHMgd2hldGhlciB0aGUgY29tcGlsZXIgc3VwcG9ydHMgdGhlIGNvbW1hbmQtbGluZSBvcHRpb24KK2RubCAtZnZpc2liaWxpdHk9aGlkZGVuIGFuZCB0aGUgZnVuY3Rpb24gYW5kIHZhcmlhYmxlIGF0dHJpYnV0ZXMKK2RubCBfX2F0dHJpYnV0ZV9fKChfX3Zpc2liaWxpdHlfXygiaGlkZGVuIikpKSBhbmQKK2RubCBfX2F0dHJpYnV0ZV9fKChfX3Zpc2liaWxpdHlfXygiZGVmYXVsdCIpKSkuCitkbmwgRG9lcyAqbm90KiB0ZXN0IGZvciBfX3Zpc2liaWxpdHlfXygicHJvdGVjdGVkIikgLSB3aGljaCBoYXMgdHJpY2t5Citkbmwgc2VtYW50aWNzIChzZWUgdGhlICd2aXNtYWluJyB0ZXN0IGluIGdsaWJjKSBhbmQgZG9lcyBub3QgZXhpc3QgZS5nLiBvbgorZG5sIE1hYyBPUyBYLgorZG5sIERvZXMgKm5vdCogdGVzdCBmb3IgX192aXNpYmlsaXR5X18oImludGVybmFsIikgLSB3aGljaCBoYXMgcHJvY2Vzc29yCitkbmwgZGVwZW5kZW50IHNlbWFudGljcy4KK2RubCBEb2VzICpub3QqIHRlc3QgZm9yICNwcmFnbWEgR0NDIHZpc2liaWxpdHkgcHVzaChoaWRkZW4pIC0gd2hpY2ggaXMKK2RubCAicmVhbGx5IG9ubHkgcmVjb21tZW5kZWQgZm9yIGxlZ2FjeSBjb2RlIi4KK2RubCBTZXQgdGhlIHZhcmlhYmxlIENGTEFHX1ZJU0lCSUxJVFkuCitkbmwgRGVmaW5lcyBhbmQgc2V0cyB0aGUgdmFyaWFibGUgSEFWRV9WSVNJQklMSVRZLgorCitBQ19ERUZVTihbZ2xfVklTSUJJTElUWV0sCitbCisgIEFDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKQorICBDRkxBR19WSVNJQklMSVRZPQorICBIQVZFX1ZJU0lCSUxJVFk9MAorICBpZiB0ZXN0IC1uICIkR0NDIjsgdGhlbgorICAgIGRubCBGaXJzdCwgY2hlY2sgd2hldGhlciAtV2Vycm9yIGNhbiBiZSBhZGRlZCB0byB0aGUgY29tbWFuZCBsaW5lLCBvcgorICAgIGRubCB3aGV0aGVyIGl0IGxlYWRzIHRvIGFuIGVycm9yIGJlY2F1c2Ugb2Ygc29tZSBvdGhlciBvcHRpb24gdGhhdCB0aGUKKyAgICBkbmwgdXNlciBoYXMgcHV0IGludG8gJENDICRDRkxBR1MgJENQUEZMQUdTLgorICAgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciB0aGUgLVdlcnJvciBvcHRpb24gaXMgdXNhYmxlXSkKKyAgICBBQ19DQUNIRV9WQUwoW2dsX2N2X2NjX3Zpc193ZXJyb3JdLCBbCisgICAgICBnbF9zYXZlX0NGTEFHUz0iJENGTEFHUyIKKyAgICAgIENGTEFHUz0iJENGTEFHUyAtV2Vycm9yIgorICAgICAgQUNfQ09NUElMRV9JRkVMU0UoCisgICAgICAgIFtBQ19MQU5HX1BST0dSQU0oW1tdXSwgW1tdXSldLAorICAgICAgICBbZ2xfY3ZfY2NfdmlzX3dlcnJvcj15ZXNdLAorICAgICAgICBbZ2xfY3ZfY2NfdmlzX3dlcnJvcj1ub10pCisgICAgICBDRkxBR1M9IiRnbF9zYXZlX0NGTEFHUyJdKQorICAgIEFDX01TR19SRVNVTFQoWyRnbF9jdl9jY192aXNfd2Vycm9yXSkKKyAgICBkbmwgTm93IGNoZWNrIHdoZXRoZXIgdmlzaWJpbGl0eSBkZWNsYXJhdGlvbnMgYXJlIHN1cHBvcnRlZC4KKyAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBzaW1wbGUgdmlzaWJpbGl0eSBkZWNsYXJhdGlvbnNdKQorICAgIEFDX0NBQ0hFX1ZBTChbZ2xfY3ZfY2NfdmlzaWJpbGl0eV0sIFsKKyAgICAgIGdsX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorICAgICAgQ0ZMQUdTPSIkQ0ZMQUdTIC1mdmlzaWJpbGl0eT1oaWRkZW4iCisgICAgICBkbmwgV2UgdXNlIHRoZSBvcHRpb24gLVdlcnJvciBhbmQgYSBmdW5jdGlvbiBkdW1teWZ1bmMsIGJlY2F1c2Ugb24gc29tZQorICAgICAgZG5sIHBsYXRmb3JtcyAoQ3lnd2luIDEuNykgdGhlIHVzZSBvZiAtZnZpc2liaWxpdHkgdHJpZ2dlcnMgYSB3YXJuaW5nCisgICAgICBkbmwgInZpc2liaWxpdHkgYXR0cmlidXRlIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBjb25maWd1cmF0aW9uOyBpZ25vcmVkIgorICAgICAgZG5sIGF0IHRoZSBmaXJzdCBmdW5jdGlvbiBkZWZpbml0aW9uIGluIGV2ZXJ5IGNvbXBpbGF0aW9uIHVuaXQsIGFuZCB3ZQorICAgICAgZG5sIGRvbid0IHdhbnQgdG8gdXNlIHRoZSBvcHRpb24gaW4gdGhpcyBjYXNlLgorICAgICAgaWYgdGVzdCAkZ2xfY3ZfY2NfdmlzX3dlcnJvciA9IHllczsgdGhlbgorICAgICAgICBDRkxBR1M9IiRDRkxBR1MgLVdlcnJvciIKKyAgICAgIGZpCisgICAgICBBQ19DT01QSUxFX0lGRUxTRSgKKyAgICAgICAgW0FDX0xBTkdfUFJPR1JBTSgKKyAgICAgICAgICAgW1tleHRlcm4gX19hdHRyaWJ1dGVfXygoX192aXNpYmlsaXR5X18oImhpZGRlbiIpKSkgaW50IGhpZGRlbnZhcjsKKyAgICAgICAgICAgICBleHRlcm4gX19hdHRyaWJ1dGVfXygoX192aXNpYmlsaXR5X18oImRlZmF1bHQiKSkpIGludCBleHBvcnRlZHZhcjsKKyAgICAgICAgICAgICBleHRlcm4gX19hdHRyaWJ1dGVfXygoX192aXNpYmlsaXR5X18oImhpZGRlbiIpKSkgaW50IGhpZGRlbmZ1bmMgKHZvaWQpOworICAgICAgICAgICAgIGV4dGVybiBfX2F0dHJpYnV0ZV9fKChfX3Zpc2liaWxpdHlfXygiZGVmYXVsdCIpKSkgaW50IGV4cG9ydGVkZnVuYyAodm9pZCk7CisgICAgICAgICAgICAgdm9pZCBkdW1teWZ1bmMgKHZvaWQpIHt9CisgICAgICAgICAgIF1dLAorICAgICAgICAgICBbW11dKV0sCisgICAgICAgIFtnbF9jdl9jY192aXNpYmlsaXR5PXllc10sCisgICAgICAgIFtnbF9jdl9jY192aXNpYmlsaXR5PW5vXSkKKyAgICAgIENGTEFHUz0iJGdsX3NhdmVfQ0ZMQUdTIl0pCisgICAgQUNfTVNHX1JFU1VMVChbJGdsX2N2X2NjX3Zpc2liaWxpdHldKQorICAgIGlmIHRlc3QgJGdsX2N2X2NjX3Zpc2liaWxpdHkgPSB5ZXM7IHRoZW4KKyAgICAgIENGTEFHX1ZJU0lCSUxJVFk9Ii1mdmlzaWJpbGl0eT1oaWRkZW4iCisgICAgICBIQVZFX1ZJU0lCSUxJVFk9MQorICAgIGZpCisgIGZpCisgIEFDX1NVQlNUKFtDRkxBR19WSVNJQklMSVRZXSkKKyAgQUNfU1VCU1QoW0hBVkVfVklTSUJJTElUWV0pCisgIEFDX0RFRklORV9VTlFVT1RFRChbSEFWRV9WSVNJQklMSVRZXSwgWyRIQVZFX1ZJU0lCSUxJVFldLAorICAgIFtEZWZpbmUgdG8gMSBvciAwLCBkZXBlbmRpbmcgd2hldGhlciB0aGUgY29tcGlsZXIgc3VwcG9ydHMgc2ltcGxlIHZpc2liaWxpdHkgZGVjbGFyYXRpb25zLl0pCitdKQpkaWZmIC0tZ2l0IGEvdGVzdC8uZ2l0aWdub3JlIGIvdGVzdC8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlYWFlNGEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0Ly5naXRpZ25vcmUKQEAgLTAsMCArMSwzOSBAQAorLmRlcHMKKy5saWJzCitNYWtlZmlsZQorTWFrZWZpbGUuaW4KKyoubG8KKyoubGEKKyoubworZWNoby1zZXJ2ZXIKK2VjaG8tY2xpZW50Cit0ZXN0LWJ1cwordW5iYXNlNjQKKyouYmIKKyouYmJnCisqLmRhCisqLmdjb3YKK2JyZWFrLWxvYWRlcgordGVzdC1zcGF3bgordGVzdC1jb3JydXB0Cit0ZXN0LWV4aXQKK3Rlc3Qtc2VnZmF1bHQKK3Rlc3Qtc2VydmljZQordGVzdC1zbGVlcC1mb3JldmVyCitkZWNvZGUtZ2NvdgordGVzdC1zaGVsbAordGVzdC1zaGVsbC1zZXJ2aWNlCit0ZXN0LW5hbWVzCit0ZXN0LWxvb3BiYWNrCit0ZXN0LXJlbGF5Cit0ZXN0LWRidXMtZGFlbW9uCit0ZXN0LW1hcnNoYWwKK21hbnVhbC1hdXRoegorbWFudWFsLWRpci1pdGVyCittYW51YWwtdGNwCit0ZXN0LWRidXMtZGFlbW9uLWVhdmVzZHJvcAordGVzdC1wcmludGYKK3Rlc3QtcmVmcwordGVzdC1zeW50YXgKK3Rlc3Qtc3lzbG9nCitpbnRlcm5hbHMvLmRpcnN0YW1wCmRpZmYgLS1naXQgYS90ZXN0L01ha2VmaWxlLmFtIGIvdGVzdC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjFlMTNiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDY4MCBAQAorIyMgdGhlICJuYW1lLXRlc3QiIHN1YmRpciBpbiBmYWN0IGNvbnRhaW5zIGEgYnVuY2ggb2YgdGVzdHMgbm93IHRoYXQgbmVlZCBhIHRlbXBvcmFyeSBidXMKKyMjIHRvIGJlIHJ1bm5pbmcgdG8gZG8gc3R1ZmYgd2l0aC4gVGhlIGRpcmVjdG9yeSBzaG91bGQgYmUgcmVuYW1lZC4KKyMjIFdlIHdhbnQgdG8gYnVpbGQgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGZpcnN0IHRvIHBpY2sgdXAgdGhlIHRlc3R1dGlscyBsaWIKK1NVQkRJUlM9IC4gbmFtZS10ZXN0CitESVNUX1NVQkRJUlM9bmFtZS10ZXN0CisKK0NMRUFORklMRVMgPQorRVhUUkFfRElTVCA9CisKK0FNX0NQUEZMQUdTID0gXAorCSQoQ09ERV9DT1ZFUkFHRV9DUFBGTEFHUykgXAorCS1JJCh0b3Bfc3JjZGlyKSBcCisJJChEQlVTX1NUQVRJQ19CVUlMRF9DUFBGTEFHUykgXAorCS1EREJVU19DT01QSUxBVElPTiBcCisJJChBUFBBUk1PUl9DRkxBR1MpIFwKKwkkKEdMSUJfQ0ZMQUdTKSBcCisJJChHSU9fVU5JWF9DRkxBR1MpIFwKKwkkKE5VTEwpCisKKyMgaW1wcm92ZSBiYWNrdHJhY2VzIGZyb20gdGVzdCBzdHVmZgorQU1fTERGTEFHUyA9IEBSX0RZTkFNSUNfTERGTEFHQAorCitBTV9DRkxBR1MgPSBcCisJJChDT0RFX0NPVkVSQUdFX0NGTEFHUykgXAorCSQoTlVMTCkKKworbm9pbnN0X0xUTElCUkFSSUVTID0gbGliZGJ1cy10ZXN0dXRpbHMubGEKKworbGliZGJ1c190ZXN0dXRpbHNfbGFfU09VUkNFUyA9IFwKKwl0ZXN0LXV0aWxzLmMgXAorCXRlc3QtdXRpbHMuaCBcCisJJChOVUxMKQorCitpZiBEQlVTX1dJVEhfR0xJQgorbGliZGJ1c190ZXN0dXRpbHNfbGFfU09VUkNFUyArPSBcCisJdGVzdC11dGlscy1nbGliLmMgXAorCXRlc3QtdXRpbHMtZ2xpYi5oIFwKKwkkKE5VTEwpCitlbmRpZgorCitsaWJkYnVzX3Rlc3R1dGlsc19sYV9MSUJBREQgPSBcCisJJChDT0RFX0NPVkVSQUdFX0xJQlMpIFwKKwkkKHRvcF9idWlsZGRpcikvZGJ1cy9saWJkYnVzLTEubGEgXAorCSQodG9wX2J1aWxkZGlyKS9kYnVzL2xpYmRidXMtaW50ZXJuYWwubGEgXAorCSQoTlVMTCkKKworVEVTVF9FWFRFTlNJT05TID0gLnNoCisKK0xPR19EUklWRVIgPSBlbnYgQU1fVEFQX0FXSz0nJChBV0spJyAkKFNIRUxMKSAkKHRvcF9zcmNkaXIpL2J1aWxkLWF1eC90YXAtZHJpdmVyLnNoCitMT0dfQ09NUElMRVIgPSAkKHNyY2RpcikvZ2xpYi10YXAtdGVzdC5zaAorU0hfTE9HX0RSSVZFUiA9ICQoTE9HX0RSSVZFUikKK1NIX0xPR19DT01QSUxFUiA9ICQoU0hFTEwpCitFWFRSQV9ESVNUICs9IGdsaWItdGFwLXRlc3Quc2gKK0VYVFJBX0RJU1QgKz0gdGFwLXRlc3Quc2guaW4KKworVEVTVFMgPQorCitpZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworIyMgYnJlYWstbG9hZGVyIHJlbW92ZWQgZm9yIG5vdworIyMgdGhlc2UgYmluYXJpZXMgYXJlIHVzZWQgaW4gdGVzdHMgYnV0IGFyZSBub3QgdGhlbXNlbHZlcyB0ZXN0cworVEVTVF9CSU5BUklFUyA9IFwKKwl0ZXN0LXNwYXduIFwKKwl0ZXN0LWV4aXQgXAorCXRlc3QtbmFtZXMgXAorCXRlc3Qtc2VnZmF1bHQgXAorCXRlc3Qtc2VydmljZSBcCisJdGVzdC1zaGVsbC1zZXJ2aWNlIFwKKwl0ZXN0LXNsZWVwLWZvcmV2ZXIgXAorCSQoTlVMTCkKKworIyMgVGhlc2UgYXJlIGNvbmNlcHR1YWxseSBwYXJ0IG9mIGRpcmVjdG9yaWVzIHRoYXQgY29tZSBlYXJsaWVyIGluIFNVQkRJUlMKKyMjIG9yZGVyLCBidXQgd2UgZG9uJ3Qgd2FudCB0byBydW4gdGhlbSB0aWwgd2UgYXJyaXZlIGluIHRoaXMgZGlyZWN0b3J5LAorIyMgc2luY2UgdGhleSBkZXBlbmQgb24gc3R1ZmYgZnJvbSB0aGlzIGRpcmVjdG9yeS4gV2Ugd3JhcCB0aGVtIGluIGEKKyMjIHNpbXBsZSBzaGVsbCBzY3JpcHQgdG8gZ2V0IFRBUCBvdXRwdXQuCisKK3dyYXBfYnVzX3Rlc3RzID0gdGVzdC1idXMuc2gKK3dyYXBfZGJ1c190ZXN0cyA9IHRlc3QtZGJ1cy5zaAorCitpZiBEQlVTX1VOSVgKK3dyYXBfYnVzX3Rlc3RzICs9IHRlc3QtYnVzLWxhdW5jaC1oZWxwZXIuc2gKK3dyYXBfYnVzX3Rlc3RzICs9IHRlc3QtYnVzLXN5c3RlbS5zaAorZW5kaWYKKworVEVTVFMgKz0gJCh3cmFwX2J1c190ZXN0cykgJCh3cmFwX2RidXNfdGVzdHMpCitDTEVBTkZJTEVTICs9ICQod3JhcF9idXNfdGVzdHMpICQod3JhcF9kYnVzX3Rlc3RzKQorCiskKHdyYXBfYnVzX3Rlc3RzKTogdGVzdC1idXMlLnNoOiAuLi9idXMvdGVzdC1idXMlJChFWEVFWFQpIHRhcC10ZXN0LnNoLmluIE1ha2VmaWxlCisJc2VkIC1lICdzIVtAXVJVTltAXSEkPCEnIFwKKwkJPCAkKHNyY2RpcikvdGFwLXRlc3Quc2guaW4gPiAkQAorCiskKHdyYXBfZGJ1c190ZXN0cyk6IHRlc3QtZGJ1cyUuc2g6IC4uL2RidXMvdGVzdC1kYnVzJSQoRVhFRVhUKSB0YXAtdGVzdC5zaC5pbiBNYWtlZmlsZQorCXNlZCAtZSAncyFbQF1SVU5bQF0hJDwhJyBcCisJCTwgJChzcmNkaXIpL3RhcC10ZXN0LnNoLmluID4gJEAKKworZWxzZSAhREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMKKworVEVTVF9CSU5BUklFUz0KKworZW5kaWYgIURCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTCisKK25vaW5zdF9QUk9HUkFNUz0gJChURVNUX0JJTkFSSUVTKQorCit0ZXN0X3NlcnZpY2VfTERBREQgPSBsaWJkYnVzLXRlc3R1dGlscy5sYQordGVzdF9uYW1lc19MREFERCA9IGxpYmRidXMtdGVzdHV0aWxzLmxhCisjIyBicmVha19sb2FkZXJfTERBREQgPSAkKHRvcF9idWlsZGRpcikvZGJ1cy9saWJkYnVzLWludGVybmFsLmxhCit0ZXN0X3NoZWxsX3NlcnZpY2VfTERBREQgPSBsaWJkYnVzLXRlc3R1dGlscy5sYQordGVzdF9zaGVsbF9TT1VSQ0VTID0gc2hlbGwtdGVzdC5jCit0ZXN0X3NoZWxsX0xEQUREID0gbGliZGJ1cy10ZXN0dXRpbHMubGEKK3Rlc3Rfc3Bhd25fU09VUkNFUyA9IHNwYXduLXRlc3QuYwordGVzdF9zcGF3bl9MREFERCA9ICQodG9wX2J1aWxkZGlyKS9kYnVzL2xpYmRidXMtaW50ZXJuYWwubGEKKwordGVzdF9wcmludGZfU09VUkNFUyA9IGludGVybmFscy9wcmludGYuYwordGVzdF9wcmludGZfTERBREQgPSAkKHRvcF9idWlsZGRpcikvZGJ1cy9saWJkYnVzLWludGVybmFsLmxhCisKK3Rlc3RfcmVmc19TT1VSQ0VTID0gaW50ZXJuYWxzL3JlZnMuYwordGVzdF9yZWZzX0xEQUREID0gbGliZGJ1cy10ZXN0dXRpbHMubGEgJChHTElCX0xJQlMpCisKK3Rlc3Rfc2VydmVyX29vbV9TT1VSQ0VTID0gaW50ZXJuYWxzL3NlcnZlci1vb20uYwordGVzdF9zZXJ2ZXJfb29tX0xEQUREID0gbGliZGJ1cy10ZXN0dXRpbHMubGEgJChHTElCX0xJQlMpCisKK3Rlc3Rfc3lzbG9nX1NPVVJDRVMgPSBpbnRlcm5hbHMvc3lzbG9nLmMKK3Rlc3Rfc3lzbG9nX0xEQUREID0gbGliZGJ1cy10ZXN0dXRpbHMubGEgJChHTElCX0xJQlMpCisKK3Rlc3RfdmFyaWFudF9TT1VSQ0VTID0gaW50ZXJuYWxzL3ZhcmlhbnQuYwordGVzdF92YXJpYW50X0xEQUREID0gbGliZGJ1cy10ZXN0dXRpbHMubGEgJChHTElCX0xJQlMpCisKK21hbnVhbF9iYWNrdHJhY2VfU09VUkNFUyA9IG1hbnVhbC1iYWNrdHJhY2UuYworbWFudWFsX2JhY2t0cmFjZV9MREFERCA9ICQodG9wX2J1aWxkZGlyKS9kYnVzL2xpYmRidXMtMS5sYQorCittYW51YWxfZGlyX2l0ZXJfU09VUkNFUyA9IG1hbnVhbC1kaXItaXRlci5jCittYW51YWxfZGlyX2l0ZXJfTERBREQgPSAkKHRvcF9idWlsZGRpcikvZGJ1cy9saWJkYnVzLWludGVybmFsLmxhCisKK21hbnVhbF9wYXRoc19TT1VSQ0VTID0gbWFudWFsLXBhdGhzLmMKK21hbnVhbF9wYXRoc19MREFERCA9ICQodG9wX2J1aWxkZGlyKS9kYnVzL2xpYmRidXMtaW50ZXJuYWwubGEKKworbWFudWFsX3RjcF9TT1VSQ0VTID0gbWFudWFsLXRjcC5jCittYW51YWxfdGNwX0xEQUREID0gJCh0b3BfYnVpbGRkaXIpL2RidXMvbGliZGJ1cy1pbnRlcm5hbC5sYQorCitFWFRSQV9ESVNUICs9IGRidXMtdGVzdC1ydW5uZXIKKwordGVzdGV4ZWNkaXIgPSAkKGxpYmV4ZWNkaXIpL2luc3RhbGxlZC10ZXN0cy9kYnVzCit0ZXN0bWV0YWRpciA9ICQoZGF0YWRpcikvaW5zdGFsbGVkLXRlc3RzL2RidXMKKworbm9iYXNlX2Rpc3RfdGVzdGV4ZWNfU0NSSVBUUyA9Citub2Jhc2VfdGVzdGV4ZWNfUFJPR1JBTVMgPQorbm9iYXNlX3Rlc3RtZXRhX0RBVEEgPQorCitpbnN0YWxsYWJsZV9oZWxwZXJzID0gXAorCSQoTlVMTCkKK2luc3RhbGxhYmxlX3Rlc3RzID0gXAorCXRlc3Qtc2hlbGwgXAorCXRlc3QtcHJpbnRmIFwKKwkkKE5VTEwpCitpbnN0YWxsYWJsZV9tYW51YWxfdGVzdHMgPSBcCisJbWFudWFsLWJhY2t0cmFjZSBcCisJbWFudWFsLWRpci1pdGVyIFwKKwltYW51YWwtdGNwIFwKKwkkKE5VTEwpCitkaXN0X2luc3RhbGxhYmxlX3Rlc3Rfc2NyaXB0cyA9IFwKKwkkKE5VTEwpCitkaXN0X2luc3RhbGxlZF90ZXN0X3NjcmlwdHMgPSBcCisJJChOVUxMKQorCitpZiBEQlVTX1dJTgoraW5zdGFsbGFibGVfbWFudWFsX3Rlc3RzICs9IG1hbnVhbC1wYXRocworZW5kaWYKKworaWYgREJVU19XSVRIX0dMSUIKK2luc3RhbGxhYmxlX3Rlc3RzICs9IFwKKwl0ZXN0LWNvcnJ1cHQgXAorCXRlc3QtZGJ1cy1kYWVtb24gXAorCXRlc3QtZGJ1cy1kYWVtb24tZWF2ZXNkcm9wIFwKKwl0ZXN0LWZkcGFzcyBcCisJdGVzdC1tZXNzYWdlIFwKKwl0ZXN0LW1vbml0b3IgXAorCXRlc3QtbG9vcGJhY2sgXAorCXRlc3QtbWFyc2hhbCBcCisJdGVzdC1yZWZzIFwKKwl0ZXN0LXJlbGF5IFwKKwl0ZXN0LXNlcnZlci1vb20gXAorCXRlc3Qtc3ludGF4IFwKKwl0ZXN0LXN5c2xvZyBcCisJdGVzdC11aWQtcGVybWlzc2lvbnMgXAorCXRlc3QtdmFyaWFudCBcCisJJChOVUxMKQorCitpZiBEQlVTX1VOSVgKKyMgVGhlc2UgYmluYXJpZXMgYXJlIHVzZWQgaW4gdGVzdHMgYnV0IGFyZSBub3QgdGhlbXNlbHZlcyB0ZXN0cworaW5zdGFsbGFibGVfaGVscGVycyArPSBcCisJdGVzdC1hcHBhcm1vci1hY3RpdmF0aW9uIFwKKwkkKE5VTEwpCisKK2luc3RhbGxhYmxlX3Rlc3RzICs9IFwKKwl0ZXN0LXNkLWFjdGl2YXRpb24gXAorCSQoTlVMTCkKKworZGlzdF9pbnN0YWxsYWJsZV90ZXN0X3NjcmlwdHMgKz0gXAorCXRlc3QtZGJ1cy1kYWVtb24tZm9yay5zaCBcCisJJChOVUxMKQorCisjIE9ubHkgcnVubmFibGUgd2hlbiBpbnN0YWxsZWQsIG5vdCBmcm9tIHRoZSBzb3VyY2UgdHJlZQorZGlzdF9pbnN0YWxsZWRfdGVzdF9zY3JpcHRzICs9IFwKKwlpbnRlZ3JhdGlvbi90cmFuc2llbnQtc2VydmljZXMuc2ggXAorCXRlc3QtYXBwYXJtb3ItYWN0aXZhdGlvbi5zaCBcCisJJChOVUxMKQorCisjIFRlc3RpbmcgZGJ1cy1sYXVuY2ggcmVsaWVzIG9uIHNwZWNpYWwgY29kZSBpbiB0aGF0IGJpbmFyeS4KK2lmIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTCitkaXN0X2luc3RhbGxhYmxlX3Rlc3Rfc2NyaXB0cyArPSBcCisJdGVzdC1kYnVzLWxhdW5jaC1ldmFsLnNoIFwKKwkkKE5VTEwpCisKK2lmIERCVVNfRU5BQkxFX1gxMV9BVVRPTEFVTkNICitkaXN0X2luc3RhbGxhYmxlX3Rlc3Rfc2NyaXB0cyArPSBcCisJdGVzdC1kYnVzLWxhdW5jaC14MTEuc2ggXAorCSQoTlVMTCkKK2VuZGlmIERCVVNfRU5BQkxFX1gxMV9BVVRPTEFVTkNICitlbmRpZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworCitlbmRpZiBEQlVTX1VOSVgKKworaW5zdGFsbGFibGVfbWFudWFsX3Rlc3RzICs9IFwKKwltYW51YWwtYXV0aHogXAorCW1hbnVhbC10ZXN0LXRocmVhZC1ibG9ja2luZyBcCisJJChOVUxMKQorZW5kaWYgREJVU19XSVRIX0dMSUIKKworaW5zdGFsbGFibGVfdGVzdF9tZXRhID0gXAorCSQoZGlzdF9pbnN0YWxsYWJsZV90ZXN0X3NjcmlwdHM6PS50ZXN0KSBcCisJJChkaXN0X2luc3RhbGxlZF90ZXN0X3NjcmlwdHM6PS50ZXN0KSBcCisJJChpbnN0YWxsYWJsZV90ZXN0czo9LnRlc3QpIFwKKwkkKE5VTEwpCitpbnN0YWxsYWJsZV90ZXN0X21ldGFfd2l0aF9jb25maWcgPSBcCisJJChkaXN0X2luc3RhbGxhYmxlX3Rlc3Rfc2NyaXB0czo9X3dpdGhfY29uZmlnLnRlc3QpIFwKKwkkKGRpc3RfaW5zdGFsbGVkX3Rlc3Rfc2NyaXB0czo9X3dpdGhfY29uZmlnLnRlc3QpIFwKKwkkKGluc3RhbGxhYmxlX3Rlc3RzOj1fd2l0aF9jb25maWcudGVzdCkgXAorCSQoTlVMTCkKKworaW5zdGFsbGNoZWNrX3Rlc3RzID0KK2luc3RhbGxjaGVja19lbnZpcm9ubWVudCA9IFwKKwlleHBvcnQgWERHX0RBVEFfSE9NRT1AYWJzX3RvcF9idWlsZGRpckAvdGVzdC9YREdfREFUQV9IT01FOyBcCisJZXhwb3J0IFhER19EQVRBX0RJUlM9QGFic190b3BfYnVpbGRkaXJAL3Rlc3QvWERHX0RBVEFfRElSUzokKERFU1RESVIpJChkYXRhZGlyKTsgXAorCWV4cG9ydCBYREdfUlVOVElNRV9ESVI9QGFic190b3BfYnVpbGRkaXJAL3Rlc3QvWERHX1JVTlRJTUVfRElSOyBcCisJZXhwb3J0IERCVVNfU0VTU0lPTl9CVVNfQUREUkVTUz1kby1ub3QtdXNlLXJlYWwtc2Vzc2lvbjo7IFwKKwlleHBvcnQgREJVU19URVNUX0RBRU1PTj0kKERFU1RESVIpJChEQlVTX0RBRU1PTkRJUikvZGJ1cy1kYWVtb24kKEVYRUVYVCk7IFwKKwlleHBvcnQgREJVU19URVNUX0RCVVNfTEFVTkNIPSQoREVTVERJUikkKGJpbmRpcikvZGJ1cy1sYXVuY2gkKEVYRUVYVCk7IFwKKwlleHBvcnQgREJVU19URVNUX0RCVVNfTU9OSVRPUj0kKERFU1RESVIpJChiaW5kaXIpL2RidXMtbW9uaXRvciQoRVhFRVhUKTsgXAorCWV4cG9ydCBEQlVTX1RFU1RfREJVU19TRU5EPSQoREVTVERJUikkKGJpbmRpcikvZGJ1cy1zZW5kJChFWEVFWFQpOyBcCisJZXhwb3J0IERCVVNfVEVTVF9EQlVTX1VVSURHRU49JChERVNURElSKSQoYmluZGlyKS9kYnVzLXV1aWRnZW4kKEVYRUVYVCk7IFwKKwlleHBvcnQgREJVU19URVNUX0VYRUM9QGFic190b3BfYnVpbGRkaXJAL3Rlc3Q7IFwKKwlleHBvcnQgREJVU19URVNUX0hPTUVESVI9QGFic190b3BfYnVpbGRkaXJAL2RidXM7IFwKKwlleHBvcnQgREJVU19URVNUX0RBVEFESVI9JChERVNURElSKSQoZGF0YWRpcik7IFwKKwlleHBvcnQgREJVU19URVNUX1VOSU5TVEFMTEVEPTE7IFwKKwlleHBvcnQgSE9NRT1AYWJzX3RvcF9idWlsZGRpckAvZGJ1czsgXAorCSR7TlVMTH0KKworIyBUZXN0cyBpbiBidXMvY29uZmlnLXBhcnNlci5jIHJlbHkgb24gdGhlc2Ugc3BlY2lmaWMgdmFsdWVzIGZvciBYREdfKiBhbmQKKyMgREJVU19URVNUX0JVSUxERElSLgorQU1fVEVTVFNfRU5WSVJPTk1FTlQgPSBcCisJZXhwb3J0IFhER19EQVRBX0hPTUU9QGFic190b3BfYnVpbGRkaXJAL3Rlc3QvWERHX0RBVEFfSE9NRTsgXAorCWV4cG9ydCBYREdfREFUQV9ESVJTPUBhYnNfdG9wX2J1aWxkZGlyQC90ZXN0L1hER19EQVRBX0RJUlM6QGFic190b3BfYnVpbGRkaXJAL3Rlc3QvWERHX0RBVEFfRElSUzI7IFwKKwlleHBvcnQgWERHX1JVTlRJTUVfRElSPUBhYnNfdG9wX2J1aWxkZGlyQC90ZXN0L1hER19SVU5USU1FX0RJUjsgXAorCWV4cG9ydCBEQlVTX0ZBVEFMX1dBUk5JTkdTPTE7IFwKKwlleHBvcnQgREJVU19TRVNTSU9OX0JVU19BRERSRVNTPWRvLW5vdC11c2UtcmVhbC1zZXNzaW9uOjsgXAorCWV4cG9ydCBEQlVTX1RFU1RfQlVJTERESVI9QGFic19idWlsZGRpckA7IFwKKwlleHBvcnQgREJVU19URVNUX1NSQ0RJUj1AYWJzX3NyY2RpckA7IFwKKwlleHBvcnQgREJVU19URVNUX0RBRU1PTj1AYWJzX3RvcF9idWlsZGRpckAvYnVzL2RidXMtZGFlbW9uJChFWEVFWFQpOyBcCisJZXhwb3J0IERCVVNfVEVTVF9EQlVTX0xBVU5DSD1AYWJzX3RvcF9idWlsZGRpckAvdG9vbHMvZGJ1cy1sYXVuY2gkKEVYRUVYVCk7IFwKKwlleHBvcnQgREJVU19URVNUX0RCVVNfTU9OSVRPUj1AYWJzX3RvcF9idWlsZGRpckAvdG9vbHMvZGJ1cy1tb25pdG9yJChFWEVFWFQpOyBcCisJZXhwb3J0IERCVVNfVEVTVF9EQlVTX1NFTkQ9QGFic190b3BfYnVpbGRkaXJAL3Rvb2xzL2RidXMtc2VuZCQoRVhFRVhUKTsgXAorCWV4cG9ydCBEQlVTX1RFU1RfREJVU19VVUlER0VOPUBhYnNfdG9wX2J1aWxkZGlyQC90b29scy9kYnVzLXV1aWRnZW4kKEVYRUVYVCk7IFwKKwlleHBvcnQgREJVU19URVNUX0RBVEE9QGFic190b3BfYnVpbGRkaXJAL3Rlc3QvZGF0YTsgXAorCWV4cG9ydCBEQlVTX1RFU1RfRVhFQz1AYWJzX3RvcF9idWlsZGRpckAvdGVzdDsgXAorCWV4cG9ydCBEQlVTX1RFU1RfSE9NRURJUj1AYWJzX3RvcF9idWlsZGRpckAvZGJ1czsgXAorCWV4cG9ydCBEQlVTX1RFU1RfVU5JTlNUQUxMRUQ9MTsgXAorCWV4cG9ydCBIT01FPUBhYnNfdG9wX2J1aWxkZGlyQC9kYnVzOyBcCisJJChOVUxMKQorCittYW51YWxfYXV0aHpfU09VUkNFUyA9IG1hbnVhbC1hdXRoei5jCittYW51YWxfYXV0aHpfTERBREQgPSBcCisgICAgbGliZGJ1cy10ZXN0dXRpbHMubGEgXAorICAgICQoR0xJQl9MSUJTKSBcCisgICAgJChOVUxMKQorCitpZiBEQlVTX1VOSVgKK3Rlc3RfYXBwYXJtb3JfYWN0aXZhdGlvbl9DUFBGTEFHUyA9IFwKKyAgICAkKEFNX0NQUEZMQUdTKSBcCisgICAgLUREQlVTX1RFU1RfQVBQQVJNT1JfQUNUSVZBVElPTiBcCisgICAgJChOVUxMKQordGVzdF9hcHBhcm1vcl9hY3RpdmF0aW9uX1NPVVJDRVMgPSBcCisgICAgc2QtYWN0aXZhdGlvbi5jIFwKKyAgICAkKE5VTEwpCit0ZXN0X2FwcGFybW9yX2FjdGl2YXRpb25fTERBREQgPSBcCisgICAgbGliZGJ1cy10ZXN0dXRpbHMubGEgXAorICAgICQoQVBQQVJNT1JfTElCUykgXAorICAgICQoR0xJQl9MSUJTKSBcCisgICAgJChOVUxMKQorZW5kaWYKKwordGVzdF9jb3JydXB0X1NPVVJDRVMgPSBjb3JydXB0LmMKK3Rlc3RfY29ycnVwdF9MREFERCA9IFwKKyAgICBsaWJkYnVzLXRlc3R1dGlscy5sYSBcCisgICAgJChHTElCX0xJQlMpIFwKKyAgICAkKE5VTEwpCisKK3Rlc3RfbG9vcGJhY2tfU09VUkNFUyA9IGxvb3BiYWNrLmMKK3Rlc3RfbG9vcGJhY2tfTERBREQgPSBcCisgICAgbGliZGJ1cy10ZXN0dXRpbHMubGEgXAorICAgICQoR0xJQl9MSUJTKSBcCisgICAgJChOVUxMKQorCit0ZXN0X3JlbGF5X1NPVVJDRVMgPSByZWxheS5jCit0ZXN0X3JlbGF5X0xEQUREID0gXAorICAgIGxpYmRidXMtdGVzdHV0aWxzLmxhIFwKKyAgICAkKEdMSUJfTElCUykgXAorICAgICQoTlVMTCkKKwordGVzdF9kYnVzX2RhZW1vbl9TT1VSQ0VTID0gZGJ1cy1kYWVtb24uYwordGVzdF9kYnVzX2RhZW1vbl9MREFERCA9IFwKKyAgICBsaWJkYnVzLXRlc3R1dGlscy5sYSBcCisgICAgJChHTElCX0xJQlMpIFwKKyAgICAkKEdJT19VTklYX0xJQlMpIFwKKyAgICAkKE5VTEwpCisKK3Rlc3RfZGJ1c19kYWVtb25fZWF2ZXNkcm9wX1NPVVJDRVMgPSBkYnVzLWRhZW1vbi1lYXZlc2Ryb3AuYwordGVzdF9kYnVzX2RhZW1vbl9lYXZlc2Ryb3BfTERBREQgPSBcCisgICAgbGliZGJ1cy10ZXN0dXRpbHMubGEgXAorICAgICQoR0xJQl9MSUJTKSBcCisgICAgJChOVUxMKQorCitpZiBEQlVTX1VOSVgKK3Rlc3Rfc2RfYWN0aXZhdGlvbl9TT1VSQ0VTID0gXAorICAgIHNkLWFjdGl2YXRpb24uYyBcCisgICAgJChOVUxMKQordGVzdF9zZF9hY3RpdmF0aW9uX0xEQUREID0gXAorICAgIGxpYmRidXMtdGVzdHV0aWxzLmxhIFwKKyAgICAkKEdMSUJfTElCUykgXAorICAgICQoTlVMTCkKK2VuZGlmCisKK3Rlc3RfbWFyc2hhbF9TT1VSQ0VTID0gbWFyc2hhbC5jCit0ZXN0X21hcnNoYWxfTERBREQgPSBcCisgICAgbGliZGJ1cy10ZXN0dXRpbHMubGEgXAorICAgICQoR0xJQl9MSUJTKSBcCisgICAgJChOVUxMKQorCit0ZXN0X21lc3NhZ2VfU09VUkNFUyA9IFwKKyAgICBtZXNzYWdlLmMgXAorICAgICQoTlVMTCkKK3Rlc3RfbWVzc2FnZV9MREFERCA9IFwKKyAgICBsaWJkYnVzLXRlc3R1dGlscy5sYSBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2RidXMvbGliZGJ1cy1pbnRlcm5hbC5sYSBcCisgICAgJChHTElCX0xJQlMpIFwKKyAgICAkKE5VTEwpCisKK3Rlc3RfbW9uaXRvcl9TT1VSQ0VTID0gXAorICAgIG1vbml0b3IuYyBcCisgICAgJChOVUxMKQordGVzdF9tb25pdG9yX0xEQUREID0gXAorICAgIGxpYmRidXMtdGVzdHV0aWxzLmxhIFwKKyAgICAkKEdMSUJfTElCUykgXAorICAgICQoTlVMTCkKKwordGVzdF9zeW50YXhfU09VUkNFUyA9IHN5bnRheC5jCit0ZXN0X3N5bnRheF9MREFERCA9IFwKKyAgICBsaWJkYnVzLXRlc3R1dGlscy5sYSBcCisgICAgJChHTElCX0xJQlMpIFwKKyAgICAkKE5VTEwpCisKK21hbnVhbF90ZXN0X3RocmVhZF9ibG9ja2luZ19TT1VSQ0VTID0gdGhyZWFkLWJsb2NraW5nLmMKK21hbnVhbF90ZXN0X3RocmVhZF9ibG9ja2luZ19MREFERCA9IFwKKyAgICBsaWJkYnVzLXRlc3R1dGlscy5sYSBcCisgICAgJChHTElCX0xJQlMpIFwKKyAgICAkKE5VTEwpCisKK3Rlc3RfdWlkX3Blcm1pc3Npb25zX1NPVVJDRVMgPSBcCisgICAgdWlkLXBlcm1pc3Npb25zLmMgXAorICAgICQoTlVMTCkKK3Rlc3RfdWlkX3Blcm1pc3Npb25zX0xEQUREID0gXAorICAgIGxpYmRidXMtdGVzdHV0aWxzLmxhIFwKKyAgICAkKEdMSUJfTElCUykgXAorICAgICQoTlVMTCkKKwordGVzdF9mZHBhc3NfU09VUkNFUyA9IFwKKyAgICBmZHBhc3MuYyBcCisgICAgJChOVUxMKQordGVzdF9mZHBhc3NfTERBREQgPSBcCisgICAgbGliZGJ1cy10ZXN0dXRpbHMubGEgXAorICAgICQoR0xJQl9MSUJTKSBcCisgICAgJChOVUxMKQorCitURVNUUyArPSAkKGRpc3RfaW5zdGFsbGFibGVfdGVzdF9zY3JpcHRzKQoraW5zdGFsbGNoZWNrX3Rlc3RzICs9ICQoZGlzdF9pbnN0YWxsYWJsZV90ZXN0X3NjcmlwdHMpCisKK2lmIERCVVNfRU5BQkxFX01PRFVMQVJfVEVTVFMKK1RFU1RTICs9ICQoaW5zdGFsbGFibGVfdGVzdHMpCitpbnN0YWxsY2hlY2tfdGVzdHMgKz0gJChpbnN0YWxsYWJsZV90ZXN0cykKKworaWYgREJVU19FTkFCTEVfSU5TVEFMTEVEX1RFU1RTCisgIG5vYmFzZV90ZXN0ZXhlY19QUk9HUkFNUyArPSAkKGluc3RhbGxhYmxlX2hlbHBlcnMpCisgIG5vYmFzZV90ZXN0ZXhlY19QUk9HUkFNUyArPSAkKGluc3RhbGxhYmxlX21hbnVhbF90ZXN0cykKKyAgbm9iYXNlX3Rlc3RleGVjX1BST0dSQU1TICs9ICQoaW5zdGFsbGFibGVfdGVzdHMpCisgIG5vYmFzZV9kaXN0X3Rlc3RleGVjX1NDUklQVFMgKz0gJChkaXN0X2luc3RhbGxlZF90ZXN0X3NjcmlwdHMpCisgIG5vYmFzZV9kaXN0X3Rlc3RleGVjX1NDUklQVFMgKz0gJChkaXN0X2luc3RhbGxhYmxlX3Rlc3Rfc2NyaXB0cykKKworICBub2Jhc2VfdGVzdG1ldGFfREFUQSArPSAkKGluc3RhbGxhYmxlX3Rlc3RfbWV0YSkKKyAgbm9iYXNlX3Rlc3RtZXRhX0RBVEEgKz0gJChpbnN0YWxsYWJsZV90ZXN0X21ldGFfd2l0aF9jb25maWcpCitlbHNlICFEQlVTX0VOQUJMRV9JTlNUQUxMRURfVEVTVFMKKyAgbm9pbnN0X1BST0dSQU1TICs9ICQoaW5zdGFsbGFibGVfdGVzdHMpICQoaW5zdGFsbGFibGVfbWFudWFsX3Rlc3RzKQorZW5kaWYgIURCVVNfRU5BQkxFX0lOU1RBTExFRF9URVNUUworCitlbmRpZiBEQlVTX0VOQUJMRV9NT0RVTEFSX1RFU1RTCisKKyMgSWYgd2UncmUgaW5zdGFsbGluZyB0aGUgdGVzdHMgaW50byBhIERFU1RESVIgd2UgY2FuJ3QgcnVuIHRoZW0KKyMgYWdhaW4gdXNpbmcgdGhlIGluc3RhbGxlZCBjb3B5LCBiZWNhdXNlIHdlIGRvbid0IGtub3cgaG93IHRvCisjIGRvIGEgcG9ydGFibGUgZXF1aXZhbGVudCBvZiBzZXR0aW5nIExEX0xJQlJBUllfUEFUSC4KK2luc3RhbGxjaGVjay1sb2NhbDoKKwkkKE1BS0UpIGNoZWNrLVRFU1RTIFRFU1RTPSckJChpbnN0YWxsY2hlY2tfdGVzdHMpJyBcCisJCUFNX1RFU1RTX0VOVklST05NRU5UPSckJChpbnN0YWxsY2hlY2tfZW52aXJvbm1lbnQpJworaWYgREJVU19FTkFCTEVfSU5TVEFMTEVEX1RFU1RTCisJdGVzdCAtbiAiJChERVNURElSKSIgfHwgeyBcCisJJChpbnN0YWxsY2hlY2tfZW52aXJvbm1lbnQpIFwKKwkJJChzcmNkaXIpL2RidXMtdGVzdC1ydW5uZXIgXAorCQkkKHRlc3RleGVjZGlyKSBcCisJCSQoaW5zdGFsbGFibGVfdGVzdHMpOyB9CitlbmRpZiBEQlVTX0VOQUJMRV9JTlNUQUxMRURfVEVTVFMKKworaW5fZGF0YSA9IFwKKwlkYXRhL2RidXMtaW5zdGFsbGVkLXRlc3RzLmFhcHJvZmlsZS5pbiBcCisJZGF0YS9zeXN0ZW1kLWFjdGl2YXRpb24vY29tLmV4YW1wbGUuUmVjZWl2ZURlbmllZEJ5QXBwQXJtb3JMYWJlbC5zZXJ2aWNlLmluIFwKKwlkYXRhL3N5c3RlbWQtYWN0aXZhdGlvbi9jb20uZXhhbXBsZS5TZW5kRGVuaWVkQnlBcHBBcm1vckxhYmVsLnNlcnZpY2UuaW4gXAorCWRhdGEvc3lzdGVtZC1hY3RpdmF0aW9uL2NvbS5leGFtcGxlLlNlbmREZW5pZWRCeU5vbmV4aXN0ZW50QXBwQXJtb3JMYWJlbC5zZXJ2aWNlLmluIFwKKwlkYXRhL3N5c3RlbWQtYWN0aXZhdGlvbi9jb20uZXhhbXBsZS5TeXN0ZW1kQWN0aXZhdGFibGUzLnNlcnZpY2UuaW4gXAorCWRhdGEvdmFsaWQtY29uZmlnLWZpbGVzLXN5c3RlbS9kZWJ1Zy1hbGxvdy1hbGwtZmFpbC5jb25mLmluIFwKKwlkYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy1zeXN0ZW0vZGVidWctYWxsb3ctYWxsLXBhc3MuY29uZi5pbiBcCisJZGF0YS92YWxpZC1jb25maWctZmlsZXMvYXMtYW5vdGhlci11c2VyLmNvbmYuaW4gXAorCWRhdGEvdmFsaWQtY29uZmlnLWZpbGVzL2NvdW50LWZkcy5jb25mLmluIFwKKwlkYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9kZWJ1Zy1hbGxvdy1hbGwtc2hhMS5jb25mLmluIFwKKwlkYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9kZWJ1Zy1hbGxvdy1hbGwuY29uZi5pbiBcCisJZGF0YS92YWxpZC1jb25maWctZmlsZXMvZmluaXRlLXRpbWVvdXQuY29uZi5pbiBcCisJZGF0YS92YWxpZC1jb25maWctZmlsZXMvZm9yYmlkZGluZy5jb25mLmluIFwKKwlkYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9pbmNvbWluZy1saW1pdC5jb25mLmluIFwKKwlkYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9tYXgtY29tcGxldGVkLWNvbm5lY3Rpb25zLmNvbmYuaW4gXAorCWRhdGEvdmFsaWQtY29uZmlnLWZpbGVzL21heC1jb25uZWN0aW9ucy1wZXItdXNlci5jb25mLmluIFwKKwlkYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9tYXgtbWF0Y2gtcnVsZXMtcGVyLWNvbm5lY3Rpb24uY29uZi5pbiBcCisJZGF0YS92YWxpZC1jb25maWctZmlsZXMvbWF4LW5hbWVzLXBlci1jb25uZWN0aW9uLmNvbmYuaW4gXAorCWRhdGEvdmFsaWQtY29uZmlnLWZpbGVzL21heC1yZXBsaWVzLXBlci1jb25uZWN0aW9uLmNvbmYuaW4gXAorCWRhdGEvdmFsaWQtY29uZmlnLWZpbGVzL211bHRpLXVzZXIuY29uZi5pbiBcCisJZGF0YS92YWxpZC1jb25maWctZmlsZXMvcGVuZGluZy1mZC10aW1lb3V0LmNvbmYuaW4gXAorCWRhdGEvdmFsaWQtY29uZmlnLWZpbGVzL3N5c3RlbWQtYWN0aXZhdGlvbi5jb25mLmluIFwKKwlkYXRhL2ludmFsaWQtc2VydmljZS1maWxlcy1zeXN0ZW0vb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlTm9FeGVjLnNlcnZpY2UuaW4gXAorCWRhdGEvaW52YWxpZC1zZXJ2aWNlLWZpbGVzLXN5c3RlbS9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVOb1NlcnZpY2Uuc2VydmljZS5pbiBcCisJZGF0YS9pbnZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZU5vVXNlci5zZXJ2aWNlLmluIFwKKwlkYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZUVjaG9TZXJ2aWNlLnNlcnZpY2UuaW4gXAorCWRhdGEvdmFsaWQtc2VydmljZS1maWxlcy1zeXN0ZW0vb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlU2VnZmF1bHRTZXJ2aWNlLnNlcnZpY2UuaW4gXAorCWRhdGEvdmFsaWQtc2VydmljZS1maWxlcy1zeXN0ZW0vb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlU2hlbGxFY2hvU2VydmljZUZhaWwuc2VydmljZS5pbiBcCisJZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzLXN5c3RlbS9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVTaGVsbEVjaG9TZXJ2aWNlU3VjY2Vzcy5zZXJ2aWNlLmluIFwKKwlkYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMvb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlLlByaXZTZXJ2ZXIuc2VydmljZS5pbiBcCisJZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZUVjaG9TZXJ2aWNlLnNlcnZpY2UuaW4gXAorCWRhdGEvdmFsaWQtc2VydmljZS1maWxlcy9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVGb3JraW5nRWNob1NlcnZpY2Uuc2VydmljZS5pbiBcCisJZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZVNlZ2ZhdWx0U2VydmljZS5zZXJ2aWNlLmluIFwKKwlkYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMvb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlU2hlbGxFY2hvU2VydmljZUZhaWwuc2VydmljZS5pbiBcCisJZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZVNoZWxsRWNob1NlcnZpY2VTdWNjZXNzLnNlcnZpY2UuaW4gXAorCSQoTlVMTCkKKworRVhUUkFfRElTVCArPSAkKGluX2RhdGEpCisKK3N0YXRpY19kYXRhID0gXAorCW5hbWUtdGVzdC90bXAtc2Vzc2lvbi1saWtlLXN5c3RlbS5jb25mIFwKKwlkYXRhL2F1dGgvYW5vbnltb3VzLWNsaWVudC1zdWNjZXNzZnVsLmF1dGgtc2NyaXB0IFwKKwlkYXRhL2F1dGgvYW5vbnltb3VzLXNlcnZlci1zdWNjZXNzZnVsLmF1dGgtc2NyaXB0IFwKKwlkYXRhL2F1dGgvY2FuY2VsLmF1dGgtc2NyaXB0IFwKKwlkYXRhL2F1dGgvY2xpZW50LW91dC1vZi1tZWNoYW5pc21zLmF1dGgtc2NyaXB0IFwKKwlkYXRhL2F1dGgvY29va2llLXNoYTEtdXNlcm5hbWUuYXV0aC1zY3JpcHQgXAorCWRhdGEvYXV0aC9jb29raWUtc2hhMS5hdXRoLXNjcmlwdCBcCisJZGF0YS9hdXRoL2V4dGVybmFsLWZhaWxlZC5hdXRoLXNjcmlwdCBcCisJZGF0YS9hdXRoL2V4dGVybmFsLXJvb3QuYXV0aC1zY3JpcHQgXAorCWRhdGEvYXV0aC9leHRlcm5hbC1zaWxseS5hdXRoLXNjcmlwdCBcCisJZGF0YS9hdXRoL2V4dGVybmFsLXN1Y2Nlc3NmdWwuYXV0aC1zY3JpcHQgXAorCWRhdGEvYXV0aC9leHRyYS1ieXRlcy5hdXRoLXNjcmlwdCBcCisJZGF0YS9hdXRoL2ZhaWwtYWZ0ZXItbi1hdHRlbXB0cy5hdXRoLXNjcmlwdCBcCisJZGF0YS9hdXRoL2ZhbGxiYWNrLmF1dGgtc2NyaXB0IFwKKwlkYXRhL2F1dGgvaW52YWxpZC1jb21tYW5kLWNsaWVudC5hdXRoLXNjcmlwdCBcCisJZGF0YS9hdXRoL2ludmFsaWQtY29tbWFuZC5hdXRoLXNjcmlwdCBcCisJZGF0YS9hdXRoL2ludmFsaWQtaGV4LWVuY29kaW5nLmF1dGgtc2NyaXB0IFwKKwlkYXRhL2F1dGgvbWVjaGFuaXNtcy5hdXRoLXNjcmlwdCBcCisJZGF0YS9lcXVpdi1jb25maWctZmlsZXMvYmFzaWMvYmFzaWMtMS5jb25mIFwKKwlkYXRhL2VxdWl2LWNvbmZpZy1maWxlcy9iYXNpYy9iYXNpYy0yLmNvbmYgXAorCWRhdGEvZXF1aXYtY29uZmlnLWZpbGVzL2Jhc2ljL2Jhc2ljLmQvYmFzaWMuY29uZiBcCisJZGF0YS9lcXVpdi1jb25maWctZmlsZXMvZW50aXRpZXMvYmFzaWMuZC9iYXNpYy5jb25mIFwKKwlkYXRhL2VxdWl2LWNvbmZpZy1maWxlcy9lbnRpdGllcy9lbnRpdGllcy0xLmNvbmYgXAorCWRhdGEvZXF1aXYtY29uZmlnLWZpbGVzL2VudGl0aWVzL2VudGl0aWVzLTIuY29uZiBcCisJZGF0YS9pbmNvbXBsZXRlLW1lc3NhZ2VzL21pc3NpbmctYm9keS5tZXNzYWdlIFwKKwlkYXRhL2ludmFsaWQtY29uZmlnLWZpbGVzL2JhZHNlbGludXgtMS5jb25mIFwKKwlkYXRhL2ludmFsaWQtY29uZmlnLWZpbGVzL2JhZHNlbGludXgtMi5jb25mIFwKKwlkYXRhL2ludmFsaWQtY29uZmlnLWZpbGVzL2NpcmN1bGFyLTEuY29uZiBcCisJZGF0YS9pbnZhbGlkLWNvbmZpZy1maWxlcy9jaXJjdWxhci0yLmNvbmYgXAorCWRhdGEvaW52YWxpZC1jb25maWctZmlsZXMvY2lyY3VsYXItMy5jb25mIFwKKwlkYXRhL2ludmFsaWQtY29uZmlnLWZpbGVzL2ltcG9zc2libGUtc2VuZC5jb25mIFwKKwlkYXRhL2ludmFsaWQtY29uZmlnLWZpbGVzL25vdC13ZWxsLWZvcm1lZC5jb25mIFwKKwlkYXRhL2ludmFsaWQtY29uZmlnLWZpbGVzL3RydW5jYXRlZC1maWxlLmNvbmYgXAorCWRhdGEvaW52YWxpZC1jb25maWctZmlsZXMvc2VuZC1hbmQtcmVjZWl2ZS5jb25mIFwKKwlkYXRhL2ludmFsaWQtbWVzc2FnZXMvYXJyYXktb2YtbmlsLm1lc3NhZ2UgXAorCWRhdGEvaW52YWxpZC1tZXNzYWdlcy9hcnJheS13aXRoLW1peGVkLXR5cGVzLm1lc3NhZ2UgXAorCWRhdGEvaW52YWxpZC1tZXNzYWdlcy9iYWQtYm9vbGVhbi1hcnJheS5tZXNzYWdlIFwKKwlkYXRhL2ludmFsaWQtbWVzc2FnZXMvYmFkLWJvb2xlYW4ubWVzc2FnZSBcCisJZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL2JhZC1lbmRpYW4ubWVzc2FnZSBcCisJZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL2JhZC1oZWFkZXItZmllbGQtYWxpZ25tZW50Lm1lc3NhZ2UgXAorCWRhdGEvaW52YWxpZC1tZXNzYWdlcy9ib29sZWFuLWhhcy1uby12YWx1ZS5tZXNzYWdlLXJhdyBcCisJZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL2xvY2FsLW5hbWVzcGFjZS5tZXNzYWdlIFwKKwlkYXRhL2ludmFsaWQtbWVzc2FnZXMvbm8tZG90LWluLW5hbWUubWVzc2FnZSBcCisJZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL25vdC1udWwtaGVhZGVyLXBhZGRpbmcubWVzc2FnZSBcCisJZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL292ZXJsb25nLW5hbWUubWVzc2FnZSBcCisJZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL3Rvby1saXR0bGUtaGVhZGVyLXBhZGRpbmcubWVzc2FnZSBcCisJZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL3Rvby1tdWNoLWhlYWRlci1wYWRkaW5nLWJ5LWZhci5tZXNzYWdlIFwKKwlkYXRhL2ludmFsaWQtbWVzc2FnZXMvdG9vLW11Y2gtaGVhZGVyLXBhZGRpbmcubWVzc2FnZSBcCisJZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL3Rvby1zaG9ydC1kaWN0Lm1lc3NhZ2UgXAorCWRhdGEvc2hhLTEvUmVhZG1lLnR4dCBcCisJZGF0YS9zaGEtMS9iaXQtaGFzaGVzLnNoYTEgXAorCWRhdGEvc2hhLTEvYml0LW1lc3NhZ2VzLnNoYTEgXAorCWRhdGEvc2hhLTEvYnl0ZS1oYXNoZXMuc2hhMSBcCisJZGF0YS9zaGEtMS9ieXRlLW1lc3NhZ2VzLnNoYTEgXAorCWRhdGEvc3lzdGVtZC1hY3RpdmF0aW9uL2NvbS5leGFtcGxlLlJlY2VpdmVEZW5pZWQuc2VydmljZSBcCisJZGF0YS9zeXN0ZW1kLWFjdGl2YXRpb24vY29tLmV4YW1wbGUuU2VuZERlbmllZC5zZXJ2aWNlIFwKKwlkYXRhL3N5c3RlbWQtYWN0aXZhdGlvbi9jb20uZXhhbXBsZS5TZW5kRGVuaWVkQnlBcHBBcm1vck5hbWUuc2VydmljZSBcCisJZGF0YS9zeXN0ZW1kLWFjdGl2YXRpb24vY29tLmV4YW1wbGUuU3lzdGVtZEFjdGl2YXRhYmxlMS5zZXJ2aWNlIFwKKwlkYXRhL3N5c3RlbWQtYWN0aXZhdGlvbi9jb20uZXhhbXBsZS5TeXN0ZW1kQWN0aXZhdGFibGUyLnNlcnZpY2UgXAorCWRhdGEvc3lzdGVtZC1hY3RpdmF0aW9uL29yZy5mcmVlZGVza3RvcC5zeXN0ZW1kMS5zZXJ2aWNlIFwKKwlkYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9iYXNpYy5jb25mIFwKKwlkYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9iYXNpYy5kL2Jhc2ljLmNvbmYgXAorCWRhdGEvdmFsaWQtY29uZmlnLWZpbGVzL2NoZWNrLW93bi1ydWxlcy5jb25mIFwKKwlkYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9lbnRpdGllcy5jb25mIFwKKwlkYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9saXN0ZW4tdW5peC1ydW50aW1lLmNvbmYgXAorCWRhdGEvdmFsaWQtY29uZmlnLWZpbGVzL21hbnktcnVsZXMuY29uZiBcCisJZGF0YS92YWxpZC1jb25maWctZmlsZXMvc3RhbmRhcmQtc2Vzc2lvbi1kaXJzLmNvbmYgXAorCWRhdGEvdmFsaWQtY29uZmlnLWZpbGVzLXN5c3RlbS9tYW55LXJ1bGVzLmNvbmYgXAorCWRhdGEvdmFsaWQtY29uZmlnLWZpbGVzLXN5c3RlbS9zeXN0ZW0uZC90ZXN0LmNvbmYgXAorCWRhdGEvdmFsaWQtbWVzc2FnZXMvYXJyYXktb2YtYXJyYXktb2YtdWludDMyLm1lc3NhZ2UgXAorCWRhdGEvdmFsaWQtbWVzc2FnZXMvZGljdC1zaW1wbGUubWVzc2FnZSBcCisJZGF0YS92YWxpZC1tZXNzYWdlcy9kaWN0Lm1lc3NhZ2UgXAorCWRhdGEvdmFsaWQtbWVzc2FnZXMvZW1wdGluZXNzLm1lc3NhZ2UgXAorCWRhdGEvdmFsaWQtbWVzc2FnZXMvbG90cy1vZi1hcmd1bWVudHMubWVzc2FnZSBcCisJZGF0YS92YWxpZC1tZXNzYWdlcy9uby1wYWRkaW5nLm1lc3NhZ2UgXAorCWRhdGEvdmFsaWQtbWVzc2FnZXMvb3Bwb3NpdGUtZW5kaWFuLm1lc3NhZ2UgXAorCWRhdGEvdmFsaWQtbWVzc2FnZXMvcmVjdXJzaXZlLXR5cGVzLm1lc3NhZ2UgXAorCWRhdGEvdmFsaWQtbWVzc2FnZXMvc2ltcGxlc3QtbWFudWFsLm1lc3NhZ2UgXAorCWRhdGEvdmFsaWQtbWVzc2FnZXMvc2ltcGxlc3QubWVzc2FnZSBcCisJZGF0YS92YWxpZC1tZXNzYWdlcy9zdGFuZGFyZC1hY3F1aXJlLXNlcnZpY2UubWVzc2FnZSBcCisJZGF0YS92YWxpZC1tZXNzYWdlcy9zdGFuZGFyZC1oZWxsby5tZXNzYWdlIFwKKwlkYXRhL3ZhbGlkLW1lc3NhZ2VzL3N0YW5kYXJkLWxpc3Qtc2VydmljZXMubWVzc2FnZSBcCisJZGF0YS92YWxpZC1tZXNzYWdlcy9zdGFuZGFyZC1zZXJ2aWNlLWV4aXN0cy5tZXNzYWdlIFwKKwlkYXRhL3ZhbGlkLW1lc3NhZ2VzL3Vua25vd24taGVhZGVyLWZpZWxkLm1lc3NhZ2UgXAorCSQoTlVMTCkKKworRVhUUkFfRElTVCArPSAkKHN0YXRpY19kYXRhKQorCisjIyBjb3B5IHRlc3RzIHRvIGJ1aWxkZGlyIHNvIHRoYXQgZ2VuZXJhdGVkIHRlc3RzIGFuZCBzdGF0aWMgdGVzdHMKKyMjIGFyZSBhbGwgaW4gb25lIHBsYWNlLgorIyMgTm90ZSB0aGF0IHdlIGNhbid0IGNyZWF0ZSB0aGUgWERHX1JVTlRJTUVfRElSIHdpdGggcGVybWlzc2lvbnMgMDcwMAorIyMgb24gTVNZUzIsIHdoaWNoIHJlamVjdHMgYXR0ZW1wdHMgdG8gY2hhbmdlIHBlcm1pc3Npb25zLCBoZW5jZSAifHwgdHJ1ZSIuCithbGwtbG9jYWw6IGNvcHktY29uZmlnLWxvY2FsIHVuaW5zdGFsbGVkLWNvbmZpZy1sb2NhbAorCSQoQU1fVl9hdCkkKE1LRElSX1ApIFhER19SVU5USU1FX0RJUgorCSQoQU1fVl9hdCljaG1vZCAwNzAwIFhER19SVU5USU1FX0RJUiB8fCB0cnVlCisKK2NvcHktY29uZmlnLWxvY2FsOgorCSQoQU1fVl9hdCkkKE1LRElSX1ApIGRhdGEvdmFsaWQtY29uZmlnLWZpbGVzL3Nlc3Npb24uZAorCSQoQU1fVl9HRU4pc2V0IC1lOyBcCisJaWYgdGVzdCAkKHNyY2RpcikgPSAuIHx8IHRlc3QgJChzcmNkaXIpIC1lZiAuOyB0aGVuIFwKKwkJZWNobyAnLS0gTm8gbmVlZCB0byBjb3B5IHRlc3QgZGF0YSBhcyBzcmNkaXIgPSBidWlsZGRpcic7IFwKKwllbHNlIFwKKwkJZm9yIEYgaW4gJChzdGF0aWNfZGF0YSk7IGRvIFwKKwkJCSQoTUtESVJfUCkgIiQke0YlLyp9IjsgXAorCQkJcm0gLWYgIiQkRiI7IFwKKwkJCWNwICQoc3JjZGlyKS8iJCRGIiAiJCRGIjsgXAorCQlkb25lOyBcCisJZmkKKwordW5pbnN0YWxsZWQtY29uZmlnLWxvY2FsOgorCSQoQU1fVl9HRU4pc2V0IC1lOyBcCisJZm9yIEYgaW4gJChpbl9kYXRhKTsgZG8gXAorCQkkKE1LRElSX1ApICIkJHtGJS8qfSI7IFwKKwkJc2VkIFwKKwkJCS1lICdzLFtAXURCVVNfVEVTVF9EQVRBW0BdLEBhYnNfYnVpbGRkaXJAL2RhdGEsJyBcCisJCQktZSAncyxbQF1EQlVTX1RFU1RfRVhFQ1tAXSxAYWJzX2J1aWxkZGlyQCwnIFwKKwkJCS1lICdzLFtAXURCVVNfVVNFUltAXSwkKERCVVNfVVNFUiksJyBcCisJCQktZSAncyxbQF1FWEVFWFRbQF0sJChFWEVFWFQpLCcgXAorCQkJLWUgJ3MsW0BdVEVTVF9MQVVOQ0hfSEVMUEVSX0JJTkFSWVtAXSxAYWJzX3RvcF9idWlsZGRpckAvYnVzL2RidXMtZGFlbW9uLWxhdW5jaC1oZWxwZXItdGVzdCQoRVhFRVhUKSwnIFwKKwkJCS1lICdzLFtAXVRFU1RfTElTVEVOW0BdLCQoVEVTVF9MSVNURU4pLCcgXAorCQkJPCAkKHNyY2RpcikvIiQkRiIgPiAiJCR7RiUuaW59IjsgXAorCWRvbmUKKworaW5zdGFsbGFibGUtY29uZmlnLWxvY2FsOgoraWYgREJVU19FTkFCTEVfSU5TVEFMTEVEX1RFU1RTCisJJChBTV9WX0dFTilzZXQgLWU7IFwKKwlmb3IgRiBpbiAkKGluX2RhdGEpOyBkbyBcCisJCSQoTUtESVJfUCkgImluc3RhbGxhYmxlLyQke0YlLyp9IjsgXAorCQlzZWQgXAorCQkJLWUgJ3MsW0BdREJVU19URVNUX0RBVEFbQF0sJCh0ZXN0ZXhlY2RpcikvZGF0YSwnIFwKKwkJCS1lICdzLFtAXURCVVNfVEVTVF9FWEVDW0BdLCQodGVzdGV4ZWNkaXIpLCcgXAorCQkJLWUgJ3MsW0BdREJVU19VU0VSW0BdLCQoREJVU19VU0VSKSwnIFwKKwkJCS1lICdzLFtAXUVYRUVYVFtAXSwkKEVYRUVYVCksJyBcCisJCQktZSAncyxbQF1URVNUX0xBVU5DSF9IRUxQRVJfQklOQVJZW0BdLC9iaW4vZmFsc2UsJyBcCisJCQktZSAncyxbQF1URVNUX0xJU1RFTltAXSwkKFRFU1RfTElTVEVOKSwnIFwKKwkJCTwgJChzcmNkaXIpLyIkJEYiID4gImluc3RhbGxhYmxlLyQke0YlLmlufSI7IFwKKwlkb25lCitlbHNlCisJQDoKK2VuZGlmCisKKworaW5zdGFsbC1kYXRhLWxvY2FsOiBpbnN0YWxsLWNvbmZpZy1sb2NhbAorCUA6CisKK2luc3RhbGwtY29uZmlnLWxvY2FsOiBpbnN0YWxsYWJsZS1jb25maWctbG9jYWwKK2lmIERCVVNfRU5BQkxFX0lOU1RBTExFRF9URVNUUworCSQoQU1fVl9HRU4pc2V0IC1lOyBcCisJZm9yIEYgaW4gJChzdGF0aWNfZGF0YSk7IGRvIFwKKwkJaW5zdGFsbCAtZCAiJChERVNURElSKSQodGVzdGV4ZWNkaXIpLyQke0YlLyp9IjsgXAorCQlpbnN0YWxsIC1tNjQ0ICIkKHNyY2RpcikvJCRGIiAiJChERVNURElSKSQodGVzdGV4ZWNkaXIpLyQkRiI7IFwKKwlkb25lOyBcCisJZm9yIEYgaW4gJChpbl9kYXRhKTsgZG8gXAorCQlpbnN0YWxsIC1kICIkKERFU1RESVIpJCh0ZXN0ZXhlY2RpcikvJCR7RiUvKn0iOyBcCisJCWluc3RhbGwgLW02NDQgImluc3RhbGxhYmxlLyQke0YlLmlufSIgIiQoREVTVERJUikkKHRlc3RleGVjZGlyKS8kJHtGJS5pbn0iOyBcCisJZG9uZQorCWxuIC1uZnMgJChkYXRhZGlyKS9kYnVzLTEvc2Vzc2lvbi5jb25mICQoREVTVERJUikkKHRlc3RleGVjZGlyKS9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9zZXNzaW9uLmNvbmYKKwlsbiAtbmZzICQoZGF0YWRpcikvZGJ1cy0xL3N5c3RlbS5jb25mICQoREVTVERJUikkKHRlc3RleGVjZGlyKS9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy1zeXN0ZW0vc3lzdGVtLmNvbmYKK2Vsc2UKKwlAOgorZW5kaWYKKworIyMgdGhpcyBkb2Vzbid0IGNsZWFuIG1vc3QgY29waWVkIHRlc3QgZGF0YSBmaWxlcyB3aGVuIHNyY2Rpcj1idWlsZGRpcgorY2xlYW4tbG9jYWw6CisJJChBTV9WX2F0KWlmIHRlc3QgJChzcmNkaXIpID0gLiB8fCB0ZXN0ICQoc3JjZGlyKSAtZWYgLjsgdGhlbiBcCisJCWVjaG8gJy0tIE5vIG5lZWQgdG8gY2xlYW4gdGVzdCBkYXRhIGFzIHNyY2RpciA9IGJ1aWxkZGlyJzsgXAorCWVsc2UgXAorCQlybSAtZiAkKHN0YXRpY19kYXRhKTsgXAorCQlmb3IgRiBpbiAkKGluX2RhdGEpOyBkbyBcCisJCQlybSAtZiAiJCR7RiUuaW59IjsgXAorCQlkb25lOyBcCisJZmkKKwlybSAtZnIgLi9YREdfUlVOVElNRV9ESVIgLi9pbnN0YWxsYWJsZQorCitpbXBvcnRlZF9kYXRhID0gXAorCWRhdGEvdmFsaWQtY29uZmlnLWZpbGVzL3Nlc3Npb24uY29uZiBcCisJZGF0YS92YWxpZC1jb25maWctZmlsZXMtc3lzdGVtL3N5c3RlbS5jb25mIFwKKwkkKE5VTEwpCisKK25vaW5zdF9EQVRBID0gJChpbXBvcnRlZF9kYXRhKQorQ0xFQU5GSUxFUyArPSBcCisJJChub2luc3RfREFUQSkgXAorCSQoTlVMTCkKKworZGF0YS92YWxpZC1jb25maWctZmlsZXMvc2Vzc2lvbi5jb25mOiAkKHRvcF9idWlsZGRpcikvYnVzL3Nlc3Npb24uY29uZgorCSQoQU1fVl9hdCkkKE1LRElSX1ApIGRhdGEvdmFsaWQtY29uZmlnLWZpbGVzCisJJChBTV9WX0dFTiljcCAkPCAkQAorCitkYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy1zeXN0ZW0vc3lzdGVtLmNvbmY6ICQodG9wX2J1aWxkZGlyKS9idXMvc3lzdGVtLmNvbmYKKwkkKEFNX1ZfYXQpJChNS0RJUl9QKSBkYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy1zeXN0ZW0KKwkkKEFNX1ZfR0VOKWNwICQ8ICRACisKKyQoaW5zdGFsbGFibGVfdGVzdF9tZXRhKTogJS50ZXN0OiAlJChFWEVFWFQpIE1ha2VmaWxlCisJJChBTV9WX2F0KSQoTUtESVJfUCkgJChkaXIgJEApCisJJChBTV9WX0dFTikgKCBcCisJCWVjaG8gJ1tUZXN0XSc7IFwKKwkJZWNobyAnVHlwZT1zZXNzaW9uJzsgXAorCQllY2hvICdPdXRwdXQ9VEFQJzsgXAorCQllY2hvICdFeGVjPWVudiAkKHRlc3RleGVjZGlyKS8kKiAtLXRhcCc7IFwKKwkpID4gJEAudG1wICYmIG12ICRALnRtcCAkQAorCiskKGluc3RhbGxhYmxlX3Rlc3RfbWV0YV93aXRoX2NvbmZpZyk6ICVfd2l0aF9jb25maWcudGVzdDogJSQoRVhFRVhUKSBNYWtlZmlsZQorCSQoQU1fVl9hdCkkKE1LRElSX1ApICQoZGlyICRAKQorCSQoQU1fVl9HRU4pICggXAorCQllY2hvICdbVGVzdF0nOyBcCisJCWVjaG8gJ1R5cGU9c2Vzc2lvbic7IFwKKwkJZWNobyAnT3V0cHV0PVRBUCc7IFwKKwkJZWNobyAnRXhlYz1lbnYgREJVU19URVNUX0VYRUM9JCh0ZXN0ZXhlY2RpcikgREJVU19URVNUX0RBVEE9JCh0ZXN0ZXhlY2RpcikvZGF0YSAkKHRlc3RleGVjZGlyKS8kKiAtLXRhcCc7IFwKKwkpID4gJEAudG1wICYmIG12ICRALnRtcCAkQAorCisjIEFkZCBydWxlcyBmb3IgY29kZS1jb3ZlcmFnZSB0ZXN0aW5nLCBhcyBkZWZpbmVkIGJ5IEFYX0NPREVfQ09WRVJBR0UKK2luY2x1ZGUgJCh0b3Bfc3JjZGlyKS9hbWluY2x1ZGVfc3RhdGljLmFtCmRpZmYgLS1naXQgYS90ZXN0L2NvcnJ1cHQuYyBiL3Rlc3QvY29ycnVwdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2YTkxMmYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvcnJ1cHQuYwpAQCAtMCwwICsxLDQyNSBAQAorLyogUmVncmVzc2lvbiB0ZXN0IGZvciBiZWluZyBkaXNjb25uZWN0ZWQgYnkgYSBjb3JydXB0IG1lc3NhZ2UgKGZkLm8gIzE1NTc4KQorICoKKyAqIEF1dGhvcjogU2ltb24gTWNWaXR0aWUgPHNpbW9uLm1jdml0dGllQGNvbGxhYm9yYS5jby51az4KKyAqIENvcHlyaWdodCDCqSAyMDEwLTIwMTEgTm9raWEgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMKKyAqICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sCisgKiBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLAorICogcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwKKyAqIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCisgKiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQorICogaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisKKyNpbmNsdWRlIDxnbGliLmg+CisjaW5jbHVkZSA8Z2lvL2dpby5oPgorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLmg+CisKKyNpbmNsdWRlICJ0ZXN0LXV0aWxzLWdsaWIuaCIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIERCdXNFcnJvciBlOworICAgIFRlc3RNYWluQ29udGV4dCAqY3R4OworICAgIGdib29sZWFuIHNraXA7CisKKyAgICBEQnVzU2VydmVyICpzZXJ2ZXI7CisgICAgREJ1c0Nvbm5lY3Rpb24gKnNlcnZlcl9jb25uOworICAgIC8qIHF1ZXVlIG9mIERCdXNNZXNzYWdlICovCisgICAgR1F1ZXVlIGNsaWVudF9tZXNzYWdlczsKKworICAgIERCdXNDb25uZWN0aW9uICpjbGllbnRfY29ubjsKK30gRml4dHVyZTsKKworc3RhdGljIHZvaWQKK2Fzc2VydF9ub19lcnJvciAoY29uc3QgREJ1c0Vycm9yICplKQoreworICBpZiAoR19VTkxJS0VMWSAoZGJ1c19lcnJvcl9pc19zZXQgKGUpKSkKKyAgICBnX2Vycm9yICgiZXhwZWN0ZWQgc3VjY2VzcyBidXQgZ290IGVycm9yOiAlczogJXMiLCBlLT5uYW1lLCBlLT5tZXNzYWdlKTsKK30KKworc3RhdGljIERCdXNIYW5kbGVyUmVzdWx0CitjbGllbnRfbWVzc2FnZV9jYiAoREJ1c0Nvbm5lY3Rpb24gKmNsaWVudF9jb25uLAorICAgIERCdXNNZXNzYWdlICptZXNzYWdlLAorICAgIHZvaWQgKmRhdGEpCit7CisgIEZpeHR1cmUgKmYgPSBkYXRhOworCisgIGdfYXNzZXJ0IChjbGllbnRfY29ubiA9PSBmLT5jbGllbnRfY29ubik7CisgIGdfcXVldWVfcHVzaF90YWlsICgmZi0+Y2xpZW50X21lc3NhZ2VzLCBkYnVzX21lc3NhZ2VfcmVmIChtZXNzYWdlKSk7CisKKyAgcmV0dXJuIERCVVNfSEFORExFUl9SRVNVTFRfSEFORExFRDsKK30KKworc3RhdGljIHZvaWQKK25ld19jb25uX2NiIChEQnVzU2VydmVyICpzZXJ2ZXIsCisgICAgREJ1c0Nvbm5lY3Rpb24gKnNlcnZlcl9jb25uLAorICAgIHZvaWQgKmRhdGEpCit7CisgIEZpeHR1cmUgKmYgPSBkYXRhOworCisgIGdfYXNzZXJ0IChmLT5zZXJ2ZXJfY29ubiA9PSBOVUxMKTsKKyAgZi0+c2VydmVyX2Nvbm4gPSBkYnVzX2Nvbm5lY3Rpb25fcmVmIChzZXJ2ZXJfY29ubik7CisgIHRlc3RfY29ubmVjdGlvbl9zZXR1cCAoZi0+Y3R4LCBzZXJ2ZXJfY29ubik7Cit9CisKK3N0YXRpYyB2b2lkCitzZXR1cCAoRml4dHVyZSAqZiwKKyAgICBnY29uc3Rwb2ludGVyIGFkZHIpCit7CisgIGYtPmN0eCA9IHRlc3RfbWFpbl9jb250ZXh0X2dldCAoKTsKKyAgZGJ1c19lcnJvcl9pbml0ICgmZi0+ZSk7CisgIGdfcXVldWVfaW5pdCAoJmYtPmNsaWVudF9tZXNzYWdlcyk7CisKKyAgaWYgKChnX3N0cl9oYXNfcHJlZml4IChhZGRyLCAidGNwOiIpIHx8CisgICAgICAgZ19zdHJfaGFzX3ByZWZpeCAoYWRkciwgIm5vbmNlLXRjcDoiKSkgJiYKKyAgICAgICF0ZXN0X2NoZWNrX3RjcF93b3JrcyAoKSkKKyAgICB7CisgICAgICBmLT5za2lwID0gVFJVRTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgZi0+c2VydmVyID0gZGJ1c19zZXJ2ZXJfbGlzdGVuIChhZGRyLCAmZi0+ZSk7CisgIGFzc2VydF9ub19lcnJvciAoJmYtPmUpOworICBnX2Fzc2VydCAoZi0+c2VydmVyICE9IE5VTEwpOworCisgIGRidXNfc2VydmVyX3NldF9uZXdfY29ubmVjdGlvbl9mdW5jdGlvbiAoZi0+c2VydmVyLAorICAgICAgbmV3X2Nvbm5fY2IsIGYsIE5VTEwpOworICB0ZXN0X3NlcnZlcl9zZXR1cCAoZi0+Y3R4LCBmLT5zZXJ2ZXIpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9jb25uZWN0IChGaXh0dXJlICpmLAorICAgIGdjb25zdHBvaW50ZXIgYWRkciBHX0dOVUNfVU5VU0VEKQoreworICBkYnVzX2Jvb2xfdCBoYXZlX21lbTsKKyAgY2hhciAqYWRkcmVzcyA9IE5VTEw7CisKKyAgaWYgKGYtPnNraXApCisgICAgcmV0dXJuOworCisgIGdfYXNzZXJ0IChmLT5zZXJ2ZXJfY29ubiA9PSBOVUxMKTsKKworICBhZGRyZXNzID0gZGJ1c19zZXJ2ZXJfZ2V0X2FkZHJlc3MgKGYtPnNlcnZlcik7CisgIGYtPmNsaWVudF9jb25uID0gZGJ1c19jb25uZWN0aW9uX29wZW5fcHJpdmF0ZSAoYWRkcmVzcywgJmYtPmUpOworICBhc3NlcnRfbm9fZXJyb3IgKCZmLT5lKTsKKyAgZ19hc3NlcnQgKGYtPmNsaWVudF9jb25uICE9IE5VTEwpOworICB0ZXN0X2Nvbm5lY3Rpb25fc2V0dXAgKGYtPmN0eCwgZi0+Y2xpZW50X2Nvbm4pOworICBkYnVzX2ZyZWUgKGFkZHJlc3MpOworCisgIHdoaWxlIChmLT5zZXJ2ZXJfY29ubiA9PSBOVUxMKQorICAgIHsKKyAgICAgIHRlc3RfcHJvZ3Jlc3MgKCcuJyk7CisgICAgICB0ZXN0X21haW5fY29udGV4dF9pdGVyYXRlIChmLT5jdHgsIFRSVUUpOworICAgIH0KKworICBoYXZlX21lbSA9IGRidXNfY29ubmVjdGlvbl9hZGRfZmlsdGVyIChmLT5jbGllbnRfY29ubiwKKyAgICAgIGNsaWVudF9tZXNzYWdlX2NiLCBmLCBOVUxMKTsKKyAgZ19hc3NlcnQgKGhhdmVfbWVtKTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfbWVzc2FnZSAoRml4dHVyZSAqZiwKKyAgICBnY29uc3Rwb2ludGVyIGFkZHIpCit7CisgIGRidXNfYm9vbF90IGhhdmVfbWVtOworICBkYnVzX3VpbnQzMl90IHNlcmlhbDsKKyAgREJ1c01lc3NhZ2UgKm91dGdvaW5nLCAqaW5jb21pbmc7CisKKyAgaWYgKGYtPnNraXApCisgICAgcmV0dXJuOworCisgIHRlc3RfY29ubmVjdCAoZiwgYWRkcik7CisKKyAgb3V0Z29pbmcgPSBkYnVzX21lc3NhZ2VfbmV3X3NpZ25hbCAoIi9jb20vZXhhbXBsZS9IZWxsbyIsCisgICAgICAiY29tLmV4YW1wbGUuSGVsbG8iLCAiR3JlZXRpbmciKTsKKyAgZ19hc3NlcnQgKG91dGdvaW5nICE9IE5VTEwpOworCisgIGhhdmVfbWVtID0gZGJ1c19jb25uZWN0aW9uX3NlbmQgKGYtPnNlcnZlcl9jb25uLCBvdXRnb2luZywgJnNlcmlhbCk7CisgIGdfYXNzZXJ0IChoYXZlX21lbSk7CisgIGdfYXNzZXJ0IChzZXJpYWwgIT0gMCk7CisKKyAgd2hpbGUgKGdfcXVldWVfaXNfZW1wdHkgKCZmLT5jbGllbnRfbWVzc2FnZXMpKQorICAgIHsKKyAgICAgIHRlc3RfcHJvZ3Jlc3MgKCcuJyk7CisgICAgICB0ZXN0X21haW5fY29udGV4dF9pdGVyYXRlIChmLT5jdHgsIFRSVUUpOworICAgIH0KKworICBnX2Fzc2VydF9jbXB1aW50IChnX3F1ZXVlX2dldF9sZW5ndGggKCZmLT5jbGllbnRfbWVzc2FnZXMpLCA9PSwgMSk7CisKKyAgaW5jb21pbmcgPSBnX3F1ZXVlX3BvcF9oZWFkICgmZi0+Y2xpZW50X21lc3NhZ2VzKTsKKworICBnX2Fzc2VydCAoIWRidXNfbWVzc2FnZV9jb250YWluc191bml4X2ZkcyAoaW5jb21pbmcpKTsKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X2Rlc3RpbmF0aW9uIChpbmNvbWluZyksID09LCBOVUxMKTsKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X2Vycm9yX25hbWUgKGluY29taW5nKSwgPT0sIE5VTEwpOworICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfaW50ZXJmYWNlIChpbmNvbWluZyksID09LAorICAgICAgImNvbS5leGFtcGxlLkhlbGxvIik7CisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKGluY29taW5nKSwgPT0sICJHcmVldGluZyIpOworICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfc2VuZGVyIChpbmNvbWluZyksID09LCBOVUxMKTsKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X3NpZ25hdHVyZSAoaW5jb21pbmcpLCA9PSwgIiIpOworICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfcGF0aCAoaW5jb21pbmcpLCA9PSwgIi9jb20vZXhhbXBsZS9IZWxsbyIpOworICBnX2Fzc2VydF9jbXB1aW50IChkYnVzX21lc3NhZ2VfZ2V0X3NlcmlhbCAoaW5jb21pbmcpLCA9PSwgc2VyaWFsKTsKKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKGluY29taW5nKTsKKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG91dGdvaW5nKTsKK30KKworc3RhdGljIHZvaWQKK3NlbmRfbl9ieXRlcyAoR1NvY2tldCAqc29ja2V0LAorICAgICAgICAgICAgICBjb25zdCBnY2hhciAqYmxvYiwKKyAgICAgICAgICAgICAgZ3NzaXplIGJsb2JfbGVuKQoreworICBnc3NpemUgbGVuLCB0b3RhbF9zZW50OworICBHRXJyb3IgKmdlcnJvciA9IE5VTEw7CisKKyAgdG90YWxfc2VudCA9IDA7CisKKyAgd2hpbGUgKHRvdGFsX3NlbnQgPCBibG9iX2xlbikKKyAgICB7CisgICAgICBsZW4gPSBnX3NvY2tldF9zZW5kIChzb2NrZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9iICsgdG90YWxfc2VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2JfbGVuIC0gdG90YWxfc2VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICZnZXJyb3IpOworCisgICAgICAvKiB0aGlzIGlzIE5VTEwtc2FmZTogYSBOVUxMIGVycm9yIGRvZXMgbm90IG1hdGNoICovCisgICAgICBpZiAoZ19lcnJvcl9tYXRjaGVzIChnZXJyb3IsIEdfSU9fRVJST1IsIEdfSU9fRVJST1JfV09VTERfQkxPQ0spKQorICAgICAgICB7CisgICAgICAgICAgLyogd2UgY291bGQgd2FpdCBmb3IgR19JT19PVVQsIGJ1dCBsaWZlJ3MgdG9vIHNob3J0OyBqdXN0IHNsZWVwICovCisgICAgICAgICAgZ19jbGVhcl9lcnJvciAoJmdlcnJvcik7CisgICAgICAgICAgZ191c2xlZXAgKEdfVVNFQ19QRVJfU0VDIC8gMTApOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgIGdfYXNzZXJ0X25vX2Vycm9yIChnZXJyb3IpOworICAgICAgZ19hc3NlcnQgKGxlbiA+PSAwKTsKKyAgICAgIHRvdGFsX3NlbnQgKz0gbGVuOworICAgIH0KK30KKworLyogRW5vdWdoIGJ5dGVzIGZvciBpdCB0byBiZSBvYnZpb3VzIHRoYXQgdGhpcyBjb25uZWN0aW9uIGlzIGJyb2tlbiAqLworI2RlZmluZSBDT1JSVVBUX0xFTiAxMDI0CisKKy8qIEFsbC16ZXJvIGlzIG5vdCBhIHZhbGlkIEQtQnVzIG1lc3NhZ2UgaGVhZGVyIC0gZm9yIGEgc3RhcnQsIHRoaXMgaXMKKyAqIHByb3RvY29sIHZlcnNpb24gMSwgbm90IDAgKi8KK3N0YXRpYyBjb25zdCBnY2hhciBub3RfYV9kYnVzX21lc3NhZ2VbQ09SUlVQVF9MRU5dID0geyAwIH07CisKK3N0YXRpYyB2b2lkCit0ZXN0X2NvcnJ1cHQgKEZpeHR1cmUgKmYsCisgICAgZ2NvbnN0cG9pbnRlciBhZGRyKQoreworICBHU29ja2V0ICpzb2NrZXQ7CisgIEdFcnJvciAqZ2Vycm9yID0gTlVMTDsKKyAgaW50IGZkOworICBEQnVzTWVzc2FnZSAqaW5jb21pbmc7CisKKyAgaWYgKGYtPnNraXApCisgICAgcmV0dXJuOworCisgIHRlc3RfbWVzc2FnZSAoZiwgYWRkcik7CisKKyAgZGJ1c19jb25uZWN0aW9uX2ZsdXNoIChmLT5zZXJ2ZXJfY29ubik7CisKKyAgLyogT0ssIG5vdyB0aGUgY29ubmVjdGlvbiBpcyB3b3JraW5nLCBsZXQncyBicmVhayBpdCEgRG9uJ3QgdHJ5IHRoaXMKKyAgICogYXQgaG9tZTsgc3BsaWNpbmcgYXJiaXRyYXJ5IGJ5dGVzIGludG8gdGhlIG1pZGRsZSBvZiB0aGUgc3RyZWFtIGlzCisgICAqIHNwZWNpZmljYWxseSBkb2N1bWVudGVkIGFzIG5vdCBhIHZhbGlkIHRoaW5nIHRvIGRvLiBXaG8nZCBoYXZlIHRob3VnaHQ/ICovCisgIGlmICghZGJ1c19jb25uZWN0aW9uX2dldF9zb2NrZXQgKGYtPnNlcnZlcl9jb25uLCAmZmQpKQorICAgIGdfZXJyb3IgKCJmYWlsZWQgdG8gc3RlYWwgZmQgZnJvbSBzZXJ2ZXIgY29ubmVjdGlvbiIpOworCisgIHNvY2tldCA9IGdfc29ja2V0X25ld19mcm9tX2ZkIChmZCwgJmdlcnJvcik7CisgIGdfYXNzZXJ0X25vX2Vycm9yIChnZXJyb3IpOworICBnX2Fzc2VydCAoc29ja2V0ICE9IE5VTEwpOworCisgIHNlbmRfbl9ieXRlcyAoc29ja2V0LCBub3RfYV9kYnVzX21lc3NhZ2UsIENPUlJVUFRfTEVOKTsKKworICAvKiBOb3cgc3BpbiBvbiB0aGUgY2xpZW50IGNvbm5lY3Rpb246IHRoZSBzZXJ2ZXIganVzdCBzZW50IGl0IGNvbXBsZXRlCisgICAqIHJ1YmJpc2gsIHNvIGl0IHNob3VsZCBkaXNjb25uZWN0ICovCisgIHdoaWxlIChnX3F1ZXVlX2lzX2VtcHR5ICgmZi0+Y2xpZW50X21lc3NhZ2VzKSkKKyAgICB7CisgICAgICB0ZXN0X3Byb2dyZXNzICgnLicpOworICAgICAgdGVzdF9tYWluX2NvbnRleHRfaXRlcmF0ZSAoZi0+Y3R4LCBUUlVFKTsKKyAgICB9CisKKyAgaW5jb21pbmcgPSBnX3F1ZXVlX3BvcF9oZWFkICgmZi0+Y2xpZW50X21lc3NhZ2VzKTsKKworICBnX2Fzc2VydCAoIWRidXNfbWVzc2FnZV9jb250YWluc191bml4X2ZkcyAoaW5jb21pbmcpKTsKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X2Rlc3RpbmF0aW9uIChpbmNvbWluZyksID09LCBOVUxMKTsKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X2Vycm9yX25hbWUgKGluY29taW5nKSwgPT0sIE5VTEwpOworICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfaW50ZXJmYWNlIChpbmNvbWluZyksID09LAorICAgICAgIm9yZy5mcmVlZGVza3RvcC5EQnVzLkxvY2FsIik7CisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKGluY29taW5nKSwgPT0sICJEaXNjb25uZWN0ZWQiKTsKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X3NlbmRlciAoaW5jb21pbmcpLCA9PSwgTlVMTCk7CisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9zaWduYXR1cmUgKGluY29taW5nKSwgPT0sICIiKTsKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X3BhdGggKGluY29taW5nKSwgPT0sCisgICAgICAiL29yZy9mcmVlZGVza3RvcC9EQnVzL0xvY2FsIik7CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChpbmNvbWluZyk7CisKKyAgLyogRnJlZSB0aGUgREJ1c0Nvbm5lY3Rpb24gYmVmb3JlIHRoZSBHU29ja2V0LCBiZWNhdXNlIEdTb2NrZXQgaXMKKyAgICogZ29pbmcgdG8gY2xvc2Ugb3VyIGZkLiBHU29ja2V0IHRvbGVyYXRlcyBjbG9zaW5nIGFuIGFscmVhZHktY2xvc2VkCisgICAqIGZkLCB3aGVyZWFzIERCdXNMb29wICsgREJ1c1NvY2tldFNldEVwb2xsIGRvZXNuJ3QuIE9uIFVuaXgKKyAgICogd2UgY291bGQgdXNlIGR1cCgpIGJ1dCB0aGF0IGlzbid0IHBvcnRhYmxlIHRvIFdpbmRvd3MgOi0oCisgICAqLworICBkYnVzX2Nvbm5lY3Rpb25fY2xvc2UgKGYtPnNlcnZlcl9jb25uKTsKKyAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChmLT5zZXJ2ZXJfY29ubik7CisgIGYtPnNlcnZlcl9jb25uID0gTlVMTDsKKworICBnX29iamVjdF91bnJlZiAoc29ja2V0KTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfYnl0ZV9vcmRlciAoRml4dHVyZSAqZiwKKyAgICBnY29uc3Rwb2ludGVyIGFkZHIpCit7CisgIEdTb2NrZXQgKnNvY2tldDsKKyAgR0Vycm9yICpnZXJyb3IgPSBOVUxMOworICBpbnQgZmQ7CisgIGNoYXIgKmJsb2I7CisgIGNvbnN0IGdjaGFyICphcmcgPSBub3RfYV9kYnVzX21lc3NhZ2U7CisgIGludCBibG9iX2xlbjsKKyAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisgIGRidXNfYm9vbF90IG1lbTsKKworICBpZiAoZi0+c2tpcCkKKyAgICByZXR1cm47CisKKyAgdGVzdF9tZXNzYWdlIChmLCBhZGRyKTsKKworICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ld19zaWduYWwgKCIvIiwgImEuYiIsICJjIik7CisgIGdfYXNzZXJ0IChtZXNzYWdlICE9IE5VTEwpOworICAvKiBBcHBlbmQgMHhGRiBieXRlcywgc28gdGhhdCB0aGUgbGVuZ3RoIG9mIHRoZSBib2R5IHdoZW4gYnl0ZS1zd2FwcGVkCisgICAqIGlzIDB4RkYwMDAwMDAsIHdoaWNoIGlzIGludmFsaWQgKi8KKyAgbWVtID0gZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChtZXNzYWdlLAorICAgICAgREJVU19UWVBFX0FSUkFZLCBEQlVTX1RZUEVfQllURSwgJmFyZywgMHhGRiwKKyAgICAgIERCVVNfVFlQRV9JTlZBTElEKTsKKyAgZ19hc3NlcnQgKG1lbSk7CisgIG1lbSA9IGRidXNfbWVzc2FnZV9tYXJzaGFsIChtZXNzYWdlLCAmYmxvYiwgJmJsb2JfbGVuKTsKKyAgZ19hc3NlcnQgKG1lbSk7CisgIGdfYXNzZXJ0X2NtcHVpbnQgKGJsb2JfbGVuLCA+LCAweEZGKTsKKyAgZ19hc3NlcnQgKGJsb2IgIT0gTlVMTCk7CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKworICAvKiBCcmVhayB0aGUgbWVzc2FnZSBieSBjaGFuZ2luZyBpdHMgY2xhaW1lZCBieXRlIG9yZGVyLCB3aXRob3V0IGFjdHVhbGx5CisgICAqIGJ5dGVzd2FwcGluZyBhbnl0aGluZy4gV2UgaGFwcGVuIHRvIGtub3cgdGhhdCBieXRlIG9yZGVyIGlzIHRoZSBmaXJzdAorICAgKiBieXRlLiAqLworICBpZiAoYmxvYlswXSA9PSAnQicpCisgICAgYmxvYlswXSA9ICdsJzsKKyAgZWxzZQorICAgIGJsb2JbMF0gPSAnQic7CisKKyAgLyogT0ssIG5vdyB0aGUgY29ubmVjdGlvbiBpcyB3b3JraW5nLCBsZXQncyBicmVhayBpdCAqLworCisgIGRidXNfY29ubmVjdGlvbl9mbHVzaCAoZi0+c2VydmVyX2Nvbm4pOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX2dldF9zb2NrZXQgKGYtPnNlcnZlcl9jb25uLCAmZmQpKQorICAgIGdfZXJyb3IgKCJmYWlsZWQgdG8gc3RlYWwgZmQgZnJvbSBzZXJ2ZXIgY29ubmVjdGlvbiIpOworCisgIHNvY2tldCA9IGdfc29ja2V0X25ld19mcm9tX2ZkIChmZCwgJmdlcnJvcik7CisgIGdfYXNzZXJ0X25vX2Vycm9yIChnZXJyb3IpOworICBnX2Fzc2VydCAoc29ja2V0ICE9IE5VTEwpOworCisgIHNlbmRfbl9ieXRlcyAoc29ja2V0LCBibG9iLCBibG9iX2xlbik7CisKKyAgZGJ1c19mcmVlIChibG9iKTsKKworICAvKiBOb3cgc3BpbiBvbiB0aGUgY2xpZW50IGNvbm5lY3Rpb246IHRoZSBzZXJ2ZXIganVzdCBzZW50IGl0IGEgZmF1bHR5CisgICAqIG1lc3NhZ2UsIHNvIGl0IHNob3VsZCBkaXNjb25uZWN0ICovCisgIHdoaWxlIChnX3F1ZXVlX2lzX2VtcHR5ICgmZi0+Y2xpZW50X21lc3NhZ2VzKSkKKyAgICB7CisgICAgICB0ZXN0X3Byb2dyZXNzICgnLicpOworICAgICAgdGVzdF9tYWluX2NvbnRleHRfaXRlcmF0ZSAoZi0+Y3R4LCBUUlVFKTsKKyAgICB9CisKKyAgbWVzc2FnZSA9IGdfcXVldWVfcG9wX2hlYWQgKCZmLT5jbGllbnRfbWVzc2FnZXMpOworCisgIGdfYXNzZXJ0ICghZGJ1c19tZXNzYWdlX2NvbnRhaW5zX3VuaXhfZmRzIChtZXNzYWdlKSk7CisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9kZXN0aW5hdGlvbiAobWVzc2FnZSksID09LCBOVUxMKTsKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X2Vycm9yX25hbWUgKG1lc3NhZ2UpLCA9PSwgTlVMTCk7CisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG1lc3NhZ2UpLCA9PSwKKyAgICAgICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5Mb2NhbCIpOworICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKSwgPT0sICJEaXNjb25uZWN0ZWQiKTsKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X3NlbmRlciAobWVzc2FnZSksID09LCBOVUxMKTsKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X3NpZ25hdHVyZSAobWVzc2FnZSksID09LCAiIik7CisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9wYXRoIChtZXNzYWdlKSwgPT0sCisgICAgICAiL29yZy9mcmVlZGVza3RvcC9EQnVzL0xvY2FsIik7CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKworICAvKiBGcmVlIHRoZSBEQnVzQ29ubmVjdGlvbiBiZWZvcmUgdGhlIEdTb2NrZXQsIGFzIGFib3ZlLiAqLworICBkYnVzX2Nvbm5lY3Rpb25fY2xvc2UgKGYtPnNlcnZlcl9jb25uKTsKKyAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChmLT5zZXJ2ZXJfY29ubik7CisgIGYtPnNlcnZlcl9jb25uID0gTlVMTDsKKworICBnX29iamVjdF91bnJlZiAoc29ja2V0KTsKK30KKworc3RhdGljIHZvaWQKK3RlYXJkb3duIChGaXh0dXJlICpmLAorICAgIGdjb25zdHBvaW50ZXIgYWRkciBHX0dOVUNfVU5VU0VEKQoreworICBpZiAoZi0+Y2xpZW50X2Nvbm4gIT0gTlVMTCkKKyAgICB7CisgICAgICB0ZXN0X2Nvbm5lY3Rpb25fc2h1dGRvd24gKGYtPmN0eCwgZi0+Y2xpZW50X2Nvbm4pOworICAgICAgZGJ1c19jb25uZWN0aW9uX2Nsb3NlIChmLT5jbGllbnRfY29ubik7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGYtPmNsaWVudF9jb25uKTsKKyAgICAgIGYtPmNsaWVudF9jb25uID0gTlVMTDsKKyAgICB9CisKKyAgaWYgKGYtPnNlcnZlcl9jb25uICE9IE5VTEwpCisgICAgeworICAgICAgdGVzdF9jb25uZWN0aW9uX3NodXRkb3duIChmLT5jdHgsIGYtPnNlcnZlcl9jb25uKTsKKyAgICAgIGRidXNfY29ubmVjdGlvbl9jbG9zZSAoZi0+c2VydmVyX2Nvbm4pOworICAgICAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChmLT5zZXJ2ZXJfY29ubik7CisgICAgICBmLT5zZXJ2ZXJfY29ubiA9IE5VTEw7CisgICAgfQorCisgIGlmIChmLT5zZXJ2ZXIgIT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX3NlcnZlcl9kaXNjb25uZWN0IChmLT5zZXJ2ZXIpOworICAgICAgZGJ1c19zZXJ2ZXJfdW5yZWYgKGYtPnNlcnZlcik7CisgICAgICBmLT5zZXJ2ZXIgPSBOVUxMOworICAgIH0KKworICB0ZXN0X21haW5fY29udGV4dF91bnJlZiAoZi0+Y3R4KTsKK30KKworaW50CittYWluIChpbnQgYXJnYywKKyAgICBjaGFyICoqYXJndikKK3sKKyAgdGVzdF9pbml0ICgmYXJnYywgJmFyZ3YpOworCisgIGdfdGVzdF9hZGQgKCIvY29ycnVwdC90Y3AiLCBGaXh0dXJlLCAidGNwOmhvc3Q9MTI3LjAuMC4xIiwgc2V0dXAsCisgICAgICB0ZXN0X2NvcnJ1cHQsIHRlYXJkb3duKTsKKworI2lmZGVmIERCVVNfVU5JWAorICBnX3Rlc3RfYWRkICgiL2NvcnJ1cHQvdW5peCIsIEZpeHR1cmUsICJ1bml4OnRtcGRpcj0vdG1wIiwgc2V0dXAsCisgICAgICB0ZXN0X2NvcnJ1cHQsIHRlYXJkb3duKTsKKyNlbmRpZgorCisgIGdfdGVzdF9hZGQgKCIvY29ycnVwdC9ieXRlLW9yZGVyL3RjcCIsIEZpeHR1cmUsICJ0Y3A6aG9zdD0xMjcuMC4wLjEiLCBzZXR1cCwKKyAgICAgIHRlc3RfYnl0ZV9vcmRlciwgdGVhcmRvd24pOworCisjaWZkZWYgREJVU19VTklYCisgIGdfdGVzdF9hZGQgKCIvY29ycnVwdC9ieXRlLW9yZGVyL3VuaXgiLCBGaXh0dXJlLCAidW5peDp0bXBkaXI9L3RtcCIsIHNldHVwLAorICAgICAgdGVzdF9ieXRlX29yZGVyLCB0ZWFyZG93bik7CisjZW5kaWYKKworICByZXR1cm4gZ190ZXN0X3J1biAoKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9hdXRoL2Fub255bW91cy1jbGllbnQtc3VjY2Vzc2Z1bC5hdXRoLXNjcmlwdCBiL3Rlc3QvZGF0YS9hdXRoL2Fub255bW91cy1jbGllbnQtc3VjY2Vzc2Z1bC5hdXRoLXNjcmlwdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTE2MjBiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2F1dGgvYW5vbnltb3VzLWNsaWVudC1zdWNjZXNzZnVsLmF1dGgtc2NyaXB0CkBAIC0wLDAgKzEsMTYgQEAKKyMjIHRoaXMgdGVzdHMgdGhhdCBhIGNsaWVudCBjYW4gbG9naW4gYW5vbnltb3VzbHkKKworQ0xJRU5UCisKKyMjIFJlamVjdCB3aGF0ZXZlciBtZWNoYW5pc20gdGhlIGNsaWVudCBwaWNrcyBmaXJzdAorRVhQRUNUX0NPTU1BTkQgQVVUSAorU0VORCAnUkVKRUNURUQgREJVU19URVNUX05PTkVYSVNURU5UX01FQ0gxIEFOT05ZTU9VUyBEQlVTX1RFU1RfTk9ORVhJU1RFTlRfTUVDSDInCisKKyMjIEFuZCB0aGlzIHRpbWUgd2UgZ2V0IEFOT05ZTU9VUworCitFWFBFQ1RfQ09NTUFORCBBVVRICisjIyBvZiBjb3Vyc2UgcmVhbCBEQlVTX0NPT0tJRV9TSEExIHdvdWxkIG5vdCBzZW5kIHRoaXMgaGVyZS4uLgorU0VORCAnT0sgMTIzNGRlYWRiZWVmJworCitFWFBFQ1RfQ09NTUFORCBCRUdJTgorRVhQRUNUX1NUQVRFIEFVVEhFTlRJQ0FURUQKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9hdXRoL2Fub255bW91cy1zZXJ2ZXItc3VjY2Vzc2Z1bC5hdXRoLXNjcmlwdCBiL3Rlc3QvZGF0YS9hdXRoL2Fub255bW91cy1zZXJ2ZXItc3VjY2Vzc2Z1bC5hdXRoLXNjcmlwdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzJhZTlkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2F1dGgvYW5vbnltb3VzLXNlcnZlci1zdWNjZXNzZnVsLmF1dGgtc2NyaXB0CkBAIC0wLDAgKzEsMTMgQEAKKyMjIHRoaXMgdGVzdHMgdGhlIHNlcnZlciBzaWRlIGluIGEgc3VjY2Vzc2Z1bCBhdXRoIG9mIHR5cGUgQU5PTllNT1VTIAorCitTRVJWRVIKKyMjIHZlcmlmeSB0aGF0IHByaW9yIHRvIGRvaW5nIGFueXRoaW5nLCB3ZSBoYXZlbid0IGF1dGhlZCBhcyBhbnlvbmUKK0VYUEVDVF9IQVZFX05PX0NSRURFTlRJQUxTCitTRU5EICdBVVRIIEFOT05ZTU9VUyA0NDJkNDI3NTczMjAzMTJlMzEyZTMxJworRVhQRUNUX0NPTU1BTkQgT0sKK0VYUEVDVF9TVEFURSBXQUlUSU5HX0ZPUl9JTlBVVAorU0VORCAnQkVHSU4nCitFWFBFQ1RfU1RBVEUgQVVUSEVOVElDQVRFRAorIyMgdmVyaWZ5IHRoYXQgd2UgYXJlIHN0aWxsIGFub255bW91cworRVhQRUNUX0hBVkVfTk9fQ1JFREVOVElBTFMKKwpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2F1dGgvY2FuY2VsLmF1dGgtc2NyaXB0IGIvdGVzdC9kYXRhL2F1dGgvY2FuY2VsLmF1dGgtc2NyaXB0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyYzUxOWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvYXV0aC9jYW5jZWwuYXV0aC1zY3JpcHQKQEAgLTAsMCArMSwxOSBAQAorIyMgdGhpcyB0ZXN0cyBjYW5jZWxpbmcgRVhURVJOQUwKKworU0VSVkVSCitTRU5EICdBVVRIIEVYVEVSTkFMIFVTRVJJRF9IRVgnCitFWFBFQ1RfQ09NTUFORCBPSworRVhQRUNUX1NUQVRFIFdBSVRJTkdfRk9SX0lOUFVUCitTRU5EICdDQU5DRUwnCitFWFBFQ1RfQ09NTUFORCBSRUpFQ1RFRAorRVhQRUNUX1NUQVRFIFdBSVRJTkdfRk9SX0lOUFVUCisKKyMjIG5vdyBzdGFydCBvdmVyIGFuZCBzZWUgaWYgaXQgd29ya3MKK1NFTkQgJ0FVVEggRVhURVJOQUwgVVNFUklEX0hFWCcKK0VYUEVDVF9DT01NQU5EIE9LCitFWFBFQ1RfU1RBVEUgV0FJVElOR19GT1JfSU5QVVQKK1NFTkQgJ0JFR0lOJworRVhQRUNUX1NUQVRFIEFVVEhFTlRJQ0FURUQKKworCisKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9hdXRoL2NsaWVudC1vdXQtb2YtbWVjaGFuaXNtcy5hdXRoLXNjcmlwdCBiL3Rlc3QvZGF0YS9hdXRoL2NsaWVudC1vdXQtb2YtbWVjaGFuaXNtcy5hdXRoLXNjcmlwdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTZkM2FkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2F1dGgvY2xpZW50LW91dC1vZi1tZWNoYW5pc21zLmF1dGgtc2NyaXB0CkBAIC0wLDAgKzEsNyBAQAorIyMgdGhpcyB0ZXN0cyB0aGF0IHRlc3RzIHRoYXQgdGhlIGNsaWVudCBkaXNjb25uZWN0cyB3aGVuIGl0J3Mgb3V0IG9mCisjIyBrbm93biBtZWNoYW5pc21zCisKK0NMSUVOVAorRVhQRUNUX0NPTU1BTkQgQVVUSAorU0VORCAnUkVKRUNURUQgQk9OR09fTUQ1JworRVhQRUNUX1NUQVRFIE5FRURfRElTQ09OTkVDVApkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2F1dGgvY29va2llLXNoYTEtdXNlcm5hbWUuYXV0aC1zY3JpcHQgYi90ZXN0L2RhdGEvYXV0aC9jb29raWUtc2hhMS11c2VybmFtZS5hdXRoLXNjcmlwdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTY2ODI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2F1dGgvY29va2llLXNoYTEtdXNlcm5hbWUuYXV0aC1zY3JpcHQKQEAgLTAsMCArMSwxMiBAQAorVU5JWF9PTkxZCitTRVJWRVIKK1NFTkQgJ0FVVEggREJVU19DT09LSUVfU0hBMSBXUk9OR19VU0VSTkFNRV9IRVgnCitFWFBFQ1RfQ09NTUFORCBSRUpFQ1RFRAorRVhQRUNUX1NUQVRFIFdBSVRJTkdfRk9SX0lOUFVUCitFWFBFQ1RfSEFWRV9OT19DUkVERU5USUFMUworU0VORCAnQVVUSCBEQlVTX0NPT0tJRV9TSEExIFVTRVJOQU1FX0hFWCcKK0VYUEVDVF9DT01NQU5EIERBVEEKK0VYUEVDVF9TVEFURSBXQUlUSU5HX0ZPUl9JTlBVVAorRVhQRUNUX0hBVkVfTk9fQ1JFREVOVElBTFMKKyMgV2UgZG9uJ3QgYWN0dWFsbHkgY29tcGxldGUgREJVU19DT09LSUVfU0hBMSBhdXRoZW50aWNhdGlvbiwgYmVjYXVzZQorIyBpdCdzIG5vbi10cml2aWFsLgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2F1dGgvY29va2llLXNoYTEuYXV0aC1zY3JpcHQgYi90ZXN0L2RhdGEvYXV0aC9jb29raWUtc2hhMS5hdXRoLXNjcmlwdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGRkMzNkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2F1dGgvY29va2llLXNoYTEuYXV0aC1zY3JpcHQKQEAgLTAsMCArMSwxMSBAQAorU0VSVkVSCitTRU5EICdBVVRIIERCVVNfQ09PS0lFX1NIQTEgV1JPTkdfVVNFUklEX0hFWCcKK0VYUEVDVF9DT01NQU5EIFJFSkVDVEVECitFWFBFQ1RfU1RBVEUgV0FJVElOR19GT1JfSU5QVVQKK0VYUEVDVF9IQVZFX05PX0NSRURFTlRJQUxTCitTRU5EICdBVVRIIERCVVNfQ09PS0lFX1NIQTEgVVNFUklEX0hFWCcKK0VYUEVDVF9DT01NQU5EIERBVEEKK0VYUEVDVF9TVEFURSBXQUlUSU5HX0ZPUl9JTlBVVAorRVhQRUNUX0hBVkVfTk9fQ1JFREVOVElBTFMKKyMgV2UgZG9uJ3QgYWN0dWFsbHkgY29tcGxldGUgREJVU19DT09LSUVfU0hBMSBhdXRoZW50aWNhdGlvbiwgYmVjYXVzZQorIyBpdCdzIG5vbi10cml2aWFsLgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2F1dGgvZXh0ZXJuYWwtZmFpbGVkLmF1dGgtc2NyaXB0IGIvdGVzdC9kYXRhL2F1dGgvZXh0ZXJuYWwtZmFpbGVkLmF1dGgtc2NyaXB0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjNGU5MDAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvYXV0aC9leHRlcm5hbC1mYWlsZWQuYXV0aC1zY3JpcHQKQEAgLTAsMCArMSwxMSBAQAorIyMgdGhpcyB0ZXN0cyB0aGF0IGF1dGggb2YgdHlwZSBFWFRFUk5BTCB3aXRob3V0IGNyZWRlbnRpYWxzIHdpbGwgZmFpbAorCitTRVJWRVIKK05PX0NSRURFTlRJQUxTCisjIyB2ZXJpZnkgdGhhdCBwcmlvciB0byBkb2luZyBhbnl0aGluZywgd2UgaGF2ZW4ndCBhdXRoZWQgYXMgYW55b25lCitFWFBFQ1RfSEFWRV9OT19DUkVERU5USUFMUworU0VORCAnQVVUSCBFWFRFUk5BTCBVU0VSSURfSEVYJworRVhQRUNUX0NPTU1BTkQgUkVKRUNURUQKK0VYUEVDVF9TVEFURSBXQUlUSU5HX0ZPUl9JTlBVVAorIyMgdmVyaWZ5IHRoYXQgd2Ugc3RpbGwgaGF2ZW4ndCBhdXRoZWQgYXMgYW55b25lCitFWFBFQ1RfSEFWRV9OT19DUkVERU5USUFMUwpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2F1dGgvZXh0ZXJuYWwtcm9vdC5hdXRoLXNjcmlwdCBiL3Rlc3QvZGF0YS9hdXRoL2V4dGVybmFsLXJvb3QuYXV0aC1zY3JpcHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRjNGI0MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9hdXRoL2V4dGVybmFsLXJvb3QuYXV0aC1zY3JpcHQKQEAgLTAsMCArMSwxMSBAQAorIyMgdGhpcyB0ZXN0cyB3ZSBjYW4gYXV0aCBFWFRFUk5BTCBhcyBvdXJzZWx2ZXMsIHdpdGggcm9vdCBjcmVkZW50aWFscworVU5JWF9PTkxZCitTRVJWRVIKK1JPT1RfQ1JFREVOVElBTFMKKyMjIDMwIGlzIEFTQ0lJICcwJyBpbiBoZXgKK1NFTkQgJ0FVVEggRVhURVJOQUwgMzAnCitFWFBFQ1RfQ09NTUFORCBPSworRVhQRUNUX1NUQVRFIFdBSVRJTkdfRk9SX0lOUFVUCitTRU5EICdCRUdJTicKK0VYUEVDVF9TVEFURSBBVVRIRU5USUNBVEVECisKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9hdXRoL2V4dGVybmFsLXNpbGx5LmF1dGgtc2NyaXB0IGIvdGVzdC9kYXRhL2F1dGgvZXh0ZXJuYWwtc2lsbHkuYXV0aC1zY3JpcHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUxOGVlOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9hdXRoL2V4dGVybmFsLXNpbGx5LmF1dGgtc2NyaXB0CkBAIC0wLDAgKzEsMTIgQEAKKyMjIHRoaXMgdGVzdHMgd2UgY2FuJ3QgYXV0aCBpZiBzb2NrZXQgcmVwb3J0cyBzaWxseSBjcmVkZW50aWFscyBidXQgd2UgYXNrIGZvciBvdXIgb3duIHVpZAorCitTRVJWRVIKKyMjIHZlcmlmeSB0aGF0IHByaW9yIHRvIGRvaW5nIGFueXRoaW5nLCB3ZSBoYXZlbid0IGF1dGhlZCBhcyBhbnlvbmUKK0VYUEVDVF9IQVZFX05PX0NSRURFTlRJQUxTCitTSUxMWV9DUkVERU5USUFMUworU0VORCAnQVVUSCBFWFRFUk5BTCBVU0VSSURfSEVYJworRVhQRUNUX0NPTU1BTkQgUkVKRUNURUQKK0VYUEVDVF9TVEFURSBXQUlUSU5HX0ZPUl9JTlBVVAorIyMgdmVyaWZ5IHRoYXQgd2Ugc3RpbGwgaGF2ZW4ndCBhdXRoZWQgYXMgYW55b25lCitFWFBFQ1RfSEFWRV9OT19DUkVERU5USUFMUworCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvYXV0aC9leHRlcm5hbC1zdWNjZXNzZnVsLmF1dGgtc2NyaXB0IGIvdGVzdC9kYXRhL2F1dGgvZXh0ZXJuYWwtc3VjY2Vzc2Z1bC5hdXRoLXNjcmlwdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjI5MzhjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2F1dGgvZXh0ZXJuYWwtc3VjY2Vzc2Z1bC5hdXRoLXNjcmlwdApAQCAtMCwwICsxLDEyIEBACisjIyB0aGlzIHRlc3RzIGEgc3VjY2Vzc2Z1bCBhdXRoIG9mIHR5cGUgRVhURVJOQUwKKworU0VSVkVSCisjIyB2ZXJpZnkgdGhhdCBwcmlvciB0byBkb2luZyBhbnl0aGluZywgd2UgaGF2ZW4ndCBhdXRoZWQgYXMgYW55b25lCitFWFBFQ1RfSEFWRV9OT19DUkVERU5USUFMUworU0VORCAnQVVUSCBFWFRFUk5BTCBVU0VSSURfSEVYJworRVhQRUNUX0NPTU1BTkQgT0sKK0VYUEVDVF9TVEFURSBXQUlUSU5HX0ZPUl9JTlBVVAorU0VORCAnQkVHSU4nCitFWFBFQ1RfU1RBVEUgQVVUSEVOVElDQVRFRAorIyMgdmVyaWZ5IHRoYXQgd2Ugbm93IGhhdmUgc29tZSBjcmVkZW50aWFscworRVhQRUNUX0hBVkVfU09NRV9DUkVERU5USUFMUwpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2F1dGgvZXh0cmEtYnl0ZXMuYXV0aC1zY3JpcHQgYi90ZXN0L2RhdGEvYXV0aC9leHRyYS1ieXRlcy5hdXRoLXNjcmlwdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDFlMDFkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2F1dGgvZXh0cmEtYnl0ZXMuYXV0aC1zY3JpcHQKQEAgLTAsMCArMSwxMCBAQAorIyMgdGhpcyB0ZXN0cyB0aGF0IHdlIGhhdmUgdGhlIGV4cGVjdGVkIGV4dHJhIGJ5dGVzIGF0IHRoZSBlbmQKKworU0VSVkVSCitTRU5EICdBVVRIIEVYVEVSTkFMIFVTRVJJRF9IRVgnCitFWFBFQ1RfQ09NTUFORCBPSworRVhQRUNUX1NUQVRFIFdBSVRJTkdfRk9SX0lOUFVUCitTRU5EICdCRUdJTlxyXG5IZWxsbycKK0VYUEVDVF9TVEFURSBBVVRIRU5USUNBVEVEX1dJVEhfVU5VU0VEX0JZVEVTCitFWFBFQ1RfVU5VU0VEICdIZWxsb1xyXG4nCitFWFBFQ1RfU1RBVEUgQVVUSEVOVElDQVRFRApkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2F1dGgvZmFpbC1hZnRlci1uLWF0dGVtcHRzLmF1dGgtc2NyaXB0IGIvdGVzdC9kYXRhL2F1dGgvZmFpbC1hZnRlci1uLWF0dGVtcHRzLmF1dGgtc2NyaXB0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjZWQzODYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvYXV0aC9mYWlsLWFmdGVyLW4tYXR0ZW1wdHMuYXV0aC1zY3JpcHQKQEAgLTAsMCArMSwzNCBAQAorIyMgdGhpcyB0ZXN0cyB0aGF0IGFmdGVyIHJldHJ5aW5nIHRvbyBvZnRlbiB3ZSBmYWlsCisKK1NFUlZFUgorTk9fQ1JFREVOVElBTFMKKworIyAxCitTRU5EICdBVVRIIEVYVEVSTkFMIFVTRVJJRF9IRVgnCitFWFBFQ1RfQ09NTUFORCBSRUpFQ1RFRAorRVhQRUNUX1NUQVRFIFdBSVRJTkdfRk9SX0lOUFVUCisKKyMgMgorU0VORCAnQVVUSCBFWFRFUk5BTCBVU0VSSURfSEVYJworRVhQRUNUX0NPTU1BTkQgUkVKRUNURUQKK0VYUEVDVF9TVEFURSBXQUlUSU5HX0ZPUl9JTlBVVAorCisjIDMKK1NFTkQgJ0FVVEggRVhURVJOQUwgVVNFUklEX0hFWCcKK0VYUEVDVF9DT01NQU5EIFJFSkVDVEVECitFWFBFQ1RfU1RBVEUgV0FJVElOR19GT1JfSU5QVVQKKworIyA0CitTRU5EICdBVVRIIEVYVEVSTkFMIFVTRVJJRF9IRVgnCitFWFBFQ1RfQ09NTUFORCBSRUpFQ1RFRAorRVhQRUNUX1NUQVRFIFdBSVRJTkdfRk9SX0lOUFVUCisKKyMgNQorU0VORCAnQVVUSCBFWFRFUk5BTCBVU0VSSURfSEVYJworRVhQRUNUX0NPTU1BTkQgUkVKRUNURUQKK0VYUEVDVF9TVEFURSBXQUlUSU5HX0ZPUl9JTlBVVAorCisjIDYKK1NFTkQgJ0FVVEggRVhURVJOQUwgVVNFUklEX0hFWCcKK0VYUEVDVF9DT01NQU5EIFJFSkVDVEVECitFWFBFQ1RfU1RBVEUgTkVFRF9ESVNDT05ORUNUCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvYXV0aC9mYWxsYmFjay5hdXRoLXNjcmlwdCBiL3Rlc3QvZGF0YS9hdXRoL2ZhbGxiYWNrLmF1dGgtc2NyaXB0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkODgwYzAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvYXV0aC9mYWxsYmFjay5hdXRoLXNjcmlwdApAQCAtMCwwICsxLDE3IEBACisjIyB0aGlzIHRlc3RzIHRoYXQgYSBjbGllbnQgY2FuIGZhbGxiYWNrIHRvIGEgc2Vjb25kYXJ5IGF1dGggbWVjaCAKKworQ0xJRU5UCisKKyMjIFdpbGwgdHJ5IEVYVEVSTkFMIGJ5IGRlZmF1bHQgZmlyc3Qgd2l0aG91dCBmaXJzdCBjYWxsaW5nIEFVVEggYWxvbmUuCisKK0VYUEVDVF9DT01NQU5EIEFVVEgKK1NFTkQgJ1JFSkVDVEVEIEVYVEVSTkFMIERCVVNfQ09PS0lFX1NIQTEgREJVU19URVNUX05PTkVYSVNURU5UX01FQ0gnCisKKyMjIEFuZCB0aGlzIHRpbWUgd2UgZ2V0IERCVVNfQ09PS0lFX1NIQTEKKworRVhQRUNUX0NPTU1BTkQgQVVUSAorIyMgb2YgY291cnNlIHJlYWwgREJVU19DT09LSUVfU0hBMSB3b3VsZCBub3Qgc2VuZCB0aGlzIGhlcmUuLi4KK1NFTkQgJ09LIDEyMzRkZWFkYmVlZicKKworRVhQRUNUX0NPTU1BTkQgQkVHSU4KK0VYUEVDVF9TVEFURSBBVVRIRU5USUNBVEVECmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvYXV0aC9pbnZhbGlkLWNvbW1hbmQtY2xpZW50LmF1dGgtc2NyaXB0IGIvdGVzdC9kYXRhL2F1dGgvaW52YWxpZC1jb21tYW5kLWNsaWVudC5hdXRoLXNjcmlwdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzE3ZTdiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2F1dGgvaW52YWxpZC1jb21tYW5kLWNsaWVudC5hdXRoLXNjcmlwdApAQCAtMCwwICsxLDggQEAKKyMjIHRoaXMgdGVzdHMgdGhhdCByZWNlaXZpbmcgYSBub25leGlzdGVudCBjb21tYW5kIGlzIGhhbmRsZWQgcHJvcGVybHkKKyMjIGJ5IGEgY2xpZW50CisKK0NMSUVOVAorRVhQRUNUX0NPTU1BTkQgQVVUSAorU0VORCAnTk9ORVhJU1RFTlRfQ09NTUFORCBmb28gYmFyIGJheiBibGFoIGJsYWgnCitFWFBFQ1RfQ09NTUFORCBFUlJPUgorRVhQRUNUX1NUQVRFIFdBSVRJTkdfRk9SX0lOUFVUCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvYXV0aC9pbnZhbGlkLWNvbW1hbmQuYXV0aC1zY3JpcHQgYi90ZXN0L2RhdGEvYXV0aC9pbnZhbGlkLWNvbW1hbmQuYXV0aC1zY3JpcHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ5Y2I4ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9hdXRoL2ludmFsaWQtY29tbWFuZC5hdXRoLXNjcmlwdApAQCAtMCwwICsxLDcgQEAKKyMjIHRoaXMgdGVzdHMgdGhhdCByZWNlaXZpbmcgYSBub25leGlzdGVudCBjb21tYW5kIGlzIGhhbmRsZWQgcHJvcGVybHkKKyMjIGJ5IGEgc2VydmVyCisKK1NFUlZFUgorU0VORCAnTk9ORVhJU1RFTlRfQ09NTUFORCBmb28gYmFyIGJheiBibGFoIGJsYWgnCitFWFBFQ1RfQ09NTUFORCBFUlJPUgorRVhQRUNUX1NUQVRFIFdBSVRJTkdfRk9SX0lOUFVUCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvYXV0aC9pbnZhbGlkLWhleC1lbmNvZGluZy5hdXRoLXNjcmlwdCBiL3Rlc3QvZGF0YS9hdXRoL2ludmFsaWQtaGV4LWVuY29kaW5nLmF1dGgtc2NyaXB0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmMTVjNDMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvYXV0aC9pbnZhbGlkLWhleC1lbmNvZGluZy5hdXRoLXNjcmlwdApAQCAtMCwwICsxLDYgQEAKKyMjIHRoaXMgdGVzdHMgYW4gaW52YWxpZCBoZXggZW5jb2RpbmcgZm9sbG93ZWQgYnkgc3VjY2Vzc2Z1bCBhdXRoZW50aWNhdGlvbgorCitTRVJWRVIKK1NFTkQgJ0FVVEggRVhURVJOQUwgd2lsbHknCitFWFBFQ1RfQ09NTUFORCBFUlJPUgorRVhQRUNUX1NUQVRFIFdBSVRJTkdfRk9SX0lOUFVUCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvYXV0aC9tZWNoYW5pc21zLmF1dGgtc2NyaXB0IGIvdGVzdC9kYXRhL2F1dGgvbWVjaGFuaXNtcy5hdXRoLXNjcmlwdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTQ0NzkxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2F1dGgvbWVjaGFuaXNtcy5hdXRoLXNjcmlwdApAQCAtMCwwICsxLDggQEAKKyMjIHRoaXMgdGVzdHMgdGhhdCB0aGUgc2VydmVyIHNlbmRzIGEgbGlzdCBvZiBtZWNoYW5pc21zCisjIyBpbiByZXNwb25zZSB0byBibGFuayBBVVRICisKK1NFUlZFUgorU0VORCBBVVRICitFWFBFQ1RfQ09NTUFORCBSRUpFQ1RFRAorRVhQRUNUX1NUQVRFIFdBSVRJTkdfRk9SX0lOUFVUCisKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9kYnVzLWluc3RhbGxlZC10ZXN0cy5hYXByb2ZpbGUuaW4gYi90ZXN0L2RhdGEvZGJ1cy1pbnN0YWxsZWQtdGVzdHMuYWFwcm9maWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhNjUyODIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvZGJ1cy1pbnN0YWxsZWQtdGVzdHMuYWFwcm9maWxlLmluCkBAIC0wLDAgKzEsOTggQEAKKyMgQ29weXJpZ2h0IMKpIDIwMTYgQ29sbGFib3JhIEx0ZC4KKyMKKyMgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyMgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMKKyMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwKKyMgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwKKyMgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwKKyMgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKKyMgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisjCisjIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCisjIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorIworIyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyMgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisjIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisjIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisjIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisjIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyMgU09GVFdBUkUuCisKKyNpbmNsdWRlIDx0dW5hYmxlcy9nbG9iYWw+CisjaW5jbHVkZSA8dHVuYWJsZXMvc3lzPgorCitAREJVU19URVNUX0VYRUNAL3Rlc3QtYXBwYXJtb3ItYWN0aXZhdGlvbiB7CisgICNpbmNsdWRlIDxhYnN0cmFjdGlvbnMvYXBwYXJtb3JfYXBpL2NoYW5nZV9wcm9maWxlPgorICAjaW5jbHVkZSA8YWJzdHJhY3Rpb25zL2FwcGFybW9yX2FwaS9maW5kX21vdW50cG9pbnQ+CisgICNpbmNsdWRlIDxhYnN0cmFjdGlvbnMvYXBwYXJtb3JfYXBpL2lzX2VuYWJsZWQ+CisgICNpbmNsdWRlIDxhYnN0cmFjdGlvbnMvYmFzZT4KKworICAjIFdlIGFyZW4ndCByZWFsbHkgY29uZmluaW5nIHRoaXMgcHJvY2VzcyBzZXJpb3VzbHk7IGFsbG93IG1vc3QgdGhpbmdzLgorICAvKiogbXJpeCwKKyAgL3RtcC9kYnVzLWRhZW1vbi10ZXN0LioveywqKn0gdywKKyAgQHtzeXN9L2tlcm5lbC9zZWN1cml0eS9hcHBhcm1vci8qKiB3LAorICBkYnVzIChzZW5kLCByZWNlaXZlLCBiaW5kKSwKKyAgbmV0d29yaywKKyAgc2lnbmFsLAorCisgICMgIkhhdCIgc3VicHJvZmlsZSB1c2VkIGZvciB0aGUgcGFydCBvZiB0aGUgcHJvY2VzcyB0aGF0IGltaXRhdGVzIGEgY2xpZW50CisgICMgdHJ5aW5nIHRvIGNhdXNlIHNlcnZpY2UgYWN0aXZhdGlvbiB2aWEgYXV0by1zdGFydGluZy4KKyAgXmNhbGxlciB7CisgICAgI2luY2x1ZGUgPGFic3RyYWN0aW9ucy9hcHBhcm1vcl9hcGkvY2hhbmdlX3Byb2ZpbGU+CisgICAgI2luY2x1ZGUgPGFic3RyYWN0aW9ucy9iYXNlPgorCisgICAgLyoqIG1yaXgsCisgICAgQHtzeXN9L2tlcm5lbC9zZWN1cml0eS9hcHBhcm1vci8qKiB3LAorICAgIGRidXMgKHNlbmQsIHJlY2VpdmUsIGJpbmQpLAorICAgIG5ldHdvcmssCisgICAgc2lnbmFsLAorCisgICAgZGVueSBkYnVzIHNlbmQgcGVlcj0obGFiZWw9QERCVVNfVEVTVF9FWEVDQC90ZXN0LWFwcGFybW9yLWFjdGl2YXRpb24vL2NvbS5leGFtcGxlLlNlbmREZW5pZWRCeUFwcEFybW9yTGFiZWwpLAorICAgIGRlbnkgZGJ1cyBzZW5kIHBlZXI9KG5hbWU9Y29tLmV4YW1wbGUuU2VuZERlbmllZEJ5QXBwQXJtb3JOYW1lKSwKKworICAgICMgVGhlcmUgaXMgbm8gcHJvZmlsZSBvZiB0aGlzIG5hbWUuIFRoYXQncyBkZWxpYmVyYXRlLgorICAgIGRlbnkgZGJ1cyBzZW5kIHBlZXI9KGxhYmVsPUBEQlVTX1RFU1RfRVhFQ0AvdGVzdC1hcHBhcm1vci1hY3RpdmF0aW9uLWNvbS5leGFtcGxlLlNlbmREZW5pZWRCeU5vbmV4aXN0ZW50QXBwQXJtb3JMYWJlbCksCisgIH0KKworICAjIFVzZWQgd2hlbiB3ZSBjaGVjayB0aGF0IFhNTC1iYXNlZCBwb2xpY3kgc3RpbGwgd29ya3MuCisgIF5jb20uZXhhbXBsZS5SZWNlaXZlRGVuaWVkIHsKKyAgICAjaW5jbHVkZSA8YWJzdHJhY3Rpb25zL2FwcGFybW9yX2FwaS9jaGFuZ2VfcHJvZmlsZT4KKyAgICAjaW5jbHVkZSA8YWJzdHJhY3Rpb25zL2Jhc2U+CisKKyAgICAvKiogbXJpeCwKKyAgICBAe3N5c30va2VybmVsL3NlY3VyaXR5L2FwcGFybW9yLyoqIHcsCisgICAgZGJ1cywKKyAgICBuZXR3b3JrLAorICAgIHNpZ25hbCwKKyAgfQorCisgICMgVGhpcyBvbmUgaXMgbmV2ZXIgYWN0dWFsbHkgdXNlZCwgYnV0IG5lZWRzIHRvIGV4aXN0IHNvIF5jYWxsZXIgY2FuCisgICMgcmVmZXIgdG8gaXQKKyAgXmNvbS5leGFtcGxlLlNlbmREZW5pZWRCeUFwcEFybW9yTGFiZWwgeworICAgICNpbmNsdWRlIDxhYnN0cmFjdGlvbnMvYXBwYXJtb3JfYXBpL2NoYW5nZV9wcm9maWxlPgorICAgICNpbmNsdWRlIDxhYnN0cmFjdGlvbnMvYmFzZT4KKworICAgIC8qKiBtcml4LAorICAgIEB7c3lzfS9rZXJuZWwvc2VjdXJpdHkvYXBwYXJtb3IvKiogdywKKyAgICBkYnVzIChzZW5kLCByZWNlaXZlLCBiaW5kKSwKKyAgICBuZXR3b3JrLAorICAgIHNpZ25hbCwKKyAgfQorCisgICMgIkhhdCIgc3VicHJvZmlsZSB1c2VkIGZvciB0aGUgcGFydCBvZiB0aGUgcHJvY2VzcyB0aGF0IGltaXRhdGVzIGEgc2VydmljZQorICAjIHRoYXQgaXMgbm90IGFsbG93ZWQgdG8gcmVjZWl2ZSBmcm9tIHRoZSBjYWxsZXIuCisgIF5jb20uZXhhbXBsZS5SZWNlaXZlRGVuaWVkQnlBcHBBcm1vckxhYmVsIHsKKyAgICAjaW5jbHVkZSA8YWJzdHJhY3Rpb25zL2FwcGFybW9yX2FwaS9jaGFuZ2VfcHJvZmlsZT4KKyAgICAjaW5jbHVkZSA8YWJzdHJhY3Rpb25zL2Jhc2U+CisKKyAgICAvKiogbXJpeCwKKyAgICBAe3N5c30va2VybmVsL3NlY3VyaXR5L2FwcGFybW9yLyoqIHcsCisgICAgZGJ1cyAoc2VuZCwgcmVjZWl2ZSwgYmluZCksCisgICAgbmV0d29yaywKKyAgICBzaWduYWwsCisKKyAgICBkZW55IGRidXMgcmVjZWl2ZSBwZWVyPShsYWJlbD1AREJVU19URVNUX0VYRUNAL3Rlc3QtYXBwYXJtb3ItYWN0aXZhdGlvbi8vY2FsbGVyKSwKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2VxdWl2LWNvbmZpZy1maWxlcy9iYXNpYy9iYXNpYy0xLmNvbmYgYi90ZXN0L2RhdGEvZXF1aXYtY29uZmlnLWZpbGVzL2Jhc2ljL2Jhc2ljLTEuY29uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWY0MWU4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2VxdWl2LWNvbmZpZy1maWxlcy9iYXNpYy9iYXNpYy0xLmNvbmYKQEAgLTAsMCArMSwyNSBAQAorPCFET0NUWVBFIGJ1c2NvbmZpZyBQVUJMSUMgIi0vL2ZyZWVkZXNrdG9wLy9EVEQgRC1CVVMgQnVzIENvbmZpZ3VyYXRpb24gMS4wLy9FTiIKKyAiaHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc3RhbmRhcmRzL2RidXMvMS4wL2J1c2NvbmZpZy5kdGQiPgorPGJ1c2NvbmZpZz4KKyAgPHVzZXI+bXlidXN1c2VyPC91c2VyPgorICA8bGlzdGVuPnVuaXg6cGF0aD0vZm9vL2JhcjwvbGlzdGVuPgorICA8bGlzdGVuPnRjcDpwb3J0PTEyMzQ8L2xpc3Rlbj4KKyAgPGluY2x1ZGVkaXI+YmFzaWMuZDwvaW5jbHVkZWRpcj4KKyAgPHNlcnZpY2VkaXI+L3Vzci9zaGFyZS9mb288L3NlcnZpY2VkaXI+CisgIDxpbmNsdWRlIGlnbm9yZV9taXNzaW5nPSJ5ZXMiPm5vbmV4aXN0ZW50LmNvbmY8L2luY2x1ZGU+CisgIDxwb2xpY3kgY29udGV4dD0iZGVmYXVsdCI+CisgICAgPGFsbG93IHVzZXI9IioiLz4KKyAgPC9wb2xpY3k+CisKKyAgPGxpbWl0IG5hbWU9Im1heF9pbmNvbWluZ19ieXRlcyI+NTAwMDwvbGltaXQ+ICAgCisgIDxsaW1pdCBuYW1lPSJtYXhfb3V0Z29pbmdfYnl0ZXMiPjUwMDA8L2xpbWl0PgorICA8bGltaXQgbmFtZT0ibWF4X21lc3NhZ2Vfc2l6ZSI+MzAwPC9saW1pdD4KKyAgPGxpbWl0IG5hbWU9InNlcnZpY2Vfc3RhcnRfdGltZW91dCI+NTAwMDwvbGltaXQ+CisgIDxsaW1pdCBuYW1lPSJhdXRoX3RpbWVvdXQiPjYwMDA8L2xpbWl0PgorICA8bGltaXQgbmFtZT0ibWF4X2NvbXBsZXRlZF9jb25uZWN0aW9ucyI+NTA8L2xpbWl0PiAgCisgIDxsaW1pdCBuYW1lPSJtYXhfaW5jb21wbGV0ZV9jb25uZWN0aW9ucyI+ODA8L2xpbWl0PgorICA8bGltaXQgbmFtZT0ibWF4X2Nvbm5lY3Rpb25zX3Blcl91c2VyIj42NDwvbGltaXQ+CisgIDxsaW1pdCBuYW1lPSJtYXhfcGVuZGluZ19zZXJ2aWNlX3N0YXJ0cyI+NjQ8L2xpbWl0PgorICA8bGltaXQgbmFtZT0ibWF4X25hbWVzX3Blcl9jb25uZWN0aW9uIj4yNTY8L2xpbWl0PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKzwvYnVzY29uZmlnPgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2VxdWl2LWNvbmZpZy1maWxlcy9iYXNpYy9iYXNpYy0yLmNvbmYgYi90ZXN0L2RhdGEvZXF1aXYtY29uZmlnLWZpbGVzL2Jhc2ljL2Jhc2ljLTIuY29uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWU3MDdlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2VxdWl2LWNvbmZpZy1maWxlcy9iYXNpYy9iYXNpYy0yLmNvbmYKQEAgLTAsMCArMSw1IEBACis8IURPQ1RZUEUgYnVzY29uZmlnIFBVQkxJQyAiLS8vZnJlZWRlc2t0b3AvL0RURCBELUJVUyBCdXMgQ29uZmlndXJhdGlvbiAxLjAvL0VOIgorICJodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zdGFuZGFyZHMvZGJ1cy8xLjAvYnVzY29uZmlnLmR0ZCI+Cis8YnVzY29uZmlnPgorPGluY2x1ZGU+YmFzaWMtMS5jb25mPC9pbmNsdWRlPgorPC9idXNjb25maWc+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2VxdWl2LWNvbmZpZy1maWxlcy9iYXNpYy9iYXNpYy5kL2Jhc2ljLmNvbmYgYi90ZXN0L2RhdGEvZXF1aXYtY29uZmlnLWZpbGVzL2Jhc2ljL2Jhc2ljLmQvYmFzaWMuY29uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTA5ZDcxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2VxdWl2LWNvbmZpZy1maWxlcy9iYXNpYy9iYXNpYy5kL2Jhc2ljLmNvbmYKQEAgLTAsMCArMSwxMyBAQAorPCFET0NUWVBFIGJ1c2NvbmZpZyBQVUJMSUMgIi0vL2ZyZWVkZXNrdG9wLy9EVEQgRC1CVVMgQnVzIENvbmZpZ3VyYXRpb24gMS4wLy9FTiIKKyAiaHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc3RhbmRhcmRzL2RidXMvMS4wL2J1c2NvbmZpZy5kdGQiPgorPGJ1c2NvbmZpZz4KKyAgPHVzZXI+bXlidXN1c2VyPC91c2VyPgorICA8bGlzdGVuPnVuaXg6cGF0aD0vZm9vL2JhcjwvbGlzdGVuPgorICA8bGlzdGVuPnRjcDpwb3J0PTEyMzQ8L2xpc3Rlbj4KKyAgPGluY2x1ZGVkaXI+YmFzaWMuZDwvaW5jbHVkZWRpcj4KKyAgPHNlcnZpY2VkaXI+L3Vzci9zaGFyZS9mb288L3NlcnZpY2VkaXI+CisgIDxpbmNsdWRlIGlnbm9yZV9taXNzaW5nPSJ5ZXMiPm5vbmV4aXN0ZW50LmNvbmY8L2luY2x1ZGU+CisgIDxwb2xpY3kgY29udGV4dD0iZGVmYXVsdCI+CisgICAgPGFsbG93IHVzZXI9IioiLz4KKyAgPC9wb2xpY3k+Cis8L2J1c2NvbmZpZz4KZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9lcXVpdi1jb25maWctZmlsZXMvZW50aXRpZXMvYmFzaWMuZC9iYXNpYy5jb25mIGIvdGVzdC9kYXRhL2VxdWl2LWNvbmZpZy1maWxlcy9lbnRpdGllcy9iYXNpYy5kL2Jhc2ljLmNvbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDEwOWQ3MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9lcXVpdi1jb25maWctZmlsZXMvZW50aXRpZXMvYmFzaWMuZC9iYXNpYy5jb25mCkBAIC0wLDAgKzEsMTMgQEAKKzwhRE9DVFlQRSBidXNjb25maWcgUFVCTElDICItLy9mcmVlZGVza3RvcC8vRFREIEQtQlVTIEJ1cyBDb25maWd1cmF0aW9uIDEuMC8vRU4iCisgImh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3N0YW5kYXJkcy9kYnVzLzEuMC9idXNjb25maWcuZHRkIj4KKzxidXNjb25maWc+CisgIDx1c2VyPm15YnVzdXNlcjwvdXNlcj4KKyAgPGxpc3Rlbj51bml4OnBhdGg9L2Zvby9iYXI8L2xpc3Rlbj4KKyAgPGxpc3Rlbj50Y3A6cG9ydD0xMjM0PC9saXN0ZW4+CisgIDxpbmNsdWRlZGlyPmJhc2ljLmQ8L2luY2x1ZGVkaXI+CisgIDxzZXJ2aWNlZGlyPi91c3Ivc2hhcmUvZm9vPC9zZXJ2aWNlZGlyPgorICA8aW5jbHVkZSBpZ25vcmVfbWlzc2luZz0ieWVzIj5ub25leGlzdGVudC5jb25mPC9pbmNsdWRlPgorICA8cG9saWN5IGNvbnRleHQ9ImRlZmF1bHQiPgorICAgIDxhbGxvdyB1c2VyPSIqIi8+CisgIDwvcG9saWN5PgorPC9idXNjb25maWc+CmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvZXF1aXYtY29uZmlnLWZpbGVzL2VudGl0aWVzL2VudGl0aWVzLTEuY29uZiBiL3Rlc3QvZGF0YS9lcXVpdi1jb25maWctZmlsZXMvZW50aXRpZXMvZW50aXRpZXMtMS5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkM2NlYTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvZXF1aXYtY29uZmlnLWZpbGVzL2VudGl0aWVzL2VudGl0aWVzLTEuY29uZgpAQCAtMCwwICsxLDE0IEBACis8IS0tIFRoaXMgY29uZmlnIGZpbGUgY29udGFpbnMgWE1MIGVudGl0aWVzIC0tPgorPCFET0NUWVBFIGJ1c2NvbmZpZyBQVUJMSUMgIi0vL2ZyZWVkZXNrdG9wLy9EVEQgRC1CVVMgQnVzIENvbmZpZ3VyYXRpb24gMS4wLy9FTiIKKyAiaHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc3RhbmRhcmRzL2RidXMvMS4wL2J1c2NvbmZpZy5kdGQiPgorPGJ1c2NvbmZpZz4KKyAgPHVzZXI+bXlidXN1c2VyPC91c2VyPgorICA8bGlzdGVuPnVuaXg6cGF0aD0vZm9vLyZsdDtiYXImZ3Q7PC9saXN0ZW4+CisgIDxsaXN0ZW4+dGNwOnBvcnQ9MTIzNDwvbGlzdGVuPgorICA8aW5jbHVkZWRpcj5iYXNpYy4mIzEwMDs8L2luY2x1ZGVkaXI+CisgIDxzZXJ2aWNlZGlyPi91c3IvJmFtcDtzaGFyZS9mb288L3NlcnZpY2VkaXI+CisgIDxpbmNsdWRlIGlnbm9yZV9taXNzaW5nPSJ5ZSYjMTE1OyI+bm9uZXhpc3RlbnQuY29uZiYjMTEwOzwvaW5jbHVkZT4KKyAgPHBvbGljeSBjb250ZXh0PSImIzEwMDtlZmF1bHQiPgorICAgIDxhbGxvdyB1c2VyPSIqIi8+CisgIDwvcG9saWN5PgorPC9idXNjb25maWc+CmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvZXF1aXYtY29uZmlnLWZpbGVzL2VudGl0aWVzL2VudGl0aWVzLTIuY29uZiBiL3Rlc3QvZGF0YS9lcXVpdi1jb25maWctZmlsZXMvZW50aXRpZXMvZW50aXRpZXMtMi5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmZmFiZWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvZXF1aXYtY29uZmlnLWZpbGVzL2VudGl0aWVzL2VudGl0aWVzLTIuY29uZgpAQCAtMCwwICsxLDUgQEAKKzwhRE9DVFlQRSBidXNjb25maWcgUFVCTElDICItLy9mcmVlZGVza3RvcC8vRFREIEQtQlVTIEJ1cyBDb25maWd1cmF0aW9uIDEuMC8vRU4iCisgImh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3N0YW5kYXJkcy9kYnVzLzEuMC9idXNjb25maWcuZHRkIj4KKzxidXNjb25maWc+Cis8aW5jbHVkZT5lbnRpdGllcy0xLmNvbmY8L2luY2x1ZGU+Cis8L2J1c2NvbmZpZz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvaW5jb21wbGV0ZS1tZXNzYWdlcy9taXNzaW5nLWJvZHkubWVzc2FnZSBiL3Rlc3QvZGF0YS9pbmNvbXBsZXRlLW1lc3NhZ2VzL21pc3NpbmctYm9keS5tZXNzYWdlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzOGU5ZWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvaW5jb21wbGV0ZS1tZXNzYWdlcy9taXNzaW5nLWJvZHkubWVzc2FnZQpAQCAtMCwwICsxLDE5IEBACisjIyBtZXNzYWdlIHRoYXQncyBtaXNzaW5nIGFuIGV4cGVjdGVkIGJvZHkKKworVkFMSURfSEVBREVSIG1ldGhvZF9jYWxsCitIRUFERVJfRklFTEQgSU5URVJGQUNFCitUWVBFIFNUUklORworU1RSSU5HICdvcmcuZnJlZWRlc2t0b3AuRm9vJworSEVBREVSX0ZJRUxEIE1FTUJFUgorVFlQRSBTVFJJTkcKK1NUUklORyAnQmFyJworQUxJR04gOAorRU5EX0xFTkdUSCBIZWFkZXIKKworIyMgY3JlYXRlIHRoZSBib2R5LCB0aGVuIGNob3AgaXQgb2ZmCitTVEFSVF9MRU5HVEggQm9keQorVFlQRSBJTlQzMgorSU5UMzIgMzcKK0VORF9MRU5HVEggQm9keQorCitDSE9QIDgKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9pbnZhbGlkLWNvbmZpZy1maWxlcy9iYWRzZWxpbnV4LTEuY29uZiBiL3Rlc3QvZGF0YS9pbnZhbGlkLWNvbmZpZy1maWxlcy9iYWRzZWxpbnV4LTEuY29uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODUyZGVkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2ludmFsaWQtY29uZmlnLWZpbGVzL2JhZHNlbGludXgtMS5jb25mCkBAIC0wLDAgKzEsMTAgQEAKKzwhRE9DVFlQRSBidXNjb25maWcgUFVCTElDICItLy9mcmVlZGVza3RvcC8vRFREIEQtQlVTIEJ1cyBDb25maWd1cmF0aW9uIDEuMC8vRU4iCisgImh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3N0YW5kYXJkcy9kYnVzLzEuMC9idXNjb25maWcuZHRkIj4KKzxidXNjb25maWc+CisgIDx1c2VyPm15YnVzdXNlcjwvdXNlcj4KKyAgPGxpc3Rlbj51bml4OnBhdGg9L2Zvby9iYXI8L2xpc3Rlbj4KKyAgPGxpc3Rlbj50Y3A6cG9ydD0xMjM0PC9saXN0ZW4+CisgIDxpbmNsdWRlZGlyPmJhc2ljLmQ8L2luY2x1ZGVkaXI+CisgIDxzZXJ2aWNlZGlyPi91c3Ivc2hhcmUvZm9vPC9zZXJ2aWNlZGlyPgorICA8aW5jbHVkZSBzZWxpbnV4X3Jvb3RfcmVsYXRpdmU9ImpvbW9tYSI+YmxhaDwvaW5jbHVkZT4KKzwvYnVzY29uZmlnPgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2ludmFsaWQtY29uZmlnLWZpbGVzL2JhZHNlbGludXgtMi5jb25mIGIvdGVzdC9kYXRhL2ludmFsaWQtY29uZmlnLWZpbGVzL2JhZHNlbGludXgtMi5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjM2I5NWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvaW52YWxpZC1jb25maWctZmlsZXMvYmFkc2VsaW51eC0yLmNvbmYKQEAgLTAsMCArMSwxMCBAQAorPCFET0NUWVBFIGJ1c2NvbmZpZyBQVUJMSUMgIi0vL2ZyZWVkZXNrdG9wLy9EVEQgRC1CVVMgQnVzIENvbmZpZ3VyYXRpb24gMS4wLy9FTiIKKyAiaHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc3RhbmRhcmRzL2RidXMvMS4wL2J1c2NvbmZpZy5kdGQiPgorPGJ1c2NvbmZpZz4KKyAgPHVzZXI+bXlidXN1c2VyPC91c2VyPgorICA8bGlzdGVuPnVuaXg6cGF0aD0vZm9vL2JhcjwvbGlzdGVuPgorICA8bGlzdGVuPnRjcDpwb3J0PTEyMzQ8L2xpc3Rlbj4KKyAgPGluY2x1ZGVkaXI+YmFzaWMuZDwvaW5jbHVkZWRpcj4KKyAgPHNlcnZpY2VkaXI+L3Vzci9zaGFyZS9mb288L3NlcnZpY2VkaXI+CisgIDxpbmNsdWRlIGlmX3NlbGludXhfZW5hYmxlZD0ibW9vIj5ibGFoPC9pbmNsdWRlPgorPC9idXNjb25maWc+CmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvaW52YWxpZC1jb25maWctZmlsZXMvY2lyY3VsYXItMS5jb25mIGIvdGVzdC9kYXRhL2ludmFsaWQtY29uZmlnLWZpbGVzL2NpcmN1bGFyLTEuY29uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWE4OTVhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2ludmFsaWQtY29uZmlnLWZpbGVzL2NpcmN1bGFyLTEuY29uZgpAQCAtMCwwICsxLDQgQEAKKzwhRE9DVFlQRSBidXNjb25maWcgUFVCTElDICItLy9mcmVlZGVza3RvcC8vRFREIEQtQlVTIEJ1cyBDb25maWd1cmF0aW9uIDEuMC8vRU4iICJodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zdGFuZGFyZHMvZGJ1cy8xLjAvYnVzY29uZmlnLmR0ZCI+Cis8YnVzY29uZmlnPgorPGluY2x1ZGU+Y2lyY3VsYXItMS5jb25mPC9pbmNsdWRlPgorPC9idXNjb25maWc+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2ludmFsaWQtY29uZmlnLWZpbGVzL2NpcmN1bGFyLTIuY29uZiBiL3Rlc3QvZGF0YS9pbnZhbGlkLWNvbmZpZy1maWxlcy9jaXJjdWxhci0yLmNvbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZhN2U3OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9pbnZhbGlkLWNvbmZpZy1maWxlcy9jaXJjdWxhci0yLmNvbmYKQEAgLTAsMCArMSw0IEBACis8IURPQ1RZUEUgYnVzY29uZmlnIFBVQkxJQyAiLS8vZnJlZWRlc2t0b3AvL0RURCBELUJVUyBCdXMgQ29uZmlndXJhdGlvbiAxLjAvL0VOIiAiaHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc3RhbmRhcmRzL2RidXMvMS4wL2J1c2NvbmZpZy5kdGQiPgorPGJ1c2NvbmZpZz4KKzxpbmNsdWRlPmNpcmN1bGFyLTMuY29uZjwvaW5jbHVkZT4KKzwvYnVzY29uZmlnPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9pbnZhbGlkLWNvbmZpZy1maWxlcy9jaXJjdWxhci0zLmNvbmYgYi90ZXN0L2RhdGEvaW52YWxpZC1jb25maWctZmlsZXMvY2lyY3VsYXItMy5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3ZTM1NGQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvaW52YWxpZC1jb25maWctZmlsZXMvY2lyY3VsYXItMy5jb25mCkBAIC0wLDAgKzEsNCBAQAorPCFET0NUWVBFIGJ1c2NvbmZpZyBQVUJMSUMgIi0vL2ZyZWVkZXNrdG9wLy9EVEQgRC1CVVMgQnVzIENvbmZpZ3VyYXRpb24gMS4wLy9FTiIgImh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3N0YW5kYXJkcy9kYnVzLzEuMC9idXNjb25maWcuZHRkIj4KKzxidXNjb25maWc+Cis8aW5jbHVkZT5jaXJjdWxhci0yLmNvbmY8L2luY2x1ZGU+Cis8L2J1c2NvbmZpZz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvaW52YWxpZC1jb25maWctZmlsZXMvaW1wb3NzaWJsZS1zZW5kLmNvbmYgYi90ZXN0L2RhdGEvaW52YWxpZC1jb25maWctZmlsZXMvaW1wb3NzaWJsZS1zZW5kLmNvbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM2ZDc0NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9pbnZhbGlkLWNvbmZpZy1maWxlcy9pbXBvc3NpYmxlLXNlbmQuY29uZgpAQCAtMCwwICsxLDYgQEAKKzxidXNjb25maWc+CisgIDxsaXN0ZW4+dW5peDpwYXRoPS9mb288L2xpc3Rlbj4KKyAgPHBvbGljeSBjb250ZXh0PSJkZWZhdWx0Ij4KKyAgICA8YWxsb3cgc2VuZF9icm9hZGNhc3Q9InRydWUiIHNlbmRfZGVzdGluYXRpb249ImNvbS5leGFtcGxlLkJlZXMiLz4KKyAgPC9wb2xpY3k+Cis8L2J1c2NvbmZpZz4KZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9pbnZhbGlkLWNvbmZpZy1maWxlcy9ub3Qtd2VsbC1mb3JtZWQuY29uZiBiL3Rlc3QvZGF0YS9pbnZhbGlkLWNvbmZpZy1maWxlcy9ub3Qtd2VsbC1mb3JtZWQuY29uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTU5Y2JjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2ludmFsaWQtY29uZmlnLWZpbGVzL25vdC13ZWxsLWZvcm1lZC5jb25mCkBAIC0wLDAgKzEsNSBAQAorPCFET0NUWVBFIGJ1c2NvbmZpZyBQVUJMSUMgIi0vL2ZyZWVkZXNrdG9wLy9EVEQgRC1CVVMgQnVzIENvbmZpZ3VyYXRpb24gMS4wLy9FTiIKKyAiaHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc3RhbmRhcmRzL2RidXMvMS4wL2J1c2NvbmZpZy5kdGQiPgorPGJ1c2NvbmZpZz4KKyAgPHVzZXI+bXlidXN1c2VyPC9mb28+Cis8L2J1c2NvbmZpZz4KZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9pbnZhbGlkLWNvbmZpZy1maWxlcy9zZW5kLWFuZC1yZWNlaXZlLmNvbmYgYi90ZXN0L2RhdGEvaW52YWxpZC1jb25maWctZmlsZXMvc2VuZC1hbmQtcmVjZWl2ZS5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1YjFhMzEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvaW52YWxpZC1jb25maWctZmlsZXMvc2VuZC1hbmQtcmVjZWl2ZS5jb25mCkBAIC0wLDAgKzEsNiBAQAorPGJ1c2NvbmZpZz4KKyAgPGxpc3Rlbj51bml4OnBhdGg9L2ZvbzwvbGlzdGVuPgorICA8cG9saWN5IGNvbnRleHQ9ImRlZmF1bHQiPgorICAgIDxhbGxvdyByZWNlaXZlX3R5cGU9InNpZ25hbCIgc2VuZF9kZXN0aW5hdGlvbj0iY29tLmV4YW1wbGUuQmVlcyIvPgorICA8L3BvbGljeT4KKzwvYnVzY29uZmlnPgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2ludmFsaWQtY29uZmlnLWZpbGVzL3RydW5jYXRlZC1maWxlLmNvbmYgYi90ZXN0L2RhdGEvaW52YWxpZC1jb25maWctZmlsZXMvdHJ1bmNhdGVkLWZpbGUuY29uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGQ2MDg4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2ludmFsaWQtY29uZmlnLWZpbGVzL3RydW5jYXRlZC1maWxlLmNvbmYKQEAgLTAsMCArMSw5IEBACis8IURPQ1RZUEUgYnVzY29uZmlnIFBVQkxJQyAiLS8vZnJlZWRlc2t0b3AvL0RURCBELUJVUyBCdXMgQ29uZmlndXJhdGlvbiAxLjAvL0VOIgorICJodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zdGFuZGFyZHMvZGJ1cy8xLjAvYnVzY29uZmlnLmR0ZCI+Cis8YnVzY29uZmlnPgorICA8dXNlcj5teWJ1c3VzZXI8L3VzZXI+CisgIDxsaXN0ZW4+dW5peDpwYXRoPS9mb28vYmFyPC9saXN0ZW4+CisgIDxsaXN0ZW4+dGNwOnBvcnQ9MTIzNDwvbGlzdGVuPgorICA8aW5jbHVkZWRpcj5iYXNpYy5kPC9pbmNsdWRlZGlyPgorICA8c2VydmljZWRpcj4vdXNyL3NoYXJlL2Zvbzwvc2VydmljZWRpcj4KKyAgPGluY2x1ZGUgaWdub3JlX21pc3Npbmc9InkKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL2FycmF5LW9mLW5pbC5tZXNzYWdlIGIvdGVzdC9kYXRhL2ludmFsaWQtbWVzc2FnZXMvYXJyYXktb2YtbmlsLm1lc3NhZ2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE5N2ExMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL2FycmF5LW9mLW5pbC5tZXNzYWdlCkBAIC0wLDAgKzEsMzEgQEAKKyMgTWVzc2FnZSB3aXRoIGFuIGFycmF5IG9mIE5JTCAobm90IGFsbG93ZWQpCisKK1ZBTElEX0hFQURFUiBtZXRob2RfY2FsbAorCitIRUFERVJfRklFTEQgSU5URVJGQUNFCitUWVBFIFNUUklORworU1RSSU5HICdvcmcuZnJlZWRlc2t0b3AuRm9vJworSEVBREVSX0ZJRUxEIE1FTUJFUgorVFlQRSBTVFJJTkcKK1NUUklORyAnQmFyJworSEVBREVSX0ZJRUxEIFBBVEgKK1RZUEUgT0JKRUNUX1BBVEggCitPQkpFQ1RfUEFUSCAnL2ZvbycKKworQUxJR04gOAorRU5EX0xFTkdUSCBIZWFkZXIKKworU1RBUlRfTEVOR1RIIEJvZHkKK1RZUEUgQVJSQVkKK1RZUEUgTklMCitVSU5UMzIgNQorCisjIyB3ZSB3YW50IGl0IHRvIGZhaWwgYmVjYXVzZSBvZiB0eXBlIG5pbCwgbm90IGJlY2F1c2UgdGhlIGxlbmd0aCBpcyBubyBnb29kCisjIyBzbyBwYWQgb3V0IHRoZSBtZXNzYWdlIHdpdGggNSBieXRlcworQllURSAxCitCWVRFIDIKK0JZVEUgMworQllURSA0CitCWVRFIDUKKworRU5EX0xFTkdUSCBCb2R5CmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvaW52YWxpZC1tZXNzYWdlcy9hcnJheS13aXRoLW1peGVkLXR5cGVzLm1lc3NhZ2UgYi90ZXN0L2RhdGEvaW52YWxpZC1tZXNzYWdlcy9hcnJheS13aXRoLW1peGVkLXR5cGVzLm1lc3NhZ2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVhMmQxZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL2FycmF5LXdpdGgtbWl4ZWQtdHlwZXMubWVzc2FnZQpAQCAtMCwwICsxLDUyIEBACisjIE1lc3NhZ2Ugd2l0aCBhbiBhcnJheSBvZiBhcnJheSB3aGVyZSB0aGUgY2hpbGQgYXJyYXlzIGFyZSBvZgorIyBkaWZmZXJlbnQgdHlwZXMKKworVkFMSURfSEVBREVSIG1ldGhvZF9jYWxsCisKK0hFQURFUl9GSUVMRCBJTlRFUkZBQ0UKK1RZUEUgU1RSSU5HCitTVFJJTkcgJ29yZy5mcmVlZGVza3RvcC5Gb28nCitIRUFERVJfRklFTEQgTUVNQkVSCitUWVBFIFNUUklORworU1RSSU5HICdCYXInCitIRUFERVJfRklFTEQgUEFUSAorVFlQRSBPQkpFQ1RfUEFUSAorT0JKRUNUX1BBVEggJy9mb28nCisKK0FMSUdOIDgKK0VORF9MRU5HVEggSGVhZGVyCisKK1NUQVJUX0xFTkdUSCBCb2R5CisKK1RZUEUgQVJSQVkKK1RZUEUgQVJSQVkKK1RZUEUgVUlOVDMyCisKK0xFTkdUSCBBcnJheQorU1RBUlRfTEVOR1RIIEFycmF5CisKKyMjIGFycmF5IG9mIHVpbnQzMgorTEVOR1RIIFN1YkFycmF5MQorU1RBUlRfTEVOR1RIIFN1YkFycmF5MQorVUlOVDMyIDEKK1VJTlQzMiAyCitVSU5UMzIgMworRU5EX0xFTkdUSCBTdWJBcnJheTEKKworIyMgYXJyYXkgb2YgdWludDMyCitMRU5HVEggU3ViQXJyYXkyCitTVEFSVF9MRU5HVEggU3ViQXJyYXkyCitVSU5UMzIgNAorVUlOVDMyIDUKK0VORF9MRU5HVEggU3ViQXJyYXkyCisKKyMjIGFycmF5IG9mIGJvb2xlYW4KK0xFTkdUSCBTdWJBcnJheTMKK1NUQVJUX0xFTkdUSCBTdWJBcnJheTMKK0JPT0xFQU4gZmFsc2UKK0JPT0xFQU4gdHJ1ZQorRU5EX0xFTkdUSCBTdWJBcnJheTMKKworRU5EX0xFTkdUSCBBcnJheQorCitFTkRfTEVOR1RIIEJvZHkKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL2JhZC1ib29sZWFuLWFycmF5Lm1lc3NhZ2UgYi90ZXN0L2RhdGEvaW52YWxpZC1tZXNzYWdlcy9iYWQtYm9vbGVhbi1hcnJheS5tZXNzYWdlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4MDAwYWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvaW52YWxpZC1tZXNzYWdlcy9iYWQtYm9vbGVhbi1hcnJheS5tZXNzYWdlCkBAIC0wLDAgKzEsMjcgQEAKKyMjIGEgbWVzc2FnZSB3aXRoIGFuIGludmFsaWQgYm9vbGVhbiBhcnJheQorCisjIyBWQUxJRF9IRUFERVIgaW5jbHVkZXMgYSBMRU5HVEggSGVhZGVyIGFuZCBMRU5HVEggQm9keQorVkFMSURfSEVBREVSIG1ldGhvZF9jYWxsCisKK0hFQURFUl9GSUVMRCBJTlRFUkZBQ0UKK1RZUEUgU1RSSU5HCitTVFJJTkcgJ29yZy5mcmVlZGVza3RvcC5Gb28nCitIRUFERVJfRklFTEQgTUVNQkVSCitUWVBFIFNUUklORworU1RSSU5HICdCYXInCitIRUFERVJfRklFTEQgUEFUSAorVFlQRSBPQkpFQ1RfUEFUSAorT0JKRUNUX1BBVEggJy9mb28nCisKK0FMSUdOIDgKK0VORF9MRU5HVEggSGVhZGVyCisKK1NUQVJUX0xFTkdUSCBCb2R5CitUWVBFIEFSUkFZCitUWVBFIEJPT0xFQU4KK0FMSUdOIDQKK0lOVDMyIDMKK0JZVEUgMAorQllURSAxCitCWVRFIDMKK0VORF9MRU5HVEggQm9keQpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2ludmFsaWQtbWVzc2FnZXMvYmFkLWJvb2xlYW4ubWVzc2FnZSBiL3Rlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL2JhZC1ib29sZWFuLm1lc3NhZ2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDkwMjZkYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL2JhZC1ib29sZWFuLm1lc3NhZ2UKQEAgLTAsMCArMSwyMiBAQAorIyMgYSBtZXNzYWdlIHdpdGggYW4gaW52YWxpZCBib29sZWFuIHZhbHVlCisKKyMjIFZBTElEX0hFQURFUiBpbmNsdWRlcyBhIExFTkdUSCBIZWFkZXIgYW5kIExFTkdUSCBCb2R5CitWQUxJRF9IRUFERVIgbWV0aG9kX2NhbGwKKworSEVBREVSX0ZJRUxEIElOVEVSRkFDRQorVFlQRSBTVFJJTkcKK1NUUklORyAnb3JnLmZyZWVkZXNrdG9wLkZvbycKK0hFQURFUl9GSUVMRCBNRU1CRVIKK1RZUEUgU1RSSU5HCitTVFJJTkcgJ0JhcicKK0hFQURFUl9GSUVMRCBQQVRICitUWVBFIE9CSkVDVF9QQVRICitPQkpFQ1RfUEFUSCAnL2ZvbycKKworQUxJR04gOAorRU5EX0xFTkdUSCBIZWFkZXIKKworU1RBUlRfTEVOR1RIIEJvZHkKK1RZUEUgQk9PTEVBTgorQllURSAzCitFTkRfTEVOR1RIIEJvZHkKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL2JhZC1lbmRpYW4ubWVzc2FnZSBiL3Rlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL2JhZC1lbmRpYW4ubWVzc2FnZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTc5YmFhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2ludmFsaWQtbWVzc2FnZXMvYmFkLWVuZGlhbi5tZXNzYWdlCkBAIC0wLDAgKzEsMjUgQEAKKyMjIG1lc3NhZ2Ugd2l0aCBpbnZhbGlkIGVuZGlhbm5lc3MgdGFnCisKK0JZVEUgJ2knCitCWVRFIDEKK0JZVEUgMAorQllURSAwCisKK0xFTkdUSCBIZWFkZXIKK0xFTkdUSCBCb2R5CisKK0hFQURFUl9GSUVMRCBJTlRFUkZBQ0UKK1RZUEUgU1RSSU5HCitTVFJJTkcgJ29yZy5mcmVlZGVza3RvcC5Gb28nCitIRUFERVJfRklFTEQgTUVNQkVSCitUWVBFIFNUUklORworU1RSSU5HICdCYXInCitIRUFERVJfRklFTEQgUEFUSAorVFlQRSBPQkpFQ1RfUEFUSAorT0JKRUNUX1BBVEggJy9mb28nCisKK0FMSUdOIDgKK0VORF9MRU5HVEggSGVhZGVyCisKK1NUQVJUX0xFTkdUSCBCb2R5CitFTkRfTEVOR1RIIEJvZHkKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL2JhZC1oZWFkZXItZmllbGQtYWxpZ25tZW50Lm1lc3NhZ2UgYi90ZXN0L2RhdGEvaW52YWxpZC1tZXNzYWdlcy9iYWQtaGVhZGVyLWZpZWxkLWFsaWdubWVudC5tZXNzYWdlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyYzBkN2UKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvaW52YWxpZC1tZXNzYWdlcy9iYWQtaGVhZGVyLWZpZWxkLWFsaWdubWVudC5tZXNzYWdlCkBAIC0wLDAgKzEsMzggQEAKKyMjIGxhc3QgZmllbGQgaW5jb3JyZWN0bHkgYWxpZ25lZCB0byA0IGJ5dGVzCisKKyMjIFZBTElEX0hFQURFUiBpbmNsdWRlcyBhIExFTkdUSCBIZWFkZXIgYW5kIExFTkdUSCBCb2R5CitWQUxJRF9IRUFERVIgbWV0aG9kX2NhbGwKKworSEVBREVSX0ZJRUxEIElOVEVSRkFDRQorVFlQRSBTVFJJTkcKK1NUUklORyAnb3JnLmZyZWVkZXNrdG9wLkZvbycKKworSEVBREVSX0ZJRUxEIE1FTUJFUgorVFlQRSBTVFJJTkcKK1NUUklORyAnQmFyJworCitIRUFERVJfRklFTEQgUEFUSAorVFlQRSBPQkpFQ1RfUEFUSAorT0JKRUNUX1BBVEggJy9mb28nCisKK0hFQURFUl9GSUVMRCBVTktOT1dOCitUWVBFIFNUUklORworU1RSSU5HICdhJworCitBTElHTiA0CisKK0hFQURFUl9GSUVMRCBVTktOT1dOCitUWVBFIEFSUkFZCitUWVBFIEJZVEUKK0FMSUdOIDQKK0xFTkdUSCBUaGlzQnl0ZUFycmF5CitTVEFSVF9MRU5HVEggVGhpc0J5dGVBcnJheQorQllURSAxCitCWVRFIDIKK0VORF9MRU5HVEggVGhpc0J5dGVBcnJheQorCisKK0FMSUdOIDgKK0VORF9MRU5HVEggSGVhZGVyCitTVEFSVF9MRU5HVEggQm9keQorRU5EX0xFTkdUSCBCb2R5CmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvaW52YWxpZC1tZXNzYWdlcy9ib29sZWFuLWhhcy1uby12YWx1ZS5tZXNzYWdlLXJhdyBiL3Rlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL2Jvb2xlYW4taGFzLW5vLXZhbHVlLm1lc3NhZ2UtcmF3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExYjE1YzgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvaW52YWxpZC1tZXNzYWdlcy9ib29sZWFuLWhhcy1uby12YWx1ZS5tZXNzYWdlLXJhdwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvaW52YWxpZC1tZXNzYWdlcy9sb2NhbC1uYW1lc3BhY2UubWVzc2FnZSBiL3Rlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL2xvY2FsLW5hbWVzcGFjZS5tZXNzYWdlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhNzIwMTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvaW52YWxpZC1tZXNzYWdlcy9sb2NhbC1uYW1lc3BhY2UubWVzc2FnZQpAQCAtMCwwICsxLDIxIEBACisjIyBhIG1lc3NhZ2UgdGhhdCBpcyBpbiB0aGUgb3JnLmZyZWVkZXNrdG9wLkxvY2FsLiBuYW1lc3BhY2UgYW5kIHRodXMKKyMjIGludmFsaWQKKworIyMgVkFMSURfSEVBREVSIGluY2x1ZGVzIGEgTEVOR1RIIEhlYWRlciBhbmQgTEVOR1RIIEJvZHkKK1ZBTElEX0hFQURFUiBtZXRob2RfY2FsbAorCitIRUFERVJfRklFTEQgSU5URVJGQUNFCitUWVBFIFNUUklORworU1RSSU5HICdvcmcuZnJlZWRlc2t0b3AuREJ1cy5Mb2NhbCcKK0hFQURFUl9GSUVMRCBNRU1CRVIKK1RZUEUgU1RSSU5HCitTVFJJTkcgJ0Rpc2Nvbm5lY3RlZCcKK0hFQURFUl9GSUVMRCBQQVRICitUWVBFIE9CSkVDVF9QQVRICitPQkpFQ1RfUEFUSCAnL2ZvbycKKworQUxJR04gOAorRU5EX0xFTkdUSCBIZWFkZXIKKworU1RBUlRfTEVOR1RIIEJvZHkKK0VORF9MRU5HVEggQm9keQpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2ludmFsaWQtbWVzc2FnZXMvbm8tZG90LWluLW5hbWUubWVzc2FnZSBiL3Rlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL25vLWRvdC1pbi1uYW1lLm1lc3NhZ2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ2MzE3YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL25vLWRvdC1pbi1uYW1lLm1lc3NhZ2UKQEAgLTAsMCArMSwxOSBAQAorIyMgYSBtZXNzYWdlIHdpdGggZG90bGVzcyBpbnRlcmZhY2UKKworIyMgVkFMSURfSEVBREVSIGluY2x1ZGVzIGEgTEVOR1RIIEhlYWRlciBhbmQgTEVOR1RIIEJvZHkKK1ZBTElEX0hFQURFUiBtZXRob2RfY2FsbAorCitIRUFERVJfRklFTEQgSU5URVJGQUNFCitUWVBFIFNUUklORworU1RSSU5HICdOb0RvdEluSGVyZScKK0hFQURFUl9GSUVMRCBNRU1CRVIKK1RZUEUgU1RSSU5HCitTVFJJTkcgJ0JhcicKK0hFQURFUl9GSUVMRCBQQVRICitUWVBFIE9CSkVDVF9QQVRICitPQkpFQ1RfUEFUSCAnL2ZvbycKKworQUxJR04gOAorRU5EX0xFTkdUSCBIZWFkZXIKK1NUQVJUX0xFTkdUSCBCb2R5CitFTkRfTEVOR1RIIEJvZHkKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL25vdC1udWwtaGVhZGVyLXBhZGRpbmcubWVzc2FnZSBiL3Rlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL25vdC1udWwtaGVhZGVyLXBhZGRpbmcubWVzc2FnZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTg0NmRhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2ludmFsaWQtbWVzc2FnZXMvbm90LW51bC1oZWFkZXItcGFkZGluZy5tZXNzYWdlCkBAIC0wLDAgKzEsMjUgQEAKKyMjIGhhcyBvbmUgbm9uLW51bCBieXRlIGluIGhlYWRlciBwYWRkaW5nCisKKyMjIFZBTElEX0hFQURFUiBpbmNsdWRlcyBhIExFTkdUSCBIZWFkZXIgYW5kIExFTkdUSCBCb2R5CitWQUxJRF9IRUFERVIgbWV0aG9kX2NhbGwKKworSEVBREVSX0ZJRUxEIElOVEVSRkFDRQorVFlQRSBTVFJJTkcKK1NUUklORyAnb3JnLmZyZWVkZXNrdG9wLkZvbycKK0hFQURFUl9GSUVMRCBNRU1CRVIKK1RZUEUgU1RSSU5HCitTVFJJTkcgJ0JhcicKK0hFQURFUl9GSUVMRCBQQVRICitUWVBFIE9CSkVDVF9QQVRICitPQkpFQ1RfUEFUSCAnL2ZvbycKKworSEVBREVSX0ZJRUxEIFVOS05PV04KK1RZUEUgU1RSSU5HCitTVFJJTkcgJ2EnCitBTElHTiA4CisjIyBraWxsIGEgcGFkZGluZyBieXRlIGFuZCByZXBsYWNlIGl0CitDSE9QIDEKK0JZVEUgJ3EnCitFTkRfTEVOR1RIIEhlYWRlcgorU1RBUlRfTEVOR1RIIEJvZHkKK0VORF9MRU5HVEggQm9keQpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2ludmFsaWQtbWVzc2FnZXMvb3ZlcmxvbmctbmFtZS5tZXNzYWdlIGIvdGVzdC9kYXRhL2ludmFsaWQtbWVzc2FnZXMvb3ZlcmxvbmctbmFtZS5tZXNzYWdlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxZjkwNzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvaW52YWxpZC1tZXNzYWdlcy9vdmVybG9uZy1uYW1lLm1lc3NhZ2UKQEAgLTAsMCArMSwyMCBAQAorIyMgYSBtZXNzYWdlIHdpdGggdG9vLWxvbmcgbmFtZSBmaWVsZAorCisjIyBWQUxJRF9IRUFERVIgaW5jbHVkZXMgYSBMRU5HVEggSGVhZGVyIGFuZCBMRU5HVEggQm9keQorVkFMSURfSEVBREVSIG1ldGhvZF9jYWxsCitIRUFERVJfRklFTEQgSU5URVJGQUNFCitUWVBFIFNUUklORworU1RSSU5HICdvcmcuZm9vLmJhci50aGlzLmlzLnJlYWxseS5sb25nIDEgMiAzIDQgNSA2IDcgOCA5IDEwIDExIDEyIDEzIDE0IDE1IDE2IDE3IDE4IDE5IDIwIDIxIDIyIDIzIDI0IDI1IDI2IDI3IDI4IDI5IDMwIDMxIDMyIDMzIDM0IDM1IDM2IDM3IDM4IDM5IDQwIDQxIDQyIDQzIDQ0IDQ1IDQ2IDQ3IDQ4IDQ5IDUwIDUxIDUyIDUzIDU0IDU1IDU2IDU3IDU4IDU5IDYwIDYxIDYyIDYzIDY0IDY1IDY2IDY3IDY4IDY5IDcwIDcxIDcyIDczIDc0IDc1IDc2IDc3IDc4IDc5IDgwIDgxIDgyIDgzIDg0IDg1IDg2IDg3IDg4IDg5IDkwIDkxIDkyIDkzIDk0IDk1IDk2IDk3IDk4IDk5IDEwMCAxMDEgMTAyIDEwMyAxMDQgMTA1IDEwNiAxMDcgMTA4IDEwOSAxMTAgMTExIDExMiAxMTMgMTE0IDExNSAxMTYgMTE3IDExOCAxMTkgMTIwIDEyMSAxMjIgMTIzIDEyNCAxMjUgMTI2IDEyNyAxMjggMTI5IDEzMCAxMzEgMTMyIDEzMyAxMzQgMTM1IDEzNiAxMzcgMTM4IDEzOSAxNDAgMTQxIDE0MiAxNDMgMTQ0IDE0NSAxNDYgMTQ3IDE0OCAxNDkgMTUwIDE1MSAxNTIgMTUzIDE1NCAxNTUgMTU2IDE1NyAxNTggMTU5IDE2MCAxNjEgMTYyIDE2MyAxNjQgMTY1IDE2NiAxNjcgMTY4IDE2OSAxNzAgMTcxIDE3MiAxNzMgMTc0IDE3NSAxNzYgMTc3IDE3OCAxNzkgMTgwIDE4MSAxODIgMTgzIDE4NCAxODUgMTg2IDE4NyAxODggMTg5IDE5MCAxOTEgMTkyIDE5MyAxOTQgMTk1IDE5NiAxOTcgMTk4IDE5OSAyMDAnCisKK0hFQURFUl9GSUVMRCBNRU1CRVIKK1RZUEUgU1RSSU5HCitTVFJJTkcgJ0JhcicKKworSEVBREVSX0ZJRUxEIFBBVEgKK1RZUEUgT0JKRUNUX1BBVEgKK09CSkVDVF9QQVRIICcvZm9vJworCitBTElHTiA4CitFTkRfTEVOR1RIIEhlYWRlcgorU1RBUlRfTEVOR1RIIEJvZHkKK0VORF9MRU5HVEggQm9keQpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2ludmFsaWQtbWVzc2FnZXMvdG9vLWxpdHRsZS1oZWFkZXItcGFkZGluZy5tZXNzYWdlIGIvdGVzdC9kYXRhL2ludmFsaWQtbWVzc2FnZXMvdG9vLWxpdHRsZS1oZWFkZXItcGFkZGluZy5tZXNzYWdlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1ODgxNWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvaW52YWxpZC1tZXNzYWdlcy90b28tbGl0dGxlLWhlYWRlci1wYWRkaW5nLm1lc3NhZ2UKQEAgLTAsMCArMSwyNCBAQAorIyMgaGFzIG9uZSBieXRlIG1pc3NpbmcgZnJvbSBoZWFkZXIgcGFkZGluZworCisjIyBWQUxJRF9IRUFERVIgaW5jbHVkZXMgYSBMRU5HVEggSGVhZGVyIGFuZCBMRU5HVEggQm9keQorVkFMSURfSEVBREVSIG1ldGhvZF9jYWxsCisKK0hFQURFUl9GSUVMRCBJTlRFUkZBQ0UKK1RZUEUgU1RSSU5HCitTVFJJTkcgJ29yZy5mcmVlZGVza3RvcC5Gb28nCitIRUFERVJfRklFTEQgTUVNQkVSCitUWVBFIFNUUklORworU1RSSU5HICdCYXInCitIRUFERVJfRklFTEQgUEFUSAorVFlQRSBPQkpFQ1RfUEFUSAorT0JKRUNUX1BBVEggJy9mb28nCisKK0hFQURFUl9GSUVMRCBVTktOT1dOCitUWVBFIFNUUklORworU1RSSU5HICdhJworQUxJR04gOAorIyMga2lsbCBhIHBhZGRpbmcgYnl0ZQorQ0hPUCAxCitFTkRfTEVOR1RIIEhlYWRlcgorU1RBUlRfTEVOR1RIIEJvZHkKK0VORF9MRU5HVEggQm9keQpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2ludmFsaWQtbWVzc2FnZXMvdG9vLW11Y2gtaGVhZGVyLXBhZGRpbmctYnktZmFyLm1lc3NhZ2UgYi90ZXN0L2RhdGEvaW52YWxpZC1tZXNzYWdlcy90b28tbXVjaC1oZWFkZXItcGFkZGluZy1ieS1mYXIubWVzc2FnZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDJiZTNhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2ludmFsaWQtbWVzc2FnZXMvdG9vLW11Y2gtaGVhZGVyLXBhZGRpbmctYnktZmFyLm1lc3NhZ2UKQEAgLTAsMCArMSwyNiBAQAorIyMgaGFzIG9uZSBieXRlIGV4dHJhIGhlYWRlciBwYWRkaW5nCisKKyMjIFZBTElEX0hFQURFUiBpbmNsdWRlcyBhIExFTkdUSCBIZWFkZXIgYW5kIExFTkdUSCBCb2R5CitWQUxJRF9IRUFERVIgbWV0aG9kX2NhbGwKKworSEVBREVSX0ZJRUxEIElOVEVSRkFDRQorVFlQRSBTVFJJTkcKK1NUUklORyAnb3JnLmZyZWVkZXNrdG9wLkZvbycKK0hFQURFUl9GSUVMRCBNRU1CRVIKK1RZUEUgU1RSSU5HCitTVFJJTkcgJ0JhcicKK0hFQURFUl9GSUVMRCBQQVRICitUWVBFIE9CSkVDVF9QQVRICitPQkpFQ1RfUEFUSCAnL2ZvbycKKworSEVBREVSX0ZJRUxEIFVOS05PV04KK1RZUEUgU1RSSU5HCitTVFJJTkcgJ2EnCitBTElHTiA4CitCWVRFIDAKK0FMSUdOIDgKK0JZVEUgMAorQUxJR04gOAorRU5EX0xFTkdUSCBIZWFkZXIKK1NUQVJUX0xFTkdUSCBCb2R5CitFTkRfTEVOR1RIIEJvZHkKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL3Rvby1tdWNoLWhlYWRlci1wYWRkaW5nLm1lc3NhZ2UgYi90ZXN0L2RhdGEvaW52YWxpZC1tZXNzYWdlcy90b28tbXVjaC1oZWFkZXItcGFkZGluZy5tZXNzYWdlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiMWMyOTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvaW52YWxpZC1tZXNzYWdlcy90b28tbXVjaC1oZWFkZXItcGFkZGluZy5tZXNzYWdlCkBAIC0wLDAgKzEsMjMgQEAKKyMjIGhhcyBvbmUgYnl0ZSBleHRyYSBoZWFkZXIgcGFkZGluZworCisjIyBWQUxJRF9IRUFERVIgaW5jbHVkZXMgYSBMRU5HVEggSGVhZGVyIGFuZCBMRU5HVEggQm9keQorVkFMSURfSEVBREVSIG1ldGhvZF9jYWxsCisKK0hFQURFUl9GSUVMRCBJTlRFUkZBQ0UKK1RZUEUgU1RSSU5HCitTVFJJTkcgJ29yZy5mcmVlZGVza3RvcC5Gb28nCitIRUFERVJfRklFTEQgTUVNQkVSCitUWVBFIFNUUklORworU1RSSU5HICdCYXInCitIRUFERVJfRklFTEQgUEFUSAorVFlQRSBPQkpFQ1RfUEFUSAorT0JKRUNUX1BBVEggJy9mb28nCisKK0hFQURFUl9GSUVMRCBVTktOT1dOCitUWVBFIFNUUklORworU1RSSU5HICdhJworQUxJR04gOAorQllURSAwCitFTkRfTEVOR1RIIEhlYWRlcgorU1RBUlRfTEVOR1RIIEJvZHkKK0VORF9MRU5HVEggQm9keQpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2ludmFsaWQtbWVzc2FnZXMvdG9vLXNob3J0LWRpY3QubWVzc2FnZSBiL3Rlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL3Rvby1zaG9ydC1kaWN0Lm1lc3NhZ2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZjM2NjNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9pbnZhbGlkLW1lc3NhZ2VzL3Rvby1zaG9ydC1kaWN0Lm1lc3NhZ2UKQEAgLTAsMCArMSwyOCBAQAorIyBNZXNzYWdlIHdpdGggbG90cyBvZiBkaWZmZXJlbnQgYXJndW1lbnQgdHlwZXMKKworVkFMSURfSEVBREVSIG1ldGhvZF9jYWxsCisKK0hFQURFUl9GSUVMRCBJTlRFUkZBQ0UKK1RZUEUgU1RSSU5HCitTVFJJTkcgJ29yZy5mcmVlZGVza3RvcC5Gb28nCitIRUFERVJfRklFTEQgTUVNQkVSCitUWVBFIFNUUklORworU1RSSU5HICdCYXInCitIRUFERVJfRklFTEQgUEFUSAorVFlQRSBPQkpFQ1RfUEFUSAorT0JKRUNUX1BBVEggJy9mb28nCisKK0FMSUdOIDgKKworRU5EX0xFTkdUSCBIZWFkZXIKKworU1RBUlRfTEVOR1RIIEJvZHkKK1RZUEUgRElDVAorTEVOR1RIIERpY3QKK1NUQVJUX0xFTkdUSCBEaWN0CitTVFJJTkcgJ3VpbnQzMicKK1RZUEUgVUlOVDMyCitVSU5UMzIgMHg4NzY1NDMyCitTVFJJTkcgJ3VpbnQzMicKK0VORF9MRU5HVEggRGljdAorRU5EX0xFTkdUSCBCb2R5CmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvaW52YWxpZC1zZXJ2aWNlLWZpbGVzLXN5c3RlbS8uZ2l0aWdub3JlIGIvdGVzdC9kYXRhL2ludmFsaWQtc2VydmljZS1maWxlcy1zeXN0ZW0vLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTNhZDFiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2ludmFsaWQtc2VydmljZS1maWxlcy1zeXN0ZW0vLmdpdGlnbm9yZQpAQCAtMCwwICsxIEBACisqLnNlcnZpY2UKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9pbnZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZU5vRXhlYy5zZXJ2aWNlLmluIGIvdGVzdC9kYXRhL2ludmFsaWQtc2VydmljZS1maWxlcy1zeXN0ZW0vb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlTm9FeGVjLnNlcnZpY2UuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg5MjE0ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9pbnZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZU5vRXhlYy5zZXJ2aWNlLmluCkBAIC0wLDAgKzEsNCBAQAorW0QtQlVTIFNlcnZpY2VdCitOYW1lPW9yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZU5vRXhlYworVXNlcj1hbnlyYW5kb211c2VyCisKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9pbnZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZU5vU2VydmljZS5zZXJ2aWNlLmluIGIvdGVzdC9kYXRhL2ludmFsaWQtc2VydmljZS1maWxlcy1zeXN0ZW0vb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlTm9TZXJ2aWNlLnNlcnZpY2UuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzgyMmZmYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9pbnZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZU5vU2VydmljZS5zZXJ2aWNlLmluCkBAIC0wLDAgKzEsNCBAQAorW0QtQlVTIFNlcnZpY2VdCitFeGVjPUBEQlVTX1RFU1RfRVhFQ0AvdGVzdC1zZXJ2aWNlQEVYRUVYVEAKK1VzZXI9YW55cmFuZG9tdXNlcgorCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvaW52YWxpZC1zZXJ2aWNlLWZpbGVzLXN5c3RlbS9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVOb1VzZXIuc2VydmljZS5pbiBiL3Rlc3QvZGF0YS9pbnZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZU5vVXNlci5zZXJ2aWNlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5MWUwMDkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvaW52YWxpZC1zZXJ2aWNlLWZpbGVzLXN5c3RlbS9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVOb1VzZXIuc2VydmljZS5pbgpAQCAtMCwwICsxLDMgQEAKK1tELUJVUyBTZXJ2aWNlXQorTmFtZT1vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVOb1VzZXIKK0V4ZWM9QERCVVNfVEVTVF9FWEVDQC90ZXN0LXNlcnZpY2VARVhFRVhUQApkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3NoYS0xL1JlYWRtZS50eHQgYi90ZXN0L2RhdGEvc2hhLTEvUmVhZG1lLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmNhM2Y5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL3NoYS0xL1JlYWRtZS50eHQKQEAgLTAsMCArMSw4MyBAQAorVGVzdCBzdWl0ZSBmcm9tIGh0dHA6Ly9jc3JjLm5pc3QuZ292L2NyeXB0dmFsL3Nocy5odG1sCisKKwkJCQlTYW1wbGUgVmVjdG9ycyBmb3IgU0hBLTEgVGVzdGluZworCisJVGhpcyBmaWxlIGRlc2NyaWJlcyB0ZXN0cyBhbmQgdmVjdG9ycyB0aGF0IGNhbiBiZSB1c2VkIGluIHZlcmlmeWluZyB0aGUgY29ycmVjdG5lc3Mgb2YgCithbiBTSEEtMSBpbXBsZW1lbnRhdGlvbi4gIEhvd2V2ZXIsIHVzZSBvZiB0aGVzZSB2ZWN0b3JzIGRvZXMgbm90IHRha2UgdGhlIHBsYWNlIG9mIHZhbGlkYXRpb24gCitvYnRhaW5lZCB0aHJvdWdoIHRoZSBDcnlwdG9ncmFwaGljIE1vZHVsZSBWYWxpZGF0aW9uIFByb2dyYW0uCisKKwlUaGVyZSBhcmUgdGhyZWUgYXJlYXMgb2YgdGhlIFNlY3VyZSBIYXNoIFN0YW5kYXJkIGZvciB3aGljaCB0ZXN0IHZlY3RvcnMgYXJlIHN1cHBsaWVkOgorc2hvcnQgbWVzc2FnZXMgb2YgdmFyeWluZyBsZW5ndGgsIHNlbGVjdGVkIGxvbmcgbWVzc2FnZXMsIGFuZCBwc2V1ZG9yYW5kb21seSBnZW5lcmF0ZWQgbWVzc2FnZXMuCitTaW5jZSBpdCBpcyBwb3NzaWJsZSBmb3IgYW4gaW1wbGVtZW50YXRpb24gdG8gY29ycmVjdGx5IGhhbmRsZSB0aGUgaGFzaGluZyBvZiBieXRlLW9yaWVudGVkCittZXNzYWdlcyAoYW5kIG5vdCBtZXNzYWdlcyBvZiBhIG5vbi1ieXRlIGxlbmd0aCksIHRoZSBTSFMgdGVzdHMgZWFjaCBjb21lIGluIHR3byBmbGF2b3JzLiAgRm9yCitib3RoIGJ5dGUgb3JpZW50ZWQgYW5kIGJpdCBvcmllbnRlZCBtZXNzYWdlcywgdGhlIG1lc3NhZ2UgbGVuZ3RocyBhcmUgZ2l2ZW4gaW4gYml0cy4KKworVHlwZSBJIFRlc3Q6IE1lc3NhZ2VzIG9mIFZhcnlpbmcgTGVuZ3RoCisKKwlBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgU0hTIG11c3QgYmUgYWJsZSB0byBjb3JyZWN0bHkgZ2VuZXJhdGUgbWVzc2FnZSBkaWdlc3RzIGZvcgorbWVzc2FnZXMgb2YgYXJiaXRyYXJ5IGxlbmd0aC4gIFRoaXMgZnVuY3Rpb25hbGl0eSBjYW4gYmUgdGVzdGVkIGJ5IHN1cHBseWluZyB0aGUgaW1wbGVtZW50YXRpb24KK3dpdGggMTAyNSBwc2V1ZG9yYW5kb21seSBnZW5lcmF0ZWQgbWVzc2FnZXMgd2l0aCBsZW5ndGhzIGZyb20gMCB0byAxMDI0IGJpdHMgKGZvciBhbiBpbXBsZW1lbnRhdGlvbgordGhhdCBvbmx5IGhhc2hlcyBieXRlLW9yaWVudGVkIGRhdGEgY29ycmVjdGx5LCAxMjkgbWVzc2FnZXMgb2YgbGVuZ3RoIDAsIDgsIDE2LCAyNCwuLi4sMTAyNCBiaXRzCit3aWxsIGJlIHN1cHBsaWVkKS4KKworVHlwZSBJSSBUZXN0OiBTZWxlY3RlZCBMb25nIE1lc3NhZ2VzCisKKwlBZGRpdGlvbmFsIHRlc3Rpbmcgb2YgYW4gaW1wbGVtZW50YXRpb24gY2FuIGJlIHBlcmZvcm1lZCBieSB0ZXN0aW5nIHRoYXQgdGhlIGltcGxlbWVudGF0aW9uCitjYW4gY29ycmVjdGx5IGdlbmVyYXRlIGRpZ2VzdHMgZm9yIGxvbmdlciBtZXNzYWdlcy4gIEEgbGlzdCBvZiAxMDAgbWVzc2FnZXMsIGVhY2ggb2YgbGVuZ3RoID4gMTAyNCwKK2lzIHN1cHBsaWVkLiAgVGhlc2UgY2FuIGJlIHVzZWQgdG8gdmVyaWZ5IHRoZSBoYXNoaW5nIG9mIGxvbmdlciBtZXNzYWdlIGxlbmd0aHMuICBGb3IgYml0IG9yaWVudGVkCit0ZXN0aW5nIHRoZSBtZXNzYWdlcyBhcmUgZnJvbSAxMDI1IHRvIDEwMzQyNSBiaXRzIGxvbmcgKGxlbmd0aD0xMDI1K2kqMTAyNCwgd2hlcmUgMDw9aTwxMDApLiAgRm9yCitieXRlIG9yaWVudGVkIHRlc3RpbmcgdGhlIG1lc3NhZ2VzIGFyZSBmcm9tIDEwMzIgdG8gMTAzNDMyIChsZW5ndGg9MTAzMitpKjEwMjQsIHdoZXJlIDA8PWk8MTAwKS4KKworVHlwZSBJSUkgVGVzdDogUHNldWRvcmFuZG9tbHkgR2VuZXJhdGVkIE1lc3NhZ2VzCisKKwlUaGlzIHRlc3QgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBpbXBsZW1lbnRhdGlvbiBjYW4gY29tcHV0ZSBtZXNzYWdlIGRpZ2VzdHMgZm9yIG1lc3NhZ2VzCit0aGF0IGFyZSBnZW5lcmF0ZWQgdXNpbmcgYSBnaXZlbiBzZWVkLiAgQSBzZXF1ZW5jZSBvZiAxMDAgbWVzc2FnZSBkaWdlc3RzIGlzIGdlbmVyYXRlZCB1c2luZyB0aGlzCitzZWVkLiAgVGhlIGRpZ2VzdHMgYXJlIGdlbmVyYXRlZCBhY2NvcmRpbmcgdG8gdGhlIGZvbGxvd2luZyBwc2V1ZG9jb2RlOgorCitwcm9jZWR1cmUgTW9udGVDYXJsbyhzdHJpbmcgU0VFRCkKK3sKKwlpbnRlZ2VyIGksIGosIGE7CisJc3RyaW5nCU07CisKKwlNIDo9IFNFRUQ7CisJZm9yIGogPSAwIHRvIDk5IGRvIHsKKwkJZm9yIGkgPSAxIHRvIDUwMDAwIGRvIHsKKwkJCWZvciBhID0gMSB0byAoai80KjggKyAyNCkgZG8gTSA6PSBNIHx8IJIwkjsJLyqRMCcgaXMgdGhlIGJpbmFyeSB6ZXJvIGJpdC4gKi8KKwkJCU0gOj0gTSB8fCBpOyAJLyogSGVyZSwgdGhlIHZhbHVlIGZvciCRaZIgaXMgZXhwcmVzc2VkIGFzIGEgMzItYml0IHdvcmQKKwkJCQkJICAgYW5kIGNvbmNhdGVuYXRlZCB3aXRoIJFNki4gVGhlIGZpcnN0IGJpdAorCQkJCQkgICBjb25jYXRlbmF0ZWQgd2l0aCCRTZIgaXMgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IG9mCisJCQkJCSAgIHRoaXMgMzItYml0IHdvcmQuICovCisJCQlNIDo9IFNIQShNKTsKKwkJCX0KKwkJcHJpbnQoTSk7CisJCX0KKwl9CisKK05PVEU6IEluIHRoZSBhYm92ZSBwcm9jZWR1cmUsIHx8IGRlbm90ZXMgY29uY2F0ZW5hdGlvbi4gQWxzbywgTSB8fCBpIGRlbm90ZXMgYXBwZW5kaW5nIHRoZSAzMi1iaXQKK3dvcmQgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZSCRaZIsIGFzIGRlZmluZWQgaW4gc2VjdGlvbiAyIG9mIHRoZSBTSFMuICBXaXRoaW4gdGhlIHByb2NlZHVyZSwgTSBpcyBhIHN0cmluZworb2YgdmFyaWFibGUgbGVuZ3RoLiBUaGUgaW5pdGlhbCBsZW5ndGggb2YgNDE2IGJpdHMgZW5zdXJlcyB0aGF0IHRoZSBsZW5ndGggb2YgTSBuZXZlciBleGNlZWRzIDUxMiBiaXRzCitkdXJpbmcgZXhlY3V0aW9uIG9mIHRoZSBhYm92ZSBwcm9jZWR1cmUsIGFuZCBpdCBlbnN1cmVzIHRoYXQgbWVzc2FnZXMgd2lsbCBiZSBvZiBhIGJ5dGUgbGVuZ3RoLiAgRWFjaAorZWxlbWVudCBwcmludGVkIHNob3VsZCBiZSAxNjAgYml0cyBpbiBsZW5ndGguCisKKworRmlsZSBmb3JtYXRzOgorCitUaGVyZSBhcmUgdHdvIGZpbGVzIGluY2x1ZGVkIGZvciBlYWNoIHRlc3QgdHlwZSAoYml0LW9yaWVudGVkIGFuZCBieXRlLW9yaWVudGVkKS4gIE9uZSBmaWxlIGNvbnRhaW5zCit0aGUgbWVzc2FnZXMgYW5kIHRoZSBvdGhlciBmaWxlIGNvbnRhaW5zIHRoZSBoYXNoZXMuCisKK1RoZSBtZXNzYWdlIGZpbGVzIHByb3ZpZGVkIHVzZSAiY29tcGFjdCBzdHJpbmdzIiB0byBzdG9yZSB0aGUgbWVzc2FnZSB2YWx1ZXMuICBDb21wYWN0IHN0cmluZ3MgYXJlIAordXNlZCB0byByZXByZXNlbnRlZCB0aGUgbWVzc2FnZXMgaW4gYSBjb21wYWN0IGZvcm0uICBBIGNvbXBhY3Qgc3RyaW5nIGhhcyB0aGUgZm9ybQorCXogfHwgYiB8fCBuKDEpIHx8IG4oMikgfHwgLi4uIHx8IG4oeikKK3doZXJlIHo+PTAgdGhhdCByZXByZXNlbnRzIHRoZSBudW1iZXIgb2YgbiwgYiBpcyBlaXRoZXIgMCBvciAxLCBhbmQgZWFjaCBuKGkpIGlzIGEgZGVjaW1hbCBpbnRlZ2VyCityZXByZXNlbnRpbmcgYSBwb3NpdGl2ZSBudW1iZXIuICBUaGUgbGVuZ3RoIG9mIHRoZSBjb21wYWN0IHN0cmluZyBpcyBnaXZlbiBieSB0aGUgc3VtbWF0aW9uIG9mIHRoZSBuKGkpLgorCitUaGUgY29tcGFjdCBzdHJpbmcgaXMgaW50ZXJwcmV0ZWQgYXMgdGhlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBiaXQgc3RyaW5nIGNvbnNpc3Rpbmcgb2YgYiByZXBlYXRlZCBuKDEpIHRpbWVzLAorZm9sbG93ZWQgYnkgMS1iIHJlcGVhdGVkIG4oMikgdGltZXMsIGZvbGxvd2VkIGJ5IGIgcmVwZWF0ZWQgbigzKSB0aW1lcywgYW5kIHNvIG9uLgorCitFeGFtcGxlOgorCU0gPSA1IDEgNyAxMyA1IDEgMgorCXdoZXJlIHogPSA1IGFuZCBiID0gMS4gIFRoZW4gdGhlIGNvbXBhY3Qgc3RyaW5nIE0gcmVwcmVzZW50cyB0aGUgYml0IHN0cmluZworCTExMTExMTEwMDAwMDAwMDAwMDAwMTExMTEwMTEKKwl3aGVyZSAxIGlzIHJlcGVhdGVkIDcgdGltZXMsIDAgaXMgcmVwZWF0ZWQgMTMgdGltZXMsIDEgaXMgcmVwZWF0ZWQgNSB0aW1lcywKKwkwIGlzIHJlcGVhdGVkIDEgdGltZSwgYW5kIDEgaXMgcmVwZWF0ZWQgMiB0aW1lcy4KKwpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3NoYS0xL2JpdC1oYXNoZXMuc2hhMSBiL3Rlc3QvZGF0YS9zaGEtMS9iaXQtaGFzaGVzLnNoYTEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTMwZTkwYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9zaGEtMS9iaXQtaGFzaGVzLnNoYTEKQEAgLTAsMCArMSwxMjM5IEBACisjICBDb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciAiU0hBLTEgVGVzdCIKKyMgIFNIQSB0ZXN0cyBhcmUgY29uZmlndXJlZCBmb3IgQklUIG9yaWVudGVkIGltcGxlbWVudGF0aW9ucworSD5TSFMgVHlwZSAxIEhhc2hlczxICitEPgorREEzOUEzRUU1RTZCNEIwRDMyNTVCRkVGOTU2MDE4OTBBRkQ4MDcwOSBeCis1OUM0NTI2QUEyQ0M1OUY5QTVGNTZCNTU3OUJBNzEwOEU3Q0NCNjFBIF4KKzZFNDJGQjg0MDY3Q0ZGMDU2QzQzQTQ5RTQ4NDk5N0FGMjMxOTA4NzkgXgorQzYzRkJCOUE4NzE3MUExNzZFNkUwNTQ4OTBFMjlBOEM1RjEyNUY2QyBeCiszMTA5RTMzQzFDNEI5QTAxNjlEMTU5OTE2OUQwRTVBNTIwQTFFNzFDIF4KKzkxOTVFMUU3M0NDNjhENzE3MEY0NEJEMUQ4M0NCNjI0QkM4N0ZBMEIgXgorNjRGN0MzNzQ1MjcyNzhDMDQzNkRCQzhERTVBQUJFQzJCQkY2MzRCQyBeCisxNTRCNjIyRUE0MjZGQjE1MUIxRkYxQkUxQ0U4NzE3NTJCOUVERUI0IF4KKzEyQkREMDBGRDQwMzg3NTZDQkNGOEVDREFEMUIwQ0Q4NjI2MDNDRDggXgorNjcwMEY5M0UxNjkxRTgzNzM1Mjc5RTE2N0Y2N0FGNjFGRUU5ODEzQiBeCis4NEFGMjBBMDY3OTlGMzY2NDM1QkEyMEY5OUI5QTEwOTU1QjZEMjc2IF4KK0M2MjJGRTAwM0ZEMTYyMjAzNTdGODhGQzZCOURFNDc4OUU3N0MzMjEgXgorQzhERUE1QTk4REFEQTFGOTY2MkQ1QzE1MDYxODE0MEExNTBFQ0E0NiBeCitGQkI3MTI3RTc3QTM5RDg1NkVDODQ5RDc1NUM4NjhDQTdCOUYxMUU5IF4KK0I3RDhBN0EzOUFCMzNFRDhDM0FGRDhGNzYyMDFCRjA5MDQxNDk0MzcgXgorMTU0NTM1NDYwQTEyQjlFMTAwRTI1MUJCM0E0RDREQkNEODBBMzA5QSBeCis4MkZDNjAyMEM3QTlCNjJGMzM0RjcxNTZBREE2MDg1MzJEQ0E2QTNCIF4KKzlERDk4MEI4MDczQjMyRDIxRTlCMjMyNEY5ODIwMjQzNzVDMjk1MUYgXgorNDE5Rjk3QTk4OTk0ODZEQzUzQzU4Qzc2MUNFQjU2NDMxNEZENDdCRCBeCitBMjEyRTQzRUJGQjMxMzg4RjY0QzBDMEIwQjFDQzcwMTk3MDRCNzQ0IF4KK0Q4RjE2MjNDMTg2QTU2MTVGNThFODQ2QzlEMTY0RjM1QTg5NTZFNDQgXgorQUEzMjg0OERFMTQ5OTM2NTczMEEzNjUwQTNBNzcwM0ZENDA0MjU5QSBeCis3OUJEQjAxRTU1QjYxQThDMUFGQkY2M0QzQ0UyRENDQUI4Q0YzREZCIF4KKzIzQkYzMTY0QTQ0OEE3MjdCQTcxNDU3RUJBOUZDRkFCRkJBQzRGNzAgXgorQkEyNkU4NDZFQkVGNzQzNEI2M0Y1ODYyRkRBMDA1QTFDRUI1NjU2RSBeCis5ODYyMjg2OUE0NzRFQTg1RkU1NzVDRDk3OTM1NDI0ODE0MUExNEE3IF4KKzVDOUU3RTY5NTFEMzg2MjA1NTQyREEwNjgwRTA3RTYwRUM2MUQ2NEUgXgorOEVGMDdBMDJBNzAyM0FBMEU2RUU0QkUxNTE4NjI3QTUyMUQxRjlENSBeCitDREVBMzgyQTVERkRBMUM2MzNGOEJCQzc3RjI5MUY0MEU4ODAxQ0UzIF4KKzNDMEE3MDlGRUY4NUREQkNDMUIzNjJBQTE2MjAxMDQ2MUYzMUFFQ0QgXgorMTBBQkQ2QjhEOTdFNjg4QUY1Q0RBNzk1NUNEM0NDMDg1MEE0QTc1RiBeCiswRUM1MzEzM0Y3RkY5NTVDQTM3RDI1NDkxQjU5MkRGQzAyNTZCRjIzIF4KKzFBNDZBNjdGRUVEMTYwNDUyM0MwNjJBQUNDMjQ1NTIyM0IzNjZEMDUgXgorRkEzREQ3NDlFOEYzRDkwMjlEOTI2MUYyNTE1N0IzQzBFMkRGNjgzNCBeCis0M0RDQUMyQ0YyMEU3Q0NCMURFRDZFMzc5Q0MzMDJGMzAyNjU1RjNCIF4KKzhCQTI1QkRGMzMxNjcxQ0NCNEI2MDk2MUU0QUYzNTYyMjQwMjc4NjIgXgorQUMzQTNFQTBGQjg3MjczMzRBNDQ3OEVEMTY1MTI4NTgxQkJDNUJFQSBeCitDQTQ0MDZBMjMxRUEyQ0EwNkNEMUQ4RjNDNzdGRUY5MTE4QjE1MDFBIF4KKzVCODM0NjVCOEVFRDE0ODcxRkI1MUQ5RTZDRTQ5OUZCMkU0QjQyMDkgXgorOTQ0NUY1MjE4NjE5NDZENDA2M0UwQ0EzRjQxRjU4MDg1NUE3NDU0RSBeCitDMjQxMDE0MDgxODk2MkY5NTUwNkI0MDdBRTg1MTRGMTFGODkyQUVDIF4KK0Y4RjgyNkZFMEQ5M0Y0MTU0MjZBREI2OTU2MjQyMTE2Q0JBQjI0MjYgXgorQzgwM0Y3NTM5QUEwMzZDQkIzMUI3MzUyMzgxMjBGQjg1MTgwRDhDOCBeCisxNjJFQjUxNjM2OTJEOUJDN0I0NTI5RDIxNEJCQjkzMjE1NzM2MUI2IF4KK0Q0QjBEODc2QTE5NTJBREI1RDI3QTFBNkJGNzFCQ0YyMjczMUE0QzUgXgorQ0I1Q0QyNkFBMzlFNDVGMjQ4NzA2NjA0RURCOUEyREI4RURDMUJGNiBeCitGMUFDOTg3RjMwRkYwMzc1RjYxMTVDMENDRDZFMjJEREZEMEZBRkU3IF4KKzY5MkUyMDlEM0E2QTAyMjhFQjk4MjNEQ0I3MzhCMTZCREY5N0E0RTkgXgorRkI5RTFFNzFGNzY0NUVFRUVCM0RERTY2NzE2REM0NDQ0NENENjU3QyBeCitENTFGMDcxRTM2MEQ5NjEyNERBNDlBRDM3RTM3REUxN0I1NjQ5MjBEIF4KKzA2NjdBRkNEQkI4MkI0MjEzNDQ3RDBCMjIwMDZEQzRBMTMyMENEMjEgXgorOEZCRkM2NUZFQjI1NjVGMkZCOEE5OTY2Qjc0NzAyMzUwQzg3Q0Y0MCBeCis4QThCQkNENkFGNzZFNzEwNjdFQjBBRjU0RjkwRUU1QUMyQjU4ODJGIF4KKzhEODMxRUYyMzQ0RTMzNkNDMjcyODEyMjcxODVBMzQzNTZCODU2QTYgXgorREU3QUE3NDI0RjkyQ0JDNTA5NjZGQzRFNkE1NzdGOTg5MDU5OThGQyBeCisxMDY0RUU2QkVGNzA0RjNBNjE4Q0I5QzU4RjI5OUIyMkE0RDM0MjkzIF4KKzk1RjhDRjdFODY0RkVCQkY3N0U0NjA2NzA2M0QwOEQ1MTc1RkM1MDggXgorNzkzODFGMjMwOTcwRjEyMEQxOUIxMTVCRjg2NEM3OTQ4NzhFNzc5NyBeCitEODJBMzBGNDk1Mzg1NjFENUE3RDEzMjRFQ0FEMzIxREQwNUUxMjAyIF4KKzU5MjZDRUVBRTQzRDI5QTdCRTRDMEVEQ0E2MjZDNDNBQkUwMDQxNkEgXgorNTYzNDU4QzlGMkMxNkM1QUY5NjkxNUZDRDkzMDZGMUQ5QkE1NzlDOSBeCitDOTJCMEJENjA0RTQ1RDc0NzlBRTE5RjY0MUIyREIwNjdFNENBNzc0IF4KK0Q2OUQwMTNFRTVDODcxRDNBRTNFMzg4MDkwQkMxQUFGOTg1MkE4M0MgXgorN0MzNDFFQ0RFRTcyOTg2MDU5MzM0NjVFQTlBREJFN0UwNDRDOEE3OSBeCis4M0VDNjg3RDIyQTEzRUREQ0Q0NzBDNTJDNDUyNzZBNkUxNTU0OTgyIF4KKzZEMjc5MjhGMDE0MjY5Q0VDNEU4NzQ1RUI3M0ZBNzE0QkUyREM2MkUgXgorNzVDMEJGMzEyQzA1MjMxREFGN0U5Q0Q0Q0EzM0FDQTc4QkNBQTU5QSBeCiswMTVENzk5QzYwMkRENEUzMEQyQzAxMDRBNTdCMUUyMTRBNDIzRDY2IF4KK0QyRjQzRUNBRDIwRjBCNEM1N0REMDdEM0NFQ0U1NjJCNkI3MkM3RkIgXgorMjc5NDhDRTVBNTZENTcyNDhENERGNjgzREMzRkUwMjNEMkI5QjQzQSBeCisyRDVBOTg0QkYzMkRFMjgyNDI3NDQ0MDY0NjlFMThCN0E1MTc4QTk3IF4KK0ZGQzVDNEVDRjBDQzA1MTMyMEUwNzFEMTRDN0RDQTRBNEREQTMwNUEgXgorQ0VEOEE1NDg3QUQxM0FGMDAwMzEyOTY1OURFMjU1NjE4MzgzNkM1NCBeCis1OTlCQjUwOTg2M0NDNUQyNzU0MTZGNkRCNkM1RDJCRDgyN0RDMzQ3IF4KKzM5ODFEQUM4OTVEREI5Mjk0RDkzM0MxQ0U3ODgyOEUzQTU1OEIxNTIgXgorOTFFQjcxNTkwNDEyM0QzMjZCMjNBQ0Q2ODRERkJENzIwM0NBQkVDQiBeCis1QTlBQzhDMzcwNUFGMTREREU1MEU2Q0YyRkU1QjBDMTVDNEJEMjgyIF4KK0UyNjIwREZCNDJCNUVDQUY4NUY1OTBBNzFERjY5NjkwNkFDNDFDNEQgXgorQ0JBQUREQTdCNURCMzg5QkYxNzc1QUU1MDA0MDA4MUEwNUEwRUU0OCBeCitBQUY4MEQwNzlGM0Y5ODBCRjlENTM2NkM1QjE5OTFBM0UzRDlGRENFIF4KKzJBODYxRjYxNjYwNEM1MjZBQ0IxNTc3MzJEQzQzMUU4MUJDOUExRjYgXgorRkJEQjIyQUEwQjg3NzE4RjQ2NEMwRDFBQTM5Njk1QTFCRENFMDUzRiBeCis0MzMxQkEzMzE1MjJENEY5Q0Q2MTM3ODU4REI5QUExNkFDOTUzMTZFIF4KKzMzRjZCRkUyM0E0QzBFMDRCOEJGNjQyQ0Q5NjQzN0VGMDA1NUFBRjcgXgorMjA0NjEzOEY3ODk5RkRCMjA2M0NEODRCODRFODIxNTI1MTcyQzAzQiBeCitFNEZEQzgxMkM1RjdBMzdGQzdBODEwMDVGMUU3OEJGRjU5NjY2ODg3IF4KKzY0NzdGOTMxQUMyMEIyRkNFMUM5MjE3MUZBNERDRjJEMjY2QjNEQzUgXgorRUQwREQ1MTZGQTdGRTJEQjdBRkNDM0RCRUVEMDg3OUEwQzEwRjFDMiBeCitGQ0VEQTAzMTFDMDg1MzY4QTU3NTFCQ0FEOEVBRUQyMDYzQzJENDBBIF4KKzIzRUIwOEI1MTAwQzhGQkFGN0IzMDQ5ODg3QTExQ0M1MzFCNkNENzggXgorQTZDNDJCNzU3REYwNzhBNjlGRkY2ODE5QThBQkM0NkUxQjA5RjQzNSBeCiswNjE1RUU0ODQwQjFGMUNENjI4NjM2RDFCNEY0NDk1NjM5REVERUJDIF4KK0UyMjg4MTEwMDA3QUU2REJDQ0ZDNzRCNzczNUY0RDk0QjBBQTEwQTEgXgorMTU5RTAxREMzNDhFQjA2N0U5MEE2M0JDNkZFRkJGNEM0NUEwMUY5QSBeCitBMTYyODY0NTlDQzk4OUFFNjYyQzczMUYzRDdEMENENDg3RENDQjNCIF4KKzhGREFGRTJERTM3MjE1RTE0MkUyN0E2NUE4ODFGODBFMDQzMEJGNDkgXgorMUJGOTc4QjU4RDk4RkMxNTczMUY0MTExRTdDN0E0OUY5Q0ZEN0M2NSBeCitDMUY2MUNENEI0REIxNEFBNjBDNjQ0OEMwMzk4RUVDNzIxMDc4MjZDIF4KKzVDRjBBN0Y2RjQ2QTczMENEOTEwM0E1NEYxRUM4QTc1NDlGQTU3ODggXgorRkRDMTA0MjE3OTQwQkU1QTdBRDFDMDJEMTI4QjMxNzQ3Qzk3MkE1QyBeCitERkY1OEJFRjRGRjQxOEQyNkEzNUI1NTIxNUNFNDE5RDM1NzlBMTk0IF4KKzNBMkVGRDQ0NEY0QUE3QTNEQjk3NjVFMDI3Q0U1RDgyQjUxRjY3MzcgXgorRUI2MTZCNkY5N0M1QkZEMDJDMUI5RTRBRkJBOEE1MTUxREQ0MTY3RiBeCis2MkYzMUY5QTI4RDA1ODdCRDgyNTM2MDFBN0VGQjY5OEIwMzIwNUZBIF4KK0U4NzY0NUIyQ0I3REY2NkRBMjc3MUFCRTBDRURBMEY2MjVGQzhBRkEgXgorRTgwMUMzMDcxQ0E2QUVFMjc4QjIyMjc0N0JGQTgxOUMxMThBMkRERCBeCitFQzcwMjIzQkQ5NjNDMTIyRTRGQ0UyOTI4OTM0REREMkQ3NjYxQ0JDIF4KKzgyMjYxRDI2Mzc3QTVBNURDNjlFMEYzOUQwQkJGNTlBMUIyQjIyNDggXgorMkU0REU3ODFFNDQwN0FFNTM2RjcwREM1QTVEQkVCMTc4REJBMkZDMyBeCitBRDNEOTU4Qjg4NENBQTI4RDU4NThEQTEwMzQ2M0MzMDA4NjJERUU2IF4KKzJBNkE1NjNDN0ZFMzMxMjk2MzdGQUJCNEQ0MEY1RjBFRThCNUM1MDAgXgorN0VBNjAwM0E4QkVGNEQ1QkZBNkJGRUZCQ0I2QTVCM0IxQTNCNzk5MSBeCis2RERDNjIwREIxNDg4MjU3NUQ1QkExMjE5Mjg0Q0YxQzMwNjgwOTRGIF4KKzkxQUQ3RTU4OEVDODI5NzM5QzM2MzI2NTZERTE5MTVBQzIzQzhDRjUgXgorMzExQTQ5MUMxQjVEOEEyNkVBMkE3N0EzNkI1RDUzRkRBQkExRkIyQSBeCis5RDRCNzUyQUE4RkRBRjkyODk3QjAzQzRENjVCNjVFQUJCREYwNjJDIF4KK0M1NjlGRjZGMDU5MjY2NEY2OTBCMDA4RUU3QTEyRURBNTc0MEYwQzcgXgorMUFFMzVFOUNEM0QwQThBMTY1QjI3NThFMURDNEY5RDFDRDMwRkJGOSBeCis4MTlBODMzMTg3MDBFQTg2MUNCNjlGNkNEOEVENEVDRDc4Q0MzQ0I3IF4KKzk4MDk5QjU1MEE4MkNFMjJFRkFFNDhCNTkzNUY2MzZENTgxNEZEQjQgXgorQ0ZBREI5OTgxNjdEQjI4OUE3QzE3QkE5NERGN0VEQTAwQjI5MDg1RSBeCiszRjVBOTBBOEY3NTc5MzY5ODc5MzhERkI5NUYxMDIzOUY5MUFDMjY0IF4KKzc0MDIyNjU5MDhFRUE1REExODM0OTBGRUYyRUEyRTU1QzlGQzI4NjIgXgorRUE2RUYwRjcwNTBFREE2Qjc4RjM1NTk3RTg1QjdBODVBRTAwOTdFNCBeCis3M0YyNzgwNTQ4RjdDNzlFMTU5NDVEN0VFMkEzRTAzQjMwREYzNUNBIF4KKzhFQzNDOTNDNzMwN0UxNEU5QzY1RjI2REQ4NDdDRUIxOTVERTI3N0EgXgorQ0ZCQzU3MUEzNUI4MkZCMEI3Q0I1OTc1M0M0RThERTM2QTc1MTE5NSBeCiszQzQ4MDJBOTU2Q0Y5M0ExNDhCOTAzNEZCOEYwNDFFQ0Q4REQ0NTMyIF4KKzVEQTI2OUMxRDVDQ0VFM0M3QTY2RTMxQkQ5RjVFMEI4M0JBMDZDRTEgXgorNzA2RDkwQzAwODAwREI5NzkwQUY2Njc4OEQxQjNEQzgxRTNGRjdBMSBeCis1OUFDODU2NDQ3RkREMjc0MjFDNTJFQTY2RTQ2NUM2NEM1MDMzNzIyIF4KK0VBQ0E5RTgyRDA0M0YyQjZFMTJFNjRDRjAzRDgyRUQ5MkZENkE2NEQgXgorODE2MDc1NUJBMDlDNzRGNzlERThGOTQ5NkJGMEM5MjQ4REI3RDQ1RSBeCis4Q0U0MzkwQzE4NUJERkM4QkM5QzREM0JFQjFBQjc1N0M0NEY2NDM0IF4KKzFBMUFEQjYyOEVCN0I5Q0FBODIxQUU5REU0MTdFMDlBNDJBOTcxMTMgXgorOTdDNEY5MkE0NkVGM0Y5MTY5QTk3N0UxNjQzQzEwNzQ1RUNEQUE0RSBeCis0MDhFNTNDMDNEMTBFMkIzMjIyMkYyQjU0RDExOEFDNEQ2NUE5Mzg2IF4KKzcxMDYyOEU4MTFDMjA3Nzg0RTMyNTVEQTg0MzJDRTZFMTRCNjFGRTcgXgorNEY2REI2MjI3NzhGNEIxQjYyMDNCRDIzOTMxMkQ4NjU4OUYxQjI2MSBeCis4ODhBRDhGQzFDQTVCODkzMjk0RkRCOEZDOTRBQjc3NjIwMThDMUY4IF4KK0FFMzZDMkY1NDIyM0JDMDgyRERBMEQ1MjhCNzBCMkFFQTE5MDc3OUMgXgorNEJEMkJGOTE0MjIzRENEMENCQkNDNDQ0MzIzRkJGMEU0ODdGMjdCNiBeCis3NTI2RDVERjdCMkVDRkFDN0JGRjYyREQ3QTRCNUYzODQ2MzMwNUY4IF4KKzBFRDdDODdCNjhGNTA4MTNBQUQ1RTUwMTU5Q0JFMEJCRjlCRjA1RDIgXgorNEQ1Q0Q0RTQwQTY2Njg4OTNFRUExNUYwMjVFQ0I4MTg3NDc1REY0RiBeCitEMzg0NDZFODQyQzBBOTRGMTc1Qjc3MkJEQzcwN0NEMkVFNzlEMDk4IF4KK0REQTg2OEJDMjkwM0M1NUNGMjczRjQ4RTlCOTJDMDlEOTBDRDAxNzkgXgorMDg0MTI2OEI5NUVDRkFBQjlGRTM3ODdCQTcyNjEyMjdBMUYyMzI5NCBeCitEM0RERjIwQjRDMERCNjY4NDIxREUxRjI0MkI2NUE4QzgzRkE4NjdCIF4KKzExMkYzQ0Y3REFDQTc1Mjc4MTlEMTY3MDRFQjQxMzAyQTRFRTUyQUEgXgorOTYwNzJBM0VBNDQ2M0ExNTZCM0JEOUVBRUMxNkFEQjA5MDUxNjBDOSBeCis3MTVGMTk1RjA5RTNFQUQzRDcwQUU1MURFRjFDOTcwOTUwMEMwQTZBIF4KKzhBMTEyQ0E4MkNGRUI1RjMwMDFCN0EwMDU5MTQ2MkY0MTIwRERDMDIgXgorNTBGQzkxRTkxNTI3MEQxMjAyRjZGQzg3OTJCRTE2RUNCNzNDRTQwNSBeCis5MDc3MzZFQzQ1QkU3QkVEQTFCMTU0RUEyODJDNTFCNTc5NTk5MUY4IF4KKzA1RDQ5NDYyOTkxMjc4NzIwRUI0NEJFQTY1NkFCNDQ0MkM4ODQ1QzMgXgorNkZENTZEMDhBMkQ0NjMwRjcyQUM5N0UzQzk0QTk1NzVGMzA0NjcyOSBeCitERDE4ODMzNzZDRjcxM0M4RDdBRUJGRUM2MEQ1MUZGOEUyQTgwNkU4IF4KK0UwNDU3RkUwMEY5REVFRTk1OERENkFEOTQ4RURGOUNEOTQxMkY3M0EgXgorQkE2NTM4RTkxQjI3NjUwNEM4NEUyMTNCMzI1QjRBNzcwM0U5MjRCNCBeCitDMjBBOUI4NDg1MDM2NTBERTk0NjNCOTk5MkVCOTc3NDIyQkI1M0RGIF4KK0JBNEE1NjVFNUMwRjlGQUM4OUQ1NUEyQjc4NEYyOTFDN0JBRDQyNTUgXgorNjUxMEUwOUFBRDgyODhBQjgxQ0E1NERENTY1NkRGNTdEMEVBQkJFNiBeCiszMzk5NkM5QzVBRDA0ODgzQkNFQjk3NzFBNUM0QTI3MkY4ODU1MEIxIF4KKzdCOTZGM0MxMjcyQUQ3NjVEQkRDMzVBNTkyNDNGNkE4Rjc1RkEzNTEgXgorNUFBNzZCMTZFQTRERkIyNjdEODhGRjdEQkU0RjA1NTE4NEE1NkU1NiBeCiszM0I5Q0NFQjFBNkVEQzhDOTFGNjAzNDI0NUIyRTNBQUM4OThDNjc4IF4KKzcwMUEzMkZDMEIxMTYzQkM1NURCNzZGQTQ2RjY5QjU3NEIzODAzQTAgXgorNUQ2RjQ0QTRCNTE3NUJBODczQkZBMzM2OURDOEJGQjBBRDFBQzI2QyBeCiswNzI3RjEyRDhFNTU0RURDQjQzNUFFM0JENjQyNUIxOTdERjZFRTJFIF4KKzZFMUY0NkRDNEZBRDY3MTc1OUFDOTY5OTk4Njk0QkQ3OTMyNjI0NkUgXgorODUyMzNGOUNGRDA3ODBCRDYwMjQwQTIyRTAzN0MxNEVCODI4NkMzMyBeCitCNjZDQzczMzIzNDFGQTkyNjFEOTYzNjJGMEJCRDdCNjc2Rjk1RTAyIF4KKzc4MkE3OEYyRkMzMkUwQjYyNzcwMkM1NDEzNDFFRDI4QjAwOUJCNkYgXgorNkI3OTM1MjY1QzUyOTg4MERBNUIxNjZFREQ2NjBCQUUxNEE3NzBBOSBeCis0OUMyOThCMUMxMEQzODBCQUNFMjZFOTA3QzIxM0M5MDA1MkQ3NTIzIF4KKzQ5Q0U0RDRGRjlGRkY2NzI0REEwMzJGRjMzRjhDNUE3NzkyRDI0RTIgXgorQ0QyQzRGMTlDMTJCMDg2QzA3MUJCNkIyMEU4RTgyMTBBRkREMkQ1MCBeCiszOTcxMEY3N0JFNTY0QzQxN0M4MENCNkU0Qjg3QkU3MkZBODA1QTQwIF4KK0Y3NEE2QTQ1RjVCMjk3OUI1RTc3MzAwN0I5MDgwNEYzMjJGMTNBRDggXgorNkZENkEzNDMzOTA0N0NGMTNGNzc3QzRCN0Q5RTI4N0Y0OTlGQjE5QyBeCitGREIwNEYwNEQzQjM2NEE2OTUzQzM0MUUzNDNFMzEwRjIzODNBNjU1IF4KKzk4MUU4NzE3NTM4Q0U5ODk5OEU5NTBFQUQyODU5NkI1Mjc3MzY4NDEgXgorRTA5OTk4N0RCMENDNjFDRjYwN0M5ODUyMzM2Q0RBRjQ3OERFRTMzRiBeCitFOUM0MkYyNUEzRTM1NDJEMTUxMEREMDlCRjUxNkFEODA5RDQyNzAyIF4KK0Y3RTU4MEZCMjFDNzI1Q0JFQTU2M0IxOTM4OTY4NjJCOUJFRjdGMjQgXgorRDc3OEEzMjg3RjY4RjQ3QjBBQTQyMTQxMDI5MkQ0NzgwNTk5N0E5NCBeCis1MzRERkU3NTk3MzU3MjM2NDlFREM4OUJDQjA2M0MwQ0NGRUVDMzRGIF4KKzkzODFGQjVCRDI2Njc3QTc3NjBGQzAyODg1MzI3NTUwNjI5ODZERjEgXgorMjdFOTdFRTgyOTgyMDM5OTU5NURBMEEwMDQ3Qjc0RDNDNEUwREJGMSBeCitEMzg0NTAwNzFEMUIwNzlBOUZENTE4RDJGMzE3QzgzQzMzMDk0RjQzIF4KKzAyMjFCOEU0RDJGQTY2RDJFQkUxQjA0RTY3OTY2MkNFNDE0MDVFNDggXgorQjlCQzRGREM0QTVDRTAwRUZCOTExQzMwNjJENkYzMzMwNDcwMUMyOCBeCis0NjFCNDIwNjYxOEI3NjZDODlFNkQ5QUIyRjhEQjA3OTAzODYwMjM0IF4KKzEyMkE5MzA2QjEwMkYyQzUwQjczNjRFMUQyNEZFQ0IwNjYyRTI5NTggXgorNjFFOTFGNUQxNjcwNjZFQzkwNDEzNEFCMUM0RjlEMTE2QzlEM0U4MCBeCis2Qjc1NThCRDhGNEQzQzU5MTRBOUFCNUQ3NDE4RjdEQjc3NTgzQjU1IF4KK0NFNDhFQTk0ODQzODU0NTU1REM0OEQyNEQzMjQwNURBQjlEQkE2MTIgXgorNUE3MjJBQUM1NzZGNDA3OEMwMDFEMDZEQTkxQzI4MTMxQTRGOTJDNSBeCis5QjhGRTBGMUU2NTczQ0M2ODMyQkE2OURFQzlGNkU2NDYyMjhBMzc0IF4KK0Y5ODQyOUNBMjc5OUU1Q0FBRURERkIxNjhCNzgyQTU0Mzg0RUYwQTggXgorMTQyODc3NzU0QUI5NUY1N0FBNTQxQ0I5NzhCQTQwMEU4MTJBRUNDOSBeCis2RDg0RDA1M0NDRDlFNjhDQUM1NzgwODkyNDA5RjYxQjM5RERGRDQ4IF4KK0I1OENDOUNFMEFFM0RBQUEwMkUzQzA0MDEwMEQ0QjU2OEQyOUUwRkEgXgorMTdGQjE4RkEzMkE4MjM3RDMyQ0Y4M0E5NjY0QjFCMkU0MERDNUIxMSBeCitDN0Y2NUU1NEU2MDhDRUYxQzdBMTIwQkU4QTI5RkE2Qzk0QjY4MEQyIF4KKzlDNDYzMjlCQTM0MDc3Mzk0QjQzOUM1NDc2QjkxRDlERjAxOUJBNzYgXgorMzYxMkIzODFCODBBMURGNkRBNzVBQjI2NTZCRDVCQThERTY5OTZCNSBeCitFREQ5QkNBMUM0MzEyMDBEMzIzNEMwOTk3OTFDODFEODYwNTA5MUFCIF4KK0MxOTUxRERFQ0I5Nzk2QzBEMzlFRDlBRkNDQkI2NTIwMEFFQUIwQ0IgXgorNTVFNEY3ODQ2RDlCOTBEOEIzMUVBQTVCOTM3MUQzOTU1OTBCNjUyOCBeCis1RDQwQjQzMkFEQkRGM0EwMTM1NUZGRkREQkE0NzU4NkIzREM3QzUyIF4KK0FGNUM2NzVEMjI0OUY0Q0QyMEU3MERDOUUxOEI4OEQzQUNGQkQ2QkYgXgorQjBFQjY3OTZBMjE4NzZGQUFGNTBGQ0RCQTJFQjEyMUM0Qjc0MjE2NiBeCiszQzU3N0M3MEI3NjgxMERERjlBRDU3OTkxMDM0NzMxMkI4ODFDMzBGIF4KKzBDMTY4OTdEMjBDNUYzNTJGQTYxMTBDNzBGOUE4QzMzQ0EzNUNBMjEgXgorREJFMEI0MzQxNTI2MDYwQzVCMzc1NzZGNkI5NzJBMUVCODk1NDA1OSBeCisxNTY3QjEwRTMzRkJCRTIwMDMzRjVBNTJFQjgxMDM0OEVEMTU0RjE5IF4KK0MxRTQ3Mjg5NDEyRDNBQ0MyMDg2MjBBMUVBNjc2Q0UyODE1REQ0RkIgXgorQUJDMjI3RUZGRENFMzc1ODA2MUM3Nzk3MTg2MDI0N0U4NTAzODJBRCBeCitCMjlFQUNFQzkwM0JCOEFGN0NDMUE2MzUxNjE2MzY0MEZGRTYyODIyIF4KKzVDODk3NkExQTRGQ0M2QjZGQUI1RUU2MzFFM0NEQzU2MUVENUZCMTAgXgorMUExRUE1MTA3Q0M0NkJFOTA5REY4MTY1QzNFRkVFODY3NjE2MTk5MSBeCisyNjhFODZCQTNBODFGQUREQjIwRjc0REQ0NEM1QkM3MUE5OEMzRDA4IF4KKzA1MDU3RTVFNzkzNEFDOUE5MTQxRDM5QjhENEY1RUE2QUExNEY3NEYgXgorQzAzRUE3MkM0RDY4OTQ1NzI2REY2MzgwMzU2NEU0MzQ0MjYzMDJCQSBeCis1NEFGMjBCRkJGRUFENkJCMkRENjhFNjVEMzlENDI3REY3RTE3RkQ5IF4KK0ZERTkzOERCMDg0M0E4NDREQzBGNjYwMTQ5N0EzOUFDRjE2N0Q2REQgXgorRUQwMjkyRDBCRDg2OUI2NkU4MDAxNDgyNEEzRDc4ODZDRDZEMzU5MCBeCis3NDlCNjk5NjRGNUMwRDlEMDJCRjVDRjkwM0IyRTU2RDA5Q0YxQjlDIF4KKzZCMTQzRDMwMzY2QzQ1RjE1OUI4M0E4RDFBRThBQUVDODhFNDQxMzYgXgorMDExNjlENjVFNzEwMTQ5NDZEMEJGNjRCRjQzOTA2ODk3OEFBNUIzQSBeCis0QzM2RTBBOEMxOUMwQUE2QzgwREYwNjExQkEzNDA0QzEwMjVFOUNDIF4KK0E0REE5RUVDMkY2ODJBRjVCMkVFN0NDODUyNUVCMDdERjY2RTU5NDUgXgorRjEzNDlBRDAxMjREMTE2MTNDRkE0NkQ0OTg2NzE0ODRFNUYzNzc5MCBeCis2QThFODJEMkQyN0QzRURENkU4QjExOUY3NDY3NjFCOEZFODMxODJBIF4KKzUyRTdDN0M0QUUwMjY1OTk1MzA3OURBRTIwRjQ0MjM1M0VFMkJCMjkgXgorNDlDOEQ4MjI3MjQyNzRCODVERTYyRDlERjU4NkZFODgwQUYzOTZFNiBeCis1Nzg2NkMwQkI5NzZCNEY4QUFBN0FDRjNDOUEwRjcwMEU3MzIxNkRBIF4KKzU0MUE2NzVERDM3QzVENkYyQ0YyNDIxNjNBNUNGNkI3MjhERjk5OTUgXgorNTVCMjZEOTM0NEQ0RDY0NENCQjY5QzQ3ODk0NzM1NDMyNjJFOEI5MSBeCiszQThGM0YwQTk2Mjk3MDIwRUVBNTgzRTlBMjgwRDUzRTAyNDhERTI2IF4KK0QxRkY3QTBDRDBCNjlBNzZCNUI4MEQyQkI1NzM2Qjg0NDBEQTdGN0IgXgorNTNFNzE1RkEzOUQzNzMyRjM4RkI0NzQ4RDQ2NDA5RDk5OEQ2Nzk3MyBeCiszNzc3ODFBQkI0QUI0RTk3NEI5QzE2NzA4NjdFNzRGODdBQjQ5NTBBIF4KKzhFN0RBOTY5NzEyNjVBQ0MwRkY3QzM4MTEyN0M5NjZERjlGOUYxM0EgXgorMjgwMzg3MTNBMzNBQ0FBQzczMEZCNEREQzNBNzA3ODg2RTU5OERENSBeCis1RjZCRDQ0RDA3QTFDODExRDVCNzU2NjFBNjFCQjY5QTgxNDQ0RUUyIF4KK0Q0NjVFNkM3NjdCRDAyRDQ1N0Q2MDE3NjVERDBGRTU1MjFCQTJBQzcgXgorNDg3RDlFMDI5MTIwMDRFOTYxOTY4RjM4N0MyMUE2NUEwRTY1M0FFNyBeCisxRjU0REYwMDA1MkIzNzQwMzAxQzQzNDIwQ0MyQ0I4NUIyNzcwMDk1IF4KKzdDNUJCNjc4MDgzODY4RUI4MTdFNjE2QkQwOTQyMUI5MTAwMjE2NDkgXgorNEQzMTUyNkU0RTJGRTNCRDZERDRCM0Y1OURDMkVFMkE1MkE5RkI0MiBeCis2NjlGOUZBOUQ3MUZCOTJENTFBREUxNUM3MDc0MkZCMzFCMDEzOTAxIF4KKzM4RDFFNzRGRTI2QUE0M0Q0NURBQkMxNjBERUZGMTEzQjc3NDAyMTEgXgorMzcyNEVGNTBDREVBRUI4NTYxMjNCRUJCMTkwRjM4ODM0NDYxNjY0RCBeCitFMjYzNDExMkQyOTc3QTE3OUQ0QzlBRjM1RjIyMEQzQTYyNkFBMDRDIF4KK0YxNENGODEzM0ZGNjZBM0UyMEQyNUU1RENGRjcwNjA1RjZCOEEwQkMgXgorODA5RTA0QTM4MzQwRDAxMEI3OEI1Mjg3QzhGREQyMEMzOTFGQjYxQiBeCitFNTM0OUQ0RDZFQzMxRTJDRjQxMDAxREZDNDQwQURGRjZEMjVCNEY3IF4KKzEzOUYyNUZEQzM0NEVDMjQ1NkY2RTRERDk5MzhGNjU2OTNGMENCMkQgXgorN0M2MjhCMDk1NEQ0MzQwQjA4NTFDODlGMTEwNjU4OUM1QzY0NjVDNiBeCitFNjVFNjVENzA1MDI1OEI2QjZCNUIzNTg2Njg0MEI1QUNFMERCRjBEIF4KKzc3RDMzQjg3RTBDMTM1MjlEM0FBQzRENjYwNjIxM0VGRTgxRkYzOTggXgorNUJBNDU2QkE0OUFCRTUwQkJDQjc3MkZBQUNCNzFENEYzQUVDQkQ0NSBeCis4MDFBMjFGN0FCNzM1ODVBRTM1MzEwNThEQjk1MTJCRDY5QkE1Q0IxIF4KKzE5MkFDNEQ1MjEwRUM4NjM2MDRGQzFCQTM4OEFFQTg0NTVENDE3NUQgXgorRkQ5RjEwM0VERkM0Q0M5RjlDNDI0MjY2RUU1NEE3OUMxQzk4N0Y5RSBeCiszNjFBQzQ2RDk2QTY5REQ2RTQxNkQ0NTYzRDdDNjlEM0I0ODdFRkMxIF4KKzNBNzYyOTA0NUMwMTkzRkUwODkyOEY3RDQxQjgwMTgyNzU5MzExNkIgXgorNTQ1QjJGNUZEMDE1RjgxQkRFMURBRkFGQ0ExODREMjU1OTA1NjBDOSBeCitGRUYyQzUwREEzMzYyMTIwNjQ1MEUyMUQ5Mjk1MUIyNTM4NTk5MUEzIF4KKzkxM0E0MTdBQzFFQ0UwODk1MkE2MEUwMDM1RjcwOTkzRjE2MUVGMDUgXgorNEZGQzk1NDgxRjZGNjI1QjFCOEU2N0IxMzNGMTE2MTlDRTVDMTQ2MCBeCis1RDZEMDc2NUIxNTZGRTAyODc4MDMzMUI2QTUzRjg0REZCMTMwRjBBIF4KKzJDNUVDODlGMTAxOEQzNEFCMTFFMENCNkZEQzgxMkY4MjQ3MEIxNjggXgorMzRENjJDREZGOTU1MjMzRkU3QTUzMDg5MjVDMjRDQkNEQzA1NzlCOCBeCisxMTQ4OTk0RDMwRjgwQzU2ODlEN0JCMTlDRkJFMzM1NDY4NzJCNEZDIF4KKzA3NEZDQTIyQThBNjNGNDQ2QzhEMTk2NjEyRjdDODEyQzIyQ0NEOEIgXgorMjI4RkUyOUZEMTM5MjhEOEZGMEI4NTBFNTBEQjQxREI0MDZFRkNCQiBeCitFRkY3QkJGOEYyRjdERjM2QUQ1MUVGM0Q3NDhBQUI4RDhEQUI3QjdEIF4KK0MzQUVBNkFBMTc5NzFDMEExNDNBQ0U1NEE4Q0Y1MTVGOUVFQjBCRDYgXgorNEMzQTk4MEU0MDYwMkQ0NjIxQzJBRjFCRUIxQ0FFMjdERjE5QUQzMiBeCitFNUNFMkE0MUM3MjIyOUQ1ODRFNDBGQkE2N0M2OTdFRkEwOEY0NTFEIF4KKzY0QTUzNjgyNjQ5NTlDNzNGQjBBMTJGODVENEZBMTZGOEUyNUZGMDggXgorOEZCNzcwQUVDMTY1QTkzQTZEOTlBMERDNTJGMzg0NDRFMDMxMzA3MyBeCitCQ0ZGM0M1RTVDNTY4NzZBM0REOEM0QzkwRDRFODE5QjY3RDcxMzk0IF4KKzBFRjIwNTIzNzU3RTI1NjExQzQ5QzFGMjU5RDk0MzgxQjA4RkI5MEEgXgorNUQ5RjA1REFCOTFDNDZBRERDRTRCMTYzQzZGQ0RGQjUyMzBCREZGQSBeCisxMUIzQkRDNUYzQkUwOTE0OERBMDdDRDQyRUM5QzI4QzcxOEQ2QTVCIF4KKzFFQUQ3NkVGMTg4NDBCMzE3NjI5NkZBNTc3OTFEODMyQjdFNDAzNUMgXgorQUY4RUJDQkJERjVCOENGQzIwM0ZCRDg2NDRCMTU0NDQ1NjkwQjAyRSBeCiswQTE1NkRBRDM1QTEwQUE3RTQxQzVDQjNCMzA0M0EwNTFCNzE4MEI2IF4KKzlCM0U1Rjc5N0JBMjQ2RTVERTY2MEI5QTM2RTUyQzIwNEJBQ0U4MjIgXgorNzg3ODAzNTlDRDI0QTJCNzE1N0ZENkQ1NUNERkE2RjlERTE0OUZGNSBeCitGMkRBREFCNDI3NTYzM0Y3RUNERkE5NzFEODI0QTMxQjFDOEQ2NjQzIF4KK0VBNjhCQThGMTZEODM2OEU2NjczQTVDNUFFRTg2QkE1QzM2RjJEOTcgXgorNzg4QUE5NDUxMTk2RTJCREQwMzFFNzQ3QjA5OEQ3M0JFMTEzQzA5MyBeCisxOEZFMjU5QjM1NzNGNTJGMjNEQUQzM0YwNUQ5QzkxOTQyQjUxNkREIF4KKzBFNDc4N0Y0NkFFOEQ1RDdDQzk1ODlCNzZEMDBENjA5ODMwNzlENzUgXgorMTQ4RTRGREYwMzFDQUZCNzI2MDk5RENEMUVCNTkxQkMyRjI0RDE3OSBeCiszOTgxREY4NjU4QUMyRkE1QzMxNTFBNDI0MjYyMzI0RDQxOTQwREJBIF4KKzNDNTBBMzgwMDYzNkVGODc3RDg5MDU5RjY2Q0Q2OTdBOURGNDRCRDEgXgorRDlCQUIwNDcxRTJEQjk3RkQ1RjNBNDI4ODRERkM3MDg3NjhGNjJGOSBeCis1MkREMTA2MzMyNkUyNTUwQjZFRjQwRDVFRTRFMUFENjdDN0JCNkJBIF4KKzEzQ0EyNzgyNzEyN0M2OTg4MTBBRUNBMTU4RENBQTc4OTRGMEM5MTIgXgorMDg2QkRCMTdFQzFCOENBQzY4MDMwQTU2RkJENEM3NDFENEY5NURCQSBeCitGN0YzODlCQzVFRDIyNUJENjM5OUNDNDNFRjIyQUZENzdFODk1RDA2IF4KKzY3RjE3M0FEM0EyNEMyNkU5NUUyRUE4QjM3RkMwMjU5QjFERTk1NUMgXgorQTdGMzQ4QTNCNkY2N0NDRjdDN0M2OUVEMDY1QjNGQkZBODMyQThBMiBeCitFQ0VDQkIyNTM1NDQ2OEZCNjJBQzg3RDVDRUI2ODhFNEE2NzFEQzQyIF4KKzYyMzMwQkM0MDAxMDhERkFGRjI5OEVGQjc2QkRDMjhDREMxNTNBQzEgXgorQkIwRUNGOUNCM0NFNDQ4QjRFQTlDNTdDRjVGMUY5OTdGODEwODJCNCBeCisxMkM5NzQxNjcyQ0U4REJBMTRDQzY2QUYzMzM4QjYxRTIzNEY5RTY4IF4KK0RCNENCNTk2MUEyRkY2OTY0Q0VERUNBRUQzREEwM0QxNDAxMTJFQTQgXgorNDVFNEQyQkUzRDk3MjlCRTlGNjlBREIyNDVBNUE5Q0M3NTA2NDUzNCBeCitFMzUyNTM1NTBDODRCRUZDMjZDMkU5N0YwQzIzNkNGRjFEODVDMzZGIF4KKzdENkQ5NTBBMTY4MTA3NzAyQ0UzQjZCQ0VGOTI5OEY5QzhGQzhGM0MgXgorODEyRjQ1OUFCNTg4NzM2NEQxRjJBOUEwMENCRUU1RkMzNTJDMzlBMiBeCis3RUUyN0YzM0M1OUI2OEMzNDYwNDQxNkQzODYwNkJEM0Y1Q0I2QjA2IF4KK0Q1N0UyQTRGMTVERjVDNTBGMjQ4NTkwOUVFMzE0OTczNUM2REZCODQgXgorM0QxMkQ4OEI2MUVGMDk3MjgwOEQ4Q0FENDFEOEExNkFBN0VDQ0M4NyBeCitDRjlBN0NFQTlCMTA1QURBQjZCQkEzQ0ZCNkQwOTBCNzY2MDNGN0NFIF4KKzFENDNDQTE2NENBRDBCNjE2QkU1NzYzRDdGNUVBODgzNTU5NTNGNEIgXgorMzYwMEYwODVBNTNGQjAxMTVDMjZEQTkwRDExODBGRDM0RUVCNjMwMSBeCitFOUY5QzA4OEMzMEEzN0U2Q0RGMDY3RjcyNEJFNkM0Nzg2RjI3QzlFIF4KKzJCQjg2QjQ3RUEzNDQwMEQ0MzRGOEY0Rjk0ODMwQ0JEQTlENEU1NzMgXgorMzI1NUE3RDlBN0EwQjU2RDBEOUM2NjVFQzEzRjdBOEM4RjA1REE3QiBeCis0NTM1OTc1MDBBN0Q1QkVDOENGQjk1MDkyNkEyQkZDMEY5MkUxNDlCIF4KK0ExNUVDNDUyNDc2ODcwQUM0NTlCOTQyRjZBNkI3MzgyMkEwNzg5OUMgXgorNUIxODIxQkZBRjkxN0JBQjNEQjEyODRBMUQxRkQ0MEVBMDExQkNCQyBeCis4RERDMjVDN0NBMzMwQTE4Q0YzOTgyN0I3Q0JFQzAwQjg3NEFGMTkzIF4KKzI4MzgzMkY0NUJCNUU2OTY0OUZDMTBERDYwN0JBRjhCQUQ2MTc4M0UgXgorRjM5NDI2RjlDMDQ3NDU5NkIwMjUxRjBDQkI1RjkyMzg1RDg2MkQyNCBeCis3MTRFMzJERDVCQjhGQ0M3NUIxMDEzRTZGMUY1NkY5NkQ5N0IzNkYyIF4KKzk4OEFDNDU5MkQ1MDExM0IxM0Y2RURCNUMxMTNBMjJFNEQwRjUxOEUgXgorOTNCRjE0NjM3ODhCN0Y0QTRBMDZBRDRDMTc0ODJEQzI2MDc5N0EzRiBeCis1NTMyNTM1QUNDOEFDNTY2ODk3N0IyQTJGMzIyQjIzQUVCNDQzREIyIF4KKzg1Q0M3QUYwOTI5RjIwNkZBNDRGQ0FBQ0RDMjRDNEU3ODM0NUJEODAgXgorMzkyMTk2RTNGMkY0MDc0RDFENDg1QTUyMTE5MDEyRDhDMDU3NDBCNiBeCiszQkE4OEI5MUYxRUExOEU3MTIyOTIzMDFGQkJDMzc1RTlCNDhCRkM2IF4KKzNEQUFEMURBQjE3OTVGMkMxQzhDNUNGNTMwNUI1NDlBQkZCODUzOTggXgorNkVDOTNBRkEzQUI2MTc3MDgyNzZFOTkwNjZGREMzMzFDODRGMDI4RCBeCitDREEyMTkzMDNCOTFBRjNDM0ZCRDBCOTI2NzU4OTE0OTg0QUQ3QzhEIF4KKzU5OUNFMjQ3NDVFQjU0MDg1NTQwNzczNTRCRDEwQTY1RjZCQzMwMzcgXgorMDc5OEMxQjUzRjk0OUQ2NDNGN0JENjZDMTk0NzE1RTdDQUZDNkUxOSBeCitBMTcyMzBGMTY0RTk4QUI4M0FDMTE0MTczMEIyMzM4OUYwRUI0NzNEIF4KKzJDMkI5NTE3M0YxQjA2MTY1RTE3RUFFMzZBNTNDN0FCNjQxMjY3QzMgXgorQTdGNDA4RUY0NDlEQzkyOTYxNjE3RDRDNTFCNTVBRTRFNDUzNkU5NyBeCisyMjY2QzUxMzNCNkQ2QjA4QTA5ODk3QUVGQTM1NUM3NjhGNzE4QzZDIF4KKzM0M0YxMEVFNkVCMzRERjAwNUU3NDlEMUM0QTk4RjY0NTM3MjcyQjEgXgorOTBFRUI3NkIxMjZFNjMyMzA4Rjg2NTVGRDQ5QzUyMDAwMDI3QUE0OCBeCitDN0VBM0M3RDRBQThEQ0JFOTU4MEM0NDM0MDc1MDE3OTM0MjY4NDE5IF4KKzQ1NUQ0RTdDOTg4MzU2QTU2NTg4QzQwMzEzRDI4RTQyNUFFMjE5RjkgXgorNUMwRjMwOTA5OTIxMzhEMzRCNEUzMzAyOUNGODNBNjRFRDhBQjAzRCBeCitDQjNDNTI4ODgzOUQ2RkU3OUVCMkU1MEQzQUMzNEJCQzRBOTQyRTQ2IF4KK0U2MDU4NDIyMDUwNzlEODNCREQ0ODlEQ0Y2RjhBMkQxRUUwNzRDNjAgXgorQUJDQkVDNTZFQTIwQjZCMzY5Qzg1QTkzMUIyMjAxRkVDQjgyNkY0QSBeCis0ODBDMUNCOTdDMzQxOURBNjEwRDk3ODNFNjA0N0U2QzlBNjEwMUE0IF4KKzg3NDgxODQ2NERBMTc1M0QzQUVEREI3RDNCNDZFMkQwNDYxNEQ3RTYgXgorQzk1QjY1RTNBMzdFRDRBMkZFMkIyN0EyRDUyQkYxQkZEMzA3RUQyMCBeCis1RTE4OEE0RjYyNUMwNTQ4MkJGMTYxQzQ1RjUwOTQ4NDRDRTcwNDYxIF4KKzZCMkVCQ0ZFNzRFMEJGMzI0ODBENEJDRjlBNTY5OEE1MjdBRUJFQUQgXgorQUJEM0UyOEEyQTUyOEI3OTYzRUE4RDg4OTY2NTFBMTczMzczMDREOSBeCitCODczRkRFMkMzMTJDMjI3OUVDODk1MEVDMkMyRTlERjk5MEYwMDZGIF4KKzRGMUExODcxNDY4OUJEQjc2NkFGNjg2NjIzQkVGMDhEQUZERkUxRjUgXgorQkE4ODY3OTNBODlFN0VDNjI2OTJBODY5MDE2NEJGMDcyRUFGN0FBNCBeCitBMTVDOEREQUEwNDQ4REU3QjM2MTU1MkZDNTFBRjBENzJDMDczN0ZBIF4KKzZGQjUxNkNCQjRDQ0U5NjgxQzQ0RUZBQkFCQzdBMjZDNzlDNzlDQjUgXgorQzZEQTg5RDNGN0VDNEQyRkNEQjM2NDMyMDQyQTc4RUFDOUYwNERDNiBeCisyQTk0QTkwMjNGN0Q1NERCMjZDOEMyQTZBNEM5NTExMjY3MTJDMkU1IF4KK0IwRjExNUI4QkYwQTE0NjRBMzc4NDIwQTFGMUY1NzRBQTE4NjlGQzggXgorQTNDMTc5NEY1OEZGREMzNjFCQ0FENDc3OUI1REVGNDhFMDJBQkQxQSBeCisyREJBNUQ4MEM0QjE3MTY3RTcxNUE4MDEyODc2MDk1NTc3MDMwRDVDIF4KKzA2MkMzQ0I3QTA1OTc2NjEyNUIzNjhBRDZDMTlCRThGQUE5ODE5NTAgXgorRUNFQTk2RUI2MjM5MTlERjRFMjJGQjEwNjYxNkVGMUZCMkFDRjVBRiBeCitDMENENUU1NTU4NjFGRkJDQjJGRjQwNDVBNDZDRTMwQUU2Q0ExNzU4IF4KK0EwMTUwRDkzMTk4MEUxRDgyQTIxOTI4ODM3RjdFOUUxOThFNUQxQjkgXgorQkY4NzdCMjAyODEyMTg0Q0E3NERFNjFGRTM0REI5NUJBMkFDNUQwQiBeCitDODYzQTBEMjIzMkU5MDE5MjA3NTJGMkFGOTJDMjAxRkM3MzYwOUI1IF4KK0M1NEU2NzYyMDlEODFDRkVEMkU3RUNFQTZGN0UzNUE1NDU5QTU4QUUgXgorQ0JGMzc2RTg1NzFGODE3OTJBQUM0OUJBN0UxRDdGNDE3MTNBQ0RDRSBeCis5Q0QyNDhDMDdFRUY2MzAzQzcxOTAxQUM0ODRGMzA3ODhEOTI2OUY5IF4KK0FFQTQxQzVCMjI2MEUwREM1NzA5NEM1RTFGODBBNzBCODVFNzlFNzcgXgorQjEwMTZGMjZFMzI2MjRDNTMyODU2NkIyNDMzMjlBMkY3NUEzNkQwNiBeCiszRURFMTE4RjdFMjc2NENDNDlGQkMzODczNTA4RDM4QTJDNkE0NTkyIF4KKzAzREYwQzg4MkZFRUQ3MkY4MUIzMDM0MTQxNzg5NzZBQkQwODlFRUYgXgorMkE4RTM2QjZBNTQ1RDFBQkU3QjAyRDZEREQ3ODJBRTAzMkY3RUQ0MSBeCitEOTA1ODhFNjA2RkJERjNDQzYwMzA3NTZERjkyRkIzNzI5NDQxRTZGIF4KK0JDQzQxMzEzM0I2RDg0NjIxQjQ4MkE3RDIxNjNFQTk1NUFDNzMzQkYgXgorQkUxRjM2RDM0REVDNTQzMDZFRjIwRDgzMjZGRjYwM0E3MTZGNDMzMSBeCitBMkJBRTQxRUEwMUU4QUU5RDU5RjVFOEU2NjNEMjJDOUY0MTRCMEY2IF4KK0QyMjk1RkUyNjIwNkRFOUVEMTY5RkVBNDg3QjE5OEU3Q0EwREU3OEIgXgorMDZCMTMxMzBERDEwQzk0QTI0Q0I1MERFNkE2MTI4NjdGODVFMTdGQSBeCisyQ0Y0QzRGMkYyNzBBRjYzRDcwMzU5MDMyMzFDRjdFNzE4MEU2NkU1IF4KKzBBOUVFMzI5M0EyQzlCMkFDQzJGOUI5OUJGMTdBQUM2MTgzNDc4NTcgXgorQzMzOEYxNEMxNTZEODc3N0VDRkMzNkFERjE4NTBCNjRFRTlFNjE3OSBeCitFOUJDNkRBMzVBRUIxQ0MzOTk3MzNDRDBBRDNCMjJFNEUyQzgzRTkyIF4KKzdBNDJGODIwMjEwMTU4QUQzMzkzNUNCNzdENzhDMjhGOUZFN0E5NDAgXgorRUNERUZBNzgxN0E0MzZFNDNDM0RGQTM1MDY5Rjg3OTQ4MTgxQTU4QSBeCis3NjFFQkYzMzZGMTIyOUJGODA3MDJDOUM3Nzk4REFDMzdBQ0YzMDg2IF4KKzE5NzVCNzE2ODgwQjQ5QkEwODYzMTM2NzM2OTQyRTY4OEM5RUVDN0MgXgorQTQyMzJDMzIyN0RCQjkxNTgxQjg2RkFCQjFDNUFCMEEyOTgwMURGQyBeCis0OTk0N0FGMUQ5NDg4RjE0NkJFNEM3Nzc4MkNCMkZDRjZFQjEzRkM5IF4KK0EzNDAyQUUxN0RCOUU2RUM4OTlCMEUxNTk3MzA3M0NGOTQwNEEyREYgXgorRENBRkMyREM1QkFCMzg2MjlERkEwREUxNDU0QzMwMEU1QjlBMkQ2NiBeCitBN0Y5MTVGNzQ1RTMwRTRDRjZBRkZBQkYyMTRBQjZEOTUwQzY2RkFFIF4KKzc2NDUxNTI3N0Q0QUY3M0ExNEZBRTJEOUNGQTRGOUJBRjMwNkNDQjUgXgorQjAyMUVCMDhBNDM2QjAyNjU4RUFBN0JBM0M4OEQ0OUYxMjE5QzAzNSBeCitCOTdGRTlFMUM1OTE4RkVGQkVERDk4NkI3NTdDQ0Y0RUM0QUZBNzVEIF4KKzY5MTczNTM1OTZCRkFGMUE1QTA2MTE5RUNEQUJCMzdDQjAxN0Q3MUUgXgorRkNCNEJDRUJFQkJBQjY2MTQyQUQyQTVCMzVBQjVEQkY3OEM2QTQ2MyBeCitCQ0E0NTRCNjlGNDQ4Njk2MEM2MzNEMkM0NDUzRkQwMUQ2NzU4QkNFIF4KKzVDRDI1RTYyQUQ5N0FBNURCM0E5Q0VFOTlDNTg0MzlERkJGNjA3M0IgXgorRTg0MDVFNTgzRDMxQjNCOEU4QjM2NTA4N0YyQUIzOTE3NTMzMjRBNCBeCiszOUUzMkFFNDA1NDIwREVCMDcyNzUyMjQ4MTdCNTcxODcwNzk4ODZGIF4KKzYzQUMyMEFGQUVEQUZCRkMwMTg3NTVGNENFQjEzQTA0MkJERUZERkUgXgorMjcyNDVDNzRCNjFEMTlFQTI4RkVEODFFNTlBQTQ4RUZDMjI5NDZDOSBeCis3MjU0QzhGNUEyREYwRTc0Nzc2MEUyRUIzNTNDNEFCMjRFMjUzNjAyIF4KKzMyREQ0OUI3OTZBQkNBNzYzNTZBQTlBQjA3RDY2OUNCN0JDN0Y4OTkgXgorQjgzRjNGQkU2REIzODIyMzI1MzM0NEU2OUMzOTlDNDc0RTRDNjRBNSBeCitCM0UwRUI0ODRBRTVCMTBCMDE3RjUwOTczMEYzNTA0ODFBNjBGNjM0IF4KK0E5OUZDMjQ3QzE3N0Q2NkNCQzZDMjFDMTBDMjFFMTBGQjJGMzNFRjkgXgorQTdEMDMzQTk0NkFBMDMxNUNEMkU0QjcwMjUxNjRCNzdFNTk3OUNCRSBeCitGMkRFNUNEOTEyRDVDRkU3MjdCMzUzQURFQ0I2QjdGRDExRTgwMTg5IF4KKzExMUJBOTA1ODJFMTdDQjVFMUJCNzBBQjcyQzk5RkNGNjQ3ODc2QTAgXgorOUFGN0YxQTc0MjIzNUMwRTM5NkY2RDEzMTlCRDExMDQ1MThGODQ3NSBeCis5MjNCM0U1MjQ2RkI1MEZCNTQ0ODc0MkI4RUE4Q0Y0OTIwRTcwNzAyIF4KK0NCRkM0NTYzMzM0RDEwNEU0REYyNDQ0M0EyOTVGNEU5QTdEN0Q0QUEgXgorNDhGNEJFREU3NkM2RERFOUI3MkE5RkVENTBEMEJEQkQwREY3RTdBRSBeCisyQTIxRTc4MjhDMDY0REIwRDY4NDU2MTYyMjgwMkM4NkE1MDRERDM3IF4KKzJENTk5NTcyRDZFNTdBNDM3QTJBODQ1NTQ2RkJFRjlGMkZBMTFBRDggXgorQ0I0Q0ZEOTJGRkVGRkRERkQ4N0E0Nzg2RDYwRTI4Qzc2MjJDNzFERiBeCitGQTZEQjlEMUVCOTI0NjE0NTRFN0RBREMzNkM5Q0U3QTFGMzBDNjNFIF4KKzk4QzI2NEI3Q0RGNzc0QzdEODJGNERBNUUxMTYwQUU0MzcwNjY1Q0IgXgorRDUwM0QzQzVDQUY3QTJEMTI0QTdGOUYwRTdEOEQwRjVFMjlCNkYxOSBeCitBRUZGNUFGMDAyMzg2OEVGNkUzQUQ0OUYyQzMwRDY1RTk2M0I2MzA4IF4KKzczQjE0NjRCOUQwNTUwOUJFNzJFODNDODE5RjlENjE4QjMxMjEzMzYgXgorNzkxNzc0NjY2RDI2MjlENDMwNEJDODExMzhCNEQ4QTc1OTlFNzdENiBeCiszNjJBMkQ0MTlCQUYyNjNGMUU3N0M1Njg5RjYxMUFFMzAxQzA0NEYyIF4KK0I0RDQ3OTZEMUJDMTg1MUREQjc1RjVEM0JBMzA4OUQxRDBFMEExNUQgXgorQjdDNEZENDA0QTczQzBBRTQzRkFCQUVCNDcxRkRCNkY5QjI0QTI3QyBeCitCOURDMTE4MzQ5RERBQjM3REQ4MkI2NUUwOTIyNzdDMUUyRjIwQzVGIF4KKzE0NDc4MjkxM0RGMkZBOEY3NkQyMTBBN0EzMjFGMzYyRkE1REE3NzkgXgorMjlENjQzNTFBMTc4RTUyRUREQTlBNEIyRjUyNzlCNzBGM0ZFRjM5QyBeCiszMTA5OEE3MEZCOTUxMjhCRUNDMkM3MjlDRTVBMkE0QkNBMTIxODQ1IF4KKzlDMDVENkIxNzFDNjBDMzc4MjJDREJEN0U4QzFDNTcyODZFMjc0NjEgXgorNkZGN0M0OTYwRTM1NDYzQThGREI3Nzg0NEEyOUREQUQxRkYwNEY1MyBeCisyRTA4QjkwODg2NDY3Mzc2MjBGMUI0NDhFODFFQTVFNDJDNDBDNTk1IF4KK0FGMjM0MkQ4RjRCRjEyRjlFNTI0RTQ0QkNENDIwNjZGODQ2MjA3MjcgXgorNTQzQTFBOTlCNDk3REJCNzc3NjQwM0YzMjUyQTlCMkUxMUEwNjEwQSBeCitBMkE0NkJFRjA5RDIxQTlCQTMyQUFFNEZDRjdBODQ2RDEyOEYwMzU4IF4KKzgxOTYwQTIwQTc1NUY4NEIzNjIzRDFFMkEzOTVFREIxMkRGREU3M0YgXgorQjAxNkM5MEIzNTBBNUE5QUQ0QzFGM0FGRTQ5RTNFQjIxQUFFOEI3QSBeCis0MUQwM0E4RDc5RThCQUFFMTE2QzJGNTU3M0Q4NjlEOTdEN0Y2RTBCIF4KKzgzMTIzN0Y1QkRBQzM3QzU4QkEzMUY2MTMxOTgyQUZFNjgwQkFDMUYgXgorMkU4QUNGNUZERTE4NTQyQkRDMkQwQjk1RDNBRUQ3RkM0OEI1OTkzQiBeCisxNzE3NjNEODgwRDQ1ODg1RUE2MUY1RUQwNEJCNTFCNzlDNkEyNzI0IF4KKzQwNUFEMjgyQTIxNDFDMzhEM0Q3MzFGOURGNjMwNjY3MDY0QjlFRDAgXgorMDdGMkVDQjk0NEQwMURERjlDNjhBQTY4NzYyQkYwN0YzODVFN0U2RCBeCitFQjVGRUJCODEzRTRERDdCRjg1MkZCMzI0NjYwMjVGN0Q0RTc5REQ5IF4KKzUyREUwOTBEQjAyNzM4NUYxN0M5RkQ0MUY2MTI3MjUyNUZFMTA4QjEgXgorMTAzRTM1MkEyNjExMzRFMTE1NEVEM0MzMTJEODkwNjQ2RkVEMzhBRSBeCis2NUM3Mzk2OUUzNUU4RjMwN0I1MThBQkJERTg1NjU0Q0FEMTNEMEM3IF4KK0ZCMzgwQzAwOTlFQURFRDlFRDhERDQ4RDcwRTE1QzdBMjZFMkY0MTcgXgorRUY5RTEyMkUwQjhGOTY4RUYyNjJFMUE5OEJCRkVEN0I0NjE4NDZCOSBeCis3NzFBMTYyQkRFM0NDNEMwN0JFN0ExREQyNTQ3MDI4NkYxMzMwMjBFIF4KKzVGODkyMzUzREM1QzY1QTFEOEM5NTEwQUNFQzQzREQ5NkY0MzI3NDIgXgorNEU2NThCODc0M0Q1MTAyMjFCOTY4RjJDNzhDNzJBNTg4QTVERjZENiBeCis1RDUyOTVBQ0VDMjRGOEE1MkVDQzVCMTc0RTQ4ODQ3MzJCRDIxNkUyIF4KKzc3OTFCRDBFMUM0MTM2RDk3QzQ2Q0NENjZEMzZFOTg0NDNDNDE4MkEgXgorNTE1NDE5QUU1OUJFNEU4MjRFNTc1RTQ5N0YzNjFDMzM4MkMyMTc4MyBeCis3NjY5RDBEMDgzQjNBMEE3QjYzMUVFNDg3MUFEMkEyQUY4QzUxMkY5IF4KKzkwQTFBOUJEOTM1MDFEOUFGRTUwNDBEREVFMzk1Rjk0RTU1OTRFRTQgXgorQjhFNDhGNzk2MThDREU5NTEyOTZGMUQyOEI4NzY1M0MzQ0RBNkZEQiBeCitGRTk0RDUzNzNFRjAwOUVEMkMwNkY2MzJDNzM5NzE3NzkxRUI2QkI2IF4KK0I1QzM4NzFEQTI0NjZFNDYzNUREM0JDRDA4NUEyQjhFMjIyQ0U4RjQgXgorNDMwMzJEMDIyRDI0QjY1Mzk0RjdBNzA3Qzg0NDFDMkE3RjNDRDk4MCBeCis4N0MxMzQ0ODAxN0RCM0I2QzU1MzI1MEM1OURGNEQzRDU3Njc2Nzg4IF4KK0YzOEZDQTQ1ODk1NDMwNTE5MzVENEYxNTI1NzEwQUIzNjYxNjFGMjIgXgorOTIxRTNDM0RFNzczRjk4NzQ1MkNBRTI4RDNDMTBERjk4MDQ2MzJEQiBeCiszMjMwOEQ1QkNBMzNFNjk0MDcxQjhDMTc0NzBDNjQ2OUVEQzFEQ0NFIF4KK0FDNTI1ODI5N0JBMjJGRTYwQjQ2NERFRTIyMzQ5QzcwRkRGQUIyMTkgXgorNTk5MzIyQkMyMTRENzI0ODIxNkYwQzZFQ0YwMENDMzRDNzkyQzVGQiBeCis5OUVCQTkxRkFGQzI3Mjg4QjNGRjMyREU1NUJGMTdCQzZENzZCMTZDIF4KKzg5OURGN0MyMTc3OUNDMEY1NEVEQ0Q0NDEwNTFDQUNCRDJCMDY5NDEgXgorRTVFMEJBMThCRjNDOTkwNjJCQTQ0NDg0Nzg3NkM1Q0EyREI4RjlDNCBeCis5NEI4QjkwNTY2QjJFM0JEREE4RkY4RDM3QkREOUY5NUNGOUJFMEIyIF4KKzg2NDIyQkFENjVDNUUwQjIyRjAyQjlEMTUxMEI5RDI0RjQyMjdBQzkgXgorNDI3Njk0Qjc3MkEwODQwMDM4MUQ0NzI4NTRGQTVGRDRENENDMUQ2MiBeCiszNzMyREE4RUJBODRDQjQ1OTFERDRBODdCQUU5NTg2MzVDODVERDcxIF4KK0Q0MUMyOEMwMjhFNDJBRDFERjUwNTdDOTdCQjk1M0IwM0FFOEY2QUUgXgorNEM0NDI4NkY1OTc5RDQ0QUI0Q0E1RTM3NzZGMzBDQTA0Q0U1MzlFQyBeCitFNjk1RDlCMDQ5QTE0OTdBODY3NjUxOTVCQTc4ODRFODg2OTE0MkRFIF4KKzJBNURFOUM1NDg5Mzc1QjhFRkRCMDlDQTI5RDMyRkRBREFBMDc0MDIgXgorMDEyMzU2RUI0NkE1ODc3NjNFQ0QxRUM5RjMxMTRCOEI4Qjc5ODdCNyBeCis2QjgwM0RGMDdFNUE0N0ZCQkU0MTIxNDlEODI1OEI1MjZEMkJFOTZCIF4KKzE0QTEwOTBDM0IzODI0ODJBQUQ1RUY0OUIzMEQ4NDIzMTc3OTI3NDUgXgorQzJBNTc2REUzODUwMTdGQTg0ODU1Mzg4RUU2Q0IxRjUxRjQzQTZDNCBeCis1NzQ2QjhDODhDRTU0MDMxM0EwNDI5RTY0ODQxRUNEMEFENTY5Mjk5IF4KKzI5OEVGQjg3RTlDMDkyOTlERUMxNzE3MTkwMjY4MkQ5MTk4OTlDOUQgXgorNTVBRUI3OTMwQ0Q2MjAyQ0Q1MkU2NTEzRUQ0QzM1ODI0QjU3NDE5OCBeCitFQ0RBQTg0MDRGODgzMzRFOUMyQzZGQ0M5MjA5Nzk1NTgxNjU0QzI1IF4KKzA2MUZGRkNFOEY2OUJFMEQwQzlCNjNFMzBCQjA2NUM2Q0M3M0RGMzMgXgorMjI5RjNBOEJEMkY2RkZCNUNFMkRCMzMwQUNGQkM0QzRENzc5NkQ3RiBeCiswQkFCRTYwODAzMjQ4MDU5RjNCMDVFMDZFMjczQjVGNDFBNjE5QzlBIF4KKzVGNDk2QTVBQUExRkMzOEI3NjA2OUJGOUYwOEM2Mzc3N0VFNzUzMEMgXgorOTFGQzg5OTRGQUEwM0U5QTJEOUQ1NjVGMDQ0NzhDNkRGMDM1QUZFMyBeCitBNjg1NTJCOTA0OUUxOTJCQkY5OEU4MkUyQTY5RTQwNUZGQzJEOTNGIF4KKzc5MTAzOTNEMUQ5RDhCODc2RUM4OUZFOTEwMDMyMEQzNzE3ODlDMjMgXgorOUI5MjNGOTdGMkQyQjA1Nzk1MERDM0MwRTg5OTgxRjIyRjk2RUMyRiBeCisxRUFEOUMyMzdDRjNCMUNCOTVFN0VENzlFRjJFNTg0MkU5MjYzNDQ3IF4KK0Y1MUU1QzIwMkQ2OThDNzVGOEYwQzI5MjYwODFENEMyOEY2NDE4MTIgXgorODg0MkQ5Q0Q5Nzg2ODE5NkIzMUYzNEMwMkJBNjNDRTM0NDkzRENBMiBeCisyNkM4OTc3QkMzNkMzMjk4NTgyQ0U2NzAzRjYyREZFNDQ4OEUwRERFIF4KKzk1NUJFRjM1OEFDQTRENDRFMzNGMzEwNTFBM0I5MkQ5NkJBNjY5RTMgXgorNjhEODQxQjI5REEyODVEQTUzQTMxRTgyMzQ2MkU3OTRCMzEyNjkxNCBeCitCQjUyQzE4MDY2MDVERDM3MTEzMDM1MzkwRDk3MDM2RUZCM0ZFMkJGIF4KK0JDNTU3NzJCQzlCNjA2NjExMjUxMkUxQThCNjMzNDExQjk1MDhGQTIgXgorQkREMkNBNEI0MzE1N0MwNENFNzA0M0Y1N0I3RTI2MTBEM0UxNzVEOSBeCis4RTQ5M0YyNUUxMTBGNjI0NEZCRDc1ODVDRjE4RjI4NTkzMzk1MEVDIF4KKzY1MDI0MkRGOTlFOTg1REUyM0E1Q0ZDMjVDOENBNzJDODBEN0YyM0UgXgorNTZBMDYxRkU0OUI0Mjg3OThDMzI5MzM2RDRCMTg0QkZFNjlDNDEwMiBeCis1OUZGODE3Q0VFOTQ2Q0I5NDgwNTYyMjc2MDdBMTE5RjRDN0REQTg5IF4KK0JENEYwM0YxODc4Q0VBODZFMkFEOTgxQzZBODA3MDFFMEFEMzBCNEEgXgorQTYzNUY1MjhDQzQwMjg4NzcxODRFODkxOENGNzNFMUFFRTZGNzc3RiBeCisxNURDQUU4N0Y3RTQwQ0E1NzdDNjFDMkFBNUI2RDkwRjBDQkU2RENFIF4KK0Q2N0JEODVBMzUzQ0VCQjk5QURFNENEODZCNTQ2NzNERDZENjQzNjAgXgorMTYxOURFNzIyOTAzMjgwMENERjA3MTgzMENCQ0MzMjA4QjFFREIwOSBeCiswOURDMThCRUUwQzJERDlBMkM3MTg5QUE2RDNERUI4QjdDQzQxQ0U1IF4KKzQxNjVFRDQ3MEQ4NUZFREQ5NTkzNTc3QTkxMDEzMDZDMzE4MjVFMDAgXgorQzUyOTQyREFCRjRGOUQ3MkIzMUIyQjMyOTE3MDVFRjUyMDFCMzM0MyBeCis4ODI5NjAzNUJFNzlGNTI4MUI5MUMwRjEwMDZFNTdDMjg2NzFDQkYzIF4KKzgyNTkzODA0ODgwRjE2OEI5RkY1MEQ4OUNEMTQ5RTlGMjYzRUI1NTcgXgorNTJFNEY0MkZDMkVDMkVCN0MwQTcyOEQyMjUxQTE0QTZDNUVBNUEwMCBeCitDOTFCMjQzQ0JBMjAzMUIyOUYzNjVCQTQ0NTFGRUZENkE5MDIyOThBIF4KKzkwRjZGNUE2NUU2QkM5NDMwQTM0QzA2NjMxMjA4QUFFOEI3NTU1RjUgXgorNzUzNUQ3N0M4ODA5QjRFQTIxNjc4QkY5Njg2NzkxNDE4RkM3MTkzMSBeCiswMjcwNzBBQzZCNUQ3N0JGQTAzOThCOEFENTU2QTIzQUI4RTk5RUJGIF4KK0I0ODMzNUY2RkI2RUEyN0NFMjE1NkExRDNFMDBFNDJEM0UzQTg0ODkgXgorQjY3MzAzRDcxQkYxMjVGMjQ0MUJGQzU5OTEwNjE3N0EzMkU0M0JBQSBeCis0NkU5OEQ0OUJEQzVBNDYwNEY2MkFBRjc2RTk2NDgzODI5MUJGQUY0IF4KK0YxQUNDNTYyRDk2OTk5NDkzRUVCRDI1MzFBMjg5MjY0QzNFMUJFRjYgXgorMEIyNjE3MTJDM0Y0RDBENzRFQkRERDA1MkUxQTA1OEJDRkY0MTJEMCBeCis1MDQ0NkFBN0ExQTgxQTk3QjFERDUyNEFEMERCNEQwOTk3MUQzODNDIF4KK0UzQTUxQjZBQTVBQTU4NjgwM0VGMjE4M0RFQ0EwQ0I1Q0E4NjlCMTEgXgorQzgxQjUyRkQ2MEFCRUE4Q0Q1RTMxODRFMjA2RjY5MzIxMUYwMDhFNCBeCisxOTcyNzBDMERGNjkzNjIyREZFODcxODU3QTdDODdCN0JFMkU0MzlGIF4KKzQzNDUzREY3NjIwRDcxQ0FENTZERUY5Q0VFNjE2QUQ5RTdDNzNFQkEgXgorM0UzQzZFRTExNDFBQjNEN0VBNTIxNUFDRUY0RTg3NkVGQTg5RDAzQiBeCis1NzczQzI4MjYwQzJCMkQzMjU4ODNBRTczQjA0RDI4QkZEMkU4ODg0IF4KK0VCNkYyNkEwRTc3NDAyMjc3M0NEODZFMUM4REZFQTQ2MUNFNkY4RjggXgorNkMyNjQxMEIxMUEwQ0ZDOTc4NDlGNkU0M0U3N0I4RTQ4RDVDNTM2MyBeCitGMDIzNkNFRjIyOThFRDNEODZBOTVFOUY1MjQ3QzE3NDk5QTc3MkREIF4KKzcwNEI1NDk2Q0UwQUZGNDI4OUYzRDkxNTIzMEY2OUFEQzdBMUVEN0IgXgorQjBENEZGNkI1MEYwOUZCQkExOUY3NjY5M0FDOUNBODc3NjhFMjc1OCBeCisxMERFNEY2ODc1NzdDQ0FEOUUxNkFFREM5OTU4MDIxRDkwREU4NzI2IF4KKzc4NTc0MTk0OTA1OUU4NTA4REI4RDEzMkE5QjA1M0VCNDI3NzExOUEgXgorQ0IwNDFCQUYxM0FEMjI3NzhBMUM3M0E4QUFBQjc0NThCNjY0QjFDNSBeCitCNEIwQUREQkVGQTA3OEFBNDk3MDQ1NjI5ODQwRkQ5NjVCRUVDMzNEIF4KKzY4RjBFNDNCN0RGODlGNDg0RjNDQkQ2OTg0Qzk1MTY4MTQyRTRBODIgXgorRDA0MkJFMTRBMjNEMENBMUEwNDY2MTc5QzExOUYyQTk1OUUxRTExOCBeCitERDIzQ0MyODI0QTg4MUZEQjY1NjZBRTZBNTdCMUEyRDE2MjRFODk1IF4KKzE1Qjc1RTdFMTNCMzc0MDM5QjhDOUZCNEExMTIyQkI4QTIyRkFENkYgXgorODQ5RjBEMzc5QTI3NzVDQ0I1RUJCMEE4ODgzOTUxNkYzMEE2NjVGQiBeCis4QjQxMjVGRjJFQkZBOTQ1OTA3NTQ1OUMxRUUxNDlENjhDNEY5OEY2IF4KKzFENjMyRDNFRUM2M0QxODI0M0ZGNDg3MDJBQjg5NEVBMDVBMUFFRDMgXgorRjJDMkUxMDgyMDA0RURDQkUzREY5NkMyNUQ4ODYwQzBGNUI0MzJCRCBeCis0Qjk2QzNDMjg0RTlFMTJDM0QyRjE4QUI4QzhGQzY3NzZGMzBDNkRCIF4KK0Y0MERDOEI5NEQ5RkU5OTEwMTE3QkNENjZGM0ZGQjIyRjY5Nzc0NDcgXgorRDY1RDEyNkRGNjA0REUzMDZBRUI0MUE2NDFERTBCMjE0NDQ5RDY5QyBeCis5MEZCRUZGMDU4RTgyNUVCOTQwMTIyQjZEOEI3NDkyRkM1NzRCMzJBIF4KK0FFNDQxNEFENDcyMTZEQTBBRkQ5QUQxRTIyQzg4MkY2NjU0MjlDNTQgXgorNUY5RDk3RTkxQjdFNDgxMEFFNzY1QTA5ODAzQUJGQTUwQjZGNjRFNCBeCitBMkQ0RTZBRjdBRkQ4N0UzMDNFODY3RDBFMDNFMTk0NUEwRjBCNzJDIF4KKzE0QUJGNzEzOTgyRDREQzdDMUNDRkNFN0E0ODY4MDU3NjA4MkRDQUMgXgorQkVCOEY3N0E3RDIxMUQ5NDUxQjY5OEQ2NUZCQzBCNUUzOEQyNjA4NiBeCitCMzVGNjYwNjI5OTYyRDVGMUY4NTI5MjAzOTk5RkNBMDE2OUYyNjc1IF4KKzA3QUM1QjA0MTY2RTczOUE5RkI4N0ZDQ0E3NDExMkFEOTNBMDgxMjggXgorMkQ4MjcyQzlENjIwQTczMDU2MUVERkRBRjJBMTI5NjY2Q0VCQjVDOSBeCitDMjVDMTk3MUVBQjI2NEY0NENFRTFGNDQ2MTQ1NzlFRTZEOEM3ODU4IF4KKzc2RjgyMzRFMkYwQTUzM0U4MTA1NDVGNzlBRTI4QTdDNDYwNTZBRjMgXgorMzUwMjVFQTA5RUExMTFFMjk5ODE0RkJDOTU4OTc3RERCQzNBMjM4NyBeCiswQTJFRjU0OEEzOEQ4NEY2QTFDQkIyQUUwMUQ0OEQyOTZENkNEOEZEIF4KKzZGNTQ2REQxNjIzRTkyRERBMTg1QkRBMDE2MThERjdFN0U3QjgyRjYgXgorQTBDMUMyQUVEOEMzRjQzNkRFMjAwRTJBM0Y0QzJBOUQyREE4REQ3RCBeCis4REMxMDE5NUI5NjdGQzdGRTU3QjMzODQ5NEMyQzQyRkI0MzU5OUQ1IF4KKzBEOTE5MkIyNzg1MUNBQTc2NkQ5MEE1Mzc2Q0UyNTVCMkZERTkwNkEgXgorNzc5OTQ1MEQwMDM4MjQzNTZFREZFRTFCNDA4QUE1OUU4MzAxNzVBOCBeCisyRUE2RjMxODhEMzAxMEVERjRFQkI1NUUwMDlDQzREOTkyOTZGNTc4IF4KKzJBNzNBQ0I4M0ZCOEUyNUQ2NUZCQzFCODA4NUJFNjczNDJGNTg1OEUgXgorNjdGOTkyOEEyNzExOEVDQzM4RUUyMzFFMDU5NzdBNjk0QUQwRjdBQSBeCisyN0UyMDc4Q0M5RkRERjVDNURENkNFNjI5RjNFRjA3MUIyMTA3OTM2IF4KK0Y1MDU0MEI0REVFMDcxQzY0RDg2MTg3MkYxRTBCQzRDN0RFNzVCNTIgXgorODdEQzlBRjc3MUYyRUU1NDNGOTZEQjBDOTI0QUU2NTBBMDYzRjg1NCBeCis3NkRCODg1REQ3OTcyNDlBNEUyRjc5NDE3MURENTU5RkYwNTZBOUZCIF4KKzlBQzJFOUNEMzg4MUJGMTRENzU4QTdGRUJEQTgxQkM5REREMzE2NTIgXgorRDNEODU5NUQ3NUFGNEQxRUVFQkVBODE2NkNBRkIxNTZFODI3REU5MCBeCis1RjdEOUQ5QkQwRERDNUEyQUQ0NzcyNjEwRkUyQTQ5MjNBODI2NDg2IF4KK0Y0MzdCQjZDRkFBOTEzOUExMjAxRkVCNTg4NDFCMThDMzgwOUYwMEUgXgorOEMzRUI0MDJEOTJFNjU0M0Q4ODVBOUZERTJGQzgwQjlENDM0MEU4RSBeCisxMzQzMDdDNTBDMjRCQkQ3ODIyREJBMzBGNjQ0Qjg3NEVCQjU0RjBBIF4KKzI0Nzc0REE0NjY5QzIwMzdGN0IyQTQzQkNEMUM4RDU3NDcxNUYwNzEgXgorNjlGRUY4RkJDOTAzNEQwNUYzQzlCRDlDNjYzRDIxOThBQjQ4RkEzMCBeCiswMzkwRjFDNDk0MjE4MDZCMTlERjFGODg2OTAyRjM3MDg4REY3N0RGIF4KK0RENTM1QjEyOUY0ODIyNTY1MDNBRDI3NDRCNzEyQkZFQjhCRjIxNkIgXgorQUJFQzU1MkU0MTAyMDE0NEVGRTA2ODU0MTQ5QkUwM0YxQkQ3RjZGNiBeCiszRkM4QzhBMTREMTQ1MjcxM0U3NkVERDVFRjk1QzIzOUYzRjhBNEU0IF4KKzg4NjFBODQ0MjlFMjM4RDk0RTc1RDNDQzE5MUZCNEQxMjgyMTVGN0QgXgorREJBNjM3N0MzNzZBRUQ0RDFFNzlDMTk4RUE4NjRCNkU2RDkwQzQ5NCBeCis0RTVEQkY4MjNEQzVCRkY1NkM5OTlBMUZEMEFCQkM1MTE1NTAxN0QzIF4KKzY2OTk0MjBDNkZGNTEyQkU1Q0FCRkUxRUJBRUZCMEFFNDBDREQ5MDIgXgorNzdDQUUwRDdFREZEMkQxMzUwNkQwOTZENjZBMzJCOTkwN0FCOUIyMyBeCitGNjAyMkYyQTE1NDU4NDI5MTUwMjlCMzQ0QjE5RjRDNjk3NTc5MjVEIF4KKzZFQ0QwODVGRjM0MDMyNjM2RTdCRTcyNjlEMjlEQTYyQkM0QkZCNUIgXgorNjBDQzUxMkJFNTA2QkUxQTU4MENFRUFEMkEwMDlEQjhEN0ExQkJDNiBeCiswRjM0REZEN0VERkE2QTVERDEzMkIyRUU3N0I1MkVFQUQ5OERDNzAxIF4KKzFCRDU0MjU4NUFCMzNBMEEzNjk0QkU0NUQ2QzdFRUJDMjY2RDQ4MDYgXgorMTUyNEYyMDM4OUVCQzJEN0RFNzc3Rjk2MTU2REY5QjJBODY1MjM3MyBeCis0NTEyODJFNkRBNzA3NjY4ODg2QUY3RTc3REI0QzU4RjczQ0E2RUMyIF4KK0JCN0Q1OTg5MEJDMzlGN0Y4N0Q0REQ3RTI1ODNDNzM3QjJCNDBCODYgXgorMjU1RDY3RTNBRjY1Mzc2QTFENzFGRkNDRjUwNTgxMjQ4MUFGMTgyQiBeCis0RDU1OUJDMTcxNTE2Rjc5RTIyOTM4REU5OTk2ODVGOUZGMDUzODNEIF4KKzJGN0VCMTYwODFCMjMzOEQ2MzExNTNENUI3MERFNjdGMDUwRTM0OEYgXgorNTkwMkNFNkNGNzcwMEQyRTIzQ0VERUU3NDJFMjczRjRBNkEzOUY2RCBeCis3RDM3QTc1MTVEMUUwNEQ0NENBMEYzMTQzMDY5MTlDMDMwN0ZGNEFEIF4KKzE4QzIxNUE1QjhBQTlDQTVDNTVERjhCQ0ZDNzk2ODNFOTk4MkIxNTkgXgorNjM1MjBDOUREMkNGMzIxMzg4REM4OUNDNjlEMEQ5RjY3NzJBMzU1MyBeCis1RkExM0U2Njk3MTk2RUJEMEU0MEZFQUVENEI5NDVDQzkzMzc1REFEIF4KK0JGOENBNjBEMDdEMUI2OTc2NzA1NkIyRjgwQTlBQzRCMUY5RkE5OUQgXgorNkNERDEzNDMxRUI3MEQ5RTM0NjEwMkI3MDhFOUY4QUIyMzNDRjk1OSBeCis0Q0I0NDhCNDEzMURFQjhGMUFDMzA4NTc2NTMwM0NGMjE0NDM2QTI2IF4KKzFGREM5Q0M1OEE3NDhBOTQ3OEE5RTU1QzY2QzY0NDY3NzUzODJFQ0QgXgorMEVEQzVDQzdDRjhDNkNCMzE4NjE2RDYyQ0MwOENEMTQ0OTk2MDMxNSBeCitENUQwRDU0MDI4N0QyMUFBNTE5Q0U5MEI2RTNEODE5NThBMkUzMDdEIF4KK0JBNUNDRDMyM0I5ODdGNTRFMDZBRTA0QTA5OTU3QkM0MTdBREE2MTEgXgorMjY4NDZGRDY4QkE5NTZDRUIyODk5RERDMTgzMjQ4NDNEQzIxMTQ4NSBeCisxMkJENzA1NjVGNzAxQkIzNUI4NzM2NEI0N0Y3M0M5MzI4N0U3NjcyIF4KK0M1N0EwRjk2OTU5QzdERUREMzUzNDYyMDk5RUZFMzgwQ0IyNzNFOTAgXgorOTkwMEQ1MjY4Qjk5MTY1QkUxQUEyQTZCNDFCOUZCNjY0NTVCODY1QyBeCitENUFDMkMyQkYzNkIwNEVBRUY5NUU4QjkzOTU4QkUyOEI1QTRDODM2IF4KKzgyNzg4REFBN0Y5NTI5MkIyNjZDQTE3RTg2NjMxRDg2NkQ2OEZENDcgXgorMzdCOUU2Mzg2MTA0MThDNENFNENGOUFBQzBEM0U2NEYwMzNEM0Q3NCBeCis5ODQ1QTE1NjI0MENFODQ3NTA4QTFEMzc2MjM2MkZBOTAyMTZFNTlEIF4KKzlFNTlEQzc2RUEwMTU2NzE4M0E0QjRBRDY1Q0QzMUYxNjk3MDZDQTkgXgorQjJCNEExNTAwQTE3NkM4ODMyNjg0NDdBMDlERTkyMEYwQ0Y3N0Y3NiBeCitFMTRGQTExQjYwQjkzODlEM0I5QjJDMUU3QzQ1OTMxOTkyRjY2NkFFIF4KKzkyMkQxNjlDNjI0RTc5REFCREI3OUI3NkU3NzdGNjk5NEMzMzlFRjkgXgorQUU5OUMyRjQ2QTM5MzlDQzVFRTNGOENGNjhENkVBNDg2MzkyQzIzRCBeCisxNTRGOTE1RjkwMzQwQ0JCMDNCOTUxNDgxMEZEMzk5RUVEMDZDRTNCIF4KK0M0NDBFMUU3NEM3NTI2NjgyMjkxOTA4MDk2NkFCNzREOTZGRjQzRTIgXgorNDA1MTU1RkE5OUVGNUU0QTBGNEU5M0QxMDdDQUVDODlBODBCOTRBMiBeCiswQUE5NjI1NDU1QTBDQ0RGMzdENDg2QjQ1MzhFNzkwQkU0MDdBNTlDIF4KKzQ2RDYzM0Y3RjJFQzU2NDk2RDUzMTM4QTU2RDExRDlBQkRCNzAxRTEgXgorNzVDMUJENTczOEVCNTM4MEUyNUVDNEZDRkNDN0JCM0ZEODE2NDQ2MCBeCitCNjE4QzlFNTIzMDM5MTlCRjc2MkQ0NTJGNTY4MUQyM0FCRkYyM0I2IF4KK0QwOEJFMUY1NDg1OTM5Njc3RDI5NEM0MTk4RkExNUIxMTg5MzhCM0YgXgorRjkzMTQ0MTI1OUI3OTNEQUJBRjA4MkQxQjAwMjRBQ0FEM0NCNDhBNiBeCiswOTZFMjA2RTM3NTNCQkVFQzhGMEYwRDNGOTdFQkYyRUIzMDYzQjFEIF4KKzEzQUEzOTdEMDNDNjBBQTQ0MTQyNzFEMzNDQUMyMzYxQzEzODQyMkIgXgorNzc3RTI5Nzk4MzRFOEM2RTg5RDIxOUU5MTA5RjBBMjg1Mjk2MUVGQSBeCisxMzk2MEE2NDhEQjhCN0NGNTQxQTU2QjkwMDlBNUY3RkJDQzFBQkFCIF4KK0IzNDQ3QTNDNDYyQjUzOTQ1RjgyOTUwMzJGQzlBMDU3QkMzMDFGQjcgXgorOEM0MjM4NkEyNDM2REU4M0UxOTU5RTkyQjQ0RUJGNjFFNkM4RDA5MyBeCitEOUVGOTFCMDRERDQzNzE5NjhFMTk3OENCRkVEQjUwQzJCQUJCRTY3IF4KK0U4NDA0MjQ3OUQxRDY2OUFCNTg3MUI3MUQxMzQyQUQ2RDE1MTA1QzIgXgorNEFDRDExMkNEOENBQzcyREYyRDREQTc2OTEwQzJDRDNCRTFFQzI1RCBeCitBQTIwOTgyRTJCMTM4RkIyNDA3RUY5OTUwOTA3NUNFODM2NkYxMEJDIF4KKzVFM0JDNTM1QkJGRjQ3MTY4Njg4NTMzMUNEOTgzMUM4MEZFQjE4Q0QgXgorNTNDNTVDODBENjQ0MTEyMjFDNzMxMTY1NDkyMTUyM0QyQkQwRTIyNyBeCiszRkI4Qzg1MEI5QkM3QTkyMzc2N0QwMzY5OTJBRDc5RUQ3RjBFMUFEIF4KK0FGMEJDQTRENDQwRDY1OTlCQjkxMzk2QTA4MjNERTY0NzY0QzIxMTIgXgorMzBCMTM3MDNBNzAyNTcyMjU3RDU0REMwOTQ2Mzc2OEY1QUFFRjc1OSBeCis1OUM0NEI5OUVEQzI5N0I0NzY0MDIzMTAwNDQ1NTRCM0YyOUY5Q0NGIF4KK0ZFRDA3ODU5NkM1ODQ4MTBFNTMzNjU0NUY2RjZCOTMwMjdEOUNCRDYgXgorNjQ5OUU3MEU1NDU1RjlDOEZGRDJENUY2MDAwMDlBNDNGQUU3MTBFRCBeCitEMjZDMDcxOEE5QzgyMjJGMzBEMDIxRThGQTY1MDg5MzVFODBCQzg1IF4KKzFGNDE1MjQ0N0VDQjhEN0NENzI1QjU3QjY1RTMwRjc5QjQ2NkJCREUgXgorNkM0OTU4NjY1RERERkM4MjhDMTQyN0U1N0QyMzM1OUU5QzVEMTE5MCBeCitCODhFQUQ4NDNDNDg5N0IyQTY5MTYxMkI4MzdFNUE1RDlGNTgxNzJDIF4KK0E1MTA5N0RDMTg4M0IxNjBBQjc5OUQyRDEwM0M0NDMzMzZFQUMyQ0EgXgorNURBMUI4NUJCRjRGMzkxMkM1RTk2NDI0MkE2MUVCRTgzQTNEQTVCOCBeCis0RTlBNDVDMDQxMEYwMjExREQ0RDkxMjNCRkI4QzI5QzUzQTVFMDNBIF4KK0MyQjdDODlGN0RFQTZFNUE2Q0Y5MDkzODg0NzFERUM0Q0EzNjIyNTUgXgorNEVGM0I3RTc4NDYxMTUyMTJCM0U3N0MyOUFBQ0E2MTk4NDIyQkVGMiBeCis3OEM3NDU2M0JCMkNGODE5RjgzRTczQ0MwMDA3MjM3OEMxMTQ2MzlGIF4KK0ZBRjk2RTgzNkMzODFFQzgwRkUxRUE4QUY3NkU5RDhEOEFEOTVGQkQgXgorM0IzMEEyQkJGODRBQjcwRTgyMjAzNDlDQkEyNDlEQjg3RkZEQ0JGRiBeCis2Q0UwQ0MyOThEMTI1OTdGODAxRTBGMUJERTY2Q0E5RERGNkFFNjZBIF4KKzgyNzRCMURCOEMwQzczOTBDMzgzQzgzN0ZEQUJERUJCRUREMUE4QzEgXgorRDBGOTBENjNBQ0QwMTI2Qzg0RDcxNEFEN0M5RUI2NzNERkI0NTlCMiBeCitEMUU2M0VCNUMzNzNDNzhFREY5NjhFMDY1MURDMTE3MTkwNzI1OEY3IF4KKzE1MzBEQzk5NTY1QkUyQjVBRTkxRDFENzBCMDI3RURGRDRFQzZFOTMgXgorRkVDMDk0NkZCOUNDMDQ3MTNDNjdCQTM2RkEzNkVBOTIxMTEzMTI4MSBeCitCRDJCQTY4MEQyMjAwQUZDNUNBRkIzNjJBNTUxN0JFOURBQjdFNTkzIF4KKzVGQjU3RTFBQUQ1QkQ5QzFEMTc2RTFDQTAzQzFBNUE4RTMzRERFMkQgXgorRjZENUU3QjFCMjhDOTA3MDExNURCNjY2NTMwOUI4RERGNUY4MTI4MSBeCitCRkU4OEY3QTBGRDVGNkExQjI2QTVFMTVEMEExMDlBMURBN0MxRkMxIF4KK0U1NjY4QUE0MDM3NUM4Q0EzNUZCMzA0NkVERDhBRDlFREJBODJGRTMgXgorQzg1NEQ1QzVBMEExMDA0MTFGQ0M5MTg5RDYzMDdDNDdCNTcyMjhDRiBeCisxRUUzODQwNzYzMDhBQzZCODBGQjY2ODU2RDVGQTE5OTUyQjNENkQ1IF4KK0NBQTREQ0ZFRTA1OEQyMkQ3MjYyOTJCMkM3MjJEMzE0N0YxRENENjMgXgorMTg4N0M3NjA5MkM5Mjc1QjJERTMzMzAxNEM5OUZEMTNFNUU1MzNCQSBeCitBRUFDNkFDQjQ1NjE5ODVEQ0ZGNkM5Njk2QkU4MzZGQkY3NUUyNEU5IF4KK0NBNDZGMjM3NzNCMzBCRjBBQkY1QzM4RUI5RDBFRTAyMUQ3MTNGOEMgXgorMkVGMDA3OTg4QjIxNjFGRUQwN0U1MTgxQzM0MkU3MjREM0Y2NDBBMyBeCitGMEYxNDIyREZEMzRFREUwMEE4QjA3NDFGNEYzOTUyMzQ0ODBGREI4IF4KKzJDNDcxQkY4NjdGNUEwMkNDMjQxRTM1RDk1Qzk3QjQzRDY1MzZFN0QgXgorRDQ5MDZDODgwNEIyNDFFMjhGM0YyRTYzODAwMTlGQjczOUVDODUwMyBeCis2MzIxODNFRUY4QzZFQzhFQUEzMDE2QTQzRTU2OERDMzhFMjkzNzlDIF4KKzE4MDgxMjBENDYxQTg2N0M5MDIyMjQ2OTk4NTc2OUFGMTc1NkVFNUIgXgorMDhDMkY5N0I2RkE2RTE0MzNEQUY1NjQwM0NERkU4Q0VFQ0Y2QkNGRSBeCisyNzY3RTExMTk3N0EyMEQzMThFQUUxOUQ1OUUxRTU1MUE0QUE3RjFFIF4KK0IxQTcxNThDRTU2NjY2QkNEMUZERTdEQzg3QjQwQzkyNzA1QkZERTUgXgorN0NFOTA1MTRBRDczNDM5MEY2RkU1OEJBRThGRkNENjYzOTFFOTU5NSBeCitDNTdGNEMyRDhCNzhEQjg0NjRFRjFGNzE5QjhCMURBMjcwODY3NDgwIF4KK0M5NzkzOEYzNEM2REYyNkJGRDUwOTY1ODgzOEY3QzM1RkRCMEM1OEIgXgorQTVDQUE2OTQ2MzAwQjFDNEI1RjUzQTY5QUFBRDY3OTYxQzRDNjgyMSBeCitEREY2ODQ5NDdCMTY2N0E3N0EyMkM3REZFOEI2QTBBODQ4NEUyNTA5IF4KKzhGQjEzMTBGMUYyMTVFNEVGNjJDNDE1NjZDNTIzMjc1QkM5Mjk2NzAgXgorMTU3M0NDNDQ3QjM5ODUzMkJGQjlBMkU1QUIzODgwRjIzQ0E3QzI3RCBeCitENkUwQjY3NEI5RTREMjgzQzBBQUMzNTU5ODlDQzBFOEJCRjA5Njc4IF4KKzdEMDgzQkI5QzNFMDA1QjQxRkUzMjYyOUY4NEI5RTI5MkQ4MEZDNjcgXgorRDNFMjU5MUI3RDdDRDI5RTlBQ0U2MURGNjAxOUQ4Nzg3QUM5M0JFNiBeCis3MTU5QjEwQUFDQTlFNzYxMEM3NDA0REU5NjFBQkZEQjE3Qjg5MTU2IF4KK0I0QTAyNDgwODhFODUwRkZDNUNDQTk5RUEyRjI4RUNBQ0JGRjE5NjAgXgorQ0E2M0Y1NEZEQjZDNDZFODc3NzYwRUY0RTUwRTU2RjMxNjRBNDE3RiBeCitDNDFERjUyRUIyNTI5NjE2MTlCRDQ4NjFDNEFBQ0NGMUFCMzkyQjY5IF4KK0ZFM0VGRTQ1M0M4NzA1RTFDRUREMDZGMTVERjVCMzVBNzMxMURCMzIgXgorNUUyRThCQjA0QjMyN0U5MTU3Mjk5MkE4QTYxMDYzRjdBNzZBOTNGRiBeCis4RUEwMTkxRTg0OTE0MDAwMzhDQzVCMTQxNkU1QTU2NjIyRUYxRThGIF4KKzQ3NzI3RDREN0U4RDk3Mzg2MDhBRUVERUIwRTEyQzlGMjQyN0VCQ0IgXgorNzM0MEY0MDVCQzQyOERBNTE0RTdCMkYzOTcyOENENzdGQTIxNzdGOSBeCis1RTQ1MUM3QTUxQUVCQUJDRUY5RkRGQkYzNTM4QUZFQ0I5Njg4NzJCIF4KKzUyODAzODI3NDgwM0Q2REI0MTlGNjkyMzk5M0E0NUM5OTk0MzMzMzYgXgorMjgxRDMwRkQzQzcyNUE0NjQ2QTYyODczMjkxNDBCRUE0QUM3QTVCOCBeCis5MjJBNTdEQkY2MkMwMURBMTlCODlGOTBGMzZDNDMzODE3RjA4OUIwIF4KK0M3OUFCMjI1QkJEMDMxNDVBOTgxREJFN0JGNkZERDE2QTVFOTVEOEEgXgorMzAxQjREMEUyNzBGMkFFQzZFMTM3MjU2MDM4NUQzNzg3NUVCNjgyQyBeCisxRUYyRUM2QTM2NDJDN0ZENjFDNEYxQzNERkM1NTMwMjUzNTI1NEI3IF4KKzFEOTRFQ0YyOUQyMzEwQjFBNUEyMDQyQ0ZBNjE2QkEwRDE5RTdDNDEgXgorNTJEREE5QkVFRkFBQUU2NjdBNkQxMkJFNDE0RkFEODYxOTc1MDA0MCBeCitCMTQ0ODZEMTZEMTUyMUQxMjgzNjk4RTY1MUExMEZDMTRBRkY4OTk2IF4KKzRCQkZCRDAyNDRCRkVFNDQwREJFREM4MzYxODA2Q0FERkY2NzMyNTMgXgorNjYyRTBFNDY2QzlENzAwQzUwQzVGOThDRDc3Q0ZFQ0Y4Mjc4RDcwOCBeCisxQUM1QjgxOTdCMDY4OTY4MUIwRjQ3NDgzMkYzMTZDRDI1MTQ3QUYzIF4KKzg3MjBFMDEyRjE2NTg4QTNDMzY4Njg5MTEzOTAyMTE5Qzk3OTFGRjIgXgorRDg5MkMxRTI1N0E5OTdBOERGOTVCMjI5QzlEMjRDOTlGNjBFRjIwNSBeCis1N0Y1QzQ1Mjg2RUMzRDI5Q0VDMTk5MzlDMDQwNDVEOUMzOEU3NjFFIF4KKzA3MTUxRDJFQzg4OUQyNDczMEFBQTUyODJGQTRERkM0OUE2NkU0MzkgXgorNkFDOTQ2OTBFQTZEQjRBOERDOTgyMjcxNDkwRUUxODI4MkEzQjMzRCBeCiszMkREMTlGMTJBQzA4NTQ5OThDN0IxNEQxRDk2QzE1RkE4OTk1REJEIF4KKzc4MTdBMjVDNkNGMUVCRkFBOERFRDdBODAwNjNEMUEyOTlBRjhCMTggXgorMDFDNUVBQzE4MzBEMUY1QTdGMTg2RTAzOTY2M0NFOTI1RkNCQUNERiBeCitCOUYzMkY2N0ZGNDkzN0Y0NDA5NENCNEE2MkJFMTI0NzRBQzNFMUFBIF4KKzA1QkUyQ0Q2ODgyNDQ3NDcyQUQyRTAyQjA4NTkwRURFRDYyQzc2MzggXgorQ0VGMTQ5RjZENkZDODk4N0MzNjkzRDVGNUNDQUMwQ0RERDNEMDc4NyBeCis2QTdDQzk5REFEODZEQTk3OTdCMUY4MzM2MzU2Qzk4NjRGMjc5RDM1IF4KKzNBNzJGOEVGRTY0Q0Y2MEQ0OTU4OUFCOTJENDgzMDE2MjBDRUMwRUQgXgorRjFGNTkzOTQxOUUzNzUxODJBMkFBOTI4REFFM0NGNkMzNzhFNDU4OSBeCiszRUMxQzFCNzRCODg4MUY4NkMxRDNFREU0MkY2Njg5QzYxMTMyNzEwIF4KKzcxNjRBNUI0QTY5QTAwNEZENzZFQTRDNkNERkUwMjczRDM1Q0ZGNzEgXgorMjI0MzI1QTMwOUZERjIzNzhDNTc3NkIxNzUxQkIwNjk0RUQzMEMyOCBeCis2NEUwRkVDQkY1Rjk0NTE3RUE5RTBGNEUxRTE2RkM3MDBFRTI3NUI4IF4KKzY5Q0RGMzMyMTg1MEJCNjQwRDUyMzFEM0IzNDU4RjgzNzM4Q0NFNkMgXgorMDY4NDM0OUEyQUJFQzA2Q0UwNTEwMEVCNjlEMDFDRDRGQjdBQjE5MyBeCisxREZBNDkyMjVDMEZENzI1MDQ2QUZDQUZFRDE3QjFBQkE2ODcxRkI3IF4KK0VDRjRCMUI5Qzc4QTgwMkY3NDhENThCRjZFMjdGQUYxQjI3NEVFQzMgXgorQTQ0QjY3RUY5MUYyQUFBOUVCMkRBOEIxNjZBMUEzMTY4ODZFODkwOSBeCitDRjM4QjBGN0RERDJGNzJBODkxQjQxQUQwMjZGQ0MzMjgyMjE4NzQ3IF4KK0Y5MTcwMzNENDQ5NEExQ0NDODU4MEMxREJFRDZGMjhGRUIzRTJFNTcgXgorM0MzMjZGNTUwMDM5RjgxNUVDRjVFMjM2RjZEREU1REIwRTJFOUY2NSBeCis3MzMyMDAxMDAyQTExRkRBRjUwMTkxNEE4NjczOTg2MjUzOThENUNEIF4KK0RFQTE4OURDNDFBRjY5NTEwOUFEQ0Q5MzkwNkVCNTM3MkI1MTJBNTcgXgorRTBGMTRCQ0E5MjQwQjI3RTQ0NjQ3RUNFQjRBNDA0MDhFMjg4MERCOSBeCis3NzU0NUVGODQxNDZGOTUyMjEyRDlFMUZEQkFGNjIyNDNDREE2MzBBIF4KK0QxNjJGNjU0REVCNUJCMEQ1NDE3OTMxOUQ4REY5RjFCQjZEOEExM0IgXgorM0JGNzkwMDcyNTI1MzdDQzJFQjExRTE0ODg0MkU3QUM0NDNDQTkxQSBeCis2Q0IyRjI5MUM3MTk4QzlFNDExMkI5OTFGRDREODI5REJBRDdFRkIxIF4KK0M4NTAyNTgwMzY3ODFDMEFFOEEwODNENkE3OTFEM0ZBRUM5NDZDOTkgXgorREM2NEM1MDM3QkRDOTNBM0QzODYxM0QyMDNGQjNEN0M4MkExOEEyNCBeCis2MjBCNzcxNDI4OUZEODJBQkI5RkM3NzZCNjQ0NTcxRjcyQTk1NTdGIF4KKzRCRUJDMUVGNDRDMzBCMEIwMzMxNTNGODgzRDVDNThFNEFFNjg3NkQgXgorRTM4MTVBNEU2QkYzQjUwRUUzMTJFNUE3OTVCM0U5QUEyRDc4MzJBRCBeCis5Q0IxM0QxOUM2NDc1MjIwOUQ1RDRENzAzM0ZBRjlERTg5NjBDMTQ3IF4KKzMxODJCOUYwM0QwQUJBM0JEOTFBMUVCOENERDBGNDY1RkQ5Q0NCNTEgXgorNzNEOEU4QjlFNkEwNEU4OEUyOTc5N0NDNUUyRjQ4OTM1MEQ5NzhBNyBeCis3MzI3MzRDQ0VDMTg5NDRCQ0E3ODRCOTUzRENDMEU1ODIyMjVBQjg5IF4KK0EyMTUyREIwMzA0OEFFMjdCNDdDMjVEREY5OUQyNDk1MDRBOEFERjEgXgorQUI3MEIzMkEyOEQ5QkZBQUUxQ0E4NjhDNEExNjFCNkQ0QjNBOTJFNSBeCitBQjhCOTAwODVCNDcwNTBCODdGNEJEQUZERjk3MTc5MEI3OTUwOTAwIF4KK0IzMTVBOEM4NzAxMUJBQ0E5NjlBMUI3OUVCQUM4MEE3MzQzNzQyRTYgXgorQjc4QTA0NDkwOENEQTk2NDA2MzNEQzhCRTgyOEUyMkY5MEU2RDdGMyBeCitBQzJCQzUyNDZDMUJEOTkyMzFDRENDRjNDRUNERUY1Njg4RTU4RDcxIF4KKzA2NzlGODg4RjhDMzUzQjgwN0Y1NDRDMjM3OUJCNUE0QUU4RUI5QTQgXgorNDY0QjU3NTRFM0Q0Mjg2NENDMEE5OEI0RTY5NkM4MjdFMzI1NDMxNyBeCis3RTUzODVDOEExQkZGMEZGNDc2OTA1QkI2Qjc1MTVCNkQ0MzhDQzBEIF4KKzBGNUM5NjhDQTJGQ0I0QTE3RTBBRjBCOTQ2ODJCM0FDMzQ3QzJEMTIgXgorNEY1RTM1MzUwMEQ2M0M5OUY1OEEyOEY1ODcwMDY0RkEyNzhGQzdCQSBeCitFN0ExMDQ2NTFDNEQ2REZEMDc3OEVDOEFDOEU0RjAwMUJDN0I5REQzIF4KKzIzRENGOUE4NTREMUQ1QjU1OTlCMTRBMEU5QTE5QUI0RjJFM0JCNzcgXgorNTg4RTQyOUZBMUMzMDU1QzREQ0M5OUVFNTQwN0E2NDExNUI1NDM0NSBeCiszOTIxNUFDRTAxNjY5Q0FERkI4MUU5RkIwODU3MTBFQjVCOTc0NjFCIF4KKzIzNTY2NDQ5REQyOUEzMTVENDEzNjA0QTJEQkNGQUUwRDQwNTc5QTIgXgorMUVBODdDMTNEQTM4RkU0QzU5NjkxRDk2QUY1OTBFQUYzOTA4QzBGMSBeCis1QTYxNzBGQzZCRDdFOEMwMTE0MEUxNkYyNDhDNTY4OTBCNTEzMjNBIF4KK0ZGMzI4REZCNTA2QjcyRkRCOERGNTcxNkUyOTFBMTgzMEJDNTM5RDQgXgorN0I0REE4NDZGOTA3NDI1NEM2NzZGMDA5NDhCRDRDOTY5ODE0OEM0RCBeCisyQUMzMTAzOTNFRTFFQ0M1ODQ0QTRCRUMxNUE5Q0ZDMUI1MDIyMjk0IF4KKzNBRTM2MzE2RkE5NEIzNjlENzMyMEE4QjcxMzA0Q0U2NDkwRkVDQ0QgXgorNzA3OEM3MDQxMjc1QkNCRTg0MDNERTI0RDE2QTY0NkI0NDYyODgyQiBeCis4MzI1QTg3MTZBMkM4Nzk4ODhCQTlGNjc0Qzg2OUIxRkYzMUJGMzYzIF4KKzU4NjIwMEI1NUI1RDUzN0I1OUI1RTBCQzZGRDlCQUNFMUU3MkM2RUUgXgorMEI2NzVFN0Y0MzQ3NTZGNUUzMTBCODBCNThGODYxRTc4OTQ5NUY1RCBeCis3NDlDNEMwODU2Q0M0NjI5REMzOTc2NzhDMEU4QkRDQkQ2NDlBNkUyIF4KKzI1MzI3QzY2RkY0NkM0NDY2RjgxRUU2MzVFOEVDMDJDNUNBNjBGMkEgXgorQkQ5REZCNTlFQjVFNTNCQTY5ODg3MzRGQkUwODk0MTk0QTExOUQzMyBeCiszMDg0MDQwRTVFQ0E1RTc3NDA2QjRERjNDQjdGMzI0QUNDOTZCNTA2IF4KKzFFMTRBMDlGRURCNjFDRUJFMjU1Qjk0RjUzM0M0MDE4RTVBRjRCQUUgXgorQzg4NDBDMDUxQTIwNEY4QTEzNDIwQ0YxN0ZFNzdFRUUyRkQ3OTQ1RCBeCis0NzkwMjY1QjUyMzFGOUExNzM4Q0I5Rjg0MjNCRUVGMjE5REYxMTBEIF4KKzM1NDk0N0MwRjJGMjVFQjQ5MUQyMUJEMEJEMUQ4MDlGREQxNDBBNjYgXgorMjM3NjJCRjNDREYzRjQ4NEM3MEQyMDAzQjU1RTZGNDQ3QkFGNDZGQSBeCitFNUJGQzk5NTU1Q0VENUMxNzQzQjE1MkE2NEFFMDhDOUVEMTM2NUQ2IF4KKzRDQjQ0REM1MDdGNzE2QkVENEI0Q0FDNzQyRTc5RTFBMkRGQTMwOEYgXgorNjI3OTBFQzE0RThDRkQxQTBENkZBRjkzRDc5ODRBMUU5NDE2RkQ1QyBeCis1QzJEM0VEOTg4RjVCRDk1NzlEMkY3MTBENURENjhCMTE1ODQyOTVDIF4KK0NGODQxNEVEODVGQTAxMzVFNDRCMzdBOEY4QjQwNzU2QkFFRDIzREYgXgorMDM0MzIwNjRDMUMwNUQyODM5M0M5QUM1ODc4QzlBOUJBQTZFNUM3RSBeCitDMzdBNkQ2NENGODFDREY3REJCMUI4MTUwOUE2N0EwQTFCQjVGMjc4IF4KK0YzNDFEODlCNzVFNTk5MDQ4QTkxMUQwQUU3NTZFMDA2NTY2OUI0RkIgXgorMjY5RTE1MjkyODU0MTRBNzRCNzY1ODZFQTRGQ0VDQTg5NUM3RDFFQyBeCitGRjlCQjM5RjlGRUExRUE2M0Q5NDRCRjEyQURDOThEMUQ0MjU1MDk2IF4KK0REMTE0RjJERjNEOTI5NzdGOURCOThBRUMwNEYzNjdDRkY5RkJBMkQgXgorNjlCNTNCQjEzMzc1RjlFMTIzRkMzMDA5OENEOUVEQjNDMUExRkRGOCBeCisyQTYwOTg0REM3OTY4MkU5NkMyOUNDNzA1MEUxQUNGOTg4RDlFNEQ2IF4KKzA5QUM0Q0ExQTQwQTdEODNBNDYzQUYwODA0QzRFREEyMDhFMDlEMzYgXgorQTJFRTI0NzNDMjcwQTA2MzdGQUFGMTdEQTU0MjM3RDM3RTBDNjk2MCBeCitCM0E3ODE3QURFOTYyRENFRUE3RkI2Rjk2MEVCRTJCQzFGOUJDQkE3IF4KKzg1QTQ2Q0NFMDFBNzk2ODEwNDQ5NjIyNTQ4M0VDRTJDMTk4RjJBMjcgXgorQkMwMjhGNUVDRDg3NzNBRTQ3NTYzRjEyMTZFMEJDMzZBOUUzN0U0RSBeCitDNjVDNDBDQ0MzREQ4MDA0NUQ2QTRFRkYzRTlDN0Q2RTRFMEU1NTgzIF4KK0JEOUMxODlBNjM5RkQzRDcwMTY3MzY3REY2MUYxNDg2OENFN0UzMTMgXgorQzY4OTlBODRCOEU2NjU0OEJGQjUwNzgxNjMyQ0MzRDJEMUJFOEI5RSBeCis5MkYzQzhFNDM2MjI3OTc2RjMyRjAwNTQ2OURFOTFCMjM2MzE1MERDIF4KKzdEMkE4MEE1QzVDQzg4OTg4RjM4MzM0QUZGRTMxQzA0QUExQUZDOUMgXgorRDYwRkFDRkE1N0Y2NjNDNEEzOTlCMUZEREQ3NTk3MzkxMEYyNzI5NCBeCitDRUVCOTY2MUJFRDJFODlEREIwN0EyMUVFQkY1OTBCQjFBRDY0NEEwIF4KKzA0NjVDOURGMkUwODg2QUM3OUY0NkJCQkVCMEEyNDNERjdENkJBQUEgXgorOTgwNzMwMTM1OTdCN0FFODRDQjg4NEJEOTMyRTIwRTZDQjQ3NzA5QyBeCiszQ0I0Rjc2QjYwMkJGNkI1OEIzMTZBMkQ4RDE2OUQ0MzJGMDJDRTIzIF4KKzVDRDRFQjA1RTg2MTI5NzRCRDlDM0IxOUU0OEQxOTJCRThCOTZBMDkgXgorQkIxODhENUZERTgwNkJEMzA2NDhCNjA1ODE0M0YxODAyRjE1RkExMCBeCis4NEVGMUQzREU1QzExNDRDMkM5MjhDRDREOTA3MEE2RTc5NTQzNDE3IF4KKzczQkUyQUE2NkY1RkQ2QkY2MzI3M0VBMTM2MzUwRDI5NDkxQTMzMDUgXgorNTNDRjNCQjA3NzYxOTEwQkJCNDg2QzNDMEM2NDM5NDNENUJGMTdDMyBeCis5QTc3NEJEQkQyN0MzNzA0ODcxQjUyQ0Q1RjdGOTI0QzhFRTRBNjdEIF4KK0IxMDZCNjU4MkYwRjZDOUUyRUZCQzQ4NjBDRkM3MDI4RjJDNDdGNzQgXgorRkVBRkY0NDI5OENCQjc1MTdCMTRCODFBNkFBRDUwMTgyOEM3NzNBMCBeCitCNUJCNDhCRUQ5NjlGMTVEMTYyMzAxOTY2QzUzN0E4MUM0MENGNEIzIF4KKzM0OTVEN0UzNjc0N0I4MjREMzM0NjVCNURCNzJENkM2MjNFREE3MkYgXgorRDdGNDkxNzhCNDM4NDdEOTk4NEI5MjNERUFBNkRFOTU3MTY5MEI5MiBeCiszQUI3RTI2QkRCMDQwOUU1NTA2M0FGRkY0NTZCN0EyOUNGMDk4QUYwIF4KKzc5ODRFMTU2NUJBRENEMjI0OUVEQ0EwQTNBQURCNDM0NjEwNEE1NTYgXgorNDJERDk5QjQxODAxQjBDMzQ3NTgwREYxRkRGQjIzOTdENTVEMkE4NSBeCis4RDU5QzAwNDAxRUZCMzE0QTBERkE0RDgyRTFEODU3MTFDNzdFMjQ2IF4KKzUwQ0Y3NDg5NEY3Q0Y1QTlGMzdDMzdCNDczMjcwNDdFOTEwRDg4QTEgXgorMUZDNDBFMjg0MEM0QjY4RjQwQzIwNUI2QkIwNkMzRTEwNkI2QjhEOCBeCitBNDlGNTZERkMyOTM0MTE3MzZGMjdDMTlGQTJBMzYyQTU0NUM3NjFFIF4KKzIyMUU0ODg0NUZFOEIzRDJDNzlBRkVEMzc0MTRDMEQ3MzJBNjlGNEYgXgorQUZDMTJFN0JERjlGNDhGQUIxQjU5NUZENjU2Nzc2QTM5RjBGNkNBOCBeCis1RUFBMTE0NDkxRTg4OTM4Mjc2RkMzQUNDREU2NTk2MjNDMDI0QkQ3IF4KKzUwODE0NDRDM0Y4MUUxODExNEIyODkwMjBEOUFFQzc1RkIyMDU1OTcgXgorRDRGNjkxNTZERTg1QzYxRTlCNDE1MEFDOUY2RjZBNTRGOEUxOTNBNiBeCiszRDdDN0VGNEQzNjJERTEzN0FGMDYyNTkyNUIzNjgzN0MxRkM3NTcyIF4KKzU3NUQ3NzJGOUMxQ0JDQThGRjM4MjQzMzQ4RTBERkUwMjY0M0MyOEMgXgorMEM4MjFGMjdGRDgyQzU1Q0I0RDc2RDM4NkY0MUREQzkyRjc5NDkzRSBeCitDM0QwMTAxRERGNTUyQTExQzhFMUVFNkJGQURCNzJBOTgzRjM4NTcxIF4KK0Y0RDY1MDQ0MDEyNzM5MEYzQTNDMkVFOTkxQzE4NUNFNzY1MEZBRUIgXgorNTQ0NjBGREFGRUYzMDIyQkMyQzdEMUQ0OTdDQkU1Q0VENzM2MjRDMiBeCis5QjNGN0I5RDU5NEFBRjZBMjZGNUMyMUJENkU0NzE3RjQ2MjY3NDE4IF4KKzE0RTJCMzRGMEIyQzg5REFFMTczMjQwMEMwMkUyQ0ExOUE3NjdGOEUgXgorMTA3MkFCQzRERkQyRkRDNkMxMTQzMTREM0MwODQ1Nzc3MjQyMTcxMyBeCitDOUVBNEIwMjBDMTFERUI3OTREMUQwNTk1NzQ3M0E0NkE5MDZCNDcyIF4KKzkwQkE0MjcyNDY0QTAyMDYxMkYwMDg1QjdEQjkzNjdCN0JBOEUxNUUgXgorODcxM0EzOTk3QTNDRDVEQTg3RTk3QUI5NDg1MUI2OEU3NDgyNjhDRiBeCiszNzAzNThENTRDODE5NzAzRTIwRUY2M0EyNDk4Qzg1ODZCNDhENDRFIF4KKzBERTQwMjQ5QThCMjE1RTk4RTg0OTAwOEZCN0NBRTgwRUMyM0Y0QTYgXgorQkJEQjk2MzA2NTk0RDEzNTk4QkIwMTA5MjU4RTQ4OEQ0ODZEOThFNCBeCitERjdEQjlDQjJGRDhBODY4NTRDNURFRkNFNTlDNEUyRjAyNDVGNTgyIF4KKzg0REUzMkVEODhCM0QyQkQ1RjRFMzNCQTMzOThDRDJFQzFFOUJERjMgXgorRDIwOTY3ODQ0RkVEMTFDQTcxRDI4RDcyQjI4QUNGREIxNEE3REJCMiBeCitCMTNBMEE2QTc3MjNCQ0Q5MDk4RTJCMDRGQTA0MzIwQzRBMEU2MDVEIF4KK0JFNjZCRTM4Rjk3RTdEREIwMkVEQzhFMEFDRTk3Q0RGODNGMDM0RkUgXgorMjhFQ0MyNUZGQjM5NEFBOERFMThGOEFERThCMzU3Nzk1NTM0NkZCQiBeCis0NTA2OEI2QTBGNjFEMEFFRjcwOEFGN0Q4NDg2ODNEQUJFODE3QzJDIF4KK0VBQUQ4MjlDMzJDM0FENEVBRUE4QjdFNjA5MEE1Q0Y2QjJGQ0FBODIgXgorRjQ0NUZFQjIyREY1QTlFNDlFMkNGN0FBRDdDQzFGNUY3MkYxOEI3NyBeCis3M0M0MjRGQTBCNzg2M0YxRjE3MEE4NTBGNkEwRjg1Qzg3ODIwODQxIF4KKzcxRjAxNTVENDBDQzU1RjNENjRCRUE2NDU2MDhGRDE4NEUyNTQzRjIgXgorNDU0MkZGQ0Y1MDI2N0I3NzUwMkQxQTBFRDBDMkE1MDUwQ0FENTIwMCBeCitGQjQ4RjI2RjMyMEQ3QTRCODAzRUQ0NTlCREY5MkJDMUY4NzAzNjMxIF4KK0M5RjlBMzdFMzRCRUE2MjIwQkVCQzE2N0UzNEIwQkFDNkI1NUE2QjYgXgorQjBDODM2Q0MyODMxRkI4QkZFNTk4ODM2MENDMzlGQUE2QTkwNEE4OSBeCitCMENGNzgzRDg0QkY1MzgzRUYzMEVGMjA3MUUwRkJBOUFCQjU1M0VBIF4KKzg0MTFDOEQxQTRGQzNGMTMwMTQzREVDNTIzMkI1OUJCRERGMTFCN0MgXgorQUNCNkQ5RUIyMkQ0NzRDRkQ1ODM2QzhDRTIyRjM4N0UxMkRDMjBCNyBeCitENTgyRkEzREUxREM0MjVBRTZBMzk0RkU1QUMzMjFERkU5NkI5MzA1IF4KKzE1Q0EzMkQwRTI0NkYzOTVERTIyRkFGOEYwRkQ5MDAzNkM0MDE2QzggXgorRjE4MzJGRUVDQkZGRjEzMzBDN0E2QUM0N0Q2RkMxODgwRTc5NTUwRCBeCitDNDg0NkJFQTE1OUQxRDQzNDI3Q0I1ODAyQzQ2RTQ3OUY5MTU3MzkyIF4KK0M4NEZGMDlCQTZBMkVFOUJEMTk3MkI4QzBCRjI1MjQwRjVBN0VFNzIgXgorNEU2QjRGMzYzRDdGREI0MDgzQUE2RjVFNzk3OTk2NkZCOEZGNkM1QSBeCis3QTU0M0I4MUNCNERDOTMwODFEOENCNkFFRDQzNkEzMUM0MDE4QTg0IF4KKzg1OTkwQTFDMzVCODZCQTI0NEY2MEJBMEVCRDZGNkU4MDE1NTJGRDQgXgorRDNFMDdGNUQxNEFFMjE5RDNDQjU5QjAzNDc2NEM0MDA1NkJBOTVGNCBeCitGNEM0RENDQzYzRThGQzU0MDJFOTNDRjUwNTMzRTUxRDFCRUNFRDQzIF4KKzM4MDZBRkY5QUQzODU5QjE1MEYxRTJBNDBGQkMwNDdGQjYyNENCMTQgXgorQjUxQTRFNEZBMjEzRDIyNTQ4Q0ZGMjgzMjNDNjY3OUQyNjkzMTEwQSBeCitBN0M3MEMxOUJBQzEwNDA2OThDN0FFNkEyM0IwNjg4QjU4NDA1MTUzIF4KK0U3NEZEOEM0NTc1ODFDRDA5Rjc1RUUzRDQzNDg1MTMwNjA5RkE5QjcgXgorODZFRDFFNDlENENBODY4OTM0RDdDMjU0RDNBRTBENUJGNzMyM0NENyBeCitBMTY1MDdEQUJDM0EwQ0Y3MTM3MTUwQzRFNkY4OEQ1QUM5QTBBQTNDIF4KK0REQzc2RDdCQTU0MzU0MTEyQzJEN0QzMUUxQTgwRjAwNDg1NTFFNUUgXgorRDk0M0Y2MDI4MTQ2RUVCMDM4NkJCMzA4NEZEMzU0Q0U4NkFCQ0YwMCBeCis0QUJDQUI2NUM3REFBNTJCREJEMTNCQ0M5MDk4NjQzRjVBMTY1MzI5IF4KK0Q3NUZFMjIxNjJDNTM4QkExRTI2ODdENjZFMjkyM0NFQzczNzVFMDEgXgorMUExMUEyQjEyRDkzRkIwMzBCMEMzNDQxRDdBQUMwNkRBRDZGQjUyNyBeCitGOEYzRDQxNEMyNkQwOUM2Q0ExQjg4QkU0NEJFNjlBQzg3OUQzQzVDIF4KK0QyRDBCQzk4Nzk1NzQwMDAyQjJFQjZFQTZBRUNBNTU1OTM0MEI1NEIgXgorQThBMzgzOEJBNDVBQjZCMDVEMUQ0NjRFODY4MUFENjFCMTM2QjZBNSBeCis1QjE2MjkyMzIwMDQzOUQ4NzBGNTdBRUM1ODRBNjdDQTJFODkzOUI5IF4KK0E4RkUwQjU1Q0ZCMTVEOTc3RTg3MTE1MjkwNUQ4RkRCMThBQTZCNTkgXgorMDJENUQ0OTI4OTY5QzdBODUyQjVBOEFDNzcyQTNEMUVCNDI0QzlBMyBeCis0RUNFMDhERkYxRkRFMTI1OEIxQkYwNDIzRTFFMzFEODNDNTc1NTdGIF4KK0Y3MDE0MzBFRjZDQjU0QkYwRDEzOEI1NEZCMTNBMUI1ODZBMUNEQ0MgXgorRTMyNDJBNzExMDZDQjc3RDI1QTYwRDE2NEJEMTdGRTA3RUFDNDk1MSBeCitEOEIxOERFODYxMzI2NzJFREIzMzAxOTBCRTg5NUUzMTA2RjkyRDJDIF4KKzhDRjA1RkYxMzg3QzYxQThDQzM3MjRCQjEyODNBQUQzRTJGODVFRUYgXgorNzk3QjMxMURDMkI1RDE0QjUyNzdFNDlBMzhBNzg3RDNENkE1OEMyRCBeCis2NDcyQkM1ODgxQTYyQkE5NTY1MURCQjNERkY5QjM4ODU5NDlDOUI2IF4KKzg2QUVENEI1M0Q4NjE3RkMxMzVEMEUxRkNCNzYyMjcxQjI1NDVBNDUgXgorRTNDODg4QTFDMDAzMDFBQTdDRTIwM0E1NTkwRDgyQzFDRTc3QzZENCBeCis4QTA4MUE3QTY3MkY5MTQ5M0FDMDlEOTVCMjlGQUJEMDQzREE4M0REIF4KK0Q0N0Y4NzAyMkRCNEZBRTU1MUZGM0ZBMDlGRkYwMkQ5MkQxMTI1MjcgXgorQjIyNzFFMzc3RTlCMTU4QUNCQ0ExRURBRTBFRDZCQTRDNTlDQjcyMiBeCis3MUVERTBDOTQ4OEEyMUU2MjQ1NkQwNkVFMzkzRjM5MDQ3OEMzRjMxIF4KKzQzN0ExQjcwOTE3NjU5ODAyMEVCQTFFOTIzODZDMzk3OUExODkxNUQgXgorRTNGNEFDNDM4NDg0ODA3MUM4QTlGOTg2ODM3NkQ5NDFERUMyQTlGQiBeCiswMDQ0NENBRjZBM0Y0MjEwRkQ5N0RDQjhGMTBGNDNCMjhEODkwNjAwIF4KKzlCNkJCMzUwRTMwQ0VFMjA5Qzc3QTNFMjBCQjZBQ0U4Njc1NDYzMTMgXgorOTM1RDI2ODhBRTJCMTZCNzlCNTE3QkZCNzlENDhDRTdFNEYwRjRFOSBeCisxNkIyMUYxOUFERTdCNkRFRTY2NUQ0NUE4NDc0OTFCN0YwNTVDNDZEIF4KKzg1MzM5N0MzNTY1QzgwN0FFNzJFREZBMzdGNDE5OEU4MDExMDNGRDQgXgorMTA5OTJDMkZGRTUxMjcwMDZCQUZCMjE3MjM1OTcwMUFCMTBGQTRCRSBeCitDODJENkJBNEJBNjIxRTM2ODcyQUNFRTRBRTNCREYzM0MyMzgxQjA3IF4KK0Q3ODUyREJDOEZGNTkyRTA4QTFGMUVFNTdBNzBCRUZGMzI3RDhFQkQgXgorQ0Y2NzMwODQyMkYwNzI0MTVFRkI3NUI0M0Q1QjY3QzdGNTM2MkIwRCBeCiszMERERjM1RTFFOTkyNDNGODUzMTFBMDk5NEQ5MUI4QUE1NDNGNzI5IF4KK0RCMkZFMzQwRjYyQTg5NDAwQUU0QTE2QjYxNDM1MjA0NDA1MzUwRDMgXgorNzQ0OTgwRkEyNkRFNTAzNzQzRUVEMjk4Qjk2NkVENUZBODQ3MURGNiBeCitEMkM4QjgwM0QzRERCNTRDREU2NDY0RDEyNkNFMzAwOUE5RjBGQjczIF4KKzg4NTcwMEVDQzA0RUI5Nzk0M0E5QzEwMEVCNkVDNEFDRkU1OURGODEgXgorNzcwRjlDQUM1RDRFOUM4NzhBNjYzNkVCMDMwNkVFOERERjBDRjkxNSBeCiswM0MzRjA1NTNEN0NGMTZDRkUzRDNGMDFDMEE0Q0UyNkE5MTQ1MTJDIF4KKzkzQjMwNEJEQjEzOERCNjc5MERGRjhBODRGRkYzRDM1MDY3NzBDREMgXgorRDVDNUZBMDQ4OEM1QTZFMTQ3NzBGMjE2QjU3NTk5Nzk1MEE5NDE4NCBeCisyRjY5NUI4RUIxOEMyODI1MEQ3QzhCMzVCQTAwMDA0MkVBQkRCMjQ1IF4KKzAzNTNGRkE3RjcwODVEM0I3ODg4Rjk2Qjg0OTg0ODZFRTdERTE2Q0QgXgorMjM5RkUzQUFDMEQzNzM5RjVFRUVDODJCMkJGNkY1RjQ3RDA1ODU0OCBeCisxNkRFODY4NDM5NUNDQThBNURCQUM3MkVDRkFGQTRCQzNEQkZDNUQ2IF4KK0FFQjJCQTc0MjcwOERCQzA0OEIwMUZENzdCMTU2MENEM0EyM0U3MDcgXgorRkFBRTE3OEI5NzE3NUE3QTY4RTUxQkQ3RUVDMDYyMzQ3MjNCNjcwQSBeCitCM0YxMzExMjQ3RDkyMDExMDk3Mjc3MkMzREMzMEY3ODlEM0ZEQkFCIF4KKzQ2NkY2ODI4NDJDMDdEMkM3NzBCNDFCNjZBNjZCRTlGNjY1MUMwNDYgXgorMzk3MjRCRDI5MTM4Rjc3NkVEMjA2MzNCNjZBM0EyNDFGQUNEODE3RSBeCis1OTMxRjE5QTE5ODVDRDVGNzE3MUE1RDJCODFDRTFDQjNCQThFQkJCIF4KKzI3REU1QzMzQTE4REYxQTczMTA1MUQ2NjQ0REU4OTAwRTMwRTI0MkUgXgorQTRFMUM0RjIwQTM0QzAzMzU4OUVEMDk4NUU4MDE2OEEyOEMyMzc3QSBeCis5QkU4MjBCMTM0NDc1Q0EzMTUxM0VFMUM3OUQwNkUyOTlENzBFMDE3IF4KKzk4RjM5NkQxNDdFREYzRDMwNzlBNkIyRENEREU5MkQ0OEM5Q0M1MkIgXgorRDYxMDg5MDE5MDk0MThDRjdFN0FFQ0Q5RTREMUNBMTIxRTk5MkU5MCBeCitGMkU4RjBGRjFDNjUyMzU2RTYwNTY2NDRCODFGRjgyNzBBMDdGNTZBIF4KK0VBMTY2OUVENTA5MTIwRjJCNDJDRkE1NDdBM0ZENjAwMkZGQjg2MkQgXgorMjE5QkFCNTU2NTNCMDNBM0NBNzg4NjIxMkRGMjdCMjNDMDgyQjJFMCBeCitCQkU5NUY4QkJFRUI2RjlBMDA2MkQxNTFBNzE1NTYzMEYyMDEwQjg4IF4KK0ZGNkJGQzkwRkUzRUFCMjk5ODkyQTVEOUNBNEQxN0RGMkM2QzYwNEUgXgorOEQwRTFEQkZDQzQxOUFFQjFDNzgyN0M3NjQ5MzMzRTM0QUM3RTMwQyBeCitFRjM4NDdGN0ZFQTA1NEYwRTA4MDgzNkQwRjJCRkI2NzZFMzU3M0VFIF4KK0Y2MEExNUU2QTI4QTVDQ0M5QzRFRkIxQjMxMDdBNTRDOUFBRUMyNkMgXgorNzYzMjhDREU1RUZFNjk2MUIyQ0VENEUzNDU3RDIxOTIyOUUxNjFGNyBeCitGRkFGMDNGQjYzMkEwNDJCODM3Rjg2NjA0MTJCNzJCMTA5OTM5NEIxIF4KKzIxMUJBNjY3NUM1MkNCRDlFN0Y1RjVCMzY2QTY0QTI0NjY1MzJBQTcgXgorNTFFMDVCNzQ4MTM4MTM1ODc4MkZERjczQ0I5NThFMTQzNENGMzMzMCBeCitCQjVDRUFEMUYzQjY4MjI3Q0IwMzJCMkI4RTVCNjI3NDYxMDcxNjM3IF4KKzNFQkNGMUQ3ODk5OEQ0RDExQzA5NEJGMjhGRDUyMkVBOUY1QTFFMzcgXgorM0U3MTg2Q0IxRDM5QzY0Q0VGRDI4QkRBMkNDQUEwNzNFNzFBNTMyNyBeCis0MTVCNkEwMDgzMzg2MDU0RDNCNzcwMjZBMzg2NTRENDVEM0JBMTA2IF4KKzIyOTczNzIyNTY0NzlFMzFFMTM5QUExNkU2M0MyN0MyMDc1MTlDMEMgXgorNjVBNzlGQzRCMzIyRjY1NUFEQ0Y2MzQzMkQyOTUzNDlGRENBOUU3QiBeCisyRDExMzBFRTZFNDE1NjE1MUM2MzdCNDY1MjdGQUM1NEQ5RTc5REY3IF4KKzgwRTE4REU3Qzc5OEYwNDBDMDA4QjNCRkUzMDU0MjYxNzQwRTE0NDQgXgorMDcxMEEzQTMwMDI5MENDMUMzQkFCNTZDRjAwQTY4MkMxQjcxMUJCNyBeCitDNkJFNUUzMzdBMUE5NzZDMjUzQ0JGMzU2Njg3RjM1OTU0OEI2QTNFIF4KKzNENkU0RTUxNDI3NzIyM0JBREU2QTMxN0M0NzhGMTdFQTZFQkM5REMgXgorMjVDNjZDOTA0QzM1RUJBRDI2MTNBMzBCNzMyODNFMEZDMjNDQ0MxMCBeCisxMjU3MDlGREZENTExMTgwQjA4REI3NzM2NkRDN0U1QTJCNDZGMENCIF4KK0FGQjVDNTNCQjI3MjgyNkRCN0ExQzAzMEI4OUM3RjNBRTk1NkY2NUEgXgorRDE2NkU3MUQ4MTQyRTI2RTU4RTBGN0E2OUM1MENGMTlDRkUyMjVGQyBeCis0MjYwMDcyMzVEOEYwNkZEQ0ZGMjBDRTdGRDAwRTk5NEYyRkM0MjJDIF4KKzhDQTI3MzAxNjNFQTgxNkJGOUI2M0NDNjUzQjQ0M0E4RThCRDc2NTYgXgorQkIyREE2MjNCNUZEMTAwMzJCQUZBMUEyRjlGQjFFMTNGNzRBQzRFQiBeCis4MjIzOEVDM0M5MEJBRjMyMjc4ODVCRTc4NTM0QTFCMDgyMTM2NjBDIF4KKzY0QkEyNzVFRTk0MjIzNTZFQUMxOUE0NkE0QzVDOUJEQjRENjNDMDUgXgorNDk5NTMyM0I4NUZEMzg3OTYzMUI0MzlCRjRGOEQ3RDM5NjM5QTdGQSBeCis0MUY5NUI1MTI5OTFBNEUwNUIyMTk0Nzk4NDIyODU5MDBERjg0MjVFIF4KKzNDRUJFOTI5QUM3NjNGMkZEODVGMjEzNTRDOTE1OEU1MTY5QTg0NEUgXgorQkFENUQ1M0Q2N0NCQ0Q3NzY3QjYwMDk1NDZBOTFENTkxODhERTk5RCBeCitFOUMyOTA5RjZGMEEzMDc5ODkwMTkzQzg3NzJFNzQ1QTMxN0M0OEIwIF4KK0JCOTdFMzFFOUI4RUFBOENFNzU4REQ3NzVEODMyNkY5NDcyMEUxOTggXgorMTA5NDcxQTFDM0E0MjdDNjVDNEJCQUY4Qzc4NURCOTlDNzQ4RTVGQSBeCis3NTFEOUNDNjRGMDAxNzZFNDI0QTFGMzMxQzYzRUFGMjkxMEE3NUNCIF4KKzI3RUMzOTVCMDdGQzc0MDU2OTYxMjc0MUU1Q0YxM0E5QTYwNDgwMTAgXgorRjY3NEJEODc1NTZGRDBGNzFEOUJGMjNBMEVDQ0U5RjM5QUM4MjA5OSBeCis5M0IyRjkxMDlBMjVDNTExODY1RDE1RTE2ODNDMDY4MzU1NUZGQzAxIF4KKzxECisKK0g+U0hTIFR5cGUgMiBIYXNoZXM8SAorRD4KK0VGQTNFQzg5Nzk3RUUzRjFBNUJFNEI4RDM0NzQ3MTM2Q0E3REZCOTkgXgorRDE0NkQ0NjdFMzIxRTRFQTRDNzNFODQyNDAyOUJFQTQ2MUYzRDkwQiBeCisyNUFDRDMyREVEMzM0QUQyMEREQ0NGMDEwNTlCNkI4Qjg2NEU4RDdBIF4KKzI1NDE2RDY5NjY1MDA3QzNFREQyNDE2MUYzREYwRjZBQ0JEMEU4NTkgXgorNTQyQTI5RTVDMDRBNUI3OUFEMDk4NkZBRDQ5QkU3NDFGMDk5NDJCOSBeCis1QjE5N0UxMDExMjg2RTVDMTMwRjkzNzk4NDNERTg5Nzc2QzM3QzU5IF4KKzQ2NzI3N0VCODg4N0VERTBGMjM2OUM2RTdEMTIyODFFRTNCNTE4NTcgXgorQkMxNjEwMjA0RTE1QTM3RDUzM0I3NDQxMjY4Mzc2Nzg5OEIzNURGRiBeCiszREM3QzQ3MjZCM0VGNzVBQjg5MTkzNzAxQzk5MEY4NkFBNkRFODBGIF4KKzRBRDQzNDhFNTAyMjY4NUM3MEEyQjk4MDY2OTg2NjRDMjgxRTcxMjMgXgorQTMzRTQ5OTZCRDk5ODBFRDUwNUY4QUFBRjBGNkQ2NEU5N0Q3RTYxOSBeCiswNjI4MEFDQzJEMERBMTVFQUQ3Qzk2MzI1MzM0OUM4NkE2QzNDNkM0IF4KKzMzQkUyOTc3OUY0MkVFNTA0QTNDREFFMDQyMkY3QjlDNUNDOTk0REUgXgorNDEyOTQxMjcyQzVDRTM0NEFDMTQ0QjY5RDRCQTVGNjFGMTQ3NEY0RSBeCitDMzNFQ0FDMUZBNzRENTQ2ODU2NjlGOEI5Rjg1OTE4NDcxQTg4RDYwIF4KK0M0ODI3MkU0MkY5MjFBMjc0OUQ2MDQxODk2NUQ4QTdDQjFDN0JGMEQgXgorNDRBQkVFQUQyQzI3ODA5ODA2MkQ5MzQ0NjBFNTY1RUQzQzY0Njg4MCBeCiswOERGMTg1MDA3ODE2RTNFRjAxRDYyMjZDNzJCMDMyNTY0NzhGMjNGIF4KKzI4OUU4OUY4RjE1REQ3MDk3MDFBQTIyQjEyQzY5RThGOTBDOTNGMUQgXgorNUI5M0NBQjM2OUM5OUI4NUVFRTMxMzBGODMzQjdCQjA2RDRGQzA0MSBeCis3QjI4NzJDNThGQjM0MEM5QTFEMDY4QjYxOEU0OTgwQjA0RkRGRjJEIF4KKzYyNzgzNDIxQ0Y1OEVBNjYzNjZBRERDQkZBOTY5NjhGQjEzNjk5MTggXgorQzhCRDczMkQwMTgxMDUxNjk4MTYwQjJGQkMyMDI1NDc2Mjk3Qzk2QiBeCiswMzhENTg3Q0MwNjlDOUI4OURCQzJGRTlEODZBOThDMDMxRDM0MEI5IF4KKzMwNTkwMzFBNjg1ODVEQThGMDlCODdCMEJFMzQxMzk4N0VCMzkwQkYgXgorMUI3NEE0QTk1NzEzMDgzNjA5QjI3RTY3MTQwNzA4RURBMTVGODBCMSBeCis2RUFDRUE2OTkyMkM3QUNFMzhFMDU2MEE5MURBNDU5QzBDQzg5QjU1IF4KKzYwRTIxRjUyOTlFQzcxOUQyODMyQTgyMjY4QjI0QUY2QjI4MTVERUIgXgorM0Q3RDUxNzgyQTUzMkY0RjQxMEFBMkFCM0RDOTE3OEMyMUE1NUYwQSBeCitCMjQyM0Q5NjAwOEZCODAwRTVFMzVFMTlEQTZCRUEyNzQ4NzU4NUUwIF4KKzUwMzhGRTlBRUFDODI5NjZBNEVFNUNDNjlBQ0M4QUNDRjU1RTYzREMgXgorOTBCRjBBOTBGODhGNUYxREE1MUU0NDk0RTJENUQ0QzYyNTBEMkQ0QiBeCitGODU4NDM0RTBBNUZENjFBMjIwQ0M3OTIzODA4MDFEMTlFMEQ5Rjc3IF4KK0MzMUUwQkI0NUZGMURDMERFNDRDNzdDNTNDNTlCMTVDM0JERTlFQjQgXgorREY1NjI4Q0Y2NDQ1QzQwOUI1MUY0NkE4NjQ4OEE5NUREMzRBM0RBNSBeCis3NDRDRENDOUE1MUIxQUQxNEZBRkQ2NzNENDEwNDQzM0I3QTI0NzM5IF4KK0NFQTVFN0I5MTc3M0RGRTEzNjQ5QUNBNzg5MDc3NjlCNUJFQkNBMUYgXgorREMyM0VDMUEwNEY3NDE3RDk3MDRCODQ0RTlGMzlGMzlFQUFCRTZEOCBeCitEMzlEREU5NzI5N0I3RDFDOUZGRDZCNjczMzM0OUQwQjhFODAyNjg4IF4KKzY1MjE5RTc5RjVBM0M2MUZDMDc1NjYwMjU4QTlDNUYxM0ExNTkyNzEgXgorRDJBODYxNjREMTM2NkI2MEYxNDY2NTE0NjQ3NjFCMDEzNTNGOTAyOCBeCis4RTNEMUU0RTA0MzhFQUJDNThBQjk2N0IxQ0REREFFM0NERDlCMDc4IF4KK0VFOUJFRUM3M0QwRTc2MENGRDA1Q0Y2MjM4MkE0NjFDN0RFM0NFMkEgXgorNUM0RkRENjA0NzUxNTk2QkU1NDE5RDRBQzI1NkMzRDk4MjAxMjE0OSBeCis0M0VDRDBERTgzRjA4NzgxNUNGMjU3OTgyOTE0NjExRTRCRkY2OThDIF4KKzFBMUJDQTQxQkExMjdERjQyNjREMzc5NUUyRUJDRURDRDFCRDhFQzcgXgorRkY4MkJDNjkwNDUyMEUxODY4MDNGRkU4NjFEQ0U3RTU2NkQ3NUYwMyBeCis3NjQ1NDZGRkEwMTRERjgyNzg5NzRCRTY2RDAxNDg1MjUxQjhCMENGIF4KK0EwNkJDOTdEQUNCMDdFRjIwNzgwODY4NDk3ODg0MUM0MjVBRTEyMzggXgorNkM3RTZFMEU4OUYyQTA3MEVERjNDNDMzMzM1Mzg2OTk0MkYzRDg4MyBeCis1NzI0MzdCMkIzNUM1QkEwMEVCQzc0NTIxQjEyRDIwRTZGMTRBQ0JDIF4KKzA4NzAzMTg2RTc0QTkzOTdDRUJCMUIyMDM0QTY3NzA5OTVBRjNEMEYgXgorRTRGOTA1NTM1NkFBQkE5MzNFRUYwQzBCMDdCNkZDRTkwMzYxRDIwOCBeCisyMDIwMjAzRUZENEM1RkZBMDJFNTkzQjdBNjU4MDI0QjMzRkIzNjhFIF4KKzJCQjJGMzJENjRBREE1NkEzRTUzQTZENzUwQTA1RjhEMkI1RDdBN0QgXgorQzcxOUFFRTQ3MDhFN0EyNDI0NDBDOTQyOUI3MjM2REZERUMwMkI0QiBeCis5MjRBMjZCNDY2NDkyODcxOTdFMTQyQ0I0MjUwNkM5NkUzMDlFQjI2IF4KKzA0NjNGOTRCNTQ1MkEyRDhCQTNBMERCRkU5QzQ5MEEzNzFDMTk5NzUgXgorOUZCMkZFNTM5MzIzOEVBQUY1ODAzNEJDOTM0QjE5MDc4NEExMEREMyBeCitBRDRBNjk2MkE2QTU5Q0EzMjc4OUFDM0JCQTM2ODU4M0I5MTIyQUY0IF4KKzJBODk0NTk2NTdGOUUyNjg1RDc5NEU3QUVBRjMwQTA1QjA2QUE1NzMgXgorOUI2NUNCOTFEMEEyNDc3M0FDODY3NUZFOTg2MkUyOEE3Qjg0OTU0RiBeCis5Q0I3Q0FERUREMzkxQTM2ODlCMDQ0MjdCNDYxQzQxMTM3MTdCNkM4IF4KK0YxQjkyMkQ3RUMyNDBGQzk5NjkyRUMyOEMxQTZDQzdEOTA3QjEwMTggXgorREUzMDFBMTQxM0MzNkE1Q0I4OTFGQkNEOUNGOTI1OERGNEVGMTRBNCBeCitCMzMwNzM4RDJBRDUzNDQ4QzI4N0JFRUZFNUM1NTgzRjJCODE3QTAzIF4KK0I4MEVCRTAxMDRBMjU4NDBDQUVGNkFENzRDNDY3NkQ1MjQ1NzFBMjkgXgorM0I1Q0QwMTY2MUEyNzlCQTcyREZDMTI3MkU2ODM1NzNCNEYxNkRDRCBeCisxNDEyRDZBMkRCQkM5RDAwNjQxQTcxMTY0QTY5MEM2NDA4NTJCNTZFIF4KKzBFRjUxNDQyOUNBQzk1Q0RDQkU4QTJFNjBDMkFBOEI4OTJBQzVCMzMgXgorNUYzMkNGRjNCMDdENDdFQzEzRUI1NEU3QzM5RTRGNTIxNkZEQkRDNSBeCitCOTMxOTY2MTY5RDE3MURFOEY5NDg4RThCNUUwOTYwMTI0QkM3NDUxIF4KK0U1MDM0RDNBNUE1NzM0NDI3ODFFRjBDNkVFQTdCRDM5RkFEMEI5NEEgXgorRjk3Q0FDNTAxMzEzNTk0NEZERjhCRENGMDJCNENDNjEyNDFCRUE2QSBeCitGRjc0QzkzQ0YzMjUwNkI0RTE3QTBCNTk2QUI1NjQ5ODlGMjBGMUQ0IF4KKzVDQTQyRTMzQkNFNDMwMUI4RkJDRTU2QkZCREI0M0VGNzlFOTU2RDggXgorODdGNUQ5ODFFREZBMDFBMkU5ODg1QkQ1MkNDNEU2NDlBMjMzMDYyMSBeCis2M0Y0Mzg0NEVDRERGMzM4MjAzREZCMTE2RkE3OUNCQUY0RTVDOTJCIF4KKzkyQzVFMkE1RDM4MEQyQkI1RTE5RTlFNjVEQzlBNzdGNEI4QjI1RjQgXgorRTNENzg1MDE5NjlBQ0RENzhBNzEwNDJFN0IwQkQwQzE0ODgyRTQwMiBeCis0RTFGRDZGNUNGRTI5QTBFMzMyNDhGMkUyRUZCNzRFN0UwQTk5NzY1IF4KKzVGRjVEQURDOTNCMkU0NTJBNjA2NzdDOENEMENCQUY3QkQ0ODk1RTQgXgorQ0E0OTBGQUEyRDY3MjNGOUY2ODJENUM5NjU4NjQ2MEQwQzhCMjAxMCBeCis5NEYwOTlDMkZGN0RCNjk0RkQyRENGNUE5QTZCMDY4NTVCMkE5OTQ4IF4KK0NGM0IxRTBEQTdCRTg3MTgwQkYxODQ3REVCRUM3MDY3ODhDNTNCOEIgXgorRjg1MzA1QzRCRjE0OUI5MjA2OEQzNjNFRjE5QjkxNERCOTA2MThEQSBeCitCNEJBRkNBMzE3NkI4MEU5ODAwRTMxOUZCM0JCNzRFNUQ2NUJFQjY0IF4KKzM4Q0NGNTE5MTVBMzg1NTlBOTZFNkYzMjU4MTQ4RDVFNjMyMzA5ODQgXgorNkZGNDNCMEQyNUM3MTcxRkYxNzhERUFCMTNEN0Y0ODhEMjFDNDIxNiBeCiszRTRBMDM0MTUyRDg2RTQ1NjhBMjE5N0E1MzI4RThFOTczNjMyODdFIF4KK0YyMzFENEMzQUJCRTBGREY3N0M3MUVCMkMyOEU1MEFDRDk1ODQ1MzcgXgorMjNFMUE0RjczRjI4ODIzMzg0N0U2NDdDRjg2MjMyODlGMUY4OUU1NSBeCis3MjZEQUVBRTcyNEU3OTIzMjYxMUNCQjIxNkI3NzIyNTk0RTgxNEZCIF4KKzBFNUZFNTEyQjBBRjUyQjQxODMxMTk1MDhDQjAxQUY1MzM4QzYzRTMgXgorNEE1RDNFMTJFQjI5QjIyNDIwMkMwQjMxOUIwODY1MzVFOTlGNUUzMiBeCiszNjM1NzRBOTEwODMwRURDRkRBRUQxMDU1OTc1RjA2MTNEMUI1Qzk1IF4KKzQ4MjBCRTZDNzRBRDM0RDhBNDNBNUREMDEzMENCREUzRjg5MEM1M0IgXgorRkVCNkU1QkY3QTY2RUQ5QjgzOEExMDMwNUY4NTAwNTJEREY5MjA3RSBeCitENTBCMzMxQUQ2OTI1NTQ1MjY0QjY2MTRDM0I0QzM5Mzc1QUIxRjY1IF4KKzM2QjFCRjM5QkY0QUVGMDVGQjA1NEJEMDJGQUQ5MDYyRDIzMzcyMzkgXgorPEQKKworSD5TSFMgVHlwZSAzIEhhc2hlczxICitEPgorOUIzMENBRkREN0Y1RTUyNTIyMUVDMDM2RDU1QTlDOEQ3ODI5NERCRCBeCis5QkNBMzNCM0RBRDIyMDFEMEYxOTgxQ0NEMEFGNDg3NEUxNjJBNkRCIF4KKzhCMDY2OTdFNEE3NURBNUYwMjBDRUI4NjBBMjkwNDBCM0RGNkVGMjEgXgorRjBENDg0MDFBRTIyNDk4RTI4MUNEQUFGMDQ1RkZFQkFBODdBOTc3NiBeCis2MjQ3REY2MkRGNUQ0ODU3QTc5NTk5NjAzOUI1QTYyNzFGN0EyMDMxIF4KK0Q5ODQzM0MzMzcyRjE0MDVGQ0MyNDc1OTU5QjlGMzVERjI3RDMyRTkgXgorQzREMTRCMjg3M0IwQkRGMDFDQTdDMTYyOEVFMDFENjE2ODJDRjFDOCBeCitDMDI3QTlDMDEwRjhFQkU4OUZDODhDMUM5RkI2OERBQjA5QTBDRkNEIF4KKzREOEQxOUYzNUZBRUNERUIwMTVFMTE2MTMwQTBBNEM4MzZBNDJBNkEgXgorOTI4RTJFOTVEM0YwOUQ4RUU2M0NCOEYxMDI5NkVFNkVGNzQ1NUZGRiBeCis1NUYzRTc3MERDQTI4Q0ZCNzExRDA1OTE3NENDN0E5RUMyQjJERDdCIF4KKzQ1MDA5ODcwODZGRDhDMjc1MzMwRTBGMjdFOEEzRUQ4NTk2RDAxQUEgXgorNjBCQzU3RDE2RjUwRTJBREQxNzI0RTBDN0RERDVFNDdEREY4RTMwMCBeCis1OUQxNzQyNzJBRTYwMkFDMDkyRUU3RUYzOTNBQzE5Qjg3QjhFODY1IF4KKzhDMjU2MTRFNkU0RDgyNUQ2QUVERDkzQTYyRDFBMDQ1ODU4M0VFODQgXgorNjk1MzkwRDFFNTdCQ0M0Q0RENDQyODc5RjA5NzhCRDgyMzMyMkU1QyBeCis2RjM1M0VFNkI1RjRCODI3MkU0QTBEM0Q0QkJDQzgzQjFCOTQyNTE2IF4KKzRCM0Y2NzE4NzQyMjBEQ0NGNDlCNTgwMTg5RTZCMTNGRkYwRjUzMUQgXgorQkM2QzQ3M0I0ODI0RDhFMkZBMDREREE4NkE1ODY1RDRBMzZFOEU5MSBeCisxQkZFQzI2OUZEMThEMjVEQzVDNTZBQ0Q4MzgxMDAyMjc3NUYzRUM4IF4KKzNFOTkyMUUyRjY4NTQxM0MwQUVBNjQ4MDE5NDVCNDhDQjc2RTE5NUUgXgorRUVDNzIyMUZCQUM1RjI3QjU2Q0Y2OEMzOTZCN0VCQkNBQTNDMEIwNSBeCitGODZEREQyQTgyMjk1MzJDM0YxODNFQTk5MDNBRDIyOEEyNTIxNTkzIF4KK0ZBMTdCNURGMzNFNDMyNkJDRENCMjdGMUNFOEI4M0JFOEI4RUY4OTAgXgorQTRBRkMwQjQxRDMwQ0U3OTZDMkI0QjA2RTM2OEE1RDM5MDczNTg4OSBeCis3NDVBRjEyQjRFRjk4NUU0RDJGODQ4RDdDN0FEQjZCMzI0MDRCNkU2IF4KKzVDRTRCNjU3NDA5MDMzQkY2N0RCN0IwQ0E0ODBFQzJBQ0NBODAxRUMgXgorMEI1QUFCQzlEM0E4RTg2MTEwM0Q2QjVCOUI5OTRGOUM3NDNCRjA1OCBeCis4NkExMTk4OTgzQTczMjk4QkY0RUI0MUE2MUVBQUMzRTRCMDZCNDA4IF4KKzQ2MEExMDdBNkFGMzI5QjMzMERFOTQyNUIzMDc3NzU1NTUzQUQzNzAgXgorNjJDODFEMDZBRkU4QzhGM0U2NDJBRDQyMzc0RkZFNDg2REU4NkYyRiBeCitGQzFFRUNBMzJGN0U0MzRCQkM3NEY0MzYwODA4RURCMTQxMDg3QkRDIF4KK0JGNDk0QjRFOEQzMzExRjE2N0IxRUFBRTU4QTMzNDM2ODNGMzM3RUUgXgorOTYxMjQ3RDAxRTFDNENDMEQ3MTMwNzYzN0NENTU5RDUzMDUyMUZENSBeCitCMzRGODQ2NDExQkU2MUUxNTM2MTkyMkUwRTJBRjgzRjNGMDNCMjkxIF4KK0NEODQ1QjI0MEZDMjU1MURDQjJDRTQ4NzY0NjY0OENGMjQ5QUU4RjAgXgorNUMxMjRCNjE1RkFDNTQ4REFBMzVBRDAyODdFMDMyRUM3N0QyMjBCRCBeCiszQzc0NzcxRDgzOENDRjdGQUUyREFCMTAwQ0VBN0I0NkJFMkZGRjNGIF4KKzYyODYwREI4QzBDODk3QzczNjlBMUFCNjE3NDdCMDRDMEFFOUY4QTYgXgorQzk4NDAwQ0REN0ZFNzFDN0IzNTQ4OEMxNkQzMzk1QzA0MzAwRURGQSBeCis5NTE2N0UyQkJGQzAzNDlDMERCN0NCN0JEMjAzMEJDMzBGOUYyODZBIF4KKzlGODM1REJCMjcwNzZCNUYwRDg4ODA2MDNGNDE3Q0U4M0EwRDIyNDIgXgorMDg0NDJCNzE1Qzg0QjdBOEIyQzdGRkI0NjAxMEFFNTZBMEM4QzA1RCBeCitCNzEzMkRCQTUyMkM1NEY0MjkwM0NBRUI3MDUxNjc0ODVBQUQzMEIwIF4KKzlFOTlGMDNFRDA4Mzc0RUZBNEY5QTI2NTUxQTkwOUY0MEJFRTUwM0MgXgorOTk5OTc3RTZBRkZBRTA0NTFFOTNFN0Y3N0M3RDE3N0RFMTIxNDAyQyBeCiszMEUwQkI3RjIxNDMzQTM0OEUzQjQ0NkYwOEQ4MENFQUFFMDZEQjcxIF4KK0IzQTQxRUVERjAxN0RBN0IyMEZCRDkxMTFCQTZFMkU1OTg0MkNFRDIgXgorNUI5Q0EzMzFCRDAzRDk3RThEMDU3REZEMzVDOUU2MDBGOTBDNTdEQyBeCis1MzM4QTI1QjMxQ0M5QzY0NTUyQjZGNjc0MkY5RkVCREMxM0Q5NzMzIF4KKzFCM0E1NUJGNkZENzQ4QjNCNjUwRUE1QkU4MzlCNjE1MzBDODcxQzAgXgorMTUwM0YyMTUyM0NFOEJDNUExOUU2QTdGNUNCMEVDMzRBN0U5Rjc1QyBeCis3RjZBMTZCMzAzNzdEM0QwMDE0QjBCMEI0Qzg2MzkxNjBDNzIxRERCIF4KKzhGNjIxRjhDRkI2QUYyMTY3NDZEOEI5OUM5MTMyNjdEQjE0QURCMDggXgorNDJFOTE3N0M0ODdCNEI3MTFBNDQ1MUMzNjBCRDdFMkM2REE3MzQ0NiBeCis1QjI0OTdDQTZFQzI0MjZCMTI2NTNENzExRTZCRkRCRUVGRDRBMzg5IF4KKzMwRjQ2OTBGRDRGMDlBQzhFMjlCOTI2RjY0QzY3MzUzOUQ3RkI2NUQgXgorQ0UxMkQxQUE0OTYxMjQ1RTYwNjA5N0I2NzJFQzNFMTYxMDNEMEQxNiBeCis5QkU1RDY5M0JDMENDNTZCMzRCOEREQjkyRkFDRUMyRjhGNEI2MzhBIF4KK0QyMDQwMDA1QUUyMzBFRkRBRTk1OTQyMzcyNjA3NTc3RUZBNURCQzIgXgorOEE5MjBGOTQwN0M3NEZBMzdEOUM5M0MzNjA2Qjk5NkRCOTQ1ODQxRCBeCitGMjY5MTVDMDhEQzFEM0QzMUQ5Q0E3M0YxOEYwNERCQjU3RThBNjcyIF4KK0U0NDkzODFDODE0ODgzN0I5RTQ0MjUxQjE3ODI1NTMwRDg3NTRDOTQgXgorQkQ4NDAyQjIxNTIwRTQwRTMxRDFFQUZEOUM5OUE5RTQwOUMzQTc3RCBeCis2MjRDQ0U1MzhBNzhDRjBGRjc4OEI5QkU0MzNBMDA4RkE3Nzc5MjgwIF4KK0I3OTZCNTIxQjkwRDU1Mzk2RThFQzAyQUQ5QjY5QjdFOTEwOTNFNEMgXgorNUM0RDU4NEY5N0MxRDhGQUY4MTBDRUYzQTRDQTA5MTVGQjBCNjMwQSBeCitBMTc5RkVBRjM0MUJBOTdCMUQwMjc4ODIyQUNDQUU1RkNGOEY0QURFIF4KKzY5M0RDRjg1OTE5RTA2QTU0MjNGOTI3ODBFNzlDMkMwQzQ1MjhENjcgXgorREI5NEJFQURGRUEzNjgyMDUxRDYyMjUxOUFGOUY4N0JBQjI4QzVGOSBeCisyRTIwRDE5MjVGQkQ0NjBFN0E1RTZCNDhBOTI5NjRBN0REQ0I4NzRGIF4KKzg2NjUxRkQ3MTg2MkNGNzJGMDFGMDk5RjY4Q0MxNjRERUYwRTk2MjUgXgorRDU5NDhCRENBOTFENjcwNzAxNUM3OUJCQzJCQzc0QzFCNjA1NzNGNSBeCis4ODcwQjhBNjg4NEZGNTRFMEU0MDA0NDFGQjJFQzc0RjI0NTJGMzlDIF4KKzdERjFDM0MwNTJFODM5NkQyNTFFOUQ1MjJDNDIyNzM0NERGOTJDMTEgXgorNTlBMjkwQTBCRDQxQjk3M0RFRTM1OTQ3Q0IyNDAwMDZEQkNFQzU4MiBeCitERDBFREIzQUE2MENERUJCODVEQzAxMjU4QjlGNDlGM0E1RTgzNTg5IF4KK0ZDNjc5NEU0QjRGMjczNTc3M0ExOTVGOUJCMjAyMkM3MEFBNEM3NTQgXgorOEJCQzQwQTAyRDg3QThDRjE0RDZDQkEwQTJDOTg1N0Q5M0VGREVGQSBeCitEMjhGRjZFMjM2NjA5NzEzNUVFNTY1RjEwMjYzRTg3OTgxNDBDNURDIF4KKzJFNDI4OUVCRTAyRTc1RTUzQjUyRDY3MjRDREMxNkI4OUVDRjNEQzYgXgorRjJFNzE2ODMxQ0MwQ0I1Q0IyQTYyMzE5N0QxNEMyQzlGQzI1QTkxNCBeCis0N0I5MjZBMTNENjUzNzdBOEUyQUYyN0E4NEUxNzVCRTkzNzM5RTM4IF4KK0QzNjhCOEFDQzUwMzUzRUM4MDcwOTM2QzczMjQyQTJCRjZDRUMzQUEgXgorODU1NjAyNUJFRDY5NUI5NzVDQjkyNERERkIzNzJGNjg5OUE3QjA5RCBeCis5QjRFRDg5RTYzRDE3QjcyMTBBM0ZDMUJCRjBGREE2MDc2OTRGNUQ5IF4KKzBEMjIyMUY1Q0RBMTg0RUM3RjZDQ0EyOUE3NUY1MDJGQ0EyNTY3M0EgXgorM0MxNTJDQ0I4MTFERDlCQzE2NTI5QjIzREZBMTc1N0Q3NDRGRTY3NiBeCis0OEQxODA4Q0Q2MkY4NjhGQjZGNDU1NjAxMzdDRkIxREZEODU2MjY2IF4KKzhBM0ZBNDJBOTg0Qzk1Q0E3NUQ2QUU1MTM5MUFBQUMwNjg4QzJBQkQgXgorQUI1NzBEOTFFOUI2RjNGMTE4OERDODYzOUEzQjE0NDgzN0VGMUVEOCBeCis2NzNGNjJBN0QyMDVENUM5MEI3NDU0RTgxQTVFREE5QTYwNjUwRDkxIF4KK0QwMDU3NUU0NUZBMzI0RkEwNTE0MjM1OUJDM0EwN0M4MDM4MzZFRTQgXgorQjkwOEJFNDRBMkE2NkY3MzcwRENDMDIyMzc4QTlDMkY5QkE3MEIzOCBeCisxRUY3OTAyOUY4OEU3QTA5MUQ2RjJGQTJGNDRBOTY4MjlDMTIwQzYyIF4KKzQ5MUNCMkVFMDk5NEVFNkE0RkFDNTlDNEI5RkJDOUNGODE4M0RFOEMgXgorQ0VBQUM0RTIxMUU3REREQ0UzOTMxQzQ3QUNBM0Q2MjZCNjJFNTA1NCBeCitCRTIwNDFDQjU1QTQ4ODJBODMzNUE0NkI3NDRFQ0I4NjExMzM2RjVEIF4KK0U0QzBCQzY4NTdBRkZFMEMyQjc3QjM4RkMwMTgyOUI0NDI0N0I2Q0MgXgorMTIyQTZBRjExREVCNkMzQjk3RTZBREY1RTA3N0I1RDYzNjM4ODdFMyBeCis8RAorCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvc2hhLTEvYml0LW1lc3NhZ2VzLnNoYTEgYi90ZXN0L2RhdGEvc2hhLTEvYml0LW1lc3NhZ2VzLnNoYTEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RjNmJkNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9zaGEtMS9iaXQtbWVzc2FnZXMuc2hhMQpAQCAtMCwwICsxLDQwMDkgQEAKKyMgIENvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yICJTSEEtMSBUZXN0IgorIyAgU0hBIHRlc3RzIGFyZSBjb25maWd1cmVkIGZvciBCSVQgb3JpZW50ZWQgaW1wbGVtZW50YXRpb25zCitIPlNIUyBUeXBlIDEgU3RyaW5nczxICitEPgorMCAxIF4KKzEgMSAxIF4KKzIgMSAxIDEgXgorMyAwIDEgMSAxIF4KKzIgMCAyIDIgXgorNCAxIDEgMSAyIDEgXgorMyAwIDIgMiAyIF4KKzQgMSAxIDIgMiAyIF4KKzUgMSAyIDIgMSAxIDIgXgorNSAwIDIgMiAxIDEgMyBeCis0IDAgMyAzIDMgMSBeCis1IDAgMiAyIDMgMiAyIF4KKzUgMSAyIDMgMyAxIDMgXgorNSAwIDMgMyAzIDIgMiBeCis2IDAgMiAzIDEgMiAzIDMgXgorNyAxIDMgMyAzIDEgMSAxIDMgXgorNyAwIDIgMyAxIDIgMyAyIDMgXgorNiAxIDIgNCAzIDMgMyAyIF4KKzcgMCAyIDQgMyAzIDEgMSA0IF4KKzggMCAyIDMgMSAxIDIgMiA0IDQgXgorNyAwIDIgNCAyIDMgMSA0IDQgXgorOSAwIDQgMSAyIDEgMSAyIDQgNCAyIF4KKzggMSA0IDQgMSAxIDQgMiAyIDQgXgorNyAwIDMgMyA0IDMgNCA0IDIgXgorMTEgMCAxIDMgMSAxIDIgMSAyIDQgNCA0IDEgXgorNiAwIDQgMyA0IDUgNSA0IF4KKzcgMSAyIDUgMiA0IDUgNCA0IF4KKzEyIDEgMSAyIDMgMyAxIDEgMSA0IDIgMSA1IDMgXgorMTEgMCAyIDMgMyAzIDEgMiAyIDQgMSA1IDIgXgorOCAxIDMgMyA1IDUgMiA1IDIgNCBeCis5IDEgNSA0IDUgMSAyIDEgNSAzIDQgXgorOSAxIDUgMSA1IDIgMyA0IDQgNCAzIF4KKzEyIDEgMSAyIDUgMSAxIDUgNSAxIDQgMSA1IDEgXgorMTIgMSA1IDMgMiAxIDMgMiAyIDIgMSA0IDUgMyBeCisxMCAwIDUgMSA0IDUgNSA0IDEgMSAzIDUgXgorMTIgMSAxIDUgMiAzIDEgNSAxIDMgMyA1IDEgNSBeCisxMiAwIDEgMSAyIDMgMiA1IDEgMyAzIDYgNCA1IF4KKzExIDEgMyAxIDUgMSAzIDQgMyAxIDUgNSA2IF4KKzggMSA0IDYgNCA1IDQgNCA1IDYgXgorMTAgMSA2IDUgNCAzIDMgMyAyIDYgMiA1IF4KKzEwIDEgMiAzIDQgNCA1IDUgMiA1IDYgNCBeCisxMyAxIDMgMSAzIDEgNCAxIDYgNiA1IDEgMiA2IDIgXgorMTAgMSA0IDMgMyA2IDYgNiAzIDIgNiAzIF4KKzEzIDAgMyA1IDMgMSA0IDEgNCAzIDUgMyA0IDEgNiBeCisxMCAwIDIgNSA1IDIgNiA2IDUgMiA2IDUgXgorMTIgMSAyIDIgNSAzIDYgNiA0IDMgMiA0IDMgNSBeCisxMyAxIDIgNiAzIDYgNSAyIDMgMiAxIDIgMyA1IDYgXgorMTMgMSAzIDUgNiAyIDEgMSA2IDIgNCA1IDQgNSAzIF4KKzE2IDEgMiAxIDQgMyAyIDMgMiA1IDMgNCAxIDQgMSA1IDMgNSBeCisxMSAxIDMgMSAzIDYgNyA3IDQgMSA2IDUgNiBeCisxMiAwIDIgNSAyIDcgNSA1IDQgMiAyIDYgNyAzIF4KKzEzIDEgNiA0IDQgMSA0IDIgNSAyIDQgMiA3IDQgNiBeCisxMiAxIDMgNCA3IDYgNyAxIDQgNCAzIDIgNSA2IF4KKzE2IDAgMyAyIDQgNSA2IDEgMSAxIDUgMyA0IDEgNCA0IDUgNCBeCisxNCAxIDUgMSAzIDcgNiAzIDEgMyA3IDMgMSA1IDcgMiBeCisxNCAwIDEgNSAzIDIgNyAxIDUgNSA0IDYgNSAzIDYgMiBeCisxNCAwIDQgNyA2IDYgMiAzIDUgMSAxIDMgNiAyIDMgNyBeCisxMyAxIDYgNCA2IDMgNyA1IDEgNCA1IDEgNyA0IDQgXgorMTMgMCA3IDUgMyAxIDQgNyA0IDIgMiA3IDUgNCA3IF4KKzE1IDEgNyAzIDYgMSAxIDIgNyA1IDEgNSA0IDYgMSA2IDQgXgorMTYgMCAyIDUgMyAyIDcgMiAzIDUgMiAxIDMgMyAzIDcgNSA3IF4KKzE4IDEgMyA3IDIgNCAxIDcgMyA0IDEgNSAxIDUgMSAxIDYgMSAyIDcgXgorMTcgMCAyIDEgNyAzIDcgMSAyIDEgNCAzIDYgNiA2IDIgMiA1IDQgXgorMjIgMSAyIDIgMSAxIDIgNiAyIDQgMSAxIDMgNSAyIDMgNCA1IDYgMSAxIDIgNiAzIF4KKzEyIDEgNyA4IDcgMiAxIDMgNSA3IDggNyA0IDUgXgorMTUgMSAzIDUgNSAyIDIgMiA3IDQgMiA4IDcgNCA1IDUgNCBeCisxNiAwIDEgNCA0IDYgMSAyIDcgMSA2IDQgMSA4IDQgNyA0IDYgXgorMTYgMCA4IDcgNyAyIDUgMiAxIDUgNiAxIDEgNSAxIDUgNiA1IF4KKzE0IDAgNyAzIDIgMyA4IDMgMyA4IDIgOCAzIDcgNyA0IF4KKzE0IDAgNCAyIDYgNSA0IDUgMyA4IDggNCA4IDIgNiA0IF4KKzE0IDAgOCA3IDEgMyA1IDggMiA4IDEgNCA1IDIgOCA4IF4KKzE2IDAgNSA1IDIgMiA0IDIgNCA3IDYgMSA1IDggMyA4IDcgMiBeCisxNiAwIDEgNiA2IDYgNiA0IDIgMiA2IDQgMiA0IDQgNiA3IDYgXgorMTYgMSAyIDMgNyA0IDEgNyA3IDUgNyAyIDQgNyAyIDYgNiAzIF4KKzEzIDAgNyA0IDggNiA1IDcgNiAzIDUgNyA1IDggMyBeCisxNiAxIDQgMSAxIDUgNCAzIDYgNSA1IDggNSA0IDggNSAzIDggXgorMTMgMCA3IDQgNCA1IDggMyA4IDMgOCA2IDYgNiA4IF4KKzE0IDEgNSA0IDcgNSA4IDQgNiAxIDYgMiA3IDggNiA4IF4KKzE4IDEgMyA0IDQgNSAzIDQgMSA2IDMgNyA2IDcgMyAzIDIgOCA0IDUgXgorMTkgMCA1IDggMSAyIDEgMyA1IDMgMSA2IDYgMyA3IDQgNSA3IDEgNCA3IF4KKzE3IDAgNSA3IDcgMiAyIDYgNCA3IDEgNyA4IDEgNSAzIDIgNyA2IF4KKzE0IDAgOSAzIDYgOSAzIDQgNyA2IDkgMSA3IDIgOSA2IF4KKzIxIDEgOCA2IDUgMiAyIDQgMyAxIDEgNiAyIDggNCAyIDUgNCA1IDEgMiA1IDYgXgorMTYgMSAyIDYgNSA0IDkgOCAxIDggMSA3IDYgNyA3IDEgMiA5IF4KKzE1IDAgNiA5IDUgNCA3IDEgNyAzIDkgNCA3IDcgNSAyIDggXgorMTYgMCAxIDcgOCAyIDcgMiA5IDggOCAzIDQgNSAyIDQgOCA3IF4KKzE2IDEgMSA2IDggMiA4IDEgNiA3IDcgNSA5IDIgOSAyIDggNSBeCisxNiAwIDQgMiA5IDYgMiA2IDYgNyA5IDkgMSA5IDQgMSA1IDcgXgorMTggMSA2IDkgMiA3IDIgOCA1IDggNCAzIDQgNCA2IDYgMyAxIDYgNCBeCisxOSAwIDEgNyA0IDQgNCA2IDEgNiAzIDkgNSA2IDQgNyAyIDIgNSA1IDggXgorMTcgMSA4IDUgMyA3IDMgNSA2IDQgMSA5IDIgNiA1IDcgOSAxIDkgXgorMTggMCA4IDggNiAzIDUgMyAzIDUgNSAzIDggMyAyIDUgNSA0IDcgOCBeCisxNiAxIDQgNyA3IDIgNyAzIDggNSA3IDUgNiA4IDUgMiA4IDggXgorMTkgMCAzIDcgMiAzIDkgNSA5IDcgNyA2IDUgMyAxIDEgNSAyIDMgOSA2IF4KKzE4IDAgMiA0IDYgNyA4IDEgMiA5IDcgMiAzIDUgOCA5IDEgNyA5IDQgXgorMjEgMSA0IDEgOCAzIDMgMSA3IDMgNSA3IDQgMSA4IDMgNiAzIDUgNyA2IDggMiBeCisxNyAwIDQgOCAzIDcgOSA4IDYgOCA0IDIgOCA3IDIgNCA0IDUgNyBeCisxOCAxIDMgOSA3IDEgNCA1IDYgOSAyIDkgMSAzIDggNCA3IDggNyA0IF4KKzI1IDEgMiA0IDggMSA3IDIgNyA1IDUgMyAyIDMgMiAxIDIgMSAxIDIgNCAyIDggNyA4IDcgNCBeCisyNSAwIDkgNCA2IDUgOCAxIDEgMSAzIDIgMSAzIDEgMSAxIDUgMyAzIDYgNSA3IDQgNSA2IDggXgorMTkgMSA3IDUgNiA2IDggMiA0IDEgOCA3IDEgNiAzIDQgOCA1IDggNSA2IF4KKzE5IDAgNiAxIDIgMSA3IDEgMTAgNyA0IDUgMSA2IDQgNiA4IDcgMTAgOSA2IF4KKzE2IDAgMTAgMTAgNSA1IDkgNyAyIDUgNCAzIDYgMyAxMCAxMCA1IDggXgorMTggMSAyIDMgNSA5IDggNSAxMCA2IDggNCAyIDIgNCA3IDkgNiA5IDQgXgorMTggMCA1IDEwIDMgMSA0IDUgNCA2IDggMyA3IDcgNyA1IDkgMiA5IDkgXgorMTggMSA0IDkgNyA1IDQgNCAxMCA2IDkgMyA2IDYgOCA2IDIgNCA2IDYgXgorMTcgMCA1IDcgNCA4IDUgOSAxMCA0IDkgMSA0IDggNiA2IDUgOSA2IF4KKzE3IDEgMyA0IDggOSAxIDUgOCAxMCA1IDEwIDMgOCAxIDYgOCA5IDkgXgorMTggMCA4IDMgNiAxIDMgMTAgMyA3IDYgNSA5IDMgMTAgOSA0IDYgMTAgNSBeCisxNiAxIDkgMSA5IDYgNSA3IDcgMTAgOSA2IDEgNSA3IDEwIDggOSBeCisyMCAwIDYgNCAxMCAxMCA0IDMgOSA4IDEwIDMgMyA1IDIgMSA4IDEgMyAyIDkgOSBeCisxNyAxIDEwIDYgMTAgNiA4IDMgNiA3IDMgMTAgOCA2IDYgNCA0IDkgNSBeCisxOSAxIDkgNCAzIDQgNyAzIDggMTAgMiA0IDEwIDcgNiAxMCAxIDMgNSA3IDkgXgorMjEgMSAyIDIgMiAzIDkgMiA4IDMgOSAzIDcgNyA0IDkgOSA1IDQgMiA2IDEwIDcgXgorMTcgMSA1IDkgOCA4IDkgMTAgOSAxIDggMyAxMCAyIDcgMiAxMCA0IDkgXgorMjMgMCA1IDQgMTAgNCAxMCA3IDggMyAxIDEgMyA0IDIgMSAxIDEwIDIgMSA0IDEwIDEwIDEwIDQgXgorMTkgMCA5IDIgNSA3IDkgNiA3IDEgOCA5IDEgMiAxIDEwIDggMTAgNCA3IDEwIF4KKzIyIDEgMiA2IDggOCA5IDcgMiAxIDMgMyAxMCA2IDIgNiAyIDYgNSAyIDUgMTAgNSA5IF4KKzIyIDEgOCA3IDggMTAgMSA2IDMgNyA0IDUgNSA1IDEgOSAyIDIgNSA1IDIgMTAgOSA0IF4KKzIxIDAgMSAxMCAyIDYgMTAgOSA0IDMgMyA3IDEwIDIgOSA2IDEwIDIgMSA1IDYgMyAxMCBeCisyMSAxIDggNSA3IDEwIDUgNiA3IDMgMyAxIDIgOSA0IDggNiAzIDkgMSA3IDcgOSBeCisyMiAwIDUgNSA2IDUgMiAzIDUgMyAxMSA0IDUgMSAxMCA2IDQgMTEgOCAzIDYgNSA2IDcgXgorMjAgMCAyIDEgOSA5IDMgNiAxIDggMTEgNiA3IDExIDYgMSAxMCA2IDcgNSA1IDggXgorMTkgMCA0IDEgNyAxMCA0IDggMTAgOCAxMCA0IDExIDkgNiAxIDQgNSA2IDExIDQgXgorMTkgMSA5IDIgNCAxMSAxMSAxMSA3IDEgMSA2IDggMSA5IDggNSAxMSA1IDQgMTAgXgorMjAgMCA4IDMgMTAgMSA3IDYgMTAgOCAyIDkgMyA4IDYgOCA5IDMgNyA1IDEgMTEgXgorMjIgMCA0IDUgOCA0IDEwIDYgNSA0IDUgMyAzIDQgMSA1IDkgNCAxMCA5IDYgNyAzIDExIF4KKzIxIDAgNiA1IDggNyA4IDExIDIgMSAxMSAxMCAzIDMgMiA5IDEgMyA2IDkgMTAgMTAgMiBeCisyNCAxIDMgMSAxIDkgNCAyIDUgNyAzIDEwIDExIDUgNiA3IDEgNyA3IDggNyAyIDIgNyA0IDkgXgorMjMgMSA5IDQgNiAzIDcgNSAxMCA5IDggOSAzIDIgMSA3IDIgMiA3IDYgMiA4IDMgNiAxMCBeCisyMiAxIDcgMTAgMiAxMCA1IDEgOCA3IDcgMyA4IDYgNiA4IDMgMiAxMSA2IDMgNCA3IDYgXgorMjAgMSAxMSAzIDcgMiAxMCAxMCA3IDUgMiA0IDMgNSAxMSAzIDExIDggOSA1IDUgMTAgXgorMTkgMCA2IDIgNiA4IDUgOSA0IDkgMTAgOSA4IDMgMiAxMCAxMSAyIDYgMTEgMTEgXgorMjAgMSA4IDIgNCAyIDcgMyA5IDkgMTEgOCAyIDExIDQgOCA0IDggMTAgNiA5IDggXgorMjEgMCA2IDEwIDEwIDcgOSAyIDUgMTEgOSAxMCA3IDMgMSA0IDUgNCAxMCAxIDIgOCAxMCBeCisxOCAxIDggMTEgNiAxMCA4IDkgMTEgNiA3IDcgMiA2IDIgNiAxMCA2IDkgMTEgXgorMjEgMCA1IDExIDEgNiA4IDExIDggMTAgNSAxMCAzIDcgOCA5IDkgMSAxIDEgMTAgMiAxMCBeCisyNSAxIDUgMTAgMiA5IDkgOSA3IDIgMiA0IDYgMSAxMSA3IDMgMyA1IDUgMiAxMSAyIDUgNSAxMCAyIF4KKzIxIDEgMSA4IDEgMTEgNiA5IDMgNiAxMSA3IDExIDggNiA5IDQgNCAxMCA3IDEgOCA3IF4KKzIzIDEgNyA3IDUgMTEgMSA0IDcgMTEgMTEgMTEgOSAyIDEgMyA4IDIgOCA3IDQgNSAyIDUgOCBeCisyNCAxIDQgMTEgNSAxMCA3IDcgOSA1IDEgNSA2IDIgOSAxIDUgNyA5IDkgMTEgMSAxIDMgMSAxMSBeCisyNyAxIDEwIDQgNiA4IDUgNyAxMSA0IDEwIDggNiA0IDMgNCA0IDIgMSAxIDMgMyAxIDExIDIgMyA0IDEwIDYgXgorMjEgMSA3IDExIDIgNyAxMCAxMCA5IDEwIDEgMyAxMCA0IDMgMTEgMTAgMiA1IDMgOSAxMSA0IF4KKzIyIDAgNyA5IDEwIDkgNSAyIDYgNiA5IDIgNyA0IDkgOCA0IDkgMiA1IDkgOCAxMCAzIF4KKzIxIDAgMTIgMiA2IDEyIDcgOSAzIDUgMTEgNiAxMSAzIDUgNCA0IDExIDEwIDIgMSAxMCAxMCBeCisyNyAxIDEgNCAxMiAyIDEwIDEgNiA1IDUgNCAxIDEwIDMgMSAxMiAzIDIgMTEgNSAxIDQgNiA0IDYgMTEgMTEgNCBeCisyMiAxIDggOSA0IDggMTIgNSA1IDkgMyA1IDIgMyA0IDEyIDEyIDggNSAzIDEgOSAxMCA5IF4KKzI0IDAgNSAxMiA4IDYgMiA0IDExIDExIDIgNyAxMSA5IDQgNSAyIDEgOCAzIDEwIDIgNSAyIDggOSBeCisyMSAwIDMgNyA3IDcgNSA5IDExIDUgOSAxMSAyIDkgNyA1IDYgMTEgMiAxMiA0IDkgNyBeCisyNiAwIDQgNCA2IDQgNyAyIDQgMiA1IDcgMiA2IDExIDUgOSA4IDIgNSAxMCAyIDEwIDggOCA1IDIgMTEgXgorMjMgMSAzIDMgMiA2IDkgMTAgNSA2IDggNSA4IDExIDMgNiAxMCA0IDYgOSAyIDExIDEwIDMgMTAgXgorMjUgMSAxIDMgMTIgMyA3IDQgNSA1IDMgOCA5IDIgNCA4IDcgNyA5IDEgOSAxMSA0IDUgNyA3IDEwIF4KKzIwIDEgMTEgOSA4IDEwIDExIDEgNyAxMiA2IDcgNCAyIDEyIDEyIDIgMyA5IDEwIDggOCBeCisyMCAwIDEyIDExIDEgNCAxMCA2IDEwIDMgOSA3IDEyIDQgMTEgOCA0IDYgMTIgNCA3IDEyIF4KKzI0IDAgOCA2IDQgOCAyIDIgOSAyIDkgNiAzIDYgMyAzIDEwIDEyIDIgNyA4IDcgOCAxMiAxMCA3IF4KKzI2IDAgNSAxMSAxMSA3IDMgMyA5IDEwIDMgOSAzIDMgNyAyIDkgOSAxIDIgNCAxMiAyIDUgNSA2IDEwIDQgXgorMjIgMSAxMiA5IDEwIDEwIDEyIDEyIDcgOCAyIDcgMSA2IDggMiA4IDcgNiAzIDEgMSAxMiAxMiBeCisyMiAxIDExIDEwIDIgMTEgMTAgOCAxIDIgOCAxMiA4IDMgOSA1IDcgOSA4IDcgMTEgMSAxMCA0IF4KKzIyIDAgMTAgMSA4IDYgMTIgMiAxMSA3IDEwIDQgMTAgNiA1IDcgMTAgMTEgMyAzIDggOCA0IDEyIF4KKzI2IDAgOCA1IDUgMTIgMSA4IDYgNyA2IDExIDggMTAgNCAzIDcgNiAxIDUgMSAxIDkgMSA1IDggOSAxMiBeCisyMSAwIDEgMTIgNCAxMSAxMiA5IDIgMTIgMTIgMyAxMiA1IDQgMTIgNCAxIDUgOCAxMiA5IDEwIF4KKzI2IDEgNSAzIDggMSAxMSA0IDcgMyAzIDEwIDQgOSA2IDYgNCAzIDkgMTEgMSAzIDcgMTAgNyA5IDYgMTEgXgorMjMgMCA3IDEyIDMgNSA4IDkgNyAxMCA4IDExIDEwIDExIDYgMSA4IDEgMSA2IDMgOSA4IDEyIDYgXgorMjUgMCAxIDUgNSA2IDUgMTIgMSAxIDEgMTEgOSA5IDMgMTEgOSA2IDEgMTEgMyAxIDEyIDggMTEgMTEgMTAgXgorMjIgMSAxMCA5IDcgMyAxMCAyIDYgNCAxMSAzIDExIDYgNCA1IDUgMTEgMTIgOSA3IDggMTIgOSBeCisyMiAwIDggNSAxMCA3IDEyIDggMyA0IDQgNSA4IDkgMTIgNiA4IDEwIDYgNyAxMSA0IDggMTAgXgorMjYgMCAzIDUgMyAxMSAxMSAyIDEgOSAxIDEwIDQgNCA2IDkgNCA3IDYgNSAxMCAxMCAxIDggOSA5IDYgMTIgXgorMjQgMCAxMiAxMSA0IDEwIDEgMyA3IDUgMTEgOSAxMSA3IDIgMTEgNSA0IDcgOCAxIDYgMTIgNyA0IDkgXgorMjggMCAxIDEyIDEwIDIgMiAyIDQgOSAxMSA0IDExIDcgMiA0IDMgMTEgNyAxMCA1IDEwIDUgNSAzIDUgMiA3IDUgOSBeCisyNiAxIDQgMSA0IDIgMTMgNiAxMSA1IDYgOCA1IDEgNSA2IDMgOCAxIDUgOCA5IDkgMTAgMTIgMTMgMTIgMiBeCisyNiAwIDEyIDMgMSAxMSAyIDEyIDYgOCA2IDggMTEgNCAxMSAxMCA5IDYgMyAzIDIgMiAyIDEzIDIgMSAxMyA5IF4KKzIyIDAgMyAzIDEyIDEzIDEzIDcgMTIgMiA4IDExIDkgMTAgMTAgMSAxIDEzIDExIDEzIDQgMSAxMSAzIF4KKzI2IDEgMiA2IDIgOCAxMiAzIDcgMTIgOCA5IDggMyAxMiA3IDQgOSAyIDYgNCA5IDkgNCA4IDIgNCAxMiBeCisyNCAxIDggMTEgMTEgMyAxMyAyIDEwIDMgMTAgOCA2IDYgNCA0IDEzIDQgMiA0IDggMSAxMSAxMiA5IDEwIF4KKzI5IDEgMSAyIDUgMSAxIDEwIDMgMiA0IDkgMTEgOCAyIDUgMiA4IDEwIDIgMTAgMTEgNyA4IDEyIDYgMSA5IDggNCAxMiBeCisyMyAwIDYgMTIgNyAxMCA3IDcgMTMgMiAyIDcgMTAgMiA4IDEzIDEwIDcgMTEgMiA1IDkgMTEgMTMgMSBeCisyNSAxIDMgMTEgMiAxMCA1IDExIDUgNyAxMCA4IDEwIDEgMTAgMyAxMSA3IDkgNSAzIDMgNCA1IDEzIDEyIDggXgorMjYgMSA1IDEzIDkgNCAzIDMgNCAzIDEzIDEgNiAxMSAxMCA4IDEzIDMgNCAxMSA5IDEgOSAxIDcgOCA3IDExIF4KKzIyIDEgMSAzIDEzIDggMTEgMyA0IDEwIDEwIDEyIDcgMiAxMSA0IDcgNyA2IDEzIDEzIDkgMTMgMTEgXgorMjYgMSA3IDkgNyA4IDkgOSA1IDEgMTMgMyAzIDQgOSAyIDEgOCA5IDMgOSAxMiA4IDEwIDEwIDYgMTEgMyBeCisyMyAxIDMgOCAxMiA4IDEwIDQgMyA4IDUgNSA3IDExIDEzIDExIDEyIDExIDQgMTIgMyA2IDUgMTEgOCBeCisyNyAwIDMgMTAgOSA2IDkgNyAyIDEwIDQgNCA1IDUgMiAxMiAxMyA1IDMgMSAxMCAxIDQgNyA4IDEzIDEzIDEyIDMgXgorMzAgMCAyIDYgNSA0IDcgMyAxMCA2IDEzIDYgMyA5IDYgMiAxMCA1IDMgOCA0IDEgMTEgMyA1IDMgNyAxMSAxIDEyIDkgNyBeCisyOSAwIDUgMiAxMyA2IDUgMiA2IDMgMiA5IDUgMyA2IDYgNCAxMCAyIDQgNyA3IDEwIDEzIDkgNiAxMCA2IDUgOSA4IF4KKzMxIDEgOSA4IDIgNyAzIDUgMTEgMyA3IDcgNSA2IDIgMSAxIDYgMiAxMSA1IDQgNSA3IDkgMSAxMSAxMCAyIDMgOSAxMiAxMCBeCisyOCAwIDExIDEgNCAxIDEyIDEwIDUgNSAxIDcgMiAzIDEwIDcgMTIgOSAyIDggMiA2IDEwIDUgMTIgMTIgNCA5IDIgMTMgXgorMjYgMSAxMSA5IDggMTIgNCAxMiA3IDMgNCA0IDYgMSAyIDcgMTIgNCA2IDggMTAgMTEgMTEgMSAxMCAyIDkgMTIgXgorMjggMCAxMCA5IDcgMTAgMSAxMCA5IDEyIDcgMTAgNyA2IDYgNSAzIDIgMyAxIDMgMTIgMSA0IDEzIDMgOSA3IDkgOCBeCisyNyAxIDQgMTEgMSA1IDYgOSAxMiAxMiAxMyAxMyAxMyAxIDIgMTMgMSAyIDEgMTIgMTIgMyAyIDIgOCAzIDEzIDcgNyBeCisyOSAwIDYgNSA1IDIgNCAyIDExIDQgNCAxMyA5IDEzIDcgMyAxMiA4IDMgNyA2IDQgMTIgMyAxIDggMTEgMSA2IDEzIDYgXgorMjMgMSAxMSA2IDYgMTEgNyAxMyAxMSA2IDcgNCA0IDEyIDIgMTMgNSAxMiA1IDcgOSA2IDExIDExIDExIF4KKzIzIDAgMTEgMTMgMTEgNyA0IDMgNiAxMiAxMyAxMCAxMSA1IDEyIDEzIDExIDYgMSAxIDQgNyAxMyAxMCA3IF4KKzI3IDEgNyA1IDEzIDUgNCA4IDcgMyA5IDYgNyAxMSA3IDEgOSAzIDggNSA4IDggMiAxMyAxMyA4IDUgMTMgNCBeCiszMCAxIDIgNSA4IDQgMTMgMTAgNiA0IDIgNiAxIDEgMTIgNCAxMyA1IDEwIDQgMTAgOCA1IDcgMSA1IDUgMTIgNCA4IDYgMTIgXgorMjggMSAxMiAxIDEyIDExIDEwIDIgMyAxMCAxIDIgNiAxMSAxMiA5IDExIDEyIDIgMSA5IDQgMSA1IDcgMiAxMiAxMSA0IDExIF4KKzI5IDAgNiA4IDcgOCA4IDEyIDIgNyA0IDEyIDExIDUgNSAzIDUgMTMgNCAxMSA4IDggOSAyIDIgMSA2IDIgOCA2IDEyIF4KKzI4IDEgNyAxMyA1IDcgMTEgMyAxIDkgMiA1IDEyIDggNiAyIDUgOSAxMCAxMCAxMSA0IDUgMTIgNSA0IDYgNSA2IDEzIF4KKzI1IDEgMTQgNCA4IDIgOSAxMSA3IDQgMyAyIDggMTQgNiAxNCA3IDEzIDUgNSAxNCA2IDUgMTEgNiA2IDEzIF4KKzI2IDEgMyA1IDEyIDEgMTEgMTMgMSAzIDMgMTAgMTEgNSA2IDEyIDExIDEyIDcgMTQgNCAzIDYgNiAxMCAxMSAxNCA0IF4KKzI3IDAgNCAyIDMgMTAgNyAxMiAxMyA4IDggMTIgMTAgMTMgMSA3IDEwIDIgNyAyIDEzIDEwIDIgMyAzIDYgNCAxMyAxNCBeCisyNCAxIDExIDEgOSAxNCA0IDE0IDE0IDggMTAgMTMgNCAzIDIgNyA2IDYgOCAxNCA1IDExIDcgMTQgMTQgMSBeCisyMiAxIDEzIDEzIDEwIDkgMTMgOCAxNCA5IDMgMTQgMyAxMSA5IDkgMTIgMTMgMiAxMCAxIDUgOCAxMiBeCisyNSAwIDkgMTAgOSA4IDQgMTQgNiA5IDMgMTMgMTAgMTEgMyAxIDQgNiAxMCAzIDQgMyAxMiAxMiAxNCAxMSAxMyBeCisyNiAxIDExIDggMTEgNyA4IDEwIDkgMTIgMTEgNiAxMCA2IDMgOSA5IDEgNyA1IDYgNyA3IDEyIDQgNSA4IDExIF4KKzI2IDEgMTIgMTAgOCAxNCA3IDQgMTMgMTMgOCA0IDUgMyAyIDQgNyAxNCAzIDEwIDYgOSAxMyA5IDIgMSA5IDE0IF4KKzI4IDAgNiAxMiAyIDQgNyA4IDExIDEwIDEyIDIgMTQgMyAxIDEgMSAxMiA1IDEzIDkgMTIgNSA5IDEwIDUgMSAxMiAxMCA4IF4KKzI5IDEgMiA2IDUgMTQgMTQgMyA2IDEzIDEgMiA2IDIgMTIgMSAyIDEwIDEgNCA1IDE0IDEwIDEyIDExIDIgMyAxNCAxNCAxMiA1IF4KKzMwIDEgNSAyIDMgNSAxMSAxMiAzIDcgMTIgNyA5IDggMyAzIDE0IDEwIDUgMiA5IDMgOCA2IDExIDggNyA4IDEgNiAxMiA3IF4KKzI4IDEgMTQgNSAyIDE0IDcgOCAxIDUgNCAxMiA5IDYgMTIgMSAxIDcgOSA1IDE0IDExIDkgNCAxIDEwIDEgMTQgMTAgMTIgXgorMjcgMCA3IDIgOCA1IDMgMTQgOCA5IDQgNiAxMSAzIDExIDYgMTIgMSA3IDE0IDkgMTQgNiAxMCA2IDEgOCAxNCAxMCBeCisyNiAxIDYgMTQgMiAyIDEyIDEwIDUgMTAgMTAgOCAzIDcgMTMgMTAgMSAxNCAxIDE0IDcgMTEgMTIgOSAxIDggOCAxMiBeCiszMCAwIDYgMTMgNSAxMyAzIDUgOCA4IDggMiA1IDUgNCAyIDEzIDE0IDcgMiAxMiAxMiAzIDMgNSA3IDUgMTEgMyA3IDEzIDcgXgorMjYgMCAxMyA3IDIgOCA0IDEwIDE0IDIgNyAxIDEwIDggMTEgMTEgMiAxMyA5IDExIDIgOSAxMSA3IDEzIDExIDIgMTQgXgorMzEgMSA3IDcgOCA1IDEzIDQgMSAxMiAxNCAxIDkgMTEgMyA1IDMgMTMgMTEgNyAzIDIgOSAxIDMgMTMgNiAzIDEwIDEyIDEgMTMgMyBeCisyMyAwIDkgOCA4IDcgMTQgMTMgNiAxMyAxNCAxMiAxMyAxMiA3IDQgMTQgMTAgMSAzIDkgNyAxMSAxNCA1IF4KKzI3IDEgMSAxMCA0IDEyIDQgMTEgNSAxMyAxMyA0IDEyIDEzIDcgMTIgMTIgNCAxMyA2IDIgNyA1IDIgOCA3IDEzIDEyIDMgXgorMjYgMSA3IDYgMTEgMTIgMTQgMTIgMyAxMiA4IDcgNCA5IDE0IDEgOCAxMSA2IDUgMTAgMTAgNiA4IDUgMiAxMSAxNCBeCiszMyAxIDEgMTEgMSA1IDMgOCAxIDEyIDE0IDUgMSAzIDcgMiAzIDkgMyA0IDE0IDQgNCAxMCA4IDUgMTQgMSAxMSAxMiAxMiAxMCA0IDEzIAorMiBeCiszMiAwIDExIDQgNCA5IDUgNSA4IDkgNSAxMCA0IDIgNCA3IDkgOSA2IDMgNSAxIDggMyAyIDEzIDMgMTQgOSA4IDkgMTAgMTQgNSBeCisyOCAwIDEyIDkgNSA4IDcgMiAxNCAxMiAzIDggMTQgNiA2IDQgNyA1IDcgMTAgNyAxMSAxMCAxIDkgNiA3IDEyIDggOSBeCisyNSAwIDkgOSAyIDExIDEzIDEyIDExIDExIDYgMTQgMTMgMTAgNSA2IDggMTAgNCAzIDExIDExIDE0IDUgNSAxMCA3IF4KKzMwIDAgMTMgOSAxNCAxMSA0IDggMTIgOSA1IDkgMSAyIDkgMTMgMTIgNiAxIDE0IDExIDEwIDcgOCA2IDEgNCAzIDIgMiAyIDEzIF4KKzMzIDEgMTMgNSA5IDYgMTMgOSAxIDEzIDIgNiA4IDkgMSAzIDEyIDEzIDMgNCA0IDEyIDUgMiAxIDEyIDEgNiAyIDEgOCAyIDE0IDEzIDkgCiteCiszMiAxIDggNiA3IDEgNCA0IDYgMSAxMyAzIDMgMSAxMyA3IDYgMTEgNiA0IDkgMTAgNCA4IDEzIDEgOSAxMCAxMiA3IDEwIDExIDEwIDUgXgorMzAgMCAxMiA2IDYgMyA0IDEzIDEgNCAxMSAxMCAyIDYgMTQgNiA5IDEyIDYgMiAyIDExIDkgMTMgNCA3IDkgMTQgMiAxMSA4IDcgXgorMjYgMSAyIDExIDEzIDIgOSAxMSA4IDExIDExIDE1IDEzIDEzIDMgMTUgMiAxMiAxIDE1IDMgOCA0IDkgMTMgMSAxMyA3IF4KKzMyIDEgOSA2IDEgMiAyIDEgMTUgMyAxNSAxIDEwIDEgNCAxMSAxNCAxNCA2IDEwIDIgNSA5IDEwIDEwIDkgMSAyIDE0IDEwIDEyIDEgMSAKKzE1IF4KKzI5IDEgMTMgMiAzIDggMTIgNSAxNCA5IDggOSAyIDE0IDEgNCA2IDE1IDEwIDkgMiA3IDkgNCA4IDcgOSAxMCAxMSAxMSA1IF4KKzM0IDEgMTIgMiA3IDIgMTIgOCAyIDggNiAzIDEyIDQgNCAxMCAxIDE0IDEyIDExIDUgMTUgMyAzIDMgMTQgMTMgMiAyIDMgOCAyIDEgOCAKKzggOCBeCiszMSAwIDYgMiA3IDEwIDEgMTMgMTAgNiA2IDYgMiA4IDcgNiA3IDE0IDMgMTIgNiA4IDkgMyAxMSAxIDMgMTAgMTIgMTEgMTEgOSA5IF4KKzI0IDEgMTMgMTUgNCA3IDExIDEzIDEwIDE0IDE0IDEzIDQgMTEgNSA2IDExIDggMTIgMTMgOSAxIDEwIDkgMTAgNyBeCiszMyAwIDMgMSAzIDMgNCAxMyAxIDYgMTQgOCAzIDQgMyAyIDEgMTQgMTQgMTQgNSAxMyAxMyAxMSAxMCAxMyA0IDMgMTAgMTEgMyA2IDEgCisxMCA3IF4KKzI4IDAgNyA5IDEzIDkgMTUgMiA0IDEyIDEwIDEwIDQgMTIgMyA4IDUgNiAxMyAxIDYgMTUgMSA4IDkgNiAxMiAxMSA3IDE0IF4KKzMyIDEgMyAxIDEzIDYgNCAxIDkgNCA1IDcgMSA4IDggMTEgMTAgNSAxNSAxNCAyIDggMTQgOSA3IDEyIDIgNCAxMyA3IDQgMyA5IDE0IF4KKzMxIDEgMTQgMTIgMTMgOCA0IDEyIDIgNiA1IDEyIDkgMyAxMSA4IDUgMTMgNSAxMCA1IDIgMyA3IDEyIDE0IDQgMSA3IDMgNiA5IDkgXgorMzIgMSAxMCAxNSA3IDIgMTMgNSA3IDIgNSAyIDEwIDcgMTEgNSA1IDkgOCAyIDkgMyAzIDYgMyAxMyAxMCAzIDUgNyAxNSAxMSAxMCAxMiAKK14KKzM4IDAgMiAzIDcgMSA2IDMgMyAxMiA1IDIgOSA0IDUgMTEgMiAxIDcgNiAxNCA3IDE0IDEwIDQgMTEgNiAzIDExIDIgMTAgNiA0IDggMSAKKzQgOSA0IDE1IDQgXgorMjcgMCA3IDcgNCAxNCAyIDMgMTQgMTUgMTAgNyAxMiA3IDUgOCA3IDE1IDE1IDE0IDEwIDIgMyAxIDEwIDEyIDE1IDkgOSBeCiszMSAxIDE1IDMgOSA5IDUgNCAyIDYgMTQgNCA5IDUgMTIgOCAxIDYgMSA0IDggNyAxMCAxNCAzIDEwIDE0IDggMTEgOSA4IDEwIDkgXgorMjggMCAxNCAxMSA4IDMgNSA1IDcgMiAxMSA0IDQgNCA2IDE0IDEzIDEwIDE0IDEwIDMgOSA2IDkgNyA1IDEwIDE1IDE1IDE1IF4KKzMwIDEgOCAxMyA0IDIgMTMgNiA0IDcgNCA0IDE1IDIgMiAxMiAxMyAzIDE0IDEyIDcgMTEgNiAyIDE0IDIgNiA2IDkgMTQgMTMgMTIgXgorMjcgMSAxMyAxNCAxNSAxMiAxNCA1IDE0IDE1IDExIDQgMSAxIDkgNSAxMyAxMCA2IDUgNSA2IDE0IDEzIDEgNSAzIDE0IDEzIF4KKzI5IDAgNCAyIDEzIDEyIDE1IDcgMyAxNSA1IDEgNiA3IDYgMTMgMSAxNCAxMSA5IDUgMTUgNiAxMyAzIDYgMTEgNyAxNSA4IDkgXgorMzEgMCA1IDQgNCAxNCAzIDEzIDggMTMgMyA3IDEzIDcgOSAxMiAzIDExIDE1IDExIDUgMTQgMSAzIDQgMTAgMTIgNyAxMiAxIDIgMTMgNCAKK14KKzI4IDEgMTIgNyAxMyAxNCA3IDcgMSA5IDEzIDggNSAxNCAyIDUgOSA5IDE1IDkgMTMgNyA4IDkgOCAxIDEyIDMgOSAxNSBeCiszNCAxIDYgMTIgNCAxNCAxMiA1IDMgMTUgNCA0IDYgOCAyIDExIDggNCAyIDUgMSAxNSAxNSAxIDE1IDIgMTEgNCAxMCA5IDQgNyAzIDIgCisxNSA2IF4KKzI2IDAgMTQgNSA2IDUgMTEgMTIgMTQgMTIgMTIgMTEgMTUgMiAxNCA5IDE1IDEgNyAxMiAxMSAxMiAxMyAxNCAxIDEgMTIgNSBeCiszMiAwIDIgMiA0IDUgMiAxMSAxMiA1IDQgMTIgOSAxNCA1IDUgOCA2IDIgMTUgMTUgNiAxMyAxMSAzIDUgMTUgNSAxMSAzIDEyIDcgMTAgCis4IF4KKzI2IDEgMiAxNSAxNCA5IDE0IDcgNiAxNSA5IDMgNCA4IDggMTIgMTQgMiA5IDExIDE0IDYgMTEgMTUgMTAgOCAxNCA4IF4KKzM0IDEgMTUgNyA0IDUgMTAgMSAxMyA3IDEgMSA4IDMgMTMgMTEgMiA4IDE1IDExIDEyIDYgNiAxIDMgMiAyIDExIDMgMTMgOSAxMCAzIDYgCisxMiAxNSBeCisyNSAwIDE1IDcgMTAgMiAxMCAxNSA1IDEwIDEzIDEyIDggMTUgMyAxIDExIDE0IDE1IDggMTUgMTIgOSA2IDggMTMgMTMgXgorMjcgMCAxMCA4IDEzIDEwIDE1IDEzIDUgOCA0IDEwIDEwIDYgNyAxMyA2IDEyIDEyIDkgMTIgMiA1IDEwIDEyIDEwIDggMTUgNiBeCisyOCAwIDUgMyA4IDEyIDE1IDggMTQgMTUgOSAxMiAxMiAzIDEwIDEzIDYgMTEgMTAgNCAxMyAxNCA4IDkgMSA4IDEgNSAxMSAxMiBeCisyOSAwIDkgMTIgNCAxMyAxNSA1IDkgMTEgNyAxNCAxMSAxIDExIDcgOCA4IDExIDEgMTMgMTUgMTIgMSA1IDggMyA4IDEwIDcgMTQgXgorMzAgMCAxIDUgMTMgMTIgMTQgNSAzIDYgNCAxMiAxNSA2IDYgMTAgMTEgMTMgOSAxIDExIDYgMTAgMyA3IDE0IDQgMTQgMTEgNyA4IDEzIF4KKzM0IDEgMSAxMiA1IDEgNyA0IDYgNyA1IDExIDEgNCA3IDEyIDEwIDEwIDggMTUgMTMgNCAxMSAxNSAxMSA2IDkgMSAyIDE1IDUgMSA1IAorMTIgNiAxMyBeCiszNSAxIDEyIDE1IDQgMTEgMTMgMyA2IDUgMTAgOCAxIDMgOSAzIDExIDEgMiAxNiAxMiAxMCA2IDEgOSAxIDE2IDUgNiAxNSAxIDEyIDQgCis0IDIgMTUgNCBeCisyNyAwIDE1IDExIDE1IDUgMTEgOSA3IDE1IDE2IDYgMTYgMTIgMyAyIDEwIDE2IDUgNSA3IDEgNyAxMSAxMyA3IDkgMTEgMTIgXgorMzEgMSA1IDUgNSA0IDEzIDEzIDE0IDQgNyAxMiA2IDQgOCAyIDkgOSAxMyAxMyAzIDMgNiA3IDE2IDcgNiAxNSA1IDggMTUgNiAxNSBeCiszMCAxIDYgMTYgMTUgMTEgMTQgMTQgNCA3IDEwIDMgNCAxMCAzIDYgNyAxNCA0IDYgNiA1IDIgNyA4IDE2IDIgMTIgMTYgMTAgMTQgNyBeCiszNiAxIDIgMyA3IDE0IDYgOSA0IDQgNSA5IDcgMTIgMyA5IDIgNSAxIDMgMTAgMTEgMTEgNiAxMiA3IDEgNyAxMiAyIDEgMiA4IDEyIDE1IAorMTYgOSAxMyBeCiszNCAxIDYgMyAxMiAxMSAxNiAxNSA4IDggOCAxNCAxMyA3IDcgOCAyIDcgNiAyIDIgMTQgNyAxIDQgMiA0IDExIDExIDUgNyAyIDEyIDEgCisxNCAxMSBeCisyOSAwIDEyIDExIDIgOSA4IDUgNiAxNCAxMCAxMiA1IDExIDUgMyAxIDEzIDE1IDkgMTIgMTEgMTMgNCAxNCA1IDE2IDMgNSAxMyAxNSBeCiszMCAxIDUgMTYgMTEgMiA2IDEzIDE2IDMgNiA0IDkgMTAgOSA4IDYgMTQgOCA5IDUgMTMgNiA1IDE0IDIgOCAxNSA4IDcgMTQgMTEgXgorMjggMSAxNCAxMCAxMyAxMyAxMSAxMCAxMyA5IDggNCAxMSAxNCAxMSA2IDEwIDEwIDEgOSAxMyAxNiA1IDMgNCA3IDkgMTIgMTAgOCBeCiszNiAxIDEwIDE1IDEyIDggOCAxMCAxMyA1IDYgMTEgNCA2IDIgMyA1IDYgMTEgMSAxIDggNiAxMyAxNSA2IDMgMTUgNSAxMCAxIDYgMiA1IAorMiAxMSAxMCAxMCBeCiszMSAxIDQgMTQgNyAyIDE0IDMgMSAxMiA3IDE1IDEzIDEgNSA5IDggMyAzIDE0IDEyIDEzIDIgMTUgMTIgNyAxNiAxMiAzIDggMTEgNSAKKzE1IF4KKzM0IDAgMTAgMiAxMCAxNiA0IDE2IDcgOCAxIDE2IDYgMTQgOSA1IDEyIDE2IDggOSA0IDQgNCAxIDcgMTMgMTAgMSA3IDEwIDUgNyA0IDEgCis1IDE1IF4KKzMwIDAgMTYgMyA4IDcgMyA4IDggMTEgOCAxMyA0IDE2IDggMTYgMSA0IDE2IDExIDQgMTIgMSAxNCA1IDEgMTYgMTEgOCAxNCAxMiA5IF4KKzMzIDAgNyA5IDkgMTYgMTEgNyA2IDEgMTEgMTQgMTIgMTQgMTAgOSAxMSA4IDExIDcgNSAxMCAxNSAyIDYgOSAzIDkgNCAyIDEgMSA5IAorMTQgNiBeCiszMiAwIDUgOCAxNCAxNSA0IDEgNiAxIDEwIDggMSAxNSAxNSAzIDEwIDcgOCAxMCAxMiA0IDMgMTEgMTUgOCA1IDMgMyAxNiAxNSA3IDE0IAorMTMgXgorMzYgMCAzIDEwIDEyIDIgMTEgOSAyIDEgNCAzIDggMTAgMTQgMiAxMSAzIDIgNCAxNSAxNCA1IDIgOCAxNiAxNiAxIDUgNyA1IDkgNSAxNSAKKzkgMTEgMyAxNCBeCiszMSAxIDUgNCAxNCA0IDggMyAzIDEgMTAgNCAxNSAxNSAxMyAyIDEzIDkgNyAxMyAxMSA5IDEgMTUgMTUgMTUgMTYgNyA3IDYgNSAxMyA5IAorXgorMzAgMCAxNCAxNiAxMiAxIDExIDExIDcgMyA3IDMgMyAxMyA0IDEzIDE0IDUgMTUgMTIgNSAxNCAxNiAxNCA0IDUgOSA2IDYgMyAxNiAxMSAKK14KKzI4IDEgMTAgMTYgMTAgMTQgMTMgNiAxNiAxNCAzIDE0IDE1IDcgMTMgMTIgNCAxIDggNCAxMCA2IDEgMTMgNiAxNCAxMSAzIDE2IDE0IF4KKzMzIDAgMTUgMTEgMTMgOCAxMSAxIDE1IDIgMTAgOSA5IDE0IDggMTMgMiAxMyA4IDEgMiAxIDMgMTIgOCA1IDQgMTEgMTAgMTQgOCA5IDQgCis1IDE2IF4KKzM0IDEgMTIgMTIgNiA3IDEzIDEzIDEyIDEgMTMgMTQgMSAxIDYgMyAxMyAyIDE2IDMgMSAxNiA5IDkgMTUgMyAxMyAxIDggMyAyIDYgMTIgCis4IDkgMTMgXgorMjcgMCAxMSAxMiAxNSAxNCAxMiAxMCA4IDE1IDkgMTUgMiA3IDUgMTEgOCA5IDcgMTYgNiAxNSA0IDE1IDcgMTEgMTUgNCAxNCBeCisyOSAxIDkgMSAxNCA3IDQgMTQgMTYgMTEgMTAgMTEgMTIgMTQgNiAxMiAxMSAxNSA3IDE0IDMgMTUgNiAxIDEyIDUgMTIgMTMgMyA2IDE0IAorXgorMjggMCA2IDEwIDcgNyA5IDEwIDcgMTEgMTIgMTYgOSA2IDkgMTQgMTAgMTAgMiA3IDQgMTUgMTYgMTMgMTEgOCAxMCAxNSAxMCAxNSBeCiszMiAxIDggMTIgMSAxMCAzIDcgMTUgMTQgOSAxNiAxNCAxIDE1IDMgMTQgOSAyIDIgMTIgMTQgNyAzIDUgMTQgNSAxNSAxMCAyIDE0IDEgCisxNSA4IF4KKzMzIDAgOSAxNiAxMCAxNiA2IDEzIDEgNiAyIDggMTMgNSA3IDIgMTUgMTEgMTIgNiA4IDcgMSA1IDggMTMgOSA0IDggMTIgOSAxNSAxIAorMTAgMTMgXgorMzAgMCAxMCA0IDE2IDQgMTMgMTIgMiA0IDE0IDYgMTEgMyAxNSA4IDQgMTIgMyAxMSAxNiAxNiAxNiAyIDEzIDcgMTAgMiAxMyAxMCAxNSAKKzEwIF4KKzMzIDEgMTYgMiAxNSAxMCA0IDEgMTMgMTIgMTIgOSAxMiA3IDE2IDQgMTIgNCAyIDE2IDQgOSAxNiA4IDIgNiAxNSAyIDMgNCA5IDEyIDYgCis4IDEyIF4KKzM0IDEgMTMgMTEgMTEgNCA5IDEzIDE0IDIgOSA2IDggNiAxMCAxMSA5IDMgMTIgOSAxMyA0IDEwIDMgNSAxIDE0IDExIDExIDE2IDEgMiAKKzIgMTEgNiAxNCBeCiszMyAxIDE1IDEyIDYgNSAxNiAyIDE0IDIgMTAgMTIgMiA1IDUgNiAxMCAxMyAxMiAzIDEwIDggMTYgOSA1IDEyIDE1IDQgMTEgMTMgMyA2IAorNSAxMCA4IF4KKzM1IDEgMSAzIDkgMyAxMSAxIDIgMTYgMTIgMTAgNiAxIDkgMSAxNiA1IDYgMTUgMSAxMiA0IDQgMiAxNSAxMyAxNSAxMSAxNSA1IDExIDkgCis3IDE1IDE2IDQgXgorMzYgMCAxNiAxMiAzIDIgMTAgMTYgNSA1IDcgMSA3IDExIDEzIDcgOSAxMSAyIDUgNSA1IDQgMTMgMTMgMTQgNCA3IDEyIDYgNCA4IDIgOSAKKzkgMTMgMTMgNCBeCiszNSAwIDMgNiA3IDE2IDcgNiAxNSA1IDggMTUgNiA0IDYgMTYgMTUgMTEgMTQgMTQgNCA3IDEwIDMgNCAxMCAzIDYgNyAxNCA0IDYgNiA1IAorMiA3IDE2IF4KKzMxIDAgNyA0IDggMTcgMTYgMTYgMTEgMTQgMiAxMCAxNCAxNSAxMCA5IDEgMTQgMTAgMTQgNiA2IDE2IDMgMiAzIDggMyAxMiA4IDExIAorMTcgMiBeCiszMCAxIDkgNyAxNiAxNCA0IDExIDE1IDUgMTMgOSA1IDEyIDE3IDE3IDEzIDggMiA2IDggMTYgMSAxMiA1IDE3IDIgOSA4IDEwIDEzIDYgXgorMjcgMCAxMSAxNyAxMiA1IDE0IDkgMTEgOSAxMSA0IDExIDEzIDE2IDYgMTAgNSA4IDMgMTcgMTYgMTQgMSAxNSAxNSAxNSA2IDE3IF4KKzI5IDEgMiAxMSA2IDEzIDExIDEzIDQgNiA3IDExIDExIDEyIDE2IDEzIDEgMTYgMTYgMTQgMTYgMiA0IDE2IDExIDYgMTUgNyA0IDE3IAorMTEgXgorMzIgMCA1IDcgNiAzIDE0IDE2IDUgMTcgMTEgMTMgMSAxIDE0IDEzIDMgNiAxNCA1IDE3IDUgNCA4IDE0IDMgMTYgNyAxMyA0IDE0IDggOSAKKzE3IF4KKzMxIDEgOCAxMiA4IDE1IDkgNiA2IDEgNSAxMyAxNiA1IDggNCA2IDEwIDYgMTEgMTYgMTcgMTUgMTUgMTIgNCAxMyA1IDMgNCAxMCAxNSAKKzE2IF4KKzMzIDAgNyAxNSAxNiAxMiAxMiAxMSA4IDEzIDE0IDUgOCAxIDExIDEwIDkgMyAxNCAzIDEgOSA2IDE1IDEyIDE2IDQgNSA5IDcgMSA5IDQgCis4IDE3IF4KKzM2IDEgNyA5IDE2IDExIDExIDYgMTMgNyAxIDcgOCAxIDE0IDEyIDIgNyA0IDUgMTUgMTYgMTIgMyAxIDYgMTEgNCAxNSA4IDkgOSAyIDEgCisxMyAyIDE0IDE0IF4KKzI5IDEgNiA4IDggMTUgMTMgMTMgMTAgMiAxNiAxMiAxNyA2IDcgMTQgMTMgMTIgMTMgMyAxNCAxMiAxMiAyIDE1IDIgNSAxNSAxMCA3IAorMTUgXgorMzggMSA1IDE1IDcgOCAxMCAxMCAxIDExIDIgNCAzIDExIDExIDMgNSAyIDMgMTEgNSAxMiAxMiA4IDYgMiAxNyAxNSA2IDE2IDE1IDQgMyAKKzE0IDYgMyAyIDEwIDUgMTUgXgorMzAgMCAxMiAxMSAxNSAxNCAyIDE2IDE0IDcgNiAxNSA5IDMgMTEgOCA4IDUgMTYgMiAxNiAyIDE2IDYgOSA2IDEyIDEwIDE2IDcgMTUgCisxMCBeCiszNiAwIDExIDUgMyAxNiAxIDE1IDcgMTAgMTcgMTAgMTAgMTMgMiAyIDE3IDYgMiA1IDYgNiAxMCAxMiAyIDkgMTEgMTIgNiAxIDEgOCAKKzEyIDIgNiAxNiAxMiAxNiBeCiszMCAxIDEwIDE3IDUgMSA2IDE0IDE3IDggMTIgMTAgMTEgMTYgMTUgMSA4IDMgOSAxMyA3IDcgMTYgOCAxMyAxMSAxMCA4IDE1IDMgMTUgCisxMiBeCiszMSAxIDE0IDggNCAxMiAxIDYgNSAxMyAxNSAzIDUgMTEgMTQgMTEgMTQgMTcgNSAxMCAxNyA3IDggMTMgNSAxMiAxNSAzIDYgMTcgNyAKKzE3IDcgXgorMzEgMCAxMiAzIDEwIDEwIDQgMTMgMTMgOCAxMSAxMyA3IDE3IDExIDEgMTAgMSA1IDExIDExIDkgMTQgMTMgMTUgOCAxNCAyIDcgMTYgCisxMSA4IDE1IF4KKzMyIDEgNyAxNiAxNyAxNyA0IDEgMTMgMTUgNSAxIDUgNiAxNCAxNSAxIDUgMSA5IDkgMTcgMTIgMTMgMTIgNyAxMiAzIDcgMTUgNCAxNiAKKzEyIDEzIF4KKzM2IDAgOCAxNyAxIDExIDQgMTAgMiA2IDEwIDMgMTYgMTYgMiA3IDEzIDkgMTUgNyAxNyAxNCAzIDEwIDE2IDEzIDYgNyA1IDIgMSA0IAorMTYgMyAxMCAxIDE1IDUgXgorMzIgMCA0IDYgNCAxNSAxMSA0IDIgMTcgOSAxNSA1IDEwIDcgMTIgMTUgMTYgMTUgMTcgMTIgMTQgOSAyIDEzIDQgOSAyIDQgMTUgMiAxMSAKKzkgMTYgXgorMjkgMCA0IDQgMyAxNyAyIDE0IDE3IDE3IDEgMTcgMTMgMTEgMTUgMTcgNCA5IDE1IDggMTEgMTYgOSAxMCA4IDkgMTIgMTUgMSAxNyAxMSAKK14KKzM1IDAgMTYgNCAyIDE0IDE0IDE1IDEgMiAxMiA5IDEgMTAgMTYgMTAgMTEgNyAxIDEyIDE3IDggMiAxNSAxMSAxIDcgMTcgMTIgNyAzIDcgCis2IDkgOSAxNCA2IF4KKzM2IDAgMiAxNSAxNyAxMCAxMSA5IDUgOSA0IDE3IDE2IDMgMTEgMiAxMCAxMiAxMSA1IDMgOCAxNyAxNSAzIDMgNCA3IDIgMSAxMCA3IAorMTQgNCAxNiA2IDEyIDggXgorMzYgMSAxMiAxNCA2IDkgMyAxNyAxMSAxMCA2IDggMTQgNiAxMSA3IDEwIDggNiAxNyA0IDQgOSA4IDIgOCAxNCA4IDcgMTQgMSAzIDYgOCAKKzExIDEwIDE3IDEgXgorMzkgMSAxMiAxNCA5IDQgMTEgNyA2IDYgMTMgMTQgMiAxMyAxIDE0IDkgNyA3IDE1IDIgMiA1IDE1IDEzIDE3IDMgMTUgMTYgOSAxIDEgMiAKKzMgMiAxMiAxIDMgMyAxMyA5IF4KKzM0IDAgMTMgMTAgMTUgNSA4IDEwIDE1IDEwIDggNyA1IDUgMTQgNCAxMyAxMSAxMiA0IDQgMTIgMTAgMTMgMTIgNCAxMCAzIDMgNyA5IAorMTMgMTYgOSAxNyAxIF4KKzM2IDAgNCAxMiAxIDkgMTIgMTMgNSAxMCAxIDMgMTUgNCAxIDEzIDE3IDEgOCA5IDYgMTIgNCA3IDcgMTAgMTcgMTMgMTcgNiAxNyA5IDYgCis5IDMgNSAxNyAxMCBeCiszNCAwIDEgNCAxMCAxMiAxNyAxNCAxMSA4IDUgMTYgNSA1IDIgMTMgMTMgMTYgOSAxMyAxMCA5IDkgNSAzIDEzIDYgNCAzIDkgMTUgMTQgCisxNCA3IDMgMTYgXgorMzggMSA5IDE3IDMgNiA1IDE2IDEwIDE0IDkgMSAxNiA3IDMgNSA0IDE3IDE0IDcgMTIgNiAyIDggOCAxNyA3IDIgNCA1IDcgMTIgMiAxIAorNyAxMSAzIDE0IDkgMTUgXgorNDEgMCAyIDEyIDMgNCAxIDQgMSAxNiAxMCA1IDE2IDggNyAyIDEwIDMgNSA5IDE2IDggMTYgMTMgMyAxMiA1IDUgMTEgMiAyIDcgNCAyIAorOCAxNiA0IDE0IDUgMTQgMTAgNCAxNyBeCiszNiAwIDYgMSAyIDcgMSAxNSAxMyAxIDE3IDQgNyA0IDggMTcgMTYgMTYgMTEgMTQgMiAxMCAxNCAxNSAxMCA5IDEgMTQgMTAgMTQgNiA2IAorMTYgMyAyIDMgOCAxNCBeCiszMiAxIDEyIDggMTEgMTcgMyA5IDcgMTYgMTQgNCAxMSAxNSA1IDEzIDkgNSAxMiAxNyAxNyAxMyA4IDIgNiA4IDE2IDEgMTIgNSAxNyAyIAorOSAxNCBeCisyOSAwIDEwIDEzIDE0IDExIDE3IDEyIDUgMTQgOSAxMSA5IDExIDQgMTEgMTMgMTYgNiAxMCA1IDggMyAxNyAxNiAxNCAxIDE1IDE1IDE1IAorMTQgXgorMzIgMCAxMyAyIDExIDYgMTMgMTEgMTMgNCA2IDcgMTEgMTEgMTIgMTYgMTMgMSAxNiAxNiAxNCAxNiAyIDQgMTYgMTEgNiAxNSA3IDQgCisxNyA2IDUgMTUgXgorMzUgMSA2IDMgMTQgMTYgNSAxNyAxMSAxMyAxIDEgMTQgMTMgMyA2IDE0IDUgMTcgNSA0IDggMTQgMyAxNiA3IDEzIDQgMTQgOCA5IDMgOCAKKzEyIDggMTUgMTEgXgorMzMgMSA2IDYgMSA1IDEzIDE2IDUgOCA0IDYgMTAgNiAxMSAxNiAxNyAxNSAxNSAxMiA0IDEzIDUgMyA0IDEwIDE1IDEyIDcgMTUgMTYgCisxMiAxMiAxMSAxMSBeCis0MCAwIDEzIDE0IDUgOCAxIDExIDEwIDkgMyAxNCAzIDEgOSA2IDE1IDEyIDE2IDQgNSA5IDcgMSA5IDQgOCA1IDcgOSAxNiAxMSAxMSA2IAorMTMgNyAxIDcgOCAxIDE0IDEwIF4KKzM0IDAgMiAxMCAxNSAxMCAxNCA4IDE4IDkgOSAxMiAxMiAzIDEzIDEyIDYgNCA5IDE3IDEzIDEzIDUgNyAzIDIgMSAxNyAxNCA0IDE2IDYgCisxMyAxIDEzIDEzIF4KKzM1IDEgNiAxMCAxIDMgMTggMyAxMSA3IDkgNSA3IDExIDE3IDEgOSAxNiA1IDE1IDEwIDE3IDMgOCAxNSAxNyA4IDE1IDExIDMgMTUgMTcgCisxMSAxIDEgNCAxNSBeCiszNiAxIDE0IDE4IDQgMiAxOCA4IDE1IDYgNCA2IDMgMTUgMTEgMTYgMTAgMTcgMTcgOSA2IDMgMiA2IDE2IDQgOSAxMiA2IDggMSAxMSAzIAorMiAxMiAyIDE0IDE2IF4KKzM3IDAgNCAxIDUgMTEgMTYgMTggMTYgOCAxMSAxNSAyIDE4IDcgNSAxNCA1IDE1IDEzIDMgMyA1IDQgMyAxMSA0IDQgNSAxMCAzIDEyIAorMTcgMSA0IDE3IDEwIDEwIDE3IF4KKzM1IDAgMSAzIDQgMiAxIDEyIDUgMTQgMTEgMTAgNCA2IDE0IDkgMSA1IDggMiA5IDE1IDEyIDEzIDcgMTYgMiAxMyAxNyAxNSA5IDE4IAorMTUgOSAxMyAxNiAxNyBeCiszNCAxIDE4IDEwIDQgMTEgMTMgOSA2IDEgMTcgNiA4IDYgNSAxMSA1IDE0IDE2IDkgMTMgMTEgMTAgOSAxNSA0IDE0IDcgMTQgMyAxIDE1IAorNSA1IDE4IDE2IF4KKzM0IDAgMTMgOCAxMyAxNiA1IDE3IDUgMTAgMSA4IDggMTIgNiAxMyAxOCA5IDYgMTcgMyAxNiAyIDggOSA4IDcgMiAxNCAxNCA4IDEwIAorMTMgOSAxMSAxMSBeCis0MCAwIDcgMTEgNCA2IDkgMTAgMTEgMTIgMiAxNCAxIDEzIDEgNyAxIDE1IDcgOSA4IDIgMSA0IDkgMTQgMTcgOCAxNyAxNSAzIDQgMTUgCisxNSAyIDIgMyAxNiAxMyAyIDkgMTIgXgorMzMgMCAxNCA2IDYgNSAyIDEzIDQgMTYgMTEgMyAxMCAxOCAyIDE1IDUgOSA0IDggNCAxOCAxOCAxNyAxOCAzIDE0IDEyIDkgMTEgMTUgCisxNiAxIDkgMTYgXgorMzIgMSAxOCA1IDEwIDYgNyAxNyA3IDEyIDMgMTMgOCAxMiAzIDggOSAzIDE3IDEyIDggMTggNiAxNCAzIDYgMTQgMTQgMTAgMTQgMTMgCisxNyAxOCA4IF4KKzM2IDEgMTggMTIgMTcgOSAxNyAyIDEyIDUgOSAxMiAxIDE4IDEwIDUgNSAyIDE4IDMgNiAxNiAxOCAzIDEgMiAxMCAxNSAyIDUgOCAxNiAKKzEwIDE0IDMgOSA4IDEzIF4KKzMzIDEgMTYgMTQgMSAxNiAxNSAxNiAxNyA0IDEyIDEyIDE2IDUgMyA5IDE0IDUgNyAxNyAxMiAxMSAxMiAxOCAxNCAyIDcgNyAxNSA4IDMgCis1IDEgOCAxMyBeCiszNCAxIDcgNiA3IDE0IDkgMTUgMTUgMTggMTYgMyAxMCA1IDE2IDYgOCAxMSA0IDEgMTAgMSAxNiA0IDEyIDE3IDE1IDE0IDggNSA0IDYgCis0IDE3IDE2IDE2IF4KKzM4IDAgNCA1IDE4IDE4IDEyIDkgMyA5IDYgOSA3IDYgMTAgMTUgNCA5IDE3IDUgMTcgNSA2IDEgNiAyIDggMTcgNyA3IDQgNCAxMyAxNiAKKzMgNCAxMCAxNiAxMiAxMyBeCiszMyAwIDE2IDcgMTggMyAzIDExIDkgMTMgMTQgMTUgMTggMiAxMiAxMCAzIDE1IDMgMSAxMCA2IDE1IDEzIDE3IDEzIDUgOSA3IDExIDkgCis1IDE4IDE1IDEyIF4KKzMzIDEgMTYgMTEgMSA2IDE4IDEzIDggMSAxOCA4IDEgNSAxMyAxIDE4IDUgMTUgMTUgMTYgMTIgMTMgMiAxNyAxMiAxNCAxNyA4IDEgMTAgCisxMiAxMCA0IDE4IF4KKzM0IDAgNSA2IDE4IDE4IDcgMTAgMTMgMTQgMTAgMTIgNyA0IDEwIDggMTYgMTYgMTUgNSAxMyAxNCA0IDE0IDIgNCAxMiA2IDExIDUgMTcgCis4IDUgMSAxNCAxNiBeCiszMSAxIDE3IDkgMTEgMiAxMSAxMSAzIDEzIDEzIDExIDEyIDEzIDUgMTIgMTIgMTEgNiAxMyA0IDE4IDE1IDEyIDE4IDYgNiA3IDE1IDEzIAorMTIgMTQgMTYgXgorMzggMSA0IDExIDIgNSA2IDEyIDEwIDIgNyAxNSAxMSA4IDE0IDcgMTYgMTYgMSA0IDMgOSAxNCAxNiAzIDE4IDEgNyAxNyAxIDcgMyAxNiAKKzE3IDYgMTYgMTIgNSAzIDE3IF4KKzQwIDEgMTAgMTUgMTggMTAgOCAxMCAyIDUgMTEgMiA3IDMgNSA2IDcgMSAxMiAyIDkgMiA0IDE1IDEgMTEgMTEgMTcgMyAzIDE2IDggMyAKKzExIDE4IDE2IDExIDYgMTUgOCA4IDEzIF4KKzQwIDEgMTAgMyAxNyA3IDEwIDE4IDEzIDE0IDggNyA4IDE0IDIgMiA4IDYgMyA3IDUgNiA5IDUgMTIgMTAgNyA2IDUgMTYgNCAxNCAyIAorMTUgMyAxNSA5IDE1IDEgOSA3IDEyIF4KKzM1IDAgMTQgMTUgMTIgNyAyIDE2IDE4IDggMTggMSAxMyAxMiAxIDEgMTQgMTQgMTMgMyAxNCA3IDIgMTAgMTAgMTEgMTQgMyAxMiA1IAorMTMgNiAxNyAxNCAxIDExIDEzIF4KKzM0IDAgNyAxMiA4IDEyIDE3IDE3IDE4IDE3IDEzIDIgNCA3IDUgMSAxNSA3IDE0IDE3IDExIDYgMTAgOSAxOCA5IDE0IDEzIDMgOCA0IAorMTMgOCA3IDEzIDcgXgorMzUgMCA0IDE2IDggMTcgMTAgMiAxMyAxMCAyIDIgNiAyIDMgMTggMTcgMiAxNyA0IDE4IDcgMTYgMTggMTQgNCAxMSA3IDQgMTUgMTcgNiAKKzExIDExIDE0IDE3IDQgXgorMzcgMCAxMCAxNyAxNiAxMyAxNSAxNCA2IDEgMTQgMTEgOCAxNiA2IDIgMTYgMTMgNyA4IDYgMiAxNSAxIDkgMTIgNCA0IDExIDEzIDcgMiAKKzExIDkgMTggNCA1IDQgMTggXgorMzkgMCAyIDE0IDkgOSAxIDggMTMgMTEgMTUgOCA1IDkgMTAgMTYgOSAyIDcgMSAxIDE3IDEzIDYgMTEgMTAgOCA1IDEyIDE1IDYgMTUgCisxMCAxMiA0IDE4IDEgMiA4IDExIDE1IF4KKzMyIDEgMTYgMTAgMTIgMTggMTEgMTYgMTIgMTEgMTcgMTcgNCA3IDEzIDcgMTAgNyAxMCA2IDEgMTIgNyAxOCAxMSAxOCAyIDEwIDE1IAorMTAgMTQgOCAxOCAyIF4KKzQwIDEgOSAxMiAxMiAzIDEzIDEyIDYgNCA5IDE3IDEzIDEzIDUgNyAzIDIgMSAxNyAxNCA0IDE2IDYgMTMgMSAxMyA2IDYgMTAgMSAzIAorMTggMyAxMSA3IDkgNSA3IDExIDE3IDEyIF4KKzM2IDEgOSAxNiA1IDE1IDEwIDE3IDMgOCAxNSAxNyA4IDE1IDExIDMgMTUgMTcgMTEgMSAxIDQgMyAxNCAxOCA0IDIgMTggOCAxNSA2IDQgCis2IDMgMTUgMTEgMTYgOCBeCiszOSAxIDE3IDE3IDkgNiAzIDIgNiAxNiA0IDkgMTIgNiA4IDEgMTEgMyAyIDEyIDIgMTQgMTIgNCAxIDUgMTEgMTYgMTggMTYgOCAxMSAKKzE1IDIgMTggNyA1IDE0IDUgMTUgMTAgXgorNDcgMSAzIDMgNSA0IDMgMTEgNCA0IDUgMTAgMyAxMiAxNyAxIDQgMTcgMTAgMTAgOSAxIDMgNCAyIDEgMTIgNSAxNCAxMSAxMCA0IDYgCisxNCA5IDEgNSA4IDIgOSAxNSAxMiAxMyA3IDE2IDIgMTMgMTcgMyBeCiszNCAxIDkgMTggMTUgOSAxMyAxNiAxOCAxMCA0IDExIDEzIDkgNiAxIDE3IDYgOCA2IDUgMTEgNSAxNCAxNiA5IDEzIDExIDEwIDkgMTUgCis0IDE0IDcgMTQgOSBeCiszNyAxIDEgMTUgNSA1IDE4IDEzIDEzIDggMTMgMTYgNSAxNyA1IDEwIDEgOCA4IDEyIDYgMTMgMTggOSA2IDE3IDMgMTYgMiA4IDkgOCA3IAorMiAxNCAxNCA4IDEwIDEzIF4KKzQyIDAgOSAxMSAxMCA3IDExIDQgNiA5IDEwIDExIDEyIDIgMTQgMSAxMyAxIDcgMSAxNSA3IDkgOCAyIDEgNCA5IDE0IDE3IDggMTcgMTUgCiszIDQgMTUgMTUgMiAyIDMgMTYgMTMgMiAxNyBeCiszNiAwIDE2IDE0IDYgNiA1IDIgMTMgNCAxNiAxMSAzIDEwIDE4IDIgMTUgNSA5IDQgOCA0IDE4IDE4IDE3IDE4IDMgMTQgMTIgOSAxMSAKKzE1IDE2IDEgOSAyIDE4IDYgXgorMzMgMSAxMCA2IDcgMTcgNyAxMiAzIDEzIDggMTIgMyA4IDkgMyAxNyAxMiA4IDE4IDYgMTQgMyA2IDE0IDE0IDEwIDE0IDEzIDE3IDE4IAorMTQgMTggMTIgMTMgXgorMzkgMSA5IDE3IDIgMTIgNSA5IDEyIDEgMTggMTAgNSA1IDIgMTggMyA2IDE2IDE4IDMgMSAyIDEwIDE1IDIgNSA4IDE2IDEwIDE0IDMgOSAKKzggMTAgMTYgMTQgMSAxNiAxNSAxNCBeCiszMCAxIDE3IDE5IDUgNyAxNCA0IDExIDMgNiAxOCAxMyA3IDE4IDE4IDE5IDE5IDEzIDkgMTAgMTkgMTQgMTIgNCAxNSAxNSAxOCAyIDEwIAorNyAxNSBeCiszNCAxIDIgMTMgOCAxOSAxNSAxIDExIDE0IDcgNyAxNyA2IDE2IDQgMTYgMTcgMiAxOCAxMiA1IDE0IDE5IDE3IDEgOCAxMiA2IDYgNiAKKzE5IDEzIDEwIDE2IDUgXgorMzYgMSAxNCAxMyA2IDE2IDE0IDE1IDQgMTMgMTUgNCA0IDExIDQgMTAgMyAxNyA0IDE5IDYgMTcgMTQgMyAyIDE2IDEgMTQgMTYgNSAxNyAKKzggMSAxIDE5IDEzIDEyIDEyIF4KKzM0IDAgMTcgMTEgMTMgNSAxOSAxMSAxOCAxOSAxIDMgMTIgMTEgOCA0IDExIDEzIDE3IDMgOCA5IDQgNSAxMiAxNSAxMiA2IDcgMTYgMTYgCisxMiAxIDEzIDE3IDE1IF4KKzQwIDAgMTggOSAzIDE2IDIgMTYgNCAxOSA2IDYgMTggMyAxMyAxIDUgMyAyIDYgMTUgMTEgNiA0IDE0IDE1IDE1IDkgMTMgOCAxIDkgMTUgCisyIDcgNSAxMSA1IDEyIDcgMTYgMTUgXgorMzcgMCAxOCA0IDMgMSA0IDExIDE1IDcgNiA5IDEgMTQgNyAxIDE3IDE3IDE2IDE0IDEzIDE0IDEyIDE0IDkgMTIgMTEgMTggNyAxNCAzIAorMSA2IDEgMTUgOCAxNSAxOSA5IF4KKzMyIDAgMyA5IDkgNyA3IDEwIDEyIDEzIDcgMTEgMTIgMTYgOSA5IDkgMTcgMTMgMTMgMiAxNyAxMCA0IDE4IDE3IDE5IDE2IDExIDExIAorMTMgMTggMTMgMTIgXgorMzUgMCA4IDE1IDE4IDEwIDYgMTAgMTggMTcgOSAyIDE0IDEgMTcgMTggNiAxNCAxMiA1IDUgMTUgMTcgMTAgMyA4IDggMSAxMCA1IDEgCisxOCAxOCA5IDE2IDEwIDE0IF4KKzM4IDEgNiAxNiAxIDYgMyA1IDggMTYgOCA3IDUgMTggMTEgMTUgMTcgNiAxMSAxMCA0IDggMTQgMTYgNiA3IDggMTIgMTIgMTggMSAxMCAKKzQgNyAxIDE5IDcgMTkgMTUgMTIgXgorMzQgMCAxIDE0IDYgMTEgMTggNSA0IDEyIDYgMTQgMiAxOSAyIDUgMTMgMTAgMTAgMiAxNiAxMCAxOCAxNiAxOSAyIDE1IDEwIDcgMTggCisxNiAxNyAxNSAxNSA5IDEzIF4KKzM4IDEgMTAgMTYgNCAxNSA3IDUgMTkgMSAxNSAxNiAxMSAxOSA5IDE4IDIgNCA2IDEyIDkgOCA3IDEzIDE0IDExIDQgMTIgMTMgNSA5IDYgCis1IDYgMTYgMTEgOSAzIDE1IDYgXgorNDAgMCAxNiAxIDEzIDYgOCAxOCAxMSAxMSAyIDEgMiAyIDE0IDkgMTMgMSAxNSA2IDUgMTYgMTkgMTQgMTkgNyAxOCA1IDIgMiAzIDEzIAorMTMgMTIgMTMgMTEgMiAxMiAyIDEyIDE4IDUgXgorMzUgMCA3IDggMTMgNiA5IDggMTcgMTAgMTEgMSA5IDE0IDQgMTkgMTkgMyAxNSAxMyA5IDE4IDEyIDE3IDEgMTYgOCA5IDE1IDEgMTIgNCAKKzQgMTkgMTggMTMgMTEgXgorMzYgMSAxNCAxOCA4IDE0IDkgMyA0IDE4IDE2IDkgMTkgMTIgMyAxNyA1IDEwIDE2IDUgOCA0IDQgMTAgMTQgMTMgNCA5IDExIDE5IDggOCAKKzUgMSAxMyAxNiAxNCAxMyBeCis0MSAxIDEwIDE1IDMgNCA4IDIgMTIgOSAxNiAzIDE2IDMgNiAxNyAzIDEwIDE5IDcgNiAxIDUgMTEgMTggOSA0IDYgMiAxNSAxMSAxNyAKKzE3IDE3IDQgMTAgMTMgMyA3IDEwIDMgOSAxNCBeCis0MiAwIDcgOSAzIDMgOCAxOSAxMCA4IDIgMTkgMTIgMTkgMTMgNiAxOSAzIDQgMTcgNiA5IDEgNyAyIDkgNyAxOCA2IDE1IDIgMiA0IDMgCisxMCAxMSAxMSA2IDEyIDEwIDE4IDQgMTIgMTAgXgorMzUgMSA0IDUgMTEgMTIgMTUgMTkgMTIgMTAgNiAxNSAxNCAxOSAxOCAxMSA4IDExIDE3IDE2IDcgNyAxMSAyIDEwIDYgMTkgNSAxNCA3IAorMSA3IDMgMTkgNCAxNyAxNSBeCiszNiAxIDUgMTAgMiAxOCAxIDE3IDggMTIgMTcgMiA5IDggOCAzIDE0IDEwIDE1IDIgMTQgOCAzIDEgMTYgMTggMTIgMTggMTEgMTYgNyAKKzE3IDUgMTkgMiAxOSAxMiAxOSBeCiszNyAwIDE2IDE0IDIgOSAxNiAyIDYgNiA3IDkgMTAgOSAxMSA5IDE0IDExIDE1IDUgMTYgOSAyIDE3IDIgOCAxNSA4IDQgMyAxNCAxNCAKKzE2IDE2IDEzIDExIDEwIDE2IDE0IF4KKzQwIDAgMTEgNyAxNCAxNCAxNCA2IDEwIDEwIDEgNiAxMyAxOSA1IDYgNCA3IDEyIDEyIDEwIDUgMTAgMTUgMTUgOCA1IDEzIDE3IDEzIDUgCis2IDE0IDEgOSAyIDYgNSAxNyA5IDExIDEzIF4KKzM4IDAgMTggOCA2IDEzIDE1IDMgMyAxNSA1IDEzIDE4IDMgMiA1IDUgMTQgNyAxMyA0IDE3IDcgMiAxNyAzIDE4IDE1IDcgMTUgMTYgMTggCis1IDEyIDggNiAzIDE3IDEyIDEzIF4KKzM4IDEgMTkgMTUgOSA3IDE3IDE2IDE1IDMgMTEgMTEgNSAyIDEzIDE5IDE2IDIgNCAxNiA3IDggMSAyIDkgMTcgMTIgMyA1IDE4IDE5IAorMTEgMTcgOSAxIDQgMSAxOCAxMCAxMCBeCis0MSAxIDEzIDEgNyAxMyA1IDcgNCAxIDggMTMgMTYgMyA1IDcgNiA4IDggMTQgOCAxMyA3IDE5IDggMTYgMTggNCAyIDggNyAxMiA0IDE0IAorNSAxIDMgMTkgMTcgMTEgMTQgMTUgMTkgXgorMzkgMCAxMCA5IDEyIDE5IDExIDEwIDMgMTggMTQgMTcgMTggMTcgNyAxMiAxNCA4IDExIDcgMiAxMCAxNyAxNSA1IDMgMTIgMyAxMiAxIAorMiAxIDEgMTIgMTQgMTAgMiA4IDE3IDE4IDIgXgorNDUgMSA0IDkgNCAxNiA1IDE4IDEgMSAxMCAxMCAxMSAzIDEwIDEyIDEgMyAxMSAxIDExIDUgMyAzIDE2IDE1IDEwIDE3IDE0IDE1IDYgCisxMyAxMiAyIDMgMTQgMyA5IDE5IDQgNCA4IDEwIDE0IDUgMTEgOSBeCiszNSAwIDIgNyAxNSAxNCA4IDIgMTEgMTkgMTkgNCA1IDEwIDggOSA1IDE1IDkgMTcgMTkgNSA3IDE0IDQgMTEgMyA2IDE4IDEzIDcgMTggCisxOCAxOSAxOSAxMyAxMyBeCiszNSAxIDEwIDE5IDE0IDEyIDQgMTUgMTUgMTggMiAxMCA3IDkgMiAxMyA4IDE5IDE1IDEgMTEgMTQgNyA3IDE3IDYgMTYgNCAxNiAxNyAyIAorMTggMTIgNSAxNCAxOSA5IF4KKzM4IDEgMSA4IDEyIDYgNiA2IDE5IDEzIDEwIDE2IDEzIDE0IDEzIDYgMTYgMTQgMTUgNCAxMyAxNSA0IDQgMTEgNCAxMCAzIDE3IDQgMTkgCis2IDE3IDE0IDMgMiAxNiAxIDE0IDE5IF4KKzM4IDAgNSAxNyA4IDEgMSAxOSAxMyAxMiAxMiAxNyAxMSAxMyA1IDE5IDExIDE4IDE5IDEgMyAxMiAxMSA4IDQgMTEgMTMgMTcgMyA4IDkgCis0IDUgMTIgMTUgMTIgNiA3IDE2IDExIF4KKzQzIDAgMTIgMSAxMyAxNyA0IDE4IDkgMyAxNiAyIDE2IDQgMTkgNiA2IDE4IDMgMTMgMSA1IDMgMiA2IDE1IDExIDYgNCAxNCAxNSAxNSAKKzkgMTMgOCAxIDkgMTUgMiA3IDUgMTEgNSAxMiAxNiBeCiszOSAxIDE2IDYgMTggNCAzIDEgNCAxMSAxNSA3IDYgOSAxIDE0IDcgMSAxNyAxNyAxNiAxNCAxMyAxNCAxMiAxNCA5IDEyIDExIDE4IDcgCisxNCAzIDEgNiAxIDE1IDggMTUgMTkgMTIgXgorMzUgMCAzIDkgOSA3IDcgMTAgMTIgMTMgNyAxMSAxMiAxNiA5IDkgOSAxNyAxMyAxMyAyIDE3IDEwIDQgMTggMTcgMTkgMTYgMTEgMTEgCisxMyAxOCAxMyA4IDggMTUgNiBeCis0MCAwIDEwIDYgMTAgMTggMTcgOSAyIDE0IDEgMTcgMTggNiAxNCAxMiA1IDUgMTUgMTcgMTAgMyA4IDggMSAxMCA1IDEgMTggMTggOSAKKzE2IDEwIDE5IDYgMTYgMSA2IDMgNSA4IDE2IF4KKzQwIDAgOCA3IDUgMTggMTEgMTUgMTcgNiAxMSAxMCA0IDggMTQgMTYgNiA3IDggMTIgMTIgMTggMSAxMCA0IDcgMSAxOSA3IDE5IDE1IDIgCisxIDE0IDYgMTEgMTggNSA0IDEyIDYgMTkgXgorMzUgMCAyIDE5IDIgNSAxMyAxMCAxMCAyIDE2IDEwIDE4IDE2IDE5IDIgMTUgMTAgNyAxOCAxNiAxNyAxNSAxNSA5IDE1IDEwIDE2IDQgCisxNSA3IDUgMTkgMSAxNSAxNiA2IF4KKzQzIDEgMTkgOSAxOCAyIDQgNiAxMiA5IDggNyAxMyAxNCAxMSA0IDEyIDEzIDUgOSA2IDUgNiAxNiAxMSA5IDMgMTUgMTIgMTYgMSAxMyAKKzYgOCAxOCAxMSAxMSAyIDEgMiAyIDE0IDkgMTMgMTEgXgorMzkgMSAxNSA2IDUgMTYgMTkgMTQgMTkgNyAxOCA1IDIgMiAzIDEzIDEzIDEyIDEzIDExIDIgMTIgMiAxMiAxOCA3IDggMTMgNiA5IDggCisxNyAxMCAxMSAxIDkgMTQgNCAxOSAxOSAzIF4KKzM0IDEgMTUgMTMgOSAxOCAxMiAxNyAxIDE2IDggOSAxNSAxIDEyIDQgNCAxOSAxOCAxMyAxNSAxNCAxOCA4IDE0IDkgMyA0IDE4IDE2IDkgCisxOSAxMiAzIDE3IDE1IF4KKzQ1IDEgMTAgMTYgNSA4IDQgNCAxMCAxNCAxMyA0IDkgMTEgMTkgOCA4IDUgMSAxMyAxNiAxNCAxIDEwIDE1IDMgNCA4IDIgMTIgOSAxNiAKKzMgMTYgMyA2IDE3IDMgMTAgMTkgNyA2IDEgNSAxMSAxOCAyIF4KKzQzIDEgMTUgNCAxMyAxNCAzIDQgMSAzIDEgNSAxMSA0IDkgNyAyMCA4IDE1IDQgMTYgNyAxOSAxMSAxIDExIDIgMTMgMTMgMTEgMTIgMTMgCisxNSAxMiAxIDUgMTMgMyA4IDE1IDEyIDggMTYgMTYgNiBeCis0NCAwIDUgMTMgMTIgMTQgNSAzIDEgNCAxNiAxMiAyMCAxIDYgMTUgMTEgMTggNCAxNyAxNiA2IDEwIDMgMiA5IDkgMTQgNiAyIDggNiA3IAorMTAgMTcgMTIgMjAgNiA3IDUgMTYgMSA0IDIgMTcgOSBeCiszOCAwIDE1IDggMjAgMTggMjAgMTEgMTUgMTEgMTEgOSA2IDIgMTUgNSAxNyAxMiAxIDkgMSAzIDUgMTEgNyAyIDIgNiAxOCAyIDkgMTEgCis4IDE2IDExIDE2IDE1IDE4IDE4IDE4IF4KKzM1IDEgMjAgMiAxNyAxNyAxMCA4IDEzIDIwIDQgMTggNiAxOCA5IDQgMSAxIDE4IDUgMiAxNyAxNSAxNiAxOSAxNSAxIDEwIDE3IDE2IDQgCisxNiAxNCAxNCAxMSAxNSAxMCBeCiszOCAwIDUgOSAxNSAxMCA5IDE3IDE4IDE0IDE1IDEyIDYgMSAxNiA4IDE4IDggMTMgMTIgMTAgMTQgMTQgMTMgOSAyIDE0IDE3IDkgMSAKKzIwIDEwIDQgMiAxMiA5IDQgMTMgMTYgNSBeCiszNiAwIDE0IDEwIDExIDE2IDE3IDEyIDE4IDEyIDcgMTcgOCA3IDMgMSAzIDE3IDQgOSA1IDE3IDE0IDE3IDExIDUgMjAgMTkgOCAxOSAKKzE0IDEzIDIgMTggMyAzIDE4IDEzIF4KKzQxIDEgMTMgOCAxNCA2IDE4IDcgMTAgMSAxMyAxMCAxMSAxMSAxNiAxIDIgOCA3IDEgNyAxNCA4IDE3IDYgOCA0IDMgMTEgMTcgMyA1IDcgCisxNiAxMSAxMSAxNCA3IDEzIDIwIDIwIDcgMjAgXgorNDAgMSAxMyAxNSAxNCAxNiAxNCA4IDkgMTYgNSAxIDYgMyAxNyAxOCAxNiA5IDEgMTUgOSAxMCA5IDE5IDEgMyAzIDIwIDExIDEzIDE3IAorMSAxOSA4IDMgNCAzIDcgMSAxNCAxOSAxNyBeCiszNyAxIDE4IDEzIDExIDUgMTggNCAxOSAxMCA2IDE5IDExIDE3IDEwIDEwIDcgOSAxMyAxNiA5IDEwIDE4IDQgMTIgNSAxNiA1IDIwIDEyIAorMyA4IDEwIDEgMTggMSA2IDIwIDE0IF4KKzM2IDAgOCA5IDYgMTIgMTEgNyA3IDMgMTcgMTMgNiAyMCAxNyA5IDIwIDE2IDEwIDEyIDE3IDggMTEgOCAxMSAxMCA1IDEwIDE0IDE4IDggCisxOSA5IDEyIDEyIDIgMjAgMTIgXgorMzggMCAxMiAxNiAyMCAzIDkgOSAxOSAxNyAxMyAxMyA0IDE3IDIgMTEgNyAxNCAzIDYgMTYgMTMgMTAgMTMgNSAxNiAxMCAyIDggMiAxNyAKKzE5IDQgMTcgNyAxOSA2IDkgMTUgNyBeCis0MSAxIDIwIDcgMiAxOCA1IDcgMTggNSAyIDE1IDcgMTEgMTAgOSAzIDIgMTQgMTkgMyAxMSA4IDE4IDE1IDUgMyA1IDEyIDE1IDE2IDEwIAorMTcgNyAxOSAxNiAyIDEgMTYgNiAzIDE5IDEwIF4KKzQ2IDAgNSAxOCA5IDkgMTEgMiAxIDEyIDExIDE0IDEyIDE0IDEwIDQgMTEgNiA4IDE2IDcgNSAxMSAyMCA4IDE3IDQgMTQgNCAxNSAzIDIgCisyIDQgMyAyIDMgMTQgMTUgMTAgMiAxMiA3IDMgNyAyMCAyMCA1IF4KKzQxIDEgMTAgMiAzIDEgMTAgMTIgMTUgMTQgMTEgMjAgMyAxNiAxNCA5IDQgMTggMSAxOSAyMCA5IDUgMTIgMTMgNiA2IDEgOSAxMyA3IAorMTUgOSA4IDUgMTkgMyAxNiA5IDggMTAgMjAgOCBeCiszOSAxIDExIDEzIDE5IDUgNyAxNiAxOCAxNiA0IDQgNCA2IDkgMTMgMTAgMTkgMTUgMyAxNCA2IDQgMTIgMTAgMTUgMTUgNCA4IDEzIDEzIAorOSAxOCAxMyA2IDQgNyAyMCA0IDIwIDcgXgorMzEgMSAxOCAxOCAxMiAxNiAxMyAxOSAxOSA1IDcgMiA2IDExIDE4IDkgMTggNiAxMSAxNCAxNCAxOCAxMCAxMyAxOSAyMCAxNyAxMSAxNCAKKzUgMTkgMjAgMTMgXgorNDYgMSAyMCAxIDEgNCAxMyAxMCA2IDUgNiAxOSAxOCAxIDMgOSAxNCAyMCA3IDE4IDcgMTUgMiAzIDE1IDUgMSAxIDIgNiAxMyAxIDE5IAorNiAxNCAxNiA1IDE1IDExIDEzIDMgNiAxMSAyIDIwIDggMSAyMCBeCiszNyAwIDQgMjAgMTkgMyAxOCAzIDggMTkgNyA4IDEyIDE0IDEyIDE5IDExIDE1IDYgMTkgMSAxOSA0IDEwIDE2IDE3IDcgMTcgMSAyIDEzIAorMTggMTIgMiAxOCAxOSAyIDcgMTUgXgorNDIgMSA5IDE4IDggNSAxNCAyIDUgNCA0IDIwIDE0IDEzIDcgOCAxNCA4IDEgNyAxOSA5IDcgMTEgMTIgNCAxOSAxMiAxMCAxOSAyMCA0IAorNCAxIDggMiAxNiAxNiA4IDIwIDIgMSAyMCAxMyBeCiszNyAxIDEgMTUgNyA2IDIwIDEwIDE0IDkgMTIgMTkgMTggMjAgNiAxNCA2IDUgNiAxNyAxNCAxMiAxMiAxNiA0IDIgMTkgMTQgMTUgMTcgCis3IDEyIDExIDEyIDggMTQgMSAxNyA3IF4KKzM5IDAgMTUgMTggMiA0IDEwIDE4IDExIDE3IDUgOSAxNyA0IDE5IDUgNSA4IDYgMiAyMCAxNSA2IDUgMTggMTEgMyAxMCAyMCAxMCAxNiAKKzMgMTIgNyA1IDE0IDE4IDE1IDE0IDkgMTQgXgorNDQgMCAxNCA3IDYgMTUgOSAzIDQgOCA4IDEyIDE5IDIgOSAxNiAxOSA2IDE2IDIwIDUgMyAxOSA3IDQgNyA0IDUgMTAgNSAxIDE4IDcgCisxNyA2IDMgMyAxMyAxNiAyIDMgMjAgMTYgMTIgNiAxNiBeCiszOCAwIDE3IDE5IDIgMiAxMSAxOSAxMyA0IDE1IDggMSAxMiA5IDIwIDIgNSAyIDEwIDIwIDUgMTUgMTMgNyAxMyAxNSAxOSAxNyAxMSA5IAorMTUgOCAxNSAxNyA5IDYgMTYgOCAxMyBeCiszOCAxIDE4IDEwIDggOCAxMCAxNSAxMyA4IDQgNSAxNSA2IDEyIDEzIDEgMTcgMTIgNCA3IDE4IDEwIDEyIDEwIDMgMTUgMjAgNSAxOSA4IAorMTcgMjAgMTMgMTQgMTAgOSAxMiAxNyA1IF4KKzQ2IDEgMTAgMTggNiA2IDE1IDQgMTMgMTQgMyA0IDEgMyAxIDUgMTEgNCA5IDcgMjAgOCAxNSA0IDE2IDcgMTkgMTEgMSAxMSAyIDEzIAorMTMgMTEgMTIgMTMgMTUgMTIgMSA1IDEzIDMgOCAxNSAxMiA4IDE2IDYgXgorNDUgMSAxNyA1IDEzIDEyIDE0IDUgMyAxIDQgMTYgMTIgMjAgMSA2IDE1IDExIDE4IDQgMTcgMTYgNiAxMCAzIDIgOSA5IDE0IDYgMiA4IAorNiA3IDEwIDE3IDEyIDIwIDYgNyA1IDE2IDEgNCAyIDE3IDE2IF4KKzQwIDAgMTUgOCAyMCAxOCAyMCAxMSAxNSAxMSAxMSA5IDYgMiAxNSA1IDE3IDEyIDEgOSAxIDMgNSAxMSA3IDIgMiA2IDE4IDIgOSAxMSAKKzggMTYgMTEgMTYgMTUgMTggMTggMyAyMCAxOSBeCiszOCAwIDE3IDE3IDEwIDggMTMgMjAgNCAxOCA2IDE4IDkgNCAxIDEgMTggNSAyIDE3IDE1IDE2IDE5IDE1IDEgMTAgMTcgMTYgNCAxNiAKKzE0IDE0IDExIDE1IDIgNSA5IDE1IDEwIDE1IF4KKzM4IDAgMTcgMTggMTQgMTUgMTIgNiAxIDE2IDggMTggOCAxMyAxMiAxMCAxNCAxNCAxMyA5IDIgMTQgMTcgOSAxIDIwIDEwIDQgMiAxMiAKKzkgNCAxMyAxNiA3IDE0IDEwIDExIDE2IDE5IF4KKzM5IDAgMTIgMTggMTIgNyAxNyA4IDcgMyAxIDMgMTcgNCA5IDUgMTcgMTQgMTcgMTEgNSAyMCAxOSA4IDE5IDE0IDEzIDIgMTggMyAzIAorMTggMTcgMTMgOCAxNCA2IDE4IDcgMTAgMTIgXgorNDEgMCAxMyAxMCAxMSAxMSAxNiAxIDIgOCA3IDEgNyAxNCA4IDE3IDYgOCA0IDMgMTEgMTcgMyA1IDcgMTYgMTEgMTEgMTQgNyAxMyAyMCAKKzIwIDcgMTYgMTMgMTUgMTQgMTYgMTQgOCA5IDE2IF4KKzQzIDEgNSAxIDYgMyAxNyAxOCAxNiA5IDEgMTUgOSAxMCA5IDE5IDEgMyAzIDIwIDExIDEzIDE3IDEgMTkgOCAzIDQgMyA3IDEgMTQgMTkgCisxOSAxOCAxMyAxMSA1IDE4IDQgMTkgMTAgNiAxOSA0IF4KKzQxIDEgMTcgMTAgMTAgNyA5IDEzIDE2IDkgMTAgMTggNCAxMiA1IDE2IDUgMjAgMTIgMyA4IDEwIDEgMTggMSA2IDIwIDEyIDggOSA2IAorMTIgMTEgNyA3IDMgMTcgMTMgNiAyMCAxNyA5IDE1IF4KKzM3IDAgMTYgMTAgMTIgMTcgOCAxMSA4IDExIDEwIDUgMTAgMTQgMTggOCAxOSA5IDEyIDEyIDIgMjAgMTMgMTIgMTYgMjAgMyA5IDkgMTkgCisxNyAxMyAxMyA0IDE3IDIgMTEgNyAxNiBeCis0MyAwIDMgNiAxNiAxMyAxMCAxMyA1IDE2IDEwIDIgOCAyIDE3IDE5IDQgMTcgNyAxOSA2IDkgMTUgMTUgMjAgNyAyIDE4IDUgNyAxOCA1IAorMiAxNSA3IDExIDEwIDkgMyAyIDE0IDE5IDMgMTEgMTQgXgorNDMgMSAxOCAxNSA1IDMgNSAxMiAxNSAxNiAxMCAxNyA3IDE5IDE2IDIgMSAxNiA2IDMgMTkgMTIgNSAxOCA5IDkgMTEgMiAxIDEyIDExIAorMTQgMTIgMTQgMTAgNCAxMSA2IDggMTYgNyA1IDExIDIwIDIgXgorNDUgMCAxNyA0IDE0IDQgMTUgMyAyIDIgNCAzIDIgMyAxNCAxNSAxMCAyIDEyIDcgMyA3IDIwIDIwIDE5IDEwIDIgMyAxIDEwIDEyIDE1IAorMTQgMTEgMjAgMyAxNiAxNCA5IDQgMTggMSAxOSAyMCA5IDUgMTggXgorNDIgMCAxMyA2IDYgMSA5IDEzIDcgMTUgOSA4IDUgMTkgMyAxNiA5IDggMTAgMjAgMTQgMTEgMTMgMTkgNSA3IDE2IDE4IDE2IDQgNCA0IAorNiA5IDEzIDEwIDE5IDE1IDMgMTQgNiA0IDEyIDE4IF4KKzM2IDEgMTUgMTUgNCA4IDEzIDEzIDkgMTggMTMgNiA0IDcgMjAgNCAyMCAxOCAxOCAxMiAxNiAxMyAxOSAxOSA1IDcgMiA2IDExIDE4IDkgCisxOCA2IDExIDE0IDE0IDE4IDE1IF4KKzQzIDEgMTMgMTkgMjAgMTcgMTEgMTQgNSAxOSAyMCAxMSAyMCAxIDEgNCAxMyAxMCA2IDUgNiAxOSAxOCAxIDMgOSAxNCAyMCA3IDE4IDcgCisxNSAyIDMgMTUgNSAxIDEgMiA2IDEzIDEgMTkgNiAxOSBeCis0MCAxIDE2IDUgMTUgMTEgMTMgMyA2IDExIDIgMjAgOCAxIDUgNCAyMCAxOSAzIDE4IDMgOCAxOSA3IDggMTIgMTQgMTIgMTkgMTEgMTUgCis2IDE5IDEgMTkgNCAxMCAxNiAxNyA3IDE3IDE2IF4KKzM5IDEgMTIgMTkgMjAgMSAxMyAxMiAxMCA4IDIxIDE1IDcgMTkgMTMgNiA4IDE5IDIwIDE4IDIgMTIgMTQgMyAxMCA2IDIgNiAyIDE3IAorMTYgMiA1IDIxIDUgMTcgMTkgNyA4IDExIDE1IF4KKzMzIDAgMTIgMTcgMTQgMTggMTUgMTYgMTYgMTYgMTIgMjAgMTMgMiA1IDUgMiAxMCAyMCAxNiAxMiAxMCAyIDE3IDIxIDIwIDE1IDE0IAorMTQgMTggMjEgMTMgOSAxNyAxMCBeCis0MCAxIDIgMTIgMTYgMTcgMyA5IDE5IDUgNyAxMCA1IDExIDE3IDE4IDE0IDE0IDEyIDIgMjAgMTUgOCAxNyAzIDIwIDExIDEyIDE4IDcgCisxMiA3IDkgOCAzIDE4IDE0IDMgNSAxNyA5IDE0IF4KKzQzIDAgOCAyMSAxMSA4IDggMTYgMjEgMTIgNSA4IDcgMjAgMTAgMTQgNyAxIDkgNSA0IDUgMiAyMSAxMiAxIDEgOSAyMCAxNCAxMSA5IAorMTkgMTYgMyAxIDE0IDEwIDIgOCAyMCAxOCA3IDggMTggXgorNDAgMSAyIDE5IDYgMTEgMTggMTEgMTUgNiA1IDE2IDE0IDkgNyAyMSAzIDE1IDIxIDE2IDggNyAzIDYgMTQgMTcgMTcgNSAxMCAyMCAxMCAKKzE1IDEwIDEgMTUgMTggNiAxMCA5IDcgMTYgNiBeCiszOSAwIDExIDE1IDEyIDIgOSAxIDEgNiA2IDEzIDggMjAgNiAxOCA4IDUgOCAxIDEgMTcgMjAgMjAgMTkgMTcgMTMgMTQgMTcgMTIgNSAzIAorMTggMjAgMjAgMTEgMTggMTUgMTMgMTYgNyBeCis0OCAxIDcgMTAgMSAxOSAxMCA3IDE3IDcgMTYgMyA4IDQgNCAxNSAxNyAxMyA5IDExIDIgMiAxMSA3IDEzIDQgMTcgNyAxIDUgMTMgMTkgCisxNiA1IDE0IDE2IDIgMTEgMTggNSAxMSA2IDQgNyAzIDE3IDIgMSAxOCAxMiBeCis0MSAxIDIxIDE4IDMgNSAxNiA2IDExIDIgOCA4IDcgMTQgMTMgMjEgNiAxNCAxMiA2IDEyIDE5IDE0IDMgMTYgMyAyIDcgMTEgMTQgOCAKKzE2IDEwIDE5IDEyIDE5IDQgNSA2IDEzIDE5IDEyIDEzIF4KKzQ0IDEgNyA1IDEyIDQgMTMgMjEgMiA1IDE3IDE1IDE1IDEgMTMgNSAyMSA2IDQgMTIgMTQgMTUgNSAxOCAxMiAxIDE5IDIgMTQgMSA4IDggCisxMSA2IDIwIDEwIDMgMjEgOCAyMCAyIDQgMSAxNiAxMSAyMSBeCis0MiAxIDUgMyA4IDE2IDE1IDggMTIgMTQgMjAgMTYgMTggNyAyIDE4IDIgMTggMTkgNyA0IDE5IDMgMSAyMCA3IDE1IDEgNCA1IDEyIDEwIAorMTkgNiAxMSA0IDQgOSAyMCAyMCA4IDIgMjAgMTggXgorNDIgMSAxOSAyIDggNCAxNSA3IDIgMiA2IDE4IDIwIDE2IDEgMTggMTcgMTMgMyAxNCAyIDEgMiAxMCAxNCAxOSAxMiA5IDE1IDIwIDEgNyAKKzE1IDE3IDcgMTIgMTggMSAxNSAxNCA4IDIxIDIxIDUgXgorNDMgMSA3IDIwIDEwIDExIDEwIDEgOSAyMSA3IDUgMSAxMiAxNSAyIDkgMTcgNCAxMyA1IDQgMTEgMjEgMTQgMTMgMyAyMCAyMSAxIDMgCisxMiAxOCAxMSA0IDE0IDIwIDUgMyAxNCAxMyAxNSA5IDIxIDMgXgorNDAgMSAxOSA4IDEgNSA5IDUgOSAxNiAxNyA5IDYgMTIgNiAxNiA3IDQgMyAxIDIxIDE2IDE5IDE1IDE4IDE3IDE3IDE3IDIxIDEzIDIwIAorOSA2IDYgOSAxIDEzIDE3IDIxIDEgOSAxNCBeCiszNiAwIDExIDEyIDEzIDE4IDE5IDE5IDE1IDEyIDIwIDIgMTYgMTIgOSAyMSAxNyAxNiA4IDIgMTQgNiA0IDEgNiAxNiAxNSAxOSAxOSAKKzIxIDkgMTMgMTggMyAxNiA4IDEzIDExIF4KKzQ3IDAgMjEgMTUgNCAyMSA0IDIgMyA4IDE1IDE5IDggNiAxNiAyIDE1IDMgMTIgMyAxMSAzIDE3IDEyIDIxIDYgMyA0IDEzIDEgMTIgNCAKKzEwIDIgNiA3IDYgOSAxMiAyMSAxMCAxMCAxMSAyIDEzIDE5IDIgMTQgMTcgXgorNDQgMSAxMSA4IDEwIDE5IDEgMTEgMTEgOSAzIDEzIDE1IDQgMyAxOCA5IDE0IDUgMTUgMTggNSA2IDE3IDExIDE5IDIgNCAxMiA4IDE4IAorMTIgMTcgMyA0IDggNSAxOSAxNiAxNiA2IDEgMTMgMSAxOCAxOCBeCiszOSAxIDEwIDE4IDE1IDExIDUgMSAxNyA0IDE3IDE5IDExIDE4IDIxIDkgMiAxMCAxMCA1IDUgMjAgMTggMTMgNSAxNSAzIDYgMyAxMCAKKzEwIDE2IDEzIDEzIDE0IDE2IDIwIDE5IDExIDE2IDggXgorNDIgMSA2IDggMTUgMTMgMTEgMTMgMTUgMTggMTEgMjAgMTcgMjAgNCAxNiAxMCAxNCAxIDQgMTYgNCAxNyA4IDMgNyA3IDE4IDE2IDIwIAorMiA5IDkgNCAyMCA3IDE2IDQgMTEgNCAxMCA2IDIwIDQgXgorNDEgMCAxNyA2IDE5IDE3IDIgMTUgNiA1IDcgNCA4IDExIDE2IDkgMTAgMTUgMjAgMTIgMTUgOCA2IDE3IDUgOSAzIDMgNCAxOSAyMCAxMiAKKzUgMTkgMjEgNSAyMSAxMSAxNCAxOSAxIDE3IDYgXgorMzkgMCA5IDQgMTkgMyAxNyAxIDE0IDIxIDE0IDcgNiA1IDIwIDE0IDIxIDIwIDQgNiAyMSA3IDExIDIwIDEyIDkgMTEgNiAxNiAxOCAxOCAKKzEwIDExIDIwIDYgMTIgMTEgNSA3IDIxIDMgXgorNDMgMSAxOCA2IDE1IDIxIDEwIDQgMTQgOSAxOSAxMCAzIDMgNSAxMyAxIDggMTIgMyAxMyA5IDcgMTAgMTcgMTAgNiA4IDMgMTcgMTggMyAKKzIxIDE5IDYgMTcgMTUgNCA5IDE1IDkgMTUgMTQgNCAxOCBeCis0NSAxIDE0IDggMTAgMTMgNCAxMSAxMCA3IDYgMjEgMSAxNCA1IDExIDcgNyAyIDEzIDEzIDMgOSAxMyA4IDE0IDkgMyA3IDE4IDQgOSA5IAorNSAxNSAxMyAxNyAxMCAxNSAxNiAyMCA4IDE5IDkgMTAgOSAxMyBeCis0MCAxIDE5IDE0IDIxIDIgMTggMTMgMTAgNCAxOCAxNiA0IDIxIDE1IDEwIDE4IDE5IDMgMTIgMTIgMTQgNCAxMyAxMSAxIDExIDEgMTAgCisyIDEyIDQgMjEgMTAgMjEgMTggOSAyIDE2IDcgMjAgNyBeCis0MSAwIDcgMTIgMTkgMjAgMSAxMyAxMiAxMCA4IDIxIDE1IDcgMTkgMTMgNiA4IDE5IDIwIDE4IDIgMTIgMTQgMyAxMCA2IDIgNiAyIDE3IAorMTYgMiA1IDIxIDUgMTcgMTkgNyA4IDExIDEwIDIxIF4KKzM1IDAgMTcgMTQgMTggMTUgMTYgMTYgMTYgMTIgMjAgMTMgMiA1IDUgMiAxMCAyMCAxNiAxMiAxMCAyIDE3IDIxIDIwIDE1IDE0IDE0IAorMTggMjEgMTMgOSAxNyAyMSAyIDEyIDEwIF4KKzQwIDAgMTcgMyA5IDE5IDUgNyAxMCA1IDExIDE3IDE4IDE0IDE0IDEyIDIgMjAgMTUgOCAxNyAzIDIwIDExIDEyIDE4IDcgMTIgNyA5IDggCiszIDE4IDE0IDMgNSAxNyA5IDE4IDggMjEgMjAgXgorNDYgMSA4IDggMTYgMjEgMTIgNSA4IDcgMjAgMTAgMTQgNyAxIDkgNSA0IDUgMiAyMSAxMiAxIDEgOSAyMCAxNCAxMSA5IDE5IDE2IDMgMSAKKzE0IDEwIDIgOCAyMCAxOCA3IDggMTUgMiAxOSA2IDExIDE4IDEwIF4KKzQ0IDEgMTUgNiA1IDE2IDE0IDkgNyAyMSAzIDE1IDIxIDE2IDggNyAzIDYgMTQgMTcgMTcgNSAxMCAyMCAxMCAxNSAxMCAxIDE1IDE4IDYgCisxMCA5IDcgMTYgMTQgMTEgMTUgMTIgMiA5IDEgMSA2IDYgMTkgXgorMzggMSA4IDIwIDYgMTggOCA1IDggMSAxIDE3IDIwIDIwIDE5IDE3IDEzIDE0IDE3IDEyIDUgMyAxOCAyMCAyMCAxMSAxOCAxNSAxMyAxNiAKKzEzIDcgMTAgMSAxOSAxMCA3IDE3IDcgMTUgXgorNTAgMCAzIDggNCA0IDE1IDE3IDEzIDkgMTEgMiAyIDExIDcgMTMgNCAxNyA3IDEgNSAxMyAxOSAxNiA1IDE0IDE2IDIgMTEgMTggNSAxMSAKKzYgNCA3IDMgMTcgMiAxIDE4IDEzIDIxIDE4IDMgNSAxNiA2IDExIDIgOCA4IDE4IF4KKzQyIDEgMTQgMTMgMjEgNiAxNCAxMiA2IDEyIDE5IDE0IDMgMTYgMyAyIDcgMTEgMTQgOCAxNiAxMCAxOSAxMiAxOSA0IDUgNiAxMyAxOSAKKzEyIDEzIDcgNSAxMiA0IDEzIDIxIDIgNSAxNyAxNSAxNSAxMiBeCis0NSAxIDEzIDUgMjEgNiA0IDEyIDE0IDE1IDUgMTggMTIgMSAxOSAyIDE0IDEgOCA4IDExIDYgMjAgMTAgMyAyMSA4IDIwIDIgNCAxIDE2IAorMTEgMSA1IDMgOCAxNiAxNSA4IDEyIDE0IDIwIDE2IDE4IDcgMTggXgorNDYgMCAxOCAyIDE4IDE5IDcgNCAxOSAzIDEgMjAgNyAxNSAxIDQgNSAxMiAxMCAxOSA2IDExIDQgNCA5IDIwIDIwIDggMiAyMCAzIDE5IAorMiA4IDQgMTUgNyAyIDIgNiAxOCAyMCAxNiAxIDE4IDE3IDEzIDE0IF4KKzQzIDEgMTQgMiAxIDIgMTAgMTQgMTkgMTIgOSAxNSAyMCAxIDcgMTUgMTcgNyAxMiAxOCAxIDE1IDE0IDggMjEgMjEgMTkgNyAyMCAxMCAKKzExIDEwIDEgOSAyMSA3IDUgMSAxMiAxNSAyIDkgMTcgNCAxOSBeCis0NSAxIDUgNCAxMSAyMSAxNCAxMyAzIDIwIDIxIDEgMyAxMiAxOCAxMSA0IDE0IDIwIDUgMyAxNCAxMyAxNSA5IDIxIDExIDE5IDggMSA1IAorOSA1IDkgMTYgMTcgOSA2IDEyIDYgMTYgNyA0IDMgMSAyMSAxNSBeCiszNSAwIDE5IDE1IDE4IDE3IDE3IDE3IDIxIDEzIDIwIDkgNiA2IDkgMSAxMyAxNyAyMSAxIDkgMTYgMTEgMTIgMTMgMTggMTkgMTkgMTUgCisxMiAyMCAyIDE2IDEyIDkgMjEgMTIgXgorNDQgMSAxNiA4IDIgMTQgNiA0IDEgNiAxNiAxNSAxOSAxOSAyMSA5IDEzIDE4IDMgMTYgOCAxMyAyMSAxNSA0IDIxIDQgMiAzIDggMTUgCisxOSA4IDYgMTYgMiAxNSAzIDEyIDMgMTEgMyAxNyAxMiAyMSA5IF4KKzQ4IDAgMyA0IDEzIDEgMTIgNCAxMCAyIDYgNyA2IDkgMTIgMjEgMTAgMTAgMTEgMiAxMyAxOSAyIDE0IDE3IDExIDggMTAgMTkgMSAxMSAKKzExIDkgMyAxMyAxNSA0IDMgMTggOSAxNCA1IDE1IDE4IDUgNiAxNyAxMSAxOSAxNSBeCis0NCAwIDQgMTIgOCAxOCAxMiAxNyAzIDQgOCA1IDE5IDE2IDE2IDYgMSAxMyAxIDE4IDEgMTAgMTggMTUgMTEgNSAxIDE3IDQgMTcgMTkgCisxMSAxOCAyMSA5IDIgMTAgMTAgNSA1IDIwIDE4IDEzIDUgMTUgMTggXgorMzkgMSA2IDMgMTAgMTAgMTYgMTMgMTMgMTQgMTYgMjAgMTkgMTEgMTYgMjEgNiA4IDE1IDEzIDExIDEzIDE1IDE4IDExIDIwIDE3IDIwIAorNCAxNiAxMCAxNCAxIDQgMTYgNCAxNyA4IDMgNyAyMSBeCis0NiAxIDE4IDE2IDIwIDIgOSA5IDQgMjAgNyAxNiA0IDExIDQgMTAgNiAyMCAxNCAxNyA2IDE5IDE3IDIgMTUgNiA1IDcgNCA4IDExIDE2IAorOSAxMCAxNSAyMCAxMiAxNSA4IDYgMTcgNSA5IDMgMyA0IDE5IDMgXgorNDAgMCAxMiA1IDE5IDIxIDUgMjEgMTEgMTQgMTkgMSAxNyA4IDkgNCAxOSAzIDE3IDEgMTQgMjEgMTQgNyA2IDUgMjAgMTQgMjEgMjAgNCAKKzYgMjEgNyAxMSAyMCAxMiA5IDExIDYgMTYgMTEgXgorNDQgMCAxOCAxMCAxMSAyMCA2IDEyIDExIDUgNyAyMSAxOSAxOCA2IDE1IDIxIDEwIDQgMTQgOSAxOSAxMCAzIDMgNSAxMyAxIDggMTIgMyAKKzEzIDkgNyAxMCAxNyAxMCA2IDggMyAxNyAxOCAzIDIxIDE5IDggXgorNDcgMCA0IDEyIDIyIDUgMTEgMjAgMTYgMTUgNCAxNyAyMiAxIDggMTYgMTEgNiAxMyAxOCAzIDE0IDggMTMgMiAxOSAxNiAxIDE5IDEgNSAKKzMgMTYgOSA4IDIwIDcgNSAxIDExIDE1IDIgMyAxNyAzIDEyIDcgNCAxOSBeCis0MiAwIDE4IDE2IDEzIDcgMSAxOSA1IDEyIDE4IDEyIDYgMTUgMTkgNCA0IDkgMTMgMTMgOCAxNyAxMyAxOCAxMiAyIDggNCA3IDE3IDE3IAorMTQgMTEgMTMgMSAxNiAxMSAyIDIxIDMgMjIgMTcgMTYgMTEgXgorMzkgMCAxOCAyMiAxMiAyMCAxNyAxMyAxIDcgMTAgNyAyMCAxMSAxIDcgOCAxNCAxNCAxMiAxNSAxMyAxNSAxOCAxNSAxMSAxOCAxIDE3IAorMTQgMTUgMjAgMTYgMjAgOCAyIDE3IDEwIDQgMjEgMiBeCis0NCAxIDE5IDE5IDE0IDIyIDIxIDE4IDEzIDE0IDEgMyAxMiAxMSAxMSA0IDIyIDEzIDUgMTggNyAyMSA5IDIyIDE5IDEyIDggMTYgNSAKKzE3IDUgOSAxIDIgOSA2IDEyIDYgMSA3IDQgMyAxNSAxIDE0IDE2IF4KKzQyIDEgMTIgMyAxMCAyIDEwIDE0IDIxIDEzIDE3IDYgNiAxNyAxIDIxIDIgMTQgMTYgMTcgOSAxMSAyMCAyMSAxMSAxMiAxMiA4IDIwIAorMTMgMiA5IDIwIDkgMTQgMTAgMSAxNiAyIDIyIDYgNCAxNiAxOCBeCis1MSAwIDE1IDEgMTIgNCAxNCA5IDIxIDMgMyA5IDggMjEgMTUgMTQgOCA0IDE0IDQgMiAzIDggMTIgOCA2IDEgMiAxOCAyMCAxNSAzIDE5IAorMyAxMCAyMCAxNCA2IDMgNCAyMSAxIDEyIDQgMTggMiA2IDcgNiA5IDIwIDE0IDEzIF4KKzQwIDEgMTAgMTkgMTcgMjEgMTIgMTUgMTcgNyAxMCAxMSA4IDEwIDEyIDEgMTkgMTkgOSAxOCAyMSA0IDE4IDExIDkgMjIgNSAxNSA4IAorMTUgMyA1IDYgMiAxOSAxMiAxNyA0IDIwIDggMTEgMjAgXgorNDUgMCAyIDE4IDQgMTYgMjAgMTIgOSA5IDYgMTYgMjEgMTYgMyAxNiAxOCAzIDE5IDUgMTYgMiA0IDIgMTIgMTEgMTUgMTEgMTQgMTcgMiAKKzEwIDE4IDUgNSAxMyAzIDIxIDUgMyA2IDE4IDE4IDEwIDEgMjEgMTUgXgorNDUgMSA3IDEgMTMgMTIgMTkgMSAxNCA2IDggMjEgMTkgMjEgMTEgMTkgMTMgMiAxMyA0IDEgMTAgMjIgMTYgNCA5IDQgMTAgMTYgMyA3IAorMTUgMTEgOSAxMyAxNyAxNSA5IDkgMTUgNCAxMyAxNSA5IDQgMTkgOSBeCis0NiAwIDE4IDYgMTMgMjIgMTAgNiAxMiAyIDE3IDE1IDYgNSA3IDQgOCAxMSAxIDkgMTAgOCA1IDIwIDE2IDYgMTAgNSAxNyAzIDMgMTkgCisxMiAxMyAyMCA1IDEyIDE0IDUgMTQgMTEgMjIgMTIgMTYgMTAgOCA5IDE2IF4KKzM5IDAgMTUgMTIgMyAyIDE2IDIyIDE0IDIyIDcgNiA1IDEzIDIyIDE0IDEzIDQgNiAxNCA3IDExIDEzIDIwIDkgMTkgNiA5IDExIDExIAorMTggMTkgMTMgNiAyMCAxOSAyMCA3IDIyIDEyIDEyIF4KKzQxIDAgNiAxNCAxOCAxOSA3IDE3IDEyIDEwIDMgMTggMTUgNSAyMSAxNiA4IDIwIDMgMjEgOSAxNSAxOCAxMCAxNSAxMCA2IDggMTggMiAKKzExIDMgMTQgNCA2IDEwIDE5IDkgOCAxNyA4IDIyIDIwIF4KKzM2IDEgNyAyMiAxNiAxOCAyMSA0IDExIDEwIDE1IDYgMjIgMTYgMjIgNSAxOSAxNSA3IDcgMiAyMSAyMSAzIDE3IDIxIDE2IDIyIDkgMyAKKzcgMTEgNCAxNyAxNyAyMCAyMSAyMSBeCiszNyAxIDE4IDkgNSA4IDEyIDE3IDE4IDE3IDE2IDEyIDIyIDE0IDE3IDExIDIxIDEwIDQgMyAxIDQgMTQgMTAgMTEgNCAzIDIwIDIwIDIyIAorMTkgMjEgMTkgMTYgMTkgMTYgMTAgMTcgMTcgXgorNDAgMSAxOSAxNCAxOCAxNCAzIDkgMTcgMSA3IDEzIDYgNyAxNSAyMCAxMiAxMyAxNiAyMSAyMCAxMCA4IDIyIDcgMTIgMjEgNiAxNiA0IAorMTMgMTEgMiAxMiAxNSAyMiAzIDE4IDYgMTcgNiAyMiBeCis0MiAwIDEwIDkgMiA1IDIyIDUgMTAgNCA3IDggMTkgMTAgMjAgMTAgMjIgMTEgOCAxIDkgMSAyMCAxMyAyMSAxNyA1IDUgMTcgMTAgMTMgCis5IDIwIDE4IDE3IDIgMTQgMTMgMjIgMjIgMyAxNCAyMSAxMCBeCis0NiAwIDIgMTQgMiAyMCAxIDEwIDE4IDkgMTIgNSA3IDE4IDIwIDE5IDEwIDExIDIyIDcgMTIgMiAxMyA4IDggMiAzIDEzIDE5IDIwIDMgCis3IDIwIDcgOSA4IDMgMTEgMjIgMyA1IDEwIDkgMTEgMTYgMTQgMTkgMTYgXgorNDYgMSAxNSA4IDEgMTQgMjAgNSA4IDcgMTMgMTAgMjIgNyAxNiA5IDUgNCA1IDIgMTQgMjAgMSAxIDE1IDE3IDEzIDIyIDE5IDE3IDQgMSAKKzMgMSAyMiAxMCAxNSAxNSAyIDE2IDEzIDExIDcgMTYgMTcgMTIgNiAyMCBeCis0MCAxIDMgMTkgOCA2IDUgOSAxNSAyMiAxNyA3IDE0IDE4IDE0IDkgMTYgNyAxOCAxNCAyMiAyIDIgNSAxOCAxMyAxOCA4IDE4IDE2IDggCisxMSAxNSA2IDE4IDkgNyA5IDIyIDE5IDIwIDE1IF4KKzQ0IDAgOSAxNiAxNiA2IDYgMjEgOCAxMyA2IDExIDggNSAxNiAxNiAxIDEwIDEzIDEzIDQgMTAgMjEgMjIgMTUgMTAgMjAgNSAzIDMgMTMgCisxNSAxMyAxMSAxMSAxNSAyMSAxIDIxIDcgMTAgMSAxMiAxOCA3IDIwIF4KKzUxIDAgNyAxIDE4IDggNCAxOSAyIDIxIDE3IDE5IDIgMiAxOSA3IDIxIDE5IDIgNyAxNSAxNSAxNiA1IDIxIDEyIDEgNSAyMiAxIDE3IAorMTkgMTEgNSAxMSA2IDQgNyAzIDEwIDIgMSAzIDYgMTQgMTEgMTggNSAxIDYgMTEgMTcgOCBeCiszOSAxIDggMTUgMjIgMjEgMTQgNiAyMiAyMCA2IDIwIDEyIDIyIDE4IDEgMyAyIDcgMTkgMjIgOCA5IDE4IDQgMjAgMTIgNCA1IDYgMjEgCisxMiAyMCAyMSA3IDUgMjAgNCAyMSAxNCAxNCBeCis0NSAwIDE1IDUgMiAxNiAxNSAyMSA1IDE0IDE1IDYgNCAxMiAyMiA1IDExIDIwIDE2IDE1IDQgMTcgMjIgMSA4IDE2IDExIDYgMTMgMTggCiszIDE0IDggMTMgMiAxOSAxNiAxIDE5IDEgNSAzIDE2IDkgOCAyMCAxNCBeCis0OCAxIDUgMSAxMSAxNSAyIDMgMTcgMyAxMiA3IDQgMTIgMTggMTYgMTMgNyAxIDE5IDUgMTIgMTggMTIgNiAxNSAxOSA0IDQgOSAxMyAKKzEzIDggMTcgMTMgMTggMTIgMiA4IDQgNyAxNyAxNyAxNCAxMSAxMyAxIDE2IDExIDIyIF4KKzM4IDAgMjEgMyAyMiAxNyAxNiAxNyAxOCAyMiAxMiAyMCAxNyAxMyAxIDcgMTAgNyAyMCAxMSAxIDcgOCAxNCAxNCAxMiAxNSAxMyAxNSAKKzE4IDE1IDExIDE4IDEgMTcgMTQgMTUgMjAgMTYgMTAgXgorNDMgMCA4IDIgMTcgMTAgNCAyMSA1IDE5IDE5IDE0IDIyIDIxIDE4IDEzIDE0IDEgMyAxMiAxMSAxMSA0IDIyIDEzIDUgMTggNyAyMSA5IAorMjIgMTkgMTIgOCAxNiA1IDE3IDUgOSAxIDIgOSA2IDEyIDIyIF4KKzQ3IDEgMSA3IDQgMyAxNSAxIDE0IDEgMTIgMyAxMCAyIDEwIDE0IDIxIDEzIDE3IDYgNiAxNyAxIDIxIDIgMTQgMTYgMTcgOSAxMSAyMCAKKzIxIDExIDEyIDEyIDggMjAgMTMgMiA5IDIwIDkgMTQgMTAgMSAxNiAyIDIyIDIwIF4KKzUzIDAgNCAxNiAxNCAxNSAxIDEyIDQgMTQgOSAyMSAzIDMgOSA4IDIxIDE1IDE0IDggNCAxNCA0IDIgMyA4IDEyIDggNiAxIDIgMTggMjAgCisxNSAzIDE5IDMgMTAgMjAgMTQgNiAzIDQgMjEgMSAxMiA0IDE4IDIgNiA3IDYgOSAyMCAxNSBeCis0MiAxIDEwIDEwIDE5IDE3IDIxIDEyIDE1IDE3IDcgMTAgMTEgOCAxMCAxMiAxIDE5IDE5IDkgMTggMjEgNCAxOCAxMSA5IDIyIDUgMTUgCis4IDE1IDMgNSA2IDIgMTkgMTIgMTcgNCAyMCA4IDExIDIwIDEyIF4KKzQ1IDAgMTggNCAxNiAyMCAxMiA5IDkgNiAxNiAyMSAxNiAzIDE2IDE4IDMgMTkgNSAxNiAyIDQgMiAxMiAxMSAxNSAxMSAxNCAxNyAyIAorMTAgMTggNSA1IDEzIDMgMjEgNSAzIDYgMTggMTggMTAgMSAyMSAyMSAxOCBeCis0NSAwIDEgMTMgMTIgMTkgMSAxNCA2IDggMjEgMTkgMjEgMTEgMTkgMTMgMiAxMyA0IDEgMTAgMjIgMTYgNCA5IDQgMTAgMTYgMyA3IDE1IAorMTEgOSAxMyAxNyAxNSA5IDkgMTUgNCAxMyAxNSA5IDQgMTkgMTkgMTkgXgorNDkgMCA2IDEzIDIyIDEwIDYgMTIgMiAxNyAxNSA2IDUgNyA0IDggMTEgMSA5IDEwIDggNSAyMCAxNiA2IDEwIDUgMTcgMyAzIDE5IDEyIAorMTMgMjAgNSAxMiAxNCA1IDE0IDExIDIyIDEyIDE2IDEwIDggOSA0IDE1IDEyIDMgMjIgXgorMzkgMCAxNiAyMiAxNCAyMiA3IDYgNSAxMyAyMiAxNCAxMyA0IDYgMTQgNyAxMSAxMyAyMCA5IDE5IDYgOSAxMSAxMSAxOCAxOSAxMyA2IAorMjAgMTkgMjAgNyAyMiAxMiAxMSA2IDE0IDE4IDE3IF4KKzQzIDEgNyAxNyAxMiAxMCAzIDE4IDE1IDUgMjEgMTYgOCAyMCAzIDIxIDkgMTUgMTggMTAgMTUgMTAgNiA4IDE4IDIgMTEgMyAxNCA0IDYgCisxMCAxOSA5IDggMTcgOCAyMiA0IDcgMjIgMTYgMTggMjEgMTEgXgorMzkgMCAxMSAxMCAxNSA2IDIyIDE2IDIyIDUgMTkgMTUgNyA3IDIgMjEgMjEgMyAxNyAyMSAxNiAyMiA5IDMgNyAxMSA0IDE3IDE3IDIwIAorMjEgMTAgMTggOSA1IDggMTIgMTcgMTggMTcgMTcgXgorNDAgMSAxMiAyMiAxNCAxNyAxMSAyMSAxMCA0IDMgMSA0IDE0IDEwIDExIDQgMyAyMCAyMCAyMiAxOSAyMSAxOSAxNiAxOSAxNiAxMCAxNyAKKzIwIDE5IDE0IDE4IDE0IDMgOSAxNyAxIDcgMTMgNiAxOCBeCis0NCAxIDE1IDIwIDEyIDEzIDE2IDIxIDIwIDEwIDggMjIgNyAxMiAyMSA2IDE2IDQgMTMgMTEgMiAxMiAxNSAyMiAzIDE4IDYgMTcgNiAyIAorMTAgOSAyIDUgMjIgNSAxMCA0IDcgOCAxOSAxMCAyMCAxMCAyMiA3IF4KKzQzIDAgOCAxIDkgMSAyMCAxMyAyMSAxNyA1IDUgMTcgMTAgMTMgOSAyMCAxOCAxNyAyIDE0IDEzIDIyIDIyIDMgMTQgMjEgOSAyIDE0IDIgCisyMCAxIDEwIDE4IDkgMTIgNSA3IDE4IDIwIDE5IDEwIDExIDE5IF4KKzUzIDEgNyAxMiAyIDEzIDggOCAyIDMgMTMgMTkgMjAgMyA3IDIwIDcgOSA4IDMgMTEgMjIgMyA1IDEwIDkgMTEgMTYgMTQgMTkgOCAxNSAKKzggMSAxNCAyMCA1IDggNyAxMyAxMCAyMiA3IDE2IDkgNSA0IDUgMiAxNCAyMCAxIDEgMTUgOCBeCis0MiAwIDEzIDIyIDE5IDE3IDQgMSAzIDEgMjIgMTAgMTUgMTUgMiAxNiAxMyAxMSA3IDE2IDE3IDEyIDYgMTkgMyAxOSA4IDYgNSA5IDE1IAorMjIgMTcgNyAxNCAxOCAxNCA5IDE2IDcgMTggMTQgMjIgMTkgXgorNDMgMCAyIDUgMTggMTMgMTggOCAxOCAxNiA4IDExIDE1IDYgMTggOSA3IDkgMjIgMTkgMjAgMTcgOSAxNiAxNiA2IDYgMjEgOCAxMyA2IAorMTEgOCA1IDE2IDE2IDEgMTAgMTMgMTMgNCAxMCAyMSAyMiAxNCBeCis0OCAwIDEwIDIwIDUgMyAzIDEzIDE1IDEzIDExIDExIDE1IDIxIDEgMjEgNyAxMCAxIDEyIDE4IDcgMiA3IDEgMTggOCA0IDE5IDIgMjEgCisxNyAxOSAyIDIgMTkgNyAyMSAxOSAyIDcgMTUgMTUgMTYgNSAyMSAxMiAxIDUgMjEgXgorNDkgMSAxIDE3IDE5IDExIDUgMTEgNiA0IDcgMyAxMCAyIDEgMyA2IDE0IDExIDE4IDUgMSA2IDExIDE3IDggOCAxNSAyMiAyMSAxNCA2IAorMjIgMjAgNiAyMCAxMiAyMiAxOCAxIDMgMiA3IDE5IDIyIDggOSAxOCA0IDIwIDEwIF4KKzQ1IDEgNCA1IDYgMjEgMTIgMjAgMjEgNyA1IDIwIDQgMjEgMTQgMiAxNSA1IDIgMTYgMTUgMjEgNSAxNCAxNSA2IDQgMTIgMjIgNSAxMSAKKzIwIDE2IDE1IDQgMTcgMjIgMSA4IDE2IDExIDYgMTMgMTggMyAxNCAxMyBeCis1MiAwIDEzIDIgMTkgMTYgMSAxOSAxIDUgMyAxNiA5IDggMjAgNyA1IDEgMTEgMTUgMiAzIDE3IDMgMTIgNyA0IDEyIDE4IDE2IDEzIDcgCisxIDE5IDUgMTIgMTggMTIgNiAxNSAxOSA0IDQgOSAxMyAxMyA4IDE3IDEzIDE4IDEyIDIgOCAxNSBeCis0NiAwIDIwIDEgMSAxMSAyMSAyIDMgMTYgOCAxMiAyMSAyMiAxIDE2IDEgMTAgMjIgMTcgNCAxNCA3IDIgMTYgOSAxOCAyMyA5IDQgOCAKKzE2IDcgOSAxOCAxMSAxMSAxNyAyMCAyIDcgMTAgMjAgOCAxMCAxNiAxNCAxNCBeCis0MSAxIDIwIDQgMTYgNCAxOCAxIDE0IDEyIDE5IDEzIDE1IDE5IDE5IDExIDIyIDEzIDEwIDIgMTEgMTYgMTAgMTcgOCA4IDYgMjIgMiAKKzE1IDEwIDkgMTMgMTggMTQgMjIgOCA2IDE4IDE2IDE1IDE0IDIwIF4KKzQzIDEgMTQgMyAxMiAxNCAxNyAxMSAzIDkgMTkgMTAgMjAgMTYgMTEgMyAxNyA3IDIxIDIzIDEyIDIzIDExIDEzIDIgMTQgMTQgMTYgMTMgCisxMiAxMSA1IDE0IDMgOCA0IDEzIDggMTcgMTcgMTggMTcgMiAxMiAyMiBeCis0MyAxIDE3IDMgMTEgMTIgMTYgNSAxIDIyIDYgMTYgMTEgMjAgMyAxOCAxNyA2IDIyIDE0IDEzIDIxIDIxIDMgMTggMTMgMjAgMTEgMTggCisxOSAxMSA2IDEgMTAgMTggNyAxNyA1IDE2IDEgNyAxMCA0IDIwIDIyIF4KKzQ2IDAgOCAxMCAxMiA0IDExIDIxIDYgMTMgMTYgMTcgNiAyMyAxIDkgMTQgNCAxMSAyMyAyMyAxOSAxIDEzIDYgMjAgMSA5IDEyIDggNSAKKzIzIDE3IDE2IDggOCAzIDEwIDEzIDcgNiAxMCA4IDE0IDkgMTUgMjAgMjAgXgorNDYgMCAyMCAyMSAxNSAxMiAxOSAxNyAxIDYgNCA1IDggNCAxMiAxMCA2IDUgNCAxNyAzIDMgMTYgMTMgNSAyMSAxNiAxMCAyMSAxOCAxOSAKKzE1IDE2IDEyIDYgMTIgMTcgOCA3IDggMTEgMTQgMSAyMyAxMCAxNSAxNSAxMyBeCis0MyAwIDIxIDEzIDE1IDE4IDIxIDEwIDEwIDIzIDMgMTMgMTMgOSAxNiAyIDE3IDE5IDMgMjIgMTEgNSAxOCAxOSAxMyA3IDcgOCAxOSAyIAorMTIgMiAxOSAxNiAyMyA5IDE2IDYgMyAxOSAxMiA1IDEwIDkgMTcgXgorNDcgMCAyMSAzIDIgMSA3IDE0IDE0IDcgNiAyIDIwIDMgNiAxOSAxOSAxMCAyIDIyIDEyIDE3IDEyIDEgMjAgNyA3IDE1IDIwIDYgMTggOCAKKzMgMTQgMjMgMTggMTUgNCA3IDUgMjMgMTUgNyAxNCAxMCAxMCAxOSAxNyAxMSBeCis0NCAwIDQgMTUgMTcgMTEgMTUgMTEgOCA5IDE3IDUgMTIgMTggMTQgNiAyMCAxNyAyMSAxMiAxNiA5IDIyIDkgMjAgMTUgMiAyMiAxMSAyIAorNiAxMSA5IDggMiA0IDE0IDE5IDMgMjEgMjEgMjMgOCAyIDExIDE1IF4KKzM3IDAgOCA0IDIwIDIyIDYgMjEgMTggMjIgMTAgMTkgOSAxNCAxNyAyMyAyMSAxMCA3IDE1IDEzIDE2IDUgNCAxMCAxMyAxNCAyMCAyMyAKKzEyIDIwIDIzIDE4IDEwIDEyIDggMjEgMTEgMTkgXgorMzkgMCAxMiA3IDE5IDE0IDE4IDE0IDE4IDIyIDYgOSAyMiA1IDIzIDEzIDYgOCAyMyAyMCAyMiA1IDIyIDE1IDE5IDIwIDkgOSAxIDEzIAorMTMgMTAgMTQgMTMgNSAyMiAxNCAyMSA5IDIxIDMgXgorNDUgMSAxNCAxNCA0IDE4IDEzIDEyIDIzIDcgMyAxNSA1IDE3IDE0IDIzIDE0IDUgMTcgMjIgMTEgMSA4IDEzIDIzIDYgMjEgMyA2IDExIAorNyAyMyA4IDYgMjEgNCA0IDIyIDE5IDEzIDggNSAxOSA3IDUgMjMgMyBeCis1MCAxIDQgMTkgMTEgMjMgMTEgMjEgMTQgMSAzIDIwIDIgMjAgNyA0IDE3IDIgNSAxMyA0IDIzIDUgMjIgNyA3IDkgMTcgMTMgNSA2IDIgCisyMSAxIDE3IDcgOSAyMSAyMyAxIDEgMTIgMyAxIDE1IDIyIDQgMTIgNiAyMCA1IDIzIF4KKzQ2IDEgMjMgNCAxMiAyMiA4IDE4IDE2IDMgMTYgNCAyIDEzIDEgMTUgMTUgMSAyMyAyIDMgNCAxMCAxIDEyIDcgMTEgMiA3IDIyIDIyIAorMjEgMjIgMTMgMyAxMiAyMiAxMiA0IDMgMjMgMTAgMTQgMTcgMTUgOSAyMyAyMCBeCis0NCAwIDE5IDEyIDIxIDIyIDkgMTcgMTIgMiAxOCAxOCAxMiAyMSAyIDE5IDQgMjEgMjAgNCA5IDE0IDUgMjEgOCAyMiAxMCAxNSAyMyAKKzE0IDggNSAxMSAxOSA1IDcgNSAzIDExIDQgMTUgMTggOSAyIDIzIDQgXgorNDYgMCA5IDE2IDE0IDE1IDYgMTUgMSAxMSA0IDE2IDE2IDIwIDE0IDIgOSAxOSAxNCA2IDMgNyAxMCAxNiAyMiAyMyA3IDcgMTIgNSAyIAorOCA5IDUgNyAxIDE3IDE5IDIxIDE5IDE4IDE1IDMgMjAgMjIgMTQgOSAxNiBeCis0NCAxIDEwIDE4IDExIDMgNSA5IDEwIDExIDIyIDEyIDEyIDE1IDIzIDIgMTAgMTggMjMgNSAxOCAyMSAyMCAyMyAzIDkgMyAyMiA3IDggCis3IDQgMSAxNCAxNiAxNiAxMyAxOCAyIDIxIDE4IDE1IDUgNSAxNiAyMSBeCis0NiAwIDIgMiA2IDIzIDEzIDIyIDIwIDEyIDE3IDQgMTAgMjEgMiAyMCAyIDggOCA3IDIwIDEzIDMgMjAgMjMgMTYgNiAyMyA5IDEyIDIwIAorMyAxMCA1IDYgMTkgMTggMTIgMTMgMTQgOCAxIDEgOCA5IDEzIDE5IDIzIF4KKzQ3IDAgOSAyMCAyMCA1IDE1IDEzIDE3IDMgMTUgMjIgMyAxIDE5IDggMTUgOCAxOSA5IDIxIDcgMTIgMSAxNiAyMSAxMSA4IDEwIDE1IAorMTYgOCAxIDUgNSAyMCAyMiAxMyAxMSAyMiA0IDQgNyA2IDIyIDEwIDMgMjEgNCBeCis0NSAxIDkgMTkgMjIgMTggMyAyMyA2IDQgNiAxOSAxNSAxMyAxNyA0IDEzIDkgMTUgNCA2IDcgMTMgMTEgMSAyMCAxNSAxMiAxOCAxOCAKKzE2IDcgMTMgNCAxMSA3IDExIDYgMTcgOSAxOCAxNSAyMSAxNyA1IDIwIDExIF4KKzQ5IDAgMSAyMiAxNiAxOCA1IDggMTEgMiAyMyAxMCAxMSA1IDIgMSAxOSAxNiAzIDE5IDE2IDE1IDIxIDUgMyA3IDE4IDQgOSAxNSAzIDggCisyMCAxIDIxIDEgMjEgMTcgOSA2IDE3IDEwIDE2IDIgOSA3IDE2IDE5IDE1IDE3IDkgXgorNTEgMCAxNyAyMCAxOSA2IDYgMTQgMiAyIDUgMSAyIDEwIDE3IDEgMTggNiAxOCAyMCAxIDEgMTEgMjEgMiAzIDE2IDggMTIgMjEgMjIgMSAKKzE2IDEgMTAgMjIgMTcgNCAxNCA3IDIgMTYgOSAxOCAyMyA5IDQgOCAxNiA3IDkgMTggMTcgXgorNDUgMSAxMSAxNyAyMCAyIDcgMTAgMjAgOCAxMCAxNiAxNCAxMSAyMCA0IDE2IDQgMTggMSAxNCAxMiAxOSAxMyAxNSAxOSAxOSAxMSAyMiAKKzEzIDEwIDIgMTEgMTYgMTAgMTcgOCA4IDYgMjIgMiAxNSAxMCA5IDEzIDE4IDggXgorNDQgMCAyMiA4IDYgMTggMTYgMTUgMTQgMTUgMTQgMyAxMiAxNCAxNyAxMSAzIDkgMTkgMTAgMjAgMTYgMTEgMyAxNyA3IDIxIDIzIDEyIAorMjMgMTEgMTMgMiAxNCAxNCAxNiAxMyAxMiAxMSA1IDE0IDMgOCA0IDEzIDIwIF4KKzQzIDAgMTcgMTcgMTggMTcgMiAxMiAzIDE3IDMgMTEgMTIgMTYgNSAxIDIyIDYgMTYgMTEgMjAgMyAxOCAxNyA2IDIyIDE0IDEzIDIxIAorMjEgMyAxOCAxMyAyMCAxMSAxOCAxOSAxMSA2IDEgMTAgMTggNyAxNyAyMCBeCis1MCAxIDE2IDEgNyAxMCA0IDIwIDEwIDggMTAgMTIgNCAxMSAyMSA2IDEzIDE2IDE3IDYgMjMgMSA5IDE0IDQgMTEgMjMgMjMgMTkgMSAKKzEzIDYgMjAgMSA5IDEyIDggNSAyMyAxNyAxNiA4IDggMyAxMCAxMyA3IDYgMTAgOCAxNCAxNyBeCis0NiAxIDE1IDIwIDE4IDIwIDIxIDE1IDEyIDE5IDE3IDEgNiA0IDUgOCA0IDEyIDEwIDYgNSA0IDE3IDMgMyAxNiAxMyA1IDIxIDE2IDEwIAorMjEgMTggMTkgMTUgMTYgMTIgNiAxMiAxNyA4IDcgOCAxMSAxNCAxIDIzIDIxIF4KKzQ1IDAgMTUgMTUgMiAyMSAxMyAxNSAxOCAyMSAxMCAxMCAyMyAzIDEzIDEzIDkgMTYgMiAxNyAxOSAzIDIyIDExIDUgMTggMTkgMTMgNyAKKzcgOCAxOSAyIDEyIDIgMTkgMTYgMjMgOSAxNiA2IDMgMTkgMTIgNSAxMCAxNSBeCis0OCAxIDIwIDIxIDMgMiAxIDcgMTQgMTQgNyA2IDIgMjAgMyA2IDE5IDE5IDEwIDIgMjIgMTIgMTcgMTIgMSAyMCA3IDcgMTUgMjAgNiAKKzE4IDggMyAxNCAyMyAxOCAxNSA0IDcgNSAyMyAxNSA3IDE0IDEwIDEwIDE5IDE3IDEyIF4KKzQ3IDAgNCAxNSAxNyAxMSAxNSAxMSA4IDkgMTcgNSAxMiAxOCAxNCA2IDIwIDE3IDIxIDEyIDE2IDkgMjIgOSAyMCAxNSAyIDIyIDExIDIgCis2IDExIDkgOCAyIDQgMTQgMTkgMyAyMSAyMSAyMyA4IDIgMTEgNCA4IDQgMjAgXgorMzkgMCAyMiA2IDIxIDE4IDIyIDEwIDE5IDkgMTQgMTcgMjMgMjEgMTAgNyAxNSAxMyAxNiA1IDQgMTAgMTMgMTQgMjAgMjMgMTIgMjAgCisyMyAxOCAxMCAxMiA4IDIxIDExIDYgMTIgNyAxOSAxNCAxNCBeCis0MCAwIDE0IDE4IDIyIDYgOSAyMiA1IDIzIDEzIDYgOCAyMyAyMCAyMiA1IDIyIDE1IDE5IDIwIDkgOSAxIDEzIDEzIDEwIDE0IDEzIDUgCisyMiAxNCAyMSA5IDIxIDE5IDE0IDE0IDQgMTggMTMgMTIgXgorNDYgMCAyMyA3IDMgMTUgNSAxNyAxNCAyMyAxNCA1IDE3IDIyIDExIDEgOCAxMyAyMyA2IDIxIDMgNiAxMSA3IDIzIDggNiAyMSA0IDQgCisyMiAxOSAxMyA4IDUgMTkgNyA1IDIzIDEgNCAxOSAxMSAyMyAxMSAyMSA5IF4KKzUyIDAgMSAzIDIwIDIgMjAgNyA0IDE3IDIgNSAxMyA0IDIzIDUgMjIgNyA3IDkgMTcgMTMgNSA2IDIgMjEgMSAxNyA3IDkgMjEgMjMgMSAKKzEgMTIgMyAxIDE1IDIyIDQgMTIgNiAyMCA1IDE5IDIzIDQgMTIgMjIgOCAxOCAxNiAzIDIyIF4KKzQ4IDAgNCAyIDEzIDEgMTUgMTUgMSAyMyAyIDMgNCAxMCAxIDEyIDcgMTEgMiA3IDIyIDIyIDIxIDIyIDEzIDMgMTIgMjIgMTIgNCAzIAorMjMgMTAgMTQgMTcgMTUgOSAyMyA0IDE5IDEyIDIxIDIyIDkgMTcgMTIgMiAxOCAxOCA5IF4KKzQ2IDAgMjEgMiAxOSA0IDIxIDIwIDQgOSAxNCA1IDIxIDggMjIgMTAgMTUgMjMgMTQgOCA1IDExIDE5IDUgNyA1IDMgMTEgNCAxNSAxOCAKKzkgMiAyMyAyMiA5IDE2IDE0IDE1IDYgMTUgMSAxMSA0IDE2IDE2IDIwIDIyIF4KKzQ3IDAgMiA5IDE5IDE0IDYgMyA3IDEwIDE2IDIyIDIzIDcgNyAxMiA1IDIgOCA5IDUgNyAxIDE3IDE5IDIxIDE5IDE4IDE1IDMgMjAgMjIgCisxNCA5IDExIDEwIDE4IDExIDMgNSA5IDEwIDExIDIyIDEyIDEyIDE1IDIzIDIyIF4KKzQ1IDAgMTAgMTggMjMgNSAxOCAyMSAyMCAyMyAzIDkgMyAyMiA3IDggNyA0IDEgMTQgMTYgMTYgMTMgMTggMiAyMSAxOCAxNSA1IDUgMTYgCisxMiAyIDIgNiAyMyAxMyAyMiAyMCAxMiAxNyA0IDEwIDIxIDIgMjAgMTkgXgorNDcgMCA4IDggNyAyMCAxMyAzIDIwIDIzIDE2IDYgMjMgOSAxMiAyMCAzIDEwIDUgNiAxOSAxOCAxMiAxMyAxNCA4IDEgMSA4IDkgMTMgCisxOSAxMiA5IDIwIDIwIDUgMTUgMTMgMTcgMyAxNSAyMiAzIDEgMTkgOCAxNSAyMyBeCis0OCAwIDE5IDkgMjEgNyAxMiAxIDE2IDIxIDExIDggMTAgMTUgMTYgOCAxIDUgNSAyMCAyMiAxMyAxMSAyMiA0IDQgNyA2IDIyIDEwIDMgCisyMSAxIDkgMTkgMjIgMTggMyAyMyA2IDQgNiAxOSAxNSAxMyAxNyA0IDEzIDkgMTcgXgorNDkgMSA0IDYgNyAxMyAxMSAxIDIwIDE1IDEyIDE4IDE4IDE2IDcgMTMgNCAxMSA3IDExIDYgMTcgOSAxOCAxNSAyMSAxNyA1IDIwIDYgMSAKKzIyIDE2IDE4IDUgOCAxMSAyIDIzIDEwIDExIDUgMiAxIDE5IDE2IDMgMTkgMTYgMTUgMTggXgorNTUgMSA1IDMgNyAxOCA0IDkgMTUgMyA4IDIwIDEgMjEgMSAyMSAxNyA5IDYgMTcgMTAgMTYgMiA5IDcgMTYgMTkgMTUgMTcgMTAgMTcgCisyMCAxOSA2IDYgMTQgMiAyIDUgMSAyIDEwIDE3IDEgMTggNiAxOCAyMCAxIDEgMTEgMjEgMiAzIDE2IDggMTcgXgorNDcgMCAyMSAyMiAxIDE2IDEgMTAgMjIgMTcgNCAxNCA3IDIgMTYgOSAxOCAyMyA5IDQgOCAxNiA3IDkgMTggMTEgMTEgMTcgMjAgMiA3IAorMTAgMjAgOCAxMCAxNiAxNCAxMSAyMCA0IDE2IDQgMTggMSAxNCAxMiAxOSAxMyAxOSBeCis0NSAxIDE5IDE5IDExIDIyIDEzIDEwIDIgMTEgMTYgMTAgMTcgOCA4IDYgMjIgMiAxNSAxMCA5IDEzIDE4IDE0IDIyIDggNiAxOCAxNiAKKzE1IDE0IDE1IDE0IDMgMTIgMTQgMTcgMTEgMyA5IDE5IDEwIDIwIDE2IDExIDMgMjEgXgorNDcgMSA3IDIxIDIzIDEyIDIzIDExIDEzIDIgMTQgMTQgMTYgMTMgMTIgMTEgNSAxNCAzIDggNCAxMyA4IDE3IDE3IDE4IDE3IDIgMTIgMyAKKzE3IDMgMTEgMTIgMTYgNSAxIDIyIDYgMTYgMTEgMjAgMyAxOCAxNyA2IDIyIDE0IDIwIF4KKzQ3IDEgMjEgMjEgMyAxOCAxMyAyMCAxMSAxOCAxOSAxMSA2IDEgMTAgMTggNyAxNyA1IDE2IDEgNyAxMCA0IDIwIDEwIDggMTAgMTIgNCAKKzExIDIxIDYgMTMgMTYgMTcgNiAyMyAxIDkgMTQgNCAxMSAyMyAyMyAxOSAxIDEzIDIyIF4KKzUxIDAgMjAgMSA5IDEyIDggNSAyMyAxNyAxNiA4IDggMyAxMCAxMyA3IDYgMTAgOCAxNCA5IDE1IDIwIDE4IDIwIDIxIDE1IDEyIDE5IAorMTcgMSA2IDQgNSA4IDQgMTIgMTAgNiA1IDQgMTcgMyAzIDE2IDEzIDUgMjEgMTYgMTAgMjEgMjEgXgorNTIgMCAxNSAxMyA0IDggMTIgMjIgOSA2IDMgMSAxMyAxNiAxMiAyMyAxMCAxNCAyIDEgNiAxMSA4IDE5IDI0IDE2IDIgNSAyMSAyIDcgCisyMiA0IDUgMjMgMyAxMiAyMCA4IDQgNSAxNyA5IDE4IDE4IDE4IDQgMTAgMTMgMiA0IDcgMjQgMjEgXgorNTEgMSAxMCAyMSA0IDggMjQgMiA2IDE5IDEwIDYgMjIgMjIgMTQgMjIgMTMgMjEgNSAyMiAyIDQgMTggNSAxMSAyMSAxIDcgOCA0IDE3IAorNSAxNCAxIDIgMTAgOSAxMiA1IDExIDEwIDIwIDQgMTQgMyAxIDMgMjEgMTIgMTEgMTcgMjIgMjEgXgorNDMgMSA3IDUgMjEgMTQgMTUgMTkgMjAgMTIgNiAxMiAxOCAxOSA0IDcgMTIgMTAgNSAyMiAzIDE1IDIxIDcgMjMgNyAyIDIyIDQgMTggCisxOCAzIDI0IDEwIDE3IDI0IDIzIDE4IDYgMTEgMTggMjIgOCA2IDIwIF4KKzQ1IDAgMiAxMiAxMCAxNCAxMiA5IDIgMjMgMTYgMjAgMTQgMTcgOSAxNiA3IDIxIDYgMjIgMjQgMTkgMTEgOSAxOSAyMSAxNSAxMSAxOSAKKzIgMiA3IDggMTAgOCA5IDggMTUgOSAxNCA2IDE2IDggMjEgMjEgMjIgMTMgXgorNTAgMSAxNyA5IDQgMjQgMjEgMTUgMTUgMTYgMTYgMTMgOSAxMCAxNiAxNCAxMiA3IDEyIDE1IDE1IDUgMTAgMTAgMjMgNSAxMyAyMiAzIAorNSAxIDQgMTEgMTQgNyA2IDEwIDE3IDE0IDYgMyAxMyAxOCAxNiAzIDUgMTUgMjMgOCA1IDMgMjIgXgorNDcgMCA4IDEyIDIwIDIwIDkgMiAxMyAyNCAxNyAyIDIgMTcgMyAxMyAyMCAyIDYgMyAxNSA3IDEzIDEgMTggNyAyMiAxOCAyNCAyMCAxNCAKKzcgMTcgMTYgMjAgMyAxMSA2IDUgMiAxOCAxNCAxNiAyMiAxNCAxMSA3IDE4IDIyIF4KKzQ4IDEgMTcgMjQgMTIgMTIgMyAxMyAxOSAxNiAyMiA0IDE2IDQgNiAyMyA4IDE4IDExIDIgMyAyMCAyMiA5IDIxIDggMjMgMSAyMyAyMCAKKzcgMTYgMTMgMjMgNCAxMyAzIDcgNCAyMyA2IDEzIDE5IDIgMyA3IDIgOSA5IDE5IF4KKzQ1IDEgNiAxMyA0IDIyIDYgMTkgMjAgMSA5IDcgMTQgMSAxNSAzIDIzIDI0IDIyIDE4IDEyIDEyIDE3IDE5IDEwIDggMTEgMjIgMTIgMTAgCisyIDIwIDE1IDE4IDE3IDE4IDcgMTEgMTIgMjEgNiAxMiA0IDcgMTggMTcgMTggXgorNDQgMCAyIDE0IDI0IDE0IDEgMjMgMSAxMSAxNSAxMCA2IDE4IDIwIDcgMSA4IDEgMTYgNiAyMCAyMyAyMyAyMSAxMCAxMCAxMiAyNCAxMCAKKzExIDIzIDIgMTIgMjMgOSAzIDI0IDI0IDE5IDE0IDEwIDE4IDE1IDE0IDEyIF4KKzUwIDEgMTYgMTEgMjIgMiAxNSAyNCA4IDIyIDEgNCAyNCA5IDEwIDE1IDMgOSA1IDQgMTcgMTUgOSAxMiAxOSAxOSAxIDMgMTAgNiA4IDMgCisxNyA4IDE4IDI0IDE5IDMgNCAxNSA0IDkgMiAyNCA1IDIwIDEzIDcgMjAgMTcgMTkgMTEgXgorNDMgMCAxMyA4IDEwIDE5IDE1IDExIDEgMTQgMTcgMjAgMjIgMTAgNyAxMSAxNiA5IDIxIDIyIDE3IDIzIDEyIDE1IDQgMjQgNyAyMSAxOCAKKzIgMjEgMTYgMSAxOSAxOCAyMCAxMSAzIDE1IDE5IDE4IDEgNiAxNCAxNSBeCis0NSAwIDUgNSAxOSAxMyAxMCAyNCAxOSAxNiAyNCAxNSAxMyAyIDE5IDE1IDI0IDIxIDE3IDQgMTMgMTcgMSAxIDkgMSAxMCAyIDE4IDEgCisyMSAxOSA1IDE4IDEyIDIgMjIgMTYgMjMgMTUgMTkgNiAxOCA5IDEgMjMgMjAgXgorNDkgMCAyMSAxMyAxNCAxMSAxOCAxMiAxMyAzIDE5IDkgMjAgMjIgMjAgMiAxMSAxMiA2IDEgMTIgMTYgMTggMiA5IDggNCAzIDExIDE3IAorMTEgNSA0IDE5IDE2IDExIDIzIDEzIDE4IDEgMjAgOCAyIDE2IDE2IDIxIDQgMTkgNSA1IDI0IF4KKzQ2IDAgMjQgMTMgMjMgNiAyNCA1IDE3IDEyIDUgMSAxNSAxNyAxNyAyMSAxMSAxMyA5IDIzIDExIDE0IDIxIDcgNiA5IDYgMTQgNyAxNiAKKzIgMTcgMSAyNCAyMyA0IDEyIDE0IDQgMiAxMSAyMyAxMiA0IDIzIDIxIDIxIDQgXgorNDkgMSAxNSAxMyAxNSAxNCAxNSA4IDE0IDkgMTcgNyAxNSAyIDIzIDIgMSAxNyA2IDE0IDE5IDI0IDIgOCA4IDcgNyAxMCAxNCAxMyA3IAorOSAxMSAxNiAxMSA4IDggMTggMTMgMTMgMTggMTAgMSAyMCAxOCAyMiAxOSAxMiA5IDE2IDEyIF4KKzQzIDEgMTMgNiA5IDE3IDIwIDEwIDUgNyAyMCAxOCA4IDE1IDIzIDIxIDIwIDUgMTUgMTEgMyAzIDE0IDIxIDEwIDI0IDYgMjEgMjEgNiAKKzIzIDEwIDMgMjEgMjMgMTcgMjAgOCAxNiAxMCAyMiA1IDE2IDEgMjQgXgorNTAgMCAyNCAzIDkgMTYgNiA3IDMgMjAgMTIgMTcgMTggMjEgNSA5IDcgMSA5IDEyIDE5IDUgNyA2IDI0IDExIDExIDIwIDIzIDEwIDQgNyAKKzEgMTkgNyAxOSAxNyAyMyAxNSA1IDEyIDIxIDIwIDMgMSAxNCAyIDE1IDIyIDMgMTYgMTEgXgorNDUgMSAxMCAxOSAxMCAyMCAxNiAxOSAxNyAxMCA0IDIxIDIwIDE2IDIxIDE0IDE0IDggMTcgMTAgMTkgMSAxNyA0IDMgMjIgMjMgMTQgCisxNiA5IDIyIDggMjAgMjQgMSA1IDExIDExIDYgNCAxMyAxNSAxMiAxIDExIDEzIDIyIF4KKzQ1IDAgMyA4IDUgNiA1IDE2IDEyIDExIDIgMTcgMTQgMTkgMjMgMTYgNSA2IDIwIDIxIDkgMjQgOSAyMiAyMyAyMiAxMiA4IDEzIDIzIAorMTcgNSAzIDE2IDIyIDE1IDIyIDcgMTcgMyAyIDEzIDEzIDExIDI0IDEzIDE3IF4KKzQyIDEgMjEgMTEgMTQgMjAgMjQgMjQgNCA5IDEzIDUgOCA5IDE4IDcgMTIgMSAyMSA4IDI0IDE1IDEgMjIgMTkgMjQgMTQgMTMgOCAyMCAKKzE0IDE4IDIzIDE5IDkgOCAxNCAyMyAxMSA0IDQgMjIgMjAgMTcgXgorNDkgMSAxNyAxNSAyMCA2IDE1IDggMjQgNCAyMCAxOSA4IDE5IDE0IDIxIDI0IDE4IDMgMTAgMTYgMyA2IDQgMSAxMCAxNSAxMyA0IDggCisxMiAyMiA5IDYgMyAxIDEzIDE2IDEyIDIzIDEwIDE0IDIgMSA2IDExIDggMTkgMjQgMTYgMjMgXgorNTAgMCA1IDIxIDIgNyAyMiA0IDUgMjMgMyAxMiAyMCA4IDQgNSAxNyA5IDE4IDE4IDE4IDQgMTAgMTMgMiA0IDcgMjQgOCAxMCAyMSA0IAorOCAyNCAyIDYgMTkgMTAgNiAyMiAyMiAxNCAyMiAxMyAyMSA1IDIyIDIgNCAxOCA1IDI0IF4KKzUzIDEgMjEgMSA3IDggNCAxNyA1IDE0IDEgMiAxMCA5IDEyIDUgMTEgMTAgMjAgNCAxNCAzIDEgMyAyMSAxMiAxMSAxNyAyMiAxMSA3IDUgCisyMSAxNCAxNSAxOSAyMCAxMiA2IDEyIDE4IDE5IDQgNyAxMiAxMCA1IDIyIDMgMTUgMjEgNyAyMyA3IDE4IF4KKzQzIDEgMjIgNCAxOCAxOCAzIDI0IDEwIDE3IDI0IDIzIDE4IDYgMTEgMTggMjIgOCA2IDYgMiAxMiAxMCAxNCAxMiA5IDIgMjMgMTYgMjAgCisxNCAxNyA5IDE2IDcgMjEgNiAyMiAyNCAxOSAxMSA5IDE5IDIxIDYgXgorNDkgMSAxMSAxOSAyIDIgNyA4IDEwIDggOSA4IDE1IDkgMTQgNiAxNiA4IDIxIDIxIDIyIDYgMTcgOSA0IDI0IDIxIDE1IDE1IDE2IDE2IAorMTMgOSAxMCAxNiAxNCAxMiA3IDEyIDE1IDE1IDUgMTAgMTAgMjMgNSAxMyAyMiAzIDUgMjIgXgorNTIgMCA0IDExIDE0IDcgNiAxMCAxNyAxNCA2IDMgMTMgMTggMTYgMyA1IDE1IDIzIDggNSAzIDE4IDggMTIgMjAgMjAgOSAyIDEzIDI0IAorMTcgMiAyIDE3IDMgMTMgMjAgMiA2IDMgMTUgNyAxMyAxIDE4IDcgMjIgMTggMjQgMjAgMTQgNyAyMyBeCis0NSAxIDE2IDIwIDMgMTEgNiA1IDIgMTggMTQgMTYgMjIgMTQgMTEgNyAxOCAxNiAxNyAyNCAxMiAxMiAzIDEzIDE5IDE2IDIyIDQgMTYgCis0IDYgMjMgOCAxOCAxMSAyIDMgMjAgMjIgOSAyMSA4IDIzIDEgMjMgMjAgMjMgXgorNTEgMSAxNiAxMyAyMyA0IDEzIDMgNyA0IDIzIDYgMTMgMTkgMiAzIDcgMiA5IDkgMTUgNiAxMyA0IDIyIDYgMTkgMjAgMSA5IDcgMTQgMSAKKzE1IDMgMjMgMjQgMjIgMTggMTIgMTIgMTcgMTkgMTAgOCAxMSAyMiAxMiAxMCAyIDIwIDE1IDE1IF4KKzQ4IDEgMTcgMTggNyAxMSAxMiAyMSA2IDEyIDQgNyAxOCAxNyAzIDIgMTQgMjQgMTQgMSAyMyAxIDExIDE1IDEwIDYgMTggMjAgNyAxIDggCisxIDE2IDYgMjAgMjMgMjMgMjEgMTAgMTAgMTIgMjQgMTAgMTEgMjMgMiAxMiAyMyA5IDIwIF4KKzQ5IDEgMjQgMjQgMTkgMTQgMTAgMTggMTUgMTQgNSAxNiAxMSAyMiAyIDE1IDI0IDggMjIgMSA0IDI0IDkgMTAgMTUgMyA5IDUgNCAxNyAKKzE1IDkgMTIgMTkgMTkgMSAzIDEwIDYgOCAzIDE3IDggMTggMjQgMTkgMyA0IDE1IDQgMjQgXgorNDMgMCAyIDI0IDUgMjAgMTMgNyAyMCAxNyAxOSAyMiAxMyA4IDEwIDE5IDE1IDExIDEgMTQgMTcgMjAgMjIgMTAgNyAxMSAxNiA5IDIxIAorMjIgMTcgMjMgMTIgMTUgNCAyNCA3IDIxIDE4IDIgMjEgMTYgMSAxOSAxMSBeCis0OCAxIDIwIDExIDMgMTUgMTkgMTggMSA2IDE0IDUgNSA1IDE5IDEzIDEwIDI0IDE5IDE2IDI0IDE1IDEzIDIgMTkgMTUgMjQgMjEgMTcgCis0IDEzIDE3IDEgMSA5IDEgMTAgMiAxOCAxIDIxIDE5IDUgMTggMTIgMiAyMiAxNiAyMyAxOSBeCis1MCAxIDE5IDYgMTggOSAxIDIzIDIyIDIxIDEzIDE0IDExIDE4IDEyIDEzIDMgMTkgOSAyMCAyMiAyMCAyIDExIDEyIDYgMSAxMiAxNiAKKzE4IDIgOSA4IDQgMyAxMSAxNyAxMSA1IDQgMTkgMTYgMTEgMjMgMTMgMTggMSAyMCA4IDIgMTYgMTYgXgorNDggMSAxNiAyMSA0IDE5IDUgNSAyMCAyNCAxMyAyMyA2IDI0IDUgMTcgMTIgNSAxIDE1IDE3IDE3IDIxIDExIDEzIDkgMjMgMTEgMTQgCisyMSA3IDYgOSA2IDE0IDcgMTYgMiAxNyAxIDI0IDIzIDQgMTIgMTQgNCAyIDExIDIzIDE1IF4KKzUwIDEgNCAyMyAyMSAyMSAxNiAxNSAxMyAxNSAxNCAxNSA4IDE0IDkgMTcgNyAxNSAyIDIzIDIgMSAxNyA2IDE0IDE5IDI0IDIgOCA4IDcgCis3IDEwIDE0IDEzIDcgOSAxMSAxNiAxMSA4IDggMTggMTMgMTMgMTggMTAgMSAyMCAxOCAyMiAzIF4KKzQ0IDEgMTIgOSAxNiAxNyAxMyA2IDkgMTcgMjAgMTAgNSA3IDIwIDE4IDggMTUgMjMgMjEgMjAgNSAxNSAxMSAzIDMgMTQgMjEgMTAgMjQgCis2IDIxIDIxIDYgMjMgMTAgMyAyMSAyMyAxNyAyMCA4IDE2IDEwIDIyIDEyIF4KKzUzIDAgMTYgMSA1IDI0IDMgOSAxNiA2IDcgMyAyMCAxMiAxNyAxOCAyMSA1IDkgNyAxIDkgMTIgMTkgNSA3IDYgMjQgMTEgMTEgMjAgMjMgCisxMCA0IDcgMSAxOSA3IDE5IDE3IDIzIDE1IDUgMTIgMjEgMjAgMyAxIDE0IDIgMTUgMjIgMyAxNiA5IF4KKzQ2IDEgMTAgMTkgMTAgMjAgMTYgMTkgMTcgMTAgNCAyMSAyMCAxNiAyMSAxNCAxNCA4IDE3IDEwIDE5IDEgMTcgNCAzIDIyIDIzIDE0IAorMTYgOSAyMiA4IDIwIDI0IDEgNSAxMSAxMSA2IDQgMTMgMTUgMTIgMSAxMSAxMyAyMSAyMSBeCis0NiAwIDggNSA2IDUgMTYgMTIgMTEgMiAxNyAxNCAxOSAyMyAxNiA1IDYgMjAgMjEgOSAyNCA5IDIyIDIzIDIyIDEyIDggMTMgMjMgMTcgCis1IDMgMTYgMjIgMTUgMjIgNyAxNyAzIDIgMTMgMTMgMTEgMjQgMTMgMTIgMjEgNyBeCis0MyAxIDE0IDIwIDI0IDI0IDQgOSAxMyA1IDggOSAxOCA3IDEyIDEgMjEgOCAyNCAxNSAxIDIyIDE5IDI0IDE0IDEzIDggMjAgMTQgMTggCisyMyAxOSA5IDggMTQgMjMgMTEgNCA0IDIyIDIwIDEzIDE3IDE1IDI0IF4KKzU1IDAgNiAxNSA4IDI0IDQgMjAgMTkgOCAxOSAxNCAyMSAyNCAxOCAzIDEwIDE2IDMgNiA0IDEgMTAgMTUgMTMgNCA4IDEyIDIyIDkgNiAKKzMgMSAxMyAxNiAxMiAyMyAxMCAxNCAyIDEgNiAxMSA4IDE5IDI0IDE2IDIgNSAyMSAyIDcgMjIgNCA1IDIzIDQgXgorNTUgMSAxMiAyMCA4IDQgNSAxNyA5IDE4IDE4IDE4IDQgMTAgMTMgMiA0IDcgMjQgOCAxMCAyMSA0IDggMjQgMiA2IDE5IDEwIDYgMjIgCisyMiAxNCAyMiAxMyAyMSA1IDIyIDIgNCAxOCA1IDExIDIxIDEgNyA4IDQgMTcgNSAxNCAxIDIgMTAgOSAxMiAxNCBeCis0OSAwIDExIDEwIDIwIDQgMTQgMyAxIDMgMjEgMTIgMTEgMTcgMjIgMTEgNyA1IDIxIDE0IDE1IDE5IDIwIDEyIDYgMTIgMTggMTkgNCA3IAorMTIgMTAgNSAyMiAzIDE1IDIxIDcgMjMgNyAyIDIyIDQgMTggMTggMyAyNCAxMCAxNyAyNCAxMiBeCis1MCAwIDE4IDYgMTEgMTggMjIgOCA2IDYgMiAxMiAxMCAxNCAxMiA5IDIgMjMgMTYgMjAgMTQgMTcgOSAxNiA3IDIxIDYgMjIgMjQgMTkgCisxMSA5IDE5IDIxIDE1IDExIDE5IDIgMiA3IDggMTAgOCA5IDggMTUgOSAxNCA2IDE2IDggMjIgXgorNTEgMSAyMSAyMiA2IDE3IDkgNCAyNCAyMSAxNSAxNSAxNiAxNiAxMyA5IDEwIDE2IDE0IDEyIDcgMTIgMTUgMTUgNSAxMCAxMCAyMyA1IAorMTMgMjIgMyA1IDEgNCAxMSAxNCA3IDYgMTAgMTcgMTQgNiAzIDEzIDE4IDE2IDMgNSAxNSAyMyA4IDIxIF4KKzUxIDEgNSAzIDE4IDggMTIgMjAgMjAgOSAyIDEzIDI0IDE3IDIgMiAxNyAzIDEzIDIwIDIgNiAzIDE1IDcgMTMgMSAxOCA3IDIyIDE4IAorMjQgMjAgMTQgNyAxNyAxNiAyMCAzIDExIDYgNSAyIDE4IDE0IDE2IDIyIDE0IDExIDcgMTggMTYgMjAgXgorNTIgMCAyNCAxMiAxMiAzIDEzIDE5IDE2IDIyIDQgMTYgNCA2IDIzIDggMTggMTEgMiAzIDIwIDIyIDkgMjEgOCAyMyAxIDIzIDIwIDcgCisxNiAxMyAyMyA0IDEzIDMgNyA0IDIzIDYgMTMgMTkgMiAzIDcgMiA5IDkgMTUgNiAxMyA0IDIyIDE2IF4KKzQ5IDEgMTkgMjAgMSA5IDcgMTQgMSAxNSAzIDIzIDI0IDIyIDE4IDEyIDEyIDE3IDE5IDEwIDggMTEgMjIgMTIgMTAgMiAyMCAxNSAxOCAKKzE3IDE4IDcgMTEgMTIgMjEgNiAxMiA0IDcgMTggMTcgMyAyIDE0IDI0IDE0IDEgMjMgMSAxMSAxNiBeCis0NyAwIDEwIDYgMTggMjAgNyAxIDggMSAxNiA2IDIwIDIzIDIzIDIxIDEwIDEwIDEyIDI0IDEwIDExIDIzIDIgMTIgMjMgOSAzIDI0IDI0IAorMTkgMTQgMTAgMTggMTUgMTQgNSAxNiAxMSAyMiAyIDE1IDI0IDggMjIgMSA0IDI0IDMgXgorNDUgMCAxNyA2IDI0IDExIDcgMjEgOSAxNyA4IDI1IDUgNSAyMiAxNiAxMyA1IDIgMTYgNCAyNSAyNSA4IDE4IDEzIDEzIDMgMSAyMiAyMyAKKzI0IDE4IDEyIDIxIDE5IDIgNCAyNCAxMyAxMSAyIDcgMjQgMjIgMTcgMjEgXgorNDYgMSAxNSAxIDggMyAxMCAxNSAxOCAxNSA4IDEwIDE2IDIwIDIwIDcgMTggMjIgMTEgMTggOSAxMSAxNSAyMiAyMCAxOCA2IDI0IDE1IAorMjUgNCAyMiAxMiAxNyA0IDYgMTcgMjAgMiA0IDIgNSAyMCAxNSAxOSAyNCAxOCAxNSBeCis1MiAxIDggMiA1IDIzIDIgMTAgMjEgOCA1IDIgOSAxNiAxNiAxNSA2IDIyIDIzIDUgNiAyMSA1IDIxIDI0IDMgNiAxMCAxNyAxOSA5IDE1IAorMTEgMjMgMTYgMTcgMSAzIDEyIDMgMjAgNCA1IDUgMyAyMSAyMiAxNSA0IDIxIDIwIDcgMjIgMTggXgorNDMgMCA5IDI0IDQgMTggNyA3IDI1IDI0IDIyIDIxIDIzIDI0IDE0IDIwIDEyIDYgNyA0IDIgMTIgMjUgMTUgMyA5IDIzIDggMTYgMjUgCisxMSAxNCA0IDEwIDE5IDIzIDE2IDEzIDkgMjAgMjUgMTcgMTEgOCAxOSBeCis1NSAwIDE5IDI1IDE3IDcgMTYgMjEgNiA0IDggMiAxNSA5IDIgOSAxOSAzIDYgMyAzIDEwIDI1IDEzIDE1IDcgOCAyMCAyMSAxMiAxMCAKKzEyIDUgMjQgMTEgMjAgMyAxMyAxMyAxNiA5IDEzIDEwIDMgOSAxNiAzIDcgMTUgOSA5IDE0IDIgMTMgMTcgMjUgMyBeCis0NiAwIDE4IDUgMTkgMjMgOSAyNSA5IDEwIDIzIDEyIDEyIDcgMTMgOCAxNSA3IDEgNiAyMSAyIDggNyA2IDE2IDE0IDE0IDEyIDE1IDEzIAorMjQgMTAgMTUgMTEgMTAgOCAxNCAxNSAyMSAyNSAyMSAxNiA5IDE4IDIwIDIyIDIxIF4KKzUwIDEgMjAgMTEgMTQgMjMgMjIgMTAgMTMgMTQgOCAxOSAxMiAyIDExIDIwIDIzIDEzIDQgMTAgNiA1IDcgMjMgMTEgMyAxNiA4IDIxIDQgCis4IDE4IDUgMTIgMTQgOCA2IDIwIDE5IDI0IDggMjMgMTcgMyA3IDE5IDEgMTggMSAxNCAyMiAxMSBeCis0NCAxIDE0IDUgOCAyMiAxOCAxNCAyNSAxNyAxMSAxMiAyMiAyIDEyIDEyIDE2IDEyIDEzIDE4IDE3IDEyIDE3IDE0IDE4IDggMjUgOSAKKzIzIDUgMyA4IDE0IDI0IDE3IDcgMyAzIDIzIDE3IDIyIDE5IDE5IDE3IDE2IDE5IF4KKzUxIDAgMjQgMTQgMTYgMjAgMjMgMjAgOSAxOSAxNiA3IDEyIDE2IDUgOCA5IDcgMTAgMjEgMjQgMTAgMTEgMTkgMSAyMSAxNCAxNCAxOSAKKzMgMjIgOCAxMiAyMCAxIDE4IDUgNiA1IDEyIDE0IDEgMSAxMSA5IDIyIDMgMjQgOSA2IDEgMTEgMjAgXgorNDcgMCAxIDEyIDggMTEgMTEgMTcgMTAgMjIgNyAzIDEwIDIgNiA0IDI0IDE2IDI0IDE5IDQgNSAxOCAxMSAxMiA5IDIwIDIxIDI1IDIgCisyMSAxOCAxMCAyMCAyNSAyMSAzIDE3IDE3IDUgOCAyMiAyNSAxOSA4IDEwIDE5IDcgMjUgXgorNTUgMSA0IDggMTggMyAxOCAzIDExIDI0IDIgMTQgOSAxIDEwIDQgNCAxMyAxOSAyMiA0IDcgMTkgNSAxMCAxMCAxIDggMjIgMjIgNiA4IAorMTMgMTIgMTEgMTcgMjMgMTQgMTYgNyA1IDExIDIyIDI0IDcgMiAxMSAxMyAxOCA0IDIwIDggMSA2IDI1IDIwIDE2IF4KKzUxIDEgMjAgMSAyNSAxMCAxNSAxNSAyIDE3IDEzIDkgMjQgMTcgMjQgMjAgMTMgMTUgMTcgMyAxMSAyMCAxMCA1IDEzIDIzIDE4IDUgMyAKKzE4IDE1IDcgNSA3IDQgMTUgMjAgMTYgMiAxNyAxIDcgNCAxMiA3IDI1IDE0IDEgNCA3IDE5IDE5IDIyIF4KKzUyIDAgMyAxMyAxMiA0IDMgMTQgNCAxNCAxMSA2IDMgMjUgMTggMTYgMjAgMjQgMTIgMTkgMTggMjUgNiAyMyA2IDE1IDUgNCA0IDYgMTQgCisxMyAyMCA1IDE0IDE1IDIgMTMgMjEgMTEgNSAxNyAyIDIgMTAgMTEgMTMgMTQgMTIgMTEgMjEgMTUgMjMgMjAgXgorNTAgMSAyIDUgNyAyMyAxMCAyMCA2IDEyIDEgMTkgMTAgMjQgMjEgMjIgMjUgMTYgMTIgMTkgMjIgMTUgMTAgMTggMjQgMSA1IDE2IDEwIAorMTggMiAxOSAxNCAzIDUgMSA3IDIwIDcgMTYgNiAyMCA2IDYgMjUgMTAgMjIgMjAgMiAxIDE1IDE4IF4KKzQ4IDAgMjMgMjUgMjMgNCAxMSAxNSAxNSA2IDkgMjIgMjIgMTkgMjIgMjUgNiAxOSA2IDIgMjAgMjEgNyAyMiAxOCAxMCA3IDE3IDQgMTYgCisxMiAxMCAyNSAxMiAyMyAyMyA5IDIgMjIgMSAyMCAyIDggMyAxNCA3IDEgMiAzIDI0IF4KKzM4IDEgMjEgMjEgMjMgMjAgMjIgMTEgMjUgMjAgMjQgMjUgMSA5IDIxIDIwIDE0IDEwIDE0IDE5IDkgMTcgMTUgMTMgNSAxNSAyNCAyMSAKKzEyIDEzIDI1IDIyIDIxIDEgMTYgMjMgNyAyNCAxNSAyMiBeCis1NCAxIDIyIDUgMjUgMyA0IDIgOSAxMiAyNCA2IDE5IDEgMTQgOSA1IDkgMSAxNyA5IDQgMjMgMjEgMSAzIDE1IDE2IDExIDEgMTIgMTggCis2IDIgNyA4IDE3IDggMjEgMTMgMjIgOSAyMSA0IDkgMSAxMyAxNyAyMSAxMCA5IDE4IDI0IDIzIDEzIDI0IF4KKzQzIDEgMjMgMjMgMTkgMjMgMjIgMTcgMTggMjMgMTggMjEgMTcgMSAxMCAxMiA0IDYgMSAyMSAxMSAxOCAyIDYgNiAxMiAxOCAxMyAxNiAKKzE2IDE4IDE5IDEzIDExIDIxIDE5IDE1IDEyIDE1IDE2IDE5IDIgMjMgMTkgMjMgXgorNDggMCAxIDIgMjUgMTQgMTEgMjUgMjQgMTYgOCAxNCAyMSAyMSAxNiA2IDEzIDEgMjMgMTUgOCAxNyA0IDMgNCA5IDIzIDEyIDggOCAyNCAKKzEzIDYgMTEgMyA4IDI0IDE5IDggMjMgMSAyNCAyNCAxOCAyNSAxMyAyIDYgMjUgMTQgXgorNTEgMSA5IDMgNSAxMSAxOSAxMSAxNiA1IDQgMTcgMjQgMjMgMTUgMTQgMTAgNyAxNCAxNyAyNSAxNSAxMCAxNCA2IDE4IDE4IDQgMSAxMyAKKzEwIDE2IDEgMjUgMTYgMiAyNCA1IDEgMTcgNiAxNyA2IDI0IDExIDcgMjEgOSAxNyA4IDI1IDUgMjMgXgorNDggMSAyMiAxNiAxMyA1IDIgMTYgNCAyNSAyNSA4IDE4IDEzIDEzIDMgMSAyMiAyMyAyNCAxOCAxMiAyMSAxOSAyIDQgMjQgMTMgMTEgMiAKKzcgMjQgMjIgMTcgNSAxNSAxIDggMyAxMCAxNSAxOCAxNSA4IDEwIDE2IDIwIDIwIDcgMjUgXgorNDkgMCAyMiAxMSAxOCA5IDExIDE1IDIyIDIwIDE4IDYgMjQgMTUgMjUgNCAyMiAxMiAxNyA0IDYgMTcgMjAgMiA0IDIgNSAyMCAxNSAxOSAKKzI0IDE4IDkgOCAyIDUgMjMgMiAxMCAyMSA4IDUgMiA5IDE2IDE2IDE1IDYgMjIgMjMgMTcgXgorNDcgMSA2IDIxIDUgMjEgMjQgMyA2IDEwIDE3IDE5IDkgMTUgMTEgMjMgMTYgMTcgMSAzIDEyIDMgMjAgNCA1IDUgMyAyMSAyMiAxNSA0IAorMjEgMjAgNyAyMiAxNCA5IDI0IDQgMTggNyA3IDI1IDI0IDIyIDIxIDIzIDI0IDE0IF4KKzUzIDAgMjAgMTIgNiA3IDQgMiAxMiAyNSAxNSAzIDkgMjMgOCAxNiAyNSAxMSAxNCA0IDEwIDE5IDIzIDE2IDEzIDkgMjAgMjUgMTcgMTEgCis4IDQgMTkgMjUgMTcgNyAxNiAyMSA2IDQgOCAyIDE1IDkgMiA5IDE5IDMgNiAzIDMgMTAgMjUgMTMgMTUgXgorNTQgMSA3IDggMjAgMjEgMTIgMTAgMTIgNSAyNCAxMSAyMCAzIDEzIDEzIDE2IDkgMTMgMTAgMyA5IDE2IDMgNyAxNSA5IDkgMTQgMiAxMyAKKzE3IDI1IDIgMTggNSAxOSAyMyA5IDI1IDkgMTAgMjMgMTIgMTIgNyAxMyA4IDE1IDcgMSA2IDIxIDIgOCAyNSBeCis0NCAxIDYgMTYgMTQgMTQgMTIgMTUgMTMgMjQgMTAgMTUgMTEgMTAgOCAxNCAxNSAyMSAyNSAyMSAxNiA5IDE4IDIwIDIyIDIxIDIwIDExIAorMTQgMjMgMjIgMTAgMTMgMTQgOCAxOSAxMiAyIDExIDIwIDIzIDEzIDQgMTAgNiAyNSBeCis0OSAxIDcgMjMgMTEgMyAxNiA4IDIxIDQgOCAxOCA1IDEyIDE0IDggNiAyMCAxOSAyNCA4IDIzIDE3IDMgNyAxOSAxIDE4IDEgMTQgMjIgCisxMyAxNCA1IDggMjIgMTggMTQgMjUgMTcgMTEgMTIgMjIgMiAxMiAxMiAxNiAxMiAxMyAxOCAyNSBeCis0NSAxIDEyIDE3IDE0IDE4IDggMjUgOSAyMyA1IDMgOCAxNCAyNCAxNyA3IDMgMyAyMyAxNyAyMiAxOSAxOSAxNyAxNiAyMiAyNCAxNCAKKzE2IDIwIDIzIDIwIDkgMTkgMTYgNyAxMiAxNiA1IDggOSA3IDEwIDIxIDI0IDcgXgorNTggMCAxMSAxOSAxIDIxIDE0IDE0IDE5IDMgMjIgOCAxMiAyMCAxIDE4IDUgNiA1IDEyIDE0IDEgMSAxMSA5IDIyIDMgMjQgOSA2IDEgCisxMSAxNiAxIDEyIDggMTEgMTEgMTcgMTAgMjIgNyAzIDEwIDIgNiA0IDI0IDE2IDI0IDE5IDQgNSAxOCAxMSAxMiA5IDIwIDIxIDcgXgorNTQgMSAyIDIxIDE4IDEwIDIwIDI1IDIxIDMgMTcgMTcgNSA4IDIyIDI1IDE5IDggMTAgMTkgNyAxMSA0IDggMTggMyAxOCAzIDExIDI0IAorMiAxNCA5IDEgMTAgNCA0IDEzIDE5IDIyIDQgNyAxOSA1IDEwIDEwIDEgOCAyMiAyMiA2IDggMTMgMTIgMTEgMjEgXgorNDcgMSAyMyAxNCAxNiA3IDUgMTEgMjIgMjQgNyAyIDExIDEzIDE4IDQgMjAgOCAxIDYgMjUgMjAgMTcgMjAgMSAyNSAxMCAxNSAxNSAyIAorMTcgMTMgOSAyNCAxNyAyNCAyMCAxMyAxNSAxNyAzIDExIDIwIDEwIDUgMTMgMjMgMTggMjEgXgorNTcgMSAzIDE4IDE1IDcgNSA3IDQgMTUgMjAgMTYgMiAxNyAxIDcgNCAxMiA3IDI1IDE0IDEgNCA3IDE5IDE5IDIwIDMgMTMgMTIgNCAzIAorMTQgNCAxNCAxMSA2IDMgMjUgMTggMTYgMjAgMjQgMTIgMTkgMTggMjUgNiAyMyA2IDE1IDUgNCA0IDYgMTQgMTMgMjAgNyBeCis1MSAxIDE0IDE1IDIgMTMgMjEgMTEgNSAxNyAyIDIgMTAgMTEgMTMgMTQgMTIgMTEgMjEgMTUgMjMgMyAyIDUgNyAyMyAxMCAyMCA2IDEyIAorMSAxOSAxMCAyNCAyMSAyMiAyNSAxNiAxMiAxOSAyMiAxNSAxMCAxOCAyNCAxIDUgMTYgMTAgMTggMiAxOSA4IF4KKzQ5IDAgMyA1IDEgNyAyMCA3IDE2IDYgMjAgNiA2IDI1IDEwIDIyIDIwIDIgMSAxNSAxNCAyMyAyNSAyMyA0IDExIDE1IDE1IDYgOSAyMiAKKzIyIDE5IDIyIDI1IDYgMTkgNiAyIDIwIDIxIDcgMjIgMTggMTAgNyAxNyA0IDE2IDEyIDI0IF4KKzQ2IDAgMTAgMjUgMTIgMjMgMjMgOSAyIDIyIDEgMjAgMiA4IDMgMTQgNyAxIDIgMyAxOSAyMSAyMSAyMyAyMCAyMiAxMSAyNSAyMCAyNCAKKzI1IDEgOSAyMSAyMCAxNCAxMCAxNCAxOSA5IDE3IDE1IDEzIDUgMTUgMjQgMjEgMTQgXgorNTUgMCAxMyAyNSAyMiAyMSAxIDE2IDIzIDcgMjQgMTUgMyAyMiA1IDI1IDMgNCAyIDkgMTIgMjQgNiAxOSAxIDE0IDkgNSA5IDEgMTcgOSAKKzQgMjMgMjEgMSAzIDE1IDE2IDExIDEgMTIgMTggNiAyIDcgOCAxNyA4IDIxIDEzIDIyIDkgMjEgNCA5IDIyIF4KKzQ1IDEgMTMgMTcgMjEgMTAgOSAxOCAyNCAyMyAxMyA3IDIzIDIzIDE5IDIzIDIyIDE3IDE4IDIzIDE4IDIxIDE3IDEgMTAgMTIgNCA2IDEgCisyMSAxMSAxOCAyIDYgNiAxMiAxOCAxMyAxNiAxNiAxOCAxOSAxMyAxMSAyMSAxOSA4IF4KKzUwIDEgMTIgMTUgMTYgMTkgMiAyMyAxOSA0IDEgMiAyNSAxNCAxMSAyNSAyNCAxNiA4IDE0IDIxIDIxIDE2IDYgMTMgMSAyMyAxNSA4IAorMTcgNCAzIDQgOSAyMyAxMiA4IDggMjQgMTMgNiAxMSAzIDggMjQgMTkgOCAyMyAxIDI0IDI0IDEyIF4KKzUzIDAgMjUgMTMgMiA2IDI1IDcgOSAzIDUgMTEgMTkgMTEgMTYgNSA0IDE3IDI0IDIzIDE1IDE0IDEwIDcgMTQgMTcgMjUgMTUgMTAgMTQgCis2IDE4IDE4IDQgMSAxMyAxMCAxNiAxIDI1IDE2IDIgMjQgNSAxIDE3IDYgMTcgNiAyNCAxMSA3IDIxIDkgMTkgXgorNTEgMSA4IDI1IDUgNSAyMiAxNiAxMyA1IDIgMTYgNCAyNSAyNSA4IDE4IDEzIDEzIDMgMSAyMiAyMyAyNCAxOCAxMiAyMSAxOSAyIDQgCisyNCAxMyAxMSAyIDcgMjQgMjIgMTcgNSAxNSAxIDggMyAxMCAxNSAxOCAxNSA4IDEwIDE2IDIwIDIwIDggXgorNTAgMSAxOCAyMiAxMSAxOCA5IDExIDE1IDIyIDIwIDE4IDYgMjQgMTUgMjUgNCAyMiAxMiAxNyA0IDYgMTcgMjAgMiA0IDIgNSAyMCAxNSAKKzE5IDI0IDE4IDkgOCAyIDUgMjMgMiAxMCAyMSA4IDUgMiA5IDE2IDE2IDE1IDYgMjIgMjMgMTggXgorNDggMSA2IDIxIDUgMjEgMjQgMyA2IDEwIDE3IDE5IDkgMTUgMTEgMjMgMTYgMTcgMSAzIDEyIDMgMjAgNCA1IDUgMyAyMSAyMiAxNSA0IAorMjEgMjAgNyAyMiAxNCA5IDI0IDQgMTggNyA3IDI1IDI0IDIyIDIxIDIzIDI0IDE0IDE5IF4KKzU1IDAgMTIgNiA3IDQgMiAxMiAyNSAxNSAzIDkgMjMgOCAxNiAyNSAxMSAxNCA0IDEwIDE5IDIzIDE2IDEzIDkgMjAgMjUgMTcgMTEgOCAKKzQgMTkgMjUgMTcgNyAxNiAyMSA2IDQgOCAyIDE1IDkgMiA5IDE5IDMgNiAzIDMgMTAgMjUgMTMgMTUgNyA4IDI0IF4KKzU2IDAgMjEgMTIgMTAgMTIgNSAyNCAxMSAyMCAzIDEzIDEzIDE2IDkgMTMgMTAgMyA5IDE2IDMgNyAxNSA5IDkgMTQgMiAxMyAxNyAyNSAKKzIgMTggNSAxOSAyMyA5IDI1IDkgMTAgMjMgMTIgMTIgNyAxMyA4IDE1IDcgMSA2IDIxIDIgOCA3IDYgMTYgMTQgMTQgMjIgXgorNDcgMCAxNSAxMyAyNCAxMCAxNSAxMSAxMCA4IDE0IDE1IDIxIDI1IDIxIDE2IDkgMTggMjAgMjIgMjEgMjAgMTEgMTQgMjMgMjIgMTAgCisxMyAxNCA4IDE5IDEyIDIgMTEgMjAgMjMgMTMgNCAxMCA2IDUgNyAyMyAxMSAzIDE2IDggMjEgMTIgXgorNDkgMCA0IDggMTggNSAxMiAxNCA4IDYgMjAgMTkgMjQgOCAyMyAxNyAzIDcgMTkgMSAxOCAxIDE0IDIyIDEzIDE0IDUgOCAyMiAxOCAxNCAKKzI1IDE3IDExIDEyIDIyIDIgMTIgMTIgMTYgMTIgMTMgMTggMTcgMTIgMTcgMTQgMTggOCAyNSAyMiBeCis0NiAxIDIzIDUgMyA4IDE0IDI0IDE3IDcgMyAzIDIzIDE3IDIyIDE5IDE5IDE3IDE2IDIyIDI0IDE0IDE2IDIwIDIzIDIwIDkgMTkgMTYgCis3IDEyIDE2IDUgOCA5IDcgMTAgMjEgMjQgMTAgMTEgMTkgMSAyMSAxNCAxNCAxOSAyMCBeCis1NyAxIDIyIDggMTIgMjAgMSAxOCA1IDYgNSAxMiAxNCAxIDEgMTEgOSAyMiAzIDI0IDkgNiAxIDExIDE2IDEgMTIgOCAxMSAxMSAxNyAKKzEwIDIyIDcgMyAxMCAyIDYgNCAyNCAxNiAyNCAxOSA0IDUgMTggMTEgMTIgOSAyMCAyMSAyNSAyIDIxIDE4IDEwIDIwIDI1IDcgXgorNTYgMSAzIDE3IDE3IDUgOCAyMiAyNSAxOSA4IDEwIDE5IDcgMTEgNCA4IDE4IDMgMTggMyAxMSAyNCAyIDE0IDkgMSAxMCA0IDQgMTMgCisxOSAyMiA0IDcgMTkgNSAxMCAxMCAxIDggMjIgMjIgNiA4IDEzIDEyIDExIDE3IDIzIDE0IDE2IDcgNSAxMSAyMiAyNCAxOCBeCis1NCAxIDIgMTEgMTMgMTggNCAyMCA4IDEgNiAyNSAyMCAxNyAyMCAxIDI1IDEwIDE1IDE1IDIgMTcgMTMgOSAyNCAxNyAyNCAyMCAxMyAKKzE1IDE3IDMgMTEgMjAgMTAgNSAxMyAyMyAxOCA1IDMgMTggMTUgNyA1IDcgNCAxNSAyMCAxNiAyIDE3IDEgNyA0IDIzIF4KKzU2IDAgNyAyNSAxNCAxIDQgNyAxOSAxOSAyMCAzIDEzIDEyIDQgMyAxNCA0IDE0IDExIDYgMyAyNSAxOCAxNiAyMCAyNCAxMiAxOSAxOCAKKzI1IDYgMjMgNiAxNSA1IDQgNCA2IDE0IDEzIDIwIDUgMTQgMTUgMiAxMyAyMSAxMSA1IDE3IDIgMiAxMCAxMSAxMyAxNCAyNCBeCis0OSAwIDEyIDExIDIwIDMgMTQgMiAzIDIgMjMgMTIgMTIgMTcgMjQgMTEgOCA2IDI0IDE2IDE1IDIyIDIxIDE0IDYgMTIgMjAgMTkgNSA1IAorMTIgMTEgNiAyMyAyIDE2IDIzIDcgMjQgNiAyMSAyIDE3IDE3IDUgMjUgMTEgMjUgMjAgMjUgMTkgXgorNTQgMCAxOCA2IDEyIDE5IDI1IDcgNiA1IDIgMTQgMTIgMTYgMSAxNSA3IDEgMjYgMTkgMTkgMTMgMjAgMTEgMTcgNiAyMCA1IDI0IDI0IAorMSAyMSAxMSA5IDIwIDIxIDE1IDEwIDE5IDI2IDMgMiA2IDcgMTIgOSAxMCA4IDE0IDEwIDE1IDUgMTcgOCAyMSA3IF4KKzU2IDAgMjAgMjUgNiAxOSA4IDMgMjIgMTYgMTYgMTYgMTcgMTMgMTEgMTAgMTcgMTUgMTIgNiAxMyAxNCAxNyA0IDEyIDEwIDI0IDUgMTMgCisyNCAzIDUgMiA1IDExIDE0IDggNSAxMCAxNyAxNiA4IDQgMTQgMjEgMTUgMyA2IDE3IDI1IDggMiAzIDMgMTkgMTAgMTMgMjMgXgorNTEgMSAyMiA4IDIgMTMgMjUgMTcgMiAxIDE5IDEgMTQgMjAgMiA1IDQgMTUgOCAxNCAyMCA3IDI1IDIwIDI2IDIwIDE2IDcgMTcgMTcgCisyMiAxIDEzIDYgNSAxIDE4IDE0IDE1IDIzIDE1IDEwIDUgMTkgMTggMTggMjYgMTIgMTMgMyAyNSAxMiAxOCBeCis1MSAxIDE2IDI0IDQgMTYgMyA2IDI2IDI2IDEwIDIwIDEzIDEgMjAgMjQgMTAgMjEgNyAyNSAyIDI1IDIyIDkgMTUgMTYgMjYgNSAxMiAxIAorNyA0IDI0IDcgMTQgMjAgMSA0IDcgMyAxMCAxMCAxNSA2IDEzIDYgMjIgNiAyMCAyMiAyIDI2IDI2IF4KKzQ3IDEgNiAxNCAxIDE2IDMgMjQgMjUgMjQgMTcgMTIgMTQgMTggMTggOSA5IDExIDIyIDEzIDkgMiAyMiAxNSAyMCAyMCAxOCA4IDEzIAorMTMgMjEgOCAxMSA1IDI2IDggMTkgMTcgNCAyIDE1IDI2IDEzIDI0IDI2IDExIDE2IDkgMjQgXgorNTIgMCA4IDE4IDIxIDYgMSA4IDEgMTYgNCAyMCAyMyAyMyAyNCAxMCAxMSAxMiAxMCAxMCAyNSAxIDExIDI1IDEwIDMgMjYgMjYgMjAgCisxNSAxMSAxOSAxNiAxNyAzIDE2IDEyIDI1IDE1IDkgMjMgMSAyIDI0IDggMTAgMTggMiA5IDUgNCAxNyAxNiAxMiBeCis1MCAwIDEyIDIwIDIwIDEgMyAxMSA1IDkgMyAxNyA5IDE3IDI0IDIxIDMgNCAxNiAyIDEwIDEgMjUgNSAyMiAxNiA2IDIxIDE5IDIxIDIzIAorMTUgOSA5IDIxIDE3IDExIDEgMTUgMTcgMjMgMjQgMTEgNyAxMCAyNiAxNSA4IDIyIDIyIDE4IDE2IF4KKzQ4IDAgMTEgMTcgNSAyNiA3IDIzIDE5IDMgMjQgMTcgMiAxOSAxOCAyNiAyMSAxMiA1IDE4IDIyIDIwIDcgMTUgNiA0IDUgMjAgMTMgMTAgCisyMyAxOCAxNiAyNSAxOCAxNSAyIDIwIDE0IDI0IDIyIDE3IDMgMTUgMTYgMSAxMCAyIDEyIDE2IF4KKzQ3IDAgMjEgMSAyMSAyMSA0IDE4IDEzIDEgMjQgMTggMjMgMTcgMTkgNiAxOSA5IDI2IDI1IDIzIDIzIDE0IDEzIDEzIDIwIDEyIDEzIDQgCisyMSAxMCAyMiAyMSAyMiAxIDEyIDEyIDcgMTMgMTYgMTggOCA5IDQgMyAxMCAxOCAxMiAyNSBeCis0NyAxIDUgMTkgMTkgMTIgMjQgMTMgMTggMSAyMiA4IDEgMTcgMTggMjQgMyAyMiA3IDcgMTkgMjYgMTMgMjYgNiAyNiA2IDE4IDEyIDUgCisyNiAxNyAxOCAxOSAyMiAxMCAxMiA4IDIzIDExIDE3IDIzIDI1IDUgNSAxMSA0IDEzIDIwIF4KKzUyIDAgMTggNCAxOSAyMyAzIDEzIDE1IDQgMyA5IDI0IDE0IDUgMjUgMjEgMjIgMTggMTcgMTIgMTUgMTQgMTYgMTAgMTQgOSAxOSA3IAorMTYgMyAyMyA0IDI2IDE4IDUgMTYgMjEgMjQgMiA4IDggOCA3IDExIDEzIDE0IDcgOSAxMiAxOCAxMSAxMCAyMCBeCis0NyAxIDIwIDEyIDE0IDE5IDExIDIxIDIxIDIyIDE5IDEzIDEwIDE2IDE5IDE0IDcgOCAxNiAyMCAxMCAzIDkgMjMgMTggNyAyNiAxNiAKKzIyIDIxIDIxIDUgMTQgMTEgMiAyIDE2IDIyIDExIDI2IDcgMjIgMjMgNSAyMyAxMCA0IDIyIDUgXgorNTAgMCAxOSAyMCA5IDE2IDEwIDI0IDQgMTkgMjYgNCAyNSA0IDggMTcgNyA3IDIgMjMgMTEgMTggMTkgMjMgNiAxMCA5IDEgOSAxNCAxOSAKKzUgNiA2IDI1IDEyIDExIDIxIDI2IDEyIDMgOCAyMCA4IDIxIDE4IDI1IDI1IDE0IDQgMTEgMjUgXgorNDUgMSAyMyA0IDE0IDMgMTcgMjYgMjIgMjYgMiAxNSA5IDggMjUgMTkgMTIgMjMgMTcgMjAgMTcgMTAgNCAyMyAyMCAxNyAyMSAxNCAxNCAKKzkgMTggMTEgMTggMiAxOCA0IDIgMjIgMjUgMTUgMTggMTAgMjMgOCAyMSAyNiAxNSBeCis1NCAwIDcgMTQgMTAgNiA2IDE1IDE1IDEzIDIgMTEgMTUgMjIgMiA5IDQgNCA2IDE2IDExIDExIDMgMTYgMTMgMTkgMjUgMTYgNSA3IDIwIAorMjIgOSAyNSAxMSAyNCAyNCAyNSAxMyA4IDE1IDIzIDE2IDYgMyAxOCAyMyAxNiAyMyA4IDIwIDQgMSAxIDE0IDE2IF4KKzQzIDEgMTIgMjQgMTQgMTQgMjYgMjMgMTMgMjYgMTQgMjEgMjUgMjUgNCA5IDEzIDUgOCA5IDIxIDggMTIgMjYgMjQgOSAyNCAxNSAxIAorMjMgMjIgMTYgMTQgOCAyMiAxNSAxOSAyNCAyMCA3IDggMTUgMjQgMTIgMTggXgorNTcgMCA0IDIzIDIxIDEzIDE5IDE1IDIxIDcgMTUgNyAzIDIxIDIwIDggMjIgMTQgMjMgMjYgMTkgMiAxMCAxOCAzIDUgMyAxIDkgMTUgCisxNSAzIDcgMTMgMjMgOSA3IDEgMTMgMTcgMTQgMjUgOSAxNiAyIDIgNiAxMyA3IDE5IDI1IDE3IDEgNSAyMSAyIDcgMjIgNSBeCis1NSAxIDYgMjUgMyAxMiAxOSA2IDIgNCAyNCAxNyA5IDE4IDIwIDE5IDQgMTEgMTQgMSA2IDggMjYgNiA5IDIyIDQgMTAgMiA3IDIxIDkgCis4IDI0IDI1IDE0IDIyIDEyIDIyIDMgMjMgMyAzIDIwIDYgMTEgMjMgNiAxIDcgNSAxOCA1IDE1IDI1IDI2IDIzIF4KKzUzIDAgMSAxMCAxMSAxMSA0IDEyIDExIDIwIDMgMTQgMiAzIDIgMjMgMTIgMTIgMTcgMjQgMTEgOCA2IDI0IDE2IDE1IDIyIDIxIDE0IDYgCisxMiAyMCAxOSA1IDUgMTIgMTEgNiAyMyAyIDE2IDIzIDcgMjQgNiAyMSAyIDE3IDE3IDUgMjUgMTEgMjUgMjAgMjYgXgorNTQgMCAyNCAxOCA2IDEyIDE5IDI1IDcgNiA1IDIgMTQgMTIgMTYgMSAxNSA3IDEgMjYgMTkgMTkgMTMgMjAgMTEgMTcgNiAyMCA1IDI0IAorMjQgMSAyMSAxMSA5IDIwIDIxIDE1IDEwIDE5IDI2IDMgMiA2IDcgMTIgOSAxMCA4IDE0IDEwIDE1IDUgMTcgOCAyMyBeCis1OCAwIDEgMjAgMjUgNiAxOSA4IDMgMjIgMTYgMTYgMTYgMTcgMTMgMTEgMTAgMTcgMTUgMTIgNiAxMyAxNCAxNyA0IDEyIDEwIDI0IDUgCisxMyAyNCAzIDUgMiA1IDExIDE0IDggNSAxMCAxNyAxNiA4IDQgMTQgMjEgMTUgMyA2IDE3IDI1IDggMiAzIDMgMTkgMTAgMTMgMjIgMTkgXgorNTIgMSA4IDIgMTMgMjUgMTcgMiAxIDE5IDEgMTQgMjAgMiA1IDQgMTUgOCAxNCAyMCA3IDI1IDIwIDI2IDIwIDE2IDcgMTcgMTcgMjIgMSAKKzEzIDYgNSAxIDE4IDE0IDE1IDIzIDE1IDEwIDUgMTkgMTggMTggMjYgMTIgMTMgMyAyNSAxMiAyMSAxNiAyMiBeCis1NiAxIDQgMTYgMyA2IDI2IDI2IDEwIDIwIDEzIDEgMjAgMjQgMTAgMjEgNyAyNSAyIDI1IDIyIDkgMTUgMTYgMjYgNSAxMiAxIDcgNCAKKzI0IDcgMTQgMjAgMSA0IDcgMyAxMCAxMCAxNSA2IDEzIDYgMjIgNiAyMCAyMiAyIDI2IDkgNiAxNCAxIDE2IDMgMjQgMTIgXgorNTIgMCAyNCAxNyAxMiAxNCAxOCAxOCA5IDkgMTEgMjIgMTMgOSAyIDIyIDE1IDIwIDIwIDE4IDggMTMgMTMgMjEgOCAxMSA1IDI2IDggCisxOSAxNyA0IDIgMTUgMjYgMTMgMjQgMjYgMTEgMTYgOSAxIDggMTggMjEgNiAxIDggMSAxNiA0IDIwIDIzIDUgXgorNTQgMCAyNCAxMCAxMSAxMiAxMCAxMCAyNSAxIDExIDI1IDEwIDMgMjYgMjYgMjAgMTUgMTEgMTkgMTYgMTcgMyAxNiAxMiAyNSAxNSA5IAorMjMgMSAyIDI0IDggMTAgMTggMiA5IDUgNCAxNyAxNiA5IDEyIDIwIDIwIDEgMyAxMSA1IDkgMyAxNyA5IDE3IDI0IDIwIF4KKzQ5IDEgMyA0IDE2IDIgMTAgMSAyNSA1IDIyIDE2IDYgMjEgMTkgMjEgMjMgMTUgOSA5IDIxIDE3IDExIDEgMTUgMTcgMjMgMjQgMTEgNyAKKzEwIDI2IDE1IDggMjIgMjIgMTggMjYgMTEgMTcgNSAyNiA3IDIzIDE5IDMgMjQgMTcgMiAxOSA4IF4KKzQ5IDAgMjYgMjEgMTIgNSAxOCAyMiAyMCA3IDE1IDYgNCA1IDIwIDEzIDEwIDIzIDE4IDE2IDI1IDE4IDE1IDIgMjAgMTQgMjQgMjIgMTcgCiszIDE1IDE2IDEgMTAgMiAxMiAyIDIxIDEgMjEgMjEgNCAxOCAxMyAxIDI0IDE4IDIzIDE3IDE5IDIzIF4KKzUwIDEgMTkgOSAyNiAyNSAyMyAyMyAxNCAxMyAxMyAyMCAxMiAxMyA0IDIxIDEwIDIyIDIxIDIyIDEgMTIgMTIgNyAxMyAxNiAxOCA4IDkgCis0IDMgMTAgMTggMTIgNCA1IDE5IDE5IDEyIDI0IDEzIDE4IDEgMjIgOCAxIDE3IDE4IDI0IDMgMjIgMjEgXgorNDggMSA3IDE5IDI2IDEzIDI2IDYgMjYgNiAxOCAxMiA1IDI2IDE3IDE4IDE5IDIyIDEwIDEyIDggMjMgMTEgMTcgMjMgMjUgNSA1IDExIAorNCAxMyA3IDE4IDQgMTkgMjMgMyAxMyAxNSA0IDMgOSAyNCAxNCA1IDI1IDIxIDIyIDE4IDI1IF4KKzUzIDEgMTIgMTUgMTQgMTYgMTAgMTQgOSAxOSA3IDE2IDMgMjMgNCAyNiAxOCA1IDE2IDIxIDI0IDIgOCA4IDggNyAxMSAxMyAxNCA3IDkgCisxMiAxOCAxMSAxMCA3IDIwIDEyIDE0IDE5IDExIDIxIDIxIDIyIDE5IDEzIDEwIDE2IDE5IDE0IDcgOCAxNiAyMCA3IF4KKzQ5IDAgMyA5IDIzIDE4IDcgMjYgMTYgMjIgMjEgMjEgNSAxNCAxMSAyIDIgMTYgMjIgMTEgMjYgNyAyMiAyMyA1IDIzIDEwIDQgMjIgMjQgCisxOSAyMCA5IDE2IDEwIDI0IDQgMTkgMjYgNCAyNSA0IDggMTcgNyA3IDIgMjMgMTEgMTggMTkgXgorNDkgMCAyMyA2IDEwIDkgMSA5IDE0IDE5IDUgNiA2IDI1IDEyIDExIDIxIDI2IDEyIDMgOCAyMCA4IDIxIDE4IDI1IDI1IDE0IDQgMTEgCisyNCAyMyA0IDE0IDMgMTcgMjYgMjIgMjYgMiAxNSA5IDggMjUgMTkgMTIgMjMgMTcgMjAgMTcgMTAgXgorNTQgMCA0IDIzIDIwIDE3IDIxIDE0IDE0IDkgMTggMTEgMTggMiAxOCA0IDIgMjIgMjUgMTUgMTggMTAgMjMgOCAyMSAyNiA3IDE0IDEwIAorNiA2IDE1IDE1IDEzIDIgMTEgMTUgMjIgMiA5IDQgNCA2IDE2IDExIDExIDMgMTYgMTMgMTkgMjUgMTYgNSA3IDIwIDIzIF4KKzQ3IDAgOSAyNSAxMSAyNCAyNCAyNSAxMyA4IDE1IDIzIDE2IDYgMyAxOCAyMyAxNiAyMyA4IDIwIDQgMSAxIDE0IDEzIDEyIDI0IDE0IAorMTQgMjYgMjMgMTMgMjYgMTQgMjEgMjUgMjUgNCA5IDEzIDUgOCA5IDIxIDggMTIgMjYgMTUgXgorNTEgMSA5IDI0IDE1IDEgMjMgMjIgMTYgMTQgOCAyMiAxNSAxOSAyNCAyMCA3IDggMTUgMjQgMTIgNCA0IDIzIDIxIDEzIDE5IDE1IDIxIAorNyAxNSA3IDMgMjEgMjAgOCAyMiAxNCAyMyAyNiAxOSAyIDEwIDE4IDMgNSAzIDEgOSAxNSAxNSAzIDI0IF4KKzYwIDAgMTMgMjMgOSA3IDEgMTMgMTcgMTQgMjUgOSAxNiAyIDIgNiAxMyA3IDE5IDI1IDE3IDEgNSAyMSAyIDcgMjIgNSA2IDI1IDMgMTIgCisxOSA2IDIgNCAyNCAxNyA5IDE4IDIwIDE5IDQgMTEgMTQgMSA2IDggMjYgNiA5IDIyIDQgMTAgMiA3IDIxIDkgOCAyNCAyNSAxMCBeCis1OSAwIDIyIDEyIDIyIDMgMjMgMyAzIDIwIDYgMTEgMjMgNiAxIDcgNSAxOCA1IDE1IDI1IDI2IDEgMSAxMCAxMSAxMSA0IDEyIDExIDIwIAorMyAxNCAyIDMgMiAyMyAxMiAxMiAxNyAyNCAxMSA4IDYgMjQgMTYgMTUgMjIgMjEgMTQgNiAxMiAyMCAxOSA1IDUgMTIgMTEgNiAyMyA4IF4KKzUwIDAgMTYgMjMgNyAyNCA2IDIxIDIgMTcgMTcgNSAyNSAxMSAyNSAyMCAyNSAyNCAxOCA2IDEyIDE5IDI1IDcgNiA1IDIgMTQgMTIgMTYgCisxIDE1IDcgMSAyNiAxOSAxOSAxMyAyMCAxMSAxNyA2IDIwIDUgMjQgMjQgMSAyMSAxMSA5IDIwIDE0IF4KKzYwIDAgMTUgMTAgMTkgMjYgMyAyIDYgNyAxMiA5IDEwIDggMTQgMTAgMTUgNSAxNyA4IDIxIDEgMjAgMjUgNiAxOSA4IDMgMjIgMTYgMTYgCisxNiAxNyAxMyAxMSAxMCAxNyAxNSAxMiA2IDEzIDE0IDE3IDQgMTIgMTAgMjQgNSAxMyAyNCAzIDUgMiA1IDExIDE0IDggNSAxMCAxNyAKKzE2IDEzIF4KKzU3IDAgNCAxNCAyMSAxNSAzIDYgMTcgMjUgOCAyIDMgMyAxOSAxMCAxMyAyMiAyMiA4IDIgMTMgMjUgMTcgMiAxIDE5IDEgMTQgMjAgMiAKKzUgNCAxNSA4IDE0IDIwIDcgMjUgMjAgMjYgMjAgMTYgNyAxNyAxNyAyMiAxIDEzIDYgNSAxIDE4IDE0IDE1IDIzIDE1IDEwIDIxIF4KKzUyIDEgMTkgMTggMTggMjYgMTIgMTMgMyAyNSAxMiAyMSAxNiAyNCA0IDE2IDMgNiAyNiAyNiAxMCAyMCAxMyAxIDIwIDI0IDEwIDIxIDcgCisyNSAyIDI1IDIyIDkgMTUgMTYgMjYgNSAxMiAxIDcgNCAyNCA3IDE0IDIwIDEgNCA3IDMgMTAgMTAgMTUgMTkgXgorNTEgMCAxMyA2IDIyIDYgMjAgMjIgMiAyNiA5IDYgMTQgMSAxNiAzIDI0IDI1IDI0IDE3IDEyIDE0IDE4IDE4IDkgOSAxMSAyMiAxMyA5IAorMiAyMiAxNSAyMCAyMCAxOCA4IDEzIDEzIDIxIDggMTEgNSAyNiA4IDE5IDE3IDQgMiAxNSAyNiAxMyAyMSBeCis1MiAxIDI0IDI2IDExIDE2IDkgMSA4IDE4IDIxIDYgMSA4IDEgMTYgNCAyMCAyMyAyMyAyNCAxMCAxMSAxMiAxMCAxMCAyNSAxIDExIDI1IAorMTAgMyAyNiAyNiAyMCAxNSAxMSAxOSAxNiAxNyAzIDE2IDEyIDI1IDE1IDkgMjMgMSAyIDI0IDggMTAgMTggMTUgXgorNTUgMSA5IDUgNCAxNyAxNiA5IDEyIDIwIDIwIDEgMyAxMSA1IDkgMyAxNyA5IDE3IDI0IDIxIDMgNCAxNiAyIDEwIDEgMjUgNSAyMiAxNiAKKzYgMjEgMTkgMjEgMjMgMTUgOSA5IDIxIDE3IDExIDEgMTUgMTcgMjMgMjQgMTEgNyAxMCAyNiAxNSA4IDIyIDIyIDExIF4KKzUwIDEgMjYgMTEgMTcgNSAyNiA3IDIzIDE5IDMgMjQgMTcgMiAxOSAxOCAyNiAyMSAxMiA1IDE4IDIyIDIwIDcgMTUgNiA0IDUgMjAgMTMgCisxMCAyMyAxOCAxNiAyNSAxOCAxNSAyIDIwIDE0IDI0IDIyIDE3IDMgMTUgMTYgMSAxMCAyIDEyIDIgMjUgXgorNTEgMCAxIDIxIDIxIDQgMTggMTMgMSAyNCAxOCAyMyAxNyAxOSA2IDE5IDkgMjYgMjUgMjMgMjMgMTQgMTMgMTMgMjAgMTIgMTMgNCAyMSAKKzEwIDIyIDIxIDIyIDEgMTIgMTIgNyAxMyAxNiAxOCA4IDkgNCAzIDEwIDE4IDEyIDQgNSAxOSAxOSAxMiAyNCBeCis1MyAxIDEzIDE4IDEgMjIgOCAxIDE3IDE4IDI0IDMgMjIgNyA3IDE5IDI2IDEzIDI2IDYgMjYgNiAxOCAxMiA1IDI2IDE3IDE4IDE5IDIyIAorMTAgMTIgOCAyMyAxMSAxNyAyMyAyNSA1IDUgMTEgNCAxMyA3IDE4IDQgMTkgMjMgMyAxMyAxNSA0IDMgOSAxOCBeCis1MSAxIDE0IDUgMjUgMjEgMjIgMTggMTcgMTIgMTUgMTQgMTYgMTAgMTQgOSAxOSA3IDE2IDMgMjMgNCAyNiAxOCA1IDE2IDIxIDI0IDIgCis4IDggOCA3IDExIDEzIDE0IDcgOSAxMiAxOCAxMSAxMCA3IDIwIDEyIDE0IDE5IDExIDIxIDIxIDIyIDE5IDI2IF4KKzQ5IDAgMTAgMTYgMTkgMTQgNyA4IDE2IDIwIDEwIDMgOSAyMyAxOCA3IDI2IDE2IDIyIDIxIDIxIDUgMTQgMTEgMiAyIDE2IDIyIDExIAorMjYgNyAyMiAyMyA1IDIzIDEwIDQgMjIgMjQgMTkgMjAgOSAxNiAxMCAyNCA0IDE5IDI2IDQgMjUgMTQgXgorNTIgMCA4IDE3IDcgNyAyIDIzIDExIDE4IDE5IDIzIDYgMTAgOSAxIDkgMTQgMTkgNSA2IDYgMjUgMTIgMTEgMjEgMjYgMTIgMyA4IDIwIAorOCAyMSAxOCAyNSAyNSAxNCA0IDExIDI0IDIzIDQgMTQgMyAxNyAyNiAyMiAyNiAyIDE1IDkgOCAyNSAyNCBeCis1NSAxIDEyIDIzIDE3IDIwIDE3IDEwIDQgMjMgMjAgMTcgMjEgMTQgMTQgOSAxOCAxMSAxOCAyIDE4IDQgMiAyMiAyNSAxNSAxOCAxMCAKKzIzIDggMjEgMjYgNyAxNCAxMCA2IDYgMTUgMTUgMTMgMiAxMSAxNSAyMiAyIDkgNCA0IDYgMTYgMTEgMTEgMyAxNiAxMyAxOSAxNSBeCis0OSAwIDE2IDUgNyAyMCAyMiA5IDI1IDExIDI0IDI0IDI1IDEzIDggMTUgMjMgMTYgNiAzIDE4IDIzIDE2IDIzIDggMjAgNCAxIDEgMTQgCisxMyAxMiAyNCAxNCAxNCAyNiAyMyAxMyAyNiAxNCAyMSAyNSAyNSA0IDkgMTMgNSA4IDkgMjEgOSBeCis1NSAwIDIyIDI0IDkgMjcgMjMgMSAxMyAxOCAyNCAxIDggMjQgOCA2IDE0IDEgNCA1IDE1IDI3IDEyIDIwIDEgMTcgNSA0IDE0IDI1IDE0IAorMyAxOSAyNCAyNCAxNCA4IDEzIDEyIDE5IDggMyA2IDEzIDcgMTAgMjMgMTkgMTAgMTcgMTcgMTEgNiAxMyA4IDE4IDE4IF4KKzUxIDAgNyAzIDI1IDEgMTcgOCAyNiAyNSAxMSAyMyAxNCAyNyAxIDIyIDExIDkgNyAxOSA0IDE1IDE4IDIgMjcgMjAgMTEgNSAyMCAyMiAKKzE5IDE1IDUgNiAxNyA4IDEgMTkgMjIgOSAyMyAxMCAyNiAyNyAyNiAxNCAxMiAzIDE0IDE1IDExIDIgMjYgXgorNTAgMCA2IDIyIDIwIDggMjUgNCAyNSAyNCAyMyAyMCAzIDMgMTYgMiAyIDI3IDIgMTUgMTQgMjcgMyAxNyAxMiAyNyAyNyA3IDI2IDIgCisyMiAxMSA5IDEwIDI0IDE1IDEgMjcgMTEgMjcgNCAxIDI1IDI1IDE2IDYgMiAyMiAxMiAxNyAyMSAxNCBeCis1MiAwIDggOSAyMiAxNyAxMiA3IDE4IDE0IDIzIDIgNiA0IDIzIDkgNCAyMiAxNiAxOCAyMyA4IDExIDI1IDE3IDI3IDE2IDEwIDMgMjQgCis4IDIwIDIwIDE4IDE4IDEzIDQgMiAxOCAyMiAxNSAyNSAyNiA5IDMgMSAyIDE5IDE1IDEgMjQgMTcgMTYgMTggXgorNDkgMCA5IDE0IDExIDggMTYgMTkgMTYgMjIgMTAgMTYgMjQgMjUgNyAyMiAxMiAyMCAxNSAyMyAyMiAxOCAyMiAxNCA2IDI2IDIxIDEwIAorMjEgNyAxMyAyIDE2IDcgMjQgMTYgMjIgMTMgMTAgNyAxMSAxNiA1IDkgMjUgMTMgOSAxNCAxNCAxNyAxNCBeCis1NCAxIDIgMTAgNSAyNSA1IDcgMTAgMjIgMTAgMSAyNCAzIDExIDcgMjMgNSAxNyAxNCAzIDE4IDUgMTMgMjYgMTUgNSAxMyAyMyAxOCAKKzE3IDMgMTggMyAyNyAxNSA2IDI1IDI0IDIyIDI3IDE3IDQgMjUgMjMgMTUgOSAxNSAyMSA4IDcgNyAxNSAzIDEzIDI1IF4KKzQ3IDAgMjUgMyA0IDEwIDI0IDEyIDcgMTYgMjUgMTggMjEgMjEgMjAgMjcgMTMgMTQgMjMgMjcgMSAyMSA5IDIxIDE0IDIyIDkgOSA1IAorMTUgMTMgMTcgMyA0IDkgMTYgMSA4IDIzIDE3IDIzIDI2IDggMjQgMTAgMjAgMjUgMjcgMjUgXgorNTggMSA4IDI2IDggMTAgNCAzIDggMTQgNSA1IDcgMTEgMTMgMTEgMjYgMTEgNCAyNiAxNyAyMCAxOSAxMSAxMCAzIDEwIDE0IDkgNiA5IAorNyAxNiAxMCA0IDQgMTkgMTkgMiAyNiAxMyAxOSAxNyAxNSAyNCAxNSA0IDIxIDIyIDEzIDEzIDEyIDIyIDIgMTQgMjAgNSAxOCA3IDI1IF4KKzU4IDAgMTcgMjQgMjAgMTMgNiAxNyA5IDIwIDIgMTAgMTkgMyAyMiA0IDEgMTEgMyA1IDMgMjEgMTEgMTUgMTIgMjMgMjYgNSAyIDI3IDYgCis1IDE2IDYgMyAyIDIzIDUgMyAyMCAyMCA0IDI0IDIgMTggMjEgNyAxNCAxMCAyNyAyMyA2IDI0IDYgMTkgMjMgMyA5IDIyIDE1IF4KKzU0IDAgMjEgMTcgMTkgMjUgMTcgNyAyMSAxOSA2IDE2IDE1IDE1IDIwIDE0IDIgMjUgMTkgMTQgMTggMTkgNyA5IDEgMTQgMTEgMTAgMTYgCiszIDIzIDE0IDI2IDEwIDExIDEgMTggMSAxMiAyNCAxOSAxOSAxIDcgMiAzIDI0IDcgMTIgOSAyIDggMTYgMjAgMjQgMjUgXgorNDkgMSAyNiAyNiA0IDkgMiA3IDI1IDkgOCAxMiAxOCAxNCAyNiA3IDE3IDE4IDQgMjAgMSAxNiAxNCAyMSAyNiA0IDYgOCAyNCAxMSAyNSAKKzE1IDI0IDE2IDIzIDQgMTAgMjMgMjEgMjQgMTUgMTAgOSAyNiA3IDE0IDI0IDIxIDYgMjAgMTkgXgorNTYgMSAxNyAxNiAxNyAxIDMgMTIgMSA0IDEzIDMgOSAyMSAyMyA3IDE4IDExIDEgMTkgMjAgMjMgMTIgMTIgMjcgMTMgMTMgMTUgMTYgCisxMyAxIDE2IDE1IDEyIDI2IDMgMTYgMTYgOCAxNyAxMyAyMSA0IDYgNSAxOSAxNCAxNiA0IDE2IDExIDE0IDE4IDE4IDI3IDkgMTMgMjIgXgorNTEgMSAzIDI2IDIyIDMgNyA2IDQgMjYgMyAxNSA4IDI1IDEgMjAgMTMgOSAxMSAyMCA2IDExIDIxIDI3IDI1IDIwIDcgNCAxOCAyNiAxNiAKKzI3IDUgMTIgMTkgNyAyMyA2IDI1IDI1IDIgMTEgMTMgMjUgMjEgMTggMTcgNiAxMiAxNCAxMyAyNCAxMyBeCis0OCAxIDE0IDE5IDI2IDI3IDI1IDYgMSAxNSA0IDcgMjcgMjQgMjcgMjEgNSAyNyAxOSAxOCA4IDIxIDMgMjMgMjAgMjEgMjUgMjEgMSA5IAorMTcgMjIgNSAyMiA4IDIgMTMgMjcgOCAxOSAyNyAyMSAyIDUgOCA0IDI3IDEwIDYgMjUgXgorNTIgMCAyIDYgMSAxIDI2IDE4IDEzIDUgMTAgMTggMTAgOCA1IDIxIDE1IDUgMTQgMTkgMTIgNCA4IDIwIDIxIDI2IDEgMTIgMjUgMTAgMiAKKzE3IDEwIDE1IDIgMjAgMjUgMjYgMjMgMjUgMTIgMTYgMTUgOSAxOCAxNSAxOSAyMSAxNiAyNiAxMSAxOCAyMCAyNiBeCis1MyAwIDYgMjIgNyA4IDggMTIgMiAyMSAxOCAxMiAxMSA1IDE5IDMgMTkgMjcgMTggMjUgMjIgMjIgMjMgMTYgMiAxIDIwIDE2IDE0IDIyIAorNiAxNSAyMiAxIDIxIDYgNiAxMCAyIDI2IDEyIDExIDYgMjcgMTQgNyAyMCAyNiAyMCAxNyA3IDE5IDUgMjMgMTQgXgorNjEgMCAxNiAxMiA3IDE1IDE3IDcgNSAxMSAxMiAxNSA3IDEgMTAgMTAgOCA0IDIgNCAxNyA0IDExIDE3IDI2IDIzIDI0IDQgNSAxMiA1IAorMSA2IDkgNiA4IDI3IDUgMTEgMTEgMjQgMjQgMTMgMTcgMiAyNCAyNiAxOSAxMSAyMiAyMSAyIDIgMTQgMjEgMTMgMSAyMyAxMCAyNSA4IAorMTUgMTMgXgorNTIgMCAxOSAyMyAyIDkgMjYgNiAyMyAxMyA1IDI0IDEyIDIxIDExIDE0IDQgMTIgMTAgMTIgMjIgNCAzIDIwIDE3IDEwIDEzIDE2IDkgCisxMCAyNyA5IDEyIDEzIDIwIDEwIDEyIDIzIDIzIDExIDE5IDEzIDI1IDIyIDggMSA1IDE2IDIwIDkgMTkgOSAyNCAyNiBeCis1MSAwIDEyIDE1IDYgMjEgMjcgMjIgMjYgMjQgMTggOSAxNSA4IDIyIDI0IDkgMjcgMjMgMSAxMyAxOCAyNCAxIDggMjQgOCA2IDE0IDEgCis0IDUgMTUgMjcgMTIgMjAgMSAxNyA1IDQgMTQgMjUgMTQgMyAxOSAyNCAyNCAxNCA4IDEzIDEyIDE5IDIyIF4KKzU2IDAgMyA2IDEzIDcgMTAgMjMgMTkgMTAgMTcgMTcgMTEgNiAxMyA4IDE4IDYgNyAzIDI1IDEgMTcgOCAyNiAyNSAxMSAyMyAxNCAyNyAKKzEgMjIgMTEgOSA3IDE5IDQgMTUgMTggMiAyNyAyMCAxMSA1IDIwIDIyIDE5IDE1IDUgNiAxNyA4IDEgMTkgMjIgOSAyMyAxNyBeCis1MCAwIDI2IDI3IDI2IDE0IDEyIDMgMTQgMTUgMTEgMiAxMiA2IDIyIDIwIDggMjUgNCAyNSAyNCAyMyAyMCAzIDMgMTYgMiAyIDI3IDIgCisxNSAxNCAyNyAzIDE3IDEyIDI3IDI3IDcgMjYgMiAyMiAxMSA5IDEwIDI0IDE1IDEgMjcgMTEgMjcgMjEgXgorNTIgMCAxIDI1IDI1IDE2IDYgMiAyMiAxMiAxNyAyMSAxMiA4IDkgMjIgMTcgMTIgNyAxOCAxNCAyMyAyIDYgNCAyMyA5IDQgMjIgMTYgCisxOCAyMyA4IDExIDI1IDE3IDI3IDE2IDEwIDMgMjQgOCAyMCAyMCAxOCAxOCAxMyA0IDIgMTggMjIgMTUgMjUgMTAgXgorNTIgMCA5IDMgMSAyIDE5IDE1IDEgMjQgMTcgMTYgMTggOSAxNCAxMSA4IDE2IDE5IDE2IDIyIDEwIDE2IDI0IDI1IDcgMjIgMTIgMjAgCisxNSAyMyAyMiAxOCAyMiAxNCA2IDI2IDIxIDEwIDIxIDcgMTMgMiAxNiA3IDI0IDE2IDIyIDEzIDEwIDcgMTEgMTYgMTMgXgorNTMgMSA5IDI1IDEzIDkgMTQgMTQgMTcgMjUgMiAxMCA1IDI1IDUgNyAxMCAyMiAxMCAxIDI0IDMgMTEgNyAyMyA1IDE3IDE0IDMgMTggNSAKKzEzIDI2IDE1IDUgMTMgMjMgMTggMTcgMyAxOCAzIDI3IDE1IDYgMjUgMjQgMjIgMjcgMTcgNCAyNSAyMyAxNSAxNSBeCis1MiAxIDE1IDIxIDggNyA3IDE1IDMgMTMgMjIgMjUgMyA0IDEwIDI0IDEyIDcgMTYgMjUgMTggMjEgMjEgMjAgMjcgMTMgMTQgMjMgMjcgCisxIDIxIDkgMjEgMTQgMjIgOSA5IDUgMTUgMTMgMTcgMyA0IDkgMTYgMSA4IDIzIDE3IDIzIDI2IDggMjQgMTQgXgorNTggMCAyMCAyNSAyNyAzIDggMjYgOCAxMCA0IDMgOCAxNCA1IDUgNyAxMSAxMyAxMSAyNiAxMSA0IDI2IDE3IDIwIDE5IDExIDEwIDMgCisxMCAxNCA5IDYgOSA3IDE2IDEwIDQgNCAxOSAxOSAyIDI2IDEzIDE5IDE3IDE1IDI0IDE1IDQgMjEgMjIgMTMgMTMgMTIgMjIgMiAxNCAKKzE4IF4KKzYwIDAgNSAxOCA3IDE3IDI0IDIwIDEzIDYgMTcgOSAyMCAyIDEwIDE5IDMgMjIgNCAxIDExIDMgNSAzIDIxIDExIDE1IDEyIDIzIDI2IDUgCisyIDI3IDYgNSAxNiA2IDMgMiAyMyA1IDMgMjAgMjAgNCAyNCAyIDE4IDIxIDcgMTQgMTAgMjcgMjMgNiAyNCA2IDE5IDIzIDMgOSAyNSBeCis1NSAwIDE2IDIxIDE3IDE5IDI1IDE3IDcgMjEgMTkgNiAxNiAxNSAxNSAyMCAxNCAyIDI1IDE5IDE0IDE4IDE5IDcgOSAxIDE0IDExIDEwIAorMTYgMyAyMyAxNCAyNiAxMCAxMSAxIDE4IDEgMTIgMjQgMTkgMTkgMSA3IDIgMyAyNCA3IDEyIDkgMiA4IDE2IDIwIDI0IDI3IF4KKzUxIDEgMjYgMjYgNCA5IDIgNyAyNSA5IDggMTIgMTggMTQgMjYgNyAxNyAxOCA0IDIwIDEgMTYgMTQgMjEgMjYgNCA2IDggMjQgMTEgMjUgCisxNSAyNCAxNiAyMyA0IDEwIDIzIDIxIDI0IDE1IDEwIDkgMjYgNyAxNCAyNCAyMSA2IDIwIDUgMTcgMTUgXgorNTcgMCAxNyAxIDMgMTIgMSA0IDEzIDMgOSAyMSAyMyA3IDE4IDExIDEgMTkgMjAgMjMgMTIgMTIgMjcgMTMgMTMgMTUgMTYgMTMgMSAxNiAKKzE1IDEyIDI2IDMgMTYgMTYgOCAxNyAxMyAyMSA0IDYgNSAxOSAxNCAxNiA0IDE2IDExIDE0IDE4IDE4IDI3IDkgMTMgMjEgMyAyNiAyMyBeCis1MiAwIDMgNyA2IDQgMjYgMyAxNSA4IDI1IDEgMjAgMTMgOSAxMSAyMCA2IDExIDIxIDI3IDI1IDIwIDcgNCAxOCAyNiAxNiAyNyA1IDEyIAorMTkgNyAyMyA2IDI1IDI1IDIgMTEgMTMgMjUgMjEgMTggMTcgNiAxMiAxNCAxMyAyNCAxMSAxNCAxOSAyNiAxMiBeCis1NSAxIDI1IDYgMSAxNSA0IDcgMjcgMjQgMjcgMjEgNSAyNyAxOSAxOCA4IDIxIDMgMjMgMjAgMjEgMjUgMjEgMSA5IDE3IDIyIDUgMjIgCis4IDIgMTMgMjcgOCAxOSAyNyAyMSAyIDUgOCA0IDI3IDEwIDYgMTggMiA2IDEgMSAyNiAxOCAxMyA1IDEwIDE4IDExIF4KKzUyIDAgOCA1IDIxIDE1IDUgMTQgMTkgMTIgNCA4IDIwIDIxIDI2IDEgMTIgMjUgMTAgMiAxNyAxMCAxNSAyIDIwIDI1IDI2IDIzIDI1IAorMTIgMTYgMTUgOSAxOCAxNSAxOSAyMSAxNiAyNiAxMSAxOCAyMCA2IDIyIDcgOCA4IDEyIDIgMjEgMTggMTIgMTEgMjcgXgorNTMgMSAxOSAzIDE5IDI3IDE4IDI1IDIyIDIyIDIzIDE2IDIgMSAyMCAxNiAxNCAyMiA2IDE1IDIyIDEgMjEgNiA2IDEwIDIgMjYgMTIgCisxMSA2IDI3IDE0IDcgMjAgMjYgMjAgMTcgNyAxOSA1IDIzIDE4IDE2IDEyIDcgMTUgMTcgNyA1IDExIDEyIDE1IDcgMjIgXgorNTcgMSAxMCAxMCA4IDQgMiA0IDE3IDQgMTEgMTcgMjYgMjMgMjQgNCA1IDEyIDUgMSA2IDkgNiA4IDI3IDUgMTEgMTEgMjQgMjQgMTMgCisxNyAyIDI0IDI2IDE5IDExIDIyIDIxIDIgMiAxNCAyMSAxMyAxIDIzIDEwIDI1IDggMTUgMjYgMTkgMjMgMiA5IDI2IDYgMjMgMjIgXgorNTIgMSA1IDI0IDEyIDIxIDExIDE0IDQgMTIgMTAgMTIgMjIgNCAzIDIwIDE3IDEwIDEzIDE2IDkgMTAgMjcgOSAxMiAxMyAyMCAxMCAxMiAKKzIzIDIzIDExIDE5IDEzIDI1IDIyIDggMSA1IDE2IDIwIDkgMTkgOSAyNCAyMCAxMiAxNSA2IDIxIDI3IDIyIDI2IDE2IF4KKzU4IDAgMTggOSAxNSA4IDIyIDI0IDkgMjcgMjMgMSAxMyAxOCAyNCAxIDggMjQgOCA2IDE0IDEgNCA1IDE1IDI3IDEyIDIwIDEgMTcgNSAKKzQgMTQgMjUgMTQgMyAxOSAyNCAyNCAxNCA4IDEzIDEyIDE5IDggMyA2IDEzIDcgMTAgMjMgMTkgMTAgMTcgMTcgMTEgNiAxMyA4IDIyIF4KKzU1IDAgNiA3IDMgMjUgMSAxNyA4IDI2IDI1IDExIDIzIDE0IDI3IDEgMjIgMTEgOSA3IDE5IDQgMTUgMTggMiAyNyAyMCAxMSA1IDIwIAorMjIgMTkgMTUgNSA2IDE3IDggMSAxOSAyMiA5IDIzIDEwIDI2IDI3IDI2IDE0IDEyIDMgMTQgMTUgMTEgMiAxMiA2IDIyIDE2IF4KKzUzIDAgOCAyNSA0IDI1IDI0IDIzIDIwIDMgMyAxNiAyIDIgMjcgMiAxNSAxNCAyNyAzIDE3IDEyIDI3IDI3IDcgMjYgMiAyMiAxMSA5IAorMTAgMjQgMTUgMSAyNyAxMSAyNyA0IDEgMjUgMjUgMTYgNiAyIDIyIDEyIDE3IDIxIDEyIDggOSAyMiAxNyAxMiAxOCBeCis1NCAwIDcgMTggMTQgMjMgMiA2IDQgMjMgOSA0IDIyIDE2IDE4IDIzIDggMTEgMjUgMTcgMjcgMTYgMTAgMyAyNCA4IDIwIDIwIDE4IDE4IAorMTMgNCAyIDE4IDIyIDE1IDI1IDI2IDkgMyAxIDIgMTkgMTUgMSAyNCAxNyAxNiAxOCA5IDE0IDExIDggMTYgMTkgMjcgXgorNTIgMCAyMiAxMCAxNiAyNCAyNSA3IDIyIDEyIDIwIDE1IDIzIDIyIDE4IDIyIDE0IDYgMjYgMjEgMTAgMjEgNyAxMyAyIDE2IDcgMjQgCisxNiAyMiAxMyAxMCA3IDExIDE2IDUgOSAyNSAxMyA5IDE0IDE0IDE3IDI1IDIgMTAgNSAyNSA1IDcgMTAgMjIgMTAgMjIgXgorNTQgMSAyNCAzIDExIDcgMjMgNSAxNyAxNCAzIDE4IDUgMTMgMjYgMTUgNSAxMyAyMyAxOCAxNyAzIDE4IDMgMjcgMTUgNiAyNSAyNCAyMiAKKzI3IDE3IDQgMjUgMjMgMTUgOSAxNSAyMSA4IDcgNyAxNSAzIDEzIDIyIDI1IDMgNCAxMCAyNCAxMiA3IDE2IDI1IDEwIF4KKzU2IDAgMjEgMjEgMjAgMjcgMTMgMTQgMjMgMjcgMSAyMSA5IDIxIDE0IDIyIDkgOSA1IDE1IDEzIDE3IDMgNCA5IDE2IDEgOCAyMyAxNyAKKzIzIDI2IDggMjQgMTAgMjAgMjUgMjcgMyA4IDI2IDggMTAgNCAzIDggMTQgNSA1IDcgMTEgMTMgMTEgMjYgMTEgNCAyNiAyIF4KKzYxIDEgMjAgMTkgMTEgMTAgMyAxMCAxNCA5IDYgOSA3IDE2IDEwIDQgNCAxOSAxOSAyIDI2IDEzIDE5IDE3IDE1IDI0IDE1IDQgMjEgMjIgCisxMyAxMyAxMiAyMiAyIDE0IDIwIDUgMTggNyAxNyAyNCAyMCAxMyA2IDE3IDkgMjAgMiAxMCAxOSAzIDIyIDQgMSAxMSAzIDUgMyAyMSAKKzExIDE1IDIyIF4KKzUzIDAgMjMgMjYgNSAyIDI3IDYgNSAxNiA2IDMgMiAyMyA1IDMgMjAgMjAgNCAyNCAyIDE4IDIxIDcgMTQgMTAgMjcgMjMgNiAyNCA2IAorMTkgMjMgMyA5IDIyIDE2IDIxIDE3IDE5IDI1IDE3IDcgMjEgMTkgNiAxNiAxNSAxNSAyMCAxNCAyIDI1IDE5IDI1IF4KKzYwIDAgMTggMTkgNyA5IDEgMTQgMTEgMTAgMTYgMyAyMyAxNCAyNiAxMCAxMSAxIDE4IDEgMTIgMjQgMTkgMTkgMSA3IDIgMyAyNCA3IAorMTIgOSAyIDggMTYgMjAgMjQgNSAyNiAyNiA0IDkgMiA3IDI1IDkgOCAxMiAxOCAxNCAyNiA3IDE3IDE4IDQgMjAgMSAxNiAxNCAyMSAyNiAKKzE4IF4KKzU0IDAgNiA4IDI0IDExIDI1IDE1IDI0IDE2IDIzIDQgMTAgMjMgMjEgMjQgMTUgMTAgOSAyNiA3IDE0IDI0IDIxIDYgMjAgNSAxNyAxNiAKKzE3IDEgMyAxMiAxIDQgMTMgMyA5IDIxIDIzIDcgMTggMTEgMSAxOSAyMCAyMyAxMiAxMiAyNyAxMyAxMyAxNSAxNiAxMyAyNCBeCis1NyAwIDEgMTYgMTUgMTIgMjYgMyAxNiAxNiA4IDE3IDEzIDIxIDQgNiA1IDE5IDE0IDE2IDQgMTYgMTEgMTQgMTggMTggMjcgOSAxMyAKKzIxIDMgMjYgMjIgMyA3IDYgNCAyNiAzIDE1IDggMjUgMSAyMCAxMyA5IDExIDIwIDYgMTEgMjEgMjcgMjUgMjAgNyA0IDE4IDI2IDEwIF4KKzQ4IDAgMjcgNSAxMiAxOSA3IDIzIDYgMjUgMjUgMiAxMSAxMyAyNSAyMSAxOCAxNyA2IDEyIDE0IDEzIDI0IDExIDE0IDE5IDI2IDI3IAorMjUgNiAxIDE1IDQgNyAyNyAyNCAyNyAyMSA1IDI3IDE5IDE4IDggMjEgMyAyMyAyMCAyMSAyNSA4IF4KKzYwIDEgMSA5IDE3IDIyIDUgMjIgOCAyIDEzIDI3IDggMTkgMjcgMjEgMiA1IDggNCAyNyAxMCA2IDE4IDIgNiAxIDEgMjYgMTggMTMgNSAKKzEwIDE4IDEwIDggNSAyMSAxNSA1IDE0IDE5IDEyIDQgOCAyMCAyMSAyNiAxIDEyIDI1IDEwIDIgMTcgMTAgMTUgMiAyMCAyNSAyNiAyMyAKKzIxIF4KKzU0IDEgMTIgMTYgMTUgOSAxOCAxNSAxOSAyMSAxNiAyNiAxMSAxOCAyMCA2IDIyIDcgOCA4IDEyIDIgMjEgMTggMTIgMTEgNSAxOSAzIAorMTkgMjcgMTggMjUgMjIgMjIgMjMgMTYgMiAxIDIwIDE2IDE0IDIyIDYgMTUgMjIgMSAyMSA2IDYgMTAgMiAyNiAxMiAxMSAyNCBeCis2MCAwIDI3IDE0IDcgMjAgMjYgMjAgMTcgNyAxOSA1IDIzIDE4IDE2IDEyIDcgMTUgMTcgNyA1IDExIDEyIDE1IDcgMSAxMCAxMCA4IDQgCisyIDQgMTcgNCAxMSAxNyAyNiAyMyAyNCA0IDUgMTIgNSAxIDYgOSA2IDggMjcgNSAxMSAxMSAyNCAyNCAxMyAxNyAyIDI0IDI2IDE5IDExIAorMjIgXgorNTUgMCAyMSAyIDIgMTQgMjEgMTMgMSAyMyAxMCAyNSA4IDE1IDI2IDE5IDIzIDIgOSAyNiA2IDIzIDEzIDUgMjQgMTIgMjEgMTEgMTQgNCAKKzEyIDEwIDEyIDIyIDQgMyAyMCAxNyAxMCAxMyAxNiA5IDEwIDI3IDkgMTIgMTMgMjAgMTAgMTIgMjMgMjMgMTEgMTkgMTMgMjUgMTMgXgorNTUgMCA4IDEgNSAxNiAyMCA5IDE5IDkgMjQgMjAgMTIgMTUgNiAyMSAyNyAyMiAyNiAyNCAxOCA5IDE1IDggMjIgMjQgOSAyNyAyMyAxIAorMTMgMTggMjQgMSA4IDI0IDggNiAxNCAxIDQgNSAxNSAyNyAxMiAyMCAxIDE3IDUgNCAxNCAyNSAxNCAzIDE5IDI0IDE2IF4KKzYwIDAgMTQgOCAxMyAxMiAxOSA4IDMgNiAxMyA3IDEwIDIzIDE5IDEwIDE3IDE3IDExIDYgMTMgOCAxOCA2IDcgMyAyNSAxIDE3IDggMjYgCisyNSAxMSAyMyAxNCAyNyAxIDIyIDExIDkgNyAxOSA0IDE1IDE4IDIgMjcgMjAgMTEgNSAyMCAyMiAxOSAxNSA1IDYgMTcgOCAxIDE5IDIyIAorMTAgXgorNTUgMSAxNSA5IDExIDI2IDE5IDIyIDI3IDIgMjEgOCAyMCAyMyAyNiAxMiAxMCAyMSA5IDE1IDEzIDI1IDcgMjYgMSAxMyA1IDkgMSAzIAorOSAyMSAyMiA3IDEgMjMgMjggMSAyIDggMjIgMTIgMTggMjggNSAxOCAxNCA3IDExIDE3IDIwIDIwIDcgMjEgMTMgOCAyMiBeCis1MiAxIDIxIDIyIDIgMTYgMjAgMTUgMjggOSAzIDIyIDEzIDEwIDIzIDQgMTYgMTEgMTQgMSAxMCA4IDE0IDE0IDE1IDE4IDEzIDEyIDIxIAorMTggMjUgMTUgMjcgMTcgNSAxIDIzIDcgMTcgMjAgMTEgMTQgMTAgNCAyMSAxNyAxOSAyNSAxNyAyMiAxOCAyMSAxOSAxNyBeCis1NyAwIDEwIDE1IDI2IDIwIDggMTMgMTkgNyA4IDE4IDcgMTIgMTQgNiA4IDIyIDIxIDExIDEwIDE0IDIzIDI1IDkgMTUgMjIgMTggNiAKKzE3IDI0IDcgMTMgNiAxMiA3IDIgMTggMTggMjYgMTMgMTMgMTYgOCAyNCAxMCAzIDI2IDkgMjAgMSAxMiAyIDE0IDEzIDIzIDEyIDI1IDUgCiteCis1NyAwIDI0IDExIDYgMyA4IDI3IDggMjEgMjYgMyAxMSAxOSAxOCA1IDUgMjUgMjYgMjQgNCAyMyAxNSAxNSAyMyAyMSAyNCA1IDE1IDIxIAorMyAzIDE4IDIgMjQgMjcgMTEgMjAgMTAgMTEgNCA1IDEyIDIgMjMgNiA1IDMgMSAxNCAyNiAxNSAxMiA2IDI4IDEyIDE5IDIwIDkgXgorNTUgMCA2IDIzIDQgNyA3IDMgMTAgMjQgMjggNiAxMCA5IDYgMjAgMTQgMjcgMTAgMTkgMTEgMSAxNSAyMSA1IDEwIDcgMTEgOCAxNiA5IAorMjcgNSAyIDYgNiAyNyAyMCAyNCAyMSAyIDIwIDE2IDE0IDI0IDE3IDE1IDMgMiAyNiAyNSAyNSAxNCAyNCAyMCAyOCAyOCBeCis1OSAxIDE3IDUgOSAxMCAyNSAyMCAxMiA5IDE4IDMgMTYgNCAxMCA3IDE4IDIzIDE3IDIgOCAxIDI4IDcgMiAxNSA1IDE4IDExIDIzIDIgCisxIDE4IDIyIDE0IDcgMjAgMjEgMiAxMSAxMiAzIDE1IDEyIDQgMSAyNyAyMSAxNiAyNyAxOSAxOCAxMyAyMSAxNCA1IDIwIDkgMTkgMjcgCisyNSBeCis1NSAwIDMgNSAxNiAxNiAyMiAyIDEzIDcgNCAxMyAxOSAyNyAxNSA3IDE2IDI1IDMgNCA0IDE3IDEyIDEzIDExIDEyIDI2IDYgMSAxMCAKKzE1IDE4IDQgMTkgMTAgMjcgOSA0IDI1IDEzIDIxIDI1IDI2IDIxIDIwIDEyIDI1IDIxIDcgMTcgMjggMjcgMyAxMyAxNCAxOSAxOCBeCis1MyAxIDIzIDE5IDQgMjggMyAyMCAxOCA5IDcgMTUgNCAyNiA1IDYgMjAgNSAyMyAyOCAxMCAyNCAxOSAxMyAyOCAxIDkgMTIgMjMgMTYgCisxMCAxMyAyIDE5IDIxIDYgMjUgMjIgMjggMjMgMTYgNyAyMCA0IDIgMjIgMTEgMjYgMjIgNiA5IDE3IDExIDIxIDEwIF4KKzQ3IDAgMSAzIDI4IDExIDI3IDI1IDEyIDggMjYgMjYgMjggMjQgMTMgMjIgMTcgNiA0IDI0IDE1IDE3IDE4IDQgMjIgMjMgOSAyNCAxMiAKKzI3IDI3IDI1IDkgMTMgMTUgMTEgOSAyMiAyOCAyNiAxMSAxOCAxNSAxMCA2IDE2IDE3IDE0IDI0IF4KKzU1IDEgMjUgMjcgMTYgMjggMjIgMjQgMSAxIDExIDcgMjQgMyAyOCA3IDUgMjggMTYgMTUgMSA3IDE0IDkgNyA2IDE1IDI1IDE5IDkgMyAKKzE5IDIzIDEgMjYgMjAgMTcgMTcgMSAxNiAyNCA5IDE2IDggMTUgNiAyMSAxNyAyMiA5IDI4IDggOCA1IDQgMjQgMjYgXgorNDcgMSAxNCA0IDIxIDI2IDIzIDcgOCAyNyAyMyAyMyAyMiAxOSAyNCAyNSAxNiAxOSAxMiAyMiAxMCAyMCAzIDcgMTQgMSAyMCA2IDI2IAorMjMgMjcgNCAxNiAyMCAxOCAxMiAyMCAxNSAxOSAxNiAxOCAyMCAyNyAxMSAxMSAxNyAyNCAxOCAxNiBeCis1MCAwIDE5IDEgMjUgMjMgMiAxNSAxNiAyNiAyNyAyMyAxNCAxMiAyOCAyMiAxNSA4IDE5IDIgMjAgMTMgMSAyNCAyIDI1IDEgNiAxOSAKKzE5IDggMTEgMjQgMjQgMjEgMTMgMjcgNSAxMSAyOCAxNyA3IDI1IDYgMjMgMjQgMTQgMjUgMTIgNSAxMyAyNSBeCis2MCAwIDIgNSA4IDEwIDE2IDExIDUgMjYgMTggMTkgMjEgMyAxMiAxMSAxMyA0IDE0IDIyIDIyIDE0IDE2IDEzIDMgMjIgMTYgMjMgNSAKKzE5IDYgMTMgMTAgMjYgMTcgMjcgMjYgNCAzIDI1IDYgMTQgMiAzIDUgNyAyMyAxMSAyMiA4IDI1IDIgOSAyNSAxOCAxNyA4IDIgMTQgNCAKKzE5IDIyIF4KKzU0IDEgNSAyNyAxMyA5IDIgMjcgMjggMiAxNyAyMyAxMCAyNyAxOCAyNiA3IDIyIDE2IDMgMjcgMSAyNiAyMSAyOCAxMCAzIDYgMiAyIAorMTAgMTcgMTMgMTYgNiAxNyAyMSAyMyAxMyAyMCAyMiA1IDYgMTEgMTIgMTIgOCAyMyAxMyAxNyA5IDIzIDIwIDMgMjggMjEgXgorNTYgMCAxMiAxNyAyNSAyOCAxOSA1IDIxIDQgMjcgOCAxIDE5IDE0IDIwIDYgNyA5IDEgNiAyMiAzIDE5IDI2IDE0IDggNiA3IDE5IDE1IAorMjMgMSAxNyAxNiA2IDI2IDE0IDUgMjIgMjUgNCA3IDEwIDE2IDIxIDEwIDE4IDE5IDI0IDE2IDIzIDggMyAxNyAyOCAxOCAxMyBeCis1OCAwIDIgNSAzIDIxIDIxIDE1IDYgMjQgMSA0IDI0IDE4IDEwIDIyIDEgMjEgMTIgNSA0IDQgMjAgMjUgMjQgMjYgOCAyNSAxMSAyIDcgCisyNyAyMiAxOSA0IDE4IDI3IDEwIDI4IDQgMTIgMjQgOCAxNiAxMiAxMSAxNiAxNyAyNSA4IDEyIDE2IDEgOSA5IDEwIDUgMjQgMjMgMTEgXgorNjIgMSA1IDE0IDE4IDggNCA5IDUgMTcgOCAyOCAxIDIyIDQgMTEgMyAyIDE3IDMgMTQgOSAyNyAxMyAxOCAyNCA5IDggNyAyOCAyNSAxNCAKKzIxIDI3IDI0IDYgMTggMTYgMiAxMiAxNSA5IDE0IDEwIDEgOCAxNyA0IDYgMTUgMjYgMTEgMTUgMiAyOCAyMCAyNiAxNiAzIDcgNSA4IDkgCisyNCBeCis1MCAxIDEwIDEyIDI1IDExIDkgMTMgMjQgMTUgMjAgMiA0IDggMiAyMiAyMCAxOSA0IDE1IDE0IDI4IDEzIDI1IDEwIDEwIDEyIDI4IDI0IAorMjIgMjYgMjggMTUgOSAxMSAyNiAxOSAyMiAyNyAyIDIxIDggMjAgMjMgMjYgMTIgMTAgMjEgOSAxNSAxMyAxNyBeCis2MCAxIDcgMjYgMSAxMyA1IDkgMSAzIDkgMjEgMjIgNyAxIDIzIDI4IDEgMiA4IDIyIDEyIDE4IDI4IDUgMTggMTQgNyAxMSAxNyAyMCAKKzIwIDcgMjEgMTMgOCAyOCAyMSAyMiAyIDE2IDIwIDE1IDI4IDkgMyAyMiAxMyAxMCAyMyA0IDE2IDExIDE0IDEgMTAgOCAxNCAxNCAxNSAKKzE4IDE3IF4KKzUyIDAgMTIgMjEgMTggMjUgMTUgMjcgMTcgNSAxIDIzIDcgMTcgMjAgMTEgMTQgMTAgNCAyMSAxNyAxOSAyNSAxNyAyMiAxOCAyMSAxOSAKKzE3IDEwIDE1IDI2IDIwIDggMTMgMTkgNyA4IDE4IDcgMTIgMTQgNiA4IDIyIDIxIDExIDEwIDE0IDIzIDI1IDkgMTUgMTkgXgorNTcgMSAxOCA2IDE3IDI0IDcgMTMgNiAxMiA3IDIgMTggMTggMjYgMTMgMTMgMTYgOCAyNCAxMCAzIDI2IDkgMjAgMSAxMiAyIDE0IDEzIAorMjMgMTIgMjUgMyAyNCAxMSA2IDMgOCAyNyA4IDIxIDI2IDMgMTEgMTkgMTggNSA1IDI1IDI2IDI0IDQgMjMgMTUgMTUgMjMgMjEgMTIgXgorNjcgMSA1IDE1IDIxIDMgMyAxOCAyIDI0IDI3IDExIDIwIDEwIDExIDQgNSAxMiAyIDIzIDYgNSAzIDEgMTQgMjYgMTUgMTIgNiAyOCAxMiAKKzE5IDIwIDYgMjMgNCA3IDcgMyAxMCAyNCAyOCA2IDEwIDkgNiAyMCAxNCAyNyAxMCAxOSAxMSAxIDE1IDIxIDUgMTAgNyAxMSA4IDE2IDkgCisyNyA1IDIgNiA2IDI3IDIgXgorNTYgMSAyNCAyMSAyIDIwIDE2IDE0IDI0IDE3IDE1IDMgMiAyNiAyNSAyNSAxNCAyNCAyMCAyOCAxNCAxNyA1IDkgMTAgMjUgMjAgMTIgOSAKKzE4IDMgMTYgNCAxMCA3IDE4IDIzIDE3IDIgOCAxIDI4IDcgMiAxNSA1IDE4IDExIDIzIDIgMSAxOCAyMiAxNCA3IDIwIDIxIDI0IF4KKzYwIDEgMTEgMTIgMyAxNSAxMiA0IDEgMjcgMjEgMTYgMjcgMTkgMTggMTMgMjEgMTQgNSAyMCA5IDE5IDI3IDYgMyA1IDE2IDE2IDIyIDIgCisxMyA3IDQgMTMgMTkgMjcgMTUgNyAxNiAyNSAzIDQgNCAxNyAxMiAxMyAxMSAxMiAyNiA2IDEgMTAgMTUgMTggNCAxOSAxMCAyNyA5IDQgCisyNSAyNyBeCis1MSAwIDIxIDI1IDI2IDIxIDIwIDEyIDI1IDIxIDcgMTcgMjggMjcgMyAxMyAxNCAxOSAzIDIzIDE5IDQgMjggMyAyMCAxOCA5IDcgMTUgCis0IDI2IDUgNiAyMCA1IDIzIDI4IDEwIDI0IDE5IDEzIDI4IDEgOSAxMiAyMyAxNiAxMCAxMyAyIDE5IDIxIDIzIF4KKzQ5IDEgMjUgMjIgMjggMjMgMTYgNyAyMCA0IDIgMjIgMTEgMjYgMjIgNiA5IDE3IDExIDIxIDUgMSAzIDI4IDExIDI3IDI1IDEyIDggMjYgCisyNiAyOCAyNCAxMyAyMiAxNyA2IDQgMjQgMTUgMTcgMTggNCAyMiAyMyA5IDI0IDEyIDI3IDI3IDkgXgorNTYgMCA5IDEzIDE1IDExIDkgMjIgMjggMjYgMTEgMTggMTUgMTAgNiAxNiAxNyAxNCAxMSAyNSAyNyAxNiAyOCAyMiAyNCAxIDEgMTEgNyAKKzI0IDMgMjggNyA1IDI4IDE2IDE1IDEgNyAxNCA5IDcgNiAxNSAyNSAxOSA5IDMgMTkgMjMgMSAyNiAyMCAxNyAxNyAxIDE2IDE2IF4KKzUxIDAgOSAxNiA4IDE1IDYgMjEgMTcgMjIgOSAyOCA4IDggNSA0IDI0IDI3IDE0IDQgMjEgMjYgMjMgNyA4IDI3IDIzIDIzIDIyIDE5IAorMjQgMjUgMTYgMTkgMTIgMjIgMTAgMjAgMyA3IDE0IDEgMjAgNiAyNiAyMyAyNyA0IDE2IDIwIDE4IDEyIDIyIF4KKzUxIDAgMTUgMTkgMTYgMTggMjAgMjcgMTEgMTEgMTcgMjQgMTggMSAxOSAxIDI1IDIzIDIgMTUgMTYgMjYgMjcgMjMgMTQgMTIgMjggMjIgCisxNSA4IDE5IDIgMjAgMTMgMSAyNCAyIDI1IDEgNiAxOSAxOSA4IDExIDI0IDI0IDIxIDEzIDI3IDUgMTEgMjggMTYgXgorNTkgMCA3IDI1IDYgMjMgMjQgMTQgMjUgMTIgNSAxMyAyNiAyIDUgOCAxMCAxNiAxMSA1IDI2IDE4IDE5IDIxIDMgMTIgMTEgMTMgNCAxNCAKKzIyIDIyIDE0IDE2IDEzIDMgMjIgMTYgMjMgNSAxOSA2IDEzIDEwIDI2IDE3IDI3IDI2IDQgMyAyNSA2IDE0IDIgMyA1IDcgMjMgMTEgMjIgCisxMCBeCis1OSAwIDI1IDIgOSAyNSAxOCAxNyA4IDIgMTQgNCAxOSAxIDUgMjcgMTMgOSAyIDI3IDI4IDIgMTcgMjMgMTAgMjcgMTggMjYgNyAyMiAKKzE2IDMgMjcgMSAyNiAyMSAyOCAxMCAzIDYgMiAyIDEwIDE3IDEzIDE2IDYgMTcgMjEgMjMgMTMgMjAgMjIgNSA2IDExIDEyIDEyIDggMjMgCis3IF4KKzU2IDEgMTcgOSAyMyAyMCAzIDI4IDI3IDEyIDE3IDI1IDI4IDE5IDUgMjEgNCAyNyA4IDEgMTkgMTQgMjAgNiA3IDkgMSA2IDIyIDMgMTkgCisyNiAxNCA4IDYgNyAxOSAxNSAyMyAxIDE3IDE2IDYgMjYgMTQgNSAyMiAyNSA0IDcgMTAgMTYgMjEgMTAgMTggMTkgMjQgMTYgXgorNTcgMSAyMyA4IDMgMTcgMjggMTggMTAgMiA1IDMgMjEgMjEgMTUgNiAyNCAxIDQgMjQgMTggMTAgMjIgMSAyMSAxMiA1IDQgNCAyMCAyNSAKKzI0IDI2IDggMjUgMTEgMiA3IDI3IDIyIDE5IDQgMTggMjcgMTAgMjggNCAxMiAyNCA4IDE2IDEyIDExIDE2IDE3IDI1IDggMTIgMTggXgorNjMgMCAxIDkgOSAxMCA1IDI0IDIzIDE4IDUgMTQgMTggOCA0IDkgNSAxNyA4IDI4IDEgMjIgNCAxMSAzIDIgMTcgMyAxNCA5IDI3IDEzIAorMTggMjQgOSA4IDcgMjggMjUgMTQgMjEgMjcgMjQgNiAxOCAxNiAyIDEyIDE1IDkgMTQgMTAgMSA4IDE3IDQgNiAxNSAyNiAxMSAxNSAyIAorMjggMjAgMTYgXgorNTIgMSAxNiAzIDcgNSA4IDkgMjYgMTAgMTIgMjUgMTEgOSAxMyAyNCAxNSAyMCAyIDQgOCAyIDIyIDIwIDE5IDQgMTUgMTQgMjggMTMgCisyNSAxMCAxMCAxMiAyOCAyNCAyMiAyNiAyOCAxNSA5IDExIDI2IDE5IDIyIDI3IDIgMjEgOCAyMCAyMyAyNiAxMiAyOCBeCis2MCAwIDIxIDkgMTUgMTMgMjUgNyAyNiAxIDEzIDUgOSAxIDMgOSAyMSAyMiA3IDEgMjMgMjggMSAyIDggMjIgMTIgMTggMjggNSAxOCAKKzE0IDcgMTEgMTcgMjAgMjAgNyAyMSAxMyA4IDI4IDIxIDIyIDIgMTYgMjAgMTUgMjggOSAzIDIyIDEzIDEwIDIzIDQgMTYgMTEgMTQgMSAKKzEwIDIwIF4KKzU0IDEgMTQgMTQgMTUgMTggMTMgMTIgMjEgMTggMjUgMTUgMjcgMTcgNSAxIDIzIDcgMTcgMjAgMTEgMTQgMTAgNCAyMSAxNyAxOSAyNSAKKzE3IDIyIDE4IDIxIDE5IDE3IDEwIDE1IDI2IDIwIDggMTMgMTkgNyA4IDE4IDcgMTIgMTQgNiA4IDIyIDIxIDExIDEwIDE0IDIzIDExIF4KKzU4IDAgOSAxNSAyMiAxOCA2IDE3IDI0IDcgMTMgNiAxMiA3IDIgMTggMTggMjYgMTMgMTMgMTYgOCAyNCAxMCAzIDI2IDkgMjAgMSAxMiAKKzIgMTQgMTMgMjMgMTIgMjUgMyAyNCAxMSA2IDMgOCAyNyA4IDIxIDI2IDMgMTEgMTkgMTggNSA1IDI1IDI2IDI0IDQgMjMgMTUgMTUgMjcgCiteCis2NCAxIDIxIDI0IDUgMTUgMjEgMyAzIDE4IDIgMjQgMjcgMTEgMjAgMTAgMTEgNCA1IDEyIDIgMjMgNiA1IDMgMSAxNCAyNiAxNSAxMiA2IAorMjggMTIgMTkgMjAgNiAyMyA0IDcgNyAzIDEwIDI0IDI4IDYgMTAgOSA2IDIwIDE0IDI3IDEwIDE5IDExIDEgMTUgMjEgNSAxMCA3IDExIAorOCAxNiA5IDI3IDIwIF4KKzU4IDEgMiA2IDYgMjcgMjAgMjQgMjEgMiAyMCAxNiAxNCAyNCAxNyAxNSAzIDIgMjYgMjUgMjUgMTQgMjQgMjAgMjggMTQgMTcgNSA5IAorMTAgMjUgMjAgMTIgOSAxOCAzIDE2IDQgMTAgNyAxOCAyMyAxNyAyIDggMSAyOCA3IDIgMTUgNSAxOCAxMSAyMyAyIDEgMTggMjIgMTQgCisyOCBeCis2MiAwIDIwIDIxIDIgMTEgMTIgMyAxNSAxMiA0IDEgMjcgMjEgMTYgMjcgMTkgMTggMTMgMjEgMTQgNSAyMCA5IDE5IDI3IDYgMyA1IDE2IAorMTYgMjIgMiAxMyA3IDQgMTMgMTkgMjcgMTUgNyAxNiAyNSAzIDQgNCAxNyAxMiAxMyAxMSAxMiAyNiA2IDEgMTAgMTUgMTggNCAxOSAxMCAKKzI3IDkgNCAyNiBeCis1MiAwIDEzIDIxIDI1IDI2IDIxIDIwIDEyIDI1IDIxIDcgMTcgMjggMjcgMyAxMyAxNCAxOSAzIDIzIDE5IDQgMjggMyAyMCAxOCA5IDcgCisxNSA0IDI2IDUgNiAyMCA1IDIzIDI4IDEwIDI0IDE5IDEzIDI4IDEgOSAxMiAyMyAxNiAxMCAxMyAyIDE5IDIxIDI3IF4KKzQ5IDEgMjUgMjIgMjggMjMgMTYgNyAyMCA0IDIgMjIgMTEgMjYgMjIgNiA5IDE3IDExIDIxIDUgMSAzIDI4IDExIDI3IDI1IDEyIDggMjYgCisyNiAyOCAyNCAxMyAyMiAxNyA2IDQgMjQgMTUgMTcgMTggNCAyMiAyMyA5IDI0IDEyIDI3IDI3IDI2IF4KKzU3IDAgOSAxMyAxNSAxMSA5IDIyIDI4IDI2IDExIDE4IDE1IDEwIDYgMTYgMTcgMTQgMTEgMjUgMjcgMTYgMjggMjIgMjQgMSAxIDExIDcgCisyNCAzIDI4IDcgNSAyOCAxNiAxNSAxIDcgMTQgOSA3IDYgMTUgMjUgMTkgOSAzIDE5IDIzIDEgMjYgMjAgMTcgMTcgMSAxNiAyNCA5IF4KKzUyIDEgOSAxNiA4IDE1IDYgMjEgMTcgMjIgOSAyOCA4IDggNSA0IDI0IDI3IDE0IDQgMjEgMjYgMjMgNyA4IDI3IDIzIDIzIDIyIDE5IAorMjQgMjUgMTYgMTkgMTIgMjIgMTAgMjAgMyA3IDE0IDEgMjAgNiAyNiAyMyAyNyA0IDE2IDIwIDE4IDEyIDIwIDE5IF4KKzUyIDEgMTkgMTYgMTggMjAgMjcgMTEgMTEgMTcgMjQgMTggMSAxOSAxIDI1IDIzIDIgMTUgMTYgMjYgMjcgMjMgMTQgMTIgMjggMjIgMTUgCis4IDE5IDIgMjAgMTMgMSAyNCAyIDI1IDEgNiAxOSAxOSA4IDExIDI0IDI0IDIxIDEzIDI3IDUgMTEgMjggMTcgNyAyNCBeCis1OSAwIDYgMjMgMjQgMTQgMjUgMTIgNSAxMyAyNiAyIDUgOCAxMCAxNiAxMSA1IDI2IDE4IDE5IDIxIDMgMTIgMTEgMTMgNCAxNCAyMiAKKzIyIDE0IDE2IDEzIDMgMjIgMTYgMjMgNSAxOSA2IDEzIDEwIDI2IDE3IDI3IDI2IDQgMyAyNSA2IDE0IDIgMyA1IDcgMjMgMTEgMjIgOCAKKzI1IDI2IF4KKzU5IDAgOSAyNSAxOCAxNyA4IDIgMTQgNCAxOSAxIDUgMjcgMTMgOSAyIDI3IDI4IDIgMTcgMjMgMTAgMjcgMTggMjYgNyAyMiAxNiAzIAorMjcgMSAyNiAyMSAyOCAxMCAzIDYgMiAyIDEwIDE3IDEzIDE2IDYgMTcgMjEgMjMgMTMgMjAgMjIgNSA2IDExIDEyIDEyIDggMjMgMTMgCisxNyAyMSBeCis1NiAxIDIzIDIwIDMgMjggMjcgMTIgMTcgMjUgMjggMTkgNSAyMSA0IDI3IDggMSAxOSAxNCAyMCA2IDcgOSAxIDYgMjIgMyAxOSAyNiAKKzE0IDggNiA3IDE5IDE1IDIzIDEgMTcgMTYgNiAyNiAxNCA1IDIyIDI1IDQgNyAxMCAxNiAyMSAxMCAxOCAxOSAyNCAxNiAyMyAyMCBeCis2MCAwIDMgMTcgMjggMTggMTAgMiA1IDMgMjEgMjEgMTUgNiAyNCAxIDQgMjQgMTggMTAgMjIgMSAyMSAxMiA1IDQgNCAyMCAyNSAyNCAKKzI2IDggMjUgMTEgMiA3IDI3IDIyIDE5IDQgMTggMjcgMTAgMjggNCAxMiAyNCA4IDE2IDEyIDExIDE2IDE3IDI1IDggMTIgMTYgMSA5IDkgCisxMCAyMSBeCis2MCAwIDI0IDIzIDE4IDUgMTQgMTggOCA0IDkgNSAxNyA4IDI4IDEgMjIgNCAxMSAzIDIgMTcgMyAxNCA5IDI3IDEzIDE4IDI0IDkgOCA3IAorMjggMjUgMTQgMjEgMjcgMjQgNiAxOCAxNiAyIDEyIDE1IDkgMTQgMTAgMSA4IDE3IDQgNiAxNSAyNiAxMSAxNSAyIDI4IDIwIDI2IDE2IAorMjUgXgorNTMgMSA3IDUgOCA5IDI2IDEwIDEyIDI1IDExIDkgMTMgMjQgMTUgMjAgMiA0IDggMiAyMiAyMCAxOSA0IDE1IDE0IDI4IDEzIDI1IDEwIAorMTAgMTIgMjggMjQgMjIgMjYgMjggMTUgOSAxMSAyNiAxOSAyMiAyNyAyIDIxIDggMjAgMjMgMjYgMTIgMTAgMjEgOSAyNCBeCis2MiAxIDEzIDI1IDcgMjYgMSAxMyA1IDkgMSAzIDkgMjEgMjIgNyAxIDIzIDI4IDEgMiA4IDIyIDEyIDE4IDI4IDUgMTggMTQgNyAxMSAKKzE3IDIwIDIwIDcgMjEgMTMgOCAyOCAyMSAyMiAyIDE2IDIwIDE1IDI4IDkgMyAyMiAxMyAxMCAyMyA0IDE2IDExIDE0IDEgMTAgOCAxNCAKKzE0IDE1IDE4IDEzIF4KKzU0IDAgMTIgMjEgMTggMjUgMTUgMjcgMTcgNSAxIDIzIDcgMTcgMjAgMTEgMTQgMTAgNCAyMSAxNyAxOSAyNSAxNyAyMiAxOCAyMSAxOSAKKzE3IDEwIDE1IDI2IDIwIDggMTMgMTkgNyA4IDE4IDcgMTIgMTQgNiA4IDIyIDIxIDExIDEwIDE0IDIzIDI1IDkgMTUgMjIgMTggMTMgXgorNTggMCAxNyAyNCA3IDEzIDYgMTIgNyAyIDE4IDE4IDI2IDEzIDEzIDE2IDggMjQgMTAgMyAyNiA5IDIwIDEgMTIgMiAxNCAxMyAyMyAxMiAKKzI1IDMgMjQgMTEgNiAzIDggMjcgOCAyMSAyNiAzIDExIDE5IDE4IDUgNSAyNSAyNiAyNCA0IDIzIDE1IDE1IDIzIDIxIDI0IDUgMTUgMjYgCiteCis2NyAxIDMgMyAxOCAyIDI0IDI3IDExIDIwIDEwIDExIDQgNSAxMiAyIDIzIDYgNSAzIDEgMTQgMjYgMTUgMTIgNiAyOCAxMiAxOSAyMCA2IAorMjMgNCA3IDcgMyAxMCAyNCAyOCA2IDEwIDkgNiAyMCAxNCAyNyAxMCAxOSAxMSAxIDE1IDIxIDUgMTAgNyAxMSA4IDE2IDkgMjcgNSAyIAorNiA2IDI3IDIwIDI0IDIxIDEyIF4KKzYyIDAgMjAgMTYgMTQgMjQgMTcgMTUgMyAyIDI2IDI1IDI1IDE0IDI0IDIwIDI4IDE0IDE3IDUgOSAxMCAyNSAyMCAxMiA5IDE4IDMgMTYgCis0IDEwIDcgMTggMjMgMTcgMiA4IDEgMjggNyAyIDE1IDUgMTggMTEgMjMgMiAxIDE4IDIyIDE0IDcgMjAgMjEgMiAxMSAxMiAzIDE1IDEyIAorNCAxIDI3IDE4IF4KKzYxIDEgNCA5IDE0IDE2IDE1IDggMTEgMjEgMjAgMTAgMTAgMjEgMjMgMjAgMiAxMSAyMyAxIDExIDEgNSAzIDIzIDE2IDE1IDI3IDE0IDUgCisxNiAzIDIyIDIgMyAyNCAzIDE5IDI5IDQgNCAxMCA4IDIwIDE0IDE1IDEgMjYgMTIgMjcgMjUgNCAyOCAyMiAxMSAxOSAxOSAyNCA1IDIwIAorOCA5IDI2IF4KKzU1IDEgMjUgMTkgMTcgMTkgMTUgNyAyNCAyNCAyMSAzIDIwIDE2IDggMyAxNyAyOCAxOCAyOSA5IDIzIDkgMTAgMjkgNCAxMiAyNCAxNSAKKzUgOCAyMiAxNyAyOSAxMiAzIDggMjkgMTUgMjEgMjEgNCA3IDIwIDcgMTAgNyAyNiAxMCAxNiAyNCA2IDcgMTIgOCAxMiAyOCBeCis1MiAxIDI0IDkgMTcgMTEgMjggMTIgMjYgMjYgNiAyOSAxMyAxMCAyMCA2IDIzIDEwIDQgMyAyNiAyNiAxNCAyMCAyMCAyNSAxNCAxMyAKKzE1IDI0IDE0IDExIDQgMjMgMjcgMjQgMjAgOSAxNiAxNyAyNCAxMyAxMiA2IDEgMTQgMjYgMjUgNyA4IDIxIDEgMTkgMjcgXgorNjUgMCAzIDIgMiAxNyAyMSAxMyA1IDkgMjEgMjggOSAxIDEzIDIgMjEgOCAyNCAxIDMgMjcgMTMgMTggMTkgNCAxNSAxMiA1IDIgMTYgCisyNyAxNiA2IDIgMSAyMyAxNyAxNCAyOCAxOSAyMyA2IDIyIDE2IDQgMTkgNiAxNiAyOCAzIDMgMSAxNSAxMyAyMiA2IDE1IDExIDYgNCAKKzI0IDI1IDE1IDE5IDIzIDEyIF4KKzU1IDAgMSA5IDE1IDEwIDEyIDcgMjUgMTEgMjUgMiAyNyA2IDYgMTggNCAxMyAxIDQgMTEgMjUgMTcgNiAyOSAyMSAyNCAyNyAyMSAxNyAKKzE3IDI2IDI0IDEzIDQgMjIgMjQgMjkgMiAxMSA4IDE3IDQgMjMgMTEgMjYgMSAyNSAyOCAxNSAxOSAxMCAzIDkgMjkgMjcgMjQgXgorNTMgMSAyMiAzIDI3IDIxIDIgMjYgMTkgOSAxOSAyNyAyMyAzIDEyIDE3IDEwIDQgOCAyNyAxOSAxNiAxIDIxIDIzIDI4IDIzIDE4IDggCisyNSAxOCAyNiAyMCA4IDE3IDE5IDIgNCAxMSA3IDE4IDYgMjQgMiAyNSAyNSA1IDI3IDIwIDMgMjggMjAgMTggMjEgMTEgXgorNTUgMCAyNSAxMCAxIDI4IDI4IDI5IDE2IDIwIDE5IDI2IDE2IDIxIDYgMjMgMTUgMjggMjYgMjggNyAxNSAxOCAxMSA1IDE3IDIwIDI2IAorMSAxMCAxNCA4IDQgMTYgMjYgMTcgOCAxMCAyMiAyMiAxOCAxIDIwIDI0IDcgMSA5IDcgMTkgNSAyMiAxIDQgMjYgMTEgMTAgMjAgXgorNTggMCA1IDE0IDIgNiA0IDIgOSAyMiAxNSAxMyAyMCAyMiAyNiAxOCAxNiA5IDIgMTUgMjAgMjcgOCA2IDE3IDUgMTUgOSAyNSAxMCAyNiAKKzQgNSAyNyA1IDE5IDIxIDUgNiAxMSAyOSAxOSA4IDIgMjQgMjYgMjIgMTkgMTggMTcgMjMgMTQgMjEgMTQgMjIgMTMgMjAgNSAyOSAxMiBeCis1NCAwIDUgMjYgNiAyMSAyOSAzIDUgMTIgMTYgMTEgMTMgMTYgMTggMTggMTAgMTEgMjAgMjEgMTIgMTEgMTIgMjIgMTQgMTkgMyAyMSAKKzE1IDYgMjUgMjYgMjkgMjQgMTkgMTcgMTggMjUgMjIgMTIgMTMgMjMgMjMgMTIgMTAgMTMgMSAyMiAxMCAyIDIyIDIgMjggMTAgMTcgMjggCiteCis1NiAwIDMgNiAxOSAyOCAxNyAxMSAxIDkgMTQgNCAyOSAyOSAyMyAyNSAxMyAxOSAxOCAyIDcgMjEgNiA4IDI5IDUgMTEgMjIgMTQgMTQgCis5IDI4IDEzIDI1IDI0IDI4IDggMTQgOSAzIDE0IDE4IDI2IDkgOSAxMiAxMyAxNyAyNSAxNiA1IDggNCAyNCAxMCAyNCAyMyAyNSBeCis0OSAwIDI5IDIxIDkgMTggMjggMjUgMTEgMyAxNiA0IDIxIDI1IDMgNCAxOCAxMiAxMiAyOSAyNiAxMyAyNiAyMyAyNiA3IDIzIDEwIDkgCisyNyAyNiAyMSAyNSAyMSAxOCA5IDI0IDE2IDIyIDUgMjEgNyA3IDI3IDQgMjAgMjMgMTMgMjcgMTAgMjcgXgorNTggMSAyOSA3IDE5IDEzIDEzIDggMTkgMjAgMTggMiAxOSAyMiAyOSAzIDEwIDYgOSAxMyAyNCAxNyAxNiA5IDIwIDIxIDI3IDIgMTkgNyAKKzggMjYgMjUgMTIgMiAxNCAzIDEgMSAxNiAxMiAyMCAyOCAyNCAxMiA1IDI0IDI1IDIwIDEgMTIgMjUgOSAyIDYgMjAgMTUgMTQgMjkgMjAgCiteCis1NiAwIDIxIDI4IDEgMTcgNiAxNyAyNyAxIDIgMTAgMTYgMTkgNSAxNCAxMCAyNyAxMSAxNyAzIDI5IDE0IDI3IDE3IDUgMiAxOCAyMCAKKzExIDI3IDE4IDIyIDI3IDIyIDkgOCAxOCAzIDE0IDEwIDUgMiAyNCAxOCAyMyAyMSAyNiA4IDIyIDggMSA2IDI3IDI3IDE1IDI5IDE4IF4KKzY0IDAgMiAyOSAyMiA4IDE2IDIwIDQgMTIgOSA2IDEyIDE2IDE2IDcgOSAyMCAyOSAxMSA5IDQgMSAxNSAyNSAxNiAyOSAxMCAyMiA3IDIgCis4IDUgMTggMTQgMjMgMjQgNCA2IDI2IDMgMTEgNiAxMiAxIDcgMTQgMjQgMTQgNiAxMCAyMSAxNiAyMyAyOSAyNSA2IDE0IDE3IDIgMTIgCisxMCA1IDEwIDE1IDI1IF4KKzYyIDEgOCAxNSAzIDcgMTMgMjUgMTYgMTQgMSAyOSAyMiAyNiAxNSAyNyA5IDEgOCA4IDI4IDYgMTMgNSAxMyAzIDE1IDUgMjMgOCAyMyAKKzIgNSA1IDQgMTcgMTMgMTQgNyAxNyAxMiAyNyAzIDE4IDUgNyA1IDI2IDE4IDE1IDIyIDI4IDE2IDEzIDcgMiAyMyAxOSAyNSAyOSAxNyAKKzcgMTYgMjIgXgorNTUgMSAyMyAxMSAxMSAxNSAyIDEzIDkgMjYgMiAyNCAyNiA3IDI4IDExIDIgMjkgNyAyMiAyMyA1IDI4IDE5IDEgMjcgMjkgMSAyNCAxMSAKKzE4IDIwIDMgMTMgMTEgNyAzIDE1IDE3IDI0IDEgMTggMTMgNiAzIDI1IDI3IDE2IDI4IDE4IDI0IDggMjMgNyAyOSAyOCAxNSBeCis1MiAwIDI4IDE0IDEyIDI4IDI3IDIyIDQgMTQgMjUgMSAzIDkgNyAxMSAxNCAxNSAxNiAxMCAxOSAxMiAxOSAxMSAyMCAxMyAyOCA0IDI3IAorMjggNyAyNyAxMiA0IDI4IDIxIDE3IDIyIDIwIDE3IDE1IDE1IDIzIDIyIDEzIDEyIDIxIDIyIDIxIDExIDEyIDE0IDEyIDI4IF4KKzYyIDAgMjcgOCA3IDQgOSAxNCAxNiAxNSA4IDExIDIxIDIwIDEwIDEwIDIxIDIzIDIwIDIgMTEgMjMgMSAxMSAxIDUgMyAyMyAxNiAxNSAKKzI3IDE0IDUgMTYgMyAyMiAyIDMgMjQgMyAxOSAyOSA0IDQgMTAgOCAyMCAxNCAxNSAxIDI2IDEyIDI3IDI1IDQgMjggMjIgMTEgMTkgMTkgCisyNCA1IDIwIDE4IF4KKzU4IDAgOSA1IDI1IDE5IDE3IDE5IDE1IDcgMjQgMjQgMjEgMyAyMCAxNiA4IDMgMTcgMjggMTggMjkgOSAyMyA5IDEwIDI5IDQgMTIgMjQgCisxNSA1IDggMjIgMTcgMjkgMTIgMyA4IDI5IDE1IDIxIDIxIDQgNyAyMCA3IDEwIDcgMjYgMTAgMTYgMjQgNiA3IDEyIDggMTIgMTUgMTYgXgorNTYgMCA5IDE3IDExIDI4IDEyIDI2IDI2IDYgMjkgMTMgMTAgMjAgNiAyMyAxMCA0IDMgMjYgMjYgMTQgMjAgMjAgMjUgMTQgMTMgMTUgCisyNCAxNCAxMSA0IDIzIDI3IDI0IDIwIDkgMTYgMTcgMjQgMTMgMTIgNiAxIDE0IDI2IDI1IDcgOCAyMSAxIDE5IDMgMiAyIDE3IDIxIDIzIAorXgorNjQgMSA1IDkgMjEgMjggOSAxIDEzIDIgMjEgOCAyNCAxIDMgMjcgMTMgMTggMTkgNCAxNSAxMiA1IDIgMTYgMjcgMTYgNiAyIDEgMjMgCisxNyAxNCAyOCAxOSAyMyA2IDIyIDE2IDQgMTkgNiAxNiAyOCAzIDMgMSAxNSAxMyAyMiA2IDE1IDExIDYgNCAyNCAyNSAxNSAxOSAyMyAKKzI4IDEgOSAxNSAxMCAyNCBeCis1NCAwIDcgMjUgMTEgMjUgMiAyNyA2IDYgMTggNCAxMyAxIDQgMTEgMjUgMTcgNiAyOSAyMSAyNCAyNyAyMSAxNyAxNyAyNiAyNCAxMyA0IAorMjIgMjQgMjkgMiAxMSA4IDE3IDQgMjMgMTEgMjYgMSAyNSAyOCAxNSAxOSAxMCAzIDkgMjkgMjcgNyAyMiAzIDI3IDI5IF4KKzU0IDEgMiAyNiAxOSA5IDE5IDI3IDIzIDMgMTIgMTcgMTAgNCA4IDI3IDE5IDE2IDEgMjEgMjMgMjggMjMgMTggOCAyNSAxOCAyNiAyMCAKKzggMTcgMTkgMiA0IDExIDcgMTggNiAyNCAyIDI1IDI1IDUgMjcgMjAgMyAyOCAyMCAxOCAyMSAxMCAyNSAxMCAxIDI4IDI3IF4KKzYwIDAgMjkgMTYgMjAgMTkgMjYgMTYgMjEgNiAyMyAxNSAyOCAyNiAyOCA3IDE1IDE4IDExIDUgMTcgMjAgMjYgMSAxMCAxNCA4IDQgMTYgCisyNiAxNyA4IDEwIDIyIDIyIDE4IDEgMjAgMjQgNyAxIDkgNyAxOSA1IDIyIDEgNCAyNiAxMSAxMCAyOCA1IDE0IDIgNiA0IDIgOSAyMiAKKzE1IDIyIF4KKzU0IDEgMjAgMjIgMjYgMTggMTYgOSAyIDE1IDIwIDI3IDggNiAxNyA1IDE1IDkgMjUgMTAgMjYgNCA1IDI3IDUgMTkgMjEgNSA2IDExIAorMjkgMTkgOCAyIDI0IDI2IDIyIDE5IDE4IDE3IDIzIDE0IDIxIDE0IDIyIDEzIDIwIDUgMjkgNiA1IDI2IDYgMjEgMjkgMjggXgorNTcgMSA1IDEyIDE2IDExIDEzIDE2IDE4IDE4IDEwIDExIDIwIDIxIDEyIDExIDEyIDIyIDE0IDE5IDMgMjEgMTUgNiAyNSAyNiAyOSAyNCAKKzE5IDE3IDE4IDI1IDIyIDEyIDEzIDIzIDIzIDEyIDEwIDEzIDEgMjIgMTAgMiAyMiAyIDI4IDEwIDE3IDE4IDMgNiAxOSAyOCAxNyAxMSAKKzEgOSAyMyBeCis1NCAwIDE0IDQgMjkgMjkgMjMgMjUgMTMgMTkgMTggMiA3IDIxIDYgOCAyOSA1IDExIDIyIDE0IDE0IDkgMjggMTMgMjUgMjQgMjggOCAKKzE0IDkgMyAxNCAxOCAyNiA5IDkgMTIgMTMgMTcgMjUgMTYgNSA4IDQgMjQgMTAgMjQgMjMgNCAyOSAyMSA5IDE4IDI4IDI3IF4KKzUyIDEgMTEgMyAxNiA0IDIxIDI1IDMgNCAxOCAxMiAxMiAyOSAyNiAxMyAyNiAyMyAyNiA3IDIzIDEwIDkgMjcgMjYgMjEgMjUgMjEgMTggCis5IDI0IDE2IDIyIDUgMjEgNyA3IDI3IDQgMjAgMjMgMTMgMjcgMTAgMjMgMjkgNyAxOSAxMyAxMyA4IDE5IDIwIDIzIF4KKzYxIDAgMiAxOSAyMiAyOSAzIDEwIDYgOSAxMyAyNCAxNyAxNiA5IDIwIDIxIDI3IDIgMTkgNyA4IDI2IDI1IDEyIDIgMTQgMyAxIDEgMTYgCisxMiAyMCAyOCAyNCAxMiA1IDI0IDI1IDIwIDEgMTIgMjUgOSAyIDYgMjAgMTUgMTQgMjkgMTggMjEgMjggMSAxNyA2IDE3IDI3IDEgMiAKKzEwIDE2IDE5IF4KKzU3IDEgNSAxNCAxMCAyNyAxMSAxNyAzIDI5IDE0IDI3IDE3IDUgMiAxOCAyMCAxMSAyNyAxOCAyMiAyNyAyMiA5IDggMTggMyAxNCAxMCAKKzUgMiAyNCAxOCAyMyAyMSAyNiA4IDIyIDggMSA2IDI3IDI3IDE1IDI5IDIwIDIgMjkgMjIgOCAxNiAyMCA0IDEyIDkgNiAxMiAxNiAyNCBeCis2NCAwIDcgOSAyMCAyOSAxMSA5IDQgMSAxNSAyNSAxNiAyOSAxMCAyMiA3IDIgOCA1IDE4IDE0IDIzIDI0IDQgNiAyNiAzIDExIDYgMTIgCisxIDcgMTQgMjQgMTQgNiAxMCAyMSAxNiAyMyAyOSAyNSA2IDE0IDE3IDIgMTIgMTAgNSAxMCAxNSAyNSA4IDE1IDMgNyAxMyAyNSAxNiAKKzE0IDEgMjkgMjIgMjYgMTAgXgorNjMgMSAyNyA5IDEgOCA4IDI4IDYgMTMgNSAxMyAzIDE1IDUgMjMgOCAyMyAyIDUgNSA0IDE3IDEzIDE0IDcgMTcgMTIgMjcgMyAxOCA1IAorNyA1IDI2IDE4IDE1IDIyIDI4IDE2IDEzIDcgMiAyMyAxOSAyNSAyOSAxNyA3IDE2IDI1IDIzIDExIDExIDE1IDIgMTMgOSAyNiAyIDI0IAorMjYgNyAyOCAxMSBeCis1NiAxIDIgMjkgNyAyMiAyMyA1IDI4IDE5IDEgMjcgMjkgMSAyNCAxMSAxOCAyMCAzIDEzIDExIDcgMyAxNSAxNyAyNCAxIDE4IDEzIDYgCiszIDI1IDI3IDE2IDI4IDE4IDI0IDggMjMgNyAyOSAyOCA2IDI4IDE0IDEyIDI4IDI3IDIyIDQgMTQgMjUgMSAzIDkgNyAxMSAyOSBeCis1NCAwIDE1IDE2IDEwIDE5IDEyIDE5IDExIDIwIDEzIDI4IDQgMjcgMjggNyAyNyAxMiA0IDI4IDIxIDE3IDIyIDIwIDE3IDE1IDE1IDIzIAorMjIgMTMgMTIgMjEgMjIgMjEgMTEgMTIgMTQgMTIgMTggMjcgOCA3IDQgOSAxNCAxNiAxNSA4IDExIDIxIDIwIDEwIDEwIDIxIDIzIDIyIF4KKzYzIDAgMiAxMSAyMyAxIDExIDEgNSAzIDIzIDE2IDE1IDI3IDE0IDUgMTYgMyAyMiAyIDMgMjQgMyAxOSAyOSA0IDQgMTAgOCAyMCAxNCAKKzE1IDEgMjYgMTIgMjcgMjUgNCAyOCAyMiAxMSAxOSAxOSAyNCA1IDIwIDggOSA1IDI1IDE5IDE3IDE5IDE1IDcgMjQgMjQgMjEgMyAyMCAKKzE2IDggMyAxNyAxOSBeCis1OSAwIDE4IDI5IDkgMjMgOSAxMCAyOSA0IDEyIDI0IDE1IDUgOCAyMiAxNyAyOSAxMiAzIDggMjkgMTUgMjEgMjEgNCA3IDIwIDcgMTAgCis3IDI2IDEwIDE2IDI0IDYgNyAxMiA4IDEyIDE1IDI0IDkgMTcgMTEgMjggMTIgMjYgMjYgNiAyOSAxMyAxMCAyMCA2IDIzIDEwIDQgMyAKKzI2IDEwIF4KKzYyIDAgMTQgMjAgMjAgMjUgMTQgMTMgMTUgMjQgMTQgMTEgNCAyMyAyNyAyNCAyMCA5IDE2IDE3IDI0IDEzIDEyIDYgMSAxNCAyNiAyNSAKKzcgOCAyMSAxIDE5IDMgMiAyIDE3IDIxIDEzIDUgOSAyMSAyOCA5IDEgMTMgMiAyMSA4IDI0IDEgMyAyNyAxMyAxOCAxOSA0IDE1IDEyIDUgCisyIDE2IDI3IDI5IF4KKzYyIDAgNiAyIDEgMjMgMTcgMTQgMjggMTkgMjMgNiAyMiAxNiA0IDE5IDYgMTYgMjggMyAzIDEgMTUgMTMgMjIgNiAxNSAxMSA2IDQgMjQgCisyNSAxNSAxOSAyMyAyOCAxIDkgMTUgMTAgMTIgNyAyNSAxMSAyNSAyIDI3IDYgNiAxOCA0IDEzIDEgNCAxMSAyNSAxNyA2IDI5IDIxIDI0IAorMjcgMjEgMTggXgorNTQgMSAxNyAyNiAyNCAxMyA0IDIyIDI0IDI5IDIgMTEgOCAxNyA0IDIzIDExIDI2IDEgMjUgMjggMTUgMTkgMTAgMyA5IDI5IDI3IDcgCisyMiAzIDI3IDIxIDIgMjYgMTkgOSAxOSAyNyAyMyAzIDEyIDE3IDEwIDQgOCAyNyAxOSAxNiAxIDIxIDIzIDI4IDIzIDE4IDE3IF4KKzUyIDAgMjUgMTggMjYgMjAgOCAxNyAxOSAyIDQgMTEgNyAxOCA2IDI0IDIgMjUgMjUgNSAyNyAyMCAzIDI4IDIwIDE4IDIxIDEwIDI1IAorMTAgMSAyOCAyOCAyOSAxNiAyMCAxOSAyNiAxNiAyMSA2IDIzIDE1IDI4IDI2IDI4IDcgMTUgMTggMTEgNSAxNyAyMCAxMyBeCis2OCAwIDEgMTAgMTQgOCA0IDE2IDI2IDE3IDggMTAgMjIgMjIgMTggMSAyMCAyNCA3IDEgOSA3IDE5IDUgMjIgMSA0IDI2IDExIDEwIDI4IAorNSAxNCAyIDYgNCAyIDkgMjIgMTUgMTMgMjAgMjIgMjYgMTggMTYgOSAyIDE1IDIwIDI3IDggNiAxNyA1IDE1IDkgMjUgMTAgMjYgNCA1IAorMjcgNSAxOSAyMSA1IDYgMTEgMTkgXgorNTQgMSAxOSA4IDIgMjQgMjYgMjIgMTkgMTggMTcgMjMgMTQgMjEgMTQgMjIgMTMgMjAgNSAyOSA2IDUgMjYgNiAyMSAyOSAzIDUgMTIgCisxNiAxMSAxMyAxNiAxOCAxOCAxMCAxMSAyMCAyMSAxMiAxMSAxMiAyMiAxNCAxOSAzIDIxIDE1IDYgMjUgMjYgMjkgMjQgMTkgMTcgMjQgXgorNTkgMCAyNSAyMiAxMiAxMyAyMyAyMyAxMiAxMCAxMyAxIDIyIDEwIDIgMjIgMiAyOCAxMCAxNyAxOCAzIDYgMTkgMjggMTcgMTEgMSA5IAorMTQgNCAyOSAyOSAyMyAyNSAxMyAxOSAxOCAyIDcgMjEgNiA4IDI5IDUgMTEgMjIgMTQgMTQgOSAyOCAxMyAyNSAyNCAyOCA4IDE0IDkgMyAKKzE0IDE2IF4KKzUzIDAgMjYgOSA5IDEyIDEzIDE3IDI1IDE2IDUgOCA0IDI0IDEwIDI0IDIzIDQgMjkgMjEgOSAxOCAyOCAyNSAxMSAzIDE2IDQgMjEgMjUgCiszIDQgMTggMTIgMTIgMjkgMjYgMTMgMjYgMjMgMjYgNyAyMyAxMCA5IDI3IDI2IDIxIDI1IDIxIDE4IDkgMjQgMTYgMTcgXgorNTkgMCA1IDIxIDcgNyAyNyA0IDIwIDIzIDEzIDI3IDEwIDIzIDI5IDcgMTkgMTMgMTMgOCAxOSAyMCAxOCAyIDE5IDIyIDI5IDMgMTAgNiAKKzkgMTMgMjQgMTcgMTYgOSAyMCAyMSAyNyAyIDE5IDcgOCAyNiAyNSAxMiAyIDE0IDMgMSAxIDE2IDEyIDIwIDI4IDI0IDEyIDUgMjQgMjUgCisxOSBeCis2MCAwIDEgMTIgMjUgOSAyIDYgMjAgMTUgMTQgMjkgMTggMjEgMjggMSAxNyA2IDE3IDI3IDEgMiAxMCAxNiAxOSA1IDE0IDEwIDI3IDExIAorMTcgMyAyOSAxNCAyNyAxNyA1IDIgMTggMjAgMTEgMjcgMTggMjIgMjcgMjIgOSA4IDE4IDMgMTQgMTAgNSAyIDI0IDE4IDIzIDIxIDI2IAorOCAyMiAxMyBeCis2MiAwIDEgNiAyNyAyNyAxNSAyOSAyMCAyIDI5IDIyIDggMTYgMjAgNCAxMiA5IDYgMTIgMTYgMTYgNyA5IDIwIDI5IDExIDkgNCAxIDE1IAorMjUgMTYgMjkgMTAgMjIgNyAyIDggNSAxOCAxNCAyMyAyNCA0IDYgMjYgMyAxMSA2IDEyIDEgNyAxNCAyNCAxNCA2IDEwIDIxIDE2IDIzIAorMjkgMjUgMjQgXgorNjcgMCAxNCAxNyAyIDEyIDEwIDUgMTAgMTUgMjUgOCAxNSAzIDcgMTMgMjUgMTYgMTQgMSAyOSAyMiAyNiAxNSAyNyA5IDEgOCA4IDI4IAorNiAxMyA1IDEzIDMgMTUgNSAyMyA4IDIzIDIgNSA1IDQgMTcgMTMgMTQgNyAxNyAxMiAyNyAzIDE4IDUgNyA1IDI2IDE4IDE1IDIyIDI4IAorMTYgMTMgNyAyIDIzIDE5IDI1IDE0IF4KKzU4IDEgMTcgNyAxNiAyNSAyMyAxMSAxMSAxNSAyIDEzIDkgMjYgMiAyNCAyNiA3IDI4IDExIDIgMjkgNyAyMiAyMyA1IDI4IDE5IDEgMjcgCisyOSAxIDI0IDExIDE4IDIwIDMgMTMgMTEgNyAzIDE1IDE3IDI0IDEgMTggMTMgNiAzIDI1IDI3IDE2IDI4IDE4IDI0IDggMjMgNyAyOSAKKzExIF4KKzU1IDAgNiAyOCAxNCAxMiAyOCAyNyAyMiA0IDE0IDI1IDEgMyA5IDcgMTEgMTQgMTUgMTYgMTAgMTkgMTIgMTkgMTEgMjAgMTMgMjggNCAKKzI3IDI4IDcgMjcgMTIgNCAyOCAyMSAxNyAyMiAyMCAxNyAxNSAxNSAyMyAyMiAxMyAxMiAyMSAyMiAyMSAxMSAxMiAxNCAxMiAxOCAyNyAKKzEwIF4KKzY1IDAgNyA0IDkgMTQgMTYgMTUgOCAxMSAyMSAyMCAxMCAxMCAyMSAyMyAyMCAyIDExIDIzIDEgMTEgMSA1IDMgMjMgMTYgMTUgMjcgMTQgCis1IDE2IDMgMjIgMiAzIDI0IDMgMTkgMjkgNCA0IDEwIDggMjAgMTQgMTUgMSAyNiAxMiAyNyAyNSA0IDI4IDIyIDExIDE5IDE5IDI0IDUgCisyMCA4IDkgNSAyNSAxOSAyMCBeCis1OSAxIDE5IDE1IDcgMjQgMjQgMjEgMyAyMCAxNiA4IDMgMTcgMjggMTggMjkgOSAyMyA5IDEwIDI5IDQgMTIgMjQgMTUgNSA4IDIyIDE3IAorMjkgMTIgMyA4IDI5IDE1IDIxIDIxIDQgNyAyMCA3IDEwIDcgMjYgMTAgMTYgMjQgNiA3IDEyIDggMTIgMTUgMjQgOSAxNyAxMSAyOCAxMiAKKzIzIF4KKzYxIDAgMjYgNiAyOSAxMyAxMCAyMCA2IDIzIDEwIDQgMyAyNiAyNiAxNCAyMCAyMCAyNSAxNCAxMyAxNSAyNCAxNCAxMSA0IDIzIDI3IAorMjQgMjAgOSAxNiAxNyAyNCAxMyAxMiA2IDEgMTQgMjYgMjUgNyA4IDIxIDEgMTkgMyAyIDIgMTcgMjEgMTMgNSA5IDIxIDI4IDkgMSAxMyAKKzIgMjEgOCAyOSBeCis2OCAwIDEgMyAyNyAxMyAxOCAxOSA0IDE1IDEyIDUgMiAxNiAyNyAxNiA2IDIgMSAyMyAxNyAxNCAyOCAxOSAyMyA2IDIyIDE2IDQgMTkgCis2IDE2IDI4IDMgMyAxIDE1IDEzIDIyIDYgMTUgMTEgNiA0IDI0IDI1IDE1IDE5IDIzIDI4IDEgOSAxNSAxMCAxMiA3IDI1IDExIDI1IDIgCisyNyA2IDYgMTggNCAxMyAxIDQgMTEgMjYgXgorNTQgMSAxNyA2IDI5IDIxIDI0IDI3IDIxIDE3IDE3IDI2IDI0IDEzIDQgMjIgMjQgMjkgMiAxMSA4IDE3IDQgMjMgMTEgMjYgMSAyNSAyOCAKKzE1IDE5IDEwIDMgOSAyOSAyNyA3IDIyIDMgMjcgMjEgMiAyNiAxOSA5IDE5IDI3IDIzIDMgMTIgMTcgMTAgNCA4IDI3IDIwIF4KKzUyIDEgMTYgMSAyMSAyMyAyOCAyMyAxOCA4IDI1IDE4IDI2IDIwIDggMTcgMTkgMiA0IDExIDcgMTggNiAyNCAyIDI1IDI1IDUgMjcgMjAgCiszIDI4IDIwIDE4IDIxIDEwIDI1IDEwIDEgMjggMjggMjkgMTYgMjAgMTkgMjYgMTYgMjEgNiAyMyAxNSAyOCAyNiAxMiBeCis2NyAwIDcgMTUgMTggMTEgNSAxNyAyMCAyNiAxIDEwIDE0IDggNCAxNiAyNiAxNyA4IDEwIDIyIDIyIDE4IDEgMjAgMjQgNyAxIDkgNyAKKzE5IDUgMjIgMSA0IDI2IDExIDEwIDI4IDUgMTQgMiA2IDQgMiA5IDIyIDE1IDEzIDIwIDIyIDI2IDE4IDE2IDkgMiAxNSAyMCAyNyA4IDYgCisxNyA1IDE1IDkgMjUgMTAgMjYgMTkgXgorNTggMCA1IDI3IDUgMTkgMjEgNSA2IDExIDI5IDE5IDggMiAyNCAyNiAyMiAxOSAxOCAxNyAyMyAxNCAyMSAxNCAyMiAxMyAyMCA1IDI5IAorNiA1IDI2IDYgMjEgMjkgMyA1IDEyIDE2IDExIDEzIDE2IDE4IDE4IDEwIDExIDIwIDIxIDEyIDExIDEyIDIyIDE0IDE5IDMgMjEgMTUgNiAKKzI1IDI3IF4KKzU3IDAgMjkgMjQgMTkgMTcgMTggMjUgMjIgMTIgMTMgMjMgMjMgMTIgMTAgMTMgMSAyMiAxMCAyIDIyIDIgMjggMTAgMTcgMTggMyA2IAorMTkgMjggMTcgMTEgMSA5IDE0IDQgMjkgMjkgMjMgMjUgMTMgMTkgMTggMiA3IDIxIDYgOCAyOSA1IDExIDIyIDE0IDE0IDkgMjggMTMgCisyNSAyNSBeCis1MiAwIDE1IDI5IDkgMjggMjAgMiAzMCAyNiAyMSAxNyA4IDI4IDE3IDIyIDI5IDI0IDggMTEgMTggMjkgMTUgNiA3IDI3IDI3IDE3IDI0IAorMTggMjMgMTEgMTkgOCAzMCA1IDI0IDIyIDEyIDI1IDE1IDI4IDIzIDUgMTAgMjEgNSA4IDcgMyAxMCAxOSAxNyAxOCBeCis2MiAwIDkgMTUgMjkgMTAgNyA0IDEgMTYgMjEgMTYgMjkgMTMgMTggNSAzIDggMTUgOCAyMSAyOSAyMCA1IDI3IDIgMTMgMjcgNyA3IDMwIAorMiAxOCAyNiAxMCAyIDUgMjkgMjEgMTUgMjUgMjYgMjQgOCAxMiAyMCAzIDkgMTAgMzAgNyAxMiAyNCA1IDEzIDEgNiAxMCAyNSAxMyA5IAorMjkgMzAgNyBeCis2MiAwIDI5IDE3IDI2IDYgMjUgNCA3IDI1IDggMTUgMjYgMzAgMTEgMiA5IDYgMjIgNiAyMSAyOCAzIDMgNiAxMiAxMyAxNSA3IDE3IDE2IAorMjYgMyAxOSAzIDUgMiAyOSAxNiAxNiAyMiAyNiAxMyAxMiA5IDE5IDE2IDI3IDI1IDE2IDcgMTUgMjIgMjIgNSA2IDEzIDQgMTIgMTEgCisyNyA1IDE5IDE1IF4KKzU3IDAgOSAzMCA5IDEgMjggMyAyMSAyMiA3IDE3IDIgMjUgMSAyOCAyMSAxMSAxNyAyMCAyOCAxMiAxMCAxMCAzIDE1IDEzIDIwIDEgMjAgCisxMSAxIDMwIDIyIDIzIDE1IDI2IDEyIDIxIDcgMjcgOSAyNyAyOSA1IDI2IDE2IDExIDIzIDI4IDE4IDEgMTMgMjMgMzAgNiAzIDExIDI1IAorXgorNjEgMSAxNiAxMCAxMyAxMyAxOSAxNSAxOCA3IDIyIDEwIDI5IDMgMjUgMzAgOCAyMiAxMyA0IDQgMjcgMjIgMTggMjEgMjMgMTcgMTUgCisxNiAxOSAyMCAxNyAxMCAxNyAyMSAyMCA2IDE0IDE0IDEgMTAgMTggNCA1IDUgOSAxNyAxOCAxNCA1IDEyIDIyIDIyIDExIDggMTggMjQgCisyMSAzIDcgMjEgOSAyMiBeCis1OCAxIDMgNCAyMyAxNCAxNyAyNSAyNyAxMCA1IDE2IDMwIDIzIDIgNCAyNSAzIDE2IDI4IDQgNiA2IDE3IDEyIDE4IDIgMjMgNyAyOSAKKzIzIDI5IDI3IDE5IDcgMjAgMjEgMjUgNSAxNyA5IDcgMSAyMSAyMCAxOSAyOSAxOSAxNCA4IDIzIDIzIDE5IDMgMTggMTcgMyAyOSAxNCAKKzE3IF4KKzYyIDEgMjMgMjggNSAyMiA4IDEwIDEgMSAxMSAyNyAxOCAzIDIgMjIgMjggMTQgMjQgMTIgMSAzIDMwIDI5IDExIDIyIDE5IDcgMTYgMSAKKzExIDQgMjggOCAyMCAyNSAyIDYgOCA1IDE0IDExIDIxIDkgMTYgOCAyNSA2IDI2IDI3IDEgMjkgMTIgOCAxNiA0IDE3IDUgMzAgMzAgMjQgCisxMiAxOSAyMSBeCis1NyAxIDI1IDExIDEzIDEyIDI3IDE2IDE0IDMgMjQgMjAgMjQgMjMgMjIgOSAxNCAxOSAyNiA4IDEzIDYgMTMgMjUgMTkgNSAxIDE5IDEgCisxNyAyOCAzMCAxMyAyMSAxMSA0IDEwIDIzIDI1IDcgNSAxMSAyMCA3IDI0IDI5IDI3IDEzIDE2IDE3IDEgMTUgMTIgMjkgNCAxNiAyNyAKKzEyIDIxIF4KKzY1IDAgMiAyIDI0IDE3IDEzIDIyIDIwIDIyIDQgMjAgMTYgMiAxNyAzIDExIDI5IDEgNSAxMCAxNCAyMyAzIDE0IDkgMiA3IDE4IDIwIAorMTMgMiAxNiAyNSAyNCA0IDQgMTQgNyAxMyA4IDIwIDEyIDIzIDEgMjYgNyA5IDE5IDYgMTYgMyA4IDI2IDIxIDEwIDI2IDIzIDI0IDI4IAorMTYgMTIgMTQgMjUgMjIgMTYgMTUgXgorNTMgMCAyMSAyNCAyNyAzMCAxNSAxMCAxNSAyIDE4IDEzIDI2IDI4IDIzIDE2IDIzIDEwIDIgMTEgMjYgMjYgNCAyOSAxOCA0IDI0IDI0IAorMSAyNCAxMyA1IDIxIDI5IDI2IDIgMTAgMTYgNiA1IDcgMjMgMTkgMTEgMjggMjIgMjEgMSAyNCAxOSA3IDI2IDE4IDMwIDI2IF4KKzU4IDAgMjEgNiAxOCAyMiAyIDEgMTQgMiAxNCA1IDI1IDEgMjcgMjQgNiAyMyAxNiA1IDEgMjAgMjkgMjIgMjUgOSAyNSAxMCAzIDI4IAorMjggMjUgMTkgMTggMTYgMjQgMTQgMTUgNSAyOCAxMiAyOCAyNiAyOSAyIDE1IDE1IDkgNSAxOCAxOSAyMiAxMiAxNSA0IDYgMTUgMjQgCisxNiAyMiBeCis1OSAwIDQgMjYgMjUgMTggMjcgMTkgMjAgNCAyNiAxMiAzIDIyIDEgMjIgMzAgMyAyOCAxMCA5IDI0IDE0IDI5IDYgMzAgMyAxMCAyMCAKKzE0IDYgMyAxOSAyMSAyMSAyOCAxNiAxOCAxMSAzMCAxMSAyMCAzMCAxIDkgOCAxMSA1IDE5IDEwIDI0IDQgMjIgNCAyIDI2IDUgMTUgMjAgCis4IDI1IF4KKzU1IDEgMTMgMzAgMTggOCAxIDI1IDI4IDIwIDIwIDE1IDIxIDE4IDE4IDEyIDE2IDEzIDI0IDkgMjEgMiAyOCA2IDEgMjMgOSAxOCAyNyAKKzI3IDQgOSAxMyAxMCA4IDE0IDE2IDE1IDEyIDExIDE0IDIxIDE0IDEwIDExIDI1IDE3IDE3IDMwIDIxIDEzIDI3IDI2IDI2IDIyIDE0IAorMjEgXgorNTcgMCAxNyAyMSAxOSA5IDkgMjAgMjMgMTMgNyAxMCAyOCAyNCAxMCAyMiAyNyAyMyAyNyA4IDE3IDE0IDYgNCAyMSAyNiAxNSAxIDggCisyOSAyNyA2IDI4IDE1IDMgMjcgMjUgMjUgMTQgMTkgMTMgMjkgOCAyNCAyIDggMiA0IDEyIDE5IDExIDEwIDYgMjYgMTQgMjIgMjQgMzAgCisyIF4KKzU2IDEgMTEgMTIgMiAxMiAxNyAyMyA4IDggMTIgMjggMTMgMTQgMjggMiAxNyA0IDggMyAyNiA5IDIzIDIxIDMwIDMwIDIwIDQgMTMgMjggCisyOSA5IDMgMTcgNyAxOSAzMCAyOCAxIDIgMjAgOSAxMiAyNCAxNSAzMCAyMCAyNyAzIDIzIDExIDYgMjkgMjUgMjMgMjYgMTcgMjMgXgorNjEgMSAxMCAyMiAxNSAyMyA2IDI1IDUgNCAzMCAyIDE5IDIzIDE1IDI3IDE0IDI2IDEgMSA3IDE5IDEyIDcgNiAyMCAxOCAxNCA0IDE1IAorMTcgMjggNyAxMSA3IDggOSAyMiAxNyAxMiA1IDIzIDE4IDI1IDE4IDYgMTIgMjYgMzAgMTIgMzAgMTQgMyAxIDE4IDEwIDIwIDI3IDIxIAorOCA2IDI0IDMwIF4KKzU0IDAgMjAgMTEgMjQgNyAyIDQgMTggMTUgMTQgMzAgMTYgMTkgMiAyNyAxNSA0IDE5IDI1IDI5IDI5IDcgMTQgMTggOSAxMSA5IDI3IAorMTEgMTUgMjkgOSAyOCAyMCAyIDMwIDI2IDIxIDE3IDggMjggMTcgMjIgMjkgMjQgOCAxMSAxOCAyOSAxNSA2IDcgMjcgMjcgNyBeCis2MyAxIDI0IDE4IDIzIDExIDE5IDggMzAgNSAyNCAyMiAxMiAyNSAxNSAyOCAyMyA1IDEwIDIxIDUgOCA3IDMgMTAgMTkgMTcgNiA5IDE1IAorMjkgMTAgNyA0IDEgMTYgMjEgMTYgMjkgMTMgMTggNSAzIDggMTUgOCAyMSAyOSAyMCA1IDI3IDIgMTMgMjcgNyA3IDMwIDIgMTggMjYgCisxMCAyIDUgMjkgMTIgXgorNjMgMSAxNSAyNSAyNiAyNCA4IDEyIDIwIDMgOSAxMCAzMCA3IDEyIDI0IDUgMTMgMSA2IDEwIDI1IDEzIDkgMjkgMzAgMTcgMjkgMTcgCisyNiA2IDI1IDQgNyAyNSA4IDE1IDI2IDMwIDExIDIgOSA2IDIyIDYgMjEgMjggMyAzIDYgMTIgMTMgMTUgNyAxNyAxNiAyNiAzIDE5IDMgCis1IDIgMjkgMTYgMTcgXgorNjAgMSAyMiAyNiAxMyAxMiA5IDE5IDE2IDI3IDI1IDE2IDcgMTUgMjIgMjIgNSA2IDEzIDQgMTIgMTEgMjcgNSAxOSAyOCA5IDMwIDkgMSAKKzI4IDMgMjEgMjIgNyAxNyAyIDI1IDEgMjggMjEgMTEgMTcgMjAgMjggMTIgMTAgMTAgMyAxNSAxMyAyMCAxIDIwIDExIDEgMzAgMjIgMjMgCisxNSAyNiA2IF4KKzU2IDAgMjEgNyAyNyA5IDI3IDI5IDUgMjYgMTYgMTEgMjMgMjggMTggMSAxMyAyMyAzMCA2IDMgMTEgMTEgMTYgMTAgMTMgMTMgMTkgMTUgCisxOCA3IDIyIDEwIDI5IDMgMjUgMzAgOCAyMiAxMyA0IDQgMjcgMjIgMTggMjEgMjMgMTcgMTUgMTYgMTkgMjAgMTcgMTAgMTcgMjEgMjAgCisxMSBeCis2NCAxIDE0IDE0IDEgMTAgMTggNCA1IDUgOSAxNyAxOCAxNCA1IDEyIDIyIDIyIDExIDggMTggMjQgMjEgMyA3IDIxIDkgNCAzIDQgMjMgCisxNCAxNyAyNSAyNyAxMCA1IDE2IDMwIDIzIDIgNCAyNSAzIDE2IDI4IDQgNiA2IDE3IDEyIDE4IDIgMjMgNyAyOSAyMyAyOSAyNyAxOSA3IAorMjAgMjEgMjUgNSAzMCBeCis2MyAxIDkgNyAxIDIxIDIwIDE5IDI5IDE5IDE0IDggMjMgMjMgMTkgMyAxOCAxNyAzIDI5IDE0IDI3IDIzIDI4IDUgMjIgOCAxMCAxIDEgCisxMSAyNyAxOCAzIDIgMjIgMjggMTQgMjQgMTIgMSAzIDMwIDI5IDExIDIyIDE5IDcgMTYgMSAxMSA0IDI4IDggMjAgMjUgMiA2IDggNSAKKzE0IDExIDIxIDkgMjkgXgorNTcgMCA4IDI1IDYgMjYgMjcgMSAyOSAxMiA4IDE2IDQgMTcgNSAzMCAzMCAyNCAxMiAxOSAyNCAyNSAxMSAxMyAxMiAyNyAxNiAxNCAzIAorMjQgMjAgMjQgMjMgMjIgOSAxNCAxOSAyNiA4IDEzIDYgMTMgMjUgMTkgNSAxIDE5IDEgMTcgMjggMzAgMTMgMjEgMTEgNCAxMCAyMyAyNSAKKzYgXgorNjggMCA1IDExIDIwIDcgMjQgMjkgMjcgMTMgMTYgMTcgMSAxNSAxMiAyOSA0IDE2IDI3IDEyIDYgMiAyIDI0IDE3IDEzIDIyIDIwIDIyIAorNCAyMCAxNiAyIDE3IDMgMTEgMjkgMSA1IDEwIDE0IDIzIDMgMTQgOSAyIDcgMTggMjAgMTMgMiAxNiAyNSAyNCA0IDQgMTQgNyAxMyA4IAorMjAgMTIgMjMgMSAyNiA3IDkgMTkgNiAzMCBeCis1NCAxIDMgOCAyNiAyMSAxMCAyNiAyMyAyNCAyOCAxNiAxMiAxNCAyNSAyMiAxNiAyIDIxIDI0IDI3IDMwIDE1IDEwIDE1IDIgMTggMTMgCisyNiAyOCAyMyAxNiAyMyAxMCAyIDExIDI2IDI2IDQgMjkgMTggNCAyNCAyNCAxIDI0IDEzIDUgMjEgMjkgMjYgMiAxMCAxNiA2IDI3IF4KKzU2IDAgNyAyMyAxOSAxMSAyOCAyMiAyMSAxIDI0IDE5IDcgMjYgMTggMzAgMjUgMjEgNiAxOCAyMiAyIDEgMTQgMiAxNCA1IDI1IDEgMjcgCisyNCA2IDIzIDE2IDUgMSAyMCAyOSAyMiAyNSA5IDI1IDEwIDMgMjggMjggMjUgMTkgMTggMTYgMjQgMTQgMTUgNSAyOCAxMiAyOCA5IF4KKzU4IDAgMjkgMiAxNSAxNSA5IDUgMTggMTkgMjIgMTIgMTUgNCA2IDE1IDI0IDE2IDkgNCAyNiAyNSAxOCAyNyAxOSAyMCA0IDI2IDEyIDMgCisyMiAxIDIyIDMwIDMgMjggMTAgOSAyNCAxNCAyOSA2IDMwIDMgMTAgMjAgMTQgNiAzIDE5IDIxIDIxIDI4IDE2IDE4IDExIDMwIDExIDIwIAorMjkgXgorNjUgMCAxIDkgOCAxMSA1IDE5IDEwIDI0IDQgMjIgNCAyIDI2IDUgMTUgMjAgOCAzIDEzIDMwIDE4IDggMSAyNSAyOCAyMCAyMCAxNSAyMSAKKzE4IDE4IDEyIDE2IDEzIDI0IDkgMjEgMiAyOCA2IDEgMjMgOSAxOCAyNyAyNyA0IDkgMTMgMTAgOCAxNCAxNiAxNSAxMiAxMSAxNCAyMSAKKzE0IDEwIDExIDI1IDE3IDE3IDIwIF4KKzU1IDAgMjEgMTMgMjcgMjYgMjYgMjIgMTQgMTMgMTcgMjEgMTkgOSA5IDIwIDIzIDEzIDcgMTAgMjggMjQgMTAgMjIgMjcgMjMgMjcgOCAKKzE3IDE0IDYgNCAyMSAyNiAxNSAxIDggMjkgMjcgNiAyOCAxNSAzIDI3IDI1IDI1IDE0IDE5IDEzIDI5IDggMjQgMiA4IDIgNCAzMCBeCis1NyAxIDE5IDExIDEwIDYgMjYgMTQgMjIgMjQgMzAgMTAgMTEgMTIgMiAxMiAxNyAyMyA4IDggMTIgMjggMTMgMTQgMjggMiAxNyA0IDggCiszIDI2IDkgMjMgMjEgMzAgMzAgMjAgNCAxMyAyOCAyOSA5IDMgMTcgNyAxOSAzMCAyOCAxIDIgMjAgOSAxMiAyNCAxNSAzMCAyMCAyNyAKKzMwIF4KKzU5IDAgMjMgMTEgNiAyOSAyNSAyMyAyNiAxNyAyMCAxMCAyMiAxNSAyMyA2IDI1IDUgNCAzMCAyIDE5IDIzIDE1IDI3IDE0IDI2IDEgMSAKKzcgMTkgMTIgNyA2IDIwIDE4IDE0IDQgMTUgMTcgMjggNyAxMSA3IDggOSAyMiAxNyAxMiA1IDIzIDE4IDI1IDE4IDYgMTIgMjYgMzAgMTIgCiszMCAxOCBeCis1NiAwIDMgMSAxOCAxMCAyMCAyNyAyMSA4IDYgMjQgMjYgMjAgMTEgMjQgNyAyIDQgMTggMTUgMTQgMzAgMTYgMTkgMiAyNyAxNSA0IDE5IAorMjUgMjkgMjkgNyAxNCAxOCA5IDExIDkgMjcgMTEgMTUgMjkgOSAyOCAyMCAyIDMwIDI2IDIxIDE3IDggMjggMTcgMjIgMjkgMjQgNyBeCis2MiAwIDExIDE4IDI5IDE1IDYgNyAyNyAyNyAxNyAyNCAxOCAyMyAxMSAxOSA4IDMwIDUgMjQgMjIgMTIgMjUgMTUgMjggMjMgNSAxMCAKKzIxIDUgOCA3IDMgMTAgMTkgMTcgNiA5IDE1IDI5IDEwIDcgNCAxIDE2IDIxIDE2IDI5IDEzIDE4IDUgMyA4IDE1IDggMjEgMjkgMjAgNSAKKzI3IDIgMTMgMjcgNyBeCis2MiAxIDcgMzAgMiAxOCAyNiAxMCAyIDUgMjkgMjEgMTUgMjUgMjYgMjQgOCAxMiAyMCAzIDkgMTAgMzAgNyAxMiAyNCA1IDEzIDEgNiAKKzEwIDI1IDEzIDkgMjkgMzAgMTcgMjkgMTcgMjYgNiAyNSA0IDcgMjUgOCAxNSAyNiAzMCAxMSAyIDkgNiAyMiA2IDIxIDI4IDMgMyA2IAorMTIgMTMgMTUgMjYgXgorNjIgMCAxNyAxNiAyNiAzIDE5IDMgNSAyIDI5IDE2IDE2IDIyIDI2IDEzIDEyIDkgMTkgMTYgMjcgMjUgMTYgNyAxNSAyMiAyMiA1IDYgCisxMyA0IDEyIDExIDI3IDUgMTkgMjggOSAzMCA5IDEgMjggMyAyMSAyMiA3IDE3IDIgMjUgMSAyOCAyMSAxMSAxNyAyMCAyOCAxMiAxMCAKKzEwIDMgMTUgMTMgMjAgMTkgXgorNTYgMSAyMCAxMSAxIDMwIDIyIDIzIDE1IDI2IDEyIDIxIDcgMjcgOSAyNyAyOSA1IDI2IDE2IDExIDIzIDI4IDE4IDEgMTMgMjMgMzAgNiAKKzMgMTEgMTEgMTYgMTAgMTMgMTMgMTkgMTUgMTggNyAyMiAxMCAyOSAzIDI1IDMwIDggMjIgMTMgNCA0IDI3IDIyIDE4IDIxIDIzIDE3IAorMjIgXgorNjYgMSAxNiAxOSAyMCAxNyAxMCAxNyAyMSAyMCA2IDE0IDE0IDEgMTAgMTggNCA1IDUgOSAxNyAxOCAxNCA1IDEyIDIyIDIyIDExIDggCisxOCAyNCAyMSAzIDcgMjEgOSA0IDMgNCAyMyAxNCAxNyAyNSAyNyAxMCA1IDE2IDMwIDIzIDIgNCAyNSAzIDE2IDI4IDQgNiA2IDE3IDEyIAorMTggMiAyMyA3IDI5IDIzIDI5IDI0IF4KKzYyIDAgMTkgNyAyMCAyMSAyNSA1IDE3IDkgNyAxIDIxIDIwIDE5IDI5IDE5IDE0IDggMjMgMjMgMTkgMyAxOCAxNyAzIDI5IDE0IDI3IAorMjMgMjggNSAyMiA4IDEwIDEgMSAxMSAyNyAxOCAzIDIgMjIgMjggMTQgMjQgMTIgMSAzIDMwIDI5IDExIDIyIDE5IDcgMTYgMSAxMSA0IAorMjggOCAyMCAyNSA3IF4KKzU5IDAgNiA4IDUgMTQgMTEgMjEgOSAxNiA4IDI1IDYgMjYgMjcgMSAyOSAxMiA4IDE2IDQgMTcgNSAzMCAzMCAyNCAxMiAxOSAyNCAyNSAKKzExIDEzIDEyIDI3IDE2IDE0IDMgMjQgMjAgMjQgMjMgMjIgOSAxNCAxOSAyNiA4IDEzIDYgMTMgMjUgMTkgNSAxIDE5IDEgMTcgMjggMzAgCisxMyAyNiBeCis3MCAwIDExIDQgMTAgMjMgMjUgNyA1IDExIDIwIDcgMjQgMjkgMjcgMTMgMTYgMTcgMSAxNSAxMiAyOSA0IDE2IDI3IDEyIDYgMiAyIDI0IAorMTcgMTMgMjIgMjAgMjIgNCAyMCAxNiAyIDE3IDMgMTEgMjkgMSA1IDEwIDE0IDIzIDMgMTQgOSAyIDcgMTggMjAgMTMgMiAxNiAyNSAyNCAKKzQgNCAxNCA3IDEzIDggMjAgMTIgMjMgMSAyNiA3IF4KKzU0IDEgOSAxOSA2IDE2IDMgOCAyNiAyMSAxMCAyNiAyMyAyNCAyOCAxNiAxMiAxNCAyNSAyMiAxNiAyIDIxIDI0IDI3IDMwIDE1IDEwIAorMTUgMiAxOCAxMyAyNiAyOCAyMyAxNiAyMyAxMCAyIDExIDI2IDI2IDQgMjkgMTggNCAyNCAyNCAxIDI0IDEzIDUgMjEgMjkgMjYgMjcgXgorNTggMSAxMCAxNiA2IDUgNyAyMyAxOSAxMSAyOCAyMiAyMSAxIDI0IDE5IDcgMjYgMTggMzAgMjUgMjEgNiAxOCAyMiAyIDEgMTQgMiAxNCAKKzUgMjUgMSAyNyAyNCA2IDIzIDE2IDUgMSAyMCAyOSAyMiAyNSA5IDI1IDEwIDMgMjggMjggMjUgMTkgMTggMTYgMjQgMTQgMTUgNSAyOCAKKzI4IF4KKzU4IDEgMjggMjYgMjkgMiAxNSAxNSA5IDUgMTggMTkgMjIgMTIgMTUgNCA2IDE1IDI0IDE2IDkgNCAyNiAyNSAxOCAyNyAxOSAyMCA0IAorMjYgMTIgMyAyMiAxIDIyIDMwIDMgMjggMTAgOSAyNCAxNCAyOSA2IDMwIDMgMTAgMjAgMTQgNiAzIDE5IDIxIDIxIDI4IDE2IDE4IDExIAorMzAgMjIgXgorNjUgMSAyMCAzMCAxIDkgOCAxMSA1IDE5IDEwIDI0IDQgMjIgNCAyIDI2IDUgMTUgMjAgOCAzIDEzIDMwIDE4IDggMSAyNSAyOCAyMCAyMCAKKzE1IDIxIDE4IDE4IDEyIDE2IDEzIDI0IDkgMjEgMiAyOCA2IDEgMjMgOSAxOCAyNyAyNyA0IDkgMTMgMTAgOCAxNCAxNiAxNSAxMiAxMSAKKzE0IDIxIDE0IDEwIDExIDI1IDIwIF4KKzUzIDAgMTcgMzAgMjEgMTMgMjcgMjYgMjYgMjIgMTQgMTMgMTcgMjEgMTkgOSA5IDIwIDIzIDEzIDcgMTAgMjggMjQgMTAgMjIgMjcgMjMgCisyNyA4IDE3IDE0IDYgNCAyMSAyNiAxNSAxIDggMjkgMjcgNiAyOCAxNSAzIDI3IDI1IDI1IDE0IDE5IDEzIDI5IDggMjQgMTUgXgorNjEgMCA4IDIgNCAxMiAxOSAxMSAxMCA2IDI2IDE0IDIyIDI0IDMwIDEwIDExIDEyIDIgMTIgMTcgMjMgOCA4IDEyIDI4IDEzIDE0IDI4IAorMiAxNyA0IDggMyAyNiA5IDIzIDIxIDMwIDMwIDIwIDQgMTMgMjggMjkgOSAzIDE3IDcgMTkgMzAgMjggMSAyIDIwIDkgMTIgMjQgMTUgCiszMCAyMCAyNyAyMCBeCis2MCAwIDIzIDExIDYgMjkgMjUgMjMgMjYgMTcgMjAgMTAgMjIgMTUgMjMgNiAyNSA1IDQgMzAgMiAxOSAyMyAxNSAyNyAxNCAyNiAxIDEgCis3IDE5IDEyIDcgNiAyMCAxOCAxNCA0IDE1IDE3IDI4IDcgMTEgNyA4IDkgMjIgMTcgMTIgNSAyMyAxOCAyNSAxOCA2IDEyIDI2IDMwIDEyIAorMzAgMTQgMjAgXgorNTYgMCAzIDEgMTggMTAgMjAgMjcgMjEgOCA2IDI0IDI2IDIwIDExIDI0IDcgMiA0IDE4IDE1IDE0IDMwIDE2IDE5IDIgMjcgMTUgNCAxOSAKKzI1IDI5IDI5IDcgMTQgMTggOSAxMSA5IDI3IDExIDE1IDI5IDkgMjggMjAgMiAzMCAyNiAyMSAxNyA4IDI4IDE3IDIyIDI5IDI0IDIzIF4KKzYyIDAgMTEgMTggMjkgMTUgNiA3IDI3IDI3IDE3IDI0IDE4IDIzIDExIDE5IDggMzAgNSAyNCAyMiAxMiAyNSAxNSAyOCAyMyA1IDEwIAorMjEgNSA4IDcgMyAxMCAxOSAxNyA2IDkgMTUgMjkgMTAgNyA0IDEgMTYgMjEgMTYgMjkgMTMgMTggNSAzIDggMTUgOCAyMSAyOSAyMCA1IAorMjcgMiAxMyAyNyAyMyBeCis2NCAxIDcgMzAgMiAxOCAyNiAxMCAyIDUgMjkgMjEgMTUgMjUgMjYgMjQgOCAxMiAyMCAzIDkgMTAgMzAgNyAxMiAyNCA1IDEzIDEgNiAKKzEwIDI1IDEzIDkgMjkgMzAgMTcgMjkgMTcgMjYgNiAyNSA0IDcgMjUgOCAxNSAyNiAzMCAxMSAyIDkgNiAyMiA2IDIxIDI4IDMgMyA2IAorMTIgMTMgMTUgNyAxNyAxOCBeCis2NSAwIDI2IDMgMTkgMyA1IDIgMjkgMTYgMTYgMjIgMjYgMTMgMTIgOSAxOSAxNiAyNyAyNSAxNiA3IDE1IDIyIDIyIDUgNiAxMyA0IDEyIAorMTEgMjcgNSAxOSAyOCA5IDMwIDkgMSAyOCAzIDIxIDIyIDcgMTcgMiAyNSAxIDI4IDIxIDExIDE3IDIwIDI4IDEyIDEwIDEwIDMgMTUgCisxMyAyMCAxIDIwIDExIDEgMzAgNSBeCis1NyAwIDIzIDE1IDI2IDEyIDIxIDcgMjcgOSAyNyAyOSA1IDI2IDE2IDExIDIzIDI4IDE4IDEgMTMgMjMgMzAgNiAzIDExIDExIDE2IDEwIAorMTMgMTMgMTkgMTUgMTggNyAyMiAxMCAyOSAzIDI1IDMwIDggMjIgMTMgNCA0IDI3IDIyIDE4IDIxIDIzIDE3IDE1IDE2IDE5IDIwIDE3IAorMTAgMjUgXgorNjYgMSAyMSAyMCA2IDE0IDE0IDEgMTAgMTggNCA1IDUgOSAxNyAxOCAxNCA1IDEyIDIyIDIyIDExIDggMTggMjQgMjEgMyA3IDIxIDkgNCAKKzMgNCAyMyAxNCAxNyAyNSAyNyAxMCA1IDE2IDMwIDIzIDIgNCAyNSAzIDE2IDI4IDQgNiA2IDE3IDEyIDE4IDIgMjMgNyAyOSAyMyAyOSAKKzI3IDE5IDcgMjAgMjEgMjUgMjAgXgorNjUgMSAxNyA5IDcgMSAyMSAyMCAxOSAyOSAxOSAxNCA4IDIzIDIzIDE5IDMgMTggMTcgMyAyOSAxNCAyNyAyMyAyOCA1IDIyIDggMTAgMSAKKzEgMTEgMjcgMTggMyAyIDIyIDI4IDE0IDI0IDEyIDEgMyAzMCAyOSAxMSAyMiAxOSA3IDE2IDEgMTEgNCAyOCA4IDIwIDI1IDIgNiA4IDUgCisxNCAxMSAyMSA5IDE2IDI4IF4KKzU5IDEgMjUgNiAyNiAyNyAxIDI5IDEyIDggMTYgNCAxNyA1IDMwIDMwIDI0IDEyIDE5IDI0IDI1IDExIDEzIDEyIDI3IDE2IDE0IDMgMjQgCisyMCAyNCAyMyAyMiA5IDE0IDE5IDI2IDggMTMgNiAxMyAyNSAxOSA1IDEgMTkgMSAxNyAyOCAzMCAxMyAyMSAxMSA0IDEwIDIzIDI1IDcgCis1IDExIDIzIF4KKzcwIDAgMjAgNyAyNCAyOSAyNyAxMyAxNiAxNyAxIDE1IDEyIDI5IDQgMTYgMjcgMTIgNiAyIDIgMjQgMTcgMTMgMjIgMjAgMjIgNCAyMCAKKzE2IDIgMTcgMyAxMSAyOSAxIDUgMTAgMTQgMjMgMyAxNCA5IDIgNyAxOCAyMCAxMyAyIDE2IDI1IDI0IDQgNCAxNCA3IDEzIDggMjAgMTIgCisyMyAxIDI2IDcgOSAxOSA2IDE2IDMgOCAyNiAyNSBeCis1NiAwIDEwIDI2IDIzIDI0IDI4IDE2IDEyIDE0IDI1IDIyIDE2IDIgMjEgMjQgMjcgMzAgMTUgMTAgMTUgMiAxOCAxMyAyNiAyOCAyMyAKKzE2IDIzIDEwIDIgMTEgMjYgMjYgNCAyOSAxOCA0IDI0IDI0IDEgMjQgMTMgNSAyMSAyOSAyNiAyIDEwIDE2IDYgNSA3IDIzIDE5IDExIAorMjggMjQgXgorNTkgMSAyMSAxIDI0IDE5IDcgMjYgMTggMzAgMjUgMjEgNiAxOCAyMiAyIDEgMTQgMiAxNCA1IDI1IDEgMjcgMjQgNiAyMyAxNiA1IDEgCisyMCAyOSAyMiAyNSA5IDI1IDEwIDMgMjggMjggMjUgMTkgMTggMTYgMjQgMTQgMTUgNSAyOCAxMiAyOCAyNiAyOSAyIDE1IDE1IDkgNSAKKzE4IDE5IDEzIF4KKzYzIDEgMTIgMTUgNCA2IDE1IDI0IDE2IDkgNCAyNiAyNSAxOCAyNyAxOSAyMCA0IDI2IDEyIDMgMjIgMSAyMiAzMCAzIDI4IDEwIDkgMjQgCisxNCAyOSA2IDMwIDMgMTAgMjAgMTQgNiAzIDE5IDIxIDIxIDI4IDE2IDE4IDExIDMwIDExIDIwIDMwIDEgOSA4IDExIDUgMTkgMTAgMjQgCis0IDIyIDQgMiAyNiAyMCBeCis1OSAxIDE1IDIwIDggMyAxMyAzMCAxOCA4IDEgMjUgMjggMjAgMjAgMTUgMjEgMTggMTggMTIgMTYgMTMgMjQgOSAyMSAyIDI4IDYgMSAKKzIzIDkgMTggMjcgMjcgNCA5IDEzIDEwIDggMTQgMTYgMTUgMTIgMTEgMTQgMjEgMTQgMTAgMTEgMjUgMTcgMTcgMzAgMjEgMTMgMjcgMjYgCisyNiAyMiAxNCAyMyBeCis2MSAwIDE2IDIxIDMwIDI1IDggOSAxOCAzMCAxNyA0IDYgMzEgMjYgMTYgMjUgMTggMjMgOSAyMCA4IDcgMjUgMjYgMTEgMjcgMTcgMjggCisyIDIzIDIgMTIgMjQgMiA4IDYgMyAxMiAyMCAxNiA0IDEwIDE3IDMwIDEyIDExIDUgMzEgMTkgMTkgMTkgMzAgMTMgMTggMiAzIDggMiAKKzE3IDggMjQgMjggXgorNjkgMCAyMiAyIDcgMjYgMSAxMyAyNiA2IDYgNiAxOCAyNCA3IDYgNyAzMCAxOSAxMiAyMiAyNCAyNSAzIDExIDE3IDMgMTAgMTIgMTEgCisxMSAyNSA3IDEzIDMxIDQgNyAyNyAxMyAxMCAzMCAxNiAzMCAxNiAyOSA0IDI3IDUgNiAyNyA4IDEyIDI5IDkgMSAxMCA5IDI2IDQgMTkgCisxIDMgMyA0IDE2IDEzIDE3IDYgMTYgMTQgMjggXgorNjIgMCAzIDIwIDMgMiAxIDMwIDE0IDE0IDIxIDI5IDEzIDExIDEwIDI5IDIwIDE5IDI2IDI3IDE5IDYgMTcgMjYgMjYgNyA5IDEzIDE2IAorOSAzMSAyIDIwIDI4IDEwIDEwIDQgMjggMyAyNCAyMSA2IDI5IDE2IDEgMjIgMzEgMSAyNCA5IDE2IDIyIDI4IDExIDcgNyAzIDE3IDEzIAorMjIgNCAxNyA5IDI3IF4KKzYwIDAgMjEgMjMgMTcgMjQgMTYgMjQgMTEgMjYgNSAzMSAzMCAyIDI0IDE0IDkgMjMgMjggMTggNCAxMyAyMyA0IDMgOSA5IDE0IDEyIAorMTMgOCAyMCAxMiAxOCA2IDIxIDEyIDI1IDMgMjcgOCAyMSAxMyA1IDI2IDIxIDE4IDE5IDIzIDE2IDEyIDE0IDIwIDE3IDE2IDcgMTYgCisxOSAyMiA5IDE1IDI1IF4KKzY0IDAgMzEgNyAxOCAyOSA1IDcgMiA1IDE2IDE4IDEwIDcgMTEgMjEgMjEgOSA4IDE4IDI1IDE5IDMgNiAxOSAyOSAxMCAzIDUgMjMgMTUgCisxNiAyNyAyNiAxMiAyIDE5IDIzIDEgMjIgMyAxOSAyOCA1IDIgOSA0IDIxIDExIDE4IDEgMjMgNiAzMCAyMyAzMCAyNiAyMCAxMSAyMiAKKzE5IDI3IDIgMTYgMTAgMzEgXgorNjAgMCA0IDI0IDE3IDIwIDI1IDIwIDE1IDggMjMgMjMgMjAgMzAgMTggMTYgMyAzMCAxNSAyNiAyMyAyOCA3IDIxIDggNyAzMSAzMSAxNCAKKzI2IDE4IDMgMSAyNiAyOCAxNSAyNSAxMSAzMSAzIDI1IDkgMjEgMjAgMiA2IDE0IDQgOSA1IDI4IDggMTcgMjIgMSA0IDggNyAxMCAxNCAKKzE5IDE5IF4KKzYyIDAgMTQgOCAyNyA5IDI0IDI2IDQgMzAgMTEgOCAxOSA1IDIxIDcgMiAyNyAyMCAxNiAyMCAyMCAyMiAxNCAxMyAxNiAyNiAxNCAxMCAKKzMgMjUgMjIgMjUgMjMgMjEgMTAgMTUgMTUgMjkgOCAxMyA0IDIgMTMgMjIgMjAgNyA0IDIwIDMxIDE2IDIgMiAyOCAxMyAxOSAxNCAxMiAKKzIzIDI3IDYgMiAxNCAyNCBeCis2MiAwIDIyIDYgMjUgMzAgMjkgMzEgMTMgMTQgMTYgMzEgMTIgMTYgMzAgNSAxNCAzMSAxMSA0IDEgMSAyNSAyMSAxMyAyNiAyMiAyMSA1IAorMjIgMTQgMjkgMSAyMSAzIDE0IDMwIDQgMiAyOSAxMiAxNSAyMyAzIDE1IDUgMSA2IDIzIDIyIDEzIDEgMTQgMjcgMjUgNSAxNSA2IDEzIAorMyAyMiAxMSAyMyAyMSBeCis1NiAxIDI0IDYgNSAyMCA0IDE0IDMgMjkgOCAyOSAxOSA3IDI5IDIzIDI1IDI4IDE5IDExIDE1IDI3IDIxIDE0IDEgMTkgMjAgMjYgMTIgCis3IDEyIDEgMTggMTMgMjkgMjggMjMgMjkgMTQgMjMgNyAxIDkgMjkgMjQgNSAzMCAxOCA1IDI1IDI1IDMxIDI1IDEzIDcgMjQgMjUgMTEgXgorNTQgMCAxIDEyIDE5IDkgNyA2IDI4IDIwIDE0IDI4IDIxIDE5IDMxIDIwIDIwIDYgMjQgMTggMjcgMjQgNCAxOCAyMSAxIDMxIDE1IDEgCisxNSAyIDI3IDQgMjYgMjUgNCAyMyAxOSAyIDMxIDIyIDMwIDIxIDIyIDUgMjcgMTIgMzAgMjggMjggMjcgMTUgMTggMTQgMjUgMjMgXgorNTkgMSAxNyA3IDI4IDExIDI4IDI5IDMwIDEgMTcgMTIgMTAgMiAxOCAyMCAyMSAyIDExIDEyIDUgNCAxMiAyNSAxNCA1IDUgMjQgMjIgCisxOCAzMSAxNSAyMiAyOSAxMSAzIDIxIDMxIDIxIDI3IDMgMjggNyAxMCAyNSAyIDE1IDMwIDkgMzAgNyAyMiAxNSA5IDMgMjAgMjQgMjQgCisyOCAxNCAyNSBeCis1OCAwIDkgMjcgMTQgMjIgMjcgMzEgMTAgOCAxNCA3IDE1IDcgMjAgNSAyNiAxIDI5IDcgMTcgMTcgOCAzIDEzIDI3IDE4IDggMzEgMjcgCisyOCAyMiAyMiAxNyAxOSAxOCAxOCAxMSAxOSAxMyAyNSAxMCAxOSA2IDI4IDQgMzEgMjMgMTAgMTggMjYgMzEgNSAxMCAxMyAxMiA4IDE1IAorMTkgMjQgXgorNTYgMSAxMSAxNCAxNSAyNCAxNSAxMiA5IDIyIDE2IDE2IDI0IDEzIDIgMjYgMjQgMjkgMjYgMTUgMTMgMjEgMjQgMjAgMTAgMTAgMjIgCisyMyAxMyA2IDEyIDI4IDI1IDEyIDIgMjEgMjYgMjggMjYgOCAxNiAxNSA0IDUgMTkgMjQgMTIgMzEgOCAzMCAzMSA5IDI4IDEyIDMgMjYgCisyOSA4IF4KKzY1IDAgMjcgMTAgMjAgMTMgMzAgOCAyNSAxIDggMSA1IDExIDIwIDkgMTIgNCAyOSAxNSAyMSAyNSAyNyA3IDE0IDExIDEgMTEgMTYgMjMgCis4IDggMTEgMSAxMyAxNSAyOCAxIDE2IDUgOCAzIDI0IDEwIDIzIDI0IDE3IDUgMTMgMjggMzAgNSAzIDE2IDYgMjAgMjggMzEgNiAyMiAKKzEwIDExIDI5IDI1IDE3IDI3IDIzIF4KKzYwIDAgMjYgMyAyMyAxNCA0IDMwIDI3IDIzIDI0IDIxIDE3IDEyIDIxIDE3IDIzIDQgMjIgNyA1IDI3IDEgMjAgMjMgMTIgMjYgMTAgMjQgCiszMSAyOSA0IDExIDE1IDExIDYgOSAxNyAxOCAxNSA1IDE3IDIxIDI4IDYgOSA2IDggMTAgMjEgMTYgMTEgMiAyMyAxOCAyNyAyOSAxOCA5IAorMTEgMjQgMjQgXgorNTggMSAxMSAxNSAyOSAyOSAzIDMxIDE4IDEyIDE3IDMxIDE5IDggNCAyNSAyOSAxNyAyOSA5IDI1IDYgMSAyIDE4IDE3IDE1IDE5IDE1IAorMSAyNiAxNyAyMCAyNyAzMCAzMCA2IDEwIDE4IDUgOSAxMCAyNiA5IDE3IDIgMzAgMTAgMjggMTcgMSAyNyAyOSAyIDE5IDE2IDggMjggCisxNiAyOCBeCis2MSAxIDMwIDI1IDggOSAxOCAzMCAxNyA0IDYgMzEgMjYgMTYgMjUgMTggMjMgOSAyMCA4IDcgMjUgMjYgMTEgMjcgMTcgMjggMiAyMyAyIAorMTIgMjQgMiA4IDYgMyAxMiAyMCAxNiA0IDEwIDE3IDMwIDEyIDExIDUgMzEgMTkgMTkgMTkgMzAgMTMgMTggMiAzIDggMiAxNyA4IDI0IAorMzAgMjIgMjkgXgorNzAgMCA3IDI2IDEgMTMgMjYgNiA2IDYgMTggMjQgNyA2IDcgMzAgMTkgMTIgMjIgMjQgMjUgMyAxMSAxNyAzIDEwIDEyIDExIDExIDI1IAorNyAxMyAzMSA0IDcgMjcgMTMgMTAgMzAgMTYgMzAgMTYgMjkgNCAyNyA1IDYgMjcgOCAxMiAyOSA5IDEgMTAgOSAyNiA0IDE5IDEgMyAzIAorNCAxNiAxMyAxNyA2IDE2IDE0IDI0IDMgMjAgMjEgXgorNjIgMSAyIDEgMzAgMTQgMTQgMjEgMjkgMTMgMTEgMTAgMjkgMjAgMTkgMjYgMjcgMTkgNiAxNyAyNiAyNiA3IDkgMTMgMTYgOSAzMSAyIAorMjAgMjggMTAgMTAgNCAyOCAzIDI0IDIxIDYgMjkgMTYgMSAyMiAzMSAxIDI0IDkgMTYgMjIgMjggMTEgNyA3IDMgMTcgMTMgMjIgNCAxNyAKKzkgNCAyMSAyMyAyMSBeCis2MiAxIDI0IDE2IDI0IDExIDI2IDUgMzEgMzAgMiAyNCAxNCA5IDIzIDI4IDE4IDQgMTMgMjMgNCAzIDkgOSAxNCAxMiAxMyA4IDIwIDEyIAorMTggNiAyMSAxMiAyNSAzIDI3IDggMjEgMTMgNSAyNiAyMSAxOCAxOSAyMyAxNiAxMiAxNCAyMCAxNyAxNiA3IDE2IDE5IDIyIDkgMTUgCisxMCAzMSA3IDE4IDI5IDcgXgorNjYgMSA3IDIgNSAxNiAxOCAxMCA3IDExIDIxIDIxIDkgOCAxOCAyNSAxOSAzIDYgMTkgMjkgMTAgMyA1IDIzIDE1IDE2IDI3IDI2IDEyIAorMiAxOSAyMyAxIDIyIDMgMTkgMjggNSAyIDkgNCAyMSAxMSAxOCAxIDIzIDYgMzAgMjMgMzAgMjYgMjAgMTEgMjIgMTkgMjcgMiAxNiAxMCAKKzYgNCAyNCAxNyAyMCAyNSAyMCAyMSBeCis2MiAxIDggMjMgMjMgMjAgMzAgMTggMTYgMyAzMCAxNSAyNiAyMyAyOCA3IDIxIDggNyAzMSAzMSAxNCAyNiAxOCAzIDEgMjYgMjggMTUgCisyNSAxMSAzMSAzIDI1IDkgMjEgMjAgMiA2IDE0IDQgOSA1IDI4IDggMTcgMjIgMSA0IDggNyAxMCAxNCAxOSAxMCAxNCA4IDI3IDkgMjQgCisyNiA0IDMwIDggXgorNjIgMSA4IDE5IDUgMjEgNyAyIDI3IDIwIDE2IDIwIDIwIDIyIDE0IDEzIDE2IDI2IDE0IDEwIDMgMjUgMjIgMjUgMjMgMjEgMTAgMTUgCisxNSAyOSA4IDEzIDQgMiAxMyAyMiAyMCA3IDQgMjAgMzEgMTYgMiAyIDI4IDEzIDE5IDE0IDEyIDIzIDI3IDYgMiAxNCAyIDIyIDYgMjUgCiszMCAyOSAzMSAxMyAxNCAyMSBeCis2NSAwIDMxIDEyIDE2IDMwIDUgMTQgMzEgMTEgNCAxIDEgMjUgMjEgMTMgMjYgMjIgMjEgNSAyMiAxNCAyOSAxIDIxIDMgMTQgMzAgNCAyIAorMjkgMTIgMTUgMjMgMyAxNSA1IDEgNiAyMyAyMiAxMyAxIDE0IDI3IDI1IDUgMTUgNiAxMyAzIDIyIDExIDIzIDMxIDI0IDYgNSAyMCA0IAorMTQgMyAyOSA4IDI5IDE5IDMxIF4KKzU1IDEgMjkgMjMgMjUgMjggMTkgMTEgMTUgMjcgMjEgMTQgMSAxOSAyMCAyNiAxMiA3IDEyIDEgMTggMTMgMjkgMjggMjMgMjkgMTQgMjMgCis3IDEgOSAyOSAyNCA1IDMwIDE4IDUgMjUgMjUgMzEgMjUgMTMgNyAyNCAyNSAyNCAxIDEyIDE5IDkgNyA2IDI4IDIwIDE0IDI4IDI3IF4KKzUzIDEgMTkgMzEgMjAgMjAgNiAyNCAxOCAyNyAyNCA0IDE4IDIxIDEgMzEgMTUgMSAxNSAyIDI3IDQgMjYgMjUgNCAyMyAxOSAyIDMxIAorMjIgMzAgMjEgMjIgNSAyNyAxMiAzMCAyOCAyOCAyNyAxNSAxOCAxNCAyNSAxNSAxNyA3IDI4IDExIDI4IDI5IDMwIDEgMTcgMjEgXgorNjEgMCAxMCAyIDE4IDIwIDIxIDIgMTEgMTIgNSA0IDEyIDI1IDE0IDUgNSAyNCAyMiAxOCAzMSAxNSAyMiAyOSAxMSAzIDIxIDMxIDIxIAorMjcgMyAyOCA3IDEwIDI1IDIgMTUgMzAgOSAzMCA3IDIyIDE1IDkgMyAyMCAyNCAyNCAyOCAxNCAxOCA5IDI3IDE0IDIyIDI3IDMxIDEwIAorOCAxNCA3IDE1IDE5IF4KKzU5IDEgMjAgNSAyNiAxIDI5IDcgMTcgMTcgOCAzIDEzIDI3IDE4IDggMzEgMjcgMjggMjIgMjIgMTcgMTkgMTggMTggMTEgMTkgMTMgMjUgCisxMCAxOSA2IDI4IDQgMzEgMjMgMTAgMTggMjYgMzEgNSAxMCAxMyAxMiA4IDE1IDE5IDE3IDExIDE0IDE1IDI0IDE1IDEyIDkgMjIgMTYgCisxNiAyNCAxMyAyMyBeCis1NyAwIDI2IDI0IDI5IDI2IDE1IDEzIDIxIDI0IDIwIDEwIDEwIDIyIDIzIDEzIDYgMTIgMjggMjUgMTIgMiAyMSAyNiAyOCAyNiA4IDE2IAorMTUgNCA1IDE5IDI0IDEyIDMxIDggMzAgMzEgOSAyOCAxMiAzIDI2IDI5IDIyIDI3IDEwIDIwIDEzIDMwIDggMjUgMSA4IDEgNSAxMSAyMCAKKzE2IF4KKzYxIDEgMTIgNCAyOSAxNSAyMSAyNSAyNyA3IDE0IDExIDEgMTEgMTYgMjMgOCA4IDExIDEgMTMgMTUgMjggMSAxNiA1IDggMyAyNCAxMCAKKzIzIDI0IDE3IDUgMTMgMjggMzAgNSAzIDE2IDYgMjAgMjggMzEgNiAyMiAxMCAxMSAyOSAyNSAxNyAyNyAyMiAyNiAzIDIzIDE0IDQgMzAgCisyNyAyMyAyNCAzMSBeCis2MSAxIDE3IDEyIDIxIDE3IDIzIDQgMjIgNyA1IDI3IDEgMjAgMjMgMTIgMjYgMTAgMjQgMzEgMjkgNCAxMSAxNSAxMSA2IDkgMTcgMTggCisxNSA1IDE3IDIxIDI4IDYgOSA2IDggMTAgMjEgMTYgMTEgMiAyMyAxOCAyNyAyOSAxOCA5IDExIDI0IDI3IDExIDE1IDI5IDI5IDMgMzEgCisxOCAxMiAxNyAzMSAxMiBeCis2MCAxIDggNCAyNSAyOSAxNyAyOSA5IDI1IDYgMSAyIDE4IDE3IDE1IDE5IDE1IDEgMjYgMTcgMjAgMjcgMzAgMzAgNiAxMCAxOCA1IDkgCisxMCAyNiA5IDE3IDIgMzAgMTAgMjggMTcgMSAyNyAyOSAyIDE5IDE2IDggMjggMTYgMjEgMzAgMjUgOCA5IDE4IDMwIDE3IDQgNiAzMSAKKzI2IDE2IDE4IF4KKzY3IDEgMTggMjMgOSAyMCA4IDcgMjUgMjYgMTEgMjcgMTcgMjggMiAyMyAyIDEyIDI0IDIgOCA2IDMgMTIgMjAgMTYgNCAxMCAxNyAzMCAKKzEyIDExIDUgMzEgMTkgMTkgMTkgMzAgMTMgMTggMiAzIDggMiAxNyA4IDI0IDMwIDIyIDIgNyAyNiAxIDEzIDI2IDYgNiA2IDE4IDI0IDcgCis2IDcgMzAgMTkgMTIgMjIgMjQgMjggXgorNjkgMSAzIDExIDE3IDMgMTAgMTIgMTEgMTEgMjUgNyAxMyAzMSA0IDcgMjcgMTMgMTAgMzAgMTYgMzAgMTYgMjkgNCAyNyA1IDYgMjcgOCAKKzEyIDI5IDkgMSAxMCA5IDI2IDQgMTkgMSAzIDMgNCAxNiAxMyAxNyA2IDE2IDE0IDI0IDMgMjAgMyAyIDEgMzAgMTQgMTQgMjEgMjkgMTMgCisxMSAxMCAyOSAyMCAxOSAyNiAyNyAxOSA2IDI4IF4KKzYyIDEgMjYgMjYgNyA5IDEzIDE2IDkgMzEgMiAyMCAyOCAxMCAxMCA0IDI4IDMgMjQgMjEgNiAyOSAxNiAxIDIyIDMxIDEgMjQgOSAxNiAKKzIyIDI4IDExIDcgNyAzIDE3IDEzIDIyIDQgMTcgOSA0IDIxIDIzIDE3IDI0IDE2IDI0IDExIDI2IDUgMzEgMzAgMiAyNCAxNCA5IDIzIAorMjggMTggNCAxMyAyNiBeCis3MCAxIDQgMyA5IDkgMTQgMTIgMTMgOCAyMCAxMiAxOCA2IDIxIDEyIDI1IDMgMjcgOCAyMSAxMyA1IDI2IDIxIDE4IDE5IDIzIDE2IDEyIAorMTQgMjAgMTcgMTYgNyAxNiAxOSAyMiA5IDE1IDEwIDMxIDcgMTggMjkgNSA3IDIgNSAxNiAxOCAxMCA3IDExIDIxIDIxIDkgOCAxOCAyNSAKKzE5IDMgNiAxOSAyOSAxMCAzIDUgMjMgMTUgMTYgMTcgXgorNjAgMSAyNiAxMiAyIDE5IDIzIDEgMjIgMyAxOSAyOCA1IDIgOSA0IDIxIDExIDE4IDEgMjMgNiAzMCAyMyAzMCAyNiAyMCAxMSAyMiAxOSAKKzI3IDIgMTYgMTAgNiA0IDI0IDE3IDIwIDI1IDIwIDE1IDggMjMgMjMgMjAgMzAgMTggMTYgMyAzMCAxNSAyNiAyMyAyOCA3IDIxIDggNyAKKzMxIDMxIDcgXgorNjYgMCAyNiAxOCAzIDEgMjYgMjggMTUgMjUgMTEgMzEgMyAyNSA5IDIxIDIwIDIgNiAxNCA0IDkgNSAyOCA4IDE3IDIyIDEgNCA4IDcgCisxMCAxNCAxOSAxMCAxNCA4IDI3IDkgMjQgMjYgNCAzMCAxMSA4IDE5IDUgMjEgNyAyIDI3IDIwIDE2IDIwIDIwIDIyIDE0IDEzIDE2IDI2IAorMTQgMTAgMyAyNSAyMiAyNSAyMyAxNyBeCis2NCAxIDEwIDE1IDE1IDI5IDggMTMgNCAyIDEzIDIyIDIwIDcgNCAyMCAzMSAxNiAyIDIgMjggMTMgMTkgMTQgMTIgMjMgMjcgNiAyIDE0IAorMiAyMiA2IDI1IDMwIDI5IDMxIDEzIDE0IDE2IDMxIDEyIDE2IDMwIDUgMTQgMzEgMTEgNCAxIDEgMjUgMjEgMTMgMjYgMjIgMjEgNSAyMiAKKzE0IDI5IDEgMjEgMyAxNCAyNyBeCis2NCAwIDQgMiAyOSAxMiAxNSAyMyAzIDE1IDUgMSA2IDIzIDIyIDEzIDEgMTQgMjcgMjUgNSAxNSA2IDEzIDMgMjIgMTEgMjMgMzEgMjQgCis2IDUgMjAgNCAxNCAzIDI5IDggMjkgMTkgNyAyOSAyMyAyNSAyOCAxOSAxMSAxNSAyNyAyMSAxNCAxIDE5IDIwIDI2IDEyIDcgMTIgMSAKKzE4IDEzIDI5IDI4IDIzIDI5IDEzIF4KKzU4IDAgMjMgNyAxIDkgMjkgMjQgNSAzMCAxOCA1IDI1IDI1IDMxIDI1IDEzIDcgMjQgMjUgMjQgMSAxMiAxOSA5IDcgNiAyOCAyMCAxNCAKKzI4IDIxIDE5IDMxIDIwIDIwIDYgMjQgMTggMjcgMjQgNCAxOCAyMSAxIDMxIDE1IDEgMTUgMiAyNyA0IDI2IDI1IDQgMjMgMTkgMiAzMSAKKzI4IF4KKzU3IDAgMzAgMjEgMjIgNSAyNyAxMiAzMCAyOCAyOCAyNyAxNSAxOCAxNCAyNSAxNSAxNyA3IDI4IDExIDI4IDI5IDMwIDEgMTcgMTIgMTAgCisyIDE4IDIwIDIxIDIgMTEgMTIgNSA0IDEyIDI1IDE0IDUgNSAyNCAyMiAxOCAzMSAxNSAyMiAyOSAxMSAzIDIxIDMxIDIxIDI3IDMgMjggCis3IDI2IF4KKzU5IDAgMjUgMiAxNSAzMCA5IDMwIDcgMjIgMTUgOSAzIDIwIDI0IDI0IDI4IDE0IDE4IDkgMjcgMTQgMjIgMjcgMzEgMTAgOCAxNCA3IAorMTUgNyAyMCA1IDI2IDEgMjkgNyAxNyAxNyA4IDMgMTMgMjcgMTggOCAzMSAyNyAyOCAyMiAyMiAxNyAxOSAxOCAxOCAxMSAxOSAxMyAyNSAKKzEwIDE5IDE5IF4KKzU5IDAgMjggNCAzMSAyMyAxMCAxOCAyNiAzMSA1IDEwIDEzIDEyIDggMTUgMTkgMTcgMTEgMTQgMTUgMjQgMTUgMTIgOSAyMiAxNiAxNiAKKzI0IDEzIDIgMjYgMjQgMjkgMjYgMTUgMTMgMjEgMjQgMjAgMTAgMTAgMjIgMjMgMTMgNiAxMiAyOCAyNSAxMiAyIDIxIDI2IDI4IDI2IDggCisxNiAxNSA0IDUgMzEgXgorNjYgMSAyNCAxMiAzMSA4IDMwIDMxIDkgMjggMTIgMyAyNiAyOSAyMiAyNyAxMCAyMCAxMyAzMCA4IDI1IDEgOCAxIDUgMTEgMjAgOSAxMiAKKzQgMjkgMTUgMjEgMjUgMjcgNyAxNCAxMSAxIDExIDE2IDIzIDggOCAxMSAxIDEzIDE1IDI4IDEgMTYgNSA4IDMgMjQgMTAgMjMgMjQgMTcgCis1IDEzIDI4IDMwIDUgMyAxNiAyMSBeCis1OSAwIDIwIDI4IDMxIDYgMjIgMTAgMTEgMjkgMjUgMTcgMjcgMjIgMjYgMyAyMyAxNCA0IDMwIDI3IDIzIDI0IDIxIDE3IDEyIDIxIDE3IAorMjMgNCAyMiA3IDUgMjcgMSAyMCAyMyAxMiAyNiAxMCAyNCAzMSAyOSA0IDExIDE1IDExIDYgOSAxNyAxOCAxNSA1IDE3IDIxIDI4IDYgOSAKKzYgOCAyNiBeCis1OSAwIDIxIDE2IDExIDIgMjMgMTggMjcgMjkgMTggOSAxMSAyNCAyNyAxMSAxNSAyOSAyOSAzIDMxIDE4IDEyIDE3IDMxIDE5IDggNCAKKzI1IDI5IDE3IDI5IDkgMjUgNiAxIDIgMTggMTcgMTUgMTkgMTUgMSAyNiAxNyAyMCAyNyAzMCAzMCA2IDEwIDE4IDUgOSAxMCAyNiA5IAorMTcgMiAzMCAyNCBeCis2MSAwIDI4IDE3IDEgMjcgMjkgMiAxOSAxNiA4IDI4IDE2IDIxIDMwIDI1IDggOSAxOCAzMCAxNyA0IDYgMzEgMjYgMTYgMjUgMTggMjMgCis5IDIwIDggNyAyNSAyNiAxMSAyNyAxNyAyOCAyIDIzIDIgMTIgMjQgMiA4IDYgMyAxMiAyMCAxNiA0IDEwIDE3IDMwIDEyIDExIDUgMzEgCisxOSAxOSAxOSAyNSBeCis3NCAwIDEzIDE4IDIgMyA4IDIgMTcgOCAyNCAzMCAyMiAyIDcgMjYgMSAxMyAyNiA2IDYgNiAxOCAyNCA3IDYgNyAzMCAxOSAxMiAyMiAKKzI0IDI1IDMgMTEgMTcgMyAxMCAxMiAxMSAxMSAyNSA3IDEzIDMxIDQgNyAyNyAxMyAxMCAzMCAxNiAzMCAxNiAyOSA0IDI3IDUgNiAyNyAKKzggMTIgMjkgOSAxIDEwIDkgMjYgNCAxOSAxIDMgMyA0IDE2IDE2IF4KKzY0IDEgMTcgNiAxNiAxNCAyNCAzIDIwIDMgMiAxIDMwIDE0IDE0IDIxIDI5IDEzIDExIDEwIDI5IDIwIDE5IDI2IDI3IDE5IDYgMTcgMjYgCisyNiA3IDkgMTMgMTYgOSAzMSAyIDIwIDI4IDEwIDEwIDQgMjggMyAyNCAyMSA2IDI5IDE2IDEgMjIgMzEgMSAyNCA5IDE2IDIyIDI4IDExIAorNyA3IDMgMTcgMTMgMjIgMjcgXgorNjUgMCAxNyA5IDQgMjEgMjMgMTcgMjQgMTYgMjQgMTEgMjYgNSAzMSAzMCAyIDI0IDE0IDkgMjMgMjggMTggNCAxMyAyMyA0IDMgOSA5IAorMTQgMTIgMTMgOCAyMCAxMiAxOCA2IDIxIDEyIDI1IDMgMjcgOCAyMSAxMyA1IDI2IDIxIDE4IDE5IDIzIDE2IDEyIDE0IDIwIDE3IDE2IAorNyAxNiAxOSAyMiA5IDE1IDEwIDMxIDEgXgorNjggMSAxOCAyOSA1IDcgMiA1IDE2IDE4IDEwIDcgMTEgMjEgMjEgOSA4IDE4IDI1IDE5IDMgNiAxOSAyOSAxMCAzIDUgMjMgMTUgMTYgCisyNyAyNiAxMiAyIDE5IDIzIDEgMjIgMyAxOSAyOCA1IDIgOSA0IDIxIDExIDE4IDEgMjMgNiAzMCAyMyAzMCAyNiAyMCAxMSAyMiAxOSAKKzI3IDIgMTYgMTAgNiA0IDI0IDE3IDIwIDI1IDIwIF4KKzYzIDAgMTUgOCAyMyAyMyAyMCAzMCAxOCAxNiAzIDMwIDE1IDI2IDIzIDI4IDcgMjEgOCA3IDMxIDMxIDE0IDI2IDE4IDMgMSAyNiAyOCAKKzE1IDI1IDExIDMxIDMgMjUgOSAyMSAyMCAyIDYgMTQgNCA5IDUgMjggOCAxNyAyMiAxIDQgOCA3IDEwIDE0IDE5IDEwIDE0IDggMjcgOSAKKzI0IDI2IDQgMzAgMjQgXgorNjQgMSA4IDE5IDUgMjEgNyAyIDI3IDIwIDE2IDIwIDIwIDIyIDE0IDEzIDE2IDI2IDE0IDEwIDMgMjUgMjIgMjUgMjMgMjEgMTAgMTUgCisxNSAyOSA4IDEzIDQgMiAxMyAyMiAyMCA3IDQgMjAgMzEgMTYgMiAyIDI4IDEzIDE5IDE0IDEyIDIzIDI3IDYgMiAxNCAyIDIyIDYgMjUgCiszMCAyOSAzMSAxMyAxNCAxNiAzMSA1IF4KKzY3IDAgMTYgMzAgNSAxNCAzMSAxMSA0IDEgMSAyNSAyMSAxMyAyNiAyMiAyMSA1IDIyIDE0IDI5IDEgMjEgMyAxNCAzMCA0IDIgMjkgMTIgCisxNSAyMyAzIDE1IDUgMSA2IDIzIDIyIDEzIDEgMTQgMjcgMjUgNSAxNSA2IDEzIDMgMjIgMTEgMjMgMzEgMjQgNiA1IDIwIDQgMTQgMyAKKzI5IDggMjkgMTkgNyAyOSAyMyAyNSAyMSBeCis1OCAwIDE5IDExIDE1IDI3IDIxIDE0IDEgMTkgMjAgMjYgMTIgNyAxMiAxIDE4IDEzIDI5IDI4IDIzIDI5IDE0IDIzIDcgMSA5IDI5IDI0IAorNSAzMCAxOCA1IDI1IDI1IDMxIDI1IDEzIDcgMjQgMjUgMjQgMSAxMiAxOSA5IDcgNiAyOCAyMCAxNCAyOCAyMSAxOSAzMSAyMCAyMCA2IAorMjQgMjIgXgorNjAgMCAyNyAyNCA0IDE4IDIxIDEgMzEgMTUgMSAxNSAyIDI3IDQgMjYgMjUgNCAyMyAxOSAyIDMxIDIyIDMwIDIxIDIyIDUgMjcgMTIgCiszMCAyOCAyOCAyNyAxNSAxOCAxNCAyNSAxNSAxNyA3IDI4IDExIDI4IDI5IDMwIDEgMTcgMTIgMTAgMiAxOCAyMCAyMSAyIDExIDEyIDUgCis0IDEyIDI1IDE0IDIyIF4KKzYwIDEgNSAyNCAyMiAxOCAzMSAxNSAyMiAyOSAxMSAzIDIxIDMxIDIxIDI3IDMgMjggNyAxMCAyNSAyIDE1IDMwIDkgMzAgNyAyMiAxNSAKKzkgMyAyMCAyNCAyNCAyOCAxNCAxOCA5IDI3IDE0IDIyIDI3IDMxIDEwIDggMTQgNyAxNSA3IDIwIDUgMjYgMSAyOSA3IDE3IDE3IDggMyAKKzEzIDI3IDMxIF4KKzU4IDAgOCAzMSAyNyAyOCAyMiAyMiAxNyAxOSAxOCAxOCAxMSAxOSAxMyAyNSAxMCAxOSA2IDI4IDQgMzEgMjMgMTAgMTggMjYgMzEgNSAKKzEwIDEzIDEyIDggMTUgMTkgMTcgMTEgMTQgMTUgMjQgMTUgMTIgOSAyMiAxNiAxNiAyNCAxMyAyIDI2IDI0IDI5IDI2IDE1IDEzIDIxIAorMjQgMjAgMTAgMTAgMjUgXgorNjUgMCAyMyAxMyA2IDEyIDI4IDI1IDEyIDIgMjEgMjYgMjggMjYgOCAxNiAxNSA0IDUgMTkgMjQgMTIgMzEgOCAzMCAzMSA5IDI4IDEyIAorMyAyNiAyOSAyMiAyNyAxMCAyMCAxMyAzMCA4IDI1IDEgOCAxIDUgMTEgMjAgOSAxMiA0IDI5IDE1IDIxIDI1IDI3IDcgMTQgMTEgMSAxMSAKKzE2IDIzIDggOCAxMSAxIDEzIDIxIF4KKzYwIDEgMjggMSAxNiA1IDggMyAyNCAxMCAyMyAyNCAxNyA1IDEzIDI4IDMwIDUgMyAxNiA2IDIwIDI4IDMxIDYgMjIgMTAgMTEgMjkgMjUgCisxNyAyNyAyMiAyNiAzIDIzIDE0IDQgMzAgMjcgMjMgMjQgMjEgMTcgMTIgMjEgMTcgMjMgNCAyMiA3IDUgMjcgMSAyMCAyMyAxMiAyNiAKKzEwIDI0IDMxIDExIF4KKzY0IDEgNCAxMSAxNSAxMSA2IDkgMTcgMTggMTUgNSAxNyAyMSAyOCA2IDkgNiA4IDEwIDIxIDE2IDExIDIgMjMgMTggMjcgMjkgMTggOSAKKzExIDI0IDI3IDExIDE1IDI5IDI5IDMgMzEgMTggMTIgMTcgMzEgMTkgOCA0IDI1IDI5IDE3IDI5IDkgMjUgNiAxIDIgMTggMTcgMTUgMTkgCisxNSAxIDI2IDE3IDIwIDI3IDI1IF4KKzY0IDAgMzAgNiAxMCAxOCA1IDkgMTAgMjYgOSAxNyAyIDMwIDEwIDI4IDE3IDEgMjcgMjkgMiAxOSAxNiA4IDI4IDE2IDIxIDMwIDI1IDggCis5IDE4IDMwIDE3IDQgNiAzMSAyNiAxNiAyNSAxOCAyMyA5IDIwIDggNyAyNSAyNiAxMSAyNyAxNyAyOCAyIDIzIDIgMTIgMjQgMiA4IDYgCiszIDEyIDIwIDE2IDQgMzEgXgorNjAgMCAyOCA1IDI0IDE2IDEwIDI3IDI4IDE5IDI5IDE5IDIyIDEwIDIzIDE3IDI1IDcgMjYgNSA1IDI3IDEgMjAgMjQgMTMgMjcgMTYgCisyNCAzMiAzMSA1IDEyIDIxIDEzIDYgMTEgMjEgMjAgMTUgMyAxNCAxOCAzMiAyIDkgNiAxMCAxMyAyMyAxNiAxNyAzIDIwIDE5IDI3IDI5IAorMjEgNSAxMSAyOCAxNCBeCis8RAorCitIPlNIUyBUeXBlIDIgU3RyaW5nczxICitEPgorNjAgMSAxNiAxMyAxOSA1IDE2IDE0IDI3IDIgMjIgNyA1IDI4IDE1IDE4IDI1IDE3IDEzIDEyIDI5IDI0IDIxIDI5IDI1IDE2IDUgMTcgCisyMiAyNCA4IDggMTggMyAxMyAxMCAyOCAzIDIzIDI4IDEyIDggMyAyNSA1IDI1IDI0IDcgMTQgMzAgMjcgMzIgMzAgMjMgOCAxNSAyNyAKKzI4IDEzIDggMTIgMjEgXgorODYgMSAzMyA1IDQwIDI2IDMgMTkgMTIgMzYgNDMgNSAzNSAzNyA1IDE0IDExIDQ1IDM1IDE2IDEwIDggMzIgNCAxNSAzNSAyNiAyIDM5IAorMjIgMzcgMjIgMzAgMjkgMjggMzYgNDUgMTQgMzYgNCAyOSAzNyAzMCAzNCAzNiAyMCA5IDQyIDI5IDkgMTEgMTEgMTggNDIgMTMgNiAyMCAKKzQyIDIwIDMwIDIyIDM1IDM0IDYgMTQgNDEgMTkgMzAgMTcgMzUgMzMgMjYgNDEgMTUgNSA0NCAzOSA4IDIwIDMgNDQgMzIgMTUgMTggMTAgCisxNSAxMCAzNiBeCisxMTIgMCAxMCA0NCAyNCA1MyAzNSAyMiA0MCAyMCAxNSA1MSAyMiAxOCAyMiA0MiA2IDU0IDQ5IDM4IDIxIDcgMTMgMzAgMTYgNyA1MiAKKzE2IDIyIDEzIDM4IDcgMTEgNDQgMzMgOSAyNSAxMyAzNyA0MiAxNCA0NSA1MyAzMCAzOCA1IDI1IDUgMzUgMzggMjIgMjggMTAgMjkgNTIgCiszMSAzOSAzNSAyMyA1IDE3IDE0IDMxIDQ2IDUgNDEgNTQgNDMgMzMgMTMgMjMgNDYgNDUgMyA0NiAzIDU1IDE1IDYgNTMgMjggNTIgMjIgCisyNyA0NSAzMiA1MyA1MSAxNSAzNyAxNSA0OSAzNiAzNSAzNSAxNSAzIDEzIDIyIDI1IDMgNCAxMCAyNCAxMiA3IDQ0IDI1IDE4IDIxIDIxIAorMjAgNTUgMjQgXgorMTIzIDEgNDMgOSAxIDUyIDQgMjEgNDkgNjEgMTggNTAgMjMgMTMgNDYgNjIgMjMgNDUgNjIgOSA1NiAxOCAyMyAzMSA4IDMwIDI3IDM2IAorMTMgMzggNCA1OCA1MyA0NyAyNCAxOCA0MSA1OCAxOSAxMiAxOCA1MiA0MiAyOSA0NCA0NSAyNiA2MyAzNCAzMiA0MSA2NCAxNSAyNiA1NSAKKzE5IDIgNDkgNiAzMCA1MyAxMyA1NCAxMiA1MyAzNyAxMiAzNyAyOSA2MCA1MyAyMSA0NyA0MiA0NSA1MiA0MCAxMCAyOCA0NyA0MyAxNyAKKzE2IDE3IDYxIDM2IDEyIDM0IDYwIDM3IDEzIDUyIDU4IDM3IDM5IDI5IDM0IDExIDQ1IDggMzYgMSA1MCA1MCA1IDUxIDEzIDE1IDMyIAorNTEgMzMgNjEgMTYgMzEgNTAgNTggNjMgMTYgNSAzMCAxNyAyNCAxMCAyNiA1MiBeCisxNDQgMSA2NCA2MiA2MyAzMCAxNSAxIDM1IDI4IDE2IDQwIDIwIDE0IDUwIDMzIDE5IDM4IDMwIDI3IDU1IDEwIDE2IDQ2IDQ3IDcgNTUgCisxMiA1MyAyNiA1NiAzMyAyOSA1NSAyNSAxNyA0OCA0MyAyMSA0MyAxOCAyNCA2MyAyNyA2OCA0NiAzOCAzMyAzNSAxMCAxOCAxMSAyNyA1IAorOSA1OCAzNSA3MCAzNiAzNiAzOSA0NyAyIDEwIDY2IDQ3IDUgMTggMjEgNDQgNzEgNTEgNTcgMyAyMiA3IDU2IDU1IDI4IDI1IDE0IDQwIAorMTYgMjQgNDggMzcgNjYgNTAgMjQgNDUgMTggMzkgNTMgMjkgNjQgNjAgMjYgNTAgNiA0NyA2MSA0NiA0NCA2MCAxNyA0IDU4IDQ1IDI2IAorMjAgMjYgMzIgOCA3IDY4IDM3IDMgMjQgNDQgNDcgNjQgNTQgNzEgNTcgMTIgNjggMjcgNTggMjkgNTQgNDMgNDIgNjAgMTMgMTQgNTYgCis0OSAxIDMyIDkgNjEgNDMgMzYgMzMgMjAgNTkgXgorMTY2IDAgNyAzOCA1NyAzMyA2MSA3MyA3IDY0IDEgNDkgMzUgNzYgMTQgMjcgMjEgNDUgNjggMzggNTggNzMgMTMgNzIgNDcgNzMgMzMgOCAKKzY2IDIzIDM4IDQgNTYgNzcgNDcgMTAgNzEgMTMgMjAgMzEgNDEgNiA1MSAzIDE4IDE3IDYxIDQ3IDE0IDQ4IDc2IDQ2IDI4IDM0IDQzIDEgCis1NiA0IDI1IDcgNjUgNDEgMSAzNCAzNyAyMyA1OSA1OSAyNyAyNiAxMyAxNSAxNCA3NSA2MCAxNCAxIDI4IDU5IDI2IDY1IDYxIDE2IDIzIAorMTcgMjggNiAxOSAyIDM1IDQ5IDMwIDI5IDQ4IDIgNjMgNzMgNTkgMSAzIDc2IDQxIDExIDE5IDE4IDQzIDU0IDYzIDY3IDUxIDQgOSA3OCAKKzYwIDggNzIgMzEgMzUgNzcgNTQgNTggMjAgMzYgNTggNTEgNzYgNDAgMjAgMzcgNDkgMyA3NSAxIDI5IDIwIDU3IDY0IDIyIDI1IDYgMjUgCis1OSAzMiA0MyA1OCA0MCA1MSA3NyAxIDIgMzYgMTAgMTIgMjggMzkgMTEgNDYgMiA0MSAyNyAyNyA1MyA3NiAxMyA2NiA2OSA3NiAyOCBeCisxODYgMSA1IDczIDM4IDMwIDMwIDQ4IDIxIDc1IDgwIDQwIDIxIDggNTMgOSAyNiAzMCAzNCA4MSA3MSA3MSA1MSAyMyA3NSAzMyA0MSAKKzIzIDMyIDUgOCA2NiA0MCA3MiA0MCAxNiA2NiA0NSAxNCA0OCAzNCAyMSA0MSAyNyAzIDU1IDI3IDM3IDIzIDQxIDY1IDQgNTcgNTEgNzQgCisyMiAxOSA3NSA0MiAxNiAxOSA0NiAxNiAxMCA0OCAyMCAxOSAzNyA0MSAxNCA1NyA5IDE3IDU1IDM4IDUgNjAgNyA0NiAyMCA0MyAzNiAKKzM5IDUyIDIwIDEwIDYyIDQ1IDIzIDQ2IDcgMzUgNzUgMjkgNzAgMzUgMzYgMzQgMjUgMTIgMTUgODQgMjYgMTAgNiA3MSAyOSA3OSAzMyAKKzMyIDI1IDU5IDc2IDgyIDY0IDU4IDcgOCAxOSA0MSA3NCAyIDUzIDY1IDI0IDEgNTUgNTEgMzYgMjEgNzkgMjggNSAxNyA0MSAzNiA2MyAKKzUxIDE4IDQ4IDI1IDQ2IDQ1IDM2IDc3IDc2IDIyIDU3IDE0IDQ0IDYzIDU2IDQ1IDU2IDIwIDEgNjQgNDkgOSAxMiAyOCAzMCA3MiA4MiAKKzczIDMzIDMgMjIgMzAgNDMgNTYgNjcgNjIgMiA1NyAxMyA1MCAyMCA1NyAzOCA0MyA2MSA5IDggNTcgNjUgNzYgOSBeCisxODMgMSA1NCAzNCA4MyAxMCAzMyA1MSA4NiA4MSA4MiA2OSAxOCA4IDIyIDY0IDE5IDg2IDYyIDU4IDMzIDM3IDE3IDM0IDUgMjkgODMgCis0MiA3NiA1MCA1NCA2NiAzOSA5IDEgMzYgNDMgMTcgNjUgNiAzNSA1NiA3MiA3MSA4MyA4OCAxMCAxIDggODcgMjIgNiAyMSA3OCAyNSAKKzg5IDQzIDYyIDQwIDU1IDg1IDMxIDg5IDc0IDYzIDQ2IDI4IDI0IDI2IDMxIDE3IDcgOCAyNyAxOSAxMiA4NSAxNyAyMCAyNyA3NyAxMCAKKzIgNTQgODAgMTcgNTIgNzQgNzYgNjkgNzggMTEgMjAgODAgNCAyOSAyNCA4NSA3NSAxOCAzOSAyMyA3MCA4MyAyOSA1NyA2NyA3MiA3MCAKKzMzIDQgMTUgNDYgNDIgMiA2OSAxMyA1MyAzMyA2OSA2NCAzMyA2NCAxNCA0MCA2OSA1OSA3OCA3MSAxOSA4NSAxNiA2NSAzOCA4MiA1NSAKKzQwIDU2IDQwIDI0IDg0IDI5IDI1IDQ0IDY4IDEzIDg1IDc2IDY0IDMyIDE4IDI1IDQ1IDIzIDYgODAgMzEgMzAgMzAgNTggMTQgMTMgNzIgCis1NyAxNCA0MSAyOCA1MiA3MyAyNiA3NiA4MyA1NiA1NCAyIDM2IDExIDY1IDY2IDM4IDUwIDggNDEgODggNzcgXgorMjAwIDEgMjUgNTcgNDAgNDYgNzggNTcgMzQgNzggNjEgMzYgNjYgNTcgMzggODAgMjIgMzIgNjggNzEgMzAgNzQgMzcgODEgNjYgNzcgCis2NiA1NSAyIDUxIDI0IDkzIDYxIDQwIDY4IDQ1IDYxIDEyIDYzIDI0IDg5IDU5IDUyIDcyIDQzIDIwIDIwIDY5IDM2IDQwIDg4IDQ2IDkgCis2MiA1NSA3NyA4NCAyMCAxOCA2IDc3IDE1IDUyIDM5IDc1IDMgMjYgNCA4NSAxNyA2MiAyOSAxMSA5MiA0NiA1OCAyOSA1OSAyOCA0MiAKKzgwIDcxIDk2IDIgNDkgODUgMzcgNjMgNCA2MSAxNCAyIDUzIDg3IDI1IDg2IDYgNzUgNzYgOTMgNDEgMzkgOTMgOTIgNDIgNTYgNDEgNjMgCisyNiAyOCAxOCA3NyAxMSA1MCA3OCA3OSAxIDEyIDEyIDkxIDI5IDEzIDU4IDUgNTYgOTIgNjYgNTkgNCAzOSA0NyA5NSA1IDUgNjIgMzMgCisxMyA4MCA2OSA2MCA0MyA1MSAyMiAzMCAzMiA0MiA1IDM4IDMgNTAgNyA0OCA5MCA1NiA5NiA2OCA0NyA0MSA2MSA2MCA5NiAyMCAxNCA0IAorMTkgMTkgMjMgMjUgMTMgOSAzOCA1MiAxNyAxMSA5NiA0OCAxOSAyNSA4OCA0MiA3IDc0IDU5IDQ4IDcwIDU1IDI0IDE4IDI4IDQ0IDQ2IAorMyAyNCAzOCA1NiAxOSA5NiAyMiA1MCA2MCAxNyA5NiBeCisxOTUgMSAyNSA1MSA0NSAzNSA2NiAxOSA2MSA2MCA5IDMxIDkzIDY0IDcwIDMwIDQyIDg2IDUzIDEgNzEgNDYgNDIgMjIgMzggOTYgMTAgCis5OSAzNCA3NiAyNiA1NSA3MyA2MyA2MyA5NyAyMyA5MiA4MSA2NCA0NiAxIDMwIDMxIDM1IDg2IDkxIDg4IDY0IDg3IDE2IDM3IDY5IDg0IAorOTQgNjAgMTAwIDMgNDcgNTIgOCA3MSA4NyA1NyAyOSA3NiA0MyAxOCA0NSA0NiAxNSA2NSAxMiA0NCA0MiA2NiA2MCAxNSA2OCAxOSA1OCAKKzM5IDYyIDc2IDkgOTIgMTAxIDU3IDMyIDQgMzQgMTUgNDEgNjIgMzIgODkgNzEgNDMgMzUgMzEgNDEgMjEgMTcgODIgMzMgOTYgMjcgNjIgCisyOSA4MiA1NyA0NiA2MiAxNSAyNCA5OSAzNyA4MyA0MCA1MiA0NiA1NiA4MCA5OCAzIDkxIDc0IDYgMjcgNyA1OCA5NCAxMCA0MSA3OSAKKzk3IDg0IDc3IDc0IDI2IDk5IDk1IDYxIDE5IDE3IDI0IDU1IDE1IDg1IDg0IDMwIDQ1IDkzIDQ0IDEwMCA0NCAzOSA1OSA0NiAxOCA5NSAKKzMgNDEgMTUgODIgNzcgMTYgNDggMTggNTEgODMgMjAgODIgNjAgNTMgNTMgMTIgOTkgOTIgNTQgNSA5OSA1MSAzOSAxMDAgNjEgMiAzMSAKKzUyIDQ5IDg2IDk0IDE2IDc4IDg0IDkxIDQyIF4KKzIxMiAwIDU2IDk4IDE2IDk4IDc4IDIyIDcyIDMzIDEwMyAxMDQgNTIgODQgMTIgNjUgMTUgODUgMTAxIDk3IDg0IDMxIDUxIDI2IDEwMCAKKzEwMCAzOCA4MCAxMyAyIDc4IDcgMjQgNDQgODQgMTAzIDI3IDcgMjggMTYgMzMgOTkgMjUgMTAzIDU0IDE0IDQyIDYyIDg3IDkyIDI3IAorMjIgNDIgNSA1MiAxMDAgODQgNzMgNzIgNjMgMjQgNDggNTYgNTIgMjMgNSAxNyA3NiAzMSAxIDk1IDU4IDQzIDYwIDUwIDYyIDMwIDIzIAorMzUgNzkgMjAgMzUgMyA3MiAzMiA0NSA1MSA4NyA0MSA4NCAyNyA3OSA3NyA3MCAxMDIgMTUgNTQgMTUgMTAwIDggNTIgNjkgMTA1IDMgCiszMCA4NCA0MiA5MyA2NiA4OSA2OSA3NCAyNCAzMyA0MiA5NyA0IDM4IDk5IDEwNiAxMyA5MyA2IDEwNiA3NCAxMDAgNTQgNDUgMjEgNTkgCis1NiAzNyA5IDUwIDMyIDc1IDc5IDMxIDc3IDkgNjEgMSA4IDY4IDYgNjAgODEgNyAxMDAgOTkgMTQgNjEgNDggMjUgNzMgMjYgNzAgNzIgCis5NCAzIDExIDk4IDMxIDUgNjcgNyAzOSA5MiA3MyA4OCAxMDEgMzIgMTA1IDM0IDgyIDgxIDExIDcyIDQ4IDEwIDU5IDcxIDUxIDcxIDM1IAorMzMgMjcgNDkgNDkgMTkgOTggNDcgNDMgNzUgNjQgMTcgMTUgMjQgOTQgNDkgNCA4NCA1OCA1OCA3NCAzOSA0NyAxMDQgODIgNSA2MyA2OSAKKzkwIDE5IF4KKzIzNiAxIDI5IDc5IDQxIDQwIDcyIDUxIDEyIDkyIDM0IDUyIDQ0IDY5IDEwNCAyMSA5NyA4OSA5NiA0OCAyMSA0IDYxIDQwIDI4IDY3IAorMzQgMjMgODUgNDQgMjIgNjIgNTIgMzMgODQgMjMgMzAgNzMgNzQgNCA3OSAxMiA4MSA0NyA4MCA1MyA0NyA4OSA0MCAxOSA4MCA2MiAzNCAKKzYxIDI5IDQxIDk1IDQzIDEgNzAgNjMgNTUgNTMgMTggMTkgMTMgNDggMTAgMTkgODkgNDkgNCA1MiA1MyA1NiA3NiAxMCA4IDEwNCA3NyAKKzE1IDI4IDM4IDc1IDEwOSAzIDg1IDkwIDggNDAgOCA5MyA5MCA0MyAzOSAxNCA2MCAxNyAzNiA3OCA1NiAxMDUgODAgMzUgNzUgMzYgNTggCis4MiA1MCAxMDAgOTggNDUgNzQgMTMgNjYgOTUgNzIgNzEgOTUgMzQgMTQgOTggNzIgMzMgMzggMzcgNTIgNiAxNCAxMDcgNTkgMyAyOSAKKzYxIDY3IDk4IDkyIDUgOTMgMTcgOTggMzYgODcgNDEgNzUgNzEgNTcgODggMTcgMjUgOTEgODQgMyA1OCAyMCA5MiA2OSA1MSA1MCAzNiAKKzMxIDE0IDI1IDE4IDMwIDE4IDEgNDEgMTA0IDMwIDgyIDU5IDg3IDcwIDM0IDk2IDI4IDQ3IDYyIDgxIDEwMyAxMDkgMTAzIDEwMCA3IAorMTcgMTYgMTA0IDEgMTIgMzQgNSAxMDIgNDIgMTYgMjIgNzEgMzkgNSA3MyA0NSA0NSA1NCA0MSAxMyAyIDI2IDQxIDIyIDEwMCAxMDkgCiszMCA0NCA0IDkwIDEwOCA1MyAzOCAxMDQgNjggMjggNTYgNDcgNTEgOTQgMjIgNyA4MSA4NSAyNiA1MCA5IDcyIDk4IDU0IDU5IDk2IDUyIAorXgorMjMyIDEgOTIgNzIgNDcgMzcgMzMgMzggOTIgMTcgOCAyOCA4OCAyMiA2MiA2OSAzMiA4OSA3NSAzIDcyIDk2IDg1IDEzIDEwNSAyNCAzOCAKKzM3IDk0IDExNSA4MyA3MiAxMDggMTE0IDI0IDkzIDc2IDEwMyA2MCA5OSAxMDIgOSA0MyAxMCA1OSA5NSA0NiAzMyA5MyAxNSAyNiA2OSAKKzQ0IDIgODYgMTA3IDU1IDQ1IDYxIDY1IDkyIDY2IDkgNTUgMzkgNzAgODMgMjkgOTggNjcgMTMgMTExIDE1IDIwIDMxIDYyIDggMiA1MSAKKzIwIDE5IDMzIDQ0IDE0IDExNSA3MSAxMTIgOTcgMTAgNDEgMjggNTMgNTEgMjYgNTcgMTUgMzggOTggNTUgMTA2IDIyIDU2IDMxIDUwIAorOTUgMTA3IDExMCA4NCA3MCAxMCAxMDggOTYgNzMgMTAwIDI1IDM2IDU1IDg4IDcxIDYzIDk2IDMwIDkwIDk2IDc5IDIyIDcgMzAgMjMgCisyOCA1OSA4OSA4IDUxIDk5IDQ3IDg2IDM0IDE4IDQzIDY1IDk4IDEwNCAxMDcgNDkgNyA3OSA3MSA4IDU3IDIxIDI5IDgwIDIgNzQgNzggCis0NCA1NyA5IDYxIDIyIDEzIDY4IDUyIDkxIDc0IDk4IDQzIDMwIDU4IDY4IDk1IDEwMSA3MiAxMDIgNzYgNDIgOTkgMTA4IDQ3IDI1IDczIAorMjcgMTA0IDM0IDU5IDUyIDM2IDEwNCAyMCA5OCAxNCA5NyA0IDUwIDQ2IDEwNiA4MyAxNyAyMiAxMDUgNzkgNzcgNDYgMzkgMTUgMTEzIAorMjAgMzcgMTAwIDEwNiA2NSA2NiA3NiA3IDEyIDcyIDM1IDggMjIgNTAgNDAgNjggMTAxIDIzIDU0IDk2IDQ0IDUxIDg3IDE4IDYgNDYgCisxMTAgXgorMjQ1IDAgNzAgMzAgODEgNDYgNTMgMTE5IDg1IDYgMTA0IDQ3IDkyIDcyIDcwIDUgNzAgMTUgMTE1IDY4IDEwNSAzMyA5NyAxMyA4NSAKKzEwNiAxNCA2MSAyOSAyMiA4NiA0NSA1NyA2OSA5MSAzOCAzOCAyOCA2NiAxMyA2MCA5NSAxMDMgMyAxNSA1IDExMyAzOCAyMyA2MiA1IAorNjUgOTQgMTA3IDczIDEwNCAzNyA0NyAxMDIgMTE3IDMgNzggMzUgNyA5NSA1NiA3OCA0NSA1MiAyOCA0NiA0MyAzNyAzMiA1MyAxOSA1NSAKKzI5IDQ3IDk3IDc2IDExNSA4MyA3MSAxMSA0NSA2MiA3MyA5OSAxMTYgMiAyNCAxMTYgNyAyOCA0MSAyIDI5IDM3IDUyIDIzIDUgMTE4IAorNzkgMzEgNTcgODkgNjEgMjQgMTAxIDc4IDUwIDkzIDczIDQxIDcgMzMgNDUgNDcgMjQgMSA0OCA3MyAzNiAzIDI1IDg3IDQ2IDI4IDEwOCAKKzU0IDY4IDUzIDY3IDExOSAyOCAzNiAxMTggMTA0IDQyIDg4IDI3IDExMiA0IDc0IDg1IDEgNjMgMzkgOTcgNzEgNzQgNzUgNzYgMTAgNDkgCisxMiA3OSAxMSA1MCAxMDMgMTE4IDk0IDExNyAxMTggMzcgMjcgMTIgOTQgNjAgMjggNTEgNDcgODIgMTEwIDE3IDE1IDEwNSAyMyA1MiAKKzQzIDEyIDIxIDIyIDgxIDQxIDEyIDc0IDkwIDQyIDEwOCAxMTcgOTggNjcgNCA2OSA0NCA3NiAxMDUgMzggMTAxIDIxIDgwIDcwIDEwIAorMTExIDIzIDExMCAzMiAxMDEgODMgOTEgMTAxIDMxIDUgMyA4MyA3NiAxNSA5MCA1NyA3NCA5NSA0NiAzMyAxMTIgNjIgNjMgNTQgNjMgCis0OSA1OSA0IDY0IDQwIDY4IDExMCA3NCAxMDUgOTEgODYgMTAyIDI3IDU1IDM0IDg4IDU1IF4KKzI0MCAwIDU1IDc5IDc1IDg0IDExMyAyMiA0IDExMyAxMDkgMzEgMzMgMTcgOTYgMTEgMjkgNjMgOTggMTAzIDEwNyAxMTYgMzQgMTQgOSAKKzk1IDM4IDE4IDUxIDc1IDMzIDEwOSAxMTggNTUgNjYgNCA3NiA3IDc1IDcwIDgyIDc0IDIzIDEgMjYgNjkgNDAgMTEyIDk5IDQ3IDY1IAorMzEgNzAgMTE5IDUyIDEwMyA4OCA4NSA4NiAyOCAxNiAxMiA3NiAyNSAyMiA3OCA2NCAyMSA4NiAyNyA2MSA3NyA3MiAxMDggMiAxOCAKKzEwNiAxMTkgMTIxIDU0IDE2IDg1IDcyIDIgNzMgMjYgODggNjYgNjAgODAgMzUgMjQgMTE3IDYzIDI0IDQ0IDY3IDUyIDEyMiAxMTkgMzMgCis3MiAxNiA5OSA5OCA2OSA1NCAxOSA0MiAyOCA1MyAxMTQgMzIgMTE3IDgxIDEwMCA1NyA0OSAxMjMgNTYgMjEgNjggODAgNTMgOTUgMSAKKzQ1IDk1IDEwNyA5OCA4NyAxIDI3IDI0IDk5IDExNiAxNiA2NyAxIDExMyA5MSA4NCAyNSA0MCAyNSA3MiAzIDI4IDkwIDg3IDExMiA4MCAKKzE2IDExNyA0NSA3NyAzNiA5MCAxMDUgNTkgODggMTIyIDY0IDEwOCAxMDggNzEgOTggMTggNTAgMTE1IDkzIDEwNSA3NyAzNSA2IDQ2IAorNTUgNDcgMTAyIDQgMjYgODcgMTExIDEyMCA4MSAxMTMgNCA1NyAxMDUgMyA4NCA5NCAxMTUgNjEgMyAxMjEgNzIgNzEgMjQgNjIgMTQgCis2MCA5OSA2MSA5NiAxMDMgNTEgMTA3IDYgNjUgODEgMTE0IDgzIDEyMSAxMDkgNDkgMTA0IDMwIDczIDgyIDkyIDk0IDkgOCAxMSA5OCAKKzE5IDEwIDU1IDk3IDIyIDk3IDk1IDg4IDY3IDE1IDIwIDM5IDY1IDEzIDEyMyA3NyBeCisyNTMgMSA0NSA3IDE1IDI0IDUxIDUgOTggMTE1IDI0IDQ5IDkwIDEwNCAxMTcgNjYgMTI4IDk0IDY0IDgwIDEyIDQzIDkxIDQ2IDExMSAKKzU5IDU4IDc3IDMwIDE0IDg4IDYwIDEyMyA2OCA0MSA0NCA2OCA0MCAxMDQgMTE4IDQxIDQzIDkzIDkwIDEwNSA5MiAxNiAxMjcgMjYgNTQgCisxMjUgMTE0IDc5IDcxIDI0IDQ4IDIxIDI1IDExOCA0MCAxMDMgNDkgOTEgNDQgNjcgNjUgMjUgMTE5IDEwOSAxOCA0OCAyMyA2OSAxMTIgCiszOCA2MSA2NCA4NyA4NCAxMDQgMTE5IDExMCAxMjIgOTIgMjIgMSA4IDgzIDM0IDEwMCAzMiA2MiA0MSA0NiAxMTIgMzQgMTAyIDc2IDU2IAorMzkgNCAxMjcgMzAgMTMgMTkgMTEwIDEyNCA3IDE2IDEyOCA5NSA0IDEyNCAxMSAxMDQgMTE2IDEyNiA0OSA5NSAzIDU1IDk2IDcwIDkwIAorMTAxIDQgMTIyIDk2IDc1IDExOCAzOSAxMjggOTkgOTIgMTggNDIgMjAgODcgODMgMzUgNzUgMTExIDYxIDY3IDcxIDI4IDEwMSA5IDU2IAorMzQgMTA1IDk1IDcxIDIzIDczIDcxIDI2IDU3IDE1IDIzIDc2IDU1IDk5IDg5IDEyOCA5OCAxMTcgNjggNDMgODggNjIgMzggNjIgMzkgMiAKKzgzIDM2IDE1IDI2IDYwIDEyOCA5NiA3MyA3NCAxMCAxIDEyIDQyIDIyIDIgNzcgMzMgMzMgMzIgNTcgMTMgMTQgODIgNTcgMTIgMzkgMyAKKzU4IDgwIDE0IDg3IDg1IDQ0IDY5IDEwOSAxOSAxMTcgNjcgNjggNDQgNjMgMTA2IDM3IDg4IDY0IDgyIDU2IDM3IDg5IDQgMTI2IDU1IAorOTggMTE0IDg0IDk5IDkxIDQzIDkyIDIxIDI2IDU4IDg0IDEwMiA3NSAxMTYgMTI0IDUgMTAxIDUgOTcgNDYgMTA5IDE1IDI5IDc5IDcyIAorOTMgOTIgMTEwIF4KKzI4OSAxIDgzIDUgNzYgMjAgMzIgMTUgMTAgMSAxMDMgMTggMjIgMTE2IDk4IDkgNTEgMTA0IDEwMiA0NCAzMyAxNSAxMiAyNCAzMSA4OSAKKzEgNiAyOCAxMDEgOCA2NCA3MiAxMDYgMzAgNSA1MiA4OSAxMTEgMzkgMTA4IDY0IDg1IDE3IDU3IDEyNCAyMiAxMDUgNzggMTE1IDMgNDAgCisxMDggNjYgMTA4IDc3IDEyOCAxMDMgNDQgMzUgMzggMTMgOTUgMTAgMTExIDYzIDk4IDExNyA2MSA1MSAxMjYgNjkgOTYgNzAgNzAgNTkgCiszOSAxMyA5NyAzMyAxMTIgMiA3NyA3IDEyMyA3MCA4MyAyOSA2NiA2NyA0OSA3OSAxOSAxMDQgMTE1IDE0IDYwIDIgNTUgNDAgNzEgMzMgCisyOCAxMTQgNTEgOTEgMTcgNDYgNDUgMTI4IDU3IDg3IDYyIDI1IDExNSAzOCA1MCA1NSA5MCA3NCA4IDUxIDEwMiA3OSA0MyA5NCAzNiAKKzEyMiA5NCAxMiA0MSAzNiAyNSAxMDQgOTEgMjQgNyA5OSA4MCAzMCAxMjYgMzIgNjMgMTIyIDEwNyAxMTQgMjcgMjggNzkgNDEgMTIgMzUgCis1MSAxMTUgMTIyIDcwIDIyIDc5IDY1IDIgODggMjcgMTcgNTkgMTUgMjMgNDQgNTcgNSA2NSA2IDI2IDc4IDgwIDEyNSA5MyA4NCAxMDAgCis0NSAyMiAxMjkgNjggMzYgMTExIDc0IDExOCAxMSA1MCA0MiAxMjAgNDcgMjEgOCA4NiAxMTIgMjYgNjcgNjAgOTkgNDUgOTMgNDcgOCAKKzM4IDU5IDUyIDU2IDEyNCAyMCA4MiAxOCAxMTcgMjQgMTggNDYgMTA2IDE5IDExNyAyNiA0MSA0NyA0NSAxMzAgNyAxNSAxIDQgNSAxMDAgCisxMCA4NSA1MCA0NCAxMSA0OCA5MiAxMTkgMTA4IDQyIDExOCAyNCAyMCA2OSAxMDcgOTAgOTYgNDggMTAzIDcgMiA5MCA1MCAxOCAxMzAgCisxMjYgNDUgMTA2IDE3IDM1IDI1IDEwMiA2OCAyMyA2OCAxMjAgNTggNDEgMzQgNzUgMTAzIDIwIDQ1IDExNyAzNyA2MSA3MyAzNCA2MiAxIAorMTI1IDU4IDc0IDIxIDIxIDEyOSA3IDg2IDExMCA3NiA2NiAxMjQgXgorMjYzIDEgMTAwIDEzNSA3IDc1IDIzIDUgODEgMTEwIDMxIDExOCAyOSAxIDYyIDExIDQxIDg4IDEwOSAxMTkgMTAyIDM3IDMgMzAgMTIzIAorNDcgMzEgNTYgMTM0IDI5IDEyNCAxMTYgMTE4IDk5IDIxIDU2IDc3IDkxIDIzIDM3IDEzNSA4MSA0NCA1MSA2NyA5NSA1MSAxMzMgMzAgCis1NyA2NyAxMTYgMTIyIDQ4IDEwMCA3IDEzMiA5NyAxMDYgNjkgOTMgNCA5NSAxMjUgMTAyIDEwMyAxMTkgODEgNTcgMTMzIDk2IDM3IAorMTE4IDUwIDExNyAxMTMgODEgMTI3IDE3IDQ1IDEwMyAzMiAxMjEgMTI5IDYwIDQzIDY1IDEyNyAzMCAzNiAxMzIgMTEwIDUyIDUzIDM1IAorNzEgMTIgNzYgMjIgNzIgMTMwIDExMiA5OSA3NiAyNiAyMSA3MyA2MyA2MyA5NyAyMyA1OCAxMTUgMTMyIDExNCAxIDEzMiAzMSAzNSAxOCAKKzIzIDU0IDMwIDUzIDExOCAzNyAzNSA4NCA5NCA2MCAxMDAgMyA0NyAxOCAxMTAgMTA1IDg3IDU3IDYzIDc2IDQzIDUyIDQ1IDQ2IDQ5IAorNjUgMTIgMTAgNDIgNjYgNjAgMTE3IDM0IDE5IDkyIDUgMjggNzYgOSAxMjYgMTAxIDEyNSAzMiAzOCAzNCAxNSA3IDYyIDMyIDIxIDMgCis0MyA2OSAzMSAxMDkgMTIzIDUxIDExNiAxMzUgMTMwIDEyOSAxMzAgNjMgMTQgNTcgODAgNjIgMTUgMTI2IDMxIDEwNSA4MyAxMDggMTIwIAorODAgMTI0IDQ2IDk4IDEwNSA5MSA2IDYgMjcgNyA1OCAxMjggNzggNyA3OSA2MyA4NCA3NyA3NCAxMjggNjUgNjEgOTUgMTIxIDE3IDI0IAorMTIzIDExNyA1MSA1MCA2NCA3OSA1OSA0NCAxMzQgNzggNzMgNTkgMTE0IDE4IDI3IDMgMTA5IDQ5IDgyIDQzIDExOCAxMTYgNTIgMTE5IAorMTUgMTIyIDgyIDI2IDg3IDUzIDExNCAxMzMgOTIgODggMzkgOTkgMTcgMTA3IDEzNCA5NSAxMDQgMzEgNTIgNDkgOTQgXgorMjg2IDAgMTIwIDE2IDEwNCAxMzYgMTE3IDgyIDEzOCAzMiA2NSAxMTQgMTE5IDEzNyAxMjEgOCAxMiA0NiAxMjYgMjYgMTE5IDczIDEzMCAKKzYwIDc2IDExMyAxMDAgMTQgMTMzIDI2IDExNiAzNCAxMjAgODAgOTUgODQgNTMgMTUgMjQgNDQgNTEgNCAxMCAyMyA3NyAyNCA5OSA2NiAKKzM3IDU0IDYzIDQyIDEzNiAyMSAzNCA3NiA1IDE3IDEyOCAxMDEgMSA1OSA0MCAxMTMgMTEyIDMyIDk3IDMxIDkzIDEwNSA3OSA5MSAxOCAKKzM5IDEgMTAzIDEzMiA1MSA2OCAxMjQgMTExIDEzIDk3IDQzIDEyOCA2OSA4NCA4NSA3MiAxNSAxMiAyNiA4NyAxNiAxNiA5MiAxMDEgMTMgCis3NyA0IDExOCA4OSAxMDMgNTYgNDIgMTYgNjAgNDQgMzkgMTI2IDQ2IDE4IDgzIDkzIDQxIDEwNSAzIDgyIDEwNiAxMTUgOTEgNiA0IDU0IAorMTE1IDE1IDEyMCAxMDkgMTEzIDQ4IDQxIDkgOTUgMjAgNjIgNjcgMTA1IDExMSAyNSAxMzIgNyAxMTYgNDYgMTM4IDQ0IDgzIDYxIDEyNCAKKzEzMSAzNSAxMDcgNiAxMDkgODEgMTE0IDY3IDQxIDEzNyA3NyA1NiA3NCA3MyAzNCAxMiAxNCA2OSA1MiAxMSA5OCA0NyA1NCA4MyA4MSAKKzYgMSAxNSA4OCAzNSAxMzkgODAgODMgNDkgODkgMjcgNDcgMTMwIDkyIDEzMyA4NyA1MSAxMTIgNzYgNDkgMTA5IDQ5IDU3IDkzIDczIAorMjIgMTE3IDUwIDY0IDU4IDk3IDEzOSAzNiAxMzEgMTExIDEzMyA1OCAzMyA4IDg4IDU1IDM4IDkwIDQ2IDMwIDExOCA1NyAyOSA4MiA3NCAKKzQxIDExNyAzOCA0NiA5NCA5MiA1IDEwNSAxNSAxMTcgNzAgMTAzIDY4IDYwIDEyMCA0OCAyMSAxMTAgODUgNDAgODEgMzggNTggMTI5IAorNTYgMTAgOTkgODYgNzYgODEgMjYgMjMgMjUgNjggMTYgMjggMTI3IDY1IDE4IDcxIDc1IDc3IDEwMCAyNiAxMSAxMzAgMTA0IDI4IDM0IAorNTYgMTA2IDcgOCAxMjAgMTEyIDEyIDU4IDIxIDEzMCAxMjQgNjcgNjEgMTkgODcgMTE5IF4KKzI4NiAxIDM1IDk0IDYxIDEzMCA5OCAzNSA4OCAzNCA2NSAxMDQgNTYgMTI2IDExOCA1MCA4NyAxMCA4MSAxMDkgOTAgODYgMTE4IDMyIDYgCisxMTQgODggMzkgMzggMzkgNjIgMyAxMiAxMzQgNzIgMTM3IDM1IDc1IDgxIDExNSAxMDYgMTQwIDExMiAxMSAxMjMgNDEgMTAzIDQ1IDk1IAorODQgNzEgMTA3IDEzIDI2IDExMCA5NiA2MiAxNiAxMDkgODQgNTkgNTMgMzggMjcgOCAyOCAxMyAzMiAxMzcgMTcgMTM4IDQxIDEyMiAzNiAKKzk5IDY1IDk5IDgzIDM2IDExMiAyOSA0OSA3MCA5NiAxMjYgMTM2IDEzMSAxMTYgMyAxOCAxNyAxMjYgMTQyIDE0IDM3IDE0MSAxNDEgCisxMjMgNDIgMTMgMjAgODMgNDIgMTM5IDgzIDU0IDQ5IDU4IDQyIDcgMTM3IDI5IDQ4IDE2IDEyMSAxMjcgMzQgNTIgMTQwIDEwNiAxMjggCis1OCAzNiAxMjQgODMgMjQgNjkgNTQgNjEgMTEyIDE3IDYgOTUgOTcgMjQgNTcgODYgMTI0IDU5IDcxIDExOSA2NyAxIDEwOSA1NCA2OCAKKzQ5IDU3IDEzMiAzMiA1IDcxIDExMyA0MCA4MCAxMDQgNzUgMTA2IDEzMyAzMSAxMjYgMTMwIDEwNCA2MiA5IDM5IDQ0IDY2IDExNiAxNDEgCisxMzUgOTYgMTMyIDE5IDQxIDEyMSAxMjYgMTI0IDc3IDggNCA2MCA4MiA2IDEwMSAxMjQgODkgNTEgMTIzIDQ4IDQwIDg1IDc3IDIxIAorMTEyIDEwIDY5IDY2IDExNSA4NyAxNiAxMDggMzAgODQgNjUgODAgMTAzIDMyIDEzMSAxMzQgNzMgNDcgMTAgNjMgMzkgNTAgOTMgMzcgCisxMzUgMTE0IDY5IDQ4IDM0IDU4IDIzIDI3IDEzMyAzNyA5IDQwIDk4IDQxIDExNSA5OSA3MCA4MyAyOSA0MiA2NyAxMzMgNTUgNzkgODAgCis5MSAxMjIgMTIgMiAxMTUgMTEyIDIzIDMzIDE2IDEwMiAzIDE5IDYwIDEwMSAxMzAgMTA1IDExNiAxMTcgMjcgMiAxIDEwMyAzOCAxNCAKKzU1IDc4IDI2IDExNiAxMjMgNTQgNjcgMTM5IDgyIDc0IDcwIDg0IDcyIDE3IDEzMiAyNSA2OCAzMSAxMjAgMTAzIDE0MCBeCisyODUgMSA2NSAzMCA1MSAxMTkgNDggMTA3IDkyIDg0IDY5IDI4IDEzNiAxNDMgNTQgMjAgNiA3MCA0NyAxNDIgNjQgNCA2NSA1OSA3MyAKKzk5IDEzNCAxNDYgMTAyIDEyNSAxMTYgNTcgMTM3IDEzNyA3MiA0OCAxMjggNzggNSA4MCA2MyA1NCA4NSAzMCAyMiAxMjkgNjggMjEgMjEgCis3NCAyOCAxMjggMTA3IDI3IDYwIDIgOTMgOTUgNzEgMzcgMTEgMzcgMTUgMzkgMTAyIDMgMTA0IDY1IDgwIDU5IDUyIDExMyAzNCAyMCAKKzY3IDYwIDI3IDgxIDEzNSA0NiAxMDYgMTA2IDEwMiA2OCAxMjggMTcgMTUgMTAwIDEyNCAxNSA0MyAxMzYgMTIyIDEwMCA2NyAxNDIgMzUgCisxNCA1MyAxMjAgMiA4OSA5MyA5OSA3MyA5IDEyMiAzOSA3NyAxNSA5NiA5MCA0MyA3OSAxMzQgNjAgOTIgMTA1IDU1IDk2IDMxIDExOSAKKzc3IDk3IDcyIDIzIDE0MCAzOCAzMCA0MyA4MyAxMzYgODggMTA3IDExNyA3MiAxMDkgMTE4IDU4IDkxIDExOSA3MyA5NSAxMDAgNTkgCisxMzggMTIzIDU0IDQ5IDE0MyA1MCAxMzMgNjYgMTA2IDQ1IDgwIDg4IDQyIDkzIDUgNTkgNzcgMTAxIDc0IDExMCAxMDQgNDAgOTIgMTkgCis3NyA3NiA4NiAxMDIgMTI5IDMgMTQ0IDEwMSAxMzkgMTM0IDU2IDkwIDE4IDkxIDk0IDg1IDU1IDEwIDEzNyAxMSA1OCAxIDEwNyAxMTMgCis3MCAyMiA3IDU2IDI5IDE0MyAxMTEgOCA0NiA0NSAxMTYgMTIyIDEyOSA4OSA3IDEyMSA1MyA5NSAxNCA0OSAxMTggNjIgMTI1IDkxIDM3IAorOTcgMTUgMzUgMTAwIDYzIDE0MCA2MyA1MCA1MSA1OCAyNiAxMjcgNiA0NSA1OSAxMDIgMTIxIDExNCA4NSAxNDEgMTM1IDEwIDcyIDE5IAorMTA2IDY2IDY2IDQxIDUzIDEzIDM4IDEgMjEgMTAzIDUwIDEwOCA0NiA2NiA3MCA0MyAxNDAgMTI0IDQwIDYzIDE0NCA5NyAxMzcgNDcgCis2MCA4OCAxMDMgMTE1IDEzMiAxNDUgMTE2IDE0MyAxMTUgMTAgMTMzIDkgMTE4IDM3IDEwNSA1MSA5NCA2MCA2NyAxMTcgMTE2IF4KKzMwNSAxIDEwOSAxMTAgNzUgNDIgMTIgMTM5IDEzNyA0MyAxMjggMTA2IDEwNyAxOSAxMjYgMTIgMTAxIDE0OCAxMjcgMTUgMTE3IDEyNSAKKzEyNSA2MiA5NiAxMyA3NiA3MCA5NiAxMDEgMTEwIDEzOCA4IDk1IDc2IDE0MyAxNyAzMiA5NyA3OSAxNDkgMzkgMzEgOTQgMTIzIDIxIAorNDEgMTM1IDU1IDg0IDcwIDMzIDEzNSAxMTggNTAgNjIgMTIxIDgxIDEgNDUgMTQ0IDkzIDYwIDUgNjQgMTM3IDggMTA1IDkxIDgyIDY3IAorMjcgMTEzIDExOSA1MyAxOCA5OCA3OSA0OCA4NCAzMiAxMzUgMTI4IDUgMSAyMCA3NiAxNyA4NSAxMDggNzIgMzYgMTQxIDE0MCA0OSAKKzE1MCAxMDUgMTA0IDMgMTQ5IDE0IDU0IDE4IDE0OCA2NCA0OSAxMjUgMzcgMjggMjggMTAxIDIyIDEwNCA5MSAzMiA4MiAxMTcgMTIgCisxMTQgNjkgNTggMiA1OCAxMTUgOSAxMDggNDcgNTkgNjUgMTQgOTIgNyA0IDg2IDk4IDE2IDgyIDkyIDk1IDM4IDk0IDEwIDEwIDQ4IDk3IAorMTA0IDY2IDExNSA5NyAxNDIgMTE1IDEyMiAxMTkgNDAgOTcgMTYgMzIgNDcgMzQgODggODkgMjYgNTAgMTIgNzYgODAgNTEgNDAgOSAKKzEzMyAyNCA0NCA0MCAxMjIgODQgMTA4IDIyIDE0MiAxNDAgOTkgNDQgMTUgNTQgOCA0MiAxMjUgMTUwIDEzMCAyMSA3OSAxMjQgNjIgNDYgCisxMTkgMTUgMjkgOTEgNTcgMTUwIDQyIDEzOCA3MSA2MSA2OCA4MCAxMTQgNiAxIDcwIDEyMSAxOCAzNSAxMTMgNTYgODcgODYgMTAgNzMgCisxNCAyOSA0MSA3MiA4OSAxIDEzMyA4NyAxMDEgMTIzIDU5IDkwIDE0MiA3NyAxMzMgNTIgNzggNDggMzQgMTM4IDEzNCAyNyAxNyA2MCAKKzEzMSAxNDcgNjEgOTMgMTQ4IDM5IDEzMiA0OSA2MiA3MSAzNiA5MSA0IDEzOSA0OSAxMDAgMTIwIDQzIDExMyAxNDQgMzAgOTQgNzMgCisxMjcgNDAgMzQgNTAgMTAwIDExMCA4OCAxMTQgOTQgMzUgMTM4IDMzIDcyIDYxIDU4IDY1IDI0IDEwNyA2IDU0IDgxIDExNCA1NiAxMzcgCis3MSAxMSAyMyAxOSA3MyAxIDEwOCAxMTAgMjUgMTQ4IDExIDk4IDEzMiAxNTAgMTcgNzAgMTQ2IDUwIF4KKzMxNCAxIDk5IDg4IDcgMTM5IDI0IDEzIDM1IDQ3IDk3IDE0NSA3NCAzNiAxMTkgMyA1MSA4NCA0OCAxMTkgNTMgNDkgMTUgNzkgMTcgCisxMjAgMTAzIDE0OCA2NCAzMCA0MSA5NyAxMjAgNzUgMTExIDYzIDU4IDEzMSAxMzQgMTggMTMgMTAgNDggMTggMTYgNDggNDMgMTUgNTQgCisxOCA0MSA0NyAxMjIgMTQ0IDgwIDkyIDE0NSA3NyAxIDMzIDg5IDU0IDQ2IDc4IDQ4IDIxIDU0IDQzIDQwIDUzIDI0IDE2IDczIDQyIDk0IAorMjkgNDQgMzQgMTUxIDE1MiAyMyAxMjMgMTIgMTQyIDE0MCA0MyAzNyA4OCAyOSAxOSAzNSA3MiA5NiAxNTEgMTMwIDYyIDExMiAzNCAzNiAKKzkxIDEyMCA1MCAxMTIgMTM4IDIgMTA1IDYwIDY4IDEzNyAxMzEgNSAxNyAxOSAxMzkgNzQgMTEgMTIwIDc4IDE0OSA1OCAxMjggMTUgCisxMDQgMTYgMTI2IDc4IDIwIDU3IDEzNCA3MSA0OSA5MCA3NiAxMDggMTI2IDEwMCA1NCA2OCAzOSAxMzIgMTUzIDQyIDE0NyAxNDYgMTI0IAorNjIgODcgMzUgNzUgNjEgNjUgNDYgMTAwIDgyIDEwNSAxMTMgMzEgNjMgNSA5NSA1NCA3MSA3NyAxMjcgMTUwIDgwIDM2IDE0NCAyIDEzMCAKKzU5IDc0IDM5IDMgMTUyIDEyMSAxMjIgMTggMTE3IDEyIDExNyAxNDEgMTE4IDEzNSA2MiAzNiA2OSA1IDM5IDUzIDE1MCA1MiAxNTMgCisxNDMgMzAgNjYgOTYgMTI2IDEzMSA1NiAxMzcgOCA3IDg2IDE0MiAxNCA3IDExMSAxNDEgOTMgMTM2IDEzNyAxMzQgNDMgMTIgODkgMjMgCis0NCA5IDE1MiAxNDYgMTIxIDk3IDE5IDM4IDExMCA5MSA2NyAxNCAzMiAxMTAgNjYgNjggOCAxMzAgODQgNzMgMTE4IDU5IDI0IDQxIDcyIAorMTIxIDE1MCA1NSAzNyAxMzggMjcgMTA0IDY2IDEyNCA5IDUxIDEwOSA0NyAxMjUgMTA5IDE0OCA4IDI5IDQ3IDcyIDE0NiAxNDkgNjEgCis5MyAxMCAyMCA1NCAxNSA3NiAxMzMgMTI1IDEwNiAxMTAgOTQgMzIgOSAyOSAxNDggMzYgNjYgMTIxIDEyNSA1NiAxMTIgOSAxIDExMSAKKzExNiA5NCA1NyA4IDEwOCA1MCA2MiAxNDAgNzEgNzQgODkgMSA4MyAxNTIgMjAgODUgMTcgMTQ1IDEwMiAzOSA1NiAxMTUgNDcgMTUwIAorMTA4IDY0IDk4IF4KKzMzNSAxIDI4IDEwMyAxOSA5MiA5NSAxNTIgMTUyIDEwIDExIDEzIDE1NSA2NyAxMSA4MyAxMDEgNjkgMTUzIDE1MiA0NSAxNDEgMTQgCisxMjAgMTI5IDE0MCAxMTkgNTkgMiA4OSA3MyA3MCA4MyAyOSAxNiA2NyA4MSAyOSAxIDU0IDY1IDk2IDExNyAyIDM3IDQ3IDEyOCAzMyAzIAorODkgMTA4IDk4IDEzOSA0OSA3OCAyNyAxMDMgMzkgMTE5IDk0IDEzMiA5MCAzOCAxMzIgNTUgNjUgMTMxIDkwIDU4IDIgNTQgMTAwIDY5IAorMTE4IDIyIDQ0IDE5IDcgMTQ4IDkzIDI1IDI5IDEyMyA4MSA2NCAxMzEgNTUgMzAgMSA4OSAzOCA5NyA4MiA2NCA5IDI4IDg2IDEyMyAKKzE1MSAxMCAxMzMgNDAgMTU0IDEwMiA0IDExMSA2NSA5IDYzIDU5IDEyNCAxMTYgNzIgMTA1IDc2IDU3IDEzNyA5NyAzMiAxNDUgMTA4IAorNzggMTEyIDUwIDQzIDM0IDc1IDIwIDIyIDEyOSA2OCAxMSAxMTggNzQgMTI1IDExOCA1NyAxNyAyMCAxMjkgNTMgNjUgNjEgMTQ0IDEgCisxNyAxNDIgMTU2IDUyIDEwMCA1NCAxNSAyMCA1OSA1MiA2MyAxMzEgMjAgNTcgMTI0IDMxIDEyNSA0NiAxMDYgNzYgOTIgOCA5OCAxNTQgCisxNTIgODAgMTE0IDE1IDE0MCAxMzYgMTEyIDEwMCAxNyA5MiAyNSAxNTEgMTUwIDgwIDk5IDY5IDgzIDQ5IDQzIDE1NiAxMDIgMTkgNTcgCisxMjIgOTYgMzAgMyAzOSAxMzQgNDAgMzIgNzUgNSA3NiAxMjcgMTM4IDk5IDE3IDU3IDUyIDE1MCAxMzAgMTggMTI3IDMzIDIzIDExNiAKKzEwNyA3OCA3NyA3NyA0MiA2OSA2OCA0OCA0MSA2OSAzMyA3NSA0MCA0OSAxMjggMTAzIDQgMTQ2IDkzIDEwIDgzIDY2IDk2IDE1MiAzMCAKKzM4IDEyIDMzIDUgMzkgNDcgNDEgMzQgNjAgNzQgMjAgNDIgMTU2IDY3IDQ2IDU2IDEwMiA4OSAzIDEyNCA4MSA5OSAxMDQgNTYgNTAgOCAKKzYxIDc0IDU1IDE1IDg3IDEwOCAyOCAxMzggNDcgOTMgNjAgMiAxMjQgNDYgMTI2IDEwMyA5MSAxNDUgMzYgMjUgMTE2IDEyMiA3OSA3OSAKKzcgMTExIDEzIDg1IDEyMSA5IDk4IDMyIDEyNSA4MSAxMzQgNzcgMTEyIDE1IDcwIDMzIDExMCAxMyA1MCAxNDggOCAxMzMgMTI3IDE1MyAKKzQ1IDE5IDQyIDEyMSA5NCA0NSA5MSA5NSAxMTcgMjIgOSA0NiA2IDI2IDMxIDUzIDE1MCA4IDE0OCAxMjggNTMgMTQxIF4KKzMyNiAwIDgwIDEyMyAyNCAxNDcgMSAxMTIgODIgMTU5IDYzIDc0IDk3IDEwOSAzMyAxNTEgMzIgODkgODcgMTMyIDExNyA0NiAxMjkgNTkgCisxMTUgOTEgMTE0IDExOCAzNyAyMSA5IDk0IDYwIDI1IDg5IDQ3IDc5IDExMCA1NSAxMiAxNDMgOTkgODcgNDMgODggNTYgNTcgMTYwIDc2IAorMTIgNzEgMTI4IDc3IDE0NiAxMTcgOTUgMTA1IDQyIDY2IDMgNzYgMjAgNzYgMTAxIDEwMCAxMTggMTQ5IDQ1IDI2IDE0MyAxNDggMzIgCis1NyAzOSAxMjkgMTkgMzEgODQgMTIzIDEgMTUyIDEzNSA1IDU0IDMwIDEzIDEyNSA2OCAzMCA2MiAxMDEgNTEgMTQyIDUgOTQgODMgMjAgCisxMTYgMjQgMTA3IDEwOSAxMDUgOTEgNDIgMTcgMjcgOTMgNjkgMyAxMzkgNjggNzkgMzggODQgMiA4NSAxMjggMTI2IDEyMiAxMzEgNDYgCisxNyAzNSA5OCA0MiAyNiAxMTEgMTAwIDI5IDEyMCA1NSA4NCAxMTQgMTA5IDE0NSAxNCAxOCAxMzggMTQgOSA4NSA3IDE4IDEyOSA5MSAyIAorOTQgNTEgMTMzIDgyIDg3IDEyMyA2NCAzOSA4IDEwMyAzOCA3NSAxMTAgNzggNyA5IDQ1IDExNSA0MiAxMzggMTM1IDg2IDc4IDE2IDYyIAorNTIgNzUgMTU5IDU0IDE1MSAxMjEgMTQ5IDc3IDc0IDE2IDg1IDQ3IDEwMiAxMDUgODIgMTE5IDEwIDY3IDEzNyAxNTMgMTQ4IDEzNSAyOCAKKzQ5IDI2IDE1MSAxNTMgMzYgODAgMTEgMTMwIDExMyAyNCA0NCAzMCAxMDIgMjQgNTggMTMzIDEyMiAxNDAgOTkgMjQgMTU2IDU0IDExOSAKKzQyIDExNSAxNDAgOTAgMTMyIDE5IDk0IDIgMTU3IDk5IDEzNiAxOSA3MSA3IDEzMCAxNTMgMTA4IDUxIDIxIDU4IDcwIDc0IDEzNyAxIAorNDAgMTExIDE0OSA1IDEwMyA2IDI3IDc2IDE0MSAyMyAxMjUgMTQwIDEgNzIgMjkgMTUyIDEwMyA4NyA1MSA5MyAyOSA4MCAxMzIgNzcgCisxMjMgMTUzIDY4IDE1OSAxNCA5OCAxMTQgMTU4IDEyMSAxNTggODEgMTM3IDQxIDkzIDExOCAxNDAgMTIyIDE5IDIyIDMxIDE0NyA0MSA0IAorODkgMTUwIDUwIDEyMCAxNDQgMTEzIDEwNCAyMCA0NCA1MyA5NyAyMCA0IDkwIDYwIDQ4IDg0IDc0IDI1IDEzOCAyMyA2MiA2MSAxNTkgNSAKKzE0IDEwNyA2IDQgODEgMTE0IDQ2IDk3IDExIDExMiAxNTQgMTMwIDczIDEzMiA2MCBeCiszMjUgMCA1OCAxMzcgOTYgMTEgOTggNjcgOTggMTAzIDU3IDE0NiAyMSA1OSA4OCAxNTEgMTM5IDE0OCAxMjcgMjUgMTcgNDcgMTE1IDM0IAorMTYwIDEwOSAxMDcgNTEgNjQgMjggNjkgMTMgNDkgMTQ5IDY5IDE0MSA5MCA5MyAxMTggNjQgMTAgMSA2NyA4MCAzNSAxMTEgMTMgNTggCisxMDEgMTI0IDEzMiAxNDcgMTU0IDE4IDE2MiA2IDE2MiAzMyA1IDM0IDE0MiA0MSAxNjEgODIgMTE0IDcwIDkyIDE0NSA1NyAxNTUgMTM3IAorMTE0IDc5IDQ0IDM2IDQ4IDQ4IDIxIDE0IDEzIDQwIDMzIDE0IDE1MCAzMyAzMiA1NCAxNDMgMTQgNCAxMDEgMTQyIDIzIDkzIDEzNiAKKzEzMiAxMjAgMTQ3IDE3IDM4IDE2MyAxNDMgNSA1MiA0NiAxNTEgMTMwIDMyIDcyIDM0IDEyNCAxNTAgNTEgMTAwIDExMiAxMjggMTI2IAorNjUgMTAgMjggODcgODEgMTU5IDEzMSAxOSA5OSA1NCAxMjUgMTEwIDU4IDExOSAyOCA3OCAxMjkgMTA0IDE0MCAxMjYgMzggMTU0IDI3IAorMTE0IDYxIDE1MyA5MCA2NiA5OCA3NiA1MCAxNTggNDggMzkgODIgMTIzIDIyIDE0NyAxMzYgMTE0IDUyIDM3IDM1IDc1IDQxIDE1IDE1MCAKKzYwIDUyIDU1IDEwMyAyMSAyMyAxMjkgOTUgMjQgNzEgNDcgOTcgMTMwIDUwIDE0MCAxNDQgMTA2IDEwMCA5IDY0IDE5IDExNyAxMjIgNzEgCis5MiA4IDc3IDE1NiA5NyAxMjEgOTggODUgMiAzNiAzOSAxMDkgMTQzIDIzIDEyMCAxNTYgMTMzIDkzIDE1NCAzNiA2NiAxMTYgMTMxIAorMTYwIDEyNyAxNjIgMTYxIDQ2IDE0MiAxNCAxNDEgODEgMTQxIDYzIDg2IDExNyAxMDQgMyAxNDYgMzkgMTI3IDM0IDEzMyAxMDIgMTA2IAorOTEgNTcgOSAyOCA2MCA2MSA3IDE1OCAxMiA4MCAyNiA4IDEyMiA4MCA0NCA2MyA2OCA0OSAxNTggMjEgMzIgODEgMTUwIDE1IDE0MSAKKzEwOCAxNjEgNjQgNDYgMTI0IDEyMyAzMSA5OSAyNyAxMDUgMTA5IDk4IDExMiA5IDM3IDEyIDExNiAxNDkgNTEgNzMgMTQ0IDEyNCA0IAorMTE5IDQ2IDEzMyA3NSA4NiA5MCA4NCAyIDkgMTkgMTA4IDYgMTYgMTAxIDExNSAxNiA5MiAxNjMgMTI1IDEwMSAxMDYgNjQgMzcgOCA2OCAKKzQwIDQyIDEzMCA0MSAyNCA4OSAxMTUgNDMgMTEyIDg1IDEyMSAxMjUgOTIgMTU0IDkgNDYgMTE1IDcgMTQwIDEwOCAxNTggXgorMzM2IDAgMzggNDIgMTU1IDEwMyA5IDYyIDY1IDEwMiAxMjIgMTAgMTM4IDE2MCAxMjUgNDcgMTU4IDQzIDkxIDY5IDEyMyAxMzIgMzUgCisxMjEgNCAxMTAgODkgMTMwIDY5IDI5IDEzOSA2OSA1MyA3MCA4MyAyOSAxNjMgNjcgNDEgOSAxMDggMzQgNDUgNzYgODcgMiAxNDQgMTY0IAorOTggMzMgMTYwIDc5IDc4IDQ4IDg5IDkgMzggMTM0IDkzIDE0NiA3OSA1NCAxMjIgODAgMzggMTEyIDU1IDU1IDEwMSA3MCA4IDEyOSA0NCAKKzcwIDU5IDk4IDE0OSAyNCAxMzYgMTI0IDEzOCA2MyAyNSAxNjYgODMgNTEgMzQgOTEgNDUgMzAgMTE4IDU5IDI4IDg3IDcyIDQ0IDExNiAKKzI4IDM2IDEwMyAxMDEgMTEzIDEwIDExNCA2MiAxMTEgNzEgNjUgMTI2IDUzIDE5IDExNCA4NiA0MiA4NSAzNiA1NyAxMzcgNTcgMTU5IAorOTUgODggNzggNzIgMjAgMjMgMTQgNjUgMTAgMjIgMTI5IDY4IDEgNjggNzQgNzUgMTA4IDcgNyAxNDcgMTA5IDEzIDM1IDUxIDEwNCAKKzE1OCAxNjQgMTIyIDEyNiAyIDUwIDQgMTMyIDEyNyA1OSA1MiAxMyA4MSAyMCA0NyAxMDcgNzQgMTQ4IDExNSA0NiAxMDYgNDYgODIgCisxMTUgNjggMTQ0IDE0MiA2MCAxMDQgMTUgOTAgMTM2IDEwMiAxMDAgMTM0IDQyIDE1IDE0MSAxMDAgNDAgNDkgNDkgNzMgMTY2IDEzIAorMTU2IDgyIDE2NiAzNyA4MiA5NiAxMzcgMTMwIDE2NiAxMzQgMjAgMTM5IDQ1IDEyMiA1NiAxMDcgOTggNzkgMTI0IDE3IDMyIDEzMCAKKzEyMCAxNjUgNzcgMjMgMTMwIDk2IDY3IDY4IDQ3IDM3IDEyIDI5IDE4IDM4IDE1OCAxOSAxNjAgNTUgMTQ3IDM5IDExOCA4MyAxMjEgOTYgCis0MyAxMzcgMzMgNjYgODYgMTEyIDE0NyAxNTUgMTQ5IDE0MCA1IDE5IDE3IDE0OCAxNjEgMTAgNDQgMTU5IDE0NiA1NyAxNiAyNiAxMDIgCis0OSAzIDEwNCA2MSA1OSA3NCA1NiAxMCAxNjUgMzEgNTQgMjUgMTQyIDE1NyAzNyA1OCAxNjUgMTI4IDE1NCA3MyA1MCAxNDkgOTQgMzYgCis3NiA2MyA3MSAxMzUgMjYgNSAxMTYgMTIyIDI5IDY5IDcgMTAxIDE0MCA3NSA4MSAxMzYgNzggMiAxMjUgNzEgODQgNTcgNjIgMTYyIDQwIAorMyA4MCAxMzAgNTAgOTggMTI1IDkzIDEyNyAxNTMgNDUgMTQ2IDE0OSAxMjEgNzQgNSA0MSA1NSA3NyAxMzkgMTY2IDE1MyAxMTMgMTUzIAorMjEgNTMgMTQwIDE0NSAxNDggODggMTYyIF4KKzM0MSAwIDQgNjIgNzggMTY3IDEwMiAxNDQgOTQgNTUgMTQxIDYzIDI5IDk3IDkxIDI0IDExNSAxNjYgODAgNjkgMTMyIDk5IDEgMTIwIAorMjMgODggNjQgODcgMTE4IDM3IDEzNyAxNTIgOTQgNjAgMTY4IDcxIDQ3IDUyIDExMCAzNyAxNTUgMTI1IDYzIDQyIDQzIDUyIDExIDEyIAorMTUxIDMxIDEyIDQ0IDExMCAzMiAxMjggMTE3IDY4IDg3IDI0IDM5IDE2NCA3NiAxNDUgNTggMTAxIDkxIDEwMCAxNDAgMTUxIDE0MyAKKzEzMCAzMiAyMSAzIDExMSAxIDMxIDc1IDEyMyAxNTMgMTE2IDEzNSAxMzAgMjcgMTY0IDE2NSAxMTYgMjMgMTIgNjIgODMgMjQgMTMzIAorMTM5IDQ5IDc0IDE1NCA4MCAxNTggODAgNjQgMTA1IDkxIDYgMTQyIDI3IDc1IDI0IDEyOCAxMTIgNDEgNzkgMjkgODQgMTQ1IDQwIDEyOCAKKzk5IDk1IDk1IDE5IDE3IDE2MCA4OSAxNSAxNyA4NCA2NCAxMSA5MyAxMCA2NiA3OCA3MyAxMjcgMTQ4IDE4IDEyOSAxMzkgMTQzIDQ5IAorMTUwIDkgODQgODIgMTU0IDg1IDE1IDg4IDgyIDYwIDg3IDE5IDEyIDEzMyA1OCAyMCAzOSA2NSA1MSAxNDEgMTM0IDI3IDcwIDE2NyAKKzEyMCAxMTcgODYgNjAgMTYgNDQgMTYgNTcgMTMyIDE4IDE0MiA4NSAxMDQgNTkgNDcgMTQxIDU4IDIgNjYgOTYgNDYgMTE5IDE1MyA0MCAKKzExMCAxMjYgMTAzIDkwIDE0NCAxMyAyNiAxMDYgMTQ0IDgwIDE0NSAxMzQgMTAzIDk1IDI0IDQ0IDIxIDg0IDE0MCAxMyA5NyAxMDQgCisxNDAgOTkgNiAxNDcgNTQgODMgNDIgMTA2IDEzMSA1NCA5NiAxMzUgNjcgMTE4IDEyMSA4MSAxMDkgMTAgNTMgMTMyIDExMiAxMTcgODEgCiszMyAxNTUgNDkgNjEgMzggMTE5IDEgMTMgMTAyIDEzMSAxNDggOTQgMTMxIDE0MyA2NyAxMjMgMTQ4IDg5IDEwNCAxMzUgNzIgMTQ1IAorMTUyIDc2IDg3IDYgNjYgMiA3MSAxMjMgNzcgMTE0IDEwOCA1OSAxMjMgMTY2IDYyIDk2IDE0MCA5NCAxNDkgMTE2IDM2IDEyOCAyMyA5MyAKKzkxIDk1IDExMyAxNjIgMTU2IDE2NSAxMTEgMTY2IDQgNDQgMTA1IDUgMTIwIDk5IDExMyA2OCAxMSAxNjkgMzUgNzAgMiAxNDcgMTI1IAorODEgMTUgMTIgNTcgNTYgMTYgMTM4IDE0IDUzIDYxIDExNCAxMjEgNSAxMDcgNiAxMjkgODEgMTE0IDM3IDYxIDEyNyA2NyAxMzYgOTQgCis3MyAxMTQgMzIgMzQgMTE5IDcyIDExIDk4IDM3IDc0IDczIDUxIDE0NiAxNjEgMzUgMTQ2IF4KKzM0OSAwIDE0MiAxMzkgMTIxIDkxIDE2IDE2MyAyIDg4IDE3MSAxMzMgMTAwIDYyIDUxIDQ2IDEwIDI0IDE1MCA0OSAxMzEgNjAgMTE0IAorNjMgODQgOTEgNjQgMTY1IDEzOCA0MCA0NCAxNzIgMTExIDE0MSA1OCA3NCAxMTUgOTYgMTI5IDE0NSAxNjQgMTUzIDE3MCAxMjYgMjQgCisxNjkgMTYgMTE1IDQxIDEyNSA0NiA4NyA2MSA5MiAxNDUgMzkgMTU1IDkyIDc4IDcwIDM1IDI3IDIxIDQ4IDIxIDE1MSAxNTkgNDAgMTUgCis1IDEzMiAxNzAgMjMgMTggMTA3IDE2MCAxNTAgNTYgMTMzIDIzIDY2IDEwOSAxMjMgMTAyIDEwMiAxNzIgMTY2IDE0NSAxMTYgMTUxIDM0IAorMSAxNTEgMTMwIDUgMzYgMzQgOTcgMTE0IDE1IDgyIDEyOCAxMTIgMTE5IDk5IDI5IDEzOCAxNjUgNDIgMzYgMTU5IDk1IDE5IDYzIDM2IAorODkgMTAxIDQwIDkyIDEgMzMgOTMgMTA0IDExMyAxMjYgMiAxMzYgOTYgNTIgMTA4IDkwIDU3IDg5IDMxIDUgMTEzIDMwIDM5IDM3IDk2IAorNCAxNDcgMTI3IDEwNSA0MyAxNjUgMzUgNzUgMjMgMTQzIDEwNSAyNCAyNSAxMCA5NCAxMiAxNjAgMTAyIDk1IDE3MCA3MSAyMCA3MCAKKzExMiAyMyA5NSAxNDQgNjEgNzMgMTM3IDU1IDEgODEgOTUgMjYgNjUgMTcyIDQxIDE0NyA3OSAxMDMgODAgNDAgMTIxIDM2IDEyIDY0IAorOTggMTY5IDkzIDExMSAxMTUgNDggMTI3IDkgMzkgMTA3IDEzMSAxMTUgMTE4IDE2MiAxNjEgMTAgMTQyIDE0IDEyMyA1NCAxNDEgMzYgCis0MSA5OSA3NyAxNDAgMTI4IDE2NyA4MiAyNSAxMDYgNTcgNzAgNjQgMjEgMTkgMTUgMzQgMTI2IDE0OSAxNjcgNTMgMTYzIDEyNyA4NiAKKzM1IDggNTQgMjMgNDAgMTQwIDMgMTY5IDQ1IDE1MCAxNTIgOTYgODEgMTQzIDI4IDI4IDEyNCA4NyAxMyA5MCA5IDg3IDEwOSA1MyA2NyAKKzE2NCAyOCAxMzEgODkgMTQ5IDQyIDU1IDEyNiA3OSAxMzIgNzQgMTkgMTMzIDMwIDY4IDcyIDc1IDE0OCA5IDEwIDcyIDE1MiAxNDQgODMgCisxMDYgMTUzIDc0IDE2MyA5OCA5MiA5NyAzNyAxOSA4IDMyIDMxIDI0IDEyMSAxNCAxNTIgODkgNzkgNyA3NiAxNTUgODUgNzYgMTA3IDgzIAorMTU0IDE1NSAzNyAxMTUgMTQ0IDEzMSAxMDggMTE2IDI2IDM2IDEzNyAxMDMgMyA0NCA0NyA3MiAxMDQgMTAgMTIwIDE1NCAxMDcgMzUgCisxNTIgMTkgODUgNjkgMTA1IDEyMCAyOSAxMDkgMTcxIDEwNCA2NSAxMjQgMzkgMTEgMTI3IDU3IDQxIDcwIDgzIDI5IDE1NyA2NyAxNjQgXgorMzcwIDEgMTY3IDYzIDE2IDI3IDU4IDYwIDIgOTkgMTI4IDcxIDMzIDE2MCA3MCA1MSAzIDQ0IDE0OSAyIDg5IDg0IDEwMSA0MyAxOCAKKzExMyA3MSAzOCA5NCA1NSA0NiA3NCA1MiAxMzkgMTAyIDM1IDQzIDUwIDgwIDEyMiA2IDEwMCA4OCAxMjkgMzYgMjUgMTQ4IDQ3IDI0IDcgCis1NSAzNiAzMCA4MiAzMiAxOSA3OCA2MyAyNiA3MSAyOCAxNjcgODUgNTYgMTY3IDk1IDE1OSA3OCAyNiA2NiAzNSA2NSA5MCA0NCAxNTkgCisxMDUgNTkgMTUgNjcgNTcgMTM3IDIxIDEzMiA1MCA3MCA3OCAzNiAxNjkgNSAxNzIgNTYgMSAyMiAxMjkgNjggMTY4IDIzIDc0IDMwIDk5IAorMTM4IDE3NCAxMjAgOTEgMTUzIDggNDIgNjggMTU4IDE1NSAxMDQgOTkgMTMzIDUgMTM1IDk2IDgyIDU5IDUyIDE0NCAzNiAyMCAzOCA2MiAKKzI5IDExMiAxMDYgNDYgMTA2IDE5IDczIDcwIDQxIDEzNSAxMzMgNDIgOTUgMTUgNDUgMTM2IDkzIDEwMCA5OCAxNzMgNiAxMzIgNTUgNCAKKzQgMzEgNjQgMTMwIDE2MiAxNTYgNjQgMTU3IDE5IDQ2IDk2IDkyIDEwMyAxMzkgMTM0IDIgOTQgMTggODYgMzggODkgNjIgNjEgNzkgCisxNTcgMTQgMTEyIDExMSAxNTYgMzIgMTQgODUgNzggMzEgNTkgMjAgMSAxNjEgMTY5IDE0OSAyOSAxMjIgMTUwIDEzMyAzNyAxMDIgMzAgCisxMDkgNjUgODUgNTEgMTc0IDExMCAxNjQgNjYgNzcgNzYgMTExIDExOSAxMzEgOTUgNSAxIDE2NiAxMDMgMTM0IDE0MSAxNyAxNTggMTIzIAorMTM3IDQ4IDE2NSAxNzUgMTAyIDEzIDMgODYgNDMgMjMgNDcgNTYgMTUwIDE2NSA0IDM2IDE3NCAxMTUgMTU3IDE2OCAxMyAxNDcgMTE5IAorMTA5IDU1IDQxIDE0MCA2NyAyNyAzMSAyNyA1MyAxMjYgMTcgMTYzIDExNiAxMjIgMTYwIDYwIDcgOTIgMTEzIDY2IDQ1IDEwOSA2MCAKKzE1MSAxMjUgNjIgMzkgMzkgMTcgMTUzIDEzIDE1MiA1MyA5NCA1MCA1MyA4OSA1NyAxMjcgMTUzIDQ1IDExOSAxMDQgMTIxIDU2IDE0NSAKKzE3MiAxOSA0MSAxMDMgMTY2IDEwOCA2OCAxMjYgMTIgNTMgMTMxIDEyNyAxNDggNTIgMTM0IDE2OCA1MCA0OCAxNTUgNzIgMTMyIDgyIAorMzcgMTI5IDYzIDE3NSA5NyA3OSAxOCA5MSAxNDggNzQgNTcgMTMyIDg3IDE0NyAxMTQgMTc1IDcwIDQ2IDY5IDExOCAzNyAxMDcgMTQwIAorOTQgNjAgMTU2IDU5IDQ3IDM0IDExMCAyNSAxNDMgMTEzIDM5IDEyIDQzIDI4IDE1NyAxNTggMTQ1IDEgMTIgMjYgOTggMiAxMTYgMTE3IAorNTAgNzUgMTIgMjEgMTY0IDc2IDEyMSA0NiAxMDEgODUgODggMTM0IDE0NiAxMjcgMTQzIDc5IF4KKzM2NCAwIDMyIDE2NCAxNDYgOTMgMTYyIDMxIDY2IDEyMyAxNDQgODAgMTM1IDk0IDEzNyAxNTYgMTA3IDE1NyAxNzMgNjIgNjUgMTc2IAorMTI0IDExMiA0IDY1IDEyNyA0NCAxMzEgNTMgMTkgMTA1IDkxIDE0OSAxMDYgMjcgNTcgMTU4IDkyIDg1IDE0IDc5IDIwIDg0IDEyNyAKKzE3NCAxMjggNzIgNjggNTkgMTcxIDE3IDEyNCA4MCAxNjcgOCA1NyAyOCAxNzIgNjYgMTQ0IDQ4IDQyIDM3IDEwOSAxMjEgMTggMTIwIAorMTAzIDExNiAxMyAxMzIgMzkgNzMgMTQ1IDc2IDE1OCA0MyA4MiAzMyA1MSAxNTMgMTY0IDk3IDEzIDIgMyAyMCAyNCAxMTQgOTggOSAyNSAKKzEzMSAxMDIgOTkgODYgNDIgMTYgMjYgMTU5IDM5IDEwNSAxNjEgMTMzIDQ5IDU5IDQxIDIwIDEwNSAzMSAxMzYgMzAgODcgMTAgMTE5IAorMTM1IDEzIDgzIDk5IDU4IDQ1IDk5IDE1NiAyNiA2MSAxMzUgMTQzIDgwIDExOCAxMDcgNzYgNzcgMjQgNDQgMTIgNjYgOTUgMTQ3IDYxIAorODYgMTQwIDk5IDE2NyAxMzggNTQgNDcgNDIgOTcgMTIyIDE4IDYwIDkwIDQwIDczIDg1IDYzIDgyIDEgMzUgOTYgOTQgODEgNTQgMTUgCisxMjggNDAgNTIgMiAxMDEgMSAxNjUgOTMgMTEzIDEzMCA4NSA5NSA5OCA1OCAxMDUgMTEyIDUzIDY4IDEwOCA3MiAxMDAgMTUyIDQ5IDg3IAorMTQwIDM5IDE1NCA2MiAxMTQgNzcgMTA1IDYzIDUwIDg3IDE1NyAyNiA3OCAxMjIgNjcgMTQwIDcxIDE3MCAxMTkgNSA5MyA2NCA1MCAKKzEwNCAxNDQgMTI5IDEzOCA3NSAxMzAgNCAxNzggNjAgMTM5IDEyMCA1NCAxMTMgMzIgMiAxMzMgMTcgNDMgMTYzIDEyOSA4OSA3MiAxNDkgCisxNTUgMzAgMzggNyAxMzggNSA0NCA2MSA2OSA3NiAxNzUgMTA3IDYgOTMgODEgMTE0IDI4IDI1IDgyIDIyIDExOCA1OCA3MyA5NiAxNzUgCisxNzcgOTIgMzYgMTEgOTggMTcxIDM4IDI4IDQyIDE0NiAxMjUgMTc4IDg4IDEzNiAxMzkgMTAzIDY3IDEwIDE1MSAxNTEgNzAgMTUzIAorMTE1IDk0IDMyIDUxIDM0IDE3NyAxNzMgMTMyIDQ5IDExOSA1NCA5NiA0NSA3OCA3MyA2NCAxNTkgMTIwIDIyIDIwIDE1NCAxMTEgMTE3IAorNTggNTYgMTA5IDcyIDExNyAxMzkgMTUyIDE0NyAxNzAgMTAyIDE4IDE2OSA0IDk3IDQxIDEwMSAyMiA2OSA1NSA5MiAxNDUgMjcgMTU1IAorNjIgNTQgNjQgMjkgMjEgMyA0OCAyMSAxMzMgMTQ3IDQwIDMgMTc4IDEyMCAxNTIgMTcgMTczIDgzIDE0OCAxMzggMjYgMTI3IDIzIDQ4IAorOTEgMTE3IDkwIDcyIDE2NiAxNDIgMTMzIDk4IDEzOSAyMiAxNTAgMTUxIDEzMCAxNDAgXgorMzcyIDAgMzQgNzAgNzggMTYxIDY0IDkyIDExMiAxMTAgNzIgMTc1IDEwMiAxMzggMTc5IDE3MyAxNTkgNTkgMTkgMjcgMTggNTMgOTIgCisyMiA2NSAxNTYgMTcwIDU3IDEwNCA4NiAxMjYgMTQ4IDExOCAxNTUgNzggNDMgNjMgOTAgNDggODAgMTY4IDE0MiA2OCAxMiAzOSAxNzQgCis2OSAxNjggMTQ3IDExOCA5NiAzNCAxMjkgMzUgNzUgNSAxMDcgNjAgMTcwIDE4MCAxNDcgODUgMyAxMzMgNzUgOTUgMTUyIDcxIDE3NSAKKzQzIDk0IDE3OCA1MCAxNDQgMTYgNDYgMTAxIDQ2IDE2NSA0NSA2OCAxNjMgMzggMTcyIDUgMTM4IDYxIDg1IDYyIDE3NyA3NiAzNiAxNjcgCisxOSA1MyAxNTEgNjYgNjYgOTcgMyAxMDAgMTY0IDEyIDk4IDEzMSA3MCAxMDkgMTYyIDE2MSAxNTYgMTQyIDE0IDEwNSAyNyAxNDEgOSAKKzE3OCA4MSA1MCAxMTMgMTEwIDEzMSAzNyAxNiA3OSAxMiAzNCAzNyAxNjcgMTczIDEwIDE1MiA3IDgxIDE0MCAxNTggMjYgMTM2IDgyIAorNTAgMTcyIDE1NCA0NSAxNjAgMzEgMTIyIDE2NyAxNDIgOSAxNTAgMTI1IDUxIDU0IDEyNSAxNzQgMTAgMTI0IDUxIDE3NyA4MSAxNzMgCis2OSAxMDkgOCAyMiAxNTUgMTkgODYgNjIgMTQ5IDMzIDM3IDEwOCAzNCA5NiAyOSAxNzQgMTMzIDE2NyA1MCA1NCA2NiAxMzAgOSAxIDM2IAorMTM0IDEwOCA2NSA5NyAxMjYgNTYgMTYzIDcxIDgzIDg4IDEwIDEgOCAxNzggMjIgNiAxMTIgMTY5IDExNiA4OSA0MyAxNTMgNDAgMTQ2IAorODUgMzEgODkgNzQgMTU0IDEzNyAyOCAxMTUgMTE3IDEyMiAxMDggOTggOCAyNyAxMTAgMTAzIDE3NiAxNyAyMCAyNyA3NyAxMCA5MyAKKzE0NSA4MCAxNyAxNDMgMTY1IDc2IDY5IDc4IDEwMiAyMCA5MSAxNzEgOTUgMjkgMTE1IDE3NiAxNjYgMTA5IDM5IDIzIDcwIDgzIDI5IAorMTQ4IDY3IDE2MyAxNjEgMzMgNCAxNSA0NiA0MiAyIDY5IDEwNCA1MyAzMyAxNjAgNjQgMzMgMTU1IDE0IDEzMSAxNjAgNTkgNzggNzEgCisxOSAxNzYgMTA3IDY1IDM4IDgyIDU1IDQwIDU2IDQwIDExNSA4NCAyOSAyNSA0NCA2OCAxMDQgMTc2IDc2IDY0IDEyMyAxOCAyNSAxMzYgCisyMyA2IDE3MSAzMSAzMCAzMCA1OCAxNCAxMyA3MiA1NyAxNCA0MSAyOCAxNDMgNzMgMjYgMTY3IDgzIDE0NyA1NCAyIDM2IDExIDY1IDY2IAorMzggMTQxIDk5IDQxIDE3OSA1NSAxNTggNTcgMTM3IDE3OSAxMTQgMjAgNTggNzggMTIgMTU3IDE3NSAxNjYgNTAgMTc3IDIyIDEyOSA2OCAKKzE2OCAxNzUgNzQgOTMgMTE0IDE3NCAxMDIgNzkgMTM1IDE3MiAzNiA0NCAxNTggMTQ5IDkyIDgxIDEwOSAxNTcgMTExIDcyIDExOSBeCiszNzIgMCA1OSA1MiAxMTIgMTgwIDIwIDMwIDIyIDE3MyA4MCA5OCA0NiAxMDYgMTc5IDY1IDMwIDE3IDEyNyAxMjUgMjYgODcgMTUgNSAKKzEzNiA4NSAxMDAgNjYgMTQxIDE4MiAxMjQgMTUgMTU2IDE0OCAxNSA1NiA5OCAxNDYgMTU2IDQ4IDE0OSAzIDE0IDk2IDUyIDc5IDExNSAKKzEzNCAxNzAgNTQgMTc4IDU0IDIyIDczIDMwIDQ1IDM5IDEzMyAxODIgOTYgMTAzIDE0OCAxNzYgNiA0NSA2MiAxODMgNTEgMTgwIDE1MyAKKzE0NSAxNDUgMTE3IDIxIDkwIDExOCAxMDkgMjEgNjIgMjIgMTAxIDQ5IDUzIDExIDE0MiA4NiAxMzIgNjYgNjkgNDQgNzkgODcgMTE1IAorNTUgNSAxNjkgMTUwIDYzIDExMCAxMDkgMTc3IDE1MCA5MSAxMjkgNDAgMTQ5IDE1OSAxMDIgMTY1IDMgNzAgMjcgMTc1IDIzIDU2IDEyNiAKKzE2NSAxNjQgMjAgMTU4IDkxIDE1NyAxMzYgMTU3IDEzMSAxMTEgNjkgMzkgMzMgMTMyIDQzIDE5IDE3NSAxNzkgMzcgMTE4IDkgMTU1IAorMTE2IDEyMiAxMjggNTIgNyA4NCA4OSA1OCAxMyA4NSA0NCAxMzUgMTI1IDU0IDE4MyAyMyAxNjEgMTQ1IDE3MyAxMzYgMjkgNjIgNTAgCisxMyA1NyAyNSAxMjcgMTUzIDQ1IDk1IDY0IDEyMSA0MCAxMjEgMTQwIDE3MSA5IDcxIDE2NiA2OCAyOCAxMDIgNCA1MyAxMjMgMTExIAorMTQ4IDIwIDEwMiAxNjAgMzQgOCAxMzkgMzIgMTE2IDY2IDEzIDExMyA2MyAxNDMgOTcgNjMgMTAgNTkgMTI0IDY2IDQxIDEzMiA3MSAKKzExNSAxMDYgMTUxIDQ2IDIyIDQ1IDExOCAzNyA2NyAxMjQgOTQgNjAgMTQwIDQzIDQ3IDEwIDExMCA5IDEyNyA5NyA3IDE1NiA0MyAxODAgCisxMjUgMTI2IDEzNyAxNDUgMTIgMiA4MiAxNDYgMTAwIDExNyAyNiA1OSAxODAgMTgxIDE2NCA3NiA4OSAzMCAxMDEgNzcgNzIgMTI2IAorMTE0IDk1IDE0MyAxMDIgMzIgMTQ5IDEzMSA4MyAxNTcgMzEgNjEgMTIzIDEzOSA2MCAxMzUgNzQgMTY5IDEyMiAxNTEgMTAyIDEzNyAKKzE2OCA2MiA1NSAxNjYgMTE5IDk3IDE2MyA2MCAxMTIgMjQgMTE2IDM4IDE3OCAxMDUgOTEgMTM0IDg2IDI3IDQ3IDEzOCA3MiA3MCAxODMgCis3OSAxNSA4NCAxMTcgMTU0IDEyOCA1NyA1MyAzOSAxNjEgMTcgMTA0IDc1IDE1NyAzIDQyIDggMTY3IDUxIDEyNCAzOCAyMiAxNyA5OSAKKzEwNiAxOCAxMTUgODMgMTAxIDE3NyAxMjIgMTc5IDE0IDY4IDE0MCA3MSAxNDMgMTggODIgMTggMzEgMTMzIDE1NCA3NyAxNzIgMTc2IAorMTY3IDE3OSA5IDk5IDc4IDE4MyAxMTEgOTIgODkgODYgMzIgMTYgMTYgMTQ0IDI5IDkwIDE0NiAxMjggMjkgMzQgMzEgNSA4NSAxNiAKKzExNiAxMCA4MiAxNzQgMTE5IDEyNSA3OSBeCiszOTEgMCA1OSA3NSAxOCA1IDU5IDEzMiAyNiAyMSAxMjcgMTE5IDgwIDk0IDgzIDUyIDYxIDI0IDQ0IDQgNTAgNTUgMTE1IDI5IDcwIAorMTQwIDk5IDE1OSAxMzAgNTQgMTUgNDIgODkgMTE0IDE3MyAyOCA1MCAxNiAzMyA1MyA0NyA1OCAxODAgMTkgNjQgNzggNDkgMzAgMTg2IAorMTA0IDMyIDQ0IDE1NyA4NSAxIDE0OSA4NSA5NyAxMTQgNzcgNjMgNTggNTAgODkgODAgMjEgMzYgODQgNzIgNjAgMTUyIDI1IDg3IDEwOCAKKzE1IDEzOCA1NCAxMDYgNzcgOTcgMjMgNDIgNTUgMTQ5IDE4MSA2MiAxMDYgNDMgMTMyIDMxIDEzOCAxMTEgMTc2IDkzIDQwIDEwIDk2IAorMTI4IDEwNSAxMTQgNDMgOTggNCAxNDYgMjAgMTA3IDEyMCAxNCAxMTMgMTgxIDEwMSAxIDE5IDE1NSAxMTMgNTcgNjQgMTE3IDEzMSA2IAorMjIgMTg2IDEzOCAxODQgMzYgNjEgMjkgMzYgMTc1IDEwNyA2IDYxIDgxIDExNCAyMCAxODAgNDIgMTY5IDEwMiAyNiA3MyA4MCAxNTEgCisxNTMgNjggNCAxMSA5OCAxMzkgNiAxNzUgMzQgMTQ2IDkzIDE1NCA4OCAxMjggMTM5IDc5IDM1IDIgMTM1IDExOSA0NiAxMjkgOTEgODYgCisxNzkgNTEgMTggMTY5IDE0MSAxMDggNDkgMTAzIDQ2IDcyIDIxIDcwIDQ5IDY0IDE1MSA5NiAxODUgMTc1IDEzMCAxMTEgODUgNTggMzIgCisxMDEgNDAgMTAxIDEzMSAxMzYgMTM5IDE3MCA3MCAxMCAxNjkgMTc1IDczIDQxIDY5IDE3NyA0NSA0NyA5MiAxNDUgMTEgMTU1IDIyIDIyIAorNTYgMjEgMTMgMTY2IDQ4IDIxIDEwOSAxMzEgNDAgMTc0IDE3OCAxMDQgMTI4IDkgMTQ5IDUxIDEzMiAxMjIgMTczIDExOSAyMyAyNCA2NyAKKzEwOSA3NCAzMiAxNTggMTEwIDExNyA3NCAxMjMgNiAxMTggMTUxIDEzMCAxNTAgMTY3IDM0IDU1IDU4IDE0NiA1NCA3MiAxMTIgMTA1IAorNTcgMTYwIDgyIDEyMyAxNTkgMTUzIDE1OSAzOSAxOSA3IDggMzMgODcgMTIgNTAgMTQ2IDE1MCAzNyAxMDQgNzEgMTI2IDEzMyAxMDggCisxNDUgNjggMzggMzggOTAgNDMgNzUgMTQ4IDEyMiA0MyAyIDM5IDE1NCA1NCAxNjMgMTQ3IDExMyA5MSAyOSAxMDkgMzUgNzUgMTgyIDg3IAorMzUgMTU1IDE3MCAxMjcgODAgMTg1IDExOCA2MCA5NSAxNDIgNzEgMTY1IDI4IDg0IDE2OCAyNSAxNDQgMTc4IDMxIDgxIDQxIDE2MCAyNSAKKzUzIDE0MyAyMyAxNzIgMTcyIDEzMyA1MSA3NSA1MiAxNTcgNTEgMzYgMTU3IDE4MSAyOCAxNDEgNTEgNDEgODcgMTY1IDg1IDE1NCAxODQgCis5MyAxMzEgNDUgMTA0IDE2MiAxNjEgMTQxIDE0MiAxNCA5NSAxMiAxNDEgMTgxIDE1OCA3MSAzNSA5OCAxMDAgMTExIDEyIDExIDY0IAorMTc0IDE0IDIyIDE1MiAxNzMgNSAxMzIgMTc5IDU2IDEzNSAxNTMgMTEgMTIxIDU3IDMwIDE1MiAxMzkgNDAgMTQwIDUzIF4KKzM4NCAxIDEwNiAxNTkgMTE4IDE2NyAxNTAgMTAxIDExIDMwIDEwOSAxNTAgMTg0IDEyNCAxOSAxNjkgNzMgMTY1IDUzIDEwOSAxNTggCisxNzIgMTQ3IDExIDQ2IDM4IDE0OSAyNSAyMSA5MiAxODQgNjQgMTc5IDE1OCAxMzMgMTM1IDM0IDM4IDU4IDExNCA5IDE4MyA0IDExOCAKKzc2IDQ5IDg5IDEwMiA0MCAxNjMgNDcgNzUgODAgMTc2IDE3NSA4IDE1NCAxNCAxODAgMTA0IDE1MyA4NCA4OSAxMSAxMjkgOCAxMzggODUgCisxODEgNzMgNjYgMTU0IDEyMSAyMCAxMTUgOTMgMTE0IDEwOCA4MiAxODIgMTkgODYgMTAzIDE3NiAxODMgMTg2IDE3NyA1MyAxMCA2OSAKKzEzNyA1NiAxIDEzNSAxNDEgNjggNjkgNTQgODYgMTIgNzUgMTcxIDg3IDE4NyAxMDcgMTQ0IDE1MCA5MyAyMyA3IDcwIDgzIDI5IDE0MCAKKzY3IDEzOSAxNTMgMTgzIDE3OCAxODkgMzAgMTggMiAyOSA3MiAyOSAzMyAxNjAgNTYgOSAxMjMgMTY0IDEwNyAxMzYgMTkgNzAgMzEgCisxNzcgMTUyIDk5IDU3IDM4IDY2IDU1IDMyIDMyIDI0IDgzIDYwIDIxIDEgMzYgNTIgODAgMTY4IDQ0IDMyIDExNSAxODQgMjUgMTIwIAorMTgxIDE3MiAxNTUgMTg5IDIyIDMwIDI2IDE4MCA1IDY0IDQ5IDE4OCAxIDI4IDExMSA1NyAxNzYgMTY3IDY3IDEzMSAyMiAxNjAgMTg2IAorMTY5IDY1IDM0IDMwIDExNyA5MSAxNyAxNjMgMzkgMTM0IDU3IDEzNyAxNTUgOTAgMTcwIDQyIDc4IDE3MCAxNDEgMTY3IDE1OCA0MiAKKzE3NyAyMiAxMjkgNjggMTY4IDE0MyA3NCAxNTAgODUgODIgMTc0IDc4IDYzIDExMSAxNTYgMjggMTIgMTU4IDE0MSA3NiA1NyA3NyAxMjUgCis3OSA0MCAxMiA1OSA1MiA4OCAxNTYgMjAgMjQgMTgyIDE0OSA1NiA5MiA0NiAxMDYgMTY3IDU5IDE4OSAxMjEgMTE5IDE0IDgxIDE1IAorMTY1IDEzNiA3OSAxMDAgNDIgMTE3IDE4MiAxMTggMTc1IDEzOCAxMjQgMyA1MCA3NCAxMzQgMTU2IDM2IDE0MyAxODEgMTgwIDk2IDIyIAorNjEgOTcgMTM0IDE2NCAyNCAxNjYgMzAgMTAgNjEgNiAzMyA5IDExNSAxNzYgODQgOTcgMTQyIDE1MiAxNSA1MCAxNjUgNDUgMTY4IDEzNSAKKzEzMyAxMjcgOTMgMTUgNjYgOTQgOTEgOSAzMiAxNiA5NSAzNyAyOSAxNzEgMTE4IDY4IDEwOCA2NiA2MyAyMCA1NSA2MyAxMDMgMjUgNSAKKzE2MyAxMzggMzMgOTIgODUgMTY1IDE0NCA2NyAxMjMgMzQgMTM3IDE0NyAxMDIgMTQ3IDMgNTggMTUgMTU3IDUgNTYgMTA4IDE2NSAxNTIgCis4IDE0NiA3MyAxNTcgMTEyIDEzMyAxMTkgMTA1IDM5IDI3IDI3IDEyNiAyNSAxMyAxNTEgMTYxIDI1IDExMiAzIDE0OSAxMTYgMTIyIAorMTA0IDQ2IDcgNzggNzEgNTIgMTc5IDY3IDMyIDEyMyAxMjUgNDggMTU5IDExIDEzNyAxMzkgMTYxIDExMCBeCiszOTQgMCAyIDI2IDUwIDE2MSAyMSAxODIgMTI3IDE1MyA0NSA2OCAxOSAxMjEgMjIgOTQgMTA0IDE0NCAxNjYgMzUgMTY2IDIzIDE3NiAKKzc1IDE4OCA1MyAxMTQgOTMgMTQ4IDE3NyA2NiAxNTEgMTYgMTU2IDEyMSAxODAgOTggNDggMTc5IDk1IDYzIDEwNyA5NyA0NSAxIDIzIAorOTcgNTcgMjMgMTMyIDUzIDc5IDk3IDEyNCAxOSAxODggMTggMTE4IDM3IDIyIDEwNiA5NCA2MCAxMjIgMjUgNDcgMTc2IDExMCAxODQgCisxMDkgNzkgMTY0IDEyMCA0MyAxNTMgODkgOTAgMTI4IDEwOSAxMiAxNjggNjQgMTEwIDgyIDExNyAxOTIgNDEgMTcxIDE2MyAxNjQgNzYgCis1MyAxMiAxMDEgNjggNTQgMTE3IDc4IDU5IDE0MyA4NCAzMiAxMjIgMTA0IDY1IDE0OCAzMSA1MiAxMjMgMTMwIDI0IDEzNSAzOCAxNTEgCis5NSAxNDIgOTMgMTAxIDE1OSA2MiAzNyAxNDggMTEwIDcwIDEyNyA1MSA4NSAxODEgODkgMTEgMTQyIDEwNSA5MSAxMDcgNTAgMjcgMjkgCisxMDIgMzYgNDMgMTY1IDc5IDYgODQgOTkgMTE4IDEyOCAzMCAyNiAzIDE0MyAxNyA2OCA2NiAxMzkgMTg3IDE1IDE2NSAxNTggMjQgODggCisyMCAxNzkgMTc0IDgxIDc5IDE4IDEwNiA0NyA3NCAxNTAgMTA0IDE3OSAxNjIgNTkgMTMxIDYyIDExNiAxNjYgODIgMTg0IDE4OCA5NyAKKzEzNiA0MSAxMzYgMTY3IDE0MCAxNDMgMTc1IDcyIDQyIDE3NCAxNDggNzUgNzQgNzEgODYgMTQgMTYgMTkxIDExNyAxMSA2MyAxMTkgCisxMTkgMTg2IDE4MiAxMyAxNzEgNDkgMTgyIDgwIDE2NyA3MyAxNDcgMTE5IDEwNyAxNjQgNDEgNTcgMTgxIDE2OCAyOSAxMTQgMjYgMTg0IAorMTIxIDEwMSA4MCA3NiA2NSAzNCA0OSAyNCA0NCAxOTEgMzggMjUgOTEgNSA1OCAxNDAgOTkgMTUzIDEyNCA1NCAxODQgNDIgODMgMTA4IAorMTU1IDQgMjAgMTkxIDMgMjkgMzUgNDAgMTgwIDcgNDAgNjYgMjUgMTIgMTgwIDg2IDI2IDM4IDEzOSA3MyAxIDEzNyA3OSA4NSAxMDIgCis3MSAzOSAyOCA0NCA3NyA1NiAxOTAgMTIgNjYgNzIgMzAgMTUyIDcgODcgODQgMTkwIDEyNiA0OCAxMDAgNzcgOTEgMTg2IDM2IDMxIAorMTQzIDE2MyA1MCA5NCAyNSAxMjYgMSAxMTQgMTA1IDE3MCA5MyAyMiAxNzMgOTAgMTE2IDg3IDk2IDE5IDc0IDQgMTIyIDE4MyA4MyAKKzEyMCAxNzcgMTEzIDE2OSAxODEgNzcgMTgyIDEgMTQ5IDEwMSAzMyA1OCA5MyAxMTMgMTgxIDEwIDE4NiAxMzggMTg0IDMwIDYxIDE5MiAKKzYgMTc1IDEwNyA2IDM3IDgxIDExNCAxNCAxNjIgMTIgMTQ1IDkwIDIgNzMgNjggMTMzIDEzNSA1MCAxNzMgMTEgOTggMTE1IDE3NSAxNTEgCisyOCAxNDYgNjkgMTM2IDg4IDEyMiAxMzkgNjEgMTEgMTg5IDEyMyA5NSAyOCAxMTEgNzMgODAgMTU1IDUxIDYgMTYzIDExNyA5MCA0OSAKKzkxIDQwIDU0IDE4OSBeCiszOTAgMCA2MiAyNSA2NCAxNDMgNzIgMTY5IDE1MSAxMDYgMTExIDUzIDU4IDggOTMgOCA4NSAxMjMgMTIwIDEzMSAxNzAgMzggMiAxNjkgCisxNjcgNDkgNDEgMzcgMTUzIDIxIDM5IDkyIDE0NSAxOTAgMTU1IDE3NyAxODUgNDggMTMgNSAxNTAgNDggMjEgODUgMTE1IDQwIDE2NiAKKzE3OCA4OCAxMDQgMSAxMjUgMTkgMTE2IDEwNiAxNDEgMTExIDIzIDQzIDEwMSA1OCAxODcgMTUwIDc4IDEwMSA1MCAxMDcgMTg1IDg2IAorMTUxIDEzMCAxMzQgMTQzIDM0IDMxIDI2IDEyMiAzOCA0MCAxMTIgOTcgMzMgMTM2IDUwIDk5IDEyNyAxMjEgMTU5IDcgMTkgMTcwIDE4NyAKKzEgNzkgMTkxIDI2IDEzMCAxMTggNSAxMDQgNDcgMTI2IDEwOSA5MiAxMjkgNTIgMzAgMTkzIDkwIDM1IDY3IDExNiA5MCAzIDE4MSAzOSAKKzEyMiAzMCAxNTUgMTQ3IDEwNSA4MyAyMSA3NyAzNSA3NSAxNzQgNTUgMTkwIDEzMSAxNTQgOTUgNzIgMTg1IDk0IDM2IDk1IDEyNiA3MSAKKzE0OSA0IDY4IDE1MiAxODAgMTQ0IDE0NiA3IDQ5IDMzIDE1MiAxODggMjkgMTExIDE5NCAxNzIgMTQ4IDEyNSAzNSA1OSAzNiAxMjUgMTEgCiszNiAxNDEgMTQ5IDE4MyAxMjUgMjcgMSA3MSAxMzMgNjEgMTM4IDE2OCA4NSAxMzEgNSA5NiAxNjIgMTYxIDExNyAxNDIgMTQgNzkgMTgzIAorMTQxIDE2NSAxMjYgNTUgMTEgNzQgODQgNzkgMTY3IDMgNDAgMTQyIDE3NyAxOTMgMTI4IDE3MyAxOTIgMTAwIDE2MyAxNiAxMjcgMTQ1IAorMTgyIDk3IDE3IDE5MyAxMjAgMTE1IDMyIDEwOCAxOCA5NiAxNTQgMTAzIDE1MiAxNTAgODYgMTgxIDE1IDk5IDEzNSAxNzkgMTI0IDE5NCAKKzE2NCA2OCAxNjAgNDMgMTA5IDEzOCAxNTIgMTQyIDYgMjEgMjMgMTQ5IDIwIDExIDgyIDE2NCA0NCAxNTkgMTQ4IDEzMyAxMTUgMjQgMjggCis1MyAxMDQgOSAxODMgMTc5IDEwOCA1NiAzOSA4NCA4NyAzMCAxNjMgMzIgNzAgNzUgMTY2IDE3MCA4IDEzOSA5IDE3NSA5OSAxNDMgNjQgCis4OSAxODYgMTE0IDE4MyAxMzMgODUgMTYxIDYzIDYxIDE1NCAxMTEgMTUgMTE1IDc4IDEwOSAxMDggNzIgMTc3IDE0IDcxIDEwMyAxNzYgCisxNzMgMTc2IDE1NyAzOCAxMCA1NCAxMzIgNDEgMTg2IDEzMCAxMjYgNjMgNjkgMzkgNzYgNyA2NSAxNzEgODIgMTcyIDEwMiAxMjQgMTQwIAorODMgMTMgMTkyIDcwIDgzIDI5IDEzNSA2NyAxMjQgMTQ4IDE2MyAxNzMgMTg0IDIwIDMgMiA0IDUyIDE0IDMzIDE2MCA1MSAxODkgMTAzIAorMTQ0IDkyIDEyMSAxODkgNjUgNiAxNjIgMTM3IDk0IDUyIDM4IDU2IDU1IDI3IDE3IDE0IDYzIDQ1IDE2IDE4MSAzMSA0MiA2NSAxNjMgCisyNCAxMiAxMTAgMTc0IDI1IDExMCAxNjYgMTYyIDE0NSAxNzQgMTcgMzAgNiAxNzAgNTkgNDQgMTgzIDE3MSAyOCA5MSA0NyAxNTYgMTcyIAorXgorNDAwIDEgNTEgMTE1IDE4OCAxMzYgMTU0IDE0NSA2NSAyIDIyIDkzIDgzIDE5MSAxNDcgMjMgMTEwIDU3IDEzNyAxMzEgNjYgMTM4IDI2IAorNzggMTQ2IDEyNSAxNTkgMTUwIDM0IDE3NyAyMiAxMjkgNjggMTY4IDExMSA3NCAxMTggNzcgNTAgMTc0IDU0IDQ3IDg3IDE0MCAyMCAKKzE3OCAxNTggMTMzIDYwIDMzIDQ1IDkzIDQ3IDggMTcwIDU5IDUyIDU2IDEyNCAyMCAxNiAxNTAgMTE3IDI0IDg0IDQ2IDEwNiAxNTEgNTEgCisxNTggMTczIDExMyAxMTEgMTk2IDczIDE1IDEzMyAxMzYgNzEgMTAwIDEwIDg1IDE4MiAxMTAgMTQzIDExNCA5MiAxODUgNDIgNDIgMTE4IAorMTU2IDIwIDEzNSAxNzMgMTU2IDk2IDE4MCAzNyA3MyAxMzQgMTU2IDE4MiAxNTAgMTk2IDE5MiA0NSAxNzIgMTcgMTY3IDkxIDE2OCA2OCAKKzg5IDEzNCAxMjAgMTkwIDE3MyAzNCAxNDEgMzcgMTUyIDExMSAxMTcgMTAzIDYxIDcgMzQgNjIgNjcgMTkxIDE5MCA4IDg3IDIxIDE5NSAKKzEzOSA4NiA0NCA3NiA2NiA1NSAxODYgMjMgMzEgODcgMTgzIDUgMTU1IDEyMiAxOTEgNjggNTMgMTQ5IDEzNiAzNSAxMTUgMjYgMTIxIAorMTMxIDEwMiAxMjMgMyA0MiAxOTcgMTMzIDE3OSA1NiA4NCAxNjUgMTM2IDE5MCAxMzAgNDkgMTU3IDgwIDEwMSAxMDMgOTcgMTk3IDExIAorMTkgMTE4IDEgNSAxMTkgMTM3IDkgMTA0IDE5MyAxNDEgMTE2IDEyMiA3MiAzOCA3IDcwIDQ3IDQ0IDE1NSA0MyAxNiAxMDcgMTI1IDQwIAorMTI3IDE5MyAxMDUgMTMxIDE0NSAxMDggMTg1IDYgNTAgMTQxIDEgMTY3IDEyNyAxNTMgNDUgNTMgMTkyIDEyMSAxMiA3OSA4NCAxMjkgCisxNTEgMTUgMTY2IDE5NiAxNTYgNjAgMTg4IDUzIDEwOSA4MyAxNDggMTYyIDQ2IDE0NiA2IDEzNiAxMTEgMTYwIDg4IDM4IDE2OSA4NSAKKzYzIDg3IDk3IDM1IDE5NCAzIDgyIDUyIDEzIDEzMiA0MyA1OSA5MiAxMDkgNCAxNzggMyAxMTggMzcgMTk1IDk2IDk0IDYwIDExMiAxNSAKKzQ3IDE2NiAxMTAgMTc5IDk5IDY5IDE0OSAxMDAgNDMgMTM4IDY5IDcwIDEyMyA4OSAxMiAxNTggNTQgOTAgNzIgMTE3IDE4MiAzMSAxNjYgCisxNTMgMTY0IDc2IDMzIDIgMTAxIDYzIDQ0IDExMiA1OCAzOSAxNDMgNzQgMzIgMTA3IDg5IDU1IDE0MyAzMSA0NyAxMjMgMTI1IDQgMTM1IAorMTggMTQxIDgwIDEzNyA4OCA4MSAxNTQgNjIgMjcgMTM4IDEwNSA1NSAxMDcgNDYgNzAgMTY2IDc0IDE5NCAxMjIgMTA1IDkxIDkyIDMwIAorMjcgMTkgODIgMTYgMjggMTU1IDc5IDEgODQgODkgOTggMTI4IDE1IDExIDE4MSAxMzMgMTcgNDggNjEgMTI5IDE4NyAxNTAgMTUzIDkgCis2OCAxMCAxNjQgMTU5IDcxIDY0IDE4IDEwMSAyNyA1OSAxMzUgOTQgMTc5IDE0MiA1NCAxMjYgNTcgMTAxIDE0NiA4MiAxNzQgMTczIDc3IAorMTI2IDIxIDExNiAxNjIgMTI1IDEyMyAxNjUgNTcgMjIgMTY5IDE1MyBeCiszOTQgMCA0NyA2MCA1NyA4NiAxNiAxODQgOTYgMTk3IDQyIDk4IDExMiAxNjUgMTU0IDE5OSAxNTcgMjEgMTY4IDUyIDE0NiA2NiAxMjYgCisxMTkgOTMgMTUwIDIwIDM2IDE1MyAxNDAgMTk0IDkzIDI2IDE1NiAxMTQgODAgODAgNTUgNDQgMTMgMzUgMjQgNDQgMTkxIDI0IDE5MCAKKzYzIDE3NyA0NCAxNDAgOTkgMTQ2IDExNyA1NCAxNjMgNDIgNzYgMTAxIDEzNCAxNzYgMTg1IDE3NyAxNjggMSAyMSAxOSAxODAgMTkzIAorMTIgNTIgMTk3IDE5MSAxNzMgNjUgMTkgMzEgMTE4IDU5IDEgMTIzIDcyIDcxIDg4IDY0IDExIDE5MyAzNyA2MyAyOCAxNjkgMTg0IDQ1IAorNzIgMTk1IDE1MiAxODYgODcgNTYgMTc2IDExMiA0MSA5MyA3NyA4NCAxNTggMjkgMyAxMzYgMTQyIDM2IDgwIDQgMTE5IDE2NiA4NiA5OCAKKzE2MyA5MyAxIDE0NSA4MyAxMDIgNjYgNzUgMTkxIDQ2IDQgOTQgMTU1IDU1IDEyMCAxNDkgMTEzIDE0OCAxODEgNDkgMTc1IDE4MCAxNDIgCis4NyA1IDUxIDY1IDkyIDE2NyAxOTYgMTg2IDEzOCAxODQgMjMgNjEgMTY0IDE3MSAxNzUgMTA3IDYgOSA4MSAxMTQgNyAxNDEgMTc3IAorMTE3IDc2IDE3NCA3MyA1NCAxMTIgMTE0IDI5IDE1MiAxMSA5OCA4NyAxNTQgMTIzIDIxIDE0NiA0MSAxMTUgODggMTE1IDEzOSA0MCAKKzE4MyAxODkgMTA5IDY3IDcgOTAgNTIgNzMgMTI3IDUxIDE5MiAxNTYgODkgNjkgNDkgNzcgMzMgMzMgMTgyIDU3IDEwIDY0IDEzOCA1NyAKKzE1OSAxMzYgOTEgMTExIDMzIDU4IDE5MyA4OCAxODggNzUgMTE4IDExMCAxMjYgMTcwIDE4IDE5NyAxNjkgMTYyIDM0IDQxIDE3IDEzOCAKKzYgMzQgOTIgMTQ1IDE4NSAxNTUgMTU3IDE3MCA0MyA4IDE0MCA0OCAyMSA3MCAxMDUgNDAgMTYxIDE3OCA3OCA4OSAxOTYgMTEwIDE5OSAKKzEwNiA5NiAxMjEgMTA2IDIzIDE4NSAyOCA5NiA0OCAxNjcgMTQ1IDU4IDkxIDM1IDk3IDE4MCA2NiAxNTEgMTMwIDEyNCAxMjggMzQgMTYgCis2IDEwNyAyOCAyMCAxMTIgOTIgMTggMTIxIDMwIDg0IDEwNyAxMDEgMTU5IDE4NyAxOSAxNTUgMTgyIDE4MSA3NCAxODYgMTEgMTIwIDk4IAorMTg1IDEwNCAzMiAxMjYgOTQgODIgMTE5IDQyIDI1IDE3MyA5MCAzMCA2MiA5NiA3MCAxNzggMTc2IDM5IDEwMiAxNSAxNTAgMTQ3IDEwMCAKKzc4IDE2IDU3IDM1IDc1IDE2OSAzNSAxNzAgMTE2IDE0NCA3NSA2NyAxODUgNzkgMjEgOTUgMTE2IDcxIDEzOSAxODkgNTggMTQyIDE2MCAKKzE0NCAxMjYgMTkyIDI5IDI4IDE0NyAxNzMgMTQgOTEgMTg0IDE3MiAxMzMgMTIwIDI1IDQ5IDI2IDEwNSAxODYgMzYgMTMxIDEyOSAxNjMgCisxMTUgMTIgMTc2IDYxIDExMyA0NiAxMjggMTU4IDgwIDEzMSAxODAgOTEgMTYyIDE2MSAxMDIgMTQyIDE0IDY5IDE3MyAxNDEgMTU1IAorMTA2IDQ1IDE5NiA1OSA3NCA1OSAxNDcgMTk1IF4KKzQxMiAwIDE2IDExMCAxNTMgMTc3IDEwNCAxNzMgMTkyIDY4IDE0NyAxNzkgMTE5IDEzNyAxNjYgNzMgMTgwIDE2OSA4OCA5MSAyNCA3NiAKKzEwIDgwIDE0NiA3OSAxMjggMTUwIDYyIDE0OSAxOTQgODMgMTExIDE3MSAxMjQgMTcwIDE1NiA2MCAxNTIgMjcgMTA5IDEwNiAxMjAgCisxMzQgMjAxIDE4NCAyMDIgMTQ5IDEyIDE5OCA2NiAxMzIgMTIgMTI3IDEzMiAxMzMgODMgOCAxMiA0NSA4OCA5IDE4MyAxNTUgOTIgMjQgCisyMyA3NiA2MyAxNCAxNjMgOCA2MiA2NyAxNTAgMTYyIDggMTE1IDEgMTY3IDkxIDEyNyAzMiA4OSAxNjIgOTAgMTU5IDEyNSA4NSAxMjkgCis0NyA1MyAxNTQgOTUgNyAxMTUgNTQgMTAxIDEwOCA1NiAxNjkgNiA0NyAxMDMgMTc2IDE1NyAxNjAgMTI1IDE0IDEwIDMwIDEyNCAxNyAKKzE3OCAxMjIgMTAyIDU1IDY5IDE1IDYwIDIwMiA0OSAxNzEgNzQgMTQ4IDk0IDkyIDEyNCA2NyAyMDAgMTg0IDcwIDgzIDI5IDEyNyA2NyAKKzEwMCAxNDAgMTMxIDE2NSAxNzYgNCAxODIgMiAxNjcgMjAgMTkzIDMzIDE2MCA0MyAxNzMgNzEgMTEyIDY4IDk3IDE1NyA1NyAxNjkgCisxMzggMTEzIDg2IDQ0IDM4IDQwIDU1IDE5IDE5NiAyMDEgMzEgMjEgOCAxNjUgMjMgMjYgNDEgMTU1IDE5NSAxODMgMTAyIDE1OCAyNSAKKzk0IDE0MiAxNDYgMTI5IDE1MCA5IDMwIDE3NyAxNTQgMTk1IDUxIDM2IDE3NSAxMzkgMjggNTkgMzEgMTI0IDE2NyA0MSAxMDUgMTczIAorMTIxIDEzNCAxMzAgNjUgMTg1IDE3IDc4IDc4IDE4MSAxMzcgMTMgOTUgNTcgMTM3IDExNiA1MSAxMTggMTYgNzggMTMxIDExNSAxNTQgCisxNDUgMjkgMTc3IDIyIDEyOSA2OCAxNjggOTEgNzQgOTggNzIgMzAgMTc0IDM5IDM3IDcyIDEzMCAxNSAxNjMgMTU4IDEyOCA1MCAxOCAKKzI1IDczIDI3IDE5MSAxNTAgNTkgNTIgMzYgMTA0IDIwIDExIDEzMCA5NyA0IDc5IDQ2IDEwNiAxNDEgNDYgMTM4IDE2MyAxMDggMTA2IAorMTkxIDY4IDE1IDExMyAxMzYgNjYgMTAwIDE5MyA2NSAxODIgMTA1IDEyMyA5OSA3MiAxODAgMzcgMjIgMTA4IDE1NiAxMCAxMzAgMTY4IAorMTQxIDk2IDE2MCAyMiA1OCAxMzQgMTUxIDE2MiAxNDAgMTgxIDE4NyAzNSAxNTcgNyAxNDcgNzYgMTYzIDU4IDg0IDEyOSAxMDAgMTkwIAorMTUzIDI0IDEyNiAzMiAxNDIgOTYgMTA3IDg4IDQxIDIgMTQgNDIgNTIgMTg2IDE3MCAzIDgyIDExIDE4MCAxMTkgNjYgMjkgNTYgNjYgCis1MCAxNzEgMyAxMSA3NyAxNjMgNSAxNTAgMTEyIDE3MSA1MyAzMyAxMzkgMTMxIDE1IDExMCAyMSAxMTEgMTIxIDEwMiAxMDggMyAzMiAKKzE5MiAxMTggMTY5IDU2IDY5IDE2NSAxMjYgMTg1IDEyMCAzNCAxNTcgNjAgODEgOTMgOTIgMTc3IDEgMTQgMTEzIDE4OSA5OSAxMjIgCisyMDIgOTkgMTkzIDEzNiAxMTYgMTIyIDUyIDMzIDcgNjUgMzIgMzkgMTQwIDI4IDYgOTcgMTI1IDM1IDEwNyAxODggODUgMTI2IDEzNSAKKzk4IDE3NSAxODkgNTAgMTIxIDE4NCAxMTYgXgorNDEzIDEgMTI3IDE1MyA0NSAzMiAxNjQgMTIxIDIwMyA1OCA1NiAxMDggMTMwIDE5MiAxNjYgMTY4IDEyOCAzOSAxODggNTMgMTAyIDY5IAorMTQ4IDE0MSAxOCAxMzkgMTk3IDEwOCA5NyAxMzIgNzQgMjQgMTU1IDcxIDYzIDU5IDk3IDIxIDE5NCAxODAgNjEgNDUgMjA0IDEzMiAyOSAKKzMxIDg1IDg4IDE4OCAxNjQgMTg3IDExOCAzNyAxNjcgODIgOTQgNjAgOTggMSA0NyAxNTIgMTEwIDE3MiA4NSA1NSAxMjggNzIgNDMgCisxMTcgNDEgNDIgMTE2IDYxIDEyIDE0NCA0MCA2MiA1OCAxMTcgMTY4IDE3IDE1OSAxMzkgMTY0IDc2IDUgMTkzIDEwMSA1NiAzMCAxMDUgCiszMCAxMSAxNDMgNjAgMzIgODYgNjggNDEgMTM2IDMxIDQwIDEyMyAxMTggMTgxIDEzNSAxOTUgMTI3IDU5IDEzMCA4MSA1MyAxNDcgNjIgCisxMyAxMjQgOTggMzQgNzkgMzkgNDkgMTQ1IDUzIDE4MCA5NCAxMDUgOTEgNzEgMiAyNyA1IDU0IDE5MyA3IDE0MSA3OSAxOTkgODQgNzUgCis3MCAxMjggMTk5IDE5NSAxNjAgMTE5IDE3IDIwIDU0IDExNSAxODcgMTg0IDEyOSAxNDYgMTkzIDQwIDIwMSAxNDMgMTM4IDU3IDQzIDE4IAorOTQgMjA0IDM4IDExNCA4MCAxNzkgMTE0IDQ3IDExOSA1MCA4MCAxMTggODIgMTYwIDE1MiA0OSAxMTIgMTk4IDg4IDE1NSAxMDQgOTUgCisxNTEgMzYgMTk5IDE2MiAxMDAgMjcgNTAgNDcgODYgMTk1IDE2IDE3OSA4MSAxOTIgMjcgODMgMTA3IDE1MCAxMzQgMTk0IDE0NyAxIAorMTU4IDMyIDEzMSA2MSAxMTEgMTE5IDgzIDE0MCA1IDIxIDEzMyAxMjAgMTc0IDc4IDI2IDEzNiAxMDkgNjUgODAgNDAgMjkgMjAzIDI1IAorMjQgNDQgMTkxIDE0IDE3MCA0MyAxNjIgMzQgMTQwIDk5IDE0MSAxMTIgNTQgMTQ4IDQyIDcxIDk2IDExOSAxNjEgMTY1IDE2NyAxNDggCisxODYgMTEgNCAxODAgMTg4IDE5NyA0MiAxODIgMTgxIDE2OCA1MCAxNCAyNiAxMDMgNDkgMSAxMTMgNjcgNjEgNzggNTkgMTk2IDE3MyAKKzMyIDUzIDggMTU0IDE2OSAzMCA3MiAxNzUgMTUyIDE3NiA4NyAzNiAxNjYgMTAyIDM2IDg4IDc3IDc5IDEzOCAyNCAxODggMTMxIDEyNyAKKzI2IDcwIDE5NCAxMTQgMTQ2IDY2IDkzIDE1OCA5MyAxOTEgMTI1IDc4IDkyIDUxIDYwIDE3NiAyNiA0IDc0IDEzNSAzNSAxMjAgMTI5IAorMTEzIDEzMyAxODEgMjkgMTcwIDE3MCAxMzcgNzcgMTkwIDQ2IDQ1IDc3IDE1NyAxOTEgMTg2IDEzOCAxODQgMTggNjEgMTQ0IDE1MSAKKzE3NSAxMDcgNiAxOTQgODEgMTE0IDIgMTI2IDE1NyA5NyA2NiAxNTkgNzMgNDQgOTcgOTkgMTQgMTM3IDExIDk4IDY3IDEzOSAxMDMgMTYgCisxNDYgMjEgMTAwIDg4IDExMCAxMzkgMjUgMTY4IDE4OSA5OSA0NyAxOTcgNzUgMzcgNjggMTA3IDUxIDE4NyAxNTEgNjkgNTQgNDkgNjcgCisyOCAxOCAxNzIgNTIgMjAwIDY0IDEzMyA0MiAxNDkgMTIxIDc2IDExMSAxMyA1OCAxODMgODMgMTczIDY1IDExMyAxMDAgMTIxIDE3MCAKKzIwMyAxOTcgMTY5IDE1NyAxOSAyMDIgXgorNDM0IDEgMTkzIDExNCAxOTAgMjYgOTIgMTQ1IDE3NyAxNTUgMTI1IDE0NiAzNSAyMDAgMTI0IDQ4IDIxIDQ2IDg5IDQwIDE1MyAxNzggCis2MiA2NSAxOTYgODYgMTc1IDkwIDgwIDg5IDk4IDIzIDE2OSA0IDg4IDMyIDEzNSAxMzcgMjYgNzUgMTEgODEgMTcyIDM0IDE1MSAxMzAgCisxMDggMTA0IDM0IDIwMCAxODIgODMgMTIgMTk2IDExMiA4NCAyMDIgOTcgMjA2IDYwIDc1IDY5IDE1OSAxNjMgMTkgMTMxIDE3NCAxNTcgCis2NiAxNzggMTk1IDEwNCA2NiAxNjEgMTA0IDggMTI2IDcwIDY2IDEwMyAyNiAxNyAxNDEgOTAgMjIgNTQgNjQgMzggMTQ2IDE2OCAzOSAKKzcwIDE5OSAxNDIgMTQ3IDkyIDcwIDggMjUgMzUgNzUgMTYxIDMgMTM4IDkyIDEyOCA0MyA1OSAxODUgNTUgMjA1IDk1IDEwMCA3MSAxMjMgCisxNzMgNDIgMTI2IDEyOCAxNDQgOTQgMTc2IDIwNSAyMCAxMzkgMTQ5IDE5OCA1OSAxNjggMTcyIDEwOSAxMTIgOSAzMyAxMCA3MyAxNTQgCiszNiAxMTUgOTcgMTMxIDk5IDE5NiAxNDQgNDUgODEgMjIgMTEyIDE0MiA3MiAxMzEgMTQ4IDgzIDE2MiAxNjEgNzggMTQyIDE0IDUzIAorMTU3IDE0MSAxMzkgNzQgMjkgMTgwIDM1IDU4IDI3IDExNSAxOTggMSA5MCAxMzggMTY3IDg5IDE3MyAxOTIgNDggMTM3IDE1OSAxMTQgCisxMzIgMTU2IDU4IDE2MCAxNTQgNjggNzYgMTkgNTYgNSA3MCAxNDEgNjQgMTEzIDE1MCA0NyAxMjkgMTg0IDczIDk2IDE2NiAxMjQgMTU1IAorMTUxIDU1IDE0NyAxNyAxMDkgODYgMTAwIDEyOSAyMDEgMTY0IDE5MiAxNDkgNyAxOTMgNTYgMTEyIDIwMCAxMDcgMTIyIDEzMyA2MyAKKzIwNiAyIDQwIDc4IDkgMTgzIDE0MCA4MiA0IDEzIDcxIDQ4IDQgMTYzIDIwMSA1NyA2MiAxNDAgMTU3IDggMTAwIDIwNCAxNjIgODYgCisxMTcgMTIgODkgMTQ3IDc1IDE0NCAxMjAgODUgMTA5IDM3IDQ4IDE1NCA4NSAyIDExNSAzOSA5NiAxMDggNDYgMTY0IDEgMzIgMTAzIAorMTc2IDE0NyAxNTAgMTA1IDIwNyAxMCAxNSAxMTkgMiAxNzMgMTE3IDg3IDUwIDY5IDUwIDIwMiAzOSAxNzEgNjkgMTMzIDg5IDcyIDExNCAKKzU3IDE5NSAxNzkgNzAgODMgMjkgMTIyIDY3IDg1IDEzNSAxMTEgMTYwIDE3MSAyMDIgMTcyIDIgMTQ3IDE4MyAzMyAxNjAgMzggMTYzIAorNTEgOTIgNTMgODIgMTM3IDUyIDE0OSAxMjMgOTggODEgMzkgMzggMzAgNTUgMTQgMTg2IDE5NiAxMSA2IDMgMTU1IDE4IDE2IDI2IDE1MCAKKzE4MCAxNjggOTcgMTQ4IDI1IDg0IDEyNyAxMzYgMTE5IDEzNSA0IDMwIDE2MiAxNDQgMTk1IDQ2IDMxIDE3MCAxMTkgMjggMzkgMjEgCisxMDQgMTY3IDMxIDk1IDE1OCAxMDYgMTE0IDExNSA2NSAxNzAgMTIgNjMgNzMgMTcxIDEyNyAzIDgwIDU3IDEzNyAxMDEgMzYgOTggNiAKKzc4IDExNiAxMDUgMTQ5IDE0MCAyNCAxNzcgMjIgMTI5IDY4IDE2OCA3MSA3NCA3OCA2NyAxMCAxNzQgMjQgMjcgNTcgMTIwIDEwIDE0OCAKKzE1OCAxMjMgNDAgMyA1IDUzIDcgMTc2IDEzMCA1OSA1MiAxNiA4NCAyMCA2IDExMCA3NyAxOTIgNzQgNDYgMTA2IDEzMSA0MSAxMTggCisxNTMgMTQ0IF4KKzQzOCAxIDk5IDE4NCA2MSAxNSA4NSAxMzYgNTkgMTAwIDE3MiAzNyAxODIgOTggOTUgNzggNDQgMTczIDMwIDIwNCA5NCAxNTYgMjA2IAorMTIzIDE2MSAxMjAgOTYgMTMyIDEgMzcgMTM0IDE0NCAxMzQgMTI2IDE2MCAxODAgMjEgMTM2IDIwMyAxMTkgNTUgMTU2IDQ0IDc3IDEyMiAKKzcyIDE5MCAxMjUgMTAgMTA1IDI1IDEyOCA3NSA5MyA2NyAxMyAyMDUgMTk2IDE0IDMxIDE3OSAxNDIgMjA2IDc1IDIwNyAxNTkgOTEgMzggCis4IDI4IDY2IDQzIDE1MCAxODUgMTkzIDYzIDEzNSA1IDE0MyA5OCAxNDMgMzIgNSAxMjUgMTI0IDE5NyAxMDMgMTQgOTcgMTA3IDEwMiAKKzg3IDMgMTggMTg1IDk3IDE1NSA1NiA0OCAxNjUgMTEyIDE3OCAxMDYgMTMgMTU3IDMyIDUzIDc5IDg1IDE0OSAxOTcgNyAxMDYgMTc1IAorMjAzIDcxIDEwMSAxOTUgOTIgMTkzIDEyOSAxMTYgMTIyIDI0IDI2IDcgNTggMTEgMzIgMTE5IDcgMjAyIDgzIDEyNSAyOCA3OSAxODEgCis1NyAxMTkgMTIxIDg0IDE2MSAxNjggNTAgOTMgMTYzIDEzMSAxMjcgMTUzIDQ1IDE3IDE0NCAxMjEgMTk4IDQzIDM2IDkzIDExNSAxNzcgCisxNjYgMTQ4IDEwOCAyNCAxODggNTMgOTcgNTkgMTQ4IDEyNiAyMDggMTM0IDE5MiA4OCA4NyAxMTIgNjQgMTQgMTQ1IDYxIDYzIDM5IDk3IAorMTEgMTk0IDE2NSA0NiA0MCAxOTkgMTMyIDE5IDExIDgwIDczIDE3OCAxNTQgMTc3IDExOCAzNyAxNDcgNzIgOTQgNjAgODggMjAxIDQ3IAorMTQyIDExMCAxNjcgNzUgNDUgMTEzIDUyIDQzIDEwMiAyMSAyMiAxMTEgNDEgMTIgMTM0IDMwIDQyIDQ4IDExNyAxNTggNyAxNTQgMTI5IAorMTY0IDc2IDE5NSAxODggMTAxIDUxIDIwIDEwMCAxMCAyMDEgMTQzIDUwIDMyIDcxIDUzIDMxIDEzMSAzMSAzNSAxMjMgMTEzIDE2NiAKKzEzNSAxODAgMTE3IDQ0IDEyNSA3NiAzMyAxNDIgNjIgMyAxMTQgOTMgMTkgNTkgMzQgMzQgMTMwIDM4IDE3MCA3NCAxMDUgOTEgNTYgCisxOTIgMjcgMjA1IDM0IDE3OCAyMDIgMTMxIDc5IDE5OSA4NCA2NSA1MCAxMjggMTg5IDE4NSAxNDUgMTA5IDE3IDQ5IDEwNSAxODcgMTc0IAorMTE0IDE0MSAxODMgMjAgMTk2IDEyOCAxMjMgNDcgMjggMTggODkgMTg5IDIzIDk5IDcwIDE3OSA5NCA0MiAxMTQgNDUgNjUgOTggODIgCisxNTAgMTM3IDI5IDEwMiAxODMgNjggMTUwIDg5IDc1IDE0MSAyMSAxODQgMTU3IDgwIDcgNDAgMzcgODYgMTkwIDE2IDE3NCA2NiAxODcgCisxMiA2OCAxMDIgMTM1IDExNCAxODkgMTM3IDE5MSAxNDggMTIgMTE2IDU2IDk2IDExOSA3MyAxMzAgMjAwIDYgMTEzIDEwMCAxNTQgNjMgCisyNiAxMTYgMTA0IDUwIDgwIDI1IDE0IDE5MyAxNSAyNCA0NCAxOTEgNCAxNTAgMjMgMTQ3IDI0IDE0MCA5OSAxMzYgMTA3IDU0IDEzMyAKKzQyIDY2IDkxIDEwNCAxNDYgMTQ1IDE1NyAxMjggMTcxIDEgMTk5IDE4MCAxODMgMTgyIDMyIDE2NyAxNzEgMTYzIDM1IDkgMjEgODggMzkgCisxIDEwMyA2MiA1MSA2OCA1NCAxODEgMTUzIDI3IDQzIDE5OCAxMzkgMTU0IDE1IDcyIDE1NSAxNTIgMTY2IDg3IDE2IDE1NiA5MiAzMSAKKzgzIDc3IDc0IDExOCAxOSAxNzMgMTI2IDIwMiBeCis0MzEgMCAxMCA1NCAxNzggMTA2IDExNCAzNCA4NSAxNTAgOTMgMTc1IDkzIDcwIDc2IDI3IDM2IDE1MiAyMDcgNCA0MiAxMDMgMyAxMjAgCis5NyAxMTMgMTA5IDE4MSAyMTAgMTYyIDE1NCAxMjkgNjEgMTY2IDM4IDEzIDUzIDE0MSAxODMgMTg2IDEzOCAxODQgMTAgNjEgMTEyIAorMTE5IDE3NSAxMDcgNiAxNzAgODEgMTE0IDIwNyAxMDIgMTI1IDY1IDUwIDEzNSA3MyAyOCA3MyA3NSAyMDMgMTEzIDExIDk4IDM1IDExNSAKKzcxIDggMTQ2IDIwMiA3NiA4OCAxMDIgMTM5IDEgMTQ0IDE4OSA4MyAxNSAxODEgNTEgMTMgNjAgNzUgNTEgMTc5IDE0MyAzNyAzMCA0OSAKKzUxIDIwIDIwNyAxNTYgNDQgMTg0IDY0IDEyNSAxOCAxMzMgOTcgNTIgMTExIDE5NCA1OCAxNjcgNzUgMTQ5IDQ5IDEwNSA4NCAxMTMgCisxNzAgMTc5IDE5NyAxNjkgMTQ5IDIwOCA0MSAxNzggOTkgMTgwIDIxIDkyIDE0NSAxNzIgMTU1IDEwNSAxMzEgMzAgMjA4IDIwMCAxMTQgCis0OCAyMSAzMSA3OSA0MCAxNDggMTc4IDUyIDUwIDE5NiA3MSAxNjAgODAgNzAgNjkgOTMgMjMgMTU5IDIwMiA4MyAyMiAxMTUgMTMyIDYgCis2NSAyMDkgNzEgMTY3IDE0IDE1MSAxMzAgOTggODkgMzQgMTkwIDE2NyA2OCAyIDE4MSAxMTIgNzkgMTkyIDgyIDE5MSA0NSA1NSA0OSAKKzE1OSAxNDggMTkgMTE2IDE2OSAxNDIgNjEgMTczIDE4NSA5NCA0NiAxNDYgMTA0IDIwNiAxMjYgNTUgNTYgOTMgMTYgMTIgMTIxIDkwIAorMTcgNDkgNDQgMTggMTI2IDE2MyAzOSA1MCAxODkgMTM3IDE0NyA4NyA2NSAzIDUgMzUgNzUgMTU2IDE5NiAxMTggNzcgMTE4IDIzIDU0IAorMTg1IDQwIDE5NSA5NSA5MCA3MSAxMTMgMTYzIDMyIDExNiAxMDggMTQ0IDc0IDE2NiAxOTAgMTUgMTM0IDEzNCAxODggMzkgMTU4IDE3MiAKKzk0IDEwNyAyMTIgMjMgNTMgMTM0IDM2IDEwNSA3NyAxMTEgODkgMTg2IDEyNCAzNSA2MSA3IDEwMiAxMzIgNjcgMTMxIDEyOCA3OCAxNjIgCisxNjEgNjMgMTQyIDE0IDQzIDE0NyAxNDEgMTI5IDU0IDE5IDE3MCAyMCA0OCA3IDk1IDE5OCAxOTkgNzAgMTIzIDE1NyA3NCAxNzMgMTkyIAorMjggMTI3IDEzOSAxMDkgMTI3IDE0NiA0MyAxNDAgMTM5IDQ4IDYxIDE0IDM2IDYwIDEzNiA0OSA5OCAxNTAgMzIgMTA5IDE3NCA2MyA4MSAKKzE2MSAxMjQgMTQwIDE0NiA1MCAxNDIgNyAxMDkgNjYgODAgMTI0IDIwMSAxNDQgMTgyIDE0OSAyIDE4OCA0NiA5MiAxODUgODcgMTEyIAorMTMzIDQzIDIwMSAyMDUgMzUgNjggOSAxODMgMTI1IDcyIDE5NyAzIDY2IDMzIDIwNyAxNjMgMTkxIDUyIDU3IDEzMCAxNTIgOCA4NSAKKzIwNCAxNTcgODEgMTA3IDIwNSA4OSAxMzIgNjAgMTI5IDExNSA4NSA4OSAyNyA0MyAxNTQgNzUgMjEwIDExNSAyNCA5MSAxMDggMzYgCisxNTkgMjA5IDE3IDEwMyAxNzYgMTM3IDE0MCA4NSAxOTcgMTAgMTE0IDIwMCAxNjggMTEyIDcyIDQ1IDY5IDE5OCA0MCAyMDIgMjkgMTcxIAorNjQgMTE4IDg0IDUyIDEwNCA0NyAxOTAgMTc0IDcwIDgzIDI5IDExNyA2NyA3MCAxMzAgOTEgMTU1IDE2NiAxOTcgMTYyIDIgMTI3IDE5MyAKKzE3MyA4MiBeCis0NjQgMSAxNjAgMzEgMTQ5IDIzIDY0IDMyIDYxIDEwOSA0NSAxMjEgMTAyIDc3IDc0IDMyIDM4IDE2IDU1IDcgMTcyIDE4OSAxOTggMjAwIAorMjExIDE0MSAxMSAyIDUgMTQzIDE1OSAxNDcgOTAgMTM0IDI1IDcwIDEwNiAxMjIgMTA1IDExNCAyMTIgMzAgMTQxIDEzMCAxOTUgMzkgCisyNCAxNjMgOTEgMjggMTEgNyA3NiAxNjcgMTcgODEgMTM3IDg1IDg2IDk0IDY1IDE0OSA1IDQyIDY2IDE1NyAxMTMgMjA0IDU5IDU3IAorMTM3IDgwIDE1IDcwIDIwNyA3OCA5NSA5MSAxNDIgMTMzIDE3IDE3NyAyMiAxMjkgNjggMTY4IDQzIDc0IDUwIDYwIDE5NyAxNzQgMyAxMyAKKzM2IDEwNiAzIDEyNyAxNTggMTE2IDI2IDE5NyAxOTIgMjUgMTk0IDE1NSAxMDIgNTkgNTIgMjAzIDU2IDIwIDIxNCA4MiA0OSAxNzEgNjcgCis0NiAxMDYgMTE3IDM0IDkwIDEzOSA5NiA5NCAxNzkgNTYgMTUgNjUgMTM2IDU0IDEwMCAxNTcgMTcgMTgyIDkzIDc1IDYzIDI0IDE2OCAKKzI1IDE4OSA4NCAxNTYgMjAxIDExOCAxNTYgMTA1IDk2IDExMiAyMDEgMjIgMTM0IDEzOSAxMTQgMTE2IDE0NSAxNzUgMTEgMTIxIDE5OCAKKzk5IDQwIDE1MSAzNCA3MiAxMTcgNTIgMTkwIDEwNSA5MCAyMCAxMTggNjAgODMgNTIgMjA4IDIwNSAxODEgMjA5IDE2IDE3NCAxMjIgCisyMDYgNzAgMjAyIDE0NCA3MSAxOCAyMDggOCA2NiAzOCAxMzUgMTcwIDE3OCA1MyAxMTUgNSAxMzggODggMTIzIDE3IDIwMCAxMTUgMTE5IAorMTgyIDk4IDkgODcgOTcgMTAyIDcyIDMgOCAxODAgODIgMTQ1IDU2IDMzIDE2NSAxMDIgMTczIDk2IDIxMyAxNTcgMTIgMzMgNjkgODAgCisxMjkgMTkyIDIgMTAxIDE2NSAyMDMgNTEgODYgMTkwIDg3IDE5MyAxMjQgMTE2IDEyMiA0IDIxIDcgNTMgMjExIDI3IDEwNCAyMDcgMTk3IAorNzMgMTI1IDIzIDU5IDE3NiAzNyAxMTQgMTExIDc0IDE1MSAxNTMgNTAgNzMgMTQ4IDExNiAxMjcgMTUzIDQ1IDIgMTI0IDEyMSAxOTMgCisyOCAxNiA3OCAxMDAgMTYyIDE2NiAxMjggODggOSAxODggNTMgOTIgNDkgMTQ4IDExMSAxOTMgMTI5IDE4NyA2OCA3NyA5MiA1NCA0IAorMTM1IDUxIDYzIDE5IDk3IDEgMTk0IDE1MCAzMSAzNSAxOTQgMTMyIDkgMjA2IDc1IDU4IDE2OCAxNDQgMTY3IDExOCAzNyAxMjcgNjIgCis5NCA2MCA3OCAxOTYgNDcgMTMyIDExMCAxNjIgNjUgMzUgOTggMzIgNDMgODcgMSAyIDEwNiAyMSAxMiAxMjQgMjAgMjIgMzggMTE3IAorMTQ4IDIxMiAxNDkgMTE5IDE2NCA3NiAxODAgMTgzIDEwMSA0NiAxMCA5NSAyMDUgMTg2IDE0MyA0MCAzMiA1NiAzOCAyMSAxMjYgMzEgCiszMCAxMjMgMTA4IDE1MSAxMzUgMTY1IDEwNyAyOSAxMjAgNzEgMTMgMTM3IDYyIDIwOCAxMDQgODggNCAzOSAyOSAxOSAxMTUgMjMgMTYwIAorNTQgMTA1IDkxIDQxIDE3NyAyNyAyMDAgMTQgMTYzIDE5MiAxMjEgNzkgMTk5IDg0IDU1IDMwIDEyOCAxNzkgMTc1IDEzMCA5OSAxNyAKKzE5NSA0NCA5NSAxODcgMTY0IDk5IDEzNiAxNzMgMTkxIDExMyAxMDggMzcgMTMgMTggODQgMTc0IDggODQgNjAgMTc5IDc0IDM3IDEwOSAKKzQwIDUwIDc4IDgyIDE0MCAxMjIgOSA5MiAxNjggNDggMTQ1IDc0IDU1IDEzMSA2IDE2OSAxNTIgNjAgMjAyIDMwIDI3IDg2IDE4NSAxNiAKKzE2OSA1MSAxODIgMjEyIDUzIDk3IDE4NSBeCis0NTIgMSA4MiAxODEgMTIxIDE2NyAxMzIgMTk4IDkyIDQ4IDcyIDExOSA1NyAxMTQgMTg0IDIwMCA4MSA2OCAxMjIgMzkgMjYgODQgOTYgCisyNiA4MCAxIDIwOCAxNzcgMjE3IDI0IDQ0IDE5MSAyMDYgMTE4IDIwOSAxMjMgOCAxNDAgOTkgMTI4IDk5IDU0IDEwOSA0MiA1OCA4MyAKKzgwIDEyMiAxMTMgMTQxIDk2IDE0NyAyMDMgMTgzIDE4MCAxNzUgMTU4IDE2IDE0MyAxNTUgMTU1IDExIDEgMTMgNjQgMjMgMSA4NyA1NCAKKzM1IDUyIDQ2IDE1NyAxMjEgMTkgMjcgMTc0IDExNSAxMzAgMjA5IDcyIDEyMyAxNTIgMTUwIDg3IDIwMiAxNDAgNzYgMjMgNzUgNzcgNjYgCis4NiAxMSAxNDkgMTE4IDg4IDQ0IDE2OCAxMDEgOTQgMTQgODAgMTQ1IDkzIDE2NSA3MyA2NSA2NiAxMiAyMSAxMzcgMTkyIDQgMjIgODMgCisyMDEgMTIwIDc3IDExMyA5NCAxODEgMTk1IDE1NyAxNDQgMTI0IDUxIDE1MSAzMyAyMTEgMzggMTMxIDE3OCAxODYgMTM4IDE4NCA1IDYxIAorOTIgOTkgMTc1IDEwNyA2IDE1NSA4MSAxMTQgMjA3IDg3IDEwNSA0NSA0MCAxMjAgNzMgMTggNTggNjAgMTkzIDk4IDExIDk4IDE1IDEwMCAKKzUxIDMgMTQ2IDE4NyA2MSA4OCA5NyAxMzkgMjA0IDEyOSAxODkgNzMgMjEzIDE3MSAzNiAyMTYgNTUgNTUgNTEgMTc0IDEzOCAxNyAxNSAKKzQ5IDQxIDE1IDE5NyAxNDYgMzkgMTc0IDY0IDEyMCAzIDEyMyA4MiAzNyAxMTEgMTc5IDU4IDE1NyA3MCAxMzQgMzkgMTAwIDc0IDEwOCAKKzE3MCAxNjQgMTk3IDE2OSAxNDQgMTk4IDQxIDE2MyA4NCAxNzAgMTYgOTIgMTQ1IDE2NyAxNTUgODUgMTE2IDI1IDIwOCAyMDAgMTA0IAorNDggMjEgMTYgNjkgNDAgMTQzIDE3OCA0MiAzNSAxOTYgNTYgMTQ1IDcwIDYwIDQ5IDg4IDIzIDE0OSAxOTIgNzggMTIgOTUgMTI3IDIwNCAKKzU1IDE5OSA2MSAxNjIgMjEyIDE1MSAxMzAgODggNzQgMzQgMTgwIDE1MiA1MyAyMTAgMTY2IDExMiA3NCAxODIgNjcgMTc2IDMwIDM1IAorMjkgMTU5IDEzMyAxOSAxMDEgMTY0IDEyNyA1NiAxNjggMTc1IDg0IDI2IDEzMSAxMDQgMTk2IDEyNiA0MCA0NiA4MyA2IDcgMTAxIDkwIAorMTIgNDQgMjQgMjE2IDEwNiAxNTggMzkgMzAgMTc5IDEzMiAxNDcgODIgNjAgMjE2IDIwMyAzNSA3NSAxNTEgMTgxIDk4IDYyIDEwOCAzIAorNDkgMTg1IDI1IDE4NSA5NSA4MCA3MSAxMDMgMTUzIDIyIDEwNiA4OCAxNDQgNTQgMTU2IDE3NSAxMCAxMjkgMTE5IDE3OCAxOSAxNDggCisxNzIgNzkgMTAyIDIwNyAxMyAyMDggMzMgMTE0IDM2IDk1IDU3IDkxIDc5IDE3NiAxMDQgMjUgNDEgMjEwIDkyIDEyMiA2MiAxMzEgMTA4IAorNzMgMTYyIDE2MSA0OCAxNDIgMTQgMzMgMTM3IDE0MSAxMTkgMzQgOSAxNjAgNSAzOCAyMDUgNzUgMTk4IDE4OSA1MCAxMDggMTQ3IDU5IAorMTczIDE5MiA4IDExNyAxMTkgMTA0IDEyMiAxMzYgMjggMTIwIDEyNCAyOCA0NiA5IDE2IDIxMyA1MCAxMzEgMzQgODMgMTUwIDE3IDg5IAorMTY0IDUzIDY2IDE1NiAxMjQgMTI1IDE0MSA0NSAxMzcgMjE1IDEwOSA0NiA2MCAxMTkgMjAxIDEyNCAxNzIgMTQ5IDIxNSAxODMgMzYgCis3MiAxNzAgNjcgMTAyIDEzMyAyMyAxOTYgMjAwIDMwIDU4IDkgMTgzIDExMCA2MiAxODIgMjExIDYxIDE4IDIwMiAxNjMgOTcgXgorNDYzIDEgNDUgNTAgMTE2IDE0NSA4IDY0IDIwNCAxNTAgNzQgOTMgMTg0IDg5IDExMSAzOSAxMDggMTA4IDg1IDYxIDEzIDM2IDE1NCA2MSAKKzIxMCAxMTUgMyA4NCAxMDggMjIgMTUyIDIwOSAyMTYgMTAzIDE3NiAxMjMgMTI2IDU3IDE4MyAxMCAxOTkgMTA3IDE4NiAxNjEgMTA1IAorNTEgMzggNjkgMTg0IDI2IDIwMiAxNSAxNzEgNTcgOTcgNzcgMjQgOTAgMzMgMTgzIDE2NyA3MCA4MyAyOSAxMTAgNjcgNDkgMTIzIDYzIAorMTQ4IDE1OSAxOTAgMTQ4IDIgOTkgMTcyIDE1OSAzMyAxNjAgMjYgMTM5IDMgNDQgMTcgNDYgODkgNDAgMTAxIDg3IDYyIDY5IDI3IDM4IAorNiA1NSAyIDE2MiAxODQgMTgzIDE5MCAyMTEgMTMxIDYgMjEyIDIxMCAxMzggMTQ0IDEzMiA4NSAxMjQgMjUgNjAgOTEgMTEyIDk1IDk5IAorMjEyIDMwIDEyNiAxMjAgMTk1IDM0IDE5IDE1OCA3MSAyOCAyMTEgMjE3IDU2IDE2NyA3IDcxIDEyMiA3MCA2NiA3OSA2NSAxMzQgMjcgCis2MSAxNDcgMTAzIDE5OSA0NCA1NyAxMzcgNjUgNTAgMjAyIDc4IDgwIDgxIDEzNyAxMjggMTIgMTc3IDIyIDEyOSA2OCAxNjggMjMgNzQgCiszMCA1NSAxODIgMTc0IDIwOCAzIDIxIDk2IDIxOCAxMTIgMTU4IDExMSAxNiAxODcgMTc3IDUgMTc5IDE0MCA4MiA1OSA1MiAxODggMzYgCisyMCAyMTQgNjIgMjkgMTU2IDYyIDQ2IDEwNiAxMDcgMjkgNzAgMTI5IDkxIDg5IDE3NCA1MSAxNSA0NSAxMzYgNDkgMTAwIDE0MiAyMTcgCisxODIgODggNTUgNDggNCAxNjMgMjAgMTc0IDc0IDE1NiAxOTYgMTEzIDE1MSA5MCA5NiA5MiAxOTEgNyAxMzQgMTM0IDk0IDEwNiAxMzAgCisxNzAgMSAxMDYgMTkzIDc5IDI1IDE0NiAyNCA2NyAxMTIgMzIgMTkwIDg1IDIxMCA3NSAxNSAxMDggNDUgNzMgMzcgMTkzIDIwNSAxNjYgCisxOTQgMSAxNjkgMTAyIDIwNiA2NSAxOTcgMTI5IDUxIDIxOCAxOTggMjA4IDY2IDMzIDEyMCAxNTUgMTYzIDQzIDk1IDUgMTMzIDc4IAorMTAzIDIgMTg1IDEwNSAxMTQgMTY3IDkzIDQgNzcgODcgMTAyIDU3IDMgMjE4IDE3NSA2NyAxMzUgNTYgMTggMTY1IDkyIDE2OCA4NiAKKzIwMyAxNTcgMjEyIDEzIDU5IDc1IDEwOSAxODcgMjE3IDk2IDE1NSAyMDMgMzEgNzEgMTg1IDgyIDE5MyAxMTkgMTE2IDEyMiAyMDQgMTYgCis3IDQ4IDIwMSAyMiA4OSAxOTcgMTkyIDYzIDEyNSAxOCAzOSAxNzEgMTcgMTA5IDEwMSA2NCAxNDEgMTM4IDUwIDUzIDEzMyAxMDEgMTI3IAorMTUzIDQ1IDIwNyAxMDQgMTIxIDE4OCAxMyAyMTYgNjMgODUgMTQ3IDE2NiAxMDggNjggMjE0IDE4OCA1MyA4NyAzOSAxNDggOTYgMTc4IAorMTI0IDE4MiA0OCA2NyA3MiA0NCAyMTQgMTI1IDQxIDYzIDIxOSA5NyAyMTEgMTk0IDEzNSAxNiAzMCAxODkgMTMyIDIxOSAxOTEgNzAgCis0MyAxNTggMTM0IDE1NyAxMTggMzcgMTA3IDUyIDk0IDYwIDY4IDE5MSA0NyAxMjIgMTEwIDE1NyA1NSAyNSA4MyAxMiA0MyA3MiAyMDEgCisyMDIgMTAxIDEgMTIgMTE0IDEwIDIgMjggMTE3IDEzOCAyMDcgMTQ0IDEwOSAxNjQgNzYgMTY1IDE3OCAxMDEgNDEgOTAgMTkwIDE3MSAKKzE0MyAzMCAzMiA0MSAyMyAxMSAxMjEgMzEgMjUgMTIzIDEwMyAxMzYgMTM1IDE1MCA5NyAxNCAxMTUgNjYgMjEzIDEzMiA2MiAyMDMgOTQgCis4MyAyMDkgMTkgMjQgNCAxMDAgOCAxNTAgMTYwIF4KKzQ3NCAwIDEwNSA5MSAyMCAxNTYgMjcgMTkzIDIwOCAxNDIgMTc4IDEwNyA3OSAxOTkgODQgNDEgMiAxMjggMTY1IDE2MSAxMDkgODUgMTcgCisxNzQgMzcgODEgMTg3IDE1MCA3OCAxMjkgMTU5IDE5NCAxODQgOTIgODcgMjMgMjE0IDE4IDc3IDE1MyAyMDkgNjMgNDYgMTc5IDQ2IDMwIAorMTAyIDMzIDI5IDUwIDgyIDEyNiAxMDEgMjAzIDc4IDE0NyAyMCAxMzggNTMgMjcgMTE3IDIwNyAxNDggMTQ1IDMyIDE4MSAxNiAxMyA4NiAKKzE3OCAxNiAxNjIgMzAgMTc1IDE5OCAzMiA5MCA5OSA2NiAxNzcgMTEzIDE1NSAxMjQgMTg2IDgwIDQ0IDYwIDExOSA0OSAxMDYgMTc2IAorMTkyIDY1IDUyIDEwNiAyNyAyNiA2OCA5MiAxNCA4MCAyMTEgMjAwIDE2OSAyMTMgMjQgNDQgMTkxIDIwMiAxMDIgMTk3IDExMSAxNDAgCis5OSAxMjQgOTUgNTQgOTcgNDIgNTQgNzkgNjggMTEwIDk3IDEzMyA4MCAxMzUgMTk5IDE3NSAxODAgMTcxIDE0NiA4IDEzMSAxNDcgMTUxIAorMjIxIDIxOSA5IDUyIDE1IDEgNzkgNTAgMjcgNDQgNDIgMTQ1IDEwNSAxNSAxOSAxNjIgMTAzIDExOCAyMDEgNzIgMTA3IDE1MiAxNDIgCis4NyAxOTAgMTMyIDY4IDE5IDcxIDc3IDYyIDcwIDcgMTM3IDExNCA3NiAyMTQgMzYgMTYwIDk3IDc4IDIyMCA3NiAxNDEgOTMgMTU3IDU3IAorNjEgNTggOSAxMjUgMTgwIDQgNiA2NyAxODkgMTIwIDYxIDExMyA4MiAxODEgMTgzIDE1MyAxMzYgMTIwIDQzIDEzOSAyOSAxOTkgMjYgCisxMjMgMTc0IDE4NiAxMzggMTg0IDEgNjEgNzYgODMgMTc1IDEwNyA2IDE0MyA4MSAxMTQgMjA3IDc1IDg5IDI5IDMyIDEwOCA3MyAxMCAKKzQ2IDQ4IDE4NSA4NiAxMSA5OCAyMjEgODggMzUgMjIxIDE0NiAxNzUgNDkgODggOTMgMTM5IDE5NiAxMTcgMTg5IDY1IDIwMSAxNjMgMjQgCisyMDggNTEgMzkgNTEgMTcwIDEzNCAxIDMgNDkgMzMgMTEgMTg5IDEzOCAzNSAxNjYgNjQgMTE2IDIxMyAxMTUgNzAgMjUgMTExIDE2NyAKKzU4IDE0OSA2NiAxMjIgMzEgOTYgNjYgMTA0IDE3MCAxNTIgMTk3IDE2OSAxNDAgMTkwIDQxIDE1MSA3MiAxNjIgMTIgOTIgMTQ1IDE2MyAKKzE1NSA2OSAxMDQgMjEgMjA4IDIwMCA5NiA0OCAyMSA0IDYxIDQwIDEzOSAxNzggMzQgMjMgMTk2IDQ0IDEzMyA2MiA1MiAzMyA4NCAyMyAKKzE0MSAxODQgNzQgNCA3OSAxMjMgMTkyIDQ3IDE5MSA1MyAxNTggMjAwIDE1MSAxMzAgODAgNjIgMzQgMTcyIDE0MCA0MSAyMDYgMTU0IAorMTEyIDcwIDE3NCA1NSAxNjQgMTggMTkgMTMgMTU5IDEyMSAxOSA4OSAxNjAgMTE1IDUyIDE2NCAxNjcgNzYgMTAgMTE5IDEwNCAxODggCisxMjYgMjggMzggNzUgMjIwIDMgODUgOTAgOCA0MCA4IDIwNCA5MCAxNTQgMzkgMTQgMTcxIDEyOCAxNDcgNzggNTYgMjE2IDE5MSAzNSAKKzc1IDE0NyAxNjkgODIgNTAgMTAwIDIwOSA0NSAxODUgMTMgMTc3IDk1IDcyIDcxIDk1IDE0NSAxNCA5OCA3MiAxNDQgMzggMTQ4IDE2MyAKKzYgMTI1IDEwNyAxNzAgMyAxNDAgMTcyIDY3IDk4IDIwMyA1IDIwNCAxNyA5OCAzNiA4NyA0MSA3NSA3MSAxNjggODggMTcgMjUgMjAyIAorODQgMTE0IDU4IDEzMSA5MiA2OSAxNjIgMTYxIDM2IDE0MiAxNCAyNSAxMjkgMTQxIDExMSAxOCAxIDE1MiAyMTUgMzAgMTkzIDU5IDE5OCAKKzE4MSAzNCA5NiAxMzkgNDcgMTczIDE5MiAyMTQgMTA5IDEwMyAxMDAgMTE4IDEyOCAxNiAxMDQgMTEyIDE5OCBeCis0NjYgMCAyNSAyIDIxMyAyMTMgMzYgMTI0IDEzIDYyIDE1MCAyMjEgNjEgMTUwIDM5IDQ1IDE0OSAxMjQgMTA0IDEzNCAzOCAxMzAgMjA4IAorMTA5IDE4IDMyIDExMiAyMDEgOTYgMTU4IDE0OSAyMTUgMTc2IDIyIDQ0IDE0OSAzOSA4OCAxMzMgMjIwIDE4OSAxOTMgMjMgNDQgOSAKKzE4MyA4OSA0OCAxNjEgMjA0IDU0IDIyMiAxOTUgMTYzIDE2NyA0MCA0NSAxMDYgMTQwIDggNDkgMjA0IDE0NSA2OSA4MyAxNjkgODkgOTYgCisyNCA5MyAxMDMgODUgNDEgMyAzMSAxNTQgNTEgMjEwIDExNSAyMTMgNzkgMTA4IDEyIDE0NyAyMDkgMjA2IDEwMyAxNzYgMTEzIDExNiAKKzM3IDE3MyAxMCAxODkgMTAyIDE3NiAxNTYgMTAwIDM2IDMzIDY5IDE3NCAxNiAyMDIgNSAxNzEgNTIgODIgNzIgNCA4MCAyMyAxNzggCisxNjIgNzAgODMgMjkgMTA1IDY3IDM0IDExOCA0MyAxNDMgMTU0IDE4NSAxMzggMiA3OSAxNTcgMTQ5IDMzIDE2MCAyMSAxMjkgMjA4IDI0IAorMiAzMSA2OSAzNSA4MSA3MiA0NyA2NCAyMiAzOCAyMjEgNTUgMjIyIDE1MiAxNzkgMTY4IDE4MCAyMTEgMTIxIDEgMjA3IDIwMCAxMzMgCisxMjkgMTE3IDgwIDExNCAyNSA1MCA3NiAxMDIgODUgODQgMjEyIDMwIDExMSAxMTAgMTk1IDI5IDE0IDE1MyA1MSAyOCAxOTYgMjEyIDM2IAorMTY3IDIyMiA2MSAxMDcgNTUgNDYgNjQgNjUgMTE5IDIyMCAxMiA1NiAxMzcgOTMgMTk0IDI5IDU3IDEzNyA1MCAyMTAgMzAgMTk3IDc4IAorNjUgNzEgMTMyIDEyMyA3IDE3NyAyMiAxMjkgNjggMTY4IDMgNzQgMTAgNTAgMTY3IDE3NCAxOTggMjE4IDYgODYgMjE4IDk3IDE1OCAKKzEwNiA2IDE3NyAxNjIgMjEwIDE2NCAxMjUgNjIgNTkgNTIgMTczIDE2IDIwIDIxNCA0MiA5IDE0MSA1NyA0NiAxMDYgOTcgMjQgNTAgCisxMTkgODYgODQgMTY5IDQ2IDE1IDI1IDEzNiA0NCAxMDAgMTI3IDIwMiAxODIgODMgMzUgMzMgMjA5IDE1OCAxNSAxNTkgNjQgMTU2IAorMTkxIDEwOCAxNDYgNzUgOTYgNzIgMTgxIDIxNyAxMzQgMTI5IDc0IDk2IDExNSAxNjUgMjE2IDkxIDE4OCA1OSAxMCAxNDEgMTQgNjIgCisxMDcgMTIgMTkwIDY1IDIwNSA2MCAxMCA5OCAzMCA2MyAyMiAxNzggMjA1IDE1MSAxNzkgMjExIDE2NCA4MiAyMDYgNjAgMTkyIDExNCAKKzMxIDIwMyAxODggMTkzIDY2IDI4IDEwNSAxNDAgMTQ4IDMzIDc1IDUgMTI4IDY4IDgzIDIxMiAxNzAgOTUgMTA5IDE1MiA4OCAyMjQgNjcgCis3NyAxMDIgNDIgMyAyMTMgMTcwIDUyIDEyNSA1NiAzIDE2NSA4MiAxNjMgNzYgMTkzIDE1NyAxOTcgMjE4IDQ5IDcwIDg5IDE4MiAyMTcgCis5MSAxNDUgMjAzIDExIDU2IDE4MCA3NyAxOTMgMTE0IDExNiAxMjIgMTg5IDExIDcgNDMgMTkxIDE3IDc0IDE4NyAxODcgNTMgMTI1IDEzIAorMTkgMTY2IDIyMiAxMDQgOTEgNTQgMTMxIDEyMyA1MCAzMyAxMTggODYgMTI3IDE1MyA0NSAxOTcgODQgMTIxIDE4MyAyMjMgMjAxIDQ4IAorNzAgMTMyIDE2NiA4OCA0OCAyMDQgMTg4IDUzIDgyIDI5IDE0OCA4MSAxNjMgMTE5IDE3NyAyOCA1NyA1MiAzNCAyMDkgMTE1IDMxIDYzIAorMjA0IDk3IDIwNiAxOTQgMTIwIDEgMjUgMTg0IDEzMiAyMTQgMTc2IDY1IDI4IDE0OCAxMjQgMTQ3IDExOCAzNyA4NyA0MiA5NCA2MCA1OCAKKzE4NiA0NyAxMTIgMTEwIDE1MiA0NSAxNSA2OCAyMTcgNDMgNTcgMTg2IDE4NyAyMTggXgorNDc3IDEgMjAwIDEyIDEwMCAyMjMgMjAxIDE0IDExNyAxMjQgMjAwIDEzNyA5NSAxNjQgNzYgMTQ0IDE3MSAxMDEgMzQgMjEzIDgzIDE2OSAKKzE1MCAxNDMgMTYgMzIgMjAgMiAyMjQgMTE0IDMxIDE4IDEyMyA5NiAxMTUgMTM1IDEyOSA4MyAyMjAgMTA4IDU5IDE5MiAxMjUgNjIgCisxOTYgODAgNzYgMTk1IDIxOCAxNyAyMTAgNzkgMjE0IDEzNiA2IDEwNSA5MSA1IDE0MSAyNyAxODggMTkzIDEyNyAxNjggOTcgNzkgMTk5IAorODQgMzEgMjA5IDEyOCAxNTUgMTUxIDk0IDc1IDE3IDE1OSAzMiA3MSAxODcgMTQwIDYzIDEyNCAxNDkgMTc5IDE3OSA3NyA3MiAxMyAKKzIwNCAxOCA3MiAxMzggMTk5IDQ4IDM2IDE3OSAyNiAyNSA5NyAyOCAxNCAzMCA4MiAxMTYgODYgMTg4IDY4IDEzMiAxMzMgMzggNyAxMDcgCisxOTcgMTMzIDE0MCAxMiAxNjYgNiAzIDg2IDE3MyAxNiAxNTcgMTUgMTcwIDE4OCAxNyA4NSA4NCA0NiAxNzIgMTAzIDE0MCAxMTQgMTcxIAorNjUgMzkgNDUgMTE5IDM5IDk2IDE2NiAxODIgNDUgMzIgODYgMTIgMjYgNDggODcgMjI2IDgwIDIwMSAxOTAgMTU5IDIwOCAyNCA0NCAKKzE5MSAxOTcgODIgMTgyIDk2IDIxNyAxNDAgOTkgMTE5IDkwIDU0IDgyIDQyIDQ5IDc0IDUzIDk1IDc3IDEyMyA2MCAxMjAgMTk0IDE2NSAKKzE4MCAxNjYgMTMxIDIyNSAxMTYgMTM3IDE0NiAyMTEgMjE5IDQgMzcgNSAxIDY5IDQ1IDE3IDM0IDM3IDEzMCA4NSAxMCA5IDE0NyA4OCAKKzEwMyAxOTEgNzIgODcgMTUyIDEzMiA4NyAxNzUgMTIyIDU4IDE0IDY2IDc3IDU3IDUwIDIgMTIyIDEwOSA2MSAyMDkgMjYgMTUwIDkyIAorNTggMjA1IDcxIDEzNiA5MyAxNDcgMzcgNTYgNDggMjEyIDIyMSAxMTAgMTY1IDQgMjEzIDQ3IDE3NCAxMjAgNDEgMTEzIDY3IDE4MSAKKzE2OCAxNDggMTI2IDExNSAzMyAxMjQgMjQgMTg0IDExIDExMyAxNjkgMTg2IDEzOCAxODQgMjIzIDYxIDU2IDYzIDE3NSAxMDcgNiAxMjggCis4MSAxMTQgMjA3IDYwIDY5IDkgMjIgOTMgNzMgMzEgMzMgMTc1IDcxIDExIDk4IDIwNiA3MyAxNSAyMjEgMTQ2IDE2MCAzNCA4OCA4OCAKKzEzOSAxODYgMTAyIDE4OSA1NSAxODYgMTUzIDkgMTk4IDQ2IDE5IDUxIDE2NSAxMjkgMjA4IDIxNSA0OSAyMyA2IDE3OSAxMjggMzAgCisxNTYgNjQgMTExIDIwMyAxMDUgNTUgMTAgMTExIDE1MiA1OCAxMzkgNjEgMTA3IDIxIDkxIDU2IDk5IDE3MCAxMzcgMTk3IDE2OSAxMzUgCisxODAgNDEgMTM2IDU3IDE1MiA3IDkyIDE0NSAxNTggMTU1IDQ5IDg5IDE2IDIwOCAyMDAgODYgNDggMjEgMjE2IDUxIDQwIDEzNCAxNzggCisyNCA4IDE5NiAyOSAxMTggNTIgNDIgMTMgNzkgMjMgMTMxIDE3NCA2OSAyMjEgNTkgMTE4IDE3NyAzNyAxODEgNDMgMTUzIDE4NSAxNTEgCisxMzAgNzAgNDcgMzQgMTYyIDEyNSAyNiAyMDEgMTM5IDExMiA2NSAxNjQgNDAgMTQ5IDMgMjI2IDIyMCAxNTkgMTA2IDE5IDc0IDE1NSAKKzEwMCA0NyAxNTkgMTU3IDY2IDIxNyAxMDQgMTA0IDE3OCAxMjYgMTMgMjggNjUgMjE1IDIyNSA2NSA5MCAzIDM1IDIxNSAxODkgNzAgCisxNDkgMzkgMjIxIDE2MSAxMjMgMTQ3IDczIDUxIDIxNiAxNzYgMzUgNzUgMTQyIDE1NCA2MiAzNSA5MCAxOTQgNDAgMTg1IDIyNSAxNjcgCis5NSA2MiA3MSA4NSAxMzUgNCA4OCA1MiAxNDQgMTggMTM4IDE0OCAxIDEyMCA5MiAxNjAgMjEwIDEzMCAxNzIgNTIgOTMgMTk4IDIyMiAKKzE5OSAyMjQgMTkgXgorNDc5IDAgMzYgNzMgMTMgNDcgNTcgMTU0IDYwIDMgMjI2IDE4OCA3MCAxMDAgNTEgMTMxIDY0IDYyIDE2MiAxNjEgMTUgMTQyIDE0IDExIAorMTE1IDE0MSA5NyAyMTkgMjE2IDEzOCAyMDEgMTYgMTcyIDMxIDE5OCAxNjcgNiA3NSAxMjUgMjYgMTczIDE5MiAxOTMgOTUgNzUgOTMgCisxMTEgMTE0IDIyNCA3NiA5MSAyMTMgMTMgMjI3IDIwMSAyMTMgMjggMTIwIDEgNTAgMTUwIDIxMyA0NSAxNDIgMzEgMzMgMTQ1IDEyNCAKKzkyIDEzMCAzNCAxMjYgMjA0IDEwOSAyIDE2IDEwOCAyMDEgODAgMTUwIDE0OSAyMTUgMTcyIDE0IDI4IDEzNyAyMyA4MCAxMzMgMjA4IAorMTg1IDE4OSAxOSAzNiA5IDE4MyA3NyA0MCAxNDkgMjAwIDUwIDIxNCAxOTEgMTYzIDE1OSAzNiA0MSA5OCAxMzYgOCAzNyAyMDQgMTQxIAorNjUgNzUgMTU3IDg5IDg0IDEyIDgxIDk5IDg1IDI1IDIyNCAyNyAxNTQgNDMgMjEwIDExNSAyMDUgNzUgMTA4IDQgMTQzIDIwOSAxOTggCisxMDMgMTc2IDEwNSAxMDggMjEgMTY1IDEwIDE4MSA5OCAxNjggMTUyIDk2IDI0IDI5IDY5IDE2NiA4IDIwMiAyMjYgMTcxIDQ4IDcwIDY4IAorMjE3IDcyIDE1IDE3NCAxNTggNzAgODMgMjkgMTAxIDY3IDIyIDExNCAyNyAxMzkgMTUwIDE4MSAxMzAgMiA2MyAxNDUgMTQxIDMzIDE2MCAKKzE3IDEyMSAxOTYgOCAyMTkgMTkgNTMgMzEgNjUgNjAgMzUgNjAgMTggMzggMjE3IDU1IDIyMiAxNDQgMTc1IDE1NiAxNzIgMjExIDExMyAKKzIyNiAyMDMgMTkyIDEyOSAxMTcgMTA1IDc2IDEwNiAyNSA0MiA2NCA5NCA3NyA3MiAyMTIgMzAgOTkgMTAyIDE5NSAyNSAxMCAxNDkgMzUgCisyOCAxODQgMjA4IDIwIDE2NyAyMTggNTMgOTUgNDMgMzAgNTIgNjUgMTA3IDIyMCA1MiAxMjkgODUgMTkwIDE3IDU3IDEzNyAzOCAyMDIgCisxNCAxOTMgNzggNTMgNjMgMTI4IDExOSAzIDE3NyAyMiAxMjkgNjggMTY4IDIxNiA3NCAyMjMgNDYgMTU1IDE3NCAxOTAgMjE0IDIyMyAKKzc4IDIxOCA4NSAxNTggMTAyIDIyNyAxNjkgMTUwIDE5OCAxNTIgMTEzIDQ2IDU5IDUyIDE2MSAyMCAyMTQgMjYgMjIyIDEyOSA1MyA0NiAKKzEwNiA4OSAyMCAzNCAxMTEgODIgODAgMTY1IDQyIDE1IDkgMTM2IDQwIDEwMCAxMTUgMTkwIDE4MiA3OSAxOSAyMSAxOTcgMTU0IDExIAorMTQ3IDU2IDE1NiAxODcgMTA0IDE0MiA2MyA5NiA1NiAxNzMgMjA5IDEzNCAxMjUgNTggODggMTAzIDE2MSAyMTIgNzkgMTg0IDQzIDIyNyAKKzEzNyA2IDU4IDEwMyAyMjUgMTkwIDQ5IDIwMSA0OCA2IDkwIDE4IDU1IDEwIDE2NiAyMDUgMTM5IDE2NyAyMDMgMTYwIDY2IDIwNiA1NiAKKzE4OCAxMDIgMTUgMTkxIDE4MCAxODEgNjYgMjQgOTMgMTI4IDEzNiAyNSA1OSA1IDEyNCA2MCA2NyAyMDQgMTU4IDg3IDEwNSAxNDAgODQgCisyMjQgNTkgNjkgMTAyIDMwIDMgMjA5IDE2NiA0MCAxMTcgNTYgMjIwIDE2NSA3NCAxNTkgNjggMTg1IDE1NyAxODUgMjA2IDQxIDY2IDczIAorMTc4IDIxNyA4NyAxMzcgMjAzIDIyNCA0NCAxNzYgNzMgMTkzIDExMCAxMTYgMTIyIDE3NyA3IDcgMzkgMTgzIDEzIDYyIDE3OSAxODMgCis0NSAxMjUgOSAzIDE2MiAyMTAgMTAwIDgzIDQ2IDEyMyAxMTEgNTAgMTcgMTA2IDc0IDEyNyAxNTMgNDUgMTg5IDY4IDEyMSAxNzkgMjE1IAorMTg5IDM2IDU4IDEyMCAxNjYgNzIgMzIgMTk2IDE4OCA1MyA3OCAyMSAxNDggNjkgMTUxIDExNSAxNzMgMTIgNDkgMzYgMjYgMjA1IDEwNyAKKzIzIDYzIDE5MiAxMTIgXgorNDg1IDEgMjAwIDE5NCAxMDIgMjE0IDE5IDE3OCAxMzIgMjA4IDE1OCA1OSAxMCAxMzYgMTEyIDEzNSAxMTggMzcgNjMgMzAgOTQgNjAgCis0NiAxODAgNDcgMTAwIDExMCAxNDYgMzMgMyA1MCAxOTkgNDMgMzkgMTY4IDE2OSA5MCAxODggMTIgOTIgMjE5IDE4OSA2IDExNyAxMTYgCisxOTYgMTMzIDg3IDE2NCA3NiAxMzIgMTY3IDEwMSAzMCAyMDkgNzkgMTU3IDEzOCAxNDMgOCAzMiA4IDIyMSAyMjAgMTEwIDMxIDE0IAorMTIzIDkyIDEwMyAxMzUgMTE3IDc1IDIxMiAxMDQgNTUgMTgwIDEyMSA2MiAxOTIgNzIgNzIgMTg3IDIwNiAxMyAyMDIgNjcgMjA2IDEyOCAKKzIyMSAxMDUgOTEgMjI0IDEyOSAyNyAxODQgMTgxIDExNSAxNjAgODkgNzkgMTk5IDg0IDIzIDE5NyAxMjggMTQ3IDE0MyA4MiA2NyAxNyAKKzE0NyAyOCA2MyAxODcgMTMyIDUxIDEyMCAxNDEgMTY3IDE3NSA2NSA2MCA1IDE5NiAxOCA2OCAxMjYgMTkxIDM2IDI4IDE3OSAxMCAyMSAKKzkzIDI0IDIgMTQgODIgMTA4IDc0IDE3NiA2MCAxMjAgMjE1IDEyOSAyNiAyMjIgOTkgMTg5IDEyMSAxMzYgMjI3IDE1NCAyMjkgMjI2IAorODYgMTY5IDE2IDE1MyAzIDE2NiAxODAgNSA4MSA3MiAzMCAxNjggOTUgMTI4IDEwNiAxNTkgNTMgMzUgMzMgMTE5IDMxIDg4IDE1OCAKKzE3NCAyOSAxNiA3MCAyNiAzMiA4MyAyMTggODAgMTkzIDE4MiAxNTEgMjA0IDI0IDQ0IDE5MSAxOTMgNjYgMTcwIDg0IDIxMyAxNDAgOTkgCisxMTUgODYgNTQgNzAgNDIgNDUgNzAgNDEgODMgNjEgMTE1IDQ0IDEwOCAxOTAgMTU3IDE4MCAxNjIgMTE5IDIyMSAxMDQgMTI5IDE0MiAKKzIwMyAyMTkgMjUgMjI4IDEgNjEgNDEgOSAyNiAzMyAxMTggNjkgNiAxIDEzNSA3NiA5MSAxODMgNzIgNzEgMTUyIDEyNCA4NyAxNjMgCisxMTQgNTAgMTAgNjIgNzcgNTMgMzQgMjI5IDExMCAxMDUgNDkgMjA1IDE4IDE0MiA4OCA0MiAxOTMgNjcgMTMyIDkzIDEzOSAyMSA1MiAKKzQwIDIwNCAyMTMgOTggMTUzIDQgMjAxIDMxIDE2MiAxMjAgMjUgMTEzIDU1IDE4MSAxNTYgMTQ0IDExOCAxMTEgMjUgMTEyIDIwIDE3MiAKKzIzMCAxMDUgMTY1IDE4NiAxMzggMTg0IDIyMyA2MSA0MCA0NyAxNzUgMTA3IDYgMTE2IDgxIDExNCAyMDcgNDggNTMgMjI0IDE0IDgxIAorNzMgMjIzIDE5IDIxIDE2NyA1OSAxMSA5OCAxOTQgNjEgMjMwIDIyMSAxNDYgMTQ4IDIyIDg4IDg0IDEzOSAxNzggOTAgMTg5IDQ3IDE3NCAKKzE0NSAyMjggMTkwIDQyIDMgNTEgMTYxIDEyNSAxOTYgMjA3IDQ5IDE1IDIgMTcxIDEyMCAyNiAxNDggNjQgMTA3IDE5NSA5NyA0MyAyMjkgCisxMTEgMTQwIDU4IDEzMSA1NyA5NSAxMyA4NyA0OCA5NSAxNzAgMTI1IDE5NyAxNjkgMTMxIDE3MiA0MSAxMjQgNDUgMTQ0IDMgOTIgMTQ1IAorMTU0IDE1NSAzMyA3NyAxMiAyMDggMjAwIDc4IDQ4IDIxIDIwOCA0MyA0MCAxMzAgMTc4IDE2IDIyNyAxOTYgMTcgMTA2IDQ0IDM0IDIyOCAKKzc1IDIzIDEyMyAxNjYgNjUgMjE3IDQzIDExNCAxNjUgMjkgMTczIDM1IDE0OSAxNzMgMTUxIDEzMCA2MiAzNSAzNCAxNTQgMTEzIDE0IAorMTk3IDEyNyAxMTIgNjEgMTU2IDI4IDEzNyAyMjIgMjE0IDIwOCAxNTkgOTQgMTkgNjIgMTUxIDg4IDQzIDE1NSAxNDkgNTggMjA1IDkyIAorMTA0IDE3MCAxMjYgMSAyMCA1NyAyMTEgMjI1IDQ5IDkwIDIzMCAzMSAyMDMgMTc3IDU0IDE0NSAzOSAyMDkgMTUzIDExOSAxNDcgNjkgCis0NyAyMTYgMTY0IDM1IDc1IDEzOCAxNDIgNDYgMjMgODIgMTgyIDM2IDE4NSAxOTggXgorNDgzIDEgMTU1IDk1IDUwIDcxIDczIDEyMyAyMjUgNzYgMjggMTQ0IDIyNyAxMjYgMTMwIDIyOCAxMTQgNzQgMTQ4IDE5MiAxMTggMTcyIAorMzQgODcgMTkyIDIxNiAxOTMgMjA2IDU0IDM2IDY1IDIzMCAzMSA0OSAxNDYgNDQgMjI4IDIxNCAxODAgNjIgOTIgNDcgMTMxIDQ4IDU4IAorMTYyIDE2MSAzIDE0MiAxNCAzIDEwNyAxNDEgODkgMjA3IDIxMiAxMzAgMTkzIDggMTYwIDE1IDE5OCAxNTkgMjIzIDYzIDExNyAxNCAKKzE3MyAxOTIgMTgxIDg3IDU5IDg5IDEwNyAxMDYgMjE2IDYwIDc5IDIwMSAxIDIyNyAxODkgMjEzIDIwIDExNiAyMjIgMzggMTUwIDIwNSAKKzI5IDEzNCAyMyAyMSAxNDEgMTI0IDgwIDEyNiAzMCAxMjIgMjAwIDEwOSAyMTkgMTA0IDIwMSA2NCAxNDIgMTQ5IDIxNSAxNjggNiAxMiAKKzEyNSA3IDcyIDEzMyAxOTYgMTgxIDE4NSAxNSAyOCA5IDE4MyA2NSAzMiAxMzcgMTk2IDQ2IDIwNiAxODcgMTYzIDE1MSAzMiAzNyA5MCAKKzEzMiA4IDI1IDIwNCAxMzcgNjEgNjcgMTQ1IDg5IDcyIDY5IDk1IDg1IDkgMjIwIDIzIDE1NCAzNSAyMTAgMTE1IDE5NyA3MSAxMDggCisyMjkgMTM5IDIwOSAxOTAgMTAzIDE3NiA5NyAxMDAgNSAxNTcgMTAgMTczIDk0IDE2MCAxNDggOTIgMTIgMjUgNjkgMTU4IDIwMiAyMjIgCisxNzEgNDQgNTggNjQgMjA1IDY0IDcgMTcwIDE1NCA3MCA4MyAyOSA5NyA2NyAxMCAxMTAgMTEgMTM1IDE0NiAxNzcgMTIyIDIgNDcgMTMzIAorMTMzIDMzIDE2MCAxMyAxMTMgMTg0IDIyNSAyMTEgNyAzNyAyNyA0OSA0OCAyMyA1NiAxNCAzOCAyMTMgNTUgMjIyIDEzNiAxNzEgMTQ0IAorMTY0IDIxMSAxMDUgMjI2IDE5OSAxODQgMTI1IDEwNSA5MyA3MiA5OCAyNSAzNCA1MiA4NiA2OSA2MCAyMTIgMzAgODcgOTQgMTk1IDIxIAorNiAxNDUgMTkgMjggMTcyIDIwNCA0IDE2NyAyMTQgNDUgODMgMzEgMTQgNDAgNjUgOTUgMjIwIDIyMSA0OCAxMjEgNzcgMTg2IDUgNTcgCisxMzcgMjYgMTk0IDIzMSAxODkgNzggNDEgNTUgMTI0IDExNSAyMzIgMTc3IDIyIDEyOSA2OCAxNjggMjA0IDc0IDIxMSA0MiAxNDMgMTc0IAorMTgyIDIxMCAyMTUgNzAgMjE4IDczIDE1OCA5OCAyMjMgMTYxIDEzOCAxODYgMTQwIDEwMSAzMCA1OSA1MiAxNDkgMjE3IDIwIDIxNCAxMCAKKzIxMCAxMTcgNDkgNDYgMTA2IDgxIDE2IDE4IDEwMyA3OCA3NiAxNjEgMzggMTUgMjI2IDEzNiAzNiAxMDAgMTAzIDE3OCAxODIgNzUgMyAKKzkgMTg1IDE1MCA3IDEzNSA0OCAxNTYgMTgzIDEwMCAxMzggNTEgOTYgNDAgMTY1IDIwMSAxMzQgMTIxIDQyIDgwIDkxIDE1NyAyMDggNjcgCisxODAgMjcgMjE5IDEzMyAyMzEgNTQgOTkgMjEzIDE5MCAzMyAxOTcgMzYgMiA4MiA2IDQ3IDIzMSAxNTQgMjA1IDEyNyAxNTUgMTk1IAorMTU2IDUwIDIwNiA1MiAxODQgOTAgMjMyIDE3OSAxNzIgMTY5IDY2IDIwIDgxIDExNiAxMjQgMTcgNDMgNSAxMjAgNTIgNTEgMTk2IDE0NiAKKzc5IDEwMSAxMjggODAgMjI0IDUxIDYxIDEwMiAxOCAzIDIwNSAxNjIgMjggMTA5IDU2IDIxMiAxNjUgNjYgMTU1IDYwIDE3NyAxNTcgCisxNzMgMTk0IDMzIDYyIDU3IDE3NCAyMTcgODMgMTI5IDIwMyAyMTIgMzIgMTcyIDY5IDE5MyAxMDYgMTE2IDEyMiAxNjUgMyA3IDM1IAorMTc1IDkgNTAgMTcxIDE3OSAzNyAxMjUgNSAyMjAgMTU4IDE5OCA5NiA3NSAzOCAxMTUgOTkgNTAgMSA5NCA2MiAxMjcgMTUzIDQ1IDE4MSAKKzUyIDEyMSAxNzUgMjA3IDE3NyAyNCA0NiAxMDggMTY0IF4KKzQ5OSAwIDQ0IDQgMTgyIDE4OCA1MyA3MSA3IDE0OCA0OCAxMzAgMTA4IDE2NiAyMjAgMzUgOCAxMiAxOTggOTMgOSA2MyAxNzEgOTcgCisxOTUgMTk0IDg3IDIwNCAxNCAxNzMgMTMyIDIwMyAxNDMgNTQgMjMxIDEyNiAxMDIgMTI1IDExOCAzNyA0MyAyMCA5NCA2MCAzNiAxNzUgCis0NyA5MCAxMTAgMTQxIDIzIDIyOSAzNSAxODQgNDMgMjQgMTUzIDE1NCA4NSAxNzMgMTIgODIgMjE0IDE3NCAyMzIgMTE3IDEwNiAxOTEgCisxMjggNzcgMTY0IDc2IDExNyAxNjIgMTAxIDI1IDIwNCA3NCAxNDIgMTIzIDE0MyAyMzQgMzIgMjI5IDIxMSAyMTUgMTA1IDMxIDkgMTIzIAorODcgODggMTM1IDEwMiA2NSAyMDIgOTkgNTAgMTY1IDExNiA2MiAxODcgNjIgNjcgMTc3IDE5MSA4IDE5MiA1MiAxOTYgMTE4IDIwNiAKKzEwNSA5MSAyMTQgMTE0IDI3IDE3OSAxNjYgMTAwIDE1MCA3OSA3OSAxOTkgODQgMTMgMTgyIDEyOCAxMzcgMTMzIDY3IDU3IDE3IDEzMiAKKzIzIDUzIDE4NyAxMjIgMzYgMTE1IDEzMSAxNTIgMTcwIDUwIDQ1IDIzMSAxODYgMTggNjMgMTExIDE4MSAyMSAxOCAxNzkgMjI2IDE2IAorODggMTkgMjIzIDIzMCA4MiA5OCA1OSAxNjEgNTAgMTA1IDIwMCAxMjQgMTEgMjA3IDg5IDE3OSAxMDYgMTMxIDIxMiAxMzkgMjI0IDIyMSAKKzg2IDE2NCAxNiAxNDggMjI0IDE2MSAxNzAgMjI2IDc2IDU3IDEwIDE2MyA4NSAxMTMgOTYgMTQ0IDM4IDMwIDE4IDExOSAyMSA3OCAxNDggCisxNjQgOSAyMzIgNTAgMjIxIDI2IDEyIDc4IDIwOCA4MCAxODMgMTcyIDE0MSAxOTkgMjQgNDQgMTkxIDE4OCA0NiAxNTUgNjkgMjA4IAorMTQwIDk5IDExMCA4MSA1NCA1NSA0MiA0MCA2NSAyNiA2OCA0MSAxMDUgMjQgOTMgMTg1IDE0NyAxODAgMTU3IDEwNCAyMTYgODkgMTE5IAorMTM3IDE5MyAyMTkgMjMxIDEwIDIyMyAxIDUxIDM2IDIzNSAxNiAyOCAxMDMgNDkgMSAyMjcgMTIwIDYxIDc2IDE3MyA3MiA1MSAxNTIgCisxMTQgODcgMTQ4IDEwNCA0MCA1IDU3IDc3IDQ4IDE0IDIyOSA5NSAxMDAgMzQgMjAwIDggMTMyIDgzIDIyIDE3OCA2MiAxMjcgOTMgMTI5IAorMSA0NyAzMCAxOTQgMjAzIDgzIDEzOCA0IDE4NiAxMSAxNDcgMTIwIDUgMTEzIDQwIDE4MSAxNDEgMTM5IDEwOCAxMDYgMTUgOTcgMTUgCisxNTcgMjIwIDk1IDE2MCAxODYgMTM4IDE4NCAyMjMgNjEgMjAgMjcgMTc1IDEwNyA2IDEwMSA4MSAxMTQgMjA3IDMzIDMzIDIwOSA0IDY2IAorNzMgMjE4IDQgNiAxNTcgNDQgMTEgOTggMTc5IDQ2IDIxNSAyMjEgMTQ2IDEzMyA3IDg4IDc5IDEzOSAxNjggNzUgMTg5IDM3IDE1OSAKKzEzNSAyMTggMTgwIDM3IDIxOSA1MSAxNTYgMTIwIDE4MSAxOTcgNDkgNSAyMzMgMTYxIDExMCAyMSAxMzggNjQgMTAyIDE4NSA4NyAyOCAKKzIxOSAxMTEgMTI1IDU4IDEyMSA1MiA4MCAzIDgyIDM4IDkwIDE3MCAxMTAgMTk3IDE2OSAxMjYgMTYyIDQxIDEwOSAzMCAxMzQgMjM0IAorOTIgMTQ1IDE0OSAxNTUgMTMgNjIgNyAyMDggMjAwIDY4IDQ4IDIxIDE5OCAzMyA0MCAxMjUgMTc4IDYgMjE3IDE5NiAyIDkxIDM0IDI0IAorMjEzIDcwIDIzIDExMyAxNTYgNjAgMjEyIDIzIDEwOSAxNTAgMTkgMTYzIDI1IDE0NCAxNTggMTUxIDEzMCA1MiAyMCAzNCAxNDQgOTggCisyMzUgMTkyIDExMiAxMTIgNTYgMTQ2IDEzIDEyMiAyMTIgMTk5IDE5MyAxNTkgNzkgMTkgNDcgMTQ2IDczIDM4IDE1MCAxMzkgNDggMTkwIAorNzcgMTA0IDE2MCAxMjYgMjIyIDEwIDQ3IDIwNiAyMjUgMjkgOTAgMjMwIDI2IDE4OCAxNjIgMzQgMTQwIDM5IDE5NCAxNDMgMTE0IDE0NyAKKzY0IDQyIDIxNiAxNDkgMTc0IF4KKzQ3MyAxIDc1IDEzMSAxMjEgMTggMiA2OCAxNjEgMjkgMTg1IDIwMyAxNDUgOTUgNDAgNzEgNjMgMTEzIDIyMCA2NiA4IDE0NCAyMTIgCisxMTYgMTE1IDIyOCAxMDkgNTkgMTM4IDE3NyAxMDggMTcyIDE5IDgyIDE4NyAyMTEgMTg4IDE5MSAzNCAzNiA1NSAyMTUgMTEgMzkgMTM2IAorMjQgMjIzIDE5OSAxNzAgNTIgODIgNDIgMTMxIDI4IDUzIDE2MiAxNjEgMjI2IDE0MiAxNCAyMzEgOTcgMTQxIDc5IDE5MiAyMDcgMTIwIAorMTgzIDIzNiAxNDUgMjMzIDE5OCAxNDkgMjA4IDQ4IDEwNyAyMzcgMTczIDE5MiAxNjYgNzcgMzkgODQgMTAyIDk2IDIwNiA0MCA2NCAKKzE4NiAyMjQgMjI3IDE3NCAyMTMgMTAgMTExIDIxMiAyMyAxNTAgMTk1IDkgMTI0IDEzIDYgMTM2IDEyNCA2NSAxMjEgMjUgMTE3IDE5NSAKKzEwOSAyMDQgMjE4IDk5IDIwMSA0NCAxMzIgMTQ5IDIxNSAxNjMgMjM0IDIzMCAxMTAgMjI1IDYyIDEzMyAxODEgMTc2IDE4MCAxMCAxOCAKKzkgMTgzIDUwIDIyIDEyMiAxOTEgNDEgMTk2IDE4MiAxNjMgMTQxIDI3IDMyIDgwIDEyNyA4IDEwIDIwNCAxMzIgNTYgNTcgMTMwIDg5IAorNTcgMjIzIDU0IDkwIDg1IDIyNyAyMTUgMTggMTU0IDI1IDIxMCAxMTUgMTg3IDY2IDEwOCAyMjQgMTM0IDIwOSAxODAgMTAzIDE3NiA4NyAKKzkwIDIyMyAxNDcgMTAgMTYzIDg5IDE1MCAxNDMgODcgMjM1IDIwIDY5IDE0OCAyMjggMjAyIDIxNyAxNzEgMzkgNDMgNTkgMTkwIDU0IAorMjM1IDE2NSAxNDkgNzAgODMgMjkgOTIgNjcgMjMzIDEwNSAyMjkgMTMwIDE0MSAxNzIgMTEyIDIgMjcgMTE4IDEyMyAzMyAxNjAgOCAKKzEwMyAxNjkgMjEwIDIwMSAyMzAgMTcgMjIgMjkgMzMgOCA1MSA5IDM4IDIwOCA1NSAyMjIgMTI2IDE2NiAxMjkgMTU0IDIxMSA5NSAyMjYgCisxOTQgMTc0IDEyMCA5MCA3OCA2NyA4OCAyNSAyNCAzNyA3NiA1OSA0NSAyMTIgMzAgNzIgODQgMTk1IDE2IDEgMTQwIDIzNyAyOCAxNTcgCisxOTkgMjIyIDE2NyAyMDkgMzUgNjggMTYgMjMyIDI1IDY1IDgwIDIyMCAyMTEgNDMgMTExIDY3IDE4MSAyMjggNTcgMTM3IDExIDE4NCAKKzIxNiAxODQgNzggMjYgNDUgMTE5IDExMCAyMzIgMTc3IDIyIDEyOSA2OCAxNjggMTg5IDc0IDE5NiAzNyAxMjggMTc0IDE3MiAyMDUgCisyMDUgNjAgMjE4IDU4IDE1OCA5MyAyMTggMTUxIDEyMyAxNzEgMTI1IDg2IDEwIDU5IDUyIDEzNCAyMDIgMjAgMjE0IDIyOCAxOTUgMTAyIAorNDQgNDYgMTA2IDcxIDExIDIzNiA5MyA3MyA3MSAxNTYgMzMgMTUgMjExIDEzNiAzMSAxMDAgODggMTYzIDE4MiA3MCAyMjEgMjMyIDE3MCAKKzE0NSAyIDEyMCAzOCAxNTYgMTc4IDk1IDEzMyAzNiA5NiAyMCAxNTUgMTkxIDEzNCAxMTYgMjIgNzAgNzYgMTUyIDIwMyA1MiAxNzUgNyAKKzIwOSAxMjggMjI2IDQ5IDk0IDE5OCAxOTAgMTMgMTkyIDIxIDIzNSA3MiAyMjkgMzcgMjIxIDEzOSAyMDUgMTEyIDE0MCAxODUgMTUxIAorMzAgMjA2IDQ3IDE3OSA3NSAyMTcgMTY0IDE2MiAxNTQgNjYgMTUgNjYgMTAxIDEwOSA3IDIzIDUgMTE1IDQyIDMxIDE4NiAxMzEgNjkgCis5NiAxMTMgNzUgMjI0IDQxIDUxIDEwMiAzIDMgMjAwIDE1NyAxMyA5OSA1NiAyMDIgMTY1IDU2IDE1MCA1MCAxNjcgMTU3IDE1OCAxNzkgCisyMyA1NyAzNyAxNjkgMjE3IDc4IDExOSAyMDMgMTk3IDE3IDE2NyA2NCAxOTMgMTAxIDExNiAxMjIgMTUwIDIzNiA3IDMwIDE2NSA0IDM1IAorMTYxIDE3NCAyNyAxMjUgMjA1IDE1MyAxNDggXgorNTAyIDEgODkgNjEgMjQgMTAxIDc4IDUwIDIxMyA3MyA0MSAxMjcgMTUzIDQ1IDE2NyAyNCAxMjEgMTY4IDE5MyAxNTYgMyAyNSA4NyAKKzE2NiAyOCAyMjggMTc0IDE4OCA1MyA2NyAyMzkgMTQ4IDM2IDExOCAxMDQgMTYyIDIwOCAyNyAyMzIgNCAxOTQgODUgMSA2MyAxNTkgOTcgCisxOTEgMTk0IDc1IDE5NiAxMCAxNjkgMTMyIDE5OSAxMzEgNTAgMjIzIDExOCA5NCAxMTcgMTE4IDM3IDI3IDEyIDk0IDYwIDI4IDE3MSAKKzQ3IDgyIDExMCAxMzcgMTUgMjI1IDIzIDE3MiA0MyAxMiAxNDEgMTQyIDgxIDE2MSAxMiA3NCAyMTAgMTYyIDIyOCAxMTcgOTggMTg3IAorMTI0IDY5IDE2NCA3NiAxMDUgMTU4IDEwMSAyMSAyMDAgNzAgMTMwIDExMSAxNDMgMjMwIDMyIDIyMSAyMDMgMjExIDEwMSAzMSA1IDEyMyAKKzgzIDc2IDEzNSA5MCA1NyAxOTQgOTUgNDYgMTUzIDExMiA2MiAxODMgNTQgNjMgMTY5IDE3OSA0IDE4NCA0MCAxODggMTEwIDE5NCAxMDUgCis5MSAyMDYgMTAyIDI3IDE3NSAxNTQgODggMTQyIDcxIDc5IDE5OSA4NCA1IDE3MCAxMjggMTI5IDEyNSA1NSA0OSAxNyAxMjAgMTkgNDUgCisxODcgMTE0IDI0IDExMSAxMjMgMTQwIDE2NiAzOCAzMyAyMjcgMTc4IDE4IDU5IDk5IDE3MyA5IDEwIDE3OSAyMTQgMTIgODQgMTUgMjE1IAorMjE4IDgyIDkwIDQ3IDE0OSA0MiA5MyAxODggMTIwIDIzOSAxOTUgODEgMTcxIDk0IDEyNyAyMDAgMTI3IDIyMCAyMTcgODYgMTYwIDE2IAorMTQ0IDIxNiAxNTcgMTYyIDIxOCA3MiA0NSAyMzQgMTU5IDc3IDEwMSA4OCAxMzIgMjYgMjYgNiAxMTkgMTMgNzAgMTQwIDE1NiAyMzMgCisyMjAgMzQgMjEzIDI2IDIzNiA3NCAyMDAgODAgMTc1IDE2NCAxMzMgMTk1IDI0IDQ0IDE5MSAxODQgMzAgMTQzIDU3IDIwNCAxNDAgOTkgCisxMDYgNzcgNTQgNDMgNDIgMzYgNjEgMTQgNTYgMjUgOTcgOCA4MSAxODEgMTM5IDE4MCAxNTMgOTIgMjEyIDc3IDExMSAxMzMgMTg1IAorMjE5IDIzMSAyMzggMjE5IDEgNDMgMzIgMjMxIDggMjQgOTEgMzMgMjM3IDIyMyAxMDggNDkgNjQgMTY1IDcyIDM1IDE1MiAxMDYgODcgCisxMzYgOTYgMzIgMSA1MyA3NyA0NCAyMzggMjI5IDgzIDk2IDIyIDE5NiAxMjQgNzkgNiAxNjYgNTggMTIzIDkzIDEyMSAyMjUgNDMgMjIgCisxODYgMTk1IDcxIDEyNiA0IDE3NCAyMzUgMTM1IDEyMCAyMjkgMTEzIDI4IDE4MSAxMjkgMTM1IDEwMCAxMDIgNyA4NSAxMSAxNDUgMjEyIAorODcgMTU2IDE4NiAxMzggMTg0IDIyMyA2MSA0IDExIDE3NSAxMDcgNiA4OSA4MSAxMTQgMjA3IDIxIDE3IDE5NyAyMzYgNTQgNzMgMjE0IAorMjMyIDIzNCAxNDkgMzIgMTEgOTggMTY3IDM0IDIwMyAyMjEgMTQ2IDEyMSAyMzUgODggNzUgMTM5IDE2MCA2MyAxODkgMjkgMTQ3IDEyNyAKKzIxMCAxNzIgMzMgMjA3IDUxIDE1MiAxMTYgMTY5IDE4OSA0OSAyMzcgMjMzIDE1MyAxMDIgMTcgMTMwIDY0IDk4IDE3NyA3OSAxNiAyMTEgCisxMTEgMTEzIDU4IDExMyA0OCA2OCAyMzUgNzggMzAgODYgMTcwIDk4IDE5NyAxNjkgMTIyIDE1NCA0MSA5NyAxOCAxMjYgMjM0IDkyIAorMTQ1IDE0NSAxNTUgMjM3IDUwIDMgMjA4IDIwMCA2MCA0OCAyMSAxOTAgMjUgNDAgMTIxIDE3OCAyMzggMjA5IDE5NiAyMzAgNzkgMjYgCisxNiAyMDEgNjYgMjMgMTA1IDE0OCA1NiAyMDggNyAxMDUgMTM4IDExIDE1NSAxNyAxNDAgMTQ2IDE1MSAxMzAgNDQgOCAzNCAxMzYgODYgCisyMjcgMTg4IDEwMCAxMTIgNTIgMTM4IDEgMTEwIDIwNCAxODcgMTgxIDE1OSA2NyAxOSAzNSAxNDIgNjEgMzQgMTQ2IDEzMSA0MCAxNzggCis2NSAxMDQgMTUyIDEyNiAyMTQgMiAzOSAyMDIgMTczIF4KKzQ4NiAxIDUgOTAgMjMwIDIwIDE3MCAxNDQgMTAgMTM0IDM5IDE3NiAxMzEgMTA4IDE0NyA1OCAzNiAyMTYgMTMxIDM1IDc1IDEyNyAxMDkgCisyIDIzMiA2MCAxNDkgMjUgMTg1IDE5NSAxMzcgOTUgMzIgNzEgNTUgMTA1IDIxNiA1OCAyMzQgMTQ0IDIwMCAxMDggMTAzIDIyOCAxMDUgCis0NyAxMzAgMTY1IDEwMCAxNzIgNyA3OCAxODMgMjA3IDE4NCAxNzkgMTggMzYgNDcgMjAzIDIzNyAzMSAxMjggOCAyMTkgMTg3IDE2MiAKKzQ0IDc0IDM4IDEzMSAxMiA0OSAxNjIgMTYxIDIxOCAxNDIgMTQgMjI3IDg5IDE0MSA3MSAxODAgMjAzIDExMiAxNzUgMjMyIDEzMyAyMjEgCisxOTggMTQxIDE5NiAzNiA5OSAyMjkgMTczIDE5MiAxNTQgNjkgMjMgODAgOTggODggMTk4IDI0IDUyIDE3NCAyMTYgMjI3IDE2MiAyMTMgCisyIDEwNyAyMDQgMTEgMTUwIDE4NyAyMzUgMTE2IDUgMjM2IDEzMiAxMjQgNTMgMTE3IDIxIDExMyAxOTEgMTA5IDE5MiAyMDYgOTUgMjAxIAorMjggMTI0IDE0OSAyMTUgMTU5IDIzMCAyMTggOTggMjEzIDU0IDEzMyAxNjkgMTcyIDE3NiA2IDEwIDkgMTgzIDM4IDE0IDExMCAxODcgCiszNyAxODggMTc4IDE2MyAxMzMgMjMgMjggNzIgMTIzIDggMjQwIDIwNCAxMjggNTIgNDkgMTE4IDg5IDQ1IDIxNSA0MiA4NiA4NSAyMTUgCisyMTEgMTQgMTU0IDE3IDIxMCAxMTUgMTc5IDYyIDEwOCAyMjAgMTMwIDIwOSAxNzIgMTAzIDE3NiA3OSA4MiAyMTEgMTM5IDEwIDE1NSAKKzg1IDE0MiAxMzkgODMgMjI3IDE2IDY5IDE0MCAyMjQgMjAyIDIxMyAxNzEgMzUgMzEgNTUgMTc4IDQ2IDIzMSAxNjEgMTQ1IDcwIDgzIAorMjkgODggNjcgMjI1IDEwMSAyMTcgMTI2IDEzNyAxNjggMTA0IDIgMTEgMTA2IDExNSAzMyAxNjAgNCA5NSAxNTcgMTk4IDE5MyAyMjIgMSAKKzE4IDEzIDIxIDIzOCA0NyA1IDM4IDIwNCA1NSAyMjIgMTE4IDE2MiAxMTcgMTQ2IDIxMSA4NyAyMjYgMTkwIDE2NiAxMTYgNzggNjYgNjMgCis4MCAyNSAxNiAyNSA2OCA1MSAzMyAyMTIgMzAgNjAgNzYgMTk1IDEyIDIzOSAxMzYgMjI1IDI4IDE0NSAxOTUgMjEwIDE2NyAyMDUgMjcgCis1NiA0IDIyMCAxMyA2NSA2OCAyMjAgMjAzIDM5IDEwMyA1OSAxNzcgMjIwIDU3IDEzNyAyNDEgMTc2IDIwNCAxODAgNzggMTQgMzcgMTE1IAorMTA2IDIzMiAxNzcgMjIgMTI5IDY4IDE2OCAxNzcgNzQgMTg0IDMzIDExNiAxNzQgMTY0IDIwMSAxOTcgNTIgMjE4IDQ2IDE1OCA4OSAKKzIxNCAxNDMgMTExIDE1OSAxMTMgNzQgMjM2IDU5IDUyIDEyMiAxOTAgMjAgMjE0IDIxNiAxODMgOTAgNDAgNDYgMTA2IDYzIDcgMjI0IAorODUgNjkgNjcgMTUyIDI5IDE1IDE5OSAxMzYgMjcgMTAwIDc2IDE1MSAxODIgNjYgMjA5IDIyNCAxNTggMTQxIDI0MCAxMDggMzAgMTU2IAorMTc0IDkxIDEyOSAyNCA5NiA0IDE0NyAxODMgMTM0IDExMiA2IDYyIDY0IDE0OCAxOTkgNDAgMTcxIDIzMyAyMDEgMTI0IDIyMiA0NSA5MCAKKzE4NiAxOTAgMjM5IDE4OCA5IDIzNSA2NCAyMjEgMjkgMjEzIDEyNyAyMDUgMTAwIDEyOCAxNzcgMTQ3IDE0IDIwNiA0MyAxNzUgNjMgCisyMDUgMTUyIDE1NCAxNDIgNjYgMTEgNTQgODkgOTcgMjQxIDcgNSAxMTEgMzQgMTUgMTc4IDExOSA2MSA5MiAxMDEgNzEgMjI0IDMzIDQzIAorMTAyIDIzMyAzIDE5NiAxNTMgMSA5MSA1NiAxOTQgMTY1IDQ4IDE0NiA0MiAxNTkgMTU3IDE0NiAxNjcgMTUgNTMgMjEgMTY1IDIxNyA3NCAKKzExMSAyMDMgMTg1IDUgMTYzIDYwIDE5MyA5NyAxMTYgMTIyIDEzOCAyMzYgNyAyNiAxNTcgMjMgMTUzIDE3MCAxODQgXgorNTA1IDEgMTI1IDIzOCAxODcgMTQ3IDE2NSA4NSA1MyAxNiA5MyA2NiA1MCAyMDEgNjEgMjkgMTI3IDE1MyA0NSAxNTkgOCAxMjEgMTY0IAorMTg1IDE0NCAyMzUgMTMgNzUgMTY2IDEyIDIxNiAxNjYgMTg4IDUzIDYzIDIzNSAxNDggMjQgMTA2IDEwMCAxNTggMTk2IDE5IDIyMCAKKzI0MCAxOTAgNzcgMjM3IDYzIDE0NyA5NyAxODcgMTk0IDYzIDE4OCA2IDE2NSAxMzIgMTk1IDExOSA0NiAyMTUgMTEwIDg2IDEwOSAxMTggCiszNyAxMSA0IDk0IDYwIDIwIDE2NyA0NyA3NCAxMTAgMTMzIDcgMjIxIDExIDE2MCA0MyAxMjkgMTMwIDc3IDE0OSAxMiA2NiAyMDYgMTUwIAorMjI0IDExNyA5MCAxODMgMTIwIDYxIDE2NCA3NiA5MyAxNTQgMTAxIDE3IDE5NiA2NiAxMTggOTkgMTQzIDIyNiAzMiAyMTMgMTk1IDIwNyAKKzk3IDMxIDEgMTIzIDc5IDY0IDEzNSA3OCA0OSAxODYgOTEgNDIgMTQxIDEwOCA2MiAxNzkgNDYgNTkgMTYxIDE2NyAxNzYgMjggMTgwIAorMTAyIDE4MiAxMDUgOTEgMTk4IDkwIDI3IDE3MSAxNDIgNzYgMTM0IDYzIDc5IDE5OSA4NCAyNDEgMTU4IDEyOCAxMjEgMTE3IDQzIDQxIAorMTcgMTA4IDE1IDM3IDE4NyAxMDYgMTIgMTA3IDExNSAxMjggMTYyIDI2IDIxIDIyMyAxNzAgMTggNTUgODcgMTY1IDI0MSAyIDE3OSAKKzIwMiA4IDgwIDExIDIwNyAyMDYgODIgODIgMzUgMTM3IDM0IDgxIDE3NiAxMTYgMjMxIDE4MyA3MyAxNjMgODIgMTIzIDE4OCAxMTUgCisyMTYgMjEzIDg2IDE1NiAxNiAxNDAgMjA4IDE1MyAxNTQgMjEwIDY4IDMzIDIyMiAxNTUgNjkgODkgODAgMTIwIDE0IDIyIDIzOCAxMTkgCis1IDYyIDEzMiAxNDggMjIxIDIwOCAxOCAyMDUgMjYgMjI0IDcwIDE5MiA4MCAxNjcgMTU2IDEyNSAxOTEgMjQgNDQgMTkxIDE4MCAxNCAKKzEzMSA0NSAyMDAgMTQwIDk5IDEwMiA3MyA1NCAzMSA0MiAzMiA1NyAyIDQ0IDkgODkgMjM2IDY5IDE3NyAxMzEgMTgwIDE0OSA4MCAyMDggCis2NSAxMDMgMTI5IDE3NyAyMTkgMjMxIDIzMCAyMTUgMSAzNSAyOCAyMjcgMjAgNzkgMTcgMjM3IDIxOSA5NiAzNyA1MiAxNTcgNzIgMTkgCisxNTIgOTggODcgMTI0IDg4IDI0IDI0MSA0OSA3NyA0MCAyMjYgMjI5IDcxIDkyIDEwIDE5MiAyMzYgMTE2IDc1IDIzNCAxNTQgNTQgMTE5IAorOTMgMTEzIDIxMyAzOSAxNCAxNzggMTg3IDU5IDExNCA0IDE2MiAyMjMgMTIzIDEyMCAyMTcgMTEzIDE2IDE4MSAxMTcgMTMxIDkyIDk4IAorMjQzIDczIDcgMTMzIDIwNCA3OSAxNTIgMTg2IDEzOCAxODQgMjIzIDYxIDIzMiAyMzkgMTc1IDEwNyA2IDc3IDgxIDExNCAyMDcgOSAxIAorMTg1IDIzMiA0MiA3MyAyMTAgMjI0IDIyNiAxNDEgMjAgMTEgOTggMTU1IDIyIDE5MSAyMjEgMTQ2IDEwOSAyMjcgODggNzEgMTM5IDE1MiAKKzUxIDE4OSAyMSAxMzUgMTE5IDIwMiAxNjQgMjkgMTk1IDUxIDE0OCAxMTIgMTU3IDE4MSA0OSAyMzMgMjMzIDE0NSA5NCAxMyAxMjIgNjQgCis5NCAxNjkgNzEgNCAyMDMgMTExIDEwMSA1OCAxMDUgNDQgNTYgMjMxIDc0IDIyIDgyIDE3MCA4NiAxOTcgMTY5IDExOCAxNDYgNDEgODUgCis2IDExOCAyMzQgOTIgMTQ1IDE0MSAxNTUgMjI1IDM4IDI0MyAyMDggMjAwIDUyIDQ4IDIxIDE4MiAxNyA0MCAxMTcgMTc4IDIzNCAyMDEgCisxOTYgMjIyIDY3IDE4IDggMTg5IDYyIDIzIDk3IDE0MCA1MiAyMDQgMjM1IDEwMSAxMjYgMyAxNDcgOSAxMzYgMTM0IDE1MSAxMzAgMzYgCisyNDAgMzQgMTI4IDc0IDIxOSAxODQgODggMTEyIDQ4IDEzMCAyMzMgOTggMTk2IDE3NSAxNjkgMTU5IDU1IDE5IDIzIDEzOCA0OSAzMCAKKzE0MiAxMjMgMzIgMTY2IDUzIDEwNCAxNDQgMTI2IDIwNiAyMzggMzEgMTk4IDIwMyBeCis0ODMgMSAyMzUgOTAgMjMwIDE2IDE1OCAxMzIgMjQwIDEzMCAzOSAxNjQgMTIzIDEwNCAxNDcgNTQgMzIgMjE2IDExOSAzNSA3NSAxMjMgCis5NyAyMzIgMjI0IDUyIDEzNyAyMSAxODUgMTg3IDEyOSA5NSAyNCA3MSA0NyA5NyAyMTIgNTAgMjIyIDE0NCAxODggMTAwIDkxIDIyOCAKKzEwMSAzNSAxMjIgMTUzIDkyIDE3MiAyNDEgNzQgMTc5IDIwMyAxODAgMTY3IDIgMzYgMzkgMTkxIDIyNSAyMyAxMjAgMjM4IDIxNSAxNzUgCisxNTQgMzYgNjYgMzQgMTMxIDI0MiA0NSAxNjIgMTYxIDIxMCAxNDIgMTQgMjIzIDgxIDE0MSA2MyAxNjggMTk5IDEwNCAxNjcgMjI4IAorMTIxIDIwOSAxOTggMTMzIDE4NCAyNCA5MSAyMjEgMTczIDE5MiAxNDIgNjEgNyA3NiA5NCA4MCAxOTAgOCA0MCAxNjIgMjA4IDIyNyAKKzE1MCAyMTMgMjQwIDEwMyAxOTYgMjQ1IDE1MCAxNzkgMjIzIDEwOCAyNDMgMjI4IDEyOCAxMjQgNDEgMTEzIDE3IDEwOSAxODcgMTA5IAorMTgwIDE5NCA5MSAyMDEgMTIgMTE2IDE0OSAyMTUgMTU1IDIyNiAyMDYgODYgMjAxIDQ2IDEzMyAxNTcgMTY4IDE3MiAyIDIgOSAxODMgCisyNiA2IDk4IDE4MyAzMyAxODAgMTc0IDE2MyAxMjUgMTkgMjQgNjQgMTE5IDggMjMyIDIwNCAxMjQgNDggNDEgMTA2IDg5IDMzIDIwNyAKKzMwIDgyIDg1IDIwMyAyMDcgMTAgMTU0IDkgMjEwIDExNSAxNzEgNTggMTA4IDIxNiAxMjYgMjA5IDE2NCAxMDMgMTc2IDcxIDc0IDE5OSAKKzEzMSAxMCAxNDcgODEgMTM0IDEzNSA3OSAyMTkgMTIgNjkgMTMyIDIyMCAyMDIgMjA5IDE3MSAzMSAxOSA1MSAxNjYgMzggMjI3IDE1NyAKKzE0MSA3MCA4MyAyOSA4NCA2NyAyMTcgOTcgMjA1IDEyMiAxMzMgMTY0IDk2IDIgMjQxIDk0IDEwNyAzMyAxNjAgODcgMTQ1IDE4NiAxODUgCisyMTQgMjMxIDE0IDI0MyA5IDIzMCA0MyAxIDM4IDIwMCA1NSAyMjIgMTEwIDE1OCAxMDUgMTM4IDIxMSA3OSAyMjYgMTg2IDE1OCAxMTIgCis2NiA1NCA1OSA3MiAyNSA4IDEzIDYwIDQzIDIxIDIxMiAzMCA0OCA2OCAxOTUgOCAyMzkgMTMyIDIxMyAyOCAxMzMgMTkxIDE5OCAxNjcgCisyMDEgMTkgNDQgMjM4IDIwOCAxIDY1IDU2IDIyMCAxOTUgMzUgOTUgNTEgMTczIDIxMiA1NyAxMzcgMjMzIDE2OCAxOTIgMTc2IDc4IDIgCisyOSAxMTEgMTAyIDIzMiAxNzcgMjIgMTI5IDY4IDE2OCAxNjUgNzQgMTcyIDI5IDEwNCAxNzQgMTU2IDE5NyAxODkgNDQgMjE4IDM0IAorMTU4IDg1IDIxMCAxMzUgOTkgMTQ3IDEwMSA2MiAyMjQgNTkgNTIgMTEwIDE3OCAyMCAyMTQgMjA0IDE3MSA3OCAzNiA0NiAxMDYgNTUgMyAKKzIxMiA3NyA2NSA2MyAxNDggMjUgMTUgMTg3IDEzNiAyMyAxMDAgNjQgMTM5IDE4MiA2MiAxOTcgMjE2IDE0NiAxMzcgMjQwIDk2IDIyIAorMTU2IDE3MCA4NyAxMjUgMTIgOTYgMjM0IDEzOSAxNzUgMTM0IDEwOCAyMzYgNTQgNTIgMTQ0IDE5NSAyOCAxNjcgMjIxIDE5MyAxMjAgCisyMTggNDEgODYgMTc0IDE5MCAyMjcgMTg0IDI0MyAyMzUgNTYgMjEzIDIxIDIwNSAxMTUgMjA1IDg4IDExNiAxNjkgMTQzIDI0NCAyMDYgCiszOSAxNzEgNTEgMTkzIDE0MCAxNDYgMTMwIDY2IDcgNDIgNzcgODUgMjM3IDIzNyA1IDEwNyAyNiAyNDUgMTcwIDEwNyA1MyA4OCA4OSAKKzY3IDIyNCAyNSAzNSAxMDIgMjI1IDMgMTkyIDE0OSAyMzUgODMgNTYgMTg2IDE2NSA0MCAxNDIgMzQgMTUxIDE1NyAxMzQgMTU1IDcgNDkgCis1IDE2MSAyMTcgNzAgMTAzIDIwMyAxNzMgMjM5IDE1OSA1NiAxOTMgOTMgMTE2IDEyMiAxMjYgMjM2IDcgMjIgMTQ5IDI0MiAxNzggXgorNTA3IDEgMTQxIDE2NCA3IDEyNSAyMzggMTc1IDE0MyAxNTMgODEgNDUgOCA4NSA1NCA1MCAxODkgNDkgMTcgMTI3IDE1MyA0NSAxNTEgCisyNDAgMTIxIDE2MCAxNzcgMTMyIDIyNyAxIDYzIDE2NiAyNDQgMjA0IDE1OCAxODggNTMgNTkgMjMxIDE0OCAxMiA5NCA5NiAxNTQgMTg0IAorMTEgMjA4IDIzNiAxODYgNjkgMjMzIDYzIDEzNSA5NyAxODMgMTk0IDUxIDE4MCAyIDE2MSAxMzIgMTkxIDEwNyA0MiAyMDcgMTAyIDc4IAorMTAxIDExOCAzNyAyNDMgMjQ0IDk0IDYwIDEyIDE2MyA0NyA2NiAxMTAgMTI5IDI0NyAyMTcgMjQ3IDE0OCA0MyAyMzYgMTE3IDExOCA3MyAKKzEzNyAxMiA1OCAyMDIgMTM4IDIyMCAxMTcgODIgMTc5IDExNiA1MyAxNjQgNzYgODEgMTUwIDEwMSAxMyAxOTIgNjIgMTA2IDg3IDE0MyAKKzIyMiAzMiAyMDUgMTg3IDIwMyA5MyAzMSAyNDUgMTIzIDc1IDUyIDEzNSA2NiA0MSAxNzggODcgMzggMTI5IDEwNCA2MiAxNzUgMzggNTUgCisxNTMgMTU1IDI0NCAxNjggMTYgMTcyIDk0IDE3MCAxMDUgOTEgMTkwIDc4IDI3IDE2NyAxMzAgNjQgMTI2IDU1IDc5IDE5OSA4NCAyMzcgCisxNDYgMTI4IDExMyAxMDkgMzEgMzMgMTcgOTYgMTEgMjkgMTg3IDk4IDEwMyAxMDcgMTE2IDE1OCAxNCA5IDIxOSAxNjIgMTggNTEgNzUgCisxNTcgMjMzIDI0MiAxNzkgMTkwIDQgNzYgNyAxOTkgMTk0IDgyIDc0IDIzIDEyNSAyNiA2OSAxNjQgMTEyIDIyMyAxNzEgNjUgMTU1IDcwIAorMTE5IDE3NiAxMDMgMjEyIDIwOSA4NiAxNTIgMTYgMTM2IDIwMCAxNDkgMTQ2IDIwMiA2NCAyMSAyMTAgMTUxIDYxIDc3IDcyIDEwOCAyIAorMTggMjMwIDExOSAyNDUgNTQgMTI0IDE0MCAyMDkgMTk2IDIgMTk3IDI2IDIxMiA2NiAxODQgODAgMTU5IDE0OCAxMTcgMTg3IDI0IDQ0IAorMTkxIDE3NiAyNDYgMTE5IDMzIDE5NiAxNDAgOTkgOTggNjkgNTQgMTkgNDIgMjggNTMgMjM4IDMyIDI0MSA4MSAyMjQgNTcgMTczIDEyMyAKKzE4MCAxNDUgNjggMjA0IDUzIDk1IDEyNSAxNjkgMjE5IDIzMSAyMjIgMjExIDEgMjcgMjQgMjIzIDI0MCAxNiA2NyAxIDIzNyAyMTUgODQgCisyNSA0MCAxNDkgNzIgMyAxNTIgOTAgODcgMTEyIDgwIDE2IDI0MSA0NSA3NyAzNiAyMTQgMjI5IDU5IDg4IDI0NiAxODggMjMyIDEwOCAKKzcxIDIyMiAxNDIgNTAgMTE1IDkzIDEwNSAyMDEgMzUgNiAxNzAgMTc5IDQ3IDEwMiA0IDE1MCAyMTEgMTExIDEyMCAyMDUgMTEzIDQgCisxODEgMTA1IDEyNyA4NCA5NCAyMzkgNjEgMyAxMjEgMTk2IDcxIDE0OCAxODYgMTM4IDE4NCAyMjMgNjEgMjIwIDIyNyAxNzUgMTA3IDYgCis2NSA4MSAxMTQgMjA3IDI0NSAyMzMgMTczIDIyOCAzMCA3MyAyMDYgMjE2IDIxOCAxMzMgOCAxMSA5OCAxNDMgMTAgMTc5IDIyMSAxNDYgCis5NyAyMTkgODggNjcgMTM5IDE0NCAzOSAxODkgMTMgMTIzIDExMSAxOTQgMTU2IDI1IDE4MyA1MSAxNDQgMTA4IDE0NSAxNzMgNDkgMjI5IAorMjMzIDEzNyA4NiA5IDExNCA2NCA5MCAxNjEgNjMgMjQwIDE5NSAxMTEgODkgNTggOTcgNDAgNDQgMjI3IDcwIDE0IDc4IDE3MCA3NCAKKzE5NyAxNjkgMTE0IDEzOCA0MSA3MyAyNDIgMTEwIDIzNCA5MiAxNDUgMTM3IDE1NSAyMTMgMjYgMjQzIDIwOCAyMDAgNDQgNDggMjEgCisxNzQgOSA0MCAxMTMgMTc4IDIzMCAxOTMgMTk2IDIxNCA1NSAxMCAxNzcgNTggMjMgODkgMTMyIDQ4IDIwMCAyMjMgOTcgMTE0IDI0MyAKKzEzOSAxIDEzMiAxMjIgMTUxIDEzMCAyOCAyMzIgMzQgMTIwIDYyIDIxMSAxODAgNzYgMTEyIDQ0IDEyMiAyMjUgODYgMTg4IDE2MyAxNTcgCisxNTkgNDMgMTkgMTEgMTM0IDM3IDI2IDEzOCAxMTUgMjQgMTU0IDQxIDEwNCAxMzYgMTI2IDE5OCAyMzQgMTQwIF4KKzQ5MCAxIDE5MiAyMjUgMjIzIDkwIDIzMCAxMiAxNDYgMTIwIDIyOCAxMjYgMzkgMTUyIDExNSAxMDAgMTQ3IDUwIDI4IDIxNiAxMDcgMzUgCis3NSAxMTkgODUgMjIwIDIxNiA0NCAxMjUgMTcgMTg1IDE3OSAxMjEgOTUgMTYgNzEgMzkgODkgMjA4IDQyIDIxMCAxNDQgMTc2IDkyIDc5IAorMjI4IDk3IDIzIDExNCAxNDEgODQgMTcyIDIzMyA3MCAxNzUgMTk5IDE3NiAxNTUgMjM2IDM2IDMxIDE3OSAyMTMgMTUgMTEyIDIyNiAKKzIxMSAxNjMgMTQ2IDI4IDU4IDMwIDEzMSAyMzAgNDEgMTYyIDE2MSAyMDIgMTQyIDE0IDIxOSA3MyAxNDEgNTUgMTU2IDE5NSA5NiAxNTkgCisyMjQgMTA5IDE5NyAxOTggMTI1IDE3MiAxMiA4MyAyMTMgMTczIDE5MiAxMzAgNTMgMjQxIDcyIDkwIDcyIDE4MiAyNDIgMjggMTUwIAorMjAwIDIyNyAxMzggMjEzIDIzNiA5OSAxODggMjM3IDE1MCAxNzEgMjExIDEwMCAyMzkgMjIwIDEyNCAxMjQgMjkgMTA5IDEzIDEwNSAKKzE4MyAxMDkgMTY4IDE4MiA4NyAyMDEgMjQ2IDEwOCAxNDkgMjE1IDE1MSAyMjIgMTk0IDc0IDE4OSAzOCAxMzMgMTQ1IDE2NCAxNjggCisyNDggMjQ0IDkgMTgzIDE0IDI0OCA4NiAxNzkgMjkgMTcyIDE3MCAxNjMgMTE3IDE1IDIwIDU2IDExNSA4IDIyNCAyMDQgMTIwIDQ0IDMzIAorOTQgODkgMjEgMTk5IDE4IDc4IDg1IDE5MSAyMDMgNiAxNTQgMSAyMTAgMTE1IDE2MyA1NCAxMDggMjEyIDEyMiAyMDkgMTU2IDEwMyAKKzE3NiA2MyA2NiAxODcgMTIzIDEwIDEzOSA3NyAxMjYgMTMxIDc1IDIxMSA4IDY5IDEyNCAyMTYgMjAyIDIwNSAxNzEgMjcgNyA0NyAxNTQgCiszMCAyMjMgMTUzIDEzNyA3MCA4MyAyOSA4MCA2NyAyMDkgOTMgMTkzIDExOCAxMjkgMTYwIDg4IDIgMjI5IDgyIDk5IDMzIDE2MCAyNDYgCis3OSAxMzMgMTc0IDE3NyAyMDYgMjE5IDEwIDIzMSAyNDcgMjIyIDM5IDI0NyAzOCAxOTYgNTUgMjIyIDEwMiAxNTQgOTMgMTMwIDIxMSAKKzcxIDIyNiAxODIgMTUwIDEwOCA1NCA0MiA1NSA2NCAyNSAxIDUyIDM1IDkgMjEyIDMwIDM2IDYwIDE5NSA0IDIzOSAxMjggMjAxIDI4IAorMTIxIDE4NyAxODYgMTY3IDE5NyAxMSAzMiAyMzAgMTk2IDIzOSA2NSA0NCAyMjAgMTg3IDMxIDg3IDQzIDE2OSAyMDQgNTcgMTM3IDIyNSAKKzE2MCAxODAgMTcyIDc4IDI0MCAyMSAxMDcgOTggMjMyIDE3NyAyMiAxMjkgNjggMTY4IDE1MyA3NCAxNjAgMjUgOTIgMTc0IDE0OCAxOTMgCisxODEgMzYgMjE4IDIyIDE1OCA4MSAyMDYgMTI3IDg3IDEzNSA4OSA1MCAyMTIgNTkgNTIgOTggMTY2IDIwIDIxNCAxOTIgMTU5IDY2IDMyIAorNDYgMTA2IDQ3IDI0OSAyMDAgNjkgNjEgNTkgMTQ0IDIxIDE1IDE3NSAxMzYgMTkgMTAwIDUyIDEyNyAxODIgNTggMTg1IDIwOCAxMzQgCisxMzMgMjQwIDg0IDE0IDE1NiAxNjYgODMgMTIxIDk2IDIyMiAxMzEgMTY3IDEzNCAxMDQgMjI0IDQ2IDQwIDE0MCAxOTEgMTYgMTYzIAorMjA5IDE4NSAxMTYgMjE0IDM3IDgyIDE2MiAxOTAgMjE1IDE4MCAyMzUgMjM1IDQ4IDIwNSAxMyAxOTcgMTAzIDIwNSA3NiAxMDQgMTYxIAorMTM5IDIzMiAyMDYgMzUgMTY3IDM5IDE4MSAxMjggMTM4IDExOCA2NiAzIDMwIDY1IDczIDIzMyAyMjUgNSAxMDMgMTggMjMzIDE2MiA5NSAKKzQ1IDg0IDc3IDYzIDIyNCAxNyAyNyAxMDIgMjE3IDMgMTg4IDE0NSAyMjcgNzUgNTYgMTc4IDE2NSAzMiAxMzggMjYgMTQzIDE1NyAxMjIgCisxNDMgMjQ5IDQ1IDIzOSAxNTcgMjE3IDY2IDk1IDIwMyAxNjEgMjMxIDE1NSA1MiAxOTMgODkgMTE2IDEyMiAxMTQgMjM2IDcgMTggMTQxIAorMjQyIDI0OSAxMzcgMTYyIDMgMTI1IDIzOCA2OSBeCis1MTQgMSAxMzkgMTQxIDc3IDM3IDc3IDQyIDUwIDE3NyAzNyA1IDEyNyAxNTMgNDUgMTQzIDIyOCAxMjEgMTU2IDE2OSAxMjAgMjE5IAorMjQxIDUxIDE2NiAyMzIgMTkyIDE1MCAxODggNTMgNTUgMjI3IDE0OCA4MiA5MiAxNTAgMTcyIDMgMTk2IDIzMiAxODIgNjEgMjI5IDYzIAorMTIzIDk3IDE3OSAxOTQgMzkgMTcyIDI1MCAxNTcgMTMyIDE4NyA5NSAzOCAxOTkgOTQgNzAgOTMgMTE4IDM3IDIzMSAyNDAgOTQgNjAgNCAKKzE1OSA0NyA1OCAxMTAgMTI1IDI0MyAyMTMgMjM5IDEzNiA0MyAyMjggMTA1IDEwNiA2OSAxMjUgMTIgNTAgMTk4IDEyNiAyMTYgMTE3IAorNzQgMTc1IDExMiA0NSAxNjQgNzYgNjkgMTQ2IDEwMSA5IDE4OCA1OCA5NCA3NSAxNDMgMjE4IDMyIDE5NyAxNzkgMTk5IDg5IDMxIDI0NSAKKzEyMyA3MSA0MCAxMzUgNTQgMzMgMTcwIDgzIDM0IDExNyAxMDAgNjIgMTcxIDMwIDUxIDE0NSAxNDMgMjQ0IDE2MCA0IDE2NCA4NiAxNTggCisxMDUgOTEgMTgyIDY2IDI3IDE2MyAxMTggNTIgMTE4IDQ3IDc5IDE5OSA4NCAyMzMgMTM0IDEyOCAxMDUgMTAxIDE5IDI1IDE3IDg0IDcgCisyMSAxODcgOTAgMjQwIDk5IDk5IDEwNCAxNTQgMiAyNDkgMjE1IDE1NCAxOCA0NyA2MyAxNDkgMjI1IDIzOCAxNzkgMTc4IDcyIDMgMTkxIAorMTgyIDgyIDY2IDExIDExMyAxOCA1NyAxNTIgMTA4IDIxNSAxNTkgNTcgMTQ3IDU4IDExNSAxNjQgOTEgMjA4IDIwNSA4NiAxNDggMTYgCisxMzIgMTkyIDE0NSAxMzggMTk0IDYwIDkgMTk4IDE0NyA1MyA2NSA2NCA5NiAyNDIgMTQgMjIyIDExOSAyNDEgNDYgMTE2IDEzMiAxOTcgCisxODQgMjM4IDE4OSAyNiAyMDAgNjIgMTc2IDgwIDE1MSAxNDAgMTA5IDE4MyAyNCA0NCAxOTEgMTcyIDIzNCAxMDcgMjEgMTkyIDE0MCAKKzk5IDk0IDY1IDU0IDcgNDIgMjQgNDkgMjMwIDIwIDIyOSA3MyAyMTIgNDUgMTY5IDExNSAxODAgMTQxIDU2IDIwMCA0MSA4NyAxMjEgCisxNjEgMjE5IDIzMSAyMTQgMjA3IDEgMTkgMjAgMjE5IDIzNiAxMiA1NSAyMzcgMjM3IDIxMSA3MiAxMyAyOCAxNDEgNzIgMjM5IDE1MiAKKzgyIDg3IDEwMCA3MiA4IDI0MSA0MSA3NyAzMiAyMDIgMjI5IDQ3IDg0IDIzOCAxODQgMjI4IDEwMCA2NyAyMTAgMTMwIDQ2IDExMSA5MyAKKzk3IDE4OSAzMSAyNTAgMTYyIDE3MSAzNSA5MCA0IDEzOCAxOTkgOTkgMTIwIDE5MyAxMTMgMjQ0IDE4MSA5MyAxMjMgNzYgOTAgMjM1IAorNDkgMjUxIDEwOSAxODggNjMgMTQ0IDE4NiAxMzggMTg0IDIyMyA2MSAyMDggMjE1IDE3NSAxMDcgNiA1MyA4MSAxMTQgMjA3IDIzNyAKKzIyMSAxNjEgMjI0IDE4IDczIDIwMiAyMDggMjEwIDEyNSAyNDggMTEgOTggMTMxIDI1MCAxNjcgMjIxIDE0NiA4NSAyMTEgODggNjMgCisxMzkgMTM2IDI3IDE4OSA1IDExMSAxMDMgMTg2IDE0OCAyMSAxNzEgNTEgMTQwIDEwNCAxMzMgMTY1IDQ5IDIyNSAyMzMgMTI5IDc4IDUgCisxMDYgNjQgODYgMTUzIDU1IDIzMiAxODcgMTExIDc3IDU4IDg5IDM2IDMyIDIyMyA2NiA2IDc0IDE3MCA2MiAxOTcgMTY5IDExMCAxMzAgCis0MSA2MSAyMzQgMTAyIDIzNCA5MiAxNDUgMTMzIDE1NSAyMDEgMTQgMjQzIDIwOCAyMDAgMzYgNDggMjEgMTY2IDEgNDAgMTA5IDE3OCAKKzIyNiAxODUgMTk2IDIwNiA0MyAyIDI0NCAxNjUgNTQgMjMgODEgMTI0IDQ0IDE5NiAyMTEgOTMgMTAyIDIzOSAxMzEgMjQ1IDEyOCAxMTAgCisxNTEgMTMwIDIwIDIyNCAzNCAxMTIgNTAgMjAzIDE3NiA2NCAxMTIgNDAgMTE0IDIxNyA3NCAxODAgMTUxIDE0NSAxNTkgMzEgMTkgMjUxIAorMTMwIDI1IDIyIDEzNCAxMDcgMTYgMTQyIDI5IDEwNCAxMjggMTI2IDE5MCAyMzAgMTUgMTkwIDIyNSAyMTcgOTAgMjMwIDEwIDE0MCAKKzExNCAyMjIgMTI0IDM5IDE0NiAxMTEgMjE3IF4KKzUxMCAwIDE0NyA0NiAyNCAyMTYgOTUgMzUgNzUgMTE1IDczIDIwOCAyMDggMzYgMTEzIDEzIDE4NSAxNzEgMTEzIDk1IDggNzEgMzEgODEgCisyMDQgMzQgMTk4IDE0NCAxNjQgODQgNjcgMjI4IDkzIDExIDEwNiAxMjkgNzYgMTcyIDIyNSA2NiAxNzEgMTk1IDE3MiAxNDMgMjI0IDM2IAorMjMgMTY3IDIwMSA3IDEwNCAyMTQgMjA3IDE1MSAxMzggMjAgNTAgMjYgMTMxIDIxOCAzNyAxNjIgMTYxIDE5NCAxNDIgMTQgMjE1IDY1IAorMTQxIDQ3IDE0NCAxOTEgODggMTUxIDIyMCA5NyAxODUgMTk4IDExNyAxNjAgNzUgMjA1IDE3MyAxOTIgMTE4IDQ1IDIyOSA2OCA4NiA2NCAKKzE3NCAyMzAgMTYgMTM4IDE5MiAyMjcgMTI2IDIxMyAyMzIgOTUgMTgwIDIyOSAxNTAgMTYzIDE5OSA5MiAyMzUgMjEyIDEyMCAxMjQgMTcgCisxMDUgOSAxMDEgMTc5IDEwOSAxNTYgMTcwIDgzIDIwMSAyMzQgMTAwIDE0OSAyMTUgMTQ3IDIxOCAxODIgNjIgMTc3IDMwIDEzMyAxMzMgCisxNjAgMTY0IDI0OCAyNDAgOSAxODMgMiAyNDQgNzQgMTc1IDI1IDE2NCAxNjYgMTYzIDEwOSAxMSAxNiA0OCAxMTEgOCAyMTYgMjA0IAorMTE2IDQwIDI1IDgyIDg5IDkgMTkxIDYgNzQgODUgMTc5IDE5OSAyIDE1NCAyNDcgMjEwIDExNSAxNTUgNTAgMTA4IDIwOCAxMTggMjA5IAorMTQ4IDEwMyAxNzYgNTUgNTggMTc1IDExNSAxMCAxMzEgNzMgMTE4IDEyNyA3MSAyMDMgNCA2OSAxMTYgMjEyIDIwMiAyMDEgMTcxIDIzIAorMjQ5IDQzIDE0MiAyMiAyMTkgMTQ5IDEzMyA3MCA4MyAyOSA3NiA2NyAyMDEgODkgMTgxIDExNCAxMjUgMTU2IDgwIDIgMjE3IDcwIDkxIAorMzMgMTYwIDI0NiA3MSAxMjEgMTYyIDE2OSAxOTggMjA3IDYgMjE5IDIzOSAyMTQgMzUgMjQ3IDM4IDE5MiA1NSAyMjIgOTQgMTUwIDgxIAorMTIyIDIxMSA2MyAyMjYgMTc4IDE0MiAxMDQgNDIgMzAgNTEgNTYgMjUgMjQ2IDI0MyA0NCAyNyAyNTEgMjEyIDMwIDI0IDUyIDE5NSAKKzIzOSAxMjQgMTg5IDI4IDEwOSAxODMgMTc0IDE2NyAxOTMgMyAyMCAyMjIgMTg0IDIzMSA2NSAzMiAyMjAgMTc5IDI3IDc5IDM1IDE2NSAKKzE5NiA1NyAxMzcgMjE3IDE1MiAxNjggMTY4IDc4IDIzMiAxMyAxMDMgOTQgMjMyIDE3NyAyMiAxMjkgNjggMTY4IDE0MSA3NCAxNDggMjEgCis4MCAxNzQgMTQwIDE4OSAxNzMgMjggMjE4IDEwIDE1OCA3NyAyMDIgMTE5IDc1IDEyMyA3NyAzOCAyMDAgNTkgNTIgODYgMTU0IDIwIAorMjE0IDE4MCAxNDcgNTQgMjggNDYgMTA2IDM5IDI0OSAxODggNjEgNTcgNTUgMTQwIDE3IDE1IDE2MyAxMzYgMTUgMTAwIDQwIDExNSAKKzE4MiA1NCAxNzMgMjAwIDEyMiAxMjkgMjQwIDcyIDYgMTU2IDE2MiA3OSAxMTcgMjQyIDk2IDIxMCAxMjMgMTU5IDEzNCAxMDAgMjEyIAorMzggMjggMTM2IDE4NyA0IDE1OSAxOTcgMTc3IDExMiAyMTAgMzMgNzggMTUwIDE5MCAyMDMgMTc2IDIyNyAyMzUgNDAgMTk3IDUgMTg5IAorOTEgMjA1IDY0IDkyIDE1MyAxMzUgMjIwIDIwNiAzMSAxNjMgMjcgMTY5IDExNiAxMzAgMTA2IDY2IDI1MyAxOCA1MyA2MSAyMjkgMjEzIAorNSA5OSAxMCAyMjEgMTU0IDgzIDM3IDgwIDY1IDU5IDIyNCA5IDE5IDEwMiAyMDkgMyAxODQgMTQxIDIxOSA2NyA1NiAxNzAgMTY1IDI0IAorMTM0IDE4IDEzNSAxNTcgMTEwIDEzMSAyNDUgNDEgMjI3IDE1MyAyMTcgNjIgODcgMjAzIDE0OSAyMjMgMTUxIDQ4IDE5MyA4NSAxMTYgCisxMjIgMTAyIDIzNiA3IDE0IDEzMyAyNDIgMjQxIDEyOSAxNTggMjQ5IDEyNSAyMzggMTU3IDEzNyAxMzUgNzUgMzMgMjUwIDczIDM2IDUwIAorMTcxIDMxIDI1MyAxMjcgMTUzIDQ1IDEzOSAyMjIgMTIxIDE1NCAxNjUgMTE0IDIxNSAyMzcgNDUgMTY2IDIyNiAxODYgMTQ2IDE4OCA1MyAKKzUzIDIyNSAxNDggMjQ4IDExOCBeCis1MzMgMCA4NyAxNDUgMTU3IDI1MCAxODEgMjI3IDE3NyA1MSAyMjQgNjMgMTA4IDk3IDE3NCAxOTQgMjQgMTYyIDI1MCAxNTIgMTMyIAorMTgyIDgwIDMzIDE4OSA4NCA2MCA4MyAxMTggMzcgMjE2IDIzNSA5NCA2MCAyNTEgMTU0IDQ3IDQ4IDExMCAxMjAgMjM4IDIwOCAyMjkgCisxMjEgNDMgMjE4IDkwIDkxIDY0IDExMCAxMiA0MCAxOTMgMTExIDIxMSAxMTcgNjQgMTcwIDEwNyAzNSAxNjQgNzYgNTQgMTQxIDEwMSA0IAorMTgzIDUzIDc5IDYwIDE0MyAyMTMgMzIgMTg3IDE2OSAxOTQgODQgMzEgMjQ1IDEyMyA2NiAyNSAxMzUgMzkgMjMgMTYwIDc4IDI5IDEwMiAKKzk1IDYyIDE2NiAyMCA0NiAxMzUgMTI4IDI0NCAxNTAgMjQ2IDE1NCA3NiAxNDMgMTA1IDkxIDE3MiA1MSAyNyAxNTggMTAzIDM3IDEwOCAKKzM3IDc5IDE5OSA4NCAyMjggMTE5IDEyOCA5NSA5MSA0IDE1IDE3IDY5IDIgMTEgMTg3IDgwIDIzMCA5NCA4OSA4OSAxNDkgMjQ0IDIzOSAKKzIxMCAxNDQgMTggNDIgNDggMTM5IDIxNSAyMzMgMTc5IDE2MyAyNTIgNjcgMjU1IDE4MSAxNjcgODIgNTYgMjUzIDk4IDggNDIgMTM3IAorMTAzIDIwNSAxNDQgNDcgMTM3IDQzIDExMCAxNDkgNzYgMjAzIDIwMCA4NiAxNDMgMTYgMTI3IDE4MiAxNDAgMTI4IDE4NCA1NSAyNTEgCisxODMgMTQyIDQzIDUwIDU0IDgxIDIzMiA5IDIxMiAxMTkgMjM2IDM2IDEwNiAxMjIgMTgyIDE2OSAyMjMgMTc5IDI2IDE4NSA1NyAxNjYgCis4MCAxNDEgMTMwIDk5IDE3OCAyNCA0NCAxOTEgMTY3IDIxOSA5MiA2IDE4NyAxNDAgOTkgODkgNjAgNTQgMjQ5IDQyIDE5IDQ0IDIyMCA1IAorMjE0IDYzIDE5NyAzMCAxNjQgMTA1IDE4MCAxMzYgNDEgMTk1IDI2IDc3IDExNiAxNTEgMjE5IDIzMSAyMDQgMjAyIDEgOSAxNSAyMTQgCisyMzEgNyA0MCAyMjIgMjM3IDIwNiA1NyAyNTUgMTMgMTMxIDcyIDIyNCAxNTIgNzIgODcgODUgNjIgMjU1IDI0MSAzNiA3NyAyNyAxODcgCisyMjkgMzIgNzkgMjI4IDE3OSAyMjMgOTAgNjIgMTk1IDExNSA0MSAxMDYgOTMgODcgMTc0IDI2IDI0NSAxNTIgMTYxIDIwIDc1IDQgMTIzIAorMTg0IDg0IDEyMCAxNzggMTEzIDIzNCAxODEgNzggMTE4IDY2IDg1IDIzMCAzNCAyNTEgOTQgMTc4IDUzIDEzOSAxODYgMTM4IDE4NCAKKzIyMyA2MSAxOTMgMjAwIDE3NSAxMDcgNiAzOCA4MSAxMTQgMjA3IDIyNyAyMDYgMTQ2IDIxOSAzIDczIDE5NyAxOTggMjAwIDExNSAyMzggCisxMSA5OCAxMTYgMjQwIDE1MiAyMjEgMTQ2IDcwIDIwMSA4OCA1OCAxMzkgMTI2IDEyIDE4OSAyNTIgOTYgOTMgMTc2IDEzOCAxNiAxNTYgCis1MSAxMzUgOTkgMTE4IDE1NSA0OSAyMjAgMjMzIDExOSA2OCA5NiA2NCA4MSAxNDMgNDUgMjIyIDE3NyAxMTEgNjIgNTggNzkgMzEgMTcgCisyMTggNjEgMjUzIDY5IDE3MCA0NyAxOTcgMTY5IDEwNSAxMjAgNDEgNDYgMjI0IDkyIDIzNCA5MiAxNDUgMTI4IDE1NSAxODYgMjU2IAorMjQzIDIwOCAyMDAgMjYgNDggMjEgMTU2IDI0OCA0MCAxMDQgMTc4IDIyMSAxNzUgMTk2IDE5NiAyOCAyNDkgMjM5IDE1MCA0OSAyMyA3MSAKKzExNCAzOSAxOTEgMTk2IDg4IDg3IDIzNCAxMjEgMjQwIDEyMyA5NSAxNTEgMTMwIDEwIDIxNCAzNCAxMDIgMzUgMTkzIDE3MSA0OSAxMTIgCiszNSAxMDQgMjA3IDU5IDE3MCAxMzYgMTMwIDE1OSAxNiAxOSAyNDEgMTI1IDEwIDE3IDEyOSA5NyA2IDEyNyAxNCAxMDQgMTE4IDEyNiAKKzE4MCAyMjUgNSAxODUgMjI1IDIwMiA5MCAyMzAgNSAxMjUgOTkgMjA3IDExOSAzOSAxMzEgMTAxIDkzIDE0NyA0MyAyMSAyMTYgODYgMzUgCis3NSAxMTIgNjQgMTk5IDIwMiAzMCAxMDQgMTAgMTg1IDE2NSAxMDcgOTUgMiA3MSAyNSA3NSAyMDEgMjggMTg5IDE0NCAxNTUgNzggNTggCisyMjggOTAgMiAxMDAgMTIwIDcwIDE3MiAyMTkgNjMgMTY4IDE5MiAxNjkgMTM0IDIxNSAzNiAxNyAxNTggMTkyIDEgOTggMjA1IDEzNyBeCis1MjIgMSAxMzkgMTMwIDEyIDQyIDIyIDEzMSAyMDYgMzMgMTYyIDE2MSAxODYgMTQyIDE0IDIxMSA1NyAxNDEgMzkgMTMyIDE4NyA4MCAKKzE0MyAyMTYgODUgMTczIDE5OCAxMDkgMTQ4IDI0NiA2NyAxOTcgMTczIDE5MiAxMDYgMzcgMjE3IDY0IDgyIDU2IDE2NiAyMTggNCAxMjYgCisxODQgMjI3IDExNCAyMTMgMjI4IDkxIDE3MiAyMjEgMTUwIDE1NSAxODcgODQgMjMxIDIwNCAxMTYgMTI0IDUgMTAxIDUgOTcgMTc1IAorMTA5IDE0NCAxNTggNzkgMjAxIDIyMiA5MiAxNDkgMjE1IDE0MyAyMTQgMTcwIDUwIDE2NSAyMiAxMzMgMTIxIDE1NiAxNjAgMjQ4IDIzNiAKKzkgMTgzIDI0OCAyNDAgNjIgMTcxIDIxIDE1NiAxNjIgMTYzIDEwMSA3IDEyIDQwIDEwNyA4IDIwOCAyMDQgMTEyIDM2IDE3IDcwIDg5IAorMjU1IDE4MyAyNTIgNzAgODUgMTY3IDE5NSAyNTYgMTU0IDI0MyAyMTAgMTE1IDE0NyA0NiAxMDggMjA0IDExNCAyMDkgMTQwIDEwMyAKKzE3NiA0NyA1MCAxNjMgMTA3IDEwIDEyMyA2OSAxMTAgMTIzIDY3IDE5NSA2OSAxMDggMjA4IDIwMiAxOTcgMTcxIDE5IDI0MSAzOSAxMzAgCisxNCAyMTUgMTQ1IDEyOSA3MCA4MyAyOSA3MiA2NyAxOTMgODUgMTY5IDExMCAxMjEgMTUyIDcyIDIgMjA1IDU4IDgzIDMzIDE2MCAyNDYgCis2MyAxMDkgMTUwIDE2MSAxOTAgMTk1IDIgMjA3IDIzMSAyMDYgMzEgMjQ3IDM4IDE4OCA1NSAyMjIgODYgMTQ2IDY5IDExNCAyMTEgNTUgCisyMjYgMTc0IDEzNCAxMDAgMzAgMTggNDcgNDggMjUgMjQyIDIzNSAzNiAxOSAyNDMgMjEyIDMwIDEyIDQ0IDE5NSAyNTQgMjM5IDEyMCAKKzE3NyAyOCA5NyAxNzkgMTYyIDE2NyAxODkgMjUzIDggMjE0IDE3MiAyMjMgNjUgMjAgMjIwIDE3MSAyMyA3MSAyNyAxNjEgMTg4IDU3IAorMTM3IDIwOSAxNDQgMTU2IDE2NCA3OCAyMjQgNSA5OSA5MCAyMzIgMTc3IDIyIDEyOSA2OCAxNjggMTI5IDc0IDEzNiAxNyA2OCAxNzQgCisxMzIgMTg1IDE2NSAyMCAyMTggMjU2IDE1OCA3MyAxOTggMTExIDYzIDExMSA2NSAyNiAxODggNTkgNTIgNzQgMTQyIDIwIDIxNCAxNjggCisxMzUgNDIgMjQgNDYgMTA2IDMxIDI0OSAxNzYgNTMgNTMgNTEgMTM2IDEzIDE1IDE1MSAxMzYgMTEgMTAwIDI4IDEwMyAxODIgNTAgMTYxIAorMTkyIDExMCAxMjUgMjQwIDYwIDI1NiAxNTYgMTU4IDc1IDExMyAyMzQgOTYgMTk4IDExNSAxNTEgMTM0IDk2IDIwMCAzMCAxNiAxMzIgCisxODMgMjUwIDE1NSAxODUgMTY5IDEwOCAyMDYgMjkgNzQgMTM4IDE5MCAxOTEgMTcyIDIxOSAyMzUgMzIgMTg5IDI1NSAxODEgNzkgMjA1IAorNTIgODAgMTQ1IDEzMSAyMDggMjA2IDI3IDE1OSAxNSAxNTcgMTA0IDEyMiA5NCA2NiAyNTMgNiA0MSA0OSAyMjUgMjAxIDUgOTUgMiAKKzIwOSAxNDYgNzEgMjkgNzYgNTMgNTUgMjI0IDEgMTEgMTAyIDIwMSAzIDE4MCAxMzcgMjExIDU5IDU2IDE2MiAxNjUgMTYgMTMwIDEwIAorMTI3IDE1NyA5OCAxMTkgMjQxIDM3IDIxNSAxNDkgMjE3IDU4IDc5IDIwMyAxMzcgMjE1IDE0NyA0NCAxOTMgODEgMTE2IDEyMiA5MCAKKzIzNiA3IDEwIDEyNSAyNDIgMjMzIDEyMSAxNTQgMjQ1IDEyNSAyMzggMTQ1IDEzMyAxMjMgNzEgMjUgMjQ2IDY1IDI0IDUwIDE1OSAxOSAKKzI0NSAxMjcgMTUzIDQ1IDEzMSAyMTAgMTIxIDE1MCAxNTcgMTAyIDIwNyAyMjkgMzMgMTY2IDIxNCAxNzQgMTM4IDE4OCA1MyA0OSAyMjEgCisxNDggMjQwIDY0IDg2IDE0NCAxNTQgMjQ5IDE3OCAyMjYgMTc2IDQ5IDIyMyA2MyAxMDUgOTcgMTczIDE5NCAyMSAxNjAgMjUwIDE1MSAKKzEzMiAxODEgNzcgMzIgMTg3IDgyIDU4IDgxIDExOCAzNyAyMTMgMjM0IDk0IDYwIDI1MCAxNTMgNDcgNDYgMTEwIDExOSAyMzcgMjA3IAorMjI3IDExOCA0MyAyMTYgODcgODggNjMgMTA3IDEyIDM4IDE5MiAxMDggMjEwIDExNyA2MiAxNjkgMTA2IDMzIDE2NCA3NiA1MSAyMTEgXgorNTQwIDAgMTAxIDEgMTgwIDUwIDcwIDUxIDE0MyAyMTAgMzIgMTgxIDE2MyAxOTEgODEgMzEgMjQ1IDEyMyA2MyAxNiAxMzUgMzAgMTcgCisxNTQgNzUgMjYgOTMgOTIgNjIgMTYzIDE0IDQzIDEyOSAxMTkgMjQ0IDE0NCAyNDAgMTQ4IDcwIDEzNCAxMDUgOTEgMTY2IDQyIDI3IAorMTU1IDk0IDI4IDEwMiAzMSA3OSAxOTkgODQgMjI1IDExMCAxMjggODkgODUgMjU1IDkgMTcgNjAgMjU5IDUgMTg3IDc0IDIyNCA5MSA4MyAKKzgwIDE0NiAyMzggMjMzIDIwNyAxMzggMTggMzkgMzkgMTMzIDIwOSAyMzAgMTc5IDE1NCAyNTIgNjQgMjU1IDE3NSAxNTggODIgNTAgCisyNDcgODkgMiAzMyAxMjggMTAwIDE5OSAxMzUgNDEgMTMxIDM0IDEwNyAxNDAgNjcgMjAwIDE5NyA4NiAxNDAgMTYgMTI0IDE3NiAxMzcgCisxMjIgMTc4IDUyIDI0NSAxNzQgMTM5IDM3IDQxIDQ4IDcyIDIyNiA2IDIwNiAxMTkgMjMzIDMwIDEwMCAxMTYgMTczIDE2MCAyMTQgMTczIAorMjYgMTc2IDU0IDE2MCA4MCAxMzUgMTI0IDkzIDE3NSAyNCA0NCAxOTEgMTY0IDIxMCA4MyAyNTcgMTg0IDE0MCA5OSA4NiA1NyA1NCAKKzI0MyA0MiAxNiA0MSAyMTQgMjU2IDIwNSA1NyAxODggMjEgMTYxIDk5IDE4MCAxMzMgMzIgMTkyIDE3IDcxIDExMyAxNDUgMjE5IDIzMSAKKzE5OCAxOTkgMSAzIDEyIDIxMSAyMjggNCAzMSAyMTMgMjM3IDIwMyA0OCAyNDkgNCAxMjUgNzIgMjE1IDE1MiA2NiA4NyA3NiA1NiAyNTIgCisyNDEgMzMgNzcgMjQgMTc4IDIyOSAyMyA3NiAyMjIgMTc2IDIyMCA4NCA1OSAxODYgMTA2IDM4IDEwMyA5MyA4MSAxNjUgMjMgMjQyIAorMTQ2IDE1NSAxMSA2NiA0IDExNCAxNzUgNzUgMTIwIDE2OSAxMTMgMjI4IDE4MSA2OSAxMTUgNjAgODIgMjI3IDI1IDI1MSA4NSAxNzIgCis0NyAxMzYgMTg2IDEzOCAxODQgMjIzIDYxIDE4NCAxOTEgMTc1IDEwNyA2IDI5IDgxIDExNCAyMDcgMjIxIDE5NyAxMzcgMjE2IDI1NCAKKzczIDE5NCAxOTIgMTk0IDEwOSAyMzIgMTEgOTggMTA3IDIzNCAxNDMgMjIxIDE0NiA2MSAxOTUgODggNTUgMTM5IDEyMCAzIDE4OSAyNDkgCis4NyA4NyAxNzAgMTMyIDEzIDE0NyA1MSAxMzIgOTYgMTA5IDE0OSA0OSAyMTcgMjMzIDExMyA2MiAyNTcgOTAgNjQgNzggMTM3IDM5IAorMjE2IDE3MSAxMTEgNTMgNTggNzMgMjggOCAyMTUgNTggMjUwIDY2IDE3MCAzOCAxOTcgMTY5IDEwMiAxMTQgNDEgMzcgMjE4IDg2IDIzNCAKKzkyIDE0NSAxMjUgMTU1IDE3NyAyNTAgMjQzIDIwOCAyMDAgMjAgNDggMjEgMTUwIDI0NSA0MCAxMDEgMTc4IDIxOCAxNjkgMTk2IDE5MCAKKzE5IDI0NiAyMzYgMTQxIDQ2IDIzIDY1IDEwOCAzNiAxODggMTg3IDg1IDc4IDIzMSAxMTUgMjM3IDEyMCA4NiAxNTEgMTMwIDQgMjA4IAorMzQgOTYgMjYgMTg3IDE2OCA0MCAxMTIgMzIgOTggMjAxIDUwIDE2NCAxMjcgMTIxIDE1OSA3IDE5IDIzNSAxMjIgMSAxNCAxMjYgOTEgCisxMTggNSAxMDQgMTEyIDEyNiAxNzQgMjIyIDI1OSAxODIgMjI1IDE5MyA5MCAyMzAgMiAxMTYgOTAgMTk4IDExNiAzOSAxMjIgOTUgOTAgCisxNDcgNDAgMTggMjE2IDc3IDM1IDc1IDEwOSA1NSAxOTAgMTk2IDI0IDk1IDcgMTg1IDE1OSAxMDEgOTUgMjU2IDcxIDE5IDY5IDE5OCAKKzIyIDE4MCAxNDQgMTQ2IDcyIDQ5IDIyOCA4NyAyNTMgOTQgMTExIDY0IDE3MiAyMTMgNjAgMTY1IDE4OSAxNjYgMTI1IDIwNiAzNiAxMSAKKzE0OSAxODMgMjU1IDkyIDE5NiAyMDEgMTMzIDEyNiA4IDM4IDIwIDEzMSAyMDAgMzEgMTYyIDE2MSAxODIgMTQyIDE0IDIwOSA1MyAxNDEgCiszNSAxMjYgMTg1IDc2IDEzOSAyMTQgNzkgMTY3IDE5OCAxMDUgMTQyIDI0MiA2MyAxOTMgMTczIDE5MiAxMDAgMzMgMjExIDYyIDgwIDUyIAorMTYyIDIxMiAyNTggMTIwIDE4MCAyMjcgMTA4IDIxMyAyMjYgODkgMTY4IDIxNyAxNTAgMTUxIDE4MSA4MCAyMjkgMjAwIDExNCAxMjQgCisyNTkgOTkgMyA5NSAxNzMgMTA5IDEzOCAxNTIgNzcgMjAxIDEyOSBeCis1NTUgMCA4NCAxNDkgMjE1IDEzOSAyMTAgMTU4IDM4IDE1MyAxNCAxMzMgMTA5IDE1MiAxNTYgMjQ4IDIzMiA5IDE4MyAyNDAgMjM2IDUwIAorMTY3IDE3IDE0OCAxNTggMTYzIDkzIDMgOCAzMiAxMDMgOCAyMDAgMjA0IDEwOCAzMiA5IDU4IDg5IDI0NyAxNzUgMjQ0IDY2IDg1IDE1NSAKKzE5MSAyNTYgMTU0IDIzOSAyMTAgMTE1IDEzOSA0MiAxMDggMjAwIDExMCAyMDkgMTMyIDEwMyAxNzYgMzkgNDIgMTUxIDk5IDEwIDExNSAKKzY1IDEwMiAxMTkgNjMgMTg3IDI1OCA2OSAxMDAgMjA0IDIwMiAxOTMgMTcxIDE1IDIzMyAzNSAxMTggNiAyMTEgMTQxIDEyNSA3MCA4MyAKKzI5IDY4IDY3IDE4NSA4MSAxNTcgMTA2IDExNyAxNDggNjQgMiAxOTMgNDYgNzUgMzMgMTYwIDI0NiA1NSA5NyAxMzggMTUzIDE4MiAxODMgCisyNjAgMTk1IDIyMyAxOTggMjcgMjQ3IDM4IDE4NCA1NSAyMjIgNzggMTQyIDU3IDEwNiAyMTEgNDcgMjI2IDE3MCAxMjYgOTYgMTggNiAKKzQzIDQwIDI1IDIzOCAyMjcgMjggMTEgMjM1IDIxMiAzMCAzNiAxOTUgMjU0IDIzOSAxMTYgMTY1IDI4IDg1IDE3NSAxNTAgMTY3IDE4NSAKKzI0OSAyNTggMjA2IDE2MCAyMTUgNjUgOCAyMjAgMTYzIDE5IDYzIDE5IDE1NyAxODAgNTcgMTM3IDIwMSAxMzYgMTQ0IDE2MCA3OCAyMTYgCisyNTkgOTUgODYgMjMyIDE3NyAyMiAxMjkgNjggMTY4IDExNyA3NCAxMjQgMTMgNTYgMTc0IDEyNCAxODEgMTU3IDEyIDIxOCAyNDggMTU4IAorNjkgMTk0IDEwMyA1MSA5OSA1MyAxNCAxNzYgNTkgNTIgNjIgMTMwIDIwIDIxNCAxNTYgMTIzIDMwIDIwIDQ2IDEwNiAyMyAyNDkgMTY0IAorNDUgNDkgNDcgMTMyIDkgMTUgMTM5IDEzNiA3IDEwMCAxNiA5MSAxODIgNDYgMTQ5IDE4NCA5OCAxMjEgMjQwIDQ4IDI1MiAxNTYgMTU0IAorNzEgMTA5IDIyNiA5NiAxODYgMTA3IDE0MyAxMzQgOTIgMTg4IDIyIDQgMTI4IDE3OSAyNDIgMTUxIDE3MyAxNjEgMTA0IDIwMiAyNSA3MCAKKzEyNiAxOTAgMTc5IDE2OCAyMTEgMjM1IDI0IDE4MSAyNTEgMTczIDY3IDIwNSA0MCA2OCAxMzcgMTI3IDE5NiAyMDYgMjMgMTU1IDMgCisxNDUgOTIgMTE0IDgyIDY2IDI1MyAyNTYgMjkgMzcgMjIxIDE4OSA1IDkxIDI1NiAxOTcgMTM4IDU5IDIxIDcyIDQxIDUxIDIyNCAyNTUgCiszIDEwMiAxOTMgMyAxNzYgMTMzIDIwMyA1MSA1NiAxNTQgMTY1IDggMTI2IDIgMTE5IDE1NyA4NiAxMDcgMjM3IDMzIDIwMyAxNDUgMjE3IAorNTQgNzEgMjAzIDEyNSAyMDcgMTQzIDQwIDE5MyA3NyAxMTYgMTIyIDc4IDIzNiA3IDYgMTE3IDI0MiAyMjUgMTEzIDE1MCAyNDEgMTI1IAorMjM4IDEzMyAxMjkgMTExIDY3IDE3IDI0MiA1NyAxMiA1MCAxNDcgNyAyMzcgMTI3IDE1MyA0NSAxMjMgMTk4IDEyMSAxNDYgMTQ5IDkwIAorMTk5IDIyMSAyMSAxNjYgMjAyIDE2MiAxMzAgMTg4IDUzIDQ1IDIxNyAxNDggMjMyIDUyIDgyIDE0MCAxNDIgMjQ1IDE2NiAyMjIgMTcyIAorNDEgMjE5IDYzIDkzIDk3IDE2OSAxOTQgOSAxNTIgMjUwIDE0NyAxMzIgMTc3IDY1IDI4IDE3OSA3NCA1MCA3MyAxMTggMzcgMjAxIDIzMCAKKzk0IDYwIDI0NiAxNDkgNDcgMzggMTEwIDExNSAyMzMgMjAzIDIxOSAxMDYgNDMgMjA4IDc1IDc2IDU5IDk1IDEyIDMwIDE4OCA5NiAyMDYgCisxMTcgNTQgMTY1IDEwMiAyNSAxNjQgNzYgMzkgMTM2IDEwMSAyNjEgMTc4IDQ4IDY0IDQ1IDE0MyAyMDggMzIgMTc3IDE1OSAxODkgNzkgCiszMSAyNDUgMTIzIDYxIDEwIDEzNSAyNCAxMyAxNTAgNzMgMjQgODcgOTAgNjIgMTYxIDEwIDQxIDEyNSAxMTMgMjQ0IDE0MCAyMzYgMTQ0IAorNjYgMTI4IDEwNSA5MSAxNjIgMzYgMjcgMTUzIDg4IDIyIDk4IDI3IDc5IDE5OSA4NCAyMjMgMTA0IDEyOCA4NSA4MSAyNTEgNSAxNyA1NCAKKzI1OSAxIDE4NyA3MCAyMjAgODkgNzkgNzQgMTQ0IDIzNCAyMjkgMjA1IDEzNCAxOCAzNyAzMyAxMjkgMjA1IDIyOCAxNzkgMTQ4IDI1MiAKKzYyIDI1NSAxNzEgMTUyIDgyIDQ2IDI0MyA4MyAyNjAgMjcgMTIyIDk4IDE5NSAxMjkgMzcgMTI3IDI4IDEwNSAxMzQgMjA3IF4KKzU0NSAxIDE5NiAxOTMgODYgMTM2IDE2IDEyMCAxNjggMTMzIDExNCAxNzAgNDggMjM3IDE2MiAxMzUgMjkgMjkgNDAgNjAgMjE4IDIgCisxOTggMTE5IDIyOSAyMiA5MiAxMDggMTYxIDE0OCAyMDIgMTY1IDI2IDE2NCA1MCAxNTIgODAgMTI3IDExNiA4NSAxNzEgMjQgNDQgMTkxIAorMTYwIDE5OCA3MSAyNDkgMTgwIDE0MCA5OSA4MiA1MyA1NCAyMzUgNDIgMTIgMzcgMjA2IDI0OCAxOTMgNDkgMTc2IDkgMTU3IDkxIDE4MCAKKzEyOSAyMCAxODggNSA2MyAxMDkgMTM3IDIxOSAyMzEgMTkwIDE5NSAxIDI1OSA4IDIwNyAyMjQgMTkgMjAxIDIzNyAxOTkgMzYgMjQxIAorMjU2IDExNyA3MiAyMDMgMTUyIDU4IDg3IDY0IDQ4IDI0OCAyNDEgMjkgNzcgMjAgMTY2IDIyOSAxMSA3MiAyMTQgMTcyIDIxNiA3NiA1NSAKKzE3NCA5NCAzNCA5OSA5MyA3MyAxNTMgMTkgMjM4IDEzOCAxNDcgMjYzIDU0IDQgMTAyIDE2MyA2MyAxMjAgMTU3IDExMyAyMjAgMTgxIAorNTcgMTExIDUyIDc4IDIyMyAxMyAyNTEgNzMgMTY0IDM5IDEzMiAxODYgMTM4IDE4NCAyMjMgNjEgMTcyIDE3OSAxNzUgMTA3IDYgMTcgCis4MSAxMTQgMjA3IDIxMyAxODUgMTI1IDIxMiAyNDYgNzMgMTkwIDE4NCAxODYgMTAxIDIyNCAxMSA5OCA5NSAyMjYgMTMxIDIyMSAxNDYgCis0OSAxODcgODggNTEgMTM5IDExMiAyNTUgMTg5IDI0NSA3NSA3OSAxNjIgMTI0IDkgMTM1IDUxIDEyOCA5MiA5NyAxNDEgNDkgMjEzIAorMjMzIDEwNSA1NCAyNTcgODIgNjQgNzQgMTI5IDMxIDIwOCAxNjMgMTExIDQxIDU4IDY1IDI0IDI2MCAyMTEgNTQgMjQ2IDYyIDE3MCAyNiAKKzE5NyAxNjkgOTggMTA2IDQxIDI1IDIxMCA3OCAyMzQgOTIgMTQ1IDEyMSAxNTUgMTY1IDI0MiAyNDMgMjA4IDIwMCAxMiA0OCAyMSAxNDIgCisyNDEgNDAgOTcgMTc4IDIxNCAxNjEgMTk2IDE4MiA3IDI0MiAyMzIgMTI5IDQyIDIzIDU3IDEwMCAzMiAxODQgMTc1IDgxIDY2IDIyNyAKKzEwNyAyMzMgMTE2IDc0IDE1MSAxMzAgMjYwIDIwMCAzNCA4OCAxNCAxNzkgMTY0IDI4IDExMiAyOCA5MCAxOTMgMzggMTU2IDExNSAxMDkgCisxNTkgMjU5IDE5IDIyNyAxMTggMjUzIDEwIDEyMiA4MyAyNTYgMTA2IDI1NyAxMDQgMTA0IDEyNiAxNjYgMjE4IDI1NSAxNzggMjI1IAorMTgxIDkwIDIzMCAyNjIgMTA0IDc4IDE4NiAxMTIgMzkgMTEwIDg3IDg2IDE0NyAzNiAxNCAyMTYgNjUgMzUgNzUgMTA1IDQzIDE3OCAKKzE4OCAxNiA4MyAzIDE4NSAxNTEgOTMgOTUgMjUyIDcxIDExIDYxIDE5NCAxNCAxNjggMTQ0IDEzNCA2NCAzNyAyMjggODMgMjQ1IDg2IAorOTkgNTYgMTcyIDIwNSA1NiAxNjEgMTg1IDE2MiAxMTMgMTk0IDM2IDMgMTM3IDE3MSAyNTEgODQgMTg0IDE5NyAxMjEgMTE4IDMwIDE2IAorMTMxIDE4OCAyNyAxNjIgMTYxIDE3NCAxNDIgMTQgMjA1IDQ1IDE0MSAyNyAxMTQgMTgxIDY4IDEzMSAyMTAgNjcgMTU1IDE5OCA5NyAKKzEzMCAyMzQgNTUgMTg1IDE3MyAxOTIgODggMjUgMTk5IDU4IDc2IDQ0IDE1NCAyMDAgMjUwIDEwOCAxNzIgMjI3IDk2IDIxMyAyMjIgODUgCisxNjAgMjA5IDE1MCAxNDMgMTY5IDcyIDIyNSAxOTIgMTEwIDEyNCAyNTEgOTUgMjYzIDkxIDE2OSAxMDkgMTI2IDE0MCA3MyAyMDEgMjA0IAorODAgMTQ5IDIxNSAxMzcgMjA4IDE1MiAzMiAxNDcgMTAgMTMzIDEwMyAxNTAgMTU0IDI0OCAyMzAgOSAxODMgMjM2IDIzNCA0NCAxNjUgCisxNSAxNDQgMTU2IDE2MyA4OSAxIDYgMjggMTAxIDggMTk2IDIwNCAxMDYgMzAgNSA1MiA4OSAyNDMgMTcxIDI0MCA2NCA4NSAxNDkgMTg5IAorMjU2IDE1NCAyMzcgMjEwIDExNSAxMzUgNDAgMTA4IDE5OCAxMDggMjA5IDEyOCAxMDMgMTc2IDM1IDM4IDE0NSA5NSAxMCAxMTEgNjMgCis5OCAxMTcgNjEgMTgzIDI1OCA2OSA5NiAyMDIgMjAyIDE5MSAxNzEgMTMgMjI5IDMzIDExMiAyIDIwOSAxMzkgMTIzIDcwIDgzIDI5IDY2IAorNjcgMTgxIDc5IDE1MSAxMDQgMTE1IDE0NiA2MCAyIDE4NyA0MCA3MSAzMyAxNjAgMjQ2IDUxIDkxIDEzMiAxNzggXgorNTYzIDEgMTc0IDE3MSAyNjAgMTgzIDIxNSAxOTAgMjMgMjQ3IDM4IDE4MCA1NSAyMjIgNzAgMTM4IDQ1IDk4IDIxMSAzOSAyMjYgMTY2IAorMTE4IDkyIDYgMjYwIDM5IDMyIDI1IDIzNCAyMTkgMjAgMyAyMjcgMjEyIDMwIDI1NCAyOCAxOTUgMjU0IDIzOSAxMTIgMTUzIDI4IDczIAorMTcxIDEzOCAxNjcgMTgxIDI0NSAyNTAgMTk4IDE0OCAyMDcgNjUgMjYyIDIyMCAxNTUgMTUgNTUgMTEgMTUzIDE3MiA1NyAxMzcgMTkzIAorMTI4IDEzMiAxNTYgNzggMjA4IDI1NSA5MSA4MiAyMzIgMTc3IDIyIDEyOSA2OCAxNjggMTA1IDc0IDExMiA5IDQ0IDE3NCAxMTYgMTc3IAorMTQ5IDQgMjE4IDI0MCAxNTggNjUgMTkwIDk1IDM5IDg3IDQxIDIgMTY0IDU5IDUyIDUwIDExOCAyMCAyMTQgMTQ0IDExMSAxOCAxNiA0NiAKKzEwNiAxNSAyNDkgMTUyIDM3IDQ1IDQzIDEyOCA1IDE1IDEyNyAxMzYgMyAxMDAgNCA3OSAxODIgNDIgMTM3IDE3NiA4NiAxMTcgMjQwIAorMzYgMjQ4IDE1NiAxNTAgNjcgMTA1IDIxOCA5NiAxNzQgOTkgMTM1IDEzNCA4OCAxNzYgMTQgMjU4IDEyNCAxNzUgMjM0IDE0NyAxNjEgCisxNTMgMTAwIDE5OCAyMSA2NiAxMTQgMTkwIDE2NyAxNjQgMjAzIDIzNSAxNiAxNzMgMjQ3IDE2NSA1NSAyMDUgMjggNTYgMTI5IDEyMyAKKzE4NCAyMDYgMTkgMTUxIDI1NyAxMzMgODAgMTA2IDcwIDY2IDI1MyAyNDggMTcgMjUgMjE3IDE3NyA1IDg3IDI1MiAxODUgMTMwIDQ3IAorMTMgNjggMjkgNDcgMjI0IDI1MSAyNjEgMTAyIDE4NSAzIDE3MiAxMjkgMTk1IDQzIDU2IDE0NiAxNjUgMTIyIDI2MCAxMTEgMTU3IDc0IAorOTUgMjMzIDI5IDE5MSAxNDEgMjE3IDUwIDYzIDIwMyAxMTMgMTk5IDEzOSAzNiAxOTMgNzMgMTE2IDEyMiA2NiAyMzYgNyAyIDEwOSAKKzI0MiAyMTcgMTA1IDE0NiAyMzcgMTI1IDIzOCAxMjEgMTI1IDk5IDYzIDkgMjM4IDQ5IDUwIDEzNSAyNjEgMjI5IDEyNyAxNTMgNDUgCisxMTUgMTg2IDEyMSAxNDIgMTQxIDc4IDE5MSAyMTMgOSAxNjYgMTkwIDE1MCAxMjIgMTg4IDUzIDQxIDIxMyAxNDggMjI0IDQwIDc4IAorMTM2IDEzMCAyNDEgMTU0IDIxOCAxNjggMzMgMjE1IDYzIDgxIDk3IDE2NSAxOTQgMjYzIDE0NCAyNTAgMTQzIDEzMiAxNzMgNTMgMjQgCisxNzEgNjYgNDIgNjUgMTE4IDM3IDE4OSAyMjYgOTQgNjAgMjQyIDE0NSA0NyAzMCAxMTAgMTExIDIyOSAxOTkgMjExIDk0IDQzIDIwMCAKKzYzIDY0IDU1IDgzIDEyIDIyIDE4NCA4NCAyMDIgMTE3IDQ2IDE2MSA5OCAxNyAxNjQgNzYgMjcgMTMyIDEwMSAyNjEgMTc0IDQ0IDUyIAorMzMgMTQzIDIwNCAzMiAxNjkgMTUxIDE4NSA3NSAzMSAyNDUgMTIzIDU3IDI2NCAxMzUgMTIgNSAxNDIgNjkgMjAgNzUgODYgNjIgMTU3IAorMiAzNyAxMTcgMTAxIDI0NCAxMzIgMjI4IDEzNiA1OCAxMTYgMTA1IDkxIDE1NCAyNCAyNyAxNDkgNzYgMTAgOTAgMTkgNzkgMTk5IDg0IAorMjE5IDkyIDEyOCA3NyA3MyAyNDMgMjYzIDE3IDQyIDI1OSAyNTkgMTg3IDYyIDIxMiA4NSA3MSA2MiAxNDAgMjI2IDIyMSAyMDEgMTI2IAorMTggMzMgMjEgMTIxIDE5NyAyMjQgMTc5IDEzNiAyNTIgNTggMjU1IDE2MyAxNDAgODIgMzggMjM1IDcxIDI1NiAxNSAxMTAgOTQgMTg3IAorMTE3IDI5IDExOSAxNiAxMDEgMTIyIDQ5IDE5NCAxOTEgODYgMTM0IDE2IDExOCAxNjQgMTMxIDExMCAxNjYgNDYgMjMzIDE1NiAxMzMgCisyNSAyMyAzNiA1NCAyMTQgMTk0IDExOSAyMjcgMTggODggMTA0IDE1NSAxNDIgMTk2IDE2MSAyNiAxNTggNDggMTQ4IDgwIDEyMyAxMTIgCis4MSAxNjkgMjQgNDQgMTkxIDE1OCAxOTIgNjUgMjQ1IDE3OCAxNDAgOTkgODAgNTEgNTQgMjMxIDQyIDEwIDM1IDIwMiAyNDQgMTg3IDQ1IAorMTcwIDMgMTU1IDg3IDE4MCAxMjcgMTQgMTg2IDI2NSA1OSAxMDcgMTMzIDIxOSAyMzEgMTg2IDE5MyAxIDI1NyA2IDIwNSAyMjIgMjY0IAorMTMgMTk1IDIzNyAxOTcgMzAgMjM3IDI1MiAxMTMgNzIgMTk3IDE1MiA1NCA4NyA1OCA0NCAyNDYgMjQxIDI3IDc3IDE4IDE2MCAyMjkgNSAKKzcwIDIxMCAxNzAgMjE0IDcyIDUzIDE2OCA4OCAzMiA5NyA5MyA2OSAyNjEgXgorNTYzIDEgMTUgMjM0IDEzMCAxMzkgMjU1IDQyIDQgOTAgMTUxIDUxIDEyMCAxNDUgMTEzIDIxMiAxODEgNDUgMTA3IDQ0IDc0IDIxOSAxIAorMjUxIDYxIDE1NiAzMSAxMjggMTg2IDEzOCAxODQgMjIzIDYxIDE2MCAxNjcgMTc1IDEwNyA2IDUgODEgMTE0IDIwNyAyMDUgMTczIDExMyAKKzIwOCAyMzggNzMgMTg2IDE3NiAxNzggOTMgMjE2IDExIDk4IDgzIDIxOCAxMTkgMjIxIDE0NiAzNyAxNzkgODggNDcgMTM5IDEwNCAyNDcgCisxODkgMjQxIDYzIDcxIDE1NCAxMTYgNSAxMjMgNTEgMTI0IDg4IDg1IDEzMyA0OSAyMDkgMjMzIDk3IDQ2IDI1NyA3NCA2NCA3MCAxMjEgCisyMyAyMDAgMTU1IDExMSAyOSA1OCA1NyAyMCAyNTIgMjA3IDUwIDI0MiA1OCAxNzAgMTQgMTk3IDE2OSA5NCA5OCA0MSAxMyAyMDIgNzAgCisyMzQgOTIgMTQ1IDExNyAxNTUgMTUzIDIzNCAyNDMgMjA4IDIwMCA0IDQ4IDIxIDEzNCAyMzcgNDAgOTMgMTc4IDIxMCAxNTMgMTk2IAorMTc0IDI2MyAyMzggMjI4IDExNyAzOCAyMyA0OSA5MiAyOCAxODAgMTYzIDc3IDU0IDIyMyA5OSAyMjkgMTEyIDYyIDE1MSAxMzAgMjU2IAorMTkyIDM0IDgwIDIgMTcxIDE2MCAxNiAxMTIgMjQgODIgMTg1IDI2IDE0OCAxMDMgOTcgMTU5IDI1MSAxOSAyMTkgMTE0IDI0NSA2IDExOCAKKzc1IDI1MiA5NCAyNDkgMTA0IDk2IDEyNiAxNTggMjE0IDI1MSAxNzQgMjI1IDE2OSA5MCAyMzAgMjYyIDkyIDY2IDE3NCAxMDggMzkgOTggCis3OSA4MiAxNDcgMzIgMTAgMjE2IDUzIDM1IDc1IDEwMSAzMSAxNjYgMTgwIDggNzEgMjY3IDE4NSAxNDMgODUgOTUgMjQ4IDcxIDMgNTMgCisxOTAgNiAxNTYgMTQ0IDEyMiA1NiAyNSAyMjggNzkgMjM3IDc4IDg3IDQ4IDE3MiAxOTcgNTIgMTU3IDE4MSAxNTggMTAxIDE4MiAzNiAKKzI2MyAxMjUgMTU5IDI0NyA3NiAxNzIgMTkzIDEwOSAxMTAgMjYwIDIyIDEyIDEzMSAxNzYgMjMgMTYyIDE2MSAxNjYgMTQyIDE0IDIwMSAKKzM3IDE0MSAxOSAxMDIgMTc3IDYwIDEyMyAyMDYgNTUgMTQzIDE5OCA4OSAxMTggMjI2IDQ3IDE3NyAxNzMgMTkyIDc2IDE3IDE4NyA1NCAKKzcyIDM2IDE0NiAxODggMjQyIDk2IDE2NCAyMjcgODQgMjEzIDIxOCA4MSAxNTIgMjAxIDE1MCAxMzUgMTU3IDY0IDIyMSAxODQgMTA2IAorMTI0IDI0MyA5MSAyNjMgODcgMTY1IDEwOSAxMTQgMTI4IDY5IDIwMSAxOTIgNzIgMTQ5IDIxNSAxMzMgMjA0IDE0MCAyMCAxMzUgMiAKKzEzMyA5MSAxNDYgMTUwIDI0OCAyMjYgOSAxODMgMjI4IDIzMCAzMiAxNjEgMTEgMTM2IDE1MiAxNjMgODEgMjY1IDIgMjAgOTcgOCAxODggCisyMDQgMTAyIDI2IDI2NSA0MCA4OSAyMzUgMTYzIDIzMiA2MCA4NSAxMzcgMTg1IDI1NiAxNTQgMjMzIDIxMCAxMTUgMTI3IDM2IDEwOCAKKzE5NCAxMDQgMjA5IDEyMCAxMDMgMTc2IDI3IDMwIDEzMyA4NyAxMCAxMDMgNTkgOTAgMTEzIDU3IDE3NSAyNTggNjkgODggMTk4IDIwMiAKKzE4NyAxNzEgOSAyMjEgMjkgMTAwIDI2MiAyMDUgMTM1IDExOSA3MCA4MyAyOSA2MiA2NyAxNzMgNzUgMTM5IDEwMCAxMTEgMTQyIDUyIDIgCisxNzUgMjggNjMgMzMgMTYwIDI0NiA0MyA3OSAxMjAgMTQxIDE3MCAxNjUgMjYwIDE3NyAyMTEgMTg2IDIxIDI0NyAzOCAxNzggNTUgMjIyIAorNjYgMTM2IDM5IDk0IDIxMSAzNSAyMjYgMTY0IDExNCA5MCAyNTYgMzcgMjggMjUgMjMyIDIxNSAxNiAyNjcgMjIzIDIxMiAzMCAyNTAgCisyNCAxOTUgMjU0IDIzOSAxMTAgMTQ3IDI4IDY3IDE2OSAxMzIgMTY3IDE3OSAyNDMgMjQ2IDE5NCAxNDIgMjAzIDY1IDI1OCAyMjAgMTUxIAorMTMgNTEgNyAxNTEgMTY4IDU3IDEzNyAxODkgMTI0IDEyNiAxNTQgNzggMjA0IDI1MyA4OSA4MCAyMzIgMTc3IDIyIDEyOSA2OCAxNjggCis5OSA3NCAxMDYgNyAzOCAxNzQgMTEyIDE3NSAxNDUgMjE4IDIzNiAxNTggNjMgMTg4IDkxIDMzIDgxIDM1IDI2NCAxNTggNTkgNTIgNDQgCisxMTIgMjAgMjE0IDEzOCAxMDUgMTIgMTQgNDYgMTA2IDExIDI0OSAxNDYgMzMgNDMgNDEgMTI2IDMgMTUgMTIxIDEzNiAxIDEwMCAyNjYgCis3MyAxODIgNDAgMTMxIDE3MiA4MCAxMTUgMjQwIDMwIDI0NiAxODYgXgorNTczIDAgMTQ2IDYzIDEwMSAyMTAgOTYgMTYyIDkxIDEyNyAxMzQgODQgMTY0IDYgMjUwIDEyMCAxNzEgMjI2IDE0MyAxNDkgMTQ1IDk2IAorMTk0IDE3IDYyIDEwMiAxOTAgMTU1IDE2MCAxOTUgMjM1IDggMTY1IDI0MyAxNTcgNDMgMjA1IDE2IDQ0IDEyMSAxMTkgMTcyIDIwNiAxNSAKKzE0NyAyNDkgMTIxIDY4IDk4IDU4IDY2IDI1MyAyNDAgNSAxMyAyMTMgMTY1IDUgODMgMjQ4IDE3MyAxMjIgMzUgNSA2NCAxNyA0MyAyMjQgCisyNDcgMjU3IDEwMiAxNzcgMyAxNjggMTI1IDE4NyAzNSA1NiAxMzggMTY1IDI2MiAxMTggMjU2IDEwMyAxNTcgNjIgODMgMjI5IDI1IAorMTc5IDEzNyAyMTcgNDYgNTUgMjAzIDEwMSAxOTEgMTM1IDMyIDE5MyA2OSAxMTYgMTIyIDU0IDIzNiA3IDI2OCAxMDEgMjQyIDIwOSA5NyAKKzE0MiAyMzMgMTI1IDIzOCAxMDkgMTIxIDg3IDU5IDEgMjM0IDQxIDI1OCA1MCAxMjMgMjUzIDIyMSAxMjcgMTUzIDQ1IDEwNyAxNzQgCisxMjEgMTM4IDEzMyA2NiAxODMgMjA1IDI2NyAxNjYgMTc4IDEzOCAxMTQgMTg4IDUzIDM3IDIwOSAxNDggMjE2IDI4IDc0IDEzMiAxMTggCisyMzcgMTQyIDIxNCAxNjQgMjUgMjExIDYzIDY5IDk3IDE2MSAxOTQgMjU1IDEzNiAyNTAgMTM5IDEzMiAxNjkgNDEgMjAgMTYzIDU4IDM0IAorNTcgMTE4IDM3IDE3NyAyMjIgOTQgNjAgMjM4IDE0MSA0NyAyMiAxMTAgMTA3IDIyNSAxOTUgMjAzIDgyIDQzIDE5MiA1MSA1MiA1MSA3MSAKKzEyIDE0IDE4MCA3MiAxOTggMTE3IDM4IDE1NyA5NCA5IDE2NCA3NiAxNSAxMjggMTAxIDI2MSAxNzAgNDAgNDAgMjEgMTQzIDIwMCAzMiAKKzE2MSAxNDMgMTgxIDcxIDMxIDI0NSAxMjMgNTMgMjU2IDEzNSAyNjcgMTM0IDY1IDE2IDYzIDgyIDYyIDE1MyAyNjQgMzMgMTA5IDg5IAorMjQ0IDEyNCAyMjAgMTI4IDUwIDEwNCAxMDUgOTEgMTQ2IDEyIDI3IDE0NSA2NCAyNjggODIgMTEgNzkgMTk5IDg0IDIxNSA4MCAxMjggCis2OSA2NSAyMzUgMjU5IDE3IDMwIDI1OSAyNTUgMTg3IDU0IDIwNCA4MSA2MyA1MCAxMzYgMjE4IDIxMyAxOTcgMTE4IDE4IDI5IDkgMTEzIAorMTg5IDIyMCAxNzkgMTI0IDI1MiA1NCAyNTUgMTU1IDEyOCA4MiAzMCAyMjcgNTkgMjUyIDMgOTggOTAgMTc5IDEwNSAyMSAxMTEgNCA5NyAKKzExMCAzNyAxOTAgMTg3IDg2IDEzMCAxNiAxMTQgMTU2IDEyNyAxMDIgMTU4IDQyIDIyNSAxNDQgMTI5IDE3IDExIDI4IDQyIDIwNiAyNjYgCisxODYgMTE5IDIyMyAxMCA4MCA5NiAxNDMgMTMwIDE4NCAxNTMgMjYgMTQ2IDQ0IDE0MCA4MCAxMTUgMTA0IDczIDE2NSAyNCA0NCAxOTEgCisxNTQgMTgwIDUzIDIzNyAxNzQgMTQwIDk5IDc2IDQ3IDU0IDIyMyA0MiA2IDMxIDE5NCAyMzYgMTc1IDM3IDE1OCAyNjEgMTUxIDc5IAorMTgwIDEyMyAyIDE4MiAyNTcgNTEgMTAzIDEyNSAyMTkgMjMxIDE3OCAxODkgMSAyNTMgMiAyMDEgMjE4IDI2NCAxIDE4MyAyMzcgMTkzIAorMTggMjI5IDI0NCAxMDUgNzIgMTg1IDE1MiA0NiA4NyA0NiAzNiAyNDIgMjQxIDIzIDc3IDE0IDE0OCAyMjkgMjYzIDY2IDIwMiAxNjYgCisyMTAgNjQgNDkgMTU2IDc2IDI4IDkzIDkzIDYxIDEzNSAxMyAyMzIgMTI2IDEzNSAyNTEgMzYgNCA4NCAxNDUgNDUgMTIwIDEzOSAxMTMgCisyMDggMTgxIDM5IDEwNSA0MCA3MiAyMTcgMjY1IDI1MSA1NSAxNTIgMjcgMTI2IDE4NiAxMzggMTg0IDIyMyA2MSAxNTQgMTYxIDE3NSAKKzEwNyA2IDI2OSA4MSAxMTQgMjA3IDIwMSAxNjcgMTA3IDIwNiAyMzQgNzMgMTg0IDE3MiAxNzQgODkgMjEyIDExIDk4IDc3IDIxNCAxMTMgCisyMjEgMTQ2IDMxIDE3NSA4OCA0NSAxMzkgMTAwIDI0MyAxODkgMjM5IDU3IDY3IDE1MCAxMTIgMyAxMTcgNTEgMTIyIDg2IDc5IDEyOSAKKzQ5IDIwNyAyMzMgOTMgNDIgMjU3IDcwIDY0IDY4IDExNyAxOSAxOTYgMTUxIDExMSAyMyA1OCA1MyAxOCAyNDggMjA1IDQ4IDI0MCA1NiAKKzE3MCA4IDE5NyAxNjkgOTIgOTQgNDEgNyAxOTggNjYgMjM0IDkyIDE0NSAxMTUgMTU1IDE0NyAyMzAgMjQzIDIwOCAyMDAgNDggMjEgCisxMzAgMjM1IDQwIDkxIDE3OCAyMDggMTQ5IDE5NiAxNzAgMjU5IDIzNiAyMjYgMTExIDM2IDIzIDQ1IDg4IDI2IDE3OCAxNTcgMjA3IF4KKzU2NiAxIDQyIDIxOSA5MSAyMjUgMTA4IDUwIDE1MSAxMzAgMjUyIDE4NCAzNCA3MiAyNjIgMTYzIDE1NiA0IDExMiAyMCA3NCAxNzcgMTQgCisxNDAgOTEgODUgMTU5IDI0MyAxOSAyMTEgMTEwIDIzNyAyIDExNCA2NyAyNDggODIgMjQxIDEwNCA4OCAxMjYgMTUwIDIxMCAyNDcgMTcwIAorMjI1IDE1NyA5MCAyMzAgMjYyIDgwIDU0IDE2MiAxMDQgMzkgODYgNzEgNzggMTQ3IDI4IDYgMjE2IDQxIDM1IDc1IDk3IDE5IDE1NCAKKzE3MiA1OSAyNjcgMTg1IDEzNSA3NyA5NSAyNDQgNzEgMjY3IDQ1IDE4NiAyNzAgMTQ0IDE0NCAxMTAgNDggMTMgMjI4IDc1IDIyOSA3MCAKKzc1IDQwIDE3MiAxODkgNDggMTUzIDE3NyAxNTQgODkgMTcwIDM2IDI1OSAxMTMgMTQ3IDI0MyA2OCAxNjAgMTg5IDk3IDEwMiAyNTYgMTQgCis4IDEzMSAxNjQgMTkgMTYyIDE2MSAxNTggMTQyIDE0IDE5NyAyOSAxNDEgMTEgOTAgMTczIDUyIDExNSAyMDIgNDMgMTMxIDE5OCA4MSAKKzEwNiAyMTggMzkgMTY5IDE3MyAxOTIgNjQgOSAxNzUgNTAgNjggMjggMTM4IDE3NiAyMzQgODQgMTU2IDIyNyA3MiAyMTMgMjE0IDc3IAorMTQ0IDE5MyAxNTAgMTI3IDE0NSA1NiAyMTcgMTc2IDEwMiAxMjQgMjM1IDg3IDI2MyA4MyAxNjEgMTA5IDEwMiAxMTYgNjUgMjAxIDE4MCAKKzY0IDE0OSAyMTUgMTI5IDIwMCAxMjggOCAxMjMgMjY2IDEzMyA3OSAxNDIgMTQ2IDI0OCAyMjIgOSAxODMgMjIwIDIyNiAyMCAxNTcgNyAKKzEyOCAxNDggMTYzIDczIDI2NSAyNzAgMTIgOTMgOCAxODAgMjA0IDk4IDIyIDI2MSAyOCA4OSAyMjcgMTU1IDIyNCA1NiA4NSAxMjUgCisxODEgMjU2IDE1NCAyMjkgMjEwIDExNSAxMTkgMzIgMTA4IDE5MCAxMDAgMjA5IDExMiAxMDMgMTc2IDE5IDIyIDEyMSA3OSAxMCA5NSAKKzU1IDgyIDEwOSA1MyAxNjcgMjU4IDY5IDgwIDE5NCAyMDIgMTgzIDE3MSA1IDIxMyAyNSA4OCAyNTggMjAxIDEzMSAxMTUgNzAgODMgMjkgCis1OCA2NyAxNjUgNzEgMTI3IDk2IDEwNyAxMzggNDQgMiAxNjMgMTYgNTUgMzMgMTYwIDI0NiAzNSA2NyAxMDggMTMzIDE2MiAxNTMgMjYwIAorMTY1IDIwMyAxNzggMTcgMjQ3IDM4IDE3NCA1NSAyMjIgNTggMTMyIDI3IDg2IDIxMSAyNyAyMjYgMTYwIDEwNiA4NiAyNjAgMjQ4IDMzIAorMjAgMjUgMjI4IDIwNyA4IDI2MyAyMTUgMjEyIDMwIDI0MiAxNiAxOTUgMjU0IDIzOSAxMDYgMTM1IDI4IDU1IDE2NSAxMjAgMTY3IDE3NSAKKzIzOSAyMzggMTg2IDEzMCAxOTUgNjUgMjUwIDIyMCAxNDMgOSA0MyAyNzEgMTQ3IDE2MCA1NyAxMzcgMTgxIDExNiAxMTQgMTUwIDc4IAorMTk2IDI0OSA4NSA3NiAyMzIgMTc3IDIyIDEyOSA2OCAxNjggODcgNzQgOTQgMyAyNiAxNzQgMTA0IDE3MSAxMzcgMjY0IDIxOCAyMjggCisxNTggNTkgMTg0IDgzIDIxIDY5IDIzIDI1NiAxNDYgNTkgNTIgMzIgMTAwIDIwIDIxNCAxMjYgOTMgMTAgNDYgMTA2IDMgMjQ5IDEzNCAKKzI1IDM5IDM3IDEyMiAyNzEgMTUgMTA5IDEzNiAyNjkgMTAwIDI1OCA2MSAxODIgMzYgMTE5IDE2NCA2OCAxMTEgMjQwIDE4IDI0MiAxNTYgCisxNDQgNjEgOTkgMjA2IDk2IDE1NiA4NyAxMjMgMTM0IDgyIDE1OCAyIDI0NiAxMTggMTY5IDIyMiAxNDEgMTQzIDE0MSA5NCAxOTIgMTUgCis2MCA5NiAxOTAgMTQ5IDE1OCAxOTEgMjM1IDQgMTYxIDI0MSAxNTMgMzcgMjA1IDEwIDM4IDExNyAxMTcgMTY2IDIwNiAxMyAxNDUgMjQ1IAorMTE1IDYyIDk0IDUyIDY2IDI1MyAyMzYgMjcxIDcgMjExIDE1OSA1IDgxIDI0NiAxNjcgMTE4IDI5IDEgNjIgMTEgNDEgMjI0IDI0NSAKKzI1NSAxMDIgMTczIDMgMTY2IDEyMyAxODMgMzEgNTYgMTM0IDE2NSAyNjAgMTE2IDI1NCA5OSAxNTcgNTYgNzcgMjI3IDIzIDE3MyAxMzUgCisyMTcgNDQgNTEgMjAzIDk1IDE4NyAxMzMgMzAgMTkzIDY3IDExNiAxMjIgNDggMjM2IDcgMjY4IDk3IDI0MiAyMDUgOTMgMTQwIDIzMSAKKzEyNSAyMzggMTAzIDExOSA4MSA1NyAyNjkgMjMyIDM3IDI1NCA1MCAxMTcgMjQ5IDIxNyAxMjcgMTUzIDQ1IDEwMyAxNjggMTIxIDEzNiAKKzEyOSA2MCAxNzkgMjAxIDI2MyAxNjYgMTcyIDEzMiAxMTAgMTg4IDUzIDM1IDIwNyAxNDggMjEyIDI2MiBeCis1ODkgMCA3MCAxMjggMTA2IDIzMyAxMzAgMjEwIDE2MCAxNyAyMDcgNjMgNTcgOTcgMTU3IDE5NCAyNDcgMTI4IDI1MCAxMzUgMTMyIAorMTY1IDI5IDE2IDE1NSA1MCAyNiA0OSAxMTggMzcgMTY1IDIxOCA5NCA2MCAyMzQgMTM3IDQ3IDE0IDExMCAxMDMgMjIxIDE5MSAxOTUgCis3MCA0MyAxODQgMzkgNDAgNDcgNTkgMTIgNiAxNzYgNjAgMTk0IDExNyAzMCAxNTMgOTAgMSAxNjQgNzYgMyAxMjQgMTAxIDI2MSAxNjYgCiszNiAyOCA5IDE0MyAxOTYgMzIgMTUzIDEzNSAxNzcgNjcgMzEgMjQ1IDEyMyA0OSAyNDggMTM1IDI2MiAyNjMgMTI2IDYxIDEyIDUxIDc4IAorNjIgMTQ5IDI2MCAyOSAxMDEgNzcgMjQ0IDExNiAyMTIgMTIwIDQyIDkyIDEwNSA5MSAxMzggMjcgMTQxIDUyIDI2MCA3NCAzIDc5IDE5OSAKKzg0IDIxMSA2OCAxMjggNjEgNTcgMjI3IDI1NSAxNyAxOCAyNTkgMjUxIDE4NyA0NiAxOTYgNzcgNTUgMzggMTMyIDIxMCAyMDUgMTkzIAorMTEwIDE4IDI1IDI3MSAxMDUgMTgxIDIxNiAxNzkgMTEyIDI1MiA1MCAyNTUgMTQ3IDExNiA4MiAyMiAyMTkgNDcgMjQ4IDI2NSA4NiA4NiAKKzE3MSA5MyAxMyAxMDMgMjY2IDkzIDk4IDI1IDE4NiAxODMgODYgMTI2IDE2IDExMCAxNDggMTIzIDk0IDE1MCAzOCAyMTcgMTMyIDEyNSAKKzkgMjczIDIwIDMwIDE5OCAyNjYgMTc4IDExOSAyMTkgMiA3MiA4OCAxMzEgMTE4IDE3MiAxNDUgMjYgMTM0IDQwIDEzMiA4MCAxMDcgOTYgCis2NSAxNjEgMjQgNDQgMTkxIDE1MCAxNjggNDEgMjI5IDE3MCAxNDAgOTkgNzIgNDMgNTQgMjE1IDQyIDIgMjcgMTg2IDIyOCAxNjMgMjkgCisxNDYgMjUzIDE0NyA3MSAxODAgMTE5IDI2NCAxNzggMjQ5IDQzIDk5IDExNyAyMTkgMjMxIDE3MCAxODUgMSAyNDkgMjcyIDE5NyAyMTQgCisyNjQgMjYzIDE3MSAyMzcgMTg5IDYgMjIxIDIzNiA5NyA3MiAxNzMgMTUyIDM4IDg3IDM0IDI4IDIzOCAyNDEgMTkgNzcgMTAgMTM2IAorMjI5IDI1NSA2MiAxOTQgMTYyIDIwNiA1NiA0NSAxNDQgNjQgMjQgODkgOTMgNTMgMTIzIDkgMjI4IDExOCAxMjcgMjQzIDI0IDQgNzIgCisxMzMgMzMgMTIwIDEyNyAxMTMgMjAwIDE4MSAyNyAxMDEgMzIgNjggMjEzIDI1NyAyNTEgNDMgMTQ0IDE5IDEyMiAxODYgMTM4IDE4NCAKKzIyMyA2MSAxNDIgMTQ5IDE3NSAxMDcgNiAyNjEgODEgMTE0IDIwNyAxOTMgMTU1IDk1IDIwMiAyMjYgNzMgMTgwIDE2NCAxNjYgODEgCisyMDQgMTEgOTggNjUgMjA2IDEwMSAyMjEgMTQ2IDE5IDE2NyA4OCA0MSAxMzkgOTIgMjM1IDE4OSAyMzUgNDUgNTkgMTQyIDEwNCAyNzMgCisxMDUgNTEgMTE4IDgyIDY3IDEyMSA0OSAyMDMgMjMzIDg1IDM0IDI1NyA2MiA2NCA2NCAxMDkgMTEgMTg4IDE0MyAxMTEgMTEgNTggNDUgCisxNCAyNDAgMjAxIDQ0IDIzNiA1MiAxNzAgMjcwIDE5NyAxNjkgODggODYgNDEgMjY5IDE5MCA1OCAyMzQgOTIgMTQ1IDExMSAxNTUgMTM1IAorMjIyIDI0MyAyMDggMjAwIDI2NiA0OCAyMSAxMjIgMjMxIDQwIDg3IDE3OCAyMDQgMTQxIDE5NiAxNjIgMjUxIDIzMiAyMjIgOTkgMzIgCisyMyAzNyA4MCAyMiAxNzQgMTQ1IDcxIDM2IDIxNyA4NyAyMjMgMTA2IDQ0IDE1MSAxMzAgMjUwIDE4MCAzNCA2OCAyNTggMTU5IDE1NCAKKzI3MiAxMTIgMTggNzAgMTczIDggMTM2IDg1IDc5IDE1OSAyMzkgMTkgMjA3IDEwOCAyMzMgMTEyIDYzIDI0NiA3NiAyMzcgMTA0IDg0IAorMTI2IDE0NiAyMDggMjQ1IDE2OCAyMjUgMTUxIDkwIDIzMCAyNjIgNzQgNDggMTU2IDEwMiAzOSA4MCA2NyA3NiAxNDcgMjYgNCAyMTYgCiszNSAzNSA3NSA5NSAxMyAxNDggMTY4IDI3MCA1MyAyNjcgMTg1IDEzMSA3MyA5NSAyNDIgNzEgMjY1IDQxIDE4NCAyNjggMTM4IDE0NCAKKzEwNCA0NCA3IDIyOCA3MyAyMjUgNjYgNjkgMzYgMTcyIDE4NSA0NiAxNTEgMTc1IDE1MiA4MyAxNjQgMzYgMjU3IDEwNyAxNDEgMjQxIAorNjQgMTU0IDE4NyA5MSA5OCAyNTQgMTAgNiAxMzEgMTU4IDE3IDE2MiAxNjEgMTU0IDE0MiAxNCAxOTUgMjUgMTQxIDcgODQgMTcxIDQ4IAorMTExIDIwMCAzNyAxMjUgMTk4IDc3IDEwMCAyMTQgMzUgMTY1IDE3MyAxOTIgNTggNSAxNjkgNDggNjYgMjQgMTM0IDE3MCAyMzAgNzggCisxNTIgMjI3IDY2IDIxMyAyMTIgNzUgMTQwIDE4OSAxNTAgMTIzIDEzOSA1MiAyMTUgMTcyIDEyNCBeCis1ODQgMCAxMjQgMjI3IDgzIDI2MyA3OSAxNTcgMTA5IDkwIDEwNCA2MSAyMDEgMTY4IDU2IDE0OSAyMTUgMTI1IDE5NiAxMTYgMjcyIAorMTExIDI2MiAxMzMgNjcgMTM4IDE0MiAyNDggMjE4IDkgMTgzIDIxMiAyMjIgOCAxNTMgMyAxMjAgMTQ0IDE2MyA2NSAyNjUgMjcwIDQgCis4OSA4IDE3MiAyMDQgOTQgMTggMjU3IDE2IDg5IDIxOSAxNDcgMjE2IDUyIDg1IDExMyAxNzcgMjU2IDE1NCAyMjUgMjEwIDExNSAxMTEgCisyOCAxMDggMTg2IDk2IDIwOSAxMDQgMTAzIDE3NiAxMSAxNCAxMDkgNzEgMTAgODcgNTEgNzQgMTA1IDQ5IDE1OSAyNTggNjkgNzIgMTkwIAorMjAyIDE3OSAxNzEgMSAyMDUgMjEgNzYgMjU0IDE5NyAxMjcgMTExIDcwIDgzIDI5IDU0IDY3IDE1NyA2NyAxMTUgOTIgMTAzIDEzNCAzNiAKKzIgMTUxIDQgNDcgMzMgMTYwIDI0NiAyNyA1NSA5NiAxMjUgMTU0IDE0MSAyNjAgMTUzIDE5NSAxNzAgMTMgMjQ3IDM4IDE3MCA1NSAyMjIgCis1MCAxMjggMTUgNzggMjExIDE5IDIyNiAxNTYgOTggODIgMjUyIDI0MCAyOSAxMiAyNSAyMjQgMTk5IDI1OSAyMDcgMjEyIDMwIDIzNCA4IAorMTk1IDI1NCAyMzkgMTAyIDEyMyAyOCA0MyAxNjEgMTA4IDE2NyAxNzEgMjM1IDIzMCAxNzggMTE4IDE4NyA2NSAyNDIgMjIwIDEzNSA1IAorMzUgMjY3IDE0MyAxNTIgNTcgMTM3IDE3MyAxMDggMTAyIDE0NiA3OCAxODggMjQ1IDgxIDcyIDIzMiAxNzcgMjIgMTI5IDY4IDE2OCA3NSAKKzc0IDgyIDI3NSAxNCAxNzQgOTYgMTY3IDEyOSAyNjAgMjE4IDIyMCAxNTggNTUgMTgwIDc1IDkgNTcgMTEgMjQ4IDEzNCA1OSA1MiAyMCAKKzg4IDIwIDIxNCAxMTQgODEgMjY0IDYgNDYgMTA2IDI3MSAyNDkgMTIyIDE3IDM1IDMzIDExOCAyNzEgMTUgOTcgMTM2IDI2OSAxMDAgCisyNTAgNDkgMTgyIDMyIDEwNyAxNTYgNTYgMTA3IDI0MCA2IDIzOCAxNTYgMTQwIDU3IDk1IDE5OCA5NiAxNDQgNzkgMTE1IDEzNCA3OCAKKzE0NiAyNzAgMjM4IDExNCAxNjUgMjE0IDEzNyAxMzEgMTMzIDkwIDE4OCAxMSA1NiA4NCAxOTAgMTM3IDE1NCAxODMgMjM1IDI3MiAxNTMgCisyMzcgMTQ1IDI1IDIwNSAyNzQgMjYgMTA5IDExMyAxNTQgMjA2IDkgMTQxIDIzNyAxMDMgNTAgODYgNDAgNjYgMjUzIDIyOCAyNjMgMjcxIAorMjA3IDE0NyA1IDc3IDI0MiAxNTUgMTEwIDE3IDI2OSA1OCAyNzUgMzcgMjI0IDI0MSAyNTEgMTAyIDE2NSAzIDE2MiAxMTkgMTc1IDIzIAorNTYgMTI2IDE2NSAyNTYgMTEyIDI1MCA5MSAxNTcgNDQgNjUgMjIzIDE5IDE2MSAxMzEgMjE3IDQwIDQzIDIwMyA4MyAxNzkgMTI5IDI2IAorMTkzIDYzIDExNiAxMjIgMzYgMjM2IDcgMjY4IDg5IDI0MiAxOTcgODUgMTM2IDIyNyAxMjUgMjM4IDkxIDExNSA2OSA1MyAyNjUgMjI4IAorMjkgMjQ2IDUwIDEwNSAyNDEgMjA5IDEyNyAxNTMgNDUgOTUgMTU2IDEyMSAxMzIgMTIxIDQ4IDE3MSAxOTMgMjU1IDE2NiAxNjAgMTIwIAorMTAyIDE4OCA1MyAzMSAyMDMgMTQ4IDIwNCAxMCA2OCAxMjYgMTAwIDIzMSAxMjQgMjA4IDE1OCAxMyAyMDUgNjMgNTEgOTcgMTU1IDE5NCAKKzI0MyAxMjQgMjUwIDEzMyAxMzIgMTYzIDIzIDE0IDE1MSA0NiAyMiA0NSAxMTggMzcgMTU5IDIxNiA5NCA2MCAyMzIgMTM1IDQ3IDEwIAorMTEwIDEwMSAyMTkgMTg5IDE5MSA2NCA0MyAxODAgMzMgMzQgNDUgNTMgMTIgMiAxNzQgNTQgMTkyIDExNyAyNiAxNTEgODggMjczIDE2NCAKKzc2IDI3MyAxMjIgMTAxIDI2MSAxNjQgMzQgMjIgMyAxNDMgMTk0IDMyIDE0OSAxMzEgMTc1IDY1IDMxIDI0NSAxMjMgNDcgMjQ0IDEzNSAKKzI1OCAyNjEgMTIyIDU5IDEwIDQ1IDc2IDYyIDE0NyAyNTggMjcgOTcgNzEgMjQ0IDExMiAyMDggMTE2IDM4IDg2IDEwNSA5MSAxMzQgCisyNzAgMjcgMTM5IDQ2IDI1NiA3MCAyNzUgNzkgMTk5IDg0IDIwOSA2MiAxMjggNTcgNTMgMjIzIDI1MyAxNyAxMiAyNTkgMjQ5IDE4NyAKKzQyIDE5MiA3NSA1MSAzMiAxMzAgMjA2IDIwMSAxOTEgMTA2IDE4IDIzIDI2NyAxMDEgMTc3IDIxNCAxNzkgMTA2IDI1MiA0OCAyNTUgCisxNDMgMTEwIDgyIDE4IDIxNSA0MSAyNDYgMjYxIDgwIDg0IDE2NyA4NyA5IDk5IDI2MiA5MSA5MiAxOSAxODQgMTgxIDg2IDEyNCAxNiAKKzEwOCAxNDQgMTIxIDkwIDE0NiAzNiAyMTMgMTI2IDEyMyA1IDI2OSAyMzAgXgorNTg3IDAgMTggMTkwIDI2NiAxNzAgMTE5IDIxNSAyNzIgNjQgODAgMTE5IDEwNiAxNjAgMTM3IDI2IDEyMiAzNiAxMjQgODAgOTkgODggCis1NyAxNTcgMjQgNDQgMTkxIDE0NiAxNTYgMjkgMjIxIDE2NiAxNDAgOTkgNjggMzkgNTQgMjA3IDQyIDI3NiAyMyAxNzggMjIwIDE1MSAKKzIxIDEzNCAyNDUgMTQzIDYzIDE4MCAxMTUgMjU2IDE3NCAyNDEgMzUgOTUgMTA5IDIxOSAyMzEgMTYyIDE4MSAxIDI0NSAyNzIgMTkzIAorMjEwIDI2NCAyNTUgMTU5IDIzNyAxODUgMjcyIDIxMyAyMjggODkgNzIgMTYxIDE1MiAzMCA4NyAyMiAyMCAyMzQgMjQxIDE1IDc3IDYgCisxMjQgMjI5IDI0NyA1OCAxODYgMTU4IDIwMiA0OCA0MSAxMzIgNTIgMjAgODUgOTMgNDUgMTExIDUgMjI0IDExMCAxMTkgMjM1IDEyIDQgCis2MCAxMjEgMjEgMTIwIDExNSAxMTMgMTkyIDE4MSAxNSA5NyAyNCA2NCAyMDkgMjQ5IDI1MSAzMSAxMzYgMTEgMTE4IDE4NiAxMzggMTg0IAorMjIzIDYxIDEzMCAxMzcgMTc1IDEwNyA2IDI1MyA4MSAxMTQgMjA3IDE4NSAxNDMgODMgMTk4IDIxOCA3MyAxNzYgMTU2IDE1OCA3MyAKKzE5NiAxMSA5OCA1MyAxOTggODkgMjIxIDE0NiA3IDE1OSA4OCAzNyAxMzkgODQgMjI3IDE4OSAyMzEgMzMgNTEgMTM0IDk2IDI3MyA5MyAKKzUxIDExNCA3OCA1NSAxMTMgNDkgMTk5IDIzMyA3NyAyNiAyNTcgNTQgNjQgNjAgMTAxIDMgMTgwIDEzNSAxMTEgMjc3IDU4IDM3IDEwIAorMjMyIDE5NyA0MCAyMzIgNDggMTcwIDI2MiAxOTcgMTY5IDg0IDc4IDQxIDI2MSAxODIgNTAgMjM0IDkyIDE0NSAxMDcgMTU1IDEyMyAKKzIxNCAyNDMgMjA4IDIwMCAyNjIgNDggMjEgMTE0IDIyNyA0MCA4MyAxNzggMjAwIDEzMyAxOTYgMTU0IDI0MyAyMjggMjE4IDg3IDI4IAorMjMgMjkgNzIgMTggMTcwIDEzMyA2NyAyNCAyMTMgNzkgMjE5IDEwMiAzMiAxNTEgMTMwIDI0NiAxNzIgMzQgNjAgMjUwIDE1MSAxNTAgCisyNjQgMTEyIDE0IDYyIDE2NSAyNzQgMTI4IDczIDY3IDE1OSAyMzEgMTkgMTk5IDEwNCAyMjUgMjc0IDEwOCA1NSAyNDIgNjQgMjI5IAorMTA0IDc2IDEyNiAxMzggMjA0IDI0MSAxNjQgMjI1IDEzOSA5MCAyMzAgMjYyIDYyIDM2IDE0NCA5OCAzOSA2OCA1OSA3MiAxNDcgMjIgCisyMTYgMjMgMzUgNzUgOTEgMSAxMzYgMTYwIDI2NiA0MSAyNjcgMTg1IDEyMyA2NSA5NSAyMzggNzEgMjYxIDMzIDE4MCAyNjQgMTI2IAorMTQ0IDkyIDM2IDI3MyAyMjggNjkgMjE3IDU4IDU3IDI4IDE3MiAxNzcgNDIgMTQ3IDE3MSAxNDggNzEgMTUyIDM2IDI1MyA5NSAxMjkgCisyMzcgNTYgMTQyIDE4MyA3OSA5MCAyNTAgMiAyIDEzMSAxNDYgMTMgMTYyIDE2MSAxNDYgMTQyIDE0IDE5MSAxNyAxNDEgMjc3IDcyIAorMTY3IDQwIDEwMyAxOTYgMjUgMTEzIDE5OCA2OSA4OCAyMDYgMjcgMTU3IDE3MyAxOTIgNDYgMjc1IDE1NyA0NCA2MiAxNiAxMjYgMTU4IAorMjIyIDY2IDE0NCAyMjcgNTQgMjEzIDIwOCA3MSAxMzIgMTgxIDE1MCAxMTUgMTI3IDQ0IDIxMSAxNjQgOTYgMTI0IDIyMyA4MSAyNjMgCis3NyAxNTUgMTA5IDg0IDk4IDU5IDIwMSAxNjIgNTIgMTQ5IDIxNSAxMjMgMTk0IDExMCAyNjggMTA1IDI2MCAxMzMgNjEgMTM2IDE0MCAKKzI0OCAyMTYgOSAxODMgMjA4IDIyMCAyIDE1MSAxIDExNiAxNDIgMTYzIDYxIDI2NSAyNzAgODcgOCAxNjggMjA0IDkyIDE2IDI1NSAxMCAKKzg5IDIxNSAxNDMgMjEyIDUwIDg1IDEwNyAxNzUgMjU2IDE1NCAyMjMgMjEwIDExNSAxMDcgMjYgMTA4IDE4NCA5NCAyMDkgMTAwIDEwMyAKKzE3NiA3IDEwIDEwMyA2NyAxMCA4MyA0OSA3MCAxMDMgNDcgMTU1IDI1OCA2OSA2OCAxODggMjAyIDE3NyAxNzEgMjc3IDIwMSAxOSA3MCAKKzI1MiAxOTUgMTI1IDEwOSA3MCA4MyAyOSA1MiA2NyAxNTMgNjUgMTA5IDkwIDEwMSAxMzIgMzIgMiAxNDUgMjc2IDQzIDMzIDE2MCAyNDYgCisyMyA0OSA5MCAxMjEgMTUwIDEzNSAyNjAgMTQ3IDE5MSAxNjYgMTEgMjQ3IDM4IDE2OCA1NSAyMjIgNDYgMTI2IDkgNzQgMjExIDE1IAorMjI2IDE1NCA5NCA4MCAyNDggMjM2IDI3IDggMjUgMjIyIDE5NSAyNzQgMjU3IDIwMyAyMTIgMzAgMjMwIDQgMTk1IDI1NCAyMzkgMTAwIAorMTE3IDI4IDM3IDE1OSAxMDIgMTY3IDE2OSAyMzMgMjI2IDE3NCAxMTIgMTgzIDY1IDIzOCAyMjAgMTMxIDMgMzEgMjcwIF4KKzYwOSAxIDE0MCAxNDYgNTcgMTM3IDE2NyAxMDIgOTMgMTQzIDc4IDE4MiAyNDIgNzggNjkgMjMyIDE3NyAyMiAxMjkgNjggMTY4IDY2IAorNzQgNzMgMjc1IDUgMTc0IDkwIDE2NCAxMjMgMjU3IDIxOCAyMTQgMTU4IDUyIDE3NyA2OSA0OCAyIDI0MiAxMjUgNTkgNTIgMTEgNzkgCisyMCAyMTQgMTA1IDcyIDI1OCAzIDQ2IDEwNiAyNjggMjQ5IDExMyAxMSAzMiAzMCAxMTUgMjcxIDE1IDg4IDEzNiAyNjkgMTAwIDI0NCAKKzQwIDE4MiAyOSA5OCAxNTAgNDcgMTA0IDI0MCAyNzYgMjM1IDE1NiAxMzcgNTQgOTIgMTkyIDk2IDEzNSA3MyAxMDkgMTM0IDc1IDEzNyAKKzI2NyAyMzIgMTExIDE2MiAyMDggMTM0IDEyMiAxMjcgODcgMTg1IDggNTMgNzUgMTkwIDEyOCAxNTEgMTc3IDIzNSAyNjkgMTQ3IDIzNCAKKzEzOSAxNiAyMDUgMjY4IDE3IDEwMyAxMTAgMTQ1IDIwNiA2IDEzOCAyMzEgOTQgNDEgODAgMzEgNjYgMjUzIDIyMiAyNTcgMjY1IDIwNCAKKzEzOCA1IDc0IDIzOSAxNDYgMTA0IDggMjY2IDU1IDI2OSAzNCAyMjQgMjM4IDI0OCAxMDIgMTU5IDMgMTU5IDExNiAxNjkgMTcgNTYgCisxMjAgMTY1IDI1MyAxMDkgMjQ3IDg1IDE1NyAzNSA1NiAyMjAgMTYgMTUyIDEyOCAyMTcgMzcgMzcgMjAzIDc0IDE3MyAxMjYgMjMgMTkzIAorNjAgMTE2IDEyMiAyNyAyMzYgNyAyNjggODMgMjQyIDE5MSA3OSAxMzMgMjI0IDEyNSAyMzggODIgMTEyIDYwIDUwIDI2MiAyMjUgMjMgCisyNDAgNTAgOTYgMjM1IDIwMyAxMjcgMTUzIDQ1IDg5IDE0NyAxMjEgMTI5IDExNSAzOSAxNjUgMTg3IDI0OSAxNjYgMTUxIDExMSA5NiAKKzE4OCA1MyAyOCAyMDAgMTQ4IDE5OCAxIDY1IDEyMyA5MSAyMjggMTE1IDIwNSAxNTUgNyAyMDIgNjMgNDIgOTcgMTUyIDE5NCAyMzcgCisxMTggMjUwIDEzMCAxMzIgMTYwIDE0IDExIDE0NSA0MCAxNiAzOSAxMTggMzcgMTUwIDIxMyA5NCA2MCAyMjkgMTMyIDQ3IDQgMTEwIDk4IAorMjE2IDE4NiAxODUgNTUgNDMgMTc0IDI0IDI1IDQyIDQ0IDEyIDI3NSAxNzEgNDUgMTg5IDExNyAyMCAxNDggODUgMjcwIDE2NCA3NiAKKzI2NyAxMTkgMTAxIDI2MSAxNjEgMzEgMTMgMjczIDE0MyAxOTEgMzIgMTQzIDEyNSAxNzIgNjIgMzEgMjQ1IDEyMyA0NCAyMzggMTM1IAorMjUyIDI1OCAxMTYgNTYgNyAzNiA3MyA2MiAxNDQgMjU1IDI0IDkxIDYyIDI0NCAxMDYgMjAyIDExMCAzMiA3NyAxMDUgOTEgMTI4IDI2NCAKKzI3IDEzNiAzNyAyNTAgNjQgMjcyIDc5IDE5OSA4NCAyMDYgNTMgMTI4IDUxIDQ3IDIxNyAyNTAgMTcgMyAyNTkgMjQ2IDE4NyAzNiAxODYgCis3MiA0NSAyMyAxMjcgMjAwIDE5NSAxODggMTAwIDE4IDIwIDI2MSA5NSAxNzEgMjExIDE3OSA5NyAyNTIgNDUgMjU1IDEzNyAxMDEgODIgCisxMiAyMDkgMzIgMjQzIDI1NSA3MSA4MSAxNjEgNzggMyA5MyAyNTYgODggODMgMTAgMTgxIDE3OCA4NiAxMjEgMTYgMTA1IDEzOCAxMTggCis4NCAxNDAgMzMgMjA3IDExNyAxMjAgMjc4IDI2MyAxMCAxNSAxODggMjY2IDE2OCAxMTkgMjE0IDI3MSA2MiA3OCAxMTYgMTAzIDE1NyAKKzEzNSAyNiAxMTkgMzUgMTIyIDgwIDk3IDg2IDU1IDE1NiAyNCA0NCAxOTEgMTQ1IDE1MyAyNiAyMTkgMTY1IDE0MCA5OSA2NyAzOCA1NCAKKzIwNSA0MiAyNzYgMjIgMTc2IDIxOCAxNDggMTkgMTMxIDI0MyAxNDIgNjEgMTgwIDExNCAyNTQgMTczIDIzOSAzMyA5NCAxMDcgMjE5IAorMjMxIDE2MCAxODAgMSAyNDQgMjcyIDE5MiAyMDkgMjY0IDI1MyAxNTYgMjM3IDE4NCAyNzAgMjExIDIyNiA4NyA3MiAxNTggMTUyIDI4IAorODcgMTkgMTggMjMzIDI0MSAxNCA3NyA1IDEyMSAyMjkgMjQ1IDU3IDE4NCAxNTcgMjAxIDQ2IDQwIDEyOSA0OSAxOSA4NCA5MyA0MyAKKzEwOCA0IDIyMyAxMDggMTE3IDIzMyA5IDQgNTcgMTE4IDE4IDEyMCAxMTIgMTEzIDE5MCAxODEgMTIgOTYgMjIgNjMgMjA4IDI0NyAyNTEgCisyOCAxMzQgOSAxMTcgMTg2IDEzOCAxODQgMjIzIDYxIDEyNyAxMzQgMTc1IDEwNyA2IDI1MSA4MSAxMTQgMjA3IDE4MyAxNDAgODAgMTk3IAorMjE2IDczIDE3NSAxNTQgMTU2IDcxIDE5NCAxMSA5OCA1MCAxOTYgODYgMjIxIDE0NiA0IDE1NyA4OCAzNiAxMzkgODIgMjI1IDE4OSAKKzIzMCAzMCA0OSAxMzIgOTQgMjczIDkwIDUxIDExMyA3NyA1MiAxMTEgNDkgMTk4IDIzMyA3NSAyNCAyNTcgNTIgNjQgNTkgOTkgMSAxNzggCisxMzMgMTExIDI3NSA1OCAzNSA5IDIzMCAxOTYgMzkgMjMxIDQ3IDE3MCAyMTYgXgorNTg5IDAgMTk3IDE2OSA4MSA3MiA0MSAyNTUgMTc2IDQ0IDIzNCA5MiAxNDUgMTA0IDE1NSAxMTQgMjA4IDI0MyAyMDggMjAwIDI1OSA0OCAKKzIxIDEwOCAyMjQgNDAgODAgMTc4IDE5NyAxMjcgMTk2IDE0OCAyMzcgMjI1IDIxNSA3OCAyNSAyMyAyMyA2NiAxNSAxNjcgMTI0IDY0IAorMTUgMjEwIDczIDIxNiA5OSAyMyAxNTEgMTMwIDI0MyAxNjYgMzQgNTQgMjQ0IDE0NSAxNDcgMjU4IDExMiAxMSA1NiAxNTkgMjY4IDEyMiAKKzY0IDU4IDE1OSAyMjUgMTkgMTkzIDEwMSAyMTkgMjc0IDEwNSA0OSAyMzkgNTUgMjIzIDEwNCA3MCAxMjYgMTMyIDIwMSAyMzggMTYxIAorMjI1IDEzMCA5MCAyMzAgMjYyIDUzIDI3IDEzNSA5NSAzOSA1OSA1MyA2OSAxNDcgMTkgMjc4IDIxNiAxNCAzNSA3NSA4OCAyNzMgMTI3IAorMTU0IDI2MyAzMiAyNjcgMTg1IDExNyA1OSA5NSAyMzUgNzEgMjU4IDI3IDE3NyAyNjEgMTE3IDE0NCA4MyAzMCAyNjcgMjI4IDY2IDIxMSAKKzUyIDQ4IDIyIDE3MiAxNzEgMzkgMTQ0IDE2OCAxNDUgNjIgMTQzIDM2IDI1MCA4NiAxMjAgMjM0IDUwIDEzMyAxODAgNzAgODQgMjQ3IAorMjc3IDI4MCAxMzEgMTM3IDEwIDE2MiAxNjEgMTQwIDE0MiAxNCAxODggMTEgMTQxIDI3NCA2MyAxNjQgMzQgOTcgMTkzIDE2IDEwNCAKKzE5OCA2MyA3OSAyMDAgMjEgMTUxIDE3MyAxOTIgMzcgMjcyIDE0OCA0MSA1OSAxMCAxMjAgMTQ5IDIxNiA1NyAxMzggMjI3IDQ1IDIxMyAKKzIwNSA2OCAxMjYgMTc1IDE1MCAxMDkgMTE4IDM4IDIwOCAxNTggOTMgMTI0IDIxNyA3OCAyNjMgNzQgMTUyIDEwOSA3NSA4OSA1NiAyMDEgCisxNTMgNDYgMTQ5IDIxNSAxMjAgMTkxIDEwMSAyNjIgOTYgMjU3IDEzMyA1MiAxMzMgMTM3IDI0OCAyMTMgOSAxODMgMjAyIDIxNyAyNzQgCisxNDggMjc5IDExMCAxMzkgMTYzIDU1IDI2NSAyNzAgMjc1IDg0IDggMTYyIDIwNCA4OSAxMyAyNTIgMSA4OSAyMDkgMTM3IDIwNiA0NyAKKzg1IDk4IDE3MiAyNTYgMTU0IDIyMCAyMTAgMTE1IDEwMSAyMyAxMDggMTgxIDkxIDIwOSA5NCAxMDMgMTc2IDEgNCA5NCA2MSAxMCA3NyAKKzQ2IDY0IDEwMCA0NCAxNDkgMjU4IDY5IDYyIDE4NSAyMDIgMTc0IDE3MSAyNzcgMTk1IDE2IDYxIDI0OSAxOTIgMTIyIDEwNiA3MCA4MyAKKzI5IDQ5IDY3IDE0NyA2MiAxMDAgODcgOTggMTI5IDI2IDIgMTM2IDI3MCAzNyAzMyAxNjAgMjQ2IDE3IDQwIDgxIDExNSAxNDQgMTI2IAorMjYwIDEzOCAxODUgMTYwIDggMjQ3IDM4IDE2NSA1NSAyMjIgNDAgMTIzIDY4IDIxMSA5IDIyNiAxNTEgODggNzcgMjQyIDIzMCAyNCAyIAorMjUgMjE5IDE4OSAyNzEgMjU0IDE5NyAyMTIgMzAgMjI0IDI3OSAxOTUgMjU0IDIzOSA5NyAxMDggMjggMjggMTU2IDkzIDE2NyAxNjYgCisyMzAgMjIwIDE2OCAxMDMgMTc3IDY1IDIzMiAyMjAgMTI1IDI1IDI2MiAxMzggMTQyIDU3IDEzNyAxNjMgOTggODcgMTQxIDc4IDE3OCAKKzI0MCA3NiA2NyAyMzIgMTc3IDIyIDEyOSA2OCAxNjggNjAgNzQgNjcgMjc1IDI4MCAxNzQgODYgMTYyIDExOSAyNTUgMjE4IDIxMCAxNTggCis1MCAxNzUgNjUgMjc1IDQyIDI3NyAyMzggMTE5IDU5IDUyIDUgNzMgMjAgMjE0IDk5IDY2IDI1NCAxIDQ2IDEwNiAyNjYgMjQ5IDEwNyA3IAorMzAgMjggMTEzIDI3MSAxNSA4MiAxMzYgMjY5IDEwMCAyNDAgMzQgMTgyIDI3IDkyIDE0NiA0MSAxMDIgMjQwIDI3MiAyMzMgMTU2IDEzNSAKKzUyIDkwIDE4OCA5NiAxMjkgNjkgMTA1IDEzNCA3MyAxMzEgMjY1IDIyOCAxMDkgMTYwIDIwNCAxMzIgMTE2IDEyMyA4NSAxODMgNiA1MSAKKzY5IDE5MCAxMjIgMTQ5IDE3MyAyMzUgMjY3IDE0MyAyMzIgMTM1IDEwIDIwNSAyNjQgMTEgOTkgMTA4IDEzOSAyMDYgNCAxMzYgMjI3IAorODggMzUgNzYgMjUgNjYgMjUzIDIxOCAyNTMgMjYxIDIwMiAxMzIgNSA3MiAyMzcgMTQwIDEwMCAyIDI2NCA1MyAyNjUgMzIgMjI0IDIzNiAKKzI0NiAxMDIgMTU1IDMgMTU3IDExNCAxNjUgMTMgNTYgMTE2IDE2NSAyNTEgMTA3IDI0NSA4MSAxNTcgMjkgNTAgMjE4IDE0IDE0NiAxMjYgCisyMTcgMzUgMzMgMjAzIDY4IDE2OSAxMjQgMjEgMTkzIDU4IDExNiAxMjIgMjEgMjM2IDcgMjY4IDc5IDI0MiAxODcgNzUgMTMxIDIyMiAKKzEyNSAyMzggNzYgMTEwIDU0IDQ4IDI2MCAyMjMgMTkgMjM2IDUwIDkwIDIzMSAxOTkgMTI3IDE1MyA0NSAyNzAgXgorNjIzIDEgMTM1IDEyMSAxMjUgMTA3IDI3IDE1NyAxNzkgMjQxIDE2NiAxMzkgOTkgODggMTg4IDUzIDI0IDE5NiAxNDggMTkwIDI3MiA2MSAKKzExOSA3OSAyMjQgMTAzIDIwMSAxNTEgMjgyIDE5OCA2MyAzMCA5NyAxNDggMTk0IDIyOSAxMTAgMjUwIDEyNiAxMzIgMTU2IDIgNyAxMzcgCiszMiA4IDMxIDExOCAzNyAxMzggMjA5IDk0IDYwIDIyNSAxMjggNDcgMjc5IDExMCA5NCAyMTIgMTgyIDE3NyA0MyA0MyAxNjYgMTIgMTMgCiszOCAzMiAxMiAyNzEgMTY3IDMzIDE4NSAxMTcgMTIgMTQ0IDgxIDI2NiAxNjQgNzYgMjU5IDExNSAxMDEgMjYxIDE1NyAyNyAxIDI2NSAKKzE0MyAxODcgMzIgMTM1IDExNyAxNjggNTggMzEgMjQ1IDEyMyA0MCAyMzAgMTM1IDI0NCAyNTQgMTA4IDUyIDMgMjQgNjkgNjIgMTQwIAorMjUxIDIwIDgzIDUwIDI0NCA5OCAxOTQgMTAyIDI0IDY1IDEwNSA5MSAxMjAgMjU2IDI3IDEzMiAyNSAyNDIgNTYgMjY4IDc5IDE5OSA4NCAKKzIwMiA0MSAxMjggNDMgMzkgMjA5IDI0NiAxNyAyNzQgMjU5IDI0MiAxODcgMjggMTc4IDY4IDM3IDExIDEyMyAxOTIgMTg3IDE4NCA5MiAKKzE4IDE2IDI1MyA4NyAxNjMgMjA3IDE3OSA4NSAyNTIgNDEgMjU1IDEyOSA4OSA4MiA0IDIwMSAyMCAyMzkgMjQ3IDU5IDc3IDE1MyA2NiAKKzI3OCA4NSAyNDggODQgNzEgMjgxIDE3NyAxNzQgODYgMTE3IDE2IDEwMSAxMzAgMTE0IDc2IDEzMiAyOSAxOTkgMTA1IDExNiAyNzQgCisyNTUgMiAzIDE4MCAyNjYgMTYwIDExOSAyMTAgMjY3IDU0IDcwIDEwNCA5MSAxNDUgMTI3IDI2IDEwNyAzMSAxMTQgODAgODkgNzggNDcgCisxNTIgMjQgNDQgMTkxIDE0MSAxNDEgMTQgMjExIDE2MSAxNDAgOTkgNjMgMzQgNTQgMTk3IDQyIDI3NiAxOCAxNjggMjEwIDEzNiAxMSAKKzExOSAyMzUgMTM4IDUzIDE4MCAxMTAgMjQ2IDE2OSAyMzEgMjUgOTAgOTkgMjE5IDIzMSAxNTIgMTc2IDEgMjQwIDI3MiAxODggMjA1IAorMjY0IDI0NSAxNDQgMjM3IDE4MCAyNjIgMjAzIDIxOCA3OSA3MiAxNDYgMTUyIDIwIDg3IDcgMTAgMjI5IDI0MSAxMCA3NyAxIDEwOSAKKzIyOSAyMzcgNTMgMTc2IDE1MyAxOTcgMzggMzYgMTE3IDM3IDE1IDgwIDkzIDM1IDk2IDIxOSAxMDAgMTA5IDIyNSAyODAgNCA0NSAxMDYgCis2IDEyMCAxMDAgMTEzIDE4MiAxODEgOTIgMTQgNTkgMjA0IDIzOSAyNTEgMTYgMTI2IDEgMTEzIDE4NiAxMzggMTg0IDIyMyA2MSAxMTUgCisxMjIgMTc1IDEwNyA2IDI0MyA4MSAxMTQgMjA3IDE3NSAxMjggNjggMTkzIDIwOCA3MyAxNzEgMTQ2IDE0OCA2MyAxODYgMTEgOTggMzggCisxODggNzQgMjIxIDE0NiAyNzUgMTQ5IDg4IDMyIDEzOSA3NCAyMTcgMTg5IDIyNiAxOCA0MSAxMjQgODYgMjczIDc4IDUxIDEwOSA3MyAKKzQwIDEwMyA0OSAxOTQgMjMzIDY3IDE2IDI1NyA0NCA2NCA1NSA5MSAyNzYgMTcwIDEyNSAxMTEgMjY3IDU4IDI3IDUgMjIyIDE5MiAzNSAKKzIyNyA0MyAxNzAgMjUyIDE5NyAxNjkgNzkgNjggNDEgMjUxIDE3MiA0MCAyMzQgOTIgMTQ1IDEwMiAxNTUgMTA4IDIwNCAyNDMgMjA4IAorMjAwIDI1NyA0OCAyMSAxMDQgMjIyIDQwIDc4IDE3OCAxOTUgMTIzIDE5NiAxNDQgMjMzIDIyMyAyMTMgNzIgMjMgMjMgMTkgNjIgMTMgCisxNjUgMTE4IDYyIDkgMjA4IDY5IDIxNCA5NyAxNyAxNTEgMTMwIDI0MSAxNjIgMzQgNTAgMjQwIDE0MSAxNDUgMjU0IDExMiA5IDUyIAorMTU1IDI2NCAxMTggNTggNTIgMTU5IDIyMSAxOSAxODkgOTkgMjE1IDI3NCAxMDMgNDUgMjM3IDQ5IDIxOSAxMDQgNjYgMTI2IDEyOCAKKzE5OSAyMzYgMTU5IDIyNSAxMjQgOTAgMjMwIDI2MiA0NyAyMSAxMjkgOTMgMzkgNTMgNDkgNjcgMTQ3IDE3IDI3OCAyMTYgOCAzNSA3NSAKKzg2IDI2OSAxMjEgMTUwIDI2MSAyNiAyNjcgMTg1IDExMyA1NSA5NSAyMzMgNzEgMjU2IDIzIDE3NSAyNTkgMTExIDE0NCA3NyAyNiAyNjMgCisyMjggNjQgMjA3IDQ4IDQyIDE4IDE3MiAxNjcgMzcgMTQyIDE2NiAxNDMgNTYgMTM3IDM2IDI0OCA4MCAxMTQgMjMyIDQ2IDEyNyAxNzggCis2NCA4MCAyNDUgMjc1IDI4MCAxMzEgMTMxIDggMTYyIDE2MSAxMzYgMTQyIDE0IDE4NiA3IDE0MSAyNzIgNTcgMTYyIDMwIDkzIDE5MSAKKzEwIDk4IDE5OCA1OSA3MyAxOTYgMTcgMTQ3IDE3MyAxOTIgMzEgMjcwIDE0MiAzOSA1NyA2IDExNiAxNDMgMjEyIDUxIDEzNCAyMjcgMzkgCisyMTMgMjAzIDY2IDEyMiAxNzEgMTUwIDEwNSAxMTIgMzQgMjA2IDE1NCA5MSAxMjQgMjEzIDc2IDI2MyA3MiAxNTAgMTA5IDY5IDgzIDU0IAorMjAxIDE0NyA0MiAxNDkgMjAyIF4KKzYwMiAxIDExNiAxODcgODkgMjU0IDg0IDI1MyAxMzMgNDAgMTI5IDEzMyAyNDggMjA5IDkgMTgzIDE5NCAyMTMgMjY2IDE0NCAyNzkgCisxMDIgMTM1IDE2MyA0NyAyNjUgMjcwIDI3MSA4MCA4IDE1NCAyMDQgODUgOSAyNDggMjc0IDg5IDIwMSAxMjkgMTk4IDQzIDg1IDg2IAorMTY4IDI1NiAxNTQgMjE2IDIxMCAxMTUgOTMgMTkgMTA4IDE3NyA4NyAyMDkgODYgMTAzIDE3NiAyNzggMjgxIDgyIDUzIDEwIDY5IDQyIAorNTYgOTYgNDAgMTQxIDI1OCA2OSA1NCAxODEgMjAyIDE3MCAxNzEgMjc3IDE4NyAxMiA0OSAyNDUgMTg4IDExOCAxMDIgNzAgODMgMjkgCis0NSA2NyAxMzkgNTggODggODMgOTQgMTI1IDE4IDIgMTI0IDI2MiAyOSAzMyAxNjAgMjQ2IDkgMjggNjkgMTA3IDEzNiAxMTQgMjYwIAorMTI2IDE3NyAxNTIgNCAyNDcgMzggMTYxIDU1IDIyMiAzMiAxMTkgMjczIDYwIDIxMSAxIDIyNiAxNDcgODAgNzMgMjM0IDIyMiAyMCAKKzI3OSAyNSAyMTUgMTgxIDI2NyAyNTAgMTg5IDIxMiAzMCAyMTYgMjc1IDE5NSAyNTQgMjM5IDkzIDk2IDI4IDE2IDE1MiA4MSAxNjcgCisxNjIgMjI2IDIxMiAxNjAgOTEgMTY5IDY1IDIyNCAyMjAgMTE3IDI4MSAxNyAyNTggMTM0IDEzNCA1NyAxMzcgMTU1IDkwIDc1IDEzNyAKKzc4IDE3MCAyMzYgNzIgNjMgMjMyIDE3NyAyMiAxMjkgNjggMTY4IDQ4IDc0IDU1IDI3NSAyNzIgMTc0IDc4IDE1OCAxMTEgMjUxIDIxOCAKKzIwMiAxNTggNDYgMTcxIDU3IDI2NyAzMCAyNjkgMjMwIDEwNyA1OSA1MiAyNzggNjEgMjAgMjE0IDg3IDU0IDI0NiAyODIgNDYgMTA2IAorMjYyIDI0OSA5NSAyODQgMjYgMjQgMTA5IDI3MSAxNSA3MCAxMzYgMjY5IDEwMCAyMzIgMjIgMTgyIDIzIDgwIDEzOCAyOSA5OCAyNDAgCisyNjQgMjI5IDE1NiAxMzEgNDggODYgMTgwIDk2IDExNyA2MSA5NyAxMzQgNjkgMTE5IDI2MSAyMjAgMTA1IDE1NiAxOTYgMTI4IDEwNCAKKzExNSA4MSAxNzkgMiA0NyA1NyAxOTAgMTEwIDE0NSAxNjUgMjM1IDI2MyAxMzUgMjI4IDEyNyAyODMgMjA1IDI1NiAyODQgOTEgMTA0IAorMTI3IDIwNiAxMzIgMjE5IDc2IDIzIDY4IDEzIDY2IDI1MyAyMTAgMjQ1IDI1MyAxOTggMTIwIDUgNjggMjMzIDEyOCA5MiAyNzUgMjYwIAorNDkgMjU3IDI4IDIyNCAyMzIgMjQyIDEwMiAxNDcgMyAxNTMgMTEwIDE1NyA1IDU2IDEwOCAxNjUgMjQ3IDEwMyAyNDEgNzMgMTU3IDE3IAorMzggMjE0IDEwIDEzNCAxMjIgMjE3IDMxIDI1IDIwMyA1NiAxNjEgMTIwIDE3IDE5MyA1NCAxMTYgMTIyIDkgMjM2IDcgMjY4IDcxIDI0MiAKKzE3OSA2NyAxMjcgMjE4IDEyNSAyMzggNjQgMTA2IDQyIDQ0IDI1NiAyMTkgMTEgMjI4IDUwIDc4IDIyMyAxOTEgMTI3IDE1MyA0NSA3NyAKKzEyOSAxMjEgMTIzIDEwMyAyMSAxNTMgMTc1IDIzNyAxNjYgMTMzIDkzIDg0IDE4OCA1MyAyMiAxOTQgMTQ4IDE4NiAyNjggNTkgMTE3IAorNzMgMjIyIDk3IDE5OSAxNDkgMjgwIDE5NiA2MyAyNCA5NyAxNDYgMTk0IDIyNSAxMDYgMjUwIDEyNCAxMzIgMTU0IDI4MSA1IDEzMyAyOCAKKzQgMjcgMTE4IDM3IDEzMiAyMDcgOTQgNjAgMjIzIDEyNiA0NyAyNzcgMTEwIDkyIDIxMCAxODAgMTczIDM3IDQzIDE2MiA2IDcgMzYgMjYgCisxMiAyNjkgMTY1IDI3IDE4MyAxMTcgOCAxNDIgNzkgMjY0IDE2NCA3NiAyNTUgMTEzIDEwMSAyNjEgMTU1IDI1IDI4MCAyNjEgMTQzIAorMTg1IDMyIDEzMSAxMTMgMTY2IDU2IDMxIDI0NSAxMjMgMzggMjI2IDEzNSAyNDAgMjUyIDEwNCA1MCAxIDE4IDY3IDYyIDEzOCAyNDkgCisxOCA3OSA0NCAyNDQgOTQgMTkwIDk4IDIwIDU5IDEwNSA5MSAxMTYgMjUyIDI3IDEzMCAxOSAyMzggNTIgMjY2IDc5IDE5OSA4NCAyMDAgCiszNSAxMjggMzkgMzUgMjA1IDI0NCAxNyAyNzAgMjU5IDI0MCAxODcgMjQgMTc0IDY2IDMzIDUgMTIxIDE4OCAxODMgMTgyIDg4IDE4IDE0IAorMjQ5IDgzIDE1OSAyMDUgMTc5IDc5IDI1MiAzOSAyNTUgMTI1IDgzIDgyIDE5NyAxNCAyMzcgMjQzIDUzIDc1IDE0OSA2MCAyNzYgODEgCisyNDQgODIgNjUgMjc3IDE3NSAxNzIgODYgMTE1IDE2IDk5IDEyNiAxMTIgNzIgMTI4IDI3IDE5NSA5OSAxMTQgMjcyIDI1MSAyODMgMjgyIAorMTc2IDI2NiAxNTYgMTE5IDIwOCAyNjUgNTAgNjYgOTggODUgMTM5IDEyMyAyNiAxMDEgMjkgMTEwIDgwIDg1IDc0IDQzIDE1MCAyNCA0NCAKKzE5MSAxMzkgMTM1IDggMjA3IDE1OSAxNDAgOTkgNjEgMjQ4IF4KKzYwOSAxIDU0IDE4OSA0MiAyNzYgMTQgMTYwIDIwMiAxMjQgMyAxMDcgMjI3IDEzNCA0NSAxODAgMTA2IDIzOCAxNjUgMjIzIDE3IDg2IAorOTEgMjE5IDIzMSAxNDQgMTcyIDEgMjM2IDI3MiAxODQgMjAxIDI2NCAyMzcgMTMyIDIzNyAxNzYgMjU0IDE5NSAyMTAgNzEgNzIgMTM0IAorMTUyIDEyIDg3IDI4MiAyIDIyNSAyNDEgNiA3NyAyODQgOTcgMjI5IDIyOSA0OSAxNjggMTQ5IDE5MyAzMCAzMiAxMDUgMjUgMTEgNzYgCis5MyAyNyA4NCAyODMgMjE1IDkyIDEwMSAyMTcgMjcyIDQgMzMgOTQgMjgxIDEyMCA4OCAxMTMgMTc0IDE4MSAyNzUgODggNiA1NSAyMDAgCisyMzEgMjUxIDQgMTE4IDI4MCAxMDkgMTg2IDEzOCAxODQgMjIzIDYxIDEwMyAxMTAgMTc1IDEwNyA2IDIzNSA4MSAxMTQgMjA3IDE2NyAKKzExNiA1NiAxODkgMjAwIDczIDE2NyAxMzggMTQwIDU1IDE3OCAxMSA5OCAyNiAxODAgNjIgMjIxIDE0NiAyNjcgMTQxIDg4IDI4IDEzOSAKKzY2IDIwOSAxODkgMjIyIDYgMzMgMTE2IDc4IDI3MyA2NiA1MSAxMDUgNjkgMjggOTUgNDkgMTkwIDIzMyA1OSA4IDI1NyAzNiA2NCA1MSAKKzgzIDI3MiAxNjIgMTE3IDExMSAyNTkgNTggMTkgMSAyMTQgMTg4IDMxIDIyMyAzOSAxNzAgMjQ0IDE5NyAxNjkgNzUgNjAgNDEgMjQzIAorMTY0IDMyIDIzNCA5MiAxNDUgOTggMTU1IDk2IDE5NiAyNDMgMjA4IDIwMCAyNTMgNDggMjEgOTYgMjE4IDQwIDc0IDE3OCAxOTEgMTE1IAorMTk2IDEzNiAyMjUgMjE5IDIwOSA2MCAxOSAyMyAxMSA1NCA5IDE2MSAxMDYgNTggMjg0IDIwNCA2MSAyMTAgOTMgNSAxNTEgMTMwIDIzNyAKKzE1NCAzNCA0MiAyMzIgMTMzIDE0MSAyNDYgMTEyIDUgNDQgMTQ3IDI1NiAxMTAgNDYgNDAgMTU5IDIxMyAxOSAxODEgOTUgMjA3IDI3NCAKKzk5IDM3IDIzMyAzNyAyMTEgMTA0IDU4IDEyNiAxMjAgMTk1IDIzMiAxNTUgMjI1IDExMiA5MCAyMzAgMjYyIDM1IDkgMTE3IDg5IDM5IAorNDEgNDEgNjMgMTQ3IDEzIDI3OCAyMTYgMjgzIDM1IDc1IDgyIDI2MSAxMDkgMTQyIDI1NyAxNCAyNjcgMTg1IDEwNSA0NyA5NSAyMjkgCis3MSAyNTIgMTUgMTcxIDI1NSA5OSAxNDQgNjUgMTggMjU1IDIyOCA2MCAxOTkgNDAgMzAgMTAgMTcyIDE1OSAzMyAxMzggMTYyIDEzOSAKKzQ0IDEyNSAzNiAyNDQgNjggMTAyIDIyOCAzOCAxMTUgMTc0IDUyIDcyIDI0MSAyNzEgMjgwIDEzMSAxMTkgNCAxNjIgMTYxIDEyOCAxNDIgCisxNCAxODIgMjg2IDE0MSAyNjggNDUgMTU4IDIyIDg1IDE4NyAyODUgODYgMTk4IDUxIDYxIDE4OCA5IDEzOSAxNzMgMTkyIDE5IDI2NiAKKzEzMCAzNSA1MyAyODUgMTA4IDEzMSAyMDQgMzkgMTI2IDIyNyAyNyAyMTMgMTk5IDYyIDExNCAxNjMgMTUwIDk3IDEwMCAyNiAyMDIgCisxNDYgODcgMTI0IDIwNSA3MiAyNjMgNjggMTQ2IDEwOSA1NyA3MSA1MCAyMDEgMTM1IDM0IDE0OSAyMTUgMTE0IDE4NSA4MyAyNTAgNzggCisyNTEgMTMzIDM0IDEyNyAxMzEgMjQ4IDIwNyA5IDE4MyAxOTAgMjExIDI2MiAxNDIgMjc5IDk4IDEzMyAxNjMgNDMgMjY1IDI3MCAyNjkgCis3OCA4IDE1MCAyMDQgODMgNyAyNDYgMjcwIDg5IDE5NyAxMjUgMTk0IDQxIDg1IDgwIDE2NiAyNTYgMTU0IDIxNCAyMTAgMTE1IDg5IDE3IAorMTA4IDE3NSA4NSAyMDkgODIgMTAzIDE3NiAyNzYgMjc5IDc2IDQ5IDEwIDY1IDQwIDUyIDk0IDM4IDEzNyAyNTggNjkgNTAgMTc5IDIwMiAKKzE2OCAxNzEgMjc3IDE4MyAxMCA0MyAyNDMgMTg2IDExNiAxMDAgNzAgODMgMjkgNDMgNjcgMTM1IDU2IDgyIDgxIDkyIDEyMyAxNCAyIAorMTE4IDI1OCAyNSAzMyAxNjAgMjQ2IDUgMjIgNjMgMTAzIDEzMiAxMDggMjYwIDEyMCAxNzMgMTQ4IDIgMjQ3IDM4IDE1OSA1NSAyMjIgCisyOCAxMTcgMjY5IDU2IDIxMSAyODQgMjI2IDE0NSA3NiA3MSAyMzAgMjE4IDE4IDI3NyAyNSAyMTMgMTc3IDI2NSAyNDggMTg1IDIxMiAKKzMwIDIxMiAyNzMgMTk1IDI1NCAyMzkgOTEgOTAgMjggMTAgMTUwIDc1IDE2NyAxNjAgMjI0IDIwOCAxNTYgODUgMTY1IDY1IDIyMCAyMjAgCisxMTMgMjgxIDEzIDI1NiAxMzIgMTMwIDU3IDEzNyAxNTEgODYgNjkgMTM1IDc4IDE2NiAyMzQgNzAgNjEgMjMyIDE3NyAyMiAxMjkgNjggCisxNjggNDIgNzQgNDkgMjc1IDI2OCAxNzQgNzQgMTU2IDEwNyAyNDkgMjE4IDE5OCAxNTggNDQgMTY5IDUzIDI2MyAyNCAyNjUgMjI2IAorMTAxIDU5IDUyIDI3NCA1NSAyMCAyMTQgODEgNDggMjQyIDI4MiA0NiAxMDYgMjYwIDE0NSBeCis2MTQgMSA4MyAyODAgMjIgMjAgMTA1IDI3MSAxNSA1OCAxMzYgMjY5IDEwMCAyMjQgMTAgMTgyIDE5IDY4IDEzMCAxNyA5NCAyNDAgMjU2IAorMjI1IDE1NiAxMjcgNDQgODIgMTcyIDk2IDEwNSA1MyA4OSAxMzQgNjUgMTA3IDI1NyAyMTIgMTAxIDE1MiAxODggMTI0IDkyIDEwNyA3NyAKKzE3NSAyODcgNDMgNDUgMTkwIDk4IDE0MSAxNTcgMjM1IDI1OSAxMjcgMjI0IDExOSAyNzUgMjA1IDI0OCAyNzYgODMgMTAwIDExNSAyMDYgCisyODUgMTI4IDIxMSA2NCAxMSA2MCAxIDY2IDI1MyAyMDIgMjM3IDI0NSAxOTQgMTA4IDUgNjQgMjI5IDExNiA4NCAyNjcgMjU2IDQ1IAorMjQ5IDI0IDIyNCAyMjggMjM4IDEwMiAxMzkgMyAxNDkgMTA2IDE0OSAyODYgNTYgMTAwIDE2NSAyNDMgOTkgMjM3IDY1IDE1NyA1IDI2IAorMjEwIDYgMTIyIDExOCAyMTcgMjcgMTcgMjAzIDQ0IDE1MyAxMTYgMTMgMTkzIDUwIDExNiAxMjIgMjg2IDIzNiA3IDI2OCA2MyAyNDIgCisxNzEgNTkgMTIzIDIxNCAxMjUgMjM4IDUyIDEwMiAzMCA0MCAyNTIgMjE1IDMgMjIwIDUwIDY2IDIxNSAxODMgMTI3IDE1MyA0NSA2OSAKKzExNyAxMjEgMTE5IDk1IDkgMTQ1IDE2NyAyMjkgMTY2IDEyMSA4MSA3NiAxODggNTMgMTggMTkwIDE0OCAxNzggMjYwIDU1IDExMyA2MSAKKzIxOCA4NSAxOTUgMTQ1IDI3NiAxOTIgNjMgMTIgOTcgMTQyIDE5NCAyMTcgOTggMjUwIDEyMCAxMzIgMTUwIDI3MyAxIDEyNSAyMCAyODUgCisxOSAxMTggMzcgMTIwIDIwMyA5NCA2MCAyMTkgMTIyIDQ3IDI3MyAxMTAgODggMjA2IDE3NiAxNjUgMjUgNDMgMTU0IDI4MyAyODQgMzIgCisxNCAxMiAyNjUgMTYxIDE1IDE3OSAxMTcgMTM4IDc1IDI2MCAxNjQgNzYgMjQ3IDEwOSAxMDEgMjYxIDE1MSAyMSAyNzIgMjUzIDE0MyAKKzE4MSAzMiAxMjMgMTA1IDE2MiA1MiAzMSAyNDUgMTIzIDM0IDIxOCAxMzUgMjMyIDI0OCA5NiA0NiAyODYgNiA2MyA2MiAxMzQgMjQ1IAorMTQgNzEgMzIgMjQ0IDg2IDE4MiA5MCAxMiA0NyAxMDUgOTEgMTA4IDI0NCAyNyAxMjYgNyAyMzAgNDQgMjYyIDc5IDE5OSA4NCAxOTYgCisyMyAxMjggMzEgMjcgMTk3IDI0MCAxNyAyNjIgMjU5IDIzNiAxODcgMTYgMTY2IDYyIDI1IDI4MiAxMTcgMTgwIDE3NSAxNzggODAgMTggCisxMCAyNDEgNzUgMTUxIDIwMSAxNzkgNjcgMjUyIDM1IDI1NSAxMTcgNzEgODIgMjgxIDE4OSAyIDIzMyAyMzUgNDEgNzEgMTQxIDQ4IAorMjcyIDczIDIzNiA3OCA1MyAyNjkgMTcxIDE2OCA4NiAxMTEgMTYgOTUgMTE4IDEwOCA2NCAxMjAgMjMgMTg3IDg3IDExMCAyNjggMjQzIAorMjc5IDI3NCAxNjggMjY2IDE0OCAxMTkgMjA0IDI2MSA0MiA1OCA4NiA3MyAxMjcgMTE1IDI2IDg5IDI1IDEwMiA4MCA3NyA2NiAzNSAKKzE0NiAyNCA0NCAxOTEgMTM1IDEyMyAyODUgMTk5IDE1NSAxNDAgOTkgNTcgMjggNTQgMTg1IDQyIDI3NiAxMiAxNTYgMTk4IDExOCAyODggCisxMDEgMjIzIDEzMiA0MSAxODAgMTA0IDIzNCAxNjMgMjE5IDEzIDg0IDg3IDIxOSAyMzEgMTQwIDE3MCAxIDIzNCAyNzIgMTgyIDE5OSAKKzI2NCAyMzMgMTI2IDIzNyAxNzQgMjUwIDE5MSAyMDYgNjcgNzIgMTI4IDE1MiA4IDg3IDI3OCAyODcgMjIzIDI0MSA0IDc3IDI4NCA5MSAKKzIyOSAyMjUgNDcgMTY0IDE0NyAxOTEgMjYgMzAgOTkgMTkgOSA3NCA5MyAyMyA3OCAyODMgMjEzIDg4IDk3IDIxMyAyNjggNCAyNyA4OCAKKzI3NyAxMjAgODIgMTEzIDE3MCAxODEgMjcxIDg2IDIgNTMgMTk4IDIyNyAyNTEgMjg3IDExNCAyNzggMTA3IDE4NiAxMzggMTg0IDIyMyAKKzYxIDk3IDEwNCAxNzUgMTA3IDYgMjMxIDgxIDExNCAyMDcgMTYzIDExMCA1MCAxODcgMTk2IDczIDE2NSAxMzQgMTM2IDUxIDE3NCAxMSAKKzk4IDIwIDE3NiA1NiAyMjEgMTQ2IDI2MyAxMzcgODggMjYgMTM5IDYyIDIwNSAxODkgMjIwIDI5IDExMiA3NCAyNzMgNjAgNTEgMTAzIAorNjcgMjIgOTEgNDkgMTg4IDIzMyA1NSA0IDI1NyAzMiA2NCA0OSA3OSAyNzAgMTU4IDExMyAxMTEgMjU1IDU4IDE1IDI4OCAyMTAgMTg2IAorMjkgMjIxIDM3IDE3MCAyNDAgMTk3IDE2OSA3MyA1NiA0MSAyMzkgMTYwIDI4IDIzNCA5MiAxNDUgOTYgMTU1IDkwIDE5MiAyNDMgMjA4IAorMjAwIDI1MSA0OCAyMSA5MiAyMTYgNDAgNzIgMTc4IDE4OSAxMTEgMTk2IDEzMiAyMjEgMjE3IDIwNyA1NCAxNyAyMyA3IDUwIDcgMTU5IAorMTAwIDU2IDI4MCAyMDIgNTcgMjA4IDkxIDI4OCAxNTEgMTMwIDIzNSAxNTAgMzQgMzggMjI4IDEyOSAxMzkgMjQyIDExMiAyMjYgXgorNjE5IDAgMzggMTQxIDI1MCAxMDQgMzcgMzEgMTU5IDIwNyAxOSAxNzUgOTIgMjAxIDI3NCA5NiAzMSAyMzAgMjggMjA1IDEwNCA1MiAKKzEyNiAxMTQgMTkyIDIyOSAxNTIgMjI1IDEwMyA5MCAyMzAgMjYyIDI2IDEwOCA4NiAzOSAzMiAzNSA2MCAxNDcgMTAgMjc4IDIxNiAyNzcgCiszNSA3NSA3OSAyNTUgMTAwIDEzNiAyNTQgNSAyNjcgMTg1IDk5IDQxIDk1IDIyNiA3MSAyNDkgOSAxNjggMjUyIDkwIDE0NCA1NiAxMiAKKzI0OSAyMjggNTcgMTkzIDM0IDIxIDQgMTcyIDE1MyAzMCAxMzUgMTU5IDEzNiAzNSAxMTYgMzYgMjQxIDU5IDkzIDIyNSAzMiAxMDYgCisxNzEgNDMgNjYgMjM4IDI2OCAyODAgMTMxIDExMCAxIDE2MiAxNjEgMTIyIDE0MiAxNCAxNzkgMjgzIDE0MSAyNjUgMzYgMTU1IDE2IDc5IAorMTg0IDI3OSA3NyAxOTggNDUgNTIgMTgyIDMgMTMzIDE3MyAxOTIgMTAgMjYzIDEyMSAzMiA1MCAyODIgMTAyIDEyMiAxOTggMzAgMTIwIAorMjI3IDE4IDIxMyAxOTYgNTkgMTA4IDE1NyAxNTAgOTEgOTEgMjAgMTk5IDE0MCA4NCAxMjQgMTk5IDY5IDI2MyA2NSAxNDMgMTA5IDQ4IAorNjIgNDcgMjAxIDEyNiAyOCAxNDkgMjE1IDExMSAxODIgNzQgMjQ0IDY5IDI0OCAxMzMgMjUgMTI0IDEyOCAyNDggMjA0IDkgMTgzIDE4NCAKKzIwOCAyNTYgMTM5IDI3OSA5MiAxMzAgMTYzIDM3IDI2NSAyNzAgMjY2IDc1IDggMTQ0IDIwNCA4MCA0IDI0MyAyNjQgODkgMTkxIDExOSAKKzE4OCAzOCA4NSA3MSAxNjMgMjU2IDE1NCAyMTEgMjEwIDExNSA4MyAxNCAxMDggMTcyIDgyIDIwOSA3NiAxMDMgMTc2IDI3MyAyNzYgNjcgCis0MyAxMCA1OSAzNyA0NiA5MSAzNSAxMzEgMjU4IDY5IDQ0IDE3NiAyMDIgMTY1IDE3MSAyNzcgMTc3IDcgMzQgMjQwIDE4MyAxMTMgOTcgCis3MCA4MyAyOSA0MCA2NyAxMjkgNTMgNzMgNzggODkgMTIwIDggMiAxMDkgMjUyIDE5IDMzIDE2MCAyNDYgMjg5IDEzIDU0IDk3IDEyNiAKKzk5IDI2MCAxMTEgMTY3IDE0MiAyODkgMjQ3IDM4IDE1NiA1NSAyMjIgMjIgMTE0IDI2MyA1MCAyMTEgMjgxIDIyNiAxNDIgNzAgNjggCisyMjQgMjEyIDE1IDI3NCAyNSAyMTAgMTcxIDI2MiAyNDUgMTc5IDIxMiAzMCAyMDYgMjcwIDE5NSAyNTQgMjM5IDg4IDgxIDI4IDEgMTQ3IAorNjYgMTY3IDE1NyAyMjEgMjAyIDE1MCA3NiAxNTkgNjUgMjE0IDIyMCAxMDcgMjgxIDcgMjUzIDEyOSAxMjQgNTcgMTM3IDE0NSA4MCA2MCAKKzEzMiA3OCAxNjAgMjMxIDY3IDU4IDIzMiAxNzcgMjIgMTI5IDY4IDE2OCAzMyA3NCA0MCAyNzUgMjYyIDE3NCA2OCAxNTMgMTAxIDI0NiAKKzIxOCAxOTIgMTU4IDQxIDE2NiA0NyAyNTcgMTUgMjU5IDIyMCA5MiA1OSA1MiAyNjggNDYgMjAgMjE0IDcyIDM5IDIzNiAyODIgNDYgCisxMDYgMjU3IDI0OSA4MCAyNzkgMjEgMTkgMTA0IDI3MSAxNSA1NSAxMzYgMjY5IDEwMCAyMjIgNyAxODIgMTggNjUgMTI4IDE0IDkzIAorMjQwIDI1NCAyMjQgMTU2IDEyNiA0MyA4MSAxNzAgOTYgMTAyIDUxIDg3IDEzNCA2NCAxMDQgMjU2IDIxMCAxMDAgMTUxIDE4NiAxMjMgCis4OSAxMDUgNzYgMTc0IDI4NyA0MiA0MiAxOTAgOTUgMTQwIDE1NSAyMzUgMjU4IDEyNSAyMjMgMTE3IDI3MyAyMDUgMjQ2IDI3NCA4MSAKKzk5IDExMiAyMDYgMjg1IDEyNyAyMDkgNjEgOCA1OCAyODggNjYgMjUzIDIwMCAyMzUgMjQzIDE5MyAxMDUgNSA2MyAyMjggMTEzIDgyIAorMjY1IDI1NSA0NCAyNDcgMjMgMjI0IDIyNyAyMzcgMTAyIDEzNyAzIDE0OCAxMDUgMTQ3IDI4NSA1NiA5OCAxNjUgMjQyIDk4IDIzNiA2MyAKKzE1NyAyIDIzIDIwOSA1IDExOSAxMTcgMjE3IDI2IDE1IDIwMyA0MSAxNTEgMTE1IDEyIDE5MyA0OSAxMTYgMTIyIDI4NCAyMzYgNyAyNjggCis2MSAyNDIgMTY5IDU3IDEyMiAyMTMgMTI1IDIzOCA0OSAxMDEgMjcgMzkgMjUxIDIxNCAxIDIxOCA1MCA2MyAyMTMgMTgxIDEyNyAxNTMgCis0NSA2NyAxMTQgMTIxIDExOCA5MyA2IDE0MyAxNjUgMjI3IDE2NiAxMTggNzggNzQgMTg4IDUzIDE3IDE4OSAxNDggMTc2IDI1OCA1NCAKKzExMiA1OCAyMTcgODIgMTk0IDE0NCAyNzUgMTkxIDYzIDkgOTcgMTQxIDE5NCAyMTUgOTYgMjUwIDExOSAxMzIgMTQ5IDI3MSAxMjMgMTggCisyODQgMTcgMTE4IDM3IDExNyAyMDIgOTQgNjAgMjE4IDEyMSA0NyAyNzIgMTEwIDg3IDIwNSAxNzUgMTYzIDIyIDQzIDE1MiAyODEgMjgyIAorMzEgMTEgMTIgMjY0IDE2MCAxMiAxNzggMTE3IDI4OCAxMzcgNzQgMjU5IDE2NCA3NiAyNDUgMTA4IDEwMSAyNjEgMTUwIDIwIDI3MCAKKzI1MSAxNDMgMTgwIDI2NCBeCis2MzkgMCAxMTcgOTkgMTU5IDQ5IDMxIDI0NSAxMjMgMzEgMjEyIDEzNSAyMjYgMjQ1IDkwIDQzIDI4NiAyODkgNjAgNjIgMTMxIDI0MiAKKzExIDY1IDIzIDI0NCA4MCAxNzYgODQgNiAzOCAxMDUgOTEgMTAyIDIzOCAyNyAxMjMgMjkwIDIyNCAzOCAyNTkgNzkgMTk5IDg0IDE5MyAKKzE0IDEyOCAyNSAyMSAxOTEgMjM3IDE3IDI1NiAyNTkgMjMzIDE4NyAxMCAxNjAgNTkgMTkgMjc2IDExNCAxNzQgMTY5IDE3NSA3NCAxOCAKKzcgMjM1IDY5IDE0NSAxOTggMTc5IDU4IDI1MiAzMiAyNTUgMTExIDYyIDgyIDI3OCAxODMgMjg1IDIzMCAyMjkgMzIgNjggMTM1IDM5IAorMjY5IDY3IDIzMCA3NSA0NCAyNjMgMTY4IDE2NSA4NiAxMDggMTYgOTIgMTEyIDEwNSA1OCAxMTQgMjAgMTgxIDc4IDEwNyAyNjUgMjM3IAorMjc2IDI2OCAxNjIgMjY2IDE0MiAxMTkgMjAxIDI1OCAzNiA1MiA3NyA2NCAxMTggMTA5IDI2IDgwIDIyIDk2IDgwIDcxIDYwIDI5IDE0MyAKKzI0IDQ0IDE5MSAxMzIgMTE0IDI3OSAxOTMgMTUyIDE0MCA5OSA1NCAyNSA1NCAxNzkgNDIgMjc2IDkgMTUwIDE5MiAxMDkgMjg1IDkyIAorMjE3IDEyOSAzNSAxODAgMTAxIDIyOCAxNjAgMjEzIDcgODEgODEgMjE5IDIzMSAxMzQgMTY3IDEgMjMxIDI3MiAxNzkgMTk2IDI2NCAKKzIyNyAxMTcgMjM3IDE3MSAyNDQgMTg1IDIwMCA2MSA3MiAxMTkgMTUyIDIgODcgMjcyIDI4NCAyMjAgMjQxIDEgNzcgMjg0IDgyIDIyOSAKKzIxOSA0NCAxNTggMTQ0IDE4OCAyMCAyNyA5MCAxMCA2IDcxIDkzIDE3IDY5IDI4MyAyMTAgODIgOTEgMjA3IDI2MiA0IDE4IDc5IDI3MSAKKzEyMCA3MyAxMTMgMTY0IDE4MSAyNjUgODMgMjg4IDUwIDE5NSAyMjEgMjUxIDI4MSAxMDggMjc1IDEwNCAxODYgMTM4IDE4NCAyMjMgNjEgCis4OCA5NSAxNzUgMTA3IDYgMjI1IDgxIDExNCAyMDcgMTU3IDEwMSA0MSAxODQgMTkwIDczIDE2MiAxMjggMTMwIDQ1IDE2OCAxMSA5OCAKKzExIDE3MCA0NyAyMjEgMTQ2IDI1NyAxMzEgODggMjMgMTM5IDU2IDE5OSAxODkgMjE3IDI4MyAyMyAxMDYgNjggMjczIDUxIDUxIDEwMCAKKzY0IDEzIDg1IDQ5IDE4NSAyMzMgNDkgMjkwIDI1NyAyNiA2NCA0NiA3MyAyNjcgMTUyIDEwNyAxMTEgMjQ5IDU4IDkgMjg4IDIwNCAxODMgCisyNiAyMTggMzQgMTcwIDIzNCAxOTcgMTY5IDcwIDUwIDQxIDIzMyAxNTQgMjIgMjM0IDkyIDE0NSA5MyAxNTUgODEgMTg2IDI0MyAyMDggCisyMDAgMjQ4IDQ4IDIxIDg2IDIxMyA0MCA2OSAxNzggMTg2IDEwNSAxOTYgMTI2IDIxNSAyMTQgMjA0IDQ1IDE0IDIzIDEgNDQgNCAxNTYgCis5MSA1MyAyNzQgMTk5IDUxIDIwNSA4OCAyODIgMTUxIDEzMCAyMzIgMTQ0IDM0IDMyIDIyMiAxMjMgMTM2IDIzNiAxMTIgMzQgMTM3IAorMjQ2IDEwMCAzMSAyNSAxNTkgMjAzIDE5IDE3MSA5MCAxOTcgMjc0IDk0IDI3IDIyOCAyMiAyMDEgMTA0IDQ4IDEyNiAxMTAgMTkwIDIyNyAKKzE1MCAyMjUgOTcgOTAgMjMwIDI2MiAyMCAyODYgMTAyIDg0IDM5IDI2IDMxIDU4IDE0NyA4IDI3OCAyMTYgMjczIDM1IDc1IDc3IDI1MSAKKzk0IDEzMiAyNTIgMjkxIDI2NyAxODUgOTUgMzcgOTUgMjI0IDcxIDI0NyA1IDE2NiAyNTAgODQgMTQ0IDUwIDggMjQ1IDIyOCA1NSAxODkgCiszMCAxNSAxNzIgMTQ5IDI4IDEzMyAxNTcgMTM0IDI5IDExMCAzNiAyMzkgNTMgODcgMjIzIDI4IDEwMCAxNjkgMzcgNjIgMjM2IDI2NiAKKzI4MCAxMzEgMTA0IDI5MSAxNjIgMTYxIDExOCAxNDIgMTQgMTc3IDI4MSAxNDEgMjYzIDMwIDE1MyAxMiA3NSAxODIgMjc1IDcxIDE5OCAKKzQxIDQ2IDE3OCAyOTEgMTI5IDE3MyAxOTIgNCAyNjEgMTE1IDMwIDQ4IDI4MCA5OCAxMTYgMTk0IDI0IDExNiAyMjcgMTIgMjEzIDE5NCAKKzU3IDEwNCAxNTMgMTUwIDg3IDg1IDE2IDE5NyAxMzYgODIgMTI0IDE5NSA2NyAyNjMgNjMgMTQxIDEwOSA0MiA1NiA0NSAyMDEgMTIwIAorMjQgMTQ5IDIxNSAxMDkgMTgwIDY4IDI0MCA2MyAyNDYgMTMzIDE5IDEyMiAxMjYgMjQ4IDIwMiA5IDE4MyAxODAgMjA2IDI1MiAxMzcgCisyNzkgODggMTI4IDE2MyAzMyAyNjUgMjcwIDI2NCA3MyA4IDE0MCAyMDQgNzggMiAyNDEgMjYwIDg5IDE4NyAxMTUgMTg0IDM2IDg1IDY1IAorMTYxIDI1NiAxNTQgMjA5IDIxMCAxMTUgNzkgMTIgMTA4IDE3MCA4MCAyMDkgNzIgMTAzIDE3NiAyNzEgMjc0IDYxIDM5IDEwIDU1IDM1IAorNDIgODkgMzMgMTI3IDI1OCA2OSA0MCAxNzQgMjAyIDE2MyAxNzEgMjc3IDE3MyA1IDI4IDIzOCAxODEgMTExIDk1IDcwIDgzIDI5IDM4IAorNjcgMTI1IDUxIDY3IDc2IDg3IDExOCA0IDIgMTAzIDI0OCAxNSAzMyAxNjAgMjQ2IDI4NyA3IDQ4IDkzIDI4MyBeCis2MTEgMCA4NyAyNjAgOTkgMTU5IDEzNCAyODkgMjQ3IDM4IDE1MiA1NSAyMjIgMTQgMTEwIDI1NSA0MiAyMTEgMjc3IDIyNiAxMzggNjIgCis2NCAyMTYgMjA0IDExIDI3MCAyNSAyMDYgMTYzIDI1OCAyNDEgMTcxIDIxMiAzMCAxOTggMjY2IDE5NSAyNTQgMjM5IDg0IDY5IDI4IAorMjgzIDE0MyA1NCAxNjcgMTUzIDIxNyAxOTQgMTQyIDY0IDE1MSA2NSAyMDYgMjIwIDk5IDI4MSAyOTMgMjQ5IDEyNSAxMTYgNTcgMTM3IAorMTM3IDcyIDQ4IDEyOCA3OCAxNTIgMjI3IDYzIDU0IDIzMiAxNzcgMjIgMTI5IDY4IDE2OCAyMSA3NCAyOCAyNzUgMjU0IDE3NCA2MCAKKzE0OSA5MyAyNDIgMjE4IDE4NCAxNTggMzcgMTYyIDM5IDI0OSAzIDI1MSAyMTIgODAgNTkgNTIgMjYwIDM0IDIwIDIxNCA2MCAyNyAyMjggCisyODIgNDYgMTA2IDI1MyAyNDkgNjggMjc1IDE3IDE1IDEwMCAyNzEgMTUgNDMgMTM2IDI2OSAxMDAgMjE0IDI4OSAxODIgMTQgNTMgMTIwIAorMiA4OSAyNDAgMjQ2IDIyMCAxNTYgMTIyIDM5IDc3IDE2MiA5NiA5MCA0MyA3OSAxMzQgNjAgOTIgMjUyIDIwMiA5NiAxNDcgMTc4IDExOSAKKzc3IDk3IDcyIDE3MCAyODcgMzggMzAgMTkwIDgzIDEzNiAxNDcgMjM1IDI1NCAxMTcgMjE5IDEwOSAyNjUgMjA1IDIzOCAyNjYgNzMgOTUgCisxMDAgMjA2IDI4NSAxMjMgMjAxIDQ5IDI5MCA1MCAyODAgNjYgMjUzIDE5MiAyMjcgMjM1IDE4OSA5MyA1IDU5IDIyNCAxMDEgNzQgMjU3IAorMjUxIDQwIDIzOSAxOSAyMjQgMjIzIDIzMyAxMDIgMTI5IDMgMTQ0IDEwMSAxMzkgMjgxIDU2IDkwIDE2NSAyMzggOTQgMjMyIDU1IDE1NyAKKzI4NCAxMSAyMDUgMSAxMDcgMTEzIDIxNyAyMiA3IDIwMyAyOSAxNDMgMTExIDggMTkzIDQ1IDExNiAxMjIgMjc2IDIzNiA3IDI2OCA1MyAKKzI0MiAxNjEgNDkgMTE4IDIwOSAxMjUgMjM4IDM3IDk3IDE1IDM1IDI0NyAyMTAgMjg3IDIxMCA1MCA1MSAyMDUgMTczIDEyNyAxNTMgNDUgCis1OSAxMDIgMTIxIDExNCA4NSAyODggMTM1IDE1NyAyMTkgMTY2IDEwNiA2NiA2NiAxODggNTMgMTMgMTg1IDE0OCAxNjggMjUwIDUwIAorMTA4IDQ2IDIxMyA3MCAxOTAgMTQwIDI3MSAxODcgNjMgMjkxIDk3IDEzNyAxOTQgMjA3IDg4IDI1MCAxMTUgMTMyIDE0NSAyNjMgMjkwIAorMTE1IDEwIDI4MCA5IDExOCAzNyAxMDUgMTk4IDk0IDYwIDIxNCAxMTcgNDcgMjY4IDExMCA4MyAyMDEgMTcxIDE1NSAxMCA0MyAxNDQgCisyNzMgMjc0IDI3IDI5MyAxMiAyNjAgMTU2IDE3NCAxMTcgMjg0IDEzMyA3MCAyNTUgMTY0IDc2IDIzNyAxMDQgMTAxIDI2MSAxNDYgMTYgCisyNjIgMjQzIDE0MyAxNzYgMzIgMTEzIDk1IDE1NyA0NyAzMSAyNDUgMTIzIDI5IDIwOCAxMzUgMjIyIDI0MyA4NiA0MSAyODYgMjg1IDU4IAorNjIgMTI5IDI0MCA5IDYxIDE3IDI0NCA3NiAxNzIgODAgMiAzMiAxMDUgOTEgOTggMjM0IDI3IDEyMSAyODYgMjIwIDM0IDI1NyA3OSAKKzE5OSA4NCAxOTEgOCAxMjggMjEgMTcgMTg3IDIzNSAxNyAyNTIgMjU5IDIzMSAxODcgNiAxNTYgNTcgMTUgMjcyIDExMiAxNzAgMTY1IAorMTczIDcwIDE4IDUgMjMxIDY1IDE0MSAxOTYgMTc5IDUyIDI1MiAzMCAyNTUgMTA3IDU2IDgyIDI3NiAxNzkgMjgxIDIyOCAyMjUgMjYgCis2NiAxMzEgMzMgMjY3IDYzIDIyNiA3MyAzOCAyNTkgMTY2IDE2MyA4NiAxMDYgMTYgOTAgMTA4IDEwMyA1NCAxMTAgMTggMTc3IDcyIAorMTA1IDI2MyAyMzMgMjc0IDI2NCAxNTggMjY2IDEzOCAxMTkgMTk5IDI1NiAzMiA0OCA3MSA1OCAxMTIgMTA1IDI2IDc0IDIwIDkyIDgwIAorNjcgNTYgMjUgMTQxIDI0IDQ0IDE5MSAxMzAgMTA4IDI3NSAxODkgMTUwIDE0MCA5OSA1MiAyMyA1NCAxNzUgNDIgMjc2IDcgMTQ2IDE4OCAKKzEwMyAyODMgODYgMjEzIDEyNyAzMSAxODAgOTkgMjI0IDE1OCAyMDkgMyA3OSA3NyAyMTkgMjMxIDEzMCAxNjUgMSAyMjkgMjcyIDE3NyAKKzE5NCAyNjQgMjIzIDExMSAyMzcgMTY5IDI0MCAxODEgMTk2IDU3IDcyIDExMyAxNTIgMjkyIDg3IDI2OCAyODIgMjE4IDI0MSAyOTMgNzcgCisyODQgNzYgMjI5IDIxNSA0MiAxNTQgMTQyIDE4NiAxNiAyNSA4NCA0IDQgNjkgOTMgMTMgNjMgMjgzIDIwOCA3OCA4NyAyMDMgMjU4IDQgCisxMiA3MyAyNjcgMTIwIDY3IDExMyAxNjAgMTgxIDI2MSA4MSAyODYgNDggMTkzIDIxNyAyNTEgMjc3IDEwNCAyNzMgMTAyIDE4NiAxMzggCisxODQgMjIzIDYxIDgyIDg5IDE3NSAxMDcgNiAyMjEgODEgMTE0IDIwNyAxNTMgOTUgMzUgMTgyIDE4NiA3MyAyNzUgXgorNjM0IDAgMTIwIDEyMiAzNyAxNjAgMTEgOTggMjk1IDE2MiAzNSAyMjEgMTQ2IDI0OSAxMjMgODggMTkgMTM5IDQ4IDE5MSAxODkgMjEzIAorMjc1IDE1IDk4IDYwIDI3MyAzOSA1MSA5NiA2MCAxIDc3IDQ5IDE4MSAyMzMgNDEgMjg2IDI1NyAxOCA2NCA0MiA2NSAyNjMgMTQ0IDk5IAorMTExIDI0MSA1OCAxIDI4OCAxOTYgMTc5IDIyIDIxNCAzMCAxNzAgMjI2IDE5NyAxNjkgNjYgNDIgNDEgMjI1IDE0NiAxNCAyMzQgOTIgCisxNDUgODkgMTU1IDY5IDE3OCAyNDMgMjA4IDIwMCAyNDQgNDggMjEgNzggMjA5IDQwIDY1IDE3OCAxODIgOTcgMTk2IDExOCAyMDcgMjEwIAorMjAwIDMzIDEwIDIzIDI4OSAzNiAxNTIgNzkgNDkgMjY2IDE5NSA0MyAyMDEgODQgMjc0IDE1MSAxMzAgMjI4IDEzNiAzNCAyNCAyMTQgCisxMTUgMTMyIDIyOCAxMTIgMjkyIDI2IDEyOSAyMzggOTIgMTkgMTMgMTU5IDE5NSAxOSAxNjMgODYgMTg5IDI3NCA5MCAxOSAyMjQgMTAgCisxOTMgMTA0IDQwIDEyNiAxMDIgMTg2IDIyMyAxNDYgMjI1IDg1IDkwIDIzMCAyNjIgOCAyNzggOTAgODAgMzkgMTQgMjMgNTQgMTQ3IDQgCisyNzggMjE2IDI2NSAzNSA3NSA3MyAyNDMgODIgMTI0IDI0OCAyODMgMjY3IDE4NSA4NyAyOSA5NSAyMjAgNzEgMjQzIDI5MyAxNjIgMjQ2IAorNzIgMTQ0IDM4IDIzNyAyMjggNTEgMTgxIDIyIDMgMjg4IDE3MiAxNDEgMjQgMTI5IDE1MyAxMzAgMTcgOTggMzYgMjM1IDQxIDc1IDIxOSAKKzIwIDg4IDE2NSAyNSA1NCAyMzIgMjYyIDI4MCAxMzEgOTIgMjkxIDE2MiAxNjEgMTEwIDE0MiAxNCAxNzMgMjc3IDE0MSAyNTkgMTggCisxNDkgNCA2NyAxNzggMjY3IDU5IDE5OCAzMyAzNCAxNzAgMjg3IDEyMSAxNzMgMTkyIDI4OCAyNTcgMTAzIDI2IDQ0IDI3NiA5MCAxMDQgCisxODYgMTIgMTA4IDIyNyAyMTMgMTkwIDUzIDk2IDE0NSAxNTAgNzkgNzMgOCAxOTMgMTI4IDc4IDEyNCAxODcgNjMgMjYzIDU5IDEzNyAKKzEwOSAzMCA0NCA0MSAyMDEgMTA4IDE2IDE0OSAyMTUgMTA1IDE3NiA1NiAyMzIgNTEgMjQyIDEzMyA3IDExOCAxMjIgMjQ4IDE5OCA5IAorMTgzIDE3MiAyMDIgMjQ0IDEzMyAyNzkgODAgMTI0IDE2MyAyNSAyNjUgMjcwIDI2MCA2OSA4IDEzMiAyMDQgNzQgMjk0IDIzNyAyNTIgCis4OSAxNzkgMTA3IDE3NiAzMiA4NSA1MyAxNTcgMjU2IDE1NCAyMDUgMjEwIDExNSA3MSA4IDEwOCAxNjYgNzYgMjA5IDY0IDEwMyAxNzYgCisyNjcgMjcwIDQ5IDMxIDEwIDQ3IDMxIDM0IDg1IDI5IDExOSAyNTggNjkgMzIgMTcwIDIwMiAxNTkgMTcxIDI3NyAxNjUgMSAxNiAyMzQgCisxNzcgMTA3IDkxIDcwIDgzIDI5IDM0IDY3IDExNyA0NyA1NSA3MiA4MyAxMTQgMjkyIDIgOTEgMjQwIDcgMzMgMTYwIDI0NiAyODMgMjkxIAorMzYgODUgMTE0IDgxIDI2MCA5MyAxNTUgMTMwIDI4OSAyNDcgMzggMTUwIDU1IDIyMiAxMCAxMDggMjUxIDM4IDIxMSAyNzUgMjI2IDEzNiAKKzU4IDYyIDIxMiAyMDAgOSAyNjggMjUgMjA0IDE1OSAyNTYgMjM5IDE2NyAyMTIgMzAgMTk0IDI2NCAxOTUgMjU0IDIzOSA4MiA2MyAyOCAKKzI3OSAxNDEgNDggMTY3IDE1MSAyMTUgMTkwIDEzOCA1OCAxNDcgNjUgMjAyIDIyMCA5NSAyODEgMjkxIDI0NyAxMjMgMTEyIDU3IDEzNyAKKzEzMyA2OCA0MiAxMjYgNzggMTQ4IDIyNSA2MSA1MiAyMzIgMTc3IDIyIDEyOSA2OCAxNjggMTUgNzQgMjIgMjc1IDI1MCAxNzQgNTYgCisxNDcgODkgMjQwIDIxOCAxODAgMTU4IDM1IDE2MCAzNSAyNDUgMjkzIDI0NyAyMDggNzQgNTkgNTIgMjU2IDI4IDIwIDIxNCA1NCAyMSAKKzIyNCAyODIgNDYgMTA2IDI1MSAyNDkgNjIgMjczIDE1IDEzIDk4IDI3MSAxNSAzNyAxMzYgMjY5IDEwMCAyMTAgMjg1IDE4MiAxMiA0NyAKKzExNiAyOTIgODcgMjQwIDI0MiAyMTggMTU2IDEyMCAzNyA3NSAxNTggOTYgODQgMzkgNzUgMTM0IDU4IDg2IDI1MCAxOTggOTQgMTQ1IAorMTc0IDExNyA3MSA5MyA3MCAxNjggMjg3IDM2IDI0IDE5MCA3NyAxMzQgMTQzIDIzNSAyNTIgMTEzIDIxNyAxMDUgMjYxIDIwNSAyMzQgCisyNjIgNjkgOTMgOTQgMjA2IDI4NSAxMjEgMTk3IDQzIDI4NiA0NiAyNzYgNjYgMjUzIDE4OCAyMjMgMjMxIDE4NyA4NyA1IDU3IDIyMiAKKzk1IDcwIDI1MyAyNDkgMzggMjM1IDE3IDIyNCAyMjEgMjMxIDEwMiAxMjUgMyAxNDIgOTkgMTM1IDI3OSA1NiA4NiAxNjUgMjM2IDkyIAorMjMwIDUxIDE1NyAyODAgNSAyMDMgMjk1IDEwMSAxMTEgMjE3IDIwIDMgMjAzIDIzIDEzOSAxMDkgNiAxOTMgNDMgMTE2IDEyMiAyNzIgCisyMzYgNyAyNjggNDkgMjQyIDE1NyA0NSAxMTYgMjA3IDEyNSAyMzggMzEgOTUgOSAzMyAyNDUgMjIwIF4KKzYzOCAwIDI4NCAyMDQgNTAgNDIgMTk5IDE2NyAxMjcgMTUzIDQ1IDUzIDkzIDEyMSAxMTEgNzkgMjgyIDEyOSAxNTEgMjEzIDE2NiA5NyAKKzU3IDYwIDE4OCA1MyAxMCAxODIgMTQ4IDE2MiAyNDQgNDcgMTA1IDM3IDIxMCA2MSAxODcgMTM3IDI2OCAxODQgNjMgMjg1IDk3IDEzNCAKKzE5NCAyMDEgODIgMjUwIDExMiAxMzIgMTQyIDI1NyAyOTAgMTA5IDQgMjc3IDMgMTE4IDM3IDk2IDE5NSA5NCA2MCAyMTEgMTE0IDQ3IAorMjY1IDExMCA4MCAxOTggMTY4IDE0OSAxIDQzIDEzOCAyNjcgMjY4IDI0IDI4NyAxMiAyNTcgMTUzIDI4OCAxNzEgMTE3IDI4MSAxMzAgCis2NyAyNTIgMTY0IDc2IDIzMSAxMDEgMTAxIDI2MSAxNDMgMTMgMjU2IDIzNyAxNDMgMTczIDMyIDEwNyA4OSAxNTQgNDQgMzEgMjQ1IAorMTIzIDI2IDIwMiAxMzUgMjE2IDI0MCA4MCAzOCAyODYgMjc5IDU1IDYyIDEyNiAyMzcgNiA1NSA4IDI0NCA3MCAxNjYgNzQgMjkzIDIzIAorMTA1IDkxIDkyIDIyOCAyNyAxMTggMjgwIDIxNCAyOCAyNTQgNzkgMTk5IDg0IDE4OCAyOTYgMTI4IDE1IDExIDE4MSAyMzIgMTcgMjQ2IAorMjU5IDIyOCAxODcgMTUwIDU0IDkgMjY2IDEwOSAxNjQgMTU5IDE3MCA2NCAxOCAyIDIyNSA1OSAxMzUgMTkzIDE3OSA0MyAyNTIgMjcgCisyNTUgMTAxIDQ3IDgyIDI3MyAxNzMgMjc1IDIyNSAyMTkgMTcgNjMgMTI1IDI0IDI2NCA1NyAyMjAgNzAgMjkgMjUzIDE2MyAxNjAgODYgCisxMDMgMTYgODcgMTAyIDEwMCA0OCAxMDQgMTUgMTcxIDYzIDEwMiAyNjAgMjI3IDI3MSAyNTggMTUyIDI2NiAxMzIgMTE5IDE5NiAyNTMgCisyNiA0MiA2MiA0OSAxMDMgOTkgMjYgNjUgMTcgODYgODAgNjEgNTAgMTkgMTM4IDI0IDQ0IDE5MSAxMjcgOTkgMjY5IDE4MyAxNDcgMTQwIAorOTkgNDkgMjAgNTQgMTY5IDQyIDI3NiA0IDE0MCAxODIgOTQgMjgwIDc3IDIwNyAxMjQgMjUgMTgwIDk2IDIxOCAxNTUgMjAzIDI5NCA3NiAKKzcxIDIxOSAyMzEgMTI0IDE2MiAxIDIyNiAyNzIgMTc0IDE5MSAyNjQgMjE3IDEwMiAyMzcgMTY2IDIzNCAxNzUgMTkwIDUxIDcyIDEwNCAKKzE1MiAyODkgODcgMjYyIDI3OSAyMTUgMjQxIDI5MyA3NyAyODQgNjcgMjI5IDIwOSAzOSAxNDggMTM5IDE4MyAxMCAyMiA3NSAyOTIgMSAKKzY2IDkzIDcgNTQgMjgzIDIwNSA3MiA4MSAxOTcgMjUyIDQgMyA2NCAyNjEgMTIwIDU4IDExMyAxNTQgMTgxIDI1NSA3OCAyODMgNDUgCisxOTAgMjExIDI1MSAyNzEgOTggMjcwIDk5IDE4NiAxMzggMTg0IDIyMyA2MSA3MyA4MCAxNzUgMTA3IDYgMjE1IDgxIDExNCAyMDcgMTQ3IAorODYgMjYgMTc5IDE4MCA3MyAxNTcgMTE4IDEyMCAzNSAxNTggMTEgOTggMjkzIDE2MCAzMiAyMjEgMTQ2IDI0NyAxMjEgODggMTggMTM5IAorNDYgMTg5IDE4OSAyMTIgMjczIDEzIDk2IDU4IDI3MyAzNiA1MSA5NSA1OSAyOTUgNzUgNDkgMTgwIDIzMyAzOSAyODUgMjU3IDE2IDY0IAorNDEgNjMgMjYyIDE0MiA5NyAxMTEgMjM5IDU4IDI5NiAyODggMTk0IDE3OCAyMSAyMTMgMjkgMTcwIDIyNCAxOTcgMTY5IDY1IDQwIDQxIAorMjIzIDE0NCAxMiAyMzQgOTIgMTQ1IDg4IDE1NSA2NiAxNzYgMjQzIDIwOCAyMDAgMjQzIDQ4IDIxIDc2IDIwOCA0MCA2NCAxNzggMTgxIAorOTUgMTk2IDExNiAyMDUgMjA5IDE5OSAzMCA5IDIzIDI4OCAzNCAyOTYgMTUxIDc2IDQ4IDI2NCAxOTQgNDEgMjAwIDgzIDI3MiAxNTEgCisxMzAgMjI3IDEzNCAzNCAyMiAyMTIgMTEzIDEzMSAyMjYgMTEyIDI5MiAyNCAxMjcgMjM2IDkwIDE2IDEwIDE1OSAxOTMgMTkgMTYxIDg1IAorMTg3IDI3NCA4OSAxNyAyMjMgNyAxOTEgMTA0IDM4IDEyNiAxMDAgMTg1IDIyMiAxNDUgMjI1IDgyIDkwIDIzMCAyNjIgNSAyNzYgODcgCis3OSAzOSAxMSAyMSA1MyAxNDcgMyAyNzggMjE2IDI2MyAzNSA3NSA3MiAyNDEgNzkgMTIyIDI0NyAyODEgMjY3IDE4NSA4NSAyNyA5NSAKKzIxOSA3MSAyNDIgMjkyIDE2MSAyNDUgNjkgMTQ0IDM1IDI5NSAyMzUgMjI4IDUwIDE3OSAyMCAyODcgMTcyIDEzOSAyMyAxMjggMTUyIAorMTI5IDE0IDk1IDM2IDIzNCAzOCA3MiAyMTggMTggODUgMTY0IDIyIDUyIDIzMSAyNjEgMjgwIDEzMSA4OSAyOTEgMTYyIDE2MSAxMDggCisxNDIgMTQgMTcyIDI3NiAxNDEgMjU4IDE1IDE0OCAyIDY1IDE3NyAyNjUgNTYgMTk4IDMxIDMxIDE2OCAyODYgMTE5IDE3MyAxOTIgMjg2IAorMjU2IDEwMCAyNSA0MyAyNzUgODggMTAxIDE4NCA5IDEwNiAyMjcgMjk0IDIxMyAxODkgNTIgOTQgMTQzIDE1MCA3NyA3MCA2IDE5MiAKKzEyNiA3NyAxMjQgMTg1IDYyIDI2MyA1OCAxMzYgMTA5IDI3IDQxIDQwIDIwMSAxMDUgMTQgMTQ5IDIxNSAxMDQgMTc1IDUzIDIzMCAyMTkgCiteCis2MzUgMSAyMzkgMTMzIDI5NyAxMTUgMTE5IDI0OCAxOTUgOSAxODMgMTY2IDE5OSAyMzggMTMwIDI3OSA3NCAxMjEgMTYzIDE5IDI2NSAKKzI3MCAyNTcgNjYgOCAxMjYgMjA0IDcxIDI5NCAyMzQgMjQ2IDg5IDE3MyAxMDEgMTcwIDI5IDg1IDQ0IDE1NCAyNTYgMTU0IDIwMiAyMTAgCisxMTUgNjUgNSAxMDggMTYzIDczIDIwOSA1OCAxMDMgMTc2IDI2NCAyNjcgNDAgMjUgMTAgNDEgMjggMjggODIgMjYgMTEzIDI1OCA2OSAKKzI2IDE2NyAyMDIgMTU2IDE3MSAyNzcgMTU5IDI5NyA3IDIzMSAxNzQgMTA0IDg4IDcwIDgzIDI5IDMxIDY3IDExMSA0NCA0NiA2OSA4MCAKKzExMSAyODkgMiA4MiAyMzQgMSAzMyAxNjAgMjQ2IDI4MCAyODUgMjcgNzkgMTA4IDcyIDI2MCA4NCAxNDkgMTI0IDI4OSAyNDcgMzggCisxNDcgNTUgMjIyIDQgMTA1IDI0NSAzMiAyMTEgMjcyIDIyNiAxMzMgNTIgNTkgMjA2IDE5NCA2IDI2NSAyNSAyMDEgMTUzIDI1MyAyMzYgCisxNjEgMjEyIDMwIDE4OCAyNjEgMTk1IDI1NCAyMzkgNzkgNTQgMjggMjczIDEzOCAzOSAxNjcgMTQ4IDIxMiAxODQgMTMyIDQ5IDE0MSAKKzY1IDE5NiAyMjAgODkgMjgxIDI4OCAyNDQgMTIwIDEwNiA1NyAxMzcgMTI3IDYyIDMzIDEyMyA3OCAxNDIgMjIyIDU4IDQ5IDIzMiAxNzcgCisyMiAxMjkgNjggMTY4IDYgNzQgMTMgMjc1IDI0NCAxNzQgNTAgMTQ0IDgzIDIzNyAyMTggMTc0IDE1OCAzMiAxNTcgMjkgMjM5IDI4NyAKKzI0MSAyMDIgNjUgNTkgNTIgMjUwIDE5IDIwIDIxNCA0NSAxMiAyMTggMjgyIDQ2IDEwNiAyNDggMjQ5IDUzIDI3MCAxMiAxMCA5NSAyNzEgCisxNSAyOCAxMzYgMjY5IDEwMCAyMDQgMjc5IDE4MiA5IDM4IDExMCAyODYgODQgMjQwIDIzNiAyMTUgMTU2IDExNyAzNCA3MiAxNTIgOTYgCis3NSAzMyA2OSAxMzQgNTUgNzcgMjQ3IDE5MiA5MSAxNDIgMTY4IDExNCA2MiA4NyA2NyAxNjUgMjg3IDMzIDE1IDE5MCA2OCAxMzEgMTM3IAorMjM1IDI0OSAxMDcgMjE0IDk5IDI1NSAyMDUgMjI4IDI1NiA2MyA5MCA4NSAyMDYgMjg1IDExOCAxOTEgMzQgMjgwIDQwIDI3MCA2NiAKKzI1MyAxODIgMjE3IDIyNSAxODQgNzggNSA1NCAyMTkgODYgNjQgMjQ3IDI0NiAzNSAyMjkgMTQgMjI0IDIxOCAyMjggMTAyIDExOSAzIAorMTM5IDk2IDEyOSAyNzYgNTYgODAgMTY1IDIzMyA4OSAyMjcgNDUgMTU3IDI3NCAyOTUgMjAwIDI5NSA5MiAxMDggMjE3IDE3IDI5NiAKKzIwMyAxNCAxMzMgMTA2IDMgMTkzIDQwIDExNiAxMjIgMjY2IDIzNiA3IDI2OCA0MyAyNDIgMTUxIDM5IDExMyAyMDQgMTI1IDIzOCAyMiAKKzkyIDMwIDI0MiAyMDUgMjgyIDIwMCA1MCAzNiAxOTUgMTYzIDEyNyAxNTMgNDUgNDkgODcgMTIxIDEwOSA3NSAyNzggMTI1IDE0NyAyMDkgCisxNjYgOTEgNTEgNTYgMTg4IDUzIDggMTgwIDE0OCAxNTggMjQwIDQ1IDEwMyAzMSAyMDggNTUgMTg1IDEzNSAyNjYgMTgyIDYzIDI4MSAKKzk3IDEzMiAxOTQgMTk3IDc4IDI1MCAxMTAgMTMyIDE0MCAyNTMgMjkwIDEwNSAyNzUgMjk4IDExOCAzNyA5MCAxOTMgOTQgNjAgMjA5IAorMTEyIDQ3IDI2MyAxMTAgNzggMTk2IDE2NiAxNDUgMjk0IDQzIDEzNCAyNjMgMjY0IDIyIDI4MyAxMiAyNTUgMTUxIDI4NCAxNjkgMTE3IAorMjc5IDEyOCA2NSAyNTAgMTY0IDc2IDIyNyA5OSAxMDEgMjYxIDE0MSAxMSAyNTIgMjMzIDE0MyAxNzEgMzIgMTAzIDg1IDE1MiA0MiAzMSAKKzI0NSAxMjMgMjQgMTk4IDEzNSAyMTIgMjM4IDc2IDM2IDI4NiAyNzUgNTMgNjIgMTI0IDIzNSA0IDUxIDIgMjQ0IDY2IDE2MiA3MCAyOTEgCisxNyAxMDUgOTEgODggMjI0IDI3IDExNiAyNzYgMjEwIDI0IDI1MiA3OSAxOTkgODQgMTg2IDI5MiAxMjggMTEgNyAxNzcgMjMwIDE3IAorMjQyIDI1OSAyMjYgMTg3IDI5NSAxNDYgNTIgNSAyNjIgMTA3IDE2MCAxNTUgMTY4IDYwIDE4IDIyMSA1NSAxMzEgMTkxIDE3OSAzNyAKKzI1MiAyNSAyNTUgOTcgNDEgODIgMjcxIDE2OSAyNzEgMjIzIDIxNSAxMSA2MSAxMjEgMTggMjYyIDUzIDIxNiA2OCAyMyAyNDkgMTYxIAorMTU4IDg2IDEwMSAxNiA4NSA5OCA5OCA0NCAxMDAgMTMgMTY3IDU3IDEwMCAyNTggMjIzIDI2OSAyNTQgMTQ4IDI2NiAxMjggMTE5IDE5NCAKKzI1MSAyMiAzOCA1NiA0MyA5NyA5NSAyNiA1OSAxNSA4MiA4MCA1NyA0NiAxNSAxMzYgMjQgNDQgMTkxIDEyNSA5MyAyNjUgMTc5IDE0NSAKKzE0MCA5OSA0NyAxOCA1NCAxNjUgNDIgMjc2IDIgMTM2IDE3OCA4OCAyNzggNzEgMjAzIDEyMiAyMSAxODAgOTQgMjE0IDE1MyAxOTkgCisyOTIgNzQgNjcgMjE5IDIzMSAxMjAgMTYwIDEgMjI0IDI3MiAxNzIgMTg5IDI2NCAyMTMgOTYgMjM3IDE2NCAyMzAgMTcxIDE4NiAxNTMgXgorNjM4IDEgNzIgOTIgMTUyIDI4NSA4NyAyNTQgMjc1IDIxMSAyNDEgMjkzIDc3IDI4NCA1NSAyMjkgMjAxIDM1IDE0MCAxMzUgMTc5IDIgCisxOCA2MyAyODQgMjk4IDYyIDkzIDMwMCA0MiAyODMgMjAxIDY0IDczIDE4OSAyNDQgNCAyOTIgNTIgMjUzIDEyMCA0NiAxMTMgMTQ2IAorMTgxIDI0NyA3NCAyNzkgNDEgMTg2IDIwMyAyNTEgMjYzIDkwIDI2NiA5NSAxODYgMTM4IDE4NCAyMjMgNjEgNjEgNjggMTc1IDEwNyA2IAorMjA3IDgxIDExNCAyMDcgMTM5IDc0IDE0IDE3NSAxNzIgNzMgMTUzIDExMCAxMTIgMjcgMTUwIDExIDk4IDI4NSAxNTIgMjAgMjIxIDE0NiAKKzIzOSAxMTMgODggMTQgMTM5IDM4IDE4MSAxODkgMjA4IDI2NSA1IDg4IDUwIDI3MyAyNCA1MSA5MSA1NSAyODcgNjcgNDkgMTc2IDIzMyAKKzMxIDI4MSAyNTcgOCA2NCAzNyA1NSAyNTggMTM0IDg5IDExMSAyMzEgNTggMjkyIDI4OCAxODYgMTc0IDE3IDIwOSAyNSAxNzAgMjE2IAorMTk3IDE2OSA2MSAzMiA0MSAyMTUgMTM2IDQgMjM0IDkyIDE0NSA4NCAxNTUgNTQgMTY4IDI0MyAyMDggMjAwIDIzOSA0OCAyMSA2OCAKKzIwNCA0MCA2MCAxNzggMTc3IDg3IDE5NiAxMDggMTk3IDIwNSAxOTUgMTggNSAyMyAyODQgMjYgMjk2IDE0NyA2NCA0NCAyNTYgMTkwIAorMzMgMTk2IDc5IDI2NCAxNTEgMTMwIDIyMyAxMjYgMzQgMTQgMjA0IDEwNSAxMjcgMjE4IDExMiAyOTIgMTYgMTE5IDIyOCA4MiA0IDI5OSAKKzE1OSAxODUgMTkgMTUzIDgxIDE3OSAyNzQgODUgOSAyMTkgMjk2IDE4MyAxMDQgMzAgMTI2IDkyIDE4MSAyMTggMTQxIDIyNSA3MCA5MCAKKzIzMCAyNjIgMjk0IDI2OCA3NSA3NSAzOSAzMDAgMTMgNDkgMTQ3IDMwMCAyNzggMjE2IDI1NSAzNSA3NSA2OCAyMzMgNjcgMTE0IDI0MyAKKzI3MyAyNjcgMTg1IDc3IDE5IDk1IDIxNSA3MSAyMzggMjg4IDE1NyAyNDEgNTcgMTQ0IDIzIDI5MSAyMjcgMjI4IDQ2IDE3MSAxMiAyODkgCisyODMgMTcyIDEzMSAxOSAxMjQgMTQ4IDEyNSAyIDgzIDM2IDIzMCAyNiA2MCAyMTQgMTAgNzMgMTYwIDEwIDQ0IDIyNyAyNTcgMjgwIAorMTMxIDc3IDI5MSAxNjIgMTYxIDEwMCAxNDIgMTQgMTY4IDI3MiAxNDEgMjU0IDMgMTQ0IDI5NSA1NyAxNzMgMjU3IDQ0IDE5OCAyMyAxOSAKKzE2MCAyODIgMTExIDE3MyAxOTIgMjc4IDI1MiA4OCAyMSAzOSAyNzEgODAgODkgMTc2IDI5OCA5OCAyMjcgMjg2IDIxMyAxODUgNDggODYgCisxMzUgMTUwIDY5IDU4IDI5OSAxODggMTE4IDczIDEyNCAxNzcgNTggMjYzIDU0IDEzMiAxMDkgMTUgMjkgMzYgMjAxIDkzIDYgMTQ5IAorMjE1IDEwMCAxNzEgNDEgMjIyIDM2IDIzNyAxMzMgMjkzIDExMyAxMTcgMjQ4IDE5MyA5IDE4MyAxNjIgMTk3IDIzNCAxMjggMjc5IDcwIAorMTE5IDE2MyAxNSAyNjUgMjcwIDI1NSA2NCA4IDEyMiAyMDQgNjkgMjk0IDIzMiAyNDIgODkgMTY5IDk3IDE2NiAyNyA4NSAzOCAxNTIgCisyNTYgMTU0IDIwMCAyMTAgMTE1IDYxIDMgMTA4IDE2MSA3MSAyMDkgNTQgMTAzIDE3NiAyNjIgMjY1IDM0IDIxIDEwIDM3IDI2IDI0IDgwIAorMjQgMTA5IDI1OCA2OSAyMiAxNjUgMjAyIDE1NCAxNzEgMjc3IDE1NSAyOTcgMSAyMjkgMTcyIDEwMiA4NiA3MCA4MyAyOSAyOSA2NyAKKzEwNyA0MiA0MCA2NyA3OCAxMDkgMjg3IDIgNzYgMjMwIDI5OCAzMyAxNjAgMjQ2IDI3OCAyODEgMjEgNzUgMTA0IDY2IDI2MCA3OCAxNDUgCisxMjAgMjg5IDI0NyAzOCAxNDUgNTUgMjIyIDEwMyAyNDEgMjggMjExIDI3MCAyMjYgMTMxIDQ4IDU3IDIwMiAxOTAgNCAyNjMgMjUgMTk5IAorMTQ5IDI1MSAyMzQgMTU3IDIxMiAzMCAxODQgMjU5IDE5NSAyNTQgMjM5IDc3IDQ4IDI4IDI2OSAxMzYgMzMgMTY3IDE0NiAyMTAgMTgwIAorMTI4IDQzIDEzNyA2NSAxOTIgMjIwIDg1IDI4MSAyODYgMjQyIDExOCAxMDIgNTcgMTM3IDEyMyA1OCAyNyAxMjEgNzggMTM4IDIyMCA1NiAKKzQ3IDIzMiAxNzcgMjIgMTI5IDY4IDE2OCA3NCA3IDI3NSAyNDAgMTc0IDQ2IDE0MiA3OSAyMzUgMjE4IDE3MCAxNTggMzAgMTU1IDI1IAorMjM1IDI4MyAyMzcgMTk4IDU5IDU5IDUyIDI0NiAxMyAyMCAyMTQgMzkgNiAyMTQgMjgyIDQ2IDEwNiAyNDYgMjQ5IDQ3IDI2OCAxMCA4IAorOTMgMjcxIDE1IDIyIDEzNiAyNjkgMTAwIDIwMCAyNzUgMTgyIDcgMzIgMTA2IDI4MiA4MiAyNDAgMjMyIDIxMyAxNTYgMTE1IDMyIDcwIAorMTQ4IDk2IDY5IDI5IDY1IDEzNCA1MyA3MSAyNDUgMTg4IDg5IDE0MCAxNjQgMTEyIDU2IDgzIDY1IDE2MyAyODcgMzEgOSAxOTAgNjIgCisxMjkgMTMzIDIzNSAyNDcgMTAzIDIxMiA5NSAyNTEgMjA1IDIyNCAyNTIgNTkgODggNzkgMjA2IDI4NSAxMTYgMTg3IDI4IDI3NiAyNjMgXgorNjQwIDAgMjY0IDY2IDI1MyAxNzYgMjExIDIxOSAxODEgNjkgNSA1MSAyMTYgNzcgNTggMjQxIDI0MyAzMiAyMjMgMTEgMjI0IDIxNSAKKzIyNSAxMDIgMTEzIDMgMTM2IDkzIDEyMyAyNzMgNTYgNzQgMTY1IDIzMCA4NiAyMjQgMzkgMTU3IDI2OCAyODkgMTk3IDI5NSA4MyAxMDUgCisyMTcgMTQgMjkzIDIwMyA1IDEyNyAxMDMgMTkzIDM3IDExNiAxMjIgMjYwIDIzNiA3IDI2OCAzNyAyNDIgMTQ1IDMzIDExMCAyMDEgMTI1IAorMjM4IDEzIDg5IDI5MyAyNyAyMzkgMjAyIDI3OSAxOTQgNTAgMjcgMTg5IDE1NyAxMjcgMTUzIDQ1IDQzIDc4IDEyMSAxMDYgNjkgMjcyIAorMTE5IDE0MSAyMDMgMTY2IDgyIDQyIDUwIDE4OCA1MyA1IDE3NyAxNDggMTUyIDIzNCA0MiAxMDAgMjIgMjA1IDQ2IDE4MiAxMzIgMjYzIAorMTc5IDYzIDI3NSA5NyAxMjkgMTk0IDE5MSA3MiAyNTAgMTA3IDEzMiAxMzcgMjQ3IDI5MCA5OSAyOTYgMjcyIDI5NSAxMTggMzcgODEgCisxOTAgOTQgNjAgMjA2IDEwOSA0NyAyNjAgMTEwIDc1IDE5MyAxNjMgMTM5IDI4OCA0MyAxMjggMjU3IDI1OCAxOSAyNzcgMTIgMjUyIAorMTQ4IDI3OCAxNjYgMTE3IDI3NiAxMjUgNjIgMjQ3IDE2NCA3NiAyMjEgOTYgMTAxIDI2MSAxMzggOCAyNDYgMjI3IDE0MyAxNjggMzIgCis5NyA3OSAxNDkgMzkgMzEgMjQ1IDEyMyAyMSAxOTIgMTM1IDIwNiAyMzUgNzAgMzMgMjg2IDI2OSA1MCA2MiAxMjEgMjMyIDEgNDUgMjk1IAorMjQ0IDYwIDE1NiA2NCAyODggOCAxMDUgOTEgODIgMjE4IDI3IDExMyAyNzAgMjA0IDE4IDI0OSA3OSAxOTkgODQgMTgzIDI4NiAxMjggNSAKKzEgMTcxIDIyNyAxNyAyMzYgMjU5IDIyMyAxODcgMjkyIDE0MCA0OSAzMDEgMjU2IDEwNCAxNTQgMTQ5IDE2NSA1NCAxOCAyOTkgMjE1IAorNDkgMTI1IDE4OCAxNzkgMjggMjUyIDIyIDI1NSA5MSAzMiA4MiAyNjggMTYzIDI2NSAyMjAgMjA5IDIgNTggMTE1IDkgMjU5IDQ3IDIxMCAKKzY1IDE0IDI0MyAxNTggMTU1IDg2IDk4IDE2IDgyIDkyIDk1IDM4IDk0IDEwIDE2MSA0OCA5NyAyNTUgMjE3IDI2NiAyNDggMTQyIDI2NiAKKzEyMiAxMTkgMTkxIDI0OCAxNiAzMiA0NyAzNCA4OCA4OSAyNiA1MCAxMiA3NiA4MCA1MSA0MCA5IDEzMyAyNCA0NCAxOTEgMTIyIDg0IAorMjU5IDE3MyAxNDIgMTQwIDk5IDQ0IDE1IDU0IDE1OSA0MiAyNzYgMzAxIDEzMCAxNzIgNzkgMjc1IDYyIDE5NyAxMTkgMTUgMTgwIDkxIAorMjA4IDE1MCAxOTMgMjg5IDcxIDYxIDIxOSAyMzEgMTE0IDE1NyAxIDIyMSAyNzIgMTY5IDE4NiAyNjQgMjA3IDg3IDIzNyAxNjEgMjI0IAorMTY1IDE4MCA0MSA3MiA4OSAxNTIgMjg0IDg3IDI1MiAyNzQgMjEwIDI0MSAyOTMgNzcgMjg0IDUyIDIyOSAxOTkgMzQgMTM4IDEzNCAKKzE3OCAxNyA2MCAyODIgMjk4IDYxIDkzIDI5OSAzOSAyODMgMjAwIDYyIDcxIDE4NyAyNDIgNCAyOTAgNDkgMjUxIDEyMCA0MyAxMTMgCisxNDQgMTgxIDI0NSA3MyAyNzggNDAgMTg1IDIwMSAyNTEgMjYxIDg4IDI2NSA5NCAxODYgMTM4IDE4NCAyMjMgNjEgNTggNjUgMTc1IAorMTA3IDYgMjA1IDgxIDExNCAyMDcgMTM3IDcxIDExIDE3NCAxNzAgNzMgMTUyIDEwOCAxMTAgMjUgMTQ4IDExIDk4IDI4MyAxNTAgMTcgCisyMjEgMTQ2IDIzNyAxMTEgODggMTMgMTM5IDM2IDE3OSAxODkgMjA3IDI2MyAzIDg2IDQ4IDI3MyAyMSA1MSA5MCA1NCAyODUgNjUgNDkgCisxNzUgMjMzIDI5IDI4MCAyNTcgNiA2NCAzNiA1MyAyNTcgMTMyIDg3IDExMSAyMjkgNTggMjkxIDI4OCAxODQgMTczIDE2IDIwOCAyNCAKKzE3MCAyMTQgMTk3IDE2OSA2MCAzMCA0MSAyMTMgMTM0IDIgMjM0IDkyIDE0NSA4MyAxNTUgNTEgMTY2IDI0MyAyMDggMjAwIDIzOCA0OCAKKzIxIDY2IDIwMyA0MCA1OSAxNzggMTc2IDg1IDE5NiAxMDYgMTk1IDIwNCAxOTQgMTUgNCAyMyAyODMgMjQgMjk2IDE0NiA2MSA0MyAyNTQgCisxODkgMzEgMTk1IDc4IDI2MiAxNTEgMTMwIDIyMiAxMjQgMzQgMTIgMjAyIDEwMyAxMjYgMjE2IDExMiAyOTIgMTQgMTE3IDIyNiA4MCAxIAorMjk3IDE1OSAxODMgMTkgMTUxIDgwIDE3NyAyNzQgODQgNyAyMTggMjk0IDE4MSAxMDQgMjggMTI2IDkwIDE4MCAyMTcgMTQwIDIyNSA2NyAKKzkwIDIzMCAyNjIgMjkyIDI2NiA3MiA3NCAzOSAyOTggMTEgNDggMTQ3IDMwMCAyNzggMjE2IDI1MyAzNSA3NSA2NyAyMzEgNjQgMTEyIAorMjQyIDI3MSAyNjcgMTg1IDc1IDE3IDk1IDIxNCA3MSAyMzcgMjg3IDE1NiAyNDAgNTQgMTQ0IDIwIDI5MCAyMjUgMjI4IDQ1IDE2OSAxMCAKKzI4NyAyODIgMTcyIDEyOSAxOCAxMjMgMTQ3IDEyNCAzMDEgODAgMzYgMjI5IDIzIDU3IDIxMyA4IDcwIDE1OSA3IDQyIDIyNiAyNTYgCisyODAgMTMxIDIxMyBeCis2NDAgMCAyOTEgMTYyIDE2MSA5NCAxNDIgMTQgMTY1IDI2OSAxNDEgMjUxIDI5OCAxNDEgMjkyIDUxIDE3MCAyNTEgMzUgMTk4IDE3IDEwIAorMTU0IDI3OSAxMDUgMTczIDE5MiAyNzIgMjQ5IDc5IDE4IDM2IDI2OCA3NCA4MCAxNzAgMjkyIDkyIDIyNyAyODAgMjEzIDE4MiA0NSA4MCAKKzEyOSAxNTAgNjMgNDkgMjk2IDE4NSAxMTIgNzAgMTI0IDE3MSA1NSAyNjMgNTEgMTI5IDEwOSA2IDIwIDMzIDIwMSA4NCAxNDkgMjE1IAorOTcgMTY4IDMyIDIxNiAyNyAyMzQgMTMzIDI4NyAxMTAgMTE0IDI0OCAxOTAgOSAxODMgMTU2IDE5NCAyMjggMTI1IDI3OSA2NCAxMTYgCisxNjMgOSAyNjUgMjcwIDI1MiA2MSA4IDExNiAyMDQgNjYgMjk0IDIyOSAyMzYgODkgMTYzIDkxIDE2MCAyNCA4NSAyOSAxNDkgMjU2IAorMTU0IDE5NyAyMTAgMTE1IDU1IDEwOCAxNTggNjggMjA5IDQ4IDEwMyAxNzYgMjU5IDI2MiAyNSAxNSAxMCAzMSAyMyAxOCA3NyAyMSAKKzEwMyAyNTggNjkgMTYgMTYyIDIwMiAxNTEgMTcxIDI3NyAxNDkgMjk3IDI5NiAyMjYgMTY5IDk5IDgzIDcwIDgzIDI5IDI2IDY3IDEwMSAKKzM5IDMxIDY0IDc1IDEwNiAyODQgMiA2NyAyMjQgMjk1IDMzIDE2MCAyNDYgMjc1IDI3NSAxMiA2OSA5OCA1NyAyNjAgNjkgMTM5IDExNCAKKzI4OSAyNDcgMzggMTQyIDU1IDIyMiAyOTggMTAwIDIzNSAyMiAyMTEgMjY3IDIyNiAxMjggNDIgNTQgMTk2IDE4NCAxIDI2MCAyNSAxOTYgCisxNDMgMjQ4IDIzMSAxNTEgMjEyIDMwIDE3OCAyNTYgMTk1IDI1NCAyMzkgNzQgMzkgMjggMjYzIDEzMyAyNCAxNjcgMTQzIDIwNyAxNzQgCisxMjIgMzQgMTMxIDY1IDE4NiAyMjAgNzkgMjgxIDI4MyAyMzkgMTE1IDk2IDU3IDEzNyAxMTcgNTIgMTggMTE4IDc4IDEzMiAyMTcgNTMgCis0NCAyMzIgMTc3IDIyIDEyOSA2OCAxNjggMjk1IDc0IDMwMiAyNzUgMjM0IDE3NCA0MCAxMzkgNzMgMjMyIDIxOCAxNjQgMTU4IDI3IAorMTUyIDE5IDIyOSAyNzcgMjMxIDE5MiA1MCA1OSA1MiAyNDAgNCAyMCAyMTQgMzAgMzAxIDIwOCAyODIgNDYgMTA2IDI0MyAyNDkgMzggCisyNjUgNyA1IDkwIDI3MSAxNSAxMyAxMzYgMjY5IDEwMCAxOTQgMjY5IDE4MiA0IDIzIDEwMCAyNzYgNzkgMjQwIDIyNiAyMTAgMTU2IAorMTEyIDI5IDY3IDE0MiA5NiA2MCAyMyA1OSAxMzQgNTAgNjIgMjQyIDE4MiA4NiAxMzcgMTU4IDEwOSA0NyA3NyA2MiAxNjAgMjg3IDI4IAorMTkwIDUzIDEyNiAxMjcgMjM1IDI0NCA5NyAyMDkgODkgMjQ1IDIwNSAyMTggMjQ2IDUzIDg1IDcwIDIwNiAyODUgMTEzIDE4MSAxOSAKKzI3MCAzMCAyNjAgNjYgMjUzIDE3MiAyMDcgMjE1IDE3OSA2MyA1IDQ5IDIxNCA3MSA1NCAyMzcgMjQxIDMwIDIxOSA5IDIyNCAyMTMgCisyMjMgMTAyIDEwOSAzIDEzNCA5MSAxMTkgMjcxIDU2IDcwIDE2NSAyMjggODQgMjIyIDM1IDE1NyAyNjQgMjg1IDE5NSAyOTUgNzcgMTAzIAorMjE3IDEyIDI5MSAyMDMgMzAzIDEyMyAxMDEgMzAyIDE5MyAzNSAxMTYgMTIyIDI1NiAyMzYgNyAyNjggMzMgMjQyIDE0MSAyOSAxMDggCisxOTkgMTI1IDIzOCA3IDg3IDI4OSAyNSAyMzcgMjAwIDI3NyAxOTAgNTAgMjEgMTg1IDE1MyAxMjcgMTUzIDQ1IDM5IDcyIDEyMSAxMDQgCis2NSAyNjggMTE1IDEzNyAxOTkgMTY2IDc2IDM2IDQ2IDE4OCA1MyAzIDE3NSAxNDggMTQ4IDIzMCA0MCA5OCAxNiAyMDMgNDAgMTgwIAorMTMwIDI2MSAxNzcgNjMgMjcxIDk3IDEyNyAxOTQgMTg3IDY4IDI1MCAxMDUgMTMyIDEzNSAyNDMgMjkwIDk1IDI5NCAyNzAgMjkzIDExOCAKKzM3IDc1IDE4OCA5NCA2MCAyMDQgMTA3IDQ3IDI1OCAxMTAgNzMgMTkxIDE2MSAxMzUgMjg0IDQzIDEyNCAyNTMgMjU0IDE3IDI3MyAxMiAKKzI1MCAxNDYgMjc0IDE2NCAxMTcgMjc0IDEyMyA2MCAyNDUgMTY0IDc2IDIxNyA5NCAxMDEgMjYxIDEzNiA2IDI0MiAyMjMgMTQzIDE2NiAKKzMyIDkzIDc1IDE0NyAzNyAzMSAyNDUgMTIzIDE5IDE4OCAxMzUgMjAyIDIzMyA2NiAzMSAyODYgMjY1IDQ4IDYyIDExOSAyMzAgMzAzIAorNDEgMjkxIDI0NCA1NiAxNTIgNjAgMjg2IDIgMTA1IDkxIDc4IDIxNCAyNyAxMTEgMjY2IDIwMCAxNCAyNDcgNzkgMTk5IDg0IDE4MSAKKzI4MiAxMjggMSAzMDEgMTY3IDIyNSAxNyAyMzIgMjU5IDIyMSAxODcgMjkwIDEzNiA0NyAyOTkgMjUyIDEwMiAxNTAgMTQ1IDE2MyA1MCAKKzE4IDI5OSAyMTEgNDUgMTIxIDE4NiAxNzkgMjIgMjUyIDIwIDI1NSA4NyAyNiA4MiAyNjYgMTU5IDI2MSAyMTggMjA1IDMwMCA1NiAxMTEgCiszIDI1NyA0MyAyMDYgNjMgOCAyMzkgMTU2IDE1MyA4NiA5NiAxNiA4MCA4OCA5MyAzNCA5MCA4IDE1NyA0MiA5NSAyNTMgMjEzIDI2NCAKKzI0NCAxMzggMjY2IDExOCAxMTkgMTg5IDI0NiA3OSBeCis2NTAgMCAyNCAzNSAyMiA3NiA4MSAyNiAzOCA4IDY4IDgwIDQzIDMyIDEgMTI5IDI0IDQ0IDE5MSAxMTggNzIgMjUxIDE2NSAxMzggMTQwIAorOTkgNDAgMTEgNTQgMTUxIDQyIDI3NiAzMDEgMTIyIDE2NCA2NyAyNzEgNTAgMTg5IDExNSA3IDE4MCA4NyAyMDAgMTQ2IDE4NSAyODUgCis2NyA1MyAyMTkgMjMxIDEwNiAxNTMgMSAyMTcgMjcyIDE2NSAxODIgMjY0IDE5OSA3NSAyMzcgMTU3IDIxNiAxNTcgMTcyIDMzIDcyIDc3IAorMTUyIDI4MCA4NyAyNDQgMjcwIDIwNiAyNDEgMjkzIDc3IDI4NCA0MCAyMjkgMTkxIDMwIDEzMCAxMzAgMTc0IDI5OCAxMyA0OCAyNzQgCisyOTggNTcgOTMgMjk1IDI3IDI4MyAxOTYgNTQgNjMgMTc5IDIzNCA0IDI4MiAzNyAyNDMgMTIwIDMxIDExMyAxMzYgMTgxIDIzNyA2OSAKKzI3NCAzNiAxODEgMTkzIDI1MSAyNTMgODAgMjYxIDkwIDE4NiAxMzggMTg0IDIyMyA2MSA0NiA1MyAxNzUgMTA3IDYgMTk3IDgxIDExNCAKKzIwNyAxMjkgNTkgMzA1IDE3MCAxNjIgNzMgMTQ4IDEwMCAxMDIgMTcgMTQwIDExIDk4IDI3NSAxNDIgNSAyMjEgMTQ2IDIyOSAxMDMgODggCis5IDEzOSAyOCAxNzEgMTg5IDIwMyAyNTUgMzAxIDc4IDQwIDI3MyA5IDUxIDg2IDUwIDI3NyA1NyA0OSAxNzEgMjMzIDIxIDI3NiAyNTcgCiszMDQgNjQgMzIgNDUgMjUzIDEyNCA3OSAxMTEgMjIxIDU4IDI4NyAyODggMTc2IDE2OSAxMiAyMDQgMjAgMTcwIDIwNiAxOTcgMTY5IDU2IAorMjIgNDEgMjA1IDEyNiAzMDAgMjM0IDkyIDE0NSA3OSAxNTUgMzkgMTU4IDI0MyAyMDggMjAwIDIzNCA0OCAyMSA1OCAxOTkgNDAgNTUgCisxNzggMTcyIDc3IDE5NiA5OCAxODcgMjAwIDE5MCAzIDIzIDI3OSAxNiAyOTYgMTQyIDQ5IDM5IDI0NiAxODUgMjMgMTkxIDc0IDI1NCAKKzE1MSAxMzAgMjE4IDExNiAzNCA0IDE5NCA5NSAxMjIgMjA4IDExMiAyOTIgNiAxMDkgMjE4IDcyIDI5NSAyODkgMTU5IDE3NSAxOSAxNDMgCis3NiAxNjkgMjc0IDgwIDMwNSAyMTQgMjg2IDE3MyAxMDQgMjAgMTI2IDgyIDE3NiAyMTMgMTM2IDIyNSA1NSA5MCAyMzAgMjYyIDI4NCAKKzI1OCA2MCA3MCAzOSAyOTAgMyA0NCAxNDcgMzAwIDI3OCAyMTYgMjQ1IDM1IDc1IDYzIDIyMyA1MiAxMDQgMjM4IDI2MyAyNjcgMTg1IAorNjcgOSA5NSAyMTAgNzEgMjMzIDI4MyAxNTIgMjM2IDQyIDE0NCA4IDI4NiAyMTcgMjI4IDQxIDE2MSAyIDI3OSAyNzggMTcyIDEyMSAxNCAKKzExOSAxNDMgMTIwIDI5MyA2OCAzNiAyMjUgMTEgNDUgMjA5IDU4IDE1NSAzMDEgMzQgMjIyIDI1MiAyODAgMTMxIDYyIDI5MSAxNjIgCisxNjEgOTAgMTQyIDE0IDE2MyAyNjcgMTQxIDI0OSAyOTQgMTM5IDI5MCA0NyAxNjggMjQ3IDI5IDE5OCAxMyA0IDE1MCAyNzcgMTAxIAorMTczIDE5MiAyNjggMjQ3IDczIDE2IDM0IDI2NiA3MCA3NCAxNjYgMjg4IDg4IDIyNyAyNzYgMjEzIDE4MCA0MyA3NiAxMjUgMTUwIDU5IAorNDMgMjk0IDE4MyAxMDggNjggMTI0IDE2NyA1MyAyNjMgNDkgMTI3IDEwOSAxNCAzMSAyMDEgNzggMzAyIDE0OSAyMTUgOTUgMTY2IDI2IAorMjEyIDIxIDIzMiAxMzMgMjgzIDEwOCAxMTIgMjQ4IDE4OCA5IDE4MyAxNTIgMTkyIDIyNCAxMjMgMjc5IDYwIDExNCAxNjMgNSAyNjUgCisyNzAgMjUwIDU5IDggMTEyIDIwNCA2NCAyOTQgMjI3IDIzMiA4OSAxNTkgODcgMTU2IDIyIDg1IDIzIDE0NyAyNTYgMTU0IDE5NSAyMTAgCisxMTUgNTEgMzA0IDEwOCAxNTYgNjYgMjA5IDQ0IDEwMyAxNzYgMjU3IDI2MCAxOSAxMSAxMCAyNyAyMSAxNCA3NSAxOSA5OSAyNTggNjkgCisxMiAxNjAgMjAyIDE0OSAxNzEgMjc3IDE0NSAyOTcgMjkyIDIyNCAxNjcgOTcgODEgNzAgODMgMjkgMjQgNjcgOTcgMzcgMjUgNjIgNzMgCisxMDQgMjgyIDIgNjEgMjIwIDI5MyAzMyAxNjAgMjQ2IDI3MyAyNzEgNiA2NSA5NCA1MSAyNjAgNjMgMTM1IDExMCAyODkgMjQ3IDM4IAorMTQwIDU1IDIyMiAyOTYgOTggMjMxIDE4IDIxMSAyNjUgMjI2IDEyNiAzOCA1MiAxOTIgMTgwIDMwNSAyNTggMjUgMTk0IDEzOSAyNDYgCisyMjkgMTQ3IDIxMiAzMCAxNzQgMjU0IDE5NSAyNTQgMjM5IDcyIDMzIDI4IDI1OSAxMzEgMTggMTY3IDE0MSAyMDUgMTcwIDExOCAyOCAKKzEyNyA2NSAxODIgMjIwIDc1IDI4MSAyODEgMjM3IDExMyA5MiA1NyAxMzcgMTEzIDQ4IDEyIDExNiA3OCAxMjggMjE1IDUxIDQyIDIzMiAKKzE3NyAyMiAxMjkgNjggMTY4IDI5MSA3NCAyOTggMjc1IDIzMCAxNzQgMzYgMTM3IDY5IDIzMCAyMTggMTYwIDE1OCAyNSAxNTAgMTUgCisyMjUgMjczIDIyNyAxODggNDQgNTkgNTIgMjM2IDMwNCAyMCAyMTQgMjQgMjk3IDIwNCAyODIgNDYgMTA2IDI0MSAyNDkgMzIgMjYzIDUgCiszIDg4IDI3MSAxNSA3IDEzNiAyNjkgMTAwIDE5MCAyNjUgMTgyIDIgMTcgOTYgMjgzIF4KKzY0OSAwIDc2IDI0MCAyMjAgMjA3IDE1NiAxMDkgMjYgNjQgMTM2IDk2IDUxIDE3IDUzIDEzNCA0NyA1MyAyMzkgMTc2IDgzIDEzNCAxNTIgCisxMDYgMzggNzEgNTkgMTU3IDI4NyAyNSAyOTggMTkwIDQ0IDEyMyAxMjEgMjM1IDI0MSA5MSAyMDYgODMgMjM5IDIwNSAyMTIgMjQwIDQ3IAorODIgNjEgMjA2IDI4NSAxMTAgMTc1IDEwIDI2NCAyNCAyNTQgNjYgMjUzIDE2NiAyMDEgMjA5IDE3NiA1NCA1IDQ2IDIxMSA2MiA0OCAKKzIzMSAyMzggMjcgMjEzIDYgMjI0IDIxMCAyMjAgMTAyIDEwMyAzIDEzMSA4OCAxMTMgMjY4IDU2IDY0IDE2NSAyMjUgODEgMjE5IDI5IAorMTU3IDI1OCAyNzkgMTkyIDI5NSA2OCAxMDAgMjE3IDkgMjg4IDIwMyAyOTcgMTE3IDk4IDMwMiAxOTMgMzIgMTE2IDEyMiAyNTAgMjM2IAorNyAyNjggMjcgMjQyIDEzNSAyMyAxMDUgMTk2IDEyNSAyMzggMzA1IDg0IDI4MyAyMiAyMzQgMTk3IDI3NCAxODQgNTAgMTIgMTc5IDE0NyAKKzEyNyAxNTMgNDUgMzMgNjMgMTIxIDEwMSA1OSAyNjIgMTA5IDEzMSAxOTMgMTY2IDY3IDI3IDQwIDE4OCA1MyAxNzIgMTQ4IDE0MiAyMjQgCiszNyA5NSA3IDIwMCAzMSAxNzcgMTI3IDI1OCAxNzQgNjMgMjY1IDk3IDEyNCAxOTQgMTgxIDYyIDI1MCAxMDIgMTMyIDEzMiAyMzcgMjkwIAorODkgMjkxIDI2NyAyOTAgMTE4IDM3IDY2IDE4NSA5NCA2MCAyMDEgMTA0IDQ3IDI1NSAxMTAgNzAgMTg4IDE1OCAxMjkgMjc4IDQzIDExOCAKKzI0NyAyNDggMTQgMjY3IDEyIDI0NyAxNDMgMjY4IDE2MSAxMTcgMjcxIDEyMCA1NyAyNDIgMTY0IDc2IDIxMSA5MSAxMDEgMjYxIDEzMyAKKzMgMjM2IDIxNyAxNDMgMTYzIDMyIDg3IDY5IDE0NCAzNCAzMSAyNDUgMTIzIDE2IDE4MiAxMzUgMTk2IDIzMCA2MCAyOCAyODYgMjU5IAorNDUgNjIgMTE2IDIyNyAzMDMgMzUgMjg1IDI0NCA1MCAxNDYgNTQgMjgzIDMwMCAxMDUgOTEgNzIgMjA4IDI3IDEwOCAyNjAgMTk0IDggCisyNDQgNzkgMTk5IDg0IDE3OCAyNzYgMTI4IDMwMiAyOTggMTYxIDIyMiAxNyAyMjYgMjU5IDIxOCAxODcgMjg3IDEzMCA0NCAyOTYgMjQ2IAorOTkgMTQ0IDEzOSAxNjAgNDQgMTggMjk5IDIwNSAzOSAxMTUgMTgzIDE3OSAxMyAyNTIgMTcgMjU1IDgxIDE3IDgyIDI2MyAxNTMgMjU1IAorMjE1IDE5OSAyOTQgNTMgMTA1IDMwMSAyNTQgMzcgMjAwIDYwIDMwNiAyMzMgMTUzIDE1MCA4NiA5MyAxNiA3NyA4MiA5MCAyOCA4NCA1IAorMTUxIDMzIDkyIDI1MCAyMDcgMjYxIDIzOCAxMzIgMjY2IDExMiAxMTkgMTg2IDI0MyA2IDIyIDMyIDE5IDczIDc5IDI2IDM1IDcgNjYgCis4MCA0MSAzMCAzMDYgMTI4IDI0IDQ0IDE5MSAxMTcgNjkgMjQ5IDE2MyAxMzcgMTQwIDk5IDM5IDEwIDU0IDE0OSA0MiAyNzYgMzAxIAorMTIwIDE2MiA2NCAyNzAgNDcgMTg3IDExNCA1IDE4MCA4NiAxOTggMTQ1IDE4MyAyODQgNjYgNTEgMjE5IDIzMSAxMDQgMTUyIDEgMjE2IAorMjcyIDE2NCAxODEgMjY0IDE5NyA3MiAyMzcgMTU2IDIxNCAxNTUgMTcwIDMxIDcyIDc0IDE1MiAyNzkgODcgMjQyIDI2OSAyMDUgMjQxIAorMjkzIDc3IDI4NCAzNyAyMjkgMTg5IDI5IDEyOCAxMjkgMTczIDI5NyAxMiA0NSAyNzIgMjk4IDU2IDkzIDI5NCAyNCAyODMgMTk1IDUyIAorNjEgMTc3IDIzMiA0IDI4MCAzNCAyNDEgMTIwIDI4IDExMyAxMzQgMTgxIDIzNSA2OCAyNzMgMzUgMTgwIDE5MSAyNTEgMjUxIDc4IDI2MCAKKzg5IDE4NiAxMzggMTg0IDIyMyA2MSA0MyA1MCAxNzUgMTA3IDYgMTk1IDgxIDExNCAyMDcgMTI3IDU2IDMwMyAxNjkgMTYwIDczIDE0NyAKKzk4IDEwMCAxNSAxMzggMTEgOTggMjczIDE0MCAyIDIyMSAxNDYgMjI3IDEwMSA4OCA4IDEzOSAyNiAxNjkgMTg5IDIwMiAyNTMgMzAwIAorNzYgMzggMjczIDYgNTEgODUgNDkgMjc1IDU1IDQ5IDE3MCAyMzMgMTkgMjc1IDI1NyAzMDMgNjQgMzEgNDMgMjUyIDEyMiA3NyAxMTEgCisyMTkgNTggMjg2IDI4OCAxNzQgMTY4IDExIDIwMyAxOSAxNzAgMjA0IDE5NyAxNjkgNTUgMjAgNDEgMjAzIDEyNCAyOTkgMjM0IDkyIAorMTQ1IDc4IDE1NSAzNiAxNTYgMjQzIDIwOCAyMDAgMjMzIDQ4IDIxIDU2IDE5OCA0MCA1NCAxNzggMTcxIDc1IDE5NiA5NiAxODUgMTk5IAorMTg5IDMwNiAyMyAyNzggMTQgMjk2IDE0MSA0NiAzOCAyNDQgMTg0IDIxIDE5MCA3MyAyNTIgMTUxIDEzMCAyMTcgMTE0IDM0IDIgMTkyIAorOTMgMTIxIDIwNiAxMTIgMjkyIDQgMTA3IDIxNiA3MCAyOTMgMjg3IDE1OSAxNzMgMTkgMTQxIDc1IDE2NyAyNzQgNzkgMzA0IDIxMyAKKzI4NCAxNzEgMTA0IDE4IDEyNiA4MCAxNzUgMjEyIDEzNSAyMjUgNTIgOTAgMjMwIDI2MiAyODIgMjU2IDU3IDY5IDM5IDI4OCAxIDQzIAorMTQ3IDMwMCAyNzggMjE2IDI0MyAzNSA3NSA2MiAyMjEgNDkgMTAyIDIzNyAyNjEgMjY3IDE0MCBeCis2NDkgMSA2MSAzIDk1IDIwNyA3MSAyMzAgMjgwIDE0OSAyMzMgMzMgMTQ0IDMwOCAyODMgMjExIDIyOCAzOCAxNTUgMzA1IDI3MyAyNzUgCisxNzIgMTE1IDExIDExNiAxNDAgMTE3IDI4NyA1OSAzNiAyMjIgMiAzNiAyMDYgMzAzIDQ5IDE1MiAyOTUgMjggMjE5IDI0OSAyODAgMTMxIAorNTMgMjkxIDE2MiAxNjEgODQgMTQyIDE0IDE2MCAyNjQgMTQxIDI0NiAyODggMTM2IDI4NyA0MSAxNjUgMjQxIDIwIDE5OCA3IDMwNCAKKzE0NCAyNzQgOTUgMTczIDE5MiAyNjIgMjQ0IDY0IDEzIDMxIDI2MyA2NCA2NSAxNjAgMjgyIDgyIDIyNyAyNzAgMjEzIDE3NyA0MCA3MCAKKzExOSAxNTAgNTMgMzQgMjkxIDE4MCAxMDIgNjUgMTI0IDE2MSA1MCAyNjMgNDYgMTI0IDEwOSAzMDAgNSAyOCAyMDEgNjkgMjk5IDE0OSAKKzIxNSA5MiAxNjMgMTcgMjA2IDEyIDIyOSAxMzMgMjc3IDEwNSAxMDkgMjQ4IDE4NSA5IDE4MyAxNDYgMTg5IDIxOCAxMjAgMjc5IDU0IAorMTExIDE2MyAzMDggMjY1IDI3MCAyNDcgNTYgOCAxMDYgMjA0IDYxIDI5NCAyMjQgMjI2IDg5IDE1MyA4MSAxNTAgMTkgODUgMTQgMTQ0IAorMjU2IDE1NCAxOTIgMjEwIDExNSA0NSAzMDQgMTA4IDE1MyA2MyAyMDkgMzggMTAzIDE3NiAyNTQgMjU3IDEwIDUgMTAgMjEgMTggOCA3MiAKKzE2IDkzIDI1OCA2OSA2IDE1NyAyMDIgMTQ2IDE3MSAyNzcgMTM5IDI5NyAyODYgMjIxIDE2NCA5NCA3OCA3MCA4MyAyOSAyMSA2NyA5MSAKKzM0IDE2IDU5IDcwIDEwMSAyNzkgMiA1MiAyMTQgMjkwIDMzIDE2MCAyNDYgMjcwIDI2NSAzMDYgNTkgODggNDIgMjYwIDU0IDEyOSAxMDQgCisyODkgMjQ3IDM4IDEzNyA1NSAyMjIgMjkzIDk1IDIyNSAxMiAyMTEgMjYyIDIyNiAxMjMgMzIgNDkgMTg2IDE3NCAzMDUgMjU1IDI1IAorMTkxIDEzMyAyNDMgMjI2IDE0MSAyMTIgMzAgMTY4IDI1MSAxOTUgMjU0IDIzOSA2OSAyNCAyOCAyNTMgMTI4IDkgMTY3IDEzOCAyMDIgCisxNjQgMTEyIDE5IDEyMSA2NSAxNzYgMjIwIDY5IDI4MSAyNzggMjM0IDExMCA4NiA1NyAxMzcgMTA3IDQyIDMgMTEzIDc4IDEyMiAyMTIgCis0OCAzOSAyMzIgMTc3IDIyIDEyOSA2OCAxNjggMjg1IDc0IDI5MiAyNzUgMjI0IDE3NCAzMCAxMzQgNjMgMjI3IDIxOCAxNTQgMTU4IDIyIAorMTQ3IDkgMjE5IDI2NyAyMjEgMTgyIDM1IDU5IDUyIDIzMCAyOTggMjAgMjE0IDE1IDI5MSAxOTggMjgyIDQ2IDEwNiAyMzggMjQ5IDIzIAorMjYwIDIgODUgMjcxIDE1IDMwNyAxMzYgMjY5IDEwMCAxODQgMjU5IDE4MiAzMDggOCA5MCAyNjYgNzQgMjQwIDIxNiAyMDUgMTU2IDEwNyAKKzI0IDYyIDEzMiA5NiA0NSAxMyA0OSAxMzQgNDUgNDcgMjM3IDE3MiA4MSAxMzIgMTQ4IDEwNCAzMiA2NyA1NyAxNTUgMjg3IDIzIDI5NCAKKzE5MCAzOCAxMjEgMTE3IDIzNSAyMzkgODcgMjA0IDc5IDIzNSAyMDUgMjA4IDIzNiA0MyA4MCA1NSAyMDYgMjg1IDEwOCAxNzEgNCAyNjAgCisyMCAyNTAgNjYgMjUzIDE2MiAxOTcgMjA1IDE3NCA0OCA1IDQ0IDIwOSA1NiA0NCAyMjcgMjM2IDI1IDIwOSA0IDIyNCAyMDggMjE4IAorMTAyIDk5IDMgMTI5IDg2IDEwOSAyNjYgNTYgNjAgMTY1IDIyMyA3OSAyMTcgMjUgMTU3IDI1NCAyNzUgMTkwIDI5NSA2MiA5OCAyMTcgNyAKKzI4NiAyMDMgMjkzIDExMyA5NiAzMDIgMTkzIDMwIDExNiAxMjIgMjQ2IDIzNiA3IDI2OCAyMyAyNDIgMTMxIDE5IDEwMyAxOTQgMTI1IAorMjM4IDMwMSA4MiAyNzkgMjAgMjMyIDE5NSAyNzIgMTgwIDUwIDYgMTc1IDE0MyAxMjcgMTUzIDQ1IDI5IDU3IDEyMSA5OSA1NSAyNTggCisxMDUgMTI3IDE4OSAxNjYgNjEgMjEgMzYgMTg4IDUzIDMwNyAxNzAgMTQ4IDEzOCAyMjAgMzUgOTMgMSAxOTggMjUgMTc1IDEyNSAyNTYgCisxNzIgNjMgMjYxIDk3IDEyMiAxOTQgMTc3IDU4IDI1MCAxMDAgMTMyIDEzMCAyMzMgMjkwIDg1IDI4OSAyNjUgMjg4IDExOCAzNyA2MCAKKzE4MyA5NCA2MCAxOTkgMTAyIDQ3IDI1MyAxMTAgNjggMTg2IDE1NiAxMjUgMjc0IDQzIDExNCAyNDMgMjQ0IDEyIDI2MyAxMiAyNDUgCisxNDEgMjY0IDE1OSAxMTcgMjY5IDExOCA1NSAyNDAgMTY0IDc2IDIwNyA4OSAxMDEgMjYxIDEzMSAxIDIzMiAyMTMgMTQzIDE2MSAzMiAKKzgzIDY1IDE0MiAzMiAzMSAyNDUgMTIzIDE0IDE3OCAxMzUgMTkyIDIyOCA1NiAyNiAyODYgMjU1IDQzIDYyIDExNCAyMjUgMzAzIDMxIAorMjgxIDI0NCA0NiAxNDIgNTAgMjgxIDI5NiAxMDUgOTEgNjggMjA0IDI3IDEwNiAyNTYgMTkwIDQgMjQyIDc5IDE5OSA4NCAxNzYgMjcyIAorMTI4IDMwMCAyOTYgMTU3IDIyMCAxNyAyMjIgMjU5IDIxNiAxODcgMjg1IDEyNiA0MiAyOTQgMjQyIDk3IDE0MCAxMzUgMTU4IDQwIDE4IAorMjk5IDIwMSAzNSAxMTEgMTgxIDE3OSA3IDI1MiAxNSAyNTUgNzcgMTEgODIgMjYxIDE0OSAyNTEgNjkgXgorNjU1IDAgMTkxIDI4NiA0OSA5NyAyOTMgMjUwIDI5IDE5MiA1NiAyOTggMjI1IDE0OSAxNDYgODYgODkgMTYgNzMgNzQgODYgMjAgNzYgMSAKKzE0MyAyMSA4OCAyNDYgMTk5IDI1NyAyMzAgMTI0IDI2NiAxMDQgMTE5IDE4MiAyMzkgMzA5IDE0IDIwIDcgNjEgNzEgMjYgMjMgMyA1OCAKKzgwIDMzIDIyIDMwMiAxMjQgMjQgNDQgMTkxIDExMyA1NyAyNDEgMTU1IDEzMyAxNDAgOTkgMzUgNiA1NCAxNDEgNDIgMjc2IDMwMSAxMTIgCisxNTQgNTIgMjY2IDM1IDE3OSAxMTAgMzA4IDE4MCA4MiAxOTAgMTQxIDE3NSAyODAgNjIgNDMgMjE5IDIzMSA5NiAxNDggMSAyMTIgMjcyIAorMTYwIDE3NyAyNjQgMTg5IDYwIDIzNyAxNTIgMjA2IDE0NyAxNjIgMjMgNzIgNjIgMTUyIDI3NSA4NyAyMzQgMjY1IDIwMSAyNDEgMjkzIAorNzcgMjg0IDI1IDIyOSAxODEgMjUgMTIwIDEyNSAxNjkgMjkzIDggMzMgMjY0IDI5OCA1MiA5MyAyOTAgMTIgMjgzIDE5MSA0NCA1MyAKKzE2OSAyMjQgNCAyNzIgMjIgMjMzIDEyMCAxNiAxMTMgMTI2IDE4MSAyMjcgNjQgMjY5IDMxIDE3NiAxODMgMjUxIDI0MyA3MCAyNTYgODUgCisxODYgMTM4IDE4NCAyMjMgNjEgMzEgMzggMTc1IDEwNyA2IDE4NyA4MSAxMTQgMjA3IDExOSA0NCAyOTUgMTY1IDE1MiA3MyAxNDMgOTAgCis5MiA3IDEzMCAxMSA5OCAyNjUgMTMyIDMwMSAyMjEgMTQ2IDIxOSA5MyA4OCA0IDEzOSAxOCAxNjEgMTg5IDE5OCAyNDUgMjk2IDY4IDMwIAorMjczIDMwNSA1MSA4MSA0NSAyNjcgNDcgNDkgMTY2IDIzMyAxMSAyNzEgMjU3IDI5OSA2NCAyNyAzNSAyNDggMTE0IDY5IDExMSAyMTEgCis1OCAyODIgMjg4IDE2NiAxNjQgNyAxOTkgMTUgMTcwIDE5NiAxOTcgMTY5IDUxIDEyIDQxIDE5NSAxMTYgMjk1IDIzNCA5MiAxNDUgNzQgCisxNTUgMjQgMTQ4IDI0MyAyMDggMjAwIDIyOSA0OCAyMSA0OCAxOTQgNDAgNTAgMTc4IDE2NyA2NyAxOTYgODggMTc3IDE5NSAxODUgMjk5IAorMzA2IDIzIDI3NCA2IDI5NiAxMzcgMzQgMzQgMjM2IDE4MCAxMyAxODYgNjkgMjQ0IDE1MSAxMzAgMjEzIDEwNiAzNCAzMDUgMTg0IDg1IAorMTE3IDE5OCAxMTIgMjkyIDMwNyA5OSAyMDggNjIgMjg1IDI3OSAxNTkgMTY1IDE5IDEzMyA3MSAxNTkgMjc0IDc1IDMwMCAyMDkgMjc2IAorMTYzIDEwNCAxMCAxMjYgNzIgMTcxIDIwOCAxMzEgMjI1IDQwIDkwIDIzMCAyNjIgMjc0IDI0OCA0NSA2NSAzOSAyODAgMzA0IDM5IDE0NyAKKzMwMCAyNzggMjE2IDIzNSAzNSA3NSA1OCAyMTMgMzcgOTQgMjMzIDI1MyAyNjcgMTg1IDU3IDMxMCA5NSAyMDUgNzEgMjI4IDI3OCAxNDcgCisyMzEgMjcgMTQ0IDMwNCAyODEgMjA3IDIyOCAzNiAxNTEgMzAzIDI2OSAyNzMgMTcyIDExMSA5IDExNCAxMzggMTE1IDI4MyA1MyAzNiAKKzIyMCAzMDcgMzAgMjA0IDMwMSA0MyAxNTAgMjkxIDI0IDIxNyAyNDcgMjgwIDEzMSA0NyAyOTEgMTYyIDE2MSA4MCAxNDIgMTQgMTU4IAorMjYyIDE0MSAyNDQgMjg0IDEzNCAyODUgMzcgMTYzIDIzNyAxNCAxOTggMyAzMDAgMTQwIDI3MiA5MSAxNzMgMTkyIDI1OCAyNDIgNTggCisxMSAyOSAyNjEgNjAgNTkgMTU2IDI3OCA3OCAyMjcgMjY2IDIxMyAxNzUgMzggNjYgMTE1IDE1MCA0OSAyOCAyODkgMTc4IDk4IDYzIAorMTI0IDE1NyA0OCAyNjMgNDQgMTIyIDEwOSAyOTYgMzEwIDI2IDIwMSA2MyAyOTcgMTQ5IDIxNSA5MCAxNjEgMTEgMjAyIDYgMjI3IDEzMyAKKzI3MyAxMDMgMTA3IDI0OCAxODMgOSAxODMgMTQyIDE4NyAyMTQgMTE4IDI3OSA1MCAxMDkgMTYzIDMwNiAyNjUgMjcwIDI0NSA1NCA4IAorMTAyIDIwNCA1OSAyOTQgMjIyIDIyMiA4OSAxNDkgNzcgMTQ2IDE3IDg1IDggMTQyIDI1NiAxNTQgMTkwIDIxMCAxMTUgNDEgMzA0IDEwOCAKKzE1MSA2MSAyMDkgMzQgMTAzIDE3NiAyNTIgMjU1IDQgMSAxMCAxNyAxNiA0IDcwIDE0IDg5IDI1OCA2OSAyIDE1NSAyMDIgMTQ0IDE3MSAKKzI3NyAxMzUgMjk3IDI4MiAyMTkgMTYyIDkyIDc2IDcwIDgzIDI5IDE5IDY3IDg3IDMyIDEwIDU3IDY4IDk5IDI3NyAyIDQ2IDIxMCAyODggCiszMyAxNjAgMjQ2IDI2OCAyNjEgMzAyIDU1IDg0IDM2IDI2MCA0OCAxMjUgMTAwIDI4OSAyNDcgMzggMTM1IDU1IDIyMiAyOTEgOTMgMjIxIAorOCAyMTEgMjYwIDIyNiAxMjEgMjggNDcgMTgyIDE3MCAzMDUgMjUzIDI1IDE4OSAxMjkgMjQxIDIyNCAxMzcgMjEyIDMwIDE2NCAyNDkgCisxOTUgMjU0IDIzOSA2NyAxOCAyOCAyNDkgMTI2IDMgMTY3IDEzNiAyMDAgMTYwIDEwOCAxMyAxMTcgNjUgMTcyIDIyMCA2NSAyODEgMjc2IAorMjMyIDEwOCA4MiA1NyAxMzcgMTAzIDM4IDMwOCAxMTEgNzggMTE4IDIxMCA0NiAzNyAyMzIgMTc3IDIyIDEyOSA2OCAxNjggMjgxIDc0IAorMjg4IDI3NSAyMjAgMTc0IDI2IDEzMiA1OSAyMjUgMjE4IDE1MCAxNTggMjAgMTQ1IDUgMjE1IDI2MyAxMDAgXgorNjYxIDEgMTc2IDI2IDU5IDUyIDIyNCAyOTIgMjAgMjE0IDYgMjg1IDE5MiAyODIgNDYgMTA2IDIzNSAyNDkgMTQgMjU3IDMxMSAzMDkgCis4MiAyNzEgMTUgMzAxIDEzNiAyNjkgMTAwIDE3OCAyNTMgMTgyIDMwOCAzMTEgODQgMjYwIDcxIDI0MCAyMTAgMjAyIDE1NiAxMDQgMjEgCis1OSAxMjYgOTYgMzYgNyA0MyAxMzQgNDIgMzggMjM0IDE2NiA3OCAxMjkgMTQyIDEwMSAyMyA2MSA1NCAxNTIgMjg3IDIwIDI4OCAxOTAgCisyOSAxMTggMTExIDIzNSAyMzYgODEgMjAxIDczIDIyOSAyMDUgMjAyIDIzMCAzNyA3NyA0NiAyMDYgMjg1IDEwNSAxNjUgMzA3IDI1NCAKKzE0IDI0NCA2NiAyNTMgMTU2IDE5MSAxOTkgMTcxIDM5IDUgNDEgMjA2IDQ3IDM4IDIyMSAyMzMgMjIgMjAzIDEgMjI0IDIwNSAyMTUgCisxMDIgOTMgMyAxMjYgODMgMTAzIDI2MyA1NiA1NCAxNjUgMjIwIDc2IDIxNCAxOSAxNTcgMjQ4IDI2OSAxODcgMjk1IDUzIDk1IDIxNyA0IAorMjgzIDIwMyAyODcgMTA3IDkzIDMwMiAxOTMgMjcgMTE2IDEyMiAyNDAgMjM2IDcgMjY4IDE3IDI0MiAxMjUgMTMgMTAwIDE5MSAxMjUgCisyMzggMjk1IDc5IDI3MyAxNyAyMjkgMTkyIDI2OSAxNzQgNTAgMzA5IDE2OSAxMzcgMTI3IDE1MyA0NSAyMyA0OCAxMjEgOTYgNDkgMjUyIAorOTkgMTIxIDE4MyAxNjYgNTIgMTIgMzAgMTg4IDUzIDMwNyAxNjcgMTQ4IDEzMiAyMTQgMzIgOTAgMzA0IDE5NSAxNiAxNzIgMTIyIDI1MyAKKzE2OSA2MyAyNTUgOTcgMTE5IDE5NCAxNzEgNTIgMjUwIDk3IDEzMiAxMjcgMjI3IDI5MCA3OSAyODYgMjYyIDI4NSAxMTggMzcgNTEgCisxODAgOTQgNjAgMTk2IDk5IDQ3IDI1MCAxMTAgNjUgMTgzIDE1MyAxMTkgMjY4IDQzIDEwOCAyMzcgMjM4IDkgMjU3IDEyIDI0MiAxMzggCisyNTggMTU2IDExNyAyNjYgMTE1IDUyIDIzNyAxNjQgNzYgMjAxIDg2IDEwMSAyNjEgMTI4IDMxMCAyMjYgMjA3IDE0MyAxNTggMzIgNzcgCis1OSAxMzkgMjkgMzEgMjQ1IDEyMyAxMSAxNzIgMTM1IDE4NiAyMjUgNTAgMjMgMjg2IDI0OSA0MCA2MiAxMTEgMjIyIDMwMyAyNSAyNzUgCisyNDQgNDAgMTM2IDQ0IDI3OCAyOTAgMTA1IDkxIDYyIDE5OCAyNyAxMDMgMjUwIDE4NCAzMTAgMjM5IDc5IDE5OSA4NCAxNzMgMjY2IAorMTI4IDI5NyAyOTMgMTUxIDIxNyAxNyAyMTYgMjU5IDIxMyAxODcgMjgyIDEyMCAzOSAyOTEgMjM2IDk0IDEzNCAxMjkgMTU1IDM0IDE4IAorMjk5IDE5NSAyOSAxMDUgMTc4IDE3OSAzMTAgMjUyIDEyIDI1NSA3MSAyIDgyIDI1OCAxNDMgMjQ1IDIxMCAxODkgMjg0IDQ4IDk1IDI5MSAKKzI0OSAyNyAxOTAgNTUgMjk2IDIyMyAxNDggMTQ1IDg2IDg4IDE2IDcyIDcyIDg1IDE4IDc0IDE0MSAxOCA4NyAyNDUgMTk3IDI1NiAyMjggCisxMjIgMjY2IDEwMiAxMTkgMTgxIDIzOCAzMDggMTIgMTcgNCA1OCA2OSAyNiAyMCAyIDU2IDgwIDMxIDIwIDMwMSAxMjMgMjQgNDQgMTkxIAorMTEyIDU0IDIzOSAxNTMgMTMyIDE0MCA5OSAzNCA1IDU0IDEzOSA0MiAyNzYgMzAxIDExMCAxNTIgNDkgMjY1IDMyIDE3NyAxMDkgMzA3IAorMTgwIDgxIDE4OCAxNDAgMTczIDI3OSA2MSA0MSAyMTkgMjMxIDk0IDE0NyAxIDIxMSAyNzIgMTU5IDE3NiAyNjQgMTg3IDU3IDIzNyAKKzE1MSAyMDQgMTQ1IDE2MCAyMSA3MiA1OSAxNTIgMjc0IDg3IDIzMiAyNjQgMjAwIDI0MSAyOTMgNzcgMjg0IDIyIDIyOSAxNzkgMjQgCisxMTggMTI0IDE2OCAyOTIgNyAzMCAyNjIgMjk4IDUxIDkzIDI4OSA5IDI4MyAxOTAgNDIgNTEgMTY3IDIyMiA0IDI3MCAxOSAyMzEgMTIwIAorMTMgMTEzIDEyNCAxODEgMjI1IDYzIDI2OCAzMCAxNzUgMTgxIDI1MSAyNDEgNjggMjU1IDg0IDE4NiAxMzggMTg0IDIyMyA2MSAyOCAzNSAKKzE3NSAxMDcgNiAxODUgODEgMTE0IDIwNyAxMTcgNDEgMjkzIDE2NCAxNTAgNzMgMTQyIDg4IDkwIDUgMTI4IDExIDk4IDI2MyAxMzAgCisyOTkgMjIxIDE0NiAyMTcgOTEgODggMyAxMzkgMTYgMTU5IDE4OSAxOTcgMjQzIDI5NSA2NiAyOCAyNzMgMzAzIDUxIDgwIDQ0IDI2NSAKKzQ1IDQ5IDE2NSAyMzMgOSAyNzAgMjU3IDI5OCA2NCAyNiAzMyAyNDcgMTEyIDY3IDExMSAyMDkgNTggMjgxIDI4OCAxNjQgMTYzIDYgCisxOTggMTQgMTcwIDE5NCAxOTcgMTY5IDUwIDEwIDQxIDE5MyAxMTQgMjk0IDIzNCA5MiAxNDUgNzMgMTU1IDIxIDE0NiAyNDMgMjA4IAorMjAwIDIyOCA0OCAyMSA0NiAxOTMgNDAgNDkgMTc4IDE2NiA2NSAxOTYgODYgMTc1IDE5NCAxODQgMjk3IDMwNiAyMyAyNzMgNCAyOTYgCisxMzYgMzEgMzMgMjM0IDE3OSAxMSAxODUgNjggMjQyIDE1MSAxMzAgMjEyIDEwNCAzNCAzMDQgMTgyIDgzIDExNiAxOTYgMTEyIDI5MiAKKzMwNiA5NyAyMDYgNjAgMjgzIDI3NyAxNTkgMTYzIDE5IDEzMSA3MCAxNTcgMjc0IDc0IDI5OSAyMDggMjc0IDE2MSAxMDQgOCAxMjYgNzAgCisxNzAgMjA3IDEzMCAyMjUgMzcgOTAgMjMwIDE5NCBeCis2NDMgMCAyNjggMjQyIDM2IDYyIDM5IDI3NCAzMDEgMzYgMTQ3IDMwMCAyNzggMjE2IDIyOSAzNSA3NSA1NSAyMDcgMjggODggMjMwIAorMjQ3IDI2NyAxODUgNTEgMzA3IDk1IDIwMiA3MSAyMjUgMjc1IDE0NCAyMjggMTggMTQ0IDI5OCAyNzggMjAxIDIyOCAzMyAxNDUgMzAwIAorMjYzIDI3MCAxNzIgMTA1IDYgMTExIDEzNSAxMTIgMjc3IDQ0IDM2IDIxNyAzMDEgMjEgMjAxIDI5OCAzNCAxNDcgMjg1IDE4IDIxNCAKKzI0NCAyODAgMTMxIDM4IDI5MSAxNjIgMTYxIDc0IDE0MiAxNCAxNTUgMjU5IDE0MSAyNDEgMjc4IDEzMSAyODIgMzEgMTYwIDIzMSA1IAorMTk4IDMxMSAyOTQgMTM0IDI2OSA4NSAxNzMgMTkyIDI1MiAyMzkgNDkgOCAyNiAyNTggNTQgNTAgMTUwIDI3MiA3MiAyMjcgMjYwIDIxMyAKKzE3MiAzNSA2MCAxMDkgMTUwIDQzIDE5IDI4NiAxNzUgOTIgNjAgMTI0IDE1MSA0NSAyNjMgNDEgMTE5IDEwOSAyOTAgMzA0IDIzIDIwMSAKKzU0IDI5NCAxNDkgMjE1IDg3IDE1OCAyIDE5NiAzMTEgMjI0IDEzMyAyNjcgMTAwIDEwNCAyNDggMTgwIDkgMTgzIDEzNiAxODQgMjA4IAorMTE1IDI3OSA0NCAxMDYgMTYzIDMwMyAyNjUgMjcwIDI0MiA1MSA4IDk2IDIwNCA1NiAyOTQgMjE5IDIxNiA4OSAxNDMgNzEgMTQwIDE0IAorODUgMzEzIDEzOSAyNTYgMTU0IDE4NyAyMTAgMTE1IDM1IDMwNCAxMDggMTQ4IDU4IDIwOSAyOCAxMDMgMTc2IDI0OSAyNTIgMzA5IDMwOSAKKzEwIDExIDEzIDMxMiA2NyAxMSA4MyAyNTggNjkgMzEwIDE1MiAyMDIgMTQxIDE3MSAyNzcgMTI5IDI5NyAyNzYgMjE2IDE1OSA4OSA3MyAKKzcwIDgzIDI5IDE2IDY3IDgxIDI5IDEgNTQgNjUgOTYgMjc0IDIgMzcgMjA0IDI4NSAzMyAxNjAgMjQ2IDI2NSAyNTUgMjk2IDQ5IDc4IAorMjcgMjYwIDM5IDExOSA5NCAyODkgMjQ3IDM4IDEzMiA1NSAyMjIgMjg4IDkwIDIxNSAyIDIxMSAyNTcgMjI2IDExOCAyMiA0NCAxNzYgCisxNjQgMzA1IDI1MCAyNSAxODYgMTIzIDIzOCAyMjEgMTMxIDIxMiAzMCAxNTggMjQ2IDE5NSAyNTQgMjM5IDY0IDkgMjggMjQzIDEyMyAKKzMwOCAxNjcgMTMzIDE5NyAxNTQgMTAyIDQgMTExIDY1IDE2NiAyMjAgNTkgMjgxIDI3MyAyMjkgMTA1IDc2IDU3IDEzNyA5NyAzMiAzMDIgCisxMDggNzggMTEyIDIwNyA0MyAzNCAyMzIgMTc3IDIyIDEyOSA2OCAxNjggMjc1IDc0IDI4MiAyNzUgMjE0IDE3NCAyMCAxMjkgNTMgMjIyIAorMjE4IDE0NCAxNTggMTcgMTQyIDMxMyAyMDkgMjU3IDIxMSAxNzIgMjAgNTkgNTIgMjIwIDI4OCAyMCAyMTQgMjgxIDE4OCAyODIgNDYgCisxMDYgMjMzIDI0OSA4IDI1NSAzMTEgMzA5IDgwIDI3MSAxNSAyOTcgMTM2IDI2OSAxMDAgMTc0IDI0OSAxODIgMzA4IDMwNyA4MCAyNTYgCis2OSAyNDAgMjA2IDIwMCAxNTYgMTAyIDE5IDU3IDEyMiA5NiAzMCAzIDM5IDEzNCA0MCAzMiAyMzIgMTYyIDc2IDEyNyAxMzggOTkgMTcgCis1NyA1MiAxNTAgMjg3IDE4IDI4NCAxOTAgMjMgMTE2IDEwNyAyMzUgMjM0IDc3IDE5OSA2OSAyMjUgMjA1IDE5OCAyMjYgMzMgNzUgNDAgCisyMDYgMjg1IDEwMyAxNjEgMzAzIDI1MCAxMCAyNDAgNjYgMjUzIDE1MiAxODcgMTk1IDE2OSAzMyA1IDM5IDIwNCA0MSAzNCAyMTcgMjMxIAorMjAgMTk5IDMxMyAyMjQgMjAzIDIxMyAxMDIgODkgMyAxMjQgODEgOTkgMjYxIDU2IDUwIDE2NSAyMTggNzQgMjEyIDE1IDE1NyAyNDQgCisyNjUgMTg1IDI5NSA0NyA5MyAyMTcgMiAyODEgMjAzIDI4MyAxMDMgOTEgMzAyIDE5MyAyNSAxMTYgMTIyIDIzNiAyMzYgNyAyNjggMTMgCisyNDIgMTIxIDkgOTggMTg5IDEyNSAyMzggMjkxIDc3IDI2OSAxNSAyMjcgMTkwIDI2NyAxNzAgNTAgMzA1IDE2NSAxMzMgMTI3IDE1MyAKKzQ1IDE5IDQyIDEyMSA5NCA0NSAyNDggOTUgMTE3IDE3OSAxNjYgNDYgNiAyNiAxODggNTMgMzA3IDE2NSAxNDggMTI4IDIxMCAzMCA4OCAKKzMwMCAxOTMgMTAgMTcwIDEyMCAyNTEgMTY3IDYzIDI1MSA5NyAxMTcgMTk0IDE2NyA0OCAyNTAgOTUgMTMyIDEyNSAyMjMgMjkwIDc1IAorMjg0IDI2MCAyODMgMTE4IDM3IDQ1IDE3OCA5NCA2MCAxOTQgOTcgNDcgMjQ4IDExMCA2MyAxODEgMTUxIDExNSAyNjQgNDMgMTA0IDIzMyAKKzIzNCA3IDI1MyAxMiAyNDAgMTM2IDI1NCAxNTQgMTE3IDI2NCAxMTMgNTAgMjM1IDE2NCA3NiAxOTcgODQgMTAxIDI2MSAxMjYgMzEwIAorMjIyIDIwMyAxNDMgMTU2IDMyIDczIDU1IDEzNyAyNyAzMSAyNDUgMTIzIDkgMTY4IDEzNSAxODIgMjIzIDQ2IDIxIDI4NiAyNDUgMzggCis2MiAxMDkgMjIwIDMwMyAyMSAyNzEgMjQ0IDM2IDEzMiA0MCAyNzYgMjg2IDEwNSA5MSA1OCAxOTQgMjcgMTAxIDI0NiAxODAgMzA4IAorMjM3IDc5IDE5OSA4NCAxNzEgMjYyIDEyOCAyOTUgMjkxIDE0NyAyMTUgMTcgMjEyIDI1OSAyMTkgXgorNjUyIDEgMTg3IDI3OCAxMTIgMzUgMjg3IDIyOCA5MCAxMjYgMTIxIDE1MSAyNiAxOCAyOTkgMTg3IDIxIDk3IDE3NCAxNzkgMzAyIDI1MiAKKzggMjU1IDYzIDMwNiA4MiAyNTQgMTM1IDIzNyAyMDYgMTgxIDI3NiA0NCA4NyAyODMgMjQ1IDE5IDE4MiA1MSAyODggMjE1IDE0NCAxNDEgCis4NiA4NCAxNiA2OCA2NCA4MSAxMCA2NiAzMTIgMTMzIDYgODMgMjQxIDE4OSAyNTIgMjIwIDExNCAyNjYgOTQgMTE5IDE3NyAyMzQgMzA0IAorNCA1IDMwOCA0NiA2MSAyNiA4IDMxNCA0OCA4MCAyMyAxMiAyOTcgMTE5IDI0IDQ0IDE5MSAxMDggNDIgMjMxIDE0NSAxMjggMTQwIDk5IAorMzAgMSA1NCAxMzEgNDIgMjc2IDMwMSAxMDIgMTQ0IDM3IDI2MSAyMCAxNjkgMTA1IDMwMyAxODAgNzcgMTgwIDEzNiAxNjUgMjc1IDU3IAorMzMgMjE5IDIzMSA4NiAxNDMgMSAyMDcgMjcyIDE1NSAxNzIgMjY0IDE3OSA0NSAyMzcgMTQ3IDE5NiAxMzcgMTUyIDEzIDcyIDQ3IDE1MiAKKzI3MCA4NyAyMjQgMjYwIDE5NiAyNDEgMjkzIDc3IDI4NCAxMCAyMjkgMTcxIDIwIDExMCAxMjAgMTY0IDI4OCAzIDE4IDI1NCAyOTggNDcgCis5MyAyODUgMzEzIDI4MyAxODYgMzQgNDMgMTU5IDIxNCA0IDI2MiA3IDIyMyAxMjAgMSAxMTMgMTE2IDE4MSAyMTcgNTkgMjY0IDI2IAorMTcxIDE3MyAyNTEgMjMzIDYwIDI1MSA4MCAxODYgMTM4IDE4NCAyMjMgNjEgMTYgMjMgMTc1IDEwNyA2IDE3NyA4MSAxMTQgMjA3IDEwOSAKKzI5IDI4NSAxNjAgMTQyIDczIDEzOCA4MCA4MiAzMTMgMTIwIDExIDk4IDI1NSAxMjIgMjkxIDIyMSAxNDYgMjA5IDgzIDg4IDMxNSAxMzkgCis4IDE1MSAxODkgMTkzIDIzNSAyOTEgNTggMjAgMjczIDI5NSA1MSA3NiA0MCAyNTcgMzcgNDkgMTYxIDIzMyAxIDI2NiAyNTcgMjk0IDY0IAorMjIgMjUgMjQzIDEwNCA1OSAxMTEgMjAxIDU4IDI3NyAyODggMTU2IDE1OSAyIDE5NCAxMCAxNzAgMTg2IDE5NyAxNjkgNDYgMiA0MSAKKzE4NSAxMDYgMjkwIDIzNCA5MiAxNDUgNjkgMTU1IDkgMTM4IDI0MyAyMDggMjAwIDIyNCA0OCAyMSAzOCAxODkgNDAgNDUgMTc4IDE2MiAKKzU3IDE5NiA3OCAxNjcgMTkwIDE4MCAyODkgMzA2IDIzIDI2OSAzMTIgMjk2IDEzMiAxOSAyOSAyMjYgMTc1IDMgMTgxIDY0IDIzNCAxNTEgCisxMzAgMjA4IDk2IDM0IDMwMCAxNzQgNzUgMTEyIDE4OCAxMTIgMjkyIDMwMiA4OSAxOTggNTIgMjc1IDI2OSAxNTkgMTU1IDE5IDEyMyAKKzY2IDE0OSAyNzQgNzAgMjk1IDIwNCAyNjYgMTUzIDEwNCAxMjYgNjIgMTY2IDIwMyAxMjYgMjI1IDI1IDkwIDIzMCAyNjIgMjY0IDIzOCAKKzMwIDYwIDM5IDI3MCAyOTkgMzQgMTQ3IDMwMCAyNzggMjE2IDIyNSAzNSA3NSA1MyAyMDMgMjIgODQgMjI4IDI0MyAyNjcgMTg1IDQ3IAorMzA1IDk1IDIwMCA3MSAyMjMgMjczIDE0MiAyMjYgMTIgMTQ0IDI5NCAyNzYgMTk3IDIyOCAzMSAxNDEgMjk4IDI1OSAyNjggMTcyIDEwMSAKKzQgMTA5IDEzMyAxMTAgMjczIDM4IDM2IDIxNSAyOTcgMTUgMTk5IDI5NiAyOCAxNDUgMjgxIDE0IDIxMiAyNDIgMjgwIDEzMSAzMiAyOTEgCisxNjIgMTYxIDcwIDE0MiAxNCAxNTMgMjU3IDE0MSAyMzkgMjc0IDEyOSAyODAgMjcgMTU4IDIyNyAzMTUgMTk4IDMwOSAyOTAgMTMwIAorMjY3IDgxIDE3MyAxOTIgMjQ4IDIzNyA0MyA2IDI0IDI1NiA1MCA0NCAxNDYgMjY4IDY4IDIyNyAyNTYgMjEzIDE3MCAzMyA1NiAxMDUgCisxNTAgMzkgMTMgMjg0IDE3MyA4OCA1OCAxMjQgMTQ3IDQzIDI2MyAzOSAxMTcgMTA5IDI4NiAzMDAgMjEgMjAxIDQ4IDI5MiAxNDkgMjE1IAorODUgMTU2IDMxMiAxOTIgMzA3IDIyMiAxMzMgMjYzIDk4IDEwMiAyNDggMTc4IDkgMTgzIDEzMiAxODIgMjA0IDExMyAyNzkgNDAgMTA0IAorMTYzIDMwMSAyNjUgMjcwIDI0MCA0OSA4IDkyIDIwNCA1NCAyOTQgMjE3IDIxMiA4OSAxMzkgNjcgMTM2IDEyIDg1IDMwOSAxMzcgMjU2IAorMTU0IDE4NSAyMTAgMTE1IDMxIDMwNCAxMDggMTQ2IDU2IDIwOSAyNCAxMDMgMTc2IDI0NyAyNTAgMzA1IDMwNyAxMCA3IDExIDMxMCA2NSAKKzkgNzkgMjU4IDY5IDMwOCAxNTAgMjAyIDEzOSAxNzEgMjc3IDEyNSAyOTcgMjcyIDIxNCAxNTcgODcgNzEgNzAgODMgMjkgMTQgNjcgNzcgCisyNyAzMTEgNTIgNjMgOTQgMjcyIDIgMzEgMjAwIDI4MyAzMyAxNjAgMjQ2IDI2MyAyNTEgMjkyIDQ1IDc0IDIxIDI2MCAzMyAxMTUgOTAgCisyODkgMjQ3IDM4IDEzMCA1NSAyMjIgMjg2IDg4IDIxMSAzMTQgMjExIDI1NSAyMjYgMTE2IDE4IDQyIDE3MiAxNjAgMzA1IDI0OCAyNSAKKzE4NCAxMTkgMjM2IDIxOSAxMjcgMjEyIDMwIDE1NCAyNDQgMTk1IDI1NCAyMzkgNjIgMyAyOCAyMzkgMTIxIDMwNCAxNjcgMTMxIDE5NSAKKzE1MCA5OCAzMTQgMTA3IDY1IDE2MiAyMjAgNTUgMjgxIDI3MSAyMjcgMTAzIDcyIDU3IDEzNyA5MyAyOCAzMDggXgorNjcwIDAgMTA1IDc4IDEwNiAyMDQgNDAgMzEgMjMyIDE3NyAyMiAxMjkgNjggMTY4IDI2OSA3NCAyNzYgMjc1IDIwOCAxNzQgMTQgMTI2IAorNDcgMjE5IDIxOCAxMzggMTU4IDE0IDEzOSAzMTAgMjAzIDI1MSAyMDUgMTY2IDExIDU5IDUyIDIxNCAyODIgMjAgMjE0IDMwOCAyNzUgCisxODIgMjgyIDQ2IDEwNiAyMzAgMjQ5IDMxNiAyNTIgMzExIDMwOSA3NyAyNzEgMTUgMjkxIDEzNiAyNjkgMTAwIDE2OCAyNDMgMTgyIAorMzA4IDMwMSA3NCAyNTAgNjYgMjQwIDIwMCAxOTcgMTU2IDk5IDE2IDU0IDExNiA5NiAyMSAzMTQgMzMgMTM0IDM3IDIzIDIyOSAxNTYgCis3MyAxMjQgMTMyIDk2IDggNTEgNDkgMTQ3IDI4NyAxNSAyNzggMTkwIDE0IDExMyAxMDEgMjM1IDIzMSA3MSAxOTYgNjMgMjE5IDIwNSAKKzE5MiAyMjAgMjcgNzIgMzEgMjA2IDI4NSAxMDAgMTU1IDI5NyAyNDQgNCAyMzQgNjYgMjUzIDE0NiAxODEgMTg5IDE2NiAyNCA1IDM2IAorMjAxIDMyIDI4IDIxMSAyMjggMTcgMTkzIDMxMyAyMjQgMjAwIDIxMCAxMDIgODMgMyAxMjEgNzggOTMgMjU4IDU2IDQ0IDE2NSAyMTUgCis3MSAyMDkgOSAxNTcgMjM4IDI1OSAxODIgMjk1IDM4IDkwIDIxNyAzMTYgMjc4IDIwMyAyNzcgOTcgODggMzAyIDE5MyAyMiAxMTYgMTIyIAorMjMwIDIzNiA3IDI2OCA3IDI0MiAxMTUgMyA5NSAxODYgMTI1IDIzOCAyODUgNzQgMjYzIDEyIDIyNCAxODcgMjY0IDE2NCA1MCAyOTkgCisxNTkgMTI3IDEyNyAxNTMgNDUgMTMgMzMgMTIxIDkxIDM5IDI0MiA4OSAxMTEgMTczIDE2NiAzNyAzMTQgMjAgMTg4IDUzIDMwNyAxNjIgCisxNDggMTIyIDIwNCAyNyA4NSAyOTQgMTkwIDEgMTY3IDExNyAyNDggMTY0IDYzIDI0NSA5NyAxMTQgMTk0IDE2MSA0MiAyNTAgOTIgMTMyIAorMTIyIDIxNyAyOTAgNjkgMjgxIDI1NyAyODAgMTE4IDM3IDM2IDE3NSA5NCA2MCAxOTEgOTQgNDcgMjQ1IDExMCA2MCAxNzggMTQ4IDEwOSAKKzI1OCA0MyA5OCAyMjcgMjI4IDQgMjQ3IDEyIDIzNyAxMzMgMjQ4IDE1MSAxMTcgMjYxIDExMCA0NyAyMzIgMTY0IDc2IDE5MSA4MSAxMDEgCisyNjEgMTIzIDMxMCAyMTYgMTk3IDE0MyAxNTMgMzIgNjcgNDkgMTM0IDI0IDMxIDI0NSAxMjMgNiAxNjIgMTM1IDE3NiAyMjAgNDAgMTggCisyODYgMjM5IDM1IDYyIDEwNiAyMTcgMzAzIDE1IDI2NSAyNDQgMzAgMTI2IDM0IDI3MyAyODAgMTA1IDkxIDUyIDE4OCAyNyA5OCAyNDAgCisxNzQgMzA1IDIzNCA3OSAxOTkgODQgMTY4IDI1NiAxMjggMjkyIDI4OCAxNDEgMjEyIDE3IDIwNiAyNTkgMjA4IDE4NyAyNzcgMTEwIDM0IAorMjg2IDIyNiA4OSAxMjQgMTE5IDE1MCAyNCAxOCAyOTkgMTg1IDE5IDk1IDE3MyAxNzkgMzAwIDI1MiA3IDI1NSA2MSAzMDQgODIgMjUzIAorMTMzIDIzNSAyMDUgMTc5IDI3NCA0MyA4NSAyODEgMjQ0IDE3IDE4MCA1MCAyODYgMjEzIDE0MyAxNDAgODYgODMgMTYgNjcgNjIgODAgOCAKKzY0IDMxMiAxMzEgMyA4MiAyNDAgMTg3IDI1MSAyMTggMTEyIDI2NiA5MiAxMTkgMTc2IDIzMyAzMDMgMiAyIDMwNiA0MyA1OSAyNiA1IAorMzE0IDQ2IDgwIDIxIDEwIDI5NiAxMTggMjQgNDQgMTkxIDEwNyAzOSAyMjkgMTQzIDEyNyAxNDAgOTkgMjkgNTQgMTI5IDQyIDI3NiAKKzMwMSAxMDAgMTQyIDM0IDI2MCAxNyAxNjcgMTA0IDMwMiAxODAgNzYgMTc4IDEzNSAxNjMgMjc0IDU2IDMxIDIxOSAyMzEgODQgMTQyIDEgCisyMDYgMjcyIDE1NCAxNzEgMjY0IDE3NyA0MiAyMzcgMTQ2IDE5NCAxMzUgMTUwIDExIDcyIDQ0IDE1MiAyNjkgODcgMjIyIDI1OSAxOTUgCisyNDEgMjkzIDc3IDI4NCA3IDIyOSAxNjkgMTkgMTA4IDExOSAxNjMgMjg3IDIgMTUgMjUyIDI5OCA0NiA5MyAyODQgMzExIDI4MyAxODUgCiszMiA0MSAxNTcgMjEyIDQgMjYwIDQgMjIxIDEyMCAzMTUgMTEzIDExNCAxODEgMjE1IDU4IDI2MyAyNSAxNzAgMTcxIDI1MSAyMzEgNTggCisyNTAgNzkgMTg2IDEzOCAxODQgMjIzIDYxIDEzIDIwIDE3NSAxMDcgNiAxNzUgODEgMTE0IDIwNyAxMDcgMjYgMjgzIDE1OSAxNDAgNzMgCisxMzcgNzggODAgMzEyIDExOCAxMSA5OCAyNTMgMTIwIDI4OSAyMjEgMTQ2IDIwNyA4MSA4OCAzMTUgMTM5IDYgMTQ5IDE4OSAxOTIgMjMzIAorMjkwIDU2IDE4IDI3MyAyOTMgNTEgNzUgMzkgMjU1IDM1IDQ5IDE2MCAyMzMgMzE2IDI2NSAyNTcgMjkzIDY0IDIxIDIzIDI0MiAxMDIgCis1NyAxMTEgMTk5IDU4IDI3NiAyODggMTU0IDE1OCAxIDE5MyA5IDE3MCAxODQgMTk3IDE2OSA0NSA0MSAxODMgMTA0IDI4OSAyMzQgOTIgCisxNDUgNjggMTU1IDYgMTM2IDI0MyAyMDggMjAwIDIyMyA0OCAyMSAzNiAxODggNDAgNDQgMTc4IDE2MSA1NSAxOTYgNzYgMTY1IDE4OSAKKzE3OSAyODcgMzA2IDIzIDI2OCAzMTEgMjk2IDEzMSAxNiAyOCAyMjQgMTc0IDEgMTgwIDYzIDIzMiAxNTEgMTMwIDIwNyA5NCAzNCAyOTkgCisxNzIgNzMgMTExIDE4NiAxMTIgMjkyIDMwMSA4NyAxOTYgNTAgMjczIDI2NyAxNTkgMTUzIDIzNSBeCis2NTggMSAxMTcgNjMgMTQzIDI3NCA2NyAyOTIgMjAxIDI2MCAxNDcgMTA0IDMxMyAxMjYgNTYgMTYzIDIwMCAxMjMgMjI1IDE2IDkwIAorMjMwIDI2MiAyNTggMjMyIDIxIDU3IDM5IDI2NCAyOTYgMzEgMTQ3IDMwMCAyNzggMjE2IDIxOSAzNSA3NSA1MCAxOTcgMTMgNzggMjI1IAorMjM3IDI2NyAxODUgNDEgMzAyIDk1IDE5NyA3MSAyMjAgMjcwIDEzOSAyMjMgMyAxNDQgMjg4IDI3MyAxOTEgMjI4IDI4IDEzNSAyOTUgCisyNTMgMjY1IDE3MiA5NSAxIDEwNiAxMzAgMTA3IDI2NyAyOSAzNiAyMTIgMjkxIDYgMTk2IDI5MyAxOSAxNDIgMjc1IDggMjA5IDIzOSAKKzI4MCAxMzEgMjMgMjkxIDE2MiAxNjEgNjQgMTQyIDE0IDE1MCAyNTQgMTQxIDIzNiAyNjggMTI2IDI3NyAyMSAxNTUgMjIxIDMwOSAxOTggCiszMDYgMjg0IDEyNCAyNjQgNzUgMTczIDE5MiAyNDIgMjM0IDM0IDMgMjEgMjUzIDQ0IDM1IDE0MCAyNjIgNjIgMjI3IDI1MCAyMTMgMTY3IAorMzAgNTAgOTkgMTUwIDMzIDQgMjgxIDE3MCA4MiA1NSAxMjQgMTQxIDQwIDI2MyAzNiAxMTQgMTA5IDI4MCAyOTQgMTggMjAxIDM5IDI4OSAKKzE0OSAyMTUgODIgMTUzIDMwNiAxODYgMzAxIDIxOSAxMzMgMjU3IDk1IDk5IDI0OCAxNzUgOSAxODMgMTI2IDE3OSAxOTggMTEwIDI3OSAKKzM0IDEwMSAxNjMgMjk4IDI2NSAyNzAgMjM3IDQ2IDggODYgMjA0IDUxIDI5NCAyMTQgMjA2IDg5IDEzMyA2MSAxMzAgOSA4NSAzMDMgCisxMzQgMjU2IDE1NCAxODIgMjEwIDExNSAyNSAzMDQgMTA4IDE0MyA1MyAyMDkgMTggMTAzIDE3NiAyNDQgMjQ3IDI5OSAzMDQgMTAgMSA4IAorMzA3IDYyIDYgNzMgMjU4IDY5IDMwNSAxNDcgMjAyIDEzNiAxNzEgMjc3IDExOSAyOTcgMjY2IDIxMSAxNTQgODQgNjggNzAgODMgMjkgCisxMSA2NyA3MSAyNCAzMDUgNDkgNjAgOTEgMjY5IDIgMjIgMTk0IDI4MCAzMyAxNjAgMjQ2IDI2MCAyNDUgMjg2IDM5IDY4IDEyIDI2MCAKKzI0IDEwOSA4NCAyODkgMjQ3IDM4IDEyNyA1NSAyMjIgMjgzIDg1IDIwNSAzMTEgMjExIDI1MiAyMjYgMTEzIDEyIDM5IDE2NiAxNTQgCiszMDUgMjQ1IDI1IDE4MSAxMTMgMjMzIDIxNiAxMjEgMjEyIDMwIDE0OCAyNDEgMTk1IDI1NCAyMzkgNTkgMzEzIDI4IDIzMyAxMTggMjk4IAorMTY3IDEyOCAxOTIgMTQ0IDkyIDMwOCAxMDEgNjUgMTU2IDIyMCA0OSAyODEgMjY4IDIyNCAxMDAgNjYgNTcgMTM3IDg3IDIyIDI5MiAKKzEwMyA3OCAxMDIgMjAyIDM4IDI5IDIzMiAxNzcgMjIgMTI5IDY4IDE2OCAyNjUgNzQgMjcyIDI3NSAyMDQgMTc0IDEwIDEyNCA0MyAyMTcgCisyMTggMTM0IDE1OCAxMiAxMzcgMzA4IDE5OSAyNDcgMjAxIDE2MiA1IDU5IDUyIDIxMCAyNzggMjAgMjE0IDMwNCAyNzEgMTc4IDI4MiAKKzQ2IDEwNiAyMjggMjQ5IDMxMiAyNTAgMzExIDMwOSA3NSAyNzEgMTUgMjg3IDEzNiAyNjkgMTAwIDE2NCAyMzkgMTgyIDMwOCAyOTcgNzAgCisyNDYgNjQgMjQwIDE5NiAxOTUgMTU2IDk3IDE0IDUyIDExMiA5NiAxNSAzMTIgMjkgMTM0IDM1IDE3IDIyNyAxNTIgNzEgMTIyIDEyOCAKKzk0IDIgNDcgNDcgMTQ1IDI4NyAxMyAyNzQgMTkwIDggMTExIDk3IDIzNSAyMjkgNjcgMTk0IDU5IDIxNSAyMDUgMTg4IDIxNiAyMyA3MCAKKzI1IDIwNiAyODUgOTggMTUxIDI5MyAyNDAgMjMwIDY2IDI1MyAxNDIgMTc3IDE4NSAxNjQgMTggNSAzNCAxOTkgMjYgMjQgMjA3IDIyNiAKKzE1IDE4OSAzMTMgMjI0IDE5OCAyMDggMTAyIDc5IDMgMTE5IDc2IDg5IDI1NiA1NiA0MCAxNjUgMjEzIDY5IDIwNyA1IDE1NyAyMzQgCisyNTUgMTgwIDI5NSAzMiA4OCAyMTcgMzE2IDI3NiAyMDMgMjczIDkzIDg2IDMwMiAxOTMgMjAgMTE2IDEyMiAyMjYgMjM2IDcgMjY4IDMgCisyNDIgMTExIDMxOCA5MyAxODQgMTI1IDIzOCAyODEgNzIgMjU5IDEwIDIyMiAxODUgMjYyIDE2MCA1MCAyOTUgMTU1IDEyMyAxMjcgMTUzIAorNDUgOSAyNyAxMjEgODkgMzUgMjM4IDg1IDEwNyAxNjkgMTY2IDMxIDMxMCAxNiAxODggNTMgMzA3IDE2MCAxNDggMTE4IDIwMCAyNSA4MyAKKzI5MCAxODggMzE0IDE2NSAxMTUgMjQ2IDE2MiA2MyAyNDEgOTcgMTEyIDE5NCAxNTcgMzggMjUwIDkwIDEzMiAxMjAgMjEzIDI5MCA2NSAKKzI3OSAyNTUgMjc4IDExOCAzNyAzMCAxNzMgOTQgNjAgMTg5IDkyIDQ3IDI0MyAxMTAgNTggMTc2IDE0NiAxMDUgMjU0IDQzIDk0IDIyMyAKKzIyNCAyIDI0MyAxMiAyMzUgMTMxIDI0NCAxNDkgMTE3IDI1OSAxMDggNDUgMjMwIDE2NCA3NiAxODcgNzkgMTAxIDI2MSAxMjEgMzEwIAorMjEyIDE5MyAxNDMgMTUxIDMyIDYzIDQ1IDEzMiAyMiAzMSAyNDUgMTIzIDQgMTU4IDEzNSAxNzIgMjE4IDM2IDE2IDI4NiAyMzUgMzMgCis2MiAxMDQgMjE1IDMwMyAxMSAyNjEgMjQ0IDI2IDEyMiAzMCAyNzEgMjc2IDEwNSA5MSA0OCAxODQgMjcgOTYgMjM2IDE3MCAzMDMgMjMyIAorNzkgMTk5IDg0IDE2NiAyNTIgMTI4IDI5MCAyODMgXgorNjQ5IDEgMTMzIDIwOCAxNyAxOTggMjU5IDIwNCAxODcgMjczIDEwMiAzMCAyODIgMjE4IDg1IDExNiAxMTEgMTQ2IDE2IDE4IDI5OSAKKzE3NyAxMSA4NyAxNjkgMTc5IDI5MiAyNTIgMyAyNTUgNTMgMjk2IDgyIDI0OSAxMjUgMjI3IDIwMSAxNzEgMjY2IDM5IDc3IDI3MyAyNDAgCis5IDE3MiA0NiAyNzggMjA1IDEzOSAxMzYgODYgNzkgMTYgNjMgNTQgNzYgNTYgMzEyIDEyMyAzMTIgNzggMjM2IDE3OSAyNDcgMjEwIAorMTA0IDI2NiA4NCAxMTkgMTcyIDIyOSAyOTkgMzE1IDMxMSAyOTggMzEgNTEgMjYgMzE0IDMxNCAzOCA4MCAxMyAyIDI5MiAxMTQgMjQgCis0NCAxOTEgMTAzIDI3IDIyMSAxMzUgMTIzIDE0MCA5OSAyNSAzMTcgNTQgMTIxIDQyIDI3NiAzMDEgOTIgMTM0IDIyIDI1NiA1IDE1OSAKKzEwMCAyOTggMTgwIDcyIDE3MCAxMzEgMTU1IDI3MCA1MiAyMyAyMTkgMjMxIDc2IDEzOCAxIDIwMiAyNzIgMTUwIDE2NyAyNjQgMTY5IAorMzAgMjM3IDE0MiAxODYgMTI3IDE0MiAzIDcyIDMyIDE1MiAyNjUgODcgMjE0IDI1NSAxOTEgMjQxIDI5MyA3NyAyODQgMzE2IDIyOSAKKzE2MSAxNSAxMDAgMTE1IDE1OSAyODMgMzE5IDMgMjQ0IDI5OCA0MiA5MyAyODAgMzAzIDI4MyAxODEgMjQgMzMgMTQ5IDIwNCA0IDI1MiAKKzMxMyAyMTMgMTIwIDMwNyAxMTMgMTA2IDE4MSAyMDcgNTQgMjU5IDIxIDE2NiAxNjMgMjUxIDIyMyA1MCAyNDYgNzUgMTg2IDEzOCAxODQgCisyMjMgNjEgMSA4IDE3NSAxMDcgNiAxNjcgODEgMTE0IDIwNyA5OSAxNCAyNzUgMTU1IDEzMiA3MyAxMzMgNzAgNzIgMzA4IDExMCAxMSAKKzk4IDI0NSAxMTIgMjgxIDIyMSAxNDYgMTk5IDczIDg4IDMxNSAxMzkgMzE5IDE0MSAxODkgMTg4IDIyNSAyODYgNDggMTAgMjczIDI4NSAKKzUxIDcxIDM1IDI0NyAyNyA0OSAxNTYgMjMzIDMxMiAyNjEgMjU3IDI4OSA2NCAxNyAxNSAyMzggOTQgNDkgMTExIDE5MSA1OCAyNzIgCisyODggMTQ2IDE1NCAzMTggMTg5IDUgMTcwIDE3NiAxOTcgMTY5IDQxIDMxMyA0MSAxNzUgOTYgMjg1IDIzNCA5MiAxNDUgNjQgMTU1IAorMzE1IDEyOCAyNDMgMjA4IDIwMCAyMTkgNDggMjEgMjggMTg0IDQwIDQwIDE3OCAxNTcgNDcgMTk2IDY4IDE1NyAxODUgMTc1IDI3OSAKKzMwNiAyMyAyNjQgMzA3IDI5NiAxMjcgNCAyNCAyMTYgMTcwIDMxNCAxNzYgNTkgMjI0IDE1MSAxMzAgMjAzIDg2IDM0IDI5NSAxNjQgNjUgCisxMDcgMTc4IDExMiAyOTIgMjk3IDc5IDE4OCA0MiAyNjUgMjU5IDE1OSAxNDUgMTkgMTEzIDYxIDEzOSAyNzQgNjUgMjkwIDE5OSAyNTYgCisxNDMgMTA0IDMxMSAxMjYgNTIgMTYxIDE5OCAxMjEgMjI1IDEwIDkwIDIzMCAyNjIgMjU0IDIyOCAxNSA1NSAzOSAyNjAgMjk0IDI5IAorMTQ3IDMwMCAyNzggMjE2IDIxNSAzNSA3NSA0OCAxOTMgNyA3NCAyMjMgMjMzIDI2NyAxODUgMzcgMzAwIDk1IDE5NSA3MSAyMTggMjY4IAorMTM3IDIyMSAzMTggMTQ0IDI4NCAyNzEgMTg3IDIyOCAyNiAxMzEgMjkzIDI0OSAyNjMgMTcyIDkxIDMyMCAxMDQgMTI4IDEwNSAyNjMgCisyMyAzNiAyMTAgMjg3IDE5NCAyOTEgMTMgMTQwIDI3MSA0IDIwNyAyMzcgMjgwIDEzMSAxNyAyOTEgMTYyIDE2MSA2MCAxNDIgMTQgMTQ4IAorMjUyIDE0MSAyMzQgMjY0IDEyNCAyNzUgMTcgMTUzIDIxNyAzMDUgMTk4IDMwNCAyODAgMTIwIDI2MiA3MSAxNzMgMTkyIDIzOCAyMzIgCisyOCAxIDE5IDI1MSA0MCAyOSAxMzYgMjU4IDU4IDIyNyAyNDYgMjEzIDE2NSAyOCA0NiA5NSAxNTAgMjkgMzE5IDI3OSAxNjggNzggNTMgCisxMjQgMTM3IDM4IDI2MyAzNCAxMTIgMTA5IDI3NiAyOTAgMTYgMjAxIDMzIDI4NyAxNDkgMjE1IDgwIDE1MSAzMDIgMTgyIDI5NyAyMTcgCisxMzMgMjUzIDkzIDk3IDI0OCAxNzMgOSAxODMgMTIyIDE3NyAxOTQgMTA4IDI3OSAzMCA5OSAxNjMgMjk2IDI2NSAyNzAgMjM1IDQ0IDggCis4MiAyMDQgNDkgMjk0IDIxMiAyMDIgODkgMTI5IDU3IDEyNiA3IDg1IDI5OSAxMzIgMjU2IDE1NCAxODAgMjEwIDExNSAyMSAzMDQgMTA4IAorMTQxIDUxIDIwOSAxNCAxMDMgMTc2IDI0MiAyNDUgMjk1IDMwMiAxMCAzMTggNiAzMDUgNjAgNCA2OSAyNTggNjkgMzAzIDE0NSAyMDIgCisxMzQgMTcxIDI3NyAxMTUgMjk3IDI2MiAyMDkgMTUyIDgyIDY2IDcwIDgzIDI5IDkgNjcgNjcgMjIgMzAxIDQ3IDU4IDg5IDI2NyAyIDE2IAorMTkwIDI3OCAzMyAxNjAgMjQ2IDI1OCAyNDEgMjgyIDM1IDY0IDYgMjYwIDE4IDEwNSA4MCAyODkgMjQ3IDM4IDEyNSA1NSAyMjIgMjgxIAorODMgMjAxIDMwOSAyMTEgMjUwIDIyNiAxMTEgOCAzNyAxNjIgMTUwIDMwNSAyNDMgMjUgMTc5IDEwOSAyMzEgMjE0IDExNyAyMTIgMzAgCisxNDQgMjM5IDE5NSAyNTQgMjM5IDU3IDMwOSAyOCAyMjkgMTE2IDI5NCAxNjcgMTI2IDE5MCAxNDAgODggMzA0IDk3IDY1IDE1MiAyMjAgCis0NSAyODEgMTc4IF4KKzxECisKK0g+U0hTIFR5cGUgMyBTdHJpbmdzPEgKK0Q+Cis0MCAxIDE4IDIwIDExIDE1IDExIDExIDkgNiAyIDE1IDUgMTcgMTIgMSA5IDEgMyA1IDExIDcgMiAyIDYgMTggMiA5IDExIDggMTYgMTEgCisxNiAxNSAxOCAxOCAzIDIwIDIgMTcgMTcgMTYgXgorPEQKKwpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3NoYS0xL2J5dGUtaGFzaGVzLnNoYTEgYi90ZXN0L2RhdGEvc2hhLTEvYnl0ZS1oYXNoZXMuc2hhMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjMzYzJiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL3NoYS0xL2J5dGUtaGFzaGVzLnNoYTEKQEAgLTAsMCArMSwzNDMgQEAKKyMgIENvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yICJTSEEtMSBUZXN0IgorIyAgU0hBIHRlc3RzIGFyZSBjb25maWd1cmVkIGZvciBCWVRFIG9yaWVudGVkIGltcGxlbWVudGF0aW9ucworSD5TSFMgVHlwZSAxIEhhc2hlczxICitEPgorREEzOUEzRUU1RTZCNEIwRDMyNTVCRkVGOTU2MDE4OTBBRkQ4MDcwOSBeCiszQ0RGMjkzNkRBMkZDNTU2QkZBNTMzQUIxRUI1OUNFNzEwQUM4MEU1IF4KKzE5QzFFMjA0OEZBNzM5M0NGQkYyRDMxMEFEODIwOUVDMTFEOTk2RTUgXgorQ0E3NzVEOEM4MEZBQTZGODdGQTYyQkVDQTZDQTYwODlENjNCNTZFNSBeCis3MUFDOTczRDBFNEI1MEFFOUU1MDQzRkY0RDYxNTM4MTEyMEEyNUEwIF4KK0E2QjVCOUY4NTRDRkI3NjcwMUMzQkREQkYzNzRCMzA5NEVBNDlDQkEgXgorRDg3QTBFRTc0RTRCOUFENzJFNjg0N0M4N0JERUVCM0QwNzg0NDM4MCBeCisxOTc2QjhERDUwOUZFNjZCRjA5QzlBOEQzMzUzNEQ0RUY0RjYzQkZEIF4KKzVBNzhGNDM5QjZEQjg0NUJCOEE1NThFNENFQjEwNkNEN0I3RkY3ODMgXgorRjg3MUJDRTYyNDM2QzFFMjgwMzU3NDE2Njk1RUUyRUY5QjgzNjk1QyBeCis2MkIyNDNEMUI3ODBFMUQzMUNGMUJBMkRFM0YwMUM3MkFFRUEwRTQ3IF4KKzE2OTg5OTRBMjczNDA0ODQ4RTU2RTdGREE0NDU3QjU5MDBERTEzNDIgXgorMDU2RjRDREMwMjc5MURBN0VEMUVCMjMwMzMxNEY3NjY3NTE4REVFRiBeCis5RkUyREE5NjdCRDg0NDFFRUExQzMyREY2OEREQUE5REMxRkM4RTRCIF4KKzczQTMxNzc3QjRBQ0U5Mzg0RUZBOEJCRUFENDVDNTFBNzFBQkE2REQgXgorM0Y5RDdDNEUyMzg0RUREQUJGRjVERDhBMzFFMjNERTNEMDNGNDJBQyBeCis0ODE0OTA4RjcyQjkzRkZEMDExMTM1QkVFMzQ3REU5QTA4REE4MzhGIF4KKzA5NzgzNzRCNjdBNDEyQTMxMDJDNUFBMEIxMEUxQTY1OTZGQzY4RUIgXgorNDRBRDZDQjYxOEJEOTM1NDYwRDQ2RDNGOTIxRDg3Qjk5QUI5MUMxRSBeCiswMkRDOTg5QUYyNjVCMDlDRjg0ODU2NDA4NDIxMjhEQ0Y5NUU5RjM5IF4KKzY3NTA3QjhENDk3QjM1RDZFOTlGQzAxOTc2RDczRjU0QUVDQTc1Q0YgXgorMUVBRTAzNzNDMTMxN0NCNjBDMzZBNDJBODY3QjcxNjAzOUQ0NDFGNSBeCis5QzM4MzQ1ODlFNUJGRkFDOUY1MDk1MEUwMTk5QjNFQzI2MjBCRUM4IF4KKzIwOUY3QUJDN0YzQjg3OEVFNDZDREYzQTFGQkI5QzIxQzM0NzRGMzIgXgorMDVGQzA1NEIwMEQ5Nzc1M0E5QjNFMkRBOEZCQkEzRUU4MDhDRUYyMiBeCiswQzQ5ODBFQTNBNDZDNzU3REZCRkM1QkFBMzhBQzZDOEU3MkREQ0U3IF4KKzk2QTQ2MEQyOTcyRDI3NjkyOEI2OTg2NDQ0NUJFQTM1M0JEQ0ZGRDIgXgorRjNFRjA0RDhGQThDNkZBOTg1MEYzOTRBNDU1NEMwODA5NTZGQTY0QiBeCitGMkEzMUQ4NzVEMUQ3QjMwODc0RDQxNkM0RDJFQTZCQUYwRkZCQUZFIF4KK0Y0OTQyRDNCOUU5NTg4RENGREM2MzEyQTg0REY3NUQwNUYxMTFDMjAgXgorMzEwMjA3REYzNUIwMTRFNDY3NkQzMDgwNkZBMzQ0MjQ4MTM3MzRERCBeCis0REExOTU1QjJGQTdDN0U3NEUzRjQ3RDczNjBDRTUzMEJCRjU3Q0EzIF4KKzc0QzRCQzVCMjZGQjRBMDg2MDJENDBDQ0VDNkM2MTYxQjZDMTE0NzggXgorMEIxMDNDRTI5NzMzOERGQzczOTVGNzcxNUVFNDc1MzlCNTU2RERCNiBeCitFRkM3MkQ5OUUzRDIzMTFDRTE0MTkwQzBCNzI2QkRDNjhGNEIwODIxIF4KKzY2MEVEQUMwQThGNENFMzNEQTBEOERCQUU1OTc2NTBFOTc2ODcyNTAgXgorRkUwQTU1QTk4OEIzQjkzOTQ2QTYzRUIzNkIyMzc4NUE1RTZFRkMzRSBeCiswQ0JERjJBNTc4MUM1OUY5MDc1MTMxNDdBMERFM0NDNzc0QjU0QkYzIF4KKzY2M0U0MEZFRTVBNDRCRkNCMUM5OUVBNTkzNUE2QjVCQzlGNTgzQjAgXgorMDAxNjIxMzQyNTY5NTJERDlBRTZCNTFFRkIxNTlCMzVDM0MxMzhDNyBeCitDRUI4OEU0NzM2RTM1NDQxNkUyMDEwRkMxMDYxQjNCNTNCODE2NjRCIF4KK0E2QTJDNEI2QkNDNDFEREM2NzI3OEYzREY0RDhEMEI5REQ3Nzg0RUYgXgorQzIzRDA4M0NEODgyMEI1NzgwMEE4NjlGNUYyNjFENDVFMDJEQzU1RCBeCitFOEFDMzE5MjdCNzhEREVDNDFBMzFDQTdBNDRFQjcxNzcxNjVFN0FCIF4KK0U4NjRFQzVEQkFCMEY5RkY2OTg0QUI2QUQ0M0E4QzlCODFDQzlGOUMgXgorQ0ZFRDYyNjkwNjk0MTdBODRENkRFMjM0NzIyMEY0Qjg1OEJDRDUzMCBeCitEOTIxN0JGQjQ2Qzk2MzQ4NzIyQzM3ODNEMjlENEIxQTNGRURBMzhDIF4KK0RFQzI0RTU1NTRGNzk2OTcyMThEMzE3MzE1RkE5ODYyMjlDRTMzNTAgXgorODNBMDk5REY3MDcxNDM3QkE1NDk1QTVCMEJGQkZFRkUxQzBFRjdGMyBeCitBQTMxOThFMzA4OTFBODNFMzNDRTNCRkEwNTg3RDg2QTE5N0Q0RjgwIF4KKzlCNkFDQkVCNDk4OUNCRUU3MDE1QzdENTE1QTc1NjcyRkZERTM0NDIgXgorQjAyMUVCMDhBNDM2QjAyNjU4RUFBN0JBM0M4OEQ0OUYxMjE5QzAzNSBeCitDQUUzNkRBQjhBRUEyOUY2MkUwODU1RDlDQjNDRDhFN0QzOTA5NEIxIF4KKzAyREU4QkE2OTlGM0MxQjBDQjVBRDg5QTAxRjIzNDZFNjMwNDU5RDcgXgorODgwMjE0NTg4NDdERDM5QjQ0OTUzNjhGNzI1NDk0MTg1OUZBRDQ0QiBeCis5MUExNjUyOTVDNjY2RkU4NUMyQURCQzVBMTAzMjlEQUYwQ0I4MUEwIF4KKzRCMzEzMTJFQUY4QjUwNjgxMTE1MUE5REJEMTYyOTYxRjc1NDhDNEIgXgorM0ZFNzA5NzFCMjA1NThGN0U5QkFDMzAzRUQyQkMxNEJERTY1OUE2MiBeCis5M0ZCNzY5RDVCRjQ5RDZDNTYzNjg1OTU0RTJBRUNDMDI0REMwMkQ2IF4KK0JDODgyN0MzRTYxNEQ1MTVFODNERUE1MDM5ODlERUE0RkRBNkVBMTMgXgorRTgzODY4REJFNEEzODlBQjQ4RTYxQ0ZDNEVEODk0RjMyQUUxMTJBQyBeCis1NUM5NTQ1OUNERTRCMzM3OTFCNEIyQkNBQUY4NDA5MzBBRjNGM0JEIF4KKzM2QkIwRTJCQTQzOEEzRTAzMjE0RDlFRDJCMjhBNEQ1QzU3OEZDQUEgXgorM0FDQkY4NzQxOTk3NjNFQkEyMEYzNzg5REZDNTk1NzJBQ0E0Q0YzMyBeCis4NkJFMDM3QzRENTA5QzkyMDIwMjA3NjdEODYwREFCMDM5Q0FEQUNFIF4KKzUxQjU3RDcwODBBODczOTRFRUMzRUIyRTBCMjQyRTU1M0YyODI3QzkgXgorMUVGQkZBNzg4NjYzMTVDRTZBNzFFNDU3RjNBNzUwQTM4RkFDQUI0MSBeCis1N0Q2Q0I0MUFFRUMyMDIzNkYzNjVCM0E0OTBDNjFEMENGQTM5NjExIF4KK0M1MzJDQjY0QjRCQTgyNjM3MkJDQ0YyQjRCNTc5M0Q1Qjg4QkI3MTUgXgorMTU4MzNCNTYzMTAzMjY2M0U3ODM2ODZBMjA5QzZBMkI0N0ExMDgwRSBeCitEMDRGMjA0M0M5NkUxMENEODNCNTc0QjFFMUMyMTcwNTJDRDRBNkIyIF4KK0U4ODgyNjI3QzY0REI3NDNGN0RCOEI0NDEzREQwMzNGQzYzQkVCMjAgXgorQ0QyRDMyMjg2Qjg4NjdCQzEyNEEwQUYyMjM2RkM3NEJFMzYyMjE5OSBeCiswMTlCNzBENzQ1Mzc1MDkxRUQ1QzdCMjE4NDQ1RUM5ODZEMEY1QTgyIF4KK0U1RkY1RkVDMURBREJBRUQwMkJGMkRBRDQwMjZCRTZBOTZCM0YyQUYgXgorNkY0RTIzQjNGMkUyQzA2OEQxMzkyMUZFNEU1RTA1M0ZGRUQ0RTE0NiBeCisyNUUxNzk2MDJBNTc1QzkxNTA2NzU2NkZCQTZEQTkzMEU5N0Y4Njc4IF4KKzY3REVEMEU2OEUyMzVDOEE1MjNFMDUxRTg2MTA4RUVCNzU3RUZCRkQgXgorQUY3ODUzNkVBODNDODIyNzk2NzQ1NTU2RDYyQTNFRTgyQzdCRTA5OCBeCis2NEQ3QUM1MkU0NzgzNEJFNzI0NTVGNkM2NDMyNUY5QzM1OEI2MTBEIF4KKzlENDg2NkJBQTM2MzlDMTNFNTQxRjI1MEZGQTNEOEJDMTU3QTQ5MUYgXgorMkUyNTg4MTE5NjFEM0VCODc2RjMwRTcwMTkyNDFBMDFGOTUxN0JFQyBeCis4RTBFQkM0ODcxNDZGODNCQzkwNzdBMTYzMEUwRkIzQUIzQzg5RTYzIF4KK0NFODk1Mzc0MUZGRjM0MjVEMjMxMUZCQkY0QUI0ODFCNjY5REVGNzAgXgorNzg5RDFEMkRBQjUyMDg2QkQ5MEMwRTEzN0UyNTE1RUQ5QzZCNTlCNSBeCitCNzZDRTc0NzI3MDBERDY4RDYzMjhCN0FBODQzN0ZCMDUxRDE1NzQ1IF4KK0YyMTg2NjlCNTk2QzVGRkIwQjFDMTRCRDAzQzQ2N0ZDODczMjMwQTAgXgorMUZGM0JEQkUwRDUwNENCMENERkFCMTdFNkMzN0FCQTZCM0NGRkRFRCBeCisyRjNDQkFDQkIxNDQwNUE0NjUyRUQ1Mjc5M0MxODE0RkQ4QzRGQ0UwIF4KKzk4MkM4QUI2Q0UxNjRGNDgxOTE1QUY1OUFBRUQ5RkZGMkEzOTE3NTIgXgorNUNEOTIwMTJENDg4QTA3RUNFMEU0NzkwMUQwRTA4M0I2QkQ5M0UzRiBeCis2OTYwM0ZFQzAyOTIwODUxRDRCM0I4NzgyRTA3QjkyQkIyOTYzMDA5IF4KKzNFOTBGNzY0MzdCMUVBNDRDRjk4QTA4RDgzRUEyNENFQ0Y2RTYxOTEgXgorMzRDMDlGMTA3QzQyRDk5MEVCNDg4MUQ0QkYyREREQ0FCMDE1NjNBRSBeCis0NzRCRTBFNTg5MkVCMjM4MjEwOUJGQzVFM0M4MjQ5QTkyODNCMDNEIF4KK0EwNEI0Rjc1MDUxNzg2NjgyNDgzMjUyNDM4RjZBNzVCRjQ3MDVFQzYgXgorQkU4OEE2NzE2MDgzRUI1MEVEOTQxNjcxOUQ2QTI0NzY2MTI5OTM4MyBeCitDNjdFMzg3MTdGRUUxQTVGNjVFQzZDN0M3QzQyQUZDMDBDRDM3RjA0IF4KKzk1OUFDNDA4MjM4OEUxOUU5QkU1REU1NzFDMDQ3RUYxMEMxNzRBOEQgXgorQkFBN0FBN0I3NzUzRkEwQUJEQzRBNTQxODQyQjVEMjM4RDk0OUYwQSBeCiszNTEzOTREQ0VCQzA4MTU1RDEwMEZDRDQ4ODU3OEU2QUU3MUQwRTlDIF4KK0FCOEJFOTRDNUFGNjBEOTQ3N0VGMTI1MkQ2MDRFNThFMjdCMkE5RUUgXgorMzQyOUVDNzRBNjk1RkREMzIyOEYxNTI1NjQ5NTIzMDhBRkUwNjgwQSBeCis5MDdGQTQ2QzAyOUJDNjdFQUE4RTRGNDZFM0MyQTIzMkY4NUJEMTIyIF4KKzI2NDRDODdEMUZCQkJDMEZDOEQ2NUY2NEJDQTI0OTJEQTE1QkFBRTQgXgorMTEwQTNFRUI0MDg3NTZFMkU4MUFCQUY0QzVEQ0Q0RDRDNkFGQ0Y2RCBeCitDRDRGREMzNUZBQzdFMUFEQjVERTQwRjQ3RjI1NkVGNzRENTg0OTU5IF4KKzhFNkUyNzMyMDhBQzI1NkY5RUNDRjI5NkYzRjVBMzdCQzhBMEY5RjcgXgorRkUwNjA2MTAwQkRCQzI2OERCMzlCNTAzRTBGREZFMzc2NjE4NTgyOCBeCis2QzYzQzNFNTgwNDdCQ0RCMzVBMTdGNzRFRUJBNEU5QjE0NDIwODA5IF4KK0JDQzJCRDMwNUYwQkNEQThDRjJENDc4RUY5RkUwODA0ODZDQjI2NUYgXgorQ0U1MjIzRkQzREQ5MjBBM0I2NjY0ODFENTYyNUIxNjQ1N0RDQjVFOCBeCis5NDg4ODY3NzZFNDJFNEY1RkFFMUIyRDBDOTA2QUMzNzU5RTNGOEIwIF4KKzRDMTJBNTFGQ0ZFMjQyRjgzMkUzRDczMjkzMDRCMTFCNzUxNjFFRkIgXgorQzU0QkREMjA1MDUwNEQ5MkY1NTFEMzc4QUQ1RkM3MkM5RUQwMzkzMiBeCis4RjUzRThGQTc5RUEwOUZEMUI2ODJBRjVFRDE1MTVFQ0E5NjU2MDRDIF4KKzJEN0UxN0Y2Mjk0NTI0Q0U3OEIzM0VBQjcyQ0REMDhFNUZGNkUzMTMgXgorNjQ1ODJCNEI1N0Y3ODJDOTMwMkJGRTdEMDdGNzRBQTE3NjYyN0EzQSBeCis2RDg4Nzk1QjcxRDNFMzg2QkJEMUVCODMwRkI5RjE2MUJBOTg4NjlGIF4KKzg2QUQzNEE2NDYzRjEyQ0VFNkRFOTU5NkFCQTcyRjBERjEzOTdGRDEgXgorN0VCNDY2ODVBNTdDMEQ0NjYxNTJEQzMzOUM4MTIyNTQ4Qzc1N0VEMSBeCitFN0E5OEZCMDY5MjY4NDA1NDQwN0NDMjIxQUJDNjBDMTk5RDZGNTJBIF4KKzM0REYxMzA2NjYyMjA2RkQwQTVGQzI5NjlBNEJFRUM0RUIwMTk3RjcgXgorNTZDRjdFQkYwOEQxMEYwQ0I5RkU3RUUzQjYzQTVDM0EwMkJDQjQ1MCBeCiszQkFFNUNCODIyNjY0MjA4OERBNzYwQTZGNzhCMENGOEVEREVBOUYxIF4KKzY0NzVERjY4MUUwNjFGQTUwNjY3MkMyN0NCQUJGQTlBQTZEREZGNjIgXgorNzlEODE5OTFGQTRFNDk1N0M4MDYyNzUzNDM5REJGRDQ3QkJCMjc3RCBeCitCQUUyMjQ0NzdCMjAzMDJFODgxRjUyNDlGNTJFQzZDMzREQThFQ0VGIF4KK0VERTRERUI0MjkzQ0ZFNDEzOEMyQzA1NkI3QzQ2RkY4MjFDQzBBQ0MgXgorPEQKKworSD5TSFMgVHlwZSAyIEhhc2hlczxICitEPgorQTc3MUZBNUM4MTJCRDBDOTU5NkQ4NjlFQzk5RTRGNEFDOTg4QjEzRiBeCitFOTlENTY2MjEyQkJCQ0VFRTkwMzk0NkY2MTAwQzlDOTYwMzlBOEY0IF4KK0I0OENFNkIxRDEzOTAzRTM5MjVBRTBDODhDQjkzMTM4OEMwMTNGOUMgXgorRTY0N0Q1QkFGNjcwRDRCRjNBRkMwQTZCNzJBMjQyNEIwQzY0RjE5NCBeCis2NUMxQ0Q5MzJBMDZCMDVDRDBCNDNBRkIzQkM3ODkxRjZCQ0VGNDVDIF4KKzcwRkZBRTM1M0E1Q0QwRjhBNjVBOEIyNzQ2RDBGMTYyODFCMjVFQzcgXgorQ0M4MjIxRjJCODI5QjhDRjM5NjQ2QkY0Njg4ODMxN0MzRUIzNzhFQSBeCisyNkFDQ0MyRDZENTFGRjdCRjNFNTg5NTU4ODkwNzc2NTExMUJCNjlCIF4KKzAxMDcyOTE1QjhFODY4RDlCMjhFNzU5Q0YyQkMxQUVBNEJCOTIxNjUgXgorMzAxNjExNTcxMUQ3NDIzNkFERjBDMzcxRTQ3OTkyRjg3QTQyODU5OCBeCitCRjMwNDE3OTk5QzEzNjhGMDA4QzFGMTlGRUNBNEQxOEE1RTFDM0M5IF4KKzYyQkE0OTA4NzE4NUYyNzQyQzI2RTFDMUY0ODQ0MTEyMTc4QkY2NzMgXgorRTFGNkI5NTM2RjM4NEREMzA5ODI4NUJCRkQ0OTVBNDc0MTQwREM1QSBeCitCNTIyREFFMUQ2NzcyNkVCQTdDNDEzNkQ0RTJGNkQ2RDY0NUFDNDNFIF4KK0U5QTAyMUMzRUIwQjlGMkM3MTA1NTRENEJGMjFCMTlGNzhFMDk0NzggXgorREYxMzU3MzE4OEYzQkY3MDVFNjk3QTNFMUY1ODAxNDVGMjE4MzM3NyBeCisxODg4MzVDRkU1MkVDRkEwQzQxMzVDMjgyNUYyNDVEQzI5OTczOTcwIF4KKzQxQjYxNUEzNEVFMkNFQzlEODRBOTFCMTQxQ0ZBQjExNTgyMTk1MEIgXgorQUIzREQ2MjIxRDJBRkU2NjEzQjgxNURBMUMzODlFRUM3NEFBMDMzNyBeCiswNzA2RDQxNEI0QUE3RkI0QTkwNTFBQTcwRDY4NTZBNzI2NDA1NEZCIF4KKzNDQkY4MTUxRjNBMDBCMUQ1QTgwOUNCQjhDNEYzMTM1MDU1QTZCRDEgXgorREE1RDZBMDMxOTI3MkJCQ0NFQTYzQUNGQTY3OTk3NTZGRkRBNjg0MCBeCitGQjQ0MjlDOTVGNjI3N0IzNDZEM0IzODk0MTM3NThERkZGRUVEQzk4IF4KKzJDNkUzMEQ5Qzg5NUI0MkRDQ0NGQzg0QzkwNkVDODhDMDlCMjBERTEgXgorM0RFMzE4OUE1RTE5RjIyNUNEQ0UyNTRERkYyM0RBQ0QyMkM2MTM2MyBeCis5MzUzMEE5QkM5QTgxN0Y2OTIyNTE4QTczQTE1MDVDNDExRDA1REEyIF4KK0UzMTM1NDM0NUY4MzJEMzFFMDVDMUI4NDJENDA1RDRCRDQ1ODhFQzggXgorM0ZGNzY5NTdFODBCNjBDRjc0RDAxNUFENDMxRkNBMTQ3QjNBRjIzMiBeCiszNEFFM0I4MDZCRTE0M0E4NERDRTgyRTRCODMwRUI3RDNEMkJBQzY5IF4KK0Q3NDQ3RTUzRDY2QkI1RTRDMjZFOEI0MUY4M0VGRDEwN0JGNEFEREEgXgorNzdERDJBNDQ4MjcwNUJDMkU5REM5NkVDMEExMzM5NTc3MUFDODUwQyBeCitFQUExNDY1REIxRjU5REUzRjI1RUI4NjI5NjAyQjU2OEU2OTNCQjU3IF4KKzkzMjlENUI0MEUwREM0M0FBMjVGRUQ2OUEwRkE5QzIxMUE5NDg0MTEgXgorRTk0QzBCNkFBNjJBQTA4QzYyNUZBRjgxN0RERjhGNTFFQzY0NTI3MyBeCis3RkYwMkI5MDlEODJBRDY2OEUzMUU1NDdFMEZCNjZDQjhFMjEzNzcxIF4KKzVCQjM1NzA4NThGQTE3NDQxMjNCQUMyODczQjBCQjk4MTBGNTNGQTEgXgorOTA1RjQzOTQwQjM1OTFDRTM5RDExNDVBQ0IxRUNBODBBQjVFNDNDRCBeCiszMzZDNzlGQkQ4MkYzM0U0OTBDNTc3RTNGNzkxQzNDQkZFODQyQUZGIF4KKzVDNkQwN0E2QjQ0RjdBNzVBNjRGNkNFNTkyRjNCQUU5MUUwMjIyMTAgXgorN0UwRDNFOUQzMzEyN0Y0QTMwRUI4RDlDMTM0QTU4NDA5RkE4Njk1QiBeCis5QTVGNTBERkNGQjE5Mjg2MjA2QzIyOTAxOUYwQUJGMjUyODMwMjhDIF4KK0RDQTczN0UyNjlGOUQ4NjI2RDQ4ODk4OEM5OTZFMDZCMzUyQzA3MDggXgorQjhGRkMxRDQ5NzJGQ0U2MzI0MUUwRTc3ODUwQUM0NkRERTc1REJGQSBeCitFOUM5QkY0MUM4NTQ5MzU0MTUxQjk3NzAwM0NFMUQ4MzBCRTY2N0RCIF4KKzA5NDI5MDg5NjBCNTRGOTZDQjQzNDUyRTU4M0Y0RjlDQjY2RTM5OEEgXgorRkNFMzQwNTFDMzRENEI4MUI4NUREQzRCNTQzQ0RFODAwN0UyODRCMyBeCis2MUU4OTE2NTMyNTAzNjI3RjQwMjREMTM4ODQ2NDBBNDZGMUQ2MUQ0IF4KK0YwMDhENUQ3ODUzQjZBMTdCNzQ2NkNEOUUxOEJEMTM1RTUyMEZBRjQgXgorQkQ4RDJFODczQ0Y2NTlCNUM3N0FBQzE2MTY4MjdFRjhBM0IxQTNCMyBeCitCMjVBMDRERDQyNTMwMkVEMjExQTFDMjQxMkQyNDEwRkExMEM2M0I2IF4KK0E0MDRFMjE1ODgxMjNFMDg5MzcxOEI0QjQ0RTkxNDE0QTc4NUI5MUYgXgorQTFFMTNCQzU1QkY2REFEODNDRjNBQUJEQTMyODdBRDY4NjgxRUE2NCBeCitENUZEMzVGRkFCRUQ2NzMzQzkyMzY1OTI5REYwRkI0Q0FFODY0RDE1IF4KK0MxMkU5QzI4MEVFOUMwNzlFMDUwNkZGODlGOUIyMDUzNkUwQTgzRUYgXgorRTIyNzY5REMwMDc0OEE5QkJENkMwNUJCQzhFODFGMkNEMURDNEUyRCBeCitGMjk4MzVBOTM0NzU3NDBFODg4RThDMTQzMThGM0NBNDVBM0M4NjA2IF4KKzFBMUQ3N0M2RDBGOTdDNEI2MjBGQUE5MEYzRjg2NDQ0MDhFNEIxM0QgXgorNEVDODQ4NzBFOUJERDI1RjUyM0M2REZCNkVERDYwNTA1MkNBNEVBQSBeCitENjg5NTEzRkVEMDhCODBDMzlCNjczNzE5NTlCQzRFM0ZFQ0IwNTM3IF4KK0M0RkVENThGMjA5RkMzQzM0QUQxOUY4NkE2REFDQURDODZDMDREMzMgXgorMDUxODg4QzZEMDAwMjlDMTc2REU3OTJCODRERUNFMkRDMUM3NEIwMCBeCisxQTM1NDBCRUUwNTUxODUwNTgyNzk1NEY1OEI3NTFDNDc1QUVFQ0UwIF4KK0RGQTE5MTgwMzU5RDVBN0EzOEU4NDJGMTcyMzU5Q0FGNDIwOEZDMDUgXgorN0IwRkE4NEVCQkNGRjdEN0Y0NTAwRjczRDc5NjYwQzRBMzQzMUI2NyBeCis5RTg4NjA4MUM5QUNBQUQwRjk3QjEwODEwRDFERTZGQ0RDRTZCNUY0IF4KK0E0RDQ2RTRCQTBBRTRCMDEyRjc1QjFCNTBEMDUzNEQ1NzhBRTlDQjYgXgorNjM0MkIxOTlFRTY0QzdCMkM5Q0JDRDRGMkRDQjY1QUNFRjUxNTE2RiBeCitBQUJGRDYzNjg4RUI2NzgzNTc4NjkxMzAwODNFMUI1MkY2RUE4NjFEIF4KK0Y3MzJCNzM3MkRBRjQ0ODAxRjgxRUZGRTMxMDg3MjYyMzk4Mzc5MzYgXgorNUU5MzQ3RkU0NTc0Q0RDQjgwMjgxRUQwOTIxOTExOTlCQUREN0I0MiBeCitENTc3NkI3REZGRjc1QzEzNThBQkRCQkIzRjI3QTIwQkI2Q0E3QzU1IF4KKzAyMkI3QURBNDcyRkI3QTlEQTkyMTk2MjFDOUM1RjU2M0QzNzkyRjYgXgorN0YxREU0RUNBMjAzNjJEQTYyNDY1M0QyMjVBNUIzRjc5NjRBOUZGMiBeCitDQTBGMkIxQkZCNDQ2OUMxMUVEMDA2QTk5NDczNEYwRjJGNUVGRDE3IF4KKzgzM0Q2M0Y1QzJFQTBDRDQzRUMxNUYyQjlERDk3RkYxMkIwMzA0NzkgXgorMTRGRDM1NjE5MDQxNkMwMDU5MkI4NkZGN0NBNTBCNjIyRjg1NTkzQSBeCis0QUI2QjU3RURERUYxQ0U5MzU2MjJGOTM1QzE2MTlBRTdDMTY2N0Q2IF4KK0I0NTZBNkE5NjhBQ0Q2NkNBQTk3NEY5NkE5QTkxNkU3MDBBQTNDNUQgXgorRkQxQzI1N0ZFMDQ2QjJBMjdFMkYwQ0Q1NUVEMkRFQ0E4NDVGMDFENyBeCis2NkUwRDAxNzgwRjEwNjNFMjkyOUVBQUQ3NDgyNkJDNjQwNjBFMzhDIF4KK0E4NDc4REY0MDZGMTc5RkQ0RUY5N0Y0NTc0RDdGOTlFQTFDRTlFQjggXgorMjQ4RTU4Q0YwOUEzNzIxMTRGQzJGOTNCMDlDNUZDMTRGM0QwMDU5RSBeCitGMTU3NjdERTkxNzk2QTY4MTY5NzdFRkE0RkNFRDRCN0ZEOUI4QTU3IF4KKzM2QTZCQzVFNjgwRTE1Njc1RDk2OTYzMzhDODhCMzYyNDhCQkJBRjQgXgorNERFQTYyNTFCMkE2REYwMTdBODA5M0FCMDY2RUUzODYzQTRFQzM2OSBeCitEMzBFNzBFMzU3RDU3RTNEODJDQTU1NEI4QTNENThERkY1MjhGQTk0IF4KKzcwQ0E4NEQ4MjdGN0ZENjE0NDYyMzNGODhDRjJGOTkwQjBGM0UyQUEgXgorOEQ1MDBDOUNGREUwMjg4NTMwQTIxMDZCNzBCRUQzOTMyNkM1MkMzQyBeCitGM0Q0RDEzOUVERkMyNDU5NjM3N0JDOTdBOTZGQjc2MjFGMjdGRkM3IF4KKzU1MDlCQUZGQUM2RDUwNzg2MENFRkM1QUI1ODMyQ0I2M0NENEI2ODcgXgorMEMwQUVBMEMyRkQ3QTYyMEM3Nzg2NkIxQTE3NzQ4MUUyNkI0RjU5MiBeCisxNDkxNzYwMDdGRUU1OEE1OTFFM0YwMEY4REI2NThCNjA1RjgzOTBDIF4KKzE3QzBEN0IwMjU2MTU5RjM2MjY3ODZGRkRCMjAyMzdBRTE1NEZBODQgXgorNzQxQTU4NjE4QUJFQjFEOTgzRDY3QUZEQ0JDNDlBQTM5N0EzQjhFMCBeCitCNzM4RDZCMzQwOUVCOUVEMkYxNzE5Qjg0RDEzRjdDMzYxNjlDREVDIF4KKzNEMzNERTMxRjY0MDU1RDNCMTI4QUM5QTZBQTNGOTJERkQ0RjUzMzAgXgorQjY5MjVGNERGOTQ5NDlCODg0NEM4Njc0MjhCQTNERURGNENGMkI1MSBeCitDRjVFNzI1NjI5MkFCRUM0MzFEOEU4QjlDQkVBRjIyQUYwNzIzNzdFIF4KKzk3NURDRTk0OTAyOTIzOTc3RjEyOUMwRTRBQ0Y0MEFEMjhEREI5QUEgXgorMzMzQjAyNTlCMThDRTY0RDZCNTJDRjU2M0REMzA0MUU1RjYzQTUxNiBeCis8RAorCitIPlNIUyBUeXBlIDMgSGFzaGVzPEgKK0Q+Cis4MEUwNDQ3MDNBODgwQzIwRUM0MUY2NDUxMjBBOEE1QjVEMTk0RUNFIF4KK0UxNDI4MjlDQTA4RkM5Nzg3RjE3QUExNkNFNzI3Mzk2MTY5QjI3MTMgXgorNkEyQkFGNjI0NjlEMzExRjkyNTdBMDcyN0Y1MkM3RUFBODdDQ0VCNCBeCiszNjJFM0U3MTM2Q0E2MTFEN0ZCRjY4N0QzQkJEQzU0Q0RBNjQ4NDNGIF4KK0Y1OTAwQURDNjIyM0E1RDI0QTc1MjZBQkZDNjBGQThFMkQ1OUE1QUIgXgorQUQwQ0FDNkEyMUQ1QjEwODMzRERFN0ZBODU5MjdENzRFREExNDJBOSBeCis0N0FEMzM3RUFGRkRDMTc3QUFGN0NCRDAzNUJFNkYzOThCOUQwNTM2IF4KKzlDRjU4NTk1REY4MDg3MjUzNUJDQzdDMDU2RTIyMzU0NkYwQkI0RUUgXgorNzE1MUNFQjE5MTgyNzhDRUQyOTAyQjFENjYzRDU5NkY4RDFCOTg2RiBeCitBRERDOUYwOUFBNDAyNkVGNkM0QjdGMUE4NEQzQTEzQjRDREM2NUIzIF4KKzkyMUZFNzhBODYzQTMxN0IxRkExRkIzQ0EzQkUxOTQ4REU3RUY3NTQgXgorNjRCRTEwNzMyRDcxRDUyQ0U4QTQ4NkRBMjNFNkI0NTNERjdDNkZCRCBeCis0QTQ1MDY1OTQ3MERENzU5QUJGQUUxRDczOTcyQTZEMkU2M0FDMTZDIF4KKzBENjY1RTRCQkYzMEI3RUFCOTU1QkRFODQ3NTlFMTg1RUVDQUI0Q0IgXgorMEMxQjhFRTk0RDYxQ0REMDgzN0VBRUQ5RkUzM0RFNEE4MzM0QjU5NiBeCitEOTNCRkUyQTYyMjdBNEJGOUI3QzYxRUJDRTRBOENERTEzMTU5M0ZFIF4KK0JEQTg4M0Y4MDRCNDcwQzkwQkQ2QUM0OTBERkMzNEVCQzI3Rjk2NDggXgorNDZBMDk2OTM3MzU1MjIxMzYzMjU5MUM1MjAzMEMzOEU1REJEQzQ5RSBeCis0NzgxMjg5RTQ4QjkxMEM1NTBEQzIzQ0E3RDNBRjUzMjRDMDM1MzJEIF4KKzY5M0EzNENGQ0RERUQwRjNBQzcyRTcxOTdGQ0U5QkI2NkE4RTM5ODEgXgorQUUwODhBRjFEODg2NTE0MDk2M0IzQUJGQjYzRTMyRTA0Q0QxNTA2RiBeCitBREYwRjhGMUQ4NUNBOTc1ODZGNURDNkRDNUZEMTFGQTM5MjcwRjU1IF4KK0U0ODRGNUFEODZDNUY0RDA5RTM2NkFERjZFMERFNzM0NDlGOTdCMjggXgorODFDNDk4NDJCQTNENzA3MkZCNDIyODhFMDNDRTczN0EyNjcyQzA5MSBeCitGNkNDNzFBRDg5N0MyM0ExNjgzNTQ5MERFRDI4OUJGRDQ1NTAwQUIwIF4KKzIzRTcxQUVENjJGRThFMjhGMzRGNThFN0ZFNTU5NEVDNUVCMDQ4NkMgXgorOTJCQTc5MzRBQTU4NjdFRTUyOTYwRjRFMEVERkI5MEFBN0I2OTMwNSBeCitDM0QxQ0M4Q0JEMUI2RkZFRTBEOTBDRTk2MkNEOUMwOUFCMTU0OEFBIF4KKzNDRTM3QTU4M0I3MUE2QTc3QkUzMjUwNjZBMEYwMEM1RDExREZDM0UgXgorNzZFRjVEMjM2RTEwNDJEMzU2QTMyMzRBNDIyQzA5MkY4NjAwMzA2NCBeCis4QzNGNzAzNDM2QzZDODgyRTYwMjYzNTQwQThFNEMzRTU2NDZEQzE1IF4KKzYxMzhGOUYzQUI0M0I5ODhERDM4NTc0MjJDQ0IzMDQzNTI0NTlGNDAgXgorQjgxMkRFOTg3NzVCNDY5MEI0RkMyRUNGQ0FCNjFDNzNDNzI3MURDNyBeCiswNjY2MDk4NUNEODBENDhFN0I5Rjg4NDU1QjQyMzM5MjRDM0I2NEJCIF4KKzc2QUI0QjYzNzhENkY2MzQ5OUE5NEVCNjdFQjFDQjMxQUZGOEQ3NzUgXgorRjMxRjZCMEJFN0FCMDU5QTFGNTlBNDY0ODE5NjdFODgzOTI5NzlFNiBeCiswQzE2Mzg0OThGQkI3REI5NjAwQjk4QjRCMjJFRjg1RTBGRTI0NUZCIF4KKzU2MDdDNkFGNjAwOTM5NzM2Nzk1QUM1MjNGQTQzQjczNkY0MUExMTggXgorOEEwMzI0NDg2NkJERDIxQjlEOEE4MkU5ODQzNkM4OTRGQUQ4NkVDQyBeCis4QTc1QkZEOTExQUY4NzMwM0I5QjhGQjdBMUE0N0NDQTUyRDNEOThBIF4KKzE2RjBGM0I1RDM3NDExMjM2QTFFM0Q2QjFFREFCNzRDREEyNUVENEIgXgorQUM3MkJGNDU0Nzc0ODFGNThBMzAyNjI4REM1Mjk5RkZBMzJFN0M5RiBeCis3NENGRkQ1ODgxRjc1QUMyMDcyNkUxNDQ3RENGN0Y0NzAyNDM4MEVGIF4KKzVCRkJFQ0VFQ0JDMjdEQTA1NzI5QzREMUFDOEMxMjg2RUE2RENFQzkgXgorMDEyQUFDQkMwNTc5RkE0Q0I0RjEwN0U5QTlBRDFBODZBRDJGNkE0RCBeCitGN0Q1NTJDQkM1RUY5MEYxQTU3OTM4OEI1QThBOUVDNzFFQjY3NjgxIF4KKzEwQzcwMTE1QzRDMzQ3NTMyNzRCRkVENDc3REYwMTQ0MEE2N0EzNjEgXgorMDc4RDJGQUNEMjkzQjZCNjIxOUQ4OTg5OUMxNkFBMUFBOEUzREU4MiBeCis4M0M2QkY5RkIwRDMwOTFBREYzNzRFQkZBMEE2OTkxNkYxN0U2RDI2IF4KKzJDREIxOTI0REE2MkFCNjRDMDA3QzY1MDVGRjY1N0U0QURERUE5QzEgXgorRTk1RDIwOUJDQjk4NjRCMDc2RkY0REZDQThGOEJENzVENjJEMUI0OCBeCis2MzI4MjRDRjUwMjVGOEY5MEFEMjkyM0JEREY0NDk1NTBENjRDMEY1IF4KKzAyQjFDMEI0MUZDMjdFQzVBMzJFNTg2RjFBQzQ4MEJGMDA2MUU1NkEgXgorMjgxNTZCQzY3NjlBRTM5MEJGMzJDNjUxMkM0NjE2OTE4MUUxNTM2RCBeCitGNzMwRTZFMjg3RDk5MkU3RjNFMDEzQjZGMUUwODhGMEI5QzQxNTk4IF4KK0IwNTZBNkE4MzJGQTVGRTk2NEVGNzdGRjNFMEJFMUMzMkUwRDU4QzAgXgorRDVCM0QxOUFGQkI0OEZCNTZCQTZENDRBODJERTZCRDA4REIyMDhERSBeCiswMjE1QUQ3OUJENkI4MDIzQzA1RkQyRjg5NjYyMTE4OTdERjYzMzdBIF4KK0VDNENGMzhDMjQ0RUI2NTI2QTQ0RjcwNTcwOTI1MjQ3MTQ1REE4Q0EgXgorQzBEOTMxMjYyRUNFOTNEQTVBNkFCQzg5Q0Q2QUQzMTYyRUE2QjA5RSBeCis2QkI0OEZBQzI2QUEyQjQ4NTlCQkRFRkNGQjUzQUU0RDFEOUEwMzQwIF4KKzU4NjExRDQzNzQxRTY3QTdGMERBOUNCMzM3QTU5RENEMUVCRTc1OEUgXgorN0MyQUVDMjE2QUYyMzE1MDlFNDdCN0VFRDA2QkIxNzg1OTgxMkI3RSBeCitGNjBFRTVEQkY0QTdBNjc2RUM5OEIzRERCMUNERDZDREYzQ0RBMzNCIF4KKzA0OTJFNTlCMUY0Qzk0RTk3RjI5QTI2QzNFRTdENTdFMUIwRkRENzIgXgorNEZDRjU0OUQ5MDJEOUJFMTEwMUE3NTZEQjlFNDU0MTVGQjYxQkNEMiBeCis5NUM3MUQyNkFENkIzOENDNzcxMzc2QjRBNEY5NjJGMTJFMUUzRDRGIF4KK0Y2QTI0NDlFNzczQzcyRkI4ODZCM0M0M0UyQjMwRUMyQTFCNzQ1NEEgXgorQ0RFODY2OTVFMDBBRUM5QTVEQjZGRERCNUQ1QTU5MzQ0NDhENThFMCBeCis1MDIzMThBNzU4RkFCRkY2QUM1Mzg0NEU5RTJCQ0QxNTlDNjc4NTEwIF4KKzU4OUQyOTUxNDhGOTVGNzVEQUU5NjRERDc0M0ZFOTgxRkEyMzZENEUgXgorNzk3M0REMzNBRTM1OTlBNTU2QkFDQzc3RTg2NTZFNzgyRTAyOUVGRiBeCis5RjVCRTQzQUFERDQzQzZEQjM4ODNDOURBNEI1MkUxQTUwMjU3QUVFIF4KKzQ1NDI4OUQ4RkZCMjM3QTU2RDUyMTRFQUU4OEYwQTlEMzI4RkVBMUEgXgorN0U2ODZCMzY1OTVCRUI0QzBENDUyOEZGOTYwRURCNTUwODhBMDI4RCBeCitGOTc4OUQxRUYxOUEwMDg0QUMwRTlGNDNBNEJDMEVFMDQ3ODkzOUVGIF4KKzJGMzJCMEU3Q0M4QkUxOUMzMjU1NDVDODE2RTc3MDU2RDdCQkU3MEYgXgorNkIxNjE3NzQ2RjA3M0NGQ0QyQ0VCQ0FGQkJFNkZEMEUyOEVEMkQ1NiBeCitDRjhEMkVBMzg4OEFENzY3NjE3OTkzODNFNUExNTk3OUY2REI3QTg4IF4KKzU1N0FGNkQ5RDU5NDcyMDNDNjBFOThDOUE3OUI5MkI4QkQwODVFMkIgXgorQzYxQTIxNzQyM0RFNjhFRDZDRDM0QzkxNzU2QzhERDNBNjUwQTJBMiBeCis3M0YzRjc5QzE1MUI2QzFCRDkzNjlFREIyNkI5MzJDMjM2MkIwNTkzIF4KKzM2NDE0MUU1RkJDREU4M0YyMTBDNUJCQkVCNjgxMEY2Mjk5REUxNEIgXgorRjgwNkJFQ0QwMjVEMjY0RkQ1OUU5M0Q5RTM2MDZBNjc0QzQwRjIxNiBeCitFMEM3NjFBNTdGMDBDQkZCMDdENDlCQ0IwMzRDMzZBNzEyMkY0QzVCIF4KKzVEMzgzMTA0NEI5RTAwMzJGQkUzQzM0MjVGRkQxMzY5OEY0MTNCMzMgXgorN0VCMUFCNDFFOTk5Nzc1M0M1RDUzMERGMTE4RTcxRTcyRDdCODZGQyBeCitDQzA1M0VBMTU1NjI2OUQ3RThCQ0JBMzBCMjA4RkNCRjBFRTJFRTY0IF4KK0E1NzczOUIxREQ0MUU3REMwQzQwRDZCNjE1OUE3RTczQ0UyNzQ4QUEgXgorOTBEQTUyN0M5REI5QUNDMkZENTMwRDU2MEEyRjExOTFBODBEMDU2NyBeCis2QUMxRjJBMEI4Q0EwRTVBQkM5RkRGMUFEQ0U1ODhGQkRGNUNDNTNFIF4KKzQzQzFBMEEwRUU0MTYzRUM5Mjk3MjY5ODlGOTJCMDM2MzlCMjMzQUIgXgorODkyN0YyOTk0NjI0MTNBQzI5QTc0MDgwRTU0RDhFRTJEQjcxNjVFNyBeCiswQzhEN0UyMjIyNkQ5MUI0MjNFNzgxQjUwOEYzMTUxN0VBQUI2MDdCIF4KKzcyODZFMjBEN0YwOEQxOEE4OTMyNTRGQkQzQ0M4MzNGNzk3M0RDQUYgXgorMENCOEMyMzU5MjhCOEU5MzZDNDNCOEYyOUVGMzc1OEI5RkQ1NEE3QiBeCitGNjdDMjRDQzIzRTQ0MENBM0YyMDZDRUVCNTUwNEVDQTU0Q0Q1Q0EzIF4KK0Q3OEEyNURFQUExRTdBREFEREIzQzE0NUVEMEU1MjYzQkE0RjI5MTAgXgorMDBBQTY4MTc0RDI5NDkyQzU3OEFDODUzRkZDRDU1OTA4MjkyRDQxQSBeCitENTU3MEVFREIwOUE2MkE1OTQ4RjdGMzExRjdFRDVFRjI0N0Y5QUQ5IF4KKzxECisKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zaGEtMS9ieXRlLW1lc3NhZ2VzLnNoYTEgYi90ZXN0L2RhdGEvc2hhLTEvYnl0ZS1tZXNzYWdlcy5zaGExCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhZDkwNzgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvc2hhLTEvYnl0ZS1tZXNzYWdlcy5zaGExCkBAIC0wLDAgKzEsMjI5NCBAQAorIyAgQ29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgIlNIQS0xIFRlc3QiCisjICBTSEEgdGVzdHMgYXJlIGNvbmZpZ3VyZWQgZm9yIEJZVEUgb3JpZW50ZWQgaW1wbGVtZW50YXRpb25zCitIPlNIUyBUeXBlIDEgU3RyaW5nczxICitEPgorMCAxIF4KKzUgMCAyIDEgMiAxIDIgXgorNSAwIDEgMyA0IDQgNCBeCis3IDAgNCAzIDQgNCAxIDQgNCBeCisxMCAwIDQgMSA1IDMgNCA0IDMgMSAzIDQgXgorMTAgMCAzIDEgNiA1IDUgMSAzIDYgNiA0IF4KKzEzIDEgMyAyIDUgMyAzIDMgNCA2IDYgMSA0IDYgMiBeCisxNiAxIDMgNSA1IDEgMiAxIDMgMyA2IDMgNSAyIDMgNSA3IDIgXgorMTUgMSA4IDEgNSAzIDIgNyA0IDUgNiA3IDMgMyAxIDYgMyBeCisxNSAxIDQgNiA4IDIgMSA0IDIgNSAxIDYgOCA4IDYgNCA3IF4KKzE4IDEgMSAyIDcgMyA4IDYgNyA1IDQgMyA0IDMgNSAzIDMgMiA2IDggXgorMTYgMCA5IDggMSA4IDEgNyA2IDcgNyAxIDIgNiA5IDUgNCA3IF4KKzE4IDAgNyAxIDcgMyA5IDQgNyA3IDUgMiA4IDEgNyA4IDIgNyAyIDkgXgorMTkgMSAyIDMgMSA4IDggNiA5IDEwIDMgMTAgOCA5IDIgNCAxIDUgMSA1IDkgXgorMTkgMSA4IDUgNCA4IDEgMyA5IDUgNyA3IDIgNyAyIDcgOCA3IDQgOCAxMCBeCisyMCAxIDEgOSA3IDQgMSA0IDUgMSAxMCA4IDYgNCA0IDkgOSA5IDggMiA5IDEwIF4KKzE5IDEgMTEgNiA3IDcgMiA2IDIgNiAxMCA2IDkgMTAgNSAxMSAxIDYgOCAxMSA0IF4KKzIyIDAgMTAgNSAxMCAzIDcgOCA5IDkgMSAxIDEgMTAgMiAxIDUgMTAgMiA5IDkgOSA3IDggXgorMjEgMCAxIDEwIDEgNiA5IDQgMiA1IDIgMTEgOCAxMiAxMiA5IDggMSAzIDEwIDcgMTEgMTIgXgorMjQgMSAzIDkgNSAxMiAzIDQgMiA5IDEyIDExIDYgNiAxIDEgOSA1IDkgMSA0IDkgNCAxMCA4IDkgXgorMjUgMSAzIDIgMyAxMSAxIDEyIDUgNiAyIDcgOCA0IDggOCA5IDkgOCA0IDkgMSA0IDggMTAgOSA5IF4KKzIzIDAgMTEgMTAgNyAxMCAxMCA2IDEwIDkgNCA1IDEwIDUgOCA0IDEgMTAgMTIgNCA2IDEgOCAxMSA2IF4KKzIyIDAgMTIgOCAxMCA0IDMgOCA1IDUgNyAxMSAxMyAxMSAxMiAxMSA0IDEyIDMgNiA1IDExIDEwIDUgXgorMjYgMSAxMCA5IDYgOSA3IDIgMTAgNCA0IDUgNSAyIDEyIDEzIDUgMyAxIDEwIDEgNCA3IDggMTMgMTMgMTIgOSBeCiszMSAwIDIgNiA1IDQgNyAzIDEwIDYgMTMgNiAzIDkgNiAyIDEwIDUgMyA4IDQgMSAxMSAzIDUgMyA3IDExIDEgMTIgOSAxMiA1IF4KKzI3IDEgMTQgNSAxIDMgNyAyIDMgOSAzIDQgMTQgNCA0IDEwIDggNSAxNCAxIDExIDEyIDEyIDEwIDQgMTMgNyAxMSA5IF4KKzMwIDEgNCA5IDUgNSA4IDkgNSAxMCA0IDIgNCA3IDkgOSA2IDMgNSAxIDggMyAyIDEzIDMgMTQgOSA4IDkgMTAgMTQgMTAgXgorMjcgMCAxMiA5IDUgOCA3IDIgMTQgMTIgMyA4IDE0IDYgNiA0IDcgNSA3IDEwIDcgMTEgMTAgMSA5IDYgNyAxMiAxNCBeCisyNCAwIDEyIDkgOSAyIDExIDEzIDEyIDExIDExIDYgMTQgMTMgMTAgNSA2IDggMTAgNCAzIDExIDExIDE0IDUgMTQgXgorMjQgMCAxNSA0IDUgMyA4IDEyIDE1IDggMTQgMTUgOSAxMiAxMiAzIDEwIDEzIDYgMTEgMTAgNCAxMyAxNCA4IDggXgorMjggMSAxIDggMSA1IDExIDQgOSAxMiA0IDEzIDE1IDUgOSAxMSA3IDE0IDExIDEgMTEgNyA4IDggMTEgMSAxMyAxNSAxMiAxMyBeCiszMiAxIDUgOCAzIDggMTAgNyA4IDEgNSAxMyAxMiAxNCA1IDMgNiA0IDEyIDE1IDYgNiAxMCAxMSAxMyA5IDEgMTEgNiAxMCAzIDcgMTQgCisyIF4KKzMxIDAgMTAgMyA1IDEgMTQgMTEgMTEgMTYgMSAyIDIgMTEgNiAxMyAxNSAxMiA2IDUgMTYgMiAxNCAyIDEwIDEyIDIgNSA1IDYgMTAgMTMgCisxNSBeCiszNCAwIDMgMTAgOCAxNiA5IDUgMTIgMTUgNCAxMSAxMyAzIDYgNSAxMCA4IDEgMyA5IDMgMTEgMSAyIDE2IDEyIDEwIDYgMSA5IDEgMTYgCis1IDYgMTQgXgorMzAgMSAxIDEyIDQgNCAyIDE1IDEzIDE1IDExIDE1IDUgMTEgOSA3IDE1IDE2IDYgMTYgMTIgMyAyIDEwIDE2IDUgNSA3IDEgNyAxMSAxNiAKK14KKzM0IDAgNyA5IDExIDIgNSA1IDUgNCAxMyAxMyAxNCA0IDcgMTIgNiA0IDggMiA5IDkgMTMgMTMgMyAzIDYgNyAxNiA3IDYgMTUgNSA4IAorMTUgMTQgXgorMzYgMSA0IDYgMTYgMTUgMTEgMTQgMTQgNCA3IDEwIDMgNCAxMCAzIDYgNyAxNCA0IDYgNiA1IDIgNyA4IDE2IDIgMTIgMTYgMTAgMTQgMyAKKzIgMyA3IDE0IDMgXgorMzIgMCAxNSAxMCA5IDEgMTQgMTAgMTQgNiA2IDE2IDMgMiAzIDggMyAxMiA4IDExIDE3IDMgOSA3IDE2IDE0IDQgMTEgMTUgNSAxMyA5IAorNSAxNyBeCiszMCAwIDE3IDE3IDEzIDggMiA2IDggMTYgMSAxMiA1IDE3IDIgOSA4IDEwIDEzIDE0IDExIDE3IDEyIDUgMTQgOSAxMSA5IDExIDQgMTEgCisxMiBeCiszMCAxIDE2IDYgMTAgNSA4IDMgMTcgMTYgMTQgMSAxNSAxNSAxNSA2IDEzIDIgMTEgNiAxMyAxMSAxMyA0IDYgNyAxMSAxMSAxMiAxNiAKKzEzIDE2IF4KKzMzIDEgMTYgMTYgMTQgMTYgMiA0IDE2IDExIDYgMTUgNyA0IDE3IDYgNSA3IDYgMyAxNCAxNiA1IDE3IDExIDEzIDEgMSAxNCAxMyAzIDYgCisxNCA1IDE2IF4KKzM5IDEgMiAxNiAxMyA3IDggNiAyIDE1IDEgOSAxMiA0IDQgMTEgMTMgNyAyIDExIDkgMTggNCA1IDQgOCAyIDE0IDkgOSAxIDggMTMgMTEgCisxNSA4IDUgOSAxMCAxNiA3IF4KKzM0IDAgMiA3IDEgMSAxNyAxMyA2IDExIDEwIDggNSAxMiAxNSA2IDE1IDEwIDEyIDQgMTggMSAyIDggMTEgMTIgMTYgMTAgMTIgMTggMTEgCisxNiAxMiAxMSAxNyA2IF4KKzM0IDEgNCA3IDEzIDcgMTAgNyAxMCA2IDEgMTIgNyAxOCAxMSAxOCAyIDEwIDE1IDEwIDE0IDggMTggOSA5IDEyIDEyIDMgMTMgMTIgNiAKKzQgOSAxNyAxMyAxNyBeCis0MCAwIDUgNyAzIDIgMSAxNyAxNCA0IDE2IDYgMTMgMSAxMyA2IDYgMTAgMSAzIDE4IDMgMTEgNyA5IDUgNyAxMSAxNyAxIDkgMTYgNSAKKzE1IDEwIDE3IDMgOCAxNSAxNyA4IDEyIF4KKzQwIDAgMTEgMyAxNSAxNyAxMSAxIDEgNCAzIDE0IDE4IDQgMiAxOCA4IDE1IDYgNCA2IDMgMTUgMTEgMTYgMTAgMTcgMTcgOSA2IDMgMiAKKzYgMTYgNCA5IDEyIDYgOCAxIDExIDE3IF4KKzM3IDEgMiAxOSAxMiA4IDE2IDE0IDIgOSAxNiAyIDYgNiA3IDkgMTAgOSAxMSA5IDE0IDExIDE1IDUgMTYgOSAyIDE3IDIgOCAxNSA4IDQgCiszIDE0IDE0IDE2IDE2IDEyIF4KKzM3IDEgMTEgMTAgMTYgMTIgMTEgNyAxNCAxNCAxNCA2IDEwIDEwIDEgNiAxMyAxOSA1IDYgNCA3IDEyIDEyIDEwIDUgMTAgMTUgMTUgOCAKKzUgMTMgMTcgMTMgNSA2IDE0IDEgMTkgXgorMzggMSAyIDYgNSAxNyA5IDExIDE4IDE4IDggNiAxMyAxNSAzIDMgMTUgNSAxMyAxOCAzIDIgNSA1IDE0IDcgMTMgNCAxNyA3IDIgMTcgMyAKKzE4IDE1IDcgMTUgMTYgMTggMTEgXgorMzggMSAxMiA4IDYgMyAxNyAxMiAxMyAxOSAxNSA5IDcgMTcgMTYgMTUgMyAxMSAxMSA1IDIgMTMgMTkgMTYgMiA0IDE2IDcgOCAxIDIgOSAKKzE3IDEyIDMgNSAxOCAxOSAxMSA5IF4KKzM5IDEgMTQgMTYgMTQgOCA5IDE2IDUgMSA2IDMgMTcgMTggMTYgOSAxIDE1IDkgMTAgOSAxOSAxIDMgMyAyMCAxMSAxMyAxNyAxIDE5IDggCiszIDQgMyA3IDEgMTQgMTkgMTkgMTkgXgorMzcgMSAxOCAxMyAxMSA1IDE4IDQgMTkgMTAgNiAxOSAxMSAxNyAxMCAxMCA3IDkgMTMgMTYgOSAxMCAxOCA0IDEyIDUgMTYgNSAyMCAxMiAKKzMgOCAxMCAxIDE4IDEgNiAyMCAxNCBeCiszNiAwIDggOSA2IDEyIDExIDcgNyAzIDE3IDEzIDYgMjAgMTcgOSAyMCAxNiAxMCAxMiAxNyA4IDExIDggMTEgMTAgNSAxMCAxNCAxOCA4IAorMTkgOSAxMiAxMiAyIDIwIDE5IF4KKzM5IDAgMTIgMTYgMjAgMyA5IDkgMTkgMTcgMTMgMTMgNCAxNyAyIDExIDcgMTQgMyA2IDE2IDEzIDEwIDEzIDUgMTYgMTAgMiA4IDIgMTcgCisxOSA0IDE3IDcgMTkgNiA5IDE1IDE1IDYgXgorNDMgMCA3IDIgMTggNSA3IDE4IDUgMiAxNSA3IDExIDEwIDkgMyAyIDE0IDE5IDMgMTEgOCAxOCAxNSA1IDMgNSAxMiAxNSAxNiAxMCAxNyAKKzcgMTkgMTYgMiAxIDE2IDYgMyAxOSAxMiA1IDE4IDE2IF4KKzQ5IDEgOSAxMSAyIDEgMTIgMTEgMTQgMTIgMTQgMTAgNCAxMSA2IDggMTYgNyA1IDExIDIwIDggMTcgNCAxNCA0IDE1IDMgMiAyIDQgMyAKKzIgMyAxNCAxNSAxMCAyIDEyIDcgMyA3IDIwIDIwIDE5IDEwIDIgMyAxIDEwIDIwIF4KKzM2IDAgMTkgMjAgMTIgNSAxOSAyMSA1IDIxIDExIDE0IDE5IDEgMTcgOCA5IDQgMTkgMyAxNyAxIDE0IDIxIDE0IDcgNiA1IDIwIDE0IAorMjEgMjAgNCA2IDIxIDcgMTEgMTIgXgorNDEgMCAxMiA5IDExIDYgMTYgMTggMTggMTAgMTEgMjAgNiAxMiAxMSA1IDcgMjEgMTkgMTggNiAxNSAyMSAxMCA0IDE0IDkgMTkgMTAgMyAKKzMgNSAxMyAxIDggMTIgMyAxMyA5IDcgMTAgMTcgMTQgXgorNDUgMCAxMCA2IDggMyAxNyAxOCAzIDIxIDE5IDYgMTcgMTUgNCA5IDE1IDkgMTUgMTQgNCA3IDE0IDggMTAgMTMgNCAxMSAxMCA3IDYgCisyMSAxIDE0IDUgMTEgNyA3IDIgMTMgMTMgMyA5IDEzIDggMTQgMjAgXgorMzkgMSAzIDcgMTggNCA5IDkgNSAxNSAxMyAxNyAxMCAxNSAxNiAyMCA4IDE5IDkgMTAgOSAxIDE5IDE0IDIxIDIgMTggMTMgMTAgNCAxOCAKKzE2IDQgMjEgMTUgMTAgMTggMTkgMyAxMiAxOCBeCis0MSAwIDE0IDQgMTMgMTEgMSAxMSAxIDEwIDIgMTIgNCAyMSAxMCAyMSAxOCA5IDIgMTYgNyAyMCA2IDcgMTIgMTkgMjAgMSAxMyAxMiAKKzEwIDggMjEgMTUgNyAxOSAxMyA2IDggMTkgMjAgMTggMTkgXgorMzcgMCAxMSAxOCAxIDE3IDE0IDE1IDIwIDE2IDIwIDggMiAxNyAxMCA0IDIxIDUgMTkgMTkgMTQgMjIgMjEgMTggMTMgMTQgMSAzIDEyIAorMTEgMTEgNCAyMiAxMyA1IDE4IDcgMjEgMjEgXgorNDggMCA5IDIyIDE5IDEyIDggMTYgNSAxNyA1IDkgMSAyIDkgNiAxMiA2IDEgNyA0IDMgMTUgMSAxNCAxIDEyIDMgMTAgMiAxMCAxNCAyMSAKKzEzIDE3IDYgNiAxNyAxIDIxIDIgMTQgMTYgMTcgOSAxMSAyMCAyMSAxMSAxOCBeCis1MCAxIDEyIDggMjAgMTMgMiA5IDIwIDkgMTQgMTAgMSAxNiAyIDIyIDYgNCAxNiAxNCAxNSAxIDEyIDQgMTQgOSAyMSAzIDMgOSA4IDIxIAorMTUgMTQgOCA0IDE0IDQgMiAzIDggMTIgOCA2IDEgMiAxOCAyMCAxNSAzIDE5IDEwIF4KKzQ0IDAgMTAgMjAgMTQgNiAzIDQgMjEgMSAxMiA0IDE4IDIgNiA3IDYgOSAyMCAxNCAxMCAxMCAxOSAxNyAyMSAxMiAxNSAxNyA3IDEwIAorMTEgOCAxMCAxMiAxIDE5IDE5IDkgMTggMjEgNCAxOCAxMSA5IDIyIDUgXgorNDcgMCAxNSA4IDE1IDMgNSA2IDIgMTkgMTIgMTcgNCAyMCA4IDExIDIwIDIgMTggNCAxNiAyMCAxMiA5IDkgNiAxNiAyMSAxNiAzIDE2IAorMTggMyAxOSA1IDE2IDIgNCAyIDEyIDExIDE1IDExIDE0IDE3IDIgMTAgMTggOCBeCis0OCAxIDUgMTMgMyAyMSA1IDMgNiAxOCAxOCAxMCAxIDIxIDIxIDcgMSAxMyAxMiAxOSAxIDE0IDYgOCAyMSAxOSAyMSAxMSAxOSAxMyAyIAorMTMgNCAxIDEwIDIyIDE2IDQgOSA0IDEwIDE2IDMgNyAxNSAxMSA5IDEzIDE3IDEyIF4KKzQ1IDAgMTQgNyA2IDIgMjAgMyA2IDE5IDE5IDEwIDIgMjIgMTIgMTcgMTIgMSAyMCA3IDcgMTUgMjAgNiAxOCA4IDMgMTQgMjMgMTggMTUgCis0IDcgNSAyMyAxNSA3IDE0IDEwIDEwIDE5IDE3IDIgNCAxNSAxNyAyMSBeCis0NSAxIDE1IDExIDggOSAxNyA1IDEyIDE4IDE0IDYgMjAgMTcgMjEgMTIgMTYgOSAyMiA5IDIwIDE1IDIgMjIgMTEgMiA2IDExIDkgOCAyIAorNCAxNCAxOSAzIDIxIDIxIDIzIDggMiAxMSA0IDggNCAyMCAyMiAxMSBeCiszOCAwIDIxIDE4IDIyIDEwIDE5IDkgMTQgMTcgMjMgMjEgMTAgNyAxNSAxMyAxNiA1IDQgMTAgMTMgMTQgMjAgMjMgMTIgMjAgMjMgMTggCisxMCAxMiA4IDIxIDExIDYgMTIgNyAxOSAxNCAxOCAxNyBeCis0MCAwIDE4IDIyIDYgOSAyMiA1IDIzIDEzIDYgOCAyMyAyMCAyMiA1IDIyIDE1IDE5IDIwIDkgOSAxIDEzIDEzIDEwIDE0IDEzIDUgMjIgCisxNCAyMSA5IDIxIDE5IDE0IDE0IDQgMTggMTMgMTIgMTQgXgorNDggMSA3IDMgMTUgNSAxNyAxNCAyMyAxNCA1IDE3IDIyIDExIDEgOCAxMyAyMyA2IDIxIDMgNiAxMSA3IDIzIDggNiAyMSA0IDQgMjIgCisxOSAxMyA4IDUgMTkgNyA1IDIzIDEgNCAxOSAxMSAyMyAxMSAyMSAxNCAxIDMgMjEgXgorNDMgMCAyMiAxNCAxMSA3IDE4IDE2IDE3IDI0IDEyIDEyIDMgMTMgMTkgMTYgMjIgNCAxNiA0IDYgMjMgOCAxOCAxMSAyIDMgMjAgMjIgOSAKKzIxIDggMjMgMSAyMyAyMCA3IDE2IDEzIDIzIDQgMTMgMyA3IDIyIF4KKzQ3IDEgMjMgNiAxMyAxOSAyIDMgNyAyIDkgOSAxNSA2IDEzIDQgMjIgNiAxOSAyMCAxIDkgNyAxNCAxIDE1IDMgMjMgMjQgMjIgMTggMTIgCisxMiAxNyAxOSAxMCA4IDExIDIyIDEyIDEwIDIgMjAgMTUgMTggMTcgMTggNyAxOSBeCis0NyAxIDEyIDIxIDYgMTIgNCA3IDE4IDE3IDMgMiAxNCAyNCAxNCAxIDIzIDEgMTEgMTUgMTAgNiAxOCAyMCA3IDEgOCAxIDE2IDYgMjAgCisyMyAyMyAyMSAxMCAxMCAxMiAyNCAxMCAxMSAyMyAyIDEyIDIzIDkgMyAyNCAyNCAxMCBeCis1MiAwIDE0IDEwIDE4IDE1IDE0IDUgMTYgMTEgMjIgMiAxNSAyNCA4IDIyIDEgNCAyNCA5IDEwIDE1IDMgOSA1IDQgMTcgMTUgOSAxMiAKKzE5IDE5IDEgMyAxMCA2IDggMyAxNyA4IDE4IDI0IDE5IDMgNCAxNSA0IDkgMiAyNCA1IDIwIDEzIDEzIF4KKzQyIDAgMjAgMTcgMTkgMjIgMTMgOCAxMCAxOSAxNSAxMSAxIDE0IDE3IDIwIDIyIDEwIDcgMTEgMTYgOSAyMSAyMiAxNyAyMyAxMiAxNSAKKzQgMjQgNyAyMSAxOCAyIDIxIDE2IDEgMTkgMTggMjAgMTEgMyAxNSAxNyBeCis1MCAwIDE4IDEgNiAxNCA1IDUgNSAxOSAxMyAxMCAyNCAxOSAxNiAyNCAxNSAxMyAyIDE5IDE1IDI0IDIxIDE3IDQgMTMgMTcgMSAxIDkgCisxIDEwIDIgMTggMSAyMSAxOSA1IDE4IDEyIDIgMjIgMTYgMjMgMTUgMTkgNiAxOCA5IDEgMjMgNSBeCis1MSAwIDIxIDEzIDE0IDExIDE4IDEyIDEzIDMgMTkgOSAyMCAyMiAyMCAyIDExIDEyIDYgMSAxMiAxNiAxOCAyIDkgOCA0IDMgMTEgMTcgCisxMSA1IDQgMTkgMTYgMTEgMjMgMTMgMTggMSAyMCA4IDIgMTYgMTYgMjEgNCAxOSA1IDUgMjAgMjQgMTYgXgorNTMgMSAyMCAyNSAxNyAxMSA4IDQgMTkgMjUgMTcgNyAxNiAyMSA2IDQgOCAyIDE1IDkgMiA5IDE5IDMgNiAzIDMgMTAgMjUgMTMgMTUgNyAKKzggMjAgMjEgMTIgMTAgMTIgNSAyNCAxMSAyMCAzIDEzIDEzIDE2IDkgMTMgMTAgMyA5IDE2IDMgNyAyNSBeCis0OSAxIDkgOSAxNCAyIDEzIDE3IDI1IDIgMTggNSAxOSAyMyA5IDI1IDkgMTAgMjMgMTIgMTIgNyAxMyA4IDE1IDcgMSA2IDIxIDIgOCA3IAorNiAxNiAxNCAxNCAxMiAxNSAxMyAyNCAxMCAxNSAxMSAxMCA4IDE0IDE1IDIxIDI1IDIxIDI1IF4KKzQ3IDAgOSAxOCAyMCAyMiAyMSAyMCAxMSAxNCAyMyAyMiAxMCAxMyAxNCA4IDE5IDEyIDIgMTEgMjAgMjMgMTMgNCAxMCA2IDUgNyAyMyAKKzExIDMgMTYgOCAyMSA0IDggMTggNSAxMiAxNCA4IDYgMjAgMTkgMjQgOCAyMyAxNyAyMyBeCis0OCAxIDcgMTkgMSAxOCAxIDE0IDIyIDEzIDE0IDUgOCAyMiAxOCAxNCAyNSAxNyAxMSAxMiAyMiAyIDEyIDEyIDE2IDEyIDEzIDE4IDE3IAorMTIgMTcgMTQgMTggOCAyNSA5IDIzIDUgMyA4IDE0IDI0IDE3IDcgMyAzIDIzIDE3IDIyIDE5IF4KKzUxIDEgMTkgMTcgMTYgMjIgMjQgMTQgMTYgMjAgMjMgMjAgOSAxOSAxNiA3IDEyIDE2IDUgOCA5IDcgMTAgMjEgMjQgMTAgMTEgMTkgMSAKKzIxIDE0IDE0IDE5IDMgMjIgOCAxMiAyMCAxIDE4IDUgNiA1IDEyIDE0IDEgMSAxMSA5IDIyIDMgMjQgNCBeCis1MiAxIDYgMSAxMSAxNiAxIDEyIDggMTEgMTEgMTcgMTAgMjIgNyAzIDEwIDIgNiA0IDI0IDE2IDI0IDE5IDQgNSAxOCAxMSAxMiA5IDIwIAorMjEgMjUgMiAyMSAxOCAxMCAyMCAyNSAyMSAzIDE3IDE3IDUgOCAyMiAyNSAxOSA4IDEwIDE5IDcgMTEgMTggXgorNDQgMCAyNiAxNCAyMSAyNSAyNSA0IDkgMTMgNSA4IDkgMjEgOCAxMiAyNiAyNCA5IDI0IDE1IDEgMjMgMjIgMTYgMTQgOCAyMiAxNSAxOSAKKzI0IDIwIDcgOCAxNSAyNCAxMiA0IDQgMjMgMjEgMTMgMTkgMTUgMjEgMTIgXgorNTkgMSAxNSA3IDMgMjEgMjAgOCAyMiAxNCAyMyAyNiAxOSAyIDEwIDE4IDMgNSAzIDEgOSAxNSAxNSAzIDcgMTMgMjMgOSA3IDEgMTMgCisxNyAxNCAyNSA5IDE2IDIgMiA2IDEzIDcgMTkgMjUgMTcgMSA1IDIxIDIgNyAyMiA1IDYgMjUgMyAxMiAxOSA2IDIgNCAyNCAxNyBeCis2MCAwIDkgMTggMjAgMTkgNCAxMSAxNCAxIDYgOCAyNiA2IDkgMjIgNCAxMCAyIDcgMjEgOSA4IDI0IDI1IDE0IDIyIDEyIDIyIDMgMjMgCiszIDMgMjAgNiAxMSAyMyA2IDEgNyA1IDE4IDUgMTUgMjUgMjYgMSAxIDEwIDExIDExIDQgMTIgMTEgMjAgMyAxNCAyIDMgMiAyMyAxNSBeCis0OSAwIDEyIDE3IDI0IDExIDggNiAyNCAxNiAxNSAyMiAyMSAxNCA2IDEyIDIwIDE5IDUgNSAxMiAxMSA2IDIzIDIgMTYgMjMgNyAyNCA2IAorMjEgMiAxNyAxNyA1IDI1IDExIDI1IDIwIDI1IDI0IDE4IDYgMTIgMTkgMjUgNyA2IDUgMiAyNSBeCis1NCAxIDEyIDE2IDEgMTUgNyAxIDI2IDE5IDE5IDEzIDIwIDExIDE3IDYgMjAgNSAyNCAyNCAxIDIxIDExIDkgMjAgMjEgMTUgMTAgMTkgCisyNiAzIDIgNiA3IDEyIDkgMTAgOCAxNCAxMCAxNSA1IDE3IDggMjEgMSAyMCAyNSA2IDE5IDggMyAyMiAxNiAxNiAyMCBeCis2MyAwIDE3IDEzIDExIDEwIDE3IDE1IDEyIDYgMTMgMTQgMTcgNCAxMiAxMCAyNCA1IDEzIDI0IDMgNSAyIDUgMTEgMTQgOCA1IDEwIDE3IAorMTYgOCA0IDE0IDIxIDE1IDMgNiAxNyAyNSA4IDIgMyAzIDE5IDEwIDEzIDIyIDIyIDggMiAxMyAyNSAxNyAyIDEgMTkgMSAxNCAyMCAyIAorNSA0IDE1IDI0IF4KKzQ5IDAgMTQgMjAgNyAyNSAyMCAyNiAyMCAxNiA3IDE3IDE3IDIyIDEgMTMgNiA1IDEgMTggMTQgMTUgMjMgMTUgMTAgNSAxOSAxOCAxOCAKKzI2IDEyIDEzIDMgMjUgMTIgMjEgMTYgMjQgNCAxNiAzIDYgMjYgMjYgMTAgMjAgMTMgMSAyMCAyNCAxNSBeCis1NiAwIDMgOCAxNCA1IDUgNyAxMSAxMyAxMSAyNiAxMSA0IDI2IDE3IDIwIDE5IDExIDEwIDMgMTAgMTQgOSA2IDkgNyAxNiAxMCA0IDQgCisxOSAxOSAyIDI2IDEzIDE5IDE3IDE1IDI0IDE1IDQgMjEgMjIgMTMgMTMgMTIgMjIgMiAxNCAyMCA1IDE4IDcgMTcgMjQgMjAgMjAgXgorNTggMSA2IDE3IDkgMjAgMiAxMCAxOSAzIDIyIDQgMSAxMSAzIDUgMyAyMSAxMSAxNSAxMiAyMyAyNiA1IDIgMjcgNiA1IDE2IDYgMyAyIAorMjMgNSAzIDIwIDIwIDQgMjQgMiAxOCAyMSA3IDE0IDEwIDI3IDIzIDYgMjQgNiAxOSAyMyAzIDkgMjIgMTYgMjEgMTcgMTkgMjMgXgorNTggMSAxNyA3IDIxIDE5IDYgMTYgMTUgMTUgMjAgMTQgMiAyNSAxOSAxNCAxOCAxOSA3IDkgMSAxNCAxMSAxMCAxNiAzIDIzIDE0IDI2IAorMTAgMTEgMSAxOCAxIDEyIDI0IDE5IDE5IDEgNyAyIDMgMjQgNyAxMiA5IDIgOCAxNiAyMCAyNCA1IDI2IDI2IDQgOSAyIDcgMjUgMTcgXgorNTQgMSA4IDEyIDE4IDE0IDI2IDcgMTcgMTggNCAyMCAxIDE2IDE0IDIxIDI2IDQgNiA4IDI0IDExIDI1IDE1IDI0IDE2IDIzIDQgMTAgCisyMyAyMSAyNCAxNSAxMCA5IDI2IDcgMTQgMjQgMjEgNiAyMCA1IDE3IDE2IDE3IDEgMyAxMiAxIDQgMTMgMyA5IDIxIDI2IF4KKzU2IDEgNyAxOCAxMSAxIDE5IDIwIDIzIDEyIDEyIDI3IDEzIDEzIDE1IDE2IDEzIDEgMTYgMTUgMTIgMjYgMyAxNiAxNiA4IDE3IDEzIAorMjEgNCA2IDUgMTkgMTQgMTYgNCAxNiAxMSAxNCAxOCAxOCAyNyA5IDEzIDIxIDMgMjYgMjIgMyA3IDYgNCAyNiAzIDE1IDggMjUgMjEgXgorNTAgMSAyMCAxMyA5IDExIDIwIDYgMTEgMjEgMjcgMjUgMjAgNyA0IDE4IDI2IDE2IDI3IDUgMTIgMTkgNyAyMyA2IDI1IDI1IDIgMTEgCisxMyAyNSAyMSAxOCAxNyA2IDEyIDE0IDEzIDI0IDExIDE0IDE5IDI2IDI3IDI1IDYgMSAxNSA0IDcgMjcgMTUgXgorNTEgMCAxNSAxNiAyNiAyNyAyMyAxNCAxMiAyOCAyMiAxNSA4IDE5IDIgMjAgMTMgMSAyNCAyIDI1IDEgNiAxOSAxOSA4IDExIDI0IDI0IAorMjEgMTMgMjcgNSAxMSAyOCAxNyA3IDI1IDYgMjMgMjQgMTQgMjUgMTIgNSAxMyAyNiAyIDUgOCAxMCAxNiAxNyBeCis1OCAxIDUgMjYgMTggMTkgMjEgMyAxMiAxMSAxMyA0IDE0IDIyIDIyIDE0IDE2IDEzIDMgMjIgMTYgMjMgNSAxOSA2IDEzIDEwIDI2IDE3IAorMjcgMjYgNCAzIDI1IDYgMTQgMiAzIDUgNyAyMyAxMSAyMiA4IDI1IDIgOSAyNSAxOCAxNyA4IDIgMTQgNCAxOSAxIDUgMjcgMTMgMjQgXgorNTMgMCAyIDI3IDI4IDIgMTcgMjMgMTAgMjcgMTggMjYgNyAyMiAxNiAzIDI3IDEgMjYgMjEgMjggMTAgMyA2IDIgMiAxMCAxNyAxMyAxNiAKKzYgMTcgMjEgMjMgMTMgMjAgMjIgNSA2IDExIDEyIDEyIDggMjMgMTMgMTcgOSAyMyAyMCAzIDI4IDI3IDEyIDE3IDIyIF4KKzU5IDAgMjggMTkgNSAyMSA0IDI3IDggMSAxOSAxNCAyMCA2IDcgOSAxIDYgMjIgMyAxOSAyNiAxNCA4IDYgNyAxOSAxNSAyMyAxIDE3IAorMTYgNiAyNiAxNCA1IDIyIDI1IDQgNyAxMCAxNiAyMSAxMCAxOCAxOSAyNCAxNiAyMyA4IDMgMTcgMjggMTggMTAgMiA1IDMgMjEgMjEgCisxNSBeCis1OCAwIDYgMjQgMSA0IDI0IDE4IDEwIDIyIDEgMjEgMTIgNSA0IDQgMjAgMjUgMjQgMjYgOCAyNSAxMSAyIDcgMjcgMjIgMTkgNCAxOCAKKzI3IDEwIDI4IDQgMTIgMjQgOCAxNiAxMiAxMSAxNiAxNyAyNSA4IDEyIDE2IDEgOSA5IDEwIDUgMjQgMjMgMTggNSAxNCAxOCA4IDQgMjggCiteCis2MSAwIDUgMTcgOCAyOCAxIDIyIDQgMTEgMyAyIDE3IDMgMTQgOSAyNyAxMyAxOCAyNCA5IDggNyAyOCAyNSAxNCAyMSAyNyAyNCA2IDE4IAorMTYgMiAxMiAxNSA5IDE0IDEwIDEgOCAxNyA0IDYgMTUgMjYgMTEgMTUgMiAyOCAyMCAyNiAxNiAzIDcgNSA4IDkgMjYgMTAgMTIgMjUgCisxMSAyMiBeCis1MyAwIDkgMTMgMjQgMTUgMjAgMiA0IDggMiAyMiAyMCAxOSA0IDE1IDE0IDI4IDEzIDI1IDEwIDEwIDEyIDI4IDI0IDIyIDI2IDI4IDE1IAorOSAxMSAyNiAxOSAyMiAyNyAyIDIxIDggMjAgMjMgMjYgMTIgMTAgMjEgOSAxNSAxMyAyNSA3IDI2IDEgMTMgNSA5IDIwIF4KKzU4IDAgMyA5IDIxIDIyIDcgMSAyMyAyOCAxIDIgOCAyMiAxMiAxOCAyOCA1IDE4IDE0IDcgMTEgMTcgMjAgMjAgNyAyMSAxMyA4IDI4IAorMjEgMjIgMiAxNiAyMCAxNSAyOCA5IDMgMjIgMTMgMTAgMjMgNCAxNiAxMSAxNCAxIDEwIDggMTQgMTQgMTUgMTggMTMgMTIgMjEgMTggCisyNSAyOCBeCis2MCAxIDI5IDIwIDIgMjkgMjIgOCAxNiAyMCA0IDEyIDkgNiAxMiAxNiAxNiA3IDkgMjAgMjkgMTEgOSA0IDEgMTUgMjUgMTYgMjkgMTAgCisyMiA3IDIgOCA1IDE4IDE0IDIzIDI0IDQgNiAyNiAzIDExIDYgMTIgMSA3IDE0IDI0IDE0IDYgMTAgMjEgMTYgMjMgMjkgMjUgNiAxNCAKKzE3IDI0IF4KKzY0IDAgMTIgMTAgNSAxMCAxNSAyNSA4IDE1IDMgNyAxMyAyNSAxNiAxNCAxIDI5IDIyIDI2IDE1IDI3IDkgMSA4IDggMjggNiAxMyA1IAorMTMgMyAxNSA1IDIzIDggMjMgMiA1IDUgNCAxNyAxMyAxNCA3IDE3IDEyIDI3IDMgMTggNSA3IDUgMjYgMTggMTUgMjIgMjggMTYgMTMgNyAKKzIgMjMgMTkgMjUgMTUgXgorNTYgMSAxNyA3IDE2IDI1IDIzIDExIDExIDE1IDIgMTMgOSAyNiAyIDI0IDI2IDcgMjggMTEgMiAyOSA3IDIyIDIzIDUgMjggMTkgMSAyNyAKKzI5IDEgMjQgMTEgMTggMjAgMyAxMyAxMSA3IDMgMTUgMTcgMjQgMSAxOCAxMyA2IDMgMjUgMjcgMTYgMjggMTggMjQgOCAyMyAyMiBeCis1MSAxIDI5IDI4IDYgMjggMTQgMTIgMjggMjcgMjIgNCAxNCAyNSAxIDMgOSA3IDExIDE0IDE1IDE2IDEwIDE5IDEyIDE5IDExIDIwIDEzIAorMjggNCAyNyAyOCA3IDI3IDEyIDQgMjggMjEgMTcgMjIgMjAgMTcgMTUgMTUgMjMgMjIgMTMgMTIgMjEgMjIgMjEgMjkgXgorNjQgMSAxMiAxNCAxMiAxOCAyNyA4IDcgNCA5IDE0IDE2IDE1IDggMTEgMjEgMjAgMTAgMTAgMjEgMjMgMjAgMiAxMSAyMyAxIDExIDEgNSAKKzMgMjMgMTYgMTUgMjcgMTQgNSAxNiAzIDIyIDIgMyAyNCAzIDE5IDI5IDQgNCAxMCA4IDIwIDE0IDE1IDEgMjYgMTIgMjcgMjUgNCAyOCAKKzIyIDExIDE5IDE5IDI0IDkgXgorNjAgMSAyMCA4IDkgNSAyNSAxOSAxNyAxOSAxNSA3IDI0IDI0IDIxIDMgMjAgMTYgOCAzIDE3IDI4IDE4IDI5IDkgMjMgOSAxMCAyOSA0IAorMTIgMjQgMTUgNSA4IDIyIDE3IDI5IDEyIDMgOCAyOSAxNSAyMSAyMSA0IDcgMjAgNyAxMCA3IDI2IDEwIDE2IDI0IDYgNyAxMiA4IDEyIAorMTUgMTcgXgorNjAgMCA5IDE3IDExIDI4IDEyIDI2IDI2IDYgMjkgMTMgMTAgMjAgNiAyMyAxMCA0IDMgMjYgMjYgMTQgMjAgMjAgMjUgMTQgMTMgMTUgCisyNCAxNCAxMSA0IDIzIDI3IDI0IDIwIDkgMTYgMTcgMjQgMTMgMTIgNiAxIDE0IDI2IDI1IDcgOCAyMSAxIDE5IDMgMiAyIDE3IDIxIDEzIAorNSA5IDIxIDExIF4KKzU0IDAgMjUgMSAyNyAyNCA2IDIzIDE2IDUgMSAyMCAyOSAyMiAyNSA5IDI1IDEwIDMgMjggMjggMjUgMTkgMTggMTYgMjQgMTQgMTUgNSAKKzI4IDEyIDI4IDI2IDI5IDIgMTUgMTUgOSA1IDE4IDE5IDIyIDEyIDE1IDQgNiAxNSAyNCAxNiA5IDQgMjYgMjUgMTggMjcgMTIgXgorNjEgMSAyMCA0IDI2IDEyIDMgMjIgMSAyMiAzMCAzIDI4IDEwIDkgMjQgMTQgMjkgNiAzMCAzIDEwIDIwIDE0IDYgMyAxOSAyMSAyMSAyOCAKKzE2IDE4IDExIDMwIDExIDIwIDMwIDEgOSA4IDExIDUgMTkgMTAgMjQgNCAyMiA0IDIgMjYgNSAxNSAyMCA4IDMgMTMgMzAgMTggOCAxIAorMjUgMjggMTkgXgorNTYgMSAyMCAxNSAyMSAxOCAxOCAxMiAxNiAxMyAyNCA5IDIxIDIgMjggNiAxIDIzIDkgMTggMjcgMjcgNCA5IDEzIDEwIDggMTQgMTYgCisxNSAxMiAxMSAxNCAyMSAxNCAxMCAxMSAyNSAxNyAxNyAzMCAyMSAxMyAyNyAyNiAyNiAyMiAxNCAxMyAxNyAyMSAxOSA5IDkgMjAgMjMgCisxMyAyOCBeCis1OSAxIDEwIDI4IDI0IDEwIDIyIDI3IDIzIDI3IDggMTcgMTQgNiA0IDIxIDI2IDE1IDEgOCAyOSAyNyA2IDI4IDE1IDMgMjcgMjUgMjUgCisxNCAxOSAxMyAyOSA4IDI0IDIgOCAyIDQgMTIgMTkgMTEgMTAgNiAyNiAxNCAyMiAyNCAzMCAxMCAxMSAxMiAyIDEyIDE3IDIzIDggOCAKKzEyIDI4IDEyIF4KKzU2IDAgMTQgMjggMiAxNyA0IDggMyAyNiA5IDIzIDIxIDMwIDMwIDIwIDQgMTMgMjggMjkgOSAzIDE3IDcgMTkgMzAgMjggMSAyIDIwIDkgCisxMiAyNCAxNSAzMCAyMCAyNyAzIDIzIDExIDYgMjkgMjUgMjMgMjYgMTcgMjAgMTAgMjIgMTUgMjMgNiAyNSA1IDQgMzAgMiAyOSBeCis2MyAxIDIzIDE1IDI3IDE0IDI2IDEgMSA3IDE5IDEyIDcgNiAyMCAxOCAxNCA0IDE1IDE3IDI4IDcgMTEgNyA4IDkgMjIgMTcgMTIgNSAKKzIzIDE4IDI1IDE4IDYgMTIgMjYgMzAgMTIgMzAgMTQgMyAxIDE4IDEwIDIwIDI3IDIxIDggNiAyNCAyNiAyMCAxMSAyNCA3IDIgNCAxOCAKKzE1IDE0IDMwIDE2IDE5IDE0IF4KKzUyIDAgMjcgMTUgNCAxOSAyNSAyOSAyOSA3IDE0IDE4IDkgMTEgOSAyNyAxMSAxNSAyOSA5IDI4IDIwIDIgMzAgMjYgMjEgMTcgOCAyOCAKKzE3IDIyIDI5IDI0IDggMTEgMTggMjkgMTUgNiA3IDI3IDI3IDE3IDI0IDE4IDIzIDExIDE5IDggMzAgNSAyNCAyMiAyNCBeCis2NiAxIDI1IDE1IDI4IDIzIDUgMTAgMjEgNSA4IDcgMyAxMCAxOSAxNyA2IDkgMTUgMjkgMTAgNyA0IDEgMTYgMjEgMTYgMjkgMTMgMTggCis1IDMgOCAxNSA4IDIxIDI5IDIwIDUgMjcgMiAxMyAyNyA3IDcgMzAgMiAxOCAyNiAxMCAyIDUgMjkgMjEgMTUgMjUgMjYgMjQgOCAxMiAKKzIwIDMgOSAxMCAzMCA3IDEyIDI5IF4KKzUzIDEgMzAgMjYgMjAgMTEgMjIgMTkgMjcgMiAxNiAxMCA2IDQgMjQgMTcgMjAgMjUgMjAgMTUgOCAyMyAyMyAyMCAzMCAxOCAxNiAzIAorMzAgMTUgMjYgMjMgMjggNyAyMSA4IDcgMzEgMzEgMTQgMjYgMTggMyAxIDI2IDI4IDE1IDI1IDExIDMxIDMgMjUgOSAyMSAzMCBeCis2NyAwIDIgNiAxNCA0IDkgNSAyOCA4IDE3IDIyIDEgNCA4IDcgMTAgMTQgMTkgMTAgMTQgOCAyNyA5IDI0IDI2IDQgMzAgMTEgOCAxOSA1IAorMjEgNyAyIDI3IDIwIDE2IDIwIDIwIDIyIDE0IDEzIDE2IDI2IDE0IDEwIDMgMjUgMjIgMjUgMjMgMjEgMTAgMTUgMTUgMjkgOCAxMyA0IAorMiAxMyAyMiAyMCA3IDQgMjAgMzEgMjMgXgorNjUgMCAyIDIgMjggMTMgMTkgMTQgMTIgMjMgMjcgNiAyIDE0IDIgMjIgNiAyNSAzMCAyOSAzMSAxMyAxNCAxNiAzMSAxMiAxNiAzMCA1IAorMTQgMzEgMTEgNCAxIDEgMjUgMjEgMTMgMjYgMjIgMjEgNSAyMiAxNCAyOSAxIDIxIDMgMTQgMzAgNCAyIDI5IDEyIDE1IDIzIDMgMTUgNSAKKzEgNiAyMyAyMiAxMyAxIDE0IDIzIF4KKzU5IDEgMjUgNSAxNSA2IDEzIDMgMjIgMTEgMjMgMzEgMjQgNiA1IDIwIDQgMTQgMyAyOSA4IDI5IDE5IDcgMjkgMjMgMjUgMjggMTkgMTEgCisxNSAyNyAyMSAxNCAxIDE5IDIwIDI2IDEyIDcgMTIgMSAxOCAxMyAyOSAyOCAyMyAyOSAxNCAyMyA3IDEgOSAyOSAyNCA1IDMwIDE4IDUgCisyNSAzMCBeCis1NSAxIDMxIDI1IDEzIDcgMjQgMjUgMjQgMSAxMiAxOSA5IDcgNiAyOCAyMCAxNCAyOCAyMSAxOSAzMSAyMCAyMCA2IDI0IDE4IDI3IDI0IAorNCAxOCAyMSAxIDMxIDE1IDEgMTUgMiAyNyA0IDI2IDI1IDQgMjMgMTkgMiAzMSAyMiAzMCAyMSAyMiA1IDI3IDEyIDMwIDI4IDMxIF4KKzYyIDAgMjcgMTUgMTggMTQgMjUgMTUgMTcgNyAyOCAxMSAyOCAyOSAzMCAxIDE3IDEyIDEwIDIgMTggMjAgMjEgMiAxMSAxMiA1IDQgMTIgCisyNSAxNCA1IDUgMjQgMjIgMTggMzEgMTUgMjIgMjkgMTEgMyAyMSAzMSAyMSAyNyAzIDI4IDcgMTAgMjUgMiAxNSAzMCA5IDMwIDcgMjIgCisxNSA5IDMgMjAgMjQgMTQgXgorNjAgMCAyOCAxNCAxOCA5IDI3IDE0IDIyIDI3IDMxIDEwIDggMTQgNyAxNSA3IDIwIDUgMjYgMSAyOSA3IDE3IDE3IDggMyAxMyAyNyAxOCAKKzggMzEgMjcgMjggMjIgMjIgMTcgMTkgMTggMTggMTEgMTkgMTMgMjUgMTAgMTkgNiAyOCA0IDMxIDIzIDEwIDE4IDI2IDMxIDUgMTAgMTMgCisxMiA4IDE1IDI3IF4KKzYwIDEgMjQgMjIgNCAyOSAyMiAzMSAyOCAyMCA0IDE2IDIxIDMgMSAxNSA1IDE1IDYgMzAgMyAyOSAyOSA3IDI3IDIwIDIgMjAgMzEgMjIgCisyNiA5IDI5IDE2IDQgMjYgMzIgMTcgMjAgMTQgMjggMTcgMTkgNiAyNCAxMSAyNiAyOCA1IDE4IDE1IDggMTYgMjAgMjEgNCA5IDEyIDQgCis4IDE3IDI5IF4KKzxECisKK0g+U0hTIFR5cGUgMiBTdHJpbmdzPEgKK0Q+Cis2OSAxIDUgMyAxMSAxNSAxMiAyNCAzMSAyMyAxIDYgMjggMiA4IDMxIDYgNyAzMCA1IDE5IDIzIDEyIDYgOSAzMSAxOSAxNyAyNCAyNSAKKzIyIDYgMTIgMTYgMyA3IDkgOSAxMSAyOSA0IDExIDIgNSAxMyAyOSAxMCAxMiAzMCAzMiAxOCAyOCAxOCAyNyAzIDMwIDQgNCAyNiA2IAorMTMgMzEgMTMgMiAxMSA3IDI0IDQgMTcgMjkgMTIgXgorOTUgMCAyMSAxOSAyMSAyMyAxMSA0MiAzNiAyIDEzIDQgMSAzMyAyMiAxNiAyNyA5IDQgMzMgMTYgMyAzMCAxNSAxMSAzMiAxMyAxNyAzOCAKKzMyIDkgMzggNCAzNiAxNSAzMiAyNyAxOSA0MiAxOCA2IDM2IDIyIDEwIDI5IDEyIDI1IDQwIDE1IDI5IDIzIDI4IDMwIDQgOCAxMSAyNCAKKzkgMTAgMzEgMjggNDMgMjMgMTYgMjkgMzMgNSA0MCAyNiAzIDE5IDEyIDM2IDQzIDUgMzUgMzcgNSAxNCAxMSA0NSAzNSAxNiAxMCA4IAorMzIgNCAxNSAzNSAyNiAyIDM5IDIyIDM3IDIyIDMwIDI5IF4KKzEwNiAxIDE4IDE0IDUxIDIgNiAzMiA1MSA5IDMyIDUwIDQ0IDQ2IDUxIDggMTEgNTMgNDUgNTUgMTYgMTAgMyA1MiA4IDIwIDIwIDQ2IAorNDYgMTMgMzIgMiA0NiA1MCA0MyAyNSA1NCA5IDMxIDI5IDIgNDcgMTUgMjkgMjQgNDUgNDQgMTggMzcgMTQgMjggMzkgMzYgNDQgNDcgCisxNiA1MCAxMCA0NCAyNCA1MyAzNSAyMiA0MCAyMCAxNSA1MSAyMiAxOCAyMiA0MiA2IDU0IDQ5IDM4IDIxIDcgMTMgMzAgMTYgNyA1MiAKKzE2IDIyIDEzIDM4IDcgMTEgNDQgMzMgOSAyNSAxMyAzNyA0MiAxNCA0NSA1MyAzMCAzOCA1IDI1IDUgMzUgMzggMjIgMjggNTMgXgorMTI3IDAgNTggMzUgNDMgMjggNSAyOCA2MyA4IDEyIDI1IDkgNDcgNTMgMjkgNjIgNyAzNyAyIDMgNDggNSAxMiA1NSA1NiAyOCAzNSAxMiAKKzYzIDYgNTggMjcgMjcgNDggNDQgMzUgMTQgMTcgMjIgNTYgMTAgOCAxIDE2IDE1IDQyIDYzIDE0IDUxIDU3IDE5IDQxIDcgOCA1NiA0NyAKKzM0IDUyIDIyIDQ4IDYwIDQzIDkgMSA1MiA0IDIxIDQ5IDYxIDE4IDUwIDIzIDEzIDQ2IDYyIDIzIDQ1IDYyIDkgNTYgMTggMjMgMzEgOCAKKzMwIDI3IDM2IDEzIDM4IDQgNTggNTMgNDcgMjQgMTggNDEgNTggMTkgMTIgMTggNTIgNDIgMjkgNDQgNDUgMjYgNjMgMzQgMzIgNDEgNjQgCisxNSAyNiA1NSAxOSAyIDQ5IDYgMzAgNTMgMTMgNTQgMTIgNTMgMzcgMTIgMzcgNDMgXgorMTQ4IDAgNjAgNCA1MSA0NyA1OCAzOCAxNyA2MyAzMyAyMyAyOCA0MyAxMiA2OSA3MCAzMyAxNyAxMiA1MCAxOCAxOCAzNiA0NSAyIDY3IAorNCA0NSAyMCA0IDMzIDM4IDI5IDQ1IDggMjIgNTggMzkgNzEgMzggMzIgNTMgMzUgMTkgNTMgMzEgMjkgNTEgMzUgNCA2MyAxOCAzMyAyNiAKKzQ3IDcwIDkgNjQgNjIgNjMgMzAgMTUgMSAzNSAyOCAxNiA0MCAyMCAxNCA1MCAzMyAxOSAzOCAzMCAyNyA1NSAxMCAxNiA0NiA0NyA3IAorNTUgMTIgNTMgMjYgNTYgMzMgMjkgNTUgMjUgMTcgNDggNDMgMjEgNDMgMTggMjQgNjMgMjcgNjggNDYgMzggMzMgMzUgMTAgMTggMTEgCisyNyA1IDkgNTggMzUgNzAgMzYgMzYgMzkgNDcgMiAxMCA2NiA0NyA1IDE4IDIxIDQ0IDcxIDUxIDU3IDMgMjIgNyA1NiA1NSAyOCAyNSAKKzE0IDQwIDE2IDI0IDQ4IDM3IDY2IDUwIDI0IDQ1IDE4IDM5IDUzIDU1IF4KKzE2NSAxIDE1IDYyIDM1IDI5IDE1IDQwIDE5IDc2IDY3IDQgNSA3MSA0NiA2MSAyNiA4IDc3IDQ4IDEgMjMgMTIgNjAgNDAgMjQgNDQgMzMgCisyOSA0MiA3MyA2NiA0OSA2MSAyMCAzMCAxIDU0IDUyIDQyIDM5IDY0IDIzIDY1IDM3IDI0IDIwIDExIDI2IDY2IDIyIDc3IDIyIDU3IDcgCiszOCA1NyAzMyA2MSA3MyA3IDY0IDEgNDkgMzUgNzYgMTQgMjcgMjEgNDUgNjggMzggNTggNzMgMTMgNzIgNDcgNzMgMzMgOCA2NiAyMyAKKzM4IDQgNTYgNzcgNDcgMTAgNzEgMTMgMjAgMzEgNDEgNiA1MSAzIDE4IDE3IDYxIDQ3IDE0IDQ4IDc2IDQ2IDI4IDM0IDQzIDEgNTYgNCAKKzI1IDcgNjUgNDEgMSAzNCAzNyAyMyA1OSA1OSAyNyAyNiAxMyAxNSAxNCA3NSA2MCAxNCAxIDI4IDU5IDI2IDY1IDYxIDE2IDIzIDE3IAorMjggNiAxOSAyIDM1IDQ5IDMwIDI5IDQ4IDIgNjMgNzMgNTkgMSAzIDc2IDQxIDExIDE5IDE4IDQzIDU0IDYzIDY3IDUxIDQgOSA3OCA2MCAKKzY2IF4KKzE4MSAwIDE4IDE5IDg0IDE3IDEyIDEwIDU3IDE4IDc3IDUxIDUyIDE2IDM5IDc0IDQ5IDUyIDYzIDM4IDcyIDIgMTUgNjQgODMgNjIgNDkgCis1NiAxMSAyNiA2OCA1OCA4MyAzMyAyMyA1MCA2MyA3MSA1MyAyNyA4NCAyMiAzOSA0MSA1MiA1OCAxMSA2NCA3IDYwIDQ1IDcwIDIyIDUgCis3MyAzOCAzMCAzMCA0OCAyMSA3NSA4MCA0MCAyMSA4IDUzIDkgMjYgMzAgMzQgODEgNzEgNzEgNTEgMjMgNzUgMzMgNDEgMjMgMzIgNSA4IAorNjYgNDAgNzIgNDAgMTYgNjYgNDUgMTQgNDggMzQgMjEgNDEgMjcgMyA1NSAyNyAzNyAyMyA0MSA2NSA0IDU3IDUxIDc0IDIyIDE5IDc1IAorNDIgMTYgMTkgNDYgMTYgMTAgNDggMjAgMTkgMzcgNDEgMTQgNTcgOSAxNyA1NSAzOCA1IDYwIDcgNDYgMjAgNDMgMzYgMzkgNTIgMjAgCisxMCA2MiA0NSAyMyA0NiA3IDM1IDc1IDI5IDcwIDM1IDM2IDM0IDI1IDEyIDE1IDg0IDI2IDEwIDYgNzEgMjkgNzkgMzMgMzIgMjUgNTkgCis3NiA4MiA2NCA1OCA3IDggMTkgNDEgNzQgMiA1MyA2NSAyNCAxIDU1IDUxIDM2IDIxIDc5IDcgXgorMTg0IDEgNjAgNjYgNjYgNiAzIDkgNzMgMTIgNyA0MCA3MCAxOCA3MSA3MCA2NSA1MSAxNCAxNCAyNyA1MCA5IDg3IDgxIDUwIDIyIDE5IAorNDAgMzcgMTYgNzkgMTIgMzQgMzcgNzYgODIgMTAgNjEgNyA4MSA0OSA2NyAyNiA0NSA4MiA1MCA4MSA2MyA0NSA2OSAzMSAzMSA3NiA1MSAKKzkgNTkgMzQgNTEgNTQgMzQgODMgMTAgMzMgNTEgODYgODEgODIgNjkgMTggOCAyMiA2NCAxOSA4NiA2MiA1OCAzMyAzNyAxNyAzNCA1IAorMjkgODMgNDIgNzYgNTAgNTQgNjYgMzkgOSAxIDM2IDQzIDE3IDY1IDYgMzUgNTYgNzIgNzEgODMgODggMTAgMSA4IDg3IDIyIDYgMjEgCis3OCAyNSA4OSA0MyA2MiA0MCA1NSA4NSAzMSA4OSA3NCA2MyA0NiAyOCAyNCAyNiAzMSAxNyA3IDggMjcgMTkgMTIgODUgMTcgMjAgMjcgCis3NyAxMCAyIDU0IDgwIDE3IDUyIDc0IDc2IDY5IDc4IDExIDIwIDgwIDQgMjkgMjQgODUgNzUgMTggMzkgMjMgNzAgODMgMjkgNTcgNjcgCis3MiA3MCAzMyA0IDE1IDQ2IDQyIDIgNjkgMTMgNTMgMzMgNjkgNjQgMzMgNjQgMTQgNDAgNjkgNTkgNzggNTQgXgorMTkzIDEgNjggNDMgOTUgNTMgMzggNTggNTUgMjggMjAgMTYgNjcgNDggMTcgODYgMzIgNDQgNjggNjcgMjggMTYgMTQgNzkgMjUgMTUgCis3MiA2NyA1MCA4MCAxOCAzMCAxMCA3NSAxIDYwIDQ1IDg3IDc4IDI4IDk1IDQ5IDYzIDcwIDU5IDI2IDYgNTEgNzMgNjAgNjUgMTggMjYgCis4IDg3IDUgNTggMzEgMjUgNTcgNDAgNDYgNzggNTcgMzQgNzggNjEgMzYgNjYgNTcgMzggODAgMjIgMzIgNjggNzEgMzAgNzQgMzcgODEgCis2NiA3NyA2NiA1NSAyIDUxIDI0IDkzIDYxIDQwIDY4IDQ1IDYxIDEyIDYzIDI0IDg5IDU5IDUyIDcyIDQzIDIwIDIwIDY5IDM2IDQwIDg4IAorNDYgOSA2MiA1NSA3NyA4NCAyMCAxOCA2IDc3IDE1IDUyIDM5IDc1IDMgMjYgNCA4NSAxNyA2MiAyOSAxMSA5MiA0NiA1OCAyOSA1OSAyOCAKKzQyIDgwIDcxIDk2IDIgNDkgODUgMzcgNjMgNCA2MSAxNCAyIDUzIDg3IDI1IDg2IDYgNzUgNzYgOTMgNDEgMzkgOTMgOTIgNDIgNTYgNDEgCis2MyAyNiAyOCAxOCA3NyAxMSA1MCA3OCA3OSAxIDEyIDEyIDkxIDI5IDEzIDU4IDUgNTYgOTIgNjYgNTkgNCAzOSA0NyA5NSA1IDUgNjIgCiszMyAxMyA4MCAyNyBeCisyMDMgMSAzNSAyOCAxMSA3IDIwIDcgMTcgMyAzIDMwIDg5IDEzIDY1IDU2IDY2IDYzIDIyIDgyIDE2IDMxIDU1IDU2IDc3IDkxIDkxIDcxIAorMTAxIDEzIDEwIDg1IDEwMSA5NSAxNyA5OSA5OCA5MSAzMyAxNCAyMCA0OCAzMiA3IDY0IDI5IDM4IDM1IDI1IDQgOTUgMjMgMzQgMSA4NSAKKzgxIDIzIDMxIDk2IDcxIDg0IDUwIDE1IDc5IDQ3IDI1IDUxIDQ1IDM1IDY2IDE5IDYxIDYwIDkgMzEgOTMgNjQgNzAgMzAgNDIgODYgNTMgCisxIDcxIDQ2IDQyIDIyIDM4IDk2IDEwIDk5IDM0IDc2IDI2IDU1IDczIDYzIDYzIDk3IDIzIDkyIDgxIDY0IDQ2IDEgMzAgMzEgMzUgODYgCis5MSA4OCA2NCA4NyAxNiAzNyA2OSA4NCA5NCA2MCAxMDAgMyA0NyA1MiA4IDcxIDg3IDU3IDI5IDc2IDQzIDE4IDQ1IDQ2IDE1IDY1IDEyIAorNDQgNDIgNjYgNjAgMTUgNjggMTkgNTggMzkgNjIgNzYgOSA5MiAxMDEgNTcgMzIgNCAzNCAxNSA0MSA2MiAzMiA4OSA3MSA0MyAzNSAzMSAKKzQxIDIxIDE3IDgyIDMzIDk2IDI3IDYyIDI5IDgyIDU3IDQ2IDYyIDE1IDI0IDk5IDM3IDgzIDQwIDUyIDQ2IDU2IDgwIDk4IDMgOTEgNzQgCis2IDI3IDcgNTggOTQgMTAgNDEgNzkgOTcgODQgNzcgNzQgMjYgOTkgMzUgXgorMjEyIDEgMjYgMTAxIDE3IDkxIDQ1IDk3IDgwIDU5IDEwMiAzMCA2OCA0IDg1IDkgNCAzOSAxNiAxOCA4NSA3MCAxMSA4NyA2MiA3MiA3OCAKKzM4IDMgNDEgNTMgODIgODIgMzUgMTggMTMgOTQgNjQgNTIgMzkgNzcgNTkgMjYgOSA2NSA0NiA2NCA5OCAzMiAyOSA4NiA3OSAxNiA2MyAKKzU0IDc2IDU2IDk4IDE2IDk4IDc4IDIyIDcyIDMzIDEwMyAxMDQgNTIgODQgMTIgNjUgMTUgODUgMTAxIDk3IDg0IDMxIDUxIDI2IDEwMCAKKzEwMCAzOCA4MCAxMyAyIDc4IDcgMjQgNDQgODQgMTAzIDI3IDcgMjggMTYgMzMgOTkgMjUgMTAzIDU0IDE0IDQyIDYyIDg3IDkyIDI3IAorMjIgNDIgNSA1MiAxMDAgODQgNzMgNzIgNjMgMjQgNDggNTYgNTIgMjMgNSAxNyA3NiAzMSAxIDk1IDU4IDQzIDYwIDUwIDYyIDMwIDIzIAorMzUgNzkgMjAgMzUgMyA3MiAzMiA0NSA1MSA4NyA0MSA4NCAyNyA3OSA3NyA3MCAxMDIgMTUgNTQgMTUgMTAwIDggNTIgNjkgMTA1IDMgCiszMCA4NCA0MiA5MyA2NiA4OSA2OSA3NCAyNCAzMyA0MiA5NyA0IDM4IDk5IDEwNiAxMyA5MyA2IDEwNiA3NCAxMDAgNTQgNDUgMjEgNTkgCis1NiAzNyA5IDUwIDMyIDc1IDc5IDMxIDc3IDkgNjEgMSA4IDY4IDYgNjAgODEgNyAxMDAgOTkgMTQgNjEgNDggMjUgNzMgMjYgNzAgNzIgCis5NCAzNCBeCisyMzMgMCAxMSA5OCAxMTAgODggMzUgMTEwIDM1IDY0IDQ5IDg4IDkzIDI4IDg1IDYgNzggNjUgOTAgNTIgMjQgOTcgNTEgMzkgNTEgNTkgCisyMyAxIDMgNDkgMzMgMTEgNzggMjcgMzUgNTUgNjQgNSAxMDIgNCA3MCAyNSA1NiA1OCAzOCA2NiAxMSAzMSA5NiA2NiAxMDQgNTkgNDEgCis4NiA1OCAyOSA3OSA0MSA0MCA3MiA1MSAxMiA5MiAzNCA1MiA0NCA2OSAxMDQgMjEgOTcgODkgOTYgNDggMjEgNCA2MSA0MCAyOCA2NyAKKzM0IDIzIDg1IDQ0IDIyIDYyIDUyIDMzIDg0IDIzIDMwIDczIDc0IDQgNzkgMTIgODEgNDcgODAgNTMgNDcgODkgNDAgMTkgODAgNjIgMzQgCis2MSAyOSA0MSA5NSA0MyAxIDcwIDYzIDU1IDUzIDE4IDE5IDEzIDQ4IDEwIDE5IDg5IDQ5IDQgNTIgNTMgNTYgNzYgMTAgOCAxMDQgNzcgCisxNSAyOCAzOCA3NSAxMDkgMyA4NSA5MCA4IDQwIDggOTMgOTAgNDMgMzkgMTQgNjAgMTcgMzYgNzggNTYgMTA1IDgwIDM1IDc1IDM2IDU4IAorODIgNTAgMTAwIDk4IDQ1IDc0IDEzIDY2IDk1IDcyIDcxIDk1IDM0IDE0IDk4IDcyIDMzIDM4IDM3IDUyIDYgMTQgMTA3IDU5IDMgMjkgCis2MSA2NyA5OCA5MiA1IDkzIDE3IDk4IDM2IDg3IDQxIDc1IDcxIDU3IDg4IDE3IDI1IDkxIDg0IDMgNTggMjAgOTIgNjkgNTEgNTAgMzYgCiszMSAxNCAyNSAxOCAzMCAxOCAxIDQxIDEwNCAzMCA4MiA1OSA4NyA3MCAzNCA5NiAyOCA0NyA2MiA4MSAxMDMgNDggXgorMjM0IDEgNjMgOTAgMTA4IDEwOCAxMDIgNjQgODIgODggNCAxMTEgNzYgOTcgMjIgMSAxMDggNDEgMzQgOTEgMzMgMjAgMjUgMjQgMjYgOCAKKzgzIDExIDMxIDcgODUgMTA5IDEwNiA0IDEwNSA4NSA2OCAyOCAzMyA5OSA1MyA4IDE2IDEyIDExIDc0IDE3IDgzIDY2IDcwIDE2IDMwIDkgCis2NyA2OCAzNCAyNCA4MSA0NyA5MiA3MiA0NyAzNyAzMyAzOCA5MiAxNyA4IDI4IDg4IDIyIDYyIDY5IDMyIDg5IDc1IDMgNzIgOTYgODUgCisxMyAxMDUgMjQgMzggMzcgOTQgMTE1IDgzIDcyIDEwOCAxMTQgMjQgOTMgNzYgMTAzIDYwIDk5IDEwMiA5IDQzIDEwIDU5IDk1IDQ2IDMzIAorOTMgMTUgMjYgNjkgNDQgMiA4NiAxMDcgNTUgNDUgNjEgNjUgOTIgNjYgOSA1NSAzOSA3MCA4MyAyOSA5OCA2NyAxMyAxMTEgMTUgMjAgCiszMSA2MiA4IDIgNTEgMjAgMTkgMzMgNDQgMTQgMTE1IDcxIDExMiA5NyAxMCA0MSAyOCA1MyA1MSAyNiA1NyAxNSAzOCA5OCA1NSAxMDYgCisyMiA1NiAzMSA1MCA5NSAxMDcgMTEwIDg0IDcwIDEwIDEwOCA5NiA3MyAxMDAgMjUgMzYgNTUgODggNzEgNjMgOTYgMzAgOTAgOTYgNzkgCisyMiA3IDMwIDIzIDI4IDU5IDg5IDggNTEgOTkgNDcgODYgMzQgMTggNDMgNjUgOTggMTA0IDEwNyA0OSA3IDc5IDcxIDggNTcgMjEgMjkgCis4MCAyIDc0IDc4IDQ0IDU3IDkgNjEgMjIgMTMgNjggNTIgOTEgNzQgOTggNDMgMzAgNTggNjggOTUgMTAxIDcyIDEwMiA3NiA0MiA5OSAKKzYxIF4KKzI0OSAwIDI3IDExNyA0NSAxMTkgODAgMiA1OSA1MiA4IDc2IDIwIDk0IDEwMiA2OSA5NiA0MiA0NiAxMDYgNjcgOSAxMTAgODkgNzEgNjkgCiszNCAzMSAxNSA4NSAxNiAyOSAxMDAgODIgMzcgNjIgNjggOTUgMTA4IDQ0IDIzIDExNCAzNCAzNiA1NiA5MyAxMSAzMCA5NiAxMiAzMSAKKzY3IDE0IDExNCAxNCA2NiA3MCAzMCA4MSA0NiA1MyAxMTkgODUgNiAxMDQgNDcgOTIgNzIgNzAgNSA3MCAxNSAxMTUgNjggMTA1IDMzIAorOTcgMTMgODUgMTA2IDE0IDYxIDI5IDIyIDg2IDQ1IDU3IDY5IDkxIDM4IDM4IDI4IDY2IDEzIDYwIDk1IDEwMyAzIDE1IDUgMTEzIDM4IAorMjMgNjIgNSA2NSA5NCAxMDcgNzMgMTA0IDM3IDQ3IDEwMiAxMTcgMyA3OCAzNSA3IDk1IDU2IDc4IDQ1IDUyIDI4IDQ2IDQzIDM3IDMyIAorNTMgMTkgNTUgMjkgNDcgOTcgNzYgMTE1IDgzIDcxIDExIDQ1IDYyIDczIDk5IDExNiAyIDI0IDExNiA3IDI4IDQxIDIgMjkgMzcgNTIgCisyMyA1IDExOCA3OSAzMSA1NyA4OSA2MSAyNCAxMDEgNzggNTAgOTMgNzMgNDEgNyAzMyA0NSA0NyAyNCAxIDQ4IDczIDM2IDMgMjUgODcgCis0NiAyOCAxMDggNTQgNjggNTMgNjcgMTE5IDI4IDM2IDExOCAxMDQgNDIgODggMjcgMTEyIDQgNzQgODUgMSA2MyAzOSA5NyA3MSA3NCAKKzc1IDc2IDEwIDQ5IDEyIDc5IDExIDUwIDEwMyAxMTggOTQgMTE3IDExOCAzNyAyNyAxMiA5NCA2MCAyOCA1MSA0NyA4MiAxMTAgMTcgMTUgCisxMDUgMjMgNTIgNDMgMTIgMjEgMjIgODEgNDEgMTIgNzQgOTAgNDIgMTA4IDExNyA5OCA2NyA0IDY5IDg1IF4KKzI0MyAwIDc2IDgxIDI2IDEwMSAxMyA2OCA2MiAxMDYgODcgMTkgOTggMzIgODEgNjMgNzkgOTMgMzEgMTIxIDEyMyA3NSA1MiAxMSA2NiAKKzQxIDU0IDg3IDM4IDUgMTA0IDYyIDUxIDM4IDU1IDI5IDMxIDEyMCA0NCAxNiA0OCA5NCA0NiAxMDUgOTEgNjYgNzggMjcgNDMgNiA2NCAKKzIgNTUgNzkgNzUgODQgMTEzIDIyIDQgMTEzIDEwOSAzMSAzMyAxNyA5NiAxMSAyOSA2MyA5OCAxMDMgMTA3IDExNiAzNCAxNCA5IDk1IAorMzggMTggNTEgNzUgMzMgMTA5IDExOCA1NSA2NiA0IDc2IDcgNzUgNzAgODIgNzQgMjMgMSAyNiA2OSA0MCAxMTIgOTkgNDcgNjUgMzEgCis3MCAxMTkgNTIgMTAzIDg4IDg1IDg2IDI4IDE2IDEyIDc2IDI1IDIyIDc4IDY0IDIxIDg2IDI3IDYxIDc3IDcyIDEwOCAyIDE4IDEwNiAKKzExOSAxMjEgNTQgMTYgODUgNzIgMiA3MyAyNiA4OCA2NiA2MCA4MCAzNSAyNCAxMTcgNjMgMjQgNDQgNjcgNTIgMTIyIDExOSAzMyA3MiAKKzE2IDk5IDk4IDY5IDU0IDE5IDQyIDI4IDUzIDExNCAzMiAxMTcgODEgMTAwIDU3IDQ5IDEyMyA1NiAyMSA2OCA4MCA1MyA5NSAxIDQ1IAorOTUgMTA3IDk4IDg3IDEgMjcgMjQgOTkgMTE2IDE2IDY3IDEgMTEzIDkxIDg0IDI1IDQwIDI1IDcyIDMgMjggOTAgODcgMTEyIDgwIDE2IAorMTE3IDQ1IDc3IDM2IDkwIDEwNSA1OSA4OCAxMjIgNjQgMTA4IDEwOCA3MSA5OCAxOCA1MCAxMTUgOTMgMTA1IDc3IDM1IDYgNDYgNTUgCis0NyAxMDIgNCAyNiA4NyAxMTEgMTIwIDgxIDExMyA0IDU3IDEwNSAzIDg0IDk0IDExNSA2MSA3MyBeCisyNTUgMSA5MSA0NyA1MSA5IDU3IDkgNTUgOTQgNjEgNjEgNjggNDYgMTA3IDYgMzUgODEgMTE0IDc4IDk2IDc0IDE0IDg5IDczIDY3IDY3IAorNjkgMTEzIDEwNyAxMSA5OCAxMTMgMTA5IDIwIDkyIDE3IDY3IDcwIDg4IDU3IDEwIDEyNCA5IDYwIDEyMiA5MyA5MSA0NSA3IDE1IDI0IAorNTEgNSA5OCAxMTUgMjQgNDkgOTAgMTA0IDExNyA2NiAxMjggOTQgNjQgODAgMTIgNDMgOTEgNDYgMTExIDU5IDU4IDc3IDMwIDE0IDg4IAorNjAgMTIzIDY4IDQxIDQ0IDY4IDQwIDEwNCAxMTggNDEgNDMgOTMgOTAgMTA1IDkyIDE2IDEyNyAyNiA1NCAxMjUgMTE0IDc5IDcxIDI0IAorNDggMjEgMjUgMTE4IDQwIDEwMyA0OSA5MSA0NCA2NyA2NSAyNSAxMTkgMTA5IDE4IDQ4IDIzIDY5IDExMiAzOCA2MSA2NCA4NyA4NCAKKzEwNCAxMTkgMTEwIDEyMiA5MiAyMiAxIDggODMgMzQgMTAwIDMyIDYyIDQxIDQ2IDExMiAzNCAxMDIgNzYgNTYgMzkgNCAxMjcgMzAgMTMgCisxOSAxMTAgMTI0IDcgMTYgMTI4IDk1IDQgMTI0IDExIDEwNCAxMTYgMTI2IDQ5IDk1IDMgNTUgOTYgNzAgOTAgMTAxIDQgMTIyIDk2IDc1IAorMTE4IDM5IDEyOCA5OSA5MiAxOCA0MiAyMCA4NyA4MyAzNSA3NSAxMTEgNjEgNjcgNzEgMjggMTAxIDkgNTYgMzQgMTA1IDk1IDcxIDIzIAorNzMgNzEgMjYgNTcgMTUgMjMgNzYgNTUgOTkgODkgMTI4IDk4IDExNyA2OCA0MyA4OCA2MiAzOCA2MiAzOSAyIDgzIDM2IDE1IDI2IDYwIAorMTI4IDk2IDczIDc0IDEwIDEgMTIgNDIgMjIgMiA3NyAzMyAzMyAzMiA1NyAxMyAxNCA4MiA1NyAxMiAzOSAzIDU4IDgwIDE0IDg3IDg1IAorNDQgNjkgMTA5IDExOSBeCisyODMgMCAxMDIgNTUgNTMgNDEgNjAgODggMjUgNjcgNTggNzYgNDQgMjIgNjggMTE4IDEwOCA0MCA5NSA5NiA4MSA5MCA4NSAyOCA3NyAKKzE4IDExIDM3IDcyIDkzIDYwIDExMCAxMjQgMTE5IDk1IDEzMSA5MSAzNyAxMDkgMTI2IDggNzMgNjkgNzIgODAgMTcgODMgNSA3NiAyMCAKKzMyIDE1IDEwIDEgMTAzIDE4IDIyIDExNiA5OCA5IDUxIDEwNCAxMDIgNDQgMzMgMTUgMTIgMjQgMzEgODkgMSA2IDI4IDEwMSA4IDY0IAorNzIgMTA2IDMwIDUgNTIgODkgMTExIDM5IDEwOCA2NCA4NSAxNyA1NyAxMjQgMjIgMTA1IDc4IDExNSAzIDQwIDEwOCA2NiAxMDggNzcgCisxMjggMTAzIDQ0IDM1IDM4IDEzIDk1IDEwIDExMSA2MyA5OCAxMTcgNjEgNTEgMTI2IDY5IDk2IDcwIDcwIDU5IDM5IDEzIDk3IDMzIAorMTEyIDIgNzcgNyAxMjMgNzAgODMgMjkgNjYgNjcgNDkgNzkgMTkgMTA0IDExNSAxNCA2MCAyIDU1IDQwIDcxIDMzIDI4IDExNCA1MSA5MSAKKzE3IDQ2IDQ1IDEyOCA1NyA4NyA2MiAyNSAxMTUgMzggNTAgNTUgOTAgNzQgOCA1MSAxMDIgNzkgNDMgOTQgMzYgMTIyIDk0IDEyIDQxIAorMzYgMjUgMTA0IDkxIDI0IDcgOTkgODAgMzAgMTI2IDMyIDYzIDEyMiAxMDcgMTE0IDI3IDI4IDc5IDQxIDEyIDM1IDUxIDExNSAxMjIgCis3MCAyMiA3OSA2NSAyIDg4IDI3IDE3IDU5IDE1IDIzIDQ0IDU3IDUgNjUgNiAyNiA3OCA4MCAxMjUgOTMgODQgMTAwIDQ1IDIyIDEyOSAKKzY4IDM2IDExMSA3NCAxMTggMTEgNTAgNDIgMTIwIDQ3IDIxIDggODYgMTEyIDI2IDY3IDYwIDk5IDQ1IDkzIDQ3IDggMzggNTkgNTIgNTYgCisxMjQgMjAgODIgMTggMTE3IDI0IDE4IDQ2IDEwNiAxOSAxMTcgMjYgNDEgNDcgNDUgMTMwIDcgMTUgMSA0IDUgMTAwIDEwIDg1IDUwIDQ0IAorMTEgNDggOTIgMTE5IDEwOCA0MiAxMTggMTI1IF4KKzI3MiAwIDggNjEgOTkgNzAgOTYgMjAgODcgMTIzIDEzNCA4MiAyMiAyIDExMCAxMTggMzMgODYgNSA3IDUgOTQgNTYgMTUgNjAgOTYgNTQgCisxMyAyMiA1NSA5OSA0IDI1IDEwNSAxNyAzNyA2OSAxMCAzOCAxMTcgMTE3IDMwIDcwIDEzIDkgMTA5IDExNSA2MiA5NCA1MiA2NiAxMTcgCisxMDAgMTM1IDcgNzUgMjMgNSA4MSAxMTAgMzEgMTE4IDI5IDEgNjIgMTEgNDEgODggMTA5IDExOSAxMDIgMzcgMyAzMCAxMjMgNDcgMzEgCis1NiAxMzQgMjkgMTI0IDExNiAxMTggOTkgMjEgNTYgNzcgOTEgMjMgMzcgMTM1IDgxIDQ0IDUxIDY3IDk1IDUxIDEzMyAzMCA1NyA2NyAKKzExNiAxMjIgNDggMTAwIDcgMTMyIDk3IDEwNiA2OSA5MyA0IDk1IDEyNSAxMDIgMTAzIDExOSA4MSA1NyAxMzMgOTYgMzcgMTE4IDUwIAorMTE3IDExMyA4MSAxMjcgMTcgNDUgMTAzIDMyIDEyMSAxMjkgNjAgNDMgNjUgMTI3IDMwIDM2IDEzMiAxMTAgNTIgNTMgMzUgNzEgMTIgCis3NiAyMiA3MiAxMzAgMTEyIDk5IDc2IDI2IDIxIDczIDYzIDYzIDk3IDIzIDU4IDExNSAxMzIgMTE0IDEgMTMyIDMxIDM1IDE4IDIzIDU0IAorMzAgNTMgMTE4IDM3IDM1IDg0IDk0IDYwIDEwMCAzIDQ3IDE4IDExMCAxMDUgODcgNTcgNjMgNzYgNDMgNTIgNDUgNDYgNDkgNjUgMTIgCisxMCA0MiA2NiA2MCAxMTcgMzQgMTkgOTIgNSAyOCA3NiA5IDEyNiAxMDEgMTI1IDMyIDM4IDM0IDE1IDcgNjIgMzIgMjEgMyA0MyA2OSAKKzMxIDEwOSAxMjMgNTEgMTE2IDEzNSAxMzAgMTI5IDEzMCA2MyAxNCA1NyA4MCA2MiAxNSAxMjYgMzEgMTA1IDgzIDEwOCAxMjAgODAgCisxMjQgNDYgOTggMTA1IDkxIDYgNiAyNyA3IDU4IDEyOCA3OCA3IDc5IDYzIDg0IDc3IDc0IDEyOCA2NSA2MSA5NSAxMjEgMTcgMjQgMTIzIAorMTE3IDUxIDEyMiBeCisyODQgMCA0NCA3MSA0MyAyMCAxMjYgNTggNTMgNDcgOTggMTggMTkgMTE5IDkzIDI5IDcwIDM5IDk0IDExMiA0NCAxMTUgMTM1IDk4IDgyIAorMTAgNjcgMjkgMTAyIDExMyA2OCA4MCAxOSA3NSAxIDkxIDExNCA4NyA4MCA3IDQwIDM3IDg2IDEyMCAxNiAxMDQgMTM2IDExNyA4MiAKKzEzOCAzMiA2NSAxMTQgMTE5IDEzNyAxMjEgOCAxMiA0NiAxMjYgMjYgMTE5IDczIDEzMCA2MCA3NiAxMTMgMTAwIDE0IDEzMyAyNiAxMTYgCiszNCAxMjAgODAgOTUgODQgNTMgMTUgMjQgNDQgNTEgNCAxMCAyMyA3NyAyNCA5OSA2NiAzNyA1NCA2MyA0MiAxMzYgMjEgMzQgNzYgNSAKKzE3IDEyOCAxMDEgMSA1OSA0MCAxMTMgMTEyIDMyIDk3IDMxIDkzIDEwNSA3OSA5MSAxOCAzOSAxIDEwMyAxMzIgNTEgNjggMTI0IDExMSAKKzEzIDk3IDQzIDEyOCA2OSA4NCA4NSA3MiAxNSAxMiAyNiA4NyAxNiAxNiA5MiAxMDEgMTMgNzcgNCAxMTggODkgMTAzIDU2IDQyIDE2IAorNjAgNDQgMzkgMTI2IDQ2IDE4IDgzIDkzIDQxIDEwNSAzIDgyIDEwNiAxMTUgOTEgNiA0IDU0IDExNSAxNSAxMjAgMTA5IDExMyA0OCA0MSAKKzkgOTUgMjAgNjIgNjcgMTA1IDExMSAyNSAxMzIgNyAxMTYgNDYgMTM4IDQ0IDgzIDYxIDEyNCAxMzEgMzUgMTA3IDYgMTA5IDgxIDExNCAKKzY3IDQxIDEzNyA3NyA1NiA3NCA3MyAzNCAxMiAxNCA2OSA1MiAxMSA5OCA0NyA1NCA4MyA4MSA2IDEgMTUgODggMzUgMTM5IDgwIDgzIAorNDkgODkgMjcgNDcgMTMwIDkyIDEzMyA4NyA1MSAxMTIgNzYgNDkgMTA5IDQ5IDU3IDkzIDczIDIyIDExNyA1MCA2NCA1OCA5NyAxMzkgCiszNiAxMzEgMTExIDEzMyA1OCAzMyA4IDg4IDU1IDM4IDkwIDQ2IDMwIDExOCA1NyAyOSA4MiA3NCA0MSAxMTcgMzggNDYgOTQgOTIgNSAKKzEwNSAxNSAxMTcgNzAgMTAzIDY4IDYwIDEyMCA0OCAyMSAxMTAgODUgNDAgODEgNjYgXgorMjkxIDAgNDYgMTEzIDUyIDEzNCA3OSA3NCA2NCA1NyAxOCAyMyA5IDUyIDggMTYgMTAzIDU3IDEzOCA1OSA1OSA2NSA5MiAyIDcgMTMwIAorOTIgOCAzNCA0MCA4NiAxMzEgMTQwIDEwMCAxMTIgNCA0MiAxIDExMCAxMDggNDMgMzcgMTUgNjcgMTkgMzUgOTQgNjEgMTMwIDk4IDM1IAorODggMzQgNjUgMTA0IDU2IDEyNiAxMTggNTAgODcgMTAgODEgMTA5IDkwIDg2IDExOCAzMiA2IDExNCA4OCAzOSAzOCAzOSA2MiAzIDEyIAorMTM0IDcyIDEzNyAzNSA3NSA4MSAxMTUgMTA2IDE0MCAxMTIgMTEgMTIzIDQxIDEwMyA0NSA5NSA4NCA3MSAxMDcgMTMgMjYgMTEwIDk2IAorNjIgMTYgMTA5IDg0IDU5IDUzIDM4IDI3IDggMjggMTMgMzIgMTM3IDE3IDEzOCA0MSAxMjIgMzYgOTkgNjUgOTkgODMgMzYgMTEyIDI5IAorNDkgNzAgOTYgMTI2IDEzNiAxMzEgMTE2IDMgMTggMTcgMTI2IDE0MiAxNCAzNyAxNDEgMTQxIDEyMyA0MiAxMyAyMCA4MyA0MiAxMzkgCis4MyA1NCA0OSA1OCA0MiA3IDEzNyAyOSA0OCAxNiAxMjEgMTI3IDM0IDUyIDE0MCAxMDYgMTI4IDU4IDM2IDEyNCA4MyAyNCA2OSA1NCAKKzYxIDExMiAxNyA2IDk1IDk3IDI0IDU3IDg2IDEyNCA1OSA3MSAxMTkgNjcgMSAxMDkgNTQgNjggNDkgNTcgMTMyIDMyIDUgNzEgMTEzIAorNDAgODAgMTA0IDc1IDEwNiAxMzMgMzEgMTI2IDEzMCAxMDQgNjIgOSAzOSA0NCA2NiAxMTYgMTQxIDEzNSA5NiAxMzIgMTkgNDEgMTIxIAorMTI2IDEyNCA3NyA4IDQgNjAgODIgNiAxMDEgMTI0IDg5IDUxIDEyMyA0OCA0MCA4NSA3NyAyMSAxMTIgMTAgNjkgNjYgMTE1IDg3IDE2IAorMTA4IDMwIDg0IDY1IDgwIDEwMyAzMiAxMzEgMTM0IDczIDQ3IDEwIDYzIDM5IDUwIDkzIDM3IDEzNSAxMTQgNjkgNDggMzQgNTggMjMgCisyNyAxMzMgMzcgOSA0MCA5OCA0MSAxMTUgOTkgNzAgODMgMjkgNDIgNjcgMTMzIDU1IDc5IDgwIDkxIDEyMiAxMiAyIDExNSAxMTIgNDcgXgorMjkzIDEgMzMgMTMgOTkgMTM4IDEgNDIgODkgMTE4IDg3IDExMyA5OSAxMiAxMzQgMTQyIDEwMCAzOCA1IDU1IDc1IDE0IDExMCAxMDggCis0MiA2NCAxMzAgNzkgMTM4IDYyIDY0IDY5IDU3IDExIDEyMyAyNSA1OSAxNiAxMTEgOTQgMjQgNjUgMzAgNTEgMTE5IDQ4IDEwNyA5MiAKKzg0IDY5IDI4IDEzNiAxNDMgNTQgMjAgNiA3MCA0NyAxNDIgNjQgNCA2NSA1OSA3MyA5OSAxMzQgMTQ2IDEwMiAxMjUgMTE2IDU3IDEzNyAKKzEzNyA3MiA0OCAxMjggNzggNSA4MCA2MyA1NCA4NSAzMCAyMiAxMjkgNjggMjEgMjEgNzQgMjggMTI4IDEwNyAyNyA2MCAyIDkzIDk1IAorNzEgMzcgMTEgMzcgMTUgMzkgMTAyIDMgMTA0IDY1IDgwIDU5IDUyIDExMyAzNCAyMCA2NyA2MCAyNyA4MSAxMzUgNDYgMTA2IDEwNiAKKzEwMiA2OCAxMjggMTcgMTUgMTAwIDEyNCAxNSA0MyAxMzYgMTIyIDEwMCA2NyAxNDIgMzUgMTQgNTMgMTIwIDIgODkgOTMgOTkgNzMgOSAKKzEyMiAzOSA3NyAxNSA5NiA5MCA0MyA3OSAxMzQgNjAgOTIgMTA1IDU1IDk2IDMxIDExOSA3NyA5NyA3MiAyMyAxNDAgMzggMzAgNDMgODMgCisxMzYgODggMTA3IDExNyA3MiAxMDkgMTE4IDU4IDkxIDExOSA3MyA5NSAxMDAgNTkgMTM4IDEyMyA1NCA0OSAxNDMgNTAgMTMzIDY2IAorMTA2IDQ1IDgwIDg4IDQyIDkzIDUgNTkgNzcgMTAxIDc0IDExMCAxMDQgNDAgOTIgMTkgNzcgNzYgODYgMTAyIDEyOSAzIDE0NCAxMDEgCisxMzkgMTM0IDU2IDkwIDE4IDkxIDk0IDg1IDU1IDEwIDEzNyAxMSA1OCAxIDEwNyAxMTMgNzAgMjIgNyA1NiAyOSAxNDMgMTExIDggNDYgCis0NSAxMTYgMTIyIDEyOSA4OSA3IDEyMSA1MyA5NSAxNCA0OSAxMTggNjIgMTI1IDkxIDM3IDk3IDE1IDM1IDEwMCA2MyAxNDAgNjMgNTAgCis1MSA1OCAyNiAxMjcgNiA0NSA1OSAxMDIgMTIxIDExNCA4NSAxNDEgMTM1IDEwIDcyIDE5IDEwNiA2NiA2NiA0MSA1MyAxMyAzOCAxIDIxIAorMTAzIDUwIDEwOCA0NiAxMTkgXgorMjk3IDEgNDYgMzEgMTMyIDExMiAyOCA2MyAxMjQgOTcgMTI5IDQzIDQwIDcyIDk5IDEwNyAxMzIgMTM3IDk2IDEzOSA5OSAxNDUgMTIxIAorMTQ0IDExOCAzNyA4MSAzOSA5NCA2MCA1NSAxMDkgNDcgMTA5IDExMCA3NSA0MiAxMiAxMzkgMTM3IDQzIDEyOCAxMDYgMTA3IDE5IDEyNiAKKzEyIDEwMSAxNDggMTI3IDE1IDExNyAxMjUgMTI1IDYyIDk2IDEzIDc2IDcwIDk2IDEwMSAxMTAgMTM4IDggOTUgNzYgMTQzIDE3IDMyIAorOTcgNzkgMTQ5IDM5IDMxIDk0IDEyMyAyMSA0MSAxMzUgNTUgODQgNzAgMzMgMTM1IDExOCA1MCA2MiAxMjEgODEgMSA0NSAxNDQgOTMgCis2MCA1IDY0IDEzNyA4IDEwNSA5MSA4MiA2NyAyNyAxMTMgMTE5IDUzIDE4IDk4IDc5IDQ4IDg0IDMyIDEzNSAxMjggNSAxIDIwIDc2IDE3IAorODUgMTA4IDcyIDM2IDE0MSAxNDAgNDkgMTUwIDEwNSAxMDQgMyAxNDkgMTQgNTQgMTggMTQ4IDY0IDQ5IDEyNSAzNyAyOCAyOCAxMDEgCisyMiAxMDQgOTEgMzIgODIgMTE3IDEyIDExNCA2OSA1OCAyIDU4IDExNSA5IDEwOCA0NyA1OSA2NSAxNCA5MiA3IDQgODYgOTggMTYgODIgCis5MiA5NSAzOCA5NCAxMCAxMCA0OCA5NyAxMDQgNjYgMTE1IDk3IDE0MiAxMTUgMTIyIDExOSA0MCA5NyAxNiAzMiA0NyAzNCA4OCA4OSAKKzI2IDUwIDEyIDc2IDgwIDUxIDQwIDkgMTMzIDI0IDQ0IDQwIDEyMiA4NCAxMDggMjIgMTQyIDE0MCA5OSA0NCAxNSA1NCA4IDQyIDEyNSAKKzE1MCAxMzAgMjEgNzkgMTI0IDYyIDQ2IDExOSAxNSAyOSA5MSA1NyAxNTAgNDIgMTM4IDcxIDYxIDY4IDgwIDExNCA2IDEgNzAgMTIxIAorMTggMzUgMTEzIDU2IDg3IDg2IDEwIDczIDE0IDI5IDQxIDcyIDg5IDEgMTMzIDg3IDEwMSAxMjMgNTkgOTAgMTQyIDc3IDEzMyA1MiA3OCAKKzQ4IDM0IDEzOCAxMzQgMjcgMTcgNjAgMTMxIDE0NyA2MSA5MyAxNDggMzkgMTMyIDQ5IDYyIDcxIDM2IDkxIDQgMTM5IDQ5IDEwMCAxMjAgCis0MyAxMTMgMTQ0IDMwIDk0IDczIDEyNyA0MCAxMjUgXgorMzEzIDEgMzUgOTcgOTUgNzYgMTA1IDg4IDMyIDEzOCAzMCA2OSA2MSA0MCA0NyAyMSAxMDcgNiAzOSA4MSAxMTQgNTMgMTI1IDUzIDE0NyAKKzE0IDQgNzMgMTQ2IDk2IDk4IDEzIDEzNiAxMSA5OCAxMTcgMTM4IDE1MyA2NyAxNDYgNzEgOTkgODggNyAxMzkgMjQgMTMgMzUgNDcgOTcgCisxNDUgNzQgMzYgMTE5IDMgNTEgODQgNDggMTE5IDUzIDQ5IDE1IDc5IDE3IDEyMCAxMDMgMTQ4IDY0IDMwIDQxIDk3IDEyMCA3NSAxMTEgCis2MyA1OCAxMzEgMTM0IDE4IDEzIDEwIDQ4IDE4IDE2IDQ4IDQzIDE1IDU0IDE4IDQxIDQ3IDEyMiAxNDQgODAgOTIgMTQ1IDc3IDEgMzMgCis4OSA1NCA0NiA3OCA0OCAyMSA1NCA0MyA0MCA1MyAyNCAxNiA3MyA0MiA5NCAyOSA0NCAzNCAxNTEgMTUyIDIzIDEyMyAxMiAxNDIgMTQwIAorNDMgMzcgODggMjkgMTkgMzUgNzIgOTYgMTUxIDEzMCA2MiAxMTIgMzQgMzYgOTEgMTIwIDUwIDExMiAxMzggMiAxMDUgNjAgNjggMTM3IAorMTMxIDUgMTcgMTkgMTM5IDc0IDExIDEyMCA3OCAxNDkgNTggMTI4IDE1IDEwNCAxNiAxMjYgNzggMjAgNTcgMTM0IDcxIDQ5IDkwIDc2IAorMTA4IDEyNiAxMDAgNTQgNjggMzkgMTMyIDE1MyA0MiAxNDcgMTQ2IDEyNCA2MiA4NyAzNSA3NSA2MSA2NSA0NiAxMDAgODIgMTA1IDExMyAKKzMxIDYzIDUgOTUgNTQgNzEgNzcgMTI3IDE1MCA4MCAzNiAxNDQgMiAxMzAgNTkgNzQgMzkgMyAxNTIgMTIxIDEyMiAxOCAxMTcgMTIgCisxMTcgMTQxIDExOCAxMzUgNjIgMzYgNjkgNSAzOSA1MyAxNTAgNTIgMTUzIDE0MyAzMCA2NiA5NiAxMjYgMTMxIDU2IDEzNyA4IDcgODYgCisxNDIgMTQgNyAxMTEgMTQxIDkzIDEzNiAxMzcgMTM0IDQzIDEyIDg5IDIzIDQ0IDkgMTUyIDE0NiAxMjEgOTcgMTkgMzggMTEwIDkxIDY3IAorMTQgMzIgMTEwIDY2IDY4IDggMTMwIDg0IDczIDExOCA1OSAyNCA0MSA3MiAxMjEgMTUwIDU1IDM3IDEzOCAyNyAxMDQgNjYgMTI0IDkgCis1MSAxMDkgNDcgMTI1IDEwOSAxNDggOCAyOSA0NyA3MiAxNDYgMTQ5IDYxIDkzIDEwIDIwIDU0IDE1IDc2IDEzMyAxMjUgMTA2IDExMCAKKzY3IF4KKzMzMCAwIDIzIDkgMjYgMTM2IDI3IDUxIDExNSAxMjIgNDQgMTA2IDYgMTQ2IDEwOCAxMTMgODUgNTEgOCA5NiA0NyA1NiAxMzcgNjIgNTkgCis4OSAxNDMgNzEgMTQwIDE0IDg1IDE1NiAxMzkgOTkgMTU0IDMwIDUzIDExNSAzNSAxNDcgMTA4IDE0OCA1OCA1MiAyOCAxMDMgMTkgOTIgCis5NSAxNTIgMTUyIDEwIDExIDEzIDE1NSA2NyAxMSA4MyAxMDEgNjkgMTUzIDE1MiA0NSAxNDEgMTQgMTIwIDEyOSAxNDAgMTE5IDU5IDIgCis4OSA3MyA3MCA4MyAyOSAxNiA2NyA4MSAyOSAxIDU0IDY1IDk2IDExNyAyIDM3IDQ3IDEyOCAzMyAzIDg5IDEwOCA5OCAxMzkgNDkgNzggCisyNyAxMDMgMzkgMTE5IDk0IDEzMiA5MCAzOCAxMzIgNTUgNjUgMTMxIDkwIDU4IDIgNTQgMTAwIDY5IDExOCAyMiA0NCAxOSA3IDE0OCAKKzkzIDI1IDI5IDEyMyA4MSA2NCAxMzEgNTUgMzAgMSA4OSAzOCA5NyA4MiA2NCA5IDI4IDg2IDEyMyAxNTEgMTAgMTMzIDQwIDE1NCAxMDIgCis0IDExMSA2NSA5IDYzIDU5IDEyNCAxMTYgNzIgMTA1IDc2IDU3IDEzNyA5NyAzMiAxNDUgMTA4IDc4IDExMiA1MCA0MyAzNCA3NSAyMCAKKzIyIDEyOSA2OCAxMSAxMTggNzQgMTI1IDExOCA1NyAxNyAyMCAxMjkgNTMgNjUgNjEgMTQ0IDEgMTcgMTQyIDE1NiA1MiAxMDAgNTQgMTUgCisyMCA1OSA1MiA2MyAxMzEgMjAgNTcgMTI0IDMxIDEyNSA0NiAxMDYgNzYgOTIgOCA5OCAxNTQgMTUyIDgwIDExNCAxNSAxNDAgMTM2IAorMTEyIDEwMCAxNyA5MiAyNSAxNTEgMTUwIDgwIDk5IDY5IDgzIDQ5IDQzIDE1NiAxMDIgMTkgNTcgMTIyIDk2IDMwIDMgMzkgMTM0IDQwIAorMzIgNzUgNSA3NiAxMjcgMTM4IDk5IDE3IDU3IDUyIDE1MCAxMzAgMTggMTI3IDMzIDIzIDExNiAxMDcgNzggNzcgNzcgNDIgNjkgNjggCis0OCA0MSA2OSAzMyA3NSA0MCA0OSAxMjggMTAzIDQgMTQ2IDkzIDEwIDgzIDY2IDk2IDE1MiAzMCAzOCAxMiAzMyA1IDM5IDQ3IDQxIDM0IAorNjAgNzQgMjAgNDIgMTU2IDY3IDQ2IDU2IDEwMiA4OSAzIDEyNCA4MSA5OSAxMDQgNTYgNTAgOCA2MSA3NCA1NSAxNSA4NyAxMDggMjggCisxMzggNDcgOTMgNjAgMiAxMjQgNDYgMTI2IDEwMyA5MSAxNDUgMzYgMjUgMTE2IDEyMiA1MSBeCiszMjIgMCA3NSA3IDEwNyAxNTggODEgMTA1IDE1NCA5MCAyMCAxMjUgNzcgMTE0IDY5IDkyIDcgNTggMjEgOTggMTU0IDUwIDEyOCAxNDkgCisxMTcgMTI3IDE1MyA0NSAzIDE4IDEyMSA4NiAyOSA3MSA3OSAxMDEgMiA1IDIyIDE0MyAxMCAyNyA1MyAxNDYgMTU3IDE0OCAxMTIgMzMgCisyMiA4MCAxMjMgMjQgMTQ3IDEgMTEyIDgyIDE1OSA2MyA3NCA5NyAxMDkgMzMgMTUxIDMyIDg5IDg3IDEzMiAxMTcgNDYgMTI5IDU5IAorMTE1IDkxIDExNCAxMTggMzcgMjEgOSA5NCA2MCAyNSA4OSA0NyA3OSAxMTAgNTUgMTIgMTQzIDk5IDg3IDQzIDg4IDU2IDU3IDE2MCA3NiAKKzEyIDcxIDEyOCA3NyAxNDYgMTE3IDk1IDEwNSA0MiA2NiAzIDc2IDIwIDc2IDEwMSAxMDAgMTE4IDE0OSA0NSAyNiAxNDMgMTQ4IDMyIAorNTcgMzkgMTI5IDE5IDMxIDg0IDEyMyAxIDE1MiAxMzUgNSA1NCAzMCAxMyAxMjUgNjggMzAgNjIgMTAxIDUxIDE0MiA1IDk0IDgzIDIwIAorMTE2IDI0IDEwNyAxMDkgMTA1IDkxIDQyIDE3IDI3IDkzIDY5IDMgMTM5IDY4IDc5IDM4IDg0IDIgODUgMTI4IDEyNiAxMjIgMTMxIDQ2IAorMTcgMzUgOTggNDIgMjYgMTExIDEwMCAyOSAxMjAgNTUgODQgMTE0IDEwOSAxNDUgMTQgMTggMTM4IDE0IDkgODUgNyAxOCAxMjkgOTEgMiAKKzk0IDUxIDEzMyA4MiA4NyAxMjMgNjQgMzkgOCAxMDMgMzggNzUgMTEwIDc4IDcgOSA0NSAxMTUgNDIgMTM4IDEzNSA4NiA3OCAxNiA2MiAKKzUyIDc1IDE1OSA1NCAxNTEgMTIxIDE0OSA3NyA3NCAxNiA4NSA0NyAxMDIgMTA1IDgyIDExOSAxMCA2NyAxMzcgMTUzIDE0OCAxMzUgMjggCis0OSAyNiAxNTEgMTUzIDM2IDgwIDExIDEzMCAxMTMgMjQgNDQgMzAgMTAyIDI0IDU4IDEzMyAxMjIgMTQwIDk5IDI0IDE1NiA1NCAxMTkgCis0MiAxMTUgMTQwIDkwIDEzMiAxOSA5NCAyIDE1NyA5OSAxMzYgMTkgNzEgNyAxMzAgMTUzIDEwOCA1MSAyMSA1OCA3MCA3NCAxMzcgMSAKKzQwIDExMSAxNDkgNSAxMDMgNiAyNyA3NiAxNDEgMjMgMTI1IDE0MCAxIDcyIDI5IDE1MiAxMDMgODcgNTEgOTMgMjkgODAgMTMyIDc3IAorMTIzIDE1MyA2OCAxNTkgMTQgOTggMTE0IDE1OCAxMjEgMTU4IDgxIDEzMSBeCiszMjIgMCAzNSA5MyAxMDkgMTI1IDExOSAxMCAxMCAxOSAxMzUgMjYgNCA3NCAxMzUgMzUgMTIwIDEyOSAxMTMgOTIgMTcgMjkgNDcgODggCisxNCAxNTkgMTQ5IDg3IDQ1IDM2IDc1IDY4IDIyIDEzOCAyMCA1OSA2MSAxNDQgMTUxIDExIDEwNyA2IDE1MyA4MSAxMTQgNDMgODUgMTU3IAorOTcgMTQ4IDExOCA3MyAxMjYgNTYgNTggMTM3IDk2IDExIDk4IDY3IDk4IDEwMyA1NyAxNDYgMjEgNTkgODggMTUxIDEzOSAxNDggMTI3IAorMjUgMTcgNDcgMTE1IDM0IDE2MCAxMDkgMTA3IDUxIDY0IDI4IDY5IDEzIDQ5IDE0OSA2OSAxNDEgOTAgOTMgMTE4IDY0IDEwIDEgNjcgCis4MCAzNSAxMTEgMTMgNTggMTAxIDEyNCAxMzIgMTQ3IDE1NCAxOCAxNjIgNiAxNjIgMzMgNSAzNCAxNDIgNDEgMTYxIDgyIDExNCA3MCAKKzkyIDE0NSA1NyAxNTUgMTM3IDExNCA3OSA0NCAzNiA0OCA0OCAyMSAxNCAxMyA0MCAzMyAxNCAxNTAgMzMgMzIgNTQgMTQzIDE0IDQgCisxMDEgMTQyIDIzIDkzIDEzNiAxMzIgMTIwIDE0NyAxNyAzOCAxNjMgMTQzIDUgNTIgNDYgMTUxIDEzMCAzMiA3MiAzNCAxMjQgMTUwIDUxIAorMTAwIDExMiAxMjggMTI2IDY1IDEwIDI4IDg3IDgxIDE1OSAxMzEgMTkgOTkgNTQgMTI1IDExMCA1OCAxMTkgMjggNzggMTI5IDEwNCAKKzE0MCAxMjYgMzggMTU0IDI3IDExNCA2MSAxNTMgOTAgNjYgOTggNzYgNTAgMTU4IDQ4IDM5IDgyIDEyMyAyMiAxNDcgMTM2IDExNCA1MiAKKzM3IDM1IDc1IDQxIDE1IDE1MCA2MCA1MiA1NSAxMDMgMjEgMjMgMTI5IDk1IDI0IDcxIDQ3IDk3IDEzMCA1MCAxNDAgMTQ0IDEwNiAxMDAgCis5IDY0IDE5IDExNyAxMjIgNzEgOTIgOCA3NyAxNTYgOTcgMTIxIDk4IDg1IDIgMzYgMzkgMTA5IDE0MyAyMyAxMjAgMTU2IDEzMyA5MyAKKzE1NCAzNiA2NiAxMTYgMTMxIDE2MCAxMjcgMTYyIDE2MSA0NiAxNDIgMTQgMTQxIDgxIDE0MSA2MyA4NiAxMTcgMTA0IDMgMTQ2IDM5IAorMTI3IDM0IDEzMyAxMDIgMTA2IDkxIDU3IDkgMjggNjAgNjEgNyAxNTggMTIgODAgMjYgOCAxMjIgODAgNDQgNjMgNjggNDkgMTU4IDIxIAorMzIgODEgMTUwIDE1IDE0MSAxMDggMTYxIDY0IDQ2IDEyNCAxMjMgMzEgOTkgMjcgMTA1IDEwOSA5OCAxMTIgMTQ0IF4KKzMzNiAxIDM0IDE2MSAxMDcgMTQ5IDQ4IDY3IDEzOCAxMDkgMTU2IDEwNCAzNyAxMzMgNjAgODAgODQgODEgMTYwIDkgMTYgOTYgMTY0IDEgCis5NSAxMTIgNCA4NiAxNjMgMTE2IDk4IDEwMyA1NSAzMSA4IDU2IDM3IDM2IDEyNyAzMiA5IDg5IDEwMyAzMSAxMDAgMTYxIDg1IDEwNiAKKzExOSA4OSAxNTQgNDMgMTE1IDE2MiAxMzcgMTA4IDEyOCAzOCA0MiAxNTUgMTAzIDkgNjIgNjUgMTAyIDEyMiAxMCAxMzggMTYwIDEyNSAKKzQ3IDE1OCA0MyA5MSA2OSAxMjMgMTMyIDM1IDEyMSA0IDExMCA4OSAxMzAgNjkgMjkgMTM5IDY5IDUzIDcwIDgzIDI5IDE2MyA2NyA0MSAKKzkgMTA4IDM0IDQ1IDc2IDg3IDIgMTQ0IDE2NCA5OCAzMyAxNjAgNzkgNzggNDggODkgOSAzOCAxMzQgOTMgMTQ2IDc5IDU0IDEyMiA4MCAKKzM4IDExMiA1NSA1NSAxMDEgNzAgOCAxMjkgNDQgNzAgNTkgOTggMTQ5IDI0IDEzNiAxMjQgMTM4IDYzIDI1IDE2NiA4MyA1MSAzNCA5MSAKKzQ1IDMwIDExOCA1OSAyOCA4NyA3MiA0NCAxMTYgMjggMzYgMTAzIDEwMSAxMTMgMTAgMTE0IDYyIDExMSA3MSA2NSAxMjYgNTMgMTkgCisxMTQgODYgNDIgODUgMzYgNTcgMTM3IDU3IDE1OSA5NSA4OCA3OCA3MiAyMCAyMyAxNCA2NSAxMCAyMiAxMjkgNjggMSA2OCA3NCA3NSAKKzEwOCA3IDcgMTQ3IDEwOSAxMyAzNSA1MSAxMDQgMTU4IDE2NCAxMjIgMTI2IDIgNTAgNCAxMzIgMTI3IDU5IDUyIDEzIDgxIDIwIDQ3IAorMTA3IDc0IDE0OCAxMTUgNDYgMTA2IDQ2IDgyIDExNSA2OCAxNDQgMTQyIDYwIDEwNCAxNSA5MCAxMzYgMTAyIDEwMCAxMzQgNDIgMTUgCisxNDEgMTAwIDQwIDQ5IDQ5IDczIDE2NiAxMyAxNTYgODIgMTY2IDM3IDgyIDk2IDEzNyAxMzAgMTY2IDEzNCAyMCAxMzkgNDUgMTIyIDU2IAorMTA3IDk4IDc5IDEyNCAxNyAzMiAxMzAgMTIwIDE2NSA3NyAyMyAxMzAgOTYgNjcgNjggNDcgMzcgMTIgMjkgMTggMzggMTU4IDE5IDE2MCAKKzU1IDE0NyAzOSAxMTggODMgMTIxIDk2IDQzIDEzNyAzMyA2NiA4NiAxMTIgMTQ3IDE1NSAxNDkgMTQwIDUgMTkgMTcgMTQ4IDE2MSAxMCAKKzQ0IDE1OSAxNDYgNTcgMTYgMjYgMTAyIDQ5IDMgMTA0IDYxIDU5IDc0IDU2IDEwIDE2NSAzMSA1NCAyNSAxNDIgMTU3IDM3IDU4IDE2NSAKKzEyOCAxNTQgNzMgNTAgMTQ5IDk0IDEzNyBeCiszMzAgMSA2MSA1MSA2NSAxMzIgMjMgMTY5IDExNiAxMjIgMTQgNjYgNyA5OCAxMzEgNzIgNjkgMTI3IDcyIDE2MyAxMjUgNjggNjkgNTEgCis0NyAxNTkgMzEgMTY0IDcxIDExOCA1MCA4MyAxMTMgODEgMTI3IDE1MyA0NSAxMzcgMTM0IDEyMSA2OCAxNjMgMjYgNDMgNjUgMTI3IAorMTY2IDEzOCA5OCAxNDQgMTggNTMgMTM3IDEzOSAxNDggNzYgMTU4IDQgNjIgNzggMTY3IDEwMiAxNDQgOTQgNTUgMTQxIDYzIDI5IDk3IAorOTEgMjQgMTE1IDE2NiA4MCA2OSAxMzIgOTkgMSAxMjAgMjMgODggNjQgODcgMTE4IDM3IDEzNyAxNTIgOTQgNjAgMTY4IDcxIDQ3IDUyIAorMTEwIDM3IDE1NSAxMjUgNjMgNDIgNDMgNTIgMTEgMTIgMTUxIDMxIDEyIDQ0IDExMCAzMiAxMjggMTE3IDY4IDg3IDI0IDM5IDE2NCA3NiAKKzE0NSA1OCAxMDEgOTEgMTAwIDE0MCAxNTEgMTQzIDEzMCAzMiAyMSAzIDExMSAxIDMxIDc1IDEyMyAxNTMgMTE2IDEzNSAxMzAgMjcgCisxNjQgMTY1IDExNiAyMyAxMiA2MiA4MyAyNCAxMzMgMTM5IDQ5IDc0IDE1NCA4MCAxNTggODAgNjQgMTA1IDkxIDYgMTQyIDI3IDc1IDI0IAorMTI4IDExMiA0MSA3OSAyOSA4NCAxNDUgNDAgMTI4IDk5IDk1IDk1IDE5IDE3IDE2MCA4OSAxNSAxNyA4NCA2NCAxMSA5MyAxMCA2NiA3OCAKKzczIDEyNyAxNDggMTggMTI5IDEzOSAxNDMgNDkgMTUwIDkgODQgODIgMTU0IDg1IDE1IDg4IDgyIDYwIDg3IDE5IDEyIDEzMyA1OCAyMCAKKzM5IDY1IDUxIDE0MSAxMzQgMjcgNzAgMTY3IDEyMCAxMTcgODYgNjAgMTYgNDQgMTYgNTcgMTMyIDE4IDE0MiA4NSAxMDQgNTkgNDcgCisxNDEgNTggMiA2NiA5NiA0NiAxMTkgMTUzIDQwIDExMCAxMjYgMTAzIDkwIDE0NCAxMyAyNiAxMDYgMTQ0IDgwIDE0NSAxMzQgMTAzIDk1IAorMjQgNDQgMjEgODQgMTQwIDEzIDk3IDEwNCAxNDAgOTkgNiAxNDcgNTQgODMgNDIgMTA2IDEzMSA1NCA5NiAxMzUgNjcgMTE4IDEyMSA4MSAKKzEwOSAxMCA1MyAxMzIgMTEyIDExNyA4MSAzMyAxNTUgNDkgNjEgMzggMTE5IDEgMTMgMTAyIDEzMSAxNDggOTQgMTMxIDE0MyA2NyAxMjMgCisxNDggODkgMTA0IDEzNSA3MiAxNDUgMTUyIDc2IDg3IDYgNjYgMiA3MSAxMjMgNzcgMTE0IDEwOCA1OSAxMjMgMTY2IDYyIDk2IDE0MCAKKzk0IDE0OSAxMTYgMTY5IF4KKzM0OSAwIDEyNSAxNyA5MyA4MiA4MCAxMTAgMTU2IDE0NyAxNTYgOTkgMTU0IDQgMjkgOTAgMTYzIDEyMCA4NCAxMTMgNTYgOCAxNTcgMjkgCis2MSAxNjkgMTQxIDExMyA3OCA0OCA1MCAxMyAxMzggMTEgNTAgNjEgOTkgMTA2IDIgMTA3IDYgMTE3IDgxIDExNCAzNCA0OSAxMTIgNTIgCisxMzAgODIgNzMgMTA4IDIwIDIyIDExMCA2MCAxMSA5OCAyMiA2MiA1OCA0OCAxNDYgMTQ5IDIzIDg4IDE0MiAxMzkgMTIxIDkxIDE2IAorMTYzIDIgODggMTcxIDEzMyAxMDAgNjIgNTEgNDYgMTAgMjQgMTUwIDQ5IDEzMSA2MCAxMTQgNjMgODQgOTEgNjQgMTY1IDEzOCA0MCA0NCAKKzE3MiAxMTEgMTQxIDU4IDc0IDExNSA5NiAxMjkgMTQ1IDE2NCAxNTMgMTcwIDEyNiAyNCAxNjkgMTYgMTE1IDQxIDEyNSA0NiA4NyA2MSAKKzkyIDE0NSAzOSAxNTUgOTIgNzggNzAgMzUgMjcgMjEgNDggMjEgMTUxIDE1OSA0MCAxNSA1IDEzMiAxNzAgMjMgMTggMTA3IDE2MCAxNTAgCis1NiAxMzMgMjMgNjYgMTA5IDEyMyAxMDIgMTAyIDE3MiAxNjYgMTQ1IDExNiAxNTEgMzQgMSAxNTEgMTMwIDUgMzYgMzQgOTcgMTE0IDE1IAorODIgMTI4IDExMiAxMTkgOTkgMjkgMTM4IDE2NSA0MiAzNiAxNTkgOTUgMTkgNjMgMzYgODkgMTAxIDQwIDkyIDEgMzMgOTMgMTA0IDExMyAKKzEyNiAyIDEzNiA5NiA1MiAxMDggOTAgNTcgODkgMzEgNSAxMTMgMzAgMzkgMzcgOTYgNCAxNDcgMTI3IDEwNSA0MyAxNjUgMzUgNzUgMjMgCisxNDMgMTA1IDI0IDI1IDEwIDk0IDEyIDE2MCAxMDIgOTUgMTcwIDcxIDIwIDcwIDExMiAyMyA5NSAxNDQgNjEgNzMgMTM3IDU1IDEgODEgCis5NSAyNiA2NSAxNzIgNDEgMTQ3IDc5IDEwMyA4MCA0MCAxMjEgMzYgMTIgNjQgOTggMTY5IDkzIDExMSAxMTUgNDggMTI3IDkgMzkgMTA3IAorMTMxIDExNSAxMTggMTYyIDE2MSAxMCAxNDIgMTQgMTIzIDU0IDE0MSAzNiA0MSA5OSA3NyAxNDAgMTI4IDE2NyA4MiAyNSAxMDYgNTcgCis3MCA2NCAyMSAxOSAxNSAzNCAxMjYgMTQ5IDE2NyA1MyAxNjMgMTI3IDg2IDM1IDggNTQgMjMgNDAgMTQwIDMgMTY5IDQ1IDE1MCAxNTIgCis5NiA4MSAxNDMgMjggMjggMTI0IDg3IDEzIDkwIDkgODcgMTA5IDUzIDY3IDE2NCAyOCAxMzEgODkgMTQ5IDQyIDU1IDEyNiA3OSAxMzIgCis3NCAxOSAxMzMgMzAgNjggNzIgNzUgMTQ4IDkgMTAgNzIgMTUyIDE0NCA4MyAxMDYgMTUzIDc0IDE2MyA5OCAxNTIgXgorMzc1IDEgOTQgMjggMTMgOCAyMCAyOCAxOCAxMTggNSAxNDAgODkgNjcgMTcxIDY0IDE1MiA4NSA2MSAxMDEgODAgMTU0IDE0OSAzNCAKKzExNSAxMzUgMTI4IDEwOCAxMTAgMjAgMzMgMTI4IDEwMyAzNSAzOCA1NyA5NSAxMCAxMTEgMTUxIDk4IDI5IDE0OSA3IDgyIDY5IDk2IAorMTE0IDI2IDEwMyAxNzEgMTAxIDUzIDEyMSAyNCAyIDEyMSA1MSAzNSA3MCA4MyAyOSAxNTQgNjcgNSAxNjcgNjMgMTYgMjcgNTggNjAgMiAKKzk5IDEyOCA3MSAzMyAxNjAgNzAgNTEgMyA0NCAxNDkgMiA4OSA4NCAxMDEgNDMgMTggMTEzIDcxIDM4IDk0IDU1IDQ2IDc0IDUyIDEzOSAKKzEwMiAzNSA0MyA1MCA4MCAxMjIgNiAxMDAgODggMTI5IDM2IDI1IDE0OCA0NyAyNCA3IDU1IDM2IDMwIDgyIDMyIDE5IDc4IDYzIDI2IAorNzEgMjggMTY3IDg1IDU2IDE2NyA5NSAxNTkgNzggMjYgNjYgMzUgNjUgOTAgNDQgMTU5IDEwNSA1OSAxNSA2NyA1NyAxMzcgMjEgMTMyIAorNTAgNzAgNzggMzYgMTY5IDUgMTcyIDU2IDEgMjIgMTI5IDY4IDE2OCAyMyA3NCAzMCA5OSAxMzggMTc0IDEyMCA5MSAxNTMgOCA0MiA2OCAKKzE1OCAxNTUgMTA0IDk5IDEzMyA1IDEzNSA5NiA4MiA1OSA1MiAxNDQgMzYgMjAgMzggNjIgMjkgMTEyIDEwNiA0NiAxMDYgMTkgNzMgNzAgCis0MSAxMzUgMTMzIDQyIDk1IDE1IDQ1IDEzNiA5MyAxMDAgOTggMTczIDYgMTMyIDU1IDQgNCAzMSA2NCAxMzAgMTYyIDE1NiA2NCAxNTcgCisxOSA0NiA5NiA5MiAxMDMgMTM5IDEzNCAyIDk0IDE4IDg2IDM4IDg5IDYyIDYxIDc5IDE1NyAxNCAxMTIgMTExIDE1NiAzMiAxNCA4NSAKKzc4IDMxIDU5IDIwIDEgMTYxIDE2OSAxNDkgMjkgMTIyIDE1MCAxMzMgMzcgMTAyIDMwIDEwOSA2NSA4NSA1MSAxNzQgMTEwIDE2NCA2NiAKKzc3IDc2IDExMSAxMTkgMTMxIDk1IDUgMSAxNjYgMTAzIDEzNCAxNDEgMTcgMTU4IDEyMyAxMzcgNDggMTY1IDE3NSAxMDIgMTMgMyA4NiAKKzQzIDIzIDQ3IDU2IDE1MCAxNjUgNCAzNiAxNzQgMTE1IDE1NyAxNjggMTMgMTQ3IDExOSAxMDkgNTUgNDEgMTQwIDY3IDI3IDMxIDI3IAorNTMgMTI2IDE3IDE2MyAxMTYgMTIyIDE2MCA2MCA3IDkyIDExMyA2NiA0NSAxMDkgNjAgMTUxIDEyNSA2MiAzOSAzOSAxNyAxNTMgMTMgCisxNTIgNTMgOTQgNTAgNTMgODkgNTcgMTI3IDE1MyA0NSAxMTkgMTA0IDEyMSA1NiAxNDUgMTcyIDE5IDQxIDEwMyAxNjYgMTA4IDY4IAorMTI2IDEyIDUzIDEzMSAxMjcgMTQ4IDUyIDEzNCAxNjggNTAgNDggMTU1IDcyIDEzMiA4MiAzNyAxMjkgNjMgMTc1IDE2MCBeCiszNjYgMSA3MyAxNSA3OSAxMzkgNzEgNTEgMTMyIDgxIDEzNSAxMTEgMTY2IDYxIDM3IDYwIDExOCAzNyA5MiAxMzQgOTQgNjAgMTUwIDUzIAorNDcgMjUgMTEwIDE5IDEzNyAxMDcgMjcgMTc2IDQzIDE2IDE0NSAxNDYgMTQyIDE2NSAxMiAxNyA5MiAxNjYgMTEwIDExNyA0MSA2OSA2IAorMTIgMTY0IDc2IDEwOSA0MCAxMDEgODIgODIgMTMxIDEzNCAxMTUgMTQzIDExMiAzMiAxNjQgMTQ2IDkzIDE2MiAzMSA2NiAxMjMgMTQ0IAorODAgMTM1IDk0IDEzNyAxNTYgMTA3IDE1NyAxNzMgNjIgNjUgMTc2IDEyNCAxMTIgNCA2NSAxMjcgNDQgMTMxIDUzIDE5IDEwNSA5MSAKKzE0OSAxMDYgMjcgNTcgMTU4IDkyIDg1IDE0IDc5IDIwIDg0IDEyNyAxNzQgMTI4IDcyIDY4IDU5IDE3MSAxNyAxMjQgODAgMTY3IDggNTcgCisyOCAxNzIgNjYgMTQ0IDQ4IDQyIDM3IDEwOSAxMjEgMTggMTIwIDEwMyAxMTYgMTMgMTMyIDM5IDczIDE0NSA3NiAxNTggNDMgODIgMzMgCis1MSAxNTMgMTY0IDk3IDEzIDIgMyAyMCAyNCAxMTQgOTggOSAyNSAxMzEgMTAyIDk5IDg2IDQyIDE2IDI2IDE1OSAzOSAxMDUgMTYxIAorMTMzIDQ5IDU5IDQxIDIwIDEwNSAzMSAxMzYgMzAgODcgMTAgMTE5IDEzNSAxMyA4MyA5OSA1OCA0NSA5OSAxNTYgMjYgNjEgMTM1IDE0MyAKKzgwIDExOCAxMDcgNzYgNzcgMjQgNDQgMTIgNjYgOTUgMTQ3IDYxIDg2IDE0MCA5OSAxNjcgMTM4IDU0IDQ3IDQyIDk3IDEyMiAxOCA2MCAKKzkwIDQwIDczIDg1IDYzIDgyIDEgMzUgOTYgOTQgODEgNTQgMTUgMTI4IDQwIDUyIDIgMTAxIDEgMTY1IDkzIDExMyAxMzAgODUgOTUgOTggCis1OCAxMDUgMTEyIDUzIDY4IDEwOCA3MiAxMDAgMTUyIDQ5IDg3IDE0MCAzOSAxNTQgNjIgMTE0IDc3IDEwNSA2MyA1MCA4NyAxNTcgMjYgCis3OCAxMjIgNjcgMTQwIDcxIDE3MCAxMTkgNSA5MyA2NCA1MCAxMDQgMTQ0IDEyOSAxMzggNzUgMTMwIDQgMTc4IDYwIDEzOSAxMjAgNTQgCisxMTMgMzIgMiAxMzMgMTcgNDMgMTYzIDEyOSA4OSA3MiAxNDkgMTU1IDMwIDM4IDcgMTM4IDUgNDQgNjEgNjkgNzYgMTc1IDEwNyA2IDkzIAorODEgMTE0IDI4IDI1IDgyIDIyIDExOCA1OCA3MyA5NiAxNzUgMTc3IDkyIDM2IDExIDk4IDE3MSAzOCAyOCA0MiAxNDYgMTI1IDE3OCA4OCAKKzEzNiAxMzkgMTAzIDY3IDEwIDE1MSAxNTEgNzAgMTUzIDExNSA5NCAzMiA1MSAzNCAxNzcgMTczIDEzMiA0OSAxMTkgNTQgOTYgNDUgNzggCis3MyA2NCAxNTkgMTIwIDIyIDIwIDE1NCAxMTEgMTE3IDU4IDU2IDEwOSA3MiAxNDMgXgorMzcyIDEgMTM2IDE0NiAxNDQgMTcwIDkwIDE1IDE2OSAxODAgODggNDEgODkgMTAgNjAgNTIgOTIgMTQ1IDIxIDE1NSA0NyA0MiA2MSAyNiAKKzE4IDE3NiA0OCAyMSAxMjQgMTQxIDQwIDE3OSAxNzggMTE0IDE0MyAxNCAxNjQgNzEgMTQyIDEzMiAxMSAxMjQgMjMgMzkgODIgMTE0IAorODQgNTcgMTYzIDEzMCAxMjcgODkgMTMzIDE2IDEzOCAxNTEgMTMwIDE2MCAzNCA3MCA3OCAxNjEgNjQgOTIgMTEyIDExMCA3MiAxNzUgCisxMDIgMTM4IDE3OSAxNzMgMTU5IDU5IDE5IDI3IDE4IDUzIDkyIDIyIDY1IDE1NiAxNzAgNTcgMTA0IDg2IDEyNiAxNDggMTE4IDE1NSAKKzc4IDQzIDYzIDkwIDQ4IDgwIDE2OCAxNDIgNjggMTIgMzkgMTc0IDY5IDE2OCAxNDcgMTE4IDk2IDM0IDEyOSAzNSA3NSA1IDEwNyA2MCAKKzE3MCAxODAgMTQ3IDg1IDMgMTMzIDc1IDk1IDE1MiA3MSAxNzUgNDMgOTQgMTc4IDUwIDE0NCAxNiA0NiAxMDEgNDYgMTY1IDQ1IDY4IAorMTYzIDM4IDE3MiA1IDEzOCA2MSA4NSA2MiAxNzcgNzYgMzYgMTY3IDE5IDUzIDE1MSA2NiA2NiA5NyAzIDEwMCAxNjQgMTIgOTggMTMxIAorNzAgMTA5IDE2MiAxNjEgMTU2IDE0MiAxNCAxMDUgMjcgMTQxIDkgMTc4IDgxIDUwIDExMyAxMTAgMTMxIDM3IDE2IDc5IDEyIDM0IDM3IAorMTY3IDE3MyAxMCAxNTIgNyA4MSAxNDAgMTU4IDI2IDEzNiA4MiA1MCAxNzIgMTU0IDQ1IDE2MCAzMSAxMjIgMTY3IDE0MiA5IDE1MCAKKzEyNSA1MSA1NCAxMjUgMTc0IDEwIDEyNCA1MSAxNzcgODEgMTczIDY5IDEwOSA4IDIyIDE1NSAxOSA4NiA2MiAxNDkgMzMgMzcgMTA4IAorMzQgOTYgMjkgMTc0IDEzMyAxNjcgNTAgNTQgNjYgMTMwIDkgMSAzNiAxMzQgMTA4IDY1IDk3IDEyNiA1NiAxNjMgNzEgODMgODggMTAgMSAKKzggMTc4IDIyIDYgMTEyIDE2OSAxMTYgODkgNDMgMTUzIDQwIDE0NiA4NSAzMSA4OSA3NCAxNTQgMTM3IDI4IDExNSAxMTcgMTIyIDEwOCAKKzk4IDggMjcgMTEwIDEwMyAxNzYgMTcgMjAgMjcgNzcgMTAgOTMgMTQ1IDgwIDE3IDE0MyAxNjUgNzYgNjkgNzggMTAyIDIwIDkxIDE3MSAKKzk1IDI5IDExNSAxNzYgMTY2IDEwOSAzOSAyMyA3MCA4MyAyOSAxNDggNjcgMTYzIDE2MSAzMyA0IDE1IDQ2IDQyIDIgNjkgMTA0IDUzIAorMzMgMTYwIDY0IDMzIDE1NSAxNCAxMzEgMTYwIDU5IDc4IDcxIDE5IDE3NiAxMDcgNjUgMzggODIgNTUgNDAgNTYgNDAgMTE1IDg0IDI5IAorMjUgNDQgNjggMTA0IDE3NiA3NiA2NCAxMjMgMTggMjUgMTM2IDIzIDYgMTcxIDMxIDMwIDMwIDU4IDE0IDEzIDcyIDU3IDE0IDQxIDE3NyAKK14KKzM2MyAwIDEzNSA2OSAxNiAxNjcgNzkgMTQzIDQ2IDE3OCAyNiAzIDY1IDU4IDM2IDEzNSA5NyAzNSAxNzUgNTEgMTUyIDU3IDEzNyAxNzMgCisxMDggMTAgNTQgNzggNCAxNTMgMTczIDE2NCA0OCAxNzcgMjIgMTI5IDY4IDE2OCAxNjcgNzQgMTc0IDkxIDEwNiAxNzQgOTYgNzUgMTI5IAorMTY4IDM0IDM2IDE1OCAxNDcgODggNzUgMTAxIDE0OSAxMDMgNjQgNDIgNTkgNTIgMTEyIDE4MCAyMCAzMCAyMiAxNzMgODAgOTggNDYgCisxMDYgMTc5IDY1IDMwIDE3IDEyNyAxMjUgMjYgODcgMTUgNSAxMzYgODUgMTAwIDY2IDE0MSAxODIgMTI0IDE1IDE1NiAxNDggMTUgNTYgCis5OCAxNDYgMTU2IDQ4IDE0OSAzIDE0IDk2IDUyIDc5IDExNSAxMzQgMTcwIDU0IDE3OCA1NCAyMiA3MyAzMCA0NSAzOSAxMzMgMTgyIDk2IAorMTAzIDE0OCAxNzYgNiA0NSA2MiAxODMgNTEgMTgwIDE1MyAxNDUgMTQ1IDExNyAyMSA5MCAxMTggMTA5IDIxIDYyIDIyIDEwMSA0OSA1MyAKKzExIDE0MiA4NiAxMzIgNjYgNjkgNDQgNzkgODcgMTE1IDU1IDUgMTY5IDE1MCA2MyAxMTAgMTA5IDE3NyAxNTAgOTEgMTI5IDQwIDE0OSAKKzE1OSAxMDIgMTY1IDMgNzAgMjcgMTc1IDIzIDU2IDEyNiAxNjUgMTY0IDIwIDE1OCA5MSAxNTcgMTM2IDE1NyAxMzEgMTExIDY5IDM5IAorMzMgMTMyIDQzIDE5IDE3NSAxNzkgMzcgMTE4IDkgMTU1IDExNiAxMjIgMTI4IDUyIDcgODQgODkgNTggMTMgODUgNDQgMTM1IDEyNSA1NCAKKzE4MyAyMyAxNjEgMTQ1IDE3MyAxMzYgMjkgNjIgNTAgMTMgNTcgMjUgMTI3IDE1MyA0NSA5NSA2NCAxMjEgNDAgMTIxIDE0MCAxNzEgOSAKKzcxIDE2NiA2OCAyOCAxMDIgNCA1MyAxMjMgMTExIDE0OCAyMCAxMDIgMTYwIDM0IDggMTM5IDMyIDExNiA2NiAxMyAxMTMgNjMgMTQzIAorOTcgNjMgMTAgNTkgMTI0IDY2IDQxIDEzMiA3MSAxMTUgMTA2IDE1MSA0NiAyMiA0NSAxMTggMzcgNjcgMTI0IDk0IDYwIDE0MCA0MyA0NyAKKzEwIDExMCA5IDEyNyA5NyA3IDE1NiA0MyAxODAgMTI1IDEyNiAxMzcgMTQ1IDEyIDIgODIgMTQ2IDEwMCAxMTcgMjYgNTkgMTgwIDE4MSAKKzE2NCA3NiA4OSAzMCAxMDEgNzcgNzIgMTI2IDExNCA5NSAxNDMgMTAyIDMyIDE0OSAxMzEgODMgMTU3IDMxIDYxIDEyMyAxMzkgNjAgCisxMzUgNzQgMTY5IDEyMiAxNTEgMTAyIDEzNyAxNjggNjIgNTUgMTY2IDExOSA5NyAxNjMgNjAgMTEyIDI0IDExNiAzOCAxNzggMTA1IDkxIAorMTM0IDg2IDI3IDQ3IDEzOCA3MiA3MCAxODMgNzkgMTUgODQgMTE3IDE1NCAxMjggNTcgNTMgMzkgMTYxIDg4IF4KKzM5MyAxIDkyIDcyIDE1MSAzMyAxODMgMTY0IDQyIDExMiAzMiAxMCA1IDkzIDk3IDE4IDExMiA3MSA5MiAxNjggMTE2IDE3OSAxODYgNjUgCisxMzcgNjggMTM0IDMgODIgOSAxOSAxMjEgMTQ4IDY1IDE2MCAxNzMgMTU4IDE2NyA5MCA2NiAxODAgMTcyIDk5IDg2IDgzIDg2IDI2IDE2IAorMTAgMTM1IDIzIDgxIDEzNyAxMjUgMTcgMTkgMjUgMTgzIDczIDcgMTA0IDE4NSA3OSAxNjUgMTE5IDExOSAxNzYgNTkgNzUgMTggNSA1OSAKKzEzMiAyNiAyMSAxMjcgMTE5IDgwIDk0IDgzIDUyIDYxIDI0IDQ0IDQgNTAgNTUgMTE1IDI5IDcwIDE0MCA5OSAxNTkgMTMwIDU0IDE1IAorNDIgODkgMTE0IDE3MyAyOCA1MCAxNiAzMyA1MyA0NyA1OCAxODAgMTkgNjQgNzggNDkgMzAgMTg2IDEwNCAzMiA0NCAxNTcgODUgMSAKKzE0OSA4NSA5NyAxMTQgNzcgNjMgNTggNTAgODkgODAgMjEgMzYgODQgNzIgNjAgMTUyIDI1IDg3IDEwOCAxNSAxMzggNTQgMTA2IDc3IAorOTcgMjMgNDIgNTUgMTQ5IDE4MSA2MiAxMDYgNDMgMTMyIDMxIDEzOCAxMTEgMTc2IDkzIDQwIDEwIDk2IDEyOCAxMDUgMTE0IDQzIDk4IAorNCAxNDYgMjAgMTA3IDEyMCAxNCAxMTMgMTgxIDEwMSAxIDE5IDE1NSAxMTMgNTcgNjQgMTE3IDEzMSA2IDIyIDE4NiAxMzggMTg0IDM2IAorNjEgMjkgMzYgMTc1IDEwNyA2IDYxIDgxIDExNCAyMCAxODAgNDIgMTY5IDEwMiAyNiA3MyA4MCAxNTEgMTUzIDY4IDQgMTEgOTggMTM5IAorNiAxNzUgMzQgMTQ2IDkzIDE1NCA4OCAxMjggMTM5IDc5IDM1IDIgMTM1IDExOSA0NiAxMjkgOTEgODYgMTc5IDUxIDE4IDE2OSAxNDEgCisxMDggNDkgMTAzIDQ2IDcyIDIxIDcwIDQ5IDY0IDE1MSA5NiAxODUgMTc1IDEzMCAxMTEgODUgNTggMzIgMTAxIDQwIDEwMSAxMzEgMTM2IAorMTM5IDE3MCA3MCAxMCAxNjkgMTc1IDczIDQxIDY5IDE3NyA0NSA0NyA5MiAxNDUgMTEgMTU1IDIyIDIyIDU2IDIxIDEzIDE2NiA0OCAyMSAKKzEwOSAxMzEgNDAgMTc0IDE3OCAxMDQgMTI4IDkgMTQ5IDUxIDEzMiAxMjIgMTczIDExOSAyMyAyNCA2NyAxMDkgNzQgMzIgMTU4IDExMCAKKzExNyA3NCAxMjMgNiAxMTggMTUxIDEzMCAxNTAgMTY3IDM0IDU1IDU4IDE0NiA1NCA3MiAxMTIgMTA1IDU3IDE2MCA4MiAxMjMgMTU5IAorMTUzIDE1OSAzOSAxOSA3IDggMzMgODcgMTIgNTAgMTQ2IDE1MCAzNyAxMDQgNzEgMTI2IDEzMyAxMDggMTQ1IDY4IDM4IDM4IDkwIDQzIAorNzUgMTQ4IDEyMiA0MyAyIDM5IDE1NCA1NCAxNjMgMTQ3IDExMyA5MSAyOSAxMDkgMzUgNzUgMTgyIDg3IDM1IDE1NSAxNzAgMTI3IDgwIAorMTg1IDExOCA2MCA5NSAxNDIgNzEgMTY1IDI4IDg0IDE2OCAyNSAxNDQgMTc4IDMxIDgxIDQxIDE2MCAyNSA1MyAxNDMgXgorMzgxIDEgMTQgMTcyIDE2MyAxMzAgNDUgNjkgNDYgMTQ1IDM2IDM2IDE1MSAxNjkgMTMgMTM1IDQyIDI2IDgxIDE1MyA3NiAxNDggMTc4IAorOTAgMTMxIDMwIDEwMSAxNjIgMTYxIDEzMiAxNDIgMTQgODkgMyAxNDEgMTc1IDE0NiA2NSAyNiA4OSA5NCA5OSAxODcgOCA1NSAxNjIgMiAKKzEzIDE0MyAxNzMgMiAxMjAgMTczIDQxIDEzMiAxNTAgMiAxMTIgNDIgMTggMTQwIDEzMCAzNyAxMjggMjMgMTA2IDE1OSAxMTggMTY3IAorMTUwIDEwMSAxMSAzMCAxMDkgMTUwIDE4NCAxMjQgMTkgMTY5IDczIDE2NSA1MyAxMDkgMTU4IDE3MiAxNDcgMTEgNDYgMzggMTQ5IDI1IAorMjEgOTIgMTg0IDY0IDE3OSAxNTggMTMzIDEzNSAzNCAzOCA1OCAxMTQgOSAxODMgNCAxMTggNzYgNDkgODkgMTAyIDQwIDE2MyA0NyA3NSAKKzgwIDE3NiAxNzUgOCAxNTQgMTQgMTgwIDEwNCAxNTMgODQgODkgMTEgMTI5IDggMTM4IDg1IDE4MSA3MyA2NiAxNTQgMTIxIDIwIDExNSAKKzkzIDExNCAxMDggODIgMTgyIDE5IDg2IDEwMyAxNzYgMTgzIDE4NiAxNzcgNTMgMTAgNjkgMTM3IDU2IDEgMTM1IDE0MSA2OCA2OSA1NCAKKzg2IDEyIDc1IDE3MSA4NyAxODcgMTA3IDE0NCAxNTAgOTMgMjMgNyA3MCA4MyAyOSAxNDAgNjcgMTM5IDE1MyAxODMgMTc4IDE4OSAzMCAKKzE4IDIgMjkgNzIgMjkgMzMgMTYwIDU2IDkgMTIzIDE2NCAxMDcgMTM2IDE5IDcwIDMxIDE3NyAxNTIgOTkgNTcgMzggNjYgNTUgMzIgMzIgCisyNCA4MyA2MCAyMSAxIDM2IDUyIDgwIDE2OCA0NCAzMiAxMTUgMTg0IDI1IDEyMCAxODEgMTcyIDE1NSAxODkgMjIgMzAgMjYgMTgwIDUgCis2NCA0OSAxODggMSAyOCAxMTEgNTcgMTc2IDE2NyA2NyAxMzEgMjIgMTYwIDE4NiAxNjkgNjUgMzQgMzAgMTE3IDkxIDE3IDE2MyAzOSAKKzEzNCA1NyAxMzcgMTU1IDkwIDE3MCA0MiA3OCAxNzAgMTQxIDE2NyAxNTggNDIgMTc3IDIyIDEyOSA2OCAxNjggMTQzIDc0IDE1MCA4NSAKKzgyIDE3NCA3OCA2MyAxMTEgMTU2IDI4IDEyIDE1OCAxNDEgNzYgNTcgNzcgMTI1IDc5IDQwIDEyIDU5IDUyIDg4IDE1NiAyMCAyNCAxODIgCisxNDkgNTYgOTIgNDYgMTA2IDE2NyA1OSAxODkgMTIxIDExOSAxNCA4MSAxNSAxNjUgMTM2IDc5IDEwMCA0MiAxMTcgMTgyIDExOCAxNzUgCisxMzggMTI0IDMgNTAgNzQgMTM0IDE1NiAzNiAxNDMgMTgxIDE4MCA5NiAyMiA2MSA5NyAxMzQgMTY0IDI0IDE2NiAzMCAxMCA2MSA2IDMzIAorOSAxMTUgMTc2IDg0IDk3IDE0MiAxNTIgMTUgNTAgMTY1IDQ1IDE2OCAxMzUgMTMzIDEyNyA5MyAxNSA2NiA5NCA5MSA5IDMyIDE2IDk1IAorMzcgMjkgMTcxIDExOCA2OCAxMDggNjYgNjMgMjAgNTUgMTg2IF4KKzM5NiAxIDk3IDEwIDUgMTYwIDEzMiAxOCA4MyA3MyAxNTkgMTQxIDU1IDEyMCAzMSAxMzEgMTQxIDEwMiAxMzggMyA1MiA5IDE0OCAxODkgCis1NiA5OSAxNjUgMTQ2IDIgMTQwIDY0IDE1NyAxMDAgMTIxIDExMyAxMDIgMjQgMjEgMjQgMTIzIDE2IDEwIDEzOSAxNTIgMTkgMTA5IAorMTQ2IDExNiAxMjIgOTIgNDMgNyA3NSA2MiA0OSAxNzAgNTggMjYgMTE3IDEyNSA0NSAxNDcgNSAxMjUgMTM2IDE1NSAxMTggMiAyNiA1MCAKKzE2MSAyMSAxODIgMTI3IDE1MyA0NSA2OCAxOSAxMjEgMjIgOTQgMTA0IDE0NCAxNjYgMzUgMTY2IDIzIDE3NiA3NSAxODggNTMgMTE0IAorOTMgMTQ4IDE3NyA2NiAxNTEgMTYgMTU2IDEyMSAxODAgOTggNDggMTc5IDk1IDYzIDEwNyA5NyA0NSAxIDIzIDk3IDU3IDIzIDEzMiA1MyAKKzc5IDk3IDEyNCAxOSAxODggMTggMTE4IDM3IDIyIDEwNiA5NCA2MCAxMjIgMjUgNDcgMTc2IDExMCAxODQgMTA5IDc5IDE2NCAxMjAgNDMgCisxNTMgODkgOTAgMTI4IDEwOSAxMiAxNjggNjQgMTEwIDgyIDExNyAxOTIgNDEgMTcxIDE2MyAxNjQgNzYgNTMgMTIgMTAxIDY4IDU0IAorMTE3IDc4IDU5IDE0MyA4NCAzMiAxMjIgMTA0IDY1IDE0OCAzMSA1MiAxMjMgMTMwIDI0IDEzNSAzOCAxNTEgOTUgMTQyIDkzIDEwMSAKKzE1OSA2MiAzNyAxNDggMTEwIDcwIDEyNyA1MSA4NSAxODEgODkgMTEgMTQyIDEwNSA5MSAxMDcgNTAgMjcgMjkgMTAyIDM2IDQzIDE2NSAKKzc5IDYgODQgOTkgMTE4IDEyOCAzMCAyNiAzIDE0MyAxNyA2OCA2NiAxMzkgMTg3IDE1IDE2NSAxNTggMjQgODggMjAgMTc5IDE3NCA4MSAKKzc5IDE4IDEwNiA0NyA3NCAxNTAgMTA0IDE3OSAxNjIgNTkgMTMxIDYyIDExNiAxNjYgODIgMTg0IDE4OCA5NyAxMzYgNDEgMTM2IDE2NyAKKzE0MCAxNDMgMTc1IDcyIDQyIDE3NCAxNDggNzUgNzQgNzEgODYgMTQgMTYgMTkxIDExNyAxMSA2MyAxMTkgMTE5IDE4NiAxODIgMTMgCisxNzEgNDkgMTgyIDgwIDE2NyA3MyAxNDcgMTE5IDEwNyAxNjQgNDEgNTcgMTgxIDE2OCAyOSAxMTQgMjYgMTg0IDEyMSAxMDEgODAgNzYgCis2NSAzNCA0OSAyNCA0NCAxOTEgMzggMjUgOTEgNSA1OCAxNDAgOTkgMTUzIDEyNCA1NCAxODQgNDIgODMgMTA4IDE1NSA0IDIwIDE5MSAzIAorMjkgMzUgNDAgMTgwIDcgNDAgNjYgMjUgMTIgMTgwIDg2IDI2IDM4IDEzOSA3MyAxIDEzNyA3OSA4NSAxMDIgNzEgMzkgMjggNDQgNzcgCis1NiAxOTAgMTIgNjYgNzIgMzAgMTUyIDcgODcgODQgMTkwIDEyNiA0OCAxMDAgNzcgOTEgMTg2IDM2IDMxIDE0MyAxNjMgNTAgOTQgMjUgCisxMjYgMSAxMTQgMTA1IDE3MCA5MyAyMiAxNzMgOTAgMTE2IDg3IDk2IDE5IDc0IDQgMTIyIDE4MyA4MyAxMjAgMTc3IDExMyAxNjkgMTgxIAorNzcgMTgyIDEgMTQ5IDE4NiBeCiszODQgMSAyNSA1NiA4NSAxMDcgMTc3IDYgMTg2IDEzOCAxODQgMjggNjEgMTg0IDE5MSAxNzUgMTA3IDYgMjkgODEgMTE0IDEyIDE1NiAyIAorMTM3IDg2IDE4OSA3MyA2NCAxMjcgMTI5IDQ0IDE2NyAxMSA5OCAxMDcgMTY5IDE0MyAyNiAxNDYgNjEgMTMwIDg4IDEyMCAxMzkgNTUgMyAKKzE4OSAxMTkgODcgMjIgMTA1IDY3IDc4IDE0NyA1MSAyIDE2MSAxMDkgODQgNDkgODcgMzggNDggMTkyIDYyIDI1IDY0IDE0MyA3MiAxNjkgCisxNTEgMTA2IDExMSA1MyA1OCA4IDkzIDggODUgMTIzIDEyMCAxMzEgMTcwIDM4IDIgMTY5IDE2NyA0OSA0MSAzNyAxNTMgMjEgMzkgOTIgCisxNDUgMTkwIDE1NSAxNzcgMTg1IDQ4IDEzIDUgMTUwIDQ4IDIxIDg1IDExNSA0MCAxNjYgMTc4IDg4IDEwNCAxIDEyNSAxOSAxMTYgMTA2IAorMTQxIDExMSAyMyA0MyAxMDEgNTggMTg3IDE1MCA3OCAxMDEgNTAgMTA3IDE4NSA4NiAxNTEgMTMwIDEzNCAxNDMgMzQgMzEgMjYgMTIyIAorMzggNDAgMTEyIDk3IDMzIDEzNiA1MCA5OSAxMjcgMTIxIDE1OSA3IDE5IDE3MCAxODcgMSA3OSAxOTEgMjYgMTMwIDExOCA1IDEwNCA0NyAKKzEyNiAxMDkgOTIgMTI5IDUyIDMwIDE5MyA5MCAzNSA2NyAxMTYgOTAgMyAxODEgMzkgMTIyIDMwIDE1NSAxNDcgMTA1IDgzIDIxIDc3IAorMzUgNzUgMTc0IDU1IDE5MCAxMzEgMTU0IDk1IDcyIDE4NSA5NCAzNiA5NSAxMjYgNzEgMTQ5IDQgNjggMTUyIDE4MCAxNDQgMTQ2IDcgCis0OSAzMyAxNTIgMTg4IDI5IDExMSAxOTQgMTcyIDE0OCAxMjUgMzUgNTkgMzYgMTI1IDExIDM2IDE0MSAxNDkgMTgzIDEyNSAyNyAxIDcxIAorMTMzIDYxIDEzOCAxNjggODUgMTMxIDUgOTYgMTYyIDE2MSAxMTcgMTQyIDE0IDc5IDE4MyAxNDEgMTY1IDEyNiA1NSAxMSA3NCA4NCA3OSAKKzE2NyAzIDQwIDE0MiAxNzcgMTkzIDEyOCAxNzMgMTkyIDEwMCAxNjMgMTYgMTI3IDE0NSAxODIgOTcgMTcgMTkzIDEyMCAxMTUgMzIgCisxMDggMTggOTYgMTU0IDEwMyAxNTIgMTUwIDg2IDE4MSAxNSA5OSAxMzUgMTc5IDEyNCAxOTQgMTY0IDY4IDE2MCA0MyAxMDkgMTM4IAorMTUyIDE0MiA2IDIxIDIzIDE0OSAyMCAxMSA4MiAxNjQgNDQgMTU5IDE0OCAxMzMgMTE1IDI0IDI4IDUzIDEwNCA5IDE4MyAxNzkgMTA4IAorNTYgMzkgODQgODcgMzAgMTYzIDMyIDcwIDc1IDE2NiAxNzAgOCAxMzkgOSAxNzUgOTkgMTQzIDY0IDg5IDE4NiAxMTQgMTgzIDEzMyA4NSAKKzE2MSA2MyA2MSAxNTQgMTExIDE1IDExNSA3OCAxMDkgMTA4IDcyIDE3NyAxNCA3MSAxMDMgMTc2IDE3MyAxNzYgMTU3IDM4IDEwIDU0IAorMTMyIDQxIDE4NiAxMzAgMTI2IDYzIDY5IDM5IDc2IDcgNjUgMTcxIDgyIDE3MiAxMDIgMTI0IDE0MCA4MyAxMTMgXgorMzk2IDEgMTg5IDcwIDgzIDI5IDEzMiA2NyAxMTUgMTQ1IDE1MSAxNzAgMTgxIDE0IDE5MiAyIDE4NyA0MCA1IDMzIDE2MCA0OCAxODMgCis5MSAxMzIgODMgMTEyIDE3NyA2MiAxODkgMTUzIDEyOCA5MSA0OSAzOCA1MCA1NSAyNCA4IDggNTEgMzYgMTMgMTc1IDI4IDM2IDU2IAorMTYwIDEyIDEwNyAxNjggMjUgMTA0IDE1NyAxNTYgMTM5IDE2NSAxNCAzMCAxOTIgMTY0IDE5NSA1NiA0MSAxODAgMTU5IDI4IDc5IDQxIAorMTQ0IDE2NyA1MSAxMTUgMTg4IDEzNiAxNTQgMTQ1IDY1IDIgMjIgOTMgODMgMTkxIDE0NyAyMyAxMTAgNTcgMTM3IDEzMSA2NiAxMzggCisyNiA3OCAxNDYgMTI1IDE1OSAxNTAgMzQgMTc3IDIyIDEyOSA2OCAxNjggMTExIDc0IDExOCA3NyA1MCAxNzQgNTQgNDcgODcgMTQwIDIwIAorMTc4IDE1OCAxMzMgNjAgMzMgNDUgOTMgNDcgOCAxNzAgNTkgNTIgNTYgMTI0IDIwIDE2IDE1MCAxMTcgMjQgODQgNDYgMTA2IDE1MSA1MSAKKzE1OCAxNzMgMTEzIDExMSAxOTYgNzMgMTUgMTMzIDEzNiA3MSAxMDAgMTAgODUgMTgyIDExMCAxNDMgMTE0IDkyIDE4NSA0MiA0MiAxMTggCisxNTYgMjAgMTM1IDE3MyAxNTYgOTYgMTgwIDM3IDczIDEzNCAxNTYgMTgyIDE1MCAxOTYgMTkyIDQ1IDE3MiAxNyAxNjcgOTEgMTY4IDY4IAorODkgMTM0IDEyMCAxOTAgMTczIDM0IDE0MSAzNyAxNTIgMTExIDExNyAxMDMgNjEgNyAzNCA2MiA2NyAxOTEgMTkwIDggODcgMjEgMTk1IAorMTM5IDg2IDQ0IDc2IDY2IDU1IDE4NiAyMyAzMSA4NyAxODMgNSAxNTUgMTIyIDE5MSA2OCA1MyAxNDkgMTM2IDM1IDExNSAyNiAxMjEgCisxMzEgMTAyIDEyMyAzIDQyIDE5NyAxMzMgMTc5IDU2IDg0IDE2NSAxMzYgMTkwIDEzMCA0OSAxNTcgODAgMTAxIDEwMyA5NyAxOTcgMTEgCisxOSAxMTggMSA1IDExOSAxMzcgOSAxMDQgMTkzIDE0MSAxMTYgMTIyIDcyIDM4IDcgNzAgNDcgNDQgMTU1IDQzIDE2IDEwNyAxMjUgNDAgCisxMjcgMTkzIDEwNSAxMzEgMTQ1IDEwOCAxODUgNiA1MCAxNDEgMSAxNjcgMTI3IDE1MyA0NSA1MyAxOTIgMTIxIDEyIDc5IDg0IDEyOSAKKzE1MSAxNSAxNjYgMTk2IDE1NiA2MCAxODggNTMgMTA5IDgzIDE0OCAxNjIgNDYgMTQ2IDYgMTM2IDExMSAxNjAgODggMzggMTY5IDg1IAorNjMgODcgOTcgMzUgMTk0IDMgODIgNTIgMTMgMTMyIDQzIDU5IDkyIDEwOSA0IDE3OCAzIDExOCAzNyAxOTUgOTYgOTQgNjAgMTEyIDE1IAorNDcgMTY2IDExMCAxNzkgOTkgNjkgMTQ5IDEwMCA0MyAxMzggNjkgNzAgMTIzIDg5IDEyIDE1OCA1NCA5MCA3MiAxMTcgMTgyIDMxIDE2NiAKKzE1MyAxNjQgNzYgMzMgMiAxMDEgNjMgNDQgMTEyIDU4IDM5IDE0MyA3NCAzMiAxMDcgODkgNTUgMTQzIDMxIDQ3IDEyMyAxMjUgNCAxMzUgCisxOCAxNDEgODAgMTM3IDg4IDgxIDE1NCAxODcgXgorNDA2IDAgMjMgMTM0IDEwMyA0OSA5OSA0NCA2NCAxNjAgNjggMTkwIDExNCAxMDUgOTEgODYgMjIgMjcgMTUgNzQgOCAyMiAxNTEgNzkgCisxOTkgODQgODUgOTAgMTI4IDkgNSAxNzUgMTI5IDE3IDQwIDU5IDEyNSAxODcgMTk0IDE0NCAxNTEgMyA2MCA2IDE1OCAxNTMgNjcgNTggCisxOCA5OSAxOSA1MyAxMjkgOTAgMTc5IDEzNCA1MiAxMjQgNTUgOTUgMTM4IDgyIDE3MCAxNjcgNjkgMTIyIDEzIDEwOCAxNjAgMTE5IAorMTE1IDE2MSA1MSAxNCAxNjcgMTIwIDQ3IDYwIDU3IDg2IDE2IDE4NCA5NiAxOTcgNDIgOTggMTEyIDE2NSAxNTQgMTk5IDE1NyAyMSAKKzE2OCA1MiAxNDYgNjYgMTI2IDExOSA5MyAxNTAgMjAgMzYgMTUzIDE0MCAxOTQgOTMgMjYgMTU2IDExNCA4MCA4MCA1NSA0NCAxMyAzNSAKKzI0IDQ0IDE5MSAyNCAxOTAgNjMgMTc3IDQ0IDE0MCA5OSAxNDYgMTE3IDU0IDE2MyA0MiA3NiAxMDEgMTM0IDE3NiAxODUgMTc3IDE2OCAKKzEgMjEgMTkgMTgwIDE5MyAxMiA1MiAxOTcgMTkxIDE3MyA2NSAxOSAzMSAxMTggNTkgMSAxMjMgNzIgNzEgODggNjQgMTEgMTkzIDM3IAorNjMgMjggMTY5IDE4NCA0NSA3MiAxOTUgMTUyIDE4NiA4NyA1NiAxNzYgMTEyIDQxIDkzIDc3IDg0IDE1OCAyOSAzIDEzNiAxNDIgMzYgCis4MCA0IDExOSAxNjYgODYgOTggMTYzIDkzIDEgMTQ1IDgzIDEwMiA2NiA3NSAxOTEgNDYgNCA5NCAxNTUgNTUgMTIwIDE0OSAxMTMgMTQ4IAorMTgxIDQ5IDE3NSAxODAgMTQyIDg3IDUgNTEgNjUgOTIgMTY3IDE5NiAxODYgMTM4IDE4NCAyMyA2MSAxNjQgMTcxIDE3NSAxMDcgNiA5IAorODEgMTE0IDcgMTQxIDE3NyAxMTcgNzYgMTc0IDczIDU0IDExMiAxMTQgMjkgMTUyIDExIDk4IDg3IDE1NCAxMjMgMjEgMTQ2IDQxIDExNSAKKzg4IDExNSAxMzkgNDAgMTgzIDE4OSAxMDkgNjcgNyA5MCA1MiA3MyAxMjcgNTEgMTkyIDE1NiA4OSA2OSA0OSA3NyAzMyAzMyAxODIgNTcgCisxMCA2NCAxMzggNTcgMTU5IDEzNiA5MSAxMTEgMzMgNTggMTkzIDg4IDE4OCA3NSAxMTggMTEwIDEyNiAxNzAgMTggMTk3IDE2OSAxNjIgCiszNCA0MSAxNyAxMzggNiAzNCA5MiAxNDUgMTg1IDE1NSAxNTcgMTcwIDQzIDggMTQwIDQ4IDIxIDcwIDEwNSA0MCAxNjEgMTc4IDc4IDg5IAorMTk2IDExMCAxOTkgMTA2IDk2IDEyMSAxMDYgMjMgMTg1IDI4IDk2IDQ4IDE2NyAxNDUgNTggOTEgMzUgOTcgMTgwIDY2IDE1MSAxMzAgCisxMjQgMTI4IDM0IDE2IDYgMTA3IDI4IDIwIDExMiA5MiAxOCAxMjEgMzAgODQgMTA3IDEwMSAxNTkgMTg3IDE5IDE1NSAxODIgMTgxIDc0IAorMTg2IDExIDEyMCA5OCAxODUgMTA0IDMyIDEyNiA5NCA4MiAxMTkgNDIgMjUgMTczIDkwIDMwIDYyIDk2IDcwIDE3OCAxNzYgMzkgMTAyIAorMTUgMTUwIDE0NyAxMDAgNzggMTYgNTcgMzUgNzUgMTY5IDM1IDE3MCAxMTYgMTQ0IDc1IDE0NiBeCis0MDkgMSAxODUgNzAgMTIgOTUgMTEwIDcxIDEzMyAxODMgNTIgMTM2IDE0OCAxNDQgMTE0IDE4NiAxNyAyNSAxNDQgMTY0IDUgNzkgMTc4IAorMTcyIDEyNCAxMTcgMTkgNDMgMjAgOTMgMTc0IDM2IDEyNSAxMTcgMTUxIDEwOSAzIDE2NCA1NSAxMDEgMzcgMTIyIDE1MiA3NyAxMzEgCisxNjggODggMTYyIDE2MSA5MyAxNDIgMTQgNjMgMTY3IDE0MSAxNDkgOTQgMzkgMTkwIDUwIDY4IDQ3IDEzNSAxOTggMTYgMTEwIDE1MyAKKzE3NyAxMDQgMTczIDE5MiA2OCAxNDcgMTc5IDExOSAxMzcgMTY2IDczIDE4MCAxNjkgODggOTEgMjQgNzYgMTAgODAgMTQ2IDc5IDEyOCAKKzE1MCA2MiAxNDkgMTk0IDgzIDExMSAxNzEgMTI0IDE3MCAxNTYgNjAgMTUyIDI3IDEwOSAxMDYgMTIwIDEzNCAyMDEgMTg0IDIwMiAxNDkgCisxMiAxOTggNjYgMTMyIDEyIDEyNyAxMzIgMTMzIDgzIDggMTIgNDUgODggOSAxODMgMTU1IDkyIDI0IDIzIDc2IDYzIDE0IDE2MyA4IDYyIAorNjcgMTUwIDE2MiA4IDExNSAxIDE2NyA5MSAxMjcgMzIgODkgMTYyIDkwIDE1OSAxMjUgODUgMTI5IDQ3IDUzIDE1NCA5NSA3IDExNSA1NCAKKzEwMSAxMDggNTYgMTY5IDYgNDcgMTAzIDE3NiAxNTcgMTYwIDEyNSAxNCAxMCAzMCAxMjQgMTcgMTc4IDEyMiAxMDIgNTUgNjkgMTUgNjAgCisyMDIgNDkgMTcxIDc0IDE0OCA5NCA5MiAxMjQgNjcgMjAwIDE4NCA3MCA4MyAyOSAxMjcgNjcgMTAwIDE0MCAxMzEgMTY1IDE3NiA0IAorMTgyIDIgMTY3IDIwIDE5MyAzMyAxNjAgNDMgMTczIDcxIDExMiA2OCA5NyAxNTcgNTcgMTY5IDEzOCAxMTMgODYgNDQgMzggNDAgNTUgCisxOSAxOTYgMjAxIDMxIDIxIDggMTY1IDIzIDI2IDQxIDE1NSAxOTUgMTgzIDEwMiAxNTggMjUgOTQgMTQyIDE0NiAxMjkgMTUwIDkgMzAgCisxNzcgMTU0IDE5NSA1MSAzNiAxNzUgMTM5IDI4IDU5IDMxIDEyNCAxNjcgNDEgMTA1IDE3MyAxMjEgMTM0IDEzMCA2NSAxODUgMTcgNzggCis3OCAxODEgMTM3IDEzIDk1IDU3IDEzNyAxMTYgNTEgMTE4IDE2IDc4IDEzMSAxMTUgMTU0IDE0NSAyOSAxNzcgMjIgMTI5IDY4IDE2OCAKKzkxIDc0IDk4IDcyIDMwIDE3NCAzOSAzNyA3MiAxMzAgMTUgMTYzIDE1OCAxMjggNTAgMTggMjUgNzMgMjcgMTkxIDE1MCA1OSA1MiAzNiAKKzEwNCAyMCAxMSAxMzAgOTcgNCA3OSA0NiAxMDYgMTQxIDQ2IDEzOCAxNjMgMTA4IDEwNiAxOTEgNjggMTUgMTEzIDEzNiA2NiAxMDAgCisxOTMgNjUgMTgyIDEwNSAxMjMgOTkgNzIgMTgwIDM3IDIyIDEwOCAxNTYgMTAgMTMwIDE2OCAxNDEgOTYgMTYwIDIyIDU4IDEzNCAxNTEgCisxNjIgMTQwIDE4MSAxODcgMzUgMTU3IDcgMTQ3IDc2IDE2MyA1OCA4NCAxMjkgMTAwIDE5MCAxNTMgMjQgMTI2IDMyIDE0MiA5NiAxMDcgCis4OCA0MSAyIDE0IDQyIDUyIDE4NiAxNzAgMyA4MiAxMSAxODAgMTE5IDY2IDI5IDU2IDY2IDUwIDE3MSAzIDExIDc3IDE2MyA1IDE1MCAKKzExMiAxMjggXgorNDEzIDEgNDcgMjUgMTM1IDEyOSA3IDEwOCAxOSAxMDcgMTE3IDEwMiAxMDIgMyAyOCAxOTAgMTEyIDE2NSA1NiA2MyAxNjUgMTIyIDE4MyAKKzExNiAyOCAxNTcgNTIgNzMgODkgOTAgMTY5IDIwMiAxMiAxMTEgMTg1IDIwMyA5MSAxMTYgMjAwIDk3IDE5MyAxMzQgMTE2IDEyMiA0NCAKKzMxIDcgNjMgMjYgMzcgMTM0IDIyIDIgOTMgMTI1IDMzIDk5IDE4NiA3NyAxMjQgMTMxIDk0IDE3MSAxODMgNTAgMTEzIDE3OCAxNDYgCisxMjcgMTUzIDQ1IDMyIDE2NCAxMjEgMjAzIDU4IDU2IDEwOCAxMzAgMTkyIDE2NiAxNjggMTI4IDM5IDE4OCA1MyAxMDIgNjkgMTQ4IAorMTQxIDE4IDEzOSAxOTcgMTA4IDk3IDEzMiA3NCAyNCAxNTUgNzEgNjMgNTkgOTcgMjEgMTk0IDE4MCA2MSA0NSAyMDQgMTMyIDI5IDMxIAorODUgODggMTg4IDE2NCAxODcgMTE4IDM3IDE2NyA4MiA5NCA2MCA5OCAxIDQ3IDE1MiAxMTAgMTcyIDg1IDU1IDEyOCA3MiA0MyAxMTcgCis0MSA0MiAxMTYgNjEgMTIgMTQ0IDQwIDYyIDU4IDExNyAxNjggMTcgMTU5IDEzOSAxNjQgNzYgNSAxOTMgMTAxIDU2IDMwIDEwNSAzMCAKKzExIDE0MyA2MCAzMiA4NiA2OCA0MSAxMzYgMzEgNDAgMTIzIDExOCAxODEgMTM1IDE5NSAxMjcgNTkgMTMwIDgxIDUzIDE0NyA2MiAxMyAKKzEyNCA5OCAzNCA3OSAzOSA0OSAxNDUgNTMgMTgwIDk0IDEwNSA5MSA3MSAyIDI3IDUgNTQgMTkzIDcgMTQxIDc5IDE5OSA4NCA3NSA3MCAKKzEyOCAxOTkgMTk1IDE2MCAxMTkgMTcgMjAgNTQgMTE1IDE4NyAxODQgMTI5IDE0NiAxOTMgNDAgMjAxIDE0MyAxMzggNTcgNDMgMTggOTQgCisyMDQgMzggMTE0IDgwIDE3OSAxMTQgNDcgMTE5IDUwIDgwIDExOCA4MiAxNjAgMTUyIDQ5IDExMiAxOTggODggMTU1IDEwNCA5NSAxNTEgCiszNiAxOTkgMTYyIDEwMCAyNyA1MCA0NyA4NiAxOTUgMTYgMTc5IDgxIDE5MiAyNyA4MyAxMDcgMTUwIDEzNCAxOTQgMTQ3IDEgMTU4IDMyIAorMTMxIDYxIDExMSAxMTkgODMgMTQwIDUgMjEgMTMzIDEyMCAxNzQgNzggMjYgMTM2IDEwOSA2NSA4MCA0MCAyOSAyMDMgMjUgMjQgNDQgCisxOTEgMTQgMTcwIDQzIDE2MiAzNCAxNDAgOTkgMTQxIDExMiA1NCAxNDggNDIgNzEgOTYgMTE5IDE2MSAxNjUgMTY3IDE0OCAxODYgMTEgCis0IDE4MCAxODggMTk3IDQyIDE4MiAxODEgMTY4IDUwIDE0IDI2IDEwMyA0OSAxIDExMyA2NyA2MSA3OCA1OSAxOTYgMTczIDMyIDUzIDggCisxNTQgMTY5IDMwIDcyIDE3NSAxNTIgMTc2IDg3IDM2IDE2NiAxMDIgMzYgODggNzcgNzkgMTM4IDI0IDE4OCAxMzEgMTI3IDI2IDcwIAorMTk0IDExNCAxNDYgNjYgOTMgMTU4IDkzIDE5MSAxMjUgNzggOTIgNTEgNjAgMTc2IDI2IDQgNzQgMTM1IDM1IDEyMCAxMjkgMTEzIDEzMyAKKzE4MSAyOSAxNzAgMTcwIDEzNyA3NyAxOTAgNDYgNDUgNzcgMTU3IDE5MSAxODYgMTM4IDE4NCAxOCA2MSAxNDQgMTUxIDE3NSAxMDcgNiAKKzE5NCA4MSAxMTQgMiAxMjYgMTEwIF4KKzQyNyAxIDg1IDYwIDE1MCA3MyAzOCA4OCA5MCA1IDEyOCAxMSA5OCA1NSAxMzAgOTEgMTMgMTQ2IDkgOTEgODggMTA3IDEzOSAxNiAxNTkgCisxODkgOTMgMzUgMTkxIDY2IDI4IDY1IDk1IDUxIDE4NCAxNDggNTcgNDUgNDkgNjEgMjUgOSAxNjYgNDkgMTk0IDY0IDEzMCAzMyAxNDMgCisxMTIgNjcgMTExIDEgNTggMTc3IDgwIDE2NCA1OSAxMTAgOTQgMTE4IDE3MCAxOTQgMTk3IDE2OSAxNTQgMTAgNDEgMTkzIDExNCAxOTAgCisyNiA5MiAxNDUgMTc3IDE1NSAxMjUgMTQ2IDM1IDIwMCAxMjQgNDggMjEgNDYgODkgNDAgMTUzIDE3OCA2MiA2NSAxOTYgODYgMTc1IDkwIAorODAgODkgOTggMjMgMTY5IDQgODggMzIgMTM1IDEzNyAyNiA3NSAxMSA4MSAxNzIgMzQgMTUxIDEzMCAxMDggMTA0IDM0IDIwMCAxODIgCis4MyAxMiAxOTYgMTEyIDg0IDIwMiA5NyAyMDYgNjAgNzUgNjkgMTU5IDE2MyAxOSAxMzEgMTc0IDE1NyA2NiAxNzggMTk1IDEwNCA2NiAKKzE2MSAxMDQgOCAxMjYgNzAgNjYgMTAzIDI2IDE3IDE0MSA5MCAyMiA1NCA2NCAzOCAxNDYgMTY4IDM5IDcwIDE5OSAxNDIgMTQ3IDkyIAorNzAgOCAyNSAzNSA3NSAxNjEgMyAxMzggOTIgMTI4IDQzIDU5IDE4NSA1NSAyMDUgOTUgMTAwIDcxIDEyMyAxNzMgNDIgMTI2IDEyOCAKKzE0NCA5NCAxNzYgMjA1IDIwIDEzOSAxNDkgMTk4IDU5IDE2OCAxNzIgMTA5IDExMiA5IDMzIDEwIDczIDE1NCAzNiAxMTUgOTcgMTMxIAorOTkgMTk2IDE0NCA0NSA4MSAyMiAxMTIgMTQyIDcyIDEzMSAxNDggODMgMTYyIDE2MSA3OCAxNDIgMTQgNTMgMTU3IDE0MSAxMzkgNzQgCisyOSAxODAgMzUgNTggMjcgMTE1IDE5OCAxIDkwIDEzOCAxNjcgODkgMTczIDE5MiA0OCAxMzcgMTU5IDExNCAxMzIgMTU2IDU4IDE2MCAKKzE1NCA2OCA3NiAxOSA1NiA1IDcwIDE0MSA2NCAxMTMgMTUwIDQ3IDEyOSAxODQgNzMgOTYgMTY2IDEyNCAxNTUgMTUxIDU1IDE0NyAxNyAKKzEwOSA4NiAxMDAgMTI5IDIwMSAxNjQgMTkyIDE0OSA3IDE5MyA1NiAxMTIgMjAwIDEwNyAxMjIgMTMzIDYzIDIwNiAyIDQwIDc4IDkgCisxODMgMTQwIDgyIDQgMTMgNzEgNDggNCAxNjMgMjAxIDU3IDYyIDE0MCAxNTcgOCAxMDAgMjA0IDE2MiA4NiAxMTcgMTIgODkgMTQ3IDc1IAorMTQ0IDEyMCA4NSAxMDkgMzcgNDggMTU0IDg1IDIgMTE1IDM5IDk2IDEwOCA0NiAxNjQgMSAzMiAxMDMgMTc2IDE0NyAxNTAgMTA1IDIwNyAKKzEwIDE1IDExOSAyIDE3MyAxMTcgODcgNTAgNjkgNTAgMjAyIDM5IDE3MSA2OSAxMzMgODkgNzIgMTE0IDU3IDE5NSAxNzkgNzAgODMgMjkgCisxMjIgNjcgODUgMTM1IDExMSAxNjAgMTcxIDIwMiAxNzIgMiAxNDcgMTgzIDMzIDE2MCAzOCAxNjMgNTEgOTIgNTMgODIgMTM3IDUyIAorMTQ5IDEyMyA5OCA4MSAzOSAzOCAzMCA1NSAxNCAxODYgMTk2IDExIDYgMyAxNTUgMTggMTYgMjYgMTUwIDE4MCAxNjggOTcgMTQ4IDI1IAorODQgMTI3IDEzNiAxMTkgMTM1IDQgMzAgMTYyIDE0NCAxOTUgNDYgMzEgMTcwIDExOSAyOCAxOTAgXgorNDQzIDEgMTcgOTYgMTY3IDI3IDkxIDE1MiAxMDAgMTA2IDEwOSA2NSAxNjQgMTAgNTcgNzEgMTY3IDEyMyAyMDkgNzQgNTcgMTM3IDk1IAorMzAgOTAgMiA3OCAxMTAgMTAxIDE0NyAxMzggMjIgMTc3IDIyIDEyOSA2OCAxNjggNjMgNzQgNzAgNjUgMiAxNzQgMTggMjMgNTEgMTE2IAorOCAxNDIgMTU4IDEyMSAzNiAyMDcgMjA3IDQ1IDIwOSAxNzAgMTIyIDU5IDUyIDggNzYgMjAgNCAxMDIgNjkgMTg2IDcyIDQ2IDEwNiAKKzEyNyAzOSAxMTAgMTQ5IDEwMSA5OSAxODQgNjEgMTUgODUgMTM2IDU5IDEwMCAxNzIgMzcgMTgyIDk4IDk1IDc4IDQ0IDE3MyAzMCAyMDQgCis5NCAxNTYgMjA2IDEyMyAxNjEgMTIwIDk2IDEzMiAxIDM3IDEzNCAxNDQgMTM0IDEyNiAxNjAgMTgwIDIxIDEzNiAyMDMgMTE5IDU1IAorMTU2IDQ0IDc3IDEyMiA3MiAxOTAgMTI1IDEwIDEwNSAyNSAxMjggNzUgOTMgNjcgMTMgMjA1IDE5NiAxNCAzMSAxNzkgMTQyIDIwNiA3NSAKKzIwNyAxNTkgOTEgMzggOCAyOCA2NiA0MyAxNTAgMTg1IDE5MyA2MyAxMzUgNSAxNDMgOTggMTQzIDMyIDUgMTI1IDEyNCAxOTcgMTAzIAorMTQgOTcgMTA3IDEwMiA4NyAzIDE4IDE4NSA5NyAxNTUgNTYgNDggMTY1IDExMiAxNzggMTA2IDEzIDE1NyAzMiA1MyA3OSA4NSAxNDkgCisxOTcgNyAxMDYgMTc1IDIwMyA3MSAxMDEgMTk1IDkyIDE5MyAxMjkgMTE2IDEyMiAyNCAyNiA3IDU4IDExIDMyIDExOSA3IDIwMiA4MyAKKzEyNSAyOCA3OSAxODEgNTcgMTE5IDEyMSA4NCAxNjEgMTY4IDUwIDkzIDE2MyAxMzEgMTI3IDE1MyA0NSAxNyAxNDQgMTIxIDE5OCA0MyAKKzM2IDkzIDExNSAxNzcgMTY2IDE0OCAxMDggMjQgMTg4IDUzIDk3IDU5IDE0OCAxMjYgMjA4IDEzNCAxOTIgODggODcgMTEyIDY0IDE0IAorMTQ1IDYxIDYzIDM5IDk3IDExIDE5NCAxNjUgNDYgNDAgMTk5IDEzMiAxOSAxMSA4MCA3MyAxNzggMTU0IDE3NyAxMTggMzcgMTQ3IDcyIAorOTQgNjAgODggMjAxIDQ3IDE0MiAxMTAgMTY3IDc1IDQ1IDExMyA1MiA0MyAxMDIgMjEgMjIgMTExIDQxIDEyIDEzNCAzMCA0MiA0OCAKKzExNyAxNTggNyAxNTQgMTI5IDE2NCA3NiAxOTUgMTg4IDEwMSA1MSAyMCAxMDAgMTAgMjAxIDE0MyA1MCAzMiA3MSA1MyAzMSAxMzEgMzEgCiszNSAxMjMgMTEzIDE2NiAxMzUgMTgwIDExNyA0NCAxMjUgNzYgMzMgMTQyIDYyIDMgMTE0IDkzIDE5IDU5IDM0IDM0IDEzMCAzOCAxNzAgCis3NCAxMDUgOTEgNTYgMTkyIDI3IDIwNSAzNCAxNzggMjAyIDEzMSA3OSAxOTkgODQgNjUgNTAgMTI4IDE4OSAxODUgMTQ1IDEwOSAxNyAKKzQ5IDEwNSAxODcgMTc0IDExNCAxNDEgMTgzIDIwIDE5NiAxMjggMTIzIDQ3IDI4IDE4IDg5IDE4OSAyMyA5OSA3MCAxNzkgOTQgNDIgCisxMTQgNDUgNjUgOTggODIgMTUwIDEzNyAyOSAxMDIgMTgzIDY4IDE1MCA4OSA3NSAxNDEgMjEgMTg0IDE1NyA4MCA3IDQwIDM3IDg2IAorMTkwIDE2IDE3NCA2NiAxODcgMTIgNjggMTAyIDEzNSAxMTQgMTg5IDEzNyAxOTEgMTQ4IDEyIDExNiA1NiA5NiAxMTkgNzMgMTMwIDIwMCAKKzYgMTEzIDEwMCAxNTQgNjMgMjYgMTE2IDEwNCA1MCA4MCAyNSAxNCAxOTMgODMgXgorNDM2IDEgMjQgNDQgMTkxIDIxMSAxMzggMTEgMTM4IDE4IDE0MCA5OSAxMzMgMTA0IDU0IDEyNCA0MiA2MyA4OCA5NSAxMzcgMTMzIDE1MSAKKzExNiAxNjIgMjA4IDE5MyAxODAgMTgwIDE3MyAyNiAxNTggMTY1IDE2MCAyNiA2IDE4IDc5IDMzIDEgOTcgNTkgNDUgNjIgNTEgMTcyIAorMTQxIDI0IDM3IDE4OSAxMzAgMTQ1IDYgNzIgMTQzIDE1MiAxNjAgODcgNCAxNTAgODYgMjggODAgNzcgNzEgMTA2IDE2IDE2NCAxMjMgCisxMDMgMTAgNTQgMTc4IDEwNiAxMTQgMzQgODUgMTUwIDkzIDE3NSA5MyA3MCA3NiAyNyAzNiAxNTIgMjA3IDQgNDIgMTAzIDMgMTIwIDk3IAorMTEzIDEwOSAxODEgMjEwIDE2MiAxNTQgMTI5IDYxIDE2NiAzOCAxMyA1MyAxNDEgMTgzIDE4NiAxMzggMTg0IDEwIDYxIDExMiAxMTkgCisxNzUgMTA3IDYgMTcwIDgxIDExNCAyMDcgMTAyIDEyNSA2NSA1MCAxMzUgNzMgMjggNzMgNzUgMjAzIDExMyAxMSA5OCAzNSAxMTUgNzEgCis4IDE0NiAyMDIgNzYgODggMTAyIDEzOSAxIDE0NCAxODkgODMgMTUgMTgxIDUxIDEzIDYwIDc1IDUxIDE3OSAxNDMgMzcgMzAgNDkgNTEgCisyMCAyMDcgMTU2IDQ0IDE4NCA2NCAxMjUgMTggMTMzIDk3IDUyIDExMSAxOTQgNTggMTY3IDc1IDE0OSA0OSAxMDUgODQgMTEzIDE3MCAKKzE3OSAxOTcgMTY5IDE0OSAyMDggNDEgMTc4IDk5IDE4MCAyMSA5MiAxNDUgMTcyIDE1NSAxMDUgMTMxIDMwIDIwOCAyMDAgMTE0IDQ4IAorMjEgMzEgNzkgNDAgMTQ4IDE3OCA1MiA1MCAxOTYgNzEgMTYwIDgwIDcwIDY5IDkzIDIzIDE1OSAyMDIgODMgMjIgMTE1IDEzMiA2IDY1IAorMjA5IDcxIDE2NyAxNCAxNTEgMTMwIDk4IDg5IDM0IDE5MCAxNjcgNjggMiAxODEgMTEyIDc5IDE5MiA4MiAxOTEgNDUgNTUgNDkgMTU5IAorMTQ4IDE5IDExNiAxNjkgMTQyIDYxIDE3MyAxODUgOTQgNDYgMTQ2IDEwNCAyMDYgMTI2IDU1IDU2IDkzIDE2IDEyIDEyMSA5MCAxNyA0OSAKKzQ0IDE4IDEyNiAxNjMgMzkgNTAgMTg5IDEzNyAxNDcgODcgNjUgMyA1IDM1IDc1IDE1NiAxOTYgMTE4IDc3IDExOCAyMyA1NCAxODUgNDAgCisxOTUgOTUgOTAgNzEgMTEzIDE2MyAzMiAxMTYgMTA4IDE0NCA3NCAxNjYgMTkwIDE1IDEzNCAxMzQgMTg4IDM5IDE1OCAxNzIgOTQgMTA3IAorMjEyIDIzIDUzIDEzNCAzNiAxMDUgNzcgMTExIDg5IDE4NiAxMjQgMzUgNjEgNyAxMDIgMTMyIDY3IDEzMSAxMjggNzggMTYyIDE2MSA2MyAKKzE0MiAxNCA0MyAxNDcgMTQxIDEyOSA1NCAxOSAxNzAgMjAgNDggNyA5NSAxOTggMTk5IDcwIDEyMyAxNTcgNzQgMTczIDE5MiAyOCAxMjcgCisxMzkgMTA5IDEyNyAxNDYgNDMgMTQwIDEzOSA0OCA2MSAxNCAzNiA2MCAxMzYgNDkgOTggMTUwIDMyIDEwOSAxNzQgNjMgODEgMTYxIAorMTI0IDE0MCAxNDYgNTAgMTQyIDcgMTA5IDY2IDgwIDEyNCAyMDEgMTQ0IDE4MiAxNDkgMiAxODggNDYgOTIgMTg1IDg3IDExMiAxMzMgCis0MyAyMDEgMjA1IDM1IDY4IDkgMTgzIDEyNSA3MiAxOTcgMyA2NiAzMyAyMDcgMTYzIDE5MSA1MiA1NyAxMzAgMTUyIDggODUgMjA0IAorMTU3IDgxIDEwNyAyMDUgMTg3IF4KKzQ2MiAxIDEyNiA1NCAxMjMgMTEzIDg1IDgxIDIzIDQxIDE1NCA3MSAyMTAgMTE1IDE4IDg5IDEwOCAzMiAxNTcgMjA5IDExIDEwMyAxNzYgCisxMzMgMTM2IDc3IDE5MyAxMCAyMDkgMTEyIDE5NiAxNjYgMTEwIDY2IDQzIDY5IDE5NCAzNiAyMDIgMjUgMTcxIDYyIDExMiA4MiA0NCAKKzEwMCA0MyAxODggMTcyIDcwIDgzIDI5IDExNSA2NyA2NCAxMjggODMgMTUzIDE2NCAxOTUgMTU4IDIgMTE5IDE4NyAxNjkgMzMgMTYwIAorMzEgMTQ5IDIzIDY0IDMyIDYxIDEwOSA0NSAxMjEgMTAyIDc3IDc0IDMyIDM4IDE2IDU1IDcgMTcyIDE4OSAxOTggMjAwIDIxMSAxNDEgCisxMSAyIDUgMTQzIDE1OSAxNDcgOTAgMTM0IDI1IDcwIDEwNiAxMjIgMTA1IDExNCAyMTIgMzAgMTQxIDEzMCAxOTUgMzkgMjQgMTYzIDkxIAorMjggMTEgNyA3NiAxNjcgMTcgODEgMTM3IDg1IDg2IDk0IDY1IDE0OSA1IDQyIDY2IDE1NyAxMTMgMjA0IDU5IDU3IDEzNyA4MCAxNSA3MCAKKzIwNyA3OCA5NSA5MSAxNDIgMTMzIDE3IDE3NyAyMiAxMjkgNjggMTY4IDQzIDc0IDUwIDYwIDE5NyAxNzQgMyAxMyAzNiAxMDYgMyAxMjcgCisxNTggMTE2IDI2IDE5NyAxOTIgMjUgMTk0IDE1NSAxMDIgNTkgNTIgMjAzIDU2IDIwIDIxNCA4MiA0OSAxNzEgNjcgNDYgMTA2IDExNyAKKzM0IDkwIDEzOSA5NiA5NCAxNzkgNTYgMTUgNjUgMTM2IDU0IDEwMCAxNTcgMTcgMTgyIDkzIDc1IDYzIDI0IDE2OCAyNSAxODkgODQgCisxNTYgMjAxIDExOCAxNTYgMTA1IDk2IDExMiAyMDEgMjIgMTM0IDEzOSAxMTQgMTE2IDE0NSAxNzUgMTEgMTIxIDE5OCA5OSA0MCAxNTEgCiszNCA3MiAxMTcgNTIgMTkwIDEwNSA5MCAyMCAxMTggNjAgODMgNTIgMjA4IDIwNSAxODEgMjA5IDE2IDE3NCAxMjIgMjA2IDcwIDIwMiAKKzE0NCA3MSAxOCAyMDggOCA2NiAzOCAxMzUgMTcwIDE3OCA1MyAxMTUgNSAxMzggODggMTIzIDE3IDIwMCAxMTUgMTE5IDE4MiA5OCA5IAorODcgOTcgMTAyIDcyIDMgOCAxODAgODIgMTQ1IDU2IDMzIDE2NSAxMDIgMTczIDk2IDIxMyAxNTcgMTIgMzMgNjkgODAgMTI5IDE5MiAyIAorMTAxIDE2NSAyMDMgNTEgODYgMTkwIDg3IDE5MyAxMjQgMTE2IDEyMiA0IDIxIDcgNTMgMjExIDI3IDEwNCAyMDcgMTk3IDczIDEyNSAyMyAKKzU5IDE3NiAzNyAxMTQgMTExIDc0IDE1MSAxNTMgNTAgNzMgMTQ4IDExNiAxMjcgMTUzIDQ1IDIgMTI0IDEyMSAxOTMgMjggMTYgNzggCisxMDAgMTYyIDE2NiAxMjggODggOSAxODggNTMgOTIgNDkgMTQ4IDExMSAxOTMgMTI5IDE4NyA2OCA3NyA5MiA1NCA0IDEzNSA1MSA2MyAKKzE5IDk3IDEgMTk0IDE1MCAzMSAzNSAxOTQgMTMyIDkgMjA2IDc1IDU4IDE2OCAxNDQgMTY3IDExOCAzNyAxMjcgNjIgOTQgNjAgNzggCisxOTYgNDcgMTMyIDExMCAxNjIgNjUgMzUgOTggMzIgNDMgODcgMSAyIDEwNiAyMSAxMiAxMjQgMjAgMjIgMzggMTE3IDE0OCAyMTIgMTQ5IAorMTE5IDE2NCA3NiAxODAgMTgzIDEwMSA0NiAxMCA5NSAyMDUgMTg2IDE0MyA0MCAzMiA1NiAzOCAyMSAxMjYgMzEgMzAgMTIzIDEwOCAKKzE1MSAxMzUgMTY1IDEwNyAyOSAxMjAgNzEgMTMgMTM3IDYyIDIwOCAxMDQgODggNCAzOSAyOSAxOSAxMTUgMjMgMTYwIDU0IDEwNSA5MSAKKzQxIDE3NyAyNyAyMDAgMTQgMTYzIDEyNCBeCis0NTMgMCAxMTUgNzkgMTk5IDg0IDQ5IDE4IDEyOCAxNzMgMTY5IDEyMSA5MyAxNyAxODYgNDEgODkgMTg3IDE1OCA5MCAxMzMgMTY3IAorMjA2IDE4OCAxMDQgOTkgMzEgNCAxOCA4MSAxNjUgMjE3IDc1IDU0IDE3OSA2MiAzNCAxMDYgMzcgNDEgNjYgODIgMTM0IDExMyAyMTUgCis4NiAxNTkgMzYgMTQyIDY1IDQzIDEyNSAyMTUgMTYwIDE0OSA0OCAxOTMgMjQgMjEgODYgMTgyIDE2IDE2NiA0MiAxNzkgMjA2IDQ0IDk0IAorMTExIDgyIDE4MSAxMjEgMTY3IDEzMiAxOTggOTIgNDggNzIgMTE5IDU3IDExNCAxODQgMjAwIDgxIDY4IDEyMiAzOSAyNiA4NCA5NiAyNiAKKzgwIDEgMjA4IDE3NyAyMTcgMjQgNDQgMTkxIDIwNiAxMTggMjA5IDEyMyA4IDE0MCA5OSAxMjggOTkgNTQgMTA5IDQyIDU4IDgzIDgwIAorMTIyIDExMyAxNDEgOTYgMTQ3IDIwMyAxODMgMTgwIDE3NSAxNTggMTYgMTQzIDE1NSAxNTUgMTEgMSAxMyA2NCAyMyAxIDg3IDU0IDM1IAorNTIgNDYgMTU3IDEyMSAxOSAyNyAxNzQgMTE1IDEzMCAyMDkgNzIgMTIzIDE1MiAxNTAgODcgMjAyIDE0MCA3NiAyMyA3NSA3NyA2NiA4NiAKKzExIDE0OSAxMTggODggNDQgMTY4IDEwMSA5NCAxNCA4MCAxNDUgOTMgMTY1IDczIDY1IDY2IDEyIDIxIDEzNyAxOTIgNCAyMiA4MyAyMDEgCisxMjAgNzcgMTEzIDk0IDE4MSAxOTUgMTU3IDE0NCAxMjQgNTEgMTUxIDMzIDIxMSAzOCAxMzEgMTc4IDE4NiAxMzggMTg0IDUgNjEgOTIgCis5OSAxNzUgMTA3IDYgMTU1IDgxIDExNCAyMDcgODcgMTA1IDQ1IDQwIDEyMCA3MyAxOCA1OCA2MCAxOTMgOTggMTEgOTggMTUgMTAwIDUxIAorMyAxNDYgMTg3IDYxIDg4IDk3IDEzOSAyMDQgMTI5IDE4OSA3MyAyMTMgMTcxIDM2IDIxNiA1NSA1NSA1MSAxNzQgMTM4IDE3IDE1IDQ5IAorNDEgMTUgMTk3IDE0NiAzOSAxNzQgNjQgMTIwIDMgMTIzIDgyIDM3IDExMSAxNzkgNTggMTU3IDcwIDEzNCAzOSAxMDAgNzQgMTA4IDE3MCAKKzE2NCAxOTcgMTY5IDE0NCAxOTggNDEgMTYzIDg0IDE3MCAxNiA5MiAxNDUgMTY3IDE1NSA4NSAxMTYgMjUgMjA4IDIwMCAxMDQgNDggMjEgCisxNiA2OSA0MCAxNDMgMTc4IDQyIDM1IDE5NiA1NiAxNDUgNzAgNjAgNDkgODggMjMgMTQ5IDE5MiA3OCAxMiA5NSAxMjcgMjA0IDU1IAorMTk5IDYxIDE2MiAyMTIgMTUxIDEzMCA4OCA3NCAzNCAxODAgMTUyIDUzIDIxMCAxNjYgMTEyIDc0IDE4MiA2NyAxNzYgMzAgMzUgMjkgCisxNTkgMTMzIDE5IDEwMSAxNjQgMTI3IDU2IDE2OCAxNzUgODQgMjYgMTMxIDEwNCAxOTYgMTI2IDQwIDQ2IDgzIDYgNyAxMDEgOTAgMTIgCis0NCAyNCAyMTYgMTA2IDE1OCAzOSAzMCAxNzkgMTMyIDE0NyA4MiA2MCAyMTYgMjAzIDM1IDc1IDE1MSAxODEgOTggNjIgMTA4IDMgNDkgCisxODUgMjUgMTg1IDk1IDgwIDcxIDEwMyAxNTMgMjIgMTA2IDg4IDE0NCA1NCAxNTYgMTc1IDEwIDEyOSAxMTkgMTc4IDE5IDE0OCAxNzIgCis3OSAxMDIgMjA3IDEzIDIwOCAzMyAxMTQgMzYgOTUgNTcgOTEgNzkgMTc2IDEwNCAyNSA0MSAyMTAgOTIgMTIyIDYyIDEzMSAxMDggNzMgCisxNjIgMTYxIDQ4IDE0MiAxNCAzMyAxMzcgMTQxIDExOSAzNCA5IDE2MCA1IDM4IDIwNSA3NSAxOTggMTg5IDUwIDEwOCAxMTIgXgorNDU0IDEgNTMgMTczIDE5MiAxMTMgMTExIDEwMiAxMjAgMTMyIDIyIDExMiAxMTggMjAgNDAgNyA4IDIxMyA0NiAxMjkgMjggNzcgMTUwIAorMTEgODEgMTYwIDQ5IDYwIDE1NCAxMjQgMTE5IDEzOSA0MyAxMzUgMjEzIDEwOSAzOCA1MiAxMTcgMjAxIDExNiAxNjggMTQ5IDIxNSAKKzE4MSAzMiA2NCAxNjQgNTkgOTggMTMzIDE1IDE5NCAxOTggMjggNTQgOSAxODMgMTA0IDU4IDE3NiAyMDkgNTkgMTIgMjAwIDE2MyAxNzcgCis0NSA1MCAxMTYgMTQ1IDggNjQgMjA0IDE1MCA3NCA5MyAxODQgODkgMTExIDM5IDEwOCAxMDggODUgNjEgMTMgMzYgMTU0IDYxIDIxMCAKKzExNSAzIDg0IDEwOCAyMiAxNTIgMjA5IDIxNiAxMDMgMTc2IDEyMyAxMjYgNTcgMTgzIDEwIDE5OSAxMDcgMTg2IDE2MSAxMDUgNTEgMzggCis2OSAxODQgMjYgMjAyIDE1IDE3MSA1NyA5NyA3NyAyNCA5MCAzMyAxODMgMTY3IDcwIDgzIDI5IDExMCA2NyA0OSAxMjMgNjMgMTQ4IAorMTU5IDE5MCAxNDggMiA5OSAxNzIgMTU5IDMzIDE2MCAyNiAxMzkgMyA0NCAxNyA0NiA4OSA0MCAxMDEgODcgNjIgNjkgMjcgMzggNiA1NSAKKzIgMTYyIDE4NCAxODMgMTkwIDIxMSAxMzEgNiAyMTIgMjEwIDEzOCAxNDQgMTMyIDg1IDEyNCAyNSA2MCA5MSAxMTIgOTUgOTkgMjEyIAorMzAgMTI2IDEyMCAxOTUgMzQgMTkgMTU4IDcxIDI4IDIxMSAyMTcgNTYgMTY3IDcgNzEgMTIyIDcwIDY2IDc5IDY1IDEzNCAyNyA2MSAKKzE0NyAxMDMgMTk5IDQ0IDU3IDEzNyA2NSA1MCAyMDIgNzggODAgODEgMTM3IDEyOCAxMiAxNzcgMjIgMTI5IDY4IDE2OCAyMyA3NCAzMCAKKzU1IDE4MiAxNzQgMjA4IDMgMjEgOTYgMjE4IDExMiAxNTggMTExIDE2IDE4NyAxNzcgNSAxNzkgMTQwIDgyIDU5IDUyIDE4OCAzNiAyMCAKKzIxNCA2MiAyOSAxNTYgNjIgNDYgMTA2IDEwNyAyOSA3MCAxMjkgOTEgODkgMTc0IDUxIDE1IDQ1IDEzNiA0OSAxMDAgMTQyIDIxNyAxODIgCis4OCA1NSA0OCA0IDE2MyAyMCAxNzQgNzQgMTU2IDE5NiAxMTMgMTUxIDkwIDk2IDkyIDE5MSA3IDEzNCAxMzQgOTQgMTA2IDEzMCAxNzAgCisxIDEwNiAxOTMgNzkgMjUgMTQ2IDI0IDY3IDExMiAzMiAxOTAgODUgMjEwIDc1IDE1IDEwOCA0NSA3MyAzNyAxOTMgMjA1IDE2NiAxOTQgCisxIDE2OSAxMDIgMjA2IDY1IDE5NyAxMjkgNTEgMjE4IDE5OCAyMDggNjYgMzMgMTIwIDE1NSAxNjMgNDMgOTUgNSAxMzMgNzggMTAzIDIgCisxODUgMTA1IDExNCAxNjcgOTMgNCA3NyA4NyAxMDIgNTcgMyAyMTggMTc1IDY3IDEzNSA1NiAxOCAxNjUgOTIgMTY4IDg2IDIwMyAxNTcgCisyMTIgMTMgNTkgNzUgMTA5IDE4NyAyMTcgOTYgMTU1IDIwMyAzMSA3MSAxODUgODIgMTkzIDExOSAxMTYgMTIyIDIwNCAxNiA3IDQ4IAorMjAxIDIyIDg5IDE5NyAxOTIgNjMgMTI1IDE4IDM5IDE3MSAxNyAxMDkgMTAxIDY0IDE0MSAxMzggNTAgNTMgMTMzIDEwMSAxMjcgMTUzIAorNDUgMjA3IDEwNCAxMjEgMTg4IDEzIDIxNiA2MyA4NSAxNDcgMTY2IDEwOCA2OCAyMTQgMTg4IDUzIDg3IDM5IDE0OCA5NiAxNzggMTI0IAorMTgyIDQ4IDY3IDcyIDQ0IDIxNCAxMjUgNDEgNjMgMjE5IDk3IDIxMSAxOTQgMTM1IDE2IDMwIDE4OSAxMzIgMjE5IDE5MSA3MCA0MyAKKzE1OCAxODEgXgorNDc1IDAgMTUzIDExOCAzNyA5OSA0OCA5NCA2MCA2NCAxODkgNDcgMTE4IDExMCAxNTUgNTEgMjEgNzcgNCA0MyA2NiAxOTUgMTk2IDk5IAorMjE1IDEyIDExMCA2IDIxNiAyNCAxMTcgMTM0IDIwNSAxNDIgMTA1IDE2NCA3NiAxNTkgMTc2IDEwMSAzOSAyMTggODggMTg0IDE2NSAKKzE0MyAyNiAzMiAzNSAxNyA3IDExOSAzMSAyMyAxMjMgMTAxIDEzMCAxMzUgMTQ0IDkzIDggMTEzIDY0IDIwNyAxMzAgNjIgMjAxIDkwIAorODEgMjA1IDExIDIyIDIyMCA5NCAyIDE0NiAyNiAxMDUgOTEgMjAgMTU2IDI3IDE5MyAyMDggMTQyIDE3OCAxMDcgNzkgMTk5IDg0IDQxIAorMiAxMjggMTY1IDE2MSAxMDkgODUgMTcgMTc0IDM3IDgxIDE4NyAxNTAgNzggMTI5IDE1OSAxOTQgMTg0IDkyIDg3IDIzIDIxNCAxOCA3NyAKKzE1MyAyMDkgNjMgNDYgMTc5IDQ2IDMwIDEwMiAzMyAyOSA1MCA4MiAxMjYgMTAxIDIwMyA3OCAxNDcgMjAgMTM4IDUzIDI3IDExNyAyMDcgCisxNDggMTQ1IDMyIDE4MSAxNiAxMyA4NiAxNzggMTYgMTYyIDMwIDE3NSAxOTggMzIgOTAgOTkgNjYgMTc3IDExMyAxNTUgMTI0IDE4NiAKKzgwIDQ0IDYwIDExOSA0OSAxMDYgMTc2IDE5MiA2NSA1MiAxMDYgMjcgMjYgNjggOTIgMTQgODAgMjExIDIwMCAxNjkgMjEzIDI0IDQ0IAorMTkxIDIwMiAxMDIgMTk3IDExMSAxNDAgOTkgMTI0IDk1IDU0IDk3IDQyIDU0IDc5IDY4IDExMCA5NyAxMzMgODAgMTM1IDE5OSAxNzUgCisxODAgMTcxIDE0NiA4IDEzMSAxNDcgMTUxIDIyMSAyMTkgOSA1MiAxNSAxIDc5IDUwIDI3IDQ0IDQyIDE0NSAxMDUgMTUgMTkgMTYyIAorMTAzIDExOCAyMDEgNzIgMTA3IDE1MiAxNDIgODcgMTkwIDEzMiA2OCAxOSA3MSA3NyA2MiA3MCA3IDEzNyAxMTQgNzYgMjE0IDM2IDE2MCAKKzk3IDc4IDIyMCA3NiAxNDEgOTMgMTU3IDU3IDYxIDU4IDkgMTI1IDE4MCA0IDYgNjcgMTg5IDEyMCA2MSAxMTMgODIgMTgxIDE4MyAxNTMgCisxMzYgMTIwIDQzIDEzOSAyOSAxOTkgMjYgMTIzIDE3NCAxODYgMTM4IDE4NCAxIDYxIDc2IDgzIDE3NSAxMDcgNiAxNDMgODEgMTE0IAorMjA3IDc1IDg5IDI5IDMyIDEwOCA3MyAxMCA0NiA0OCAxODUgODYgMTEgOTggMjIxIDg4IDM1IDIyMSAxNDYgMTc1IDQ5IDg4IDkzIDEzOSAKKzE5NiAxMTcgMTg5IDY1IDIwMSAxNjMgMjQgMjA4IDUxIDM5IDUxIDE3MCAxMzQgMSAzIDQ5IDMzIDExIDE4OSAxMzggMzUgMTY2IDY0IAorMTE2IDIxMyAxMTUgNzAgMjUgMTExIDE2NyA1OCAxNDkgNjYgMTIyIDMxIDk2IDY2IDEwNCAxNzAgMTUyIDE5NyAxNjkgMTQwIDE5MCA0MSAKKzE1MSA3MiAxNjIgMTIgOTIgMTQ1IDE2MyAxNTUgNjkgMTA0IDIxIDIwOCAyMDAgOTYgNDggMjEgNCA2MSA0MCAxMzkgMTc4IDM0IDIzIAorMTk2IDQ0IDEzMyA2MiA1MiAzMyA4NCAyMyAxNDEgMTg0IDc0IDQgNzkgMTIzIDE5MiA0NyAxOTEgNTMgMTU4IDIwMCAxNTEgMTMwIDgwIAorNjIgMzQgMTcyIDE0MCA0MSAyMDYgMTU0IDExMiA3MCAxNzQgNTUgMTY0IDE4IDE5IDEzIDE1OSAxMjEgMTkgODkgMTYwIDExNSA1MiAKKzE2NCAxNjcgNzYgMTAgMTE5IDEwNCAxODggMTI2IDI4IDM4IDc1IDIyMCAzIDg1IDkwIDggNDAgOCAyMDQgOTAgMTU0IDM5IDE0IDE3MSAKKzEyOCAxNDcgNzggNTYgMjE2IDE5MSAzNSA3NSAxNDcgMTY5IDgyIDUwIDEwMCAyMDkgNDUgMTg1IDEzIDE3NyA5NSAxNTAgXgorNDcxIDAgNzEgODkgMTM5IDggOTIgNjAgMTQ0IDI2IDE0MiAxNTQgMyAxMjIgOTggMTY0IDIxNiAxMzQgMTcyIDU4IDk1IDIwMCAyMjQgCisyMDEgNSA4NiAzNiA4MSAyOSA2MyA2NSAxNjIgNzYgMTEgMTMgMTk2IDc4IDEwOCA1NSAxMzEgODAgNjYgMTYyIDE2MSAyNyAxNDIgMTQgCisxOSAxMjMgMTQxIDEwNSA2IDIyMCAxNDYgMjA5IDI0IDE4NCA0NyAxOTggMTc1IDIyIDg3IDEzMyAzOCAxNzMgMTkyIDIwNSAxMDMgOTEgCis5NyAxMTUgMTIyIDcgOTIgMTAzIDI1IDIgMjEzIDIxMyAzNiAxMjQgMTMgNjIgMTUwIDIyMSA2MSAxNTAgMzkgNDUgMTQ5IDEyNCAxMDQgCisxMzQgMzggMTMwIDIwOCAxMDkgMTggMzIgMTEyIDIwMSA5NiAxNTggMTQ5IDIxNSAxNzYgMjIgNDQgMTQ5IDM5IDg4IDEzMyAyMjAgMTg5IAorMTkzIDIzIDQ0IDkgMTgzIDg5IDQ4IDE2MSAyMDQgNTQgMjIyIDE5NSAxNjMgMTY3IDQwIDQ1IDEwNiAxNDAgOCA0OSAyMDQgMTQ1IDY5IAorODMgMTY5IDg5IDk2IDI0IDkzIDEwMyA4NSA0MSAzIDMxIDE1NCA1MSAyMTAgMTE1IDIxMyA3OSAxMDggMTIgMTQ3IDIwOSAyMDYgMTAzIAorMTc2IDExMyAxMTYgMzcgMTczIDEwIDE4OSAxMDIgMTc2IDE1NiAxMDAgMzYgMzMgNjkgMTc0IDE2IDIwMiA1IDE3MSA1MiA4MiA3MiA0IAorODAgMjMgMTc4IDE2MiA3MCA4MyAyOSAxMDUgNjcgMzQgMTE4IDQzIDE0MyAxNTQgMTg1IDEzOCAyIDc5IDE1NyAxNDkgMzMgMTYwIDIxIAorMTI5IDIwOCAyNCAyIDMxIDY5IDM1IDgxIDcyIDQ3IDY0IDIyIDM4IDIyMSA1NSAyMjIgMTUyIDE3OSAxNjggMTgwIDIxMSAxMjEgMSAKKzIwNyAyMDAgMTMzIDEyOSAxMTcgODAgMTE0IDI1IDUwIDc2IDEwMiA4NSA4NCAyMTIgMzAgMTExIDExMCAxOTUgMjkgMTQgMTUzIDUxIAorMjggMTk2IDIxMiAzNiAxNjcgMjIyIDYxIDEwNyA1NSA0NiA2NCA2NSAxMTkgMjIwIDEyIDU2IDEzNyA5MyAxOTQgMjkgNTcgMTM3IDUwIAorMjEwIDMwIDE5NyA3OCA2NSA3MSAxMzIgMTIzIDcgMTc3IDIyIDEyOSA2OCAxNjggMyA3NCAxMCA1MCAxNjcgMTc0IDE5OCAyMTggNiA4NiAKKzIxOCA5NyAxNTggMTA2IDYgMTc3IDE2MiAyMTAgMTY0IDEyNSA2MiA1OSA1MiAxNzMgMTYgMjAgMjE0IDQyIDkgMTQxIDU3IDQ2IDEwNiAKKzk3IDI0IDUwIDExOSA4NiA4NCAxNjkgNDYgMTUgMjUgMTM2IDQ0IDEwMCAxMjcgMjAyIDE4MiA4MyAzNSAzMyAyMDkgMTU4IDE1IDE1OSAKKzY0IDE1NiAxOTEgMTA4IDE0NiA3NSA5NiA3MiAxODEgMjE3IDEzNCAxMjkgNzQgOTYgMTE1IDE2NSAyMTYgOTEgMTg4IDU5IDEwIDE0MSAKKzE0IDYyIDEwNyAxMiAxOTAgNjUgMjA1IDYwIDEwIDk4IDMwIDYzIDIyIDE3OCAyMDUgMTUxIDE3OSAyMTEgMTY0IDgyIDIwNiA2MCAxOTIgCisxMTQgMzEgMjAzIDE4OCAxOTMgNjYgMjggMTA1IDE0MCAxNDggMzMgNzUgNSAxMjggNjggODMgMjEyIDE3MCA5NSAxMDkgMTUyIDg4IAorMjI0IDY3IDc3IDEwMiA0MiAzIDIxMyAxNzAgNTIgMTI1IDU2IDMgMTY1IDgyIDE2MyA3NiAxOTMgMTU3IDE5NyAyMTggNDkgNzAgODkgCisxODIgMjE3IDkxIDE0NSAyMDMgMTEgNTYgMTgwIDc3IDE5MyAxMTQgMTE2IDEyMiAxODkgMTEgNyA0MyAxOTEgMTcgNzQgMTg3IDE4NyAKKzUzIDEyNSAxMyAxOSAxNjYgMjIyIDEwNCA5MSA1NCAxMzEgMTIzIDUwIDMzIDExOCA4NiAxMjcgMTY3IF4KKzQ4MCAxIDQ1IDE5MyA3NiAxMjEgMTgxIDIxOSAxOTUgNDIgNjQgMTI2IDE2NiA4MCA0MCAyMDAgMTg4IDUzIDgwIDI1IDE0OCA3NSAxNTcgCisxMTcgMTc1IDIwIDUzIDQ0IDMwIDIwNyAxMTEgMjcgNjMgMTk4IDk3IDIwNCAxOTQgMTE0IDIyMiAyMyAxODIgMTMyIDIxMiAxNzAgNjMgCisyMiAxNDQgMTIwIDE0MyAxMTggMzcgNzkgMzggOTQgNjAgNTQgMTg0IDQ3IDEwOCAxMTAgMTUwIDQxIDExIDYyIDIxMSA0MyA1MSAxODAgCisxODEgOTQgMjAwIDEyIDEwMCAyMjMgMjAxIDE0IDExNyAxMjQgMjAwIDEzNyA5NSAxNjQgNzYgMTQ0IDE3MSAxMDEgMzQgMjEzIDgzIAorMTY5IDE1MCAxNDMgMTYgMzIgMjAgMiAyMjQgMTE0IDMxIDE4IDEyMyA5NiAxMTUgMTM1IDEyOSA4MyAyMjAgMTA4IDU5IDE5MiAxMjUgCis2MiAxOTYgODAgNzYgMTk1IDIxOCAxNyAyMTAgNzkgMjE0IDEzNiA2IDEwNSA5MSA1IDE0MSAyNyAxODggMTkzIDEyNyAxNjggOTcgNzkgCisxOTkgODQgMzEgMjA5IDEyOCAxNTUgMTUxIDk0IDc1IDE3IDE1OSAzMiA3MSAxODcgMTQwIDYzIDEyNCAxNDkgMTc5IDE3OSA3NyA3MiAKKzEzIDIwNCAxOCA3MiAxMzggMTk5IDQ4IDM2IDE3OSAyNiAyNSA5NyAyOCAxNCAzMCA4MiAxMTYgODYgMTg4IDY4IDEzMiAxMzMgMzggNyAKKzEwNyAxOTcgMTMzIDE0MCAxMiAxNjYgNiAzIDg2IDE3MyAxNiAxNTcgMTUgMTcwIDE4OCAxNyA4NSA4NCA0NiAxNzIgMTAzIDE0MCAxMTQgCisxNzEgNjUgMzkgNDUgMTE5IDM5IDk2IDE2NiAxODIgNDUgMzIgODYgMTIgMjYgNDggODcgMjI2IDgwIDIwMSAxOTAgMTU5IDIwOCAyNCAKKzQ0IDE5MSAxOTcgODIgMTgyIDk2IDIxNyAxNDAgOTkgMTE5IDkwIDU0IDgyIDQyIDQ5IDc0IDUzIDk1IDc3IDEyMyA2MCAxMjAgMTk0IAorMTY1IDE4MCAxNjYgMTMxIDIyNSAxMTYgMTM3IDE0NiAyMTEgMjE5IDQgMzcgNSAxIDY5IDQ1IDE3IDM0IDM3IDEzMCA4NSAxMCA5IDE0NyAKKzg4IDEwMyAxOTEgNzIgODcgMTUyIDEzMiA4NyAxNzUgMTIyIDU4IDE0IDY2IDc3IDU3IDUwIDIgMTIyIDEwOSA2MSAyMDkgMjYgMTUwIAorOTIgNTggMjA1IDcxIDEzNiA5MyAxNDcgMzcgNTYgNDggMjEyIDIyMSAxMTAgMTY1IDQgMjEzIDQ3IDE3NCAxMjAgNDEgMTEzIDY3IDE4MSAKKzE2OCAxNDggMTI2IDExNSAzMyAxMjQgMjQgMTg0IDExIDExMyAxNjkgMTg2IDEzOCAxODQgMjIzIDYxIDU2IDYzIDE3NSAxMDcgNiAxMjggCis4MSAxMTQgMjA3IDYwIDY5IDkgMjIgOTMgNzMgMzEgMzMgMTc1IDcxIDExIDk4IDIwNiA3MyAxNSAyMjEgMTQ2IDE2MCAzNCA4OCA4OCAKKzEzOSAxODYgMTAyIDE4OSA1NSAxODYgMTUzIDkgMTk4IDQ2IDE5IDUxIDE2NSAxMjkgMjA4IDIxNSA0OSAyMyA2IDE3OSAxMjggMzAgCisxNTYgNjQgMTExIDIwMyAxMDUgNTUgMTAgMTExIDE1MiA1OCAxMzkgNjEgMTA3IDIxIDkxIDU2IDk5IDE3MCAxMzcgMTk3IDE2OSAxMzUgCisxODAgNDEgMTM2IDU3IDE1MiA3IDkyIDE0NSAxNTggMTU1IDQ5IDg5IDE2IDIwOCAyMDAgODYgNDggMjEgMjE2IDUxIDQwIDEzNCAxNzggCisyNCA4IDE5NiAyOSAxMTggNTIgNDIgMTMgNzkgMjMgMTMxIDE3NCA2OSAyMjEgNTkgMTE4IDE3NyAzNyAxODEgNDMgMTUzIDE4NSAxNTEgCisxMzAgNzAgNDcgMzQgMTYyIDEyNSAyNiAyMDEgMTM5IDExMiA2NSAxNjQgNDAgMTQ5IDMgMjI2IDIyMCAxNTkgMTA2IDE5IDc0IDE1NSAKKzEwMCA0NyAxNTkgMTU3IDE5MyBeCis0NzEgMCAyMTEgOTggMTA0IDE3NCAxMjYgNyAyNCA2MSAyMTMgMjI1IDU3IDkwIDEgMzMgMjA5IDE4MyA2MiAxNDcgMzkgMjE1IDE1NyAKKzEyMSAxNDcgNzEgNDkgMjE2IDE3MCAzNSA3NSAxNDAgMTQ4IDU0IDI5IDg2IDE4OCAzOCAxODUgMjIxIDE2MyA5NSA1OCA3MSA4MSAxMzEgCis4NCA0NCAxNDQgMTAgMTM0IDE0MiAyMjggMTE4IDg2IDE1NiAyMDQgMTI2IDE3MiA0NiA5MSAxOTYgMjIwIDE5NyAyMTggNzAgMzYgNzMgCisxMyA0NyA1NyAxNTQgNjAgMyAyMjYgMTg4IDcwIDEwMCA1MSAxMzEgNjQgNjIgMTYyIDE2MSAxNSAxNDIgMTQgMTEgMTE1IDE0MSA5NyAKKzIxOSAyMTYgMTM4IDIwMSAxNiAxNzIgMzEgMTk4IDE2NyA2IDc1IDEyNSAyNiAxNzMgMTkyIDE5MyA5NSA3NSA5MyAxMTEgMTE0IDIyNCAKKzc2IDkxIDIxMyAxMyAyMjcgMjAxIDIxMyAyOCAxMjAgMSA1MCAxNTAgMjEzIDQ1IDE0MiAzMSAzMyAxNDUgMTI0IDkyIDEzMCAzNCAxMjYgCisyMDQgMTA5IDIgMTYgMTA4IDIwMSA4MCAxNTAgMTQ5IDIxNSAxNzIgMTQgMjggMTM3IDIzIDgwIDEzMyAyMDggMTg1IDE4OSAxOSAzNiA5IAorMTgzIDc3IDQwIDE0OSAyMDAgNTAgMjE0IDE5MSAxNjMgMTU5IDM2IDQxIDk4IDEzNiA4IDM3IDIwNCAxNDEgNjUgNzUgMTU3IDg5IDg0IAorMTIgODEgOTkgODUgMjUgMjI0IDI3IDE1NCA0MyAyMTAgMTE1IDIwNSA3NSAxMDggNCAxNDMgMjA5IDE5OCAxMDMgMTc2IDEwNSAxMDggCisyMSAxNjUgMTAgMTgxIDk4IDE2OCAxNTIgOTYgMjQgMjkgNjkgMTY2IDggMjAyIDIyNiAxNzEgNDggNzAgNjggMjE3IDcyIDE1IDE3NCAKKzE1OCA3MCA4MyAyOSAxMDEgNjcgMjIgMTE0IDI3IDEzOSAxNTAgMTgxIDEzMCAyIDYzIDE0NSAxNDEgMzMgMTYwIDE3IDEyMSAxOTYgOCAKKzIxOSAxOSA1MyAzMSA2NSA2MCAzNSA2MCAxOCAzOCAyMTcgNTUgMjIyIDE0NCAxNzUgMTU2IDE3MiAyMTEgMTEzIDIyNiAyMDMgMTkyIAorMTI5IDExNyAxMDUgNzYgMTA2IDI1IDQyIDY0IDk0IDc3IDcyIDIxMiAzMCA5OSAxMDIgMTk1IDI1IDEwIDE0OSAzNSAyOCAxODQgMjA4IAorMjAgMTY3IDIxOCA1MyA5NSA0MyAzMCA1MiA2NSAxMDcgMjIwIDUyIDEyOSA4NSAxOTAgMTcgNTcgMTM3IDM4IDIwMiAxNCAxOTMgNzggCis1MyA2MyAxMjggMTE5IDMgMTc3IDIyIDEyOSA2OCAxNjggMjE2IDc0IDIyMyA0NiAxNTUgMTc0IDE5MCAyMTQgMjIzIDc4IDIxOCA4NSAKKzE1OCAxMDIgMjI3IDE2OSAxNTAgMTk4IDE1MiAxMTMgNDYgNTkgNTIgMTYxIDIwIDIxNCAyNiAyMjIgMTI5IDUzIDQ2IDEwNiA4OSAyMCAKKzM0IDExMSA4MiA4MCAxNjUgNDIgMTUgOSAxMzYgNDAgMTAwIDExNSAxOTAgMTgyIDc5IDE5IDIxIDE5NyAxNTQgMTEgMTQ3IDU2IDE1NiAKKzE4NyAxMDQgMTQyIDYzIDk2IDU2IDE3MyAyMDkgMTM0IDEyNSA1OCA4OCAxMDMgMTYxIDIxMiA3OSAxODQgNDMgMjI3IDEzNyA2IDU4IAorMTAzIDIyNSAxOTAgNDkgMjAxIDQ4IDYgOTAgMTggNTUgMTAgMTY2IDIwNSAxMzkgMTY3IDIwMyAxNjAgNjYgMjA2IDU2IDE4OCAxMDIgCisxNSAxOTEgMTgwIDE4MSA2NiAyNCA5MyAxMjggMTM2IDI1IDU5IDUgMTI0IDYwIDY3IDIwNCAxNTggODcgMTA1IDE0MCA4NCAyMjQgNTkgCis2OSAxMDIgMzAgMyAyMDkgMTY2IDQwIDExNyA1NiAyMjAgMTY1IDc0IDE1OSA2OCAxODUgMTU3IDE4NSAyMDYgNDEgNjYgMTY3IF4KKzQ5MCAxIDE3NiAyMTcgODUgMTMzIDIwMyAyMTggMzggMTc0IDcxIDE5MyAxMDggMTE2IDEyMiAxNzEgNSA3IDM3IDE3OSAxMSA1NiAxNzUgCisxODEgNDEgMTI1IDcgMjI2IDE2MCAyMDQgOTggNzkgNDIgMTE5IDEwNSA1MCA5IDEwMCA2OCAxMjcgMTUzIDQ1IDE4NSA2MCAxMjEgMTc3IAorMjExIDE4MyAzMCA1MiAxMTQgMTY2IDY0IDI0IDE5MiAxODggNTMgNzYgMTcgMTQ4IDYzIDE0NSAxMTMgMTcxIDQgNDUgMjggMjIgMjAzIAorMTAzIDE5IDYzIDE4NiA5NyAyMDAgMTk0IDEwMiAyMTQgMTkgMTc4IDEzMiAyMDggMTU4IDU5IDEwIDEzNiAxMTIgMTM1IDExOCAzNyA2MyAKKzMwIDk0IDYwIDQ2IDE4MCA0NyAxMDAgMTEwIDE0NiAzMyAzIDUwIDE5OSA0MyAzOSAxNjggMTY5IDkwIDE4OCAxMiA5MiAyMTkgMTg5IDYgCisxMTcgMTE2IDE5NiAxMzMgODcgMTY0IDc2IDEzMiAxNjcgMTAxIDMwIDIwOSA3OSAxNTcgMTM4IDE0MyA4IDMyIDggMjIxIDIyMCAxMTAgCiszMSAxNCAxMjMgOTIgMTAzIDEzNSAxMTcgNzUgMjEyIDEwNCA1NSAxODAgMTIxIDYyIDE5MiA3MiA3MiAxODcgMjA2IDEzIDIwMiA2NyAKKzIwNiAxMjggMjIxIDEwNSA5MSAyMjQgMTI5IDI3IDE4NCAxODEgMTE1IDE2MCA4OSA3OSAxOTkgODQgMjMgMTk3IDEyOCAxNDcgMTQzIAorODIgNjcgMTcgMTQ3IDI4IDYzIDE4NyAxMzIgNTEgMTIwIDE0MSAxNjcgMTc1IDY1IDYwIDUgMTk2IDE4IDY4IDEyNiAxOTEgMzYgMjggCisxNzkgMTAgMjEgOTMgMjQgMiAxNCA4MiAxMDggNzQgMTc2IDYwIDEyMCAyMTUgMTI5IDI2IDIyMiA5OSAxODkgMTIxIDEzNiAyMjcgMTU0IAorMjI5IDIyNiA4NiAxNjkgMTYgMTUzIDMgMTY2IDE4MCA1IDgxIDcyIDMwIDE2OCA5NSAxMjggMTA2IDE1OSA1MyAzNSAzMyAxMTkgMzEgCis4OCAxNTggMTc0IDI5IDE2IDcwIDI2IDMyIDgzIDIxOCA4MCAxOTMgMTgyIDE1MSAyMDQgMjQgNDQgMTkxIDE5MyA2NiAxNzAgODQgMjEzIAorMTQwIDk5IDExNSA4NiA1NCA3MCA0MiA0NSA3MCA0MSA4MyA2MSAxMTUgNDQgMTA4IDE5MCAxNTcgMTgwIDE2MiAxMTkgMjIxIDEwNCAKKzEyOSAxNDIgMjAzIDIxOSAyNSAyMjggMSA2MSA0MSA5IDI2IDMzIDExOCA2OSA2IDEgMTM1IDc2IDkxIDE4MyA3MiA3MSAxNTIgMTI0IAorODcgMTYzIDExNCA1MCAxMCA2MiA3NyA1MyAzNCAyMjkgMTEwIDEwNSA0OSAyMDUgMTggMTQyIDg4IDQyIDE5MyA2NyAxMzIgOTMgMTM5IAorMjEgNTIgNDAgMjA0IDIxMyA5OCAxNTMgNCAyMDEgMzEgMTYyIDEyMCAyNSAxMTMgNTUgMTgxIDE1NiAxNDQgMTE4IDExMSAyNSAxMTIgCisyMCAxNzIgMjMwIDEwNSAxNjUgMTg2IDEzOCAxODQgMjIzIDYxIDQwIDQ3IDE3NSAxMDcgNiAxMTYgODEgMTE0IDIwNyA0OCA1MyAyMjQgCisxNCA4MSA3MyAyMjMgMTkgMjEgMTY3IDU5IDExIDk4IDE5NCA2MSAyMzAgMjIxIDE0NiAxNDggMjIgODggODQgMTM5IDE3OCA5MCAxODkgCis0NyAxNzQgMTQ1IDIyOCAxOTAgNDIgMyA1MSAxNjEgMTI1IDE5NiAyMDcgNDkgMTUgMiAxNzEgMTIwIDI2IDE0OCA2NCAxMDcgMTk1IDk3IAorNDMgMjI5IDExMSAxNDAgNTggMTMxIDU3IDk1IDEzIDg3IDQ4IDk1IDE3MCAxMjUgMTk3IDE2OSAxMzEgMTcyIDQxIDEyNCA0NSAxNDQgMyAKKzkyIDE0NSAxNTQgMTU1IDMzIDc3IDEyIDIwOCAyMDAgNzggNDggMjEgMjA4IDQzIDQwIDEzMCAxNzggMTYgMjI3IDE5NiAxNyAxMDYgNDQgCiszNCAyMjggNzUgMjMgMTIzIDE2NiA2NSAyMTcgNDMgMTE0IDE2NSAyOSAxNzMgMzUgMjAwIF4KKzQ3OSAwIDE2NyAxNTEgMTMwIDU4IDI5IDM0IDE1MCAxMDcgOCAxOTUgMTIxIDExMiA1OSAxNTIgMjIgMTMxIDIxOCAyMDggMjAyIDE1OSAKKzg4IDE5IDU2IDE0OSA4MiA0MSAxNTMgMTQ1IDU0IDE5OSA4NiAxMDQgMTY2IDEyNiAyMjggMTYgNTMgMjA5IDIyNSA0MSA5MCAyMzAgMjkgCisxOTcgMTcxIDQ2IDE0MyAzOSAyMDMgMTQ5IDExNyAxNDcgNjcgNDUgMjE2IDE1OCAzNSA3NSAxMzYgMTM2IDM4IDE3IDc4IDE3NiAzNCAKKzE4NSAyMTMgMTU1IDk1IDUwIDcxIDczIDEyMyAyMjUgNzYgMjggMTQ0IDIyNyAxMjYgMTMwIDIyOCAxMTQgNzQgMTQ4IDE5MiAxMTggCisxNzIgMzQgODcgMTkyIDIxNiAxOTMgMjA2IDU0IDM2IDY1IDIzMCAzMSA0OSAxNDYgNDQgMjI4IDIxNCAxODAgNjIgOTIgNDcgMTMxIDQ4IAorNTggMTYyIDE2MSAzIDE0MiAxNCAzIDEwNyAxNDEgODkgMjA3IDIxMiAxMzAgMTkzIDggMTYwIDE1IDE5OCAxNTkgMjIzIDYzIDExNyAxNCAKKzE3MyAxOTIgMTgxIDg3IDU5IDg5IDEwNyAxMDYgMjE2IDYwIDc5IDIwMSAxIDIyNyAxODkgMjEzIDIwIDExNiAyMjIgMzggMTUwIDIwNSAKKzI5IDEzNCAyMyAyMSAxNDEgMTI0IDgwIDEyNiAzMCAxMjIgMjAwIDEwOSAyMTkgMTA0IDIwMSA2NCAxNDIgMTQ5IDIxNSAxNjggNiAxMiAKKzEyNSA3IDcyIDEzMyAxOTYgMTgxIDE4NSAxNSAyOCA5IDE4MyA2NSAzMiAxMzcgMTk2IDQ2IDIwNiAxODcgMTYzIDE1MSAzMiAzNyA5MCAKKzEzMiA4IDI1IDIwNCAxMzcgNjEgNjcgMTQ1IDg5IDcyIDY5IDk1IDg1IDkgMjIwIDIzIDE1NCAzNSAyMTAgMTE1IDE5NyA3MSAxMDggCisyMjkgMTM5IDIwOSAxOTAgMTAzIDE3NiA5NyAxMDAgNSAxNTcgMTAgMTczIDk0IDE2MCAxNDggOTIgMTIgMjUgNjkgMTU4IDIwMiAyMjIgCisxNzEgNDQgNTggNjQgMjA1IDY0IDcgMTcwIDE1NCA3MCA4MyAyOSA5NyA2NyAxMCAxMTAgMTEgMTM1IDE0NiAxNzcgMTIyIDIgNDcgMTMzIAorMTMzIDMzIDE2MCAxMyAxMTMgMTg0IDIyNSAyMTEgNyAzNyAyNyA0OSA0OCAyMyA1NiAxNCAzOCAyMTMgNTUgMjIyIDEzNiAxNzEgMTQ0IAorMTY0IDIxMSAxMDUgMjI2IDE5OSAxODQgMTI1IDEwNSA5MyA3MiA5OCAyNSAzNCA1MiA4NiA2OSA2MCAyMTIgMzAgODcgOTQgMTk1IDIxIAorNiAxNDUgMTkgMjggMTcyIDIwNCA0IDE2NyAyMTQgNDUgODMgMzEgMTQgNDAgNjUgOTUgMjIwIDIyMSA0OCAxMjEgNzcgMTg2IDUgNTcgCisxMzcgMjYgMTk0IDIzMSAxODkgNzggNDEgNTUgMTI0IDExNSAyMzIgMTc3IDIyIDEyOSA2OCAxNjggMjA0IDc0IDIxMSA0MiAxNDMgMTc0IAorMTgyIDIxMCAyMTUgNzAgMjE4IDczIDE1OCA5OCAyMjMgMTYxIDEzOCAxODYgMTQwIDEwMSAzMCA1OSA1MiAxNDkgMjE3IDIwIDIxNCAxMCAKKzIxMCAxMTcgNDkgNDYgMTA2IDgxIDE2IDE4IDEwMyA3OCA3NiAxNjEgMzggMTUgMjI2IDEzNiAzNiAxMDAgMTAzIDE3OCAxODIgNzUgMyAKKzkgMTg1IDE1MCA3IDEzNSA0OCAxNTYgMTgzIDEwMCAxMzggNTEgOTYgNDAgMTY1IDIwMSAxMzQgMTIxIDQyIDgwIDkxIDE1NyAyMDggNjcgCisxODAgMjcgMjE5IDEzMyAyMzEgNTQgOTkgMjEzIDE5MCAzMyAxOTcgMzYgMiA4MiA2IDQ3IDIzMSAxNTQgMjA1IDEyNyAxNTUgMTk1IAorMTU2IDUwIDIwNiA1MiAxODQgOTAgMjMyIDE3OSAxNzIgMTY5IDY2IDIwIDgxIDExNiAxMjQgMTcgNDMgNSAxMjAgNTIgNTEgMTk2IDE0NiAKKzc5IDEwMSAxMjggODAgMjI0IDY1IF4KKzUwMyAxIDU1IDEwMiA5IDMgMjAyIDE1OSAxOSAxMDMgNTYgMjA2IDE2NSA2MCAxNTIgNTQgMTcxIDE1NyAxNjQgMTg1IDI3IDU5IDQ1IAorMTcxIDIxNyA4MCAxMjMgMjAzIDIwMyAyMyAxNjkgNjYgMTkzIDEwMyAxMTYgMTIyIDE1NiA3IDMyIDE2OSA2IDQxIDE2NSAxNzYgMzEgCisxMjUgMiAyMTEgMTU1IDE4OSA5MyA2OSAzMiAxMDkgOTAgNTAgMjI1IDg1IDUzIDEyNyAxNTMgNDUgMTc1IDQwIDEyMSAxNzIgMjAxIAorMTY4IDE1IDM3IDk5IDE2NiA0NCA0IDE4MiAxODggNTMgNzEgNyAxNDggNDggMTMwIDEwOCAxNjYgMjIwIDM1IDggMTIgMTk4IDkzIDkgCis2MyAxNzEgOTcgMTk1IDE5NCA4NyAyMDQgMTQgMTczIDEzMiAyMDMgMTQzIDU0IDIzMSAxMjYgMTAyIDEyNSAxMTggMzcgNDMgMjAgOTQgCis2MCAzNiAxNzUgNDcgOTAgMTEwIDE0MSAyMyAyMjkgMzUgMTg0IDQzIDI0IDE1MyAxNTQgODUgMTczIDEyIDgyIDIxNCAxNzQgMjMyIAorMTE3IDEwNiAxOTEgMTI4IDc3IDE2NCA3NiAxMTcgMTYyIDEwMSAyNSAyMDQgNzQgMTQyIDEyMyAxNDMgMjM0IDMyIDIyOSAyMTEgMjE1IAorMTA1IDMxIDkgMTIzIDg3IDg4IDEzNSAxMDIgNjUgMjAyIDk5IDUwIDE2NSAxMTYgNjIgMTg3IDYyIDY3IDE3NyAxOTEgOCAxOTIgNTIgCisxOTYgMTE4IDIwNiAxMDUgOTEgMjE0IDExNCAyNyAxNzkgMTY2IDEwMCAxNTAgNzkgNzkgMTk5IDg0IDEzIDE4MiAxMjggMTM3IDEzMyAKKzY3IDU3IDE3IDEzMiAyMyA1MyAxODcgMTIyIDM2IDExNSAxMzEgMTUyIDE3MCA1MCA0NSAyMzEgMTg2IDE4IDYzIDExMSAxODEgMjEgMTggCisxNzkgMjI2IDE2IDg4IDE5IDIyMyAyMzAgODIgOTggNTkgMTYxIDUwIDEwNSAyMDAgMTI0IDExIDIwNyA4OSAxNzkgMTA2IDEzMSAyMTIgCisxMzkgMjI0IDIyMSA4NiAxNjQgMTYgMTQ4IDIyNCAxNjEgMTcwIDIyNiA3NiA1NyAxMCAxNjMgODUgMTEzIDk2IDE0NCAzOCAzMCAxOCAKKzExOSAyMSA3OCAxNDggMTY0IDkgMjMyIDUwIDIyMSAyNiAxMiA3OCAyMDggODAgMTgzIDE3MiAxNDEgMTk5IDI0IDQ0IDE5MSAxODggNDYgCisxNTUgNjkgMjA4IDE0MCA5OSAxMTAgODEgNTQgNTUgNDIgNDAgNjUgMjYgNjggNDEgMTA1IDI0IDkzIDE4NSAxNDcgMTgwIDE1NyAxMDQgCisyMTYgODkgMTE5IDEzNyAxOTMgMjE5IDIzMSAxMCAyMjMgMSA1MSAzNiAyMzUgMTYgMjggMTAzIDQ5IDEgMjI3IDEyMCA2MSA3NiAxNzMgCis3MiA1MSAxNTIgMTE0IDg3IDE0OCAxMDQgNDAgNSA1NyA3NyA0OCAxNCAyMjkgOTUgMTAwIDM0IDIwMCA4IDEzMiA4MyAyMiAxNzggNjIgCisxMjcgOTMgMTI5IDEgNDcgMzAgMTk0IDIwMyA4MyAxMzggNCAxODYgMTEgMTQ3IDEyMCA1IDExMyA0MCAxODEgMTQxIDEzOSAxMDggMTA2IAorMTUgOTcgMTUgMTU3IDIyMCA5NSAxNjAgMTg2IDEzOCAxODQgMjIzIDYxIDIwIDI3IDE3NSAxMDcgNiAxMDEgODEgMTE0IDIwNyAzMyAzMyAKKzIwOSA0IDY2IDczIDIxOCA0IDYgMTU3IDQ0IDExIDk4IDE3OSA0NiAyMTUgMjIxIDE0NiAxMzMgNyA4OCA3OSAxMzkgMTY4IDc1IDE4OSAKKzM3IDE1OSAxMzUgMjE4IDE4MCAzNyAyMTkgNTEgMTU2IDEyMCAxODEgMTk3IDQ5IDUgMjMzIDE2MSAxMTAgMjEgMTM4IDY0IDEwMiAxODUgCis4NyAyOCAyMTkgMTExIDEyNSA1OCAxMjEgNTIgODAgMyA4MiAzOCA5MCAxNzAgMTEwIDE5NyAxNjkgMTI2IDE2MiA0MSAxMDkgMzAgMTM0IAorMjM0IDkyIDE0NSAxNDkgMTU1IDEzIDYyIDcgMjA4IDIwMCA2OCA0OCAyMSAxOTggMzMgNDAgMTI1IDE3OCA2IDIxNyAxOTYgMiA5MSAzNCAKKzI0IDIxMyA3MCAyMyAxMTMgMTYxIF4KKzQ3MCAwIDU4IDIxMCAxNSAxMDcgMTQ0IDE1IDE1OSAyMSAxNDIgMTUyIDE1MSAxMzAgNDggMTQgMzQgMTQwIDkyIDIzMSAxOTAgMTA2IAorMTEyIDU0IDE0MiA3IDExNiAyMDggMTkzIDE4NyAxNTkgNzMgMTkgNDEgMTQ0IDY3IDM2IDE0OCAxMzUgNDQgMTg0IDcxIDEwNCAxNTYgCisxMjYgMjE4IDYgNDMgMjA0IDIyNSAyMSA5MCAyMzAgMjQgMTgyIDE1NiAyNiAxMzggMzkgMTg4IDEzOSAxMTIgMTQ3IDYyIDQwIDIxNiAKKzE0MyAzNSA3NSAxMzEgMTIxIDE4IDIgNjggMTYxIDI5IDE4NSAyMDMgMTQ1IDk1IDQwIDcxIDYzIDExMyAyMjAgNjYgOCAxNDQgMjEyIAorMTE2IDExNSAyMjggMTA5IDU5IDEzOCAxNzcgMTA4IDE3MiAxOSA4MiAxODcgMjExIDE4OCAxOTEgMzQgMzYgNTUgMjE1IDExIDM5IDEzNiAKKzI0IDIyMyAxOTkgMTcwIDUyIDgyIDQyIDEzMSAyOCA1MyAxNjIgMTYxIDIyNiAxNDIgMTQgMjMxIDk3IDE0MSA3OSAxOTIgMjA3IDEyMCAKKzE4MyAyMzYgMTQ1IDIzMyAxOTggMTQ5IDIwOCA0OCAxMDcgMjM3IDE3MyAxOTIgMTY2IDc3IDM5IDg0IDEwMiA5NiAyMDYgNDAgNjQgCisxODYgMjI0IDIyNyAxNzQgMjEzIDEwIDExMSAyMTIgMjMgMTUwIDE5NSA5IDEyNCAxMyA2IDEzNiAxMjQgNjUgMTIxIDI1IDExNyAxOTUgCisxMDkgMjA0IDIxOCA5OSAyMDEgNDQgMTMyIDE0OSAyMTUgMTYzIDIzNCAyMzAgMTEwIDIyNSA2MiAxMzMgMTgxIDE3NiAxODAgMTAgMTggCis5IDE4MyA1MCAyMiAxMjIgMTkxIDQxIDE5NiAxODIgMTYzIDE0MSAyNyAzMiA4MCAxMjcgOCAxMCAyMDQgMTMyIDU2IDU3IDEzMCA4OSAKKzU3IDIyMyA1NCA5MCA4NSAyMjcgMjE1IDE4IDE1NCAyNSAyMTAgMTE1IDE4NyA2NiAxMDggMjI0IDEzNCAyMDkgMTgwIDEwMyAxNzYgODcgCis5MCAyMjMgMTQ3IDEwIDE2MyA4OSAxNTAgMTQzIDg3IDIzNSAyMCA2OSAxNDggMjI4IDIwMiAyMTcgMTcxIDM5IDQzIDU5IDE5MCA1NCAKKzIzNSAxNjUgMTQ5IDcwIDgzIDI5IDkyIDY3IDIzMyAxMDUgMjI5IDEzMCAxNDEgMTcyIDExMiAyIDI3IDExOCAxMjMgMzMgMTYwIDggCisxMDMgMTY5IDIxMCAyMDEgMjMwIDE3IDIyIDI5IDMzIDggNTEgOSAzOCAyMDggNTUgMjIyIDEyNiAxNjYgMTI5IDE1NCAyMTEgOTUgMjI2IAorMTk0IDE3NCAxMjAgOTAgNzggNjcgODggMjUgMjQgMzcgNzYgNTkgNDUgMjEyIDMwIDcyIDg0IDE5NSAxNiAxIDE0MCAyMzcgMjggMTU3IAorMTk5IDIyMiAxNjcgMjA5IDM1IDY4IDE2IDIzMiAyNSA2NSA4MCAyMjAgMjExIDQzIDExMSA2NyAxODEgMjI4IDU3IDEzNyAxMSAxODQgCisyMTYgMTg0IDc4IDI2IDQ1IDExOSAxMTAgMjMyIDE3NyAyMiAxMjkgNjggMTY4IDE4OSA3NCAxOTYgMzcgMTI4IDE3NCAxNzIgMjA1IAorMjA1IDYwIDIxOCA1OCAxNTggOTMgMjE4IDE1MSAxMjMgMTcxIDEyNSA4NiAxMCA1OSA1MiAxMzQgMjAyIDIwIDIxNCAyMjggMTk1IDEwMiAKKzQ0IDQ2IDEwNiA3MSAxMSAyMzYgOTMgNzMgNzEgMTU2IDMzIDE1IDIxMSAxMzYgMzEgMTAwIDg4IDE2MyAxODIgNzAgMjIxIDIzMiAxNzAgCisxNDUgMiAxMjAgMzggMTU2IDE3OCA5NSAxMzMgMzYgOTYgMjAgMTU1IDE5MSAxMzQgMTE2IDIyIDcwIDc2IDE1MiAyMDMgNTIgMTc1IDcgCisyMDkgMTI4IDIyNiA0OSA5NCAxOTggMTkwIDEzIDE5MiAyMSAyMzUgNzIgMjI5IDM3IDIyMSAxMzkgMjA1IDExMiAxNDAgMTg1IDE1MSAKKzMwIDIwNiA0NyAxNzkgNzUgMjE3IDEwMSBeCis1MDIgMCAxNTggMTQ4IDY2IDEzIDYwIDk1IDEwMyAzIDE1IDUgMTEzIDM4IDIzIDE4MiAxMjUgNjUgOTQgMTA3IDczIDIyNCAzNyA0NyAKKzEwMiAyMzcgMyAxOTggMTU1IDcgOTUgNTYgMTk4IDE2NSA1MiAxNDggNDYgMTYzIDE1NyAxNTIgMTczIDE5IDU1IDI5IDE2NyAyMTcgNzYgCisxMTUgMjAzIDE5MSAxMSAxNjUgNjIgMTkzIDk5IDExNiAxMjIgMTQ0IDIzNiA3IDI4IDE2MSAyIDI5IDE1NyAxNzIgMjMgMTI1IDIzOCAKKzE5OSAxNTEgMTc3IDg5IDYxIDI0IDEwMSA3OCA1MCAyMTMgNzMgNDEgMTI3IDE1MyA0NSAxNjcgMjQgMTIxIDE2OCAxOTMgMTU2IDMgMjUgCis4NyAxNjYgMjggMjI4IDE3NCAxODggNTMgNjcgMjM5IDE0OCAzNiAxMTggMTA0IDE2MiAyMDggMjcgMjMyIDQgMTk0IDg1IDEgNjMgMTU5IAorOTcgMTkxIDE5NCA3NSAxOTYgMTAgMTY5IDEzMiAxOTkgMTMxIDUwIDIyMyAxMTggOTQgMTE3IDExOCAzNyAyNyAxMiA5NCA2MCAyOCAKKzE3MSA0NyA4MiAxMTAgMTM3IDE1IDIyNSAyMyAxNzIgNDMgMTIgMTQxIDE0MiA4MSAxNjEgMTIgNzQgMjEwIDE2MiAyMjggMTE3IDk4IAorMTg3IDEyNCA2OSAxNjQgNzYgMTA1IDE1OCAxMDEgMjEgMjAwIDcwIDEzMCAxMTEgMTQzIDIzMCAzMiAyMjEgMjAzIDIxMSAxMDEgMzEgNSAKKzEyMyA4MyA3NiAxMzUgOTAgNTcgMTk0IDk1IDQ2IDE1MyAxMTIgNjIgMTgzIDU0IDYzIDE2OSAxNzkgNCAxODQgNDAgMTg4IDExMCAxOTQgCisxMDUgOTEgMjA2IDEwMiAyNyAxNzUgMTU0IDg4IDE0MiA3MSA3OSAxOTkgODQgNSAxNzAgMTI4IDEyOSAxMjUgNTUgNDkgMTcgMTIwIDE5IAorNDUgMTg3IDExNCAyNCAxMTEgMTIzIDE0MCAxNjYgMzggMzMgMjI3IDE3OCAxOCA1OSA5OSAxNzMgOSAxMCAxNzkgMjE0IDEyIDg0IDE1IAorMjE1IDIxOCA4MiA5MCA0NyAxNDkgNDIgOTMgMTg4IDEyMCAyMzkgMTk1IDgxIDE3MSA5NCAxMjcgMjAwIDEyNyAyMjAgMjE3IDg2IDE2MCAKKzE2IDE0NCAyMTYgMTU3IDE2MiAyMTggNzIgNDUgMjM0IDE1OSA3NyAxMDEgODggMTMyIDI2IDI2IDYgMTE5IDEzIDcwIDE0MCAxNTYgCisyMzMgMjIwIDM0IDIxMyAyNiAyMzYgNzQgMjAwIDgwIDE3NSAxNjQgMTMzIDE5NSAyNCA0NCAxOTEgMTg0IDMwIDE0MyA1NyAyMDQgMTQwIAorOTkgMTA2IDc3IDU0IDQzIDQyIDM2IDYxIDE0IDU2IDI1IDk3IDggODEgMTgxIDEzOSAxODAgMTUzIDkyIDIxMiA3NyAxMTEgMTMzIDE4NSAKKzIxOSAyMzEgMjM4IDIxOSAxIDQzIDMyIDIzMSA4IDI0IDkxIDMzIDIzNyAyMjMgMTA4IDQ5IDY0IDE2NSA3MiAzNSAxNTIgMTA2IDg3IAorMTM2IDk2IDMyIDEgNTMgNzcgNDQgMjM4IDIyOSA4MyA5NiAyMiAxOTYgMTI0IDc5IDYgMTY2IDU4IDEyMyA5MyAxMjEgMjI1IDQzIDIyIAorMTg2IDE5NSA3MSAxMjYgNCAxNzQgMjM1IDEzNSAxMjAgMjI5IDExMyAyOCAxODEgMTI5IDEzNSAxMDAgMTAyIDcgODUgMTEgMTQ1IDIxMiAKKzg3IDE1NiAxODYgMTM4IDE4NCAyMjMgNjEgNCAxMSAxNzUgMTA3IDYgODkgODEgMTE0IDIwNyAyMSAxNyAxOTcgMjM2IDU0IDczIDIxNCAKKzIzMiAyMzQgMTQ5IDMyIDExIDk4IDE2NyAzNCAyMDMgMjIxIDE0NiAxMjEgMjM1IDg4IDc1IDEzOSAxNjAgNjMgMTg5IDI5IDE0NyAxMjcgCisyMTAgMTcyIDMzIDIwNyA1MSAxNTIgMTE2IDE2OSAxODkgNDkgMjM3IDIzMyAxNTMgMTAyIDE3IDEzMCA2NCA5OCAxNzcgNzkgMTYgMjExIAorMTExIDExMyA1OCAxMTMgNDggNjggMjM1IDc4IDMwIDg2IDE3MCA5OCAxOTcgMTY5IDEyMiAxNTQgNDEgOTcgMTggMTI2IDIzNCA5MiAKKzE0NSAxNDUgMTU1IDIzNyA1MCAyMDkgXgorNDgxIDEgMjA4IDIwMCA1NiA0OCAyMSAxODYgMjEgNDAgMTE5IDE3OCAyMzYgMjA1IDE5NiAyMjYgNzMgMjIgMTIgMTk1IDY0IDIzIDEwMSAKKzE0NCA1NCAyMDYgMjQxIDEwMyAxMzIgNyAxNTEgMTMgMTM4IDE0MCAxNTEgMTMwIDQwIDIgMzQgMTMyIDgwIDIyMyAxODYgOTQgMTEyIAorNTAgMTM0IDIzNyAxMDQgMjAwIDE4MSAxNzUgMTU5IDYxIDE5IDI5IDE0MCA1NSAzMiAxNDQgMTI3IDM2IDE3MiA1OSAxMDQgMTQ4IDEyNiAKKzIxMCAyNDAgMzUgMjAwIDIyNSA1IDkwIDIzMCAyMCAxNzAgMTQ0IDEwIDEzNCAzOSAxNzYgMTMxIDEwOCAxNDcgNTggMzYgMjE2IDEzMSAKKzM1IDc1IDEyNyAxMDkgMiAyMzIgNjAgMTQ5IDI1IDE4NSAxOTUgMTM3IDk1IDMyIDcxIDU1IDEwNSAyMTYgNTggMjM0IDE0NCAyMDAgCisxMDggMTAzIDIyOCAxMDUgNDcgMTMwIDE2NSAxMDAgMTcyIDcgNzggMTgzIDIwNyAxODQgMTc5IDE4IDM2IDQ3IDIwMyAyMzcgMzEgMTI4IAorOCAyMTkgMTg3IDE2MiA0NCA3NCAzOCAxMzEgMTIgNDkgMTYyIDE2MSAyMTggMTQyIDE0IDIyNyA4OSAxNDEgNzEgMTgwIDIwMyAxMTIgCisxNzUgMjMyIDEzMyAyMjEgMTk4IDE0MSAxOTYgMzYgOTkgMjI5IDE3MyAxOTIgMTU0IDY5IDIzIDgwIDk4IDg4IDE5OCAyNCA1MiAxNzQgCisyMTYgMjI3IDE2MiAyMTMgMiAxMDcgMjA0IDExIDE1MCAxODcgMjM1IDExNiA1IDIzNiAxMzIgMTI0IDUzIDExNyAyMSAxMTMgMTkxIAorMTA5IDE5MiAyMDYgOTUgMjAxIDI4IDEyNCAxNDkgMjE1IDE1OSAyMzAgMjE4IDk4IDIxMyA1NCAxMzMgMTY5IDE3MiAxNzYgNiAxMCA5IAorMTgzIDM4IDE0IDExMCAxODcgMzcgMTg4IDE3OCAxNjMgMTMzIDIzIDI4IDcyIDEyMyA4IDI0MCAyMDQgMTI4IDUyIDQ5IDExOCA4OSA0NSAKKzIxNSA0MiA4NiA4NSAyMTUgMjExIDE0IDE1NCAxNyAyMTAgMTE1IDE3OSA2MiAxMDggMjIwIDEzMCAyMDkgMTcyIDEwMyAxNzYgNzkgODIgCisyMTEgMTM5IDEwIDE1NSA4NSAxNDIgMTM5IDgzIDIyNyAxNiA2OSAxNDAgMjI0IDIwMiAyMTMgMTcxIDM1IDMxIDU1IDE3OCA0NiAyMzEgCisxNjEgMTQ1IDcwIDgzIDI5IDg4IDY3IDIyNSAxMDEgMjE3IDEyNiAxMzcgMTY4IDEwNCAyIDExIDEwNiAxMTUgMzMgMTYwIDQgOTUgMTU3IAorMTk4IDE5MyAyMjIgMSAxOCAxMyAyMSAyMzggNDcgNSAzOCAyMDQgNTUgMjIyIDExOCAxNjIgMTE3IDE0NiAyMTEgODcgMjI2IDE5MCAKKzE2NiAxMTYgNzggNjYgNjMgODAgMjUgMTYgMjUgNjggNTEgMzMgMjEyIDMwIDYwIDc2IDE5NSAxMiAyMzkgMTM2IDIyNSAyOCAxNDUgCisxOTUgMjEwIDE2NyAyMDUgMjcgNTYgNCAyMjAgMTMgNjUgNjggMjIwIDIwMyAzOSAxMDMgNTkgMTc3IDIyMCA1NyAxMzcgMjQxIDE3NiAKKzIwNCAxODAgNzggMTQgMzcgMTE1IDEwNiAyMzIgMTc3IDIyIDEyOSA2OCAxNjggMTc3IDc0IDE4NCAzMyAxMTYgMTc0IDE2NCAyMDEgCisxOTcgNTIgMjE4IDQ2IDE1OCA4OSAyMTQgMTQzIDExMSAxNTkgMTEzIDc0IDIzNiA1OSA1MiAxMjIgMTkwIDIwIDIxNCAyMTYgMTgzIDkwIAorNDAgNDYgMTA2IDYzIDcgMjI0IDg1IDY5IDY3IDE1MiAyOSAxNSAxOTkgMTM2IDI3IDEwMCA3NiAxNTEgMTgyIDY2IDIwOSAyMjQgMTU4IAorMTQxIDI0MCAxMDggMzAgMTU2IDE3NCA5MSAxMjkgMjQgOTYgNCAxNDcgMTgzIDEzNCAxMTIgNiA2MiA2NCAxNDggMTk5IDQwIDE3MSAKKzIzMyAyMDEgMTI0IDIyMiA0NSA5MCAxODYgMTkwIDIzOSAxODggOSAyMzUgNjQgMjIxIDI5IDIxMyAxMjcgMTc4IF4KKzUwOCAxIDk0IDEyMiAxNzMgMTQ1IDYgMjA2IDQxIDE3MyA1NyAxOTkgMTQ2IDE1MCAxMzYgNjYgOSA0OCA4MyA5MSAyMzkgMjQzIDUgCisxMDkgMzAgNyAxNzQgMTEzIDU3IDkwIDk1IDY5IDIyNCAyOSAzOSAxMDIgMjI5IDMgMTk0IDE1MSAyMzkgODcgNTYgMTkwIDE2NSA0NCAKKzE0NCAzOCAxNTUgMTU3IDE0MCAxNjEgMTEgNTEgMTMgMTYzIDIxNyA3MiAxMDcgMjAzIDE3OSAyNDMgMTYxIDU4IDE5MyA5NSAxMTYgCisxMjIgMTMyIDIzNiA3IDI0IDE1MyAyNDIgMTcgMTQ5IDE2OCAxNSAxMjUgMjM4IDE4NyAxNDcgMTY1IDg1IDUzIDE2IDkzIDY2IDUwIAorMjAxIDYxIDI5IDEyNyAxNTMgNDUgMTU5IDggMTIxIDE2NCAxODUgMTQ0IDIzNSAxMyA3NSAxNjYgMTIgMjE2IDE2NiAxODggNTMgNjMgCisyMzUgMTQ4IDI0IDEwNiAxMDAgMTU4IDE5NiAxOSAyMjAgMjQwIDE5MCA3NyAyMzcgNjMgMTQ3IDk3IDE4NyAxOTQgNjMgMTg4IDYgMTY1IAorMTMyIDE5NSAxMTkgNDYgMjE1IDExMCA4NiAxMDkgMTE4IDM3IDExIDQgOTQgNjAgMjAgMTY3IDQ3IDc0IDExMCAxMzMgNyAyMjEgMTEgCisxNjAgNDMgMTI5IDEzMCA3NyAxNDkgMTIgNjYgMjA2IDE1MCAyMjQgMTE3IDkwIDE4MyAxMjAgNjEgMTY0IDc2IDkzIDE1NCAxMDEgMTcgCisxOTYgNjYgMTE4IDk5IDE0MyAyMjYgMzIgMjEzIDE5NSAyMDcgOTcgMzEgMSAxMjMgNzkgNjQgMTM1IDc4IDQ5IDE4NiA5MSA0MiAxNDEgCisxMDggNjIgMTc5IDQ2IDU5IDE2MSAxNjcgMTc2IDI4IDE4MCAxMDIgMTgyIDEwNSA5MSAxOTggOTAgMjcgMTcxIDE0MiA3NiAxMzQgNjMgCis3OSAxOTkgODQgMjQxIDE1OCAxMjggMTIxIDExNyA0MyA0MSAxNyAxMDggMTUgMzcgMTg3IDEwNiAxMiAxMDcgMTE1IDEyOCAxNjIgMjYgCisyMSAyMjMgMTcwIDE4IDU1IDg3IDE2NSAyNDEgMiAxNzkgMjAyIDggODAgMTEgMjA3IDIwNiA4MiA4MiAzNSAxMzcgMzQgODEgMTc2IAorMTE2IDIzMSAxODMgNzMgMTYzIDgyIDEyMyAxODggMTE1IDIxNiAyMTMgODYgMTU2IDE2IDE0MCAyMDggMTUzIDE1NCAyMTAgNjggMzMgCisyMjIgMTU1IDY5IDg5IDgwIDEyMCAxNCAyMiAyMzggMTE5IDUgNjIgMTMyIDE0OCAyMjEgMjA4IDE4IDIwNSAyNiAyMjQgNzAgMTkyIDgwIAorMTY3IDE1NiAxMjUgMTkxIDI0IDQ0IDE5MSAxODAgMTQgMTMxIDQ1IDIwMCAxNDAgOTkgMTAyIDczIDU0IDMxIDQyIDMyIDU3IDIgNDQgOSAKKzg5IDIzNiA2OSAxNzcgMTMxIDE4MCAxNDkgODAgMjA4IDY1IDEwMyAxMjkgMTc3IDIxOSAyMzEgMjMwIDIxNSAxIDM1IDI4IDIyNyAyMCAKKzc5IDE3IDIzNyAyMTkgOTYgMzcgNTIgMTU3IDcyIDE5IDE1MiA5OCA4NyAxMjQgODggMjQgMjQxIDQ5IDc3IDQwIDIyNiAyMjkgNzEgOTIgCisxMCAxOTIgMjM2IDExNiA3NSAyMzQgMTU0IDU0IDExOSA5MyAxMTMgMjEzIDM5IDE0IDE3OCAxODcgNTkgMTE0IDQgMTYyIDIyMyAxMjMgCisxMjAgMjE3IDExMyAxNiAxODEgMTE3IDEzMSA5MiA5OCAyNDMgNzMgNyAxMzMgMjA0IDc5IDE1MiAxODYgMTM4IDE4NCAyMjMgNjEgMjMyIAorMjM5IDE3NSAxMDcgNiA3NyA4MSAxMTQgMjA3IDkgMSAxODUgMjMyIDQyIDczIDIxMCAyMjQgMjI2IDE0MSAyMCAxMSA5OCAxNTUgMjIgCisxOTEgMjIxIDE0NiAxMDkgMjI3IDg4IDcxIDEzOSAxNTIgNTEgMTg5IDIxIDEzNSAxMTkgMjAyIDE2NCAyOSAxOTUgNTEgMTQ4IDExMiAKKzE1NyAxODEgNDkgMjMzIDIzMyAxNDUgOTQgMTMgMTIyIDY0IDk0IDE2OSA3MSA0IDIwMyAxMTEgMTAxIDU4IDEwNSA0NCA1NiAyMzEgNzQgCisyMiA4MiAxNzAgODYgMTk3IDE2OSAxMTggMTQ2IDQxIDg1IDYgMTE4IDIzNCA5MiAxNDUgMTQxIDE0OSBeCis0ODQgMSAyMTkgMzIgMjQzIDIwOCAyMDAgNDggNDggMjEgMTc4IDEzIDQwIDExNSAxNzggMjMyIDE5NyAxOTYgMjE4IDYxIDE0IDQgMTgzIAorNjAgMjMgOTMgMTM2IDUwIDIwMiAyMjkgOTkgMTIwIDI0NSAxNDMgNSAxMzQgMTI4IDE1MSAxMzAgMzIgMjM2IDM0IDEyNCA2OCAyMTUgCisxODIgODIgMTEyIDQ2IDEyNiAyMjkgOTIgMTkyIDE2OSAxNjMgMTU5IDQ5IDE5IDE3IDEzNiA0MyAyOCAxNDAgMTE5IDI4IDE2MCA0NyAKKzEwNCAxNDAgMTI2IDIwMiAyMzYgMjcgMTk2IDIyNSAyMzUgOTAgMjMwIDE2IDE1OCAxMzIgMjQwIDEzMCAzOSAxNjQgMTIzIDEwNCAxNDcgCis1NCAzMiAyMTYgMTE5IDM1IDc1IDEyMyA5NyAyMzIgMjI0IDUyIDEzNyAyMSAxODUgMTg3IDEyOSA5NSAyNCA3MSA0NyA5NyAyMTIgNTAgCisyMjIgMTQ0IDE4OCAxMDAgOTEgMjI4IDEwMSAzNSAxMjIgMTUzIDkyIDE3MiAyNDEgNzQgMTc5IDIwMyAxODAgMTY3IDIgMzYgMzkgMTkxIAorMjI1IDIzIDEyMCAyMzggMjE1IDE3NSAxNTQgMzYgNjYgMzQgMTMxIDI0MiA0NSAxNjIgMTYxIDIxMCAxNDIgMTQgMjIzIDgxIDE0MSA2MyAKKzE2OCAxOTkgMTA0IDE2NyAyMjggMTIxIDIwOSAxOTggMTMzIDE4NCAyNCA5MSAyMjEgMTczIDE5MiAxNDIgNjEgNyA3NiA5NCA4MCAxOTAgCis4IDQwIDE2MiAyMDggMjI3IDE1MCAyMTMgMjQwIDEwMyAxOTYgMjQ1IDE1MCAxNzkgMjIzIDEwOCAyNDMgMjI4IDEyOCAxMjQgNDEgMTEzIAorMTcgMTA5IDE4NyAxMDkgMTgwIDE5NCA5MSAyMDEgMTIgMTE2IDE0OSAyMTUgMTU1IDIyNiAyMDYgODYgMjAxIDQ2IDEzMyAxNTcgMTY4IAorMTcyIDIgMiA5IDE4MyAyNiA2IDk4IDE4MyAzMyAxODAgMTc0IDE2MyAxMjUgMTkgMjQgNjQgMTE5IDggMjMyIDIwNCAxMjQgNDggNDEgCisxMDYgODkgMzMgMjA3IDMwIDgyIDg1IDIwMyAyMDcgMTAgMTU0IDkgMjEwIDExNSAxNzEgNTggMTA4IDIxNiAxMjYgMjA5IDE2NCAxMDMgCisxNzYgNzEgNzQgMTk5IDEzMSAxMCAxNDcgODEgMTM0IDEzNSA3OSAyMTkgMTIgNjkgMTMyIDIyMCAyMDIgMjA5IDE3MSAzMSAxOSA1MSAKKzE2NiAzOCAyMjcgMTU3IDE0MSA3MCA4MyAyOSA4NCA2NyAyMTcgOTcgMjA1IDEyMiAxMzMgMTY0IDk2IDIgMjQxIDk0IDEwNyAzMyAxNjAgCis4NyAxNDUgMTg2IDE4NSAyMTQgMjMxIDE0IDI0MyA5IDIzMCA0MyAxIDM4IDIwMCA1NSAyMjIgMTEwIDE1OCAxMDUgMTM4IDIxMSA3OSAKKzIyNiAxODYgMTU4IDExMiA2NiA1NCA1OSA3MiAyNSA4IDEzIDYwIDQzIDIxIDIxMiAzMCA0OCA2OCAxOTUgOCAyMzkgMTMyIDIxMyAyOCAKKzEzMyAxOTEgMTk4IDE2NyAyMDEgMTkgNDQgMjM4IDIwOCAxIDY1IDU2IDIyMCAxOTUgMzUgOTUgNTEgMTczIDIxMiA1NyAxMzcgMjMzIAorMTY4IDE5MiAxNzYgNzggMiAyOSAxMTEgMTAyIDIzMiAxNzcgMjIgMTI5IDY4IDE2OCAxNjUgNzQgMTcyIDI5IDEwNCAxNzQgMTU2IDE5NyAKKzE4OSA0NCAyMTggMzQgMTU4IDg1IDIxMCAxMzUgOTkgMTQ3IDEwMSA2MiAyMjQgNTkgNTIgMTEwIDE3OCAyMCAyMTQgMjA0IDE3MSA3OCAKKzM2IDQ2IDEwNiA1NSAzIDIxMiA3NyA2NSA2MyAxNDggMjUgMTUgMTg3IDEzNiAyMyAxMDAgNjQgMTM5IDE4MiA2MiAxOTcgMjE2IDE0NiAKKzEzNyAyNDAgOTYgMjIgMTU2IDE3MCA4NyAxMjUgMTIgOTYgMjM0IDEzOSAxNzUgMTM0IDEwOCAyMzYgNTQgNTIgMTQ0IDE5NSAyOCAxNjcgCisyMjEgMTkzIDEyMCAyMTggNDEgODYgMTc0IDE5MCAyMjcgMTg0IDI0MyAyMzUgNTYgMjEzIDIxIDIwNSAxMTUgMjA1IDcxIF4KKzUwNiAwIDExMCAxNjUgMTQxIDIzOCAyMDYgMzcgMTY5IDQ1IDE4NyAxMzQgMTQyIDEyNCA2NiA1IDM2IDcxIDc5IDIzNSAyMzEgNSAxMDUgCisyMiAyMzkgMTY2IDEwMSA0OSA4NiA4MyA2NSAyMjQgMjEgMzEgMTAyIDIyMSAzIDE5MCAxNDcgMjMxIDc5IDU2IDE4MiAxNjUgMzYgMTQwIAorMzAgMTQ3IDE1NyAxMjggMTQ5IDMgNDcgMjQ1IDE1OSAyMTcgNjggOTkgMjAzIDE2NyAyMzUgMTU3IDU0IDE5MyA5MSAxMTYgMTIyIDEyMCAKKzIzNiA3IDIwIDE0NSAyNDIgNSAxNDEgMTY0IDcgMTI1IDIzOCAxNzUgMTQzIDE1MyA4MSA0NSA4IDg1IDU0IDUwIDE4OSA0OSAxNyAxMjcgCisxNTMgNDUgMTUxIDI0MCAxMjEgMTYwIDE3NyAxMzIgMjI3IDEgNjMgMTY2IDI0NCAyMDQgMTU4IDE4OCA1MyA1OSAyMzEgMTQ4IDEyIDk0IAorOTYgMTU0IDE4NCAxMSAyMDggMjM2IDE4NiA2OSAyMzMgNjMgMTM1IDk3IDE4MyAxOTQgNTEgMTgwIDIgMTYxIDEzMiAxOTEgMTA3IDQyIAorMjA3IDEwMiA3OCAxMDEgMTE4IDM3IDI0MyAyNDQgOTQgNjAgMTIgMTYzIDQ3IDY2IDExMCAxMjkgMjQ3IDIxNyAyNDcgMTQ4IDQzIDIzNiAKKzExNyAxMTggNzMgMTM3IDEyIDU4IDIwMiAxMzggMjIwIDExNyA4MiAxNzkgMTE2IDUzIDE2NCA3NiA4MSAxNTAgMTAxIDEzIDE5MiA2MiAKKzEwNiA4NyAxNDMgMjIyIDMyIDIwNSAxODcgMjAzIDkzIDMxIDI0NSAxMjMgNzUgNTIgMTM1IDY2IDQxIDE3OCA4NyAzOCAxMjkgMTA0IAorNjIgMTc1IDM4IDU1IDE1MyAxNTUgMjQ0IDE2OCAxNiAxNzIgOTQgMTcwIDEwNSA5MSAxOTAgNzggMjcgMTY3IDEzMCA2NCAxMjYgNTUgCis3OSAxOTkgODQgMjM3IDE0NiAxMjggMTEzIDEwOSAzMSAzMyAxNyA5NiAxMSAyOSAxODcgOTggMTAzIDEwNyAxMTYgMTU4IDE0IDkgMjE5IAorMTYyIDE4IDUxIDc1IDE1NyAyMzMgMjQyIDE3OSAxOTAgNCA3NiA3IDE5OSAxOTQgODIgNzQgMjMgMTI1IDI2IDY5IDE2NCAxMTIgMjIzIAorMTcxIDY1IDE1NSA3MCAxMTkgMTc2IDEwMyAyMTIgMjA5IDg2IDE1MiAxNiAxMzYgMjAwIDE0OSAxNDYgMjAyIDY0IDIxIDIxMCAxNTEgCis2MSA3NyA3MiAxMDggMiAxOCAyMzAgMTE5IDI0NSA1NCAxMjQgMTQwIDIwOSAxOTYgMiAxOTcgMjYgMjEyIDY2IDE4NCA4MCAxNTkgMTQ4IAorMTE3IDE4NyAyNCA0NCAxOTEgMTc2IDI0NiAxMTkgMzMgMTk2IDE0MCA5OSA5OCA2OSA1NCAxOSA0MiAyOCA1MyAyMzggMzIgMjQxIDgxIAorMjI0IDU3IDE3MyAxMjMgMTgwIDE0NSA2OCAyMDQgNTMgOTUgMTI1IDE2OSAyMTkgMjMxIDIyMiAyMTEgMSAyNyAyNCAyMjMgMjQwIDE2IAorNjcgMSAyMzcgMjE1IDg0IDI1IDQwIDE0OSA3MiAzIDE1MiA5MCA4NyAxMTIgODAgMTYgMjQxIDQ1IDc3IDM2IDIxNCAyMjkgNTkgODggCisyNDYgMTg4IDIzMiAxMDggNzEgMjIyIDE0MiA1MCAxMTUgOTMgMTA1IDIwMSAzNSA2IDE3MCAxNzkgNDcgMTAyIDQgMTUwIDIxMSAxMTEgCisxMjAgMjA1IDExMyA0IDE4MSAxMDUgMTI3IDg0IDk0IDIzOSA2MSAzIDEyMSAxOTYgNzEgMTQ4IDE4NiAxMzggMTg0IDIyMyA2MSAyMjAgCisyMjcgMTc1IDEwNyA2IDY1IDgxIDExNCAyMDcgMjQ1IDIzMyAxNzMgMjI4IDMwIDczIDIwNiAyMTYgMjE4IDEzMyA4IDExIDk4IDE0MyAKKzEwIDE3OSAyMjEgMTQ2IDk3IDIxOSA4OCA2NyAxMzkgMTQ0IDM5IDE4OSAxMyAxMjMgMTExIDE5NCAxNTYgMjUgMTgzIDUxIDE0NCAxMDggCisxNDUgMTczIDQ5IDIyOSAyMzMgMTM3IDg2IDkgMTE0IDY0IDkwIDE2MSA2MyAyNDAgMTk1IDExMSA4OSA1OCA5NyA0MCA0NCAyMjcgNzAgCisxNCA3OCAxNzAgNzQgMTk3IDE2OSAxMTQgMTM4IDQxIDczIDI0MiAxMTAgMjM0IDE3NyBeCis0OTEgMCAxNDUgMTM1IDE1NSAyMDcgMjAgMjQzIDIwOCAyMDAgNDAgNDggMjEgMTcwIDUgNDAgMTExIDE3OCAyMjggMTg5IDE5NiAyMTAgCis0OSA2IDI0NiAxNzEgNTYgMjMgODUgMTI4IDQ2IDE5OCAyMTcgOTUgMTA4IDI0MSAxMzUgMjQ3IDEzMCAxMTYgMTUxIDEzMCAyNCAyMjggCiszNCAxMTYgNTYgMjA3IDE3OCA3MCAxMTIgNDIgMTE4IDIyMSA4MCAxODQgMTU3IDE1MSAxNTkgMzcgMTkgNSAxMzIgMzEgMjQgMTM2IAorMTExIDIwIDE0OCAzNSAxMDQgMTMyIDEyNiAxOTQgMjMyIDE5IDE5MiAyMjUgMjIzIDkwIDIzMCAxMiAxNDYgMTIwIDIyOCAxMjYgMzkgCisxNTIgMTE1IDEwMCAxNDcgNTAgMjggMjE2IDEwNyAzNSA3NSAxMTkgODUgMjIwIDIxNiA0NCAxMjUgMTcgMTg1IDE3OSAxMjEgOTUgMTYgCis3MSAzOSA4OSAyMDggNDIgMjEwIDE0NCAxNzYgOTIgNzkgMjI4IDk3IDIzIDExNCAxNDEgODQgMTcyIDIzMyA3MCAxNzUgMTk5IDE3NiAKKzE1NSAyMzYgMzYgMzEgMTc5IDIxMyAxNSAxMTIgMjI2IDIxMSAxNjMgMTQ2IDI4IDU4IDMwIDEzMSAyMzAgNDEgMTYyIDE2MSAyMDIgCisxNDIgMTQgMjE5IDczIDE0MSA1NSAxNTYgMTk1IDk2IDE1OSAyMjQgMTA5IDE5NyAxOTggMTI1IDE3MiAxMiA4MyAyMTMgMTczIDE5MiAKKzEzMCA1MyAyNDEgNzIgOTAgNzIgMTgyIDI0MiAyOCAxNTAgMjAwIDIyNyAxMzggMjEzIDIzNiA5OSAxODggMjM3IDE1MCAxNzEgMjExIAorMTAwIDIzOSAyMjAgMTI0IDEyNCAyOSAxMDkgMTMgMTA1IDE4MyAxMDkgMTY4IDE4MiA4NyAyMDEgMjQ2IDEwOCAxNDkgMjE1IDE1MSAKKzIyMiAxOTQgNzQgMTg5IDM4IDEzMyAxNDUgMTY0IDE2OCAyNDggMjQ0IDkgMTgzIDE0IDI0OCA4NiAxNzkgMjkgMTcyIDE3MCAxNjMgCisxMTcgMTUgMjAgNTYgMTE1IDggMjI0IDIwNCAxMjAgNDQgMzMgOTQgODkgMjEgMTk5IDE4IDc4IDg1IDE5MSAyMDMgNiAxNTQgMSAyMTAgCisxMTUgMTYzIDU0IDEwOCAyMTIgMTIyIDIwOSAxNTYgMTAzIDE3NiA2MyA2NiAxODcgMTIzIDEwIDEzOSA3NyAxMjYgMTMxIDc1IDIxMSA4IAorNjkgMTI0IDIxNiAyMDIgMjA1IDE3MSAyNyA3IDQ3IDE1NCAzMCAyMjMgMTUzIDEzNyA3MCA4MyAyOSA4MCA2NyAyMDkgOTMgMTkzIDExOCAKKzEyOSAxNjAgODggMiAyMjkgODIgOTkgMzMgMTYwIDI0NiA3OSAxMzMgMTc0IDE3NyAyMDYgMjE5IDEwIDIzMSAyNDcgMjIyIDM5IDI0NyAKKzM4IDE5NiA1NSAyMjIgMTAyIDE1NCA5MyAxMzAgMjExIDcxIDIyNiAxODIgMTUwIDEwOCA1NCA0MiA1NSA2NCAyNSAxIDUyIDM1IDkgCisyMTIgMzAgMzYgNjAgMTk1IDQgMjM5IDEyOCAyMDEgMjggMTIxIDE4NyAxODYgMTY3IDE5NyAxMSAzMiAyMzAgMTk2IDIzOSA2NSA0NCAKKzIyMCAxODcgMzEgODcgNDMgMTY5IDIwNCA1NyAxMzcgMjI1IDE2MCAxODAgMTcyIDc4IDI0MCAyMSAxMDcgOTggMjMyIDE3NyAyMiAxMjkgCis2OCAxNjggMTUzIDc0IDE2MCAyNSA5MiAxNzQgMTQ4IDE5MyAxODEgMzYgMjE4IDIyIDE1OCA4MSAyMDYgMTI3IDg3IDEzNSA4OSA1MCAKKzIxMiA1OSA1MiA5OCAxNjYgMjAgMjE0IDE5MiAxNTkgNjYgMzIgNDYgMTA2IDQ3IDI0OSAyMDAgNjkgNjEgNTkgMTQ0IDIxIDE1IDE3NSAKKzEzNiAxOSAxMDAgNTIgMTI3IDE4MiA1OCAxODUgMjA4IDEzNCAxMzMgMjQwIDg0IDE0IDE1NiAxNjYgODMgMTIxIDk2IDIyMiAxMzEgCisxNjcgMTM0IDEwNCAyMjQgNDYgNDAgMTQwIDE5MSAxNiAxNjMgMjA5IDE4NSAxMTYgMjE0IDM3IDgyIDE2MiAxOTAgMjE1IDE4MCAyMzUgCisyMzUgNDggMjA1IDEzIDE5NyAxMDMgMjA1IDc2IDEwNCAxNjEgMTM5IDIzMiAxNDYgXgorNTE2IDAgMzMgMTY1IDMzIDE3NSAxMjIgMTM0IDExMiA2NiAxIDI0IDU5IDY3IDIzMSAyMTkgNSAxMDEgMTQgMjI3IDE1OCA4OSA0MSA4MiAKKzcxIDYxIDIyNCAxMyAyMyAxMDIgMjEzIDMgMTg2IDE0MyAyMjMgNzEgNTYgMTc0IDE2NSAyOCAxMzYgMjIgMTM5IDE1NyAxMTYgMTM3IAorMjQ3IDQzIDIzMyAxNTUgMjE3IDY0IDkxIDIwMyAxNTUgMjI3IDE1MyA1MCAxOTMgODcgMTE2IDEyMiAxMDggMjM2IDcgMTYgMTM3IDI0MiAKKzI0NSAxMzMgMTYwIDI1MSAxMjUgMjM4IDE2MyAxMzkgMTQxIDc3IDM3IDc3IDQyIDUwIDE3NyAzNyA1IDEyNyAxNTMgNDUgMTQzIDIyOCAKKzEyMSAxNTYgMTY5IDEyMCAyMTkgMjQxIDUxIDE2NiAyMzIgMTkyIDE1MCAxODggNTMgNTUgMjI3IDE0OCA4MiA5MiAxNTAgMTcyIDMgCisxOTYgMjMyIDE4MiA2MSAyMjkgNjMgMTIzIDk3IDE3OSAxOTQgMzkgMTcyIDI1MCAxNTcgMTMyIDE4NyA5NSAzOCAxOTkgOTQgNzAgOTMgCisxMTggMzcgMjMxIDI0MCA5NCA2MCA0IDE1OSA0NyA1OCAxMTAgMTI1IDI0MyAyMTMgMjM5IDEzNiA0MyAyMjggMTA1IDEwNiA2OSAxMjUgCisxMiA1MCAxOTggMTI2IDIxNiAxMTcgNzQgMTc1IDExMiA0NSAxNjQgNzYgNjkgMTQ2IDEwMSA5IDE4OCA1OCA5NCA3NSAxNDMgMjE4IDMyIAorMTk3IDE3OSAxOTkgODkgMzEgMjQ1IDEyMyA3MSA0MCAxMzUgNTQgMzMgMTcwIDgzIDM0IDExNyAxMDAgNjIgMTcxIDMwIDUxIDE0NSAKKzE0MyAyNDQgMTYwIDQgMTY0IDg2IDE1OCAxMDUgOTEgMTgyIDY2IDI3IDE2MyAxMTggNTIgMTE4IDQ3IDc5IDE5OSA4NCAyMzMgMTM0IAorMTI4IDEwNSAxMDEgMTkgMjUgMTcgODQgNyAyMSAxODcgOTAgMjQwIDk5IDk5IDEwNCAxNTQgMiAyNDkgMjE1IDE1NCAxOCA0NyA2MyAKKzE0OSAyMjUgMjM4IDE3OSAxNzggNzIgMyAxOTEgMTgyIDgyIDY2IDExIDExMyAxOCA1NyAxNTIgMTA4IDIxNSAxNTkgNTcgMTQ3IDU4IAorMTE1IDE2NCA5MSAyMDggMjA1IDg2IDE0OCAxNiAxMzIgMTkyIDE0NSAxMzggMTk0IDYwIDkgMTk4IDE0NyA1MyA2NSA2NCA5NiAyNDIgCisxNCAyMjIgMTE5IDI0MSA0NiAxMTYgMTMyIDE5NyAxODQgMjM4IDE4OSAyNiAyMDAgNjIgMTc2IDgwIDE1MSAxNDAgMTA5IDE4MyAyNCAKKzQ0IDE5MSAxNzIgMjM0IDEwNyAyMSAxOTIgMTQwIDk5IDk0IDY1IDU0IDcgNDIgMjQgNDkgMjMwIDIwIDIyOSA3MyAyMTIgNDUgMTY5IAorMTE1IDE4MCAxNDEgNTYgMjAwIDQxIDg3IDEyMSAxNjEgMjE5IDIzMSAyMTQgMjA3IDEgMTkgMjAgMjE5IDIzNiAxMiA1NSAyMzcgMjM3IAorMjExIDcyIDEzIDI4IDE0MSA3MiAyMzkgMTUyIDgyIDg3IDEwMCA3MiA4IDI0MSA0MSA3NyAzMiAyMDIgMjI5IDQ3IDg0IDIzOCAxODQgCisyMjggMTAwIDY3IDIxMCAxMzAgNDYgMTExIDkzIDk3IDE4OSAzMSAyNTAgMTYyIDE3MSAzNSA5MCA0IDEzOCAxOTkgOTkgMTIwIDE5MyAKKzExMyAyNDQgMTgxIDkzIDEyMyA3NiA5MCAyMzUgNDkgMjUxIDEwOSAxODggNjMgMTQ0IDE4NiAxMzggMTg0IDIyMyA2MSAyMDggMjE1IAorMTc1IDEwNyA2IDUzIDgxIDExNCAyMDcgMjM3IDIyMSAxNjEgMjI0IDE4IDczIDIwMiAyMDggMjEwIDEyNSAyNDggMTEgOTggMTMxIDI1MCAKKzE2NyAyMjEgMTQ2IDg1IDIxMSA4OCA2MyAxMzkgMTM2IDI3IDE4OSA1IDExMSAxMDMgMTg2IDE0OCAyMSAxNzEgNTEgMTQwIDEwNCAxMzMgCisxNjUgNDkgMjI1IDIzMyAxMjkgNzggNSAxMDYgNjQgODYgMTUzIDU1IDIzMiAxODcgMTExIDc3IDU4IDg5IDM2IDMyIDIyMyA2NiA2IDc0IAorMTcwIDYyIDE5NyAxNjkgMTEwIDEzMCA0MSA2MSAyMzQgMTAyIDIzNCA5MiAxNDUgMTMzIDE1NSAyMDEgMTQgMjQzIDIwOCAyMDAgMzYgCis0OCAyMSAxNjYgMSA0MCAxMDkgMTc4IDE0NyBeCis1MjIgMCAxNzkgMTk2IDIwMCAzNCAyNTEgMjQxIDE1NiA1MSAyMyA3NSAxMTggNDEgMTkzIDIwMiA5MCA5MyAyMzYgMTI1IDI0MiAxMjUgCisxMDEgMTUxIDEzMCAxNCAyMTggMzQgMTA2IDQxIDE5NyAxNzMgNTUgMTEyIDM3IDEwOCAyMTEgNjUgMTc0IDE0MiAxMzYgMTU5IDIyIDE5IAorMjQ1IDEyNyAxNiAxOSAxMzEgMTAxIDEwIDEzMyAyMCAxMDQgMTIyIDEyNiAxODQgMjI3IDkgMTg3IDIyNSAyMDggOTAgMjMwIDcgMTMxIAorMTA1IDIxMyAxMjEgMzkgMTM3IDEwNSA5NSAxNDcgNDUgMjMgMjE2IDkyIDM1IDc1IDExNCA3MCAyMDUgMjA2IDM0IDExMCAxMiAxODUgCisxNjkgMTExIDk1IDYgNzEgMjkgNzkgMjAzIDMyIDE5NSAxNDQgMTYxIDgyIDY0IDIyOCA5MiA4IDEwNCAxMjYgNzQgMTcyIDIyMyA2NSAKKzE3MCAxOTQgMTcxIDE0MCAyMjEgMzYgMjEgMTY0IDE5OCA1IDEwMiAyMTEgMjA2IDE0OCAxMzYgMTggNDggMjUgMTMxIDIxNSAzNiAxNjIgCisxNjEgMTkyIDE0MiAxNCAyMTQgNjMgMTQxIDQ1IDE0MSAxOTAgODYgMTQ5IDIxOSA5NCAxODIgMTk4IDExNSAxNTcgMjUyIDczIDIwMyAKKzE3MyAxOTIgMTE1IDQzIDIyNiA2NyA4NSA2MiAxNzIgMjI3IDEzIDEzNSAxOTAgMjI3IDEyMyAyMTMgMjMxIDk0IDE3OCAyMjcgMTUwIAorMTYxIDE5NiA5MCAyMzQgMjEwIDExOSAxMjQgMTQgMTA0IDggMTAwIDE3OCAxMDkgMTUzIDE2NyA4MiAyMDEgMjMxIDk4IDE0OSAyMTUgCisxNDYgMjE3IDE3OSA1OSAxNzQgMjggMTMzIDEzMCAxNTkgMTYzIDI0OCAyMzkgOSAxODMgMjU0IDI0MyA3MSAxNzQgMjQgMTYyIDE2NSAKKzE2MyAxMDcgMTAgMTUgNDYgMTEwIDggMjE0IDIwNCAxMTUgMzkgMjMgNzkgODkgNiAxODkgMyA3MyA4NSAxNzYgMTk4IDEgMTU0IDI0NiAKKzIxMCAxMTUgMTUzIDQ5IDEwOCAyMDcgMTE3IDIwOSAxNDYgMTAzIDE3NiA1MyA1NiAxNzIgMTEzIDEwIDEyOSA3MiAxMTYgMTI2IDcwIAorMjAxIDMgNjkgMTE0IDIxMSAyMDIgMjAwIDE3MSAyMiAyNDcgNDIgMTM5IDIwIDIxOCAxNDggMTMyIDcwIDgzIDI5IDc1IDY3IDE5OSA4OCAKKzE3OCAxMTMgMTI0IDE1NSA3OCAyIDIxNCA2NyA4OSAzMyAxNjAgMjQ2IDY5IDExOCAxNTkgMTY3IDE5NiAyMDQgNSAyMTYgMjM3IDIxMiAKKzM0IDI0NyAzOCAxOTEgNTUgMjIyIDkyIDE0OSA3OCAxMjAgMjExIDYxIDIyNiAxNzcgMTQwIDEwMyAzOSAyNyA1MCA1NCAyNSAyNDUgCisyNDEgNDIgMjUgMjQ5IDIxMiAzMCAyMSA1MCAxOTUgMjU0IDIzOSAxMjMgMTg2IDI4IDEwNiAxODIgMTcxIDE2NyAxOTIgMSAxNyAyMjAgCisxODEgMjI5IDY1IDI5IDIyMCAxNzcgMjYgNzcgMzMgMTY0IDE5NCA1NyAxMzcgMjE1IDE1MCAxNjUgMTY3IDc4IDIzMCAxMSAxMDIgOTMgCisyMzIgMTc3IDIyIDEyOSA2OCAxNjggMTM4IDc0IDE0NSAyMCA3NyAxNzQgMTM4IDE4OCAxNzEgMjYgMjE4IDcgMTU4IDc2IDIwMSAxMTcgCis3MiAxMjAgNzQgMzUgMTk3IDU5IDUyIDgzIDE1MSAyMCAyMTQgMTc3IDE0NCA1MSAyNyA0NiAxMDYgMzcgMjQ5IDE4NSA1OSA1NiA1NCAKKzEzOSAxNiAxNSAxNjAgMTM2IDE0IDEwMCAzNyAxMTIgMTgyIDUzIDE3MCAxOTggMTE5IDEyOCAyNDAgNjkgNCAxNTYgMTYxIDc4IDExNiAKKzI0MCA5NiAyMDcgMTIxIDE1NyAxMzQgOTkgMjA5IDM2IDI1IDEzNSAxODYgMSAxNTggMTk0IDE3NSAxMTEgMjA5IDMyIDc3IDE0NyAxOTAgCisyMDAgMTc1IDIyNSAyMzUgMzggMTk1IDMgMTg3IDg4IDIwNSA2MSA4OSAxNTEgMTM0IDIxNyAyMDYgMzAgMTYyIDI0IDE2NiAxMTMgMTI4IAorMTAzIDY2IDI1MyAxNSA1MCA1OCAyMjggMjEwIDUgOTggOCAyMTggMTUyIDgwIDM1IDc5IDYyIDU4IDIyNCA3IDE3IDEwMiAyMDcgMyAKKzE4MyAxNDAgMjE3IDY1IDU2IDE2OCAxNjUgMjIgMTMzIDE2IDEzMyAxNTcgMTA3IDEyOCAyNDQgMTIgXgorNTE3IDEgMjE4IDE1MCAyMTcgNTkgODEgMjAzIDE0MCAyMTcgMTQ4IDQ1IDE5MyA4MiAxMTYgMTIyIDkzIDIzNiA3IDExIDEyNyAyNDIgCisyMzUgMTIzIDE1NSAyNDYgMTI1IDIzOCAxNDggMTM0IDEyNiA3MiAyNyAyNDcgNjcgMjcgNTAgMTYyIDIyIDI0NyAxMjcgMTUzIDQ1IAorMTMzIDIxMyAxMjEgMTUxIDE1OSAxMDUgMjA5IDIzMSAzNiAxNjYgMjE3IDE3NyAxNDAgMTg4IDUzIDUwIDIyMiAxNDggMjQyIDY3IDg3IAorMTQ1IDE1NyAyNTAgMTgxIDIyNyAxNzcgNTEgMjI0IDYzIDEwOCA5NyAxNzQgMTk0IDI0IDE2MiAyNTAgMTUyIDEzMiAxODIgODAgMzMgCisxODkgODQgNjAgODMgMTE4IDM3IDIxNiAyMzUgOTQgNjAgMjUxIDE1NCA0NyA0OCAxMTAgMTIwIDIzOCAyMDggMjI5IDEyMSA0MyAyMTggCis5MCA5MSA2NCAxMTAgMTIgNDAgMTkzIDExMSAyMTEgMTE3IDY0IDE3MCAxMDcgMzUgMTY0IDc2IDU0IDE0MSAxMDEgNCAxODMgNTMgNzkgCis2MCAxNDMgMjEzIDMyIDE4NyAxNjkgMTk0IDg0IDMxIDI0NSAxMjMgNjYgMjUgMTM1IDM5IDIzIDE2MCA3OCAyOSAxMDIgOTUgNjIgMTY2IAorMjAgNDYgMTM1IDEyOCAyNDQgMTUwIDI0NiAxNTQgNzYgMTQzIDEwNSA5MSAxNzIgNTEgMjcgMTU4IDEwMyAzNyAxMDggMzcgNzkgMTk5IAorODQgMjI4IDExOSAxMjggOTUgOTEgNCAxNSAxNyA2OSAyIDExIDE4NyA4MCAyMzAgOTQgODkgODkgMTQ5IDI0NCAyMzkgMjEwIDE0NCAxOCAKKzQyIDQ4IDEzOSAyMTUgMjMzIDE3OSAxNjMgMjUyIDY3IDI1NSAxODEgMTY3IDgyIDU2IDI1MyA5OCA4IDQyIDEzNyAxMDMgMjA1IDE0NCAKKzQ3IDEzNyA0MyAxMTAgMTQ5IDc2IDIwMyAyMDAgODYgMTQzIDE2IDEyNyAxODIgMTQwIDEyOCAxODQgNTUgMjUxIDE4MyAxNDIgNDMgNTAgCis1NCA4MSAyMzIgOSAyMTIgMTE5IDIzNiAzNiAxMDYgMTIyIDE4MiAxNjkgMjIzIDE3OSAyNiAxODUgNTcgMTY2IDgwIDE0MSAxMzAgOTkgCisxNzggMjQgNDQgMTkxIDE2NyAyMTkgOTIgNiAxODcgMTQwIDk5IDg5IDYwIDU0IDI0OSA0MiAxOSA0NCAyMjAgNSAyMTQgNjMgMTk3IDMwIAorMTY0IDEwNSAxODAgMTM2IDQxIDE5NSAyNiA3NyAxMTYgMTUxIDIxOSAyMzEgMjA0IDIwMiAxIDkgMTUgMjE0IDIzMSA3IDQwIDIyMiAKKzIzNyAyMDYgNTcgMjU1IDEzIDEzMSA3MiAyMjQgMTUyIDcyIDg3IDg1IDYyIDI1NSAyNDEgMzYgNzcgMjcgMTg3IDIyOSAzMiA3OSAyMjggCisxNzkgMjIzIDkwIDYyIDE5NSAxMTUgNDEgMTA2IDkzIDg3IDE3NCAyNiAyNDUgMTUyIDE2MSAyMCA3NSA0IDEyMyAxODQgODQgMTIwIAorMTc4IDExMyAyMzQgMTgxIDc4IDExOCA2NiA4NSAyMzAgMzQgMjUxIDk0IDE3OCA1MyAxMzkgMTg2IDEzOCAxODQgMjIzIDYxIDE5MyAKKzIwMCAxNzUgMTA3IDYgMzggODEgMTE0IDIwNyAyMjcgMjA2IDE0NiAyMTkgMyA3MyAxOTcgMTk4IDIwMCAxMTUgMjM4IDExIDk4IDExNiAKKzI0MCAxNTIgMjIxIDE0NiA3MCAyMDEgODggNTggMTM5IDEyNiAxMiAxODkgMjUyIDk2IDkzIDE3NiAxMzggMTYgMTU2IDUxIDEzNSA5OSAKKzExOCAxNTUgNDkgMjIwIDIzMyAxMTkgNjggOTYgNjQgODEgMTQzIDQ1IDIyMiAxNzcgMTExIDYyIDU4IDc5IDMxIDE3IDIxOCA2MSAyNTMgCis2OSAxNzAgNDcgMTk3IDE2OSAxMDUgMTIwIDQxIDQ2IDIyNCA5MiAyMzQgOTIgMTQ1IDEyOCAxNTUgMTg2IDI1NiAyNDMgMjA4IDIwMCAKKzI2IDQ4IDIxIDE1NiAyNDggNDAgMTA0IDE3OCAyMjEgMTc1IDE5NiAxOTYgMjggMjQ5IDIzOSAxNTAgNDkgMjMgNzEgMTE0IDM5IDE5MSAKKzE5NiA4OCA4NyAyMzQgMTIxIDI0MCAxMjMgOTUgMTUxIDEzMCAxMCAyMTQgMzQgMTAyIDM1IDE5MyAxNzEgNDkgMTEyIDM1IDEwNCAyMDcgCis1OSAxNzAgMTM2IDEzMCAxNTkgMTYgMTkgMjQxIDEyNSAyMTMgXgorNTI5IDEgMTUgMTI3IDkzIDIgMTIxIDggMTA0IDExNCAxMjYgMTc2IDIyMyAxIDE4MyAyMjUgMTk2IDkwIDIzMCAzIDExOSA5MyAyMDEgCisxMTcgMzkgMTI1IDk3IDkxIDE0NyA0MSAxOSAyMTYgODAgMzUgNzUgMTEwIDU4IDE5MyAxOTggMjYgOTggOCAxODUgMTYxIDEwMyA5NSAKKzI1NyA3MSAyMSA3MSAxOTkgMjQgMTgzIDE0NCAxNDkgNzQgNTIgMjI4IDg4IDI1NSA5NiAxMTQgNjYgMTcyIDIxNSA2MSAxNjYgMTkwIAorMTY3IDEyOCAyMDkgMzYgMTMgMTUyIDE4NiAyNTYgOTQgMTk5IDIwMiAxMzYgMTI4IDEwIDQwIDIxIDEzMSAyMDMgMzIgMTYyIDE2MSAKKzE4NCAxNDIgMTQgMjEwIDU1IDE0MSAzNyAxMjkgMTg2IDc4IDE0MSAyMTUgODIgMTcwIDE5OCAxMDcgMTQ1IDI0NCA2NSAxOTUgMTczIAorMTkyIDEwMyAzNSAyMTQgNjMgODEgNTQgMTY0IDIxNSAxIDEyMyAxODIgMjI3IDExMSAyMTMgMjI3IDkwIDE3MCAyMTkgMTUwIDE1MyAKKzE4NCA4MiAyMzAgMjAyIDExNSAxMjQgMiAxMDAgNCA5NiAxNzQgMTA5IDE0MSAxNTUgNzggMjAxIDIxOSA5MCAxNDkgMjE1IDE0MiAyMTMgCisxNjcgNDcgMTYyIDIwIDEzMyAxMTggMTU1IDE1OSAyNDggMjM1IDkgMTgzIDI0NiAyMzkgNTkgMTcwIDIwIDE1NCAxNjEgMTYzIDk5IDYgCisxMSAzOCAxMDYgOCAyMDYgMjA0IDExMSAzNSAxNSA2NyA4OSAyNTMgMTgxIDI1MCA2OSA4NSAxNjQgMTk0IDI1NiAxNTQgMjQyIDIxMCAKKzExNSAxNDUgNDUgMTA4IDIwMyAxMTMgMjA5IDEzOCAxMDMgMTc2IDQ1IDQ4IDE2MCAxMDUgMTAgMTIxIDY4IDEwOCAxMjIgNjYgMTkzIAorMjU4IDY5IDEwNiAyMDcgMjAyIDE5NiAxNzEgMTggMjM5IDM4IDEyNyAxMiAyMTQgMTQ0IDEyOCA3MCA4MyAyOSA3MSA2NyAxOTEgODQgCisxNjYgMTA5IDEyMCAxNTEgNzAgMiAyMDIgNTUgODEgMzMgMTYwIDI0NiA2MSAxMDYgMTQ3IDE1OSAxODggMTkyIDEgMjA0IDIyOSAyMDQgCiszMCAyNDcgMzggMTg3IDU1IDIyMiA4NCAxNDUgNjYgMTEyIDIxMSA1MyAyMjYgMTczIDEzMiA5OSAyNyAxNSA0NiA0NiAyNSAyNDEgMjMzIAorMzQgMTcgMjQxIDIxMiAzMCA5IDQyIDE5NSAyNTQgMjM5IDExOSAxNzQgMjggOTQgMTc4IDE1OSAxNjcgMTg4IDI1MiA1IDIxMiAxNjkgCisyMjEgNjUgMTcgMjIwIDE2OSAyMiA2OSAyNSAxNjAgMTg2IDU3IDEzNyAyMDcgMTQyIDE1MyAxNjMgNzggMjIyIDMgOTggODkgMjMyIAorMTc3IDIyIDEyOSA2OCAxNjggMTI2IDc0IDEzMyAxNiA2NSAxNzQgMTMwIDE4NCAxNjMgMTggMjE4IDI1NCAxNTggNzIgMTk3IDEwOSA2MCAKKzEwOCA2MiAyMyAxODUgNTkgNTIgNzEgMTM5IDIwIDIxNCAxNjUgMTMyIDM5IDIzIDQ2IDEwNiAyOSAyNDkgMTczIDUxIDUyIDUwIDEzNSAKKzEyIDE1IDE0OCAxMzYgMTAgMTAwIDI1IDEwMCAxODIgNDkgMTU4IDE5MCAxMDcgMTI0IDI0MCA1NyAyNTUgMTU2IDE1NyA3NCAxMTIgCisyMzIgOTYgMTk1IDExMyAxNDkgMTM0IDk1IDE5NyAyOCAxMyAxMzEgMTgyIDI0OCAxNTQgMTgyIDE2NyAxMDcgMjA1IDI4IDczIDEzNSAKKzE5MCAxODggMTcxIDIxNyAyMzUgMzAgMTg3IDI1NCAxNzkgNzYgMjA1IDQ5IDc3IDE0MyAxMzAgMjA1IDIwNiAyNiAxNTggMTIgMTU0IAorMTAxIDEyMCA5MSA2NiAyNTMgMyAzOCA0NiAyMjQgMTk4IDUgOTQgMjA2IDE0NCA2OCAyNyA3NSA1MCA1NCAyMjQgMjU4IDkgMTAyIDE5OSAKKzMgMTc5IDEzNiAyMDkgNTcgNTYgMTYwIDE2NSAxNCAxMjkgOCAxMjUgMTU3IDk1IDExNiAyNDAgMzYgMjEyIDE0OCAyMTcgNTcgNzcgCisyMDMgMTM0IDIxMyAxNDYgNDMgMTkzIDgwIDExNiAxMjIgODcgMjM2IDcgOSAxMjMgMjQyIDIzMSAxMTkgMTUzIDI0NCAxMjUgMjM4IAorMTQyIDEzMiAxMjAgNzAgMjMgMjQ1IDYzIDIxIDUwIDE1NiAxNiAyNDMgMTI3IDE1MyA0NSAxMjkgMjA3IDEyMSAxNDkgMTU1IDk5IDIwNSAKKzIyNyAzMCAxNjYgMjExIDU3IF4KKzU0OCAwIDEzNCAxODggNTMgNDcgMjE5IDE0OCAyMzYgNTggODQgMTQyIDE0OCAyNDcgMTcyIDIyNCAxNzQgNDUgMjIxIDYzIDk5IDk3IAorMTcxIDE5NCAxNSAxNTYgMjUwIDE0OSAxMzIgMTc5IDcxIDMwIDE4MyA3OCA1NCA3NyAxMTggMzcgMjA3IDIzMiA5NCA2MCAyNDggMTUxIAorNDcgNDIgMTEwIDExNyAyMzUgMjA1IDIyMyAxMTIgNDMgMjEyIDgxIDgyIDYxIDEwMSAxMiAzNCAxOTAgMTAyIDIwOCAxMTcgNTggMTY3IAorMTA0IDI5IDE2NCA3NiA0NSAxMzggMTAxIDEgMTgwIDUwIDcwIDUxIDE0MyAyMTAgMzIgMTgxIDE2MyAxOTEgODEgMzEgMjQ1IDEyMyA2MyAKKzE2IDEzNSAzMCAxNyAxNTQgNzUgMjYgOTMgOTIgNjIgMTYzIDE0IDQzIDEyOSAxMTkgMjQ0IDE0NCAyNDAgMTQ4IDcwIDEzNCAxMDUgOTEgCisxNjYgNDIgMjcgMTU1IDk0IDI4IDEwMiAzMSA3OSAxOTkgODQgMjI1IDExMCAxMjggODkgODUgMjU1IDkgMTcgNjAgMjU5IDUgMTg3IDc0IAorMjI0IDkxIDgzIDgwIDE0NiAyMzggMjMzIDIwNyAxMzggMTggMzkgMzkgMTMzIDIwOSAyMzAgMTc5IDE1NCAyNTIgNjQgMjU1IDE3NSAKKzE1OCA4MiA1MCAyNDcgODkgMiAzMyAxMjggMTAwIDE5OSAxMzUgNDEgMTMxIDM0IDEwNyAxNDAgNjcgMjAwIDE5NyA4NiAxNDAgMTYgCisxMjQgMTc2IDEzNyAxMjIgMTc4IDUyIDI0NSAxNzQgMTM5IDM3IDQxIDQ4IDcyIDIyNiA2IDIwNiAxMTkgMjMzIDMwIDEwMCAxMTYgMTczIAorMTYwIDIxNCAxNzMgMjYgMTc2IDU0IDE2MCA4MCAxMzUgMTI0IDkzIDE3NSAyNCA0NCAxOTEgMTY0IDIxMCA4MyAyNTcgMTg0IDE0MCA5OSAKKzg2IDU3IDU0IDI0MyA0MiAxNiA0MSAyMTQgMjU2IDIwNSA1NyAxODggMjEgMTYxIDk5IDE4MCAxMzMgMzIgMTkyIDE3IDcxIDExMyAxNDUgCisyMTkgMjMxIDE5OCAxOTkgMSAzIDEyIDIxMSAyMjggNCAzMSAyMTMgMjM3IDIwMyA0OCAyNDkgNCAxMjUgNzIgMjE1IDE1MiA2NiA4NyAKKzc2IDU2IDI1MiAyNDEgMzMgNzcgMjQgMTc4IDIyOSAyMyA3NiAyMjIgMTc2IDIyMCA4NCA1OSAxODYgMTA2IDM4IDEwMyA5MyA4MSAxNjUgCisyMyAyNDIgMTQ2IDE1NSAxMSA2NiA0IDExNCAxNzUgNzUgMTIwIDE2OSAxMTMgMjI4IDE4MSA2OSAxMTUgNjAgODIgMjI3IDI1IDI1MSAKKzg1IDE3MiA0NyAxMzYgMTg2IDEzOCAxODQgMjIzIDYxIDE4NCAxOTEgMTc1IDEwNyA2IDI5IDgxIDExNCAyMDcgMjIxIDE5NyAxMzcgCisyMTYgMjU0IDczIDE5NCAxOTIgMTk0IDEwOSAyMzIgMTEgOTggMTA3IDIzNCAxNDMgMjIxIDE0NiA2MSAxOTUgODggNTUgMTM5IDEyMCAzIAorMTg5IDI0OSA4NyA4NyAxNzAgMTMyIDEzIDE0NyA1MSAxMzIgOTYgMTA5IDE0OSA0OSAyMTcgMjMzIDExMyA2MiAyNTcgOTAgNjQgNzggCisxMzcgMzkgMjE2IDE3MSAxMTEgNTMgNTggNzMgMjggOCAyMTUgNTggMjUwIDY2IDE3MCAzOCAxOTcgMTY5IDEwMiAxMTQgNDEgMzcgMjE4IAorODYgMjM0IDkyIDE0NSAxMjUgMTU1IDE3NyAyNTAgMjQzIDIwOCAyMDAgMjAgNDggMjEgMTUwIDI0NSA0MCAxMDEgMTc4IDIxOCAxNjkgCisxOTYgMTkwIDE5IDI0NiAyMzYgMTQxIDQ2IDIzIDY1IDEwOCAzNiAxODggMTg3IDg1IDc4IDIzMSAxMTUgMjM3IDEyMCA4NiAxNTEgMTMwIAorNCAyMDggMzQgOTYgMjYgMTg3IDE2OCA0MCAxMTIgMzIgOTggMjAxIDUwIDE2NCAxMjcgMTIxIDE1OSA3IDE5IDIzNSAxMjIgMSAxNCAKKzEyNiA5MSAxMTggNSAxMDQgMTEyIDEyNiAxNzQgMjIyIDI1OSAxODIgMjI1IDE5MyA5MCAyMzAgMiAxMTYgOTAgMTk4IDExNiAzOSAxMjIgCis5NSA5MCAxNDcgNDAgMTggMjE2IDc3IDM1IDc1IDEwOSA1NSAxOTAgMTk2IDI0IDk1IDcgMTg1IDE1OSAxMDEgOTUgMjU2IDcxIDE5IDY5IAorMTk4IDIyIDE4MCAxNDQgMTQ2IDcyIDQ5IDIyOCA4NyAyNTMgOTQgMTExIDY0IDE3MiAyMTMgNjAgMTY1IDE4OSAxNjYgMTI1IDIwNiAzNiAKKzExIDE0OSAxODMgMjU1IDkyIDE5NiAyMDEgMTMzIDEyNiA4IDM4IDIwIDEzMSAyMTMgXgorNTQ3IDAgMjkgMTYyIDE2MSAxNzggMTQyIDE0IDIwNyA0OSAxNDEgMzEgMTIwIDE4MyA3MiAxMzUgMjEyIDczIDE2MSAxOTggMTAxIDEzNiAKKzIzOCA1OSAxODkgMTczIDE5MiA5NCAyOSAyMDUgNjAgNzggNDggMTU4IDIwNiAyNTQgMTE0IDE3NiAyMjcgMTAyIDIxMyAyMjQgODcgCisxNjQgMjEzIDE1MCAxNDcgMTc1IDc2IDIyNyAxOTYgMTEyIDEyNCAyNTUgOTcgMSA5MyAxNzEgMTA5IDEzMiAxNDYgNzUgMjAxIDIxMCAKKzg0IDE0OSAyMTUgMTM5IDIxMCAxNTggMzggMTUzIDE0IDEzMyAxMDkgMTUyIDE1NiAyNDggMjMyIDkgMTgzIDI0MCAyMzYgNTAgMTY3IAorMTcgMTQ4IDE1OCAxNjMgOTMgMyA4IDMyIDEwMyA4IDIwMCAyMDQgMTA4IDMyIDkgNTggODkgMjQ3IDE3NSAyNDQgNjYgODUgMTU1IDE5MSAKKzI1NiAxNTQgMjM5IDIxMCAxMTUgMTM5IDQyIDEwOCAyMDAgMTEwIDIwOSAxMzIgMTAzIDE3NiAzOSA0MiAxNTEgOTkgMTAgMTE1IDY1IAorMTAyIDExOSA2MyAxODcgMjU4IDY5IDEwMCAyMDQgMjAyIDE5MyAxNzEgMTUgMjMzIDM1IDExOCA2IDIxMSAxNDEgMTI1IDcwIDgzIDI5IAorNjggNjcgMTg1IDgxIDE1NyAxMDYgMTE3IDE0OCA2NCAyIDE5MyA0NiA3NSAzMyAxNjAgMjQ2IDU1IDk3IDEzOCAxNTMgMTgyIDE4MyAKKzI2MCAxOTUgMjIzIDE5OCAyNyAyNDcgMzggMTg0IDU1IDIyMiA3OCAxNDIgNTcgMTA2IDIxMSA0NyAyMjYgMTcwIDEyNiA5NiAxOCA2IAorNDMgNDAgMjUgMjM4IDIyNyAyOCAxMSAyMzUgMjEyIDMwIDM2IDE5NSAyNTQgMjM5IDExNiAxNjUgMjggODUgMTc1IDE1MCAxNjcgMTg1IAorMjQ5IDI1OCAyMDYgMTYwIDIxNSA2NSA4IDIyMCAxNjMgMTkgNjMgMTkgMTU3IDE4MCA1NyAxMzcgMjAxIDEzNiAxNDQgMTYwIDc4IDIxNiAKKzI1OSA5NSA4NiAyMzIgMTc3IDIyIDEyOSA2OCAxNjggMTE3IDc0IDEyNCAxMyA1NiAxNzQgMTI0IDE4MSAxNTcgMTIgMjE4IDI0OCAxNTggCis2OSAxOTQgMTAzIDUxIDk5IDUzIDE0IDE3NiA1OSA1MiA2MiAxMzAgMjAgMjE0IDE1NiAxMjMgMzAgMjAgNDYgMTA2IDIzIDI0OSAxNjQgCis0NSA0OSA0NyAxMzIgOSAxNSAxMzkgMTM2IDcgMTAwIDE2IDkxIDE4MiA0NiAxNDkgMTg0IDk4IDEyMSAyNDAgNDggMjUyIDE1NiAxNTQgCis3MSAxMDkgMjI2IDk2IDE4NiAxMDcgMTQzIDEzNCA5MiAxODggMjIgNCAxMjggMTc5IDI0MiAxNTEgMTczIDE2MSAxMDQgMjAyIDI1IDcwIAorMTI2IDE5MCAxNzkgMTY4IDIxMSAyMzUgMjQgMTgxIDI1MSAxNzMgNjcgMjA1IDQwIDY4IDEzNyAxMjcgMTk2IDIwNiAyMyAxNTUgMyAKKzE0NSA5MiAxMTQgODIgNjYgMjUzIDI1NiAyOSAzNyAyMjEgMTg5IDUgOTEgMjU2IDE5NyAxMzggNTkgMjEgNzIgNDEgNTEgMjI0IDI1NSAKKzMgMTAyIDE5MyAzIDE3NiAxMzMgMjAzIDUxIDU2IDE1NCAxNjUgOCAxMjYgMiAxMTkgMTU3IDg2IDEwNyAyMzcgMzMgMjAzIDE0NSAyMTcgCis1NCA3MSAyMDMgMTI1IDIwNyAxNDMgNDAgMTkzIDc3IDExNiAxMjIgNzggMjM2IDcgNiAxMTcgMjQyIDIyNSAxMTMgMTUwIDI0MSAxMjUgCisyMzggMTMzIDEyOSAxMTEgNjcgMTcgMjQyIDU3IDEyIDUwIDE0NyA3IDIzNyAxMjcgMTUzIDQ1IDEyMyAxOTggMTIxIDE0NiAxNDkgOTAgCisxOTkgMjIxIDIxIDE2NiAyMDIgMTYyIDEzMCAxODggNTMgNDUgMjE3IDE0OCAyMzIgNTIgODIgMTQwIDE0MiAyNDUgMTY2IDIyMiAxNzIgCis0MSAyMTkgNjMgOTMgOTcgMTY5IDE5NCA5IDE1MiAyNTAgMTQ3IDEzMiAxNzcgNjUgMjggMTc5IDc0IDUwIDczIDExOCAzNyAyMDEgMjMwIAorOTQgNjAgMjQ2IDE0OSA0NyAzOCAxMTAgMTE1IDIzMyAyMDMgMjE5IDEwNiA0MyAyMDggNzUgNzYgNTkgOTUgMTIgMzAgMTg4IDk2IDIwNiAKKzExNyA1NCAxNjUgMTAyIDI1IDE2NCA3NiAzOSAxMzYgMTAxIDI2MSAxNzggNDggNjQgNDUgMTQzIDIwOCAzMiAxNzcgMTU5IDE4OSA3OSAKKzMxIDI0NSAxMjMgNjEgMTAgMTM1IDI0IDEzIDE1MCA3MyAyNCA4NyA5MCA2MiAxNjEgMTAgNDEgMTI1IDIwOSBeCis1NDIgMSAyNDQgMTM2IDIzMiAxNDAgNjIgMTIyIDEwNSA5MSAxNTggMzAgMjcgMTUxIDgyIDE2IDk0IDIzIDc5IDE5OSA4NCAyMjEgOTggCisxMjggODEgNzcgMjQ3IDEgMTcgNDggMjU5IDI2MSAxODcgNjYgMjE2IDg3IDc1IDY4IDE0MiAyMzAgMjI1IDIwMyAxMzAgMTggMzUgMjcgCisxMjUgMjAxIDIyNiAxNzkgMTQyIDI1MiA2MCAyNTUgMTY3IDE0NiA4MiA0MiAyMzkgNzcgMjU4IDIxIDExNiA5NiAxOTEgMTIzIDMzIAorMTIzIDIyIDEwMyAxMjggNTUgMTk2IDE5MyA4NiAxMzYgMTYgMTIwIDE2OCAxMzMgMTE0IDE3MCA0OCAyMzcgMTYyIDEzNSAyOSAyOSA0MCAKKzYwIDIxOCAyIDE5OCAxMTkgMjI5IDIyIDkyIDEwOCAxNjEgMTQ4IDIwMiAxNjUgMjYgMTY0IDUwIDE1MiA4MCAxMjcgMTE2IDg1IDE3MSAKKzI0IDQ0IDE5MSAxNjAgMTk4IDcxIDI0OSAxODAgMTQwIDk5IDgyIDUzIDU0IDIzNSA0MiAxMiAzNyAyMDYgMjQ4IDE5MyA0OSAxNzYgOSAKKzE1NyA5MSAxODAgMTI5IDIwIDE4OCA1IDYzIDEwOSAxMzcgMjE5IDIzMSAxOTAgMTk1IDEgMjU5IDggMjA3IDIyNCAxOSAyMDEgMjM3IAorMTk5IDM2IDI0MSAyNTYgMTE3IDcyIDIwMyAxNTIgNTggODcgNjQgNDggMjQ4IDI0MSAyOSA3NyAyMCAxNjYgMjI5IDExIDcyIDIxNCAKKzE3MiAyMTYgNzYgNTUgMTc0IDk0IDM0IDk5IDkzIDczIDE1MyAxOSAyMzggMTM4IDE0NyAyNjMgNTQgNCAxMDIgMTYzIDYzIDEyMCAxNTcgCisxMTMgMjIwIDE4MSA1NyAxMTEgNTIgNzggMjIzIDEzIDI1MSA3MyAxNjQgMzkgMTMyIDE4NiAxMzggMTg0IDIyMyA2MSAxNzIgMTc5IAorMTc1IDEwNyA2IDE3IDgxIDExNCAyMDcgMjEzIDE4NSAxMjUgMjEyIDI0NiA3MyAxOTAgMTg0IDE4NiAxMDEgMjI0IDExIDk4IDk1IDIyNiAKKzEzMSAyMjEgMTQ2IDQ5IDE4NyA4OCA1MSAxMzkgMTEyIDI1NSAxODkgMjQ1IDc1IDc5IDE2MiAxMjQgOSAxMzUgNTEgMTI4IDkyIDk3IAorMTQxIDQ5IDIxMyAyMzMgMTA1IDU0IDI1NyA4MiA2NCA3NCAxMjkgMzEgMjA4IDE2MyAxMTEgNDEgNTggNjUgMjQgMjYwIDIxMSA1NCAKKzI0NiA2MiAxNzAgMjYgMTk3IDE2OSA5OCAxMDYgNDEgMjUgMjEwIDc4IDIzNCA5MiAxNDUgMTIxIDE1NSAxNjUgMjQyIDI0MyAyMDggCisyMDAgMTIgNDggMjEgMTQyIDI0MSA0MCA5NyAxNzggMjE0IDE2MSAxOTYgMTgyIDcgMjQyIDIzMiAxMjkgNDIgMjMgNTcgMTAwIDMyIAorMTg0IDE3NSA4MSA2NiAyMjcgMTA3IDIzMyAxMTYgNzQgMTUxIDEzMCAyNjAgMjAwIDM0IDg4IDE0IDE3OSAxNjQgMjggMTEyIDI4IDkwIAorMTkzIDM4IDE1NiAxMTUgMTA5IDE1OSAyNTkgMTkgMjI3IDExOCAyNTMgMTAgMTIyIDgzIDI1NiAxMDYgMjU3IDEwNCAxMDQgMTI2IDE2NiAKKzIxOCAyNTUgMTc4IDIyNSAxODEgOTAgMjMwIDI2MiAxMDQgNzggMTg2IDExMiAzOSAxMTAgODcgODYgMTQ3IDM2IDE0IDIxNiA2NSAzNSAKKzc1IDEwNSA0MyAxNzggMTg4IDE2IDgzIDMgMTg1IDE1MSA5MyA5NSAyNTIgNzEgMTEgNjEgMTk0IDE0IDE2OCAxNDQgMTM0IDY0IDM3IAorMjI4IDgzIDI0NSA4NiA5OSA1NiAxNzIgMjA1IDU2IDE2MSAxODUgMTYyIDExMyAxOTQgMzYgMyAxMzcgMTcxIDI1MSA4NCAxODQgMTk3IAorMTIxIDExOCAzMCAxNiAxMzEgMTg4IDI3IDE2MiAxNjEgMTc0IDE0MiAxNCAyMDUgNDUgMTQxIDI3IDExNCAxODEgNjggMTMxIDIxMCA2NyAKKzE1NSAxOTggOTcgMTMwIDIzNCA1NSAxODUgMTczIDE5MiA4OCAyNSAxOTkgNTggNzYgNDQgMTU0IDIwMCAyNTAgMTA4IDE3MiAyMjcgOTYgCisyMTMgMjIyIDg1IDE2MCAyMDkgMTUwIDE0MyAxNjkgNzIgMjI1IDE5MiAxMTAgMTI0IDI1MSA5NSAyNjMgOTEgMTY5IDEwOSAxMjYgMTQwIAorNzMgMjAxIDIwNCA4MCAxNDkgMjE1IDEzNyAyMDggMTUyIDMyIDE0NyAxMCAxMzMgMTAzIDE1MCAxNTQgMjQ4IDIzMCA5IDE4MyAyMzYgCisyMzQgNDQgMTY1IDE1IDE0NCAxNTYgMTYzIDg5IDEgNiAyOCAxMDEgOCAxOTYgMjA0IDEwNiAxNjQgXgorNTY3IDAgMSA0NiA4OSAyMzkgMTY3IDIzNiA2MiA4NSAxNDMgMTg3IDI1NiAxNTQgMjM1IDIxMCAxMTUgMTMxIDM4IDEwOCAxOTYgMTA2IAorMjA5IDEyNCAxMDMgMTc2IDMxIDM0IDEzOSA5MSAxMCAxMDcgNjEgOTQgMTE1IDU5IDE3OSAyNTggNjkgOTIgMjAwIDIwMiAxODkgMTcxIAorMTEgMjI1IDMxIDEwNiAyNjQgMjA3IDEzNyAxMjEgNzAgODMgMjkgNjQgNjcgMTc3IDc3IDE0NSAxMDIgMTEzIDE0NCA1NiAyIDE4MSAzNCAKKzY3IDMzIDE2MCAyNDYgNDcgODUgMTI2IDE0NSAxNzQgMTcxIDI2MCAxODMgMjE1IDE5MCAyMyAyNDcgMzggMTgwIDU1IDIyMiA3MCAxMzggCis0NSA5OCAyMTEgMzkgMjI2IDE2NiAxMTggOTIgNiAyNjAgMzkgMzIgMjUgMjM0IDIxOSAyMCAzIDIyNyAyMTIgMzAgMjU0IDI4IDE5NSAKKzI1NCAyMzkgMTEyIDE1MyAyOCA3MyAxNzEgMTM4IDE2NyAxODEgMjQ1IDI1MCAxOTggMTQ4IDIwNyA2NSAyNjIgMjIwIDE1NSAxNSA1NSAKKzExIDE1MyAxNzIgNTcgMTM3IDE5MyAxMjggMTMyIDE1NiA3OCAyMDggMjU1IDkxIDgyIDIzMiAxNzcgMjIgMTI5IDY4IDE2OCAxMDUgNzQgCisxMTIgOSA0NCAxNzQgMTE2IDE3NyAxNDkgNCAyMTggMjQwIDE1OCA2NSAxOTAgOTUgMzkgODcgNDEgMiAxNjQgNTkgNTIgNTAgMTE4IDIwIAorMjE0IDE0NCAxMTEgMTggMTYgNDYgMTA2IDE1IDI0OSAxNTIgMzcgNDUgNDMgMTI4IDUgMTUgMTI3IDEzNiAzIDEwMCA0IDc5IDE4MiA0MiAKKzEzNyAxNzYgODYgMTE3IDI0MCAzNiAyNDggMTU2IDE1MCA2NyAxMDUgMjE4IDk2IDE3NCA5OSAxMzUgMTM0IDg4IDE3NiAxNCAyNTggCisxMjQgMTc1IDIzNCAxNDcgMTYxIDE1MyAxMDAgMTk4IDIxIDY2IDExNCAxOTAgMTY3IDE2NCAyMDMgMjM1IDE2IDE3MyAyNDcgMTY1IDU1IAorMjA1IDI4IDU2IDEyOSAxMjMgMTg0IDIwNiAxOSAxNTEgMjU3IDEzMyA4MCAxMDYgNzAgNjYgMjUzIDI0OCAxNyAyNSAyMTcgMTc3IDUgCis4NyAyNTIgMTg1IDEzMCA0NyAxMyA2OCAyOSA0NyAyMjQgMjUxIDI2MSAxMDIgMTg1IDMgMTcyIDEyOSAxOTUgNDMgNTYgMTQ2IDE2NSAKKzEyMiAyNjAgMTExIDE1NyA3NCA5NSAyMzMgMjkgMTkxIDE0MSAyMTcgNTAgNjMgMjAzIDExMyAxOTkgMTM5IDM2IDE5MyA3MyAxMTYgCisxMjIgNjYgMjM2IDcgMiAxMDkgMjQyIDIxNyAxMDUgMTQ2IDIzNyAxMjUgMjM4IDEyMSAxMjUgOTkgNjMgOSAyMzggNDkgNTAgMTM1IAorMjYxIDIyOSAxMjcgMTUzIDQ1IDExNSAxODYgMTIxIDE0MiAxNDEgNzggMTkxIDIxMyA5IDE2NiAxOTAgMTUwIDEyMiAxODggNTMgNDEgCisyMTMgMTQ4IDIyNCA0MCA3OCAxMzYgMTMwIDI0MSAxNTQgMjE4IDE2OCAzMyAyMTUgNjMgODEgOTcgMTY1IDE5NCAyNjMgMTQ0IDI1MCAKKzE0MyAxMzIgMTczIDUzIDI0IDE3MSA2NiA0MiA2NSAxMTggMzcgMTg5IDIyNiA5NCA2MCAyNDIgMTQ1IDQ3IDMwIDExMCAxMTEgMjI5IAorMTk5IDIxMSA5NCA0MyAyMDAgNjMgNjQgNTUgODMgMTIgMjIgMTg0IDg0IDIwMiAxMTcgNDYgMTYxIDk4IDE3IDE2NCA3NiAyNyAxMzIgCisxMDEgMjYxIDE3NCA0NCA1MiAzMyAxNDMgMjA0IDMyIDE2OSAxNTEgMTg1IDc1IDMxIDI0NSAxMjMgNTcgMjY0IDEzNSAxMiA1IDE0MiAKKzY5IDIwIDc1IDg2IDYyIDE1NyAyIDM3IDExNyAxMDEgMjQ0IDEzMiAyMjggMTM2IDU4IDExNiAxMDUgOTEgMTU0IDI0IDI3IDE0OSA3NiAKKzEwIDkwIDE5IDc5IDE5OSA4NCAyMTkgOTIgMTI4IDc3IDczIDI0MyAyNjMgMTcgNDIgMjU5IDI1OSAxODcgNjIgMjEyIDg1IDcxIDYyIAorMTQwIDIyNiAyMjEgMjAxIDEyNiAxOCAzMyAyMSAxMjEgMTk3IDIyNCAxNzkgMTM2IDI1MiA1OCAyNTUgMTYzIDE0MCA4MiAzOCAyMzUgCis3MSAyNTYgMTUgMTEwIDk0IDE4NyAxMTcgMjkgMTE5IDE2IDEwMSAxMjIgNDkgMTk0IDE5MSA4NiAxMzQgMTYgMTE4IDE2NCAxMzEgMTEwIAorMTY2IDQ2IDIzMyAxNTYgMTMzIDI1IDIzIDM2IDU0IDIxNCAxOTQgMTE5IDIyNyAxOCA4OCAxMDQgMTU1IDE0MiAxOTYgMTYxIDI2IDE1OCAKKzQ4IDE0OCA4MCAxMjMgMTEyIDgxIDE2OSAyNCA0NCAxOTEgMTU4IDE5MiA2NSAyNDUgMTc4IDE0MCAyMjMgXgorNTUxIDEgNzggNDkgNTQgMjI3IDQyIDggMzMgMTk4IDI0MCAxODEgNDEgMTY0IDI2NSAxNTMgODMgMTgwIDEyNSA4IDE4NCAyNjEgNTUgCisxMDUgMTI5IDIxOSAyMzEgMTgyIDE5MSAxIDI1NSA0IDIwMyAyMjAgMjY0IDcgMTg5IDIzNyAxOTUgMjQgMjMzIDI0OCAxMDkgNzIgMTkxIAorMTUyIDUwIDg3IDUyIDQwIDI0NCAyNDEgMjUgNzcgMTYgMTU0IDIyOSAyNjcgNjggMjA2IDE2OCAyMTIgNjggNTEgMTYyIDgyIDMwIDk1IAorOTMgNjUgMTQxIDE1IDIzNCAxMzAgMTM5IDI1NSA0MiA0IDkwIDE1MSA1MSAxMjAgMTQ1IDExMyAyMTIgMTgxIDQ1IDEwNyA0NCA3NCAKKzIxOSAxIDI1MSA2MSAxNTYgMzEgMTI4IDE4NiAxMzggMTg0IDIyMyA2MSAxNjAgMTY3IDE3NSAxMDcgNiA1IDgxIDExNCAyMDcgMjA1IAorMTczIDExMyAyMDggMjM4IDczIDE4NiAxNzYgMTc4IDkzIDIxNiAxMSA5OCA4MyAyMTggMTE5IDIyMSAxNDYgMzcgMTc5IDg4IDQ3IDEzOSAKKzEwNCAyNDcgMTg5IDI0MSA2MyA3MSAxNTQgMTE2IDUgMTIzIDUxIDEyNCA4OCA4NSAxMzMgNDkgMjA5IDIzMyA5NyA0NiAyNTcgNzQgNjQgCis3MCAxMjEgMjMgMjAwIDE1NSAxMTEgMjkgNTggNTcgMjAgMjUyIDIwNyA1MCAyNDIgNTggMTcwIDE0IDE5NyAxNjkgOTQgOTggNDEgMTMgCisyMDIgNzAgMjM0IDkyIDE0NSAxMTcgMTU1IDE1MyAyMzQgMjQzIDIwOCAyMDAgNCA0OCAyMSAxMzQgMjM3IDQwIDkzIDE3OCAyMTAgMTUzIAorMTk2IDE3NCAyNjMgMjM4IDIyOCAxMTcgMzggMjMgNDkgOTIgMjggMTgwIDE2MyA3NyA1NCAyMjMgOTkgMjI5IDExMiA2MiAxNTEgMTMwIAorMjU2IDE5MiAzNCA4MCAyIDE3MSAxNjAgMTYgMTEyIDI0IDgyIDE4NSAyNiAxNDggMTAzIDk3IDE1OSAyNTEgMTkgMjE5IDExNCAyNDUgNiAKKzExOCA3NSAyNTIgOTQgMjQ5IDEwNCA5NiAxMjYgMTU4IDIxNCAyNTEgMTc0IDIyNSAxNjkgOTAgMjMwIDI2MiA5MiA2NiAxNzQgMTA4IAorMzkgOTggNzkgODIgMTQ3IDMyIDEwIDIxNiA1MyAzNSA3NSAxMDEgMzEgMTY2IDE4MCA4IDcxIDI2NyAxODUgMTQzIDg1IDk1IDI0OCA3MSAKKzMgNTMgMTkwIDYgMTU2IDE0NCAxMjIgNTYgMjUgMjI4IDc5IDIzNyA3OCA4NyA0OCAxNzIgMTk3IDUyIDE1NyAxODEgMTU4IDEwMSAxODIgCiszNiAyNjMgMTI1IDE1OSAyNDcgNzYgMTcyIDE5MyAxMDkgMTEwIDI2MCAyMiAxMiAxMzEgMTc2IDIzIDE2MiAxNjEgMTY2IDE0MiAxNCAKKzIwMSAzNyAxNDEgMTkgMTAyIDE3NyA2MCAxMjMgMjA2IDU1IDE0MyAxOTggODkgMTE4IDIyNiA0NyAxNzcgMTczIDE5MiA3NiAxNyAxODcgCis1NCA3MiAzNiAxNDYgMTg4IDI0MiA5NiAxNjQgMjI3IDg0IDIxMyAyMTggODEgMTUyIDIwMSAxNTAgMTM1IDE1NyA2NCAyMjEgMTg0IAorMTA2IDEyNCAyNDMgOTEgMjYzIDg3IDE2NSAxMDkgMTE0IDEyOCA2OSAyMDEgMTkyIDcyIDE0OSAyMTUgMTMzIDIwNCAxNDAgMjAgMTM1IAorMiAxMzMgOTEgMTQ2IDE1MCAyNDggMjI2IDkgMTgzIDIyOCAyMzAgMzIgMTYxIDExIDEzNiAxNTIgMTYzIDgxIDI2NSAyIDIwIDk3IDggCisxODggMjA0IDEwMiAyNiAyNjUgNDAgODkgMjM1IDE2MyAyMzIgNjAgODUgMTM3IDE4NSAyNTYgMTU0IDIzMyAyMTAgMTE1IDEyNyAzNiAKKzEwOCAxOTQgMTA0IDIwOSAxMjAgMTAzIDE3NiAyNyAzMCAxMzMgODcgMTAgMTAzIDU5IDkwIDExMyA1NyAxNzUgMjU4IDY5IDg4IDE5OCAKKzIwMiAxODcgMTcxIDkgMjIxIDI5IDEwMCAyNjIgMjA1IDEzNSAxMTkgNzAgODMgMjkgNjIgNjcgMTczIDc1IDEzOSAxMDAgMTExIDE0MiAKKzUyIDIgMTc1IDI4IDYzIDMzIDE2MCAyNDYgNDMgNzkgMTIwIDE0MSAxNzAgMTY1IDI2MCAxNzcgMjExIDE4NiAyMSAyNDcgMzggMTc4IAorNTUgMjIyIDY2IDEzNiAzOSA5NCAyMTEgMzUgMjI2IDE2NCAxMTQgOTAgMjU2IDM3IDI4IDI1IDIzMiAyMTUgMTYgMjY3IDIyMyAyMTIgCiszMCAyNTAgMjQgMTk1IDI1NCAyMzkgMTEwIDE0NyAyOCA2NyAxNjkgMTMyIDE2NyAxNzkgMjQzIDI0NiAxOTQgMTQyIDIwMyA2NSAyNjMgXgorNTc4IDAgMjIwIDE0NyAxMSA0NyAzIDE0OSAxNjQgNTcgMTM3IDE4NSAxMjAgMTIwIDE1MiA3OCAyMDAgMjUxIDg3IDc4IDIzMiAxNzcgCisyMiAxMjkgNjggMTY4IDkzIDc0IDEwMCA1IDMyIDE3NCAxMDggMTczIDE0MSAyNjYgMjE4IDIzMiAxNTggNjEgMTg2IDg3IDI3IDc1IDI5IAorMjYwIDE1MiA1OSA1MiAzOCAxMDYgMjAgMjE0IDEzMiA5OSA2IDEyIDQ2IDEwNiA3IDI0OSAxNDAgMjkgNDEgMzkgMTI0IDEgMTUgMTE1IAorMTM2IDI2OSAxMDAgMjYyIDY3IDE4MiAzOCAxMjUgMTY4IDc0IDExMyAyNDAgMjQgMjQ0IDE1NiAxNDYgNjMgMTAxIDIxMCA5NiAxNjIgCis5MSAxMjcgMTM0IDg0IDE2NCA2IDI1MCAxMjAgMTcxIDIyNiAxNDMgMTQ5IDE0NSA5NiAxOTQgMTcgNjIgMTAyIDE5MCAxNTUgMTYwIAorMTk1IDIzNSA4IDE2NSAyNDMgMTU3IDQzIDIwNSAxNiA0NCAxMjEgMTE5IDE3MiAyMDYgMTUgMTQ3IDI0OSAxMjEgNjggOTggNTggNjYgCisyNTMgMjQwIDUgMTMgMjEzIDE2NSA1IDgzIDI0OCAxNzMgMTIyIDM1IDUgNjQgMTcgNDMgMjI0IDI0NyAyNTcgMTAyIDE3NyAzIDE2OCAKKzEyNSAxODcgMzUgNTYgMTM4IDE2NSAyNjIgMTE4IDI1NiAxMDMgMTU3IDYyIDgzIDIyOSAyNSAxNzkgMTM3IDIxNyA0NiA1NSAyMDMgCisxMDEgMTkxIDEzNSAzMiAxOTMgNjkgMTE2IDEyMiA1NCAyMzYgNyAyNjggMTAxIDI0MiAyMDkgOTcgMTQyIDIzMyAxMjUgMjM4IDEwOSAKKzEyMSA4NyA1OSAxIDIzNCA0MSAyNTggNTAgMTIzIDI1MyAyMjEgMTI3IDE1MyA0NSAxMDcgMTc0IDEyMSAxMzggMTMzIDY2IDE4MyAyMDUgCisyNjcgMTY2IDE3OCAxMzggMTE0IDE4OCA1MyAzNyAyMDkgMTQ4IDIxNiAyOCA3NCAxMzIgMTE4IDIzNyAxNDIgMjE0IDE2NCAyNSAyMTEgCis2MyA2OSA5NyAxNjEgMTk0IDI1NSAxMzYgMjUwIDEzOSAxMzIgMTY5IDQxIDIwIDE2MyA1OCAzNCA1NyAxMTggMzcgMTc3IDIyMiA5NCAKKzYwIDIzOCAxNDEgNDcgMjIgMTEwIDEwNyAyMjUgMTk1IDIwMyA4MiA0MyAxOTIgNTEgNTIgNTEgNzEgMTIgMTQgMTgwIDcyIDE5OCAxMTcgCiszOCAxNTcgOTQgOSAxNjQgNzYgMTUgMTI4IDEwMSAyNjEgMTcwIDQwIDQwIDIxIDE0MyAyMDAgMzIgMTYxIDE0MyAxODEgNzEgMzEgMjQ1IAorMTIzIDUzIDI1NiAxMzUgMjY3IDEzNCA2NSAxNiA2MyA4MiA2MiAxNTMgMjY0IDMzIDEwOSA4OSAyNDQgMTI0IDIyMCAxMjggNTAgMTA0IAorMTA1IDkxIDE0NiAxMiAyNyAxNDUgNjQgMjY4IDgyIDExIDc5IDE5OSA4NCAyMTUgODAgMTI4IDY5IDY1IDIzNSAyNTkgMTcgMzAgMjU5IAorMjU1IDE4NyA1NCAyMDQgODEgNjMgNTAgMTM2IDIxOCAyMTMgMTk3IDExOCAxOCAyOSA5IDExMyAxODkgMjIwIDE3OSAxMjQgMjUyIDU0IAorMjU1IDE1NSAxMjggODIgMzAgMjI3IDU5IDI1MiAzIDk4IDkwIDE3OSAxMDUgMjEgMTExIDQgOTcgMTEwIDM3IDE5MCAxODcgODYgMTMwIAorMTYgMTE0IDE1NiAxMjcgMTAyIDE1OCA0MiAyMjUgMTQ0IDEyOSAxNyAxMSAyOCA0MiAyMDYgMjY2IDE4NiAxMTkgMjIzIDEwIDgwIDk2IAorMTQzIDEzMCAxODQgMTUzIDI2IDE0NiA0NCAxNDAgODAgMTE1IDEwNCA3MyAxNjUgMjQgNDQgMTkxIDE1NCAxODAgNTMgMjM3IDE3NCAKKzE0MCA5OSA3NiA0NyA1NCAyMjMgNDIgNiAzMSAxOTQgMjM2IDE3NSAzNyAxNTggMjYxIDE1MSA3OSAxODAgMTIzIDIgMTgyIDI1NyA1MSAKKzEwMyAxMjUgMjE5IDIzMSAxNzggMTg5IDEgMjUzIDIgMjAxIDIxOCAyNjQgMSAxODMgMjM3IDE5MyAxOCAyMjkgMjQ0IDEwNSA3MiAxODUgCisxNTIgNDYgODcgNDYgMzYgMjQyIDI0MSAyMyA3NyAxNCAxNDggMjI5IDI2MyA2NiAyMDIgMTY2IDIxMCA2NCA0OSAxNTYgNzYgMjggOTMgCis5MyA2MSAxMzUgMTMgMjMyIDEyNiAxMzUgMjUxIDM2IDQgODQgMTQ1IDQ1IDEyMCAxMzkgMTEzIDIwOCAxODEgMzkgMTA1IDQwIDcyIAorMjE3IDI2NSAyNTEgNTUgMTUyIDI3IDEyNiAxODYgMTM4IDE4NCAyMjMgNjEgMTU0IDE2MSAxNzUgMTA3IDYgMjY5IDgxIDExNCAyMDcgCisyMDEgMTY3IDEwNyAyMDYgMjM0IDczIDE4NCAxNzIgMTc0IDg5IDIxMiAxMSA5OCA3NyAyMTQgMTEzIDIyMSAxNDYgMzEgMTc1IDg4IDQ1IAorMTM5IDEwMCAyNDMgMTg5IDIxMyBeCis1NzggMSA1MSA2MyAxNDYgMTA4IDEgMTExIDUxIDEyMCA4NCA3MyAxMjUgNDkgMjA1IDIzMyA4OSAzOCAyNTcgNjYgNjQgNjYgMTEzIDE1IAorMTkyIDE0NyAxMTEgMTcgNTggNDkgMTYgMjQ0IDIwMyA0NiAyMzggNTQgMTcwIDIgMTk3IDE2OSA5MCA5MCA0MSAxIDE5NCA2MiAyMzQgCis5MiAxNDUgMTEzIDE1NSAxNDEgMjI2IDI0MyAyMDggMjAwIDI2OCA0OCAyMSAxMjYgMjMzIDQwIDg5IDE3OCAyMDYgMTQ1IDE5NiAxNjYgCisyNTUgMjM0IDIyNCAxMDUgMzQgMjMgNDEgODQgMjQgMTc2IDE1MSA3MyA0MiAyMTkgOTEgMjI1IDEwOCA1MCAxNTEgMTMwIDI1MiAxODQgCiszNCA3MiAyNjIgMTYzIDE1NiA0IDExMiAyMCA3NCAxNzcgMTQgMTQwIDkxIDg1IDE1OSAyNDMgMTkgMjExIDExMCAyMzcgMiAxMTQgNjcgCisyNDggODIgMjQxIDEwNCA4OCAxMjYgMTUwIDIxMCAyNDcgMTcwIDIyNSAxNTcgOTAgMjMwIDI2MiA4MCA1NCAxNjIgMTA0IDM5IDg2IDcxIAorNzggMTQ3IDI4IDYgMjE2IDQxIDM1IDc1IDk3IDE5IDE1NCAxNzIgNTkgMjY3IDE4NSAxMzUgNzcgOTUgMjQ0IDcxIDI2NyA0NSAxODYgCisyNzAgMTQ0IDE0NCAxMTAgNDggMTMgMjI4IDc1IDIyOSA3MCA3NSA0MCAxNzIgMTg5IDQ4IDE1MyAxNzcgMTU0IDg5IDE3MCAzNiAyNTkgCisxMTMgMTQ3IDI0MyA2OCAxNjAgMTg5IDk3IDEwMiAyNTYgMTQgOCAxMzEgMTY0IDE5IDE2MiAxNjEgMTU4IDE0MiAxNCAxOTcgMjkgMTQxIAorMTEgOTAgMTczIDUyIDExNSAyMDIgNDMgMTMxIDE5OCA4MSAxMDYgMjE4IDM5IDE2OSAxNzMgMTkyIDY0IDkgMTc1IDUwIDY4IDI4IDEzOCAKKzE3NiAyMzQgODQgMTU2IDIyNyA3MiAyMTMgMjE0IDc3IDE0NCAxOTMgMTUwIDEyNyAxNDUgNTYgMjE3IDE3NiAxMDIgMTI0IDIzNSA4NyAKKzI2MyA4MyAxNjEgMTA5IDEwMiAxMTYgNjUgMjAxIDE4MCA2NCAxNDkgMjE1IDEyOSAyMDAgMTI4IDggMTIzIDI2NiAxMzMgNzkgMTQyIAorMTQ2IDI0OCAyMjIgOSAxODMgMjIwIDIyNiAyMCAxNTcgNyAxMjggMTQ4IDE2MyA3MyAyNjUgMjcwIDEyIDkzIDggMTgwIDIwNCA5OCAyMiAKKzI2MSAyOCA4OSAyMjcgMTU1IDIyNCA1NiA4NSAxMjUgMTgxIDI1NiAxNTQgMjI5IDIxMCAxMTUgMTE5IDMyIDEwOCAxOTAgMTAwIDIwOSAKKzExMiAxMDMgMTc2IDE5IDIyIDEyMSA3OSAxMCA5NSA1NSA4MiAxMDkgNTMgMTY3IDI1OCA2OSA4MCAxOTQgMjAyIDE4MyAxNzEgNSAyMTMgCisyNSA4OCAyNTggMjAxIDEzMSAxMTUgNzAgODMgMjkgNTggNjcgMTY1IDcxIDEyNyA5NiAxMDcgMTM4IDQ0IDIgMTYzIDE2IDU1IDMzIAorMTYwIDI0NiAzNSA2NyAxMDggMTMzIDE2MiAxNTMgMjYwIDE2NSAyMDMgMTc4IDE3IDI0NyAzOCAxNzQgNTUgMjIyIDU4IDEzMiAyNyA4NiAKKzIxMSAyNyAyMjYgMTYwIDEwNiA4NiAyNjAgMjQ4IDMzIDIwIDI1IDIyOCAyMDcgOCAyNjMgMjE1IDIxMiAzMCAyNDIgMTYgMTk1IDI1NCAKKzIzOSAxMDYgMTM1IDI4IDU1IDE2NSAxMjAgMTY3IDE3NSAyMzkgMjM4IDE4NiAxMzAgMTk1IDY1IDI1MCAyMjAgMTQzIDkgNDMgMjcxIAorMTQ3IDE2MCA1NyAxMzcgMTgxIDExNiAxMTQgMTUwIDc4IDE5NiAyNDkgODUgNzYgMjMyIDE3NyAyMiAxMjkgNjggMTY4IDg3IDc0IDk0IAorMyAyNiAxNzQgMTA0IDE3MSAxMzcgMjY0IDIxOCAyMjggMTU4IDU5IDE4NCA4MyAyMSA2OSAyMyAyNTYgMTQ2IDU5IDUyIDMyIDEwMCAyMCAKKzIxNCAxMjYgOTMgMTAgNDYgMTA2IDMgMjQ5IDEzNCAyNSAzOSAzNyAxMjIgMjcxIDE1IDEwOSAxMzYgMjY5IDEwMCAyNTggNjEgMTgyIAorMzYgMTE5IDE2NCA2OCAxMTEgMjQwIDE4IDI0MiAxNTYgMTQ0IDYxIDk5IDIwNiA5NiAxNTYgODcgMTIzIDEzNCA4MiAxNTggMiAyNDYgCisxMTggMTY5IDIyMiAxNDEgMTQzIDE0MSA5NCAxOTIgMTUgNjAgOTYgMTkwIDE0OSAxNTggMTkxIDIzNSA0IDE2MSAyNDEgMTUzIDM3IAorMjA1IDEwIDM4IDExNyAxMTcgMTY2IDIwNiAxMyAxNDUgMjQ1IDExNSA2MiA5NCA1MiA2NiAyNTMgMjM2IDI3MSA3IDIxMSAxNTkgNSA4MSAKKzI0NiAxNjcgMTE4IDI5IDEgNjIgMTEgNDEgMjI0IDI0NSAyNTUgMTAyIDE3MyAzIDE2NiAxMjMgMTgzIDMxIDU2IDEzNCAxNjUgMjYwIAorMTE2IDI1NCA4MSBeCis1ODMgMSAxNTcgNTAgNzEgMjI1IDIxIDE2NyAxMzMgMjE3IDQyIDQ3IDIwMyA4OSAxODMgMTMxIDI4IDE5MyA2NSAxMTYgMTIyIDQyIAorMjM2IDcgMjY4IDkzIDI0MiAyMDEgODkgMTM4IDIyOSAxMjUgMjM4IDk3IDExNyA3NSA1NSAyNjcgMjMwIDMzIDI1MCA1MCAxMTEgMjQ1IAorMjEzIDEyNyAxNTMgNDUgOTkgMTYyIDEyMSAxMzQgMTI1IDU0IDE3NSAxOTcgMjU5IDE2NiAxNjYgMTI2IDEwNiAxODggNTMgMzMgMjA1IAorMTQ4IDIwOCAxNiA3MCAxMjggMTA2IDIzMyAxMzAgMjEwIDE2MCAxNyAyMDcgNjMgNTcgOTcgMTU3IDE5NCAyNDcgMTI4IDI1MCAxMzUgCisxMzIgMTY1IDI5IDE2IDE1NSA1MCAyNiA0OSAxMTggMzcgMTY1IDIxOCA5NCA2MCAyMzQgMTM3IDQ3IDE0IDExMCAxMDMgMjIxIDE5MSAKKzE5NSA3MCA0MyAxODQgMzkgNDAgNDcgNTkgMTIgNiAxNzYgNjAgMTk0IDExNyAzMCAxNTMgOTAgMSAxNjQgNzYgMyAxMjQgMTAxIDI2MSAKKzE2NiAzNiAyOCA5IDE0MyAxOTYgMzIgMTUzIDEzNSAxNzcgNjcgMzEgMjQ1IDEyMyA0OSAyNDggMTM1IDI2MiAyNjMgMTI2IDYxIDEyIAorNTEgNzggNjIgMTQ5IDI2MCAyOSAxMDEgNzcgMjQ0IDExNiAyMTIgMTIwIDQyIDkyIDEwNSA5MSAxMzggMjcgMTQxIDUyIDI2MCA3NCAzIAorNzkgMTk5IDg0IDIxMSA2OCAxMjggNjEgNTcgMjI3IDI1NSAxNyAxOCAyNTkgMjUxIDE4NyA0NiAxOTYgNzcgNTUgMzggMTMyIDIxMCAKKzIwNSAxOTMgMTEwIDE4IDI1IDI3MSAxMDUgMTgxIDIxNiAxNzkgMTEyIDI1MiA1MCAyNTUgMTQ3IDExNiA4MiAyMiAyMTkgNDcgMjQ4IAorMjY1IDg2IDg2IDE3MSA5MyAxMyAxMDMgMjY2IDkzIDk4IDI1IDE4NiAxODMgODYgMTI2IDE2IDExMCAxNDggMTIzIDk0IDE1MCAzOCAKKzIxNyAxMzIgMTI1IDkgMjczIDIwIDMwIDE5OCAyNjYgMTc4IDExOSAyMTkgMiA3MiA4OCAxMzEgMTE4IDE3MiAxNDUgMjYgMTM0IDQwIAorMTMyIDgwIDEwNyA5NiA2NSAxNjEgMjQgNDQgMTkxIDE1MCAxNjggNDEgMjI5IDE3MCAxNDAgOTkgNzIgNDMgNTQgMjE1IDQyIDIgMjcgCisxODYgMjI4IDE2MyAyOSAxNDYgMjUzIDE0NyA3MSAxODAgMTE5IDI2NCAxNzggMjQ5IDQzIDk5IDExNyAyMTkgMjMxIDE3MCAxODUgMSAKKzI0OSAyNzIgMTk3IDIxNCAyNjQgMjYzIDE3MSAyMzcgMTg5IDYgMjIxIDIzNiA5NyA3MiAxNzMgMTUyIDM4IDg3IDM0IDI4IDIzOCAyNDEgCisxOSA3NyAxMCAxMzYgMjI5IDI1NSA2MiAxOTQgMTYyIDIwNiA1NiA0NSAxNDQgNjQgMjQgODkgOTMgNTMgMTIzIDkgMjI4IDExOCAxMjcgCisyNDMgMjQgNCA3MiAxMzMgMzMgMTIwIDEyNyAxMTMgMjAwIDE4MSAyNyAxMDEgMzIgNjggMjEzIDI1NyAyNTEgNDMgMTQ0IDE5IDEyMiAKKzE4NiAxMzggMTg0IDIyMyA2MSAxNDIgMTQ5IDE3NSAxMDcgNiAyNjEgODEgMTE0IDIwNyAxOTMgMTU1IDk1IDIwMiAyMjYgNzMgMTgwIAorMTY0IDE2NiA4MSAyMDQgMTEgOTggNjUgMjA2IDEwMSAyMjEgMTQ2IDE5IDE2NyA4OCA0MSAxMzkgOTIgMjM1IDE4OSAyMzUgNDUgNTkgCisxNDIgMTA0IDI3MyAxMDUgNTEgMTE4IDgyIDY3IDEyMSA0OSAyMDMgMjMzIDg1IDM0IDI1NyA2MiA2NCA2NCAxMDkgMTEgMTg4IDE0MyAKKzExMSAxMSA1OCA0NSAxNCAyNDAgMjAxIDQ0IDIzNiA1MiAxNzAgMjcwIDE5NyAxNjkgODggODYgNDEgMjY5IDE5MCA1OCAyMzQgOTIgCisxNDUgMTExIDE1NSAxMzUgMjIyIDI0MyAyMDggMjAwIDI2NiA0OCAyMSAxMjIgMjMxIDQwIDg3IDE3OCAyMDQgMTQxIDE5NiAxNjIgMjUxIAorMjMyIDIyMiA5OSAzMiAyMyAzNyA4MCAyMiAxNzQgMTQ1IDcxIDM2IDIxNyA4NyAyMjMgMTA2IDQ0IDE1MSAxMzAgMjUwIDE4MCAzNCA2OCAKKzI1OCAxNTkgMTU0IDI3MiAxMTIgMTggNzAgMTczIDggMTM2IDg1IDc5IDE1OSAyMzkgMTkgMjA3IDEwOCAyMzMgMTEyIDYzIDI0NiA3NiAKKzIzNyAxMDQgODQgMTI2IDE0NiAyMDggMjQ1IDE2OCAyMjUgMTUxIDkwIDIzMCAyNjIgNzQgNDggMTU2IDEwMiAzOSA4MCA2NyA3NiAxNDcgCisyNiA0IDIxNiAzNSAzNSA3NSA5NSAxMyAxNDggMTY4IDI3MCA1MyAyNjcgMTg1IDEzMSA3MyA5NSAyNDIgNzEgMjY1IDQxIDE4NCAyNjggCisxMzggMTQ0IDEwNCA0NCA3IDIyOCA3MyAyMjUgNjYgNjkgMzYgMjcyIF4KKzU4OCAwIDE4MSA0NCAxNDkgMTczIDE1MCA3NyAxNTggMzYgMjU1IDEwMSAxMzUgMjM5IDYwIDE0OCAxODUgODUgOTQgMjUyIDYgNCAxMzEgCisxNTIgMTUgMTYyIDE2MSAxNTAgMTQyIDE0IDE5MyAyMSAxNDEgMyA3OCAxNjkgNDQgMTA3IDE5OCAzMSAxMTkgMTk4IDczIDk0IDIxMCAKKzMxIDE2MSAxNzMgMTkyIDUyIDEgMTYzIDQ2IDY0IDIwIDEzMCAxNjQgMjI2IDcyIDE0OCAyMjcgNjAgMjEzIDIxMCA3MyAxMzYgMTg1IAorMTUwIDExOSAxMzMgNDggMjEzIDE2OCA5OCAxMjQgMjI3IDgzIDI2MyA3OSAxNTcgMTA5IDkwIDEwNCA2MSAyMDEgMTY4IDU2IDE0OSAKKzIxNSAxMjUgMTk2IDExNiAyNzIgMTExIDI2MiAxMzMgNjcgMTM4IDE0MiAyNDggMjE4IDkgMTgzIDIxMiAyMjIgOCAxNTMgMyAxMjAgCisxNDQgMTYzIDY1IDI2NSAyNzAgNCA4OSA4IDE3MiAyMDQgOTQgMTggMjU3IDE2IDg5IDIxOSAxNDcgMjE2IDUyIDg1IDExMyAxNzcgMjU2IAorMTU0IDIyNSAyMTAgMTE1IDExMSAyOCAxMDggMTg2IDk2IDIwOSAxMDQgMTAzIDE3NiAxMSAxNCAxMDkgNzEgMTAgODcgNTEgNzQgMTA1IAorNDkgMTU5IDI1OCA2OSA3MiAxOTAgMjAyIDE3OSAxNzEgMSAyMDUgMjEgNzYgMjU0IDE5NyAxMjcgMTExIDcwIDgzIDI5IDU0IDY3IDE1NyAKKzY3IDExNSA5MiAxMDMgMTM0IDM2IDIgMTUxIDQgNDcgMzMgMTYwIDI0NiAyNyA1NSA5NiAxMjUgMTU0IDE0MSAyNjAgMTUzIDE5NSAxNzAgCisxMyAyNDcgMzggMTcwIDU1IDIyMiA1MCAxMjggMTUgNzggMjExIDE5IDIyNiAxNTYgOTggODIgMjUyIDI0MCAyOSAxMiAyNSAyMjQgMTk5IAorMjU5IDIwNyAyMTIgMzAgMjM0IDggMTk1IDI1NCAyMzkgMTAyIDEyMyAyOCA0MyAxNjEgMTA4IDE2NyAxNzEgMjM1IDIzMCAxNzggMTE4IAorMTg3IDY1IDI0MiAyMjAgMTM1IDUgMzUgMjY3IDE0MyAxNTIgNTcgMTM3IDE3MyAxMDggMTAyIDE0NiA3OCAxODggMjQ1IDgxIDcyIDIzMiAKKzE3NyAyMiAxMjkgNjggMTY4IDc1IDc0IDgyIDI3NSAxNCAxNzQgOTYgMTY3IDEyOSAyNjAgMjE4IDIyMCAxNTggNTUgMTgwIDc1IDkgNTcgCisxMSAyNDggMTM0IDU5IDUyIDIwIDg4IDIwIDIxNCAxMTQgODEgMjY0IDYgNDYgMTA2IDI3MSAyNDkgMTIyIDE3IDM1IDMzIDExOCAyNzEgCisxNSA5NyAxMzYgMjY5IDEwMCAyNTAgNDkgMTgyIDMyIDEwNyAxNTYgNTYgMTA3IDI0MCA2IDIzOCAxNTYgMTQwIDU3IDk1IDE5OCA5NiAKKzE0NCA3OSAxMTUgMTM0IDc4IDE0NiAyNzAgMjM4IDExNCAxNjUgMjE0IDEzNyAxMzEgMTMzIDkwIDE4OCAxMSA1NiA4NCAxOTAgMTM3IAorMTU0IDE4MyAyMzUgMjcyIDE1MyAyMzcgMTQ1IDI1IDIwNSAyNzQgMjYgMTA5IDExMyAxNTQgMjA2IDkgMTQxIDIzNyAxMDMgNTAgODYgCis0MCA2NiAyNTMgMjI4IDI2MyAyNzEgMjA3IDE0NyA1IDc3IDI0MiAxNTUgMTEwIDE3IDI2OSA1OCAyNzUgMzcgMjI0IDI0MSAyNTEgMTAyIAorMTY1IDMgMTYyIDExOSAxNzUgMjMgNTYgMTI2IDE2NSAyNTYgMTEyIDI1MCA5MSAxNTcgNDQgNjUgMjIzIDE5IDE2MSAxMzEgMjE3IDQwIAorNDMgMjAzIDgzIDE3OSAxMjkgMjYgMTkzIDYzIDExNiAxMjIgMzYgMjM2IDcgMjY4IDg5IDI0MiAxOTcgODUgMTM2IDIyNyAxMjUgMjM4IAorOTEgMTE1IDY5IDUzIDI2NSAyMjggMjkgMjQ2IDUwIDEwNSAyNDEgMjA5IDEyNyAxNTMgNDUgOTUgMTU2IDEyMSAxMzIgMTIxIDQ4IDE3MSAKKzE5MyAyNTUgMTY2IDE2MCAxMjAgMTAyIDE4OCA1MyAzMSAyMDMgMTQ4IDIwNCAxMCA2OCAxMjYgMTAwIDIzMSAxMjQgMjA4IDE1OCAxMyAKKzIwNSA2MyA1MSA5NyAxNTUgMTk0IDI0MyAxMjQgMjUwIDEzMyAxMzIgMTYzIDIzIDE0IDE1MSA0NiAyMiA0NSAxMTggMzcgMTU5IDIxNiAKKzk0IDYwIDIzMiAxMzUgNDcgMTAgMTEwIDEwMSAyMTkgMTg5IDE5MSA2NCA0MyAxODAgMzMgMzQgNDUgNTMgMTIgMiAxNzQgNTQgMTkyIAorMTE3IDI2IDE1MSA4OCAyNzMgMTY0IDc2IDI3MyAxMjIgMTAxIDI2MSAxNjQgMzQgMjIgMyAxNDMgMTk0IDMyIDE0OSAxMzEgMTc1IDY1IAorMzEgMjQ1IDEyMyA0NyAyNDQgMTM1IDI1OCAyNjEgMTIyIDU5IDEwIDQ1IDc2IDYyIDE0NyAyNTggMjcgOTcgNzEgMjQ0IDExMiAyMDggCisxMTYgMzggODYgMTA1IDkxIDEzNCAyNzAgMjcgMTM5IDQ2IDI1NiA3MCAyNzUgNzkgMTk5IDE2MCBeCis1OTQgMCAyMDcgNTYgMTI4IDUzIDQ5IDIxOSAyNTEgMTcgNiAyNTkgMjQ3IDE4NyAzOCAxODggNzMgNDcgMjYgMTI4IDIwMiAxOTcgMTg5IAorMTAyIDE4IDIxIDI2MyA5NyAxNzMgMjEyIDE3OSAxMDAgMjUyIDQ2IDI1NSAxMzkgMTA0IDgyIDE0IDIxMSAzNSAyNDQgMjU3IDc0IDgyIAorMTYzIDgxIDUgOTUgMjU4IDg5IDg2IDEzIDE4MiAxNzkgODYgMTIyIDE2IDEwNiAxNDAgMTE5IDg2IDE0MiAzNCAyMDkgMTIwIDEyMSAxIAorMjY1IDEyIDE4IDE5MCAyNjYgMTcwIDExOSAyMTUgMjcyIDY0IDgwIDExOSAxMDYgMTYwIDEzNyAyNiAxMjIgMzYgMTI0IDgwIDk5IDg4IAorNTcgMTU3IDI0IDQ0IDE5MSAxNDYgMTU2IDI5IDIyMSAxNjYgMTQwIDk5IDY4IDM5IDU0IDIwNyA0MiAyNzYgMjMgMTc4IDIyMCAxNTEgCisyMSAxMzQgMjQ1IDE0MyA2MyAxODAgMTE1IDI1NiAxNzQgMjQxIDM1IDk1IDEwOSAyMTkgMjMxIDE2MiAxODEgMSAyNDUgMjcyIDE5MyAKKzIxMCAyNjQgMjU1IDE1OSAyMzcgMTg1IDI3MiAyMTMgMjI4IDg5IDcyIDE2MSAxNTIgMzAgODcgMjIgMjAgMjM0IDI0MSAxNSA3NyA2IAorMTI0IDIyOSAyNDcgNTggMTg2IDE1OCAyMDIgNDggNDEgMTMyIDUyIDIwIDg1IDkzIDQ1IDExMSA1IDIyNCAxMTAgMTE5IDIzNSAxMiA0IAorNjAgMTIxIDIxIDEyMCAxMTUgMTEzIDE5MiAxODEgMTUgOTcgMjQgNjQgMjA5IDI0OSAyNTEgMzEgMTM2IDExIDExOCAxODYgMTM4IDE4NCAKKzIyMyA2MSAxMzAgMTM3IDE3NSAxMDcgNiAyNTMgODEgMTE0IDIwNyAxODUgMTQzIDgzIDE5OCAyMTggNzMgMTc2IDE1NiAxNTggNzMgCisxOTYgMTEgOTggNTMgMTk4IDg5IDIyMSAxNDYgNyAxNTkgODggMzcgMTM5IDg0IDIyNyAxODkgMjMxIDMzIDUxIDEzNCA5NiAyNzMgOTMgCis1MSAxMTQgNzggNTUgMTEzIDQ5IDE5OSAyMzMgNzcgMjYgMjU3IDU0IDY0IDYwIDEwMSAzIDE4MCAxMzUgMTExIDI3NyA1OCAzNyAxMCAKKzIzMiAxOTcgNDAgMjMyIDQ4IDE3MCAyNjIgMTk3IDE2OSA4NCA3OCA0MSAyNjEgMTgyIDUwIDIzNCA5MiAxNDUgMTA3IDE1NSAxMjMgCisyMTQgMjQzIDIwOCAyMDAgMjYyIDQ4IDIxIDExNCAyMjcgNDAgODMgMTc4IDIwMCAxMzMgMTk2IDE1NCAyNDMgMjI4IDIxOCA4NyAyOCAKKzIzIDI5IDcyIDE4IDE3MCAxMzMgNjcgMjQgMjEzIDc5IDIxOSAxMDIgMzIgMTUxIDEzMCAyNDYgMTcyIDM0IDYwIDI1MCAxNTEgMTUwIAorMjY0IDExMiAxNCA2MiAxNjUgMjc0IDEyOCA3MyA2NyAxNTkgMjMxIDE5IDE5OSAxMDQgMjI1IDI3NCAxMDggNTUgMjQyIDY0IDIyOSAKKzEwNCA3NiAxMjYgMTM4IDIwNCAyNDEgMTY0IDIyNSAxMzkgOTAgMjMwIDI2MiA2MiAzNiAxNDQgOTggMzkgNjggNTkgNzIgMTQ3IDIyIAorMjE2IDIzIDM1IDc1IDkxIDEgMTM2IDE2MCAyNjYgNDEgMjY3IDE4NSAxMjMgNjUgOTUgMjM4IDcxIDI2MSAzMyAxODAgMjY0IDEyNiAKKzE0NCA5MiAzNiAyNzMgMjI4IDY5IDIxNyA1OCA1NyAyOCAxNzIgMTc3IDQyIDE0NyAxNzEgMTQ4IDcxIDE1MiAzNiAyNTMgOTUgMTI5IAorMjM3IDU2IDE0MiAxODMgNzkgOTAgMjUwIDIgMiAxMzEgMTQ2IDEzIDE2MiAxNjEgMTQ2IDE0MiAxNCAxOTEgMTcgMTQxIDI3NyA3MiAKKzE2NyA0MCAxMDMgMTk2IDI1IDExMyAxOTggNjkgODggMjA2IDI3IDE1NyAxNzMgMTkyIDQ2IDI3NSAxNTcgNDQgNjIgMTYgMTI2IDE1OCAKKzIyMiA2NiAxNDQgMjI3IDU0IDIxMyAyMDggNzEgMTMyIDE4MSAxNTAgMTE1IDEyNyA0NCAyMTEgMTY0IDk2IDEyNCAyMjMgODEgMjYzIAorNzcgMTU1IDEwOSA4NCA5OCA1OSAyMDEgMTYyIDUyIDE0OSAyMTUgMTIzIDE5NCAxMTAgMjY4IDEwNSAyNjAgMTMzIDYxIDEzNiAxNDAgCisyNDggMjE2IDkgMTgzIDIwOCAyMjAgMiAxNTEgMSAxMTYgMTQyIDE2MyA2MSAyNjUgMjcwIDg3IDggMTY4IDIwNCA5MiAxNiAyNTUgMTAgCis4OSAyMTUgMTQzIDIxMiA1MCA4NSAxMDcgMTc1IDI1NiAxNTQgMjIzIDIxMCAxMTUgMTA3IDI2IDEwOCAxODQgOTQgMjA5IDEwMCAxMDMgCisxNzYgNyAxMCAxMDMgNjcgMTAgODMgNDkgNzAgMTAzIDQ3IDE1NSAyNTggNjkgNjggMTg4IDIwMiAxNzcgMTcxIDI3NyAyMDEgMTkgNzAgCisyNTIgMTk1IDEyNSAxMDkgNzAgODMgMjkgNTIgNjcgMTUzIDY1IDEwOSA5MCAxMDEgMTMyIDMyIDIgMTQ1IDI3NiA0MyAzMyAxNjAgMjQ2IAorMjMgMjU5IF4KKzYwMCAxIDg3IDExOSAxNDggMTMyIDI2MCAxNDQgMTg5IDE2NCAxMCAyNDcgMzggMTY3IDU1IDIyMiA0NCAxMjUgNiA3MiAyMTEgMTMgCisyMjYgMTUzIDkyIDc5IDI0NiAyMzQgMjYgNiAyNSAyMjEgMTkzIDI3MyAyNTYgMjAxIDIxMiAzMCAyMjggMiAxOTUgMjU0IDIzOSA5OSAKKzExNCAyOCAzNCAxNTggOTkgMTY3IDE2OCAyMzIgMjI0IDE3MiAxMDkgMTgxIDY1IDIzNiAyMjAgMTI5IDIgMjkgMjY0IDE0MCAxNDYgNTcgCisxMzcgMTY3IDEwMiA5MyAxNDMgNzggMTgyIDI0MiA3OCA2OSAyMzIgMTc3IDIyIDEyOSA2OCAxNjggNjYgNzQgNzMgMjc1IDUgMTc0IDkwIAorMTY0IDEyMyAyNTcgMjE4IDIxNCAxNTggNTIgMTc3IDY5IDQ4IDIgMjQyIDEyNSA1OSA1MiAxMSA3OSAyMCAyMTQgMTA1IDcyIDI1OCAzIAorNDYgMTA2IDI2OCAyNDkgMTEzIDExIDMyIDMwIDExNSAyNzEgMTUgODggMTM2IDI2OSAxMDAgMjQ0IDQwIDE4MiAyOSA5OCAxNTAgNDcgCisxMDQgMjQwIDI3NiAyMzUgMTU2IDEzNyA1NCA5MiAxOTIgOTYgMTM1IDczIDEwOSAxMzQgNzUgMTM3IDI2NyAyMzIgMTExIDE2MiAyMDggCisxMzQgMTIyIDEyNyA4NyAxODUgOCA1MyA3NSAxOTAgMTI4IDE1MSAxNzcgMjM1IDI2OSAxNDcgMjM0IDEzOSAxNiAyMDUgMjY4IDE3IAorMTAzIDExMCAxNDUgMjA2IDYgMTM4IDIzMSA5NCA0MSA4MCAzMSA2NiAyNTMgMjIyIDI1NyAyNjUgMjA0IDEzOCA1IDc0IDIzOSAxNDYgCisxMDQgOCAyNjYgNTUgMjY5IDM0IDIyNCAyMzggMjQ4IDEwMiAxNTkgMyAxNTkgMTE2IDE2OSAxNyA1NiAxMjAgMTY1IDI1MyAxMDkgMjQ3IAorODUgMTU3IDM1IDU2IDIyMCAxNiAxNTIgMTI4IDIxNyAzNyAzNyAyMDMgNzQgMTczIDEyNiAyMyAxOTMgNjAgMTE2IDEyMiAyNyAyMzYgNyAKKzI2OCA4MyAyNDIgMTkxIDc5IDEzMyAyMjQgMTI1IDIzOCA4MiAxMTIgNjAgNTAgMjYyIDIyNSAyMyAyNDAgNTAgOTYgMjM1IDIwMyAxMjcgCisxNTMgNDUgODkgMTQ3IDEyMSAxMjkgMTE1IDM5IDE2NSAxODcgMjQ5IDE2NiAxNTEgMTExIDk2IDE4OCA1MyAyOCAyMDAgMTQ4IDE5OCAxIAorNjUgMTIzIDkxIDIyOCAxMTUgMjA1IDE1NSA3IDIwMiA2MyA0MiA5NyAxNTIgMTk0IDIzNyAxMTggMjUwIDEzMCAxMzIgMTYwIDE0IDExIAorMTQ1IDQwIDE2IDM5IDExOCAzNyAxNTAgMjEzIDk0IDYwIDIyOSAxMzIgNDcgNCAxMTAgOTggMjE2IDE4NiAxODUgNTUgNDMgMTc0IDI0IAorMjUgNDIgNDQgMTIgMjc1IDE3MSA0NSAxODkgMTE3IDIwIDE0OCA4NSAyNzAgMTY0IDc2IDI2NyAxMTkgMTAxIDI2MSAxNjEgMzEgMTMgCisyNzMgMTQzIDE5MSAzMiAxNDMgMTI1IDE3MiA2MiAzMSAyNDUgMTIzIDQ0IDIzOCAxMzUgMjUyIDI1OCAxMTYgNTYgNyAzNiA3MyA2MiAKKzE0NCAyNTUgMjQgOTEgNjIgMjQ0IDEwNiAyMDIgMTEwIDMyIDc3IDEwNSA5MSAxMjggMjY0IDI3IDEzNiAzNyAyNTAgNjQgMjcyIDc5IAorMTk5IDg0IDIwNiA1MyAxMjggNTEgNDcgMjE3IDI1MCAxNyAzIDI1OSAyNDYgMTg3IDM2IDE4NiA3MiA0NSAyMyAxMjcgMjAwIDE5NSAKKzE4OCAxMDAgMTggMjAgMjYxIDk1IDE3MSAyMTEgMTc5IDk3IDI1MiA0NSAyNTUgMTM3IDEwMSA4MiAxMiAyMDkgMzIgMjQzIDI1NSA3MSAKKzgxIDE2MSA3OCAzIDkzIDI1NiA4OCA4MyAxMCAxODEgMTc4IDg2IDEyMSAxNiAxMDUgMTM4IDExOCA4NCAxNDAgMzMgMjA3IDExNyAxMjAgCisyNzggMjYzIDEwIDE1IDE4OCAyNjYgMTY4IDExOSAyMTQgMjcxIDYyIDc4IDExNiAxMDMgMTU3IDEzNSAyNiAxMTkgMzUgMTIyIDgwIDk3IAorODYgNTUgMTU2IDI0IDQ0IDE5MSAxNDUgMTUzIDI2IDIxOSAxNjUgMTQwIDk5IDY3IDM4IDU0IDIwNSA0MiAyNzYgMjIgMTc2IDIxOCAKKzE0OCAxOSAxMzEgMjQzIDE0MiA2MSAxODAgMTE0IDI1NCAxNzMgMjM5IDMzIDk0IDEwNyAyMTkgMjMxIDE2MCAxODAgMSAyNDQgMjcyIAorMTkyIDIwOSAyNjQgMjUzIDE1NiAyMzcgMTg0IDI3MCAyMTEgMjI2IDg3IDcyIDE1OCAxNTIgMjggODcgMTkgMTggMjMzIDI0MSAxNCA3NyAKKzUgMTIxIDIyOSAyNDUgNTcgMTg0IDE1NyAyMDEgNDYgNDAgMTI5IDQ5IDE5IDg0IDkzIDQzIDEwOCA0IDIyMyAxMDggMTE3IDIzMyA5IDQgCis1NyAxMTggMTggMTIwIDExMiAxMTMgMTkwIDE4MSAxMiA5NiAyMiA2MyAyMDggMjQ3IDI1MSAyOCAxMzQgOSAxMTcgMTg2IDEzOCAxODQgCisyMjMgNjEgMTI3IDIxNiBeCis1OTAgMSAxNzUgMTA3IDYgMjQ3IDgxIDExNCAyMDcgMTc5IDEzNCA3NCAxOTUgMjEyIDczIDE3MyAxNTAgMTUyIDY3IDE5MCAxMSA5OCAKKzQ0IDE5MiA4MCAyMjEgMTQ2IDI3OSAxNTMgODggMzQgMTM5IDc4IDIyMSAxODkgMjI4IDI0IDQ1IDEyOCA5MCAyNzMgODQgNTEgMTExIAorNzUgNDYgMTA3IDQ5IDE5NiAyMzMgNzEgMjAgMjU3IDQ4IDY0IDU3IDk1IDI3OCAxNzQgMTI5IDExMSAyNzEgNTggMzEgNyAyMjYgMTk0IAorMzcgMjI5IDQ1IDE3MCAyNTYgMTk3IDE2OSA4MSA3MiA0MSAyNTUgMTc2IDQ0IDIzNCA5MiAxNDUgMTA0IDE1NSAxMTQgMjA4IDI0MyAKKzIwOCAyMDAgMjU5IDQ4IDIxIDEwOCAyMjQgNDAgODAgMTc4IDE5NyAxMjcgMTk2IDE0OCAyMzcgMjI1IDIxNSA3OCAyNSAyMyAyMyA2NiAKKzE1IDE2NyAxMjQgNjQgMTUgMjEwIDczIDIxNiA5OSAyMyAxNTEgMTMwIDI0MyAxNjYgMzQgNTQgMjQ0IDE0NSAxNDcgMjU4IDExMiAxMSAKKzU2IDE1OSAyNjggMTIyIDY0IDU4IDE1OSAyMjUgMTkgMTkzIDEwMSAyMTkgMjc0IDEwNSA0OSAyMzkgNTUgMjIzIDEwNCA3MCAxMjYgCisxMzIgMjAxIDIzOCAxNjEgMjI1IDEzMCA5MCAyMzAgMjYyIDUzIDI3IDEzNSA5NSAzOSA1OSA1MyA2OSAxNDcgMTkgMjc4IDIxNiAxNCAKKzM1IDc1IDg4IDI3MyAxMjcgMTU0IDI2MyAzMiAyNjcgMTg1IDExNyA1OSA5NSAyMzUgNzEgMjU4IDI3IDE3NyAyNjEgMTE3IDE0NCA4MyAKKzMwIDI2NyAyMjggNjYgMjExIDUyIDQ4IDIyIDE3MiAxNzEgMzkgMTQ0IDE2OCAxNDUgNjIgMTQzIDM2IDI1MCA4NiAxMjAgMjM0IDUwIAorMTMzIDE4MCA3MCA4NCAyNDcgMjc3IDI4MCAxMzEgMTM3IDEwIDE2MiAxNjEgMTQwIDE0MiAxNCAxODggMTEgMTQxIDI3NCA2MyAxNjQgCiszNCA5NyAxOTMgMTYgMTA0IDE5OCA2MyA3OSAyMDAgMjEgMTUxIDE3MyAxOTIgMzcgMjcyIDE0OCA0MSA1OSAxMCAxMjAgMTQ5IDIxNiAKKzU3IDEzOCAyMjcgNDUgMjEzIDIwNSA2OCAxMjYgMTc1IDE1MCAxMDkgMTE4IDM4IDIwOCAxNTggOTMgMTI0IDIxNyA3OCAyNjMgNzQgCisxNTIgMTA5IDc1IDg5IDU2IDIwMSAxNTMgNDYgMTQ5IDIxNSAxMjAgMTkxIDEwMSAyNjIgOTYgMjU3IDEzMyA1MiAxMzMgMTM3IDI0OCAKKzIxMyA5IDE4MyAyMDIgMjE3IDI3NCAxNDggMjc5IDExMCAxMzkgMTYzIDU1IDI2NSAyNzAgMjc1IDg0IDggMTYyIDIwNCA4OSAxMyAyNTIgCisxIDg5IDIwOSAxMzcgMjA2IDQ3IDg1IDk4IDE3MiAyNTYgMTU0IDIyMCAyMTAgMTE1IDEwMSAyMyAxMDggMTgxIDkxIDIwOSA5NCAxMDMgCisxNzYgMSA0IDk0IDYxIDEwIDc3IDQ2IDY0IDEwMCA0NCAxNDkgMjU4IDY5IDYyIDE4NSAyMDIgMTc0IDE3MSAyNzcgMTk1IDE2IDYxIAorMjQ5IDE5MiAxMjIgMTA2IDcwIDgzIDI5IDQ5IDY3IDE0NyA2MiAxMDAgODcgOTggMTI5IDI2IDIgMTM2IDI3MCAzNyAzMyAxNjAgMjQ2IAorMTcgNDAgODEgMTE1IDE0NCAxMjYgMjYwIDEzOCAxODUgMTYwIDggMjQ3IDM4IDE2NSA1NSAyMjIgNDAgMTIzIDY4IDIxMSA5IDIyNiAKKzE1MSA4OCA3NyAyNDIgMjMwIDI0IDIgMjUgMjE5IDE4OSAyNzEgMjU0IDE5NyAyMTIgMzAgMjI0IDI3OSAxOTUgMjU0IDIzOSA5NyAxMDggCisyOCAyOCAxNTYgOTMgMTY3IDE2NiAyMzAgMjIwIDE2OCAxMDMgMTc3IDY1IDIzMiAyMjAgMTI1IDI1IDI2MiAxMzggMTQyIDU3IDEzNyAKKzE2MyA5OCA4NyAxNDEgNzggMTc4IDI0MCA3NiA2NyAyMzIgMTc3IDIyIDEyOSA2OCAxNjggNjAgNzQgNjcgMjc1IDI4MCAxNzQgODYgCisxNjIgMTE5IDI1NSAyMTggMjEwIDE1OCA1MCAxNzUgNjUgMjc1IDQyIDI3NyAyMzggMTE5IDU5IDUyIDUgNzMgMjAgMjE0IDk5IDY2IAorMjU0IDEgNDYgMTA2IDI2NiAyNDkgMTA3IDcgMzAgMjggMTEzIDI3MSAxNSA4MiAxMzYgMjY5IDEwMCAyNDAgMzQgMTgyIDI3IDkyIDE0NiAKKzQxIDEwMiAyNDAgMjcyIDIzMyAxNTYgMTM1IDUyIDkwIDE4OCA5NiAxMjkgNjkgMTA1IDEzNCA3MyAxMzEgMjY1IDIyOCAxMDkgMTYwIAorMjA0IDEzMiAxMTYgMTIzIDg1IDE4MyA2IDUxIDY5IDE5MCAxMjIgMTQ5IDE3MyAyMzUgMjY3IDE0MyAyMzIgMTM1IDEwIDIwNSAyNjQgCisxMSA5OSAxMDggMTM5IDIwNiA0IDEzNiAyMjcgODggMzUgNzYgMjUgNjYgMjUzIDIxOCAyNTMgMjYxIDIwMiAxMzIgNSA3MiAyMzcgMTQwIAorMjAzIF4KKzYyMCAwIDI3OSAyNjIgNTEgMjYxIDMwIDIyNCAyMzQgMjQ0IDEwMiAxNTEgMyAxNTUgMTEyIDE2MSA5IDU2IDExMiAxNjUgMjQ5IDEwNSAKKzI0MyA3NyAxNTcgMjMgNDQgMjE2IDEyIDE0MCAxMjQgMjE3IDMzIDI5IDIwMyA2MiAxNjUgMTIyIDE5IDE5MyA1NiAxMTYgMTIyIDE1IAorMjM2IDcgMjY4IDc1IDI0MiAxODMgNzEgMTI5IDIyMCAxMjUgMjM4IDcwIDEwOCA0OCA0NiAyNTggMjIxIDE1IDIzMiA1MCA4NCAyMjcgCisxOTUgMTI3IDE1MyA0NSA4MSAxMzUgMTIxIDEyNSAxMDcgMjcgMTU3IDE3OSAyNDEgMTY2IDEzOSA5OSA4OCAxODggNTMgMjQgMTk2IAorMTQ4IDE5MCAyNzIgNjEgMTE5IDc5IDIyNCAxMDMgMjAxIDE1MSAyODIgMTk4IDYzIDMwIDk3IDE0OCAxOTQgMjI5IDExMCAyNTAgMTI2IAorMTMyIDE1NiAyIDcgMTM3IDMyIDggMzEgMTE4IDM3IDEzOCAyMDkgOTQgNjAgMjI1IDEyOCA0NyAyNzkgMTEwIDk0IDIxMiAxODIgMTc3IAorNDMgNDMgMTY2IDEyIDEzIDM4IDMyIDEyIDI3MSAxNjcgMzMgMTg1IDExNyAxMiAxNDQgODEgMjY2IDE2NCA3NiAyNTkgMTE1IDEwMSAKKzI2MSAxNTcgMjcgMSAyNjUgMTQzIDE4NyAzMiAxMzUgMTE3IDE2OCA1OCAzMSAyNDUgMTIzIDQwIDIzMCAxMzUgMjQ0IDI1NCAxMDggNTIgCiszIDI0IDY5IDYyIDE0MCAyNTEgMjAgODMgNTAgMjQ0IDk4IDE5NCAxMDIgMjQgNjUgMTA1IDkxIDEyMCAyNTYgMjcgMTMyIDI1IDI0MiAKKzU2IDI2OCA3OSAxOTkgODQgMjAyIDQxIDEyOCA0MyAzOSAyMDkgMjQ2IDE3IDI3NCAyNTkgMjQyIDE4NyAyOCAxNzggNjggMzcgMTEgCisxMjMgMTkyIDE4NyAxODQgOTIgMTggMTYgMjUzIDg3IDE2MyAyMDcgMTc5IDg1IDI1MiA0MSAyNTUgMTI5IDg5IDgyIDQgMjAxIDIwIAorMjM5IDI0NyA1OSA3NyAxNTMgNjYgMjc4IDg1IDI0OCA4NCA3MSAyODEgMTc3IDE3NCA4NiAxMTcgMTYgMTAxIDEzMCAxMTQgNzYgMTMyIAorMjkgMTk5IDEwNSAxMTYgMjc0IDI1NSAyIDMgMTgwIDI2NiAxNjAgMTE5IDIxMCAyNjcgNTQgNzAgMTA0IDkxIDE0NSAxMjcgMjYgMTA3IAorMzEgMTE0IDgwIDg5IDc4IDQ3IDE1MiAyNCA0NCAxOTEgMTQxIDE0MSAxNCAyMTEgMTYxIDE0MCA5OSA2MyAzNCA1NCAxOTcgNDIgMjc2IAorMTggMTY4IDIxMCAxMzYgMTEgMTE5IDIzNSAxMzggNTMgMTgwIDExMCAyNDYgMTY5IDIzMSAyNSA5MCA5OSAyMTkgMjMxIDE1MiAxNzYgMSAKKzI0MCAyNzIgMTg4IDIwNSAyNjQgMjQ1IDE0NCAyMzcgMTgwIDI2MiAyMDMgMjE4IDc5IDcyIDE0NiAxNTIgMjAgODcgNyAxMCAyMjkgCisyNDEgMTAgNzcgMSAxMDkgMjI5IDIzNyA1MyAxNzYgMTUzIDE5NyAzOCAzNiAxMTcgMzcgMTUgODAgOTMgMzUgOTYgMjE5IDEwMCAxMDkgCisyMjUgMjgwIDQgNDUgMTA2IDYgMTIwIDEwMCAxMTMgMTgyIDE4MSA5MiAxNCA1OSAyMDQgMjM5IDI1MSAxNiAxMjYgMSAxMTMgMTg2IAorMTM4IDE4NCAyMjMgNjEgMTE1IDEyMiAxNzUgMTA3IDYgMjQzIDgxIDExNCAyMDcgMTc1IDEyOCA2OCAxOTMgMjA4IDczIDE3MSAxNDYgCisxNDggNjMgMTg2IDExIDk4IDM4IDE4OCA3NCAyMjEgMTQ2IDI3NSAxNDkgODggMzIgMTM5IDc0IDIxNyAxODkgMjI2IDE4IDQxIDEyNCAKKzg2IDI3MyA3OCA1MSAxMDkgNzMgNDAgMTAzIDQ5IDE5NCAyMzMgNjcgMTYgMjU3IDQ0IDY0IDU1IDkxIDI3NiAxNzAgMTI1IDExMSAyNjcgCis1OCAyNyA1IDIyMiAxOTIgMzUgMjI3IDQzIDE3MCAyNTIgMTk3IDE2OSA3OSA2OCA0MSAyNTEgMTcyIDQwIDIzNCA5MiAxNDUgMTAyIAorMTU1IDEwOCAyMDQgMjQzIDIwOCAyMDAgMjU3IDQ4IDIxIDEwNCAyMjIgNDAgNzggMTc4IDE5NSAxMjMgMTk2IDE0NCAyMzMgMjIzIDIxMyAKKzcyIDIzIDIzIDE5IDYyIDEzIDE2NSAxMTggNjIgOSAyMDggNjkgMjE0IDk3IDE3IDE1MSAxMzAgMjQxIDE2MiAzNCA1MCAyNDAgMTQxIAorMTQ1IDI1NCAxMTIgOSA1MiAxNTUgMjY0IDExOCA1OCA1MiAxNTkgMjIxIDE5IDE4OSA5OSAyMTUgMjc0IDEwMyA0NSAyMzcgNDkgMjE5IAorMTA0IDY2IDEyNiAxMjggMTk5IDIzNiAxNTkgMjI1IDEyNCA5MCAyMzAgMjYyIDQ3IDIxIDEyOSA5MyAzOSA1MyA0OSA2NyAxNDcgMTcgCisyNzggMjE2IDggMzUgNzUgODYgMjY5IDEyMSAxNTAgMjYxIDI2IDI2NyAxODUgMTEzIDU1IDk1IDIzMyA3MSAyNTYgMjMgMTc1IDI1OSAKKzExMSAxNDQgNzcgMjYgMjYzIDIyOCA2NCAyMDcgNDggNDIgMTggMTcyIDE2NyAzNyAxNDIgMTY2IDE0MyA1NiAxMzcgMzYgMjQ4IDgwIAorMTE0IDIzMiA0NiAxMjcgMjU3IF4KKzYwNSAxIDU4IDc2IDI0MyAyNzMgMjgwIDEzMSAxMjUgNiAxNjIgMTYxIDEzMiAxNDIgMTQgMTg0IDMgMTQxIDI3MCA1MSAxNjAgMjYgODkgCisxODkgNCA5MiAxOTggNTUgNjcgMTkyIDEzIDE0MyAxNzMgMTkyIDI1IDI2OCAxMzYgMzcgNTUgMiAxMTIgMTM3IDIwOCA0NSAxMzAgMjI3IAorMzMgMjEzIDIwMSA2NCAxMTggMTY3IDE1MCAxMDEgMTA2IDMwIDIwNCAxNTAgODkgMTI0IDIwOSA3NCAyNjMgNzAgMTQ4IDEwOSA2MyA3NyAKKzUyIDIwMSAxNDEgMzggMTQ5IDIxNSAxMTYgMTg3IDg5IDI1NCA4NCAyNTMgMTMzIDQwIDEyOSAxMzMgMjQ4IDIwOSA5IDE4MyAxOTQgCisyMTMgMjY2IDE0NCAyNzkgMTAyIDEzNSAxNjMgNDcgMjY1IDI3MCAyNzEgODAgOCAxNTQgMjA0IDg1IDkgMjQ4IDI3NCA4OSAyMDEgMTI5IAorMTk4IDQzIDg1IDg2IDE2OCAyNTYgMTU0IDIxNiAyMTAgMTE1IDkzIDE5IDEwOCAxNzcgODcgMjA5IDg2IDEwMyAxNzYgMjc4IDI4MSA4MiAKKzUzIDEwIDY5IDQyIDU2IDk2IDQwIDE0MSAyNTggNjkgNTQgMTgxIDIwMiAxNzAgMTcxIDI3NyAxODcgMTIgNDkgMjQ1IDE4OCAxMTggCisxMDIgNzAgODMgMjkgNDUgNjcgMTM5IDU4IDg4IDgzIDk0IDEyNSAxOCAyIDEyNCAyNjIgMjkgMzMgMTYwIDI0NiA5IDI4IDY5IDEwNyAKKzEzNiAxMTQgMjYwIDEyNiAxNzcgMTUyIDQgMjQ3IDM4IDE2MSA1NSAyMjIgMzIgMTE5IDI3MyA2MCAyMTEgMSAyMjYgMTQ3IDgwIDczIAorMjM0IDIyMiAyMCAyNzkgMjUgMjE1IDE4MSAyNjcgMjUwIDE4OSAyMTIgMzAgMjE2IDI3NSAxOTUgMjU0IDIzOSA5MyA5NiAyOCAxNiAKKzE1MiA4MSAxNjcgMTYyIDIyNiAyMTIgMTYwIDkxIDE2OSA2NSAyMjQgMjIwIDExNyAyODEgMTcgMjU4IDEzNCAxMzQgNTcgMTM3IDE1NSAKKzkwIDc1IDEzNyA3OCAxNzAgMjM2IDcyIDYzIDIzMiAxNzcgMjIgMTI5IDY4IDE2OCA0OCA3NCA1NSAyNzUgMjcyIDE3NCA3OCAxNTggCisxMTEgMjUxIDIxOCAyMDIgMTU4IDQ2IDE3MSA1NyAyNjcgMzAgMjY5IDIzMCAxMDcgNTkgNTIgMjc4IDYxIDIwIDIxNCA4NyA1NCAyNDYgCisyODIgNDYgMTA2IDI2MiAyNDkgOTUgMjg0IDI2IDI0IDEwOSAyNzEgMTUgNzAgMTM2IDI2OSAxMDAgMjMyIDIyIDE4MiAyMyA4MCAxMzggCisyOSA5OCAyNDAgMjY0IDIyOSAxNTYgMTMxIDQ4IDg2IDE4MCA5NiAxMTcgNjEgOTcgMTM0IDY5IDExOSAyNjEgMjIwIDEwNSAxNTYgMTk2IAorMTI4IDEwNCAxMTUgODEgMTc5IDIgNDcgNTcgMTkwIDExMCAxNDUgMTY1IDIzNSAyNjMgMTM1IDIyOCAxMjcgMjgzIDIwNSAyNTYgMjg0IAorOTEgMTA0IDEyNyAyMDYgMTMyIDIxOSA3NiAyMyA2OCAxMyA2NiAyNTMgMjEwIDI0NSAyNTMgMTk4IDEyMCA1IDY4IDIzMyAxMjggOTIgCisyNzUgMjYwIDQ5IDI1NyAyOCAyMjQgMjMyIDI0MiAxMDIgMTQ3IDMgMTUzIDExMCAxNTcgNSA1NiAxMDggMTY1IDI0NyAxMDMgMjQxIDczIAorMTU3IDE3IDM4IDIxNCAxMCAxMzQgMTIyIDIxNyAzMSAyNSAyMDMgNTYgMTYxIDEyMCAxNyAxOTMgNTQgMTE2IDEyMiA5IDIzNiA3IDI2OCAKKzcxIDI0MiAxNzkgNjcgMTI3IDIxOCAxMjUgMjM4IDY0IDEwNiA0MiA0NCAyNTYgMjE5IDExIDIyOCA1MCA3OCAyMjMgMTkxIDEyNyAxNTMgCis0NSA3NyAxMjkgMTIxIDEyMyAxMDMgMjEgMTUzIDE3NSAyMzcgMTY2IDEzMyA5MyA4NCAxODggNTMgMjIgMTk0IDE0OCAxODYgMjY4IDU5IAorMTE3IDczIDIyMiA5NyAxOTkgMTQ5IDI4MCAxOTYgNjMgMjQgOTcgMTQ2IDE5NCAyMjUgMTA2IDI1MCAxMjQgMTMyIDE1NCAyODEgNSAKKzEzMyAyOCA0IDI3IDExOCAzNyAxMzIgMjA3IDk0IDYwIDIyMyAxMjYgNDcgMjc3IDExMCA5MiAyMTAgMTgwIDE3MyAzNyA0MyAxNjIgNiAKKzcgMzYgMjYgMTIgMjY5IDE2NSAyNyAxODMgMTE3IDggMTQyIDc5IDI2NCAxNjQgNzYgMjU1IDExMyAxMDEgMjYxIDE1NSAyNSAyODAgCisyNjEgMTQzIDE4NSAzMiAxMzEgMTEzIDE2NiA1NiAzMSAyNDUgMTIzIDM4IDIyNiAxMzUgMjQwIDI1MiAxMDQgNTAgMSAxOCA2NyA2MiAKKzEzOCAyNDkgMTggNzkgNDQgMjQ0IDk0IDE5MCA5OCAyMCA1OSAxMDUgOTEgMTE2IDI1MiAyNyAxMzAgMTkgMjM4IDUyIDI2NiA3OSAxOTkgCis4NCAyMDAgMzUgMTI4IDM5IDM1IDIwNSAyNDQgMTcgMjcwIDI1OSAyNDAgMTg3IDI0IDE3NCA2NiAzMyA1IDEyMSAxODggMTgzIDE4MiAKKzg4IDE4IDE0IDI0OSA4MyAxNTkgMjA1IDE3OSA3OSAyNTIgMTg2IF4KKzYxNSAwIDI1NSAxMjEgNzcgODIgMjgzIDE5MyA4IDIzNSAyMzkgNDcgNzMgMTQ1IDU0IDI3NCA3NyAyNDAgODAgNTkgMjczIDE3MyAxNzAgCis4NiAxMTMgMTYgOTcgMTIyIDExMCA2OCAxMjQgMjUgMTkxIDkzIDExMiAyNzAgMjQ3IDI4MSAyNzggMTcyIDI2NiAxNTIgMTE5IDIwNiAKKzI2MyA0NiA2MiA5MiA3OSAxMzMgMTE5IDI2IDk1IDI3IDEwNiA4MCA4MSA3MCAzOSAxNDggMjQgNDQgMTkxIDEzNyAxMjkgMiAyMDMgCisxNTcgMTQwIDk5IDU5IDMwIDU0IDE4OSA0MiAyNzYgMTQgMTYwIDIwMiAxMjQgMyAxMDcgMjI3IDEzNCA0NSAxODAgMTA2IDIzOCAxNjUgCisyMjMgMTcgODYgOTEgMjE5IDIzMSAxNDQgMTcyIDEgMjM2IDI3MiAxODQgMjAxIDI2NCAyMzcgMTMyIDIzNyAxNzYgMjU0IDE5NSAyMTAgCis3MSA3MiAxMzQgMTUyIDEyIDg3IDI4MiAyIDIyNSAyNDEgNiA3NyAyODQgOTcgMjI5IDIyOSA0OSAxNjggMTQ5IDE5MyAzMCAzMiAxMDUgCisyNSAxMSA3NiA5MyAyNyA4NCAyODMgMjE1IDkyIDEwMSAyMTcgMjcyIDQgMzMgOTQgMjgxIDEyMCA4OCAxMTMgMTc0IDE4MSAyNzUgODggCis2IDU1IDIwMCAyMzEgMjUxIDQgMTE4IDI4MCAxMDkgMTg2IDEzOCAxODQgMjIzIDYxIDEwMyAxMTAgMTc1IDEwNyA2IDIzNSA4MSAxMTQgCisyMDcgMTY3IDExNiA1NiAxODkgMjAwIDczIDE2NyAxMzggMTQwIDU1IDE3OCAxMSA5OCAyNiAxODAgNjIgMjIxIDE0NiAyNjcgMTQxIDg4IAorMjggMTM5IDY2IDIwOSAxODkgMjIyIDYgMzMgMTE2IDc4IDI3MyA2NiA1MSAxMDUgNjkgMjggOTUgNDkgMTkwIDIzMyA1OSA4IDI1NyAzNiAKKzY0IDUxIDgzIDI3MiAxNjIgMTE3IDExMSAyNTkgNTggMTkgMSAyMTQgMTg4IDMxIDIyMyAzOSAxNzAgMjQ0IDE5NyAxNjkgNzUgNjAgNDEgCisyNDMgMTY0IDMyIDIzNCA5MiAxNDUgOTggMTU1IDk2IDE5NiAyNDMgMjA4IDIwMCAyNTMgNDggMjEgOTYgMjE4IDQwIDc0IDE3OCAxOTEgCisxMTUgMTk2IDEzNiAyMjUgMjE5IDIwOSA2MCAxOSAyMyAxMSA1NCA5IDE2MSAxMDYgNTggMjg0IDIwNCA2MSAyMTAgOTMgNSAxNTEgMTMwIAorMjM3IDE1NCAzNCA0MiAyMzIgMTMzIDE0MSAyNDYgMTEyIDUgNDQgMTQ3IDI1NiAxMTAgNDYgNDAgMTU5IDIxMyAxOSAxODEgOTUgMjA3IAorMjc0IDk5IDM3IDIzMyAzNyAyMTEgMTA0IDU4IDEyNiAxMjAgMTk1IDIzMiAxNTUgMjI1IDExMiA5MCAyMzAgMjYyIDM1IDkgMTE3IDg5IAorMzkgNDEgNDEgNjMgMTQ3IDEzIDI3OCAyMTYgMjgzIDM1IDc1IDgyIDI2MSAxMDkgMTQyIDI1NyAxNCAyNjcgMTg1IDEwNSA0NyA5NSAKKzIyOSA3MSAyNTIgMTUgMTcxIDI1NSA5OSAxNDQgNjUgMTggMjU1IDIyOCA2MCAxOTkgNDAgMzAgMTAgMTcyIDE1OSAzMyAxMzggMTYyIAorMTM5IDQ0IDEyNSAzNiAyNDQgNjggMTAyIDIyOCAzOCAxMTUgMTc0IDUyIDcyIDI0MSAyNzEgMjgwIDEzMSAxMTkgNCAxNjIgMTYxIDEyOCAKKzE0MiAxNCAxODIgMjg2IDE0MSAyNjggNDUgMTU4IDIyIDg1IDE4NyAyODUgODYgMTk4IDUxIDYxIDE4OCA5IDEzOSAxNzMgMTkyIDE5IAorMjY2IDEzMCAzNSA1MyAyODUgMTA4IDEzMSAyMDQgMzkgMTI2IDIyNyAyNyAyMTMgMTk5IDYyIDExNCAxNjMgMTUwIDk3IDEwMCAyNiAKKzIwMiAxNDYgODcgMTI0IDIwNSA3MiAyNjMgNjggMTQ2IDEwOSA1NyA3MSA1MCAyMDEgMTM1IDM0IDE0OSAyMTUgMTE0IDE4NSA4MyAyNTAgCis3OCAyNTEgMTMzIDM0IDEyNyAxMzEgMjQ4IDIwNyA5IDE4MyAxOTAgMjExIDI2MiAxNDIgMjc5IDk4IDEzMyAxNjMgNDMgMjY1IDI3MCAKKzI2OSA3OCA4IDE1MCAyMDQgODMgNyAyNDYgMjcwIDg5IDE5NyAxMjUgMTk0IDQxIDg1IDgwIDE2NiAyNTYgMTU0IDIxNCAyMTAgMTE1IAorODkgMTcgMTA4IDE3NSA4NSAyMDkgODIgMTAzIDE3NiAyNzYgMjc5IDc2IDQ5IDEwIDY1IDQwIDUyIDk0IDM4IDEzNyAyNTggNjkgNTAgCisxNzkgMjAyIDE2OCAxNzEgMjc3IDE4MyAxMCA0MyAyNDMgMTg2IDExNiAxMDAgNzAgODMgMjkgNDMgNjcgMTM1IDU2IDgyIDgxIDkyIAorMTIzIDE0IDIgMTE4IDI1OCAyNSAzMyAxNjAgMjQ2IDUgMjIgNjMgMTAzIDEzMiAxMDggMjYwIDEyMCAxNzMgMTQ4IDIgMjQ3IDM4IDE1OSAKKzU1IDIyMiAyOCAxMTcgMjY5IDU2IDIxMSAyODQgMjI2IDE0NSA3NiA3MSAyMzAgMjE4IDE4IDI3NyAyNSAyMTMgMTc3IDI2NSAyNDggCisxODUgMjEyIDMwIDIxMiAyNzMgMTk1IDI1NCAyMzkgOTEgOTAgMjggMTAgMTUwIDc1IDE2NyAxNjAgMjI0IDE3NSBeCis2MTMgMCAxNTIgNzkgMTYxIDY1IDIxNiAyMjAgMTA5IDI4MSA5IDI1NCAxMzAgMTI2IDU3IDEzNyAxNDcgODIgNjMgMTMzIDc4IDE2MiAKKzIzMiA2OCA1OSAyMzIgMTc3IDIyIDEyOSA2OCAxNjggMzYgNzQgNDMgMjc1IDI2NCAxNzQgNzAgMTU0IDEwMyAyNDcgMjE4IDE5NCAxNTggCis0MiAxNjcgNDkgMjU5IDE4IDI2MSAyMjIgOTUgNTkgNTIgMjcwIDQ5IDIwIDIxNCA3NSA0MiAyMzggMjgyIDQ2IDEwNiAyNTggMjQ5IDgzIAorMjgwIDIyIDIwIDEwNSAyNzEgMTUgNTggMTM2IDI2OSAxMDAgMjI0IDEwIDE4MiAxOSA2OCAxMzAgMTcgOTQgMjQwIDI1NiAyMjUgMTU2IAorMTI3IDQ0IDgyIDE3MiA5NiAxMDUgNTMgODkgMTM0IDY1IDEwNyAyNTcgMjEyIDEwMSAxNTIgMTg4IDEyNCA5MiAxMDcgNzcgMTc1IDI4NyAKKzQzIDQ1IDE5MCA5OCAxNDEgMTU3IDIzNSAyNTkgMTI3IDIyNCAxMTkgMjc1IDIwNSAyNDggMjc2IDgzIDEwMCAxMTUgMjA2IDI4NSAxMjggCisyMTEgNjQgMTEgNjAgMSA2NiAyNTMgMjAyIDIzNyAyNDUgMTk0IDEwOCA1IDY0IDIyOSAxMTYgODQgMjY3IDI1NiA0NSAyNDkgMjQgMjI0IAorMjI4IDIzOCAxMDIgMTM5IDMgMTQ5IDEwNiAxNDkgMjg2IDU2IDEwMCAxNjUgMjQzIDk5IDIzNyA2NSAxNTcgNSAyNiAyMTAgNiAxMjIgCisxMTggMjE3IDI3IDE3IDIwMyA0NCAxNTMgMTE2IDEzIDE5MyA1MCAxMTYgMTIyIDI4NiAyMzYgNyAyNjggNjMgMjQyIDE3MSA1OSAxMjMgCisyMTQgMTI1IDIzOCA1MiAxMDIgMzAgNDAgMjUyIDIxNSAzIDIyMCA1MCA2NiAyMTUgMTgzIDEyNyAxNTMgNDUgNjkgMTE3IDEyMSAxMTkgCis5NSA5IDE0NSAxNjcgMjI5IDE2NiAxMjEgODEgNzYgMTg4IDUzIDE4IDE5MCAxNDggMTc4IDI2MCA1NSAxMTMgNjEgMjE4IDg1IDE5NSAKKzE0NSAyNzYgMTkyIDYzIDEyIDk3IDE0MiAxOTQgMjE3IDk4IDI1MCAxMjAgMTMyIDE1MCAyNzMgMSAxMjUgMjAgMjg1IDE5IDExOCAzNyAKKzEyMCAyMDMgOTQgNjAgMjE5IDEyMiA0NyAyNzMgMTEwIDg4IDIwNiAxNzYgMTY1IDI1IDQzIDE1NCAyODMgMjg0IDMyIDE0IDEyIDI2NSAKKzE2MSAxNSAxNzkgMTE3IDEzOCA3NSAyNjAgMTY0IDc2IDI0NyAxMDkgMTAxIDI2MSAxNTEgMjEgMjcyIDI1MyAxNDMgMTgxIDMyIDEyMyAKKzEwNSAxNjIgNTIgMzEgMjQ1IDEyMyAzNCAyMTggMTM1IDIzMiAyNDggOTYgNDYgMjg2IDYgNjMgNjIgMTM0IDI0NSAxNCA3MSAzMiAyNDQgCis4NiAxODIgOTAgMTIgNDcgMTA1IDkxIDEwOCAyNDQgMjcgMTI2IDcgMjMwIDQ0IDI2MiA3OSAxOTkgODQgMTk2IDIzIDEyOCAzMSAyNyAKKzE5NyAyNDAgMTcgMjYyIDI1OSAyMzYgMTg3IDE2IDE2NiA2MiAyNSAyODIgMTE3IDE4MCAxNzUgMTc4IDgwIDE4IDEwIDI0MSA3NSAxNTEgCisyMDEgMTc5IDY3IDI1MiAzNSAyNTUgMTE3IDcxIDgyIDI4MSAxODkgMiAyMzMgMjM1IDQxIDcxIDE0MSA0OCAyNzIgNzMgMjM2IDc4IDUzIAorMjY5IDE3MSAxNjggODYgMTExIDE2IDk1IDExOCAxMDggNjQgMTIwIDIzIDE4NyA4NyAxMTAgMjY4IDI0MyAyNzkgMjc0IDE2OCAyNjYgCisxNDggMTE5IDIwNCAyNjEgNDIgNTggODYgNzMgMTI3IDExNSAyNiA4OSAyNSAxMDIgODAgNzcgNjYgMzUgMTQ2IDI0IDQ0IDE5MSAxMzUgCisxMjMgMjg1IDE5OSAxNTUgMTQwIDk5IDU3IDI4IDU0IDE4NSA0MiAyNzYgMTIgMTU2IDE5OCAxMTggMjg4IDEwMSAyMjMgMTMyIDQxIAorMTgwIDEwNCAyMzQgMTYzIDIxOSAxMyA4NCA4NyAyMTkgMjMxIDE0MCAxNzAgMSAyMzQgMjcyIDE4MiAxOTkgMjY0IDIzMyAxMjYgMjM3IAorMTc0IDI1MCAxOTEgMjA2IDY3IDcyIDEyOCAxNTIgOCA4NyAyNzggMjg3IDIyMyAyNDEgNCA3NyAyODQgOTEgMjI5IDIyNSA0NyAxNjQgCisxNDcgMTkxIDI2IDMwIDk5IDE5IDkgNzQgOTMgMjMgNzggMjgzIDIxMyA4OCA5NyAyMTMgMjY4IDQgMjcgODggMjc3IDEyMCA4MiAxMTMgCisxNzAgMTgxIDI3MSA4NiAyIDUzIDE5OCAyMjcgMjUxIDI4NyAxMTQgMjc4IDEwNyAxODYgMTM4IDE4NCAyMjMgNjEgOTcgMTA0IDE3NSAKKzEwNyA2IDIzMSA4MSAxMTQgMjA3IDE2MyAxMTAgNTAgMTg3IDE5NiA3MyAxNjUgMTM0IDEzNiA1MSAxNzQgMTEgOTggMjAgMTc2IDU2IAorMjIxIDE0NiAyNjMgMTM3IDg4IDI2IDEzOSA2MiAyMDUgMTg5IDIyMCAyOSAxMTIgNzQgMjczIDYwIDUxIDEwMyA2NyAyMiA5MSA0OSAKKzE4OCAyMzMgNTUgNCAyNTcgMzIgNjQgNDkgNzkgMjcwIDE1OCAxMTMgMTExIDI1NSA1OCAxNSAyODggMjEwIDIxMyBeCis2MjQgMSAyOCAyMjAgMzYgMTcwIDIzOCAxOTcgMTY5IDcyIDU0IDQxIDIzNyAxNTggMjYgMjM0IDkyIDE0NSA5NSAxNTUgODcgMTkwIAorMjQzIDIwOCAyMDAgMjUwIDQ4IDIxIDkwIDIxNSA0MCA3MSAxNzggMTg4IDEwOSAxOTYgMTMwIDIxOSAyMTYgMjA2IDUxIDE2IDIzIDUgCis0OCA2IDE1OCA5NyA1NSAyNzggMjAxIDU1IDIwNyA5MCAyODYgMTUxIDEzMCAyMzQgMTQ4IDM0IDM2IDIyNiAxMjcgMTM4IDI0MCAxMTIgCisyIDM4IDE0MSAyNTAgMTA0IDM3IDMxIDE1OSAyMDcgMTkgMTc1IDkyIDIwMSAyNzQgOTYgMzEgMjMwIDI4IDIwNSAxMDQgNTIgMTI2IAorMTE0IDE5MiAyMjkgMTUyIDIyNSAxMDMgOTAgMjMwIDI2MiAyNiAxMDggODYgMzkgMzIgMzUgNjAgMTQ3IDEwIDI3OCAyMTYgMjc3IDM1IAorNzUgNzkgMjU1IDEwMCAxMzYgMjU0IDUgMjY3IDE4NSA5OSA0MSA5NSAyMjYgNzEgMjQ5IDkgMTY4IDI1MiA5MCAxNDQgNTYgMTIgMjQ5IAorMjI4IDU3IDE5MyAzNCAyMSA0IDE3MiAxNTMgMzAgMTM1IDE1OSAxMzYgMzUgMTE2IDM2IDI0MSA1OSA5MyAyMjUgMzIgMTA2IDE3MSA0MyAKKzY2IDIzOCAyNjggMjgwIDEzMSAxMTAgMSAxNjIgMTYxIDEyMiAxNDIgMTQgMTc5IDI4MyAxNDEgMjY1IDM2IDE1NSAxNiA3OSAxODQgCisyNzkgNzcgMTk4IDQ1IDUyIDE4MiAzIDEzMyAxNzMgMTkyIDEwIDI2MyAxMjEgMzIgNTAgMjgyIDEwMiAxMjIgMTk4IDMwIDEyMCAyMjcgCisxOCAyMTMgMTk2IDU5IDEwOCAxNTcgMTUwIDkxIDkxIDIwIDE5OSAxNDAgODQgMTI0IDE5OSA2OSAyNjMgNjUgMTQzIDEwOSA0OCA2MiAKKzQ3IDIwMSAxMjYgMjggMTQ5IDIxNSAxMTEgMTgyIDc0IDI0NCA2OSAyNDggMTMzIDI1IDEyNCAxMjggMjQ4IDIwNCA5IDE4MyAxODQgCisyMDggMjU2IDEzOSAyNzkgOTIgMTMwIDE2MyAzNyAyNjUgMjcwIDI2NiA3NSA4IDE0NCAyMDQgODAgNCAyNDMgMjY0IDg5IDE5MSAxMTkgCisxODggMzggODUgNzEgMTYzIDI1NiAxNTQgMjExIDIxMCAxMTUgODMgMTQgMTA4IDE3MiA4MiAyMDkgNzYgMTAzIDE3NiAyNzMgMjc2IDY3IAorNDMgMTAgNTkgMzcgNDYgOTEgMzUgMTMxIDI1OCA2OSA0NCAxNzYgMjAyIDE2NSAxNzEgMjc3IDE3NyA3IDM0IDI0MCAxODMgMTEzIDk3IAorNzAgODMgMjkgNDAgNjcgMTI5IDUzIDczIDc4IDg5IDEyMCA4IDIgMTA5IDI1MiAxOSAzMyAxNjAgMjQ2IDI4OSAxMyA1NCA5NyAxMjYgCis5OSAyNjAgMTExIDE2NyAxNDIgMjg5IDI0NyAzOCAxNTYgNTUgMjIyIDIyIDExNCAyNjMgNTAgMjExIDI4MSAyMjYgMTQyIDcwIDY4IAorMjI0IDIxMiAxNSAyNzQgMjUgMjEwIDE3MSAyNjIgMjQ1IDE3OSAyMTIgMzAgMjA2IDI3MCAxOTUgMjU0IDIzOSA4OCA4MSAyOCAxIDE0NyAKKzY2IDE2NyAxNTcgMjIxIDIwMiAxNTAgNzYgMTU5IDY1IDIxNCAyMjAgMTA3IDI4MSA3IDI1MyAxMjkgMTI0IDU3IDEzNyAxNDUgODAgNjAgCisxMzIgNzggMTYwIDIzMSA2NyA1OCAyMzIgMTc3IDIyIDEyOSA2OCAxNjggMzMgNzQgNDAgMjc1IDI2MiAxNzQgNjggMTUzIDEwMSAyNDYgCisyMTggMTkyIDE1OCA0MSAxNjYgNDcgMjU3IDE1IDI1OSAyMjAgOTIgNTkgNTIgMjY4IDQ2IDIwIDIxNCA3MiAzOSAyMzYgMjgyIDQ2IAorMTA2IDI1NyAyNDkgODAgMjc5IDIxIDE5IDEwNCAyNzEgMTUgNTUgMTM2IDI2OSAxMDAgMjIyIDcgMTgyIDE4IDY1IDEyOCAxNCA5MyAKKzI0MCAyNTQgMjI0IDE1NiAxMjYgNDMgODEgMTcwIDk2IDEwMiA1MSA4NyAxMzQgNjQgMTA0IDI1NiAyMTAgMTAwIDE1MSAxODYgMTIzIAorODkgMTA1IDc2IDE3NCAyODcgNDIgNDIgMTkwIDk1IDE0MCAxNTUgMjM1IDI1OCAxMjUgMjIzIDExNyAyNzMgMjA1IDI0NiAyNzQgODEgCis5OSAxMTIgMjA2IDI4NSAxMjcgMjA5IDYxIDggNTggMjg4IDY2IDI1MyAyMDAgMjM1IDI0MyAxOTMgMTA1IDUgNjMgMjI4IDExMyA4MiAKKzI2NSAyNTUgNDQgMjQ3IDIzIDIyNCAyMjcgMjM3IDEwMiAxMzcgMyAxNDggMTA1IDE0NyAyODUgNTYgOTggMTY1IDI0MiA5OCAyMzYgNjMgCisxNTcgMiAyMyAyMDkgNSAxMTkgMTE3IDIxNyAyNiAxNSAyMDMgNDEgMTUxIDExNSAxMiAxOTMgNDkgMTE2IDEyMiAyODQgMjM2IDcgMjY4IAorNjEgMjQyIDE2OSA1NyAxMjIgMjEzIDEyNSAyMzggNDkgMTAxIDI3IDM5IDI1MSAyMTQgMSAyMTggNTAgNjMgMjEzIDE4MSAxMjcgMTUzIAorNDUgNjcgMTE0IDEyMSAxMTggOTMgNiAxNDMgMTY1IDIyNyAxNjYgMTE4IDc4IDc0IDE4OCA1MyAxNyAxODkgMTQ4IDE3NiAyNTggNTQgCisxMTIgNTggMjE3IDgyIDE5NCAxNDQgMjc1IDE5MSAxNDEgXgorNjI4IDEgMyA5NyAxMzkgMTk0IDIxMSA5MiAyNTAgMTE3IDEzMiAxNDcgMjY3IDI5MCAxMTkgMTQgMjgyIDEzIDExOCAzNyAxMTEgMjAwIAorOTQgNjAgMjE2IDExOSA0NyAyNzAgMTEwIDg1IDIwMyAxNzMgMTU5IDE2IDQzIDE0OCAyNzcgMjc4IDI5IDUgMTIgMjYyIDE1OCA2IDE3NiAKKzExNyAyODYgMTM1IDcyIDI1NyAxNjQgNzYgMjQxIDEwNiAxMDEgMjYxIDE0OCAxOCAyNjYgMjQ3IDE0MyAxNzggMzIgMTE3IDk5IDE1OSAKKzQ5IDMxIDI0NSAxMjMgMzEgMjEyIDEzNSAyMjYgMjQ1IDkwIDQzIDI4NiAyODkgNjAgNjIgMTMxIDI0MiAxMSA2NSAyMyAyNDQgODAgCisxNzYgODQgNiAzOCAxMDUgOTEgMTAyIDIzOCAyNyAxMjMgMjkwIDIyNCAzOCAyNTkgNzkgMTk5IDg0IDE5MyAxNCAxMjggMjUgMjEgMTkxIAorMjM3IDE3IDI1NiAyNTkgMjMzIDE4NyAxMCAxNjAgNTkgMTkgMjc2IDExNCAxNzQgMTY5IDE3NSA3NCAxOCA3IDIzNSA2OSAxNDUgMTk4IAorMTc5IDU4IDI1MiAzMiAyNTUgMTExIDYyIDgyIDI3OCAxODMgMjg1IDIzMCAyMjkgMzIgNjggMTM1IDM5IDI2OSA2NyAyMzAgNzUgNDQgCisyNjMgMTY4IDE2NSA4NiAxMDggMTYgOTIgMTEyIDEwNSA1OCAxMTQgMjAgMTgxIDc4IDEwNyAyNjUgMjM3IDI3NiAyNjggMTYyIDI2NiAKKzE0MiAxMTkgMjAxIDI1OCAzNiA1MiA3NyA2NCAxMTggMTA5IDI2IDgwIDIyIDk2IDgwIDcxIDYwIDI5IDE0MyAyNCA0NCAxOTEgMTMyIAorMTE0IDI3OSAxOTMgMTUyIDE0MCA5OSA1NCAyNSA1NCAxNzkgNDIgMjc2IDkgMTUwIDE5MiAxMDkgMjg1IDkyIDIxNyAxMjkgMzUgMTgwIAorMTAxIDIyOCAxNjAgMjEzIDcgODEgODEgMjE5IDIzMSAxMzQgMTY3IDEgMjMxIDI3MiAxNzkgMTk2IDI2NCAyMjcgMTE3IDIzNyAxNzEgCisyNDQgMTg1IDIwMCA2MSA3MiAxMTkgMTUyIDIgODcgMjcyIDI4NCAyMjAgMjQxIDEgNzcgMjg0IDgyIDIyOSAyMTkgNDQgMTU4IDE0NCAKKzE4OCAyMCAyNyA5MCAxMCA2IDcxIDkzIDE3IDY5IDI4MyAyMTAgODIgOTEgMjA3IDI2MiA0IDE4IDc5IDI3MSAxMjAgNzMgMTEzIDE2NCAKKzE4MSAyNjUgODMgMjg4IDUwIDE5NSAyMjEgMjUxIDI4MSAxMDggMjc1IDEwNCAxODYgMTM4IDE4NCAyMjMgNjEgODggOTUgMTc1IDEwNyAKKzYgMjI1IDgxIDExNCAyMDcgMTU3IDEwMSA0MSAxODQgMTkwIDczIDE2MiAxMjggMTMwIDQ1IDE2OCAxMSA5OCAxMSAxNzAgNDcgMjIxIAorMTQ2IDI1NyAxMzEgODggMjMgMTM5IDU2IDE5OSAxODkgMjE3IDI4MyAyMyAxMDYgNjggMjczIDUxIDUxIDEwMCA2NCAxMyA4NSA0OSAKKzE4NSAyMzMgNDkgMjkwIDI1NyAyNiA2NCA0NiA3MyAyNjcgMTUyIDEwNyAxMTEgMjQ5IDU4IDkgMjg4IDIwNCAxODMgMjYgMjE4IDM0IAorMTcwIDIzNCAxOTcgMTY5IDcwIDUwIDQxIDIzMyAxNTQgMjIgMjM0IDkyIDE0NSA5MyAxNTUgODEgMTg2IDI0MyAyMDggMjAwIDI0OCA0OCAKKzIxIDg2IDIxMyA0MCA2OSAxNzggMTg2IDEwNSAxOTYgMTI2IDIxNSAyMTQgMjA0IDQ1IDE0IDIzIDEgNDQgNCAxNTYgOTEgNTMgMjc0IAorMTk5IDUxIDIwNSA4OCAyODIgMTUxIDEzMCAyMzIgMTQ0IDM0IDMyIDIyMiAxMjMgMTM2IDIzNiAxMTIgMzQgMTM3IDI0NiAxMDAgMzEgCisyNSAxNTkgMjAzIDE5IDE3MSA5MCAxOTcgMjc0IDk0IDI3IDIyOCAyMiAyMDEgMTA0IDQ4IDEyNiAxMTAgMTkwIDIyNyAxNTAgMjI1IDk3IAorOTAgMjMwIDI2MiAyMCAyODYgMTAyIDg0IDM5IDI2IDMxIDU4IDE0NyA4IDI3OCAyMTYgMjczIDM1IDc1IDc3IDI1MSA5NCAxMzIgMjUyIAorMjkxIDI2NyAxODUgOTUgMzcgOTUgMjI0IDcxIDI0NyA1IDE2NiAyNTAgODQgMTQ0IDUwIDggMjQ1IDIyOCA1NSAxODkgMzAgMTUgMTcyIAorMTQ5IDI4IDEzMyAxNTcgMTM0IDI5IDExMCAzNiAyMzkgNTMgODcgMjIzIDI4IDEwMCAxNjkgMzcgNjIgMjM2IDI2NiAyODAgMTMxIDEwNCAKKzI5MSAxNjIgMTYxIDExOCAxNDIgMTQgMTc3IDI4MSAxNDEgMjYzIDMwIDE1MyAxMiA3NSAxODIgMjc1IDcxIDE5OCA0MSA0NiAxNzggCisyOTEgMTI5IDE3MyAxOTIgNCAyNjEgMTE1IDMwIDQ4IDI4MCA5OCAxMTYgMTk0IDI0IDExNiAyMjcgMTIgMjEzIDE5NCA1NyAxMDQgMTUzIAorMTUwIDg3IDg1IDE2IDE5NyAxMzYgODIgMTI0IDE5NSA2NyAyNjMgNjMgMTQxIDEwOSA0MiA1NiA0NSAyMDEgMTIwIDI0IDE0OSAyMTUgCisxMDkgMTgwIDY4IDI0MCA2MyAyNDYgMTMzIDE5IDEyMiAxMjYgMjQ4IDIwMiA5IDE4MyAxODAgMjA2IDI1MiAxMzcgMjc5IDg4IDEyOCAKKzE2MyAzMyAyNjUgMjcwIDI2NCA3MyA4IDE0MCAyMDQgNzggMiAyNDEgNzYgXgorNjIyIDAgODkgMTgzIDExMSAxODAgMzQgODUgNTkgMTU5IDI1NiAxNTQgMjA3IDIxMCAxMTUgNzUgMTAgMTA4IDE2OCA3OCAyMDkgNjggCisxMDMgMTc2IDI2OSAyNzIgNTUgMzUgMTAgNTEgMzMgMzggODcgMzEgMTIzIDI1OCA2OSAzNiAxNzIgMjAyIDE2MSAxNzEgMjc3IDE2OSAzIAorMjIgMjM2IDE3OSAxMDkgOTMgNzAgODMgMjkgMzYgNjcgMTIxIDQ5IDYxIDc0IDg1IDExNiAyIDk3IDI0NCAxMSAzMyAxNjAgMjQ2IDI4NSAKKzEgNDIgODkgMTE4IDg3IDI2MCA5OSAxNTkgMTM0IDI4OSAyNDcgMzggMTUyIDU1IDIyMiAxNCAxMTAgMjU1IDQyIDIxMSAyNzcgMjI2IAorMTM4IDYyIDY0IDIxNiAyMDQgMTEgMjcwIDI1IDIwNiAxNjMgMjU4IDI0MSAxNzEgMjEyIDMwIDE5OCAyNjYgMTk1IDI1NCAyMzkgODQgCis2OSAyOCAyODMgMTQzIDU0IDE2NyAxNTMgMjE3IDE5NCAxNDIgNjQgMTUxIDY1IDIwNiAyMjAgOTkgMjgxIDI5MyAyNDkgMTI1IDExNiAKKzU3IDEzNyAxMzcgNzIgNDggMTI4IDc4IDE1MiAyMjcgNjMgNTQgMjMyIDE3NyAyMiAxMjkgNjggMTY4IDIxIDc0IDI4IDI3NSAyNTQgCisxNzQgNjAgMTQ5IDkzIDI0MiAyMTggMTg0IDE1OCAzNyAxNjIgMzkgMjQ5IDMgMjUxIDIxMiA4MCA1OSA1MiAyNjAgMzQgMjAgMjE0IDYwIAorMjcgMjI4IDI4MiA0NiAxMDYgMjUzIDI0OSA2OCAyNzUgMTcgMTUgMTAwIDI3MSAxNSA0MyAxMzYgMjY5IDEwMCAyMTQgMjg5IDE4MiAxNCAKKzUzIDEyMCAyIDg5IDI0MCAyNDYgMjIwIDE1NiAxMjIgMzkgNzcgMTYyIDk2IDkwIDQzIDc5IDEzNCA2MCA5MiAyNTIgMjAyIDk2IDE0NyAKKzE3OCAxMTkgNzcgOTcgNzIgMTcwIDI4NyAzOCAzMCAxOTAgODMgMTM2IDE0NyAyMzUgMjU0IDExNyAyMTkgMTA5IDI2NSAyMDUgMjM4IAorMjY2IDczIDk1IDEwMCAyMDYgMjg1IDEyMyAyMDEgNDkgMjkwIDUwIDI4MCA2NiAyNTMgMTkyIDIyNyAyMzUgMTg5IDkzIDUgNTkgMjI0IAorMTAxIDc0IDI1NyAyNTEgNDAgMjM5IDE5IDIyNCAyMjMgMjMzIDEwMiAxMjkgMyAxNDQgMTAxIDEzOSAyODEgNTYgOTAgMTY1IDIzOCA5NCAKKzIzMiA1NSAxNTcgMjg0IDExIDIwNSAxIDEwNyAxMTMgMjE3IDIyIDcgMjAzIDI5IDE0MyAxMTEgOCAxOTMgNDUgMTE2IDEyMiAyNzYgCisyMzYgNyAyNjggNTMgMjQyIDE2MSA0OSAxMTggMjA5IDEyNSAyMzggMzcgOTcgMTUgMzUgMjQ3IDIxMCAyODcgMjEwIDUwIDUxIDIwNSAKKzE3MyAxMjcgMTUzIDQ1IDU5IDEwMiAxMjEgMTE0IDg1IDI4OCAxMzUgMTU3IDIxOSAxNjYgMTA2IDY2IDY2IDE4OCA1MyAxMyAxODUgCisxNDggMTY4IDI1MCA1MCAxMDggNDYgMjEzIDcwIDE5MCAxNDAgMjcxIDE4NyA2MyAyOTEgOTcgMTM3IDE5NCAyMDcgODggMjUwIDExNSAKKzEzMiAxNDUgMjYzIDI5MCAxMTUgMTAgMjgwIDkgMTE4IDM3IDEwNSAxOTggOTQgNjAgMjE0IDExNyA0NyAyNjggMTEwIDgzIDIwMSAxNzEgCisxNTUgMTAgNDMgMTQ0IDI3MyAyNzQgMjcgMjkzIDEyIDI2MCAxNTYgMTc0IDExNyAyODQgMTMzIDcwIDI1NSAxNjQgNzYgMjM3IDEwNCAKKzEwMSAyNjEgMTQ2IDE2IDI2MiAyNDMgMTQzIDE3NiAzMiAxMTMgOTUgMTU3IDQ3IDMxIDI0NSAxMjMgMjkgMjA4IDEzNSAyMjIgMjQzIAorODYgNDEgMjg2IDI4NSA1OCA2MiAxMjkgMjQwIDkgNjEgMTcgMjQ0IDc2IDE3MiA4MCAyIDMyIDEwNSA5MSA5OCAyMzQgMjcgMTIxIDI4NiAKKzIyMCAzNCAyNTcgNzkgMTk5IDg0IDE5MSA4IDEyOCAyMSAxNyAxODcgMjM1IDE3IDI1MiAyNTkgMjMxIDE4NyA2IDE1NiA1NyAxNSAyNzIgCisxMTIgMTcwIDE2NSAxNzMgNzAgMTggNSAyMzEgNjUgMTQxIDE5NiAxNzkgNTIgMjUyIDMwIDI1NSAxMDcgNTYgODIgMjc2IDE3OSAyODEgCisyMjggMjI1IDI2IDY2IDEzMSAzMyAyNjcgNjMgMjI2IDczIDM4IDI1OSAxNjYgMTYzIDg2IDEwNiAxNiA5MCAxMDggMTAzIDU0IDExMCAKKzE4IDE3NyA3MiAxMDUgMjYzIDIzMyAyNzQgMjY0IDE1OCAyNjYgMTM4IDExOSAxOTkgMjU2IDMyIDQ4IDcxIDU4IDExMiAxMDUgMjYgNzQgCisyMCA5MiA4MCA2NyA1NiAyNSAxNDEgMjQgNDQgMTkxIDEzMCAxMDggMjc1IDE4OSAxNTAgMTQwIDk5IDUyIDIzIDU0IDE3NSA0MiAyNzYgCis3IDE0NiAxODggMTAzIDI4MyA4NiAyMTMgMTI3IDMxIDE4MCA5OSAyMjQgMTU4IDIwOSAzIDc5IDc3IDIxOSAyMzEgMTMwIDE2NSAxIAorMjI5IDI3MiAxNzcgMTk0IDI2NCAyMjMgMTExIDIzNyAxNjkgMjQwIDE4MSAxOTYgNTcgNzIgMTEzIDE1MiAyOTIgODcgMjY4IDI4MiAKKzIxOCAyNDEgMjkzIDc3IDI4NCA3NiAyMjkgODAgXgorNjM1IDEgNDAgMTUwIDE0MCAxODQgMTIgMjMgNzggMjk0IDIgNjcgOTMgOSA1NyAyODMgMjA2IDc0IDgzIDE5OSAyNTQgNCA2IDY3IDI2MyAKKzEyMCA2MSAxMTMgMTU2IDE4MSAyNTcgNzkgMjg0IDQ2IDE5MSAyMTMgMjUxIDI3MyAxMDAgMjcxIDEwMCAxODYgMTM4IDE4NCAyMjMgNjEgCis3NiA4MyAxNzUgMTA3IDYgMjE3IDgxIDExNCAyMDcgMTQ5IDg5IDI5IDE4MCAxODIgNzMgMTU4IDEyMCAxMjIgMzcgMTYwIDExIDk4IAorMjk1IDE2MiAzNSAyMjEgMTQ2IDI0OSAxMjMgODggMTkgMTM5IDQ4IDE5MSAxODkgMjEzIDI3NSAxNSA5OCA2MCAyNzMgMzkgNTEgOTYgCis2MCAxIDc3IDQ5IDE4MSAyMzMgNDEgMjg2IDI1NyAxOCA2NCA0MiA2NSAyNjMgMTQ0IDk5IDExMSAyNDEgNTggMSAyODggMTk2IDE3OSAKKzIyIDIxNCAzMCAxNzAgMjI2IDE5NyAxNjkgNjYgNDIgNDEgMjI1IDE0NiAxNCAyMzQgOTIgMTQ1IDg5IDE1NSA2OSAxNzggMjQzIDIwOCAKKzIwMCAyNDQgNDggMjEgNzggMjA5IDQwIDY1IDE3OCAxODIgOTcgMTk2IDExOCAyMDcgMjEwIDIwMCAzMyAxMCAyMyAyODkgMzYgMTUyIAorNzkgNDkgMjY2IDE5NSA0MyAyMDEgODQgMjc0IDE1MSAxMzAgMjI4IDEzNiAzNCAyNCAyMTQgMTE1IDEzMiAyMjggMTEyIDI5MiAyNiAKKzEyOSAyMzggOTIgMTkgMTMgMTU5IDE5NSAxOSAxNjMgODYgMTg5IDI3NCA5MCAxOSAyMjQgMTAgMTkzIDEwNCA0MCAxMjYgMTAyIDE4NiAKKzIyMyAxNDYgMjI1IDg1IDkwIDIzMCAyNjIgOCAyNzggOTAgODAgMzkgMTQgMjMgNTQgMTQ3IDQgMjc4IDIxNiAyNjUgMzUgNzUgNzMgCisyNDMgODIgMTI0IDI0OCAyODMgMjY3IDE4NSA4NyAyOSA5NSAyMjAgNzEgMjQzIDI5MyAxNjIgMjQ2IDcyIDE0NCAzOCAyMzcgMjI4IDUxIAorMTgxIDIyIDMgMjg4IDE3MiAxNDEgMjQgMTI5IDE1MyAxMzAgMTcgOTggMzYgMjM1IDQxIDc1IDIxOSAyMCA4OCAxNjUgMjUgNTQgMjMyIAorMjYyIDI4MCAxMzEgOTIgMjkxIDE2MiAxNjEgMTEwIDE0MiAxNCAxNzMgMjc3IDE0MSAyNTkgMTggMTQ5IDQgNjcgMTc4IDI2NyA1OSAKKzE5OCAzMyAzNCAxNzAgMjg3IDEyMSAxNzMgMTkyIDI4OCAyNTcgMTAzIDI2IDQ0IDI3NiA5MCAxMDQgMTg2IDEyIDEwOCAyMjcgMjEzIAorMTkwIDUzIDk2IDE0NSAxNTAgNzkgNzMgOCAxOTMgMTI4IDc4IDEyNCAxODcgNjMgMjYzIDU5IDEzNyAxMDkgMzAgNDQgNDEgMjAxIDEwOCAKKzE2IDE0OSAyMTUgMTA1IDE3NiA1NiAyMzIgNTEgMjQyIDEzMyA3IDExOCAxMjIgMjQ4IDE5OCA5IDE4MyAxNzIgMjAyIDI0NCAxMzMgCisyNzkgODAgMTI0IDE2MyAyNSAyNjUgMjcwIDI2MCA2OSA4IDEzMiAyMDQgNzQgMjk0IDIzNyAyNTIgODkgMTc5IDEwNyAxNzYgMzIgODUgCis1MyAxNTcgMjU2IDE1NCAyMDUgMjEwIDExNSA3MSA4IDEwOCAxNjYgNzYgMjA5IDY0IDEwMyAxNzYgMjY3IDI3MCA0OSAzMSAxMCA0NyAKKzMxIDM0IDg1IDI5IDExOSAyNTggNjkgMzIgMTcwIDIwMiAxNTkgMTcxIDI3NyAxNjUgMSAxNiAyMzQgMTc3IDEwNyA5MSA3MCA4MyAyOSAKKzM0IDY3IDExNyA0NyA1NSA3MiA4MyAxMTQgMjkyIDIgOTEgMjQwIDcgMzMgMTYwIDI0NiAyODMgMjkxIDM2IDg1IDExNCA4MSAyNjAgOTMgCisxNTUgMTMwIDI4OSAyNDcgMzggMTUwIDU1IDIyMiAxMCAxMDggMjUxIDM4IDIxMSAyNzUgMjI2IDEzNiA1OCA2MiAyMTIgMjAwIDkgMjY4IAorMjUgMjA0IDE1OSAyNTYgMjM5IDE2NyAyMTIgMzAgMTk0IDI2NCAxOTUgMjU0IDIzOSA4MiA2MyAyOCAyNzkgMTQxIDQ4IDE2NyAxNTEgCisyMTUgMTkwIDEzOCA1OCAxNDcgNjUgMjAyIDIyMCA5NSAyODEgMjkxIDI0NyAxMjMgMTEyIDU3IDEzNyAxMzMgNjggNDIgMTI2IDc4IAorMTQ4IDIyNSA2MSA1MiAyMzIgMTc3IDIyIDEyOSA2OCAxNjggMTUgNzQgMjIgMjc1IDI1MCAxNzQgNTYgMTQ3IDg5IDI0MCAyMTggMTgwIAorMTU4IDM1IDE2MCAzNSAyNDUgMjkzIDI0NyAyMDggNzQgNTkgNTIgMjU2IDI4IDIwIDIxNCA1NCAyMSAyMjQgMjgyIDQ2IDEwNiAyNTEgCisyNDkgNjIgMjczIDE1IDEzIDk4IDI3MSAxNSAzNyAxMzYgMjY5IDEwMCAyMTAgMjg1IDE4MiAxMiA0NyAxMTYgMjkyIDg3IDI0MCAyNDIgCisyMTggMTU2IDEyMCAzNyA3NSAxNTggOTYgODQgMzkgNzUgMTM0IDU4IDg2IDI1MCAxOTggOTQgMTQ1IDE3NCAxMTcgNzEgOTMgNzAgMTY4IAorMjg3IDM2IDI0IDE5MCA3NyAxMzQgMTQzIDIzNSAyNTIgMTEzIDIxNyAxMDUgMjYxIDIwNSAyMzQgMjYyIDY5IDkzIDk0IDIwNiAyODUgCisxMjEgMTk3IDQzIDI4NiA0NiAyNzYgNjYgMjUzIDE4OCAyMjMgMjMxIDE4NyA4NyA1IDU3IDIyMiA5NSAyODUgXgorNjM2IDAgMjUxIDI0OCAzNyAyMzMgMTYgMjI0IDIyMCAyMzAgMTAyIDEyMyAzIDE0MSA5OCAxMzMgMjc4IDU2IDg0IDE2NSAyMzUgOTEgCisyMjkgNDkgMTU3IDI3OCAyIDIwMiAyOTUgOTggMTEwIDIxNyAxOSAxIDIwMyAyMCAxMzcgMTA4IDUgMTkzIDQyIDExNiAxMjIgMjcwIAorMjM2IDcgMjY4IDQ3IDI0MiAxNTUgNDMgMTE1IDIwNiAxMjUgMjM4IDI4IDk0IDYgMzIgMjQ0IDIwNyAyODQgMjA0IDUwIDQyIDE5OSAKKzE2NyAxMjcgMTUzIDQ1IDUzIDkzIDEyMSAxMTEgNzkgMjgyIDEyOSAxNTEgMjEzIDE2NiA5NyA1NyA2MCAxODggNTMgMTAgMTgyIDE0OCAKKzE2MiAyNDQgNDcgMTA1IDM3IDIxMCA2MSAxODcgMTM3IDI2OCAxODQgNjMgMjg1IDk3IDEzNCAxOTQgMjAxIDgyIDI1MCAxMTIgMTMyIAorMTQyIDI1NyAyOTAgMTA5IDQgMjc3IDMgMTE4IDM3IDk2IDE5NSA5NCA2MCAyMTEgMTE0IDQ3IDI2NSAxMTAgODAgMTk4IDE2OCAxNDkgMSAKKzQzIDEzOCAyNjcgMjY4IDI0IDI4NyAxMiAyNTcgMTUzIDI4OCAxNzEgMTE3IDI4MSAxMzAgNjcgMjUyIDE2NCA3NiAyMzEgMTAxIDEwMSAKKzI2MSAxNDMgMTMgMjU2IDIzNyAxNDMgMTczIDMyIDEwNyA4OSAxNTQgNDQgMzEgMjQ1IDEyMyAyNiAyMDIgMTM1IDIxNiAyNDAgODAgMzggCisyODYgMjc5IDU1IDYyIDEyNiAyMzcgNiA1NSA4IDI0NCA3MCAxNjYgNzQgMjkzIDIzIDEwNSA5MSA5MiAyMjggMjcgMTE4IDI4MCAyMTQgCisyOCAyNTQgNzkgMTk5IDg0IDE4OCAyOTYgMTI4IDE1IDExIDE4MSAyMzIgMTcgMjQ2IDI1OSAyMjggMTg3IDE1MCA1NCA5IDI2NiAxMDkgCisxNjQgMTU5IDE3MCA2NCAxOCAyIDIyNSA1OSAxMzUgMTkzIDE3OSA0MyAyNTIgMjcgMjU1IDEwMSA0NyA4MiAyNzMgMTczIDI3NSAyMjUgCisyMTkgMTcgNjMgMTI1IDI0IDI2NCA1NyAyMjAgNzAgMjkgMjUzIDE2MyAxNjAgODYgMTAzIDE2IDg3IDEwMiAxMDAgNDggMTA0IDE1IAorMTcxIDYzIDEwMiAyNjAgMjI3IDI3MSAyNTggMTUyIDI2NiAxMzIgMTE5IDE5NiAyNTMgMjYgNDIgNjIgNDkgMTAzIDk5IDI2IDY1IDE3IAorODYgODAgNjEgNTAgMTkgMTM4IDI0IDQ0IDE5MSAxMjcgOTkgMjY5IDE4MyAxNDcgMTQwIDk5IDQ5IDIwIDU0IDE2OSA0MiAyNzYgNCAKKzE0MCAxODIgOTQgMjgwIDc3IDIwNyAxMjQgMjUgMTgwIDk2IDIxOCAxNTUgMjAzIDI5NCA3NiA3MSAyMTkgMjMxIDEyNCAxNjIgMSAyMjYgCisyNzIgMTc0IDE5MSAyNjQgMjE3IDEwMiAyMzcgMTY2IDIzNCAxNzUgMTkwIDUxIDcyIDEwNCAxNTIgMjg5IDg3IDI2MiAyNzkgMjE1IAorMjQxIDI5MyA3NyAyODQgNjcgMjI5IDIwOSAzOSAxNDggMTM5IDE4MyAxMCAyMiA3NSAyOTIgMSA2NiA5MyA3IDU0IDI4MyAyMDUgNzIgCis4MSAxOTcgMjUyIDQgMyA2NCAyNjEgMTIwIDU4IDExMyAxNTQgMTgxIDI1NSA3OCAyODMgNDUgMTkwIDIxMSAyNTEgMjcxIDk4IDI3MCAKKzk5IDE4NiAxMzggMTg0IDIyMyA2MSA3MyA4MCAxNzUgMTA3IDYgMjE1IDgxIDExNCAyMDcgMTQ3IDg2IDI2IDE3OSAxODAgNzMgMTU3IAorMTE4IDEyMCAzNSAxNTggMTEgOTggMjkzIDE2MCAzMiAyMjEgMTQ2IDI0NyAxMjEgODggMTggMTM5IDQ2IDE4OSAxODkgMjEyIDI3MyAxMyAKKzk2IDU4IDI3MyAzNiA1MSA5NSA1OSAyOTUgNzUgNDkgMTgwIDIzMyAzOSAyODUgMjU3IDE2IDY0IDQxIDYzIDI2MiAxNDIgOTcgMTExIAorMjM5IDU4IDI5NiAyODggMTk0IDE3OCAyMSAyMTMgMjkgMTcwIDIyNCAxOTcgMTY5IDY1IDQwIDQxIDIyMyAxNDQgMTIgMjM0IDkyIDE0NSAKKzg4IDE1NSA2NiAxNzYgMjQzIDIwOCAyMDAgMjQzIDQ4IDIxIDc2IDIwOCA0MCA2NCAxNzggMTgxIDk1IDE5NiAxMTYgMjA1IDIwOSAxOTkgCiszMCA5IDIzIDI4OCAzNCAyOTYgMTUxIDc2IDQ4IDI2NCAxOTQgNDEgMjAwIDgzIDI3MiAxNTEgMTMwIDIyNyAxMzQgMzQgMjIgMjEyIAorMTEzIDEzMSAyMjYgMTEyIDI5MiAyNCAxMjcgMjM2IDkwIDE2IDEwIDE1OSAxOTMgMTkgMTYxIDg1IDE4NyAyNzQgODkgMTcgMjIzIDcgCisxOTEgMTA0IDM4IDEyNiAxMDAgMTg1IDIyMiAxNDUgMjI1IDgyIDkwIDIzMCAyNjIgNSAyNzYgODcgNzkgMzkgMTEgMjEgNTMgMTQ3IDMgCisyNzggMjE2IDI2MyAzNSA3NSA3MiAyNDEgNzkgMTIyIDI0NyAyODEgMjY3IDE4NSA4NSAyNyA5NSAyMTkgNzEgMjQyIDI5MiAxNjEgMjQ1IAorNjkgMTQ0IDM1IDI5NSAyMzUgMjI4IDUwIDE3OSAyMCAyODcgMTcyIDEzOSAyMyAxMjggMTUyIDEyOSAxNCA5NSAzNiAyMzQgMzggNzIgCisyMTggMTggODUgMTY0IDIyIDUyIDIzMSAyNjEgMjgwIDEzMSA4OSAyOTEgMTYyIDE2MSAxMDggMTQyIDE0IDE3MiAyNzYgOTEgXgorNjM1IDEgMjU2IDkgMTQ2IDI5NyA2MSAxNzUgMjYxIDUwIDE5OCAyNyAyNSAxNjQgMjg0IDExNSAxNzMgMTkyIDI4MiAyNTQgOTQgMjMgCis0MSAyNzMgODQgOTUgMTgwIDMgMTAyIDIyNyAyOTAgMjEzIDE4NyA1MCA5MCAxMzkgMTUwIDczIDY0IDIgMTkwIDEyMiA3NSAxMjQgMTgxIAorNjAgMjYzIDU2IDEzNCAxMDkgMjEgMzUgMzggMjAxIDk5IDEwIDE0OSAyMTUgMTAyIDE3MyA0NyAyMjYgNDIgMjM5IDEzMyAyOTcgMTE1IAorMTE5IDI0OCAxOTUgOSAxODMgMTY2IDE5OSAyMzggMTMwIDI3OSA3NCAxMjEgMTYzIDE5IDI2NSAyNzAgMjU3IDY2IDggMTI2IDIwNCA3MSAKKzI5NCAyMzQgMjQ2IDg5IDE3MyAxMDEgMTcwIDI5IDg1IDQ0IDE1NCAyNTYgMTU0IDIwMiAyMTAgMTE1IDY1IDUgMTA4IDE2MyA3MyAyMDkgCis1OCAxMDMgMTc2IDI2NCAyNjcgNDAgMjUgMTAgNDEgMjggMjggODIgMjYgMTEzIDI1OCA2OSAyNiAxNjcgMjAyIDE1NiAxNzEgMjc3IAorMTU5IDI5NyA3IDIzMSAxNzQgMTA0IDg4IDcwIDgzIDI5IDMxIDY3IDExMSA0NCA0NiA2OSA4MCAxMTEgMjg5IDIgODIgMjM0IDEgMzMgCisxNjAgMjQ2IDI4MCAyODUgMjcgNzkgMTA4IDcyIDI2MCA4NCAxNDkgMTI0IDI4OSAyNDcgMzggMTQ3IDU1IDIyMiA0IDEwNSAyNDUgMzIgCisyMTEgMjcyIDIyNiAxMzMgNTIgNTkgMjA2IDE5NCA2IDI2NSAyNSAyMDEgMTUzIDI1MyAyMzYgMTYxIDIxMiAzMCAxODggMjYxIDE5NSAKKzI1NCAyMzkgNzkgNTQgMjggMjczIDEzOCAzOSAxNjcgMTQ4IDIxMiAxODQgMTMyIDQ5IDE0MSA2NSAxOTYgMjIwIDg5IDI4MSAyODggCisyNDQgMTIwIDEwNiA1NyAxMzcgMTI3IDYyIDMzIDEyMyA3OCAxNDIgMjIyIDU4IDQ5IDIzMiAxNzcgMjIgMTI5IDY4IDE2OCA2IDc0IDEzIAorMjc1IDI0NCAxNzQgNTAgMTQ0IDgzIDIzNyAyMTggMTc0IDE1OCAzMiAxNTcgMjkgMjM5IDI4NyAyNDEgMjAyIDY1IDU5IDUyIDI1MCAxOSAKKzIwIDIxNCA0NSAxMiAyMTggMjgyIDQ2IDEwNiAyNDggMjQ5IDUzIDI3MCAxMiAxMCA5NSAyNzEgMTUgMjggMTM2IDI2OSAxMDAgMjA0IAorMjc5IDE4MiA5IDM4IDExMCAyODYgODQgMjQwIDIzNiAyMTUgMTU2IDExNyAzNCA3MiAxNTIgOTYgNzUgMzMgNjkgMTM0IDU1IDc3IDI0NyAKKzE5MiA5MSAxNDIgMTY4IDExNCA2MiA4NyA2NyAxNjUgMjg3IDMzIDE1IDE5MCA2OCAxMzEgMTM3IDIzNSAyNDkgMTA3IDIxNCA5OSAyNTUgCisyMDUgMjI4IDI1NiA2MyA5MCA4NSAyMDYgMjg1IDExOCAxOTEgMzQgMjgwIDQwIDI3MCA2NiAyNTMgMTgyIDIxNyAyMjUgMTg0IDc4IDUgCis1NCAyMTkgODYgNjQgMjQ3IDI0NiAzNSAyMjkgMTQgMjI0IDIxOCAyMjggMTAyIDExOSAzIDEzOSA5NiAxMjkgMjc2IDU2IDgwIDE2NSAKKzIzMyA4OSAyMjcgNDUgMTU3IDI3NCAyOTUgMjAwIDI5NSA5MiAxMDggMjE3IDE3IDI5NiAyMDMgMTQgMTMzIDEwNiAzIDE5MyA0MCAxMTYgCisxMjIgMjY2IDIzNiA3IDI2OCA0MyAyNDIgMTUxIDM5IDExMyAyMDQgMTI1IDIzOCAyMiA5MiAzMCAyNDIgMjA1IDI4MiAyMDAgNTAgMzYgCisxOTUgMTYzIDEyNyAxNTMgNDUgNDkgODcgMTIxIDEwOSA3NSAyNzggMTI1IDE0NyAyMDkgMTY2IDkxIDUxIDU2IDE4OCA1MyA4IDE4MCAKKzE0OCAxNTggMjQwIDQ1IDEwMyAzMSAyMDggNTUgMTg1IDEzNSAyNjYgMTgyIDYzIDI4MSA5NyAxMzIgMTk0IDE5NyA3OCAyNTAgMTEwIAorMTMyIDE0MCAyNTMgMjkwIDEwNSAyNzUgMjk4IDExOCAzNyA5MCAxOTMgOTQgNjAgMjA5IDExMiA0NyAyNjMgMTEwIDc4IDE5NiAxNjYgCisxNDUgMjk0IDQzIDEzNCAyNjMgMjY0IDIyIDI4MyAxMiAyNTUgMTUxIDI4NCAxNjkgMTE3IDI3OSAxMjggNjUgMjUwIDE2NCA3NiAyMjcgCis5OSAxMDEgMjYxIDE0MSAxMSAyNTIgMjMzIDE0MyAxNzEgMzIgMTAzIDg1IDE1MiA0MiAzMSAyNDUgMTIzIDI0IDE5OCAxMzUgMjEyIAorMjM4IDc2IDM2IDI4NiAyNzUgNTMgNjIgMTI0IDIzNSA0IDUxIDIgMjQ0IDY2IDE2MiA3MCAyOTEgMTcgMTA1IDkxIDg4IDIyNCAyNyAKKzExNiAyNzYgMjEwIDI0IDI1MiA3OSAxOTkgODQgMTg2IDI5MiAxMjggMTEgNyAxNzcgMjMwIDE3IDI0MiAyNTkgMjI2IDE4NyAyOTUgCisxNDYgNTIgNSAyNjIgMTA3IDE2MCAxNTUgMTY4IDYwIDE4IDIyMSA1NSAxMzEgMTkxIDE3OSAzNyAyNTIgMjUgMjU1IDk3IDQxIDgyIAorMjcxIDE2OSAyNzEgMjIzIDIxNSAxMSA2MSAxMjEgMTggMjYyIDUzIDIxNiA2OCAyMyAyNDkgMTYxIDE1OCA4NiAxMDEgMTYgODUgOTggCis5OCA0NCAxMDAgMTMgMTY3IDU3IDEwMCAyNTggMjIzIDI2OSAyNTQgMTQ4IDI2NiAxMjggMTE5IDE5NCAyNTEgMjIgMzggNTYgNDMgMjc1IAorXgorNjQyIDAgOTEgMjYgNTMgMTMgNzggODAgNTMgNDIgMTEgMTM0IDI0IDQ0IDE5MSAxMjMgODcgMjYxIDE3NSAxNDMgMTQwIDk5IDQ1IDE2IAorNTQgMTYxIDQyIDI3NiAxMzIgMTc0IDgyIDI3NiA2NSAxOTkgMTIwIDE3IDE4MCA5MiAyMTAgMTUxIDE5NSAyOTAgNzIgNjMgMjE5IDIzMSAKKzExNiAxNTggMSAyMjIgMjcyIDE3MCAxODcgMjY0IDIwOSA5MCAyMzcgMTYyIDIyNiAxNjcgMTgyIDQzIDcyIDkyIDE1MiAyODUgODcgCisyNTQgMjc1IDIxMSAyNDEgMjkzIDc3IDI4NCA1NSAyMjkgMjAxIDM1IDE0MCAxMzUgMTc5IDIgMTggNjMgMjg0IDI5OCA2MiA5MyAzMDAgCis0MiAyODMgMjAxIDY0IDczIDE4OSAyNDQgNCAyOTIgNTIgMjUzIDEyMCA0NiAxMTMgMTQ2IDE4MSAyNDcgNzQgMjc5IDQxIDE4NiAyMDMgCisyNTEgMjYzIDkwIDI2NiA5NSAxODYgMTM4IDE4NCAyMjMgNjEgNjEgNjggMTc1IDEwNyA2IDIwNyA4MSAxMTQgMjA3IDEzOSA3NCAxNCAKKzE3NSAxNzIgNzMgMTUzIDExMCAxMTIgMjcgMTUwIDExIDk4IDI4NSAxNTIgMjAgMjIxIDE0NiAyMzkgMTEzIDg4IDE0IDEzOSAzOCAxODEgCisxODkgMjA4IDI2NSA1IDg4IDUwIDI3MyAyNCA1MSA5MSA1NSAyODcgNjcgNDkgMTc2IDIzMyAzMSAyODEgMjU3IDggNjQgMzcgNTUgMjU4IAorMTM0IDg5IDExMSAyMzEgNTggMjkyIDI4OCAxODYgMTc0IDE3IDIwOSAyNSAxNzAgMjE2IDE5NyAxNjkgNjEgMzIgNDEgMjE1IDEzNiA0IAorMjM0IDkyIDE0NSA4NCAxNTUgNTQgMTY4IDI0MyAyMDggMjAwIDIzOSA0OCAyMSA2OCAyMDQgNDAgNjAgMTc4IDE3NyA4NyAxOTYgMTA4IAorMTk3IDIwNSAxOTUgMTggNSAyMyAyODQgMjYgMjk2IDE0NyA2NCA0NCAyNTYgMTkwIDMzIDE5NiA3OSAyNjQgMTUxIDEzMCAyMjMgMTI2IAorMzQgMTQgMjA0IDEwNSAxMjcgMjE4IDExMiAyOTIgMTYgMTE5IDIyOCA4MiA0IDI5OSAxNTkgMTg1IDE5IDE1MyA4MSAxNzkgMjc0IDg1IAorOSAyMTkgMjk2IDE4MyAxMDQgMzAgMTI2IDkyIDE4MSAyMTggMTQxIDIyNSA3MCA5MCAyMzAgMjYyIDI5NCAyNjggNzUgNzUgMzkgMzAwIAorMTMgNDkgMTQ3IDMwMCAyNzggMjE2IDI1NSAzNSA3NSA2OCAyMzMgNjcgMTE0IDI0MyAyNzMgMjY3IDE4NSA3NyAxOSA5NSAyMTUgNzEgCisyMzggMjg4IDE1NyAyNDEgNTcgMTQ0IDIzIDI5MSAyMjcgMjI4IDQ2IDE3MSAxMiAyODkgMjgzIDE3MiAxMzEgMTkgMTI0IDE0OCAxMjUgCisyIDgzIDM2IDIzMCAyNiA2MCAyMTQgMTAgNzMgMTYwIDEwIDQ0IDIyNyAyNTcgMjgwIDEzMSA3NyAyOTEgMTYyIDE2MSAxMDAgMTQyIDE0IAorMTY4IDI3MiAxNDEgMjU0IDMgMTQ0IDI5NSA1NyAxNzMgMjU3IDQ0IDE5OCAyMyAxOSAxNjAgMjgyIDExMSAxNzMgMTkyIDI3OCAyNTIgCis4OCAyMSAzOSAyNzEgODAgODkgMTc2IDI5OCA5OCAyMjcgMjg2IDIxMyAxODUgNDggODYgMTM1IDE1MCA2OSA1OCAyOTkgMTg4IDExOCAKKzczIDEyNCAxNzcgNTggMjYzIDU0IDEzMiAxMDkgMTUgMjkgMzYgMjAxIDkzIDYgMTQ5IDIxNSAxMDAgMTcxIDQxIDIyMiAzNiAyMzcgCisxMzMgMjkzIDExMyAxMTcgMjQ4IDE5MyA5IDE4MyAxNjIgMTk3IDIzNCAxMjggMjc5IDcwIDExOSAxNjMgMTUgMjY1IDI3MCAyNTUgNjQgCis4IDEyMiAyMDQgNjkgMjk0IDIzMiAyNDIgODkgMTY5IDk3IDE2NiAyNyA4NSAzOCAxNTIgMjU2IDE1NCAyMDAgMjEwIDExNSA2MSAzIAorMTA4IDE2MSA3MSAyMDkgNTQgMTAzIDE3NiAyNjIgMjY1IDM0IDIxIDEwIDM3IDI2IDI0IDgwIDI0IDEwOSAyNTggNjkgMjIgMTY1IDIwMiAKKzE1NCAxNzEgMjc3IDE1NSAyOTcgMSAyMjkgMTcyIDEwMiA4NiA3MCA4MyAyOSAyOSA2NyAxMDcgNDIgNDAgNjcgNzggMTA5IDI4NyAyIAorNzYgMjMwIDI5OCAzMyAxNjAgMjQ2IDI3OCAyODEgMjEgNzUgMTA0IDY2IDI2MCA3OCAxNDUgMTIwIDI4OSAyNDcgMzggMTQ1IDU1IDIyMiAKKzEwMyAyNDEgMjggMjExIDI3MCAyMjYgMTMxIDQ4IDU3IDIwMiAxOTAgNCAyNjMgMjUgMTk5IDE0OSAyNTEgMjM0IDE1NyAyMTIgMzAgCisxODQgMjU5IDE5NSAyNTQgMjM5IDc3IDQ4IDI4IDI2OSAxMzYgMzMgMTY3IDE0NiAyMTAgMTgwIDEyOCA0MyAxMzcgNjUgMTkyIDIyMCAKKzg1IDI4MSAyODYgMjQyIDExOCAxMDIgNTcgMTM3IDEyMyA1OCAyNyAxMjEgNzggMTM4IDIyMCA1NiA0NyAyMzIgMTc3IDIyIDEyOSA2OCAKKzE2OCA3NCA3IDI3NSAyNDAgMTc0IDQ2IDE0MiA3OSAyMzUgMjE4IDE3MCAxNTggMzAgMTU1IDI1IDIzNSAyODMgMjM3IDE5OCA1OSA1OSAKKzUyIDI0NiAxMyAyMCAyMTQgMzkgNiAyMTQgMjgyIDQ2IDEwNiAyNDYgMjQ5IDQ3IDI2OCAxMCA4IDkzIDI3MSAxNSAyMiAxMzYgMjY5IAorMTAwIDIwMCAyNzUgNDIgXgorNjQ0IDAgNiAyOSAxMDQgMjgwIDgxIDI0MCAyMzAgMjEyIDE1NiAxMTQgMzEgNjkgMTQ2IDk2IDY2IDI3IDYzIDEzNCA1MiA2OCAyNDQgCisxODYgODggMTM5IDE2MiAxMTEgNTMgODEgNjQgMTYyIDI4NyAzMCA2IDE5MCA1OSAxMjggMTMxIDIzNSAyNDYgMTAxIDIxMSA5MyAyNDkgCisyMDUgMjIyIDI1MCA1NyA4NyA3NiAyMDYgMjg1IDExNSAxODUgMjUgMjc0IDM0IDI2NCA2NiAyNTMgMTc2IDIxMSAyMTkgMTgxIDY5IDUgCis1MSAyMTYgNzcgNTggMjQxIDI0MyAzMiAyMjMgMTEgMjI0IDIxNSAyMjUgMTAyIDExMyAzIDEzNiA5MyAxMjMgMjczIDU2IDc0IDE2NSAKKzIzMCA4NiAyMjQgMzkgMTU3IDI2OCAyODkgMTk3IDI5NSA4MyAxMDUgMjE3IDE0IDI5MyAyMDMgNSAxMjcgMTAzIDE5MyAzNyAxMTYgCisxMjIgMjYwIDIzNiA3IDI2OCAzNyAyNDIgMTQ1IDMzIDExMCAyMDEgMTI1IDIzOCAxMyA4OSAyOTMgMjcgMjM5IDIwMiAyNzkgMTk0IDUwIAorMjcgMTg5IDE1NyAxMjcgMTUzIDQ1IDQzIDc4IDEyMSAxMDYgNjkgMjcyIDExOSAxNDEgMjAzIDE2NiA4MiA0MiA1MCAxODggNTMgNSAKKzE3NyAxNDggMTUyIDIzNCA0MiAxMDAgMjIgMjA1IDQ2IDE4MiAxMzIgMjYzIDE3OSA2MyAyNzUgOTcgMTI5IDE5NCAxOTEgNzIgMjUwIAorMTA3IDEzMiAxMzcgMjQ3IDI5MCA5OSAyOTYgMjcyIDI5NSAxMTggMzcgODEgMTkwIDk0IDYwIDIwNiAxMDkgNDcgMjYwIDExMCA3NSAKKzE5MyAxNjMgMTM5IDI4OCA0MyAxMjggMjU3IDI1OCAxOSAyNzcgMTIgMjUyIDE0OCAyNzggMTY2IDExNyAyNzYgMTI1IDYyIDI0NyAxNjQgCis3NiAyMjEgOTYgMTAxIDI2MSAxMzggOCAyNDYgMjI3IDE0MyAxNjggMzIgOTcgNzkgMTQ5IDM5IDMxIDI0NSAxMjMgMjEgMTkyIDEzNSAKKzIwNiAyMzUgNzAgMzMgMjg2IDI2OSA1MCA2MiAxMjEgMjMyIDEgNDUgMjk1IDI0NCA2MCAxNTYgNjQgMjg4IDggMTA1IDkxIDgyIDIxOCAKKzI3IDExMyAyNzAgMjA0IDE4IDI0OSA3OSAxOTkgODQgMTgzIDI4NiAxMjggNSAxIDE3MSAyMjcgMTcgMjM2IDI1OSAyMjMgMTg3IDI5MiAKKzE0MCA0OSAzMDEgMjU2IDEwNCAxNTQgMTQ5IDE2NSA1NCAxOCAyOTkgMjE1IDQ5IDEyNSAxODggMTc5IDI4IDI1MiAyMiAyNTUgOTEgMzIgCis4MiAyNjggMTYzIDI2NSAyMjAgMjA5IDIgNTggMTE1IDkgMjU5IDQ3IDIxMCA2NSAxNCAyNDMgMTU4IDE1NSA4NiA5OCAxNiA4MiA5MiAKKzk1IDM4IDk0IDEwIDE2MSA0OCA5NyAyNTUgMjE3IDI2NiAyNDggMTQyIDI2NiAxMjIgMTE5IDE5MSAyNDggMTYgMzIgNDcgMzQgODggODkgCisyNiA1MCAxMiA3NiA4MCA1MSA0MCA5IDEzMyAyNCA0NCAxOTEgMTIyIDg0IDI1OSAxNzMgMTQyIDE0MCA5OSA0NCAxNSA1NCAxNTkgNDIgCisyNzYgMzAxIDEzMCAxNzIgNzkgMjc1IDYyIDE5NyAxMTkgMTUgMTgwIDkxIDIwOCAxNTAgMTkzIDI4OSA3MSA2MSAyMTkgMjMxIDExNCAKKzE1NyAxIDIyMSAyNzIgMTY5IDE4NiAyNjQgMjA3IDg3IDIzNyAxNjEgMjI0IDE2NSAxODAgNDEgNzIgODkgMTUyIDI4NCA4NyAyNTIgCisyNzQgMjEwIDI0MSAyOTMgNzcgMjg0IDUyIDIyOSAxOTkgMzQgMTM4IDEzNCAxNzggMTcgNjAgMjgyIDI5OCA2MSA5MyAyOTkgMzkgMjgzIAorMjAwIDYyIDcxIDE4NyAyNDIgNCAyOTAgNDkgMjUxIDEyMCA0MyAxMTMgMTQ0IDE4MSAyNDUgNzMgMjc4IDQwIDE4NSAyMDEgMjUxIDI2MSAKKzg4IDI2NSA5NCAxODYgMTM4IDE4NCAyMjMgNjEgNTggNjUgMTc1IDEwNyA2IDIwNSA4MSAxMTQgMjA3IDEzNyA3MSAxMSAxNzQgMTcwIAorNzMgMTUyIDEwOCAxMTAgMjUgMTQ4IDExIDk4IDI4MyAxNTAgMTcgMjIxIDE0NiAyMzcgMTExIDg4IDEzIDEzOSAzNiAxNzkgMTg5IDIwNyAKKzI2MyAzIDg2IDQ4IDI3MyAyMSA1MSA5MCA1NCAyODUgNjUgNDkgMTc1IDIzMyAyOSAyODAgMjU3IDYgNjQgMzYgNTMgMjU3IDEzMiA4NyAKKzExMSAyMjkgNTggMjkxIDI4OCAxODQgMTczIDE2IDIwOCAyNCAxNzAgMjE0IDE5NyAxNjkgNjAgMzAgNDEgMjEzIDEzNCAyIDIzNCA5MiAKKzE0NSA4MyAxNTUgNTEgMTY2IDI0MyAyMDggMjAwIDIzOCA0OCAyMSA2NiAyMDMgNDAgNTkgMTc4IDE3NiA4NSAxOTYgMTA2IDE5NSAyMDQgCisxOTQgMTUgNCAyMyAyODMgMjQgMjk2IDE0NiA2MSA0MyAyNTQgMTg5IDMxIDE5NSA3OCAyNjIgMTUxIDEzMCAyMjIgMTI0IDM0IDEyIAorMjAyIDEwMyAxMjYgMjE2IDExMiAyOTIgMTQgMTE3IDIyNiA4MCAxIDI5NyAxNTkgMTgzIDE5IDE1MSA4MCAxNzcgMjc0IDg0IDcgMjE4IAorMjk0IDE4MSAxMDQgMjggMTI2IDkwIDE4MCAyMTcgMTQwIDIyNSA2NyA5MCAyMzAgMjYyIDI5MiAyNjYgNzIgNzQgMzkgMjk4IDExIDQ4IAorMTQ3IDMwMCAyNzggMjE2IDI1MyAyNjUgXgorNjM4IDEgNzUgNjUgMjI3IDU4IDEwOCAyNDAgMjY3IDI2NyAxODUgNzEgMTMgOTUgMjEyIDcxIDIzNSAyODUgMTU0IDIzOCA0OCAxNDQgCisxNCAyODggMjIxIDIyOCA0MyAxNjUgNiAyODMgMjgwIDE3MiAxMjUgMTYgMTIxIDE0NSAxMjIgMjk3IDc0IDM2IDIyNyAxNyA1MSAyMTEgCis0IDY0IDE1NyAxIDM4IDIyNCAyNTQgMjgwIDEzMSA2OCAyOTEgMTYyIDE2MSA5NCAxNDIgMTQgMTY1IDI2OSAxNDEgMjUxIDI5OCAxNDEgCisyOTIgNTEgMTcwIDI1MSAzNSAxOTggMTcgMTAgMTU0IDI3OSAxMDUgMTczIDE5MiAyNzIgMjQ5IDc5IDE4IDM2IDI2OCA3NCA4MCAxNzAgCisyOTIgOTIgMjI3IDI4MCAyMTMgMTgyIDQ1IDgwIDEyOSAxNTAgNjMgNDkgMjk2IDE4NSAxMTIgNzAgMTI0IDE3MSA1NSAyNjMgNTEgMTI5IAorMTA5IDYgMjAgMzMgMjAxIDg0IDE0OSAyMTUgOTcgMTY4IDMyIDIxNiAyNyAyMzQgMTMzIDI4NyAxMTAgMTE0IDI0OCAxOTAgOSAxODMgCisxNTYgMTk0IDIyOCAxMjUgMjc5IDY0IDExNiAxNjMgOSAyNjUgMjcwIDI1MiA2MSA4IDExNiAyMDQgNjYgMjk0IDIyOSAyMzYgODkgMTYzIAorOTEgMTYwIDI0IDg1IDI5IDE0OSAyNTYgMTU0IDE5NyAyMTAgMTE1IDU1IDEwOCAxNTggNjggMjA5IDQ4IDEwMyAxNzYgMjU5IDI2MiAyNSAKKzE1IDEwIDMxIDIzIDE4IDc3IDIxIDEwMyAyNTggNjkgMTYgMTYyIDIwMiAxNTEgMTcxIDI3NyAxNDkgMjk3IDI5NiAyMjYgMTY5IDk5IAorODMgNzAgODMgMjkgMjYgNjcgMTAxIDM5IDMxIDY0IDc1IDEwNiAyODQgMiA2NyAyMjQgMjk1IDMzIDE2MCAyNDYgMjc1IDI3NSAxMiA2OSAKKzk4IDU3IDI2MCA2OSAxMzkgMTE0IDI4OSAyNDcgMzggMTQyIDU1IDIyMiAyOTggMTAwIDIzNSAyMiAyMTEgMjY3IDIyNiAxMjggNDIgNTQgCisxOTYgMTg0IDEgMjYwIDI1IDE5NiAxNDMgMjQ4IDIzMSAxNTEgMjEyIDMwIDE3OCAyNTYgMTk1IDI1NCAyMzkgNzQgMzkgMjggMjYzIAorMTMzIDI0IDE2NyAxNDMgMjA3IDE3NCAxMjIgMzQgMTMxIDY1IDE4NiAyMjAgNzkgMjgxIDI4MyAyMzkgMTE1IDk2IDU3IDEzNyAxMTcgCis1MiAxOCAxMTggNzggMTMyIDIxNyA1MyA0NCAyMzIgMTc3IDIyIDEyOSA2OCAxNjggMjk1IDc0IDMwMiAyNzUgMjM0IDE3NCA0MCAxMzkgCis3MyAyMzIgMjE4IDE2NCAxNTggMjcgMTUyIDE5IDIyOSAyNzcgMjMxIDE5MiA1MCA1OSA1MiAyNDAgNCAyMCAyMTQgMzAgMzAxIDIwOCAKKzI4MiA0NiAxMDYgMjQzIDI0OSAzOCAyNjUgNyA1IDkwIDI3MSAxNSAxMyAxMzYgMjY5IDEwMCAxOTQgMjY5IDE4MiA0IDIzIDEwMCAyNzYgCis3OSAyNDAgMjI2IDIxMCAxNTYgMTEyIDI5IDY3IDE0MiA5NiA2MCAyMyA1OSAxMzQgNTAgNjIgMjQyIDE4MiA4NiAxMzcgMTU4IDEwOSAKKzQ3IDc3IDYyIDE2MCAyODcgMjggMTkwIDUzIDEyNiAxMjcgMjM1IDI0NCA5NyAyMDkgODkgMjQ1IDIwNSAyMTggMjQ2IDUzIDg1IDcwIAorMjA2IDI4NSAxMTMgMTgxIDE5IDI3MCAzMCAyNjAgNjYgMjUzIDE3MiAyMDcgMjE1IDE3OSA2MyA1IDQ5IDIxNCA3MSA1NCAyMzcgMjQxIAorMzAgMjE5IDkgMjI0IDIxMyAyMjMgMTAyIDEwOSAzIDEzNCA5MSAxMTkgMjcxIDU2IDcwIDE2NSAyMjggODQgMjIyIDM1IDE1NyAyNjQgCisyODUgMTk1IDI5NSA3NyAxMDMgMjE3IDEyIDI5MSAyMDMgMzAzIDEyMyAxMDEgMzAyIDE5MyAzNSAxMTYgMTIyIDI1NiAyMzYgNyAyNjggCiszMyAyNDIgMTQxIDI5IDEwOCAxOTkgMTI1IDIzOCA3IDg3IDI4OSAyNSAyMzcgMjAwIDI3NyAxOTAgNTAgMjEgMTg1IDE1MyAxMjcgMTUzIAorNDUgMzkgNzIgMTIxIDEwNCA2NSAyNjggMTE1IDEzNyAxOTkgMTY2IDc2IDM2IDQ2IDE4OCA1MyAzIDE3NSAxNDggMTQ4IDIzMCA0MCA5OCAKKzE2IDIwMyA0MCAxODAgMTMwIDI2MSAxNzcgNjMgMjcxIDk3IDEyNyAxOTQgMTg3IDY4IDI1MCAxMDUgMTMyIDEzNSAyNDMgMjkwIDk1IAorMjk0IDI3MCAyOTMgMTE4IDM3IDc1IDE4OCA5NCA2MCAyMDQgMTA3IDQ3IDI1OCAxMTAgNzMgMTkxIDE2MSAxMzUgMjg0IDQzIDEyNCAKKzI1MyAyNTQgMTcgMjczIDEyIDI1MCAxNDYgMjc0IDE2NCAxMTcgMjc0IDEyMyA2MCAyNDUgMTY0IDc2IDIxNyA5NCAxMDEgMjYxIDEzNiAKKzYgMjQyIDIyMyAxNDMgMTY2IDMyIDkzIDc1IDE0NyAzNyAzMSAyNDUgMTIzIDE5IDE4OCAxMzUgMjAyIDIzMyA2NiAzMSAyODYgMjY1IAorNDggNjIgMTE5IDIzMCAzMDMgNDEgMjkxIDI0NCA1NiAxNTIgNjAgMjg2IDIgMTA1IDkxIDc4IDIxNCAyNyAxMTEgMjY2IDIwMCAxNCAKKzI0NyA3OSAxOTkgODQgMTgxIDI4MiAxMjggMSAzMDEgMTY3IDIyNSAxNyAyMzIgMjU5IDIyMSAxODcgMjkwIDEzNiA0NyAyOTkgMjUyIAorMTAyIDE1MCAxNDUgMTYzIDE1NyBeCis2NTMgMCAxOCAyOTkgMjA3IDQxIDExNyAxODQgMTc5IDE2IDI1MiAxOCAyNTUgODMgMjAgODIgMjY0IDE1NSAyNTcgMjE2IDIwMSAyOTYgCis1NCAxMDcgMzAzIDI1NSAzOSAyMDIgNjEgMiAyMzUgMTU0IDE1MSA4NiA5NCAxNiA3OCA4NCA5MSAzMCA4NiA2IDE1MyAzNiA5MyAyNTEgCisyMDkgMjYyIDI0MCAxMzQgMjY2IDExNCAxMTkgMTg3IDI0NCA4IDI0IDM1IDIyIDc2IDgxIDI2IDM4IDggNjggODAgNDMgMzIgMSAxMjkgCisyNCA0NCAxOTEgMTE4IDcyIDI1MSAxNjUgMTM4IDE0MCA5OSA0MCAxMSA1NCAxNTEgNDIgMjc2IDMwMSAxMjIgMTY0IDY3IDI3MSA1MCAKKzE4OSAxMTUgNyAxODAgODcgMjAwIDE0NiAxODUgMjg1IDY3IDUzIDIxOSAyMzEgMTA2IDE1MyAxIDIxNyAyNzIgMTY1IDE4MiAyNjQgCisxOTkgNzUgMjM3IDE1NyAyMTYgMTU3IDE3MiAzMyA3MiA3NyAxNTIgMjgwIDg3IDI0NCAyNzAgMjA2IDI0MSAyOTMgNzcgMjg0IDQwIAorMjI5IDE5MSAzMCAxMzAgMTMwIDE3NCAyOTggMTMgNDggMjc0IDI5OCA1NyA5MyAyOTUgMjcgMjgzIDE5NiA1NCA2MyAxNzkgMjM0IDQgCisyODIgMzcgMjQzIDEyMCAzMSAxMTMgMTM2IDE4MSAyMzcgNjkgMjc0IDM2IDE4MSAxOTMgMjUxIDI1MyA4MCAyNjEgOTAgMTg2IDEzOCAKKzE4NCAyMjMgNjEgNDYgNTMgMTc1IDEwNyA2IDE5NyA4MSAxMTQgMjA3IDEyOSA1OSAzMDUgMTcwIDE2MiA3MyAxNDggMTAwIDEwMiAxNyAKKzE0MCAxMSA5OCAyNzUgMTQyIDUgMjIxIDE0NiAyMjkgMTAzIDg4IDkgMTM5IDI4IDE3MSAxODkgMjAzIDI1NSAzMDEgNzggNDAgMjczIDkgCis1MSA4NiA1MCAyNzcgNTcgNDkgMTcxIDIzMyAyMSAyNzYgMjU3IDMwNCA2NCAzMiA0NSAyNTMgMTI0IDc5IDExMSAyMjEgNTggMjg3IAorMjg4IDE3NiAxNjkgMTIgMjA0IDIwIDE3MCAyMDYgMTk3IDE2OSA1NiAyMiA0MSAyMDUgMTI2IDMwMCAyMzQgOTIgMTQ1IDc5IDE1NSAzOSAKKzE1OCAyNDMgMjA4IDIwMCAyMzQgNDggMjEgNTggMTk5IDQwIDU1IDE3OCAxNzIgNzcgMTk2IDk4IDE4NyAyMDAgMTkwIDMgMjMgMjc5IAorMTYgMjk2IDE0MiA0OSAzOSAyNDYgMTg1IDIzIDE5MSA3NCAyNTQgMTUxIDEzMCAyMTggMTE2IDM0IDQgMTk0IDk1IDEyMiAyMDggMTEyIAorMjkyIDYgMTA5IDIxOCA3MiAyOTUgMjg5IDE1OSAxNzUgMTkgMTQzIDc2IDE2OSAyNzQgODAgMzA1IDIxNCAyODYgMTczIDEwNCAyMCAKKzEyNiA4MiAxNzYgMjEzIDEzNiAyMjUgNTUgOTAgMjMwIDI2MiAyODQgMjU4IDYwIDcwIDM5IDI5MCAzIDQ0IDE0NyAzMDAgMjc4IDIxNiAKKzI0NSAzNSA3NSA2MyAyMjMgNTIgMTA0IDIzOCAyNjMgMjY3IDE4NSA2NyA5IDk1IDIxMCA3MSAyMzMgMjgzIDE1MiAyMzYgNDIgMTQ0IDggCisyODYgMjE3IDIyOCA0MSAxNjEgMiAyNzkgMjc4IDE3MiAxMjEgMTQgMTE5IDE0MyAxMjAgMjkzIDY4IDM2IDIyNSAxMSA0NSAyMDkgNTggCisxNTUgMzAxIDM0IDIyMiAyNTIgMjgwIDEzMSA2MiAyOTEgMTYyIDE2MSA5MCAxNDIgMTQgMTYzIDI2NyAxNDEgMjQ5IDI5NCAxMzkgMjkwIAorNDcgMTY4IDI0NyAyOSAxOTggMTMgNCAxNTAgMjc3IDEwMSAxNzMgMTkyIDI2OCAyNDcgNzMgMTYgMzQgMjY2IDcwIDc0IDE2NiAyODggCis4OCAyMjcgMjc2IDIxMyAxODAgNDMgNzYgMTI1IDE1MCA1OSA0MyAyOTQgMTgzIDEwOCA2OCAxMjQgMTY3IDUzIDI2MyA0OSAxMjcgMTA5IAorMTQgMzEgMjAxIDc4IDMwMiAxNDkgMjE1IDk1IDE2NiAyNiAyMTIgMjEgMjMyIDEzMyAyODMgMTA4IDExMiAyNDggMTg4IDkgMTgzIDE1MiAKKzE5MiAyMjQgMTIzIDI3OSA2MCAxMTQgMTYzIDUgMjY1IDI3MCAyNTAgNTkgOCAxMTIgMjA0IDY0IDI5NCAyMjcgMjMyIDg5IDE1OSA4NyAKKzE1NiAyMiA4NSAyMyAxNDcgMjU2IDE1NCAxOTUgMjEwIDExNSA1MSAzMDQgMTA4IDE1NiA2NiAyMDkgNDQgMTAzIDE3NiAyNTcgMjYwIAorMTkgMTEgMTAgMjcgMjEgMTQgNzUgMTkgOTkgMjU4IDY5IDEyIDE2MCAyMDIgMTQ5IDE3MSAyNzcgMTQ1IDI5NyAyOTIgMjI0IDE2NyA5NyAKKzgxIDcwIDgzIDI5IDI0IDY3IDk3IDM3IDI1IDYyIDczIDEwNCAyODIgMiA2MSAyMjAgMjkzIDMzIDE2MCAyNDYgMjczIDI3MSA2IDY1IAorOTQgNTEgMjYwIDYzIDEzNSAxMTAgMjg5IDI0NyAzOCAxNDAgNTUgMjIyIDI5NiA5OCAyMzEgMTggMjExIDI2NSAyMjYgMTI2IDM4IDUyIAorMTkyIDE4MCAzMDUgMjU4IDI1IDE5NCAxMzkgMjQ2IDIyOSAxNDcgMjEyIDMwIDE3NCAyNTQgMTk1IDI1NCAyMzkgNzIgMzMgMjggMjU5IAorMTMxIDE4IDE2NyAxNDEgMjA1IDE3MCAxMTggMjggMTI3IDY1IDE4MiAyMjAgNzUgMjgxIDI4MSAyMzcgMTEzIDkyIDU3IDEzNyAxMTMgCis0OCAxMiAxMTYgNzggMTI4IDIxNSA1MSA0MiAyMzIgMTc3IDIyIDEyOSA2OCAxNjggMjkxIDE2MSBeCis2NTMgMCAyOTYgMjc1IDIyOCAxNzQgMzQgMTM2IDY3IDIyOSAyMTggMTU4IDE1OCAyNCAxNDkgMTMgMjIzIDI3MSAyMjUgMTg2IDQxIDU5IAorNTIgMjM0IDMwMiAyMCAyMTQgMjEgMjk1IDIwMiAyODIgNDYgMTA2IDI0MCAyNDkgMjkgMjYyIDQgMiA4NyAyNzEgMTUgNCAxMzYgMjY5IAorMTAwIDE4OCAyNjMgMTgyIDEgMTQgOTQgMjcwIDc2IDI0MCAyMjAgMjA3IDE1NiAxMDkgMjYgNjQgMTM2IDk2IDUxIDE3IDUzIDEzNCA0NyAKKzUzIDIzOSAxNzYgODMgMTM0IDE1MiAxMDYgMzggNzEgNTkgMTU3IDI4NyAyNSAyOTggMTkwIDQ0IDEyMyAxMjEgMjM1IDI0MSA5MSAyMDYgCis4MyAyMzkgMjA1IDIxMiAyNDAgNDcgODIgNjEgMjA2IDI4NSAxMTAgMTc1IDEwIDI2NCAyNCAyNTQgNjYgMjUzIDE2NiAyMDEgMjA5IAorMTc2IDU0IDUgNDYgMjExIDYyIDQ4IDIzMSAyMzggMjcgMjEzIDYgMjI0IDIxMCAyMjAgMTAyIDEwMyAzIDEzMSA4OCAxMTMgMjY4IDU2IAorNjQgMTY1IDIyNSA4MSAyMTkgMjkgMTU3IDI1OCAyNzkgMTkyIDI5NSA2OCAxMDAgMjE3IDkgMjg4IDIwMyAyOTcgMTE3IDk4IDMwMiAKKzE5MyAzMiAxMTYgMTIyIDI1MCAyMzYgNyAyNjggMjcgMjQyIDEzNSAyMyAxMDUgMTk2IDEyNSAyMzggMzA1IDg0IDI4MyAyMiAyMzQgCisxOTcgMjc0IDE4NCA1MCAxMiAxNzkgMTQ3IDEyNyAxNTMgNDUgMzMgNjMgMTIxIDEwMSA1OSAyNjIgMTA5IDEzMSAxOTMgMTY2IDY3IDI3IAorNDAgMTg4IDUzIDE3MiAxNDggMTQyIDIyNCAzNyA5NSA3IDIwMCAzMSAxNzcgMTI3IDI1OCAxNzQgNjMgMjY1IDk3IDEyNCAxOTQgMTgxIAorNjIgMjUwIDEwMiAxMzIgMTMyIDIzNyAyOTAgODkgMjkxIDI2NyAyOTAgMTE4IDM3IDY2IDE4NSA5NCA2MCAyMDEgMTA0IDQ3IDI1NSAKKzExMCA3MCAxODggMTU4IDEyOSAyNzggNDMgMTE4IDI0NyAyNDggMTQgMjY3IDEyIDI0NyAxNDMgMjY4IDE2MSAxMTcgMjcxIDEyMCA1NyAKKzI0MiAxNjQgNzYgMjExIDkxIDEwMSAyNjEgMTMzIDMgMjM2IDIxNyAxNDMgMTYzIDMyIDg3IDY5IDE0NCAzNCAzMSAyNDUgMTIzIDE2IAorMTgyIDEzNSAxOTYgMjMwIDYwIDI4IDI4NiAyNTkgNDUgNjIgMTE2IDIyNyAzMDMgMzUgMjg1IDI0NCA1MCAxNDYgNTQgMjgzIDMwMCAKKzEwNSA5MSA3MiAyMDggMjcgMTA4IDI2MCAxOTQgOCAyNDQgNzkgMTk5IDg0IDE3OCAyNzYgMTI4IDMwMiAyOTggMTYxIDIyMiAxNyAyMjYgCisyNTkgMjE4IDE4NyAyODcgMTMwIDQ0IDI5NiAyNDYgOTkgMTQ0IDEzOSAxNjAgNDQgMTggMjk5IDIwNSAzOSAxMTUgMTgzIDE3OSAxMyAKKzI1MiAxNyAyNTUgODEgMTcgODIgMjYzIDE1MyAyNTUgMjE1IDE5OSAyOTQgNTMgMTA1IDMwMSAyNTQgMzcgMjAwIDYwIDMwNiAyMzMgCisxNTMgMTUwIDg2IDkzIDE2IDc3IDgyIDkwIDI4IDg0IDUgMTUxIDMzIDkyIDI1MCAyMDcgMjYxIDIzOCAxMzIgMjY2IDExMiAxMTkgMTg2IAorMjQzIDYgMjIgMzIgMTkgNzMgNzkgMjYgMzUgNyA2NiA4MCA0MSAzMCAzMDYgMTI4IDI0IDQ0IDE5MSAxMTcgNjkgMjQ5IDE2MyAxMzcgCisxNDAgOTkgMzkgMTAgNTQgMTQ5IDQyIDI3NiAzMDEgMTIwIDE2MiA2NCAyNzAgNDcgMTg3IDExNCA1IDE4MCA4NiAxOTggMTQ1IDE4MyAKKzI4NCA2NiA1MSAyMTkgMjMxIDEwNCAxNTIgMSAyMTYgMjcyIDE2NCAxODEgMjY0IDE5NyA3MiAyMzcgMTU2IDIxNCAxNTUgMTcwIDMxIAorNzIgNzQgMTUyIDI3OSA4NyAyNDIgMjY5IDIwNSAyNDEgMjkzIDc3IDI4NCAzNyAyMjkgMTg5IDI5IDEyOCAxMjkgMTczIDI5NyAxMiA0NSAKKzI3MiAyOTggNTYgOTMgMjk0IDI0IDI4MyAxOTUgNTIgNjEgMTc3IDIzMiA0IDI4MCAzNCAyNDEgMTIwIDI4IDExMyAxMzQgMTgxIDIzNSAKKzY4IDI3MyAzNSAxODAgMTkxIDI1MSAyNTEgNzggMjYwIDg5IDE4NiAxMzggMTg0IDIyMyA2MSA0MyA1MCAxNzUgMTA3IDYgMTk1IDgxIAorMTE0IDIwNyAxMjcgNTYgMzAzIDE2OSAxNjAgNzMgMTQ3IDk4IDEwMCAxNSAxMzggMTEgOTggMjczIDE0MCAyIDIyMSAxNDYgMjI3IDEwMSAKKzg4IDggMTM5IDI2IDE2OSAxODkgMjAyIDI1MyAzMDAgNzYgMzggMjczIDYgNTEgODUgNDkgMjc1IDU1IDQ5IDE3MCAyMzMgMTkgMjc1IAorMjU3IDMwMyA2NCAzMSA0MyAyNTIgMTIyIDc3IDExMSAyMTkgNTggMjg2IDI4OCAxNzQgMTY4IDExIDIwMyAxOSAxNzAgMjA0IDE5NyAKKzE2OSA1NSAyMCA0MSAyMDMgMTI0IDI5OSAyMzQgOTIgMTQ1IDc4IDE1NSAzNiAxNTYgMjQzIDIwOCAyMDAgMjMzIDQ4IDIxIDU2IDE5OCAKKzQwIDU0IDE3OCAxNzEgNzUgMTk2IDk2IDE4NSAxOTkgMTg5IDMwNiAyMyAyNzggMTQgMjk2IDE0MSA0NiAzOCAyNDQgMTg0IDIxIDE5MCAKKzczIDI1MiAxNTEgMTMwIDIxNyAxMTQgMzQgMiAxOTIgOTMgMTIxIDIwNiAxMTIgMjkyIDQgMTA3IDIxNiA3MCAyOTMgMTEyIF4KKzY0NiAxIDE1OSAxNjkgMTkgMTM3IDczIDE2MyAyNzQgNzcgMzAyIDIxMSAyODAgMTY3IDEwNCAxNCAxMjYgNzYgMTczIDIxMCAxMzMgCisyMjUgNDYgOTAgMjMwIDI2MiAyNzggMjUyIDUxIDY3IDM5IDI4NCAzMDYgNDEgMTQ3IDMwMCAyNzggMjE2IDIzOSAzNSA3NSA2MCAyMTcgCis0MyA5OCAyMzUgMjU3IDI2NyAxODUgNjEgMyA5NSAyMDcgNzEgMjMwIDI4MCAxNDkgMjMzIDMzIDE0NCAzMDggMjgzIDIxMSAyMjggMzggCisxNTUgMzA1IDI3MyAyNzUgMTcyIDExNSAxMSAxMTYgMTQwIDExNyAyODcgNTkgMzYgMjIyIDIgMzYgMjA2IDMwMyA0OSAxNTIgMjk1IDI4IAorMjE5IDI0OSAyODAgMTMxIDUzIDI5MSAxNjIgMTYxIDg0IDE0MiAxNCAxNjAgMjY0IDE0MSAyNDYgMjg4IDEzNiAyODcgNDEgMTY1IDI0MSAKKzIwIDE5OCA3IDMwNCAxNDQgMjc0IDk1IDE3MyAxOTIgMjYyIDI0NCA2NCAxMyAzMSAyNjMgNjQgNjUgMTYwIDI4MiA4MiAyMjcgMjcwIAorMjEzIDE3NyA0MCA3MCAxMTkgMTUwIDUzIDM0IDI5MSAxODAgMTAyIDY1IDEyNCAxNjEgNTAgMjYzIDQ2IDEyNCAxMDkgMzAwIDUgMjggCisyMDEgNjkgMjk5IDE0OSAyMTUgOTIgMTYzIDE3IDIwNiAxMiAyMjkgMTMzIDI3NyAxMDUgMTA5IDI0OCAxODUgOSAxODMgMTQ2IDE4OSAKKzIxOCAxMjAgMjc5IDU0IDExMSAxNjMgMzA4IDI2NSAyNzAgMjQ3IDU2IDggMTA2IDIwNCA2MSAyOTQgMjI0IDIyNiA4OSAxNTMgODEgCisxNTAgMTkgODUgMTQgMTQ0IDI1NiAxNTQgMTkyIDIxMCAxMTUgNDUgMzA0IDEwOCAxNTMgNjMgMjA5IDM4IDEwMyAxNzYgMjU0IDI1NyAKKzEwIDUgMTAgMjEgMTggOCA3MiAxNiA5MyAyNTggNjkgNiAxNTcgMjAyIDE0NiAxNzEgMjc3IDEzOSAyOTcgMjg2IDIyMSAxNjQgOTQgNzggCis3MCA4MyAyOSAyMSA2NyA5MSAzNCAxNiA1OSA3MCAxMDEgMjc5IDIgNTIgMjE0IDI5MCAzMyAxNjAgMjQ2IDI3MCAyNjUgMzA2IDU5IDg4IAorNDIgMjYwIDU0IDEyOSAxMDQgMjg5IDI0NyAzOCAxMzcgNTUgMjIyIDI5MyA5NSAyMjUgMTIgMjExIDI2MiAyMjYgMTIzIDMyIDQ5IDE4NiAKKzE3NCAzMDUgMjU1IDI1IDE5MSAxMzMgMjQzIDIyNiAxNDEgMjEyIDMwIDE2OCAyNTEgMTk1IDI1NCAyMzkgNjkgMjQgMjggMjUzIDEyOCAKKzkgMTY3IDEzOCAyMDIgMTY0IDExMiAxOSAxMjEgNjUgMTc2IDIyMCA2OSAyODEgMjc4IDIzNCAxMTAgODYgNTcgMTM3IDEwNyA0MiAzIAorMTEzIDc4IDEyMiAyMTIgNDggMzkgMjMyIDE3NyAyMiAxMjkgNjggMTY4IDI4NSA3NCAyOTIgMjc1IDIyNCAxNzQgMzAgMTM0IDYzIDIyNyAKKzIxOCAxNTQgMTU4IDIyIDE0NyA5IDIxOSAyNjcgMjIxIDE4MiAzNSA1OSA1MiAyMzAgMjk4IDIwIDIxNCAxNSAyOTEgMTk4IDI4MiA0NiAKKzEwNiAyMzggMjQ5IDIzIDI2MCAyIDg1IDI3MSAxNSAzMDcgMTM2IDI2OSAxMDAgMTg0IDI1OSAxODIgMzA4IDggOTAgMjY2IDc0IDI0MCAKKzIxNiAyMDUgMTU2IDEwNyAyNCA2MiAxMzIgOTYgNDUgMTMgNDkgMTM0IDQ1IDQ3IDIzNyAxNzIgODEgMTMyIDE0OCAxMDQgMzIgNjcgNTcgCisxNTUgMjg3IDIzIDI5NCAxOTAgMzggMTIxIDExNyAyMzUgMjM5IDg3IDIwNCA3OSAyMzUgMjA1IDIwOCAyMzYgNDMgODAgNTUgMjA2IAorMjg1IDEwOCAxNzEgNCAyNjAgMjAgMjUwIDY2IDI1MyAxNjIgMTk3IDIwNSAxNzQgNDggNSA0NCAyMDkgNTYgNDQgMjI3IDIzNiAyNSAKKzIwOSA0IDIyNCAyMDggMjE4IDEwMiA5OSAzIDEyOSA4NiAxMDkgMjY2IDU2IDYwIDE2NSAyMjMgNzkgMjE3IDI1IDE1NyAyNTQgMjc1IAorMTkwIDI5NSA2MiA5OCAyMTcgNyAyODYgMjAzIDI5MyAxMTMgOTYgMzAyIDE5MyAzMCAxMTYgMTIyIDI0NiAyMzYgNyAyNjggMjMgMjQyIAorMTMxIDE5IDEwMyAxOTQgMTI1IDIzOCAzMDEgODIgMjc5IDIwIDIzMiAxOTUgMjcyIDE4MCA1MCA2IDE3NSAxNDMgMTI3IDE1MyA0NSAyOSAKKzU3IDEyMSA5OSA1NSAyNTggMTA1IDEyNyAxODkgMTY2IDYxIDIxIDM2IDE4OCA1MyAzMDcgMTcwIDE0OCAxMzggMjIwIDM1IDkzIDEgCisxOTggMjUgMTc1IDEyNSAyNTYgMTcyIDYzIDI2MSA5NyAxMjIgMTk0IDE3NyA1OCAyNTAgMTAwIDEzMiAxMzAgMjMzIDI5MCA4NSAyODkgCisyNjUgMjg4IDExOCAzNyA2MCAxODMgOTQgNjAgMTk5IDEwMiA0NyAyNTMgMTEwIDY4IDE4NiAxNTYgMTI1IDI3NCA0MyAxMTQgMjQzIAorMjQ0IDEyIDI2MyAxMiAyNDUgMTQxIDI2NCAxNTkgMTE3IDI2OSAxMTggNTUgMjQwIDE2NCA3NiAyMDcgODkgMTAxIDI2MSAxMzEgMSAKKzIzMiAyMTMgMTQzIDE2MSAzMiA4MyA2NSAxNDIgMzIgMzEgMjQ1IDEyMyAxNCAxNzggMTM1IDE5MiAyMjggNTYgMjYgMjg2IDI1NSA0MyAKKzYyIDExNCAyMjUgMzAzIDMxIDI4MSAyNDQgNDYgMTQyIDUwIDI4MSAyOTYgMTA1IDkxIDIzOCBeCis2NDcgMCAyMDAgMjcgMTA0IDI1MiAxODYgMjQwIDc5IDE5OSA4NCAxNzQgMjY4IDEyOCAyOTggMjk0IDE1MyAyMTggMTcgMjE4IDI1OSAKKzIxNCAxODcgMjgzIDEyMiA0MCAyOTIgMjM4IDk1IDEzNiAxMzEgMTU2IDM2IDE4IDI5OSAxOTcgMzEgMTA3IDE3OSAxNzkgMSAyNTIgMTMgCisyNTUgNzMgNSA4MiAyNTkgMTQ1IDI0NyAyMTEgMTkxIDI4NiA0OSA5NyAyOTMgMjUwIDI5IDE5MiA1NiAyOTggMjI1IDE0OSAxNDYgODYgCis4OSAxNiA3MyA3NCA4NiAyMCA3NiAxIDE0MyAyMSA4OCAyNDYgMTk5IDI1NyAyMzAgMTI0IDI2NiAxMDQgMTE5IDE4MiAyMzkgMzA5IDE0IAorMjAgNyA2MSA3MSAyNiAyMyAzIDU4IDgwIDMzIDIyIDMwMiAxMjQgMjQgNDQgMTkxIDExMyA1NyAyNDEgMTU1IDEzMyAxNDAgOTkgMzUgNiAKKzU0IDE0MSA0MiAyNzYgMzAxIDExMiAxNTQgNTIgMjY2IDM1IDE3OSAxMTAgMzA4IDE4MCA4MiAxOTAgMTQxIDE3NSAyODAgNjIgNDMgCisyMTkgMjMxIDk2IDE0OCAxIDIxMiAyNzIgMTYwIDE3NyAyNjQgMTg5IDYwIDIzNyAxNTIgMjA2IDE0NyAxNjIgMjMgNzIgNjIgMTUyIAorMjc1IDg3IDIzNCAyNjUgMjAxIDI0MSAyOTMgNzcgMjg0IDI1IDIyOSAxODEgMjUgMTIwIDEyNSAxNjkgMjkzIDggMzMgMjY0IDI5OCA1MiAKKzkzIDI5MCAxMiAyODMgMTkxIDQ0IDUzIDE2OSAyMjQgNCAyNzIgMjIgMjMzIDEyMCAxNiAxMTMgMTI2IDE4MSAyMjcgNjQgMjY5IDMxIAorMTc2IDE4MyAyNTEgMjQzIDcwIDI1NiA4NSAxODYgMTM4IDE4NCAyMjMgNjEgMzEgMzggMTc1IDEwNyA2IDE4NyA4MSAxMTQgMjA3IDExOSAKKzQ0IDI5NSAxNjUgMTUyIDczIDE0MyA5MCA5MiA3IDEzMCAxMSA5OCAyNjUgMTMyIDMwMSAyMjEgMTQ2IDIxOSA5MyA4OCA0IDEzOSAxOCAKKzE2MSAxODkgMTk4IDI0NSAyOTYgNjggMzAgMjczIDMwNSA1MSA4MSA0NSAyNjcgNDcgNDkgMTY2IDIzMyAxMSAyNzEgMjU3IDI5OSA2NCAKKzI3IDM1IDI0OCAxMTQgNjkgMTExIDIxMSA1OCAyODIgMjg4IDE2NiAxNjQgNyAxOTkgMTUgMTcwIDE5NiAxOTcgMTY5IDUxIDEyIDQxIAorMTk1IDExNiAyOTUgMjM0IDkyIDE0NSA3NCAxNTUgMjQgMTQ4IDI0MyAyMDggMjAwIDIyOSA0OCAyMSA0OCAxOTQgNDAgNTAgMTc4IDE2NyAKKzY3IDE5NiA4OCAxNzcgMTk1IDE4NSAyOTkgMzA2IDIzIDI3NCA2IDI5NiAxMzcgMzQgMzQgMjM2IDE4MCAxMyAxODYgNjkgMjQ0IDE1MSAKKzEzMCAyMTMgMTA2IDM0IDMwNSAxODQgODUgMTE3IDE5OCAxMTIgMjkyIDMwNyA5OSAyMDggNjIgMjg1IDI3OSAxNTkgMTY1IDE5IDEzMyAKKzcxIDE1OSAyNzQgNzUgMzAwIDIwOSAyNzYgMTYzIDEwNCAxMCAxMjYgNzIgMTcxIDIwOCAxMzEgMjI1IDQwIDkwIDIzMCAyNjIgMjc0IAorMjQ4IDQ1IDY1IDM5IDI4MCAzMDQgMzkgMTQ3IDMwMCAyNzggMjE2IDIzNSAzNSA3NSA1OCAyMTMgMzcgOTQgMjMzIDI1MyAyNjcgMTg1IAorNTcgMzEwIDk1IDIwNSA3MSAyMjggMjc4IDE0NyAyMzEgMjcgMTQ0IDMwNCAyODEgMjA3IDIyOCAzNiAxNTEgMzAzIDI2OSAyNzMgMTcyIAorMTExIDkgMTE0IDEzOCAxMTUgMjgzIDUzIDM2IDIyMCAzMDcgMzAgMjA0IDMwMSA0MyAxNTAgMjkxIDI0IDIxNyAyNDcgMjgwIDEzMSA0NyAKKzI5MSAxNjIgMTYxIDgwIDE0MiAxNCAxNTggMjYyIDE0MSAyNDQgMjg0IDEzNCAyODUgMzcgMTYzIDIzNyAxNCAxOTggMyAzMDAgMTQwIAorMjcyIDkxIDE3MyAxOTIgMjU4IDI0MiA1OCAxMSAyOSAyNjEgNjAgNTkgMTU2IDI3OCA3OCAyMjcgMjY2IDIxMyAxNzUgMzggNjYgMTE1IAorMTUwIDQ5IDI4IDI4OSAxNzggOTggNjMgMTI0IDE1NyA0OCAyNjMgNDQgMTIyIDEwOSAyOTYgMzEwIDI2IDIwMSA2MyAyOTcgMTQ5IDIxNSAKKzkwIDE2MSAxMSAyMDIgNiAyMjcgMTMzIDI3MyAxMDMgMTA3IDI0OCAxODMgOSAxODMgMTQyIDE4NyAyMTQgMTE4IDI3OSA1MCAxMDkgCisxNjMgMzA2IDI2NSAyNzAgMjQ1IDU0IDggMTAyIDIwNCA1OSAyOTQgMjIyIDIyMiA4OSAxNDkgNzcgMTQ2IDE3IDg1IDggMTQyIDI1NiAKKzE1NCAxOTAgMjEwIDExNSA0MSAzMDQgMTA4IDE1MSA2MSAyMDkgMzQgMTAzIDE3NiAyNTIgMjU1IDQgMSAxMCAxNyAxNiA0IDcwIDE0IAorODkgMjU4IDY5IDIgMTU1IDIwMiAxNDQgMTcxIDI3NyAxMzUgMjk3IDI4MiAyMTkgMTYyIDkyIDc2IDcwIDgzIDI5IDE5IDY3IDg3IDMyIAorMTAgNTcgNjggOTkgMjc3IDIgNDYgMjEwIDI4OCAzMyAxNjAgMjQ2IDI2OCAyNjEgMzAyIDU1IDg0IDM2IDI2MCA0OCAxMjUgMTAwIDI4OSAKKzI0NyAzOCAxMzUgNTUgMjIyIDI5MSA5MyAyMjEgOCAyMTEgMjYwIDIyNiAxMjEgMjggNDcgMTgyIDE3MCAzMDUgMjUzIDI1IDE4OSAxMjkgCisyNDEgMjI0IDEzNyAyMTIgMzAgMTY0IDI0OSAxOTUgMjU0IDIzOSA4NiBeCis2NjUgMCAxNSAyOCAyNDcgMTI1IDE2NyAxMzUgMTk5IDE1OCAxMDYgMTAgMTE1IDY1IDE3MCAyMjAgNjMgMjgxIDI3NSAyMzEgMTA3IDgwIAorNTcgMTM3IDEwMSAzNiAzMDYgMTEwIDc4IDExNiAyMDkgNDUgMzYgMjMyIDE3NyAyMiAxMjkgNjggMTY4IDI3OSA3NCAyODYgMjc1IDIxOCAKKzE3NCAyNCAxMzEgNTcgMjI0IDIxOCAxNDggMTU4IDE5IDE0NCAzIDIxMyAyNjEgMjE1IDE3NiAyNiA1OSA1MiAyMjQgMjkyIDIwIDIxNCAKKzYgMjg1IDE5MiAyODIgNDYgMTA2IDIzNSAyNDkgMTQgMjU3IDMxMSAzMDkgODIgMjcxIDE1IDMwMSAxMzYgMjY5IDEwMCAxNzggMjUzIAorMTgyIDMwOCAzMTEgODQgMjYwIDcxIDI0MCAyMTAgMjAyIDE1NiAxMDQgMjEgNTkgMTI2IDk2IDM2IDcgNDMgMTM0IDQyIDM4IDIzNCAKKzE2NiA3OCAxMjkgMTQyIDEwMSAyMyA2MSA1NCAxNTIgMjg3IDIwIDI4OCAxOTAgMjkgMTE4IDExMSAyMzUgMjM2IDgxIDIwMSA3MyAyMjkgCisyMDUgMjAyIDIzMCAzNyA3NyA0NiAyMDYgMjg1IDEwNSAxNjUgMzA3IDI1NCAxNCAyNDQgNjYgMjUzIDE1NiAxOTEgMTk5IDE3MSAzOSA1IAorNDEgMjA2IDQ3IDM4IDIyMSAyMzMgMjIgMjAzIDEgMjI0IDIwNSAyMTUgMTAyIDkzIDMgMTI2IDgzIDEwMyAyNjMgNTYgNTQgMTY1IDIyMCAKKzc2IDIxNCAxOSAxNTcgMjQ4IDI2OSAxODcgMjk1IDUzIDk1IDIxNyA0IDI4MyAyMDMgMjg3IDEwNyA5MyAzMDIgMTkzIDI3IDExNiAxMjIgCisyNDAgMjM2IDcgMjY4IDE3IDI0MiAxMjUgMTMgMTAwIDE5MSAxMjUgMjM4IDI5NSA3OSAyNzMgMTcgMjI5IDE5MiAyNjkgMTc0IDUwIAorMzA5IDE2OSAxMzcgMTI3IDE1MyA0NSAyMyA0OCAxMjEgOTYgNDkgMjUyIDk5IDEyMSAxODMgMTY2IDUyIDEyIDMwIDE4OCA1MyAzMDcgCisxNjcgMTQ4IDEzMiAyMTQgMzIgOTAgMzA0IDE5NSAxNiAxNzIgMTIyIDI1MyAxNjkgNjMgMjU1IDk3IDExOSAxOTQgMTcxIDUyIDI1MCAKKzk3IDEzMiAxMjcgMjI3IDI5MCA3OSAyODYgMjYyIDI4NSAxMTggMzcgNTEgMTgwIDk0IDYwIDE5NiA5OSA0NyAyNTAgMTEwIDY1IDE4MyAKKzE1MyAxMTkgMjY4IDQzIDEwOCAyMzcgMjM4IDkgMjU3IDEyIDI0MiAxMzggMjU4IDE1NiAxMTcgMjY2IDExNSA1MiAyMzcgMTY0IDc2IAorMjAxIDg2IDEwMSAyNjEgMTI4IDMxMCAyMjYgMjA3IDE0MyAxNTggMzIgNzcgNTkgMTM5IDI5IDMxIDI0NSAxMjMgMTEgMTcyIDEzNSAKKzE4NiAyMjUgNTAgMjMgMjg2IDI0OSA0MCA2MiAxMTEgMjIyIDMwMyAyNSAyNzUgMjQ0IDQwIDEzNiA0NCAyNzggMjkwIDEwNSA5MSA2MiAKKzE5OCAyNyAxMDMgMjUwIDE4NCAzMTAgMjM5IDc5IDE5OSA4NCAxNzMgMjY2IDEyOCAyOTcgMjkzIDE1MSAyMTcgMTcgMjE2IDI1OSAyMTMgCisxODcgMjgyIDEyMCAzOSAyOTEgMjM2IDk0IDEzNCAxMjkgMTU1IDM0IDE4IDI5OSAxOTUgMjkgMTA1IDE3OCAxNzkgMzEwIDI1MiAxMiAKKzI1NSA3MSAyIDgyIDI1OCAxNDMgMjQ1IDIxMCAxODkgMjg0IDQ4IDk1IDI5MSAyNDkgMjcgMTkwIDU1IDI5NiAyMjMgMTQ4IDE0NSA4NiAKKzg4IDE2IDcyIDcyIDg1IDE4IDc0IDE0MSAxOCA4NyAyNDUgMTk3IDI1NiAyMjggMTIyIDI2NiAxMDIgMTE5IDE4MSAyMzggMzA4IDEyIAorMTcgNCA1OCA2OSAyNiAyMCAyIDU2IDgwIDMxIDIwIDMwMSAxMjMgMjQgNDQgMTkxIDExMiA1NCAyMzkgMTUzIDEzMiAxNDAgOTkgMzQgNSAKKzU0IDEzOSA0MiAyNzYgMzAxIDExMCAxNTIgNDkgMjY1IDMyIDE3NyAxMDkgMzA3IDE4MCA4MSAxODggMTQwIDE3MyAyNzkgNjEgNDEgCisyMTkgMjMxIDk0IDE0NyAxIDIxMSAyNzIgMTU5IDE3NiAyNjQgMTg3IDU3IDIzNyAxNTEgMjA0IDE0NSAxNjAgMjEgNzIgNTkgMTUyIAorMjc0IDg3IDIzMiAyNjQgMjAwIDI0MSAyOTMgNzcgMjg0IDIyIDIyOSAxNzkgMjQgMTE4IDEyNCAxNjggMjkyIDcgMzAgMjYyIDI5OCA1MSAKKzkzIDI4OSA5IDI4MyAxOTAgNDIgNTEgMTY3IDIyMiA0IDI3MCAxOSAyMzEgMTIwIDEzIDExMyAxMjQgMTgxIDIyNSA2MyAyNjggMzAgCisxNzUgMTgxIDI1MSAyNDEgNjggMjU1IDg0IDE4NiAxMzggMTg0IDIyMyA2MSAyOCAzNSAxNzUgMTA3IDYgMTg1IDgxIDExNCAyMDcgMTE3IAorNDEgMjkzIDE2NCAxNTAgNzMgMTQyIDg4IDkwIDUgMTI4IDExIDk4IDI2MyAxMzAgMjk5IDIyMSAxNDYgMjE3IDkxIDg4IDMgMTM5IDE2IAorMTU5IDE4OSAxOTcgMjQzIDI5NSA2NiAyOCAyNzMgMzAzIDUxIDgwIDQ0IDI2NSA0NSA0OSAxNjUgMjMzIDkgMjcwIDI1NyAyOTggNjQgCisyNiAzMyAyNDcgMTEyIDY3IDExMSAyMDkgNTggMjgxIDI4OCAxNjQgMTYzIDYgMTk4IDE0IDE3MCAxOTQgMTk3IDE2OSA1MCAxMCA0MSAKKzE5MyAxMTQgMjk0IDIzNCA5MiAxNDUgNzMgMTU1IDIxIDE0NiAyNDMgMjA4IDIwMCAyMjggNDggMjEgNDYgMTkzIDQwIDQ5IDE3OCAxNjYgCis2NSAxOTYgODYgMTc1IDE5NCAxODQgMjk3IDMwNiAyMyAyNzMgMjA2IF4KKzY0MSAwIDI5NiAxMzQgMjUgMzEgMjMwIDE3NyA3IDE4MyA2NiAyMzggMTUxIDEzMCAyMTAgMTAwIDM0IDMwMiAxNzggNzkgMTE0IDE5MiAKKzExMiAyOTIgMzA0IDkzIDIwMiA1NiAyNzkgMjczIDE1OSAxNTkgMTkgMTI3IDY4IDE1MyAyNzQgNzIgMjk3IDIwNiAyNzAgMTU3IDEwNCAKKzQgMTI2IDY2IDE2OCAyMDUgMTI4IDIyNSAzMSA5MCAyMzAgMjYyIDI2OCAyNDIgMzYgNjIgMzkgMjc0IDMwMSAzNiAxNDcgMzAwIDI3OCAKKzIxNiAyMjkgMzUgNzUgNTUgMjA3IDI4IDg4IDIzMCAyNDcgMjY3IDE4NSA1MSAzMDcgOTUgMjAyIDcxIDIyNSAyNzUgMTQ0IDIyOCAxOCAKKzE0NCAyOTggMjc4IDIwMSAyMjggMzMgMTQ1IDMwMCAyNjMgMjcwIDE3MiAxMDUgNiAxMTEgMTM1IDExMiAyNzcgNDQgMzYgMjE3IDMwMSAKKzIxIDIwMSAyOTggMzQgMTQ3IDI4NSAxOCAyMTQgMjQ0IDI4MCAxMzEgMzggMjkxIDE2MiAxNjEgNzQgMTQyIDE0IDE1NSAyNTkgMTQxIAorMjQxIDI3OCAxMzEgMjgyIDMxIDE2MCAyMzEgNSAxOTggMzExIDI5NCAxMzQgMjY5IDg1IDE3MyAxOTIgMjUyIDIzOSA0OSA4IDI2IDI1OCAKKzU0IDUwIDE1MCAyNzIgNzIgMjI3IDI2MCAyMTMgMTcyIDM1IDYwIDEwOSAxNTAgNDMgMTkgMjg2IDE3NSA5MiA2MCAxMjQgMTUxIDQ1IAorMjYzIDQxIDExOSAxMDkgMjkwIDMwNCAyMyAyMDEgNTQgMjk0IDE0OSAyMTUgODcgMTU4IDIgMTk2IDMxMSAyMjQgMTMzIDI2NyAxMDAgCisxMDQgMjQ4IDE4MCA5IDE4MyAxMzYgMTg0IDIwOCAxMTUgMjc5IDQ0IDEwNiAxNjMgMzAzIDI2NSAyNzAgMjQyIDUxIDggOTYgMjA0IDU2IAorMjk0IDIxOSAyMTYgODkgMTQzIDcxIDE0MCAxNCA4NSAzMTMgMTM5IDI1NiAxNTQgMTg3IDIxMCAxMTUgMzUgMzA0IDEwOCAxNDggNTggCisyMDkgMjggMTAzIDE3NiAyNDkgMjUyIDMwOSAzMDkgMTAgMTEgMTMgMzEyIDY3IDExIDgzIDI1OCA2OSAzMTAgMTUyIDIwMiAxNDEgMTcxIAorMjc3IDEyOSAyOTcgMjc2IDIxNiAxNTkgODkgNzMgNzAgODMgMjkgMTYgNjcgODEgMjkgMSA1NCA2NSA5NiAyNzQgMiAzNyAyMDQgMjg1IAorMzMgMTYwIDI0NiAyNjUgMjU1IDI5NiA0OSA3OCAyNyAyNjAgMzkgMTE5IDk0IDI4OSAyNDcgMzggMTMyIDU1IDIyMiAyODggOTAgMjE1IAorMiAyMTEgMjU3IDIyNiAxMTggMjIgNDQgMTc2IDE2NCAzMDUgMjUwIDI1IDE4NiAxMjMgMjM4IDIyMSAxMzEgMjEyIDMwIDE1OCAyNDYgCisxOTUgMjU0IDIzOSA2NCA5IDI4IDI0MyAxMjMgMzA4IDE2NyAxMzMgMTk3IDE1NCAxMDIgNCAxMTEgNjUgMTY2IDIyMCA1OSAyODEgMjczIAorMjI5IDEwNSA3NiA1NyAxMzcgOTcgMzIgMzAyIDEwOCA3OCAxMTIgMjA3IDQzIDM0IDIzMiAxNzcgMjIgMTI5IDY4IDE2OCAyNzUgNzQgCisyODIgMjc1IDIxNCAxNzQgMjAgMTI5IDUzIDIyMiAyMTggMTQ0IDE1OCAxNyAxNDIgMzEzIDIwOSAyNTcgMjExIDE3MiAyMCA1OSA1MiAKKzIyMCAyODggMjAgMjE0IDI4MSAxODggMjgyIDQ2IDEwNiAyMzMgMjQ5IDggMjU1IDMxMSAzMDkgODAgMjcxIDE1IDI5NyAxMzYgMjY5IAorMTAwIDE3NCAyNDkgMTgyIDMwOCAzMDcgODAgMjU2IDY5IDI0MCAyMDYgMjAwIDE1NiAxMDIgMTkgNTcgMTIyIDk2IDMwIDMgMzkgMTM0IAorNDAgMzIgMjMyIDE2MiA3NiAxMjcgMTM4IDk5IDE3IDU3IDUyIDE1MCAyODcgMTggMjg0IDE5MCAyMyAxMTYgMTA3IDIzNSAyMzQgNzcgCisxOTkgNjkgMjI1IDIwNSAxOTggMjI2IDMzIDc1IDQwIDIwNiAyODUgMTAzIDE2MSAzMDMgMjUwIDEwIDI0MCA2NiAyNTMgMTUyIDE4NyAKKzE5NSAxNjkgMzMgNSAzOSAyMDQgNDEgMzQgMjE3IDIzMSAyMCAxOTkgMzEzIDIyNCAyMDMgMjEzIDEwMiA4OSAzIDEyNCA4MSA5OSAyNjEgCis1NiA1MCAxNjUgMjE4IDc0IDIxMiAxNSAxNTcgMjQ0IDI2NSAxODUgMjk1IDQ3IDkzIDIxNyAyIDI4MSAyMDMgMjgzIDEwMyA5MSAzMDIgCisxOTMgMjUgMTE2IDEyMiAyMzYgMjM2IDcgMjY4IDEzIDI0MiAxMjEgOSA5OCAxODkgMTI1IDIzOCAyOTEgNzcgMjY5IDE1IDIyNyAxOTAgCisyNjcgMTcwIDUwIDMwNSAxNjUgMTMzIDEyNyAxNTMgNDUgMTkgNDIgMTIxIDk0IDQ1IDI0OCA5NSAxMTcgMTc5IDE2NiA0NiA2IDI2IAorMTg4IDUzIDMwNyAxNjUgMTQ4IDEyOCAyMTAgMzAgODggMzAwIDE5MyAxMCAxNzAgMTIwIDI1MSAxNjcgNjMgMjUxIDk3IDExNyAxOTQgCisxNjcgNDggMjUwIDk1IDEzMiAxMjUgMjIzIDI5MCA3NSAyODQgMjYwIDI4MyAxMTggMzcgNDUgMTc4IDk0IDYwIDE5NCA5NyA0NyAyNDggCisxMTAgNjMgMTgxIDE1MSAxMTUgMjY0IDQzIDEwNCAyMzMgMjM0IDcgMjUzIDEyIDI0MCAxMzYgMjU0IDE1NCAxMTcgMjY0IDExMyA1MCAKKzIzNSAxNjQgNzYgMTk3IDg0IDEwMSAyNjEgMTI2IDMxMCAyMjIgMjAzIDE0MyAyNzYgXgorNjU2IDAgMzIgNjkgNTEgMTM1IDI1IDMxIDI0NSAxMjMgNyAxNjQgMTM1IDE3OCAyMjEgNDIgMTkgMjg2IDI0MSAzNiA2MiAxMDcgMjE4IAorMzAzIDE3IDI2NyAyNDQgMzIgMTI4IDM2IDI3NCAyODIgMTA1IDkxIDU0IDE5MCAyNyA5OSAyNDIgMTc2IDMwNiAyMzUgNzkgMTk5IDg0IAorMTY5IDI1OCAxMjggMjkzIDI4OSAxNDMgMjEzIDE3IDIwOCAyNTkgMjA5IDE4NyAyNzggMTEyIDM1IDI4NyAyMjggOTAgMTI2IDEyMSAKKzE1MSAyNiAxOCAyOTkgMTg3IDIxIDk3IDE3NCAxNzkgMzAyIDI1MiA4IDI1NSA2MyAzMDYgODIgMjU0IDEzNSAyMzcgMjA2IDE4MSAyNzYgCis0NCA4NyAyODMgMjQ1IDE5IDE4MiA1MSAyODggMjE1IDE0NCAxNDEgODYgODQgMTYgNjggNjQgODEgMTAgNjYgMzEyIDEzMyA2IDgzIAorMjQxIDE4OSAyNTIgMjIwIDExNCAyNjYgOTQgMTE5IDE3NyAyMzQgMzA0IDQgNSAzMDggNDYgNjEgMjYgOCAzMTQgNDggODAgMjMgMTIgCisyOTcgMTE5IDI0IDQ0IDE5MSAxMDggNDIgMjMxIDE0NSAxMjggMTQwIDk5IDMwIDEgNTQgMTMxIDQyIDI3NiAzMDEgMTAyIDE0NCAzNyAKKzI2MSAyMCAxNjkgMTA1IDMwMyAxODAgNzcgMTgwIDEzNiAxNjUgMjc1IDU3IDMzIDIxOSAyMzEgODYgMTQzIDEgMjA3IDI3MiAxNTUgCisxNzIgMjY0IDE3OSA0NSAyMzcgMTQ3IDE5NiAxMzcgMTUyIDEzIDcyIDQ3IDE1MiAyNzAgODcgMjI0IDI2MCAxOTYgMjQxIDI5MyA3NyAKKzI4NCAxMCAyMjkgMTcxIDIwIDExMCAxMjAgMTY0IDI4OCAzIDE4IDI1NCAyOTggNDcgOTMgMjg1IDMxMyAyODMgMTg2IDM0IDQzIDE1OSAKKzIxNCA0IDI2MiA3IDIyMyAxMjAgMSAxMTMgMTE2IDE4MSAyMTcgNTkgMjY0IDI2IDE3MSAxNzMgMjUxIDIzMyA2MCAyNTEgODAgMTg2IAorMTM4IDE4NCAyMjMgNjEgMTYgMjMgMTc1IDEwNyA2IDE3NyA4MSAxMTQgMjA3IDEwOSAyOSAyODUgMTYwIDE0MiA3MyAxMzggODAgODIgCiszMTMgMTIwIDExIDk4IDI1NSAxMjIgMjkxIDIyMSAxNDYgMjA5IDgzIDg4IDMxNSAxMzkgOCAxNTEgMTg5IDE5MyAyMzUgMjkxIDU4IDIwIAorMjczIDI5NSA1MSA3NiA0MCAyNTcgMzcgNDkgMTYxIDIzMyAxIDI2NiAyNTcgMjk0IDY0IDIyIDI1IDI0MyAxMDQgNTkgMTExIDIwMSA1OCAKKzI3NyAyODggMTU2IDE1OSAyIDE5NCAxMCAxNzAgMTg2IDE5NyAxNjkgNDYgMiA0MSAxODUgMTA2IDI5MCAyMzQgOTIgMTQ1IDY5IDE1NSAKKzkgMTM4IDI0MyAyMDggMjAwIDIyNCA0OCAyMSAzOCAxODkgNDAgNDUgMTc4IDE2MiA1NyAxOTYgNzggMTY3IDE5MCAxODAgMjg5IDMwNiAKKzIzIDI2OSAzMTIgMjk2IDEzMiAxOSAyOSAyMjYgMTc1IDMgMTgxIDY0IDIzNCAxNTEgMTMwIDIwOCA5NiAzNCAzMDAgMTc0IDc1IDExMiAKKzE4OCAxMTIgMjkyIDMwMiA4OSAxOTggNTIgMjc1IDI2OSAxNTkgMTU1IDE5IDEyMyA2NiAxNDkgMjc0IDcwIDI5NSAyMDQgMjY2IDE1MyAKKzEwNCAxMjYgNjIgMTY2IDIwMyAxMjYgMjI1IDI1IDkwIDIzMCAyNjIgMjY0IDIzOCAzMCA2MCAzOSAyNzAgMjk5IDM0IDE0NyAzMDAgCisyNzggMjE2IDIyNSAzNSA3NSA1MyAyMDMgMjIgODQgMjI4IDI0MyAyNjcgMTg1IDQ3IDMwNSA5NSAyMDAgNzEgMjIzIDI3MyAxNDIgMjI2IAorMTIgMTQ0IDI5NCAyNzYgMTk3IDIyOCAzMSAxNDEgMjk4IDI1OSAyNjggMTcyIDEwMSA0IDEwOSAxMzMgMTEwIDI3MyAzOCAzNiAyMTUgCisyOTcgMTUgMTk5IDI5NiAyOCAxNDUgMjgxIDE0IDIxMiAyNDIgMjgwIDEzMSAzMiAyOTEgMTYyIDE2MSA3MCAxNDIgMTQgMTUzIDI1NyAKKzE0MSAyMzkgMjc0IDEyOSAyODAgMjcgMTU4IDIyNyAzMTUgMTk4IDMwOSAyOTAgMTMwIDI2NyA4MSAxNzMgMTkyIDI0OCAyMzcgNDMgNiAKKzI0IDI1NiA1MCA0NCAxNDYgMjY4IDY4IDIyNyAyNTYgMjEzIDE3MCAzMyA1NiAxMDUgMTUwIDM5IDEzIDI4NCAxNzMgODggNTggMTI0IAorMTQ3IDQzIDI2MyAzOSAxMTcgMTA5IDI4NiAzMDAgMjEgMjAxIDQ4IDI5MiAxNDkgMjE1IDg1IDE1NiAzMTIgMTkyIDMwNyAyMjIgMTMzIAorMjYzIDk4IDEwMiAyNDggMTc4IDkgMTgzIDEzMiAxODIgMjA0IDExMyAyNzkgNDAgMTA0IDE2MyAzMDEgMjY1IDI3MCAyNDAgNDkgOCA5MiAKKzIwNCA1NCAyOTQgMjE3IDIxMiA4OSAxMzkgNjcgMTM2IDEyIDg1IDMwOSAxMzcgMjU2IDE1NCAxODUgMjEwIDExNSAzMSAzMDQgMTA4IAorMTQ2IDU2IDIwOSAyNCAxMDMgMTc2IDI0NyAyNTAgMzA1IDMwNyAxMCA3IDExIDMxMCA2NSA5IDc5IDI1OCA2OSAzMDggMTUwIDIwMiAKKzEzOSAxNzEgMjc3IDEyNSAyOTcgMjcyIDIxNCAxNTcgODcgNzEgNzAgODMgMjkgMTQgNjcgNzcgMjcgMzExIDUyIDYzIDk0IDI3MiAyIAorMzEgMjAwIDI4MyAzMyAxNjAgMjQ2IDI2MyAyNTEgMjkyIDQ1IDc0IDIxIDI2MCAzMyAxMTUgOTAgMjg5IDI0NyAzOCAxMzAgNTUgMjIyIAorMjg2IDg4IDIxMSAyMjcgXgorNjY4IDAgMjExIDI1NCAyMjYgMTE1IDE2IDQxIDE3MCAxNTggMzA1IDI0NyAyNSAxODMgMTE3IDIzNSAyMTggMTI1IDIxMiAzMCAxNTIgCisyNDMgMTk1IDI1NCAyMzkgNjEgMjggMjM3IDEyMCAzMDIgMTY3IDEzMCAxOTQgMTQ4IDk2IDMxMiAxMDUgNjUgMTYwIDIyMCA1MyAyODEgCisyNzAgMjI2IDEwMiA3MCA1NyAxMzcgOTEgMjYgMjk2IDEwNSA3OCAxMDYgMjA0IDQwIDMxIDIzMiAxNzcgMjIgMTI5IDY4IDE2OCAyNjkgCis3NCAyNzYgMjc1IDIwOCAxNzQgMTQgMTI2IDQ3IDIxOSAyMTggMTM4IDE1OCAxNCAxMzkgMzEwIDIwMyAyNTEgMjA1IDE2NiAxMSA1OSAKKzUyIDIxNCAyODIgMjAgMjE0IDMwOCAyNzUgMTgyIDI4MiA0NiAxMDYgMjMwIDI0OSAzMTYgMjUyIDMxMSAzMDkgNzcgMjcxIDE1IDI5MSAKKzEzNiAyNjkgMTAwIDE2OCAyNDMgMTgyIDMwOCAzMDEgNzQgMjUwIDY2IDI0MCAyMDAgMTk3IDE1NiA5OSAxNiA1NCAxMTYgOTYgMjEgCiszMTQgMzMgMTM0IDM3IDIzIDIyOSAxNTYgNzMgMTI0IDEzMiA5NiA4IDUxIDQ5IDE0NyAyODcgMTUgMjc4IDE5MCAxNCAxMTMgMTAxIAorMjM1IDIzMSA3MSAxOTYgNjMgMjE5IDIwNSAxOTIgMjIwIDI3IDcyIDMxIDIwNiAyODUgMTAwIDE1NSAyOTcgMjQ0IDQgMjM0IDY2IDI1MyAKKzE0NiAxODEgMTg5IDE2NiAyNCA1IDM2IDIwMSAzMiAyOCAyMTEgMjI4IDE3IDE5MyAzMTMgMjI0IDIwMCAyMTAgMTAyIDgzIDMgMTIxIAorNzggOTMgMjU4IDU2IDQ0IDE2NSAyMTUgNzEgMjA5IDkgMTU3IDIzOCAyNTkgMTgyIDI5NSAzOCA5MCAyMTcgMzE2IDI3OCAyMDMgMjc3IAorOTcgODggMzAyIDE5MyAyMiAxMTYgMTIyIDIzMCAyMzYgNyAyNjggNyAyNDIgMTE1IDMgOTUgMTg2IDEyNSAyMzggMjg1IDc0IDI2MyAxMiAKKzIyNCAxODcgMjY0IDE2NCA1MCAyOTkgMTU5IDEyNyAxMjcgMTUzIDQ1IDEzIDMzIDEyMSA5MSAzOSAyNDIgODkgMTExIDE3MyAxNjYgMzcgCiszMTQgMjAgMTg4IDUzIDMwNyAxNjIgMTQ4IDEyMiAyMDQgMjcgODUgMjk0IDE5MCAxIDE2NyAxMTcgMjQ4IDE2NCA2MyAyNDUgOTcgMTE0IAorMTk0IDE2MSA0MiAyNTAgOTIgMTMyIDEyMiAyMTcgMjkwIDY5IDI4MSAyNTcgMjgwIDExOCAzNyAzNiAxNzUgOTQgNjAgMTkxIDk0IDQ3IAorMjQ1IDExMCA2MCAxNzggMTQ4IDEwOSAyNTggNDMgOTggMjI3IDIyOCA0IDI0NyAxMiAyMzcgMTMzIDI0OCAxNTEgMTE3IDI2MSAxMTAgCis0NyAyMzIgMTY0IDc2IDE5MSA4MSAxMDEgMjYxIDEyMyAzMTAgMjE2IDE5NyAxNDMgMTUzIDMyIDY3IDQ5IDEzNCAyNCAzMSAyNDUgMTIzIAorNiAxNjIgMTM1IDE3NiAyMjAgNDAgMTggMjg2IDIzOSAzNSA2MiAxMDYgMjE3IDMwMyAxNSAyNjUgMjQ0IDMwIDEyNiAzNCAyNzMgMjgwIAorMTA1IDkxIDUyIDE4OCAyNyA5OCAyNDAgMTc0IDMwNSAyMzQgNzkgMTk5IDg0IDE2OCAyNTYgMTI4IDI5MiAyODggMTQxIDIxMiAxNyAKKzIwNiAyNTkgMjA4IDE4NyAyNzcgMTEwIDM0IDI4NiAyMjYgODkgMTI0IDExOSAxNTAgMjQgMTggMjk5IDE4NSAxOSA5NSAxNzMgMTc5IAorMzAwIDI1MiA3IDI1NSA2MSAzMDQgODIgMjUzIDEzMyAyMzUgMjA1IDE3OSAyNzQgNDMgODUgMjgxIDI0NCAxNyAxODAgNTAgMjg2IDIxMyAKKzE0MyAxNDAgODYgODMgMTYgNjcgNjIgODAgOCA2NCAzMTIgMTMxIDMgODIgMjQwIDE4NyAyNTEgMjE4IDExMiAyNjYgOTIgMTE5IDE3NiAKKzIzMyAzMDMgMiAyIDMwNiA0MyA1OSAyNiA1IDMxNCA0NiA4MCAyMSAxMCAyOTYgMTE4IDI0IDQ0IDE5MSAxMDcgMzkgMjI5IDE0MyAxMjcgCisxNDAgOTkgMjkgNTQgMTI5IDQyIDI3NiAzMDEgMTAwIDE0MiAzNCAyNjAgMTcgMTY3IDEwNCAzMDIgMTgwIDc2IDE3OCAxMzUgMTYzIAorMjc0IDU2IDMxIDIxOSAyMzEgODQgMTQyIDEgMjA2IDI3MiAxNTQgMTcxIDI2NCAxNzcgNDIgMjM3IDE0NiAxOTQgMTM1IDE1MCAxMSA3MiAKKzQ0IDE1MiAyNjkgODcgMjIyIDI1OSAxOTUgMjQxIDI5MyA3NyAyODQgNyAyMjkgMTY5IDE5IDEwOCAxMTkgMTYzIDI4NyAyIDE1IDI1MiAKKzI5OCA0NiA5MyAyODQgMzExIDI4MyAxODUgMzIgNDEgMTU3IDIxMiA0IDI2MCA0IDIyMSAxMjAgMzE1IDExMyAxMTQgMTgxIDIxNSA1OCAKKzI2MyAyNSAxNzAgMTcxIDI1MSAyMzEgNTggMjUwIDc5IDE4NiAxMzggMTg0IDIyMyA2MSAxMyAyMCAxNzUgMTA3IDYgMTc1IDgxIDExNCAKKzIwNyAxMDcgMjYgMjgzIDE1OSAxNDAgNzMgMTM3IDc4IDgwIDMxMiAxMTggMTEgOTggMjUzIDEyMCAyODkgMjIxIDE0NiAyMDcgODEgODggCiszMTUgMTM5IDYgMTQ5IDE4OSAxOTIgMjMzIDI5MCA1NiAxOCAyNzMgMjkzIDUxIDc1IDM5IDI1NSAzNSA0OSAxNjAgMjMzIDMxNiAyNjUgCisyNTcgMjkzIDY0IDIxIDIzIDI0MiAxMDIgNTcgMTExIDE5OSA1OCAyNzYgMjg4IDE1NCAxNTggMSAxOTMgOSAxNzAgMTg0IDE5NyAxNjkgCis0NSA0MSAxODMgMTA0IDI4OSAyMzQgOTIgMTQ1IDY4IDE1NSA2IDEzNiAyNDMgMjA4IDIwMyBeCis2NTYgMCAyMjEgNDggMjEgMzIgMTg2IDQwIDQyIDE3OCAxNTkgNTEgMTk2IDcyIDE2MSAxODcgMTc3IDI4MyAzMDYgMjMgMjY2IDMwOSAKKzI5NiAxMjkgMTAgMjYgMjIwIDE3MiAzMTYgMTc4IDYxIDIyOCAxNTEgMTMwIDIwNSA5MCAzNCAyOTcgMTY4IDY5IDEwOSAxODIgMTEyIAorMjkyIDI5OSA4MyAxOTIgNDYgMjY5IDI2MyAxNTkgMTQ5IDE5IDExNyA2MyAxNDMgMjc0IDY3IDI5MiAyMDEgMjYwIDE0NyAxMDQgMzEzIAorMTI2IDU2IDE2MyAyMDAgMTIzIDIyNSAxNiA5MCAyMzAgMjYyIDI1OCAyMzIgMjEgNTcgMzkgMjY0IDI5NiAzMSAxNDcgMzAwIDI3OCAKKzIxNiAyMTkgMzUgNzUgNTAgMTk3IDEzIDc4IDIyNSAyMzcgMjY3IDE4NSA0MSAzMDIgOTUgMTk3IDcxIDIyMCAyNzAgMTM5IDIyMyAzIAorMTQ0IDI4OCAyNzMgMTkxIDIyOCAyOCAxMzUgMjk1IDI1MyAyNjUgMTcyIDk1IDEgMTA2IDEzMCAxMDcgMjY3IDI5IDM2IDIxMiAyOTEgNiAKKzE5NiAyOTMgMTkgMTQyIDI3NSA4IDIwOSAyMzkgMjgwIDEzMSAyMyAyOTEgMTYyIDE2MSA2NCAxNDIgMTQgMTUwIDI1NCAxNDEgMjM2IAorMjY4IDEyNiAyNzcgMjEgMTU1IDIyMSAzMDkgMTk4IDMwNiAyODQgMTI0IDI2NCA3NSAxNzMgMTkyIDI0MiAyMzQgMzQgMyAyMSAyNTMgCis0NCAzNSAxNDAgMjYyIDYyIDIyNyAyNTAgMjEzIDE2NyAzMCA1MCA5OSAxNTAgMzMgNCAyODEgMTcwIDgyIDU1IDEyNCAxNDEgNDAgMjYzIAorMzYgMTE0IDEwOSAyODAgMjk0IDE4IDIwMSAzOSAyODkgMTQ5IDIxNSA4MiAxNTMgMzA2IDE4NiAzMDEgMjE5IDEzMyAyNTcgOTUgOTkgCisyNDggMTc1IDkgMTgzIDEyNiAxNzkgMTk4IDExMCAyNzkgMzQgMTAxIDE2MyAyOTggMjY1IDI3MCAyMzcgNDYgOCA4NiAyMDQgNTEgMjk0IAorMjE0IDIwNiA4OSAxMzMgNjEgMTMwIDkgODUgMzAzIDEzNCAyNTYgMTU0IDE4MiAyMTAgMTE1IDI1IDMwNCAxMDggMTQzIDUzIDIwOSAxOCAKKzEwMyAxNzYgMjQ0IDI0NyAyOTkgMzA0IDEwIDEgOCAzMDcgNjIgNiA3MyAyNTggNjkgMzA1IDE0NyAyMDIgMTM2IDE3MSAyNzcgMTE5IAorMjk3IDI2NiAyMTEgMTU0IDg0IDY4IDcwIDgzIDI5IDExIDY3IDcxIDI0IDMwNSA0OSA2MCA5MSAyNjkgMiAyMiAxOTQgMjgwIDMzIDE2MCAKKzI0NiAyNjAgMjQ1IDI4NiAzOSA2OCAxMiAyNjAgMjQgMTA5IDg0IDI4OSAyNDcgMzggMTI3IDU1IDIyMiAyODMgODUgMjA1IDMxMSAyMTEgCisyNTIgMjI2IDExMyAxMiAzOSAxNjYgMTU0IDMwNSAyNDUgMjUgMTgxIDExMyAyMzMgMjE2IDEyMSAyMTIgMzAgMTQ4IDI0MSAxOTUgMjU0IAorMjM5IDU5IDMxMyAyOCAyMzMgMTE4IDI5OCAxNjcgMTI4IDE5MiAxNDQgOTIgMzA4IDEwMSA2NSAxNTYgMjIwIDQ5IDI4MSAyNjggMjI0IAorMTAwIDY2IDU3IDEzNyA4NyAyMiAyOTIgMTAzIDc4IDEwMiAyMDIgMzggMjkgMjMyIDE3NyAyMiAxMjkgNjggMTY4IDI2NSA3NCAyNzIgCisyNzUgMjA0IDE3NCAxMCAxMjQgNDMgMjE3IDIxOCAxMzQgMTU4IDEyIDEzNyAzMDggMTk5IDI0NyAyMDEgMTYyIDUgNTkgNTIgMjEwIAorMjc4IDIwIDIxNCAzMDQgMjcxIDE3OCAyODIgNDYgMTA2IDIyOCAyNDkgMzEyIDI1MCAzMTEgMzA5IDc1IDI3MSAxNSAyODcgMTM2IDI2OSAKKzEwMCAxNjQgMjM5IDE4MiAzMDggMjk3IDcwIDI0NiA2NCAyNDAgMTk2IDE5NSAxNTYgOTcgMTQgNTIgMTEyIDk2IDE1IDMxMiAyOSAxMzQgCiszNSAxNyAyMjcgMTUyIDcxIDEyMiAxMjggOTQgMiA0NyA0NyAxNDUgMjg3IDEzIDI3NCAxOTAgOCAxMTEgOTcgMjM1IDIyOSA2NyAxOTQgCis1OSAyMTUgMjA1IDE4OCAyMTYgMjMgNzAgMjUgMjA2IDI4NSA5OCAxNTEgMjkzIDI0MCAyMzAgNjYgMjUzIDE0MiAxNzcgMTg1IDE2NCAKKzE4IDUgMzQgMTk5IDI2IDI0IDIwNyAyMjYgMTUgMTg5IDMxMyAyMjQgMTk4IDIwOCAxMDIgNzkgMyAxMTkgNzYgODkgMjU2IDU2IDQwIAorMTY1IDIxMyA2OSAyMDcgNSAxNTcgMjM0IDI1NSAxODAgMjk1IDMyIDg4IDIxNyAzMTYgMjc2IDIwMyAyNzMgOTMgODYgMzAyIDE5MyAyMCAKKzExNiAxMjIgMjI2IDIzNiA3IDI2OCAzIDI0MiAxMTEgMzE4IDkzIDE4NCAxMjUgMjM4IDI4MSA3MiAyNTkgMTAgMjIyIDE4NSAyNjIgCisxNjAgNTAgMjk1IDE1NSAxMjMgMTI3IDE1MyA0NSA5IDI3IDEyMSA4OSAzNSAyMzggODUgMTA3IDE2OSAxNjYgMzEgMzEwIDE2IDE4OCAKKzUzIDMwNyAxNjAgMTQ4IDExOCAyMDAgMjUgODMgMjkwIDE4OCAzMTQgMTY1IDExNSAyNDYgMTYyIDYzIDI0MSA5NyAxMTIgMTk0IDE1NyAKKzM4IDI1MCA5MCAxMzIgMTIwIDIxMyAyOTAgNjUgMjc5IDI1NSAyNzggMTE4IDM3IDMwIDE3MyA5NCA2MCAxODkgOTIgNDcgMjQzIDExMCAKKzU4IDE3NiAxNDYgMTA1IDI1NCA0MyA5NCAyMjMgMjI0IDIgMjQzIDEyIDIzNSAxMzEgMjQ0IDE0OSAxMTcgMjU5IDEwOCA0NSAyMzAgCisxNjQgNzYgMTg3IDc5IDEwMSAyNjEgMTA5IF4KKzY1NiAwIDMxMCAyMDggMTg5IDE0MyAxNDkgMzIgNTkgNDEgMTMwIDIwIDMxIDI0NSAxMjMgMiAxNTQgMTM1IDE2OCAyMTYgMzIgMTQgCisyODYgMjMxIDMxIDYyIDEwMiAyMTMgMzAzIDcgMjU3IDI0NCAyMiAxMTggMjYgMjY5IDI3MiAxMDUgOTEgNDQgMTgwIDI3IDk0IDIzMiAKKzE2NiAzMDEgMjMwIDc5IDE5OSA4NCAxNjQgMjQ4IDEyOCAyODggMjg0IDEzMyAyMDggMTcgMTk4IDI1OSAyMDQgMTg3IDI3MyAxMDIgMzAgCisyODIgMjE4IDg1IDExNiAxMTEgMTQ2IDE2IDE4IDI5OSAxNzcgMTEgODcgMTY5IDE3OSAyOTIgMjUyIDMgMjU1IDUzIDI5NiA4MiAyNDkgCisxMjUgMjI3IDIwMSAxNzEgMjY2IDM5IDc3IDI3MyAyNDAgOSAxNzIgNDYgMjc4IDIwNSAxMzkgMTM2IDg2IDc5IDE2IDYzIDU0IDc2IDU2IAorMzEyIDEyMyAzMTIgNzggMjM2IDE3OSAyNDcgMjEwIDEwNCAyNjYgODQgMTE5IDE3MiAyMjkgMjk5IDMxNSAzMTEgMjk4IDMxIDUxIDI2IAorMzE0IDMxNCAzOCA4MCAxMyAyIDI5MiAxMTQgMjQgNDQgMTkxIDEwMyAyNyAyMjEgMTM1IDEyMyAxNDAgOTkgMjUgMzE3IDU0IDEyMSA0MiAKKzI3NiAzMDEgOTIgMTM0IDIyIDI1NiA1IDE1OSAxMDAgMjk4IDE4MCA3MiAxNzAgMTMxIDE1NSAyNzAgNTIgMjMgMjE5IDIzMSA3NiAxMzggCisxIDIwMiAyNzIgMTUwIDE2NyAyNjQgMTY5IDMwIDIzNyAxNDIgMTg2IDEyNyAxNDIgMyA3MiAzMiAxNTIgMjY1IDg3IDIxNCAyNTUgMTkxIAorMjQxIDI5MyA3NyAyODQgMzE2IDIyOSAxNjEgMTUgMTAwIDExNSAxNTkgMjgzIDMxOSAzIDI0NCAyOTggNDIgOTMgMjgwIDMwMyAyODMgCisxODEgMjQgMzMgMTQ5IDIwNCA0IDI1MiAzMTMgMjEzIDEyMCAzMDcgMTEzIDEwNiAxODEgMjA3IDU0IDI1OSAyMSAxNjYgMTYzIDI1MSAKKzIyMyA1MCAyNDYgNzUgMTg2IDEzOCAxODQgMjIzIDYxIDEgOCAxNzUgMTA3IDYgMTY3IDgxIDExNCAyMDcgOTkgMTQgMjc1IDE1NSAxMzIgCis3MyAxMzMgNzAgNzIgMzA4IDExMCAxMSA5OCAyNDUgMTEyIDI4MSAyMjEgMTQ2IDE5OSA3MyA4OCAzMTUgMTM5IDMxOSAxNDEgMTg5IAorMTg4IDIyNSAyODYgNDggMTAgMjczIDI4NSA1MSA3MSAzNSAyNDcgMjcgNDkgMTU2IDIzMyAzMTIgMjYxIDI1NyAyODkgNjQgMTcgMTUgCisyMzggOTQgNDkgMTExIDE5MSA1OCAyNzIgMjg4IDE0NiAxNTQgMzE4IDE4OSA1IDE3MCAxNzYgMTk3IDE2OSA0MSAzMTMgNDEgMTc1IDk2IAorMjg1IDIzNCA5MiAxNDUgNjQgMTU1IDMxNSAxMjggMjQzIDIwOCAyMDAgMjE5IDQ4IDIxIDI4IDE4NCA0MCA0MCAxNzggMTU3IDQ3IDE5NiAKKzY4IDE1NyAxODUgMTc1IDI3OSAzMDYgMjMgMjY0IDMwNyAyOTYgMTI3IDQgMjQgMjE2IDE3MCAzMTQgMTc2IDU5IDIyNCAxNTEgMTMwIAorMjAzIDg2IDM0IDI5NSAxNjQgNjUgMTA3IDE3OCAxMTIgMjkyIDI5NyA3OSAxODggNDIgMjY1IDI1OSAxNTkgMTQ1IDE5IDExMyA2MSAKKzEzOSAyNzQgNjUgMjkwIDE5OSAyNTYgMTQzIDEwNCAzMTEgMTI2IDUyIDE2MSAxOTggMTIxIDIyNSAxMCA5MCAyMzAgMjYyIDI1NCAyMjggCisxNSA1NSAzOSAyNjAgMjk0IDI5IDE0NyAzMDAgMjc4IDIxNiAyMTUgMzUgNzUgNDggMTkzIDcgNzQgMjIzIDIzMyAyNjcgMTg1IDM3IAorMzAwIDk1IDE5NSA3MSAyMTggMjY4IDEzNyAyMjEgMzE4IDE0NCAyODQgMjcxIDE4NyAyMjggMjYgMTMxIDI5MyAyNDkgMjYzIDE3MiA5MSAKKzMyMCAxMDQgMTI4IDEwNSAyNjMgMjMgMzYgMjEwIDI4NyAxOTQgMjkxIDEzIDE0MCAyNzEgNCAyMDcgMjM3IDI4MCAxMzEgMTcgMjkxIAorMTYyIDE2MSA2MCAxNDIgMTQgMTQ4IDI1MiAxNDEgMjM0IDI2NCAxMjQgMjc1IDE3IDE1MyAyMTcgMzA1IDE5OCAzMDQgMjgwIDEyMCAKKzI2MiA3MSAxNzMgMTkyIDIzOCAyMzIgMjggMSAxOSAyNTEgNDAgMjkgMTM2IDI1OCA1OCAyMjcgMjQ2IDIxMyAxNjUgMjggNDYgOTUgCisxNTAgMjkgMzE5IDI3OSAxNjggNzggNTMgMTI0IDEzNyAzOCAyNjMgMzQgMTEyIDEwOSAyNzYgMjkwIDE2IDIwMSAzMyAyODcgMTQ5IAorMjE1IDgwIDE1MSAzMDIgMTgyIDI5NyAyMTcgMTMzIDI1MyA5MyA5NyAyNDggMTczIDkgMTgzIDEyMiAxNzcgMTk0IDEwOCAyNzkgMzAgCis5OSAxNjMgMjk2IDI2NSAyNzAgMjM1IDQ0IDggODIgMjA0IDQ5IDI5NCAyMTIgMjAyIDg5IDEyOSA1NyAxMjYgNyA4NSAyOTkgMTMyIAorMjU2IDE1NCAxODAgMjEwIDExNSAyMSAzMDQgMTA4IDE0MSA1MSAyMDkgMTQgMTAzIDE3NiAyNDIgMjQ1IDI5NSAzMDIgMTAgMzE4IDYgCiszMDUgNjAgNCA2OSAyNTggNjkgMzAzIDE0NSAyMDIgMTM0IDE3MSAyNzcgMTE1IDI5NyAyNjIgMjA5IDE1MiA4MiA2NiA3MCA4MyAyOSA5IAorNjcgNjcgMjIgMzAxIDQ3IDU4IDg5IDI2NyAyIDE2IDE5MCAyNzggMzMgMTYwIDI0NiAyNTggMjQxIDI4MiAzNSA2NCA2IDI2MCAxOCAKKzEwNSA4MCAyODkgMjQ3IDM4IDEyNSA1NSAyOTIgXgorPEQKKworSD5TSFMgVHlwZSAzIFN0cmluZ3M8SAorRD4KKzQ1IDAgMTQgNSAzIDEgNCAxNiAxMiAyMCAxIDYgMTUgMTEgMTggNCAxNyAxNiA2IDEwIDMgMiA5IDkgMTQgNiAyIDggNiA3IDEwIDE3IAorMTIgMjAgNiA3IDUgMTYgMSA0IDIgMTcgMTAgMTUgOCAyMCAxIF4KKzxECisKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zeXN0ZW1kLWFjdGl2YXRpb24vY29tLmV4YW1wbGUuUmVjZWl2ZURlbmllZC5zZXJ2aWNlIGIvdGVzdC9kYXRhL3N5c3RlbWQtYWN0aXZhdGlvbi9jb20uZXhhbXBsZS5SZWNlaXZlRGVuaWVkLnNlcnZpY2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ5NDRmNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9zeXN0ZW1kLWFjdGl2YXRpb24vY29tLmV4YW1wbGUuUmVjZWl2ZURlbmllZC5zZXJ2aWNlCkBAIC0wLDAgKzEsNCBAQAorW0QtQlVTIFNlcnZpY2VdCitOYW1lPWNvbS5leGFtcGxlLlJlY2VpdmVEZW5pZWQKK0V4ZWM9L2Jpbi9mYWxzZSBSZWNlaXZlRGVuaWVkCitTeXN0ZW1kU2VydmljZT1kYnVzLWNvbS5leGFtcGxlLlJlY2VpdmVEZW5pZWQuc2VydmljZQpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3N5c3RlbWQtYWN0aXZhdGlvbi9jb20uZXhhbXBsZS5SZWNlaXZlRGVuaWVkQnlBcHBBcm1vckxhYmVsLnNlcnZpY2UuaW4gYi90ZXN0L2RhdGEvc3lzdGVtZC1hY3RpdmF0aW9uL2NvbS5leGFtcGxlLlJlY2VpdmVEZW5pZWRCeUFwcEFybW9yTGFiZWwuc2VydmljZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTUyNTNlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL3N5c3RlbWQtYWN0aXZhdGlvbi9jb20uZXhhbXBsZS5SZWNlaXZlRGVuaWVkQnlBcHBBcm1vckxhYmVsLnNlcnZpY2UuaW4KQEAgLTAsMCArMSw1IEBACitbRC1CVVMgU2VydmljZV0KK05hbWU9Y29tLmV4YW1wbGUuUmVjZWl2ZURlbmllZEJ5QXBwQXJtb3JMYWJlbAorRXhlYz0vYmluL2ZhbHNlIFJlY2VpdmVEZW5pZWRCeUFwcEFybW9yTGFiZWwKK1N5c3RlbWRTZXJ2aWNlPWRidXMtY29tLmV4YW1wbGUuUmVjZWl2ZURlbmllZEJ5QXBwQXJtb3JMYWJlbC5zZXJ2aWNlCitBc3N1bWVkQXBwQXJtb3JMYWJlbD1AREJVU19URVNUX0VYRUNAL3Rlc3QtYXBwYXJtb3ItYWN0aXZhdGlvbi8vY29tLmV4YW1wbGUuUmVjZWl2ZURlbmllZEJ5QXBwQXJtb3JMYWJlbApkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3N5c3RlbWQtYWN0aXZhdGlvbi9jb20uZXhhbXBsZS5TZW5kRGVuaWVkLnNlcnZpY2UgYi90ZXN0L2RhdGEvc3lzdGVtZC1hY3RpdmF0aW9uL2NvbS5leGFtcGxlLlNlbmREZW5pZWQuc2VydmljZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTllYjc4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL3N5c3RlbWQtYWN0aXZhdGlvbi9jb20uZXhhbXBsZS5TZW5kRGVuaWVkLnNlcnZpY2UKQEAgLTAsMCArMSw0IEBACitbRC1CVVMgU2VydmljZV0KK05hbWU9Y29tLmV4YW1wbGUuU2VuZERlbmllZAorRXhlYz0vYmluL2ZhbHNlIFNlbmREZW5pZWQKK1N5c3RlbWRTZXJ2aWNlPWRidXMtY29tLmV4YW1wbGUuU2VuZERlbmllZC5zZXJ2aWNlCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvc3lzdGVtZC1hY3RpdmF0aW9uL2NvbS5leGFtcGxlLlNlbmREZW5pZWRCeUFwcEFybW9yTGFiZWwuc2VydmljZS5pbiBiL3Rlc3QvZGF0YS9zeXN0ZW1kLWFjdGl2YXRpb24vY29tLmV4YW1wbGUuU2VuZERlbmllZEJ5QXBwQXJtb3JMYWJlbC5zZXJ2aWNlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4MjUzMWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvc3lzdGVtZC1hY3RpdmF0aW9uL2NvbS5leGFtcGxlLlNlbmREZW5pZWRCeUFwcEFybW9yTGFiZWwuc2VydmljZS5pbgpAQCAtMCwwICsxLDUgQEAKK1tELUJVUyBTZXJ2aWNlXQorTmFtZT1jb20uZXhhbXBsZS5TZW5kRGVuaWVkQnlBcHBBcm1vckxhYmVsCitFeGVjPS9iaW4vZmFsc2UgU2VuZERlbmllZEJ5QXBwQXJtb3JMYWJlbAorU3lzdGVtZFNlcnZpY2U9ZGJ1cy1jb20uZXhhbXBsZS5TZW5kRGVuaWVkQnlBcHBBcm1vckxhYmVsLnNlcnZpY2UKK0Fzc3VtZWRBcHBBcm1vckxhYmVsPUBEQlVTX1RFU1RfRVhFQ0AvdGVzdC1hcHBhcm1vci1hY3RpdmF0aW9uLy9jb20uZXhhbXBsZS5TZW5kRGVuaWVkQnlBcHBBcm1vckxhYmVsCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvc3lzdGVtZC1hY3RpdmF0aW9uL2NvbS5leGFtcGxlLlNlbmREZW5pZWRCeUFwcEFybW9yTmFtZS5zZXJ2aWNlIGIvdGVzdC9kYXRhL3N5c3RlbWQtYWN0aXZhdGlvbi9jb20uZXhhbXBsZS5TZW5kRGVuaWVkQnlBcHBBcm1vck5hbWUuc2VydmljZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDc2NzRhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL3N5c3RlbWQtYWN0aXZhdGlvbi9jb20uZXhhbXBsZS5TZW5kRGVuaWVkQnlBcHBBcm1vck5hbWUuc2VydmljZQpAQCAtMCwwICsxLDQgQEAKK1tELUJVUyBTZXJ2aWNlXQorTmFtZT1jb20uZXhhbXBsZS5TZW5kRGVuaWVkQnlBcHBBcm1vck5hbWUKK0V4ZWM9L2Jpbi9mYWxzZSBTZW5kRGVuaWVkQnlBcHBBcm1vck5hbWUKK1N5c3RlbWRTZXJ2aWNlPWRidXMtY29tLmV4YW1wbGUuU2VuZERlbmllZEJ5QXBwQXJtb3JOYW1lLnNlcnZpY2UKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zeXN0ZW1kLWFjdGl2YXRpb24vY29tLmV4YW1wbGUuU2VuZERlbmllZEJ5Tm9uZXhpc3RlbnRBcHBBcm1vckxhYmVsLnNlcnZpY2UuaW4gYi90ZXN0L2RhdGEvc3lzdGVtZC1hY3RpdmF0aW9uL2NvbS5leGFtcGxlLlNlbmREZW5pZWRCeU5vbmV4aXN0ZW50QXBwQXJtb3JMYWJlbC5zZXJ2aWNlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmODQzYjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvc3lzdGVtZC1hY3RpdmF0aW9uL2NvbS5leGFtcGxlLlNlbmREZW5pZWRCeU5vbmV4aXN0ZW50QXBwQXJtb3JMYWJlbC5zZXJ2aWNlLmluCkBAIC0wLDAgKzEsNiBAQAorW0QtQlVTIFNlcnZpY2VdCitOYW1lPWNvbS5leGFtcGxlLlNlbmREZW5pZWRCeU5vbmV4aXN0ZW50QXBwQXJtb3JMYWJlbAorRXhlYz0vYmluL2ZhbHNlIFNlbmREZW5pZWRCeU5vbmV4aXN0ZW50QXBwQXJtb3JMYWJlbAorU3lzdGVtZFNlcnZpY2U9ZGJ1cy1jb20uZXhhbXBsZS5TZW5kRGVuaWVkQnlOb25leGlzdGVudEFwcEFybW9yTGFiZWwuc2VydmljZQorIyBUaGlzIGxhYmVsIGlzIG5vdCBkZWZpbmVkIGluIGFueSBBcHBBcm1vciBwcm9maWxlCitBc3N1bWVkQXBwQXJtb3JMYWJlbD1AREJVU19URVNUX0VYRUNAL3Rlc3QtYXBwYXJtb3ItYWN0aXZhdGlvbi1jb20uZXhhbXBsZS5TZW5kRGVuaWVkQnlOb25leGlzdGVudEFwcEFybW9yTGFiZWwKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zeXN0ZW1kLWFjdGl2YXRpb24vY29tLmV4YW1wbGUuU3lzdGVtZEFjdGl2YXRhYmxlMS5zZXJ2aWNlIGIvdGVzdC9kYXRhL3N5c3RlbWQtYWN0aXZhdGlvbi9jb20uZXhhbXBsZS5TeXN0ZW1kQWN0aXZhdGFibGUxLnNlcnZpY2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE1ZjAzOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9zeXN0ZW1kLWFjdGl2YXRpb24vY29tLmV4YW1wbGUuU3lzdGVtZEFjdGl2YXRhYmxlMS5zZXJ2aWNlCkBAIC0wLDAgKzEsNCBAQAorW0QtQlVTIFNlcnZpY2VdCitOYW1lPWNvbS5leGFtcGxlLlN5c3RlbWRBY3RpdmF0YWJsZTEKK0V4ZWM9L2Jpbi9mYWxzZSAxCitTeXN0ZW1kU2VydmljZT1kYnVzLWNvbS5leGFtcGxlLlN5c3RlbWRBY3RpdmF0YWJsZTEuc2VydmljZQpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3N5c3RlbWQtYWN0aXZhdGlvbi9jb20uZXhhbXBsZS5TeXN0ZW1kQWN0aXZhdGFibGUyLnNlcnZpY2UgYi90ZXN0L2RhdGEvc3lzdGVtZC1hY3RpdmF0aW9uL2NvbS5leGFtcGxlLlN5c3RlbWRBY3RpdmF0YWJsZTIuc2VydmljZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2VkZDczCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL3N5c3RlbWQtYWN0aXZhdGlvbi9jb20uZXhhbXBsZS5TeXN0ZW1kQWN0aXZhdGFibGUyLnNlcnZpY2UKQEAgLTAsMCArMSw0IEBACitbRC1CVVMgU2VydmljZV0KK05hbWU9Y29tLmV4YW1wbGUuU3lzdGVtZEFjdGl2YXRhYmxlMgorRXhlYz0vYmluL2ZhbHNlIDIKK1N5c3RlbWRTZXJ2aWNlPWRidXMtY29tLmV4YW1wbGUuU3lzdGVtZEFjdGl2YXRhYmxlMi5zZXJ2aWNlCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvc3lzdGVtZC1hY3RpdmF0aW9uL2NvbS5leGFtcGxlLlN5c3RlbWRBY3RpdmF0YWJsZTMuc2VydmljZS5pbiBiL3Rlc3QvZGF0YS9zeXN0ZW1kLWFjdGl2YXRpb24vY29tLmV4YW1wbGUuU3lzdGVtZEFjdGl2YXRhYmxlMy5zZXJ2aWNlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1MTgwNjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvc3lzdGVtZC1hY3RpdmF0aW9uL2NvbS5leGFtcGxlLlN5c3RlbWRBY3RpdmF0YWJsZTMuc2VydmljZS5pbgpAQCAtMCwwICsxLDcgQEAKK1tELUJVUyBTZXJ2aWNlXQorTmFtZT1jb20uZXhhbXBsZS5TeXN0ZW1kQWN0aXZhdGFibGUzCitFeGVjPS9iaW4vZmFsc2UgMworU3lzdGVtZFNlcnZpY2U9ZGJ1cy1jb20uZXhhbXBsZS5TeXN0ZW1kQWN0aXZhdGFibGUzLnNlcnZpY2UKKyMgVGhpcyBBcHBBcm1vciBsYWJlbCBkb2Vzbid0IGFjdHVhbGx5IGV4aXN0LCBidXQgdGhhdCdzIE9LIC0gbm90aGluZworIyBwcmV2ZW50cyB1cyBmcm9tIHNlbmRpbmcgbWVzc2FnZXMgdG8gaXQuCitBc3N1bWVkQXBwQXJtb3JMYWJlbD1AREJVU19URVNUX0VYRUNAL3Rlc3QtYXBwYXJtb3ItYWN0aXZhdGlvbi1jb20uZXhhbXBsZS5TeXN0ZW1kQWN0aXZhdGFibGUzCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvc3lzdGVtZC1hY3RpdmF0aW9uL29yZy5mcmVlZGVza3RvcC5zeXN0ZW1kMS5zZXJ2aWNlIGIvdGVzdC9kYXRhL3N5c3RlbWQtYWN0aXZhdGlvbi9vcmcuZnJlZWRlc2t0b3Auc3lzdGVtZDEuc2VydmljZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWE5MzExCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL3N5c3RlbWQtYWN0aXZhdGlvbi9vcmcuZnJlZWRlc2t0b3Auc3lzdGVtZDEuc2VydmljZQpAQCAtMCwwICsxLDMgQEAKK1tELUJVUyBTZXJ2aWNlXQorTmFtZT1vcmcuZnJlZWRlc2t0b3Auc3lzdGVtZDEKK0V4ZWM9L2Jpbi9mYWxzZQpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy1zeXN0ZW0vLmdpdGlnbm9yZSBiL3Rlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMtc3lzdGVtLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVlOTIxNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMtc3lzdGVtLy5naXRpZ25vcmUKQEAgLTAsMCArMSBAQAorKi5jb25mCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzLXN5c3RlbS9kZWJ1Zy1hbGxvdy1hbGwtZmFpbC5jb25mLmluIGIvdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy1zeXN0ZW0vZGVidWctYWxsb3ctYWxsLWZhaWwuY29uZi5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWIxNzhmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy1zeXN0ZW0vZGVidWctYWxsb3ctYWxsLWZhaWwuY29uZi5pbgpAQCAtMCwwICsxLDE3IEBACis8IS0tIEJ1cyB0aGF0IGxpc3RlbnMgb24gYSBkZWJ1ZyBwaXBlIGFuZCBkb2Vzbid0IGNyZWF0ZSBhbnkgcmVzdHJpY3Rpb25zIC0tPgorCis8IURPQ1RZUEUgYnVzY29uZmlnIFBVQkxJQyAiLS8vZnJlZWRlc2t0b3AvL0RURCBELUJVUyBCdXMgQ29uZmlndXJhdGlvbiAxLjAvL0VOIgorICJodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zdGFuZGFyZHMvZGJ1cy8xLjAvYnVzY29uZmlnLmR0ZCI+Cis8YnVzY29uZmlnPgorICA8bGlzdGVuPmRlYnVnLXBpcGU6bmFtZT10ZXN0LXNlcnZlcjwvbGlzdGVuPgorICA8bGlzdGVuPkBURVNUX0xJU1RFTkA8L2xpc3Rlbj4KKyAgPHR5cGU+c3lzdGVtPC90eXBlPgorICA8c2VydmljZWhlbHBlcj5AVEVTVF9MQVVOQ0hfSEVMUEVSX0JJTkFSWUA8L3NlcnZpY2VoZWxwZXI+CisgIDxzZXJ2aWNlZGlyPkBEQlVTX1RFU1RfREFUQUAvaW52YWxpZC1zZXJ2aWNlLWZpbGVzLXN5c3RlbTwvc2VydmljZWRpcj4KKyAgPHBvbGljeSBjb250ZXh0PSJkZWZhdWx0Ij4KKyAgICA8YWxsb3cgc2VuZF9pbnRlcmZhY2U9IioiLz4KKyAgICA8YWxsb3cgcmVjZWl2ZV9pbnRlcmZhY2U9IioiLz4KKyAgICA8YWxsb3cgb3duPSIqIi8+CisgICAgPGFsbG93IHVzZXI9IioiLz4KKyAgPC9wb2xpY3k+Cis8L2J1c2NvbmZpZz4KZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMtc3lzdGVtL2RlYnVnLWFsbG93LWFsbC1wYXNzLmNvbmYuaW4gYi90ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzLXN5c3RlbS9kZWJ1Zy1hbGxvdy1hbGwtcGFzcy5jb25mLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4MzY2NzMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzLXN5c3RlbS9kZWJ1Zy1hbGxvdy1hbGwtcGFzcy5jb25mLmluCkBAIC0wLDAgKzEsMTcgQEAKKzwhLS0gQnVzIHRoYXQgbGlzdGVucyBvbiBhIGRlYnVnIHBpcGUgYW5kIGRvZXNuJ3QgY3JlYXRlIGFueSByZXN0cmljdGlvbnMgLS0+CisKKzwhRE9DVFlQRSBidXNjb25maWcgUFVCTElDICItLy9mcmVlZGVza3RvcC8vRFREIEQtQlVTIEJ1cyBDb25maWd1cmF0aW9uIDEuMC8vRU4iCisgImh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3N0YW5kYXJkcy9kYnVzLzEuMC9idXNjb25maWcuZHRkIj4KKzxidXNjb25maWc+CisgIDxsaXN0ZW4+ZGVidWctcGlwZTpuYW1lPXRlc3Qtc2VydmVyPC9saXN0ZW4+CisgIDxsaXN0ZW4+QFRFU1RfTElTVEVOQDwvbGlzdGVuPgorICA8dHlwZT5zeXN0ZW08L3R5cGU+CisgIDxzZXJ2aWNlaGVscGVyPkBURVNUX0xBVU5DSF9IRUxQRVJfQklOQVJZQDwvc2VydmljZWhlbHBlcj4KKyAgPHNlcnZpY2VkaXI+QERCVVNfVEVTVF9EQVRBQC92YWxpZC1zZXJ2aWNlLWZpbGVzLXN5c3RlbTwvc2VydmljZWRpcj4KKyAgPHBvbGljeSBjb250ZXh0PSJkZWZhdWx0Ij4KKyAgICA8YWxsb3cgc2VuZF9pbnRlcmZhY2U9IioiLz4KKyAgICA8YWxsb3cgcmVjZWl2ZV9pbnRlcmZhY2U9IioiLz4KKyAgICA8YWxsb3cgb3duPSIqIi8+CisgICAgPGFsbG93IHVzZXI9IioiLz4KKyAgPC9wb2xpY3k+Cis8L2J1c2NvbmZpZz4KZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMvLmdpdGlnbm9yZSBiL3Rlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjkyOTA5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsNiBAQAorZGVidWctYWxsb3ctYWxsLmNvbmYKK2RlYnVnLWFsbG93LWFsbC1zaGExLmNvbmYKK2luY29taW5nLWxpbWl0LmNvbmYKK3Nlc3Npb24uY29uZgorcnVuLXdpdGgtdG1wLXNlc3Npb24tYnVzLmNvbmYKK2Zpbml0ZS10aW1lb3V0LmNvbmYKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMvYXMtYW5vdGhlci11c2VyLmNvbmYuaW4gYi90ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzL2FzLWFub3RoZXItdXNlci5jb25mLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5ZDAwYzgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzL2FzLWFub3RoZXItdXNlci5jb25mLmluCkBAIC0wLDAgKzEsMjggQEAKKzwhLS0KK0NvbmZpZ3VyYXRpb24gc2ltaWxhciB0byB0aGUgc3lzdGVtIGJ1cywgdG8gYmUgdXNlZCB3aGVuIHRlc3RpbmcgcmxpbWl0CitoYW5kbGluZy4KKy0tPgorCis8IURPQ1RZUEUgYnVzY29uZmlnIFBVQkxJQyAiLS8vZnJlZWRlc2t0b3AvL0RURCBELUJ1cyBCdXMgQ29uZmlndXJhdGlvbiAxLjAvL0VOIgorICJodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zdGFuZGFyZHMvZGJ1cy8xLjAvYnVzY29uZmlnLmR0ZCI+Cis8YnVzY29uZmlnPgorICA8dHlwZT5zeXN0ZW08L3R5cGU+CisgIDx1c2VyPkBEQlVTX1VTRVJAPC91c2VyPgorICA8YXV0aD5FWFRFUk5BTDwvYXV0aD4KKworICA8IS0tIFRoaXMgaXMgbm90IHRoZSBzYW1lIGFzIHRoZSByZWFsIHN5c3RlbSBidXM6IHdlIGRvbid0IHdhbnQgdG8gY29sbGlkZSAtLT4KKyAgPGxpc3Rlbj5AVEVTVF9MSVNURU5APC9saXN0ZW4+CisKKyAgPHBvbGljeSBjb250ZXh0PSJkZWZhdWx0Ij4KKyAgICA8YWxsb3cgdXNlcj0iKiIvPgorICAgIDxkZW55IG93bj0iKiIvPgorICAgIDxkZW55IHNlbmRfdHlwZT0ibWV0aG9kX2NhbGwiLz4KKyAgICA8YWxsb3cgc2VuZF90eXBlPSJzaWduYWwiLz4KKyAgICA8YWxsb3cgc2VuZF9yZXF1ZXN0ZWRfcmVwbHk9InRydWUiIHNlbmRfdHlwZT0ibWV0aG9kX3JldHVybiIvPgorICAgIDxhbGxvdyBzZW5kX3JlcXVlc3RlZF9yZXBseT0idHJ1ZSIgc2VuZF90eXBlPSJlcnJvciIvPgorICAgIDxhbGxvdyByZWNlaXZlX3R5cGU9Im1ldGhvZF9jYWxsIi8+CisgICAgPGFsbG93IHJlY2VpdmVfdHlwZT0ibWV0aG9kX3JldHVybiIvPgorICAgIDxhbGxvdyByZWNlaXZlX3R5cGU9ImVycm9yIi8+CisgICAgPGFsbG93IHJlY2VpdmVfdHlwZT0ic2lnbmFsIi8+CisgIDwvcG9saWN5PgorPC9idXNjb25maWc+CmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzL2Jhc2ljLmNvbmYgYi90ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzL2Jhc2ljLmNvbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI5NzA5NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMvYmFzaWMuY29uZgpAQCAtMCwwICsxLDMyIEBACis8IURPQ1RZUEUgYnVzY29uZmlnIFBVQkxJQyAiLS8vZnJlZWRlc2t0b3AvL0RURCBELUJVUyBCdXMgQ29uZmlndXJhdGlvbiAxLjAvL0VOIgorICJodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zdGFuZGFyZHMvZGJ1cy8xLjAvYnVzY29uZmlnLmR0ZCI+Cis8YnVzY29uZmlnPgorICA8dXNlcj5teWJ1c3VzZXI8L3VzZXI+CisgIDxsaXN0ZW4+dW5peDpwYXRoPS9mb28vYmFyPC9saXN0ZW4+CisgIDxsaXN0ZW4+dGNwOnBvcnQ9MTIzNDwvbGlzdGVuPgorICA8aW5jbHVkZWRpcj5iYXNpYy5kPC9pbmNsdWRlZGlyPgorICA8c2VydmljZWRpcj4vdXNyL3NoYXJlL2Zvbzwvc2VydmljZWRpcj4KKyAgPGluY2x1ZGUgaWdub3JlX21pc3Npbmc9InllcyI+bm9uZXhpc3RlbnQuY29uZjwvaW5jbHVkZT4KKyAgPHBvbGljeSBjb250ZXh0PSJkZWZhdWx0Ij4KKyAgICA8YWxsb3cgdXNlcj0iKiIvPgorICA8L3BvbGljeT4KKworICA8bGltaXQgbmFtZT0ibWF4X2luY29taW5nX2J5dGVzIj41MDAwPC9saW1pdD4gICAKKyAgPGxpbWl0IG5hbWU9Im1heF9vdXRnb2luZ19ieXRlcyI+NTAwMDwvbGltaXQ+CisgIDxsaW1pdCBuYW1lPSJtYXhfbWVzc2FnZV9zaXplIj4zMDA8L2xpbWl0PgorICA8bGltaXQgbmFtZT0ic2VydmljZV9zdGFydF90aW1lb3V0Ij41MDAwPC9saW1pdD4KKyAgPGxpbWl0IG5hbWU9ImF1dGhfdGltZW91dCI+NjAwMDwvbGltaXQ+CisgIDxsaW1pdCBuYW1lPSJtYXhfY29tcGxldGVkX2Nvbm5lY3Rpb25zIj41MDwvbGltaXQ+ICAKKyAgPGxpbWl0IG5hbWU9Im1heF9pbmNvbXBsZXRlX2Nvbm5lY3Rpb25zIj44MDwvbGltaXQ+CisgIDxsaW1pdCBuYW1lPSJtYXhfY29ubmVjdGlvbnNfcGVyX3VzZXIiPjY0PC9saW1pdD4KKyAgPGxpbWl0IG5hbWU9Im1heF9wZW5kaW5nX3NlcnZpY2Vfc3RhcnRzIj42NDwvbGltaXQ+CisgIDxsaW1pdCBuYW1lPSJtYXhfbmFtZXNfcGVyX2Nvbm5lY3Rpb24iPjI1NjwvbGltaXQ+CisKKyAgPHNlbGludXg+CisgICAgICAgIDxhc3NvY2lhdGUgb3duPSJvcmcuZnJlZWRlc2t0b3AuRnJvYmF0aW9uYXJ5TWVhc3VyZXMiCisgICAgICAgICBjb250ZXh0PSJteV9zZWxpbnV4X2NvbnRleHRfdCIvPgorICAgICAgICA8YXNzb2NpYXRlIG93bj0ib3JnLmZyZWVkZXNrdG9wLkJsYWhCbGFoQmxhaCIKKyAgICAgICAgIGNvbnRleHQ9ImZvb190Ii8+CisgIDwvc2VsaW51eD4KKworPC9idXNjb25maWc+CmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzL2Jhc2ljLmQvYmFzaWMuY29uZiBiL3Rlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMvYmFzaWMuZC9iYXNpYy5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMDlkNzEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzL2Jhc2ljLmQvYmFzaWMuY29uZgpAQCAtMCwwICsxLDEzIEBACis8IURPQ1RZUEUgYnVzY29uZmlnIFBVQkxJQyAiLS8vZnJlZWRlc2t0b3AvL0RURCBELUJVUyBCdXMgQ29uZmlndXJhdGlvbiAxLjAvL0VOIgorICJodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zdGFuZGFyZHMvZGJ1cy8xLjAvYnVzY29uZmlnLmR0ZCI+Cis8YnVzY29uZmlnPgorICA8dXNlcj5teWJ1c3VzZXI8L3VzZXI+CisgIDxsaXN0ZW4+dW5peDpwYXRoPS9mb28vYmFyPC9saXN0ZW4+CisgIDxsaXN0ZW4+dGNwOnBvcnQ9MTIzNDwvbGlzdGVuPgorICA8aW5jbHVkZWRpcj5iYXNpYy5kPC9pbmNsdWRlZGlyPgorICA8c2VydmljZWRpcj4vdXNyL3NoYXJlL2Zvbzwvc2VydmljZWRpcj4KKyAgPGluY2x1ZGUgaWdub3JlX21pc3Npbmc9InllcyI+bm9uZXhpc3RlbnQuY29uZjwvaW5jbHVkZT4KKyAgPHBvbGljeSBjb250ZXh0PSJkZWZhdWx0Ij4KKyAgICA8YWxsb3cgdXNlcj0iKiIvPgorICA8L3BvbGljeT4KKzwvYnVzY29uZmlnPgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9jaGVjay1vd24tcnVsZXMuY29uZiBiL3Rlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMvY2hlY2stb3duLXJ1bGVzLmNvbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmMyZjQxNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMvY2hlY2stb3duLXJ1bGVzLmNvbmYKQEAgLTAsMCArMSwxNCBAQAorPCFET0NUWVBFIGJ1c2NvbmZpZyBQVUJMSUMgIi0vL2ZyZWVkZXNrdG9wLy9EVEQgRC1CVVMgQnVzIENvbmZpZ3VyYXRpb24gMS4wLy9FTiIKKyAiaHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc3RhbmRhcmRzL2RidXMvMS4wL2J1c2NvbmZpZy5kdGQiPgorPGJ1c2NvbmZpZz4KKyAgPHVzZXI+bXlidXN1c2VyPC91c2VyPgorICA8bGlzdGVuPnVuaXg6cGF0aD0vZm9vL2JhcjwvbGlzdGVuPgorICA8bGlzdGVuPnRjcDpwb3J0PTEyMzQ8L2xpc3Rlbj4KKyAgPHNlcnZpY2VkaXI+L3Vzci9zaGFyZS9mb288L3NlcnZpY2VkaXI+CisgIDxwb2xpY3kgY29udGV4dD0iZGVmYXVsdCI+CisgICAgPGFsbG93IHVzZXI9IioiLz4KKyAgICA8ZGVueSBvd249IioiLz4KKyAgICA8YWxsb3cgb3duX3ByZWZpeD0ib3JnLmZyZWVkZXNrdG9wLk1hbnlTeXN0ZW1zIi8+CisgIDwvcG9saWN5PgorCis8L2J1c2NvbmZpZz4KZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMvY291bnQtZmRzLmNvbmYuaW4gYi90ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzL2NvdW50LWZkcy5jb25mLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5YWUzZWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzL2NvdW50LWZkcy5jb25mLmluCkBAIC0wLDAgKzEsMjIgQEAKKzwhRE9DVFlQRSBidXNjb25maWcgUFVCTElDICItLy9mcmVlZGVza3RvcC8vRFREIEQtQnVzIEJ1cyBDb25maWd1cmF0aW9uIDEuMC8vRU4iCisgImh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3N0YW5kYXJkcy9kYnVzLzEuMC9idXNjb25maWcuZHRkIj4KKzxidXNjb25maWc+CisgIDwhLS0gT3VyIHdlbGwta25vd24gYnVzIHR5cGUsIGRvbid0IGNoYW5nZSB0aGlzIC0tPgorICA8dHlwZT5zZXNzaW9uPC90eXBlPgorICA8bGlzdGVuPkBURVNUX0xJU1RFTkA8L2xpc3Rlbj4KKworICA8cG9saWN5IGNvbnRleHQ9ImRlZmF1bHQiPgorICAgIDwhLS0gQWxsb3cgZXZlcnl0aGluZyB0byBiZSBzZW50IC0tPgorICAgIDxhbGxvdyBzZW5kX2Rlc3RpbmF0aW9uPSIqIiBlYXZlc2Ryb3A9InRydWUiLz4KKyAgICA8IS0tIEFsbG93IGV2ZXJ5dGhpbmcgdG8gYmUgcmVjZWl2ZWQgLS0+CisgICAgPGFsbG93IGVhdmVzZHJvcD0idHJ1ZSIvPgorICAgIDwhLS0gQWxsb3cgYW55b25lIHRvIG93biBhbnl0aGluZyAtLT4KKyAgICA8YWxsb3cgb3duPSIqIi8+CisgICAgPCEtLSBFeGVyY2lzZSBydWxlcyB0aGF0IG1hdGNoIG9uIG51bWJlcnMgb2YgZmRzIC0tPgorICAgIDxkZW55IHNlbmRfcGF0aD0iL3Rlc3QvRGVueVNlbmRNYXgyIiBtYXhfZmRzPSIyIi8+CisgICAgPGRlbnkgcmVjZWl2ZV9wYXRoPSIvdGVzdC9EZW55UmVjZWl2ZU1heDMiIG1heF9mZHM9IjMiLz4KKyAgICA8ZGVueSBzZW5kX3BhdGg9Ii90ZXN0L0RlbnlTZW5kTWluNCIgbWluX2Zkcz0iNCIvPgorICAgIDxkZW55IHJlY2VpdmVfcGF0aD0iL3Rlc3QvRGVueVJlY2VpdmVNaW41IiBtaW5fZmRzPSI1Ii8+CisgIDwvcG9saWN5PgorCis8L2J1c2NvbmZpZz4KZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMvZGVidWctYWxsb3ctYWxsLXNoYTEuY29uZi5pbiBiL3Rlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMvZGVidWctYWxsb3ctYWxsLXNoYTEuY29uZi5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmFlZTdkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9kZWJ1Zy1hbGxvdy1hbGwtc2hhMS5jb25mLmluCkBAIC0wLDAgKzEsMTYgQEAKKzwhLS0gQnVzIHRoYXQgbGlzdGVucyBvbiBhIGRlYnVnIHBpcGUgYW5kIHJlcXVpcmVzIFNIQTEgYXV0aCwgdXNlZCB0byB0ZXN0IFNIQTEgLS0+CisKKzwhRE9DVFlQRSBidXNjb25maWcgUFVCTElDICItLy9mcmVlZGVza3RvcC8vRFREIEQtQlVTIEJ1cyBDb25maWd1cmF0aW9uIDEuMC8vRU4iCisgImh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3N0YW5kYXJkcy9kYnVzLzEuMC9idXNjb25maWcuZHRkIj4KKzxidXNjb25maWc+CisgIDxsaXN0ZW4+ZGVidWctcGlwZTpuYW1lPXRlc3Qtc2VydmVyPC9saXN0ZW4+CisgIDxsaXN0ZW4+QFRFU1RfTElTVEVOQDwvbGlzdGVuPgorICA8c2VydmljZWRpcj5AREJVU19URVNUX0RBVEFAL3ZhbGlkLXNlcnZpY2UtZmlsZXM8L3NlcnZpY2VkaXI+CisgIDxhdXRoPkRCVVNfQ09PS0lFX1NIQTE8L2F1dGg+CisgIDxwb2xpY3kgY29udGV4dD0iZGVmYXVsdCI+CisgICAgPGFsbG93IHNlbmRfaW50ZXJmYWNlPSIqIi8+CisgICAgPGFsbG93IHJlY2VpdmVfaW50ZXJmYWNlPSIqIi8+CisgICAgPGFsbG93IG93bj0iKiIvPgorICAgIDxhbGxvdyB1c2VyPSIqIi8+CisgIDwvcG9saWN5PgorPC9idXNjb25maWc+CmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzL2RlYnVnLWFsbG93LWFsbC5jb25mLmluIGIvdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9kZWJ1Zy1hbGxvdy1hbGwuY29uZi5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGRmMjBkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9kZWJ1Zy1hbGxvdy1hbGwuY29uZi5pbgpAQCAtMCwwICsxLDE1IEBACis8IS0tIEJ1cyB0aGF0IGxpc3RlbnMgb24gYSBkZWJ1ZyBwaXBlIGFuZCBkb2Vzbid0IGNyZWF0ZSBhbnkgcmVzdHJpY3Rpb25zIC0tPgorCis8IURPQ1RZUEUgYnVzY29uZmlnIFBVQkxJQyAiLS8vZnJlZWRlc2t0b3AvL0RURCBELUJVUyBCdXMgQ29uZmlndXJhdGlvbiAxLjAvL0VOIgorICJodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zdGFuZGFyZHMvZGJ1cy8xLjAvYnVzY29uZmlnLmR0ZCI+Cis8YnVzY29uZmlnPgorICA8bGlzdGVuPmRlYnVnLXBpcGU6bmFtZT10ZXN0LXNlcnZlcjwvbGlzdGVuPgorICA8bGlzdGVuPkBURVNUX0xJU1RFTkA8L2xpc3Rlbj4KKyAgPHNlcnZpY2VkaXI+QERCVVNfVEVTVF9EQVRBQC92YWxpZC1zZXJ2aWNlLWZpbGVzPC9zZXJ2aWNlZGlyPgorICA8cG9saWN5IGNvbnRleHQ9ImRlZmF1bHQiPgorICAgIDxhbGxvdyBzZW5kX2ludGVyZmFjZT0iKiIvPgorICAgIDxhbGxvdyByZWNlaXZlX2ludGVyZmFjZT0iKiIvPgorICAgIDxhbGxvdyBvd249IioiLz4KKyAgICA8YWxsb3cgdXNlcj0iKiIvPgorICA8L3BvbGljeT4KKzwvYnVzY29uZmlnPgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9lbnRpdGllcy5jb25mIGIvdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9lbnRpdGllcy5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkM2NlYTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzL2VudGl0aWVzLmNvbmYKQEAgLTAsMCArMSwxNCBAQAorPCEtLSBUaGlzIGNvbmZpZyBmaWxlIGNvbnRhaW5zIFhNTCBlbnRpdGllcyAtLT4KKzwhRE9DVFlQRSBidXNjb25maWcgUFVCTElDICItLy9mcmVlZGVza3RvcC8vRFREIEQtQlVTIEJ1cyBDb25maWd1cmF0aW9uIDEuMC8vRU4iCisgImh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3N0YW5kYXJkcy9kYnVzLzEuMC9idXNjb25maWcuZHRkIj4KKzxidXNjb25maWc+CisgIDx1c2VyPm15YnVzdXNlcjwvdXNlcj4KKyAgPGxpc3Rlbj51bml4OnBhdGg9L2Zvby8mbHQ7YmFyJmd0OzwvbGlzdGVuPgorICA8bGlzdGVuPnRjcDpwb3J0PTEyMzQ8L2xpc3Rlbj4KKyAgPGluY2x1ZGVkaXI+YmFzaWMuJiMxMDA7PC9pbmNsdWRlZGlyPgorICA8c2VydmljZWRpcj4vdXNyLyZhbXA7c2hhcmUvZm9vPC9zZXJ2aWNlZGlyPgorICA8aW5jbHVkZSBpZ25vcmVfbWlzc2luZz0ieWUmIzExNTsiPm5vbmV4aXN0ZW50LmNvbmYmIzExMDs8L2luY2x1ZGU+CisgIDxwb2xpY3kgY29udGV4dD0iJiMxMDA7ZWZhdWx0Ij4KKyAgICA8YWxsb3cgdXNlcj0iKiIvPgorICA8L3BvbGljeT4KKzwvYnVzY29uZmlnPgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9maW5pdGUtdGltZW91dC5jb25mLmluIGIvdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9maW5pdGUtdGltZW91dC5jb25mLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkMjZkNzEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzL2Zpbml0ZS10aW1lb3V0LmNvbmYuaW4KQEAgLTAsMCArMSwxOSBAQAorPCFET0NUWVBFIGJ1c2NvbmZpZyBQVUJMSUMgIi0vL2ZyZWVkZXNrdG9wLy9EVEQgRC1CdXMgQnVzIENvbmZpZ3VyYXRpb24gMS4wLy9FTiIKKyAiaHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc3RhbmRhcmRzL2RidXMvMS4wL2J1c2NvbmZpZy5kdGQiPgorPGJ1c2NvbmZpZz4KKyAgPCEtLSBPdXIgd2VsbC1rbm93biBidXMgdHlwZSwgZG9uJ3QgY2hhbmdlIHRoaXMgLS0+CisgIDx0eXBlPnNlc3Npb248L3R5cGU+CisgIDxsaXN0ZW4+QFRFU1RfTElTVEVOQDwvbGlzdGVuPgorCisgIDxwb2xpY3kgY29udGV4dD0iZGVmYXVsdCI+CisgICAgPCEtLSBBbGxvdyBldmVyeXRoaW5nIHRvIGJlIHNlbnQgLS0+CisgICAgPGFsbG93IHNlbmRfZGVzdGluYXRpb249IioiIGVhdmVzZHJvcD0idHJ1ZSIvPgorICAgIDwhLS0gQWxsb3cgZXZlcnl0aGluZyB0byBiZSByZWNlaXZlZCAtLT4KKyAgICA8YWxsb3cgZWF2ZXNkcm9wPSJ0cnVlIi8+CisgICAgPCEtLSBBbGxvdyBhbnlvbmUgdG8gb3duIGFueXRoaW5nIC0tPgorICAgIDxhbGxvdyBvd249IioiLz4KKyAgPC9wb2xpY3k+CisKKyAgPCEtLSBGb3JjaWJseSB0aW1lIG91dCBtZXRob2QgY2FsbHMgYWZ0ZXIgMTAwbXMgLS0+CisgIDxsaW1pdCBuYW1lPSJyZXBseV90aW1lb3V0Ij4xMDA8L2xpbWl0PgorPC9idXNjb25maWc+CmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzL2ZvcmJpZGRpbmcuY29uZi5pbiBiL3Rlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMvZm9yYmlkZGluZy5jb25mLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxNDU2MTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzL2ZvcmJpZGRpbmcuY29uZi5pbgpAQCAtMCwwICsxLDI4IEBACis8IURPQ1RZUEUgYnVzY29uZmlnIFBVQkxJQyAiLS8vZnJlZWRlc2t0b3AvL0RURCBELUJ1cyBCdXMgQ29uZmlndXJhdGlvbiAxLjAvL0VOIgorICJodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zdGFuZGFyZHMvZGJ1cy8xLjAvYnVzY29uZmlnLmR0ZCI+Cis8YnVzY29uZmlnPgorICA8IS0tIE91ciB3ZWxsLWtub3duIGJ1cyB0eXBlLCBkb24ndCBjaGFuZ2UgdGhpcyAtLT4KKyAgPHR5cGU+c2Vzc2lvbjwvdHlwZT4KKyAgPGxpc3Rlbj5AVEVTVF9MSVNURU5APC9saXN0ZW4+CisKKyAgPHBvbGljeSBjb250ZXh0PSJkZWZhdWx0Ij4KKyAgICA8IS0tIEFsbG93IGV2ZXJ5dGhpbmcgLS0+CisgICAgPGFsbG93IHNlbmRfZGVzdGluYXRpb249IioiLz4KKyAgICA8YWxsb3cgcmVjZWl2ZV9zZW5kZXI9IioiLz4KKyAgICA8YWxsb3cgb3duPSIqIi8+CisKKyAgICA8IS0tIEV4Y2VwdGlvbjogc29tZSBtZXNzYWdlcyBhcmUgZm9yYmlkZGVuIC0tPgorICAgIDxkZW55IHNlbmRfaW50ZXJmYWNlPSJjb20uZXhhbXBsZS5DYW5ub3RTZW5kIi8+CisKKyAgICA8ZGVueSBzZW5kX2ludGVyZmFjZT0iY29tLmV4YW1wbGUuQ2Fubm90QnJvYWRjYXN0IiBzZW5kX2Jyb2FkY2FzdD0idHJ1ZSIvPgorICAgIDxkZW55IHNlbmRfaW50ZXJmYWNlPSJjb20uZXhhbXBsZS5DYW5ub3RVbmljYXN0IiBzZW5kX2Jyb2FkY2FzdD0iZmFsc2UiLz4KKworICAgIDwhLS0gQSBtb3JlIGxvbmctd2luZGVkIHdheSB0byBzcGVsbCB0aGUgc2FtZSB0aGluZ3MuIC0tPgorICAgIDxkZW55IHNlbmRfaW50ZXJmYWNlPSJjb20uZXhhbXBsZS5DYW5ub3RCcm9hZGNhc3QyIi8+CisgICAgPGFsbG93IHNlbmRfaW50ZXJmYWNlPSJjb20uZXhhbXBsZS5DYW5ub3RCcm9hZGNhc3QyIiBzZW5kX2Jyb2FkY2FzdD0iZmFsc2UiLz4KKyAgICA8ZGVueSBzZW5kX2ludGVyZmFjZT0iY29tLmV4YW1wbGUuQ2Fubm90VW5pY2FzdDIiLz4KKyAgICA8YWxsb3cgc2VuZF9pbnRlcmZhY2U9ImNvbS5leGFtcGxlLkNhbm5vdFVuaWNhc3QyIiBzZW5kX2Jyb2FkY2FzdD0idHJ1ZSIvPgorCisgICAgPGRlbnkgcmVjZWl2ZV9pbnRlcmZhY2U9ImNvbS5leGFtcGxlLkNhbm5vdFJlY2VpdmUiLz4KKyAgPC9wb2xpY3k+Cis8L2J1c2NvbmZpZz4KZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMvaW5jb21pbmctbGltaXQuY29uZi5pbiBiL3Rlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMvaW5jb21pbmctbGltaXQuY29uZi5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDgxMzQ0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9pbmNvbWluZy1saW1pdC5jb25mLmluCkBAIC0wLDAgKzEsMjEgQEAKKzwhRE9DVFlQRSBidXNjb25maWcgUFVCTElDICItLy9mcmVlZGVza3RvcC8vRFREIEQtQnVzIEJ1cyBDb25maWd1cmF0aW9uIDEuMC8vRU4iCisgImh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3N0YW5kYXJkcy9kYnVzLzEuMC9idXNjb25maWcuZHRkIj4KKzxidXNjb25maWc+CisgIDwhLS0gT3VyIHdlbGwta25vd24gYnVzIHR5cGUsIGRvbid0IGNoYW5nZSB0aGlzIC0tPgorICA8dHlwZT5zZXNzaW9uPC90eXBlPgorICA8bGlzdGVuPkBURVNUX0xJU1RFTkA8L2xpc3Rlbj4KKworICA8cG9saWN5IGNvbnRleHQ9ImRlZmF1bHQiPgorICAgIDwhLS0gQWxsb3cgZXZlcnl0aGluZyB0byBiZSBzZW50IC0tPgorICAgIDxhbGxvdyBzZW5kX2Rlc3RpbmF0aW9uPSIqIiBlYXZlc2Ryb3A9InRydWUiLz4KKyAgICA8IS0tIEFsbG93IGV2ZXJ5dGhpbmcgdG8gYmUgcmVjZWl2ZWQgLS0+CisgICAgPGFsbG93IGVhdmVzZHJvcD0idHJ1ZSIvPgorICAgIDwhLS0gQWxsb3cgYW55b25lIHRvIG93biBhbnl0aGluZyAtLT4KKyAgICA8YWxsb3cgb3duPSIqIi8+CisgIDwvcG9saWN5PgorCisgIDxsaW1pdCBuYW1lPSJtYXhfaW5jb21pbmdfYnl0ZXMiPjE8L2xpbWl0PgorCisgIDwhLS0gQXZvaWQgcmVhY2hpbmcgdGhpcyBsaW1pdCAtLT4KKyAgPGxpbWl0IG5hbWU9Im1heF9yZXBsaWVzX3Blcl9jb25uZWN0aW9uIj4xMDAwMDAwPC9saW1pdD4KKzwvYnVzY29uZmlnPgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9saXN0ZW4tdW5peC1ydW50aW1lLmNvbmYgYi90ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzL2xpc3Rlbi11bml4LXJ1bnRpbWUuY29uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjlkZTJjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9saXN0ZW4tdW5peC1ydW50aW1lLmNvbmYKQEAgLTAsMCArMSwxMSBAQAorPCFET0NUWVBFIGJ1c2NvbmZpZyBQVUJMSUMgIi0vL2ZyZWVkZXNrdG9wLy9EVEQgRC1CdXMgQnVzIENvbmZpZ3VyYXRpb24gMS4wLy9FTiIKKyAiaHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc3RhbmRhcmRzL2RidXMvMS4wL2J1c2NvbmZpZy5kdGQiPgorPGJ1c2NvbmZpZz4KKyAgPHR5cGU+c2Vzc2lvbjwvdHlwZT4KKyAgPGxpc3Rlbj51bml4OnJ1bnRpbWU9eWVzPC9saXN0ZW4+CisgIDxwb2xpY3kgY29udGV4dD0iZGVmYXVsdCI+CisgICAgPGFsbG93IHNlbmRfZGVzdGluYXRpb249IioiIGVhdmVzZHJvcD0idHJ1ZSIvPgorICAgIDxhbGxvdyBlYXZlc2Ryb3A9InRydWUiLz4KKyAgICA8YWxsb3cgb3duPSIqIi8+CisgIDwvcG9saWN5PgorPC9idXNjb25maWc+CmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzL21hbnktcnVsZXMuY29uZiBiL3Rlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMvbWFueS1ydWxlcy5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmOWE5OTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzL21hbnktcnVsZXMuY29uZgpAQCAtMCwwICsxLDU3IEBACis8IURPQ1RZUEUgYnVzY29uZmlnIFBVQkxJQyAiLS8vZnJlZWRlc2t0b3AvL0RURCBELUJVUyBCdXMgQ29uZmlndXJhdGlvbiAxLjAvL0VOIgorICJodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zdGFuZGFyZHMvZGJ1cy8xLjAvYnVzY29uZmlnLmR0ZCI+Cis8YnVzY29uZmlnPgorICA8dXNlcj5teWJ1c3VzZXI8L3VzZXI+CisgIDxsaXN0ZW4+dW5peDpwYXRoPS9mb28vYmFyPC9saXN0ZW4+CisgIDxsaXN0ZW4+dGNwOnBvcnQ9MTIzNDwvbGlzdGVuPgorICA8aW5jbHVkZWRpcj5iYXNpYy5kPC9pbmNsdWRlZGlyPgorICA8c3RhbmRhcmRfc2Vzc2lvbl9zZXJ2aWNlZGlycyAvPgorICA8c2VydmljZWRpcj4vdXNyL3NoYXJlL2Zvbzwvc2VydmljZWRpcj4KKyAgPGluY2x1ZGUgaWdub3JlX21pc3Npbmc9InllcyI+bm9uZXhpc3RlbnQuY29uZjwvaW5jbHVkZT4KKyAgPHBvbGljeSBjb250ZXh0PSJkZWZhdWx0Ij4KKyAgICA8YWxsb3cgdXNlcj0iKiIvPgorICAgIDxkZW55IHNlbmRfaW50ZXJmYWNlPSJvcmcuZnJlZWRlc2t0b3AuU3lzdGVtIiBzZW5kX21lbWJlcj0iUmVib290Ii8+IAorICAgIDxkZW55IHJlY2VpdmVfaW50ZXJmYWNlPSJvcmcuZnJlZWRlc2t0b3AuU3lzdGVtIiByZWNlaXZlX21lbWJlcj0iUmVib290Ii8+CisgICAgPGRlbnkgc2VuZF9wYXRoPSIvZm9vL2Jhci9TeXN0ZW1PYmplY3RUaGluZyIgc2VuZF9tZW1iZXI9IlJlYm9vdCIvPiAKKyAgICA8ZGVueSBvd249Im9yZy5mcmVlZGVza3RvcC5TeXN0ZW0iLz4KKyAgICA8ZGVueSBvd25fcHJlZml4PSJvcmcuZnJlZWRlc2t0b3AuTWFueVN5c3RlbXMiLz4KKyAgICA8ZGVueSBzZW5kX2Rlc3RpbmF0aW9uPSJvcmcuZnJlZWRlc2t0b3AuU3lzdGVtIi8+CisgICAgPGRlbnkgcmVjZWl2ZV9zZW5kZXI9Im9yZy5mcmVlZGVza3RvcC5TeXN0ZW0iLz4KKyAgICA8YWxsb3cgc2VuZF90eXBlPSJlcnJvciIvPgorICAgIDxhbGxvdyBzZW5kX3R5cGU9Im1ldGhvZF9jYWxsIi8+CisgICAgPGFsbG93IHNlbmRfdHlwZT0ibWV0aG9kX3JldHVybiIvPgorICAgIDxhbGxvdyBzZW5kX3R5cGU9InNpZ25hbCIvPgorICAgIDxkZW55IHNlbmRfZGVzdGluYXRpb249Im9yZy5mcmVlZGVza3RvcC5CYXIiIHNlbmRfaW50ZXJmYWNlPSJvcmcuZnJlZWRlc2t0b3AuRm9vIi8+CisgICAgPGRlbnkgc2VuZF9kZXN0aW5hdGlvbj0ib3JnLmZyZWVkZXNrdG9wLkJhciIgc2VuZF9pbnRlcmZhY2U9Im9yZy5mcmVlZGVza3RvcC5Gb28iIHNlbmRfdHlwZT0ibWV0aG9kX2NhbGwiLz4KKyAgPC9wb2xpY3k+CisKKyAgPHBvbGljeSBjb250ZXh0PSJtYW5kYXRvcnkiPgorICAgIDxhbGxvdyB1c2VyPSIqIi8+CisgICAgPGRlbnkgc2VuZF9pbnRlcmZhY2U9Im9yZy5mcmVlZGVza3RvcC5TeXN0ZW0iIHNlbmRfbWVtYmVyPSJSZWJvb3QiLz4gCisgICAgPGRlbnkgcmVjZWl2ZV9pbnRlcmZhY2U9Im9yZy5mcmVlZGVza3RvcC5TeXN0ZW0iIHJlY2VpdmVfbWVtYmVyPSJSZWJvb3QiLz4KKyAgICA8ZGVueSBzZW5kX3BhdGg9Ii9mb28vYmFyL1N5c3RlbU9iamVjdFRoaW5nIiBzZW5kX21lbWJlcj0iUmVib290Ii8+IAorICAgIDxkZW55IG93bj0ib3JnLmZyZWVkZXNrdG9wLlN5c3RlbSIvPgorICAgIDxkZW55IG93bl9wcmVmaXg9Im9yZy5mcmVlZGVza3RvcC5NYW55U3lzdGVtcyIvPgorICAgIDxkZW55IHNlbmRfZGVzdGluYXRpb249Im9yZy5mcmVlZGVza3RvcC5TeXN0ZW0iLz4KKyAgICA8ZGVueSByZWNlaXZlX3NlbmRlcj0ib3JnLmZyZWVkZXNrdG9wLlN5c3RlbSIvPgorICAgIDxhbGxvdyBzZW5kX3R5cGU9ImVycm9yIi8+CisgICAgPGFsbG93IHNlbmRfdHlwZT0ibWV0aG9kX2NhbGwiLz4KKyAgICA8YWxsb3cgc2VuZF90eXBlPSJtZXRob2RfcmV0dXJuIi8+CisgICAgPGFsbG93IHNlbmRfdHlwZT0ic2lnbmFsIi8+CisgICAgPGRlbnkgc2VuZF9kZXN0aW5hdGlvbj0ib3JnLmZyZWVkZXNrdG9wLkJhciIgc2VuZF9pbnRlcmZhY2U9Im9yZy5mcmVlZGVza3RvcC5Gb28iLz4KKyAgICA8ZGVueSBzZW5kX2Rlc3RpbmF0aW9uPSJvcmcuZnJlZWRlc2t0b3AuQmFyIiBzZW5kX2ludGVyZmFjZT0ib3JnLmZyZWVkZXNrdG9wLkZvbyIgc2VuZF90eXBlPSJtZXRob2RfY2FsbCIvPgorICA8L3BvbGljeT4KKworICA8bGltaXQgbmFtZT0ibWF4X2luY29taW5nX2J5dGVzIj41MDAwPC9saW1pdD4gICAKKyAgPGxpbWl0IG5hbWU9Im1heF9vdXRnb2luZ19ieXRlcyI+NTAwMDwvbGltaXQ+CisgIDxsaW1pdCBuYW1lPSJtYXhfbWVzc2FnZV9zaXplIj4zMDA8L2xpbWl0PgorICA8bGltaXQgbmFtZT0ic2VydmljZV9zdGFydF90aW1lb3V0Ij41MDAwPC9saW1pdD4KKyAgPGxpbWl0IG5hbWU9ImF1dGhfdGltZW91dCI+NjAwMDwvbGltaXQ+CisgIDxsaW1pdCBuYW1lPSJtYXhfY29tcGxldGVkX2Nvbm5lY3Rpb25zIj41MDwvbGltaXQ+ICAKKyAgPGxpbWl0IG5hbWU9Im1heF9pbmNvbXBsZXRlX2Nvbm5lY3Rpb25zIj44MDwvbGltaXQ+CisgIDxsaW1pdCBuYW1lPSJtYXhfY29ubmVjdGlvbnNfcGVyX3VzZXIiPjY0PC9saW1pdD4KKyAgPGxpbWl0IG5hbWU9Im1heF9wZW5kaW5nX3NlcnZpY2Vfc3RhcnRzIj42NDwvbGltaXQ+CisgIDxsaW1pdCBuYW1lPSJtYXhfbmFtZXNfcGVyX2Nvbm5lY3Rpb24iPjI1NjwvbGltaXQ+CisgIDxsaW1pdCBuYW1lPSJtYXhfbWF0Y2hfcnVsZXNfcGVyX2Nvbm5lY3Rpb24iPjUxMjwvbGltaXQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorPC9idXNjb25maWc+CmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzL21heC1jb21wbGV0ZWQtY29ubmVjdGlvbnMuY29uZi5pbiBiL3Rlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMvbWF4LWNvbXBsZXRlZC1jb25uZWN0aW9ucy5jb25mLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MDNlMWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzL21heC1jb21wbGV0ZWQtY29ubmVjdGlvbnMuY29uZi5pbgpAQCAtMCwwICsxLDE4IEBACis8IURPQ1RZUEUgYnVzY29uZmlnIFBVQkxJQyAiLS8vZnJlZWRlc2t0b3AvL0RURCBELUJ1cyBCdXMgQ29uZmlndXJhdGlvbiAxLjAvL0VOIgorICJodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zdGFuZGFyZHMvZGJ1cy8xLjAvYnVzY29uZmlnLmR0ZCI+Cis8YnVzY29uZmlnPgorICA8IS0tIE91ciB3ZWxsLWtub3duIGJ1cyB0eXBlLCBkb24ndCBjaGFuZ2UgdGhpcyAtLT4KKyAgPHR5cGU+c2Vzc2lvbjwvdHlwZT4KKyAgPGxpc3Rlbj5AVEVTVF9MSVNURU5APC9saXN0ZW4+CisKKyAgPHBvbGljeSBjb250ZXh0PSJkZWZhdWx0Ij4KKyAgICA8IS0tIEFsbG93IGV2ZXJ5dGhpbmcgdG8gYmUgc2VudCAtLT4KKyAgICA8YWxsb3cgc2VuZF9kZXN0aW5hdGlvbj0iKiIgZWF2ZXNkcm9wPSJ0cnVlIi8+CisgICAgPCEtLSBBbGxvdyBldmVyeXRoaW5nIHRvIGJlIHJlY2VpdmVkIC0tPgorICAgIDxhbGxvdyBlYXZlc2Ryb3A9InRydWUiLz4KKyAgICA8IS0tIEFsbG93IGFueW9uZSB0byBvd24gYW55dGhpbmcgLS0+CisgICAgPGFsbG93IG93bj0iKiIvPgorICA8L3BvbGljeT4KKworICA8bGltaXQgbmFtZT0ibWF4X2NvbXBsZXRlZF9jb25uZWN0aW9ucyI+MzwvbGltaXQ+Cis8L2J1c2NvbmZpZz4KZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMvbWF4LWNvbm5lY3Rpb25zLXBlci11c2VyLmNvbmYuaW4gYi90ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzL21heC1jb25uZWN0aW9ucy1wZXItdXNlci5jb25mLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzOTQ1NTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzL21heC1jb25uZWN0aW9ucy1wZXItdXNlci5jb25mLmluCkBAIC0wLDAgKzEsMTggQEAKKzwhRE9DVFlQRSBidXNjb25maWcgUFVCTElDICItLy9mcmVlZGVza3RvcC8vRFREIEQtQnVzIEJ1cyBDb25maWd1cmF0aW9uIDEuMC8vRU4iCisgImh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3N0YW5kYXJkcy9kYnVzLzEuMC9idXNjb25maWcuZHRkIj4KKzxidXNjb25maWc+CisgIDwhLS0gT3VyIHdlbGwta25vd24gYnVzIHR5cGUsIGRvbid0IGNoYW5nZSB0aGlzIC0tPgorICA8dHlwZT5zZXNzaW9uPC90eXBlPgorICA8bGlzdGVuPkBURVNUX0xJU1RFTkA8L2xpc3Rlbj4KKworICA8cG9saWN5IGNvbnRleHQ9ImRlZmF1bHQiPgorICAgIDwhLS0gQWxsb3cgZXZlcnl0aGluZyB0byBiZSBzZW50IC0tPgorICAgIDxhbGxvdyBzZW5kX2Rlc3RpbmF0aW9uPSIqIiBlYXZlc2Ryb3A9InRydWUiLz4KKyAgICA8IS0tIEFsbG93IGV2ZXJ5dGhpbmcgdG8gYmUgcmVjZWl2ZWQgLS0+CisgICAgPGFsbG93IGVhdmVzZHJvcD0idHJ1ZSIvPgorICAgIDwhLS0gQWxsb3cgYW55b25lIHRvIG93biBhbnl0aGluZyAtLT4KKyAgICA8YWxsb3cgb3duPSIqIi8+CisgIDwvcG9saWN5PgorCisgIDxsaW1pdCBuYW1lPSJtYXhfY29ubmVjdGlvbnNfcGVyX3VzZXIiPjM8L2xpbWl0PgorPC9idXNjb25maWc+CmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzL21heC1tYXRjaC1ydWxlcy1wZXItY29ubmVjdGlvbi5jb25mLmluIGIvdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9tYXgtbWF0Y2gtcnVsZXMtcGVyLWNvbm5lY3Rpb24uY29uZi5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2QyN2I2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9tYXgtbWF0Y2gtcnVsZXMtcGVyLWNvbm5lY3Rpb24uY29uZi5pbgpAQCAtMCwwICsxLDE4IEBACis8IURPQ1RZUEUgYnVzY29uZmlnIFBVQkxJQyAiLS8vZnJlZWRlc2t0b3AvL0RURCBELUJ1cyBCdXMgQ29uZmlndXJhdGlvbiAxLjAvL0VOIgorICJodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zdGFuZGFyZHMvZGJ1cy8xLjAvYnVzY29uZmlnLmR0ZCI+Cis8YnVzY29uZmlnPgorICA8IS0tIE91ciB3ZWxsLWtub3duIGJ1cyB0eXBlLCBkb24ndCBjaGFuZ2UgdGhpcyAtLT4KKyAgPHR5cGU+c2Vzc2lvbjwvdHlwZT4KKyAgPGxpc3Rlbj5AVEVTVF9MSVNURU5APC9saXN0ZW4+CisKKyAgPHBvbGljeSBjb250ZXh0PSJkZWZhdWx0Ij4KKyAgICA8IS0tIEFsbG93IGV2ZXJ5dGhpbmcgdG8gYmUgc2VudCAtLT4KKyAgICA8YWxsb3cgc2VuZF9kZXN0aW5hdGlvbj0iKiIgZWF2ZXNkcm9wPSJ0cnVlIi8+CisgICAgPCEtLSBBbGxvdyBldmVyeXRoaW5nIHRvIGJlIHJlY2VpdmVkIC0tPgorICAgIDxhbGxvdyBlYXZlc2Ryb3A9InRydWUiLz4KKyAgICA8IS0tIEFsbG93IGFueW9uZSB0byBvd24gYW55dGhpbmcgLS0+CisgICAgPGFsbG93IG93bj0iKiIvPgorICA8L3BvbGljeT4KKworICA8bGltaXQgbmFtZT0ibWF4X21hdGNoX3J1bGVzX3Blcl9jb25uZWN0aW9uIj4zPC9saW1pdD4KKzwvYnVzY29uZmlnPgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9tYXgtbmFtZXMtcGVyLWNvbm5lY3Rpb24uY29uZi5pbiBiL3Rlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMvbWF4LW5hbWVzLXBlci1jb25uZWN0aW9uLmNvbmYuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg2ZWQ3YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMvbWF4LW5hbWVzLXBlci1jb25uZWN0aW9uLmNvbmYuaW4KQEAgLTAsMCArMSwxOCBAQAorPCFET0NUWVBFIGJ1c2NvbmZpZyBQVUJMSUMgIi0vL2ZyZWVkZXNrdG9wLy9EVEQgRC1CdXMgQnVzIENvbmZpZ3VyYXRpb24gMS4wLy9FTiIKKyAiaHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc3RhbmRhcmRzL2RidXMvMS4wL2J1c2NvbmZpZy5kdGQiPgorPGJ1c2NvbmZpZz4KKyAgPCEtLSBPdXIgd2VsbC1rbm93biBidXMgdHlwZSwgZG9uJ3QgY2hhbmdlIHRoaXMgLS0+CisgIDx0eXBlPnNlc3Npb248L3R5cGU+CisgIDxsaXN0ZW4+QFRFU1RfTElTVEVOQDwvbGlzdGVuPgorCisgIDxwb2xpY3kgY29udGV4dD0iZGVmYXVsdCI+CisgICAgPCEtLSBBbGxvdyBldmVyeXRoaW5nIHRvIGJlIHNlbnQgLS0+CisgICAgPGFsbG93IHNlbmRfZGVzdGluYXRpb249IioiIGVhdmVzZHJvcD0idHJ1ZSIvPgorICAgIDwhLS0gQWxsb3cgZXZlcnl0aGluZyB0byBiZSByZWNlaXZlZCAtLT4KKyAgICA8YWxsb3cgZWF2ZXNkcm9wPSJ0cnVlIi8+CisgICAgPCEtLSBBbGxvdyBhbnlvbmUgdG8gb3duIGFueXRoaW5nIC0tPgorICAgIDxhbGxvdyBvd249IioiLz4KKyAgPC9wb2xpY3k+CisKKyAgPGxpbWl0IG5hbWU9Im1heF9uYW1lc19wZXJfY29ubmVjdGlvbiI+NDwvbGltaXQ+Cis8L2J1c2NvbmZpZz4KZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMvbWF4LXJlcGxpZXMtcGVyLWNvbm5lY3Rpb24uY29uZi5pbiBiL3Rlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMvbWF4LXJlcGxpZXMtcGVyLWNvbm5lY3Rpb24uY29uZi5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDYxNWVkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9tYXgtcmVwbGllcy1wZXItY29ubmVjdGlvbi5jb25mLmluCkBAIC0wLDAgKzEsMTggQEAKKzwhRE9DVFlQRSBidXNjb25maWcgUFVCTElDICItLy9mcmVlZGVza3RvcC8vRFREIEQtQnVzIEJ1cyBDb25maWd1cmF0aW9uIDEuMC8vRU4iCisgImh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3N0YW5kYXJkcy9kYnVzLzEuMC9idXNjb25maWcuZHRkIj4KKzxidXNjb25maWc+CisgIDwhLS0gT3VyIHdlbGwta25vd24gYnVzIHR5cGUsIGRvbid0IGNoYW5nZSB0aGlzIC0tPgorICA8dHlwZT5zZXNzaW9uPC90eXBlPgorICA8bGlzdGVuPkBURVNUX0xJU1RFTkA8L2xpc3Rlbj4KKworICA8cG9saWN5IGNvbnRleHQ9ImRlZmF1bHQiPgorICAgIDwhLS0gQWxsb3cgZXZlcnl0aGluZyB0byBiZSBzZW50IC0tPgorICAgIDxhbGxvdyBzZW5kX2Rlc3RpbmF0aW9uPSIqIiBlYXZlc2Ryb3A9InRydWUiLz4KKyAgICA8IS0tIEFsbG93IGV2ZXJ5dGhpbmcgdG8gYmUgcmVjZWl2ZWQgLS0+CisgICAgPGFsbG93IGVhdmVzZHJvcD0idHJ1ZSIvPgorICAgIDwhLS0gQWxsb3cgYW55b25lIHRvIG93biBhbnl0aGluZyAtLT4KKyAgICA8YWxsb3cgb3duPSIqIi8+CisgIDwvcG9saWN5PgorCisgIDxsaW1pdCBuYW1lPSJtYXhfcmVwbGllc19wZXJfY29ubmVjdGlvbiI+MzwvbGltaXQ+Cis8L2J1c2NvbmZpZz4KZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMvbXVsdGktdXNlci5jb25mLmluIGIvdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9tdWx0aS11c2VyLmNvbmYuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdhN2RhNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMvbXVsdGktdXNlci5jb25mLmluCkBAIC0wLDAgKzEsMTUgQEAKKzwhRE9DVFlQRSBidXNjb25maWcgUFVCTElDICItLy9mcmVlZGVza3RvcC8vRFREIEQtQlVTIEJ1cyBDb25maWd1cmF0aW9uIDEuMC8vRU4iCisgImh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3N0YW5kYXJkcy9kYnVzLzEuMC9idXNjb25maWcuZHRkIj4KKzxidXNjb25maWc+CisgIDxsaXN0ZW4+QFRFU1RfTElTVEVOQDwvbGlzdGVuPgorCisgIDxwb2xpY3kgY29udGV4dD0iZGVmYXVsdCI+CisgICAgPGFsbG93IHNlbmRfaW50ZXJmYWNlPSIqIi8+CisgICAgPGFsbG93IHJlY2VpdmVfaW50ZXJmYWNlPSIqIi8+CisgICAgPGFsbG93IG93bj0iKiIvPgorICAgIDxhbGxvdyB1c2VyPSIqIi8+CisgIDwvcG9saWN5PgorCisgIDwhLS0gYXZvaWQgYWxsb3dpbmcgc2VydmljZSBhY3RpdmF0aW9uIHNpbmNlIHdlIGFyZSBhbGxvd2luZyBldmVyeW9uZSBpbiAtLT4KKyAgPHNlcnZpY2VoZWxwZXI+L2Jpbi9mYWxzZTwvc2VydmljZWhlbHBlcj4KKzwvYnVzY29uZmlnPgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9wZW5kaW5nLWZkLXRpbWVvdXQuY29uZi5pbiBiL3Rlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMvcGVuZGluZy1mZC10aW1lb3V0LmNvbmYuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ5ZDg4NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMvcGVuZGluZy1mZC10aW1lb3V0LmNvbmYuaW4KQEAgLTAsMCArMSwyMCBAQAorCis8IURPQ1RZUEUgYnVzY29uZmlnIFBVQkxJQyAiLS8vZnJlZWRlc2t0b3AvL0RURCBELUJ1cyBCdXMgQ29uZmlndXJhdGlvbiAxLjAvL0VOIgorICJodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zdGFuZGFyZHMvZGJ1cy8xLjAvYnVzY29uZmlnLmR0ZCI+Cis8YnVzY29uZmlnPgorICA8IS0tIE91ciB3ZWxsLWtub3duIGJ1cyB0eXBlLCBkb24ndCBjaGFuZ2UgdGhpcyAtLT4KKyAgPHR5cGU+c2Vzc2lvbjwvdHlwZT4KKyAgPGxpc3Rlbj5AVEVTVF9MSVNURU5APC9saXN0ZW4+CisKKyAgPHBvbGljeSBjb250ZXh0PSJkZWZhdWx0Ij4KKyAgICA8IS0tIEFsbG93IGV2ZXJ5dGhpbmcgdG8gYmUgc2VudCAtLT4KKyAgICA8YWxsb3cgc2VuZF9kZXN0aW5hdGlvbj0iKiIgZWF2ZXNkcm9wPSJ0cnVlIi8+CisgICAgPCEtLSBBbGxvdyBldmVyeXRoaW5nIHRvIGJlIHJlY2VpdmVkIC0tPgorICAgIDxhbGxvdyBlYXZlc2Ryb3A9InRydWUiLz4KKyAgICA8IS0tIEFsbG93IGFueW9uZSB0byBvd24gYW55dGhpbmcgLS0+CisgICAgPGFsbG93IG93bj0iKiIvPgorICA8L3BvbGljeT4KKworICA8IS0tIDUwMG1zIC0tPgorICA8bGltaXQgbmFtZT0icGVuZGluZ19mZF90aW1lb3V0Ij41MDA8L2xpbWl0PgorPC9idXNjb25maWc+CmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvdmFsaWQtY29uZmlnLWZpbGVzL3N0YW5kYXJkLXNlc3Npb24tZGlycy5jb25mIGIvdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9zdGFuZGFyZC1zZXNzaW9uLWRpcnMuY29uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjJkYzg3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9zdGFuZGFyZC1zZXNzaW9uLWRpcnMuY29uZgpAQCAtMCwwICsxLDggQEAKKzwhLS0gU2ltcGxpZmllZCB2ZXJzaW9uIG9mIHNlc3Npb24uY29uZiAtLT4KKzwhRE9DVFlQRSBidXNjb25maWcgUFVCTElDICItLy9mcmVlZGVza3RvcC8vRFREIEQtQnVzIEJ1cyBDb25maWd1cmF0aW9uIDEuMC8vRU4iCisgImh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3N0YW5kYXJkcy9kYnVzLzEuMC9idXNjb25maWcuZHRkIj4KKzxidXNjb25maWc+CisgIDxsaXN0ZW4+dW5peDpwYXRoPS9mb288L2xpc3Rlbj4KKyAgPHR5cGU+c2Vzc2lvbjwvdHlwZT4KKyAgPHN0YW5kYXJkX3Nlc3Npb25fc2VydmljZWRpcnMgLz4KKzwvYnVzY29uZmlnPgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3ZhbGlkLWNvbmZpZy1maWxlcy9zeXN0ZW1kLWFjdGl2YXRpb24uY29uZi5pbiBiL3Rlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMvc3lzdGVtZC1hY3RpdmF0aW9uLmNvbmYuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmMzZDJjMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS92YWxpZC1jb25maWctZmlsZXMvc3lzdGVtZC1hY3RpdmF0aW9uLmNvbmYuaW4KQEAgLTAsMCArMSwxOSBAQAorPCFET0NUWVBFIGJ1c2NvbmZpZyBQVUJMSUMgIi0vL2ZyZWVkZXNrdG9wLy9EVEQgRC1CVVMgQnVzIENvbmZpZ3VyYXRpb24gMS4wLy9FTiIKKyAiaHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc3RhbmRhcmRzL2RidXMvMS4wL2J1c2NvbmZpZy5kdGQiPgorPGJ1c2NvbmZpZz4KKyAgPGxpc3Rlbj5AVEVTVF9MSVNURU5APC9saXN0ZW4+CisKKyAgPHNlcnZpY2VkaXI+QERCVVNfVEVTVF9EQVRBQC9zeXN0ZW1kLWFjdGl2YXRpb248L3NlcnZpY2VkaXI+CisgIDxzdGFuZGFyZF9zZXNzaW9uX3NlcnZpY2VkaXJzIC8+CisKKyAgPHBvbGljeSBjb250ZXh0PSJkZWZhdWx0Ij4KKyAgICA8YWxsb3cgc2VuZF9kZXN0aW5hdGlvbj0iKiIvPgorICAgIDxhbGxvdyByZWNlaXZlX3NlbmRlcj0iKiIvPgorICAgIDxhbGxvdyBvd249IioiLz4KKyAgPC9wb2xpY3k+CisKKyAgPHBvbGljeSBjb250ZXh0PSJtYW5kYXRvcnkiPgorICAgIDxkZW55IHNlbmRfZGVzdGluYXRpb249ImNvbS5leGFtcGxlLlNlbmREZW5pZWQiLz4KKyAgICA8ZGVueSByZWNlaXZlX2ludGVyZmFjZT0iY29tLmV4YW1wbGUuUmVjZWl2ZURlbmllZCIgcmVjZWl2ZV9tZW1iZXI9IkNhbGwiLz4KKyAgPC9wb2xpY3k+Cis8L2J1c2NvbmZpZz4KZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy9hcnJheS1vZi1hcnJheS1vZi11aW50MzIubWVzc2FnZSBiL3Rlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy9hcnJheS1vZi1hcnJheS1vZi11aW50MzIubWVzc2FnZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTIxODZiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL2FycmF5LW9mLWFycmF5LW9mLXVpbnQzMi5tZXNzYWdlCkBAIC0wLDAgKzEsMzMgQEAKKyMgTWVzc2FnZSB3aXRoIGFuIGFycmF5IG9mIGFycmF5IG9mIHVpbnQzMgorCitWQUxJRF9IRUFERVIgbWV0aG9kX2NhbGwKK1JFUVVJUkVEX0ZJRUxEUworQUxJR04gOAorRU5EX0xFTkdUSCBIZWFkZXIKK1NUQVJUX0xFTkdUSCBCb2R5CisKK1RZUEUgQVJSQVkKK1RZUEUgQVJSQVkKK1RZUEUgVUlOVDMyCisKK0xFTkdUSCBBcnJheQorU1RBUlRfTEVOR1RIIEFycmF5CisKKyMjIGFycmF5IG9mIHVpbnQzMgorTEVOR1RIIFN1YkFycmF5MQorU1RBUlRfTEVOR1RIIFN1YkFycmF5MQorVUlOVDMyIDEKK1VJTlQzMiAyCitVSU5UMzIgMworRU5EX0xFTkdUSCBTdWJBcnJheTEKKworIyMgYXJyYXkgb2YgdWludDMyCitMRU5HVEggU3ViQXJyYXkyCitTVEFSVF9MRU5HVEggU3ViQXJyYXkyCitVSU5UMzIgNAorVUlOVDMyIDUKK0VORF9MRU5HVEggU3ViQXJyYXkyCisKK0VORF9MRU5HVEggQXJyYXkKKworRU5EX0xFTkdUSCBCb2R5CmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvdmFsaWQtbWVzc2FnZXMvZGljdC1zaW1wbGUubWVzc2FnZSBiL3Rlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy9kaWN0LXNpbXBsZS5tZXNzYWdlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhNjkyN2QKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvdmFsaWQtbWVzc2FnZXMvZGljdC1zaW1wbGUubWVzc2FnZQpAQCAtMCwwICsxLDE1IEBACisjIEEgc2ltcGxlIGRpY3QKKworVkFMSURfSEVBREVSIG1ldGhvZF9jYWxsCitSRVFVSVJFRF9GSUVMRFMKK0FMSUdOIDgKK0VORF9MRU5HVEggSGVhZGVyCitTVEFSVF9MRU5HVEggQm9keQorVFlQRSBESUNUCitMRU5HVEggRGljdAorU1RBUlRfTEVOR1RIIERpY3QKK1NUUklORyAnaW50MzInCitUWVBFIElOVDMyCitJTlQzMiAweDEyMzQ1Njc4CitFTkRfTEVOR1RIIERpY3QKK0VORF9MRU5HVEggQm9keQpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL2RpY3QubWVzc2FnZSBiL3Rlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy9kaWN0Lm1lc3NhZ2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY5OTdiMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy9kaWN0Lm1lc3NhZ2UKQEAgLTAsMCArMSw0NyBAQAorIyBEaWN0IHdpdGggZGlmZmVyZW50IHZhbHVlcworCitWQUxJRF9IRUFERVIgbWV0aG9kX2NhbGwKK1JFUVVJUkVEX0ZJRUxEUworQUxJR04gOAorRU5EX0xFTkdUSCBIZWFkZXIKK1NUQVJUX0xFTkdUSCBCb2R5CitUWVBFIERJQ1QKK0xFTkdUSCBEaWN0CitTVEFSVF9MRU5HVEggRGljdAorU1RSSU5HICdib29sZWFuJworVFlQRSBCT09MRUFOCitCWVRFIDEKK1NUUklORyAnaW50MzInCitUWVBFIElOVDMyCitJTlQzMiAweDEyMzQ1Njc4CitTVFJJTkcgJ3VpbnQzMicKK1RZUEUgVUlOVDMyCitVSU5UMzIgMHg4NzY1NDMyCitTVFJJTkcgJ2RvdWJsZScKK1RZUEUgRE9VQkxFCitET1VCTEUgMy4xNDE1OTI2NTM1ODkKK1NUUklORyAnc3RyaW5nJworVFlQRSBTVFJJTkcKK1NUUklORyAnVGhpcyBpcyBhIHN0cmluZycKK1NUUklORyAnYm9vbGVhbl9hcnJheScKK1RZUEUgQVJSQVkKK1RZUEUgQk9PTEVBTgorQk9PTEVBTl9BUlJBWSB7IHRydWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgZmFsc2UgfQorU1RSSU5HICdpbnQzMl9hcnJheScKK1RZUEUgQVJSQVkKK1RZUEUgSU5UMzIKK0lOVDMyX0FSUkFZIHsgMSwgLTIsIDMsIC00LCA1LCAtNiwgNywgLTgsIDksIC0xMCB9CitTVFJJTkcgJ3VpbnQzMl9hcnJheScKK1RZUEUgQVJSQVkKK1RZUEUgVUlOVDMyCitVSU5UMzJfQVJSQVkgeyAxMSwgMTIsIDMxNCwgMTkxMSwgNTc2OTIsIDEyMzcsIDI4MzQgfQorU1RSSU5HICdkb3VibGVfYXJyYXknCitUWVBFIEFSUkFZCitUWVBFIERPVUJMRQorRE9VQkxFX0FSUkFZIHsgMC4xLCAwLjIsIDMuMTQxNTkyNiwgMi43MTgzLCAxMC4wLCA5Ljk5IH0KK1NUUklORyAnc3RyaW5nX2FycmF5JworVFlQRSBBUlJBWQorVFlQRSBTVFJJTkcKK1NUUklOR19BUlJBWSB7ICdIZWxsbycsICdUaGlzJywgJ0lzJywgJ0EnLCAnU3RyaW5nJywgJ0FycmF5IScgfQorRU5EX0xFTkdUSCBEaWN0CitFTkRfTEVOR1RIIEJvZHkKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy9lbXB0aW5lc3MubWVzc2FnZSBiL3Rlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy9lbXB0aW5lc3MubWVzc2FnZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjA0MmMwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL2VtcHRpbmVzcy5tZXNzYWdlCkBAIC0wLDAgKzEsNjMgQEAKKyMgRW1wdHkgYXJyYXlzIGFuZCBzdHJpbmdzCisKK1ZBTElEX0hFQURFUiBtZXRob2RfY2FsbAorUkVRVUlSRURfRklFTERTCitBTElHTiA4CitFTkRfTEVOR1RIIEhlYWRlcgorU1RBUlRfTEVOR1RIIEJvZHkKK1RZUEUgU1RSSU5HCitJTlQzMiAwCitCWVRFIDAgIyBTdHJpbmdzIG5lZWQgdG8gYmUgTlVMTC10ZXJtaW5hdGVkCitUWVBFIEFSUkFZCitUWVBFIEJPT0xFQU4KK0lOVDMyIDAKK1RZUEUgQVJSQVkKK1RZUEUgSU5UMzIKK0lOVDMyIDAKK1RZUEUgQVJSQVkKK1RZUEUgVUlOVDMyCitJTlQzMiAwCitUWVBFIEFSUkFZCitUWVBFIERPVUJMRQorSU5UMzIgMAorVFlQRSBBUlJBWQorVFlQRSBCWVRFCitJTlQzMiAwCitUWVBFIEFSUkFZCitUWVBFIFNUUklORworSU5UMzIgMAorVFlQRSBESUNUCitJTlQzMiAwCisKKyMgQSBkaWN0IHdpdGggZW1wdHkgYXJyYXlzCitUWVBFIERJQ1QKK0xFTkdUSCBEaWN0CitTVEFSVF9MRU5HVEggRGljdAorU1RSSU5HICdib29sZWFuX2FycmF5JworVFlQRSBBUlJBWQorVFlQRSBCT09MRUFOCitJTlQzMiAwCitTVFJJTkcgJ2ludDMyX2FycmF5JworVFlQRSBBUlJBWQorVFlQRSBJTlQzMgorSU5UMzIgMAorU1RSSU5HICd1aW50MzJfYXJyYXknCitUWVBFIEFSUkFZCitUWVBFIFVJTlQzMgorSU5UMzIgMAorU1RSSU5HICdkb3VibGVfYXJyYXknCitUWVBFIEFSUkFZCitUWVBFIERPVUJMRQorSU5UMzIgMAorU1RSSU5HICdieXRlX2FycmF5JworVFlQRSBBUlJBWSAKK1RZUEUgQllURQorSU5UMzIgMAorU1RSSU5HICdzdHJpbmdfYXJyYXknIH0KK1RZUEUgQVJSQVkKK1RZUEUgU1RSSU5HCitJTlQzMiAwCitFTkRfTEVOR1RIIERpY3QKKworRU5EX0xFTkdUSCBCb2R5CisKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy9sb3RzLW9mLWFyZ3VtZW50cy5tZXNzYWdlIGIvdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL2xvdHMtb2YtYXJndW1lbnRzLm1lc3NhZ2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRhYWUwZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy9sb3RzLW9mLWFyZ3VtZW50cy5tZXNzYWdlCkBAIC0wLDAgKzEsNjUgQEAKKyMgTWVzc2FnZSB3aXRoIGxvdHMgb2YgZGlmZmVyZW50IGFyZ3VtZW50IHR5cGVzCisKK1ZBTElEX0hFQURFUiBtZXRob2RfY2FsbAorUkVRVUlSRURfRklFTERTCitBTElHTiA4CitFTkRfTEVOR1RIIEhlYWRlcgorU1RBUlRfTEVOR1RIIEJvZHkKK1RZUEUgTklMCitUWVBFIEJZVEUKK0JZVEUgNDIKK1RZUEUgSU5UMzIKK0lOVDMyIDB4MTIzNDU2NzgKK1RZUEUgVUlOVDMyCitVSU5UMzIgMHg4NzY1NDMyCitUWVBFIERPVUJMRQorRE9VQkxFIDMuMTQxNTkyNjUzNTg5CitUWVBFIFNUUklORworU1RSSU5HICdUaGlzIGlzIGEgc3RyaW5nJworVFlQRSBBUlJBWQorVFlQRSBCT09MRUFOCitCT09MRUFOX0FSUkFZIHsgdHJ1ZSwgZmFsc2UsIGZhbHNlLCB0cnVlLCBmYWxzZSB9CitUWVBFIEFSUkFZCitUWVBFIElOVDMyCitJTlQzMl9BUlJBWSB7IDEsIC0yLCAzLCAtNCwgNSwgLTYsIDcsIC04LCA5LCAtMTAgfQorVFlQRSBBUlJBWQorVFlQRSBVSU5UMzIKK1VJTlQzMl9BUlJBWSB7IDExLCAxMiwgMzE0LCAxOTExLCA1NzY5MiwgMTIzNywgMjgzNCB9CitUWVBFIEFSUkFZCitUWVBFIERPVUJMRQorRE9VQkxFX0FSUkFZIHsgMC4xLCAwLjIsIDMuMTQxNTkyNiwgMi43MTgzLCAxMC4wLCA5Ljk5IH0KK1RZUEUgQVJSQVkKK1RZUEUgU1RSSU5HCitTVFJJTkdfQVJSQVkgeyAnSGVsbG8nLCAnVGhpcycsICdJcycsICdBJywgJ1N0cmluZycsICdBcnJheSEnIH0KK1RZUEUgQ1VTVE9NCitTVFJJTkcgJ25hbWVkIHR5cGUnCitCWVRFX0FSUkFZIHsgJ2InLCAnaScsICduJywgJ2EnLCAncicsICd5JywgJ2QnLCAnYScsICd0JywgJ2EnIH0KKworVFlQRSBBUlJBWQorVFlQRSBESUNUCitMRU5HVEggQXJyYXkKK1NUQVJUX0xFTkdUSCBBcnJheQorCitMRU5HVEggRGljdDEKK1NUQVJUX0xFTkdUSCBEaWN0MQorU1RSSU5HICdrZXkxJworVFlQRSBJTlQzMgorSU5UMzIgMHgxMjM0NTY3OAorU1RSSU5HICdrZXkyJworVFlQRSBVSU5UMzIKK1VJTlQzMiAweDg3NjU0MzIKK0VORF9MRU5HVEggRGljdDEKKworTEVOR1RIIERpY3QyCitTVEFSVF9MRU5HVEggRGljdDIKK1NUUklORyAna2V5MScKK1RZUEUgSU5UMzIKK0lOVDMyIDB4MTIzNDU2NzgKK1NUUklORyAna2V5MicKK1RZUEUgVUlOVDMyCitVSU5UMzIgMHg4NzY1NDMyCitFTkRfTEVOR1RIIERpY3QyCisKK0VORF9MRU5HVEggQXJyYXkKKworRU5EX0xFTkdUSCBCb2R5CmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvdmFsaWQtbWVzc2FnZXMvbm8tcGFkZGluZy5tZXNzYWdlIGIvdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL25vLXBhZGRpbmcubWVzc2FnZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGRmNGQ0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL25vLXBhZGRpbmcubWVzc2FnZQpAQCAtMCwwICsxLDIyIEBACisjIyBNZXNzYWdlIHdpdGggbm8gaGVhZGVyIHBhZGRpbmcKKworIyMgVkFMSURfSEVBREVSIGluY2x1ZGVzIGEgTEVOR1RIIEhlYWRlciBhbmQgTEVOR1RIIEJvZHkKK1ZBTElEX0hFQURFUiBtZXRob2RfY2FsbAorCitSRVFVSVJFRF9GSUVMRFMKKworIyMgdGhpcyBieXRlIGFycmF5IGlzIGZpbGxlZCB3aXRoIHplcm9zIHRvIHRoZSBuYXR1cmFsIGxlbmd0aCAKKyMjIG9mIHRoZSBoZWFkZXIKK0hFQURFUl9GSUVMRCBVTktOT1dOCitUWVBFIEFSUkFZCitUWVBFIEJZVEUKK0FMSUdOIDQKK0xFTkdUSCBUaGlzQnl0ZUFycmF5CitTVEFSVF9MRU5HVEggVGhpc0J5dGVBcnJheQorQllURSAxCitBTElHTiA4IDEKK0VORF9MRU5HVEggVGhpc0J5dGVBcnJheQorCitFTkRfTEVOR1RIIEhlYWRlcgorU1RBUlRfTEVOR1RIIEJvZHkKK0VORF9MRU5HVEggQm9keQpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL29wcG9zaXRlLWVuZGlhbi5tZXNzYWdlIGIvdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL29wcG9zaXRlLWVuZGlhbi5tZXNzYWdlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwOTQ5ZGQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvdmFsaWQtbWVzc2FnZXMvb3Bwb3NpdGUtZW5kaWFuLm1lc3NhZ2UKQEAgLTAsMCArMSwzMCBAQAorIyMgTWVzc2FnZSBvZiBvcHBvc2l0ZSBlbmRpYW5uZXNzLCB3aXRoIGxvdHMgb2YgcmFuZG9tIGZpZWxkcyBpbiBpdAorCitPUFBPU0lURV9FTkRJQU4KKworIyMgVkFMSURfSEVBREVSIGluY2x1ZGVzIGEgTEVOR1RIIEhlYWRlciBhbmQgTEVOR1RIIEJvZHkKK1ZBTElEX0hFQURFUiBtZXRob2RfY2FsbAorCitSRVFVSVJFRF9GSUVMRFMKKworSEVBREVSX0ZJRUxEIFVOS05PV04KK1RZUEUgSU5UMzIKK0lOVDMyIDB4ZmVlYgorCitBTElHTiA4CitFTkRfTEVOR1RIIEhlYWRlcgorCitTVEFSVF9MRU5HVEggQm9keQorCitUWVBFIElOVDMyCitJTlQzMiA4OTc2NTQzMgorVFlQRSBVSU5UMzIKK1VJTlQzMiAweGZmZmZmZmYKK1RZUEUgU1RSSU5HCitTVFJJTkcgJ0hlbGxvIHRoaXMgaXMgYSBzdHJpbmcnCitUWVBFIERPVUJMRQorRE9VQkxFIDMuMTQxNTkKKworVFlQRSBOSUwKKworRU5EX0xFTkdUSCBCb2R5CmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvdmFsaWQtbWVzc2FnZXMvcmVjdXJzaXZlLXR5cGVzLm1lc3NhZ2UgYi90ZXN0L2RhdGEvdmFsaWQtbWVzc2FnZXMvcmVjdXJzaXZlLXR5cGVzLm1lc3NhZ2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTMwNmZkMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy9yZWN1cnNpdmUtdHlwZXMubWVzc2FnZQpAQCAtMCwwICsxLDk5IEBACisjIyBNZXNzYWdlIHdpdGggcmVjdXJzaXZlIHR5cGVzCisKKyMjIFZBTElEX0hFQURFUiBpbmNsdWRlcyBhIExFTkdUSCBIZWFkZXIgYW5kIExFTkdUSCBCb2R5CitWQUxJRF9IRUFERVIgbWV0aG9kX2NhbGwKKworUkVRVUlSRURfRklFTERTCisKK0FMSUdOIDgKK0VORF9MRU5HVEggSGVhZGVyCitTVEFSVF9MRU5HVEggQm9keQorCisjIEV2ZXJ5dGhpbmcgaXMgaW5zaWRlIGEgZGljdAorVFlQRSBESUNUCitMRU5HVEggRGljdDEKK1NUQVJUX0xFTkdUSCBEaWN0MQorCisjIGZpcnN0IGRpY3QgZW50cnkgaXMgYW4gYXJyYXkgb2YgYXJyYXkgb2YgdWludDMyCitTVFJJTkcgJ21lZ2EtdWludC1hcnJheScKK1RZUEUgQVJSQVkKK1RZUEUgQVJSQVkKK1RZUEUgQVJSQVkKK1RZUEUgVUlOVDMyCitMRU5HVEggQXJyYXkxCitTVEFSVF9MRU5HVEggQXJyYXkxCisKK0xFTkdUSCBBcnJheTFfMQorU1RBUlRfTEVOR1RIIEFycmF5MV8xCitVSU5UMzJfQVJSQVkgeyAxLCAyLCAzLCA0LCA1fQorVUlOVDMyX0FSUkFZIHsgMiwgMywgNCwgNSwgMX0KK1VJTlQzMl9BUlJBWSB7IDMsIDQsIDUsIDEsIDJ9CitFTkRfTEVOR1RIIEFycmF5MV8xCisKK0xFTkdUSCBBcnJheTFfMgorU1RBUlRfTEVOR1RIIEFycmF5MV8yCitVSU5UMzJfQVJSQVkgeyA0LCA1LCA2LCA3LCA4fQorVUlOVDMyX0FSUkFZIHsgNSwgNiwgNywgOCwgNH0KK0VORF9MRU5HVEggQXJyYXkxXzIKKworRU5EX0xFTkdUSCBBcnJheTEKKworIyBzZWNvbmQgZGljdCBlbnRyeSBpcyBhbiBhcnJheSBvZiBzdHJpbmdzCitTVFJJTkcgJ3N0cmluZy1hcnJheScKK1RZUEUgQVJSQVkKK1RZUEUgU1RSSU5HCitTVFJJTkdfQVJSQVkgeyAnYScsICdzdHJpbmcnLCAnYXJyYXknfQorCisjIHRoaXJkIGRpY3QgZW50cnkgaXMgYW5vdGhlciBkaWN0CitTVFJJTkcgJ25lc3RlZC1kaWN0JworVFlQRSBESUNUCitMRU5HVEggRGljdDIKK1NUQVJUX0xFTkdUSCBEaWN0MgorCitTVFJJTkcgJ3N0cmluZycKK1RZUEUgU1RSSU5HCitTVFJJTkcgJ2EgZGVlcGx5IG5lc3RlZCBzdHJpbmcnICAgICAKKworU1RSSU5HICdzdXBlci1uZXN0ZWQtZGljdCcKK1RZUEUgRElDVAorTEVOR1RIIERpY3QzCitTVEFSVF9MRU5HVEggRGljdDMKKworU1RSSU5HICdkb3VibGUtYXJyYXknCitUWVBFIEFSUkFZCitUWVBFIERPVUJMRQorRE9VQkxFX0FSUkFZIHsxLjAsIDIuMCwgMy4wfQorCitTVFJJTkcgJ2RpY3QtYXJyYXknCitUWVBFIEFSUkFZCitUWVBFIERJQ1QKK0xFTkdUSCBBcnJheTIKK1NUQVJUX0xFTkdUSCBBcnJheTIKKworTEVOR1RIIERpY3Q0CitTVEFSVF9MRU5HVEggRGljdDQKK1NUUklORyAna2V5NCcKK1RZUEUgQllURQorQllURSAnNCcKK0VORF9MRU5HVEggRGljdDQKKworTEVOR1RIIERpY3Q1CitTVEFSVF9MRU5HVEggRGljdDUKK1NUUklORyAna2V5NScKK1RZUEUgQllURQorQllURSAnNScKK0VORF9MRU5HVEggRGljdDUKKworRU5EX0xFTkdUSCBBcnJheTIKKworU1RSSU5HICdib29sZWFuJworVFlQRSBCT09MRUFOCitCT09MRUFOIGZhbHNlCisKK0VORF9MRU5HVEggRGljdDMKKworRU5EX0xFTkdUSCBEaWN0MgorCitFTkRfTEVOR1RIIERpY3QxCisKK0VORF9MRU5HVEggQm9keQpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL3NpbXBsZXN0LW1hbnVhbC5tZXNzYWdlIGIvdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL3NpbXBsZXN0LW1hbnVhbC5tZXNzYWdlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2YTk2MGQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvdmFsaWQtbWVzc2FnZXMvc2ltcGxlc3QtbWFudWFsLm1lc3NhZ2UKQEAgLTAsMCArMSwzMCBAQAorIyMgbGlrZSBzaW1wbGVzdC5tZXNzYWdlLCBidXQgZG9lc24ndCB1c2UgVkFMSURfSEVBREVSCisjIyBjb252ZW5pZW5jZSBjb21tYW5kLiBtb3N0bHkgdG8gdGVzdCB0aGUgdGVzdCBmcmFtZXdvcmsuCisKK0xJVFRMRV9FTkRJQU4KK0JZVEUgJ2wnCitCWVRFIDEKK0JZVEUgMAorQllURSAwCitMRU5HVEggSGVhZGVyCitMRU5HVEggQm9keQorIyMgY2xpZW50IHNlcmlhbAorSU5UMzIgNworCitIRUFERVJfRklFTEQgUEFUSAorVFlQRSBPQkpFQ1RfUEFUSAorT0JKRUNUX1BBVEggJy9mb28nCitIRUFERVJfRklFTEQgSU5URVJGQUNFCitUWVBFIFNUUklORworU1RSSU5HICdvcmcuZnJlZWRlc2t0b3AuRm9vJworSEVBREVSX0ZJRUxEIE1FTUJFUgorVFlQRSBTVFJJTkcKK1NUUklORyAnQmFyJworSEVBREVSX0ZJRUxEIFNJR05BVFVSRQorVFlQRSBTVFJJTkcKK1NUUklORyAnJworCitBTElHTiA4CitFTkRfTEVOR1RIIEhlYWRlcgorU1RBUlRfTEVOR1RIIEJvZHkKK0VORF9MRU5HVEggQm9keQpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL3NpbXBsZXN0Lm1lc3NhZ2UgYi90ZXN0L2RhdGEvdmFsaWQtbWVzc2FnZXMvc2ltcGxlc3QubWVzc2FnZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWRkYWY2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL3NpbXBsZXN0Lm1lc3NhZ2UKQEAgLTAsMCArMSwxMCBAQAorIyMgc2ltcGxlc3QgcG9zc2libGUgdmFsaWQgbWVzc2FnZQorCisjIyBWQUxJRF9IRUFERVIgaW5jbHVkZXMgYSBMRU5HVEggSGVhZGVyIGFuZCBMRU5HVEggQm9keQorVkFMSURfSEVBREVSIG1ldGhvZF9jYWxsCitSRVFVSVJFRF9GSUVMRFMKKworQUxJR04gOAorRU5EX0xFTkdUSCBIZWFkZXIKK1NUQVJUX0xFTkdUSCBCb2R5CitFTkRfTEVOR1RIIEJvZHkKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy9zdGFuZGFyZC1hY3F1aXJlLXNlcnZpY2UubWVzc2FnZSBiL3Rlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy9zdGFuZGFyZC1hY3F1aXJlLXNlcnZpY2UubWVzc2FnZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTlmM2JiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL3N0YW5kYXJkLWFjcXVpcmUtc2VydmljZS5tZXNzYWdlCkBAIC0wLDAgKzEsMjYgQEAKKyMgU3RhbmRhcmQgb3JnLmZyZWVkZXNrdG9wLkRCdXMuQWNxdWlyZVNlcnZpY2UgbWVzc2FnZQorCitWQUxJRF9IRUFERVIgbWV0aG9kX2NhbGwKK0hFQURFUl9GSUVMRCBQQVRICitUWVBFIE9CSkVDVF9QQVRICitPQkpFQ1RfUEFUSCAnL29yZy9mcmVlZGVza3RvcC9EQnVzJworSEVBREVSX0ZJRUxEIElOVEVSRkFDRQorVFlQRSBTVFJJTkcKK1NUUklORyAnb3JnLmZyZWVkZXNrdG9wLkRCdXMnCitIRUFERVJfRklFTEQgTUVNQkVSCitUWVBFIFNUUklORworU1RSSU5HICdBY3F1aXJlU2VydmljZScKK0hFQURFUl9GSUVMRCBERVNUSU5BVElPTgorVFlQRSBTVFJJTkcKK1NUUklORyAnb3JnLmZyZWVkZXNrdG9wLkRCdXMnCitIRUFERVJfRklFTEQgU0lHTkFUVVJFCitUWVBFIFNUUklORworU1RSSU5HICdzdScKK0FMSUdOIDgKK0VORF9MRU5HVEggSGVhZGVyCitTVEFSVF9MRU5HVEggQm9keQorVFlQRSBTVFJJTkcKK1NUUklORyAnb3JnLmZyZWVkZXNrdG9wLkRCdXMuU2FtcGxlJworVFlQRSBVSU5UMzIKK1VJTlQzMiAwCitFTkRfTEVOR1RIIEJvZHkKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy9zdGFuZGFyZC1oZWxsby5tZXNzYWdlIGIvdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL3N0YW5kYXJkLWhlbGxvLm1lc3NhZ2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA4ODM1ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy9zdGFuZGFyZC1oZWxsby5tZXNzYWdlCkBAIC0wLDAgKzEsMjIgQEAKKyMgU3RhbmRhcmQgb3JnLmZyZWVkZXNrdG9wLkRCdXMuSGVsbG8gbWVzc2FnZQorCitWQUxJRF9IRUFERVIgbWV0aG9kX2NhbGwKK0hFQURFUl9GSUVMRCBQQVRICitUWVBFIE9CSkVDVF9QQVRICitPQkpFQ1RfUEFUSCAnL29yZy9mcmVlZGVza3RvcC9EQnVzJworSEVBREVSX0ZJRUxEIElOVEVSRkFDRQorVFlQRSBTVFJJTkcKK1NUUklORyAnb3JnLmZyZWVkZXNrdG9wLkRCdXMnCitIRUFERVJfRklFTEQgTUVNQkVSCitUWVBFIFNUUklORworU1RSSU5HICdIZWxsbycKK0hFQURFUl9GSUVMRCBERVNUSU5BVElPTgorVFlQRSBTVFJJTkcKK1NUUklORyAnb3JnLmZyZWVkZXNrdG9wLkRCdXMnCitIRUFERVJfRklFTEQgU0lHTkFUVVJFCitUWVBFIFNUUklORworU1RSSU5HICcnCitBTElHTiA4CitFTkRfTEVOR1RIIEhlYWRlcgorU1RBUlRfTEVOR1RIIEJvZHkKK0VORF9MRU5HVEggQm9keQpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL3N0YW5kYXJkLWxpc3Qtc2VydmljZXMubWVzc2FnZSBiL3Rlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy9zdGFuZGFyZC1saXN0LXNlcnZpY2VzLm1lc3NhZ2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UxMGFlYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy9zdGFuZGFyZC1saXN0LXNlcnZpY2VzLm1lc3NhZ2UKQEAgLTAsMCArMSwyMiBAQAorIyBTdGFuZGFyZCBvcmcuZnJlZWRlc2t0b3AuREJ1cy5MaXN0U2VydmljZXMgbWVzc2FnZQorCitWQUxJRF9IRUFERVIgbWV0aG9kX2NhbGwKK0hFQURFUl9GSUVMRCBQQVRICitUWVBFIE9CSkVDVF9QQVRICitPQkpFQ1RfUEFUSCAnL29yZy9mcmVlZGVza3RvcC9EQnVzJworSEVBREVSX0ZJRUxEIElOVEVSRkFDRQorVFlQRSBTVFJJTkcKK1NUUklORyAnb3JnLmZyZWVkZXNrdG9wLkRCdXMnCitIRUFERVJfRklFTEQgTUVNQkVSCitUWVBFIFNUUklORworU1RSSU5HICdMaXN0U2VydmljZXMnCitIRUFERVJfRklFTEQgREVTVElOQVRJT04KK1RZUEUgU1RSSU5HCitTVFJJTkcgJ29yZy5mcmVlZGVza3RvcC5EQnVzJworSEVBREVSX0ZJRUxEIFNJR05BVFVSRQorVFlQRSBTVFJJTkcKK1NUUklORyAnJworQUxJR04gOAorRU5EX0xFTkdUSCBIZWFkZXIKK1NUQVJUX0xFTkdUSCBCb2R5CitFTkRfTEVOR1RIIEJvZHkKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy9zdGFuZGFyZC1zZXJ2aWNlLWV4aXN0cy5tZXNzYWdlIGIvdGVzdC9kYXRhL3ZhbGlkLW1lc3NhZ2VzL3N0YW5kYXJkLXNlcnZpY2UtZXhpc3RzLm1lc3NhZ2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI1N2ViNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy9zdGFuZGFyZC1zZXJ2aWNlLWV4aXN0cy5tZXNzYWdlCkBAIC0wLDAgKzEsMjQgQEAKKyMgU3RhbmRhcmQgb3JnLmZyZWVkZXNrdG9wLkRCdXMuU2VydmljZUV4aXN0cyBtZXNzYWdlCisKK1ZBTElEX0hFQURFUiBtZXRob2RfY2FsbAorSEVBREVSX0ZJRUxEIFBBVEgKK1RZUEUgT0JKRUNUX1BBVEgKK09CSkVDVF9QQVRIICcvb3JnL2ZyZWVkZXNrdG9wL0RCdXMnCitIRUFERVJfRklFTEQgSU5URVJGQUNFCitUWVBFIFNUUklORworU1RSSU5HICdvcmcuZnJlZWRlc2t0b3AuREJ1cycKK0hFQURFUl9GSUVMRCBNRU1CRVIKK1RZUEUgU1RSSU5HCitTVFJJTkcgJ1NlcnZpY2VFeGlzdHMnCitIRUFERVJfRklFTEQgREVTVElOQVRJT04KK1RZUEUgU1RSSU5HCitTVFJJTkcgJ29yZy5mcmVlZGVza3RvcC5EQnVzJworSEVBREVSX0ZJRUxEIFNJR05BVFVSRQorVFlQRSBTVFJJTkcKK1NUUklORyAncycKK0FMSUdOIDgKK0VORF9MRU5HVEggSGVhZGVyCitTVEFSVF9MRU5HVEggQm9keQorVFlQRSBTVFJJTkcKK1NUUklORyAnb3JnLmZyZWVkZXNrdG9wLkRCdXMuU2FtcGxlJworRU5EX0xFTkdUSCBCb2R5CmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvdmFsaWQtbWVzc2FnZXMvdW5rbm93bi1oZWFkZXItZmllbGQubWVzc2FnZSBiL3Rlc3QvZGF0YS92YWxpZC1tZXNzYWdlcy91bmtub3duLWhlYWRlci1maWVsZC5tZXNzYWdlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjN2Q2MjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvdmFsaWQtbWVzc2FnZXMvdW5rbm93bi1oZWFkZXItZmllbGQubWVzc2FnZQpAQCAtMCwwICsxLDE5IEBACisjIyBtZXNzYWdlIHdpdGggYSAnbmFtZScgaGVhZGVyIGZpZWxkIGFuZCB1bmtub3duICd1bmtuJyBmaWVsZAorCisjIyBWQUxJRF9IRUFERVIgaW5jbHVkZXMgYSBMRU5HVEggSGVhZGVyIGFuZCBMRU5HVEggQm9keQorVkFMSURfSEVBREVSIG1ldGhvZF9jYWxsCitSRVFVSVJFRF9GSUVMRFMKKworSEVBREVSX0ZJRUxEIFVOS05PV04KK1RZUEUgRElDVAorTEVOR1RIIERpY3QKK1NUQVJUX0xFTkdUSCBEaWN0CitTVFJJTkcgJ2ludDMyJworVFlQRSBJTlQzMgorSU5UMzIgMHgxMjM0NTY3OAorRU5EX0xFTkdUSCBEaWN0CisKK0FMSUdOIDgKK0VORF9MRU5HVEggSGVhZGVyCitTVEFSVF9MRU5HVEggQm9keQorRU5EX0xFTkdUSCBCb2R5CmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy1zeXN0ZW0vLmdpdGlnbm9yZSBiL3Rlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzLXN5c3RlbS8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlM2FkMWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy1zeXN0ZW0vLmdpdGlnbm9yZQpAQCAtMCwwICsxIEBACisqLnNlcnZpY2UKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzLXN5c3RlbS9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVFY2hvU2VydmljZS5zZXJ2aWNlLmluIGIvdGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMtc3lzdGVtL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZUVjaG9TZXJ2aWNlLnNlcnZpY2UuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA3NmYzYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzLXN5c3RlbS9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVFY2hvU2VydmljZS5zZXJ2aWNlLmluCkBAIC0wLDAgKzEsNSBAQAorW0QtQlVTIFNlcnZpY2VdCitOYW1lPW9yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZUVjaG9TZXJ2aWNlCitFeGVjPUBEQlVTX1RFU1RfRVhFQ0AvdGVzdC1zZXJ2aWNlQEVYRUVYVEAKK1VzZXI9YW55cmFuZG9tdXNlcgorCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy1zeXN0ZW0vb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlU2VnZmF1bHRTZXJ2aWNlLnNlcnZpY2UuaW4gYi90ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy1zeXN0ZW0vb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlU2VnZmF1bHRTZXJ2aWNlLnNlcnZpY2UuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA1ZDcxNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzLXN5c3RlbS9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVTZWdmYXVsdFNlcnZpY2Uuc2VydmljZS5pbgpAQCAtMCwwICsxLDUgQEAKK1tELUJVUyBTZXJ2aWNlXQorTmFtZT1vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVTZWdmYXVsdFNlcnZpY2UKK0V4ZWM9QERCVVNfVEVTVF9FWEVDQC90ZXN0LXNlZ2ZhdWx0QEVYRUVYVEAKK1VzZXI9YW55cmFuZG9tdXNlcgorCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy1zeXN0ZW0vb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlU2hlbGxFY2hvU2VydmljZUZhaWwuc2VydmljZS5pbiBiL3Rlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzLXN5c3RlbS9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVTaGVsbEVjaG9TZXJ2aWNlRmFpbC5zZXJ2aWNlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3MDgzNWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy1zeXN0ZW0vb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlU2hlbGxFY2hvU2VydmljZUZhaWwuc2VydmljZS5pbgpAQCAtMCwwICsxLDUgQEAKK1tELUJVUyBTZXJ2aWNlXQorTmFtZT1vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVTaGVsbEVjaG9TZXJ2aWNlRmFpbAorRXhlYz1AREJVU19URVNUX0VYRUNAL3Rlc3Qtc2hlbGwtc2VydmljZUBFWEVFWFRAICJ0aGlzIHNob3VsZCAnZmFpbCcgYmVjYXVzZSBvZiBhbiB1bnRlcm1pbmF0ZWQgcXVvdGUKK1VzZXI9YW55cmFuZG9tdXNlcgorCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy1zeXN0ZW0vb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlU2hlbGxFY2hvU2VydmljZVN1Y2Nlc3Muc2VydmljZS5pbiBiL3Rlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzLXN5c3RlbS9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVTaGVsbEVjaG9TZXJ2aWNlU3VjY2Vzcy5zZXJ2aWNlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2NDcyNjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy1zeXN0ZW0vb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlU2hlbGxFY2hvU2VydmljZVN1Y2Nlc3Muc2VydmljZS5pbgpAQCAtMCwwICsxLDUgQEAKK1tELUJVUyBTZXJ2aWNlXQorTmFtZT1vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVTaGVsbEVjaG9TZXJ2aWNlU3VjY2VzcworRXhlYz1AREJVU19URVNUX0VYRUNAL3Rlc3Qtc2hlbGwtc2VydmljZUBFWEVFWFRAIC10ZXN0ICJ0aGF0IiAnd2UgZ2V0JyBiYWNrIC0td2hhdCAid2UgcHV0IGluIgorVXNlcj1hbnlyYW5kb211c2VyCisKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzLy5naXRpZ25vcmUgYi90ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlM2FkMWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy8uZ2l0aWdub3JlCkBAIC0wLDAgKzEgQEAKKyouc2VydmljZQpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMvb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlLlByaXZTZXJ2ZXIuc2VydmljZS5pbiBiL3Rlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZS5Qcml2U2VydmVyLnNlcnZpY2UuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZkZmVhZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZS5Qcml2U2VydmVyLnNlcnZpY2UuaW4KQEAgLTAsMCArMSw0IEBACitbRC1CVVMgU2VydmljZV0KK05hbWU9b3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlLlByaXZTZXJ2ZXIKK0V4ZWM9QERCVVNfVEVTVF9FWEVDQC9uYW1lLXRlc3QvdGVzdC1wcml2c2VydmVyQEVYRUVYVEAKKwpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMvb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlRWNob1NlcnZpY2Uuc2VydmljZS5pbiBiL3Rlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZUVjaG9TZXJ2aWNlLnNlcnZpY2UuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTIyYTc3ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZUVjaG9TZXJ2aWNlLnNlcnZpY2UuaW4KQEAgLTAsMCArMSwzIEBACitbRC1CVVMgU2VydmljZV0KK05hbWU9b3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlRWNob1NlcnZpY2UKK0V4ZWM9QERCVVNfVEVTVF9FWEVDQC90ZXN0LXNlcnZpY2VARVhFRVhUQApkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMvb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlRm9ya2luZ0VjaG9TZXJ2aWNlLnNlcnZpY2UuaW4gYi90ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVGb3JraW5nRWNob1NlcnZpY2Uuc2VydmljZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzM4NjJjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMvb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlRm9ya2luZ0VjaG9TZXJ2aWNlLnNlcnZpY2UuaW4KQEAgLTAsMCArMSwzIEBACitbRC1CVVMgU2VydmljZV0KK05hbWU9b3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlRm9ya2luZ0VjaG9TZXJ2aWNlCitFeGVjPUBEQlVTX1RFU1RfRVhFQ0AvdGVzdC1zZXJ2aWNlQEVYRUVYVEAgb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlRm9ya2luZ0VjaG9TZXJ2aWNlIGZvcmsKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZVNlZ2ZhdWx0U2VydmljZS5zZXJ2aWNlLmluIGIvdGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMvb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlU2VnZmF1bHRTZXJ2aWNlLnNlcnZpY2UuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYyNTQyNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZVNlZ2ZhdWx0U2VydmljZS5zZXJ2aWNlLmluCkBAIC0wLDAgKzEsNCBAQAorW0QtQlVTIFNlcnZpY2VdCitOYW1lPW9yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZVNlZ2ZhdWx0U2VydmljZQorRXhlYz1AREJVU19URVNUX0VYRUNAL3Rlc3Qtc2VnZmF1bHRARVhFRVhUQAorCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVTaGVsbEVjaG9TZXJ2aWNlRmFpbC5zZXJ2aWNlLmluIGIvdGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMvb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlU2hlbGxFY2hvU2VydmljZUZhaWwuc2VydmljZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjU5NjRhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL3ZhbGlkLXNlcnZpY2UtZmlsZXMvb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlU2hlbGxFY2hvU2VydmljZUZhaWwuc2VydmljZS5pbgpAQCAtMCwwICsxLDMgQEAKK1tELUJVUyBTZXJ2aWNlXQorTmFtZT1vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVTaGVsbEVjaG9TZXJ2aWNlRmFpbAorRXhlYz1AREJVU19URVNUX0VYRUNAL3Rlc3Qtc2hlbGwtc2VydmljZUBFWEVFWFRAICJ0aGlzIHNob3VsZCAnZmFpbCcgYmVjYXVzZSBvZiBhbiB1bnRlcm1pbmF0ZWQgcXVvdGUKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzL29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZVNoZWxsRWNob1NlcnZpY2VTdWNjZXNzLnNlcnZpY2UuaW4gYi90ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVTaGVsbEVjaG9TZXJ2aWNlU3VjY2Vzcy5zZXJ2aWNlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1Mjg4N2UKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvdmFsaWQtc2VydmljZS1maWxlcy9vcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVTaGVsbEVjaG9TZXJ2aWNlU3VjY2Vzcy5zZXJ2aWNlLmluCkBAIC0wLDAgKzEsNCBAQAorW0QtQlVTIFNlcnZpY2VdCitOYW1lPW9yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZVNoZWxsRWNob1NlcnZpY2VTdWNjZXNzCitFeGVjPUBEQlVTX1RFU1RfRVhFQ0AvdGVzdC1zaGVsbC1zZXJ2aWNlQEVYRUVYVEAgLXRlc3QgInRoYXQiICd3ZSBnZXQnIGJhY2sgLS13aGF0ICJ3ZSBwdXQgaW4iCisKZGlmZiAtLWdpdCBhL3Rlc3QvZGJ1cy1kYWVtb24tZWF2ZXNkcm9wLmMgYi90ZXN0L2RidXMtZGFlbW9uLWVhdmVzZHJvcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyYzA4NzIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RidXMtZGFlbW9uLWVhdmVzZHJvcC5jCkBAIC0wLDAgKzEsNDM1IEBACisvKiBJbnRlZ3JhdGlvbiB0ZXN0cyBmb3IgdGhlIGVhdmVzZHJvcD10cnVlfGZhbHNlIGtleXdvcmQgaW4gREJ1c01hdGNoUnVsZQorICoKKyAqIEF1dGhvcjogQ29zaW1vIEFsZmFyYW5vIDxjb3NpbW8uYWxmYXJhbm9AY29sbGFib3JhLmNvLnVrPgorICogQmFzZWQgb246IHRlc3RzL2RidXMtZGFlbW9uLmMgYnkgU2ltb24gTWNWaXR0aWUKKyAqIENvcHlyaWdodCDCqSAyMDEwLTIwMTEgTm9raWEgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMKKyAqICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sCisgKiBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLAorICogcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwKKyAqIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCisgKiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQorICogaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgInRlc3QtdXRpbHMtZ2xpYi5oIgorCisjZGVmaW5lIFNFTkRFUl9OQU1FICJ0ZXN0LmVhdmVzZHJvcC5zZW5kZXIiCisjZGVmaW5lIFNFTkRFUl9QQVRIICIvdGVzdC9lYXZlc2Ryb3Avc2VuZGVyIgorI2RlZmluZSBTRU5ERVJfSUZBQ0UgU0VOREVSX05BTUUKKyNkZWZpbmUgU0VOREVSX1NJR05BTF9OQU1FICJTaWduYWwiCisjZGVmaW5lIFNFTkRFUl9TVE9QUEVSX05BTUUgIlN0b3BwZXIiCisKKy8qIFRoaXMgcnVsZSBpcyBlcXVpdmFsZW50IHRvIHRoZSBvbmUgYWRkZWQgdG8gYSBwcm94eSBjb25uZWN0aW5nIHRvCisgKiBTRU5ERVJfTkFNRStTRU5ERVJfSUZBQ0UsIHBsdXMgcmVzdHJpY3Rpbmcgb24gc2lnbmFsIG5hbWUuCisgKiBCZWluZyBtb3JlIHJlc3RyaWN0aXZlLCBpZiB0aGUgY29ubmVjdGlvbiByZWNlaXZlcyB3aGF0IHdlIG5lZWQsIGZvciBzdXJlCisgKiB0aGUgb3JpZ2luYWwgcHJveHkgcnVsZSB3aWxsIG1hdGNoIGl0ICovCisjZGVmaW5lIFJFQ0VJVkVSX1JVTEUgInNlbmRlcj0nIiBTRU5ERVJfTkFNRSAiJywiIFwKKyAgImludGVyZmFjZT0nIiBTRU5ERVJfSUZBQ0UgIicsIiBcCisgICJ0eXBlPSdzaWduYWwnLCIgXAorICAibWVtYmVyPSciIFNFTkRFUl9TSUdOQUxfTkFNRSAiJyIKKyNkZWZpbmUgUE9MSVRFTElTVEVORVJfUlVMRSBSRUNFSVZFUl9SVUxFCisjZGVmaW5lIEVBVkVTRFJPUFBFUl9SVUxFIFJFQ0VJVkVSX1JVTEUgIixlYXZlc2Ryb3A9dHJ1ZSIKKworI2RlZmluZSBTVE9QUEVSX1JVTEUgInNlbmRlcj0nIiBTRU5ERVJfTkFNRSBcCisgICInLGludGVyZmFjZT0nIiBTRU5ERVJfSUZBQ0UgIicsdHlwZT0nc2lnbmFsJyxtZW1iZXI9JyIgU0VOREVSX1NUT1BQRVJfTkFNRSAiJyIKKworLyogYSBjb25uZWN0aW9uIHJlY2VpdmVkIGEgc2lnbmFsIHRvIHdob20/ICovCit0eXBlZGVmIGVudW0geworICBOT05FX1lFVCA9IDAsCisgIFRPX01FLAorICBUT19PVEhFUiwKKyAgQlJPQURDQVNULAorfSBTaWduYWxEc3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBUZXN0TWFpbkNvbnRleHQgKmN0eDsKKyAgICBEQnVzRXJyb3IgZTsKKyAgICBHRXJyb3IgKmdlOworCisgICAgR1BpZCBkYWVtb25fcGlkOworCisgICAgLyogZWF2ZWRyb3Aga2V5d29yZCB0ZXN0cyAqLworICAgIERCdXNDb25uZWN0aW9uICpzZW5kZXI7CisgICAgREJ1c0Nvbm5lY3Rpb24gKnJlY2VpdmVyOworICAgIFNpZ25hbERzdCByZWNlaXZlcl9kc3Q7CisgICAgZGJ1c19ib29sX3QgcmVjZWl2ZXJfZ290X3N0b3BwZXI7CisgICAgREJ1c0Nvbm5lY3Rpb24gKmVhdmVzZHJvcHBlcjsKKyAgICBTaWduYWxEc3QgZWF2ZXNkcm9wcGVyX2RzdDsKKyAgICBkYnVzX2Jvb2xfdCBlYXZlc2Ryb3BwZXJfZ290X3N0b3BwZXI7CisgICAgREJ1c0Nvbm5lY3Rpb24gKnBvbGl0ZWxpc3RlbmVyOworICAgIFNpZ25hbERzdCBwb2xpdGVsaXN0ZW5lcl9kc3Q7CisgICAgZGJ1c19ib29sX3QgcG9saXRlbGlzdGVuZXJfZ290X3N0b3BwZXI7Cit9IEZpeHR1cmU7CisKKy8qIHNlbmQgYSB1bmljYXN0IHNpZ25hbCB0byA8c2VsZj4gdG8gZW5zdXJlIHRoYXQgbm8gb3RoZXIgY29ubmVjdGlvbgorICogbGlzdGVuaW5nIGlzIHRoZSBhY3R1YWwgcmVjaXBpZW50IGZvciB0aGUgc2lnbmFsICovCitzdGF0aWMgREJ1c0hhbmRsZXJSZXN1bHQKK3NlbmRlcl9zZW5kX3VuaWNhc3RfdG9fc2VuZGVyIChGaXh0dXJlICpmKQoreworICBEQnVzTWVzc2FnZSAqc2lnbmFsOworCisgIHNpZ25hbCA9IGRidXNfbWVzc2FnZV9uZXdfc2lnbmFsIChTRU5ERVJfUEFUSCwgU0VOREVSX0lGQUNFLAorICAgICAgU0VOREVSX1NJR05BTF9OQU1FKTsKKyAgaWYgKHNpZ25hbCA9PSBOVUxMKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKworICBpZiAoIWRidXNfbWVzc2FnZV9zZXRfZGVzdGluYXRpb24gKHNpZ25hbCwgZGJ1c19idXNfZ2V0X3VuaXF1ZV9uYW1lIChmLT5zZW5kZXIpKSkKKyAgICBnX2Vycm9yICgiT09NIik7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoZi0+c2VuZGVyLCBzaWduYWwsIE5VTEwpKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKHNpZ25hbCk7CisKKyAgcmV0dXJuIERCVVNfSEFORExFUl9SRVNVTFRfSEFORExFRDsKK30KKworLyogc2VuZCBhIHVuaWNhc3Qgc2lnbmFsIHRvIDxyZWNlaXZlcj4sIG1ha2luZyA8cG9saXRlbGlzdGVuZXI+IGFuZAorICogPGVhdmVzZHJvcHBlcj4gbm90IGEgYWN0dWFsIHJlY2lwaWVudCBmb3IgaXQgKi8KK3N0YXRpYyBEQnVzSGFuZGxlclJlc3VsdAorc2VuZGVyX3NlbmRfdW5pY2FzdF90b19yZWNlaXZlciAoRml4dHVyZSAqZikKK3sKKyAgREJ1c01lc3NhZ2UgKnNpZ25hbDsKKworICBzaWduYWwgPSBkYnVzX21lc3NhZ2VfbmV3X3NpZ25hbCAoU0VOREVSX1BBVEgsIFNFTkRFUl9JRkFDRSwgU0VOREVSX1NJR05BTF9OQU1FKTsKKyAgaWYgKHNpZ25hbCA9PSBOVUxMKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKworICBpZiAoIWRidXNfbWVzc2FnZV9zZXRfZGVzdGluYXRpb24gKHNpZ25hbCwgZGJ1c19idXNfZ2V0X3VuaXF1ZV9uYW1lIChmLT5yZWNlaXZlcikpKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZW5kIChmLT5zZW5kZXIsIHNpZ25hbCwgTlVMTCkpCisgICAgZ19lcnJvciAoIk9PTSIpOworCisgIGRidXNfbWVzc2FnZV91bnJlZiAoc2lnbmFsKTsKKworICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9IQU5ETEVEOworfQorCitzdGF0aWMgREJ1c0hhbmRsZXJSZXN1bHQKK3NlbmRlcl9zZW5kX2Jyb2FkY2FzdCAoRml4dHVyZSAqZikKK3sKKyAgREJ1c01lc3NhZ2UgKnNpZ25hbDsKKworICBzaWduYWwgPSBkYnVzX21lc3NhZ2VfbmV3X3NpZ25hbCAoU0VOREVSX1BBVEgsIFNFTkRFUl9JRkFDRSwgU0VOREVSX1NJR05BTF9OQU1FKTsKKyAgaWYgKHNpZ25hbCA9PSBOVUxMKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKworICBpZiAoIWRidXNfbWVzc2FnZV9zZXRfZGVzdGluYXRpb24gKHNpZ25hbCwgTlVMTCkpCisgICAgZ19lcnJvciAoIk9PTSIpOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX3NlbmQgKGYtPnNlbmRlciwgc2lnbmFsLCBOVUxMKSkKKyAgICBnX2Vycm9yICgiT09NIik7CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChzaWduYWwpOworCisgIHJldHVybiBEQlVTX0hBTkRMRVJfUkVTVUxUX0hBTkRMRUQ7Cit9CisKKy8qIFNlbmQgc3BlY2lhbCBicm9hZGNhc3Qgc2lnbmFsIHRvIGluZGljYXRlIHRoYXQgdGhlIGNvbm5lY3Rpb25zIGNhbiAic3RvcCIKKyAqIGxpc3RlbmluZyBhbmQgY2hlY2sgdGhlaXIgcmVzdWx0cy4KKyAqIERCdXMgZG9lcyBub3QgcmUtb3JkZXIgbWVzc2FnZXMsIHNvIHdoZW4gdGhlIHRocmVlIGNvbm5lY3Rpb25zIGhhdmUgcmVjZWl2ZWQKKyAqIHRoaXMgc2lnbmFsLCB3ZSBhcmUgc3VyZSB0aGF0IGFueSBtZXNzYWdlIHNlbnQgYmVmb3JlIGl0IGhhcyBhbHNvIGJlZW4KKyAqIGRpc3BhdGNoZWQuICovCitzdGF0aWMgREJ1c0hhbmRsZXJSZXN1bHQKK3NlbmRlcl9zZW5kX3N0b3BwZXIgKEZpeHR1cmUgKmYpCit7CisgIERCdXNNZXNzYWdlICpzaWduYWw7CisKKyAgc2lnbmFsID0gZGJ1c19tZXNzYWdlX25ld19zaWduYWwgKFNFTkRFUl9QQVRILCBTRU5ERVJfSUZBQ0UsIFNFTkRFUl9TVE9QUEVSX05BTUUpOworICBpZiAoc2lnbmFsID09IE5VTEwpCisgICAgZ19lcnJvciAoIk9PTSIpOworCisgIGlmICghZGJ1c19tZXNzYWdlX3NldF9kZXN0aW5hdGlvbiAoc2lnbmFsLCBOVUxMKSkKKyAgICBnX2Vycm9yICgiT09NIik7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoZi0+c2VuZGVyLCBzaWduYWwsIE5VTEwpKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKHNpZ25hbCk7CisKKyAgcmV0dXJuIERCVVNfSEFORExFUl9SRVNVTFRfSEFORExFRDsKK30KKworLyogSWdub3JlIE5hbWVBY3F1aXJlZCwgdGhlbiBkZXBlbmRpbmcgb24gdGhlIHNpZ25hbCByZWNlaXZlZDoKKyAqIC0gdXBkYXRlcyBmLT48Y29ubj5fZHN0IGJhc2VkIG9uIHRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgbWVzc2FnZQorICogLSBhc3NlcnRzIHRoYXQgPGNvbm4+IHJlY2VpdmVkIHRoZSBzdG9wIHNpZ25hbAorICovCitzdGF0aWMgREJ1c0hhbmRsZXJSZXN1bHQKK3NpZ25hbF9maWx0ZXIgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgIERCdXNNZXNzYWdlICptZXNzYWdlLAorICAgIHZvaWQgKnVzZXJfZGF0YSkKK3sKKyAgRml4dHVyZSAqZiA9IHVzZXJfZGF0YTsKKyAgU2lnbmFsRHN0ICpkc3QgPSBOVUxMOworICBEQnVzQ29ubmVjdGlvbiAqKmNvbm47CisgIGRidXNfYm9vbF90ICpnb3Rfc3RvcHBlcjsKKworICBpZiAoMCA9PSBzdHJjbXAgKGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKSwgIk5hbWVBY3F1aXJlZCIpKQorICAgIHJldHVybiBEQlVTX0hBTkRMRVJfUkVTVUxUX05PVF9ZRVRfSEFORExFRDsKKworICBpZiAoY29ubmVjdGlvbiA9PSBmLT5yZWNlaXZlcikKKyAgICB7CisgICAgICBkc3QgPSAmKGYtPnJlY2VpdmVyX2RzdCk7CisgICAgICBjb25uID0gJihmLT5yZWNlaXZlcik7CisgICAgICBnb3Rfc3RvcHBlciA9ICYoZi0+cmVjZWl2ZXJfZ290X3N0b3BwZXIpOworICAgIH0KKyAgZWxzZSBpZiAoY29ubmVjdGlvbiA9PSBmLT5lYXZlc2Ryb3BwZXIpCisgICAgeworICAgICAgZHN0ID0gJihmLT5lYXZlc2Ryb3BwZXJfZHN0KTsKKyAgICAgIGNvbm4gPSAmKGYtPmVhdmVzZHJvcHBlcik7CisgICAgICBnb3Rfc3RvcHBlciA9ICYoZi0+ZWF2ZXNkcm9wcGVyX2dvdF9zdG9wcGVyKTsKKyAgICB9CisgIGVsc2UgaWYgKGNvbm5lY3Rpb24gPT0gZi0+cG9saXRlbGlzdGVuZXIpCisgICAgeworICAgICAgZHN0ID0gJihmLT5wb2xpdGVsaXN0ZW5lcl9kc3QpOworICAgICAgY29ubiA9ICYoZi0+cG9saXRlbGlzdGVuZXIpOworICAgICAgZ290X3N0b3BwZXIgPSAmKGYtPnBvbGl0ZWxpc3RlbmVyX2dvdF9zdG9wcGVyKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBnX2Vycm9yICgiY29ubmVjdGlvbiBub3QgbWF0Y2hpbmciKTsKKyAgICB9CisKKyAgaWYgKDAgPT0gc3RyY21wIChkYnVzX21lc3NhZ2VfZ2V0X21lbWJlciAobWVzc2FnZSksIFNFTkRFUl9TSUdOQUxfTkFNRSkpCisgICAgeworICAgICAgaWYgKGRidXNfbWVzc2FnZV9nZXRfZGVzdGluYXRpb24gKG1lc3NhZ2UpID09IE5VTEwpCisgICAgICAgICpkc3QgPSBCUk9BRENBU1Q7CisgICAgICBlbHNlIGlmICgwID09IHN0cmNtcCAoZGJ1c19tZXNzYWdlX2dldF9kZXN0aW5hdGlvbiAobWVzc2FnZSksIGRidXNfYnVzX2dldF91bmlxdWVfbmFtZSAoKmNvbm4pKSkKKyAgICAgICAgKmRzdCA9IFRPX01FOworICAgICAgZWxzZSAvKiBpZiAoZGJ1c19tZXNzYWdlX2dldF9kZXN0aW5hdGlvbiAobWVzc2FnZSkgIT0gTlVMTCkgKi8KKyAgICAgICAgKmRzdCA9IFRPX09USEVSOworICAgIH0KKyAgZWxzZSBpZiAoMCA9PSBzdHJjbXAgKGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKSwgU0VOREVSX1NUT1BQRVJfTkFNRSkpCisgICAgeworICAgICAgKmdvdF9zdG9wcGVyID0gVFJVRTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBnX2Vycm9yICgiZ290IHVua25vd24gbWVtYmVyIGZyb20gbWVzc2FnZTogJXMiLAorICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKSk7CisgICAgfQorCisgIHJldHVybiBEQlVTX0hBTkRMRVJfUkVTVUxUX05PVF9ZRVRfSEFORExFRDsKK30KKworc3RhdGljIHZvaWQKK2FkZF9yZWNlaXZlcl9maWx0ZXIgKEZpeHR1cmUgKmYpCit7CisgIERCdXNFcnJvciBlID0gREJVU19FUlJPUl9JTklUOworCisgIGRidXNfYnVzX2FkZF9tYXRjaCAoZi0+cmVjZWl2ZXIsIFJFQ0VJVkVSX1JVTEUsICZlKTsKKyAgdGVzdF9hc3NlcnRfbm9fZXJyb3IgKCZlKTsKKyAgZGJ1c19idXNfYWRkX21hdGNoIChmLT5yZWNlaXZlciwgU1RPUFBFUl9SVUxFLCAmZSk7CisgIHRlc3RfYXNzZXJ0X25vX2Vycm9yICgmZSk7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fYWRkX2ZpbHRlciAoZi0+cmVjZWl2ZXIsCisgICAgICAgIHNpZ25hbF9maWx0ZXIsIGYsIE5VTEwpKQorICAgIGdfZXJyb3IgKCJPT00iKTsKK30KKworc3RhdGljIHZvaWQKK2FkZF9lYXZlc2Ryb3BwZXJfZmlsdGVyIChGaXh0dXJlICpmKQoreworICBEQnVzRXJyb3IgZSA9IERCVVNfRVJST1JfSU5JVDsKKworICBkYnVzX2J1c19hZGRfbWF0Y2ggKGYtPmVhdmVzZHJvcHBlciwgRUFWRVNEUk9QUEVSX1JVTEUsICZlKTsKKyAgdGVzdF9hc3NlcnRfbm9fZXJyb3IgKCZlKTsKKyAgZGJ1c19idXNfYWRkX21hdGNoIChmLT5lYXZlc2Ryb3BwZXIsIFNUT1BQRVJfUlVMRSwgJmUpOworICB0ZXN0X2Fzc2VydF9ub19lcnJvciAoJmUpOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX2FkZF9maWx0ZXIgKGYtPmVhdmVzZHJvcHBlciwKKyAgICAgICAgc2lnbmFsX2ZpbHRlciwgZiwgTlVMTCkpCisgICAgZ19lcnJvciAoIk9PTSIpOworfQorCitzdGF0aWMgdm9pZAorYWRkX3BvbGl0ZWxpc3RlbmVyX2ZpbHRlciAoRml4dHVyZSAqZikKK3sKKyAgREJ1c0Vycm9yIGUgPSBEQlVTX0VSUk9SX0lOSVQ7CisKKyAgZGJ1c19idXNfYWRkX21hdGNoIChmLT5wb2xpdGVsaXN0ZW5lciwgUE9MSVRFTElTVEVORVJfUlVMRSwgJmUpOworICB0ZXN0X2Fzc2VydF9ub19lcnJvciAoJmUpOworICBkYnVzX2J1c19hZGRfbWF0Y2ggKGYtPnBvbGl0ZWxpc3RlbmVyLCBTVE9QUEVSX1JVTEUsICZlKTsKKyAgdGVzdF9hc3NlcnRfbm9fZXJyb3IgKCZlKTsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9hZGRfZmlsdGVyIChmLT5wb2xpdGVsaXN0ZW5lciwKKyAgICAgICAgc2lnbmFsX2ZpbHRlciwgZiwgTlVMTCkpCisgICAgZ19lcnJvciAoIk9PTSIpOworfQorCitzdGF0aWMgdm9pZAorc2V0dXAgKEZpeHR1cmUgKmYsCisgICAgZ2NvbnN0cG9pbnRlciBjb250ZXh0IEdfR05VQ19VTlVTRUQpCit7CisgIGdjaGFyICphZGRyZXNzOworCisgIGYtPmN0eCA9IHRlc3RfbWFpbl9jb250ZXh0X2dldCAoKTsKKworICBmLT5nZSA9IE5VTEw7CisgIGRidXNfZXJyb3JfaW5pdCAoJmYtPmUpOworCisgIGFkZHJlc3MgPSB0ZXN0X2dldF9kYnVzX2RhZW1vbiAoTlVMTCwgVEVTVF9VU0VSX01FLCBOVUxMLCAmZi0+ZGFlbW9uX3BpZCk7CisKKyAgZi0+c2VuZGVyID0gdGVzdF9jb25uZWN0X3RvX2J1cyAoZi0+Y3R4LCBhZGRyZXNzKTsKKyAgZGJ1c19idXNfcmVxdWVzdF9uYW1lIChmLT5zZW5kZXIsIFNFTkRFUl9OQU1FLCBEQlVTX05BTUVfRkxBR19ET19OT1RfUVVFVUUsCisgICAgICAmKGYtPmUpKTsKKyAgZi0+cmVjZWl2ZXIgPSB0ZXN0X2Nvbm5lY3RfdG9fYnVzIChmLT5jdHgsIGFkZHJlc3MpOworICBmLT5lYXZlc2Ryb3BwZXIgPSB0ZXN0X2Nvbm5lY3RfdG9fYnVzIChmLT5jdHgsIGFkZHJlc3MpOworICBmLT5wb2xpdGVsaXN0ZW5lciA9IHRlc3RfY29ubmVjdF90b19idXMgKGYtPmN0eCwgYWRkcmVzcyk7CisgIGFkZF9yZWNlaXZlcl9maWx0ZXIgKGYpOworICBhZGRfcG9saXRlbGlzdGVuZXJfZmlsdGVyIChmKTsKKyAgYWRkX2VhdmVzZHJvcHBlcl9maWx0ZXIgKGYpOworCisgIGdfZnJlZSAoYWRkcmVzcyk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X2VhdmVzZHJvcF9icm9hZGNhc3QgKEZpeHR1cmUgKmYsCisgICAgZ2NvbnN0cG9pbnRlciBjb250ZXh0IEdfR05VQ19VTlVTRUQpCit7CisgIHNlbmRlcl9zZW5kX2Jyb2FkY2FzdCAoZik7CisgIHNlbmRlcl9zZW5kX3N0b3BwZXIgKGYpOworCisgIHdoaWxlICghZi0+cmVjZWl2ZXJfZ290X3N0b3BwZXIgfHwKKyAgICAgICFmLT5wb2xpdGVsaXN0ZW5lcl9nb3Rfc3RvcHBlciB8fAorICAgICAgIWYtPmVhdmVzZHJvcHBlcl9nb3Rfc3RvcHBlcikKKyAgICB0ZXN0X21haW5fY29udGV4dF9pdGVyYXRlIChmLT5jdHgsIFRSVUUpOworCisgIC8qIGFsbCB0aGUgdGhyZWUgY29ubmVjdGlvbiBjYW4gcmVjZWl2ZSBhIGJyb2FkY2FzdCAqLworICBnX2Fzc2VydF9jbXBpbnQgKGYtPnJlY2VpdmVyX2RzdCwgPT0sIEJST0FEQ0FTVCk7CisgIGdfYXNzZXJ0X2NtcGludCAoZi0+cG9saXRlbGlzdGVuZXJfZHN0LCA9PSwgQlJPQURDQVNUKTsKKyAgZ19hc3NlcnRfY21waW50IChmLT5lYXZlc2Ryb3BwZXJfZHN0LCA9PSwgQlJPQURDQVNUKTsKK30KKworLyogYSB3YXkgdG8gc2F5IHRoYXQgbm9uZSBvZiB0aGUgbGlzdGVuaW5nIGNvbm5lY3Rpb24gYXJlIGRlc3RpbmF0aW9uIG9mIHRoZQorICogc2lnbmFsICovCitzdGF0aWMgdm9pZAordGVzdF9lYXZlc2Ryb3BfdW5pY2FzdF90b19zZW5kZXIgKEZpeHR1cmUgKmYsCisgICAgZ2NvbnN0cG9pbnRlciBjb250ZXh0IEdfR05VQ19VTlVTRUQpCit7CisgIHNlbmRlcl9zZW5kX3VuaWNhc3RfdG9fc2VuZGVyIChmKTsKKyAgc2VuZGVyX3NlbmRfc3RvcHBlciAoZik7CisKKyAgd2hpbGUgKCFmLT5yZWNlaXZlcl9nb3Rfc3RvcHBlciB8fAorICAgICAgIWYtPnBvbGl0ZWxpc3RlbmVyX2dvdF9zdG9wcGVyIHx8CisgICAgICAhZi0+ZWF2ZXNkcm9wcGVyX2dvdF9zdG9wcGVyKQorICAgIHRlc3RfbWFpbl9jb250ZXh0X2l0ZXJhdGUgKGYtPmN0eCwgVFJVRSk7CisKKyAgLyogbm90IGRpcmVjdGVkIHRvIGl0IGFuZCBub3QgYnJvYWRjYXN0ZWQsIHRoZXkgY2Fubm90IHJlY2VpdmUgaXQgKi8KKyAgZ19hc3NlcnRfY21waW50IChmLT5yZWNlaXZlcl9kc3QsID09LCBOT05FX1lFVCk7CisgIGdfYXNzZXJ0X2NtcGludCAoZi0+cG9saXRlbGlzdGVuZXJfZHN0LCA9PSwgTk9ORV9ZRVQpOworICAvKiBlYXZlc2Ryb3A9dHJ1ZSwgaXQgd2lsbCByZWNlaXZlIHRoZSBzaWduYWwgZXZlbiB0aG91Z2ggaXQncyBub3QgZGlyZWN0ZWQKKyAgICogdG8gaXQgKi8KKyAgZ19hc3NlcnRfY21waW50IChmLT5lYXZlc2Ryb3BwZXJfZHN0LCA9PSwgVE9fT1RIRVIpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9lYXZlc2Ryb3BfdW5pY2FzdF90b19yZWNlaXZlciAoRml4dHVyZSAqZiwKKyAgICBnY29uc3Rwb2ludGVyIGNvbnRleHQgR19HTlVDX1VOVVNFRCkKK3sKKyAgc2VuZGVyX3NlbmRfdW5pY2FzdF90b19yZWNlaXZlciAoZik7CisgIHNlbmRlcl9zZW5kX3N0b3BwZXIgKGYpOworCisgIHdoaWxlICghZi0+cmVjZWl2ZXJfZ290X3N0b3BwZXIgfHwKKyAgICAgICFmLT5wb2xpdGVsaXN0ZW5lcl9nb3Rfc3RvcHBlciB8fAorICAgICAgIWYtPmVhdmVzZHJvcHBlcl9nb3Rfc3RvcHBlcikKKyAgICB0ZXN0X21haW5fY29udGV4dF9pdGVyYXRlIChmLT5jdHgsIFRSVUUpOworCisgIC8qIGRpcmVjdCB0byBoaW0gKi8KKyAgZ19hc3NlcnRfY21waW50IChmLT5yZWNlaXZlcl9kc3QsID09LCBUT19NRSk7CisgIC8qIG5vdCBkaXJlY3RlZCB0byBpdCBhbmQgbm90IGJyb2FkY2FzdGVkLCBpdCBjYW5ub3QgcmVjZWl2ZSBpdCAqLworICBnX2Fzc2VydF9jbXBpbnQgKGYtPnBvbGl0ZWxpc3RlbmVyX2RzdCwgPT0sIE5PTkVfWUVUKTsKKyAgLyogZWF2ZXNkcm9wPXRydWUsIGl0IHdpbGwgcmVjZWl2ZSB0aGUgc2lnbmFsIGV2ZW4gdGhvdWdoIGl0J3Mgbm90IGRpcmVjdGVkCisgICAqIHRvIGl0ICovCisgIGdfYXNzZXJ0X2NtcGludCAoZi0+ZWF2ZXNkcm9wcGVyX2RzdCwgPT0sIFRPX09USEVSKTsKK30KKworc3RhdGljIHZvaWQKK3RlYXJkb3duIChGaXh0dXJlICpmLAorICAgIGdjb25zdHBvaW50ZXIgY29udGV4dCBHX0dOVUNfVU5VU0VEKQoreworICBkYnVzX2Vycm9yX2ZyZWUgKCZmLT5lKTsKKyAgZ19jbGVhcl9lcnJvciAoJmYtPmdlKTsKKworICBpZiAoZi0+c2VuZGVyICE9IE5VTEwpCisgICAgeworICAgICAgZGJ1c19jb25uZWN0aW9uX2Nsb3NlIChmLT5zZW5kZXIpOworICAgICAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChmLT5zZW5kZXIpOworICAgICAgZi0+c2VuZGVyID0gTlVMTDsKKyAgICB9CisKKyAgaWYgKGYtPnJlY2VpdmVyICE9IE5VTEwpCisgICAgeworICAgICAgZGJ1c19jb25uZWN0aW9uX3JlbW92ZV9maWx0ZXIgKGYtPnJlY2VpdmVyLAorICAgICAgICAgIHNpZ25hbF9maWx0ZXIsIGYpOworCisgICAgICBkYnVzX2Nvbm5lY3Rpb25fY2xvc2UgKGYtPnJlY2VpdmVyKTsKKyAgICAgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoZi0+cmVjZWl2ZXIpOworICAgICAgZi0+cmVjZWl2ZXIgPSBOVUxMOworICAgIH0KKworICBpZiAoZi0+cG9saXRlbGlzdGVuZXIgIT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fcmVtb3ZlX2ZpbHRlciAoZi0+cG9saXRlbGlzdGVuZXIsCisgICAgICAgICAgc2lnbmFsX2ZpbHRlciwgZik7CisKKyAgICAgIGRidXNfY29ubmVjdGlvbl9jbG9zZSAoZi0+cG9saXRlbGlzdGVuZXIpOworICAgICAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChmLT5wb2xpdGVsaXN0ZW5lcik7CisgICAgICBmLT5wb2xpdGVsaXN0ZW5lciA9IE5VTEw7CisgICAgfQorCisgIGlmIChmLT5lYXZlc2Ryb3BwZXIgIT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fcmVtb3ZlX2ZpbHRlciAoZi0+ZWF2ZXNkcm9wcGVyLAorICAgICAgICAgIHNpZ25hbF9maWx0ZXIsIGYpOworCisgICAgICBkYnVzX2Nvbm5lY3Rpb25fY2xvc2UgKGYtPmVhdmVzZHJvcHBlcik7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGYtPmVhdmVzZHJvcHBlcik7CisgICAgICBmLT5lYXZlc2Ryb3BwZXIgPSBOVUxMOworICAgIH0KKworICBpZiAoZi0+ZGFlbW9uX3BpZCAhPSAwKQorICAgIHsKKyAgICAgIHRlc3Rfa2lsbF9waWQgKGYtPmRhZW1vbl9waWQpOworICAgICAgZ19zcGF3bl9jbG9zZV9waWQgKGYtPmRhZW1vbl9waWQpOworICAgICAgZi0+ZGFlbW9uX3BpZCA9IDA7CisgICAgfQorCisgIHRlc3RfbWFpbl9jb250ZXh0X3VucmVmIChmLT5jdHgpOworfQorCitpbnQKK21haW4gKGludCBhcmdjLAorICAgIGNoYXIgKiphcmd2KQoreworICB0ZXN0X2luaXQgKCZhcmdjLCAmYXJndik7CisKKyAgZ190ZXN0X2FkZCAoIi9lYXZlZHJvcC9tYXRjaF9rZXl3b3JkL2Jyb2FkY2FzdCIsIEZpeHR1cmUsIE5VTEwsCisgICAgICBzZXR1cCwgdGVzdF9lYXZlc2Ryb3BfYnJvYWRjYXN0LCB0ZWFyZG93bik7CisgIGdfdGVzdF9hZGQgKCIvZWF2ZWRyb3AvbWF0Y2hfa2V5d29yZC91bmljYXN0X3RvX3JlY2VpdmVyIiwgRml4dHVyZSwgTlVMTCwKKyAgICAgIHNldHVwLCB0ZXN0X2VhdmVzZHJvcF91bmljYXN0X3RvX3JlY2VpdmVyLAorICAgICAgdGVhcmRvd24pOworICBnX3Rlc3RfYWRkICgiL2VhdmVkcm9wL21hdGNoX2tleXdvcmQvdW5pY2FzdF90b19zZW5kZXIiLCBGaXh0dXJlLCBOVUxMLAorICAgICAgc2V0dXAsIHRlc3RfZWF2ZXNkcm9wX3VuaWNhc3RfdG9fc2VuZGVyLCB0ZWFyZG93bik7CisKKyAgcmV0dXJuIGdfdGVzdF9ydW4gKCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L2RidXMtZGFlbW9uLmMgYi90ZXN0L2RidXMtZGFlbW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc1M2Q4MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGJ1cy1kYWVtb24uYwpAQCAtMCwwICsxLDIzMzUgQEAKKy8qIEludGVncmF0aW9uIHRlc3RzIGZvciB0aGUgZGJ1cy1kYWVtb24KKyAqCisgKiBBdXRob3I6IFNpbW9uIE1jVml0dGllIDxzaW1vbi5tY3ZpdHRpZUBjb2xsYWJvcmEuY28udWs+CisgKiBDb3B5cmlnaHQgwqkgMjAxMC0yMDExIE5va2lhIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgwqkgMjAxNSBDb2xsYWJvcmEgTHRkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcworICogKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwKKyAqIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsCisgKiBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLAorICogYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKKyAqIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCisgKiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxkYnVzL2RidXMuaD4KKworI2luY2x1ZGUgPGdsaWIuaD4KKyNpbmNsdWRlIDxnbGliL2dzdGRpby5oPgorI2luY2x1ZGUgPGdpby9naW8uaD4KKworI2luY2x1ZGUgImJ1cy9zdGF0cy5oIgorI2luY2x1ZGUgInRlc3QtdXRpbHMtZ2xpYi5oIgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpZmRlZiBEQlVTX1VOSVgKKyMgaW5jbHVkZSA8cHdkLmg+CisjIGluY2x1ZGUgPHVuaXN0ZC5oPgorIyBpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworIyBpZmRlZiBIQVZFX0dJT19VTklYCisgICAgLyogVGhlIENNYWtlIGJ1aWxkIHN5c3RlbSBkb2Vzbid0IGtub3cgaG93IHRvIGNoZWNrIGZvciB0aGlzIHlldCAqLworIyAgIGluY2x1ZGUgPGdpby9ndW5peGZkbWVzc2FnZS5oPgorIyBlbmRpZgorCisjIGlmZGVmIEhBVkVfU1lTX1JFU09VUkNFX0gKKyMgICBpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KKyMgZW5kaWYKKworIyBpZmRlZiBIQVZFX1NZU19USU1FX0gKKyMgICBpbmNsdWRlIDxzeXMvdGltZS5oPgorIyBlbmRpZgorI2VuZGlmCisKKy8qIFBsYXRmb3JtcyB3aGVyZSB3ZSBrbm93IHRoYXQgY3JlZGVudGlhbHMtcGFzc2luZyBwYXNzZXMgYm90aCB0aGUKKyAqIHVpZCBhbmQgdGhlIHBpZC4gUGxlYXNlIGtlZXAgdGhlc2UgaW4gYWxwaGFiZXRpY2FsIG9yZGVyLgorICoKKyAqIFRoZXNlIHBsYXRmb3JtcyBzaG91bGQgI2Vycm9yIGluIF9kYnVzX3JlYWRfY3JlZGVudGlhbHNfc29ja2V0KCkKKyAqIGlmIHdlIGRpZG4ndCBkZXRlY3QgdGhlaXIgZmxhdm91ciBvZiBjcmVkZW50aWFscy1wYXNzaW5nLCBzaW5jZSB0aGF0CisgKiB3b3VsZCBiZSBhIHJlZ3Jlc3Npb24uCisgKi8KKyNpZiBkZWZpbmVkKF9fRnJlZUJTRF9fKSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9rZXJuZWxfXykgfHwgXAorICBkZWZpbmVkKF9fbGludXhfXykgfHwgXAorICBkZWZpbmVkKF9fTmV0QlNEX18pIHx8IFwKKyAgZGVmaW5lZChfX09wZW5CU0RfXykKKyMgZGVmaW5lIFVOSVhfVVNFUl9TSE9VTERfV09SSworIyBkZWZpbmUgUElEX1NIT1VMRF9XT1JLCisjZW5kaWYKKworLyogUGxhdGZvcm1zIHdoZXJlIHdlIGtub3cgdGhhdCBjcmVkZW50aWFscy1wYXNzaW5nIHBhc3NlcyB0aGUKKyAqIHVpZCwgYnV0IG5vdCBuZWNlc3NhcmlseSB0aGUgcGlkLiBBZ2FpbiwgYWxwaGFiZXRpY2FsIG9yZGVyIHBsZWFzZS4KKyAqCisgKiBUaGVzZSBwbGF0Zm9ybXMgc2hvdWxkIGFsc28gI2Vycm9yIGluIF9kYnVzX3JlYWRfY3JlZGVudGlhbHNfc29ja2V0KCkKKyAqIGlmIHdlIGRpZG4ndCBkZXRlY3QgdGhlaXIgZmxhdm91ciBvZiBjcmVkZW50aWFscy1wYXNzaW5nLgorICovCisjaWYgMCAvKiBkZWZpbmVkKF9feW91cl9wbGF0Zm9ybV9oZXJlX18pICovCisjIGRlZmluZSBVTklYX1VTRVJfU0hPVUxEX1dPUksKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgZ2Jvb2xlYW4gc2tpcDsKKworICAgIFRlc3RNYWluQ29udGV4dCAqY3R4OworCisgICAgREJ1c0Vycm9yIGU7CisgICAgR0Vycm9yICpnZTsKKworICAgIEdQaWQgZGFlbW9uX3BpZDsKKyAgICBnY2hhciAqYWRkcmVzczsKKworICAgIERCdXNDb25uZWN0aW9uICpsZWZ0X2Nvbm47CisKKyAgICBEQnVzQ29ubmVjdGlvbiAqcmlnaHRfY29ubjsKKyAgICBHUXVldWUgaGVsZF9tZXNzYWdlczsKKyAgICBnYm9vbGVhbiByaWdodF9jb25uX2VjaG87CisgICAgZ2Jvb2xlYW4gcmlnaHRfY29ubl9ob2xkOworICAgIGdib29sZWFuIHdhaXRfZm9yZXZlcl9jYWxsZWQ7CisKKyAgICBnY2hhciAqdG1wX3J1bnRpbWVfZGlyOworICAgIGdjaGFyICpzYXZlZF9ydW50aW1lX2RpcjsKK30gRml4dHVyZTsKKworc3RhdGljIERCdXNIYW5kbGVyUmVzdWx0CitlY2hvX2ZpbHRlciAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgREJ1c01lc3NhZ2UgKm1lc3NhZ2UsCisgICAgdm9pZCAqdXNlcl9kYXRhKQoreworICBGaXh0dXJlICpmID0gdXNlcl9kYXRhOworICBEQnVzTWVzc2FnZSAqcmVwbHk7CisKKyAgaWYgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkgIT0gREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX0NBTEwpCisgICAgcmV0dXJuIERCVVNfSEFORExFUl9SRVNVTFRfTk9UX1lFVF9IQU5ETEVEOworCisgIC8qIFdhaXRGb3JldmVyKCkgbmV2ZXIgcmVwbGllcywgZW11bGF0aW5nIGEgc2VydmljZSB0aGF0IGhhcyBnb3Qgc3R1Y2sgKi8KKyAgaWYgKGRidXNfbWVzc2FnZV9pc19tZXRob2RfY2FsbCAobWVzc2FnZSwgImNvbS5leGFtcGxlIiwgIldhaXRGb3JldmVyIikpCisgICAgeworICAgICAgZi0+d2FpdF9mb3JldmVyX2NhbGxlZCA9IFRSVUU7CisgICAgICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9IQU5ETEVEOworICAgIH0KKworICByZXBseSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX3JldHVybiAobWVzc2FnZSk7CisKKyAgaWYgKHJlcGx5ID09IE5VTEwpCisgICAgZ19lcnJvciAoIk9PTSIpOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX3NlbmQgKGNvbm5lY3Rpb24sIHJlcGx5LCBOVUxMKSkKKyAgICBnX2Vycm9yICgiT09NIik7CisKKyAgZGJ1c19jbGVhcl9tZXNzYWdlICgmcmVwbHkpOworCisgIHJldHVybiBEQlVTX0hBTkRMRVJfUkVTVUxUX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBEQnVzSGFuZGxlclJlc3VsdAoraG9sZF9maWx0ZXIgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgIERCdXNNZXNzYWdlICptZXNzYWdlLAorICAgIHZvaWQgKnVzZXJfZGF0YSkKK3sKKyAgRml4dHVyZSAqZiA9IHVzZXJfZGF0YTsKKworICBpZiAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlKSAhPSBEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfQ0FMTCkKKyAgICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9OT1RfWUVUX0hBTkRMRUQ7CisKKyAgZ19xdWV1ZV9wdXNoX3RhaWwgKCZmLT5oZWxkX21lc3NhZ2VzLCBkYnVzX21lc3NhZ2VfcmVmIChtZXNzYWdlKSk7CisKKyAgcmV0dXJuIERCVVNfSEFORExFUl9SRVNVTFRfSEFORExFRDsKK30KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNvbnN0IGNoYXIgKmJ1Z19yZWY7CisgICAgZ3VpbnQgbWluX21lc3NhZ2VzOworICAgIGNvbnN0IGNoYXIgKmNvbmZpZ19maWxlOworICAgIFRlc3RVc2VyIHVzZXI7CisgICAgZW51bSB7IFNQRUNJRllfQUREUkVTUyA9IDAsIFJFTFlfT05fREVGQVVMVCB9IGNvbm5lY3RfbW9kZTsKK30gQ29uZmlnOworCitzdGF0aWMgdm9pZAorc2V0dXAgKEZpeHR1cmUgKmYsCisgICAgZ2NvbnN0cG9pbnRlciBjb250ZXh0KQoreworICBjb25zdCBDb25maWcgKmNvbmZpZyA9IGNvbnRleHQ7CisKKyAgLyogU29tZSB0ZXN0cyBhcmUgZmFpcmx5IHNsb3csIHNvIG1ha2UgdGhlIHRlc3QgdGltZW91dCBwZXItdGVzdCAqLworICB0ZXN0X3RpbWVvdXRfcmVzZXQgKDEpOworCisgIGYtPmN0eCA9IHRlc3RfbWFpbl9jb250ZXh0X2dldCAoKTsKKyAgZi0+Z2UgPSBOVUxMOworICBkYnVzX2Vycm9yX2luaXQgKCZmLT5lKTsKKworICBpZiAoY29uZmlnICE9IE5VTEwgJiYgY29uZmlnLT5jb25uZWN0X21vZGUgPT0gUkVMWV9PTl9ERUZBVUxUKQorICAgIHsKKyAgICAgIC8qIHRoaXMgaXMgY2hvc2VuIHRvIGJlIHNvbWV0aGluZyBuZWVkaW5nIGVzY2FwaW5nICovCisgICAgICBmLT50bXBfcnVudGltZV9kaXIgPSBnX2Rpcl9tYWtlX3RtcCAoImRidXM9ZGFlbW9uPXRlc3QuWFhYWFhYIiwgJmYtPmdlKTsKKyAgICAgIGdfYXNzZXJ0X25vX2Vycm9yIChmLT5nZSk7CisKKyAgICAgIC8qIHdlJ3JlIHJlbHlpbmcgb24gYmVpbmcgc2luZ2xlLXRocmVhZGVkIGZvciB0aGlzIHRvIGJlIHNhZmUgKi8KKyAgICAgIGYtPnNhdmVkX3J1bnRpbWVfZGlyID0gZ19zdHJkdXAgKGdfZ2V0ZW52ICgiWERHX1JVTlRJTUVfRElSIikpOworICAgICAgZ19zZXRlbnYgKCJYREdfUlVOVElNRV9ESVIiLCBmLT50bXBfcnVudGltZV9kaXIsIFRSVUUpOworICAgICAgZ191bnNldGVudiAoIkRCVVNfU0VTU0lPTl9CVVNfQUREUkVTUyIpOworICAgIH0KKworICBmLT5hZGRyZXNzID0gdGVzdF9nZXRfZGJ1c19kYWVtb24gKGNvbmZpZyA/IGNvbmZpZy0+Y29uZmlnX2ZpbGUgOiBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZyA/IGNvbmZpZy0+dXNlciA6IFRFU1RfVVNFUl9NRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAmZi0+ZGFlbW9uX3BpZCk7CisKKyAgaWYgKGYtPmFkZHJlc3MgPT0gTlVMTCkKKyAgICB7CisgICAgICBmLT5za2lwID0gVFJVRTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgZi0+bGVmdF9jb25uID0gdGVzdF9jb25uZWN0X3RvX2J1cyAoZi0+Y3R4LCBmLT5hZGRyZXNzKTsKKworICBpZiAoY29uZmlnICE9IE5VTEwgJiYgY29uZmlnLT5jb25uZWN0X21vZGUgPT0gUkVMWV9PTl9ERUZBVUxUKQorICAgIHsKKyAgICAgIC8qIHVzZSB0aGUgZGVmYXVsdCBidXMgZm9yIHRoZSBlY2hvIHNlcnZpY2UgKCJyaWdodCIpLCB0byBjaGVjayB0aGF0CisgICAgICAgKiBpdCBlbmRzIHVwIG9uIHRoZSBzYW1lIGJ1cyBhcyB0aGUgY2xpZW50ICgibGVmdCIpICovCisgICAgICBmLT5yaWdodF9jb25uID0gZGJ1c19idXNfZ2V0X3ByaXZhdGUgKERCVVNfQlVTX1NFU1NJT04sICZmLT5lKTsKKyAgICAgIHRlc3RfYXNzZXJ0X25vX2Vycm9yICgmZi0+ZSk7CisKKyAgICAgIGlmICghdGVzdF9jb25uZWN0aW9uX3NldHVwIChmLT5jdHgsIGYtPnJpZ2h0X2Nvbm4pKQorICAgICAgICBnX2Vycm9yICgiT09NIik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZi0+cmlnaHRfY29ubiA9IHRlc3RfY29ubmVjdF90b19idXMgKGYtPmN0eCwgZi0+YWRkcmVzcyk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorYWRkX2VjaG9fZmlsdGVyIChGaXh0dXJlICpmKQoreworICBpZiAoIWRidXNfY29ubmVjdGlvbl9hZGRfZmlsdGVyIChmLT5yaWdodF9jb25uLCBlY2hvX2ZpbHRlciwgZiwgTlVMTCkpCisgICAgZ19lcnJvciAoIk9PTSIpOworCisgIGYtPnJpZ2h0X2Nvbm5fZWNobyA9IFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCithZGRfaG9sZF9maWx0ZXIgKEZpeHR1cmUgKmYpCit7CisgIGlmICghZGJ1c19jb25uZWN0aW9uX2FkZF9maWx0ZXIgKGYtPnJpZ2h0X2Nvbm4sIGhvbGRfZmlsdGVyLCBmLCBOVUxMKSkKKyAgICBnX2Vycm9yICgiT09NIik7CisKKyAgZi0+cmlnaHRfY29ubl9ob2xkID0gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK3BjX2NvdW50IChEQnVzUGVuZGluZ0NhbGwgKnBjLAorICAgIHZvaWQgKmRhdGEpCit7CisgIGd1aW50ICpyZWNlaXZlZF9wID0gZGF0YTsKKworICAoKnJlY2VpdmVkX3ApKys7Cit9CisKK3N0YXRpYyB2b2lkCitwY19lbnF1ZXVlIChEQnVzUGVuZGluZ0NhbGwgKnBjLAorICAgICAgICAgICAgdm9pZCAqZGF0YSkKK3sKKyAgR1F1ZXVlICpxID0gZGF0YTsKKyAgREJ1c01lc3NhZ2UgKm0gPSBkYnVzX3BlbmRpbmdfY2FsbF9zdGVhbF9yZXBseSAocGMpOworCisgIGdfdGVzdF9tZXNzYWdlICgibWVzc2FnZSBvZiB0eXBlICVkIiwgZGJ1c19tZXNzYWdlX2dldF90eXBlIChtKSk7CisgIGdfcXVldWVfcHVzaF90YWlsIChxLCBtKTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfZWNobyAoRml4dHVyZSAqZiwKKyAgICBnY29uc3Rwb2ludGVyIGNvbnRleHQpCit7CisgIGNvbnN0IENvbmZpZyAqY29uZmlnID0gY29udGV4dDsKKyAgZ3VpbnQgY291bnQgPSAyMDAwOworICBndWludCBzZW50OworICBndWludCByZWNlaXZlZCA9IDA7CisgIGRvdWJsZSBlbGFwc2VkOworCisgIGlmIChmLT5za2lwKQorICAgIHJldHVybjsKKworICBpZiAoY29uZmlnICE9IE5VTEwgJiYgY29uZmlnLT5idWdfcmVmICE9IE5VTEwpCisgICAgZ190ZXN0X2J1ZyAoY29uZmlnLT5idWdfcmVmKTsKKworICBpZiAoZ190ZXN0X3BlcmYgKCkpCisgICAgY291bnQgPSAxMDAwMDA7CisKKyAgaWYgKGNvbmZpZyAhPSBOVUxMKQorICAgIGNvdW50ID0gTUFYIChjb25maWctPm1pbl9tZXNzYWdlcywgY291bnQpOworCisgIGFkZF9lY2hvX2ZpbHRlciAoZik7CisKKyAgZ190ZXN0X3RpbWVyX3N0YXJ0ICgpOworCisgIGZvciAoc2VudCA9IDA7IHNlbnQgPCBjb3VudDsgc2VudCsrKQorICAgIHsKKyAgICAgIERCdXNNZXNzYWdlICptID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoCisgICAgICAgICAgZGJ1c19idXNfZ2V0X3VuaXF1ZV9uYW1lIChmLT5yaWdodF9jb25uKSwgIi8iLAorICAgICAgICAgICJjb20uZXhhbXBsZSIsICJTcGFtIik7CisgICAgICBEQnVzUGVuZGluZ0NhbGwgKnBjOworCisgICAgICBpZiAobSA9PSBOVUxMKQorICAgICAgICBnX2Vycm9yICgiT09NIik7CisKKyAgICAgIGlmICghZGJ1c19jb25uZWN0aW9uX3NlbmRfd2l0aF9yZXBseSAoZi0+bGVmdF9jb25uLCBtLCAmcGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVElNRU9VVF9JTkZJTklURSkgfHwKKyAgICAgICAgICBwYyA9PSBOVUxMKQorICAgICAgICBnX2Vycm9yICgiT09NIik7CisKKyAgICAgIGlmIChkYnVzX3BlbmRpbmdfY2FsbF9nZXRfY29tcGxldGVkIChwYykpCisgICAgICAgIHBjX2NvdW50IChwYywgJnJlY2VpdmVkKTsKKyAgICAgIGVsc2UgaWYgKCFkYnVzX3BlbmRpbmdfY2FsbF9zZXRfbm90aWZ5IChwYywgcGNfY291bnQsICZyZWNlaXZlZCwKKyAgICAgICAgICAgIE5VTEwpKQorICAgICAgICBnX2Vycm9yICgiT09NIik7CisKKyAgICAgIGRidXNfY2xlYXJfcGVuZGluZ19jYWxsICgmcGMpOworICAgICAgZGJ1c19jbGVhcl9tZXNzYWdlICgmbSk7CisgICAgfQorCisgIHdoaWxlIChyZWNlaXZlZCA8IGNvdW50KQorICAgIHRlc3RfbWFpbl9jb250ZXh0X2l0ZXJhdGUgKGYtPmN0eCwgVFJVRSk7CisKKyAgZWxhcHNlZCA9IGdfdGVzdF90aW1lcl9lbGFwc2VkICgpOworCisgIGdfdGVzdF9tYXhpbWl6ZWRfcmVzdWx0IChjb3VudCAvIGVsYXBzZWQsICIldSBtZXNzYWdlcyAvICVmIHNlY29uZHMiLAorICAgICAgY291bnQsIGVsYXBzZWQpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9ub19yZXBseSAoRml4dHVyZSAqZiwKKyAgICBnY29uc3Rwb2ludGVyIGNvbnRleHQpCit7CisgIGNvbnN0IENvbmZpZyAqY29uZmlnID0gY29udGV4dDsKKyAgREJ1c01lc3NhZ2UgKm07CisgIERCdXNQZW5kaW5nQ2FsbCAqcGM7CisgIERCdXNNZXNzYWdlICpyZXBseSA9IE5VTEw7CisgIGVudW0geyBUSU1FT1VULCBESVNDT05ORUNUIH0gbW9kZTsKKyAgZ2Jvb2xlYW4gb2s7CisKKyAgaWYgKGYtPnNraXApCisgICAgcmV0dXJuOworCisgIGdfdGVzdF9idWcgKCI3NjExMiIpOworCisgIGlmIChjb25maWcgIT0gTlVMTCAmJiBjb25maWctPmNvbmZpZ19maWxlICE9IE5VTEwpCisgICAgbW9kZSA9IFRJTUVPVVQ7CisgIGVsc2UKKyAgICBtb2RlID0gRElTQ09OTkVDVDsKKworICBtID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoCisgICAgICBkYnVzX2J1c19nZXRfdW5pcXVlX25hbWUgKGYtPnJpZ2h0X2Nvbm4pLCAiLyIsCisgICAgICAiY29tLmV4YW1wbGUiLCAiV2FpdEZvcmV2ZXIiKTsKKworICBhZGRfZWNob19maWx0ZXIgKGYpOworCisgIGlmIChtID09IE5VTEwpCisgICAgZ19lcnJvciAoIk9PTSIpOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX3NlbmRfd2l0aF9yZXBseSAoZi0+bGVmdF9jb25uLCBtLCAmcGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19USU1FT1VUX0lORklOSVRFKSB8fAorICAgICAgcGMgPT0gTlVMTCkKKyAgICBnX2Vycm9yICgiT09NIik7CisKKyAgaWYgKGRidXNfcGVuZGluZ19jYWxsX2dldF9jb21wbGV0ZWQgKHBjKSkKKyAgICB0ZXN0X3BlbmRpbmdfY2FsbF9zdG9yZV9yZXBseSAocGMsICZyZXBseSk7CisgIGVsc2UgaWYgKCFkYnVzX3BlbmRpbmdfY2FsbF9zZXRfbm90aWZ5IChwYywgdGVzdF9wZW5kaW5nX2NhbGxfc3RvcmVfcmVwbHksCisgICAgICAgICZyZXBseSwgTlVMTCkpCisgICAgZ19lcnJvciAoIk9PTSIpOworCisgIGRidXNfY2xlYXJfcGVuZGluZ19jYWxsICgmcGMpOworICBkYnVzX2NsZWFyX21lc3NhZ2UgKCZtKTsKKworICBpZiAobW9kZSA9PSBESVNDT05ORUNUKQorICAgIHsKKyAgICAgIHdoaWxlICghZi0+d2FpdF9mb3JldmVyX2NhbGxlZCkKKyAgICAgICAgdGVzdF9tYWluX2NvbnRleHRfaXRlcmF0ZSAoZi0+Y3R4LCBUUlVFKTsKKworICAgICAgZGJ1c19jb25uZWN0aW9uX3JlbW92ZV9maWx0ZXIgKGYtPnJpZ2h0X2Nvbm4sIGVjaG9fZmlsdGVyLCBmKTsKKyAgICAgIGRidXNfY29ubmVjdGlvbl9jbG9zZSAoZi0+cmlnaHRfY29ubik7CisgICAgICBkYnVzX2NsZWFyX2Nvbm5lY3Rpb24gKCZmLT5yaWdodF9jb25uKTsKKyAgICB9CisKKyAgd2hpbGUgKHJlcGx5ID09IE5VTEwpCisgICAgdGVzdF9tYWluX2NvbnRleHRfaXRlcmF0ZSAoZi0+Y3R4LCBUUlVFKTsKKworICAvKiB1c2luZyBpbmVmZmljaWVudCBzdHJpbmcgY29tcGFyaXNvbiBmb3IgYmV0dGVyIGFzc2VydGlvbiBtZXNzYWdlICovCisgIGdfYXNzZXJ0X2NtcHN0ciAoCisgICAgICBkYnVzX21lc3NhZ2VfdHlwZV90b19zdHJpbmcgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAocmVwbHkpKSwgPT0sCisgICAgICBkYnVzX21lc3NhZ2VfdHlwZV90b19zdHJpbmcgKERCVVNfTUVTU0FHRV9UWVBFX0VSUk9SKSk7CisgIG9rID0gZGJ1c19zZXRfZXJyb3JfZnJvbV9tZXNzYWdlICgmZi0+ZSwgcmVwbHkpOworICBnX2Fzc2VydCAob2spOworICBnX2Fzc2VydF9jbXBzdHIgKGYtPmUubmFtZSwgPT0sIERCVVNfRVJST1JfTk9fUkVQTFkpOworCisgIGlmIChtb2RlID09IERJU0NPTk5FQ1QpCisgICAgZ19hc3NlcnRfY21wc3RyIChmLT5lLm1lc3NhZ2UsID09LAorICAgICAgICAiTWVzc2FnZSByZWNpcGllbnQgZGlzY29ubmVjdGVkIGZyb20gbWVzc2FnZSBidXMgd2l0aG91dCByZXBseWluZyIpOworICBlbHNlCisgICAgZ19hc3NlcnRfY21wc3RyIChmLT5lLm1lc3NhZ2UsID09LAorICAgICAgICAiTWVzc2FnZSBkaWQgbm90IHJlY2VpdmUgYSByZXBseSAodGltZW91dCBieSBtZXNzYWdlIGJ1cykiKTsKKworICBkYnVzX2NsZWFyX21lc3NhZ2UgKCZyZXBseSk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X2NyZWRzIChGaXh0dXJlICpmLAorICAgIGdjb25zdHBvaW50ZXIgY29udGV4dCkKK3sKKyAgY29uc3QgY2hhciAqdW5pcXVlID0gZGJ1c19idXNfZ2V0X3VuaXF1ZV9uYW1lIChmLT5sZWZ0X2Nvbm4pOworICBEQnVzTWVzc2FnZSAqbSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKERCVVNfU0VSVklDRV9EQlVTLAorICAgICAgREJVU19QQVRIX0RCVVMsIERCVVNfSU5URVJGQUNFX0RCVVMsICJHZXRDb25uZWN0aW9uQ3JlZGVudGlhbHMiKTsKKyAgREJ1c1BlbmRpbmdDYWxsICpwYzsKKyAgREJ1c01lc3NhZ2VJdGVyIGFyZ3NfaXRlcjsKKyAgREJ1c01lc3NhZ2VJdGVyIGFycl9pdGVyOworICBEQnVzTWVzc2FnZUl0ZXIgcGFpcl9pdGVyOworICBEQnVzTWVzc2FnZUl0ZXIgdmFyX2l0ZXI7CisgIGVudW0geworICAgICAgU0VFTl9VTklYX1VTRVIgPSAxLAorICAgICAgU0VFTl9QSUQgPSAyLAorICAgICAgU0VFTl9XSU5ET1dTX1NJRCA9IDQsCisgICAgICBTRUVOX0xJTlVYX1NFQ1VSSVRZX0xBQkVMID0gOAorICB9IHNlZW4gPSAwOworCisgIGlmIChtID09IE5VTEwpCisgICAgZ19lcnJvciAoIk9PTSIpOworCisgIGlmICghZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChtLAorICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmdW5pcXVlLAorICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgZ19lcnJvciAoIk9PTSIpOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX3NlbmRfd2l0aF9yZXBseSAoZi0+bGVmdF9jb25uLCBtLCAmcGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19USU1FT1VUX1VTRV9ERUZBVUxUKSB8fAorICAgICAgcGMgPT0gTlVMTCkKKyAgICBnX2Vycm9yICgiT09NIik7CisKKyAgZGJ1c19jbGVhcl9tZXNzYWdlICgmbSk7CisKKyAgaWYgKGRidXNfcGVuZGluZ19jYWxsX2dldF9jb21wbGV0ZWQgKHBjKSkKKyAgICB0ZXN0X3BlbmRpbmdfY2FsbF9zdG9yZV9yZXBseSAocGMsICZtKTsKKyAgZWxzZSBpZiAoIWRidXNfcGVuZGluZ19jYWxsX3NldF9ub3RpZnkgKHBjLCB0ZXN0X3BlbmRpbmdfY2FsbF9zdG9yZV9yZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtLCBOVUxMKSkKKyAgICBnX2Vycm9yICgiT09NIik7CisKKyAgd2hpbGUgKG0gPT0gTlVMTCkKKyAgICB0ZXN0X21haW5fY29udGV4dF9pdGVyYXRlIChmLT5jdHgsIFRSVUUpOworCisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9zaWduYXR1cmUgKG0pLCA9PSwgImF7c3Z9Iik7CisKKyAgZGJ1c19tZXNzYWdlX2l0ZXJfaW5pdCAobSwgJmFyZ3NfaXRlcik7CisgIGdfYXNzZXJ0X2NtcHVpbnQgKGRidXNfbWVzc2FnZV9pdGVyX2dldF9hcmdfdHlwZSAoJmFyZ3NfaXRlciksID09LAorICAgICAgREJVU19UWVBFX0FSUkFZKTsKKyAgZ19hc3NlcnRfY21wdWludCAoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2VsZW1lbnRfdHlwZSAoJmFyZ3NfaXRlciksID09LAorICAgICAgREJVU19UWVBFX0RJQ1RfRU5UUlkpOworICBkYnVzX21lc3NhZ2VfaXRlcl9yZWN1cnNlICgmYXJnc19pdGVyLCAmYXJyX2l0ZXIpOworCisgIHdoaWxlIChkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJnX3R5cGUgKCZhcnJfaXRlcikgIT0gREJVU19UWVBFX0lOVkFMSUQpCisgICAgeworICAgICAgY29uc3QgY2hhciAqbmFtZTsKKworICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfcmVjdXJzZSAoJmFycl9pdGVyLCAmcGFpcl9pdGVyKTsKKyAgICAgIGdfYXNzZXJ0X2NtcHVpbnQgKGRidXNfbWVzc2FnZV9pdGVyX2dldF9hcmdfdHlwZSAoJnBhaXJfaXRlciksID09LAorICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcpOworICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2Jhc2ljICgmcGFpcl9pdGVyLCAmbmFtZSk7CisgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9uZXh0ICgmcGFpcl9pdGVyKTsKKyAgICAgIGdfYXNzZXJ0X2NtcHVpbnQgKGRidXNfbWVzc2FnZV9pdGVyX2dldF9hcmdfdHlwZSAoJnBhaXJfaXRlciksID09LAorICAgICAgICAgIERCVVNfVFlQRV9WQVJJQU5UKTsKKyAgICAgIGRidXNfbWVzc2FnZV9pdGVyX3JlY3Vyc2UgKCZwYWlyX2l0ZXIsICZ2YXJfaXRlcik7CisKKyAgICAgIGlmIChnX3N0cmNtcDAgKG5hbWUsICJVbml4VXNlcklEIikgPT0gMCkKKyAgICAgICAgeworI2lmZGVmIEdfT1NfVU5JWAorICAgICAgICAgIGd1aW50MzIgdTMyOworCisgICAgICAgICAgZ19hc3NlcnQgKCEoc2VlbiAmIFNFRU5fVU5JWF9VU0VSKSk7CisgICAgICAgICAgZ19hc3NlcnRfY21wdWludCAoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2FyZ190eXBlICgmdmFyX2l0ZXIpLCA9PSwKKyAgICAgICAgICAgICAgREJVU19UWVBFX1VJTlQzMik7CisgICAgICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2Jhc2ljICgmdmFyX2l0ZXIsICZ1MzIpOworICAgICAgICAgIGdfdGVzdF9tZXNzYWdlICgiJXMgb2YgdGhpcyBwcm9jZXNzIGlzICV1IiwgbmFtZSwgdTMyKTsKKyAgICAgICAgICBnX2Fzc2VydF9jbXB1aW50ICh1MzIsID09LCBnZXRldWlkICgpKTsKKyAgICAgICAgICBzZWVuIHw9IFNFRU5fVU5JWF9VU0VSOworI2Vsc2UKKyAgICAgICAgICBnX2Fzc2VydF9ub3RfcmVhY2hlZCAoKTsKKyNlbmRpZgorICAgICAgICB9CisgICAgICBlbHNlIGlmIChnX3N0cmNtcDAgKG5hbWUsICJXaW5kb3dzU0lEIikgPT0gMCkKKyAgICAgICAgeworI2lmZGVmIEdfT1NfV0lOMzIKKyAgICAgICAgICBnY2hhciAqc2lkOworICAgICAgICAgIGNoYXIgKnNlbGZfc2lkOworCisgICAgICAgICAgZ19hc3NlcnQgKCEoc2VlbiAmIFNFRU5fV0lORE9XU19TSUQpKTsKKyAgICAgICAgICBnX2Fzc2VydF9jbXB1aW50IChkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJnX3R5cGUgKCZ2YXJfaXRlciksID09LAorICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HKTsKKyAgICAgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYmFzaWMgKCZ2YXJfaXRlciwgJnNpZCk7CisgICAgICAgICAgZ190ZXN0X21lc3NhZ2UgKCIlcyBvZiB0aGlzIHByb2Nlc3MgaXMgJXMiLCBuYW1lLCBzaWQpOworICAgICAgICAgIGlmIChfZGJ1c19nZXRzaWQgKCZzZWxmX3NpZCwgMCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGdfYXNzZXJ0X2NtcHN0ciAoc2VsZl9zaWQsID09LCBzaWQpOworICAgICAgICAgICAgICBMb2NhbEZyZWUoc2VsZl9zaWQpOworICAgICAgICAgICAgfQorICAgICAgICAgIHNlZW4gfD0gU0VFTl9XSU5ET1dTX1NJRDsKKyNlbHNlCisgICAgICAgICAgZ19hc3NlcnRfbm90X3JlYWNoZWQgKCk7CisjZW5kaWYKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoZ19zdHJjbXAwIChuYW1lLCAiUHJvY2Vzc0lEIikgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIGd1aW50MzIgdTMyOworCisgICAgICAgICAgZ19hc3NlcnQgKCEoc2VlbiAmIFNFRU5fUElEKSk7CisgICAgICAgICAgZ19hc3NlcnRfY21wdWludCAoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2FyZ190eXBlICgmdmFyX2l0ZXIpLCA9PSwKKyAgICAgICAgICAgICAgREJVU19UWVBFX1VJTlQzMik7CisgICAgICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2Jhc2ljICgmdmFyX2l0ZXIsICZ1MzIpOworICAgICAgICAgIGdfdGVzdF9tZXNzYWdlICgiJXMgb2YgdGhpcyBwcm9jZXNzIGlzICV1IiwgbmFtZSwgdTMyKTsKKyNpZmRlZiBHX09TX1VOSVgKKyAgICAgICAgICBnX2Fzc2VydF9jbXB1aW50ICh1MzIsID09LCBnZXRwaWQgKCkpOworI2VsaWYgZGVmaW5lZChHX09TX1dJTjMyKQorICAgICAgICAgIGdfYXNzZXJ0X2NtcHVpbnQgKHUzMiwgPT0sIEdldEN1cnJlbnRQcm9jZXNzSWQgKCkpOworI2Vsc2UKKyAgICAgICAgICBnX2Fzc2VydF9ub3RfcmVhY2hlZCAoKTsKKyNlbmRpZgorICAgICAgICAgIHNlZW4gfD0gU0VFTl9QSUQ7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKGdfc3RyY21wMCAobmFtZSwgIkxpbnV4U2VjdXJpdHlMYWJlbCIpID09IDApCisgICAgICAgIHsKKyNpZmRlZiBfX2xpbnV4X18KKyAgICAgICAgICBnY2hhciAqbGFiZWw7CisgICAgICAgICAgaW50IGxlbjsKKyAgICAgICAgICBEQnVzTWVzc2FnZUl0ZXIgYXlfaXRlcjsKKworICAgICAgICAgIGdfYXNzZXJ0ICghKHNlZW4gJiBTRUVOX0xJTlVYX1NFQ1VSSVRZX0xBQkVMKSk7CisgICAgICAgICAgZ19hc3NlcnRfY21wdWludCAoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2FyZ190eXBlICgmdmFyX2l0ZXIpLCA9PSwKKyAgICAgICAgICAgICAgREJVU19UWVBFX0FSUkFZKTsKKyAgICAgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9yZWN1cnNlICgmdmFyX2l0ZXIsICZheV9pdGVyKTsKKyAgICAgICAgICBnX2Fzc2VydF9jbXB1aW50IChkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJnX3R5cGUgKCZheV9pdGVyKSwgPT0sCisgICAgICAgICAgICAgIERCVVNfVFlQRV9CWVRFKTsKKyAgICAgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfZml4ZWRfYXJyYXkgKCZheV9pdGVyLCAmbGFiZWwsICZsZW4pOworICAgICAgICAgIGdfdGVzdF9tZXNzYWdlICgiJXMgb2YgdGhpcyBwcm9jZXNzIGlzICVzIiwgbmFtZSwgbGFiZWwpOworICAgICAgICAgIGdfYXNzZXJ0X2NtcHVpbnQgKHN0cmxlbiAobGFiZWwpICsgMSwgPT0sIGxlbik7CisgICAgICAgICAgc2VlbiB8PSBTRUVOX0xJTlVYX1NFQ1VSSVRZX0xBQkVMOworI2Vsc2UKKyAgICAgICAgICBnX2Fzc2VydF9ub3RfcmVhY2hlZCAoKTsKKyNlbmRpZgorICAgICAgICB9CisKKyAgICAgIGRidXNfbWVzc2FnZV9pdGVyX25leHQgKCZhcnJfaXRlcik7CisgICAgfQorCisjaWZkZWYgVU5JWF9VU0VSX1NIT1VMRF9XT1JLCisgIGdfYXNzZXJ0IChzZWVuICYgU0VFTl9VTklYX1VTRVIpOworI2VuZGlmCisKKyNpZmRlZiBQSURfU0hPVUxEX1dPUksKKyAgZ19hc3NlcnQgKHNlZW4gJiBTRUVOX1BJRCk7CisjZW5kaWYKKworI2lmZGVmIEdfT1NfV0lOMzIKKyAgZ19hc3NlcnQgKHNlZW4gJiBTRUVOX1dJTkRPV1NfU0lEKTsKKyNlbmRpZgorCisgIGRidXNfY2xlYXJfbWVzc2FnZSAoJm0pOworICBkYnVzX2NsZWFyX3BlbmRpbmdfY2FsbCAoJnBjKTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfcHJvY2Vzc2lkIChGaXh0dXJlICpmLAorICAgIGdjb25zdHBvaW50ZXIgY29udGV4dCkKK3sKKyAgY29uc3QgY2hhciAqdW5pcXVlID0gZGJ1c19idXNfZ2V0X3VuaXF1ZV9uYW1lIChmLT5sZWZ0X2Nvbm4pOworICBEQnVzTWVzc2FnZSAqbSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKERCVVNfU0VSVklDRV9EQlVTLAorICAgICAgREJVU19QQVRIX0RCVVMsIERCVVNfSU5URVJGQUNFX0RCVVMsICJHZXRDb25uZWN0aW9uVW5peFByb2Nlc3NJRCIpOworICBEQnVzUGVuZGluZ0NhbGwgKnBjOworICBEQnVzRXJyb3IgZXJyb3IgPSBEQlVTX0VSUk9SX0lOSVQ7CisgIGd1aW50MzIgcGlkOworCisgIGlmIChtID09IE5VTEwpCisgICAgZ19lcnJvciAoIk9PTSIpOworCisgIGlmICghZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChtLAorICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmdW5pcXVlLAorICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgZ19lcnJvciAoIk9PTSIpOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX3NlbmRfd2l0aF9yZXBseSAoZi0+bGVmdF9jb25uLCBtLCAmcGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19USU1FT1VUX1VTRV9ERUZBVUxUKSB8fAorICAgICAgcGMgPT0gTlVMTCkKKyAgICBnX2Vycm9yICgiT09NIik7CisKKyAgZGJ1c19jbGVhcl9tZXNzYWdlICgmbSk7CisKKyAgaWYgKGRidXNfcGVuZGluZ19jYWxsX2dldF9jb21wbGV0ZWQgKHBjKSkKKyAgICB0ZXN0X3BlbmRpbmdfY2FsbF9zdG9yZV9yZXBseSAocGMsICZtKTsKKyAgZWxzZSBpZiAoIWRidXNfcGVuZGluZ19jYWxsX3NldF9ub3RpZnkgKHBjLCB0ZXN0X3BlbmRpbmdfY2FsbF9zdG9yZV9yZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtLCBOVUxMKSkKKyAgICBnX2Vycm9yICgiT09NIik7CisKKyAgd2hpbGUgKG0gPT0gTlVMTCkKKyAgICB0ZXN0X21haW5fY29udGV4dF9pdGVyYXRlIChmLT5jdHgsIFRSVUUpOworCisgIGlmIChkYnVzX3NldF9lcnJvcl9mcm9tX21lc3NhZ2UgKCZlcnJvciwgbSkpCisgICAgeworICAgICAgZ19hc3NlcnRfY21wc3RyIChlcnJvci5uYW1lLCA9PSwgREJVU19FUlJPUl9VTklYX1BST0NFU1NfSURfVU5LTk9XTik7CisKKyNpZmRlZiBQSURfU0hPVUxEX1dPUksKKyAgICAgIGdfZXJyb3IgKCJFeHBlY3RlZCBwaWQgdG8gYmUgcGFzc2VkLCBidXQgZ290ICVzOiAlcyIsCisgICAgICAgICAgZXJyb3IubmFtZSwgZXJyb3IubWVzc2FnZSk7CisjZW5kaWYKKworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgIH0KKyAgZWxzZSBpZiAoZGJ1c19tZXNzYWdlX2dldF9hcmdzIChtLCAmZXJyb3IsCisgICAgICAgIERCVVNfVFlQRV9VSU5UMzIsICZwaWQsCisgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICB7CisgICAgICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfc2lnbmF0dXJlIChtKSwgPT0sICJ1Iik7CisgICAgICB0ZXN0X2Fzc2VydF9ub19lcnJvciAoJmVycm9yKTsKKworICAgICAgZ190ZXN0X21lc3NhZ2UgKCJHZXRDb25uZWN0aW9uVW5peFByb2Nlc3NJRCByZXR1cm5lZCAldSIsIHBpZCk7CisKKyNpZmRlZiBHX09TX1VOSVgKKyAgICAgIGdfYXNzZXJ0X2NtcHVpbnQgKHBpZCwgPT0sIGdldHBpZCAoKSk7CisjZWxpZiBkZWZpbmVkKEdfT1NfV0lOMzIpCisgICAgICBnX2Fzc2VydF9jbXB1aW50IChwaWQsID09LCBHZXRDdXJyZW50UHJvY2Vzc0lkICgpKTsKKyNlbHNlCisgICAgICBnX2Fzc2VydF9ub3RfcmVhY2hlZCAoKTsKKyNlbmRpZgorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGdfZXJyb3IgKCJVbmV4cGVjdGVkIGVycm9yOiAlczogJXMiLCBlcnJvci5uYW1lLCBlcnJvci5tZXNzYWdlKTsKKyAgICB9CisKKyAgZGJ1c19jbGVhcl9tZXNzYWdlICgmbSk7CisgIGRidXNfY2xlYXJfcGVuZGluZ19jYWxsICgmcGMpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9jYW5vbmljYWxfcGF0aF91YWUgKEZpeHR1cmUgKmYsCisgICAgZ2NvbnN0cG9pbnRlciBjb250ZXh0KQoreworICBEQnVzTWVzc2FnZSAqbSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKERCVVNfU0VSVklDRV9EQlVTLAorICAgICAgREJVU19QQVRIX0RCVVMsIERCVVNfSU5URVJGQUNFX0RCVVMsICJVcGRhdGVBY3RpdmF0aW9uRW52aXJvbm1lbnQiKTsKKyAgREJ1c1BlbmRpbmdDYWxsICpwYzsKKyAgREJ1c01lc3NhZ2VJdGVyIGFyZ3NfaXRlcjsKKyAgREJ1c01lc3NhZ2VJdGVyIGFycl9pdGVyOworCisgIGlmIChtID09IE5VTEwpCisgICAgZ19lcnJvciAoIk9PTSIpOworCisgIGRidXNfbWVzc2FnZV9pdGVyX2luaXRfYXBwZW5kIChtLCAmYXJnc19pdGVyKTsKKworICAvKiBBcHBlbmQgYW4gZW1wdHkgYXtzc30gKHN0cmluZyA9PiBzdHJpbmcgZGljdGlvbmFyeSkuICovCisgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfb3Blbl9jb250YWluZXIgKCZhcmdzX2l0ZXIsIERCVVNfVFlQRV9BUlJBWSwKKyAgICAgICAgIntzc30iLCAmYXJyX2l0ZXIpIHx8CisgICAgICAhZGJ1c19tZXNzYWdlX2l0ZXJfY2xvc2VfY29udGFpbmVyICgmYXJnc19pdGVyLCAmYXJyX2l0ZXIpKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHkgKGYtPmxlZnRfY29ubiwgbSwgJnBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVElNRU9VVF9VU0VfREVGQVVMVCkgfHwKKyAgICAgIHBjID09IE5VTEwpCisgICAgZ19lcnJvciAoIk9PTSIpOworCisgIGRidXNfY2xlYXJfbWVzc2FnZSAoJm0pOworCisgIGlmIChkYnVzX3BlbmRpbmdfY2FsbF9nZXRfY29tcGxldGVkIChwYykpCisgICAgdGVzdF9wZW5kaW5nX2NhbGxfc3RvcmVfcmVwbHkgKHBjLCAmbSk7CisgIGVsc2UgaWYgKCFkYnVzX3BlbmRpbmdfY2FsbF9zZXRfbm90aWZ5IChwYywgdGVzdF9wZW5kaW5nX2NhbGxfc3RvcmVfcmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbSwgTlVMTCkpCisgICAgZ19lcnJvciAoIk9PTSIpOworCisgIHdoaWxlIChtID09IE5VTEwpCisgICAgdGVzdF9tYWluX2NvbnRleHRfaXRlcmF0ZSAoZi0+Y3R4LCBUUlVFKTsKKworICAvKiBpdCBzdWNjZWVkcyAqLworICBnX2Fzc2VydF9jbXBpbnQgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobSksID09LAorICAgICAgREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX1JFVFVSTik7CisKKyAgZGJ1c19jbGVhcl9tZXNzYWdlICgmbSk7CisgIGRidXNfY2xlYXJfcGVuZGluZ19jYWxsICgmcGMpOworCisgIC8qIE5vdyB0cnkgd2l0aCB0aGUgd3Jvbmcgb2JqZWN0IHBhdGggKi8KKyAgbSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKERCVVNfU0VSVklDRV9EQlVTLAorICAgICAgIi9jb20vZXhhbXBsZS9Xcm9uZyIsIERCVVNfSU5URVJGQUNFX0RCVVMsICJVcGRhdGVBY3RpdmF0aW9uRW52aXJvbm1lbnQiKTsKKworICBpZiAobSA9PSBOVUxMKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKworICBkYnVzX21lc3NhZ2VfaXRlcl9pbml0X2FwcGVuZCAobSwgJmFyZ3NfaXRlcik7CisKKyAgLyogQXBwZW5kIGFuIGVtcHR5IGF7c3N9IChzdHJpbmcgPT4gc3RyaW5nIGRpY3Rpb25hcnkpLiAqLworICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX29wZW5fY29udGFpbmVyICgmYXJnc19pdGVyLCBEQlVTX1RZUEVfQVJSQVksCisgICAgICAgICJ7c3N9IiwgJmFycl9pdGVyKSB8fAorICAgICAgIWRidXNfbWVzc2FnZV9pdGVyX2Nsb3NlX2NvbnRhaW5lciAoJmFyZ3NfaXRlciwgJmFycl9pdGVyKSkKKyAgICBnX2Vycm9yICgiT09NIik7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2VuZF93aXRoX3JlcGx5IChmLT5sZWZ0X2Nvbm4sIG0sICZwYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RJTUVPVVRfVVNFX0RFRkFVTFQpIHx8CisgICAgICBwYyA9PSBOVUxMKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKworICBkYnVzX2NsZWFyX21lc3NhZ2UgKCZtKTsKKworICBpZiAoZGJ1c19wZW5kaW5nX2NhbGxfZ2V0X2NvbXBsZXRlZCAocGMpKQorICAgIHRlc3RfcGVuZGluZ19jYWxsX3N0b3JlX3JlcGx5IChwYywgJm0pOworICBlbHNlIGlmICghZGJ1c19wZW5kaW5nX2NhbGxfc2V0X25vdGlmeSAocGMsIHRlc3RfcGVuZGluZ19jYWxsX3N0b3JlX3JlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm0sIE5VTEwpKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKworICB3aGlsZSAobSA9PSBOVUxMKQorICAgIHRlc3RfbWFpbl9jb250ZXh0X2l0ZXJhdGUgKGYtPmN0eCwgVFJVRSk7CisKKyAgLyogaXQgZmFpbHMsIHlpZWxkaW5nIGFuIGVycm9yIG1lc3NhZ2Ugd2l0aCBvbmUgc3RyaW5nIGFyZ3VtZW50ICovCisgIGdfYXNzZXJ0X2NtcGludCAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtKSwgPT0sIERCVVNfTUVTU0FHRV9UWVBFX0VSUk9SKTsKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X2Vycm9yX25hbWUgKG0pLCA9PSwKKyAgICAgIERCVVNfRVJST1JfQUNDRVNTX0RFTklFRCk7CisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9zaWduYXR1cmUgKG0pLCA9PSwgInMiKTsKKworICBkYnVzX2NsZWFyX21lc3NhZ2UgKCZtKTsKKyAgZGJ1c19jbGVhcl9wZW5kaW5nX2NhbGwgKCZwYyk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X21heF9jb25uZWN0aW9ucyAoRml4dHVyZSAqZiwKKyAgICBnY29uc3Rwb2ludGVyIGNvbnRleHQpCit7CisgIERCdXNFcnJvciBlcnJvciA9IERCVVNfRVJST1JfSU5JVDsKKyAgREJ1c0Nvbm5lY3Rpb24gKnRoaXJkX2Nvbm47CisgIERCdXNDb25uZWN0aW9uICpmYWlsaW5nX2Nvbm47CisKKyAgaWYgKGYtPnNraXApCisgICAgcmV0dXJuOworCisgIC8qIFdlIGhhdmUgdHdvIGNvbm5lY3Rpb25zIGFscmVhZHkgKi8KKyAgZ19hc3NlcnQgKGYtPmxlZnRfY29ubiAhPSBOVUxMKTsKKyAgZ19hc3NlcnQgKGYtPnJpZ2h0X2Nvbm4gIT0gTlVMTCk7CisKKyAgLyogT3VyIGNvbmZpZ3VyYXRpb24gZmlsZSBzZXRzIHRoZSBsaW1pdCB0byAzIGNvbm5lY3Rpb25zLCBlaXRoZXIgZ2xvYmFsbHkKKyAgICogb3IgcGVyIHVpZCwgc28gdGhpcyBvbmUgaXMgdGhlIGxhc3QgdGhhdCB3aWxsIHdvcmsgKi8KKyAgdGhpcmRfY29ubiA9IHRlc3RfY29ubmVjdF90b19idXMgKGYtPmN0eCwgZi0+YWRkcmVzcyk7CisKKyAgLyogVGhpcyBvbmUgaXMgZ29pbmcgdG8gZmFpbC4gV2UgZG9uJ3QgZ3VhcmFudGVlIHdoZXRoZXIgaXQgd2lsbCBmYWlsCisgICAqIG5vdywgb3Igd2hpbGUgcmVnaXN0ZXJpbmcgKGltcGxlbWVudGF0aW9uIGRldGFpbDogaXQncyB0aGUgbGF0dGVyKS4gKi8KKyAgZmFpbGluZ19jb25uID0gZGJ1c19jb25uZWN0aW9uX29wZW5fcHJpdmF0ZSAoZi0+YWRkcmVzcywgJmVycm9yKTsKKworICBpZiAoZmFpbGluZ19jb25uICE9IE5VTEwpCisgICAgeworICAgICAgZ2Jvb2xlYW4gb2sgPSBkYnVzX2J1c19yZWdpc3RlciAoZmFpbGluZ19jb25uLCAmZXJyb3IpOworCisgICAgICBnX2Fzc2VydCAoIW9rKTsKKyAgICB9CisKKyAgZ19hc3NlcnQgKGRidXNfZXJyb3JfaXNfc2V0ICgmZXJyb3IpKTsKKyAgZ19hc3NlcnRfY21wc3RyIChlcnJvci5uYW1lLCA9PSwgREJVU19FUlJPUl9MSU1JVFNfRVhDRUVERUQpOworCisgIGlmIChmYWlsaW5nX2Nvbm4gIT0gTlVMTCkKKyAgICBkYnVzX2Nvbm5lY3Rpb25fY2xvc2UgKGZhaWxpbmdfY29ubik7CisKKyAgZGJ1c19jbGVhcl9jb25uZWN0aW9uICgmZmFpbGluZ19jb25uKTsKKyAgZGJ1c19jb25uZWN0aW9uX2Nsb3NlICh0aGlyZF9jb25uKTsKKyAgZGJ1c19jbGVhcl9jb25uZWN0aW9uICgmdGhpcmRfY29ubik7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X21heF9yZXBsaWVzX3Blcl9jb25uZWN0aW9uIChGaXh0dXJlICpmLAorICAgIGdjb25zdHBvaW50ZXIgY29udGV4dCkKK3sKKyAgR1F1ZXVlIHJlY2VpdmVkID0gR19RVUVVRV9JTklUOworICBHUXVldWUgZXJyb3JzID0gR19RVUVVRV9JTklUOworICBEQnVzTWVzc2FnZSAqbTsKKyAgREJ1c1BlbmRpbmdDYWxsICpwYzsKKyAgZ3VpbnQgaTsKKyAgREJ1c0Vycm9yIGVycm9yID0gREJVU19FUlJPUl9JTklUOworCisgIGlmIChmLT5za2lwKQorICAgIHJldHVybjsKKworICBhZGRfaG9sZF9maWx0ZXIgKGYpOworCisgIC8qIFRoZSBjb25maWd1cmVkIGxpbWl0IGlzIDMgcmVwbGllcyBwZXIgY29ubmVjdGlvbi4gKi8KKyAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKyAgICB7CisgICAgICBtID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoCisgICAgICAgICAgZGJ1c19idXNfZ2V0X3VuaXF1ZV9uYW1lIChmLT5yaWdodF9jb25uKSwgIi8iLAorICAgICAgICAgICJjb20uZXhhbXBsZSIsICJTcGFtIik7CisKKyAgICAgIGlmIChtID09IE5VTEwpCisgICAgICAgIGdfZXJyb3IgKCJPT00iKTsKKworICAgICAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2VuZF93aXRoX3JlcGx5IChmLT5sZWZ0X2Nvbm4sIG0sICZwYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19USU1FT1VUX0lORklOSVRFKSB8fAorICAgICAgICAgIHBjID09IE5VTEwpCisgICAgICAgIGdfZXJyb3IgKCJPT00iKTsKKworICAgICAgaWYgKGRidXNfcGVuZGluZ19jYWxsX2dldF9jb21wbGV0ZWQgKHBjKSkKKyAgICAgICAgcGNfZW5xdWV1ZSAocGMsICZyZWNlaXZlZCk7CisgICAgICBlbHNlIGlmICghZGJ1c19wZW5kaW5nX2NhbGxfc2V0X25vdGlmeSAocGMsIHBjX2VucXVldWUsICZyZWNlaXZlZCwKKyAgICAgICAgICAgIE5VTEwpKQorICAgICAgICBnX2Vycm9yICgiT09NIik7CisKKyAgICAgIGRidXNfcGVuZGluZ19jYWxsX3VucmVmIChwYyk7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworICAgIH0KKworICB3aGlsZSAoZ19xdWV1ZV9nZXRfbGVuZ3RoICgmZi0+aGVsZF9tZXNzYWdlcykgPCAzKQorICAgIHRlc3RfbWFpbl9jb250ZXh0X2l0ZXJhdGUgKGYtPmN0eCwgVFJVRSk7CisKKyAgZ19hc3NlcnRfY21wdWludCAoZ19xdWV1ZV9nZXRfbGVuZ3RoICgmcmVjZWl2ZWQpLCA9PSwgMCk7CisgIGdfYXNzZXJ0X2NtcHVpbnQgKGdfcXVldWVfZ2V0X2xlbmd0aCAoJmVycm9ycyksID09LCAwKTsKKworICAvKiBHbyBhIGNvdXBsZSBvZiBtZXNzYWdlcyBvdmVyIHRoZSBsaW1pdC4gKi8KKyAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKyAgICB7CisgICAgICBtID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoCisgICAgICAgICAgZGJ1c19idXNfZ2V0X3VuaXF1ZV9uYW1lIChmLT5yaWdodF9jb25uKSwgIi8iLAorICAgICAgICAgICJjb20uZXhhbXBsZSIsICJTcGFtIik7CisKKyAgICAgIGlmIChtID09IE5VTEwpCisgICAgICAgIGdfZXJyb3IgKCJPT00iKTsKKworICAgICAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2VuZF93aXRoX3JlcGx5IChmLT5sZWZ0X2Nvbm4sIG0sICZwYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19USU1FT1VUX0lORklOSVRFKSB8fAorICAgICAgICAgIHBjID09IE5VTEwpCisgICAgICAgIGdfZXJyb3IgKCJPT00iKTsKKworICAgICAgaWYgKGRidXNfcGVuZGluZ19jYWxsX2dldF9jb21wbGV0ZWQgKHBjKSkKKyAgICAgICAgcGNfZW5xdWV1ZSAocGMsICZlcnJvcnMpOworICAgICAgZWxzZSBpZiAoIWRidXNfcGVuZGluZ19jYWxsX3NldF9ub3RpZnkgKHBjLCBwY19lbnF1ZXVlLCAmZXJyb3JzLAorICAgICAgICAgICAgTlVMTCkpCisgICAgICAgIGdfZXJyb3IgKCJPT00iKTsKKworICAgICAgZGJ1c19wZW5kaW5nX2NhbGxfdW5yZWYgKHBjKTsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisgICAgfQorCisgIC8qIFJlcGx5IHRvIHRoZSBoZWxkIG1lc3NhZ2VzLiAqLworICBmb3IgKG0gPSBnX3F1ZXVlX3BvcF9oZWFkICgmZi0+aGVsZF9tZXNzYWdlcyk7CisgICAgICAgbSAhPSBOVUxMOworICAgICAgIG0gPSBnX3F1ZXVlX3BvcF9oZWFkICgmZi0+aGVsZF9tZXNzYWdlcykpCisgICAgeworICAgICAgREJ1c01lc3NhZ2UgKnJlcGx5ID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfcmV0dXJuIChtKTsKKworICAgICAgaWYgKHJlcGx5ID09IE5VTEwpCisgICAgICAgIGdfZXJyb3IgKCJPT00iKTsKKworICAgICAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoZi0+cmlnaHRfY29ubiwgcmVwbHksIE5VTEwpKQorICAgICAgICBnX2Vycm9yICgiT09NIik7CisKKyAgICAgIGRidXNfY2xlYXJfbWVzc2FnZSAoJm0pOworICAgICAgZGJ1c19jbGVhcl9tZXNzYWdlICgmcmVwbHkpOworICAgIH0KKworICAvKiBXYWl0IGZvciBhbGwgNSByZXBsaWVzIHRvIGNvbWUgaW4uICovCisgIHdoaWxlIChnX3F1ZXVlX2dldF9sZW5ndGggKCZyZWNlaXZlZCkgKyBnX3F1ZXVlX2dldF9sZW5ndGggKCZlcnJvcnMpIDwgNSkKKyAgICB0ZXN0X21haW5fY29udGV4dF9pdGVyYXRlIChmLT5jdHgsIFRSVUUpOworCisgIC8qIFRoZSBmaXJzdCB0aHJlZSBzdWNjZWVkZWQuICovCisgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisgICAgeworICAgICAgbSA9IGdfcXVldWVfcG9wX2hlYWQgKCZyZWNlaXZlZCk7CisgICAgICBnX2Fzc2VydCAobSAhPSBOVUxMKTsKKworICAgICAgaWYgKGRidXNfc2V0X2Vycm9yX2Zyb21fbWVzc2FnZSAoJmVycm9yLCBtKSkKKyAgICAgICAgZ19lcnJvciAoIlVuZXhwZWN0ZWQgZXJyb3I6ICVzOiAlcyIsIGVycm9yLm5hbWUsIGVycm9yLm1lc3NhZ2UpOworCisgICAgICBkYnVzX2NsZWFyX21lc3NhZ2UgKCZtKTsKKyAgICB9CisKKyAgLyogVGhlIGxhc3QgdHdvIGZhaWxlZC4gKi8KKyAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKyAgICB7CisgICAgICBtID0gZ19xdWV1ZV9wb3BfaGVhZCAoJmVycm9ycyk7CisgICAgICBnX2Fzc2VydCAobSAhPSBOVUxMKTsKKworICAgICAgaWYgKCFkYnVzX3NldF9lcnJvcl9mcm9tX21lc3NhZ2UgKCZlcnJvciwgbSkpCisgICAgICAgIGdfZXJyb3IgKCJVbmV4cGVjdGVkIHN1Y2Nlc3MiKTsKKworICAgICAgZ19hc3NlcnRfY21wc3RyIChlcnJvci5uYW1lLCA9PSwgREJVU19FUlJPUl9MSU1JVFNfRVhDRUVERUQpOworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgZGJ1c19jbGVhcl9tZXNzYWdlICgmbSk7CisgICAgfQorCisgIGdfYXNzZXJ0X2NtcHVpbnQgKGdfcXVldWVfZ2V0X2xlbmd0aCAoJnJlY2VpdmVkKSwgPT0sIDApOworICBnX2Fzc2VydF9jbXB1aW50IChnX3F1ZXVlX2dldF9sZW5ndGggKCZlcnJvcnMpLCA9PSwgMCk7CisgIGdfcXVldWVfY2xlYXIgKCZyZWNlaXZlZCk7CisgIGdfcXVldWVfY2xlYXIgKCZlcnJvcnMpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9tYXhfbWF0Y2hfcnVsZXNfcGVyX2Nvbm5lY3Rpb24gKEZpeHR1cmUgKmYsCisgICAgZ2NvbnN0cG9pbnRlciBjb250ZXh0KQoreworICBEQnVzRXJyb3IgZXJyb3IgPSBEQlVTX0VSUk9SX0lOSVQ7CisKKyAgaWYgKGYtPnNraXApCisgICAgcmV0dXJuOworCisgIGRidXNfYnVzX2FkZF9tYXRjaCAoZi0+bGVmdF9jb25uLCAic2VuZGVyPSdjb20uZXhhbXBsZS5DMSciLCAmZXJyb3IpOworICB0ZXN0X2Fzc2VydF9ub19lcnJvciAoJmVycm9yKTsKKyAgZGJ1c19idXNfYWRkX21hdGNoIChmLT5sZWZ0X2Nvbm4sICJzZW5kZXI9J2NvbS5leGFtcGxlLkMyJyIsICZlcnJvcik7CisgIHRlc3RfYXNzZXJ0X25vX2Vycm9yICgmZXJyb3IpOworICBkYnVzX2J1c19hZGRfbWF0Y2ggKGYtPmxlZnRfY29ubiwgInNlbmRlcj0nY29tLmV4YW1wbGUuQzMnIiwgJmVycm9yKTsKKyAgdGVzdF9hc3NlcnRfbm9fZXJyb3IgKCZlcnJvcik7CisKKyAgZGJ1c19idXNfYWRkX21hdGNoIChmLT5sZWZ0X2Nvbm4sICJzZW5kZXI9J2NvbS5leGFtcGxlLkM0JyIsICZlcnJvcik7CisgIGdfYXNzZXJ0X2NtcHN0ciAoZXJyb3IubmFtZSwgPT0sIERCVVNfRVJST1JfTElNSVRTX0VYQ0VFREVEKTsKKyAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworCisgIGRidXNfYnVzX3JlbW92ZV9tYXRjaCAoZi0+bGVmdF9jb25uLCAic2VuZGVyPSdjb20uZXhhbXBsZS5DMyciLCAmZXJyb3IpOworICB0ZXN0X2Fzc2VydF9ub19lcnJvciAoJmVycm9yKTsKKworICBkYnVzX2J1c19hZGRfbWF0Y2ggKGYtPmxlZnRfY29ubiwgInNlbmRlcj0nY29tLmV4YW1wbGUuQzQnIiwgJmVycm9yKTsKKyAgdGVzdF9hc3NlcnRfbm9fZXJyb3IgKCZlcnJvcik7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X21heF9uYW1lc19wZXJfY29ubmVjdGlvbiAoRml4dHVyZSAqZiwKKyAgICBnY29uc3Rwb2ludGVyIGNvbnRleHQpCit7CisgIERCdXNFcnJvciBlcnJvciA9IERCVVNfRVJST1JfSU5JVDsKKyAgaW50IHJldDsKKworICBpZiAoZi0+c2tpcCkKKyAgICByZXR1cm47CisKKyAgLyogVGhlIGxpbWl0IGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgaXMgc2V0IHRvIDQsIGJ1dCB3ZSBvbmx5IG93biAzCisgICAqIG5hbWVzIGhlcmUgLSByZW1lbWJlciB0aGF0IHRoZSB1bmlxdWUgbmFtZSBpcyBhIG5hbWUgdG9vLiAqLworCisgIHJldCA9IGRidXNfYnVzX3JlcXVlc3RfbmFtZSAoZi0+bGVmdF9jb25uLCAiY29tLmV4YW1wbGUuQzEiLCAwLCAmZXJyb3IpOworICB0ZXN0X2Fzc2VydF9ub19lcnJvciAoJmVycm9yKTsKKyAgZ19hc3NlcnRfY21waW50IChyZXQsID09LCBEQlVTX1JFUVVFU1RfTkFNRV9SRVBMWV9QUklNQVJZX09XTkVSKTsKKworICByZXQgPSBkYnVzX2J1c19yZXF1ZXN0X25hbWUgKGYtPmxlZnRfY29ubiwgImNvbS5leGFtcGxlLkMyIiwgMCwgJmVycm9yKTsKKyAgdGVzdF9hc3NlcnRfbm9fZXJyb3IgKCZlcnJvcik7CisgIGdfYXNzZXJ0X2NtcGludCAocmV0LCA9PSwgREJVU19SRVFVRVNUX05BTUVfUkVQTFlfUFJJTUFSWV9PV05FUik7CisKKyAgcmV0ID0gZGJ1c19idXNfcmVxdWVzdF9uYW1lIChmLT5sZWZ0X2Nvbm4sICJjb20uZXhhbXBsZS5DMyIsIDAsICZlcnJvcik7CisgIHRlc3RfYXNzZXJ0X25vX2Vycm9yICgmZXJyb3IpOworICBnX2Fzc2VydF9jbXBpbnQgKHJldCwgPT0sIERCVVNfUkVRVUVTVF9OQU1FX1JFUExZX1BSSU1BUllfT1dORVIpOworCisgIHJldCA9IGRidXNfYnVzX3JlcXVlc3RfbmFtZSAoZi0+bGVmdF9jb25uLCAiY29tLmV4YW1wbGUuQzQiLCAwLCAmZXJyb3IpOworICBnX2Fzc2VydF9jbXBzdHIgKGVycm9yLm5hbWUsID09LCBEQlVTX0VSUk9SX0xJTUlUU19FWENFRURFRCk7CisgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgZ19hc3NlcnRfY21waW50IChyZXQsID09LCAtMSk7CisKKyAgcmV0ID0gZGJ1c19idXNfcmVsZWFzZV9uYW1lIChmLT5sZWZ0X2Nvbm4sICJjb20uZXhhbXBsZS5DMyIsICZlcnJvcik7CisgIHRlc3RfYXNzZXJ0X25vX2Vycm9yICgmZXJyb3IpOworICBnX2Fzc2VydF9jbXBpbnQgKHJldCwgPT0sIERCVVNfUkVMRUFTRV9OQU1FX1JFUExZX1JFTEVBU0VEKTsKKworICByZXQgPSBkYnVzX2J1c19yZXF1ZXN0X25hbWUgKGYtPmxlZnRfY29ubiwgImNvbS5leGFtcGxlLkM0IiwgMCwgJmVycm9yKTsKKyAgdGVzdF9hc3NlcnRfbm9fZXJyb3IgKCZlcnJvcik7CisgIGdfYXNzZXJ0X2NtcGludCAocmV0LCA9PSwgREJVU19SRVFVRVNUX05BTUVfUkVQTFlfUFJJTUFSWV9PV05FUik7Cit9CisKKyNpZiBkZWZpbmVkKERCVVNfVU5JWCkgJiYgZGVmaW5lZChIQVZFX1VOSVhfRkRfUEFTU0lORykgJiYgZGVmaW5lZChIQVZFX0dJT19VTklYKQorCitzdGF0aWMgREJ1c0hhbmRsZXJSZXN1bHQKK3dhaXRfZm9yX2Rpc2Nvbm5lY3RlZF9jYiAoREJ1c0Nvbm5lY3Rpb24gKmNsaWVudF9jb25uLAorICAgIERCdXNNZXNzYWdlICptZXNzYWdlLAorICAgIHZvaWQgKmRhdGEpCit7CisgIGdib29sZWFuICpkaXNjb25uZWN0ZWQgPSBkYXRhOworCisgIGlmIChkYnVzX21lc3NhZ2VfaXNfc2lnbmFsIChtZXNzYWdlLCBEQlVTX0lOVEVSRkFDRV9MT0NBTCwgIkRpc2Nvbm5lY3RlZCIpKQorICAgIHsKKyAgICAgICpkaXNjb25uZWN0ZWQgPSBUUlVFOworICAgICAgcmV0dXJuIERCVVNfSEFORExFUl9SRVNVTFRfSEFORExFRDsKKyAgICB9CisKKyAgcmV0dXJuIERCVVNfSEFORExFUl9SRVNVTFRfTk9UX1lFVF9IQU5ETEVEOworfQorCitzdGF0aWMgY29uc3QgZ3VjaGFyIHBhcnRpYWxfbWVzc2FnZVtdID0KK3sKKyAgREJVU19MSVRUTEVfRU5ESUFOLAorICBEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfQ0FMTCwKKyAgMCwgLyogZmxhZ3MgKi8KKyAgMSwgLyogdmVyc2lvbiAqLworICAweGZmLCAweGZmLCAwLCAwLCAvKiBsZW5ndGggb2YgYm9keSA9IDY1NTM1IGJ5dGVzICovCisgIDEsIDIsIDMsIDQsIC8qIGNvb2tpZSAqLworICAweGZmLCAweGZmLCAwLCAwLCAvKiBsZW5ndGggb2YgaGVhZGVyIGZpZWxkcyBhcnJheSA9IDY1NTM1IGJ5dGVzICovCisgIDQyIC8qIHByZXRlbmRpbmcgdG8gYmUgdGhlIGJlZ2lubmluZyBvZiB0aGUgaGVhZGVyIGZpZWxkcyBhcnJheSAqLworfTsKKworc3RhdGljIHZvaWQKK3NlbmRfYWxsX3dpdGhfZmQgKEdTb2NrZXQgKnNvY2tldCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IGd1Y2hhciAqbG9jYWxfcGFydGlhbF9tZXNzYWdlLAorICAgICAgICAgICAgICAgICAgZ3NpemUgbGVuLAorICAgICAgICAgICAgICAgICAgaW50IGZkKQoreworICBHU29ja2V0Q29udHJvbE1lc3NhZ2UgKmZkbSA9IGdfdW5peF9mZF9tZXNzYWdlX25ldyAoKTsKKyAgR0Vycm9yICplcnJvciA9IE5VTEw7CisgIGdzc2l6ZSBzZW50OworICBHT3V0cHV0VmVjdG9yIHZlY3RvciA9IHsgbG9jYWxfcGFydGlhbF9tZXNzYWdlLCBsZW4gfTsKKworICBnX3VuaXhfZmRfbWVzc2FnZV9hcHBlbmRfZmQgKEdfVU5JWF9GRF9NRVNTQUdFIChmZG0pLCBmZCwgJmVycm9yKTsKKyAgZ19hc3NlcnRfbm9fZXJyb3IgKGVycm9yKTsKKworICBzZW50ID0gZ19zb2NrZXRfc2VuZF9tZXNzYWdlIChzb2NrZXQsIE5VTEwsICZ2ZWN0b3IsIDEsICZmZG0sIDEsCisgICAgICBHX1NPQ0tFVF9NU0dfTk9ORSwgTlVMTCwgJmVycm9yKTsKKyAgZ19hc3NlcnRfbm9fZXJyb3IgKGVycm9yKTsKKyAgZ19hc3NlcnRfY21waW50IChzZW50LCA+PSwgMSk7CisgIGdfYXNzZXJ0X2NtcGludCAoc2VudCwgPD0sIHZlY3Rvci5zaXplKTsKKworICB3aGlsZSAoKChnc2l6ZSkgc2VudCkgPCB2ZWN0b3Iuc2l6ZSkKKyAgICB7CisgICAgICB2ZWN0b3Iuc2l6ZSAtPSBzZW50OworICAgICAgdmVjdG9yLmJ1ZmZlciA9ICgoY29uc3QgZ3VjaGFyICopIHZlY3Rvci5idWZmZXIpICsgc2VudDsKKyAgICAgIHNlbnQgPSBnX3NvY2tldF9zZW5kX21lc3NhZ2UgKHNvY2tldCwgTlVMTCwgJnZlY3RvciwgMSwgTlVMTCwgMCwKKyAgICAgICAgICBHX1NPQ0tFVF9NU0dfTk9ORSwgTlVMTCwgJmVycm9yKTsKKyAgICAgIGdfYXNzZXJ0X25vX2Vycm9yIChlcnJvcik7CisgICAgICBnX2Fzc2VydF9jbXBpbnQgKHNlbnQsID49LCAxKTsKKyAgICAgIGdfYXNzZXJ0X2NtcGludCAoc2VudCwgPD0sIHZlY3Rvci5zaXplKTsKKyAgICB9CisKKyAgZ19vYmplY3RfdW5yZWYgKGZkbSk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3BlbmRpbmdfZmRfdGltZW91dCAoRml4dHVyZSAqZiwKKyAgICBnY29uc3Rwb2ludGVyIGNvbnRleHQpCit7CisgIEdFcnJvciAqZXJyb3IgPSBOVUxMOworICBnaW50NjQgc3RhcnQ7CisgIGludCBmZDsKKyAgR1NvY2tldCAqc29ja2V0OworICBnYm9vbGVhbiBoYXZlX21lbTsKKyAgZ2Jvb2xlYW4gZGlzY29ubmVjdGVkID0gRkFMU0U7CisKKyAgaWYgKGYtPnNraXApCisgICAgcmV0dXJuOworCisgIGlmIChnZXR1aWQgKCkgPT0gMCkKKyAgICB7CisgICAgICBnX3Rlc3Rfc2tpcCAoIkNhbm5vdCB0ZXN0LCB1aWQgMCBpcyBpbW11bmUgdG8gdGhpcyBsaW1pdCIpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBoYXZlX21lbSA9IGRidXNfY29ubmVjdGlvbl9hZGRfZmlsdGVyIChmLT5sZWZ0X2Nvbm4sIHdhaXRfZm9yX2Rpc2Nvbm5lY3RlZF9jYiwKKyAgICAgICZkaXNjb25uZWN0ZWQsIE5VTEwpOworICBnX2Fzc2VydCAoaGF2ZV9tZW0pOworCisgIC8qIFRoaXMgaXMgbm90IEFQSS4gTmV2ZXIgZG8gdGhpcy4gKi8KKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9nZXRfc29ja2V0IChmLT5sZWZ0X2Nvbm4sICZmZCkpCisgICAgZ19lcnJvciAoImZhaWxlZCB0byBzdGVhbCBmZCBmcm9tIGxlZnQgY29ubmVjdGlvbiIpOworCisgIHNvY2tldCA9IGdfc29ja2V0X25ld19mcm9tX2ZkIChmZCwgJmVycm9yKTsKKyAgZ19hc3NlcnRfbm9fZXJyb3IgKGVycm9yKTsKKyAgZ19hc3NlcnQgKHNvY2tldCAhPSBOVUxMKTsKKworICAvKiBXZSBzZW5kIHBhcnQgb2YgYSBtZXNzYWdlIHRoYXQgY29udGFpbnMgYSBmZCwgdGhlbiBzdG9wLiAqLworICBzdGFydCA9IGdfZ2V0X21vbm90b25pY190aW1lICgpOworICBzZW5kX2FsbF93aXRoX2ZkIChzb2NrZXQsIHBhcnRpYWxfbWVzc2FnZSwgR19OX0VMRU1FTlRTIChwYXJ0aWFsX21lc3NhZ2UpLAorICAgICAgICAgICAgICAgICAgICBmZCk7CisKKyAgd2hpbGUgKCFkaXNjb25uZWN0ZWQpCisgICAgeworICAgICAgdGVzdF9wcm9ncmVzcyAoJy4nKTsKKyAgICAgIHRlc3RfbWFpbl9jb250ZXh0X2l0ZXJhdGUgKGYtPmN0eCwgVFJVRSk7CisKKyAgICAgIC8qIEl0IHNob3VsZCB0YWtlIDAuNXMgdG8gZ2V0IGRpc2Nvbm5lY3RlZCwgYXMgY29uZmlndXJlZCBpbgorICAgICAgICogdmFsaWQtY29uZmlnLWZpbGVzL3BlbmRpbmctZmQtdGltZW91dC5jb25mOyBidXQgdGhpcyB0ZXN0CisgICAgICAgKiBtaWdodCBnZXQgc3RhcnZlZCBieSBvdGhlciBwcm9jZXNzZXMgcnVubmluZyBpbiBwYXJhbGxlbAorICAgICAgICogKHBhcnRpY3VsYXJseSBvbiBzaGFyZWQgQ0kgc3lzdGVtcyksIHNvIHdlIGhhdmUgdG8gYmUgYSBsb3QKKyAgICAgICAqIG1vcmUgZ2VuZXJvdXMuIEFsbG93IHVwIHRvIDEwIHNlY29uZHMuICovCisgICAgICBnX2Fzc2VydF9jbXBpbnQgKGdfZ2V0X21vbm90b25pY190aW1lICgpLCA8PSwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgKyAoMTAgKiBHX1VTRUNfUEVSX1NFQykpOworICAgIH0KKworICBnX29iamVjdF91bnJlZiAoc29ja2V0KTsKK30KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgY29uc3QgZ2NoYXIgKnBhdGg7CisgIGd1aW50IG5fZmRzOworICBnYm9vbGVhbiBzaG91bGRfd29yazsKK30gQ291bnRGZHNWZWN0b3I7CisKK3N0YXRpYyBjb25zdCBDb3VudEZkc1ZlY3RvciBjb3VudF9mZHNfdmVjdG9yc1tdID0KK3sKKyAgLyogRGVueSBzZW5kaW5nIGlmIG51bWJlciBvZiBmZHMgPD0gMiAqLworICB7ICIvdGVzdC9EZW55U2VuZE1heDIiLCAxLCBGQUxTRSB9LAorICB7ICIvdGVzdC9EZW55U2VuZE1heDIiLCAyLCBGQUxTRSB9LAorICB7ICIvdGVzdC9EZW55U2VuZE1heDIiLCAzLCBUUlVFIH0sCisgIHsgIi90ZXN0L0RlbnlTZW5kTWF4MiIsIDQsIFRSVUUgfSwKKworICAvKiBEZW55IHJlY2VpdmluZyBpZiBudW1iZXIgb2YgZmRzIDw9IDMgKi8KKyAgeyAiL3Rlc3QvRGVueVJlY2VpdmVNYXgzIiwgMiwgRkFMU0UgfSwKKyAgeyAiL3Rlc3QvRGVueVJlY2VpdmVNYXgzIiwgMywgRkFMU0UgfSwKKyAgeyAiL3Rlc3QvRGVueVJlY2VpdmVNYXgzIiwgNCwgVFJVRSB9LAorICB7ICIvdGVzdC9EZW55UmVjZWl2ZU1heDMiLCA1LCBUUlVFIH0sCisKKyAgLyogRGVueSBzZW5kaW5nIGlmIG51bWJlciBvZiBmZHMgPj0gNCAqLworICB7ICIvdGVzdC9EZW55U2VuZE1pbjQiLCAyLCBUUlVFIH0sCisgIHsgIi90ZXN0L0RlbnlTZW5kTWluNCIsIDMsIFRSVUUgfSwKKyAgeyAiL3Rlc3QvRGVueVNlbmRNaW40IiwgNCwgRkFMU0UgfSwKKyAgeyAiL3Rlc3QvRGVueVNlbmRNaW40IiwgNSwgRkFMU0UgfSwKKworICAvKiBEZW55IHJlY2VpdmluZyBpZiBudW1iZXIgb2YgZmRzID49IDUgKi8KKyAgeyAiL3Rlc3QvRGVueVJlY2VpdmVNaW41IiwgMywgVFJVRSB9LAorICB7ICIvdGVzdC9EZW55UmVjZWl2ZU1pbjUiLCA0LCBUUlVFIH0sCisgIHsgIi90ZXN0L0RlbnlSZWNlaXZlTWluNSIsIDUsIEZBTFNFIH0sCisgIHsgIi90ZXN0L0RlbnlSZWNlaXZlTWluNSIsIDYsIEZBTFNFIH0sCit9OworCitzdGF0aWMgdm9pZAordGVzdF9jb3VudF9mZHMgKEZpeHR1cmUgKmYsCisgICAgZ2NvbnN0cG9pbnRlciBjb250ZXh0KQoreworICBHUXVldWUgcmVjZWl2ZWQgPSBHX1FVRVVFX0lOSVQ7CisgIERCdXNNZXNzYWdlICptOworICBEQnVzUGVuZGluZ0NhbGwgKnBjOworICBndWludCBpOworICBEQnVzRXJyb3IgZXJyb3IgPSBEQlVTX0VSUk9SX0lOSVQ7CisgIGNvbnN0IGludCBzdGRpbl9mZCA9IDA7CisKKyAgaWYgKGYtPnNraXApCisgICAgcmV0dXJuOworCisgIGFkZF9ob2xkX2ZpbHRlciAoZik7CisKKyAgZm9yIChpID0gMDsgaSA8IEdfTl9FTEVNRU5UUyAoY291bnRfZmRzX3ZlY3RvcnMpOyBpKyspCisgICAgeworICAgICAgY29uc3QgQ291bnRGZHNWZWN0b3IgKnZlY3RvciA9ICZjb3VudF9mZHNfdmVjdG9yc1tpXTsKKyAgICAgIGd1aW50IGo7CisKKyAgICAgIG0gPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsICgKKyAgICAgICAgICBkYnVzX2J1c19nZXRfdW5pcXVlX25hbWUgKGYtPnJpZ2h0X2Nvbm4pLCB2ZWN0b3ItPnBhdGgsCisgICAgICAgICAgImNvbS5leGFtcGxlIiwgIlNwYW0iKTsKKworICAgICAgaWYgKG0gPT0gTlVMTCkKKyAgICAgICAgZ19lcnJvciAoIk9PTSIpOworCisgICAgICBmb3IgKGogPSAwOyBqIDwgdmVjdG9yLT5uX2ZkczsgaisrKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9VTklYX0ZELCAmc3RkaW5fZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICAgICAgICAgIGdfZXJyb3IgKCJPT00iKTsKKyAgICAgICAgfQorCisgICAgICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHkgKGYtPmxlZnRfY29ubiwgbSwgJnBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RJTUVPVVRfSU5GSU5JVEUpIHx8CisgICAgICAgICAgcGMgPT0gTlVMTCkKKyAgICAgICAgZ19lcnJvciAoIk9PTSIpOworCisgICAgICBpZiAoZGJ1c19wZW5kaW5nX2NhbGxfZ2V0X2NvbXBsZXRlZCAocGMpKQorICAgICAgICBwY19lbnF1ZXVlIChwYywgJnJlY2VpdmVkKTsKKyAgICAgIGVsc2UgaWYgKCFkYnVzX3BlbmRpbmdfY2FsbF9zZXRfbm90aWZ5IChwYywgcGNfZW5xdWV1ZSwgJnJlY2VpdmVkLAorICAgICAgICAgICAgTlVMTCkpCisgICAgICAgIGdfZXJyb3IgKCJPT00iKTsKKworICAgICAgZGJ1c19wZW5kaW5nX2NhbGxfdW5yZWYgKHBjKTsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisKKyAgICAgIGlmICh2ZWN0b3ItPnNob3VsZF93b3JrKQorICAgICAgICB7CisgICAgICAgICAgREJ1c01lc3NhZ2UgKnJlcGx5OworCisgICAgICAgICAgd2hpbGUgKGdfcXVldWVfZ2V0X2xlbmd0aCAoJmYtPmhlbGRfbWVzc2FnZXMpIDwgMSkKKyAgICAgICAgICAgIHRlc3RfbWFpbl9jb250ZXh0X2l0ZXJhdGUgKGYtPmN0eCwgVFJVRSk7CisKKyAgICAgICAgICBnX2Fzc2VydF9jbXBpbnQgKGdfcXVldWVfZ2V0X2xlbmd0aCAoJmYtPmhlbGRfbWVzc2FnZXMpLCA9PSwgMSk7CisKKyAgICAgICAgICBtID0gZ19xdWV1ZV9wb3BfaGVhZCAoJmYtPmhlbGRfbWVzc2FnZXMpOworCisgICAgICAgICAgZ19hc3NlcnRfY21waW50IChnX3F1ZXVlX2dldF9sZW5ndGggKCZmLT5oZWxkX21lc3NhZ2VzKSwgPT0sIDApOworCisgICAgICAgICAgcmVwbHkgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9yZXR1cm4gKG0pOworCisgICAgICAgICAgaWYgKHJlcGx5ID09IE5VTEwpCisgICAgICAgICAgICBnX2Vycm9yICgiT09NIik7CisKKyAgICAgICAgICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZW5kIChmLT5yaWdodF9jb25uLCByZXBseSwgTlVMTCkpCisgICAgICAgICAgICBnX2Vycm9yICgiT09NIik7CisKKyAgICAgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKyAgICAgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworICAgICAgICB9CisKKyAgICAgIHdoaWxlIChnX3F1ZXVlX2dldF9sZW5ndGggKCZyZWNlaXZlZCkgPCAxKQorICAgICAgICB0ZXN0X21haW5fY29udGV4dF9pdGVyYXRlIChmLT5jdHgsIFRSVUUpOworCisgICAgICBnX2Fzc2VydF9jbXBpbnQgKGdfcXVldWVfZ2V0X2xlbmd0aCAoJnJlY2VpdmVkKSwgPT0sIDEpOworICAgICAgbSA9IGdfcXVldWVfcG9wX2hlYWQgKCZyZWNlaXZlZCk7CisgICAgICBnX2Fzc2VydCAobSAhPSBOVUxMKTsKKyAgICAgIGdfYXNzZXJ0X2NtcGludCAoZ19xdWV1ZV9nZXRfbGVuZ3RoICgmcmVjZWl2ZWQpLCA9PSwgMCk7CisKKyAgICAgIGlmICh2ZWN0b3ItPnNob3VsZF93b3JrKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGRidXNfc2V0X2Vycm9yX2Zyb21fbWVzc2FnZSAoJmVycm9yLCBtKSkKKyAgICAgICAgICAgIGdfZXJyb3IgKCJVbmV4cGVjdGVkIGVycm9yOiAlczogJXMiLCBlcnJvci5uYW1lLCBlcnJvci5tZXNzYWdlKTsKKworICAgICAgICAgIGdfdGVzdF9tZXNzYWdlICgiU2VuZGluZyAldSBmZHMgdG8gJXMgd2FzIG5vdCBkZW5pZWQsIGFzIGV4cGVjdGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yLT5uX2ZkcywgdmVjdG9yLT5wYXRoKTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoIWRidXNfc2V0X2Vycm9yX2Zyb21fbWVzc2FnZSAoJmVycm9yLCBtKSkKKyAgICAgICAgeworICAgICAgICAgIGdfZXJyb3IgKCJVbmV4cGVjdGVkIHN1Y2Nlc3MiKTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgZ19hc3NlcnRfY21wc3RyIChlcnJvci5uYW1lLCA9PSwgREJVU19FUlJPUl9BQ0NFU1NfREVOSUVEKTsKKyAgICAgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICAgICAgZ190ZXN0X21lc3NhZ2UgKCJTZW5kaW5nICV1IGZkcyB0byAlcyB3YXMgZGVuaWVkLCBhcyBleHBlY3RlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3Rvci0+bl9mZHMsIHZlY3Rvci0+cGF0aCk7CisgICAgICAgIH0KKworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtKTsKKyAgICB9Cit9CisKKyNlbmRpZgorCitzdGF0aWMgdm9pZAordGVzdF9wZWVyX2dldF9tYWNoaW5lX2lkIChGaXh0dXJlICpmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBnY29uc3Rwb2ludGVyIGNvbnRleHQpCit7CisgIGNoYXIgKndoYXRfaV90aGluazsKKyAgY29uc3QgY2hhciAqd2hhdF9kYWVtb25fdGhpbmtzOworICBEQnVzTWVzc2FnZSAqbSA9IE5VTEw7CisgIERCdXNQZW5kaW5nQ2FsbCAqcGMgPSBOVUxMOworICBEQnVzRXJyb3IgZXJyb3IgPSBEQlVTX0VSUk9SX0lOSVQ7CisKKyAgaWYgKGYtPnNraXApCisgICAgcmV0dXJuOworCisgIHdoYXRfaV90aGluayA9IGRidXNfdHJ5X2dldF9sb2NhbF9tYWNoaW5lX2lkICgmZXJyb3IpOworCisgIGlmICh3aGF0X2lfdGhpbmsgPT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoZ19nZXRlbnYgKCJEQlVTX1RFU1RfVU5JTlNUQUxMRUQiKSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgLyogV2hlbiBydW5uaW5nIHVuaXQgdGVzdHMgZHVyaW5nIG1ha2UgY2hlY2sgb3IgbWFrZSBpbnN0YWxsY2hlY2ssCisgICAgICAgICAgICogdG9sZXJhdGUgdGhpcyAqLworICAgICAgICAgIGdfdGVzdF9za2lwICgiTWFjaGluZSBVVUlEIG5vdCBhdmFpbGFibGUiKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8qIFdoZW4gcnVubmluZyBpbnRlZ3JhdGlvbiB0ZXN0cywgZG9uJ3QgdG9sZXJhdGUgaXQgKi8KKyAgICAgICAgICBnX2Vycm9yICgiJXMiLCBlcnJvci5tZXNzYWdlKTsKKyAgICAgICAgfQorICAgIH0KKworICAvKiBDaGVjayB0aGF0IHRoZSBkYnVzLWRhZW1vbiBhZ3JlZXMgd2l0aCB1cy4gKi8KKyAgbSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKERCVVNfU0VSVklDRV9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19QQVRIX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0lOVEVSRkFDRV9QRUVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdldE1hY2hpbmVJZCIpOworCisgIGlmIChtID09IE5VTEwgfHwKKyAgICAgICFkYnVzX2Nvbm5lY3Rpb25fc2VuZF93aXRoX3JlcGx5IChmLT5sZWZ0X2Nvbm4sIG0sICZwYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RJTUVPVVRfVVNFX0RFRkFVTFQpIHx8CisgICAgICBwYyA9PSBOVUxMKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKworICBkYnVzX2NsZWFyX21lc3NhZ2UgKCZtKTsKKworICBpZiAoZGJ1c19wZW5kaW5nX2NhbGxfZ2V0X2NvbXBsZXRlZCAocGMpKQorICAgIHRlc3RfcGVuZGluZ19jYWxsX3N0b3JlX3JlcGx5IChwYywgJm0pOworICBlbHNlIGlmICghZGJ1c19wZW5kaW5nX2NhbGxfc2V0X25vdGlmeSAocGMsIHRlc3RfcGVuZGluZ19jYWxsX3N0b3JlX3JlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm0sIE5VTEwpKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKworICB3aGlsZSAobSA9PSBOVUxMKQorICAgIHRlc3RfbWFpbl9jb250ZXh0X2l0ZXJhdGUgKGYtPmN0eCwgVFJVRSk7CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MgKG0sICZlcnJvciwKKyAgICAgICAgREJVU19UWVBFX1NUUklORywgJndoYXRfZGFlbW9uX3RoaW5rcywKKyAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgIGdfZXJyb3IgKCIlczogJXMiLCBlcnJvci5uYW1lLCBlcnJvci5tZXNzYWdlKTsKKworICBnX2Fzc2VydF9jbXBzdHIgKHdoYXRfaV90aGluaywgPT0sIHdoYXRfZGFlbW9uX3RoaW5rcyk7CisgIGdfYXNzZXJ0X25vbm51bGwgKHdoYXRfZGFlbW9uX3RoaW5rcyk7CisgIGdfYXNzZXJ0X2NtcHVpbnQgKHN0cmxlbiAod2hhdF9kYWVtb25fdGhpbmtzKSwgPT0sIDMyKTsKKworICBkYnVzX2NsZWFyX21lc3NhZ2UgKCZtKTsKKyAgZGJ1c19jbGVhcl9wZW5kaW5nX2NhbGwgKCZwYyk7CisgIGRidXNfZnJlZSAod2hhdF9pX3RoaW5rKTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfcGVlcl9waW5nIChGaXh0dXJlICpmLAorICAgICAgICAgICAgICAgIGdjb25zdHBvaW50ZXIgY29udGV4dCkKK3sKKyAgREJ1c01lc3NhZ2UgKm0gPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsIChEQlVTX1NFUlZJQ0VfREJVUywKKyAgICAgIERCVVNfUEFUSF9EQlVTLCBEQlVTX0lOVEVSRkFDRV9QRUVSLCAiUGluZyIpOworICBEQnVzUGVuZGluZ0NhbGwgKnBjID0gTlVMTDsKKyAgREJ1c0Vycm9yIGVycm9yID0gREJVU19FUlJPUl9JTklUOworCisgIGlmIChmLT5za2lwKQorICAgIHJldHVybjsKKworICBtID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoREJVU19TRVJWSUNFX0RCVVMsCisgICAgICBEQlVTX1BBVEhfREJVUywgREJVU19JTlRFUkZBQ0VfUEVFUiwgIlBpbmciKTsKKworICBpZiAobSA9PSBOVUxMIHx8CisgICAgICAhZGJ1c19jb25uZWN0aW9uX3NlbmRfd2l0aF9yZXBseSAoZi0+bGVmdF9jb25uLCBtLCAmcGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19USU1FT1VUX1VTRV9ERUZBVUxUKSB8fAorICAgICAgcGMgPT0gTlVMTCkKKyAgICBnX2Vycm9yICgiT09NIik7CisKKyAgZGJ1c19jbGVhcl9tZXNzYWdlICgmbSk7CisKKyAgaWYgKGRidXNfcGVuZGluZ19jYWxsX2dldF9jb21wbGV0ZWQgKHBjKSkKKyAgICB0ZXN0X3BlbmRpbmdfY2FsbF9zdG9yZV9yZXBseSAocGMsICZtKTsKKyAgZWxzZSBpZiAoIWRidXNfcGVuZGluZ19jYWxsX3NldF9ub3RpZnkgKHBjLCB0ZXN0X3BlbmRpbmdfY2FsbF9zdG9yZV9yZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtLCBOVUxMKSkKKyAgICBnX2Vycm9yICgiT09NIik7CisKKyAgd2hpbGUgKG0gPT0gTlVMTCkKKyAgICB0ZXN0X21haW5fY29udGV4dF9pdGVyYXRlIChmLT5jdHgsIFRSVUUpOworCisgIGlmICghZGJ1c19tZXNzYWdlX2dldF9hcmdzIChtLCAmZXJyb3IsIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICBnX2Vycm9yICgiJXM6ICVzIiwgZXJyb3IubmFtZSwgZXJyb3IubWVzc2FnZSk7CisKKyAgZGJ1c19jbGVhcl9tZXNzYWdlICgmbSk7CisgIGRidXNfY2xlYXJfcGVuZGluZ19jYWxsICgmcGMpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9nZXRfaW52YWxpZF9wYXRoIChGaXh0dXJlICpmLAorICAgICAgICAgICAgICAgICAgICAgICBnY29uc3Rwb2ludGVyIGNvbnRleHQpCit7CisgIERCdXNNZXNzYWdlICptID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoREJVU19TRVJWSUNFX0RCVVMsCisgICAgICAiLyIsIERCVVNfSU5URVJGQUNFX1BST1BFUlRJRVMsICJHZXQiKTsKKyAgREJ1c1BlbmRpbmdDYWxsICpwYyA9IE5VTEw7CisgIERCdXNFcnJvciBlcnJvciA9IERCVVNfRVJST1JfSU5JVDsKKyAgY29uc3QgY2hhciAqaWZhY2UgPSBEQlVTX0lOVEVSRkFDRV9EQlVTOworICBjb25zdCBjaGFyICpwcm9wZXJ0eSA9ICJJbnRlcmZhY2VzIjsKKworICBpZiAoZi0+c2tpcCkKKyAgICByZXR1cm47CisKKyAgaWYgKG0gPT0gTlVMTCB8fAorICAgICAgIWRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAobSwKKyAgICAgICAgREJVU19UWVBFX1NUUklORywgJmlmYWNlLAorICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmcHJvcGVydHksCisgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSB8fAorICAgICAgIWRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHkgKGYtPmxlZnRfY29ubiwgbSwgJnBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVElNRU9VVF9VU0VfREVGQVVMVCkgfHwKKyAgICAgIHBjID09IE5VTEwpCisgICAgZ19lcnJvciAoIk9PTSIpOworCisgIGRidXNfY2xlYXJfbWVzc2FnZSAoJm0pOworCisgIGlmIChkYnVzX3BlbmRpbmdfY2FsbF9nZXRfY29tcGxldGVkIChwYykpCisgICAgdGVzdF9wZW5kaW5nX2NhbGxfc3RvcmVfcmVwbHkgKHBjLCAmbSk7CisgIGVsc2UgaWYgKCFkYnVzX3BlbmRpbmdfY2FsbF9zZXRfbm90aWZ5IChwYywgdGVzdF9wZW5kaW5nX2NhbGxfc3RvcmVfcmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbSwgTlVMTCkpCisgICAgZ19lcnJvciAoIk9PTSIpOworCisgIHdoaWxlIChtID09IE5VTEwpCisgICAgdGVzdF9tYWluX2NvbnRleHRfaXRlcmF0ZSAoZi0+Y3R4LCBUUlVFKTsKKworICBpZiAoIWRidXNfc2V0X2Vycm9yX2Zyb21fbWVzc2FnZSAoJmVycm9yLCBtKSkKKyAgICBnX2Vycm9yICgiVW5leHBlY3RlZCBzdWNjZXNzIik7CisKKyAgLyogVGhhdCBvYmplY3QgcGF0aCBkb2VzIG5vdCBoYXZlIHRoYXQgaW50ZXJmYWNlICovCisgIGdfYXNzZXJ0X2NtcHN0ciAoZXJyb3IubmFtZSwgPT0sIERCVVNfRVJST1JfVU5LTk9XTl9JTlRFUkZBQ0UpOworICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisKKyAgZGJ1c19jbGVhcl9tZXNzYWdlICgmbSk7CisgIGRidXNfY2xlYXJfcGVuZGluZ19jYWxsICgmcGMpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9nZXRfaW52YWxpZF9pZmFjZSAoRml4dHVyZSAqZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdjb25zdHBvaW50ZXIgY29udGV4dCkKK3sKKyAgREJ1c01lc3NhZ2UgKm0gPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsIChEQlVTX1NFUlZJQ0VfREJVUywKKyAgICAgIERCVVNfUEFUSF9EQlVTLCBEQlVTX0lOVEVSRkFDRV9QUk9QRVJUSUVTLCAiR2V0Iik7CisgIERCdXNQZW5kaW5nQ2FsbCAqcGMgPSBOVUxMOworICBEQnVzRXJyb3IgZXJyb3IgPSBEQlVTX0VSUk9SX0lOSVQ7CisgIGNvbnN0IGNoYXIgKmlmYWNlID0gImNvbS5leGFtcGxlLk5vcGUiOworICBjb25zdCBjaGFyICpwcm9wZXJ0eSA9ICJXaGF0ZXZlciI7CisKKyAgaWYgKGYtPnNraXApCisgICAgcmV0dXJuOworCisgIGlmIChtID09IE5VTEwgfHwKKyAgICAgICFkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKG0sCisgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZpZmFjZSwKKyAgICAgICAgREJVU19UWVBFX1NUUklORywgJnByb3BlcnR5LAorICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkgfHwKKyAgICAgICFkYnVzX2Nvbm5lY3Rpb25fc2VuZF93aXRoX3JlcGx5IChmLT5sZWZ0X2Nvbm4sIG0sICZwYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RJTUVPVVRfVVNFX0RFRkFVTFQpIHx8CisgICAgICBwYyA9PSBOVUxMKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKworICBkYnVzX2NsZWFyX21lc3NhZ2UgKCZtKTsKKworICBpZiAoZGJ1c19wZW5kaW5nX2NhbGxfZ2V0X2NvbXBsZXRlZCAocGMpKQorICAgIHRlc3RfcGVuZGluZ19jYWxsX3N0b3JlX3JlcGx5IChwYywgJm0pOworICBlbHNlIGlmICghZGJ1c19wZW5kaW5nX2NhbGxfc2V0X25vdGlmeSAocGMsIHRlc3RfcGVuZGluZ19jYWxsX3N0b3JlX3JlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm0sIE5VTEwpKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKworICB3aGlsZSAobSA9PSBOVUxMKQorICAgIHRlc3RfbWFpbl9jb250ZXh0X2l0ZXJhdGUgKGYtPmN0eCwgVFJVRSk7CisKKyAgaWYgKCFkYnVzX3NldF9lcnJvcl9mcm9tX21lc3NhZ2UgKCZlcnJvciwgbSkpCisgICAgZ19lcnJvciAoIlVuZXhwZWN0ZWQgc3VjY2VzcyIpOworCisgIGdfYXNzZXJ0X2NtcHN0ciAoZXJyb3IubmFtZSwgPT0sIERCVVNfRVJST1JfVU5LTk9XTl9JTlRFUkZBQ0UpOworICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisKKyAgZGJ1c19jbGVhcl9tZXNzYWdlICgmbSk7CisgIGRidXNfY2xlYXJfcGVuZGluZ19jYWxsICgmcGMpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9nZXRfaW52YWxpZCAoRml4dHVyZSAqZiwKKyAgICAgICAgICAgICAgICAgIGdjb25zdHBvaW50ZXIgY29udGV4dCkKK3sKKyAgREJ1c01lc3NhZ2UgKm0gPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsIChEQlVTX1NFUlZJQ0VfREJVUywKKyAgICAgIERCVVNfUEFUSF9EQlVTLCBEQlVTX0lOVEVSRkFDRV9QUk9QRVJUSUVTLCAiR2V0Iik7CisgIERCdXNQZW5kaW5nQ2FsbCAqcGMgPSBOVUxMOworICBEQnVzRXJyb3IgZXJyb3IgPSBEQlVTX0VSUk9SX0lOSVQ7CisgIGNvbnN0IGNoYXIgKmlmYWNlID0gREJVU19JTlRFUkZBQ0VfREJVUzsKKyAgY29uc3QgY2hhciAqcHJvcGVydHkgPSAiV2hhdGV2ZXIiOworCisgIGlmIChmLT5za2lwKQorICAgIHJldHVybjsKKworICBpZiAobSA9PSBOVUxMIHx8CisgICAgICAhZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChtLAorICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmaWZhY2UsCisgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZwcm9wZXJ0eSwKKyAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpIHx8CisgICAgICAhZGJ1c19jb25uZWN0aW9uX3NlbmRfd2l0aF9yZXBseSAoZi0+bGVmdF9jb25uLCBtLCAmcGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19USU1FT1VUX1VTRV9ERUZBVUxUKSB8fAorICAgICAgcGMgPT0gTlVMTCkKKyAgICBnX2Vycm9yICgiT09NIik7CisKKyAgZGJ1c19jbGVhcl9tZXNzYWdlICgmbSk7CisKKyAgaWYgKGRidXNfcGVuZGluZ19jYWxsX2dldF9jb21wbGV0ZWQgKHBjKSkKKyAgICB0ZXN0X3BlbmRpbmdfY2FsbF9zdG9yZV9yZXBseSAocGMsICZtKTsKKyAgZWxzZSBpZiAoIWRidXNfcGVuZGluZ19jYWxsX3NldF9ub3RpZnkgKHBjLCB0ZXN0X3BlbmRpbmdfY2FsbF9zdG9yZV9yZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtLCBOVUxMKSkKKyAgICBnX2Vycm9yICgiT09NIik7CisKKyAgd2hpbGUgKG0gPT0gTlVMTCkKKyAgICB0ZXN0X21haW5fY29udGV4dF9pdGVyYXRlIChmLT5jdHgsIFRSVUUpOworCisgIGlmICghZGJ1c19zZXRfZXJyb3JfZnJvbV9tZXNzYWdlICgmZXJyb3IsIG0pKQorICAgIGdfZXJyb3IgKCJVbmV4cGVjdGVkIHN1Y2Nlc3MiKTsKKworICBnX2Fzc2VydF9jbXBzdHIgKGVycm9yLm5hbWUsID09LCBEQlVTX0VSUk9SX1VOS05PV05fUFJPUEVSVFkpOworICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisKKyAgZGJ1c19jbGVhcl9tZXNzYWdlICgmbSk7CisgIGRidXNfY2xlYXJfcGVuZGluZ19jYWxsICgmcGMpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9nZXRfYWxsX2ludmFsaWRfaWZhY2UgKEZpeHR1cmUgKmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NvbnN0cG9pbnRlciBjb250ZXh0KQoreworICBEQnVzTWVzc2FnZSAqbSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKERCVVNfU0VSVklDRV9EQlVTLAorICAgICAgREJVU19QQVRIX0RCVVMsIERCVVNfSU5URVJGQUNFX1BST1BFUlRJRVMsICJHZXRBbGwiKTsKKyAgREJ1c1BlbmRpbmdDYWxsICpwYyA9IE5VTEw7CisgIERCdXNFcnJvciBlcnJvciA9IERCVVNfRVJST1JfSU5JVDsKKyAgY29uc3QgY2hhciAqaWZhY2UgPSAiY29tLmV4YW1wbGUuTm9wZSI7CisKKyAgaWYgKGYtPnNraXApCisgICAgcmV0dXJuOworCisgIGlmIChtID09IE5VTEwgfHwKKyAgICAgICFkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKG0sCisgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZpZmFjZSwKKyAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpIHx8CisgICAgICAhZGJ1c19jb25uZWN0aW9uX3NlbmRfd2l0aF9yZXBseSAoZi0+bGVmdF9jb25uLCBtLCAmcGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19USU1FT1VUX1VTRV9ERUZBVUxUKSB8fAorICAgICAgcGMgPT0gTlVMTCkKKyAgICBnX2Vycm9yICgiT09NIik7CisKKyAgZGJ1c19jbGVhcl9tZXNzYWdlICgmbSk7CisKKyAgaWYgKGRidXNfcGVuZGluZ19jYWxsX2dldF9jb21wbGV0ZWQgKHBjKSkKKyAgICB0ZXN0X3BlbmRpbmdfY2FsbF9zdG9yZV9yZXBseSAocGMsICZtKTsKKyAgZWxzZSBpZiAoIWRidXNfcGVuZGluZ19jYWxsX3NldF9ub3RpZnkgKHBjLCB0ZXN0X3BlbmRpbmdfY2FsbF9zdG9yZV9yZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtLCBOVUxMKSkKKyAgICBnX2Vycm9yICgiT09NIik7CisKKyAgd2hpbGUgKG0gPT0gTlVMTCkKKyAgICB0ZXN0X21haW5fY29udGV4dF9pdGVyYXRlIChmLT5jdHgsIFRSVUUpOworCisgIGlmICghZGJ1c19zZXRfZXJyb3JfZnJvbV9tZXNzYWdlICgmZXJyb3IsIG0pKQorICAgIGdfZXJyb3IgKCJVbmV4cGVjdGVkIHN1Y2Nlc3MiKTsKKworICBnX2Fzc2VydF9jbXBzdHIgKGVycm9yLm5hbWUsID09LCBEQlVTX0VSUk9SX1VOS05PV05fSU5URVJGQUNFKTsKKyAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworCisgIGRidXNfY2xlYXJfbWVzc2FnZSAoJm0pOworICBkYnVzX2NsZWFyX3BlbmRpbmdfY2FsbCAoJnBjKTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfZ2V0X2FsbF9pbnZhbGlkX3BhdGggKEZpeHR1cmUgKmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBnY29uc3Rwb2ludGVyIGNvbnRleHQpCit7CisgIERCdXNNZXNzYWdlICptID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoREJVU19TRVJWSUNFX0RCVVMsCisgICAgICAiLyIsIERCVVNfSU5URVJGQUNFX1BST1BFUlRJRVMsICJHZXRBbGwiKTsKKyAgREJ1c1BlbmRpbmdDYWxsICpwYyA9IE5VTEw7CisgIERCdXNFcnJvciBlcnJvciA9IERCVVNfRVJST1JfSU5JVDsKKyAgY29uc3QgY2hhciAqaWZhY2UgPSBEQlVTX0lOVEVSRkFDRV9EQlVTOworCisgIGlmIChmLT5za2lwKQorICAgIHJldHVybjsKKworICBpZiAobSA9PSBOVUxMIHx8CisgICAgICAhZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChtLAorICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmaWZhY2UsCisgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSB8fAorICAgICAgIWRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHkgKGYtPmxlZnRfY29ubiwgbSwgJnBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVElNRU9VVF9VU0VfREVGQVVMVCkgfHwKKyAgICAgIHBjID09IE5VTEwpCisgICAgZ19lcnJvciAoIk9PTSIpOworCisgIGRidXNfY2xlYXJfbWVzc2FnZSAoJm0pOworCisgIGlmIChkYnVzX3BlbmRpbmdfY2FsbF9nZXRfY29tcGxldGVkIChwYykpCisgICAgdGVzdF9wZW5kaW5nX2NhbGxfc3RvcmVfcmVwbHkgKHBjLCAmbSk7CisgIGVsc2UgaWYgKCFkYnVzX3BlbmRpbmdfY2FsbF9zZXRfbm90aWZ5IChwYywgdGVzdF9wZW5kaW5nX2NhbGxfc3RvcmVfcmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbSwgTlVMTCkpCisgICAgZ19lcnJvciAoIk9PTSIpOworCisgIHdoaWxlIChtID09IE5VTEwpCisgICAgdGVzdF9tYWluX2NvbnRleHRfaXRlcmF0ZSAoZi0+Y3R4LCBUUlVFKTsKKworICBpZiAoIWRidXNfc2V0X2Vycm9yX2Zyb21fbWVzc2FnZSAoJmVycm9yLCBtKSkKKyAgICBnX2Vycm9yICgiVW5leHBlY3RlZCBzdWNjZXNzIik7CisKKyAgLyogVGhhdCBvYmplY3QgcGF0aCBkb2VzIG5vdCBoYXZlIHRoYXQgaW50ZXJmYWNlICovCisgIGdfYXNzZXJ0X2NtcHN0ciAoZXJyb3IubmFtZSwgPT0sIERCVVNfRVJST1JfVU5LTk9XTl9JTlRFUkZBQ0UpOworICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisKKyAgZGJ1c19jbGVhcl9tZXNzYWdlICgmbSk7CisgIGRidXNfY2xlYXJfcGVuZGluZ19jYWxsICgmcGMpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9zZXRfaW52YWxpZF9pZmFjZSAoRml4dHVyZSAqZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdjb25zdHBvaW50ZXIgY29udGV4dCkKK3sKKyAgREJ1c01lc3NhZ2UgKm0gPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsIChEQlVTX1NFUlZJQ0VfREJVUywKKyAgICAgIERCVVNfUEFUSF9EQlVTLCBEQlVTX0lOVEVSRkFDRV9QUk9QRVJUSUVTLCAiU2V0Iik7CisgIERCdXNQZW5kaW5nQ2FsbCAqcGMgPSBOVUxMOworICBEQnVzRXJyb3IgZXJyb3IgPSBEQlVTX0VSUk9SX0lOSVQ7CisgIGNvbnN0IGNoYXIgKmlmYWNlID0gImNvbS5leGFtcGxlLk5vcGUiOworICBjb25zdCBjaGFyICpwcm9wZXJ0eSA9ICJXaGF0ZXZlciI7CisgIERCdXNNZXNzYWdlSXRlciBhcmdzX2l0ZXI7CisgIERCdXNNZXNzYWdlSXRlciB2YXJfaXRlcjsKKyAgZGJ1c19ib29sX3QgYiA9IEZBTFNFOworCisgIGlmIChmLT5za2lwKQorICAgIHJldHVybjsKKworICBpZiAobSA9PSBOVUxMIHx8CisgICAgICAhZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChtLAorICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmaWZhY2UsCisgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZwcm9wZXJ0eSwKKyAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKworICBkYnVzX21lc3NhZ2VfaXRlcl9pbml0X2FwcGVuZCAobSwgJmFyZ3NfaXRlcik7CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9vcGVuX2NvbnRhaW5lciAoJmFyZ3NfaXRlciwKKyAgICAgICAgREJVU19UWVBFX1ZBUklBTlQsICJiIiwgJnZhcl9pdGVyKSB8fAorICAgICAgIWRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYyAoJnZhcl9pdGVyLCBEQlVTX1RZUEVfQk9PTEVBTiwgJmIpIHx8CisgICAgICAhZGJ1c19tZXNzYWdlX2l0ZXJfY2xvc2VfY29udGFpbmVyICgmYXJnc19pdGVyLCAmdmFyX2l0ZXIpIHx8CisgICAgICAhZGJ1c19jb25uZWN0aW9uX3NlbmRfd2l0aF9yZXBseSAoZi0+bGVmdF9jb25uLCBtLCAmcGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19USU1FT1VUX1VTRV9ERUZBVUxUKSB8fAorICAgICAgcGMgPT0gTlVMTCkKKyAgICBnX2Vycm9yICgiT09NIik7CisKKyAgZGJ1c19jbGVhcl9tZXNzYWdlICgmbSk7CisKKyAgaWYgKGRidXNfcGVuZGluZ19jYWxsX2dldF9jb21wbGV0ZWQgKHBjKSkKKyAgICB0ZXN0X3BlbmRpbmdfY2FsbF9zdG9yZV9yZXBseSAocGMsICZtKTsKKyAgZWxzZSBpZiAoIWRidXNfcGVuZGluZ19jYWxsX3NldF9ub3RpZnkgKHBjLCB0ZXN0X3BlbmRpbmdfY2FsbF9zdG9yZV9yZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtLCBOVUxMKSkKKyAgICBnX2Vycm9yICgiT09NIik7CisKKyAgd2hpbGUgKG0gPT0gTlVMTCkKKyAgICB0ZXN0X21haW5fY29udGV4dF9pdGVyYXRlIChmLT5jdHgsIFRSVUUpOworCisgIGlmICghZGJ1c19zZXRfZXJyb3JfZnJvbV9tZXNzYWdlICgmZXJyb3IsIG0pKQorICAgIGdfZXJyb3IgKCJVbmV4cGVjdGVkIHN1Y2Nlc3MiKTsKKworICBnX2Fzc2VydF9jbXBzdHIgKGVycm9yLm5hbWUsID09LCBEQlVTX0VSUk9SX1VOS05PV05fSU5URVJGQUNFKTsKKyAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworCisgIGRidXNfY2xlYXJfbWVzc2FnZSAoJm0pOworICBkYnVzX2NsZWFyX3BlbmRpbmdfY2FsbCAoJnBjKTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3Rfc2V0X2ludmFsaWRfcGF0aCAoRml4dHVyZSAqZiwKKyAgICAgICAgICAgICAgICAgICAgICAgZ2NvbnN0cG9pbnRlciBjb250ZXh0KQoreworICBEQnVzTWVzc2FnZSAqbSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKERCVVNfU0VSVklDRV9EQlVTLAorICAgICAgIi8iLCBEQlVTX0lOVEVSRkFDRV9QUk9QRVJUSUVTLCAiU2V0Iik7CisgIERCdXNQZW5kaW5nQ2FsbCAqcGMgPSBOVUxMOworICBEQnVzRXJyb3IgZXJyb3IgPSBEQlVTX0VSUk9SX0lOSVQ7CisgIGNvbnN0IGNoYXIgKmlmYWNlID0gREJVU19JTlRFUkZBQ0VfREJVUzsKKyAgY29uc3QgY2hhciAqcHJvcGVydHkgPSAiSW50ZXJmYWNlcyI7CisgIERCdXNNZXNzYWdlSXRlciBhcmdzX2l0ZXI7CisgIERCdXNNZXNzYWdlSXRlciB2YXJfaXRlcjsKKyAgZGJ1c19ib29sX3QgYiA9IEZBTFNFOworCisgIGlmIChmLT5za2lwKQorICAgIHJldHVybjsKKworICBpZiAobSA9PSBOVUxMIHx8CisgICAgICAhZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChtLAorICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmaWZhY2UsCisgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZwcm9wZXJ0eSwKKyAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKworICBkYnVzX21lc3NhZ2VfaXRlcl9pbml0X2FwcGVuZCAobSwgJmFyZ3NfaXRlcik7CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9vcGVuX2NvbnRhaW5lciAoJmFyZ3NfaXRlciwKKyAgICAgICAgREJVU19UWVBFX1ZBUklBTlQsICJiIiwgJnZhcl9pdGVyKSB8fAorICAgICAgIWRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYyAoJnZhcl9pdGVyLCBEQlVTX1RZUEVfQk9PTEVBTiwgJmIpIHx8CisgICAgICAhZGJ1c19tZXNzYWdlX2l0ZXJfY2xvc2VfY29udGFpbmVyICgmYXJnc19pdGVyLCAmdmFyX2l0ZXIpIHx8CisgICAgICAhZGJ1c19jb25uZWN0aW9uX3NlbmRfd2l0aF9yZXBseSAoZi0+bGVmdF9jb25uLCBtLCAmcGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19USU1FT1VUX1VTRV9ERUZBVUxUKSB8fAorICAgICAgcGMgPT0gTlVMTCkKKyAgICBnX2Vycm9yICgiT09NIik7CisKKyAgZGJ1c19jbGVhcl9tZXNzYWdlICgmbSk7CisKKyAgaWYgKGRidXNfcGVuZGluZ19jYWxsX2dldF9jb21wbGV0ZWQgKHBjKSkKKyAgICB0ZXN0X3BlbmRpbmdfY2FsbF9zdG9yZV9yZXBseSAocGMsICZtKTsKKyAgZWxzZSBpZiAoIWRidXNfcGVuZGluZ19jYWxsX3NldF9ub3RpZnkgKHBjLCB0ZXN0X3BlbmRpbmdfY2FsbF9zdG9yZV9yZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtLCBOVUxMKSkKKyAgICBnX2Vycm9yICgiT09NIik7CisKKyAgd2hpbGUgKG0gPT0gTlVMTCkKKyAgICB0ZXN0X21haW5fY29udGV4dF9pdGVyYXRlIChmLT5jdHgsIFRSVUUpOworCisgIGlmICghZGJ1c19zZXRfZXJyb3JfZnJvbV9tZXNzYWdlICgmZXJyb3IsIG0pKQorICAgIGdfZXJyb3IgKCJVbmV4cGVjdGVkIHN1Y2Nlc3MiKTsKKworICBnX2Fzc2VydF9jbXBzdHIgKGVycm9yLm5hbWUsID09LCBEQlVTX0VSUk9SX1VOS05PV05fSU5URVJGQUNFKTsKKyAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworCisgIGRidXNfY2xlYXJfbWVzc2FnZSAoJm0pOworICBkYnVzX2NsZWFyX3BlbmRpbmdfY2FsbCAoJnBjKTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3Rfc2V0X2ludmFsaWQgKEZpeHR1cmUgKmYsCisgICAgICAgICAgICAgICAgICBnY29uc3Rwb2ludGVyIGNvbnRleHQpCit7CisgIERCdXNNZXNzYWdlICptID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoREJVU19TRVJWSUNFX0RCVVMsCisgICAgICBEQlVTX1BBVEhfREJVUywgREJVU19JTlRFUkZBQ0VfUFJPUEVSVElFUywgIlNldCIpOworICBEQnVzUGVuZGluZ0NhbGwgKnBjID0gTlVMTDsKKyAgREJ1c0Vycm9yIGVycm9yID0gREJVU19FUlJPUl9JTklUOworICBjb25zdCBjaGFyICppZmFjZSA9IERCVVNfSU5URVJGQUNFX0RCVVM7CisgIGNvbnN0IGNoYXIgKnByb3BlcnR5ID0gIldoYXRldmVyIjsKKyAgREJ1c01lc3NhZ2VJdGVyIGFyZ3NfaXRlcjsKKyAgREJ1c01lc3NhZ2VJdGVyIHZhcl9pdGVyOworICBkYnVzX2Jvb2xfdCBiID0gRkFMU0U7CisKKyAgaWYgKGYtPnNraXApCisgICAgcmV0dXJuOworCisgIGlmIChtID09IE5VTEwgfHwKKyAgICAgICFkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKG0sCisgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZpZmFjZSwKKyAgICAgICAgREJVU19UWVBFX1NUUklORywgJnByb3BlcnR5LAorICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgZ19lcnJvciAoIk9PTSIpOworCisgIGRidXNfbWVzc2FnZV9pdGVyX2luaXRfYXBwZW5kIChtLCAmYXJnc19pdGVyKTsKKworICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX29wZW5fY29udGFpbmVyICgmYXJnc19pdGVyLAorICAgICAgICBEQlVTX1RZUEVfVkFSSUFOVCwgImIiLCAmdmFyX2l0ZXIpIHx8CisgICAgICAhZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljICgmdmFyX2l0ZXIsIERCVVNfVFlQRV9CT09MRUFOLCAmYikgfHwKKyAgICAgICFkYnVzX21lc3NhZ2VfaXRlcl9jbG9zZV9jb250YWluZXIgKCZhcmdzX2l0ZXIsICZ2YXJfaXRlcikgfHwKKyAgICAgICFkYnVzX2Nvbm5lY3Rpb25fc2VuZF93aXRoX3JlcGx5IChmLT5sZWZ0X2Nvbm4sIG0sICZwYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RJTUVPVVRfVVNFX0RFRkFVTFQpIHx8CisgICAgICBwYyA9PSBOVUxMKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKworICBkYnVzX2NsZWFyX21lc3NhZ2UgKCZtKTsKKworICBpZiAoZGJ1c19wZW5kaW5nX2NhbGxfZ2V0X2NvbXBsZXRlZCAocGMpKQorICAgIHRlc3RfcGVuZGluZ19jYWxsX3N0b3JlX3JlcGx5IChwYywgJm0pOworICBlbHNlIGlmICghZGJ1c19wZW5kaW5nX2NhbGxfc2V0X25vdGlmeSAocGMsIHRlc3RfcGVuZGluZ19jYWxsX3N0b3JlX3JlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm0sIE5VTEwpKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKworICB3aGlsZSAobSA9PSBOVUxMKQorICAgIHRlc3RfbWFpbl9jb250ZXh0X2l0ZXJhdGUgKGYtPmN0eCwgVFJVRSk7CisKKyAgaWYgKCFkYnVzX3NldF9lcnJvcl9mcm9tX21lc3NhZ2UgKCZlcnJvciwgbSkpCisgICAgZ19lcnJvciAoIlVuZXhwZWN0ZWQgc3VjY2VzcyIpOworCisgIGdfYXNzZXJ0X2NtcHN0ciAoZXJyb3IubmFtZSwgPT0sIERCVVNfRVJST1JfVU5LTk9XTl9QUk9QRVJUWSk7CisgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKworICBkYnVzX2NsZWFyX21lc3NhZ2UgKCZtKTsKKyAgZGJ1c19jbGVhcl9wZW5kaW5nX2NhbGwgKCZwYyk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3NldCAoRml4dHVyZSAqZiwKKyAgICAgICAgICBnY29uc3Rwb2ludGVyIGNvbnRleHQpCit7CisgIERCdXNNZXNzYWdlICptID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoREJVU19TRVJWSUNFX0RCVVMsCisgICAgICBEQlVTX1BBVEhfREJVUywgREJVU19JTlRFUkZBQ0VfUFJPUEVSVElFUywgIlNldCIpOworICBEQnVzUGVuZGluZ0NhbGwgKnBjID0gTlVMTDsKKyAgREJ1c0Vycm9yIGVycm9yID0gREJVU19FUlJPUl9JTklUOworICBjb25zdCBjaGFyICppZmFjZSA9IERCVVNfSU5URVJGQUNFX0RCVVM7CisgIGNvbnN0IGNoYXIgKnByb3BlcnR5ID0gIkZlYXR1cmVzIjsKKyAgREJ1c01lc3NhZ2VJdGVyIGFyZ3NfaXRlcjsKKyAgREJ1c01lc3NhZ2VJdGVyIHZhcl9pdGVyOworICBkYnVzX2Jvb2xfdCBiID0gRkFMU0U7CisKKyAgaWYgKGYtPnNraXApCisgICAgcmV0dXJuOworCisgIGlmIChtID09IE5VTEwgfHwKKyAgICAgICFkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKG0sCisgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZpZmFjZSwKKyAgICAgICAgREJVU19UWVBFX1NUUklORywgJnByb3BlcnR5LAorICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgZ19lcnJvciAoIk9PTSIpOworCisgIGRidXNfbWVzc2FnZV9pdGVyX2luaXRfYXBwZW5kIChtLCAmYXJnc19pdGVyKTsKKworICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX29wZW5fY29udGFpbmVyICgmYXJnc19pdGVyLAorICAgICAgICBEQlVTX1RZUEVfVkFSSUFOVCwgImIiLCAmdmFyX2l0ZXIpIHx8CisgICAgICAhZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljICgmdmFyX2l0ZXIsIERCVVNfVFlQRV9CT09MRUFOLCAmYikgfHwKKyAgICAgICFkYnVzX21lc3NhZ2VfaXRlcl9jbG9zZV9jb250YWluZXIgKCZhcmdzX2l0ZXIsICZ2YXJfaXRlcikgfHwKKyAgICAgICFkYnVzX2Nvbm5lY3Rpb25fc2VuZF93aXRoX3JlcGx5IChmLT5sZWZ0X2Nvbm4sIG0sICZwYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RJTUVPVVRfVVNFX0RFRkFVTFQpIHx8CisgICAgICBwYyA9PSBOVUxMKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKworICBkYnVzX2NsZWFyX21lc3NhZ2UgKCZtKTsKKworICBpZiAoZGJ1c19wZW5kaW5nX2NhbGxfZ2V0X2NvbXBsZXRlZCAocGMpKQorICAgIHRlc3RfcGVuZGluZ19jYWxsX3N0b3JlX3JlcGx5IChwYywgJm0pOworICBlbHNlIGlmICghZGJ1c19wZW5kaW5nX2NhbGxfc2V0X25vdGlmeSAocGMsIHRlc3RfcGVuZGluZ19jYWxsX3N0b3JlX3JlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm0sIE5VTEwpKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKworICB3aGlsZSAobSA9PSBOVUxMKQorICAgIHRlc3RfbWFpbl9jb250ZXh0X2l0ZXJhdGUgKGYtPmN0eCwgVFJVRSk7CisKKyAgaWYgKCFkYnVzX3NldF9lcnJvcl9mcm9tX21lc3NhZ2UgKCZlcnJvciwgbSkpCisgICAgZ19lcnJvciAoIlVuZXhwZWN0ZWQgc3VjY2VzcyIpOworCisgIGdfYXNzZXJ0X2NtcHN0ciAoZXJyb3IubmFtZSwgPT0sIERCVVNfRVJST1JfUFJPUEVSVFlfUkVBRF9PTkxZKTsKKyAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworCisgIGRidXNfY2xlYXJfbWVzc2FnZSAoJm0pOworICBkYnVzX2NsZWFyX3BlbmRpbmdfY2FsbCAoJnBjKTsKK30KKworc3RhdGljIHZvaWQKK2NoZWNrX2ZlYXR1cmVzIChEQnVzTWVzc2FnZUl0ZXIgKnZhcl9pdGVyKQoreworICBEQnVzTWVzc2FnZUl0ZXIgYXJyX2l0ZXI7CisgIGdib29sZWFuIGhhdmVfc3lzdGVtZF9hY3RpdmF0aW9uID0gRkFMU0U7CisKKyAgZ19hc3NlcnRfY21waW50IChkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJnX3R5cGUgKHZhcl9pdGVyKSwgPT0sCisgICAgICBEQlVTX1RZUEVfQVJSQVkpOworICBnX2Fzc2VydF9jbXBpbnQgKGRidXNfbWVzc2FnZV9pdGVyX2dldF9lbGVtZW50X3R5cGUgKHZhcl9pdGVyKSwgPT0sCisgICAgICBEQlVTX1RZUEVfU1RSSU5HKTsKKyAgZGJ1c19tZXNzYWdlX2l0ZXJfcmVjdXJzZSAodmFyX2l0ZXIsICZhcnJfaXRlcik7CisKKyAgd2hpbGUgKGRidXNfbWVzc2FnZV9pdGVyX2dldF9hcmdfdHlwZSAoJmFycl9pdGVyKSAhPSBEQlVTX1RZUEVfSU5WQUxJRCkKKyAgICB7CisgICAgICBjb25zdCBjaGFyICpmZWF0dXJlOworCisgICAgICBnX2Fzc2VydF9jbXBpbnQgKGRidXNfbWVzc2FnZV9pdGVyX2dldF9hcmdfdHlwZSAoJmFycl9pdGVyKSwgPT0sCisgICAgICAgICAgREJVU19UWVBFX1NUUklORyk7CisgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYmFzaWMgKCZhcnJfaXRlciwgJmZlYXR1cmUpOworCisgICAgICBnX3Rlc3RfbWVzc2FnZSAoIkZlYXR1cmU6ICVzIiwgZmVhdHVyZSk7CisKKyAgICAgIGlmIChnX3N0cmNtcDAgKGZlYXR1cmUsICJTeXN0ZW1kQWN0aXZhdGlvbiIpID09IDApCisgICAgICAgIGhhdmVfc3lzdGVtZF9hY3RpdmF0aW9uID0gVFJVRTsKKworICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfbmV4dCAoJmFycl9pdGVyKTsKKyAgICB9CisKKyAgLyogV2UgcGFzcyAtLXN5c3RlbWQtYWN0aXZhdGlvbiB0byB0aGUgZGFlbW9uIGZvciB0aGlzIHVuaXQgdGVzdCBvbiBVbml4CisgICAqIChpdCBjYW4gb25seSB3b3JrIGluIHByYWN0aWNlIG9uIExpbnV4LCBidXQgdGhlcmUncyBub3RoaW5nCisgICAqIGluaGVyZW50bHkgTGludXgtc3BlY2lmaWMgYWJvdXQgdGhlIHByb3RvY29sKS4gKi8KKyNpZmRlZiBEQlVTX1VOSVgKKyAgZ19hc3NlcnRfdHJ1ZSAoaGF2ZV9zeXN0ZW1kX2FjdGl2YXRpb24pOworI2Vsc2UKKyAgZ19hc3NlcnRfZmFsc2UgKGhhdmVfc3lzdGVtZF9hY3RpdmF0aW9uKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZAordGVzdF9mZWF0dXJlcyAoRml4dHVyZSAqZiwKKyAgICAgICAgICAgICAgIGdjb25zdHBvaW50ZXIgY29udGV4dCkKK3sKKyAgREJ1c01lc3NhZ2UgKm0gPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsIChEQlVTX1NFUlZJQ0VfREJVUywKKyAgICAgIERCVVNfUEFUSF9EQlVTLCBEQlVTX0lOVEVSRkFDRV9QUk9QRVJUSUVTLCAiR2V0Iik7CisgIERCdXNQZW5kaW5nQ2FsbCAqcGMgPSBOVUxMOworICBEQnVzTWVzc2FnZUl0ZXIgYXJnc19pdGVyOworICBEQnVzTWVzc2FnZUl0ZXIgdmFyX2l0ZXI7CisgIGNvbnN0IGNoYXIgKmlmYWNlID0gREJVU19JTlRFUkZBQ0VfREJVUzsKKyAgY29uc3QgY2hhciAqZmVhdHVyZXMgPSAiRmVhdHVyZXMiOworCisgIGlmIChmLT5za2lwKQorICAgIHJldHVybjsKKworICBpZiAobSA9PSBOVUxMIHx8CisgICAgICAhZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChtLAorICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmaWZhY2UsCisgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZmZWF0dXJlcywKKyAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpIHx8CisgICAgICAhZGJ1c19jb25uZWN0aW9uX3NlbmRfd2l0aF9yZXBseSAoZi0+bGVmdF9jb25uLCBtLCAmcGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19USU1FT1VUX1VTRV9ERUZBVUxUKSB8fAorICAgICAgcGMgPT0gTlVMTCkKKyAgICBnX2Vycm9yICgiT09NIik7CisKKyAgZGJ1c19jbGVhcl9tZXNzYWdlICgmbSk7CisKKyAgaWYgKGRidXNfcGVuZGluZ19jYWxsX2dldF9jb21wbGV0ZWQgKHBjKSkKKyAgICB0ZXN0X3BlbmRpbmdfY2FsbF9zdG9yZV9yZXBseSAocGMsICZtKTsKKyAgZWxzZSBpZiAoIWRidXNfcGVuZGluZ19jYWxsX3NldF9ub3RpZnkgKHBjLCB0ZXN0X3BlbmRpbmdfY2FsbF9zdG9yZV9yZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtLCBOVUxMKSkKKyAgICBnX2Vycm9yICgiT09NIik7CisKKyAgd2hpbGUgKG0gPT0gTlVMTCkKKyAgICB0ZXN0X21haW5fY29udGV4dF9pdGVyYXRlIChmLT5jdHgsIFRSVUUpOworCisgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfaW5pdCAobSwgJmFyZ3NfaXRlcikpCisgICAgZ19lcnJvciAoIlJlcGx5IGhhcyBubyBhcmd1bWVudHMiKTsKKworICBnX2Fzc2VydF9jbXBpbnQgKGRidXNfbWVzc2FnZV9pdGVyX2dldF9hcmdfdHlwZSAoJmFyZ3NfaXRlciksID09LAorICAgICAgREJVU19UWVBFX1ZBUklBTlQpOworCisgIGRidXNfbWVzc2FnZV9pdGVyX3JlY3Vyc2UgKCZhcmdzX2l0ZXIsICZ2YXJfaXRlcik7CisgIGNoZWNrX2ZlYXR1cmVzICgmdmFyX2l0ZXIpOworCisgIGlmIChkYnVzX21lc3NhZ2VfaXRlcl9uZXh0ICgmYXJnc19pdGVyKSkKKyAgICBnX2Vycm9yICgiUmVwbHkgaGFzIHRvbyBtYW55IGFyZ3VtZW50cyIpOworCisgIGRidXNfY2xlYXJfbWVzc2FnZSAoJm0pOworICBkYnVzX2NsZWFyX3BlbmRpbmdfY2FsbCAoJnBjKTsKK30KKworc3RhdGljIHZvaWQKK2NoZWNrX2ludGVyZmFjZXMgKERCdXNNZXNzYWdlSXRlciAqdmFyX2l0ZXIpCit7CisgIERCdXNNZXNzYWdlSXRlciBhcnJfaXRlcjsKKyAgZ2Jvb2xlYW4gaGF2ZV9tb25pdG9yaW5nID0gRkFMU0U7CisgIGdib29sZWFuIGhhdmVfc3RhdHMgPSBGQUxTRTsKKyAgZ2Jvb2xlYW4gaGF2ZV92ZXJib3NlID0gRkFMU0U7CisKKyAgZ19hc3NlcnRfY21waW50IChkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJnX3R5cGUgKHZhcl9pdGVyKSwgPT0sCisgICAgICBEQlVTX1RZUEVfQVJSQVkpOworICBnX2Fzc2VydF9jbXBpbnQgKGRidXNfbWVzc2FnZV9pdGVyX2dldF9lbGVtZW50X3R5cGUgKHZhcl9pdGVyKSwgPT0sCisgICAgICBEQlVTX1RZUEVfU1RSSU5HKTsKKyAgZGJ1c19tZXNzYWdlX2l0ZXJfcmVjdXJzZSAodmFyX2l0ZXIsICZhcnJfaXRlcik7CisKKyAgd2hpbGUgKGRidXNfbWVzc2FnZV9pdGVyX2dldF9hcmdfdHlwZSAoJmFycl9pdGVyKSAhPSBEQlVTX1RZUEVfSU5WQUxJRCkKKyAgICB7CisgICAgICBjb25zdCBjaGFyICppZmFjZTsKKworICAgICAgZ19hc3NlcnRfY21waW50IChkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJnX3R5cGUgKCZhcnJfaXRlciksID09LAorICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcpOworICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2Jhc2ljICgmYXJyX2l0ZXIsICZpZmFjZSk7CisgICAgICBnX3Rlc3RfbWVzc2FnZSAoIkludGVyZmFjZTogJXMiLCBpZmFjZSk7CisKKyAgICAgIGdfYXNzZXJ0X2NtcHN0ciAoaWZhY2UsICE9LCBEQlVTX0lOVEVSRkFDRV9EQlVTKTsKKyAgICAgIGdfYXNzZXJ0X2NtcHN0ciAoaWZhY2UsICE9LCBEQlVTX0lOVEVSRkFDRV9QUk9QRVJUSUVTKTsKKyAgICAgIGdfYXNzZXJ0X2NtcHN0ciAoaWZhY2UsICE9LCBEQlVTX0lOVEVSRkFDRV9JTlRST1NQRUNUQUJMRSk7CisgICAgICBnX2Fzc2VydF9jbXBzdHIgKGlmYWNlLCAhPSwgREJVU19JTlRFUkZBQ0VfUEVFUik7CisKKyAgICAgIGlmIChnX3N0cmNtcDAgKGlmYWNlLCBEQlVTX0lOVEVSRkFDRV9NT05JVE9SSU5HKSA9PSAwKQorICAgICAgICBoYXZlX21vbml0b3JpbmcgPSBUUlVFOworICAgICAgZWxzZSBpZiAoZ19zdHJjbXAwIChpZmFjZSwgQlVTX0lOVEVSRkFDRV9TVEFUUykgPT0gMCkKKyAgICAgICAgaGF2ZV9zdGF0cyA9IFRSVUU7CisgICAgICBlbHNlIGlmIChnX3N0cmNtcDAgKGlmYWNlLCBEQlVTX0lOVEVSRkFDRV9WRVJCT1NFKSA9PSAwKQorICAgICAgICBoYXZlX3ZlcmJvc2UgPSBUUlVFOworCisgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9uZXh0ICgmYXJyX2l0ZXIpOworICAgIH0KKworICBnX2Fzc2VydF90cnVlIChoYXZlX21vbml0b3JpbmcpOworCisjaWZkZWYgREJVU19FTkFCTEVfU1RBVFMKKyAgZ19hc3NlcnRfdHJ1ZSAoaGF2ZV9zdGF0cyk7CisjZWxzZQorICBnX2Fzc2VydF9mYWxzZSAoaGF2ZV9zdGF0cyk7CisjZW5kaWYKKworI2lmZGVmIERCVVNfRU5BQkxFX1ZFUkJPU0VfTU9ERQorICBnX2Fzc2VydF90cnVlIChoYXZlX3ZlcmJvc2UpOworI2Vsc2UKKyAgZ19hc3NlcnRfZmFsc2UgKGhhdmVfdmVyYm9zZSk7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfaW50ZXJmYWNlcyAoRml4dHVyZSAqZiwKKyAgICAgICAgICAgICAgICAgZ2NvbnN0cG9pbnRlciBjb250ZXh0KQoreworICBEQnVzTWVzc2FnZSAqbSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKERCVVNfU0VSVklDRV9EQlVTLAorICAgICAgREJVU19QQVRIX0RCVVMsIERCVVNfSU5URVJGQUNFX1BST1BFUlRJRVMsICJHZXQiKTsKKyAgREJ1c1BlbmRpbmdDYWxsICpwYyA9IE5VTEw7CisgIERCdXNNZXNzYWdlSXRlciBhcmdzX2l0ZXI7CisgIERCdXNNZXNzYWdlSXRlciB2YXJfaXRlcjsKKyAgY29uc3QgY2hhciAqaWZhY2UgPSBEQlVTX0lOVEVSRkFDRV9EQlVTOworICBjb25zdCBjaGFyICppZmFjZXMgPSAiSW50ZXJmYWNlcyI7CisKKyAgaWYgKGYtPnNraXApCisgICAgcmV0dXJuOworCisgIGlmIChtID09IE5VTEwgfHwKKyAgICAgICFkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKG0sCisgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZpZmFjZSwKKyAgICAgICAgREJVU19UWVBFX1NUUklORywgJmlmYWNlcywKKyAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpIHx8CisgICAgICAhZGJ1c19jb25uZWN0aW9uX3NlbmRfd2l0aF9yZXBseSAoZi0+bGVmdF9jb25uLCBtLCAmcGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19USU1FT1VUX1VTRV9ERUZBVUxUKSB8fAorICAgICAgcGMgPT0gTlVMTCkKKyAgICBnX2Vycm9yICgiT09NIik7CisKKyAgZGJ1c19jbGVhcl9tZXNzYWdlICgmbSk7CisKKyAgaWYgKGRidXNfcGVuZGluZ19jYWxsX2dldF9jb21wbGV0ZWQgKHBjKSkKKyAgICB0ZXN0X3BlbmRpbmdfY2FsbF9zdG9yZV9yZXBseSAocGMsICZtKTsKKyAgZWxzZSBpZiAoIWRidXNfcGVuZGluZ19jYWxsX3NldF9ub3RpZnkgKHBjLCB0ZXN0X3BlbmRpbmdfY2FsbF9zdG9yZV9yZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtLCBOVUxMKSkKKyAgICBnX2Vycm9yICgiT09NIik7CisKKyAgd2hpbGUgKG0gPT0gTlVMTCkKKyAgICB0ZXN0X21haW5fY29udGV4dF9pdGVyYXRlIChmLT5jdHgsIFRSVUUpOworCisgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfaW5pdCAobSwgJmFyZ3NfaXRlcikpCisgICAgZ19lcnJvciAoIlJlcGx5IGhhcyBubyBhcmd1bWVudHMiKTsKKworICBpZiAoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2FyZ190eXBlICgmYXJnc19pdGVyKSAhPSBEQlVTX1RZUEVfVkFSSUFOVCkKKyAgICBnX2Vycm9yICgiUmVwbHkgZG9lcyBub3QgaGF2ZSBhIHZhcmlhbnQgYXJndW1lbnQiKTsKKworICBkYnVzX21lc3NhZ2VfaXRlcl9yZWN1cnNlICgmYXJnc19pdGVyLCAmdmFyX2l0ZXIpOworICBjaGVja19pbnRlcmZhY2VzICgmdmFyX2l0ZXIpOworCisgIGlmIChkYnVzX21lc3NhZ2VfaXRlcl9uZXh0ICgmYXJnc19pdGVyKSkKKyAgICBnX2Vycm9yICgiUmVwbHkgaGFzIHRvbyBtYW55IGFyZ3VtZW50cyIpOworCisgIGRidXNfY2xlYXJfbWVzc2FnZSAoJm0pOworICBkYnVzX2NsZWFyX3BlbmRpbmdfY2FsbCAoJnBjKTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfZ2V0X2FsbCAoRml4dHVyZSAqZiwKKyAgICAgICAgICAgICAgZ2NvbnN0cG9pbnRlciBjb250ZXh0KQoreworICBEQnVzTWVzc2FnZSAqbSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKERCVVNfU0VSVklDRV9EQlVTLAorICAgICAgREJVU19QQVRIX0RCVVMsIERCVVNfSU5URVJGQUNFX1BST1BFUlRJRVMsICJHZXRBbGwiKTsKKyAgREJ1c1BlbmRpbmdDYWxsICpwYyA9IE5VTEw7CisgIERCdXNNZXNzYWdlSXRlciBhcmdzX2l0ZXI7CisgIERCdXNNZXNzYWdlSXRlciBhcnJfaXRlcjsKKyAgREJ1c01lc3NhZ2VJdGVyIHBhaXJfaXRlcjsKKyAgREJ1c01lc3NhZ2VJdGVyIHZhcl9pdGVyOworICBjb25zdCBjaGFyICppZmFjZSA9IERCVVNfSU5URVJGQUNFX0RCVVM7CisgIGdib29sZWFuIGhhdmVfZmVhdHVyZXMgPSBGQUxTRTsKKyAgZ2Jvb2xlYW4gaGF2ZV9pbnRlcmZhY2VzID0gRkFMU0U7CisKKyAgaWYgKGYtPnNraXApCisgICAgcmV0dXJuOworCisgIGlmIChtID09IE5VTEwgfHwKKyAgICAgICFkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKG0sCisgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZpZmFjZSwKKyAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpIHx8CisgICAgICAhZGJ1c19jb25uZWN0aW9uX3NlbmRfd2l0aF9yZXBseSAoZi0+bGVmdF9jb25uLCBtLCAmcGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19USU1FT1VUX1VTRV9ERUZBVUxUKSB8fAorICAgICAgcGMgPT0gTlVMTCkKKyAgICBnX2Vycm9yICgiT09NIik7CisKKyAgZGJ1c19jbGVhcl9tZXNzYWdlICgmbSk7CisKKyAgaWYgKGRidXNfcGVuZGluZ19jYWxsX2dldF9jb21wbGV0ZWQgKHBjKSkKKyAgICB0ZXN0X3BlbmRpbmdfY2FsbF9zdG9yZV9yZXBseSAocGMsICZtKTsKKyAgZWxzZSBpZiAoIWRidXNfcGVuZGluZ19jYWxsX3NldF9ub3RpZnkgKHBjLCB0ZXN0X3BlbmRpbmdfY2FsbF9zdG9yZV9yZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtLCBOVUxMKSkKKyAgICBnX2Vycm9yICgiT09NIik7CisKKyAgd2hpbGUgKG0gPT0gTlVMTCkKKyAgICB0ZXN0X21haW5fY29udGV4dF9pdGVyYXRlIChmLT5jdHgsIFRSVUUpOworCisgIGRidXNfbWVzc2FnZV9pdGVyX2luaXQgKG0sICZhcmdzX2l0ZXIpOworICBnX2Fzc2VydF9jbXB1aW50IChkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJnX3R5cGUgKCZhcmdzX2l0ZXIpLCA9PSwKKyAgICAgIERCVVNfVFlQRV9BUlJBWSk7CisgIGdfYXNzZXJ0X2NtcHVpbnQgKGRidXNfbWVzc2FnZV9pdGVyX2dldF9lbGVtZW50X3R5cGUgKCZhcmdzX2l0ZXIpLCA9PSwKKyAgICAgIERCVVNfVFlQRV9ESUNUX0VOVFJZKTsKKyAgZGJ1c19tZXNzYWdlX2l0ZXJfcmVjdXJzZSAoJmFyZ3NfaXRlciwgJmFycl9pdGVyKTsKKworICB3aGlsZSAoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2FyZ190eXBlICgmYXJyX2l0ZXIpICE9IERCVVNfVFlQRV9JTlZBTElEKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisKKyAgICAgIGRidXNfbWVzc2FnZV9pdGVyX3JlY3Vyc2UgKCZhcnJfaXRlciwgJnBhaXJfaXRlcik7CisgICAgICBnX2Fzc2VydF9jbXB1aW50IChkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJnX3R5cGUgKCZwYWlyX2l0ZXIpLCA9PSwKKyAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HKTsKKyAgICAgIGRidXNfbWVzc2FnZV9pdGVyX2dldF9iYXNpYyAoJnBhaXJfaXRlciwgJm5hbWUpOworICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfbmV4dCAoJnBhaXJfaXRlcik7CisgICAgICBnX2Fzc2VydF9jbXB1aW50IChkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJnX3R5cGUgKCZwYWlyX2l0ZXIpLCA9PSwKKyAgICAgICAgICBEQlVTX1RZUEVfVkFSSUFOVCk7CisgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9yZWN1cnNlICgmcGFpcl9pdGVyLCAmdmFyX2l0ZXIpOworCisgICAgICBpZiAoZ19zdHJjbXAwIChuYW1lLCAiRmVhdHVyZXMiKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgY2hlY2tfZmVhdHVyZXMgKCZ2YXJfaXRlcik7CisgICAgICAgICAgaGF2ZV9mZWF0dXJlcyA9IFRSVUU7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKGdfc3RyY21wMCAobmFtZSwgIkludGVyZmFjZXMiKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgY2hlY2tfaW50ZXJmYWNlcyAoJnZhcl9pdGVyKTsKKyAgICAgICAgICBoYXZlX2ludGVyZmFjZXMgPSBUUlVFOworICAgICAgICB9CisKKyAgICAgIGRidXNfbWVzc2FnZV9pdGVyX25leHQgKCZhcnJfaXRlcik7CisgICAgfQorCisgIGdfYXNzZXJ0X3RydWUgKGhhdmVfZmVhdHVyZXMpOworICBnX2Fzc2VydF90cnVlIChoYXZlX2ludGVyZmFjZXMpOworCisgIGlmIChkYnVzX21lc3NhZ2VfaXRlcl9uZXh0ICgmYXJnc19pdGVyKSkKKyAgICBnX2Vycm9yICgiUmVwbHkgaGFzIHRvbyBtYW55IGFyZ3VtZW50cyIpOworCisgIGRidXNfY2xlYXJfbWVzc2FnZSAoJm0pOworICBkYnVzX2NsZWFyX3BlbmRpbmdfY2FsbCAoJnBjKTsKK30KKworI2RlZmluZSBERVNJUkVEX1JMSU1JVCA2NTUzNgorCisjaWZkZWYgREJVU19VTklYCitzdGF0aWMgdm9pZAordGVzdF9mZF9saW1pdCAoRml4dHVyZSAqZiwKKyAgICAgICAgICAgICAgIGdjb25zdHBvaW50ZXIgY29udGV4dCkKK3sKKyNpZmRlZiBIQVZFX1BSTElNSVQKKyAgc3RydWN0IHJsaW1pdCBsaW07CisgIHN0cnVjdCBybGltaXQgbmV3X2xpbWl0OworICBjb25zdCBzdHJ1Y3QgcGFzc3dkICpwd2QgPSBOVUxMOworI2VuZGlmCisKKyAgaWYgKGYtPnNraXApCisgICAgcmV0dXJuOworCisjaWZkZWYgSEFWRV9QUkxJTUlUCisKKyAgaWYgKGdldHVpZCAoKSAhPSAwKQorICAgIHsKKyAgICAgIGdfdGVzdF9za2lwICgiQ2Fubm90IHRlc3QsIG9ubHkgdWlkIDAgaXMgZXhwZWN0ZWQgdG8gcmFpc2UgZmQgbGltaXQiKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgcHdkID0gZ2V0cHduYW0gKERCVVNfVVNFUik7CisKKyAgaWYgKHB3ZCA9PSBOVUxMKQorICAgIHsKKyAgICAgIGdjaGFyICptZXNzYWdlID0gZ19zdHJkdXBfcHJpbnRmICgidXNlciAnJXMnIGRvZXMgbm90IGV4aXN0IiwKKyAgICAgICAgICBEQlVTX1VTRVIpOworCisgICAgICBnX3Rlc3Rfc2tpcCAobWVzc2FnZSk7CisgICAgICBnX2ZyZWUgKG1lc3NhZ2UpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAocHJsaW1pdCAoZ2V0cGlkICgpLCBSTElNSVRfTk9GSUxFLCBOVUxMLCAmbGltKSA8IDApCisgICAgZ19lcnJvciAoImdldCBwcmxpbWl0IChzZWxmKTogJXMiLCBnX3N0cmVycm9yIChlcnJubykpOworCisgIGdfdGVzdF9tZXNzYWdlICgib3VyIFJMSU1JVF9OT0ZJTEU6IHJsaW1fY3VyOiAlbGQsIHJsaW1fbWF4OiAlbGQiLAorICAgICAgICAgICAgICAgICAgKGxvbmcpIGxpbS5ybGltX2N1ciwgKGxvbmcpIGxpbS5ybGltX21heCk7CisKKyAgaWYgKGxpbS5ybGltX2N1ciA9PSBSTElNX0lORklOSVRZIHx8IGxpbS5ybGltX2N1ciA+PSBERVNJUkVEX1JMSU1JVCkKKyAgICB7CisgICAgICAvKiBUaGUgZGJ1cy1kYWVtb24gd2lsbCBoYXZlIGluaGVyaXRlZCBvdXIgbGFyZ2UgcmxpbWl0ICovCisgICAgICBnX3Rlc3Rfc2tpcCAoIkNhbm5vdCB0ZXN0LCBvdXIgb3duIGZkIGxpbWl0IHdhcyBhbHJlYWR5IGxhcmdlIik7CisgICAgICByZXR1cm47CisgICAgfQorCisgIG5ld19saW1pdCA9IGxpbTsKKyAgbmV3X2xpbWl0LnJsaW1fY3VyID0gREVTSVJFRF9STElNSVQ7CisgIG5ld19saW1pdC5ybGltX21heCA9IERFU0lSRURfUkxJTUlUOworCisgIC8qIFRyeSB0byBpbmNyZWFzZSB0aGUgcmxpbWl0IG91cnNlbHZlcy4gSWYgd2UncmUgcm9vdCBpbiBhbgorICAgKiB1bnByaXZpbGVnZWQgTGludXggY29udGFpbmVyLCB0aGVuIHdlIHdvbid0IGhhdmUgQ0FQX1NZU19SRVNPVVJDRQorICAgKiBhbmQgdGhpcyB3aWxsIGZhaWwgd2l0aCBFUEVSTS4gSWYgc28sIHRoZSBkYnVzLWRhZW1vbiB3b3VsZG4ndCBiZQorICAgKiBhYmxlIHRvIGluY3JlYXNlIGl0cyBybGltaXQgZWl0aGVyLiAqLworICBpZiAocHJsaW1pdCAoZ2V0cGlkICgpLCBSTElNSVRfTk9GSUxFLCAmbmV3X2xpbWl0LCBOVUxMKSA8IDApCisgICAgeworICAgICAgZ2NoYXIgKm1lc3NhZ2U7CisKKyAgICAgIG1lc3NhZ2UgPSBnX3N0cmR1cF9wcmludGYgKCJDYW5ub3QgdGVzdCwgd2UgY2Fubm90IGNoYW5nZSB0aGUgcmxpbWl0IHNvICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcmVzdW1hYmx5IG5laXRoZXIgY2FuIHRoZSBkYnVzLWRhZW1vbjogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIGdfdGVzdF9za2lwIChtZXNzYWdlKTsKKyAgICAgIGdfZnJlZSAobWVzc2FnZSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIC8qIEltbWVkaWF0ZWx5IHB1dCBvdXIgb3JpZ2luYWwgbGltaXQgYmFjayBzbyBpdCB3b24ndCBpbnRlcmZlcmUgd2l0aAorICAgKiBzdWJzZXF1ZW50IHRlc3RzLiBUaGlzIHNob3VsZCBhbHdheXMgc3VjY2VlZC4gKi8KKyAgaWYgKHBybGltaXQgKGdldHBpZCAoKSwgUkxJTUlUX05PRklMRSwgJmxpbSwgTlVMTCkgPCAwKQorICAgIGdfZXJyb3IgKCJDYW5ub3QgcmVzdG9yZSBvdXIgb3JpZ2luYWwgbGltaXRzOiAlcyIsIGdfc3RyZXJyb3IgKGVycm5vKSk7CisKKyAgaWYgKHBybGltaXQgKGYtPmRhZW1vbl9waWQsIFJMSU1JVF9OT0ZJTEUsIE5VTEwsICZsaW0pIDwgMCkKKyAgICBnX2Vycm9yICgiZ2V0IHBybGltaXQgKGRidXMtZGFlbW9uKTogJXMiLCBnX3N0cmVycm9yIChlcnJubykpOworCisgIGdfdGVzdF9tZXNzYWdlICgiZGJ1cy1kYWVtb24ncyBSTElNSVRfTk9GSUxFOiBybGltX2N1cjogJWxkLCBybGltX21heDogJWxkIiwKKyAgICAgICAgICAgICAgICAgIChsb25nKSBsaW0ucmxpbV9jdXIsIChsb25nKSBsaW0ucmxpbV9tYXgpOworCisgIGlmIChsaW0ucmxpbV9jdXIgIT0gUkxJTV9JTkZJTklUWSkKKyAgICBnX2Fzc2VydF9jbXBpbnQgKGxpbS5ybGltX2N1ciwgPj0sIERFU0lSRURfUkxJTUlUKTsKKworI2Vsc2UgLyogIUhBVkVfUFJMSU1JVCAqLworCisgIGdfdGVzdF9za2lwICgicHJsaW1pdCgpIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBwbGF0Zm9ybSIpOworCisjZW5kaWYgLyogIUhBVkVfUFJMSU1JVCAqLworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkCit0ZWFyZG93biAoRml4dHVyZSAqZiwKKyAgICBnY29uc3Rwb2ludGVyIGNvbnRleHQgR19HTlVDX1VOVVNFRCkKK3sKKyAgZGJ1c19lcnJvcl9mcmVlICgmZi0+ZSk7CisgIGdfY2xlYXJfZXJyb3IgKCZmLT5nZSk7CisKKyAgaWYgKGYtPmxlZnRfY29ubiAhPSBOVUxMKQorICAgIGRidXNfY29ubmVjdGlvbl9jbG9zZSAoZi0+bGVmdF9jb25uKTsKKworICBpZiAoZi0+cmlnaHRfY29ubiAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChmLT5yaWdodF9jb25uX2VjaG8pCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX2Nvbm5lY3Rpb25fcmVtb3ZlX2ZpbHRlciAoZi0+cmlnaHRfY29ubiwgZWNob19maWx0ZXIsIGYpOworICAgICAgICAgIGYtPnJpZ2h0X2Nvbm5fZWNobyA9IEZBTFNFOworICAgICAgICB9CisKKyAgICAgIGlmIChmLT5yaWdodF9jb25uX2hvbGQpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX2Nvbm5lY3Rpb25fcmVtb3ZlX2ZpbHRlciAoZi0+cmlnaHRfY29ubiwgaG9sZF9maWx0ZXIsIGYpOworICAgICAgICAgIGYtPnJpZ2h0X2Nvbm5faG9sZCA9IEZBTFNFOworICAgICAgICB9CisKKyAgICAgIGdfcXVldWVfZm9yZWFjaCAoJmYtPmhlbGRfbWVzc2FnZXMsIChHRnVuYykgZGJ1c19tZXNzYWdlX3VucmVmLCBOVUxMKTsKKyAgICAgIGdfcXVldWVfY2xlYXIgKCZmLT5oZWxkX21lc3NhZ2VzKTsKKworICAgICAgZGJ1c19jb25uZWN0aW9uX2Nsb3NlIChmLT5yaWdodF9jb25uKTsKKyAgICB9CisKKyAgZGJ1c19jbGVhcl9jb25uZWN0aW9uICgmZi0+bGVmdF9jb25uKTsKKyAgZGJ1c19jbGVhcl9jb25uZWN0aW9uICgmZi0+cmlnaHRfY29ubik7CisKKyAgaWYgKGYtPmRhZW1vbl9waWQgIT0gMCkKKyAgICB7CisgICAgICB0ZXN0X2tpbGxfcGlkIChmLT5kYWVtb25fcGlkKTsKKyAgICAgIGdfc3Bhd25fY2xvc2VfcGlkIChmLT5kYWVtb25fcGlkKTsKKyAgICAgIGYtPmRhZW1vbl9waWQgPSAwOworICAgIH0KKworICBpZiAoZi0+dG1wX3J1bnRpbWVfZGlyICE9IE5VTEwpCisgICAgeworICAgICAgZ2NoYXIgKnBhdGg7CisKKyAgICAgIC8qIHRoZSBzb2NrZXQgbWF5IGV4aXN0ICovCisgICAgICBwYXRoID0gZ19zdHJkdXBfcHJpbnRmICgiJXMvYnVzIiwgZi0+dG1wX3J1bnRpbWVfZGlyKTsKKworICAgICAgdGVzdF9yZW1vdmVfaWZfZXhpc3RzIChwYXRoKTsKKyAgICAgIGdfZnJlZSAocGF0aCk7CisgICAgICAvKiB0aGVyZSBzaG91bGRuJ3QgYmUgYW55dGhpbmcgZWxzZSBpbiB0aGVyZSAqLworICAgICAgdGVzdF9ybWRpcl9tdXN0X2V4aXN0IChmLT50bXBfcnVudGltZV9kaXIpOworCisgICAgICAvKiB3ZSdyZSByZWx5aW5nIG9uIGJlaW5nIHNpbmdsZS10aHJlYWRlZCBmb3IgdGhpcyB0byBiZSBzYWZlICovCisgICAgICBpZiAoZi0+c2F2ZWRfcnVudGltZV9kaXIgIT0gTlVMTCkKKyAgICAgICAgZ19zZXRlbnYgKCJYREdfUlVOVElNRV9ESVIiLCBmLT5zYXZlZF9ydW50aW1lX2RpciwgVFJVRSk7CisgICAgICBlbHNlCisgICAgICAgIGdfdW5zZXRlbnYgKCJYREdfUlVOVElNRV9ESVIiKTsKKyAgICAgIGdfZnJlZSAoZi0+c2F2ZWRfcnVudGltZV9kaXIpOworICAgICAgZ19mcmVlIChmLT50bXBfcnVudGltZV9kaXIpOworICAgIH0KKworICB0ZXN0X21haW5fY29udGV4dF91bnJlZiAoZi0+Y3R4KTsKKyAgZ19mcmVlIChmLT5hZGRyZXNzKTsKK30KKworc3RhdGljIENvbmZpZyBsaW1pdGVkX2NvbmZpZyA9IHsKKyAgICAiMzQzOTMiLCAxMDAwMCwgInZhbGlkLWNvbmZpZy1maWxlcy9pbmNvbWluZy1saW1pdC5jb25mIiwKKyAgICBURVNUX1VTRVJfTUUsIFNQRUNJRllfQUREUkVTUworfTsKKworc3RhdGljIENvbmZpZyBmaW5pdGVfdGltZW91dF9jb25maWcgPSB7CisgICAgTlVMTCwgMSwgInZhbGlkLWNvbmZpZy1maWxlcy9maW5pdGUtdGltZW91dC5jb25mIiwKKyAgICBURVNUX1VTRVJfTUUsIFNQRUNJRllfQUREUkVTUworfTsKKworI2lmZGVmIERCVVNfVU5JWAorc3RhdGljIENvbmZpZyBsaXN0ZW5fdW5peF9ydW50aW1lX2NvbmZpZyA9IHsKKyAgICAiNjEzMDMiLCAxLCAidmFsaWQtY29uZmlnLWZpbGVzL2xpc3Rlbi11bml4LXJ1bnRpbWUuY29uZiIsCisgICAgVEVTVF9VU0VSX01FLCBSRUxZX09OX0RFRkFVTFQKK307CisjZW5kaWYKKworc3RhdGljIENvbmZpZyBtYXhfY29tcGxldGVkX2Nvbm5lY3Rpb25zX2NvbmZpZyA9IHsKKyAgICBOVUxMLCAxLCAidmFsaWQtY29uZmlnLWZpbGVzL21heC1jb21wbGV0ZWQtY29ubmVjdGlvbnMuY29uZiIsCisgICAgVEVTVF9VU0VSX01FLCBTUEVDSUZZX0FERFJFU1MKK307CisKK3N0YXRpYyBDb25maWcgbWF4X2Nvbm5lY3Rpb25zX3Blcl91c2VyX2NvbmZpZyA9IHsKKyAgICBOVUxMLCAxLCAidmFsaWQtY29uZmlnLWZpbGVzL21heC1jb25uZWN0aW9ucy1wZXItdXNlci5jb25mIiwKKyAgICBURVNUX1VTRVJfTUUsIFNQRUNJRllfQUREUkVTUworfTsKKworc3RhdGljIENvbmZpZyBtYXhfcmVwbGllc19wZXJfY29ubmVjdGlvbl9jb25maWcgPSB7CisgICAgTlVMTCwgMSwgInZhbGlkLWNvbmZpZy1maWxlcy9tYXgtcmVwbGllcy1wZXItY29ubmVjdGlvbi5jb25mIiwKKyAgICBURVNUX1VTRVJfTUUsIFNQRUNJRllfQUREUkVTUworfTsKKworc3RhdGljIENvbmZpZyBtYXhfbWF0Y2hfcnVsZXNfcGVyX2Nvbm5lY3Rpb25fY29uZmlnID0geworICAgIE5VTEwsIDEsICJ2YWxpZC1jb25maWctZmlsZXMvbWF4LW1hdGNoLXJ1bGVzLXBlci1jb25uZWN0aW9uLmNvbmYiLAorICAgIFRFU1RfVVNFUl9NRSwgU1BFQ0lGWV9BRERSRVNTCit9OworCitzdGF0aWMgQ29uZmlnIG1heF9uYW1lc19wZXJfY29ubmVjdGlvbl9jb25maWcgPSB7CisgICAgTlVMTCwgMSwgInZhbGlkLWNvbmZpZy1maWxlcy9tYXgtbmFtZXMtcGVyLWNvbm5lY3Rpb24uY29uZiIsCisgICAgVEVTVF9VU0VSX01FLCBTUEVDSUZZX0FERFJFU1MKK307CisKKyNpZiBkZWZpbmVkKERCVVNfVU5JWCkgJiYgZGVmaW5lZChIQVZFX1VOSVhfRkRfUEFTU0lORykgJiYgZGVmaW5lZChIQVZFX0dJT19VTklYKQorc3RhdGljIENvbmZpZyBwZW5kaW5nX2ZkX3RpbWVvdXRfY29uZmlnID0geworICAgIE5VTEwsIDEsICJ2YWxpZC1jb25maWctZmlsZXMvcGVuZGluZy1mZC10aW1lb3V0LmNvbmYiLAorICAgIFRFU1RfVVNFUl9NRSwgU1BFQ0lGWV9BRERSRVNTCit9OworCitzdGF0aWMgQ29uZmlnIGNvdW50X2Zkc19jb25maWcgPSB7CisgICAgTlVMTCwgMSwgInZhbGlkLWNvbmZpZy1maWxlcy9jb3VudC1mZHMuY29uZiIsCisgICAgVEVTVF9VU0VSX01FLCBTUEVDSUZZX0FERFJFU1MKK307CisjZW5kaWYKKworI2lmIGRlZmluZWQoREJVU19VTklYKQorc3RhdGljIENvbmZpZyBhc19hbm90aGVyX3VzZXJfY29uZmlnID0geworICAgIE5VTEwsIDEsICJ2YWxpZC1jb25maWctZmlsZXMvYXMtYW5vdGhlci11c2VyLmNvbmYiLAorICAgIC8qIFdlIHN0YXJ0IHRoZSBkYnVzLWRhZW1vbiBhcyByb290IGFuZCBkcm9wIHByaXZpbGVnZXMsIGxpa2UgdGhlCisgICAgICogcmVhbCBzeXN0ZW0gYnVzIGRvZXMgKi8KKyAgICBURVNUX1VTRVJfUk9PVCwgU1BFQ0lGWV9BRERSRVNTCit9OworI2VuZGlmCisKK2ludAorbWFpbiAoaW50IGFyZ2MsCisgICAgY2hhciAqKmFyZ3YpCit7CisgIHRlc3RfaW5pdCAoJmFyZ2MsICZhcmd2KTsKKworICBnX3Rlc3RfYWRkICgiL2VjaG8vc2Vzc2lvbiIsIEZpeHR1cmUsIE5VTEwsIHNldHVwLCB0ZXN0X2VjaG8sIHRlYXJkb3duKTsKKyAgZ190ZXN0X2FkZCAoIi9lY2hvL2xpbWl0ZWQiLCBGaXh0dXJlLCAmbGltaXRlZF9jb25maWcsCisgICAgICBzZXR1cCwgdGVzdF9lY2hvLCB0ZWFyZG93bik7CisgIGdfdGVzdF9hZGQgKCIvbm8tcmVwbHkvZGlzY29ubmVjdCIsIEZpeHR1cmUsIE5VTEwsCisgICAgICBzZXR1cCwgdGVzdF9ub19yZXBseSwgdGVhcmRvd24pOworICBnX3Rlc3RfYWRkICgiL25vLXJlcGx5L3RpbWVvdXQiLCBGaXh0dXJlLCAmZmluaXRlX3RpbWVvdXRfY29uZmlnLAorICAgICAgc2V0dXAsIHRlc3Rfbm9fcmVwbHksIHRlYXJkb3duKTsKKyAgZ190ZXN0X2FkZCAoIi9jcmVkcyIsIEZpeHR1cmUsIE5VTEwsIHNldHVwLCB0ZXN0X2NyZWRzLCB0ZWFyZG93bik7CisgIGdfdGVzdF9hZGQgKCIvcHJvY2Vzc2lkIiwgRml4dHVyZSwgTlVMTCwgc2V0dXAsIHRlc3RfcHJvY2Vzc2lkLCB0ZWFyZG93bik7CisgIGdfdGVzdF9hZGQgKCIvY2Fub25pY2FsLXBhdGgvdWFlIiwgRml4dHVyZSwgTlVMTCwKKyAgICAgIHNldHVwLCB0ZXN0X2Nhbm9uaWNhbF9wYXRoX3VhZSwgdGVhcmRvd24pOworICBnX3Rlc3RfYWRkICgiL2xpbWl0cy9tYXgtY29tcGxldGVkLWNvbm5lY3Rpb25zIiwgRml4dHVyZSwKKyAgICAgICZtYXhfY29tcGxldGVkX2Nvbm5lY3Rpb25zX2NvbmZpZywKKyAgICAgIHNldHVwLCB0ZXN0X21heF9jb25uZWN0aW9ucywgdGVhcmRvd24pOworICBnX3Rlc3RfYWRkICgiL2xpbWl0cy9tYXgtY29ubmVjdGlvbnMtcGVyLXVzZXIiLCBGaXh0dXJlLAorICAgICAgJm1heF9jb25uZWN0aW9uc19wZXJfdXNlcl9jb25maWcsCisgICAgICBzZXR1cCwgdGVzdF9tYXhfY29ubmVjdGlvbnMsIHRlYXJkb3duKTsKKyAgZ190ZXN0X2FkZCAoIi9saW1pdHMvbWF4LXJlcGxpZXMtcGVyLWNvbm5lY3Rpb24iLCBGaXh0dXJlLAorICAgICAgJm1heF9yZXBsaWVzX3Blcl9jb25uZWN0aW9uX2NvbmZpZywKKyAgICAgIHNldHVwLCB0ZXN0X21heF9yZXBsaWVzX3Blcl9jb25uZWN0aW9uLCB0ZWFyZG93bik7CisgIGdfdGVzdF9hZGQgKCIvbGltaXRzL21heC1tYXRjaC1ydWxlcy1wZXItY29ubmVjdGlvbiIsIEZpeHR1cmUsCisgICAgICAmbWF4X21hdGNoX3J1bGVzX3Blcl9jb25uZWN0aW9uX2NvbmZpZywKKyAgICAgIHNldHVwLCB0ZXN0X21heF9tYXRjaF9ydWxlc19wZXJfY29ubmVjdGlvbiwgdGVhcmRvd24pOworICBnX3Rlc3RfYWRkICgiL2xpbWl0cy9tYXgtbmFtZXMtcGVyLWNvbm5lY3Rpb24iLCBGaXh0dXJlLAorICAgICAgJm1heF9uYW1lc19wZXJfY29ubmVjdGlvbl9jb25maWcsCisgICAgICBzZXR1cCwgdGVzdF9tYXhfbmFtZXNfcGVyX2Nvbm5lY3Rpb24sIHRlYXJkb3duKTsKKyAgZ190ZXN0X2FkZCAoIi9wZWVyL3BpbmciLCBGaXh0dXJlLCBOVUxMLCBzZXR1cCwgdGVzdF9wZWVyX3BpbmcsIHRlYXJkb3duKTsKKyAgZ190ZXN0X2FkZCAoIi9wZWVyL2dldC1tYWNoaW5lLWlkIiwgRml4dHVyZSwgTlVMTCwKKyAgICAgIHNldHVwLCB0ZXN0X3BlZXJfZ2V0X21hY2hpbmVfaWQsIHRlYXJkb3duKTsKKyAgZ190ZXN0X2FkZCAoIi9wcm9wZXJ0aWVzL2dldC1pbnZhbGlkLWlmYWNlIiwgRml4dHVyZSwgTlVMTCwKKyAgICAgIHNldHVwLCB0ZXN0X2dldF9pbnZhbGlkX2lmYWNlLCB0ZWFyZG93bik7CisgIGdfdGVzdF9hZGQgKCIvcHJvcGVydGllcy9nZXQtaW52YWxpZC1wYXRoIiwgRml4dHVyZSwgTlVMTCwKKyAgICAgIHNldHVwLCB0ZXN0X2dldF9pbnZhbGlkX3BhdGgsIHRlYXJkb3duKTsKKyAgZ190ZXN0X2FkZCAoIi9wcm9wZXJ0aWVzL2dldC1pbnZhbGlkIiwgRml4dHVyZSwgTlVMTCwKKyAgICAgIHNldHVwLCB0ZXN0X2dldF9pbnZhbGlkLCB0ZWFyZG93bik7CisgIGdfdGVzdF9hZGQgKCIvcHJvcGVydGllcy9nZXQtYWxsLWludmFsaWQtaWZhY2UiLCBGaXh0dXJlLCBOVUxMLCBzZXR1cCwKKyAgICAgIHRlc3RfZ2V0X2FsbF9pbnZhbGlkX2lmYWNlLCB0ZWFyZG93bik7CisgIGdfdGVzdF9hZGQgKCIvcHJvcGVydGllcy9nZXQtYWxsLWludmFsaWQtcGF0aCIsIEZpeHR1cmUsIE5VTEwsIHNldHVwLAorICAgICAgdGVzdF9nZXRfYWxsX2ludmFsaWRfcGF0aCwgdGVhcmRvd24pOworICBnX3Rlc3RfYWRkICgiL3Byb3BlcnRpZXMvc2V0LWludmFsaWQtaWZhY2UiLCBGaXh0dXJlLCBOVUxMLAorICAgICAgc2V0dXAsIHRlc3Rfc2V0X2ludmFsaWRfaWZhY2UsIHRlYXJkb3duKTsKKyAgZ190ZXN0X2FkZCAoIi9wcm9wZXJ0aWVzL3NldC1pbnZhbGlkLXBhdGgiLCBGaXh0dXJlLCBOVUxMLAorICAgICAgc2V0dXAsIHRlc3Rfc2V0X2ludmFsaWRfcGF0aCwgdGVhcmRvd24pOworICBnX3Rlc3RfYWRkICgiL3Byb3BlcnRpZXMvc2V0LWludmFsaWQiLCBGaXh0dXJlLCBOVUxMLAorICAgICAgc2V0dXAsIHRlc3Rfc2V0X2ludmFsaWQsIHRlYXJkb3duKTsKKyAgZ190ZXN0X2FkZCAoIi9wcm9wZXJ0aWVzL3NldCIsIEZpeHR1cmUsIE5VTEwsCisgICAgICBzZXR1cCwgdGVzdF9zZXQsIHRlYXJkb3duKTsKKyAgZ190ZXN0X2FkZCAoIi9wcm9wZXJ0aWVzL2ZlYXR1cmVzIiwgRml4dHVyZSwgTlVMTCwKKyAgICAgIHNldHVwLCB0ZXN0X2ZlYXR1cmVzLCB0ZWFyZG93bik7CisgIGdfdGVzdF9hZGQgKCIvcHJvcGVydGllcy9pbnRlcmZhY2VzIiwgRml4dHVyZSwgTlVMTCwgc2V0dXAsCisgICAgICB0ZXN0X2ludGVyZmFjZXMsIHRlYXJkb3duKTsKKyAgZ190ZXN0X2FkZCAoIi9wcm9wZXJ0aWVzL2dldC1hbGwiLCBGaXh0dXJlLCBOVUxMLCBzZXR1cCwKKyAgICAgIHRlc3RfZ2V0X2FsbCwgdGVhcmRvd24pOworCisjaWYgZGVmaW5lZChEQlVTX1VOSVgpICYmIGRlZmluZWQoSEFWRV9VTklYX0ZEX1BBU1NJTkcpICYmIGRlZmluZWQoSEFWRV9HSU9fVU5JWCkKKyAgZ190ZXN0X2FkZCAoIi9saW1pdHMvcGVuZGluZy1mZC10aW1lb3V0IiwgRml4dHVyZSwKKyAgICAgICZwZW5kaW5nX2ZkX3RpbWVvdXRfY29uZmlnLAorICAgICAgc2V0dXAsIHRlc3RfcGVuZGluZ19mZF90aW1lb3V0LCB0ZWFyZG93bik7CisgIGdfdGVzdF9hZGQgKCIvcG9saWN5L2NvdW50LWZkcyIsIEZpeHR1cmUsICZjb3VudF9mZHNfY29uZmlnLAorICAgICAgc2V0dXAsIHRlc3RfY291bnRfZmRzLCB0ZWFyZG93bik7CisjZW5kaWYKKworI2lmZGVmIERCVVNfVU5JWAorICAvKiBXZSBjYW4ndCB0ZXN0IHRoaXMgaW4gbG9vcGJhY2suYyB3aXRoIHRoZSByZXN0IG9mIHVuaXg6cnVudGltZT15ZXMsCisgICAqIGJlY2F1c2UgZGJ1c19idXNfZ2V0W19wcml2YXRlXSBpcyB0aGUgb25seSB3YXkgdG8gdXNlIHRoZSBkZWZhdWx0LAorICAgKiBhbmQgdGhhdCBibG9ja3Mgb24gYSByb3VuZC10cmlwIHRvIHRoZSBkYnVzLWRhZW1vbiAqLworICBnX3Rlc3RfYWRkICgiL3VuaXgtcnVudGltZS1pcy1kZWZhdWx0IiwgRml4dHVyZSwgJmxpc3Rlbl91bml4X3J1bnRpbWVfY29uZmlnLAorICAgICAgc2V0dXAsIHRlc3RfZWNobywgdGVhcmRvd24pOworCisgIGdfdGVzdF9hZGQgKCIvZmQtbGltaXQvc2Vzc2lvbiIsIEZpeHR1cmUsIE5VTEwsCisgICAgICAgICAgICAgIHNldHVwLCB0ZXN0X2ZkX2xpbWl0LCB0ZWFyZG93bik7CisgIGdfdGVzdF9hZGQgKCIvZmQtbGltaXQvc3lzdGVtIiwgRml4dHVyZSwgJmFzX2Fub3RoZXJfdXNlcl9jb25maWcsCisgICAgICAgICAgICAgIHNldHVwLCB0ZXN0X2ZkX2xpbWl0LCB0ZWFyZG93bik7CisjZW5kaWYKKworICByZXR1cm4gZ190ZXN0X3J1biAoKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvZGJ1cy10ZXN0LXJ1bm5lciBiL3Rlc3QvZGJ1cy10ZXN0LXJ1bm5lcgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hM2RjMzk2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYnVzLXRlc3QtcnVubmVyCkBAIC0wLDAgKzEsNDMgQEAKKyMhL2Jpbi9zaAorCitzZXQgLWUKKworZGlyPSIkMSIKK3NoaWZ0CisKK2lmICEgdGVzdCAtZCAiJGRpciI7IHRoZW4KKyAgZWNobyAiVXNhZ2U6IGRidXMtdGVzdC1ydW5uZXIgZGlyZWN0b3J5IFtleGVjdXRhYmxlLi4uXSIKKyAgZXhpdCAwCitmaQorCitwYXNzZWQ9MAorZmFpbGVkPTAKK3NraXBwZWQ9MAorCitmb3IgcHJvZyBpbiAiJEAiOyBkbworICBlPTAKKyAgIiRkaXIvJHByb2ciIHx8IGU9JD8KKyAgY2FzZSAkZSBpbgorICAgICgwKQorICAgICAgZWNobyAiUEFTUzogJHByb2ciCisgICAgICBwYXNzZWQ9YGV4cHIgJHBhc3NlZCArIDFgCisgICAgICA7OworICAgICg3NykKKyAgICAgIGVjaG8gIlNLSVA6ICRwcm9nIgorICAgICAgc2tpcHBlZD1gZXhwciAkc2tpcHBlZCArIDFgCisgICAgICA7OworICAgICgqKQorICAgICAgZWNobyAiRkFJTDogJHByb2ciCisgICAgICBmYWlsZWQ9YGV4cHIgJGZhaWxlZCArIDFgCisgICAgICA7OworICBlc2FjCitkb25lCisKK2lmIHRlc3QgJGZhaWxlZCA9IDA7IHRoZW4KKyAgIyBhdm9pZCBzYXlpbmcgIkZBSUwiLCB0byBtYWtlIGl0IGVhc3kgdG8gZ3JlcCByZXN1bHRzIQorICBlY2hvICJQQVNTRUQgJHBhc3NlZCAvIFNLSVBQRUQgJHNraXBwZWQiCisgIGV4aXQgMAorZWxzZQorICBlY2hvICJQQVNTRUQgJHBhc3NlZCAvIEZBSUxFRCAkZmFpbGVkIC8gU0tJUFBFRCAkc2tpcHBlZCIKKyAgZXhpdCAxCitmaQpkaWZmIC0tZ2l0IGEvdGVzdC9mZHBhc3MuYyBiL3Rlc3QvZmRwYXNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJhZDY3NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZmRwYXNzLmMKQEAgLTAsMCArMSw5NTggQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxMC0yMDEyIE5va2lhIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgwqkgMjAxNCBDb2xsYWJvcmEgTHRkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcworICogKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwKKyAqIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsCisgKiBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLAorICogYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKKyAqIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCisgKiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKworI2luY2x1ZGUgPGRidXMvZGJ1cy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1pbnRlcm5hbHMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc3lzZGVwcy5oPgorCisjaW5jbHVkZSA8Z2xpYi5oPgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpZmRlZiBHX09TX1VOSVgKKyMgaW5jbHVkZSA8ZGJ1cy9kYnVzLXN5c2RlcHMtdW5peC5oPgorCisjIGluY2x1ZGUgPGVycm5vLmg+CisjIGluY2x1ZGUgPGZjbnRsLmg+CisjIGlmZGVmIEhBVkVfU1lTX1JFU09VUkNFX0gKKyMgICBpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KKyMgZW5kaWYKKyMgaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyMgaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjIGluY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJ0ZXN0LXV0aWxzLWdsaWIuaCIKKworI2lmZGVmIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLW1lc3NhZ2UtaW50ZXJuYWwuaD4KKyNlbHNlCit0eXBlZGVmIHN0cnVjdCBfREJ1c0luaXRpYWxGRHMgREJ1c0luaXRpYWxGRHM7CisjZGVmaW5lIF9kYnVzX2NoZWNrX2ZkbGVha3NfZW50ZXIoKSBOVUxMCisjZGVmaW5lIF9kYnVzX2NoZWNrX2ZkbGVha3NfbGVhdmUoZmRzKSBkbyB7fSB3aGlsZSAoMCkKKyNlbmRpZgorCisvKiBBcmJpdHJhcnk7IGluY2x1ZGVkIGhlcmUgdG8gYXZvaWQgcmVseWluZyBvbiB0aGUgZGVmYXVsdCAqLworI2RlZmluZSBNQVhfTUVTU0FHRV9VTklYX0ZEUyAyMAorLyogVGhpcyB0ZXN0IHdvbid0IHdvcmsgb24gTGludXggdW5sZXNzIHRoaXMgaXMgdHJ1ZS4gKi8KK19EQlVTX1NUQVRJQ19BU1NFUlQgKE1BWF9NRVNTQUdFX1VOSVhfRkRTIDw9IDI1Myk7CisKKy8qIEFyYml0cmFyeTsgaW5jbHVkZWQgaGVyZSB0byBhdm9pZCByZWx5aW5nIG9uIHRoZSBkZWZhdWx0LiAqLworI2RlZmluZSBNQVhfSU5DT01JTkdfVU5JWF9GRFMgKE1BWF9NRVNTQUdFX1VOSVhfRkRTICogNCkKKworLyogQXJiaXRyYXJ5LCBleGNlcHQgdGhhdCBNQVhfTUVTU0FHRV9VTklYX0ZEUyAqIFNPTUVfTUVTU0FHRVMgc2hvdWxkIGJlCisgKiBsZXNzIHRoYW4gdGhlIHByb2Nlc3MncyBmaWxlIGRlc2NyaXB0b3IgbGltaXQuICovCisjZGVmaW5lIFNPTUVfTUVTU0FHRVMgMjAKKy8qIFRvIGNvdmVyIHNvbWUgc2l0dWF0aW9ucyBvbiBMaW51eCB3ZSB3YW50IHRoaXMgdG8gYmUgdHJ1ZS4gKi8KK19EQlVTX1NUQVRJQ19BU1NFUlQgKE1BWF9NRVNTQUdFX1VOSVhfRkRTICogU09NRV9NRVNTQUdFUyA+IDI1Nik7CisKKy8qIExpbnV4IHdvbid0IGFsbG93IG1vcmUgdGhhbiAyNTMgZmRzIHBlciBzZW5kbXNnKCkuICovCisjZGVmaW5lIFRPT19NQU5ZX0ZEUyAyNTUKK19EQlVTX1NUQVRJQ19BU1NFUlQgKE1BWF9NRVNTQUdFX1VOSVhfRkRTIDwgVE9PX01BTllfRkRTKTsKKworLyogQXMgaW4gdGVzdC9yZWxheS5jLCB0aGlzIGlzIGEgbWluaWF0dXJlIGRidXMtZGFlbW9uOiB3ZSByZWxheSBtZXNzYWdlcworICogZnJvbSB0aGUgY2xpZW50IG9uIHRoZSBsZWZ0IHRvIHRoZSBjbGllbnQgb24gdGhlIHJpZ2h0LgorICoKKyAqIGxlZnQgICAgICBzb2NrZXQgICAgIGxlZnQgICAgICBkaXNwYXRjaCAgICAgcmlnaHQgICAgc29ja2V0ICAgICByaWdodAorICogY2xpZW50ID09PT09PT09PT09PiAgc2VydmVyIC0tLS0tLS0tLS0tLS0tPiBzZXJ2ZXIgPT09PT09PT09PT0+IGNsaWVudAorICogY29ubiAgICAgICAgICAgICAgICAgY29ubiAgICAgICAgICAgICAgICAgICBjb25uICAgICAgICAgICAgICAgIGNvbm4KKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVGVzdE1haW5Db250ZXh0ICpjdHg7CisgICAgREJ1c0Vycm9yIGU7CisgICAgZ2Jvb2xlYW4gc2tpcDsKKworICAgIERCdXNTZXJ2ZXIgKnNlcnZlcjsKKworICAgIERCdXNDb25uZWN0aW9uICpsZWZ0X2NsaWVudF9jb25uOworICAgIERCdXNDb25uZWN0aW9uICpsZWZ0X3NlcnZlcl9jb25uOworCisgICAgREJ1c0Nvbm5lY3Rpb24gKnJpZ2h0X3NlcnZlcl9jb25uOworICAgIERCdXNDb25uZWN0aW9uICpyaWdodF9jbGllbnRfY29ubjsKKyAgICAvKiBxdWV1ZSBvZiBEQnVzTWVzc2FnZSByZWNlaXZlZCBieSByaWdodF9jbGllbnRfY29ubiAqLworICAgIEdRdWV1ZSBtZXNzYWdlczsKKworICAgIGludCBmZF9iZWZvcmU7CisgICAgREJ1c0luaXRpYWxGRHMgKmluaXRpYWxfZmRzOworfSBGaXh0dXJlOworCitzdGF0aWMgdm9pZCBvb20gKGNvbnN0IGdjaGFyICpkb2luZykgR19HTlVDX05PUkVUVVJOOworCitzdGF0aWMgdm9pZAorb29tIChjb25zdCBnY2hhciAqZG9pbmcpCit7CisgIGdfZXJyb3IgKCJvdXQgb2YgbWVtb3J5ICglcykiLCBkb2luZyk7CisgIGFib3J0ICgpOworfQorCitzdGF0aWMgdm9pZAorYXNzZXJ0X25vX2Vycm9yIChjb25zdCBEQnVzRXJyb3IgKmUpCit7CisgIGlmIChHX1VOTElLRUxZIChkYnVzX2Vycm9yX2lzX3NldCAoZSkpKQorICAgIGdfZXJyb3IgKCJleHBlY3RlZCBzdWNjZXNzIGJ1dCBnb3QgZXJyb3I6ICVzOiAlcyIsIGUtPm5hbWUsIGUtPm1lc3NhZ2UpOworfQorCitzdGF0aWMgREJ1c0hhbmRsZXJSZXN1bHQKK2xlZnRfc2VydmVyX21lc3NhZ2VfY2IgKERCdXNDb25uZWN0aW9uICpzZXJ2ZXJfY29ubiwKKyAgICBEQnVzTWVzc2FnZSAqbWVzc2FnZSwKKyAgICB2b2lkICpkYXRhKQoreworICBGaXh0dXJlICpmID0gZGF0YTsKKworICBnX2Fzc2VydCAoc2VydmVyX2Nvbm4gPT0gZi0+bGVmdF9zZXJ2ZXJfY29ubik7CisgIGdfYXNzZXJ0IChmLT5yaWdodF9zZXJ2ZXJfY29ubiAhPSBOVUxMKTsKKworICBkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoZi0+cmlnaHRfc2VydmVyX2Nvbm4sIG1lc3NhZ2UsIE5VTEwpOworCisgIHJldHVybiBEQlVTX0hBTkRMRVJfUkVTVUxUX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBEQnVzSGFuZGxlclJlc3VsdAorcmlnaHRfY2xpZW50X21lc3NhZ2VfY2IgKERCdXNDb25uZWN0aW9uICpjbGllbnRfY29ubiwKKyAgICBEQnVzTWVzc2FnZSAqbWVzc2FnZSwKKyAgICB2b2lkICpkYXRhKQoreworICBGaXh0dXJlICpmID0gZGF0YTsKKworICBnX2Fzc2VydCAoY2xpZW50X2Nvbm4gPT0gZi0+cmlnaHRfY2xpZW50X2Nvbm4pOworICBnX3F1ZXVlX3B1c2hfdGFpbCAoJmYtPm1lc3NhZ2VzLCBkYnVzX21lc3NhZ2VfcmVmIChtZXNzYWdlKSk7CisKKyAgcmV0dXJuIERCVVNfSEFORExFUl9SRVNVTFRfSEFORExFRDsKK30KKworc3RhdGljIHZvaWQKK25ld19jb25uX2NiIChEQnVzU2VydmVyICpzZXJ2ZXIsCisgICAgREJ1c0Nvbm5lY3Rpb24gKnNlcnZlcl9jb25uLAorICAgIHZvaWQgKmRhdGEpCit7CisgIEZpeHR1cmUgKmYgPSBkYXRhOworCisgIGRidXNfY29ubmVjdGlvbl9zZXRfbWF4X21lc3NhZ2VfdW5peF9mZHMgKHNlcnZlcl9jb25uLAorICAgICAgTUFYX01FU1NBR0VfVU5JWF9GRFMpOworICBkYnVzX2Nvbm5lY3Rpb25fc2V0X21heF9yZWNlaXZlZF91bml4X2ZkcyAoc2VydmVyX2Nvbm4sCisgICAgICBNQVhfSU5DT01JTkdfVU5JWF9GRFMpOworCisgIGlmIChmLT5sZWZ0X3NlcnZlcl9jb25uID09IE5VTEwpCisgICAgeworICAgICAgZi0+bGVmdF9zZXJ2ZXJfY29ubiA9IGRidXNfY29ubmVjdGlvbl9yZWYgKHNlcnZlcl9jb25uKTsKKworICAgICAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fYWRkX2ZpbHRlciAoc2VydmVyX2Nvbm4sCisgICAgICAgICAgbGVmdF9zZXJ2ZXJfbWVzc2FnZV9jYiwgZiwgTlVMTCkpCisgICAgICAgIG9vbSAoImFkZGluZyBmaWx0ZXIiKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBnX2Fzc2VydCAoZi0+cmlnaHRfc2VydmVyX2Nvbm4gPT0gTlVMTCk7CisgICAgICBmLT5yaWdodF9zZXJ2ZXJfY29ubiA9IGRidXNfY29ubmVjdGlvbl9yZWYgKHNlcnZlcl9jb25uKTsKKyAgICB9CisKKyAgdGVzdF9jb25uZWN0aW9uX3NldHVwIChmLT5jdHgsIHNlcnZlcl9jb25uKTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfY29ubmVjdCAoRml4dHVyZSAqZiwKKyAgICBnYm9vbGVhbiBzaG91bGRfc3VwcG9ydF9mZHMpCit7CisgIGNoYXIgKmFkZHJlc3M7CisKKyAgaWYgKGYtPnNraXApCisgICAgcmV0dXJuOworCisgIGYtPmluaXRpYWxfZmRzID0gX2RidXNfY2hlY2tfZmRsZWFrc19lbnRlciAoKTsKKworICBnX2Fzc2VydCAoZi0+bGVmdF9zZXJ2ZXJfY29ubiA9PSBOVUxMKTsKKyAgZ19hc3NlcnQgKGYtPnJpZ2h0X3NlcnZlcl9jb25uID09IE5VTEwpOworCisgIGFkZHJlc3MgPSBkYnVzX3NlcnZlcl9nZXRfYWRkcmVzcyAoZi0+c2VydmVyKTsKKyAgZ19hc3NlcnQgKGFkZHJlc3MgIT0gTlVMTCk7CisKKyAgZi0+bGVmdF9jbGllbnRfY29ubiA9IGRidXNfY29ubmVjdGlvbl9vcGVuX3ByaXZhdGUgKGFkZHJlc3MsICZmLT5lKTsKKyAgYXNzZXJ0X25vX2Vycm9yICgmZi0+ZSk7CisgIGdfYXNzZXJ0IChmLT5sZWZ0X2NsaWVudF9jb25uICE9IE5VTEwpOworICB0ZXN0X2Nvbm5lY3Rpb25fc2V0dXAgKGYtPmN0eCwgZi0+bGVmdF9jbGllbnRfY29ubik7CisKKyAgLyogVGhlIGxlZnQgY2xpZW50IGNvbm5lY3Rpb24gaXMgYWxsb3dlZCB0byBiZWhhdmUgYWJ1c2l2ZWx5LiAqLworICBkYnVzX2Nvbm5lY3Rpb25fc2V0X21heF9tZXNzYWdlX3VuaXhfZmRzIChmLT5sZWZ0X2NsaWVudF9jb25uLCAxMDAwKTsKKyAgZGJ1c19jb25uZWN0aW9uX3NldF9tYXhfcmVjZWl2ZWRfdW5peF9mZHMgKGYtPmxlZnRfY2xpZW50X2Nvbm4sIDEwMDAwMDApOworCisgIHdoaWxlIChmLT5sZWZ0X3NlcnZlcl9jb25uID09IE5VTEwpCisgICAgeworICAgICAgdGVzdF9wcm9ncmVzcyAoJy4nKTsKKyAgICAgIHRlc3RfbWFpbl9jb250ZXh0X2l0ZXJhdGUgKGYtPmN0eCwgVFJVRSk7CisgICAgfQorCisgIGYtPnJpZ2h0X2NsaWVudF9jb25uID0gZGJ1c19jb25uZWN0aW9uX29wZW5fcHJpdmF0ZSAoYWRkcmVzcywgJmYtPmUpOworICBhc3NlcnRfbm9fZXJyb3IgKCZmLT5lKTsKKyAgZ19hc3NlcnQgKGYtPnJpZ2h0X2NsaWVudF9jb25uICE9IE5VTEwpOworICB0ZXN0X2Nvbm5lY3Rpb25fc2V0dXAgKGYtPmN0eCwgZi0+cmlnaHRfY2xpZW50X2Nvbm4pOworCisgIGRidXNfZnJlZSAoYWRkcmVzcyk7CisKKyAgd2hpbGUgKGYtPnJpZ2h0X3NlcnZlcl9jb25uID09IE5VTEwpCisgICAgeworICAgICAgdGVzdF9wcm9ncmVzcyAoJy4nKTsKKyAgICAgIHRlc3RfbWFpbl9jb250ZXh0X2l0ZXJhdGUgKGYtPmN0eCwgVFJVRSk7CisgICAgfQorCisgIGlmICghZGJ1c19jb25uZWN0aW9uX2FkZF9maWx0ZXIgKGYtPnJpZ2h0X2NsaWVudF9jb25uLAorICAgICAgcmlnaHRfY2xpZW50X21lc3NhZ2VfY2IsIGYsIE5VTEwpKQorICAgIG9vbSAoImFkZGluZyBmaWx0ZXIiKTsKKworICAvKiBUaGUgcmlnaHQgY2xpZW50IGNvbm5lY3Rpb24gaXMgYWxsb3dlZCB0byBxdWV1ZSBhbGwgdGhlIG1lc3NhZ2VzLiAqLworICBkYnVzX2Nvbm5lY3Rpb25fc2V0X21heF9tZXNzYWdlX3VuaXhfZmRzIChmLT5yaWdodF9jbGllbnRfY29ubiwgMTAwMCk7CisgIGRidXNfY29ubmVjdGlvbl9zZXRfbWF4X3JlY2VpdmVkX3VuaXhfZmRzIChmLT5yaWdodF9jbGllbnRfY29ubiwgMTAwMDAwMCk7CisKKyAgd2hpbGUgKCFkYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2F1dGhlbnRpY2F0ZWQgKGYtPmxlZnRfY2xpZW50X2Nvbm4pIHx8CisgICAgICAhZGJ1c19jb25uZWN0aW9uX2dldF9pc19hdXRoZW50aWNhdGVkIChmLT5yaWdodF9jbGllbnRfY29ubikgfHwKKyAgICAgICFkYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2F1dGhlbnRpY2F0ZWQgKGYtPmxlZnRfc2VydmVyX2Nvbm4pIHx8CisgICAgICAhZGJ1c19jb25uZWN0aW9uX2dldF9pc19hdXRoZW50aWNhdGVkIChmLT5yaWdodF9zZXJ2ZXJfY29ubikpCisgICAgeworICAgICAgdGVzdF9wcm9ncmVzcyAoJyonKTsKKyAgICAgIHRlc3RfbWFpbl9jb250ZXh0X2l0ZXJhdGUgKGYtPmN0eCwgVFJVRSk7CisgICAgfQorCisgIGlmICghc2hvdWxkX3N1cHBvcnRfZmRzKQorICAgIHJldHVybjsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9jYW5fc2VuZF90eXBlIChmLT5sZWZ0X2NsaWVudF9jb25uLAorICAgICAgICBEQlVTX1RZUEVfVU5JWF9GRCkpCisgICAgZ19lcnJvciAoImxlZnQgY2xpZW50IGNvbm5lY3Rpb24gY2Fubm90IHNlbmQgVW5peCBmZHMiKTsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9jYW5fc2VuZF90eXBlIChmLT5sZWZ0X3NlcnZlcl9jb25uLAorICAgICAgICBEQlVTX1RZUEVfVU5JWF9GRCkpCisgICAgZ19lcnJvciAoImxlZnQgc2VydmVyIGNvbm5lY3Rpb24gY2Fubm90IHNlbmQgVW5peCBmZHMiKTsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9jYW5fc2VuZF90eXBlIChmLT5yaWdodF9jbGllbnRfY29ubiwKKyAgICAgICAgREJVU19UWVBFX1VOSVhfRkQpKQorICAgIGdfZXJyb3IgKCJyaWdodCBjbGllbnQgY29ubmVjdGlvbiBjYW5ub3Qgc2VuZCBVbml4IGZkcyIpOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX2Nhbl9zZW5kX3R5cGUgKGYtPnJpZ2h0X3NlcnZlcl9jb25uLAorICAgICAgICBEQlVTX1RZUEVfVU5JWF9GRCkpCisgICAgZ19lcnJvciAoInJpZ2h0IHNlcnZlciBjb25uZWN0aW9uIGNhbm5vdCBzZW5kIFVuaXggZmRzIik7Cit9CisKK3N0YXRpYyB2b2lkCitzZXR1cF9jb21tb24gKEZpeHR1cmUgKmYsCisgICAgY29uc3QgY2hhciAqYWRkcmVzcykKK3sKKyAgZi0+Y3R4ID0gdGVzdF9tYWluX2NvbnRleHRfZ2V0ICgpOworICBkYnVzX2Vycm9yX2luaXQgKCZmLT5lKTsKKyAgZ19xdWV1ZV9pbml0ICgmZi0+bWVzc2FnZXMpOworCisgIGlmICgoZ19zdHJfaGFzX3ByZWZpeCAoYWRkcmVzcywgInRjcDoiKSB8fAorICAgICAgIGdfc3RyX2hhc19wcmVmaXggKGFkZHJlc3MsICJub25jZS10Y3A6IikpICYmCisgICAgICAhdGVzdF9jaGVja190Y3Bfd29ya3MgKCkpCisgICAgeworICAgICAgZi0+c2tpcCA9IFRSVUU7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGYtPnNlcnZlciA9IGRidXNfc2VydmVyX2xpc3RlbiAoYWRkcmVzcywgJmYtPmUpOworICBhc3NlcnRfbm9fZXJyb3IgKCZmLT5lKTsKKyAgZ19hc3NlcnQgKGYtPnNlcnZlciAhPSBOVUxMKTsKKworICBkYnVzX3NlcnZlcl9zZXRfbmV3X2Nvbm5lY3Rpb25fZnVuY3Rpb24gKGYtPnNlcnZlciwKKyAgICAgIG5ld19jb25uX2NiLCBmLCBOVUxMKTsKKyAgdGVzdF9zZXJ2ZXJfc2V0dXAgKGYtPmN0eCwgZi0+c2VydmVyKTsKK30KKworc3RhdGljIHZvaWQKK3NldHVwX3Vuc3VwcG9ydGVkIChGaXh0dXJlICpmLAorICAgIGdjb25zdHBvaW50ZXIgZGF0YSBHX0dOVUNfVU5VU0VEKQoreworICBzZXR1cF9jb21tb24gKGYsICJ0Y3A6aG9zdD0xMjcuMC4wLjEiKTsKK30KKworc3RhdGljIHZvaWQKK3NldHVwIChGaXh0dXJlICpmLAorICAgIGdjb25zdHBvaW50ZXIgZGF0YSBHX0dOVUNfVU5VU0VEKQoreworI2lmZGVmIEhBVkVfVU5JWF9GRF9QQVNTSU5HCisgIC8qIFdlIGFzc3VtZSB0aGF0IGFueXRoaW5nIHdpdGggZmQtcGFzc2luZyBzdXBwb3J0cyB0aGUgdW5peDogdHJhbnNwb3J0ICovCisgIHNldHVwX2NvbW1vbiAoZiwgInVuaXg6dG1wZGlyPS90bXAiKTsKKworICBmLT5mZF9iZWZvcmUgPSBvcGVuICgiL2Rldi9udWxsIiwgT19SRE9OTFkpOworCisgIC8qIHRoaXMgc2hvdWxkIHN1Y2NlZWQgb24gYW55IHJlYXNvbmFibGUgVW5peCAqLworICBpZiAoZi0+ZmRfYmVmb3JlIDwgMCkKKyAgICBnX2Vycm9yICgiY2Fubm90IG9wZW4gL2Rldi9udWxsIGZvciByZWFkaW5nOiAlcyIsIGdfc3RyZXJyb3IgKGVycm5vKSk7CisKKyAgX2RidXNfZmRfc2V0X2Nsb3NlX29uX2V4ZWMgKGYtPmZkX2JlZm9yZSk7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfdW5zdXBwb3J0ZWQgKEZpeHR1cmUgKmYsCisgICAgZ2NvbnN0cG9pbnRlciBkYXRhKQoreworICBpZiAoZi0+c2tpcCkKKyAgICByZXR1cm47CisKKyAgdGVzdF9jb25uZWN0IChmLCBGQUxTRSk7CisKKyAgaWYgKGRidXNfY29ubmVjdGlvbl9jYW5fc2VuZF90eXBlIChmLT5sZWZ0X2NsaWVudF9jb25uLAorICAgICAgICBEQlVTX1RZUEVfVU5JWF9GRCkpCisgICAgZ19lcnJvciAoImxlZnQgY2xpZW50IGNvbm5lY3Rpb24gY2xhaW1zIGl0IGNhbiBzZW5kIFVuaXggZmRzIik7CisKKyAgaWYgKGRidXNfY29ubmVjdGlvbl9jYW5fc2VuZF90eXBlIChmLT5sZWZ0X3NlcnZlcl9jb25uLAorICAgICAgICBEQlVTX1RZUEVfVU5JWF9GRCkpCisgICAgZ19lcnJvciAoImxlZnQgc2VydmVyIGNvbm5lY3Rpb24gY2xhaW1zIGl0IGNhbiBzZW5kIFVuaXggZmRzIik7CisKKyAgaWYgKGRidXNfY29ubmVjdGlvbl9jYW5fc2VuZF90eXBlIChmLT5yaWdodF9jbGllbnRfY29ubiwKKyAgICAgICAgREJVU19UWVBFX1VOSVhfRkQpKQorICAgIGdfZXJyb3IgKCJyaWdodCBjbGllbnQgY29ubmVjdGlvbiBjbGFpbXMgaXQgY2FuIHNlbmQgVW5peCBmZHMiKTsKKworICBpZiAoZGJ1c19jb25uZWN0aW9uX2Nhbl9zZW5kX3R5cGUgKGYtPnJpZ2h0X3NlcnZlcl9jb25uLAorICAgICAgICBEQlVTX1RZUEVfVU5JWF9GRCkpCisgICAgZ19lcnJvciAoInJpZ2h0IHNlcnZlciBjb25uZWN0aW9uIGNsYWltcyBpdCBjYW4gc2VuZCBVbml4IGZkcyIpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9yZWxheSAoRml4dHVyZSAqZiwKKyAgICBnY29uc3Rwb2ludGVyIGRhdGEpCit7CisjaWZkZWYgSEFWRV9VTklYX0ZEX1BBU1NJTkcKKyAgLyogV2UgYXNzdW1lIHRoYXQgYW55IHBsYXRmb3JtIHdpdGggd29ya2luZyBmZC1wYXNzaW5nIGlzIFBPU0lYLAorICAgKiBhbmQgdGhlcmVmb3JlIGhhcyBvcGVuKCkgYW5kIGZzdGF0KCkgKi8KKyAgZGJ1c191aW50MzJfdCBzZXJpYWw7CisgIERCdXNNZXNzYWdlICpvdXRnb2luZywgKmluY29taW5nOworICBpbnQgZmRfYWZ0ZXI7CisgIHN0cnVjdCBzdGF0IHN0YXRfYmVmb3JlOworICBzdHJ1Y3Qgc3RhdCBzdGF0X2FmdGVyOworCisgIGlmIChmLT5za2lwKQorICAgIHJldHVybjsKKworICB0ZXN0X2Nvbm5lY3QgKGYsIFRSVUUpOworCisgIG91dGdvaW5nID0gZGJ1c19tZXNzYWdlX25ld19zaWduYWwgKCIvY29tL2V4YW1wbGUvSGVsbG8iLAorICAgICAgImNvbS5leGFtcGxlLkhlbGxvIiwgIkdyZWV0aW5nIik7CisgIGdfYXNzZXJ0IChvdXRnb2luZyAhPSBOVUxMKTsKKworICBpZiAoIWRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAob3V0Z29pbmcsCisgICAgICAgIERCVVNfVFlQRV9VTklYX0ZELCAmZi0+ZmRfYmVmb3JlLAorICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgb29tICgiYXBwZW5kaW5nIGZkIik7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoZi0+bGVmdF9jbGllbnRfY29ubiwgb3V0Z29pbmcsICZzZXJpYWwpKQorICAgIG9vbSAoInNlbmRpbmcgbWVzc2FnZSIpOworCisgIGRidXNfbWVzc2FnZV91bnJlZiAob3V0Z29pbmcpOworCisgIHdoaWxlIChnX3F1ZXVlX2dldF9sZW5ndGggKCZmLT5tZXNzYWdlcykgPCAxKQorICAgIHsKKyAgICAgIHRlc3RfcHJvZ3Jlc3MgKCcuJyk7CisgICAgICB0ZXN0X21haW5fY29udGV4dF9pdGVyYXRlIChmLT5jdHgsIFRSVUUpOworICAgIH0KKworICBnX2Fzc2VydF9jbXB1aW50IChnX3F1ZXVlX2dldF9sZW5ndGggKCZmLT5tZXNzYWdlcyksID09LCAxKTsKKworICBpbmNvbWluZyA9IGdfcXVldWVfcG9wX2hlYWQgKCZmLT5tZXNzYWdlcyk7CisKKyAgZ19hc3NlcnQgKGRidXNfbWVzc2FnZV9jb250YWluc191bml4X2ZkcyAoaW5jb21pbmcpKTsKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X2Rlc3RpbmF0aW9uIChpbmNvbWluZyksID09LCBOVUxMKTsKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X2Vycm9yX25hbWUgKGluY29taW5nKSwgPT0sIE5VTEwpOworICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfaW50ZXJmYWNlIChpbmNvbWluZyksID09LAorICAgICAgImNvbS5leGFtcGxlLkhlbGxvIik7CisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKGluY29taW5nKSwgPT0sICJHcmVldGluZyIpOworICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfc2VuZGVyIChpbmNvbWluZyksID09LCBOVUxMKTsKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X3NpZ25hdHVyZSAoaW5jb21pbmcpLCA9PSwKKyAgICAgIERCVVNfVFlQRV9VTklYX0ZEX0FTX1NUUklORyk7CisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9wYXRoIChpbmNvbWluZyksID09LCAiL2NvbS9leGFtcGxlL0hlbGxvIik7CisgIGdfYXNzZXJ0X2NtcHVpbnQgKGRidXNfbWVzc2FnZV9nZXRfc2VyaWFsIChpbmNvbWluZyksID09LCBzZXJpYWwpOworCisgIGlmIChkYnVzX3NldF9lcnJvcl9mcm9tX21lc3NhZ2UgKCZmLT5lLCBpbmNvbWluZykpCisgICAgZ19lcnJvciAoIiVzOiAlcyIsIGYtPmUubmFtZSwgZi0+ZS5tZXNzYWdlKTsKKyAgZWxzZSBpZiAoIWRidXNfbWVzc2FnZV9nZXRfYXJncyAoaW5jb21pbmcsCisgICAgICAgICZmLT5lLAorICAgICAgICBEQlVTX1RZUEVfVU5JWF9GRCwgJmZkX2FmdGVyLAorICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgZ19lcnJvciAoIiVzOiAlcyIsIGYtPmUubmFtZSwgZi0+ZS5tZXNzYWdlKTsKKworICBhc3NlcnRfbm9fZXJyb3IgKCZmLT5lKTsKKworICBpZiAoZnN0YXQgKGYtPmZkX2JlZm9yZSwgJnN0YXRfYmVmb3JlKSA8IDApCisgICAgZ19lcnJvciAoIiVzIiwgZ19zdHJlcnJvciAoZXJybm8pKTsKKworICBpZiAoZnN0YXQgKGZkX2FmdGVyLCAmc3RhdF9hZnRlcikgPCAwKQorICAgIGdfZXJyb3IgKCIlcyIsIGdfc3RyZXJyb3IgKGVycm5vKSk7CisKKyAgLyogdGhpcyBzZWVtcyBsaWtlIGVub3VnaCB0byBzYXkgIml0J3MgdGhlIHNhbWUgZmlsZSIgKi8KKyAgZ19hc3NlcnRfY21waW50IChzdGF0X2JlZm9yZS5zdF9kZXYsID09LCBzdGF0X2FmdGVyLnN0X2Rldik7CisgIGdfYXNzZXJ0X2NtcGludCAoc3RhdF9iZWZvcmUuc3RfaW5vLCA9PSwgc3RhdF9hZnRlci5zdF9pbm8pOworICBnX2Fzc2VydF9jbXBpbnQgKHN0YXRfYmVmb3JlLnN0X3JkZXYsID09LCBzdGF0X2FmdGVyLnN0X3JkZXYpOworCisgIGRidXNfbWVzc2FnZV91bnJlZiAoaW5jb21pbmcpOworCisgIGlmIChjbG9zZSAoZmRfYWZ0ZXIpIDwgMCkKKyAgICBnX2Vycm9yICgiJXMiLCBnX3N0cmVycm9yIChlcnJubykpOworCisgIGdfYXNzZXJ0IChkYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Nvbm5lY3RlZCAoZi0+cmlnaHRfY2xpZW50X2Nvbm4pKTsKKyAgZ19hc3NlcnQgKGRidXNfY29ubmVjdGlvbl9nZXRfaXNfY29ubmVjdGVkIChmLT5yaWdodF9zZXJ2ZXJfY29ubikpOworICBnX2Fzc2VydCAoZGJ1c19jb25uZWN0aW9uX2dldF9pc19jb25uZWN0ZWQgKGYtPmxlZnRfY2xpZW50X2Nvbm4pKTsKKyAgZ19hc3NlcnQgKGRidXNfY29ubmVjdGlvbl9nZXRfaXNfY29ubmVjdGVkIChmLT5sZWZ0X3NlcnZlcl9jb25uKSk7CisjZWxzZQorICBnX3Rlc3Rfc2tpcCAoImZkLXBhc3Npbmcgbm90IHN1cHBvcnRlZCBvbiB0aGlzIHBsYXRmb3JtIik7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfbGltaXQgKEZpeHR1cmUgKmYsCisgICAgZ2NvbnN0cG9pbnRlciBkYXRhKQoreworI2lmZGVmIEhBVkVfVU5JWF9GRF9QQVNTSU5HCisgIGRidXNfdWludDMyX3Qgc2VyaWFsOworICBEQnVzTWVzc2FnZSAqb3V0Z29pbmcsICppbmNvbWluZzsKKyAgaW50IGk7CisKKyAgaWYgKGYtPnNraXApCisgICAgcmV0dXJuOworCisgIHRlc3RfY29ubmVjdCAoZiwgVFJVRSk7CisKKyAgb3V0Z29pbmcgPSBkYnVzX21lc3NhZ2VfbmV3X3NpZ25hbCAoIi9jb20vZXhhbXBsZS9IZWxsbyIsCisgICAgICAiY29tLmV4YW1wbGUuSGVsbG8iLCAiR3JlZXRpbmciKTsKKyAgZ19hc3NlcnQgKG91dGdvaW5nICE9IE5VTEwpOworCisgIGZvciAoaSA9IDA7IGkgPCBNQVhfTUVTU0FHRV9VTklYX0ZEUzsgaSsrKQorICAgIHsKKyAgICAgIGlmICghZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChvdXRnb2luZywKKyAgICAgICAgICAgIERCVVNfVFlQRV9VTklYX0ZELCAmZi0+ZmRfYmVmb3JlLAorICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgICAgICBvb20gKCJhcHBlbmRpbmcgZmQiKTsKKyAgICB9CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoZi0+bGVmdF9jbGllbnRfY29ubiwgb3V0Z29pbmcsICZzZXJpYWwpKQorICAgIG9vbSAoInNlbmRpbmcgbWVzc2FnZSIpOworCisgIGRidXNfbWVzc2FnZV91bnJlZiAob3V0Z29pbmcpOworCisgIHdoaWxlIChnX3F1ZXVlX2dldF9sZW5ndGggKCZmLT5tZXNzYWdlcykgPCAxKQorICAgIHsKKyAgICAgIHRlc3RfcHJvZ3Jlc3MgKCcuJyk7CisgICAgICB0ZXN0X21haW5fY29udGV4dF9pdGVyYXRlIChmLT5jdHgsIFRSVUUpOworICAgIH0KKworICBnX2Fzc2VydF9jbXB1aW50IChnX3F1ZXVlX2dldF9sZW5ndGggKCZmLT5tZXNzYWdlcyksID09LCAxKTsKKworICBpbmNvbWluZyA9IGdfcXVldWVfcG9wX2hlYWQgKCZmLT5tZXNzYWdlcyk7CisKKyAgZ19hc3NlcnQgKGRidXNfbWVzc2FnZV9jb250YWluc191bml4X2ZkcyAoaW5jb21pbmcpKTsKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X2Rlc3RpbmF0aW9uIChpbmNvbWluZyksID09LCBOVUxMKTsKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X2Vycm9yX25hbWUgKGluY29taW5nKSwgPT0sIE5VTEwpOworICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfaW50ZXJmYWNlIChpbmNvbWluZyksID09LAorICAgICAgImNvbS5leGFtcGxlLkhlbGxvIik7CisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKGluY29taW5nKSwgPT0sICJHcmVldGluZyIpOworICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfc2VuZGVyIChpbmNvbWluZyksID09LCBOVUxMKTsKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X3BhdGggKGluY29taW5nKSwgPT0sICIvY29tL2V4YW1wbGUvSGVsbG8iKTsKKyAgZ19hc3NlcnRfY21wdWludCAoZGJ1c19tZXNzYWdlX2dldF9zZXJpYWwgKGluY29taW5nKSwgPT0sIHNlcmlhbCk7CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChpbmNvbWluZyk7CisKKyAgZ19hc3NlcnQgKGRidXNfY29ubmVjdGlvbl9nZXRfaXNfY29ubmVjdGVkIChmLT5yaWdodF9jbGllbnRfY29ubikpOworICBnX2Fzc2VydCAoZGJ1c19jb25uZWN0aW9uX2dldF9pc19jb25uZWN0ZWQgKGYtPnJpZ2h0X3NlcnZlcl9jb25uKSk7CisgIGdfYXNzZXJ0IChkYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Nvbm5lY3RlZCAoZi0+bGVmdF9jbGllbnRfY29ubikpOworICBnX2Fzc2VydCAoZGJ1c19jb25uZWN0aW9uX2dldF9pc19jb25uZWN0ZWQgKGYtPmxlZnRfc2VydmVyX2Nvbm4pKTsKKyNlbHNlCisgIGdfdGVzdF9za2lwICgiZmQtcGFzc2luZyBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgcGxhdGZvcm0iKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZAordGVzdF90b29fbWFueSAoRml4dHVyZSAqZiwKKyAgICBnY29uc3Rwb2ludGVyIGRhdGEpCit7CisjaWZkZWYgSEFWRV9VTklYX0ZEX1BBU1NJTkcKKyAgREJ1c01lc3NhZ2UgKm91dGdvaW5nOworICB1bnNpZ25lZCBpbnQgaTsKKworICBpZiAoZi0+c2tpcCkKKyAgICByZXR1cm47CisKKyAgdGVzdF9jb25uZWN0IChmLCBUUlVFKTsKKworICBvdXRnb2luZyA9IGRidXNfbWVzc2FnZV9uZXdfc2lnbmFsICgiL2NvbS9leGFtcGxlL0hlbGxvIiwKKyAgICAgICJjb20uZXhhbXBsZS5IZWxsbyIsICJHcmVldGluZyIpOworICBnX2Fzc2VydCAob3V0Z29pbmcgIT0gTlVMTCk7CisKKyAgZm9yIChpID0gMDsgaSA8IE1BWF9NRVNTQUdFX1VOSVhfRkRTICsgR1BPSU5URVJfVE9fVUlOVCAoZGF0YSk7IGkrKykKKyAgICB7CisgICAgICBpZiAoIWRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAob3V0Z29pbmcsCisgICAgICAgICAgICBEQlVTX1RZUEVfVU5JWF9GRCwgJmYtPmZkX2JlZm9yZSwKKyAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICAgICAgb29tICgiYXBwZW5kaW5nIGZkIik7CisgICAgfQorCisgIGlmICghZGJ1c19jb25uZWN0aW9uX3NlbmQgKGYtPmxlZnRfY2xpZW50X2Nvbm4sIG91dGdvaW5nLCBOVUxMKSkKKyAgICBvb20gKCJzZW5kaW5nIG1lc3NhZ2UiKTsKKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG91dGdvaW5nKTsKKworICAvKiBUaGUgc2VuZGVyIGlzIHVuY2VyZW1vbmlvdXNseSBkaXNjb25uZWN0ZWQuICovCisgIHdoaWxlIChkYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Nvbm5lY3RlZCAoZi0+bGVmdF9jbGllbnRfY29ubikgfHwKKyAgICAgIGRidXNfY29ubmVjdGlvbl9nZXRfaXNfY29ubmVjdGVkIChmLT5sZWZ0X3NlcnZlcl9jb25uKSkKKyAgICB7CisgICAgICB0ZXN0X3Byb2dyZXNzICgnLicpOworICAgICAgdGVzdF9tYWluX2NvbnRleHRfaXRlcmF0ZSAoZi0+Y3R4LCBUUlVFKTsKKyAgICB9CisKKyAgLyogVGhlIG1lc3NhZ2UgZGlkbid0IGdldCB0aHJvdWdoIHdpdGhvdXQgaXRzIGZkcy4gKi8KKyAgZ19hc3NlcnRfY21wdWludCAoZ19xdWV1ZV9nZXRfbGVuZ3RoICgmZi0+bWVzc2FnZXMpLCA9PSwgMCk7CisKKyAgLyogVGhlIGludGVuZGVkIHZpY3RpbSBpcyB1bmFmZmVjdGVkIGJ5IHRoZSBsZWZ0IGNvbm5lY3Rpb24ncworICAgKiBtaXNiZWhhdmlvdXIuICovCisgIGdfYXNzZXJ0IChkYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Nvbm5lY3RlZCAoZi0+cmlnaHRfY2xpZW50X2Nvbm4pKTsKKyAgZ19hc3NlcnQgKGRidXNfY29ubmVjdGlvbl9nZXRfaXNfY29ubmVjdGVkIChmLT5yaWdodF9zZXJ2ZXJfY29ubikpOworI2Vsc2UKKyAgZ190ZXN0X3NraXAgKCJmZC1wYXNzaW5nIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBwbGF0Zm9ybSIpOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3Rvb19tYW55X3NwbGl0IChGaXh0dXJlICpmLAorICAgIGdjb25zdHBvaW50ZXIgZGF0YSkKK3sKKyNpZmRlZiBIQVZFX1VOSVhfRkRfUEFTU0lORworICBEQnVzTWVzc2FnZSAqb3V0Z29pbmc7CisgIGludCBpOworICBEQnVzU29ja2V0IGxlZnRfY2xpZW50X3NvY2tldDsKKyAgY2hhciAqcGF5bG9hZDsKKyAgaW50IHBheWxvYWRfbGVuOworICBEQnVzU3RyaW5nIGJ1ZmZlcjsKKyAgaW50IGZkc1tUT09fTUFOWV9GRFNdOworICBpbnQgZG9uZTsKKyNpZmRlZiBIQVZFX0dFVFJMSU1JVAorICBzdHJ1Y3QgcmxpbWl0IGxpbTsKKyNlbmRpZgorCisgIGlmIChmLT5za2lwKQorICAgIHJldHVybjsKKworICAvKiBUaGlzIHRlc3QgZGVsaWJlcmF0ZWx5IHB1c2hlcyB1cCBhZ2FpbnN0IE9TIGxpbWl0cywgc28gc2tpcCBpdAorICAgKiBpZiB3ZSBkb24ndCBoYXZlIGVub3VnaCBmZHMuIDQgdGltZXMgdGhlIG1heGltdW0gcGVyIG1lc3NhZ2UKKyAgICogb3VnaHQgdG8gYmUgZW5vdWdoOiB0aGF0IHdpbGwgY292ZXIgdGhlIG1lc3NhZ2UsIHRoZSBkdXAnZCBmZHMKKyAgICogd2UgYWN0dWFsbHkgc2VuZCwgdGhlIGNvcHkgdGhhdCB3ZSBwb3RlbnRpYWxseSByZWNlaXZlLCBhbmQgc29tZQorICAgKiBzcGFyZSBjYXBhY2l0eSBmb3IgZXZlcnl0aGluZyBlbHNlLiAqLworI2lmZGVmIEhBVkVfR0VUUkxJTUlUCisgIGlmIChnZXRybGltaXQgKFJMSU1JVF9OT0ZJTEUsICZsaW0pID09IDApCisgICAgeworICAgICAgaWYgKGxpbS5ybGltX2N1ciAhPSBSTElNX0lORklOSVRZICYmCisgICAgICAgICAgbGltLnJsaW1fY3VyIDwgNCAqIFRPT19NQU5ZX0ZEUykKKyAgICAgICAgeworICAgICAgICAgIGdfdGVzdF9za2lwICgibm90IGVub3VnaCBSTElNSVRfTk9GSUxFIik7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyAgdGVzdF9jb25uZWN0IChmLCBUUlVFKTsKKworICBvdXRnb2luZyA9IGRidXNfbWVzc2FnZV9uZXdfc2lnbmFsICgiL2NvbS9leGFtcGxlL0hlbGxvIiwKKyAgICAgICJjb20uZXhhbXBsZS5IZWxsbyIsICJHcmVldGluZyIpOworICBnX2Fzc2VydCAob3V0Z29pbmcgIT0gTlVMTCk7CisKKyAgLyogVE9PX01BTllfRkRTIGZkcyBhcmUgZmFyIHRvbyBtYW55OiBpbiBwYXJ0aWN1bGFyLCBMaW51eCBkb2Vzbid0IGFsbG93CisgICAqIHNlbmRpbmcgdGhpcyBtYW55IGluIGEgc2luZ2xlIHNlbmRtc2coKS4gbGliZGJ1cyBuZXZlciBzcGxpdHMKKyAgICogYSBtZXNzYWdlIGJldHdlZW4gdHdvIHNlbmRtc2coKSBjYWxscyBpZiBpdCBjYW4gaGVscCBpdCwgYW5kCisgICAqIGluIHBhcnRpY3VsYXIgaXQgYWx3YXlzIHNlbmRzIGFsbCB0aGUgZmRzIHdpdGggdGhlIGZpcnN0IHNlbmRtc2coKSwKKyAgICogYnV0IG1hbGljaW91cyBzZW5kZXJzIG1pZ2h0IG5vdCBiZSBzbyBjb25zaWRlcmF0ZS4gKi8KKyAgZm9yIChpID0gMDsgaSA8IFRPT19NQU5ZX0ZEUzsgaSsrKQorICAgIHsKKyAgICAgIGlmICghZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChvdXRnb2luZywKKyAgICAgICAgICAgIERCVVNfVFlQRV9VTklYX0ZELCAmZi0+ZmRfYmVmb3JlLAorICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgICAgICBvb20gKCJhcHBlbmRpbmcgZmQiKTsKKyAgICB9CisKKyAgLyogVGhpcyBwcm9iYWJseSBzaG91bGRuJ3Qgd29yayBmb3IgbWVzc2FnZXMgd2l0aCBmZHMsIGJ1dCBpdCBkb2VzLAorICAgKiB3aGljaCBpcyBjb252ZW5pZW50IGZvciB0aGlzIHNvcnQgb2YgdHJpY2tlcnkuICovCisgIGlmICghZGJ1c19tZXNzYWdlX21hcnNoYWwgKG91dGdvaW5nLCAmcGF5bG9hZCwgJnBheWxvYWRfbGVuKSkKKyAgICBvb20gKCJtYXJzaGFsbGluZyBtZXNzYWdlIik7CisKKyAgX2RidXNfc3RyaW5nX2luaXRfY29uc3RfbGVuICgmYnVmZmVyLCBwYXlsb2FkLCBwYXlsb2FkX2xlbik7CisKKyAgZm9yIChpID0gMDsgaSA8IFRPT19NQU5ZX0ZEUzsgaSsrKQorICAgIHsKKyAgICAgIGZkc1tpXSA9IGR1cCAoZi0+ZmRfYmVmb3JlKTsKKworICAgICAgaWYgKGZkc1tpXSA8IDApCisgICAgICAgIGdfZXJyb3IgKCJjb3VsZCBub3QgZHVwIGZkOiAlcyIsIGdfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgfQorCisgIC8qIFRoaXMgaXMgYmxhdGFudCBjaGVhdGluZywgYW5kIHRoZSBBUEkgZG9jdW1lbnRhdGlvbiBzcGVjaWZpY2FsbHkKKyAgICogdGVsbHMgeW91IG5vdCB1c2UgdGhpcyBmdW5jdGlvbiBpbiB0aGlzIHdheS4gTmV2ZXIgZG8gdGhpcworICAgKiBpbiBhcHBsaWNhdGlvbiBjb2RlLiAqLworICBpZiAoIWRidXNfY29ubmVjdGlvbl9nZXRfc29ja2V0IChmLT5sZWZ0X2NsaWVudF9jb25uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVmdF9jbGllbnRfc29ja2V0LmZkKSkKKyAgICBnX2Vycm9yICgiJ3VuaXg6JyBEQnVzQ29ubmVjdGlvbiBzaG91bGQgaGF2ZSBoYWQgYSBzb2NrZXQiKTsKKworICAvKiBKdXN0IHRvIGJlIHN1cmUgdGhhdCB3ZSdyZSBhdCBhIG1lc3NhZ2UgYm91bmRhcnkuICovCisgIGRidXNfY29ubmVjdGlvbl9mbHVzaCAoZi0+bGVmdF9jbGllbnRfY29ubik7CisKKyAgLyogV2UgaGF2ZSB0b28gbWFueSBmZHMgZm9yIG9uZSBzZW5kbXNnKCksIHNvIHNlbmQgdGhlIGZpcnN0IGhhbGYKKyAgICogKHJvdW5kaW5nIGRvd24gaWYgb2RkKSB3aXRoIHRoZSBmaXJzdCBieXRlLi4uICovCisgIGRvbmUgPSBfZGJ1c193cml0ZV9zb2NrZXRfd2l0aF91bml4X2ZkcyAobGVmdF9jbGllbnRfc29ja2V0LCAmYnVmZmVyLCAwLCAxLAorICAgICAgICAmZmRzWzBdLCBUT09fTUFOWV9GRFMgLyAyKTsKKworICBpZiAoZG9uZSA8IDApCisgICAgZ19lcnJvciAoImNvdWxkIG5vdCBzZW5kIGZpcnN0IGJ5dGUgYW5kIGZpcnN0IGJhdGNoIG9mIGZkczogJXMiLAorICAgICAgICBnX3N0cmVycm9yIChlcnJubykpOworCisgIC8qIC4uLiBhbmQgdGhlIHNlY29uZCBoYWxmIChyb3VuZGluZyB1cCBpZiBvZGQpIHdpdGggdGhlIHJlc3Qgb2YKKyAgICogdGhlIG1lc3NhZ2UgKi8KKyAgZG9uZSA9IF9kYnVzX3dyaXRlX3NvY2tldF93aXRoX3VuaXhfZmRzIChsZWZ0X2NsaWVudF9zb2NrZXQsICZidWZmZXIsIDEsCisgICAgICAgIHBheWxvYWRfbGVuIC0gMSwgJmZkc1tUT09fTUFOWV9GRFMgLyAyXSwKKyAgICAgICAgVE9PX01BTllfRkRTIC0gKFRPT19NQU5ZX0ZEUyAvIDIpKTsKKworICBpZiAoZG9uZSA8IDApCisgICAgeworICAgICAgZ19lcnJvciAoImNvdWxkIG5vdCBzZW5kIHJlc3Qgb2YgbWVzc2FnZSBhbmQgcmVzdCBvZiBmZHM6ICVzIiwKKyAgICAgICAgICBnX3N0cmVycm9yIChlcnJubykpOworICAgIH0KKyAgZWxzZSBpZiAoZG9uZSA8IHBheWxvYWRfbGVuIC0gMSkKKyAgICB7CisgICAgICAvKiBGb3Igc2ltcGxpY2l0eSwgYXNzdW1lIHRoZSBzb2NrZXQgYnVmZmVyIGlzIGJpZyBlbm91Z2ggZm9yIHRoZQorICAgICAgICogd2hvbGUgbWVzc2FnZSwgd2hpY2ggc2hvdWxkIGJlIDwgMiBLaUIuIElmIHRoaXMgZmFpbHMgb24gc29tZQorICAgICAgICogT1MsIHJlZG8gdGhpcyB0ZXN0IGNvZGUgdG8gdXNlIGEgcHJvcGVyIGxvb3AgbGlrZSB0aGUgcmVhbAorICAgICAgICogbGliZGJ1cyBkb2VzLiAqLworICAgICAgZ19lcnJvciAoInNob3J0IHdyaXRlIGluIHNlbmRtc2coKSwgZml4IHRoaXMgdGVzdDogJWQvJWQiLAorICAgICAgICAgIGRvbmUsIHBheWxvYWRfbGVuIC0gMSk7CisgICAgfQorCisgIGRidXNfZnJlZSAocGF5bG9hZCk7CisKKyAgZm9yIChpID0gMDsgaSA8IFRPT19NQU5ZX0ZEUzsgaSsrKQorICAgIGNsb3NlIChmZHNbaV0pOworCisgIGRidXNfbWVzc2FnZV91bnJlZiAob3V0Z29pbmcpOworCisgIC8qIFRoZSBzZW5kZXIgaXMgdW5jZXJlbW9uaW91c2x5IGRpc2Nvbm5lY3RlZC4gKi8KKyAgd2hpbGUgKGRidXNfY29ubmVjdGlvbl9nZXRfaXNfY29ubmVjdGVkIChmLT5sZWZ0X2NsaWVudF9jb25uKSB8fAorICAgICAgZGJ1c19jb25uZWN0aW9uX2dldF9pc19jb25uZWN0ZWQgKGYtPmxlZnRfc2VydmVyX2Nvbm4pKQorICAgIHsKKyAgICAgIHRlc3RfcHJvZ3Jlc3MgKCcuJyk7CisgICAgICB0ZXN0X21haW5fY29udGV4dF9pdGVyYXRlIChmLT5jdHgsIFRSVUUpOworICAgIH0KKworICAvKiBUaGUgbWVzc2FnZSBkaWRuJ3QgZ2V0IHRocm91Z2ggd2l0aG91dCBpdHMgZmRzLiAqLworICBnX2Fzc2VydF9jbXB1aW50IChnX3F1ZXVlX2dldF9sZW5ndGggKCZmLT5tZXNzYWdlcyksID09LCAwKTsKKworICAvKiBUaGUgaW50ZW5kZWQgdmljdGltIGlzIHVuYWZmZWN0ZWQgYnkgdGhlIGxlZnQgY29ubmVjdGlvbidzCisgICAqIG1pc2JlaGF2aW91ci4gKi8KKyAgZ19hc3NlcnQgKGRidXNfY29ubmVjdGlvbl9nZXRfaXNfY29ubmVjdGVkIChmLT5yaWdodF9jbGllbnRfY29ubikpOworICBnX2Fzc2VydCAoZGJ1c19jb25uZWN0aW9uX2dldF9pc19jb25uZWN0ZWQgKGYtPnJpZ2h0X3NlcnZlcl9jb25uKSk7CisjZWxzZQorICBnX3Rlc3Rfc2tpcCAoImZkLXBhc3Npbmcgbm90IHN1cHBvcnRlZCBvbiB0aGlzIHBsYXRmb3JtIik7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfZmxvb2QgKEZpeHR1cmUgKmYsCisgICAgZ2NvbnN0cG9pbnRlciBkYXRhKQoreworI2lmZGVmIEhBVkVfVU5JWF9GRF9QQVNTSU5HCisgIHVuc2lnbmVkIGludCBpLCBqOworICBEQnVzTWVzc2FnZSAqb3V0Z29pbmdbU09NRV9NRVNTQUdFU107CisgIGRidXNfdWludDMyX3Qgc2VyaWFsOworCisgIGlmIChmLT5za2lwKQorICAgIHJldHVybjsKKworICB0ZXN0X2Nvbm5lY3QgKGYsIFRSVUUpOworCisgIGZvciAoaiA9IDA7IGogPCBTT01FX01FU1NBR0VTOyBqKyspCisgICAgeworICAgICAgb3V0Z29pbmdbal0gPSBkYnVzX21lc3NhZ2VfbmV3X3NpZ25hbCAoIi9jb20vZXhhbXBsZS9IZWxsbyIsCisgICAgICAgICAgImNvbS5leGFtcGxlLkhlbGxvIiwgIkdyZWV0aW5nIik7CisgICAgICBnX2Fzc2VydCAob3V0Z29pbmdbal0gIT0gTlVMTCk7CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBHUE9JTlRFUl9UT19VSU5UIChkYXRhKTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKG91dGdvaW5nW2pdLAorICAgICAgICAgICAgICAgIERCVVNfVFlQRV9VTklYX0ZELCAmZi0+ZmRfYmVmb3JlLAorICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICAgICAgICAgIG9vbSAoImFwcGVuZGluZyBmZCIpOworICAgICAgICB9CisgICAgfQorCisgIC8qIFRoaXMgaXMgaW4gaXRzIG93biBsb29wIHNvIHdlIGRvIGl0IGFzIGZhc3QgYXMgcG9zc2libGUgKi8KKyAgZm9yIChqID0gMDsgaiA8IFNPTUVfTUVTU0FHRVM7IGorKykKKyAgICB7CisgICAgICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZW5kIChmLT5sZWZ0X2NsaWVudF9jb25uLCBvdXRnb2luZ1tqXSwgJnNlcmlhbCkpCisgICAgICAgIG9vbSAoInNlbmRpbmcgbWVzc2FnZSIpOworICAgIH0KKworICBmb3IgKGogPSAwOyBqIDwgU09NRV9NRVNTQUdFUzsgaisrKQorICAgIHsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAob3V0Z29pbmdbal0pOworICAgIH0KKworICB3aGlsZSAoZ19xdWV1ZV9nZXRfbGVuZ3RoICgmZi0+bWVzc2FnZXMpIDwgU09NRV9NRVNTQUdFUykKKyAgICB7CisgICAgICB0ZXN0X3Byb2dyZXNzICgnLicpOworICAgICAgdGVzdF9tYWluX2NvbnRleHRfaXRlcmF0ZSAoZi0+Y3R4LCBUUlVFKTsKKyAgICB9CisKKyAgZ19hc3NlcnRfY21wdWludCAoZ19xdWV1ZV9nZXRfbGVuZ3RoICgmZi0+bWVzc2FnZXMpLCA9PSwgU09NRV9NRVNTQUdFUyk7CisKKyAgZm9yIChqID0gMDsgaiA8IFNPTUVfTUVTU0FHRVM7IGorKykKKyAgICB7CisgICAgICBEQnVzTWVzc2FnZSAqaW5jb21pbmc7CisKKyAgICAgIGluY29taW5nID0gZ19xdWV1ZV9wb3BfaGVhZCAoJmYtPm1lc3NhZ2VzKTsKKworICAgICAgZ19hc3NlcnQgKGRidXNfbWVzc2FnZV9jb250YWluc191bml4X2ZkcyAoaW5jb21pbmcpKTsKKyAgICAgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9kZXN0aW5hdGlvbiAoaW5jb21pbmcpLCA9PSwgTlVMTCk7CisgICAgICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfZXJyb3JfbmFtZSAoaW5jb21pbmcpLCA9PSwgTlVMTCk7CisgICAgICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfaW50ZXJmYWNlIChpbmNvbWluZyksID09LAorICAgICAgICAgICJjb20uZXhhbXBsZS5IZWxsbyIpOworICAgICAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X21lbWJlciAoaW5jb21pbmcpLCA9PSwgIkdyZWV0aW5nIik7CisgICAgICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfc2VuZGVyIChpbmNvbWluZyksID09LCBOVUxMKTsKKyAgICAgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9wYXRoIChpbmNvbWluZyksID09LCAiL2NvbS9leGFtcGxlL0hlbGxvIik7CisKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAoaW5jb21pbmcpOworICAgIH0KKworICBnX2Fzc2VydCAoZGJ1c19jb25uZWN0aW9uX2dldF9pc19jb25uZWN0ZWQgKGYtPnJpZ2h0X2NsaWVudF9jb25uKSk7CisgIGdfYXNzZXJ0IChkYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Nvbm5lY3RlZCAoZi0+cmlnaHRfc2VydmVyX2Nvbm4pKTsKKyAgZ19hc3NlcnQgKGRidXNfY29ubmVjdGlvbl9nZXRfaXNfY29ubmVjdGVkIChmLT5sZWZ0X2NsaWVudF9jb25uKSk7CisgIGdfYXNzZXJ0IChkYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Nvbm5lY3RlZCAoZi0+bGVmdF9zZXJ2ZXJfY29ubikpOworI2Vsc2UKKyAgZ190ZXN0X3NraXAgKCJmZC1wYXNzaW5nIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBwbGF0Zm9ybSIpOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X29kZF9saW1pdCAoRml4dHVyZSAqZiwKKyAgICBnY29uc3Rwb2ludGVyIGRhdGEpCit7CisjaWZkZWYgSEFWRV9VTklYX0ZEX1BBU1NJTkcKKyAgREJ1c01lc3NhZ2UgKm91dGdvaW5nOworICBpbnQgaTsKKworICBpZiAoZi0+c2tpcCkKKyAgICByZXR1cm47CisKKyAgdGVzdF9jb25uZWN0IChmLCBUUlVFKTsKKyAgZGJ1c19jb25uZWN0aW9uX3NldF9tYXhfbWVzc2FnZV91bml4X2ZkcyAoZi0+bGVmdF9zZXJ2ZXJfY29ubiwgNyk7CisgIGRidXNfY29ubmVjdGlvbl9zZXRfbWF4X21lc3NhZ2VfdW5peF9mZHMgKGYtPnJpZ2h0X3NlcnZlcl9jb25uLCA3KTsKKworICBvdXRnb2luZyA9IGRidXNfbWVzc2FnZV9uZXdfc2lnbmFsICgiL2NvbS9leGFtcGxlL0hlbGxvIiwKKyAgICAgICJjb20uZXhhbXBsZS5IZWxsbyIsICJHcmVldGluZyIpOworICBnX2Fzc2VydCAob3V0Z29pbmcgIT0gTlVMTCk7CisKKyAgZm9yIChpID0gMDsgaSA8IDcgKyBHUE9JTlRFUl9UT19JTlQgKGRhdGEpOyBpKyspCisgICAgeworICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKG91dGdvaW5nLAorICAgICAgICAgICAgREJVU19UWVBFX1VOSVhfRkQsICZmLT5mZF9iZWZvcmUsCisgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgICAgIG9vbSAoImFwcGVuZGluZyBmZCIpOworICAgIH0KKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZW5kIChmLT5sZWZ0X2NsaWVudF9jb25uLCBvdXRnb2luZywgTlVMTCkpCisgICAgb29tICgic2VuZGluZyBtZXNzYWdlIik7CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChvdXRnb2luZyk7CisKKyAgaWYgKEdQT0lOVEVSX1RPX0lOVCAoZGF0YSkgPiAwKQorICAgIHsKKyAgICAgIC8qIFRoZSBzZW5kZXIgaXMgdW5jZXJlbW9uaW91c2x5IGRpc2Nvbm5lY3RlZC4gKi8KKyAgICAgIHdoaWxlIChkYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Nvbm5lY3RlZCAoZi0+bGVmdF9jbGllbnRfY29ubikgfHwKKyAgICAgICAgICBkYnVzX2Nvbm5lY3Rpb25fZ2V0X2lzX2Nvbm5lY3RlZCAoZi0+bGVmdF9zZXJ2ZXJfY29ubikpCisgICAgICAgIHsKKyAgICAgICAgICB0ZXN0X3Byb2dyZXNzICgnLicpOworICAgICAgICAgIHRlc3RfbWFpbl9jb250ZXh0X2l0ZXJhdGUgKGYtPmN0eCwgVFJVRSk7CisgICAgICAgIH0KKworICAgICAgLyogVGhlIG1lc3NhZ2UgZGlkbid0IGdldCB0aHJvdWdoIHdpdGhvdXQgaXRzIGZkcy4gKi8KKyAgICAgIGdfYXNzZXJ0X2NtcHVpbnQgKGdfcXVldWVfZ2V0X2xlbmd0aCAoJmYtPm1lc3NhZ2VzKSwgPT0sIDApOworCisgICAgICAvKiBUaGUgaW50ZW5kZWQgdmljdGltIGlzIHVuYWZmZWN0ZWQgYnkgdGhlIGxlZnQgY29ubmVjdGlvbidzCisgICAgICAgKiBtaXNiZWhhdmlvdXIuICovCisgICAgICBnX2Fzc2VydCAoZGJ1c19jb25uZWN0aW9uX2dldF9pc19jb25uZWN0ZWQgKGYtPnJpZ2h0X2NsaWVudF9jb25uKSk7CisgICAgICBnX2Fzc2VydCAoZGJ1c19jb25uZWN0aW9uX2dldF9pc19jb25uZWN0ZWQgKGYtPnJpZ2h0X3NlcnZlcl9jb25uKSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgREJ1c01lc3NhZ2UgKmluY29taW5nOworCisgICAgICAvKiBXZSdyZSBhdCBvciB1bmRlciB0aGUgbGltaXQuIFRoZSBtZXNzYWdlIGdldHMgdGhyb3VnaCBpbnRhY3QuICovCisgICAgICB3aGlsZSAoZ19xdWV1ZV9nZXRfbGVuZ3RoICgmZi0+bWVzc2FnZXMpIDwgMSkKKyAgICAgICAgeworICAgICAgICAgIHRlc3RfcHJvZ3Jlc3MgKCcuJyk7CisgICAgICAgICAgdGVzdF9tYWluX2NvbnRleHRfaXRlcmF0ZSAoZi0+Y3R4LCBUUlVFKTsKKyAgICAgICAgfQorCisgICAgICBnX2Fzc2VydF9jbXB1aW50IChnX3F1ZXVlX2dldF9sZW5ndGggKCZmLT5tZXNzYWdlcyksID09LCAxKTsKKworICAgICAgaW5jb21pbmcgPSBnX3F1ZXVlX3BvcF9oZWFkICgmZi0+bWVzc2FnZXMpOworCisgICAgICBnX2Fzc2VydCAoZGJ1c19tZXNzYWdlX2NvbnRhaW5zX3VuaXhfZmRzIChpbmNvbWluZykpOworICAgICAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X2Rlc3RpbmF0aW9uIChpbmNvbWluZyksID09LCBOVUxMKTsKKyAgICAgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9lcnJvcl9uYW1lIChpbmNvbWluZyksID09LCBOVUxMKTsKKyAgICAgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKGluY29taW5nKSwgPT0sCisgICAgICAgICAgImNvbS5leGFtcGxlLkhlbGxvIik7CisgICAgICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChpbmNvbWluZyksID09LCAiR3JlZXRpbmciKTsKKyAgICAgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9zZW5kZXIgKGluY29taW5nKSwgPT0sIE5VTEwpOworICAgICAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X3BhdGggKGluY29taW5nKSwgPT0sCisgICAgICAgICAgIi9jb20vZXhhbXBsZS9IZWxsbyIpOworCisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKGluY29taW5nKTsKKworICAgICAgZ19hc3NlcnQgKGRidXNfY29ubmVjdGlvbl9nZXRfaXNfY29ubmVjdGVkIChmLT5yaWdodF9jbGllbnRfY29ubikpOworICAgICAgZ19hc3NlcnQgKGRidXNfY29ubmVjdGlvbl9nZXRfaXNfY29ubmVjdGVkIChmLT5yaWdodF9zZXJ2ZXJfY29ubikpOworICAgICAgZ19hc3NlcnQgKGRidXNfY29ubmVjdGlvbl9nZXRfaXNfY29ubmVjdGVkIChmLT5sZWZ0X2NsaWVudF9jb25uKSk7CisgICAgICBnX2Fzc2VydCAoZGJ1c19jb25uZWN0aW9uX2dldF9pc19jb25uZWN0ZWQgKGYtPmxlZnRfc2VydmVyX2Nvbm4pKTsKKyAgICB9CisjZWxzZQorICBnX3Rlc3Rfc2tpcCAoImZkLXBhc3Npbmcgbm90IHN1cHBvcnRlZCBvbiB0aGlzIHBsYXRmb3JtIik7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQKK3RlYXJkb3duIChGaXh0dXJlICpmLAorICAgIGdjb25zdHBvaW50ZXIgZGF0YSBHX0dOVUNfVU5VU0VEKQoreworICBpZiAoZi0+bGVmdF9jbGllbnRfY29ubiAhPSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfY29ubmVjdGlvbl9jbG9zZSAoZi0+bGVmdF9jbGllbnRfY29ubik7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGYtPmxlZnRfY2xpZW50X2Nvbm4pOworICAgICAgZi0+bGVmdF9jbGllbnRfY29ubiA9IE5VTEw7CisgICAgfQorCisgIGlmIChmLT5yaWdodF9jbGllbnRfY29ubiAhPSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfY29ubmVjdGlvbl9jbG9zZSAoZi0+cmlnaHRfY2xpZW50X2Nvbm4pOworICAgICAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChmLT5yaWdodF9jbGllbnRfY29ubik7CisgICAgICBmLT5yaWdodF9jbGllbnRfY29ubiA9IE5VTEw7CisgICAgfQorCisgIGlmIChmLT5sZWZ0X3NlcnZlcl9jb25uICE9IE5VTEwpCisgICAgeworICAgICAgZGJ1c19jb25uZWN0aW9uX2Nsb3NlIChmLT5sZWZ0X3NlcnZlcl9jb25uKTsKKyAgICAgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoZi0+bGVmdF9zZXJ2ZXJfY29ubik7CisgICAgICBmLT5sZWZ0X3NlcnZlcl9jb25uID0gTlVMTDsKKyAgICB9CisKKyAgaWYgKGYtPnJpZ2h0X3NlcnZlcl9jb25uICE9IE5VTEwpCisgICAgeworICAgICAgZGJ1c19jb25uZWN0aW9uX2Nsb3NlIChmLT5yaWdodF9zZXJ2ZXJfY29ubik7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGYtPnJpZ2h0X3NlcnZlcl9jb25uKTsKKyAgICAgIGYtPnJpZ2h0X3NlcnZlcl9jb25uID0gTlVMTDsKKyAgICB9CisKKyAgaWYgKGYtPnNlcnZlciAhPSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfc2VydmVyX2Rpc2Nvbm5lY3QgKGYtPnNlcnZlcik7CisgICAgICBkYnVzX3NlcnZlcl91bnJlZiAoZi0+c2VydmVyKTsKKyAgICAgIGYtPnNlcnZlciA9IE5VTEw7CisgICAgfQorCisgIGlmIChmLT5jdHggIT0gTlVMTCkKKyAgICB0ZXN0X21haW5fY29udGV4dF91bnJlZiAoZi0+Y3R4KTsKKworI2lmZGVmIEhBVkVfVU5JWF9GRF9QQVNTSU5HCisgIGlmIChmLT5mZF9iZWZvcmUgPj0gMCAmJiBjbG9zZSAoZi0+ZmRfYmVmb3JlKSA8IDApCisgICAgZ19lcnJvciAoIiVzIiwgZ19zdHJlcnJvciAoZXJybm8pKTsKKyNlbmRpZgorCisgIGlmIChmLT5pbml0aWFsX2ZkcyAhPSBOVUxMKQorICAgIF9kYnVzX2NoZWNrX2ZkbGVha3NfbGVhdmUgKGYtPmluaXRpYWxfZmRzKTsKK30KKworaW50CittYWluIChpbnQgYXJnYywKKyAgICBjaGFyICoqYXJndikKK3sKKyAgdGVzdF9pbml0ICgmYXJnYywgJmFyZ3YpOworCisjaWZkZWYgSEFWRV9HRVRSTElNSVQKKyAgICB7CisgICAgICBzdHJ1Y3QgcmxpbWl0IGxpbTsKKworICAgICAgaWYgKGdldHJsaW1pdCAoUkxJTUlUX05PRklMRSwgJmxpbSkgPCAwKQorICAgICAgICBnX2Vycm9yICgiRmFpbGVkIHRvIGdldCBSTElNSVRfTk9GSUxFIGxpbWl0OiAlcyIsIGdfc3RyZXJyb3IgKGVycm5vKSk7CisKKyAgICAgIGlmIChsaW0ucmxpbV9jdXIgIT0gUkxJTV9JTkZJTklUWSAmJgorICAgICAgICAgIC8qIG9ubHkgcnVuIGlmIHdlIGhhdmUgYSBmYWlybHkgZ2VuZXJvdXMgbWFyZ2luIG9mIGVycm9yCisgICAgICAgICAgICogZm9yIHN0ZG91dCwgc3RkZXJyLCBkdXBsaWNhdGVzLCB0aGUgRC1CdXMgY29ubmVjdGlvbiwgZXRjLiAqLworICAgICAgICAgIGxpbS5ybGltX2N1ciA8IDIgKiBNQVhfTUVTU0FHRV9VTklYX0ZEUyAqIFNPTUVfTUVTU0FHRVMpCisgICAgICAgIHsKKyAgICAgICAgICBnX21lc3NhZ2UgKCJub3QgZW5vdWdoIFJMSU1JVF9OT0ZJTEUgdG8gcnVuIHRoaXMgdGVzdCIpOworICAgICAgICAgIC8qIEF1dG90b29scyBleGl0IGNvZGUgZm9yICJhbGwgc2tpcHBlZCIgKi8KKyAgICAgICAgICByZXR1cm4gNzc7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworICBnX3Rlc3RfYWRkICgiL3Vuc3VwcG9ydGVkIiwgRml4dHVyZSwgTlVMTCwgc2V0dXBfdW5zdXBwb3J0ZWQsCisgICAgICB0ZXN0X3Vuc3VwcG9ydGVkLCB0ZWFyZG93bik7CisKKyAgZ190ZXN0X2FkZCAoIi9yZWxheSIsIEZpeHR1cmUsIE5VTEwsIHNldHVwLAorICAgICAgdGVzdF9yZWxheSwgdGVhcmRvd24pOworICBnX3Rlc3RfYWRkICgiL2xpbWl0IiwgRml4dHVyZSwgTlVMTCwgc2V0dXAsCisgICAgICB0ZXN0X2xpbWl0LCB0ZWFyZG93bik7CisKKyAgZ190ZXN0X2FkZCAoIi90b28tbWFueS9wbHVzMSIsIEZpeHR1cmUsIEdVSU5UX1RPX1BPSU5URVIgKDEpLCBzZXR1cCwKKyAgICAgIHRlc3RfdG9vX21hbnksIHRlYXJkb3duKTsKKyAgZ190ZXN0X2FkZCAoIi90b28tbWFueS9wbHVzMiIsIEZpeHR1cmUsIEdVSU5UX1RPX1BPSU5URVIgKDIpLCBzZXR1cCwKKyAgICAgIHRlc3RfdG9vX21hbnksIHRlYXJkb3duKTsKKyAgZ190ZXN0X2FkZCAoIi90b28tbWFueS9wbHVzMTciLCBGaXh0dXJlLCBHVUlOVF9UT19QT0lOVEVSICgxNyksIHNldHVwLAorICAgICAgdGVzdF90b29fbWFueSwgdGVhcmRvd24pOworCisgIGdfdGVzdF9hZGQgKCIvdG9vLW1hbnkvc3BsaXQiLCBGaXh0dXJlLCBOVUxMLCBzZXR1cCwKKyAgICAgIHRlc3RfdG9vX21hbnlfc3BsaXQsIHRlYXJkb3duKTsKKworICBnX3Rlc3RfYWRkICgiL2Zsb29kLzEiLCBGaXh0dXJlLCBHVUlOVF9UT19QT0lOVEVSICgxKSwKKyAgICAgIHNldHVwLCB0ZXN0X2Zsb29kLCB0ZWFyZG93bik7CisjaWYgTUFYX01FU1NBR0VfVU5JWF9GRFMgPj0gMgorICBnX3Rlc3RfYWRkICgiL2Zsb29kL2hhbGYtbGltaXQiLCBGaXh0dXJlLAorICAgICAgR1VJTlRfVE9fUE9JTlRFUiAoTUFYX01FU1NBR0VfVU5JWF9GRFMgLyAyKSwKKyAgICAgIHNldHVwLCB0ZXN0X2Zsb29kLCB0ZWFyZG93bik7CisjZW5kaWYKKyNpZiBNQVhfTUVTU0FHRV9VTklYX0ZEUyA+PSA0CisgIGdfdGVzdF9hZGQgKCIvZmxvb2Qvb3Zlci1oYWxmLWxpbWl0IiwgRml4dHVyZSwKKyAgICAgIEdVSU5UX1RPX1BPSU5URVIgKDMgKiBNQVhfTUVTU0FHRV9VTklYX0ZEUyAvIDQpLAorICAgICAgc2V0dXAsIHRlc3RfZmxvb2QsIHRlYXJkb3duKTsKKyNlbmRpZgorICBnX3Rlc3RfYWRkICgiL2Zsb29kL2xpbWl0IiwgRml4dHVyZSwKKyAgICAgIEdVSU5UX1RPX1BPSU5URVIgKE1BWF9NRVNTQUdFX1VOSVhfRkRTKSwgc2V0dXAsIHRlc3RfZmxvb2QsIHRlYXJkb3duKTsKKworICBnX3Rlc3RfYWRkICgiL29kZC1saW1pdC9taW51czEiLCBGaXh0dXJlLCBHSU5UX1RPX1BPSU5URVIgKC0xKSwgc2V0dXAsCisgICAgICB0ZXN0X29kZF9saW1pdCwgdGVhcmRvd24pOworICBnX3Rlc3RfYWRkICgiL29kZC1saW1pdC9hdCIsIEZpeHR1cmUsIEdJTlRfVE9fUE9JTlRFUiAoMCksIHNldHVwLAorICAgICAgdGVzdF9vZGRfbGltaXQsIHRlYXJkb3duKTsKKyAgZ190ZXN0X2FkZCAoIi9vZGQtbGltaXQvcGx1czEiLCBGaXh0dXJlLCBHSU5UX1RPX1BPSU5URVIgKCsxKSwgc2V0dXAsCisgICAgICB0ZXN0X29kZF9saW1pdCwgdGVhcmRvd24pOworICBnX3Rlc3RfYWRkICgiL29kZC1saW1pdC9wbHVzMiIsIEZpeHR1cmUsIEdJTlRfVE9fUE9JTlRFUiAoKzIpLCBzZXR1cCwKKyAgICAgIHRlc3Rfb2RkX2xpbWl0LCB0ZWFyZG93bik7CisKKyAgcmV0dXJuIGdfdGVzdF9ydW4gKCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L2dsaWItdGFwLXRlc3Quc2ggYi90ZXN0L2dsaWItdGFwLXRlc3Quc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNWU1ZTZlNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZ2xpYi10YXAtdGVzdC5zaApAQCAtMCwwICsxLDMzIEBACisjIS9iaW4vc2gKKyMgV3JhcHBlciB0byBtYWtlIEdUZXN0IHRlc3RzIG91dHB1dCBUQVAgc3ludGF4LCBiZWNhdXNlIEF1dG9tYWtlJ3MgdGVzdAorIyBkcml2ZXJzIGRvIG5vdCBjdXJyZW50bHkgc3VwcG9ydCBwYXNzaW5nIHRoZSBzYW1lIGNvbW1hbmQtbGluZSBhcmd1bWVudAorIyB0byBlYWNoIHRlc3QgZXhlY3V0YWJsZS4gQWxsIEdUZXN0IHRlc3RzIHByb2R1Y2UgVEFQIG91dHB1dCBpZiBpbnZva2VkCisjIHdpdGggdGhlIC0tdGFwIG9wdGlvbi4KKyMKKyMgVXNhZ2U6ICJnbGliLXRhcC10ZXN0LnNoIHRlc3QtZm9vIC0tdmVyYm9zZSAuLi4iIGlzIGVxdWl2YWxlbnQgdG8KKyMgInRlc3QtZm9vIC0tdGFwIC0tdmVyYm9zZSAuLi4iCisKK3NldCAtZQordD0iJDEiCitzaGlmdAorCitjYXNlICIkdCIgaW4KKyAgICAoKi5leGUpCisgICAgICAgICMgV2UncmUgcnVubmluZyBhIFdpbmRvd3MgZXhlY3V0YWJsZSwgcG9zc2libHkgb24gYSBVbml4CisgICAgICAgICMgcGxhdGZvcm0uIEF2b2lkIGhhdmluZyBpbnZhbGlkIFRBUCBzeW50YXggbGlrZSAib2sgM1xyXG4iCisgICAgICAgICMgd2hlcmUgIm9rIDNcbiIgd2FzIGludGVuZGVkLgorICAgICAgICBlY2hvIDEgPiAiJHQiLmV4aXQtc3RhdHVzLnRtcAorICAgICAgICAoCisgICAgICAgICAgICBzZXQgK2UKKyAgICAgICAgICAgICIkdCIgLS10YXAgIiRAIgorICAgICAgICAgICAgZWNobyAiJD8iID4gIiR0Ii5leGl0LXN0YXR1cy50bXAKKyAgICAgICAgKSB8IHNlZCAtZSAncy9cciQvLycKKyAgICAgICAgZT0iJChjYXQgIiR0Ii5leGl0LXN0YXR1cy50bXApIgorICAgICAgICBybSAiJHQiLmV4aXQtc3RhdHVzLnRtcAorICAgICAgICBleGl0ICIkZSIKKyAgICAgICAgOzsKKworICAgICgqKQorICAgICAgICBleGVjICIkdCIgLS10YXAgIiRAIgorICAgICAgICA7OworZXNhYwpkaWZmIC0tZ2l0IGEvdGVzdC9pbnRlZ3JhdGlvbi90cmFuc2llbnQtc2VydmljZXMuc2ggYi90ZXN0L2ludGVncmF0aW9uL3RyYW5zaWVudC1zZXJ2aWNlcy5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDk0NmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9pbnRlZ3JhdGlvbi90cmFuc2llbnQtc2VydmljZXMuc2gKQEAgLTAsMCArMSwxOTEgQEAKKyMhL2Jpbi9zaAorCisjIENvcHlyaWdodCDCqSAyMDE3IENvbGxhYm9yYSBMdGQuCisjCisjIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisjIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzCisjICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sCisjIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsCisjIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsCisjIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCisjIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorIworIyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQorIyBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyMKKyMgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisjIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorIyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorIyBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisjIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorIyBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorIyBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisjIFNPRlRXQVJFLgorCitzZXQgLWUKKworaWYgdGVzdCAteiAiJFhER19SVU5USU1FX0RJUiI7IHRoZW4KKyAgICBlY2hvICIxLi4wICMgU0tJUCAtICRYREdfUlVOVElNRV9ESVIgaXMgZW1wdHkgb3IgdW5zZXQiCisgICAgZXhpdCAwCitmaQorCisjIHRlc3QgLU8gaXMgbm9uLVBPU0lYLCBidXQgYmFzaCBhbmQgZGFzaCBoYXZlIGl0LiBJZiBpdCBkb2Vzbid0IHdvcmssCisjIHdlJ3JlIHByb2JhYmx5IG5vdCBvbiBMaW51eCBhbmQgc28gd291bGQgbGlrZWx5IGJlIHNraXBwaW5nIHRoaXMgdGVzdAorIyBhbnl3YXkuCitpZiAhIHRlc3QgLU8gIiRYREdfUlVOVElNRV9ESVIiOyB0aGVuCisgICAgZWNobyAiMS4uMCAjIFNLSVAgLSAkWERHX1JVTlRJTUVfRElSIGlzIG5vdCBvdXJzIG9yIHRlc3QgLU8gZG9lcyBub3Qgd29yayIKKyAgICBleGl0IDAKK2ZpCisKK2lmICEgdGVzdCAtUyAiJFhER19SVU5USU1FX0RJUi9idXMiOyB0aGVuCisgICAgZWNobyAiMS4uMCAjIFNLSVAgLSAkWERHX1JVTlRJTUVfRElSL2J1cyBpcyBub3QgYSBzb2NrZXQiCisgICAgZXhpdCAwCitmaQorCitpZiAhIHRlc3QgLU8gIiRYREdfUlVOVElNRV9ESVIvYnVzIjsgdGhlbgorICAgIGVjaG8gIjEuLjAgIyBTS0lQIC0gJFhER19SVU5USU1FX0RJUi9idXMgaXMgbm90IG91cnMiCisgICAgZXhpdCAwCitmaQorCitpZiB0ZXN0IC1uICIkREJVU19TRVNTSU9OX0JVU19BRERSRVNTIiAmJiBcCisgICAgICAgICEgdGVzdCAidW5peDpwYXRoPSRYREdfUlVOVElNRV9ESVIvYnVzIiA9ICIkREJVU19TRVNTSU9OX0JVU19BRERSRVNTIjsgdGhlbgorICAgIGVjaG8gIjEuLjAgIyBTS0lQIC0gREJVU19TRVNTSU9OX0JVU19BRERSRVNTIGRvZXMgbm90IHBvaW50IHRvICRYREdfUlVOVElNRV9ESVIvYnVzIgorICAgIGV4aXQgMAorZmkKKworIyBBbnkgdW5pcXVlIHRva2VuIHRoYXQgd29uJ3QgY29sbGlkZSB3b3VsZCBkbyBoZXJlLiBJdCBtdXN0IHN0YXJ0IHdpdGgKKyMgYSBsZXR0ZXIgb3IgdW5kZXJzY29yZS4KK3VuaXF1ZT0idCQoZGJ1cy11dWlkZ2VuKSIKKworaWYgISB3b3JrZGlyPSIkKG1rdGVtcCAtZCkiOyB0aGVuCisgICAgZWNobyAiMS4uMCAjIFNLSVAgLSBta3RlbXAgLWQgZG9lc24ndCB3b3JrIgorICAgIGV4aXQgMAorZmkKKworY2xlYW51cCAoKSB7CisgICAgcm0gLWZyICIkd29ya2RpciIKKyAgICBybSAtZiAiJFhER19SVU5USU1FX0RJUi9kYnVzLTEvc2VydmljZXMvY29tLmV4YW1wbGUuREJ1c1Rlc3RzLiR1bmlxdWUudG1wIgorICAgIHJtIC1mICIkWERHX1JVTlRJTUVfRElSL2RidXMtMS9zZXJ2aWNlcy9jb20uZXhhbXBsZS5EQnVzVGVzdHMuJHVuaXF1ZS5zZXJ2aWNlIgorICAgIHJtIC1mICIkWERHX1JVTlRJTUVfRElSL2RidXMtMS9zZXJ2aWNlcy9jb20uZXhhbXBsZS5EQnVzVGVzdHMuU3lzdGVtZC4kdW5pcXVlLnRtcCIKKyAgICBybSAtZiAiJFhER19SVU5USU1FX0RJUi9kYnVzLTEvc2VydmljZXMvY29tLmV4YW1wbGUuREJ1c1Rlc3RzLlN5c3RlbWQuJHVuaXF1ZS5zZXJ2aWNlIgorICAgIHJtIC1mICIkWERHX1JVTlRJTUVfRElSL3N5c3RlbWQvdXNlci9kYnVzLWNvbS5leGFtcGxlLkRCdXNUZXN0cy5TeXN0ZW1kLiR1bmlxdWUuc2VydmljZSIKK30KK3RyYXAgY2xlYW51cCBFWElUCisKK2VjaG8gIjEuLjIiCisKKyMgVGhpcyBpcyBhbiBpbnRlZ3JhdGlvbiB0ZXN0LCBzbyB3ZSBleHBlY3QgdGhlIGRidXMtZGFlbW9uIHRvIGFscmVhZHkgYmUKKyMgcnVubmluZworaWYgISB0ZXN0IC1kICIkWERHX1JVTlRJTUVfRElSL2RidXMtMS9zZXJ2aWNlcyI7IHRoZW4KKyAgICBlY2hvICJCYWlsIG91dCEgJFhER19SVU5USU1FX0RJUi9kYnVzLTEvc2VydmljZXMgaXMgbm90IGEgZGlyZWN0b3J5IgorICAgIGV4aXQgMQorZmkKKworY2QgIiRYREdfUlVOVElNRV9ESVIvZGJ1cy0xL3NlcnZpY2VzIgorCitzZWQgLWUgJ3MvXiAqLy8nID4gImNvbS5leGFtcGxlLkRCdXNUZXN0cy4kdW5pcXVlLnRtcCIgPDxFT0YKKyAgICBbRC1CVVMgU2VydmljZV0KKyAgICBOYW1lPWNvbS5leGFtcGxlLkRCdXNUZXN0cy4kdW5pcXVlCisgICAgRXhlYz0vYmluL3NoIC1jICd0b3VjaCAiXCQxIjsgZXhpdCAxJyBzaCAnJHdvcmtkaXIvcmFuLSR1bmlxdWUnCitFT0YKK212ICJjb20uZXhhbXBsZS5EQnVzVGVzdHMuJHVuaXF1ZS50bXAiICJjb20uZXhhbXBsZS5EQnVzVGVzdHMuJHVuaXF1ZS5zZXJ2aWNlIgorCisoCitkYnVzLXNlbmQgLS1zZXNzaW9uIC0tZGVzdD0ib3JnLmZyZWVkZXNrdG9wLkRCdXMiIFwKKyAgICAtLXR5cGU9bWV0aG9kX2NhbGwgLS1wcmludC1yZXBseSAvb3JnL2ZyZWVkZXNrdG9wL0RCdXMgXAorICAgIG9yZy5mcmVlZGVza3RvcC5EQnVzLlJlbG9hZENvbmZpZyB8fCB0b3VjaCAiJHdvcmtkaXIvZmFpbGVkIiBcCispIDI+JjEgfCBzZWQgLWUgJ3MvXi8jIC8nCisKK2lmIFsgLWUgIiR3b3JrZGlyL2ZhaWxlZCIgXTsgdGhlbgorICAgIGVjaG8gIkJhaWwgb3V0ISBVbmFibGUgdG8gdGVsbCBkYnVzLWRhZW1vbiB0byByZWxvYWQiCisgICAgZXhpdCAxCitmaQorCisjIEJlY2F1c2UgdGhlIHNlcnZpY2UgbmV2ZXIgYWN0dWFsbHkgdGFrZXMgYSBidXMgbmFtZSwgd2UgZXhwZWN0IHRoaXMgdG8gZmFpbDsKKyMgYnV0IGl0cyBleGl0IHN0YXR1cyBpcyBpZ25vcmVkIGJlY2F1c2UgaXQncyBpbiBhIHBpcGVsaW5lLgorZGJ1cy1zZW5kIC0tc2Vzc2lvbiAtLWRlc3Q9ImNvbS5leGFtcGxlLkRCdXNUZXN0cy4kdW5pcXVlIiBcCisgICAgLS10eXBlPW1ldGhvZF9jYWxsIC0tcHJpbnQtcmVwbHkgLyBjb20uZXhhbXBsZS5EQnVzVGVzdHMuVGhpc1dpbGxGYWlsIFwKKyAgICAyPiYxIHwgc2VkIC1lICdzL14vIyAvJworCitpZiBbIC1lICIkd29ya2Rpci9yYW4tJHVuaXF1ZSIgXTsgdGhlbgorICAgIGVjaG8gIm9rIDEgLSBhdHRlbXB0ZWQgdG8gcnVuIHRyYW5zaWVudCBzZXJ2aWNlIGRpcmVjdGx5IgorZWxzZQorICAgIGVjaG8gIm5vdCBvayAxIC0gbm8gc2lnbiBvZiBoYXZpbmcgcnVuIHRyYW5zaWVudCBzZXJ2aWNlIgorZmkKKworIyBTZWUgd2hldGhlciBzeXN0ZW1kIGlzIG9uIHRoZSBzZXNzaW9uIGJ1cy4KKygKK2RidXMtc2VuZCAtLXNlc3Npb24gLS1kZXN0PSJvcmcuZnJlZWRlc2t0b3Auc3lzdGVtZDEiIFwKKyAgICAtLXR5cGU9bWV0aG9kX2NhbGwgLS1wcmludC1yZXBseSAvb3JnL2ZyZWVkZXNrdG9wL3N5c3RlbWQxL01hbmFnZXIgXAorICAgIG9yZy5mcmVlZGVza3RvcC5EQnVzLlBlZXIuUGluZyB8fCB0b3VjaCAiJHdvcmtkaXIvbm8tc3lzdGVtZCIgXAorKSAyPiYxIHwgc2VkIC1lICdzL14vIyAvJworCitpZiBbIC1kICIkWERHX1JVTlRJTUVfRElSL3N5c3RlbWQiIF0gJiYgISBbIC1lICIkd29ya2Rpci9uby1zeXN0ZW1kIiBdOyB0aGVuCisKKyAgICAjIHN5c3RlbWQgaXMgTGludXgtc3BlY2lmaWMsIHNvIHdlIGNhbiBhc3N1bWUgR05VIG1rZGlyLgorICAgIG1rZGlyIC1wIC1tNzAwICIkWERHX1JVTlRJTUVfRElSL3N5c3RlbWQvdXNlciIKKyAgICBjZCAiJFhER19SVU5USU1FX0RJUi9zeXN0ZW1kL3VzZXIiCisKKyAgICBzZWQgLWUgJ3MvXiAqLy8nID4gImRidXMtY29tLmV4YW1wbGUuREJ1c1Rlc3RzLlN5c3RlbWQuJHVuaXF1ZS50bXAiIDw8RU9GCisgICAgICAgIFtVbml0XQorICAgICAgICBEZXNjcmlwdGlvbj1Ob24tZnVuY3Rpb25hbCBzZXJ2aWNlIGluIHRoZSBkYnVzIGludGVncmF0aW9uIHRlc3RzCisgICAgICAgIFtTZXJ2aWNlXQorICAgICAgICBFeGVjU3RhcnQ9L2Jpbi9zaCAtYyAndG91Y2ggIlwkMSI7IGV4aXQgMScgc2ggJyR3b3JrZGlyL3Jhbi0kdW5pcXVlLXZpYS1zeXN0ZW1kJworICAgICAgICBUeXBlPWZvcmtpbmcKK0VPRgorICAgIG12ICJkYnVzLWNvbS5leGFtcGxlLkRCdXNUZXN0cy5TeXN0ZW1kLiR1bmlxdWUudG1wIiBcCisgICAgICAgICJkYnVzLWNvbS5leGFtcGxlLkRCdXNUZXN0cy5TeXN0ZW1kLiR1bmlxdWUuc2VydmljZSIKKworICAgIGlmICEgc3lzdGVtY3RsIC0tdXNlciBkYWVtb24tcmVsb2FkOyB0aGVuCisgICAgICAgIGVjaG8gIkJhaWwgb3V0ISBVbmFibGUgdG8gdGVsbCBzeXN0ZW1kIHRvIHJlbG9hZCIKKyAgICAgICAgZXhpdCAxCisgICAgZmkKKworICAgIGNkICIkWERHX1JVTlRJTUVfRElSL2RidXMtMS9zZXJ2aWNlcyIKKworICAgIHNlZCAtZSAncy9eICovLycgPiAiY29tLmV4YW1wbGUuREJ1c1Rlc3RzLlN5c3RlbWQuJHVuaXF1ZS50bXAiIDw8RU9GCisgICAgICAgIFtELUJVUyBTZXJ2aWNlXQorICAgICAgICBOYW1lPWNvbS5leGFtcGxlLkRCdXNUZXN0cy5TeXN0ZW1kLiR1bmlxdWUKKyAgICAgICAgU3lzdGVtZFNlcnZpY2U9ZGJ1cy1jb20uZXhhbXBsZS5EQnVzVGVzdHMuU3lzdGVtZC4kdW5pcXVlLnNlcnZpY2UKKyAgICAgICAgRXhlYz0vYmluL3NoIC1jICd0b3VjaCAiXCQxIjsgZXhpdCAxJyBzaCAnJHdvcmtkaXIvcmFuLSR1bmlxdWUtd3JvbmcnCitFT0YKKyAgICBtdiAiY29tLmV4YW1wbGUuREJ1c1Rlc3RzLlN5c3RlbWQuJHVuaXF1ZS50bXAiIFwKKyAgICAgICAgImNvbS5leGFtcGxlLkRCdXNUZXN0cy5TeXN0ZW1kLiR1bmlxdWUuc2VydmljZSIKKworICAgICgKKyAgICBkYnVzLXNlbmQgLS1zZXNzaW9uIC0tZGVzdD0ib3JnLmZyZWVkZXNrdG9wLkRCdXMiIFwKKyAgICAgICAgLS10eXBlPW1ldGhvZF9jYWxsIC0tcHJpbnQtcmVwbHkgL29yZy9mcmVlZGVza3RvcC9EQnVzIFwKKyAgICAgICAgb3JnLmZyZWVkZXNrdG9wLkRCdXMuUmVsb2FkQ29uZmlnIHx8IHRvdWNoICIkd29ya2Rpci9mYWlsZWQiIFwKKyAgICApIDI+JjEgfCBzZWQgLWUgJ3MvXi8jIC8nCisKKyAgICBpZiBbIC1lICIkd29ya2Rpci9mYWlsZWQiIF07IHRoZW4KKyAgICAgICAgZWNobyAiQmFpbCBvdXQhIFVuYWJsZSB0byB0ZWxsIGRidXMtZGFlbW9uIHRvIHJlbG9hZCIKKyAgICAgICAgZXhpdCAxCisgICAgZmkKKworICAgICMgQmVjYXVzZSB0aGUgc2VydmljZSBuZXZlciBhY3R1YWxseSB0YWtlcyBhIGJ1cyBuYW1lLCB3ZSBleHBlY3QgdGhpcyB0byBmYWlsOworICAgICMgYnV0IGl0cyBleGl0IHN0YXR1cyBpcyBpZ25vcmVkIGJlY2F1c2UgaXQncyBpbiBhIHBpcGVsaW5lLgorICAgICMKKyAgICAjIHN5c3RlbWQgbmV2ZXIgc2VuZHMgYmFjayBhbiBBY3RpdmF0aW9uRmFpbHVyZSBtZXNzYWdlIGZvciBhIHNlcnZpY2UKKyAgICAjIGlmIGl0IHN0YXJ0cyB0aGUgam9iIGJ1dCB0aGUgc2VydmljZSBzdWJzZXF1ZW50bHkgZG9lc24ndCBiZWhhdmUgYXMKKyAgICAjIGludGVuZGVkLCBzbyB1c2UgYSByZWxhdGl2ZWx5IHNob3J0IHRpbWVvdXQgKDMwMDBtcykuCisgICAgZGJ1cy1zZW5kIC0tc2Vzc2lvbiAtLWRlc3Q9ImNvbS5leGFtcGxlLkRCdXNUZXN0cy5TeXN0ZW1kLiR1bmlxdWUiIFwKKyAgICAgICAgLS1yZXBseS10aW1lb3V0PTMwMDAgLS10eXBlPW1ldGhvZF9jYWxsIC0tcHJpbnQtcmVwbHkgXAorICAgICAgICAvIGNvbS5leGFtcGxlLkRCdXNUZXN0cy5UaGlzV2lsbEZhaWwgXAorICAgICAgICAyPiYxIHwgc2VkIC1lICdzL14vIyAvJworCisgICAgaWYgWyAtZSAiJHdvcmtkaXIvcmFuLSR1bmlxdWUtdmlhLXN5c3RlbWQiIF07IHRoZW4KKyAgICAgICAgZWNobyAib2sgMiAtIGF0dGVtcHRlZCB0byBydW4gdHJhbnNpZW50IHNlcnZpY2UgdmlhIHN5c3RlbWQiCisgICAgZWxpZiBbIC1lICIkd29ya2Rpci9yYW4tJHVuaXF1ZS13cm9uZyIgXTsgdGhlbgorICAgICAgICBlY2hvICJub3Qgb2sgMiAtIHJhbiB0cmFuc2llbnQgc2VydmljZSBpbmNvcnJlY3RseSIKKyAgICBlbHNlCisgICAgICAgIGVjaG8gIm5vdCBvayAyIC0gbm8gc2lnbiBvZiBoYXZpbmcgcnVuIHRyYW5zaWVudCBzZXJ2aWNlIgorICAgIGZpCitlbHNlCisgICAgZWNobyAib2sgMiAjIFNLSVAgc2Vzc2lvbiBidXMgZG9lcyBub3QgYXBwZWFyIHRvIGJlIG1hbmFnZWQgYnkgc3lzdGVtZCIKK2ZpCisKK2VjaG8gIiMgRG9uZS4iCitjbGVhbnVwCit0cmFwICcnIEVYSVQKK2V4aXQgMApkaWZmIC0tZ2l0IGEvdGVzdC9pbnRlcm5hbHMvcHJpbnRmLmMgYi90ZXN0L2ludGVybmFscy9wcmludGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjhmMzU1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9pbnRlcm5hbHMvcHJpbnRmLmMKQEAgLTAsMCArMSwxMDkgQEAKKy8qIFJlZ3Jlc3Npb24gdGVzdCBmb3IgX2RidXNfcHJpbnRmX3N0cmluZ191cHBlcl9ib3VuZAorICoKKyAqIEF1dGhvcjogU2ltb24gTWNWaXR0aWUgPHNpbW9uLm1jdml0dGllQGNvbGxhYm9yYS5jby51az4KKyAqIENvcHlyaWdodCDCqSAyMDEzIEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzCisgKiAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLAorICogaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwKKyAqIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsCisgKiBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAorICogc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKKyAqIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWludGVybmFscy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zdHJpbmcuaD4KKyNpbmNsdWRlICJ0ZXN0LXV0aWxzLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCitzdGF0aWMgdm9pZCBkb190ZXN0IChpbnQgbWluaW11bSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgIC4uLikgX0RCVVNfR05VQ19QUklOVEYgKDIsIDMpOworCitzdGF0aWMgdm9pZAorZG9fdGVzdCAoaW50IG1pbmltdW0sCisgICAgY29uc3QgY2hhciAqZm9ybWF0LAorICAgIC4uLikKK3sKKyAgdmFfbGlzdCBhcDsKKyAgaW50IHJlc3VsdDsKKworICB2YV9zdGFydCAoYXAsIGZvcm1hdCk7CisgIHJlc3VsdCA9IF9kYnVzX3ByaW50Zl9zdHJpbmdfdXBwZXJfYm91bmQgKGZvcm1hdCwgYXApOworICB2YV9lbmQgKGFwKTsKKworICBpZiAocmVzdWx0IDwgbWluaW11bSkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJleHBlY3RlZCBhdCBsZWFzdCAlZCwgZ290ICVkXG4iLCBtaW5pbXVtLCByZXN1bHQpOworICAgICAgYWJvcnQgKCk7CisgICAgfQorfQorCisjZGVmaW5lIFhfVElNRVNfOCAiWFhYWFhYWFgiCisjZGVmaW5lIFhfVElNRVNfMTYgICBYX1RJTUVTXzggICBYX1RJTUVTXzgKKyNkZWZpbmUgWF9USU1FU18zMiAgIFhfVElNRVNfMTYgIFhfVElNRVNfMTYKKyNkZWZpbmUgWF9USU1FU182NCAgIFhfVElNRVNfMzIgIFhfVElNRVNfMzIKKyNkZWZpbmUgWF9USU1FU18xMjggIFhfVElNRVNfNjQgIFhfVElNRVNfNjQKKyNkZWZpbmUgWF9USU1FU18yNTYgIFhfVElNRVNfMTI4IFhfVElNRVNfMTI4CisjZGVmaW5lIFhfVElNRVNfNTEyICBYX1RJTUVTXzI1NiBYX1RJTUVTXzI1NgorI2RlZmluZSBYX1RJTUVTXzEwMjQgWF9USU1FU181MTIgWF9USU1FU181MTIKKworLyogVGhpcyB0ZXN0IG91dHB1dHMgVEFQIHN5bnRheDogaHR0cDovL3Rlc3Rhbnl0aGluZy5vcmcvICovCitpbnQKK21haW4gKGludCBhcmdjLAorICAgIGNoYXIgKiphcmd2KQoreworICBjaGFyIGJ1ZltdID0gWF9USU1FU18xMDI0IFhfVElNRVNfMTAyNCBYX1RJTUVTXzEwMjQgWF9USU1FU18xMDI0OworICBpbnQgaTsKKyAgaW50IHRlc3RfbnVtID0gMDsKKworICBkb190ZXN0ICgxLCAiJWQiLCAwKTsKKyAgcHJpbnRmICgib2sgJWRcbiIsICsrdGVzdF9udW0pOworCisgIGRvX3Rlc3QgKDcsICIlZCIsIDEyMzQ1NjcpOworICBwcmludGYgKCJvayAlZFxuIiwgKyt0ZXN0X251bSk7CisKKyAgZG9fdGVzdCAoMywgIiVmIiwgMy41KTsKKyAgcHJpbnRmICgib2sgJWRcbiIsICsrdGVzdF9udW0pOworCisgIGRvX3Rlc3QgKDAsICIlcyIsICIiKTsKKyAgcHJpbnRmICgib2sgJWRcbiIsICsrdGVzdF9udW0pOworCisgIGRvX3Rlc3QgKDEwMjQsICIlcyIsIFhfVElNRVNfMTAyNCk7CisgIHByaW50ZiAoIm9rICVkXG4iLCArK3Rlc3RfbnVtKTsKKworICBkb190ZXN0ICgxMDI1LCAiJXMiLCBYX1RJTUVTXzEwMjQgIlkiKTsKKyAgcHJpbnRmICgib2sgJWRcbiIsICsrdGVzdF9udW0pOworCisgIGZvciAoaSA9IDQwOTY7IGkgPiAwOyBpLS0pCisgICAgeworICAgICAgYnVmW2ldID0gJ1wwJzsKKyAgICAgIGRvX3Rlc3QgKGksICIlcyIsIGJ1Zik7CisgICAgICBkb190ZXN0IChpICsgMywgIiVzOiVkIiwgYnVmLCA0Mik7CisgICAgfQorICBwcmludGYgKCJvayAlZFxuIiwgKyt0ZXN0X251bSk7CisKKyAgLyogVGVsbCB0aGUgVEFQIGRyaXZlciB0aGF0IHdlIGhhdmUgZG9uZSBhbGwgdGhlIHRlc3RzIHdlIHBsYW4gdG8gZG8uCisgICAqIFRoaXMgaXMgaG93IGl0IGNhbiBkaXN0aW5ndWlzaCBiZXR3ZWVuIGFuIHVuZXhwZWN0ZWQgZXhpdCBhbmQKKyAgICogc3VjY2Vzc2Z1bCBjb21wbGV0aW9uLiAqLworICBwcmludGYgKCIxLi4lZFxuIiwgdGVzdF9udW0pOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvaW50ZXJuYWxzL3JlZnMuYyBiL3Rlc3QvaW50ZXJuYWxzL3JlZnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmZmODc0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9pbnRlcm5hbHMvcmVmcy5jCkBAIC0wLDAgKzEsNjM5IEBACisvKiBSZWdyZXNzaW9uIHRlc3QgZm9yIHRocmVhZC1zYWZlIHJlZmVyZW5jZS1jb3VudGluZworICoKKyAqIEF1dGhvcjogU2ltb24gTWNWaXR0aWUgPHNpbW9uLm1jdml0dGllQGNvbGxhYm9yYS5jby51az4KKyAqIENvcHlyaWdodCDCqSAyMDExIE5va2lhIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzCisgKiAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLAorICogaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwKKyAqIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsCisgKiBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAorICogc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKKyAqIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorCisjaW5jbHVkZSA8Z2xpYi5oPgorI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisKKyNpbmNsdWRlIDxkYnVzL2RidXMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtY29ubmVjdGlvbi1pbnRlcm5hbC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1tYWlubG9vcC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1tZXNzYWdlLWludGVybmFsLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXBlbmRpbmctY2FsbC1pbnRlcm5hbC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zZXJ2ZXItcHJvdGVjdGVkLmg+CisjaW5jbHVkZSAidGVzdC11dGlscy1nbGliLmgiCisKK3N0YXRpYyB2b2lkCithc3NlcnRfbm9fZXJyb3IgKGNvbnN0IERCdXNFcnJvciAqZSkKK3sKKyAgaWYgKEdfVU5MSUtFTFkgKGRidXNfZXJyb3JfaXNfc2V0IChlKSkpCisgICAgZ19lcnJvciAoImV4cGVjdGVkIHN1Y2Nlc3MgYnV0IGdvdCBlcnJvcjogJXM6ICVzIiwgZS0+bmFtZSwgZS0+bWVzc2FnZSk7Cit9CisKKyNkZWZpbmUgTl9USFJFQURTIDIwMAorI2RlZmluZSBOX1JFRlMgMTAwMDAKK0dfU1RBVElDX0FTU0VSVCAoKCh1bnNpZ25lZCkgTl9USFJFQURTICogKHVuc2lnbmVkKSBOX1JFRlMpIDwgR19NQVhJTlQzMik7CisKK3N0YXRpYyBkYnVzX2ludDMyX3QgY29ubmVjdGlvbl9zbG90ID0gLTE7CitzdGF0aWMgZGJ1c19pbnQzMl90IHNlcnZlcl9zbG90ID0gLTE7CitzdGF0aWMgZGJ1c19pbnQzMl90IG1lc3NhZ2Vfc2xvdCA9IC0xOworc3RhdGljIGRidXNfaW50MzJfdCBwZW5kaW5nX2NhbGxfc2xvdCA9IC0xOworCit0eXBlZGVmIHN0cnVjdCB7CisgIERCdXNFcnJvciBlOworICBEQnVzTG9vcCAqbG9vcDsKKyAgREJ1c1NlcnZlciAqc2VydmVyOworICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKyAgREJ1c0Nvbm5lY3Rpb24gKnNlcnZlcl9jb25uZWN0aW9uOworICBEQnVzTWVzc2FnZSAqbWVzc2FnZTsKKyAgR1RocmVhZCAqdGhyZWFkc1tOX1RIUkVBRFNdOworICBnYm9vbGVhbiBsYXN0X3VucmVmOworICB1bnNpZ25lZCBuX3JlZnM7CisgIHVuc2lnbmVkIG5fdGhyZWFkczsKK30gRml4dHVyZTsKKwordHlwZWRlZiB2b2lkICooKlJlZkZ1bmMpICh2b2lkICopOwordHlwZWRlZiB2b2lkICgqVm9pZEZ1bmMpICh2b2lkICopOworCit0eXBlZGVmIHN0cnVjdCB7CisgIGNvbnN0IEZpeHR1cmUgKmY7CisgIHZvaWQgKnRoaW5nOworICBSZWZGdW5jIHJlZjsKKyAgVm9pZEZ1bmMgcmVmX3ZvaWQ7CisgIFZvaWRGdW5jIHVucmVmOworICB2b2lkICptdXRleDsKKyAgVm9pZEZ1bmMgbG9jazsKKyAgVm9pZEZ1bmMgdW5sb2NrOworfSBUaHJlYWQ7CisKK3N0YXRpYyBncG9pbnRlcgorcmVmX3RocmVhZCAoZ3BvaW50ZXIgZGF0YSkKK3sKKyAgVGhyZWFkICp0aHJlYWQgPSBkYXRhOworICBjb25zdCBGaXh0dXJlICpmID0gdGhyZWFkLT5mOworICB1bnNpZ25lZCBpOworCisgIGZvciAoaSA9IDA7IGkgPCBmLT5uX3JlZnM7IGkrKykKKyAgICB7CisgICAgICBpZiAodGhyZWFkLT5sb2NrICE9IE5VTEwpCisgICAgICAgICh0aHJlYWQtPmxvY2spICh0aHJlYWQtPm11dGV4KTsKKworICAgICAgaWYgKHRocmVhZC0+cmVmICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBncG9pbnRlciByZXQgPSAodGhyZWFkLT5yZWYpICh0aHJlYWQtPnRoaW5nKTsKKworICAgICAgICAgIGdfYXNzZXJ0IChyZXQgPT0gdGhyZWFkLT50aGluZyk7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICh0aHJlYWQtPnJlZl92b2lkKSAodGhyZWFkLT50aGluZyk7CisgICAgICAgIH0KKworICAgICAgaWYgKHRocmVhZC0+dW5sb2NrICE9IE5VTEwpCisgICAgICAgICh0aHJlYWQtPnVubG9jaykgKHRocmVhZC0+bXV0ZXgpOworICAgIH0KKworICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGdwb2ludGVyCitjeWNsZV90aHJlYWQgKGdwb2ludGVyIGRhdGEpCit7CisgIFRocmVhZCAqdGhyZWFkID0gZGF0YTsKKyAgY29uc3QgRml4dHVyZSAqZiA9IHRocmVhZC0+ZjsKKyAgdW5zaWduZWQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgZi0+bl9yZWZzOyBpKyspCisgICAgeworICAgICAgaWYgKHRocmVhZC0+bG9jayAhPSBOVUxMKQorICAgICAgICAodGhyZWFkLT5sb2NrKSAodGhyZWFkLT5tdXRleCk7CisKKyAgICAgIGlmICh0aHJlYWQtPnJlZiAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgZ3BvaW50ZXIgcmV0ID0gKHRocmVhZC0+cmVmKSAodGhyZWFkLT50aGluZyk7CisKKyAgICAgICAgICBnX2Fzc2VydCAocmV0ID09IHRocmVhZC0+dGhpbmcpOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAodGhyZWFkLT5yZWZfdm9pZCkgKHRocmVhZC0+dGhpbmcpOworICAgICAgICB9CisKKyAgICAgICh0aHJlYWQtPnVucmVmKSAodGhyZWFkLT50aGluZyk7CisKKyAgICAgIGlmICh0aHJlYWQtPnVubG9jayAhPSBOVUxMKQorICAgICAgICAodGhyZWFkLT51bmxvY2spICh0aHJlYWQtPm11dGV4KTsKKyAgICB9CisKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBncG9pbnRlcgordW5yZWZfdGhyZWFkIChncG9pbnRlciBkYXRhKQoreworICBUaHJlYWQgKnRocmVhZCA9IGRhdGE7CisgIGNvbnN0IEZpeHR1cmUgKmYgPSB0aHJlYWQtPmY7CisgIHVuc2lnbmVkIGk7CisKKyAgZm9yIChpID0gMDsgaSA8IGYtPm5fcmVmczsgaSsrKQorICAgIHsKKyAgICAgIGlmICh0aHJlYWQtPmxvY2sgIT0gTlVMTCkKKyAgICAgICAgKHRocmVhZC0+bG9jaykgKHRocmVhZC0+bXV0ZXgpOworCisgICAgICAodGhyZWFkLT51bnJlZikgKHRocmVhZC0+dGhpbmcpOworCisgICAgICBpZiAodGhyZWFkLT51bmxvY2sgIT0gTlVMTCkKKyAgICAgICAgKHRocmVhZC0+dW5sb2NrKSAodGhyZWFkLT5tdXRleCk7CisgICAgfQorCisgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZAorbGFzdF91bnJlZiAodm9pZCAqZGF0YSkKK3sKKyAgRml4dHVyZSAqZiA9IGRhdGE7CisKKyAgZ19hc3NlcnQgKCFmLT5sYXN0X3VucmVmKTsKKyAgZi0+bGFzdF91bnJlZiA9IFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCit3YWl0X2Zvcl9hbGxfdGhyZWFkcyAoRml4dHVyZSAqZikKK3sKKyAgdW5zaWduZWQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgZi0+bl90aHJlYWRzOyBpKyspCisgICAgZ190aHJlYWRfam9pbiAoZi0+dGhyZWFkc1tpXSk7Cit9CisKK3N0YXRpYyB2b2lkCituZXdfY29ubl9jYiAoREJ1c1NlcnZlciAqc2VydmVyLAorICAgIERCdXNDb25uZWN0aW9uICpzZXJ2ZXJfY29ubmVjdGlvbiwKKyAgICB2b2lkICpkYXRhKQoreworICBGaXh0dXJlICpmID0gZGF0YTsKKworICBnX2Fzc2VydCAoZi0+c2VydmVyX2Nvbm5lY3Rpb24gPT0gTlVMTCk7CisgIGYtPnNlcnZlcl9jb25uZWN0aW9uID0gZGJ1c19jb25uZWN0aW9uX3JlZiAoc2VydmVyX2Nvbm5lY3Rpb24pOworCisgIHRlc3RfY29ubmVjdGlvbl9zZXR1cCAoZi0+bG9vcCwgZi0+c2VydmVyX2Nvbm5lY3Rpb24pOworfQorCitzdGF0aWMgdm9pZAorc2V0dXAgKEZpeHR1cmUgKmYsCisgICAgZ2NvbnN0cG9pbnRlciBkYXRhKQoreworICBpZiAoIWRidXNfdGhyZWFkc19pbml0X2RlZmF1bHQgKCkpCisgICAgZ19lcnJvciAoIk9PTSIpOworCisgIC8qIFRoaXMgY2FuIGJlIGZhaXJseSBzbG93LCBzbyBtYWtlIHRoZSB0ZXN0IHRpbWVvdXQgcGVyLXRlc3QgKi8KKyAgdGVzdF90aW1lb3V0X3Jlc2V0ICgxKTsKKworICBmLT5uX3RocmVhZHMgPSBOX1RIUkVBRFM7CisgIGYtPm5fcmVmcyA9IE5fUkVGUzsKKworICAvLyB3aW5lIHNldHMgV0lORVNFUlZFUlNPQ0tFVCBmb3IgaXRzIGNoaWxkIHByb2Nlc3NlcyBhdXRvbWF0aWNhbGx5CisgIGlmIChnX2dldGVudiAoIldJTkVTRVJWRVJTT0NLRVQiKSAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIE91ciByZWZlcmVuY2UtY291bnRpbmcgaXMgcmVhbGx5IHNsb3cgdW5kZXIgV2luZSAoaXQgaW52b2x2ZXMKKyAgICAgICAqIElQQyB0byB3aW5lc2VydmVyKS4gRG8gZmV3ZXIgaXRlcmF0aW9uczogZW5vdWdoIHRvIGRlbW9uc3RyYXRlCisgICAgICAgKiB0aGF0IGl0IHdvcmtzLCByYXRoZXIgdGhhbiBhIHBlcmZvcm1hbmNlIHRlc3QuCisgICAgICAgKi8KKyAgICAgIGYtPm5fdGhyZWFkcyA9IDEwOworICAgICAgZi0+bl9yZWZzID0gMTA7CisgICAgfQorCisgIGYtPmxvb3AgPSBfZGJ1c19sb29wX25ldyAoKTsKKyAgZ19hc3NlcnQgKGYtPmxvb3AgIT0gTlVMTCk7CisKKyAgZGJ1c19lcnJvcl9pbml0ICgmZi0+ZSk7CisKKyNpZmRlZiBEQlVTX1VOSVgKKyAgZi0+c2VydmVyID0gZGJ1c19zZXJ2ZXJfbGlzdGVuICgidW5peDp0bXBkaXI9L3RtcCIsICZmLT5lKTsKKyNlbHNlCisgIGYtPnNlcnZlciA9IGRidXNfc2VydmVyX2xpc3RlbiAoInRjcDpob3N0PTEyNy4wLjAuMSIsICZmLT5lKTsKKyNlbmRpZgorCisgIGFzc2VydF9ub19lcnJvciAoJmYtPmUpOworICBnX2Fzc2VydCAoZi0+c2VydmVyICE9IE5VTEwpOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX2FsbG9jYXRlX2RhdGFfc2xvdCAoJmNvbm5lY3Rpb25fc2xvdCkpCisgICAgZ19lcnJvciAoIk9PTSIpOworCisgIGlmICghZGJ1c19zZXJ2ZXJfYWxsb2NhdGVfZGF0YV9zbG90ICgmc2VydmVyX3Nsb3QpKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKworICBpZiAoIWRidXNfbWVzc2FnZV9hbGxvY2F0ZV9kYXRhX3Nsb3QgKCZtZXNzYWdlX3Nsb3QpKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKworICBpZiAoIWRidXNfcGVuZGluZ19jYWxsX2FsbG9jYXRlX2RhdGFfc2xvdCAoJnBlbmRpbmdfY2FsbF9zbG90KSkKKyAgICBnX2Vycm9yICgiT09NIik7Cit9CisKK3N0YXRpYyB2b2lkCitzZXR1cF9jb25uZWN0aW9uIChGaXh0dXJlICpmLAorICAgIGdjb25zdHBvaW50ZXIgZGF0YSkKK3sKKyAgY2hhciAqYWRkcmVzczsKKworICBzZXR1cCAoZiwgZGF0YSk7CisKKyAgZGJ1c19zZXJ2ZXJfc2V0X25ld19jb25uZWN0aW9uX2Z1bmN0aW9uIChmLT5zZXJ2ZXIsCisgICAgICBuZXdfY29ubl9jYiwgZiwgTlVMTCk7CisKKyAgaWYgKCF0ZXN0X3NlcnZlcl9zZXR1cCAoZi0+bG9vcCwgZi0+c2VydmVyKSkKKyAgICBnX2Vycm9yICgiZmFpbGVkIHRvIHNldCB1cCBzZXJ2ZXIiKTsKKworICBhZGRyZXNzID0gZGJ1c19zZXJ2ZXJfZ2V0X2FkZHJlc3MgKGYtPnNlcnZlcik7CisgIGdfYXNzZXJ0IChhZGRyZXNzICE9IE5VTEwpOworICBmLT5jb25uZWN0aW9uID0gZGJ1c19jb25uZWN0aW9uX29wZW5fcHJpdmF0ZSAoYWRkcmVzcywgJmYtPmUpOworICBhc3NlcnRfbm9fZXJyb3IgKCZmLT5lKTsKKyAgZ19hc3NlcnQgKGYtPmNvbm5lY3Rpb24gIT0gTlVMTCk7CisgIGRidXNfZnJlZSAoYWRkcmVzcyk7CisKKyAgaWYgKCF0ZXN0X2Nvbm5lY3Rpb25fc2V0dXAgKGYtPmxvb3AsIGYtPmNvbm5lY3Rpb24pKQorICAgIGdfZXJyb3IgKCJmYWlsZWQgdG8gc2V0IHVwIGNvbm5lY3Rpb24iKTsKKworICB3aGlsZSAoZi0+c2VydmVyX2Nvbm5lY3Rpb24gPT0gTlVMTCkKKyAgICBfZGJ1c19sb29wX2l0ZXJhdGUgKGYtPmxvb3AsIFRSVUUpOworCisgIHRlc3RfY29ubmVjdGlvbl9zaHV0ZG93biAoZi0+bG9vcCwgZi0+Y29ubmVjdGlvbik7CisgIHRlc3Rfc2VydmVyX3NodXRkb3duIChmLT5sb29wLCBmLT5zZXJ2ZXIpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9jb25uZWN0aW9uIChGaXh0dXJlICpmLAorICAgIGdjb25zdHBvaW50ZXIgZGF0YSkKK3sKKyAgVGhyZWFkIHB1YmxpY19hcGkgPSB7CisgICAgZiwKKyAgICBmLT5jb25uZWN0aW9uLAorICAgIChSZWZGdW5jKSBkYnVzX2Nvbm5lY3Rpb25fcmVmLAorICAgIE5VTEwsCisgICAgKFZvaWRGdW5jKSBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwgfTsKKyAgVGhyZWFkIGludGVybmFsX2FwaSA9IHsKKyAgICBmLAorICAgIGYtPmNvbm5lY3Rpb24sCisgICAgKFJlZkZ1bmMpIF9kYnVzX2Nvbm5lY3Rpb25fcmVmX3VubG9ja2VkLAorICAgIE5VTEwsCisgICAgKFZvaWRGdW5jKSBfZGJ1c19jb25uZWN0aW9uX3VucmVmX3VubG9ja2VkLAorICAgIGYtPmNvbm5lY3Rpb24sCisgICAgKFZvaWRGdW5jKSBfZGJ1c19jb25uZWN0aW9uX2xvY2ssCisgICAgKFZvaWRGdW5jKSBfZGJ1c19jb25uZWN0aW9uX3VubG9jayB9OworICB1bnNpZ25lZCBpOworCisgIC8qIFVzZSBhIHNsb3QgYXMgYSBwc2V1ZG8td2Vha3JlZiAqLworICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZXRfZGF0YSAoZi0+Y29ubmVjdGlvbiwgY29ubmVjdGlvbl9zbG90LCBmLAorICAgICAgICBsYXN0X3VucmVmKSkKKyAgICBnX2Vycm9yICgiT09NIik7CisKKyAgZm9yIChpID0gMDsgaSA8IGYtPm5fdGhyZWFkczsgaSsrKQorICAgIHsKKyAgICAgIGlmICgoaSAlIDIpID09IDApCisgICAgICAgIGYtPnRocmVhZHNbaV0gPSBnX3RocmVhZF9uZXcgKE5VTEwsIHJlZl90aHJlYWQsICZwdWJsaWNfYXBpKTsKKyAgICAgIGVsc2UKKyAgICAgICAgZi0+dGhyZWFkc1tpXSA9IGdfdGhyZWFkX25ldyAoTlVMTCwgcmVmX3RocmVhZCwgJmludGVybmFsX2FwaSk7CisKKyAgICAgIGdfYXNzZXJ0IChmLT50aHJlYWRzW2ldICE9IE5VTEwpOworICAgIH0KKworICB3YWl0X2Zvcl9hbGxfdGhyZWFkcyAoZik7CisKKyAgZm9yIChpID0gMDsgaSA8IGYtPm5fdGhyZWFkczsgaSsrKQorICAgIHsKKyAgICAgIGlmICgoaSAlIDIpID09IDApCisgICAgICAgIGYtPnRocmVhZHNbaV0gPSBnX3RocmVhZF9uZXcgKE5VTEwsIGN5Y2xlX3RocmVhZCwgJnB1YmxpY19hcGkpOworICAgICAgZWxzZQorICAgICAgICBmLT50aHJlYWRzW2ldID0gZ190aHJlYWRfbmV3IChOVUxMLCBjeWNsZV90aHJlYWQsICZpbnRlcm5hbF9hcGkpOworCisgICAgICBnX2Fzc2VydCAoZi0+dGhyZWFkc1tpXSAhPSBOVUxMKTsKKyAgICB9CisKKyAgd2FpdF9mb3JfYWxsX3RocmVhZHMgKGYpOworCisgIGZvciAoaSA9IDA7IGkgPCBmLT5uX3RocmVhZHM7IGkrKykKKyAgICB7CisgICAgICBpZiAoKGkgJSAyKSA9PSAwKQorICAgICAgICBmLT50aHJlYWRzW2ldID0gZ190aHJlYWRfbmV3IChOVUxMLCB1bnJlZl90aHJlYWQsICZwdWJsaWNfYXBpKTsKKyAgICAgIGVsc2UKKyAgICAgICAgZi0+dGhyZWFkc1tpXSA9IGdfdGhyZWFkX25ldyAoTlVMTCwgdW5yZWZfdGhyZWFkLCAmaW50ZXJuYWxfYXBpKTsKKworICAgICAgZ19hc3NlcnQgKGYtPnRocmVhZHNbaV0gIT0gTlVMTCk7CisgICAgfQorCisgIHdhaXRfZm9yX2FsbF90aHJlYWRzIChmKTsKKworICAvKiBEZXN0cm95IHRoZSBjb25uZWN0aW9uLiBUaGlzIHNob3VsZCBiZSB0aGUgbGFzdC11bnJlZi4gKi8KKyAgZ19hc3NlcnQgKCFmLT5sYXN0X3VucmVmKTsKKyAgZGJ1c19jb25uZWN0aW9uX2Nsb3NlIChmLT5jb25uZWN0aW9uKTsKKyAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChmLT5jb25uZWN0aW9uKTsKKyAgZi0+Y29ubmVjdGlvbiA9IE5VTEw7CisgIGdfYXNzZXJ0IChmLT5sYXN0X3VucmVmKTsKK30KKworc3RhdGljIHZvaWQKK3NlcnZlcl9sb2NrICh2b2lkICpzZXJ2ZXIpCit7CisgIFNFUlZFUl9MT0NLICgoKERCdXNTZXJ2ZXIgKikgc2VydmVyKSk7Cit9CisKK3N0YXRpYyB2b2lkCitzZXJ2ZXJfdW5sb2NrICh2b2lkICpzZXJ2ZXIpCit7CisgIFNFUlZFUl9VTkxPQ0sgKCgoREJ1c1NlcnZlciAqKSBzZXJ2ZXIpKTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3Rfc2VydmVyIChGaXh0dXJlICpmLAorICAgIGdjb25zdHBvaW50ZXIgZGF0YSkKK3sKKyAgVGhyZWFkIHB1YmxpY19hcGkgPSB7CisgICAgZiwKKyAgICBmLT5zZXJ2ZXIsCisgICAgKFJlZkZ1bmMpIGRidXNfc2VydmVyX3JlZiwKKyAgICBOVUxMLAorICAgIChWb2lkRnVuYykgZGJ1c19zZXJ2ZXJfdW5yZWYsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwgfTsKKyAgVGhyZWFkIGludGVybmFsX2FwaSA9IHsKKyAgICBmLAorICAgIGYtPnNlcnZlciwKKyAgICBOVUxMLAorICAgIChWb2lkRnVuYykgX2RidXNfc2VydmVyX3JlZl91bmxvY2tlZCwKKyAgICAoVm9pZEZ1bmMpIF9kYnVzX3NlcnZlcl91bnJlZl91bmxvY2tlZCwKKyAgICBmLT5zZXJ2ZXIsCisgICAgc2VydmVyX2xvY2ssCisgICAgc2VydmVyX3VubG9jayB9OworICB1bnNpZ25lZCBpOworCisgIGlmICghZGJ1c19zZXJ2ZXJfc2V0X2RhdGEgKGYtPnNlcnZlciwgc2VydmVyX3Nsb3QsIGYsIGxhc3RfdW5yZWYpKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKworICBmb3IgKGkgPSAwOyBpIDwgZi0+bl90aHJlYWRzOyBpKyspCisgICAgeworICAgICAgaWYgKChpICUgMikgPT0gMCkKKyAgICAgICAgZi0+dGhyZWFkc1tpXSA9IGdfdGhyZWFkX25ldyAoTlVMTCwgcmVmX3RocmVhZCwgJnB1YmxpY19hcGkpOworICAgICAgZWxzZQorICAgICAgICBmLT50aHJlYWRzW2ldID0gZ190aHJlYWRfbmV3IChOVUxMLCByZWZfdGhyZWFkLCAmaW50ZXJuYWxfYXBpKTsKKworICAgICAgZ19hc3NlcnQgKGYtPnRocmVhZHNbaV0gIT0gTlVMTCk7CisgICAgfQorCisgIHdhaXRfZm9yX2FsbF90aHJlYWRzIChmKTsKKworICBmb3IgKGkgPSAwOyBpIDwgZi0+bl90aHJlYWRzOyBpKyspCisgICAgeworICAgICAgaWYgKChpICUgMikgPT0gMCkKKyAgICAgICAgZi0+dGhyZWFkc1tpXSA9IGdfdGhyZWFkX25ldyAoTlVMTCwgY3ljbGVfdGhyZWFkLCAmcHVibGljX2FwaSk7CisgICAgICBlbHNlCisgICAgICAgIGYtPnRocmVhZHNbaV0gPSBnX3RocmVhZF9uZXcgKE5VTEwsIGN5Y2xlX3RocmVhZCwgJmludGVybmFsX2FwaSk7CisKKyAgICAgIGdfYXNzZXJ0IChmLT50aHJlYWRzW2ldICE9IE5VTEwpOworICAgIH0KKworICB3YWl0X2Zvcl9hbGxfdGhyZWFkcyAoZik7CisKKyAgZm9yIChpID0gMDsgaSA8IGYtPm5fdGhyZWFkczsgaSsrKQorICAgIHsKKyAgICAgIGlmICgoaSAlIDIpID09IDApCisgICAgICAgIGYtPnRocmVhZHNbaV0gPSBnX3RocmVhZF9uZXcgKE5VTEwsIHVucmVmX3RocmVhZCwgJnB1YmxpY19hcGkpOworICAgICAgZWxzZQorICAgICAgICBmLT50aHJlYWRzW2ldID0gZ190aHJlYWRfbmV3IChOVUxMLCB1bnJlZl90aHJlYWQsICZpbnRlcm5hbF9hcGkpOworCisgICAgICBnX2Fzc2VydCAoZi0+dGhyZWFkc1tpXSAhPSBOVUxMKTsKKyAgICB9CisKKyAgd2FpdF9mb3JfYWxsX3RocmVhZHMgKGYpOworCisgIC8qIERlc3Ryb3kgdGhlIHNlcnZlci4gVGhpcyBzaG91bGQgYmUgdGhlIGxhc3QtdW5yZWYuICovCisgIGdfYXNzZXJ0ICghZi0+bGFzdF91bnJlZik7CisgIGRidXNfc2VydmVyX2Rpc2Nvbm5lY3QgKGYtPnNlcnZlcik7CisgIGRidXNfc2VydmVyX3VucmVmIChmLT5zZXJ2ZXIpOworICBmLT5zZXJ2ZXIgPSBOVUxMOworICBnX2Fzc2VydCAoZi0+bGFzdF91bnJlZik7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X21lc3NhZ2UgKEZpeHR1cmUgKmYsCisgICAgZ2NvbnN0cG9pbnRlciBkYXRhKQoreworICBEQnVzTWVzc2FnZSAqbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXdfc2lnbmFsICgiL2ZvbyIsICJmb28uYmFyLmJheiIsCisgICAgICAiRm9vIik7CisgIFRocmVhZCBwdWJsaWNfYXBpID0geworICAgIGYsCisgICAgbWVzc2FnZSwKKyAgICAoUmVmRnVuYykgZGJ1c19tZXNzYWdlX3JlZiwKKyAgICBOVUxMLAorICAgIChWb2lkRnVuYykgZGJ1c19tZXNzYWdlX3VucmVmLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMIH07CisgIHVuc2lnbmVkIGk7CisKKyAgaWYgKCFkYnVzX21lc3NhZ2Vfc2V0X2RhdGEgKG1lc3NhZ2UsIG1lc3NhZ2Vfc2xvdCwgZiwgbGFzdF91bnJlZikpCisgICAgZ19lcnJvciAoIk9PTSIpOworCisgIGZvciAoaSA9IDA7IGkgPCBmLT5uX3RocmVhZHM7IGkrKykKKyAgICB7CisgICAgICBmLT50aHJlYWRzW2ldID0gZ190aHJlYWRfbmV3IChOVUxMLCByZWZfdGhyZWFkLCAmcHVibGljX2FwaSk7CisgICAgICBnX2Fzc2VydCAoZi0+dGhyZWFkc1tpXSAhPSBOVUxMKTsKKyAgICB9CisKKyAgd2FpdF9mb3JfYWxsX3RocmVhZHMgKGYpOworCisgIGZvciAoaSA9IDA7IGkgPCBmLT5uX3RocmVhZHM7IGkrKykKKyAgICB7CisgICAgICBmLT50aHJlYWRzW2ldID0gZ190aHJlYWRfbmV3IChOVUxMLCBjeWNsZV90aHJlYWQsICZwdWJsaWNfYXBpKTsKKyAgICAgIGdfYXNzZXJ0IChmLT50aHJlYWRzW2ldICE9IE5VTEwpOworICAgIH0KKworICB3YWl0X2Zvcl9hbGxfdGhyZWFkcyAoZik7CisKKyAgZm9yIChpID0gMDsgaSA8IGYtPm5fdGhyZWFkczsgaSsrKQorICAgIHsKKyAgICAgIGYtPnRocmVhZHNbaV0gPSBnX3RocmVhZF9uZXcgKE5VTEwsIHVucmVmX3RocmVhZCwgJnB1YmxpY19hcGkpOworICAgICAgZ19hc3NlcnQgKGYtPnRocmVhZHNbaV0gIT0gTlVMTCk7CisgICAgfQorCisgIHdhaXRfZm9yX2FsbF90aHJlYWRzIChmKTsKKworICAvKiBEZXN0cm95IHRoZSBzZXJ2ZXIuIFRoaXMgc2hvdWxkIGJlIHRoZSBsYXN0LXVucmVmLiAqLworICBnX2Fzc2VydCAoIWYtPmxhc3RfdW5yZWYpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICBnX2Fzc2VydCAoZi0+bGFzdF91bnJlZik7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3BlbmRpbmdfY2FsbCAoRml4dHVyZSAqZiwKKyAgICBnY29uc3Rwb2ludGVyIGRhdGEpCit7CisgIFRocmVhZCBwdWJsaWNfYXBpID0geworICAgIGYsCisgICAgTlVMTCwKKyAgICAoUmVmRnVuYykgZGJ1c19wZW5kaW5nX2NhbGxfcmVmLAorICAgIE5VTEwsCisgICAgKFZvaWRGdW5jKSBkYnVzX3BlbmRpbmdfY2FsbF91bnJlZiwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCB9OworICBUaHJlYWQgaW50ZXJuYWxfYXBpID0geworICAgIGYsCisgICAgTlVMTCwKKyAgICAoUmVmRnVuYykgX2RidXNfcGVuZGluZ19jYWxsX3JlZl91bmxvY2tlZCwKKyAgICBOVUxMLAorICAgIChWb2lkRnVuYykgZGJ1c19wZW5kaW5nX2NhbGxfdW5yZWYsCisgICAgZi0+Y29ubmVjdGlvbiwKKyAgICAoVm9pZEZ1bmMpIF9kYnVzX2Nvbm5lY3Rpb25fbG9jaywKKyAgICAoVm9pZEZ1bmMpIF9kYnVzX2Nvbm5lY3Rpb25fdW5sb2NrIH07CisgIC8qIFRoaXMgb25lIGNhbid0IGJlIHVzZWQgdG8gcmVmLCBvbmx5IHRvIGN5Y2xlIG9yIHVucmVmLiAqLworICBUaHJlYWQgdW5yZWZfYW5kX3VubG9ja19hcGkgPSB7CisgICAgZiwKKyAgICBOVUxMLAorICAgIChSZWZGdW5jKSBfZGJ1c19wZW5kaW5nX2NhbGxfcmVmX3VubG9ja2VkLAorICAgIE5VTEwsCisgICAgKFZvaWRGdW5jKSBfZGJ1c19wZW5kaW5nX2NhbGxfdW5yZWZfYW5kX3VubG9jaywKKyAgICBmLT5jb25uZWN0aW9uLAorICAgIChWb2lkRnVuYykgX2RidXNfY29ubmVjdGlvbl9sb2NrLAorICAgIE5VTEwgfTsKKyAgdW5zaWduZWQgaTsKKyAgREJ1c1BlbmRpbmdDYWxsICpwZW5kaW5nX2NhbGw7CisKKyAgX2RidXNfY29ubmVjdGlvbl9sb2NrIChmLT5jb25uZWN0aW9uKTsKKyAgcGVuZGluZ19jYWxsID0gX2RidXNfcGVuZGluZ19jYWxsX25ld191bmxvY2tlZCAoZi0+Y29ubmVjdGlvbiwKKyAgICAgIERCVVNfVElNRU9VVF9JTkZJTklURSwgTlVMTCk7CisgIGdfYXNzZXJ0IChwZW5kaW5nX2NhbGwgIT0gTlVMTCk7CisgIF9kYnVzX2Nvbm5lY3Rpb25fdW5sb2NrIChmLT5jb25uZWN0aW9uKTsKKworICBwdWJsaWNfYXBpLnRoaW5nID0gcGVuZGluZ19jYWxsOworICBpbnRlcm5hbF9hcGkudGhpbmcgPSBwZW5kaW5nX2NhbGw7CisgIHVucmVmX2FuZF91bmxvY2tfYXBpLnRoaW5nID0gcGVuZGluZ19jYWxsOworCisgIGlmICghZGJ1c19wZW5kaW5nX2NhbGxfc2V0X2RhdGEgKHBlbmRpbmdfY2FsbCwgcGVuZGluZ19jYWxsX3Nsb3QsIGYsCisgICAgICAgIGxhc3RfdW5yZWYpKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKworICBmb3IgKGkgPSAwOyBpIDwgZi0+bl90aHJlYWRzOyBpKyspCisgICAgeworICAgICAgaWYgKChpICUgMikgPT0gMCkKKyAgICAgICAgZi0+dGhyZWFkc1tpXSA9IGdfdGhyZWFkX25ldyAoTlVMTCwgcmVmX3RocmVhZCwgJnB1YmxpY19hcGkpOworICAgICAgZWxzZQorICAgICAgICBmLT50aHJlYWRzW2ldID0gZ190aHJlYWRfbmV3IChOVUxMLCByZWZfdGhyZWFkLCAmaW50ZXJuYWxfYXBpKTsKKworICAgICAgZ19hc3NlcnQgKGYtPnRocmVhZHNbaV0gIT0gTlVMTCk7CisgICAgfQorCisgIHdhaXRfZm9yX2FsbF90aHJlYWRzIChmKTsKKworICBmb3IgKGkgPSAwOyBpIDwgZi0+bl90aHJlYWRzOyBpKyspCisgICAgeworICAgICAgc3dpdGNoIChpICUgMykKKyAgICAgICAgeworICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIGYtPnRocmVhZHNbaV0gPSBnX3RocmVhZF9uZXcgKE5VTEwsIGN5Y2xlX3RocmVhZCwgJnB1YmxpY19hcGkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgZi0+dGhyZWFkc1tpXSA9IGdfdGhyZWFkX25ldyAoTlVMTCwgY3ljbGVfdGhyZWFkLCAmaW50ZXJuYWxfYXBpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBmLT50aHJlYWRzW2ldID0gZ190aHJlYWRfbmV3IChOVUxMLCBjeWNsZV90aHJlYWQsCisgICAgICAgICAgICAgICAgJnVucmVmX2FuZF91bmxvY2tfYXBpKTsKKyAgICAgICAgfQorCisgICAgICBnX2Fzc2VydCAoZi0+dGhyZWFkc1tpXSAhPSBOVUxMKTsKKyAgICB9CisKKyAgd2FpdF9mb3JfYWxsX3RocmVhZHMgKGYpOworCisgIGZvciAoaSA9IDA7IGkgPCBmLT5uX3RocmVhZHM7IGkrKykKKyAgICB7CisgICAgICBzd2l0Y2ggKGkgJSAzKQorICAgICAgICB7CisgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgZi0+dGhyZWFkc1tpXSA9IGdfdGhyZWFkX25ldyAoTlVMTCwgdW5yZWZfdGhyZWFkLCAmcHVibGljX2FwaSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBmLT50aHJlYWRzW2ldID0gZ190aHJlYWRfbmV3IChOVUxMLCB1bnJlZl90aHJlYWQsICZpbnRlcm5hbF9hcGkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGYtPnRocmVhZHNbaV0gPSBnX3RocmVhZF9uZXcgKE5VTEwsIHVucmVmX3RocmVhZCwKKyAgICAgICAgICAgICAgICAmdW5yZWZfYW5kX3VubG9ja19hcGkpOworICAgICAgICB9CisKKyAgICAgIGdfYXNzZXJ0IChmLT50aHJlYWRzW2ldICE9IE5VTEwpOworICAgIH0KKworICB3YWl0X2Zvcl9hbGxfdGhyZWFkcyAoZik7CisKKyAgLyogRGVzdHJveSB0aGUgcGVuZGluZyBjYWxsLiBUaGlzIHNob3VsZCBiZSB0aGUgbGFzdC11bnJlZi4gKi8KKyAgZ19hc3NlcnQgKCFmLT5sYXN0X3VucmVmKTsKKyAgZGJ1c19wZW5kaW5nX2NhbGxfdW5yZWYgKHBlbmRpbmdfY2FsbCk7CisgIGdfYXNzZXJ0IChmLT5sYXN0X3VucmVmKTsKK30KKworc3RhdGljIHZvaWQKK3RlYXJkb3duIChGaXh0dXJlICpmLAorICAgIGdjb25zdHBvaW50ZXIgZGF0YSkKK3sKKyAgaWYgKGYtPnNlcnZlcl9jb25uZWN0aW9uICE9IE5VTEwpCisgICAgeworICAgICAgZGJ1c19jb25uZWN0aW9uX2Nsb3NlIChmLT5zZXJ2ZXJfY29ubmVjdGlvbik7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGYtPnNlcnZlcl9jb25uZWN0aW9uKTsKKyAgICB9CisKKyAgaWYgKGYtPmNvbm5lY3Rpb24gIT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fY2xvc2UgKGYtPmNvbm5lY3Rpb24pOworICAgICAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChmLT5jb25uZWN0aW9uKTsKKyAgICB9CisKKyAgaWYgKGYtPnNlcnZlciAhPSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfc2VydmVyX2Rpc2Nvbm5lY3QgKGYtPnNlcnZlcik7CisgICAgICBkYnVzX3NlcnZlcl91bnJlZiAoZi0+c2VydmVyKTsKKyAgICB9CisKKyAgZGJ1c19jb25uZWN0aW9uX2ZyZWVfZGF0YV9zbG90ICgmY29ubmVjdGlvbl9zbG90KTsKKyAgZGJ1c19zZXJ2ZXJfZnJlZV9kYXRhX3Nsb3QgKCZzZXJ2ZXJfc2xvdCk7CisgIGRidXNfbWVzc2FnZV9mcmVlX2RhdGFfc2xvdCAoJm1lc3NhZ2Vfc2xvdCk7CisgIGRidXNfcGVuZGluZ19jYWxsX2ZyZWVfZGF0YV9zbG90ICgmcGVuZGluZ19jYWxsX3Nsb3QpOworCisgIF9kYnVzX2xvb3BfdW5yZWYgKGYtPmxvb3ApOworICBkYnVzX2Vycm9yX2ZyZWUgKCZmLT5lKTsKK30KKworaW50CittYWluIChpbnQgYXJnYywKKyAgICBjaGFyICoqYXJndikKK3sKKyAgdGVzdF9pbml0ICgmYXJnYywgJmFyZ3YpOworCisgIGdfdGVzdF9hZGQgKCIvcmVmcy9jb25uZWN0aW9uIiwgRml4dHVyZSwgTlVMTCwgc2V0dXBfY29ubmVjdGlvbiwKKyAgICAgIHRlc3RfY29ubmVjdGlvbiwgdGVhcmRvd24pOworICBnX3Rlc3RfYWRkICgiL3JlZnMvbWVzc2FnZSIsIEZpeHR1cmUsIE5VTEwsIHNldHVwLAorICAgICAgdGVzdF9tZXNzYWdlLCB0ZWFyZG93bik7CisgIGdfdGVzdF9hZGQgKCIvcmVmcy9wZW5kaW5nLWNhbGwiLCBGaXh0dXJlLCBOVUxMLCBzZXR1cF9jb25uZWN0aW9uLAorICAgICAgdGVzdF9wZW5kaW5nX2NhbGwsIHRlYXJkb3duKTsKKyAgZ190ZXN0X2FkZCAoIi9yZWZzL3NlcnZlciIsIEZpeHR1cmUsIE5VTEwsIHNldHVwLAorICAgICAgdGVzdF9zZXJ2ZXIsIHRlYXJkb3duKTsKKworICByZXR1cm4gZ190ZXN0X3J1biAoKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvaW50ZXJuYWxzL3NlcnZlci1vb20uYyBiL3Rlc3QvaW50ZXJuYWxzL3NlcnZlci1vb20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzNhYjA1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9pbnRlcm5hbHMvc2VydmVyLW9vbS5jCkBAIC0wLDAgKzEsMTQwIEBACisvKiBUYXJnZXRlZCB1bml0IHRlc3RzIGZvciBPT00gcGF0aHMgaW4gREJ1c1NlcnZlcgorICoKKyAqIENvcHlyaWdodCDCqSAyMDE3IENvbGxhYm9yYSBMdGQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzCisgKiAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLAorICogaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwKKyAqIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsCisgKiBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAorICogc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKKyAqIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxnbGliLmg+CisKKyNpbmNsdWRlIDxkYnVzL2RidXMuaD4KKyNpbmNsdWRlICJkYnVzL2RidXMtaW50ZXJuYWxzLmgiCisjaW5jbHVkZSAiZGJ1cy9kYnVzLXBpcGUuaCIKKyNpbmNsdWRlICJkYnVzL2RidXMtc2VydmVyLXNvY2tldC5oIgorI2luY2x1ZGUgInRlc3QtdXRpbHMtZ2xpYi5oIgorCisvKiBSZXR1cm4gVFJVRSBpZiB0aGUgcmlnaHQgdGhpbmcgaGFwcGVucywgYnV0IHRoZSByaWdodCB0aGluZyBtaWdodCBpbmNsdWRlCisgKiBPT00uICovCitzdGF0aWMgZGJ1c19ib29sX3QKK3Rlc3RfbmV3X3NlcnZlciAodm9pZCAqdXNlcl9kYXRhKQoreworICBjb25zdCBjaGFyICpsaXN0ZW5fYWRkcmVzcyA9IHVzZXJfZGF0YTsKKyAgREJ1c0Vycm9yIGVycm9yID0gREJVU19FUlJPUl9JTklUOworICBEQnVzU2VydmVyICpzZXJ2ZXIgPSBOVUxMOworICBkYnVzX2Jvb2xfdCByZXN1bHQgPSBGQUxTRTsKKworICBzZXJ2ZXIgPSBkYnVzX3NlcnZlcl9saXN0ZW4gKGxpc3Rlbl9hZGRyZXNzLCAmZXJyb3IpOworCisgIGlmIChzZXJ2ZXIgPT0gTlVMTCkKKyAgICBnb3RvIG91dDsKKworICByZXN1bHQgPSBUUlVFOworCitvdXQ6CisgIGlmIChyZXN1bHQpCisgICAgeworICAgICAgdGVzdF9hc3NlcnRfbm9fZXJyb3IgKCZlcnJvcik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZ19hc3NlcnRfY21wc3RyIChlcnJvci5uYW1lLCA9PSwgREJVU19FUlJPUl9OT19NRU1PUlkpOworICAgICAgcmVzdWx0ID0gVFJVRTsKKyAgICB9CisKKyAgaWYgKHNlcnZlciAhPSBOVUxMKQorICAgIGRidXNfc2VydmVyX2Rpc2Nvbm5lY3QgKHNlcnZlcik7CisKKyAgZGJ1c19jbGVhcl9zZXJ2ZXIgKCZzZXJ2ZXIpOworICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgY29uc3QgZ2NoYXIgKm5hbWU7CisgIERCdXNUZXN0TWVtb3J5RnVuY3Rpb24gZnVuY3Rpb247CisgIGNvbnN0IHZvaWQgKmRhdGE7Cit9IE9PTVRlc3RDYXNlOworCitzdGF0aWMgdm9pZAordGVzdF9vb21fd3JhcHBlciAoZ2NvbnN0cG9pbnRlciBkYXRhKQoreworICBjb25zdCBPT01UZXN0Q2FzZSAqdGVzdCA9IGRhdGE7CisKKyAgaWYgKChnX3N0cl9oYXNfcHJlZml4ICh0ZXN0LT5kYXRhLCAidGNwOiIpIHx8CisgICAgICAgZ19zdHJfaGFzX3ByZWZpeCAodGVzdC0+ZGF0YSwgIm5vbmNlLXRjcDoiKSkgJiYKKyAgICAgICF0ZXN0X2NoZWNrX3RjcF93b3JrcyAoKSkKKyAgICByZXR1cm47CisKKyAgaWYgKCFfZGJ1c190ZXN0X29vbV9oYW5kbGluZyAodGVzdC0+bmFtZSwgdGVzdC0+ZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopIHRlc3QtPmRhdGEpKQorICAgIHsKKyAgICAgIGdfdGVzdF9tZXNzYWdlICgiT09NIHRlc3QgZmFpbGVkIik7CisgICAgICBnX3Rlc3RfZmFpbCAoKTsKKyAgICB9Cit9CisKK3N0YXRpYyBHUXVldWUgKnRlc3RfY2FzZXNfdG9fZnJlZSA9IE5VTEw7CisKK3N0YXRpYyB2b2lkCithZGRfb29tX3Rlc3QgKGNvbnN0IGdjaGFyICpuYW1lLAorICAgICAgICAgICAgICBEQnVzVGVzdE1lbW9yeUZ1bmN0aW9uIGZ1bmN0aW9uLAorICAgICAgICAgICAgICBjb25zdCB2b2lkICpkYXRhKQoreworICAvKiBCeSB1c2luZyBHTGliIG1lbW9yeSBhbGxvY2F0aW9uIGhlcmUsIHdlIGF2b2lkIGJlaW5nIGFmZmVjdGVkIGJ5CisgICAqIGRidXNfc2h1dGRvd24oKSBvciBjb250cmlidXRpbmcgdG8KKyAgICogX2RidXNfZ2V0X21hbGxvY19ibG9ja3Nfb3V0c3RhbmRpbmcoKSAqLworICBPT01UZXN0Q2FzZSAqdGVzdF9jYXNlID0gZ19uZXcwIChPT01UZXN0Q2FzZSwgMSk7CisKKyAgdGVzdF9jYXNlLT5uYW1lID0gbmFtZTsKKyAgdGVzdF9jYXNlLT5mdW5jdGlvbiA9IGZ1bmN0aW9uOworICB0ZXN0X2Nhc2UtPmRhdGEgPSBkYXRhOworICBnX3Rlc3RfYWRkX2RhdGFfZnVuYyAobmFtZSwgdGVzdF9jYXNlLCB0ZXN0X29vbV93cmFwcGVyKTsKKyAgZ19xdWV1ZV9wdXNoX3RhaWwgKHRlc3RfY2FzZXNfdG9fZnJlZSwgdGVzdF9jYXNlKTsKK30KKworaW50CittYWluIChpbnQgYXJnYywKKyAgICAgIGNoYXIgKiphcmd2KQoreworICBpbnQgcmV0OworCisgIHRlc3RfaW5pdCAoJmFyZ2MsICZhcmd2KTsKKworICB0ZXN0X2Nhc2VzX3RvX2ZyZWUgPSBnX3F1ZXVlX25ldyAoKTsKKyAgYWRkX29vbV90ZXN0ICgiL3NlcnZlci9uZXctdGNwIiwgdGVzdF9uZXdfc2VydmVyLCAidGNwOmhvc3Q9MTI3LjAuMC4xLGJpbmQ9MTI3LjAuMC4xIik7CisgIGFkZF9vb21fdGVzdCAoIi9zZXJ2ZXIvbmV3LW5vbmNlLXRjcCIsIHRlc3RfbmV3X3NlcnZlciwgIm5vbmNlLXRjcDpob3N0PTEyNy4wLjAuMSxiaW5kPTEyNy4wLjAuMSIpOworICBhZGRfb29tX3Rlc3QgKCIvc2VydmVyL25ldy10Y3Atc3RhciIsIHRlc3RfbmV3X3NlcnZlciwgInRjcDpob3N0PTEyNy4wLjAuMSxiaW5kPSoiKTsKKyAgYWRkX29vbV90ZXN0ICgiL3NlcnZlci9uZXctdGNwLXY0IiwgdGVzdF9uZXdfc2VydmVyLCAidGNwOmhvc3Q9MTI3LjAuMC4xLGJpbmQ9MTI3LjAuMC4xLGZhbWlseT1pcHY0Iik7CisjaWZkZWYgREJVU19VTklYCisgIGFkZF9vb21fdGVzdCAoIi9zZXJ2ZXIvdW5peCIsIHRlc3RfbmV3X3NlcnZlciwgInVuaXg6dG1wZGlyPS90bXAiKTsKKyNlbmRpZgorCisgIHJldCA9IGdfdGVzdF9ydW4gKCk7CisKKyAgZ19xdWV1ZV9mcmVlX2Z1bGwgKHRlc3RfY2FzZXNfdG9fZnJlZSwgZ19mcmVlKTsKKyAgcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvaW50ZXJuYWxzL3N5c2xvZy5jIGIvdGVzdC9pbnRlcm5hbHMvc3lzbG9nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5YzE0YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvaW50ZXJuYWxzL3N5c2xvZy5jCkBAIC0wLDAgKzEsMTExIEBACisvKiBNYW51YWwgcmVncmVzc2lvbiB0ZXN0IGZvciBzeXNsb2cgc3VwcG9ydAorICoKKyAqIEF1dGhvcjogU2ltb24gTWNWaXR0aWUgPHNpbW9uLm1jdml0dGllQGNvbGxhYm9yYS5jby51az4KKyAqIENvcHlyaWdodCDCqSAyMDExIE5va2lhIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzCisgKiAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLAorICogaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwKKyAqIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsCisgKiBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAorICogc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKKyAqIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlIDxnbGliLmg+CisKKyNpbmNsdWRlIDxkYnVzL2RidXMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc3lzZGVwcy5oPgorCisjaW5jbHVkZSAidGVzdC11dGlscy1nbGliLmgiCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgZHVtbXk7Cit9IEZpeHR1cmU7CisKK3N0YXRpYyB2b2lkCitzZXR1cCAoRml4dHVyZSAqZiwKKyAgICBnY29uc3Rwb2ludGVyIGRhdGEpCit7Cit9CisKKy8qIGhvcGVmdWxseSBjbGVhciBlbm91Z2ggdGhhdCBwZW9wbGUgZG9uJ3QgdGhpbmsgdGhlc2UgbWVzc2FnZXMgaW4gc3lzbG9nCisgKiBhcmUgYSBidWcgKi8KKyNkZWZpbmUgTUVTU0FHRSAicmVncmVzc2lvbiB0ZXN0IGZvciBfZGJ1c19sb2coKTogIgorCitzdGF0aWMgdm9pZAordGVzdF9zeXNsb2dfbm9ybWFsIChGaXh0dXJlICpmLAorICAgIGdjb25zdHBvaW50ZXIgZGF0YSkKK3sKKyAgaWYgKGdfdGVzdF9zdWJwcm9jZXNzICgpKQorICAgIHsKKyAgICAgIF9kYnVzX2luaXRfc3lzdGVtX2xvZyAoInRlc3Qtc3lzbG9nIiwKKyAgICAgICAgICBEQlVTX0xPR19GTEFHU19TWVNURU1fTE9HIHwgREJVU19MT0dfRkxBR1NfU1RERVJSKTsKKyAgICAgIF9kYnVzX2xvZyAoREJVU19TWVNURU1fTE9HX0lORk8sIE1FU1NBR0UgIiVkIiwgNDIpOworICAgICAgX2RidXNfbG9nIChEQlVTX1NZU1RFTV9MT0dfV0FSTklORywgTUVTU0FHRSAiJWQiLCA0NSk7CisgICAgICBfZGJ1c19sb2cgKERCVVNfU1lTVEVNX0xPR19TRUNVUklUWSwgTUVTU0FHRSAiJWQiLCA2NjYpOworICAgICAgX2RidXNfbG9nIChEQlVTX1NZU1RFTV9MT0dfRVJST1IsIE1FU1NBR0UgIiVkIiwgMjMpOworCisgICAgICBfZGJ1c19pbml0X3N5c3RlbV9sb2cgKCJ0ZXN0LXN5c2xvZy1zdGRlcnIiLCBEQlVTX0xPR19GTEFHU19TVERFUlIpOworICAgICAgX2RidXNfbG9nIChEQlVTX1NZU1RFTV9MT0dfSU5GTywKKyAgICAgICAgICBNRVNTQUdFICJ0aGlzIHNob3VsZCBub3QgYXBwZWFyIGluIHRoZSBzeXNsb2ciKTsKKyAgICAgIF9kYnVzX2luaXRfc3lzdGVtX2xvZyAoInRlc3Qtc3lzbG9nLWJvdGgiLAorICAgICAgICAgIERCVVNfTE9HX0ZMQUdTX1NZU1RFTV9MT0cgfCBEQlVTX0xPR19GTEFHU19TVERFUlIpOworICAgICAgX2RidXNfbG9nIChEQlVTX1NZU1RFTV9MT0dfSU5GTywKKyAgICAgICAgICBNRVNTQUdFICJ0aGlzIHNob3VsZCBhcHBlYXIgaW4gdGhlIHN5c2xvZyBhbmQgb24gc3RkZXJyIik7CisgICAgICBfZGJ1c19pbml0X3N5c3RlbV9sb2cgKCJ0ZXN0LXN5c2xvZy1vbmx5IiwgREJVU19MT0dfRkxBR1NfU1lTVEVNX0xPRyk7CisgICAgICBfZGJ1c19sb2cgKERCVVNfU1lTVEVNX0xPR19JTkZPLAorICAgICAgICAgIE1FU1NBR0UgInRoaXMgc2hvdWxkIGFwcGVhciBpbiB0aGUgc3lzbG9nIG9ubHkiKTsKKworICAgICAgZXhpdCAoMCk7CisgICAgfQorCisgIGdfdGVzdF90cmFwX3N1YnByb2Nlc3MgKE5VTEwsIDAsIDApOworICBnX3Rlc3RfdHJhcF9hc3NlcnRfcGFzc2VkICgpOworICBnX3Rlc3RfdHJhcF9hc3NlcnRfc3RkZXJyICgiKiIgTUVTU0FHRSAiNDJcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIioiIE1FU1NBR0UgIjQ1XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIqIiBNRVNTQUdFICI2NjZcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIioiIE1FU1NBR0UgIjIzXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIqdGVzdC1zeXNsb2ctc3RkZXJyKiIgTUVTU0FHRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHNob3VsZCBub3QgYXBwZWFyIGluIHRoZSBzeXNsb2dcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIip0ZXN0LXN5c2xvZy1ib3RoKiIgTUVTU0FHRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHNob3VsZCBhcHBlYXIgaW4gdGhlIHN5c2xvZyBhbmQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvbiBzdGRlcnJcbiIpOworICBnX3Rlc3RfdHJhcF9hc3NlcnRfc3RkZXJyX3VubWF0Y2hlZCAoIip0aGlzIHNob3VsZCBhcHBlYXIgaW4gdGhlIHN5c2xvZyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib25seSoiKTsKKyAgZ190ZXN0X3RyYXBfYXNzZXJ0X3N0ZGVycl91bm1hdGNoZWQgKCIqdGVzdC1zeXNsb2ctb25seSoiKTsKK30KKworc3RhdGljIHZvaWQKK3RlYXJkb3duIChGaXh0dXJlICpmLAorICAgIGdjb25zdHBvaW50ZXIgZGF0YSkKK3sKK30KKworaW50CittYWluIChpbnQgYXJnYywKKyAgICBjaGFyICoqYXJndikKK3sKKyAgdGVzdF9pbml0ICgmYXJnYywgJmFyZ3YpOworCisgIGdfdGVzdF9hZGQgKCIvc3lzbG9nL25vcm1hbCIsIEZpeHR1cmUsIE5VTEwsIHNldHVwLCB0ZXN0X3N5c2xvZ19ub3JtYWwsCisgICAgICAgICAgICAgIHRlYXJkb3duKTsKKworICByZXR1cm4gZ190ZXN0X3J1biAoKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvaW50ZXJuYWxzL3ZhcmlhbnQuYyBiL3Rlc3QvaW50ZXJuYWxzL3ZhcmlhbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2I2MzNiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9pbnRlcm5hbHMvdmFyaWFudC5jCkBAIC0wLDAgKzEsNTcyIEBACisvKiBSZWdyZXNzaW9uIHRlc3QgZm9yIERCdXNWYXJpYW50CisgKgorICogQ29weXJpZ2h0IMKpIDIwMTcgQ29sbGFib3JhIEx0ZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMKKyAqICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sCisgKiBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLAorICogcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwKKyAqIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCisgKiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQorICogaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGdsaWIuaD4KKyNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWludGVybmFscy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zdHJpbmcuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbWVzc2FnZS1pbnRlcm5hbC5oPgorI2luY2x1ZGUgInRlc3QtdXRpbHMtZ2xpYi5oIgorCit0eXBlZGVmIHN0cnVjdAoreworICBEQnVzTWVzc2FnZSAqb3JpZ2luYWw7CisgIERCdXNNZXNzYWdlICpjb3B5OworfSBGaXh0dXJlOworCisvKiBSZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBPT00sIGFib3J0IG9uIGZhaWx1cmUuICovCitzdGF0aWMgZ2Jvb2xlYW4KK3NldHVwIChGaXh0dXJlICpmKQoreworICBkYnVzX2ludDMyX3QgZm9ydHl0d28gPSA0MjsKKyAgZGJ1c19pbnQ2NF90IHR3ZW50eXRocmVlID0gMjM7CisgIGNvbnN0IGNoYXIgKnMgPSAiSGVsbG8sIHdvcmxkISI7CisgIERCdXNNZXNzYWdlSXRlciBpdGVyOworICBEQnVzTWVzc2FnZUl0ZXIgYXJyX2l0ZXI7CisgIERCdXNNZXNzYWdlSXRlciBzdHJ1Y3RfaXRlcjsKKyAgREJ1c01lc3NhZ2VJdGVyIHBhaXJfaXRlcjsKKworICBmLT5vcmlnaW5hbCA9IGRidXNfbWVzc2FnZV9uZXdfc2lnbmFsICgiLyIsICJhLmIiLCAiYyIpOworCisgIGlmIChmLT5vcmlnaW5hbCA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKworICAvKiBJdCBlbmRzIHVwIGFzOgorICAgKiAoCisgICAqICBpbnQzMiA0MiwKKyAgICogICJIZWxsbywgd29ybGQhIiwKKyAgICogIGludDY0IDIzLAorICAgKiAgW2ludDMyIDQyLCBpbnQzMiA0Ml0sCisgICAqICAoaW50MzIgNDIsICJIZWxsbywgd29ybGQhIiwgaW50NjQgMjMpLAorICAgKiAge2ludDMyIDQyOiBpbnQ2NCAyM30sCisgICAqICkKKyAgICovCisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKGYtPm9yaWdpbmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVDMyLCAmZm9ydHl0d28sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlQ2NCwgJnR3ZW50eXRocmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgIHJldHVybiBGQUxTRTsKKworICBkYnVzX21lc3NhZ2VfaXRlcl9pbml0X2FwcGVuZCAoZi0+b3JpZ2luYWwsICZpdGVyKTsKKworICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX29wZW5fY29udGFpbmVyICgmaXRlciwgREJVU19UWVBFX0FSUkFZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5UMzJfQVNfU1RSSU5HLCAmYXJyX2l0ZXIpKQorICAgIHJldHVybiBGQUxTRTsKKworICB7CisgICAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfYmFzaWMgKCZhcnJfaXRlciwgREJVU19UWVBFX0lOVDMyLCAmZm9ydHl0d28pIHx8CisgICAgICAgICFkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfYmFzaWMgKCZhcnJfaXRlciwgREJVU19UWVBFX0lOVDMyLCAmZm9ydHl0d28pKQorICAgICAgeworICAgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9hYmFuZG9uX2NvbnRhaW5lciAoJml0ZXIsICZhcnJfaXRlcik7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgfQorCisgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfY2xvc2VfY29udGFpbmVyICgmaXRlciwgJmFycl9pdGVyKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9vcGVuX2NvbnRhaW5lciAoJml0ZXIsIERCVVNfVFlQRV9TVFJVQ1QsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHJ1Y3RfaXRlcikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHsKKyAgICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYyAoJnN0cnVjdF9pdGVyLCBEQlVTX1RZUEVfSU5UMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmb3J0eXR3bykgfHwKKyAgICAgICAgIWRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYyAoJnN0cnVjdF9pdGVyLCBEQlVTX1RZUEVfU1RSSU5HLCAmcykgfHwKKyAgICAgICAgIWRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYyAoJnN0cnVjdF9pdGVyLCBEQlVTX1RZUEVfSU5UNjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0d2VudHl0aHJlZSkpCisgICAgICB7CisgICAgICAgIGRidXNfbWVzc2FnZV9pdGVyX2FiYW5kb25fY29udGFpbmVyICgmaXRlciwgJnN0cnVjdF9pdGVyKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQorICB9CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9jbG9zZV9jb250YWluZXIgKCZpdGVyLCAmc3RydWN0X2l0ZXIpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX29wZW5fY29udGFpbmVyICgmaXRlciwgREJVU19UWVBFX0FSUkFZLCAie2l4fSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhcnJfaXRlcikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHsKKyAgICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX29wZW5fY29udGFpbmVyICgmYXJyX2l0ZXIsIERCVVNfVFlQRV9ESUNUX0VOVFJZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICZwYWlyX2l0ZXIpKQorICAgICAgeworICAgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9hYmFuZG9uX2NvbnRhaW5lciAoJml0ZXIsICZhcnJfaXRlcik7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKworICAgIHsKKyAgICAgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljICgmcGFpcl9pdGVyLCBEQlVTX1RZUEVfSU5UMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZvcnR5dHdvKSB8fAorICAgICAgICAgICFkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfYmFzaWMgKCZwYWlyX2l0ZXIsIERCVVNfVFlQRV9JTlQ2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHdlbnR5dGhyZWUpKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfYWJhbmRvbl9jb250YWluZXIgKCZhcnJfaXRlciwgJnBhaXJfaXRlcik7CisgICAgICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfYWJhbmRvbl9jb250YWluZXIgKCZpdGVyLCAmYXJyX2l0ZXIpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfY2xvc2VfY29udGFpbmVyICgmYXJyX2l0ZXIsICZwYWlyX2l0ZXIpKQorICAgICAgeworICAgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9hYmFuZG9uX2NvbnRhaW5lciAoJml0ZXIsICZhcnJfaXRlcik7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgfQorCisgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfY2xvc2VfY29udGFpbmVyICgmaXRlciwgJmFycl9pdGVyKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIEFzc2VydCB0aGF0IGl0ZW1faXRlciBwb2ludHMgdG8gYW4gaW50MzIgZXF1YWwgdG8gZXhwZWN0ZWRfdmFsdWUuCisgKiBDb3B5IGl0IGludG8gYSBEQnVzVmFyaWFudCBhbmQgYXNzZXJ0IHRoYXQgdGhlIGNvcHkgaXMgZG9uZSBjb3JyZWN0bHkuCisgKiBSZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBpZiBsaWJkYnVzIHByZXRlbmRzIHRvIHJ1biBvdXQgb2YgbWVtb3J5LAorICogb3IgYWJvcnQgb24gZmFpbHVyZS4gKi8KK3N0YXRpYyBnYm9vbGVhbgorYXNzZXJ0X2ludDMyIChEQnVzTWVzc2FnZUl0ZXIgKml0ZW1faXRlciwKKyAgICAgICAgICAgICAgZGJ1c19pbnQzMl90IGV4cGVjdGVkX3ZhbHVlKQoreworICBEQnVzVmFyaWFudCAqdjsKKyAgY29uc3QgREJ1c1N0cmluZyAqczsKKyAgY29uc3Qgdm9pZCAqdmFsdWVfcDsKKyAgZGJ1c19pbnQzMl90IHZhbHVlOworCisgIGdfYXNzZXJ0X2NtcGludCAoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2FyZ190eXBlIChpdGVtX2l0ZXIpLCA9PSwKKyAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5UMzIpOworICBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYmFzaWMgKGl0ZW1faXRlciwgJnZhbHVlKTsKKyAgZ19hc3NlcnRfY21waW50ICh2YWx1ZSwgPT0sIGV4cGVjdGVkX3ZhbHVlKTsKKworICB2ID0gX2RidXNfdmFyaWFudF9yZWFkIChpdGVtX2l0ZXIpOworCisgIGlmICh2ID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHMgPSBfZGJ1c192YXJpYW50X3BlZWsgKHYpOworICBnX2Fzc2VydCAocyAhPSBOVUxMKTsKKyAgZ19hc3NlcnRfY21wc3RyIChfZGJ1c192YXJpYW50X2dldF9zaWduYXR1cmUgKHYpLCA9PSwKKyAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5UMzJfQVNfU1RSSU5HKTsKKworICAvKiBWYXJpYW50IHNlcmlhbGl6YXRpb24gb2YgPGludDMyIHNvbWV0aGluZz4gYXQgb2Zmc2V0IDA6CisgICAqIDAxICdpJyAwMCAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZQorICAgKiAgICAgICAgICAgMDAgICAgICAgICAgICAgICBwYWRkaW5nCisgICAqICAgICAgICAgICAgICAgdnYgdnYgdnYgdnYgIGJ5dGVzIG9mIHZhbHVlCisgICAqLworICBnX2Fzc2VydF9jbXBpbnQgKF9kYnVzX3ZhcmlhbnRfZ2V0X2xlbmd0aCAodiksID09LCA4KTsKKyAgZ19hc3NlcnRfY21waW50IChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAocyksID09LCA4KTsKKyAgZ19hc3NlcnRfY21waW50IChfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKHMsIDApLCA9PSwgMSk7CisgIGdfYXNzZXJ0X2NtcGludCAoX2RidXNfc3RyaW5nX2dldF9ieXRlIChzLCAxKSwgPT0sIERCVVNfVFlQRV9JTlQzMik7CisgIGdfYXNzZXJ0X2NtcGludCAoX2RidXNfc3RyaW5nX2dldF9ieXRlIChzLCAyKSwgPT0sICdcMCcpOworICBnX2Fzc2VydF9jbXBpbnQgKF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAocywgMyksID09LCAwKTsgLyogcGFkZGluZyAqLworICB2YWx1ZV9wID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhX2xlbiAocywgNCwgNCk7CisgIG1lbWNweSAoJnZhbHVlLCB2YWx1ZV9wLCA0KTsKKyAgZ19hc3NlcnRfY21waW50ICh2YWx1ZSwgPT0sIGV4cGVjdGVkX3ZhbHVlKTsKKworICBfZGJ1c192YXJpYW50X2ZyZWUgKHYpOworICByZXR1cm4gVFJVRTsKK30KKworLyogQXNzZXJ0IHRoYXQgaXRlbV9pdGVyIHBvaW50cyB0byBhbiBpbnQ2NCBlcXVhbCB0byBleHBlY3RlZF92YWx1ZS4KKyAqIENvcHkgaXQgaW50byBhIERCdXNWYXJpYW50IGFuZCBhc3NlcnQgdGhhdCB0aGUgY29weSBpcyBkb25lIGNvcnJlY3RseS4KKyAqIFJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIGlmIGxpYmRidXMgcHJldGVuZHMgdG8gcnVuIG91dCBvZiBtZW1vcnksCisgKiBvciBhYm9ydCBvbiBmYWlsdXJlLiAqLworc3RhdGljIGdib29sZWFuCithc3NlcnRfaW50NjQgKERCdXNNZXNzYWdlSXRlciAqaXRlbV9pdGVyLAorICAgICAgICAgICAgICBkYnVzX2ludDY0X3QgZXhwZWN0ZWRfdmFsdWUpCit7CisgIERCdXNWYXJpYW50ICp2OworICBjb25zdCBEQnVzU3RyaW5nICpzOworICBjb25zdCB2b2lkICp2YWx1ZV9wOworICBkYnVzX2ludDY0X3QgdmFsdWU7CisgIGludCBpOworCisgIGdfYXNzZXJ0X2NtcGludCAoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2FyZ190eXBlIChpdGVtX2l0ZXIpLCA9PSwKKyAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5UNjQpOworICBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYmFzaWMgKGl0ZW1faXRlciwgJnZhbHVlKTsKKyAgZ19hc3NlcnRfY21waW50ICh2YWx1ZSwgPT0sIGV4cGVjdGVkX3ZhbHVlKTsKKworICB2ID0gX2RidXNfdmFyaWFudF9yZWFkIChpdGVtX2l0ZXIpOworCisgIGlmICh2ID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHMgPSBfZGJ1c192YXJpYW50X3BlZWsgKHYpOworICBnX2Fzc2VydCAocyAhPSBOVUxMKTsKKyAgZ19hc3NlcnRfY21wc3RyIChfZGJ1c192YXJpYW50X2dldF9zaWduYXR1cmUgKHYpLCA9PSwKKyAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5UNjRfQVNfU1RSSU5HKTsKKworICAvKiBWYXJpYW50IHNlcmlhbGl6YXRpb24gb2YgPGludDY0IHNvbWV0aGluZz4gYXQgb2Zmc2V0IDA6CisgICAqIDAxICdpJyAwMCAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZQorICAgKiAgICAgICAgICAwMCAgMDAgMDAgMDAgMDAgIHBhZGRpbmcKKyAgICogdnYgdnYgdnYgdnYgIHZ2IHZ2IHZ2IHZ2ICBieXRlcyBvZiB2YWx1ZQorICAgKi8KKyAgZ19hc3NlcnRfY21waW50IChfZGJ1c192YXJpYW50X2dldF9sZW5ndGggKHYpLCA9PSwgMTYpOworICBnX2Fzc2VydF9jbXBpbnQgKF9kYnVzX3N0cmluZ19nZXRfbGVuZ3RoIChzKSwgPT0sIDE2KTsKKyAgZ19hc3NlcnRfY21waW50IChfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKHMsIDApLCA9PSwgMSk7CisgIGdfYXNzZXJ0X2NtcGludCAoX2RidXNfc3RyaW5nX2dldF9ieXRlIChzLCAxKSwgPT0sIERCVVNfVFlQRV9JTlQ2NCk7CisgIGdfYXNzZXJ0X2NtcGludCAoX2RidXNfc3RyaW5nX2dldF9ieXRlIChzLCAyKSwgPT0sICdcMCcpOworCisgIGZvciAoaSA9IDM7IGkgPCA4OyBpKyspCisgICAgZ19hc3NlcnRfY21waW50IChfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKHMsIGkpLCA9PSwgMCk7IC8qIHBhZGRpbmcgKi8KKworICB2YWx1ZV9wID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhX2xlbiAocywgOCwgOCk7CisgIG1lbWNweSAoJnZhbHVlLCB2YWx1ZV9wLCA4KTsKKyAgZ19hc3NlcnRfY21waW50ICh2YWx1ZSwgPT0sIGV4cGVjdGVkX3ZhbHVlKTsKKworICBfZGJ1c192YXJpYW50X2ZyZWUgKHYpOworICByZXR1cm4gVFJVRTsKK30KKworLyogQXNzZXJ0IHRoYXQgaXRlbV9pdGVyIHBvaW50cyB0byBhIHN0cmluZyBlcXVhbCB0byBleHBlY3RlZF92YWx1ZS4KKyAqIENvcHkgaXQgaW50byBhIERCdXNWYXJpYW50IGFuZCBhc3NlcnQgdGhhdCB0aGUgY29weSBpcyBkb25lIGNvcnJlY3RseS4KKyAqIFJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIGlmIGxpYmRidXMgcHJldGVuZHMgdG8gcnVuIG91dCBvZiBtZW1vcnksCisgKiBvciBhYm9ydCBvbiBmYWlsdXJlLiAqLworc3RhdGljIGdib29sZWFuCithc3NlcnRfc3RyaW5nIChEQnVzTWVzc2FnZUl0ZXIgKml0ZW1faXRlciwKKyAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmV4cGVjdGVkX3ZhbHVlKQoreworICBEQnVzVmFyaWFudCAqdjsKKyAgY29uc3QgREJ1c1N0cmluZyAqczsKKyAgY29uc3QgY2hhciAqdmFsdWU7CisgIGRidXNfaW50MzJfdCBsZW5ndGg7CisKKyAgZ19hc3NlcnRfY21waW50IChkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJnX3R5cGUgKGl0ZW1faXRlciksID09LAorICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcpOworICBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYmFzaWMgKGl0ZW1faXRlciwgJnZhbHVlKTsKKyAgZ19hc3NlcnRfY21wc3RyICh2YWx1ZSwgPT0sIGV4cGVjdGVkX3ZhbHVlKTsKKworICB2ID0gX2RidXNfdmFyaWFudF9yZWFkIChpdGVtX2l0ZXIpOworCisgIGlmICh2ID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHMgPSBfZGJ1c192YXJpYW50X3BlZWsgKHYpOworICBnX2Fzc2VydCAocyAhPSBOVUxMKTsKKyAgZ19hc3NlcnRfY21wc3RyIChfZGJ1c192YXJpYW50X2dldF9zaWduYXR1cmUgKHYpLCA9PSwKKyAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HX0FTX1NUUklORyk7CisKKyAgLyogVmFyaWFudCBzZXJpYWxpemF0aW9uIG9mIDwic29tZXRoaW5nIj4gYXQgb2Zmc2V0IDA6CisgICAqIDAxICdzJyAwMCAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZQorICAgKiAgICAgICAgICAwMCAgICAgICAgICAgICAgICBwYWRkaW5nCisgICAqICAgICAgICAgICAgICBsbCBsbCBsbCBsbCAgIGJ5dGVzIG9mIGxlbmd0aCBleGNsdWRpbmcgXDAKKyAgICogdnYgdnYgdnYgLi4uIDAwICAgICAgICAgICAgYnl0ZXMgb2YgdmFsdWUKKyAgICovCisgIGdfYXNzZXJ0X2NtcGludCAoX2RidXNfdmFyaWFudF9nZXRfbGVuZ3RoICh2KSwgPT0sCisgICAgICAgICAgICAgICAgICAgKGludCkgc3RybGVuIChleHBlY3RlZF92YWx1ZSkgKyA5KTsKKyAgZ19hc3NlcnRfY21waW50IChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAocyksID09LAorICAgICAgICAgICAgICAgICAgIF9kYnVzX3ZhcmlhbnRfZ2V0X2xlbmd0aCAodikpOworICBnX2Fzc2VydF9jbXBpbnQgKF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAocywgMCksID09LCAxKTsKKyAgZ19hc3NlcnRfY21waW50IChfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKHMsIDEpLCA9PSwgREJVU19UWVBFX1NUUklORyk7CisgIGdfYXNzZXJ0X2NtcGludCAoX2RidXNfc3RyaW5nX2dldF9ieXRlIChzLCAyKSwgPT0sICdcMCcpOworICBnX2Fzc2VydF9jbXBpbnQgKF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAocywgMyksID09LCAwKTsgLyogcGFkZGluZyAqLworCisgIHZhbHVlID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhX2xlbiAocywgNCwgNCk7CisgIG1lbWNweSAoJmxlbmd0aCwgdmFsdWUsIDQpOworICBnX2Fzc2VydF9jbXB1aW50IChsZW5ndGgsID09LCAoaW50KSBzdHJsZW4gKGV4cGVjdGVkX3ZhbHVlKSk7CisgIHZhbHVlID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhX2xlbiAocywgOCwgbGVuZ3RoICsgMSk7CisgIGdfYXNzZXJ0X2NtcHN0ciAodmFsdWUsID09LCBleHBlY3RlZF92YWx1ZSk7CisKKyAgX2RidXNfdmFyaWFudF9mcmVlICh2KTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIEFzc2VydCB0aGF0IGl0ZW1faXRlciBwb2ludHMgdG8gYW4gYXJyYXkgb2Ygbl92YWx1ZXMgcmVwZXRpdGlvbnMgb2YgdGhlCisgKiBpbnQzMiBleHBlY3RlZF92YWx1ZS4gQ29weSBpdCBpbnRvIGEgREJ1c1ZhcmlhbnQgYW5kIGFzc2VydCB0aGF0IHRoZQorICogY29weSBpcyBkb25lIGNvcnJlY3RseS4KKyAqIFJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIGlmIGxpYmRidXMgcHJldGVuZHMgdG8gcnVuIG91dCBvZiBtZW1vcnksCisgKiBvciBhYm9ydCBvbiBmYWlsdXJlLiAqLworc3RhdGljIGdib29sZWFuCithc3NlcnRfYXJyYXlfb2ZfaW50MzIgKERCdXNNZXNzYWdlSXRlciAqaXRlbV9pdGVyLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgbl92YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgIGRidXNfaW50MzJfdCBleHBlY3RlZF92YWx1ZSkKK3sKKyAgREJ1c01lc3NhZ2VJdGVyIGFycl9pdGVyOworICBEQnVzVmFyaWFudCAqdjsKKyAgY29uc3QgREJ1c1N0cmluZyAqczsKKyAgY29uc3Qgdm9pZCAqdmFsdWVfcDsKKyAgZGJ1c19pbnQzMl90IHZhbHVlOworICBpbnQgaTsKKworICBnX2Fzc2VydF9jbXBpbnQgKGRidXNfbWVzc2FnZV9pdGVyX2dldF9hcmdfdHlwZSAoaXRlbV9pdGVyKSwgPT0sCisgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0FSUkFZKTsKKworICBkYnVzX21lc3NhZ2VfaXRlcl9yZWN1cnNlIChpdGVtX2l0ZXIsICZhcnJfaXRlcik7CisKKyAgZm9yIChpID0gMDsgaSA8IG5fdmFsdWVzOyBpKyspCisgICAgeworICAgICAgYXNzZXJ0X2ludDMyICgmYXJyX2l0ZXIsIGV4cGVjdGVkX3ZhbHVlKTsKKworICAgICAgaWYgKGkgPT0gbl92YWx1ZXMgLSAxKQorICAgICAgICBnX2Fzc2VydF9mYWxzZSAoZGJ1c19tZXNzYWdlX2l0ZXJfbmV4dCAoJmFycl9pdGVyKSk7CisgICAgICBlbHNlCisgICAgICAgIGdfYXNzZXJ0X3RydWUgKGRidXNfbWVzc2FnZV9pdGVyX25leHQgKCZhcnJfaXRlcikpOworICAgIH0KKworICB2ID0gX2RidXNfdmFyaWFudF9yZWFkIChpdGVtX2l0ZXIpOworCisgIGlmICh2ID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHMgPSBfZGJ1c192YXJpYW50X3BlZWsgKHYpOworICBnX2Fzc2VydCAocyAhPSBOVUxMKTsKKyAgZ19hc3NlcnRfY21wc3RyIChfZGJ1c192YXJpYW50X2dldF9zaWduYXR1cmUgKHYpLCA9PSwKKyAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfQVJSQVlfQVNfU1RSSU5HIERCVVNfVFlQRV9JTlQzMl9BU19TVFJJTkcpOworCisgIC8qIFZhcmlhbnQgc2VyaWFsaXphdGlvbiBvZiA8W2ludDMyIHNvbWV0aGluZywgLi4uXT4gYXQgb2Zmc2V0IDA6CisgICAqIDAyICdhJyAnaScgMDAgICAgICAgICAgICAgIHNpZ25hdHVyZQorICAgKiAgICAgICAgICAgICAgIGxsIGxsIGxsIGxsICB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgaW4gdmFsdWVzCisgICAqIHZ2IHZ2IHZ2IHZ2ICAgLi4uICAgICAgICAgIGJ5dGVzIG9mIHZhbHVlcworICAgKi8KKyAgZ19hc3NlcnRfY21waW50IChfZGJ1c192YXJpYW50X2dldF9sZW5ndGggKHYpLCA9PSwgOCArICg0ICogbl92YWx1ZXMpKTsKKyAgZ19hc3NlcnRfY21waW50IChfZGJ1c19zdHJpbmdfZ2V0X2xlbmd0aCAocyksID09LCA4ICsgKDQgKiBuX3ZhbHVlcykpOworICBnX2Fzc2VydF9jbXBpbnQgKF9kYnVzX3N0cmluZ19nZXRfYnl0ZSAocywgMCksID09LCAyKTsKKyAgZ19hc3NlcnRfY21waW50IChfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKHMsIDEpLCA9PSwgREJVU19UWVBFX0FSUkFZKTsKKyAgZ19hc3NlcnRfY21waW50IChfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKHMsIDIpLCA9PSwgREJVU19UWVBFX0lOVDMyKTsKKyAgZ19hc3NlcnRfY21waW50IChfZGJ1c19zdHJpbmdfZ2V0X2J5dGUgKHMsIDMpLCA9PSwgJ1wwJyk7CisgIHZhbHVlX3AgPSBfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGFfbGVuIChzLCA0LCA0KTsKKyAgbWVtY3B5ICgmdmFsdWUsIHZhbHVlX3AsIDQpOworICBnX2Fzc2VydF9jbXBpbnQgKHZhbHVlLCA9PSwgbl92YWx1ZXMgKiA0KTsKKworICBmb3IgKGkgPSAwOyBpIDwgbl92YWx1ZXM7IGkrKykKKyAgICB7CisgICAgICB2YWx1ZV9wID0gX2RidXNfc3RyaW5nX2dldF9jb25zdF9kYXRhX2xlbiAocywgOCArICg0ICogKG5fdmFsdWVzIC0gMSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQpOworICAgICAgbWVtY3B5ICgmdmFsdWUsIHZhbHVlX3AsIDQpOworICAgICAgZ19hc3NlcnRfY21waW50ICh2YWx1ZSwgPT0sIGV4cGVjdGVkX3ZhbHVlKTsKKyAgICB9CisKKyAgX2RidXNfdmFyaWFudF9mcmVlICh2KTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIEFzc2VydCB0aGF0IG0gaXMgKGluIEdWYXJpYW50IG5vdGF0aW9uKToKKyAqICgKKyAqICBpbnQzMiA0MiwKKyAqICAiSGVsbG8sIHdvcmxkISIsCisgKiAgaW50NjQgMjMsCisgKiAgW2ludDMyIDQyLCBpbnQzMiA0Ml0sCisgKiAgKGludDMyIDQyLCAiSGVsbG8sIHdvcmxkISIsIGludDY0IDIzKSwKKyAqICB7aW50MzIgNDI6IGludDY0IDIzfSwKKyAqICkKKyAqCisgKiBTZXJpYWxpemUgc29tZSBvZiB0aG9zZSB2YWx1ZXMgaW50byBEQnVzVmFyaWFudHMgYW5kIGFzc2VydCB0aGF0IGl0IGlzCisgKiBkb25lIGNvcnJlY3RseS4KKyAqCisgKiBSZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBpZiBsaWJkYnVzIHByZXRlbmRzIHRvIHJ1biBvdXQgb2YgbWVtb3J5LAorICogb3IgYWJvcnQgb24gZmFpbHVyZS4gKi8KK3N0YXRpYyBnYm9vbGVhbgorYXNzZXJ0X21lc3NhZ2VfYXNfZXhwZWN0ZWQgKERCdXNNZXNzYWdlICptKQoreworICBEQnVzTWVzc2FnZUl0ZXIgaXRlbV9pdGVyOworICBEQnVzTWVzc2FnZUl0ZXIgYXJyX2l0ZXI7CisgIERCdXNNZXNzYWdlSXRlciBzdHJ1Y3RfaXRlcjsKKyAgREJ1c01lc3NhZ2VJdGVyIHBhaXJfaXRlcjsKKworICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfc2lnbmF0dXJlIChtKSwgPT0sICJpc3hhaShpc3gpYXtpeH0iKTsKKyAgZGJ1c19tZXNzYWdlX2l0ZXJfaW5pdCAobSwgJml0ZW1faXRlcik7CisKKyAgeworICAgIGlmICghYXNzZXJ0X2ludDMyICgmaXRlbV9pdGVyLCA0MikpCisgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBnX2Fzc2VydF90cnVlIChkYnVzX21lc3NhZ2VfaXRlcl9uZXh0ICgmaXRlbV9pdGVyKSk7CisKKyAgICBpZiAoIWFzc2VydF9zdHJpbmcgKCZpdGVtX2l0ZXIsICJIZWxsbywgd29ybGQhIikpCisgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBnX2Fzc2VydF90cnVlIChkYnVzX21lc3NhZ2VfaXRlcl9uZXh0ICgmaXRlbV9pdGVyKSk7CisKKyAgICBpZiAoIWFzc2VydF9pbnQ2NCAoJml0ZW1faXRlciwgMjMpKQorICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgZ19hc3NlcnRfdHJ1ZSAoZGJ1c19tZXNzYWdlX2l0ZXJfbmV4dCAoJml0ZW1faXRlcikpOworCisgICAgZ19hc3NlcnRfY21waW50IChkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJnX3R5cGUgKCZpdGVtX2l0ZXIpLCA9PSwKKyAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9BUlJBWSk7CisgICAgaWYgKCFhc3NlcnRfYXJyYXlfb2ZfaW50MzIgKCZpdGVtX2l0ZXIsIDIsIDQyKSkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgIGdfYXNzZXJ0X3RydWUgKGRidXNfbWVzc2FnZV9pdGVyX25leHQgKCZpdGVtX2l0ZXIpKTsKKworICAgIGdfYXNzZXJ0X2NtcGludCAoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2FyZ190eXBlICgmaXRlbV9pdGVyKSwgPT0sCisgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSVUNUKTsKKyAgICBkYnVzX21lc3NhZ2VfaXRlcl9yZWN1cnNlICgmaXRlbV9pdGVyLCAmc3RydWN0X2l0ZXIpOworCisgICAgeworICAgICAgaWYgKCFhc3NlcnRfaW50MzIgKCZzdHJ1Y3RfaXRlciwgNDIpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIGdfYXNzZXJ0X3RydWUgKGRidXNfbWVzc2FnZV9pdGVyX25leHQgKCZzdHJ1Y3RfaXRlcikpOworCisgICAgICBpZiAoIWFzc2VydF9zdHJpbmcgKCZzdHJ1Y3RfaXRlciwgIkhlbGxvLCB3b3JsZCEiKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICBnX2Fzc2VydF90cnVlIChkYnVzX21lc3NhZ2VfaXRlcl9uZXh0ICgmc3RydWN0X2l0ZXIpKTsKKworICAgICAgaWYgKCFhc3NlcnRfaW50NjQgKCZzdHJ1Y3RfaXRlciwgMjMpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIGdfYXNzZXJ0X2ZhbHNlIChkYnVzX21lc3NhZ2VfaXRlcl9uZXh0ICgmc3RydWN0X2l0ZXIpKTsKKyAgICB9CisKKyAgICBnX2Fzc2VydF90cnVlIChkYnVzX21lc3NhZ2VfaXRlcl9uZXh0ICgmaXRlbV9pdGVyKSk7CisKKyAgICBnX2Fzc2VydF9jbXBpbnQgKGRidXNfbWVzc2FnZV9pdGVyX2dldF9hcmdfdHlwZSAoJml0ZW1faXRlciksID09LAorICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0FSUkFZKTsKKyAgICBkYnVzX21lc3NhZ2VfaXRlcl9yZWN1cnNlICgmaXRlbV9pdGVyLCAmYXJyX2l0ZXIpOworCisgICAgeworICAgICAgZ19hc3NlcnRfY21waW50IChkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJnX3R5cGUgKCZhcnJfaXRlciksID09LAorICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfRElDVF9FTlRSWSk7CisgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9yZWN1cnNlICgmYXJyX2l0ZXIsICZwYWlyX2l0ZXIpOworCisgICAgICB7CisgICAgICAgIGlmICghYXNzZXJ0X2ludDMyICgmcGFpcl9pdGVyLCA0MikpCisgICAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICAgIGdfYXNzZXJ0X3RydWUgKGRidXNfbWVzc2FnZV9pdGVyX25leHQgKCZwYWlyX2l0ZXIpKTsKKworICAgICAgICBpZiAoIWFzc2VydF9pbnQ2NCAoJnBhaXJfaXRlciwgMjMpKQorICAgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgICBnX2Fzc2VydF9mYWxzZSAoZGJ1c19tZXNzYWdlX2l0ZXJfbmV4dCAoJnBhaXJfaXRlcikpOworICAgICAgfQorCisgICAgICBnX2Fzc2VydF9mYWxzZSAoZGJ1c19tZXNzYWdlX2l0ZXJfbmV4dCAoJmFycl9pdGVyKSk7CisgICAgfQorICB9CisKKyAgZ19hc3NlcnRfZmFsc2UgKGRidXNfbWVzc2FnZV9pdGVyX25leHQgKCZpdGVtX2l0ZXIpKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIFJldHVybiBUUlVFIG9uIHN1Y2Nlc3Mgb3IgT09NLCBhcyBwZXIgREJ1c1Rlc3RNZW1vcnlGdW5jdGlvbiBzaWduYXR1cmUgKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAordGVzdF9vbmNlICh2b2lkICpkYXRhKQoreworICBnYm9vbGVhbiAqcmVhbGx5X3N1Y2NlZWRlZCA9IGRhdGE7CisgIEZpeHR1cmUgZml4dHVyZSA9IHsgTlVMTCwgTlVMTCB9OworICBGaXh0dXJlICpmID0gJmZpeHR1cmU7CisgIERCdXNNZXNzYWdlSXRlciBpdGVtX2l0ZXI7CisgIERCdXNNZXNzYWdlSXRlciBhcHBlbmRlcjsKKyAgaW50IGk7CisKKyAgaWYgKHJlYWxseV9zdWNjZWVkZWQgIT0gTlVMTCkKKyAgICAqcmVhbGx5X3N1Y2NlZWRlZCA9IEZBTFNFOworCisgIGlmICghc2V0dXAgKGYpKQorICAgIGdvdG8gb3V0OworCisgIGlmICghYXNzZXJ0X21lc3NhZ2VfYXNfZXhwZWN0ZWQgKGYtPm9yaWdpbmFsKSkKKyAgICBnb3RvIG91dDsKKworICBkYnVzX21lc3NhZ2VfaXRlcl9pbml0IChmLT5vcmlnaW5hbCwgJml0ZW1faXRlcik7CisKKyAgZi0+Y29weSA9IGRidXNfbWVzc2FnZV9uZXdfc2lnbmFsICgiLyIsICJhLmIiLCAiYyIpOworCisgIGlmIChmLT5jb3B5ID09IE5VTEwpCisgICAgZ290byBvdXQ7CisKKyAgZGJ1c19tZXNzYWdlX2l0ZXJfaW5pdF9hcHBlbmQgKGYtPmNvcHksICZhcHBlbmRlcik7CisKKyAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKyAgICB7CisgICAgICBEQnVzVmFyaWFudCAqdmFyID0gX2RidXNfdmFyaWFudF9yZWFkICgmaXRlbV9pdGVyKTsKKworICAgICAgaWYgKHZhciA9PSBOVUxMKQorICAgICAgICBnb3RvIG91dDsKKworICAgICAgaWYgKCFfZGJ1c192YXJpYW50X3dyaXRlICh2YXIsICZhcHBlbmRlcikpCisgICAgICAgIHsKKyAgICAgICAgICBfZGJ1c192YXJpYW50X2ZyZWUgKHZhcik7CisgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgICAgX2RidXNfdmFyaWFudF9mcmVlICh2YXIpOworCisgICAgICBpZiAoaSA9PSA1KQorICAgICAgICBnX2Fzc2VydF9mYWxzZSAoZGJ1c19tZXNzYWdlX2l0ZXJfbmV4dCAoJml0ZW1faXRlcikpOworICAgICAgZWxzZQorICAgICAgICBnX2Fzc2VydF90cnVlIChkYnVzX21lc3NhZ2VfaXRlcl9uZXh0ICgmaXRlbV9pdGVyKSk7CisgICAgfQorCisgIGlmICghYXNzZXJ0X21lc3NhZ2VfYXNfZXhwZWN0ZWQgKGYtPmNvcHkpKQorICAgIGdvdG8gb3V0OworCisgIGlmIChyZWFsbHlfc3VjY2VlZGVkICE9IE5VTEwpCisgICAgKnJlYWxseV9zdWNjZWVkZWQgPSBUUlVFOworb3V0OgorICBpZiAoZi0+b3JpZ2luYWwpCisgICAgZGJ1c19tZXNzYWdlX3VucmVmIChmLT5vcmlnaW5hbCk7CisKKyAgaWYgKGYtPmNvcHkpCisgICAgZGJ1c19tZXNzYWdlX3VucmVmIChmLT5jb3B5KTsKKworICBkYnVzX3NodXRkb3duICgpOworICBnX2Fzc2VydF9jbXBpbnQgKF9kYnVzX2dldF9tYWxsb2NfYmxvY2tzX291dHN0YW5kaW5nICgpLCA9PSwgMCk7CisKKyAgcmV0dXJuICFnX3Rlc3RfZmFpbGVkICgpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9zaW1wbGUgKHZvaWQpCit7CisgIGdib29sZWFuIHJlYWxseV9zdWNjZWVkZWQgPSBGQUxTRTsKKworICBpZiAoIXRlc3Rfb25jZSAoJnJlYWxseV9zdWNjZWVkZWQpKQorICAgIGdfZXJyb3IgKCJUZXN0IGZhaWxlZCIpOworCisgIGlmICghcmVhbGx5X3N1Y2NlZWRlZCkKKyAgICBnX2Vycm9yICgiT3V0IG9mIG1lbW9yeSIpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9vb20gKHZvaWQpCit7CisgIGlmICghX2RidXNfdGVzdF9vb21faGFuZGxpbmcgKCJEQnVzVmFyaWFudCIsIHRlc3Rfb25jZSwgTlVMTCkpCisgICAgZ19lcnJvciAoIlRlc3QgZmFpbGVkIik7Cit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsCisgICAgICBjaGFyICoqYXJndikKK3sKKyAgdGVzdF9pbml0ICgmYXJnYywgJmFyZ3YpOworCisgIGdfdGVzdF9hZGRfZnVuYyAoIi92YXJpYW50L3NpbXBsZSIsIHRlc3Rfc2ltcGxlKTsKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3ZhcmlhbnQvb29tIiwgdGVzdF9vb20pOworCisgIHJldHVybiBnX3Rlc3RfcnVuICgpOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9sb29wYmFjay5jIGIvdGVzdC9sb29wYmFjay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4NzI1YjcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2xvb3BiYWNrLmMKQEAgLTAsMCArMSw0OTIgQEAKKy8qIFNpbXBsZSBzYW5pdHktY2hlY2sgZm9yIGxvb3BiYWNrIHRocm91Z2ggVENQIGFuZCBVbml4IHNvY2tldHMuCisgKgorICogQXV0aG9yOiBTaW1vbiBNY1ZpdHRpZSA8c2ltb24ubWN2aXR0aWVAY29sbGFib3JhLmNvLnVrPgorICogQ29weXJpZ2h0IMKpIDIwMTAtMjAxMiBOb2tpYSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IMKpIDIwMTUgQ29sbGFib3JhIEx0ZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMKKyAqICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sCisgKiBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLAorICogcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwKKyAqIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCisgKiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQorICogaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisKKyNpbmNsdWRlIDxnbGliLmg+CisjaW5jbHVkZSA8Z2xpYi9nc3RkaW8uaD4KKworI2luY2x1ZGUgPGRidXMvZGJ1cy5oPgorCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgInRlc3QtdXRpbHMtZ2xpYi5oIgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVGVzdE1haW5Db250ZXh0ICpjdHg7CisgICAgREJ1c0Vycm9yIGU7CisgICAgZ2Jvb2xlYW4gc2tpcDsKKworICAgIERCdXNTZXJ2ZXIgKnNlcnZlcjsKKyAgICBEQnVzQ29ubmVjdGlvbiAqc2VydmVyX2Nvbm47CisgICAgLyogcXVldWUgb2YgREJ1c01lc3NhZ2UgKi8KKyAgICBHUXVldWUgc2VydmVyX21lc3NhZ2VzOworCisgICAgREJ1c0Nvbm5lY3Rpb24gKmNsaWVudF9jb25uOworCisgICAgZ2NoYXIgKnRtcF9ydW50aW1lX2RpcjsKKyAgICBnY2hhciAqc2F2ZWRfcnVudGltZV9kaXI7Cit9IEZpeHR1cmU7CisKK3N0YXRpYyB2b2lkCithc3NlcnRfbm9fZXJyb3IgKGNvbnN0IERCdXNFcnJvciAqZSkKK3sKKyAgaWYgKEdfVU5MSUtFTFkgKGRidXNfZXJyb3JfaXNfc2V0IChlKSkpCisgICAgZ19lcnJvciAoImV4cGVjdGVkIHN1Y2Nlc3MgYnV0IGdvdCBlcnJvcjogJXM6ICVzIiwgZS0+bmFtZSwgZS0+bWVzc2FnZSk7Cit9CisKK3N0YXRpYyBEQnVzSGFuZGxlclJlc3VsdAorc2VydmVyX21lc3NhZ2VfY2IgKERCdXNDb25uZWN0aW9uICpzZXJ2ZXJfY29ubiwKKyAgICBEQnVzTWVzc2FnZSAqbWVzc2FnZSwKKyAgICB2b2lkICpkYXRhKQoreworICBGaXh0dXJlICpmID0gZGF0YTsKKworICBnX2Fzc2VydCAoc2VydmVyX2Nvbm4gPT0gZi0+c2VydmVyX2Nvbm4pOworICBnX3F1ZXVlX3B1c2hfdGFpbCAoJmYtPnNlcnZlcl9tZXNzYWdlcywgZGJ1c19tZXNzYWdlX3JlZiAobWVzc2FnZSkpOworCisgIHJldHVybiBEQlVTX0hBTkRMRVJfUkVTVUxUX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyB2b2lkCituZXdfY29ubl9jYiAoREJ1c1NlcnZlciAqc2VydmVyLAorICAgIERCdXNDb25uZWN0aW9uICpzZXJ2ZXJfY29ubiwKKyAgICB2b2lkICpkYXRhKQoreworICBGaXh0dXJlICpmID0gZGF0YTsKKyAgZGJ1c19ib29sX3QgaGF2ZV9tZW07CisKKyAgZ19hc3NlcnQgKGYtPnNlcnZlcl9jb25uID09IE5VTEwpOworICBmLT5zZXJ2ZXJfY29ubiA9IGRidXNfY29ubmVjdGlvbl9yZWYgKHNlcnZlcl9jb25uKTsKKyAgdGVzdF9jb25uZWN0aW9uX3NldHVwIChmLT5jdHgsIHNlcnZlcl9jb25uKTsKKworICBoYXZlX21lbSA9IGRidXNfY29ubmVjdGlvbl9hZGRfZmlsdGVyIChzZXJ2ZXJfY29ubiwKKyAgICAgIHNlcnZlcl9tZXNzYWdlX2NiLCBmLCBOVUxMKTsKKyAgZ19hc3NlcnQgKGhhdmVfbWVtKTsKK30KKworc3RhdGljIHZvaWQKK3NldHVwIChGaXh0dXJlICpmLAorICAgIGdjb25zdHBvaW50ZXIgYWRkcikKK3sKKyAgZi0+Y3R4ID0gdGVzdF9tYWluX2NvbnRleHRfZ2V0ICgpOworICBkYnVzX2Vycm9yX2luaXQgKCZmLT5lKTsKKyAgZ19xdWV1ZV9pbml0ICgmZi0+c2VydmVyX21lc3NhZ2VzKTsKKworICBpZiAoKGdfc3RyX2hhc19wcmVmaXggKGFkZHIsICJ0Y3A6IikgfHwKKyAgICAgICBnX3N0cl9oYXNfcHJlZml4IChhZGRyLCAibm9uY2UtdGNwOiIpKSAmJgorICAgICAgIXRlc3RfY2hlY2tfdGNwX3dvcmtzICgpKQorICAgIHsKKyAgICAgIGYtPnNraXAgPSBUUlVFOworICAgICAgcmV0dXJuOworICAgIH0KKworICBmLT5zZXJ2ZXIgPSBkYnVzX3NlcnZlcl9saXN0ZW4gKGFkZHIsICZmLT5lKTsKKyAgYXNzZXJ0X25vX2Vycm9yICgmZi0+ZSk7CisgIGdfYXNzZXJ0IChmLT5zZXJ2ZXIgIT0gTlVMTCk7CisKKyAgZGJ1c19zZXJ2ZXJfc2V0X25ld19jb25uZWN0aW9uX2Z1bmN0aW9uIChmLT5zZXJ2ZXIsCisgICAgICBuZXdfY29ubl9jYiwgZiwgTlVMTCk7CisgIHRlc3Rfc2VydmVyX3NldHVwIChmLT5jdHgsIGYtPnNlcnZlcik7Cit9CisKKyNpZmRlZiBEQlVTX1VOSVgKK3N0YXRpYyB2b2lkCitzZXR1cF9ydW50aW1lIChGaXh0dXJlICpmLAorICAgIGdjb25zdHBvaW50ZXIgYWRkcikKK3sKKyAgY2hhciAqbGlzdGVuaW5nX2F0OworICBHRXJyb3IgKmVycm9yID0gTlVMTDsKKworICAvKiB0aGlzIGlzIGNob3NlbiB0byBiZSBzb21ldGhpbmcgbmVlZGluZyBlc2NhcGluZyAqLworICBmLT50bXBfcnVudGltZV9kaXIgPSBnX2Rpcl9tYWtlX3RtcCAoImRidXM9ZGFlbW9uPXRlc3QuWFhYWFhYIiwgJmVycm9yKTsKKyAgZ19hc3NlcnRfbm9fZXJyb3IgKGVycm9yKTsKKworICAvKiB3ZSdyZSByZWx5aW5nIG9uIGJlaW5nIHNpbmdsZS10aHJlYWRlZCBmb3IgdGhpcyB0byBiZSBzYWZlICovCisgIGYtPnNhdmVkX3J1bnRpbWVfZGlyID0gZ19zdHJkdXAgKGdfZ2V0ZW52ICgiWERHX1JVTlRJTUVfRElSIikpOworICBnX3NldGVudiAoIlhER19SVU5USU1FX0RJUiIsIGYtPnRtcF9ydW50aW1lX2RpciwgVFJVRSk7CisKKyAgc2V0dXAgKGYsIGFkZHIpOworCisgIGlmIChmLT5za2lwKQorICAgIHJldHVybjsKKworICBsaXN0ZW5pbmdfYXQgPSBkYnVzX3NlcnZlcl9nZXRfYWRkcmVzcyAoZi0+c2VydmVyKTsKKyAgZ190ZXN0X21lc3NhZ2UgKCJsaXN0ZW5pbmcgYXQgJXMiLCBsaXN0ZW5pbmdfYXQpOworICBnX2Fzc2VydCAoZ19zdHJfaGFzX3ByZWZpeCAobGlzdGVuaW5nX2F0LCAidW5peDpwYXRoPSIpKTsKKyAgZ19hc3NlcnQgKHN0cnN0ciAobGlzdGVuaW5nX2F0LCAiZGJ1cyUzZGRhZW1vbiUzZHRlc3QuIikgIT0gTlVMTCk7CisgIGdfYXNzZXJ0IChzdHJzdHIgKGxpc3RlbmluZ19hdCwgIi9idXMsIikgIT0gTlVMTCB8fAorICAgICAgZ19zdHJfaGFzX3N1ZmZpeCAobGlzdGVuaW5nX2F0LCAiL2J1cyIpKTsKKworICBkYnVzX2ZyZWUgKGxpc3RlbmluZ19hdCk7Cit9CisKK3N0YXRpYyB2b2lkCitzZXR1cF9ub19ydW50aW1lIChGaXh0dXJlICpmLAorICAgIGdjb25zdHBvaW50ZXIgYWRkcikKK3sKKyAgY2hhciAqbGlzdGVuaW5nX2F0OworCisgIC8qIHdlJ3JlIHJlbHlpbmcgb24gYmVpbmcgc2luZ2xlLXRocmVhZGVkIGZvciB0aGlzIHRvIGJlIHNhZmUgKi8KKyAgZi0+c2F2ZWRfcnVudGltZV9kaXIgPSBnX3N0cmR1cCAoZ19nZXRlbnYgKCJYREdfUlVOVElNRV9ESVIiKSk7CisgIGdfdW5zZXRlbnYgKCJYREdfUlVOVElNRV9ESVIiKTsKKworICBzZXR1cCAoZiwgYWRkcik7CisKKyAgaWYgKGYtPnNraXApCisgICAgcmV0dXJuOworCisgIGxpc3RlbmluZ19hdCA9IGRidXNfc2VydmVyX2dldF9hZGRyZXNzIChmLT5zZXJ2ZXIpOworICBnX3Rlc3RfbWVzc2FnZSAoImxpc3RlbmluZyBhdCAlcyIsIGxpc3RlbmluZ19hdCk7CisgIC8qIHdlIGhhdmUgZmFsbGVuIGJhY2sgdG8gc29tZXRoaW5nIGluIC90bXAsIGVpdGhlciBhYnN0cmFjdCBvciBub3QgKi8KKyAgZ19hc3NlcnQgKGdfc3RyX2hhc19wcmVmaXggKGxpc3RlbmluZ19hdCwgInVuaXg6IikpOworICBnX2Fzc2VydCAoc3Ryc3RyIChsaXN0ZW5pbmdfYXQsICI9L3RtcC8iKSAhPSBOVUxMKTsKKworICBkYnVzX2ZyZWUgKGxpc3RlbmluZ19hdCk7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQKK3Rlc3RfY29ubmVjdCAoRml4dHVyZSAqZiwKKyAgICBnY29uc3Rwb2ludGVyIGFkZHIpCit7CisgIGNvbnN0IGNoYXIgKmxpc3RlbmluZ19hZGRyZXNzID0gYWRkcjsKKyAgY2hhciAqYWRkcmVzczsKKyAgREJ1c0FkZHJlc3NFbnRyeSAqKmVudHJpZXM7CisgIGludCBuX2VudHJpZXM7CisgIGRidXNfYm9vbF90IG9rOworCisgIGlmIChmLT5za2lwKQorICAgIHJldHVybjsKKworICBnX2Fzc2VydCAoZi0+c2VydmVyX2Nvbm4gPT0gTlVMTCk7CisKKyAgYWRkcmVzcyA9IGRidXNfc2VydmVyX2dldF9hZGRyZXNzIChmLT5zZXJ2ZXIpOworICBnX3Rlc3RfbWVzc2FnZSAoImxpc3RlbmluZyBhdCAlcyIsIGFkZHJlc3MpOworCisgIG9rID0gZGJ1c19wYXJzZV9hZGRyZXNzIChhZGRyZXNzLCAmZW50cmllcywgJm5fZW50cmllcywgJmYtPmUpOworICBhc3NlcnRfbm9fZXJyb3IgKCZmLT5lKTsKKyAgZ19hc3NlcnRfdHJ1ZSAob2spOworICBnX2Fzc2VydF9jbXBpbnQgKG5fZW50cmllcywgPT0sIDEpOworCisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19hZGRyZXNzX2VudHJ5X2dldF92YWx1ZSAoZW50cmllc1swXSwgImd1aWQiKSwgIT0sCisgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgaWYgKGdfc3RyY21wMCAobGlzdGVuaW5nX2FkZHJlc3MsICJ0Y3A6aG9zdD0xMjcuMC4wLjEiKSA9PSAwKQorICAgIHsKKyAgICAgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19hZGRyZXNzX2VudHJ5X2dldF9tZXRob2QgKGVudHJpZXNbMF0pLCA9PSwgInRjcCIpOworICAgICAgZ19hc3NlcnRfY21wc3RyIChkYnVzX2FkZHJlc3NfZW50cnlfZ2V0X3ZhbHVlIChlbnRyaWVzWzBdLCAiaG9zdCIpLCA9PSwKKyAgICAgICAgICAgICAgICAgICAgICAgIjEyNy4wLjAuMSIpOworICAgICAgZ19hc3NlcnRfY21wc3RyIChkYnVzX2FkZHJlc3NfZW50cnlfZ2V0X3ZhbHVlIChlbnRyaWVzWzBdLCAicG9ydCIpLCAhPSwKKyAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfYWRkcmVzc19lbnRyeV9nZXRfdmFsdWUgKGVudHJpZXNbMF0sICJub25jZWZpbGUiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgPT0sIE5VTEwpOworICAgIH0KKyAgZWxzZSBpZiAoZ19zdHJjbXAwIChsaXN0ZW5pbmdfYWRkcmVzcywgIm5vbmNlLXRjcDpob3N0PTEyNy4wLjAuMSIpID09IDApCisgICAgeworICAgICAgZ19hc3NlcnRfY21wc3RyIChkYnVzX2FkZHJlc3NfZW50cnlfZ2V0X21ldGhvZCAoZW50cmllc1swXSksID09LAorICAgICAgICAgICAgICAgICAgICAgICAibm9uY2UtdGNwIik7CisgICAgICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfYWRkcmVzc19lbnRyeV9nZXRfdmFsdWUgKGVudHJpZXNbMF0sICJob3N0IiksID09LAorICAgICAgICAgICAgICAgICAgICAgICAiMTI3LjAuMC4xIik7CisgICAgICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfYWRkcmVzc19lbnRyeV9nZXRfdmFsdWUgKGVudHJpZXNbMF0sICJwb3J0IiksICE9LAorICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19hZGRyZXNzX2VudHJ5X2dldF92YWx1ZSAoZW50cmllc1swXSwgIm5vbmNlZmlsZSIpLAorICAgICAgICAgICAgICAgICAgICAgICAhPSwgTlVMTCk7CisgICAgfQorI2lmZGVmIERCVVNfVU5JWAorICBlbHNlIGlmIChnX3N0cmNtcDAgKGxpc3RlbmluZ19hZGRyZXNzLCAidW5peDp0bXBkaXI9L3RtcCIpID09IDApCisgICAgeworICAgICAgZ19hc3NlcnRfY21wc3RyIChkYnVzX2FkZHJlc3NfZW50cnlfZ2V0X21ldGhvZCAoZW50cmllc1swXSksID09LCAidW5peCIpOworCisgICAgICBpZiAoZGJ1c19hZGRyZXNzX2VudHJ5X2dldF92YWx1ZSAoZW50cmllc1swXSwgImFic3RyYWN0IikgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGNvbnN0IGNoYXIgKmFic3RyYWN0ID0gZGJ1c19hZGRyZXNzX2VudHJ5X2dldF92YWx1ZSAoZW50cmllc1swXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhYnN0cmFjdCIpOworCisgICAgICAgICAgZ19hc3NlcnRfdHJ1ZSAoZ19zdHJfaGFzX3ByZWZpeCAoYWJzdHJhY3QsICIvdG1wL2RidXMtIikpOworICAgICAgICAgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19hZGRyZXNzX2VudHJ5X2dldF92YWx1ZSAoZW50cmllc1swXSwgInBhdGgiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09LCBOVUxMKTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgY29uc3QgY2hhciAqcGF0aCA9IGRidXNfYWRkcmVzc19lbnRyeV9nZXRfdmFsdWUgKGVudHJpZXNbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXRoIik7CisKKyAgICAgICAgICBnX2Fzc2VydF9ub25udWxsIChwYXRoKTsKKyAgICAgICAgICBnX2Fzc2VydF90cnVlIChnX3N0cl9oYXNfcHJlZml4IChwYXRoLCAiL3RtcC9kYnVzLSIpKTsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZSBpZiAoZ19zdHJjbXAwIChsaXN0ZW5pbmdfYWRkcmVzcywgInVuaXg6ZGlyPS90bXAiKSA9PSAwKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKnBhdGggPSBkYnVzX2FkZHJlc3NfZW50cnlfZ2V0X3ZhbHVlIChlbnRyaWVzWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXRoIik7CisKKyAgICAgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19hZGRyZXNzX2VudHJ5X2dldF9tZXRob2QgKGVudHJpZXNbMF0pLCA9PSwgInVuaXgiKTsKKyAgICAgIGdfYXNzZXJ0X25vbm51bGwgKHBhdGgpOworICAgICAgZ19hc3NlcnRfdHJ1ZSAoZ19zdHJfaGFzX3ByZWZpeCAocGF0aCwgIi90bXAvZGJ1cy0iKSk7CisgICAgfQorICBlbHNlIGlmIChnX3N0cmNtcDAgKGxpc3RlbmluZ19hZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICJ1bml4OnJ1bnRpbWU9eWVzO3VuaXg6dG1wZGlyPS90bXAiKSA9PSAwKQorICAgIHsKKyAgICAgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19hZGRyZXNzX2VudHJ5X2dldF9tZXRob2QgKGVudHJpZXNbMF0pLCA9PSwgInVuaXgiKTsKKyAgICAgIC8qIE5vIHBhcnRpY3VsYXIgc3RhdGVtZW50IGFib3V0IHRoZSBwYXRoIGhlcmU6IGZvciB0aGF0IHNlZQorICAgICAgICogc2V0dXBfcnVudGltZSgpIGFuZCBzZXR1cF9ub19ydW50aW1lKCkgKi8KKyAgICB9CisjZW5kaWYKKyAgZWxzZQorICAgIHsKKyAgICAgIGdfYXNzZXJ0X25vdF9yZWFjaGVkICgpOworICAgIH0KKworICBkYnVzX2FkZHJlc3NfZW50cmllc19mcmVlIChlbnRyaWVzKTsKKworICBmLT5jbGllbnRfY29ubiA9IGRidXNfY29ubmVjdGlvbl9vcGVuX3ByaXZhdGUgKGFkZHJlc3MsICZmLT5lKTsKKyAgYXNzZXJ0X25vX2Vycm9yICgmZi0+ZSk7CisgIGdfYXNzZXJ0IChmLT5jbGllbnRfY29ubiAhPSBOVUxMKTsKKyAgdGVzdF9jb25uZWN0aW9uX3NldHVwIChmLT5jdHgsIGYtPmNsaWVudF9jb25uKTsKKworICB3aGlsZSAoZi0+c2VydmVyX2Nvbm4gPT0gTlVMTCkKKyAgICB7CisgICAgICB0ZXN0X3Byb2dyZXNzICgnLicpOworICAgICAgdGVzdF9tYWluX2NvbnRleHRfaXRlcmF0ZSAoZi0+Y3R4LCBUUlVFKTsKKyAgICB9CisKKyAgZGJ1c19mcmVlIChhZGRyZXNzKTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfYmFkX2d1aWQgKEZpeHR1cmUgKmYsCisgICAgZ2NvbnN0cG9pbnRlciBhZGRyIEdfR05VQ19VTlVTRUQpCit7CisgIERCdXNNZXNzYWdlICppbmNvbWluZzsKKyAgY2hhciAqYWRkcmVzczsKKyAgZ2NoYXIgKmd1aWQ7CisKKyAgaWYgKGYtPnNraXApCisgICAgcmV0dXJuOworCisgIGdfdGVzdF9idWcgKCIzOTcyMCIpOworCisgIGdfYXNzZXJ0IChmLT5zZXJ2ZXJfY29ubiA9PSBOVUxMKTsKKworICBhZGRyZXNzID0gZGJ1c19zZXJ2ZXJfZ2V0X2FkZHJlc3MgKGYtPnNlcnZlcik7CisgIGdfYXNzZXJ0IChzdHJzdHIgKGFkZHJlc3MsICJndWlkPSIpICE9IE5VTEwpOworICBndWlkID0gc3Ryc3RyIChhZGRyZXNzLCAiZ3VpZD0iKTsKKyAgZ19hc3NlcnRfY21wdWludCAoc3RybGVuIChndWlkKSwgPj0sIDUgKyAzMik7CisKKyAgLyogQ2hhbmdlIHRoZSBmaXJzdCBjaGFyIG9mIHRoZSBndWlkIHRvIHNvbWV0aGluZyBkaWZmZXJlbnQgKi8KKyAgaWYgKGd1aWRbNV0gPT0gJzAnKQorICAgIGd1aWRbNV0gPSAnZic7CisgIGVsc2UKKyAgICBndWlkWzVdID0gJzAnOworCisgIGYtPmNsaWVudF9jb25uID0gZGJ1c19jb25uZWN0aW9uX29wZW5fcHJpdmF0ZSAoYWRkcmVzcywgJmYtPmUpOworICBhc3NlcnRfbm9fZXJyb3IgKCZmLT5lKTsKKyAgZ19hc3NlcnQgKGYtPmNsaWVudF9jb25uICE9IE5VTEwpOworICB0ZXN0X2Nvbm5lY3Rpb25fc2V0dXAgKGYtPmN0eCwgZi0+Y2xpZW50X2Nvbm4pOworCisgIHdoaWxlIChmLT5zZXJ2ZXJfY29ubiA9PSBOVUxMKQorICAgIHsKKyAgICAgIHRlc3RfcHJvZ3Jlc3MgKCcuJyk7CisgICAgICB0ZXN0X21haW5fY29udGV4dF9pdGVyYXRlIChmLT5jdHgsIFRSVUUpOworICAgIH0KKworICAvKiBXZSBnZXQgZGlzY29ubmVjdGVkICovCisKKyAgd2hpbGUgKGdfcXVldWVfaXNfZW1wdHkgKCZmLT5zZXJ2ZXJfbWVzc2FnZXMpKQorICAgIHsKKyAgICAgIHRlc3RfcHJvZ3Jlc3MgKCcuJyk7CisgICAgICB0ZXN0X21haW5fY29udGV4dF9pdGVyYXRlIChmLT5jdHgsIFRSVUUpOworICAgIH0KKworICBnX2Fzc2VydF9jbXB1aW50IChnX3F1ZXVlX2dldF9sZW5ndGggKCZmLT5zZXJ2ZXJfbWVzc2FnZXMpLCA9PSwgMSk7CisKKyAgaW5jb21pbmcgPSBnX3F1ZXVlX3BvcF9oZWFkICgmZi0+c2VydmVyX21lc3NhZ2VzKTsKKworICBnX2Fzc2VydCAoIWRidXNfbWVzc2FnZV9jb250YWluc191bml4X2ZkcyAoaW5jb21pbmcpKTsKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X2Rlc3RpbmF0aW9uIChpbmNvbWluZyksID09LCBOVUxMKTsKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X2Vycm9yX25hbWUgKGluY29taW5nKSwgPT0sIE5VTEwpOworICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfaW50ZXJmYWNlIChpbmNvbWluZyksID09LAorICAgICAgREJVU19JTlRFUkZBQ0VfTE9DQUwpOworICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChpbmNvbWluZyksID09LCAiRGlzY29ubmVjdGVkIik7CisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9zZW5kZXIgKGluY29taW5nKSwgPT0sIE5VTEwpOworICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfc2lnbmF0dXJlIChpbmNvbWluZyksID09LCAiIik7CisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9wYXRoIChpbmNvbWluZyksID09LCBEQlVTX1BBVEhfTE9DQUwpOworCisgIGRidXNfY2xlYXJfbWVzc2FnZSAoJmluY29taW5nKTsKKyAgZGJ1c19mcmVlIChhZGRyZXNzKTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfbWVzc2FnZSAoRml4dHVyZSAqZiwKKyAgICBnY29uc3Rwb2ludGVyIGFkZHIpCit7CisgIGRidXNfYm9vbF90IGhhdmVfbWVtOworICBkYnVzX3VpbnQzMl90IHNlcmlhbDsKKyAgREJ1c01lc3NhZ2UgKm91dGdvaW5nLCAqaW5jb21pbmc7CisKKyAgaWYgKGYtPnNraXApCisgICAgcmV0dXJuOworCisgIHRlc3RfY29ubmVjdCAoZiwgYWRkcik7CisKKyAgb3V0Z29pbmcgPSBkYnVzX21lc3NhZ2VfbmV3X3NpZ25hbCAoIi9jb20vZXhhbXBsZS9IZWxsbyIsCisgICAgICAiY29tLmV4YW1wbGUuSGVsbG8iLCAiR3JlZXRpbmciKTsKKyAgZ19hc3NlcnQgKG91dGdvaW5nICE9IE5VTEwpOworCisgIGhhdmVfbWVtID0gZGJ1c19jb25uZWN0aW9uX3NlbmQgKGYtPmNsaWVudF9jb25uLCBvdXRnb2luZywgJnNlcmlhbCk7CisgIGdfYXNzZXJ0IChoYXZlX21lbSk7CisgIGdfYXNzZXJ0IChzZXJpYWwgIT0gMCk7CisKKyAgd2hpbGUgKGdfcXVldWVfaXNfZW1wdHkgKCZmLT5zZXJ2ZXJfbWVzc2FnZXMpKQorICAgIHsKKyAgICAgIHRlc3RfcHJvZ3Jlc3MgKCcuJyk7CisgICAgICB0ZXN0X21haW5fY29udGV4dF9pdGVyYXRlIChmLT5jdHgsIFRSVUUpOworICAgIH0KKworICBnX2Fzc2VydF9jbXB1aW50IChnX3F1ZXVlX2dldF9sZW5ndGggKCZmLT5zZXJ2ZXJfbWVzc2FnZXMpLCA9PSwgMSk7CisKKyAgaW5jb21pbmcgPSBnX3F1ZXVlX3BvcF9oZWFkICgmZi0+c2VydmVyX21lc3NhZ2VzKTsKKworICBnX2Fzc2VydCAoIWRidXNfbWVzc2FnZV9jb250YWluc191bml4X2ZkcyAoaW5jb21pbmcpKTsKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X2Rlc3RpbmF0aW9uIChpbmNvbWluZyksID09LCBOVUxMKTsKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X2Vycm9yX25hbWUgKGluY29taW5nKSwgPT0sIE5VTEwpOworICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfaW50ZXJmYWNlIChpbmNvbWluZyksID09LAorICAgICAgImNvbS5leGFtcGxlLkhlbGxvIik7CisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKGluY29taW5nKSwgPT0sICJHcmVldGluZyIpOworICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfc2VuZGVyIChpbmNvbWluZyksID09LCBOVUxMKTsKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X3NpZ25hdHVyZSAoaW5jb21pbmcpLCA9PSwgIiIpOworICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfcGF0aCAoaW5jb21pbmcpLCA9PSwgIi9jb20vZXhhbXBsZS9IZWxsbyIpOworICBnX2Fzc2VydF9jbXB1aW50IChkYnVzX21lc3NhZ2VfZ2V0X3NlcmlhbCAoaW5jb21pbmcpLCA9PSwgc2VyaWFsKTsKKworICBkYnVzX2NsZWFyX21lc3NhZ2UgKCZpbmNvbWluZyk7CisgIGRidXNfY2xlYXJfbWVzc2FnZSAoJm91dGdvaW5nKTsKK30KKworc3RhdGljIHZvaWQKK3RlYXJkb3duIChGaXh0dXJlICpmLAorICAgIGdjb25zdHBvaW50ZXIgYWRkciBHX0dOVUNfVU5VU0VEKQoreworICBpZiAoZi0+Y2xpZW50X2Nvbm4gIT0gTlVMTCkKKyAgICBkYnVzX2Nvbm5lY3Rpb25fY2xvc2UgKGYtPmNsaWVudF9jb25uKTsKKworICBpZiAoZi0+c2VydmVyX2Nvbm4gIT0gTlVMTCkKKyAgICBkYnVzX2Nvbm5lY3Rpb25fY2xvc2UgKGYtPnNlcnZlcl9jb25uKTsKKworICBkYnVzX2NsZWFyX2Nvbm5lY3Rpb24gKCZmLT5jbGllbnRfY29ubik7CisgIGRidXNfY2xlYXJfY29ubmVjdGlvbiAoJmYtPnNlcnZlcl9jb25uKTsKKworICBpZiAoZi0+c2VydmVyICE9IE5VTEwpCisgICAgZGJ1c19zZXJ2ZXJfZGlzY29ubmVjdCAoZi0+c2VydmVyKTsKKworICBkYnVzX2NsZWFyX3NlcnZlciAoJmYtPnNlcnZlcik7CisgIHRlc3RfbWFpbl9jb250ZXh0X3VucmVmIChmLT5jdHgpOworfQorCisjaWZkZWYgREJVU19VTklYCitzdGF0aWMgdm9pZAordGVhcmRvd25fbm9fcnVudGltZSAoRml4dHVyZSAqZiwKKyAgICBnY29uc3Rwb2ludGVyIGFkZHIpCit7CisgIHRlYXJkb3duIChmLCBhZGRyKTsKKworICAvKiB3ZSdyZSByZWx5aW5nIG9uIGJlaW5nIHNpbmdsZS10aHJlYWRlZCBmb3IgdGhpcyB0byBiZSBzYWZlICovCisgIGlmIChmLT5zYXZlZF9ydW50aW1lX2RpciAhPSBOVUxMKQorICAgIGdfc2V0ZW52ICgiWERHX1JVTlRJTUVfRElSIiwgZi0+c2F2ZWRfcnVudGltZV9kaXIsIFRSVUUpOworICBlbHNlCisgICAgZ191bnNldGVudiAoIlhER19SVU5USU1FX0RJUiIpOworICBnX2ZyZWUgKGYtPnNhdmVkX3J1bnRpbWVfZGlyKTsKK30KKworc3RhdGljIHZvaWQKK3RlYXJkb3duX3J1bnRpbWUgKEZpeHR1cmUgKmYsCisgICAgZ2NvbnN0cG9pbnRlciBhZGRyKQoreworICBnY2hhciAqcGF0aDsKKworICB0ZWFyZG93biAoZiwgYWRkcik7CisKKyAgLyogdGhlIHNvY2tldCBtYXkgZXhpc3QgKi8KKyAgcGF0aCA9IGdfc3RyZHVwX3ByaW50ZiAoIiVzL2J1cyIsIGYtPnRtcF9ydW50aW1lX2Rpcik7CisgIHRlc3RfcmVtb3ZlX2lmX2V4aXN0cyAocGF0aCk7CisgIGdfZnJlZSAocGF0aCk7CisgIC8qIHRoZXJlIHNob3VsZG4ndCBiZSBhbnl0aGluZyBlbHNlIGluIHRoZXJlICovCisgIHRlc3Rfcm1kaXJfbXVzdF9leGlzdCAoZi0+dG1wX3J1bnRpbWVfZGlyKTsKKworICAvKiB3ZSdyZSByZWx5aW5nIG9uIGJlaW5nIHNpbmdsZS10aHJlYWRlZCBmb3IgdGhpcyB0byBiZSBzYWZlICovCisgIGlmIChmLT5zYXZlZF9ydW50aW1lX2RpciAhPSBOVUxMKQorICAgIGdfc2V0ZW52ICgiWERHX1JVTlRJTUVfRElSIiwgZi0+c2F2ZWRfcnVudGltZV9kaXIsIFRSVUUpOworICBlbHNlCisgICAgZ191bnNldGVudiAoIlhER19SVU5USU1FX0RJUiIpOworICBnX2ZyZWUgKGYtPnNhdmVkX3J1bnRpbWVfZGlyKTsKKyAgZ19mcmVlIChmLT50bXBfcnVudGltZV9kaXIpOworfQorI2VuZGlmCisKK2ludAorbWFpbiAoaW50IGFyZ2MsCisgICAgY2hhciAqKmFyZ3YpCit7CisgIHRlc3RfaW5pdCAoJmFyZ2MsICZhcmd2KTsKKworICBnX3Rlc3RfYWRkICgiL2Nvbm5lY3QvdGNwIiwgRml4dHVyZSwgInRjcDpob3N0PTEyNy4wLjAuMSIsIHNldHVwLAorICAgICAgdGVzdF9jb25uZWN0LCB0ZWFyZG93bik7CisgIGdfdGVzdF9hZGQgKCIvbWVzc2FnZS90Y3AiLCBGaXh0dXJlLCAidGNwOmhvc3Q9MTI3LjAuMC4xIiwgc2V0dXAsCisgICAgICB0ZXN0X21lc3NhZ2UsIHRlYXJkb3duKTsKKworICBnX3Rlc3RfYWRkICgiL2Nvbm5lY3Qvbm9uY2UtdGNwIiwgRml4dHVyZSwgIm5vbmNlLXRjcDpob3N0PTEyNy4wLjAuMSIsIHNldHVwLAorICAgICAgdGVzdF9jb25uZWN0LCB0ZWFyZG93bik7CisgIGdfdGVzdF9hZGQgKCIvbWVzc2FnZS9ub25jZS10Y3AiLCBGaXh0dXJlLCAibm9uY2UtdGNwOmhvc3Q9MTI3LjAuMC4xIiwgc2V0dXAsCisgICAgICB0ZXN0X21lc3NhZ2UsIHRlYXJkb3duKTsKKworICBnX3Rlc3RfYWRkICgiL21lc3NhZ2UvYmFkLWd1aWQvdGNwIiwgRml4dHVyZSwgInRjcDpob3N0PTEyNy4wLjAuMSIsIHNldHVwLAorICAgICAgdGVzdF9iYWRfZ3VpZCwgdGVhcmRvd24pOworCisjaWZkZWYgREJVU19VTklYCisgIGdfdGVzdF9hZGQgKCIvY29ubmVjdC91bml4L3RtcGRpciIsIEZpeHR1cmUsICJ1bml4OnRtcGRpcj0vdG1wIiwgc2V0dXAsCisgICAgICB0ZXN0X2Nvbm5lY3QsIHRlYXJkb3duKTsKKyAgZ190ZXN0X2FkZCAoIi9tZXNzYWdlL3VuaXgvdG1wZGlyIiwgRml4dHVyZSwgInVuaXg6dG1wZGlyPS90bXAiLCBzZXR1cCwKKyAgICAgIHRlc3RfbWVzc2FnZSwgdGVhcmRvd24pOworICBnX3Rlc3RfYWRkICgiL2Nvbm5lY3QvdW5peC9kaXIiLCBGaXh0dXJlLCAidW5peDpkaXI9L3RtcCIsIHNldHVwLAorICAgICAgdGVzdF9jb25uZWN0LCB0ZWFyZG93bik7CisgIGdfdGVzdF9hZGQgKCIvbWVzc2FnZS91bml4L2RpciIsIEZpeHR1cmUsICJ1bml4OmRpcj0vdG1wIiwgc2V0dXAsCisgICAgICB0ZXN0X21lc3NhZ2UsIHRlYXJkb3duKTsKKworICBnX3Rlc3RfYWRkICgiL2Nvbm5lY3QvdW5peC9ydW50aW1lIiwgRml4dHVyZSwKKyAgICAgICJ1bml4OnJ1bnRpbWU9eWVzO3VuaXg6dG1wZGlyPS90bXAiLCBzZXR1cF9ydW50aW1lLCB0ZXN0X2Nvbm5lY3QsCisgICAgICB0ZWFyZG93bl9ydW50aW1lKTsKKyAgZ190ZXN0X2FkZCAoIi9jb25uZWN0L3VuaXgvbm8tcnVudGltZSIsIEZpeHR1cmUsCisgICAgICAidW5peDpydW50aW1lPXllczt1bml4OnRtcGRpcj0vdG1wIiwgc2V0dXBfbm9fcnVudGltZSwgdGVzdF9jb25uZWN0LAorICAgICAgdGVhcmRvd25fbm9fcnVudGltZSk7CisKKyAgZ190ZXN0X2FkZCAoIi9tZXNzYWdlL2JhZC1ndWlkL3VuaXgiLCBGaXh0dXJlLCAidW5peDp0bXBkaXI9L3RtcCIsIHNldHVwLAorICAgICAgdGVzdF9iYWRfZ3VpZCwgdGVhcmRvd24pOworI2VuZGlmCisKKyAgcmV0dXJuIGdfdGVzdF9ydW4gKCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L21hbnVhbC1hdXRoei5jIGIvdGVzdC9tYW51YWwtYXV0aHouYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTliYzUyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9tYW51YWwtYXV0aHouYwpAQCAtMCwwICsxLDQxMSBAQAorLyogU2ltcGxlIHNhbml0eS1jaGVjayBmb3IgYXV0aGVudGljYXRpb24gYW5kIGF1dGhvcml6YXRpb24uCisgKgorICogQ29weXJpZ2h0IMKpIDIwMTAtMjAxMSBOb2tpYSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IMKpIDIwMTIgQ29sbGFib3JhIEx0ZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMKKyAqICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sCisgKiBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLAorICogcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwKKyAqIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCisgKiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQorICogaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisKKyNpbmNsdWRlIDxnbGliLmg+CisKKyNpbmNsdWRlIDxkYnVzL2RidXMuaD4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2lmZGVmIEdfT1NfVU5JWAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJ0ZXN0LXV0aWxzLmgiCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBEQnVzRXJyb3IgZTsKKyAgICBUZXN0TWFpbkNvbnRleHQgKmN0eDsKKworICAgIERCdXNTZXJ2ZXIgKm5vcm1hbF9zZXJ2ZXI7CisgICAgREJ1c1NlcnZlciAqYW5vbl9hbGxvd2VkX3NlcnZlcjsKKyAgICBEQnVzU2VydmVyICphbm9uX29ubHlfc2VydmVyOworICAgIERCdXNTZXJ2ZXIgKmFub25fbWVjaF9vbmx5X3NlcnZlcjsKKyAgICBEQnVzU2VydmVyICphbm9uX2Rpc2FsbG93ZWRfc2VydmVyOworICAgIERCdXNTZXJ2ZXIgKnBlcm1pc3NpdmVfc2VydmVyOworICAgIERCdXNTZXJ2ZXIgKnVuaGFwcHlfc2VydmVyOworICAgIERCdXNTZXJ2ZXIgKnNhbWVfdWlkX3NlcnZlcjsKKyAgICBEQnVzU2VydmVyICpzYW1lX3VpZF9vcl9hbm9uX3NlcnZlcjsKK30gRml4dHVyZTsKKworc3RhdGljIHZvaWQgb29tICh2b2lkKSBHX0dOVUNfTk9SRVRVUk47CitzdGF0aWMgdm9pZAorb29tICh2b2lkKQoreworICBnX2Vycm9yICgib3V0IG9mIG1lbW9yeSIpOworICBhYm9ydCAoKTsKK30KKworc3RhdGljIHZvaWQKK2Fzc2VydF9ub19lcnJvciAoY29uc3QgREJ1c0Vycm9yICplKQoreworICBpZiAoR19VTkxJS0VMWSAoZGJ1c19lcnJvcl9pc19zZXQgKGUpKSkKKyAgICBnX2Vycm9yICgiZXhwZWN0ZWQgc3VjY2VzcyBidXQgZ290IGVycm9yOiAlczogJXMiLCBlLT5uYW1lLCBlLT5tZXNzYWdlKTsKK30KKworc3RhdGljIERCdXNIYW5kbGVyUmVzdWx0CitzZXJ2ZXJfbWVzc2FnZV9jYiAoREJ1c0Nvbm5lY3Rpb24gKmNvbm4sCisgICAgREJ1c01lc3NhZ2UgKm1lc3NhZ2UsCisgICAgdm9pZCAqZGF0YSkKK3sKKyAgaWYgKGRidXNfbWVzc2FnZV9pc19zaWduYWwgKG1lc3NhZ2UsIERCVVNfSU5URVJGQUNFX0xPQ0FMLCAiRGlzY29ubmVjdGVkIikpCisgICAgeworICAgICAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChjb25uKTsKKworICAgICAgcmV0dXJuIERCVVNfSEFORExFUl9SRVNVTFRfTk9UX1lFVF9IQU5ETEVEOworICAgIH0KKworICBpZiAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlKSA9PSBEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfQ0FMTCkKKyAgICB7CisgICAgICBEQnVzTWVzc2FnZSAqcmVwbHkgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9yZXR1cm4gKG1lc3NhZ2UpOworICAgICAgY29uc3QgY2hhciAqaGVsbG8gPSAiSGVsbG8sIHdvcmxkISI7CisgICAgICB1bnNpZ25lZCBsb25nIHVpZDsKKyAgICAgIGNoYXIgKnNpZDsKKworICAgICAgaWYgKGRidXNfY29ubmVjdGlvbl9nZXRfdW5peF91c2VyIChjb25uLCAmdWlkKSkKKyAgICAgICAgeworICAgICAgICAgIGdfbWVzc2FnZSAoIm1lc3NhZ2UgZnJvbSB1aWQgJWx1IiwgdWlkKTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoZGJ1c19jb25uZWN0aW9uX2dldF93aW5kb3dzX3VzZXIgKGNvbm4sICZzaWQpKQorICAgICAgICB7CisgICAgICAgICAgaWYgKHNpZCA9PSBOVUxMKQorICAgICAgICAgICAgb29tICgpOworCisgICAgICAgICAgZ19tZXNzYWdlICgibWVzc2FnZSBmcm9tIHNpZCBcIiVzXCIiLCBzaWQpOworICAgICAgICAgIGRidXNfZnJlZSAoc2lkKTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoZGJ1c19jb25uZWN0aW9uX2dldF9pc19hbm9ueW1vdXMgKGNvbm4pKQorICAgICAgICB7CisgICAgICAgICAgZ19tZXNzYWdlICgibWVzc2FnZSBmcm9tIEFub255bW91cyIpOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBnX21lc3NhZ2UgKCJtZXNzYWdlIGZyb20gLi4uIHNvbWVvbmU/Iik7CisgICAgICAgIH0KKworICAgICAgaWYgKHJlcGx5ID09IE5VTEwpCisgICAgICAgIG9vbSAoKTsKKworICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKHJlcGx5LAorICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJmhlbGxvLAorICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgICAgICBvb20gKCk7CisKKyAgICAgIGlmICghZGJ1c19jb25uZWN0aW9uX3NlbmQgKGNvbm4sIHJlcGx5LCBOVUxMKSkKKyAgICAgICAgb29tICgpOworCisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKworICAgICAgcmV0dXJuIERCVVNfSEFORExFUl9SRVNVTFRfSEFORExFRDsKKyAgICB9CisKKyAgcmV0dXJuIERCVVNfSEFORExFUl9SRVNVTFRfTk9UX1lFVF9IQU5ETEVEOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3Blcm1pc3NpdmVfdW5peF9mdW5jIChEQnVzQ29ubmVjdGlvbiAqY29ubiwKKyAgICB1bnNpZ25lZCBsb25nIHVpZCwKKyAgICB2b2lkICpkYXRhKQoreworICBnX21lc3NhZ2UgKCJhY2NlcHRpbmcgVW5peCB1c2VyICVsdSIsIHVpZCk7CisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3Blcm1pc3NpdmVfd2luX2Z1bmMgKERCdXNDb25uZWN0aW9uICpjb25uLAorICAgIGNvbnN0IGNoYXIgKnNpZCwKKyAgICB2b2lkICpkYXRhKQoreworICBnX21lc3NhZ2UgKCJhY2NlcHRpbmcgV2luZG93cyB1c2VyIFwiJXNcIiIsIHNpZCk7CisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2Jyb2tlbl91bml4X2Z1bmMgKERCdXNDb25uZWN0aW9uICpjb25uLAorICAgIHVuc2lnbmVkIGxvbmcgdWlkLAorICAgIHZvaWQgKmRhdGEpCit7CisgIGdfZXJyb3IgKCJsaWJkYnVzIGNhbGxlZCB0aGUgVW5peCB1c2VyIGZ1bmN0aW9uIGZvciBhbiBBTk9OWU1PVVMtb25seSAiCisgICAgICAiY29ubmVjdGlvbiIpOworICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYnJva2VuX3dpbl9mdW5jIChEQnVzQ29ubmVjdGlvbiAqY29ubiwKKyAgICBjb25zdCBjaGFyICpzaWQsCisgICAgdm9pZCAqZGF0YSkKK3sKKyAgZ19lcnJvciAoImxpYmRidXMgY2FsbGVkIHRoZSBXaW5kb3dzIHVzZXIgZnVuY3Rpb24gZm9yIGFuIEFOT05ZTU9VUy1vbmx5ICIKKyAgICAgICJjb25uZWN0aW9uIik7CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90Cit1bmhhcHB5X3VuaXhfZnVuYyAoREJ1c0Nvbm5lY3Rpb24gKmNvbm4sCisgICAgdW5zaWduZWQgbG9uZyB1aWQsCisgICAgdm9pZCAqZGF0YSkKK3sKKyAgZ19tZXNzYWdlICgicmVqZWN0aW5nIFVuaXggdXNlciAlbHUiLCB1aWQpOworICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAordW5oYXBweV93aW5fZnVuYyAoREJ1c0Nvbm5lY3Rpb24gKmNvbm4sCisgICAgY29uc3QgY2hhciAqc2lkLAorICAgIHZvaWQgKmRhdGEpCit7CisgIGdfbWVzc2FnZSAoInJlamVjdGluZyBXaW5kb3dzIHVzZXIgXCIlc1wiIiwgc2lkKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK3NhbWVfdWlkX3VuaXhfZnVuYyAoREJ1c0Nvbm5lY3Rpb24gKmNvbm4sCisgICAgdW5zaWduZWQgbG9uZyB1aWQsCisgICAgdm9pZCAqZGF0YSkKK3sKKyAgZ19tZXNzYWdlICgiY2hlY2tpbmcgd2hldGhlciBVbml4IHVzZXIgJWx1IG93bnMgdGhpcyBwcm9jZXNzIiwgdWlkKTsKKyAgLyogSSdkIHVzZSBfZGJ1c191bml4X3VzZXJfaXNfcHJvY2Vzc19vd25lcigpLCBidXQgaXQncyBwcml2YXRlLi4uICovCisjaWZkZWYgR19PU19VTklYCisgIHJldHVybiAoZ2V0ZXVpZCAoKSA9PSB1aWQpOworI2Vsc2UKKyAgcmV0dXJuIEZBTFNFOworI2VuZGlmCit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorc2FtZV91aWRfd2luX2Z1bmMgKERCdXNDb25uZWN0aW9uICpjb25uLAorICAgIGNvbnN0IGNoYXIgKnNpZCwKKyAgICB2b2lkICpkYXRhKQoreworICBnX21lc3NhZ2UgKCJjaGVja2luZyB3aGV0aGVyIFdpbmRvd3MgdXNlciBcIiVzXCIgb3ducyB0aGlzIHByb2Nlc3MiLCBzaWQpOworICBnX21lc3NhZ2UgKCJTdHViIGltcGxlbWVudGF0aW9uIGNvbnNpc3RlbnQgd2l0aCBkYnVzLXN5c2RlcHMtdXRpbC13aW46ICIKKyAgICAgICJhc3N1bWUgdGhleSBkbyIpOworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK25ld19jb25uX2NiIChEQnVzU2VydmVyICpzZXJ2ZXIsCisgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm4sCisgICAgdm9pZCAqZGF0YSkKK3sKKyAgRml4dHVyZSAqZiA9IGRhdGE7CisKKyAgZGJ1c19jb25uZWN0aW9uX3JlZiAoY29ubik7CisgIHRlc3RfY29ubmVjdGlvbl9zZXR1cCAoZi0+Y3R4LCBjb25uKTsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9hZGRfZmlsdGVyIChjb25uLCBzZXJ2ZXJfbWVzc2FnZV9jYiwgZiwgTlVMTCkpCisgICAgb29tICgpOworCisgIGlmIChzZXJ2ZXIgPT0gZi0+bm9ybWFsX3NlcnZlcikKKyAgICB7CisgICAgfQorICBlbHNlIGlmIChzZXJ2ZXIgPT0gZi0+YW5vbl9hbGxvd2VkX3NlcnZlcikKKyAgICB7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fc2V0X2FsbG93X2Fub255bW91cyAoY29ubiwgVFJVRSk7CisgICAgfQorICBlbHNlIGlmIChzZXJ2ZXIgPT0gZi0+YW5vbl9vbmx5X3NlcnZlcikKKyAgICB7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fc2V0X2FsbG93X2Fub255bW91cyAoY29ubiwgVFJVRSk7CisKKyAgICAgIGRidXNfY29ubmVjdGlvbl9zZXRfdW5peF91c2VyX2Z1bmN0aW9uIChjb25uLCB1bmhhcHB5X3VuaXhfZnVuYywKKyAgICAgICAgICBmLCBOVUxMKTsKKyAgICAgIGRidXNfY29ubmVjdGlvbl9zZXRfd2luZG93c191c2VyX2Z1bmN0aW9uIChjb25uLCB1bmhhcHB5X3dpbl9mdW5jLAorICAgICAgICAgIGYsIE5VTEwpOworICAgIH0KKyAgZWxzZSBpZiAoc2VydmVyID09IGYtPmFub25fbWVjaF9vbmx5X3NlcnZlcikKKyAgICB7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fc2V0X2FsbG93X2Fub255bW91cyAoY29ubiwgVFJVRSk7CisKKyAgICAgIC8qIHNob3VsZCBuZXZlciBnZXQgY2FsbGVkICovCisgICAgICBkYnVzX2Nvbm5lY3Rpb25fc2V0X3VuaXhfdXNlcl9mdW5jdGlvbiAoY29ubiwgYnJva2VuX3VuaXhfZnVuYywKKyAgICAgICAgICBmLCBOVUxMKTsKKyAgICAgIGRidXNfY29ubmVjdGlvbl9zZXRfd2luZG93c191c2VyX2Z1bmN0aW9uIChjb25uLCBicm9rZW5fd2luX2Z1bmMsCisgICAgICAgICAgZiwgTlVMTCk7CisgICAgfQorICBlbHNlIGlmIChzZXJ2ZXIgPT0gZi0+YW5vbl9kaXNhbGxvd2VkX3NlcnZlcikKKyAgICB7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fc2V0X2FsbG93X2Fub255bW91cyAoY29ubiwgRkFMU0UpOworCisgICAgICAvKiBzaG91bGQgbmV2ZXIgZ2V0IGNhbGxlZCAqLworICAgICAgZGJ1c19jb25uZWN0aW9uX3NldF91bml4X3VzZXJfZnVuY3Rpb24gKGNvbm4sIGJyb2tlbl91bml4X2Z1bmMsCisgICAgICAgICAgZiwgTlVMTCk7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fc2V0X3dpbmRvd3NfdXNlcl9mdW5jdGlvbiAoY29ubiwgYnJva2VuX3dpbl9mdW5jLAorICAgICAgICAgIGYsIE5VTEwpOworICAgIH0KKyAgZWxzZSBpZiAoc2VydmVyID09IGYtPnBlcm1pc3NpdmVfc2VydmVyKQorICAgIHsKKyAgICAgIGRidXNfY29ubmVjdGlvbl9zZXRfdW5peF91c2VyX2Z1bmN0aW9uIChjb25uLCBwZXJtaXNzaXZlX3VuaXhfZnVuYywKKyAgICAgICAgICBmLCBOVUxMKTsKKyAgICAgIGRidXNfY29ubmVjdGlvbl9zZXRfd2luZG93c191c2VyX2Z1bmN0aW9uIChjb25uLCBwZXJtaXNzaXZlX3dpbl9mdW5jLAorICAgICAgICAgIGYsIE5VTEwpOworICAgIH0KKyAgZWxzZSBpZiAoc2VydmVyID09IGYtPnVuaGFwcHlfc2VydmVyKQorICAgIHsKKyAgICAgIGRidXNfY29ubmVjdGlvbl9zZXRfdW5peF91c2VyX2Z1bmN0aW9uIChjb25uLCB1bmhhcHB5X3VuaXhfZnVuYywKKyAgICAgICAgICBmLCBOVUxMKTsKKyAgICAgIGRidXNfY29ubmVjdGlvbl9zZXRfd2luZG93c191c2VyX2Z1bmN0aW9uIChjb25uLCB1bmhhcHB5X3dpbl9mdW5jLAorICAgICAgICAgIGYsIE5VTEwpOworICAgIH0KKyAgZWxzZSBpZiAoc2VydmVyID09IGYtPnNhbWVfdWlkX3NlcnZlcikKKyAgICB7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fc2V0X3VuaXhfdXNlcl9mdW5jdGlvbiAoY29ubiwgc2FtZV91aWRfdW5peF9mdW5jLAorICAgICAgICAgIGYsIE5VTEwpOworICAgICAgZGJ1c19jb25uZWN0aW9uX3NldF93aW5kb3dzX3VzZXJfZnVuY3Rpb24gKGNvbm4sIHNhbWVfdWlkX3dpbl9mdW5jLAorICAgICAgICAgIGYsIE5VTEwpOworICAgIH0KKyAgZWxzZSBpZiAoc2VydmVyID09IGYtPnNhbWVfdWlkX29yX2Fub25fc2VydmVyKQorICAgIHsKKyAgICAgIGRidXNfY29ubmVjdGlvbl9zZXRfYWxsb3dfYW5vbnltb3VzIChjb25uLCBUUlVFKTsKKworICAgICAgZGJ1c19jb25uZWN0aW9uX3NldF91bml4X3VzZXJfZnVuY3Rpb24gKGNvbm4sIHNhbWVfdWlkX3VuaXhfZnVuYywKKyAgICAgICAgICBmLCBOVUxMKTsKKyAgICAgIGRidXNfY29ubmVjdGlvbl9zZXRfd2luZG93c191c2VyX2Z1bmN0aW9uIChjb25uLCBzYW1lX3VpZF93aW5fZnVuYywKKyAgICAgICAgICBmLCBOVUxMKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBnX2Fzc2VydF9ub3RfcmVhY2hlZCAoKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitzZXR1cCAoRml4dHVyZSAqZiwKKyAgICBjb25zdCBnY2hhciAqbGlzdGVuX2FkZHIpCit7CisgIGNvbnN0IGNoYXIgKm9ubHlfYW5vbltdID0geyAiQU5PTllNT1VTIiwgTlVMTCB9OworICBjaGFyICpjb25uZWN0X2FkZHI7CisKKyAgZi0+bm9ybWFsX3NlcnZlciA9IGRidXNfc2VydmVyX2xpc3RlbiAobGlzdGVuX2FkZHIsICZmLT5lKTsKKyAgYXNzZXJ0X25vX2Vycm9yICgmZi0+ZSk7CisgIGdfYXNzZXJ0IChmLT5ub3JtYWxfc2VydmVyICE9IE5VTEwpOworICBkYnVzX3NlcnZlcl9zZXRfbmV3X2Nvbm5lY3Rpb25fZnVuY3Rpb24gKGYtPm5vcm1hbF9zZXJ2ZXIsCisgICAgICBuZXdfY29ubl9jYiwgZiwgTlVMTCk7CisgIHRlc3Rfc2VydmVyX3NldHVwIChmLT5jdHgsIGYtPm5vcm1hbF9zZXJ2ZXIpOworICBjb25uZWN0X2FkZHIgPSBkYnVzX3NlcnZlcl9nZXRfYWRkcmVzcyAoZi0+bm9ybWFsX3NlcnZlcik7CisgIGdfbWVzc2FnZSAoIk5vcm1hbCBzZXJ2ZXI6XG4lcyIsIGNvbm5lY3RfYWRkcik7CisgIGRidXNfZnJlZSAoY29ubmVjdF9hZGRyKTsKKworICBmLT5hbm9uX2FsbG93ZWRfc2VydmVyID0gZGJ1c19zZXJ2ZXJfbGlzdGVuIChsaXN0ZW5fYWRkciwgJmYtPmUpOworICBhc3NlcnRfbm9fZXJyb3IgKCZmLT5lKTsKKyAgZ19hc3NlcnQgKGYtPmFub25fYWxsb3dlZF9zZXJ2ZXIgIT0gTlVMTCk7CisgIGRidXNfc2VydmVyX3NldF9uZXdfY29ubmVjdGlvbl9mdW5jdGlvbiAoZi0+YW5vbl9hbGxvd2VkX3NlcnZlciwKKyAgICAgIG5ld19jb25uX2NiLCBmLCBOVUxMKTsKKyAgdGVzdF9zZXJ2ZXJfc2V0dXAgKGYtPmN0eCwgZi0+YW5vbl9hbGxvd2VkX3NlcnZlcik7CisgIGNvbm5lY3RfYWRkciA9IGRidXNfc2VydmVyX2dldF9hZGRyZXNzIChmLT5hbm9uX2FsbG93ZWRfc2VydmVyKTsKKyAgZ19tZXNzYWdlICgiQW5vbnltb3VzLWFsbG93ZWQgc2VydmVyOlxuJXMiLCBjb25uZWN0X2FkZHIpOworICBkYnVzX2ZyZWUgKGNvbm5lY3RfYWRkcik7CisKKyAgZi0+YW5vbl9vbmx5X3NlcnZlciA9IGRidXNfc2VydmVyX2xpc3RlbiAobGlzdGVuX2FkZHIsICZmLT5lKTsKKyAgYXNzZXJ0X25vX2Vycm9yICgmZi0+ZSk7CisgIGdfYXNzZXJ0IChmLT5hbm9uX29ubHlfc2VydmVyICE9IE5VTEwpOworICBkYnVzX3NlcnZlcl9zZXRfbmV3X2Nvbm5lY3Rpb25fZnVuY3Rpb24gKGYtPmFub25fb25seV9zZXJ2ZXIsCisgICAgICBuZXdfY29ubl9jYiwgZiwgTlVMTCk7CisgIHRlc3Rfc2VydmVyX3NldHVwIChmLT5jdHgsIGYtPmFub25fb25seV9zZXJ2ZXIpOworICBjb25uZWN0X2FkZHIgPSBkYnVzX3NlcnZlcl9nZXRfYWRkcmVzcyAoZi0+YW5vbl9vbmx5X3NlcnZlcik7CisgIGdfbWVzc2FnZSAoIkFub255bW91cy1vbmx5IHNlcnZlcjpcbiVzIiwgY29ubmVjdF9hZGRyKTsKKyAgZGJ1c19mcmVlIChjb25uZWN0X2FkZHIpOworCisgIGYtPmFub25fbWVjaF9vbmx5X3NlcnZlciA9IGRidXNfc2VydmVyX2xpc3RlbiAobGlzdGVuX2FkZHIsICZmLT5lKTsKKyAgYXNzZXJ0X25vX2Vycm9yICgmZi0+ZSk7CisgIGdfYXNzZXJ0IChmLT5hbm9uX21lY2hfb25seV9zZXJ2ZXIgIT0gTlVMTCk7CisgIGRidXNfc2VydmVyX3NldF9hdXRoX21lY2hhbmlzbXMgKGYtPmFub25fbWVjaF9vbmx5X3NlcnZlciwgb25seV9hbm9uKTsKKyAgZGJ1c19zZXJ2ZXJfc2V0X25ld19jb25uZWN0aW9uX2Z1bmN0aW9uIChmLT5hbm9uX21lY2hfb25seV9zZXJ2ZXIsCisgICAgICBuZXdfY29ubl9jYiwgZiwgTlVMTCk7CisgIHRlc3Rfc2VydmVyX3NldHVwIChmLT5jdHgsIGYtPmFub25fbWVjaF9vbmx5X3NlcnZlcik7CisgIGNvbm5lY3RfYWRkciA9IGRidXNfc2VydmVyX2dldF9hZGRyZXNzIChmLT5hbm9uX21lY2hfb25seV9zZXJ2ZXIpOworICBnX21lc3NhZ2UgKCJBbm9uIG1lY2ggb25seSBzZXJ2ZXI6XG4lcyIsIGNvbm5lY3RfYWRkcik7CisgIGRidXNfZnJlZSAoY29ubmVjdF9hZGRyKTsKKworICBmLT5hbm9uX2Rpc2FsbG93ZWRfc2VydmVyID0gZGJ1c19zZXJ2ZXJfbGlzdGVuIChsaXN0ZW5fYWRkciwgJmYtPmUpOworICBhc3NlcnRfbm9fZXJyb3IgKCZmLT5lKTsKKyAgZ19hc3NlcnQgKGYtPmFub25fZGlzYWxsb3dlZF9zZXJ2ZXIgIT0gTlVMTCk7CisgIGRidXNfc2VydmVyX3NldF9hdXRoX21lY2hhbmlzbXMgKGYtPmFub25fZGlzYWxsb3dlZF9zZXJ2ZXIsIG9ubHlfYW5vbik7CisgIGRidXNfc2VydmVyX3NldF9uZXdfY29ubmVjdGlvbl9mdW5jdGlvbiAoZi0+YW5vbl9kaXNhbGxvd2VkX3NlcnZlciwKKyAgICAgIG5ld19jb25uX2NiLCBmLCBOVUxMKTsKKyAgdGVzdF9zZXJ2ZXJfc2V0dXAgKGYtPmN0eCwgZi0+YW5vbl9kaXNhbGxvd2VkX3NlcnZlcik7CisgIGNvbm5lY3RfYWRkciA9IGRidXNfc2VydmVyX2dldF9hZGRyZXNzIChmLT5hbm9uX2Rpc2FsbG93ZWRfc2VydmVyKTsKKyAgZ19tZXNzYWdlICgiQW5vbnltb3VzLWRpc2FsbG93ZWQgc2VydmVyOlxuJXMiLCBjb25uZWN0X2FkZHIpOworICBkYnVzX2ZyZWUgKGNvbm5lY3RfYWRkcik7CisKKyAgZi0+cGVybWlzc2l2ZV9zZXJ2ZXIgPSBkYnVzX3NlcnZlcl9saXN0ZW4gKGxpc3Rlbl9hZGRyLCAmZi0+ZSk7CisgIGFzc2VydF9ub19lcnJvciAoJmYtPmUpOworICBnX2Fzc2VydCAoZi0+cGVybWlzc2l2ZV9zZXJ2ZXIgIT0gTlVMTCk7CisgIGRidXNfc2VydmVyX3NldF9uZXdfY29ubmVjdGlvbl9mdW5jdGlvbiAoZi0+cGVybWlzc2l2ZV9zZXJ2ZXIsCisgICAgICBuZXdfY29ubl9jYiwgZiwgTlVMTCk7CisgIHRlc3Rfc2VydmVyX3NldHVwIChmLT5jdHgsIGYtPnBlcm1pc3NpdmVfc2VydmVyKTsKKyAgY29ubmVjdF9hZGRyID0gZGJ1c19zZXJ2ZXJfZ2V0X2FkZHJlc3MgKGYtPnBlcm1pc3NpdmVfc2VydmVyKTsKKyAgZ19tZXNzYWdlICgiUGVybWlzc2l2ZSBzZXJ2ZXI6XG4lcyIsIGNvbm5lY3RfYWRkcik7CisgIGRidXNfZnJlZSAoY29ubmVjdF9hZGRyKTsKKworICBmLT51bmhhcHB5X3NlcnZlciA9IGRidXNfc2VydmVyX2xpc3RlbiAobGlzdGVuX2FkZHIsICZmLT5lKTsKKyAgYXNzZXJ0X25vX2Vycm9yICgmZi0+ZSk7CisgIGdfYXNzZXJ0IChmLT51bmhhcHB5X3NlcnZlciAhPSBOVUxMKTsKKyAgZGJ1c19zZXJ2ZXJfc2V0X25ld19jb25uZWN0aW9uX2Z1bmN0aW9uIChmLT51bmhhcHB5X3NlcnZlciwKKyAgICAgIG5ld19jb25uX2NiLCBmLCBOVUxMKTsKKyAgdGVzdF9zZXJ2ZXJfc2V0dXAgKGYtPmN0eCwgZi0+dW5oYXBweV9zZXJ2ZXIpOworICBjb25uZWN0X2FkZHIgPSBkYnVzX3NlcnZlcl9nZXRfYWRkcmVzcyAoZi0+dW5oYXBweV9zZXJ2ZXIpOworICBnX21lc3NhZ2UgKCJVbmhhcHB5IHNlcnZlcjpcbiVzIiwgY29ubmVjdF9hZGRyKTsKKyAgZGJ1c19mcmVlIChjb25uZWN0X2FkZHIpOworCisgIGYtPnNhbWVfdWlkX3NlcnZlciA9IGRidXNfc2VydmVyX2xpc3RlbiAobGlzdGVuX2FkZHIsICZmLT5lKTsKKyAgYXNzZXJ0X25vX2Vycm9yICgmZi0+ZSk7CisgIGdfYXNzZXJ0IChmLT5zYW1lX3VpZF9zZXJ2ZXIgIT0gTlVMTCk7CisgIGRidXNfc2VydmVyX3NldF9uZXdfY29ubmVjdGlvbl9mdW5jdGlvbiAoZi0+c2FtZV91aWRfc2VydmVyLAorICAgICAgbmV3X2Nvbm5fY2IsIGYsIE5VTEwpOworICB0ZXN0X3NlcnZlcl9zZXR1cCAoZi0+Y3R4LCBmLT5zYW1lX3VpZF9zZXJ2ZXIpOworICBjb25uZWN0X2FkZHIgPSBkYnVzX3NlcnZlcl9nZXRfYWRkcmVzcyAoZi0+c2FtZV91aWRfc2VydmVyKTsKKyAgZ19tZXNzYWdlICgiU2FtZS1VSUQgc2VydmVyOlxuJXMiLCBjb25uZWN0X2FkZHIpOworICBkYnVzX2ZyZWUgKGNvbm5lY3RfYWRkcik7CisKKyAgZi0+c2FtZV91aWRfb3JfYW5vbl9zZXJ2ZXIgPSBkYnVzX3NlcnZlcl9saXN0ZW4gKGxpc3Rlbl9hZGRyLCAmZi0+ZSk7CisgIGFzc2VydF9ub19lcnJvciAoJmYtPmUpOworICBnX2Fzc2VydCAoZi0+c2FtZV91aWRfb3JfYW5vbl9zZXJ2ZXIgIT0gTlVMTCk7CisgIGRidXNfc2VydmVyX3NldF9uZXdfY29ubmVjdGlvbl9mdW5jdGlvbiAoZi0+c2FtZV91aWRfb3JfYW5vbl9zZXJ2ZXIsCisgICAgICBuZXdfY29ubl9jYiwgZiwgTlVMTCk7CisgIHRlc3Rfc2VydmVyX3NldHVwIChmLT5jdHgsIGYtPnNhbWVfdWlkX29yX2Fub25fc2VydmVyKTsKKyAgY29ubmVjdF9hZGRyID0gZGJ1c19zZXJ2ZXJfZ2V0X2FkZHJlc3MgKGYtPnNhbWVfdWlkX29yX2Fub25fc2VydmVyKTsKKyAgZ19tZXNzYWdlICgiU2FtZS1VSUQtb3ItYW5vbiBzZXJ2ZXI6XG4lcyIsIGNvbm5lY3RfYWRkcik7CisgIGRidXNfZnJlZSAoY29ubmVjdF9hZGRyKTsKK30KKworaW50CittYWluIChpbnQgYXJnYywKKyAgICBjaGFyICoqYXJndikKK3sKKyAgRml4dHVyZSBmID0geyBEQlVTX0VSUk9SX0lOSVQsIHRlc3RfbWFpbl9jb250ZXh0X2dldCAoKSB9OworCisgIGlmIChhcmdjID49IDIpCisgICAgc2V0dXAgKCZmLCBhcmd2WzFdKTsKKyAgZWxzZQorICAgIHNldHVwICgmZiwgInRjcDpob3N0PTEyNy4wLjAuMSIpOworCisgIGZvciAoOzspCisgICAgdGVzdF9tYWluX2NvbnRleHRfaXRlcmF0ZSAoZi5jdHgsIFRSVUUpOworCisgIC8qIG5ldmVyIHJldHVybnMgKi8KK30KZGlmZiAtLWdpdCBhL3Rlc3QvbWFudWFsLWJhY2t0cmFjZS5jIGIvdGVzdC9tYW51YWwtYmFja3RyYWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNjMTQ5OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbWFudWFsLWJhY2t0cmFjZS5jCkBAIC0wLDAgKzEsNjIgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogdGVzdC1iYWNrdHJhY2UuYyBiYWNrdHJhY2UgdGVzdCBhcHAKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgUmFsZiBIYWJhY2tlciA8cmFsZi5oYWJhY2tlckBmcmVlbmV0LmRlPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXN5c2RlcHMuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKK3N0YXRpYyB2b2lkCit0ZXN0MiAodm9pZCkKK3sKKyAgX2RidXNfcHJpbnRfYmFja3RyYWNlKCk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0MSAodm9pZCkKK3sKKyAgdGVzdDIoKTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3QgKHZvaWQpCit7CisgIHRlc3QxKCk7Cit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICBpZiAoYXJnYyA9PSAyKQorICAgIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiZGJ1c19hYm9ydCB0ZXN0XG4iKTsKKyAgICAgIF9kYnVzX2Fib3J0ICgpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHRlc3QoKTsKKyAgICB9CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9tYW51YWwtZGlyLWl0ZXIuYyBiL3Rlc3QvbWFudWFsLWRpci1pdGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODUwODE3NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbWFudWFsLWRpci1pdGVyLmMKQEAgLTAsMCArMSw5NCBAQAorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgInRlc3QtdXRpbHMuaCIKKworI2luY2x1ZGUgImRidXMvZGJ1cy1tYWNyb3MuaCIKKyNpbmNsdWRlICJkYnVzL2RidXMtc3lzZGVwcy5oIgorCitzdGF0aWMgdm9pZCBvb20gKGNvbnN0IGNoYXIgKmRvaW5nKSBfREJVU19HTlVDX05PUkVUVVJOOworc3RhdGljIHZvaWQgZGllIChjb25zdCBjaGFyICptZXNzYWdlKSBfREJVU19HTlVDX05PUkVUVVJOOworCit2b2lkCitvb20gKGNvbnN0IGNoYXIgKmRvaW5nKQoreworICBmcHJpbnRmIChzdGRlcnIsICIqKiogbWFudWFsLWRpci1pdGVyOiBPT00gd2hpbGUgJXNcbiIsIGRvaW5nKTsKKyAgZXhpdCAoMSk7Cit9CisKK3ZvaWQKK2RpZSAoY29uc3QgY2hhciAqbWVzc2FnZSkKK3sKKyAgZnByaW50ZiAoc3RkZXJyLCAiKioqIG1hbnVhbC1kaXItaXRlcjogJXNcbiIsIG1lc3NhZ2UpOworICBleGl0ICgxKTsKK30KKworc3RhdGljIHZvaWQKK2RlYnVnIChjb25zdCBjaGFyICptZXNzYWdlKQoreworICBmcHJpbnRmIChzdGRvdXQsICIrKysgbWFudWFsLWRpci1pdGVyOiAlc1xuIiwgbWVzc2FnZSk7Cit9CisKK2ludAorbWFpbiAoaW50ICAgIGFyZ2MsCisgICAgICBjaGFyICoqYXJndikKK3sKKyAgREJ1c1N0cmluZyBmaWxlbmFtZTsKKyAgREJ1c1N0cmluZyBkaXJuYW1lOworICBEQnVzRXJyb3IgdG1wX2Vycm9yOworICBEQnVzRGlySXRlciAqZGlyOworCisgIGlmIChhcmdjICE9IDIpCisgICAgICBkaWUgKCJzeW50YXg6IG1hbnVhbC1kaXItaXRlciA8cGF0aD4iKTsKKworICBkYnVzX2Vycm9yX2luaXQgKCZ0bXBfZXJyb3IpOworCisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZmaWxlbmFtZSkpCisgICAgICBvb20gKCJpbml0IGZpbGVuYW1lIik7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmRpcm5hbWUpKQorICAgICAgb29tICgiaW5pdCBkaXJuYW1lIik7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfYXBwZW5kICgmZGlybmFtZSwgYXJndlsxXSkpCisgICAgICBvb20gKCJhcHBlbmQgYXJndlsxXSIpOworCisgIGRpciA9IF9kYnVzX2RpcmVjdG9yeV9vcGVuICgmZGlybmFtZSwgJnRtcF9lcnJvcik7CisKKyAgaWYgKGRpciA9PSBOVUxMKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgImNvdWxkIG5vdCBvcGVuIGRpcmVjdG9yeTogJXM6ICVzXG4iLAorICAgICAgICAgICAgICAgdG1wX2Vycm9yLm5hbWUsIHRtcF9lcnJvci5tZXNzYWdlKTsKKyAgICAgIGV4aXQoMSk7CisgICAgfQorCisgIHdoaWxlIChfZGJ1c19kaXJlY3RvcnlfZ2V0X25leHRfZmlsZSAoZGlyLCAmZmlsZW5hbWUsICZ0bXBfZXJyb3IpKQorICAgIHsKKyAgICAgIERCdXNTdHJpbmcgZnVsbF9wYXRoOworICAgICAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJmZ1bGxfcGF0aCkpCisgICAgICAgIHsKKyAgICAgICAgICBvb20gKCJpbml0IGZ1bGxfcGF0aCIpOworICAgICAgICB9CisKKyAgICAgIGlmICghX2RidXNfc3RyaW5nX2NvcHkgKCZkaXJuYW1lLCAwLCAmZnVsbF9wYXRoLCAwKSkKKyAgICAgICAgeworICAgICAgICAgIG9vbSAoImNvcHlpbmcgZnVsbF9wYXRoIHRvIGRpcm5hbWUiKTsKKyAgICAgICAgfQorCisgICAgICBpZiAoIV9kYnVzX2NvbmNhdF9kaXJfYW5kX2ZpbGUgKCZmdWxsX3BhdGgsICZmaWxlbmFtZSkpCisgICAgICAgIHsKKyAgICAgICAgICBvb20gKCJjb25jYXQgZnVsbF9wYXRoIik7CisgICAgICAgIH0KKyAgICAgIGRlYnVnIChfZGJ1c19zdHJpbmdfZ2V0X2NvbnN0X2RhdGEgKCZmaWxlbmFtZSkpOworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmdWxsX3BhdGgpOworICAgIH0KKworICBpZiAoZGJ1c19lcnJvcl9pc19zZXQgKCZ0bXBfZXJyb3IpKQorICAgICAgZGllICh0bXBfZXJyb3IubWVzc2FnZSk7CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZmaWxlbmFtZSk7CisKKyAgaWYgKGRpcikKKyAgICBfZGJ1c19kaXJlY3RvcnlfY2xvc2UgKGRpcik7CisKKyAgX2RidXNfdmVyYm9zZSAoIioqKiBUZXN0IGRpciBuYW1lIGV4aXRpbmdcbiIpOworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9tYW51YWwtcGF0aHMuYyBiL3Rlc3QvbWFudWFsLXBhdGhzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJmYzY2OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbWFudWFsLXBhdGhzLmMKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiBTaW1wbGUgbWFudWFsIHBhdGhzIGNoZWNrCisgKgorICogc3ludGF4OiAgbWFudWFsLXBhdGhzCisgKgorKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImRidXMvZGJ1cy1saXN0LmgiCisjaW5jbHVkZSAiZGJ1cy9kYnVzLWludGVybmFscy5oIgorI2luY2x1ZGUgImRidXMvZGJ1cy1zeXNkZXBzLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCitzdGF0aWMgZGJ1c19ib29sX3QKK3ByaW50X2luc3RhbGxfcm9vdCAodm9pZCkKK3sKKyAgREJ1c1N0cmluZyBydW50aW1lX3ByZWZpeDsKKworICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmcnVudGltZV9wcmVmaXgpKQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm91dCBvZiBtZW1vcnkiKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgaWYgKCFfZGJ1c19nZXRfaW5zdGFsbF9yb290ICgmcnVudGltZV9wcmVmaXgpKQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIm91dCBvZiBtZW1vcnkiKTsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmcnVudGltZV9wcmVmaXgpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZydW50aW1lX3ByZWZpeCkgPT0gMCkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJfZGJ1c19nZXRfaW5zdGFsbF9yb290KCkgZmFpbGVkXG4iKTsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmcnVudGltZV9wcmVmaXgpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBmcHJpbnRmIChzdGRvdXQsICJfZGJ1c19nZXRfaW5zdGFsbF9yb290KCkgcmV0dXJuZWQgJyVzJ1xuIiwKKyAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJnJ1bnRpbWVfcHJlZml4KSk7CisgIF9kYnVzX3N0cmluZ19mcmVlICgmcnVudGltZV9wcmVmaXgpOworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitwcmludF9zZXJ2aWNlX2RpcnMgKHZvaWQpCit7CisgIERCdXNMaXN0ICpkaXJzOworICBEQnVzTGlzdCAqbGluazsKKyAgZGlycyA9IE5VTEw7CisKKyAgaWYgKCFfZGJ1c19nZXRfc3RhbmRhcmRfc2Vzc2lvbl9zZXJ2aWNlZGlycyAoJmRpcnMpKQorICAgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoImNvdWxkbid0IGdldCBzdGFuZGFyZCBkaXJzIik7CisKKyAgd2hpbGUgKChsaW5rID0gX2RidXNfbGlzdF9wb3BfZmlyc3RfbGluayAoJmRpcnMpKSkKKyAgICB7CisgICAgICBwcmludGYgKCJkZWZhdWx0IHNlcnZpY2UgZGlyOiAlc1xuIiwgKGNoYXIgKilsaW5rLT5kYXRhKTsKKyAgICAgIGRidXNfZnJlZSAobGluay0+ZGF0YSk7CisgICAgICBfZGJ1c19saXN0X2ZyZWVfbGluayAobGluayk7CisgICAgfQorICBkYnVzX2ZyZWUgKGRpcnMpOworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGRidXNfYm9vbF90IHByaW50X3JlcGxhY2VfaW5zdGFsbF9wcmVmaXgoY29uc3QgY2hhciAqcykKK3sKKyAgREJ1c1N0cmluZyBzdHI7CisKKyAgaWYgKCFfZGJ1c19zdHJpbmdfaW5pdCAoJnN0cikpCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib3V0IG9mIG1lbW9yeSIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBpZiAoIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZzdHIsIHMpIHx8CisgICAgICAhX2RidXNfcmVwbGFjZV9pbnN0YWxsX3ByZWZpeCAoJnN0cikpCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgib3V0IG9mIG1lbW9yeSIpOworICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZzdHIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBmcHJpbnRmKHN0ZG91dCwgInJlcGxhY2VkICclcycgYnkgJyVzJ1xuIiwgcywKKyAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJnN0cikpOworICBfZGJ1c19zdHJpbmdfZnJlZSAoJnN0cik7CisgIHJldHVybiBUUlVFOworfQorCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgaWYgKCFwcmludF9pbnN0YWxsX3Jvb3QoKSkKKyAgICByZXR1cm4gLTE7CisKKyAgaWYgKCFwcmludF9zZXJ2aWNlX2RpcnMoKSkKKyAgICByZXR1cm4gLTI7CisKKyAgaWYgKCFwcmludF9yZXBsYWNlX2luc3RhbGxfcHJlZml4KERCVVNfQklORElSICIvZGJ1cy1kYWVtb24iKSkKKyAgICByZXR1cm4gLTM7CisKKyAgaWYgKCFwcmludF9yZXBsYWNlX2luc3RhbGxfcHJlZml4KCJjOlxcV2luZG93c1xcU3lzdGVtMzJcXHRlc3RmaWxlIikpCisgICAgcmV0dXJuIC00OworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9tYW51YWwtdGNwLmMgYi90ZXN0L21hbnVhbC10Y3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDY5MWM5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9tYW51YWwtdGNwLmMKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIFNpbXBsZSBtYW51YWwgdGNwIGNoZWNrCisgKgorICogc3VwcG9ydHM6CisgKiAtIHNlcnZlciBsaXN0ZW5pbmcgY2hlY2sKKyAqCisgKiBzeW50YXg6ICBtYW51YWwtdGNwIFs8aXB2ND58PGlwdjY+XQorICoKKyovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJkYnVzL2RidXMtc2VydmVyLXNvY2tldC5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgICAgREJ1c1NlcnZlciAgICAgICpzZXJ2ZXI7CisgICAgREJ1c0Vycm9yICAgICAgIGVycm9yOworICAgIGludCByZXN1bHQgPSAwOworICAgIGludCBpOworCisgICAgY2hhciAqZmFtaWx5ID0gTlVMTDsKKworICAgIGlmIChhcmdjID09IDIpCisgICAgICAgIGZhbWlseSA9IGFyZ3ZbMV07CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTAwMDsgaSsrKQorICAgIHsKKyAgICAgICAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworICAgICAgICBzZXJ2ZXIgPSBfZGJ1c19zZXJ2ZXJfbmV3X2Zvcl90Y3Bfc29ja2V0ICgibG9jYWxob3N0IiwgImxvY2FsaG9zdCIsICIwIiwgZmFtaWx5LCAmZXJyb3IsIEZBTFNFKTsKKyAgICAgICAgaWYgKHNlcnZlciA9PSBOVUxMKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50ZigiJWQ6ICVzICVzXG4iLGksIGVycm9yLm5hbWUsIGVycm9yLm1lc3NhZ2UpOworICAgICAgICAgICAgZGJ1c19lcnJvcl9mcmVlKCZlcnJvcik7CisgICAgICAgICAgICByZXN1bHQgPSAtMTsKKyAgICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcHJpbnRmKCIlZDogJXMgXG4iLGksIGRidXNfc2VydmVyX2dldF9hZGRyZXNzKHNlcnZlcikpOworICAgICAgICAgICAgZGJ1c19zZXJ2ZXJfZGlzY29ubmVjdChzZXJ2ZXIpOworICAgICAgICAgICAgZGJ1c19zZXJ2ZXJfdW5yZWYoc2VydmVyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQpkaWZmIC0tZ2l0IGEvdGVzdC9tYXJzaGFsLmMgYi90ZXN0L21hcnNoYWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzUzZWMwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9tYXJzaGFsLmMKQEAgLTAsMCArMSwyNzUgQEAKKy8qIFNpbXBsZSBzYW5pdHktY2hlY2sgZm9yIEQtQnVzIG1lc3NhZ2Ugc2VyaWFsaXphdGlvbi4KKyAqCisgKiBBdXRob3I6IFNpbW9uIE1jVml0dGllIDxzaW1vbi5tY3ZpdHRpZUBjb2xsYWJvcmEuY28udWs+CisgKiBDb3B5cmlnaHQgwqkgMjAxMC0yMDExIE5va2lhIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzCisgKiAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLAorICogaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwKKyAqIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsCisgKiBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAorICogc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKKyAqIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorCisjaW5jbHVkZSA8Z2xpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLmg+CisKKyNpbmNsdWRlICJ0ZXN0LXV0aWxzLWdsaWIuaCIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIERCdXNFcnJvciBlOworfSBGaXh0dXJlOworCitzdGF0aWMgdm9pZAorYXNzZXJ0X25vX2Vycm9yIChjb25zdCBEQnVzRXJyb3IgKmUpCit7CisgIGlmIChHX1VOTElLRUxZIChkYnVzX2Vycm9yX2lzX3NldCAoZSkpKQorICAgIGdfZXJyb3IgKCJleHBlY3RlZCBzdWNjZXNzIGJ1dCBnb3QgZXJyb3I6ICVzOiAlcyIsIGUtPm5hbWUsIGUtPm1lc3NhZ2UpOworfQorCitzdGF0aWMgdm9pZAorc2V0dXAgKEZpeHR1cmUgKmYsCisgICAgZ2NvbnN0cG9pbnRlciBhcmcgR19HTlVDX1VOVVNFRCkKK3sKKyAgZGJ1c19lcnJvcl9pbml0ICgmZi0+ZSk7Cit9CisKKy8qIHRoaXMgaXMgbWVhbnQgdG8gYmUgb2J2aW91c2x5IGNvcnJlY3QsIG5vdCBlZmZpY2llbnQhICovCitzdGF0aWMgZ3VpbnQzMgorZ2V0X3VpbnQzMiAoY29uc3QgZ2NoYXIgKmJsb2IsCisgICAgZ3NpemUgb2Zmc2V0LAorICAgIGNoYXIgZW5kaWFuKQoreworICBpZiAoZW5kaWFuID09ICdsJykKKyAgICB7CisgICAgICByZXR1cm4KKyAgICAgICAgYmxvYltvZmZzZXRdIHwKKyAgICAgICAgKGJsb2Jbb2Zmc2V0ICsgMV0gPDwgOCkgfAorICAgICAgICAoYmxvYltvZmZzZXQgKyAyXSA8PCAxNikgfAorICAgICAgICAoYmxvYltvZmZzZXQgKyAzXSA8PCAyNCk7CisgICAgfQorICBlbHNlIGlmIChlbmRpYW4gPT0gJ0InKQorICAgIHsKKyAgICAgIHJldHVybgorICAgICAgICAoYmxvYltvZmZzZXRdIDw8IDI0KSB8CisgICAgICAgIChibG9iW29mZnNldCArIDFdIDw8IDE2KSB8CisgICAgICAgIChibG9iW29mZnNldCArIDJdIDw8IDgpIHwKKyAgICAgICAgYmxvYltvZmZzZXQgKyAzXTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBnX2Fzc2VydF9ub3RfcmVhY2hlZCAoKTsKKyAgICB9Cit9CisKKyNkZWZpbmUgQkxPQl9MRU5HVEggKHNpemVvZiAobGVfYmxvYikgLSAxKQorI2RlZmluZSBPRkZTRVRfQk9EWV9MRU5HVEggKDQpCisjZGVmaW5lIE9GRlNFVF9TRVJJQUwgKDgpCisKK2NvbnN0IGdjaGFyIGxlX2Jsb2JbXSA9CisgICAgLyogYnl0ZSAwICovCisgICAgLyogeXl5eXV1IGZpeGVkIGhlYWRlcnMgKi8KKyAgICAibCIgICAgICAgICAgICAgICAgICAgICAvKiBsaXR0bGUtZW5kaWFuICovCisgICAgIlwyIiAgICAgICAgICAgICAgICAgICAgLyogcmVwbHkgKHdoaWNoIGlzIHRoZSBzaW1wbGVzdCBtZXNzYWdlKSAqLworICAgICJcMiIgICAgICAgICAgICAgICAgICAgIC8qIG5vIGF1dG8tc3RhcnRpbmcgKi8KKyAgICAiXDEiICAgICAgICAgICAgICAgICAgICAvKiBELUJ1cyB2ZXJzaW9uID0gMSAqLworICAgIC8qIGJ5dGUgNCAqLworICAgICJcNFwwXDBcMCIgICAgICAgICAgICAgIC8qIGJ5dGVzIGluIGJvZHkgPSA0ICovCisgICAgLyogYnl0ZSA4ICovCisgICAgIlx4NzhceDU2XHgzNFx4MTIiICAgICAgLyogc2VyaWFsIG51bWJlciA9IDB4MTIzNDU2NzggKi8KKyAgICAvKiBieXRlIDEyICovCisgICAgLyogYSh1dikgdmFyaWFibGUgaGVhZGVycyBzdGFydCBoZXJlICovCisgICAgIlx4MGZcMFwwXDAiICAgICAgICAgICAgLyogYnl0ZXMgaW4gYXJyYXkgb2YgdmFyaWFibGUgaGVhZGVycyA9IDE1ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcGFkIHRvIDgtYnl0ZSBib3VuZGFyeSA9IG5vdGhpbmcgKi8KKyAgICAvKiBieXRlIDE2ICovCisgICAgIlw1IiAgICAgICAgICAgICAgICAgICAgLyogaW4gcmVwbHkgdG86ICovCisgICAgICAgICJcMXVcMCIgICAgICAgICAgICAgLyogdmFyaWFudCBzaWduYXR1cmUgPSB1ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcGFkIHRvIDQtYnl0ZSBib3VuZGFyeSA9IG5vdGhpbmcgKi8KKyAgICAgICAgIlx4MTJceGVmXHhjZFx4YWIiICAvKiAweGFiY2RlZjEyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcGFkIHRvIDgtYnl0ZSBib3VuZGFyeSA9IG5vdGhpbmcgKi8KKyAgICAvKiBieXRlIDI0ICovCisgICAgIlx4MDgiICAgICAgICAgICAgICAgICAgLyogc2lnbmF0dXJlOiAqLworICAgICAgICAiXDFnXDAiICAgICAgICAgICAgIC8qIHZhcmlhbnQgc2lnbmF0dXJlID0gZyAqLworICAgICAgICAiXDF1XDAiICAgICAgICAgICAgIC8qIDEgYnl0ZSwgdSwgTlVMIChubyBhbGlnbm1lbnQgbmVlZGVkKSAqLworICAgICAgICAiXDAiICAgICAgICAgICAgICAgIC8qIHBhZCB0byA4LWJ5dGUgYm91bmRhcnkgZm9yIGJvZHkgKi8KKyAgICAvKiBib2R5OyBieXRlIDMyICovCisgICAgIlx4ZWZceGJlXHhhZFx4ZGUiICAgICAgLyogMHhkZWFkYmVlZiAqLworICAgIDsKKworY29uc3QgZ2NoYXIgYmVfYmxvYltdID0KKyAgICAvKiBieXRlIDAgKi8KKyAgICAvKiB5eXl5dXUgZml4ZWQgaGVhZGVycyAqLworICAgICJCIiAgICAgICAgICAgICAgICAgICAgIC8qIGJpZy1lbmRpYW4gKi8KKyAgICAiXDIiICAgICAgICAgICAgICAgICAgICAvKiByZXBseSAod2hpY2ggaXMgdGhlIHNpbXBsZXN0IG1lc3NhZ2UpICovCisgICAgIlwyIiAgICAgICAgICAgICAgICAgICAgLyogbm8gYXV0by1zdGFydGluZyAqLworICAgICJcMSIgICAgICAgICAgICAgICAgICAgIC8qIEQtQnVzIHZlcnNpb24gPSAxICovCisgICAgLyogYnl0ZSA0ICovCisgICAgIlwwXDBcMFw0IiAgICAgICAgICAgICAgLyogYnl0ZXMgaW4gYm9keSA9IDQgKi8KKyAgICAvKiBieXRlIDggKi8KKyAgICAiXHgxMlx4MzRceDU2XHg3OCIgICAgICAvKiBzZXJpYWwgbnVtYmVyID0gMHgxMjM0NTY3OCAqLworICAgIC8qIGJ5dGUgMTIgKi8KKyAgICAvKiBhKHV2KSB2YXJpYWJsZSBoZWFkZXJzIHN0YXJ0IGhlcmUgKi8KKyAgICAiXDBcMFwwXHgwZiIgICAgICAgICAgICAvKiBieXRlcyBpbiBhcnJheSBvZiB2YXJpYWJsZSBoZWFkZXJzID0gMTUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwYWQgdG8gOC1ieXRlIGJvdW5kYXJ5ID0gbm90aGluZyAqLworICAgIC8qIGJ5dGUgMTYgKi8KKyAgICAiXDUiICAgICAgICAgICAgICAgICAgICAvKiBpbiByZXBseSB0bzogKi8KKyAgICAgICAgIlwxdVwwIiAgICAgICAgICAgICAvKiB2YXJpYW50IHNpZ25hdHVyZSA9IHUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwYWQgdG8gNC1ieXRlIGJvdW5kYXJ5ID0gbm90aGluZyAqLworICAgICAgICAiXHhhYlx4Y2RceGVmXHgxMiIgIC8qIDB4YWJjZGVmMTIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwYWQgdG8gOC1ieXRlIGJvdW5kYXJ5ID0gbm90aGluZyAqLworICAgIC8qIGJ5dGUgMjQgKi8KKyAgICAiXHgwOCIgICAgICAgICAgICAgICAgICAvKiBzaWduYXR1cmU6ICovCisgICAgICAgICJcMWdcMCIgICAgICAgICAgICAgLyogdmFyaWFudCBzaWduYXR1cmUgPSBnICovCisgICAgICAgICJcMXVcMCIgICAgICAgICAgICAgLyogMSBieXRlLCB1LCBOVUwgKG5vIGFsaWdubWVudCBuZWVkZWQpICovCisgICAgICAgICJcMCIgICAgICAgICAgICAgICAgLyogcGFkIHRvIDgtYnl0ZSBib3VuZGFyeSBmb3IgYm9keSAqLworICAgIC8qIGJvZHk7IGJ5dGUgMzIgKi8KKyAgICAiXHhkZVx4YWRceGJlXHhlZiIgICAgICAvKiAweGRlYWRiZWVmICovCisgICAgOworCitzdGF0aWMgdm9pZAordGVzdF9lbmRpYW4gKEZpeHR1cmUgKmYsCisgICAgZ2NvbnN0cG9pbnRlciBhcmcpCit7CisgIGNvbnN0IGdjaGFyICpibG9iID0gYXJnOworICBjaGFyICpvdXRwdXQ7CisgIERCdXNNZXNzYWdlICptOworICBpbnQgbGVuOworICBkYnVzX3VpbnQzMl90IHU7CisgIGRidXNfYm9vbF90IG9rOworCisgIGdfYXNzZXJ0X2NtcHVpbnQgKChndWludCkgc2l6ZW9mIChsZV9ibG9iKSwgPT0sIChndWludCkgc2l6ZW9mIChiZV9ibG9iKSk7CisKKyAgZ19hc3NlcnRfY21wdWludCAoZ2V0X3VpbnQzMiAoYmxvYiwgT0ZGU0VUX0JPRFlfTEVOR1RILCBibG9iWzBdKSwgPT0sIDQpOworICBnX2Fzc2VydF9jbXB1aW50IChnZXRfdWludDMyIChibG9iLCBPRkZTRVRfU0VSSUFMLCBibG9iWzBdKSwgPT0sCisgICAgICAweDEyMzQ1Njc4dSk7CisKKyAgbGVuID0gZGJ1c19tZXNzYWdlX2RlbWFyc2hhbF9ieXRlc19uZWVkZWQgKGJsb2IsIHNpemVvZiAobGVfYmxvYikpOworICAvKiBldmVyeXRoaW5nIGluIHRoZSBzdHJpbmcgZXhjZXB0IHRoZSBpbXBsaWNpdCAiXDAiIGF0IHRoZSBlbmQgaXMgcGFydCBvZgorICAgKiB0aGUgbWVzc2FnZSAqLworICBnX2Fzc2VydF9jbXBpbnQgKGxlbiwgPT0sIEJMT0JfTEVOR1RIKTsKKworICBtID0gZGJ1c19tZXNzYWdlX2RlbWFyc2hhbCAoYmxvYiwgc2l6ZW9mIChsZV9ibG9iKSwgJmYtPmUpOworICBhc3NlcnRfbm9fZXJyb3IgKCZmLT5lKTsKKyAgZ19hc3NlcnQgKG0gIT0gTlVMTCk7CisKKyAgZ19hc3NlcnRfY21wdWludCAoZGJ1c19tZXNzYWdlX2dldF9zZXJpYWwgKG0pLCA9PSwgMHgxMjM0NTY3OHUpOworICBnX2Fzc2VydF9jbXB1aW50IChkYnVzX21lc3NhZ2VfZ2V0X3JlcGx5X3NlcmlhbCAobSksID09LCAweGFiY2RlZjEydSk7CisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9zaWduYXR1cmUgKG0pLCA9PSwgInUiKTsKKworICAvKiBJbXBsZW1lbnRhdGlvbiBkZXRhaWw6IGFwcGVuZGluZyB0byB0aGUgbWVzc2FnZSByZXN1bHRzIGluIGl0IGJlaW5nCisgICAqIGJ5dGVzd2FwcGVkIGludG8gY29tcGlsZXIgYnl0ZSBvcmRlciwgd2hpY2ggZXhwb3NlZCBhIGJ1ZyBpbiBsaWJkYnVzLAorICAgKiBmZC5vICMzODEyMC4gKElmIHRoYXQgY2hhbmdlcywgdGhpcyB0ZXN0IG1pZ2h0IG5vdCBleGVyY2lzZSB0aGF0CisgICAqIHBhcnRpY3VsYXIgYnVnIGJ1dCB3aWxsIHN0aWxsIGJlIHZhbGlkLikgKi8KKyAgdSA9IDB4ZGVjYWZiYWR1OworICBvayA9IGRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAobSwKKyAgICAgIERCVVNfVFlQRV9VSU5UMzIsICZ1LAorICAgICAgREJVU19UWVBFX0lOVkFMSUQpOworICBnX2Fzc2VydCAob2spOworCisgIGRidXNfbWVzc2FnZV9tYXJzaGFsIChtLCAmb3V0cHV0LCAmbGVuKTsKKworICBnX2Fzc2VydCAob3V0cHV0WzBdID09ICdsJyB8fCBvdXRwdXRbMF0gPT0gJ0InKTsKKyAgLyogdGhlIHNpbmdsZS1ieXRlIGZpZWxkcyBhcmUgdW5hZmZlY3RlZCwgZXZlbiBpZiB0aGUgZW5kaWFubmVzcyB3YXMKKyAgICogc3dhcHBlZCAqLworICBnX2Fzc2VydF9jbXBpbnQgKG91dHB1dFsxXSwgPT0sIGJsb2JbMV0pOworICBnX2Fzc2VydF9jbXBpbnQgKG91dHB1dFsyXSwgPT0sIGJsb2JbMl0pOworICBnX2Fzc2VydF9jbXBpbnQgKG91dHB1dFszXSwgPT0sIGJsb2JbM10pOworICAvKiB0aGUgbGVuZ3RoIGFuZCBzZXJpYWwgYXJlIGluIHRoZSBuZXcgZW5kaWFubmVzcywgdGhlIGxlbmd0aCBoYXMgZXhwYW5kZWQKKyAgICogdG8gOCwgYW5kIHRoZSBzZXJpYWwgaXMgY29ycmVjdCAqLworICBnX2Fzc2VydF9jbXB1aW50IChnZXRfdWludDMyIChvdXRwdXQsIE9GRlNFVF9CT0RZX0xFTkdUSCwgb3V0cHV0WzBdKSwgPT0sIDgpOworICBnX2Fzc2VydF9jbXB1aW50IChnZXRfdWludDMyIChvdXRwdXQsIE9GRlNFVF9TRVJJQUwsIG91dHB1dFswXSksID09LAorICAgICAgMHgxMjM0NTY3OHUpOworICAvKiB0aGUgc2Vjb25kICJ1IiBpbiB0aGUgc2lnbmF0dXJlIHJlcGxhY2VkIGEgcGFkZGluZyBieXRlLCBzbyBvbmx5CisgICAqIHRoZSBsZW5ndGggb2YgdGhlIGJvZHkgY2hhbmdlZCAqLworICBnX2Fzc2VydF9jbXBpbnQgKGxlbiwgPT0sIEJMT0JfTEVOR1RIICsgNCk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X25lZWRlZCAoRml4dHVyZSAqZiwKKyAgICBnY29uc3Rwb2ludGVyIGFyZykKK3sKKyAgY29uc3QgZ2NoYXIgKmJsb2IgPSBhcmc7CisKKyAgLyogV2UgbmVlZCBhdCBsZWFzdCAxNiBieXRlcyB0byBrbm93IGhvdyBsb25nIHRoZSBtZXNzYWdlIGlzIC0gdGhhdCdzIGp1c3QKKyAgICogYSBmYWN0IG9mIHRoZSBELUJ1cyBwcm90b2NvbC4gKi8KKyAgZ19hc3NlcnRfY21waW50ICgKKyAgICAgIGRidXNfbWVzc2FnZV9kZW1hcnNoYWxfYnl0ZXNfbmVlZGVkIChibG9iLCAwKSwgPT0sIDApOworICBnX2Fzc2VydF9jbXBpbnQgKAorICAgICAgZGJ1c19tZXNzYWdlX2RlbWFyc2hhbF9ieXRlc19uZWVkZWQgKGJsb2IsIDE1KSwgPT0sIDApOworICAvKiBUaGlzIGlzIGVub3VnaCB0aGF0IHdlIHNob3VsZCBiZSBhYmxlIHRvIHRlbGwgaG93IG11Y2ggd2UgbmVlZC4gKi8KKyAgZ19hc3NlcnRfY21waW50ICgKKyAgICAgIGRidXNfbWVzc2FnZV9kZW1hcnNoYWxfYnl0ZXNfbmVlZGVkIChibG9iLCAxNiksID09LCBCTE9CX0xFTkdUSCk7CisgIC8qIFRoZSBoZWFkZXIgaXMgMzIgYnl0ZXMgbG9uZyAoaGVyZSksIHNvIHRoYXQncyBhbm90aGVyIGludGVyZXN0aW5nCisgICAqIGJvdW5kYXJ5LiAqLworICBnX2Fzc2VydF9jbXBpbnQgKAorICAgICAgZGJ1c19tZXNzYWdlX2RlbWFyc2hhbF9ieXRlc19uZWVkZWQgKGJsb2IsIDMxKSwgPT0sIEJMT0JfTEVOR1RIKTsKKyAgZ19hc3NlcnRfY21waW50ICgKKyAgICAgIGRidXNfbWVzc2FnZV9kZW1hcnNoYWxfYnl0ZXNfbmVlZGVkIChibG9iLCAzMiksID09LCBCTE9CX0xFTkdUSCk7CisgIGdfYXNzZXJ0X2NtcGludCAoCisgICAgICBkYnVzX21lc3NhZ2VfZGVtYXJzaGFsX2J5dGVzX25lZWRlZCAoYmxvYiwgMzMpLCA9PSwgQkxPQl9MRU5HVEgpOworICBnX2Fzc2VydF9jbXBpbnQgKAorICAgICAgZGJ1c19tZXNzYWdlX2RlbWFyc2hhbF9ieXRlc19uZWVkZWQgKGJsb2IsIEJMT0JfTEVOR1RIIC0gMSksID09LAorICAgICAgQkxPQl9MRU5HVEgpOworICBnX2Fzc2VydF9jbXBpbnQgKAorICAgICAgZGJ1c19tZXNzYWdlX2RlbWFyc2hhbF9ieXRlc19uZWVkZWQgKGJsb2IsIEJMT0JfTEVOR1RIKSwgPT0sCisgICAgICBCTE9CX0xFTkdUSCk7CisgIGdfYXNzZXJ0X2NtcGludCAoCisgICAgICBkYnVzX21lc3NhZ2VfZGVtYXJzaGFsX2J5dGVzX25lZWRlZCAoYmxvYiwgc2l6ZW9mIChiZV9ibG9iKSksID09LAorICAgICAgQkxPQl9MRU5HVEgpOworfQorCitzdGF0aWMgdm9pZAordGVhcmRvd24gKEZpeHR1cmUgKmYsCisgICAgZ2NvbnN0cG9pbnRlciBhcmcgR19HTlVDX1VOVVNFRCkKK3sKKyAgZGJ1c19lcnJvcl9mcmVlICgmZi0+ZSk7Cit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsCisgICAgY2hhciAqKmFyZ3YpCit7CisgIGludCByZXQ7CisgIGNoYXIgKmFsaWduZWRfbGVfYmxvYjsKKyAgY2hhciAqYWxpZ25lZF9iZV9ibG9iOworCisgIHRlc3RfaW5pdCAoJmFyZ2MsICZhcmd2KTsKKworICAvKiBXZSBoYXZlIHRvIHBhc3MgaW4gYSBidWZmZXIgdGhhdCdzIGF0IGxlYXN0ICJkZWZhdWx0IGFsaWduZWQiLAorICAgKiBpLmUuICBvbiBHTlUgc3lzdGVtcyB0byA4IG9yIDE2LiAgVGhlIGxpbmtlciBtYXkgaGF2ZSBvbmx5IGdpdmVuCisgICAqIHVzIGJ5dGUtYWxpZ25tZW50IGZvciB0aGUgY2hhcltdIHN0YXRpYyB2YXJpYWJsZXMuCisgICAqLworICBhbGlnbmVkX2xlX2Jsb2IgPSBnX21hbGxvYyAoc2l6ZW9mIChsZV9ibG9iKSk7CisgIG1lbWNweSAoYWxpZ25lZF9sZV9ibG9iLCBsZV9ibG9iLCBzaXplb2YgKGxlX2Jsb2IpKTsKKyAgYWxpZ25lZF9iZV9ibG9iID0gZ19tYWxsb2MgKHNpemVvZiAoYmVfYmxvYikpOworICBtZW1jcHkgKGFsaWduZWRfYmVfYmxvYiwgYmVfYmxvYiwgc2l6ZW9mIChiZV9ibG9iKSk7ICAKKworICBnX3Rlc3RfYWRkICgiL2RlbWFyc2hhbC9sZSIsIEZpeHR1cmUsIGFsaWduZWRfbGVfYmxvYiwgc2V0dXAsIHRlc3RfZW5kaWFuLCB0ZWFyZG93bik7CisgIGdfdGVzdF9hZGQgKCIvZGVtYXJzaGFsL2JlIiwgRml4dHVyZSwgYWxpZ25lZF9iZV9ibG9iLCBzZXR1cCwgdGVzdF9lbmRpYW4sIHRlYXJkb3duKTsKKyAgZ190ZXN0X2FkZCAoIi9kZW1hcnNoYWwvbmVlZGVkL2xlIiwgRml4dHVyZSwgYWxpZ25lZF9sZV9ibG9iLCBzZXR1cCwgdGVzdF9uZWVkZWQsCisgICAgICB0ZWFyZG93bik7CisgIGdfdGVzdF9hZGQgKCIvZGVtYXJzaGFsL25lZWRlZC9iZSIsIEZpeHR1cmUsIGFsaWduZWRfYmVfYmxvYiwgc2V0dXAsIHRlc3RfbmVlZGVkLAorICAgICAgdGVhcmRvd24pOworCisgIHJldCA9IGdfdGVzdF9ydW4gKCk7CisgIGdfZnJlZSAoYWxpZ25lZF9sZV9ibG9iKTsKKyAgZ19mcmVlIChhbGlnbmVkX2JlX2Jsb2IpOworICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvdGVzdC9tZXNzYWdlLmMgYi90ZXN0L21lc3NhZ2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWM0NDFlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9tZXNzYWdlLmMKQEAgLTAsMCArMSwzMTEgQEAKKy8qIFRhcmdldGVkIHVuaXQgdGVzdHMgZm9yIE9PTSBwYXRocyBpbiBEQnVzTWVzc2FnZQorICoKKyAqIENvcHlyaWdodCDCqSAyMDE3IENvbGxhYm9yYSBMdGQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzCisgKiAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLAorICogaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwKKyAqIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsCisgKiBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAorICogc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKKyAqIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxnbGliLmg+CisKKyNpbmNsdWRlIDxkYnVzL2RidXMuaD4KKyNpbmNsdWRlICJkYnVzL2RidXMtaW50ZXJuYWxzLmgiCisjaW5jbHVkZSAiZGJ1cy9kYnVzLXBpcGUuaCIKKyNpbmNsdWRlICJ0ZXN0LXV0aWxzLWdsaWIuaCIKKworLyogUmV0dXJuIFRSVUUgaWYgdGhlIHJpZ2h0IHRoaW5nIGhhcHBlbnMsIGJ1dCB0aGUgcmlnaHQgdGhpbmcgbWlnaHQgaW5jbHVkZQorICogT09NLiAqLworc3RhdGljIGRidXNfYm9vbF90Cit0ZXN0X2FycmF5ICh2b2lkICpjb250YWluZWRfc2lnbmF0dXJlKQoreworICBEQnVzTWVzc2FnZSAqbTsKKyAgREJ1c01lc3NhZ2VJdGVyIGl0ZXI7CisgIERCdXNNZXNzYWdlSXRlciBhcnJfaXRlcjsKKyAgZGJ1c19ib29sX3QgYXJyX2l0ZXJfb3BlbiA9IEZBTFNFOworICBEQnVzTWVzc2FnZUl0ZXIgaW5uZXJfaXRlcjsKKyAgZGJ1c19ib29sX3QgaW5uZXJfaXRlcl9vcGVuID0gRkFMU0U7CisKKyAgbSA9IGRidXNfbWVzc2FnZV9uZXdfc2lnbmFsICgiLyIsICJhLmIiLCAiYyIpOworCisgIGlmIChtID09IE5VTEwpCisgICAgZ290byBvdXQ7CisKKyAgZGJ1c19tZXNzYWdlX2l0ZXJfaW5pdF9hcHBlbmQgKG0sICZpdGVyKTsKKworICAvKiBvcGVuX2NvbnRhaW5lciBvbmx5IG9wZW5zIHRoZSBjb250YWluZXIgaWYgaXQgc3VjY2VlZHMgKi8KKyAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9vcGVuX2NvbnRhaW5lciAoJml0ZXIsIERCVVNfVFlQRV9BUlJBWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVkX3NpZ25hdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFycl9pdGVyKSkKKyAgICBnb3RvIG91dDsKKworICBhcnJfaXRlcl9vcGVuID0gVFJVRTsKKworICBpZiAoZ19zdHJjbXAwIChjb250YWluZWRfc2lnbmF0dXJlLCAiYWkiKSA9PSAwKQorICAgIHsKKyAgICAgIC8qIG9wZW5fY29udGFpbmVyIG9ubHkgb3BlbnMgdGhlIGNvbnRhaW5lciBpZiBpdCBzdWNjZWVkcyAqLworICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9vcGVuX2NvbnRhaW5lciAoJmFycl9pdGVyLCBEQlVTX1RZUEVfQVJSQVksICJpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbm5lcl9pdGVyKSkKKyAgICAgICAgZ290byBvdXQ7CisKKyAgICAgIC8qIFdlIGRvIG5vdCBzZXQgaW5uZXJfaXRlcl9vcGVuIHRvIFRSVUUgaGVyZSBiZWNhdXNlIHdlIHdvdWxkCisgICAgICAgKiBpbW1lZGlhdGVseSBzZXQgaXQgdG8gRkFMU0UgYWdhaW4gKi8KKworICAgICAgLyogY2xvc2VfY29udGFpbmVyIGNsb3NlcyB0aGUgY29udGFpbmVyLCBldmVuIHdoZW4gaXQgZmFpbHMgKi8KKyAgICAgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfY2xvc2VfY29udGFpbmVyICgmYXJyX2l0ZXIsICZpbm5lcl9pdGVyKSkKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorICBlbHNlIGlmIChnX3N0cmNtcDAgKGNvbnRhaW5lZF9zaWduYXR1cmUsICJ7c3N9IikgPT0gMCkKKyAgICB7CisgICAgICBjb25zdCBjaGFyICpzID0gImhlbGxvIjsKKworICAgICAgLyogb3Blbl9jb250YWluZXIgb25seSBvcGVucyB0aGUgY29udGFpbmVyIGlmIGl0IHN1Y2NlZWRzICovCisgICAgICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX29wZW5fY29udGFpbmVyICgmYXJyX2l0ZXIsIERCVVNfVFlQRV9ESUNUX0VOVFJZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgJmlubmVyX2l0ZXIpKQorICAgICAgICBnb3RvIG91dDsKKworICAgICAgaW5uZXJfaXRlcl9vcGVuID0gVFJVRTsKKworICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfYmFzaWMgKCZpbm5lcl9pdGVyLCBEQlVTX1RZUEVfU1RSSU5HLCAmcykpCisgICAgICAgIGdvdG8gb3V0OworCisgICAgICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYyAoJmlubmVyX2l0ZXIsIERCVVNfVFlQRV9TVFJJTkcsICZzKSkKKyAgICAgICAgZ290byBvdXQ7CisKKyAgICAgIC8qIGNsb3NlX2NvbnRhaW5lciBjbG9zZXMgdGhlIGNvbnRhaW5lciwgZXZlbiB3aGVuIGl0IGZhaWxzICovCisgICAgICBpbm5lcl9pdGVyX29wZW4gPSBGQUxTRTsKKworICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9jbG9zZV9jb250YWluZXIgKCZhcnJfaXRlciwgJmlubmVyX2l0ZXIpKQorICAgICAgICBnb3RvIG91dDsKKyAgICB9CisgIGVsc2UgaWYgKGdfc3RyY21wMCAoY29udGFpbmVkX3NpZ25hdHVyZSwgInYiKSA9PSAwKQorICAgIHsKKyAgICAgIGRidXNfYm9vbF90IHllcyA9IFRSVUU7CisKKyAgICAgIC8qIG9wZW5fY29udGFpbmVyIG9ubHkgb3BlbnMgdGhlIGNvbnRhaW5lciBpZiBpdCBzdWNjZWVkcyAqLworICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9vcGVuX2NvbnRhaW5lciAoJmFycl9pdGVyLCBEQlVTX1RZUEVfVkFSSUFOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiIiwgJmlubmVyX2l0ZXIpKQorICAgICAgICBnb3RvIG91dDsKKworICAgICAgaW5uZXJfaXRlcl9vcGVuID0gVFJVRTsKKworICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfYmFzaWMgKCZpbm5lcl9pdGVyLCBEQlVTX1RZUEVfQk9PTEVBTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmeWVzKSkKKyAgICAgICAgZ290byBvdXQ7CisKKyAgICAgIC8qIGNsb3NlX2NvbnRhaW5lciBjbG9zZXMgdGhlIGNvbnRhaW5lciwgZXZlbiB3aGVuIGl0IGZhaWxzICovCisgICAgICBpbm5lcl9pdGVyX29wZW4gPSBGQUxTRTsKKworICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9jbG9zZV9jb250YWluZXIgKCZhcnJfaXRlciwgJmlubmVyX2l0ZXIpKQorICAgICAgICBnb3RvIG91dDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBnX2Fzc2VydF9ub3RfcmVhY2hlZCAoKTsKKyAgICB9CisKKyAgLyogY2xvc2VfY29udGFpbmVyIGNsb3NlcyB0aGUgY29udGFpbmVyLCBldmVuIHdoZW4gaXQgZmFpbHMgKi8KKyAgYXJyX2l0ZXJfb3BlbiA9IEZBTFNFOworCisgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfY2xvc2VfY29udGFpbmVyICgmaXRlciwgJmFycl9pdGVyKSkKKyAgICBnb3RvIG91dDsKKworb3V0OgorICBpZiAoaW5uZXJfaXRlcl9vcGVuKQorICAgIGRidXNfbWVzc2FnZV9pdGVyX2FiYW5kb25fY29udGFpbmVyICgmYXJyX2l0ZXIsICZpbm5lcl9pdGVyKTsKKworICBpZiAoYXJyX2l0ZXJfb3BlbikKKyAgICBkYnVzX21lc3NhZ2VfaXRlcl9hYmFuZG9uX2NvbnRhaW5lciAoJml0ZXIsICZhcnJfaXRlcik7CisKKyAgaWYgKG0gIT0gTlVMTCkKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworCisgIGRidXNfc2h1dGRvd24gKCk7CisgIGdfYXNzZXJ0X2NtcGludCAoX2RidXNfZ2V0X21hbGxvY19ibG9ja3Nfb3V0c3RhbmRpbmcgKCksID09LCAwKTsKKworICByZXR1cm4gIWdfdGVzdF9mYWlsZWQgKCk7Cit9CisKKy8qIFJldHVybiBUUlVFIGlmIHRoZSByaWdodCB0aGluZyBoYXBwZW5zLCBidXQgdGhlIHJpZ2h0IHRoaW5nIG1pZ2h0IGluY2x1ZGUKKyAqIE9PTSBvciBpbmFiaWxpdHkgdG8gcGFzcyBmZHMuICovCitzdGF0aWMgZGJ1c19ib29sX3QKK3Rlc3RfZmQgKHZvaWQgKmlnbm9yZWQpCit7CisgIERCdXNNZXNzYWdlICptID0gTlVMTDsKKyAgREJ1c1BpcGUgcGlwZTsKKworICBfZGJ1c19waXBlX2luaXRfc3Rkb3V0ICgmcGlwZSk7CisKKyAgbSA9IGRidXNfbWVzc2FnZV9uZXdfc2lnbmFsICgiLyIsICJhLmIiLCAiYyIpOworCisgIGlmIChtID09IE5VTEwpCisgICAgZ290byBvdXQ7CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfVU5JWF9GRCwgJnBpcGUuZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgZ290byBvdXQ7CisKK291dDoKKyAgaWYgKG0gIT0gTlVMTCkKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworCisgIGRidXNfc2h1dGRvd24gKCk7CisgIGdfYXNzZXJ0X2NtcGludCAoX2RidXNfZ2V0X21hbGxvY19ibG9ja3Nfb3V0c3RhbmRpbmcgKCksID09LCAwKTsKKworICByZXR1cm4gIWdfdGVzdF9mYWlsZWQgKCk7Cit9CisKKy8qIFNpbWlsYXIgdG8gdGVzdF9hcnJheSgpLCBidXQgbWFraW5nIHVzZSBvZgorICogZGJ1c19tZXNzYWdlX2l0ZXJfYWJhbmRvbl9jb250YWluZXJfaWZfb3BlbigpLgorICoKKyAqIFJldHVybiBUUlVFIGlmIHRoZSByaWdodCB0aGluZyBoYXBwZW5zLCBidXQgdGhlIHJpZ2h0IHRoaW5nIG1pZ2h0IGluY2x1ZGUKKyAqIE9PTS4gKi8KK3N0YXRpYyBkYnVzX2Jvb2xfdAordGVzdF96ZXJvX2l0ZXIgKHZvaWQgKmlnbm9yZWQpCit7CisgIERCdXNNZXNzYWdlICptOworICBEQnVzTWVzc2FnZUl0ZXIgaXRlciA9IERCVVNfTUVTU0FHRV9JVEVSX0lOSVRfQ0xPU0VEOworICBEQnVzTWVzc2FnZUl0ZXIgYXJyX2l0ZXIgPSBEQlVTX01FU1NBR0VfSVRFUl9JTklUX0NMT1NFRDsKKyAgREJ1c01lc3NhZ2VJdGVyIGlubmVyX2l0ZXI7CisgIGRidXNfaW50MzJfdCBmb3J0eXR3byA9IDQyOworICBkYnVzX2Jvb2xfdCBtZXNzYWdlX3Nob3VsZF9iZV9jb21wbGV0ZSA9IEZBTFNFOworCisgIC8qIFRoaXMgb25lIHdhcyBsZWZ0IHVuaW5pdGlhbGl6ZWQsIGp1c3Qgc28gd2UgY291bGQgZXhlcmNpc2UgdGhpcworICAgKiBmdW5jdGlvbiAqLworICBkYnVzX21lc3NhZ2VfaXRlcl9pbml0X2Nsb3NlZCAoJmlubmVyX2l0ZXIpOworCisgIG0gPSBkYnVzX21lc3NhZ2VfbmV3X3NpZ25hbCAoIi8iLCAiYS5iIiwgImMiKTsKKworICBpZiAobSA9PSBOVUxMKQorICAgIGdvdG8gb3V0OworCisgIGRidXNfbWVzc2FnZV9pdGVyX2luaXRfYXBwZW5kIChtLCAmaXRlcik7CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9vcGVuX2NvbnRhaW5lciAoJml0ZXIsIERCVVNfVFlQRV9BUlJBWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFpIiwgJmFycl9pdGVyKSkKKyAgICBnb3RvIG91dDsKKworICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX29wZW5fY29udGFpbmVyICgmYXJyX2l0ZXIsIERCVVNfVFlQRV9BUlJBWSwgImkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5uZXJfaXRlcikpCisgICAgZ290byBvdXQ7CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfYmFzaWMgKCZpbm5lcl9pdGVyLCBEQlVTX1RZUEVfSU5UMzIsICZmb3J0eXR3bykpCisgICAgZ290byBvdXQ7CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9jbG9zZV9jb250YWluZXIgKCZhcnJfaXRlciwgJmlubmVyX2l0ZXIpKQorICAgIGdvdG8gb3V0OworCisgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfY2xvc2VfY29udGFpbmVyICgmaXRlciwgJmFycl9pdGVyKSkKKyAgICBnb3RvIG91dDsKKworICBtZXNzYWdlX3Nob3VsZF9iZV9jb21wbGV0ZSA9IFRSVUU7CisKK291dDoKKyAgZGJ1c19tZXNzYWdlX2l0ZXJfYWJhbmRvbl9jb250YWluZXJfaWZfb3BlbiAoJmFycl9pdGVyLCAmaW5uZXJfaXRlcik7CisgIGRidXNfbWVzc2FnZV9pdGVyX2FiYW5kb25fY29udGFpbmVyX2lmX29wZW4gKCZpdGVyLCAmYXJyX2l0ZXIpOworICAvKiBSZWR1bmRhbnQgY2FsbHMgYXJlIE9LICovCisgIGRidXNfbWVzc2FnZV9pdGVyX2FiYW5kb25fY29udGFpbmVyX2lmX29wZW4gKCZpdGVyLCAmYXJyX2l0ZXIpOworCisgIC8qIGRidXNfbWVzc2FnZV9pdGVyX2FiYW5kb25fY29udGFpbmVyX2lmX29wZW4gZG9lcyBub3QgbGVhdmUgdGhlIG1lc3NhZ2UKKyAgICogaW4gd2hhdCBzZWVtcyB0byBiZSBjb25zaXN0ZW50bHkgZG9jdW1lbnRlZCBhcyBhICJob3NlZCIgc3RhdGUgKi8KKyAgaWYgKG1lc3NhZ2Vfc2hvdWxkX2JlX2NvbXBsZXRlKQorICAgIHsKKyAgICAgIERCdXNCYXNpY1ZhbHVlIHJlYWRfYmFjazsKKworICAgICAgX0RCVVNfWkVSTyAocmVhZF9iYWNrKTsKKyAgICAgIGRidXNfbWVzc2FnZV9pdGVyX2luaXQgKG0sICZpdGVyKTsKKyAgICAgIGRidXNfbWVzc2FnZV9pdGVyX3JlY3Vyc2UgKCZpdGVyLCAmYXJyX2l0ZXIpOworICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfcmVjdXJzZSAoJmFycl9pdGVyLCAmaW5uZXJfaXRlcik7CisgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYmFzaWMgKCZpbm5lcl9pdGVyLCAmcmVhZF9iYWNrKTsKKyAgICAgIGdfYXNzZXJ0X2NtcGludCAocmVhZF9iYWNrLmkzMiwgPT0sIDQyKTsKKyAgICB9CisKKyAgaWYgKG0gIT0gTlVMTCkKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworCisgIGRidXNfc2h1dGRvd24gKCk7CisgIGdfYXNzZXJ0X2NtcGludCAoX2RidXNfZ2V0X21hbGxvY19ibG9ja3Nfb3V0c3RhbmRpbmcgKCksID09LCAwKTsKKworICByZXR1cm4gIWdfdGVzdF9mYWlsZWQgKCk7Cit9CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGNvbnN0IGdjaGFyICpuYW1lOworICBEQnVzVGVzdE1lbW9yeUZ1bmN0aW9uIGZ1bmN0aW9uOworICBjb25zdCB2b2lkICpkYXRhOworfSBPT01UZXN0Q2FzZTsKKworc3RhdGljIHZvaWQKK3Rlc3Rfb29tX3dyYXBwZXIgKGdjb25zdHBvaW50ZXIgZGF0YSkKK3sKKyAgY29uc3QgT09NVGVzdENhc2UgKnRlc3QgPSBkYXRhOworCisgIGlmICghX2RidXNfdGVzdF9vb21faGFuZGxpbmcgKHRlc3QtPm5hbWUsIHRlc3QtPmZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSB0ZXN0LT5kYXRhKSkKKyAgICB7CisgICAgICBnX3Rlc3RfbWVzc2FnZSAoIk9PTSB0ZXN0IGZhaWxlZCIpOworICAgICAgZ190ZXN0X2ZhaWwgKCk7CisgICAgfQorfQorCitzdGF0aWMgR1F1ZXVlICp0ZXN0X2Nhc2VzX3RvX2ZyZWUgPSBOVUxMOworCitzdGF0aWMgdm9pZAorYWRkX29vbV90ZXN0IChjb25zdCBnY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgREJ1c1Rlc3RNZW1vcnlGdW5jdGlvbiBmdW5jdGlvbiwKKyAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqZGF0YSkKK3sKKyAgLyogQnkgdXNpbmcgR0xpYiBtZW1vcnkgYWxsb2NhdGlvbiBoZXJlLCB3ZSBhdm9pZCBiZWluZyBhZmZlY3RlZCBieQorICAgKiBkYnVzX3NodXRkb3duKCkgb3IgY29udHJpYnV0aW5nIHRvCisgICAqIF9kYnVzX2dldF9tYWxsb2NfYmxvY2tzX291dHN0YW5kaW5nKCkgKi8KKyAgT09NVGVzdENhc2UgKnRlc3RfY2FzZSA9IGdfbmV3MCAoT09NVGVzdENhc2UsIDEpOworCisgIHRlc3RfY2FzZS0+bmFtZSA9IG5hbWU7CisgIHRlc3RfY2FzZS0+ZnVuY3Rpb24gPSBmdW5jdGlvbjsKKyAgdGVzdF9jYXNlLT5kYXRhID0gZGF0YTsKKyAgZ190ZXN0X2FkZF9kYXRhX2Z1bmMgKG5hbWUsIHRlc3RfY2FzZSwgdGVzdF9vb21fd3JhcHBlcik7CisgIGdfcXVldWVfcHVzaF90YWlsICh0ZXN0X2Nhc2VzX3RvX2ZyZWUsIHRlc3RfY2FzZSk7Cit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsCisgICAgICBjaGFyICoqYXJndikKK3sKKyAgaW50IHJldDsKKworICB0ZXN0X2luaXQgKCZhcmdjLCAmYXJndik7CisKKyAgdGVzdF9jYXNlc190b19mcmVlID0gZ19xdWV1ZV9uZXcgKCk7CisgIGFkZF9vb21fdGVzdCAoIi9tZXNzYWdlL2FycmF5L2FycmF5IiwgdGVzdF9hcnJheSwgImFpIik7CisgIGFkZF9vb21fdGVzdCAoIi9tZXNzYWdlL2FycmF5L2RpY3QiLCB0ZXN0X2FycmF5LCAie3NzfSIpOworICBhZGRfb29tX3Rlc3QgKCIvbWVzc2FnZS9hcnJheS92YXJpYW50IiwgdGVzdF9hcnJheSwgInYiKTsKKyAgYWRkX29vbV90ZXN0ICgiL21lc3NhZ2UvZmQiLCB0ZXN0X2ZkLCBOVUxMKTsKKyAgYWRkX29vbV90ZXN0ICgiL21lc3NhZ2UvemVyby1pdGVyIiwgdGVzdF96ZXJvX2l0ZXIsIE5VTEwpOworCisgIHJldCA9IGdfdGVzdF9ydW4gKCk7CisKKyAgZ19xdWV1ZV9mcmVlX2Z1bGwgKHRlc3RfY2FzZXNfdG9fZnJlZSwgZ19mcmVlKTsKKyAgcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvbW9uaXRvci5jIGIvdGVzdC9tb25pdG9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY1YTcxOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbW9uaXRvci5jCkBAIC0wLDAgKzEsMjA2NiBAQAorLyogSW50ZWdyYXRpb24gdGVzdHMgZm9yIG1vbml0b3ItbW9kZSBELUJ1cyBjb25uZWN0aW9ucworICoKKyAqIENvcHlyaWdodCDCqSAyMDEwLTIwMTEgTm9raWEgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCDCqSAyMDE1IENvbGxhYm9yYSBMdGQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzCisgKiAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLAorICogaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwKKyAqIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsCisgKiBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAorICogc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKKyAqIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJ0ZXN0LXV0aWxzLWdsaWIuaCIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNvbnN0IGNoYXIgKmNvbmZpZ19maWxlOworICAgIGNvbnN0IGNoYXIgKiBjb25zdCAqbWF0Y2hfcnVsZXM7CisgICAgZ2Jvb2xlYW4gY2FyZV9hYm91dF9vdXJfbmFtZXM7Cit9IENvbmZpZzsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNvbnN0IENvbmZpZyAqY29uZmlnOworICAgIFRlc3RNYWluQ29udGV4dCAqY3R4OworICAgIERCdXNFcnJvciBlOworICAgIEdFcnJvciAqZ2U7CisKKyAgICBnY2hhciAqYWRkcmVzczsKKyAgICBHUGlkIGRhZW1vbl9waWQ7CisKKyAgICBEQnVzQ29ubmVjdGlvbiAqbW9uaXRvcjsKKyAgICBEQnVzQ29ubmVjdGlvbiAqc2VuZGVyOworICAgIERCdXNDb25uZWN0aW9uICpyZWNpcGllbnQ7CisgICAgZ2Jvb2xlYW4gcmVjaXBpZW50X2VucXVldWVfZmlsdGVyX2FkZGVkOworCisgICAgR1F1ZXVlIG1vbml0b3JlZDsKKyAgICBHUXVldWUgcmVjZWl2ZWQ7CisKKyAgICBjb25zdCBjaGFyICptb25pdG9yX25hbWU7CisgICAgY29uc3QgY2hhciAqc2VuZGVyX25hbWU7CisgICAgY29uc3QgY2hhciAqcmVjaXBpZW50X25hbWU7CisKKyAgICBEQnVzQ29ubmVjdGlvbiAqc3lzdGVtZDsKKyAgICBjb25zdCBjaGFyICpzeXN0ZW1kX25hbWU7CisgICAgREJ1c01lc3NhZ2UgKnN5c3RlbWRfbWVzc2FnZTsKKyAgICBEQnVzQ29ubmVjdGlvbiAqYWN0aXZhdGVkOworICAgIGNvbnN0IGNoYXIgKmFjdGl2YXRlZF9uYW1lOworICAgIERCdXNNZXNzYWdlICphY3RpdmF0ZWRfbWVzc2FnZTsKK30gRml4dHVyZTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBub19tYXRjaF9ydWxlc1tdID0geworICAgIE5VTEwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgd2lsZGNhcmRfbWF0Y2hfcnVsZXNbXSA9IHsKKyAgICAiIiwKKyAgICBOVUxMLAorICAgIEZBTFNFCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGVhdmVzZHJvcF9tYXRjaF9ydWxlc1tdID0geworICAgICJlYXZlc2Ryb3A9dHJ1ZSIsCisgICAgTlVMTCwKKyAgICBGQUxTRQorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBub19lYXZlc2Ryb3BfbWF0Y2hfcnVsZXNbXSA9IHsKKyAgICAiZWF2ZXNkcm9wPWZhbHNlIiwKKyAgICBOVUxMLAorICAgIEZBTFNFCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNlbGVjdGl2ZV9tYXRjaF9ydWxlc1tdID0geworICAgICJpbnRlcmZhY2U9J2NvbS5leGFtcGxlLkludGVyZXN0aW5nJyIsCisgICAgImludGVyZmFjZT0nY29tLmV4YW1wbGUuRnVuJyIsCisgICAgTlVMTCwKKyAgICBGQUxTRQorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB3ZWxsX2tub3duX2Rlc3RpbmF0aW9uX21hdGNoX3J1bGVzW10gPSB7CisgICAgImRlc3RpbmF0aW9uPSdjb20uZXhhbXBsZS5SZWNpcGllbnQnIiwKKyAgICBOVUxMCit9OworCitzdGF0aWMgQ29uZmlnIGZvcmJpZGRpbmdfY29uZmlnID0geworICAgICJ2YWxpZC1jb25maWctZmlsZXMvZm9yYmlkZGluZy5jb25mIiwKKyAgICBOVUxMLAorICAgIEZBTFNFCit9OworCitzdGF0aWMgQ29uZmlnIHdpbGRjYXJkX2NvbmZpZyA9IHsKKyAgICBOVUxMLAorICAgIHdpbGRjYXJkX21hdGNoX3J1bGVzLAorICAgIEZBTFNFCit9OworCitzdGF0aWMgQ29uZmlnIHNlbGVjdGl2ZV9jb25maWcgPSB7CisgICAgTlVMTCwKKyAgICBzZWxlY3RpdmVfbWF0Y2hfcnVsZXMsCisgICAgRkFMU0UKK307CisKK3N0YXRpYyBDb25maWcgd2VsbF9rbm93bl9kZXN0aW5hdGlvbl9jb25maWcgPSB7CisgICAgTlVMTCwKKyAgICB3ZWxsX2tub3duX2Rlc3RpbmF0aW9uX21hdGNoX3J1bGVzLAorICAgIEZBTFNFCit9OworCitzdGF0aWMgQ29uZmlnIG5vX3J1bGVzX2NvbmZpZyA9IHsKKyAgICBOVUxMLAorICAgIG5vX21hdGNoX3J1bGVzLAorICAgIEZBTFNFCit9OworCitzdGF0aWMgQ29uZmlnIGVhdmVzZHJvcF9jb25maWcgPSB7CisgICAgTlVMTCwKKyAgICBlYXZlc2Ryb3BfbWF0Y2hfcnVsZXMsCisgICAgRkFMU0UKK307CisKK3N0YXRpYyBDb25maWcgbm9fZWF2ZXNkcm9wX2NvbmZpZyA9IHsKKyAgICBOVUxMLAorICAgIG5vX2VhdmVzZHJvcF9tYXRjaF9ydWxlcywKKyAgICBGQUxTRQorfTsKKworI2lmZGVmIERCVVNfVU5JWAorc3RhdGljIENvbmZpZyBmYWtlX3N5c3RlbWRfY29uZmlnID0geworICAgICJ2YWxpZC1jb25maWctZmlsZXMvc3lzdGVtZC1hY3RpdmF0aW9uLmNvbmYiLAorICAgIE5VTEwsCisgICAgRkFMU0UKK307CisjZW5kaWYKKworc3RhdGljIENvbmZpZyBzaWRlX2VmZmVjdHNfY29uZmlnID0geworICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBUUlVFCit9OworCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKgorbm90X251bGwyIChjb25zdCBjaGFyICp4LAorICAgIGNvbnN0IGNoYXIgKmZhbGxiYWNrKQoreworICBpZiAoeCA9PSBOVUxMKQorICAgIHJldHVybiBmYWxsYmFjazsKKworICByZXR1cm4geDsKK30KKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyICoKK25vdF9udWxsIChjb25zdCBjaGFyICp4KQoreworICByZXR1cm4gbm90X251bGwyICh4LCAiKG51bGwpIik7Cit9CisKKyNkZWZpbmUgbG9nX21lc3NhZ2UobSkgX2xvZ19tZXNzYWdlIChtLCBfX0ZJTEVfXywgX19MSU5FX18pCisKK0dfR05VQ19VTlVTRUQKK3N0YXRpYyB2b2lkCitfbG9nX21lc3NhZ2UgKERCdXNNZXNzYWdlICptLAorICAgIGNvbnN0IGNoYXIgKmZpbGUsCisgICAgaW50IGxpbmUpCit7CisgIGdfdGVzdF9tZXNzYWdlICgiJXM6JWQ6IG1lc3NhZ2UgdHlwZSAlZCAoJXMpIiwgZmlsZSwgbGluZSwKKyAgICAgIGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobSksCisgICAgICBkYnVzX21lc3NhZ2VfdHlwZV90b19zdHJpbmcgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobSkpKTsKKyAgZ190ZXN0X21lc3NhZ2UgKCJcdGZyb206ICVzIiwKKyAgICAgIG5vdF9udWxsMiAoZGJ1c19tZXNzYWdlX2dldF9zZW5kZXIgKG0pLCAiKGRidXMtZGFlbW9uKSIpKTsKKyAgZ190ZXN0X21lc3NhZ2UgKCJcdHRvOiAlcyIsCisgICAgICBub3RfbnVsbDIgKGRidXNfbWVzc2FnZV9nZXRfZGVzdGluYXRpb24gKG0pLCAiKGJyb2FkY2FzdCkiKSk7CisgIGdfdGVzdF9tZXNzYWdlICgiXHRwYXRoOiAlcyIsCisgICAgICBub3RfbnVsbCAoZGJ1c19tZXNzYWdlX2dldF9wYXRoIChtKSkpOworICBnX3Rlc3RfbWVzc2FnZSAoIlx0aW50ZXJmYWNlOiAlcyIsCisgICAgICBub3RfbnVsbCAoZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG0pKSk7CisgIGdfdGVzdF9tZXNzYWdlICgiXHRtZW1iZXI6ICVzIiwKKyAgICAgIG5vdF9udWxsIChkYnVzX21lc3NhZ2VfZ2V0X21lbWJlciAobSkpKTsKKyAgZ190ZXN0X21lc3NhZ2UgKCJcdHNpZ25hdHVyZTogJXMiLAorICAgICAgbm90X251bGwgKGRidXNfbWVzc2FnZV9nZXRfc2lnbmF0dXJlIChtKSkpOworICBnX3Rlc3RfbWVzc2FnZSAoIlx0ZXJyb3IgbmFtZTogJXMiLAorICAgICAgbm90X251bGwgKGRidXNfbWVzc2FnZV9nZXRfZXJyb3JfbmFtZSAobSkpKTsKKworICBpZiAoc3RyY21wICgicyIsIGRidXNfbWVzc2FnZV9nZXRfc2lnbmF0dXJlIChtKSkgPT0gMCkKKyAgICB7CisgICAgICBEQnVzRXJyb3IgZSA9IERCVVNfRVJST1JfSU5JVDsKKyAgICAgIGNvbnN0IGNoYXIgKnM7CisKKyAgICAgIGRidXNfbWVzc2FnZV9nZXRfYXJncyAobSwgJmUsCisgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmcywKKyAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKTsKKyAgICAgIHRlc3RfYXNzZXJ0X25vX2Vycm9yICgmZSk7CisgICAgICBnX3Rlc3RfbWVzc2FnZSAoIlx0c3RyaW5nIHBheWxvYWQ6ICVzIiwgcyk7CisgICAgfQorfQorCisvKiB0aGVzZSBhcmUgbWFjcm9zIHNvIHRoZXkgZ2V0IHRoZSByaWdodCBsaW5lIG51bWJlciAqLworCisjZGVmaW5lIGFzc2VydF9oZWxsbyhtKSBcCitkbyB7IFwKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfdHlwZV90b19zdHJpbmcgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobSkpLCBcCisgICAgICA9PSwgZGJ1c19tZXNzYWdlX3R5cGVfdG9fc3RyaW5nIChEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfQ0FMTCkpOyBcCisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9kZXN0aW5hdGlvbiAobSksID09LCBEQlVTX1NFUlZJQ0VfREJVUyk7IFwKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X3BhdGggKG0pLCA9PSwgREJVU19QQVRIX0RCVVMpOyBcCisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG0pLCA9PSwgREJVU19JTlRFUkZBQ0VfREJVUyk7IFwKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X21lbWJlciAobSksID09LCAiSGVsbG8iKTsgXAorICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfc2lnbmF0dXJlIChtKSwgPT0sICIiKTsgXAorICBnX2Fzc2VydF9jbXBpbnQgKGRidXNfbWVzc2FnZV9nZXRfc2VyaWFsIChtKSwgIT0sIDApOyBcCisgIGdfYXNzZXJ0X2NtcGludCAoZGJ1c19tZXNzYWdlX2dldF9yZXBseV9zZXJpYWwgKG0pLCA9PSwgMCk7IFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgYXNzZXJ0X2hlbGxvX3JlcGx5KG0pIFwKK2RvIHsgXAorICBEQnVzRXJyb3IgX2UgPSBEQlVTX0VSUk9SX0lOSVQ7IFwKKyAgY29uc3QgY2hhciAqX3M7IFwKKyAgICBcCisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX3R5cGVfdG9fc3RyaW5nIChkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKG0pKSwgXAorICAgICAgPT0sIGRidXNfbWVzc2FnZV90eXBlX3RvX3N0cmluZyAoREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX1JFVFVSTikpOyBcCisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9zZW5kZXIgKG0pLCA9PSwgREJVU19TRVJWSUNFX0RCVVMpOyBcCisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9wYXRoIChtKSwgPT0sIE5VTEwpOyBcCisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG0pLCA9PSwgTlVMTCk7IFwKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X21lbWJlciAobSksID09LCBOVUxMKTsgXAorICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfc2lnbmF0dXJlIChtKSwgPT0sICJzIik7IFwKKyAgZ19hc3NlcnRfY21waW50IChkYnVzX21lc3NhZ2VfZ2V0X3NlcmlhbCAobSksICE9LCAwKTsgXAorICBnX2Fzc2VydF9jbXBpbnQgKGRidXNfbWVzc2FnZV9nZXRfcmVwbHlfc2VyaWFsIChtKSwgIT0sIDApOyBcCisgICAgXAorICBkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MgKG0sICZfZSwgXAorICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmX3MsIFwKKyAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpOyBcCisgIHRlc3RfYXNzZXJ0X25vX2Vycm9yICgmX2UpOyBcCisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9kZXN0aW5hdGlvbiAobSksID09LCBfcyk7IFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgYXNzZXJ0X25hbWVfYWNxdWlyZWQobSkgXAorZG8geyBcCisgIERCdXNFcnJvciBfZSA9IERCVVNfRVJST1JfSU5JVDsgXAorICBjb25zdCBjaGFyICpfczsgXAorICAgIFwKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfdHlwZV90b19zdHJpbmcgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobSkpLCBcCisgICAgICA9PSwgZGJ1c19tZXNzYWdlX3R5cGVfdG9fc3RyaW5nIChEQlVTX01FU1NBR0VfVFlQRV9TSUdOQUwpKTsgXAorICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfc2VuZGVyIChtKSwgPT0sIERCVVNfU0VSVklDRV9EQlVTKTsgXAorICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfcGF0aCAobSksID09LCBEQlVTX1BBVEhfREJVUyk7IFwKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAobSksID09LCBEQlVTX0lOVEVSRkFDRV9EQlVTKTsgXAorICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtKSwgPT0sICJOYW1lQWNxdWlyZWQiKTsgXAorICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfc2lnbmF0dXJlIChtKSwgPT0sICJzIik7IFwKKyAgZ19hc3NlcnRfY21waW50IChkYnVzX21lc3NhZ2VfZ2V0X3NlcmlhbCAobSksICE9LCAwKTsgXAorICBnX2Fzc2VydF9jbXBpbnQgKGRidXNfbWVzc2FnZV9nZXRfcmVwbHlfc2VyaWFsIChtKSwgPT0sIDApOyBcCisgICAgXAorICBkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MgKG0sICZfZSwgXAorICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmX3MsIFwKKyAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpOyBcCisgIHRlc3RfYXNzZXJ0X25vX2Vycm9yICgmX2UpOyBcCisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9kZXN0aW5hdGlvbiAobSksID09LCBfcyk7IFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgYXNzZXJ0X21ldGhvZF9jYWxsKG0sIHNlbmRlciwgXAorICAgIGRlc3RpbmF0aW9uLCBwYXRoLCBpZmFjZSwgbWV0aG9kLCBzaWduYXR1cmUpIFwKK2RvIHsgXAorICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV90eXBlX3RvX3N0cmluZyAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtKSksIFwKKyAgICAgID09LCBkYnVzX21lc3NhZ2VfdHlwZV90b19zdHJpbmcgKERCVVNfTUVTU0FHRV9UWVBFX01FVEhPRF9DQUxMKSk7IFwKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X3NlbmRlciAobSksID09LCBzZW5kZXIpOyBcCisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9kZXN0aW5hdGlvbiAobSksID09LCBkZXN0aW5hdGlvbik7IFwKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X3BhdGggKG0pLCA9PSwgcGF0aCk7IFwKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAobSksID09LCBpZmFjZSk7IFwKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X21lbWJlciAobSksID09LCBtZXRob2QpOyBcCisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9zaWduYXR1cmUgKG0pLCA9PSwgc2lnbmF0dXJlKTsgXAorICBnX2Fzc2VydF9jbXBpbnQgKGRidXNfbWVzc2FnZV9nZXRfc2VyaWFsIChtKSwgIT0sIDApOyBcCisgIGdfYXNzZXJ0X2NtcGludCAoZGJ1c19tZXNzYWdlX2dldF9yZXBseV9zZXJpYWwgKG0pLCA9PSwgMCk7IFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgYXNzZXJ0X3NpZ25hbChtLCBcCisgICAgc2VuZGVyLCBwYXRoLCBpZmFjZSwgbWVtYmVyLCBzaWduYXR1cmUsIFwKKyAgICBkZXN0aW5hdGlvbikgXAorZG8geyBcCisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX3R5cGVfdG9fc3RyaW5nIChkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKG0pKSwgXAorICAgICAgPT0sIGRidXNfbWVzc2FnZV90eXBlX3RvX3N0cmluZyAoREJVU19NRVNTQUdFX1RZUEVfU0lHTkFMKSk7IFwKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X3NlbmRlciAobSksID09LCBzZW5kZXIpOyBcCisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9kZXN0aW5hdGlvbiAobSksID09LCBkZXN0aW5hdGlvbik7IFwKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X3BhdGggKG0pLCA9PSwgcGF0aCk7IFwKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAobSksID09LCBpZmFjZSk7IFwKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X21lbWJlciAobSksID09LCBtZW1iZXIpOyBcCisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9zaWduYXR1cmUgKG0pLCA9PSwgc2lnbmF0dXJlKTsgXAorICBnX2Fzc2VydF9jbXBpbnQgKGRidXNfbWVzc2FnZV9nZXRfc2VyaWFsIChtKSwgIT0sIDApOyBcCisgIGdfYXNzZXJ0X2NtcGludCAoZGJ1c19tZXNzYWdlX2dldF9yZXBseV9zZXJpYWwgKG0pLCA9PSwgMCk7IFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgYXNzZXJ0X21ldGhvZF9yZXBseShtLCBzZW5kZXIsIGRlc3RpbmF0aW9uLCBzaWduYXR1cmUpIFwKK2RvIHsgXAorICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV90eXBlX3RvX3N0cmluZyAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtKSksIFwKKyAgICAgID09LCBkYnVzX21lc3NhZ2VfdHlwZV90b19zdHJpbmcgKERCVVNfTUVTU0FHRV9UWVBFX01FVEhPRF9SRVRVUk4pKTsgXAorICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfc2VuZGVyIChtKSwgPT0sIHNlbmRlcik7IFwKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X2Rlc3RpbmF0aW9uIChtKSwgPT0sIGRlc3RpbmF0aW9uKTsgXAorICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfcGF0aCAobSksID09LCBOVUxMKTsgXAorICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfaW50ZXJmYWNlIChtKSwgPT0sIE5VTEwpOyBcCisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKG0pLCA9PSwgTlVMTCk7IFwKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X3NpZ25hdHVyZSAobSksID09LCBzaWduYXR1cmUpOyBcCisgIGdfYXNzZXJ0X2NtcGludCAoZGJ1c19tZXNzYWdlX2dldF9zZXJpYWwgKG0pLCAhPSwgMCk7IFwKKyAgZ19hc3NlcnRfY21waW50IChkYnVzX21lc3NhZ2VfZ2V0X3JlcGx5X3NlcmlhbCAobSksICE9LCAwKTsgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBhc3NlcnRfZXJyb3JfcmVwbHkobSwgc2VuZGVyLCBkZXN0aW5hdGlvbiwgZXJyb3JfbmFtZSkgXAorZG8geyBcCisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX3R5cGVfdG9fc3RyaW5nIChkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKG0pKSwgXAorICAgICAgPT0sIGRidXNfbWVzc2FnZV90eXBlX3RvX3N0cmluZyAoREJVU19NRVNTQUdFX1RZUEVfRVJST1IpKTsgXAorICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfc2VuZGVyIChtKSwgPT0sIHNlbmRlcik7IFwKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X2Rlc3RpbmF0aW9uIChtKSwgPT0sIGRlc3RpbmF0aW9uKTsgXAorICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfZXJyb3JfbmFtZSAobSksID09LCBlcnJvcl9uYW1lKTsgXAorICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfcGF0aCAobSksID09LCBOVUxMKTsgXAorICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfaW50ZXJmYWNlIChtKSwgPT0sIE5VTEwpOyBcCisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKG0pLCA9PSwgTlVMTCk7IFwKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X3NpZ25hdHVyZSAobSksID09LCAicyIpOyBcCisgIGdfYXNzZXJ0X2NtcGludCAoZGJ1c19tZXNzYWdlX2dldF9zZXJpYWwgKG0pLCAhPSwgMCk7IFwKKyAgZ19hc3NlcnRfY21waW50IChkYnVzX21lc3NhZ2VfZ2V0X3JlcGx5X3NlcmlhbCAobSksICE9LCAwKTsgXAorfSB3aGlsZSAoMCkKKworLyogVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgcHJvY2Vzc2luZyBwZW5kaW5nIHJlcGxpZXMgdG8gb3VyIG93biBtZXRob2QKKyAqIGNhbGxzLCBidXQgYmVmb3JlIGFueXRoaW5nIGVsc2UuCisgKi8KK3N0YXRpYyBEQnVzSGFuZGxlclJlc3VsdAorbW9uaXRvcl9maWx0ZXIgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgIERCdXNNZXNzYWdlICptZXNzYWdlLAorICAgIHZvaWQgKnVzZXJfZGF0YSkKK3sKKyAgRml4dHVyZSAqZiA9IHVzZXJfZGF0YTsKKworICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfaW50ZXJmYWNlIChtZXNzYWdlKSwgIT0sCisgICAgICAiY29tLmV4YW1wbGUuVGVkaW91cyIpOworCisgIC8qIHdlIGFyZSBub3QgaW50ZXJlc3RlZCBpbiB0aGUgbW9uaXRvciBnZXR0aW5nIE5hbWVBY3F1aXJlZCBvciBOYW1lTG9zdAorICAgKiBmb3IgbW9zdCB0ZXN0cyAqLworICBpZiAoZi0+Y29uZmlnID09IE5VTEwgfHwgIWYtPmNvbmZpZy0+Y2FyZV9hYm91dF9vdXJfbmFtZXMpCisgICAgeworICAgICAgaWYgKGRidXNfbWVzc2FnZV9pc19zaWduYWwgKG1lc3NhZ2UsIERCVVNfSU5URVJGQUNFX0RCVVMsCisgICAgICAgICAgICAiTmFtZUFjcXVpcmVkIikgfHwKKyAgICAgICAgICBkYnVzX21lc3NhZ2VfaXNfc2lnbmFsIChtZXNzYWdlLCBEQlVTX0lOVEVSRkFDRV9EQlVTLAorICAgICAgICAgICAgIk5hbWVMb3N0IikpCisgICAgICAgIHsKKyAgICAgICAgICBEQnVzRXJyb3IgZSA9IERCVVNfRVJST1JfSU5JVDsKKyAgICAgICAgICBjb25zdCBjaGFyICpzOworCisgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9hcmdzIChtZXNzYWdlLCAmZSwKKyAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmcywKKyAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCk7CisgICAgICAgICAgdGVzdF9hc3NlcnRfbm9fZXJyb3IgKCZlKTsKKworICAgICAgICAgIGlmIChzdHJjbXAgKHMsIGYtPm1vbml0b3JfbmFtZSkgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogaWdub3JlICovCisgICAgICAgICAgICAgIHJldHVybiBEQlVTX0hBTkRMRVJfUkVTVUxUX0hBTkRMRUQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgZ19xdWV1ZV9wdXNoX3RhaWwgKCZmLT5tb25pdG9yZWQsIGRidXNfbWVzc2FnZV9yZWYgKG1lc3NhZ2UpKTsKKworICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9IQU5ETEVEOworfQorCitzdGF0aWMgREJ1c0hhbmRsZXJSZXN1bHQKK3JlY2lwaWVudF9jaGVja19maWx0ZXIgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgIERCdXNNZXNzYWdlICptZXNzYWdlLAorICAgIHZvaWQgKnVzZXJfZGF0YSkKK3sKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAobWVzc2FnZSksICE9LAorICAgICAgImNvbS5leGFtcGxlLkNhbm5vdFNlbmQiKTsKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAobWVzc2FnZSksICE9LAorICAgICAgImNvbS5leGFtcGxlLkNhbm5vdFJlY2VpdmUiKTsKKworICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9OT1RfWUVUX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBEQnVzSGFuZGxlclJlc3VsdAorcmVjaXBpZW50X2VucXVldWVfZmlsdGVyIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICBEQnVzTWVzc2FnZSAqbWVzc2FnZSwKKyAgICB2b2lkICp1c2VyX2RhdGEpCit7CisgIEZpeHR1cmUgKmYgPSB1c2VyX2RhdGE7CisKKyAgaWYgKGRidXNfbWVzc2FnZV9pc19zaWduYWwgKG1lc3NhZ2UsIERCVVNfSU5URVJGQUNFX0RCVVMsCisgICAgICAgICJOYW1lQWNxdWlyZWQiKSB8fAorICAgICAgZGJ1c19tZXNzYWdlX2lzX3NpZ25hbCAobWVzc2FnZSwgREJVU19JTlRFUkZBQ0VfREJVUywKKyAgICAgICAgIk5hbWVMb3N0IikgfHwKKyAgICAgIGRidXNfbWVzc2FnZV9pc19zaWduYWwgKG1lc3NhZ2UsIERCVVNfSU5URVJGQUNFX0RCVVMsCisgICAgICAgICJOYW1lT3duZXJDaGFuZ2VkIikpCisgICAgeworICAgICAgcmV0dXJuIERCVVNfSEFORExFUl9SRVNVTFRfTk9UX1lFVF9IQU5ETEVEOworICAgIH0KKworICBnX3F1ZXVlX3B1c2hfdGFpbCAoJmYtPnJlY2VpdmVkLCBkYnVzX21lc3NhZ2VfcmVmIChtZXNzYWdlKSk7CisgIHJldHVybiBEQlVTX0hBTkRMRVJfUkVTVUxUX05PVF9ZRVRfSEFORExFRDsKK30KKworc3RhdGljIERCdXNIYW5kbGVyUmVzdWx0CitzeXN0ZW1kX2ZpbHRlciAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgREJ1c01lc3NhZ2UgKm1lc3NhZ2UsCisgICAgdm9pZCAqdXNlcl9kYXRhKQoreworICBGaXh0dXJlICpmID0gdXNlcl9kYXRhOworCisgIGlmIChkYnVzX21lc3NhZ2VfaXNfc2lnbmFsIChtZXNzYWdlLCBEQlVTX0lOVEVSRkFDRV9EQlVTLAorICAgICAgICAiTmFtZUFjcXVpcmVkIikgfHwKKyAgICAgIGRidXNfbWVzc2FnZV9pc19zaWduYWwgKG1lc3NhZ2UsIERCVVNfSU5URVJGQUNFX0RCVVMsCisgICAgICAgICJOYW1lTG9zdCIpKQorICAgIHsKKyAgICAgIHJldHVybiBEQlVTX0hBTkRMRVJfUkVTVUxUX05PVF9ZRVRfSEFORExFRDsKKyAgICB9CisKKyAgZ19hc3NlcnQgKGYtPnN5c3RlbWRfbWVzc2FnZSA9PSBOVUxMKTsKKyAgZi0+c3lzdGVtZF9tZXNzYWdlID0gZGJ1c19tZXNzYWdlX3JlZiAobWVzc2FnZSk7CisKKyAgcmV0dXJuIERCVVNfSEFORExFUl9SRVNVTFRfTk9UX1lFVF9IQU5ETEVEOworfQorCitzdGF0aWMgREJ1c0hhbmRsZXJSZXN1bHQKK2FjdGl2YXRlZF9maWx0ZXIgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgIERCdXNNZXNzYWdlICptZXNzYWdlLAorICAgIHZvaWQgKnVzZXJfZGF0YSkKK3sKKyAgRml4dHVyZSAqZiA9IHVzZXJfZGF0YTsKKworICBpZiAoZGJ1c19tZXNzYWdlX2lzX3NpZ25hbCAobWVzc2FnZSwgREJVU19JTlRFUkZBQ0VfREJVUywKKyAgICAgICAgIk5hbWVBY3F1aXJlZCIpIHx8CisgICAgICBkYnVzX21lc3NhZ2VfaXNfc2lnbmFsIChtZXNzYWdlLCBEQlVTX0lOVEVSRkFDRV9EQlVTLAorICAgICAgICAiTmFtZUxvc3QiKSkKKyAgICB7CisgICAgICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9OT1RfWUVUX0hBTkRMRUQ7CisgICAgfQorCisgIGdfYXNzZXJ0IChmLT5hY3RpdmF0ZWRfbWVzc2FnZSA9PSBOVUxMKTsKKyAgZi0+YWN0aXZhdGVkX21lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfcmVmIChtZXNzYWdlKTsKKworICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9OT1RfWUVUX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyB2b2lkCit0YWtlX3dlbGxfa25vd25fbmFtZSAoRml4dHVyZSAqZiwKKyAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICBjb25zdCBjaGFyICpuYW1lKQoreworICBpbnQgcmV0OworCisgIHJldCA9IGRidXNfYnVzX3JlcXVlc3RfbmFtZSAoY29ubmVjdGlvbiwgbmFtZSwKKyAgICAgIERCVVNfTkFNRV9GTEFHX0RPX05PVF9RVUVVRSwgJmYtPmUpOworICB0ZXN0X2Fzc2VydF9ub19lcnJvciAoJmYtPmUpOworICBnX2Fzc2VydF9jbXBpbnQgKHJldCwgPT0sIERCVVNfUkVRVUVTVF9OQU1FX1JFUExZX1BSSU1BUllfT1dORVIpOworfQorCitzdGF0aWMgdm9pZAorc2V0dXAgKEZpeHR1cmUgKmYsCisgICAgZ2NvbnN0cG9pbnRlciBjb250ZXh0KQoreworICBmLT5jb25maWcgPSBjb250ZXh0OworCisgIGYtPmN0eCA9IHRlc3RfbWFpbl9jb250ZXh0X2dldCAoKTsKKworICBmLT5nZSA9IE5VTEw7CisgIGRidXNfZXJyb3JfaW5pdCAoJmYtPmUpOworCisgIGYtPmFkZHJlc3MgPSB0ZXN0X2dldF9kYnVzX2RhZW1vbiAoZi0+Y29uZmlnID8gZi0+Y29uZmlnLT5jb25maWdfZmlsZSA6IE5VTEwsCisgICAgICBURVNUX1VTRVJfTUUsIE5VTEwsICZmLT5kYWVtb25fcGlkKTsKKworICBpZiAoZi0+YWRkcmVzcyA9PSBOVUxMKQorICAgIHJldHVybjsKKworICBmLT5tb25pdG9yID0gdGVzdF9jb25uZWN0X3RvX2J1cyAoZi0+Y3R4LCBmLT5hZGRyZXNzKTsKKyAgZi0+bW9uaXRvcl9uYW1lID0gZGJ1c19idXNfZ2V0X3VuaXF1ZV9uYW1lIChmLT5tb25pdG9yKTsKKyAgZi0+c2VuZGVyID0gdGVzdF9jb25uZWN0X3RvX2J1cyAoZi0+Y3R4LCBmLT5hZGRyZXNzKTsKKyAgZi0+c2VuZGVyX25hbWUgPSBkYnVzX2J1c19nZXRfdW5pcXVlX25hbWUgKGYtPnNlbmRlcik7CisgIGYtPnJlY2lwaWVudCA9IHRlc3RfY29ubmVjdF90b19idXMgKGYtPmN0eCwgZi0+YWRkcmVzcyk7CisgIGYtPnJlY2lwaWVudF9uYW1lID0gZGJ1c19idXNfZ2V0X3VuaXF1ZV9uYW1lIChmLT5yZWNpcGllbnQpOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX2FkZF9maWx0ZXIgKGYtPm1vbml0b3IsIG1vbml0b3JfZmlsdGVyLCBmLCBOVUxMKSkKKyAgICBnX2Vycm9yICgiT09NIik7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fYWRkX2ZpbHRlciAoZi0+cmVjaXBpZW50LCByZWNpcGllbnRfY2hlY2tfZmlsdGVyLAorICAgICAgICBmLCBOVUxMKSkKKyAgICBnX2Vycm9yICgiT09NIik7Cit9CisKK3N0YXRpYyB2b2lkCitiZWNvbWVfbW9uaXRvciAoRml4dHVyZSAqZiwKKyAgICBjb25zdCBDb25maWcgKmNvbmZpZykKK3sKKyAgREJ1c01lc3NhZ2UgKm07CisgIERCdXNQZW5kaW5nQ2FsbCAqcGM7CisgIGRidXNfYm9vbF90IG9rOworICBEQnVzTWVzc2FnZUl0ZXIgYXBwZW5kZXIsIGFycmF5X2FwcGVuZGVyOworICBjb25zdCBjaGFyICogY29uc3QgKm1hdGNoX3J1bGVzOworICBpbnQgaTsKKyAgZGJ1c191aW50MzJfdCB6ZXJvID0gMDsKKworICBkYnVzX2Nvbm5lY3Rpb25fc2V0X3JvdXRlX3BlZXJfbWVzc2FnZXMgKGYtPm1vbml0b3IsIFRSVUUpOworCisgIGlmIChjb25maWcgPT0gTlVMTCkKKyAgICBjb25maWcgPSBmLT5jb25maWc7CisKKyAgaWYgKGNvbmZpZyAhPSBOVUxMICYmIGNvbmZpZy0+bWF0Y2hfcnVsZXMgIT0gTlVMTCkKKyAgICBtYXRjaF9ydWxlcyA9IGNvbmZpZy0+bWF0Y2hfcnVsZXM7CisgIGVsc2UKKyAgICBtYXRjaF9ydWxlcyA9IHdpbGRjYXJkX21hdGNoX3J1bGVzOworCisgIG0gPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsIChEQlVTX1NFUlZJQ0VfREJVUywKKyAgICAgIERCVVNfUEFUSF9EQlVTLCBEQlVTX0lOVEVSRkFDRV9NT05JVE9SSU5HLCAiQmVjb21lTW9uaXRvciIpOworCisgIGlmIChtID09IE5VTEwpCisgICAgZ19lcnJvciAoIk9PTSIpOworCisgIGRidXNfbWVzc2FnZV9pdGVyX2luaXRfYXBwZW5kIChtLCAmYXBwZW5kZXIpOworCisgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfb3Blbl9jb250YWluZXIgKCZhcHBlbmRlciwgREJVU19UWVBFX0FSUkFZLCAicyIsCisgICAgICAgICZhcnJheV9hcHBlbmRlcikpCisgICAgZ19lcnJvciAoIk9PTSIpOworCisgIGZvciAoaSA9IDA7IG1hdGNoX3J1bGVzW2ldICE9IE5VTEw7IGkrKykKKyAgICB7CisgICAgICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYyAoJmFycmF5X2FwcGVuZGVyLCBEQlVTX1RZUEVfU1RSSU5HLAorICAgICAgICAgICAgJm1hdGNoX3J1bGVzW2ldKSkKKyAgICAgICAgZ19lcnJvciAoIk9PTSIpOworICAgIH0KKworICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX2Nsb3NlX2NvbnRhaW5lciAoJmFwcGVuZGVyLCAmYXJyYXlfYXBwZW5kZXIpIHx8CisgICAgICAhZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljICgmYXBwZW5kZXIsIERCVVNfVFlQRV9VSU5UMzIsICZ6ZXJvKSkKKyAgICBnX2Vycm9yICgiT09NIik7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2VuZF93aXRoX3JlcGx5IChmLT5tb25pdG9yLCBtLCAmcGMsCisgICAgICAgIERCVVNfVElNRU9VVF9VU0VfREVGQVVMVCkgfHwKKyAgICAgIHBjID09IE5VTEwpCisgICAgZ19lcnJvciAoIk9PTSIpOworCisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisgIG0gPSBOVUxMOworCisgIGlmIChkYnVzX3BlbmRpbmdfY2FsbF9nZXRfY29tcGxldGVkIChwYykpCisgICAgdGVzdF9wZW5kaW5nX2NhbGxfc3RvcmVfcmVwbHkgKHBjLCAmbSk7CisgIGVsc2UgaWYgKCFkYnVzX3BlbmRpbmdfY2FsbF9zZXRfbm90aWZ5IChwYywgdGVzdF9wZW5kaW5nX2NhbGxfc3RvcmVfcmVwbHksCisgICAgICAgICZtLCBOVUxMKSkKKyAgICBnX2Vycm9yICgiT09NIik7CisKKyAgd2hpbGUgKG0gPT0gTlVMTCkKKyAgICB0ZXN0X21haW5fY29udGV4dF9pdGVyYXRlIChmLT5jdHgsIFRSVUUpOworCisgIG9rID0gZGJ1c19tZXNzYWdlX2dldF9hcmdzIChtLCAmZi0+ZSwKKyAgICAgIERCVVNfVFlQRV9JTlZBTElEKTsKKyAgdGVzdF9hc3NlcnRfbm9fZXJyb3IgKCZmLT5lKTsKKyAgZ19hc3NlcnQgKG9rKTsKKworICBkYnVzX3BlbmRpbmdfY2FsbF91bnJlZiAocGMpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworICBtID0gTlVMTDsKK30KKworLyoKKyAqIFRlc3Qgd2hhdCBoYXBwZW5zIGlmIHRoZSBtZXRob2QgY2FsbCBhcmd1bWVudHMgYXJlIGludmFsaWQuCisgKi8KK3N0YXRpYyB2b2lkCit0ZXN0X2ludmFsaWQgKEZpeHR1cmUgKmYsCisgICAgZ2NvbnN0cG9pbnRlciBjb250ZXh0KQoreworICBEQnVzTWVzc2FnZSAqbTsKKyAgREJ1c1BlbmRpbmdDYWxsICpwYzsKKyAgZGJ1c19ib29sX3Qgb2s7CisgIERCdXNNZXNzYWdlSXRlciBhcHBlbmRlciwgYXJyYXlfYXBwZW5kZXI7CisgIGRidXNfdWludDMyX3QgemVybyA9IDA7CisgIGRidXNfdWludDMyX3QgaW52YWxpZF9mbGFncyA9IEdfTUFYVUlOVDMyOworICBjb25zdCBjaGFyICpzOworCisgIGlmIChmLT5hZGRyZXNzID09IE5VTEwpCisgICAgcmV0dXJuOworCisgIGRidXNfY29ubmVjdGlvbl9zZXRfcm91dGVfcGVlcl9tZXNzYWdlcyAoZi0+bW9uaXRvciwgVFJVRSk7CisKKyAgLyogVHJ5IHRvIGJlY29tZSBhIG1vbml0b3IgYnV0IHNwZWNpZnkgbm9uemVybyBmbGFncyAtIG5vdCBhbGxvd2VkICovCisKKyAgbSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKERCVVNfU0VSVklDRV9EQlVTLAorICAgICAgREJVU19QQVRIX0RCVVMsIERCVVNfSU5URVJGQUNFX01PTklUT1JJTkcsICJCZWNvbWVNb25pdG9yIik7CisKKyAgaWYgKG0gPT0gTlVMTCkKKyAgICBnX2Vycm9yICgiT09NIik7CisKKyAgZGJ1c19tZXNzYWdlX2l0ZXJfaW5pdF9hcHBlbmQgKG0sICZhcHBlbmRlcik7CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9vcGVuX2NvbnRhaW5lciAoJmFwcGVuZGVyLCBEQlVTX1RZUEVfQVJSQVksICJzIiwKKyAgICAgICAgJmFycmF5X2FwcGVuZGVyKSkKKyAgICBnX2Vycm9yICgiT09NIik7CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9jbG9zZV9jb250YWluZXIgKCZhcHBlbmRlciwgJmFycmF5X2FwcGVuZGVyKSB8fAorICAgICAgIWRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYyAoJmFwcGVuZGVyLCBEQlVTX1RZUEVfVUlOVDMyLAorICAgICAgICAmaW52YWxpZF9mbGFncykpCisgICAgZ19lcnJvciAoIk9PTSIpOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX3NlbmRfd2l0aF9yZXBseSAoZi0+bW9uaXRvciwgbSwgJnBjLAorICAgICAgICBEQlVTX1RJTUVPVVRfVVNFX0RFRkFVTFQpIHx8CisgICAgICBwYyA9PSBOVUxMKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworICBtID0gTlVMTDsKKworICBpZiAoZGJ1c19wZW5kaW5nX2NhbGxfZ2V0X2NvbXBsZXRlZCAocGMpKQorICAgIHRlc3RfcGVuZGluZ19jYWxsX3N0b3JlX3JlcGx5IChwYywgJm0pOworICBlbHNlIGlmICghZGJ1c19wZW5kaW5nX2NhbGxfc2V0X25vdGlmeSAocGMsIHRlc3RfcGVuZGluZ19jYWxsX3N0b3JlX3JlcGx5LAorICAgICAgICAmbSwgTlVMTCkpCisgICAgZ19lcnJvciAoIk9PTSIpOworCisgIHdoaWxlIChtID09IE5VTEwpCisgICAgdGVzdF9tYWluX2NvbnRleHRfaXRlcmF0ZSAoZi0+Y3R4LCBUUlVFKTsKKworICBnX2Fzc2VydF9jbXBpbnQgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobSksID09LCBEQlVTX01FU1NBR0VfVFlQRV9FUlJPUik7CisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9lcnJvcl9uYW1lIChtKSwgPT0sCisgICAgICBEQlVTX0VSUk9SX0lOVkFMSURfQVJHUyk7CisKKyAgLyogVHJ5IHRvIGJlY29tZSBhIG1vbml0b3IgYnV0IHVzZSB0aGUgd3Jvbmcgb2JqZWN0IHBhdGggLSBub3QgYWxsb3dlZAorICAgKiAoc2VjdXJpdHkgaGFyZGVuaW5nIGFnYWluc3QgaW5hcHByb3ByaWF0ZSBYTUwgcG9saWN5IHJ1bGVzKSAqLworCisgIGRidXNfcGVuZGluZ19jYWxsX3VucmVmIChwYyk7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisKKyAgbSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKERCVVNfU0VSVklDRV9EQlVTLAorICAgICAgIi8iLCBEQlVTX0lOVEVSRkFDRV9NT05JVE9SSU5HLCAiQmVjb21lTW9uaXRvciIpOworCisgIGlmIChtID09IE5VTEwpCisgICAgZ19lcnJvciAoIk9PTSIpOworCisgIGRidXNfbWVzc2FnZV9pdGVyX2luaXRfYXBwZW5kIChtLCAmYXBwZW5kZXIpOworCisgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfb3Blbl9jb250YWluZXIgKCZhcHBlbmRlciwgREJVU19UWVBFX0FSUkFZLCAicyIsCisgICAgICAgICZhcnJheV9hcHBlbmRlcikpCisgICAgZ19lcnJvciAoIk9PTSIpOworCisgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfY2xvc2VfY29udGFpbmVyICgmYXBwZW5kZXIsICZhcnJheV9hcHBlbmRlcikgfHwKKyAgICAgICFkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfYmFzaWMgKCZhcHBlbmRlciwgREJVU19UWVBFX1VJTlQzMiwgJnplcm8pKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHkgKGYtPm1vbml0b3IsIG0sICZwYywKKyAgICAgICAgREJVU19USU1FT1VUX1VTRV9ERUZBVUxUKSB8fAorICAgICAgcGMgPT0gTlVMTCkKKyAgICBnX2Vycm9yICgiT09NIik7CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtKTsKKyAgbSA9IE5VTEw7CisKKyAgaWYgKGRidXNfcGVuZGluZ19jYWxsX2dldF9jb21wbGV0ZWQgKHBjKSkKKyAgICB0ZXN0X3BlbmRpbmdfY2FsbF9zdG9yZV9yZXBseSAocGMsICZtKTsKKyAgZWxzZSBpZiAoIWRidXNfcGVuZGluZ19jYWxsX3NldF9ub3RpZnkgKHBjLCB0ZXN0X3BlbmRpbmdfY2FsbF9zdG9yZV9yZXBseSwKKyAgICAgICAgJm0sIE5VTEwpKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKworICB3aGlsZSAobSA9PSBOVUxMKQorICAgIHRlc3RfbWFpbl9jb250ZXh0X2l0ZXJhdGUgKGYtPmN0eCwgVFJVRSk7CisKKyAgZ19hc3NlcnRfY21waW50IChkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKG0pLCA9PSwgREJVU19NRVNTQUdFX1RZUEVfRVJST1IpOworICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfZXJyb3JfbmFtZSAobSksID09LAorICAgICAgREJVU19FUlJPUl9VTktOT1dOX0lOVEVSRkFDRSk7CisKKyAgLyogVHJ5IHRvIGJlY29tZSBhIG1vbml0b3IgYnV0IHNwZWNpZnkgYSBiYWQgbWF0Y2ggcnVsZSAtCisgICAqIGFsc28gbm90IGFsbG93ZWQgKi8KKworICBkYnVzX3BlbmRpbmdfY2FsbF91bnJlZiAocGMpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworCisgIG0gPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsIChEQlVTX1NFUlZJQ0VfREJVUywKKyAgICAgIERCVVNfUEFUSF9EQlVTLCBEQlVTX0lOVEVSRkFDRV9NT05JVE9SSU5HLCAiQmVjb21lTW9uaXRvciIpOworCisgIGlmIChtID09IE5VTEwpCisgICAgZ19lcnJvciAoIk9PTSIpOworCisgIGRidXNfbWVzc2FnZV9pdGVyX2luaXRfYXBwZW5kIChtLCAmYXBwZW5kZXIpOworCisgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfb3Blbl9jb250YWluZXIgKCZhcHBlbmRlciwgREJVU19UWVBFX0FSUkFZLCAicyIsCisgICAgICAgICZhcnJheV9hcHBlbmRlcikpCisgICAgZ19lcnJvciAoIk9PTSIpOworCisgIC8qIFN5bnRhY3RpY2FsbHkgaW5jb3JyZWN0IG1hdGNoIHJ1bGUgdGFrZW4gZnJvbSAjOTIyOTggLSB3YXMgcHJvYmFibHkKKyAgICogaW50ZW5kZWQgdG8gYmUgcGF0aD0nL21vZHVsZXMvLi4uJworICAgKi8KKyAgcyA9ICJpbnRlcmZhY2U9J29yZy5rZGUud2FsbGV0ZCcsbWVtYmVyPScvbW9kdWxlcy9rd2FsbGV0ZC9vcmcua2RlLktXYWxsZXQvd2FsbGV0T3BlbmVkJyI7CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfYmFzaWMgKCZhcnJheV9hcHBlbmRlciwgREJVU19UWVBFX1NUUklORywKKyAgICAgICAgJnMpIHx8CisgICAgICAhZGJ1c19tZXNzYWdlX2l0ZXJfY2xvc2VfY29udGFpbmVyICgmYXBwZW5kZXIsICZhcnJheV9hcHBlbmRlcikgfHwKKyAgICAgICFkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfYmFzaWMgKCZhcHBlbmRlciwgREJVU19UWVBFX1VJTlQzMiwgJnplcm8pIHx8CisgICAgICAhZGJ1c19jb25uZWN0aW9uX3NlbmRfd2l0aF9yZXBseSAoZi0+bW9uaXRvciwgbSwgJnBjLAorICAgICAgICBEQlVTX1RJTUVPVVRfVVNFX0RFRkFVTFQpIHx8CisgICAgICBwYyA9PSBOVUxMKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworICBtID0gTlVMTDsKKworICBpZiAoZGJ1c19wZW5kaW5nX2NhbGxfZ2V0X2NvbXBsZXRlZCAocGMpKQorICAgIHRlc3RfcGVuZGluZ19jYWxsX3N0b3JlX3JlcGx5IChwYywgJm0pOworICBlbHNlIGlmICghZGJ1c19wZW5kaW5nX2NhbGxfc2V0X25vdGlmeSAocGMsIHRlc3RfcGVuZGluZ19jYWxsX3N0b3JlX3JlcGx5LAorICAgICAgICAmbSwgTlVMTCkpCisgICAgZ19lcnJvciAoIk9PTSIpOworCisgIHdoaWxlIChtID09IE5VTEwpCisgICAgdGVzdF9tYWluX2NvbnRleHRfaXRlcmF0ZSAoZi0+Y3R4LCBUUlVFKTsKKworICBnX2Fzc2VydF9jbXBpbnQgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobSksID09LCBEQlVTX01FU1NBR0VfVFlQRV9FUlJPUik7CisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9lcnJvcl9uYW1lIChtKSwgPT0sCisgICAgICBEQlVTX0VSUk9SX01BVENIX1JVTEVfSU5WQUxJRCk7CisKKyAgZGJ1c19wZW5kaW5nX2NhbGxfdW5yZWYgKHBjKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtKTsKKworICAvKiBXZSBkaWQgbm90IGJlY29tZSBhIG1vbml0b3IsIHNvIHdlIGNhbiBzdGlsbCBjYWxsIG1ldGhvZHMuICovCisKKyAgcGMgPSBOVUxMOworICBtID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoREJVU19TRVJWSUNFX0RCVVMsCisgICAgICBEQlVTX1BBVEhfREJVUywgREJVU19JTlRFUkZBQ0VfREJVUywgIkdldElkIik7CisKKyAgaWYgKG0gPT0gTlVMTCkKKyAgICBnX2Vycm9yICgiT09NIik7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2VuZF93aXRoX3JlcGx5IChmLT5tb25pdG9yLCBtLCAmcGMsCisgICAgICAgIERCVVNfVElNRU9VVF9VU0VfREVGQVVMVCkgfHwKKyAgICAgIHBjID09IE5VTEwpCisgICAgZ19lcnJvciAoIk9PTSIpOworCisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisgIG0gPSBOVUxMOworCisgIGlmIChkYnVzX3BlbmRpbmdfY2FsbF9nZXRfY29tcGxldGVkIChwYykpCisgICAgdGVzdF9wZW5kaW5nX2NhbGxfc3RvcmVfcmVwbHkgKHBjLCAmbSk7CisgIGVsc2UgaWYgKCFkYnVzX3BlbmRpbmdfY2FsbF9zZXRfbm90aWZ5IChwYywgdGVzdF9wZW5kaW5nX2NhbGxfc3RvcmVfcmVwbHksCisgICAgICAgICZtLCBOVUxMKSkKKyAgICBnX2Vycm9yICgiT09NIik7CisKKyAgd2hpbGUgKG0gPT0gTlVMTCkKKyAgICB0ZXN0X21haW5fY29udGV4dF9pdGVyYXRlIChmLT5jdHgsIFRSVUUpOworCisgIGlmIChkYnVzX3NldF9lcnJvcl9mcm9tX21lc3NhZ2UgKCZmLT5lLCBtKSkKKyAgICBnX2Vycm9yICgiJXM6ICVzIiwgZi0+ZS5uYW1lLCBmLT5lLm1lc3NhZ2UpOworCisgIG9rID0gZGJ1c19tZXNzYWdlX2dldF9hcmdzIChtLCAmZi0+ZSwKKyAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZzLAorICAgICAgREJVU19UWVBFX0lOVkFMSUQpOworICB0ZXN0X2Fzc2VydF9ub19lcnJvciAoJmYtPmUpOworICBnX2Fzc2VydCAob2spOworICBnX2Fzc2VydF9jbXBzdHIgKHMsICE9LCBOVUxMKTsKKyAgZ19hc3NlcnRfY21wc3RyIChzLCAhPSwgIiIpOworCisgIGRidXNfcGVuZGluZ19jYWxsX3VucmVmIChwYyk7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7Cit9CisKKy8qCisgKiBUZXN0IHRoZSBzaWRlLWVmZmVjdHMgb2YgYmVjb21pbmcgYSBtb25pdG9yLgorICovCitzdGF0aWMgdm9pZAordGVzdF9iZWNvbWVfbW9uaXRvciAoRml4dHVyZSAqZiwKKyAgICBnY29uc3Rwb2ludGVyIGNvbnRleHQpCit7CisgIERCdXNNZXNzYWdlICptOworICBpbnQgcmV0OworICBkYnVzX2Jvb2xfdCBnb3RfdW5pcXVlID0gRkFMU0UsIGdvdF9hID0gRkFMU0UsIGdvdF9iID0gRkFMU0UsIGdvdF9jID0gRkFMU0U7CisgIGRidXNfYm9vbF90IGxvc3RfdW5pcXVlID0gRkFMU0UsIGxvc3RfYSA9IEZBTFNFLCBsb3N0X2IgPSBGQUxTRSwgbG9zdF9jID0gRkFMU0U7CisKKyAgaWYgKGYtPmFkZHJlc3MgPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAgcmV0ID0gZGJ1c19idXNfcmVxdWVzdF9uYW1lIChmLT5tb25pdG9yLCAiY29tLmV4YW1wbGUuQSIsCisgICAgICBEQlVTX05BTUVfRkxBR19ET19OT1RfUVVFVUUsICZmLT5lKTsKKyAgdGVzdF9hc3NlcnRfbm9fZXJyb3IgKCZmLT5lKTsKKyAgZ19hc3NlcnRfY21waW50IChyZXQsID09LCBEQlVTX1JFUVVFU1RfTkFNRV9SRVBMWV9QUklNQVJZX09XTkVSKTsKKworICByZXQgPSBkYnVzX2J1c19yZXF1ZXN0X25hbWUgKGYtPm1vbml0b3IsICJjb20uZXhhbXBsZS5CIiwKKyAgICAgIERCVVNfTkFNRV9GTEFHX0RPX05PVF9RVUVVRSwgJmYtPmUpOworICB0ZXN0X2Fzc2VydF9ub19lcnJvciAoJmYtPmUpOworICBnX2Fzc2VydF9jbXBpbnQgKHJldCwgPT0sIERCVVNfUkVRVUVTVF9OQU1FX1JFUExZX1BSSU1BUllfT1dORVIpOworCisgIHJldCA9IGRidXNfYnVzX3JlcXVlc3RfbmFtZSAoZi0+bW9uaXRvciwgImNvbS5leGFtcGxlLkMiLAorICAgICAgREJVU19OQU1FX0ZMQUdfRE9fTk9UX1FVRVVFLCAmZi0+ZSk7CisgIHRlc3RfYXNzZXJ0X25vX2Vycm9yICgmZi0+ZSk7CisgIGdfYXNzZXJ0X2NtcGludCAocmV0LCA9PSwgREJVU19SRVFVRVNUX05BTUVfUkVQTFlfUFJJTUFSWV9PV05FUik7CisKKyAgd2hpbGUgKCFnb3RfdW5pcXVlIHx8ICFnb3RfYSB8fCAhZ290X2IgfHwgIWdvdF9jKQorICAgIHsKKyAgICAgIGlmIChnX3F1ZXVlX2lzX2VtcHR5ICgmZi0+bW9uaXRvcmVkKSkKKyAgICAgICAgdGVzdF9tYWluX2NvbnRleHRfaXRlcmF0ZSAoZi0+Y3R4LCBUUlVFKTsKKworICAgICAgd2hpbGUgKChtID0gZ19xdWV1ZV9wb3BfaGVhZCAoJmYtPm1vbml0b3JlZCkpICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoZGJ1c19tZXNzYWdlX2lzX3NpZ25hbCAobSwgREJVU19JTlRFUkZBQ0VfREJVUywKKyAgICAgICAgICAgICAgICAiTmFtZUFjcXVpcmVkIikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgICAgICAgICAgIGRidXNfYm9vbF90IG9rID0gZGJ1c19tZXNzYWdlX2dldF9hcmdzIChtLCAmZi0+ZSwKKyAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZuYW1lLAorICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpOworCisgICAgICAgICAgICAgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9wYXRoIChtKSwgPT0sCisgICAgICAgICAgICAgICAgICBEQlVTX1BBVEhfREJVUyk7CisKKyAgICAgICAgICAgICAgdGVzdF9hc3NlcnRfbm9fZXJyb3IgKCZmLT5lKTsKKyAgICAgICAgICAgICAgZ19hc3NlcnQgKG9rKTsKKworICAgICAgICAgICAgICBpZiAoZ19zdHJfZXF1YWwgKG5hbWUsIGYtPm1vbml0b3JfbmFtZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgZ19hc3NlcnQgKCFnb3RfdW5pcXVlKTsKKyAgICAgICAgICAgICAgICAgIGdvdF91bmlxdWUgPSBUUlVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZSBpZiAoZ19zdHJfZXF1YWwgKG5hbWUsICJjb20uZXhhbXBsZS5BIikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgZ19hc3NlcnQgKCFnb3RfYSk7CisgICAgICAgICAgICAgICAgICBnb3RfYSA9IFRSVUU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBlbHNlIGlmIChnX3N0cl9lcXVhbCAobmFtZSwgImNvbS5leGFtcGxlLkIiKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBnX2Fzc2VydCAoIWdvdF9iKTsKKyAgICAgICAgICAgICAgICAgIGdvdF9iID0gVFJVRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBnX2Fzc2VydF9jbXBzdHIgKG5hbWUsID09LCAiY29tLmV4YW1wbGUuQyIpOworICAgICAgICAgICAgICAgICAgZ19hc3NlcnQgKCFnb3RfYyk7CisgICAgICAgICAgICAgICAgICBnb3RfYyA9IFRSVUU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZ19lcnJvciAoInVuZXhwZWN0ZWQgbWVzc2FnZSAlcy4lcyIsCisgICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAobSksCisgICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X21lbWJlciAobSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtKTsKKyAgICAgICAgfQorICAgIH0KKworICBiZWNvbWVfbW9uaXRvciAoZiwgTlVMTCk7CisKKyAgd2hpbGUgKCFsb3N0X3VuaXF1ZSB8fCAhbG9zdF9hIHx8ICFsb3N0X2IgfHwgIWxvc3RfYykKKyAgICB7CisgICAgICBpZiAoZ19xdWV1ZV9pc19lbXB0eSAoJmYtPm1vbml0b3JlZCkpCisgICAgICAgIHRlc3RfbWFpbl9jb250ZXh0X2l0ZXJhdGUgKGYtPmN0eCwgVFJVRSk7CisKKyAgICAgIHdoaWxlICgobSA9IGdfcXVldWVfcG9wX2hlYWQgKCZmLT5tb25pdG9yZWQpKSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGRidXNfbWVzc2FnZV9pc19zaWduYWwgKG0sIERCVVNfSU5URVJGQUNFX0RCVVMsCisgICAgICAgICAgICAgICAgIk5hbWVMb3N0IikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgICAgICAgICAgIGRidXNfYm9vbF90IG9rID0gZGJ1c19tZXNzYWdlX2dldF9hcmdzIChtLCAmZi0+ZSwKKyAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZuYW1lLAorICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpOworCisgICAgICAgICAgICAgIHRlc3RfYXNzZXJ0X25vX2Vycm9yICgmZi0+ZSk7CisgICAgICAgICAgICAgIGdfYXNzZXJ0IChvayk7CisKKyAgICAgICAgICAgICAgaWYgKGdfc3RyX2VxdWFsIChuYW1lLCBmLT5tb25pdG9yX25hbWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGdfYXNzZXJ0ICghbG9zdF91bmlxdWUpOworICAgICAgICAgICAgICAgICAgbG9zdF91bmlxdWUgPSBUUlVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZSBpZiAoZ19zdHJfZXF1YWwgKG5hbWUsICJjb20uZXhhbXBsZS5BIikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgZ19hc3NlcnQgKCFsb3N0X2EpOworICAgICAgICAgICAgICAgICAgbG9zdF9hID0gVFJVRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGVsc2UgaWYgKGdfc3RyX2VxdWFsIChuYW1lLCAiY29tLmV4YW1wbGUuQiIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGdfYXNzZXJ0ICghbG9zdF9iKTsKKyAgICAgICAgICAgICAgICAgIGxvc3RfYiA9IFRSVUU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgZ19hc3NlcnRfY21wc3RyIChuYW1lLCA9PSwgImNvbS5leGFtcGxlLkMiKTsKKyAgICAgICAgICAgICAgICAgIGdfYXNzZXJ0ICghbG9zdF9jKTsKKyAgICAgICAgICAgICAgICAgIGxvc3RfYyA9IFRSVUU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZ19lcnJvciAoInVuZXhwZWN0ZWQgbWVzc2FnZSAlcy4lcyIsCisgICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAobSksCisgICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X21lbWJlciAobSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtKTsKKyAgICAgICAgfQorICAgIH0KKworICAvKiBDYWxsaW5nIG1ldGhvZHMgaXMgZm9yYmlkZGVuOyB3ZSBnZXQgZGlzY29ubmVjdGVkLiAqLworICBkYnVzX2J1c19hZGRfbWF0Y2ggKGYtPm1vbml0b3IsICIiLCAmZi0+ZSk7CisgIGdfYXNzZXJ0X2NtcHN0ciAoZi0+ZS5uYW1lLCA9PSwgREJVU19FUlJPUl9OT19SRVBMWSk7CisgIGdfYXNzZXJ0ICghZGJ1c19jb25uZWN0aW9uX2dldF9pc19jb25uZWN0ZWQgKGYtPm1vbml0b3IpKTsKKworICB3aGlsZSAoVFJVRSkKKyAgICB7CisgICAgICBpZiAoZ19xdWV1ZV9pc19lbXB0eSAoJmYtPm1vbml0b3JlZCkpCisgICAgICAgIHRlc3RfbWFpbl9jb250ZXh0X2l0ZXJhdGUgKGYtPmN0eCwgVFJVRSk7CisKKyAgICAgIC8qIFdoZW4gd2UgaXRlcmF0ZSBhbGwgdGhlIGNvbm5lY3Rpb24ncyBtZXNzYWdlcywgd2Ugc2VlIG91cnNlbHZlcworICAgICAgICogbG9zaW5nIGFsbCBvdXIgbmFtZXMsIHRoZW4gd2UncmUgZGlzY29ubmVjdGVkLiAqLworICAgICAgd2hpbGUgKChtID0gZ19xdWV1ZV9wb3BfaGVhZCAoJmYtPm1vbml0b3JlZCkpICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoZGJ1c19tZXNzYWdlX2lzX3NpZ25hbCAobSwgREJVU19JTlRFUkZBQ0VfTE9DQUwsICJEaXNjb25uZWN0ZWQiKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChtKTsKKyAgICAgICAgICAgICAgZ290byBkaXNjb25uZWN0ZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBnX2Vycm9yICgidW5leHBlY3RlZCBtZXNzYWdlICVzLiVzIiwKKyAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfaW50ZXJmYWNlIChtKSwKKyAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworICAgICAgICB9CisgICAgfQorCitkaXNjb25uZWN0ZWQ6CisKKyAgZ19hc3NlcnQgKGxvc3RfYSk7CisgIGdfYXNzZXJ0IChsb3N0X2IpOworICBnX2Fzc2VydCAobG9zdF9jKTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfYnJvYWRjYXN0IChGaXh0dXJlICpmLAorICAgIGdjb25zdHBvaW50ZXIgY29udGV4dCkKK3sKKyAgREJ1c01lc3NhZ2UgKm07CisKKyAgaWYgKGYtPmFkZHJlc3MgPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAgZGJ1c19idXNfYWRkX21hdGNoIChmLT5yZWNpcGllbnQsICJ0eXBlPSdzaWduYWwnIiwgJmYtPmUpOworICB0ZXN0X2Fzc2VydF9ub19lcnJvciAoJmYtPmUpOworCisgIGJlY29tZV9tb25pdG9yIChmLCBOVUxMKTsKKworICBtID0gZGJ1c19tZXNzYWdlX25ld19zaWduYWwgKCIvZm9vIiwgImNvbS5leGFtcGxlLmJhciIsICJCcm9hZGNhc3RTaWduYWwxIik7CisgIGRidXNfY29ubmVjdGlvbl9zZW5kIChmLT5zZW5kZXIsIG0sIE5VTEwpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworCisgIG0gPSBkYnVzX21lc3NhZ2VfbmV3X3NpZ25hbCAoIi9mb28iLCAiY29tLmV4YW1wbGUuYmFyIiwgIkJyb2FkY2FzdFNpZ25hbDIiKTsKKyAgZGJ1c19jb25uZWN0aW9uX3NlbmQgKGYtPnNlbmRlciwgbSwgTlVMTCk7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisKKyAgbSA9IGRidXNfbWVzc2FnZV9uZXdfc2lnbmFsICgiL2ZvbyIsICJjb20uZXhhbXBsZS5iYXIiLCAiQnJvYWRjYXN0U2lnbmFsMyIpOworICBkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoZi0+c2VuZGVyLCBtLCBOVUxMKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtKTsKKworICB3aGlsZSAoZ19xdWV1ZV9nZXRfbGVuZ3RoICgmZi0+bW9uaXRvcmVkKSA8IDMpCisgICAgdGVzdF9tYWluX2NvbnRleHRfaXRlcmF0ZSAoZi0+Y3R4LCBUUlVFKTsKKworICBtID0gZ19xdWV1ZV9wb3BfaGVhZCAoJmYtPm1vbml0b3JlZCk7CisgIGFzc2VydF9zaWduYWwgKG0sIGYtPnNlbmRlcl9uYW1lLCAiL2ZvbyIsICJjb20uZXhhbXBsZS5iYXIiLAorICAgICAgIkJyb2FkY2FzdFNpZ25hbDEiLCAiIiwgTlVMTCk7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisKKyAgbSA9IGdfcXVldWVfcG9wX2hlYWQgKCZmLT5tb25pdG9yZWQpOworICBhc3NlcnRfc2lnbmFsIChtLCBmLT5zZW5kZXJfbmFtZSwgIi9mb28iLCAiY29tLmV4YW1wbGUuYmFyIiwKKyAgICAgICJCcm9hZGNhc3RTaWduYWwyIiwgIiIsIE5VTEwpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworCisgIG0gPSBnX3F1ZXVlX3BvcF9oZWFkICgmZi0+bW9uaXRvcmVkKTsKKyAgYXNzZXJ0X3NpZ25hbCAobSwgZi0+c2VuZGVyX25hbWUsICIvZm9vIiwgImNvbS5leGFtcGxlLmJhciIsCisgICAgICAiQnJvYWRjYXN0U2lnbmFsMyIsICIiLCBOVUxMKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtKTsKKworICBtID0gZ19xdWV1ZV9wb3BfaGVhZCAoJmYtPm1vbml0b3JlZCk7CisgIGdfYXNzZXJ0IChtID09IE5VTEwpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9mb3JiaWRkZW5fYnJvYWRjYXN0IChGaXh0dXJlICpmLAorICAgIGdjb25zdHBvaW50ZXIgY29udGV4dCkKK3sKKyAgREJ1c01lc3NhZ2UgKm07CisKKyAgaWYgKGYtPmFkZHJlc3MgPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAgZGJ1c19idXNfYWRkX21hdGNoIChmLT5yZWNpcGllbnQsICJ0eXBlPSdzaWduYWwnIiwgJmYtPmUpOworICB0ZXN0X2Fzc2VydF9ub19lcnJvciAoJmYtPmUpOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX2FkZF9maWx0ZXIgKGYtPnJlY2lwaWVudCwgcmVjaXBpZW50X2VucXVldWVfZmlsdGVyLAorICAgICAgICBmLCBOVUxMKSkKKyAgICBnX2Vycm9yICgiT09NIik7CisgIGYtPnJlY2lwaWVudF9lbnF1ZXVlX2ZpbHRlcl9hZGRlZCA9IFRSVUU7CisKKyAgYmVjb21lX21vbml0b3IgKGYsIE5VTEwpOworCisgIG0gPSBkYnVzX21lc3NhZ2VfbmV3X3NpZ25hbCAoIi9mb28iLCAiY29tLmV4YW1wbGUuQ2Fubm90U2VuZCIsCisgICAgICAiQnJvYWRjYXN0U2lnbmFsMSIpOworICBkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoZi0+c2VuZGVyLCBtLCBOVUxMKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtKTsKKworICBtID0gZGJ1c19tZXNzYWdlX25ld19zaWduYWwgKCIvZm9vIiwgImNvbS5leGFtcGxlLkNhbm5vdFJlY2VpdmUiLAorICAgICAgIkJyb2FkY2FzdFNpZ25hbDIiKTsKKyAgZGJ1c19jb25uZWN0aW9uX3NlbmQgKGYtPnNlbmRlciwgbSwgTlVMTCk7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisKKyAgbSA9IGRidXNfbWVzc2FnZV9uZXdfc2lnbmFsICgiL2ZvbyIsICJjb20uZXhhbXBsZS5DYW5ub3RTZW5kIiwKKyAgICAgICJCcm9hZGNhc3RTaWduYWwzIik7CisgIGRidXNfY29ubmVjdGlvbl9zZW5kIChmLT5zZW5kZXIsIG0sIE5VTEwpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworCisgIG0gPSBkYnVzX21lc3NhZ2VfbmV3X3NpZ25hbCAoIi9mb28iLCAiY29tLmV4YW1wbGUuQ2Fubm90QnJvYWRjYXN0IiwKKyAgICAgICJDYW5ub3RCcm9hZGNhc3QiKTsKKyAgZGJ1c19jb25uZWN0aW9uX3NlbmQgKGYtPnNlbmRlciwgbSwgTlVMTCk7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisKKyAgbSA9IGRidXNfbWVzc2FnZV9uZXdfc2lnbmFsICgiL2ZvbyIsICJjb20uZXhhbXBsZS5DYW5ub3RCcm9hZGNhc3QyIiwKKyAgICAgICJDYW5ub3RCcm9hZGNhc3QyIik7CisgIGRidXNfY29ubmVjdGlvbl9zZW5kIChmLT5zZW5kZXIsIG0sIE5VTEwpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworCisgIC8qIHRoZXNlIHR3byB3aWxsIGdvIHRocm91Z2g6IHdlIHVzZSB0aGVtIGFzIGFuIGluZGlyZWN0IHdheSB0byBhc3NlcnQgdGhhdAorICAgKiB0aGUgcmVjaXBpZW50IGhhcyBub3QgcmVjZWl2ZWQgYW55dGhpbmcgZWFybGllciAqLworICBtID0gZGJ1c19tZXNzYWdlX25ld19zaWduYWwgKCIvZm9vIiwgImNvbS5leGFtcGxlLkNhbm5vdFVuaWNhc3QiLAorICAgICAgIkNhbm5vdFVuaWNhc3QiKTsKKyAgZGJ1c19jb25uZWN0aW9uX3NlbmQgKGYtPnNlbmRlciwgbSwgTlVMTCk7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisgIG0gPSBkYnVzX21lc3NhZ2VfbmV3X3NpZ25hbCAoIi9mb28iLCAiY29tLmV4YW1wbGUuQ2Fubm90VW5pY2FzdDIiLAorICAgICAgIkNhbm5vdFVuaWNhc3QyIik7CisgIGRidXNfY29ubmVjdGlvbl9zZW5kIChmLT5zZW5kZXIsIG0sIE5VTEwpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworCisgIHdoaWxlIChnX3F1ZXVlX2dldF9sZW5ndGggKCZmLT5tb25pdG9yZWQpIDwgMTIpCisgICAgdGVzdF9tYWluX2NvbnRleHRfaXRlcmF0ZSAoZi0+Y3R4LCBUUlVFKTsKKworICBtID0gZ19xdWV1ZV9wb3BfaGVhZCAoJmYtPm1vbml0b3JlZCk7CisgIGFzc2VydF9zaWduYWwgKG0sIGYtPnNlbmRlcl9uYW1lLCAiL2ZvbyIsICJjb20uZXhhbXBsZS5DYW5ub3RTZW5kIiwKKyAgICAgICJCcm9hZGNhc3RTaWduYWwxIiwgIiIsIE5VTEwpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworCisgIG0gPSBnX3F1ZXVlX3BvcF9oZWFkICgmZi0+bW9uaXRvcmVkKTsKKyAgYXNzZXJ0X2Vycm9yX3JlcGx5IChtLCBEQlVTX1NFUlZJQ0VfREJVUywgZi0+c2VuZGVyX25hbWUsCisgICAgICBEQlVTX0VSUk9SX0FDQ0VTU19ERU5JRUQpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworCisgIG0gPSBnX3F1ZXVlX3BvcF9oZWFkICgmZi0+bW9uaXRvcmVkKTsKKyAgYXNzZXJ0X3NpZ25hbCAobSwgZi0+c2VuZGVyX25hbWUsICIvZm9vIiwgImNvbS5leGFtcGxlLkNhbm5vdFJlY2VpdmUiLAorICAgICAgIkJyb2FkY2FzdFNpZ25hbDIiLCAiIiwgTlVMTCk7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisKKyAgbSA9IGdfcXVldWVfcG9wX2hlYWQgKCZmLT5tb25pdG9yZWQpOworICBhc3NlcnRfZXJyb3JfcmVwbHkgKG0sIERCVVNfU0VSVklDRV9EQlVTLCBmLT5zZW5kZXJfbmFtZSwKKyAgICAgIERCVVNfRVJST1JfQUNDRVNTX0RFTklFRCk7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisKKyAgbSA9IGdfcXVldWVfcG9wX2hlYWQgKCZmLT5tb25pdG9yZWQpOworICBhc3NlcnRfc2lnbmFsIChtLCBmLT5zZW5kZXJfbmFtZSwgIi9mb28iLCAiY29tLmV4YW1wbGUuQ2Fubm90U2VuZCIsCisgICAgICAiQnJvYWRjYXN0U2lnbmFsMyIsICIiLCBOVUxMKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtKTsKKworICBtID0gZ19xdWV1ZV9wb3BfaGVhZCAoJmYtPm1vbml0b3JlZCk7CisgIGFzc2VydF9lcnJvcl9yZXBseSAobSwgREJVU19TRVJWSUNFX0RCVVMsIGYtPnNlbmRlcl9uYW1lLAorICAgICAgREJVU19FUlJPUl9BQ0NFU1NfREVOSUVEKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtKTsKKworICBtID0gZ19xdWV1ZV9wb3BfaGVhZCAoJmYtPm1vbml0b3JlZCk7CisgIGFzc2VydF9zaWduYWwgKG0sIGYtPnNlbmRlcl9uYW1lLCAiL2ZvbyIsICJjb20uZXhhbXBsZS5DYW5ub3RCcm9hZGNhc3QiLAorICAgICAgIkNhbm5vdEJyb2FkY2FzdCIsICIiLCBOVUxMKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtKTsKKworICBtID0gZ19xdWV1ZV9wb3BfaGVhZCAoJmYtPm1vbml0b3JlZCk7CisgIGFzc2VydF9lcnJvcl9yZXBseSAobSwgREJVU19TRVJWSUNFX0RCVVMsIGYtPnNlbmRlcl9uYW1lLAorICAgICAgREJVU19FUlJPUl9BQ0NFU1NfREVOSUVEKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtKTsKKworICBtID0gZ19xdWV1ZV9wb3BfaGVhZCAoJmYtPm1vbml0b3JlZCk7CisgIGFzc2VydF9zaWduYWwgKG0sIGYtPnNlbmRlcl9uYW1lLCAiL2ZvbyIsICJjb20uZXhhbXBsZS5DYW5ub3RCcm9hZGNhc3QyIiwKKyAgICAgICJDYW5ub3RCcm9hZGNhc3QyIiwgIiIsIE5VTEwpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworCisgIG0gPSBnX3F1ZXVlX3BvcF9oZWFkICgmZi0+bW9uaXRvcmVkKTsKKyAgYXNzZXJ0X2Vycm9yX3JlcGx5IChtLCBEQlVTX1NFUlZJQ0VfREJVUywgZi0+c2VuZGVyX25hbWUsCisgICAgICBEQlVTX0VSUk9SX0FDQ0VTU19ERU5JRUQpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworCisgIG0gPSBnX3F1ZXVlX3BvcF9oZWFkICgmZi0+bW9uaXRvcmVkKTsKKyAgYXNzZXJ0X3NpZ25hbCAobSwgZi0+c2VuZGVyX25hbWUsICIvZm9vIiwgImNvbS5leGFtcGxlLkNhbm5vdFVuaWNhc3QiLAorICAgICAgIkNhbm5vdFVuaWNhc3QiLCAiIiwgTlVMTCk7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisKKyAgbSA9IGdfcXVldWVfcG9wX2hlYWQgKCZmLT5tb25pdG9yZWQpOworICBhc3NlcnRfc2lnbmFsIChtLCBmLT5zZW5kZXJfbmFtZSwgIi9mb28iLCAiY29tLmV4YW1wbGUuQ2Fubm90VW5pY2FzdDIiLAorICAgICAgIkNhbm5vdFVuaWNhc3QyIiwgIiIsIE5VTEwpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworCisgIG0gPSBnX3F1ZXVlX3BvcF9oZWFkICgmZi0+bW9uaXRvcmVkKTsKKyAgZ19hc3NlcnQgKG0gPT0gTlVMTCk7CisKKyAgLyogdGhlIGludGVuZGVkIHJlY2lwaWVudCBvbmx5IHJlY2VpdmVkIHRoZSBvbmVzIHRoYXQgd2VyZSBvbiB0aGUgaW50ZXJmYWNlCisgICAqIHdoZXJlIGJyb2FkY2FzdHMgYXJlIGFsbG93ZWQgKi8KKworICB3aGlsZSAoZ19xdWV1ZV9nZXRfbGVuZ3RoICgmZi0+cmVjZWl2ZWQpIDwgMikKKyAgICB0ZXN0X21haW5fY29udGV4dF9pdGVyYXRlIChmLT5jdHgsIFRSVUUpOworCisgIG0gPSBnX3F1ZXVlX3BvcF9oZWFkICgmZi0+cmVjZWl2ZWQpOworICBhc3NlcnRfc2lnbmFsIChtLCBmLT5zZW5kZXJfbmFtZSwgIi9mb28iLCAiY29tLmV4YW1wbGUuQ2Fubm90VW5pY2FzdCIsCisgICAgICAiQ2Fubm90VW5pY2FzdCIsICIiLCBOVUxMKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtKTsKKworICBtID0gZ19xdWV1ZV9wb3BfaGVhZCAoJmYtPnJlY2VpdmVkKTsKKyAgYXNzZXJ0X3NpZ25hbCAobSwgZi0+c2VuZGVyX25hbWUsICIvZm9vIiwgImNvbS5leGFtcGxlLkNhbm5vdFVuaWNhc3QyIiwKKyAgICAgICJDYW5ub3RVbmljYXN0MiIsICIiLCBOVUxMKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtKTsKKworICBtID0gZ19xdWV1ZV9wb3BfaGVhZCAoJmYtPnJlY2VpdmVkKTsKKyAgZ19hc3NlcnQgKG0gPT0gTlVMTCk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3VuaWNhc3Rfc2lnbmFsIChGaXh0dXJlICpmLAorICAgIGdjb25zdHBvaW50ZXIgY29udGV4dCkKK3sKKyAgREJ1c01lc3NhZ2UgKm07CisKKyAgaWYgKGYtPmFkZHJlc3MgPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAgYmVjb21lX21vbml0b3IgKGYsIE5VTEwpOworCisgIG0gPSBkYnVzX21lc3NhZ2VfbmV3X3NpZ25hbCAoIi9mb28iLCAiY29tLmV4YW1wbGUuYmFyIiwgIlVuaWNhc3RTaWduYWwxIik7CisgIGlmICghZGJ1c19tZXNzYWdlX3NldF9kZXN0aW5hdGlvbiAobSwgZi0+cmVjaXBpZW50X25hbWUpKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKyAgZGJ1c19jb25uZWN0aW9uX3NlbmQgKGYtPnNlbmRlciwgbSwgTlVMTCk7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisKKyAgbSA9IGRidXNfbWVzc2FnZV9uZXdfc2lnbmFsICgiL2ZvbyIsICJjb20uZXhhbXBsZS5iYXIiLCAiVW5pY2FzdFNpZ25hbDIiKTsKKyAgaWYgKCFkYnVzX21lc3NhZ2Vfc2V0X2Rlc3RpbmF0aW9uIChtLCBmLT5yZWNpcGllbnRfbmFtZSkpCisgICAgZ19lcnJvciAoIk9PTSIpOworICBkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoZi0+c2VuZGVyLCBtLCBOVUxMKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtKTsKKworICBtID0gZGJ1c19tZXNzYWdlX25ld19zaWduYWwgKCIvZm9vIiwgImNvbS5leGFtcGxlLmJhciIsICJVbmljYXN0U2lnbmFsMyIpOworICBpZiAoIWRidXNfbWVzc2FnZV9zZXRfZGVzdGluYXRpb24gKG0sIGYtPnJlY2lwaWVudF9uYW1lKSkKKyAgICBnX2Vycm9yICgiT09NIik7CisgIGRidXNfY29ubmVjdGlvbl9zZW5kIChmLT5zZW5kZXIsIG0sIE5VTEwpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworCisgIHdoaWxlIChnX3F1ZXVlX2dldF9sZW5ndGggKCZmLT5tb25pdG9yZWQpIDwgMykKKyAgICB0ZXN0X21haW5fY29udGV4dF9pdGVyYXRlIChmLT5jdHgsIFRSVUUpOworCisgIG0gPSBnX3F1ZXVlX3BvcF9oZWFkICgmZi0+bW9uaXRvcmVkKTsKKyAgYXNzZXJ0X3NpZ25hbCAobSwgZi0+c2VuZGVyX25hbWUsICIvZm9vIiwKKyAgICAgICJjb20uZXhhbXBsZS5iYXIiLCAiVW5pY2FzdFNpZ25hbDEiLCAiIiwgZi0+cmVjaXBpZW50X25hbWUpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworCisgIG0gPSBnX3F1ZXVlX3BvcF9oZWFkICgmZi0+bW9uaXRvcmVkKTsKKyAgYXNzZXJ0X3NpZ25hbCAobSwgZi0+c2VuZGVyX25hbWUsICIvZm9vIiwKKyAgICAgICJjb20uZXhhbXBsZS5iYXIiLCAiVW5pY2FzdFNpZ25hbDIiLCAiIiwgZi0+cmVjaXBpZW50X25hbWUpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworCisgIG0gPSBnX3F1ZXVlX3BvcF9oZWFkICgmZi0+bW9uaXRvcmVkKTsKKyAgYXNzZXJ0X3NpZ25hbCAobSwgZi0+c2VuZGVyX25hbWUsICIvZm9vIiwKKyAgICAgICJjb20uZXhhbXBsZS5iYXIiLCAiVW5pY2FzdFNpZ25hbDMiLCAiIiwgZi0+cmVjaXBpZW50X25hbWUpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworCisgIG0gPSBnX3F1ZXVlX3BvcF9oZWFkICgmZi0+bW9uaXRvcmVkKTsKKyAgZ19hc3NlcnQgKG0gPT0gTlVMTCk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X2ZvcmJpZGRlbiAoRml4dHVyZSAqZiwKKyAgICBnY29uc3Rwb2ludGVyIGNvbnRleHQpCit7CisgIERCdXNNZXNzYWdlICptOworCisgIGlmIChmLT5hZGRyZXNzID09IE5VTEwpCisgICAgcmV0dXJuOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX2FkZF9maWx0ZXIgKGYtPnJlY2lwaWVudCwgcmVjaXBpZW50X2VucXVldWVfZmlsdGVyLAorICAgICAgICBmLCBOVUxMKSkKKyAgICBnX2Vycm9yICgiT09NIik7CisgIGYtPnJlY2lwaWVudF9lbnF1ZXVlX2ZpbHRlcl9hZGRlZCA9IFRSVUU7CisKKyAgYmVjb21lX21vbml0b3IgKGYsIE5VTEwpOworCisgIG0gPSBkYnVzX21lc3NhZ2VfbmV3X3NpZ25hbCAoIi9mb28iLCAiY29tLmV4YW1wbGUuQ2Fubm90U2VuZCIsCisgICAgICAiVW5pY2FzdFNpZ25hbDEiKTsKKyAgaWYgKCFkYnVzX21lc3NhZ2Vfc2V0X2Rlc3RpbmF0aW9uIChtLCBmLT5yZWNpcGllbnRfbmFtZSkpCisgICAgZ19lcnJvciAoIk9PTSIpOworICBkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoZi0+c2VuZGVyLCBtLCBOVUxMKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtKTsKKworICBtID0gZGJ1c19tZXNzYWdlX25ld19zaWduYWwgKCIvZm9vIiwgImNvbS5leGFtcGxlLkNhbm5vdFJlY2VpdmUiLAorICAgICAgIlVuaWNhc3RTaWduYWwyIik7CisgIGlmICghZGJ1c19tZXNzYWdlX3NldF9kZXN0aW5hdGlvbiAobSwgZi0+cmVjaXBpZW50X25hbWUpKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKyAgZGJ1c19jb25uZWN0aW9uX3NlbmQgKGYtPnNlbmRlciwgbSwgTlVMTCk7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisKKyAgbSA9IGRidXNfbWVzc2FnZV9uZXdfc2lnbmFsICgiL2ZvbyIsICJjb20uZXhhbXBsZS5DYW5ub3RTZW5kIiwKKyAgICAgICJVbmljYXN0U2lnbmFsMyIpOworICBpZiAoIWRidXNfbWVzc2FnZV9zZXRfZGVzdGluYXRpb24gKG0sIGYtPnJlY2lwaWVudF9uYW1lKSkKKyAgICBnX2Vycm9yICgiT09NIik7CisgIGRidXNfY29ubmVjdGlvbl9zZW5kIChmLT5zZW5kZXIsIG0sIE5VTEwpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworCisgIG0gPSBkYnVzX21lc3NhZ2VfbmV3X3NpZ25hbCAoIi9mb28iLCAiY29tLmV4YW1wbGUuQ2Fubm90VW5pY2FzdCIsCisgICAgICAiQ2Fubm90VW5pY2FzdCIpOworICBpZiAoIWRidXNfbWVzc2FnZV9zZXRfZGVzdGluYXRpb24gKG0sIGYtPnJlY2lwaWVudF9uYW1lKSkKKyAgICBnX2Vycm9yICgiT09NIik7CisgIGRidXNfY29ubmVjdGlvbl9zZW5kIChmLT5zZW5kZXIsIG0sIE5VTEwpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworCisgIG0gPSBkYnVzX21lc3NhZ2VfbmV3X3NpZ25hbCAoIi9mb28iLCAiY29tLmV4YW1wbGUuQ2Fubm90VW5pY2FzdDIiLAorICAgICAgIkNhbm5vdFVuaWNhc3QyIik7CisgIGlmICghZGJ1c19tZXNzYWdlX3NldF9kZXN0aW5hdGlvbiAobSwgZi0+cmVjaXBpZW50X25hbWUpKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKyAgZGJ1c19jb25uZWN0aW9uX3NlbmQgKGYtPnNlbmRlciwgbSwgTlVMTCk7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisKKyAgLyogdGhlc2UgdHdvIHdpbGwgZ28gdGhyb3VnaDogd2UgdXNlIHRoZW0gYXMgYW4gaW5kaXJlY3Qgd2F5IHRvIGFzc2VydCB0aGF0CisgICAqIHRoZSByZWNpcGllbnQgaGFzIG5vdCByZWNlaXZlZCBhbnl0aGluZyBlYXJsaWVyICovCisgIG0gPSBkYnVzX21lc3NhZ2VfbmV3X3NpZ25hbCAoIi9mb28iLCAiY29tLmV4YW1wbGUuQ2Fubm90QnJvYWRjYXN0IiwKKyAgICAgICJDYW5ub3RCcm9hZGNhc3QiKTsKKyAgaWYgKCFkYnVzX21lc3NhZ2Vfc2V0X2Rlc3RpbmF0aW9uIChtLCBmLT5yZWNpcGllbnRfbmFtZSkpCisgICAgZ19lcnJvciAoIk9PTSIpOworICBkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoZi0+c2VuZGVyLCBtLCBOVUxMKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtKTsKKyAgbSA9IGRidXNfbWVzc2FnZV9uZXdfc2lnbmFsICgiL2ZvbyIsICJjb20uZXhhbXBsZS5DYW5ub3RCcm9hZGNhc3QyIiwKKyAgICAgICJDYW5ub3RCcm9hZGNhc3QyIik7CisgIGlmICghZGJ1c19tZXNzYWdlX3NldF9kZXN0aW5hdGlvbiAobSwgZi0+cmVjaXBpZW50X25hbWUpKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKyAgZGJ1c19jb25uZWN0aW9uX3NlbmQgKGYtPnNlbmRlciwgbSwgTlVMTCk7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisKKyAgd2hpbGUgKGdfcXVldWVfZ2V0X2xlbmd0aCAoJmYtPm1vbml0b3JlZCkgPCAxMikKKyAgICB0ZXN0X21haW5fY29udGV4dF9pdGVyYXRlIChmLT5jdHgsIFRSVUUpOworCisgIG0gPSBnX3F1ZXVlX3BvcF9oZWFkICgmZi0+bW9uaXRvcmVkKTsKKyAgYXNzZXJ0X3NpZ25hbCAobSwgZi0+c2VuZGVyX25hbWUsICIvZm9vIiwKKyAgICAgICJjb20uZXhhbXBsZS5DYW5ub3RTZW5kIiwgIlVuaWNhc3RTaWduYWwxIiwgIiIsIGYtPnJlY2lwaWVudF9uYW1lKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtKTsKKworICBtID0gZ19xdWV1ZV9wb3BfaGVhZCAoJmYtPm1vbml0b3JlZCk7CisgIGFzc2VydF9lcnJvcl9yZXBseSAobSwgREJVU19TRVJWSUNFX0RCVVMsIGYtPnNlbmRlcl9uYW1lLAorICAgICAgREJVU19FUlJPUl9BQ0NFU1NfREVOSUVEKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtKTsKKworICBtID0gZ19xdWV1ZV9wb3BfaGVhZCAoJmYtPm1vbml0b3JlZCk7CisgIGFzc2VydF9zaWduYWwgKG0sIGYtPnNlbmRlcl9uYW1lLCAiL2ZvbyIsCisgICAgICAiY29tLmV4YW1wbGUuQ2Fubm90UmVjZWl2ZSIsICJVbmljYXN0U2lnbmFsMiIsICIiLCBmLT5yZWNpcGllbnRfbmFtZSk7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisKKyAgbSA9IGdfcXVldWVfcG9wX2hlYWQgKCZmLT5tb25pdG9yZWQpOworICBhc3NlcnRfZXJyb3JfcmVwbHkgKG0sIERCVVNfU0VSVklDRV9EQlVTLCBmLT5zZW5kZXJfbmFtZSwKKyAgICAgIERCVVNfRVJST1JfQUNDRVNTX0RFTklFRCk7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisKKyAgbSA9IGdfcXVldWVfcG9wX2hlYWQgKCZmLT5tb25pdG9yZWQpOworICBhc3NlcnRfc2lnbmFsIChtLCBmLT5zZW5kZXJfbmFtZSwgIi9mb28iLAorICAgICAgImNvbS5leGFtcGxlLkNhbm5vdFNlbmQiLCAiVW5pY2FzdFNpZ25hbDMiLCAiIiwgZi0+cmVjaXBpZW50X25hbWUpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworCisgIG0gPSBnX3F1ZXVlX3BvcF9oZWFkICgmZi0+bW9uaXRvcmVkKTsKKyAgYXNzZXJ0X2Vycm9yX3JlcGx5IChtLCBEQlVTX1NFUlZJQ0VfREJVUywgZi0+c2VuZGVyX25hbWUsCisgICAgICBEQlVTX0VSUk9SX0FDQ0VTU19ERU5JRUQpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworCisgIG0gPSBnX3F1ZXVlX3BvcF9oZWFkICgmZi0+bW9uaXRvcmVkKTsKKyAgYXNzZXJ0X3NpZ25hbCAobSwgZi0+c2VuZGVyX25hbWUsICIvZm9vIiwgImNvbS5leGFtcGxlLkNhbm5vdFVuaWNhc3QiLAorICAgICAgIkNhbm5vdFVuaWNhc3QiLCAiIiwgZi0+cmVjaXBpZW50X25hbWUpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworCisgIG0gPSBnX3F1ZXVlX3BvcF9oZWFkICgmZi0+bW9uaXRvcmVkKTsKKyAgYXNzZXJ0X2Vycm9yX3JlcGx5IChtLCBEQlVTX1NFUlZJQ0VfREJVUywgZi0+c2VuZGVyX25hbWUsCisgICAgICBEQlVTX0VSUk9SX0FDQ0VTU19ERU5JRUQpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworCisgIG0gPSBnX3F1ZXVlX3BvcF9oZWFkICgmZi0+bW9uaXRvcmVkKTsKKyAgYXNzZXJ0X3NpZ25hbCAobSwgZi0+c2VuZGVyX25hbWUsICIvZm9vIiwgImNvbS5leGFtcGxlLkNhbm5vdFVuaWNhc3QyIiwKKyAgICAgICJDYW5ub3RVbmljYXN0MiIsICIiLCBmLT5yZWNpcGllbnRfbmFtZSk7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisKKyAgbSA9IGdfcXVldWVfcG9wX2hlYWQgKCZmLT5tb25pdG9yZWQpOworICBhc3NlcnRfZXJyb3JfcmVwbHkgKG0sIERCVVNfU0VSVklDRV9EQlVTLCBmLT5zZW5kZXJfbmFtZSwKKyAgICAgIERCVVNfRVJST1JfQUNDRVNTX0RFTklFRCk7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisKKyAgbSA9IGdfcXVldWVfcG9wX2hlYWQgKCZmLT5tb25pdG9yZWQpOworICBhc3NlcnRfc2lnbmFsIChtLCBmLT5zZW5kZXJfbmFtZSwgIi9mb28iLCAiY29tLmV4YW1wbGUuQ2Fubm90QnJvYWRjYXN0IiwKKyAgICAgICJDYW5ub3RCcm9hZGNhc3QiLCAiIiwgZi0+cmVjaXBpZW50X25hbWUpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworCisgIG0gPSBnX3F1ZXVlX3BvcF9oZWFkICgmZi0+bW9uaXRvcmVkKTsKKyAgYXNzZXJ0X3NpZ25hbCAobSwgZi0+c2VuZGVyX25hbWUsICIvZm9vIiwgImNvbS5leGFtcGxlLkNhbm5vdEJyb2FkY2FzdDIiLAorICAgICAgIkNhbm5vdEJyb2FkY2FzdDIiLCAiIiwgZi0+cmVjaXBpZW50X25hbWUpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworCisgIG0gPSBnX3F1ZXVlX3BvcF9oZWFkICgmZi0+bW9uaXRvcmVkKTsKKyAgZ19hc3NlcnQgKG0gPT0gTlVMTCk7CisKKyAgLyogdGhlIGludGVuZGVkIHJlY2lwaWVudCBvbmx5IHJlY2VpdmVkIHRoZSBvbmVzIHRoYXQgd2VyZSBvbiB0aGUgaW50ZXJmYWNlCisgICAqIHdoZXJlIHVuaWNhc3RzIGFyZSBhbGxvd2VkICovCisKKyAgd2hpbGUgKGdfcXVldWVfZ2V0X2xlbmd0aCAoJmYtPnJlY2VpdmVkKSA8IDIpCisgICAgdGVzdF9tYWluX2NvbnRleHRfaXRlcmF0ZSAoZi0+Y3R4LCBUUlVFKTsKKworICBtID0gZ19xdWV1ZV9wb3BfaGVhZCAoJmYtPnJlY2VpdmVkKTsKKyAgYXNzZXJ0X3NpZ25hbCAobSwgZi0+c2VuZGVyX25hbWUsICIvZm9vIiwgImNvbS5leGFtcGxlLkNhbm5vdEJyb2FkY2FzdCIsCisgICAgICAiQ2Fubm90QnJvYWRjYXN0IiwgIiIsIGYtPnJlY2lwaWVudF9uYW1lKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtKTsKKworICBtID0gZ19xdWV1ZV9wb3BfaGVhZCAoJmYtPnJlY2VpdmVkKTsKKyAgYXNzZXJ0X3NpZ25hbCAobSwgZi0+c2VuZGVyX25hbWUsICIvZm9vIiwgImNvbS5leGFtcGxlLkNhbm5vdEJyb2FkY2FzdDIiLAorICAgICAgIkNhbm5vdEJyb2FkY2FzdDIiLCAiIiwgZi0+cmVjaXBpZW50X25hbWUpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworCisgIG0gPSBnX3F1ZXVlX3BvcF9oZWFkICgmZi0+cmVjZWl2ZWQpOworICBnX2Fzc2VydCAobSA9PSBOVUxMKTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfbWV0aG9kX2NhbGwgKEZpeHR1cmUgKmYsCisgICAgZ2NvbnN0cG9pbnRlciBjb250ZXh0KQoreworICBEQnVzTWVzc2FnZSAqbTsKKworICBpZiAoZi0+YWRkcmVzcyA9PSBOVUxMKQorICAgIHJldHVybjsKKworICBiZWNvbWVfbW9uaXRvciAoZiwgTlVMTCk7CisKKyAgLyogcmVncmVzc2lvbiB0ZXN0IGZvcgorICAgKiBodHRwczovL2J1Z3MuZnJlZWRlc2t0b3Aub3JnL3Nob3dfYnVnLmNnaT9pZD05MDk1MiAqLworICBtID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoZi0+cmVjaXBpZW50X25hbWUsICIvZm9vIiwKKyAgICAgIERCVVNfSU5URVJGQUNFX1BFRVIsICJQaW5nIik7CisgIGRidXNfY29ubmVjdGlvbl9zZW5kIChmLT5zZW5kZXIsIG0sIE5VTEwpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworCisgIHdoaWxlIChnX3F1ZXVlX2dldF9sZW5ndGggKCZmLT5tb25pdG9yZWQpIDwgMikKKyAgICB0ZXN0X21haW5fY29udGV4dF9pdGVyYXRlIChmLT5jdHgsIFRSVUUpOworCisgIG0gPSBnX3F1ZXVlX3BvcF9oZWFkICgmZi0+bW9uaXRvcmVkKTsKKyAgYXNzZXJ0X21ldGhvZF9jYWxsIChtLCBmLT5zZW5kZXJfbmFtZSwgZi0+cmVjaXBpZW50X25hbWUsICIvZm9vIiwKKyAgICAgIERCVVNfSU5URVJGQUNFX1BFRVIsICJQaW5nIiwgIiIpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworCisgIG0gPSBnX3F1ZXVlX3BvcF9oZWFkICgmZi0+bW9uaXRvcmVkKTsKKyAgYXNzZXJ0X21ldGhvZF9yZXBseSAobSwgZi0+cmVjaXBpZW50X25hbWUsIGYtPnNlbmRlcl9uYW1lLCAiIik7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisKKyAgbSA9IGdfcXVldWVfcG9wX2hlYWQgKCZmLT5tb25pdG9yZWQpOworICBnX2Fzc2VydCAobSA9PSBOVUxMKTsKKworICBtID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoZi0+cmVjaXBpZW50X25hbWUsICIvZm9vIiwgImNvbS5leGFtcGxlLmJhciIsCisgICAgICAiQ2FsbDEiKTsKKyAgZGJ1c19jb25uZWN0aW9uX3NlbmQgKGYtPnNlbmRlciwgbSwgTlVMTCk7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisKKyAgd2hpbGUgKGdfcXVldWVfZ2V0X2xlbmd0aCAoJmYtPm1vbml0b3JlZCkgPCAyKQorICAgIHRlc3RfbWFpbl9jb250ZXh0X2l0ZXJhdGUgKGYtPmN0eCwgVFJVRSk7CisKKyAgbSA9IGdfcXVldWVfcG9wX2hlYWQgKCZmLT5tb25pdG9yZWQpOworICBhc3NlcnRfbWV0aG9kX2NhbGwgKG0sIGYtPnNlbmRlcl9uYW1lLCBmLT5yZWNpcGllbnRfbmFtZSwgIi9mb28iLAorICAgICAgImNvbS5leGFtcGxlLmJhciIsICJDYWxsMSIsICIiKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtKTsKKworICBtID0gZ19xdWV1ZV9wb3BfaGVhZCAoJmYtPm1vbml0b3JlZCk7CisgIGFzc2VydF9lcnJvcl9yZXBseSAobSwgZi0+cmVjaXBpZW50X25hbWUsIGYtPnNlbmRlcl9uYW1lLAorICAgICAgREJVU19FUlJPUl9VTktOT1dOX01FVEhPRCk7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisKKyAgbSA9IGdfcXVldWVfcG9wX2hlYWQgKCZmLT5tb25pdG9yZWQpOworICBnX2Fzc2VydCAobSA9PSBOVUxMKTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfZm9yYmlkZGVuX21ldGhvZF9jYWxsIChGaXh0dXJlICpmLAorICAgIGdjb25zdHBvaW50ZXIgY29udGV4dCkKK3sKKyAgREJ1c01lc3NhZ2UgKm07CisKKyAgaWYgKGYtPmFkZHJlc3MgPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAgYmVjb21lX21vbml0b3IgKGYsIE5VTEwpOworCisgIG0gPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsIChmLT5yZWNpcGllbnRfbmFtZSwgIi9mb28iLAorICAgICAgImNvbS5leGFtcGxlLkNhbm5vdFNlbmQiLCAiQ2FsbDEiKTsKKyAgZGJ1c19jb25uZWN0aW9uX3NlbmQgKGYtPnNlbmRlciwgbSwgTlVMTCk7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisKKyAgd2hpbGUgKGdfcXVldWVfZ2V0X2xlbmd0aCAoJmYtPm1vbml0b3JlZCkgPCAyKQorICAgIHRlc3RfbWFpbl9jb250ZXh0X2l0ZXJhdGUgKGYtPmN0eCwgVFJVRSk7CisKKyAgbSA9IGdfcXVldWVfcG9wX2hlYWQgKCZmLT5tb25pdG9yZWQpOworICBhc3NlcnRfbWV0aG9kX2NhbGwgKG0sIGYtPnNlbmRlcl9uYW1lLCBmLT5yZWNpcGllbnRfbmFtZSwgIi9mb28iLAorICAgICAgImNvbS5leGFtcGxlLkNhbm5vdFNlbmQiLCAiQ2FsbDEiLCAiIik7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisKKyAgbSA9IGdfcXVldWVfcG9wX2hlYWQgKCZmLT5tb25pdG9yZWQpOworICBhc3NlcnRfZXJyb3JfcmVwbHkgKG0sIERCVVNfU0VSVklDRV9EQlVTLCBmLT5zZW5kZXJfbmFtZSwKKyAgICAgIERCVVNfRVJST1JfQUNDRVNTX0RFTklFRCk7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisKKyAgbSA9IGdfcXVldWVfcG9wX2hlYWQgKCZmLT5tb25pdG9yZWQpOworICBnX2Fzc2VydCAobSA9PSBOVUxMKTsKKworICBtID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoZi0+cmVjaXBpZW50X25hbWUsICIvZm9vIiwKKyAgICAgICJjb20uZXhhbXBsZS5DYW5ub3RSZWNlaXZlIiwgIkNhbGwyIik7CisgIGRidXNfY29ubmVjdGlvbl9zZW5kIChmLT5zZW5kZXIsIG0sIE5VTEwpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworCisgIHdoaWxlIChnX3F1ZXVlX2dldF9sZW5ndGggKCZmLT5tb25pdG9yZWQpIDwgMikKKyAgICB0ZXN0X21haW5fY29udGV4dF9pdGVyYXRlIChmLT5jdHgsIFRSVUUpOworCisgIG0gPSBnX3F1ZXVlX3BvcF9oZWFkICgmZi0+bW9uaXRvcmVkKTsKKyAgYXNzZXJ0X21ldGhvZF9jYWxsIChtLCBmLT5zZW5kZXJfbmFtZSwgZi0+cmVjaXBpZW50X25hbWUsICIvZm9vIiwKKyAgICAgICJjb20uZXhhbXBsZS5DYW5ub3RSZWNlaXZlIiwgIkNhbGwyIiwgIiIpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworCisgIG0gPSBnX3F1ZXVlX3BvcF9oZWFkICgmZi0+bW9uaXRvcmVkKTsKKyAgYXNzZXJ0X2Vycm9yX3JlcGx5IChtLCBEQlVTX1NFUlZJQ0VfREJVUywgZi0+c2VuZGVyX25hbWUsCisgICAgICBEQlVTX0VSUk9SX0FDQ0VTU19ERU5JRUQpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworCisgIG0gPSBnX3F1ZXVlX3BvcF9oZWFkICgmZi0+bW9uaXRvcmVkKTsKKyAgZ19hc3NlcnQgKG0gPT0gTlVMTCk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X2RidXNfZGFlbW9uIChGaXh0dXJlICpmLAorICAgIGdjb25zdHBvaW50ZXIgY29udGV4dCkKK3sKKyAgREJ1c01lc3NhZ2UgKm07CisgIGludCByZXM7CisKKyAgaWYgKGYtPmFkZHJlc3MgPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAgYmVjb21lX21vbml0b3IgKGYsIE5VTEwpOworCisgIHJlcyA9IGRidXNfYnVzX3JlcXVlc3RfbmFtZSAoZi0+c2VuZGVyLCAiY29tLmV4YW1wbGUuU2VuZGVyIiwKKyAgICAgIERCVVNfTkFNRV9GTEFHX0RPX05PVF9RVUVVRSwgJmYtPmUpOworICB0ZXN0X2Fzc2VydF9ub19lcnJvciAoJmYtPmUpOworICBnX2Fzc2VydF9jbXBpbnQgKHJlcywgPT0sIERCVVNfUkVRVUVTVF9OQU1FX1JFUExZX1BSSU1BUllfT1dORVIpOworCisgIHJlcyA9IGRidXNfYnVzX3JlbGVhc2VfbmFtZSAoZi0+c2VuZGVyLCAiY29tLmV4YW1wbGUuU2VuZGVyIiwgJmYtPmUpOworICB0ZXN0X2Fzc2VydF9ub19lcnJvciAoJmYtPmUpOworICBnX2Fzc2VydF9jbXBpbnQgKHJlcywgPT0sIERCVVNfUkVMRUFTRV9OQU1FX1JFUExZX1JFTEVBU0VEKTsKKworICB3aGlsZSAoZ19xdWV1ZV9nZXRfbGVuZ3RoICgmZi0+bW9uaXRvcmVkKSA8IDgpCisgICAgdGVzdF9tYWluX2NvbnRleHRfaXRlcmF0ZSAoZi0+Y3R4LCBUUlVFKTsKKworICBtID0gZ19xdWV1ZV9wb3BfaGVhZCAoJmYtPm1vbml0b3JlZCk7CisgIGFzc2VydF9tZXRob2RfY2FsbCAobSwgZi0+c2VuZGVyX25hbWUsIERCVVNfU0VSVklDRV9EQlVTLCBEQlVTX1BBVEhfREJVUywKKyAgICAgIERCVVNfSU5URVJGQUNFX0RCVVMsICJSZXF1ZXN0TmFtZSIsICJzdSIpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworCisgIG0gPSBnX3F1ZXVlX3BvcF9oZWFkICgmZi0+bW9uaXRvcmVkKTsKKyAgYXNzZXJ0X3NpZ25hbCAobSwgREJVU19TRVJWSUNFX0RCVVMsIERCVVNfUEFUSF9EQlVTLCBEQlVTX0lOVEVSRkFDRV9EQlVTLAorICAgICAgIk5hbWVPd25lckNoYW5nZWQiLCAic3NzIiwgTlVMTCk7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisKKyAgLyogRklYTUU6IHNob3VsZCB3ZSBnZXQgdGhpcz8gKi8KKyAgbSA9IGdfcXVldWVfcG9wX2hlYWQgKCZmLT5tb25pdG9yZWQpOworICBhc3NlcnRfc2lnbmFsIChtLCBEQlVTX1NFUlZJQ0VfREJVUywgREJVU19QQVRIX0RCVVMsIERCVVNfSU5URVJGQUNFX0RCVVMsCisgICAgICAiTmFtZUFjcXVpcmVkIiwgInMiLCBmLT5zZW5kZXJfbmFtZSk7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisKKyAgbSA9IGdfcXVldWVfcG9wX2hlYWQgKCZmLT5tb25pdG9yZWQpOworICBhc3NlcnRfbWV0aG9kX3JlcGx5IChtLCBEQlVTX1NFUlZJQ0VfREJVUywgZi0+c2VuZGVyX25hbWUsICJ1Iik7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisKKyAgbSA9IGdfcXVldWVfcG9wX2hlYWQgKCZmLT5tb25pdG9yZWQpOworICBhc3NlcnRfbWV0aG9kX2NhbGwgKG0sIGYtPnNlbmRlcl9uYW1lLCBEQlVTX1NFUlZJQ0VfREJVUywgREJVU19QQVRIX0RCVVMsCisgICAgICBEQlVTX0lOVEVSRkFDRV9EQlVTLCAiUmVsZWFzZU5hbWUiLCAicyIpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworCisgIC8qIEZJWE1FOiBzaG91bGQgd2UgZ2V0IHRoaXM/ICovCisgIG0gPSBnX3F1ZXVlX3BvcF9oZWFkICgmZi0+bW9uaXRvcmVkKTsKKyAgYXNzZXJ0X3NpZ25hbCAobSwgREJVU19TRVJWSUNFX0RCVVMsIERCVVNfUEFUSF9EQlVTLCBEQlVTX0lOVEVSRkFDRV9EQlVTLAorICAgICAgIk5hbWVMb3N0IiwgInMiLCBmLT5zZW5kZXJfbmFtZSk7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisKKyAgbSA9IGdfcXVldWVfcG9wX2hlYWQgKCZmLT5tb25pdG9yZWQpOworICBhc3NlcnRfc2lnbmFsIChtLCBEQlVTX1NFUlZJQ0VfREJVUywgREJVU19QQVRIX0RCVVMsIERCVVNfSU5URVJGQUNFX0RCVVMsCisgICAgICAiTmFtZU93bmVyQ2hhbmdlZCIsICJzc3MiLCBOVUxMKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtKTsKKworICBtID0gZ19xdWV1ZV9wb3BfaGVhZCAoJmYtPm1vbml0b3JlZCk7CisgIGFzc2VydF9tZXRob2RfcmVwbHkgKG0sIERCVVNfU0VSVklDRV9EQlVTLCBmLT5zZW5kZXJfbmFtZSwgInUiKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtKTsKKworICBtID0gZ19xdWV1ZV9wb3BfaGVhZCAoJmYtPm1vbml0b3JlZCk7CisgIGdfYXNzZXJ0IChtID09IE5VTEwpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9zZWxlY3RpdmUgKEZpeHR1cmUgKmYsCisgICAgZ2NvbnN0cG9pbnRlciBjb250ZXh0KQoreworICBEQnVzTWVzc2FnZSAqbTsKKworICBpZiAoZi0+YWRkcmVzcyA9PSBOVUxMKQorICAgIHJldHVybjsKKworICAvKiBNYXRjaCBydWxlcyBhZGRlZCBiZWZvcmUgYmVjb21pbmcgYSBtb25pdG9yIHNob3VsZCBiZSBjbGVhcmVkOgorICAgKiBpZiB0aGV5IHdlcmVuJ3QsIHRoaXMgdGVzdCB3b3VsZCBnZXQgSW50ZXJlc3RpbmcgdHdpY2UsIHRoZW4gVGVkaW91cywKKyAgICogYW5kIG9ubHkgc2VlIEZ1biBhZnRlciB0aGF0LiAqLworICBkYnVzX2J1c19hZGRfbWF0Y2ggKGYtPm1vbml0b3IsCisgICAgICAiZWF2ZXNkcm9wPSd0cnVlJyxpbnRlcmZhY2U9J2NvbS5leGFtcGxlLkludGVyZXN0aW5nJyIsICZmLT5lKTsKKyAgdGVzdF9hc3NlcnRfbm9fZXJyb3IgKCZmLT5lKTsKKyAgZGJ1c19idXNfYWRkX21hdGNoIChmLT5tb25pdG9yLAorICAgICAgImVhdmVzZHJvcD0ndHJ1ZScsaW50ZXJmYWNlPSdjb20uZXhhbXBsZS5UZWRpb3VzJyIsICZmLT5lKTsKKyAgdGVzdF9hc3NlcnRfbm9fZXJyb3IgKCZmLT5lKTsKKworICBiZWNvbWVfbW9uaXRvciAoZiwgTlVMTCk7CisKKyAgbSA9IGRidXNfbWVzc2FnZV9uZXdfc2lnbmFsICgiL2ZvbyIsICJjb20uZXhhbXBsZS5JbnRlcmVzdGluZyIsCisgICAgICAiVW5pY2FzdFNpZ25hbDEiKTsKKyAgaWYgKCFkYnVzX21lc3NhZ2Vfc2V0X2Rlc3RpbmF0aW9uIChtLCBmLT5yZWNpcGllbnRfbmFtZSkpCisgICAgZ19lcnJvciAoIk9PTSIpOworICBkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoZi0+c2VuZGVyLCBtLCBOVUxMKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtKTsKKworICBtID0gZGJ1c19tZXNzYWdlX25ld19zaWduYWwgKCIvZm9vIiwgImNvbS5leGFtcGxlLlRlZGlvdXMiLAorICAgICAgIlVuaWNhc3RTaWduYWwyIik7CisgIGlmICghZGJ1c19tZXNzYWdlX3NldF9kZXN0aW5hdGlvbiAobSwgZi0+cmVjaXBpZW50X25hbWUpKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKyAgZGJ1c19jb25uZWN0aW9uX3NlbmQgKGYtPnNlbmRlciwgbSwgTlVMTCk7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisKKyAgbSA9IGRidXNfbWVzc2FnZV9uZXdfc2lnbmFsICgiL2ZvbyIsICJjb20uZXhhbXBsZS5GdW4iLAorICAgICAgIlVuaWNhc3RTaWduYWwzIik7CisgIGlmICghZGJ1c19tZXNzYWdlX3NldF9kZXN0aW5hdGlvbiAobSwgZi0+cmVjaXBpZW50X25hbWUpKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKyAgZGJ1c19jb25uZWN0aW9uX3NlbmQgKGYtPnNlbmRlciwgbSwgTlVMTCk7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisKKyAgd2hpbGUgKGdfcXVldWVfZ2V0X2xlbmd0aCAoJmYtPm1vbml0b3JlZCkgPCAyKQorICAgIHRlc3RfbWFpbl9jb250ZXh0X2l0ZXJhdGUgKGYtPmN0eCwgVFJVRSk7CisKKyAgLyogV2UgZ2V0IHRoZSBpbnRlcmVzdGluZyBzaWduYWwgYW5kIHRoZSBmdW4gc2lnbmFsLCBidXQgbm90IHRoZSB0ZWRpb3VzCisgICAqIHNpZ25hbC4gKi8KKworICBtID0gZ19xdWV1ZV9wb3BfaGVhZCAoJmYtPm1vbml0b3JlZCk7CisgIGFzc2VydF9zaWduYWwgKG0sIGYtPnNlbmRlcl9uYW1lLCAiL2ZvbyIsCisgICAgICAiY29tLmV4YW1wbGUuSW50ZXJlc3RpbmciLCAiVW5pY2FzdFNpZ25hbDEiLCAiIiwgZi0+cmVjaXBpZW50X25hbWUpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworCisgIG0gPSBnX3F1ZXVlX3BvcF9oZWFkICgmZi0+bW9uaXRvcmVkKTsKKyAgYXNzZXJ0X3NpZ25hbCAobSwgZi0+c2VuZGVyX25hbWUsICIvZm9vIiwKKyAgICAgICJjb20uZXhhbXBsZS5GdW4iLCAiVW5pY2FzdFNpZ25hbDMiLCAiIiwgZi0+cmVjaXBpZW50X25hbWUpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworCisgIG0gPSBnX3F1ZXVlX3BvcF9oZWFkICgmZi0+bW9uaXRvcmVkKTsKKyAgZ19hc3NlcnQgKG0gPT0gTlVMTCk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3dlbGxfa25vd25fZGVzdGluYXRpb24gKEZpeHR1cmUgKmYsCisgICAgZ2NvbnN0cG9pbnRlciBjb250ZXh0KQoreworICBEQnVzTWVzc2FnZSAqbTsKKworICBpZiAoZi0+YWRkcmVzcyA9PSBOVUxMKQorICAgIHJldHVybjsKKworICB0YWtlX3dlbGxfa25vd25fbmFtZSAoZiwgZi0+cmVjaXBpZW50LCAiY29tLmV4YW1wbGUuUmVjaXBpZW50Iik7CisgIC8qIHdlIGRvbid0IGV4cGVjdF90YWtlX3dlbGxfa25vd25fbmFtZSBoZXJlIGJlY2F1c2UgdGhlCisgICAqIG1vbml0b3IgaXNuJ3QgdXAgeWV0ICovCisKKyAgYmVjb21lX21vbml0b3IgKGYsIE5VTEwpOworCisgIC8qIFRoZSBzZW5kZXIgc2VuZHMgYSBtZXNzYWdlIHRvIGl0c2VsZi4gSXQgd2lsbCBub3QgYmUgb2JzZXJ2ZWQuICovCisgIG0gPSBkYnVzX21lc3NhZ2VfbmV3X3NpZ25hbCAoIi9mb28iLCAiY29tLmV4YW1wbGUuYmFyIiwgIlVub2JzZXJ2ZWQiKTsKKyAgaWYgKCFkYnVzX21lc3NhZ2Vfc2V0X2Rlc3RpbmF0aW9uIChtLCBmLT5zZW5kZXJfbmFtZSkpCisgICAgZ19lcnJvciAoIk9PTSIpOworICBkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoZi0+c2VuZGVyLCBtLCBOVUxMKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtKTsKKworICAvKiBUaGUgc2VuZGVyIHNlbmRzIGEgbWVzc2FnZSB0byB0aGUgcmVjaXBpZW50IGJ5IHdlbGwta25vd24gbmFtZS4KKyAgICogSXQgd2lsbCBiZSBvYnNlcnZlZC4gKi8KKyAgbSA9IGRidXNfbWVzc2FnZV9uZXdfc2lnbmFsICgiL2ZvbyIsICJjb20uZXhhbXBsZS5iYXIiLCAiT2JzZXJ2ZWQxIik7CisgIGlmICghZGJ1c19tZXNzYWdlX3NldF9kZXN0aW5hdGlvbiAobSwgImNvbS5leGFtcGxlLlJlY2lwaWVudCIpKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKyAgZGJ1c19jb25uZWN0aW9uX3NlbmQgKGYtPnNlbmRlciwgbSwgTlVMTCk7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisKKyAgLyogVGhlIHNlbmRlciBzZW5kcyBhIG1lc3NhZ2UgdG8gdGhlIHJlY2lwaWVudCBieSB1bmlxdWUgbmFtZS4KKyAgICogSXQgd2lsbCBzdGlsbCBiZSBvYnNlcnZlZC4gKi8KKyAgbSA9IGRidXNfbWVzc2FnZV9uZXdfc2lnbmFsICgiL2ZvbyIsICJjb20uZXhhbXBsZS5iYXIiLCAiT2JzZXJ2ZWQyIik7CisgIGlmICghZGJ1c19tZXNzYWdlX3NldF9kZXN0aW5hdGlvbiAobSwgZi0+cmVjaXBpZW50X25hbWUpKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKyAgZGJ1c19jb25uZWN0aW9uX3NlbmQgKGYtPnNlbmRlciwgbSwgTlVMTCk7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisKKyAgd2hpbGUgKGdfcXVldWVfZ2V0X2xlbmd0aCAoJmYtPm1vbml0b3JlZCkgPCAyKQorICAgIHRlc3RfbWFpbl9jb250ZXh0X2l0ZXJhdGUgKGYtPmN0eCwgVFJVRSk7CisKKyAgbSA9IGdfcXVldWVfcG9wX2hlYWQgKCZmLT5tb25pdG9yZWQpOworICBhc3NlcnRfc2lnbmFsIChtLCBmLT5zZW5kZXJfbmFtZSwgIi9mb28iLCAiY29tLmV4YW1wbGUuYmFyIiwKKyAgICAgICJPYnNlcnZlZDEiLCAiIiwgImNvbS5leGFtcGxlLlJlY2lwaWVudCIpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworCisgIG0gPSBnX3F1ZXVlX3BvcF9oZWFkICgmZi0+bW9uaXRvcmVkKTsKKyAgYXNzZXJ0X3NpZ25hbCAobSwgZi0+c2VuZGVyX25hbWUsICIvZm9vIiwgImNvbS5leGFtcGxlLmJhciIsCisgICAgICAiT2JzZXJ2ZWQyIiwgIiIsIGYtPnJlY2lwaWVudF9uYW1lKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtKTsKKworICBtID0gZ19xdWV1ZV9wb3BfaGVhZCAoJmYtPm1vbml0b3JlZCk7CisgIGdfYXNzZXJ0IChtID09IE5VTEwpOworfQorCitzdGF0aWMgdm9pZAordGVzdF91bmlxdWVfZGVzdGluYXRpb24gKEZpeHR1cmUgKmYsCisgICAgZ2NvbnN0cG9pbnRlciBjb250ZXh0KQoreworICBEQnVzTWVzc2FnZSAqbTsKKyAgQ29uZmlnIGNvbmZpZyA9IHsKKyAgICBOVUxMLAorICAgIE5VTEwsIC8qIG1hdGNoIHJ1bGVzICovCisgICAgRkFMU0UKKyAgfTsKKyAgY29uc3QgZ2NoYXIgKm1hdGNoX3J1bGVzWzJdID0geyBOVUxMLCBOVUxMIH07CisgIGdjaGFyICpydWxlOworCisgIGlmIChmLT5hZGRyZXNzID09IE5VTEwpCisgICAgcmV0dXJuOworCisgIHRha2Vfd2VsbF9rbm93bl9uYW1lIChmLCBmLT5yZWNpcGllbnQsICJjb20uZXhhbXBsZS5SZWNpcGllbnQiKTsKKyAgLyogd2UgZG9uJ3QgZXhwZWN0X3Rha2Vfd2VsbF9rbm93bl9uYW1lIGhlcmUgYmVjYXVzZSB0aGUKKyAgICogbW9uaXRvciBpc24ndCB1cCB5ZXQgKi8KKworICBydWxlID0gZ19zdHJkdXBfcHJpbnRmICgiZGVzdGluYXRpb249JyVzJyIsIGYtPnJlY2lwaWVudF9uYW1lKTsKKyAgLyogZnJlZSBpdCBsYXRlciAqLworICBnX3Rlc3RfcXVldWVfZnJlZSAocnVsZSk7CisgIG1hdGNoX3J1bGVzWzBdID0gcnVsZTsKKyAgY29uZmlnLm1hdGNoX3J1bGVzID0gbWF0Y2hfcnVsZXM7CisKKyAgYmVjb21lX21vbml0b3IgKGYsICZjb25maWcpOworCisgIC8qIFRoZSBzZW5kZXIgc2VuZHMgYSBtZXNzYWdlIHRvIGl0c2VsZi4gSXQgd2lsbCBub3QgYmUgb2JzZXJ2ZWQuICovCisgIG0gPSBkYnVzX21lc3NhZ2VfbmV3X3NpZ25hbCAoIi9mb28iLCAiY29tLmV4YW1wbGUuYmFyIiwgIlVub2JzZXJ2ZWQiKTsKKyAgaWYgKCFkYnVzX21lc3NhZ2Vfc2V0X2Rlc3RpbmF0aW9uIChtLCBmLT5zZW5kZXJfbmFtZSkpCisgICAgZ19lcnJvciAoIk9PTSIpOworICBkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoZi0+c2VuZGVyLCBtLCBOVUxMKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtKTsKKworICAvKiBUaGUgc2VuZGVyIHNlbmRzIGEgbWVzc2FnZSB0byB0aGUgcmVjaXBpZW50IGJ5IHdlbGwta25vd24gbmFtZS4KKyAgICogSXQgd2lsbCBiZSBvYnNlcnZlZC4gKi8KKyAgbSA9IGRidXNfbWVzc2FnZV9uZXdfc2lnbmFsICgiL2ZvbyIsICJjb20uZXhhbXBsZS5iYXIiLCAiT2JzZXJ2ZWQxIik7CisgIGlmICghZGJ1c19tZXNzYWdlX3NldF9kZXN0aW5hdGlvbiAobSwgImNvbS5leGFtcGxlLlJlY2lwaWVudCIpKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKyAgZGJ1c19jb25uZWN0aW9uX3NlbmQgKGYtPnNlbmRlciwgbSwgTlVMTCk7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisKKyAgLyogVGhlIHNlbmRlciBzZW5kcyBhIG1lc3NhZ2UgdG8gdGhlIHJlY2lwaWVudCBieSB1bmlxdWUgbmFtZS4KKyAgICogSXQgd2lsbCBzdGlsbCBiZSBvYnNlcnZlZC4gKi8KKyAgbSA9IGRidXNfbWVzc2FnZV9uZXdfc2lnbmFsICgiL2ZvbyIsICJjb20uZXhhbXBsZS5iYXIiLCAiT2JzZXJ2ZWQyIik7CisgIGlmICghZGJ1c19tZXNzYWdlX3NldF9kZXN0aW5hdGlvbiAobSwgZi0+cmVjaXBpZW50X25hbWUpKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKyAgZGJ1c19jb25uZWN0aW9uX3NlbmQgKGYtPnNlbmRlciwgbSwgTlVMTCk7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisKKyAgd2hpbGUgKGdfcXVldWVfZ2V0X2xlbmd0aCAoJmYtPm1vbml0b3JlZCkgPCAyKQorICAgIHRlc3RfbWFpbl9jb250ZXh0X2l0ZXJhdGUgKGYtPmN0eCwgVFJVRSk7CisKKyAgbSA9IGdfcXVldWVfcG9wX2hlYWQgKCZmLT5tb25pdG9yZWQpOworICBhc3NlcnRfc2lnbmFsIChtLCBmLT5zZW5kZXJfbmFtZSwgIi9mb28iLCAiY29tLmV4YW1wbGUuYmFyIiwKKyAgICAgICJPYnNlcnZlZDEiLCAiIiwgImNvbS5leGFtcGxlLlJlY2lwaWVudCIpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworCisgIG0gPSBnX3F1ZXVlX3BvcF9oZWFkICgmZi0+bW9uaXRvcmVkKTsKKyAgYXNzZXJ0X3NpZ25hbCAobSwgZi0+c2VuZGVyX25hbWUsICIvZm9vIiwgImNvbS5leGFtcGxlLmJhciIsCisgICAgICAiT2JzZXJ2ZWQyIiwgIiIsIGYtPnJlY2lwaWVudF9uYW1lKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtKTsKKworICBtID0gZ19xdWV1ZV9wb3BfaGVhZCAoJmYtPm1vbml0b3JlZCk7CisgIGdfYXNzZXJ0IChtID09IE5VTEwpOworfQorCisjaWZkZWYgREJVU19VTklYCisvKiBjdXJyZW50bHkgb25seSB1c2VkIGZvciB0aGUgc3lzdGVtZCBhY3RpdmF0aW9uIHRlc3QgKi8KK3N0YXRpYyB2b2lkCitleHBlY3RfbmV3X2Nvbm5lY3Rpb24gKEZpeHR1cmUgKmYpCit7CisgIERCdXNNZXNzYWdlICptOworCisgIHdoaWxlIChnX3F1ZXVlX2dldF9sZW5ndGggKCZmLT5tb25pdG9yZWQpIDwgNCkKKyAgICB0ZXN0X21haW5fY29udGV4dF9pdGVyYXRlIChmLT5jdHgsIFRSVUUpOworCisgIG0gPSBnX3F1ZXVlX3BvcF9oZWFkICgmZi0+bW9uaXRvcmVkKTsKKyAgYXNzZXJ0X2hlbGxvIChtKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtKTsKKworICBtID0gZ19xdWV1ZV9wb3BfaGVhZCAoJmYtPm1vbml0b3JlZCk7CisgIGFzc2VydF9oZWxsb19yZXBseSAobSk7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisKKyAgbSA9IGdfcXVldWVfcG9wX2hlYWQgKCZmLT5tb25pdG9yZWQpOworICBhc3NlcnRfc2lnbmFsIChtLCBEQlVTX1NFUlZJQ0VfREJVUywgREJVU19QQVRIX0RCVVMsIERCVVNfSU5URVJGQUNFX0RCVVMsCisgICAgICAiTmFtZU93bmVyQ2hhbmdlZCIsICJzc3MiLCBOVUxMKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtKTsKKworICBtID0gZ19xdWV1ZV9wb3BfaGVhZCAoJmYtPm1vbml0b3JlZCk7CisgIGFzc2VydF9uYW1lX2FjcXVpcmVkIChtKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtKTsKK30KKworLyogY3VycmVudGx5IG9ubHkgdXNlZCBmb3IgdGhlIHN5c3RlbWQgYWN0aXZhdGlvbiB0ZXN0ICovCitzdGF0aWMgdm9pZAorZXhwZWN0X3Rha2Vfd2VsbF9rbm93bl9uYW1lIChGaXh0dXJlICpmLAorICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgIGNvbnN0IGNoYXIgKm5hbWUpCit7CisgIERCdXNNZXNzYWdlICptOworICBjb25zdCBjaGFyICpjb25uZWN0aW9uX25hbWUgPSBkYnVzX2J1c19nZXRfdW5pcXVlX25hbWUgKGNvbm5lY3Rpb24pOworCisgIHdoaWxlIChnX3F1ZXVlX2dldF9sZW5ndGggKCZmLT5tb25pdG9yZWQpIDwgNCkKKyAgICB0ZXN0X21haW5fY29udGV4dF9pdGVyYXRlIChmLT5jdHgsIFRSVUUpOworCisgIG0gPSBnX3F1ZXVlX3BvcF9oZWFkICgmZi0+bW9uaXRvcmVkKTsKKyAgYXNzZXJ0X21ldGhvZF9jYWxsIChtLCBjb25uZWN0aW9uX25hbWUsIERCVVNfU0VSVklDRV9EQlVTLCBEQlVTX1BBVEhfREJVUywKKyAgICAgIERCVVNfSU5URVJGQUNFX0RCVVMsICJSZXF1ZXN0TmFtZSIsICJzdSIpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworCisgIG0gPSBnX3F1ZXVlX3BvcF9oZWFkICgmZi0+bW9uaXRvcmVkKTsKKyAgYXNzZXJ0X3NpZ25hbCAobSwgREJVU19TRVJWSUNFX0RCVVMsIERCVVNfUEFUSF9EQlVTLCBEQlVTX0lOVEVSRkFDRV9EQlVTLAorICAgICAgIk5hbWVPd25lckNoYW5nZWQiLCAic3NzIiwgTlVMTCk7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisKKyAgbSA9IGdfcXVldWVfcG9wX2hlYWQgKCZmLT5tb25pdG9yZWQpOworICBhc3NlcnRfc2lnbmFsIChtLCBEQlVTX1NFUlZJQ0VfREJVUywgREJVU19QQVRIX0RCVVMsIERCVVNfSU5URVJGQUNFX0RCVVMsCisgICAgICAiTmFtZUFjcXVpcmVkIiwgInMiLCBjb25uZWN0aW9uX25hbWUpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworCisgIG0gPSBnX3F1ZXVlX3BvcF9oZWFkICgmZi0+bW9uaXRvcmVkKTsKKyAgYXNzZXJ0X21ldGhvZF9yZXBseSAobSwgREJVU19TRVJWSUNFX0RCVVMsIGNvbm5lY3Rpb25fbmFtZSwgInUiKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtKTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfYWN0aXZhdGlvbiAoRml4dHVyZSAqZiwKKyAgICBnY29uc3Rwb2ludGVyIGNvbnRleHQpCit7CisgIERCdXNNZXNzYWdlICptOworCisgIGlmIChmLT5hZGRyZXNzID09IE5VTEwpCisgICAgcmV0dXJuOworCisgIGJlY29tZV9tb25pdG9yIChmLCBOVUxMKTsKKworICAvKiBUaGUgc2VuZGVyIHNlbmRzIGEgbWVzc2FnZSB0byBhbiBhY3RpdmF0YWJsZSBzZXJ2aWNlLiAqLworICBtID0gZGJ1c19tZXNzYWdlX25ld19zaWduYWwgKCIvZm9vIiwgImNvbS5leGFtcGxlLmJhciIsICJVbmljYXN0U2lnbmFsMSIpOworICBpZiAoIWRidXNfbWVzc2FnZV9zZXRfZGVzdGluYXRpb24gKG0sICJjb20uZXhhbXBsZS5TeXN0ZW1kQWN0aXZhdGFibGUxIikpCisgICAgZ19lcnJvciAoIk9PTSIpOworICBkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoZi0+c2VuZGVyLCBtLCBOVUxMKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtKTsKKworICAvKiBXZSBvYnNlcnZlIHRoZSBhY3RpdmF0aW9uIHJlcXVlc3QsIGFuZCB0aGUgbWVzc2FnZSB0aGF0IGNhdXNlZCBpdCwKKyAgICogYmVmb3JlIHN5c3RlbWQgaGFzIGV2ZW4gam9pbmVkIHRoZSBidXMuICovCisgIHdoaWxlIChnX3F1ZXVlX2dldF9sZW5ndGggKCZmLT5tb25pdG9yZWQpIDwgMikKKyAgICB0ZXN0X21haW5fY29udGV4dF9pdGVyYXRlIChmLT5jdHgsIFRSVUUpOworCisgIG0gPSBnX3F1ZXVlX3BvcF9oZWFkICgmZi0+bW9uaXRvcmVkKTsKKyAgYXNzZXJ0X3NpZ25hbCAobSwgREJVU19TRVJWSUNFX0RCVVMsIERCVVNfUEFUSF9EQlVTLAorICAgICAgIm9yZy5mcmVlZGVza3RvcC5zeXN0ZW1kMS5BY3RpdmF0b3IiLCAiQWN0aXZhdGlvblJlcXVlc3QiLCAicyIsCisgICAgICAib3JnLmZyZWVkZXNrdG9wLnN5c3RlbWQxIik7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisgIG0gPSBnX3F1ZXVlX3BvcF9oZWFkICgmZi0+bW9uaXRvcmVkKTsKKyAgYXNzZXJ0X3NpZ25hbCAobSwgZi0+c2VuZGVyX25hbWUsICIvZm9vIiwKKyAgICAgICJjb20uZXhhbXBsZS5iYXIiLCAiVW5pY2FzdFNpZ25hbDEiLCAiIiwKKyAgICAgICJjb20uZXhhbXBsZS5TeXN0ZW1kQWN0aXZhdGFibGUxIik7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisKKyAgLyogVGhlIGZha2Ugc3lzdGVtZCBjb25uZWN0cyB0byB0aGUgYnVzLiAqLworICBmLT5zeXN0ZW1kID0gdGVzdF9jb25uZWN0X3RvX2J1cyAoZi0+Y3R4LCBmLT5hZGRyZXNzKTsKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fYWRkX2ZpbHRlciAoZi0+c3lzdGVtZCwgc3lzdGVtZF9maWx0ZXIsIGYsIE5VTEwpKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKyAgZi0+c3lzdGVtZF9uYW1lID0gZGJ1c19idXNfZ2V0X3VuaXF1ZV9uYW1lIChmLT5zeXN0ZW1kKTsKKworICBleHBlY3RfbmV3X2Nvbm5lY3Rpb24gKGYpOworICB0YWtlX3dlbGxfa25vd25fbmFtZSAoZiwgZi0+c3lzdGVtZCwgIm9yZy5mcmVlZGVza3RvcC5zeXN0ZW1kMSIpOworICBleHBlY3RfdGFrZV93ZWxsX2tub3duX25hbWUgKGYsIGYtPnN5c3RlbWQsICJvcmcuZnJlZWRlc2t0b3Auc3lzdGVtZDEiKTsKKworICAvKiBJdCBnZXRzIGl0cyBhY3RpdmF0aW9uIHJlcXVlc3QuICovCisgIHdoaWxlIChmLT5zeXN0ZW1kX21lc3NhZ2UgPT0gTlVMTCkKKyAgICB0ZXN0X21haW5fY29udGV4dF9pdGVyYXRlIChmLT5jdHgsIFRSVUUpOworCisgIG0gPSBmLT5zeXN0ZW1kX21lc3NhZ2U7CisgIGYtPnN5c3RlbWRfbWVzc2FnZSA9IE5VTEw7CisgIGFzc2VydF9zaWduYWwgKG0sIERCVVNfU0VSVklDRV9EQlVTLCBEQlVTX1BBVEhfREJVUywKKyAgICAgICJvcmcuZnJlZWRlc2t0b3Auc3lzdGVtZDEuQWN0aXZhdG9yIiwgIkFjdGl2YXRpb25SZXF1ZXN0IiwgInMiLAorICAgICAgIm9yZy5mcmVlZGVza3RvcC5zeXN0ZW1kMSIpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworCisgIC8qIHN5c3RlbWQgc3RhcnRzIHRoZSBhY3RpdmF0YWJsZSBzZXJ2aWNlLiAqLworICBmLT5hY3RpdmF0ZWQgPSB0ZXN0X2Nvbm5lY3RfdG9fYnVzIChmLT5jdHgsIGYtPmFkZHJlc3MpOworICBpZiAoIWRidXNfY29ubmVjdGlvbl9hZGRfZmlsdGVyIChmLT5hY3RpdmF0ZWQsIGFjdGl2YXRlZF9maWx0ZXIsCisgICAgICAgIGYsIE5VTEwpKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKyAgZi0+YWN0aXZhdGVkX25hbWUgPSBkYnVzX2J1c19nZXRfdW5pcXVlX25hbWUgKGYtPmFjdGl2YXRlZCk7CisKKyAgZXhwZWN0X25ld19jb25uZWN0aW9uIChmKTsKKyAgdGFrZV93ZWxsX2tub3duX25hbWUgKGYsIGYtPmFjdGl2YXRlZCwgImNvbS5leGFtcGxlLlN5c3RlbWRBY3RpdmF0YWJsZTEiKTsKKyAgZXhwZWN0X3Rha2Vfd2VsbF9rbm93bl9uYW1lIChmLCBmLT5hY3RpdmF0ZWQsCisgICAgICAiY29tLmV4YW1wbGUuU3lzdGVtZEFjdGl2YXRhYmxlMSIpOworCisgIC8qIFRoZSBtZXNzYWdlIGlzIGRlbGl2ZXJlZCB0byB0aGUgYWN0aXZhdGFibGUgc2VydmljZS4gKi8KKyAgd2hpbGUgKGYtPmFjdGl2YXRlZF9tZXNzYWdlID09IE5VTEwpCisgICAgdGVzdF9tYWluX2NvbnRleHRfaXRlcmF0ZSAoZi0+Y3R4LCBUUlVFKTsKKworICBtID0gZi0+YWN0aXZhdGVkX21lc3NhZ2U7CisgIGYtPmFjdGl2YXRlZF9tZXNzYWdlID0gTlVMTDsKKyAgYXNzZXJ0X3NpZ25hbCAobSwgZi0+c2VuZGVyX25hbWUsICIvZm9vIiwKKyAgICAgICJjb20uZXhhbXBsZS5iYXIiLCAiVW5pY2FzdFNpZ25hbDEiLCAiIiwKKyAgICAgICJjb20uZXhhbXBsZS5TeXN0ZW1kQWN0aXZhdGFibGUxIik7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisKKyAgLyogVGhlIHNlbmRlciBzZW5kcyBhIG1lc3NhZ2UgdG8gYSBkaWZmZXJlbnQgYWN0aXZhdGFibGUgc2VydmljZS4gKi8KKyAgbSA9IGRidXNfbWVzc2FnZV9uZXdfc2lnbmFsICgiL2ZvbyIsICJjb20uZXhhbXBsZS5iYXIiLCAiVW5pY2FzdFNpZ25hbDIiKTsKKyAgaWYgKCFkYnVzX21lc3NhZ2Vfc2V0X2Rlc3RpbmF0aW9uIChtLCAiY29tLmV4YW1wbGUuU3lzdGVtZEFjdGl2YXRhYmxlMiIpKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKyAgZGJ1c19jb25uZWN0aW9uX3NlbmQgKGYtPnNlbmRlciwgbSwgTlVMTCk7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisKKyAgLyogVGhpcyB0aW1lIHN5c3RlbWQgaXMgYWxyZWFkeSByZWFkeSBmb3IgaXQuICovCisgIHdoaWxlIChnX3F1ZXVlX2dldF9sZW5ndGggKCZmLT5tb25pdG9yZWQpIDwgMiB8fAorICAgICAgZi0+c3lzdGVtZF9tZXNzYWdlID09IE5VTEwpCisgICAgdGVzdF9tYWluX2NvbnRleHRfaXRlcmF0ZSAoZi0+Y3R4LCBUUlVFKTsKKworICBtID0gZi0+c3lzdGVtZF9tZXNzYWdlOworICBmLT5zeXN0ZW1kX21lc3NhZ2UgPSBOVUxMOworICBhc3NlcnRfc2lnbmFsIChtLCBEQlVTX1NFUlZJQ0VfREJVUywgREJVU19QQVRIX0RCVVMsCisgICAgICAib3JnLmZyZWVkZXNrdG9wLnN5c3RlbWQxLkFjdGl2YXRvciIsICJBY3RpdmF0aW9uUmVxdWVzdCIsICJzIiwKKyAgICAgICJvcmcuZnJlZWRlc2t0b3Auc3lzdGVtZDEiKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtKTsKKworICAvKiBUaGUgbW9uaXRvciBzZWVzIHRoZSBhY3RpdmF0aW9uIHJlcXVlc3QgYW5kIHRoZSBzaWduYWwgdGhhdAorICAgKiBwcm9tcHRlZCBpdC4qLworICBtID0gZ19xdWV1ZV9wb3BfaGVhZCAoJmYtPm1vbml0b3JlZCk7CisgIGFzc2VydF9zaWduYWwgKG0sIERCVVNfU0VSVklDRV9EQlVTLCBEQlVTX1BBVEhfREJVUywKKyAgICAgICJvcmcuZnJlZWRlc2t0b3Auc3lzdGVtZDEuQWN0aXZhdG9yIiwgIkFjdGl2YXRpb25SZXF1ZXN0IiwgInMiLAorICAgICAgIm9yZy5mcmVlZGVza3RvcC5zeXN0ZW1kMSIpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworICBtID0gZ19xdWV1ZV9wb3BfaGVhZCAoJmYtPm1vbml0b3JlZCk7CisgIGFzc2VydF9zaWduYWwgKG0sIGYtPnNlbmRlcl9uYW1lLCAiL2ZvbyIsCisgICAgICAiY29tLmV4YW1wbGUuYmFyIiwgIlVuaWNhc3RTaWduYWwyIiwgIiIsCisgICAgICAiY29tLmV4YW1wbGUuU3lzdGVtZEFjdGl2YXRhYmxlMiIpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworCisgIC8qIFRoZSBhY3RpdmF0YWJsZSBzZXJ2aWNlIHRha2VzIGl0cyBuYW1lLiBIZXJlIEknbSBmYWtpbmcgaXQgYnkgdXNpbmcKKyAgICogYW4gZXhpc3RpbmcgY29ubmVjdGlvbi4gKi8KKyAgdGFrZV93ZWxsX2tub3duX25hbWUgKGYsIGYtPmFjdGl2YXRlZCwgImNvbS5leGFtcGxlLlN5c3RlbWRBY3RpdmF0YWJsZTIiKTsKKworICAvKiBUaGUgbWVzc2FnZSBpcyBkZWxpdmVyZWQgdG8gdGhlIGFjdGl2YXRhYmxlIHNlcnZpY2UuCisgICAqIEltcGxlbWVudGF0aW9uIGRldGFpbDogdGhlIG1vbml0b3Igc2VlcyB0aGlzIGhhcHBlbiBiZWZvcmUgaXQgZXZlbgorICAgKiBzZWVzIHRoYXQgdGhlIG5hbWUgcmVxdWVzdCBoYXBwZW5lZCwgd2hpY2ggaXMgcHJldHR5IG9kZC4gKi8KKyAgd2hpbGUgKGYtPmFjdGl2YXRlZF9tZXNzYWdlID09IE5VTEwpCisgICAgdGVzdF9tYWluX2NvbnRleHRfaXRlcmF0ZSAoZi0+Y3R4LCBUUlVFKTsKKworICBtID0gZi0+YWN0aXZhdGVkX21lc3NhZ2U7CisgIGYtPmFjdGl2YXRlZF9tZXNzYWdlID0gTlVMTDsKKyAgYXNzZXJ0X3NpZ25hbCAobSwgZi0+c2VuZGVyX25hbWUsICIvZm9vIiwKKyAgICAgICJjb20uZXhhbXBsZS5iYXIiLCAiVW5pY2FzdFNpZ25hbDIiLCAiIiwKKyAgICAgICJjb20uZXhhbXBsZS5TeXN0ZW1kQWN0aXZhdGFibGUyIik7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisKKyAgZXhwZWN0X3Rha2Vfd2VsbF9rbm93bl9uYW1lIChmLCBmLT5hY3RpdmF0ZWQsCisgICAgICAiY29tLmV4YW1wbGUuU3lzdGVtZEFjdGl2YXRhYmxlMiIpOworCisgIC8qIEEgdGhpcmQgYWN0aXZhdGlvbi4gKi8KKyAgbSA9IGRidXNfbWVzc2FnZV9uZXdfc2lnbmFsICgiL2ZvbyIsICJjb20uZXhhbXBsZS5iYXIiLCAiVW5pY2FzdFNpZ25hbDMiKTsKKyAgaWYgKCFkYnVzX21lc3NhZ2Vfc2V0X2Rlc3RpbmF0aW9uIChtLCAiY29tLmV4YW1wbGUuU3lzdGVtZEFjdGl2YXRhYmxlMyIpKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKyAgZGJ1c19jb25uZWN0aW9uX3NlbmQgKGYtPnNlbmRlciwgbSwgTlVMTCk7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisKKyAgLyogT25jZSBhZ2Fpbiwgd2Ugc2VlIHRoZSBhY3RpdmF0aW9uIHJlcXVlc3QgYW5kIHRoZSByZWFzb24uICovCisgIHdoaWxlIChnX3F1ZXVlX2dldF9sZW5ndGggKCZmLT5tb25pdG9yZWQpIDwgMikKKyAgICB0ZXN0X21haW5fY29udGV4dF9pdGVyYXRlIChmLT5jdHgsIFRSVUUpOworCisgIG0gPSBnX3F1ZXVlX3BvcF9oZWFkICgmZi0+bW9uaXRvcmVkKTsKKyAgYXNzZXJ0X3NpZ25hbCAobSwgREJVU19TRVJWSUNFX0RCVVMsIERCVVNfUEFUSF9EQlVTLAorICAgICAgIm9yZy5mcmVlZGVza3RvcC5zeXN0ZW1kMS5BY3RpdmF0b3IiLCAiQWN0aXZhdGlvblJlcXVlc3QiLCAicyIsCisgICAgICAib3JnLmZyZWVkZXNrdG9wLnN5c3RlbWQxIik7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisgIG0gPSBnX3F1ZXVlX3BvcF9oZWFkICgmZi0+bW9uaXRvcmVkKTsKKyAgYXNzZXJ0X3NpZ25hbCAobSwgZi0+c2VuZGVyX25hbWUsICIvZm9vIiwKKyAgICAgICJjb20uZXhhbXBsZS5iYXIiLCAiVW5pY2FzdFNpZ25hbDMiLCAiIiwKKyAgICAgICJjb20uZXhhbXBsZS5TeXN0ZW1kQWN0aXZhdGFibGUzIik7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisKKyAgLyogc3lzdGVtZCBnZXRzIHRoZSByZXF1ZXN0IHRvby4gKi8KKyAgd2hpbGUgKGYtPnN5c3RlbWRfbWVzc2FnZSA9PSBOVUxMKQorICAgIHRlc3RfbWFpbl9jb250ZXh0X2l0ZXJhdGUgKGYtPmN0eCwgVFJVRSk7CisKKyAgbSA9IGYtPnN5c3RlbWRfbWVzc2FnZTsKKyAgZi0+c3lzdGVtZF9tZXNzYWdlID0gTlVMTDsKKyAgYXNzZXJ0X3NpZ25hbCAobSwgREJVU19TRVJWSUNFX0RCVVMsIERCVVNfUEFUSF9EQlVTLAorICAgICAgIm9yZy5mcmVlZGVza3RvcC5zeXN0ZW1kMS5BY3RpdmF0b3IiLCAiQWN0aXZhdGlvblJlcXVlc3QiLCAicyIsCisgICAgICAib3JnLmZyZWVkZXNrdG9wLnN5c3RlbWQxIik7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisKKyAgLyogVGhpcyB0aW1lIGFjdGl2YXRpb24gZmFpbHMgKi8KKyAgbSA9IGRidXNfbWVzc2FnZV9uZXdfc2lnbmFsICgiL29yZy9mcmVlZGVza3RvcC9zeXN0ZW1kMSIsCisgICAgICAib3JnLmZyZWVkZXNrdG9wLnN5c3RlbWQxLkFjdGl2YXRvciIsICJBY3RpdmF0aW9uRmFpbHVyZSIpOworCisgIGRvCisgICAgeworICAgICAgY29uc3QgY2hhciAqdW5pdCA9ICJkYnVzLWNvbS5leGFtcGxlLlN5c3RlbWRBY3RpdmF0YWJsZTMuc2VydmljZSI7CisgICAgICBjb25zdCBjaGFyICplcnJvcl9uYW1lID0gImNvbS5leGFtcGxlLk5vcGUiOworICAgICAgY29uc3QgY2hhciAqZXJyb3JfbWVzc2FnZSA9ICJDb21wdXRlciBzYXlzIG5vIjsKKworICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKG0sCisgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmdW5pdCwKKyAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZlcnJvcl9uYW1lLAorICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJmVycm9yX21lc3NhZ2UsCisgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgICAgIGdfZXJyb3IgKCJPT00iKTsKKyAgICB9CisgIHdoaWxlICgwKTsKKworICBpZiAoIWRidXNfbWVzc2FnZV9zZXRfZGVzdGluYXRpb24gKG0sICJvcmcuZnJlZWRlc2t0b3AuREJ1cyIpKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKyAgZGJ1c19jb25uZWN0aW9uX3NlbmQgKGYtPnN5c3RlbWQsIG0sIE5VTEwpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworCisgIC8qIFRoZSBtb25pdG9yIHNlZXMgYWN0aXZhdGlvbiBmYWlsICovCisKKyAgLyogT25jZSBhZ2Fpbiwgd2Ugc2VlIHRoZSBhY3RpdmF0aW9uIHJlcXVlc3QgYW5kIHRoZSByZWFzb24uICovCisgIHdoaWxlIChnX3F1ZXVlX2dldF9sZW5ndGggKCZmLT5tb25pdG9yZWQpIDwgMSkKKyAgICB0ZXN0X21haW5fY29udGV4dF9pdGVyYXRlIChmLT5jdHgsIFRSVUUpOworCisgIG0gPSBnX3F1ZXVlX3BvcF9oZWFkICgmZi0+bW9uaXRvcmVkKTsKKyAgYXNzZXJ0X2Vycm9yX3JlcGx5IChtLCBEQlVTX1NFUlZJQ0VfREJVUywgZi0+c2VuZGVyX25hbWUsCisgICAgICAiY29tLmV4YW1wbGUuTm9wZSIpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworfQorI2VuZGlmIC8qIERCVVNfVU5JWCAqLworCitzdGF0aWMgdm9pZAordGVhcmRvd24gKEZpeHR1cmUgKmYsCisgICAgZ2NvbnN0cG9pbnRlciBjb250ZXh0IEdfR05VQ19VTlVTRUQpCit7CisgIGRidXNfZXJyb3JfZnJlZSAoJmYtPmUpOworICBnX2NsZWFyX2Vycm9yICgmZi0+Z2UpOworCisgIGlmIChmLT5tb25pdG9yICE9IE5VTEwpCisgICAgeworICAgICAgZGJ1c19jb25uZWN0aW9uX3JlbW92ZV9maWx0ZXIgKGYtPm1vbml0b3IsIG1vbml0b3JfZmlsdGVyLCBmKTsKKyAgICAgIGRidXNfY29ubmVjdGlvbl9jbG9zZSAoZi0+bW9uaXRvcik7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGYtPm1vbml0b3IpOworICAgICAgZi0+bW9uaXRvciA9IE5VTEw7CisgICAgfQorCisgIGlmIChmLT5zZW5kZXIgIT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fY2xvc2UgKGYtPnNlbmRlcik7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGYtPnNlbmRlcik7CisgICAgICBmLT5zZW5kZXIgPSBOVUxMOworICAgIH0KKworICBpZiAoZi0+cmVjaXBpZW50ICE9IE5VTEwpCisgICAgeworICAgICAgZGJ1c19jb25uZWN0aW9uX3JlbW92ZV9maWx0ZXIgKGYtPnJlY2lwaWVudCwgcmVjaXBpZW50X2NoZWNrX2ZpbHRlciwgZik7CisgICAgICBpZiAoZi0+cmVjaXBpZW50X2VucXVldWVfZmlsdGVyX2FkZGVkKQorICAgICAgICBkYnVzX2Nvbm5lY3Rpb25fcmVtb3ZlX2ZpbHRlciAoZi0+cmVjaXBpZW50LCByZWNpcGllbnRfZW5xdWV1ZV9maWx0ZXIsCisgICAgICAgICAgICBmKTsKKyAgICAgIGRidXNfY29ubmVjdGlvbl9jbG9zZSAoZi0+cmVjaXBpZW50KTsKKyAgICAgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoZi0+cmVjaXBpZW50KTsKKyAgICAgIGYtPnJlY2lwaWVudCA9IE5VTEw7CisgICAgfQorCisgIGlmIChmLT5zeXN0ZW1kICE9IE5VTEwpCisgICAgeworICAgICAgZGJ1c19jb25uZWN0aW9uX3JlbW92ZV9maWx0ZXIgKGYtPnN5c3RlbWQsIHN5c3RlbWRfZmlsdGVyLCBmKTsKKyAgICAgIGRidXNfY29ubmVjdGlvbl9jbG9zZSAoZi0+c3lzdGVtZCk7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGYtPnN5c3RlbWQpOworICAgICAgZi0+c3lzdGVtZCA9IE5VTEw7CisgICAgfQorCisgIGlmIChmLT5hY3RpdmF0ZWQgIT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fcmVtb3ZlX2ZpbHRlciAoZi0+YWN0aXZhdGVkLCBhY3RpdmF0ZWRfZmlsdGVyLCBmKTsKKyAgICAgIGRidXNfY29ubmVjdGlvbl9jbG9zZSAoZi0+YWN0aXZhdGVkKTsKKyAgICAgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoZi0+YWN0aXZhdGVkKTsKKyAgICAgIGYtPmFjdGl2YXRlZCA9IE5VTEw7CisgICAgfQorCisgIGlmIChmLT5kYWVtb25fcGlkICE9IDApCisgICAgeworICAgICAgdGVzdF9raWxsX3BpZCAoZi0+ZGFlbW9uX3BpZCk7CisgICAgICBnX3NwYXduX2Nsb3NlX3BpZCAoZi0+ZGFlbW9uX3BpZCk7CisgICAgICBmLT5kYWVtb25fcGlkID0gMDsKKyAgICB9CisKKyAgdGVzdF9tYWluX2NvbnRleHRfdW5yZWYgKGYtPmN0eCk7CisKKyAgZ19xdWV1ZV9mb3JlYWNoICgmZi0+bW9uaXRvcmVkLCAoR0Z1bmMpIGRidXNfbWVzc2FnZV91bnJlZiwgTlVMTCk7CisgIGdfcXVldWVfY2xlYXIgKCZmLT5tb25pdG9yZWQpOworCisgIGdfcXVldWVfZm9yZWFjaCAoJmYtPnJlY2VpdmVkLCAoR0Z1bmMpIGRidXNfbWVzc2FnZV91bnJlZiwgTlVMTCk7CisgIGdfcXVldWVfY2xlYXIgKCZmLT5yZWNlaXZlZCk7CisKKyAgZ19mcmVlIChmLT5hZGRyZXNzKTsKK30KKworaW50CittYWluIChpbnQgYXJnYywKKyAgICBjaGFyICoqYXJndikKK3sKKyAgdGVzdF9pbml0ICgmYXJnYywgJmFyZ3YpOworCisgIGdfdGVzdF9hZGQgKCIvbW9uaXRvci9pbnZhbGlkIiwgRml4dHVyZSwgTlVMTCwKKyAgICAgIHNldHVwLCB0ZXN0X2ludmFsaWQsIHRlYXJkb3duKTsKKyAgZ190ZXN0X2FkZCAoIi9tb25pdG9yL2JlY29tZSIsIEZpeHR1cmUsICZzaWRlX2VmZmVjdHNfY29uZmlnLAorICAgICAgc2V0dXAsIHRlc3RfYmVjb21lX21vbml0b3IsIHRlYXJkb3duKTsKKyAgZ190ZXN0X2FkZCAoIi9tb25pdG9yL2Jyb2FkY2FzdCIsIEZpeHR1cmUsIE5VTEwsCisgICAgICBzZXR1cCwgdGVzdF9icm9hZGNhc3QsIHRlYXJkb3duKTsKKyAgZ190ZXN0X2FkZCAoIi9tb25pdG9yL2ZvcmJpZGRlbi1icm9hZGNhc3QiLCBGaXh0dXJlLCAmZm9yYmlkZGluZ19jb25maWcsCisgICAgICBzZXR1cCwgdGVzdF9mb3JiaWRkZW5fYnJvYWRjYXN0LCB0ZWFyZG93bik7CisgIGdfdGVzdF9hZGQgKCIvbW9uaXRvci91bmljYXN0LXNpZ25hbCIsIEZpeHR1cmUsIE5VTEwsCisgICAgICBzZXR1cCwgdGVzdF91bmljYXN0X3NpZ25hbCwgdGVhcmRvd24pOworICBnX3Rlc3RfYWRkICgiL21vbml0b3IvZm9yYmlkZGVuIiwgRml4dHVyZSwgJmZvcmJpZGRpbmdfY29uZmlnLAorICAgICAgc2V0dXAsIHRlc3RfZm9yYmlkZGVuLCB0ZWFyZG93bik7CisgIGdfdGVzdF9hZGQgKCIvbW9uaXRvci9tZXRob2QtY2FsbCIsIEZpeHR1cmUsIE5VTEwsCisgICAgICBzZXR1cCwgdGVzdF9tZXRob2RfY2FsbCwgdGVhcmRvd24pOworICBnX3Rlc3RfYWRkICgiL21vbml0b3IvZm9yYmlkZGVuLW1ldGhvZCIsIEZpeHR1cmUsICZmb3JiaWRkaW5nX2NvbmZpZywKKyAgICAgIHNldHVwLCB0ZXN0X2ZvcmJpZGRlbl9tZXRob2RfY2FsbCwgdGVhcmRvd24pOworICBnX3Rlc3RfYWRkICgiL21vbml0b3IvZGJ1cy1kYWVtb24iLCBGaXh0dXJlLCBOVUxMLAorICAgICAgc2V0dXAsIHRlc3RfZGJ1c19kYWVtb24sIHRlYXJkb3duKTsKKyAgZ190ZXN0X2FkZCAoIi9tb25pdG9yL3NlbGVjdGl2ZSIsIEZpeHR1cmUsICZzZWxlY3RpdmVfY29uZmlnLAorICAgICAgc2V0dXAsIHRlc3Rfc2VsZWN0aXZlLCB0ZWFyZG93bik7CisgIGdfdGVzdF9hZGQgKCIvbW9uaXRvci93ZWxsLWtub3duLWRlc3RpbmF0aW9uIiwKKyAgICAgIEZpeHR1cmUsICZ3ZWxsX2tub3duX2Rlc3RpbmF0aW9uX2NvbmZpZywKKyAgICAgIHNldHVwLCB0ZXN0X3dlbGxfa25vd25fZGVzdGluYXRpb24sIHRlYXJkb3duKTsKKyAgZ190ZXN0X2FkZCAoIi9tb25pdG9yL3VuaXF1ZS1kZXN0aW5hdGlvbiIsCisgICAgICBGaXh0dXJlLCBOVUxMLAorICAgICAgc2V0dXAsIHRlc3RfdW5pcXVlX2Rlc3RpbmF0aW9uLCB0ZWFyZG93bik7CisgIGdfdGVzdF9hZGQgKCIvbW9uaXRvci93aWxkY2FyZCIsIEZpeHR1cmUsICZ3aWxkY2FyZF9jb25maWcsCisgICAgICBzZXR1cCwgdGVzdF91bmljYXN0X3NpZ25hbCwgdGVhcmRvd24pOworICBnX3Rlc3RfYWRkICgiL21vbml0b3Ivbm8tcnVsZSIsIEZpeHR1cmUsICZub19ydWxlc19jb25maWcsCisgICAgICBzZXR1cCwgdGVzdF91bmljYXN0X3NpZ25hbCwgdGVhcmRvd24pOworICBnX3Rlc3RfYWRkICgiL21vbml0b3IvZWF2ZXNkcm9wIiwgRml4dHVyZSwgJmVhdmVzZHJvcF9jb25maWcsCisgICAgICBzZXR1cCwgdGVzdF91bmljYXN0X3NpZ25hbCwgdGVhcmRvd24pOworICBnX3Rlc3RfYWRkICgiL21vbml0b3Ivbm8tZWF2ZXNkcm9wIiwgRml4dHVyZSwgJm5vX2VhdmVzZHJvcF9jb25maWcsCisgICAgICBzZXR1cCwgdGVzdF91bmljYXN0X3NpZ25hbCwgdGVhcmRvd24pOworCisjaWZkZWYgREJVU19VTklYCisgIC8qIHRoaXMgcmVsaWVzIG9uIHRoZSBzeXN0ZW1kIGFjdGl2YXRpb24gY29kZSBwYXRoICovCisgIGdfdGVzdF9hZGQgKCIvbW9uaXRvci9hY3RpdmF0aW9uIiwgRml4dHVyZSwgJmZha2Vfc3lzdGVtZF9jb25maWcsCisgICAgICBzZXR1cCwgdGVzdF9hY3RpdmF0aW9uLCB0ZWFyZG93bik7CisjZW5kaWYKKworICByZXR1cm4gZ190ZXN0X3J1biAoKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvbmFtZS10ZXN0Ly5naXRpZ25vcmUgYi90ZXN0L25hbWUtdGVzdC8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiZjMxM2EKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L25hbWUtdGVzdC8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsMTUgQEAKKy5kZXBzCisubGlicworTWFrZWZpbGUKK01ha2VmaWxlLmluCitlY2hvLWVycm9yLW91dHB1dC50bXAKK3RtcC1zZXNzaW9uLWJ1cy4qLmNvbmYKK3Rlc3QtaWRzCit0ZXN0LW5hbWVzCit0ZXN0LXBlbmRpbmctY2FsbC1kaXNwYXRjaAordGVzdC1wZW5kaW5nLWNhbGwtdGltZW91dAordGVzdC1wcml2c2VydmVyCit0ZXN0LXByaXZzZXJ2ZXItY2xpZW50Cit0ZXN0LXNodXRkb3duCit0ZXN0LXRocmVhZHMtaW5pdAordGVzdC1hdXRvbGF1bmNoCmRpZmYgLS1naXQgYS90ZXN0L25hbWUtdGVzdC9NYWtlZmlsZS5hbSBiL3Rlc3QvbmFtZS10ZXN0L01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwMDk2MzUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L25hbWUtdGVzdC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDkwIEBACitBTV9DUFBGTEFHUyA9IFwKKwktSSQodG9wX3NyY2RpcikgXAorCSQoREJVU19TVEFUSUNfQlVJTERfQ1BQRkxBR1MpIFwKKwktRERCVVNfQ09NUElMQVRJT04gXAorCSQoTlVMTCkKKworQU1fQ0ZMQUdTID0gXAorCSQoQ09ERV9DT1ZFUkFHRV9DRkxBR1MpIFwKKwkkKE5VTEwpCisKKyMgaWYgYXNzZXJ0aW9ucyBhcmUgZW5hYmxlZCwgaW1wcm92ZSBiYWNrdHJhY2VzCitBTV9MREZMQUdTID0gQFJfRFlOQU1JQ19MREZMQUdACisKK1RFU1RfRVhURU5TSU9OUyA9IC5zaAorCitMT0dfRFJJVkVSID0gZW52IEFNX1RBUF9BV0s9JyQoQVdLKScgJChTSEVMTCkgJCh0b3Bfc3JjZGlyKS9idWlsZC1hdXgvdGFwLWRyaXZlci5zaAorU0hfTE9HX0RSSVZFUiA9ICQoTE9HX0RSSVZFUikKKworTE9HX0NPTVBJTEVSID0gXAorCUBhYnNfdG9wX2J1aWxkZGlyQC90b29scy9kYnVzLXJ1bi1zZXNzaW9uJChFWEVFWFQpIFwKKwktLWNvbmZpZy1maWxlPUBhYnNfYnVpbGRkaXJAL3VuaW5zdGFsbGVkLXNlc3Npb24uY29uZiBcCisJLS1kYnVzLWRhZW1vbj1AYWJzX3RvcF9idWlsZGRpckAvYnVzL2RidXMtZGFlbW9uJChFWEVFWFQpIFwKKwktLSBcCisJJChOVUxMKQorU0hfTE9HX0NPTVBJTEVSID0gJChTSEVMTCkKKworIyMgbm90ZSB0aGF0IFRFU1RTIGhhcyBzcGVjaWFsIG1lYW5pbmcgKHN0dWZmIHRvIHVzZSBpbiBtYWtlIGNoZWNrKQorIyMgc28gaWYgYWRkaW5nIHRlc3RzIG5vdCB0byBiZSBydW4gaW4gbWFrZSBjaGVjaywgZG9uJ3QgYWRkIHRoZW0gdG8gCisjIyBURVNUUworVEVTVFMgPQorCitpZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworaWYgREJVU19VTklYCitBTV9URVNUU19FTlZJUk9OTUVOVCA9IFwKKyAgICAgICAgZXhwb3J0IERCVVNfU0VTU0lPTl9CVVNfQUREUkVTUz1kby1ub3QtdXNlLXJlYWwtc2Vzc2lvbjo7IFwKKyAgICAgICAgZXhwb3J0IERCVVNfVE9QX0JVSUxERElSPUBhYnNfdG9wX2J1aWxkZGlyQDsgXAorICAgICAgICBleHBvcnQgREJVU19UT1BfU1JDRElSPUBhYnNfdG9wX3NyY2RpckA7IFwKKyAgICAgICAgZXhwb3J0IFBBVEg9IkBhYnNfdG9wX2J1aWxkZGlyQC9idXM6JCRQQVRIIjsgXAorICAgICAgICBleHBvcnQgUFlUSE9OPUBQWVRIT05AOyBcCisgICAgICAgIGV4cG9ydCBEQlVTX1RFU1RfREFUQT1AYWJzX3RvcF9idWlsZGRpckAvdGVzdC9kYXRhOyBcCisgICAgICAgIGV4cG9ydCBEQlVTX1RFU1RfREFFTU9OPUBhYnNfdG9wX2J1aWxkZGlyQC9idXMvZGJ1cy1kYWVtb24kKEVYRUVYVCk7IFwKKyAgICAgICAgZXhwb3J0IERCVVNfVEVTVF9EQlVTX0xBVU5DSD1AYWJzX3RvcF9idWlsZGRpckAvdG9vbHMvZGJ1cy1sYXVuY2gkKEVYRUVYVCk7IFwKKyAgICAgICAgZXhwb3J0IFhER19SVU5USU1FX0RJUj1AYWJzX3RvcF9idWlsZGRpckAvdGVzdC9YREdfUlVOVElNRV9ESVI7IFwKKyAgICAgICAgdW5zZXQgREJVU19TRVNTSU9OX0JVU19BRERSRVNTOyBcCisgICAgICAgIHVuc2V0IERCVVNfU0VTU0lPTl9CVVNfUElEOyBcCisgICAgICAgICQoTlVMTCkKKwordW5pbnN0YWxsZWQtc2Vzc2lvbi5jb25mOiAkKHRvcF9idWlsZGRpcikvYnVzL3Nlc3Npb24uY29uZiBNYWtlZmlsZQorCSQoU0VEKSAtZSAnc3w8c3RhbmRhcmRfc2Vzc2lvbl9zZXJ2aWNlZGlycy4qJCR8PHNlcnZpY2VkaXI+QGFic190b3BfYnVpbGRkaXJAL3Rlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzPC9zZXJ2aWNlZGlyPnxnJyBcCisJCS1lICdzfDxpbmNsdWRlLiokJHx8ZycgXAorCQk8ICQ8ID4gJEAKKworY2hlY2tfREFUQSA9IFwKKwl1bmluc3RhbGxlZC1zZXNzaW9uLmNvbmYgXAorCSQoTlVMTCkKKworVEVTVFMgKz0gXAorCXJ1bi10ZXN0LnNoIFwKKwlydW4tdGVzdC1zeXN0ZW1zZXJ2ZXIuc2ggXAorCXRlc3QtaWRzIFwKKwl0ZXN0LXBlbmRpbmctY2FsbC1kaXNwYXRjaCBcCisJdGVzdC1wZW5kaW5nLWNhbGwtdGltZW91dCBcCisJdGVzdC1wZW5kaW5nLWNhbGwtZGlzY29ubmVjdGVkIFwKKwl0ZXN0LXByaXZzZXJ2ZXItY2xpZW50IFwKKwl0ZXN0LXNodXRkb3duIFwKKwl0ZXN0LXRocmVhZHMtaW5pdCBcCisJJChOVUxMKQorZW5kaWYKK2VuZGlmCisKK0VYVFJBX0RJU1Q9cnVuLXRlc3Quc2ggcnVuLXRlc3Qtc3lzdGVtc2VydmVyLnNoIHRlc3Qtd2FpdC1mb3ItZWNoby5weSB0ZXN0LWFjdGl2YXRpb24tZm9ya2luZy5weQorCitpZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworCisjIyB3ZSB1c2Ugbm9pbnN0X1BST0dSQU1TIG5vdCBjaGVja19QUk9HUkFNUyBmb3IgVEVTVFMgc28gdGhhdCB3ZQorIyMgYnVpbGQgZXZlbiB3aGVuIG5vdCBkb2luZyAibWFrZSBjaGVjayIKK25vaW5zdF9QUk9HUkFNUz10ZXN0LXBlbmRpbmctY2FsbC1kaXNwYXRjaCB0ZXN0LXBlbmRpbmctY2FsbC10aW1lb3V0IHRlc3QtcGVuZGluZy1jYWxsLWRpc2Nvbm5lY3RlZCB0ZXN0LXRocmVhZHMtaW5pdCB0ZXN0LWlkcyB0ZXN0LXNodXRkb3duIHRlc3QtcHJpdnNlcnZlciB0ZXN0LXByaXZzZXJ2ZXItY2xpZW50IHRlc3QtYXV0b2xhdW5jaAorCit0ZXN0X3BlbmRpbmdfY2FsbF9kaXNwYXRjaF9MREFERD0kKHRvcF9idWlsZGRpcikvZGJ1cy9saWJkYnVzLTEubGEKK3Rlc3RfcGVuZGluZ19jYWxsX3RpbWVvdXRfTERBREQ9JCh0b3BfYnVpbGRkaXIpL2RidXMvbGliZGJ1cy0xLmxhCit0ZXN0X3BlbmRpbmdfY2FsbF9kaXNjb25uZWN0ZWRfTERBREQ9JCh0b3BfYnVpbGRkaXIpL2RidXMvbGliZGJ1cy0xLmxhCit0ZXN0X3RocmVhZHNfaW5pdF9MREFERD0kKHRvcF9idWlsZGRpcikvZGJ1cy9saWJkYnVzLTEubGEKK3Rlc3RfaWRzX0xEQUREPSQodG9wX2J1aWxkZGlyKS9kYnVzL2xpYmRidXMtMS5sYQorCit0ZXN0X3NodXRkb3duX0xEQUREPS4uL2xpYmRidXMtdGVzdHV0aWxzLmxhCit0ZXN0X3ByaXZzZXJ2ZXJfTERBREQ9Li4vbGliZGJ1cy10ZXN0dXRpbHMubGEKK3Rlc3RfcHJpdnNlcnZlcl9jbGllbnRfTERBREQ9Li4vbGliZGJ1cy10ZXN0dXRpbHMubGEKK3Rlc3RfYXV0b2xhdW5jaF9MREFERD0uLi9saWJkYnVzLXRlc3R1dGlscy5sYQorCitlbmRpZgpkaWZmIC0tZ2l0IGEvdGVzdC9uYW1lLXRlc3QvcnVuLXRlc3Qtc3lzdGVtc2VydmVyLnNoIGIvdGVzdC9uYW1lLXRlc3QvcnVuLXRlc3Qtc3lzdGVtc2VydmVyLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjk5MjZjYWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L25hbWUtdGVzdC9ydW4tdGVzdC1zeXN0ZW1zZXJ2ZXIuc2gKQEAgLTAsMCArMSw4OSBAQAorIyEgL2Jpbi9zaAorCitTQ1JJUFROQU1FPSQwCitNT0RFPSQxCisKKyMjIHNvIHRoZSB0ZXN0cyBjYW4gY29tcGxhaW4gaWYgeW91IGZhaWwgdG8gdXNlIHRoZSBzY3JpcHQgdG8gbGF1bmNoIHRoZW0KK0RCVVNfVEVTVF9OQU1FX1JVTl9URVNUX1NDUklQVD0xCitleHBvcnQgREJVU19URVNUX05BTUVfUlVOX1RFU1RfU0NSSVBUCisKK1NPVVJDRV9DT05GSUdfRklMRT0kREJVU19UT1BfU1JDRElSL3Rlc3QvbmFtZS10ZXN0L3RtcC1zZXNzaW9uLWxpa2Utc3lzdGVtLmNvbmYKK2V4cG9ydCBTT1VSQ0VfQ09ORklHX0ZJTEUKKyMgUmVydW4gb3Vyc2VsdmVzIHdpdGggdG1wIHNlc3Npb24gYnVzIGlmIHdlJ3JlIG5vdCBhbHJlYWR5CitpZiB0ZXN0IC16ICIkREJVU19URVNUX05BTUVfSU5fU1lTX1JVTl9URVNUIjsgdGhlbgorICBEQlVTX1RFU1RfTkFNRV9JTl9TWVNfUlVOX1RFU1Q9MQorICBleHBvcnQgREJVU19URVNUX05BTUVfSU5fU1lTX1JVTl9URVNUCisgIGV4ZWMgJERCVVNfVE9QX1NSQ0RJUi90b29scy9ydW4td2l0aC10bXAtc2Vzc2lvbi1idXMuc2ggJFNDUklQVE5BTUUgJE1PREUKK2ZpIAorCitpZiB0ZXN0IC1uICIkREJVU19URVNUX01PTklUT1IiOyB0aGVuCisgIGRidXMtbW9uaXRvciAtLXNlc3Npb24gPiYyICYKK2ZpCisKK1hER19SVU5USU1FX0RJUj0iJERCVVNfVE9QX0JVSUxERElSIi90ZXN0L1hER19SVU5USU1FX0RJUgordGVzdCAtZCAiJFhER19SVU5USU1FX0RJUiIgfHwgbWtkaXIgIiRYREdfUlVOVElNRV9ESVIiCitjaG1vZCAwNzAwICIkWERHX1JVTlRJTUVfRElSIgorZXhwb3J0IFhER19SVU5USU1FX0RJUgorCisjIFRyYW5zbGF0ZSBhIGNvbW1hbmQgYW5kIGV4aXQgc3RhdHVzIGludG8gVEFQIHN5bnRheC4KKyMgVXNhZ2U6IGludGVycHJldF9yZXN1bHQgJD8gZGVzY3JpcHRpb24tb2YtdGVzdAorIyBVc2VzIGdsb2JhbCB2YXJpYWJsZSAkdGVzdF9udW0uCitpbnRlcnByZXRfcmVzdWx0ICgpIHsKKyAgZT0iJDEiCisgIHNoaWZ0CisgIGNhc2UgIiRlIiBpbgorICAgICgwKQorICAgICAgZWNobyAib2sgJHRlc3RfbnVtICQqIgorICAgICAgOzsKKyAgICAoNzcpCisgICAgICBlY2hvICJvayAkdGVzdF9udW0gIyBTS0lQICQqIgorICAgICAgOzsKKyAgICAoKikKKyAgICAgIGVjaG8gIm5vdCBvayAkdGVzdF9udW0gJCoiCisgICAgICA7OworICBlc2FjCisgIHRlc3RfbnVtPSQoKCAkdGVzdF9udW0gKyAxICkpCit9CisKK2RidXNfc2VuZF90ZXN0ICgpIHsKKyAgdD0iJDEiCisgIGV4cGVjdGVkX2V4aXQ9IiQyIgorICBwaHJhc2U9IiQzIgorICBzaGlmdCAzCisgIGU9MAorICBlY2hvICIjIHJ1bm5pbmcgdGVzdCAkdCIKKyAgIiR7REJVU19UT1BfQlVJTERESVJ9L2xpYnRvb2wiIC0tbW9kZT1leGVjdXRlICRERUJVRyAiJERCVVNfVE9QX0JVSUxERElSL3Rvb2xzL2RidXMtc2VuZCIgIiRAIiA+IG91dHB1dC50bXAgMj4mMSB8fCBlPSQ/CisgIGlmIFsgJGUgIT0gJGV4cGVjdGVkX2V4aXQgXTsgdGhlbgorICAgIHNlZCAtZSAncy9eLyMgIC8nIDwgb3V0cHV0LnRtcAorICAgIGludGVycHJldF9yZXN1bHQgIjEiICIkdCIgIiRAIiAiKGV4cGVjdGVkIGV4aXQgc3RhdHVzICRleHBlY3RlZF9leGl0LCBnb3QgJGUpIgorICAgIHJldHVybgorICBmaQorICBlY2hvICIjIHBhcnNpbmcgcmVzdWx0cyBvZiB0ZXN0ICR0IgorICBpZiAhIGdyZXAgLXEgIiRwaHJhc2UiIG91dHB1dC50bXA7IHRoZW4KKyAgICBzZWQgLWUgJ3MvXi8jICAvJyA8IG91dHB1dC50bXAKKyAgICBpbnRlcnByZXRfcmVzdWx0ICIxIiAiJHQiICIkQCIgIihEaWQgbm90IHNlZSBcIiRwaHJhc2VcIiBpbiBvdXRwdXQpIgorICAgIHJldHVybgorICBmaQorICBpbnRlcnByZXRfcmVzdWx0ICIwIiAiJHQiICIkQCIgIihTYXcgXCIkcGhyYXNlXCIgaW4gb3V0cHV0IGFzIGV4cGVjdGVkKSIKKyAgcm0gLWYgb3V0cHV0LnRtcAorfQorCitweV90ZXN0ICgpIHsKKyAgdD0iJDEiCisgIHNoaWZ0CisgIGlmIHRlc3QgIngkUFlUSE9OIiA9ICJ4OiI7IHRoZW4KKyAgICBpbnRlcnByZXRfcmVzdWx0IDc3ICIkdCIgIihQeXRob24gaW50ZXJwcmV0ZXIgbm90IGZvdW5kKSIKKyAgZWxzZQorICAgIGU9MAorICAgIGVjaG8gIiMgcnVubmluZyB0ZXN0ICR0IgorICAgICRQWVRIT04gIiREQlVTX1RPUF9TUkNESVIvdGVzdC9uYW1lLXRlc3QvJHQiICIkQCIgPiYyIHx8IGU9JD8KKyAgICBpbnRlcnByZXRfcmVzdWx0ICIkZSIgIiR0IiAiJEAiCisgIGZpCit9CisKK3Rlc3RfbnVtPTEKKyMgVEFQIHN5bnRheDogd2UgcGxhbiB0byBydW4gMiB0ZXN0cworZWNobyAiMS4uMiIKKworZGJ1c19zZW5kX3Rlc3QgdGVzdC1leHBlY3RlZC1lY2hvLWZhaWwgMSBEQnVzLkVycm9yIC0tcHJpbnQtcmVwbHkgLS1kZXN0PW9yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZUVjaG9TZXJ2aWNlIC9vcmcvZnJlZWRlc2t0b3AvVGVzdFN1aXRlIG9yZy5mcmVlZGVza3RvcC5UZXN0U3VpdGUuRWNobyBzdHJpbmc6aGkKK3B5X3Rlc3QgdGVzdC13YWl0LWZvci1lY2hvLnB5CmRpZmYgLS1naXQgYS90ZXN0L25hbWUtdGVzdC9ydW4tdGVzdC5zaCBiL3Rlc3QvbmFtZS10ZXN0L3J1bi10ZXN0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA5MmVjNjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L25hbWUtdGVzdC9ydW4tdGVzdC5zaApAQCAtMCwwICsxLDc0IEBACisjISAvYmluL3NoCisKK1NDUklQVE5BTUU9JDAKK01PREU9JDEKKworIyMgc28gdGhlIHRlc3RzIGNhbiBjb21wbGFpbiBpZiB5b3UgZmFpbCB0byB1c2UgdGhlIHNjcmlwdCB0byBsYXVuY2ggdGhlbQorREJVU19URVNUX05BTUVfUlVOX1RFU1RfU0NSSVBUPTEKK2V4cG9ydCBEQlVTX1RFU1RfTkFNRV9SVU5fVEVTVF9TQ1JJUFQKKworIyBSZXJ1biBvdXJzZWx2ZXMgd2l0aCB0bXAgc2Vzc2lvbiBidXMgaWYgd2UncmUgbm90IGFscmVhZHkKK2lmIHRlc3QgLXogIiREQlVTX1RFU1RfTkFNRV9JTl9SVU5fVEVTVCI7IHRoZW4KKyAgREJVU19URVNUX05BTUVfSU5fUlVOX1RFU1Q9MQorICBleHBvcnQgREJVU19URVNUX05BTUVfSU5fUlVOX1RFU1QKKyAgZXhlYyAkREJVU19UT1BfU1JDRElSL3Rvb2xzL3J1bi13aXRoLXRtcC1zZXNzaW9uLWJ1cy5zaCAkU0NSSVBUTkFNRSAkTU9ERQorZmkgCisKK2lmIHRlc3QgLW4gIiREQlVTX1RFU1RfTU9OSVRPUiI7IHRoZW4KKyAgZGJ1cy1tb25pdG9yIC0tc2Vzc2lvbiA+JjIgJgorZmkKKworWERHX1JVTlRJTUVfRElSPSIkREJVU19UT1BfQlVJTERESVIiL3Rlc3QvWERHX1JVTlRJTUVfRElSCit0ZXN0IC1kICIkWERHX1JVTlRJTUVfRElSIiB8fCBta2RpciAiJFhER19SVU5USU1FX0RJUiIKK2NobW9kIDA3MDAgIiRYREdfUlVOVElNRV9ESVIiCitleHBvcnQgWERHX1JVTlRJTUVfRElSCisKKyMgVHJhbnNsYXRlIGEgY29tbWFuZCBhbmQgZXhpdCBzdGF0dXMgaW50byBUQVAgc3ludGF4LgorIyBVc2FnZTogaW50ZXJwcmV0X3Jlc3VsdCAkPyBkZXNjcmlwdGlvbi1vZi10ZXN0CisjIFVzZXMgZ2xvYmFsIHZhcmlhYmxlICR0ZXN0X251bS4KK2ludGVycHJldF9yZXN1bHQgKCkgeworICBlPSIkMSIKKyAgc2hpZnQKKyAgY2FzZSAiJGUiIGluCisgICAgKDApCisgICAgICBlY2hvICJvayAkdGVzdF9udW0gJCoiCisgICAgICA7OworICAgICg3NykKKyAgICAgIGVjaG8gIm9rICR0ZXN0X251bSAjIFNLSVAgJCoiCisgICAgICA7OworICAgICgqKQorICAgICAgZWNobyAibm90IG9rICR0ZXN0X251bSAkKiIKKyAgICAgIDs7CisgIGVzYWMKKyAgdGVzdF9udW09JCgoICR0ZXN0X251bSArIDEgKSkKK30KKworY190ZXN0ICgpIHsKKyAgdD0iJDEiCisgIHNoaWZ0CisgIGU9MAorICBlY2hvICIjIHJ1bm5pbmcgdGVzdCAkdCIKKyAgIiR7REJVU19UT1BfQlVJTERESVJ9L2xpYnRvb2wiIC0tbW9kZT1leGVjdXRlICRERUJVRyAiJERCVVNfVE9QX0JVSUxERElSL3Rlc3QvbmFtZS10ZXN0LyR0IiAiJEAiID4mMiB8fCBlPSQ/CisgIGVjaG8gIiMgZXhpdCBzdGF0dXMgJGUiCisgIGludGVycHJldF9yZXN1bHQgIiRlIiAiJHQiICIkQCIKK30KKworcHlfdGVzdCAoKSB7CisgIHQ9IiQxIgorICBzaGlmdAorICBpZiB0ZXN0ICJ4JFBZVEhPTiIgPSAieDoiOyB0aGVuCisgICAgaW50ZXJwcmV0X3Jlc3VsdCA3NyAiJHQiICIoUHl0aG9uIGludGVycHJldGVyIG5vdCBmb3VuZCkiCisgIGVsc2UKKyAgICBlPTAKKyAgICBlY2hvICIjIHJ1bm5pbmcgdGVzdCAkdCIKKyAgICAkUFlUSE9OICIkREJVU19UT1BfU1JDRElSL3Rlc3QvbmFtZS10ZXN0LyR0IiAiJEAiID4mMiB8fCBlPSQ/CisgICAgaW50ZXJwcmV0X3Jlc3VsdCAiJGUiICIkdCIgIiRAIgorICBmaQorfQorCit0ZXN0X251bT0xCisjIFRBUCB0ZXN0IHBsYW46IHdlIHdpbGwgcnVuIDIgdGVzdHMKK2VjaG8gIjEuLjIiCisKK3B5X3Rlc3QgdGVzdC1hY3RpdmF0aW9uLWZvcmtpbmcucHkKK2NfdGVzdCB0ZXN0LWF1dG9sYXVuY2gKZGlmZiAtLWdpdCBhL3Rlc3QvbmFtZS10ZXN0L3Rlc3QtYWN0aXZhdGlvbi1mb3JraW5nLnB5IGIvdGVzdC9uYW1lLXRlc3QvdGVzdC1hY3RpdmF0aW9uLWZvcmtpbmcucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRiYzFhNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbmFtZS10ZXN0L3Rlc3QtYWN0aXZhdGlvbi1mb3JraW5nLnB5CkBAIC0wLDAgKzEsNjAgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorCitpbXBvcnQgb3Msc3lzCisKK3RyeToKKyAgICBmcm9tIGdpLnJlcG9zaXRvcnkgaW1wb3J0IEdPYmplY3QKKyAgICBpbXBvcnQgZGJ1cworICAgIGltcG9ydCBkYnVzLm1haW5sb29wLmdsaWIKK2V4Y2VwdDoKKyAgICBwcmludCgiRmFpbGVkIGltcG9ydCwgYWJvcnRpbmcgdGVzdCIpCisgICAgc3lzLmV4aXQoMCkKKworZGJ1cy5tYWlubG9vcC5nbGliLkRCdXNHTWFpbkxvb3Aoc2V0X2FzX2RlZmF1bHQ9VHJ1ZSkKK2xvb3AgPSBHT2JqZWN0Lk1haW5Mb29wKCkKKworZXhpdGNvZGUgPSAwCisKK2J1cyA9IGRidXMuU2Vzc2lvbkJ1cygpCitidXNfaWZhY2UgPSBkYnVzLkludGVyZmFjZShidXMuZ2V0X29iamVjdCgnb3JnLmZyZWVkZXNrdG9wLkRCdXMnLCAnL29yZy9mcmVlZGVza3RvcC9EQnVzJyksICdvcmcuZnJlZWRlc2t0b3AuREJ1cycpCisKK28gPSBidXMuZ2V0X29iamVjdCgnb3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlRm9ya2luZ0VjaG9TZXJ2aWNlJywgJy9vcmcvZnJlZWRlc2t0b3AvVGVzdFN1aXRlJykKK2kgPSBkYnVzLkludGVyZmFjZShvLCAnb3JnLmZyZWVkZXNrdG9wLlRlc3RTdWl0ZScpCisKKyMgU3RhcnQgaXQgdXAKK3JlcGx5ID0gaS5FY2hvKCJoZWxsbyB3b3JsZCIpCitwcmludCgiVGVzdFN1aXRlRm9ya2luZ0VjaG9TZXJ2aWNlIGluaXRpYWwgcmVwbHkgT0siKQorCitkZWYgaWdub3JlKCphcmdzLCAqKmt3YXJncyk6CisgICAgcGFzcworCisjIE5vdyBtb25pdG9yIGZvciBleGl0cywgd2hlbiB0aGF0IGhhcHBlbnMsIHN0YXJ0IGl0IHVwIGFnYWluLgorIyBUaGUgZ29hbCBoZXJlIGlzIHRvIHRyeSB0byBoaXQgYW55IHJhY2UgY29uZGl0aW9ucyBpbiBhY3RpdmF0aW9uLgorY291bnRlciA9IDAKK2RlZiBvbl9mb3JraW5nX2VjaG9fb3duZXJfY2hhbmdlZChuYW1lLCBvbGQsIG5ldyk6CisgICAgZ2xvYmFsIGNvdW50ZXIKKyAgICBnbG9iYWwgbworICAgIGdsb2JhbCBpCisgICAgaWYgY291bnRlciA+IDEwOgorICAgICAgICBwcmludCgiQWN0aXZhdGVkIDEwIHRpbWVzIE9LLCBUZXN0U3VpdGVGb3JraW5nRWNob1NlcnZpY2UgcGFzcyIpCisgICAgICAgIGxvb3AucXVpdCgpCisgICAgICAgIHJldHVybgorICAgIGNvdW50ZXIgKz0gMQorICAgIGlmIG5ldyA9PSAnJzoKKyAgICAgICAgbyA9IGJ1cy5nZXRfb2JqZWN0KCdvcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVGb3JraW5nRWNob1NlcnZpY2UnLCAnL29yZy9mcmVlZGVza3RvcC9UZXN0U3VpdGUnKQorICAgICAgICBpID0gZGJ1cy5JbnRlcmZhY2UobywgJ29yZy5mcmVlZGVza3RvcC5UZXN0U3VpdGUnKQorICAgICAgICBpLkVjaG8oImNvdW50ZXIgJXIiICUgY291bnRlcikKKyAgICAgICAgaS5FeGl0KHJlcGx5X2hhbmRsZXI9aWdub3JlLCBlcnJvcl9oYW5kbGVyPWlnbm9yZSkKKworYnVzX2lmYWNlLmNvbm5lY3RfdG9fc2lnbmFsKCdOYW1lT3duZXJDaGFuZ2VkJywgb25fZm9ya2luZ19lY2hvX293bmVyX2NoYW5nZWQsIGFyZzA9J29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZUZvcmtpbmdFY2hvU2VydmljZScpCisKK2kuRXhpdChyZXBseV9oYW5kbGVyPWlnbm9yZSwgZXJyb3JfaGFuZGxlcj1pZ25vcmUpCisKK2RlZiBjaGVja19jb3VudGVyKCk6CisgICAgaWYgY291bnRlciA9PSAwOgorICAgICAgICBwcmludCgiRmFpbGVkIHRvIGdldCBOYW1lT3duZXJDaGFuZ2VkIGZvciBUZXN0U3VpdGVGb3JraW5nRWNob1NlcnZpY2UiKQorICAgICAgICBzeXMuZXhpdCgxKQorR09iamVjdC50aW1lb3V0X2FkZCgxNTAwMCwgY2hlY2tfY291bnRlcikKKworbG9vcC5ydW4oKQorc3lzLmV4aXQoMCkKZGlmZiAtLWdpdCBhL3Rlc3QvbmFtZS10ZXN0L3Rlc3QtYXV0b2xhdW5jaC5jIGIvdGVzdC9uYW1lLXRlc3QvdGVzdC1hdXRvbGF1bmNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE3NjA1NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbmFtZS10ZXN0L3Rlc3QtYXV0b2xhdW5jaC5jCkBAIC0wLDAgKzEsNjMgQEAKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaWZkZWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxkYnVzL2RidXMuaD4KKyNpbmNsdWRlICJkYnVzL2RidXMtaW50ZXJuYWxzLmgiCisjaW5jbHVkZSAiZGJ1cy9kYnVzLXN5c2RlcHMuaCIKKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICBEQnVzQ29ubmVjdGlvbiAqY29ubiA9IE5VTEw7CisgIERCdXNFcnJvciBlcnJvcjsKKyAgREJ1c0dVSUQgdXVpZDsKKworICBkYnVzX3NldGVudiAoIkRCVVNfU0VTU0lPTl9CVVNfQUREUkVTUyIsIE5VTEwpOworCisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKworICBpZiAoIV9kYnVzX3JlYWRfbG9jYWxfbWFjaGluZV91dWlkICgmdXVpZCwgRkFMU0UsICZlcnJvcikpCisgICAgeworICAgICAgLyogV2UgY2FuJ3QgZXhwZWN0IGF1dG9sYXVuY2hpbmcgdG8gd29yayBpbiB0aGlzIHNpdHVhdGlvbiAqLworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiKioqICVzXG4iLCBlcnJvci5tZXNzYWdlKTsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICBjb25uID0gZGJ1c19idXNfZ2V0IChEQlVTX0JVU19TRVNTSU9OLCAmZXJyb3IpOworCisjaWZkZWYgREJVU19FTkFCTEVfWDExX0FVVE9MQVVOQ0gKKyAgLyogSWYgWDExIGF1dG9sYXVuY2ggd2FzIGVuYWJsZWQsIHdlIGV4cGVjdCBkYnVzLWxhdW5jaCB0byBoYXZlIHdvcmtlZC4gKi8KKyAgaWYgKF9kYnVzX2dldGVudiAoIkRJU1BMQVkiKSAhPSBOVUxMICYmIGRidXNfZXJyb3JfaXNfc2V0ICgmZXJyb3IpKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIioqKiBGYWlsZWQgdG8gYXV0b2xhdW5jaCBzZXNzaW9uIGJ1czogJXNcbiIsCisgICAgICAgICAgICAgICBlcnJvci5tZXNzYWdlKTsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyNlbmRpZgorCisgIC8qIFdlIGRvbid0IG5lY2Vzc2FyaWx5IGV4cGVjdCBpdCB0byAqd29yayogd2l0aG91dCBYIChhbHRob3VnaCBpdCBtaWdodCAtCisgICAqIGZvciBpbnN0YW5jZSBvbiBNYWMgT1MgaXQgbWlnaHQgaGF2ZSB1c2VkIGxhdW5jaGQpLiBKdXN0IGNoZWNrIHRoYXQgdGhlCisgICAqIHJlc3VsdHMgYXJlIGNvbnNpc3RlbnQuICovCisKKyAgaWYgKGRidXNfZXJyb3JfaXNfc2V0ICgmZXJyb3IpICYmIGNvbm4gIT0gTlVMTCkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICIqKiogQXV0b2xhdW5jaGVkIHNlc3Npb24gYnVzLCBidXQgYW4gZXJyb3Igd2FzIHNldCFcbiIpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgIGlmICghZGJ1c19lcnJvcl9pc19zZXQgKCZlcnJvcikgJiYgY29ubiA9PSBOVUxMKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIioqKiBGYWlsZWQgdG8gYXV0b2xhdW5jaCBzZXNzaW9uIGJ1cyBidXQgbm8gZXJyb3Igd2FzIHNldFxuIik7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90ZXN0L25hbWUtdGVzdC90ZXN0LWlkcy5jIGIvdGVzdC9uYW1lLXRlc3QvdGVzdC1pZHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2I3MWYxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9uYW1lLXRlc3QvdGVzdC1pZHMuYwpAQCAtMCwwICsxLDcyIEBACisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtY29ubmVjdGlvbi1pbnRlcm5hbC5oPgorI2lmZGVmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBkaWUgKGNvbnN0IGNoYXIgKm1lc3NhZ2UpIF9EQlVTX0dOVUNfTk9SRVRVUk47CisKK3N0YXRpYyB2b2lkCitkaWUgKGNvbnN0IGNoYXIgKm1lc3NhZ2UpCit7CisgIHByaW50ZiAoIkJhaWwgb3V0ISB0ZXN0LWlkczogJXNcbiIsIG1lc3NhZ2UpOworICBleGl0ICgxKTsKK30KKworc3RhdGljIGludCB0ZXN0X251bSA9IDA7CisKKy8qIFRoaXMgdGVzdCBvdXRwdXRzIFRBUCBzeW50YXg6IGh0dHA6Ly90ZXN0YW55dGhpbmcub3JnLyAqLworaW50CittYWluIChpbnQgICAgYXJnYywKKyAgICAgIGNoYXIgKiphcmd2KQoreworICBEQnVzRXJyb3IgZXJyb3I7CisgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uOworICBjaGFyICppZDsKKyAgY2hhciAqc2VydmVyX2lkOworCisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKyAgY29ubmVjdGlvbiA9IGRidXNfYnVzX2dldCAoREJVU19CVVNfU0VTU0lPTiwgJmVycm9yKTsKKyAgaWYgKGNvbm5lY3Rpb24gPT0gTlVMTCkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICIqKiogRmFpbGVkIHRvIG9wZW4gY29ubmVjdGlvbiB0byBzeXN0ZW0gYnVzOiAlc1xuIiwKKyAgICAgICAgICAgICAgIGVycm9yLm1lc3NhZ2UpOworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICBwcmludGYgKCJvayAlZCAtIGNvbm5lY3RlZCB0byBzZXNzaW9uIGJ1c1xuIiwgKyt0ZXN0X251bSk7CisKKyAgc2VydmVyX2lkID0gZGJ1c19jb25uZWN0aW9uX2dldF9zZXJ2ZXJfaWQgKGNvbm5lY3Rpb24pOworCisgIGlmIChzZXJ2ZXJfaWQgPT0gTlVMTCkKKyAgICBkaWUgKCJObyBidXMgc2VydmVyIElEIHJldHJpZXZlZFxuIik7CisKKyAgcHJpbnRmICgib2sgJWQgLSBzZXNzaW9uIGJ1cyBzZXJ2ZXIgSUQgaXMgJXNcbiIsICsrdGVzdF9udW0sIHNlcnZlcl9pZCk7CisKKyAgaWYgKHN0cmxlbiAoc2VydmVyX2lkKSAhPSAzMikKKyAgICBkaWUgKCJCdXMgc2VydmVyIGlkIHNob3VsZCBoYXZlIGxlbmd0aCAzMlxuIik7CisKKyAgcHJpbnRmICgib2sgJWQgLSBzZXNzaW9uIGJ1cyBzZXJ2ZXIgSUQgbGVuZ3RoIGlzIDMyXG4iLCArK3Rlc3RfbnVtKTsKKworICBkYnVzX2ZyZWUgKHNlcnZlcl9pZCk7CisKKyAgaWQgPSBkYnVzX2J1c19nZXRfaWQgKGNvbm5lY3Rpb24sIE5VTEwpOworICBpZiAoaWQgPT0gTlVMTCkKKyAgICBkaWUgKCJObyBidXMgSUQgcmV0cmlldmVkXG4iKTsKKworICBwcmludGYgKCJvayAlZCAtIHNlc3Npb24gYnVzIElEIGlzICVzXG4iLCArK3Rlc3RfbnVtLCBpZCk7CisKKyAgaWYgKHN0cmxlbiAoaWQpICE9IDMyKQorICAgIGRpZSAoIkJ1cyBJRCBzaG91bGQgaGF2ZSBsZW5ndGggMzJcbiIpOworCisgIHByaW50ZiAoIm9rICVkIC0gc2Vzc2lvbiBidXMgSUQgbGVuZ3RoIGlzIDMyXG4iLCArK3Rlc3RfbnVtKTsKKworICBkYnVzX2ZyZWUgKGlkKTsgIAorCisgIHByaW50ZiAoIjEuLiVkXG4iLCB0ZXN0X251bSk7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9uYW1lLXRlc3QvdGVzdC1wZW5kaW5nLWNhbGwtZGlzY29ubmVjdGVkLmMgYi90ZXN0L25hbWUtdGVzdC90ZXN0LXBlbmRpbmctY2FsbC1kaXNjb25uZWN0ZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmY0MjQzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9uYW1lLXRlc3QvdGVzdC1wZW5kaW5nLWNhbGwtZGlzY29ubmVjdGVkLmMKQEAgLTAsMCArMSwxMTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAwNiBSZWQgSGF0IEluYy4KKyAqIENvcHlyaWdodCDCqSAyMDE3IFNoaW4taWNoaSBNT1JJVEEgPHNoaW4xbW9yaXRhQGdtYWlsLmNvbT4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMKKyAqICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sCisgKiBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLAorICogcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwKKyAqIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCisgKiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQorICogaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworLyoqCisqIFRlc3QgdG8gbWFrZSBzdXJlIHRoYXQgcGVuZGluZyBjYWxscyB1bnJlZiBlcnJvciBtZXNzYWdlcworKiB3aGVuIGJsb2NrZWQgYWZ0ZXIgZGlzY29ubmVjdGVkLgorKiovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc3lzZGVwcy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKK3N0YXRpYyBzaXplX3QgY291bnQgPSAwOworCitzdGF0aWMgdm9pZAorZnJlZV9kYXRhICh2b2lkICpkYXRhKQoreworICAtLWNvdW50OworICBwcmludGYgKCIjIEZyZWVkOiAlc1xuIiwgKGNvbnN0IGNoYXIqKWRhdGEpOworfQorCisvKiBUaGlzIHRlc3Qgb3V0cHV0cyBUQVAgc3ludGF4OiBodHRwOi8vdGVzdGFueXRoaW5nLm9yZy8gKi8KK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgZGJ1c19pbnQzMl90IHNsb3RfY29ubmVjdGlvbiA9IC0xOworICBkYnVzX2ludDMyX3Qgc2xvdF9tZXNzYWdlID0gLTE7CisgIGRidXNfaW50MzJfdCBzbG90X3BlbmRpbmcgPSAtMTsKKyAgREJ1c0Vycm9yIGVycm9yOworICBEQnVzQ29ubmVjdGlvbiAqY29ubjsKKyAgREJ1c01lc3NhZ2UgKm1ldGhvZDsKKyAgREJ1c1BlbmRpbmdDYWxsICpwZW5kaW5nOworICBEQnVzTWVzc2FnZSAqcmVwbHk7CisKKyAgcHJpbnRmICgiIyBUZXN0aW5nIHBlbmRpbmcgY2FsbCBlcnJvclxuIik7CisKKyAgZGJ1c19jb25uZWN0aW9uX2FsbG9jYXRlX2RhdGFfc2xvdCAoJnNsb3RfY29ubmVjdGlvbik7CisgIGRidXNfbWVzc2FnZV9hbGxvY2F0ZV9kYXRhX3Nsb3QgKCZzbG90X21lc3NhZ2UpOworICBkYnVzX3BlbmRpbmdfY2FsbF9hbGxvY2F0ZV9kYXRhX3Nsb3QgKCZzbG90X3BlbmRpbmcpOworCisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKyAgY29ubiA9IGRidXNfYnVzX2dldF9wcml2YXRlIChEQlVTX0JVU19TRVNTSU9OLCAmZXJyb3IpOworICBkYnVzX2Nvbm5lY3Rpb25fc2V0X2RhdGEgKGNvbm4sIHNsb3RfY29ubmVjdGlvbiwgKHZvaWQqKSJjb25uZWN0aW9uIiwgZnJlZV9kYXRhKTsKKyAgKytjb3VudDsKKyAgZGJ1c19jb25uZWN0aW9uX3NldF9leGl0X29uX2Rpc2Nvbm5lY3QgKGNvbm4sIEZBTFNFKTsKKworICBtZXRob2QgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsICgib3JnLmZyZWVkZXNrdG9wLlRlc3RTdWl0ZUVjaG9TZXJ2aWNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9vcmcvZnJlZWRlc2t0b3AvVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5UZXN0U3VpdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhpdCIpOworICBkYnVzX21lc3NhZ2Vfc2V0X2RhdGEgKG1ldGhvZCwgc2xvdF9tZXNzYWdlLCAodm9pZCopIm1ldGhvZCIsIGZyZWVfZGF0YSk7CisgICsrY291bnQ7CisKKyAgZGJ1c19jb25uZWN0aW9uX3NlbmRfd2l0aF9yZXBseSAoY29ubiwgbWV0aG9kLCAmcGVuZGluZywgLTEpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1ldGhvZCk7CisgIGRidXNfcGVuZGluZ19jYWxsX3NldF9kYXRhIChwZW5kaW5nLCBzbG90X3BlbmRpbmcsICh2b2lkKikicGVuZGluZyIsIGZyZWVfZGF0YSk7CisgICsrY291bnQ7CisKKyAgZGJ1c19jb25uZWN0aW9uX2Nsb3NlIChjb25uKTsKKworICBkYnVzX3BlbmRpbmdfY2FsbF9ibG9jayAocGVuZGluZyk7CisgIHJlcGx5ID0gZGJ1c19wZW5kaW5nX2NhbGxfc3RlYWxfcmVwbHkgKHBlbmRpbmcpOworICBkYnVzX3BlbmRpbmdfY2FsbF91bnJlZiAocGVuZGluZyk7CisgIGlmIChyZXBseSA9PSBOVUxMKQorICAgIHsKKyAgICAgIHByaW50ZiAoIkJhaWwgb3V0ISBSZXBseSBpcyBOVUxMICoqKlxuIik7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisgIGRidXNfbWVzc2FnZV9zZXRfZGF0YSAocmVwbHksIHNsb3RfbWVzc2FnZSwgKHZvaWQqKSJyZXBseSIsIGZyZWVfZGF0YSk7CisgICsrY291bnQ7CisgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKHJlcGx5KSAhPSBEQlVTX01FU1NBR0VfVFlQRV9FUlJPUikKKyAgICB7CisgICAgICBwcmludGYgKCJCYWlsIG91dCEgUmVwbHkgaXMgbm90IGVycm9yICoqKlxuIik7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworCisgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoY29ubik7CisKKyAgZGJ1c19jb25uZWN0aW9uX2ZyZWVfZGF0YV9zbG90ICgmc2xvdF9jb25uZWN0aW9uKTsKKyAgZGJ1c19tZXNzYWdlX2ZyZWVfZGF0YV9zbG90ICgmc2xvdF9tZXNzYWdlKTsKKyAgZGJ1c19wZW5kaW5nX2NhbGxfZnJlZV9kYXRhX3Nsb3QgKCZzbG90X3BlbmRpbmcpOworCisgIGlmIChjb3VudCAhPSAwKQorICAgIHsKKyAgICAgIHByaW50ZiAoIm5vdCBvayAjIE5vdCBhbGwgcmVmcyB3ZXJlIHVucmVmZWQgKioqXG4iKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHByaW50ZiAoIm9rXG4jIFRlc3RpbmcgY29tcGxldGVkXG4xLi4xXG4iKTsKKyAgICAgIGV4aXQgKDApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvbmFtZS10ZXN0L3Rlc3QtcGVuZGluZy1jYWxsLWRpc3BhdGNoLmMgYi90ZXN0L25hbWUtdGVzdC90ZXN0LXBlbmRpbmctY2FsbC1kaXNwYXRjaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmODA4NjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L25hbWUtdGVzdC90ZXN0LXBlbmRpbmctY2FsbC1kaXNwYXRjaC5jCkBAIC0wLDAgKzEsMTUzIEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMDYgUmVkIEhhdCBJbmMuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzCisgKiAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLAorICogaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwKKyAqIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsCisgKiBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAorICogc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKKyAqIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKy8qKgorKiBUZXN0IHRvIG1ha2Ugc3VyZSB3ZSBkb24ndCBnZXQgc3R1Y2sgcG9sbGluZyBhIGRidXMgY29ubmVjdGlvbgorKiB3aGljaCBoYXMgbm8gZGF0YSBvbiB0aGUgc29ja2V0LiAgVGhpcyB3YXMgYW4gaXNzdWUgd2hlcmUKKyogb25lIHBlbmRpbmcgY2FsbCB3b3VsZCByZWFkIGFsbCB0aGUgZGF0YSBvZmYgdGhlIGJ1cworKiBhbmQgdGhlIHNlY29uZCBwZW5kaW5nIGNhbGwgd291bGQgbm90IGNoZWNrIHRvIHNlZQorKiBpZiBpdHMgZGF0YSBoYWQgYWxyZWFkeSBiZWVuIHJlYWQgYmVmb3JlIHBvbGxpbmcgdGhlIGNvbm5lY3Rpb24KKyogYW5kIGJsb2NraW5nLgorKiovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtc3lzZGVwcy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKK3N0YXRpYyB2b2lkCitfcnVuX2l0ZXJhdGlvbiAoREJ1c0Nvbm5lY3Rpb24gKmNvbm4pCit7CisgIERCdXNQZW5kaW5nQ2FsbCAqZWNob19wZW5kaW5nOworICBEQnVzUGVuZGluZ0NhbGwgKmRidXNfcGVuZGluZzsKKyAgREJ1c01lc3NhZ2UgKm1ldGhvZDsKKyAgREJ1c01lc3NhZ2UgKnJlcGx5OworICBjb25zdCBjaGFyICplY2hvID0gImVjaG8iOworCisgIC8qIHNlbmQgdGhlIGZpcnN0IG1lc3NhZ2UgKi8KKyAgbWV0aG9kID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoIm9yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZUVjaG9TZXJ2aWNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9vcmcvZnJlZWRlc2t0b3AvVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5UZXN0U3VpdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRWNobyIpOworCisgIGlmICghZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChtZXRob2QsIERCVVNfVFlQRV9TVFJJTkcsICZlY2hvLCBOVUxMKSkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJCYWlsIG91dCEgRmFpbGVkIHRvIGFwcGVuZCBhcmd1bWVudHM6IE9PTVxuIik7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgZGJ1c19jb25uZWN0aW9uX3NlbmRfd2l0aF9yZXBseSAoY29ubiwgbWV0aG9kLCAmZWNob19wZW5kaW5nLCAtMSk7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobWV0aG9kKTsKKyAgCisgIC8qIHNlbmQgdGhlIHNlY29uZCBtZXNzYWdlICovCisgIG1ldGhvZCA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKERCVVNfU0VSVklDRV9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1BBVEhfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5JbnRyb3NwZWN0YWJsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnRyb3NwZWN0Iik7CisKKyAgZGJ1c19jb25uZWN0aW9uX3NlbmRfd2l0aF9yZXBseSAoY29ubiwgbWV0aG9kLCAmZGJ1c19wZW5kaW5nLCAtMSk7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobWV0aG9kKTsKKworICAvKiBibG9jayBvbiB0aGUgc2Vjb25kIG1lc3NhZ2UgKHNob3VsZCByZXR1cm4gaW1tZWRpYXRlbHkpICovCisgIGRidXNfcGVuZGluZ19jYWxsX2Jsb2NrIChkYnVzX3BlbmRpbmcpOworCisgIC8qIGJsb2NrIG9uIHRoZSBmaXJzdCBtZXNzYWdlICovCisgIC8qIGlmIGl0IGRvZXMgbm90IHJldHVybiBpbW1lZGlhdGVseSBjaGFuY2VzIAorICAgICBhcmUgd2UgaGl0IHRoZSBibG9jayBpbiBwb2xsIGJ1ZyAqLworICBkYnVzX3BlbmRpbmdfY2FsbF9ibG9jayAoZWNob19wZW5kaW5nKTsKKworICAvKiBjaGVjayB0aGUgcmVwbHkgb25seSB0byBtYWtlIHN1cmUgd2UKKyAgICAgYXJlIG5vdCBnZXR0aW5nIGVycm9ycyB1bnJlbGF0ZWQKKyAgICAgdG8gdGhlIGJsb2NrIGluIHBvbGwgYnVnICovCisgIHJlcGx5ID0gZGJ1c19wZW5kaW5nX2NhbGxfc3RlYWxfcmVwbHkgKGVjaG9fcGVuZGluZyk7CisKKyAgaWYgKHJlcGx5ID09IE5VTEwpCisgICAgeworICAgICAgcHJpbnRmICgiQmFpbCBvdXQhIFJlcGx5IGlzIE5VTEwgKioqXG4iKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICBpZiAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChyZXBseSkgPT0gREJVU19NRVNTQUdFX1RZUEVfRVJST1IpCisgICAgeworICAgICAgcHJpbnRmICgiQmFpbCBvdXQhIFJlcGx5IGlzIGVycm9yOiAlcyAqKipcbiIsIGRidXNfbWVzc2FnZV9nZXRfZXJyb3JfbmFtZSAocmVwbHkpKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0gCisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgIGRidXNfcGVuZGluZ19jYWxsX3VucmVmIChkYnVzX3BlbmRpbmcpOworICBkYnVzX3BlbmRpbmdfY2FsbF91bnJlZiAoZWNob19wZW5kaW5nKTsKKyAgCit9CisKKy8qIFRoaXMgdGVzdCBvdXRwdXRzIFRBUCBzeW50YXg6IGh0dHA6Ly90ZXN0YW55dGhpbmcub3JnLyAqLworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICBsb25nIHN0YXJ0X3R2X3NlYywgc3RhcnRfdHZfdXNlYzsKKyAgbG9uZyBlbmRfdHZfc2VjLCBlbmRfdHZfdXNlYzsKKyAgaW50IGk7CisgIERCdXNNZXNzYWdlICptZXRob2Q7CisgIERCdXNDb25uZWN0aW9uICpjb25uOworICBEQnVzRXJyb3IgZXJyb3I7CisKKyAgLyogVGltZSBlYWNoIGl0ZXJhdGlvbiBhbmQgbWFrZSBzdXJlIGl0IGRvZXNuJ3QgdGFrZSBtb3JlIHRoYW4gNSBzZWNvbmRzCisgICAgIHRvIGNvbXBsZXRlLiAgT3V0c2lkZSBpbmZsdWVuY2VzIG1heSBjYXVzZSBjb25uZWN0aW9ucyB0byB0YWtlIGxvbmdlcgorICAgICBidXQgaWYgaXQgZG9lcyBhbmQgd2UgYXJlIHN0dWNrIGluIGEgcG9sbCBjYWxsIHRoZW4gd2Uga25vdyB0aGUgCisgICAgIHN0dWNrIGluIHBvbGwgYnVnIGhhcyBjb21lIGJhY2sgdG8gaGF1bnQgdXMgKi8KKworICBwcmludGYgKCIjIFRlc3Rpbmcgc3R1Y2sgaW4gcG9sbFxuIik7CisKKyAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworCisgIGNvbm4gPSBkYnVzX2J1c19nZXQgKERCVVNfQlVTX1NFU1NJT04sICZlcnJvcik7CisKKyAgLyogcnVuIDEwMCB0aW1lcyB0byBtYWtlIHN1cmUgKi8KKyAgZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKQorICAgIHsKKyAgICAgIGxvbmcgZGVsdGE7CisgICAgICAKKyAgICAgIF9kYnVzX2dldF9tb25vdG9uaWNfdGltZSAoJnN0YXJ0X3R2X3NlYywgJnN0YXJ0X3R2X3VzZWMpOworICAgICAgX3J1bl9pdGVyYXRpb24gKGNvbm4pOworICAgICAgX2RidXNfZ2V0X21vbm90b25pY190aW1lICgmZW5kX3R2X3NlYywgJmVuZF90dl91c2VjKTsKKworICAgICAgLyogd2UganVzdCBjYXJlIGFib3V0IHNlY29uZHMgKi8KKyAgICAgIGRlbHRhID0gZW5kX3R2X3NlYyAtIHN0YXJ0X3R2X3NlYzsKKyAgICAgIHByaW50ZiAoIm9rICVkIC0gJWxpc1xuIiwgaSArIDEsIGRlbHRhKTsKKyAgICAgIGlmIChkZWx0YSA+PSA1KQorICAgICAgICB7CisJICBwcmludGYgKCJCYWlsIG91dCEgTG9va3MgbGlrZSB3ZSBtaWdodCBoYXZlIGJlZW4gYmUgc3R1Y2sgaW4gcG9sbCAqKipcbiIpOworCSAgZXhpdCAoMSk7CisJfQorICAgIH0KKyAKKyAgbWV0aG9kID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoIm9yZy5mcmVlZGVza3RvcC5UZXN0U3VpdGVFY2hvU2VydmljZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvb3JnL2ZyZWVkZXNrdG9wL1Rlc3RTdWl0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4aXQiKTsKKyAgZGJ1c19jb25uZWN0aW9uX3NlbmQgKGNvbm4sIG1ldGhvZCwgTlVMTCk7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobWV0aG9kKTsKKworICBwcmludGYgKCIjIFRlc3RpbmcgY29tcGxldGVkXG4xLi4lZFxuIiwgaSk7CisgIGV4aXQgKDApOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9uYW1lLXRlc3QvdGVzdC1wZW5kaW5nLWNhbGwtdGltZW91dC5jIGIvdGVzdC9uYW1lLXRlc3QvdGVzdC1wZW5kaW5nLWNhbGwtdGltZW91dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyMDRkYjAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L25hbWUtdGVzdC90ZXN0LXBlbmRpbmctY2FsbC10aW1lb3V0LmMKQEAgLTAsMCArMSwxMDkgQEAKKy8qKgorKiBUZXN0IHRvIG1ha2Ugc3VyZSB0aGF0IHBlbmRpbmcgY2FsbHMgc3VjY2VlZCB3aGVuIGdpdmVuIGEgZGVmYXVsdCwKKyogc3BlY2lmaWMgYW5kIGluZmluaXRlIHRpbWVvdXQuCisqKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zeXNkZXBzLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworc3RhdGljIHZvaWQKK19tZXRob2RfY2FsbCAoREJ1c0Nvbm5lY3Rpb24gKmNvbm4sCisJICAgICAgaW50ICAgICAgICAgICAgIHRpbWVvdXRfbWlsbGlzZWNvbmRzKQoreworICBEQnVzUGVuZGluZ0NhbGwgKnBlbmRpbmc7CisgIERCdXNNZXNzYWdlICptZXRob2Q7CisgIERCdXNNZXNzYWdlICpyZXBseTsKKyAgY29uc3QgY2hhciAqZWNobyA9ICJlY2hvIjsKKworICAvKiBzZW5kIHRoZSBtZXNzYWdlICovCisgIG1ldGhvZCA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKCJvcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVFY2hvU2VydmljZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvb3JnL2ZyZWVkZXNrdG9wL1Rlc3RTdWl0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRlbGF5RWNobyIpOworCisgIGlmIChtZXRob2QgPT0gTlVMTCB8fAorICAgICAgIWRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAobWV0aG9kLCBEQlVTX1RZUEVfU1RSSU5HLCAmZWNobywgTlVMTCkgfHwKKyAgICAgICFkYnVzX2Nvbm5lY3Rpb25fc2VuZF93aXRoX3JlcGx5IChjb25uLCBtZXRob2QsICZwZW5kaW5nLCB0aW1lb3V0X21pbGxpc2Vjb25kcykpCisgICAgeworICAgICAgcHJpbnRmICgiQmFpbCBvdXQhIE9PTSB3aGVuIGJ1aWxkaW5nIGFuZCBzZW5kaW5nIG1lc3NhZ2UgKioqXG4iKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXRob2QpOworICAKKyAgLyogYmxvY2sgb24gdGhlIG1lc3NhZ2UgKi8KKyAgZGJ1c19wZW5kaW5nX2NhbGxfYmxvY2sgKHBlbmRpbmcpOworCisgIC8qIGNoZWNrIHRoZSByZXBseSBvbmx5IHRvIG1ha2Ugc3VyZSB3ZQorICAgICBhcmUgbm90IGdldHRpbmcgZXJyb3JzIHVucmVsYXRlZAorICAgICB0byB0aGUgYmxvY2sgaW4gcG9sbCBidWcgKi8KKyAgcmVwbHkgPSBkYnVzX3BlbmRpbmdfY2FsbF9zdGVhbF9yZXBseSAocGVuZGluZyk7CisKKyAgaWYgKHJlcGx5ID09IE5VTEwpCisgICAgeworICAgICAgcHJpbnRmICgiQmFpbCBvdXQhIFJlcGx5IGlzIE5VTEwgKioqXG4iKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICBpZiAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChyZXBseSkgPT0gREJVU19NRVNTQUdFX1RZUEVfRVJST1IpCisgICAgeworICAgICAgcHJpbnRmICgiQmFpbCBvdXQhIFJlcGx5IGlzIGVycm9yOiAlcyAqKipcbiIsIGRidXNfbWVzc2FnZV9nZXRfZXJyb3JfbmFtZSAocmVwbHkpKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0gCisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgIGRidXNfcGVuZGluZ19jYWxsX3VucmVmIChwZW5kaW5nKTsKK30KKworc3RhdGljIHZvaWQKK19ydW5faXRlcmF0aW9uIChEQnVzQ29ubmVjdGlvbiAqY29ubikKK3sKKyAgX21ldGhvZF9jYWxsIChjb25uLCAtMSk7CisgIF9tZXRob2RfY2FsbCAoY29ubiwgMTAwMDApOworICBfbWV0aG9kX2NhbGwgKGNvbm4sIElOVF9NQVgpOworfQorCisvKiBUaGlzIHRlc3Qgb3V0cHV0cyBUQVAgc3ludGF4OiBodHRwOi8vdGVzdGFueXRoaW5nLm9yZy8gKi8KK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgbG9uZyBzdGFydF90dl9zZWMsIHN0YXJ0X3R2X3VzZWM7CisgIGxvbmcgZW5kX3R2X3NlYywgZW5kX3R2X3VzZWM7CisgIGludCBpOworICBEQnVzTWVzc2FnZSAqbWV0aG9kOworICBEQnVzQ29ubmVjdGlvbiAqY29ubjsKKyAgREJ1c0Vycm9yIGVycm9yOworCisgIHByaW50ZiAoIiMgVGVzdGluZyBwZW5kaW5nIGNhbGwgdGltZW91dHNcbiIpOworCisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKworICBjb25uID0gZGJ1c19idXNfZ2V0IChEQlVTX0JVU19TRVNTSU9OLCAmZXJyb3IpOworCisgIC8qIHJ1biAxMDAgdGltZXMgdG8gbWFrZSBzdXJlICovCisgIGZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykKKyAgICB7CisgICAgICBsb25nIGRlbHRhOworICAgICAgCisgICAgICBfZGJ1c19nZXRfbW9ub3RvbmljX3RpbWUgKCZzdGFydF90dl9zZWMsICZzdGFydF90dl91c2VjKTsKKyAgICAgIF9ydW5faXRlcmF0aW9uIChjb25uKTsKKyAgICAgIF9kYnVzX2dldF9tb25vdG9uaWNfdGltZSAoJmVuZF90dl9zZWMsICZlbmRfdHZfdXNlYyk7CisKKyAgICAgIC8qIHdlIGp1c3QgY2FyZSBhYm91dCBzZWNvbmRzICovCisgICAgICBkZWx0YSA9IGVuZF90dl9zZWMgLSBzdGFydF90dl9zZWM7CisgICAgICBwcmludGYgKCJvayAlZCAtICVsaXNcbiIsIGkgKyAxLCBkZWx0YSk7CisgICAgfQorIAorICBtZXRob2QgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsICgib3JnLmZyZWVkZXNrdG9wLlRlc3RTdWl0ZUVjaG9TZXJ2aWNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9vcmcvZnJlZWRlc2t0b3AvVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5UZXN0U3VpdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhpdCIpOworICBkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoY29ubiwgbWV0aG9kLCBOVUxMKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtZXRob2QpOworCisgIHByaW50ZiAoIiMgVGVzdGluZyBjb21wbGV0ZWRcbjEuLiVkXG4iLCBpKTsKKyAgZXhpdCAoMCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L25hbWUtdGVzdC90ZXN0LXByaXZzZXJ2ZXItY2xpZW50LmMgYi90ZXN0L25hbWUtdGVzdC90ZXN0LXByaXZzZXJ2ZXItY2xpZW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2EyOTNmNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbmFtZS10ZXN0L3Rlc3QtcHJpdnNlcnZlci1jbGllbnQuYwpAQCAtMCwwICsxLDE4MyBAQAorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgIi4uL3Rlc3QtdXRpbHMuaCIKKworc3RhdGljIHZvaWQgZGllIChjb25zdCBjaGFyICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAuLi4pIF9EQlVTX0dOVUNfTk9SRVRVUk4gX0RCVVNfR05VQ19QUklOVEYgKDEsIDIpOworCitzdGF0aWMgdm9pZAorZGllIChjb25zdCBjaGFyICptZXNzYWdlLCAuLi4pCit7CisgIHZhX2xpc3QgYXJnczsKKyAgdmFfc3RhcnQgKGFyZ3MsIG1lc3NhZ2UpOworICB2ZnByaW50ZiAoc3RkZXJyLCBtZXNzYWdlLCBhcmdzKTsKKyAgdmFfZW5kIChhcmdzKTsKKyAgZXhpdCAoMSk7Cit9CisKKyNkZWZpbmUgUFJJVlNFUlZFUl9TRVJWSUNFICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGUuUHJpdlNlcnZlciIKKyNkZWZpbmUgUFJJVlNFUlZFUl9JTlRFUkZBQ0UgUFJJVlNFUlZFUl9TRVJWSUNFCisjZGVmaW5lIFBSSVZTRVJWRVJfRElFRF9SVUxFIFwKKyAgICAgICJ0eXBlPSdzaWduYWwnLHNlbmRlcj0nIiBEQlVTX1NFUlZJQ0VfREJVUyAiJywiIFwKKyAgICAgICJpbnRlcmZhY2U9JyIgREJVU19JTlRFUkZBQ0VfREJVUyAiJyxtZW1iZXI9J05hbWVPd25lckNoYW5nZWQnLCIgXAorICAgICAgImFyZzA9JyIgUFJJVlNFUlZFUl9TRVJWSUNFICInLGFyZzI9JyciCisKK3N0YXRpYyBEQnVzSGFuZGxlclJlc3VsdAorZmlsdGVyX3Nlc3Npb25fbWVzc2FnZSAoREJ1c0Nvbm5lY3Rpb24gICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICp1c2VyX2RhdGEpCit7CisgIGRidXNfYm9vbF90ICpzZXJ2aWNlX2RpZWRfcCA9IHVzZXJfZGF0YTsKKyAgY29uc3QgY2hhciAqbmFtZSwgKm9sZF9vd25lciwgKm5ld19vd25lcjsKKworICBpZiAoZGJ1c19tZXNzYWdlX2lzX3NpZ25hbCAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSU5URVJGQUNFX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTmFtZU93bmVyQ2hhbmdlZCIpICYmCisgICAgICBkYnVzX21lc3NhZ2VfaGFzX3NlbmRlciAobWVzc2FnZSwgREJVU19TRVJWSUNFX0RCVVMpICYmCisgICAgICBkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MgKG1lc3NhZ2UsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmb2xkX293bmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmbmV3X293bmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkgJiYKKyAgICAgIHN0cmNtcCAobmFtZSwgUFJJVlNFUlZFUl9TRVJWSUNFKSA9PSAwICYmCisgICAgICBvbGRfb3duZXJbMF0gIT0gJ1wwJyAmJgorICAgICAgbmV3X293bmVyWzBdID09ICdcMCcpCisgICAgeworICAgICAgKnNlcnZpY2VfZGllZF9wID0gVFJVRTsKKyAgICB9CisKKyAgcmV0dXJuIERCVVNfSEFORExFUl9SRVNVTFRfTk9UX1lFVF9IQU5ETEVEOworfQorCitzdGF0aWMgREJ1c0hhbmRsZXJSZXN1bHQgCitmaWx0ZXJfcHJpdmF0ZV9tZXNzYWdlIChEQnVzQ29ubmVjdGlvbiAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgKnVzZXJfZGF0YSkKK3sKKyAgZGJ1c19ib29sX3QgKnByaXZhdGVfY29ubl9sb3N0X3AgPSB1c2VyX2RhdGE7CisKKyAgaWYgKGRidXNfbWVzc2FnZV9pc19zaWduYWwgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0lOVEVSRkFDRV9MT0NBTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEaXNjb25uZWN0ZWQiKSkKKyAgICB7CisgICAgICAqcHJpdmF0ZV9jb25uX2xvc3RfcCA9IFRSVUU7CisgICAgfQorICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9OT1RfWUVUX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyB2b2lkCitvcGVuX3NodXRkb3duX3ByaXZhdGVfY29ubmVjdGlvbiAoZGJ1c19ib29sX3QgdXNlX2d1aWQpCit7CisgIERCdXNFcnJvciBlcnJvcjsKKyAgREJ1c0xvb3AgKmxvb3A7CisgIERCdXNDb25uZWN0aW9uICpzZXNzaW9uOworICBEQnVzTWVzc2FnZSAqbXNnOworICBEQnVzTWVzc2FnZSAqcmVwbHk7CisgIERCdXNDb25uZWN0aW9uICpwcml2Y29ubjsKKyAgY2hhciAqYWRkcjsKKyAgZGJ1c19ib29sX3Qgc2VydmljZV9kaWVkOworICBkYnVzX2Jvb2xfdCBwcml2YXRlX2Nvbm5fbG9zdDsKKworICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisgIHNlcnZpY2VfZGllZCA9IEZBTFNFOworICBwcml2YXRlX2Nvbm5fbG9zdCA9IEZBTFNFOworCisgIGxvb3AgPSBfZGJ1c19sb29wX25ldyAoKTsKKworICBzZXNzaW9uID0gZGJ1c19idXNfZ2V0IChEQlVTX0JVU19TRVNTSU9OLCAmZXJyb3IpOworICBpZiAoIXNlc3Npb24pCisgICAgZGllICgiY291bGRuJ3QgYWNjZXNzIHNlc3Npb24gYnVzXG4iKTsKKyAgZGJ1c19jb25uZWN0aW9uX3NldF9leGl0X29uX2Rpc2Nvbm5lY3QgKHNlc3Npb24sIEZBTFNFKTsKKyAgdGVzdF9jb25uZWN0aW9uX3NldHVwIChsb29wLCBzZXNzaW9uKTsKKworICBkYnVzX2J1c19hZGRfbWF0Y2ggKHNlc3Npb24sIFBSSVZTRVJWRVJfRElFRF9SVUxFLCAmZXJyb3IpOworICBpZiAoZGJ1c19lcnJvcl9pc19zZXQgKCZlcnJvcikpCisgICAgZGllICgiY291bGRuJ3QgYWRkIG1hdGNoIHJ1bGUgXCIlc1wiOiAlczogJXMiLCBQUklWU0VSVkVSX0RJRURfUlVMRSwKKyAgICAgICAgIGVycm9yLm5hbWUsIGVycm9yLm1lc3NhZ2UpOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX2FkZF9maWx0ZXIgKHNlc3Npb24sIGZpbHRlcl9zZXNzaW9uX21lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXJ2aWNlX2RpZWQsIE5VTEwpKQorICAgIGRpZSAoImNvdWxkbid0IGFkZCBmaWx0ZXIgdG8gc2Vzc2lvbiBidXNcbiIpOworCisgIG1zZyA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKFBSSVZTRVJWRVJfU0VSVklDRSwgIi8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUklWU0VSVkVSX0lOVEVSRkFDRSwgIkdldFByaXZhdGVBZGRyZXNzIik7CisgIGlmICghKHJlcGx5ID0gZGJ1c19jb25uZWN0aW9uX3NlbmRfd2l0aF9yZXBseV9hbmRfYmxvY2sgKHNlc3Npb24sIG1zZywgLTEsICZlcnJvcikpKQorICAgIGRpZSAoImNvdWxkbid0IHNlbmQgbWVzc2FnZTogJXNcbiIsIGVycm9yLm1lc3NhZ2UpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1zZyk7CisKKyAgaWYgKGRidXNfc2V0X2Vycm9yX2Zyb21fbWVzc2FnZSAoJmVycm9yLCByZXBseSkpCisgICAgZGllICgiJXM6ICVzIiwgZXJyb3IubmFtZSwgZXJyb3IubWVzc2FnZSk7CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MgKHJlcGx5LCAmZXJyb3IsIERCVVNfVFlQRV9TVFJJTkcsICZhZGRyLCBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgZGllICgiY291bGRuJ3QgcGFyc2UgbWVzc2FnZSByZXBseW1cbiIpOworICBwcmludGYgKCIjIGdvdCBwcml2YXRlIHRlbXAgYWRkcmVzcyAlc1xuIiwgYWRkcik7CisgIGFkZHIgPSBzdHJkdXAgKGFkZHIpOworICBpZiAoIXVzZV9ndWlkKQorICAgIHsKKyAgICAgIGNoYXIgKmNvbW1hID0gc3RycmNociAoYWRkciwgJywnKTsKKyAgICAgIGlmIChjb21tYSkKKyAgICAgICAgKmNvbW1hID0gJ1wwJzsKKyAgICB9CisgIHByaXZjb25uID0gZGJ1c19jb25uZWN0aW9uX29wZW4gKGFkZHIsICZlcnJvcik7CisgIGZyZWUgKGFkZHIpOworICBpZiAoIXByaXZjb25uKQorICAgIGRpZSAoImNvdWxkbid0IGNvbm5lY3QgdG8gc2VydmVyIGRpcmVjdCBjb25uZWN0aW9uOiAlc1xuIiwgZXJyb3IubWVzc2FnZSk7CisgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworCisgIGRidXNfY29ubmVjdGlvbl9zZXRfZXhpdF9vbl9kaXNjb25uZWN0IChwcml2Y29ubiwgRkFMU0UpOworICBpZiAoIWRidXNfY29ubmVjdGlvbl9hZGRfZmlsdGVyIChwcml2Y29ubiwgZmlsdGVyX3ByaXZhdGVfbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnByaXZhdGVfY29ubl9sb3N0LCBOVUxMKSkKKyAgICBkaWUgKCJjb3VsZG4ndCBhZGQgZmlsdGVyIHRvIHByaXZhdGUgY29ubmVjdGlvblxuIik7CisgIHRlc3RfY29ubmVjdGlvbl9zZXR1cCAobG9vcCwgcHJpdmNvbm4pOworCisgIG1zZyA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKFBSSVZTRVJWRVJfU0VSVklDRSwgIi8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUklWU0VSVkVSX0lOVEVSRkFDRSwgIlF1aXQiKTsKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoc2Vzc2lvbiwgbXNnLCBOVUxMKSkKKyAgICBkaWUgKCJjb3VsZG4ndCBzZW5kIFF1aXQgbWVzc2FnZVxuIik7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobXNnKTsKKworICB3aGlsZSAoIXNlcnZpY2VfZGllZCB8fCAhcHJpdmF0ZV9jb25uX2xvc3QpCisgICAgX2RidXNfbG9vcF9pdGVyYXRlIChsb29wLCBUUlVFKTsKKworICBkYnVzX2Nvbm5lY3Rpb25fcmVtb3ZlX2ZpbHRlciAoc2Vzc2lvbiwgZmlsdGVyX3Nlc3Npb25fbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXJ2aWNlX2RpZWQpOworICBkYnVzX2J1c19yZW1vdmVfbWF0Y2ggKHNlc3Npb24sIFBSSVZTRVJWRVJfRElFRF9SVUxFLCBOVUxMKTsKKyAgdGVzdF9jb25uZWN0aW9uX3NodXRkb3duIChsb29wLCBzZXNzaW9uKTsKKyAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChzZXNzaW9uKTsKKworICB0ZXN0X2Nvbm5lY3Rpb25fc2h1dGRvd24gKGxvb3AsIHByaXZjb25uKTsKKyAgZGJ1c19jb25uZWN0aW9uX3JlbW92ZV9maWx0ZXIgKHByaXZjb25uLCBmaWx0ZXJfcHJpdmF0ZV9tZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnByaXZhdGVfY29ubl9sb3N0KTsKKyAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChwcml2Y29ubik7CisKKyAgX2RidXNfbG9vcF91bnJlZiAobG9vcCk7Cit9CisKKy8qIFRoaXMgdGVzdCBvdXRwdXRzIFRBUCBzeW50YXg6IGh0dHA6Ly90ZXN0YW55dGhpbmcub3JnLyAqLworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICBpbnQgdGVzdF9udW0gPSAwOworCisgIG9wZW5fc2h1dGRvd25fcHJpdmF0ZV9jb25uZWN0aW9uIChUUlVFKTsKKworICBkYnVzX3NodXRkb3duICgpOworICBwcmludGYgKCJvayAlZFxuIiwgKyt0ZXN0X251bSk7CisKKyAgb3Blbl9zaHV0ZG93bl9wcml2YXRlX2Nvbm5lY3Rpb24gKFRSVUUpOworCisgIGRidXNfc2h1dGRvd24gKCk7CisgIHByaW50ZiAoIm9rICVkXG4iLCArK3Rlc3RfbnVtKTsKKworICBvcGVuX3NodXRkb3duX3ByaXZhdGVfY29ubmVjdGlvbiAoRkFMU0UpOworCisgIGRidXNfc2h1dGRvd24gKCk7CisgIHByaW50ZiAoIm9rICVkXG4iLCArK3Rlc3RfbnVtKTsKKworICBvcGVuX3NodXRkb3duX3ByaXZhdGVfY29ubmVjdGlvbiAoRkFMU0UpOworCisgIGRidXNfc2h1dGRvd24gKCk7CisgIHByaW50ZiAoIm9rICVkXG4iLCArK3Rlc3RfbnVtKTsKKworICBwcmludGYgKCIxLi4lZFxuIiwgdGVzdF9udW0pOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvbmFtZS10ZXN0L3Rlc3QtcHJpdnNlcnZlci5jIGIvdGVzdC9uYW1lLXRlc3QvdGVzdC1wcml2c2VydmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZkZTczNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbmFtZS10ZXN0L3Rlc3QtcHJpdnNlcnZlci5jCkBAIC0wLDAgKzEsMTM1IEBACisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiLi4vdGVzdC11dGlscy5oIgorCitzdGF0aWMgdm9pZCBkaWUgKGNvbnN0IGNoYXIgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgIC4uLikgX0RCVVNfR05VQ19OT1JFVFVSTiBfREJVU19HTlVDX1BSSU5URiAoMSwgMik7CisKK3N0YXRpYyB2b2lkCitkaWUgKGNvbnN0IGNoYXIgKm1lc3NhZ2UsIC4uLikKK3sKKyAgdmFfbGlzdCBhcmdzOworICB2YV9zdGFydCAoYXJncywgbWVzc2FnZSk7CisgIHZmcHJpbnRmIChzdGRlcnIsIG1lc3NhZ2UsIGFyZ3MpOworICB2YV9lbmQgKGFyZ3MpOworICBleGl0ICgxKTsKK30KKwordHlwZWRlZiBzdHJ1Y3QgVGVzdFNlcnZpY2VEYXRhIFRlc3RTZXJ2aWNlRGF0YTsKKworc3RydWN0IFRlc3RTZXJ2aWNlRGF0YQoreworICBEQnVzTG9vcCAqbG9vcDsKKyAgY2hhciAqcHJpdmF0ZV9hZGRyOworfTsKKworc3RhdGljIHZvaWQKK25ld19jb25uZWN0aW9uX2NhbGxiYWNrIChEQnVzU2VydmVyICAgICAqc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpuZXdfY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAqZGF0YSkKK3sKKyAgVGVzdFNlcnZpY2VEYXRhICp0ZXN0ZGF0YSA9IGRhdGE7CisKKyAgaWYgKCF0ZXN0X2Nvbm5lY3Rpb25fc2V0dXAgKHRlc3RkYXRhLT5sb29wLCBuZXdfY29ubmVjdGlvbikpCisgICAgZGJ1c19jb25uZWN0aW9uX2Nsb3NlIChuZXdfY29ubmVjdGlvbik7Cit9CisKK3N0YXRpYyBEQnVzSGFuZGxlclJlc3VsdCAKK2ZpbHRlcl9zZXNzaW9uX21lc3NhZ2UgKERCdXNDb25uZWN0aW9uICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAqdXNlcl9kYXRhKQoreworICBUZXN0U2VydmljZURhdGEgKnRlc3RkYXRhID0gdXNlcl9kYXRhOworCisgIGlmIChkYnVzX21lc3NhZ2VfaXNfbWV0aG9kX2NhbGwgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGUuUHJpdlNlcnZlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHZXRQcml2YXRlQWRkcmVzcyIpKQorICAgIHsKKyAgICAgICBEQnVzTWVzc2FnZSAqcmVwbHk7CisKKyAgICAgICByZXBseSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX3JldHVybiAobWVzc2FnZSk7CisgICAgICAgaWYgKHJlcGx5ID09IE5VTEwpCisgICAgICAgICBkaWUgKCJPT00iKTsKKyAgICAgICBpZiAoIWRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAocmVwbHksIERCVVNfVFlQRV9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYodGVzdGRhdGEtPnByaXZhdGVfYWRkciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICAgICAgIGRpZSAoIk9PTSIpOworCisgICAgICAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoY29ubmVjdGlvbiwgcmVwbHksIE5VTEwpKQorICAgICAgICAgZGllICgiRXJyb3Igc2VuZGluZyBtZXNzYWdlIik7CisKKyAgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKworICAgICAgIHJldHVybiBEQlVTX0hBTkRMRVJfUkVTVUxUX0hBTkRMRUQ7CisgICAgfQorICBlbHNlIGlmIChkYnVzX21lc3NhZ2VfaXNfbWV0aG9kX2NhbGwgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGUuUHJpdlNlcnZlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJRdWl0IikpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAic2VydmVyIGV4aXRpbmcgbG9vcFxuIik7CisgICAgICBfZGJ1c19sb29wX3F1aXQgKHRlc3RkYXRhLT5sb29wKTsKKyAgICAgIHJldHVybiBEQlVTX0hBTkRMRVJfUkVTVUxUX0hBTkRMRUQ7CisgICAgfQorICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9OT1RfWUVUX0hBTkRMRUQ7Cit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgREJ1c1NlcnZlciAqc2VydmVyOworICBEQnVzRXJyb3IgZXJyb3I7CisgIERCdXNMb29wICpsb29wOworICBEQnVzQ29ubmVjdGlvbiAqc2Vzc2lvbjsKKyAgVGVzdFNlcnZpY2VEYXRhICp0ZXN0ZGF0YTsKKworICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisKKyAgbG9vcCA9IF9kYnVzX2xvb3BfbmV3ICgpOworCisgIHRlc3RkYXRhID0gZGJ1c19uZXcgKFRlc3RTZXJ2aWNlRGF0YSwgMSk7CisgIHRlc3RkYXRhLT5sb29wID0gbG9vcDsKKworICBzZXNzaW9uID0gZGJ1c19idXNfZ2V0IChEQlVTX0JVU19TRVNTSU9OLCAmZXJyb3IpOworICBpZiAoIXNlc3Npb24pCisgICAgZGllICgiY291bGRuJ3QgYWNjZXNzIHNlc3Npb24gYnVzIik7CisKKyAgdGVzdF9jb25uZWN0aW9uX3NldHVwIChsb29wLCBzZXNzaW9uKTsKKworICBkYnVzX2J1c19yZXF1ZXN0X25hbWUgKHNlc3Npb24sICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGUuUHJpdlNlcnZlciIsIDAsICZlcnJvcik7CisgIGlmIChkYnVzX2Vycm9yX2lzX3NldCAoJmVycm9yKSkKKyAgICBkaWUgKCJjb3VsZG4ndCByZXF1ZXN0IG5hbWU6ICVzIiwgZXJyb3IubWVzc2FnZSk7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fYWRkX2ZpbHRlciAoc2Vzc2lvbiwgZmlsdGVyX3Nlc3Npb25fbWVzc2FnZSwgdGVzdGRhdGEsIE5VTEwpKQorICAgIGRpZSAoImNvdWxkbid0IGFkZCBmaWx0ZXIiKTsKKworI2lmZGVmIERCVVNfQ01BS0UKKyAgc2VydmVyID0gZGJ1c19zZXJ2ZXJfbGlzdGVuIChURVNUX0xJU1RFTiwgJmVycm9yKTsKKyNlbHNlCisgIHNlcnZlciA9IGRidXNfc2VydmVyX2xpc3RlbiAoInVuaXg6dG1wZGlyPS90bXAiLCAmZXJyb3IpOworI2VuZGlmCisgIGlmICghc2VydmVyKQorICAgIGRpZSAoIiVzIiwgZXJyb3IubWVzc2FnZSk7CisgIHRlc3RkYXRhLT5wcml2YXRlX2FkZHIgPSBkYnVzX3NlcnZlcl9nZXRfYWRkcmVzcyAoc2VydmVyKTsKKyAgZnByaW50ZiAoc3RkZXJyLCAidGVzdCBzZXJ2ZXIgbGlzdGVuaW5nIG9uICVzXG4iLCB0ZXN0ZGF0YS0+cHJpdmF0ZV9hZGRyKTsKKworICBkYnVzX3NlcnZlcl9zZXRfbmV3X2Nvbm5lY3Rpb25fZnVuY3Rpb24gKHNlcnZlciwgbmV3X2Nvbm5lY3Rpb25fY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdGRhdGEsIE5VTEwpOworCisgIGlmICghdGVzdF9zZXJ2ZXJfc2V0dXAgKGxvb3AsIHNlcnZlcikpCisgICAgZGllICgic2VydmVyIHNldHVwIGZhaWxlZCIpOworCisgIGZwcmludGYgKHN0ZGVyciwgInNlcnZlciBydW5uaW5nIG1haW5sb29wXG4iKTsKKyAgX2RidXNfbG9vcF9ydW4gKGxvb3ApOworICBmcHJpbnRmIChzdGRlcnIsICJzZXJ2ZXIgbWFpbmxvb3AgcXVpdFxuIik7CisKKyAgdGVzdF9zZXJ2ZXJfc2h1dGRvd24gKGxvb3AsIHNlcnZlcik7CisKKyAgdGVzdF9jb25uZWN0aW9uX3NodXRkb3duIChsb29wLCBzZXNzaW9uKTsKKworICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKHNlc3Npb24pOworCisgIF9kYnVzX2xvb3BfdW5yZWYgKGxvb3ApOworCisgIGRidXNfZnJlZSAodGVzdGRhdGEpOworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9uYW1lLXRlc3QvdGVzdC1zaHV0ZG93bi5jIGIvdGVzdC9uYW1lLXRlc3QvdGVzdC1zaHV0ZG93bi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3MGJmZDMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L25hbWUtdGVzdC90ZXN0LXNodXRkb3duLmMKQEAgLTAsMCArMSw3NSBAQAorCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiLi4vdGVzdC11dGlscy5oIgorCitzdGF0aWMgREJ1c0xvb3AgKmxvb3A7CisKK3N0YXRpYyB2b2lkIGRpZSAoY29uc3QgY2hhciAqbWVzc2FnZSkgX0RCVVNfR05VQ19OT1JFVFVSTjsKKworc3RhdGljIHZvaWQKK2RpZSAoY29uc3QgY2hhciAqbWVzc2FnZSkKK3sKKyAgcHJpbnRmICgiQmFpbCBvdXQhIHRlc3Qtc2h1dGRvd246ICVzIiwgbWVzc2FnZSk7CisgIGV4aXQgKDEpOworfQorCitzdGF0aWMgdm9pZAorb3Blbl9kZXN0cm95X3NoYXJlZF9zZXNzaW9uX2J1c19jb25uZWN0aW9uICh2b2lkKQoreworICBEQnVzRXJyb3IgZXJyb3I7CisgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uOworICBjaGFyICpzZXNzaW9uX2FkZHJfbm9fZ3VpZDsKKyAgY2hhciAqY29tbWE7CisgIAorICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisKKyAgc2Vzc2lvbl9hZGRyX25vX2d1aWQgPSBzdHJkdXAgKGdldGVudiAoIkRCVVNfU0VTU0lPTl9CVVNfQUREUkVTUyIpKTsKKyAgY29tbWEgPSBzdHJjaHIgKHNlc3Npb25fYWRkcl9ub19ndWlkLCAnLCcpOworICBpZiAoY29tbWEgPT0gTlVMTCkKKyAgICBkaWUgKCJDb3VsZG4ndCBmaW5kIEdVSUQgaW4gc2Vzc2lvbiBidXMgYWRkcmVzcyIpOworICAqY29tbWEgPSAnXDAnOworICAgIAorICBjb25uZWN0aW9uID0gZGJ1c19jb25uZWN0aW9uX29wZW4gKHNlc3Npb25fYWRkcl9ub19ndWlkLCAmZXJyb3IpOworICBmcmVlIChzZXNzaW9uX2FkZHJfbm9fZ3VpZCk7CisgIGlmIChjb25uZWN0aW9uID09IE5VTEwpCisgICAgZGllICgiRmFpbGVkIHRvIG9wZW4gY29ubmVjdGlvbiB0byB0ZW1wIHNlc3Npb24gYnVzXG4iKTsKKworICBsb29wID0gX2RidXNfbG9vcF9uZXcgKCk7CisgIGlmIChsb29wID09IE5VTEwpCisgICAgZGllICgiTm8gbWVtb3J5XG4iKTsKKyAgCisgIGlmICghdGVzdF9jb25uZWN0aW9uX3NldHVwIChsb29wLCBjb25uZWN0aW9uKSkKKyAgICBkaWUgKCJObyBtZW1vcnlcbiIpOworCisgIHRlc3RfY29ubmVjdGlvbl9zaHV0ZG93biAobG9vcCwgY29ubmVjdGlvbik7CisgCisgIF9kYnVzX2xvb3BfdW5yZWYgKGxvb3ApOworCisgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoY29ubmVjdGlvbik7IAorfQorCisvKiBUaGlzIHRlc3Qgb3V0cHV0cyBUQVAgc3ludGF4OiBodHRwOi8vdGVzdGFueXRoaW5nLm9yZy8gKi8KK2ludAorbWFpbiAoaW50ICAgIGFyZ2MsCisgICAgICBjaGFyICoqYXJndikKK3sKKyAgaW50IHRlc3RfbnVtID0gMDsKKworICBvcGVuX2Rlc3Ryb3lfc2hhcmVkX3Nlc3Npb25fYnVzX2Nvbm5lY3Rpb24gKCk7CisKKyAgZGJ1c19zaHV0ZG93biAoKTsKKyAgcHJpbnRmICgib2sgJWRcbiIsICsrdGVzdF9udW0pOworCisgIG9wZW5fZGVzdHJveV9zaGFyZWRfc2Vzc2lvbl9idXNfY29ubmVjdGlvbiAoKTsKKworICBkYnVzX3NodXRkb3duICgpOworICBwcmludGYgKCJvayAlZFxuIiwgKyt0ZXN0X251bSk7CisKKyAgb3Blbl9kZXN0cm95X3NoYXJlZF9zZXNzaW9uX2J1c19jb25uZWN0aW9uICgpOworCisgIGRidXNfc2h1dGRvd24gKCk7CisgIHByaW50ZiAoIm9rICVkXG4iLCArK3Rlc3RfbnVtKTsKKworICBwcmludGYgKCIxLi4lZFxuIiwgdGVzdF9udW0pOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvbmFtZS10ZXN0L3Rlc3QtdGhyZWFkcy1pbml0LmMgYi90ZXN0L25hbWUtdGVzdC90ZXN0LXRocmVhZHMtaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExOWI5NjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L25hbWUtdGVzdC90ZXN0LXRocmVhZHMtaW5pdC5jCkBAIC0wLDAgKzEsMTk0IEBACisvKioKKyAqIFRlc3QgdG8gbWFrZSBzdXJlIGxhdGUgdGhyZWFkIGluaXRpYWxpemF0aW9uIHdvcmtzCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zeXNkZXBzLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgPGRidXMvZGJ1cy1pbnRlcm5hbHMuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtY29ubmVjdGlvbi1pbnRlcm5hbC5oPgorCitzdGF0aWMgdm9pZAorX3J1bl9pdGVyYXRpb24gKERCdXNDb25uZWN0aW9uICpjb25uKQoreworICBEQnVzUGVuZGluZ0NhbGwgKmVjaG9fcGVuZGluZzsKKyAgREJ1c1BlbmRpbmdDYWxsICpkYnVzX3BlbmRpbmc7CisgIERCdXNNZXNzYWdlICptZXRob2Q7CisgIERCdXNNZXNzYWdlICpyZXBseTsKKyAgY29uc3QgY2hhciAqZWNobyA9ICJlY2hvIjsKKworICAvKiBzZW5kIHRoZSBmaXJzdCBtZXNzYWdlICovCisgIG1ldGhvZCA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKCJvcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVFY2hvU2VydmljZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvb3JnL2ZyZWVkZXNrdG9wL1Rlc3RTdWl0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVjaG8iKTsKKworICBpZiAoIWRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAobWV0aG9kLCBEQlVTX1RZUEVfU1RSSU5HLCAmZWNobywgTlVMTCkpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiQmFpbCBvdXQhIEZhaWxlZCB0byBhcHBlbmQgYXJndW1lbnRzOiBPT01cbiIpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIGRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHkgKGNvbm4sIG1ldGhvZCwgJmVjaG9fcGVuZGluZywgLTEpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1ldGhvZCk7CisgIAorICAvKiBzZW5kIHRoZSBzZWNvbmQgbWVzc2FnZSAqLworICBtZXRob2QgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsIChEQlVTX1NFUlZJQ0VfREJVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19QQVRIX0RCVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuSW50cm9zcGVjdGFibGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW50cm9zcGVjdCIpOworCisgIGRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHkgKGNvbm4sIG1ldGhvZCwgJmRidXNfcGVuZGluZywgLTEpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1ldGhvZCk7CisKKyAgLyogYmxvY2sgb24gdGhlIHNlY29uZCBtZXNzYWdlIChzaG91bGQgcmV0dXJuIGltbWVkaWF0ZWx5KSAqLworICBkYnVzX3BlbmRpbmdfY2FsbF9ibG9jayAoZGJ1c19wZW5kaW5nKTsKKworICAvKiBibG9jayBvbiB0aGUgZmlyc3QgbWVzc2FnZSAqLworICAvKiBpZiBpdCBkb2VzIG5vdCByZXR1cm4gaW1tZWRpYXRlbHkgY2hhbmNlcyAKKyAgICAgYXJlIHdlIGhpdCB0aGUgYmxvY2sgaW4gcG9sbCBidWcgKi8KKyAgZGJ1c19wZW5kaW5nX2NhbGxfYmxvY2sgKGVjaG9fcGVuZGluZyk7CisKKyAgLyogY2hlY2sgdGhlIHJlcGx5IG9ubHkgdG8gbWFrZSBzdXJlIHdlCisgICAgIGFyZSBub3QgZ2V0dGluZyBlcnJvcnMgdW5yZWxhdGVkCisgICAgIHRvIHRoZSBibG9jayBpbiBwb2xsIGJ1ZyAqLworICByZXBseSA9IGRidXNfcGVuZGluZ19jYWxsX3N0ZWFsX3JlcGx5IChlY2hvX3BlbmRpbmcpOworCisgIGlmIChyZXBseSA9PSBOVUxMKQorICAgIHsKKyAgICAgIHByaW50ZiAoIkJhaWwgb3V0ISBSZXBseSBpcyBOVUxMICoqKlxuIik7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgaWYgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAocmVwbHkpID09IERCVVNfTUVTU0FHRV9UWVBFX0VSUk9SKQorICAgIHsKKyAgICAgIHByaW50ZiAoIkJhaWwgb3V0ISBSZXBseSBpcyBlcnJvcjogJXMgKioqXG4iLCBkYnVzX21lc3NhZ2VfZ2V0X2Vycm9yX25hbWUgKHJlcGx5KSk7CisgICAgICBleGl0ICgxKTsKKyAgICB9IAorCisgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworICBkYnVzX3BlbmRpbmdfY2FsbF91bnJlZiAoZGJ1c19wZW5kaW5nKTsKKyAgZGJ1c19wZW5kaW5nX2NhbGxfdW5yZWYgKGVjaG9fcGVuZGluZyk7CisgIAorfQorc3RhdGljIHZvaWQKK2NoZWNrX211dGV4X2xvY2sgKERCdXNNdXRleCAqbXV0ZXgxLCAKKyAgICAgICAgICAgICAgICAgIERCdXNNdXRleCAqbXV0ZXgyLCAKKyAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90IGlzX3NhbWUpCit7CisgIF9kYnVzX2Fzc2VydCAobXV0ZXgxICE9IE5VTEwpOworICBfZGJ1c19hc3NlcnQgKG11dGV4MiAhPSBOVUxMKTsKKyAgCisgIGlmIChpc19zYW1lKQorICAgIHsKKyAgICAgIF9kYnVzX2Fzc2VydCAobXV0ZXgxID09IG11dGV4Mik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0IChtdXRleDEgIT0gbXV0ZXgyKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitjaGVja19jb25kdmFyX2xvY2sgKERCdXNDb25kVmFyICpjb25kdmFyMSwgIAorICAgICAgICAgICAgICAgICAgICBEQnVzQ29uZFZhciAqY29uZHZhcjIsICAgCisgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90IGlzX3NhbWUpCit7CisgIF9kYnVzX2Fzc2VydCAoY29uZHZhcjEgIT0gTlVMTCk7CisgIF9kYnVzX2Fzc2VydCAoY29uZHZhcjIgIT0gTlVMTCk7CisKKyAgaWYgKGlzX3NhbWUpCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0IChjb25kdmFyMSA9PSBjb25kdmFyMik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgX2RidXNfYXNzZXJ0IChjb25kdmFyMSAhPSBjb25kdmFyMik7CisgICAgfQorfQorCisvKiBUaGlzIHRlc3Qgb3V0cHV0cyBUQVAgc3ludGF4OiBodHRwOi8vdGVzdGFueXRoaW5nLm9yZy8gKi8KK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgREJ1c01lc3NhZ2UgKm1ldGhvZDsKKyAgREJ1c0Nvbm5lY3Rpb24gKmNvbm47CisgIERCdXNFcnJvciBlcnJvcjsKKyAgREJ1c011dGV4ICptdXRleDEsICpkaXNwYXRjaF9tdXRleDEsICppb19wYXRoX211dGV4MTsKKyAgREJ1c0NvbmRWYXIgKmRpc3BhdGNoX2NvbmQxLCAqaW9fcGF0aF9jb25kMTsKKyAgREJ1c011dGV4ICptdXRleDIsICpkaXNwYXRjaF9tdXRleDIsICppb19wYXRoX211dGV4MjsKKyAgREJ1c0NvbmRWYXIgKmRpc3BhdGNoX2NvbmQyLCAqaW9fcGF0aF9jb25kMjsKKyAgaW50IHRlc3RfbnVtID0gMDsKKworICBwcmludGYgKCIjIFRlc3RpbmcgbGF0ZSB0aHJlYWQgaW5pdFxuIik7CisKKyAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworCisgIGNvbm4gPSBkYnVzX2J1c19nZXQgKERCVVNfQlVTX1NFU1NJT04sICZlcnJvcik7CisKKyAgaWYgKGNvbm4gPT0gTlVMTCkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJCYWlsIG91dCEgRmFpbGVkIHRvIG9wZW4gY29ubmVjdGlvbiB0byBzZXNzaW9uIGJ1czogJXNcbiIsCisgICAgICAgICAgICAgICBlcnJvci5tZXNzYWdlKTsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICBfZGJ1c19jb25uZWN0aW9uX3Rlc3RfZ2V0X2xvY2tzIChjb25uLCAmbXV0ZXgxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGlzcGF0Y2hfbXV0ZXgxLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlvX3BhdGhfbXV0ZXgxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGlzcGF0Y2hfY29uZDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpb19wYXRoX2NvbmQxKTsKKyAgX3J1bl9pdGVyYXRpb24gKGNvbm4pOworICBfZGJ1c19jb25uZWN0aW9uX3Rlc3RfZ2V0X2xvY2tzIChjb25uLCAmbXV0ZXgyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGlzcGF0Y2hfbXV0ZXgyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW9fcGF0aF9tdXRleDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkaXNwYXRjaF9jb25kMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlvX3BhdGhfY29uZDIpOworCisgIGNoZWNrX211dGV4X2xvY2sgKG11dGV4MSwgbXV0ZXgyLCBUUlVFKTsKKyAgY2hlY2tfbXV0ZXhfbG9jayAoZGlzcGF0Y2hfbXV0ZXgxLCBkaXNwYXRjaF9tdXRleDIsIFRSVUUpOworICBjaGVja19tdXRleF9sb2NrIChpb19wYXRoX211dGV4MSwgaW9fcGF0aF9tdXRleDIsIFRSVUUpOworICBjaGVja19jb25kdmFyX2xvY2sgKGRpc3BhdGNoX2NvbmQxLCBkaXNwYXRjaF9jb25kMiwgVFJVRSk7CisgIGNoZWNrX2NvbmR2YXJfbG9jayAoaW9fcGF0aF9jb25kMSwgaW9fcGF0aF9jb25kMiwgVFJVRSk7CisgIHByaW50ZiAoIm9rICVkXG4iLCArK3Rlc3RfbnVtKTsKKworICBpZiAoIWRidXNfdGhyZWFkc19pbml0X2RlZmF1bHQgKCkpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiQmFpbCBvdXQhIEZhaWxlZCB0byBpbml0aWFsaXNlIHRocmVhZHM6IE9PTVxuIik7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgX2RidXNfY29ubmVjdGlvbl90ZXN0X2dldF9sb2NrcyAoY29ubiwgJm11dGV4MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpc3BhdGNoX211dGV4MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlvX3BhdGhfbXV0ZXgxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGlzcGF0Y2hfY29uZDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpb19wYXRoX2NvbmQxKTsKKworICBfcnVuX2l0ZXJhdGlvbiAoY29ubik7CisgIF9kYnVzX2Nvbm5lY3Rpb25fdGVzdF9nZXRfbG9ja3MgKGNvbm4sICZtdXRleDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkaXNwYXRjaF9tdXRleDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpb19wYXRoX211dGV4MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpc3BhdGNoX2NvbmQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW9fcGF0aF9jb25kMik7CisKKyAgY2hlY2tfbXV0ZXhfbG9jayAobXV0ZXgxLCBtdXRleDIsIFRSVUUpOworICBjaGVja19tdXRleF9sb2NrIChkaXNwYXRjaF9tdXRleDEsIGRpc3BhdGNoX211dGV4MiwgVFJVRSk7CisgIGNoZWNrX211dGV4X2xvY2sgKGlvX3BhdGhfbXV0ZXgxLCBpb19wYXRoX211dGV4MiwgVFJVRSk7CisgIGNoZWNrX2NvbmR2YXJfbG9jayAoZGlzcGF0Y2hfY29uZDEsIGRpc3BhdGNoX2NvbmQyLCBUUlVFKTsKKyAgY2hlY2tfY29uZHZhcl9sb2NrIChpb19wYXRoX2NvbmQxLCBpb19wYXRoX2NvbmQyLCBUUlVFKTsKKyAgcHJpbnRmICgib2sgJWRcbiIsICsrdGVzdF9udW0pOworCisgIG1ldGhvZCA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKCJvcmcuZnJlZWRlc2t0b3AuVGVzdFN1aXRlRWNob1NlcnZpY2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiL29yZy9mcmVlZGVza3RvcC9UZXN0U3VpdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLlRlc3RTdWl0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeGl0Iik7CisgIGRidXNfY29ubmVjdGlvbl9zZW5kIChjb25uLCBtZXRob2QsIE5VTEwpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1ldGhvZCk7CisKKyAgcHJpbnRmICgiIyBUZXN0aW5nIGNvbXBsZXRlZFxuMS4uJWRcbiIsIHRlc3RfbnVtKTsKKyAgZXhpdCAoMCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L25hbWUtdGVzdC90ZXN0LXdhaXQtZm9yLWVjaG8ucHkgYi90ZXN0L25hbWUtdGVzdC90ZXN0LXdhaXQtZm9yLWVjaG8ucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDFiOWUwYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbmFtZS10ZXN0L3Rlc3Qtd2FpdC1mb3ItZWNoby5weQpAQCAtMCwwICsxLDQxIEBACisjIS91c3IvYmluL2VudiBweXRob24KKworaW1wb3J0IG9zLHN5cworCit0cnk6CisgICAgaW1wb3J0IGRidXMKKyAgICBpbXBvcnQgZGJ1cy5tYWlubG9vcC5nbGliCisgICAgZnJvbSBnaS5yZXBvc2l0b3J5IGltcG9ydCBHT2JqZWN0CitleGNlcHQ6CisgICAgcHJpbnQoIkZhaWxlZCBpbXBvcnQsIGFib3J0aW5nIHRlc3QiKQorICAgIHN5cy5leGl0KDApCisKK2RidXMubWFpbmxvb3AuZ2xpYi5EQnVzR01haW5Mb29wKHNldF9hc19kZWZhdWx0PVRydWUpCitsb29wID0gR09iamVjdC5NYWluTG9vcCgpCisKK2V4aXRjb2RlID0gMAorCitkZWYgaGFuZGxlX25vcmVjZWlwdCgpOgorICAgIHByaW50KCJGYWlsZWQgdG8gZ2V0IHNpZ25hbCIpCisgICAgZ2xvYmFsIGV4aXRjb2RlCisgICAgZXhpdGNvZGUgPSAxCisgICAgbG9vcC5xdWl0KCkKKworR09iamVjdC50aW1lb3V0X2FkZCg3MDAwLCBoYW5kbGVfbm9yZWNlaXB0KQorCitidXMgPSBkYnVzLlNlc3Npb25CdXMoKQorCitkZWYgc2lnaGFuZGxlcigqYXJncywgKiprd2FyZ3MpOgorICAgIHByaW50KCJnb3Qgc2lnbmFsIikKKyAgICBsb29wLnF1aXQoKSAgIAorCitidXMuYWRkX3NpZ25hbF9yZWNlaXZlcihzaWdoYW5kbGVyLCBkYnVzX2ludGVyZmFjZT0nb3JnLmZyZWVkZXNrdG9wLlRlc3RTdWl0ZScsIHNpZ25hbF9uYW1lPSdGb28nKQorCitvID0gYnVzLmdldF9vYmplY3QoJ29yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZUVjaG9TZXJ2aWNlJywgJy9vcmcvZnJlZWRlc2t0b3AvVGVzdFN1aXRlJykKK2kgPSBkYnVzLkludGVyZmFjZShvLCAnb3JnLmZyZWVkZXNrdG9wLlRlc3RTdWl0ZScpCitkZWYgbnVsbGhhbmRsZXIoKmFyZ3MsICoqa3dhcmdzKToKKyAgICBwYXNzCitpLkVtaXRGb28ocmVwbHlfaGFuZGxlcj1udWxsaGFuZGxlciwgZXJyb3JfaGFuZGxlcj1udWxsaGFuZGxlcikKKworbG9vcC5ydW4oKQorc3lzLmV4aXQoZXhpdGNvZGUpCmRpZmYgLS1naXQgYS90ZXN0L25hbWUtdGVzdC90bXAtc2Vzc2lvbi1saWtlLXN5c3RlbS5jb25mIGIvdGVzdC9uYW1lLXRlc3QvdG1wLXNlc3Npb24tbGlrZS1zeXN0ZW0uY29uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2Q5Y2FlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9uYW1lLXRlc3QvdG1wLXNlc3Npb24tbGlrZS1zeXN0ZW0uY29uZgpAQCAtMCwwICsxLDg5IEBACis8IS0tIFRoaXMgY29uZmlndXJhdGlvbiBmaWxlIGNvbnRyb2xzIHRoZSBwZXItdXNlci1sb2dpbi1zZXNzaW9uIG1lc3NhZ2UgYnVzLgorICAgICBBZGQgYSBzZXNzaW9uLWxvY2FsLmNvbmYgYW5kIGVkaXQgdGhhdCByYXRoZXIgdGhhbiBjaGFuZ2luZyB0aGlzIAorICAgICBmaWxlIGRpcmVjdGx5LiAtLT4KKworPCFET0NUWVBFIGJ1c2NvbmZpZyBQVUJMSUMgIi0vL2ZyZWVkZXNrdG9wLy9EVEQgRC1CdXMgQnVzIENvbmZpZ3VyYXRpb24gMS4wLy9FTiIKKyAiaHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc3RhbmRhcmRzL2RidXMvMS4wL2J1c2NvbmZpZy5kdGQiPgorPGJ1c2NvbmZpZz4KKyAgPCEtLSBPdXIgd2VsbC1rbm93biBidXMgdHlwZSwgZG9uJ3QgY2hhbmdlIHRoaXMgLS0+CisgIDx0eXBlPnNlc3Npb248L3R5cGU+CisKKyAgPCEtLSBJZiB3ZSBmb3JrLCBrZWVwIHRoZSB1c2VyJ3Mgb3JpZ2luYWwgdW1hc2sgdG8gYXZvaWQgYWZmZWN0aW5nCisgICAgICAgdGhlIGJlaGF2aW9yIG9mIGNoaWxkIHByb2Nlc3Nlcy4gLS0+CisgIDxrZWVwX3VtYXNrLz4KKworICA8bGlzdGVuPnVuaXg6dG1wZGlyPS90bXA8L2xpc3Rlbj4KKworICA8c3RhbmRhcmRfc2Vzc2lvbl9zZXJ2aWNlZGlycyAvPgorCisgIDwhLS0gaW50ZW5kZWQgdG8gbWF0Y2ggc3lzdGVtIGJ1cyAtLT4KKyAgPHBvbGljeSBjb250ZXh0PSJkZWZhdWx0Ij4KKyAgICA8IS0tIEFsbCB1c2VycyBjYW4gY29ubmVjdCB0byBzeXN0ZW0gYnVzIC0tPgorICAgIDxhbGxvdyB1c2VyPSIqIi8+CisKKyAgICA8IS0tIEhvbGVzIG11c3QgYmUgcHVuY2hlZCBpbiBzZXJ2aWNlIGNvbmZpZ3VyYXRpb24gZmlsZXMgZm9yCisgICAgICAgICBuYW1lIG93bmVyc2hpcCBhbmQgc2VuZGluZyBtZXRob2QgY2FsbHMgLS0+CisgICAgPGRlbnkgb3duPSIqIi8+CisgICAgPGRlbnkgc2VuZF90eXBlPSJtZXRob2RfY2FsbCIvPgorCisgICAgPCEtLSBTaWduYWxzIGFuZCByZXBseSBtZXNzYWdlcyAobWV0aG9kIHJldHVybnMsIGVycm9ycykgYXJlIGFsbG93ZWQKKyAgICAgICAgIGJ5IGRlZmF1bHQgLS0+CisgICAgPGFsbG93IHNlbmRfdHlwZT0ic2lnbmFsIi8+CisgICAgPGFsbG93IHNlbmRfcmVxdWVzdGVkX3JlcGx5PSJ0cnVlIiBzZW5kX3R5cGU9Im1ldGhvZF9yZXR1cm4iLz4KKyAgICA8YWxsb3cgc2VuZF9yZXF1ZXN0ZWRfcmVwbHk9InRydWUiIHNlbmRfdHlwZT0iZXJyb3IiLz4KKworICAgIDwhLS0gQWxsIG1lc3NhZ2VzIG1heSBiZSByZWNlaXZlZCBieSBkZWZhdWx0IC0tPgorICAgIDxhbGxvdyByZWNlaXZlX3R5cGU9Im1ldGhvZF9jYWxsIi8+CisgICAgPGFsbG93IHJlY2VpdmVfdHlwZT0ibWV0aG9kX3JldHVybiIvPgorICAgIDxhbGxvdyByZWNlaXZlX3R5cGU9ImVycm9yIi8+CisgICAgPGFsbG93IHJlY2VpdmVfdHlwZT0ic2lnbmFsIi8+CisKKyAgICA8IS0tIEFsbG93IGFueW9uZSB0byB0YWxrIHRvIHRoZSBtZXNzYWdlIGJ1cyAtLT4KKyAgICA8YWxsb3cgc2VuZF9kZXN0aW5hdGlvbj0ib3JnLmZyZWVkZXNrdG9wLkRCdXMiLz4KKyAgICA8IS0tIEJ1dCBkaXNhbGxvdyBzb21lIHNwZWNpZmljIGJ1cyBzZXJ2aWNlcyAtLT4KKyAgICA8ZGVueSBzZW5kX2Rlc3RpbmF0aW9uPSJvcmcuZnJlZWRlc2t0b3AuREJ1cyIKKyAgICAgICAgICBzZW5kX2ludGVyZmFjZT0ib3JnLmZyZWVkZXNrdG9wLkRCdXMiCisgICAgICAgICAgc2VuZF9tZW1iZXI9IlVwZGF0ZUFjdGl2YXRpb25FbnZpcm9ubWVudCIvPgorCisgICAgPCEtLSBTcGVjaWZpYyB0byB0aGUgdGVzdCBzdWl0ZSAtLT4KKyAgICA8YWxsb3cgb3duPSJvcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVFY2hvU2VydmljZSIvPgorICAgIDxhbGxvdyBzZW5kX2Rlc3RpbmF0aW9uPSJvcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVFY2hvU2VydmljZSIKKyAgICAgICAgICAgc2VuZF9pbnRlcmZhY2U9Im9yZy5mcmVlZGVza3RvcC5EQnVzLkludHJvc3BlY3RhYmxlIi8+CisgICAgPGFsbG93IHNlbmRfZGVzdGluYXRpb249Im9yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZUVjaG9TZXJ2aWNlIgorICAgICAgICAgICBzZW5kX2ludGVyZmFjZT0ib3JnLmZyZWVkZXNrdG9wLlRlc3RTdWl0ZSIKKyAgICAgICAgICAgc2VuZF9tZW1iZXI9IkVtaXRGb28iLz4KKyAgPC9wb2xpY3k+CisKKyAgPHBvbGljeSBjb250ZXh0PSJkZWZhdWx0Ij4KKyAgICAgPGFsbG93IG93bj0ib3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlRWNob1NlcnZpY2UiLz4KKyAgICAgPGFsbG93IHNlbmRfZGVzdGluYXRpb249Im9yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RTdWl0ZUVjaG9TZXJ2aWNlIgorICAgICAgICAgICAgc2VuZF9pbnRlcmZhY2U9Im9yZy5mcmVlZGVza3RvcC5EQnVzLkludHJvc3BlY3RhYmxlIi8+CisgICAgIDxhbGxvdyBzZW5kX2Rlc3RpbmF0aW9uPSJvcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVFY2hvU2VydmljZSIKKyAgICAgICAgICAgIHNlbmRfaW50ZXJmYWNlPSJvcmcuZnJlZWRlc2t0b3AuVGVzdFN1aXRlIgorICAgICAgICAgICAgc2VuZF9tZW1iZXI9IkVtaXRGb28iLz4KKyAgPC9wb2xpY3k+CisKKyAgPCEtLSBGb3IgdGhlIHNlc3Npb24gYnVzLCBvdmVycmlkZSB0aGUgZGVmYXVsdCByZWxhdGl2ZWx5LWxvdyBsaW1pdHMgCisgICAgICAgd2l0aCBlc3NlbnRpYWxseSBpbmZpbml0ZSBsaW1pdHMsIHNpbmNlIHRoZSBidXMgaXMganVzdCBydW5uaW5nIAorICAgICAgIGFzIHRoZSB1c2VyIGFueXdheSwgdXNpbmcgdXAgYnVzIHJlc291cmNlcyBpcyBub3Qgc29tZXRoaW5nIHdlIG5lZWQgCisgICAgICAgdG8gd29ycnkgYWJvdXQuIEluIHNvbWUgY2FzZXMsIHdlIGRvIHNldCB0aGUgbGltaXRzIGxvd2VyIHRoYW4gCisgICAgICAgImFsbCBhdmFpbGFibGUgbWVtb3J5IiBpZiBleGNlZWRpbmcgdGhlIGxpbWl0IGlzIGFsbW9zdCBjZXJ0YWlubHkgYSBidWcsIAorICAgICAgIGhhdmluZyB0aGUgYnVzIGVuZm9yY2UgYSBsaW1pdCBpcyBuaWNlciB0aGFuIGEgaHVnZSBtZW1vcnkgbGVhay4gQnV0IHRoZSAKKyAgICAgICBpbnRlbnQgaXMgdGhhdCB0aGVzZSBsaW1pdHMgc2hvdWxkIG5ldmVyIGJlIGhpdC4gLS0+CisKKyAgPCEtLSB0aGUgbWVtb3J5IGxpbWl0cyBhcmUgMUcgaW5zdGVhZCBvZiBzYXkgNEcgYmVjYXVzZSB0aGV5IGNhbid0IGV4Y2VlZCAzMi1iaXQgc2lnbmVkIGludCBtYXggLS0+CisgIDxsaW1pdCBuYW1lPSJtYXhfaW5jb21pbmdfYnl0ZXMiPjEwMDAwMDAwMDA8L2xpbWl0PgorICA8bGltaXQgbmFtZT0ibWF4X291dGdvaW5nX2J5dGVzIj4xMDAwMDAwMDAwPC9saW1pdD4KKyAgPGxpbWl0IG5hbWU9Im1heF9tZXNzYWdlX3NpemUiPjEwMDAwMDAwMDA8L2xpbWl0PgorICA8bGltaXQgbmFtZT0ic2VydmljZV9zdGFydF90aW1lb3V0Ij4xMjAwMDA8L2xpbWl0PiAgCisgIDxsaW1pdCBuYW1lPSJhdXRoX3RpbWVvdXQiPjI0MDAwMDwvbGltaXQ+CisgIDxsaW1pdCBuYW1lPSJtYXhfY29tcGxldGVkX2Nvbm5lY3Rpb25zIj4xMDAwMDA8L2xpbWl0PiAgCisgIDxsaW1pdCBuYW1lPSJtYXhfaW5jb21wbGV0ZV9jb25uZWN0aW9ucyI+MTAwMDA8L2xpbWl0PgorICA8bGltaXQgbmFtZT0ibWF4X2Nvbm5lY3Rpb25zX3Blcl91c2VyIj4xMDAwMDA8L2xpbWl0PgorICA8bGltaXQgbmFtZT0ibWF4X3BlbmRpbmdfc2VydmljZV9zdGFydHMiPjEwMDAwPC9saW1pdD4KKyAgPGxpbWl0IG5hbWU9Im1heF9uYW1lc19wZXJfY29ubmVjdGlvbiI+NTAwMDA8L2xpbWl0PgorICA8bGltaXQgbmFtZT0ibWF4X21hdGNoX3J1bGVzX3Blcl9jb25uZWN0aW9uIj41MDAwMDwvbGltaXQ+CisgIDxsaW1pdCBuYW1lPSJtYXhfcmVwbGllc19wZXJfY29ubmVjdGlvbiI+NTAwMDA8L2xpbWl0PgorICA8bGltaXQgbmFtZT0icmVwbHlfdGltZW91dCI+MzAwMDAwPC9saW1pdD4KKworPC9idXNjb25maWc+CmRpZmYgLS1naXQgYS90ZXN0L3JlbGF5LmMgYi90ZXN0L3JlbGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmIzZWZiOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvcmVsYXkuYwpAQCAtMCwwICsxLDM1OSBAQAorLyogUmVncmVzc2lvbiB0ZXN0IGZvciBwYXNzaW5nIHVubW9kaWZpZWQgbWVzc2FnZXMgYmV0d2VlbiBjb25uZWN0aW9ucworICoKKyAqIEF1dGhvcjogU2ltb24gTWNWaXR0aWUgPHNpbW9uLm1jdml0dGllQGNvbGxhYm9yYS5jby51az4KKyAqIENvcHlyaWdodCDCqSAyMDEwLTIwMTEgTm9raWEgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMKKyAqICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sCisgKiBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLAorICogcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwKKyAqIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCisgKiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQorICogaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisKKyNpbmNsdWRlIDxnbGliLmg+CisKKyNpbmNsdWRlIDxkYnVzL2RidXMuaD4KKworI2luY2x1ZGUgInRlc3QtdXRpbHMtZ2xpYi5oIgorCisvKiBUaGlzIGlzIGJhc2ljYWxseSBhIG1pbmlhdHVyZSBkYnVzLWRhZW1vbi4gV2UgcmVsYXkgbWVzc2FnZXMgZnJvbSB0aGUgY2xpZW50CisgKiBvbiB0aGUgbGVmdCB0byB0aGUgY2xpZW50IG9uIHRoZSByaWdodC4KKyAqCisgKiBsZWZ0ICAgICAgc29ja2V0ICAgICBsZWZ0ICAgICAgZGlzcGF0Y2ggICAgIHJpZ2h0ICAgIHNvY2tldCAgICAgcmlnaHQKKyAqIGNsaWVudCA9PT09PT09PT09PT4gIHNlcnZlciAtLS0tLS0tLS0tLS0tLT4gc2VydmVyID09PT09PT09PT09PiBjbGllbnQKKyAqIGNvbm4gICAgICAgICAgICAgICAgIGNvbm4gICAgICAgICAgICAgICAgICAgY29ubiAgICAgICAgICAgICAgICBjb25uCisgKgorICogSW4gdGhlIHJlYWwgZGJ1cy1kYWVtb24sIHRoZSBjbGllbnQgY29ubmVjdGlvbnMgd291bGQgYmUgb3V0LW9mLXByb2Nlc3MsCisgKiBidXQgaGVyZSB3ZSdyZSBjaGVhdGluZyBhbmQgZG9pbmcgZXZlcnl0aGluZyBpbi1wcm9jZXNzLgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBUZXN0TWFpbkNvbnRleHQgKmN0eDsKKyAgICBEQnVzRXJyb3IgZTsKKyAgICBnYm9vbGVhbiBza2lwOworCisgICAgREJ1c1NlcnZlciAqc2VydmVyOworCisgICAgREJ1c0Nvbm5lY3Rpb24gKmxlZnRfY2xpZW50X2Nvbm47CisgICAgREJ1c0Nvbm5lY3Rpb24gKmxlZnRfc2VydmVyX2Nvbm47CisKKyAgICBEQnVzQ29ubmVjdGlvbiAqcmlnaHRfc2VydmVyX2Nvbm47CisgICAgREJ1c0Nvbm5lY3Rpb24gKnJpZ2h0X2NsaWVudF9jb25uOworICAgIC8qIHF1ZXVlIG9mIERCdXNNZXNzYWdlIHJlY2VpdmVkIGJ5IHJpZ2h0X2NsaWVudF9jb25uICovCisgICAgR1F1ZXVlIG1lc3NhZ2VzOworfSBGaXh0dXJlOworCitzdGF0aWMgdm9pZAorYXNzZXJ0X25vX2Vycm9yIChjb25zdCBEQnVzRXJyb3IgKmUpCit7CisgIGlmIChHX1VOTElLRUxZIChkYnVzX2Vycm9yX2lzX3NldCAoZSkpKQorICAgIGdfZXJyb3IgKCJleHBlY3RlZCBzdWNjZXNzIGJ1dCBnb3QgZXJyb3I6ICVzOiAlcyIsIGUtPm5hbWUsIGUtPm1lc3NhZ2UpOworfQorCitzdGF0aWMgREJ1c0hhbmRsZXJSZXN1bHQKK3NlcnZlcl9tZXNzYWdlX2NiIChEQnVzQ29ubmVjdGlvbiAqc2VydmVyX2Nvbm4sCisgICAgREJ1c01lc3NhZ2UgKm1lc3NhZ2UsCisgICAgdm9pZCAqZGF0YSkKK3sKKyAgRml4dHVyZSAqZiA9IGRhdGE7CisKKyAgZ19hc3NlcnQgKHNlcnZlcl9jb25uID09IGYtPmxlZnRfc2VydmVyX2Nvbm4pOworICBnX2Fzc2VydCAoZi0+cmlnaHRfc2VydmVyX2Nvbm4gIT0gTlVMTCk7CisKKyAgZGJ1c19jb25uZWN0aW9uX3NlbmQgKGYtPnJpZ2h0X3NlcnZlcl9jb25uLCBtZXNzYWdlLCBOVUxMKTsKKworICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9IQU5ETEVEOworfQorCitzdGF0aWMgREJ1c0hhbmRsZXJSZXN1bHQKK3JpZ2h0X2NsaWVudF9tZXNzYWdlX2NiIChEQnVzQ29ubmVjdGlvbiAqY2xpZW50X2Nvbm4sCisgICAgREJ1c01lc3NhZ2UgKm1lc3NhZ2UsCisgICAgdm9pZCAqZGF0YSkKK3sKKyAgRml4dHVyZSAqZiA9IGRhdGE7CisKKyAgZ19hc3NlcnQgKGNsaWVudF9jb25uID09IGYtPnJpZ2h0X2NsaWVudF9jb25uKTsKKyAgZ19xdWV1ZV9wdXNoX3RhaWwgKCZmLT5tZXNzYWdlcywgZGJ1c19tZXNzYWdlX3JlZiAobWVzc2FnZSkpOworCisgIHJldHVybiBEQlVTX0hBTkRMRVJfUkVTVUxUX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyB2b2lkCituZXdfY29ubl9jYiAoREJ1c1NlcnZlciAqc2VydmVyLAorICAgIERCdXNDb25uZWN0aW9uICpzZXJ2ZXJfY29ubiwKKyAgICB2b2lkICpkYXRhKQoreworICBGaXh0dXJlICpmID0gZGF0YTsKKyAgZGJ1c19ib29sX3QgaGF2ZV9tZW07CisKKyAgaWYgKGYtPmxlZnRfc2VydmVyX2Nvbm4gPT0gTlVMTCkKKyAgICB7CisgICAgICBmLT5sZWZ0X3NlcnZlcl9jb25uID0gZGJ1c19jb25uZWN0aW9uX3JlZiAoc2VydmVyX2Nvbm4pOworCisgICAgICBoYXZlX21lbSA9IGRidXNfY29ubmVjdGlvbl9hZGRfZmlsdGVyIChzZXJ2ZXJfY29ubiwKKyAgICAgICAgICBzZXJ2ZXJfbWVzc2FnZV9jYiwgZiwgTlVMTCk7CisgICAgICBnX2Fzc2VydCAoaGF2ZV9tZW0pOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGdfYXNzZXJ0IChmLT5yaWdodF9zZXJ2ZXJfY29ubiA9PSBOVUxMKTsKKyAgICAgIGYtPnJpZ2h0X3NlcnZlcl9jb25uID0gZGJ1c19jb25uZWN0aW9uX3JlZiAoc2VydmVyX2Nvbm4pOworICAgIH0KKworICB0ZXN0X2Nvbm5lY3Rpb25fc2V0dXAgKGYtPmN0eCwgc2VydmVyX2Nvbm4pOworfQorCitzdGF0aWMgdm9pZAorc2V0dXAgKEZpeHR1cmUgKmYsCisgICAgICAgZ2NvbnN0cG9pbnRlciBhZGRyZXNzKQoreworICB0ZXN0X3RpbWVvdXRfcmVzZXQgKDEpOworCisgIGYtPmN0eCA9IHRlc3RfbWFpbl9jb250ZXh0X2dldCAoKTsKKyAgZGJ1c19lcnJvcl9pbml0ICgmZi0+ZSk7CisgIGdfcXVldWVfaW5pdCAoJmYtPm1lc3NhZ2VzKTsKKworICBpZiAoKGdfc3RyX2hhc19wcmVmaXggKGFkZHJlc3MsICJ0Y3A6IikgfHwKKyAgICAgICBnX3N0cl9oYXNfcHJlZml4IChhZGRyZXNzLCAibm9uY2UtdGNwOiIpKSAmJgorICAgICAgIXRlc3RfY2hlY2tfdGNwX3dvcmtzICgpKQorICAgIHsKKyAgICAgIGYtPnNraXAgPSBUUlVFOworICAgICAgcmV0dXJuOworICAgIH0KKworICBmLT5zZXJ2ZXIgPSBkYnVzX3NlcnZlcl9saXN0ZW4gKGFkZHJlc3MsICZmLT5lKTsKKyAgYXNzZXJ0X25vX2Vycm9yICgmZi0+ZSk7CisgIGdfYXNzZXJ0IChmLT5zZXJ2ZXIgIT0gTlVMTCk7CisKKyAgZGJ1c19zZXJ2ZXJfc2V0X25ld19jb25uZWN0aW9uX2Z1bmN0aW9uIChmLT5zZXJ2ZXIsCisgICAgICBuZXdfY29ubl9jYiwgZiwgTlVMTCk7CisgIHRlc3Rfc2VydmVyX3NldHVwIChmLT5jdHgsIGYtPnNlcnZlcik7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X2Nvbm5lY3QgKEZpeHR1cmUgKmYsCisgICAgZ2NvbnN0cG9pbnRlciBkYXRhIEdfR05VQ19VTlVTRUQpCit7CisgIGRidXNfYm9vbF90IGhhdmVfbWVtOworICBjaGFyICphZGRyZXNzOworCisgIGlmIChmLT5za2lwKQorICAgIHJldHVybjsKKworICBnX2Fzc2VydCAoZi0+bGVmdF9zZXJ2ZXJfY29ubiA9PSBOVUxMKTsKKyAgZ19hc3NlcnQgKGYtPnJpZ2h0X3NlcnZlcl9jb25uID09IE5VTEwpOworCisgIGFkZHJlc3MgPSBkYnVzX3NlcnZlcl9nZXRfYWRkcmVzcyAoZi0+c2VydmVyKTsKKyAgZ19hc3NlcnQgKGFkZHJlc3MgIT0gTlVMTCk7CisKKyAgZi0+bGVmdF9jbGllbnRfY29ubiA9IGRidXNfY29ubmVjdGlvbl9vcGVuX3ByaXZhdGUgKGFkZHJlc3MsICZmLT5lKTsKKyAgYXNzZXJ0X25vX2Vycm9yICgmZi0+ZSk7CisgIGdfYXNzZXJ0IChmLT5sZWZ0X2NsaWVudF9jb25uICE9IE5VTEwpOworICB0ZXN0X2Nvbm5lY3Rpb25fc2V0dXAgKGYtPmN0eCwgZi0+bGVmdF9jbGllbnRfY29ubik7CisKKyAgd2hpbGUgKGYtPmxlZnRfc2VydmVyX2Nvbm4gPT0gTlVMTCkKKyAgICB7CisgICAgICB0ZXN0X3Byb2dyZXNzICgnLicpOworICAgICAgdGVzdF9tYWluX2NvbnRleHRfaXRlcmF0ZSAoZi0+Y3R4LCBUUlVFKTsKKyAgICB9CisKKyAgZi0+cmlnaHRfY2xpZW50X2Nvbm4gPSBkYnVzX2Nvbm5lY3Rpb25fb3Blbl9wcml2YXRlIChhZGRyZXNzLCAmZi0+ZSk7CisgIGFzc2VydF9ub19lcnJvciAoJmYtPmUpOworICBnX2Fzc2VydCAoZi0+cmlnaHRfY2xpZW50X2Nvbm4gIT0gTlVMTCk7CisgIHRlc3RfY29ubmVjdGlvbl9zZXR1cCAoZi0+Y3R4LCBmLT5yaWdodF9jbGllbnRfY29ubik7CisKKyAgZGJ1c19mcmVlIChhZGRyZXNzKTsKKworICB3aGlsZSAoZi0+cmlnaHRfc2VydmVyX2Nvbm4gPT0gTlVMTCkKKyAgICB7CisgICAgICB0ZXN0X3Byb2dyZXNzICgnLicpOworICAgICAgdGVzdF9tYWluX2NvbnRleHRfaXRlcmF0ZSAoZi0+Y3R4LCBUUlVFKTsKKyAgICB9CisKKyAgaGF2ZV9tZW0gPSBkYnVzX2Nvbm5lY3Rpb25fYWRkX2ZpbHRlciAoZi0+cmlnaHRfY2xpZW50X2Nvbm4sCisgICAgICByaWdodF9jbGllbnRfbWVzc2FnZV9jYiwgZiwgTlVMTCk7CisgIGdfYXNzZXJ0IChoYXZlX21lbSk7Cit9CisKK3N0YXRpYyBkYnVzX3VpbnQzMl90CitzZW5kX29uZSAoRml4dHVyZSAqZiwKKyAgICBjb25zdCBjaGFyICptZW1iZXIpCit7CisgIGRidXNfYm9vbF90IGhhdmVfbWVtOworICBkYnVzX3VpbnQzMl90IHNlcmlhbDsKKyAgREJ1c01lc3NhZ2UgKm91dGdvaW5nOworCisgIG91dGdvaW5nID0gZGJ1c19tZXNzYWdlX25ld19zaWduYWwgKCIvY29tL2V4YW1wbGUvSGVsbG8iLAorICAgICAgImNvbS5leGFtcGxlLkhlbGxvIiwgbWVtYmVyKTsKKyAgZ19hc3NlcnQgKG91dGdvaW5nICE9IE5VTEwpOworCisgIGhhdmVfbWVtID0gZGJ1c19jb25uZWN0aW9uX3NlbmQgKGYtPmxlZnRfY2xpZW50X2Nvbm4sIG91dGdvaW5nLCAmc2VyaWFsKTsKKyAgZ19hc3NlcnQgKGhhdmVfbWVtKTsKKyAgZ19hc3NlcnQgKHNlcmlhbCAhPSAwKTsKKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG91dGdvaW5nKTsKKyAgcmV0dXJuIHNlcmlhbDsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfcmVsYXkgKEZpeHR1cmUgKmYsCisgICAgZ2NvbnN0cG9pbnRlciBkYXRhKQoreworICBEQnVzTWVzc2FnZSAqaW5jb21pbmc7CisKKyAgaWYgKGYtPnNraXApCisgICAgcmV0dXJuOworCisgIHRlc3RfY29ubmVjdCAoZiwgZGF0YSk7CisKKyAgc2VuZF9vbmUgKGYsICJGaXJzdCIpOworICBzZW5kX29uZSAoZiwgIlNlY29uZCIpOworCisgIHdoaWxlIChnX3F1ZXVlX2dldF9sZW5ndGggKCZmLT5tZXNzYWdlcykgPCAyKQorICAgIHsKKyAgICAgIHRlc3RfcHJvZ3Jlc3MgKCcuJyk7CisgICAgICB0ZXN0X21haW5fY29udGV4dF9pdGVyYXRlIChmLT5jdHgsIFRSVUUpOworICAgIH0KKworICBnX2Fzc2VydF9jbXB1aW50IChnX3F1ZXVlX2dldF9sZW5ndGggKCZmLT5tZXNzYWdlcyksID09LCAyKTsKKworICBpbmNvbWluZyA9IGdfcXVldWVfcG9wX2hlYWQgKCZmLT5tZXNzYWdlcyk7CisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKGluY29taW5nKSwgPT0sICJGaXJzdCIpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKGluY29taW5nKTsKKworICBpbmNvbWluZyA9IGdfcXVldWVfcG9wX2hlYWQgKCZmLT5tZXNzYWdlcyk7CisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKGluY29taW5nKSwgPT0sICJTZWNvbmQiKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChpbmNvbWluZyk7Cit9CisKKy8qIEFuIGFyYml0cmFyeSBudW1iZXIgb2YgbWVzc2FnZXMgKi8KKyNkZWZpbmUgTUFOWSA4MTkyCisKK3N0YXRpYyB2b2lkCit0ZXN0X2xpbWl0IChGaXh0dXJlICpmLAorICAgIGdjb25zdHBvaW50ZXIgZGF0YSkKK3sKKyAgREJ1c01lc3NhZ2UgKmluY29taW5nOworICBndWludCBpOworCisgIGlmIChmLT5za2lwKQorICAgIHJldHVybjsKKworICB0ZXN0X2Nvbm5lY3QgKGYsIGRhdGEpOworCisgIC8qIFRoaXMgd2FzIGFuIGF0dGVtcHQgdG8gcmVwcm9kdWNlIGZkLm8gIzM0MzkzLiBJdCBkaWRuJ3Qgd29yay4gKi8KKyAgZ190ZXN0X2J1ZyAoIjM0MzkzIik7CisgIGRidXNfY29ubmVjdGlvbl9zZXRfbWF4X3JlY2VpdmVkX3NpemUgKGYtPmxlZnRfc2VydmVyX2Nvbm4sIDEpOworICB0ZXN0X21haW5fY29udGV4dF9pdGVyYXRlIChmLT5jdHgsIFRSVUUpOworCisgIGZvciAoaSA9IDA7IGkgPCBNQU5ZOyBpKyspCisgICAgeworICAgICAgZ2NoYXIgKmJ1ZiA9IGdfc3RyZHVwX3ByaW50ZiAoIk1lc3NhZ2UldSIsIGkpOworCisgICAgICBzZW5kX29uZSAoZiwgYnVmKTsKKyAgICAgIGdfZnJlZSAoYnVmKTsKKyAgICB9CisKKyAgaSA9IDA7CisKKyAgd2hpbGUgKGkgPCBNQU5ZKQorICAgIHsKKyAgICAgIHdoaWxlIChnX3F1ZXVlX2lzX2VtcHR5ICgmZi0+bWVzc2FnZXMpKQorICAgICAgICB7CisgICAgICAgICAgdGVzdF9tYWluX2NvbnRleHRfaXRlcmF0ZSAoZi0+Y3R4LCBUUlVFKTsKKyAgICAgICAgfQorCisgICAgICB3aGlsZSAoKGluY29taW5nID0gZ19xdWV1ZV9wb3BfaGVhZCAoJmYtPm1lc3NhZ2VzKSkgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGkrKzsKKyAgICAgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKGluY29taW5nKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQKK3RlYXJkb3duIChGaXh0dXJlICpmLAorICAgIGdjb25zdHBvaW50ZXIgZGF0YSBHX0dOVUNfVU5VU0VEKQoreworICBpZiAoZi0+bGVmdF9jbGllbnRfY29ubiAhPSBOVUxMKQorICAgIHsKKyAgICAgIHRlc3RfY29ubmVjdGlvbl9zaHV0ZG93bihOVUxMLCBmLT5sZWZ0X2NsaWVudF9jb25uKTsKKyAgICAgIGRidXNfY29ubmVjdGlvbl9jbG9zZSAoZi0+bGVmdF9jbGllbnRfY29ubik7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGYtPmxlZnRfY2xpZW50X2Nvbm4pOworICAgICAgZi0+bGVmdF9jbGllbnRfY29ubiA9IE5VTEw7CisgICAgfQorCisgIGlmIChmLT5yaWdodF9jbGllbnRfY29ubiAhPSBOVUxMKQorICAgIHsKKyAgICAgIHRlc3RfY29ubmVjdGlvbl9zaHV0ZG93bihOVUxMLCBmLT5yaWdodF9jbGllbnRfY29ubik7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fY2xvc2UgKGYtPnJpZ2h0X2NsaWVudF9jb25uKTsKKyAgICAgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoZi0+cmlnaHRfY2xpZW50X2Nvbm4pOworICAgICAgZi0+cmlnaHRfY2xpZW50X2Nvbm4gPSBOVUxMOworICAgIH0KKworICBpZiAoZi0+bGVmdF9zZXJ2ZXJfY29ubiAhPSBOVUxMKQorICAgIHsKKyAgICAgIHRlc3RfY29ubmVjdGlvbl9zaHV0ZG93bihOVUxMLCBmLT5sZWZ0X3NlcnZlcl9jb25uKTsKKyAgICAgIGRidXNfY29ubmVjdGlvbl9jbG9zZSAoZi0+bGVmdF9zZXJ2ZXJfY29ubik7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGYtPmxlZnRfc2VydmVyX2Nvbm4pOworICAgICAgZi0+bGVmdF9zZXJ2ZXJfY29ubiA9IE5VTEw7CisgICAgfQorCisgIGlmIChmLT5yaWdodF9zZXJ2ZXJfY29ubiAhPSBOVUxMKQorICAgIHsKKyAgICAgIHRlc3RfY29ubmVjdGlvbl9zaHV0ZG93bihOVUxMLCBmLT5yaWdodF9zZXJ2ZXJfY29ubik7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fY2xvc2UgKGYtPnJpZ2h0X3NlcnZlcl9jb25uKTsKKyAgICAgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoZi0+cmlnaHRfc2VydmVyX2Nvbm4pOworICAgICAgZi0+cmlnaHRfc2VydmVyX2Nvbm4gPSBOVUxMOworICAgIH0KKworICBpZiAoZi0+c2VydmVyICE9IE5VTEwpCisgICAgeworICAgICAgZGJ1c19zZXJ2ZXJfZGlzY29ubmVjdCAoZi0+c2VydmVyKTsKKyAgICAgIGRidXNfc2VydmVyX3VucmVmIChmLT5zZXJ2ZXIpOworICAgICAgZi0+c2VydmVyID0gTlVMTDsKKyAgICB9CisKKyAgdGVzdF9tYWluX2NvbnRleHRfdW5yZWYgKGYtPmN0eCk7Cit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsCisgICAgY2hhciAqKmFyZ3YpCit7CisgIHRlc3RfaW5pdCAoJmFyZ2MsICZhcmd2KTsKKworICBnX3Rlc3RfYWRkICgiL2Nvbm5lY3QvdGNwIiwgRml4dHVyZSwgInRjcDpob3N0PTEyNy4wLjAuMSIsIHNldHVwLAorICAgICAgdGVzdF9jb25uZWN0LCB0ZWFyZG93bik7CisgIGdfdGVzdF9hZGQgKCIvcmVsYXkvdGNwIiwgRml4dHVyZSwgInRjcDpob3N0PTEyNy4wLjAuMSIsIHNldHVwLAorICAgICAgdGVzdF9yZWxheSwgdGVhcmRvd24pOworICBnX3Rlc3RfYWRkICgiL2xpbWl0L3RjcCIsIEZpeHR1cmUsICJ0Y3A6aG9zdD0xMjcuMC4wLjEiLCBzZXR1cCwKKyAgICAgIHRlc3RfbGltaXQsIHRlYXJkb3duKTsKKworI2lmZGVmIERCVVNfVU5JWAorICBnX3Rlc3RfYWRkICgiL2Nvbm5lY3QvdW5peCIsIEZpeHR1cmUsICJ1bml4OnRtcGRpcj0vdG1wIiwgc2V0dXAsCisgICAgICB0ZXN0X2Nvbm5lY3QsIHRlYXJkb3duKTsKKyAgZ190ZXN0X2FkZCAoIi9yZWxheS91bml4IiwgRml4dHVyZSwgInVuaXg6dG1wZGlyPS90bXAiLCBzZXR1cCwKKyAgICAgIHRlc3RfcmVsYXksIHRlYXJkb3duKTsKKyAgZ190ZXN0X2FkZCAoIi9saW1pdC91bml4IiwgRml4dHVyZSwgInVuaXg6dG1wZGlyPS90bXAiLCBzZXR1cCwKKyAgICAgIHRlc3RfbGltaXQsIHRlYXJkb3duKTsKKyNlbmRpZgorCisgIHJldHVybiBnX3Rlc3RfcnVuICgpOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9zZC1hY3RpdmF0aW9uLmMgYi90ZXN0L3NkLWFjdGl2YXRpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTBiMmFmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zZC1hY3RpdmF0aW9uLmMKQEAgLTAsMCArMSwxMTQyIEBACisvKiBVbml0IHRlc3RzIGZvciBzeXN0ZW1kIGFjdGl2YXRpb24sIHdpdGggb3Igd2l0aG91dCBBcHBBcm1vci4KKyAqCisgKiBXZSBjb21waWxlIHRoaXMgc291cmNlIGZpbGUgdHdpY2U6IG9uY2Ugd2l0aCBBcHBBcm1vciBzdXBwb3J0IChpZiBhdmFpbGFibGUpCisgKiBhbmQgb25jZSB3aXRob3V0LgorICoKKyAqIENvcHlyaWdodCDCqSAyMDEwLTIwMTEgTm9raWEgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCDCqSAyMDE1IENvbGxhYm9yYSBMdGQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzCisgKiAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLAorICogaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwKKyAqIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsCisgKiBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAorICogc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKKyAqIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPGdsaWIvZ3N0ZGlvLmg+CisKKyNpZiBkZWZpbmVkKEhBVkVfQVBQQVJNT1JfMl8xMCkgJiYgZGVmaW5lZChEQlVTX1RFU1RfQVBQQVJNT1JfQUNUSVZBVElPTikKKyNpbmNsdWRlIDxzeXMvYXBwYXJtb3IuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAidGVzdC11dGlscy1nbGliLmgiCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBUZXN0TWFpbkNvbnRleHQgKmN0eDsKKyAgICBEQnVzRXJyb3IgZTsKKyAgICBHRXJyb3IgKmdlOworCisgICAgZ2NoYXIgKmFkZHJlc3M7CisgICAgR1BpZCBkYWVtb25fcGlkOworCisgICAgREJ1c0Nvbm5lY3Rpb24gKmNhbGxlcjsKKyAgICBjb25zdCBjaGFyICpjYWxsZXJfbmFtZTsKKyAgICBEQnVzTWVzc2FnZSAqY2FsbGVyX21lc3NhZ2U7CisgICAgZGJ1c19ib29sX3QgY2FsbGVyX2ZpbHRlcl9hZGRlZDsKKworICAgIERCdXNDb25uZWN0aW9uICpzeXN0ZW1kOworICAgIGNvbnN0IGNoYXIgKnN5c3RlbWRfbmFtZTsKKyAgICBEQnVzTWVzc2FnZSAqc3lzdGVtZF9tZXNzYWdlOworICAgIGRidXNfYm9vbF90IHN5c3RlbWRfZmlsdGVyX2FkZGVkOworCisgICAgREJ1c0Nvbm5lY3Rpb24gKmFjdGl2YXRlZDsKKyAgICBjb25zdCBjaGFyICphY3RpdmF0ZWRfbmFtZTsKKyAgICBEQnVzTWVzc2FnZSAqYWN0aXZhdGVkX21lc3NhZ2U7CisgICAgZGJ1c19ib29sX3QgYWN0aXZhdGVkX2ZpbHRlcl9hZGRlZDsKKworICAgIGdjaGFyICp0cmFuc2llbnRfc2VydmljZV9maWxlOworICAgIGdjaGFyICp0bXBfcnVudGltZV9kaXI7Cit9IEZpeHR1cmU7CisKK3R5cGVkZWYgZW51bQoreworICBGTEFHX0VBUkxZX1RSQU5TSUVOVF9TRVJWSUNFID0gKDEgPDwgMCksCisgIEZMQUdfTk9ORSA9IDAKK30gRmxhZ3M7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGNvbnN0IGdjaGFyICpidXNfbmFtZTsKKyAgRmxhZ3MgZmxhZ3M7Cit9IENvbmZpZzsKKworLyogdGhpcyBpcyBhIG1hY3JvIHNvIGl0IGdldHMgdGhlIHJpZ2h0IGxpbmUgbnVtYmVyICovCisjZGVmaW5lIGFzc2VydF9zaWduYWwobSwgXAorICAgIHNlbmRlciwgcGF0aCwgaWZhY2UsIG1lbWJlciwgc2lnbmF0dXJlLCBcCisgICAgZGVzdGluYXRpb24pIFwKK2RvIHsgXAorICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV90eXBlX3RvX3N0cmluZyAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtKSksIFwKKyAgICAgID09LCBkYnVzX21lc3NhZ2VfdHlwZV90b19zdHJpbmcgKERCVVNfTUVTU0FHRV9UWVBFX1NJR05BTCkpOyBcCisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9zZW5kZXIgKG0pLCA9PSwgc2VuZGVyKTsgXAorICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfZGVzdGluYXRpb24gKG0pLCA9PSwgZGVzdGluYXRpb24pOyBcCisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9wYXRoIChtKSwgPT0sIHBhdGgpOyBcCisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG0pLCA9PSwgaWZhY2UpOyBcCisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKG0pLCA9PSwgbWVtYmVyKTsgXAorICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfc2lnbmF0dXJlIChtKSwgPT0sIHNpZ25hdHVyZSk7IFwKKyAgZ19hc3NlcnRfY21waW50IChkYnVzX21lc3NhZ2VfZ2V0X3NlcmlhbCAobSksICE9LCAwKTsgXAorICBnX2Fzc2VydF9jbXBpbnQgKGRidXNfbWVzc2FnZV9nZXRfcmVwbHlfc2VyaWFsIChtKSwgPT0sIDApOyBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIGFzc2VydF9tZXRob2RfY2FsbChtLCBzZW5kZXIsIFwKKyAgICBkZXN0aW5hdGlvbiwgcGF0aCwgaWZhY2UsIG1ldGhvZCwgc2lnbmF0dXJlKSBcCitkbyB7IFwKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfdHlwZV90b19zdHJpbmcgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobSkpLCBcCisgICAgICA9PSwgZGJ1c19tZXNzYWdlX3R5cGVfdG9fc3RyaW5nIChEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfQ0FMTCkpOyBcCisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9zZW5kZXIgKG0pLCA9PSwgc2VuZGVyKTsgXAorICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfZGVzdGluYXRpb24gKG0pLCA9PSwgZGVzdGluYXRpb24pOyBcCisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9wYXRoIChtKSwgPT0sIHBhdGgpOyBcCisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG0pLCA9PSwgaWZhY2UpOyBcCisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKG0pLCA9PSwgbWV0aG9kKTsgXAorICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfc2lnbmF0dXJlIChtKSwgPT0sIHNpZ25hdHVyZSk7IFwKKyAgZ19hc3NlcnRfY21waW50IChkYnVzX21lc3NhZ2VfZ2V0X3NlcmlhbCAobSksICE9LCAwKTsgXAorICBnX2Fzc2VydF9jbXBpbnQgKGRidXNfbWVzc2FnZV9nZXRfcmVwbHlfc2VyaWFsIChtKSwgPT0sIDApOyBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIGFzc2VydF9tZXRob2RfcmVwbHkobSwgc2VuZGVyLCBkZXN0aW5hdGlvbiwgc2lnbmF0dXJlKSBcCitkbyB7IFwKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfdHlwZV90b19zdHJpbmcgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobSkpLCBcCisgICAgICA9PSwgZGJ1c19tZXNzYWdlX3R5cGVfdG9fc3RyaW5nIChEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfUkVUVVJOKSk7IFwKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X3NlbmRlciAobSksID09LCBzZW5kZXIpOyBcCisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9kZXN0aW5hdGlvbiAobSksID09LCBkZXN0aW5hdGlvbik7IFwKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X3BhdGggKG0pLCA9PSwgTlVMTCk7IFwKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAobSksID09LCBOVUxMKTsgXAorICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtKSwgPT0sIE5VTEwpOyBcCisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9zaWduYXR1cmUgKG0pLCA9PSwgc2lnbmF0dXJlKTsgXAorICBnX2Fzc2VydF9jbXBpbnQgKGRidXNfbWVzc2FnZV9nZXRfc2VyaWFsIChtKSwgIT0sIDApOyBcCisgIGdfYXNzZXJ0X2NtcGludCAoZGJ1c19tZXNzYWdlX2dldF9yZXBseV9zZXJpYWwgKG0pLCAhPSwgMCk7IFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgYXNzZXJ0X2Vycm9yX3JlcGx5KG0sIHNlbmRlciwgZGVzdGluYXRpb24sIGVycm9yX25hbWUpIFwKK2RvIHsgXAorICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV90eXBlX3RvX3N0cmluZyAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtKSksIFwKKyAgICAgID09LCBkYnVzX21lc3NhZ2VfdHlwZV90b19zdHJpbmcgKERCVVNfTUVTU0FHRV9UWVBFX0VSUk9SKSk7IFwKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X3NlbmRlciAobSksID09LCBzZW5kZXIpOyBcCisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9kZXN0aW5hdGlvbiAobSksID09LCBkZXN0aW5hdGlvbik7IFwKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X2Vycm9yX25hbWUgKG0pLCA9PSwgZXJyb3JfbmFtZSk7IFwKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X3BhdGggKG0pLCA9PSwgTlVMTCk7IFwKKyAgZ19hc3NlcnRfY21wc3RyIChkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAobSksID09LCBOVUxMKTsgXAorICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtKSwgPT0sIE5VTEwpOyBcCisgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9zaWduYXR1cmUgKG0pLCA9PSwgInMiKTsgXAorICBnX2Fzc2VydF9jbXBpbnQgKGRidXNfbWVzc2FnZV9nZXRfc2VyaWFsIChtKSwgIT0sIDApOyBcCisgIGdfYXNzZXJ0X2NtcGludCAoZGJ1c19tZXNzYWdlX2dldF9yZXBseV9zZXJpYWwgKG0pLCAhPSwgMCk7IFwKK30gd2hpbGUgKDApCisKK3N0YXRpYyBEQnVzSGFuZGxlclJlc3VsdAorc3lzdGVtZF9maWx0ZXIgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgIERCdXNNZXNzYWdlICptZXNzYWdlLAorICAgIHZvaWQgKnVzZXJfZGF0YSkKK3sKKyAgRml4dHVyZSAqZiA9IHVzZXJfZGF0YTsKKworICBpZiAoZGJ1c19tZXNzYWdlX2lzX3NpZ25hbCAobWVzc2FnZSwgREJVU19JTlRFUkZBQ0VfREJVUywKKyAgICAgICAgIk5hbWVBY3F1aXJlZCIpIHx8CisgICAgICBkYnVzX21lc3NhZ2VfaXNfc2lnbmFsIChtZXNzYWdlLCBEQlVTX0lOVEVSRkFDRV9EQlVTLAorICAgICAgICAiTmFtZUxvc3QiKSkKKyAgICB7CisgICAgICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9OT1RfWUVUX0hBTkRMRUQ7CisgICAgfQorCisgIGdfdGVzdF9tZXNzYWdlKCJzZW5kZXIgJXMgaWZhY2UgJXMgbWVtYmVyICVzIiwKKyAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9zZW5kZXIgKG1lc3NhZ2UpLAorICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X2ludGVyZmFjZSAobWVzc2FnZSksCisgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKSk7CisKKworICBnX2Fzc2VydCAoZi0+c3lzdGVtZF9tZXNzYWdlID09IE5VTEwpOworICBmLT5zeXN0ZW1kX21lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfcmVmIChtZXNzYWdlKTsKKworICBpZiAoZGJ1c19tZXNzYWdlX2lzX21ldGhvZF9jYWxsIChtZXNzYWdlLCAib3JnLmZyZWVkZXNrdG9wLnN5c3RlbWQxLk1hbmFnZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2V0RW52aXJvbm1lbnQiKSkKKyAgICB7CisgICAgICBnX2Fzc2VydCAoZGJ1c19tZXNzYWdlX2dldF9ub19yZXBseSAobWVzc2FnZSkpOworICAgICAgZ190ZXN0X21lc3NhZ2UoImdvdCBjYWxsIik7CisgICAgICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9IQU5ETEVEOworICAgIH0KKworICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9OT1RfWUVUX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBEQnVzSGFuZGxlclJlc3VsdAorYWN0aXZhdGVkX2ZpbHRlciAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgREJ1c01lc3NhZ2UgKm1lc3NhZ2UsCisgICAgdm9pZCAqdXNlcl9kYXRhKQoreworICBGaXh0dXJlICpmID0gdXNlcl9kYXRhOworCisgIGlmIChkYnVzX21lc3NhZ2VfaXNfc2lnbmFsIChtZXNzYWdlLCBEQlVTX0lOVEVSRkFDRV9EQlVTLAorICAgICAgICAiTmFtZUFjcXVpcmVkIikgfHwKKyAgICAgIGRidXNfbWVzc2FnZV9pc19zaWduYWwgKG1lc3NhZ2UsIERCVVNfSU5URVJGQUNFX0RCVVMsCisgICAgICAgICJOYW1lTG9zdCIpKQorICAgIHsKKyAgICAgIHJldHVybiBEQlVTX0hBTkRMRVJfUkVTVUxUX05PVF9ZRVRfSEFORExFRDsKKyAgICB9CisKKyAgZ19hc3NlcnQgKGYtPmFjdGl2YXRlZF9tZXNzYWdlID09IE5VTEwpOworICBmLT5hY3RpdmF0ZWRfbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9yZWYgKG1lc3NhZ2UpOworCisgIC8qIFRlc3QgY29kZSBpcyBleHBlY3RlZCB0byByZXBseSB0byBtZXRob2QgY2FsbHMgaXRzZWxmICovCisgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKG1lc3NhZ2UpID09IERCVVNfTUVTU0FHRV9UWVBFX01FVEhPRF9DQUxMKQorICAgIHJldHVybiBEQlVTX0hBTkRMRVJfUkVTVUxUX0hBTkRMRUQ7CisKKyAgcmV0dXJuIERCVVNfSEFORExFUl9SRVNVTFRfTk9UX1lFVF9IQU5ETEVEOworfQorCitzdGF0aWMgREJ1c0hhbmRsZXJSZXN1bHQKK2NhbGxlcl9maWx0ZXIgKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLAorICAgIERCdXNNZXNzYWdlICptZXNzYWdlLAorICAgIHZvaWQgKnVzZXJfZGF0YSkKK3sKKyAgRml4dHVyZSAqZiA9IHVzZXJfZGF0YTsKKworICBpZiAoZGJ1c19tZXNzYWdlX2lzX3NpZ25hbCAobWVzc2FnZSwgREJVU19JTlRFUkZBQ0VfREJVUywKKyAgICAgICAgIk5hbWVBY3F1aXJlZCIpIHx8CisgICAgICBkYnVzX21lc3NhZ2VfaXNfc2lnbmFsIChtZXNzYWdlLCBEQlVTX0lOVEVSRkFDRV9EQlVTLAorICAgICAgICAiTmFtZUxvc3QiKSkKKyAgICB7CisgICAgICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9OT1RfWUVUX0hBTkRMRUQ7CisgICAgfQorCisgIGdfYXNzZXJ0IChmLT5jYWxsZXJfbWVzc2FnZSA9PSBOVUxMKTsKKyAgZi0+Y2FsbGVyX21lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfcmVmIChtZXNzYWdlKTsKKworICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9OT1RfWUVUX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyB2b2lkCitmaXh0dXJlX2NyZWF0ZV90cmFuc2llbnRfc2VydmljZSAoRml4dHVyZSAqZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAqbmFtZSkKK3sKKyAgZ2NoYXIgKnNlcnZpY2U7CisgIGdjaGFyICpjb250ZW50OworICBnYm9vbGVhbiBvazsKKworICBzZXJ2aWNlID0gZ19zdHJkdXBfcHJpbnRmICgiJXMuc2VydmljZSIsIG5hbWUpOworICBmLT50cmFuc2llbnRfc2VydmljZV9maWxlID0gZ19idWlsZF9maWxlbmFtZSAoZi0+dG1wX3J1bnRpbWVfZGlyLCAiZGJ1cy0xIiwKKyAgICAgICJzZXJ2aWNlcyIsIHNlcnZpY2UsIE5VTEwpOworICBnX2ZyZWUgKHNlcnZpY2UpOworCisgIGNvbnRlbnQgPSBnX3N0cmR1cF9wcmludGYgKAorICAgICAgIltELUJVUyBTZXJ2aWNlXVxuIgorICAgICAgIk5hbWU9JXNcbiIKKyAgICAgICJFeGVjPS9iaW4vZmFsc2UgJXNcbiIKKyAgICAgICJTeXN0ZW1kU2VydmljZT1kYnVzLSVzLnNlcnZpY2VcbiIsIG5hbWUsIG5hbWUsIG5hbWUpOworICBvayA9IGdfZmlsZV9zZXRfY29udGVudHMgKGYtPnRyYW5zaWVudF9zZXJ2aWNlX2ZpbGUsIGNvbnRlbnQsIC0xLCAmZi0+Z2UpOworICBnX2Fzc2VydF9ub19lcnJvciAoZi0+Z2UpOworICBnX2Fzc2VydCAob2spOworICBnX2ZyZWUgKGNvbnRlbnQpOworfQorCitzdGF0aWMgdm9pZAorc2V0dXAgKEZpeHR1cmUgKmYsCisgICAgZ2NvbnN0cG9pbnRlciBjb250ZXh0KQoreworICBjb25zdCBDb25maWcgKmNvbmZpZyA9IGNvbnRleHQ7CisjaWYgZGVmaW5lZChEQlVTX1RFU1RfQVBQQVJNT1JfQUNUSVZBVElPTikgJiYgZGVmaW5lZChIQVZFX0FQUEFSTU9SXzJfMTApCisgIGFhX2ZlYXR1cmVzICpmZWF0dXJlczsKKyNlbmRpZgorCisgIGYtPmdlID0gTlVMTDsKKyAgZGJ1c19lcnJvcl9pbml0ICgmZi0+ZSk7CisKKyAgZi0+dG1wX3J1bnRpbWVfZGlyID0gZ19kaXJfbWFrZV90bXAgKCJkYnVzLWRhZW1vbi10ZXN0LlhYWFhYWCIsICZmLT5nZSk7CisgIGdfYXNzZXJ0X25vX2Vycm9yIChmLT5nZSk7CisKKyAgaWYgKGNvbmZpZyAhPSBOVUxMICYmIChjb25maWctPmZsYWdzICYgRkxBR19FQVJMWV9UUkFOU0lFTlRfU0VSVklDRSkgIT0gMCkKKyAgICB7CisgICAgICBnY2hhciAqZGJ1czEgPSBnX2J1aWxkX2ZpbGVuYW1lIChmLT50bXBfcnVudGltZV9kaXIsICJkYnVzLTEiLCBOVUxMKTsKKyAgICAgIGdjaGFyICpzZXJ2aWNlcyA9IGdfYnVpbGRfZmlsZW5hbWUgKGRidXMxLCAic2VydmljZXMiLCBOVUxMKTsKKworICAgICAgLyogV2UganVzdCBjcmVhdGVkIGl0IHNvIHRoZSBkaXJlY3RvcmllcyBzaG91bGRuJ3QgZXhpc3QgeWV0ICovCisgICAgICB0ZXN0X21rZGlyIChkYnVzMSwgMDcwMCk7CisgICAgICB0ZXN0X21rZGlyIChzZXJ2aWNlcywgMDcwMCk7CisgICAgICBmaXh0dXJlX2NyZWF0ZV90cmFuc2llbnRfc2VydmljZSAoZiwgY29uZmlnLT5idXNfbmFtZSk7CisgICAgICBnX2ZyZWUgKGRidXMxKTsKKyAgICAgIGdfZnJlZSAoc2VydmljZXMpOworICAgIH0KKworI2lmIGRlZmluZWQoREJVU19URVNUX0FQUEFSTU9SX0FDVElWQVRJT04pICYmICFkZWZpbmVkKEhBVkVfQVBQQVJNT1JfMl8xMCkKKworICBnX3Rlc3Rfc2tpcCAoIkFwcEFybW9yIHN1cHBvcnQgbm90IGNvbXBpbGVkIG9yIEFwcEFybW9yIDIuMTAgdW5hdmFpbGFibGUiKTsKKyAgcmV0dXJuOworCisjZWxzZQorCisjaWYgZGVmaW5lZChEQlVTX1RFU1RfQVBQQVJNT1JfQUNUSVZBVElPTikKKyAgaWYgKCFhYV9pc19lbmFibGVkICgpKQorICAgIHsKKyAgICAgIGdfdGVzdF9tZXNzYWdlICgiYWFfaXNfZW5hYmxlZCgpIC0+ICVzIiwgZ19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIGdfdGVzdF9za2lwICgiQXBwQXJtb3Igbm90IGVuYWJsZWQiKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKGFhX2ZlYXR1cmVzX25ld19mcm9tX2tlcm5lbCAoJmZlYXR1cmVzKSAhPSAwKQorICAgIHsKKyAgICAgIGdfdGVzdF9za2lwICgiVW5hYmxlIHRvIGNoZWNrIEFwcEFybW9yIGZlYXR1cmVzIik7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmICghYWFfZmVhdHVyZXNfc3VwcG9ydHMgKGZlYXR1cmVzLCAiZGJ1cy9tYXNrL3NlbmQiKSB8fAorICAgICAgIWFhX2ZlYXR1cmVzX3N1cHBvcnRzIChmZWF0dXJlcywgImRidXMvbWFzay9yZWNlaXZlIikpCisgICAgeworICAgICAgZ190ZXN0X3NraXAgKCJELUJ1cyBzZW5kL3JlY2VpdmUgbWVkaWF0aW9uIHVuYXZhaWxhYmxlIik7CisgICAgICBhYV9mZWF0dXJlc191bnJlZiAoZmVhdHVyZXMpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBhYV9mZWF0dXJlc191bnJlZiAoZmVhdHVyZXMpOworI2VuZGlmCisKKyAgZi0+Y3R4ID0gdGVzdF9tYWluX2NvbnRleHRfZ2V0ICgpOworCisgIGYtPmFkZHJlc3MgPSB0ZXN0X2dldF9kYnVzX2RhZW1vbiAoCisgICAgICAidmFsaWQtY29uZmlnLWZpbGVzL3N5c3RlbWQtYWN0aXZhdGlvbi5jb25mIiwKKyAgICAgIFRFU1RfVVNFUl9NRSwgZi0+dG1wX3J1bnRpbWVfZGlyLCAmZi0+ZGFlbW9uX3BpZCk7CisKKyAgaWYgKGYtPmFkZHJlc3MgPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyNpZiBkZWZpbmVkKERCVVNfVEVTVF9BUFBBUk1PUl9BQ1RJVkFUSU9OKQorICAvKgorICAgKiBNYWtlIHVzZSBvZiB0aGUgZmFjdCB0aGF0IHRoZSBMU00gc2VjdXJpdHkgbGFiZWwgKGFuZCBvdGhlciBwcm9jZXNzCisgICAqIHByb3BlcnRpZXMpIHRoYXQgYXJlIHVzZWQgZm9yIGFjY2Vzcy1jb250cm9sIGFyZSB3aGF0ZXZlciB3YXMgY3VycmVudAorICAgKiBhdCB0aGUgdGltZSB0aGUgY29ubmVjdGlvbiB3YXMgb3BlbmVkLgorICAgKgorICAgKiA0MiBpcyBhcmJpdHJhcnkuIEluIGEgcmVhbCB1c2Ugb2YgQXBwQXJtb3IgaXQgd291bGQgYmUgYSBzZWN1cmVseS1yYW5kb20KKyAgICogdmFsdWUsIHRvIHByZXZlbnQgbGVzcy1wcml2aWxlZ2VkIGNvZGUgKHRoYXQgZG9lcyBub3Qga25vdyB0aGUgbWFnaWMKKyAgICogdmFsdWUpIGZyb20gY2hhbmdpbmcgYmFjay4KKyAgICovCisgIGlmIChhYV9jaGFuZ2VfaGF0ICgiY2FsbGVyIiwgNDIpICE9IDApCisgICAgZ19lcnJvciAoIlVuYWJsZSB0byBjaGFuZ2UgcHJvZmlsZSB0byAuLi4vL15jYWxsZXI6ICVzIiwKKyAgICAgICAgICAgICBnX3N0cmVycm9yIChlcnJubykpOworI2VuZGlmCisKKyAgZi0+Y2FsbGVyID0gdGVzdF9jb25uZWN0X3RvX2J1cyAoZi0+Y3R4LCBmLT5hZGRyZXNzKTsKKyAgZi0+Y2FsbGVyX25hbWUgPSBkYnVzX2J1c19nZXRfdW5pcXVlX25hbWUgKGYtPmNhbGxlcik7CisKKyNpZiBkZWZpbmVkKERCVVNfVEVTVF9BUFBBUk1PUl9BQ1RJVkFUSU9OKQorICBpZiAoYWFfY2hhbmdlX2hhdCAoTlVMTCwgNDIpICE9IDApCisgICAgZ19lcnJvciAoIlVuYWJsZSB0byBjaGFuZ2UgYmFjayB0byBpbml0aWFsIHByb2ZpbGU6ICVzIiwKKyAgICAgICAgICAgICBnX3N0cmVycm9yIChlcnJubykpOworI2VuZGlmCisKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZAordGFrZV93ZWxsX2tub3duX25hbWUgKEZpeHR1cmUgKmYsCisgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgaW50IHJldDsKKworICByZXQgPSBkYnVzX2J1c19yZXF1ZXN0X25hbWUgKGNvbm5lY3Rpb24sIG5hbWUsCisgICAgICBEQlVTX05BTUVfRkxBR19ET19OT1RfUVVFVUUsICZmLT5lKTsKKyAgdGVzdF9hc3NlcnRfbm9fZXJyb3IgKCZmLT5lKTsKKyAgZ19hc3NlcnRfY21waW50IChyZXQsID09LCBEQlVTX1JFUVVFU1RfTkFNRV9SRVBMWV9QUklNQVJZX09XTkVSKTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfYWN0aXZhdGlvbiAoRml4dHVyZSAqZiwKKyAgICBnY29uc3Rwb2ludGVyIGNvbnRleHQpCit7CisgIERCdXNNZXNzYWdlICptOworCisgIGlmIChmLT5hZGRyZXNzID09IE5VTEwpCisgICAgcmV0dXJuOworCisgIC8qIFRoZSBzZW5kZXIgc2VuZHMgYSBtZXNzYWdlIHRvIGFuIGFjdGl2YXRhYmxlIHNlcnZpY2UuICovCisgIG0gPSBkYnVzX21lc3NhZ2VfbmV3X3NpZ25hbCAoIi9mb28iLCAiY29tLmV4YW1wbGUuYmFyIiwgIlVuaWNhc3RTaWduYWwxIik7CisgIGlmICghZGJ1c19tZXNzYWdlX3NldF9kZXN0aW5hdGlvbiAobSwgImNvbS5leGFtcGxlLlN5c3RlbWRBY3RpdmF0YWJsZTEiKSkKKyAgICBnX2Vycm9yICgiT09NIik7CisgIGRidXNfY29ubmVjdGlvbl9zZW5kIChmLT5jYWxsZXIsIG0sIE5VTEwpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworCisgIC8qIFRoZSBmYWtlIHN5c3RlbWQgY29ubmVjdHMgdG8gdGhlIGJ1cy4gKi8KKyAgZi0+c3lzdGVtZCA9IHRlc3RfY29ubmVjdF90b19idXMgKGYtPmN0eCwgZi0+YWRkcmVzcyk7CisgIGlmICghZGJ1c19jb25uZWN0aW9uX2FkZF9maWx0ZXIgKGYtPnN5c3RlbWQsIHN5c3RlbWRfZmlsdGVyLCBmLCBOVUxMKSkKKyAgICBnX2Vycm9yICgiT09NIik7CisgIGYtPnN5c3RlbWRfZmlsdGVyX2FkZGVkID0gVFJVRTsKKyAgZi0+c3lzdGVtZF9uYW1lID0gZGJ1c19idXNfZ2V0X3VuaXF1ZV9uYW1lIChmLT5zeXN0ZW1kKTsKKyAgdGFrZV93ZWxsX2tub3duX25hbWUgKGYsIGYtPnN5c3RlbWQsICJvcmcuZnJlZWRlc2t0b3Auc3lzdGVtZDEiKTsKKworICAvKiBJdCBnZXRzIGl0cyBhY3RpdmF0aW9uIHJlcXVlc3QuICovCisgIHdoaWxlIChmLT5zeXN0ZW1kX21lc3NhZ2UgPT0gTlVMTCkKKyAgICB0ZXN0X21haW5fY29udGV4dF9pdGVyYXRlIChmLT5jdHgsIFRSVUUpOworCisgIG0gPSBmLT5zeXN0ZW1kX21lc3NhZ2U7CisgIGYtPnN5c3RlbWRfbWVzc2FnZSA9IE5VTEw7CisgIGFzc2VydF9zaWduYWwgKG0sIERCVVNfU0VSVklDRV9EQlVTLCBEQlVTX1BBVEhfREJVUywKKyAgICAgICJvcmcuZnJlZWRlc2t0b3Auc3lzdGVtZDEuQWN0aXZhdG9yIiwgIkFjdGl2YXRpb25SZXF1ZXN0IiwgInMiLAorICAgICAgIm9yZy5mcmVlZGVza3RvcC5zeXN0ZW1kMSIpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworCisgIC8qIHN5c3RlbWQgc3RhcnRzIHRoZSBhY3RpdmF0YWJsZSBzZXJ2aWNlLiAqLworICBmLT5hY3RpdmF0ZWQgPSB0ZXN0X2Nvbm5lY3RfdG9fYnVzIChmLT5jdHgsIGYtPmFkZHJlc3MpOworICBpZiAoIWRidXNfY29ubmVjdGlvbl9hZGRfZmlsdGVyIChmLT5hY3RpdmF0ZWQsIGFjdGl2YXRlZF9maWx0ZXIsCisgICAgICAgIGYsIE5VTEwpKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKyAgZi0+YWN0aXZhdGVkX2ZpbHRlcl9hZGRlZCA9IFRSVUU7CisgIGYtPmFjdGl2YXRlZF9uYW1lID0gZGJ1c19idXNfZ2V0X3VuaXF1ZV9uYW1lIChmLT5hY3RpdmF0ZWQpOworICB0YWtlX3dlbGxfa25vd25fbmFtZSAoZiwgZi0+YWN0aXZhdGVkLCAiY29tLmV4YW1wbGUuU3lzdGVtZEFjdGl2YXRhYmxlMSIpOworCisgIC8qIFRoZSBtZXNzYWdlIGlzIGRlbGl2ZXJlZCB0byB0aGUgYWN0aXZhdGFibGUgc2VydmljZS4gKi8KKyAgd2hpbGUgKGYtPmFjdGl2YXRlZF9tZXNzYWdlID09IE5VTEwpCisgICAgdGVzdF9tYWluX2NvbnRleHRfaXRlcmF0ZSAoZi0+Y3R4LCBUUlVFKTsKKworICBtID0gZi0+YWN0aXZhdGVkX21lc3NhZ2U7CisgIGYtPmFjdGl2YXRlZF9tZXNzYWdlID0gTlVMTDsKKyAgYXNzZXJ0X3NpZ25hbCAobSwgZi0+Y2FsbGVyX25hbWUsICIvZm9vIiwKKyAgICAgICJjb20uZXhhbXBsZS5iYXIiLCAiVW5pY2FzdFNpZ25hbDEiLCAiIiwKKyAgICAgICJjb20uZXhhbXBsZS5TeXN0ZW1kQWN0aXZhdGFibGUxIik7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisKKyAgLyogVGhlIHNlbmRlciBzZW5kcyBhIG1lc3NhZ2UgdG8gYSBkaWZmZXJlbnQgYWN0aXZhdGFibGUgc2VydmljZS4gKi8KKyAgbSA9IGRidXNfbWVzc2FnZV9uZXdfc2lnbmFsICgiL2ZvbyIsICJjb20uZXhhbXBsZS5iYXIiLCAiVW5pY2FzdFNpZ25hbDIiKTsKKyAgaWYgKCFkYnVzX21lc3NhZ2Vfc2V0X2Rlc3RpbmF0aW9uIChtLCAiY29tLmV4YW1wbGUuU3lzdGVtZEFjdGl2YXRhYmxlMiIpKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKyAgZGJ1c19jb25uZWN0aW9uX3NlbmQgKGYtPmNhbGxlciwgbSwgTlVMTCk7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisKKyAgLyogVGhpcyB0aW1lIHN5c3RlbWQgaXMgYWxyZWFkeSByZWFkeSBmb3IgaXQuICovCisgIHdoaWxlIChmLT5zeXN0ZW1kX21lc3NhZ2UgPT0gTlVMTCkKKyAgICB0ZXN0X21haW5fY29udGV4dF9pdGVyYXRlIChmLT5jdHgsIFRSVUUpOworCisgIG0gPSBmLT5zeXN0ZW1kX21lc3NhZ2U7CisgIGYtPnN5c3RlbWRfbWVzc2FnZSA9IE5VTEw7CisgIGFzc2VydF9zaWduYWwgKG0sIERCVVNfU0VSVklDRV9EQlVTLCBEQlVTX1BBVEhfREJVUywKKyAgICAgICJvcmcuZnJlZWRlc2t0b3Auc3lzdGVtZDEuQWN0aXZhdG9yIiwgIkFjdGl2YXRpb25SZXF1ZXN0IiwgInMiLAorICAgICAgIm9yZy5mcmVlZGVza3RvcC5zeXN0ZW1kMSIpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworCisgIC8qIEEgbWFsaWNpb3VzIHByb2Nlc3MgdHJpZXMgdG8gZGlzcnVwdCB0aGUgYWN0aXZhdGlvbi4KKyAgICogSW4gYSBtb3JlIHJlYWxpc3RpYyBzY2VuYXJpbyB0aGlzIHdvdWxkIGJlIGFub3RoZXIgcGFyYWxsZWwKKyAgICogY29ubmVjdGlvbi4gKi8KKyAgbSA9IGRidXNfbWVzc2FnZV9uZXdfc2lnbmFsICgiL29yZy9mcmVlZGVza3RvcC9zeXN0ZW1kMSIsCisgICAgICAib3JnLmZyZWVkZXNrdG9wLnN5c3RlbWQxLkFjdGl2YXRvciIsICJBY3RpdmF0aW9uRmFpbHVyZSIpOworICBpZiAoIWRidXNfbWVzc2FnZV9zZXRfZGVzdGluYXRpb24gKG0sICJvcmcuZnJlZWRlc2t0b3AuREJ1cyIpKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKworICBkbworICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKnVuaXQgPSAiZGJ1cy1jb20uZXhhbXBsZS5TeXN0ZW1kQWN0aXZhdGFibGUyLnNlcnZpY2UiOworICAgICAgY29uc3QgY2hhciAqZXJyb3JfbmFtZSA9ICJjb20uZXhhbXBsZS5NYWxpY2UiOworICAgICAgY29uc3QgY2hhciAqZXJyb3JfbWVzc2FnZSA9ICJJJ20gb24geXIgYnVzLCBtYWtpbmcgeXIgYWN0aXZhdGlvbnMgZmFpbCI7CisKKyAgICAgIGlmICghZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChtLAorICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJnVuaXQsCisgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmZXJyb3JfbmFtZSwKKyAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZlcnJvcl9tZXNzYWdlLAorICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgICAgICBnX2Vycm9yICgiT09NIik7CisgICAgfQorICB3aGlsZSAoMCk7CisKKyAgZGJ1c19jb25uZWN0aW9uX3NlbmQgKGYtPmNhbGxlciwgbSwgTlVMTCk7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisKKyAgLyogVGhpcyBpcyBqdXN0IHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBtYWxpY2lvdXMgbWVzc2FnZSBoYXMgYXJyaXZlZCBhbmQKKyAgICogYmVlbiBwcm9jZXNzZWQgYnkgdGhlIGRidXMtZGFlbW9uLCBpLmUuIEBjYWxsZXIgd29uIHRoZSByYWNlCisgICAqIHdpdGggQGFjdGl2YXRlZC4gKi8KKyAgdGFrZV93ZWxsX2tub3duX25hbWUgKGYsIGYtPmNhbGxlciwgImNvbS5leGFtcGxlLlN5bmMiKTsKKworICAvKiBUaGUgYWN0aXZhdGFibGUgc2VydmljZSB0YWtlcyBpdHMgbmFtZS4gSGVyZSBJJ20gZmFraW5nIGl0IGJ5IHVzaW5nCisgICAqIGFuIGV4aXN0aW5nIGNvbm5lY3Rpb247IGluIHJlYWwgbGlmZSBpdCB3b3VsZCBiZSB5ZXQgYW5vdGhlcgorICAgKiBjb25uZWN0aW9uLiAqLworICB0YWtlX3dlbGxfa25vd25fbmFtZSAoZiwgZi0+YWN0aXZhdGVkLCAiY29tLmV4YW1wbGUuU3lzdGVtZEFjdGl2YXRhYmxlMiIpOworCisgIC8qIFRoZSBtZXNzYWdlIGlzIGRlbGl2ZXJlZCB0byB0aGUgYWN0aXZhdGFibGUgc2VydmljZS4gKi8KKyAgd2hpbGUgKGYtPmFjdGl2YXRlZF9tZXNzYWdlID09IE5VTEwpCisgICAgdGVzdF9tYWluX2NvbnRleHRfaXRlcmF0ZSAoZi0+Y3R4LCBUUlVFKTsKKworICBtID0gZi0+YWN0aXZhdGVkX21lc3NhZ2U7CisgIGYtPmFjdGl2YXRlZF9tZXNzYWdlID0gTlVMTDsKKyAgYXNzZXJ0X3NpZ25hbCAobSwgZi0+Y2FsbGVyX25hbWUsICIvZm9vIiwKKyAgICAgICJjb20uZXhhbXBsZS5iYXIiLCAiVW5pY2FzdFNpZ25hbDIiLCAiIiwKKyAgICAgICJjb20uZXhhbXBsZS5TeXN0ZW1kQWN0aXZhdGFibGUyIik7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisKKyAgLyogQSB0aGlyZCBhY3RpdmF0aW9uLiAqLworICBtID0gZGJ1c19tZXNzYWdlX25ld19zaWduYWwgKCIvZm9vIiwgImNvbS5leGFtcGxlLmJhciIsICJVbmljYXN0U2lnbmFsMyIpOworICBpZiAoIWRidXNfbWVzc2FnZV9zZXRfZGVzdGluYXRpb24gKG0sICJjb20uZXhhbXBsZS5TeXN0ZW1kQWN0aXZhdGFibGUzIikpCisgICAgZ19lcnJvciAoIk9PTSIpOworICBkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoZi0+Y2FsbGVyLCBtLCBOVUxMKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtKTsKKworICB3aGlsZSAoZi0+c3lzdGVtZF9tZXNzYWdlID09IE5VTEwpCisgICAgdGVzdF9tYWluX2NvbnRleHRfaXRlcmF0ZSAoZi0+Y3R4LCBUUlVFKTsKKworICBtID0gZi0+c3lzdGVtZF9tZXNzYWdlOworICBmLT5zeXN0ZW1kX21lc3NhZ2UgPSBOVUxMOworICBhc3NlcnRfc2lnbmFsIChtLCBEQlVTX1NFUlZJQ0VfREJVUywgREJVU19QQVRIX0RCVVMsCisgICAgICAib3JnLmZyZWVkZXNrdG9wLnN5c3RlbWQxLkFjdGl2YXRvciIsICJBY3RpdmF0aW9uUmVxdWVzdCIsICJzIiwKKyAgICAgICJvcmcuZnJlZWRlc2t0b3Auc3lzdGVtZDEiKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtKTsKKworICAvKiBUaGlzIHRpbWUgYWN0aXZhdGlvbiBmYWlscyAqLworICBtID0gZGJ1c19tZXNzYWdlX25ld19zaWduYWwgKCIvb3JnL2ZyZWVkZXNrdG9wL3N5c3RlbWQxIiwKKyAgICAgICJvcmcuZnJlZWRlc2t0b3Auc3lzdGVtZDEuQWN0aXZhdG9yIiwgIkFjdGl2YXRpb25GYWlsdXJlIik7CisKKyAgZG8KKyAgICB7CisgICAgICBjb25zdCBjaGFyICp1bml0ID0gImRidXMtY29tLmV4YW1wbGUuU3lzdGVtZEFjdGl2YXRhYmxlMy5zZXJ2aWNlIjsKKyAgICAgIGNvbnN0IGNoYXIgKmVycm9yX25hbWUgPSAiY29tLmV4YW1wbGUuTm9wZSI7CisgICAgICBjb25zdCBjaGFyICplcnJvcl9tZXNzYWdlID0gIkNvbXB1dGVyIHNheXMgbm8iOworCisgICAgICBpZiAoIWRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAobSwKKyAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZ1bml0LAorICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJmVycm9yX25hbWUsCisgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmZXJyb3JfbWVzc2FnZSwKKyAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICAgICAgZ19lcnJvciAoIk9PTSIpOworICAgIH0KKyAgd2hpbGUgKDApOworCisgIGlmICghZGJ1c19tZXNzYWdlX3NldF9kZXN0aW5hdGlvbiAobSwgIm9yZy5mcmVlZGVza3RvcC5EQnVzIikpCisgICAgZ19lcnJvciAoIk9PTSIpOworICBkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoZi0+c3lzdGVtZCwgbSwgTlVMTCk7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3VhZSAoRml4dHVyZSAqZiwKKyAgICBnY29uc3Rwb2ludGVyIGNvbnRleHQpCit7CisgIERCdXNNZXNzYWdlICptOworICBEQnVzUGVuZGluZ0NhbGwgKnBjOworICBEQnVzTWVzc2FnZUl0ZXIgYXJnc19pdGVyLCBhcnJfaXRlciwgZW50cnlfaXRlcjsKKyAgY29uc3QgY2hhciAqczsKKworICBpZiAoZi0+YWRkcmVzcyA9PSBOVUxMKQorICAgIHJldHVybjsKKworICBtID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoREJVU19TRVJWSUNFX0RCVVMsIERCVVNfUEFUSF9EQlVTLAorICAgICAgREJVU19JTlRFUkZBQ0VfREJVUywgIlVwZGF0ZUFjdGl2YXRpb25FbnZpcm9ubWVudCIpOworCisgIGlmIChtID09IE5VTEwpCisgICAgZ19lcnJvciAoIk9PTSIpOworCisgIGRidXNfbWVzc2FnZV9pdGVyX2luaXRfYXBwZW5kIChtLCAmYXJnc19pdGVyKTsKKworICAvKiBBcHBlbmQgYW4gZW1wdHkgYXtzc30gKHN0cmluZyA9PiBzdHJpbmcgZGljdGlvbmFyeSkuICovCisgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfb3Blbl9jb250YWluZXIgKCZhcmdzX2l0ZXIsIERCVVNfVFlQRV9BUlJBWSwKKyAgICAgICAgIntzc30iLCAmYXJyX2l0ZXIpIHx8CisgICAgICAhZGJ1c19tZXNzYWdlX2l0ZXJfY2xvc2VfY29udGFpbmVyICgmYXJnc19pdGVyLCAmYXJyX2l0ZXIpKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHkgKGYtPmNhbGxlciwgbSwgJnBjLAorICAgICAgICBEQlVTX1RJTUVPVVRfVVNFX0RFRkFVTFQpIHx8IHBjID09IE5VTEwpCisgICAgZ19lcnJvciAoIk9PTSIpOworCisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisgIG0gPSBOVUxMOworCisgIGlmIChkYnVzX3BlbmRpbmdfY2FsbF9nZXRfY29tcGxldGVkIChwYykpCisgICAgdGVzdF9wZW5kaW5nX2NhbGxfc3RvcmVfcmVwbHkgKHBjLCAmbSk7CisgIGVsc2UgaWYgKCFkYnVzX3BlbmRpbmdfY2FsbF9zZXRfbm90aWZ5IChwYywgdGVzdF9wZW5kaW5nX2NhbGxfc3RvcmVfcmVwbHksCisgICAgICAgICZtLCBOVUxMKSkKKyAgICBnX2Vycm9yICgiT09NIik7CisKKyAgd2hpbGUgKG0gPT0gTlVMTCkKKyAgICB0ZXN0X21haW5fY29udGV4dF9pdGVyYXRlIChmLT5jdHgsIFRSVUUpOworCisgIGFzc2VydF9tZXRob2RfcmVwbHkgKG0sIERCVVNfU0VSVklDRV9EQlVTLCBmLT5jYWxsZXJfbmFtZSwgIiIpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworCisgIC8qIFRoZSBmYWtlIHN5c3RlbWQgY29ubmVjdHMgdG8gdGhlIGJ1cy4gKi8KKyAgZi0+c3lzdGVtZCA9IHRlc3RfY29ubmVjdF90b19idXMgKGYtPmN0eCwgZi0+YWRkcmVzcyk7CisgIGlmICghZGJ1c19jb25uZWN0aW9uX2FkZF9maWx0ZXIgKGYtPnN5c3RlbWQsIHN5c3RlbWRfZmlsdGVyLCBmLCBOVUxMKSkKKyAgICBnX2Vycm9yICgiT09NIik7CisgIGYtPnN5c3RlbWRfbmFtZSA9IGRidXNfYnVzX2dldF91bmlxdWVfbmFtZSAoZi0+c3lzdGVtZCk7CisgIHRha2Vfd2VsbF9rbm93bl9uYW1lIChmLCBmLT5zeXN0ZW1kLCAib3JnLmZyZWVkZXNrdG9wLnN5c3RlbWQxIik7CisKKyAgLyogSXQgZ2V0cyB0aGUgU2V0RW52aXJvbm1lbnQgKi8KKyAgd2hpbGUgKGYtPnN5c3RlbWRfbWVzc2FnZSA9PSBOVUxMKQorICAgIHRlc3RfbWFpbl9jb250ZXh0X2l0ZXJhdGUgKGYtPmN0eCwgVFJVRSk7CisKKyAgbSA9IGYtPnN5c3RlbWRfbWVzc2FnZTsKKyAgZi0+c3lzdGVtZF9tZXNzYWdlID0gTlVMTDsKKworICAvKiBXaXRoIGFjdGl2YXRpb24sIHRoZSBkZXN0aW5hdGlvbiBpcyB0aGUgd2VsbC1rbm93biBuYW1lICovCisgIGFzc2VydF9tZXRob2RfY2FsbCAobSwgREJVU19TRVJWSUNFX0RCVVMsICJvcmcuZnJlZWRlc2t0b3Auc3lzdGVtZDEiLAorICAgICAgIi9vcmcvZnJlZWRlc2t0b3Avc3lzdGVtZDEiLCAib3JnLmZyZWVkZXNrdG9wLnN5c3RlbWQxLk1hbmFnZXIiLAorICAgICAgIlNldEVudmlyb25tZW50IiwgImFzIik7CisKKyAgZGJ1c19tZXNzYWdlX2l0ZXJfaW5pdCAobSwgJmFyZ3NfaXRlcik7CisgIGdfYXNzZXJ0X2NtcHVpbnQgKGRidXNfbWVzc2FnZV9pdGVyX2dldF9hcmdfdHlwZSAoJmFyZ3NfaXRlciksID09LAorICAgICAgREJVU19UWVBFX0FSUkFZKTsKKyAgZ19hc3NlcnRfY21wdWludCAoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2VsZW1lbnRfdHlwZSAoJmFyZ3NfaXRlciksID09LAorICAgICAgREJVU19UWVBFX1NUUklORyk7CisgIGRidXNfbWVzc2FnZV9pdGVyX3JlY3Vyc2UgKCZhcmdzX2l0ZXIsICZhcnJfaXRlcik7CisgIGdfYXNzZXJ0X2NtcHVpbnQgKGRidXNfbWVzc2FnZV9pdGVyX2dldF9hcmdfdHlwZSAoJmFycl9pdGVyKSwgPT0sCisgICAgICBEQlVTX1RZUEVfSU5WQUxJRCk7CisgIGRidXNfbWVzc2FnZV9pdGVyX25leHQgKCZhcmdzX2l0ZXIpOworICBnX2Fzc2VydF9jbXB1aW50IChkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJnX3R5cGUgKCZhcmdzX2l0ZXIpLCA9PSwKKyAgICAgIERCVVNfVFlQRV9JTlZBTElEKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtKTsKKworICBtID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoREJVU19TRVJWSUNFX0RCVVMsIERCVVNfUEFUSF9EQlVTLAorICAgICAgREJVU19JTlRFUkZBQ0VfREJVUywgIlVwZGF0ZUFjdGl2YXRpb25FbnZpcm9ubWVudCIpOworCisgIGlmIChtID09IE5VTEwpCisgICAgZ19lcnJvciAoIk9PTSIpOworCisgIGRidXNfbWVzc2FnZV9pdGVyX2luaXRfYXBwZW5kIChtLCAmYXJnc19pdGVyKTsKKworCisgIHsKKyAgICBjb25zdCBjaGFyICprMSA9ICJLZXkxIiwgKnYxID0gIlZhbHVlMSIsCisgICAgICAgICAgICAgICAqazIgPSAiS2V5MiIsICp2MiA9ICJWYWx1ZTIiOworCisgICAgLyogQXBwZW5kIGEgZmlsbGVkIGF7c3N9IChzdHJpbmcgPT4gc3RyaW5nIGRpY3Rpb25hcnkpLiAqLworICAgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfb3Blbl9jb250YWluZXIgKCZhcmdzX2l0ZXIsIERCVVNfVFlQRV9BUlJBWSwKKyAgICAgICAgICAie3NzfSIsICZhcnJfaXRlcikgfHwKKyAgICAgICAgIWRidXNfbWVzc2FnZV9pdGVyX29wZW5fY29udGFpbmVyICgmYXJyX2l0ZXIsIERCVVNfVFlQRV9ESUNUX0VOVFJZLAorICAgICAgICAgIE5VTEwsICZlbnRyeV9pdGVyKSB8fAorICAgICAgICAhZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljICgmZW50cnlfaXRlciwgREJVU19UWVBFX1NUUklORywKKyAgICAgICAgICAmazEpIHx8CisgICAgICAgICFkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfYmFzaWMgKCZlbnRyeV9pdGVyLCBEQlVTX1RZUEVfU1RSSU5HLAorICAgICAgICAgICZ2MSkgfHwKKyAgICAgICAgIWRidXNfbWVzc2FnZV9pdGVyX2Nsb3NlX2NvbnRhaW5lciAoJmFycl9pdGVyLCAmZW50cnlfaXRlcikgfHwKKyAgICAgICAgIWRidXNfbWVzc2FnZV9pdGVyX29wZW5fY29udGFpbmVyICgmYXJyX2l0ZXIsIERCVVNfVFlQRV9ESUNUX0VOVFJZLAorICAgICAgICAgIE5VTEwsICZlbnRyeV9pdGVyKSB8fAorICAgICAgICAhZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljICgmZW50cnlfaXRlciwgREJVU19UWVBFX1NUUklORywKKyAgICAgICAgICAmazIpIHx8CisgICAgICAgICFkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfYmFzaWMgKCZlbnRyeV9pdGVyLCBEQlVTX1RZUEVfU1RSSU5HLAorICAgICAgICAgICZ2MikgfHwKKyAgICAgICAgIWRidXNfbWVzc2FnZV9pdGVyX2Nsb3NlX2NvbnRhaW5lciAoJmFycl9pdGVyLCAmZW50cnlfaXRlcikgfHwKKyAgICAgICAgIWRidXNfbWVzc2FnZV9pdGVyX2Nsb3NlX2NvbnRhaW5lciAoJmFyZ3NfaXRlciwgJmFycl9pdGVyKSkKKyAgICAgIGdfZXJyb3IgKCJPT00iKTsKKyAgfQorCisgIGlmICghZGJ1c19jb25uZWN0aW9uX3NlbmRfd2l0aF9yZXBseSAoZi0+Y2FsbGVyLCBtLCAmcGMsCisgICAgICAgIERCVVNfVElNRU9VVF9VU0VfREVGQVVMVCkgfHwgcGMgPT0gTlVMTCkKKyAgICBnX2Vycm9yICgiT09NIik7CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtKTsKKyAgbSA9IE5VTEw7CisKKyAgaWYgKGRidXNfcGVuZGluZ19jYWxsX2dldF9jb21wbGV0ZWQgKHBjKSkKKyAgICB0ZXN0X3BlbmRpbmdfY2FsbF9zdG9yZV9yZXBseSAocGMsICZtKTsKKyAgZWxzZSBpZiAoIWRidXNfcGVuZGluZ19jYWxsX3NldF9ub3RpZnkgKHBjLCB0ZXN0X3BlbmRpbmdfY2FsbF9zdG9yZV9yZXBseSwKKyAgICAgICAgJm0sIE5VTEwpKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKworICB3aGlsZSAobSA9PSBOVUxMKQorICAgIHRlc3RfbWFpbl9jb250ZXh0X2l0ZXJhdGUgKGYtPmN0eCwgVFJVRSk7CisKKyAgYXNzZXJ0X21ldGhvZF9yZXBseSAobSwgREJVU19TRVJWSUNFX0RCVVMsIGYtPmNhbGxlcl9uYW1lLCAiIik7CisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisKKyAgd2hpbGUgKGYtPnN5c3RlbWRfbWVzc2FnZSA9PSBOVUxMKQorICAgIHRlc3RfbWFpbl9jb250ZXh0X2l0ZXJhdGUgKGYtPmN0eCwgVFJVRSk7CisKKyAgbSA9IGYtPnN5c3RlbWRfbWVzc2FnZTsKKyAgZi0+c3lzdGVtZF9tZXNzYWdlID0gTlVMTDsKKworICAvKiBXaXRob3V0IGFjdGl2YXRpb24sIHRoZSBkZXN0aW5hdGlvbiBpcyB0aGUgdW5pcXVlIG5hbWUgKi8KKyAgYXNzZXJ0X21ldGhvZF9jYWxsIChtLCBEQlVTX1NFUlZJQ0VfREJVUywgZi0+c3lzdGVtZF9uYW1lLAorICAgICAgIi9vcmcvZnJlZWRlc2t0b3Avc3lzdGVtZDEiLCAib3JnLmZyZWVkZXNrdG9wLnN5c3RlbWQxLk1hbmFnZXIiLAorICAgICAgIlNldEVudmlyb25tZW50IiwgImFzIik7CisKKyAgZGJ1c19tZXNzYWdlX2l0ZXJfaW5pdCAobSwgJmFyZ3NfaXRlcik7CisgIGdfYXNzZXJ0X2NtcHVpbnQgKGRidXNfbWVzc2FnZV9pdGVyX2dldF9hcmdfdHlwZSAoJmFyZ3NfaXRlciksID09LAorICAgICAgREJVU19UWVBFX0FSUkFZKTsKKyAgZ19hc3NlcnRfY21wdWludCAoZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2VsZW1lbnRfdHlwZSAoJmFyZ3NfaXRlciksID09LAorICAgICAgREJVU19UWVBFX1NUUklORyk7CisgIGRidXNfbWVzc2FnZV9pdGVyX3JlY3Vyc2UgKCZhcmdzX2l0ZXIsICZhcnJfaXRlcik7CisgIGdfYXNzZXJ0X2NtcHVpbnQgKGRidXNfbWVzc2FnZV9pdGVyX2dldF9hcmdfdHlwZSAoJmFycl9pdGVyKSwgPT0sCisgICAgICBEQlVTX1RZUEVfU1RSSU5HKTsKKyAgZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2Jhc2ljICgmYXJyX2l0ZXIsICZzKTsKKyAgZ19hc3NlcnRfY21wc3RyIChzLCA9PSwgIktleTE9VmFsdWUxIik7CisgIGRidXNfbWVzc2FnZV9pdGVyX25leHQgKCZhcnJfaXRlcik7CisgIGdfYXNzZXJ0X2NtcHVpbnQgKGRidXNfbWVzc2FnZV9pdGVyX2dldF9hcmdfdHlwZSAoJmFycl9pdGVyKSwgPT0sCisgICAgICBEQlVTX1RZUEVfU1RSSU5HKTsKKyAgZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2Jhc2ljICgmYXJyX2l0ZXIsICZzKTsKKyAgZ19hc3NlcnRfY21wc3RyIChzLCA9PSwgIktleTI9VmFsdWUyIik7CisgIGRidXNfbWVzc2FnZV9pdGVyX25leHQgKCZhcnJfaXRlcik7CisgIGdfYXNzZXJ0X2NtcHVpbnQgKGRidXNfbWVzc2FnZV9pdGVyX2dldF9hcmdfdHlwZSAoJmFycl9pdGVyKSwgPT0sCisgICAgICBEQlVTX1RZUEVfSU5WQUxJRCk7CisgIGRidXNfbWVzc2FnZV9pdGVyX25leHQgKCZhcmdzX2l0ZXIpOworICBnX2Fzc2VydF9jbXB1aW50IChkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYXJnX3R5cGUgKCZhcmdzX2l0ZXIpLCA9PSwKKyAgICAgIERCVVNfVFlQRV9JTlZBTElEKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtKTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfZGVueV9zZW5kIChGaXh0dXJlICpmLAorICAgIGdjb25zdHBvaW50ZXIgY29udGV4dCkKK3sKKyAgREJ1c01lc3NhZ2UgKm07CisgIGNvbnN0IENvbmZpZyAqY29uZmlnID0gY29udGV4dDsKKworICBnX2Fzc2VydCAoY29uZmlnICE9IE5VTEwpOworICBnX2Fzc2VydCAoY29uZmlnLT5idXNfbmFtZSAhPSBOVUxMKTsKKworICBpZiAoZi0+YWRkcmVzcyA9PSBOVUxMKQorICAgIHJldHVybjsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9hZGRfZmlsdGVyIChmLT5jYWxsZXIsIGNhbGxlcl9maWx0ZXIsIGYsIE5VTEwpKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKworICBmLT5jYWxsZXJfZmlsdGVyX2FkZGVkID0gVFJVRTsKKworICAvKiBUaGUgc2VuZGVyIHNlbmRzIGEgbWVzc2FnZSB0byBhbiBhY3RpdmF0YWJsZSBzZXJ2aWNlLiAqLworICBtID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoY29uZmlnLT5idXNfbmFtZSwgIi9mb28iLAorICAgICAgImNvbS5leGFtcGxlLmJhciIsICJDYWxsIik7CisgIGlmIChtID09IE5VTEwpCisgICAgZ19lcnJvciAoIk9PTSIpOworCisgIGRidXNfY29ubmVjdGlvbl9zZW5kIChmLT5jYWxsZXIsIG0sIE5VTEwpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworCisgIC8qCisgICAqIEV2ZW4gYmVmb3JlIHRoZSBmYWtlIHN5c3RlbWQgY29ubmVjdHMgdG8gdGhlIGJ1cywgd2UgZ2V0IGFuIGVycm9yCisgICAqIGJhY2s6IGFjdGl2YXRpb24gaXMgbm90IGFsbG93ZWQuCisgICAqCisgICAqIEluIHRoZSBub3JtYWwgY2FzZSwgdGhpcyBpcyBiZWNhdXNlIHRoZSBYTUwgcG9saWN5IGRvZXMgbm90IGFsbG93CisgICAqIGFueW9uZSB0byBzZW5kIG1lc3NhZ2VzIHRvIHRoZSBidXMgbmFtZSBjb20uZXhhbXBsZS5TZW5kRGVuaWVkLgorICAgKgorICAgKiBJbiB0aGUgQXBwQXJtb3IgY2FzZSwgdGhpcyBpcyBiZWNhdXNlIHRoZSBBcHBBcm1vciBwb2xpY3kgZG9lcyBub3QgYWxsb3cKKyAgICogdGhpcyBwcm9jZXNzIHRvIHNlbmQgbWVzc2FnZXMgdG8gdGhlIGJ1cyBuYW1lCisgICAqIGNvbS5leGFtcGxlLlNlbmREZW5pZWRCeUFwcEFybW9yTmFtZSwgb3IgdG8gdGhlIGxhYmVsCisgICAqIEBEQlVTX1RFU1RfRVhFQ0AvY29tLmV4YW1wbGUuU2VuZERlbmllZEJ5QXBwQXJtb3JMYWJlbCB0aGF0IHdlIGFzc3VtZSB0aGUKKyAgICogc2VydmljZSBjb20uZXhhbXBsZS5TZW5kRGVuaWVkQnlBcHBBcm1vckxhYmVsIHdpbGwgcmVjZWl2ZSBhZnRlciBzeXN0ZW1kCisgICAqIHJ1bnMgaXQuCisgICAqLworCisgIHdoaWxlIChmLT5jYWxsZXJfbWVzc2FnZSA9PSBOVUxMKQorICAgIHRlc3RfbWFpbl9jb250ZXh0X2l0ZXJhdGUgKGYtPmN0eCwgVFJVRSk7CisKKyAgbSA9IGYtPmNhbGxlcl9tZXNzYWdlOworICBmLT5jYWxsZXJfbWVzc2FnZSA9IE5VTEw7CisgIGFzc2VydF9lcnJvcl9yZXBseSAobSwgREJVU19TRVJWSUNFX0RCVVMsIGYtPmNhbGxlcl9uYW1lLAorICAgICAgREJVU19FUlJPUl9BQ0NFU1NfREVOSUVEKTsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtKTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfZGVueV9yZWNlaXZlIChGaXh0dXJlICpmLAorICAgIGdjb25zdHBvaW50ZXIgY29udGV4dCkKK3sKKyAgREJ1c01lc3NhZ2UgKm07CisgIGNvbnN0IENvbmZpZyAqY29uZmlnID0gY29udGV4dDsKKworICBnX2Fzc2VydCAoY29uZmlnICE9IE5VTEwpOworICBnX2Fzc2VydCAoY29uZmlnLT5idXNfbmFtZSAhPSBOVUxMKTsKKworICBpZiAoZi0+YWRkcmVzcyA9PSBOVUxMKQorICAgIHJldHVybjsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9hZGRfZmlsdGVyIChmLT5jYWxsZXIsIGNhbGxlcl9maWx0ZXIsIGYsIE5VTEwpKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKworICBmLT5jYWxsZXJfZmlsdGVyX2FkZGVkID0gVFJVRTsKKworICAvKiBUaGUgc2VuZGVyIHNlbmRzIGEgbWVzc2FnZSB0byBhbiBhY3RpdmF0YWJsZSBzZXJ2aWNlLgorICAgKiBXZSBzZXQgdGhlIGludGVyZmFjZSBuYW1lIGVxdWFsIHRvIHRoZSBidXMgbmFtZSB0byBtYWtlIGl0CisgICAqIGVhc2llciB0byB3cml0ZSB0aGUgbmVjZXNzYXJ5IHBvbGljeSBydWxlcy4gKi8KKyAgbSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKGNvbmZpZy0+YnVzX25hbWUsICIvZm9vIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+YnVzX25hbWUsICJDYWxsIik7CisgIGlmIChtID09IE5VTEwpCisgICAgZ19lcnJvciAoIk9PTSIpOworCisgIGRidXNfY29ubmVjdGlvbl9zZW5kIChmLT5jYWxsZXIsIG0sIE5VTEwpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworCisgIC8qIFRoZSBmYWtlIHN5c3RlbWQgY29ubmVjdHMgdG8gdGhlIGJ1cy4gKi8KKyAgZi0+c3lzdGVtZCA9IHRlc3RfY29ubmVjdF90b19idXMgKGYtPmN0eCwgZi0+YWRkcmVzcyk7CisgIGlmICghZGJ1c19jb25uZWN0aW9uX2FkZF9maWx0ZXIgKGYtPnN5c3RlbWQsIHN5c3RlbWRfZmlsdGVyLCBmLCBOVUxMKSkKKyAgICBnX2Vycm9yICgiT09NIik7CisgIGYtPnN5c3RlbWRfZmlsdGVyX2FkZGVkID0gVFJVRTsKKyAgZi0+c3lzdGVtZF9uYW1lID0gZGJ1c19idXNfZ2V0X3VuaXF1ZV9uYW1lIChmLT5zeXN0ZW1kKTsKKyAgdGFrZV93ZWxsX2tub3duX25hbWUgKGYsIGYtPnN5c3RlbWQsICJvcmcuZnJlZWRlc2t0b3Auc3lzdGVtZDEiKTsKKworICAvKiBJdCBnZXRzIGl0cyBhY3RpdmF0aW9uIHJlcXVlc3QuICovCisgIHdoaWxlIChmLT5zeXN0ZW1kX21lc3NhZ2UgPT0gTlVMTCkKKyAgICB0ZXN0X21haW5fY29udGV4dF9pdGVyYXRlIChmLT5jdHgsIFRSVUUpOworCisgIG0gPSBmLT5zeXN0ZW1kX21lc3NhZ2U7CisgIGYtPnN5c3RlbWRfbWVzc2FnZSA9IE5VTEw7CisgIGFzc2VydF9zaWduYWwgKG0sIERCVVNfU0VSVklDRV9EQlVTLCBEQlVTX1BBVEhfREJVUywKKyAgICAgICJvcmcuZnJlZWRlc2t0b3Auc3lzdGVtZDEuQWN0aXZhdG9yIiwgIkFjdGl2YXRpb25SZXF1ZXN0IiwgInMiLAorICAgICAgIm9yZy5mcmVlZGVza3RvcC5zeXN0ZW1kMSIpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworCisgIC8qIHN5c3RlbWQgc3RhcnRzIHRoZSBhY3RpdmF0YWJsZSBzZXJ2aWNlLiAqLworCisjaWYgZGVmaW5lZChEQlVTX1RFU1RfQVBQQVJNT1JfQUNUSVZBVElPTikgJiYgZGVmaW5lZChIQVZFX0FQUEFSTU9SXzJfMTApCisgIC8qIFRoZSB1c2Ugb2YgNDIgaGVyZSBpcyBhcmJpdHJhcnksIHNlZSBzZXR1cCgpLiAqLworICBpZiAoYWFfY2hhbmdlX2hhdCAoY29uZmlnLT5idXNfbmFtZSwgNDIpICE9IDApCisgICAgZ19lcnJvciAoIlVuYWJsZSB0byBjaGFuZ2UgcHJvZmlsZSB0byAuLi4vL14lczogJXMiLAorICAgICAgICAgICAgIGNvbmZpZy0+YnVzX25hbWUsIGdfc3RyZXJyb3IgKGVycm5vKSk7CisjZW5kaWYKKworICBmLT5hY3RpdmF0ZWQgPSB0ZXN0X2Nvbm5lY3RfdG9fYnVzIChmLT5jdHgsIGYtPmFkZHJlc3MpOworICBpZiAoIWRidXNfY29ubmVjdGlvbl9hZGRfZmlsdGVyIChmLT5hY3RpdmF0ZWQsIGFjdGl2YXRlZF9maWx0ZXIsCisgICAgICAgIGYsIE5VTEwpKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKyAgZi0+YWN0aXZhdGVkX2ZpbHRlcl9hZGRlZCA9IFRSVUU7CisgIGYtPmFjdGl2YXRlZF9uYW1lID0gZGJ1c19idXNfZ2V0X3VuaXF1ZV9uYW1lIChmLT5hY3RpdmF0ZWQpOworICB0YWtlX3dlbGxfa25vd25fbmFtZSAoZiwgZi0+YWN0aXZhdGVkLCBjb25maWctPmJ1c19uYW1lKTsKKworI2lmIGRlZmluZWQoREJVU19URVNUX0FQUEFSTU9SX0FDVElWQVRJT04pICYmIGRlZmluZWQoSEFWRV9BUFBBUk1PUl8yXzEwKQorICBpZiAoYWFfY2hhbmdlX2hhdCAoTlVMTCwgNDIpICE9IDApCisgICAgZ19lcnJvciAoIlVuYWJsZSB0byBjaGFuZ2UgYmFjayB0byBpbml0aWFsIHByb2ZpbGU6ICVzIiwKKyAgICAgICAgICAgICBnX3N0cmVycm9yIChlcnJubykpOworI2VuZGlmCisKKyAgLyoKKyAgICogV2UgcmUtZG8gdGhlIG1lc3NhZ2UgbWF0Y2hpbmcsIGFuZCBub3cgdGhlIG1lc3NhZ2UgaXMKKyAgICogZm9yYmlkZGVuIGJ5IHRoZSByZWNlaXZlIHBvbGljeS4KKyAgICoKKyAgICogSW4gdGhlIG5vcm1hbCBjYXNlLCB0aGlzIGlzIGJlY2F1c2UgdGhlIFhNTCBwb2xpY3kgZG9lcyBub3QgYWxsb3cKKyAgICogcmVjZWl2aW5nIGFueSBtZXNzYWdlIHdpdGggaW50ZXJmYWNlIGNvbS5leGFtcGxlLlJlY2VpdmVEZW5pZWQuCisgICAqIFdlIGNhbid0IHVzZSB0aGUgcmVjaXBpZW50J3MgYnVzIG5hbWUgaGVyZSBiZWNhdXNlIHRoZSBYTUwgcG9saWN5CisgICAqIGhhcyBubyBzeW50YXggZm9yIHByZXZlbnRpbmcgdGhlIG93bmVyIG9mIGEgbmFtZSBmcm9tIHJlY2VpdmluZworICAgKiBtZXNzYWdlcyAtIHRoYXQgd291bGQgYmUgcG9pbnRsZXNzLCBiZWNhdXNlIHRoZSBzZW5kZXIgY291bGQganVzdAorICAgKiBvcGVuIGFub3RoZXIgY29ubmVjdGlvbiBhbmQgbm90IG93biB0aGUgc2FtZSBuYW1lIG9uIHRoYXQgY29ubmVjdGlvbi4KKyAgICoKKyAgICogSW4gdGhlIEFwcEFybW9yIGNhc2UsIHRoaXMgaXMgYmVjYXVzZSB0aGUgQXBwQXJtb3IgcG9saWN5IGRvZXMgbm90IGFsbG93CisgICAqIHJlY2VpdmluZyBtZXNzYWdlcyB3aXRoIGludGVyZmFjZSBjb20uZXhhbXBsZS5SZWNlaXZlRGVuaWVkQnlBcHBBcm1vcgorICAgKiBmcm9tIGEgcGVlciB3aXRoIHRoZSBzYW1lIGxhYmVsIHdlIGhhdmUuIEFnYWluLCB3ZSBjYW4ndCB1c2UgdGhlCisgICAqIHJlY2lwaWVudCdzIGJ1cyBuYW1lIGJlY2F1c2UgdGhlcmUgaXMgbm8gc3ludGF4IGZvciB0aGlzLgorICAgKi8KKyAgd2hpbGUgKGYtPmNhbGxlcl9tZXNzYWdlID09IE5VTEwpCisgICAgdGVzdF9tYWluX2NvbnRleHRfaXRlcmF0ZSAoZi0+Y3R4LCBUUlVFKTsKKworICBtID0gZi0+Y2FsbGVyX21lc3NhZ2U7CisgIGYtPmNhbGxlcl9tZXNzYWdlID0gTlVMTDsKKyAgYXNzZXJ0X2Vycm9yX3JlcGx5IChtLCBEQlVTX1NFUlZJQ0VfREJVUywgZi0+Y2FsbGVyX25hbWUsCisgICAgICBEQlVTX0VSUk9SX0FDQ0VTU19ERU5JRUQpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworCisgIC8qIFRoZSBhY3RpdmF0ZWQgc2VydmljZSBuZXZlciBldmVuIHNhdyBpdC4gKi8KKyAgZ19hc3NlcnQgKGYtPmFjdGl2YXRlZF9tZXNzYWdlID09IE5VTEwpOworfQorCisvKgorICogVGVzdCB0aGF0IHdlIGNhbiBzZXQgdXAgdHJhbnNpZW50IHNlcnZpY2VzLgorICoKKyAqIElmIChmbGFncyAmIEZMQUdfRUFSTFlfVFJBTlNJRU5UX1NFUlZJQ0UpLCB3ZSBhc3NlcnQgdGhhdCBhIHNlcnZpY2UgdGhhdAorICogd2FzIGRlcGxveWVkIGJlZm9yZSBzdGFydGluZyBzeXN0ZW1kIChpbiBzZXR1cCgpKSBpcyBhdmFpbGFibGUuCisgKgorICogT3RoZXJ3aXNlLCB3ZSBhc3NlcnQgdGhhdCBhIHNlcnZpY2UgdGhhdCBpcyBkZXBsb3llZCB3aGlsZSBkYnVzLWRhZW1vbgorICogaXMgYWxyZWFkeSBydW5uaW5nIGJlY29tZXMgYXZhaWxhYmxlIGFmdGVyIHJlbG9hZGluZyB0aGUgZGJ1cy1kYWVtb24KKyAqIGNvbmZpZ3VyYXRpb24uCisgKi8KK3N0YXRpYyB2b2lkCit0ZXN0X3RyYW5zaWVudF9zZXJ2aWNlcyAoRml4dHVyZSAqZiwKKyAgICBnY29uc3Rwb2ludGVyIGNvbnRleHQpCit7CisgIGNvbnN0IENvbmZpZyAqY29uZmlnID0gY29udGV4dDsKKyAgREJ1c01lc3NhZ2UgKm0gPSBOVUxMOworICBEQnVzTWVzc2FnZSAqc2VuZF9yZXBseSA9IE5VTEw7CisgIERCdXNNZXNzYWdlICpyZXBseSA9IE5VTEw7CisgIERCdXNQZW5kaW5nQ2FsbCAqcGM7CisKKyAgZ19hc3NlcnQgKGNvbmZpZyAhPSBOVUxMKTsKKyAgZ19hc3NlcnQgKGNvbmZpZy0+YnVzX25hbWUgIT0gTlVMTCk7CisKKyAgaWYgKGYtPmFkZHJlc3MgPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAgLyogQ29ubmVjdCB0aGUgZmFrZSBzeXN0ZW1kIHRvIHRoZSBidXMuICovCisgIGYtPnN5c3RlbWQgPSB0ZXN0X2Nvbm5lY3RfdG9fYnVzIChmLT5jdHgsIGYtPmFkZHJlc3MpOworICBpZiAoIWRidXNfY29ubmVjdGlvbl9hZGRfZmlsdGVyIChmLT5zeXN0ZW1kLCBzeXN0ZW1kX2ZpbHRlciwgZiwgTlVMTCkpCisgICAgZ19lcnJvciAoIk9PTSIpOworICBmLT5zeXN0ZW1kX2ZpbHRlcl9hZGRlZCA9IFRSVUU7CisgIGYtPnN5c3RlbWRfbmFtZSA9IGRidXNfYnVzX2dldF91bmlxdWVfbmFtZSAoZi0+c3lzdGVtZCk7CisgIHRha2Vfd2VsbF9rbm93bl9uYW1lIChmLCBmLT5zeXN0ZW1kLCAib3JnLmZyZWVkZXNrdG9wLnN5c3RlbWQxIik7CisKKyAgaWYgKChjb25maWctPmZsYWdzICYgRkxBR19FQVJMWV9UUkFOU0lFTlRfU0VSVklDRSkgPT0gMCkKKyAgICB7CisgICAgICAvKiBUcnkgdG8gYWN0aXZhdGUgYSBzZXJ2aWNlIHRoYXQgaXNuJ3QgdGhlcmUuICovCisgICAgICBtID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoY29uZmlnLT5idXNfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiL2ZvbyIsICJjb20uZXhhbXBsZS5iYXIiLCAiQWN0aXZhdGUiKTsKKworICAgICAgaWYgKG0gPT0gTlVMTCB8fAorICAgICAgICAgICFkYnVzX2Nvbm5lY3Rpb25fc2VuZF93aXRoX3JlcGx5IChmLT5jYWxsZXIsIG0sICZwYywKKyAgICAgICAgICAgIERCVVNfVElNRU9VVF9VU0VfREVGQVVMVCkgfHwgcGMgPT0gTlVMTCkKKyAgICAgICAgZ19lcnJvciAoIk9PTSIpOworCisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworICAgICAgbSA9IE5VTEw7CisKKyAgICAgIC8qIEl0IGZhaWxzLiAqLworCisgICAgICBpZiAoZGJ1c19wZW5kaW5nX2NhbGxfZ2V0X2NvbXBsZXRlZCAocGMpKQorICAgICAgICB0ZXN0X3BlbmRpbmdfY2FsbF9zdG9yZV9yZXBseSAocGMsICZtKTsKKyAgICAgIGVsc2UgaWYgKCFkYnVzX3BlbmRpbmdfY2FsbF9zZXRfbm90aWZ5IChwYywgdGVzdF9wZW5kaW5nX2NhbGxfc3RvcmVfcmVwbHksCisgICAgICAgICAgICAmbSwgTlVMTCkpCisgICAgICAgIGdfZXJyb3IgKCJPT00iKTsKKworICAgICAgd2hpbGUgKG0gPT0gTlVMTCkKKyAgICAgICAgdGVzdF9tYWluX2NvbnRleHRfaXRlcmF0ZSAoZi0+Y3R4LCBUUlVFKTsKKworICAgICAgYXNzZXJ0X2Vycm9yX3JlcGx5IChtLCBEQlVTX1NFUlZJQ0VfREJVUywgZi0+Y2FsbGVyX25hbWUsCisgICAgICAgICAgREJVU19FUlJPUl9TRVJWSUNFX1VOS05PV04pOworCisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworICAgICAgbSA9IE5VTEw7CisKKyAgICAgIC8qIE5vdyBnZW5lcmF0ZSBhIHRyYW5zaWVudCBELUJ1cyBzZXJ2aWNlIGZpbGUgZm9yIGl0LiBUaGUgZGlyZWN0b3J5CisgICAgICAgKiBzaG91bGQgaGF2ZSBiZWVuIGNyZWF0ZWQgZHVyaW5nIGRidXMtZGFlbW9uIHN0YXJ0dXAsIHNvIHdlIGRvbid0IGhhdmUgdG8KKyAgICAgICAqIHJlY3JlYXRlIGl0LiAqLworICAgICAgZml4dHVyZV9jcmVhdGVfdHJhbnNpZW50X3NlcnZpY2UgKGYsIGNvbmZpZy0+YnVzX25hbWUpOworCisgICAgICAvKiBUbyBndWFyYW50ZWUgdGhhdCB0aGUgdHJhbnNpZW50IHNlcnZpY2UgaGFzIGJlZW4gcGlja2VkIHVwLCB3ZSBoYXZlCisgICAgICAgKiB0byByZWxvYWQuICovCisgICAgICBtID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfY2FsbCAoREJVU19TRVJWSUNFX0RCVVMsIERCVVNfUEFUSF9EQlVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSU5URVJGQUNFX0RCVVMsICJSZWxvYWRDb25maWciKTsKKworICAgICAgaWYgKG0gPT0gTlVMTCB8fAorICAgICAgICAgICFkYnVzX2Nvbm5lY3Rpb25fc2VuZF93aXRoX3JlcGx5IChmLT5jYWxsZXIsIG0sICZwYywKKyAgICAgICAgICAgIERCVVNfVElNRU9VVF9VU0VfREVGQVVMVCkgfHwgcGMgPT0gTlVMTCkKKyAgICAgICAgZ19lcnJvciAoIk9PTSIpOworCisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworICAgICAgbSA9IE5VTEw7CisKKyAgICAgIGlmIChkYnVzX3BlbmRpbmdfY2FsbF9nZXRfY29tcGxldGVkIChwYykpCisgICAgICAgIHRlc3RfcGVuZGluZ19jYWxsX3N0b3JlX3JlcGx5IChwYywgJm0pOworICAgICAgZWxzZSBpZiAoIWRidXNfcGVuZGluZ19jYWxsX3NldF9ub3RpZnkgKHBjLCB0ZXN0X3BlbmRpbmdfY2FsbF9zdG9yZV9yZXBseSwKKyAgICAgICAgICAgICZtLCBOVUxMKSkKKyAgICAgICAgZ19lcnJvciAoIk9PTSIpOworCisgICAgICB3aGlsZSAobSA9PSBOVUxMKQorICAgICAgICB0ZXN0X21haW5fY29udGV4dF9pdGVyYXRlIChmLT5jdHgsIFRSVUUpOworCisgICAgICBhc3NlcnRfbWV0aG9kX3JlcGx5IChtLCBEQlVTX1NFUlZJQ0VfREJVUywgZi0+Y2FsbGVyX25hbWUsICIiKTsKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisgICAgICBtID0gTlVMTDsKKyAgICB9CisKKyAgLyogVGhlIHNlcnZpY2UgaXMgcHJlc2VudCBub3cuICovCisgIG0gPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsIChjb25maWctPmJ1c19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9mb28iLCAiY29tLmV4YW1wbGUuYmFyIiwgIkFjdGl2YXRlIik7CisKKyAgaWYgKG0gPT0gTlVMTCB8fAorICAgICAgIWRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHkgKGYtPmNhbGxlciwgbSwgJnBjLAorICAgICAgICBEQlVTX1RJTUVPVVRfVVNFX0RFRkFVTFQpIHx8IHBjID09IE5VTEwpCisgICAgZ19lcnJvciAoIk9PTSIpOworCisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisgIG0gPSBOVUxMOworCisgIGlmIChkYnVzX3BlbmRpbmdfY2FsbF9nZXRfY29tcGxldGVkIChwYykpCisgICAgdGVzdF9wZW5kaW5nX2NhbGxfc3RvcmVfcmVwbHkgKHBjLCAmcmVwbHkpOworICBlbHNlIGlmICghZGJ1c19wZW5kaW5nX2NhbGxfc2V0X25vdGlmeSAocGMsIHRlc3RfcGVuZGluZ19jYWxsX3N0b3JlX3JlcGx5LAorICAgICAgICAmcmVwbHksIE5VTEwpKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKworICAvKiBUaGUgbW9jayBzeXN0ZW1kIGlzIHRvbGQgdG8gc3RhcnQgdGhlIHNlcnZpY2UuICovCisgIHdoaWxlIChmLT5zeXN0ZW1kX21lc3NhZ2UgPT0gTlVMTCkKKyAgICB0ZXN0X21haW5fY29udGV4dF9pdGVyYXRlIChmLT5jdHgsIFRSVUUpOworCisgIG0gPSBmLT5zeXN0ZW1kX21lc3NhZ2U7CisgIGYtPnN5c3RlbWRfbWVzc2FnZSA9IE5VTEw7CisgIGFzc2VydF9zaWduYWwgKG0sIERCVVNfU0VSVklDRV9EQlVTLCBEQlVTX1BBVEhfREJVUywKKyAgICAgICJvcmcuZnJlZWRlc2t0b3Auc3lzdGVtZDEuQWN0aXZhdG9yIiwgIkFjdGl2YXRpb25SZXF1ZXN0IiwgInMiLAorICAgICAgIm9yZy5mcmVlZGVza3RvcC5zeXN0ZW1kMSIpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworICBtID0gTlVMTDsKKworICAvKiBUaGUgYWN0aXZhdGFibGUgc2VydmljZSBjb25uZWN0cyBhbmQgZ2V0cyBpdHMgbmFtZS4gKi8KKyAgZi0+YWN0aXZhdGVkID0gdGVzdF9jb25uZWN0X3RvX2J1cyAoZi0+Y3R4LCBmLT5hZGRyZXNzKTsKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fYWRkX2ZpbHRlciAoZi0+YWN0aXZhdGVkLCBhY3RpdmF0ZWRfZmlsdGVyLAorICAgICAgICBmLCBOVUxMKSkKKyAgICBnX2Vycm9yICgiT09NIik7CisgIGYtPmFjdGl2YXRlZF9maWx0ZXJfYWRkZWQgPSBUUlVFOworICBmLT5hY3RpdmF0ZWRfbmFtZSA9IGRidXNfYnVzX2dldF91bmlxdWVfbmFtZSAoZi0+YWN0aXZhdGVkKTsKKyAgdGFrZV93ZWxsX2tub3duX25hbWUgKGYsIGYtPmFjdGl2YXRlZCwgY29uZmlnLT5idXNfbmFtZSk7CisKKyAgLyogVGhlIG1lc3NhZ2UgaXMgZGVsaXZlcmVkIHRvIHRoZSBhY3RpdmF0YWJsZSBzZXJ2aWNlLiAqLworICB3aGlsZSAoZi0+YWN0aXZhdGVkX21lc3NhZ2UgPT0gTlVMTCkKKyAgICB0ZXN0X21haW5fY29udGV4dF9pdGVyYXRlIChmLT5jdHgsIFRSVUUpOworCisgIG0gPSBmLT5hY3RpdmF0ZWRfbWVzc2FnZTsKKyAgZi0+YWN0aXZhdGVkX21lc3NhZ2UgPSBOVUxMOworICBhc3NlcnRfbWV0aG9kX2NhbGwgKG0sIGYtPmNhbGxlcl9uYW1lLCBjb25maWctPmJ1c19uYW1lLCAiL2ZvbyIsCisgICAgICAiY29tLmV4YW1wbGUuYmFyIiwgIkFjdGl2YXRlIiwgIiIpOworCisgIC8qIFRoZSBhY3RpdmF0YWJsZSBzZXJ2aWNlIHNlbmRzIGJhY2sgYSByZXBseS4gKi8KKyAgc2VuZF9yZXBseSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX3JldHVybiAobSk7CisKKyAgaWYgKHNlbmRfcmVwbHkgPT0gTlVMTCB8fAorICAgICAgIWRidXNfY29ubmVjdGlvbl9zZW5kIChmLT5hY3RpdmF0ZWQsIHNlbmRfcmVwbHksIE5VTEwpKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKHNlbmRfcmVwbHkpOworICBzZW5kX3JlcGx5ID0gTlVMTDsKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtKTsKKyAgbSA9IE5VTEw7CisKKyAgLyogVGhlIGNhbGxlciByZWNlaXZlcyB0aGUgcmVwbHkuICovCisgIHdoaWxlIChyZXBseSA9PSBOVUxMKQorICAgIHRlc3RfbWFpbl9jb250ZXh0X2l0ZXJhdGUgKGYtPmN0eCwgVFJVRSk7CisKKyAgYXNzZXJ0X21ldGhvZF9yZXBseSAocmVwbHksIGYtPmFjdGl2YXRlZF9uYW1lLCBmLT5jYWxsZXJfbmFtZSwgIiIpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKyAgcmVwbHkgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZAordGVhcmRvd24gKEZpeHR1cmUgKmYsCisgICAgZ2NvbnN0cG9pbnRlciBjb250ZXh0IEdfR05VQ19VTlVTRUQpCit7CisgIGRidXNfZXJyb3JfZnJlZSAoJmYtPmUpOworICBnX2NsZWFyX2Vycm9yICgmZi0+Z2UpOworCisgIGlmIChmLT5jYWxsZXIgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoZi0+Y2FsbGVyX2ZpbHRlcl9hZGRlZCkKKyAgICAgICAgZGJ1c19jb25uZWN0aW9uX3JlbW92ZV9maWx0ZXIgKGYtPmNhbGxlciwgY2FsbGVyX2ZpbHRlciwgZik7CisKKyAgICAgIGRidXNfY29ubmVjdGlvbl9jbG9zZSAoZi0+Y2FsbGVyKTsKKyAgICAgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoZi0+Y2FsbGVyKTsKKyAgICAgIGYtPmNhbGxlciA9IE5VTEw7CisgICAgfQorCisgIGlmIChmLT5zeXN0ZW1kICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKGYtPnN5c3RlbWRfZmlsdGVyX2FkZGVkKQorICAgICAgICBkYnVzX2Nvbm5lY3Rpb25fcmVtb3ZlX2ZpbHRlciAoZi0+c3lzdGVtZCwgc3lzdGVtZF9maWx0ZXIsIGYpOworCisgICAgICBkYnVzX2Nvbm5lY3Rpb25fY2xvc2UgKGYtPnN5c3RlbWQpOworICAgICAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChmLT5zeXN0ZW1kKTsKKyAgICAgIGYtPnN5c3RlbWQgPSBOVUxMOworICAgIH0KKworICBpZiAoZi0+YWN0aXZhdGVkICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKGYtPmFjdGl2YXRlZF9maWx0ZXJfYWRkZWQpCisgICAgICAgIGRidXNfY29ubmVjdGlvbl9yZW1vdmVfZmlsdGVyIChmLT5hY3RpdmF0ZWQsIGFjdGl2YXRlZF9maWx0ZXIsIGYpOworCisgICAgICBkYnVzX2Nvbm5lY3Rpb25fY2xvc2UgKGYtPmFjdGl2YXRlZCk7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGYtPmFjdGl2YXRlZCk7CisgICAgICBmLT5hY3RpdmF0ZWQgPSBOVUxMOworICAgIH0KKworICBpZiAoZi0+ZGFlbW9uX3BpZCAhPSAwKQorICAgIHsKKyAgICAgIHRlc3Rfa2lsbF9waWQgKGYtPmRhZW1vbl9waWQpOworICAgICAgZ19zcGF3bl9jbG9zZV9waWQgKGYtPmRhZW1vbl9waWQpOworICAgIH0KKworICBpZiAoZi0+Y3R4ICE9IE5VTEwpCisgICAgdGVzdF9tYWluX2NvbnRleHRfdW5yZWYgKGYtPmN0eCk7CisKKyAgZ19mcmVlIChmLT5hZGRyZXNzKTsKKworICBpZiAoZi0+dHJhbnNpZW50X3NlcnZpY2VfZmlsZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIHRlc3RfcmVtb3ZlX2lmX2V4aXN0cyAoZi0+dHJhbnNpZW50X3NlcnZpY2VfZmlsZSk7CisgICAgICBnX2ZyZWUgKGYtPnRyYW5zaWVudF9zZXJ2aWNlX2ZpbGUpOworICAgIH0KKworICBpZiAoZi0+dG1wX3J1bnRpbWVfZGlyICE9IE5VTEwpCisgICAgeworICAgICAgZ2NoYXIgKmRidXMxID0gZ19idWlsZF9maWxlbmFtZSAoZi0+dG1wX3J1bnRpbWVfZGlyLCAiZGJ1cy0xIiwgTlVMTCk7CisgICAgICBnY2hhciAqc2VydmljZXMgPSBnX2J1aWxkX2ZpbGVuYW1lIChkYnVzMSwgInNlcnZpY2VzIiwgTlVMTCk7CisKKyAgICAgIHRlc3Rfcm1kaXJfaWZfZXhpc3RzIChzZXJ2aWNlcyk7CisgICAgICB0ZXN0X3JtZGlyX2lmX2V4aXN0cyAoZGJ1czEpOworICAgICAgdGVzdF9ybWRpcl9pZl9leGlzdHMgKGYtPnRtcF9ydW50aW1lX2Rpcik7CisKKyAgICAgIGdfZnJlZSAoZi0+dG1wX3J1bnRpbWVfZGlyKTsKKyAgICAgIGdfZnJlZSAoZGJ1czEpOworICAgICAgZ19mcmVlIChzZXJ2aWNlcyk7CisgICAgfQorfQorCitzdGF0aWMgY29uc3QgQ29uZmlnIGRlbnlfc2VuZF90ZXN0c1tdID0KK3sKKyNpZiBkZWZpbmVkKERCVVNfVEVTVF9BUFBBUk1PUl9BQ1RJVkFUSU9OKQorICAgIHsgImNvbS5leGFtcGxlLlNlbmREZW5pZWRCeUFwcEFybW9yTGFiZWwiIH0sCisgICAgeyAiY29tLmV4YW1wbGUuU2VuZERlbmllZEJ5Tm9uZXhpc3RlbnRBcHBBcm1vckxhYmVsIiB9LAorICAgIHsgImNvbS5leGFtcGxlLlNlbmREZW5pZWRCeUFwcEFybW9yTmFtZSIgfSwKKyNlbmRpZgorICAgIHsgImNvbS5leGFtcGxlLlNlbmREZW5pZWQiIH0KK307CisKK3N0YXRpYyBjb25zdCBDb25maWcgZGVueV9yZWNlaXZlX3Rlc3RzW10gPQoreworI2lmIGRlZmluZWQoREJVU19URVNUX0FQUEFSTU9SX0FDVElWQVRJT04pCisgICAgeyAiY29tLmV4YW1wbGUuUmVjZWl2ZURlbmllZEJ5QXBwQXJtb3JMYWJlbCIgfSwKKyNlbmRpZgorICAgIHsgImNvbS5leGFtcGxlLlJlY2VpdmVEZW5pZWQiIH0KK307CisKK3N0YXRpYyBjb25zdCBDb25maWcgdHJhbnNpZW50X3NlcnZpY2VfbGF0ZXIgPQoreworICAiY29tLmV4YW1wbGUuVHJhbnNpZW50QWN0aXZhdGFibGUxIiwKKyAgRkxBR19OT05FCit9OworCitzdGF0aWMgY29uc3QgQ29uZmlnIHRyYW5zaWVudF9zZXJ2aWNlX2luX2FkdmFuY2UgPQoreworICAiY29tLmV4YW1wbGUuVHJhbnNpZW50QWN0aXZhdGFibGUxIiwKKyAgRkxBR19FQVJMWV9UUkFOU0lFTlRfU0VSVklDRQorfTsKKworaW50CittYWluIChpbnQgYXJnYywKKyAgICBjaGFyICoqYXJndikKK3sKKyAgZ3NpemUgaTsKKworICB0ZXN0X2luaXQgKCZhcmdjLCAmYXJndik7CisKKyAgZ190ZXN0X2FkZCAoIi9zZC1hY3RpdmF0aW9uL2FjdGl2YXRpb24iLCBGaXh0dXJlLCBOVUxMLAorICAgICAgc2V0dXAsIHRlc3RfYWN0aXZhdGlvbiwgdGVhcmRvd24pOworICBnX3Rlc3RfYWRkICgiL3NkLWFjdGl2YXRpb24vdWFlIiwgRml4dHVyZSwgTlVMTCwKKyAgICAgIHNldHVwLCB0ZXN0X3VhZSwgdGVhcmRvd24pOworCisgIGZvciAoaSA9IDA7IGkgPCBHX05fRUxFTUVOVFMgKGRlbnlfc2VuZF90ZXN0cyk7IGkrKykKKyAgICB7CisgICAgICBnY2hhciAqbmFtZSA9IGdfc3RyZHVwX3ByaW50ZiAoIi9zZC1hY3RpdmF0aW9uL2Rlbnktc2VuZC8lcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVueV9zZW5kX3Rlc3RzW2ldLmJ1c19uYW1lKTsKKworICAgICAgZ190ZXN0X2FkZCAobmFtZSwgRml4dHVyZSwgJmRlbnlfc2VuZF90ZXN0c1tpXSwKKyAgICAgICAgICAgICAgICAgIHNldHVwLCB0ZXN0X2Rlbnlfc2VuZCwgdGVhcmRvd24pOworICAgICAgZ19mcmVlIChuYW1lKTsKKyAgICB9CisKKyAgZm9yIChpID0gMDsgaSA8IEdfTl9FTEVNRU5UUyAoZGVueV9yZWNlaXZlX3Rlc3RzKTsgaSsrKQorICAgIHsKKyAgICAgIGdjaGFyICpuYW1lID0gZ19zdHJkdXBfcHJpbnRmICgiL3NkLWFjdGl2YXRpb24vZGVueS1yZWNlaXZlLyVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZW55X3JlY2VpdmVfdGVzdHNbaV0uYnVzX25hbWUpOworCisgICAgICBnX3Rlc3RfYWRkIChuYW1lLCBGaXh0dXJlLCAmZGVueV9yZWNlaXZlX3Rlc3RzW2ldLAorICAgICAgICAgICAgICAgICAgc2V0dXAsIHRlc3RfZGVueV9yZWNlaXZlLCB0ZWFyZG93bik7CisgICAgICBnX2ZyZWUgKG5hbWUpOworICAgIH0KKworICBnX3Rlc3RfYWRkICgiL3NkLWFjdGl2YXRpb24vdHJhbnNpZW50LXNlcnZpY2VzL2xhdGVyIiwgRml4dHVyZSwKKyAgICAgICZ0cmFuc2llbnRfc2VydmljZV9sYXRlciwgc2V0dXAsIHRlc3RfdHJhbnNpZW50X3NlcnZpY2VzLCB0ZWFyZG93bik7CisgIGdfdGVzdF9hZGQgKCIvc2QtYWN0aXZhdGlvbi90cmFuc2llbnQtc2VydmljZXMvaW4tYWR2YW5jZSIsIEZpeHR1cmUsCisgICAgICAmdHJhbnNpZW50X3NlcnZpY2VfaW5fYWR2YW5jZSwgc2V0dXAsIHRlc3RfdHJhbnNpZW50X3NlcnZpY2VzLCB0ZWFyZG93bik7CisKKyAgcmV0dXJuIGdfdGVzdF9ydW4gKCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L3NoZWxsLXRlc3QuYyBiL3Rlc3Qvc2hlbGwtdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5NDc1N2YKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NoZWxsLXRlc3QuYwpAQCAtMCwwICsxLDE4OCBAQAorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlIDxkYnVzL2RidXMtaW50ZXJuYWxzLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLWxpc3QuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMtbWVtb3J5Lmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXNoZWxsLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXN0cmluZy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zeXNkZXBzLmg+CisKK3N0YXRpYyBpbnQgdGVzdF9udW0gPSAwOworc3RhdGljIGludCBudW1fZmFpbGVkID0gMDsKKworc3RhdGljIGRidXNfYm9vbF90Cit0ZXN0X2NvbW1hbmRfbGluZV9pbnRlcm5hbCAoZGJ1c19ib29sX3Qgc2hvdWxkX3dvcmssCisgICAgY29uc3QgY2hhciAqYXJnMSwKKyAgICB2YV9saXN0IHZhcl9hcmdzKQoreworICBpbnQgaSwgb3JpZ2luYWxfYXJnYywgc2hlbGxfYXJnYzsKKyAgY2hhciAqKnNoZWxsX2FyZ3Y7CisgIGNoYXIgKipvcmlnaW5hbF9hcmd2OworICBjaGFyICpjb21tYW5kX2xpbmUsICp0bXA7CisgIERCdXNTdHJpbmcgc3RyOworICBEQnVzTGlzdCAqbGlzdCA9IE5VTEwsICpub2RlOworICBEQnVzRXJyb3IgZXJyb3I7CisKKyAgaWYgKCFfZGJ1c19saXN0X2FwcGVuZCAoJmxpc3QsIChjaGFyICopYXJnMSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGRvCisgICAgeworICAgICAgdG1wID0gdmFfYXJnICh2YXJfYXJncywgY2hhciAqKTsKKyAgICAgIGlmICghdG1wKQorICAgICAgICBicmVhazsKKyAgICAgIGlmICghX2RidXNfbGlzdF9hcHBlbmQgKCZsaXN0LCB0bXApKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfbGlzdF9jbGVhciAoJmxpc3QpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0gd2hpbGUgKHRtcCk7CisKKyAgb3JpZ2luYWxfYXJnYyA9IF9kYnVzX2xpc3RfZ2V0X2xlbmd0aCAoJmxpc3QpOworICBvcmlnaW5hbF9hcmd2ID0gZGJ1c19uZXcgKGNoYXIgKiwgb3JpZ2luYWxfYXJnYyk7CisgIGlmICghX2RidXNfc3RyaW5nX2luaXQgKCZzdHIpKQorICAgIHsKKyAgICAgIF9kYnVzX2xpc3RfY2xlYXIgKCZsaXN0KTsKKyAgICAgIGRidXNfZnJlZSAob3JpZ2luYWxfYXJndik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGZvciAoaSA9IDAsIG5vZGUgPSBfZGJ1c19saXN0X2dldF9maXJzdF9saW5rICgmbGlzdCk7IGkgPCBvcmlnaW5hbF9hcmdjICYmIG5vZGU7CisgICAgICAgaSsrLCBub2RlID0gX2RidXNfbGlzdF9nZXRfbmV4dF9saW5rICgmbGlzdCwgbm9kZSkpCisgICAgeworICAgICAgb3JpZ2luYWxfYXJndltpXSA9IG5vZGUtPmRhdGE7CisgICAgICBpZiAoKGkgPiAwICYmICFfZGJ1c19zdHJpbmdfYXBwZW5kX2J5dGUgKCZzdHIsICcgJykpIHx8CisgICAgICAgICAgIV9kYnVzX3N0cmluZ19hcHBlbmQgKCZzdHIsIG9yaWdpbmFsX2FyZ3ZbaV0pKQorICAgICAgICB7CisgICAgICAgICAgX2RidXNfbGlzdF9jbGVhciAoJmxpc3QpOworICAgICAgICAgIGRidXNfZnJlZSAob3JpZ2luYWxfYXJndik7CisgICAgICAgICAgX2RidXNfc3RyaW5nX2ZyZWUgKCZzdHIpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKyAgCisgIF9kYnVzX2xpc3RfY2xlYXIgKCZsaXN0KTsKKyAgY29tbWFuZF9saW5lID0gX2RidXNfc3RyaW5nX2dldF9kYXRhICgmc3RyKTsKKyAgcHJpbnRmICgiIyBUZXN0aW5nIGNvbW1hbmQgbGluZSAnJXMnXG4iLCBjb21tYW5kX2xpbmUpOworCisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKyAgaWYgKCFfZGJ1c19zaGVsbF9wYXJzZV9hcmd2IChjb21tYW5kX2xpbmUsICZzaGVsbF9hcmdjLCAmc2hlbGxfYXJndiwgJmVycm9yKSkKKyAgICB7CisgICAgICBwcmludGYgKCIjIEVycm9yJXMgcGFyc2luZyBjb21tYW5kIGxpbmU6ICVzXG4iLAorICAgICAgICAgIHNob3VsZF93b3JrID8gIiIgOiAiIChhcyBleHBlY3RlZCkiLAorICAgICAgICAgIGVycm9yLm1lc3NhZ2UgPyBlcnJvci5tZXNzYWdlIDogIiIpOworICAgICAgZGJ1c19mcmVlIChvcmlnaW5hbF9hcmd2KTsKKyAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmc3RyKTsKKyAgICAgIHJldHVybiAhc2hvdWxkX3dvcms7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKHNoZWxsX2FyZ2MgIT0gb3JpZ2luYWxfYXJnYykKKyAgICAgICAgeworICAgICAgICAgIHByaW50ZiAoIiMgTnVtYmVyIG9mIGFyZ3VtZW50cyByZXR1cm5lZCAoJWQpIGRvbid0IG1hdGNoIG9yaWdpbmFsICglZClcbiIsCisgICAgICAgICAgICAgICAgICBzaGVsbF9hcmdjLCBvcmlnaW5hbF9hcmdjKTsKKyAgICAgICAgICBkYnVzX2ZyZWUgKG9yaWdpbmFsX2FyZ3YpOworICAgICAgICAgIGRidXNfZnJlZV9zdHJpbmdfYXJyYXkgKHNoZWxsX2FyZ3YpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfSAKKyAgICAgIHByaW50ZiAoIiMgTnVtYmVyIG9mIGFyZ3VtZW50czogJWRcbiIsIHNoZWxsX2FyZ2MpOworICAgICAgZm9yIChpID0gMDsgaSA8IHNoZWxsX2FyZ2M7IGkrKykKKyAgICAgICAgeworICAgICAgICAgIGNoYXIgKnVucXVvdGVkOworICAgICAgICAgIAorICAgICAgICAgIHVucXVvdGVkID0gX2RidXNfc2hlbGxfdW5xdW90ZSAob3JpZ2luYWxfYXJndltpXSk7CisgICAgICAgICAgaWYgKHN0cmNtcCAodW5xdW90ZWQgPyB1bnF1b3RlZCA6ICIiLAorICAgICAgICAgICAgICAgICAgICAgIHNoZWxsX2FyZ3ZbaV0gPyBzaGVsbF9hcmd2W2ldIDogIiIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBwcmludGYgKCJQb3NpdGlvbiAlZCwgcmV0dXJuZWQgYXJndW1lbnQgKCVzKSBkb2VzIG5vdCBtYXRjaCBvcmlnaW5hbCAoJXMpXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGksIHNoZWxsX2FyZ3ZbaV0sIHVucXVvdGVkKTsKKyAgICAgICAgICAgICAgZGJ1c19mcmVlICh1bnF1b3RlZCk7CisgICAgICAgICAgICAgIGRidXNfZnJlZSAob3JpZ2luYWxfYXJndik7CisgICAgICAgICAgICAgIGRidXNfZnJlZV9zdHJpbmdfYXJyYXkgKHNoZWxsX2FyZ3YpOworICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgICAgZGJ1c19mcmVlICh1bnF1b3RlZCk7CisgICAgICAgICAgaWYgKHNoZWxsX2FyZ3ZbaV0pCisgICAgICAgICAgICBwcmludGYgKCJBcmd1bWVudCAlZCA9ICVzXG4iLCBpLCBzaGVsbF9hcmd2W2ldKTsKKyAgICAgICAgfQorICAgICAgCisgICAgICBkYnVzX2ZyZWVfc3RyaW5nX2FycmF5IChzaGVsbF9hcmd2KTsKKyAgICB9CisKKyAgX2RidXNfc3RyaW5nX2ZyZWUgKCZzdHIpOworICBkYnVzX2ZyZWUgKG9yaWdpbmFsX2FyZ3YpOworCisgIGlmICghc2hvdWxkX3dvcmspCisgICAgeworICAgICAgcHJpbnRmICgiIyBFeHBlY3RlZCBhbiBlcnJvclxuIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAordGVzdF9jb21tYW5kX2xpbmUgKGNvbnN0IGNoYXIgKmFyZzEsIC4uLikKK3sKKyAgdmFfbGlzdCB2YXJfYXJnczsKKworICB2YV9zdGFydCAodmFyX2FyZ3MsIGFyZzEpOworCisgIGlmICh0ZXN0X2NvbW1hbmRfbGluZV9pbnRlcm5hbCAoVFJVRSwgYXJnMSwgdmFyX2FyZ3MpKQorICAgIHsKKyAgICAgIHByaW50ZiAoIm9rICVkXG4iLCArK3Rlc3RfbnVtKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBwcmludGYgKCJub3Qgb2sgJWRcbiIsICsrdGVzdF9udW0pOworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKworICB2YV9lbmQgKHZhcl9hcmdzKTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfY29tbWFuZF9saW5lX2ZhaWxzIChjb25zdCBjaGFyICphcmcxLCAuLi4pCit7CisgIHZhX2xpc3QgdmFyX2FyZ3M7CisKKyAgdmFfc3RhcnQgKHZhcl9hcmdzLCBhcmcxKTsKKworICBpZiAodGVzdF9jb21tYW5kX2xpbmVfaW50ZXJuYWwgKEZBTFNFLCBhcmcxLCB2YXJfYXJncykpCisgICAgeworICAgICAgcHJpbnRmICgib2sgJWRcbiIsICsrdGVzdF9udW0pOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHByaW50ZiAoIm5vdCBvayAlZFxuIiwgKyt0ZXN0X251bSk7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorCisgIHZhX2VuZCAodmFyX2FyZ3MpOworfQorCisvKiBUaGlzIHRlc3Qgb3V0cHV0cyBUQVAgc3ludGF4OiBodHRwOi8vdGVzdGFueXRoaW5nLm9yZy8gKi8KK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICB0ZXN0X2NvbW1hbmRfbGluZSAoImNvbW1hbmQiLCAiLXMiLCAiLS1mb3JjZS1zaHV0ZG93biIsICJcImEgc3RyaW5nXCIiLCAiMTIzIiwgTlVMTCk7CisgIHRlc3RfY29tbWFuZF9saW5lICgiY29tbWFuZCIsICItcyIsIE5VTEwpOworICB0ZXN0X2NvbW1hbmRfbGluZSAoIi9vcHQvZ25vbWUvYmluL3NlcnZpY2Utc3RhcnQiLCBOVUxMKTsKKyAgdGVzdF9jb21tYW5kX2xpbmUgKCJncmVwIiwgIi1sIiwgIi1yIiwgIi1pIiwgIid3aGF0ZXZlciciLCAiZmlsZXMqLmMiLCBOVUxMKTsKKyAgdGVzdF9jb21tYW5kX2xpbmUgKCIvaG9tZS9ib3N0b24vam9obnAvZGV2ZWwtbG9jYWwvZGJ1cy90ZXN0L3Rlc3Qtc2VnZmF1bHQiLCBOVUxMKTsKKyAgdGVzdF9jb21tYW5kX2xpbmUgKCJscyIsICItbCIsICItYSIsICItLWNvbG9ycyIsIE5VTEwpOworICB0ZXN0X2NvbW1hbmRfbGluZSAoInJzeW5jLXRvLXNlcnZlciIsIE5VTEwpOworICB0ZXN0X2NvbW1hbmRfbGluZSAoInRlc3Qtc2VnZmF1bHQiLCAiLS1uby1zZWdmYXVsdCIsIE5VTEwpOworICB0ZXN0X2NvbW1hbmRfbGluZSAoImV2b2x1dGlvbiIsICJtYWlsdG86cGVwZUBjdWNvLmNvbSIsIE5VTEwpOworICB0ZXN0X2NvbW1hbmRfbGluZSAoInJ1biIsICJcImEgXG4gbXVsdGlsaW5lXCIiLCBOVUxMKTsKKyAgdGVzdF9jb21tYW5kX2xpbmVfZmFpbHMgKCJscyIsICJcImEgd3Jvbmcgc3RyaW5nJyIsIE5VTEwpOworCisgIC8qIFRlbGwgdGhlIFRBUCBkcml2ZXIgdGhhdCB3ZSBoYXZlIGRvbmUgYWxsIHRoZSB0ZXN0cyB3ZSBwbGFuIHRvIGRvLgorICAgKiBUaGlzIGlzIGhvdyBpdCBjYW4gZGlzdGluZ3Vpc2ggYmV0d2VlbiBhbiB1bmV4cGVjdGVkIGV4aXQgYW5kCisgICAqIHN1Y2Nlc3NmdWwgY29tcGxldGlvbi4gKi8KKyAgcHJpbnRmICgiMS4uJWRcbiIsIHRlc3RfbnVtKTsKKworICByZXR1cm4gKG51bV9mYWlsZWQgIT0gMCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L3NwYXduLXRlc3QuYyBiL3Rlc3Qvc3Bhd24tdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExMmM4NjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NwYXduLXRlc3QuYwpAQCAtMCwwICsxLDQ0IEBACisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8ZGJ1cy9kYnVzLmg+CisKKyNpbmNsdWRlIDxkYnVzL2RidXMtc3lzZGVwcy5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1zcGF3bi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKK3N0YXRpYyB2b2lkCitzZXR1cF9mdW5jICh2b2lkICpkYXRhKQoreworICBwcmludGYgKCJlbnRlcmluZyBzZXR1cCBmdW5jLlxuIik7Cit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICBjaGFyICoqYXJndl9jb3B5OworICBpbnQgaTsKKyAgREJ1c0Vycm9yIGVycm9yID0gREJVU19FUlJPUl9JTklUOworICAKKyAgaWYgKGFyZ2MgPCAyKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIllvdSBuZWVkIHRvIHNwZWNpZnkgYSBwcm9ncmFtIHRvIGxhdW5jaC5cbiIpOworCisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIGFyZ3ZfY29weSA9IGRidXNfbmV3IChjaGFyICosIGFyZ2MpOworICBmb3IgKGkgPSAwOyBpIDwgYXJnYyAtIDE7IGkrKykKKyAgICBhcmd2X2NvcHkgW2ldID0gYXJndltpICsgMV07CisgIGFyZ3ZfY29weVthcmdjIC0gMV0gPSBOVUxMOworICAKKyAgaWYgKCFfZGJ1c19zcGF3bl9hc3luY193aXRoX2JhYnlzaXR0ZXIgKE5VTEwsIGFyZ3ZfY29weVswXSwgYXJndl9jb3B5LCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19TUEFXTl9OT05FLCBzZXR1cF9mdW5jLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKSkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJDb3VsZCBub3QgbGF1bmNoIGFwcGxpY2F0aW9uOiBcIiVzXCJcbiIsCisJICAgICAgIGVycm9yLm1lc3NhZ2UpOworICAgIH0KKworICBkYnVzX2ZyZWUoYXJndl9jb3B5KTsKKyAKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90ZXN0L3N5bnRheC5jIGIvdGVzdC9zeW50YXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjk2MGM5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zeW50YXguYwpAQCAtMCwwICsxLDI5MyBAQAorLyogU2ltcGxlIHNhbml0eS1jaGVjayBmb3IgRC1CdXMgc3ludGF4IHZhbGlkYXRpb24uCisgKgorICogQXV0aG9yOiBTaW1vbiBNY1ZpdHRpZSA8c2ltb24ubWN2aXR0aWVAY29sbGFib3JhLmNvLnVrPgorICogQ29weXJpZ2h0IMKpIDIwMTAtMjAxMSBOb2tpYSBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcworICogKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwKKyAqIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsCisgKiBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLAorICogYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKKyAqIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCisgKiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKworI2luY2x1ZGUgPGdsaWIuaD4KKworI2luY2x1ZGUgPGRidXMvZGJ1cy5oPgorCisjaW5jbHVkZSAidGVzdC11dGlscy1nbGliLmgiCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBEQnVzRXJyb3IgZTsKK30gRml4dHVyZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGRidXNfYm9vbF90ICgqZnVuY3Rpb24pIChjb25zdCBjaGFyICosIERCdXNFcnJvciAqKTsKKyAgICBjb25zdCBjaGFyICogY29uc3QgKiB2YWxpZDsKKyAgICBjb25zdCBjaGFyICogY29uc3QgKiBpbnZhbGlkOworfSBUZXN0OworCitUZXN0IHBhdGhzLCBpbnRlcmZhY2VzLCBtZW1iZXJzLCBlcnJvcnMsIGJ1c19uYW1lcywgc2lnbmF0dXJlcywKKyAgICAgc2luZ2xlX3NpZ25hdHVyZXMsIHN0cmluZ3M7CisKK2NvbnN0IGNoYXIgKiBjb25zdCB2YWxpZF9wYXRoc1tdID0geworICAgICIvIiwKKyAgICAiL2EiLAorICAgICIvXyIsCisgICAgIi9hL2IvYyIsCisgICAgIi9jb20vZXhhbXBsZS8xMjMiLAorICAgICIvb3JnL2ZyZWVkZXNrdG9wL0RCdXMiLAorICAgICIvb3JnL2ZyZWVkZXNrdG9wL1RlbGVwYXRoeS9BY2NvdW50TWFuYWdlciIsCisgICAgTlVMTAorfTsKKworY29uc3QgY2hhciAqIGNvbnN0IGludmFsaWRfcGF0aHNbXSA9IHsKKyAgICAiIiwKKyAgICAiLiIsCisgICAgIi8vIiwKKyAgICAiL2EvIiwKKyAgICAiLy0iLAorICAgICIvY29tLy9leGFtcGxlL015QXBwIiwKKyAgICAiLyQiLAorICAgICIvXHhhOSIsICAgICAgLyogwqkgaW4gbGF0aW4tMSAqLworICAgICIvXHhjMlx4YTkiLCAgLyogwqkgaW4gVVRGLTggKi8KKyAgICBOVUxMCit9OworCitjb25zdCBjaGFyICogY29uc3QgdmFsaWRfaW50ZXJmYWNlc1tdID0geworICAgICJjb20uZXhhbXBsZSIsCisgICAgImNvbS5leGFtcGxlLmEwIiwKKyAgICAib3JnLmZyZWVkZXNrdG9wLkRCdXMiLAorICAgIE5VTEwKK307CisKK2NvbnN0IGNoYXIgKiBjb25zdCBpbnZhbGlkX2ludGVyZmFjZXNbXSA9IHsKKyAgICIiLAorICAgICJjb20iLAorICAgICJjb20uZXhhbXBsZS4iLAorICAgICJjb20uZXhhbXBsZS4uYTAiLAorICAgICJjb20uZXhhbXBsZS4wYSIsCisgICAgImNvbS5leGFtcGxlLmEkIiwKKyAgICAiY29tLmV4YW1wbGUuYVx4YTkiLAorICAgICJjb20uZXhhbXBsZS5hXHhjMlx4YTkiLAorICAgIE5VTEwKK307CisKK2NvbnN0IGNoYXIgKiBjb25zdCB2YWxpZF9tZW1iZXJzW10gPSB7CisgICAgIl8iLAorICAgICJhIiwKKyAgICAiYTAiLAorICAgICJHZXRBbGwiLAorICAgICJCYWRnZXJNdXNocm9vbVNuYWtlIiwKKyAgICBOVUxMCit9OworCitjb25zdCBjaGFyICogY29uc3QgaW52YWxpZF9tZW1iZXJzW10gPSB7CisgICAgIiIsCisgICAgIi0iLAorICAgICJhLSIsCisgICAgIjAiLAorICAgICIwXyIsCisgICAgIkJhZGdlci5NdXNocm9vbSIsCisgICAgImEkIiwKKyAgICAiYVx4YTkiLAorICAgICJhXHhjMlx4YTkiLAorICAgIE5VTEwKK307CisKK2NvbnN0IGNoYXIgKiBjb25zdCB2YWxpZF9lcnJvcnNbXSA9IHsKKyAgICAiY29tLmV4YW1wbGUiLAorICAgICJjb20uZXhhbXBsZS5hMCIsCisgICAgIm9yZy5mcmVlZGVza3RvcC5EQnVzLk5hbWVIYXNOb093bmVyIiwKKyAgICBOVUxMCit9OworCitjb25zdCBjaGFyICogY29uc3QgaW52YWxpZF9lcnJvcnNbXSA9IHsKKyAgICIiLAorICAgICJjb20iLAorICAgICJjb20uZXhhbXBsZS4iLAorICAgICJjb20uZXhhbXBsZS4uYTAiLAorICAgICJjb20uZXhhbXBsZS4wYSIsCisgICAgImNvbS5leGFtcGxlLmEkIiwKKyAgICAiY29tLmV4YW1wbGUuYVx4YTkiLAorICAgICJjb20uZXhhbXBsZS5hXHhjMlx4YTkiLAorICAgIE5VTEwKK307CisKK2NvbnN0IGNoYXIgKiBjb25zdCB2YWxpZF9idXNfbmFtZXNbXSA9IHsKKyAgICAiY29tLmV4YW1wbGUiLAorICAgICJjb20uZXhhbXBsZS5hMCIsCisgICAgImNvbS5leGFtcGxlLl8iLAorICAgICI6MS40MiIsCisgICAgIjoxLjIuMy40LjUiLAorICAgICI6Y29tLmV4YW1wbGUiLAorICAgICJvcmcuZnJlZWRlc2t0b3AuREJ1cyIsCisgICAgTlVMTAorfTsKKworY29uc3QgY2hhciAqIGNvbnN0IGludmFsaWRfYnVzX25hbWVzW10gPSB7CisgICAiIiwKKyAgICAiY29tIiwKKyAgICAiY29tLmV4YW1wbGUuIiwKKyAgICAiY29tLmV4YW1wbGUuLmEwIiwKKyAgICAiY29tLmV4YW1wbGUuMGEiLAorICAgICJjb20uZXhhbXBsZS5hOmIiLAorICAgICJjb20uZXhhbXBsZS5hXHhhOSIsCisgICAgImNvbS5leGFtcGxlLmFceGMyXHhhOSIsCisgICAgTlVMTAorfTsKKworY29uc3QgY2hhciAqIGNvbnN0IHZhbGlkX3NpZ25hdHVyZXNbXSA9IHsKKyAgICAiIiwKKyAgICAiYXtzdn0iLAorICAgIE5VTEwKK307CisKK2NvbnN0IGNoYXIgKiBjb25zdCBpbnZhbGlkX3NpZ25hdHVyZXNbXSA9IHsKKyAgICAiYSIsCisgICAgImF7c199IiwKKyAgICBOVUxMCit9OworCitjb25zdCBjaGFyICogY29uc3QgdmFsaWRfc2luZ2xlX3NpZ25hdHVyZXNbXSA9IHsKKyAgICAicyIsCisgICAgImF7c3Z9IiwKKyAgICBOVUxMCit9OworCitjb25zdCBjaGFyICogY29uc3QgaW52YWxpZF9zaW5nbGVfc2lnbmF0dXJlc1tdID0geworICAgICIiLAorICAgICJhIiwKKyAgICAic3YiLAorICAgICJhe3N2fWFzIiwKKyAgICBOVUxMCit9OworCitjb25zdCBjaGFyICogY29uc3QgdmFsaWRfc3RyaW5nc1tdID0geworICAgICIiLAorICAgICJceGMyXHhhOSIsICAgICAgIC8qIFVURi04IChjKSBzeW1ib2wgKi8KKyAgICAiXHhlZlx4YmZceGJlIiwgICAvKiBVK0ZGRkUgaXMgcmVzZXJ2ZWQgYnV0IENvcnJpZ2VuZHVtIDkgc2F5cyBpdCdzIE9LICovCisgICAgTlVMTAorfTsKKworY29uc3QgY2hhciAqIGNvbnN0IGludmFsaWRfc3RyaW5nc1tdID0geworICAgICJceGE5IiwgICAgICAgICAgIC8qIExhdGluLTEgKGMpIHN5bWJvbCAqLworICAgICJceGVkXHhhMFx4ODAiLCAgIC8qIFVURi0xNiBzdXJyb2dhdGVzIGFyZSBub3QgdmFsaWQgaW4gVVRGLTggKi8KKyAgICBOVUxMCit9OworCitzdGF0aWMgdm9pZAorc2V0dXAgKEZpeHR1cmUgKmYsCisgICAgZ2NvbnN0cG9pbnRlciBhcmcgR19HTlVDX1VOVVNFRCkKK3sKKyAgZGJ1c19lcnJvcl9pbml0ICgmZi0+ZSk7CisKKyNkZWZpbmUgRklMTF9URVNUKG5hbWUsIGZ1bmMpIFwKKyAgZG8geyBcCisgICAgKG5hbWUpLmZ1bmN0aW9uID0gKGZ1bmMpOyBcCisgICAgKG5hbWUpLnZhbGlkID0gdmFsaWRfICMjIG5hbWU7IFwKKyAgICAobmFtZSkuaW52YWxpZCA9IGludmFsaWRfICMjIG5hbWU7IFwKKyAgfSB3aGlsZSAoMCkKKworICBGSUxMX1RFU1QgKHBhdGhzLCBkYnVzX3ZhbGlkYXRlX3BhdGgpOworICBGSUxMX1RFU1QgKGludGVyZmFjZXMsIGRidXNfdmFsaWRhdGVfaW50ZXJmYWNlKTsKKyAgRklMTF9URVNUIChtZW1iZXJzLCBkYnVzX3ZhbGlkYXRlX21lbWJlcik7CisgIEZJTExfVEVTVCAoZXJyb3JzLCBkYnVzX3ZhbGlkYXRlX2Vycm9yX25hbWUpOworICBGSUxMX1RFU1QgKGJ1c19uYW1lcywgZGJ1c192YWxpZGF0ZV9idXNfbmFtZSk7CisgIEZJTExfVEVTVCAoc2lnbmF0dXJlcywgZGJ1c19zaWduYXR1cmVfdmFsaWRhdGUpOworICBGSUxMX1RFU1QgKHNpbmdsZV9zaWduYXR1cmVzLCBkYnVzX3NpZ25hdHVyZV92YWxpZGF0ZV9zaW5nbGUpOworICBGSUxMX1RFU1QgKHN0cmluZ3MsIGRidXNfdmFsaWRhdGVfdXRmOCk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3N5bnRheCAoRml4dHVyZSAqZiwKKyAgICBnY29uc3Rwb2ludGVyIGFyZykKK3sKKyAgY29uc3QgVGVzdCAqdGVzdCA9IGFyZzsKKyAgaW50IGk7CisKKyAgZ19hc3NlcnQgKHRlc3QgIT0gTlVMTCk7CisgIGdfYXNzZXJ0ICh0ZXN0LT5mdW5jdGlvbiAhPSBOVUxMKTsKKyAgZ19hc3NlcnQgKHRlc3QtPnZhbGlkICE9IE5VTEwpOworICBnX2Fzc2VydCAodGVzdC0+aW52YWxpZCAhPSBOVUxMKTsKKworICBmb3IgKGkgPSAwOyB0ZXN0LT52YWxpZFtpXSAhPSBOVUxMOyBpKyspCisgICAgeworICAgICAgZGJ1c19ib29sX3Qgb2sgPSB0ZXN0LT5mdW5jdGlvbiAodGVzdC0+dmFsaWRbaV0sICZmLT5lKTsKKworICAgICAgaWYgKGRidXNfZXJyb3JfaXNfc2V0ICgmZi0+ZSkpCisgICAgICAgIGdfZXJyb3IgKCIlcyB3YXMgY29uc2lkZXJlZCBpbnZhbGlkOiAlczogJXMiLCB0ZXN0LT52YWxpZFtpXSwKKyAgICAgICAgICAgIGYtPmUubmFtZSwgZi0+ZS5tZXNzYWdlKTsKKworICAgICAgaWYgKCFvaykKKyAgICAgICAgZ19lcnJvciAoIiVzIHdhcyBjb25zaWRlcmVkIGludmFsaWQgd2l0aG91dCBhbiBlcnJvciIsIHRlc3QtPnZhbGlkW2ldKTsKKyAgICB9CisKKyAgZm9yIChpID0gMDsgdGVzdC0+aW52YWxpZFtpXSAhPSBOVUxMOyBpKyspCisgICAgeworICAgICAgZGJ1c19ib29sX3Qgb2sgPSB0ZXN0LT5mdW5jdGlvbiAodGVzdC0+aW52YWxpZFtpXSwgJmYtPmUpOworCisgICAgICBpZiAob2spCisgICAgICAgIGdfZXJyb3IgKCIlcyBzaG91bGQgaGF2ZSBiZWVuIGNvbnNpZGVyZWQgaW52YWxpZCIsIHRlc3QtPmludmFsaWRbaV0pOworCisgICAgICBpZiAoIWRidXNfZXJyb3JfaXNfc2V0ICgmZi0+ZSkpCisgICAgICAgIGdfZXJyb3IgKCIlcyBzaG91bGQgaGF2ZSBhbiBlcnJvciBzZXQiLCB0ZXN0LT5pbnZhbGlkW2ldKTsKKworICAgICAgaWYgKCFkYnVzX3ZhbGlkYXRlX2Vycm9yX25hbWUgKGYtPmUubmFtZSwgTlVMTCkpCisgICAgICAgIGdfZXJyb3IgKCIlcyBwcm9kdWNlZCBhbiBpbnZhbGlkIGVycm9yIG5hbWU6ICVzIiwKKyAgICAgICAgICAgIHRlc3QtPmludmFsaWRbaV0sIGYtPmUubmFtZSk7CisKKyAgICAgIGlmICghZGJ1c192YWxpZGF0ZV91dGY4IChmLT5lLm1lc3NhZ2UsIE5VTEwpKQorICAgICAgICBnX2Vycm9yICgiJXMgcHJvZHVjZWQgYW4gaW52YWxpZCBlcnJvciBtZXNzYWdlOiAlcyIsCisgICAgICAgICAgICB0ZXN0LT5pbnZhbGlkW2ldLCBmLT5lLm1lc3NhZ2UpOworCisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZmLT5lKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCit0ZWFyZG93biAoRml4dHVyZSAqZiwKKyAgICBnY29uc3Rwb2ludGVyIGFyZyBHX0dOVUNfVU5VU0VEKQoreworICBkYnVzX2Vycm9yX2ZyZWUgKCZmLT5lKTsKK30KKworaW50CittYWluIChpbnQgYXJnYywKKyAgICBjaGFyICoqYXJndikKK3sKKyAgdGVzdF9pbml0ICgmYXJnYywgJmFyZ3YpOworCisgIGdfdGVzdF9hZGQgKCIvc3ludGF4L3BhdGgiLCBGaXh0dXJlLCAmcGF0aHMsIHNldHVwLCB0ZXN0X3N5bnRheCwgdGVhcmRvd24pOworICBnX3Rlc3RfYWRkICgiL3N5bnRheC9pbnRlcmZhY2UiLCBGaXh0dXJlLCAmaW50ZXJmYWNlcywKKyAgICAgIHNldHVwLCB0ZXN0X3N5bnRheCwgdGVhcmRvd24pOworICBnX3Rlc3RfYWRkICgiL3N5bnRheC9lcnJvciIsIEZpeHR1cmUsICZlcnJvcnMsCisgICAgICBzZXR1cCwgdGVzdF9zeW50YXgsIHRlYXJkb3duKTsKKyAgZ190ZXN0X2FkZCAoIi9zeW50YXgvbWVtYmVyIiwgRml4dHVyZSwgJm1lbWJlcnMsCisgICAgICBzZXR1cCwgdGVzdF9zeW50YXgsIHRlYXJkb3duKTsKKyAgZ190ZXN0X2FkZCAoIi9zeW50YXgvYnVzLW5hbWUiLCBGaXh0dXJlLCAmYnVzX25hbWVzLAorICAgICAgc2V0dXAsIHRlc3Rfc3ludGF4LCB0ZWFyZG93bik7CisgIGdfdGVzdF9hZGQgKCIvc3ludGF4L3NpZ25hdHVyZSIsIEZpeHR1cmUsICZzaWduYXR1cmVzLAorICAgICAgc2V0dXAsIHRlc3Rfc3ludGF4LCB0ZWFyZG93bik7CisgIGdfdGVzdF9hZGQgKCIvc3ludGF4L3NpbmdsZS1zaWduYXR1cmUiLCBGaXh0dXJlLCAmc2luZ2xlX3NpZ25hdHVyZXMsCisgICAgICBzZXR1cCwgdGVzdF9zeW50YXgsIHRlYXJkb3duKTsKKyAgZ190ZXN0X2FkZCAoIi9zeW50YXgvdXRmOCIsIEZpeHR1cmUsICZzdHJpbmdzLAorICAgICAgc2V0dXAsIHRlc3Rfc3ludGF4LCB0ZWFyZG93bik7CisKKyAgcmV0dXJuIGdfdGVzdF9ydW4gKCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L3RhcC10ZXN0LnNoLmluIGIvdGVzdC90YXAtdGVzdC5zaC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDNjZGYzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC90YXAtdGVzdC5zaC5pbgpAQCAtMCwwICsxLDMyIEBACisjIS9iaW4vc2gKKworIyBXcmFwcGVyIHRvIG1ha2UgYW4gQXV0b21ha2Utc3R5bGUgdGVzdCBvdXRwdXQgVEFQIHN5bnRheDoKKyMKKyMgLSBhcmJpdHJhcnkgc3Rkb3V0L3N0ZGVyciBpcyBzZW50IHRvIHN0ZGVyciB3aGVyZSBpdCB3aWxsIG5vdCBiZQorIyAgIGludGVycHJldGVkIGFzIFRBUAorIyAtIGl0IGlzIHRyZWF0ZWQgYXMgYSBzaW5nbGUgdGVzdC1jYXNlCisjIC0gZXhpdCA3NyBpcyBhIHNraXAKKyMgLSBleGl0IDAgaXMgYSBwYXNzCisjIC0gYW55dGhpbmcgZWxzZSBpcyBhIGZhaWx1cmUKKyMKKyMgVXNhZ2U6IHVzZSBzZWQgdG8gcmVwbGFjZSBAUlVOQCB3aXRoIHRoZSBzaGVsbCBjb21tYW5kLWxpbmUgdG8gYmUgcnVuLgorCitzZXQgLWUKKworIyB3ZSBwbGFuIHRvIGRvIDEgdGVzdC1jYXNlCitlY2hvICIxLi4xIgorCitlPTAKK0BSVU5AID4mMiB8fCBlPSQ/CisKK2Nhc2UgIiRlIiBpbgorICAgICgwKQorICAgICAgICBlY2hvICJvayAxIEBSVU5AIgorICAgICAgICA7OworICAgICg3NykKKyAgICAgICAgZWNobyAib2sgMSAjIFNLSVAgQFJVTkAiCisgICAgICAgIDs7CisgICAgKCopCisgICAgICAgIGVjaG8gIm5vdCBvayAxIEBSVU5AIChleGl0IHN0YXR1cyAkZSkiCisgICAgICAgIDs7Citlc2FjCmRpZmYgLS1naXQgYS90ZXN0L3Rlc3QtYXBwYXJtb3ItYWN0aXZhdGlvbi5zaCBiL3Rlc3QvdGVzdC1hcHBhcm1vci1hY3RpdmF0aW9uLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmYzEyNTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3Rlc3QtYXBwYXJtb3ItYWN0aXZhdGlvbi5zaApAQCAtMCwwICsxLDU3IEBACisjIS9iaW4vc2gKKworIyBDb3B5cmlnaHQgwqkgMjAxNiBDb2xsYWJvcmEgTHRkLgorIworIyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorIyBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcworIyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLAorIyBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLAorIyBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLAorIyBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAorIyBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyMKKyMgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKKyMgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisjCisjIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorIyBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyMgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyMgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworIyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyMgQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyMgQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorIyBTT0ZUV0FSRS4KKworc2V0IC1lCisKK2lmIFsgIngkKGlkIC11KSIgIT0gIngwIiBdOyB0aGVuCisgICAgZWNobyAiMS4uMCAjIFNLSVAgLSB0aGlzIHRlc3QgY2FuIG9ubHkgYmUgcnVuIGFzIHJvb3QiCisgICAgZXhpdCAwCitmaQorCitpZiBbIC16ICIkREJVU19URVNUX0VYRUMiIF07IHRoZW4KKyAgICBEQlVTX1RFU1RfRVhFQz0iJChkaXJuYW1lICIkMCIpIgorICAgIGlmICEgWyAteCAiJERCVVNfVEVTVF9FWEVDL3Rlc3QtYXBwYXJtb3ItYWN0aXZhdGlvbiIgXTsgdGhlbgorICAgICAgICBlY2hvICIxLi4wICMgU0tJUCAtIGV4ZWN1dGFibGUgbm90IGZvdW5kIGFuZCBEQlVTX1RFU1RfRVhFQyBub3Qgc2V0IgorICAgICAgICBleGl0IDAKKyAgICBmaQorZmkKKworaWYgWyAteiAiJERCVVNfVEVTVF9EQVRBIiBdOyB0aGVuCisgICAgREJVU19URVNUX0RBVEE9IiREQlVTX1RFU1RfRVhFQy9kYXRhIgorICAgIGlmICEgWyAtZSAiJERCVVNfVEVTVF9EQVRBL2RidXMtaW5zdGFsbGVkLXRlc3RzLmFhcHJvZmlsZSIgXTsgdGhlbgorICAgICAgICBlY2hvICIxLi4wICMgU0tJUCAtIHJlcXVpcmVkIGRhdGEgbm90IGZvdW5kIGFuZCBEQlVTX1RFU1RfREFUQSBub3Qgc2V0IgorICAgICAgICBleGl0IDAKKyAgICBmaQorZmkKKworZWNobyAiIyBBdHRlbXB0aW5nIHRvIGxvYWQgQXBwQXJtb3IgcHJvZmlsZXMiCitpZiAhIGFwcGFybW9yX3BhcnNlciAtLXNraXAtY2FjaGUgLS1yZXBsYWNlIFwKKyAgICAgICAgIiREQlVTX1RFU1RfREFUQS9kYnVzLWluc3RhbGxlZC10ZXN0cy5hYXByb2ZpbGUiOyB0aGVuCisgICAgZWNobyAiMS4uMCAjIFNLSVAgLSB1bmFibGUgdG8gbG9hZCBBcHBBcm1vciBwcm9maWxlcyIKKyAgICBleGl0IDAKK2ZpCisKK2V4ZWMgIiREQlVTX1RFU1RfRVhFQy90ZXN0LWFwcGFybW9yLWFjdGl2YXRpb24iIC0tdGFwICIkQCIKKworIyB2aW06c2V0IHN0cz00IHN3PTQgZXQ6CmRpZmYgLS1naXQgYS90ZXN0L3Rlc3QtZGJ1cy1kYWVtb24tZm9yay5zaCBiL3Rlc3QvdGVzdC1kYnVzLWRhZW1vbi1mb3JrLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjFhNzE3NWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3Rlc3QtZGJ1cy1kYWVtb24tZm9yay5zaApAQCAtMCwwICsxLDEwNiBAQAorIyEvYmluL3NoCisKKyMgQ29weXJpZ2h0IMKpIDIwMTYgQ29sbGFib3JhIEx0ZC4KKyMKKyMgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyMgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMKKyMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwKKyMgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwKKyMgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwKKyMgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKKyMgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisjCisjIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCisjIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorIworIyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyMgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisjIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisjIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisjIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisjIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyMgU09GVFdBUkUuCisKK3NldCAtZQorCitleHBvcnQgREJVU19ERUJVR19PVVRQVVQ9MQorZWNobyAiIyBkYnVzLWRhZW1vbiBiaW5hcnk6ICR7REJVU19URVNUX0RBRU1PTjo9ZGJ1cy1kYWVtb259IgorZWNobyAiIyBkYnVzLXNlbmQgYmluYXJ5OiAke0RCVVNfVEVTVF9EQlVTX1NFTkQ6PWRidXMtc2VuZH0iCisKK2lmIHRlc3QgLW4gIiREQlVTX1RFU1RfREFUQSI7IHRoZW4KKyAgICBlY2hvICIjIHRlc3QgZGF0YTogJERCVVNfVEVTVF9EQVRBIgorICAgIGNvbmZpZz0iLS1jb25maWctZmlsZT0kREJVU19URVNUX0RBVEEvdmFsaWQtY29uZmlnLWZpbGVzL3Nlc3Npb24uY29uZiIKK2VsaWYgdGVzdCAtbiAiJERCVVNfVEVTVF9EQVRBRElSIjsgdGhlbgorICAgIGVjaG8gIiMgZGF0YWRpcjogJERCVVNfVEVTVF9EQVRBRElSIgorICAgIGNvbmZpZz0iLS1jb25maWctZmlsZT0kREJVU19URVNUX0RBVEFESVIvZGJ1cy0xL3Nlc3Npb24uY29uZiIKK2Vsc2UKKyAgICBlY2hvICIjIHVzaW5nIHN0YW5kYXJkIHNlc3Npb24gYnVzIGNvbmZpZ3VyYXRpb24iCisgICAgY29uZmlnPSItLXNlc3Npb24iCitmaQorCitpZiAhIHdvcmtkaXI9IiQobWt0ZW1wIC1kKSI7IHRoZW4KKyAgICBlY2hvICIxLi4wICMgU0tJUCAtIG1rdGVtcCAtZCBkb2Vzbid0IHdvcmsiCisgICAgZXhpdCAwCitmaQorCitlY2hvICIxLi4zIgorCit1bnNldCBEQlVTX1NFU1NJT05fQlVTX0FERFJFU1MKK3Vuc2V0IERCVVNfU0VTU0lPTl9CVVNfUElECitybSAtZiAiJHdvcmtkaXIiL2FkZHJlc3MgIiR3b3JrZGlyIi9waWQKKworJHtEQlVTX1RFU1RfREFFTU9OfSAtLWZvcmsgLS1wcmludC1hZGRyZXNzPTggLS1wcmludC1waWQ9OSAiJGNvbmZpZyIgXAorICAgIDg+IiR3b3JrZGlyL2FkZHJlc3MiIDk+IiR3b3JrZGlyL3BpZCIKKworZXhwb3J0IERCVVNfU0VTU0lPTl9CVVNfQUREUkVTUz0iJChjYXQgIiR3b3JrZGlyIi9hZGRyZXNzKSIKK3Rlc3QgLW4gIiREQlVTX1NFU1NJT05fQlVTX0FERFJFU1MiCitEQlVTX1NFU1NJT05fQlVTX1BJRD0iJChjYXQgIiR3b3JrZGlyIi9waWQpIgora2lsbCAtMCAiJERCVVNfU0VTU0lPTl9CVVNfUElEIgorCiske0RCVVNfVEVTVF9EQlVTX1NFTkR9IC0tc2Vzc2lvbiAtLWRlc3Q9b3JnLmZyZWVkZXNrdG9wLkRCdXMgXAorICAgIC0tdHlwZT1tZXRob2RfY2FsbCAtLXByaW50LXJlcGx5IC8gb3JnLmZyZWVkZXNrdG9wLkRCdXMuTGlzdE5hbWVzID4mMgorCitraWxsICIkREJVU19TRVNTSU9OX0JVU19QSUQiCisKK2VjaG8gIm9rIDEgLSBub3JtYWwgZGJ1cy1kYWVtb24iCisKK3Vuc2V0IERCVVNfU0VTU0lPTl9CVVNfQUREUkVTUwordW5zZXQgREJVU19TRVNTSU9OX0JVU19QSUQKK3JtIC1mICIkd29ya2RpciIvYWRkcmVzcyAiJHdvcmtkaXIiL3BpZAorCiske0RCVVNfVEVTVF9EQUVNT059IC0tZm9yayAtLXByaW50LWFkZHJlc3M9OCAtLXByaW50LXBpZD05ICIkY29uZmlnIiBcCisgICAgOD4iJHdvcmtkaXIvYWRkcmVzcyIgOT4iJHdvcmtkaXIvcGlkIiA8Ji0KKworZXhwb3J0IERCVVNfU0VTU0lPTl9CVVNfQUREUkVTUz0iJChjYXQgIiR3b3JrZGlyIi9hZGRyZXNzKSIKK3Rlc3QgLW4gIiREQlVTX1NFU1NJT05fQlVTX0FERFJFU1MiCitEQlVTX1NFU1NJT05fQlVTX1BJRD0iJChjYXQgIiR3b3JrZGlyIi9waWQpIgora2lsbCAtMCAiJERCVVNfU0VTU0lPTl9CVVNfUElEIgorCiske0RCVVNfVEVTVF9EQlVTX1NFTkR9IC0tc2Vzc2lvbiAtLWRlc3Q9b3JnLmZyZWVkZXNrdG9wLkRCdXMgXAorICAgIC0tdHlwZT1tZXRob2RfY2FsbCAtLXByaW50LXJlcGx5IC8gb3JnLmZyZWVkZXNrdG9wLkRCdXMuTGlzdE5hbWVzID4mMgorCitraWxsICIkREJVU19TRVNTSU9OX0JVU19QSUQiCisKK2VjaG8gIm9rIDIgLSBkYnVzLWRhZW1vbiB3aXRoIHN0ZGluIGNsb3NlZCIKKwordW5zZXQgREJVU19TRVNTSU9OX0JVU19BRERSRVNTCit1bnNldCBEQlVTX1NFU1NJT05fQlVTX1BJRAorcm0gLWYgIiR3b3JrZGlyIi9hZGRyZXNzICIkd29ya2RpciIvcGlkCisKKyR7REJVU19URVNUX0RBRU1PTn0gLS1mb3JrIC0tcHJpbnQtYWRkcmVzcz04IC0tcHJpbnQtcGlkPTkgIiRjb25maWciIFwKKyAgICA4PiIkd29ya2Rpci9hZGRyZXNzIiA5PiIkd29ya2Rpci9waWQiIDwmLSA+Ji0gMj4mLQorCitleHBvcnQgREJVU19TRVNTSU9OX0JVU19BRERSRVNTPSIkKGNhdCAiJHdvcmtkaXIiL2FkZHJlc3MpIgordGVzdCAtbiAiJERCVVNfU0VTU0lPTl9CVVNfQUREUkVTUyIKK0RCVVNfU0VTU0lPTl9CVVNfUElEPSIkKGNhdCAiJHdvcmtkaXIiL3BpZCkiCitraWxsIC0wICIkREJVU19TRVNTSU9OX0JVU19QSUQiCisKKyR7REJVU19URVNUX0RCVVNfU0VORH0gLS1zZXNzaW9uIC0tZGVzdD1vcmcuZnJlZWRlc2t0b3AuREJ1cyBcCisgICAgLS10eXBlPW1ldGhvZF9jYWxsIC0tcHJpbnQtcmVwbHkgLyBvcmcuZnJlZWRlc2t0b3AuREJ1cy5MaXN0TmFtZXMgPiYyCisKK2tpbGwgIiREQlVTX1NFU1NJT05fQlVTX1BJRCIKKworZWNobyAib2sgMyAtIGRidXMtZGFlbW9uIHdpdGggc3RkaW4sIHN0ZG91dCwgc3RkZXJyIGNsb3NlZCIKKworcm0gLXIgIiR3b3JrZGlyIgpkaWZmIC0tZ2l0IGEvdGVzdC90ZXN0LWRidXMtbGF1bmNoLWV2YWwuc2ggYi90ZXN0L3Rlc3QtZGJ1cy1sYXVuY2gtZXZhbC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jZDk2MDY1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC90ZXN0LWRidXMtbGF1bmNoLWV2YWwuc2gKQEAgLTAsMCArMSw3NCBAQAorIyEvYmluL3NoCisKKyMgQ29weXJpZ2h0IMKpIDIwMTYgQ29sbGFib3JhIEx0ZC4KKyMKKyMgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyMgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMKKyMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwKKyMgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwKKyMgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwKKyMgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKKyMgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisjCisjIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCisjIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorIworIyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyMgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisjIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisjIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisjIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisjIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyMgU09GVFdBUkUuCisKK3NldCAtZQorCitleHBvcnQgREJVU19ERUJVR19PVVRQVVQ9MQorZWNobyAiIyBkYnVzLWRhZW1vbiBiaW5hcnk6ICR7REJVU19URVNUX0RBRU1PTjo9ZGJ1cy1kYWVtb259IgorZWNobyAiIyBkYnVzLWxhdW5jaCBiaW5hcnk6ICR7REJVU19URVNUX0RCVVNfTEFVTkNIOj1kYnVzLWxhdW5jaH0iCitlY2hvICIjIGRidXMtc2VuZCBiaW5hcnk6ICR7REJVU19URVNUX0RCVVNfU0VORDo9ZGJ1cy1zZW5kfSIKK2VjaG8gIiMgZGJ1cy11dWlkZ2VuIGJpbmFyeTogJHtEQlVTX1RFU1RfREJVU19VVUlER0VOOj1kYnVzLXV1aWRnZW59IgorCitpZiB0ZXN0IC1uICIkREJVU19URVNUX0RBVEEiOyB0aGVuCisgICAgZWNobyAiIyB0ZXN0IGRhdGE6ICREQlVTX1RFU1RfREFUQSIKKyAgICBjb25maWc9Ii0tY29uZmlnLWZpbGU9JERCVVNfVEVTVF9EQVRBL3ZhbGlkLWNvbmZpZy1maWxlcy9zZXNzaW9uLmNvbmYiCitlbGlmIHRlc3QgLW4gIiREQlVTX1RFU1RfREFUQURJUiI7IHRoZW4KKyAgICBlY2hvICIjIGRhdGFkaXI6ICREQlVTX1RFU1RfREFUQURJUiIKKyAgICBjb25maWc9Ii0tY29uZmlnLWZpbGU9JERCVVNfVEVTVF9EQVRBRElSL2RidXMtMS9zZXNzaW9uLmNvbmYiCitlbHNlCisgICAgZWNobyAiIyB1c2luZyBzdGFuZGFyZCBzZXNzaW9uIGJ1cyBjb25maWd1cmF0aW9uIgorICAgICMgYWRkIGEgaGFybWxlc3MgY29tbWFuZC1saW5lIGFyZ3VtZW50CisgICAgY29uZmlnPSItLXNoLXN5bnRheCIKK2ZpCisKK2lmICEgIiR7REJVU19URVNUX0RCVVNfVVVJREdFTn0iIC0tZ2V0ID4vZGV2L251bGw7IHRoZW4KKyAgICBpZiB0ZXN0IC1uICIkREJVU19URVNUX1VOSU5TVEFMTEVEIjsgdGhlbgorICAgICAgICBlY2hvICIxLi4wICMgU0tJUCAtIFVuYWJsZSB0byB0ZXN0IGRidXMtbGF1bmNoIHdpdGhvdXQgYSBtYWNoaW5lIElEIgorICAgICAgICBleGl0IDAKKyAgICBlbHNlCisgICAgICAgIGVjaG8gIkJhaWwgb3V0ISBkYnVzIG5vdCBjb3JyZWN0bHkgaW5zdGFsbGVkOiBubyBtYWNoaW5lIElEIgorICAgICAgICBleGl0IDEKKyAgICBmaQorZmkKKworZWNobyAiMS4uMSIKKwordW5zZXQgREJVU19TRVNTSU9OX0JVU19BRERSRVNTCit1bnNldCBEQlVTX1NFU1NJT05fQlVTX1BJRAorCitldmFsICIkKCR7REJVU19URVNUX0RCVVNfTEFVTkNIfSAtLXNoLXN5bnRheCAiJGNvbmZpZyIpIgorCit0ZXN0IC1uICIkREJVU19TRVNTSU9OX0JVU19BRERSRVNTIgorZW52IHwgZ3JlcCAnXkRCVVNfU0VTU0lPTl9CVVNfQUREUkVTUz0nCisKK3Rlc3QgLW4gIiREQlVTX1NFU1NJT05fQlVTX1BJRCIKK3Rlc3QgIngkKGVudiB8IGdyZXAgJ15EQlVTX1NFU1NJT05fQlVTX1BJRD0nKSIgPSAieCIKK2tpbGwgLTAgIiREQlVTX1NFU1NJT05fQlVTX1BJRCIKKworJHtEQlVTX1RFU1RfREJVU19TRU5EfSAtLXNlc3Npb24gLS1kZXN0PW9yZy5mcmVlZGVza3RvcC5EQnVzIFwKKyAgICAtLXR5cGU9bWV0aG9kX2NhbGwgLS1wcmludC1yZXBseSAvIG9yZy5mcmVlZGVza3RvcC5EQnVzLkxpc3ROYW1lcyA+JjIKKwora2lsbCAiJERCVVNfU0VTU0lPTl9CVVNfUElEIgorCitlY2hvICJvayAxIC0gbm9ybWFsIGRidXMtbGF1bmNoIgpkaWZmIC0tZ2l0IGEvdGVzdC90ZXN0LWRidXMtbGF1bmNoLXgxMS5zaCBiL3Rlc3QvdGVzdC1kYnVzLWxhdW5jaC14MTEuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDhjMjcxOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdGVzdC1kYnVzLWxhdW5jaC14MTEuc2gKQEAgLTAsMCArMSwyNjcgQEAKKyMhL2Jpbi9zaAorCisjIENvcHlyaWdodCDCqSAyMDE2IENvbGxhYm9yYSBMdGQuCisjCisjIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisjIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzCisjICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sCisjIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsCisjIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsCisjIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCisjIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorIworIyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQorIyBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyMKKyMgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisjIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorIyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorIyBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisjIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorIyBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorIyBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisjIFNPRlRXQVJFLgorCitzZXQgLWUKK3NldCAteAorCitleHBvcnQgREJVU19ERUJVR19PVVRQVVQ9MQorZWNobyAiIyBkYnVzLWRhZW1vbiBiaW5hcnk6ICR7REJVU19URVNUX0RBRU1PTjo9ZGJ1cy1kYWVtb259IgorZWNobyAiIyBkYnVzLWxhdW5jaCBiaW5hcnk6ICR7REJVU19URVNUX0RCVVNfTEFVTkNIOj1kYnVzLWxhdW5jaH0iCitlY2hvICIjIGRidXMtbW9uaXRvciBiaW5hcnk6ICR7REJVU19URVNUX0RCVVNfTEFVTkNIOj1kYnVzLW1vbml0b3J9IgorZWNobyAiIyBkYnVzLXNlbmQgYmluYXJ5OiAke0RCVVNfVEVTVF9EQlVTX1NFTkQ6PWRidXMtc2VuZH0iCitlY2hvICIjIGRidXMtdXVpZGdlbiBiaW5hcnk6ICR7REJVU19URVNUX0RCVVNfVVVJREdFTjo9ZGJ1cy11dWlkZ2VufSIKKworaWYgdGVzdCAtbiAiJERCVVNfVEVTVF9EQVRBIjsgdGhlbgorICAgIGVjaG8gIiMgdGVzdCBkYXRhOiAkREJVU19URVNUX0RBVEEiCisgICAgYnVzX2NvbmZpZz0iLS1jb25maWctZmlsZT0kREJVU19URVNUX0RBVEEvdmFsaWQtY29uZmlnLWZpbGVzL3Nlc3Npb24uY29uZiIKKyAgICBsYXVuY2hfY29uZmlnPSIkYnVzX2NvbmZpZyIKK2VsaWYgdGVzdCAtbiAiJERCVVNfVEVTVF9EQVRBRElSIjsgdGhlbgorICAgIGVjaG8gIiMgZGF0YWRpcjogJERCVVNfVEVTVF9EQVRBRElSIgorICAgIGJ1c19jb25maWc9Ii0tY29uZmlnLWZpbGU9JERCVVNfVEVTVF9EQVRBRElSL2RidXMtMS9zZXNzaW9uLmNvbmYiCisgICAgbGF1bmNoX2NvbmZpZz0iJGJ1c19jb25maWciCitlbHNlCisgICAgZWNobyAiIyB1c2luZyBzdGFuZGFyZCBzZXNzaW9uIGJ1cyBjb25maWd1cmF0aW9uIgorICAgIGJ1c19jb25maWc9Ii0tc2Vzc2lvbiIKKyAgICAjIGRidXMtbGF1bmNoIGRvZXNuJ3QgYWNjZXB0IC0tc2Vzc2lvbiBzbyBhZGQgYSBoYXJtbGVzcyBjb21tYW5kLWxpbmUKKyAgICAjIGFyZ3VtZW50CisgICAgbGF1bmNoX2NvbmZpZz0iLS1zaC1zeW50YXgiCitmaQorCitpZiAhICIke0RCVVNfVEVTVF9EQlVTX1VVSURHRU59IiAtLWdldCA+L2Rldi9udWxsOyB0aGVuCisgICAgaWYgdGVzdCAtbiAiJERCVVNfVEVTVF9VTklOU1RBTExFRCI7IHRoZW4KKyAgICAgICAgZWNobyAiMS4uMCAjIFNLSVAgLSBVbmFibGUgdG8gdGVzdCBkYnVzLWxhdW5jaCB3aXRob3V0IGEgbWFjaGluZSBJRCIKKyAgICAgICAgZXhpdCAwCisgICAgZWxzZQorICAgICAgICBlY2hvICJCYWlsIG91dCEgZGJ1cyBub3QgY29ycmVjdGx5IGluc3RhbGxlZDogbm8gbWFjaGluZSBJRCIKKyAgICAgICAgZXhpdCAxCisgICAgZmkKK2ZpCisKK2lmICEgd29ya2Rpcj0iJChta3RlbXAgLWQpIjsgdGhlbgorICAgIGVjaG8gIjEuLjAgIyBTS0lQIC0gbWt0ZW1wIC1kIGRvZXNuJ3Qgd29yayIKKyAgICBleGl0IDAKK2ZpCisKK2lmICEgeHZmYi1ydW4gLS1hdXRvLXNlcnZlcm51bSB0cnVlOyB0aGVuCisgICAgZWNobyAiMS4uMCAjIFNLSVAgLSB4dmZiLXJ1biBkb2Vzbid0IHdvcmsiCisgICAgZXhpdCAwCitmaQorCit0ZXN0X251bT0wCit4X3Nlc3Npb25fcGlkPQordW5zZXQgRElTUExBWQordW5zZXQgWEFVVEhPUklUWQorCitzdGFydF94dmZiICgpIHsKKyAgICBybSAtZiAiJHdvcmtkaXIvZGlzcGxheSIKKyAgICBybSAtZiAiJHdvcmtkaXIvcmVhZHkiCisgICAgcm0gLWYgIiR3b3JrZGlyL3gtc2Vzc2lvbi1waWQiCisgICAgcm0gLWYgIiR3b3JrZGlyL3hhdXRob3JpdHkiCisgICAgcm0gLWYgIiR3b3JrZGlyL3h2ZmItZG9uZSIKKworICAgICMgUnVuIGFuIFggc2Vzc2lvbiBpbiB0aGUgYmFja2dyb3VuZCBmb3IgdXAgdG8gNSBtaW51dGVzLgorICAgICgKKyAgICAgICAgc2V0ICtlCisgICAgICAgIHh2ZmItcnVuIC0tYXV0by1zZXJ2ZXJudW0gXAorICAgICAgICAgICAgc2ggLWMgJ2VjaG8gIiQkIiA+ICIkMS94LXNlc3Npb24tcGlkIjsgZWNobyAiJFhBVVRIT1JJVFkiID4gIiQxL3hhdXRob3JpdHkiOyBlY2hvICIkRElTUExBWSIgPiAiJDEvZGlzcGxheSI7IHRvdWNoICIkMS9yZWFkeSI7IGV4ZWMgc2xlZXAgMzAwJyBcCisgICAgICAgICAgICBzaCAiJHdvcmtkaXIiCisgICAgICAgIHRvdWNoICIkd29ya2Rpci94dmZiLWRvbmUiCisgICAgKSAmCisKKyAgICB0cmllcz0wCisgICAgd2hpbGUgISBbIC1lICIkd29ya2Rpci9yZWFkeSIgXTsgZG8KKyAgICAgICAgaWYgWyAkdHJpZXMgLWdlIDEwIF07IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIiMgRmFpbGVkIHRvIHN0YXJ0IHh2ZmItcnVuIHdpdGhpbiAkdHJpZXMgc2Vjb25kcyIKKyAgICAgICAgICAgIGV4aXQgMQorICAgICAgICBmaQorICAgICAgICB0cmllcz0kKCgkdHJpZXMgKyAxKSkKKyAgICAgICAgc2xlZXAgMQorICAgIGRvbmUKKworICAgIHhfc2Vzc2lvbl9waWQ9IiQoY2F0ICIkd29ya2Rpci94LXNlc3Npb24tcGlkIikiCisgICAgZXhwb3J0IERJU1BMQVk9IiQoY2F0ICIkd29ya2Rpci9kaXNwbGF5IikiCisgICAgZXhwb3J0IFhBVVRIT1JJVFk9IiQoY2F0ICIkd29ya2Rpci94YXV0aG9yaXR5IikiCisgICAga2lsbCAtMCAiJHhfc2Vzc2lvbl9waWQiCit9CisKK3Rlc3RfZGlzY29ubmVjdGlvbiAoKSB7CisgICAgcm0gLWYgIiR3b3JrZGlyL2Rpc2Nvbm5lY3RlZCIKKyAgICAoCisgICAgICAgIHNldCArZQorICAgICAgICAke0RCVVNfVEVTVF9EQlVTX01PTklUT1J9ID4gIiR3b3JrZGlyL2RidXMtbW9uaXRvci5sb2ciIDI+JjEKKyAgICAgICAgdG91Y2ggIiR3b3JrZGlyL2Rpc2Nvbm5lY3RlZCIKKyAgICApICYKKworICAgIGtpbGwgIiR4X3Nlc3Npb25fcGlkIgorCisgICAgdHJpZXM9MAorICAgIHdoaWxlICEgWyAtZSAiJHdvcmtkaXIvZGlzY29ubmVjdGVkIiBdOyBkbworICAgICAgICBpZiBbICR0cmllcyAtZ2UgMTAgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiIyBkYnVzLW1vbml0b3Igd2FzIG5vdCBkaXNjb25uZWN0ZWQgd2l0aGluICR0cmllcyBzZWNvbmRzIiA+JjIKKyAgICAgICAgICAgIGV4aXQgMQorICAgICAgICBmaQorICAgICAgICB0cmllcz0kKCgkdHJpZXMgKyAxKSkKKyAgICAgICAgc2xlZXAgMQorICAgIGRvbmUKKworICAgIHRyaWVzPTAKKyAgICB3aGlsZSAhIFsgLWUgIiR3b3JrZGlyL3h2ZmItZG9uZSIgXTsgZG8KKyAgICAgICAgaWYgWyAkdHJpZXMgLWdlIDEwIF07IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIiMgeHZmYi1ydW4gZGlkIG5vdCBleGl0IHdpdGhpbiAkdHJpZXMgc2Vjb25kcyIgPiYyCisgICAgICAgICAgICBleGl0IDEKKyAgICAgICAgZmkKKyAgICAgICAgdHJpZXM9JCgoJHRyaWVzICsgMSkpCisgICAgICAgIHNsZWVwIDEKKyAgICBkb25lCit9CisKK3Rlc3RfZXhpdF93aXRoX3gxMSAoKSB7CisgICAgYXJnPSIkMSIKKyAgICB1bnNldCBEQlVTX1NFU1NJT05fQlVTX0FERFJFU1MKKyAgICB1bnNldCBEQlVTX1NFU1NJT05fQlVTX1BJRAorICAgIHVuc2V0IERCVVNfU0VTU0lPTl9CVVNfV0lORE9XSUQKKworICAgIHN0YXJ0X3h2ZmIKKyAgICBldmFsICIkKCREQlVTX1RFU1RfREJVU19MQVVOQ0ggLS1zaC1zeW50YXggIiRhcmciICIkbGF1bmNoX2NvbmZpZyIgPC9kZXYvbnVsbCkiCisKKyAgICB0ZXN0IC1uICIkREJVU19TRVNTSU9OX0JVU19BRERSRVNTIgorICAgIGVudiB8IGdyZXAgJ15EQlVTX1NFU1NJT05fQlVTX0FERFJFU1M9JworCisgICAgdGVzdCAtbiAiJERCVVNfU0VTU0lPTl9CVVNfUElEIgorICAgIHRlc3QgIngkKGVudiB8IGdyZXAgJ15EQlVTX1NFU1NJT05fQlVTX1BJRD0nKSIgPSAieCIKKyAgICBraWxsIC0wICIkREJVU19TRVNTSU9OX0JVU19QSUQiCisKKyAgICB0ZXN0IC1uICIkREJVU19TRVNTSU9OX0JVU19XSU5ET1dJRCIKKyAgICB0ZXN0ICJ4JChlbnYgfCBncmVwICdeREJVU19TRVNTSU9OX0JVU19XSU5ET1dJRD0nKSIgPSAieCIKKworICAgICR7REJVU19URVNUX0RCVVNfU0VORH0gLS1zZXNzaW9uIC0tZGVzdD1vcmcuZnJlZWRlc2t0b3AuREJ1cyBcCisgICAgICAgIC0tdHlwZT1tZXRob2RfY2FsbCAtLXByaW50LXJlcGx5IC8gb3JnLmZyZWVkZXNrdG9wLkRCdXMuTGlzdE5hbWVzID4mMgorCisgICAgdGVzdF9kaXNjb25uZWN0aW9uCisKKyAgICB0ZXN0X251bT0kKCgkdGVzdF9udW0gKyAxKSkKKyAgICBlY2hvICJvayAke3Rlc3RfbnVtfSAtIGRidXMtbGF1bmNoICRhcmciCit9CisKK3Rlc3RfYXV0b2xhdW5jaCAoKSB7CisgICAgdW5zZXQgREJVU19TRVNTSU9OX0JVU19BRERSRVNTCisgICAgdW5zZXQgREJVU19TRVNTSU9OX0JVU19QSUQKKyAgICB1bnNldCBEQlVTX1NFU1NJT05fQlVTX1dJTkRPV0lECisgICAgdW5zZXQgWERHX1JVTlRJTUVfRElSCisgICAgZmFrZV91dWlkPSJmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZiIKKworICAgIHN0YXJ0X3h2ZmIKKyAgICBldmFsICIkKCREQlVTX1RFU1RfREJVU19MQVVOQ0ggLS1zaC1zeW50YXggLS1hdXRvbGF1bmNoPSR7ZmFrZV91dWlkfSAiJGxhdW5jaF9jb25maWciIDwvZGV2L251bGwpIgorCisgICAgdGVzdCAtbiAiJERCVVNfU0VTU0lPTl9CVVNfQUREUkVTUyIKKyAgICBlbnYgfCBncmVwICdeREJVU19TRVNTSU9OX0JVU19BRERSRVNTPScKKworICAgIHRlc3QgLW4gIiREQlVTX1NFU1NJT05fQlVTX1BJRCIKKyAgICB0ZXN0ICJ4JChlbnYgfCBncmVwICdeREJVU19TRVNTSU9OX0JVU19QSUQ9JykiID0gIngiCisgICAga2lsbCAtMCAiJERCVVNfU0VTU0lPTl9CVVNfUElEIgorCisgICAgdGVzdCAtbiAiJERCVVNfU0VTU0lPTl9CVVNfV0lORE9XSUQiCisgICAgdGVzdCAieCQoZW52IHwgZ3JlcCAnXkRCVVNfU0VTU0lPTl9CVVNfV0lORE9XSUQ9JykiID0gIngiCisKKyAgICAjIEl0IGlzIGlkZW1wb3RlbnQKKyAgICBvbGRfYWRkcmVzcz0iJERCVVNfU0VTU0lPTl9CVVNfQUREUkVTUyIKKyAgICBvbGRfcGlkPSIkREJVU19TRVNTSU9OX0JVU19QSUQiCisgICAgb2xkX3dpbmRvdz0iJERCVVNfU0VTU0lPTl9CVVNfV0lORE9XSUQiCisgICAgZXZhbCAiJCgkREJVU19URVNUX0RCVVNfTEFVTkNIIC0tc2gtc3ludGF4IC0tYXV0b2xhdW5jaD0ke2Zha2VfdXVpZH0gIiRsYXVuY2hfY29uZmlnIiA8L2Rldi9udWxsKSIKKyAgICB0ZXN0ICIkREJVU19TRVNTSU9OX0JVU19BRERSRVNTIiA9ICIkb2xkX2FkZHJlc3MiCisgICAgdGVzdCAiJERCVVNfU0VTU0lPTl9CVVNfUElEIiA9ICIkb2xkX3BpZCIKKyAgICB0ZXN0ICIkREJVU19TRVNTSU9OX0JVU19XSU5ET1dJRCIgPSAiJG9sZF93aW5kb3ciCisKKyAgICAke0RCVVNfVEVTVF9EQlVTX1NFTkR9IC0tc2Vzc2lvbiAtLWRlc3Q9b3JnLmZyZWVkZXNrdG9wLkRCdXMgXAorICAgICAgICAtLXR5cGU9bWV0aG9kX2NhbGwgLS1wcmludC1yZXBseSAvIG9yZy5mcmVlZGVza3RvcC5EQnVzLkxpc3ROYW1lcyA+JjIKKworICAgIHRlc3RfZGlzY29ubmVjdGlvbgorCisgICAgdGVzdF9udW09JCgoJHRlc3RfbnVtICsgMSkpCisgICAgZWNobyAib2sgJHt0ZXN0X251bX0gLSBkYnVzLWxhdW5jaCAtLWF1dG9sYXVuY2giCit9CisKK3Rlc3RfeGRnX3J1bnRpbWVfZGlyICgpIHsKKyAgICB1bnNldCBEQlVTX1NFU1NJT05fQlVTX0FERFJFU1MKKyAgICB1bnNldCBEQlVTX1NFU1NJT05fQlVTX1BJRAorICAgIHVuc2V0IERCVVNfU0VTU0lPTl9CVVNfV0lORE9XSUQKKyAgICBleHBvcnQgWERHX1JVTlRJTUVfRElSPSIkd29ya2RpciIKKyAgICBmYWtlX3V1aWQ9ImZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmIgorCisgICAgaWYgZWNobyAiJHdvcmtkaXIiIHwgZ3JlcCAnW14tMC05QS1aYS16Xy8uXSc7IHRoZW4KKyAgICAgICAgdGVzdF9udW09JCgoJHRlc3RfbnVtICsgMSkpCisgICAgICAgIGVjaG8gIm9rICR7dGVzdF9udW19ICMgU0tJUCAtICR3b3JrZGlyIHdvdWxkIG5lZWQgZXNjYXBpbmciCisgICAgICAgIHJldHVybgorICAgIGZpCisKKyAgICAke0RCVVNfVEVTVF9EQUVNT059ICIkYnVzX2NvbmZpZyIgLS1hZGRyZXNzPSJ1bml4OnBhdGg9JFhER19SVU5USU1FX0RJUi9idXMiIC0tcHJpbnQtcGlkPTkgLS1mb3JrIDk+IiR3b3JrZGlyL2J1cy1waWQiCisgICAgYnVzX3BpZD0iJChjYXQgIiR3b3JrZGlyL2J1cy1waWQiKSIKKyAgICBraWxsIC0wICIkYnVzX3BpZCIKKworICAgIHN0YXJ0X3h2ZmIKKyAgICBldmFsICIkKCREQlVTX1RFU1RfREJVU19MQVVOQ0ggLS1zaC1zeW50YXggLS1hdXRvbGF1bmNoPSR7ZmFrZV91dWlkfSAiJGxhdW5jaF9jb25maWciIDwvZGV2L251bGwpIgorCisgICAgZW52IHwgZ3JlcCAnXkRCVVNfU0VTU0lPTl9CVVNfQUREUkVTUz0nCisgICAgdGVzdCAiJERCVVNfU0VTU0lPTl9CVVNfQUREUkVTUyIgPSAidW5peDpwYXRoPSRYREdfUlVOVElNRV9ESVIvYnVzIgorCisgICAgIyBXaGVuIGRidXMtbGF1bmNoIHBpY2tzIHVwIHRoZSBhZGRyZXNzIGZyb20gWERHX1JVTlRJTUVfRElSL2J1cywgaXQKKyAgICAjIGRvZXNuJ3Qga25vdyB0aGUgcGlkCisgICAgdGVzdCAteiAiJERCVVNfU0VTU0lPTl9CVVNfUElEIgorCisgICAgIyBJdCBzdGlsbCBrbm93cyB3aGljaCB3aW5kb3cgaXQgc3Rhc2hlZCB0aGUgaW5mb3JtYXRpb24gaW4KKyAgICB0ZXN0IC1uICIkREJVU19TRVNTSU9OX0JVU19XSU5ET1dJRCIKKyAgICB0ZXN0ICJ4JChlbnYgfCBncmVwICdeREJVU19TRVNTSU9OX0JVU19XSU5ET1dJRD0nKSIgPSAieCIKKworICAgICR7REJVU19URVNUX0RCVVNfU0VORH0gLS1zZXNzaW9uIC0tZGVzdD1vcmcuZnJlZWRlc2t0b3AuREJ1cyBcCisgICAgICAgIC0tdHlwZT1tZXRob2RfY2FsbCAtLXByaW50LXJlcGx5IC8gb3JnLmZyZWVkZXNrdG9wLkRCdXMuTGlzdE5hbWVzID4mMgorCisgICAga2lsbCAiJHhfc2Vzc2lvbl9waWQiCisKKyAgICB0cmllcz0wCisgICAgd2hpbGUgISBbIC1lICIkd29ya2Rpci94dmZiLWRvbmUiIF07IGRvCisgICAgICAgIGlmIFsgJHRyaWVzIC1nZSAxMCBdOyB0aGVuCisgICAgICAgICAgICBlY2hvICIjIHh2ZmItcnVuIGRpZCBub3QgZXhpdCB3aXRoaW4gJHRyaWVzIHNlY29uZHMiID4mMgorICAgICAgICAgICAgZXhpdCAxCisgICAgICAgIGZpCisgICAgICAgIHRyaWVzPSQoKCR0cmllcyArIDEpKQorICAgICAgICBzbGVlcCAxCisgICAgZG9uZQorCisgICAgIyBkYnVzLWxhdW5jaCBoYXMgZ29uZSBidXQgdGhlIGRidXMtZGFlbW9uIGlzIHN0aWxsIGFsaXZlCisgICAgJHtEQlVTX1RFU1RfREJVU19TRU5EfSAtLXNlc3Npb24gLS1kZXN0PW9yZy5mcmVlZGVza3RvcC5EQnVzIFwKKyAgICAgICAgLS10eXBlPW1ldGhvZF9jYWxsIC0tcHJpbnQtcmVwbHkgLyBvcmcuZnJlZWRlc2t0b3AuREJ1cy5MaXN0TmFtZXMgPiYyCisKKyAgICBraWxsICIkYnVzX3BpZCIKKworICAgIHRlc3RfbnVtPSQoKCR0ZXN0X251bSArIDEpKQorICAgIGVjaG8gIm9rICR7dGVzdF9udW19IC0gZGJ1cy1sYXVuY2ggLS1hdXRvbGF1bmNoIHdpdGggWERHX1JVTlRJTUVfRElSIgorfQorCitlY2hvICIxLi40IgordGVzdF9leGl0X3dpdGhfeDExIC0tZXhpdC13aXRoLXNlc3Npb24KK3Rlc3RfZXhpdF93aXRoX3gxMSAtLWV4aXQtd2l0aC14MTEKK3Rlc3RfYXV0b2xhdW5jaAordGVzdF94ZGdfcnVudGltZV9kaXIKKworIyB2aW06c2V0IHN3PTQgc3RzPTQgZXQ6CmRpZmYgLS1naXQgYS90ZXN0L3Rlc3QtZXhpdC5jIGIvdGVzdC90ZXN0LWV4aXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGY5NjdhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC90ZXN0LWV4aXQuYwpAQCAtMCwwICsxLDkgQEAKKyNpbmNsdWRlICJjb25maWcuaCIKKworLyogVGhpcyBpcyBhIHByb2Nlc3MgdGhhdCBqdXN0IGV4aXRzIHdpdGggYSBmYWlsdXJlIGNvZGUgKi8KK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCisgIHJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvdGVzdC90ZXN0LW5hbWVzLmMgYi90ZXN0L3Rlc3QtbmFtZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWU0Mjg2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC90ZXN0LW5hbWVzLmMKQEAgLTAsMCArMSw4MCBAQAorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgInRlc3QtdXRpbHMuaCIKKworc3RhdGljIERCdXNMb29wICpsb29wOworCitzdGF0aWMgdm9pZCBkaWUgKGNvbnN0IGNoYXIgKm1lc3NhZ2UpIF9EQlVTX0dOVUNfTk9SRVRVUk47CisKK3N0YXRpYyB2b2lkCitkaWUgKGNvbnN0IGNoYXIgKm1lc3NhZ2UpCit7CisgIGZwcmludGYgKHN0ZGVyciwgIioqKiB0ZXN0LW5hbWVzOiAlcyIsIG1lc3NhZ2UpOworICBleGl0ICgxKTsKK30KKworc3RhdGljIHZvaWQKK1Rlc3ROYW1lKERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgZXhwZWN0ZWRTdWNjZXNzKQoreworICBEQnVzRXJyb3IgZXJyb3I7CisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKworICAodm9pZCkgZGJ1c19idXNfcmVxdWVzdF9uYW1lIChjb25uZWN0aW9uLCBuYW1lLCAwLCAmZXJyb3IpOworICBpZiAoZGJ1c19lcnJvcl9pc19zZXQgKCZlcnJvcikpCisgICAgeworICAgICAgaWYgKGV4cGVjdGVkU3VjY2VzcykKKyAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3IgYWNxdWlyaW5nIG5hbWUgJyVzJzogJXNcbiIsIG5hbWUsIGVycm9yLm1lc3NhZ2UpOworICAgICAgZWxzZQorICAgICAgICBmcHJpbnRmIChzdGRvdXQsICJFeHBlY3RlZCBFcnJvciBhY3F1aXJpbmcgbmFtZSAnJXMnOiAlc1xuIiwgbmFtZSwgZXJyb3IubWVzc2FnZSk7CisgICAgICBfZGJ1c192ZXJib3NlICgiKioqIEZhaWxlZCB0byBhY3F1aXJlIG5hbWUgJyVzJzogJXNcbiIsIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICBlcnJvci5tZXNzYWdlKTsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgIGlmIChleHBlY3RlZFN1Y2Nlc3MpCisgICAgICAgIGV4aXQgKDEpOworICAgIH0KKyAgZWxzZSAKKyAgICB7CisgICAgICBpZiAoIWV4cGVjdGVkU3VjY2VzcykKKyAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiVW5leHBlY3RlZCBTdWNjZXNzIGFjcXVpcmluZyBuYW1lICclcydcbiIsIG5hbWUpOworICAgICAgZWxzZQorICAgICAgICBmcHJpbnRmIChzdGRvdXQsICJTdWNjZXNzZnVsbHkgYWNxdWlyZWQgbmFtZSAnJXMnXG4iLCBuYW1lKTsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCIqKiogTWFuYWdlZCB0byBhY3F1aXJlIG5hbWUgJyVzJ1xuIiwgbmFtZSk7CisgICAgICBpZiAoIWV4cGVjdGVkU3VjY2VzcykKKyAgICAgICAgZXhpdCAoMSk7CisgICAgfQorfQorCitpbnQKK21haW4gKGludCAgICBhcmdjLAorICAgICAgY2hhciAqKmFyZ3YpCit7CisgIERCdXNFcnJvciBlcnJvcjsKKyAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisgIAorICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisgIGNvbm5lY3Rpb24gPSBkYnVzX2J1c19nZXQgKERCVVNfQlVTX1NFU1NJT04sICZlcnJvcik7CisgIGlmIChjb25uZWN0aW9uID09IE5VTEwpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiKioqIEZhaWxlZCB0byBvcGVuIGNvbm5lY3Rpb24gdG8gc3lzdGVtIGJ1czogJXNcbiIsCisgICAgICAgICAgICAgICBlcnJvci5tZXNzYWdlKTsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICBsb29wID0gX2RidXNfbG9vcF9uZXcgKCk7CisgIGlmIChsb29wID09IE5VTEwpCisgICAgZGllICgiTm8gbWVtb3J5XG4iKTsKKyAgCisgIGlmICghdGVzdF9jb25uZWN0aW9uX3NldHVwIChsb29wLCBjb25uZWN0aW9uKSkKKyAgICBkaWUgKCJObyBtZW1vcnlcbiIpOworCisgIFRlc3ROYW1lKGNvbm5lY3Rpb24sICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0IiwgVFJVRSk7CisgIFRlc3ROYW1lKGNvbm5lY3Rpb24sICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0LTIiLCBUUlVFKTsKKyAgVGVzdE5hbWUoY29ubmVjdGlvbiwgIm9yZy5mcmVlZGVza3RvcC5EQnVzLlRlc3RfMiIsIFRSVUUpOworI2lmIDAKKyAgVGVzdE5hbWUoY29ubmVjdGlvbiwgIlRlc3RfMiIsIFRSVUUpOworI2VuZGlmCisKKyAgX2RidXNfdmVyYm9zZSAoIioqKiBUZXN0IHNlcnZpY2UgbmFtZSBleGl0aW5nXG4iKTsKKyAgCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdC90ZXN0LXNlZ2ZhdWx0LmMgYi90ZXN0L3Rlc3Qtc2VnZmF1bHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTE3ZGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC90ZXN0LXNlZ2ZhdWx0LmMKQEAgLTAsMCArMSw3MyBAQAorLyogVGhpcyBpcyBzaW1wbHkgYSBwcm9jZXNzIHRoYXQgc2VnZmF1bHRzICovCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaWZkZWYgSEFWRV9TSUdOQUxfSAorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1NFVFJMSU1JVAorI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1NZU19QUkNUTF9ICisjaW5jbHVkZSA8c3lzL3ByY3RsLmg+CisjZW5kaWYKKworI2lmZGVmIERCVVNfV0lOCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKKyNpbmNsdWRlIDxkYnVzL2RidXMtbWFjcm9zLmg+CisKK2ludCBleGNlcHRpb25faGFuZGxlciAoTFBFWENFUFRJT05fUE9JTlRFUlMgcCkgX0RCVVNfR05VQ19OT1JFVFVSTjsKKworLyogRXhwbGljaXQgV2luZG93cyBleGNlcHRpb24gaGFuZGxlcnMgbmVlZGVkIHRvIHN1cHJlc3MgT1MgcG9wdXBzICovCitpbnQKK2V4Y2VwdGlvbl9oYW5kbGVyKExQRVhDRVBUSU9OX1BPSU5URVJTIHApCit7CisgIGZwcmludGYoc3RkZXJyLCAidGVzdC1zZWdmYXVsdDogcmFpc2VkIGZhdGFsIGV4Y2VwdGlvbiBhcyBpbnRlbmRlZFxuIik7CisgIEV4aXRQcm9jZXNzKDB4YzAwMDAwMDUpOworfQorI2VuZGlmCisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICBjaGFyICpwOyAgCisKKyNpZmRlZiBEQlVTX1dJTgorICAvKiBEaXNhYmxlIFdpbmRvd3MgcG9wdXAgZGlhbG9nIHdoZW4gYW4gYXBwIGNyYXNoZXMgc28gdGhhdCBhcHAgcXVpdHMKKyAgICogaW1tZWRpYXRlbHkgd2l0aCBlcnJvciBjb2RlIGluc3RlYWQgb2Ygd2FpdGluZyBmb3IgdXNlciB0byBkaXNtaXNzCisgICAqIHRoZSBkaWFsb2cuICAqLworICBEV09SRCBkd01vZGUgPSBTZXRFcnJvck1vZGUoU0VNX05PR1BGQVVMVEVSUk9SQk9YKTsKKyAgU2V0RXJyb3JNb2RlKGR3TW9kZSB8IFNFTV9OT0dQRkFVTFRFUlJPUkJPWCk7CisgIC8qIERpc2FibGUgImp1c3QgaW4gdGltZSIgZGVidWdnZXIgKi8KKyAgU2V0VW5oYW5kbGVkRXhjZXB0aW9uRmlsdGVyKChMUFRPUF9MRVZFTF9FWENFUFRJT05fRklMVEVSKSZleGNlcHRpb25faGFuZGxlcik7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfU0VUUkxJTUlUCisgIC8qIE5vIGNvcmUgZHVtcHMgcGxlYXNlLCB3ZSBrbm93IHdlIGNyYXNoZWQuICovCisgIHN0cnVjdCBybGltaXQgciA9IHsgMCwgfTsKKyAgCisgIGdldHJsaW1pdCAoUkxJTUlUX0NPUkUsICZyKTsKKyAgci5ybGltX2N1ciA9IDA7CisgIHNldHJsaW1pdCAoUkxJTUlUX0NPUkUsICZyKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChIQVZFX1BSQ1RMKSAmJiBkZWZpbmVkKFBSX1NFVF9EVU1QQUJMRSkKKyAgLyogUmVhbGx5LCBubyBjb3JlIGR1bXBzIHBsZWFzZS4gT24gTGludXgsIGlmIGNvcmVfcGF0dGVybiBpcworICAgKiBzZXQgdG8gYSBwaXBlIChmb3IgYWJydC9hcHBvcnQvY29yZWtlZXBlci9ldGMuKSwgUkxJTUlUX0NPUkUgb2YgMAorICAgKiBpcyBpZ25vcmVkIChkZWxpYmVyYXRlbHksIHNvIHBlb3BsZSBjYW4gZGVidWcgaW5pdCg4KSBhbmQgb3RoZXIKKyAgICogZWFybHkgc3R1ZmYpOyBidXQgTGludXggaGFzIFBSX1NFVF9EVU1QQUJMRSwgc28gd2UgY2FuIGF2b2lkIGNvcmUKKyAgICogZHVtcHMgYW55d2F5LiAqLworICBwcmN0bCAoUFJfU0VUX0RVTVBBQkxFLCAwLCAwLCAwLCAwKTsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9SQUlTRQorICByYWlzZSAoU0lHU0VHVik7CisjZW5kaWYKKyAgcCA9IE5VTEw7CisgICpwID0gJ2EnOworICAKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90ZXN0L3Rlc3Qtc2VydmljZS5jIGIvdGVzdC90ZXN0LXNlcnZpY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTAwYWYzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC90ZXN0LXNlcnZpY2UuYwpAQCAtMCwwICsxLDUwNCBAQAorI2luY2x1ZGUgPGNvbmZpZy5oPgorCisjaW5jbHVkZSAidGVzdC11dGlscy5oIgorI2lmZGVmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorCitzdGF0aWMgREJ1c0xvb3AgKmxvb3A7CitzdGF0aWMgZGJ1c19ib29sX3QgYWxyZWFkeV9xdWl0ID0gRkFMU0U7CitzdGF0aWMgZGJ1c19ib29sX3QgaGVsbG9fZnJvbV9zZWxmX3JlcGx5X3JlY2VpdmVkID0gRkFMU0U7CisKK3N0YXRpYyB2b2lkCitxdWl0ICh2b2lkKQoreworICBpZiAoIWFscmVhZHlfcXVpdCkKKyAgICB7CisgICAgICBfZGJ1c19sb29wX3F1aXQgKGxvb3ApOworICAgICAgYWxyZWFkeV9xdWl0ID0gVFJVRTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRpZSAoY29uc3QgY2hhciAqbWVzc2FnZSkgX0RCVVNfR05VQ19OT1JFVFVSTjsKKworc3RhdGljIHZvaWQKK2RpZSAoY29uc3QgY2hhciAqbWVzc2FnZSkKK3sKKyAgZnByaW50ZiAoc3RkZXJyLCAiKioqIHRlc3Qtc2VydmljZTogJXMiLCBtZXNzYWdlKTsKKyAgZXhpdCAoMSk7Cit9CisKK3N0YXRpYyB2b2lkCitjaGVja19oZWxsb19mcm9tX3NlbGZfcmVwbHkgKERCdXNQZW5kaW5nQ2FsbCAqcGNhbGwsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyX2RhdGEpCit7CisgIERCdXNNZXNzYWdlICpyZXBseTsKKyAgREJ1c01lc3NhZ2UgKmVjaG9fbWVzc2FnZSwgKmVjaG9fcmVwbHkgPSBOVUxMOworICBEQnVzRXJyb3IgZXJyb3I7CisgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uOworICAKKyAgaW50IHR5cGU7CisgIAorICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisgCisgIGNvbm5lY3Rpb24gPSBkYnVzX2J1c19nZXQgKERCVVNfQlVTX1NUQVJURVIsICZlcnJvcik7CisgIGlmIChjb25uZWN0aW9uID09IE5VTEwpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiKioqIEZhaWxlZCB0byBvcGVuIGNvbm5lY3Rpb24gdG8gYWN0aXZhdGluZyBtZXNzYWdlIGJ1czogJXNcbiIsCisgICAgICAgICAgICAgICBlcnJvci5tZXNzYWdlKTsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgIGRpZSgibm8gbWVtb3J5Iik7CisgICAgfQorCisgIAorICBlY2hvX21lc3NhZ2UgPSAoREJ1c01lc3NhZ2UgKil1c2VyX2RhdGE7CisgICAgCisgIHJlcGx5ID0gZGJ1c19wZW5kaW5nX2NhbGxfc3RlYWxfcmVwbHkgKHBjYWxsKTsKKyAgICAKKyAgdHlwZSA9IGRidXNfbWVzc2FnZV9nZXRfdHlwZSAocmVwbHkpOworICAgIAorICBpZiAodHlwZSA9PSBEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfUkVUVVJOKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKnM7CisgICAgICBwcmludGYgKCJSZXBseSBmcm9tIEhlbGxvRnJvbVNlbGYgcmVjZWl2ZWRcbiIpOworICAgICAKKyAgICAgIGlmICghZGJ1c19tZXNzYWdlX2dldF9hcmdzIChlY2hvX21lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICAgICAgeworICAgICAgICAgICAgZWNob19yZXBseSA9IGRidXNfbWVzc2FnZV9uZXdfZXJyb3IgKGVjaG9fbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IubmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IubWVzc2FnZSk7CisKKyAgICAgICAgICAgIGlmIChlY2hvX3JlcGx5ID09IE5VTEwpCisgICAgICAgICAgICAgIGRpZSAoIk5vIG1lbW9yeVxuIik7CisKKyAgICAgICAgfSAKKyAgICAgIGVsc2UKKyAgICAgICAgeyAgCisgICAgICAgICAgZWNob19yZXBseSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX3JldHVybiAoZWNob19tZXNzYWdlKTsKKyAgICAgICAgICBpZiAoZWNob19yZXBseSA9PSBOVUxMKQorICAgICAgICAgICAgZGllICgiTm8gbWVtb3J5XG4iKTsKKyAgCisgICAgICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKGVjaG9fcmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICAgICAgICAgIGRpZSAoIk5vIG1lbW9yeSIpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoY29ubmVjdGlvbiwgZWNob19yZXBseSwgTlVMTCkpCisgICAgICAgIGRpZSAoIk5vIG1lbW9yeVxuIik7CisgICAgICAKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAoZWNob19yZXBseSk7CisgICAgfQorICBlbHNlIGlmIChkYnVzX3NldF9lcnJvcl9mcm9tX21lc3NhZ2UgKCZlcnJvciwgcmVwbHkpKQorICAgIHsKKyAgICAgIHByaW50ZiAoIkVycm9yIHR5cGUgaW4gcmVwbHk6ICVzXG4iLCBlcnJvci5tZXNzYWdlKTsKKworICAgICAgaWYgKHN0cmNtcCAoZXJyb3IubmFtZSwgREJVU19FUlJPUl9OT19NRU1PUlkpICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGVjaG9fcmVwbHkgPSBkYnVzX21lc3NhZ2VfbmV3X2Vycm9yIChlY2hvX3JlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvci5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvci5tZXNzYWdlKTsKKworICAgICAgICAgICAgaWYgKGVjaG9fcmVwbHkgPT0gTlVMTCkKKyAgICAgICAgICAgICAgZGllICgiTm8gbWVtb3J5XG4iKTsKKworICAgICAgICAgICAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoY29ubmVjdGlvbiwgZWNob19yZXBseSwgTlVMTCkpCisgICAgICAgICAgICAgIGRpZSAoIk5vIG1lbW9yeVxuIik7CisKKyAgICAgICAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAoZWNob19yZXBseSk7CisgICAgICAgIH0KKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICB9CisgIGVsc2UKKyAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiVW5leHBlY3RlZCBtZXNzYWdlIHJlY2VpdmVkIik7CisKKyAgaGVsbG9fZnJvbV9zZWxmX3JlcGx5X3JlY2VpdmVkID0gVFJVRTsKKyAgCisgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworICBkYnVzX21lc3NhZ2VfdW5yZWYgKGVjaG9fbWVzc2FnZSk7CisgIGRidXNfcGVuZGluZ19jYWxsX3VucmVmIChwY2FsbCk7CisgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoY29ubmVjdGlvbik7Cit9CisKK3N0YXRpYyBEQnVzSGFuZGxlclJlc3VsdAoraGFuZGxlX3J1bl9oZWxsb19mcm9tX3NlbGYgKERCdXNDb25uZWN0aW9uICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICAgICptZXNzYWdlKQoreworICBEQnVzRXJyb3IgZXJyb3I7CisgIERCdXNNZXNzYWdlICpyZXBseSwgKnNlbGZfbWVzc2FnZTsKKyAgREJ1c1BlbmRpbmdDYWxsICpwY2FsbDsKKyAgY2hhciAqczsKKworICBfZGJ1c192ZXJib3NlICgic2VuZGluZyByZXBseSB0byBFY2hvIG1ldGhvZFxuIik7CisgIAorICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisgIAorICBpZiAoIWRidXNfbWVzc2FnZV9nZXRfYXJncyAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKQorICAgIHsKKyAgICAgIHJlcGx5ID0gZGJ1c19tZXNzYWdlX25ld19lcnJvciAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IubmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IubWVzc2FnZSk7CisKKyAgICAgIGlmIChyZXBseSA9PSBOVUxMKQorICAgICAgICBkaWUgKCJObyBtZW1vcnlcbiIpOworCisgICAgICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZW5kIChjb25uZWN0aW9uLCByZXBseSwgTlVMTCkpCisgICAgICAgIGRpZSAoIk5vIG1lbW9yeVxuIik7CisKKyAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworCisgICAgICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9OT1RfWUVUX0hBTkRMRUQ7CisgICAgfQorICAgIHByaW50ZiAoIlNlbmRpbmcgSGVsbG9Gcm9tU2VsZlxuIik7CisKKyBfZGJ1c192ZXJib3NlICgiKioqIFNlbmRpbmcgbWVzc2FnZSB0byBzZWxmXG4iKTsKKyBzZWxmX21lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsICgib3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlRWNob1NlcnZpY2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9vcmcvZnJlZWRlc2t0b3AvVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWxsb0Zyb21TZWxmIik7CisgIAorICBpZiAoc2VsZl9tZXNzYWdlID09IE5VTEwpCisgICAgZGllICgiTm8gbWVtb3J5Iik7CisgIAorICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHkgKGNvbm5lY3Rpb24sIHNlbGZfbWVzc2FnZSwgJnBjYWxsLCAtMSkpCisgICAgZGllKCJObyBtZW1vcnkiKTsKKyAgCisgIGRidXNfbWVzc2FnZV9yZWYgKG1lc3NhZ2UpOworICBpZiAoIWRidXNfcGVuZGluZ19jYWxsX3NldF9ub3RpZnkgKHBjYWxsLCBjaGVja19oZWxsb19mcm9tX3NlbGZfcmVwbHksICh2b2lkICopbWVzc2FnZSwgTlVMTCkpCisgICAgZGllKCJObyBtZW1vcnkiKTsKKyAgICAKKyAgcHJpbnRmICgiU2VudCBIZWxsb0Zyb21TZWxmXG4iKTsKKyAgcmV0dXJuIERCVVNfSEFORExFUl9SRVNVTFRfSEFORExFRDsKK30KKworc3RhdGljIERCdXNIYW5kbGVyUmVzdWx0CitoYW5kbGVfZWNobyAoREJ1c0Nvbm5lY3Rpb24gICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICAgICAqbWVzc2FnZSkKK3sKKyAgREJ1c0Vycm9yIGVycm9yOworICBEQnVzTWVzc2FnZSAqcmVwbHk7CisgIGNoYXIgKnM7CisKKyAgX2RidXNfdmVyYm9zZSAoInNlbmRpbmcgcmVwbHkgdG8gRWNobyBtZXRob2RcbiIpOworICAKKyAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworICAKKyAgaWYgKCFkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICB7CisgICAgICByZXBseSA9IGRidXNfbWVzc2FnZV9uZXdfZXJyb3IgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLm1lc3NhZ2UpOworCisgICAgICBpZiAocmVwbHkgPT0gTlVMTCkKKyAgICAgICAgZGllICgiTm8gbWVtb3J5XG4iKTsKKworICAgICAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoY29ubmVjdGlvbiwgcmVwbHksIE5VTEwpKQorICAgICAgICBkaWUgKCJObyBtZW1vcnlcbiIpOworCisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKworICAgICAgcmV0dXJuIERCVVNfSEFORExFUl9SRVNVTFRfTk9UX1lFVF9IQU5ETEVEOworICAgIH0KKworICByZXBseSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX3JldHVybiAobWVzc2FnZSk7CisgIGlmIChyZXBseSA9PSBOVUxMKQorICAgIGRpZSAoIk5vIG1lbW9yeVxuIik7CisgIAorICBpZiAoIWRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAocmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICBkaWUgKCJObyBtZW1vcnkiKTsKKyAgCisgIGlmICghZGJ1c19jb25uZWN0aW9uX3NlbmQgKGNvbm5lY3Rpb24sIHJlcGx5LCBOVUxMKSkKKyAgICBkaWUgKCJObyBtZW1vcnlcbiIpOworCisgIGZwcmludGYgKHN0ZGVyciwgIkVjaG8gc2VydmljZSBlY2hvZWQgc3RyaW5nOiBcIiVzXCJcbiIsIHMpOworICAKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgICAgCisgIHJldHVybiBEQlVTX0hBTkRMRVJfUkVTVUxUX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBEQnVzSGFuZGxlclJlc3VsdAoraGFuZGxlX2RlbGF5X2VjaG8gKERCdXNDb25uZWN0aW9uICAgICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgICAgKm1lc3NhZ2UpCit7CisgIERCdXNFcnJvciBlcnJvcjsKKyAgREJ1c01lc3NhZ2UgKnJlcGx5OworICBjaGFyICpzOworCisgIF9kYnVzX3ZlcmJvc2UgKCJzbGVlcGluZyBmb3IgYSBzaG9ydCB0aW1lXG4iKTsKKworICBfZGJ1c19zbGVlcF9taWxsaXNlY29uZHMgKDUwKTsKKworICBfZGJ1c192ZXJib3NlICgic2VuZGluZyByZXBseSB0byBEZWxheUVjaG8gbWV0aG9kXG4iKTsKKyAgCisgIGRidXNfZXJyb3JfaW5pdCAoJmVycm9yKTsKKyAgCisgIGlmICghZGJ1c19tZXNzYWdlX2dldF9hcmdzIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgeworICAgICAgcmVwbHkgPSBkYnVzX21lc3NhZ2VfbmV3X2Vycm9yIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvci5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvci5tZXNzYWdlKTsKKworICAgICAgaWYgKHJlcGx5ID09IE5VTEwpCisgICAgICAgIGRpZSAoIk5vIG1lbW9yeVxuIik7CisKKyAgICAgIGlmICghZGJ1c19jb25uZWN0aW9uX3NlbmQgKGNvbm5lY3Rpb24sIHJlcGx5LCBOVUxMKSkKKyAgICAgICAgZGllICgiTm8gbWVtb3J5XG4iKTsKKworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisKKyAgICAgIHJldHVybiBEQlVTX0hBTkRMRVJfUkVTVUxUX05PVF9ZRVRfSEFORExFRDsKKyAgICB9CisKKyAgcmVwbHkgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9yZXR1cm4gKG1lc3NhZ2UpOworICBpZiAocmVwbHkgPT0gTlVMTCkKKyAgICBkaWUgKCJObyBtZW1vcnlcbiIpOworICAKKyAgaWYgKCFkYnVzX21lc3NhZ2VfYXBwZW5kX2FyZ3MgKHJlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpCisgICAgZGllICgiTm8gbWVtb3J5Iik7CisgIAorICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZW5kIChjb25uZWN0aW9uLCByZXBseSwgTlVMTCkpCisgICAgZGllICgiTm8gbWVtb3J5XG4iKTsKKworICBmcHJpbnRmIChzdGRlcnIsICJEZWxheUVjaG8gc2VydmljZSBlY2hvZWQgc3RyaW5nOiBcIiVzXCJcbiIsIHMpOworICAKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgICAgCisgIHJldHVybiBEQlVTX0hBTkRMRVJfUkVTVUxUX0hBTkRMRUQ7Cit9CisKKworc3RhdGljIHZvaWQKK3BhdGhfdW5yZWdpc3RlcmVkX2Z1bmMgKERCdXNDb25uZWN0aW9uICAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAqdXNlcl9kYXRhKQoreworICAvKiBjb25uZWN0aW9uIHdhcyBmaW5hbGl6ZWQgKi8KK30KKworc3RhdGljIERCdXNIYW5kbGVyUmVzdWx0CitwYXRoX21lc3NhZ2VfZnVuYyAoREJ1c0Nvbm5lY3Rpb24gICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgKnVzZXJfZGF0YSkKK3sKKyAgaWYgKGRidXNfbWVzc2FnZV9pc19tZXRob2RfY2FsbCAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5UZXN0U3VpdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRWNobyIpKQorICAgIHJldHVybiBoYW5kbGVfZWNobyAoY29ubmVjdGlvbiwgbWVzc2FnZSk7CisgIGVsc2UgaWYgKGRidXNfbWVzc2FnZV9pc19tZXRob2RfY2FsbCAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLlRlc3RTdWl0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRlbGF5RWNobyIpKQorICAgIHJldHVybiBoYW5kbGVfZGVsYXlfZWNobyAoY29ubmVjdGlvbiwgbWVzc2FnZSk7CisgIGVsc2UgaWYgKGRidXNfbWVzc2FnZV9pc19tZXRob2RfY2FsbCAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLlRlc3RTdWl0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4aXQiKSkKKyAgICB7CisgICAgICBxdWl0ICgpOworICAgICAgcmV0dXJuIERCVVNfSEFORExFUl9SRVNVTFRfSEFORExFRDsKKyAgICB9CisgIGVsc2UgaWYgKGRidXNfbWVzc2FnZV9pc19tZXRob2RfY2FsbCAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLlRlc3RTdWl0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVtaXRGb28iKSkKKyAgICB7CisgICAgICAvKiBFbWl0IHRoZSBGb28gc2lnbmFsICovCisgICAgICBEQnVzTWVzc2FnZSAqc2lnbmFsOworICAgICAgZG91YmxlIHZfRE9VQkxFOworCisgICAgICBfZGJ1c192ZXJib3NlICgiZW1pdHRpbmcgc2lnbmFsIEZvb1xuIik7CisgICAgICAKKyAgICAgIHNpZ25hbCA9IGRidXNfbWVzc2FnZV9uZXdfc2lnbmFsICgiL29yZy9mcmVlZGVza3RvcC9UZXN0U3VpdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRm9vIik7CisgICAgICBpZiAoc2lnbmFsID09IE5VTEwpCisgICAgICAgIGRpZSAoIk5vIG1lbW9yeVxuIik7CisKKyAgICAgIHZfRE9VQkxFID0gNDIuNjsKKyAgICAgIGlmICghZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChzaWduYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0RPVUJMRSwgJnZfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICAgICAgZGllICgiTm8gbWVtb3J5Iik7CisgIAorICAgICAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoY29ubmVjdGlvbiwgc2lnbmFsLCBOVUxMKSkKKyAgICAgICAgZGllICgiTm8gbWVtb3J5XG4iKTsKKyAgICAgIAorICAgICAgcmV0dXJuIERCVVNfSEFORExFUl9SRVNVTFRfSEFORExFRDsKKyAgICB9CisgICAgCisgIGVsc2UgaWYgKGRidXNfbWVzc2FnZV9pc19tZXRob2RfY2FsbCAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5UZXN0U3VpdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUnVuSGVsbG9Gcm9tU2VsZiIpKQorICAgIHsKKyAgICAgIHJldHVybiBoYW5kbGVfcnVuX2hlbGxvX2Zyb21fc2VsZiAoY29ubmVjdGlvbiwgbWVzc2FnZSk7CisgICAgfQorICBlbHNlIGlmIChkYnVzX21lc3NhZ2VfaXNfbWV0aG9kX2NhbGwgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5mcmVlZGVza3RvcC5UZXN0U3VpdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWxsb0Zyb21TZWxmIikpCisgICAgeworICAgICAgICBEQnVzTWVzc2FnZSAqcmVwbHk7CisgICAgICAgIHByaW50ZiAoIlJlY2VpdmVkIHRoZSBIZWxsb0Zyb21TZWxmIG1lc3NhZ2VcbiIpOworICAgICAgICAKKyAgICAgICAgcmVwbHkgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9yZXR1cm4gKG1lc3NhZ2UpOworICAgICAgICBpZiAocmVwbHkgPT0gTlVMTCkKKyAgICAgICAgICBkaWUgKCJObyBtZW1vcnkiKTsKKyAgICAgICAgCisgICAgICAgIGlmICghZGJ1c19jb25uZWN0aW9uX3NlbmQgKGNvbm5lY3Rpb24sIHJlcGx5LCBOVUxMKSkKKyAgICAgICAgICBkaWUgKCJObyBtZW1vcnkiKTsKKworICAgICAgICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9IQU5ETEVEOworICAgIH0KKyAgZWxzZQorICAgIHJldHVybiBEQlVTX0hBTkRMRVJfUkVTVUxUX05PVF9ZRVRfSEFORExFRDsKK30KKworc3RhdGljIERCdXNPYmplY3RQYXRoVlRhYmxlCitlY2hvX3Z0YWJsZSA9IHsKKyAgcGF0aF91bnJlZ2lzdGVyZWRfZnVuYywKKyAgcGF0aF9tZXNzYWdlX2Z1bmMsCisgIE5VTEwsCit9OworCisKK3N0YXRpYyBjb25zdCBjaGFyKiBlY2hvX3BhdGggPSAiL29yZy9mcmVlZGVza3RvcC9UZXN0U3VpdGUiIDsKKworc3RhdGljIERCdXNIYW5kbGVyUmVzdWx0CitmaWx0ZXJfZnVuYyAoREJ1c0Nvbm5lY3Rpb24gICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICAgICAqbWVzc2FnZSwKKyAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgKnVzZXJfZGF0YSkKK3sKKyAgaWYgKGRidXNfbWVzc2FnZV9pc19zaWduYWwgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0lOVEVSRkFDRV9MT0NBTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEaXNjb25uZWN0ZWQiKSkKKyAgICB7CisgICAgICBxdWl0ICgpOworICAgICAgcmV0dXJuIERCVVNfSEFORExFUl9SRVNVTFRfSEFORExFRDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9OT1RfWUVUX0hBTkRMRUQ7CisgICAgfQorfQorCitpbnQKK21haW4gKGludCAgICBhcmdjLAorICAgICAgY2hhciAqKmFyZ3YpCit7CisgIERCdXNFcnJvciBlcnJvcjsKKyAgaW50IHJlc3VsdDsKKyAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisgIGNvbnN0IGNoYXIgKm5hbWU7CisjaWZuZGVmIERCVVNfV0lOCisgIGRidXNfYm9vbF90IGRvX2ZvcmsgPSBGQUxTRTsKKyNlbmRpZgorICBpZiAoYXJnYyAhPSAzKQorICAgIHsKKyAgICAgIG5hbWUgPSAib3JnLmZyZWVkZXNrdG9wLkRCdXMuVGVzdFN1aXRlRWNob1NlcnZpY2UiOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIG5hbWUgPSBhcmd2WzFdOworI2lmbmRlZiBEQlVTX1dJTgorICAgICAgZG9fZm9yayA9IHN0cmNtcCAoYXJndlsyXSwgImZvcmsiKSA9PSAwOworI2VuZGlmCisgICAgfQorCisgIC8qIFRoZSBiYXJlIG1pbmltdW0gZm9yIHNpbXVsYXRpbmcgYSBwcm9ncmFtICJkYWVtb25pemluZyI7IHRoZSBpbnRlbnQKKyAgICogaXMgdG8gdGVzdCBzZXJ2aWNlcyB3aGljaCBtb3ZlIGZyb20gYmVpbmcgbGVnYWN5IGluaXQgc2NyaXB0cyB0bworICAgKiBhY3RpdmF0ZWQgc2VydmljZXMuCisgICAqIGh0dHBzOi8vYnVnemlsbGEucmVkaGF0LmNvbS9zaG93X2J1Zy5jZ2k/aWQ9NTQ1MjY3CisgICAqLworI2lmbmRlZiBEQlVTX1dJTgorICAgaWYgKGRvX2ZvcmspCisgICAgeworICAgICAgcGlkX3QgcGlkID0gZm9yayAoKTsKKyAgICAgIGlmIChwaWQgIT0gMCkKKyAgICAgICAgZXhpdCAoMCk7CisgICAgICBzbGVlcCAoMSk7CisgICAgfQorI2VuZGlmCisKKyAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworICBjb25uZWN0aW9uID0gZGJ1c19idXNfZ2V0IChEQlVTX0JVU19TVEFSVEVSLCAmZXJyb3IpOworICBpZiAoY29ubmVjdGlvbiA9PSBOVUxMKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIioqKiBGYWlsZWQgdG8gb3BlbiBjb25uZWN0aW9uIHRvIGFjdGl2YXRpbmcgbWVzc2FnZSBidXM6ICVzXG4iLAorICAgICAgICAgICAgICAgZXJyb3IubWVzc2FnZSk7CisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgbG9vcCA9IF9kYnVzX2xvb3BfbmV3ICgpOworICBpZiAobG9vcCA9PSBOVUxMKQorICAgIGRpZSAoIk5vIG1lbW9yeVxuIik7CisgIAorICBpZiAoIXRlc3RfY29ubmVjdGlvbl9zZXR1cCAobG9vcCwgY29ubmVjdGlvbikpCisgICAgZGllICgiTm8gbWVtb3J5XG4iKTsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9hZGRfZmlsdGVyIChjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfZnVuYywgTlVMTCwgTlVMTCkpCisgICAgZGllICgiTm8gbWVtb3J5Iik7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fcmVnaXN0ZXJfb2JqZWN0X3BhdGggKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvX3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZWNob192dGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopIDB4ZGVhZGJlZWYpKQorICAgIGRpZSAoIk5vIG1lbW9yeSIpOworCisgIHsKKyAgICB2b2lkICpkOworICAgIGlmICghZGJ1c19jb25uZWN0aW9uX2dldF9vYmplY3RfcGF0aF9kYXRhIChjb25uZWN0aW9uLCBlY2hvX3BhdGgsICZkKSkKKyAgICAgIGRpZSAoIk5vIG1lbW9yeSIpOworICAgIGlmIChkICE9ICh2b2lkKikgMHhkZWFkYmVlZikKKyAgICAgIGRpZSAoImRidXNfY29ubmVjdGlvbl9nZXRfb2JqZWN0X3BhdGhfZGF0YSgpIGRvZXNuJ3Qgc2VlbSB0byB3b3JrIHJpZ2h0XG4iKTsKKyAgfQorCisgIHJlc3VsdCA9IGRidXNfYnVzX3JlcXVlc3RfbmFtZSAoY29ubmVjdGlvbiwgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAmZXJyb3IpOworICBpZiAoZGJ1c19lcnJvcl9pc19zZXQgKCZlcnJvcikpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3IgJXNcbiIsIGVycm9yLm1lc3NhZ2UpOworICAgICAgX2RidXNfdmVyYm9zZSAoIioqKiBGYWlsZWQgdG8gYWNxdWlyZSBzZXJ2aWNlOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgIGVycm9yLm1lc3NhZ2UpOworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIGlmIChyZXN1bHQgIT0gREJVU19SRVFVRVNUX05BTUVfUkVQTFlfUFJJTUFSWV9PV05FUikKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJVbmFibGUgdG8gYWNxdWlyZSBzZXJ2aWNlOiBjb2RlICVkXG4iLCByZXN1bHQpOworICAgICAgX2RidXNfdmVyYm9zZSAoIioqKiBGYWlsZWQgdG8gYWNxdWlyZSBzZXJ2aWNlOiAlZFxuIiwgcmVzdWx0KTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICBfZGJ1c192ZXJib3NlICgiKioqIFRlc3Qgc2VydmljZSBlbnRlcmluZyBtYWluIGxvb3BcbiIpOworICBfZGJ1c19sb29wX3J1biAobG9vcCk7CisgIAorICB0ZXN0X2Nvbm5lY3Rpb25fc2h1dGRvd24gKGxvb3AsIGNvbm5lY3Rpb24pOworCisgIGRidXNfY29ubmVjdGlvbl9yZW1vdmVfZmlsdGVyIChjb25uZWN0aW9uLCBmaWx0ZXJfZnVuYywgTlVMTCk7CisgIAorICBkYnVzX2Nvbm5lY3Rpb25fdW5yZWYgKGNvbm5lY3Rpb24pOworCisgIF9kYnVzX2xvb3BfdW5yZWYgKGxvb3ApOworICBsb29wID0gTlVMTDsKKyAgCisgIGRidXNfc2h1dGRvd24gKCk7CisKKyAgX2RidXNfdmVyYm9zZSAoIioqKiBUZXN0IHNlcnZpY2UgZXhpdGluZ1xuIik7CisgIAorICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvdGVzdC1zaGVsbC1zZXJ2aWNlLmMgYi90ZXN0L3Rlc3Qtc2hlbGwtc2VydmljZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlYWNjYzEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3Rlc3Qtc2hlbGwtc2VydmljZS5jCkBAIC0wLDAgKzEsMjA1IEBACisjaW5jbHVkZSA8Y29uZmlnLmg+CisKKyNpbmNsdWRlICJ0ZXN0LXV0aWxzLmgiCisKK3N0YXRpYyBEQnVzTG9vcCAqbG9vcDsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBhbHJlYWR5X3F1aXQgPSBGQUxTRTsKK3N0YXRpYyBjb25zdCBjaGFyKiBlY2hvX3BhdGggPSAiL29yZy9mcmVlZGVza3RvcC9UZXN0U3VpdGUiOworCit0eXBlZGVmIHN0cnVjdAoreworICBpbnQgYXJnYzsKKyAgY2hhciAqKmFyZ3Y7Cit9IEVjaG9EYXRhOworCitzdGF0aWMgdm9pZAorcXVpdCAodm9pZCkKK3sKKyAgaWYgKCFhbHJlYWR5X3F1aXQpCisgICAgeworICAgICAgX2RidXNfbG9vcF9xdWl0IChsb29wKTsKKyAgICAgIGFscmVhZHlfcXVpdCA9IFRSVUU7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBkaWUgKGNvbnN0IGNoYXIgKm1lc3NhZ2UpIF9EQlVTX0dOVUNfTk9SRVRVUk47CisKK3N0YXRpYyB2b2lkCitkaWUgKGNvbnN0IGNoYXIgKm1lc3NhZ2UpCit7CisgIGZwcmludGYgKHN0ZGVyciwgIioqKiB0ZXN0LXNlcnZpY2U6ICVzIiwgbWVzc2FnZSk7CisgIGV4aXQgKDEpOworfQorCitzdGF0aWMgREJ1c0hhbmRsZXJSZXN1bHQKK2hhbmRsZV9lY2hvIChEQnVzQ29ubmVjdGlvbiAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICAgICptZXNzYWdlKQoreworICBEQnVzRXJyb3IgZXJyb3I7CisgIERCdXNNZXNzYWdlICpyZXBseTsKKyAgREJ1c01lc3NhZ2VJdGVyIGl0ZXI7CisgIGludCBpOworICBFY2hvRGF0YSAqZDsKKworICBfZGJ1c192ZXJib3NlICgic2VuZGluZyByZXBseSB0byBFY2hvIG1ldGhvZFxuIik7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fZ2V0X29iamVjdF9wYXRoX2RhdGEgKGNvbm5lY3Rpb24sIGVjaG9fcGF0aCwgKHZvaWQgKiopJmQpKQorICAgICAgZGllICgiTm8gbWVtb3J5Iik7CisKKworICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisKKyAgcmVwbHkgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9yZXR1cm4gKG1lc3NhZ2UpOworICBpZiAocmVwbHkgPT0gTlVMTCkKKyAgICBkaWUgKCJObyBtZW1vcnlcbiIpOworICAKKyAgZGJ1c19tZXNzYWdlX2l0ZXJfaW5pdF9hcHBlbmQgKHJlcGx5LCAmaXRlcik7CisgIGZvciAoaSA9IDA7IGkgPCBkLT5hcmdjOyArK2kpCisgICAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfYmFzaWMgKCZpdGVyLCBEQlVTX1RZUEVfU1RSSU5HLCAmKGQtPmFyZ3ZbaV0pKSkKKyAgICAgIGRpZSAoIk5vIG1lbW9yeVxuIik7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoY29ubmVjdGlvbiwgcmVwbHksIE5VTEwpKQorICAgIGRpZSAoIk5vIG1lbW9yeVxuIik7CisKKyAgZnByaW50ZiAoc3RkZXJyLCAiU2hlbGwgZWNobyBzZXJ2aWNlIGVjaG9lZCB0aGUgY29tbWFuZCBsaW5lXG4iKTsKKyAgCisgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworICAgIAorICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9IQU5ETEVEOworfQorCitzdGF0aWMgdm9pZAorcGF0aF91bnJlZ2lzdGVyZWRfZnVuYyAoREJ1c0Nvbm5lY3Rpb24gICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICp1c2VyX2RhdGEpCit7CisgIC8qIGNvbm5lY3Rpb24gd2FzIGZpbmFsaXplZCAqLworfQorCitzdGF0aWMgREJ1c0hhbmRsZXJSZXN1bHQKK3BhdGhfbWVzc2FnZV9mdW5jIChEQnVzQ29ubmVjdGlvbiAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAqdXNlcl9kYXRhKQoreworICBpZiAoZGJ1c19tZXNzYWdlX2lzX21ldGhvZF9jYWxsIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmZyZWVkZXNrdG9wLlRlc3RTdWl0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFY2hvIikpCisgICAgcmV0dXJuIGhhbmRsZV9lY2hvIChjb25uZWN0aW9uLCBtZXNzYWdlKTsKKyAgZWxzZSBpZiAoZGJ1c19tZXNzYWdlX2lzX21ldGhvZF9jYWxsIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZnJlZWRlc2t0b3AuVGVzdFN1aXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhpdCIpKQorICAgIHsKKyAgICAgIHF1aXQgKCk7CisgICAgICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9IQU5ETEVEOworICAgIH0KKyAgZWxzZQorICAgIHJldHVybiBEQlVTX0hBTkRMRVJfUkVTVUxUX05PVF9ZRVRfSEFORExFRDsKK30KKworc3RhdGljIERCdXNPYmplY3RQYXRoVlRhYmxlCitlY2hvX3Z0YWJsZSA9IHsKKyAgcGF0aF91bnJlZ2lzdGVyZWRfZnVuYywKKyAgcGF0aF9tZXNzYWdlX2Z1bmMsCisgIE5VTEwsCit9OworCitzdGF0aWMgREJ1c0hhbmRsZXJSZXN1bHQKK2ZpbHRlcl9mdW5jIChEQnVzQ29ubmVjdGlvbiAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICAgICptZXNzYWdlLAorICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAqdXNlcl9kYXRhKQoreworICBpZiAoZGJ1c19tZXNzYWdlX2lzX3NpZ25hbCAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSU5URVJGQUNFX0xPQ0FMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRpc2Nvbm5lY3RlZCIpKQorICAgIHsKKyAgICAgIHF1aXQgKCk7CisgICAgICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9IQU5ETEVEOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHJldHVybiBEQlVTX0hBTkRMRVJfUkVTVUxUX05PVF9ZRVRfSEFORExFRDsKKyAgICB9Cit9CisKK2ludAorbWFpbiAoaW50ICAgIGFyZ2MsCisgICAgICBjaGFyICoqYXJndikKK3sKKyAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisgIERCdXNFcnJvciBlcnJvcjsKKyAgRWNob0RhdGEgZWNob19kYXRhOworICBpbnQgcmVzdWx0OworICAKKyAgZWNob19kYXRhLmFyZ2MgPSBhcmdjOworICBlY2hvX2RhdGEuYXJndiA9IGFyZ3Y7CisgIAorICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisgIGNvbm5lY3Rpb24gPSBkYnVzX2J1c19nZXQgKERCVVNfQlVTX1NUQVJURVIsICZlcnJvcik7CisgIGlmIChjb25uZWN0aW9uID09IE5VTEwpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiKioqIEZhaWxlZCB0byBvcGVuIGNvbm5lY3Rpb24gdG8gYWN0aXZhdGluZyBtZXNzYWdlIGJ1czogJXNcbiIsCisgICAgICAgICAgICAgICBlcnJvci5tZXNzYWdlKTsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICBsb29wID0gX2RidXNfbG9vcF9uZXcgKCk7CisgIGlmIChsb29wID09IE5VTEwpCisgICAgZGllICgiTm8gbWVtb3J5XG4iKTsKKyAgCisgIGlmICghdGVzdF9jb25uZWN0aW9uX3NldHVwIChsb29wLCBjb25uZWN0aW9uKSkKKyAgICBkaWUgKCJObyBtZW1vcnlcbiIpOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX2FkZF9maWx0ZXIgKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcl9mdW5jLCBOVUxMLCBOVUxMKSkKKyAgICBkaWUgKCJObyBtZW1vcnkiKTsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9yZWdpc3Rlcl9vYmplY3RfcGF0aCAoY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG9fcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlY2hvX3Z0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKikgJmVjaG9fZGF0YSkpCisgICAgZGllICgiTm8gbWVtb3J5Iik7CisKKyAgeworICAgIHZvaWQgKmQ7CisgICAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fZ2V0X29iamVjdF9wYXRoX2RhdGEgKGNvbm5lY3Rpb24sIGVjaG9fcGF0aCwgJmQpKQorICAgICAgZGllICgiTm8gbWVtb3J5Iik7CisgICAgaWYgKGQgIT0gKHZvaWQqKSAmZWNob19kYXRhKQorICAgICAgZGllICgiZGJ1c19jb25uZWN0aW9uX2dldF9vYmplY3RfcGF0aF9kYXRhKCkgZG9lc24ndCBzZWVtIHRvIHdvcmsgcmlnaHRcbiIpOworICB9CisgIAorICByZXN1bHQgPSBkYnVzX2J1c19yZXF1ZXN0X25hbWUgKGNvbm5lY3Rpb24sICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5UZXN0U3VpdGVTaGVsbEVjaG9TZXJ2aWNlU3VjY2VzcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgJmVycm9yKTsKKyAgaWYgKGRidXNfZXJyb3JfaXNfc2V0ICgmZXJyb3IpKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIkVycm9yICVzXG4iLCBlcnJvci5tZXNzYWdlKTsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCIqKiogRmFpbGVkIHRvIGFjcXVpcmUgc2VydmljZTogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICBlcnJvci5tZXNzYWdlKTsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICBpZiAocmVzdWx0ICE9IERCVVNfUkVRVUVTVF9OQU1FX1JFUExZX1BSSU1BUllfT1dORVIpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiVW5hYmxlIHRvIGFjcXVpcmUgc2VydmljZTogY29kZSAlZFxuIiwgcmVzdWx0KTsKKyAgICAgIF9kYnVzX3ZlcmJvc2UgKCIqKiogRmFpbGVkIHRvIGFjcXVpcmUgc2VydmljZTogJWRcbiIsIHJlc3VsdCk7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgX2RidXNfdmVyYm9zZSAoIioqKiBUZXN0IHNlcnZpY2UgZW50ZXJpbmcgbWFpbiBsb29wXG4iKTsKKyAgX2RidXNfbG9vcF9ydW4gKGxvb3ApOworCisgIHRlc3RfY29ubmVjdGlvbl9zaHV0ZG93biAobG9vcCwgY29ubmVjdGlvbik7CisKKyAgZGJ1c19jb25uZWN0aW9uX3JlbW92ZV9maWx0ZXIgKGNvbm5lY3Rpb24sIGZpbHRlcl9mdW5jLCBOVUxMKTsKKyAgCisgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoY29ubmVjdGlvbik7CisKKyAgX2RidXNfbG9vcF91bnJlZiAobG9vcCk7CisgIGxvb3AgPSBOVUxMOworICAKKyAgZGJ1c19zaHV0ZG93biAoKTsKKworICBfZGJ1c192ZXJib3NlICgiKioqIFRlc3Qgc2VydmljZSBleGl0aW5nXG4iKTsKKyAgCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdC90ZXN0LXNsZWVwLWZvcmV2ZXIuYyBiL3Rlc3QvdGVzdC1zbGVlcC1mb3JldmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU0NzY5YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdGVzdC1zbGVlcC1mb3JldmVyLmMKQEAgLTAsMCArMSwyMiBAQAorLyogVGhpcyBpcyBhIHByb2Nlc3MgdGhhdCBqdXN0IHNsZWVwcyBpbmZpbml0ZWx5LiAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaWZkZWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisKKyNpZmRlZiBEQlVTX1dJTgorIyBpbmNsdWRlIDx3aW5kb3dzLmg+CisjIGRlZmluZSBzbGVlcCBTbGVlcAorI2VuZGlmCisKKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgIHdoaWxlICgxKQorICAgIHNsZWVwICgxMDAwMDAwMCk7CisKKyAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS90ZXN0L3Rlc3QtdXRpbHMtZ2xpYi5jIGIvdGVzdC90ZXN0LXV0aWxzLWdsaWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGEzNjg0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC90ZXN0LXV0aWxzLWdsaWIuYwpAQCAtMCwwICsxLDcwNCBAQAorLyogVXRpbGl0eSBmdW5jdGlvbnMgZm9yIHRlc3RzIHRoYXQgcmVseSBvbiBHTGliCisgKgorICogQ29weXJpZ2h0IMKpIDIwMTAtMjAxMSBOb2tpYSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IMKpIDIwMTMtMjAxNSBDb2xsYWJvcmEgTHRkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcworICogKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwKKyAqIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsCisgKiBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLAorICogYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKKyAqIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCisgKiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJ0ZXN0LXV0aWxzLWdsaWIuaCIKKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpZmRlZiBEQlVTX1dJTgorIyBpbmNsdWRlIDxpby5oPgorIyBpbmNsdWRlIDx3aW5kb3dzLmg+CisjZWxzZQorIyBpbmNsdWRlIDxuZXRkYi5oPgorIyBpbmNsdWRlIDxzaWduYWwuaD4KKyMgaW5jbHVkZSA8dW5pc3RkLmg+CisjIGluY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjIGluY2x1ZGUgPHB3ZC5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxnbGliLmg+CisjaW5jbHVkZSA8Z2xpYi9nc3RkaW8uaD4KKworI2luY2x1ZGUgPGRidXMvZGJ1cy5oPgorCisjaWZkZWYgR19PU19XSU4KKyMgZGVmaW5lIGlzYXR0eSh4KSBfaXNhdHR5KHgpCisjZW5kaWYKKwordm9pZAorX3Rlc3RfYXNzZXJ0X25vX2Vycm9yIChjb25zdCBEQnVzRXJyb3IgKmUsCisgICAgY29uc3QgY2hhciAqZmlsZSwKKyAgICBpbnQgbGluZSkKK3sKKyAgaWYgKEdfVU5MSUtFTFkgKGRidXNfZXJyb3JfaXNfc2V0IChlKSkpCisgICAgZ19lcnJvciAoIiVzOiVkOiBleHBlY3RlZCBzdWNjZXNzIGJ1dCBnb3QgZXJyb3I6ICVzOiAlcyIsCisgICAgICAgIGZpbGUsIGxpbmUsIGUtPm5hbWUsIGUtPm1lc3NhZ2UpOworfQorCisjaWZkZWYgREJVU19VTklYCitzdGF0aWMgdm9pZAorY2hpbGRfc2V0dXAgKGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgY29uc3Qgc3RydWN0IHBhc3N3ZCAqcHdkID0gdXNlcl9kYXRhOworICB1aWRfdCB1aWQgPSBnZXRldWlkICgpOworCisgIGlmIChwd2QgPT0gTlVMTCB8fCAocHdkLT5wd191aWQgPT0gdWlkICYmIGdldHVpZCAoKSA9PSB1aWQpKQorICAgIHJldHVybjsKKworICBpZiAodWlkICE9IDApCisgICAgZ19lcnJvciAoIm5vdCBjdXJyZW50bHkgZXVpZCAwOiAlbHUiLCAodW5zaWduZWQgbG9uZykgdWlkKTsKKworICBpZiAoc2V0dWlkIChwd2QtPnB3X3VpZCkgIT0gMCkKKyAgICBnX2Vycm9yICgiY291bGQgbm90IHNldHVpZCAoJWx1KTogJXMiLAorICAgICAgICAodW5zaWduZWQgbG9uZykgcHdkLT5wd191aWQsIGdfc3RyZXJyb3IgKGVycm5vKSk7CisKKyAgdWlkID0gZ2V0dWlkICgpOworCisgIGlmICh1aWQgIT0gcHdkLT5wd191aWQpCisgICAgZ19lcnJvciAoImFmdGVyIHN1Y2Nlc3NmdWwgc2V0dWlkICglbHUpIG15IHVpZCBpcyAlbGQiLAorICAgICAgICAodW5zaWduZWQgbG9uZykgcHdkLT5wd191aWQsICh1bnNpZ25lZCBsb25nKSB1aWQpOworCisgIHVpZCA9IGdldGV1aWQgKCk7CisKKyAgaWYgKHVpZCAhPSBwd2QtPnB3X3VpZCkKKyAgICBnX2Vycm9yICgiYWZ0ZXIgc3VjY2Vzc2Z1bCBzZXR1aWQgKCVsdSkgbXkgZXVpZCBpcyAlbGQiLAorICAgICAgICAodW5zaWduZWQgbG9uZykgcHdkLT5wd191aWQsICh1bnNpZ25lZCBsb25nKSB1aWQpOworfQorI2VuZGlmCisKK3N0YXRpYyBnY2hhciAqCitzcGF3bl9kYnVzX2RhZW1vbiAoY29uc3QgZ2NoYXIgKmJpbmFyeSwKKyAgICBjb25zdCBnY2hhciAqY29uZmlndXJhdGlvbiwKKyAgICBjb25zdCBnY2hhciAqbGlzdGVuX2FkZHJlc3MsCisgICAgVGVzdFVzZXIgdXNlciwKKyAgICBjb25zdCBnY2hhciAqcnVudGltZV9kaXIsCisgICAgR1BpZCAqZGFlbW9uX3BpZCkKK3sKKyAgR0Vycm9yICplcnJvciA9IE5VTEw7CisgIEdTdHJpbmcgKmFkZHJlc3M7CisgIGdpbnQgYWRkcmVzc19mZDsKKyAgR1B0ckFycmF5ICphcmd2OworICBnY2hhciAqKmVudnA7CisjaWZkZWYgREJVU19VTklYCisgIGNvbnN0IHN0cnVjdCBwYXNzd2QgKnB3ZCA9IE5VTEw7CisjZW5kaWYKKworICBpZiAodXNlciAhPSBURVNUX1VTRVJfTUUpCisgICAgeworI2lmZGVmIERCVVNfVU5JWAorICAgICAgaWYgKGdldHVpZCAoKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgZ190ZXN0X3NraXAgKCJjYW5ub3QgdXNlIGFsdGVybmF0aXZlIHVpZCB3aGVuIG5vdCB1aWQgMCIpOworICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgIHN3aXRjaCAodXNlcikKKyAgICAgICAgeworICAgICAgICAgIGNhc2UgVEVTVF9VU0VSX1JPT1Q6CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgVEVTVF9VU0VSX01FU1NBR0VCVVM6CisgICAgICAgICAgICBwd2QgPSBnZXRwd25hbSAoREJVU19VU0VSKTsKKworICAgICAgICAgICAgaWYgKHB3ZCA9PSBOVUxMKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ2NoYXIgKm1lc3NhZ2UgPSBnX3N0cmR1cF9wcmludGYgKCJ1c2VyICclcycgZG9lcyBub3QgZXhpc3QiLAorICAgICAgICAgICAgICAgICAgICBEQlVTX1VTRVIpOworCisgICAgICAgICAgICAgICAgZ190ZXN0X3NraXAgKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgIGdfZnJlZSAobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIFRFU1RfVVNFUl9PVEhFUjoKKyAgICAgICAgICAgIHB3ZCA9IGdldHB3bmFtIChEQlVTX1RFU1RfVVNFUik7CisKKyAgICAgICAgICAgIGlmIChwd2QgPT0gTlVMTCkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdjaGFyICptZXNzYWdlID0gZ19zdHJkdXBfcHJpbnRmICgidXNlciAnJXMnIGRvZXMgbm90IGV4aXN0IiwKKyAgICAgICAgICAgICAgICAgICAgREJVU19URVNUX1VTRVIpOworCisgICAgICAgICAgICAgICAgZ190ZXN0X3NraXAgKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgIGdfZnJlZSAobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIFRFU1RfVVNFUl9NRToKKyAgICAgICAgICAgIC8qIGNhbm5vdCBnZXQgaGVyZSwgZmFsbCB0aHJvdWdoICovCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGdfYXNzZXJ0X25vdF9yZWFjaGVkICgpOworICAgICAgICB9CisjZWxzZQorICAgICAgZ190ZXN0X3NraXAgKCJjYW5ub3QgdXNlIGFsdGVybmF0aXZlIHVpZCBvbiBXaW5kb3dzIik7CisgICAgICByZXR1cm4gTlVMTDsKKyNlbmRpZgorICAgIH0KKworICBlbnZwID0gZ19nZXRfZW52aXJvbiAoKTsKKworICBpZiAocnVudGltZV9kaXIgIT0gTlVMTCkKKyAgICBlbnZwID0gZ19lbnZpcm9uX3NldGVudiAoZW52cCwgIlhER19SVU5USU1FX0RJUiIsIHJ1bnRpbWVfZGlyLCBUUlVFKTsKKworICBhcmd2ID0gZ19wdHJfYXJyYXlfbmV3X3dpdGhfZnJlZV9mdW5jIChnX2ZyZWUpOworICBnX3B0cl9hcnJheV9hZGQgKGFyZ3YsIGdfc3RyZHVwIChiaW5hcnkpKTsKKyAgZ19wdHJfYXJyYXlfYWRkIChhcmd2LCBnX3N0cmR1cCAoY29uZmlndXJhdGlvbikpOworICBnX3B0cl9hcnJheV9hZGQgKGFyZ3YsIGdfc3RyZHVwICgiLS1ub2ZvcmsiKSk7CisgIGdfcHRyX2FycmF5X2FkZCAoYXJndiwgZ19zdHJkdXAgKCItLXByaW50LWFkZHJlc3M9MSIpKTsgLyogc3Rkb3V0ICovCisKKyAgaWYgKGxpc3Rlbl9hZGRyZXNzICE9IE5VTEwpCisgICAgZ19wdHJfYXJyYXlfYWRkIChhcmd2LCBnX3N0cmR1cCAobGlzdGVuX2FkZHJlc3MpKTsKKworI2lmZGVmIERCVVNfVU5JWAorICBnX3B0cl9hcnJheV9hZGQgKGFyZ3YsIGdfc3RyZHVwICgiLS1zeXN0ZW1kLWFjdGl2YXRpb24iKSk7CisjZW5kaWYKKworICBnX3B0cl9hcnJheV9hZGQgKGFyZ3YsIE5VTEwpOworCisgIGdfc3Bhd25fYXN5bmNfd2l0aF9waXBlcyAoTlVMTCwgLyogd29ya2luZyBkaXJlY3RvcnkgKi8KKyAgICAgIChnY2hhciAqKikgYXJndi0+cGRhdGEsCisgICAgICBlbnZwLAorICAgICAgR19TUEFXTl9ET19OT1RfUkVBUF9DSElMRCB8IEdfU1BBV05fU0VBUkNIX1BBVEgsCisjaWZkZWYgREJVU19VTklYCisgICAgICBjaGlsZF9zZXR1cCwgKGdwb2ludGVyKSBwd2QsCisjZWxzZQorICAgICAgTlVMTCwgTlVMTCwKKyNlbmRpZgorICAgICAgZGFlbW9uX3BpZCwKKyAgICAgIE5VTEwsIC8qIGNoaWxkJ3Mgc3RkaW4gPSAvZGV2L251bGwgKi8KKyAgICAgICZhZGRyZXNzX2ZkLAorICAgICAgTlVMTCwgLyogY2hpbGQncyBzdGRlcnIgPSBvdXIgc3RkZXJyICovCisgICAgICAmZXJyb3IpOworICBnX2Fzc2VydF9ub19lcnJvciAoZXJyb3IpOworCisgIGdfcHRyX2FycmF5X2ZyZWUgKGFyZ3YsIFRSVUUpOworICBnX3N0cmZyZWV2IChlbnZwKTsKKworICBhZGRyZXNzID0gZ19zdHJpbmdfbmV3IChOVUxMKTsKKworICAvKiBwb2xsaW5nIHVudGlsIHRoZSBkYnVzLWRhZW1vbiB3cml0ZXMgb3V0IGl0cyBhZGRyZXNzIGlzIGEgYml0IHN0dXBpZCwKKyAgICogYnV0IGF0IGxlYXN0IGl0J3Mgc2ltcGxlLCB1bmxpa2UgZGJ1cy1sYXVuY2guLi4gaW4gcHJpbmNpcGxlIHdlIGNvdWxkCisgICAqIHVzZSBzZWxlY3QoKSBoZXJlLCBidXQgbGlmZSdzIHRvbyBzaG9ydCAqLworICB3aGlsZSAoMSkKKyAgICB7CisgICAgICBnc3NpemUgYnl0ZXM7CisgICAgICBnY2hhciBidWZbNDA5Nl07CisgICAgICBnY2hhciAqbmV3bGluZTsKKworICAgICAgYnl0ZXMgPSByZWFkIChhZGRyZXNzX2ZkLCBidWYsIHNpemVvZiAoYnVmKSk7CisKKyAgICAgIGlmIChieXRlcyA+IDApCisgICAgICAgIGdfc3RyaW5nX2FwcGVuZF9sZW4gKGFkZHJlc3MsIGJ1ZiwgYnl0ZXMpOworCisgICAgICBuZXdsaW5lID0gc3RyY2hyIChhZGRyZXNzLT5zdHIsICdcbicpOworCisgICAgICBpZiAobmV3bGluZSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgaWYgKChuZXdsaW5lID4gYWRkcmVzcy0+c3RyKSAmJiAoJ1xyJyA9PSBuZXdsaW5lWy0xXSkpCisgICAgICAgICAgICBuZXdsaW5lIC09IDE7CisgICAgICAgICAgZ19zdHJpbmdfdHJ1bmNhdGUgKGFkZHJlc3MsIG5ld2xpbmUgLSBhZGRyZXNzLT5zdHIpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgIGdfdXNsZWVwIChHX1VTRUNfUEVSX1NFQyAvIDEwKTsKKyAgICB9CisKKyAgZ19jbG9zZSAoYWRkcmVzc19mZCwgTlVMTCk7CisKKyAgcmV0dXJuIGdfc3RyaW5nX2ZyZWUgKGFkZHJlc3MsIEZBTFNFKTsKK30KKworZ2NoYXIgKgordGVzdF9nZXRfZGJ1c19kYWVtb24gKGNvbnN0IGdjaGFyICpjb25maWdfZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICBUZXN0VXNlciAgICAgdXNlciwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAqcnVudGltZV9kaXIsCisgICAgICAgICAgICAgICAgICAgICAgR1BpZCAgICAgICAgKmRhZW1vbl9waWQpCit7CisgIGdjaGFyICpkYnVzX2RhZW1vbjsKKyAgZ2NoYXIgKmFyZzsKKyAgY29uc3QgZ2NoYXIgKmxpc3Rlbl9hZGRyZXNzID0gTlVMTDsKKyAgZ2NoYXIgKmFkZHJlc3M7CisKKyAgLyogd2Ugb2Z0ZW4gaGF2ZSB0byBvdmVycmlkZSB0aGlzIGJlY2F1c2Ugb24gV2luZG93cywgdGhlIGRlZmF1bHQgbWF5IGJlCisgICAqIGF1dG9sYXVuY2g6LCB3aGljaCBpcyBnbG9iYWxseS1zY29wZWQgYW5kIGhlbmNlIHVuc3VpdGFibGUgZm9yCisgICAqIHJlZ3Jlc3Npb24gdGVzdHMgKi8KKyAgbGlzdGVuX2FkZHJlc3MgPSAiLS1hZGRyZXNzPSIgVEVTVF9MSVNURU47CisKKyAgaWYgKGNvbmZpZ19maWxlICE9IE5VTEwpCisgICAgeworCisgICAgICBpZiAoZ19nZXRlbnYgKCJEQlVTX1RFU1RfREFUQSIpID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBnX3Rlc3RfbWVzc2FnZSAoInNldCBEQlVTX1RFU1RfREFUQSB0byBhIGRpcmVjdG9yeSBjb250YWluaW5nICVzIiwKKyAgICAgICAgICAgICAgY29uZmlnX2ZpbGUpOworICAgICAgICAgIGdfdGVzdF9za2lwICgiREJVU19URVNUX0RBVEEgbm90IHNldCIpOworICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgIGFyZyA9IGdfc3RyZHVwX3ByaW50ZiAoCisgICAgICAgICAgIi0tY29uZmlnLWZpbGU9JXMvJXMiLAorICAgICAgICAgIGdfZ2V0ZW52ICgiREJVU19URVNUX0RBVEEiKSwgY29uZmlnX2ZpbGUpOworCisgICAgICAvKiBUaGUgY29uZmlndXJhdGlvbiBmaWxlIGlzIGV4cGVjdGVkIHRvIGdpdmUgYSBzdWl0YWJsZSBhZGRyZXNzLAorICAgICAgICogZG8gbm90IG92ZXJyaWRlIGl0ICovCisgICAgICBsaXN0ZW5fYWRkcmVzcyA9IE5VTEw7CisgICAgfQorICBlbHNlIGlmIChnX2dldGVudiAoIkRCVVNfVEVTVF9EQVRBRElSIikgIT0gTlVMTCkKKyAgICB7CisgICAgICBhcmcgPSBnX3N0cmR1cF9wcmludGYgKCItLWNvbmZpZy1maWxlPSVzL2RidXMtMS9zZXNzaW9uLmNvbmYiLAorICAgICAgICAgIGdfZ2V0ZW52ICgiREJVU19URVNUX0RBVEFESVIiKSk7CisgICAgfQorICBlbHNlIGlmIChnX2dldGVudiAoIkRCVVNfVEVTVF9EQVRBIikgIT0gTlVMTCkKKyAgICB7CisgICAgICBhcmcgPSBnX3N0cmR1cF9wcmludGYgKAorICAgICAgICAgICItLWNvbmZpZy1maWxlPSVzL3ZhbGlkLWNvbmZpZy1maWxlcy9zZXNzaW9uLmNvbmYiLAorICAgICAgICAgIGdfZ2V0ZW52ICgiREJVU19URVNUX0RBVEEiKSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgYXJnID0gZ19zdHJkdXAgKCItLXNlc3Npb24iKTsKKyAgICB9CisKKyAgZGJ1c19kYWVtb24gPSBnX3N0cmR1cCAoZ19nZXRlbnYgKCJEQlVTX1RFU1RfREFFTU9OIikpOworCisgIGlmIChkYnVzX2RhZW1vbiA9PSBOVUxMKQorICAgIGRidXNfZGFlbW9uID0gZ19zdHJkdXAgKCJkYnVzLWRhZW1vbiIpOworCisgIGlmIChnX2dldGVudiAoIkRCVVNfVEVTVF9EQUVNT05fQUREUkVTUyIpICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKGNvbmZpZ19maWxlICE9IE5VTEwgfHwgdXNlciAhPSBURVNUX1VTRVJfTUUpCisgICAgICAgIHsKKyAgICAgICAgICBnX3Rlc3Rfc2tpcCAoImNhbm5vdCB1c2UgREJVU19URVNUX0RBRU1PTl9BRERSRVNTIGZvciAiCisgICAgICAgICAgICAgICJ1bnVzYWxseS1jb25maWd1cmVkIGRidXMtZGFlbW9uIik7CisgICAgICAgICAgYWRkcmVzcyA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGFkZHJlc3MgPSBnX3N0cmR1cCAoZ19nZXRlbnYgKCJEQlVTX1RFU1RfREFFTU9OX0FERFJFU1MiKSk7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBhZGRyZXNzID0gc3Bhd25fZGJ1c19kYWVtb24gKGRidXNfZGFlbW9uLCBhcmcsCisgICAgICAgICAgbGlzdGVuX2FkZHJlc3MsIHVzZXIsIHJ1bnRpbWVfZGlyLCBkYWVtb25fcGlkKTsKKyAgICB9CisKKyAgZ19mcmVlIChkYnVzX2RhZW1vbik7CisgIGdfZnJlZSAoYXJnKTsKKyAgcmV0dXJuIGFkZHJlc3M7Cit9CisKK0RCdXNDb25uZWN0aW9uICoKK3Rlc3RfY29ubmVjdF90b19idXMgKFRlc3RNYWluQ29udGV4dCAqY3R4LAorICAgIGNvbnN0IGdjaGFyICphZGRyZXNzKQoreworICBEQnVzQ29ubmVjdGlvbiAqY29ubjsKKyAgREJ1c0Vycm9yIGVycm9yID0gREJVU19FUlJPUl9JTklUOworICBkYnVzX2Jvb2xfdCBvazsKKworICBjb25uID0gZGJ1c19jb25uZWN0aW9uX29wZW5fcHJpdmF0ZSAoYWRkcmVzcywgJmVycm9yKTsKKyAgdGVzdF9hc3NlcnRfbm9fZXJyb3IgKCZlcnJvcik7CisgIGdfYXNzZXJ0IChjb25uICE9IE5VTEwpOworCisgIG9rID0gZGJ1c19idXNfcmVnaXN0ZXIgKGNvbm4sICZlcnJvcik7CisgIHRlc3RfYXNzZXJ0X25vX2Vycm9yICgmZXJyb3IpOworICBnX2Fzc2VydCAob2spOworICBnX2Fzc2VydCAoZGJ1c19idXNfZ2V0X3VuaXF1ZV9uYW1lIChjb25uKSAhPSBOVUxMKTsKKworICBpZiAoY3R4ICE9IE5VTEwpCisgICAgdGVzdF9jb25uZWN0aW9uX3NldHVwIChjdHgsIGNvbm4pOworCisgIHJldHVybiBjb25uOworfQorCitEQnVzQ29ubmVjdGlvbiAqCit0ZXN0X2Nvbm5lY3RfdG9fYnVzX2FzX3VzZXIgKFRlc3RNYWluQ29udGV4dCAqY3R4LAorICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCisgICAgVGVzdFVzZXIgdXNlcikKK3sKKyAgLyogRm9yIG5vdyB3ZSBvbmx5IGRvIHRlc3RzIGxpa2UgdGhpcyBvbiBMaW51eCwgYmVjYXVzZSBJIGRvbid0IGtub3cgaG93CisgICAqIHNhZmUgdGhpcyB1c2Ugb2Ygc2V0cmVzdWlkKCkgaXMgb24gb3RoZXIgcGxhdGZvcm1zICovCisjaWYgZGVmaW5lZChIQVZFX0dFVFJFU1VJRCkgJiYgZGVmaW5lZChIQVZFX1NFVFJFU1VJRCkgJiYgZGVmaW5lZChfX2xpbnV4X18pCisgIHVpZF90IHJ1aWQsIGV1aWQsIHN1aWQ7CisgIGNvbnN0IHN0cnVjdCBwYXNzd2QgKnB3ZDsKKyAgREJ1c0Nvbm5lY3Rpb24gKmNvbm47CisgIGNvbnN0IGNoYXIgKnVzZXJuYW1lOworCisgIHN3aXRjaCAodXNlcikKKyAgICB7CisgICAgICBjYXNlIFRFU1RfVVNFUl9NRToKKyAgICAgICAgcmV0dXJuIHRlc3RfY29ubmVjdF90b19idXMgKGN0eCwgYWRkcmVzcyk7CisKKyAgICAgIGNhc2UgVEVTVF9VU0VSX1JPT1Q6CisgICAgICAgIHVzZXJuYW1lID0gInJvb3QiOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBURVNUX1VTRVJfTUVTU0FHRUJVUzoKKyAgICAgICAgdXNlcm5hbWUgPSBEQlVTX1VTRVI7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFRFU1RfVVNFUl9PVEhFUjoKKyAgICAgICAgdXNlcm5hbWUgPSBEQlVTX1RFU1RfVVNFUjsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGdfcmV0dXJuX3ZhbF9pZl9yZWFjaGVkIChOVUxMKTsKKyAgICB9CisKKyAgaWYgKGdldHJlc3VpZCAoJnJ1aWQsICZldWlkLCAmc3VpZCkgIT0gMCkKKyAgICBnX2Vycm9yICgiZ2V0cmVzdWlkOiAlcyIsIGdfc3RyZXJyb3IgKGVycm5vKSk7CisKKyAgaWYgKHJ1aWQgIT0gMCB8fCBldWlkICE9IDAgfHwgc3VpZCAhPSAwKQorICAgIHsKKyAgICAgIGdfdGVzdF9tZXNzYWdlICgibm90IHVpZCAwIChydWlkPSVsZCBldWlkPSVsZCBzdWlkPSVsZCkiLAorICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBydWlkLCAodW5zaWduZWQgbG9uZykgZXVpZCwgKHVuc2lnbmVkIGxvbmcpIHN1aWQpOworICAgICAgZ190ZXN0X3NraXAgKCJub3QgdWlkIDAiKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBwd2QgPSBnZXRwd25hbSAodXNlcm5hbWUpOworCisgIGlmIChwd2QgPT0gTlVMTCkKKyAgICB7CisgICAgICBnX3Rlc3RfbWVzc2FnZSAoImdldHB3bmFtKFwiJXNcIik6ICVzIiwgdXNlcm5hbWUsIGdfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICBnX3Rlc3Rfc2tpcCAoIm5vdCB1aWQgMCIpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIC8qIEltcGVyc29uYXRlIHRoZSBkZXNpcmVkIHVzZXIgd2hpbGUgd2UgY29ubmVjdCB0byB0aGUgYnVzLgorICAgKiBUaGlzIHNob3VsZCB3b3JrLCBiZWNhdXNlIHdlJ3JlIHJvb3QuICovCisgIGlmIChzZXRyZXN1aWQgKHB3ZC0+cHdfdWlkLCBwd2QtPnB3X3VpZCwgMCkgIT0gMCkKKyAgICBnX2Vycm9yICgic2V0cmVzdWlkKCVsZCwgKHNhbWUpLCAwKTogJXMiLAorICAgICAgICAodW5zaWduZWQgbG9uZykgcHdkLT5wd191aWQsIGdfc3RyZXJyb3IgKGVycm5vKSk7CisKKyAgY29ubiA9IHRlc3RfY29ubmVjdF90b19idXMgKGN0eCwgYWRkcmVzcyk7CisKKyAgLyogZ28gYmFjayB0byBvdXIgc2F2ZWQgdWlkICovCisgIGlmIChzZXRyZXN1aWQgKDAsIDAsIDApICE9IDApCisgICAgZ19lcnJvciAoInNldHJlc3VpZCgwLCAwLCAwKTogJXMiLCBnX3N0cmVycm9yIChlcnJubykpOworCisgIHJldHVybiBjb25uOworCisjZWxzZQorCisgIHN3aXRjaCAodXNlcikKKyAgICB7CisgICAgICBjYXNlIFRFU1RfVVNFUl9NRToKKyAgICAgICAgcmV0dXJuIHRlc3RfY29ubmVjdF90b19idXMgKGN0eCwgYWRkcmVzcyk7CisKKyAgICAgIGNhc2UgVEVTVF9VU0VSX1JPT1Q6CisgICAgICBjYXNlIFRFU1RfVVNFUl9NRVNTQUdFQlVTOgorICAgICAgY2FzZSBURVNUX1VTRVJfT1RIRVI6CisgICAgICAgIGdfdGVzdF9za2lwICgic2V0cmVzdWlkKCkgbm90IGF2YWlsYWJsZSwgb3IgdW5zdXJlIGFib3V0ICIKKyAgICAgICAgICAgICJjcmVkZW50aWFscy1wYXNzaW5nIHNlbWFudGljcyBvbiB0aGlzIHBsYXRmb3JtIik7CisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgICBkZWZhdWx0OgorICAgICAgICBnX3JldHVybl92YWxfaWZfcmVhY2hlZCAoTlVMTCk7CisgICAgfQorCisjZW5kaWYKK30KKworc3RhdGljIHZvaWQKK3BpZF9kaWVkIChHUGlkIHBpZCwKKyAgICAgICAgICBnaW50IHN0YXR1cywKKyAgICAgICAgICBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIGdib29sZWFuICpyZXN1bHQgPSB1c2VyX2RhdGE7CisKKyAgZ19hc3NlcnQgKHJlc3VsdCAhPSBOVUxMKTsKKyAgZ19hc3NlcnQgKCEqcmVzdWx0KTsKKyAgKnJlc3VsdCA9IFRSVUU7Cit9CisKK3ZvaWQKK3Rlc3Rfa2lsbF9waWQgKEdQaWQgcGlkKQoreworICBnaW50IGRpZWQgPSBGQUxTRTsKKworICBnX2NoaWxkX3dhdGNoX2FkZCAocGlkLCBwaWRfZGllZCwgJmRpZWQpOworCisjaWZkZWYgREJVU19XSU4KKyAgaWYgKHBpZCAhPSBOVUxMKQorICAgIFRlcm1pbmF0ZVByb2Nlc3MgKHBpZCwgMSk7CisjZWxzZQorICBpZiAocGlkID4gMCkKKyAgICBraWxsIChwaWQsIFNJR1RFUk0pOworI2VuZGlmCisKKyAgd2hpbGUgKCFkaWVkKQorICAgIGdfbWFpbl9jb250ZXh0X2l0ZXJhdGlvbiAoTlVMTCwgVFJVRSk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgordGltZV9vdXQgKGdwb2ludGVyIGRhdGEpCit7CisgIHB1dHMgKCJCYWlsIG91dCEgVGVzdCB0aW1lZCBvdXQgKEdMaWIgbWFpbiBsb29wIHRpbWVvdXQgY2FsbGJhY2sgcmVhY2hlZCkiKTsKKyAgZmZsdXNoIChzdGRvdXQpOworICBhYm9ydCAoKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCisjaWZkZWYgR19PU19VTklYCitzdGF0aWMgdm9pZCB3cmFwX2Fib3J0IChpbnQgc2lnbmFsKSBfREJVU19HTlVDX05PUkVUVVJOOworCitzdGF0aWMgdm9pZAord3JhcF9hYm9ydCAoaW50IHNpZ25hbCkKK3sKKyAgLyogV2UgbWlnaHQgYmUgaGFsZndheSB0aHJvdWdoIHdyaXRpbmcgb3V0IHNvbWV0aGluZyBlbHNlLCBzbyBmb3JjZSB0aGlzCisgICAqIG9udG8gaXRzIG93biBsaW5lICovCisgIGNvbnN0IGNoYXIgbWVzc2FnZSBbXSA9ICJcbkJhaWwgb3V0ISBUZXN0IHRpbWVkIG91dCAoU0lHQUxSTSByZWNlaXZlZClcbiI7CisKKyAgaWYgKHdyaXRlIChTVERPVVRfRklMRU5PLCBtZXNzYWdlLCBzaXplb2YgKG1lc3NhZ2UpIC0gMSkgPAorICAgICAgKHNzaXplX3QpIHNpemVvZiAobWVzc2FnZSkgLSAxKQorICAgIHsKKyAgICAgIC8qIGlnbm9yZSBzaG9ydCB3cml0ZSAtIHdoYXQgd291bGQgd2UgZG8gYWJvdXQgaXQ/ICovCisgICAgfQorCisgIGFib3J0ICgpOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkCitzZXRfdGltZW91dCAoZ3VpbnQgZmFjdG9yKQoreworICBzdGF0aWMgZ3VpbnQgdGltZW91dCA9IDA7CisKKyAgLyogUHJldmVudCB0ZXN0cyBmcm9tIGhhbmdpbmcgZm9yZXZlci4gVGhpcyBpcyBpbnRlbmRlZCB0byBiZSBsb25nIGVub3VnaAorICAgKiB0aGF0IGFueSByZWFzb25hYmxlIHJlZ3Jlc3Npb24gdGVzdCBvbiBhbnkgcmVhc29uYWJsZSBoYXJkd2FyZSB3b3VsZAorICAgKiBoYXZlIGZpbmlzaGVkLiAqLworI2RlZmluZSBUSU1FT1VUIDYwCisKKyAgaWYgKHRpbWVvdXQgIT0gMCkKKyAgICBnX3NvdXJjZV9yZW1vdmUgKHRpbWVvdXQpOworCisgIHRpbWVvdXQgPSBnX3RpbWVvdXRfYWRkX3NlY29uZHMgKFRJTUVPVVQgKiBmYWN0b3IsIHRpbWVfb3V0LCBOVUxMKTsKKyNpZmRlZiBHX09TX1VOSVgKKyAgLyogVGhlIEdMaWIgbWFpbiBsb29wIG1pZ2h0IG5vdCBiZSBydW5uaW5nICh3ZSBkb24ndCB1c2UgaXQgaW4gZXZlcnkKKyAgICogdGVzdCkuIERpZSB3aXRoIFNJR0FMUk0gc2hvcnRseSBhZnRlciBpZiBuZWNlc3NhcnkuICovCisgIGFsYXJtICgoVElNRU9VVCAqIGZhY3RvcikgKyAxMCk7CisKKyAgLyogR2V0IGEgbG9nIG1lc3NhZ2UgYW5kIGEgY29yZSBkdW1wIGZyb20gdGhlIFNJR0FMUk0uICovCisgICAgeworICAgICAgc3RydWN0IHNpZ2FjdGlvbiBhY3QgPSB7IH07CisKKyAgICAgIGFjdC5zYV9oYW5kbGVyID0gd3JhcF9hYm9ydDsKKworICAgICAgc2lnYWN0aW9uIChTSUdBTFJNLCAmYWN0LCBOVUxMKTsKKyAgICB9CisjZW5kaWYKK30KKwordm9pZAordGVzdF9pbml0IChpbnQgKmFyZ2NwLCBjaGFyICoqKmFyZ3ZwKQoreworICBnX3Rlc3RfaW5pdCAoYXJnY3AsIGFyZ3ZwLCBOVUxMKTsKKyAgZ190ZXN0X2J1Z19iYXNlICgiaHR0cHM6Ly9idWdzLmZyZWVkZXNrdG9wLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Iik7CisgIHNldF90aW1lb3V0ICgxKTsKK30KKworc3RhdGljIHZvaWQKK3JlcG9ydF9hbmRfZGVzdHJveSAoZ3BvaW50ZXIgcCkKK3sKKyAgR1RpbWVyICp0aW1lciA9IHA7CisKKyAgZ190ZXN0X21lc3NhZ2UgKCJUaW1lIHNpbmNlIHRpbWVvdXQgcmVzZXQgJXA6ICUuM2Ygc2Vjb25kcyIsCisgICAgICB0aW1lciwgZ190aW1lcl9lbGFwc2VkICh0aW1lciwgTlVMTCkpOworICBnX3RpbWVyX2Rlc3Ryb3kgKHRpbWVyKTsKK30KKwordm9pZAordGVzdF90aW1lb3V0X3Jlc2V0IChndWludCBmYWN0b3IpCit7CisgIEdUaW1lciAqdGltZXIgPSBnX3RpbWVyX25ldyAoKTsKKworICBnX3Rlc3RfbWVzc2FnZSAoIlJlc2V0dGluZyB0ZXN0IHRpbWVvdXQgKHJlZmVyZW5jZTogJXA7IGZhY3RvcjogJXUpIiwKKyAgICAgIHRpbWVyLCBmYWN0b3IpOworICBzZXRfdGltZW91dCAoZmFjdG9yKTsKKworICBnX3Rlc3RfcXVldWVfZGVzdHJveSAocmVwb3J0X2FuZF9kZXN0cm95LCB0aW1lcik7Cit9CisKK3ZvaWQKK3Rlc3RfcHJvZ3Jlc3MgKGNoYXIgc3ltYm9sKQoreworICBpZiAoZ190ZXN0X3ZlcmJvc2UgKCkgJiYgaXNhdHR5ICgxKSkKKyAgICBnX3ByaW50ICgiJWMiLCBzeW1ib2wpOworfQorCisvKgorICogRGVsZXRlIEBwYXRoLCB3aXRoIGEgcmV0cnkgbG9vcCBpZiB0aGUgc3lzdGVtIGNhbGwgaXMgaW50ZXJydXB0ZWQgYnkKKyAqIGFuIGFzeW5jIHNpZ25hbC4gSWYgQHBhdGggZG9lcyBub3QgZXhpc3QsIGlnbm9yZTsgb3RoZXJ3aXNlLCBpdCBpcworICogcmVxdWlyZWQgdG8gYmUgYSBub24tZGlyZWN0b3J5LgorICovCit2b2lkCit0ZXN0X3JlbW92ZV9pZl9leGlzdHMgKGNvbnN0IGdjaGFyICpwYXRoKQoreworICB3aGlsZSAoZ19yZW1vdmUgKHBhdGgpICE9IDApCisgICAgeworICAgICAgaW50IHNhdmVkX2Vycm5vID0gZXJybm87CisKKyAgICAgIGlmIChzYXZlZF9lcnJubyA9PSBFTk9FTlQpCisgICAgICAgIHJldHVybjsKKworI2lmZGVmIEdfT1NfVU5JWAorICAgICAgaWYgKHNhdmVkX2Vycm5vID09IEVJTlRSKQorICAgICAgICBjb250aW51ZTsKKyNlbmRpZgorCisgICAgICBnX2Vycm9yICgiVW5hYmxlIHRvIHJlbW92ZSBmaWxlIFwiJXNcIjogJXMiLCBwYXRoLAorICAgICAgICAgICAgICAgZ19zdHJlcnJvciAoc2F2ZWRfZXJybm8pKTsKKyAgICB9Cit9CisKKy8qCisgKiBEZWxldGUgZW1wdHkgZGlyZWN0b3J5IEBwYXRoLCB3aXRoIGEgcmV0cnkgbG9vcCBpZiB0aGUgc3lzdGVtIGNhbGwgaXMKKyAqIGludGVycnVwdGVkIGJ5IGFuIGFzeW5jIHNpZ25hbC4gQHBhdGggaXMgcmVxdWlyZWQgdG8gZXhpc3QuCisgKi8KK3ZvaWQKK3Rlc3Rfcm1kaXJfbXVzdF9leGlzdCAoY29uc3QgZ2NoYXIgKnBhdGgpCit7CisgIHdoaWxlIChnX3JlbW92ZSAocGF0aCkgIT0gMCkKKyAgICB7CisgICAgICBpbnQgc2F2ZWRfZXJybm8gPSBlcnJubzsKKworI2lmZGVmIEdfT1NfVU5JWAorICAgICAgaWYgKHNhdmVkX2Vycm5vID09IEVJTlRSKQorICAgICAgICBjb250aW51ZTsKKyNlbmRpZgorCisgICAgICBnX2Vycm9yICgiVW5hYmxlIHRvIHJlbW92ZSBkaXJlY3RvcnkgXCIlc1wiOiAlcyIsIHBhdGgsCisgICAgICAgICAgICAgICBnX3N0cmVycm9yIChzYXZlZF9lcnJubykpOworICAgIH0KK30KKworLyoKKyAqIERlbGV0ZSBlbXB0eSBkaXJlY3RvcnkgQHBhdGgsIHdpdGggYSByZXRyeSBsb29wIGlmIHRoZSBzeXN0ZW0gY2FsbCBpcworICogaW50ZXJydXB0ZWQgYnkgYW4gYXN5bmMgc2lnbmFsLiBJZiBAcGF0aCBkb2VzIG5vdCBleGlzdCwgaWdub3JlLgorICovCit2b2lkCit0ZXN0X3JtZGlyX2lmX2V4aXN0cyAoY29uc3QgZ2NoYXIgKnBhdGgpCit7CisgIHdoaWxlIChnX3JlbW92ZSAocGF0aCkgIT0gMCkKKyAgICB7CisgICAgICBpbnQgc2F2ZWRfZXJybm8gPSBlcnJubzsKKworICAgICAgaWYgKHNhdmVkX2Vycm5vID09IEVOT0VOVCkKKyAgICAgICAgcmV0dXJuOworCisjaWZkZWYgR19PU19VTklYCisgICAgICBpZiAoc2F2ZWRfZXJybm8gPT0gRUlOVFIpCisgICAgICAgIGNvbnRpbnVlOworI2VuZGlmCisKKyAgICAgIGdfZXJyb3IgKCJVbmFibGUgdG8gcmVtb3ZlIGRpcmVjdG9yeSBcIiVzXCI6ICVzIiwgcGF0aCwKKyAgICAgICAgICAgICAgIGdfc3RyZXJyb3IgKHNhdmVkX2Vycm5vKSk7CisgICAgfQorfQorCisvKgorICogQ3JlYXRlIGRpcmVjdG9yeSBAcGF0aCwgd2l0aCBhIHJldHJ5IGxvb3AgaWYgdGhlIHN5c3RlbSBjYWxsIGlzCisgKiBpbnRlcnJ1cHRlZCBieSBhbiBhc3luYyBzaWduYWwuCisgKi8KK3ZvaWQKK3Rlc3RfbWtkaXIgKGNvbnN0IGdjaGFyICpwYXRoLAorICAgICAgICAgICAgZ2ludCBtb2RlKQoreworICB3aGlsZSAoZ19ta2RpciAocGF0aCwgbW9kZSkgIT0gMCkKKyAgICB7CisgICAgICBpbnQgc2F2ZWRfZXJybm8gPSBlcnJubzsKKworI2lmZGVmIEdfT1NfVU5JWAorICAgICAgaWYgKHNhdmVkX2Vycm5vID09IEVJTlRSKQorICAgICAgICBjb250aW51ZTsKKyNlbmRpZgorCisgICAgICBnX2Vycm9yICgiVW5hYmxlIHRvIGNyZWF0ZSBkaXJlY3RvcnkgXCIlc1wiOiAlcyIsIHBhdGgsCisgICAgICAgICAgICAgICBnX3N0cmVycm9yIChzYXZlZF9lcnJubykpOworICAgIH0KK30KKworZ2Jvb2xlYW4KK3Rlc3RfY2hlY2tfdGNwX3dvcmtzICh2b2lkKQoreworI2lmZGVmIERCVVNfVU5JWAorICAvKiBJbiBwYXRob2xvZ2ljYWwgY29udGFpbmVyIGVudmlyb25tZW50cywgd2UgbWlnaHQgbm90IGhhdmUgYQorICAgKiB3b3JraW5nIDEyNy4wLjAuMSAqLworICBpbnQgcmVzOworICBzdHJ1Y3QgYWRkcmluZm8gKmFkZHJzID0gTlVMTDsKKyAgc3RydWN0IGFkZHJpbmZvIGhpbnRzOworICBpbnQgc2F2ZWRfZXJybm87CisKKyAgX0RCVVNfWkVSTyAoaGludHMpOworI2lmZGVmIEFJX0FERFJDT05GSUcKKyAgaGludHMuYWlfZmxhZ3MgfD0gQUlfQUREUkNPTkZJRzsKKyNlbmRpZgorICBoaW50cy5haV9mbGFncyA9IEFJX0FERFJDT05GSUc7CisgIGhpbnRzLmFpX2ZhbWlseSA9IEFGX0lORVQ7CisgIGhpbnRzLmFpX3NvY2t0eXBlID0gU09DS19TVFJFQU07CisgIGhpbnRzLmFpX3Byb3RvY29sID0gSVBQUk9UT19UQ1A7CisKKyAgcmVzID0gZ2V0YWRkcmluZm8gKCIxMjcuMC4wLjEiLCAiMCIsICZoaW50cywgJmFkZHJzKTsKKyAgc2F2ZWRfZXJybm8gPSBlcnJubzsKKworICBpZiAocmVzICE9IDApCisgICAgeworICAgICAgY29uc3QgZ2NoYXIgKnN5c3RlbV9tZXNzYWdlOworICAgICAgZ2NoYXIgKnNraXBfbWVzc2FnZTsKKworI2lmZGVmIEVBSV9TWVNURU0KKyAgICAgIGlmIChyZXMgPT0gRUFJX1NZU1RFTSkKKyAgICAgICAgc3lzdGVtX21lc3NhZ2UgPSBnX3N0cmVycm9yIChzYXZlZF9lcnJubyk7CisgICAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgc3lzdGVtX21lc3NhZ2UgPSBnYWlfc3RyZXJyb3IgKHJlcyk7CisKKyAgICAgIHNraXBfbWVzc2FnZSA9IGdfc3RyZHVwX3ByaW50ZiAoIk5hbWUgcmVzb2x1dGlvbiBkb2VzIG5vdCB3b3JrIGhlcmU6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdldGFkZHJpbmZvKFwiMTI3LjAuMC4xXCIsIFwiMFwiLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ7ZmxhZ3M9QUREUkNPTkZJRywgZmFtaWx5PUlORVQsIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic29ja3R5cGU9U1RSRUFNLCBwcm90b2NvbD1UQ1B9KTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXN0ZW1fbWVzc2FnZSk7CisgICAgICBnX3Rlc3Rfc2tpcCAoc2tpcF9tZXNzYWdlKTsKKyAgICAgIGZyZWUgKHNraXBfbWVzc2FnZSk7CisgICAgfQorCisgIGlmIChhZGRycyAhPSBOVUxMKQorICAgIGZyZWVhZGRyaW5mbyAoYWRkcnMpOworCisgIHJldHVybiAocmVzID09IDApOworI2Vsc2UKKyAgLyogQXNzdW1lIHRoYXQgb24gV2luZG93cywgVENQIGFsd2F5cyB3b3JrcyAqLworICByZXR1cm4gVFJVRTsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvdGVzdC90ZXN0LXV0aWxzLWdsaWIuaCBiL3Rlc3QvdGVzdC11dGlscy1nbGliLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTYyMTIxYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdGVzdC11dGlscy1nbGliLmgKQEAgLTAsMCArMSwxMTEgQEAKKy8qIFV0aWxpdHkgZnVuY3Rpb25zIGZvciB0ZXN0cyB0aGF0IHJlbHkgb24gR0xpYgorICoKKyAqIENvcHlyaWdodCDCqSAyMDEwLTIwMTEgTm9raWEgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCDCqSAyMDEzLTIwMTUgQ29sbGFib3JhIEx0ZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMKKyAqICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sCisgKiBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLAorICogcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwKKyAqIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCisgKiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQorICogaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIFRFU1RfVVRJTFNfR0xJQl9ICisjZGVmaW5lIFRFU1RfVVRJTFNfR0xJQl9ICisKKyNpbmNsdWRlIDxkYnVzL2RidXMuaD4KKworI2luY2x1ZGUgPGdsaWIuaD4KKworI2luY2x1ZGUgInRlc3QtdXRpbHMuaCIKKworLyoKKyAqIE11bHRpLXVzZXIgc3VwcG9ydCBmb3IgcmVncmVzc2lvbiB0ZXN0cyBydW4gd2l0aCByb290IHByaXZpbGVnZXMgaW4KKyAqIGEgY29udGludW91cyBpbnRlZ3JhdGlvbiBzeXN0ZW0uCisgKgorICogQSBkZXZlbG9wZXIgd291bGQgbm9ybWFsbHkgcnVuIHRoZSB0ZXN0cyBhcyB0aGVpciBvd24gdWlkLiBUZXN0cyBydW4KKyAqIGFzIFRFU1RfVVNFUl9NRSBhcmUgcnVuLCBhbmQgdGhlIG90aGVycyBhcmUgc2tpcHBlZC4KKyAqCisgKiBJbiBhIENJIHN5c3RlbSB0aGF0IGhhcyBhY2Nlc3MgdG8gcm9vdCBwcml2aWxlZ2VzLCBtb3N0IHRlc3RzIHNob3VsZCBzdGlsbAorICogYmUgcnVuIGFzIGFuIGFyYml0cmFyeSBub24tcm9vdCB1c2VyLCBhcyBhYm92ZS4KKyAqCisgKiBDZXJ0YWluIHRlc3RzIGNhbiB1c2VmdWxseSBiZSBydW4gYWdhaW4sIGFzIHJvb3QuIFdoZW4gdGhpcyBpcyBkb25lLAorICogdGVzdHMgdXNpbmcgVEVTVF9VU0VSX1JPT1QsIFRFU1RfVVNFUl9NRVNTQUdFQlVTIGFuZC9vciBURVNUX1VTRVJfT1RIRVIKKyAqIGNhbiBleGVyY2lzZSBzaXR1YXRpb25zIHRoYXQgb25seSBhcmlzZSB3aGVuIHRoZXJlJ3MgbW9yZSB0aGFuIG9uZSB1aWQuCisgKi8KK3R5cGVkZWYgZW51bSB7CisgICAgLyogV2hhdGV2ZXIgdXNlciBoYXBwZW5zIHRvIGJlIHJ1bm5pbmcgdGhlIHJlZ3Jlc3Npb24gdGVzdDsKKyAgICAgKiBzdWNoIHRlc3RzIGFsc28gd29yayBvbiBXaW5kb3dzICovCisgICAgVEVTVF9VU0VSX01FLAorICAgIC8qIE11c3QgYmUgdWlkIDAgb24gVW5peDsgdGhlIHRlc3QgaXMgc2tpcHBlZCBvbiBXaW5kb3dzICovCisgICAgVEVTVF9VU0VSX1JPT1QsCisgICAgLyogVGhlIHVzZXIgd2hvIHdvdWxkIG5vcm1hbGx5IHJ1biB0aGUgc3lzdGVtIGJ1cy4gVGhpcyBpcyB0aGUgREJVU19VU0VSCisgICAgICogZnJvbSBjb25maWd1cmUuYWMsIHVzdWFsbHkgJ21lc3NhZ2VidXMnIGJ1dCBwZXJoYXBzICdkYnVzJyBvcgorICAgICAqICdfZGJ1cycuICovCisgICAgVEVTVF9VU0VSX01FU1NBR0VCVVMsCisgICAgLyogQW4gdW5wcml2aWxlZ2VkIHVzZXIgd2hvIGlzIG5laXRoZXIgcm9vdCBub3IgREJVU19VU0VSLgorICAgICAqIFRoaXMgaXMgREJVU19URVNUX1VTRVIgZnJvbSBjb25maWd1cmUuYWMsIHVzdWFsbHkgJ25vYm9keScuICovCisgICAgVEVTVF9VU0VSX09USEVSCit9IFRlc3RVc2VyOworCisjZGVmaW5lIHRlc3RfYXNzZXJ0X25vX2Vycm9yKGUpIF90ZXN0X2Fzc2VydF9ub19lcnJvciAoZSwgX19GSUxFX18sIF9fTElORV9fKQordm9pZCBfdGVzdF9hc3NlcnRfbm9fZXJyb3IgKGNvbnN0IERCdXNFcnJvciAqZSwKKyAgICBjb25zdCBjaGFyICpmaWxlLAorICAgIGludCBsaW5lKTsKKworZ2NoYXIgKnRlc3RfZ2V0X2RidXNfZGFlbW9uIChjb25zdCBnY2hhciAqY29uZmlnX2ZpbGUsCisgICAgVGVzdFVzZXIgdXNlciwKKyAgICBjb25zdCBnY2hhciAqcnVudGltZV9kaXIsCisgICAgR1BpZCAqZGFlbW9uX3BpZCk7CisKK0RCdXNDb25uZWN0aW9uICp0ZXN0X2Nvbm5lY3RfdG9fYnVzIChUZXN0TWFpbkNvbnRleHQgKmN0eCwKKyAgICBjb25zdCBnY2hhciAqYWRkcmVzcyk7CitEQnVzQ29ubmVjdGlvbiAqdGVzdF9jb25uZWN0X3RvX2J1c19hc191c2VyIChUZXN0TWFpbkNvbnRleHQgKmN0eCwKKyAgICBjb25zdCBjaGFyICphZGRyZXNzLAorICAgIFRlc3RVc2VyIHVzZXIpOworCit2b2lkIHRlc3Rfa2lsbF9waWQgKEdQaWQgcGlkKTsKKwordm9pZCB0ZXN0X2luaXQgKGludCAqYXJnY3AsIGNoYXIgKioqYXJndnApOworCit2b2lkIHRlc3RfcHJvZ3Jlc3MgKGNoYXIgc3ltYm9sKTsKKwordm9pZCB0ZXN0X3JlbW92ZV9pZl9leGlzdHMgKGNvbnN0IGdjaGFyICpwYXRoKTsKK3ZvaWQgdGVzdF9ybWRpcl9tdXN0X2V4aXN0IChjb25zdCBnY2hhciAqcGF0aCk7Cit2b2lkIHRlc3Rfcm1kaXJfaWZfZXhpc3RzIChjb25zdCBnY2hhciAqcGF0aCk7Cit2b2lkIHRlc3RfbWtkaXIgKGNvbnN0IGdjaGFyICpwYXRoLCBnaW50IG1vZGUpOworCit2b2lkIHRlc3RfdGltZW91dF9yZXNldCAoZ3VpbnQgZmFjdG9yKTsKKworI2lmICFHTElCX0NIRUNLX1ZFUlNJT04oMiwgNDQsIDApCisjZGVmaW5lIGdfc3RlYWxfcG9pbnRlcih4KSBiYWNrcG9ydGVkX2dfc3RlYWxfcG9pbnRlciAoeCkKKy8qIEEgc2ltcGxpZmllZCB2ZXJzaW9uIG9mIGdfc3RlYWxfcG9pbnRlciB3aXRob3V0IHR5cGUtc2FmZXR5LiAqLworc3RhdGljIGlubGluZSBncG9pbnRlcgorYmFja3BvcnRlZF9nX3N0ZWFsX3BvaW50ZXIgKGdwb2ludGVyIHBvaW50ZXJfdG9fcG9pbnRlcikKK3sKKyAgZ3BvaW50ZXIgKnBwID0gcG9pbnRlcl90b19wb2ludGVyOworICBncG9pbnRlciByZXQ7CisKKyAgcmV0ID0gKnBwOworICAqcHAgPSBOVUxMOworICByZXR1cm4gcmV0OworfQorI2VuZGlmCisKK2dib29sZWFuIHRlc3RfY2hlY2tfdGNwX3dvcmtzICh2b2lkKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS90ZXN0L3Rlc3QtdXRpbHMuYyBiL3Rlc3QvdGVzdC11dGlscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmNGQxOTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3Rlc3QtdXRpbHMuYwpAQCAtMCwwICsxLDM1OSBAQAorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgInRlc3QtdXRpbHMuaCIKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgREJ1c0xvb3AgKmxvb3A7CisgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uOworCit9IENEYXRhOworCitzdGF0aWMgZGJ1c19ib29sX3QKK2FkZF93YXRjaCAoREJ1c1dhdGNoICp3YXRjaCwKKwkgICB2b2lkICAgICAgKmRhdGEpCit7CisgIENEYXRhICpjZCA9IGRhdGE7CisKKyAgcmV0dXJuIF9kYnVzX2xvb3BfYWRkX3dhdGNoIChjZC0+bG9vcCwgd2F0Y2gpOworfQorCitzdGF0aWMgdm9pZAorcmVtb3ZlX3dhdGNoIChEQnVzV2F0Y2ggKndhdGNoLAorCSAgICAgIHZvaWQgICAgICAqZGF0YSkKK3sKKyAgQ0RhdGEgKmNkID0gZGF0YTsKKyAgCisgIF9kYnVzX2xvb3BfcmVtb3ZlX3dhdGNoIChjZC0+bG9vcCwgd2F0Y2gpOworfQorCitzdGF0aWMgdm9pZAordG9nZ2xlX3dhdGNoIChEQnVzV2F0Y2ggICp3YXRjaCwKKyAgICAgICAgICAgICAgdm9pZCAgICAgICAqZGF0YSkKK3sKKyAgQ0RhdGEgKmNkID0gZGF0YTsKKworICBfZGJ1c19sb29wX3RvZ2dsZV93YXRjaCAoY2QtPmxvb3AsIHdhdGNoKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CithZGRfdGltZW91dCAoREJ1c1RpbWVvdXQgKnRpbWVvdXQsCisJICAgICB2b2lkICAgICAgICAqZGF0YSkKK3sKKyAgQ0RhdGEgKmNkID0gZGF0YTsKKworICByZXR1cm4gX2RidXNfbG9vcF9hZGRfdGltZW91dCAoY2QtPmxvb3AsIHRpbWVvdXQpOworfQorCitzdGF0aWMgdm9pZAorcmVtb3ZlX3RpbWVvdXQgKERCdXNUaW1lb3V0ICp0aW1lb3V0LAorCQl2b2lkICAgICAgICAqZGF0YSkKK3sKKyAgQ0RhdGEgKmNkID0gZGF0YTsKKworICBfZGJ1c19sb29wX3JlbW92ZV90aW1lb3V0IChjZC0+bG9vcCwgdGltZW91dCk7Cit9CisKK3N0YXRpYyB2b2lkCitkaXNwYXRjaF9zdGF0dXNfZnVuY3Rpb24gKERCdXNDb25uZWN0aW9uICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzRGlzcGF0Y2hTdGF0dXMgbmV3X3N0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgKmRhdGEpCit7CisgIERCdXNMb29wICpsb29wID0gZGF0YTsKKyAgCisgIGlmIChuZXdfc3RhdHVzICE9IERCVVNfRElTUEFUQ0hfQ09NUExFVEUpCisgICAgeworICAgICAgd2hpbGUgKCFfZGJ1c19sb29wX3F1ZXVlX2Rpc3BhdGNoIChsb29wLCBjb25uZWN0aW9uKSkKKyAgICAgICAgX2RidXNfd2FpdF9mb3JfbWVtb3J5ICgpOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK2NkYXRhX2ZyZWUgKHZvaWQgKmRhdGEpCit7CisgIENEYXRhICpjZCA9IGRhdGE7CisKKyAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChjZC0+Y29ubmVjdGlvbik7CisgIF9kYnVzX2xvb3BfdW5yZWYgKGNkLT5sb29wKTsKKyAgCisgIGRidXNfZnJlZSAoY2QpOworfQorCitzdGF0aWMgQ0RhdGEqCitjZGF0YV9uZXcgKERCdXNMb29wICAgICAgICpsb29wLAorICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgQ0RhdGEgKmNkOworCisgIGNkID0gZGJ1c19uZXcwIChDRGF0YSwgMSk7CisgIGlmIChjZCA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIGNkLT5sb29wID0gbG9vcDsKKyAgY2QtPmNvbm5lY3Rpb24gPSBjb25uZWN0aW9uOworCisgIGRidXNfY29ubmVjdGlvbl9yZWYgKGNkLT5jb25uZWN0aW9uKTsKKyAgX2RidXNfbG9vcF9yZWYgKGNkLT5sb29wKTsKKworICByZXR1cm4gY2Q7Cit9CisKK2RidXNfYm9vbF90Cit0ZXN0X2Nvbm5lY3Rpb25fc2V0dXAgKFRlc3RNYWluQ29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgREJ1c0xvb3AgKmxvb3AgPSBjdHg7CisgIENEYXRhICpjZDsKKworICBjZCA9IE5VTEw7CisgIAorICBkYnVzX2Nvbm5lY3Rpb25fc2V0X2Rpc3BhdGNoX3N0YXR1c19mdW5jdGlvbiAoY29ubmVjdGlvbiwgZGlzcGF0Y2hfc3RhdHVzX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcCwgTlVMTCk7CisgIAorICBjZCA9IGNkYXRhX25ldyAobG9vcCwgY29ubmVjdGlvbik7CisgIGlmIChjZCA9PSBOVUxMKQorICAgIGdvdG8gbm9tZW07CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2V0X3dhdGNoX2Z1bmN0aW9ucyAoY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkX3dhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVfd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvZ2dsZV93YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2QsIGNkYXRhX2ZyZWUpKQorICAgIGdvdG8gbm9tZW07CisKKworICBjZCA9IGNkYXRhX25ldyAobG9vcCwgY29ubmVjdGlvbik7CisgIGlmIChjZCA9PSBOVUxMKQorICAgIGdvdG8gbm9tZW07CisgIAorICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZXRfdGltZW91dF9mdW5jdGlvbnMgKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkX3RpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlX3RpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZCwgY2RhdGFfZnJlZSkpCisgICAgZ290byBub21lbTsKKworICBpZiAoZGJ1c19jb25uZWN0aW9uX2dldF9kaXNwYXRjaF9zdGF0dXMgKGNvbm5lY3Rpb24pICE9IERCVVNfRElTUEFUQ0hfQ09NUExFVEUpCisgICAgeworICAgICAgaWYgKCFfZGJ1c19sb29wX3F1ZXVlX2Rpc3BhdGNoIChsb29wLCBjb25uZWN0aW9uKSkKKyAgICAgICAgZ290byBub21lbTsKKyAgICB9CisgIAorICByZXR1cm4gVFJVRTsKKyAgCisgbm9tZW06CisgIGlmIChjZCkKKyAgICBjZGF0YV9mcmVlIChjZCk7CisgIAorICBkYnVzX2Nvbm5lY3Rpb25fc2V0X2Rpc3BhdGNoX3N0YXR1c19mdW5jdGlvbiAoY29ubmVjdGlvbiwgTlVMTCwgTlVMTCwgTlVMTCk7CisgIGRidXNfY29ubmVjdGlvbl9zZXRfd2F0Y2hfZnVuY3Rpb25zIChjb25uZWN0aW9uLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgZGJ1c19jb25uZWN0aW9uX3NldF90aW1lb3V0X2Z1bmN0aW9ucyAoY29ubmVjdGlvbiwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgIAorICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyB2b2lkIGRpZSAoY29uc3QgY2hhciAqbWVzc2FnZSkgX0RCVVNfR05VQ19OT1JFVFVSTjsKKworc3RhdGljIHZvaWQKK2RpZSAoY29uc3QgY2hhciAqbWVzc2FnZSkKK3sKKyAgZnByaW50ZiAoc3RkZXJyLCAiKioqICVzIiwgbWVzc2FnZSk7CisgIGV4aXQgKDEpOworfQorCit2b2lkCit0ZXN0X2Nvbm5lY3Rpb25fc2h1dGRvd24gKFRlc3RNYWluQ29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2V0X3dhdGNoX2Z1bmN0aW9ucyAoY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCkpCisgICAgZGllICgic2V0dGluZyB3YXRjaCBmdW5jdGlvbnMgdG8gTlVMTCBmYWlsZWQiKTsKKyAgCisgIGlmICghZGJ1c19jb25uZWN0aW9uX3NldF90aW1lb3V0X2Z1bmN0aW9ucyAoY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMKSkKKyAgICBkaWUgKCJzZXR0aW5nIHRpbWVvdXQgZnVuY3Rpb25zIHRvIE5VTEwgZmFpbGVkIik7CisKKyAgZGJ1c19jb25uZWN0aW9uX3NldF9kaXNwYXRjaF9zdGF0dXNfZnVuY3Rpb24gKGNvbm5lY3Rpb24sIE5VTEwsIE5VTEwsIE5VTEwpOworfQorCit0eXBlZGVmIHN0cnVjdAoreworICBEQnVzTG9vcCAqbG9vcDsKKyAgREJ1c1NlcnZlciAqc2VydmVyOworfSBTZXJ2ZXJEYXRhOworCitzdGF0aWMgdm9pZAorc2VydmVyZGF0YV9mcmVlICh2b2lkICpkYXRhKQoreworICBTZXJ2ZXJEYXRhICpzZCA9IGRhdGE7CisKKyAgZGJ1c19zZXJ2ZXJfdW5yZWYgKHNkLT5zZXJ2ZXIpOworICBfZGJ1c19sb29wX3VucmVmIChzZC0+bG9vcCk7CisgIAorICBkYnVzX2ZyZWUgKHNkKTsKK30KKworc3RhdGljIFNlcnZlckRhdGEqCitzZXJ2ZXJkYXRhX25ldyAoREJ1c0xvb3AgICAgICAgKmxvb3AsCisgICAgICAgICAgICAgICAgREJ1c1NlcnZlciAgICAgKnNlcnZlcikKK3sKKyAgU2VydmVyRGF0YSAqc2Q7CisKKyAgc2QgPSBkYnVzX25ldzAgKFNlcnZlckRhdGEsIDEpOworICBpZiAoc2QgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBzZC0+bG9vcCA9IGxvb3A7CisgIHNkLT5zZXJ2ZXIgPSBzZXJ2ZXI7CisKKyAgZGJ1c19zZXJ2ZXJfcmVmIChzZC0+c2VydmVyKTsKKyAgX2RidXNfbG9vcF9yZWYgKHNkLT5sb29wKTsKKworICByZXR1cm4gc2Q7Cit9CisKK3N0YXRpYyBkYnVzX2Jvb2xfdAorYWRkX3NlcnZlcl93YXRjaCAoREJ1c1dhdGNoICAqd2F0Y2gsCisgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICpkYXRhKQoreworICBTZXJ2ZXJEYXRhICpjb250ZXh0ID0gZGF0YTsKKworICByZXR1cm4gX2RidXNfbG9vcF9hZGRfd2F0Y2ggKGNvbnRleHQtPmxvb3AsIHdhdGNoKTsKK30KKworc3RhdGljIHZvaWQKK3RvZ2dsZV9zZXJ2ZXJfd2F0Y2ggKERCdXNXYXRjaCAgKndhdGNoLAorICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAqZGF0YSkKK3sKKyAgU2VydmVyRGF0YSAqY29udGV4dCA9IGRhdGE7CisKKyAgX2RidXNfbG9vcF90b2dnbGVfd2F0Y2ggKGNvbnRleHQtPmxvb3AsIHdhdGNoKTsKK30KKworc3RhdGljIHZvaWQKK3JlbW92ZV9zZXJ2ZXJfd2F0Y2ggKERCdXNXYXRjaCAgKndhdGNoLAorICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAqZGF0YSkKK3sKKyAgU2VydmVyRGF0YSAqY29udGV4dCA9IGRhdGE7CisgIAorICBfZGJ1c19sb29wX3JlbW92ZV93YXRjaCAoY29udGV4dC0+bG9vcCwgd2F0Y2gpOworfQorCitzdGF0aWMgZGJ1c19ib29sX3QKK2FkZF9zZXJ2ZXJfdGltZW91dCAoREJ1c1RpbWVvdXQgKnRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICpkYXRhKQoreworICBTZXJ2ZXJEYXRhICpjb250ZXh0ID0gZGF0YTsKKworICByZXR1cm4gX2RidXNfbG9vcF9hZGRfdGltZW91dCAoY29udGV4dC0+bG9vcCwgdGltZW91dCk7Cit9CisKK3N0YXRpYyB2b2lkCityZW1vdmVfc2VydmVyX3RpbWVvdXQgKERCdXNUaW1lb3V0ICp0aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAqZGF0YSkKK3sKKyAgU2VydmVyRGF0YSAqY29udGV4dCA9IGRhdGE7CisgIAorICBfZGJ1c19sb29wX3JlbW92ZV90aW1lb3V0IChjb250ZXh0LT5sb29wLCB0aW1lb3V0KTsKK30KKworZGJ1c19ib29sX3QKK3Rlc3Rfc2VydmVyX3NldHVwIChUZXN0TWFpbkNvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICBEQnVzU2VydmVyICAgICpzZXJ2ZXIpCit7CisgIERCdXNMb29wICpsb29wID0gY3R4OworICBTZXJ2ZXJEYXRhICpzZDsKKworICBzZCA9IHNlcnZlcmRhdGFfbmV3IChsb29wLCBzZXJ2ZXIpOworICBpZiAoc2QgPT0gTlVMTCkKKyAgICBnb3RvIG5vbWVtOworCisgIGlmICghZGJ1c19zZXJ2ZXJfc2V0X3dhdGNoX2Z1bmN0aW9ucyAoc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZF9zZXJ2ZXJfd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlX3NlcnZlcl93YXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2dnbGVfc2VydmVyX3dhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlcmRhdGFfZnJlZSkpCisgICAgeworICAgICAgZ290byBub21lbTsKKyAgICB9CisKKyAgc2QgPSBzZXJ2ZXJkYXRhX25ldyAobG9vcCwgc2VydmVyKTsKKyAgaWYgKHNkID09IE5VTEwpCisgICAgZ290byBub21lbTsKKworICBpZiAoIWRidXNfc2VydmVyX3NldF90aW1lb3V0X2Z1bmN0aW9ucyAoc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkX3NlcnZlcl90aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlX3NlcnZlcl90aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNkLCBzZXJ2ZXJkYXRhX2ZyZWUpKQorICAgIHsKKyAgICAgIGdvdG8gbm9tZW07CisgICAgfSAgIAorICByZXR1cm4gVFJVRTsKKworIG5vbWVtOgorICBpZiAoc2QpCisgICAgc2VydmVyZGF0YV9mcmVlIChzZCk7CisgIAorICB0ZXN0X3NlcnZlcl9zaHV0ZG93biAobG9vcCwgc2VydmVyKTsKKyAgCisgIHJldHVybiBGQUxTRTsKK30KKwordm9pZAordGVzdF9zZXJ2ZXJfc2h1dGRvd24gKFRlc3RNYWluQ29udGV4dCAgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICBEQnVzU2VydmVyICAgICAgICpzZXJ2ZXIpCit7CisgIGRidXNfc2VydmVyX2Rpc2Nvbm5lY3QgKHNlcnZlcik7CisKKyAgaWYgKCFkYnVzX3NlcnZlcl9zZXRfd2F0Y2hfZnVuY3Rpb25zIChzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKQorICAgIGRpZSAoInNldHRpbmcgd2F0Y2ggZnVuY3Rpb25zIHRvIE5VTEwgZmFpbGVkIik7CisgIAorICBpZiAoIWRidXNfc2VydmVyX3NldF90aW1lb3V0X2Z1bmN0aW9ucyAoc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkKKyAgICBkaWUgKCJzZXR0aW5nIHRpbWVvdXQgZnVuY3Rpb25zIHRvIE5VTEwgZmFpbGVkIik7Cit9CisKK1Rlc3RNYWluQ29udGV4dCAqCit0ZXN0X21haW5fY29udGV4dF9nZXQgKHZvaWQpCit7CisgIHJldHVybiBfZGJ1c19sb29wX25ldyAoKTsKK30KKworVGVzdE1haW5Db250ZXh0ICoKK3Rlc3RfbWFpbl9jb250ZXh0X3JlZiAoVGVzdE1haW5Db250ZXh0ICpjdHgpCit7CisgIHJldHVybiBfZGJ1c19sb29wX3JlZiAoY3R4KTsKK30KKwordm9pZCB0ZXN0X21haW5fY29udGV4dF91bnJlZiAoVGVzdE1haW5Db250ZXh0ICpjdHgpCit7CisgIF9kYnVzX2xvb3BfdW5yZWYgKGN0eCk7Cit9CisKK3ZvaWQgdGVzdF9tYWluX2NvbnRleHRfaXRlcmF0ZSAoVGVzdE1haW5Db250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidXNfYm9vbF90ICAgICAgbWF5X2Jsb2NrKQoreworICBfZGJ1c19sb29wX2l0ZXJhdGUgKGN0eCwgbWF5X2Jsb2NrKTsKK30KKwordm9pZAordGVzdF9wZW5kaW5nX2NhbGxfc3RvcmVfcmVwbHkgKERCdXNQZW5kaW5nQ2FsbCAqcGMsCisgICAgdm9pZCAqZGF0YSkKK3sKKyAgREJ1c01lc3NhZ2UgKiptZXNzYWdlX3AgPSBkYXRhOworCisgICptZXNzYWdlX3AgPSBkYnVzX3BlbmRpbmdfY2FsbF9zdGVhbF9yZXBseSAocGMpOworICBfZGJ1c19hc3NlcnQgKCptZXNzYWdlX3AgIT0gTlVMTCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L3Rlc3QtdXRpbHMuaCBiL3Rlc3QvdGVzdC11dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5ZmFlNzcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3Rlc3QtdXRpbHMuaApAQCAtMCwwICsxLDMxIEBACisjaWZuZGVmIFRFU1RfVVRJTFNfSAorI2RlZmluZSBURVNUX1VUSUxTX0gKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlIDxkYnVzL2RidXMuaD4KKworI2luY2x1ZGUgPGRidXMvZGJ1cy1tYWlubG9vcC5oPgorI2luY2x1ZGUgPGRidXMvZGJ1cy1pbnRlcm5hbHMuaD4KK3R5cGVkZWYgREJ1c0xvb3AgVGVzdE1haW5Db250ZXh0OworCitUZXN0TWFpbkNvbnRleHQgKnRlc3RfbWFpbl9jb250ZXh0X2dldCAgICAgICAgICAgICh2b2lkKTsKK1Rlc3RNYWluQ29udGV4dCAqdGVzdF9tYWluX2NvbnRleHRfcmVmICAgICAgICAgICAgKFRlc3RNYWluQ29udGV4dCAqY3R4KTsKK3ZvaWQgICAgICAgICAgICAgdGVzdF9tYWluX2NvbnRleHRfdW5yZWYgICAgICAgICAgKFRlc3RNYWluQ29udGV4dCAqY3R4KTsKK3ZvaWQgICAgICAgICAgICAgdGVzdF9tYWluX2NvbnRleHRfaXRlcmF0ZSAgICAgICAgKFRlc3RNYWluQ29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1c19ib29sX3QgICAgICBtYXlfYmxvY2spOworCitkYnVzX2Jvb2xfdCB0ZXN0X2Nvbm5lY3Rpb25fc2V0dXAgICAgICAgICAgICAgICAgIChUZXN0TWFpbkNvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uKTsKK3ZvaWQgICAgICAgIHRlc3RfY29ubmVjdGlvbl9zaHV0ZG93biAgICAgICAgICAgICAgKFRlc3RNYWluQ29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOworCitkYnVzX2Jvb2xfdCB0ZXN0X3NlcnZlcl9zZXR1cCAgICAgICAgICAgICAgICAgICAgIChUZXN0TWFpbkNvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTZXJ2ZXIgICAgKnNlcnZlcik7Cit2b2lkICAgICAgICB0ZXN0X3NlcnZlcl9zaHV0ZG93biAgICAgICAgICAgICAgICAgIChUZXN0TWFpbkNvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCdXNTZXJ2ZXIgICAgKnNlcnZlcik7Cit2b2lkICAgICAgICB0ZXN0X3BlbmRpbmdfY2FsbF9zdG9yZV9yZXBseSAgICAgICAgIChEQnVzUGVuZGluZ0NhbGwgKnBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdGVzdC90aHJlYWQtYmxvY2tpbmcuYyBiL3Rlc3QvdGhyZWFkLWJsb2NraW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgxNGRlYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdGhyZWFkLWJsb2NraW5nLmMKQEAgLTAsMCArMSwyOTkgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyoKKyAqIFJlZ3Jlc3Npb24gdGVzdCBmb3IgZmQubyAjMTAyODM5OiBibG9ja2luZyBvbiBwZW5kaW5nIGNhbGxzIGluIHRocmVhZHMKKyAqCisgKiBDb3B5cmlnaHQgwqkgMjAxOCBLUElUIFRlY2hub2xvZ2llcyBMdGQuCisgKiBDb3B5cmlnaHQgwqkgMjAxOCBNYW5pc2ggTmFyYW5nIDxtYW5yb2NrMDA3QGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCDCqSAyMDE4IENvbGxhYm9yYSBMdGQuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisKKyNpbmNsdWRlIDxkYnVzL2RidXMuaD4KKworI2luY2x1ZGUgPGdsaWIuaD4KKyNpbmNsdWRlIDxnaW8vZ2lvLmg+CisKKyNpbmNsdWRlICJ0ZXN0LXV0aWxzLWdsaWIuaCIKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgREJ1c0Vycm9yIGU7CisgIEdFcnJvciAqZ2U7CisgIEdQaWQgZGFlbW9uX3BpZDsKKyAgZ2NoYXIgKmFkZHJlc3M7CisKKyAgREJ1c0Nvbm5lY3Rpb24gKnNlcnZpY2VfY29ubjsKKyAgR1RocmVhZCAqc2VydmljZV90aHJlYWQ7CisgIGNvbnN0IGdjaGFyICpzZXJ2aWNlX25hbWU7CisKKyAgR1RocmVhZCAqY2xpZW50X2Rpc3BhdGNoZXJfdGhyZWFkOworICBHVGhyZWFkICoqY2xpZW50X2NhbGxlcl90aHJlYWRzOworICBEQnVzQ29ubmVjdGlvbiAqY2xpZW50X2Nvbm47CisgIEdNdXRleCBjYWxsZXJzX3JlbWFpbmluZ19tdXRleDsKKyAgR0NvbmQgY2FsbGVyc19yZW1haW5pbmdfY29uZDsKKyAgZ3NpemUgY2FsbGVyc19yZW1haW5pbmc7CisKKyAgZ3NpemUgbl9jYWxsZXJfdGhyZWFkczsKKyAgZ3NpemUgY2FsbHNfcGVyX3RocmVhZDsKK30gRml4dHVyZTsKKworc3RhdGljIERCdXNIYW5kbGVyUmVzdWx0CitlY2hvX2ZpbHRlciAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgREJ1c01lc3NhZ2UgKm1lc3NhZ2UsCisgICAgICAgICAgICAgdm9pZCAqdXNlcl9kYXRhKQoreworICBEQnVzTWVzc2FnZSAqcmVwbHk7CisKKyAgaWYgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobWVzc2FnZSkgIT0gREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX0NBTEwpCisgICAgcmV0dXJuIERCVVNfSEFORExFUl9SRVNVTFRfTk9UX1lFVF9IQU5ETEVEOworCisgIHJlcGx5ID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfcmV0dXJuIChtZXNzYWdlKTsKKworICBpZiAocmVwbHkgPT0gTlVMTCB8fAorICAgICAgIWRidXNfY29ubmVjdGlvbl9zZW5kIChjb25uZWN0aW9uLCByZXBseSwgTlVMTCkpCisgICAgZ19lcnJvciAoIk9PTSIpOworCisgIGRidXNfY2xlYXJfbWVzc2FnZSAoJnJlcGx5KTsKKworICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9IQU5ETEVEOworfQorCisvKgorICogVGhyZWFkIGZ1bmN0aW9uIHRvIGRpc3BhdGNoIHRoZSBzZXJ2aWNlIGNvbm5lY3Rpb24uIFRoaXMgZnVuY3Rpb24gcnVucworICogaW4gaXRzIG93biB0aHJlYWQsIGRpc3BhdGNoaW5nIHRoZSBzZXJ2aWNlIGNvbm5lY3Rpb24gYW5kIHJlcGx5aW5nIHRvCisgKiBtZXRob2QgY2FsbHMgZnJvbSB0aGUgY2FsbGVycywgdW50aWwgdGhlIHNlcnZpY2UgY29ubmVjdGlvbiBpcworICogZGlzY29ubmVjdGVkIGJ5IHRoZSBtYWluIHRocmVhZC4KKyAqLworc3RhdGljIGdwb2ludGVyCitzZXJ2aWNlX3RocmVhZF9jYiAoZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBGaXh0dXJlICpmID0gdXNlcl9kYXRhOworCisgIC8qIEluIHByaW5jaXBsZSB3ZSBzaG91bGQgYmUgYWJsZSB0byB3YWl0IGluZGVmaW5pdGVseSAoLTEpIGJ1dCB0aGF0CisgICAqIHNlZW1zIHRvIHByZXZlbnQgY2xvc2luZyB0aGUgY29ubmVjdGlvbiBmcm9tIHRoZSBtYWluIHRocmVhZCBmcm9tCisgICAqIGhhdmluZyBpdHMgZGVzaXJlZCBlZmZlY3QgKi8KKyAgd2hpbGUgKGRidXNfY29ubmVjdGlvbl9yZWFkX3dyaXRlX2Rpc3BhdGNoIChmLT5zZXJ2aWNlX2Nvbm4sIDEwMDApKQorICAgIHsKKyAgICAgIC8qIERpc2Nvbm5lY3RlZCBtZXNzYWdlIG5vdCByZWNlaXZlZDsga2VlcCBwcm9jZXNzaW5nICovCisgICAgfQorCisgIHJldHVybiBOVUxMOworfQorCisvKgorICogTXVjaCBsaWtlIHNlcnZpY2VfdGhyZWFkX2NiLCBidXQgZm9yIHRoZSBjbGllbnQgY29ubmVjdGlvbi4gSW4gYSByZWFsCisgKiBwcm9ncmFtIHRoaXMgd291bGQgb2Z0ZW4gYmUgdGhlIG1haW4gdGhyZWFkLCBydW5uaW5nIGFuIGV2ZW50IGxvb3AKKyAqIGxpa2UgdGhlIG9uZSBwcm92aWRlZCBieSBHTGliLgorICovCitzdGF0aWMgZ3BvaW50ZXIKK2NsaWVudF9kaXNwYXRjaGVyX3RocmVhZF9jYiAoZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBGaXh0dXJlICpmID0gdXNlcl9kYXRhOworCisgIC8qIFRoaXMgdGhyZWFkIG5lZWRzIHRvIHlpZWxkIG9jY2FzaW9uYWxseSwgb3RoZXJ3aXNlIHRoZSBjYWxsZXIKKyAgICogdGhyZWFkcyB3b24ndCBldmVyIGdldCBhIGNoYW5jZSB0byBzZW5kIHRoZWlyIG1lc3NhZ2VzLgorICAgKiBUaGlzIGlzIG5vdCBhIHJlY29tbWVuZGVkIEkvTyBwYXR0ZXJuLCBidXQgaW4gcHJpbmNpcGxlIGl0IHdhcworICAgKiBhbHdheXMgbWVhbnQgdG8gd29yay4uLiAqLworICB3aGlsZSAoZGJ1c19jb25uZWN0aW9uX3JlYWRfd3JpdGVfZGlzcGF0Y2ggKGYtPmNsaWVudF9jb25uLCAxMCkpCisgICAgeworICAgICAgLyogRGlzY29ubmVjdGVkIG1lc3NhZ2Ugbm90IHJlY2VpdmVkOyBrZWVwIHByb2Nlc3NpbmcgKi8KKyAgICB9CisKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiBXb3JrZXIgdGhyZWFkIHJlcHJlc2VudGluZyBzb21lIGJhY2tncm91bmQgdGFzay4gU29tZSBwcm9ncmFtcworICogZGlzcGF0Y2ggYSBEQnVzQ29ubmVjdGlvbiBpbiBvbmUgdGhyZWFkIChpbiB0aGlzIHRlc3QgdGhhdCdzIHRoZQorICogImNsaWVudCBkaXNwYXRjaGVyIHRocmVhZCIpLCBhbmQgZXhwZWN0IHRvIGJlIGFibGUgdG8gYmxvY2sgb24KKyAqIHBlbmRpbmcgY2FsbHMgaW4gb3RoZXIgdGhyZWFkcy4gVGhpcyByZXByZXNlbnRzIG9uZSBvZiB0aG9zZSBvdGhlcgorICogdGhyZWFkcy4KKyAqLworc3RhdGljIGdwb2ludGVyCitjbGllbnRfY2FsbGVyX3RocmVhZF9jYiAoZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBGaXh0dXJlICpmID0gdXNlcl9kYXRhOworICBnc2l6ZSBpOworCisgIGZvciAoaSA9IDA7IGkgPCBmLT5jYWxsc19wZXJfdGhyZWFkOyBpKyspCisgICAgeworICAgICAgREJ1c01lc3NhZ2UgKmNhbGwsICpyZXBseTsKKyAgICAgIERCdXNFcnJvciBlcnJvciA9IERCVVNfRVJST1JfSU5JVDsKKyAgICAgIGdpbnQ2NCB0aW1lX2JlZm9yZSwgdGltZV9hZnRlcjsKKworICAgICAgLyogVGhpcyBkZWxpYmVyYXRlbHkgaXNuJ3QgZ190ZXN0X21lc3NhZ2UoKSB0byBhdm9pZCBidWZmZXJpbmcKKyAgICAgICAqIGlzc3Vlczogc3RkZXJyIGlzIGxpbmUtYnVmZmVyZWQgKi8KKyAgICAgIGlmIChpICUgMTAwID09IDApCisgICAgICAgIGdfcHJpbnRlcnIgKCIjIHRocmVhZCAlcDogJSIgR19HU0laRV9GT1JNQVQgIi8lIiBHX0dTSVpFX0ZPUk1BVCAiXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZ190aHJlYWRfc2VsZiAoKSwgaSwgZi0+Y2FsbHNfcGVyX3RocmVhZCk7CisKKyAgICAgIGNhbGwgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsIChmLT5zZXJ2aWNlX25hbWUsICIvIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29tLmV4YW1wbGUuRWNobyIsICJFY2hvIik7CisgICAgICBnX2Fzc2VydF9ub25udWxsIChjYWxsKTsKKworICAgICAgdGltZV9iZWZvcmUgPSBnX2dldF9tb25vdG9uaWNfdGltZSAoKTsKKyAgICAgIHJlcGx5ID0gZGJ1c19jb25uZWN0aW9uX3NlbmRfd2l0aF9yZXBseV9hbmRfYmxvY2sgKGYtPmNsaWVudF9jb25uLCBjYWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzAwMDAsICZlcnJvcik7CisgICAgICB0aW1lX2FmdGVyID0gZ19nZXRfbW9ub3RvbmljX3RpbWUgKCk7CisgICAgICB0ZXN0X2Fzc2VydF9ub19lcnJvciAoJmVycm9yKTsKKyAgICAgIGdfYXNzZXJ0X25vbm51bGwgKHJlcGx5KTsKKyAgICAgIC8qIFdlIGRvbid0IGV4cGVjdCBpdCB0byBoYXZlIHRha2VuIGxvbmcgLSBhIGZldyBzZWNvbmRzIG1heCwgZXZlbgorICAgICAgICogd2l0aCBhbGwgdGhlIG90aGVyIHRocmVhZHMgY29udGVuZGluZyB3aXRoIHVzLiBJZiB3ZSB3ZXJlCisgICAgICAgKiBhbnl3aGVyZSBuZWFyIHRoZSAzMCBzZWNvbmQgdGltZW91dCB0aGVuIHRoYXQncyBhIGZhaWx1cmUuICovCisgICAgICBnX2Fzc2VydF9jbXBpbnQgKHRpbWVfYWZ0ZXIgLSB0aW1lX2JlZm9yZSwgPD0sIDEwICogR19VU0VDX1BFUl9TRUMpOworICAgICAgZGJ1c19jbGVhcl9tZXNzYWdlICgmcmVwbHkpOworICAgICAgZGJ1c19jbGVhcl9tZXNzYWdlICgmY2FsbCk7CisgICAgfQorCisgIGdfcHJpbnRlcnIgKCIjIHRocmVhZCAlcDogZmluaXNoaW5nXG4iLCBnX3RocmVhZF9zZWxmICgpKTsKKyAgZ19tdXRleF9sb2NrICgmZi0+Y2FsbGVyc19yZW1haW5pbmdfbXV0ZXgpOworICBmLT5jYWxsZXJzX3JlbWFpbmluZy0tOworICBnX2NvbmRfc2lnbmFsICgmZi0+Y2FsbGVyc19yZW1haW5pbmdfY29uZCk7CisgIGdfbXV0ZXhfdW5sb2NrICgmZi0+Y2FsbGVyc19yZW1haW5pbmdfbXV0ZXgpOworCisgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZAorc2V0dXAgKEZpeHR1cmUgKmYsCisgICAgICAgZ2NvbnN0cG9pbnRlciBjb250ZXh0KQoreworICBmLT5nZSA9IE5VTEw7CisgIGRidXNfZXJyb3JfaW5pdCAoJmYtPmUpOworCisgIGYtPmFkZHJlc3MgPSB0ZXN0X2dldF9kYnVzX2RhZW1vbiAoTlVMTCwgVEVTVF9VU0VSX01FLCBOVUxMLCAmZi0+ZGFlbW9uX3BpZCk7CisgIGdfYXNzZXJ0X25vbm51bGwgKGYtPmFkZHJlc3MpOworCisgIGYtPnNlcnZpY2VfY29ubiA9IHRlc3RfY29ubmVjdF90b19idXMgKE5VTEwsIGYtPmFkZHJlc3MpOworICBmLT5zZXJ2aWNlX25hbWUgPSBkYnVzX2J1c19nZXRfdW5pcXVlX25hbWUgKGYtPnNlcnZpY2VfY29ubik7CisgIGYtPmNsaWVudF9jb25uID0gdGVzdF9jb25uZWN0X3RvX2J1cyAoTlVMTCwgZi0+YWRkcmVzcyk7CisKKyAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fYWRkX2ZpbHRlciAoZi0+c2VydmljZV9jb25uLCBlY2hvX2ZpbHRlciwgZiwgTlVMTCkpCisgICAgZ19lcnJvciAoIk9PTSIpOworCisgIGYtPnNlcnZpY2VfdGhyZWFkID0gZ190aHJlYWRfbmV3ICgic2VydmljZSIsIHNlcnZpY2VfdGhyZWFkX2NiLCBmKTsKKyAgZi0+Y2xpZW50X2Rpc3BhdGNoZXJfdGhyZWFkID0gZ190aHJlYWRfbmV3ICgiY2xpZW50IGRpc3BhdGNoZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudF9kaXNwYXRjaGVyX3RocmVhZF9jYiwgZik7Cit9CisKKy8qCisgKiBBc3NlcnQgdGhhdCBpbiB0aGUgZm9sbG93aW5nIHNpdHVhdGlvbjoKKyAqCisgKiAtIG9uZSB0aHJlYWQgZGlzcGF0Y2hlcyB0aGUgc2VydmVyIGNvbm5lY3Rpb24gKGluIHJlYWwgbGlmZSB0aGlzIHdvdWxkCisgKiAgIG5vcm1hbGx5IGJlIGEgc2VwYXJhdGUgcHJvY2Vzcywgb2YgY291cnNlKQorICogLSBvbmUgdGhyZWFkIGRpc3BhdGNoZXMgdGhlIGNsaWVudCBjb25uZWN0aW9uCisgKiAtIG1hbnkgdGhyZWFkcyBtYWtlIGJsb2NraW5nIG1ldGhvZCBjYWxscyBvbiB0aGUgc2FtZSBjbGllbnQgY29ubmVjdGlvbgorICoKKyAqIHRoZSBjYWxsZXIgdGhyZWFkcyBhcmUgcmVndWxhcmx5IGRpc3BhdGNoZWQsIGFuZCBuZXZlciBnZXQgYmxvY2tlZAorICogdW50aWwgdGhlaXIgbWV0aG9kIGNhbGwgdGltZW91dC4KKyAqLworc3RhdGljIHZvaWQKK3Rlc3RfdGhyZWFkcyAoRml4dHVyZSAqZiwKKyAgICAgICAgICAgICAgZ2NvbnN0cG9pbnRlciBjb250ZXh0KQoreworICBnc2l6ZSBpOworCisgIGdfdGVzdF9idWcgKCIxMDI4MzkiKTsKKworICBpZiAoZ190ZXN0X3Nsb3cgKCkpCisgICAgeworICAgICAgdGVzdF90aW1lb3V0X3Jlc2V0ICgxMCk7CisgICAgICBmLT5uX2NhbGxlcl90aHJlYWRzID0gMjA7CisgICAgICBmLT5jYWxsc19wZXJfdGhyZWFkID0gMTAwMDA7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgdGVzdF90aW1lb3V0X3Jlc2V0ICgxKTsKKyAgICAgIGYtPm5fY2FsbGVyX3RocmVhZHMgPSA0OworICAgICAgZi0+Y2FsbHNfcGVyX3RocmVhZCA9IDEwMDA7CisgICAgfQorCisgIGYtPmNsaWVudF9jYWxsZXJfdGhyZWFkcyA9IGdfbmV3MCAoR1RocmVhZCAqLCBmLT5uX2NhbGxlcl90aHJlYWRzKTsKKyAgZi0+Y2FsbGVyc19yZW1haW5pbmcgPSBmLT5uX2NhbGxlcl90aHJlYWRzOworCisgIC8qIFN0YXJ0IHRoZSBjYWxsZXIgdGhyZWFkcyBvZmYgKi8KKworICBmb3IgKGkgPSAwOyBpIDwgZi0+bl9jYWxsZXJfdGhyZWFkczsgaSsrKQorICAgIHsKKyAgICAgIGdjaGFyICpuYW1lID0gZ19zdHJkdXBfcHJpbnRmICgiY2xpZW50ICUiIEdfR1NJWkVfRk9STUFULCBpKTsKKworICAgICAgZi0+Y2xpZW50X2NhbGxlcl90aHJlYWRzW2ldID0gZ190aHJlYWRfbmV3IChuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRfY2FsbGVyX3RocmVhZF9jYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZik7CisgICAgfQorCisgIC8qIFdhaXQgZm9yIGFsbCBjYWxsZXIgdGhyZWFkcyB0byBleGl0ICovCisKKyAgZ19tdXRleF9sb2NrICgmZi0+Y2FsbGVyc19yZW1haW5pbmdfbXV0ZXgpOworCisgIHdoaWxlIChmLT5jYWxsZXJzX3JlbWFpbmluZyA+IDApCisgICAgZ19jb25kX3dhaXQgKCZmLT5jYWxsZXJzX3JlbWFpbmluZ19jb25kLCAmZi0+Y2FsbGVyc19yZW1haW5pbmdfbXV0ZXgpOworCisgIGdfbXV0ZXhfdW5sb2NrICgmZi0+Y2FsbGVyc19yZW1haW5pbmdfbXV0ZXgpOworCisgIGZvciAoaSA9IDA7IGkgPCBmLT5uX2NhbGxlcl90aHJlYWRzOyBpKyspCisgICAgZ190aHJlYWRfam9pbiAoZ19zdGVhbF9wb2ludGVyICgmZi0+Y2xpZW50X2NhbGxlcl90aHJlYWRzW2ldKSk7CisKKyAgLyogSWYgd2UgaGF2ZW4ndCBjcmFzaGVkIG91dCB5ZXQsIHRoZW4gd2UncmUgZ29vZCEgKi8KK30KKworc3RhdGljIHZvaWQKK3RlYXJkb3duIChGaXh0dXJlICpmLAorICAgICAgICAgIGdjb25zdHBvaW50ZXIgY29udGV4dCBHX0dOVUNfVU5VU0VEKQoreworICBkYnVzX2Vycm9yX2ZyZWUgKCZmLT5lKTsKKyAgZ19jbGVhcl9lcnJvciAoJmYtPmdlKTsKKworICBpZiAoZi0+Y2xpZW50X2Nvbm4gIT0gTlVMTCkKKyAgICBkYnVzX2Nvbm5lY3Rpb25fY2xvc2UgKGYtPmNsaWVudF9jb25uKTsKKworICBpZiAoZi0+c2VydmljZV9jb25uICE9IE5VTEwpCisgICAgeworICAgICAgZGJ1c19jb25uZWN0aW9uX3JlbW92ZV9maWx0ZXIgKGYtPnNlcnZpY2VfY29ubiwgZWNob19maWx0ZXIsIGYpOworICAgICAgZGJ1c19jb25uZWN0aW9uX2Nsb3NlIChmLT5zZXJ2aWNlX2Nvbm4pOworICAgIH0KKworICAvKiBOb3cgdGhhdCB0aGUgY29ubmVjdGlvbnMgaGF2ZSBiZWVuIGNsb3NlZCwgdGhlIHRocmVhZHMgd2lsbCBleGl0ICovCisgIGlmIChmLT5zZXJ2aWNlX3RocmVhZCAhPSBOVUxMKQorICAgIGdfdGhyZWFkX2pvaW4gKGdfc3RlYWxfcG9pbnRlciAoJmYtPnNlcnZpY2VfdGhyZWFkKSk7CisKKyAgaWYgKGYtPmNsaWVudF9kaXNwYXRjaGVyX3RocmVhZCAhPSBOVUxMKQorICAgIGdfdGhyZWFkX2pvaW4gKGdfc3RlYWxfcG9pbnRlciAoJmYtPmNsaWVudF9kaXNwYXRjaGVyX3RocmVhZCkpOworCisgIGRidXNfY2xlYXJfY29ubmVjdGlvbiAoJmYtPnNlcnZpY2VfY29ubik7CisgIGRidXNfY2xlYXJfY29ubmVjdGlvbiAoJmYtPmNsaWVudF9jb25uKTsKKworICBpZiAoZi0+ZGFlbW9uX3BpZCAhPSAwKQorICAgIHsKKyAgICAgIHRlc3Rfa2lsbF9waWQgKGYtPmRhZW1vbl9waWQpOworICAgICAgZ19zcGF3bl9jbG9zZV9waWQgKGYtPmRhZW1vbl9waWQpOworICAgICAgZi0+ZGFlbW9uX3BpZCA9IDA7CisgICAgfQorCisgIGdfZnJlZSAoZi0+YWRkcmVzcyk7Cit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsCisgICAgY2hhciAqKmFyZ3YpCit7CisgIHRlc3RfaW5pdCAoJmFyZ2MsICZhcmd2KTsKKworICBnX3Rlc3RfYWRkICgiL3RocmVhZC1ibG9ja2luZyIsIEZpeHR1cmUsIE5VTEwsIHNldHVwLCB0ZXN0X3RocmVhZHMsCisgICAgICAgICAgICAgIHRlYXJkb3duKTsKKworICByZXR1cm4gZ190ZXN0X3J1biAoKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvdWlkLXBlcm1pc3Npb25zLmMgYi90ZXN0L3VpZC1wZXJtaXNzaW9ucy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5YTlhYTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VpZC1wZXJtaXNzaW9ucy5jCkBAIC0wLDAgKzEsMjc0IEBACisvKiBJbnRlZ3JhdGlvbiB0ZXN0cyBmb3IgdGhlIGRidXMtZGFlbW9uJ3MgdWlkLWJhc2VkIGhhcmRlbmluZworICoKKyAqIEF1dGhvcjogU2ltb24gTWNWaXR0aWUgPHNpbW9uLm1jdml0dGllQGNvbGxhYm9yYS5jby51az4KKyAqIENvcHlyaWdodCDCqSAyMDEwLTIwMTEgTm9raWEgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCDCqSAyMDE1IENvbGxhYm9yYSBMdGQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzCisgKiAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLAorICogaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwKKyAqIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsCisgKiBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAorICogc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKKyAqIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorCisjaW5jbHVkZSAidGVzdC11dGlscy1nbGliLmgiCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBnYm9vbGVhbiBza2lwOworCisgICAgVGVzdE1haW5Db250ZXh0ICpjdHg7CisKKyAgICBEQnVzRXJyb3IgZTsKKyAgICBHRXJyb3IgKmdlOworCisgICAgR1BpZCBkYWVtb25fcGlkOworCisgICAgREJ1c0Nvbm5lY3Rpb24gKmNvbm47Cit9IEZpeHR1cmU7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjb25zdCBjaGFyICpjb25maWdfZmlsZTsKKyAgICBUZXN0VXNlciB1c2VyOworICAgIGdib29sZWFuIGV4cGVjdF9zdWNjZXNzOworfSBDb25maWc7CisKK3N0YXRpYyB2b2lkCitzZXR1cCAoRml4dHVyZSAqZiwKKyAgICBnY29uc3Rwb2ludGVyIGNvbnRleHQpCit7CisgIGNvbnN0IENvbmZpZyAqY29uZmlnID0gY29udGV4dDsKKyAgZ2NoYXIgKmFkZHJlc3M7CisKKyAgZi0+Y3R4ID0gdGVzdF9tYWluX2NvbnRleHRfZ2V0ICgpOworICBmLT5nZSA9IE5VTEw7CisgIGRidXNfZXJyb3JfaW5pdCAoJmYtPmUpOworCisgIGFkZHJlc3MgPSB0ZXN0X2dldF9kYnVzX2RhZW1vbiAoY29uZmlnID8gY29uZmlnLT5jb25maWdfZmlsZSA6IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVTVF9VU0VSX01FU1NBR0VCVVMsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmYtPmRhZW1vbl9waWQpOworCisgIGlmIChhZGRyZXNzID09IE5VTEwpCisgICAgeworICAgICAgZi0+c2tpcCA9IFRSVUU7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGYtPmNvbm4gPSB0ZXN0X2Nvbm5lY3RfdG9fYnVzX2FzX3VzZXIgKGYtPmN0eCwgYWRkcmVzcywKKyAgICAgIGNvbmZpZyA/IGNvbmZpZy0+dXNlciA6IFRFU1RfVVNFUl9NRSk7CisKKyAgaWYgKGYtPmNvbm4gPT0gTlVMTCkKKyAgICBmLT5za2lwID0gVFJVRTsKKworICBnX2ZyZWUgKGFkZHJlc3MpOworfQorCitzdGF0aWMgdm9pZAordGVzdF91YWUgKEZpeHR1cmUgKmYsCisgICAgZ2NvbnN0cG9pbnRlciBjb250ZXh0KQoreworICBjb25zdCBDb25maWcgKmNvbmZpZyA9IGNvbnRleHQ7CisgIERCdXNNZXNzYWdlICptOworICBEQnVzUGVuZGluZ0NhbGwgKnBjOworICBEQnVzTWVzc2FnZUl0ZXIgYXJnc19pdGVyOworICBEQnVzTWVzc2FnZUl0ZXIgYXJyX2l0ZXI7CisKKyAgaWYgKGYtPnNraXApCisgICAgcmV0dXJuOworCisgIG0gPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsIChEQlVTX1NFUlZJQ0VfREJVUywKKyAgICAgIERCVVNfUEFUSF9EQlVTLCBEQlVTX0lOVEVSRkFDRV9EQlVTLCAiVXBkYXRlQWN0aXZhdGlvbkVudmlyb25tZW50Iik7CisKKyAgaWYgKG0gPT0gTlVMTCkKKyAgICBnX2Vycm9yICgiT09NIik7CisKKyAgZGJ1c19tZXNzYWdlX2l0ZXJfaW5pdF9hcHBlbmQgKG0sICZhcmdzX2l0ZXIpOworCisgIC8qIEFwcGVuZCBhbiBlbXB0eSBhe3NzfSAoc3RyaW5nID0+IHN0cmluZyBkaWN0aW9uYXJ5KS4gKi8KKyAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9vcGVuX2NvbnRhaW5lciAoJmFyZ3NfaXRlciwgREJVU19UWVBFX0FSUkFZLAorICAgICAgICAie3NzfSIsICZhcnJfaXRlcikgfHwKKyAgICAgICFkYnVzX21lc3NhZ2VfaXRlcl9jbG9zZV9jb250YWluZXIgKCZhcmdzX2l0ZXIsICZhcnJfaXRlcikpCisgICAgZ19lcnJvciAoIk9PTSIpOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX3NlbmRfd2l0aF9yZXBseSAoZi0+Y29ubiwgbSwgJnBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVElNRU9VVF9VU0VfREVGQVVMVCkgfHwKKyAgICAgIHBjID09IE5VTEwpCisgICAgZ19lcnJvciAoIk9PTSIpOworCisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisgIG0gPSBOVUxMOworCisgIGlmIChkYnVzX3BlbmRpbmdfY2FsbF9nZXRfY29tcGxldGVkIChwYykpCisgICAgdGVzdF9wZW5kaW5nX2NhbGxfc3RvcmVfcmVwbHkgKHBjLCAmbSk7CisgIGVsc2UgaWYgKCFkYnVzX3BlbmRpbmdfY2FsbF9zZXRfbm90aWZ5IChwYywgdGVzdF9wZW5kaW5nX2NhbGxfc3RvcmVfcmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbSwgTlVMTCkpCisgICAgZ19lcnJvciAoIk9PTSIpOworCisgIHdoaWxlIChtID09IE5VTEwpCisgICAgdGVzdF9tYWluX2NvbnRleHRfaXRlcmF0ZSAoZi0+Y3R4LCBUUlVFKTsKKworICBpZiAoY29uZmlnLT5leHBlY3Rfc3VjY2VzcykKKyAgICB7CisgICAgICAvKiBpdCBzdWNjZWVkcyAqLworICAgICAgZ19hc3NlcnRfY21waW50IChkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKG0pLCA9PSwKKyAgICAgICAgICBEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfUkVUVVJOKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBpdCBmYWlscywgeWllbGRpbmcgYW4gZXJyb3IgbWVzc2FnZSB3aXRoIG9uZSBzdHJpbmcgYXJndW1lbnQgKi8KKyAgICAgIGdfYXNzZXJ0X2NtcGludCAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtKSwgPT0sIERCVVNfTUVTU0FHRV9UWVBFX0VSUk9SKTsKKyAgICAgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9lcnJvcl9uYW1lIChtKSwgPT0sCisgICAgICAgICAgREJVU19FUlJPUl9BQ0NFU1NfREVOSUVEKTsKKyAgICAgIGdfYXNzZXJ0X2NtcHN0ciAoZGJ1c19tZXNzYWdlX2dldF9zaWduYXR1cmUgKG0pLCA9PSwgInMiKTsKKyAgICB9CisKKyAgZGJ1c19tZXNzYWdlX3VucmVmIChtKTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfbW9uaXRvciAoRml4dHVyZSAqZiwKKyAgICBnY29uc3Rwb2ludGVyIGNvbnRleHQpCit7CisgIGNvbnN0IENvbmZpZyAqY29uZmlnID0gY29udGV4dDsKKyAgREJ1c01lc3NhZ2UgKm07CisgIERCdXNQZW5kaW5nQ2FsbCAqcGM7CisgIERCdXNNZXNzYWdlSXRlciBhcmdzX2l0ZXI7CisgIERCdXNNZXNzYWdlSXRlciBhcnJfaXRlcjsKKyAgZGJ1c191aW50MzJfdCBub19mbGFncyA9IDA7CisKKyAgaWYgKGYtPnNraXApCisgICAgcmV0dXJuOworCisgIG0gPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsIChEQlVTX1NFUlZJQ0VfREJVUywKKyAgICAgIERCVVNfUEFUSF9EQlVTLCBEQlVTX0lOVEVSRkFDRV9NT05JVE9SSU5HLCAiQmVjb21lTW9uaXRvciIpOworCisgIGlmIChtID09IE5VTEwpCisgICAgZ19lcnJvciAoIk9PTSIpOworCisgIGRidXNfbWVzc2FnZV9pdGVyX2luaXRfYXBwZW5kIChtLCAmYXJnc19pdGVyKTsKKworICAvKiBBcHBlbmQgYW4gZW1wdHkgYXMgKHN0cmluZyBhcnJheSkuICovCisgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfb3Blbl9jb250YWluZXIgKCZhcmdzX2l0ZXIsIERCVVNfVFlQRV9BUlJBWSwKKyAgICAgICAgInMiLCAmYXJyX2l0ZXIpIHx8CisgICAgICAhZGJ1c19tZXNzYWdlX2l0ZXJfY2xvc2VfY29udGFpbmVyICgmYXJnc19pdGVyLCAmYXJyX2l0ZXIpIHx8CisgICAgICAhZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljICgmYXJnc19pdGVyLAorICAgICAgICBEQlVTX1RZUEVfVUlOVDMyLCAmbm9fZmxhZ3MpKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKworICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHkgKGYtPmNvbm4sIG0sICZwYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RJTUVPVVRfVVNFX0RFRkFVTFQpIHx8CisgICAgICBwYyA9PSBOVUxMKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG0pOworICBtID0gTlVMTDsKKworICBpZiAoZGJ1c19wZW5kaW5nX2NhbGxfZ2V0X2NvbXBsZXRlZCAocGMpKQorICAgIHRlc3RfcGVuZGluZ19jYWxsX3N0b3JlX3JlcGx5IChwYywgJm0pOworICBlbHNlIGlmICghZGJ1c19wZW5kaW5nX2NhbGxfc2V0X25vdGlmeSAocGMsIHRlc3RfcGVuZGluZ19jYWxsX3N0b3JlX3JlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm0sIE5VTEwpKQorICAgIGdfZXJyb3IgKCJPT00iKTsKKworICB3aGlsZSAobSA9PSBOVUxMKQorICAgIHRlc3RfbWFpbl9jb250ZXh0X2l0ZXJhdGUgKGYtPmN0eCwgVFJVRSk7CisKKyAgaWYgKGNvbmZpZy0+ZXhwZWN0X3N1Y2Nlc3MpCisgICAgeworICAgICAgLyogaXQgc3VjY2VlZHMgKi8KKyAgICAgIGdfYXNzZXJ0X2NtcGludCAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtKSwgPT0sCisgICAgICAgICAgREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX1JFVFVSTik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogaXQgZmFpbHMsIHlpZWxkaW5nIGFuIGVycm9yIG1lc3NhZ2Ugd2l0aCBvbmUgc3RyaW5nIGFyZ3VtZW50ICovCisgICAgICBnX2Fzc2VydF9jbXBpbnQgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAobSksID09LCBEQlVTX01FU1NBR0VfVFlQRV9FUlJPUik7CisgICAgICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfZXJyb3JfbmFtZSAobSksID09LAorICAgICAgICAgIERCVVNfRVJST1JfQUNDRVNTX0RFTklFRCk7CisgICAgICBnX2Fzc2VydF9jbXBzdHIgKGRidXNfbWVzc2FnZV9nZXRfc2lnbmF0dXJlIChtKSwgPT0sICJzIik7CisgICAgfQorCisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZWFyZG93biAoRml4dHVyZSAqZiwKKyAgICBnY29uc3Rwb2ludGVyIGNvbnRleHQgR19HTlVDX1VOVVNFRCkKK3sKKyAgZGJ1c19lcnJvcl9mcmVlICgmZi0+ZSk7CisgIGdfY2xlYXJfZXJyb3IgKCZmLT5nZSk7CisKKyAgaWYgKGYtPmNvbm4gIT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fY2xvc2UgKGYtPmNvbm4pOworICAgICAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChmLT5jb25uKTsKKyAgICAgIGYtPmNvbm4gPSBOVUxMOworICAgIH0KKworICBpZiAoZi0+ZGFlbW9uX3BpZCAhPSAwKQorICAgIHsKKyAgICAgIHRlc3Rfa2lsbF9waWQgKGYtPmRhZW1vbl9waWQpOworICAgICAgZ19zcGF3bl9jbG9zZV9waWQgKGYtPmRhZW1vbl9waWQpOworICAgICAgZi0+ZGFlbW9uX3BpZCA9IDA7CisgICAgfQorCisgIHRlc3RfbWFpbl9jb250ZXh0X3VucmVmIChmLT5jdHgpOworfQorCitzdGF0aWMgQ29uZmlnIHJvb3Rfb2tfY29uZmlnID0geworICAgICJ2YWxpZC1jb25maWctZmlsZXMvbXVsdGktdXNlci5jb25mIiwKKyAgICBURVNUX1VTRVJfUk9PVCwKKyAgICBUUlVFCit9OworCitzdGF0aWMgQ29uZmlnIG1lc3NhZ2VidXNfb2tfY29uZmlnID0geworICAgICJ2YWxpZC1jb25maWctZmlsZXMvbXVsdGktdXNlci5jb25mIiwKKyAgICBURVNUX1VTRVJfTUVTU0FHRUJVUywKKyAgICBUUlVFCit9OworCitzdGF0aWMgQ29uZmlnIG90aGVyX2ZhaWxfY29uZmlnID0geworICAgICJ2YWxpZC1jb25maWctZmlsZXMvbXVsdGktdXNlci5jb25mIiwKKyAgICBURVNUX1VTRVJfT1RIRVIsCisgICAgRkFMU0UKK307CisKK2ludAorbWFpbiAoaW50IGFyZ2MsCisgICAgY2hhciAqKmFyZ3YpCit7CisgIHRlc3RfaW5pdCAoJmFyZ2MsICZhcmd2KTsKKworICAvKiBVcGRhdGVBY3RpdmF0aW9uRW52aXJvbm1lbnQgdXNlZCB0byBiZSBhbGxvd2VkIGJ5IGRidXMtZGFlbW9uIGZvciByb290CisgICAqIGFuZCBtZXNzYWdlYnVzIGJ1dCBub3QgZm9yIG90aGVyIHVzZXJzIChhbHRob3VnaCBzeXN0ZW0uY29uZiBmb3JiaWRzIGl0CisgICAqIGZvciBldmVyeW9uZSwgYW5kIGl0J3MgdXNlbGVzcykuIEl0IGlzIG5vdyBoYXJkLWNvZGVkIHRvIGZhaWwgb24gYQorICAgKiBzeXN0ZW0gYnVzIGZvciBldmVyeW9uZSwgc28gZG9uJ3QgYXNzZXJ0IHRoYXQgcm9vdCBhbmQgbWVzc2FnZWJ1cworICAgKiBtYXkgY2FsbCBpdDsgY29udGludWUgdG8gYXNzZXJ0IHRoYXQgaXQgaXMgZGVuaWVkIGZvciB1bnByaXZpbGVnZWQKKyAgICogdXNlcnMgdGhvdWdoLiAqLworICBnX3Rlc3RfYWRkICgiL3VpZC1wZXJtaXNzaW9ucy91YWUvb3RoZXIiLCBGaXh0dXJlLCAmb3RoZXJfZmFpbF9jb25maWcsCisgICAgICBzZXR1cCwgdGVzdF91YWUsIHRlYXJkb3duKTsKKworICAvKiBCZWNvbWVNb25pdG9yIGhhcyB0aGUgYmVoYXZpb3VyIHRoYXQgVUFFIHVzZWQgdG8gaGF2ZS4gKi8KKyAgZ190ZXN0X2FkZCAoIi91aWQtcGVybWlzc2lvbnMvbW9uaXRvci9yb290IiwgRml4dHVyZSwgJnJvb3Rfb2tfY29uZmlnLAorICAgICAgc2V0dXAsIHRlc3RfbW9uaXRvciwgdGVhcmRvd24pOworICBnX3Rlc3RfYWRkICgiL3VpZC1wZXJtaXNzaW9ucy9tb25pdG9yL21lc3NhZ2VidXMiLCBGaXh0dXJlLCAmbWVzc2FnZWJ1c19va19jb25maWcsCisgICAgICBzZXR1cCwgdGVzdF9tb25pdG9yLCB0ZWFyZG93bik7CisgIGdfdGVzdF9hZGQgKCIvdWlkLXBlcm1pc3Npb25zL21vbml0b3Ivb3RoZXIiLCBGaXh0dXJlLCAmb3RoZXJfZmFpbF9jb25maWcsCisgICAgICBzZXR1cCwgdGVzdF9tb25pdG9yLCB0ZWFyZG93bik7CisKKyAgcmV0dXJuIGdfdGVzdF9ydW4gKCk7Cit9CmRpZmYgLS1naXQgYS90b29scy8uZ2l0aWdub3JlIGIvdG9vbHMvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTBkOTg3Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvLmdpdGlnbm9yZQpAQCAtMCwwICsxLDIyIEBACisuZGVwcworLmxpYnMKK01ha2VmaWxlCitNYWtlZmlsZS5pbgorKi5sbworKi5sYQorZGJ1cy1zZW5kCitkYnVzLW1vbml0b3IKK2RidXMtY2xlYW51cC1zb2NrZXRzCitkYnVzLWxhdW5jaAorZGJ1cy11dWlkZ2VuCitkYnVzLXJ1bi1zZXNzaW9uCisqLmJiCisqLmJiZworKi5nY292CisqLmRhCitkYnVzLXZpZXdlcgorZGJ1cy1nbGliLWJpbmRpbmdzLmgKK3J1bi13aXRoLXRtcC1zZXNzaW9uLWJ1cy5jb25mCitwcmludC1pbnRyb3NwZWN0CitkYnVzLWJ1cy1pbnRyb3NwZWN0LnhtbAorZGJ1cy10ZXN0LXRvb2wKZGlmZiAtLWdpdCBhL3Rvb2xzL0FuZHJvaWQubWsgYi90b29scy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1NzA2NjgKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNDkgQEAKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKKworZGJ1c1Rvb2xzQ29tbW9uQ0luY2x1ZGVzIDo9ICQoTE9DQUxfUEFUSCkvLi4KK2RidXNUb29sc0NvbW1vbkNGbGFncyA6PSBcCisJLUREQlVTX0NPTVBJTEFUSU9OIFwKKwktRERCVVNfTUFDSElORV9VVUlEX0ZJTEU9XCIvZXRjL21hY2hpbmUtaWRcIiBcCisJLVduby11bnVzZWQtcGFyYW1ldGVyCitkYnVzVG9vbHNDb21tb25TaGFyZWRMaWJyYXJpZXMgOj0gbGliZGJ1cworCisjIGNvbW1vbgorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgICAgICAgZGJ1cy1wcmludC1tZXNzYWdlLmMgXAorICAgICAgICBkYnVzLWVjaG8uYyBcCisgICAgICAgIGRidXMtc3BhbS5jIFwKKyAgICAgICAgdG9vbC1jb21tb24uYworTE9DQUxfQ19JTkNMVURFUyArPSAkKGRidXNUb29sc0NvbW1vbkNJbmNsdWRlcykKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gJChkYnVzVG9vbHNDb21tb25TaGFyZWRMaWJyYXJpZXMpCitMT0NBTF9DRkxBR1MgKz0gJChkYnVzVG9vbHNDb21tb25DRmxhZ3MpCitMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfT1BUSU9OQUxfRVhFQ1VUQUJMRVMpCitMT0NBTF9NT0RVTEUgOj0gbGliZGJ1cy10b29scy1jb21tb24KK2luY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKKworIyBkYnVzLW1vbml0b3IKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBkYnVzLW1vbml0b3IuYworTE9DQUxfQ19JTkNMVURFUyArPSAkKGRidXNUb29sc0NvbW1vbkNJbmNsdWRlcykKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gJChkYnVzVG9vbHNDb21tb25TaGFyZWRMaWJyYXJpZXMpCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTICs9IGxpYmRidXMtdG9vbHMtY29tbW9uCitMT0NBTF9DRkxBR1MgKz0gJChkYnVzVG9vbHNDb21tb25DRmxhZ3MpCitMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfT1BUSU9OQUxfRVhFQ1VUQUJMRVMpCitMT0NBTF9NT0RVTEUgOj0gZGJ1cy1tb25pdG9yCitpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKKworIyBkYnVzLXNlbmQKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBkYnVzLXNlbmQuYworTE9DQUxfQ19JTkNMVURFUyArPSAkKGRidXNUb29sc0NvbW1vbkNJbmNsdWRlcykKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gJChkYnVzVG9vbHNDb21tb25TaGFyZWRMaWJyYXJpZXMpCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTICs9IGxpYmRidXMtdG9vbHMtY29tbW9uCitMT0NBTF9DRkxBR1MgKz0gJChkYnVzVG9vbHNDb21tb25DRmxhZ3MpCitMT0NBTF9NT0RVTEUgOj0gZGJ1cy1zZW5kCitpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL3Rvb2xzL0dldEFsbE1hdGNoUnVsZXMucHkgYi90b29scy9HZXRBbGxNYXRjaFJ1bGVzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjZhN2U0Y2QKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9HZXRBbGxNYXRjaFJ1bGVzLnB5CkBAIC0wLDAgKzEsMTEyIEBACisjIS91c3IvYmluL2VudiBweXRob24KKworaW1wb3J0IHN5cworaW1wb3J0IGFyZ3BhcnNlCitpbXBvcnQgZGJ1cworaW1wb3J0IHRpbWUKKworZGVmIGdldF9jbWRsaW5lKHBpZCk6CisgIGNtZGxpbmUgPSAnJworICBpZiBwaWQgPiAwOgorICAgIHRyeToKKyAgICAgIHByb2NwYXRoID0gJy9wcm9jLycgKyBzdHIocGlkKSArICcvY21kbGluZScKKyAgICAgIHdpdGggb3Blbihwcm9jcGF0aCwgJ3InKSBhcyBmOgorICAgICAgICBjbWRsaW5lID0gIiAiLmpvaW4oZi5yZWFkbGluZSgpLnNwbGl0KCdcMCcpKQorICAgIGV4Y2VwdDoKKyAgICAgIHBhc3MKKyAgcmV0dXJuIGNtZGxpbmUKKworIyBQYXJzaW5nIHBhcmFtZXRlcnMKKworcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoZGVzY3JpcHRpb249J1Rlc3RpbmcgRC1CdXMgbWF0Y2ggcnVsZXMnKQorcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1zZXNzaW9uJywgaGVscD0nc2Vzc2lvbiBidXMnLCBhY3Rpb249InN0b3JlX3RydWUiKQorcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1zeXN0ZW0nLCBoZWxwPSdzeXN0ZW0gYnVzJywgYWN0aW9uPSJzdG9yZV90cnVlIikKK3BhcnNlci5hZGRfYXJndW1lbnQoJy0tYWxsJywgaGVscD0ncHJpbnQgYWxsIG1hdGNoIHJ1bGVzJywgYWN0aW9uPSJzdG9yZV90cnVlIikKK2FyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygpCisKK2lmIGFyZ3Muc3lzdGVtIGFuZCBhcmdzLnNlc3Npb246CisgIHBhcnNlci5wcmludF9oZWxwKCkKKyAgc3lzLmV4aXQoMSkKKworIyBGZXRjaCBkYXRhIGZyb20gdGhlIGJ1cyBkcml2ZXIKKworaWYgYXJncy5zeXN0ZW06CisgIGJ1cyA9IGRidXMuU3lzdGVtQnVzKCkKK2Vsc2U6CisgIGJ1cyA9IGRidXMuU2Vzc2lvbkJ1cygpCisKK3JlbW90ZV9vYmplY3QgPSBidXMuZ2V0X29iamVjdCgib3JnLmZyZWVkZXNrdG9wLkRCdXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvb3JnL2ZyZWVkZXNrdG9wL0RCdXMiKQorYnVzX2lmYWNlID0gZGJ1cy5JbnRlcmZhY2UocmVtb3RlX29iamVjdCwgIm9yZy5mcmVlZGVza3RvcC5EQnVzIikKK3N0YXRzX2lmYWNlID0gZGJ1cy5JbnRlcmZhY2UocmVtb3RlX29iamVjdCwgIm9yZy5mcmVlZGVza3RvcC5EQnVzLkRlYnVnLlN0YXRzIikKKwordHJ5OgorICBtYXRjaF9ydWxlcyA9IHN0YXRzX2lmYWNlLkdldEFsbE1hdGNoUnVsZXMoKQorZXhjZXB0OgorICBwcmludCgiR2V0Q29ubmVjdGlvbk1hdGNoUnVsZXMgZmFpbGVkOiBkaWQgeW91IGVuYWJsZSB0aGUgU3RhdHMgaW50ZXJmYWNlPyIpCisgIHN5cy5leGl0KDEpCisKK25hbWVzID0gYnVzX2lmYWNlLkxpc3ROYW1lcygpCit1bmlxdWVfbmFtZXMgPSBbIGEgZm9yIGEgaW4gbmFtZXMgaWYgYS5zdGFydHN3aXRoKCI6IikgXQorcGlkcyA9IGRpY3QoKG5hbWUsIGJ1c19pZmFjZS5HZXRDb25uZWN0aW9uVW5peFByb2Nlc3NJRChuYW1lKSkgZm9yIG5hbWUgaW4gdW5pcXVlX25hbWVzKQorY21kcyA9IGRpY3QoKG5hbWUsIGdldF9jbWRsaW5lKHBpZHNbbmFtZV0pKSBmb3IgbmFtZSBpbiB1bmlxdWVfbmFtZXMpCit3ZWxsX2tub3duX25hbWVzID0gWyBhIGZvciBhIGluIG5hbWVzIGlmIGEgbm90IGluIHVuaXF1ZV9uYW1lcyBdCitvd25lcnMgPSBkaWN0KCh3a24sIGJ1c19pZmFjZS5HZXROYW1lT3duZXIod2tuKSkgZm9yIHdrbiBpbiB3ZWxsX2tub3duX25hbWVzKQorCitydWxlcyA9IGRpY3QoKGtfcnVsZXMsCisgICAgICAgICAgICAgIGRpY3QoeworICAgICAgICAgICAgICAgICd3a24nOiBbayBmb3IgaywgdiBpbiBvd25lcnMuaXRlbXMoKSBpZiB2ID09IGtfcnVsZXNdLAorICAgICAgICAgICAgICAgICdwaWQnOiBwaWRzW2tfcnVsZXNdLAorICAgICAgICAgICAgICAgICdjbWQnOiBjbWRzW2tfcnVsZXNdIG9yICIiLAorICAgICAgICAgICAgICAgICdydWxlcyc6IHZfcnVsZXMsCisgICAgICAgICAgICAgICAgJ3dhcm5pbmdzJzogZGljdCh7CisgICAgICAgICAgICAgICAgICAnbm90X3NpZ25hbCc6IFthIGZvciBhIGluIHZfcnVsZXMgaWYgInR5cGU9J3NpZ25hbCciIG5vdCBpbiBhXSwKKyAgICAgICAgICAgICAgICAgICdub19zZW5kZXInOiBbYSBmb3IgYSBpbiB2X3J1bGVzIGlmICJzZW5kZXI9IiBub3QgaW4gYV0sCisgICAgICAgICAgICAgICAgICAnbG9jYWwnOiBbYSBmb3IgYSBpbiB2X3J1bGVzIGlmICJvcmcuZnJlZWRlc2t0b3AuREJ1cy5Mb2NhbCIgaW4gYV0sCisgICAgICAgICAgICAgICAgICAnTmFtZU93bmVyQ2hhbmdlZF9hcmcwJzogW2EgZm9yIGEgaW4gdl9ydWxlcyBpZiAibWVtYmVyPSdOYW1lT3duZXJDaGFuZ2VkJyIgaW4gYSBhbmQgImFyZzAiIG5vdCBpbiBhXQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgKSBmb3Iga19ydWxlcywgdl9ydWxlcyBpbiBtYXRjaF9ydWxlcy5pdGVtcygpKQorCit3YXJuaW5ncyA9IGRpY3QoeworICAgICAgICAgICAgICdub3Rfc2lnbmFsJzogJ01hdGNoIHJ1bGUgd2l0aG91dCBzZWxlY3Rpbmcgc2lnbmFscycsCisgICAgICAgICAgICAgJ25vX3NlbmRlcic6ICdNYXRjaCBydWxlIHdpdGhvdXQgYSBzZW5kZXIgY3JpdGVyaWEnLAorICAgICAgICAgICAgICdsb2NhbCc6ICdNYXRjaCBydWxlIG9uIHRoZSBvcmcuZnJlZWRlc2t0b3AuREJ1cy5Mb2NhbCBpbnRlcmZhY2UnLAorICAgICAgICAgICAgICdOYW1lT3duZXJDaGFuZ2VkX2FyZzAnOiAnTWF0Y2ggcnVsZSBvbiBOYW1lT3duZXJDaGFuZ2VkIHdpdGhvdXQgYSBhcmcwKiBjcml0ZXJpYScKKyAgICAgICAgICAgfSkKKworIyBQcmludCB0aGUgbWF0Y2ggcnVsZXMKKworIyBwcmludCBhbGwgbWF0Y2ggcnVsZXMgd2l0aG91dCBhbmFseXNpbmcgdGhlbQoraWYgYXJncy5hbGw6CisgIGZvciBuYW1lIGluIHJ1bGVzOgorICAgIHByaW50KCJDb25uZWN0aW9uICVzIHdpdGggcGlkICVkICclcycgKCVzKTogJWQgbWF0Y2ggcnVsZXMsICVkIHdhcm5pbmdzIgorICAgICAgICAgICUgKG5hbWUsIHJ1bGVzW25hbWVdWydwaWQnXSwgcnVsZXNbbmFtZV1bJ2NtZCddLAorICAgICAgICAgICAgICcgJy5qb2luKHJ1bGVzW25hbWVdWyd3a24nXSksIGxlbihydWxlc1tuYW1lXVsncnVsZXMnXSksCisgICAgICAgICAgICAgbGVuKHN1bShydWxlc1tuYW1lXVsnd2FybmluZ3MnXS52YWx1ZXMoKSwgW10pKSkpCisgICAgZm9yIHJ1bGUgaW4gcnVsZXNbbmFtZV1bJ3J1bGVzJ106CisgICAgICBwcmludCgiXHQlcyIgJSAocnVsZSkpCisgICAgcHJpbnQoIiIpCisgIHN5cy5leGl0KDApCisKKyMgYW5hbHlzZSBtYXRjaCBydWxlcyBhbmQgcHJpbnQgb25seSB0aGUgc3VzcGljaW91cyBvbmVzCitmb3IgY29ubixkYXRhIGluIHJ1bGVzLml0ZW1zKCk6CisgIHdhcm5pbmdzX2NvdW50ID0gbGVuKHN1bShkYXRhWyd3YXJuaW5ncyddLnZhbHVlcygpLCBbXSkpCisgIGlmIHdhcm5pbmdzX2NvdW50ID09IDA6CisgICAgY29udGludWUKKworICBwcmludCgiQ29ubmVjdGlvbiAlcyB3aXRoIHBpZCAlZCAnJXMnICglcyk6ICVkIG1hdGNoIHJ1bGVzLCAlZCB3YXJuaW5ncyIKKyAgICAgICAgJSAoY29ubiwgZGF0YVsncGlkJ10sIGRhdGFbJ2NtZCddLCAnICcuam9pbihkYXRhWyd3a24nXSksCisgICAgICAgICAgIGxlbihkYXRhWydydWxlcyddKSwgd2FybmluZ3NfY291bnQpKQorCisgIGZvciB3YXJuX2NvZGUscnVsZV9saXN0IGluIFsod2Fybl9jb2RlLHJ1bGVfbGlzdCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHdhcm5fY29kZSwgcnVsZV9saXN0IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIGRhdGFbJ3dhcm5pbmdzJ10uaXRlbXMoKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBsZW4ocnVsZV9saXN0KSA+IDBdOgorICAgIHByaW50KCIgICAtICVzOiIgJSAod2FybmluZ3Nbd2Fybl9jb2RlXSkpCisgICAgZm9yIHJ1bGUgaW4gcnVsZV9saXN0OgorICAgICAgcHJpbnQoIiAgICAgICAgIC0gJXMiICUgKHJ1bGUpKQorCisgIHByaW50KCIiKQorCitzeXMuZXhpdCgwKQpkaWZmIC0tZ2l0IGEvdG9vbHMvTWFrZWZpbGUuYW0gYi90b29scy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmNlNDM0Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwxMzkgQEAKK0FNX0NQUEZMQUdTID0gXAorCS1JJCh0b3Bfc3JjZGlyKSBcCisJJChEQlVTX1NUQVRJQ19CVUlMRF9DUFBGTEFHUykgXAorCSQoREJVU19YX0NGTEFHUykgXAorCS1EREJVU19DT01QSUxBVElPTiBcCisJLUREQlVTX01BQ0hJTkVfVVVJRF9GSUxFPVwiIiQobG9jYWxzdGF0ZWRpcikvbGliL2RidXMvbWFjaGluZS1pZCJcIiBcCisJJChOVUxMKQorCitBTV9DRkxBR1MgPSBcCisJJChDT0RFX0NPVkVSQUdFX0NGTEFHUykgXAorCSQoTlVMTCkKKworIyBpZiBhc3NlcnRpb25zIGFyZSBlbmFibGVkLCBpbXByb3ZlIGJhY2t0cmFjZXMKK0FNX0xERkxBR1MgPSBAUl9EWU5BTUlDX0xERkxBR0AKKworYmluX1BST0dSQU1TID0gXAorCWRidXMtbGF1bmNoIFwKKwlkYnVzLW1vbml0b3IgXAorCWRidXMtc2VuZCBcCisJZGJ1cy10ZXN0LXRvb2wgXAorCWRidXMtdXBkYXRlLWFjdGl2YXRpb24tZW52aXJvbm1lbnQgXAorCSQoTlVMTCkKKworaWYgREJVU19VTklYCitiaW5fUFJPR1JBTVMgKz0gXAorCWRidXMtY2xlYW51cC1zb2NrZXRzIFwKKwlkYnVzLXJ1bi1zZXNzaW9uIFwKKwlkYnVzLXV1aWRnZW4gXAorCSQoTlVMTCkKK2VuZGlmCisKK2RidXNfc2VuZF9TT1VSQ0VTPQkJCQlcCisJZGJ1cy1wcmludC1tZXNzYWdlLmMJCQlcCisJZGJ1cy1wcmludC1tZXNzYWdlLmgJCQlcCisJZGJ1cy1zZW5kLmMgXAorCXRvb2wtY29tbW9uLmMgXAorCXRvb2wtY29tbW9uLmggXAorCSQoTlVMTCkKKworZGJ1c19tb25pdG9yX1NPVVJDRVMgPSBcCisJZGJ1cy1tb25pdG9yLmMgXAorCWRidXMtcHJpbnQtbWVzc2FnZS5jIFwKKwlkYnVzLXByaW50LW1lc3NhZ2UuaCBcCisJdG9vbC1jb21tb24uYyBcCisJdG9vbC1jb21tb24uaCBcCisJJChOVUxMKQorCitpZiBEQlVTX1dJTgorZGJ1c19sYXVuY2hfU09VUkNFUz0JCQkJXAorCWRidXMtbGF1bmNoLXdpbi5jCQkJXAorCWRidXMtbGF1bmNoLmgKK2Vsc2UKK2RidXNfbGF1bmNoX1NPVVJDRVM9CQkJCVwKKwlkYnVzLWxhdW5jaC5jCQkJCVwKKwlkYnVzLWxhdW5jaC14MTEuYwkJCVwKKwlkYnVzLWxhdW5jaC5oIFwKKwl0b29sLWNvbW1vbi5jIFwKKwl0b29sLWNvbW1vbi5oIFwKKwkkKE5VTEwpCitkYnVzX2xhdW5jaF9DUFBGTEFHUyA9IFwKKwkkKEFNX0NQUEZMQUdTKSBcCisJJChOVUxMKQorZGJ1c19sYXVuY2hfTERBREQgPSBcCisJJCh0b3BfYnVpbGRkaXIpL2RidXMvbGliZGJ1cy0xLmxhIFwKKwkkKERCVVNfWF9MSUJTKSBcCisJJChOVUxMKQorCitkYnVzX3J1bl9zZXNzaW9uX1NPVVJDRVMgPQkJCVwKKwlkYnVzLXJ1bi1zZXNzaW9uLmMKKworZGJ1c19ydW5fc2Vzc2lvbl9MREFERCA9IFwKKwkkKHRvcF9idWlsZGRpcikvZGJ1cy9saWJkYnVzLTEubGEgXAorCSQoTlVMTCkKK2VuZGlmCisKK2RidXNfY2xlYW51cF9zb2NrZXRzX1NPVVJDRVM9CQkJXAorCWRidXMtY2xlYW51cC1zb2NrZXRzLmMKKworZGJ1c191dWlkZ2VuX1NPVVJDRVM9CQkJCVwKKwlkYnVzLXV1aWRnZW4uYworCitkYnVzX3NlbmRfTERBREQgPSBcCisJJCh0b3BfYnVpbGRkaXIpL2RidXMvbGliZGJ1cy0xLmxhIFwKKwkkKE5VTEwpCisKK2RidXNfbW9uaXRvcl9MREFERCA9IFwKKwkkKHRvcF9idWlsZGRpcikvZGJ1cy9saWJkYnVzLTEubGEgXAorCSQoTkVUV09SS19saWJzKSBcCisJJChOVUxMKQorCitkYnVzX3V1aWRnZW5fTERBREQgPSBcCisJJCh0b3BfYnVpbGRkaXIpL2RidXMvbGliZGJ1cy0xLmxhIFwKKwkkKE5VTEwpCisKK2V4YW1wbGVzZGlyID0gJHtkb2NkaXJ9L2V4YW1wbGVzCitkaXN0X2V4YW1wbGVzX1NDUklQVFMgPSBcCisJR2V0QWxsTWF0Y2hSdWxlcy5weSBcCisJJChOVUxMKQorCitkYnVzX3Rlc3RfdG9vbF9TT1VSQ0VTID0gXAorCWRidXMtZWNoby5jIFwKKwlkYnVzLXNwYW0uYyBcCisJdG9vbC1jb21tb24uYyBcCisJdG9vbC1jb21tb24uaCBcCisJdGVzdC10b29sLmMgXAorCXRlc3QtdG9vbC5oIFwKKwkkKE5VTEwpCitkYnVzX3Rlc3RfdG9vbF9MREFERCA9ICQodG9wX2J1aWxkZGlyKS9kYnVzL2xpYmRidXMtMS5sYQorCitkYnVzX3VwZGF0ZV9hY3RpdmF0aW9uX2Vudmlyb25tZW50X1NPVVJDRVMgPSBcCisJZGJ1cy11cGRhdGUtYWN0aXZhdGlvbi1lbnZpcm9ubWVudC5jIFwKKwl0b29sLWNvbW1vbi5jIFwKKwl0b29sLWNvbW1vbi5oIFwKKwkkKE5VTEwpCitkYnVzX3VwZGF0ZV9hY3RpdmF0aW9uX2Vudmlyb25tZW50X0xEQUREID0gJCh0b3BfYnVpbGRkaXIpL2RidXMvbGliZGJ1cy0xLmxhCisKK2lmIERCVVNfV0lOCitTVUZGSVhFUyA9IC5yYworCisucmMubzoKKwkkKFJDKSAkPCAtbyAkQAorCitub2Rpc3RfZGJ1c191cGRhdGVfYWN0aXZhdGlvbl9lbnZpcm9ubWVudF9TT1VSQ0VTID0gZGlzYWJsZS11YWMucmMKKworZGlzYWJsZS11YWMucmM6IFdpbjMyLk1hbmlmZXN0CisJZWNobyAnMSAyNCAiJDwiJyA+ICRACitlbmRpZgorCitFWFRSQV9ESVNUID0gcnVuLXdpdGgtdG1wLXNlc3Npb24tYnVzLnNoIHN0cnRvbGwuYyBzdHJ0b3VsbC5jIFdpbjMyLk1hbmlmZXN0CitDTEVBTkZJTEVTID0gCQkJCVwKKwlydW4td2l0aC10bXAtc2Vzc2lvbi1idXMuY29uZiBcCisJJChub2Rpc3RfZGJ1c191cGRhdGVfYWN0aXZhdGlvbl9lbnZpcm9ubWVudF9TT1VSQ0VTKQorCisjIGNyZWF0ZSB0aGUgL3Zhci9saWIvZGJ1cyBkaXJlY3RvcnkgZm9yIGRidXMtdXVpZGdlbgoraW5zdGFsbC1kYXRhLWxvY2FsOgorCSQoTUtESVJfUCkgJChERVNURElSKSQobG9jYWxzdGF0ZWRpcikvbGliL2RidXMKKworaW5zdGFsbGNoZWNrLWxvY2FsOgorCXRlc3QgLWQgJChERVNURElSKSQobG9jYWxzdGF0ZWRpcikvbGliL2RidXMKZGlmZiAtLWdpdCBhL3Rvb2xzL05PVElDRSBiL3Rvb2xzL05PVElDRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTFjYTFkCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvTk9USUNFCkBAIC0wLDAgKzEsNTUxIEBACitELUJ1cyBpcyBsaWNlbnNlZCB0byB5b3UgdW5kZXIgeW91ciBjaG9pY2Ugb2YgdGhlIEFjYWRlbWljIEZyZWUKK0xpY2Vuc2UgdmVyc2lvbiAyLjEsIG9yIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuCitCb3RoIGxpY2Vuc2VzIGFyZSBpbmNsdWRlZCBoZXJlLiBTb21lIG9mIHRoZSBzdGFuZGFsb25lIGJpbmFyaWVzIGFyZQordW5kZXIgdGhlIEdQTCBvbmx5OyBpbiBwYXJ0aWN1bGFyLCBidXQgbm90IGxpbWl0ZWQgdG8sCit0b29scy9kYnVzLWNsZWFudXAtc29ja2V0cy5jIGFuZCB0ZXN0L2RlY29kZS1nY292LmMuIEVhY2ggc291cmNlIGNvZGUKK2ZpbGUgaXMgbWFya2VkIHdpdGggdGhlIHByb3BlciBjb3B5cmlnaHQgaW5mb3JtYXRpb24gLSBpZiB5b3UgZmluZCBhCitmaWxlIHRoYXQgaXNuJ3QgbWFya2VkIHBsZWFzZSBicmluZyBpdCB0byBvdXIgYXR0ZW50aW9uLgorCisKK1RoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UKK3YuIDIuMQorCitUaGlzIEFjYWRlbWljIEZyZWUgTGljZW5zZSAodGhlICJMaWNlbnNlIikgYXBwbGllcyB0byBhbnkgb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwICh0aGUgIk9yaWdpbmFsIFdvcmsiKSB3aG9zZSBvd25lciAodGhlICJMaWNlbnNvciIpIGhhcyBwbGFjZWQgdGhlIGZvbGxvd2luZyBub3RpY2UgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciB0aGUgT3JpZ2luYWwgV29yazoKKworTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorCisxKSBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gTGljZW5zb3IgaGVyZWJ5IGdyYW50cyBZb3UgYQord29ybGQtd2lkZSwgcm95YWx0eS1mcmVlLCBub24tZXhjbHVzaXZlLCBwZXJwZXR1YWwsIHN1YmxpY2Vuc2VhYmxlCitsaWNlbnNlIHRvIGRvIHRoZSBmb2xsb3dpbmc6CisKK2EpIHRvIHJlcHJvZHVjZSB0aGUgT3JpZ2luYWwgV29yayBpbiBjb3BpZXM7CisKK2IpIHRvIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyAoIkRlcml2YXRpdmUgV29ya3MiKSBiYXNlZCB1cG9uIHRoZSBPcmlnaW5hbCBXb3JrOworCitjKSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgT3JpZ2luYWwgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0byB0aGUgcHVibGljOworCitkKSB0byBwZXJmb3JtIHRoZSBPcmlnaW5hbCBXb3JrIHB1YmxpY2x5OyBhbmQKKworZSkgdG8gZGlzcGxheSB0aGUgT3JpZ2luYWwgV29yayBwdWJsaWNseS4KKworMikgR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIExpY2Vuc29yIGhlcmVieSBncmFudHMgWW91IGEgd29ybGQtd2lkZSwKK3JveWFsdHktZnJlZSwgbm9uLWV4Y2x1c2l2ZSwgcGVycGV0dWFsLCBzdWJsaWNlbnNlYWJsZSBsaWNlbnNlLCB1bmRlcgorcGF0ZW50IGNsYWltcyBvd25lZCBvciBjb250cm9sbGVkIGJ5IHRoZSBMaWNlbnNvciB0aGF0IGFyZSBlbWJvZGllZCBpbgordGhlIE9yaWdpbmFsIFdvcmsgYXMgZnVybmlzaGVkIGJ5IHRoZSBMaWNlbnNvciwgdG8gbWFrZSwgdXNlLCBzZWxsIGFuZAorb2ZmZXIgZm9yIHNhbGUgdGhlIE9yaWdpbmFsIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MuCisKKzMpIEdyYW50IG9mIFNvdXJjZSBDb2RlIExpY2Vuc2UuIFRoZSB0ZXJtICJTb3VyY2UgQ29kZSIgbWVhbnMgdGhlCitwcmVmZXJyZWQgZm9ybSBvZiB0aGUgT3JpZ2luYWwgV29yayBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQgYW5kCithbGwgYXZhaWxhYmxlIGRvY3VtZW50YXRpb24gZGVzY3JpYmluZyBob3cgdG8gbW9kaWZ5IHRoZSBPcmlnaW5hbAorV29yay4gTGljZW5zb3IgaGVyZWJ5IGFncmVlcyB0byBwcm92aWRlIGEgbWFjaGluZS1yZWFkYWJsZSBjb3B5IG9mIHRoZQorU291cmNlIENvZGUgb2YgdGhlIE9yaWdpbmFsIFdvcmsgYWxvbmcgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIE9yaWdpbmFsCitXb3JrIHRoYXQgTGljZW5zb3IgZGlzdHJpYnV0ZXMuIExpY2Vuc29yIHJlc2VydmVzIHRoZSByaWdodCB0byBzYXRpc2Z5Cit0aGlzIG9ibGlnYXRpb24gYnkgcGxhY2luZyBhIG1hY2hpbmUtcmVhZGFibGUgY29weSBvZiB0aGUgU291cmNlIENvZGUKK2luIGFuIGluZm9ybWF0aW9uIHJlcG9zaXRvcnkgcmVhc29uYWJseSBjYWxjdWxhdGVkIHRvIHBlcm1pdAoraW5leHBlbnNpdmUgYW5kIGNvbnZlbmllbnQgYWNjZXNzIGJ5IFlvdSBmb3IgYXMgbG9uZyBhcyBMaWNlbnNvcgorY29udGludWVzIHRvIGRpc3RyaWJ1dGUgdGhlIE9yaWdpbmFsIFdvcmssIGFuZCBieSBwdWJsaXNoaW5nIHRoZQorYWRkcmVzcyBvZiB0aGF0IGluZm9ybWF0aW9uIHJlcG9zaXRvcnkgaW4gYSBub3RpY2UgaW1tZWRpYXRlbHkKK2ZvbGxvd2luZyB0aGUgY29weXJpZ2h0IG5vdGljZSB0aGF0IGFwcGxpZXMgdG8gdGhlIE9yaWdpbmFsIFdvcmsuCisKKzQpIEV4Y2x1c2lvbnMgRnJvbSBMaWNlbnNlIEdyYW50LiBOZWl0aGVyIHRoZSBuYW1lcyBvZiBMaWNlbnNvciwgbm9yCit0aGUgbmFtZXMgb2YgYW55IGNvbnRyaWJ1dG9ycyB0byB0aGUgT3JpZ2luYWwgV29yaywgbm9yIGFueSBvZiB0aGVpcgordHJhZGVtYXJrcyBvciBzZXJ2aWNlIG1hcmtzLCBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKK3Byb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIE9yaWdpbmFsIFdvcmsgd2l0aG91dCBleHByZXNzIHByaW9yIHdyaXR0ZW4KK3Blcm1pc3Npb24gb2YgdGhlIExpY2Vuc29yLiBOb3RoaW5nIGluIHRoaXMgTGljZW5zZSBzaGFsbCBiZSBkZWVtZWQgdG8KK2dyYW50IGFueSByaWdodHMgdG8gdHJhZGVtYXJrcywgY29weXJpZ2h0cywgcGF0ZW50cywgdHJhZGUgc2VjcmV0cyBvcgorYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBMaWNlbnNvciBleGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAoraGVyZWluLiBObyBwYXRlbnQgbGljZW5zZSBpcyBncmFudGVkIHRvIG1ha2UsIHVzZSwgc2VsbCBvciBvZmZlciB0bworc2VsbCBlbWJvZGltZW50cyBvZiBhbnkgcGF0ZW50IGNsYWltcyBvdGhlciB0aGFuIHRoZSBsaWNlbnNlZCBjbGFpbXMKK2RlZmluZWQgaW4gU2VjdGlvbiAyLiBObyByaWdodCBpcyBncmFudGVkIHRvIHRoZSB0cmFkZW1hcmtzIG9mCitMaWNlbnNvciBldmVuIGlmIHN1Y2ggbWFya3MgYXJlIGluY2x1ZGVkIGluIHRoZSBPcmlnaW5hbCBXb3JrLiBOb3RoaW5nCitpbiB0aGlzIExpY2Vuc2Ugc2hhbGwgYmUgaW50ZXJwcmV0ZWQgdG8gcHJvaGliaXQgTGljZW5zb3IgZnJvbQorbGljZW5zaW5nIHVuZGVyIGRpZmZlcmVudCB0ZXJtcyBmcm9tIHRoaXMgTGljZW5zZSBhbnkgT3JpZ2luYWwgV29yawordGhhdCBMaWNlbnNvciBvdGhlcndpc2Ugd291bGQgaGF2ZSBhIHJpZ2h0IHRvIGxpY2Vuc2UuCisKKzUpIFRoaXMgc2VjdGlvbiBpbnRlbnRpb25hbGx5IG9taXR0ZWQuCisKKzYpIEF0dHJpYnV0aW9uIFJpZ2h0cy4gWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIENvZGUgb2YgYW55CitEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGNyZWF0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50IG9yIHRyYWRlbWFyaworbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgQ29kZSBvZiB0aGUgT3JpZ2luYWwgV29yaywgYXMgd2VsbCBhcyBhbnkKK25vdGljZXMgb2YgbGljZW5zaW5nIGFuZCBhbnkgZGVzY3JpcHRpdmUgdGV4dCBpZGVudGlmaWVkIHRoZXJlaW4gYXMgYW4KKyJBdHRyaWJ1dGlvbiBOb3RpY2UuIiBZb3UgbXVzdCBjYXVzZSB0aGUgU291cmNlIENvZGUgZm9yIGFueQorRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBjcmVhdGUgdG8gY2FycnkgYSBwcm9taW5lbnQgQXR0cmlidXRpb24KK05vdGljZSByZWFzb25hYmx5IGNhbGN1bGF0ZWQgdG8gaW5mb3JtIHJlY2lwaWVudHMgdGhhdCBZb3UgaGF2ZQorbW9kaWZpZWQgdGhlIE9yaWdpbmFsIFdvcmsuCisKKzcpIFdhcnJhbnR5IG9mIFByb3ZlbmFuY2UgYW5kIERpc2NsYWltZXIgb2YgV2FycmFudHkuIExpY2Vuc29yCit3YXJyYW50cyB0aGF0IHRoZSBjb3B5cmlnaHQgaW4gYW5kIHRvIHRoZSBPcmlnaW5hbCBXb3JrIGFuZCB0aGUgcGF0ZW50CityaWdodHMgZ3JhbnRlZCBoZXJlaW4gYnkgTGljZW5zb3IgYXJlIG93bmVkIGJ5IHRoZSBMaWNlbnNvciBvciBhcmUKK3N1YmxpY2Vuc2VkIHRvIFlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIHdpdGggdGhlIHBlcm1pc3Npb24KK29mIHRoZSBjb250cmlidXRvcihzKSBvZiB0aG9zZSBjb3B5cmlnaHRzIGFuZCBwYXRlbnQgcmlnaHRzLiBFeGNlcHQgYXMKK2V4cHJlc3NseSBzdGF0ZWQgaW4gdGhlIGltbWVkaWF0ZWx5IHByb2NlZWRpbmcgc2VudGVuY2UsIHRoZSBPcmlnaW5hbAorV29yayBpcyBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2Ugb24gYW4gIkFTIElTIiBCQVNJUyBhbmQgV0lUSE9VVAorV0FSUkFOVFksIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLAordGhlIHdhcnJhbnRpZXMgb2YgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKK1BBUlRJQ1VMQVIgUFVSUE9TRS4gVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIE9GIFRIRSBPUklHSU5BTAorV09SSyBJUyBXSVRIIFlPVS4gVGhpcyBESVNDTEFJTUVSIE9GIFdBUlJBTlRZIGNvbnN0aXR1dGVzIGFuIGVzc2VudGlhbAorcGFydCBvZiB0aGlzIExpY2Vuc2UuIE5vIGxpY2Vuc2UgdG8gT3JpZ2luYWwgV29yayBpcyBncmFudGVkIGhlcmV1bmRlcgorZXhjZXB0IHVuZGVyIHRoaXMgZGlzY2xhaW1lci4KKworOCkgTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIFVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgYW5kIHVuZGVyIG5vIGxlZ2FsCit0aGVvcnksIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3IKK290aGVyd2lzZSwgc2hhbGwgdGhlIExpY2Vuc29yIGJlIGxpYWJsZSB0byBhbnkgcGVyc29uIGZvciBhbnkgZGlyZWN0LAoraW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkKK2NoYXJhY3RlciBhcmlzaW5nIGFzIGEgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciB0aGUgdXNlIG9mIHRoZQorT3JpZ2luYWwgV29yayBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgZGFtYWdlcyBmb3IgbG9zcyBvZgorZ29vZHdpbGwsIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQKK2FsbCBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzLiBUaGlzIGxpbWl0YXRpb24gb2YgbGlhYmlsaXR5CitzaGFsbCBub3QgYXBwbHkgdG8gbGlhYmlsaXR5IGZvciBkZWF0aCBvciBwZXJzb25hbCBpbmp1cnkgcmVzdWx0aW5nCitmcm9tIExpY2Vuc29yJ3MgbmVnbGlnZW5jZSB0byB0aGUgZXh0ZW50IGFwcGxpY2FibGUgbGF3IHByb2hpYml0cyBzdWNoCitsaW1pdGF0aW9uLiBTb21lIGp1cmlzZGljdGlvbnMgZG8gbm90IGFsbG93IHRoZSBleGNsdXNpb24gb3IKK2xpbWl0YXRpb24gb2YgaW5jaWRlbnRhbCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHNvIHRoaXMgZXhjbHVzaW9uCithbmQgbGltaXRhdGlvbiBtYXkgbm90IGFwcGx5IHRvIFlvdS4KKworOSkgQWNjZXB0YW5jZSBhbmQgVGVybWluYXRpb24uIElmIFlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKK09yaWdpbmFsIFdvcmsgb3IgYSBEZXJpdmF0aXZlIFdvcmssIFlvdSBtdXN0IG1ha2UgYSByZWFzb25hYmxlIGVmZm9ydAordW5kZXIgdGhlIGNpcmN1bXN0YW5jZXMgdG8gb2J0YWluIHRoZSBleHByZXNzIGFzc2VudCBvZiByZWNpcGllbnRzIHRvCit0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLiBOb3RoaW5nIGVsc2UgYnV0IHRoaXMgTGljZW5zZSAob3IgYW5vdGhlcgord3JpdHRlbiBhZ3JlZW1lbnQgYmV0d2VlbiBMaWNlbnNvciBhbmQgWW91KSBncmFudHMgWW91IHBlcm1pc3Npb24gdG8KK2NyZWF0ZSBEZXJpdmF0aXZlIFdvcmtzIGJhc2VkIHVwb24gdGhlIE9yaWdpbmFsIFdvcmsgb3IgdG8gZXhlcmNpc2UKK2FueSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQgaW4gU2VjdGlvbiAxIGhlcmVpbiwgYW5kIGFueSBhdHRlbXB0IHRvIGRvCitzbyBleGNlcHQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSAob3IgYW5vdGhlciB3cml0dGVuCithZ3JlZW1lbnQgYmV0d2VlbiBMaWNlbnNvciBhbmQgWW91KSBpcyBleHByZXNzbHkgcHJvaGliaXRlZCBieQorVS5TLiBjb3B5cmlnaHQgbGF3LCB0aGUgZXF1aXZhbGVudCBsYXdzIG9mIG90aGVyIGNvdW50cmllcywgYW5kIGJ5CitpbnRlcm5hdGlvbmFsIHRyZWF0eS4gVGhlcmVmb3JlLCBieSBleGVyY2lzaW5nIGFueSBvZiB0aGUgcmlnaHRzCitncmFudGVkIHRvIFlvdSBpbiBTZWN0aW9uIDEgaGVyZWluLCBZb3UgaW5kaWNhdGUgWW91ciBhY2NlcHRhbmNlIG9mCit0aGlzIExpY2Vuc2UgYW5kIGFsbCBvZiBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMuCisKKzEwKSBUZXJtaW5hdGlvbiBmb3IgUGF0ZW50IEFjdGlvbi4gVGhpcyBMaWNlbnNlIHNoYWxsIHRlcm1pbmF0ZQorYXV0b21hdGljYWxseSBhbmQgWW91IG1heSBubyBsb25nZXIgZXhlcmNpc2UgYW55IG9mIHRoZSByaWdodHMgZ3JhbnRlZAordG8gWW91IGJ5IHRoaXMgTGljZW5zZSBhcyBvZiB0aGUgZGF0ZSBZb3UgY29tbWVuY2UgYW4gYWN0aW9uLAoraW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltLCBhZ2FpbnN0IExpY2Vuc29yIG9yIGFueQorbGljZW5zZWUgYWxsZWdpbmcgdGhhdCB0aGUgT3JpZ2luYWwgV29yayBpbmZyaW5nZXMgYSBwYXRlbnQuIFRoaXMKK3Rlcm1pbmF0aW9uIHByb3Zpc2lvbiBzaGFsbCBub3QgYXBwbHkgZm9yIGFuIGFjdGlvbiBhbGxlZ2luZyBwYXRlbnQKK2luZnJpbmdlbWVudCBieSBjb21iaW5hdGlvbnMgb2YgdGhlIE9yaWdpbmFsIFdvcmsgd2l0aCBvdGhlciBzb2Z0d2FyZQorb3IgaGFyZHdhcmUuCisKKzExKSBKdXJpc2RpY3Rpb24sIFZlbnVlIGFuZCBHb3Zlcm5pbmcgTGF3LiBBbnkgYWN0aW9uIG9yIHN1aXQgcmVsYXRpbmcKK3RvIHRoaXMgTGljZW5zZSBtYXkgYmUgYnJvdWdodCBvbmx5IGluIHRoZSBjb3VydHMgb2YgYSBqdXJpc2RpY3Rpb24KK3doZXJlaW4gdGhlIExpY2Vuc29yIHJlc2lkZXMgb3IgaW4gd2hpY2ggTGljZW5zb3IgY29uZHVjdHMgaXRzIHByaW1hcnkKK2J1c2luZXNzLCBhbmQgdW5kZXIgdGhlIGxhd3Mgb2YgdGhhdCBqdXJpc2RpY3Rpb24gZXhjbHVkaW5nIGl0cworY29uZmxpY3Qtb2YtbGF3IHByb3Zpc2lvbnMuIFRoZSBhcHBsaWNhdGlvbiBvZiB0aGUgVW5pdGVkIE5hdGlvbnMKK0NvbnZlbnRpb24gb24gQ29udHJhY3RzIGZvciB0aGUgSW50ZXJuYXRpb25hbCBTYWxlIG9mIEdvb2RzIGlzCitleHByZXNzbHkgZXhjbHVkZWQuIEFueSB1c2Ugb2YgdGhlIE9yaWdpbmFsIFdvcmsgb3V0c2lkZSB0aGUgc2NvcGUgb2YKK3RoaXMgTGljZW5zZSBvciBhZnRlciBpdHMgdGVybWluYXRpb24gc2hhbGwgYmUgc3ViamVjdCB0byB0aGUKK3JlcXVpcmVtZW50cyBhbmQgcGVuYWx0aWVzIG9mIHRoZSBVLlMuIENvcHlyaWdodCBBY3QsIDE3IFUuUy5DLiDDgsKnIDEwMQorZXQgc2VxLiwgdGhlIGVxdWl2YWxlbnQgbGF3cyBvZiBvdGhlciBjb3VudHJpZXMsIGFuZCBpbnRlcm5hdGlvbmFsCit0cmVhdHkuIFRoaXMgc2VjdGlvbiBzaGFsbCBzdXJ2aXZlIHRoZSB0ZXJtaW5hdGlvbiBvZiB0aGlzIExpY2Vuc2UuCisKKzEyKSBBdHRvcm5leXMgRmVlcy4gSW4gYW55IGFjdGlvbiB0byBlbmZvcmNlIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UKK29yIHNlZWtpbmcgZGFtYWdlcyByZWxhdGluZyB0aGVyZXRvLCB0aGUgcHJldmFpbGluZyBwYXJ0eSBzaGFsbCBiZQorZW50aXRsZWQgdG8gcmVjb3ZlciBpdHMgY29zdHMgYW5kIGV4cGVuc2VzLCBpbmNsdWRpbmcsIHdpdGhvdXQKK2xpbWl0YXRpb24sIHJlYXNvbmFibGUgYXR0b3JuZXlzJyBmZWVzIGFuZCBjb3N0cyBpbmN1cnJlZCBpbgorY29ubmVjdGlvbiB3aXRoIHN1Y2ggYWN0aW9uLCBpbmNsdWRpbmcgYW55IGFwcGVhbCBvZiBzdWNoIGFjdGlvbi4gVGhpcworc2VjdGlvbiBzaGFsbCBzdXJ2aXZlIHRoZSB0ZXJtaW5hdGlvbiBvZiB0aGlzIExpY2Vuc2UuCisKKzEzKSBNaXNjZWxsYW5lb3VzLiBUaGlzIExpY2Vuc2UgcmVwcmVzZW50cyB0aGUgY29tcGxldGUgYWdyZWVtZW50Citjb25jZXJuaW5nIHRoZSBzdWJqZWN0IG1hdHRlciBoZXJlb2YuIElmIGFueSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlCitpcyBoZWxkIHRvIGJlIHVuZW5mb3JjZWFibGUsIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIG9ubHkgdG8KK3RoZSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2UgaXQgZW5mb3JjZWFibGUuCisKKzE0KSBEZWZpbml0aW9uIG9mICJZb3UiIGluIFRoaXMgTGljZW5zZS4gIllvdSIgdGhyb3VnaG91dCB0aGlzCitMaWNlbnNlLCB3aGV0aGVyIGluIHVwcGVyIG9yIGxvd2VyIGNhc2UsIG1lYW5zIGFuIGluZGl2aWR1YWwgb3IgYQorbGVnYWwgZW50aXR5IGV4ZXJjaXNpbmcgcmlnaHRzIHVuZGVyLCBhbmQgY29tcGx5aW5nIHdpdGggYWxsIG9mIHRoZQordGVybXMgb2YsIHRoaXMgTGljZW5zZS4gRm9yIGxlZ2FsIGVudGl0aWVzLCAiWW91IiBpbmNsdWRlcyBhbnkgZW50aXR5Cit0aGF0IGNvbnRyb2xzLCBpcyBjb250cm9sbGVkIGJ5LCBvciBpcyB1bmRlciBjb21tb24gY29udHJvbCB3aXRoCit5b3UuIEZvciBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLAorZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaAorZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkKK3BlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsCitvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCisKKzE1KSBSaWdodCB0byBVc2UuIFlvdSBtYXkgdXNlIHRoZSBPcmlnaW5hbCBXb3JrIGluIGFsbCB3YXlzIG5vdAorb3RoZXJ3aXNlIHJlc3RyaWN0ZWQgb3IgY29uZGl0aW9uZWQgYnkgdGhpcyBMaWNlbnNlIG9yIGJ5IGxhdywgYW5kCitMaWNlbnNvciBwcm9taXNlcyBub3QgdG8gaW50ZXJmZXJlIHdpdGggb3IgYmUgcmVzcG9uc2libGUgZm9yIHN1Y2gKK3VzZXMgYnkgWW91LgorCitUaGlzIGxpY2Vuc2UgaXMgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDQgTGF3cmVuY2UgRS4gUm9zZW4uIEFsbCByaWdodHMKK3Jlc2VydmVkLiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhpcworbGljZW5zZSB3aXRob3V0IG1vZGlmaWNhdGlvbi4gVGhpcyBsaWNlbnNlIG1heSBub3QgYmUgbW9kaWZpZWQgd2l0aG91dAordGhlIGV4cHJlc3Mgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIGl0cyBjb3B5cmlnaHQgb3duZXIuCisKKworLS0gCitFTkQgT0YgQUNBREVNSUMgRlJFRSBMSUNFTlNFLiBUaGUgZm9sbG93aW5nIGlzIGludGVuZGVkIHRvIGRlc2NyaWJlIHRoZSBlc3NlbnRpYWwgCitkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgKEFGTCkgdmVyc2lvbiAxLjAgYW5kIG90aGVyIAorb3BlbiBzb3VyY2UgbGljZW5zZXM6CisKK1RoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgaXMgc2ltaWxhciB0byB0aGUgQlNELCBNSVQsIFVvSS9OQ1NBIGFuZCBBcGFjaGUgCitsaWNlbnNlcyBpbiBtYW55IHJlc3BlY3RzIGJ1dCBpdCBpcyBpbnRlbmRlZCB0byBzb2x2ZSBhIGZldyBwcm9ibGVtcyB3aXRoIAordGhvc2UgbGljZW5zZXMuCisgICAgCisqIFRoZSBBRkwgaXMgd3JpdHRlbiBzbyBhcyB0byBtYWtlIGl0IGNsZWFyIHdoYXQgc29mdHdhcmUgaXMgYmVpbmcgCitsaWNlbnNlZCAoYnkgdGhlIGluY2x1c2lvbiBvZiBhIHN0YXRlbWVudCBmb2xsb3dpbmcgdGhlIGNvcHlyaWdodCBub3RpY2UgCitpbiB0aGUgc29mdHdhcmUpLiBUaGlzIHdheSwgdGhlIGxpY2Vuc2UgZnVuY3Rpb25zIGJldHRlciB0aGFuIGEgdGVtcGxhdGUgCitsaWNlbnNlLiBUaGUgQlNELCBNSVQgYW5kIFVvSS9OQ1NBIGxpY2Vuc2VzIGFwcGx5IHRvIHVuaWRlbnRpZmllZCBzb2Z0d2FyZS4KKyAgICAKKyogVGhlIEFGTCBjb250YWlucyBhIGNvbXBsZXRlIGNvcHlyaWdodCBncmFudCB0byB0aGUgc29mdHdhcmUuIFRoZSBCU0QgCithbmQgQXBhY2hlIGxpY2Vuc2VzIGFyZSB2YWd1ZSBhbmQgaW5jb21wbGV0ZSBpbiB0aGF0IHJlc3BlY3QuCisgICAgCisqIFRoZSBBRkwgY29udGFpbnMgYSBjb21wbGV0ZSBwYXRlbnQgZ3JhbnQgdG8gdGhlIHNvZnR3YXJlLiBUaGUgQlNELCBNSVQsIAorVW9JL05DU0EgYW5kIEFwYWNoZSBsaWNlbnNlcyByZWx5IG9uIGFuIGltcGxpZWQgcGF0ZW50IGxpY2Vuc2UgYW5kIGNvbnRhaW4gCitubyBleHBsaWNpdCBwYXRlbnQgZ3JhbnQuCisgICAgCisqIFRoZSBBRkwgbWFrZXMgaXQgY2xlYXIgdGhhdCBubyB0cmFkZW1hcmsgcmlnaHRzIGFyZSBncmFudGVkIHRvIHRoZSAKK2xpY2Vuc29yJ3MgdHJhZGVtYXJrcy4gVGhlIEFwYWNoZSBsaWNlbnNlIGNvbnRhaW5zIHN1Y2ggYSBwcm92aXNpb24sIGJ1dCB0aGUgCitCU0QsIE1JVCBhbmQgVW9JL05DU0EgbGljZW5zZXMgZG8gbm90LgorICAgIAorKiBUaGUgQUZMIGluY2x1ZGVzIHRoZSB3YXJyYW50eSBieSB0aGUgbGljZW5zb3IgdGhhdCBpdCBlaXRoZXIgb3ducyB0aGUgCitjb3B5cmlnaHQgb3IgdGhhdCBpdCBpcyBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlIHVuZGVyIGEgbGljZW5zZS4gTm9uZSBvZiAKK3RoZSBvdGhlciBsaWNlbnNlcyBjb250YWluIHRoYXQgd2FycmFudHkuIEFsbCBvdGhlciB3YXJyYW50aWVzIGFyZSBkaXNjbGFpbWVkLCAKK2FzIGlzIHRoZSBjYXNlIGZvciB0aGUgb3RoZXIgbGljZW5zZXMuCisKKyogVGhlIEFGTCBpcyBpdHNlbGYgY29weXJpZ2h0ZWQgKHdpdGggdGhlIHJpZ2h0IGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSAKK3dpdGhvdXQgbW9kaWZpY2F0aW9uKS4gVGhpcyBlbnN1cmVzIHRoYXQgdGhlIG93bmVyIG9mIHRoZSBjb3B5cmlnaHQgdG8gdGhlIAorbGljZW5zZSB3aWxsIGNvbnRyb2wgY2hhbmdlcy4gVGhlIEFwYWNoZSBsaWNlbnNlIGNvbnRhaW5zIGEgY29weXJpZ2h0IG5vdGljZSwgCitidXQgdGhlIEJTRCwgTUlUIGFuZCBVb0kvTkNTQSBsaWNlbnNlcyBkbyBub3QuIAorLS0KK1NUQVJUIE9GIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCistLQorCisJCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorCQkgICAgICAgVmVyc2lvbiAyLCBKdW5lIDE5OTEKKworIENvcHlyaWdodCAoQykgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKKyBFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMKKyBvZiB0aGlzIGxpY2Vuc2UgZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KKworCQkJICAgIFByZWFtYmxlCisKKyAgVGhlIGxpY2Vuc2VzIGZvciBtb3N0IHNvZnR3YXJlIGFyZSBkZXNpZ25lZCB0byB0YWtlIGF3YXkgeW91cgorZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGl0LiAgQnkgY29udHJhc3QsIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZ3VhcmFudGVlIHlvdXIgZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGZyZWUKK3NvZnR3YXJlLS10byBtYWtlIHN1cmUgdGhlIHNvZnR3YXJlIGlzIGZyZWUgZm9yIGFsbCBpdHMgdXNlcnMuICBUaGlzCitHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgdG8gbW9zdCBvZiB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbidzIHNvZnR3YXJlIGFuZCB0byBhbnkgb3RoZXIgcHJvZ3JhbSB3aG9zZSBhdXRob3JzIGNvbW1pdCB0bwordXNpbmcgaXQuICAoU29tZSBvdGhlciBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gc29mdHdhcmUgaXMgY292ZXJlZCBieQordGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaW5zdGVhZC4pICBZb3UgY2FuIGFwcGx5IGl0IHRvCit5b3VyIHByb2dyYW1zLCB0b28uCisKKyAgV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20sIG5vdAorcHJpY2UuICBPdXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdQoraGF2ZSB0aGUgZnJlZWRvbSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiBmcmVlIHNvZnR3YXJlIChhbmQgY2hhcmdlIGZvcgordGhpcyBzZXJ2aWNlIGlmIHlvdSB3aXNoKSwgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBjYW4gZ2V0IGl0CitpZiB5b3Ugd2FudCBpdCwgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgc29mdHdhcmUgb3IgdXNlIHBpZWNlcyBvZiBpdAoraW4gbmV3IGZyZWUgcHJvZ3JhbXM7IGFuZCB0aGF0IHlvdSBrbm93IHlvdSBjYW4gZG8gdGhlc2UgdGhpbmdzLgorCisgIFRvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gbWFrZSByZXN0cmljdGlvbnMgdGhhdCBmb3JiaWQKK2FueW9uZSB0byBkZW55IHlvdSB0aGVzZSByaWdodHMgb3IgdG8gYXNrIHlvdSB0byBzdXJyZW5kZXIgdGhlIHJpZ2h0cy4KK1RoZXNlIHJlc3RyaWN0aW9ucyB0cmFuc2xhdGUgdG8gY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGZvciB5b3UgaWYgeW91CitkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgc29mdHdhcmUsIG9yIGlmIHlvdSBtb2RpZnkgaXQuCisKKyAgRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiBzdWNoIGEgcHJvZ3JhbSwgd2hldGhlcgorZ3JhdGlzIG9yIGZvciBhIGZlZSwgeW91IG11c3QgZ2l2ZSB0aGUgcmVjaXBpZW50cyBhbGwgdGhlIHJpZ2h0cyB0aGF0Cit5b3UgaGF2ZS4gIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZXksIHRvbywgcmVjZWl2ZSBvciBjYW4gZ2V0IHRoZQorc291cmNlIGNvZGUuICBBbmQgeW91IG11c3Qgc2hvdyB0aGVtIHRoZXNlIHRlcm1zIHNvIHRoZXkga25vdyB0aGVpcgorcmlnaHRzLgorCisgIFdlIHByb3RlY3QgeW91ciByaWdodHMgd2l0aCB0d28gc3RlcHM6ICgxKSBjb3B5cmlnaHQgdGhlIHNvZnR3YXJlLCBhbmQKKygyKSBvZmZlciB5b3UgdGhpcyBsaWNlbnNlIHdoaWNoIGdpdmVzIHlvdSBsZWdhbCBwZXJtaXNzaW9uIHRvIGNvcHksCitkaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgdGhlIHNvZnR3YXJlLgorCisgIEFsc28sIGZvciBlYWNoIGF1dGhvcidzIHByb3RlY3Rpb24gYW5kIG91cnMsIHdlIHdhbnQgdG8gbWFrZSBjZXJ0YWluCit0aGF0IGV2ZXJ5b25lIHVuZGVyc3RhbmRzIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoaXMgZnJlZQorc29mdHdhcmUuICBJZiB0aGUgc29mdHdhcmUgaXMgbW9kaWZpZWQgYnkgc29tZW9uZSBlbHNlIGFuZCBwYXNzZWQgb24sIHdlCit3YW50IGl0cyByZWNpcGllbnRzIHRvIGtub3cgdGhhdCB3aGF0IHRoZXkgaGF2ZSBpcyBub3QgdGhlIG9yaWdpbmFsLCBzbwordGhhdCBhbnkgcHJvYmxlbXMgaW50cm9kdWNlZCBieSBvdGhlcnMgd2lsbCBub3QgcmVmbGVjdCBvbiB0aGUgb3JpZ2luYWwKK2F1dGhvcnMnIHJlcHV0YXRpb25zLgorCisgIEZpbmFsbHksIGFueSBmcmVlIHByb2dyYW0gaXMgdGhyZWF0ZW5lZCBjb25zdGFudGx5IGJ5IHNvZnR3YXJlCitwYXRlbnRzLiAgV2Ugd2lzaCB0byBhdm9pZCB0aGUgZGFuZ2VyIHRoYXQgcmVkaXN0cmlidXRvcnMgb2YgYSBmcmVlCitwcm9ncmFtIHdpbGwgaW5kaXZpZHVhbGx5IG9idGFpbiBwYXRlbnQgbGljZW5zZXMsIGluIGVmZmVjdCBtYWtpbmcgdGhlCitwcm9ncmFtIHByb3ByaWV0YXJ5LiAgVG8gcHJldmVudCB0aGlzLCB3ZSBoYXZlIG1hZGUgaXQgY2xlYXIgdGhhdCBhbnkKK3BhdGVudCBtdXN0IGJlIGxpY2Vuc2VkIGZvciBldmVyeW9uZSdzIGZyZWUgdXNlIG9yIG5vdCBsaWNlbnNlZCBhdCBhbGwuCisKKyAgVGhlIHByZWNpc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQKK21vZGlmaWNhdGlvbiBmb2xsb3cuCisMCisJCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIENPUFlJTkcsIERJU1RSSUJVVElPTiBBTkQgTU9ESUZJQ0FUSU9OCisKKyAgMC4gVGhpcyBMaWNlbnNlIGFwcGxpZXMgdG8gYW55IHByb2dyYW0gb3Igb3RoZXIgd29yayB3aGljaCBjb250YWlucworYSBub3RpY2UgcGxhY2VkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyIHNheWluZyBpdCBtYXkgYmUgZGlzdHJpYnV0ZWQKK3VuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGUgIlByb2dyYW0iLCBiZWxvdywKK3JlZmVycyB0byBhbnkgc3VjaCBwcm9ncmFtIG9yIHdvcmssIGFuZCBhICJ3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtIgorbWVhbnMgZWl0aGVyIHRoZSBQcm9ncmFtIG9yIGFueSBkZXJpdmF0aXZlIHdvcmsgdW5kZXIgY29weXJpZ2h0IGxhdzoKK3RoYXQgaXMgdG8gc2F5LCBhIHdvcmsgY29udGFpbmluZyB0aGUgUHJvZ3JhbSBvciBhIHBvcnRpb24gb2YgaXQsCitlaXRoZXIgdmVyYmF0aW0gb3Igd2l0aCBtb2RpZmljYXRpb25zIGFuZC9vciB0cmFuc2xhdGVkIGludG8gYW5vdGhlcgorbGFuZ3VhZ2UuICAoSGVyZWluYWZ0ZXIsIHRyYW5zbGF0aW9uIGlzIGluY2x1ZGVkIHdpdGhvdXQgbGltaXRhdGlvbiBpbgordGhlIHRlcm0gIm1vZGlmaWNhdGlvbiIuKSAgRWFjaCBsaWNlbnNlZSBpcyBhZGRyZXNzZWQgYXMgInlvdSIuCisKK0FjdGl2aXRpZXMgb3RoZXIgdGhhbiBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kIG1vZGlmaWNhdGlvbiBhcmUgbm90Citjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZTsgdGhleSBhcmUgb3V0c2lkZSBpdHMgc2NvcGUuICBUaGUgYWN0IG9mCitydW5uaW5nIHRoZSBQcm9ncmFtIGlzIG5vdCByZXN0cmljdGVkLCBhbmQgdGhlIG91dHB1dCBmcm9tIHRoZSBQcm9ncmFtCitpcyBjb3ZlcmVkIG9ubHkgaWYgaXRzIGNvbnRlbnRzIGNvbnN0aXR1dGUgYSB3b3JrIGJhc2VkIG9uIHRoZQorUHJvZ3JhbSAoaW5kZXBlbmRlbnQgb2YgaGF2aW5nIGJlZW4gbWFkZSBieSBydW5uaW5nIHRoZSBQcm9ncmFtKS4KK1doZXRoZXIgdGhhdCBpcyB0cnVlIGRlcGVuZHMgb24gd2hhdCB0aGUgUHJvZ3JhbSBkb2VzLgorCisgIDEuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhlIFByb2dyYW0ncworc291cmNlIGNvZGUgYXMgeW91IHJlY2VpdmUgaXQsIGluIGFueSBtZWRpdW0sIHByb3ZpZGVkIHRoYXQgeW91Citjb25zcGljdW91c2x5IGFuZCBhcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuIGFwcHJvcHJpYXRlCitjb3B5cmlnaHQgbm90aWNlIGFuZCBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5OyBrZWVwIGludGFjdCBhbGwgdGhlCitub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlIGFuZCB0byB0aGUgYWJzZW5jZSBvZiBhbnkgd2FycmFudHk7CithbmQgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgUHJvZ3JhbSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlCithbG9uZyB3aXRoIHRoZSBQcm9ncmFtLgorCitZb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LCBhbmQKK3lvdSBtYXkgYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYSBmZWUuCisKKyAgMi4gWW91IG1heSBtb2RpZnkgeW91ciBjb3B5IG9yIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSBvciBhbnkgcG9ydGlvbgorb2YgaXQsIHRodXMgZm9ybWluZyBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0sIGFuZCBjb3B5IGFuZAorZGlzdHJpYnV0ZSBzdWNoIG1vZGlmaWNhdGlvbnMgb3Igd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiAxCithYm92ZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0IGFsbCBvZiB0aGVzZSBjb25kaXRpb25zOgorCisgICAgYSkgWW91IG11c3QgY2F1c2UgdGhlIG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBmaWxlcyBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4KKworICAgIGIpIFlvdSBtdXN0IGNhdXNlIGFueSB3b3JrIHRoYXQgeW91IGRpc3RyaWJ1dGUgb3IgcHVibGlzaCwgdGhhdCBpbgorICAgIHdob2xlIG9yIGluIHBhcnQgY29udGFpbnMgb3IgaXMgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtIG9yIGFueQorICAgIHBhcnQgdGhlcmVvZiwgdG8gYmUgbGljZW5zZWQgYXMgYSB3aG9sZSBhdCBubyBjaGFyZ2UgdG8gYWxsIHRoaXJkCisgICAgcGFydGllcyB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgorCisgICAgYykgSWYgdGhlIG1vZGlmaWVkIHByb2dyYW0gbm9ybWFsbHkgcmVhZHMgY29tbWFuZHMgaW50ZXJhY3RpdmVseQorICAgIHdoZW4gcnVuLCB5b3UgbXVzdCBjYXVzZSBpdCwgd2hlbiBzdGFydGVkIHJ1bm5pbmcgZm9yIHN1Y2gKKyAgICBpbnRlcmFjdGl2ZSB1c2UgaW4gdGhlIG1vc3Qgb3JkaW5hcnkgd2F5LCB0byBwcmludCBvciBkaXNwbGF5IGFuCisgICAgYW5ub3VuY2VtZW50IGluY2x1ZGluZyBhbiBhcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCBhCisgICAgbm90aWNlIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgKG9yIGVsc2UsIHNheWluZyB0aGF0IHlvdSBwcm92aWRlCisgICAgYSB3YXJyYW50eSkgYW5kIHRoYXQgdXNlcnMgbWF5IHJlZGlzdHJpYnV0ZSB0aGUgcHJvZ3JhbSB1bmRlcgorICAgIHRoZXNlIGNvbmRpdGlvbnMsIGFuZCB0ZWxsaW5nIHRoZSB1c2VyIGhvdyB0byB2aWV3IGEgY29weSBvZiB0aGlzCisgICAgTGljZW5zZS4gIChFeGNlcHRpb246IGlmIHRoZSBQcm9ncmFtIGl0c2VsZiBpcyBpbnRlcmFjdGl2ZSBidXQKKyAgICBkb2VzIG5vdCBub3JtYWxseSBwcmludCBzdWNoIGFuIGFubm91bmNlbWVudCwgeW91ciB3b3JrIGJhc2VkIG9uCisgICAgdGhlIFByb2dyYW0gaXMgbm90IHJlcXVpcmVkIHRvIHByaW50IGFuIGFubm91bmNlbWVudC4pCisMCitUaGVzZSByZXF1aXJlbWVudHMgYXBwbHkgdG8gdGhlIG1vZGlmaWVkIHdvcmsgYXMgYSB3aG9sZS4gIElmCitpZGVudGlmaWFibGUgc2VjdGlvbnMgb2YgdGhhdCB3b3JrIGFyZSBub3QgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtLAorYW5kIGNhbiBiZSByZWFzb25hYmx5IGNvbnNpZGVyZWQgaW5kZXBlbmRlbnQgYW5kIHNlcGFyYXRlIHdvcmtzIGluCit0aGVtc2VsdmVzLCB0aGVuIHRoaXMgTGljZW5zZSwgYW5kIGl0cyB0ZXJtcywgZG8gbm90IGFwcGx5IHRvIHRob3NlCitzZWN0aW9ucyB3aGVuIHlvdSBkaXN0cmlidXRlIHRoZW0gYXMgc2VwYXJhdGUgd29ya3MuICBCdXQgd2hlbiB5b3UKK2Rpc3RyaWJ1dGUgdGhlIHNhbWUgc2VjdGlvbnMgYXMgcGFydCBvZiBhIHdob2xlIHdoaWNoIGlzIGEgd29yayBiYXNlZAorb24gdGhlIFByb2dyYW0sIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHdob2xlIG11c3QgYmUgb24gdGhlIHRlcm1zIG9mCit0aGlzIExpY2Vuc2UsIHdob3NlIHBlcm1pc3Npb25zIGZvciBvdGhlciBsaWNlbnNlZXMgZXh0ZW5kIHRvIHRoZQorZW50aXJlIHdob2xlLCBhbmQgdGh1cyB0byBlYWNoIGFuZCBldmVyeSBwYXJ0IHJlZ2FyZGxlc3Mgb2Ygd2hvIHdyb3RlIGl0LgorCitUaHVzLCBpdCBpcyBub3QgdGhlIGludGVudCBvZiB0aGlzIHNlY3Rpb24gdG8gY2xhaW0gcmlnaHRzIG9yIGNvbnRlc3QKK3lvdXIgcmlnaHRzIHRvIHdvcmsgd3JpdHRlbiBlbnRpcmVseSBieSB5b3U7IHJhdGhlciwgdGhlIGludGVudCBpcyB0bworZXhlcmNpc2UgdGhlIHJpZ2h0IHRvIGNvbnRyb2wgdGhlIGRpc3RyaWJ1dGlvbiBvZiBkZXJpdmF0aXZlIG9yCitjb2xsZWN0aXZlIHdvcmtzIGJhc2VkIG9uIHRoZSBQcm9ncmFtLgorCitJbiBhZGRpdGlvbiwgbWVyZSBhZ2dyZWdhdGlvbiBvZiBhbm90aGVyIHdvcmsgbm90IGJhc2VkIG9uIHRoZSBQcm9ncmFtCit3aXRoIHRoZSBQcm9ncmFtIChvciB3aXRoIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSkgb24gYSB2b2x1bWUgb2YKK2Egc3RvcmFnZSBvciBkaXN0cmlidXRpb24gbWVkaXVtIGRvZXMgbm90IGJyaW5nIHRoZSBvdGhlciB3b3JrIHVuZGVyCit0aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLgorCisgIDMuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYSB3b3JrIGJhc2VkIG9uIGl0LAordW5kZXIgU2VjdGlvbiAyKSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gdW5kZXIgdGhlIHRlcm1zIG9mCitTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gZG8gb25lIG9mIHRoZSBmb2xsb3dpbmc6CisKKyAgICBhKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZyBtYWNoaW5lLXJlYWRhYmxlCisgICAgc291cmNlIGNvZGUsIHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zCisgICAgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCisKKyAgICBiKSBBY2NvbXBhbnkgaXQgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdCBsZWFzdCB0aHJlZQorICAgIHllYXJzLCB0byBnaXZlIGFueSB0aGlyZCBwYXJ0eSwgZm9yIGEgY2hhcmdlIG5vIG1vcmUgdGhhbiB5b3VyCisgICAgY29zdCBvZiBwaHlzaWNhbGx5IHBlcmZvcm1pbmcgc291cmNlIGRpc3RyaWJ1dGlvbiwgYSBjb21wbGV0ZQorICAgIG1hY2hpbmUtcmVhZGFibGUgY29weSBvZiB0aGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZSwgdG8gYmUKKyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bQorICAgIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKKworICAgIGMpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBpbmZvcm1hdGlvbiB5b3UgcmVjZWl2ZWQgYXMgdG8gdGhlIG9mZmVyCisgICAgdG8gZGlzdHJpYnV0ZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLiAgKFRoaXMgYWx0ZXJuYXRpdmUgaXMKKyAgICBhbGxvd2VkIG9ubHkgZm9yIG5vbmNvbW1lcmNpYWwgZGlzdHJpYnV0aW9uIGFuZCBvbmx5IGlmIHlvdQorICAgIHJlY2VpdmVkIHRoZSBwcm9ncmFtIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB3aXRoIHN1Y2gKKyAgICBhbiBvZmZlciwgaW4gYWNjb3JkIHdpdGggU3Vic2VjdGlvbiBiIGFib3ZlLikKKworVGhlIHNvdXJjZSBjb2RlIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvcgorbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQuICBGb3IgYW4gZXhlY3V0YWJsZSB3b3JrLCBjb21wbGV0ZSBzb3VyY2UKK2NvZGUgbWVhbnMgYWxsIHRoZSBzb3VyY2UgY29kZSBmb3IgYWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMgYW55Cithc3NvY2lhdGVkIGludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzLCBwbHVzIHRoZSBzY3JpcHRzIHVzZWQgdG8KK2NvbnRyb2wgY29tcGlsYXRpb24gYW5kIGluc3RhbGxhdGlvbiBvZiB0aGUgZXhlY3V0YWJsZS4gIEhvd2V2ZXIsIGFzIGEKK3NwZWNpYWwgZXhjZXB0aW9uLCB0aGUgc291cmNlIGNvZGUgZGlzdHJpYnV0ZWQgbmVlZCBub3QgaW5jbHVkZQorYW55dGhpbmcgdGhhdCBpcyBub3JtYWxseSBkaXN0cmlidXRlZCAoaW4gZWl0aGVyIHNvdXJjZSBvciBiaW5hcnkKK2Zvcm0pIHdpdGggdGhlIG1ham9yIGNvbXBvbmVudHMgKGNvbXBpbGVyLCBrZXJuZWwsIGFuZCBzbyBvbikgb2YgdGhlCitvcGVyYXRpbmcgc3lzdGVtIG9uIHdoaWNoIHRoZSBleGVjdXRhYmxlIHJ1bnMsIHVubGVzcyB0aGF0IGNvbXBvbmVudAoraXRzZWxmIGFjY29tcGFuaWVzIHRoZSBleGVjdXRhYmxlLgorCitJZiBkaXN0cmlidXRpb24gb2YgZXhlY3V0YWJsZSBvciBvYmplY3QgY29kZSBpcyBtYWRlIGJ5IG9mZmVyaW5nCithY2Nlc3MgdG8gY29weSBmcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgdGhlbiBvZmZlcmluZyBlcXVpdmFsZW50CithY2Nlc3MgdG8gY29weSB0aGUgc291cmNlIGNvZGUgZnJvbSB0aGUgc2FtZSBwbGFjZSBjb3VudHMgYXMKK2Rpc3RyaWJ1dGlvbiBvZiB0aGUgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdAorY29tcGVsbGVkIHRvIGNvcHkgdGhlIHNvdXJjZSBhbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS4KKwwKKyAgNC4gWW91IG1heSBub3QgY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCitleGNlcHQgYXMgZXhwcmVzc2x5IHByb3ZpZGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gIEFueSBhdHRlbXB0CitvdGhlcndpc2UgdG8gY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaXMKK3ZvaWQsIGFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIHlvdXIgcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZS4KK0hvd2V2ZXIsIHBhcnRpZXMgd2hvIGhhdmUgcmVjZWl2ZWQgY29waWVzLCBvciByaWdodHMsIGZyb20geW91IHVuZGVyCit0aGlzIExpY2Vuc2Ugd2lsbCBub3QgaGF2ZSB0aGVpciBsaWNlbnNlcyB0ZXJtaW5hdGVkIHNvIGxvbmcgYXMgc3VjaAorcGFydGllcyByZW1haW4gaW4gZnVsbCBjb21wbGlhbmNlLgorCisgIDUuIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UsIHNpbmNlIHlvdSBoYXZlIG5vdAorc2lnbmVkIGl0LiAgSG93ZXZlciwgbm90aGluZyBlbHNlIGdyYW50cyB5b3UgcGVybWlzc2lvbiB0byBtb2RpZnkgb3IKK2Rpc3RyaWJ1dGUgdGhlIFByb2dyYW0gb3IgaXRzIGRlcml2YXRpdmUgd29ya3MuICBUaGVzZSBhY3Rpb25zIGFyZQorcHJvaGliaXRlZCBieSBsYXcgaWYgeW91IGRvIG5vdCBhY2NlcHQgdGhpcyBMaWNlbnNlLiAgVGhlcmVmb3JlLCBieQorbW9kaWZ5aW5nIG9yIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtKSwgeW91IGluZGljYXRlIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGlzIExpY2Vuc2UgdG8gZG8gc28sIGFuZAorYWxsIGl0cyB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW5nIG9yIG1vZGlmeWluZwordGhlIFByb2dyYW0gb3Igd29ya3MgYmFzZWQgb24gaXQuCisKKyAgNi4gRWFjaCB0aW1lIHlvdSByZWRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQorUHJvZ3JhbSksIHRoZSByZWNpcGllbnQgYXV0b21hdGljYWxseSByZWNlaXZlcyBhIGxpY2Vuc2UgZnJvbSB0aGUKK29yaWdpbmFsIGxpY2Vuc29yIHRvIGNvcHksIGRpc3RyaWJ1dGUgb3IgbW9kaWZ5IHRoZSBQcm9ncmFtIHN1YmplY3QgdG8KK3RoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgWW91IG1heSBub3QgaW1wb3NlIGFueSBmdXJ0aGVyCityZXN0cmljdGlvbnMgb24gdGhlIHJlY2lwaWVudHMnIGV4ZXJjaXNlIG9mIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJlaW4uCitZb3UgYXJlIG5vdCByZXNwb25zaWJsZSBmb3IgZW5mb3JjaW5nIGNvbXBsaWFuY2UgYnkgdGhpcmQgcGFydGllcyB0bwordGhpcyBMaWNlbnNlLgorCisgIDcuIElmLCBhcyBhIGNvbnNlcXVlbmNlIG9mIGEgY291cnQganVkZ21lbnQgb3IgYWxsZWdhdGlvbiBvZiBwYXRlbnQKK2luZnJpbmdlbWVudCBvciBmb3IgYW55IG90aGVyIHJlYXNvbiAobm90IGxpbWl0ZWQgdG8gcGF0ZW50IGlzc3VlcyksCitjb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yCitvdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90CitleGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiAgSWYgeW91IGNhbm5vdAorZGlzdHJpYnV0ZSBzbyBhcyB0byBzYXRpc2Z5IHNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcworTGljZW5zZSBhbmQgYW55IG90aGVyIHBlcnRpbmVudCBvYmxpZ2F0aW9ucywgdGhlbiBhcyBhIGNvbnNlcXVlbmNlIHlvdQorbWF5IG5vdCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGF0IGFsbC4gIEZvciBleGFtcGxlLCBpZiBhIHBhdGVudAorbGljZW5zZSB3b3VsZCBub3QgcGVybWl0IHJveWFsdHktZnJlZSByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBieQorYWxsIHRob3NlIHdobyByZWNlaXZlIGNvcGllcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2ggeW91LCB0aGVuCit0aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCBpdCBhbmQgdGhpcyBMaWNlbnNlIHdvdWxkIGJlIHRvCityZWZyYWluIGVudGlyZWx5IGZyb20gZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtLgorCitJZiBhbnkgcG9ydGlvbiBvZiB0aGlzIHNlY3Rpb24gaXMgaGVsZCBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIKK2FueSBwYXJ0aWN1bGFyIGNpcmN1bXN0YW5jZSwgdGhlIGJhbGFuY2Ugb2YgdGhlIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8KK2FwcGx5IGFuZCB0aGUgc2VjdGlvbiBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFwcGx5IGluIG90aGVyCitjaXJjdW1zdGFuY2VzLgorCitJdCBpcyBub3QgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzZWN0aW9uIHRvIGluZHVjZSB5b3UgdG8gaW5mcmluZ2UgYW55CitwYXRlbnRzIG9yIG90aGVyIHByb3BlcnR5IHJpZ2h0IGNsYWltcyBvciB0byBjb250ZXN0IHZhbGlkaXR5IG9mIGFueQorc3VjaCBjbGFpbXM7IHRoaXMgc2VjdGlvbiBoYXMgdGhlIHNvbGUgcHVycG9zZSBvZiBwcm90ZWN0aW5nIHRoZQoraW50ZWdyaXR5IG9mIHRoZSBmcmVlIHNvZnR3YXJlIGRpc3RyaWJ1dGlvbiBzeXN0ZW0sIHdoaWNoIGlzCitpbXBsZW1lbnRlZCBieSBwdWJsaWMgbGljZW5zZSBwcmFjdGljZXMuICBNYW55IHBlb3BsZSBoYXZlIG1hZGUKK2dlbmVyb3VzIGNvbnRyaWJ1dGlvbnMgdG8gdGhlIHdpZGUgcmFuZ2Ugb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQKK3Rocm91Z2ggdGhhdCBzeXN0ZW0gaW4gcmVsaWFuY2Ugb24gY29uc2lzdGVudCBhcHBsaWNhdGlvbiBvZiB0aGF0CitzeXN0ZW07IGl0IGlzIHVwIHRvIHRoZSBhdXRob3IvZG9ub3IgdG8gZGVjaWRlIGlmIGhlIG9yIHNoZSBpcyB3aWxsaW5nCit0byBkaXN0cmlidXRlIHNvZnR3YXJlIHRocm91Z2ggYW55IG90aGVyIHN5c3RlbSBhbmQgYSBsaWNlbnNlZSBjYW5ub3QKK2ltcG9zZSB0aGF0IGNob2ljZS4KKworVGhpcyBzZWN0aW9uIGlzIGludGVuZGVkIHRvIG1ha2UgdGhvcm91Z2hseSBjbGVhciB3aGF0IGlzIGJlbGlldmVkIHRvCitiZSBhIGNvbnNlcXVlbmNlIG9mIHRoZSByZXN0IG9mIHRoaXMgTGljZW5zZS4KKwwKKyAgOC4gSWYgdGhlIGRpc3RyaWJ1dGlvbiBhbmQvb3IgdXNlIG9mIHRoZSBQcm9ncmFtIGlzIHJlc3RyaWN0ZWQgaW4KK2NlcnRhaW4gY291bnRyaWVzIGVpdGhlciBieSBwYXRlbnRzIG9yIGJ5IGNvcHlyaWdodGVkIGludGVyZmFjZXMsIHRoZQorb3JpZ2luYWwgY29weXJpZ2h0IGhvbGRlciB3aG8gcGxhY2VzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgTGljZW5zZQorbWF5IGFkZCBhbiBleHBsaWNpdCBnZW9ncmFwaGljYWwgZGlzdHJpYnV0aW9uIGxpbWl0YXRpb24gZXhjbHVkaW5nCit0aG9zZSBjb3VudHJpZXMsIHNvIHRoYXQgZGlzdHJpYnV0aW9uIGlzIHBlcm1pdHRlZCBvbmx5IGluIG9yIGFtb25nCitjb3VudHJpZXMgbm90IHRodXMgZXhjbHVkZWQuICBJbiBzdWNoIGNhc2UsIHRoaXMgTGljZW5zZSBpbmNvcnBvcmF0ZXMKK3RoZSBsaW1pdGF0aW9uIGFzIGlmIHdyaXR0ZW4gaW4gdGhlIGJvZHkgb2YgdGhpcyBMaWNlbnNlLgorCisgIDkuIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3IHZlcnNpb25zCitvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4gIFN1Y2ggbmV3IHZlcnNpb25zIHdpbGwKK2JlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sIGJ1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0bworYWRkcmVzcyBuZXcgcHJvYmxlbXMgb3IgY29uY2VybnMuCisKK0VhY2ggdmVyc2lvbiBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgSWYgdGhlIFByb2dyYW0KK3NwZWNpZmllcyBhIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgTGljZW5zZSB3aGljaCBhcHBsaWVzIHRvIGl0IGFuZCAiYW55CitsYXRlciB2ZXJzaW9uIiwgeW91IGhhdmUgdGhlIG9wdGlvbiBvZiBmb2xsb3dpbmcgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCitlaXRoZXIgb2YgdGhhdCB2ZXJzaW9uIG9yIG9mIGFueSBsYXRlciB2ZXJzaW9uIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbi4gIElmIHRoZSBQcm9ncmFtIGRvZXMgbm90IHNwZWNpZnkgYSB2ZXJzaW9uIG51bWJlciBvZgordGhpcyBMaWNlbnNlLCB5b3UgbWF5IGNob29zZSBhbnkgdmVyc2lvbiBldmVyIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbi4KKworICAxMC4gSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgdGhlIFByb2dyYW0gaW50byBvdGhlciBmcmVlCitwcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgZGlmZmVyZW50LCB3cml0ZSB0byB0aGUgYXV0aG9yCit0byBhc2sgZm9yIHBlcm1pc3Npb24uICBGb3Igc29mdHdhcmUgd2hpY2ggaXMgY29weXJpZ2h0ZWQgYnkgdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24sIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHdlIHNvbWV0aW1lcworbWFrZSBleGNlcHRpb25zIGZvciB0aGlzLiAgT3VyIGRlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMKK29mIHByZXNlcnZpbmcgdGhlIGZyZWUgc3RhdHVzIG9mIGFsbCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZSBzb2Z0d2FyZSBhbmQKK29mIHByb21vdGluZyB0aGUgc2hhcmluZyBhbmQgcmV1c2Ugb2Ygc29mdHdhcmUgZ2VuZXJhbGx5LgorCisJCQkgICAgTk8gV0FSUkFOVFkKKworICAxMS4gQkVDQVVTRSBUSEUgUFJPR1JBTSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8gV0FSUkFOVFkKK0ZPUiBUSEUgUFJPR1JBTSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuICBFWENFUFQgV0hFTgorT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQvT1IgT1RIRVIgUEFSVElFUworUFJPVklERSBUSEUgUFJPR1JBTSAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQKK09SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCitNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTCitUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIFBST0dSQU0gSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFCitQUk9HUkFNIFBST1ZFIERFRkVDVElWRSwgWU9VIEFTU1VNRSBUSEUgQ09TVCBPRiBBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywKK1JFUEFJUiBPUiBDT1JSRUNUSU9OLgorCisgIDEyLiBJTiBOTyBFVkVOVCBVTkxFU1MgUkVRVUlSRUQgQlkgQVBQTElDQUJMRSBMQVcgT1IgQUdSRUVEIFRPIElOIFdSSVRJTkcKK1dJTEwgQU5ZIENPUFlSSUdIVCBIT0xERVIsIE9SIEFOWSBPVEhFUiBQQVJUWSBXSE8gTUFZIE1PRElGWSBBTkQvT1IKK1JFRElTVFJJQlVURSBUSEUgUFJPR1JBTSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UgRk9SIERBTUFHRVMsCitJTkNMVURJTkcgQU5ZIEdFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcKK09VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIFBST0dSQU0gKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQKK1RPIExPU1MgT0YgREFUQSBPUiBEQVRBIEJFSU5HIFJFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWQorWU9VIE9SIFRISVJEIFBBUlRJRVMgT1IgQSBGQUlMVVJFIE9GIFRIRSBQUk9HUkFNIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIKK1BST0dSQU1TKSwgRVZFTiBJRiBTVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRQorUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorCisJCSAgICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisMCisJICAgIEhvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBQcm9ncmFtcworCisgIElmIHlvdSBkZXZlbG9wIGEgbmV3IHByb2dyYW0sIGFuZCB5b3Ugd2FudCBpdCB0byBiZSBvZiB0aGUgZ3JlYXRlc3QKK3Bvc3NpYmxlIHVzZSB0byB0aGUgcHVibGljLCB0aGUgYmVzdCB3YXkgdG8gYWNoaWV2ZSB0aGlzIGlzIHRvIG1ha2UgaXQKK2ZyZWUgc29mdHdhcmUgd2hpY2ggZXZlcnlvbmUgY2FuIHJlZGlzdHJpYnV0ZSBhbmQgY2hhbmdlIHVuZGVyIHRoZXNlIHRlcm1zLgorCisgIFRvIGRvIHNvLCBhdHRhY2ggdGhlIGZvbGxvd2luZyBub3RpY2VzIHRvIHRoZSBwcm9ncmFtLiAgSXQgaXMgc2FmZXN0Cit0byBhdHRhY2ggdGhlbSB0byB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgZmlsZSB0byBtb3N0IGVmZmVjdGl2ZWx5Citjb252ZXkgdGhlIGV4Y2x1c2lvbiBvZiB3YXJyYW50eTsgYW5kIGVhY2ggZmlsZSBzaG91bGQgaGF2ZSBhdCBsZWFzdAordGhlICJjb3B5cmlnaHQiIGxpbmUgYW5kIGEgcG9pbnRlciB0byB3aGVyZSB0aGUgZnVsbCBub3RpY2UgaXMgZm91bmQuCisKKyAgICA8b25lIGxpbmUgdG8gZ2l2ZSB0aGUgcHJvZ3JhbSdzIG5hbWUgYW5kIGEgYnJpZWYgaWRlYSBvZiB3aGF0IGl0IGRvZXMuPgorICAgIENvcHlyaWdodCAoQykgPHllYXI+ICA8bmFtZSBvZiBhdXRob3I+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKKworQWxzbyBhZGQgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRhY3QgeW91IGJ5IGVsZWN0cm9uaWMgYW5kIHBhcGVyIG1haWwuCisKK0lmIHRoZSBwcm9ncmFtIGlzIGludGVyYWN0aXZlLCBtYWtlIGl0IG91dHB1dCBhIHNob3J0IG5vdGljZSBsaWtlIHRoaXMKK3doZW4gaXQgc3RhcnRzIGluIGFuIGludGVyYWN0aXZlIG1vZGU6CisKKyAgICBHbm9tb3Zpc2lvbiB2ZXJzaW9uIDY5LCBDb3B5cmlnaHQgKEMpIHllYXIgbmFtZSBvZiBhdXRob3IKKyAgICBHbm9tb3Zpc2lvbiBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFk7IGZvciBkZXRhaWxzIHR5cGUgYHNob3cgdycuCisgICAgVGhpcyBpcyBmcmVlIHNvZnR3YXJlLCBhbmQgeW91IGFyZSB3ZWxjb21lIHRvIHJlZGlzdHJpYnV0ZSBpdAorICAgIHVuZGVyIGNlcnRhaW4gY29uZGl0aW9uczsgdHlwZSBgc2hvdyBjJyBmb3IgZGV0YWlscy4KKworVGhlIGh5cG90aGV0aWNhbCBjb21tYW5kcyBgc2hvdyB3JyBhbmQgYHNob3cgYycgc2hvdWxkIHNob3cgdGhlIGFwcHJvcHJpYXRlCitwYXJ0cyBvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIE9mIGNvdXJzZSwgdGhlIGNvbW1hbmRzIHlvdSB1c2UgbWF5CitiZSBjYWxsZWQgc29tZXRoaW5nIG90aGVyIHRoYW4gYHNob3cgdycgYW5kIGBzaG93IGMnOyB0aGV5IGNvdWxkIGV2ZW4gYmUKK21vdXNlLWNsaWNrcyBvciBtZW51IGl0ZW1zLS13aGF0ZXZlciBzdWl0cyB5b3VyIHByb2dyYW0uCisKK1lvdSBzaG91bGQgYWxzbyBnZXQgeW91ciBlbXBsb3llciAoaWYgeW91IHdvcmsgYXMgYSBwcm9ncmFtbWVyKSBvciB5b3VyCitzY2hvb2wsIGlmIGFueSwgdG8gc2lnbiBhICJjb3B5cmlnaHQgZGlzY2xhaW1lciIgZm9yIHRoZSBwcm9ncmFtLCBpZgorbmVjZXNzYXJ5LiAgSGVyZSBpcyBhIHNhbXBsZTsgYWx0ZXIgdGhlIG5hbWVzOgorCisgIFlveW9keW5lLCBJbmMuLCBoZXJlYnkgZGlzY2xhaW1zIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlIHByb2dyYW0KKyAgYEdub21vdmlzaW9uJyAod2hpY2ggbWFrZXMgcGFzc2VzIGF0IGNvbXBpbGVycykgd3JpdHRlbiBieSBKYW1lcyBIYWNrZXIuCisKKyAgPHNpZ25hdHVyZSBvZiBUeSBDb29uPiwgMSBBcHJpbCAxOTg5CisgIFR5IENvb24sIFByZXNpZGVudCBvZiBWaWNlCisKK1RoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBkb2VzIG5vdCBwZXJtaXQgaW5jb3Jwb3JhdGluZyB5b3VyIHByb2dyYW0gaW50bworcHJvcHJpZXRhcnkgcHJvZ3JhbXMuICBJZiB5b3VyIHByb2dyYW0gaXMgYSBzdWJyb3V0aW5lIGxpYnJhcnksIHlvdSBtYXkKK2NvbnNpZGVyIGl0IG1vcmUgdXNlZnVsIHRvIHBlcm1pdCBsaW5raW5nIHByb3ByaWV0YXJ5IGFwcGxpY2F0aW9ucyB3aXRoIHRoZQorbGlicmFyeS4gIElmIHRoaXMgaXMgd2hhdCB5b3Ugd2FudCB0byBkbywgdXNlIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZS4KZGlmZiAtLWdpdCBhL3Rvb2xzL1dpbjMyLk1hbmlmZXN0IGIvdG9vbHMvV2luMzIuTWFuaWZlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjkyNmQwNgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL1dpbjMyLk1hbmlmZXN0CkBAIC0wLDAgKzEsMTAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KKzxhc3NlbWJseSB4bWxucz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTphc20udjEiIG1hbmlmZXN0VmVyc2lvbj0iMS4wIj4KKyA8dHJ1c3RJbmZvIHhtbG5zPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOmFzbS52MyI+CisgIDxzZWN1cml0eT4KKyAgIDxyZXF1ZXN0ZWRQcml2aWxlZ2VzPgorICAgIDxyZXF1ZXN0ZWRFeGVjdXRpb25MZXZlbCBsZXZlbD0iYXNJbnZva2VyIiB1aUFjY2Vzcz0iZmFsc2UiLz4KKyAgIDwvcmVxdWVzdGVkUHJpdmlsZWdlcz4KKyAgPC9zZWN1cml0eT4KKyA8L3RydXN0SW5mbz4KKzwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS90b29scy9jaS1Eb2NrZXJmaWxlLmluIGIvdG9vbHMvY2ktRG9ja2VyZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTk4YjBkCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvY2ktRG9ja2VyZmlsZS5pbgpAQCAtMCwwICsxLDEwIEBACitGUk9NIEBjaV9kb2NrZXJACitFTlYgY29udGFpbmVyIGRvY2tlcgorCitBREQgdG9vbHMvY2ktaW5zdGFsbC5zaCAvY2ktaW5zdGFsbC5zaAorUlVOIGNpX3N1aXRlPSJAY2lfc3VpdGVAIiBjaV9kaXN0cm89IkBjaV9kaXN0cm9AIiBjaV9pbl9kb2NrZXI9eWVzIC9jaS1pbnN0YWxsLnNoCisKK0FERCAuIC9ob21lL3VzZXIvY2kKK1JVTiBjaG93biAtUiB1c2VyOnVzZXIgL2hvbWUvdXNlci9jaQorV09SS0RJUiAvaG9tZS91c2VyL2NpCitVU0VSIHVzZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2NpLWJ1aWxkLnNoIGIvdG9vbHMvY2ktYnVpbGQuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2IxOWY0YQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2NpLWJ1aWxkLnNoCkBAIC0wLDAgKzEsMzE1IEBACisjIS9iaW4vYmFzaAorCisjIENvcHlyaWdodCDCqSAyMDE1LTIwMTYgQ29sbGFib3JhIEx0ZC4KKyMKKyMgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyMgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMKKyMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwKKyMgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwKKyMgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwKKyMgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKKyMgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisjCisjIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCisjIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorIworIyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyMgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisjIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisjIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisjIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisjIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyMgU09GVFdBUkUuCisKK3NldCAtZXVvIHBpcGVmYWlsCitzZXQgLXgKKworTlVMTD0KKworIyBjaV9idWlsZHN5czoKKyMgQnVpbGQgc3lzdGVtIHVuZGVyIHRlc3Q6IGF1dG90b29scyBvciBjbWFrZQorOiAiJHtjaV9idWlsZHN5czo9YXV0b3Rvb2xzfSIKKworIyBjaV9kaXN0cm86CisjIE9TIGRpc3RyaWJ1dGlvbiBpbiB3aGljaCB3ZSBhcmUgdGVzdGluZworIyBUeXBpY2FsIHZhbHVlczogdWJ1bnR1LCBkZWJpYW47IG1heWJlIGZlZG9yYSBpbiBmdXR1cmUKKzogIiR7Y2lfZGlzdHJvOj11YnVudHV9IgorCisjIGNpX2RvY2tlcjoKKyMgSWYgbm9uLWVtcHR5LCB0aGlzIGlzIHRoZSBuYW1lIG9mIGEgRG9ja2VyIGltYWdlLiBjaS1pbnN0YWxsLnNoIHdpbGwKKyMgZmV0Y2ggaXQgd2l0aCAiZG9ja2VyIHB1bGwiIGFuZCB1c2UgaXQgYXMgYSBiYXNlIGZvciBhIG5ldyBEb2NrZXIgaW1hZ2UKKyMgbmFtZWQgImNpLWltYWdlIiBpbiB3aGljaCB3ZSB3aWxsIGRvIG91ciB0ZXN0aW5nLgorIworIyBJZiBlbXB0eSwgd2UgdGVzdCBvbiAiYmFyZSBtZXRhbCIuCisjIFR5cGljYWwgdmFsdWVzOiB1YnVudHU6eGVuaWFsLCBkZWJpYW46amVzc2llLXNsaW0KKzogIiR7Y2lfZG9ja2VyOj19IgorCisjIGNpX2hvc3Q6CisjIFNlZSBjaS1pbnN0YWxsLnNoCis6ICIke2NpX2hvc3Q6PW5hdGl2ZX0iCisKKyMgY2lfcGFyYWxsZWw6CisjIEEgbnVtYmVyIG9mIHBhcmFsbGVsIGpvYnMsIHBhc3NlZCB0byBtYWtlIC1qCis6ICIke2NpX3BhcmFsbGVsOj0xfSIKKworIyBjaV9zdWRvOgorIyBJZiB5ZXMsIGFzc3VtZSB3ZSBjYW4gZ2V0IHJvb3QgdXNpbmcgc3VkbzsgaWYgbm8sIG9ubHkgdXNlIGN1cnJlbnQgdXNlcgorOiAiJHtjaV9zdWRvOj1ub30iCisKKyMgY2lfc3VpdGU6CisjIE9TIHN1aXRlIChyZWxlYXNlLCBicmFuY2gpIGluIHdoaWNoIHdlIGFyZSB0ZXN0aW5nLgorIyBUeXBpY2FsIHZhbHVlcyBmb3IgY2lfZGlzdHJvPWRlYmlhbjogc2lkLCBqZXNzaWUKKyMgVHlwaWNhbCB2YWx1ZXMgZm9yIGNpX2Rpc3Rybz1mZWRvcmEgbWlnaHQgYmUgMjUsIHJhd2hpZGUKKzogIiR7Y2lfc3VpdGU6PXhlbmlhbH0iCisKKyMgY2lfdGVzdDoKKyMgSWYgeWVzLCBydW4gdGVzdHM7IGlmIG5vLCBqdXN0IGJ1aWxkCis6ICIke2NpX3Rlc3Q6PXllc30iCisKKyMgY2lfdGVzdF9mYXRhbDoKKyMgSWYgeWVzLCB0ZXN0IGZhaWx1cmVzIGJyZWFrIHRoZSBidWlsZDsgaWYgbm8sIHRoZXkgYXJlIHJlcG9ydGVkIGJ1dCBpZ25vcmVkCis6ICIke2NpX3Rlc3RfZmF0YWw6PXllc30iCisKKyMgY2lfdmFyaWFudDoKKyMgT25lIG9mIGRlYnVnLCByZWR1Y2VkLCBsZWdhY3ksIHByb2R1Y3Rpb24KKzogIiR7Y2lfdmFyaWFudDo9cHJvZHVjdGlvbn0iCisKK2lmIFsgLW4gIiRjaV9kb2NrZXIiIF07IHRoZW4KKyAgICBleGVjIGRvY2tlciBydW4gXAorICAgICAgICAtLWVudj1jaV9idWlsZHN5cz0iJHtjaV9idWlsZHN5c30iIFwKKyAgICAgICAgLS1lbnY9Y2lfZG9ja2VyPSIiIFwKKyAgICAgICAgLS1lbnY9Y2lfaG9zdD0iJHtjaV9ob3N0fSIgXAorICAgICAgICAtLWVudj1jaV9wYXJhbGxlbD0iJHtjaV9wYXJhbGxlbH0iIFwKKyAgICAgICAgLS1lbnY9Y2lfc3Vkbz15ZXMgXAorICAgICAgICAtLWVudj1jaV90ZXN0PSIke2NpX3Rlc3R9IiBcCisgICAgICAgIC0tZW52PWNpX3Rlc3RfZmF0YWw9IiR7Y2lfdGVzdF9mYXRhbH0iIFwKKyAgICAgICAgLS1lbnY9Y2lfdmFyaWFudD0iJHtjaV92YXJpYW50fSIgXAorICAgICAgICAtLXByaXZpbGVnZWQgXAorICAgICAgICBjaS1pbWFnZSBcCisgICAgICAgIHRvb2xzL2NpLWJ1aWxkLnNoCitmaQorCittYXliZV9mYWlsX3Rlc3RzICgpIHsKKyAgICBpZiBbICIkY2lfdGVzdF9mYXRhbCIgPSB5ZXMgXTsgdGhlbgorICAgICAgICBleGl0IDEKKyAgICBmaQorfQorCitOT0NPTkZJR1VSRT0xIC4vYXV0b2dlbi5zaAorCitzcmNkaXI9IiQocHdkKSIKK21rZGlyIGNpLWJ1aWxkLSR7Y2lfdmFyaWFudH0tJHtjaV9ob3N0fQorY2QgY2ktYnVpbGQtJHtjaV92YXJpYW50fS0ke2NpX2hvc3R9CisKK21ha2U9Im1ha2UgLWoke2NpX3BhcmFsbGVsfSBWPTEgVkVSQk9TRT0xIgorCitjYXNlICIkY2lfaG9zdCIgaW4KKyAgICAoKi13NjQtbWluZ3czMikKKyAgICAgICAgbWlycm9yPWh0dHA6Ly9yZXBvLm1zeXMyLm9yZy9taW5ndy8ke2NpX2hvc3QlJS0qfQorICAgICAgICBpZiBbICIke2NpX2hvc3QlJS0qfSIgPSBpNjg2IF07IHRoZW4KKyAgICAgICAgICAgIG1pbmd3PSIkKHB3ZCkvbWluZ3czMiIKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbWluZ3c9IiQocHdkKS9taW5ndzY0IgorICAgICAgICBmaQorICAgICAgICBpbnN0YWxsIC1kICIke21pbmd3fSIKKyAgICAgICAgZXhwb3J0IFBLR19DT05GSUdfTElCRElSPSIke21pbmd3fS9saWIvcGtnY29uZmlnIgorICAgICAgICBleHBvcnQgUEtHX0NPTkZJR19QQVRIPQorICAgICAgICBleHBvcnQgUEtHX0NPTkZJRz0icGtnLWNvbmZpZyAtLWRlZmluZS12YXJpYWJsZT1wcmVmaXg9JHttaW5nd30iCisgICAgICAgIHVuc2V0IENDCisgICAgICAgIHVuc2V0IENYWAorICAgICAgICBmb3IgcGtnIGluIFwKKyAgICAgICAgICAgIGV4cGF0LTIuMS4wLTYgXAorICAgICAgICAgICAgZ2NjLWxpYnMtNS4yLjAtNCBcCisgICAgICAgICAgICBnZXR0ZXh0LTAuMTkuNi0xIFwKKyAgICAgICAgICAgIGdsaWIyLTIuNDYuMS0xIFwKKyAgICAgICAgICAgIGxpYmZmaS0zLjIuMS0zIFwKKyAgICAgICAgICAgIHpsaWItMS4yLjgtOSBcCisgICAgICAgICAgICA7IGRvCisgICAgICAgICAgICB3Z2V0ICR7bWlycm9yfS9taW5ndy13NjQtJHtjaV9ob3N0JSUtKn0tJHtwa2d9LWFueS5wa2cudGFyLnh6CisgICAgICAgICAgICB0YXIgLXh2ZiBtaW5ndy13NjQtJHtjaV9ob3N0JSUtKn0tJHtwa2d9LWFueS5wa2cudGFyLnh6CisgICAgICAgIGRvbmUKKyAgICAgICAgZXhwb3J0IFRNUERJUj0vdG1wCisgICAgICAgIDs7Citlc2FjCisKK2Nhc2UgIiRjaV9idWlsZHN5cyIgaW4KKyAgICAoYXV0b3Rvb2xzKQorICAgICAgICBjYXNlICIkY2lfdmFyaWFudCIgaW4KKyAgICAgICAgICAgIChkZWJ1ZykKKyAgICAgICAgICAgICAgICAjIEZ1bGwgZGV2ZWxvcGVyL2RlYnVnIGJ1aWxkLgorICAgICAgICAgICAgICAgIHNldCBfICIkQCIKKyAgICAgICAgICAgICAgICBzZXQgIiRAIiAtLWVuYWJsZS1kZXZlbG9wZXIgLS1lbmFibGUtdGVzdHMKKyAgICAgICAgICAgICAgICAjIEVuYWJsZSBvcHRpb25hbCBmZWF0dXJlcyB0aGF0IGFyZSBvZmYgYnkgZGVmYXVsdAorICAgICAgICAgICAgICAgIGNhc2UgIiRjaV9ob3N0IiBpbgorICAgICAgICAgICAgICAgICAgICAqLXc2NC1taW5ndzMyKQorICAgICAgICAgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgICAgICAgICAgKikKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldCAiJEAiIC0tZW5hYmxlLXVzZXItc2Vzc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgICAgICBlc2FjCisgICAgICAgICAgICAgICAgc2hpZnQKKyAgICAgICAgICAgICAgICAjIFRoZSB0ZXN0IGNvdmVyYWdlIGZvciBPT00tc2FmZXR5IGlzIHRvbworICAgICAgICAgICAgICAgICMgdmVyYm9zZSB0byBiZSB1c2VmdWwgb24gdHJhdmlzLWNpLgorICAgICAgICAgICAgICAgIGV4cG9ydCBEQlVTX1RFU1RfTUFMTE9DX0ZBSUxVUkVTPTAKKyAgICAgICAgICAgICAgICA7OworCisgICAgICAgICAgICAocmVkdWNlZCkKKyAgICAgICAgICAgICAgICAjIEEgc21hbGxlciBjb25maWd1cmF0aW9uIHRoYW4gbm9ybWFsLCB3aXRoCisgICAgICAgICAgICAgICAgIyB2YXJpb3VzIGZlYXR1cmVzIGRpc2FibGVkOyB0aGlzIGVtdWxhdGVzCisgICAgICAgICAgICAgICAgIyBhbiBvbGRlciBzeXN0ZW0gb3Igb25lIHRoYXQgZG9lcyBub3QgaGF2ZQorICAgICAgICAgICAgICAgICMgYWxsIHRoZSBvcHRpb25hbCBsaWJyYXJpZXMuCisgICAgICAgICAgICAgICAgc2V0IF8gIiRAIgorICAgICAgICAgICAgICAgICMgTm8gTFNNcyAodGhlIHByb2R1Y3Rpb24gYnVpbGQgaGFzIGJvdGgpCisgICAgICAgICAgICAgICAgc2V0ICIkQCIgLS1kaXNhYmxlLXNlbGludXggLS1kaXNhYmxlLWFwcGFybW9yCisgICAgICAgICAgICAgICAgIyBObyBpbm90aWZ5ICh3ZSB3aWxsIHVzZSBkbm90aWZ5KQorICAgICAgICAgICAgICAgIHNldCAiJEAiIC0tZGlzYWJsZS1pbm90aWZ5CisgICAgICAgICAgICAgICAgIyBObyBlcG9sbCBvciBrcXVldWUgKHdlIHdpbGwgdXNlIHBvbGwpCisgICAgICAgICAgICAgICAgc2V0ICIkQCIgLS1kaXNhYmxlLWVwb2xsIC0tZGlzYWJsZS1rcXVldWUKKyAgICAgICAgICAgICAgICAjIE5vIHNwZWNpYWwgaW5pdCBzeXN0ZW0gc3VwcG9ydAorICAgICAgICAgICAgICAgIHNldCAiJEAiIC0tZGlzYWJsZS1sYXVuY2hkIC0tZGlzYWJsZS1zeXN0ZW1kCisgICAgICAgICAgICAgICAgIyBObyBsaWJhdWRpdCBvciB2YWxncmluZAorICAgICAgICAgICAgICAgIHNldCAiJEAiIC0tZGlzYWJsZS1saWJhdWRpdCAtLXdpdGhvdXQtdmFsZ3JpbmQKKyAgICAgICAgICAgICAgICAjIERpc2FibGUgb3B0aW9uYWwgZmVhdHVyZXMsIHNvbWUgb2Ygd2hpY2ggYXJlIG9uIGJ5CisgICAgICAgICAgICAgICAgIyBkZWZhdWx0CisgICAgICAgICAgICAgICAgc2V0ICIkQCIgLS1kaXNhYmxlLXN0YXRzCisgICAgICAgICAgICAgICAgc2V0ICIkQCIgLS1kaXNhYmxlLXVzZXItc2Vzc2lvbgorICAgICAgICAgICAgICAgIHNoaWZ0CisgICAgICAgICAgICAgICAgOzsKKworICAgICAgICAgICAgKGxlZ2FjeSkKKyAgICAgICAgICAgICAgICAjIEFuIHVucmVhbGlzdGljYWxseSBjdXQtZG93biBjb25maWd1cmF0aW9uLAorICAgICAgICAgICAgICAgICMgdG8gY2hlY2sgdGhhdCBpdCBjb21waWxlcyBhbmQgd29ya3MuCisgICAgICAgICAgICAgICAgc2V0IF8gIiRAIgorICAgICAgICAgICAgICAgICMgRGlzYWJsZSBuYXRpdmUgYXRvbWljIG9wZXJhdGlvbnMgb24gVW5peAorICAgICAgICAgICAgICAgICMgKGFybXY0LCBhcyB1c2VkIGFzIHRoZSBiYXNlbGluZSBmb3IgRGViaWFuCisgICAgICAgICAgICAgICAgIyBhcm1lbCwgaXMgb25lIGFyY2hpdGVjdHVyZSB0aGF0IHJlYWxseQorICAgICAgICAgICAgICAgICMgZG9lc24ndCBoYXZlIHRoZW0pCisgICAgICAgICAgICAgICAgc2V0ICIkQCIgZGJ1c19jdl9zeW5jX3N1Yl9hbmRfZmV0Y2g9bm8KKyAgICAgICAgICAgICAgICAjIE5vIGVwb2xsLCBrcXVldWUgb3IgcG9sbCAod2Ugd2lsbCBmYWxsIGJhY2sKKyAgICAgICAgICAgICAgICAjIHRvIHNlbGVjdCwgZXZlbiBvbiBVbml4IHdoZXJlIHdlIHdvdWxkCisgICAgICAgICAgICAgICAgIyB1c3VhbGx5IGF0IGxlYXN0IGhhdmUgcG9sbCkKKyAgICAgICAgICAgICAgICBzZXQgIiRAIiAtLWRpc2FibGUtZXBvbGwgLS1kaXNhYmxlLWtxdWV1ZQorICAgICAgICAgICAgICAgIHNldCAiJEAiIENQUEZMQUdTPS1EQlJPS0VOX1BPTEw9MQorICAgICAgICAgICAgICAgICMgRW5hYmxlIFNFTGludXggYW5kIEFwcEFybW9yIGJ1dCBub3QKKyAgICAgICAgICAgICAgICAjIGxpYmF1ZGl0IC0gdGhhdCBjb25maWd1cmF0aW9uIGhhcyBzb21ldGltZXMKKyAgICAgICAgICAgICAgICAjIGZhaWxlZAorICAgICAgICAgICAgICAgIHNldCAiJEAiIC0tZW5hYmxlLXNlbGludXggLS1lbmFibGUtYXBwYXJtb3IKKyAgICAgICAgICAgICAgICBzZXQgIiRAIiAtLWRpc2FibGUtbGliYXVkaXQgLS13aXRob3V0LXZhbGdyaW5kCisgICAgICAgICAgICAgICAgIyBObyBkaXJlY3RvcnkgbW9uaXRvcmluZyBhdCBhbGwKKyAgICAgICAgICAgICAgICBzZXQgIiRAIiAtLWRpc2FibGUtaW5vdGlmeSAtLWRpc2FibGUtZG5vdGlmeQorICAgICAgICAgICAgICAgICMgTm8gc3BlY2lhbCBpbml0IHN5c3RlbSBzdXBwb3J0CisgICAgICAgICAgICAgICAgc2V0ICIkQCIgLS1kaXNhYmxlLWxhdW5jaGQgLS1kaXNhYmxlLXN5c3RlbWQKKyAgICAgICAgICAgICAgICAjIE5vIFgxMSBhdXRvbGF1bmNoaW5nCisgICAgICAgICAgICAgICAgc2V0ICIkQCIgLS1kaXNhYmxlLXgxMS1hdXRvbGF1bmNoCisgICAgICAgICAgICAgICAgIyBSZS1lbmFibGUgdGhlIGRlcHJlY2F0ZWQgcGFtX2NvbnNvbGUgc3VwcG9ydCB0byBtYWtlCisgICAgICAgICAgICAgICAgIyBzdXJlIGl0IHN0aWxsIGJ1aWxkcworICAgICAgICAgICAgICAgIHNldCAiJEAiIC0td2l0aC1jb25zb2xlLWF1dGgtZGlyPS92YXIvcnVuL2NvbnNvbGUKKyAgICAgICAgICAgICAgICAjIExlYXZlIHN0YXRzLCB1c2VyLXNlc3Npb24sIGV0Yy4gYXQgZGVmYXVsdCBzZXR0aW5ncworICAgICAgICAgICAgICAgICMgdG8gY2hlY2sgdGhhdCB0aGUgZGVmYXVsdHMgY2FuIGNvbXBpbGUgb24gYW4gb2xkIE9TCisgICAgICAgICAgICAgICAgc2hpZnQKKyAgICAgICAgICAgICAgICA7OworCisgICAgICAgICAgICAoKikKKyAgICAgICAgICAgICAgICA7OworICAgICAgICBlc2FjCisKKyAgICAgICAgY2FzZSAiJGNpX2hvc3QiIGluCisgICAgICAgICAgICAoKi13NjQtbWluZ3czMikKKyAgICAgICAgICAgICAgICBzZXQgXyAiJEAiCisgICAgICAgICAgICAgICAgc2V0ICIkQCIgLS1idWlsZD0iJChidWlsZC1hdXgvY29uZmlnLmd1ZXNzKSIKKyAgICAgICAgICAgICAgICBzZXQgIiRAIiAtLWhvc3Q9IiR7Y2lfaG9zdH0iCisgICAgICAgICAgICAgICAgc2V0ICIkQCIgQ0ZMQUdTPS1zdGF0aWMtbGliZ2NjCisgICAgICAgICAgICAgICAgc2V0ICIkQCIgQ1hYRkxBR1M9LXN0YXRpYy1saWJnY2MKKyAgICAgICAgICAgICAgICAjIGRvbid0IHJ1biB0ZXN0cyB5ZXQsIFdpbmUgbmVlZHMgWHZmYiBhbmQKKyAgICAgICAgICAgICAgICAjIG1vcmUgbXN5czIgbGlicmFyaWVzCisgICAgICAgICAgICAgICAgY2lfdGVzdD1ubworICAgICAgICAgICAgICAgICMgZG9uJ3QgIm1ha2UgaW5zdGFsbCIgc3lzdGVtLXdpZGUKKyAgICAgICAgICAgICAgICBjaV9zdWRvPW5vCisgICAgICAgICAgICAgICAgc2hpZnQKKyAgICAgICAgICAgICAgICA7OworICAgICAgICBlc2FjCisKKyAgICAgICAgLi4vY29uZmlndXJlIFwKKyAgICAgICAgICAgIC0tZW5hYmxlLWluc3RhbGxlZC10ZXN0cyBcCisgICAgICAgICAgICAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgXAorICAgICAgICAgICAgLS1lbmFibGUtbW9kdWxhci10ZXN0cyBcCisgICAgICAgICAgICAiJEAiCisKKyAgICAgICAgJHttYWtlfQorICAgICAgICBbICIkY2lfdGVzdCIgPSBubyBdIHx8ICR7bWFrZX0gY2hlY2sgfHwgbWF5YmVfZmFpbF90ZXN0cworICAgICAgICBjYXQgdGVzdC90ZXN0LXN1aXRlLmxvZyB8fCA6CisgICAgICAgIFsgIiRjaV90ZXN0IiA9IG5vIF0gfHwgJHttYWtlfSBkaXN0Y2hlY2sgfHwgbWF5YmVfZmFpbF90ZXN0cworCisgICAgICAgICR7bWFrZX0gaW5zdGFsbCBERVNURElSPSQocHdkKS9ERVNURElSCisgICAgICAgICggY2QgREVTVERJUiAmJiBmaW5kIC4gLWxzICkKKworICAgICAgICBjYXNlICIkY2lfc3VpdGUiIGluCisgICAgICAgICAgICAoamVzc2llfHhlbmlhbHxzdHJldGNoKQorICAgICAgICAgICAgICAgICMgdGhlc2UgYXJlIHRvbyBvbGQgZm9yIG1haW50YWluZXItdXBsb2FkLWRvY3MKKyAgICAgICAgICAgICAgICA7OworCisgICAgICAgICAgICAoKikKKyAgICAgICAgICAgICAgICAjIGFzc3VtZSBVYnVudHUgMTguMDQgJ2Jpb25pYycsIERlYmlhbiAxMCAnYnVzdGVyJyBvciBuZXdlcgorICAgICAgICAgICAgICAgICR7bWFrZX0gLUMgZG9jIGRidXMtZG9jcy50YXIueHoKKyAgICAgICAgICAgICAgICB0YXIgLUMgJChwd2QpL0RFU1RESVIgLXhmIGRvYy9kYnVzLWRvY3MudGFyLnh6CisgICAgICAgICAgICAgICAgKCBjZCBERVNURElSL2RidXMtZG9jcyAmJiBmaW5kIC4gLWxzICkKKyAgICAgICAgICAgICAgICA7OworICAgICAgICBlc2FjCisKKyAgICAgICAgaWYgWyAiJGNpX3N1ZG8iID0geWVzIF0gJiYgWyAiJGNpX3Rlc3QiID0geWVzIF07IHRoZW4KKyAgICAgICAgICAgIHN1ZG8gJHttYWtlfSBpbnN0YWxsCisgICAgICAgICAgICBzdWRvIGVudiBMRF9MSUJSQVJZX1BBVEg9L3Vzci9sb2NhbC9saWIgXAorICAgICAgICAgICAgICAgIC91c3IvbG9jYWwvYmluL2RidXMtdXVpZGdlbiAtLWVuc3VyZQorICAgICAgICAgICAgTERfTElCUkFSWV9QQVRIPS91c3IvbG9jYWwvbGliICR7bWFrZX0gaW5zdGFsbGNoZWNrIHx8IFwKKyAgICAgICAgICAgICAgICBtYXliZV9mYWlsX3Rlc3RzCisgICAgICAgICAgICBjYXQgdGVzdC90ZXN0LXN1aXRlLmxvZyB8fCA6CisKKyAgICAgICAgICAgICMgcmUtcnVuIHRoZW0gd2l0aCBnbm9tZS1kZXNrdG9wLXRlc3RpbmcKKyAgICAgICAgICAgIGVudiBMRF9MSUJSQVJZX1BBVEg9L3Vzci9sb2NhbC9saWIgXAorICAgICAgICAgICAgZ25vbWUtZGVza3RvcC10ZXN0aW5nLXJ1bm5lciAtZCAvdXNyL2xvY2FsL3NoYXJlIGRidXMvIHx8IFwKKyAgICAgICAgICAgICAgICBtYXliZV9mYWlsX3Rlc3RzCisKKyAgICAgICAgICAgICMgdGhlc2UgdGVzdHMgYmVuZWZpdCBmcm9tIGJlaW5nIHJlLXJ1biBhcyByb290LCBhbmQgb25lCisgICAgICAgICAgICAjIHRlc3QgbmVlZHMgYSBmaW5pdGUgZmQgbGltaXQgdG8gYmUgdXNlZnVsCisgICAgICAgICAgICBzdWRvIGVudiBMRF9MSUJSQVJZX1BBVEg9L3Vzci9sb2NhbC9saWIgXAorICAgICAgICAgICAgYmFzaCAtYyAndWxpbWl0IC1TIC1uIDEwMjQ7IHVsaW1pdCAtSCAtbiA0MDk2OyBleGVjICIkQCInIGJhc2ggXAorICAgICAgICAgICAgICAgIGdub21lLWRlc2t0b3AtdGVzdGluZy1ydW5uZXIgLWQgL3Vzci9sb2NhbC9zaGFyZSBcCisgICAgICAgICAgICAgICAgZGJ1cy90ZXN0LWRidXMtZGFlbW9uX3dpdGhfY29uZmlnLnRlc3QgXAorICAgICAgICAgICAgICAgIGRidXMvdGVzdC11aWQtcGVybWlzc2lvbnNfd2l0aF9jb25maWcudGVzdCB8fCBcCisgICAgICAgICAgICAgICAgbWF5YmVfZmFpbF90ZXN0cworICAgICAgICBmaQorICAgICAgICA7OworCisgICAgKGNtYWtlKQorICAgICAgICBjYXNlICIkY2lfaG9zdCIgaW4KKyAgICAgICAgICAgICgqLXc2NC1taW5ndzMyKQorICAgICAgICAgICAgICAgIHNldCBfICIkQCIKKyAgICAgICAgICAgICAgICBzZXQgIiRAIiAtRCBDTUFLRV9UT09MQ0hBSU5fRklMRT0iJHtzcmNkaXJ9L2NtYWtlLyR7Y2lfaG9zdH0uY21ha2UiCisgICAgICAgICAgICAgICAgc2V0ICIkQCIgLUQgQ01BS0VfUFJFRklYX1BBVEg9IiR7bWluZ3d9IgorICAgICAgICAgICAgICAgIHNldCAiJEAiIC1EIENNQUtFX0lOQ0xVREVfUEFUSD0iJHttaW5nd30vaW5jbHVkZSIKKyAgICAgICAgICAgICAgICBzZXQgIiRAIiAtRCBDTUFLRV9MSUJSQVJZX1BBVEg9IiR7bWluZ3d9L2xpYiIKKyAgICAgICAgICAgICAgICBzZXQgIiRAIiAtRCBFWFBBVF9MSUJSQVJZPSIke21pbmd3fS9saWIvbGliZXhwYXQuZGxsLmEiCisgICAgICAgICAgICAgICAgc2V0ICIkQCIgLUQgR0xJQjJfTElCUkFSSUVTPSIke21pbmd3fS9saWIvbGliZ2xpYi0yLjAuZGxsLmEiCisgICAgICAgICAgICAgICAgc2V0ICIkQCIgLUQgR09CSkVDVF9MSUJSQVJJRVM9IiR7bWluZ3d9L2xpYi9saWJnb2JqZWN0LTIuMC5kbGwuYSIKKyAgICAgICAgICAgICAgICBzZXQgIiRAIiAtRCBHSU9fTElCUkFSSUVTPSIke21pbmd3fS9saWIvbGliZ2lvLTIuMC5kbGwuYSIKKyAgICAgICAgICAgICAgICBzaGlmdAorICAgICAgICAgICAgICAgICMgZG9uJ3QgcnVuIHRlc3RzIHlldCwgV2luZSBuZWVkcyBYdmZiIGFuZCBtb3JlCisgICAgICAgICAgICAgICAgIyBtc3lzMiBsaWJyYXJpZXMKKyAgICAgICAgICAgICAgICBjaV90ZXN0PW5vCisgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgZXNhYworCisgICAgICAgIGNtYWtlICIkQCIgLi4vY21ha2UKKworICAgICAgICAke21ha2V9CisgICAgICAgICMgVGhlIHRlc3QgY292ZXJhZ2UgZm9yIE9PTS1zYWZldHkgaXMgdG9vIHZlcmJvc2UgdG8gYmUgdXNlZnVsIG9uCisgICAgICAgICMgdHJhdmlzLWNpLgorICAgICAgICBleHBvcnQgREJVU19URVNUX01BTExPQ19GQUlMVVJFUz0wCisgICAgICAgIFsgIiRjaV90ZXN0IiA9IG5vIF0gfHwgY3Rlc3QgLVZWIHx8IG1heWJlX2ZhaWxfdGVzdHMKKyAgICAgICAgJHttYWtlfSBpbnN0YWxsIERFU1RESVI9JChwd2QpL0RFU1RESVIKKyAgICAgICAgKCBjZCBERVNURElSICYmIGZpbmQgLiAtbHMpCisgICAgICAgIDs7Citlc2FjCisKKyMgdmltOnNldCBzdz00IHN0cz00IGV0OgpkaWZmIC0tZ2l0IGEvdG9vbHMvY2ktaW5zdGFsbC5zaCBiL3Rvb2xzL2NpLWluc3RhbGwuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMWMyZTNiNgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2NpLWluc3RhbGwuc2gKQEAgLTAsMCArMSwxODggQEAKKyMhL2Jpbi9iYXNoCisKKyMgQ29weXJpZ2h0IMKpIDIwMTUtMjAxNiBDb2xsYWJvcmEgTHRkLgorIworIyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorIyBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcworIyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLAorIyBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLAorIyBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLAorIyBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAorIyBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyMKKyMgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKKyMgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisjCisjIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorIyBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyMgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyMgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworIyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyMgQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyMgQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorIyBTT0ZUV0FSRS4KKworc2V0IC1ldW8gcGlwZWZhaWwKK3NldCAteAorCitOVUxMPQorCisjIGNpX2Rpc3RybzoKKyMgT1MgZGlzdHJpYnV0aW9uIGluIHdoaWNoIHdlIGFyZSB0ZXN0aW5nCisjIFR5cGljYWwgdmFsdWVzOiB1YnVudHUsIGRlYmlhbjsgbWF5YmUgZmVkb3JhIGluIGZ1dHVyZQorOiAiJHtjaV9kaXN0cm86PXVidW50dX0iCisKKyMgY2lfZG9ja2VyOgorIyBJZiBub24tZW1wdHksIHRoaXMgaXMgdGhlIG5hbWUgb2YgYSBEb2NrZXIgaW1hZ2UuIGNpLWluc3RhbGwuc2ggd2lsbAorIyBmZXRjaCBpdCB3aXRoICJkb2NrZXIgcHVsbCIgYW5kIHVzZSBpdCBhcyBhIGJhc2UgZm9yIGEgbmV3IERvY2tlciBpbWFnZQorIyBuYW1lZCAiY2ktaW1hZ2UiIGluIHdoaWNoIHdlIHdpbGwgZG8gb3VyIHRlc3RpbmcuCis6ICIke2NpX2RvY2tlcjo9fSIKKworIyBjaV9ob3N0OgorIyBFaXRoZXIgIm5hdGl2ZSIsIG9yIGFuIEF1dG9jb25mIC0taG9zdCBhcmd1bWVudCB0byBjcm9zcy1jb21waWxlCisjIHRoZSBwYWNrYWdlCis6ICIke2NpX2hvc3Q6PW5hdGl2ZX0iCisKKyMgY2lfaW5fZG9ja2VyOgorIyBVc2VkIGludGVybmFsbHkgYnkgY2ktaW5zdGFsbC5zaC4gSWYgeWVzLCB3ZSBhcmUgaW5zaWRlIHRoZSBEb2NrZXIgaW1hZ2UKKyMgKGNpX2RvY2tlciBpcyBlbXB0eSBpbiB0aGlzIGNhc2UpLgorOiAiJHtjaV9pbl9kb2NrZXI6PW5vfSIKKworIyBjaV9zdWl0ZToKKyMgT1Mgc3VpdGUgKHJlbGVhc2UsIGJyYW5jaCkgaW4gd2hpY2ggd2UgYXJlIHRlc3RpbmcuCisjIFR5cGljYWwgdmFsdWVzIGZvciBjaV9kaXN0cm89ZGViaWFuOiBzaWQsIGplc3NpZQorIyBUeXBpY2FsIHZhbHVlcyBmb3IgY2lfZGlzdHJvPWZlZG9yYSBtaWdodCBiZSAyNSwgcmF3aGlkZQorOiAiJHtjaV9zdWl0ZTo9eGVuaWFsfSIKKworaWYgWyAkKGlkIC11KSA9IDAgXTsgdGhlbgorICAgIHN1ZG89CitlbHNlCisgICAgc3Vkbz1zdWRvCitmaQorCitpZiBbIC1uICIkY2lfZG9ja2VyIiBdOyB0aGVuCisgICAgc2VkIFwKKyAgICAgICAgLWUgInMvQGNpX2Rpc3Ryb0AvJHtjaV9kaXN0cm99LyIgXAorICAgICAgICAtZSAicy9AY2lfZG9ja2VyQC8ke2NpX2RvY2tlcn0vIiBcCisgICAgICAgIC1lICJzL0BjaV9zdWl0ZUAvJHtjaV9zdWl0ZX0vIiBcCisgICAgICAgIDwgdG9vbHMvY2ktRG9ja2VyZmlsZS5pbiA+IERvY2tlcmZpbGUKKyAgICBleGVjIGRvY2tlciBidWlsZCAtdCBjaS1pbWFnZSAuCitmaQorCitjYXNlICIkY2lfZGlzdHJvIiBpbgorICAgIChkZWJpYW58dWJ1bnR1KQorICAgICAgICAjIERvbid0IGFzayBxdWVzdGlvbnMsIGp1c3QgZG8gaXQKKyAgICAgICAgc3Vkbz0iJHN1ZG8gZW52IERFQklBTl9GUk9OVEVORD1ub25pbnRlcmFjdGl2ZSIKKworICAgICAgICAjIERlYmlhbiBEb2NrZXIgaW1hZ2VzIHVzZSBodHRwcmVkaXIuZGViaWFuLm9yZyBidXQgaXQgc2VlbXMgdG8gYmUKKyAgICAgICAgIyB1bnJlbGlhYmxlOyB1c2UgYSBDRE4gaW5zdGVhZAorICAgICAgICAkc3VkbyBzZWQgLWkgLWUgJ3MvaHR0cHJlZGlyXC5kZWJpYW5cLm9yZy9kZWIuZGViaWFuLm9yZy9nJyBcCisgICAgICAgICAgICAvZXRjL2FwdC9zb3VyY2VzLmxpc3QKKworICAgICAgICBjYXNlICIkY2lfc3VpdGUiIGluCisgICAgICAgICAgICAoeGVuaWFsKQorICAgICAgICAgICAgICAgICMgVWJ1bnR1IDE2LjA0IGRpZG4ndCBoYXZlIHRoZSB3aW5lMzIsIHdpbmU2NCBwYWNrYWdlcworICAgICAgICAgICAgICAgIHdpbmUzMj13aW5lOmkzODYKKyAgICAgICAgICAgICAgICB3aW5lNjQ9d2luZTphbWQ2NAorICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICAoKikKKyAgICAgICAgICAgICAgICB3aW5lMzI9d2luZTMyCisgICAgICAgICAgICAgICAgd2luZTY0PXdpbmU2NAorICAgICAgICAgICAgICAgIDs7CisgICAgICAgIGVzYWMKKworICAgICAgICBjYXNlICIkY2lfaG9zdCIgaW4KKyAgICAgICAgICAgIChpNjg2LXc2NC1taW5ndzMyKQorICAgICAgICAgICAgICAgICRzdWRvIGRwa2cgLS1hZGQtYXJjaGl0ZWN0dXJlIGkzODYKKyAgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgKHg4Nl82NC13NjQtbWluZ3czMikKKyAgICAgICAgICAgICAgICAjIGFzc3VtZSB0aGUgaG9zdCBvciBjb250YWluZXIgaXMgeDg2XzY0IGFscmVhZHkKKyAgICAgICAgICAgICAgICA7OworICAgICAgICBlc2FjCisKKyAgICAgICAgJHN1ZG8gYXB0LWdldCAtcXEgLXkgdXBkYXRlCisKKyAgICAgICAgY2FzZSAiJGNpX2hvc3QiIGluCisgICAgICAgICAgICAoaTY4Ni13NjQtbWluZ3czMikKKyAgICAgICAgICAgICAgICAkc3VkbyBhcHQtZ2V0IC1xcSAteSBpbnN0YWxsIFwKKyAgICAgICAgICAgICAgICAgICAgYmludXRpbHMtbWluZ3ctdzY0LWk2ODYgXAorICAgICAgICAgICAgICAgICAgICBnKystbWluZ3ctdzY0LWk2ODYgXAorICAgICAgICAgICAgICAgICAgICAkd2luZTMyIFwKKyAgICAgICAgICAgICAgICAgICAgJHtOVUxMfQorICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICAoeDg2XzY0LXc2NC1taW5ndzMyKQorICAgICAgICAgICAgICAgICRzdWRvIGFwdC1nZXQgLXFxIC15IGluc3RhbGwgXAorICAgICAgICAgICAgICAgICAgICBiaW51dGlscy1taW5ndy13NjQteDg2LTY0XAorICAgICAgICAgICAgICAgICAgICBnKystbWluZ3ctdzY0LXg4Ni02NCBcCisgICAgICAgICAgICAgICAgICAgICR3aW5lNjQgXAorICAgICAgICAgICAgICAgICAgICAke05VTEx9CisgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgZXNhYworCisgICAgICAgICRzdWRvIGFwdC1nZXQgLXFxIC15IGluc3RhbGwgXAorICAgICAgICAgICAgYXV0b2NvbmYtYXJjaGl2ZSBcCisgICAgICAgICAgICBhdXRvbWFrZSBcCisgICAgICAgICAgICBhdXRvdG9vbHMtZGV2IFwKKyAgICAgICAgICAgIGNjYWNoZSBcCisgICAgICAgICAgICBjbWFrZSBcCisgICAgICAgICAgICBkZWJoZWxwZXIgXAorICAgICAgICAgICAgZGgtYXV0b3JlY29uZiBcCisgICAgICAgICAgICBkaC1leGVjIFwKKyAgICAgICAgICAgIGRveHlnZW4gXAorICAgICAgICAgICAgZHBrZy1kZXYgXAorICAgICAgICAgICAgZ25vbWUtZGVza3RvcC10ZXN0aW5nIFwKKyAgICAgICAgICAgIGxpYmFwcGFybW9yLWRldiBcCisgICAgICAgICAgICBsaWJhdWRpdC1kZXYgXAorICAgICAgICAgICAgbGliY2FwLW5nLWRldiBcCisgICAgICAgICAgICBsaWJleHBhdC1kZXYgXAorICAgICAgICAgICAgbGliZ2xpYjIuMC1kZXYgXAorICAgICAgICAgICAgbGlic2VsaW51eDEtZGV2IFwKKyAgICAgICAgICAgIGxpYnN5c3RlbWQtZGV2IFwKKyAgICAgICAgICAgIGxpYngxMS1kZXYgXAorICAgICAgICAgICAgcHl0aG9uIFwKKyAgICAgICAgICAgIHB5dGhvbi1kYnVzIFwKKyAgICAgICAgICAgIHB5dGhvbi1naSBcCisgICAgICAgICAgICB2YWxncmluZCBcCisgICAgICAgICAgICB3Z2V0IFwKKyAgICAgICAgICAgIHhhdXRoIFwKKyAgICAgICAgICAgIHhtbHRvIFwKKyAgICAgICAgICAgIHhzbHRwcm9jIFwKKyAgICAgICAgICAgIHh2ZmIgXAorICAgICAgICAgICAgJHtOVUxMfQorCisgICAgICAgIGlmIFsgIiRjaV9pbl9kb2NrZXIiID0geWVzIF07IHRoZW4KKyAgICAgICAgICAgICMgQWRkIHRoZSB1c2VyIHRoYXQgd2Ugd2lsbCB1c2UgdG8gZG8gdGhlIGJ1aWxkIGluc2lkZSB0aGUKKyAgICAgICAgICAgICMgRG9ja2VyIGNvbnRhaW5lciwgYW5kIGxldCB0aGVtIHVzZSBzdWRvCisgICAgICAgICAgICBhZGR1c2VyIC0tZGlzYWJsZWQtcGFzc3dvcmQgdXNlciA8L2Rldi9udWxsCisgICAgICAgICAgICBhcHQtZ2V0IC15IGluc3RhbGwgc3VkbworICAgICAgICAgICAgZWNobyAidXNlciBBTEw9KEFMTCkgTk9QQVNTV0Q6IEFMTCIgPiAvZXRjL3N1ZG9lcnMuZC9ub3Bhc3N3ZAorICAgICAgICAgICAgY2htb2QgMDQ0MCAvZXRjL3N1ZG9lcnMuZC9ub3Bhc3N3ZAorICAgICAgICBmaQorCisgICAgICAgIGNhc2UgIiRjaV9zdWl0ZSIgaW4KKyAgICAgICAgICAgIChqZXNzaWV8eGVuaWFsKQorICAgICAgICAgICAgICAgICMgYXV0b2NvbmYtYXJjaGl2ZSBpbiBEZWJpYW4gOCBhbmQgVWJ1bnR1IDE2LjA0IGlzIHRvbyBvbGQsCisgICAgICAgICAgICAgICAgIyB1c2UgdGhlIG9uZSBmcm9tIERlYmlhbiA5IGluc3RlYWQKKyAgICAgICAgICAgICAgICB3Z2V0IGh0dHA6Ly9kZWIuZGViaWFuLm9yZy9kZWJpYW4vcG9vbC9tYWluL2EvYXV0b2NvbmYtYXJjaGl2ZS9hdXRvY29uZi1hcmNoaXZlXzIwMTYwOTE2LTFfYWxsLmRlYgorICAgICAgICAgICAgICAgICRzdWRvIGRwa2cgLWkgYXV0b2NvbmYtYXJjaGl2ZV8qX2FsbC5kZWIKKyAgICAgICAgICAgICAgICBybSBhdXRvY29uZi1hcmNoaXZlXypfYWxsLmRlYgorICAgICAgICAgICAgICAgIDs7CisKKyAgICAgICAgICAgIChzdHJldGNoKQorICAgICAgICAgICAgICAgICMgRGViaWFuIDkgJ3N0cmV0Y2gnIGRpZG4ndCBoYXZlIHRoZSBkdWNrdHlwZSBwYWNrYWdlCisgICAgICAgICAgICAgICAgOzsKKworICAgICAgICAgICAgKCopCisgICAgICAgICAgICAgICAgIyBhc3N1bWUgVWJ1bnR1IDE4LjA0ICdiaW9uaWMnLCBEZWJpYW4gMTAgJ2J1c3Rlcicgb3IgbmV3ZXIKKyAgICAgICAgICAgICAgICAkc3VkbyBhcHQtZ2V0IC1xcSAteSBpbnN0YWxsIGR1Y2t0eXBlCisgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgZXNhYworICAgICAgICA7OworCisgICAgKCopCisgICAgICAgIGVjaG8gIkRvbid0IGtub3cgaG93IHRvIHNldCB1cCAke2NpX2Rpc3Ryb30iID4mMgorICAgICAgICBleGl0IDEKKyAgICAgICAgOzsKK2VzYWMKKworIyB2aW06c2V0IHN3PTQgc3RzPTQgZXQ6CmRpZmYgLS1naXQgYS90b29scy9kYnVzLWNsZWFudXAtc29ja2V0cy5jIGIvdG9vbHMvZGJ1cy1jbGVhbnVwLXNvY2tldHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTRlNTdlCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvZGJ1cy1jbGVhbnVwLXNvY2tldHMuYwpAQCAtMCwwICsxLDQ0OSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLWNsZWFudXAtc29ja2V0cy5jICBkYnVzLWNsZWFudXAtc29ja2V0cyB1dGlsaXR5CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzIFJlZCBIYXQsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwMiBNaWNoYWVsIE1lZWtzCisgKgorICogTm90ZSB0aGF0IHRoaXMgZmlsZSBpcyBOT1QgbGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSwKKyAqIGFzIGl0IGlzIGJhc2VkIG9uIGxpbmMtY2xlYW51cC1zb2NrZXRzIHdoaWNoIGlzIExHUEwuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN5cy91bi5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpZm5kZWYgVFJVRQorI2RlZmluZSBUUlVFICgxKQorI2VuZGlmCisKKyNpZm5kZWYgRkFMU0UKKyNkZWZpbmUgRkFMU0UgKDApCisjZW5kaWYKKworI2lmbmRlZiBOVUxMCisjZGVmaW5lIE5VTEwgKCh2b2lkKikgMCkKKyNlbmRpZgorCitzdGF0aWMgdm9pZCoKK3htYWxsb2MgKHNpemVfdCBieXRlcykKK3sKKyAgdm9pZCAqbWVtOworCisgIGlmIChieXRlcyA9PSAwKQorICAgIHJldHVybiBOVUxMOworCisgIG1lbSA9IG1hbGxvYyAoYnl0ZXMpOworCisgIGlmIChtZW0gPT0gTlVMTCkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJBbGxvY2F0aW9uIG9mICVkIGJ5dGVzIGZhaWxlZFxuIiwKKyAgICAgICAgICAgICAgIChpbnQpIGJ5dGVzKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICByZXR1cm4gbWVtOworfQorCitzdGF0aWMgdm9pZCoKK3hyZWFsbG9jICh2b2lkICpvbGQsIHNpemVfdCBieXRlcykKK3sKKyAgdm9pZCAqbWVtOworCisgIGlmIChieXRlcyA9PSAwKQorICAgIHsKKyAgICAgIGZyZWUgKG9sZCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgbWVtID0gcmVhbGxvYyAob2xkLCBieXRlcyk7CisKKyAgaWYgKG1lbSA9PSBOVUxMKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIlJlYWxsb2NhdGlvbiBvZiAlZCBieXRlcyBmYWlsZWRcbiIsCisgICAgICAgICAgICAgICAoaW50KSBieXRlcyk7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgcmV0dXJuIG1lbTsKK30KKworI2lmZGVmIEFGX1VOSVgKKwordHlwZWRlZiBlbnVtCisgIHsKKyAgICBTT0NLRVRfVU5LTk9XTiwKKyAgICBTT0NLRVRfRkFJTEVEX1RPX0hBTkRMRSwKKyAgICBTT0NLRVRfREVBRCwKKyAgICBTT0NLRVRfQUxJVkUsCisgICAgU09DS0VUX1VOTElOS0VECisgIH0gU29ja2V0U3RhdHVzOworCitzdGF0aWMgaW50IGFsaXZlX2NvdW50ID0gMDsKK3N0YXRpYyBpbnQgY2xlYW5lZF9jb3VudCA9IDA7CitzdGF0aWMgaW50IHVuaGFuZGxlZF9jb3VudCA9IDA7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGNoYXIgKm5hbWU7CisgIGludCAgIGZkOworICBTb2NrZXRTdGF0dXMgc3RhdHVzOworICBpbnQgICBuX3JldHJpZXM7Cit9IFNvY2tldEVudHJ5OworCitzdGF0aWMgU29ja2V0RW50cnkqCitzb2NrZXRfZW50cnlfbmV3IChjb25zdCBjaGFyICpkaXIsCisgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmbmFtZSkKK3sKKyAgU29ja2V0RW50cnkgKnNlOworICBpbnQgbGVuOworCisgIHNlID0geG1hbGxvYyAoc2l6ZW9mIChTb2NrZXRFbnRyeSkpOworCisgIGxlbiA9IHN0cmxlbiAoZGlyKSArIHN0cmxlbiAoZm5hbWUpICsgMjsgLyogMiA9IG51bCBhbmQgJy8nICovCisgIHNlLT5uYW1lID0geG1hbGxvYyAobGVuKTsKKworICBzdHJjcHkgKHNlLT5uYW1lLCBkaXIpOworICBzdHJjYXQgKHNlLT5uYW1lLCAiLyIpOworICBzdHJjYXQgKHNlLT5uYW1lLCBmbmFtZSk7CisKKyAgc2UtPmZkID0gLTE7CisKKyAgc2UtPnN0YXR1cyA9IFNPQ0tFVF9VTktOT1dOOworCisgIHNlLT5uX3JldHJpZXMgPSAwOworCisgIHJldHVybiBzZTsKK30KKworc3RhdGljIHZvaWQKK2ZyZWVfc29ja2V0X2VudHJ5IChTb2NrZXRFbnRyeSAqc2UpCit7CisgIGlmIChzZSkKKyAgICB7CisgICAgICBmcmVlIChzZS0+bmFtZSk7CisgICAgICBpZiAoc2UtPmZkID49IDApCisgICAgICAgIGNsb3NlIChzZS0+ZmQpOworICAgICAgZnJlZSAoc2UpOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK2ZyZWVfc29ja2V0X2VudHJpZXMgKFNvY2tldEVudHJ5KiogZW50cmllcywKKyAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgbl9lbnRyaWVzKQoreworICBpbnQgaTsKKworICBpZiAoZW50cmllcykKKyAgICB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgbl9lbnRyaWVzOyArK2kpCisgICAgICAgIGZyZWVfc29ja2V0X2VudHJ5IChlbnRyaWVzW2ldKTsKKyAgICAgIGZyZWUgKGVudHJpZXMpOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK3JlYWRfc29ja2V0cyAoY29uc3QgY2hhciAgICAqZGlyLAorICAgICAgICAgICAgICBTb2NrZXRFbnRyeSAqKiplbnRyaWVzX3AsCisgICAgICAgICAgICAgIGludCAgICAgICAgICAgKm5fZW50cmllc19wKQoreworICBESVIgICAqZGlyaDsKKyAgc3RydWN0IGRpcmVudCAqZGVudDsKKyAgU29ja2V0RW50cnkgKiplbnRyaWVzOworICBpbnQgbl9lbnRyaWVzOworICBpbnQgYWxsb2NhdGVkOworCisgIG5fZW50cmllcyA9IDA7CisgIGFsbG9jYXRlZCA9IDI7CisgIGVudHJpZXMgPSB4bWFsbG9jIChzaXplb2YgKFNvY2tldEVudHJ5KikgKiBhbGxvY2F0ZWQpOworCisgIGRpcmggPSBvcGVuZGlyIChkaXIpOworICBpZiAoZGlyaCA9PSBOVUxMKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIkZhaWxlZCB0byBvcGVuIGRpcmVjdG9yeSAlczogJXNcbiIsCisgICAgICAgICAgICAgICBkaXIsIHN0cmVycm9yIChlcnJubykpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIHdoaWxlICgoZGVudCA9IHJlYWRkaXIgKGRpcmgpKSkKKyAgICB7CisgICAgICBTb2NrZXRFbnRyeSAqc2U7CisKKyAgICAgIGlmIChzdHJuY21wIChkZW50LT5kX25hbWUsICJkYnVzLSIsIDUpICE9IDApCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICBzZSA9IHNvY2tldF9lbnRyeV9uZXcgKGRpciwgZGVudC0+ZF9uYW1lKTsKKworICAgICAgaWYgKG5fZW50cmllcyA9PSBhbGxvY2F0ZWQpCisgICAgICAgIHsKKyAgICAgICAgICBhbGxvY2F0ZWQgKj0gMjsKKyAgICAgICAgICBlbnRyaWVzID0geHJlYWxsb2MgKGVudHJpZXMsIHNpemVvZiAoU29ja2V0RW50cnkqKSAqIGFsbG9jYXRlZCk7CisgICAgICAgIH0KKworICAgICAgZW50cmllc1tuX2VudHJpZXNdID0gc2U7CisgICAgICBuX2VudHJpZXMgKz0gMTsKKyAgICB9CisKKyAgY2xvc2VkaXIgKGRpcmgpOworCisgICplbnRyaWVzX3AgPSBlbnRyaWVzOworICAqbl9lbnRyaWVzX3AgPSBuX2VudHJpZXM7Cit9CisKK3N0YXRpYyBTb2NrZXRTdGF0dXMKK29wZW5fc29ja2V0IChTb2NrZXRFbnRyeSAqc2UpCit7CisgIGludCByZXQ7CisgIHN0cnVjdCBzb2NrYWRkcl91biBzYWRkcjsKKworICBpZiAoc2UtPm5fcmV0cmllcyA+IDUpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiV2FybmluZzogZ2l2aW5nIHVwIG9uIHNvY2tldCAlcyBhZnRlciBzZXZlcmFsIHJldHJpZXM7IHVuYWJsZSB0byBkZXRlcm1pbmUgc29ja2V0J3Mgc3RhdHVzXG4iLAorICAgICAgICAgICAgICAgc2UtPm5hbWUpOworICAgICAgcmV0dXJuIFNPQ0tFVF9GQUlMRURfVE9fSEFORExFOworICAgIH0KKworICBzZS0+bl9yZXRyaWVzICs9IDE7CisKKyAgc2UtPmZkID0gc29ja2V0IChBRl9VTklYLCBTT0NLX1NUUkVBTSwgMCk7CisgIGlmIChzZS0+ZmQgPCAwKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIldhcm5pbmc6IGZhaWxlZCB0byBvcGVuIGEgc29ja2V0IHRvIHVzZSBmb3IgY29ubmVjdGluZzogJXNcbiIsCisgICAgICAgICAgICAgICBzdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIHJldHVybiBTT0NLRVRfVU5LTk9XTjsKKyAgICB9CisKKyAgaWYgKGZjbnRsIChzZS0+ZmQsIEZfU0VURkwsIE9fTk9OQkxPQ0spIDwgMCkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJXYXJuaW5nOiBmYWlsZWQgc2V0IHNvY2tldCAlcyBub25ibG9ja2luZzogJXNcbiIsCisgICAgICAgICAgICAgICBzZS0+bmFtZSwgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICByZXR1cm4gU09DS0VUX1VOS05PV047CisgICAgfQorCisKKyAgbWVtc2V0ICgmc2FkZHIsICdcMCcsIHNpemVvZiAoc2FkZHIpKTsgLyogbnVsLXRlcm1pbmF0ZXMgdGhlIHN1bl9wYXRoICovCisKKyAgc2FkZHIuc3VuX2ZhbWlseSA9IEFGX1VOSVg7CisgIHN0cm5jcHkgKHNhZGRyLnN1bl9wYXRoLCBzZS0+bmFtZSwgc2l6ZW9mIChzYWRkci5zdW5fcGF0aCkgLSAxKTsKKworICBkbworICAgIHsKKyAgICAgIHJldCA9IGNvbm5lY3QgKHNlLT5mZCwgKHN0cnVjdCBzb2NrYWRkciopICZzYWRkciwgc2l6ZW9mIChzYWRkcikpOworICAgIH0KKyAgd2hpbGUgKHJldCA8IDAgJiYgZXJybm8gPT0gRUlOVFIpOworCisgIGlmIChyZXQgPj0gMCkKKyAgICByZXR1cm4gU09DS0VUX0FMSVZFOworICBlbHNlCisgICAgeworICAgICAgc3dpdGNoIChlcnJubykKKyAgICAgICAgeworICAgICAgICBjYXNlIEVJTlBST0dSRVNTOgorICAgICAgICBjYXNlIEVBR0FJTjoKKyAgICAgICAgICByZXR1cm4gU09DS0VUX1VOS05PV047CisgICAgICAgIGNhc2UgRUNPTk5SRUZVU0VEOgorICAgICAgICAgIHJldHVybiBTT0NLRVRfREVBRDsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJXYXJuaW5nOiB1bmV4cGVjdGVkIGVycm9yIGNvbm5lY3RpbmcgdG8gc29ja2V0ICVzOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICBzZS0+bmFtZSwgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICAgICAgcmV0dXJuIFNPQ0tFVF9GQUlMRURfVE9fSEFORExFOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgaW50CitoYW5kbGVfc29ja2V0cyAoU29ja2V0RW50cnkgKiplbnRyaWVzLAorICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgbl9lbnRyaWVzKQoreworICBpbnQgaTsKKyAgaW50IG5fdW5rbm93bjsKKworICBuX3Vua25vd24gPSAwOworCisgIGkgPSAwOworICB3aGlsZSAoaSA8IG5fZW50cmllcykKKyAgICB7CisgICAgICBTb2NrZXRFbnRyeSAqc2U7CisgICAgICBTb2NrZXRTdGF0dXMgc3RhdHVzOworCisgICAgICBzZSA9IGVudHJpZXNbaV07CisgICAgICArK2k7CisKKyAgICAgIGlmIChzZS0+ZmQgPj0gMCkKKyAgICAgICAgeworICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIkludGVybmFsIGVycm9yLCBzb2NrZXQgaGFzIGZkICBrZXB0IG9wZW4gd2hpbGUgc3RhdHVzID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgc2UtPnN0YXR1cyk7CisgICAgICAgICAgZXhpdCAoMSk7CisgICAgICAgIH0KKworICAgICAgaWYgKHNlLT5zdGF0dXMgIT0gU09DS0VUX1VOS05PV04pCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICBzdGF0dXMgPSBvcGVuX3NvY2tldCAoc2UpOworCisgICAgICBzd2l0Y2ggKHN0YXR1cykKKyAgICAgICAgeworICAgICAgICBjYXNlIFNPQ0tFVF9ERUFEOgorICAgICAgICAgIGNsZWFuZWRfY291bnQgKz0gMTsKKyAgICAgICAgICBpZiAodW5saW5rIChzZS0+bmFtZSkgPCAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJXYXJuaW5nOiBGYWlsZWQgdG8gZGVsZXRlICVzOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgc2UtPm5hbWUsIHN0cmVycm9yIChlcnJubykpOworCisgICAgICAgICAgICAgIHNlLT5zdGF0dXMgPSBTT0NLRVRfRkFJTEVEX1RPX0hBTkRMRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBzZS0+c3RhdHVzID0gU09DS0VUX1VOTElOS0VEOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgU09DS0VUX0FMSVZFOgorICAgICAgICAgIGFsaXZlX2NvdW50ICs9IDE7CisgICAgICAgICAgLyogRkFMTCBUSFJVICovCisKKyAgICAgICAgY2FzZSBTT0NLRVRfRkFJTEVEX1RPX0hBTkRMRToKKyAgICAgICAgY2FzZSBTT0NLRVRfVU5LTk9XTjoKKyAgICAgICAgICBzZS0+c3RhdHVzID0gc3RhdHVzOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgU09DS0VUX1VOTElOS0VEOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIkJhZCBzdGF0dXMgZnJvbSBvcGVuX3NvY2tldCgpLCBzaG91bGQgbm90IGhhcHBlblxuIik7CisgICAgICAgICAgZXhpdCAoMSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgaWYgKHNlLT5mZCA+PSAwKQorICAgICAgICB7CisgICAgICAgICAgY2xvc2UgKHNlLT5mZCk7CisgICAgICAgICAgc2UtPmZkID0gLTE7CisgICAgICAgIH0KKworICAgICAgaWYgKHNlLT5zdGF0dXMgPT0gU09DS0VUX1VOS05PV04pCisgICAgICAgIG5fdW5rbm93biArPSAxOworICAgIH0KKworICByZXR1cm4gbl91bmtub3duID09IDA7Cit9CisKK3N0YXRpYyB2b2lkCitjbGVhbl9kaXIgKGNvbnN0IGNoYXIgKmRpcikKK3sKKyAgU29ja2V0RW50cnkgKiplbnRyaWVzOworICBpbnQgbl9lbnRyaWVzOworCisgIHJlYWRfc29ja2V0cyAoZGlyLCAmZW50cmllcywgJm5fZW50cmllcyk7CisKKyAgLyogb3Blbl9zb2NrZXQoKSB3aWxsIGZhaWwgY29uY2x1c2l2ZWx5IGFmdGVyCisgICAqIHNldmVyYWwgcmV0cmllcywgc28gdGhpcyBsb29wIGlzIGd1YXJhbnRlZWQKKyAgICogdG8gdGVybWluYXRlIGV2ZW50dWFsbHkKKyAgICovCisgIHdoaWxlICghaGFuZGxlX3NvY2tldHMgKGVudHJpZXMsIG5fZW50cmllcykpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiVW5hYmxlIHRvIGRldGVybWluZSBzdGF0ZSBvZiBzb21lIHNvY2tldHMsIHJldHJ5aW5nIGluIDIgc2Vjb25kc1xuIik7CisgICAgICBzbGVlcCAoMik7CisgICAgfQorCisgIHVuaGFuZGxlZF9jb3VudCArPSAobl9lbnRyaWVzIC0gYWxpdmVfY291bnQgLSBjbGVhbmVkX2NvdW50KTsKKworICBmcmVlX3NvY2tldF9lbnRyaWVzIChlbnRyaWVzLCBuX2VudHJpZXMpOworfQorCisjZW5kaWYgLyogQUZfVU5JWCAqLworCitzdGF0aWMgdm9pZAordXNhZ2UgKGludCBlY29kZSkKK3sKKyAgZnByaW50ZiAoc3RkZXJyLCAiZGJ1cy1jbGVhbnVwLXNvY2tldHMgWy0tdmVyc2lvbl0gWy0taGVscF0gPHNvY2tldGRpcj5cbiIpOworICBleGl0IChlY29kZSk7Cit9CisKK3N0YXRpYyB2b2lkCit2ZXJzaW9uICh2b2lkKQoreworICBwcmludGYgKCJELUJ1cyBTb2NrZXQgQ2xlYW51cCBVdGlsaXR5ICVzXG4iCisgICAgICAgICAgIkNvcHlyaWdodCAoQykgMjAwMyBSZWQgSGF0LCBJbmMuXG4iCisgICAgICAgICAgIkNvcHlyaWdodCAoQykgMjAwMiBNaWNoYWVsIE1lZWtzXG4iCisgICAgICAgICAgIlRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgc2VlIHRoZSBzb3VyY2UgZm9yIGNvcHlpbmcgY29uZGl0aW9ucy5cbiIKKyAgICAgICAgICAiVGhlcmUgaXMgTk8gd2FycmFudHk7IG5vdCBldmVuIGZvciBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuXG4iLAorICAgICAgICAgIFZFUlNJT04pOworICBleGl0ICgwKTsKK30KKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgIGludCBpOworICBpbnQgc2F3X2RvdWJsZWRhc2g7CisgIGNvbnN0IGNoYXIgKmRpcm5hbWU7CisKKyAgc2F3X2RvdWJsZWRhc2ggPSBGQUxTRTsKKyAgZGlybmFtZSA9IE5VTEw7CisgIGkgPSAxOworICB3aGlsZSAoaSA8IGFyZ2MpCisgICAgeworICAgICAgY29uc3QgY2hhciAqYXJnID0gYXJndltpXTsKKworICAgICAgaWYgKHN0cmNtcCAoYXJnLCAiLS1oZWxwIikgPT0gMCB8fAorICAgICAgICAgIHN0cmNtcCAoYXJnLCAiLWgiKSA9PSAwIHx8CisgICAgICAgICAgc3RyY21wIChhcmcsICItPyIpID09IDApCisgICAgICAgIHVzYWdlICgwKTsKKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAiLS12ZXJzaW9uIikgPT0gMCkKKyAgICAgICAgdmVyc2lvbiAoKTsKKyAgICAgIGVsc2UgaWYgKCFzYXdfZG91YmxlZGFzaCkKKwl7CisgICAgICAgICAgaWYgKHN0cmNtcCAoYXJnLCAiLS0iKSA9PSAwKQorICAgICAgICAgICAgc2F3X2RvdWJsZWRhc2ggPSBUUlVFOworICAgICAgICAgIGVsc2UgaWYgKCphcmcgPT0gJy0nKQorICAgICAgICAgICAgdXNhZ2UgKDEpOworCX0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGlmIChkaXJuYW1lICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgImRidXMtY2xlYW51cC1zb2NrZXRzIG9ubHkgc3VwcG9ydHMgYSBzaW5nbGUgZGlyZWN0b3J5IG5hbWVcbiIpOworICAgICAgICAgICAgICBleGl0ICgxKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGRpcm5hbWUgPSBhcmc7CisgICAgICAgIH0KKworICAgICAgKytpOworICAgIH0KKworICAvKiBEZWZhdWx0IHRvIHNlc3Npb24gc29ja2V0IGRpciwgdXN1YWxseSAvdG1wICovCisgIGlmIChkaXJuYW1lID09IE5VTEwpCisgICAgZGlybmFtZSA9IERCVVNfU0VTU0lPTl9TT0NLRVRfRElSOworCisjaWZkZWYgQUZfVU5JWAorICBjbGVhbl9kaXIgKGRpcm5hbWUpOworCisgIHByaW50ZiAoIkNsZWFuZWQgdXAgJWQgc29ja2V0cyBpbiAlczsgJWQgc29ja2V0cyBhcmUgc3RpbGwgaW4gdXNlOyAlZCBpbiB1bmtub3duIHN0YXRlXG4iLAorICAgICAgICAgIGNsZWFuZWRfY291bnQsIGRpcm5hbWUsIGFsaXZlX2NvdW50LCB1bmhhbmRsZWRfY291bnQpOworI2Vsc2UKKyAgcHJpbnRmICgiVGhpcyBzeXN0ZW0gZG9lcyBub3Qgc3VwcG9ydCBVTklYIGRvbWFpbiBzb2NrZXRzLCBzbyBkYnVzLWNsZWFudXAtc29ja2V0cyBkb2VzIG5vdGhpbmdcbiIpOworI2VuZGlmCisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90b29scy9kYnVzLWVjaG8uYyBiL3Rvb2xzL2RidXMtZWNoby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxN2Q5ODMKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9kYnVzLWVjaG8uYwpAQCAtMCwwICsxLDI1MCBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLWVjaG8uYyAtIGEgcGxhaW4gbGliZGJ1cyBlY2hvIHNlcnZlcgorICoKKyAqIENvcHlyaWdodCDCqSAyMDAzIFBoaWxpcCBCbHVuZGVsbCA8cGhpbGJAZ251Lm9yZz4KKyAqIENvcHlyaWdodCDCqSAyMDExIE5va2lhIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgwqkgMjAxNCBDb2xsYWJvcmEgTHRkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2lmZGVmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLmg+CisKKyNpbmNsdWRlICJkYnVzL2RidXMtc3lzZGVwcy5oIgorI2luY2x1ZGUgInRlc3QtdG9vbC5oIgorI2luY2x1ZGUgInRvb2wtY29tbW9uLmgiCisKK3N0YXRpYyBpbnQgc2xlZXBfbXMgPSAtMTsKK3N0YXRpYyBkYnVzX2Jvb2xfdCBub3JlcGx5ID0gRkFMU0U7CitzdGF0aWMgZGJ1c19ib29sX3Qgbm9yZWFkID0gRkFMU0U7CisKK3N0YXRpYyB2b2lkIHVzYWdlX2VjaG8gKGludCBleGl0X3dpdGgpIF9EQlVTX0dOVUNfTk9SRVRVUk47CisKK3N0YXRpYyB2b2lkCit1c2FnZV9lY2hvIChpbnQgZXhpdF93aXRoKQoreworICBmcHJpbnRmIChzdGRlcnIsCisgICAgICAgICAgICJVc2FnZTogZGJ1cy10ZXN0LXRvb2wgZWNobyBbT1BUSU9OU11cbiIKKyAgICAgICAgICAgIlxuIgorICAgICAgICAgICAiUmVzcG9uZCB0byBhbGwgbWV0aG9kIGNhbGxzIHdpdGggYW4gZW1wdHkgcmVwbHkuXG4iCisgICAgICAgICAgICJcbiIKKyAgICAgICAgICAgIk9wdGlvbnM6XG4iCisgICAgICAgICAgICJcbiIKKyAgICAgICAgICAgIiAgICAtLW5hbWU9TkFNRSAgIGNsYWltIHRoaXMgd2VsbC1rbm93biBuYW1lIGZpcnN0XG4iCisgICAgICAgICAgICJcbiIKKyAgICAgICAgICAgIiAgICAtLXNsZWVwLW1zPU4gIHNsZWVwIE4gbWlsbGlzZWNvbmRzIGJlZm9yZSBzZW5kaW5nIGVhY2ggcmVwbHlcbiIKKyAgICAgICAgICAgIlxuIgorICAgICAgICAgICAiICAgIC0tc2Vzc2lvbiAgICAgdXNlIHRoZSBzZXNzaW9uIGJ1cyAoZGVmYXVsdClcbiIKKyAgICAgICAgICAgIiAgICAtLXN5c3RlbSAgICAgIHVzZSB0aGUgc3lzdGVtIGJ1c1xuIgorICAgICAgICAgICApOworICBleGl0IChleGl0X3dpdGgpOworfQorCitzdGF0aWMgdm9pZCB1c2FnZV9ibGFja19ob2xlIChpbnQgZXhpdF93aXRoKSBfREJVU19HTlVDX05PUkVUVVJOOworCitzdGF0aWMgdm9pZAordXNhZ2VfYmxhY2tfaG9sZSAoaW50IGV4aXRfd2l0aCkKK3sKKyAgZnByaW50ZiAoc3RkZXJyLAorICAgICAgICAgICAiVXNhZ2U6IGRidXMtdGVzdC10b29sIGJsYWNrLWhvbGUgW09QVElPTlNdXG4iCisgICAgICAgICAgICJcbiIKKyAgICAgICAgICAgIlJlY2VpdmUgbWV0aG9kIGNhbGxzIGJ1dCBkbyBub3QgcmVwbHkuXG4iCisgICAgICAgICAgICJcbiIKKyAgICAgICAgICAgIk9wdGlvbnM6XG4iCisgICAgICAgICAgICJcbiIKKyAgICAgICAgICAgIiAgICAtLW5hbWU9TkFNRSAgIGNsYWltIHRoaXMgd2VsbC1rbm93biBuYW1lIGZpcnN0XG4iCisgICAgICAgICAgICJcbiIKKyAgICAgICAgICAgIiAgICAtLW5vLXJlYWQgICAgIGRvbid0IHJlYWQgYW55dGhpbmcgb24gdGhlIEQtQnVzIHNvY2tldFxuIgorICAgICAgICAgICAiXG4iCisgICAgICAgICAgICIgICAgLS1zZXNzaW9uICAgICB1c2UgdGhlIHNlc3Npb24gYnVzIChkZWZhdWx0KVxuIgorICAgICAgICAgICAiICAgIC0tc3lzdGVtICAgICAgdXNlIHRoZSBzeXN0ZW0gYnVzXG4iCisgICAgICAgICAgICk7CisgIGV4aXQgKGV4aXRfd2l0aCk7Cit9CisKK3N0YXRpYyBEQnVzSGFuZGxlclJlc3VsdAorZmlsdGVyIChEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKyAgICBEQnVzTWVzc2FnZSAqbWVzc2FnZSwKKyAgICB2b2lkICp1c2VyX2RhdGEpCit7CisgIERCdXNNZXNzYWdlICpyZXBseTsKKworICBpZiAoZGJ1c19tZXNzYWdlX2dldF90eXBlIChtZXNzYWdlKSAhPSBEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfQ0FMTCkKKyAgICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9OT1RfWUVUX0hBTkRMRUQ7CisKKyAgaWYgKHNsZWVwX21zID4gMCkKKyAgICB7CisgICAgICBfZGJ1c19zbGVlcF9taWxsaXNlY29uZHMgKHNsZWVwX21zKTsKKyAgICB9CisKKyAgaWYgKCFub3JlcGx5KQorICAgIHsKKyAgICAgIHJlcGx5ID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfcmV0dXJuIChtZXNzYWdlKTsKKworICAgICAgaWYgKHJlcGx5ID09IE5VTEwpCisgICAgICAgIHRvb2xfb29tICgiYWxsb2NhdGluZyByZXBseSIpOworCisgICAgICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZW5kIChjb25uZWN0aW9uLCByZXBseSwgTlVMTCkpCisgICAgICAgIHRvb2xfb29tICgic2VuZGluZyByZXBseSIpOworCisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKyAgICB9CisKKyAgcmV0dXJuIERCVVNfSEFORExFUl9SRVNVTFRfSEFORExFRDsKK30KKworc3RhdGljIERCdXNDb25uZWN0aW9uICoKK2luaXRfY29ubmVjdGlvbiAoREJ1c0J1c1R5cGUgdHlwZSwgY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisgIERCdXNFcnJvciBlcnJvciA9IERCVVNfRVJST1JfSU5JVDsKKworICBjb25uZWN0aW9uID0gZGJ1c19idXNfZ2V0ICh0eXBlLCAmZXJyb3IpOworCisgIGlmIChjb25uZWN0aW9uID09IE5VTEwpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiRmFpbGVkIHRvIGNvbm5lY3QgdG8gYnVzOiAlczogJXNcbiIsCisgICAgICAgICAgICAgICBlcnJvci5uYW1lLCBlcnJvci5tZXNzYWdlKTsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICBpZiAobmFtZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChkYnVzX2J1c19yZXF1ZXN0X25hbWUgKGNvbm5lY3Rpb24sIG5hbWUsIERCVVNfTkFNRV9GTEFHX0RPX05PVF9RVUVVRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpICE9IERCVVNfUkVRVUVTVF9OQU1FX1JFUExZX1BSSU1BUllfT1dORVIpCisgICAgICAgIHsKKyAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJmYWlsZWQgdG8gdGFrZSBidXMgbmFtZSAlc1xuIiwgbmFtZSk7CisgICAgICAgICAgZXhpdCAoMSk7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBwcmludGYgKCIlc1xuIiwgZGJ1c19idXNfZ2V0X3VuaXF1ZV9uYW1lIChjb25uZWN0aW9uKSk7CisgICAgfQorCisgIGlmICghZGJ1c19jb25uZWN0aW9uX2FkZF9maWx0ZXIgKGNvbm5lY3Rpb24sIGZpbHRlciwgTlVMTCwgTlVMTCkpCisgICAgdG9vbF9vb20gKCJhZGRpbmcgbWVzc2FnZSBmaWx0ZXIiKTsKKworICByZXR1cm4gY29ubmVjdGlvbjsKK30KKworaW50CitkYnVzX3Rlc3RfdG9vbF9lY2hvIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uOworICBEQnVzQnVzVHlwZSB0eXBlID0gREJVU19CVVNfU0VTU0lPTjsKKyAgaW50IGk7CisgIGNvbnN0IGNoYXIgKm5hbWUgPSBOVUxMOworCisgIC8qIGFyZ3ZbMV0gaXMgdGhlIHRvb2wgbmFtZSwgc28gc3RhcnQgZnJvbSAyICovCisKKyAgZm9yIChpID0gMjsgaSA8IGFyZ2M7IGkrKykKKyAgICB7CisgICAgICBjb25zdCBjaGFyICphcmcgPSBhcmd2W2ldOworCisgICAgICBpZiAoc3RyY21wIChhcmcsICItLXN5c3RlbSIpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICB0eXBlID0gREJVU19CVVNfU1lTVEVNOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgIi0tc2Vzc2lvbiIpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICB0eXBlID0gREJVU19CVVNfU0VTU0lPTjsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoc3Ryc3RyIChhcmcsICItLW5hbWU9IikgPT0gYXJnKQorICAgICAgICB7CisgICAgICAgICAgbmFtZSA9IGFyZyArIHN0cmxlbiAoIi0tbmFtZT0iKTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoc3Ryc3RyIChhcmcsICItLXNsZWVwLW1zPSIpID09IGFyZykKKyAgICAgICAgeworICAgICAgICAgIHNsZWVwX21zID0gYXRvaSAoYXJnICsgc3RybGVuICgiLS1zbGVlcC1tcz0iKSk7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHVzYWdlX2VjaG8gKDIpOworICAgICAgICB9CisgICAgfQorCisgIGNvbm5lY3Rpb24gPSBpbml0X2Nvbm5lY3Rpb24gKHR5cGUsIG5hbWUpOworCisgIHdoaWxlIChkYnVzX2Nvbm5lY3Rpb25fcmVhZF93cml0ZV9kaXNwYXRjaCAoY29ubmVjdGlvbiwgLTEpKQorICAgIHt9CisKKyAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChjb25uZWN0aW9uKTsKKyAgcmV0dXJuIDA7Cit9CisKK2ludAorZGJ1c190ZXN0X3Rvb2xfYmxhY2tfaG9sZSAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKyAgREJ1c0J1c1R5cGUgdHlwZSA9IERCVVNfQlVTX1NFU1NJT047CisgIGludCBpOworICBjb25zdCBjaGFyICpuYW1lID0gTlVMTDsKKworICAvKiBhcmd2WzFdIGlzIHRoZSB0b29sIG5hbWUsIHNvIHN0YXJ0IGZyb20gMiAqLworCisgIGZvciAoaSA9IDI7IGkgPCBhcmdjOyBpKyspCisgICAgeworICAgICAgY29uc3QgY2hhciAqYXJnID0gYXJndltpXTsKKworICAgICAgaWYgKHN0cmNtcCAoYXJnLCAiLS1zeXN0ZW0iKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgdHlwZSA9IERCVVNfQlVTX1NZU1RFTTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICItLXNlc3Npb24iKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgdHlwZSA9IERCVVNfQlVTX1NFU1NJT047CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHN0cnN0ciAoYXJnLCAiLS1uYW1lPSIpID09IGFyZykKKyAgICAgICAgeworICAgICAgICAgIG5hbWUgPSBhcmcgKyBzdHJsZW4gKCItLW5hbWU9Iik7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAiLS1uby1yZWFkIikgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIG5vcmVhZCA9IFRSVUU7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHVzYWdlX2JsYWNrX2hvbGUgKDIpOworICAgICAgICB9CisgICAgfQorCisgIGNvbm5lY3Rpb24gPSBpbml0X2Nvbm5lY3Rpb24gKHR5cGUsIG5hbWUpOworCisgIGlmIChub3JlYWQpCisgICAgeworICAgICAgd2hpbGUgKDEpCisgICAgICAgIF9kYnVzX3NsZWVwX21pbGxpc2Vjb25kcyAoMzYwMCk7CisgICAgfQorCisgIG5vcmVwbHkgPSBUUlVFOworCisgIHdoaWxlIChkYnVzX2Nvbm5lY3Rpb25fcmVhZF93cml0ZV9kaXNwYXRjaCAoY29ubmVjdGlvbiwgLTEpKQorICAgIHt9CisKKyAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChjb25uZWN0aW9uKTsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90b29scy9kYnVzLWxhdW5jaC13aW4uYyBiL3Rvb2xzL2RidXMtbGF1bmNoLXdpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ODM3YzEKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9kYnVzLWxhdW5jaC13aW4uYwpAQCAtMCwwICsxLDE2NyBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLWxhdW5jaC13aW4uYyAgZGJ1cy1sYXVuY2ggdXRpbGl0eQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBSYWxmIEhhYmFja2VyIDxyYWxmLmhhYmFja2VyQGZyZWVuZXQuZGU+CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpZm5kZWYgVU5JQ09ERQorI2RlZmluZSBVTklDT0RFIDEKKyNlbmRpZgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorCisvKiBTYXZlIHN0cmluZyBmdW5jdGlvbnMuICBJbnN0ZWFkIG9mIGZpZ3VyaW5nIG91dCB0aGUgZXhhY3QgX01TQ19WRVIKKyAgIHRoYXQgd29yaywgb3ZlcnJpZGUgZm9yIGV2ZXJ5Ym9keS4gICovCisKKyNkZWZpbmUgZXJybm9fdCBpbnQKKyNkZWZpbmUgd2NzY2F0X3MgbXlfd2NzY2F0X3MKKyNkZWZpbmUgd2NzY3B5X3MgbXlfd2NzY3B5X3MKKworc3RhdGljIGVycm5vX3QKK3djc2NhdF9zICh3Y2hhcl90ICpkZXN0LCBzaXplX3Qgc2l6ZSwgY29uc3Qgd2NoYXJfdCAqc3JjKQoreworICBhc3NlcnQgKHNpemVvZiAod2NoYXJfdCkgKiAod2NzbGVuIChkZXN0KSArIHdjc2xlbiAoc3JjKSArIDEpIDw9IHNpemUpOworICB3Y3NjYXQgKGRlc3QsIHNyYyk7CisgIHJldHVybiAwOworfQorCisKK3N0YXRpYyBlcnJub190Cit3Y3NjcHlfcyAod2NoYXJfdCAqZGVzdCwgc2l6ZV90IHNpemUsIGNvbnN0IHdjaGFyX3QgKnNyYykKK3sKKyAgYXNzZXJ0IChzaXplb2YgKHdjaGFyX3QpICogKHdjc2xlbiAoc3JjKSArIDEpIDw9IHNpemUpOworICB3Y3NjcHkgKGRlc3QsIHNyYyk7CisgIHJldHVybiAwOworfQorCisvKiBUT0RPICh0bCk6IFRoaXMgV2luZG93cyB2ZXJzaW9uIG9mIGRidXMtbGF1bmNoIGlzIGN1cnJldGx5IHJhdGhlcgorICogcG9pbnRsZXNzIGFzIGl0IGRvZXNuJ3QgdGFrZSB0aGUgc2FtZSBjb21tYW5kLWxpbmUgb3B0aW9ucyBhcyB0aGUKKyAqIFVOSVggZGJ1cy1sYXVuY2ggZG9lcy4gQSBtYWluIHBvaW50IG9mIHRoZSBkYnVzLWxhdW5jaCBjb21tYW5kIGlzCisgKiB0byBwYXNzIGl0IGZvciBpbnN0YW5jZSBhIC0tY29uZmlnLWZpbGUgb3B0aW9uIHRvIG1ha2UgdGhlIHN0YXJ0ZWQKKyAqIGRidXMtZGFlbW9uIHVzZSB0aGF0IGNvbmZpZyBmaWxlLgorICogCisgKiBUaGlzIHZlcnNpb24gYWxzbyBkb2Vzbid0IHByaW50IG91dCBhbnkgaW5mb3JtYXRpb24sIHdoaWNoIGlzIGEKKyAqIG1haW4gcG9pbnQgb2YgdGhlIFVOSVggb25lLiBJdCBzaG91bGQgYXQgbGVhc3Qgc3VwcG9ydCB0aGUKKyAqIC0tc2gtc3ludGF4IG9wdGlvbiwgYW5kIG1heWJlIGFsc28gYSAtLWNtZC1zeW50YXggdG8gcHJpbnQgb3V0IHRoZQorICogdmFyaWFibGUgc2V0dGluZ3MgaW4gY21kLmV4ZSBzeW50YXg/CisgKiAKKyAqIE5PVEUgKHJoKTogVGhlIG1haW4gdGFzayBvZiBkYnVzLWxhdW5jaCBpcyAoZnJvbSB0aGUgbWFuIHBhZ2UpIHRvIHN0YXJ0IAorICogYSBzZXNzaW9uIGJ1cyBhbmQgdGhpcyBpcyBhcmNoaWV2ZWQgYnkgdGhlIGN1cnJlbnQgaW1wbGVtZW50aW9uLiAKKyAqIAorICogQWRkaXRpb25hbCBvbiB3aW5kb3dzIHRoZSBzZXNzaW9uIGJ1cyBzdGFydGluZyBpbiBub3QgaW50ZWdyYXRlZCAKKyAqIGludG8gdGhlIGxvZ29uIHByb2Nlc3MsIHNvIHRoZXJlIGlzIG5vIG5lZWQgZm9yIGFueSAtLXN5bnRheCBvcHRpb24uIAorICogSW4gZmFjdCAoYXQgbGVhc3QgZm9yIGtkZSBvbiB3aW5kb3dzKSB0aGUgc2Vzc2lvbiBidXMgaXMgYXV0b3N0YXJ0ZWQgCisgKiB3aXRoIHRoZSBmaXJzdCBhcHBsaWNhdGlvbiByZXF1ZXN0aW5nIGEgc2Vzc2lvbiBidXMuIAorICoKKyAqLworCisjZGVmaW5lIEFVVE9fQUNUSVZBVEVfQ09OU09MRV9XSEVOX1ZFUkJPU0VfTU9ERSAxCisKKyNkZWZpbmUgRElNKHgpIChzaXplb2YoeCkgLyBzaXplb2YoeFswXSkpCisjZGVmaW5lIFdDU1RSSU5HSUZZXyh4KSBMICMjIHgKKyNkZWZpbmUgV0NTVFJJTkdJRlkoeCkgV0NTVFJJTkdJRllfKHgpCisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICB3Y2hhcl90IGRidXNEYWVtb25QYXRoW01BWF9QQVRIICogMiArIDFdOworICB3Y2hhcl90IGNvbW1hbmRbTUFYX1BBVEggKiAyICsgMV07CisgIHdjaGFyX3QgKnA7CisgIGNvbnN0IHdjaGFyX3QgKmRhZW1vbl9uYW1lOworICBpbnQgcmVzdWx0OworCisjaWZkZWYgREJVU19XSU5DRQorICBjaGFyICpzID0gTlVMTDsKKyNlbHNlCisgIGNoYXIgKnMgPSBnZXRlbnYoIkRCVVNfVkVSQk9TRSIpOworI2VuZGlmCisgIGludCB2ZXJib3NlID0gcyAmJiAqcyAhPSAnXDAnID8gMSA6IDA7CisKKyAgUFJPQ0VTU19JTkZPUk1BVElPTiBwaTsKKyAgU1RBUlRVUElORk9XIHNpOworICBCT09MIGluaGVyaXQgPSBUUlVFOworICBEV09SRCBmbGFncyA9IDA7CisKKyAgR2V0TW9kdWxlRmlsZU5hbWVXIChOVUxMLCBkYnVzRGFlbW9uUGF0aCwgRElNIChkYnVzRGFlbW9uUGF0aCkpOworICAKKyAgZGFlbW9uX25hbWUgPSBXQ1NUUklOR0lGWShEQlVTX0RBRU1PTl9OQU1FKSBMIi5leGUiOworICAKKyAgaWYgKChwID0gd2NzcmNociAoZGJ1c0RhZW1vblBhdGgsIEwnXFwnKSkpIAorICAgIHsKKyAgICAgIHBbMV0gPSBMJ1wwJzsKKyAgICAgIHdjc2NhdF9zIChkYnVzRGFlbW9uUGF0aCwgc2l6ZW9mIChkYnVzRGFlbW9uUGF0aCksIGRhZW1vbl9uYW1lKTsKKyAgICB9CisgIGVsc2UgCisgICAgeworICAgICAgaWYgKHZlcmJvc2UpCisgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiZXJyb3I6IGNvdWxkIG5vdCBleHRyYWN0IHBhdGggZnJvbSBjdXJyZW50ICIKKyAgICAgICAgICAgICAgICAgICAiYXBwbGljYXRpb25zIG1vZHVsZSBmaWxlbmFtZVxuIik7CisgICAgICByZXR1cm4gMTsKKyAgICB9IAorCisjaWZkZWYgREJVU19XSU5DRQorICAgLyogV2luZG93cyBDRSBoYXMgYSBkaWZmZXJlbnQgaW50ZXJwcmV0YXRpb24gb2YgY21kbGluZTogU3RhcnQgd2l0aCBhcmd2WzFdLiAgKi8KKyAgIHdjc2NweV9zIChjb21tYW5kLCBzaXplb2YgKGNvbW1hbmQpLCBMIi0tc2Vzc2lvbiIpOworICAgaWYgKHZlcmJvc2UpCisgICAgIGZwcmludGYgKHN0ZGVyciwgIiVscyAlbHNcbiIsIGRidXNEYWVtb25QYXRoLCBjb21tYW5kKTsKKyNlbHNlCisgICBjb21tYW5kWzBdID0gTCdcMCc7CisgICAvKiBXaW5kb3dzIGNtZGxpbmUgc3RhcnRzIHdpdGggcGF0aCwgd2hpY2ggY2FuIGNvbnRhaW4gc3BhY2VzLiAgKi8KKyAgIHdjc2NweV9zIChjb21tYW5kLCBzaXplb2YgKGNvbW1hbmQpLCBMIlwiIik7CisgICB3Y3NjYXRfcyAoY29tbWFuZCwgc2l6ZW9mIChjb21tYW5kKSwgZGJ1c0RhZW1vblBhdGgpOworICAgd2NzY2F0X3MgKGNvbW1hbmQsIHNpemVvZiAoY29tbWFuZCksIEwiXCIgLS1zZXNzaW9uIik7CisgICBpZiAodmVyYm9zZSkKKyAgICAgZnByaW50ZiAoc3RkZXJyLCAiJWxzXG4iLCBjb21tYW5kKTsKKyNlbmRpZgorICAKKyAgbWVtc2V0ICgmc2ksIDAsIHNpemVvZiAoc2kpKTsKKyAgbWVtc2V0ICgmcGksIDAsIHNpemVvZiAocGkpKTsKKyAgc2kuY2IgPSBzaXplb2YgKHNpKTsKKyAgCisgIGlmICh2ZXJib3NlKQorICAgIGZsYWdzIHw9IENSRUFURV9ORVdfQ09OU09MRTsKKworI2lmZGVmIERCVVNfV0lOQ0UKKyAgaW5oZXJpdCA9IEZBTFNFOworI2Vsc2UKKyAgZmxhZ3MgfD0gTk9STUFMX1BSSU9SSVRZX0NMQVNTOworICBpZiAoIXZlcmJvc2UpCisgICAgZmxhZ3MgfD0gREVUQUNIRURfUFJPQ0VTUzsKKyNlbmRpZgorCisgIHJlc3VsdCA9IENyZWF0ZVByb2Nlc3NXIChkYnVzRGFlbW9uUGF0aCwgY29tbWFuZCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaGVyaXQsIGZsYWdzLCAwLCAwLCAmc2ksICZwaSk7CisKKyAgaWYgKHJlc3VsdCA9PSAwKSAKKyAgICB7CisgICAgICBpZiAodmVyYm9zZSkKKyAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiQ291bGQgbm90IHN0YXJ0ICIgREJVU19EQUVNT05fTkFNRSAiLiBlcnJvcj0ldVxuIiwKKyAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKUdldExhc3RFcnJvciAoKSk7CisgICAgICByZXR1cm4gNDsKKyAgICB9CisgICAKKyAgQ2xvc2VIYW5kbGUgKHBpLmhQcm9jZXNzKTsKKyAgQ2xvc2VIYW5kbGUgKHBpLmhUaHJlYWQpOworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZGJ1cy1sYXVuY2gteDExLmMgYi90b29scy9kYnVzLWxhdW5jaC14MTEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGI5NzkwCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvZGJ1cy1sYXVuY2gteDExLmMKQEAgLTAsMCArMSw0NjkgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1sYXVuY2guaCAgZGJ1cy1sYXVuY2ggdXRpbGl0eQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBUaGlhZ28gTWFjaWVpcmEgPHRoaWFnb0BrZGUub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdmVyc2lvbiAyLjEKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiZGJ1cy1sYXVuY2guaCIKKworI2lmZGVmIERCVVNfQlVJTERfWDExCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxwd2QuaD4KKyNpbmNsdWRlIDxYMTEvWGxpYi5oPgorI2luY2x1ZGUgPFgxMS9YYXRvbS5oPgorCitEaXNwbGF5ICp4ZGlzcGxheSA9IE5VTEw7CitzdGF0aWMgQXRvbSBzZWxlY3Rpb25fYXRvbTsKK3N0YXRpYyBBdG9tIGFkZHJlc3NfYXRvbTsKK3N0YXRpYyBBdG9tIHBpZF9hdG9tOworCitzdGF0aWMgaW50Cit4X2lvX2Vycm9yX2hhbmRsZXIgKERpc3BsYXkgKmxvY2FsX3hkaXNwbGF5KQoreworICB2ZXJib3NlICgiWCBJTyBlcnJvclxuIik7CisgIGtpbGxfYnVzX2FuZF9leGl0ICgwKTsKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCityZW1vdmVfcHJlZml4IChjaGFyICpzLAorICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcHJlZml4KQoreworICBpbnQgcGxlbjsKKworICBwbGVuID0gc3RybGVuIChwcmVmaXgpOworCisgIGlmIChzdHJuY21wIChzLCBwcmVmaXgsIHBsZW4pID09IDApCisgICAgeworICAgICAgbWVtbW92ZSAocywgcyArIHBsZW4sIHN0cmxlbiAocykgLSBwbGVuICsgMSk7CisgICAgfQorfQorCitzdGF0aWMgY29uc3QgY2hhcioKK2dldF9ob21lZGlyICh2b2lkKQoreworICBjb25zdCBjaGFyICpob21lOworICAKKyAgaG9tZSA9IGdldGVudiAoIkhPTUUiKTsKKyAgaWYgKGhvbWUgPT0gTlVMTCkKKyAgICB7CisgICAgICAvKiB0cnkgZnJvbSB0aGUgdXNlciBkYXRhYmFzZSAqLworICAgICAgc3RydWN0IHBhc3N3ZCAqdXNlciA9IGdldHB3dWlkIChnZXR1aWQoKSk7CisgICAgICBpZiAodXNlciAhPSBOVUxMKQorICAgICAgICBob21lID0gdXNlci0+cHdfZGlyOworICAgIH0KKworICBpZiAoaG9tZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIkNhbid0IGdldCB1c2VyIGhvbWUgZGlyZWN0b3J5XG4iKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICByZXR1cm4gaG9tZTsKK30KKworI2RlZmluZSBEQlVTX0RJUiAiLmRidXMiCisjZGVmaW5lIERCVVNfU0VTU0lPTl9CVVNfRElSICJzZXNzaW9uLWJ1cyIKKworc3RhdGljIGNoYXIgKgorZ2V0X3Nlc3Npb25fZmlsZSAodm9pZCkKK3sKKyAgc3RhdGljIGNvbnN0IGNoYXIgcHJlZml4W10gPSAiLyIgREJVU19ESVIgIi8iIERCVVNfU0VTU0lPTl9CVVNfRElSICIvIjsKKyAgY29uc3QgY2hhciAqbWFjaGluZTsKKyAgY29uc3QgY2hhciAqaG9tZTsKKyAgY2hhciAqZGlzcGxheTsKKyAgY2hhciAqcmVzdWx0OworICBjaGFyICpwOworCisgIG1hY2hpbmUgPSBnZXRfbWFjaGluZV91dWlkICgpOworICBpZiAobWFjaGluZSA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIGRpc3BsYXkgPSB4c3RyZHVwIChnZXRlbnYgKCJESVNQTEFZIikpOworICBpZiAoZGlzcGxheSA9PSBOVUxMKQorICAgIHsKKyAgICAgIHZlcmJvc2UgKCJYMTEgaW50ZWdyYXRpb24gZGlzYWJsZWQgYmVjYXVzZSBYMTEgaXMgbm90IHJ1bm5pbmdcbiIpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIC8qIHJlbW92ZSB0aGUgc2NyZWVuIHBhcnQgb2YgdGhlIGRpc3BsYXkgbmFtZSAqLworICBwID0gc3RycmNociAoZGlzcGxheSwgJzonKTsKKyAgaWYgKHAgIT0gTlVMTCkKKyAgICB7CisgICAgICBmb3IgKCA7ICpwOyArK3ApCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoKnAgPT0gJy4nKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAqcCA9ICdcMCc7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgIC8qIE5vdGUgdGhhdCB3ZSBsZWF2ZSB0aGUgaG9zdG5hbWUgaW4gdGhlIGRpc3BsYXkgbW9zdCBvZiB0aGUKKyAgICogdGltZS4gVGhlIGlkZWEgaXMgdGhhdCB3ZSB3YW50IHRvIGJlIHBlci0obWFjaGluZSxkaXNwbGF5LHVzZXIpCisgICAqIHRyaXBsZXQgdG8gYmUgZXh0cmEtc3VyZSB3ZSBnZXQgYSBidXMgd2UgY2FuIGNvbm5lY3QgdG8uIElkZWFsbHkKKyAgICogd2UnZCByZWNvZ25pemUgd2hlbiB0aGUgaG9zdG5hbWUgbWF0Y2hlcyB0aGUgbWFjaGluZSB3ZSdyZSBvbiBpbgorICAgKiBhbGwgY2FzZXM7IHdlIGRvIHRyeSB0byBkcm9wIGxvY2FsaG9zdCBhbmQgbG9jYWxob3N0LmxvY2FsZG9tYWluCisgICAqIGFzIGEgc3BlY2lhbCBjb21tb24gY2FzZSBzbyB0aGF0IGFsdGVybmF0ZSBzcGVsbGluZ3Mgb2YgRElTUExBWQorICAgKiBkb24ndCByZXN1bHQgaW4gZXh0cmEgYnVzIGluc3RhbmNlcy4KKyAgICoKKyAgICogV2UgYWxzbyBraWxsIHRoZSAiOiIgaWYgdGhlcmUncyBub3RoaW5nIGluIGZyb250IG9mIGl0LiBUaGlzCisgICAqIGF2b2lkcyBhbiB1Z2x5IGRvdWJsZSB1bmRlcnNjb3JlIGluIHRoZSBmaWxlbmFtZS4KKyAgICovCisgIHJlbW92ZV9wcmVmaXggKGRpc3BsYXksICJsb2NhbGhvc3QubG9jYWxkb21haW46Iik7CisgIHJlbW92ZV9wcmVmaXggKGRpc3BsYXksICJsb2NhbGhvc3Q6Iik7CisgIHJlbW92ZV9wcmVmaXggKGRpc3BsYXksICI6Iik7CisKKyAgLyogcmVwbGFjZSB0aGUgOiBpbiB0aGUgZGlzcGxheSB3aXRoIF8gaWYgdGhlIDogaXMgc3RpbGwgdGhlcmUuCisgICAqIHVzZSBfIGluc3RlYWQgb2YgLSBzaW5jZSBpdCBjYW4ndCBiZSBpbiBob3N0bmFtZXMuCisgICAqLworICBmb3IgKHAgPSBkaXNwbGF5OyAqcDsgKytwKQorICAgIHsKKyAgICAgIGlmICgqcCA9PSAnOicpCisgICAgICAgICpwID0gJ18nOworICAgIH0KKyAgCisgIGhvbWUgPSBnZXRfaG9tZWRpciAoKTsKKyAgCisgIHJlc3VsdCA9IG1hbGxvYyAoc3RybGVuIChob21lKSArIHN0cmxlbiAocHJlZml4KSArIHN0cmxlbiAobWFjaGluZSkgKworICAgICAgICAgICAgICAgICAgIHN0cmxlbiAoZGlzcGxheSkgKyAyKTsKKyAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgIHsKKyAgICAgIC8qIG91dCBvZiBtZW1vcnkgKi8KKyAgICAgIGZyZWUgKGRpc3BsYXkpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIHN0cmNweSAocmVzdWx0LCBob21lKTsKKyAgc3RyY2F0IChyZXN1bHQsIHByZWZpeCk7CisgIHN0cmNhdCAocmVzdWx0LCBtYWNoaW5lKTsKKyAgc3RyY2F0IChyZXN1bHQsICItIik7CisgIHN0cmNhdCAocmVzdWx0LCBkaXNwbGF5KTsKKyAgZnJlZSAoZGlzcGxheSk7CisKKyAgdmVyYm9zZSAoInNlc3Npb24gZmlsZTogJXNcbiIsIHJlc3VsdCk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkCitlbnN1cmVfc2Vzc2lvbl9kaXJlY3RvcnkgKHZvaWQpCit7CisgIGNvbnN0IGNoYXIgKmhvbWU7CisgIGNoYXIgKmRpcjsKKyAgCisgIGhvbWUgPSBnZXRfaG9tZWRpciAoKTsKKworICAvKiBiZSBzdXJlIHdlIGhhdmUgc3BhY2UgZm9yIC8gYW5kIG51bCAqLworICBkaXIgPSBtYWxsb2MgKHN0cmxlbiAoaG9tZSkgKyBzdHJsZW4gKERCVVNfRElSKSArIHN0cmxlbiAoREJVU19TRVNTSU9OX0JVU19ESVIpICsgMyk7CisgIGlmIChkaXIgPT0gTlVMTCkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJubyBtZW1vcnlcbiIpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorICAKKyAgc3RyY3B5IChkaXIsIGhvbWUpOworICBzdHJjYXQgKGRpciwgIi8iKTsKKyAgc3RyY2F0IChkaXIsIERCVVNfRElSKTsKKworICBpZiAobWtkaXIgKGRpciwgMDcwMCkgPCAwKQorICAgIHsKKyAgICAgIC8qIG9ubHkgcHJpbnQgYSB3YXJuaW5nIGhlcmUsIHdyaXRpbmcgdGhlIHNlc3Npb24gZmlsZSBpdHNlbGYgd2lsbCBmYWlsIGxhdGVyICovCisgICAgICBpZiAoZXJybm8gIT0gRUVYSVNUKQorICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJVbmFibGUgdG8gY3JlYXRlICVzXG4iLCBkaXIpOworICAgIH0KKworICBzdHJjYXQgKGRpciwgIi8iKTsKKyAgc3RyY2F0IChkaXIsIERCVVNfU0VTU0lPTl9CVVNfRElSKTsKKworICBpZiAobWtkaXIgKGRpciwgMDcwMCkgPCAwKQorICAgIHsKKyAgICAgIC8qIG9ubHkgcHJpbnQgYSB3YXJuaW5nIGhlcmUsIHdyaXRpbmcgdGhlIHNlc3Npb24gZmlsZSBpdHNlbGYgd2lsbCBmYWlsIGxhdGVyICovCisgICAgICBpZiAoZXJybm8gIT0gRUVYSVNUKQorICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJVbmFibGUgdG8gY3JlYXRlICVzXG4iLCBkaXIpOworICAgIH0KKyAgCisgIGZyZWUgKGRpcik7Cit9CisKK3N0YXRpYyBEaXNwbGF5ICoKK29wZW5feDExICh2b2lkKQoreworICBpZiAoeGRpc3BsYXkgIT0gTlVMTCkKKyAgICByZXR1cm4geGRpc3BsYXk7CisKKyAgeGRpc3BsYXkgPSBYT3BlbkRpc3BsYXkgKE5VTEwpOworICBpZiAoeGRpc3BsYXkgIT0gTlVMTCkKKyAgICB7CisgICAgICB2ZXJib3NlICgiQ29ubmVjdGVkIHRvIFgxMSBkaXNwbGF5ICclcydcbiIsIERpc3BsYXlTdHJpbmcgKHhkaXNwbGF5KSk7CisgICAgICBYU2V0SU9FcnJvckhhbmRsZXIgKHhfaW9fZXJyb3JfaGFuZGxlcik7CisgICAgfQorICByZXR1cm4geGRpc3BsYXk7Cit9CisKK3N0YXRpYyBpbnQKK2luaXRfeF9hdG9tcyAoRGlzcGxheSAqZGlzcGxheSkKK3sKKyAgc3RhdGljIGNvbnN0IGNoYXIgc2VsZWN0aW9uX3ByZWZpeFtdID0gIl9EQlVTX1NFU1NJT05fQlVTX1NFTEVDVElPTl8iOworICBzdGF0aWMgY29uc3QgY2hhciBhZGRyZXNzX3ByZWZpeFtdID0gIl9EQlVTX1NFU1NJT05fQlVTX0FERFJFU1MiOworICBzdGF0aWMgY29uc3QgY2hhciBwaWRfcHJlZml4W10gPSAiX0RCVVNfU0VTU0lPTl9CVVNfUElEIjsKKyAgc3RhdGljIGludCBpbml0ID0gRkFMU0U7CisgIGNoYXIgKmF0b21fbmFtZTsKKyAgY29uc3QgY2hhciAqbWFjaGluZTsKKyAgY2hhciAqdXNlcl9uYW1lOworICBzdHJ1Y3QgcGFzc3dkICp1c2VyOworCisgIGlmIChpbml0KQorICAgIHJldHVybiBUUlVFOworCisgIG1hY2hpbmUgPSBnZXRfbWFjaGluZV91dWlkICgpOworICBpZiAobWFjaGluZSA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKworICB1c2VyID0gZ2V0cHd1aWQgKGdldHVpZCAoKSk7CisgIGlmICh1c2VyID09IE5VTEwpCisgICAgeworICAgICAgdmVyYm9zZSAoIkNvdWxkIG5vdCBkZXRlcm1pbmUgdXNlciBpbmZvcm1hdGlvbjsgYWJvcnRpbmcgWDExIGludGVncmF0aW9uLlxuIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICB1c2VyX25hbWUgPSB4c3RyZHVwKHVzZXItPnB3X25hbWUpOworCisgIGF0b21fbmFtZSA9IG1hbGxvYyAoc3RybGVuIChtYWNoaW5lKSArIHN0cmxlbiAodXNlcl9uYW1lKSArIDIgKworICAgICAgICAgICAgICAgICAgICAgIE1BWCAoc3RybGVuIChzZWxlY3Rpb25fcHJlZml4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWCAoc3RybGVuIChhZGRyZXNzX3ByZWZpeCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbiAocGlkX3ByZWZpeCkpKSk7CisgIGlmIChhdG9tX25hbWUgPT0gTlVMTCkKKyAgICB7CisgICAgICB2ZXJib3NlICgiQ291bGQgbm90IGNyZWF0ZSBYMTEgYXRvbXM7IGFib3J0aW5nIFgxMSBpbnRlZ3JhdGlvbi5cbiIpOworICAgICAgZnJlZSAodXNlcl9uYW1lKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgLyogY3JlYXRlIHRoZSBzZWxlY3Rpb24gYXRvbSAqLworICBzdHJjcHkgKGF0b21fbmFtZSwgc2VsZWN0aW9uX3ByZWZpeCk7CisgIHN0cmNhdCAoYXRvbV9uYW1lLCB1c2VyX25hbWUpOworICBzdHJjYXQgKGF0b21fbmFtZSwgIl8iKTsKKyAgc3RyY2F0IChhdG9tX25hbWUsIG1hY2hpbmUpOworICBzZWxlY3Rpb25fYXRvbSA9IFhJbnRlcm5BdG9tIChkaXNwbGF5LCBhdG9tX25hbWUsIEZBTFNFKTsKKworICAvKiBjcmVhdGUgdGhlIGFkZHJlc3MgcHJvcGVydHkgYXRvbSAqLworICBzdHJjcHkgKGF0b21fbmFtZSwgYWRkcmVzc19wcmVmaXgpOworICBhZGRyZXNzX2F0b20gPSBYSW50ZXJuQXRvbSAoZGlzcGxheSwgYXRvbV9uYW1lLCBGQUxTRSk7CisKKyAgLyogY3JlYXRlIHRoZSBQSUQgcHJvcGVydHkgYXRvbSAqLworICBzdHJjcHkgKGF0b21fbmFtZSwgcGlkX3ByZWZpeCk7CisgIHBpZF9hdG9tID0gWEludGVybkF0b20gKGRpc3BsYXksIGF0b21fbmFtZSwgRkFMU0UpOworCisgIGZyZWUgKGF0b21fbmFtZSk7CisgIGZyZWUgKHVzZXJfbmFtZSk7CisgIGluaXQgPSBUUlVFOworICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAqIEdldHMgdGhlIGRhZW1vbiBhZGRyZXNzIGZyb20gdGhlIFgxMSBkaXNwbGF5LgorICogUmV0dXJucyBGQUxTRSBpZiB0aGVyZSB3YXMgYW4gZXJyb3IuIFJldHVybmluZworICogVFJVRSBkb2VzIG5vdCBtZWFuIHRoZSBhZGRyZXNzIGV4aXN0cy4KKyAqLworaW50Cit4MTFfZ2V0X2FkZHJlc3MgKGNoYXIgKipwYWRkcmVzcywgcGlkX3QgKnBpZCwgbG9uZyAqd2lkKQoreworICBpbnQgcmVzdWx0OworICBBdG9tIHR5cGU7CisgIFdpbmRvdyBvd25lcjsKKyAgaW50IGZvcm1hdDsKKyAgdW5zaWduZWQgbG9uZyBpdGVtczsKKyAgdW5zaWduZWQgbG9uZyBhZnRlcjsKKyAgY2hhciAqZGF0YTsKKworICAqcGFkZHJlc3MgPSBOVUxMOworCisgIC8qIGxvY2F0ZSB0aGUgc2VsZWN0aW9uIG93bmVyICovCisgIG93bmVyID0gWEdldFNlbGVjdGlvbk93bmVyICh4ZGlzcGxheSwgc2VsZWN0aW9uX2F0b20pOworICBpZiAob3duZXIgPT0gTm9uZSkKKyAgICByZXR1cm4gVFJVRTsgICAgICAgICAgICAgICAgLyogbm8gb3duZXIgKi8KKyAgaWYgKHdpZCAhPSBOVUxMKQorICAgICp3aWQgPSAobG9uZykgb3duZXI7CisKKyAgLyogZ2V0IHRoZSBidXMgYWRkcmVzcyAqLworICByZXN1bHQgPSBYR2V0V2luZG93UHJvcGVydHkgKHhkaXNwbGF5LCBvd25lciwgYWRkcmVzc19hdG9tLCAwLCAxMDI0LCBGYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhBX1NUUklORywgJnR5cGUsICZmb3JtYXQsICZpdGVtcywgJmFmdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIgKiopICZkYXRhKTsKKyAgaWYgKHJlc3VsdCAhPSBTdWNjZXNzIHx8IHR5cGUgPT0gTm9uZSB8fCBhZnRlciAhPSAwIHx8IGRhdGEgPT0gTlVMTCB8fCBmb3JtYXQgIT0gOCkKKyAgICByZXR1cm4gRkFMU0U7ICAgICAgICAgICAgICAgLyogZXJyb3IgKi8KKworICAqcGFkZHJlc3MgPSB4c3RyZHVwIChkYXRhKTsKKyAgWEZyZWUgKGRhdGEpOworCisgIC8qIGdldCB0aGUgUElEICovCisgIGlmIChwaWQgIT0gTlVMTCkKKyAgICB7CisgICAgICAqcGlkID0gMDsKKyAgICAgIHJlc3VsdCA9IFhHZXRXaW5kb3dQcm9wZXJ0eSAoeGRpc3BsYXksIG93bmVyLCBwaWRfYXRvbSwgMCwgc2l6ZW9mIHBpZCwgRmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhBX0NBUkRJTkFMLCAmdHlwZSwgJmZvcm1hdCwgJml0ZW1zLCAmYWZ0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyICoqKSAmZGF0YSk7CisgICAgICBpZiAocmVzdWx0ID09IFN1Y2Nlc3MgJiYgdHlwZSAhPSBOb25lICYmIGFmdGVyID09IDAgJiYgZGF0YSAhPSBOVUxMICYmIGZvcm1hdCA9PSAzMikKKyAgICAgICAgKnBpZCA9IChwaWRfdCkgKihsb25nKikgZGF0YTsKKyAgICAgIFhGcmVlIChkYXRhKTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7ICAgICAgICAgICAgICAgICAgLyogc3VjY2VzcyAqLworfQorCisvKgorICogU2F2ZXMgdGhlIGFkZHJlc3MgaW4gdGhlIFgxMSBkaXNwbGF5LiBSZXR1cm5zIDAgb24gc3VjY2Vzcy4KKyAqIElmIGFuIGVycm9yIG9jY3VycywgcmV0dXJucyAtMS4gSWYgdGhlIHNlbGVjdGlvbiBhbHJlYWR5IGV4aXN0cywKKyAqIHJldHVybnMgMS4gKGkuZS4gYW5vdGhlciBkYWVtb24gaXMgYWxyZWFkeSBydW5uaW5nKQorICovCitzdGF0aWMgV2luZG93CitzZXRfYWRkcmVzc19pbl94MTEoY2hhciAqYWRkcmVzcywgcGlkX3QgcGlkKQoreworICBjaGFyICpjdXJyZW50X2FkZHJlc3M7CisgIFdpbmRvdyB3aWQgPSBOb25lOworICB1bnNpZ25lZCBsb25nIHBpZDMyOyAvKiBYbGliIHByb3BlcnR5IGZ1bmN0aW9ucyB3YW50IF9sb25nXyBub3QgMzItYml0IGZvciBmb3JtYXQgIjMyIiAqLworICAKKyAgLyogbG9jayB0aGUgWDExIGRpc3BsYXkgdG8gbWFrZSBzdXJlIHdlJ3JlIGRvaW5nIHRoaXMgYXRvbWljYWxseSAqLworICBYR3JhYlNlcnZlciAoeGRpc3BsYXkpOworCisgIGlmICgheDExX2dldF9hZGRyZXNzICgmY3VycmVudF9hZGRyZXNzLCBOVUxMLCBOVUxMKSkKKyAgICB7CisgICAgICAvKiBlcnJvciEgKi8KKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICBpZiAoY3VycmVudF9hZGRyZXNzICE9IE5VTEwpCisgICAgeworICAgICAgLyogc29tZW9uZSBzYXZlZCB0aGUgYWRkcmVzcyBpbiB0aGUgbWVhbnRpbWUgKi8KKyAgICAgIGZyZWUgKGN1cnJlbnRfYWRkcmVzcyk7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgLyogQ3JlYXRlIG91ciB3aW5kb3cgKi8KKyAgd2lkID0gWENyZWF0ZVdpbmRvdyAoeGRpc3BsYXksIFJvb3RXaW5kb3cgKHhkaXNwbGF5LCAwKSwgLTIwLCAtMjAsIDEwLCAxMCwKKyAgICAgICAgICAgICAgICAgICAgICAgMCwgQ29weUZyb21QYXJlbnQsIElucHV0T25seSwgQ29weUZyb21QYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgIDAsIE5VTEwpOworICAvKiBUaGUgdHlwZSBvZiBhIFdpbmRvdyB2YXJpZXMsIHNvIGNhc3QgaXQgdG8gc29tZXRoaW5nIHJlYXNvbmFibGUgKi8KKyAgdmVyYm9zZSAoIkNyZWF0ZWQgd2luZG93ICVsdVxuIiwgKHVuc2lnbmVkIGxvbmcpIHdpZCk7CisKKyAgLyogU2F2ZSB0aGUgcHJvcGVydHkgaW4gdGhlIHdpbmRvdyAqLworICBYQ2hhbmdlUHJvcGVydHkgKHhkaXNwbGF5LCB3aWQsIGFkZHJlc3NfYXRvbSwgWEFfU1RSSU5HLCA4LCBQcm9wTW9kZVJlcGxhY2UsCisgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIgKilhZGRyZXNzLCBzdHJsZW4gKGFkZHJlc3MpKTsKKyAgcGlkMzIgPSBwaWQ7CisgIFhDaGFuZ2VQcm9wZXJ0eSAoeGRpc3BsYXksIHdpZCwgcGlkX2F0b20sIFhBX0NBUkRJTkFMLCAzMiwgUHJvcE1vZGVSZXBsYWNlLAorICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyICopJnBpZDMyLCAxKTsKKworICAvKiBOb3cgZ3JhYiB0aGUgc2VsZWN0aW9uICovCisgIFhTZXRTZWxlY3Rpb25Pd25lciAoeGRpc3BsYXksIHNlbGVjdGlvbl9hdG9tLCB3aWQsIEN1cnJlbnRUaW1lKTsKKworIG91dDoKKyAgLyogVW5ncmFiIHRoZSBzZXJ2ZXIgdG8gbGV0IG90aGVyIHBlb3BsZSB1c2UgaXQgdG9vICovCisgIFhVbmdyYWJTZXJ2ZXIgKHhkaXNwbGF5KTsKKworICAvKiBBbmQgbWFrZSBzdXJlIHRoYXQgdGhlIHVuZ3JhYiBnZXRzIHNlbnQgdG8gWDExICovCisgIFhGbHVzaCAoeGRpc3BsYXkpOworCisgIHJldHVybiB3aWQ7Cit9CisKKy8qCisgKiBTYXZlcyB0aGUgc2Vzc2lvbiBhZGRyZXNzIGluIHNlc3Npb24gZmlsZS4gUmV0dXJucyBUUlVFIG9uCisgKiBzdWNjZXNzLCBGQUxTRSBpZiBhbiBlcnJvciBvY2N1cnMuCisgKi8KK3N0YXRpYyBpbnQKK3NldF9hZGRyZXNzX2luX2ZpbGUgKGNoYXIgKmFkZHJlc3MsIHBpZF90IHBpZCwgV2luZG93IHdpZCkKK3sKKyAgY2hhciAqc2Vzc2lvbl9maWxlOworICBGSUxFICpmOworCisgIGVuc3VyZV9zZXNzaW9uX2RpcmVjdG9yeSAoKTsKKyAgc2Vzc2lvbl9maWxlID0gZ2V0X3Nlc3Npb25fZmlsZSgpOworICBpZiAoc2Vzc2lvbl9maWxlID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGYgPSBmb3BlbiAoc2Vzc2lvbl9maWxlLCAidyIpOworICBmcmVlIChzZXNzaW9uX2ZpbGUpOworICBpZiAoZiA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsgICAgICAgICAgICAgICAvKiBzb21lIGtpbmQgb2YgZXJyb3IgKi8KKyAgZnByaW50ZiAoZiwKKyAgICAgICAgICAgIiMgVGhpcyBmaWxlIGFsbG93cyBwcm9jZXNzZXMgb24gdGhlIG1hY2hpbmUgd2l0aCBpZCAlcyB1c2luZyBcbiIKKyAgICAgICAgICAgIiMgZGlzcGxheSAlcyB0byBmaW5kIHRoZSBELUJ1cyBzZXNzaW9uIGJ1cyB3aXRoIHRoZSBiZWxvdyBhZGRyZXNzLlxuIgorICAgICAgICAgICAiIyBJZiB0aGUgREJVU19TRVNTSU9OX0JVU19BRERSRVNTIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHNldCwgaXQgd2lsbFxuIgorICAgICAgICAgICAiIyBiZSB1c2VkIHJhdGhlciB0aGFuIHRoaXMgZmlsZS5cbiIKKyAgICAgICAgICAgIiMgU2VlIFwibWFuIGRidXMtbGF1bmNoXCIgZm9yIG1vcmUgZGV0YWlscy5cbiIKKyAgICAgICAgICAgIkRCVVNfU0VTU0lPTl9CVVNfQUREUkVTUz0nJXMnXG4iCisgICAgICAgICAgICJEQlVTX1NFU1NJT05fQlVTX1BJRD0lbGRcbiIKKyAgICAgICAgICAgIkRCVVNfU0VTU0lPTl9CVVNfV0lORE9XSUQ9JWxkXG4iLAorICAgICAgICAgICBnZXRfbWFjaGluZV91dWlkICgpLAorICAgICAgICAgICBnZXRlbnYgKCJESVNQTEFZIiksCisgICAgICAgICAgIGFkZHJlc3MsIChsb25nKXBpZCwgKGxvbmcpd2lkKTsKKworICBmY2xvc2UgKGYpOworCisgIHJldHVybiBUUlVFOworfQorCitpbnQKK3gxMV9zYXZlX2FkZHJlc3MgKGNoYXIgKmFkZHJlc3MsIHBpZF90IHBpZCwgbG9uZyAqd2lkKQoreworICBXaW5kb3cgaWQgPSBzZXRfYWRkcmVzc19pbl94MTEgKGFkZHJlc3MsIHBpZCk7CisgIGlmIChpZCAhPSBOb25lKQorICAgIHsKKyAgICAgIGlmICghc2V0X2FkZHJlc3NfaW5fZmlsZSAoYWRkcmVzcywgcGlkLCBpZCkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgaWYgKHdpZCAhPSBOVUxMKQorICAgICAgICAqd2lkID0gKGxvbmcpIGlkOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICByZXR1cm4gRkFMU0U7Cit9CisKK2ludAoreDExX2luaXQgKHZvaWQpCit7CisgIHJldHVybiBvcGVuX3gxMSAoKSAhPSBOVUxMICYmIGluaXRfeF9hdG9tcyAoeGRpc3BsYXkpOworfQorCit2b2lkCit4MTFfaGFuZGxlX2V2ZW50ICh2b2lkKQoreworICBpZiAoeGRpc3BsYXkgIT0gTlVMTCkKKyAgICB7ICAgICAgCisgICAgICB3aGlsZSAoWFBlbmRpbmcgKHhkaXNwbGF5KSkKKyAgICAgICAgeworICAgICAgICAgIFhFdmVudCBpZ25vcmVkOworICAgICAgICAgIFhOZXh0RXZlbnQgKHhkaXNwbGF5LCAmaWdub3JlZCk7CisgICAgICAgIH0KKyAgICB9Cit9ICAKKworI2Vsc2UKK3ZvaWQgZHVtbXlfZGJ1c19sYXVuY2hfeDExICh2b2lkKTsKKwordm9pZCBkdW1teV9kYnVzX2xhdW5jaF94MTEgKHZvaWQpIHsgfQorI2VuZGlmCmRpZmYgLS1naXQgYS90b29scy9kYnVzLWxhdW5jaC5jIGIvdG9vbHMvZGJ1cy1sYXVuY2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTI4NzU0Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvZGJ1cy1sYXVuY2guYwpAQCAtMCwwICsxLDE0MjAgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1sYXVuY2guYyAgZGJ1cy1sYXVuY2ggdXRpbGl0eQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMywgMjAwNiBSZWQgSGF0LCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGhpYWdvIE1hY2llaXJhIDx0aGlhZ29Aa2RlLm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIHZlcnNpb24gMi4xCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgImRidXMtbGF1bmNoLmgiCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN5cy9zZWxlY3QuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisKKyNpbmNsdWRlIDxkYnVzL2RidXMuaD4KKyNpbmNsdWRlICJkYnVzL2RidXMtaW50ZXJuYWxzLmgiCisKKyNpZmRlZiBEQlVTX0JVSUxEX1gxMQorI2luY2x1ZGUgPFgxMS9YbGliLmg+CitleHRlcm4gRGlzcGxheSAqeGRpc3BsYXk7CisjZW5kaWYKKworI2luY2x1ZGUgImRidXMvZGJ1cy1pbnRlcm5hbHMuaCIKKyNpbmNsdWRlICJkYnVzL2RidXMtc3lzZGVwcy11bml4LmgiCisKKyNpbmNsdWRlICJ0b29sLWNvbW1vbi5oIgorCisvKiBQUk9DRVNTRVMKKyAqCisgKiBJZiB5b3UgYXJlIGluIGEgc2hlbGwgYW5kIHJ1biAiZGJ1cy1sYXVuY2ggbXlhcHAiLCBoZXJlIGlzIHdoYXQgaGFwcGVuczoKKyAqCisgKiBzaGVsbCBbKl0KKyAqICAgXC0gbWFpbigpICAgICAgICAgICAgICAgLS1leGVjLS0+IG15YXBwWypdCisgKiAgICAgIFwtICJpbnRlcm1lZGlhdGUgcGFyZW50IgorICogICAgICAgICBcLSBidXMtcnVubmVyICAgICAtLWV4ZWMtLT4gZGJ1cy1kYWVtb24gLS1mb3JrCisgKiAgICAgICAgIFwtIGJhYnlzaXR0ZXJbKl0gICAgICAgICAgICBcLSBmaW5hbCBkYnVzLWRhZW1vblsqXQorICoKKyAqIFByb2Nlc3NlcyBtYXJrZWQgWypdIHN1cnZpdmUgdGhlIGluaXRpYWwgZmx1cnJ5IG9mIGFjdGl2aXR5LgorICoKKyAqIElmIHlvdSBydW4gImRidXMtbGF1bmNoIC0tc2gtc3ludGF4IiB0aGVuIHRoZSBkaWFncmFtIGlzIHRoZSBzYW1lLCBleGNlcHQKKyAqIHRoYXQgbWFpbigpIHByaW50cyB2YXJpYWJsZXMgYW5kIGV4aXRzIDAgaW5zdGVhZCBvZiBleGVjJ2luZyBteWFwcC4KKyAqCisgKiBQSVBFUworICoKKyAqIGRidXMtZGFlbW9uIC0tcHJpbnQtcGlkICAgICAtPiBidXNfcGlkX3RvX2xhdW5jaGVyX3BpcGUgICAgIC0+IG1haW4KKyAqIGRidXMtZGFlbW9uIC0tcHJpbnQtYWRkcmVzcyAtPiBidXNfYWRkcmVzc190b19sYXVuY2hlcl9waXBlIC0+IG1haW4KKyAqIG1haW4gICAgICAgICAgICAgICAgICAgICAgICAtPiBidXNfcGlkX3RvX2JhYnlzaXR0ZXJfcGlwZSAgIC0+IGJhYnlzaXR0ZXIKKyAqCisgKiBUaGUgaW50ZXJtZWRpYXRlIHBhcmVudCBsb29rcyBwcmV0dHkgdXNlbGVzcyBhdCBmaXJzdCBnbGFuY2UuIEl0cyBwdXJwb3NlCisgKiBpcyB0byBhdm9pZCB0aGUgYnVzLXJ1bm5lciBiZWNvbWluZyBhIHpvbWJpZTogd2hlbiB0aGUgaW50ZXJtZWRpYXRlIHBhcmVudAorICogdGVybWluYXRlcywgdGhlIGJ1cy1ydW5uZXIgYW5kIGJhYnlzaXR0ZXIgYXJlIHJlcGFyZW50ZWQgdG8gaW5pdCwgd2hpY2gKKyAqIHJlYXBzIHRoZW0gaWYgdGhleSBoYXZlIGZpbmlzaGVkLiBXZSBjYW4ndCByZWx5IG9uIG1haW4oKSB0byByZWFwIGFyYml0cmFyeQorICogY2hpbGRyZW4gYmVjYXVzZSBpdCBtaWdodCBleGVjIG15YXBwLCBhZnRlciB3aGljaCBpdCBjYW4ndCBiZSByZWxpZWQgb24gdG8KKyAqIHJlYXAgaXRzIGNoaWxkcmVuLiBXZSAqY2FuKiByZWx5IG9uIG1haW4oKSB0byByZWFwIHRoZSBpbnRlcm1lZGlhdGUgcGFyZW50LAorICogYmVjYXVzZSB0aGF0IGhhcHBlbnMgYmVmb3JlIGl0IGV4ZWNzIG15YXBwLgorICoKKyAqIEl0J3MgdW5jbGVhciB3aHkgZGJ1cy1kYWVtb24gbmVlZHMgdG8gZm9yaywgYnV0IHdlIGV4cGxpY2l0bHkgdGVsbCBpdCB0bworICogZm9yIHNvbWUgcmVhc29uLCB0aGVuIHdhaXQgZm9yIGl0LiBJZiB3ZSBsZWZ0IGl0IHVuZGVmaW5lZCwgYSBmb3JraW5nCisgKiBkYnVzLWRhZW1vbiB3b3VsZCBnZXQgdGhlIHBhcmVudCBwcm9jZXNzIHJlcGFyZW50ZWQgdG8gaW5pdCBhbmQgcmVhcGVkCisgKiB3aGVuIHRoZSBpbnRlcm1lZGlhdGUgcGFyZW50IHRlcm1pbmF0ZWQsIGFuZCBhIG5vbi1mb3JraW5nIGRidXMtZGFlbW9uCisgKiB3b3VsZCBnZXQgcmVwYXJlbnRlZCB0byBpbml0IGFuZCBjYXJyeSBvbiB0aGVyZS4KKyAqCisgKiBteWFwcCBpcyBleGVjJ2QgYnkgdGhlIHByb2Nlc3MgdGhhdCBpbml0aWFsbHkgcmFuIG1haW4oKSBzbyB0aGF0IGl0J3MKKyAqIHRoZSBzaGVsbCdzIGNoaWxkLCBzbyB0aGUgc2hlbGwga25vd3MgaG93IHRvIGRvIGpvYiBjb250cm9sIGFuZCBzdHVmZi4KKyAqIFRoaXMgaXMgZGVzaXJhYmxlIGZvciB0aGUgImRidXMtbGF1bmNoIGFuIGFwcGxpY2F0aW9uIiB1c2UtY2FzZSwgbGVzcyBzbworICogZm9yIHRoZSAiZGJ1cy1sYXVuY2ggYSB0ZXN0IHN1aXRlIGluIGFuIGlzb2xhdGVkIHNlc3Npb24iIHVzZS1jYXNlLgorICovCisKK3N0YXRpYyBjaGFyKiBtYWNoaW5lX3V1aWQgPSBOVUxMOworCitjb25zdCBjaGFyKgorZ2V0X21hY2hpbmVfdXVpZCAodm9pZCkKK3sKKyAgcmV0dXJuIG1hY2hpbmVfdXVpZDsKK30KKworc3RhdGljIHZvaWQKK3NhdmVfbWFjaGluZV91dWlkIChjb25zdCBjaGFyICp1dWlkX2FyZykKK3sKKyAgaWYgKHN0cmxlbiAodXVpZF9hcmcpICE9IDMyKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIm1hY2hpbmUgSUQgJyVzJyBsb29rcyBsaWtlIGl0J3MgdGhlIHdyb25nIGxlbmd0aCwgc2hvdWxkIGJlIDMyIGhleCBkaWdpdHMiLAorICAgICAgICAgICAgICAgdXVpZF9hcmcpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIG1hY2hpbmVfdXVpZCA9IF9kYnVzX3N0cmR1cCAodXVpZF9hcmcpOworfQorCisjaWZkZWYgREJVU19CVUlMRF9YMTEKKy8qIFJlYWQgdGhlIG1hY2hpbmUgdXVpZCBmcm9tIGZpbGUgaWYgbmVlZGVkLiBSZXR1cm5zIFRSVUUgaWYgbWFjaGluZV91dWlkIGlzCisgKiBzZXQgYWZ0ZXIgdGhpcyBmdW5jdGlvbiAqLworc3RhdGljIGludAorcmVhZF9tYWNoaW5lX3V1aWRfaWZfbmVlZGVkIChEQnVzRXJyb3IgKmVycm9yKQoreworICBpZiAobWFjaGluZV91dWlkICE9IE5VTEwpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgbWFjaGluZV91dWlkID0gZGJ1c190cnlfZ2V0X2xvY2FsX21hY2hpbmVfaWQgKGVycm9yKTsKKworICBpZiAobWFjaGluZV91dWlkID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHZlcmJvc2UgKCJVSUQ6ICVzXG4iLCBtYWNoaW5lX3V1aWQpOworICByZXR1cm4gVFJVRTsKK30KKyNlbmRpZiAvKiBEQlVTX0JVSUxEX1gxMSAqLworCit2b2lkCit2ZXJib3NlIChjb25zdCBjaGFyICpmb3JtYXQsCisgICAgICAgICAuLi4pCit7CisjaWZkZWYgREJVU19FTkFCTEVfVkVSQk9TRV9NT0RFCisgIHZhX2xpc3QgYXJnczsKKyAgc3RhdGljIGludCB2ZXJib3NlID0gVFJVRTsKKyAgc3RhdGljIGludCB2ZXJib3NlX2luaXR0ZWQgPSBGQUxTRTsKKyAgCisgIC8qIHRoaW5ncyBhcmUgd3JpdHRlbiBhIGJpdCBvZGRseSBoZXJlIHNvIHRoYXQKKyAgICogaW4gdGhlIG5vbi12ZXJib3NlIGNhc2Ugd2UganVzdCBoYXZlIHRoZSBvbmUKKyAgICogY29uZGl0aW9uYWwgYW5kIHJldHVybiBpbW1lZGlhdGVseS4KKyAgICovCisgIGlmICghdmVyYm9zZSkKKyAgICByZXR1cm47CisgIAorICBpZiAoIXZlcmJvc2VfaW5pdHRlZCkKKyAgICB7CisgICAgICB2ZXJib3NlID0gZ2V0ZW52ICgiREJVU19WRVJCT1NFIikgIT0gTlVMTDsKKyAgICAgIHZlcmJvc2VfaW5pdHRlZCA9IFRSVUU7CisgICAgICBpZiAoIXZlcmJvc2UpCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgZnByaW50ZiAoc3RkZXJyLCAiJWx1OiAiLCAodW5zaWduZWQgbG9uZykgZ2V0cGlkICgpKTsKKyAgCisgIHZhX3N0YXJ0IChhcmdzLCBmb3JtYXQpOworICB2ZnByaW50ZiAoc3RkZXJyLCBmb3JtYXQsIGFyZ3MpOworICB2YV9lbmQgKGFyZ3MpOworI2VuZGlmIC8qIERCVVNfRU5BQkxFX1ZFUkJPU0VfTU9ERSAqLworfQorCitzdGF0aWMgdm9pZCB1c2FnZSAoaW50IGVjb2RlKSBfREJVU19HTlVDX05PUkVUVVJOOworCitzdGF0aWMgdm9pZAordXNhZ2UgKGludCBlY29kZSkKK3sKKyAgZnByaW50ZiAoc3RkZXJyLCAiZGJ1cy1sYXVuY2ggWy0tdmVyc2lvbl0gWy0taGVscF0gWy0tc2gtc3ludGF4XSIKKyAgICAgICAgICAgIiBbLS1jc2gtc3ludGF4XSBbLS1hdXRvLXN5bnRheF0gWy0tYmluYXJ5LXN5bnRheF0gWy0tY2xvc2Utc3RkZXJyXSIKKyAgICAgICAgICAgIiBbLS1leGl0LXdpdGgtc2Vzc2lvbnwtLWV4aXQtd2l0aC14MTFdIFstLWF1dG9sYXVuY2g9TUFDSElORUlEXSIKKyAgICAgICAgICAgIiBbLS1jb25maWctZmlsZT1GSUxFTkFNRV0gW1BST0dSQU1dIFtBUkdTLi4uXVxuIik7CisgIGV4aXQgKGVjb2RlKTsKK30KKworc3RhdGljIHZvaWQgdmVyc2lvbiAodm9pZCkgX0RCVVNfR05VQ19OT1JFVFVSTjsKKworc3RhdGljIHZvaWQKK3ZlcnNpb24gKHZvaWQpCit7CisgIHByaW50ZiAoIkQtQnVzIE1lc3NhZ2UgQnVzIExhdW5jaGVyICVzXG4iCisgICAgICAgICAgIkNvcHlyaWdodCAoQykgMjAwMyBSZWQgSGF0LCBJbmMuXG4iCisgICAgICAgICAgIlRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgc2VlIHRoZSBzb3VyY2UgZm9yIGNvcHlpbmcgY29uZGl0aW9ucy5cbiIKKyAgICAgICAgICAiVGhlcmUgaXMgTk8gd2FycmFudHk7IG5vdCBldmVuIGZvciBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuXG4iLAorICAgICAgICAgIFZFUlNJT04pOworICBleGl0ICgwKTsKK30KKworY2hhciAqCit4c3RyZHVwIChjb25zdCBjaGFyICpzdHIpCit7CisgIGludCBsZW47CisgIGNoYXIgKmNvcHk7CisgIAorICBpZiAoc3RyID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisgIAorICBsZW4gPSBzdHJsZW4gKHN0cik7CisKKyAgY29weSA9IG1hbGxvYyAobGVuICsgMSk7CisgIGlmIChjb3B5ID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgbWVtY3B5IChjb3B5LCBzdHIsIGxlbiArIDEpOworICAKKyAgcmV0dXJuIGNvcHk7Cit9CisKKyNpZmRlZiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUworc3RhdGljIGNoYXIgKgorY29uY2F0MiAoY29uc3QgY2hhciAqYSwKKyAgICBjb25zdCBjaGFyICpiKQoreworICBzaXplX3QgbGEsIGxiOworICBjaGFyICpyZXQ7CisKKyAgbGEgPSBzdHJsZW4gKGEpOworICBsYiA9IHN0cmxlbiAoYik7CisKKyAgcmV0ID0gbWFsbG9jIChsYSArIGxiICsgMSk7CisKKyAgaWYgKHJldCA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIG1lbWNweSAocmV0LCBhLCBsYSk7CisgIG1lbWNweSAocmV0ICsgbGEsIGIsIGxiICsgMSk7CisgIHJldHVybiByZXQ7Cit9CisjZW5kaWYgLyogREJVU19FTkFCTEVfRU1CRURERURfVEVTVFMgKi8KKwordHlwZWRlZiBlbnVtCit7CisgIFJFQURfU1RBVFVTX09LLCAgICAvKio8IFJlYWQgc3VjY2VlZGVkICovCisgIFJFQURfU1RBVFVTX0VSUk9SLCAvKio8IFNvbWUga2luZCBvZiBlcnJvciAqLworICBSRUFEX1NUQVRVU19FT0YgICAgLyoqPCBFT0YgcmV0dXJuZWQgKi8KK30gUmVhZFN0YXR1czsKKworc3RhdGljIFJlYWRTdGF0dXMKK3JlYWRfbGluZSAoaW50ICAgICAgICBmZCwKKyAgICAgICAgICAgY2hhciAgICAgICpidWYsCisgICAgICAgICAgIHNpemVfdCAgICAgbWF4bGVuKQoreworICBzaXplX3QgYnl0ZXMgPSAwOworICBSZWFkU3RhdHVzIHJldHZhbDsKKworICBtZW1zZXQgKGJ1ZiwgJ1wwJywgbWF4bGVuKTsKKyAgbWF4bGVuIC09IDE7IC8qIGVuc3VyZSBudWwgdGVybSAqLworICAKKyAgcmV0dmFsID0gUkVBRF9TVEFUVVNfT0s7CisgIAorICB3aGlsZSAoVFJVRSkKKyAgICB7CisgICAgICBzc2l6ZV90IGNodW5rOyAgICAKKyAgICAgIHNpemVfdCB0b19yZWFkOworICAgICAgCisgICAgYWdhaW46CisgICAgICB0b19yZWFkID0gbWF4bGVuIC0gYnl0ZXM7CisKKyAgICAgIGlmICh0b19yZWFkID09IDApCisgICAgICAgIGJyZWFrOworICAgICAgCisgICAgICBjaHVuayA9IHJlYWQgKGZkLAorICAgICAgICAgICAgICAgICAgICBidWYgKyBieXRlcywKKyAgICAgICAgICAgICAgICAgICAgdG9fcmVhZCk7CisgICAgICBpZiAoY2h1bmsgPCAwICYmIGVycm5vID09IEVJTlRSKQorICAgICAgICBnb3RvIGFnYWluOworICAgICAgICAgIAorICAgICAgaWYgKGNodW5rIDwgMCkKKyAgICAgICAgeworICAgICAgICAgIHJldHZhbCA9IFJFQURfU1RBVFVTX0VSUk9SOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChjaHVuayA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgcmV0dmFsID0gUkVBRF9TVEFUVVNfRU9GOworICAgICAgICAgIGJyZWFrOyAvKiBFT0YgKi8KKyAgICAgICAgfQorICAgICAgZWxzZSAvKiBjaHVuayA+IDAgKi8KKwlieXRlcyArPSBjaHVuazsKKyAgICB9CisKKyAgaWYgKHJldHZhbCA9PSBSRUFEX1NUQVRVU19FT0YgJiYKKyAgICAgIGJ5dGVzID4gMCkKKyAgICByZXR2YWwgPSBSRUFEX1NUQVRVU19PSzsKKyAgCisgIC8qIHdoYWNrIG5ld2xpbmUgKi8KKyAgaWYgKHJldHZhbCAhPSBSRUFEX1NUQVRVU19FUlJPUiAmJgorICAgICAgYnl0ZXMgPiAwICYmCisgICAgICBidWZbYnl0ZXMtMV0gPT0gJ1xuJykKKyAgICBidWZbYnl0ZXMtMV0gPSAnXDAnOworICAKKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIFJlYWRTdGF0dXMKK3JlYWRfcGlkIChpbnQgICAgICAgIGZkLAorICAgICAgICAgIHBpZF90ICAgICAqYnVmKQoreworICBzaXplX3QgYnl0ZXMgPSAwOworICBSZWFkU3RhdHVzIHJldHZhbDsKKworICByZXR2YWwgPSBSRUFEX1NUQVRVU19PSzsKKyAgCisgIHdoaWxlIChUUlVFKQorICAgIHsKKyAgICAgIHNzaXplX3QgY2h1bms7ICAgIAorICAgICAgc2l6ZV90IHRvX3JlYWQ7CisgICAgICAKKyAgICBhZ2FpbjoKKyAgICAgIHRvX3JlYWQgPSBzaXplb2YgKHBpZF90KSAtIGJ5dGVzOworCisgICAgICBpZiAodG9fcmVhZCA9PSAwKQorICAgICAgICBicmVhazsKKyAgICAgIAorICAgICAgY2h1bmsgPSByZWFkIChmZCwKKyAgICAgICAgICAgICAgICAgICAgKChjaGFyKilidWYpICsgYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgIHRvX3JlYWQpOworICAgICAgaWYgKGNodW5rIDwgMCAmJiBlcnJubyA9PSBFSU5UUikKKyAgICAgICAgZ290byBhZ2FpbjsKKyAgICAgICAgICAKKyAgICAgIGlmIChjaHVuayA8IDApCisgICAgICAgIHsKKyAgICAgICAgICByZXR2YWwgPSBSRUFEX1NUQVRVU19FUlJPUjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoY2h1bmsgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIHJldHZhbCA9IFJFQURfU1RBVFVTX0VPRjsKKyAgICAgICAgICBicmVhazsgLyogRU9GICovCisgICAgICAgIH0KKyAgICAgIGVsc2UgLyogY2h1bmsgPiAwICovCisJYnl0ZXMgKz0gY2h1bms7CisgICAgfQorCisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkCitkb193cml0ZSAoaW50IGZkLCBjb25zdCB2b2lkICpidWYsIHNpemVfdCBjb3VudCkKK3sKKyAgc2l6ZV90IGJ5dGVzX3dyaXR0ZW47CisgIGludCByZXQ7CisgIAorICBieXRlc193cml0dGVuID0gMDsKKyAgCisgYWdhaW46CisgIAorICByZXQgPSB3cml0ZSAoZmQsICgoY29uc3QgY2hhciopYnVmKSArIGJ5dGVzX3dyaXR0ZW4sIGNvdW50IC0gYnl0ZXNfd3JpdHRlbik7CisKKyAgaWYgKHJldCA8IDApCisgICAgeworICAgICAgaWYgKGVycm5vID09IEVJTlRSKQorICAgICAgICBnb3RvIGFnYWluOworICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiRmFpbGVkIHRvIHdyaXRlIGRhdGEgdG8gcGlwZSEgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICAgICAgZXhpdCAoMSk7IC8qIGdpdmUgdXAsIHdlIHN1Y2sgKi8KKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIGJ5dGVzX3dyaXR0ZW4gKz0gcmV0OworICAKKyAgaWYgKGJ5dGVzX3dyaXR0ZW4gPCBjb3VudCkKKyAgICBnb3RvIGFnYWluOworfQorCitzdGF0aWMgdm9pZAord3JpdGVfcGlkIChpbnQgICBmZCwKKyAgICAgICAgICAgcGlkX3QgcGlkKQoreworICBkb193cml0ZSAoZmQsICZwaWQsIHNpemVvZiAocGlkKSk7Cit9CisKK3N0YXRpYyBpbnQKK2RvX3dhaXRwaWQgKHBpZF90IHBpZCkKK3sKKyAgaW50IHJldDsKKyAgCisgYWdhaW46CisgIHJldCA9IHdhaXRwaWQgKHBpZCwgTlVMTCwgMCk7CisKKyAgaWYgKHJldCA8IDAgJiYKKyAgICAgIGVycm5vID09IEVJTlRSKQorICAgIGdvdG8gYWdhaW47CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHBpZF90IGJ1c19waWRfdG9fa2lsbCA9IC0xOworCitzdGF0aWMgdm9pZAora2lsbF9idXModm9pZCkKK3sKKyAgaWYgKGJ1c19waWRfdG9fa2lsbCA8PSAwKQorICAgIHJldHVybjsKKworICB2ZXJib3NlICgiS2lsbGluZyBtZXNzYWdlIGJ1cyBhbmQgZXhpdGluZyBiYWJ5c2l0dGVyXG4iKTsKKyAga2lsbCAoYnVzX3BpZF90b19raWxsLCBTSUdURVJNKTsKKyAgc2xlZXAgKDMpOworICBraWxsIChidXNfcGlkX3RvX2tpbGwsIFNJR0tJTEwpOworfQorCit2b2lkCitraWxsX2J1c19hbmRfZXhpdCAoaW50IGV4aXRjb2RlKQoreworICAvKiBpbiBjYXNlIHRoZXNlIHBvaW50IHRvIGFueSBORlMgbW91bnRzLCBnZXQgcmlkIG9mIHRoZW0gaW1tZWRpYXRlbHkgKi8KKyAgY2xvc2UgKDApOworICBjbG9zZSAoMSk7CisgIGNsb3NlICgyKTsKKworICBraWxsX2J1cygpOworCisgIGV4aXQgKGV4aXRjb2RlKTsKK30KKworc3RhdGljIHZvaWQKK3ByaW50X3ZhcmlhYmxlcyAoY29uc3QgY2hhciAqYnVzX2FkZHJlc3MsIHBpZF90IGJ1c19waWQsIGxvbmcgYnVzX3dpZCwKKwkJIGludCBjX3NoZWxsX3N5bnRheCwgaW50IGJvdXJuZV9zaGVsbF9zeW50YXgsCisJCSBpbnQgYmluYXJ5X3N5bnRheCkKK3sKKyAgaWYgKGJpbmFyeV9zeW50YXgpCisgICAgeworICAgICAgZG9fd3JpdGUgKDEsIGJ1c19hZGRyZXNzLCBzdHJsZW4gKGJ1c19hZGRyZXNzKSArIDEpOworICAgICAgZG9fd3JpdGUgKDEsICZidXNfcGlkLCBzaXplb2YgYnVzX3BpZCk7CisgICAgICBkb193cml0ZSAoMSwgJmJ1c193aWQsIHNpemVvZiBidXNfd2lkKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIGVsc2UgaWYgKGNfc2hlbGxfc3ludGF4KQorICAgIHsKKyAgICAgIHByaW50ZiAoInNldGVudiBEQlVTX1NFU1NJT05fQlVTX0FERFJFU1MgJyVzJztcbiIsIGJ1c19hZGRyZXNzKTsJCisgICAgICBpZiAoYnVzX3BpZCkKKyAgICAgICAgcHJpbnRmICgic2V0IERCVVNfU0VTU0lPTl9CVVNfUElEPSVsZDtcbiIsIChsb25nKSBidXNfcGlkKTsKKyAgICAgIGlmIChidXNfd2lkKQorICAgICAgICBwcmludGYgKCJzZXQgREJVU19TRVNTSU9OX0JVU19XSU5ET1dJRD0lbGQ7XG4iLCAobG9uZykgYnVzX3dpZCk7CisgICAgICBmZmx1c2ggKHN0ZG91dCk7CisgICAgfQorICBlbHNlIGlmIChib3VybmVfc2hlbGxfc3ludGF4KQorICAgIHsKKyAgICAgIHByaW50ZiAoIkRCVVNfU0VTU0lPTl9CVVNfQUREUkVTUz0nJXMnO1xuIiwgYnVzX2FkZHJlc3MpOworICAgICAgcHJpbnRmICgiZXhwb3J0IERCVVNfU0VTU0lPTl9CVVNfQUREUkVTUztcbiIpOworICAgICAgaWYgKGJ1c19waWQpCisgICAgICAgIHByaW50ZiAoIkRCVVNfU0VTU0lPTl9CVVNfUElEPSVsZDtcbiIsIChsb25nKSBidXNfcGlkKTsKKyAgICAgIGlmIChidXNfd2lkKQorICAgICAgICBwcmludGYgKCJEQlVTX1NFU1NJT05fQlVTX1dJTkRPV0lEPSVsZDtcbiIsIChsb25nKSBidXNfd2lkKTsKKyAgICAgIGZmbHVzaCAoc3Rkb3V0KTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBwcmludGYgKCJEQlVTX1NFU1NJT05fQlVTX0FERFJFU1M9JXNcbiIsIGJ1c19hZGRyZXNzKTsKKyAgICAgIGlmIChidXNfcGlkKQorICAgICAgICBwcmludGYgKCJEQlVTX1NFU1NJT05fQlVTX1BJRD0lbGRcbiIsIChsb25nKSBidXNfcGlkKTsKKyAgICAgIGlmIChidXNfd2lkKQorCXByaW50ZiAoIkRCVVNfU0VTU0lPTl9CVVNfV0lORE9XSUQ9JWxkXG4iLCAobG9uZykgYnVzX3dpZCk7CisgICAgICBmZmx1c2ggKHN0ZG91dCk7CisgICAgfQorfQorCitzdGF0aWMgaW50IGdvdF9mYXRhbF9zaWduYWwgPSAwOworCitzdGF0aWMgdm9pZAorc2lnbmFsX2hhbmRsZXIgKGludCBzaWcpCit7CisgIGdvdF9mYXRhbF9zaWduYWwgPSBzaWc7Cit9CisKK3N0YXRpYyB2b2lkIGtpbGxfYnVzX3doZW5fc2Vzc2lvbl9lbmRzICh2b2lkKSBfREJVU19HTlVDX05PUkVUVVJOOworCitzdGF0aWMgdm9pZAora2lsbF9idXNfd2hlbl9zZXNzaW9uX2VuZHMgKHZvaWQpCit7CisgIGludCB0dHlfZmQ7CisgIGludCB4X2ZkOworICBmZF9zZXQgcmVhZF9zZXQ7CisgIGZkX3NldCBlcnJfc2V0OworICBzdHJ1Y3Qgc2lnYWN0aW9uIGFjdDsKKyAgc2lnc2V0X3QgZW1wdHlfbWFzazsKKyAgCisgIC8qIGluc3RhbGwgU0lHSFVQIGhhbmRsZXIgKi8KKyAgZ290X2ZhdGFsX3NpZ25hbCA9IDA7CisgIHNpZ2VtcHR5c2V0ICgmZW1wdHlfbWFzayk7CisgIGFjdC5zYV9oYW5kbGVyID0gc2lnbmFsX2hhbmRsZXI7CisgIGFjdC5zYV9tYXNrICAgID0gZW1wdHlfbWFzazsKKyAgYWN0LnNhX2ZsYWdzICAgPSAwOworICBzaWdhY3Rpb24gKFNJR0hVUCwgICZhY3QsIE5VTEwpOworICBzaWdhY3Rpb24gKFNJR1RFUk0sICAmYWN0LCBOVUxMKTsKKyAgc2lnYWN0aW9uIChTSUdJTlQsICAmYWN0LCBOVUxMKTsKKyAgCisjaWZkZWYgREJVU19CVUlMRF9YMTEKKyAgeDExX2luaXQoKTsKKyAgaWYgKHhkaXNwbGF5ICE9IE5VTEwpCisgICAgeworICAgICAgeF9mZCA9IENvbm5lY3Rpb25OdW1iZXIgKHhkaXNwbGF5KTsKKyAgICB9CisgIGVsc2UKKyAgICB4X2ZkID0gLTE7CisjZWxzZQorICB4X2ZkID0gLTE7CisjZW5kaWYKKworICBpZiAoaXNhdHR5ICgwKSkKKyAgICB0dHlfZmQgPSAwOworICBlbHNlCisgICAgdHR5X2ZkID0gLTE7CisKKyAgaWYgKHhfZmQgPj0gMCkKKyAgICB7CisgICAgICB2ZXJib3NlICgic2Vzc2lvbiBsaWZldGltZSBpcyBkZWZpbmVkIGJ5IFgsIG5vdCBtb25pdG9yaW5nIHN0ZGluXG4iKTsKKyAgICAgIHR0eV9mZCA9IC0xOworICAgIH0KKyAgZWxzZSBpZiAodHR5X2ZkID49IDApCisgICAgeworICAgICAgdmVyYm9zZSAoInN0ZGluIGlzYXR0eSgpLCBtb25pdG9yaW5nIGl0XG4iKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICB2ZXJib3NlICgic3RkaW4gd2FzIG5vdCBhIFRUWSwgbm90IG1vbml0b3JpbmcgaXRcbiIpOworICAgIH0KKworICBpZiAodHR5X2ZkIDwgMCAmJiB4X2ZkIDwgMCkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJObyB0ZXJtaW5hbCBvbiBzdGFuZGFyZCBpbnB1dCBhbmQgbm8gWCBkaXNwbGF5OyBjYW5ub3QgYXR0YWNoIG1lc3NhZ2UgYnVzIHRvIHNlc3Npb24gbGlmZXRpbWVcbiIpOworICAgICAga2lsbF9idXNfYW5kX2V4aXQgKDEpOworICAgIH0KKyAgCisgIHdoaWxlIChUUlVFKQorICAgIHsKKyNpZmRlZiBEQlVTX0JVSUxEX1gxMQorICAgICAgLyogRHVtcCBldmVudHMgb24gdGhlIGZsb29yLCBhbmQgbGV0CisgICAgICAgKiBJTyBlcnJvciBoYW5kbGVyIHJ1biBpZiB3ZSBsb3NlCisgICAgICAgKiB0aGUgWCBjb25uZWN0aW9uLiBJdCdzIGltcG9ydGFudCB0bworICAgICAgICogcnVuIHRoaXMgYmVmb3JlIGdvaW5nIGludG8gc2VsZWN0KCkgc2luY2UKKyAgICAgICAqIHdlIG1pZ2h0IGhhdmUgcXVldWVkIG91dGdvaW5nIG1lc3NhZ2VzIG9yCisgICAgICAgKiBldmVudHMuCisgICAgICAgKi8KKyAgICAgIHgxMV9oYW5kbGVfZXZlbnQgKCk7CisjZW5kaWYKKyAgICAgIAorICAgICAgRkRfWkVSTyAoJnJlYWRfc2V0KTsKKyAgICAgIEZEX1pFUk8gKCZlcnJfc2V0KTsKKworICAgICAgaWYgKHR0eV9mZCA+PSAwKQorICAgICAgICB7CisgICAgICAgICAgRkRfU0VUICh0dHlfZmQsICZyZWFkX3NldCk7CisgICAgICAgICAgRkRfU0VUICh0dHlfZmQsICZlcnJfc2V0KTsKKyAgICAgICAgfQorCisgICAgICBpZiAoeF9mZCA+PSAwKQorICAgICAgICB7CisgICAgICAgICAgRkRfU0VUICh4X2ZkLCAmcmVhZF9zZXQpOworICAgICAgICAgIEZEX1NFVCAoeF9mZCwgJmVycl9zZXQpOworICAgICAgICB9CisKKyAgICAgIHNlbGVjdCAoTUFYICh0dHlfZmQsIHhfZmQpICsgMSwKKyAgICAgICAgICAgICAgJnJlYWRfc2V0LCBOVUxMLCAmZXJyX3NldCwgTlVMTCk7CisKKyAgICAgIGlmIChnb3RfZmF0YWxfc2lnbmFsKQorICAgICAgICB7CisgICAgICAgICAgdmVyYm9zZSAoIkdvdCBmYXRhbCBzaWduYWwgJWQsIGtpbGxpbmcgZGJ1cy1kYWVtb25cbiIsCisgICAgICAgICAgICAgICAgICAgZ290X2ZhdGFsX3NpZ25hbCk7CisgICAgICAgICAga2lsbF9idXNfYW5kX2V4aXQgKDApOworICAgICAgICB9CisgICAgICAKKyNpZmRlZiBEQlVTX0JVSUxEX1gxMQorICAgICAgLyogRXZlbnRzIHdpbGwgYmUgcHJvY2Vzc2VkIGJlZm9yZSB3ZSBzZWxlY3QgYWdhaW4KKyAgICAgICAqLworICAgICAgaWYgKHhfZmQgPj0gMCkKKyAgICAgICAgdmVyYm9zZSAoIlggZmQgY29uZGl0aW9uIHJlYWRpbmcgPSAlZCBlcnJvciA9ICVkXG4iLAorICAgICAgICAgICAgICAgICBGRF9JU1NFVCAoeF9mZCwgJnJlYWRfc2V0KSwKKyAgICAgICAgICAgICAgICAgRkRfSVNTRVQgKHhfZmQsICZlcnJfc2V0KSk7CisjZW5kaWYKKworICAgICAgaWYgKHR0eV9mZCA+PSAwKQorICAgICAgICB7CisgICAgICAgICAgaWYgKEZEX0lTU0VUICh0dHlfZmQsICZyZWFkX3NldCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGludCBieXRlc19yZWFkOworICAgICAgICAgICAgICBjaGFyIGRpc2NhcmRbNTEyXTsKKworICAgICAgICAgICAgICB2ZXJib3NlICgiVFRZIHJlYWR5IGZvciByZWFkaW5nXG4iKTsKKyAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIGJ5dGVzX3JlYWQgPSByZWFkICh0dHlfZmQsIGRpc2NhcmQsIHNpemVvZiAoZGlzY2FyZCkpOworCisgICAgICAgICAgICAgIHZlcmJvc2UgKCJSZWFkICVkIGJ5dGVzIGZyb20gVFRZIGVycm5vID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzX3JlYWQsIGVycm5vKTsKKyAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIGlmIChieXRlc19yZWFkID09IDApCisgICAgICAgICAgICAgICAga2lsbF9idXNfYW5kX2V4aXQgKDApOyAvKiBFT0YgKi8KKyAgICAgICAgICAgICAgZWxzZSBpZiAoYnl0ZXNfcmVhZCA8IDAgJiYgZXJybm8gIT0gRUlOVFIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgLyogVGhpcyBzaG91bGRuJ3QgaGFwcGVuIEkgZG9uJ3QgdGhpbms7IHRvIGF2b2lkCisgICAgICAgICAgICAgICAgICAgKiBzcGlubmluZyBvbiB0aGUgZmQgZm9yZXZlciB3ZSBleGl0LgorICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJkYnVzLWxhdW5jaDogZXJyb3IgcmVhZGluZyBmcm9tIHN0ZGluOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yIChlcnJubykpOworICAgICAgICAgICAgICAgICAga2lsbF9idXNfYW5kX2V4aXQgKDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIGlmIChGRF9JU1NFVCAodHR5X2ZkLCAmZXJyX3NldCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHZlcmJvc2UgKCJUVFkgaGFzIGVycm9yIGNvbmRpdGlvblxuIik7CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBraWxsX2J1c19hbmRfZXhpdCAoMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgIC8qIG5vdCByZWFjaGVkICovCit9CisKK19EQlVTX0dOVUNfTk9SRVRVUk4gc3RhdGljIHZvaWQKK2JhYnlzaXQgKGludCAgIGV4aXRfd2l0aF9zZXNzaW9uLAorICAgICAgICAgcGlkX3QgY2hpbGRfcGlkLAorICAgICAgICAgaW50ICAgcmVhZF9idXNfcGlkX2ZkKSAgLyogcmVhZCBwaWQgZnJvbSBoZXJlICovCit7CisgIERCdXNFbnN1cmVTdGFuZGFyZEZkc0ZsYWdzIGZsYWdzOworICBpbnQgcmV0OworICBjb25zdCBjaGFyICpzOworCisgIHZlcmJvc2UgKCJiYWJ5c2l0dGluZywgZXhpdF93aXRoX3Nlc3Npb24gPSAlZCwgY2hpbGRfcGlkID0gJWxkLCByZWFkX2J1c19waWRfZmQgPSAlZFxuIiwKKyAgICAgICAgICAgZXhpdF93aXRoX3Nlc3Npb24sIChsb25nKSBjaGlsZF9waWQsIHJlYWRfYnVzX3BpZF9mZCk7CisgIAorICAvKiBXZSBjaGRpciAoIi8iKSBzaW5jZSB3ZSBhcmUgcGVyc2lzdGVudCBhbmQgZGFlbW9uLWxpa2UsIGFuZCBmb3JrCisgICAqIGFnYWluIHNvIGRidXMtbGF1bmNoIGNhbiByZWFwIHRoZSBwYXJlbnQuICBIb3dldmVyLCB3ZSBkb24ndAorICAgKiBzZXRzaWQoKSBvciBjbG9zZSBmZCAwIGJlY2F1c2UgdGhlIGlkZWEgaXMgdG8gcmVtYWluIGF0dGFjaGVkCisgICAqIHRvIHRoZSB0dHkgYW5kIHRoZSBYIHNlcnZlciBpbiBvcmRlciB0byBraWxsIHRoZSBtZXNzYWdlIGJ1cworICAgKiB3aGVuIHRoZSBzZXNzaW9uIGVuZHMuCisgICAqLworCisgIGlmIChjaGRpciAoIi8iKSA8IDApCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiQ291bGQgbm90IGNoYW5nZSB0byByb290IGRpcmVjdG9yeTogJXNcbiIsCisgICAgICAgICAgICAgICBzdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICBmbGFncyA9IERCVVNfRk9SQ0VfU1RET1VUX05VTEw7CisKKyAgaWYgKCFleGl0X3dpdGhfc2Vzc2lvbikKKyAgICBmbGFncyB8PSBEQlVTX0ZPUkNFX1NURElOX05VTEw7CisKKyAgcyA9IGdldGVudiAoIkRCVVNfREVCVUdfT1VUUFVUIik7CisKKyAgaWYgKHMgPT0gTlVMTCB8fCAqcyA9PSAnXDAnKQorICAgIGZsYWdzIHw9IERCVVNfRk9SQ0VfU1RERVJSX05VTEw7CisKKyAgLyogQ2xvc2Ugc3Rkb3V0L3N0ZGVyciBzbyB3ZSBkb24ndCBibG9jayBhbiAiZXZhbCIgb3Igb3RoZXJ3aXNlCisgICAqIGxvY2sgdXAuIHN0ZG91dCBpcyBzdGlsbCBjaGFpbmluZyB0aHJvdWdoIHRvIGRidXMtbGF1bmNoCisgICAqIGFuZCBpbiB0dXJuIHRvIHRoZSBwYXJlbnQgc2hlbGwuCisgICAqLworICBpZiAoIV9kYnVzX2Vuc3VyZV9zdGFuZGFyZF9mZHMgKGZsYWdzLCAmcykpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICVzXG4iLCBzLCBzdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICByZXQgPSBmb3JrICgpOworCisgIGlmIChyZXQgPCAwKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgImZvcmsoKSBmYWlsZWQgaW4gYmFieXNpdHRlcjogJXNcbiIsCisgICAgICAgICAgICAgICBzdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICBpZiAocmV0ID4gMCkKKyAgICB7CisgICAgICAvKiBQYXJlbnQgcmVhcHMgcHJlLWZvcmsgcGFydCBvZiBidXMgZGFlbW9uLCB0aGVuIGV4aXRzIGFuZCBpcworICAgICAgICogcmVhcGVkIHNvIHRoZSBiYWJ5c2l0dGVyIGlzbid0IGEgem9tYmllCisgICAgICAgKi8KKworICAgICAgdmVyYm9zZSAoIj09PSBCYWJ5c2l0dGVyJ3MgaW50ZXJtZWRpYXRlIHBhcmVudCBjb250aW51ZXMgYWdhaW5cbiIpOworICAgICAgCisgICAgICBpZiAoZG9fd2FpdHBpZCAoY2hpbGRfcGlkKSA8IDApCisgICAgICAgIHsKKyAgICAgICAgICAvKiBzaG91bGRuJ3QgaGFwcGVuICovCisgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiRmFpbGVkIHdhaXRwaWQoKSB3YWl0aW5nIGZvciBidXMgZGFlbW9uJ3MgcGFyZW50XG4iKTsKKyAgICAgICAgICBleGl0ICgxKTsKKyAgICAgICAgfQorCisgICAgICB2ZXJib3NlICgiQmFieXNpdHRlcidzIGludGVybWVkaWF0ZSBwYXJlbnQgZXhpdGluZ1xuIik7CisgICAgICAKKyAgICAgIGV4aXQgKDApOworICAgIH0KKworICAvKiBDaGlsZCBjb250aW51ZXMgKi8KKyAgdmVyYm9zZSAoIj09PSBCYWJ5c2l0dGVyIHByb2Nlc3MgY3JlYXRlZFxuIik7CisKKyAgdmVyYm9zZSAoIlJlYWRpbmcgUElEIGZyb20gYnVzXG4iKTsKKyAgICAgIAorICBzd2l0Y2ggKHJlYWRfcGlkIChyZWFkX2J1c19waWRfZmQsICZidXNfcGlkX3RvX2tpbGwpKQorICAgIHsKKyAgICBjYXNlIFJFQURfU1RBVFVTX09LOgorICAgICAgYnJlYWs7CisgICAgY2FzZSBSRUFEX1NUQVRVU19FT0Y6CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJFT0YgaW4gZGJ1cy1sYXVuY2ggcmVhZGluZyBQSUQgZnJvbSBidXMgZGFlbW9uXG4iKTsKKyAgICAgIGV4aXQgKDEpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBSRUFEX1NUQVRVU19FUlJPUjoKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIkVycm9yIGluIGRidXMtbGF1bmNoIHJlYWRpbmcgUElEIGZyb20gYnVzIGRhZW1vbjogJXNcbiIsCisJICAgICAgIHN0cmVycm9yIChlcnJubykpOworICAgICAgZXhpdCAoMSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiSW52YWxpZCByZWFkIHJlc3VsdCIpOworICAgIH0KKworICB2ZXJib3NlICgiR290IFBJRCAlbGQgZnJvbSBkYWVtb25cbiIsCisgICAgICAgICAgIChsb25nKSBidXNfcGlkX3RvX2tpbGwpOworICAKKyAgaWYgKGV4aXRfd2l0aF9zZXNzaW9uKQorICAgIHsKKyAgICAgIC8qIEJ1cyBpcyBub3cgc3RhcnRlZCBhbmQgbGF1bmNoZXIgaGFzIG5lZWRlZCBpbmZvOworICAgICAgICogd2UgY29ubmVjdCB0byBYIGRpc3BsYXkgYW5kIHR0eSBhbmQgd2FpdCB0bworICAgICAgICoga2lsbCBidXMgaWYgcmVxdWVzdGVkLgorICAgICAgICovCisgICAgICAKKyAgICAgIGtpbGxfYnVzX3doZW5fc2Vzc2lvbl9lbmRzICgpOworICAgIH0KKworICB2ZXJib3NlICgiQmFieXNpdHRlciBleGl0aW5nXG4iKTsKKyAgCisgIGV4aXQgKDApOworfQorCitzdGF0aWMgdm9pZAorZG9fY2xvc2Vfc3RkZXJyICh2b2lkKQoreworICBjb25zdCBjaGFyICplcnI7CisKKyAgZmZsdXNoIChzdGRlcnIpOworCisgIGlmICghX2RidXNfZW5zdXJlX3N0YW5kYXJkX2ZkcyAoREJVU19GT1JDRV9TVERFUlJfTlVMTCwgJmVycikpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICVzXG4iLCBlcnIsIHN0cmVycm9yIChlcnJubykpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBwYXNzX2luZm8gKGNvbnN0IGNoYXIgKnJ1bnByb2csIGNvbnN0IGNoYXIgKmJ1c19hZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBidXNfcGlkLCBsb25nIGJ1c193aWQsIGludCBjX3NoZWxsX3N5bnRheCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IGJvdXJuZV9zaGVsbF9zeW50YXgsIGludCBiaW5hcnlfc3ludGF4LAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXJnYywgY2hhciAqKmFyZ3YsCisgICAgICAgICAgICAgICAgICAgICAgIGludCByZW1haW5pbmdfYXJncykgX0RCVVNfR05VQ19OT1JFVFVSTjsKKworc3RhdGljIHZvaWQKK3Bhc3NfaW5mbyAoY29uc3QgY2hhciAqcnVucHJvZywgY29uc3QgY2hhciAqYnVzX2FkZHJlc3MsIHBpZF90IGJ1c19waWQsCisgICAgICAgICAgIGxvbmcgYnVzX3dpZCwgaW50IGNfc2hlbGxfc3ludGF4LCBpbnQgYm91cm5lX3NoZWxsX3N5bnRheCwKKyAgICAgICAgICAgaW50IGJpbmFyeV9zeW50YXgsCisgICAgICAgICAgIGludCBhcmdjLCBjaGFyICoqYXJndiwgaW50IHJlbWFpbmluZ19hcmdzKQoreworICBjaGFyICplbnZ2YXIgPSBOVUxMOworICBjaGFyICoqYXJncyA9IE5VTEw7CisKKyAgaWYgKHJ1bnByb2cpCisgICAgeworICAgICAgaW50IGk7CisKKyAgICAgIGVudnZhciA9IG1hbGxvYyAoc3RybGVuICgiREJVU19TRVNTSU9OX0JVU19BRERSRVNTPSIpICsKKyAgICAgICAgICBzdHJsZW4gKGJ1c19hZGRyZXNzKSArIDEpOworICAgICAgYXJncyA9IG1hbGxvYyAoc2l6ZW9mIChjaGFyICopICogKChhcmdjLXJlbWFpbmluZ19hcmdzKSsyKSk7CisKKyAgICAgIGlmIChlbnZ2YXIgPT0gTlVMTCB8fCBhcmdzID09IE5VTEwpCisgICAgICAgIGdvdG8gb29tOworCisgICAgICBhcmdzWzBdID0geHN0cmR1cCAocnVucHJvZyk7CisgICAgICBpZiAoIWFyZ3NbMF0pCisgICAgICAgIGdvdG8gb29tOworICAgICAgZm9yIChpID0gMTsgaSA8PSAoYXJnYy1yZW1haW5pbmdfYXJncyk7IGkrKykKKyAgICAgICAgeworICAgICAgICAgIHNpemVfdCBsZW4gPSBzdHJsZW4gKGFyZ3ZbcmVtYWluaW5nX2FyZ3MraS0xXSkrMTsKKyAgICAgICAgICBhcmdzW2ldID0gbWFsbG9jIChsZW4pOworICAgICAgICAgIGlmICghYXJnc1tpXSkKKwkgICAgeworICAgICAgICAgICAgICB3aGlsZSAoaSA+IDEpCisgICAgICAgICAgICAgICAgZnJlZSAoYXJnc1stLWldKTsKKyAgICAgICAgICAgICAgZ290byBvb207CisJICAgIH0KKyAgICAgICAgICBzdHJuY3B5IChhcmdzW2ldLCBhcmd2W3JlbWFpbmluZ19hcmdzK2ktMV0sIGxlbik7CisgICAgICAgIH0KKyAgICAgIGFyZ3NbaV0gPSBOVUxMOworCisgICAgICBzdHJjcHkgKGVudnZhciwgIkRCVVNfU0VTU0lPTl9CVVNfQUREUkVTUz0iKTsKKyAgICAgIHN0cmNhdCAoZW52dmFyLCBidXNfYWRkcmVzcyk7CisgICAgICBwdXRlbnYgKGVudnZhcik7CisKKyAgICAgIGV4ZWN2cCAocnVucHJvZywgYXJncyk7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJDb3VsZG4ndCBleGVjICVzOiAlc1xuIiwgcnVucHJvZywgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisgICBlbHNlCisgICAgeworICAgICAgcHJpbnRfdmFyaWFibGVzIChidXNfYWRkcmVzcywgYnVzX3BpZCwgYnVzX3dpZCwgY19zaGVsbF9zeW50YXgsCisgICAgICAgICAgYm91cm5lX3NoZWxsX3N5bnRheCwgYmluYXJ5X3N5bnRheCk7CisgICAgfQorICB2ZXJib3NlICgiZGJ1cy1sYXVuY2ggZXhpdGluZ1xuIik7CisKKyAgZmZsdXNoIChzdGRvdXQpOworICBmZmx1c2ggKHN0ZGVycik7CisgIGNsb3NlICgxKTsKKyAgY2xvc2UgKDIpOworICBleGl0ICgwKTsKK29vbToKKyAgaWYgKGVudnZhcikKKyAgICBmcmVlIChlbnZ2YXIpOworCisgIGlmIChhcmdzKQorICAgIGZyZWUgKGFyZ3MpOworCisgIGZwcmludGYgKHN0ZGVyciwgIk91dCBvZiBtZW1vcnkhIik7CisgIGV4aXQgKDEpOworfQorCisjZGVmaW5lIFJFQURfRU5EICAwCisjZGVmaW5lIFdSSVRFX0VORCAxCisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICBjb25zdCBjaGFyICpwcmV2X2FyZzsKKyAgY29uc3QgY2hhciAqc2huYW1lOworICBjb25zdCBjaGFyICpydW5wcm9nID0gTlVMTDsKKyAgaW50IHJlbWFpbmluZ19hcmdzID0gMDsKKyAgaW50IGV4aXRfd2l0aF9zZXNzaW9uOworICBpbnQgZXhpdF93aXRoX3gxMSA9IEZBTFNFOworICBpbnQgYmluYXJ5X3N5bnRheCA9IEZBTFNFOworICBpbnQgY19zaGVsbF9zeW50YXggPSBGQUxTRTsKKyAgaW50IGJvdXJuZV9zaGVsbF9zeW50YXggPSBGQUxTRTsKKyAgaW50IGF1dG9fc2hlbGxfc3ludGF4ID0gRkFMU0U7CisgIGludCBhdXRvbGF1bmNoID0gRkFMU0U7CisgIGludCByZXF1aXJlc19hcmcgPSBGQUxTRTsKKyAgaW50IGNsb3NlX3N0ZGVyciA9IEZBTFNFOworICBpbnQgaTsKKyAgaW50IHJldDsKKyAgaW50IGJ1c19waWRfdG9fbGF1bmNoZXJfcGlwZVsyXTsKKyAgaW50IGJ1c19waWRfdG9fYmFieXNpdHRlcl9waXBlWzJdOworICBpbnQgYnVzX2FkZHJlc3NfdG9fbGF1bmNoZXJfcGlwZVsyXTsKKyAgY2hhciAqY29uZmlnX2ZpbGU7CisgIGRidXNfYm9vbF90IHVzZXJfYnVzX3N1cHBvcnRlZCA9IEZBTFNFOworICBEQnVzU3RyaW5nIHVzZXJfYnVzOworICBjb25zdCBjaGFyICplcnJvcl9zdHI7CisgIERCdXNFcnJvciBlcnJvciA9IERCVVNfRVJST1JfSU5JVDsKKworICBleGl0X3dpdGhfc2Vzc2lvbiA9IEZBTFNFOworICBjb25maWdfZmlsZSA9IE5VTEw7CisKKyAgLyogRW5zdXJlIHRoYXQgdGhlIGZpcnN0IHRocmVlIGZkcyBhcmUgb3BlbiwgdG8gZW5zdXJlIHRoYXQgd2hlbiB3ZQorICAgKiBjcmVhdGUgb3RoZXIgZmlsZSBkZXNjcmlwdG9ycyAoZm9yIGV4YW1wbGUgZm9yIGVwb2xsLCBpbm90aWZ5IG9yCisgICAqIGEgc29ja2V0KSwgdGhleSBuZXZlciBnZXQgYXNzaWduZWQgYXMgZmQgMCwgMSBvciAyLiBJZiB0aGV5IHdlcmUsCisgICAqIHdoaWNoIGNvdWxkIGhhcHBlbiBpZiBvdXIgY2FsbGVyIGhhZCAoaW5jb3JyZWN0bHkpIGNsb3NlZCB0aG9zZQorICAgKiBzdGFuZGFyZCBmZHMsIHRoZW4gd2UnZCBzdGFydCBkYnVzLWRhZW1vbiB3aXRoIHRob3NlIGZkcyBjbG9zZWQsCisgICAqIHdoaWNoIGlzIHVuZXhwZWN0ZWQgYW5kIGNvdWxkIGNhdXNlIGl0IHRvIG1pc2JlaGF2ZS4gKi8KKyAgaWYgKCFfZGJ1c19lbnN1cmVfc3RhbmRhcmRfZmRzICgwLCAmZXJyb3Jfc3RyKSkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsCisgICAgICAgICAgICAgICAiZGJ1cy1sYXVuY2g6IGZhdGFsIGVycm9yIHNldHRpbmcgdXAgc3RhbmRhcmQgZmRzOiAlczogJXNcbiIsCisgICAgICAgICAgICAgICBlcnJvcl9zdHIsIF9kYnVzX3N0cmVycm9yIChlcnJubykpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgIHByZXZfYXJnID0gTlVMTDsKKyAgaSA9IDE7CisgIHdoaWxlIChpIDwgYXJnYykKKyAgICB7CisgICAgICBjb25zdCBjaGFyICphcmcgPSBhcmd2W2ldOworIAorICAgICAgaWYgKHN0cmNtcCAoYXJnLCAiLS1oZWxwIikgPT0gMCB8fAorICAgICAgICAgIHN0cmNtcCAoYXJnLCAiLWgiKSA9PSAwIHx8CisgICAgICAgICAgc3RyY21wIChhcmcsICItPyIpID09IDApCisgICAgICAgIHVzYWdlICgwKTsKKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAiLS1hdXRvLXN5bnRheCIpID09IDApCisgICAgICAgIGF1dG9fc2hlbGxfc3ludGF4ID0gVFJVRTsKKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAiLWMiKSA9PSAwIHx8CisgICAgICAgICAgICAgICBzdHJjbXAgKGFyZywgIi0tY3NoLXN5bnRheCIpID09IDApCisgICAgICAgIGNfc2hlbGxfc3ludGF4ID0gVFJVRTsKKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAiLXMiKSA9PSAwIHx8CisgICAgICAgICAgICAgICBzdHJjbXAgKGFyZywgIi0tc2gtc3ludGF4IikgPT0gMCkKKyAgICAgICAgYm91cm5lX3NoZWxsX3N5bnRheCA9IFRSVUU7CisgICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgIi0tYmluYXJ5LXN5bnRheCIpID09IDApCisgICAgICAgIGJpbmFyeV9zeW50YXggPSBUUlVFOworICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICItLXZlcnNpb24iKSA9PSAwKQorICAgICAgICB2ZXJzaW9uICgpOworICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICItLWV4aXQtd2l0aC1zZXNzaW9uIikgPT0gMCkKKyAgICAgICAgZXhpdF93aXRoX3Nlc3Npb24gPSBUUlVFOworICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICItLWV4aXQtd2l0aC14MTEiKSA9PSAwKQorICAgICAgICBleGl0X3dpdGhfeDExID0gVFJVRTsKKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAiLS1jbG9zZS1zdGRlcnIiKSA9PSAwKQorICAgICAgICBjbG9zZV9zdGRlcnIgPSBUUlVFOworICAgICAgZWxzZSBpZiAoc3Ryc3RyIChhcmcsICItLWF1dG9sYXVuY2g9IikgPT0gYXJnKQorICAgICAgICB7CisgICAgICAgICAgY29uc3QgY2hhciAqczsKKworICAgICAgICAgIGlmIChhdXRvbGF1bmNoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICItLWF1dG9sYXVuY2ggZ2l2ZW4gdHdpY2VcbiIpOworICAgICAgICAgICAgICBleGl0ICgxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgICAgICBhdXRvbGF1bmNoID0gVFJVRTsKKworICAgICAgICAgIHMgPSBzdHJjaHIgKGFyZywgJz0nKTsKKyAgICAgICAgICArK3M7CisKKyAgICAgICAgICBzYXZlX21hY2hpbmVfdXVpZCAocyk7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHByZXZfYXJnICYmCisgICAgICAgICAgICAgICBzdHJjbXAgKHByZXZfYXJnLCAiLS1hdXRvbGF1bmNoIikgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIGlmIChhdXRvbGF1bmNoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICItLWF1dG9sYXVuY2ggZ2l2ZW4gdHdpY2VcbiIpOworICAgICAgICAgICAgICBleGl0ICgxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgICAgICBhdXRvbGF1bmNoID0gVFJVRTsKKworICAgICAgICAgIHNhdmVfbWFjaGluZV91dWlkIChhcmcpOworCSAgcmVxdWlyZXNfYXJnID0gRkFMU0U7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAiLS1hdXRvbGF1bmNoIikgPT0gMCkKKwlyZXF1aXJlc19hcmcgPSBUUlVFOworICAgICAgZWxzZSBpZiAoc3Ryc3RyIChhcmcsICItLWNvbmZpZy1maWxlPSIpID09IGFyZykKKyAgICAgICAgeworICAgICAgICAgIGNvbnN0IGNoYXIgKmZpbGU7CisKKyAgICAgICAgICBpZiAoY29uZmlnX2ZpbGUgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiLS1jb25maWctZmlsZSBnaXZlbiB0d2ljZVxuIik7CisgICAgICAgICAgICAgIGV4aXQgKDEpOworICAgICAgICAgICAgfQorICAgICAgICAgIAorICAgICAgICAgIGZpbGUgPSBzdHJjaHIgKGFyZywgJz0nKTsKKyAgICAgICAgICArK2ZpbGU7CisKKyAgICAgICAgICBjb25maWdfZmlsZSA9IHhzdHJkdXAgKGZpbGUpOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChwcmV2X2FyZyAmJgorICAgICAgICAgICAgICAgc3RyY21wIChwcmV2X2FyZywgIi0tY29uZmlnLWZpbGUiKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGNvbmZpZ19maWxlICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIi0tY29uZmlnLWZpbGUgZ2l2ZW4gdHdpY2VcbiIpOworICAgICAgICAgICAgICBleGl0ICgxKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGNvbmZpZ19maWxlID0geHN0cmR1cCAoYXJnKTsKKwkgIHJlcXVpcmVzX2FyZyA9IEZBTFNFOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgIi0tY29uZmlnLWZpbGUiKSA9PSAwKQorCXJlcXVpcmVzX2FyZyA9IFRSVUU7CisgICAgICBlbHNlIGlmIChhcmdbMF0gPT0gJy0nKQorICAgICAgICB7CisgICAgICAgICAgaWYgKHN0cmNtcCAoYXJnLCAiLS0iKSAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJPcHRpb24gYCVzJyBpcyB1bmtub3duLlxuIiwgYXJnKTsKKyAgICAgICAgICAgICAgZXhpdCAoMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBydW5wcm9nID0gYXJndltpKzFdOworICAgICAgICAgICAgICByZW1haW5pbmdfYXJncyA9IGkrMjsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIGVsc2UKKwl7CisJICBydW5wcm9nID0gYXJnOworCSAgcmVtYWluaW5nX2FyZ3MgPSBpKzE7CisJICBicmVhazsKKwl9CisgICAgICAKKyAgICAgIHByZXZfYXJnID0gYXJnOworICAgICAgCisgICAgICArK2k7CisgICAgfQorICBpZiAocmVxdWlyZXNfYXJnKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIk9wdGlvbiBgJXMnIHJlcXVpcmVzIGFuIGFyZ3VtZW50LlxuIiwgcHJldl9hcmcpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIGlmIChhdXRvX3NoZWxsX3N5bnRheCkKKyAgICB7CisgICAgICBpZiAoKHNobmFtZSA9IGdldGVudiAoIlNIRUxMIikpICE9IE5VTEwpCisgICAgICAgeworICAgICAgICAgaWYgKCFzdHJuY21wIChzaG5hbWUgKyBzdHJsZW4gKHNobmFtZSkgLSAzLCAiY3NoIiwgMykpCisgICAgICAgICAgIGNfc2hlbGxfc3ludGF4ID0gVFJVRTsKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgYm91cm5lX3NoZWxsX3N5bnRheCA9IFRSVUU7CisgICAgICAgfQorICAgICAgZWxzZQorICAgICAgIGJvdXJuZV9zaGVsbF9zeW50YXggPSBUUlVFOworICAgIH0gIAorCisgIGlmIChleGl0X3dpdGhfc2Vzc2lvbikKKyAgICB2ZXJib3NlICgiLS1leGl0LXdpdGgtc2Vzc2lvbiBlbmFibGVkXG4iKTsKKworICBpZiAoZXhpdF93aXRoX3gxMSkKKyAgICB2ZXJib3NlICgiLS1leGl0LXdpdGgteDExIGVuYWJsZWRcbiIpOworCisgIGlmIChhdXRvbGF1bmNoKQorICAgIHsgICAgICAKKyNpZm5kZWYgREJVU19CVUlMRF9YMTEKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIkF1dG9sYXVuY2ggcmVxdWVzdGVkLCBidXQgWDExIHN1cHBvcnQgbm90IGNvbXBpbGVkIGluLlxuIgorCSAgICAgICAiQ2Fubm90IGNvbnRpbnVlLlxuIik7CisgICAgICBleGl0ICgxKTsKKyNlbHNlIC8qIERCVVNfQlVJTERfWDExICovCisjaWZuZGVmIERCVVNfRU5BQkxFX1gxMV9BVVRPTEFVTkNICisgICAgICBmcHJpbnRmIChzdGRlcnIsICJYMTEgYXV0b2xhdW5jaCBzdXBwb3J0IGRpc2FibGVkIGF0IGNvbXBpbGUgdGltZS5cbiIpOworICAgICAgZXhpdCAoMSk7CisjZWxzZSAvKiBEQlVTX0VOQUJMRV9YMTFfQVVUT0xBVU5DSCAqLworICAgICAgY2hhciAqYWRkcmVzczsKKyAgICAgIHBpZF90IHBpZDsKKyAgICAgIGxvbmcgd2lkOworICAgICAgCisgICAgICBpZiAoZ2V0X21hY2hpbmVfdXVpZCAoKSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiTWFjaGluZSBVVUlEIG5vdCBwcm92aWRlZCBhcyBhcmcgdG8gLS1hdXRvbGF1bmNoXG4iKTsKKyAgICAgICAgICBleGl0ICgxKTsKKyAgICAgICAgfQorCisgICAgICBpZiAoIV9kYnVzX3N0cmluZ19pbml0ICgmdXNlcl9idXMpKQorICAgICAgICB0b29sX29vbSAoImluaXRpYWxpemluZyIpOworCisgICAgICAvKiBJZiB3ZSBoYXZlIGFuIFhER19SVU5USU1FX0RJUiBhbmQgaXQgY29udGFpbnMgYSBzdWl0YWJsZSBzb2NrZXQsCisgICAgICAgKiBkYnVzLWxhdW5jaCAtLWF1dG9sYXVuY2ggY2FuIHVzZSBpdCwgc2luY2UgLS1hdXRvbGF1bmNoIGltcGxpZXMKKyAgICAgICAqICJJJ20gT0sgd2l0aCBnZXR0aW5nIGEgYnVzIHRoYXQgaXMgYWxyZWFkeSBhY3RpdmUiLgorICAgICAgICoKKyAgICAgICAqIChIb3dldmVyLCBwbGFpbiBkYnVzLWxhdW5jaCB3aXRob3V0IC0tYXV0b2xhdW5jaCBtdXN0IG5vdCBkbyBzbywKKyAgICAgICAqIGJlY2F1c2UgdGhhdCB3b3VsZCBicmVhayBsb3RzIG9mIHJlZ3Jlc3Npb24gdGVzdHMsIHdoaWNoIG9mdGVuCisgICAgICAgKiB1c2UgZGJ1cy1sYXVuY2ggaW5zdGVhZCBvZiB0aGUgbW9yZSBhcHByb3ByaWF0ZSBkYnVzLXJ1bi1zZXNzaW9uLikKKyAgICAgICAqCisgICAgICAgKiBBdCB0aGlzIHN0YWdlLCB3ZSBqdXN0IHNhdmUgdGhlIHVzZXIgYnVzJ3MgYWRkcmVzczsgbGF0ZXIgb24sIHRoZQorICAgICAgICogImJhYnlzaXR0ZXIiIHByb2Nlc3Mgd2lsbCBiZSBhdmFpbGFibGUgdG8gYWR2ZXJ0aXNlIHRoZSB1c2VyLWJ1cworICAgICAgICogb24gdGhlIFgxMSBkaXNwbGF5IGFuZCBpbiB+Ly5kYnVzL3Nlc3Npb24tYnVzLCBmb3IgZnVsbAorICAgICAgICogYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCisgICAgICAgKi8KKyAgICAgIGlmICghX2RidXNfbG9va3VwX3VzZXJfYnVzICgmdXNlcl9idXNfc3VwcG9ydGVkLCAmdXNlcl9idXMsICZlcnJvcikpCisgICAgICAgIHsKKyAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICIlc1xuIiwgZXJyb3IubWVzc2FnZSk7CisgICAgICAgICAgZXhpdCAoMSk7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHVzZXJfYnVzX3N1cHBvcnRlZCkKKyAgICAgICAgeworICAgICAgICAgIHZlcmJvc2UgKCI9PT0gVXNpbmcgZXhpc3RpbmcgdXNlciBidXMgXCIlc1wiXG4iLAorICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJnVzZXJfYnVzKSk7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIF9kYnVzX3N0cmluZ19mcmVlICgmdXNlcl9idXMpOworICAgICAgICB9CisKKyAgICAgIHZlcmJvc2UgKCJBdXRvbGF1bmNoIGVuYWJsZWQgKHVzaW5nIFgxMSkuXG4iKTsKKyAgICAgIGlmICghZXhpdF93aXRoX3gxMSkKKwl7CisgICAgICAgICAgdmVyYm9zZSAoIi0tZXhpdC13aXRoLXgxMSBhdXRvbWF0aWNhbGx5IGVuYWJsZWRcbiIpOworICAgICAgICAgIGV4aXRfd2l0aF94MTEgPSBUUlVFOworCX0KKworICAgICAgaWYgKCF4MTFfaW5pdCAoKSkKKwl7CisJICBmcHJpbnRmIChzdGRlcnIsICJBdXRvbGF1bmNoIGVycm9yOiBYMTEgaW5pdGlhbGl6YXRpb24gZmFpbGVkLlxuIik7CisJICBleGl0ICgxKTsKKwl9CisKKyAgICAgIGlmICgheDExX2dldF9hZGRyZXNzICgmYWRkcmVzcywgJnBpZCwgJndpZCkpCisJeworCSAgZnByaW50ZiAoc3RkZXJyLCAiQXV0b2xhdW5jaCBlcnJvcjogWDExIGNvbW11bmljYXRpb24gZXJyb3IuXG4iKTsKKwkgIGV4aXQgKDEpOworCX0KKworICAgICAgaWYgKGFkZHJlc3MgIT0gTlVMTCkKKwl7CisJICB2ZXJib3NlICgiZGJ1cy1kYWVtb24gaXMgYWxyZWFkeSBydW5uaW5nLiBSZXR1cm5pbmcgZXhpc3RpbmcgcGFyYW1ldGVycy5cbiIpOworCSAgcGFzc19pbmZvIChydW5wcm9nLCBhZGRyZXNzLCBwaWQsIHdpZCwgY19zaGVsbF9zeW50YXgsCisJCQkgICBib3VybmVfc2hlbGxfc3ludGF4LCBiaW5hcnlfc3ludGF4LCBhcmdjLCBhcmd2LCByZW1haW5pbmdfYXJncyk7CisJICBleGl0ICgwKTsKKwl9CisjZW5kaWYgLyogREJVU19FTkFCTEVfWDExX0FVVE9MQVVOQ0ggKi8KKyNlbmRpZiAvKiBEQlVTX0JVSUxEX1gxMSAqLworICAgIH0KKyAgZWxzZSBpZiAoZXhpdF93aXRoX3gxMSkKKyAgICB7CisjaWZuZGVmIERCVVNfQlVJTERfWDExCisgICAgICBmcHJpbnRmIChzdGRlcnIsICJTZXNzaW9uIGxpZmV0aW1lIGJhc2VkIG9uIFgxMSByZXF1ZXN0ZWQsIGJ1dCBYMTEgc3VwcG9ydCBub3QgY29tcGlsZWQgaW4uXG4iKTsKKyAgICAgIGV4aXQgKDEpOworI2Vsc2UgLyogREJVU19CVUlMRF9YMTEgKi8KKyAgICAgIGlmICghcmVhZF9tYWNoaW5lX3V1aWRfaWZfbmVlZGVkICgmZXJyb3IpKQorICAgICAgICB7CisgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiU2Vzc2lvbiBsaWZldGltZSBiYXNlZCBvbiBYMTEgcmVxdWVzdGVkLCBidXQgbWFjaGluZSBVVUlEIHVuYXZhaWxhYmxlOiAlcy5cbiIsIGVycm9yLm1lc3NhZ2UpOworICAgICAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgICAgICBleGl0ICgxKTsKKyAgICAgICAgfQorCisgICAgICBpZiAoIXgxMV9pbml0ICgpKQorICAgICAgICB7CisgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiU2Vzc2lvbiBsaWZldGltZSBiYXNlZCBvbiBYMTEgcmVxdWVzdGVkLCBidXQgWDExIGluaXRpYWxpemF0aW9uIGZhaWxlZC5cbiIpOworICAgICAgICAgIGV4aXQgKDEpOworICAgICAgICB9CisjZW5kaWYgLyogREJVU19CVUlMRF9YMTEgKi8KKyAgICB9CisjaWZkZWYgREJVU19CVUlMRF9YMTEKKyAgZWxzZSBpZiAocmVhZF9tYWNoaW5lX3V1aWRfaWZfbmVlZGVkICgmZXJyb3IpKQorICAgIHsKKyAgICAgIHgxMV9pbml0KCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogU3Vydml2ZSB0aGlzIG1pc2NvbmZpZ3VyYXRpb24sIGJ1dCBjb21wbGFpbiBhYm91dCBpdC4gKi8KKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzXG4iLCBlcnJvci5tZXNzYWdlKTsKKyAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICB9CisjZW5kaWYgLyogREJVU19CVUlMRF9YMTEgKi8KKworCisgIGlmIChwaXBlIChidXNfcGlkX3RvX2xhdW5jaGVyX3BpcGUpIDwgMCB8fAorICAgICAgcGlwZSAoYnVzX2FkZHJlc3NfdG9fbGF1bmNoZXJfcGlwZSkgPCAwIHx8CisgICAgICBwaXBlIChidXNfcGlkX3RvX2JhYnlzaXR0ZXJfcGlwZSkgPCAwKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwKKyAgICAgICAgICAgICAgICJGYWlsZWQgdG8gY3JlYXRlIHBpcGU6ICVzXG4iLAorICAgICAgICAgICAgICAgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgcmV0ID0gZm9yayAoKTsKKyAgaWYgKHJldCA8IDApCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiRmFpbGVkIHRvIGZvcms6ICVzXG4iLAorICAgICAgICAgICAgICAgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgaWYgKHJldCA9PSAwKQorICAgIHsKKyAgICAgIC8qIENoaWxkICovCisjZGVmaW5lIE1BWF9GRF9MRU4gNjQKKyAgICAgIGNoYXIgd3JpdGVfcGlkX2ZkX2FzX3N0cmluZ1tNQVhfRkRfTEVOXTsKKyAgICAgIGNoYXIgd3JpdGVfYWRkcmVzc19mZF9hc19zdHJpbmdbTUFYX0ZEX0xFTl07CisKKyNpZmRlZiBEQlVTX0JVSUxEX1gxMQorICAgICAgeGRpc3BsYXkgPSBOVUxMOworI2VuZGlmCisKKyAgICAgIGlmIChjbG9zZV9zdGRlcnIpCisJZG9fY2xvc2Vfc3RkZXJyICgpOworCisgICAgICB2ZXJib3NlICgiPT09IEJhYnlzaXR0ZXIncyBpbnRlcm1lZGlhdGUgcGFyZW50IGNyZWF0ZWRcbiIpOworCisgICAgICAvKiBGb3JrIG9uY2UgbW9yZSB0byBjcmVhdGUgYmFieXNpdHRlciAqLworICAgICAgCisgICAgICByZXQgPSBmb3JrICgpOworICAgICAgaWYgKHJldCA8IDApCisgICAgICAgIHsKKyAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJGYWlsZWQgdG8gZm9yazogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICAgICAgZXhpdCAoMSk7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgaWYgKHJldCA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAvKiBJbiBiYWJ5c2l0dGVyICovCisgICAgICAgICAgdmVyYm9zZSAoIj09PSBCYWJ5c2l0dGVyJ3MgaW50ZXJtZWRpYXRlIHBhcmVudCBjb250aW51ZXNcbiIpOworICAgICAgICAgIAorICAgICAgICAgIGNsb3NlIChidXNfcGlkX3RvX2xhdW5jaGVyX3BpcGVbUkVBRF9FTkRdKTsKKwkgIGNsb3NlIChidXNfcGlkX3RvX2xhdW5jaGVyX3BpcGVbV1JJVEVfRU5EXSk7CisgICAgICAgICAgY2xvc2UgKGJ1c19hZGRyZXNzX3RvX2xhdW5jaGVyX3BpcGVbUkVBRF9FTkRdKTsKKyAgICAgICAgICBjbG9zZSAoYnVzX2FkZHJlc3NfdG9fbGF1bmNoZXJfcGlwZVtXUklURV9FTkRdKTsKKyAgICAgICAgICBjbG9zZSAoYnVzX3BpZF90b19iYWJ5c2l0dGVyX3BpcGVbV1JJVEVfRU5EXSk7CisKKyAgICAgICAgICAvKiBiYWJ5c2l0KCkgd2lsbCBmb3JrICphZ2FpbioKKyAgICAgICAgICAgKiBhbmQgd2lsbCBhbHNvIHJlYXAgdGhlIHByZS1mb3JrZWQgYnVzCisgICAgICAgICAgICogZGFlbW9uCisgICAgICAgICAgICovCisgICAgICAgICAgYmFieXNpdCAoZXhpdF93aXRoX3Nlc3Npb24gfHwgZXhpdF93aXRoX3gxMSwgcmV0LAorICAgICAgICAgICAgICAgICAgIGJ1c19waWRfdG9fYmFieXNpdHRlcl9waXBlW1JFQURfRU5EXSk7CisgICAgICAgICAgZXhpdCAoMCk7CisgICAgICAgIH0KKworICAgICAgdmVyYm9zZSAoIj09PSBCdXMgZXhlYyBwcm9jZXNzIGNyZWF0ZWRcbiIpOworICAgICAgCisgICAgICAvKiBOb3cgd2UgYXJlIHRoZSBidXMgcHJvY2VzcyAod2VsbCwgYWxtb3N0OworICAgICAgICogZGJ1cy1kYWVtb24gaXRzZWxmIGZvcmtzIGFnYWluKQorICAgICAgICovCisgICAgICBjbG9zZSAoYnVzX3BpZF90b19sYXVuY2hlcl9waXBlW1JFQURfRU5EXSk7CisgICAgICBjbG9zZSAoYnVzX2FkZHJlc3NfdG9fbGF1bmNoZXJfcGlwZVtSRUFEX0VORF0pOworICAgICAgY2xvc2UgKGJ1c19waWRfdG9fYmFieXNpdHRlcl9waXBlW1JFQURfRU5EXSk7CisgICAgICBjbG9zZSAoYnVzX3BpZF90b19iYWJ5c2l0dGVyX3BpcGVbV1JJVEVfRU5EXSk7CisKKyAgICAgIC8qIElmIHdlIGhhdmUgYSB1c2VyIGJ1cyBhbmQgd2FudCB0byB1c2UgaXQsIGRvIHNvIGluc3RlYWQgb2YKKyAgICAgICAqIGV4ZWMnaW5nIGEgbmV3IGRidXMtZGFlbW9uLiAqLworICAgICAgaWYgKGF1dG9sYXVuY2ggJiYgdXNlcl9idXNfc3VwcG9ydGVkKQorICAgICAgICB7CisgICAgICAgICAgZG9fd3JpdGUgKGJ1c19waWRfdG9fbGF1bmNoZXJfcGlwZVtXUklURV9FTkRdLCAiMFxuIiwgMik7CisgICAgICAgICAgY2xvc2UgKGJ1c19waWRfdG9fbGF1bmNoZXJfcGlwZVtXUklURV9FTkRdKTsKKworICAgICAgICAgIGRvX3dyaXRlIChidXNfYWRkcmVzc190b19sYXVuY2hlcl9waXBlW1dSSVRFX0VORF0sCisgICAgICAgICAgICAgICAgICAgIF9kYnVzX3N0cmluZ19nZXRfY29uc3RfZGF0YSAoJnVzZXJfYnVzKSwKKyAgICAgICAgICAgICAgICAgICAgX2RidXNfc3RyaW5nX2dldF9sZW5ndGggKCZ1c2VyX2J1cykpOworICAgICAgICAgIGRvX3dyaXRlIChidXNfYWRkcmVzc190b19sYXVuY2hlcl9waXBlW1dSSVRFX0VORF0sICJcbiIsIDEpOworICAgICAgICAgIGNsb3NlIChidXNfYWRkcmVzc190b19sYXVuY2hlcl9waXBlW1dSSVRFX0VORF0pOworCisgICAgICAgICAgZXhpdCAoMCk7CisgICAgICAgIH0KKworICAgICAgc3ByaW50ZiAod3JpdGVfcGlkX2ZkX2FzX3N0cmluZywKKyAgICAgICAgICAgICAgICIlZCIsIGJ1c19waWRfdG9fbGF1bmNoZXJfcGlwZVtXUklURV9FTkRdKTsKKworICAgICAgc3ByaW50ZiAod3JpdGVfYWRkcmVzc19mZF9hc19zdHJpbmcsCisgICAgICAgICAgICAgICAiJWQiLCBidXNfYWRkcmVzc190b19sYXVuY2hlcl9waXBlW1dSSVRFX0VORF0pOworCisgICAgICB2ZXJib3NlICgiQ2FsbGluZyBleGVjKClcbiIpOworIAorI2lmZGVmIERCVVNfRU5BQkxFX0VNQkVEREVEX1RFU1RTCisgICAgICB7CisgICAgICAgIC8qIGV4ZWMgZnJvbSB0ZXN0ZGlyICovCisgICAgICAgIGNvbnN0IGNoYXIgKnRlc3RfZGFlbW9uID0gZ2V0ZW52ICgiREJVU19URVNUX0RBRU1PTiIpOworCisgICAgICAgIGlmICh0ZXN0X2RhZW1vbiAhPSBOVUxMKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjb25maWdfZmlsZSA9PSBOVUxMICYmIGdldGVudiAoIkRCVVNfVEVTVF9EQVRBIikgIT0gTlVMTCkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbmZpZ19maWxlID0gY29uY2F0MiAoZ2V0ZW52ICgiREJVU19URVNUX0RBVEEiKSwKKyAgICAgICAgICAgICAgICAgICAgIi92YWxpZC1jb25maWctZmlsZXMvc2Vzc2lvbi5jb25mIik7CisKKyAgICAgICAgICAgICAgICBpZiAoY29uZmlnX2ZpbGUgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiT3V0IG9mIG1lbW9yeVxuIik7CisgICAgICAgICAgICAgICAgICAgIGV4aXQgKDEpOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGV4ZWNsICh0ZXN0X2RhZW1vbiwKKyAgICAgICAgICAgICAgICAgICB0ZXN0X2RhZW1vbiwKKyAgICAgICAgICAgICAgICAgICBjbG9zZV9zdGRlcnIgPyAiLS1zeXNsb2ctb25seSIgOiAiLS1zeXNsb2ciLAorICAgICAgICAgICAgICAgICAgICItLWZvcmsiLAorICAgICAgICAgICAgICAgICAgICItLXByaW50LXBpZCIsIHdyaXRlX3BpZF9mZF9hc19zdHJpbmcsCisgICAgICAgICAgICAgICAgICAgIi0tcHJpbnQtYWRkcmVzcyIsIHdyaXRlX2FkZHJlc3NfZmRfYXNfc3RyaW5nLAorICAgICAgICAgICAgICAgICAgIGNvbmZpZ19maWxlID8gIi0tY29uZmlnLWZpbGUiIDogIi0tc2Vzc2lvbiIsCisgICAgICAgICAgICAgICAgICAgY29uZmlnX2ZpbGUsIC8qIGhhcyB0byBiZSBsYXN0IGluIHRoaXMgdmFyYXJncyBsaXN0ICovCisgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwKKyAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZXhlY3V0ZSB0ZXN0IG1lc3NhZ2UgYnVzIGRhZW1vbiAlczogJXMuXG4iLAorICAgICAgICAgICAgICAgICAgICAgdGVzdF9kYWVtb24sIHN0cmVycm9yIChlcnJubykpOworICAgICAgICAgICAgZXhpdCAoMSk7CisgICAgICAgICAgfQorICAgICAgfQorICNlbmRpZiAvKiBEQlVTX0VOQUJMRV9FTUJFRERFRF9URVNUUyAqLworCisgICAgICBleGVjbCAoREJVU19EQUVNT05ESVIiL2RidXMtZGFlbW9uIiwKKyAgICAgICAgICAgICBEQlVTX0RBRU1PTkRJUiIvZGJ1cy1kYWVtb24iLAorICAgICAgICAgICAgIGNsb3NlX3N0ZGVyciA/ICItLXN5c2xvZy1vbmx5IiA6ICItLXN5c2xvZyIsCisgICAgICAgICAgICAgIi0tZm9yayIsCisgICAgICAgICAgICAgIi0tcHJpbnQtcGlkIiwgd3JpdGVfcGlkX2ZkX2FzX3N0cmluZywKKyAgICAgICAgICAgICAiLS1wcmludC1hZGRyZXNzIiwgd3JpdGVfYWRkcmVzc19mZF9hc19zdHJpbmcsCisgICAgICAgICAgICAgY29uZmlnX2ZpbGUgPyAiLS1jb25maWctZmlsZSIgOiAiLS1zZXNzaW9uIiwKKyAgICAgICAgICAgICBjb25maWdfZmlsZSwgLyogaGFzIHRvIGJlIGxhc3QgaW4gdGhpcyB2YXJhcmdzIGxpc3QgKi8KKyAgICAgICAgICAgICBOVUxMKTsKKworICAgICAgZnByaW50ZiAoc3RkZXJyLAorICAgICAgICAgICAgICAgIkZhaWxlZCB0byBleGVjdXRlIG1lc3NhZ2UgYnVzIGRhZW1vbiAlczogJXMuICBXaWxsIHRyeSBhZ2FpbiB3aXRob3V0IGZ1bGwgcGF0aC5cbiIsCisgICAgICAgICAgICAgICBEQlVTX0RBRU1PTkRJUiIvZGJ1cy1kYWVtb24iLCBzdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIAorICAgICAgLyoKKyAgICAgICAqIElmIGl0IGZhaWxlZCwgdHJ5IHJ1bm5pbmcgd2l0aG91dCBmdWxsIFBBVEguICBOb3RlIHRoaXMgaXMgbmVlZGVkCisgICAgICAgKiBiZWNhdXNlIHRoZSBidWlsZCBwcm9jZXNzIGJ1aWxkcyB0aGUgcnVuLXdpdGgtdG1wLXNlc3Npb24tYnVzLmNvbmYKKyAgICAgICAqIGZpbGUgYW5kIHRoZSBkYnVzLWRhZW1vbiB3aWxsIG5vdCBiZSBpbiB0aGUgaW5zdGFsbCBsb2NhdGlvbiBkdXJpbmcKKyAgICAgICAqIGJ1aWxkIHRpbWUuCisgICAgICAgKi8KKyAgICAgIGV4ZWNscCAoImRidXMtZGFlbW9uIiwKKyAgICAgICAgICAgICAgImRidXMtZGFlbW9uIiwKKyAgICAgICAgICAgICAgY2xvc2Vfc3RkZXJyID8gIi0tc3lzbG9nLW9ubHkiIDogIi0tc3lzbG9nIiwKKyAgICAgICAgICAgICAgIi0tZm9yayIsCisgICAgICAgICAgICAgICItLXByaW50LXBpZCIsIHdyaXRlX3BpZF9mZF9hc19zdHJpbmcsCisgICAgICAgICAgICAgICItLXByaW50LWFkZHJlc3MiLCB3cml0ZV9hZGRyZXNzX2ZkX2FzX3N0cmluZywKKyAgICAgICAgICAgICAgY29uZmlnX2ZpbGUgPyAiLS1jb25maWctZmlsZSIgOiAiLS1zZXNzaW9uIiwKKyAgICAgICAgICAgICAgY29uZmlnX2ZpbGUsIC8qIGhhcyB0byBiZSBsYXN0IGluIHRoaXMgdmFyYXJncyBsaXN0ICovCisgICAgICAgICAgICAgIE5VTEwpOworCisgICAgICBmcHJpbnRmIChzdGRlcnIsCisgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGV4ZWN1dGUgbWVzc2FnZSBidXMgZGFlbW9uOiAlc1xuIiwKKyAgICAgICAgICAgICAgIHN0cmVycm9yIChlcnJubykpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogUGFyZW50ICovCisjZGVmaW5lIE1BWF9QSURfTEVOIDY0CisgICAgICBwaWRfdCBidXNfcGlkOyAgCisgICAgICBjaGFyIGJ1c19hZGRyZXNzW01BWF9BRERSX0xFTl07CisgICAgICBjaGFyIGJ1ZltNQVhfUElEX0xFTl07CisgICAgICBjaGFyICplbmQ7CisgICAgICBsb25nIHdpZCA9IDA7CisgICAgICBsb25nIHZhbDsKKworICAgICAgdmVyYm9zZSAoIj09PSBQYXJlbnQgZGJ1cy1sYXVuY2ggY29udGludWVzXG4iKTsKKyAgICAgIAorICAgICAgY2xvc2UgKGJ1c19waWRfdG9fbGF1bmNoZXJfcGlwZVtXUklURV9FTkRdKTsKKyAgICAgIGNsb3NlIChidXNfYWRkcmVzc190b19sYXVuY2hlcl9waXBlW1dSSVRFX0VORF0pOworICAgICAgY2xvc2UgKGJ1c19waWRfdG9fYmFieXNpdHRlcl9waXBlW1JFQURfRU5EXSk7CisKKyAgICAgIHZlcmJvc2UgKCJXYWl0aW5nIGZvciBiYWJ5c2l0dGVyJ3MgaW50ZXJtZWRpYXRlIHBhcmVudFxuIik7CisgICAgICAKKyAgICAgIC8qIEltbWVkaWF0ZWx5IHJlYXAgcGFyZW50IG9mIGJhYnlzaXR0ZXIKKyAgICAgICAqICh3aGljaCB3YXMgY3JlYXRlZCBqdXN0IGZvciB1cyB0byByZWFwKQorICAgICAgICovCisgICAgICBpZiAoZG9fd2FpdHBpZCAocmV0KSA8IDApCisgICAgICAgIHsKKyAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJGYWlsZWQgdG8gd2FpdHBpZCgpIGZvciBiYWJ5c2l0dGVyIGludGVybWVkaWF0ZSBwcm9jZXNzOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICBzdHJlcnJvciAoZXJybm8pKTsKKyAgICAgICAgICBleGl0ICgxKTsKKyAgICAgICAgfQorCisgICAgICB2ZXJib3NlICgiUmVhZGluZyBhZGRyZXNzIGZyb20gYnVzXG4iKTsKKyAgICAgIAorICAgICAgLyogUmVhZCB0aGUgcGlwZSBkYXRhLCBwcmludCwgYW5kIGV4aXQgKi8KKyAgICAgIHN3aXRjaCAocmVhZF9saW5lIChidXNfYWRkcmVzc190b19sYXVuY2hlcl9waXBlW1JFQURfRU5EXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBidXNfYWRkcmVzcywgTUFYX0FERFJfTEVOKSkKKyAgICAgICAgeworICAgICAgICBjYXNlIFJFQURfU1RBVFVTX09LOgorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJFQURfU1RBVFVTX0VPRjoKKyAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJFT0YgaW4gZGJ1cy1sYXVuY2ggcmVhZGluZyBhZGRyZXNzIGZyb20gYnVzIGRhZW1vblxuIik7CisgICAgICAgICAgZXhpdCAoMSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUkVBRF9TVEFUVVNfRVJST1I6CisgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3IgaW4gZGJ1cy1sYXVuY2ggcmVhZGluZyBhZGRyZXNzIGZyb20gYnVzIGRhZW1vbjogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICAgICAgZXhpdCAoMSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiSW52YWxpZCByZWFkIHJlc3VsdCIpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgY2xvc2UgKGJ1c19hZGRyZXNzX3RvX2xhdW5jaGVyX3BpcGVbUkVBRF9FTkRdKTsKKworICAgICAgdmVyYm9zZSAoIlJlYWRpbmcgUElEIGZyb20gZGFlbW9uXG4iKTsKKyAgICAgIC8qIE5vdyByZWFkIGRhdGEgKi8KKyAgICAgIHN3aXRjaCAocmVhZF9saW5lIChidXNfcGlkX3RvX2xhdW5jaGVyX3BpcGVbUkVBRF9FTkRdLCBidWYsIE1BWF9QSURfTEVOKSkKKwl7CisJY2FzZSBSRUFEX1NUQVRVU19PSzoKKwkgIGJyZWFrOworCWNhc2UgUkVBRF9TVEFUVVNfRU9GOgorCSAgZnByaW50ZiAoc3RkZXJyLCAiRU9GIHJlYWRpbmcgUElEIGZyb20gYnVzIGRhZW1vblxuIik7CisJICBleGl0ICgxKTsKKwkgIGJyZWFrOworCWNhc2UgUkVBRF9TVEFUVVNfRVJST1I6CisJICBmcHJpbnRmIChzdGRlcnIsICJFcnJvciByZWFkaW5nIFBJRCBmcm9tIGJ1cyBkYWVtb246ICVzXG4iLAorCQkgICBzdHJlcnJvciAoZXJybm8pKTsKKwkgIGV4aXQgKDEpOworCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIF9kYnVzX2Fzc2VydF9ub3RfcmVhY2hlZCAoIkludmFsaWQgcmVhZCByZXN1bHQiKTsKKwl9CisKKyAgICAgIGVuZCA9IE5VTEw7CisgICAgICB2YWwgPSBzdHJ0b2wgKGJ1ZiwgJmVuZCwgMCk7CisgICAgICBpZiAoYnVmID09IGVuZCB8fCBlbmQgPT0gTlVMTCkKKwl7CisJICBmcHJpbnRmIChzdGRlcnIsICJGYWlsZWQgdG8gcGFyc2UgYnVzIFBJRCBcIiVzXCI6ICVzXG4iLAorCQkgICBidWYsIHN0cmVycm9yIChlcnJubykpOworCSAgZXhpdCAoMSk7CisJfQorCisgICAgICBidXNfcGlkID0gdmFsOworCisgICAgICAvKiBIYXZlIHRvIGluaXRpYWxpemUgYnVzX3BpZF90b19raWxsIEFTQVAsIHNvIHRoYXQgdGhlCisgICAgICAgICBYIGVycm9yIGNhbGxiYWNrIGNhbiBraWxsIGl0IGlmIGFuIGVycm9yIGhhcHBlbnMuICovCisgICAgICBidXNfcGlkX3RvX2tpbGwgPSBidXNfcGlkOworCisgICAgICBjbG9zZSAoYnVzX3BpZF90b19sYXVuY2hlcl9waXBlW1JFQURfRU5EXSk7CisKKyNpZmRlZiBEQlVTX0VOQUJMRV9YMTFfQVVUT0xBVU5DSAorICAgICAgaWYgKHhkaXNwbGF5ICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBpbnQgcmV0MjsKKworICAgICAgICAgIHZlcmJvc2UoIlNhdmluZyB4MTEgYWRkcmVzc1xuIik7CisgICAgICAgICAgcmV0MiA9IHgxMV9zYXZlX2FkZHJlc3MgKGJ1c19hZGRyZXNzLCBidXNfcGlkLCAmd2lkKTsKKyAgICAgICAgICAvKiBPbmx5IGdldCBhbiBleGlzdGluZyBkYnVzIHNlc3Npb24gd2hlbiBhdXRvbGF1bmNoaW5nICovCisgICAgICAgICAgaWYgKGF1dG9sYXVuY2gpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmIChyZXQyID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgY2hhciAqYWRkcmVzcyA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAvKiBhbm90aGVyIHdpbmRvdyBnb3QgYWRkZWQuIFJldHVybiBpdHMgYWRkcmVzcyAqLworICAgICAgICAgICAgICAgICAgaWYgKHgxMV9nZXRfYWRkcmVzcyAoJmFkZHJlc3MsICZidXNfcGlkLCAmd2lkKQorICAgICAgICAgICAgICAgICAgICAgICAmJiBhZGRyZXNzICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICB2ZXJib3NlICgiZGJ1cy1kYWVtb24gaXMgYWxyZWFkeSBydW5uaW5nLiBSZXR1cm5pbmcgZXhpc3RpbmcgcGFyYW1ldGVycy5cbiIpOworICAgICAgICAgICAgICAgICAgICAgIC8qIEtpbGwgdGhlIG9sZCBidXMgKi8KKyAgICAgICAgICAgICAgICAgICAgICBraWxsX2J1cygpOworICAgICAgICAgICAgICAgICAgICAgIHBhc3NfaW5mbyAocnVucHJvZywgYWRkcmVzcywgYnVzX3BpZCwgd2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNfc2hlbGxfc3ludGF4LCBib3VybmVfc2hlbGxfc3ludGF4LCBiaW5hcnlfc3ludGF4LAorICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ2MsIGFyZ3YsIHJlbWFpbmluZ19hcmdzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBpZiAocmV0MiA8IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3Igc2F2aW5nIGJ1cyBpbmZvcm1hdGlvbi5cbiIpOworICAgICAgICAgICAgICAgICAgYnVzX3BpZF90b19raWxsID0gYnVzX3BpZDsKKyAgICAgICAgICAgICAgICAgIGtpbGxfYnVzX2FuZF9leGl0ICgxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAvKiBGb3J3YXJkIHRoZSBwaWQgdG8gdGhlIGJhYnlzaXR0ZXIgKi8KKyAgICAgIHdyaXRlX3BpZCAoYnVzX3BpZF90b19iYWJ5c2l0dGVyX3BpcGVbV1JJVEVfRU5EXSwgYnVzX3BpZCk7CisgICAgICBjbG9zZSAoYnVzX3BpZF90b19iYWJ5c2l0dGVyX3BpcGVbV1JJVEVfRU5EXSk7CisKKyAgICAgICBwYXNzX2luZm8gKHJ1bnByb2csIGJ1c19hZGRyZXNzLCBidXNfcGlkLCB3aWQsIGNfc2hlbGxfc3ludGF4LAorICAgICAgICAgICAgICBib3VybmVfc2hlbGxfc3ludGF4LCBiaW5hcnlfc3ludGF4LCBhcmdjLCBhcmd2LCByZW1haW5pbmdfYXJncyk7CisgICAgfQorCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZGJ1cy1sYXVuY2guaCBiL3Rvb2xzL2RidXMtbGF1bmNoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY1OTZkMgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2RidXMtbGF1bmNoLmgKQEAgLTAsMCArMSw1OSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLWxhdW5jaC5oICBkYnVzLWxhdW5jaCB1dGlsaXR5CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2IFRoaWFnbyBNYWNpZWlyYSA8dGhpYWdvQGtkZS5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpZm5kZWYgREJVU19MQVVOQ0hfSAorI2RlZmluZSBEQlVTX0xBVU5DSF9ICisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPGRidXMvZGJ1cy5oPgorCisjaWZuZGVmIFRSVUUKKyNkZWZpbmUgVFJVRSAoMSkKKyNlbmRpZgorCisjaWZuZGVmIEZBTFNFCisjZGVmaW5lIEZBTFNFICgwKQorI2VuZGlmCisKKyN1bmRlZiAgTUFYCisjZGVmaW5lIE1BWChhLCBiKSAgKCgoYSkgPiAoYikpID8gKGEpIDogKGIpKQorCisjZGVmaW5lIE1BWF9BRERSX0xFTiA1MTIKKworLyogZGVmaW5lZCBpbiBkYnVzLWxhdW5jaC5jICovCit2b2lkIHZlcmJvc2UgKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKSBfREJVU19HTlVDX1BSSU5URiAoMSwgMik7CitjaGFyICp4c3RyZHVwIChjb25zdCBjaGFyICpzdHIpOwordm9pZCBraWxsX2J1c19hbmRfZXhpdCAoaW50IGV4aXRjb2RlKSBfREJVU19HTlVDX05PUkVUVVJOOworCitjb25zdCBjaGFyKiBnZXRfbWFjaGluZV91dWlkICh2b2lkKTsKKworI2lmZGVmIERCVVNfQlVJTERfWDExCisvKiBkZWZpbmVkIGluIGRidXMtbGF1bmNoLXgxMS5jICovCitpbnQgeDExX2luaXQgKHZvaWQpOworaW50IHgxMV9nZXRfYWRkcmVzcyAoY2hhciAqKnBhZGRyZXNzLCBwaWRfdCAqcGlkLCBsb25nICp3aWQpOworaW50IHgxMV9zYXZlX2FkZHJlc3MgKGNoYXIgKmFkZHJlc3MsIHBpZF90IHBpZCwgbG9uZyAqd2lkKTsKK3ZvaWQgeDExX2hhbmRsZV9ldmVudCAodm9pZCk7CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS90b29scy9kYnVzLW1vbml0b3IuYyBiL3Rvb2xzL2RidXMtbW9uaXRvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2ZjM2ZDUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9kYnVzLW1vbml0b3IuYwpAQCAtMCwwICsxLDYwMyBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLW1vbml0b3IuYyAgVXRpbGl0eSBwcm9ncmFtIHRvIG1vbml0b3IgbWVzc2FnZXMgb24gdGhlIGJ1cworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBQaGlsaXAgQmx1bmRlbGwgPHBoaWxiQGdudS5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKworI2luY2x1ZGUgImRidXMvZGJ1cy1pbnRlcm5hbHMuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpZmRlZiBEQlVTX1dJTgorI2luY2x1ZGUgPHdpbnNvY2syLmg+CisjdW5kZWYgaW50ZXJmYWNlCisjZWxzZQorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHRpbWUuaD4KKworI2luY2x1ZGUgImRidXMtcHJpbnQtbWVzc2FnZS5oIgorI2luY2x1ZGUgInRvb2wtY29tbW9uLmgiCisKKyNkZWZpbmUgRUFWRVNEUk9QUElOR19SVUxFICJlYXZlc2Ryb3A9dHJ1ZSIKKworI2lmbmRlZiBTVERPVVRfRklMRU5PCisjZGVmaW5lIFNURE9VVF9GSUxFTk8gMQorI2VuZGlmCisKKy8qIGh0dHA6Ly93d3cudGNwZHVtcC5vcmcvbGlua3R5cGVzLmh0bWwgKi8KKyNkZWZpbmUgTElOS1RZUEVfREJVUyAyMzEKKworc3RhdGljIERCdXNIYW5kbGVyUmVzdWx0Cittb25pdG9yX2ZpbHRlcl9mdW5jIChEQnVzQ29ubmVjdGlvbiAgICAgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICBEQnVzTWVzc2FnZSAgICAgICAgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgKnVzZXJfZGF0YSkKK3sKKyAgbG9uZyBzZWMgPSAwLCB1c2VjID0gMDsKKworICBfZGJ1c19nZXRfcmVhbF90aW1lICgmc2VjLCAmdXNlYyk7CisKKyAgcHJpbnRfbWVzc2FnZSAobWVzc2FnZSwgRkFMU0UsIHNlYywgdXNlYyk7CisgIAorICBpZiAoZGJ1c19tZXNzYWdlX2lzX3NpZ25hbCAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfSU5URVJGQUNFX0xPQ0FMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRpc2Nvbm5lY3RlZCIpKQorICAgIGV4aXQgKDApOworCisgIC8qIE1vbml0b3JzIG11c3Qgbm90IGFsbG93IGxpYmRidXMgdG8gcmVwbHkgdG8gbWVzc2FnZXMsIHNvIHdlIGVhdAorICAgKiB0aGUgbWVzc2FnZS4gU2VlIGJ1ZyAxNzE5LgorICAgKi8KKyAgcmV0dXJuIERCVVNfSEFORExFUl9SRVNVTFRfSEFORExFRDsKK30KKworI2RlZmluZSBUUkFQX05VTExfU1RSSU5HKHN0cikgKChzdHIpID8gKHN0cikgOiAiPG5vbmU+IikKKwordHlwZWRlZiBlbnVtCit7CisgIFBST0ZJTEVfQVRUUklCVVRFX0ZMQUdfU0VSSUFMID0gMSwKKyAgUFJPRklMRV9BVFRSSUJVVEVfRkxBR19SRVBMWV9TRVJJQUwgPSAyLAorICBQUk9GSUxFX0FUVFJJQlVURV9GTEFHX1NFTkRFUiA9IDQsCisgIFBST0ZJTEVfQVRUUklCVVRFX0ZMQUdfREVTVElOQVRJT04gPSA4LAorICBQUk9GSUxFX0FUVFJJQlVURV9GTEFHX1BBVEggPSAxNiwKKyAgUFJPRklMRV9BVFRSSUJVVEVfRkxBR19JTlRFUkZBQ0UgPSAzMiwKKyAgUFJPRklMRV9BVFRSSUJVVEVfRkxBR19NRU1CRVIgPSA2NCwKKyAgUFJPRklMRV9BVFRSSUJVVEVfRkxBR19FUlJPUl9OQU1FID0gMTI4Cit9IFByb2ZpbGVBdHRyaWJ1dGVGbGFnczsKKworc3RhdGljIHZvaWQKK3Byb2ZpbGVfcHJpbnRfaGVhZGVycyAodm9pZCkKK3sKKyAgcHJpbnRmICgiI3R5cGVcdHRpbWVzdGFtcFx0c2VyaWFsXHRzZW5kZXJcdGRlc3RpbmF0aW9uXHRwYXRoXHRpbnRlcmZhY2VcdG1lbWJlclxuIik7CisgIHByaW50ZiAoIiNcdFx0XHRcdFx0aW5fcmVwbHlfdG9cbiIpOworfQorCitzdGF0aWMgdm9pZAorcHJvZmlsZV9wcmludF93aXRoX2F0dHJzIChjb25zdCBjaGFyICp0eXBlLCBEQnVzTWVzc2FnZSAqbWVzc2FnZSwKKyAgbG9uZyBzZWMsIGxvbmcgdXNlYywgUHJvZmlsZUF0dHJpYnV0ZUZsYWdzIGF0dHJzKQoreworICBwcmludGYgKCIlc1x0JWxkLiUwNmxkIiwgdHlwZSwgc2VjLCB1c2VjKTsKKworICBpZiAoYXR0cnMgJiBQUk9GSUxFX0FUVFJJQlVURV9GTEFHX1NFUklBTCkKKyAgICBwcmludGYgKCJcdCV1IiwgZGJ1c19tZXNzYWdlX2dldF9zZXJpYWwgKG1lc3NhZ2UpKTsKKworICBpZiAoYXR0cnMgJiBQUk9GSUxFX0FUVFJJQlVURV9GTEFHX1NFTkRFUikKKyAgICBwcmludGYgKCJcdCVzIiwgVFJBUF9OVUxMX1NUUklORyAoZGJ1c19tZXNzYWdlX2dldF9zZW5kZXIgKG1lc3NhZ2UpKSk7CisKKyAgaWYgKGF0dHJzICYgUFJPRklMRV9BVFRSSUJVVEVfRkxBR19ERVNUSU5BVElPTikKKyAgICBwcmludGYgKCJcdCVzIiwgVFJBUF9OVUxMX1NUUklORyAoZGJ1c19tZXNzYWdlX2dldF9kZXN0aW5hdGlvbiAobWVzc2FnZSkpKTsKKworICBpZiAoYXR0cnMgJiBQUk9GSUxFX0FUVFJJQlVURV9GTEFHX1JFUExZX1NFUklBTCkKKyAgICBwcmludGYgKCJcdCV1IiwgZGJ1c19tZXNzYWdlX2dldF9yZXBseV9zZXJpYWwgKG1lc3NhZ2UpKTsKKworICBpZiAoYXR0cnMgJiBQUk9GSUxFX0FUVFJJQlVURV9GTEFHX1BBVEgpCisgICAgcHJpbnRmICgiXHQlcyIsIFRSQVBfTlVMTF9TVFJJTkcgKGRidXNfbWVzc2FnZV9nZXRfcGF0aCAobWVzc2FnZSkpKTsKKworICBpZiAoYXR0cnMgJiBQUk9GSUxFX0FUVFJJQlVURV9GTEFHX0lOVEVSRkFDRSkKKyAgICBwcmludGYgKCJcdCVzIiwgVFJBUF9OVUxMX1NUUklORyAoZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG1lc3NhZ2UpKSk7CisKKyAgaWYgKGF0dHJzICYgUFJPRklMRV9BVFRSSUJVVEVfRkxBR19NRU1CRVIpCisgICAgcHJpbnRmICgiXHQlcyIsIFRSQVBfTlVMTF9TVFJJTkcgKGRidXNfbWVzc2FnZV9nZXRfbWVtYmVyIChtZXNzYWdlKSkpOworCisgIGlmIChhdHRycyAmIFBST0ZJTEVfQVRUUklCVVRFX0ZMQUdfRVJST1JfTkFNRSkKKyAgICBwcmludGYgKCJcdCVzIiwgVFJBUF9OVUxMX1NUUklORyAoZGJ1c19tZXNzYWdlX2dldF9lcnJvcl9uYW1lIChtZXNzYWdlKSkpOworCisgIHByaW50ZiAoIlxuIik7Cit9CisKK3N0YXRpYyB2b2lkCitwcmludF9tZXNzYWdlX3Byb2ZpbGUgKERCdXNNZXNzYWdlICptZXNzYWdlKQoreworICBzdGF0aWMgZGJ1c19ib29sX3QgZmlyc3QgPSBUUlVFOworICBsb25nIHNlYyA9IDAsIHVzZWMgPSAwOworCisgIGlmIChmaXJzdCkKKyAgICB7CisgICAgICBwcm9maWxlX3ByaW50X2hlYWRlcnMgKCk7CisgICAgICBmaXJzdCA9IEZBTFNFOworICAgIH0KKworICBfZGJ1c19nZXRfcmVhbF90aW1lICgmc2VjLCAmdXNlYyk7CisKKyAgc3dpdGNoIChkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKG1lc3NhZ2UpKQorICAgIHsKKyAgICAgIGNhc2UgREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX0NBTEw6CisgICAgICAgIHByb2ZpbGVfcHJpbnRfd2l0aF9hdHRycyAoIm1jIiwgbWVzc2FnZSwgc2VjLCB1c2VjLAorICAgICAgICAgIFBST0ZJTEVfQVRUUklCVVRFX0ZMQUdfU0VSSUFMIHwKKyAgICAgICAgICBQUk9GSUxFX0FUVFJJQlVURV9GTEFHX1NFTkRFUiB8CisgICAgICAgICAgUFJPRklMRV9BVFRSSUJVVEVfRkxBR19ERVNUSU5BVElPTiB8CisgICAgICAgICAgUFJPRklMRV9BVFRSSUJVVEVfRkxBR19QQVRIIHwKKyAgICAgICAgICBQUk9GSUxFX0FUVFJJQlVURV9GTEFHX0lOVEVSRkFDRSB8CisgICAgICAgICAgUFJPRklMRV9BVFRSSUJVVEVfRkxBR19NRU1CRVIpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX1JFVFVSTjoKKyAgICAgICAgcHJvZmlsZV9wcmludF93aXRoX2F0dHJzICgibXIiLCBtZXNzYWdlLCBzZWMsIHVzZWMsCisgICAgICAgICAgUFJPRklMRV9BVFRSSUJVVEVfRkxBR19TRVJJQUwgfAorICAgICAgICAgIFBST0ZJTEVfQVRUUklCVVRFX0ZMQUdfU0VOREVSIHwKKyAgICAgICAgICBQUk9GSUxFX0FUVFJJQlVURV9GTEFHX0RFU1RJTkFUSU9OIHwKKyAgICAgICAgICBQUk9GSUxFX0FUVFJJQlVURV9GTEFHX1JFUExZX1NFUklBTCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBEQlVTX01FU1NBR0VfVFlQRV9FUlJPUjoKKyAgICAgICAgcHJvZmlsZV9wcmludF93aXRoX2F0dHJzICgiZXJyIiwgbWVzc2FnZSwgc2VjLCB1c2VjLAorICAgICAgICAgIFBST0ZJTEVfQVRUUklCVVRFX0ZMQUdfU0VSSUFMIHwKKyAgICAgICAgICBQUk9GSUxFX0FUVFJJQlVURV9GTEFHX1NFTkRFUiB8CisgICAgICAgICAgUFJPRklMRV9BVFRSSUJVVEVfRkxBR19ERVNUSU5BVElPTiB8CisgICAgICAgICAgUFJPRklMRV9BVFRSSUJVVEVfRkxBR19SRVBMWV9TRVJJQUwpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgREJVU19NRVNTQUdFX1RZUEVfU0lHTkFMOgorICAgICAgICBwcm9maWxlX3ByaW50X3dpdGhfYXR0cnMgKCJzaWciLCBtZXNzYWdlLCBzZWMsIHVzZWMsCisgICAgICAgICAgUFJPRklMRV9BVFRSSUJVVEVfRkxBR19TRVJJQUwgfAorICAgICAgICAgIFBST0ZJTEVfQVRUUklCVVRFX0ZMQUdfU0VOREVSIHwKKyAgICAgICAgICBQUk9GSUxFX0FUVFJJQlVURV9GTEFHX0RFU1RJTkFUSU9OIHwKKyAgICAgICAgICBQUk9GSUxFX0FUVFJJQlVURV9GTEFHX1BBVEggfAorICAgICAgICAgIFBST0ZJTEVfQVRUUklCVVRFX0ZMQUdfSU5URVJGQUNFIHwKKyAgICAgICAgICBQUk9GSUxFX0FUVFJJQlVURV9GTEFHX01FTUJFUik7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcHJpbnRmICgiJXNcdCVsZC4lMDZsZCIsICJ0dW4iLCBzZWMsIHVzZWMpOworICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3N0YXRpYyBEQnVzSGFuZGxlclJlc3VsdAorcHJvZmlsZV9maWx0ZXJfZnVuYyAoREJ1c0Nvbm5lY3Rpb24gICAgICpjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgREJ1c01lc3NhZ2UgICAgICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICp1c2VyX2RhdGEpCit7CisgIHByaW50X21lc3NhZ2VfcHJvZmlsZSAobWVzc2FnZSk7CisKKyAgaWYgKGRidXNfbWVzc2FnZV9pc19zaWduYWwgKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX0lOVEVSRkFDRV9MT0NBTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEaXNjb25uZWN0ZWQiKSkKKyAgICBleGl0ICgwKTsKKworICByZXR1cm4gREJVU19IQU5ETEVSX1JFU1VMVF9IQU5ETEVEOworfQorCit0eXBlZGVmIGVudW0geworICAgIEJJTkFSWV9NT0RFX05PVCwKKyAgICBCSU5BUllfTU9ERV9SQVcsCisgICAgQklOQVJZX01PREVfUENBUAorfSBCaW5hcnlNb2RlOworCitzdGF0aWMgREJ1c0hhbmRsZXJSZXN1bHQKK2JpbmFyeV9maWx0ZXJfZnVuYyAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgIERCdXNNZXNzYWdlICAgICptZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAqdXNlcl9kYXRhKQoreworICBCaW5hcnlNb2RlIG1vZGUgPSBfREJVU19QT0lOVEVSX1RPX0lOVCAodXNlcl9kYXRhKTsKKyAgY2hhciAqYmxvYjsKKyAgaW50IGxlbjsKKworICAvKiBJdCB3b3VsZCBiZSBuaWNlIGlmIHdlIGNvdWxkIGRvIGEgemVyby1jb3B5ICJwZWVrIiBvbmUgZGF5LCBidXQgbGliZGJ1cworICAgKiBpcyBzbyBjb3B5LWhhcHB5IHRoYXQgdGhpcyBpc24ndCByZWFsbHkgYSBiaWcgZGVhbC4KKyAgICovCisgIGlmICghZGJ1c19tZXNzYWdlX21hcnNoYWwgKG1lc3NhZ2UsICZibG9iLCAmbGVuKSkKKyAgICB0b29sX29vbSAoInJldHJpZXZpbmcgbWVzc2FnZSIpOworCisgIHN3aXRjaCAobW9kZSkKKyAgICB7CisgICAgICBjYXNlIEJJTkFSWV9NT0RFX1BDQVA6CisgICAgICAgICAgeworICAgICAgICAgICAgbG9uZyB0dl9zZWMsIHR2X3VzZWM7CisgICAgICAgICAgICAvKiBzZWNvbmRzLCBtaWNyb3NlY29uZHMsIGJ5dGVzIGNhcHR1cmVkIChwb3NzaWJseSB0cnVuY2F0ZWQpLAorICAgICAgICAgICAgICogb3JpZ2luYWwgbGVuZ3RoLgorICAgICAgICAgICAgICogaHR0cDovL3dpa2kud2lyZXNoYXJrLm9yZy9EZXZlbG9wbWVudC9MaWJwY2FwRmlsZUZvcm1hdAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBkYnVzX3VpbnQzMl90IGhlYWRlcls0XSA9IHsgMCwgMCwgbGVuLCBsZW4gfTsKKworICAgICAgICAgICAgLyogSWYgdGhpcyBnZXRzIHBhZGRlZCB0aGVuIHdlJ2QgbmVlZCB0byB3cml0ZSBpdCBvdXQgaW4gcGllY2VzICovCisgICAgICAgICAgICBfREJVU19TVEFUSUNfQVNTRVJUIChzaXplb2YgKGhlYWRlcikgPT0gMTYpOworCisgICAgICAgICAgICBfZGJ1c19nZXRfcmVhbF90aW1lICgmdHZfc2VjLCAmdHZfdXNlYyk7CisgICAgICAgICAgICBoZWFkZXJbMF0gPSB0dl9zZWM7CisgICAgICAgICAgICBoZWFkZXJbMV0gPSB0dl91c2VjOworCisgICAgICAgICAgICBpZiAoIXRvb2xfd3JpdGVfYWxsIChTVERPVVRfRklMRU5PLCBoZWFkZXIsIHNpemVvZiAoaGVhZGVyKSkpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwZXJyb3IgKCJkYnVzLW1vbml0b3I6IHdyaXRlIik7CisgICAgICAgICAgICAgICAgZXhpdCAoMSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEJJTkFSWV9NT0RFX05PVDoKKyAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgid3JvbmcgZmlsdGVyIGZ1bmN0aW9uIik7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEJJTkFSWV9NT0RFX1JBVzoKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIC8qIG5vdGhpbmcgc3BlY2lhbCwganVzdCB0aGUgcmF3IG1lc3NhZ2Ugc3RyZWFtICovCisgICAgICAgIGJyZWFrOworICAgIH0KKworICBpZiAoIXRvb2xfd3JpdGVfYWxsIChTVERPVVRfRklMRU5PLCBibG9iLCBsZW4pKQorICAgIHsKKyAgICAgIHBlcnJvciAoImRidXMtbW9uaXRvcjogd3JpdGUiKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICBkYnVzX2ZyZWUgKGJsb2IpOworCisgIGlmIChkYnVzX21lc3NhZ2VfaXNfc2lnbmFsIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19JTlRFUkZBQ0VfTE9DQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGlzY29ubmVjdGVkIikpCisgICAgZXhpdCAoMCk7CisKKyAgcmV0dXJuIERCVVNfSEFORExFUl9SRVNVTFRfSEFORExFRDsKK30KKworc3RhdGljIHZvaWQgdXNhZ2UgKGNoYXIgKm5hbWUsIGludCBlY29kZSkgX0RCVVNfR05VQ19OT1JFVFVSTjsKKworc3RhdGljIHZvaWQKK3VzYWdlIChjaGFyICpuYW1lLCBpbnQgZWNvZGUpCit7CisgIGZwcmludGYgKHN0ZGVyciwgIlVzYWdlOiAlcyBbLS1zeXN0ZW0gfCAtLXNlc3Npb24gfCAtLWFkZHJlc3MgQUREUkVTU10gWy0tbW9uaXRvciB8IC0tcHJvZmlsZSB8IC0tcGNhcCB8IC0tYmluYXJ5IF0gW3dhdGNoIGV4cHJlc3Npb25zXVxuIiwgbmFtZSk7CisgIGV4aXQgKGVjb2RlKTsKK30KKworc3RhdGljIHZvaWQKK29ubHlfb25lX3R5cGUgKGRidXNfYm9vbF90ICpzZWVuX2J1c190eXBlLAorICAgICAgICAgICAgICAgY2hhciAgICAgICAgKm5hbWUpCit7CisgIGlmICgqc2Vlbl9idXNfdHlwZSkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJJIG9ubHkgc3VwcG9ydCBtb25pdG9yaW5nIG9uZSBidXMgYXQgYSB0aW1lIVxuIik7CisgICAgICB1c2FnZSAobmFtZSwgMSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgKnNlZW5fYnVzX3R5cGUgPSBUUlVFOworICAgIH0KK30KKworc3RhdGljIGRidXNfYm9vbF90CitiZWNvbWVfbW9uaXRvciAoREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisgICAgaW50IG51bUZpbHRlcnMsCisgICAgY29uc3QgY2hhciAqIGNvbnN0ICpmaWx0ZXJzKQoreworICBEQnVzRXJyb3IgZXJyb3IgPSBEQlVTX0VSUk9SX0lOSVQ7CisgIERCdXNNZXNzYWdlICptOworICBEQnVzTWVzc2FnZSAqcjsKKyAgaW50IGk7CisgIGRidXNfdWludDMyX3QgemVybyA9IDA7CisgIERCdXNNZXNzYWdlSXRlciBhcHBlbmRlciwgYXJyYXlfYXBwZW5kZXI7CisKKyAgbSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKERCVVNfU0VSVklDRV9EQlVTLAorICAgICAgREJVU19QQVRIX0RCVVMsIERCVVNfSU5URVJGQUNFX01PTklUT1JJTkcsICJCZWNvbWVNb25pdG9yIik7CisKKyAgaWYgKG0gPT0gTlVMTCkKKyAgICB0b29sX29vbSAoImJlY29taW5nIGEgbW9uaXRvciIpOworCisgIGRidXNfbWVzc2FnZV9pdGVyX2luaXRfYXBwZW5kIChtLCAmYXBwZW5kZXIpOworCisgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfb3Blbl9jb250YWluZXIgKCZhcHBlbmRlciwgREJVU19UWVBFX0FSUkFZLCAicyIsCisgICAgICAgICZhcnJheV9hcHBlbmRlcikpCisgICAgdG9vbF9vb20gKCJvcGVuaW5nIHN0cmluZyBhcnJheSIpOworCisgIGZvciAoaSA9IDA7IGkgPCBudW1GaWx0ZXJzOyBpKyspCisgICAgeworICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfYmFzaWMgKCZhcnJheV9hcHBlbmRlciwgREJVU19UWVBFX1NUUklORywKKyAgICAgICAgICAgICZmaWx0ZXJzW2ldKSkKKyAgICAgICAgdG9vbF9vb20gKCJhZGRpbmcgZmlsdGVyIHRvIGFycmF5Iik7CisgICAgfQorCisgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfY2xvc2VfY29udGFpbmVyICgmYXBwZW5kZXIsICZhcnJheV9hcHBlbmRlcikgfHwKKyAgICAgICFkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfYmFzaWMgKCZhcHBlbmRlciwgREJVU19UWVBFX1VJTlQzMiwgJnplcm8pKQorICAgIHRvb2xfb29tICgiZmluaXNoaW5nIGFyZ3VtZW50cyIpOworCisgIHIgPSBkYnVzX2Nvbm5lY3Rpb25fc2VuZF93aXRoX3JlcGx5X2FuZF9ibG9jayAoY29ubmVjdGlvbiwgbSwgLTEsICZlcnJvcik7CisKKyAgaWYgKHIgIT0gTlVMTCkKKyAgICB7CisgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHIpOworICAgIH0KKyAgZWxzZSBpZiAoZGJ1c19lcnJvcl9oYXNfbmFtZSAoJmVycm9yLCBEQlVTX0VSUk9SX1VOS05PV05fSU5URVJGQUNFKSkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJkYnVzLW1vbml0b3I6IHVuYWJsZSB0byBlbmFibGUgbmV3LXN0eWxlIG1vbml0b3JpbmcsICIKKyAgICAgICAgICAieW91ciBkYnVzLWRhZW1vbiBpcyB0b28gb2xkLiBGYWxsaW5nIGJhY2sgdG8gZWF2ZXNkcm9wcGluZy5cbiIpOworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgImRidXMtbW9uaXRvcjogdW5hYmxlIHRvIGVuYWJsZSBuZXctc3R5bGUgbW9uaXRvcmluZzogIgorICAgICAgICAgICIlczogXCIlc1wiLiBGYWxsaW5nIGJhY2sgdG8gZWF2ZXNkcm9wcGluZy5cbiIsCisgICAgICAgICAgZXJyb3IubmFtZSwgZXJyb3IubWVzc2FnZSk7CisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgfQorCisgIGRidXNfbWVzc2FnZV91bnJlZiAobSk7CisKKyAgcmV0dXJuIChyICE9IE5VTEwpOworfQorCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgIERCdXNDb25uZWN0aW9uICpjb25uZWN0aW9uOworICBEQnVzRXJyb3IgZXJyb3I7CisgIERCdXNCdXNUeXBlIHR5cGUgPSBEQlVTX0JVU19TRVNTSU9OOworICBEQnVzSGFuZGxlTWVzc2FnZUZ1bmN0aW9uIGZpbHRlcl9mdW5jID0gbW9uaXRvcl9maWx0ZXJfZnVuYzsKKyAgY2hhciAqYWRkcmVzcyA9IE5VTEw7CisgIGRidXNfYm9vbF90IHNlZW5fYnVzX3R5cGUgPSBGQUxTRTsKKyAgQmluYXJ5TW9kZSBiaW5hcnlfbW9kZSA9IEJJTkFSWV9NT0RFX05PVDsKKyAgaW50IGkgPSAwLCBqID0gMCwgbnVtRmlsdGVycyA9IDA7CisgIGNoYXIgKipmaWx0ZXJzID0gTlVMTDsKKworICAvKiBTZXQgc3Rkb3V0IHRvIGJlIHVuYnVmZmVyZWQ7IHRoaXMgaXMgYmFzaWNhbGx5IHNvIHRoYXQgaWYgcGVvcGxlCisgICAqIGRvIGRidXMtbW9uaXRvciA+IGZpbGUsIHRoZW4gc2VuZCBTSUdJTlQgdmlhIENvbnRyb2wtQywgdGhleQorICAgKiBkb24ndCBsb3NlIHRoZSBsYXN0IGNodW5rIG9mIG1lc3NhZ2VzLgorICAgKi8KKworI2lmZGVmIERCVVNfV0lOCisgIHNldHZidWYgKHN0ZG91dCwgTlVMTCwgX0lPTkJGLCAwKTsKKyNlbHNlCisgIHNldHZidWYgKHN0ZG91dCwgTlVMTCwgX0lPTEJGLCAwKTsKKyNlbmRpZgorCisgIGZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspCisgICAgeworICAgICAgY2hhciAqYXJnID0gYXJndltpXTsKKworICAgICAgaWYgKCFzdHJjbXAgKGFyZywgIi0tc3lzdGVtIikpCisgICAgICAgIHsKKyAgICAgICAgICBvbmx5X29uZV90eXBlICgmc2Vlbl9idXNfdHlwZSwgYXJndlswXSk7CisgICAgICAgICAgdHlwZSA9IERCVVNfQlVTX1NZU1RFTTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoIXN0cmNtcCAoYXJnLCAiLS1zZXNzaW9uIikpCisgICAgICAgIHsKKyAgICAgICAgICBvbmx5X29uZV90eXBlICgmc2Vlbl9idXNfdHlwZSwgYXJndlswXSk7CisgICAgICAgICAgdHlwZSA9IERCVVNfQlVTX1NFU1NJT047CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKCFzdHJjbXAgKGFyZywgIi0tYWRkcmVzcyIpKQorICAgICAgICB7CisgICAgICAgICAgb25seV9vbmVfdHlwZSAoJnNlZW5fYnVzX3R5cGUsIGFyZ3ZbMF0pOworCisgICAgICAgICAgaWYgKGkrMSA8IGFyZ2MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGFkZHJlc3MgPSBhcmd2W2krMV07CisgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB1c2FnZSAoYXJndlswXSwgMSk7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKCFzdHJjbXAgKGFyZywgIi0taGVscCIpKQorICAgICAgICB1c2FnZSAoYXJndlswXSwgMCk7CisgICAgICBlbHNlIGlmICghc3RyY21wIChhcmcsICItLW1vbml0b3IiKSkKKyAgICAgICAgeworICAgICAgICAgIGZpbHRlcl9mdW5jID0gbW9uaXRvcl9maWx0ZXJfZnVuYzsKKyAgICAgICAgICBiaW5hcnlfbW9kZSA9IEJJTkFSWV9NT0RFX05PVDsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoIXN0cmNtcCAoYXJnLCAiLS1wcm9maWxlIikpCisgICAgICAgIHsKKyAgICAgICAgICBmaWx0ZXJfZnVuYyA9IHByb2ZpbGVfZmlsdGVyX2Z1bmM7CisgICAgICAgICAgYmluYXJ5X21vZGUgPSBCSU5BUllfTU9ERV9OT1Q7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKCFzdHJjbXAgKGFyZywgIi0tYmluYXJ5IikpCisgICAgICAgIHsKKyAgICAgICAgICBmaWx0ZXJfZnVuYyA9IGJpbmFyeV9maWx0ZXJfZnVuYzsKKyAgICAgICAgICBiaW5hcnlfbW9kZSA9IEJJTkFSWV9NT0RFX1JBVzsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoIXN0cmNtcCAoYXJnLCAiLS1wY2FwIikpCisgICAgICAgIHsKKyAgICAgICAgICBmaWx0ZXJfZnVuYyA9IGJpbmFyeV9maWx0ZXJfZnVuYzsKKyAgICAgICAgICBiaW5hcnlfbW9kZSA9IEJJTkFSWV9NT0RFX1BDQVA7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKCFzdHJjbXAgKGFyZywgIi0tIikpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgZWxzZSBpZiAoYXJnWzBdID09ICctJykKKyAgICAgICAgdXNhZ2UgKGFyZ3ZbMF0sIDEpOworICAgICAgZWxzZSB7CisgICAgICAgICAgdW5zaWduZWQgaW50IGZpbHRlcl9sZW47CisgICAgICAgICAgbnVtRmlsdGVycysrOworICAgICAgICAgIC8qIFByZXBlbmQgYSBydWxlIChhbmQgYSBjb21tYSkgdG8gZW5hYmxlIHRoZSBtb25pdG9yIHRvIGVhdmVzZHJvcC4KKyAgICAgICAgICAgKiBQcmVwZW5kaW5nIGFsbG93cyB0aGUgdXNlciB0byBhZGQgZWF2ZXNkcm9wPWZhbHNlIGF0IGNvbW1hbmQgbGluZQorICAgICAgICAgICAqIGluIG9yZGVyIHRvIGRpc2FibGUgZWF2ZXNkcm9wcGluZyB3aGVuIG5lZWRlZCAqLworICAgICAgICAgIGZpbHRlcl9sZW4gPSBzdHJsZW4gKEVBVkVTRFJPUFBJTkdfUlVMRSkgKyAxICsgc3RybGVuIChhcmcpICsgMTsKKworICAgICAgICAgIGZpbHRlcnMgPSAoY2hhciAqKikgcmVhbGxvYyAoZmlsdGVycywgbnVtRmlsdGVycyAqIHNpemVvZiAoY2hhciAqKSk7CisgICAgICAgICAgaWYgKGZpbHRlcnMgPT0gTlVMTCkKKyAgICAgICAgICAgIHRvb2xfb29tICgiYWRkaW5nIGEgbmV3IGZpbHRlciBzbG90Iik7CisgICAgICAgICAgZmlsdGVyc1tqXSA9IChjaGFyICopIG1hbGxvYyAoZmlsdGVyX2xlbik7CisgICAgICAgICAgaWYgKGZpbHRlcnNbal0gPT0gTlVMTCkKKyAgICAgICAgICAgIHRvb2xfb29tICgiYWRkaW5nIGEgbmV3IGZpbHRlciIpOworICAgICAgICAgIHNucHJpbnRmIChmaWx0ZXJzW2pdLCBmaWx0ZXJfbGVuLCAiJXMsJXMiLCBFQVZFU0RST1BQSU5HX1JVTEUsIGFyZyk7CisgICAgICAgICAgaisrOworICAgICAgfQorICAgIH0KKworICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisgIAorICBpZiAoYWRkcmVzcyAhPSBOVUxMKQorICAgIHsKKyAgICAgIGNvbm5lY3Rpb24gPSBkYnVzX2Nvbm5lY3Rpb25fb3BlbiAoYWRkcmVzcywgJmVycm9yKTsKKyAgICAgIGlmIChjb25uZWN0aW9uKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCFkYnVzX2J1c19yZWdpc3RlciAoY29ubmVjdGlvbiwgJmVycm9yKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiRmFpbGVkIHRvIHJlZ2lzdGVyIGNvbm5lY3Rpb24gdG8gYnVzIGF0ICVzOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywgZXJyb3IubWVzc2FnZSk7CisgICAgICAgICAgICAgIGRidXNfZXJyb3JfZnJlZSAoJmVycm9yKTsKKyAgICAgICAgICAgICAgZXhpdCAoMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICBjb25uZWN0aW9uID0gZGJ1c19idXNfZ2V0ICh0eXBlLCAmZXJyb3IpOworICBpZiAoY29ubmVjdGlvbiA9PSBOVUxMKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKndoZXJlOworICAgICAgaWYgKGFkZHJlc3MgIT0gTlVMTCkKKyAgICAgICAgd2hlcmUgPSBhZGRyZXNzOworICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgc3dpdGNoICh0eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSBEQlVTX0JVU19TWVNURU06CisgICAgICAgICAgICAgIHdoZXJlID0gInN5c3RlbSBidXMiOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgREJVU19CVVNfU0VTU0lPTjoKKyAgICAgICAgICAgICAgd2hlcmUgPSAic2Vzc2lvbiBidXMiOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgREJVU19CVVNfU1RBUlRFUjoKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIC8qIFdlIGRvbid0IHNldCB0eXBlIHRvIGFueXRoaW5nIGVsc2UgKi8KKyAgICAgICAgICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiaW1wb3NzaWJsZSBidXMgdHlwZSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJGYWlsZWQgdG8gb3BlbiBjb25uZWN0aW9uIHRvICVzOiAlc1xuIiwKKyAgICAgICAgICAgICAgIHdoZXJlLAorICAgICAgICAgICAgICAgZXJyb3IubWVzc2FnZSk7CisgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgLyogUmVjZWl2ZSBvLmZkLlBlZXIgbWVzc2FnZXMgYXMgbm9ybWFsIG1lc3NhZ2VzLCByYXRoZXIgdGhhbiBoYXZpbmcKKyAgICogbGliZGJ1cyBoYW5kbGUgdGhlbSBpbnRlcm5hbGx5LCB3aGljaCBpcyB0aGUgd3JvbmcgdGhpbmcgZm9yCisgICAqIGEgbW9uaXRvciAqLworICBkYnVzX2Nvbm5lY3Rpb25fc2V0X3JvdXRlX3BlZXJfbWVzc2FnZXMgKGNvbm5lY3Rpb24sIFRSVUUpOworCisgIGlmICghZGJ1c19jb25uZWN0aW9uX2FkZF9maWx0ZXIgKGNvbm5lY3Rpb24sIGZpbHRlcl9mdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfREJVU19JTlRfVE9fUE9JTlRFUiAoYmluYXJ5X21vZGUpLCBOVUxMKSkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJDb3VsZG4ndCBhZGQgZmlsdGVyIVxuIik7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgaWYgKGJlY29tZV9tb25pdG9yIChjb25uZWN0aW9uLCBudW1GaWx0ZXJzLAorICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICogY29uc3QgKikgZmlsdGVycykpCisgICAgeworICAgICAgLyogbm8gbW9yZSBwcmVwYXJhdGlvbiBuZWVkZWQgKi8KKyAgICB9CisgIGVsc2UgaWYgKG51bUZpbHRlcnMpCisgICAgeworICAgICAgc2l6ZV90IG9mZnNldCA9IDA7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgajsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgZGJ1c19idXNfYWRkX21hdGNoIChjb25uZWN0aW9uLCBmaWx0ZXJzW2ldICsgb2Zmc2V0LCAmZXJyb3IpOworICAgICAgICAgIGlmIChkYnVzX2Vycm9yX2lzX3NldCAoJmVycm9yKSAmJiBpID09IDAgJiYgb2Zmc2V0ID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8qIFdlIG1pZ2h0IGJlIHRhbGtpbmcgdG8gYSBwcmUtMS41LjYgZGJ1cy1kYWVtb24KKyAgICAgICAgICAgICAgKiB3aGljaCB3b3VsZG4ndCB1bmRlcnN0YW5kIGVhdmVzZHJvcD10cnVlLgorICAgICAgICAgICAgICAqIElmIHRoaXMgd29ya3MsIGNhcnJ5IG9uIHdpdGggb2Zmc2V0ID4gMAorICAgICAgICAgICAgICAqIG9uIHRoZSByZW1haW5pbmcgaXRlcmF0aW9ucy4gKi8KKyAgICAgICAgICAgICAgb2Zmc2V0ID0gc3RybGVuIChFQVZFU0RST1BQSU5HX1JVTEUpICsgMTsKKyAgICAgICAgICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgICAgICAgICBkYnVzX2J1c19hZGRfbWF0Y2ggKGNvbm5lY3Rpb24sIGZpbHRlcnNbaV0gKyBvZmZzZXQsICZlcnJvcik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoZGJ1c19lcnJvcl9pc19zZXQgKCZlcnJvcikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIkZhaWxlZCB0byBzZXR1cCBtYXRjaCBcIiVzXCI6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJzW2ldLCBlcnJvci5tZXNzYWdlKTsKKyAgICAgICAgICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgICAgICAgICBleGl0ICgxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBmcmVlKGZpbHRlcnNbaV0pOworICAgICAgICB9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZGJ1c19idXNfYWRkX21hdGNoIChjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBFQVZFU0RST1BQSU5HX1JVTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcik7CisgICAgICBpZiAoZGJ1c19lcnJvcl9pc19zZXQgKCZlcnJvcikpCisgICAgICAgIHsKKyAgICAgICAgICBkYnVzX2Vycm9yX2ZyZWUgKCZlcnJvcik7CisgICAgICAgICAgZGJ1c19idXNfYWRkX21hdGNoIChjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpOworICAgICAgICAgIGlmIChkYnVzX2Vycm9yX2lzX3NldCAoJmVycm9yKSkKKyAgICAgICAgICAgIGdvdG8gbG9zZTsKKyAgICAgICAgfQorICAgIH0KKworICBzd2l0Y2ggKGJpbmFyeV9tb2RlKQorICAgIHsKKyAgICAgIGNhc2UgQklOQVJZX01PREVfTk9UOgorICAgICAgY2FzZSBCSU5BUllfTU9ERV9SQVc6CisgICAgICBkZWZhdWx0OgorICAgICAgICAvKiBubyBzcGVjaWFsIGhlYWRlciBuZWVkZWQgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgQklOQVJZX01PREVfUENBUDoKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBXZSdyZSBub3QgdXNpbmcgbGlicGNhcCBiZWNhdXNlIHRoZSBmaWxlIGZvcm1hdCBpcyBzaW1wbGUKKyAgICAgICAgICAgICAqIGVub3VnaCBub3QgdG8gbmVlZCBpdC4KKyAgICAgICAgICAgICAqIGh0dHA6Ly93aWtpLndpcmVzaGFyay5vcmcvRGV2ZWxvcG1lbnQvTGlicGNhcEZpbGVGb3JtYXQgKi8KKyAgICAgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCBtYWdpYzsKKyAgICAgICAgICAgICAgICBkYnVzX3VpbnQxNl90IG1ham9yX3ZlcnNpb247CisgICAgICAgICAgICAgICAgZGJ1c191aW50MTZfdCBtaW5vcl92ZXJzaW9uOworICAgICAgICAgICAgICAgIGRidXNfaW50MzJfdCB0aW1lem9uZTsKKyAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90IHByZWNpc2lvbjsKKyAgICAgICAgICAgICAgICBkYnVzX3VpbnQzMl90IG1heF9sZW5ndGg7CisgICAgICAgICAgICAgICAgZGJ1c191aW50MzJfdCBsaW5rX3R5cGU7CisgICAgICAgICAgICB9IGhlYWRlciA9IHsKKyAgICAgICAgICAgICAgICAweEExQjJDM0Q0VSwgIC8qIG1hZ2ljIG51bWJlciAqLworICAgICAgICAgICAgICAgIDIsIDQsICAgICAgICAgLyogdjIuNCAqLworICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgLyogY2FwdHVyZSBpbiBHTVQgKi8KKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgIC8qIG5vIG9waW5pb24gb24gdGltZXN0YW1wIHByZWNpc2lvbiAqLworICAgICAgICAgICAgICAgICgxIDw8IDI3KSwgICAgLyogRC1CdXMgc3BlYyBzYXlzIHNvICovCisgICAgICAgICAgICAgICAgTElOS1RZUEVfREJVUworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgLyogQXNzZXJ0IHRoYXQgdGhlcmUgaXMgbm8gcGFkZGluZyAqLworICAgICAgICAgICAgX0RCVVNfU1RBVElDX0FTU0VSVCAoc2l6ZW9mIChoZWFkZXIpID09IDI0KTsKKworICAgICAgICAgICAgaWYgKCF0b29sX3dyaXRlX2FsbCAoU1RET1VUX0ZJTEVOTywgJmhlYWRlciwgc2l6ZW9mIChoZWFkZXIpKSkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBlcnJvciAoImRidXMtbW9uaXRvcjogd3JpdGUiKTsKKyAgICAgICAgICAgICAgICBleGl0ICgxKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgIHdoaWxlIChkYnVzX2Nvbm5lY3Rpb25fcmVhZF93cml0ZV9kaXNwYXRjaChjb25uZWN0aW9uLCAtMSkpCisgICAgOworICBleGl0ICgwKTsKKyBsb3NlOgorICBmcHJpbnRmIChzdGRlcnIsICJFcnJvcjogJXNcbiIsIGVycm9yLm1lc3NhZ2UpOworICBleGl0ICgxKTsKK30KKwpkaWZmIC0tZ2l0IGEvdG9vbHMvZGJ1cy1wcmludC1tZXNzYWdlLmMgYi90b29scy9kYnVzLXByaW50LW1lc3NhZ2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDdmNzJmCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvZGJ1cy1wcmludC1tZXNzYWdlLmMKQEAgLTAsMCArMSw2MDMgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1wcmludC1tZXNzYWdlLmggIFV0aWxpdHkgZnVuY3Rpb24gdG8gcHJpbnQgb3V0IGEgbWVzc2FnZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBQaGlsaXAgQmx1bmRlbGwgPHBoaWxiQGdudS5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgUmVkIEhhdCwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAiZGJ1cy1wcmludC1tZXNzYWdlLmgiCisKKyNpZmRlZiBEQlVTX1VOSVgKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxzeXMvdW4uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pcC5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJjb25maWcuaCIKKworI2luY2x1ZGUgInRvb2wtY29tbW9uLmgiCisKKyNpZmRlZiBIQVZFX0lOVFRZUEVTX0gKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKERCVVNfV0lOKQorI2lmICFkZWZpbmVkKFBSSWQ2NCkKKyNkZWZpbmUgUFJJZDY0ICJJNjRkIgorI2VuZGlmCisjaWYgIWRlZmluZWQoUFJJdTY0KQorI2RlZmluZSBQUkl1NjQgIkk2NHUiCisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfU09DS0xFTl9UCisjZGVmaW5lIHNvY2tsZW5fdCBpbnQKKyNlbmRpZgorCitzdGF0aWMgY29uc3QgY2hhcioKK3R5cGVfdG9fbmFtZSAoaW50IG1lc3NhZ2VfdHlwZSkKK3sKKyAgc3dpdGNoIChtZXNzYWdlX3R5cGUpCisgICAgeworICAgIGNhc2UgREJVU19NRVNTQUdFX1RZUEVfU0lHTkFMOgorICAgICAgcmV0dXJuICJzaWduYWwiOworICAgIGNhc2UgREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX0NBTEw6CisgICAgICByZXR1cm4gIm1ldGhvZCBjYWxsIjsKKyAgICBjYXNlIERCVVNfTUVTU0FHRV9UWVBFX01FVEhPRF9SRVRVUk46CisgICAgICByZXR1cm4gIm1ldGhvZCByZXR1cm4iOworICAgIGNhc2UgREJVU19NRVNTQUdFX1RZUEVfRVJST1I6CisgICAgICByZXR1cm4gImVycm9yIjsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuICIodW5rbm93biBtZXNzYWdlIHR5cGUpIjsKKyAgICB9Cit9CisKKyNkZWZpbmUgSU5ERU5UIDMKKworc3RhdGljIHZvaWQKK2luZGVudCAoaW50IGRlcHRoKQoreworICB3aGlsZSAoZGVwdGgtLSA+IDApCisgICAgcHJpbnRmICgiICAgIik7IC8qIElOREVOVCBzcGFjZXMuICovCit9CisKK3N0YXRpYyB2b2lkCitwcmludF9oZXggKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ5dGVzLAorICAgICAgICAgICB1bnNpZ25lZCBpbnQgbGVuLAorICAgICAgICAgICBpbnQgZGVwdGgpCit7CisgIHVuc2lnbmVkIGludCBpLCBjb2x1bW5zOworCisgIHByaW50ZiAoImFycmF5IG9mIGJ5dGVzIFtcbiIpOworCisgIGluZGVudCAoZGVwdGggKyAxKTsKKworICAvKiBFYWNoIGJ5dGUgdGFrZXMgMyBjZWxscyAodHdvIGhleGl0cywgYW5kIGEgc3BhY2UpLCBleGNlcHQgdGhlIGxhc3Qgb25lLiAqLworICBjb2x1bW5zID0gKDgwIC0gKChkZXB0aCArIDEpICogSU5ERU5UKSkgLyAzOworCisgIGlmIChjb2x1bW5zIDwgOCkKKyAgICBjb2x1bW5zID0gODsKKworICBpID0gMDsKKworICB3aGlsZSAoaSA8IGxlbikKKyAgICB7CisgICAgICBwcmludGYgKCIlMDJ4IiwgYnl0ZXNbaV0pOworICAgICAgaSsrOworCisgICAgICBpZiAoaSAhPSBsZW4pCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoaSAlIGNvbHVtbnMgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcHJpbnRmICgiXG4iKTsKKyAgICAgICAgICAgICAgaW5kZW50IChkZXB0aCArIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcHJpbnRmICgiICIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgIHByaW50ZiAoIlxuIik7CisgIGluZGVudCAoZGVwdGgpOworICBwcmludGYgKCJdXG4iKTsKK30KKworI2RlZmluZSBERUZBVUxUX1NJWkUgMTAwCisKK3N0YXRpYyB2b2lkCitwcmludF9heSAoREJ1c01lc3NhZ2VJdGVyICppdGVyLCBpbnQgZGVwdGgpCit7CisgIC8qIFRydWUgaWYgZXZlcnkgYnl0ZSBpbiB0aGUgYnl0ZXN0cmluZyAoc28gZmFyKSBpcyBwcmludGFibGUKKyAgICogQVNDSUksIHdpdGggb25lIGV4Y2VwdGlvbjogdGhlIGxhc3QgYnl0ZSBpcyBhbHNvIGFsbG93ZWQgdG8gYmUgXDAuICovCisgIGRidXNfYm9vbF90IGFsbF9hc2NpaSA9IFRSVUU7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ5dGVzOworICBpbnQgbGVuOworICBpbnQgaTsKKworICBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfZml4ZWRfYXJyYXkgKGl0ZXIsICZieXRlcywgJmxlbik7CisKKyAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorICAgIHsKKyAgICAgIGlmICgoYnl0ZXNbaV0gPCAzMiB8fCBieXRlc1tpXSA+IDEyNikgJiYKKyAgICAgICAgICAoaSA8IGxlbiAtIDEgfHwgYnl0ZXNbaV0gIT0gJ1wwJykpCisgICAgICAgIHsKKyAgICAgICAgICBhbGxfYXNjaWkgPSBGQUxTRTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICBpZiAoYWxsX2FzY2lpICYmIGxlbiA+IDAgJiYgYnl0ZXNbbGVuIC0gMV0gPT0gJ1wwJykKKyAgICB7CisgICAgICBwcmludGYgKCJhcnJheSBvZiBieXRlcyBcIiVzXCIgKyBcXDBcbiIsIGJ5dGVzKTsKKyAgICB9CisgIGVsc2UgaWYgKGFsbF9hc2NpaSkKKyAgICB7CisgICAgICB1bnNpZ25lZCBjaGFyICpjb3B5ID0gZGJ1c19tYWxsb2MgKGxlbiArIDEpOworCisgICAgICBpZiAoY29weSA9PSBOVUxMKQorICAgICAgICB0b29sX29vbSAoImNvcHlpbmcgYnl0ZXN0cmluZyIpOworCisgICAgICBtZW1jcHkgKGNvcHksIGJ5dGVzLCBsZW4pOworICAgICAgY29weVtsZW5dID0gJ1wwJzsKKyAgICAgIHByaW50ZiAoImFycmF5IG9mIGJ5dGVzIFwiJXNcIlxuIiwgY29weSk7CisgICAgICBkYnVzX2ZyZWUgKGNvcHkpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHByaW50X2hleCAoYnl0ZXMsIGxlbiwgZGVwdGgpOworICAgIH0KK30KKworI2lmZGVmIERCVVNfVU5JWAorc3RhdGljIHZvaWQKK3ByaW50X2ZkIChpbnQgZmQsIGludCBkZXB0aCkKK3sKKyAgaW50IHJldDsKKyAgc3RydWN0IHN0YXQgc3RhdGJ1ZiA9IHswLH07CisgIHVuaW9uIHsKKyAgICAgIHN0cnVjdCBzb2NrYWRkciBzYTsKKyAgICAgIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIHN0b3JhZ2U7CisgICAgICBzdHJ1Y3Qgc29ja2FkZHJfdW4gdW47CisgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gaXB2NDsKKyAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbjYgaXB2NjsKKyAgfSBhZGRyLCBwZWVyOworICBjaGFyIGhvc3RpcFtJTkVUNl9BRERSU1RSTEVOXTsKKyAgc29ja2xlbl90IGFkZHJsZW4gPSBzaXplb2YgKGFkZHIpOworICBzb2NrbGVuX3QgcGVlcmxlbiA9IHNpemVvZiAocGVlcik7CisgIGludCBoYXNfcGVlcjsKKworICAvKiBEb24ndCBwcmludCB0aGUgZmQgbnVtYmVyOiBpdCBpcyBkaWZmZXJlbnQgaW4gZXZlcnkgcHJvY2VzcyBhbmQgc2luY2UKKyAgICogZGJ1cy1tb25pdG9yIGNsb3NlcyB0aGUgZmQgYWZ0ZXIgcmVhZGluZyBpdCwgdGhlIHNhbWUgbnVtYmVyIHdvdWxkIGJlCisgICAqIHByaW50ZWQgYWdhaW4gYW5kIGFnYWluLgorICAgKi8KKyAgcHJpbnRmICgiZmlsZSBkZXNjcmlwdG9yXG4iKTsKKyAgaWYgKGZkID09IC0xKQorICAgIHJldHVybjsKKworICByZXQgPSBmc3RhdCAoZmQsICZzdGF0YnVmKTsKKyAgaWYgKHJldCA9PSAtMSkKKyAgICByZXR1cm47CisKKyAgaW5kZW50IChkZXB0aCsxKTsKKyAgcHJpbnRmICgiaW5vZGU6ICVkXG4iLCAoaW50KSBzdGF0YnVmLnN0X2lubyk7CisKKyAgaW5kZW50IChkZXB0aCsxKTsKKyAgcHJpbnRmICgidHlwZTogIik7CisgIGlmIChTX0lTUkVHKHN0YXRidWYuc3RfbW9kZSkpCisgICAgcHJpbnRmICgiZmlsZVxuIik7CisgIGlmIChTX0lTRElSKHN0YXRidWYuc3RfbW9kZSkpCisgICAgcHJpbnRmICgiZGlyZWN0b3J5XG4iKTsKKyAgaWYgKFNfSVNDSFIoc3RhdGJ1Zi5zdF9tb2RlKSkKKyAgICBwcmludGYgKCJjaGFyXG4iKTsKKyAgaWYgKFNfSVNCTEsoc3RhdGJ1Zi5zdF9tb2RlKSkKKyAgICBwcmludGYgKCJibG9ja1xuIik7CisgIGlmIChTX0lTRklGTyhzdGF0YnVmLnN0X21vZGUpKQorICAgIHByaW50ZiAoImZpZm9cbiIpOworICBpZiAoU19JU0xOSyhzdGF0YnVmLnN0X21vZGUpKQorICAgIHByaW50ZiAoImxpbmtcbiIpOworICBpZiAoU19JU1NPQ0soc3RhdGJ1Zi5zdF9tb2RlKSkKKyAgICBwcmludGYgKCJzb2NrZXRcbiIpOworCisgIC8qIElmIGl0J3Mgbm90IGEgc29ja2V0LCBnZXRzb2NrbmFtZSB3aWxsIGp1c3QgcmV0dXJuIC0xIHdpdGggZXJybm8KKyAgICogRU5PVFNPQ0suICovCisKKyAgbWVtc2V0ICgmYWRkciwgMCwgc2l6ZW9mIChhZGRyKSk7CisgIG1lbXNldCAoJnBlZXIsIDAsIHNpemVvZiAocGVlcikpOworCisgIGlmIChnZXRzb2NrbmFtZShmZCwgJmFkZHIuc2EsICZhZGRybGVuKSkKKyAgICByZXR1cm47CisKKyAgaGFzX3BlZXIgPSAhZ2V0cGVlcm5hbWUoZmQsICZwZWVyLnNhLCAmcGVlcmxlbik7CisKKyAgaW5kZW50IChkZXB0aCsxKTsKKyAgcHJpbnRmICgiYWRkcmVzcyBmYW1pbHk6ICIpOworICBzd2l0Y2ggKGFkZHIuc2Euc2FfZmFtaWx5KQorICAgIHsKKyAgICAgIGNhc2UgQUZfVU5JWDoKKyAgICAgICAgcHJpbnRmKCJ1bml4XG4iKTsKKyAgICAgICAgaWYgKGFkZHIudW4uc3VuX3BhdGhbMF0gPT0gJ1wwJykKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBBYnN0cmFjdCBzb2NrZXQgbWlnaHQgbm90IGJlIHplcm8tdGVybWluYXRlZCBhbmQgbGVuZ3RoIGlzCisgICAgICAgICAgICAgKiB2YXJpYWJsZS4gV2hvIGRlc2lnbmVkIHRoaXMgaW50ZXJmYWNlPworICAgICAgICAgICAgICogV3JpdGUgdGhlIG5hbWUgaW4gdGhlIHNhbWUgd2F5IGFzIC9wcm9jL25ldC91bml4CisgICAgICAgICAgICAgKiBTZWUgbWFudWFsIHBhZ2UgdW5peCg3KQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpbmRlbnQgKGRlcHRoKzEpOworICAgICAgICAgICAgcHJpbnRmICgibmFtZSBAJS4qc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgKGludCkgKGFkZHJsZW4gLSBzaXplb2YgKHNhX2ZhbWlseV90KSAtIDEpLAorICAgICAgICAgICAgICAgICAgICAmKGFkZHIudW4uc3VuX3BhdGhbMV0pKTsKKworICAgICAgICAgICAgaWYgKGhhc19wZWVyKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW5kZW50IChkZXB0aCsxKTsKKyAgICAgICAgICAgICAgICBwcmludGYgKCJwZWVyIEAlLipzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgKGFkZHJsZW4gLSBzaXplb2YgKHNhX2ZhbWlseV90KSAtIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgJihhZGRyLnVuLnN1bl9wYXRoWzFdKSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICB7CisgICAgICAgICAgICBpbmRlbnQgKGRlcHRoKzEpOworICAgICAgICAgICAgcHJpbnRmICgibmFtZSAlc1xuIiwgYWRkci51bi5zdW5fcGF0aCk7CisgICAgICAgICAgICBpZiAoaGFzX3BlZXIpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbmRlbnQgKGRlcHRoKzEpOworICAgICAgICAgICAgICAgIHByaW50ZiAoInBlZXIgJXNcbiIsIHBlZXIudW4uc3VuX3BhdGgpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBBRl9JTkVUOgorICAgICAgICBwcmludGYgKCJpbmV0XG4iKTsKKyAgICAgICAgaWYgKGluZXRfbnRvcCAoQUZfSU5FVCwgJmFkZHIuaXB2NC5zaW5fYWRkciwgaG9zdGlwLCBzaXplb2YgKGhvc3RpcCkpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGluZGVudCAoZGVwdGgrMSk7CisgICAgICAgICAgICBwcmludGYgKCJuYW1lICVzIHBvcnQgJXVcbiIsIGhvc3RpcCwgbnRvaHMgKGFkZHIuaXB2NC5zaW5fcG9ydCkpOworICAgICAgICAgIH0KKyAgICAgICAgaWYgKGhhc19wZWVyICYmIGluZXRfbnRvcCAoQUZfSU5FVCwgJnBlZXIuaXB2NC5zaW5fYWRkciwgaG9zdGlwLCBzaXplb2YgKGhvc3RpcCkpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGluZGVudCAoZGVwdGgrMSk7CisgICAgICAgICAgICBwcmludGYgKCJwZWVyICVzIHBvcnQgJXVcbiIsIGhvc3RpcCwgbnRvaHMgKHBlZXIuaXB2NC5zaW5fcG9ydCkpOworICAgICAgICAgIH0KKworICAgICAgICBicmVhazsKKworI2lmZGVmIEFGX0lORVQ2CisgICAgICBjYXNlIEFGX0lORVQ2OgorICAgICAgICBwcmludGYgKCJpbmV0NlxuIik7CisgICAgICAgIGlmIChpbmV0X250b3AgKEFGX0lORVQ2LCAmYWRkci5pcHY2LnNpbjZfYWRkciwgaG9zdGlwLCBzaXplb2YgKGhvc3RpcCkpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGluZGVudCAoZGVwdGgrMSk7CisgICAgICAgICAgICBwcmludGYgKCJuYW1lICVzIHBvcnQgJXVcbiIsIGhvc3RpcCwgbnRvaHMgKGFkZHIuaXB2Ni5zaW42X3BvcnQpKTsKKyAgICAgICAgICB9CisgICAgICAgIGlmIChoYXNfcGVlciAmJiBpbmV0X250b3AgKEFGX0lORVQ2LCAmcGVlci5pcHY2LnNpbjZfYWRkciwgaG9zdGlwLCBzaXplb2YgKGhvc3RpcCkpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGluZGVudCAoZGVwdGgrMSk7CisgICAgICAgICAgICBwcmludGYgKCJwZWVyICVzIHBvcnQgJXVcbiIsIGhvc3RpcCwgbnRvaHMgKHBlZXIuaXB2Ni5zaW42X3BvcnQpKTsKKyAgICAgICAgICB9CisgICAgICAgIGJyZWFrOworI2VuZGlmCisKKyNpZmRlZiBBRl9CTFVFVE9PVEgKKyAgICAgIGNhc2UgQUZfQkxVRVRPT1RIOgorICAgICAgICBwcmludGYgKCJibHVldG9vdGhcbiIpOworICAgICAgICBicmVhazsKKyNlbmRpZgorCisgICAgICBkZWZhdWx0OgorICAgICAgICBwcmludGYgKCJ1bmtub3duICglZClcbiIsIGFkZHIuc2Euc2FfZmFtaWx5KTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkCitwcmludF9pdGVyIChEQnVzTWVzc2FnZUl0ZXIgKml0ZXIsIGRidXNfYm9vbF90IGxpdGVyYWwsIGludCBkZXB0aCkKK3sKKyAgZG8KKyAgICB7CisgICAgICBpbnQgdHlwZSA9IGRidXNfbWVzc2FnZV9pdGVyX2dldF9hcmdfdHlwZSAoaXRlcik7CisKKyAgICAgIGlmICh0eXBlID09IERCVVNfVFlQRV9JTlZBTElEKQorICAgICAgICBicmVhazsKKyAgICAgIAorICAgICAgaW5kZW50KGRlcHRoKTsKKworICAgICAgc3dpdGNoICh0eXBlKQorICAgICAgICB7CisgICAgICAgIGNhc2UgREJVU19UWVBFX1NUUklORzoKKyAgICAgICAgICB7CisgICAgICAgICAgICBjaGFyICp2YWw7CisgICAgICAgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYmFzaWMgKGl0ZXIsICZ2YWwpOworICAgICAgICAgICAgaWYgKCFsaXRlcmFsKQorICAgICAgICAgICAgICBwcmludGYgKCJzdHJpbmcgXCIiKTsKKyAgICAgICAgICAgIHByaW50ZiAoIiVzIiwgdmFsKTsKKyAgICAgICAgICAgIGlmICghbGl0ZXJhbCkKKyAgICAgICAgICAgICAgcHJpbnRmICgiXCJcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgREJVU19UWVBFX1NJR05BVFVSRToKKyAgICAgICAgICB7CisgICAgICAgICAgICBjaGFyICp2YWw7CisgICAgICAgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYmFzaWMgKGl0ZXIsICZ2YWwpOworICAgICAgICAgICAgaWYgKCFsaXRlcmFsKQorICAgICAgICAgICAgICBwcmludGYgKCJzaWduYXR1cmUgXCIiKTsKKyAgICAgICAgICAgIHByaW50ZiAoIiVzIiwgdmFsKTsKKyAgICAgICAgICAgIGlmICghbGl0ZXJhbCkKKyAgICAgICAgICAgICAgcHJpbnRmICgiXCJcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgREJVU19UWVBFX09CSkVDVF9QQVRIOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIGNoYXIgKnZhbDsKKyAgICAgICAgICAgIGRidXNfbWVzc2FnZV9pdGVyX2dldF9iYXNpYyAoaXRlciwgJnZhbCk7CisgICAgICAgICAgICBpZiAoIWxpdGVyYWwpCisgICAgICAgICAgICAgIHByaW50ZiAoIm9iamVjdCBwYXRoIFwiIik7CisgICAgICAgICAgICBwcmludGYgKCIlcyIsIHZhbCk7CisgICAgICAgICAgICBpZiAoIWxpdGVyYWwpCisgICAgICAgICAgICAgIHByaW50ZiAoIlwiXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKworICAgICAgICBjYXNlIERCVVNfVFlQRV9JTlQxNjoKKyAgICAgICAgICB7CisgICAgICAgICAgICBkYnVzX2ludDE2X3QgdmFsOworICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2Jhc2ljIChpdGVyLCAmdmFsKTsKKyAgICAgICAgICAgIHByaW50ZiAoImludDE2ICVkXG4iLCB2YWwpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgREJVU19UWVBFX1VJTlQxNjoKKyAgICAgICAgICB7CisgICAgICAgICAgICBkYnVzX3VpbnQxNl90IHZhbDsKKyAgICAgICAgICAgIGRidXNfbWVzc2FnZV9pdGVyX2dldF9iYXNpYyAoaXRlciwgJnZhbCk7CisgICAgICAgICAgICBwcmludGYgKCJ1aW50MTYgJXVcbiIsIHZhbCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBEQlVTX1RZUEVfSU5UMzI6CisgICAgICAgICAgeworICAgICAgICAgICAgZGJ1c19pbnQzMl90IHZhbDsKKyAgICAgICAgICAgIGRidXNfbWVzc2FnZV9pdGVyX2dldF9iYXNpYyAoaXRlciwgJnZhbCk7CisgICAgICAgICAgICBwcmludGYgKCJpbnQzMiAlZFxuIiwgdmFsKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKworICAgICAgICBjYXNlIERCVVNfVFlQRV9VSU5UMzI6CisgICAgICAgICAgeworICAgICAgICAgICAgZGJ1c191aW50MzJfdCB2YWw7CisgICAgICAgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYmFzaWMgKGl0ZXIsICZ2YWwpOworICAgICAgICAgICAgcHJpbnRmICgidWludDMyICV1XG4iLCB2YWwpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgREJVU19UWVBFX0lOVDY0OgorICAgICAgICAgIHsKKyAgICAgICAgICAgIGRidXNfaW50NjRfdCB2YWw7CisgICAgICAgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9nZXRfYmFzaWMgKGl0ZXIsICZ2YWwpOworICAgICAgICAgICAgcHJpbnRmICgiaW50NjQgJSIgUFJJZDY0ICJcbiIsIHZhbCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBEQlVTX1RZUEVfVUlOVDY0OgorICAgICAgICAgIHsKKyAgICAgICAgICAgIGRidXNfdWludDY0X3QgdmFsOworICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2Jhc2ljIChpdGVyLCAmdmFsKTsKKyAgICAgICAgICAgIHByaW50ZiAoInVpbnQ2NCAlIiBQUkl1NjQgIlxuIiwgdmFsKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKworICAgICAgICBjYXNlIERCVVNfVFlQRV9ET1VCTEU6CisgICAgICAgICAgeworICAgICAgICAgICAgZG91YmxlIHZhbDsKKyAgICAgICAgICAgIGRidXNfbWVzc2FnZV9pdGVyX2dldF9iYXNpYyAoaXRlciwgJnZhbCk7CisgICAgICAgICAgICBwcmludGYgKCJkb3VibGUgJWdcbiIsIHZhbCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBEQlVTX1RZUEVfQllURToKKyAgICAgICAgICB7CisgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIHZhbDsKKyAgICAgICAgICAgIGRidXNfbWVzc2FnZV9pdGVyX2dldF9iYXNpYyAoaXRlciwgJnZhbCk7CisgICAgICAgICAgICBwcmludGYgKCJieXRlICVkXG4iLCB2YWwpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgREJVU19UWVBFX0JPT0xFQU46CisgICAgICAgICAgeworICAgICAgICAgICAgZGJ1c19ib29sX3QgdmFsOworICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2Jhc2ljIChpdGVyLCAmdmFsKTsKKyAgICAgICAgICAgIHByaW50ZiAoImJvb2xlYW4gJXNcbiIsIHZhbCA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgREJVU19UWVBFX1ZBUklBTlQ6CisgICAgICAgICAgeworICAgICAgICAgICAgREJ1c01lc3NhZ2VJdGVyIHN1Yml0ZXI7CisKKyAgICAgICAgICAgIGRidXNfbWVzc2FnZV9pdGVyX3JlY3Vyc2UgKGl0ZXIsICZzdWJpdGVyKTsKKworICAgICAgICAgICAgcHJpbnRmICgidmFyaWFudCAiKTsKKyAgICAgICAgICAgIHByaW50X2l0ZXIgKCZzdWJpdGVyLCBsaXRlcmFsLCBkZXB0aCsxKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgY2FzZSBEQlVTX1RZUEVfQVJSQVk6CisgICAgICAgICAgeworICAgICAgICAgICAgaW50IGN1cnJlbnRfdHlwZTsKKyAgICAgICAgICAgIERCdXNNZXNzYWdlSXRlciBzdWJpdGVyOworCisgICAgICAgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9yZWN1cnNlIChpdGVyLCAmc3ViaXRlcik7CisKKyAgICAgICAgICAgIGN1cnJlbnRfdHlwZSA9IGRidXNfbWVzc2FnZV9pdGVyX2dldF9hcmdfdHlwZSAoJnN1Yml0ZXIpOworCisgICAgICAgICAgICBpZiAoY3VycmVudF90eXBlID09IERCVVNfVFlQRV9CWVRFKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnRfYXkgKCZzdWJpdGVyLCBkZXB0aCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJpbnRmKCJhcnJheSBbXG4iKTsKKyAgICAgICAgICAgIHdoaWxlIChjdXJyZW50X3R5cGUgIT0gREJVU19UWVBFX0lOVkFMSUQpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcmludF9pdGVyICgmc3ViaXRlciwgbGl0ZXJhbCwgZGVwdGgrMSk7CisKKyAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9uZXh0ICgmc3ViaXRlcik7CisgICAgICAgICAgICAgICAgY3VycmVudF90eXBlID0gZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2FyZ190eXBlICgmc3ViaXRlcik7CisKKyAgICAgICAgICAgICAgICBpZiAoY3VycmVudF90eXBlICE9IERCVVNfVFlQRV9JTlZBTElEKQorICAgICAgICAgICAgICAgICAgcHJpbnRmICgiLCIpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICBpbmRlbnQoZGVwdGgpOworICAgICAgICAgICAgcHJpbnRmKCJdXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgY2FzZSBEQlVTX1RZUEVfRElDVF9FTlRSWToKKyAgICAgICAgICB7CisgICAgICAgICAgICBEQnVzTWVzc2FnZUl0ZXIgc3ViaXRlcjsKKworICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2l0ZXJfcmVjdXJzZSAoaXRlciwgJnN1Yml0ZXIpOworCisgICAgICAgICAgICBwcmludGYoImRpY3QgZW50cnkoXG4iKTsKKyAgICAgICAgICAgIHByaW50X2l0ZXIgKCZzdWJpdGVyLCBsaXRlcmFsLCBkZXB0aCsxKTsKKyAgICAgICAgICAgIGRidXNfbWVzc2FnZV9pdGVyX25leHQgKCZzdWJpdGVyKTsKKyAgICAgICAgICAgIHByaW50X2l0ZXIgKCZzdWJpdGVyLCBsaXRlcmFsLCBkZXB0aCsxKTsKKyAgICAgICAgICAgIGluZGVudChkZXB0aCk7CisgICAgICAgICAgICBwcmludGYoIilcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgREJVU19UWVBFX1NUUlVDVDoKKyAgICAgICAgICB7CisgICAgICAgICAgICBpbnQgY3VycmVudF90eXBlOworICAgICAgICAgICAgREJ1c01lc3NhZ2VJdGVyIHN1Yml0ZXI7CisKKyAgICAgICAgICAgIGRidXNfbWVzc2FnZV9pdGVyX3JlY3Vyc2UgKGl0ZXIsICZzdWJpdGVyKTsKKworICAgICAgICAgICAgcHJpbnRmKCJzdHJ1Y3Qge1xuIik7CisgICAgICAgICAgICB3aGlsZSAoKGN1cnJlbnRfdHlwZSA9IGRidXNfbWVzc2FnZV9pdGVyX2dldF9hcmdfdHlwZSAoJnN1Yml0ZXIpKSAhPSBEQlVTX1RZUEVfSU5WQUxJRCkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByaW50X2l0ZXIgKCZzdWJpdGVyLCBsaXRlcmFsLCBkZXB0aCsxKTsKKyAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9uZXh0ICgmc3ViaXRlcik7CisgICAgICAgICAgICAgICAgaWYgKGRidXNfbWVzc2FnZV9pdGVyX2dldF9hcmdfdHlwZSAoJnN1Yml0ZXIpICE9IERCVVNfVFlQRV9JTlZBTElEKQorICAgICAgICAgICAgICAgICAgcHJpbnRmICgiLCIpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICBpbmRlbnQoZGVwdGgpOworICAgICAgICAgICAgcHJpbnRmKCJ9XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKworI2lmZGVmIERCVVNfVU5JWAorICAgICAgICBjYXNlIERCVVNfVFlQRV9VTklYX0ZEOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIGludCBmZDsKKyAgICAgICAgICAgIGRidXNfbWVzc2FnZV9pdGVyX2dldF9iYXNpYyAoaXRlciwgJmZkKTsKKworICAgICAgICAgICAgcHJpbnRfZmQgKGZkLCBkZXB0aCsxKTsKKworICAgICAgICAgICAgLyogZGJ1c19tZXNzYWdlX2l0ZXJfZ2V0X2Jhc2ljKCkgZHVwbGljYXRlZCB0aGUgZmQsIHdlIG5lZWQgdG8KKyAgICAgICAgICAgICAqIGNsb3NlIGl0IGFmdGVyIHVzZS4gVGhlIG9yaWdpbmFsIGZkIHdpbGwgYmUgY2xvc2VkIHdoZW4gdGhlCisgICAgICAgICAgICAgKiBEQnVzTWVzc2FnZSBpcyByZWxlYXNlZC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgY2xvc2UgKGZkKTsKKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBwcmludGYgKCIgKGRidXMtbW9uaXRvciB0b28gZHVtYiB0byBkZWNpcGhlciBhcmcgdHlwZSAnJWMnKVxuIiwgdHlwZSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9IHdoaWxlIChkYnVzX21lc3NhZ2VfaXRlcl9uZXh0IChpdGVyKSk7Cit9CisKK3ZvaWQKK3ByaW50X21lc3NhZ2UgKERCdXNNZXNzYWdlICptZXNzYWdlLCBkYnVzX2Jvb2xfdCBsaXRlcmFsLCBsb25nIHNlYywgbG9uZyB1c2VjKQoreworICBEQnVzTWVzc2FnZUl0ZXIgaXRlcjsKKyAgY29uc3QgY2hhciAqc2VuZGVyOworICBjb25zdCBjaGFyICpkZXN0aW5hdGlvbjsKKyAgaW50IG1lc3NhZ2VfdHlwZTsKKworICBtZXNzYWdlX3R5cGUgPSBkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKG1lc3NhZ2UpOworICBzZW5kZXIgPSBkYnVzX21lc3NhZ2VfZ2V0X3NlbmRlciAobWVzc2FnZSk7CisgIGRlc3RpbmF0aW9uID0gZGJ1c19tZXNzYWdlX2dldF9kZXN0aW5hdGlvbiAobWVzc2FnZSk7CisgIAorICBpZiAoIWxpdGVyYWwpCisgICAgeworICAgICAgaWYgKHNlYyAhPSAwIHx8IHVzZWMgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgIHByaW50ZiAoIiVzIHRpbWU9JWxkLiUwNmxkIHNlbmRlcj0lcyAtPiBkZXN0aW5hdGlvbj0lcyIsCisgICAgICAgICAgICAgICAgICB0eXBlX3RvX25hbWUgKG1lc3NhZ2VfdHlwZSksIHNlYywgdXNlYywKKyAgICAgICAgICAgICAgICAgIHNlbmRlciA/IHNlbmRlciA6ICIobnVsbCBzZW5kZXIpIiwKKyAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uID8gZGVzdGluYXRpb24gOiAiKG51bGwgZGVzdGluYXRpb24pIik7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHByaW50ZiAoIiVzIHNlbmRlcj0lcyAtPiBkZXN0aW5hdGlvbj0lcyIsCisgICAgICAgICAgICAgICAgICB0eXBlX3RvX25hbWUgKG1lc3NhZ2VfdHlwZSksCisgICAgICAgICAgICAgICAgICBzZW5kZXIgPyBzZW5kZXIgOiAiKG51bGwgc2VuZGVyKSIsCisgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbiA/IGRlc3RpbmF0aW9uIDogIihudWxsIGRlc3RpbmF0aW9uKSIpOworICAgICAgICB9CisKKyAgICAgIHN3aXRjaCAobWVzc2FnZV90eXBlKQorICAgICAgICB7CisgICAgICAgIGNhc2UgREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX0NBTEw6CisgICAgICAgIGNhc2UgREJVU19NRVNTQUdFX1RZUEVfU0lHTkFMOgorICAgICAgICAgIHByaW50ZiAoIiBzZXJpYWw9JXUgcGF0aD0lczsgaW50ZXJmYWNlPSVzOyBtZW1iZXI9JXNcbiIsCisgICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3NlcmlhbCAobWVzc2FnZSksCisgICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3BhdGggKG1lc3NhZ2UpLAorICAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9pbnRlcmZhY2UgKG1lc3NhZ2UpLAorICAgICAgICAgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9tZW1iZXIgKG1lc3NhZ2UpKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIAorICAgICAgICBjYXNlIERCVVNfTUVTU0FHRV9UWVBFX01FVEhPRF9SRVRVUk46CisgICAgICAgICAgcHJpbnRmICgiIHNlcmlhbD0ldSByZXBseV9zZXJpYWw9JXVcbiIsCisgICAgICAgICAgICAgICAgICBkYnVzX21lc3NhZ2VfZ2V0X3NlcmlhbCAobWVzc2FnZSksCisgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9yZXBseV9zZXJpYWwgKG1lc3NhZ2UpKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIERCVVNfTUVTU0FHRV9UWVBFX0VSUk9SOgorICAgICAgICAgIHByaW50ZiAoIiBlcnJvcl9uYW1lPSVzIHJlcGx5X3NlcmlhbD0ldVxuIiwKKyAgICAgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9nZXRfZXJyb3JfbmFtZSAobWVzc2FnZSksCisgICAgICAgICAgZGJ1c19tZXNzYWdlX2dldF9yZXBseV9zZXJpYWwgKG1lc3NhZ2UpKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHByaW50ZiAoIlxuIik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgZGJ1c19tZXNzYWdlX2l0ZXJfaW5pdCAobWVzc2FnZSwgJml0ZXIpOworICBwcmludF9pdGVyICgmaXRlciwgbGl0ZXJhbCwgMSk7CisgIGZmbHVzaCAoc3Rkb3V0KTsKKyAgCit9CisKZGlmZiAtLWdpdCBhL3Rvb2xzL2RidXMtcHJpbnQtbWVzc2FnZS5oIGIvdG9vbHMvZGJ1cy1wcmludC1tZXNzYWdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ1YmM3OQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2RidXMtcHJpbnQtbWVzc2FnZS5oCkBAIC0wLDAgKzEsMzEgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1wcmludC1tZXNzYWdlLmggIFV0aWxpdHkgZnVuY3Rpb24gdG8gcHJpbnQgb3V0IGEgbWVzc2FnZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBQaGlsaXAgQmx1bmRlbGwgPHBoaWxiQGdudS5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgUmVkIEhhdCwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworI2lmbmRlZiBEQlVTX1BSSU5UX01FU1NBR0VfSAorI2RlZmluZSBEQlVTX1BSSU5UX01FU1NBR0VfSAorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMuaD4KKwordm9pZCBwcmludF9tZXNzYWdlIChEQnVzTWVzc2FnZSAqbWVzc2FnZSwgZGJ1c19ib29sX3QgbGl0ZXJhbCwgbG9uZyBzZWMsIGxvbmcgdXNlYyk7CisKKyNlbmRpZiAvKiBEQlVTX1BSSU5UX01FU1NBR0VfSCAqLwpkaWZmIC0tZ2l0IGEvdG9vbHMvZGJ1cy1ydW4tc2Vzc2lvbi5jIGIvdG9vbHMvZGJ1cy1ydW4tc2Vzc2lvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhZGI1YWQKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9kYnVzLXJ1bi1zZXNzaW9uLmMKQEAgLTAsMCArMSw0NzYgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogZGJ1cy1ydW4tc2Vzc2lvbi5jIC0gcnVuIGEgY2hpbGQgcHJvY2VzcyBpbiBpdHMgb3duIHNlc3Npb24KKyAqCisgKiBDb3B5cmlnaHQgwqkgMjAwMy0yMDA2IFJlZCBIYXQsIEluYy4KKyAqIENvcHlyaWdodCDCqSAyMDA2IFRoaWFnbyBNYWNpZWlyYSA8dGhpYWdvQGtkZS5vcmc+CisgKiBDb3B5cmlnaHQgwqkgMjAxMS0yMDEyIE5va2lhIENvcnBvcmF0aW9uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSB2ZXJzaW9uIDIuMQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorCisjaW5jbHVkZSAiZGJ1cy9kYnVzLmgiCisjaW5jbHVkZSAiZGJ1cy9kYnVzLWludGVybmFscy5oIgorCisjZGVmaW5lIE1BWF9BRERSX0xFTiA1MTIKKyNkZWZpbmUgUElQRV9SRUFEX0VORCAgMAorI2RlZmluZSBQSVBFX1dSSVRFX0VORCAxCisKKy8qIFBST0NFU1NFUworICoKKyAqIElmIHlvdSBhcmUgaW4gYSBzaGVsbCBhbmQgcnVuICJkYnVzLXJ1bi1zZXNzaW9uIG15YXBwIiwgaGVyZSBpcyB3aGF0CisgKiBoYXBwZW5zIChjb21wYXJlIGFuZCBjb250cmFzdCB3aXRoIGRidXMtbGF1bmNoKToKKyAqCisgKiBzaGVsbAorICogICBcLSBkYnVzLXJ1bi1zZXNzaW9uIG15YXBwCisgKiAgICAgIFwtIGRidXMtZGFlbW9uIC0tbm9mb3JrIC0tcHJpbnQtYWRkcmVzcyAtLXNlc3Npb24KKyAqICAgICAgXC0gbXlhcHAKKyAqCisgKiBBbGwgcHJvY2Vzc2VzIGFyZSBsb25nLXJ1bm5pbmcuCisgKgorICogV2hlbiBteWFwcCBleGl0cywgZGJ1cy1ydW4tc2Vzc2lvbiBraWxscyBkYnVzLWRhZW1vbiBhbmQgdGVybWluYXRlcy4KKyAqCisgKiBJZiBkYnVzLWRhZW1vbiBleGl0cywgZGJ1cy1ydW4tc2Vzc2lvbiB3YXJucyBhbmQgY29udGludWVzIHRvIHJ1bi4KKyAqCisgKiBQSVBFUworICoKKyAqIGRidXMtZGFlbW9uIC0tcHJpbnQtYWRkcmVzcyAtPiBidXNfYWRkcmVzc19waXBlIC0+IGQtci1zCisgKi8KKworc3RhdGljIGNvbnN0IGNoYXIgbWVbXSA9ICJkYnVzLXJ1bi1zZXNzaW9uIjsKKworc3RhdGljIHZvaWQgdXNhZ2UgKGludCBlY29kZSkgX0RCVVNfR05VQ19OT1JFVFVSTjsKKworc3RhdGljIHZvaWQKK3VzYWdlIChpbnQgZWNvZGUpCit7CisgIGZwcmludGYgKHN0ZGVyciwKKyAgICAgICIlcyBbT1BUSU9OU10gWy0tXSBQUk9HUkFNIFtBUkdVTUVOVFNdXG4iCisgICAgICAiJXMgLS12ZXJzaW9uXG4iCisgICAgICAiJXMgLS1oZWxwXG4iCisgICAgICAiXG4iCisgICAgICAiT3B0aW9uczpcbiIKKyAgICAgICItLWRidXMtZGFlbW9uPUJJTkFSWSAgICAgICBydW4gQklOQVJZIGluc3RlYWQgb2YgZGJ1cy1kYWVtb25cbiIKKyAgICAgICItLWNvbmZpZy1maWxlPUZJTEVOQU1FICAgICBwYXNzIHRvIGRidXMtZGFlbW9uIGluc3RlYWQgb2YgLS1zZXNzaW9uXG4iCisgICAgICAiXG4iLAorICAgICAgbWUsIG1lLCBtZSk7CisgIGV4aXQgKGVjb2RlKTsKK30KKworc3RhdGljIHZvaWQgdmVyc2lvbiAodm9pZCkgX0RCVVNfR05VQ19OT1JFVFVSTjsKKworc3RhdGljIHZvaWQKK3ZlcnNpb24gKHZvaWQpCit7CisgIHByaW50ZiAoIiVzICVzXG4iCisgICAgICAgICAgIkNvcHlyaWdodCAoQykgMjAwMy0yMDA2IFJlZCBIYXQsIEluYy5cbiIKKyAgICAgICAgICAiQ29weXJpZ2h0IChDKSAyMDA2IFRoaWFnbyBNYWNpZWlyYVxuIgorICAgICAgICAgICJDb3B5cmlnaHQgwqkgMjAxMS0yMDEyIE5va2lhIENvcnBvcmF0aW9uXG4iCisgICAgICAgICAgIlxuIgorICAgICAgICAgICJUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHNlZSB0aGUgc291cmNlIGZvciBjb3B5aW5nIGNvbmRpdGlvbnMuXG4iCisgICAgICAgICAgIlRoZXJlIGlzIE5PIHdhcnJhbnR5OyBub3QgZXZlbiBmb3IgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLlxuIiwKKyAgICAgICAgICBtZSwgVkVSU0lPTik7CisgIGV4aXQgKDApOworfQorCitzdGF0aWMgdm9pZCBvb20gKHZvaWQpIF9EQlVTX0dOVUNfTk9SRVRVUk47CisKK3N0YXRpYyB2b2lkCitvb20gKHZvaWQpCit7CisgIGZwcmludGYgKHN0ZGVyciwgIiVzOiBvdXQgb2YgbWVtb3J5XG4iLCBtZSk7CisgIGV4aXQgKDEpOworfQorCit0eXBlZGVmIGVudW0KK3sKKyAgUkVBRF9TVEFUVVNfT0ssICAgIC8qKjwgUmVhZCBzdWNjZWVkZWQgKi8KKyAgUkVBRF9TVEFUVVNfRVJST1IsIC8qKjwgU29tZSBraW5kIG9mIGVycm9yICovCisgIFJFQURfU1RBVFVTX0VPRiAgICAvKio8IEVPRiByZXR1cm5lZCAqLworfSBSZWFkU3RhdHVzOworCitzdGF0aWMgUmVhZFN0YXR1cworcmVhZF9saW5lIChpbnQgICAgICAgIGZkLAorICAgICAgICAgICBjaGFyICAgICAgKmJ1ZiwKKyAgICAgICAgICAgc2l6ZV90ICAgICBtYXhsZW4pCit7CisgIHNpemVfdCBieXRlcyA9IDA7CisgIFJlYWRTdGF0dXMgcmV0dmFsOworCisgIG1lbXNldCAoYnVmLCAnXDAnLCBtYXhsZW4pOworICBtYXhsZW4gLT0gMTsgLyogZW5zdXJlIG51bCB0ZXJtICovCisKKyAgcmV0dmFsID0gUkVBRF9TVEFUVVNfT0s7CisKKyAgd2hpbGUgKDEpCisgICAgeworICAgICAgc3NpemVfdCBjaHVuazsKKyAgICAgIHNpemVfdCB0b19yZWFkOworCisgICAgYWdhaW46CisgICAgICB0b19yZWFkID0gbWF4bGVuIC0gYnl0ZXM7CisKKyAgICAgIGlmICh0b19yZWFkID09IDApCisgICAgICAgIGJyZWFrOworCisgICAgICBjaHVuayA9IHJlYWQgKGZkLAorICAgICAgICAgICAgICAgICAgICBidWYgKyBieXRlcywKKyAgICAgICAgICAgICAgICAgICAgdG9fcmVhZCk7CisgICAgICBpZiAoY2h1bmsgPCAwICYmIGVycm5vID09IEVJTlRSKQorICAgICAgICBnb3RvIGFnYWluOworCisgICAgICBpZiAoY2h1bmsgPCAwKQorICAgICAgICB7CisgICAgICAgICAgcmV0dmFsID0gUkVBRF9TVEFUVVNfRVJST1I7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKGNodW5rID09IDApCisgICAgICAgIHsKKyAgICAgICAgICByZXR2YWwgPSBSRUFEX1NUQVRVU19FT0Y7CisgICAgICAgICAgYnJlYWs7IC8qIEVPRiAqLworICAgICAgICB9CisgICAgICBlbHNlIC8qIGNodW5rID4gMCAqLworICAgICAgICBieXRlcyArPSBjaHVuazsKKyAgICB9CisKKyAgaWYgKHJldHZhbCA9PSBSRUFEX1NUQVRVU19FT0YgJiYKKyAgICAgIGJ5dGVzID4gMCkKKyAgICByZXR2YWwgPSBSRUFEX1NUQVRVU19PSzsKKworICAvKiB3aGFjayBuZXdsaW5lICovCisgIGlmIChyZXR2YWwgIT0gUkVBRF9TVEFUVVNfRVJST1IgJiYKKyAgICAgIGJ5dGVzID4gMCAmJgorICAgICAgYnVmW2J5dGVzLTFdID09ICdcbicpCisgICAgYnVmW2J5dGVzLTFdID0gJ1wwJzsKKworICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdm9pZAorZXhlY19kYnVzX2RhZW1vbiAoY29uc3QgY2hhciAqZGJ1c19kYWVtb24sCisgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICBidXNfYWRkcmVzc19waXBlWzJdLAorICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqY29uZmlnX2ZpbGUpCit7CisgIC8qIENoaWxkIHByb2Nlc3MsIHdoaWNoIGV4ZWNzIGRidXMtZGFlbW9uIG9yIGRpZXMgdHJ5aW5nICovCisjZGVmaW5lIE1BWF9GRF9MRU4gNjQKKyAgY2hhciB3cml0ZV9hZGRyZXNzX2ZkX2FzX3N0cmluZ1tNQVhfRkRfTEVOXTsKKworICBjbG9zZSAoYnVzX2FkZHJlc3NfcGlwZVtQSVBFX1JFQURfRU5EXSk7CisKKyAgc3ByaW50ZiAod3JpdGVfYWRkcmVzc19mZF9hc19zdHJpbmcsICIlZCIsIGJ1c19hZGRyZXNzX3BpcGVbUElQRV9XUklURV9FTkRdKTsKKworICBleGVjbHAgKGRidXNfZGFlbW9uLAorICAgICAgICAgIGRidXNfZGFlbW9uLAorICAgICAgICAgICItLW5vZm9yayIsCisgICAgICAgICAgIi0tcHJpbnQtYWRkcmVzcyIsIHdyaXRlX2FkZHJlc3NfZmRfYXNfc3RyaW5nLAorICAgICAgICAgIGNvbmZpZ19maWxlID8gIi0tY29uZmlnLWZpbGUiIDogIi0tc2Vzc2lvbiIsCisgICAgICAgICAgY29uZmlnX2ZpbGUsIC8qIGhhcyB0byBiZSBsYXN0IGluIHRoaXMgdmFyYXJncyBsaXN0ICovCisgICAgICAgICAgTlVMTCk7CisKKyAgZnByaW50ZiAoc3RkZXJyLCAiJXM6IGZhaWxlZCB0byBleGVjdXRlIG1lc3NhZ2UgYnVzIGRhZW1vbiAnJXMnOiAlc1xuIiwKKyAgICAgICAgICAgbWUsIGRidXNfZGFlbW9uLCBzdHJlcnJvciAoZXJybm8pKTsKK30KKworc3RhdGljIHZvaWQgZXhlY19hcHAgKGludCBwcm9nX2FyZywgY2hhciAqKmFyZ3YpIF9EQlVTX0dOVUNfTk9SRVRVUk47CisKK3N0YXRpYyB2b2lkCitleGVjX2FwcCAoaW50IHByb2dfYXJnLCBjaGFyICoqYXJndikKK3sKKyAgZXhlY3ZwIChhcmd2W3Byb2dfYXJnXSwgYXJndiArIHByb2dfYXJnKTsKKworICBmcHJpbnRmIChzdGRlcnIsICIlczogZmFpbGVkIHRvIGV4ZWMgJyVzJzogJXNcbiIsIG1lLCBhcmd2W3Byb2dfYXJnXSwKKyAgICAgICAgICAgc3RyZXJyb3IgKGVycm5vKSk7CisgIGV4aXQgKDEpOworfQorCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgaW50IHByb2dfYXJnID0gMDsKKyAgaW50IGJ1c19hZGRyZXNzX3BpcGVbMl0gPSB7IDAsIDAgfTsKKyAgY29uc3QgY2hhciAqY29uZmlnX2ZpbGUgPSBOVUxMOworICBjb25zdCBjaGFyICpkYnVzX2RhZW1vbiA9IE5VTEw7CisgIGNoYXIgYnVzX2FkZHJlc3NbTUFYX0FERFJfTEVOXSA9IHsgMCB9OworICBjb25zdCBjaGFyICpwcmV2X2FyZyA9IE5VTEw7CisgIGludCBpID0gMTsKKyAgaW50IHJlcXVpcmVzX2FyZyA9IDA7CisgIHBpZF90IGJ1c19waWQ7CisgIHBpZF90IGFwcF9waWQ7CisKKyAgd2hpbGUgKGkgPCBhcmdjKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKmFyZyA9IGFyZ3ZbaV07CisKKyAgICAgIGlmIChyZXF1aXJlc19hcmcpCisgICAgICAgIHsKKyAgICAgICAgICBjb25zdCBjaGFyICoqYXJnX2Rlc3Q7CisKKyAgICAgICAgICBhc3NlcnQgKHByZXZfYXJnICE9IE5VTEwpOworCisgICAgICAgICAgaWYgKHN0cmNtcCAocHJldl9hcmcsICItLWNvbmZpZy1maWxlIikgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgYXJnX2Rlc3QgPSAmY29uZmlnX2ZpbGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZSBpZiAoc3RyY21wIChwcmV2X2FyZywgIi0tZGJ1cy1kYWVtb24iKSA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBhcmdfZGVzdCA9ICZkYnVzX2RhZW1vbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8qIHNob3VsZG4ndCBoYXBwZW4gKi8KKyAgICAgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6IGludGVybmFsIGVycm9yOiAlcyBub3QgZnVsbHkgaW1wbGVtZW50ZWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIG1lLCBwcmV2X2FyZyk7CisgICAgICAgICAgICAgIHJldHVybiAxMjc7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoKmFyZ19kZXN0ICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiAlcyBnaXZlbiB0d2ljZVxuIiwgbWUsIHByZXZfYXJnKTsKKyAgICAgICAgICAgICAgcmV0dXJuIDEyNzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICphcmdfZGVzdCA9IGFyZzsKKyAgICAgICAgICByZXF1aXJlc19hcmcgPSAwOworICAgICAgICAgIHByZXZfYXJnID0gYXJnOworICAgICAgICAgICsraTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICBpZiAoc3RyY21wIChhcmcsICItLWhlbHAiKSA9PSAwIHx8CisgICAgICAgICAgc3RyY21wIChhcmcsICItaCIpID09IDAgfHwKKyAgICAgICAgICBzdHJjbXAgKGFyZywgIi0/IikgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIHVzYWdlICgwKTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICItLXZlcnNpb24iKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgdmVyc2lvbiAoKTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoc3Ryc3RyIChhcmcsICItLWNvbmZpZy1maWxlPSIpID09IGFyZykKKyAgICAgICAgeworICAgICAgICAgIGNvbnN0IGNoYXIgKmZpbGU7CisKKyAgICAgICAgICBpZiAoY29uZmlnX2ZpbGUgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6IC0tY29uZmlnLWZpbGUgZ2l2ZW4gdHdpY2VcbiIsIG1lKTsKKyAgICAgICAgICAgICAgcmV0dXJuIDEyNzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGZpbGUgPSBzdHJjaHIgKGFyZywgJz0nKTsKKyAgICAgICAgICArK2ZpbGU7CisKKyAgICAgICAgICBjb25maWdfZmlsZSA9IGZpbGU7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHN0cnN0ciAoYXJnLCAiLS1kYnVzLWRhZW1vbj0iKSA9PSBhcmcpCisgICAgICAgIHsKKyAgICAgICAgICBjb25zdCBjaGFyICpmaWxlOworCisgICAgICAgICAgaWYgKGRidXNfZGFlbW9uICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiAtLWRidXMtZGFlbW9uIGdpdmVuIHR3aWNlXG4iLCBtZSk7CisgICAgICAgICAgICAgIHJldHVybiAxMjc7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBmaWxlID0gc3RyY2hyIChhcmcsICc9Jyk7CisgICAgICAgICAgKytmaWxlOworCisgICAgICAgICAgZGJ1c19kYWVtb24gPSBmaWxlOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgIi0tY29uZmlnLWZpbGUiKSA9PSAwIHx8CisgICAgICAgICAgICAgICBzdHJjbXAgKGFyZywgIi0tZGJ1cy1kYWVtb24iKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgcmVxdWlyZXNfYXJnID0gMTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoYXJnWzBdID09ICctJykKKyAgICAgICAgeworICAgICAgICAgIGlmIChzdHJjbXAgKGFyZywgIi0tIikgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6IG9wdGlvbiAnJXMnIGlzIHVua25vd25cbiIsIG1lLCBhcmcpOworICAgICAgICAgICAgICByZXR1cm4gMTI3OworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcHJvZ19hcmcgPSBpICsgMTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHByb2dfYXJnID0gaTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICBwcmV2X2FyZyA9IGFyZzsKKyAgICAgICsraTsKKyAgICB9CisKKyAgLyogImRidXMtcnVuLXNlc3Npb24iIGFuZCAiZGJ1cy1ydW4tc2Vzc2lvbiAuLi4gLS0iIGFyZSBub3QgYWxsb3dlZDoKKyAgICogdGhlcmUgbXVzdCBiZSBzb21ldGhpbmcgdG8gcnVuICovCisgIGlmIChwcm9nX2FyZyA8IDEgfHwgcHJvZ19hcmcgPj0gYXJnYykKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICIlczogYSBub24tb3B0aW9uIGFyZ3VtZW50IGlzIHJlcXVpcmVkXG4iLCBtZSk7CisgICAgICByZXR1cm4gMTI3OworICAgIH0KKworICBpZiAocmVxdWlyZXNfYXJnKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiBvcHRpb24gJyVzJyByZXF1aXJlcyBhbiBhcmd1bWVudFxuIiwgbWUsIHByZXZfYXJnKTsKKyAgICAgIHJldHVybiAxMjc7CisgICAgfQorCisgIGlmIChkYnVzX2RhZW1vbiA9PSBOVUxMKQorICAgIGRidXNfZGFlbW9uID0gImRidXMtZGFlbW9uIjsKKworICBpZiAocGlwZSAoYnVzX2FkZHJlc3NfcGlwZSkgPCAwKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiBmYWlsZWQgdG8gY3JlYXRlIHBpcGU6ICVzXG4iLCBtZSwgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICByZXR1cm4gMTI3OworICAgIH0KKworICBidXNfcGlkID0gZm9yayAoKTsKKworICBpZiAoYnVzX3BpZCA8IDApCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6IGZhaWxlZCB0byBmb3JrOiAlc1xuIiwgbWUsIHN0cmVycm9yIChlcnJubykpOworICAgICAgcmV0dXJuIDEyNzsKKyAgICB9CisKKyAgaWYgKGJ1c19waWQgPT0gMCkKKyAgICB7CisgICAgICAvKiBjaGlsZCAqLworICAgICAgZXhlY19kYnVzX2RhZW1vbiAoZGJ1c19kYWVtb24sIGJ1c19hZGRyZXNzX3BpcGUsIGNvbmZpZ19maWxlKTsKKyAgICAgIC8qIG5vdCByZWFjaGVkICovCisgICAgICByZXR1cm4gMTI3OworICAgIH0KKworICBjbG9zZSAoYnVzX2FkZHJlc3NfcGlwZVtQSVBFX1dSSVRFX0VORF0pOworCisgIHN3aXRjaCAocmVhZF9saW5lIChidXNfYWRkcmVzc19waXBlW1BJUEVfUkVBRF9FTkRdLCBidXNfYWRkcmVzcywgTUFYX0FERFJfTEVOKSkKKyAgICB7CisgICAgY2FzZSBSRUFEX1NUQVRVU19PSzoKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBSRUFEX1NUQVRVU19FT0Y6CisgICAgICBmcHJpbnRmIChzdGRlcnIsICIlczogRU9GIHJlYWRpbmcgYWRkcmVzcyBmcm9tIGJ1cyBkYWVtb25cbiIsIG1lKTsKKyAgICAgIHJldHVybiAxMjc7CisgICAgICBicmVhazsKKworICAgIGNhc2UgUkVBRF9TVEFUVVNfRVJST1I6CisgICAgICBmcHJpbnRmIChzdGRlcnIsICIlczogZXJyb3IgcmVhZGluZyBhZGRyZXNzIGZyb20gYnVzIGRhZW1vbjogJXNcbiIsCisgICAgICAgICAgICAgICBtZSwgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICByZXR1cm4gMTI3OworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgX2RidXNfYXNzZXJ0X25vdF9yZWFjaGVkICgiaW52YWxpZCByZWFkIHJlc3VsdCIpOworICAgIH0KKworICBjbG9zZSAoYnVzX2FkZHJlc3NfcGlwZVtQSVBFX1JFQURfRU5EXSk7CisKKyAgaWYgKCFkYnVzX3NldGVudiAoIkRCVVNfU0VTU0lPTl9CVVNfQUREUkVTUyIsIGJ1c19hZGRyZXNzKSB8fAorICAgICAgIWRidXNfc2V0ZW52ICgiREJVU19TRVNTSU9OX0JVU19QSUQiLCBOVUxMKSB8fAorICAgICAgIWRidXNfc2V0ZW52ICgiREJVU19TRVNTSU9OX0JVU19XSU5ET1dJRCIsIE5VTEwpIHx8CisgICAgICAhZGJ1c19zZXRlbnYgKCJEQlVTX1NUQVJURVJfQUREUkVTUyIsIE5VTEwpIHx8CisgICAgICAhZGJ1c19zZXRlbnYgKCJEQlVTX1NUQVJURVJfQlVTX1RZUEUiLCBOVUxMKSkKKyAgICBvb20gKCk7CisKKyAgYXBwX3BpZCA9IGZvcmsgKCk7CisKKyAgaWYgKGFwcF9waWQgPCAwKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiBmYWlsZWQgdG8gZm9yazogJXNcbiIsIG1lLCBzdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIHJldHVybiAxMjc7CisgICAgfQorCisgIGlmIChhcHBfcGlkID09IDApCisgICAgeworICAgICAgLyogY2hpbGQgKi8KKyAgICAgIGV4ZWNfYXBwIChwcm9nX2FyZywgYXJndik7CisgICAgICAvKiBub3QgcmVhY2hlZCAqLworICAgICAgcmV0dXJuIDEyNzsKKyAgICB9CisKKyAgd2hpbGUgKDEpCisgICAgeworICAgICAgaW50IGNoaWxkX3N0YXR1czsKKyAgICAgIHBpZF90IGNoaWxkX3BpZCA9IHdhaXRwaWQgKC0xLCAmY2hpbGRfc3RhdHVzLCAwKTsKKworICAgICAgaWYgKGNoaWxkX3BpZCA9PSAocGlkX3QpIC0xKQorICAgICAgICB7CisgICAgICAgICAgaW50IGVycnN2ID0gZXJybm87CisKKyAgICAgICAgICBpZiAoZXJyc3YgPT0gRUlOVFIpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgIC8qIHNob3VsZG4ndCBoYXBwZW46IHRoZSBvbmx5IG90aGVyIGRvY3VtZW50ZWQgZXJyb3JzIGFyZSBFQ0hJTEQsCisgICAgICAgICAgICogd2hpY2ggc2hvdWxkbid0IGhhcHBlbiBiZWNhdXNlIHdlIHRlcm1pbmF0ZSB3aGVuIGFsbCBvdXIgY2hpbGRyZW4KKyAgICAgICAgICAgKiBoYXZlIGRpZWQsIGFuZCBFSU5WQUwsIHdoaWNoIHdvdWxkIGluZGljYXRlIHByb2dyYW1taW5nIGVycm9yICovCisgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6IHdhaXRwaWQoKSBmYWlsZWQ6ICVzXG4iLCBtZSwgc3RyZXJyb3IgKGVycnN2KSk7CisgICAgICAgICAgcmV0dXJuIDEyNzsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoY2hpbGRfcGlkID09IGJ1c19waWQpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBubyBuZWVkIHRvIGtpbGwgaXQsIG5vdyAqLworICAgICAgICAgIGJ1c19waWQgPSAwOworCisgICAgICAgICAgaWYgKFdJRkVYSVRFRCAoY2hpbGRfc3RhdHVzKSkKKyAgICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiBkYnVzLWRhZW1vbiBleGl0ZWQgd2l0aCBjb2RlICVkXG4iLAorICAgICAgICAgICAgICAgIG1lLCBXRVhJVFNUQVRVUyAoY2hpbGRfc3RhdHVzKSk7CisgICAgICAgICAgZWxzZSBpZiAoV0lGU0lHTkFMRUQgKGNoaWxkX3N0YXR1cykpCisgICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICIlczogZGJ1cy1kYWVtb24gdGVybWluYXRlZCBieSBzaWduYWwgJWRcbiIsCisgICAgICAgICAgICAgICAgbWUsIFdURVJNU0lHIChjaGlsZF9zdGF0dXMpKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICIlczogZGJ1cy1kYWVtb24gZGllZCBvciBzb21ldGhpbmdcbiIsIG1lKTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoY2hpbGRfcGlkID09IGFwcF9waWQpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoYnVzX3BpZCAhPSAwKQorICAgICAgICAgICAga2lsbCAoYnVzX3BpZCwgU0lHVEVSTSk7CisKKyAgICAgICAgICBpZiAoV0lGRVhJVEVEIChjaGlsZF9zdGF0dXMpKQorICAgICAgICAgICAgcmV0dXJuIFdFWElUU1RBVFVTIChjaGlsZF9zdGF0dXMpOworCisgICAgICAgICAgLyogaWYgaXQgZGllZCBmcm9tIGEgc2lnbmFsLCBiZWhhdmUgbGlrZSBzaCgxKSAqLworICAgICAgICAgIGlmIChXSUZTSUdOQUxFRCAoY2hpbGRfc3RhdHVzKSkKKyAgICAgICAgICAgIHJldHVybiAxMjggKyBXVEVSTVNJRyAoY2hpbGRfc3RhdHVzKTsKKworICAgICAgICAgIC8qIEkgZ2l2ZSB1cCAodGhpcyBzaG91bGQgbmV2ZXIgYmUgcmVhY2hlZCkgKi8KKyAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICIlczogY2hpbGQgcHJvY2VzcyBkaWVkIG9yIHNvbWV0aGluZ1xuIiwgbWUpOworICAgICAgICAgIHJldHVybiAxMjc7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiBpZ25vcmluZyB1bmtub3duIGNoaWxkIHByb2Nlc3MgJWxkXG4iLCBtZSwKKyAgICAgICAgICAgICAgKGxvbmcpIGNoaWxkX3BpZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90b29scy9kYnVzLXNlbmQuYyBiL3Rvb2xzL2RidXMtc2VuZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmZWI3NmUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9kYnVzLXNlbmQuYwpAQCAtMCwwICsxLDYyMSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXNlbmQuYyAgVXRpbGl0eSBwcm9ncmFtIHRvIHNlbmQgbWVzc2FnZXMgZnJvbSB0aGUgY29tbWFuZCBsaW5lCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzIFBoaWxpcCBCbHVuZGVsbCA8cGhpbGJAZ251Lm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxkYnVzL2RidXMuaD4KKyNpbmNsdWRlICJkYnVzL2RidXMtaW50ZXJuYWxzLmgiCisKKyNpZm5kZWYgSEFWRV9TVFJUT0xMCisjdW5kZWYgc3RydG9sbAorI2RlZmluZSBzdHJ0b2xsIG15c3RydG9sbAorI2luY2x1ZGUgInN0cnRvbGwuYyIKKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfU1RSVE9VTEwKKyN1bmRlZiBzdHJ0b3VsbAorI2RlZmluZSBzdHJ0b3VsbCBteXN0cnRvdWxsCisjaW5jbHVkZSAic3RydG91bGwuYyIKKyNlbmRpZgorCisjaWZkZWYgREJVU19XSU5DRQorI2lmbmRlZiBzdHJkdXAKKyNkZWZpbmUgc3RyZHVwIF9zdHJkdXAKKyNlbmRpZgorI2VuZGlmCisKKyNpbmNsdWRlICJkYnVzLXByaW50LW1lc3NhZ2UuaCIKKworc3RhdGljIGNvbnN0IGNoYXIgKmFwcG5hbWU7CisKK3N0YXRpYyB2b2lkIHVzYWdlIChpbnQgZWNvZGUpIF9EQlVTX0dOVUNfTk9SRVRVUk47CisKK3N0YXRpYyB2b2lkCit1c2FnZSAoaW50IGVjb2RlKQoreworICBmcHJpbnRmIChzdGRlcnIsICJVc2FnZTogJXMgWy0taGVscF0gWy0tc3lzdGVtIHwgLS1zZXNzaW9uIHwgLS1idXM9QUREUkVTUyB8IC0tcGVlcj1BRERSRVNTXSBbLS1kZXN0PU5BTUVdIFstLXR5cGU9VFlQRV0gWy0tcHJpbnQtcmVwbHlbPWxpdGVyYWxdXSBbLS1yZXBseS10aW1lb3V0PU1TRUNdIDxkZXN0aW5hdGlvbiBvYmplY3QgcGF0aD4gPG1lc3NhZ2UgbmFtZT4gW2NvbnRlbnRzIC4uLl1cbiIsIGFwcG5hbWUpOworICBleGl0IChlY29kZSk7Cit9CisKKy8qIEFib3J0IG9uIGFueSBhbGxvY2F0aW9uIGZhaWx1cmU7IHRoZXJlIGlzIG5vdGhpbmcgZWxzZSB3ZSBjYW4gZG8uICovCitzdGF0aWMgdm9pZAoraGFuZGxlX29vbSAoZGJ1c19ib29sX3Qgc3VjY2VzcykKK3sKKyAgaWYgKCFzdWNjZXNzKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiBSYW4gb3V0IG9mIG1lbW9yeVxuIiwgYXBwbmFtZSk7CisgICAgICBleGl0ICgxKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCithcHBlbmRfYXJnIChEQnVzTWVzc2FnZUl0ZXIgKml0ZXIsIGludCB0eXBlLCBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKyAgZGJ1c191aW50MTZfdCB1aW50MTY7CisgIGRidXNfaW50MTZfdCBpbnQxNjsKKyAgZGJ1c191aW50MzJfdCB1aW50MzI7CisgIGRidXNfaW50MzJfdCBpbnQzMjsKKyAgZGJ1c191aW50NjRfdCB1aW50NjQ7CisgIGRidXNfaW50NjRfdCBpbnQ2NDsKKyAgZG91YmxlIGQ7CisgIHVuc2lnbmVkIGNoYXIgYnl0ZTsKKyAgZGJ1c19ib29sX3Qgdl9CT09MRUFOOworICBkYnVzX2Jvb2xfdCByZXQ7CisKKyAgc3dpdGNoICh0eXBlKQorICAgIHsKKyAgICBjYXNlIERCVVNfVFlQRV9CWVRFOgorICAgICAgYnl0ZSA9IHN0cnRvdWwgKHZhbHVlLCBOVUxMLCAwKTsKKyAgICAgIHJldCA9IGRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYyAoaXRlciwgREJVU19UWVBFX0JZVEUsICZieXRlKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBEQlVTX1RZUEVfRE9VQkxFOgorICAgICAgZCA9IHN0cnRvZCAodmFsdWUsIE5VTEwpOworICAgICAgcmV0ID0gZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljIChpdGVyLCBEQlVTX1RZUEVfRE9VQkxFLCAmZCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgREJVU19UWVBFX0lOVDE2OgorICAgICAgaW50MTYgPSBzdHJ0b2wgKHZhbHVlLCBOVUxMLCAwKTsKKyAgICAgIHJldCA9IGRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYyAoaXRlciwgREJVU19UWVBFX0lOVDE2LCAmaW50MTYpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERCVVNfVFlQRV9VSU5UMTY6CisgICAgICB1aW50MTYgPSBzdHJ0b3VsICh2YWx1ZSwgTlVMTCwgMCk7CisgICAgICByZXQgPSBkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfYmFzaWMgKGl0ZXIsIERCVVNfVFlQRV9VSU5UMTYsICZ1aW50MTYpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERCVVNfVFlQRV9JTlQzMjoKKyAgICAgIGludDMyID0gc3RydG9sICh2YWx1ZSwgTlVMTCwgMCk7CisgICAgICByZXQgPSBkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfYmFzaWMgKGl0ZXIsIERCVVNfVFlQRV9JTlQzMiwgJmludDMyKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBEQlVTX1RZUEVfVUlOVDMyOgorICAgICAgdWludDMyID0gc3RydG91bCAodmFsdWUsIE5VTEwsIDApOworICAgICAgcmV0ID0gZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljIChpdGVyLCBEQlVTX1RZUEVfVUlOVDMyLCAmdWludDMyKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBEQlVTX1RZUEVfSU5UNjQ6CisgICAgICBpbnQ2NCA9IHN0cnRvbGwgKHZhbHVlLCBOVUxMLCAwKTsKKyAgICAgIHJldCA9IGRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYyAoaXRlciwgREJVU19UWVBFX0lOVDY0LCAmaW50NjQpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERCVVNfVFlQRV9VSU5UNjQ6CisgICAgICB1aW50NjQgPSBzdHJ0b3VsbCAodmFsdWUsIE5VTEwsIDApOworICAgICAgcmV0ID0gZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljIChpdGVyLCBEQlVTX1RZUEVfVUlOVDY0LCAmdWludDY0KTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBEQlVTX1RZUEVfU1RSSU5HOgorICAgICAgcmV0ID0gZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljIChpdGVyLCBEQlVTX1RZUEVfU1RSSU5HLCAmdmFsdWUpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERCVVNfVFlQRV9PQkpFQ1RfUEFUSDoKKyAgICAgIHJldCA9IGRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYyAoaXRlciwgREJVU19UWVBFX09CSkVDVF9QQVRILCAmdmFsdWUpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERCVVNfVFlQRV9CT09MRUFOOgorICAgICAgaWYgKHN0cmNtcCAodmFsdWUsICJ0cnVlIikgPT0gMCkKKwl7CisJICB2X0JPT0xFQU4gPSBUUlVFOworCSAgcmV0ID0gZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljIChpdGVyLCBEQlVTX1RZUEVfQk9PTEVBTiwgJnZfQk9PTEVBTik7CisJfQorICAgICAgZWxzZSBpZiAoc3RyY21wICh2YWx1ZSwgImZhbHNlIikgPT0gMCkKKwl7CisJICB2X0JPT0xFQU4gPSBGQUxTRTsKKwkgIHJldCA9IGRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYyAoaXRlciwgREJVU19UWVBFX0JPT0xFQU4sICZ2X0JPT0xFQU4pOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBmcHJpbnRmIChzdGRlcnIsICIlczogRXhwZWN0ZWQgXCJ0cnVlXCIgb3IgXCJmYWxzZVwiIGluc3RlYWQgb2YgXCIlc1wiXG4iLCBhcHBuYW1lLCB2YWx1ZSk7CisJICBleGl0ICgxKTsKKwl9CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBmcHJpbnRmIChzdGRlcnIsICIlczogVW5zdXBwb3J0ZWQgZGF0YSB0eXBlICVjXG4iLCBhcHBuYW1lLCAoY2hhcikgdHlwZSk7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgaGFuZGxlX29vbSAocmV0KTsKK30KKworc3RhdGljIHZvaWQKK2FwcGVuZF9hcnJheSAoREJ1c01lc3NhZ2VJdGVyICppdGVyLCBpbnQgdHlwZSwgY29uc3QgY2hhciAqdmFsdWUpCit7CisgIGNvbnN0IGNoYXIgKnZhbDsKKyAgY2hhciAqZHVwdmFsID0gc3RyZHVwICh2YWx1ZSk7CisKKyAgaGFuZGxlX29vbSAoZHVwdmFsICE9IE5VTEwpOworCisgIHZhbCA9IHN0cnRvayAoZHVwdmFsLCAiLCIpOworICB3aGlsZSAodmFsICE9IE5VTEwpCisgICAgeworICAgICAgYXBwZW5kX2FyZyAoaXRlciwgdHlwZSwgdmFsKTsKKyAgICAgIHZhbCA9IHN0cnRvayAoTlVMTCwgIiwiKTsKKyAgICB9CisgIGZyZWUgKGR1cHZhbCk7Cit9CisKK3N0YXRpYyB2b2lkCithcHBlbmRfZGljdCAoREJ1c01lc3NhZ2VJdGVyICppdGVyLCBpbnQga2V5dHlwZSwgaW50IHZhbHR5cGUsIGNvbnN0IGNoYXIgKnZhbHVlKQoreworICBjb25zdCBjaGFyICp2YWw7CisgIGNoYXIgKmR1cHZhbCA9IHN0cmR1cCAodmFsdWUpOworCisgIGhhbmRsZV9vb20gKGR1cHZhbCAhPSBOVUxMKTsKKworICB2YWwgPSBzdHJ0b2sgKGR1cHZhbCwgIiwiKTsKKyAgd2hpbGUgKHZhbCAhPSBOVUxMKQorICAgIHsKKyAgICAgIERCdXNNZXNzYWdlSXRlciBzdWJpdGVyOworICAgICAgCisgICAgICBoYW5kbGVfb29tIChkYnVzX21lc3NhZ2VfaXRlcl9vcGVuX2NvbnRhaW5lciAoaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfRElDVF9FTlRSWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdWJpdGVyKSk7CisKKyAgICAgIGFwcGVuZF9hcmcgKCZzdWJpdGVyLCBrZXl0eXBlLCB2YWwpOworICAgICAgdmFsID0gc3RydG9rIChOVUxMLCAiLCIpOworICAgICAgaWYgKHZhbCA9PSBOVUxMKQorCXsKKwkgIGZwcmludGYgKHN0ZGVyciwgIiVzOiBNYWxmb3JtZWQgZGljdGlvbmFyeVxuIiwgYXBwbmFtZSk7CisJICBleGl0ICgxKTsKKwl9CisgICAgICBhcHBlbmRfYXJnICgmc3ViaXRlciwgdmFsdHlwZSwgdmFsKTsKKworICAgICAgaGFuZGxlX29vbSAoZGJ1c19tZXNzYWdlX2l0ZXJfY2xvc2VfY29udGFpbmVyIChpdGVyLCAmc3ViaXRlcikpOworICAgICAgdmFsID0gc3RydG9rIChOVUxMLCAiLCIpOworICAgIH0gCisgIGZyZWUgKGR1cHZhbCk7Cit9CisKK3N0YXRpYyBpbnQKK3R5cGVfZnJvbV9uYW1lIChjb25zdCBjaGFyICphcmcpCit7CisgIGludCB0eXBlOworICBpZiAoIXN0cmNtcCAoYXJnLCAic3RyaW5nIikpCisgICAgdHlwZSA9IERCVVNfVFlQRV9TVFJJTkc7CisgIGVsc2UgaWYgKCFzdHJjbXAgKGFyZywgImludDE2IikpCisgICAgdHlwZSA9IERCVVNfVFlQRV9JTlQxNjsKKyAgZWxzZSBpZiAoIXN0cmNtcCAoYXJnLCAidWludDE2IikpCisgICAgdHlwZSA9IERCVVNfVFlQRV9VSU5UMTY7CisgIGVsc2UgaWYgKCFzdHJjbXAgKGFyZywgImludDMyIikpCisgICAgdHlwZSA9IERCVVNfVFlQRV9JTlQzMjsKKyAgZWxzZSBpZiAoIXN0cmNtcCAoYXJnLCAidWludDMyIikpCisgICAgdHlwZSA9IERCVVNfVFlQRV9VSU5UMzI7CisgIGVsc2UgaWYgKCFzdHJjbXAgKGFyZywgImludDY0IikpCisgICAgdHlwZSA9IERCVVNfVFlQRV9JTlQ2NDsKKyAgZWxzZSBpZiAoIXN0cmNtcCAoYXJnLCAidWludDY0IikpCisgICAgdHlwZSA9IERCVVNfVFlQRV9VSU5UNjQ7CisgIGVsc2UgaWYgKCFzdHJjbXAgKGFyZywgImRvdWJsZSIpKQorICAgIHR5cGUgPSBEQlVTX1RZUEVfRE9VQkxFOworICBlbHNlIGlmICghc3RyY21wIChhcmcsICJieXRlIikpCisgICAgdHlwZSA9IERCVVNfVFlQRV9CWVRFOworICBlbHNlIGlmICghc3RyY21wIChhcmcsICJib29sZWFuIikpCisgICAgdHlwZSA9IERCVVNfVFlQRV9CT09MRUFOOworICBlbHNlIGlmICghc3RyY21wIChhcmcsICJvYmpwYXRoIikpCisgICAgdHlwZSA9IERCVVNfVFlQRV9PQkpFQ1RfUEFUSDsKKyAgZWxzZQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiBVbmtub3duIHR5cGUgXCIlc1wiXG4iLCBhcHBuYW1lLCBhcmcpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorICByZXR1cm4gdHlwZTsKK30KKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKyAgREJ1c0Vycm9yIGVycm9yOworICBEQnVzTWVzc2FnZSAqbWVzc2FnZTsKKyAgZGJ1c19ib29sX3QgcHJpbnRfcmVwbHk7CisgIGRidXNfYm9vbF90IHByaW50X3JlcGx5X2xpdGVyYWw7CisgIGludCByZXBseV90aW1lb3V0OworICBEQnVzTWVzc2FnZUl0ZXIgaXRlcjsKKyAgaW50IGk7CisgIERCdXNCdXNUeXBlIHR5cGUgPSBEQlVTX0JVU19TRVNTSU9OOworICBjb25zdCBjaGFyICpkZXN0ID0gTlVMTDsKKyAgY29uc3QgY2hhciAqbmFtZSA9IE5VTEw7CisgIGNvbnN0IGNoYXIgKnBhdGggPSBOVUxMOworICBpbnQgbWVzc2FnZV90eXBlID0gREJVU19NRVNTQUdFX1RZUEVfU0lHTkFMOworICBjb25zdCBjaGFyICp0eXBlX3N0ciA9IE5VTEw7CisgIGNvbnN0IGNoYXIgKmFkZHJlc3MgPSBOVUxMOworICBpbnQgaXNfYnVzID0gRkFMU0U7CisgIGludCBzZXNzaW9uX29yX3N5c3RlbSA9IEZBTFNFOworCisgIGFwcG5hbWUgPSBhcmd2WzBdOworICAKKyAgaWYgKGFyZ2MgPCAzKQorICAgIHVzYWdlICgxKTsKKworICBwcmludF9yZXBseSA9IEZBTFNFOworICBwcmludF9yZXBseV9saXRlcmFsID0gRkFMU0U7CisgIHJlcGx5X3RpbWVvdXQgPSAtMTsKKyAgCisgIGZvciAoaSA9IDE7IGkgPCBhcmdjICYmIG5hbWUgPT0gTlVMTDsgaSsrKQorICAgIHsKKyAgICAgIGNoYXIgKmFyZyA9IGFyZ3ZbaV07CisKKyAgICAgIGlmIChzdHJjbXAgKGFyZywgIi0tc3lzdGVtIikgPT0gMCkKKyAgICAgICAgeworCSAgdHlwZSA9IERCVVNfQlVTX1NZU1RFTTsKKyAgICAgICAgICBzZXNzaW9uX29yX3N5c3RlbSA9IFRSVUU7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAiLS1zZXNzaW9uIikgPT0gMCkKKyAgICAgICAgeworCSAgdHlwZSA9IERCVVNfQlVTX1NFU1NJT047CisgICAgICAgICAgc2Vzc2lvbl9vcl9zeXN0ZW0gPSBUUlVFOworICAgICAgICB9CisgICAgICBlbHNlIGlmICgoc3Ryc3RyIChhcmcsICItLWJ1cz0iKSA9PSBhcmcpIHx8IChzdHJzdHIgKGFyZywgIi0tcGVlcj0iKSA9PSBhcmcpIHx8IChzdHJzdHIgKGFyZywgIi0tYWRkcmVzcz0iKSA9PSBhcmcpKQorICAgICAgICB7CisgICAgICAgICAgLyogQ2hlY2sgZm9yIHBlZXIgZmlyc3QsIHRvIGF2b2lkIHRoZSBHQ0MgLVdkdXBsaWNhdGVkLWJyYW5jaGVzCisgICAgICAgICAgICogd2FybmluZy4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBpZiAoYXJnWzJdID09ICdwJykgLyogcGVlciAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICBpc19idXMgPSBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIGlmIChhcmdbMl0gPT0gJ2InKSAvKiBidXMgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaXNfYnVzID0gVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIC8qIGFkZHJlc3M7IGtlZXBpbmcgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaXNfYnVzID0gRkFMU0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBhZGRyZXNzID0gc3RyY2hyIChhcmcsICc9JykgKyAxOworCisgICAgICAgICAgaWYgKGFkZHJlc3NbMF0gPT0gJ1wwJykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiXCItLXBlZXI9XCIgYW5kIFwiLS1idXM9XCIgcmVxdWlyZSBhbiBBRERSRVNTXG4iKTsKKyAgICAgICAgICAgICAgdXNhZ2UgKDEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBlbHNlIGlmIChzdHJuY21wIChhcmcsICItLXByaW50LXJlcGx5IiwgMTMpID09IDApCisJeworCSAgcHJpbnRfcmVwbHkgPSBUUlVFOworCSAgbWVzc2FnZV90eXBlID0gREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX0NBTEw7CisJICBpZiAoc3RyY21wIChhcmcgKyAxMywgIj1saXRlcmFsIikgPT0gMCkKKwkgICAgcHJpbnRfcmVwbHlfbGl0ZXJhbCA9IFRSVUU7CisJICBlbHNlIGlmICgqKGFyZyArIDEzKSAhPSAnXDAnKQorCSAgICB7CisJICAgICAgZnByaW50ZiAoc3RkZXJyLCAiaW52YWxpZCB2YWx1ZSAoJXMpIG9mIFwiLS1wcmludC1yZXBseVwiXG4iLCBhcmcgKyAxMyk7CisJICAgICAgdXNhZ2UgKDEpOworCSAgICB9CisJfQorICAgICAgZWxzZSBpZiAoc3Ryc3RyIChhcmcsICItLXJlcGx5LXRpbWVvdXQ9IikgPT0gYXJnKQorCXsKKwkgIGlmICgqKHN0cmNociAoYXJnLCAnPScpICsgMSkgPT0gJ1wwJykKKwkgICAgeworCSAgICAgIGZwcmludGYgKHN0ZGVyciwgIlwiLS1yZXBseS10aW1lb3V0PVwiIHJlcXVpcmVzIGFuIE1TRUNcbiIpOworCSAgICAgIHVzYWdlICgxKTsKKwkgICAgfQorCSAgcmVwbHlfdGltZW91dCA9IHN0cnRvbCAoc3RyY2hyIChhcmcsICc9JykgKyAxLAorCQkJCSAgTlVMTCwgMTApOworCSAgaWYgKHJlcGx5X3RpbWVvdXQgPD0gMCkKKwkgICAgeworCSAgICAgIGZwcmludGYgKHN0ZGVyciwgImludmFsaWQgdmFsdWUgKCVzKSBvZiBcIi0tcmVwbHktdGltZW91dFwiXG4iLAorCSAgICAgICAgICAgICAgIHN0cmNociAoYXJnLCAnPScpICsgMSk7CisJICAgICAgdXNhZ2UgKDEpOworCSAgICB9CisJfQorICAgICAgZWxzZSBpZiAoc3Ryc3RyIChhcmcsICItLWRlc3Q9IikgPT0gYXJnKQorCXsKKwkgIGlmICgqKHN0cmNociAoYXJnLCAnPScpICsgMSkgPT0gJ1wwJykKKwkgICAgeworCSAgICAgIGZwcmludGYgKHN0ZGVyciwgIlwiLS1kZXN0PVwiIHJlcXVpcmVzIGFuIE5BTUVcbiIpOworCSAgICAgIHVzYWdlICgxKTsKKwkgICAgfQorCSAgZGVzdCA9IHN0cmNociAoYXJnLCAnPScpICsgMTsKKwl9CisgICAgICBlbHNlIGlmIChzdHJzdHIgKGFyZywgIi0tdHlwZT0iKSA9PSBhcmcpCisJdHlwZV9zdHIgPSBzdHJjaHIgKGFyZywgJz0nKSArIDE7CisgICAgICBlbHNlIGlmICghc3RyY21wKGFyZywgIi0taGVscCIpKQorCXVzYWdlICgwKTsKKyAgICAgIGVsc2UgaWYgKGFyZ1swXSA9PSAnLScpCisJdXNhZ2UgKDEpOworICAgICAgZWxzZSBpZiAocGF0aCA9PSBOVUxMKQorICAgICAgICBwYXRoID0gYXJnOworICAgICAgZWxzZSAvKiBuYW1lID09IE5VTEwgZ3VhcmFudGVlZCBieSB0aGUgJ3doaWxlJyBsb29wICovCisgICAgICAgIG5hbWUgPSBhcmc7CisgICAgfQorCisgIGlmIChuYW1lID09IE5VTEwpCisgICAgdXNhZ2UgKDEpOworCisgIGlmIChzZXNzaW9uX29yX3N5c3RlbSAmJgorICAgICAgKGFkZHJlc3MgIT0gTlVMTCkpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiXCItLXBlZXJcIiBhbmQgXCItLWJ1c1wiIG1heSBub3QgYmUgdXNlZCB3aXRoIFwiLS1zeXN0ZW1cIiBvciBcIi0tc2Vzc2lvblwiXG4iKTsKKyAgICAgIHVzYWdlICgxKTsKKyAgICB9CisKKyAgaWYgKHR5cGVfc3RyICE9IE5VTEwpCisgICAgeworICAgICAgbWVzc2FnZV90eXBlID0gZGJ1c19tZXNzYWdlX3R5cGVfZnJvbV9zdHJpbmcgKHR5cGVfc3RyKTsKKyAgICAgIGlmICghKG1lc3NhZ2VfdHlwZSA9PSBEQlVTX01FU1NBR0VfVFlQRV9NRVRIT0RfQ0FMTCB8fAorICAgICAgICAgICAgbWVzc2FnZV90eXBlID09IERCVVNfTUVTU0FHRV9UWVBFX1NJR05BTCkpCisgICAgICAgIHsKKyAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJNZXNzYWdlIHR5cGUgXCIlc1wiIGlzIG5vdCBzdXBwb3J0ZWRcbiIsCisgICAgICAgICAgICAgICAgICAgdHlwZV9zdHIpOworICAgICAgICAgIGV4aXQgKDEpOworICAgICAgICB9CisgICAgfQorICAKKyAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworCisgIGlmIChkZXN0ICYmICFkYnVzX3ZhbGlkYXRlX2J1c19uYW1lIChkZXN0LCAmZXJyb3IpKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgImludmFsaWQgdmFsdWUgKCVzKSBvZiBcIi0tZGVzdFwiXG4iLCBkZXN0KTsKKyAgICAgIHVzYWdlICgxKTsKKyAgICB9CisKKyAgaWYgKGFkZHJlc3MgIT0gTlVMTCkKKyAgICB7CisgICAgICBjb25uZWN0aW9uID0gZGJ1c19jb25uZWN0aW9uX29wZW4gKGFkZHJlc3MsICZlcnJvcik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgY29ubmVjdGlvbiA9IGRidXNfYnVzX2dldCAodHlwZSwgJmVycm9yKTsKKyAgICB9CisKKyAgaWYgKGNvbm5lY3Rpb24gPT0gTlVMTCkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJGYWlsZWQgdG8gb3BlbiBjb25uZWN0aW9uIHRvIFwiJXNcIiBtZXNzYWdlIGJ1czogJXNcbiIsCisgICAgICAgICAgICAgICAoYWRkcmVzcyAhPSBOVUxMKSA/IGFkZHJlc3MgOgorICAgICAgICAgICAgICAgICAoKHR5cGUgPT0gREJVU19CVVNfU1lTVEVNKSA/ICJzeXN0ZW0iIDogInNlc3Npb24iKSwKKyAgICAgICAgICAgICAgIGVycm9yLm1lc3NhZ2UpOworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorICBlbHNlIGlmICgoYWRkcmVzcyAhPSBOVUxMKSAmJiBpc19idXMpCisgICAgeworICAgICAgaWYgKCFkYnVzX2J1c19yZWdpc3RlciAoY29ubmVjdGlvbiwgJmVycm9yKSkKKyAgICAgICAgeworICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIkZhaWxlZCB0byByZWdpc3RlciBvbiBjb25uZWN0aW9uIHRvIFwiJXNcIiBtZXNzYWdlIGJ1czogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgYWRkcmVzcywgZXJyb3IubWVzc2FnZSk7CisgICAgICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgICAgIGV4aXQgKDEpOworICAgICAgICB9CisgICAgfQorCisgIGlmIChtZXNzYWdlX3R5cGUgPT0gREJVU19NRVNTQUdFX1RZUEVfTUVUSE9EX0NBTEwpCisgICAgeworICAgICAgY2hhciAqbGFzdF9kb3Q7CisKKyAgICAgIGxhc3RfZG90ID0gc3RycmNociAobmFtZSwgJy4nKTsKKyAgICAgIGlmIChsYXN0X2RvdCA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiTXVzdCB1c2Ugb3JnLm15ZG9tYWluLkludGVyZmFjZS5NZXRob2Qgbm90YXRpb24sIG5vIGRvdCBpbiBcIiVzXCJcbiIsCisgICAgICAgICAgICAgICAgICAgbmFtZSk7CisgICAgICAgICAgZXhpdCAoMSk7CisgICAgICAgIH0KKyAgICAgICpsYXN0X2RvdCA9ICdcMCc7CisgICAgICAKKyAgICAgIG1lc3NhZ2UgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsIChOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0X2RvdCArIDEpOworICAgICAgaGFuZGxlX29vbSAobWVzc2FnZSAhPSBOVUxMKTsKKyAgICAgIGRidXNfbWVzc2FnZV9zZXRfYXV0b19zdGFydCAobWVzc2FnZSwgVFJVRSk7CisgICAgfQorICBlbHNlIGlmIChtZXNzYWdlX3R5cGUgPT0gREJVU19NRVNTQUdFX1RZUEVfU0lHTkFMKQorICAgIHsKKyAgICAgIGNoYXIgKmxhc3RfZG90OworCisgICAgICBsYXN0X2RvdCA9IHN0cnJjaHIgKG5hbWUsICcuJyk7CisgICAgICBpZiAobGFzdF9kb3QgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIk11c3QgdXNlIG9yZy5teWRvbWFpbi5JbnRlcmZhY2UuU2lnbmFsIG5vdGF0aW9uLCBubyBkb3QgaW4gXCIlc1wiXG4iLAorICAgICAgICAgICAgICAgICAgIG5hbWUpOworICAgICAgICAgIGV4aXQgKDEpOworICAgICAgICB9CisgICAgICAqbGFzdF9kb3QgPSAnXDAnOworICAgICAgCisgICAgICBtZXNzYWdlID0gZGJ1c19tZXNzYWdlX25ld19zaWduYWwgKHBhdGgsIG5hbWUsIGxhc3RfZG90ICsgMSk7CisgICAgICBoYW5kbGVfb29tIChtZXNzYWdlICE9IE5VTEwpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIkludGVybmFsIGVycm9yLCB1bmtub3duIG1lc3NhZ2UgdHlwZVxuIik7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJDb3VsZG4ndCBhbGxvY2F0ZSBELUJ1cyBtZXNzYWdlXG4iKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICBpZiAoZGVzdCAmJiAhZGJ1c19tZXNzYWdlX3NldF9kZXN0aW5hdGlvbiAobWVzc2FnZSwgZGVzdCkpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiTm90IGVub3VnaCBtZW1vcnlcbiIpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorICAKKyAgZGJ1c19tZXNzYWdlX2l0ZXJfaW5pdF9hcHBlbmQgKG1lc3NhZ2UsICZpdGVyKTsKKworICB3aGlsZSAoaSA8IGFyZ2MpCisgICAgeworICAgICAgY2hhciAqYXJnOworICAgICAgY2hhciAqYzsKKyAgICAgIGludCB0eXBlMjsKKyAgICAgIGludCBzZWNvbmRhcnlfdHlwZTsKKyAgICAgIGludCBjb250YWluZXJfdHlwZTsKKyAgICAgIERCdXNNZXNzYWdlSXRlciAqdGFyZ2V0X2l0ZXI7CisgICAgICBEQnVzTWVzc2FnZUl0ZXIgY29udGFpbmVyX2l0ZXI7CisKKyAgICAgIHR5cGUyID0gREJVU19UWVBFX0lOVkFMSUQ7CisgICAgICBzZWNvbmRhcnlfdHlwZSA9IERCVVNfVFlQRV9JTlZBTElEOworICAgICAgYXJnID0gYXJndltpKytdOworICAgICAgYyA9IHN0cmNociAoYXJnLCAnOicpOworCisgICAgICBpZiAoYyA9PSBOVUxMKQorCXsKKwkgIGZwcmludGYgKHN0ZGVyciwgIiVzOiBEYXRhIGl0ZW0gXCIlc1wiIGlzIGJhZGx5IGZvcm1lZFxuIiwgYXJndlswXSwgYXJnKTsKKwkgIGV4aXQgKDEpOworCX0KKworICAgICAgKihjKyspID0gMDsKKworICAgICAgY29udGFpbmVyX3R5cGUgPSBEQlVTX1RZUEVfSU5WQUxJRDsKKworICAgICAgaWYgKHN0cmNtcCAoYXJnLCAidmFyaWFudCIpID09IDApCisJY29udGFpbmVyX3R5cGUgPSBEQlVTX1RZUEVfVkFSSUFOVDsKKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAiYXJyYXkiKSA9PSAwKQorCWNvbnRhaW5lcl90eXBlID0gREJVU19UWVBFX0FSUkFZOworICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICJkaWN0IikgPT0gMCkKKwljb250YWluZXJfdHlwZSA9IERCVVNfVFlQRV9ESUNUX0VOVFJZOworCisgICAgICBpZiAoY29udGFpbmVyX3R5cGUgIT0gREJVU19UWVBFX0lOVkFMSUQpCisJeworCSAgYXJnID0gYzsKKwkgIGMgPSBzdHJjaHIgKGFyZywgJzonKTsKKwkgIGlmIChjID09IE5VTEwpCisJICAgIHsKKwkgICAgICBmcHJpbnRmIChzdGRlcnIsICIlczogRGF0YSBpdGVtIFwiJXNcIiBpcyBiYWRseSBmb3JtZWRcbiIsIGFyZ3ZbMF0sIGFyZyk7CisJICAgICAgZXhpdCAoMSk7CisJICAgIH0KKwkgICooYysrKSA9IDA7CisJfQorCisgICAgICBpZiAoYXJnWzBdID09IDApCisJdHlwZTIgPSBEQlVTX1RZUEVfU1RSSU5HOworICAgICAgZWxzZQorCXR5cGUyID0gdHlwZV9mcm9tX25hbWUgKGFyZyk7CisKKyAgICAgIGlmIChjb250YWluZXJfdHlwZSA9PSBEQlVTX1RZUEVfRElDVF9FTlRSWSkKKwl7CisJICBjaGFyIHNpZ1s1XTsKKwkgIGFyZyA9IGM7CisJICBjID0gc3RyY2hyIChjLCAnOicpOworCSAgaWYgKGMgPT0gTlVMTCkKKwkgICAgeworCSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiBEYXRhIGl0ZW0gXCIlc1wiIGlzIGJhZGx5IGZvcm1lZFxuIiwgYXJndlswXSwgYXJnKTsKKwkgICAgICBleGl0ICgxKTsKKwkgICAgfQorCSAgKihjKyspID0gMDsKKwkgIHNlY29uZGFyeV90eXBlID0gdHlwZV9mcm9tX25hbWUgKGFyZyk7CisJICBzaWdbMF0gPSBEQlVTX0RJQ1RfRU5UUllfQkVHSU5fQ0hBUjsKKwkgIHNpZ1sxXSA9IHR5cGUyOworCSAgc2lnWzJdID0gc2Vjb25kYXJ5X3R5cGU7CisJICBzaWdbM10gPSBEQlVTX0RJQ1RfRU5UUllfRU5EX0NIQVI7CisJICBzaWdbNF0gPSAnXDAnOworICAgICAgICAgIGhhbmRsZV9vb20gKGRidXNfbWVzc2FnZV9pdGVyX29wZW5fY29udGFpbmVyICgmaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0FSUkFZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb250YWluZXJfaXRlcikpOworCSAgdGFyZ2V0X2l0ZXIgPSAmY29udGFpbmVyX2l0ZXI7CisJfQorICAgICAgZWxzZSBpZiAoY29udGFpbmVyX3R5cGUgIT0gREJVU19UWVBFX0lOVkFMSUQpCisJeworCSAgY2hhciBzaWdbMl07CisJICBzaWdbMF0gPSB0eXBlMjsKKwkgIHNpZ1sxXSA9ICdcMCc7CisgICAgICAgICAgaGFuZGxlX29vbSAoZGJ1c19tZXNzYWdlX2l0ZXJfb3Blbl9jb250YWluZXIgKCZpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29udGFpbmVyX2l0ZXIpKTsKKwkgIHRhcmdldF9pdGVyID0gJmNvbnRhaW5lcl9pdGVyOworCX0KKyAgICAgIGVsc2UKKwl0YXJnZXRfaXRlciA9ICZpdGVyOworCisgICAgICBpZiAoY29udGFpbmVyX3R5cGUgPT0gREJVU19UWVBFX0FSUkFZKQorCXsKKwkgIGFwcGVuZF9hcnJheSAodGFyZ2V0X2l0ZXIsIHR5cGUyLCBjKTsKKwl9CisgICAgICBlbHNlIGlmIChjb250YWluZXJfdHlwZSA9PSBEQlVTX1RZUEVfRElDVF9FTlRSWSkKKwl7CisJICBfZGJ1c19hc3NlcnQgKHNlY29uZGFyeV90eXBlICE9IERCVVNfVFlQRV9JTlZBTElEKTsKKwkgIGFwcGVuZF9kaWN0ICh0YXJnZXRfaXRlciwgdHlwZTIsIHNlY29uZGFyeV90eXBlLCBjKTsKKwl9CisgICAgICBlbHNlCisJYXBwZW5kX2FyZyAodGFyZ2V0X2l0ZXIsIHR5cGUyLCBjKTsKKworICAgICAgaWYgKGNvbnRhaW5lcl90eXBlICE9IERCVVNfVFlQRV9JTlZBTElEKQorCXsKKyAgICAgICAgICBoYW5kbGVfb29tIChkYnVzX21lc3NhZ2VfaXRlcl9jbG9zZV9jb250YWluZXIgKCZpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbnRhaW5lcl9pdGVyKSk7CisJfQorICAgIH0KKworICBpZiAocHJpbnRfcmVwbHkpCisgICAgeworICAgICAgREJ1c01lc3NhZ2UgKnJlcGx5OworCisgICAgICBkYnVzX2Vycm9yX2luaXQgKCZlcnJvcik7CisgICAgICByZXBseSA9IGRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHlfYW5kX2Jsb2NrIChjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwgcmVwbHlfdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcik7CisgICAgICBpZiAoZGJ1c19lcnJvcl9pc19zZXQgKCZlcnJvcikpCisgICAgICAgIHsKKyAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJFcnJvciAlczogJXNcbiIsCisJCSAgIGVycm9yLm5hbWUsCisgICAgICAgICAgICAgICAgICAgZXJyb3IubWVzc2FnZSk7CisgICAgICAgICAgZXhpdCAoMSk7CisgICAgICAgIH0KKworICAgICAgaWYgKHJlcGx5KQorICAgICAgICB7CisgICAgICAgICAgbG9uZyBzZWMsIHVzZWM7CisKKyAgICAgICAgICBfZGJ1c19nZXRfcmVhbF90aW1lICgmc2VjLCAmdXNlYyk7CisgICAgICAgICAgcHJpbnRfbWVzc2FnZSAocmVwbHksIHByaW50X3JlcGx5X2xpdGVyYWwsIHNlYywgdXNlYyk7CisgICAgICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChyZXBseSk7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoY29ubmVjdGlvbiwgbWVzc2FnZSwgTlVMTCk7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fZmx1c2ggKGNvbm5lY3Rpb24pOworICAgIH0KKworICBkYnVzX21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworCisgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoY29ubmVjdGlvbik7CisKKyAgZXhpdCAoMCk7Cit9CmRpZmYgLS1naXQgYS90b29scy9kYnVzLXNwYW0uYyBiL3Rvb2xzL2RidXMtc3BhbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5MjkxMWMKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9kYnVzLXNwYW0uYwpAQCAtMCwwICsxLDUzNyBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXNwYW0uYyAtIGEgcGxhaW4gbGliZGJ1cyBtZXNzYWdlLXNlbmRlciwgbG9vc2VseSBiYXNlZCBvbiBkYnVzLXNlbmQKKyAqCisgKiBDb3B5cmlnaHQgwqkgMjAwMyBQaGlsaXAgQmx1bmRlbGwgPHBoaWxiQGdudS5vcmc+CisgKiBDb3B5cmlnaHQgwqkgMjAxMSBOb2tpYSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IMKpIDIwMTQgQ29sbGFib3JhIEx0ZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisKKyNpbmNsdWRlIDxkYnVzL2RidXMuaD4KKworI2luY2x1ZGUgInRlc3QtdG9vbC5oIgorI2luY2x1ZGUgInRvb2wtY29tbW9uLmgiCisKK3N0YXRpYyBkYnVzX2Jvb2xfdCBpZ25vcmVfZXJyb3JzID0gRkFMU0U7CisKK3N0YXRpYyB2b2lkIHVzYWdlIChpbnQgZWNvZGUpIF9EQlVTX0dOVUNfTk9SRVRVUk47CisKK3N0YXRpYyB2b2lkCit1c2FnZSAoaW50IGVjb2RlKQoreworICBmcHJpbnRmIChzdGRlcnIsCisgICAgICAgICAgICJVc2FnZTogZGJ1cy10ZXN0LXRvb2wgc3BhbSBbT1BUSU9OU11cbiIKKyAgICAgICAgICAgIlxuIgorICAgICAgICAgICAiUmVwZWF0ZWRseSBjYWxsIGNvbS5leGFtcGxlLlNwYW0oKSBvbiB0aGUgZ2l2ZW4gRC1CdXMgc2VydmljZS5cbiIKKyAgICAgICAgICAgIlxuIgorICAgICAgICAgICAiT3B0aW9uczpcbiIKKyAgICAgICAgICAgIlxuIgorICAgICAgICAgICAiICAgIC0tc2Vzc2lvbiAgICAgdXNlIHRoZSBzZXNzaW9uIGJ1cyAoZGVmYXVsdClcbiIKKyAgICAgICAgICAgIiAgICAtLXN5c3RlbSAgICAgIHVzZSB0aGUgc3lzdGVtIGJ1c1xuIgorICAgICAgICAgICAiXG4iCisgICAgICAgICAgICIgICAgLS1pZ25vcmUtZXJyb3JzICAgIGlnbm9yZSBlcnJvcnNcbiIKKyAgICAgICAgICAgIiAgICAtLWRlc3Q9TkFNRSAgIGNhbGwgbWV0aG9kcyBvbiBOQU1FIChkZWZhdWx0ICIgREJVU19TRVJWSUNFX0RCVVMgIilcbiIKKyAgICAgICAgICAgIlxuIgorICAgICAgICAgICAiICAgIC0tY291bnQ9TiAgICAgc2VuZCBOIG1lc3NhZ2VzIChkZWZhdWx0IDEpXG4iCisgICAgICAgICAgICIgICAgLS1xdWV1ZT1OICAgICBxdWV1ZSB1cCBOIG1lc3NhZ2VzIGF0IGEgdGltZSAoZGVmYXVsdCAxKVxuIgorICAgICAgICAgICAiICAgIC0tZmxvb2QgICAgICAgc2VuZCBhbGwgbWVzc2FnZXMgaW1tZWRpYXRlbHlcbiIKKyAgICAgICAgICAgIiAgICAtLW5vLXJlcGx5ICAgIHNldCB0aGUgTk9fUkVQTFkgZmxhZyAoaW1wbGllcyAtLWZsb29kKVxuIgorICAgICAgICAgICAiICAgIC0tbWVzc2FnZXMtcGVyLWNvbm49TiAgIGFmdGVyIHNlbmRpbmcgbWVzc2FnZXMtcGVyLWNvbm4sIHdhaXRcbiIKKyAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgIGZvciB0aGUgcGVuZGluZyByZXBsaWVzIGlmIGFueSwgdGhlbiByZWNvbm5lY3RcbiIKKyAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgIChkZWZhdWx0OiBkb24ndCByZWNvbm5lY3QpXG4iCisgICAgICAgICAgICJcbiIKKyAgICAgICAgICAgIiAgICAtLXN0cmluZyAgICAgIHNlbmQgcGF5bG9hZCBhcyBhIHN0cmluZyAoZGVmYXVsdClcbiIKKyAgICAgICAgICAgIiAgICAtLWJ5dGVzICAgICAgIHNlbmQgcGF5bG9hZCBhcyBhIGJ5dGUtYXJyYXlcbiIKKyAgICAgICAgICAgIiAgICAtLWVtcHR5ICAgICAgIHNlbmQgYW4gZW1wdHkgcGF5bG9hZFxuIgorICAgICAgICAgICAiXG4iCisgICAgICAgICAgICIgICAgLS1wYXlsb2FkPVMgICB1c2UgUyBhcyBwYXlsb2FkIChkZWZhdWx0IFwiaGVsbG8sIHdvcmxkIVwiKVxuIgorICAgICAgICAgICAiICAgIC0tc3RkaW4gICAgICAgcmVhZCBwYXlsb2FkIGZyb20gc3RkaW4sIHVudGlsIEVPRlxuIgorICAgICAgICAgICAiICAgIC0tbWVzc2FnZS1zdGRpbiAgIHJlYWQgYSBjb21wbGV0ZSBELUJ1cyBtZXNzYWdlIGZyb20gc3RkaW5cbiIKKyAgICAgICAgICAgIiAgICAtLXJhbmRvbS1zaXplIHJlYWQgd2hpdGVzcGFjZS1zZXBhcmF0ZWQgQVNDSUkgZGVjaW1hbFxuIgorICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgcGF5bG9hZCBzaXplcyBmcm9tIHN0ZGluIGFuZCBwaWNrIG9uZSByYW5kb21seVxuIgorICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgZm9yIGVhY2ggbWVzc2FnZVxuIgorICAgICAgICAgICAiXG4iCisgICAgICAgICAgICIgICAgLS1zZWVkPVNFRUQgICBzZWVkIGZvciBzcmFuZCAoZGVmYXVsdCBpcyB0aW1lKCkpXG4iCisgICAgICAgICAgICJcbiIKKyAgICAgICAgICAgKTsKKyAgZXhpdCAoZWNvZGUpOworfQorCitzdGF0aWMgdm9pZAorcGNfbm90aWZ5IChEQnVzUGVuZGluZ0NhbGwgKnBjLAorICAgICAgICAgICB2b2lkICAgICAgICAgICAgKmRhdGEpCit7CisgIERCdXNNZXNzYWdlICptZXNzYWdlOworICBpbnQgKnJlY2VpdmVkX3AgPSBkYXRhOworICBEQnVzRXJyb3IgZXJyb3I7CisKKyAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworCisgIG1lc3NhZ2UgPSBkYnVzX3BlbmRpbmdfY2FsbF9zdGVhbF9yZXBseSAocGMpOworCisgIGlmICghaWdub3JlX2Vycm9ycyAmJiBkYnVzX21lc3NhZ2VfZ2V0X3R5cGUgKG1lc3NhZ2UpID09IERCVVNfTUVTU0FHRV9UWVBFX0VSUk9SKQorICAgIHsKKyAgICAgIGRidXNfc2V0X2Vycm9yX2Zyb21fbWVzc2FnZSAoJmVycm9yLCBtZXNzYWdlKTsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIkZhaWxlZCB0byByZWNlaXZlIHJlcGx5ICMlZDogJXM6ICVzXG4iLCAqcmVjZWl2ZWRfcCwKKyAgICAgICAgICAgICAgIGVycm9yLm5hbWUsIGVycm9yLm1lc3NhZ2UpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIFZFUkJPU0UgKHN0ZGVyciwgInJlY2VpdmVkIG1lc3NhZ2UgIyVkXG4iLCAqcmVjZWl2ZWRfcCk7CisgICAgfQorCisgICgqcmVjZWl2ZWRfcCkrKzsKK30KKworc3RhdGljIHZvaWQKK2NvbnN1bWVfc3RkaW4gKGNoYXIgICAqKnBheWxvYWRfcCwKKyAgICAgICAgICAgICAgIHNpemVfdCAgKmxlbl9wKQoreworICBjb25zdCBzaXplX3QgQkxPQ0tfU0laRSA9IDQwOTY7CisgIHNpemVfdCBsZW4gPSBCTE9DS19TSVpFOworICBzaXplX3QgcG9zID0gMDsKKyAgc2l6ZV90IG47CisgIGNoYXIgKmJ1ZjsKKworICBidWYgPSBkYnVzX21hbGxvYyAobGVuKTsKKworICBpZiAoYnVmID09IE5VTEwpCisgICAgdG9vbF9vb20gKCJyZWFkaW5nIHBheWxvYWQgZnJvbSBzdGRpbiIpOworCisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIGlmIChsZW4gLSBwb3MgPCBCTE9DS19TSVpFKQorICAgICAgICB7CisgICAgICAgICAgY2hhciAqdG1wID0gZGJ1c19yZWFsbG9jIChidWYsIGxlbiArIEJMT0NLX1NJWkUpOworCisgICAgICAgICAgaWYgKHRtcCA9PSBOVUxMKQorICAgICAgICAgICAgdG9vbF9vb20gKCJyZWFkaW5nIHBheWxvYWQgZnJvbSBzdGRpbiIpOworCisgICAgICAgICAgYnVmID0gdG1wOworICAgICAgICAgIGxlbiArPSBCTE9DS19TSVpFOworICAgICAgICB9CisKKyAgICAgIG4gPSBmcmVhZCAoYnVmICsgcG9zLCAxLCBsZW4gLSBwb3MsIHN0ZGluKTsKKworICAgICAgaWYgKG4gPD0gMCkKKyAgICAgICAgeworICAgICAgICAgIC8qIEVPRiBvciBlcnJvciAtIHRyZWF0IGFzIEVPRiAqLworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgIHBvcyArPSBuOworICAgIH0KKworICAqbGVuX3AgPSBwb3M7CisgICpwYXlsb2FkX3AgPSBidWY7Cit9CisKK2ludAorZGJ1c190ZXN0X3Rvb2xfc3BhbSAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IE5VTEw7CisgIERCdXNFcnJvciBlcnJvciA9IERCVVNfRVJST1JfSU5JVDsKKyAgREJ1c0J1c1R5cGUgdHlwZSA9IERCVVNfQlVTX1NFU1NJT047CisgIGNvbnN0IGNoYXIgKmRlc3RpbmF0aW9uID0gREJVU19TRVJWSUNFX0RCVVM7CisgIGludCBpOworICBpbnQgY291bnQgPSAxOworICBpbnQgc2VudCA9IDA7CisgIHVuc2lnbmVkIGludCBzZW50X2luX3RoaXNfY29ubiA9IDA7CisgIGludCByZWNlaXZlZCA9IDA7CisgIHVuc2lnbmVkIGludCByZWNlaXZlZF9iZWZvcmVfdGhpc19jb25uID0gMDsKKyAgaW50IHF1ZXVlX2xlbiA9IDE7CisgIGNvbnN0IGNoYXIgKnBheWxvYWQgPSBOVUxMOworICBjaGFyICpwYXlsb2FkX2J1ZiA9IE5VTEw7CisgIHNpemVfdCBwYXlsb2FkX2xlbjsKKyAgaW50IHBheWxvYWRfdHlwZSA9IERCVVNfVFlQRV9TVFJJTkc7CisgIERCdXNNZXNzYWdlICp0ZW1wbGF0ZSA9IE5VTEw7CisgIGRidXNfYm9vbF90IGZsb29kID0gRkFMU0U7CisgIGRidXNfYm9vbF90IG5vX3JlcGx5ID0gRkFMU0U7CisgIHVuc2lnbmVkIGludCBtZXNzYWdlc19wZXJfY29ubiA9IDA7CisgIHVuc2lnbmVkIGludCBzZWVkID0gdGltZSAoTlVMTCk7CisgIGludCBuX3JhbmRvbV9zaXplcyA9IDA7CisgIHVuc2lnbmVkIGludCAqcmFuZG9tX3NpemVzID0gTlVMTDsKKworICAvKiBhcmd2WzFdIGlzIHRoZSB0b29sIG5hbWUsIHNvIHN0YXJ0IGZyb20gMiAqLworCisgIGZvciAoaSA9IDI7IGkgPCBhcmdjOyBpKyspCisgICAgeworICAgICAgY29uc3QgY2hhciAqYXJnID0gYXJndltpXTsKKworICAgICAgaWYgKHBheWxvYWQgIT0gTlVMTCAmJgorICAgICAgICAgIChzdHJzdHIgKGFyZywgIi0tcGF5bG9hZD0iKSA9PSBhcmcgfHwKKyAgICAgICAgICAgc3RyY21wIChhcmcsICItLXN0ZGluIikgPT0gMCB8fAorICAgICAgICAgICBzdHJjbXAgKGFyZywgIi0tbWVzc2FnZS1zdGRpbiIpID09IDAgfHwKKyAgICAgICAgICAgc3RyY21wIChhcmcsICItLXJhbmRvbS1zaXplIikgPT0gMCkpCisgICAgICAgIHsKKyAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJBdCBtb3N0IG9uZSBvZiAtLXBheWxvYWQsIC0tc3RkaW4sIC0tbWVzc2FnZS1zdGRpbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiYW5kIC0tcmFuZG9tLXNpemUgbWF5IGJlIHNwZWNpZmllZFxuXG4iKTsKKyAgICAgICAgICB1c2FnZSAoMik7CisgICAgICAgIH0KKworICAgICAgaWYgKHN0cmNtcCAoYXJnLCAiLS1zeXN0ZW0iKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgdHlwZSA9IERCVVNfQlVTX1NZU1RFTTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICItLXNlc3Npb24iKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgdHlwZSA9IERCVVNfQlVTX1NFU1NJT047CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHN0cnN0ciAoYXJnLCAiLS1jb3VudD0iKSA9PSBhcmcpCisgICAgICAgIHsKKyAgICAgICAgICBjb3VudCA9IGF0b2kgKGFyZyArIHN0cmxlbiAoIi0tY291bnQ9IikpOworCisgICAgICAgICAgaWYgKGNvdW50IDwgMSkKKyAgICAgICAgICAgIHVzYWdlICgyKTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICItLWlnbm9yZS1lcnJvcnMiKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgaWdub3JlX2Vycm9ycyA9IFRSVUU7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHN0cnN0ciAoYXJnLCAiLS1kZXN0PSIpID09IGFyZykKKyAgICAgICAgeworICAgICAgICAgIGRlc3RpbmF0aW9uID0gYXJnICsgc3RybGVuICgiLS1kZXN0PSIpOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChzdHJzdHIgKGFyZywgIi0tcGF5bG9hZD0iKSA9PSBhcmcpCisgICAgICAgIHsKKyAgICAgICAgICBwYXlsb2FkID0gYXJnICsgc3RybGVuICgiLS1wYXlsb2FkPSIpOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgIi0tc3RkaW4iKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgY29uc3VtZV9zdGRpbiAoJnBheWxvYWRfYnVmLCAmcGF5bG9hZF9sZW4pOworICAgICAgICAgIHBheWxvYWQgPSBwYXlsb2FkX2J1ZjsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICItLW1lc3NhZ2Utc3RkaW4iKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgY29uc3VtZV9zdGRpbiAoJnBheWxvYWRfYnVmLCAmcGF5bG9hZF9sZW4pOworICAgICAgICAgIHBheWxvYWQgPSBwYXlsb2FkX2J1ZjsKKyAgICAgICAgICB0ZW1wbGF0ZSA9IGRidXNfbWVzc2FnZV9kZW1hcnNoYWwgKHBheWxvYWQsIHBheWxvYWRfbGVuLCAmZXJyb3IpOworCisgICAgICAgICAgaWYgKHRlbXBsYXRlID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIlVuYWJsZSB0byBkZW1hcnNoYWwgdGVtcGxhdGUgbWVzc2FnZTogJXM6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IubmFtZSwgZXJyb3IubWVzc2FnZSk7CisgICAgICAgICAgICAgIGV4aXQgKDEpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKGRidXNfbWVzc2FnZV9nZXRfdHlwZSAodGVtcGxhdGUpICE9IERCVVNfTUVTU0FHRV9UWVBFX01FVEhPRF9DQUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJUZW1wbGF0ZSBtZXNzYWdlIG11c3QgYmUgYSBtZXRob2QgY2FsbFxuIik7CisgICAgICAgICAgICAgIGV4aXQgKDEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgIi0tcmFuZG9tLXNpemUiKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgdW5zaWduZWQgaW50IGxlbiwgbWF4ID0gMDsKKyAgICAgICAgICBpbnQgaiwgY29uc3VtZWQgPSAwOworICAgICAgICAgIGNvbnN0IGNoYXIgKnA7CisKKyAgICAgICAgICBjb25zdW1lX3N0ZGluICgmcGF5bG9hZF9idWYsICZwYXlsb2FkX2xlbik7CisKKyAgICAgICAgICBmb3IgKHAgPSBwYXlsb2FkX2J1ZjsgcCA8IHBheWxvYWRfYnVmICsgcGF5bG9hZF9sZW47IHAgKz0gY29uc3VtZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8qIHRoZSBzcGFjZSBjaGFyYWN0ZXIgbWF0Y2hlcyBhbnkgKG9yIG5vKSB3aGl0ZXNwYWNlICovCisgICAgICAgICAgICAgIGlmIChzc2NhbmYgKHAsICIgJXUgJW4iLCAmbGVuLCAmY29uc3VtZWQpID09IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgbl9yYW5kb21fc2l6ZXMrKzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIHJhbmRvbV9zaXplcyA9IGRidXNfbmV3MCAodW5zaWduZWQgaW50LCBuX3JhbmRvbV9zaXplcyk7CisKKyAgICAgICAgICBpZiAocmFuZG9tX3NpemVzID09IE5VTEwpCisgICAgICAgICAgICB0b29sX29vbSAoImFsbG9jYXRpbmcgYXJyYXkgb2YgbWVzc2FnZSBsZW5ndGhzIik7CisKKyAgICAgICAgICBmb3IgKHAgPSBwYXlsb2FkX2J1ZiwgaiA9IDA7CisgICAgICAgICAgICAgIHAgPCBwYXlsb2FkX2J1ZiArIHBheWxvYWRfbGVuICYmIGogPCBuX3JhbmRvbV9zaXplczsKKyAgICAgICAgICAgICAgcCArPSBjb25zdW1lZCwgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBzc2NhbmYgKHAsICIgJXUgJW4iLCAmbGVuLCAmY29uc3VtZWQpOworICAgICAgICAgICAgICByYW5kb21fc2l6ZXNbal0gPSBsZW47CisKKyAgICAgICAgICAgICAgaWYgKGxlbiA+IG1heCkKKyAgICAgICAgICAgICAgICBtYXggPSBsZW47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBkYnVzX2ZyZWUgKHBheWxvYWRfYnVmKTsKKyAgICAgICAgICBwYXlsb2FkX2xlbiA9IG1heCArIDE7CisgICAgICAgICAgcGF5bG9hZF9idWYgPSBkYnVzX25ldyAoY2hhciwgcGF5bG9hZF9sZW4pOworICAgICAgICAgIHBheWxvYWQgPSBwYXlsb2FkX2J1ZjsKKworICAgICAgICAgIGlmIChwYXlsb2FkX2J1ZiA9PSBOVUxMKQorICAgICAgICAgICAgdG9vbF9vb20gKCJhbGxvY2F0aW5nIG1heGltdW0tc2l6ZWQgcGF5bG9hZCIpOworCisgICAgICAgICAgbWVtc2V0IChwYXlsb2FkX2J1ZiwgJ1gnLCBwYXlsb2FkX2xlbik7CisgICAgICAgICAgcGF5bG9hZF9idWZbcGF5bG9hZF9sZW4gLSAxXSA9ICdcMCc7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAiLS1lbXB0eSIpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICBwYXlsb2FkX3R5cGUgPSBEQlVTX1RZUEVfSU5WQUxJRDsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICItLXN0cmluZyIpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICBwYXlsb2FkX3R5cGUgPSBEQlVTX1RZUEVfU1RSSU5HOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgIi0tYnl0ZXMiKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgcGF5bG9hZF90eXBlID0gREJVU19UWVBFX0FSUkFZOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgIi0tZmxvb2QiKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgaWYgKHF1ZXVlX2xlbiA+IDEpCisgICAgICAgICAgICB1c2FnZSAoMik7CisKKyAgICAgICAgICBpZiAobWVzc2FnZXNfcGVyX2Nvbm4gPiAwKQorICAgICAgICAgICAgdXNhZ2UgKDIpOworCisgICAgICAgICAgZmxvb2QgPSBUUlVFOworICAgICAgICAgIHF1ZXVlX2xlbiA9IC0xOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgIi0tbm8tcmVwbHkiKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgaWYgKHF1ZXVlX2xlbiA+IDEpCisgICAgICAgICAgICB1c2FnZSAoMik7CisKKyAgICAgICAgICBxdWV1ZV9sZW4gPSAtMTsKKyAgICAgICAgICBub19yZXBseSA9IFRSVUU7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHN0cnN0ciAoYXJnLCAiLS1xdWV1ZT0iKSA9PSBhcmcpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoZmxvb2QgfHwgbm9fcmVwbHkpCisgICAgICAgICAgICB1c2FnZSAoMik7CisKKyAgICAgICAgICBxdWV1ZV9sZW4gPSBhdG9pIChhcmcgKyBzdHJsZW4gKCItLXF1ZXVlPSIpKTsKKworICAgICAgICAgIGlmIChxdWV1ZV9sZW4gPCAxKQorICAgICAgICAgICAgdXNhZ2UgKDIpOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChzdHJzdHIgKGFyZywgIi0tc2VlZD0iKSA9PSBhcmcpCisgICAgICAgIHsKKyAgICAgICAgICBzZWVkID0gc3RydG91bCAoYXJnICsgc3RybGVuICgiLS1zZWVkPSIpLCBOVUxMLCAxMCk7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHN0cnN0ciAoYXJnLCAiLS1tZXNzYWdlcy1wZXItY29ubj0iKSA9PSBhcmcpCisgICAgICAgIHsKKyAgICAgICAgICBtZXNzYWdlc19wZXJfY29ubiA9IGF0b2kgKGFyZyArIHN0cmxlbiAoIi0tbWVzc2FnZXMtcGVyLWNvbm49IikpOworCisgICAgICAgICAgaWYgKG1lc3NhZ2VzX3Blcl9jb25uID4gMCAmJiBmbG9vZCkKKyAgICAgICAgICAgIHVzYWdlICgyKTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgdXNhZ2UgKDIpOworICAgICAgICB9CisgICAgfQorCisgIHNyYW5kIChzZWVkKTsKKworICBpZiAocGF5bG9hZCA9PSBOVUxMKQorICAgIHsKKyAgICAgIHBheWxvYWQgPSAiaGVsbG8sIHdvcmxkISI7CisgICAgICBwYXlsb2FkX2xlbiA9IHN0cmxlbiAocGF5bG9hZCk7CisgICAgfQorCisgIFZFUkJPU0UgKHN0ZGVyciwgIldpbGwgc2VuZCB1cCB0byAlZCBtZXNzYWdlcywgd2l0aCB1cCB0byAlZCBxdWV1ZWQsIG1heCAlZCBwZXIgY29ubmVjdGlvblxuIiwKKyAgICAgICAgICAgY291bnQsIHF1ZXVlX2xlbiwgbWVzc2FnZXNfcGVyX2Nvbm4pOworCisgIHdoaWxlIChub19yZXBseSA/IHNlbnQgPCBjb3VudCA6IHJlY2VpdmVkIDwgY291bnQpCisgICAgeworICAgICAgLyogQ29ubmVjdD8KKyAgICAgICAqIC0gSW4gdGhlIGZpcnN0IGl0ZXJhdGlvbgorICAgICAgICogIG9yCisgICAgICAgKiAtIFdoZW4gbWVzc2FnZXNfcGVyX2Nvbm4gbWVzc2FnZXMgaGF2ZSBiZWVuIHNlbnQgYW5kIG5vIHJlcGxpZXMgYXJlIGJlaW5nIHdhaXRlZCBmb3IKKyAgICAgICAqLworICAgICAgaWYgKGNvbm5lY3Rpb24gPT0gTlVMTCB8fAorICAgICAgICAgIChtZXNzYWdlc19wZXJfY29ubiA+IDAgICYmIHNlbnRfaW5fdGhpc19jb25uID09IG1lc3NhZ2VzX3Blcl9jb25uICYmCisgICAgICAgICAgIChub19yZXBseSB8fCByZWNlaXZlZCAtIHJlY2VpdmVkX2JlZm9yZV90aGlzX2Nvbm4gPT0gbWVzc2FnZXNfcGVyX2Nvbm4pKSkKKyAgICAgICAgeworICAgICAgICAgIGlmIChjb25uZWN0aW9uICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfY29ubmVjdGlvbl9mbHVzaCAoY29ubmVjdGlvbik7CisgICAgICAgICAgICAgIGRidXNfY29ubmVjdGlvbl9jbG9zZSAoY29ubmVjdGlvbik7CisgICAgICAgICAgICAgIGRidXNfY29ubmVjdGlvbl91bnJlZiAoY29ubmVjdGlvbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBWRVJCT1NFIChzdGRlcnIsICJOZXcgY29ubmVjdGlvbi5cbiIpOworICAgICAgICAgIGNvbm5lY3Rpb24gPSBkYnVzX2J1c19nZXRfcHJpdmF0ZSAodHlwZSwgJmVycm9yKTsKKworICAgICAgICAgIGlmIChjb25uZWN0aW9uID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIkZhaWxlZCB0byBjb25uZWN0IHRvIGJ1czogJXM6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBlcnJvci5uYW1lLCBlcnJvci5tZXNzYWdlKTsKKyAgICAgICAgICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgICAgICAgICBkYnVzX2ZyZWUgKHJhbmRvbV9zaXplcyk7CisgICAgICAgICAgICAgIGRidXNfZnJlZSAocGF5bG9hZF9idWYpOworICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIHNlbnRfaW5fdGhpc19jb25uID0gMDsKKyAgICAgICAgICByZWNlaXZlZF9iZWZvcmVfdGhpc19jb25uID0gcmVjZWl2ZWQ7CisgICAgICAgIH0KKworICAgICAgLyogU2VuZCBhbm90aGVyIG1lc3NhZ2U/IE9ubHkgaWYgd2UgZG9uJ3QgZXhjZWVkIHRoZSAzIGxpbWl0czoKKyAgICAgICAqIC0gdG90YWwgYW1vdW50IG9mIG1lc3NhZ2VzCisgICAgICAgKiAtIG1lc3NhZ2VzIHNlbnQgb24gdGhpcyBjb25uZWN0aW9uCisgICAgICAgKiAtIHF1ZXVlCisgICAgICAgKi8KKyAgICAgIHdoaWxlIChzZW50IDwgY291bnQgJiYKKyAgICAgICAgICAgICAobWVzc2FnZXNfcGVyX2Nvbm4gPT0gMCB8fCBzZW50X2luX3RoaXNfY29ubiA8IG1lc3NhZ2VzX3Blcl9jb25uKSAmJgorICAgICAgICAgICAgIChxdWV1ZV9sZW4gPT0gLTEgfHwgc2VudF9pbl90aGlzX2Nvbm4gPCBxdWV1ZV9sZW4gKyByZWNlaXZlZCAtIHJlY2VpdmVkX2JlZm9yZV90aGlzX2Nvbm4pKQorICAgICAgICB7CisgICAgICAgICAgREJ1c01lc3NhZ2UgKm1lc3NhZ2U7CisKKyAgICAgICAgICBpZiAodGVtcGxhdGUgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9jb3B5ICh0ZW1wbGF0ZSk7CisKKyAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICB0b29sX29vbSAoImNvcHlpbmcgbWVzc2FnZSIpOworCisgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9zZXRfbm9fcmVwbHkgKG1lc3NhZ2UsIG5vX3JlcGx5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRidXNfYm9vbF90IG1lbTsKKyAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGxlbiA9IDA7CisKKyAgICAgICAgICAgICAgbWVzc2FnZSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKGRlc3RpbmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbS5leGFtcGxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTcGFtIik7CisKKyAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICB0b29sX29vbSAoImFsbG9jYXRpbmcgbWVzc2FnZSIpOworCisgICAgICAgICAgICAgIGRidXNfbWVzc2FnZV9zZXRfbm9fcmVwbHkgKG1lc3NhZ2UsIG5vX3JlcGx5KTsKKworICAgICAgICAgICAgICBzd2l0Y2ggKHBheWxvYWRfdHlwZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBjYXNlIERCVVNfVFlQRV9TVFJJTkc6CisgICAgICAgICAgICAgICAgICAgIGlmIChyYW5kb21fc2l6ZXMgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGlzIGlzbid0IGZhaXIsIHN0cmljdGx5IHNwZWFraW5nIC0gdGhlIGZpcnN0IGZldworICAgICAgICAgICAgICAgICAgICAgICAgICogYXJlIGEgYml0IG1vcmUgbGlrZWx5IHRvIGJlIGNob3NlbiwgdW5sZXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBSQU5EX01BWCBpcyBkaXZpc2libGUgYnkgbl9yYW5kb21fc2l6ZXMgLSBidXQgaXQncworICAgICAgICAgICAgICAgICAgICAgICAgICogZ29vZCBlbm91Z2ggZm9yIHRyYWZmaWMtZ2VuZXJhdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gcmFuZG9tX3NpemVzW3JhbmQgKCkgJSBuX3JhbmRvbV9zaXplc107CisgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkX2J1ZltsZW5dID0gJ1wwJzsKKyAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgbWVtID0gZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzIChtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZwYXlsb2FkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAocmFuZG9tX3NpemVzICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogdW5kbyB0aGUgdHJ1bmNhdGlvbiBhYm92ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZF9idWZbbGVuXSA9ICdYJzsKKyAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgIGNhc2UgREJVU19UWVBFX0FSUkFZOgorICAgICAgICAgICAgICAgICAgICBsZW4gPSBwYXlsb2FkX2xlbjsKKworICAgICAgICAgICAgICAgICAgICAvKiBhcyBhYm92ZSwgbm90IHN0cmljdGx5IGZhaXIsIGJ1dCBjbG9zZSBlbm91Z2ggKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKHJhbmRvbV9zaXplcyAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IHJhbmRvbV9zaXplc1tyYW5kICgpICUgbl9yYW5kb21fc2l6ZXNdOworCisgICAgICAgICAgICAgICAgICAgIG1lbSA9IGRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyAobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfQVJSQVksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfQllURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXlsb2FkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRidXNfdWludDMyX3QpIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBtZW0gPSBUUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBpZiAoIW1lbSkKKyAgICAgICAgICAgICAgICB0b29sX29vbSAoImJ1aWxkaW5nIG1lc3NhZ2UiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChub19yZXBseSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fc2VuZCAoY29ubmVjdGlvbiwgbWVzc2FnZSwgTlVMTCkpCisgICAgICAgICAgICAgICAgdG9vbF9vb20gKCJzZW5kaW5nIG1lc3NhZ2UiKTsKKworICAgICAgICAgICAgICBWRVJCT1NFIChzdGRlcnIsICJzZW50IG1lc3NhZ2UgIyVkXG4iLCBzZW50KTsKKyAgICAgICAgICAgICAgc2VudCsrOworICAgICAgICAgICAgICBzZW50X2luX3RoaXNfY29ubisrOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgREJ1c1BlbmRpbmdDYWxsICpwYzsKKworICAgICAgICAgICAgICBpZiAoIWRidXNfY29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHkgKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19USU1FT1VUX0lORklOSVRFKSkKKyAgICAgICAgICAgICAgICB0b29sX29vbSAoInNlbmRpbmcgbWVzc2FnZSIpOworCisgICAgICAgICAgICAgIFZFUkJPU0UgKHN0ZGVyciwgInNlbnQgbWVzc2FnZSAjJWRcbiIsIHNlbnQpOworICAgICAgICAgICAgICBzZW50Kys7CisgICAgICAgICAgICAgIHNlbnRfaW5fdGhpc19jb25uKys7CisKKyAgICAgICAgICAgICAgaWYgKHBjID09IE5VTEwpCisgICAgICAgICAgICAgICAgdG9vbF9vb20gKCJzZW5kaW5nIG1lc3NhZ2UiKTsKKworICAgICAgICAgICAgICBpZiAoZGJ1c19wZW5kaW5nX2NhbGxfZ2V0X2NvbXBsZXRlZCAocGMpKQorICAgICAgICAgICAgICAgIHBjX25vdGlmeSAocGMsICZyZWNlaXZlZCk7CisgICAgICAgICAgICAgIGVsc2UgaWYgKCFkYnVzX3BlbmRpbmdfY2FsbF9zZXRfbm90aWZ5IChwYywgcGNfbm90aWZ5LCAmcmVjZWl2ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkKKyAgICAgICAgICAgICAgICB0b29sX29vbSAoInNldHRpbmcgcGVuZGluZyBjYWxsIG5vdGlmaWVyIik7CisKKyAgICAgICAgICAgICAgZGJ1c19wZW5kaW5nX2NhbGxfdW5yZWYgKHBjKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGRidXNfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICAgIH0KKworICAgICAgaWYgKCFkYnVzX2Nvbm5lY3Rpb25fcmVhZF93cml0ZV9kaXNwYXRjaCAoY29ubmVjdGlvbiwgLTEpKQorICAgICAgICB7CisgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiRGlzY29ubmVjdGVkIGZyb20gYnVzXG4iKTsKKyAgICAgICAgICBleGl0ICgxKTsKKyAgICAgICAgfQorICAgIH0KKworICBpZiAoY29ubmVjdGlvbiAhPSBOVUxMKQorICAgIHsKKyAgICAgIGRidXNfY29ubmVjdGlvbl9mbHVzaCAoY29ubmVjdGlvbik7CisgICAgICBkYnVzX2Nvbm5lY3Rpb25fY2xvc2UgKGNvbm5lY3Rpb24pOworICAgICAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChjb25uZWN0aW9uKTsKKyAgICB9CisKKyAgVkVSQk9TRSAoc3RkZXJyLCAiRG9uZVxuIik7CisKKyAgZGJ1c19mcmVlIChwYXlsb2FkX2J1Zik7CisgIGRidXNfZnJlZSAocmFuZG9tX3NpemVzKTsKKworICBpZiAodGVtcGxhdGUgIT0gTlVMTCkKKyAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHRlbXBsYXRlKTsKKworICBkYnVzX3NodXRkb3duICgpOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2RidXMtdXBkYXRlLWFjdGl2YXRpb24tZW52aXJvbm1lbnQuYyBiL3Rvb2xzL2RidXMtdXBkYXRlLWFjdGl2YXRpb24tZW52aXJvbm1lbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTJlNTA1Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvZGJ1cy11cGRhdGUtYWN0aXZhdGlvbi1lbnZpcm9ubWVudC5jCkBAIC0wLDAgKzEsNDI4IEBACisvKgorICogZGJ1cy11cGRhdGUtYWN0aXZhdGlvbi1lbnZpcm9ubWVudCAtIHVwZGF0ZSBELUJ1cywgYW5kIG9wdGlvbmFsbHkKKyAqIHN5c3RlbWQsIGFjdGl2YXRpb24gZW52aXJvbm1lbnQKKyAqCisgKiBDb3B5cmlnaHQgwqkgMjAxNC0yMDE1IENvbGxhYm9yYSBMdGQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzCisgKiAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLAorICogaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwKKyAqIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsCisgKiBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAorICogc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKKyAqIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2lmZGVmIEhBVkVfU1lTRVhJVFNfSAorIyBpbmNsdWRlIDxzeXNleGl0cy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxkYnVzL2RidXMuaD4KKworI2lmZGVmIERCVVNfVU5JWAorIyBpbmNsdWRlIDx1bmlzdGQuaD4KKyMgaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgInRvb2wtY29tbW9uLmgiCisKKyNkZWZpbmUgUFJPR05BTUUgImRidXMtdXBkYXRlLWFjdGl2YXRpb24tZW52aXJvbm1lbnQiCisKKyNpZm5kZWYgRVhfVVNBR0UKKyMgZGVmaW5lIEVYX1VTQUdFIDY0CisjZW5kaWYKKworI2lmbmRlZiBFWF9VTkFWQUlMQUJMRQorIyBkZWZpbmUgRVhfVU5BVkFJTEFCTEUgNjkKKyNlbmRpZgorCisjaWZuZGVmIEVYX09TRVJSCisjIGRlZmluZSBFWF9PU0VSUiA3MQorI2VuZGlmCisKKyNpZmRlZiBEQlVTX1dJTgorLyogVGhlIFdpbmRvd3MgQyBydW50aW1lIHVzZXMgYSBkaWZmZXJlbnQgbmFtZSAqLworI2RlZmluZSBlbnZpcm9uIF9lbnZpcm9uCisjZWxpZiBkZWZpbmVkKF9fQVBQTEVfXykKKyMgaW5jbHVkZSA8Y3J0X2V4dGVybnMuaD4KKyMgZGVmaW5lIGVudmlyb24gKCpfTlNHZXRFbnZpcm9uICgpKQorI2VsaWYgSEFWRV9ERUNMX0VOVklST04gJiYgZGVmaW5lZChIQVZFX1VOSVNURF9IKQorIyBpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbHNlCitleHRlcm4gY2hhciAqKmVudmlyb247CisjZW5kaWYKKworLyogd2UgZG9uJ3QgcmVhbGx5IGhhdmUgYW55dGhpbmcgdXNlZnVsIHRvIHNheSBhYm91dCB0aGUgc3RhZ2UgYXQgd2hpY2ggd2UKKyAqIGZhaWxlZCAqLworI2RlZmluZSBvb20oKSB0b29sX29vbSAoInVwZGF0aW5nIGVudmlyb25tZW50IikKKworc3RhdGljIGRidXNfYm9vbF90IHZlcmJvc2UgPSBGQUxTRTsKKworc3RhdGljIHZvaWQgc2F5IChjb25zdCBjaGFyICpmb3JtYXQsIC4uLikgX0RCVVNfR05VQ19QUklOVEYgKDEsIDIpOworCitzdGF0aWMgdm9pZAorc2F5IChjb25zdCBjaGFyICpmb3JtYXQsCisgICAgLi4uKQoreworICB2YV9saXN0IGFwOworCisgIGlmICghdmVyYm9zZSkKKyAgICByZXR1cm47CisKKyAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICIsIFBST0dOQU1FKTsKKyAgdmFfc3RhcnQgKGFwLCBmb3JtYXQpOworICB2ZnByaW50ZiAoc3RkZXJyLCBmb3JtYXQsIGFwKTsKKyAgZnB1dGMgKCdcbicsIHN0ZGVycik7CisgIHZhX2VuZCAoYXApOworfQorCisjaWZkZWYgX19saW51eF9fCitzdGF0aWMgZGJ1c19ib29sX3QKK3N5c3RlbWRfdXNlcl9ydW5uaW5nICh2b2lkKQoreworICBjaGFyICp4ZGdfcnVudGltZV9kaXIgPSBnZXRlbnYgKCJYREdfUlVOVElNRV9ESVIiKTsKKyAgY2hhciAqcGF0aDsKKyAgc3RydWN0IHN0YXQgYnVmOworICBkYnVzX2Jvb2xfdCByZXQgPSBGQUxTRTsKKworICBpZiAoeGRnX3J1bnRpbWVfZGlyID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIC8qIEFzc3VtZSB0aGF0IFhER19SVU5USU1FX0RJUi9zeXN0ZW1kIGV4aXN0cyBpZiBhbmQgb25seSBpZgorICAgKiAic3lzdGVtZCAtLXVzZXIiIGlzIHJ1bm5pbmcuIEl0J3MgT0sgdG8gdXNlIGFzcHJpbnRmKCkgaGVyZQorICAgKiBiZWNhdXNlIHdlIGtub3cgd2UncmUgb24gTGludXguICovCisgIGlmIChhc3ByaW50ZiAoJnBhdGgsICIlcy9zeXN0ZW1kIiwgeGRnX3J1bnRpbWVfZGlyKSA8IDApCisgICAgb29tICgpOworCisgIGlmIChzdGF0IChwYXRoLCAmYnVmKSA9PSAwKQorICAgIHJldCA9IFRSVUU7CisKKyAgZnJlZSAocGF0aCk7CisgIHJldHVybiByZXQ7Cit9CisjZW5kaWYKKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgIERCdXNDb25uZWN0aW9uICpjb25uOworICBEQnVzTWVzc2FnZSAqbXNnOworICBEQnVzTWVzc2FnZSAqcmVwbHk7CisgIERCdXNFcnJvciBlcnJvciA9IERCVVNfRVJST1JfSU5JVDsKKyAgREJ1c01lc3NhZ2VJdGVyIG1zZ19pdGVyOworICBEQnVzTWVzc2FnZUl0ZXIgYXJyYXlfaXRlcjsKKyAgaW50IGk7CisgIGludCBmaXJzdF9ub25fb3B0aW9uID0gYXJnYzsKKyAgZGJ1c19ib29sX3QgYWxsID0gRkFMU0U7CisjaWZkZWYgX19saW51eF9fCisgIERCdXNNZXNzYWdlICpzZF9tc2cgPSBOVUxMOworICBEQnVzTWVzc2FnZUl0ZXIgc2RfbXNnX2l0ZXI7CisgIERCdXNNZXNzYWdlSXRlciBzZF9hcnJheV9pdGVyOworICBkYnVzX2Jvb2xfdCBzeXN0ZW1kID0gRkFMU0U7CisjZW5kaWYKKworICBmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKQorICAgIHsKKyAgICAgIGlmIChhcmd2W2ldWzBdICE9ICctJykKKyAgICAgICAgeworICAgICAgICAgIGZpcnN0X25vbl9vcHRpb24gPSBpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZ3ZbaV0sICItLSIpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICBmaXJzdF9ub25fb3B0aW9uID0gaSArIDE7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJndltpXSwgIi0tYWxsIikgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIGFsbCA9IFRSVUU7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJndltpXSwgIi0tc3lzdGVtZCIpID09IDApCisgICAgICAgIHsKKyNpZmRlZiBfX2xpbnV4X18KKyAgICAgICAgICBzeXN0ZW1kID0gVFJVRTsKKyNlbHNlCisgICAgICAgICAgc2F5ICgibm90IG9uIExpbnV4LCBpZ25vcmluZyAtLXN5c3RlbWQgYXJndW1lbnQiKTsKKyNlbmRpZgorICAgICAgICB9CisgICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZ3ZbaV0sICItLXZlcmJvc2UiKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgdmVyYm9zZSA9IFRSVUU7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwKKyAgICAgICAgICAgICAgIiUxJHM6IHVwZGF0ZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdGhhdCB3aWxsIGJlIHNldCBmb3IgRC1CdXNcbiIKKyAgICAgICAgICAgICAgIiAgICBzZXNzaW9uIHNlcnZpY2VzXG4iCisgICAgICAgICAgICAgICJcbiIKKyAgICAgICAgICAgICAgIiUxJHMgW29wdGlvbnNdIFZBUls9VkFMXSBbVkFSMls9VkFMMl0gLi4uXVxuIgorICAgICAgICAgICAgICAiICAgIEFkZCBzcGVjaWZpZWQgdmFyaWFibGVzIHRvIEQtQnVzIGFjdGl2YXRpb24gZW52aXJvbm1lbnQuXG4iCisgICAgICAgICAgICAgICIgICAgSWYgb21pdHRlZCwgdmFsdWVzIGFyZSB0YWtlbiBmcm9tIGN1cnJlbnQgZW52aXJvbm1lbnQ7XG4iCisgICAgICAgICAgICAgICIgICAgdmFyaWFibGVzIG5vdCBmb3VuZCBpbiB0aGUgZW52aXJvbm1lbnQgYXJlIGlnbm9yZWQuXG4iCisgICAgICAgICAgICAgICIlMSRzIC0tYWxsXG4iCisgICAgICAgICAgICAgICIgICAgQWRkIGVudGlyZSBjdXJyZW50IGVudmlyb25tZW50IHRvIEQtQnVzIGFjdGl2YXRpb25cbiIKKyAgICAgICAgICAgICAgIiAgICBlbnZpcm9ubWVudC5cbiIKKyAgICAgICAgICAgICAgIlxuIgorICAgICAgICAgICAgICAiT3B0aW9uczpcbiIKKyAgICAgICAgICAgICAgIlxuIgorICAgICAgICAgICAgICAiLS1hbGxcbiIKKyAgICAgICAgICAgICAgIiAgICBVcGxvYWQgYWxsIGVudmlyb25tZW50IHZhcmlhYmxlcy5cbiIKKyAgICAgICAgICAgICAgIi0tc3lzdGVtZFxuIgorICAgICAgICAgICAgICAiICAgIEFsc28gdXBkYXRlIHRoZSAnc3lzdGVtZCAtLXVzZXInIGVudmlyb25tZW50XG4iCisgICAgICAgICAgICAgICIgICAgaWYgcG9zc2libGUuXG4iCisgICAgICAgICAgICAgICItLXZlcmJvc2VcbiIKKyAgICAgICAgICAgICAgIiAgICBUYWxrIGFib3V0IGl0LlxuIgorICAgICAgICAgICAgICAsCisgICAgICAgICAgICAgIFBST0dOQU1FKTsKKyAgICAgICAgICBleGl0IChFWF9VU0FHRSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgaWYgKGFsbCAmJiBmaXJzdF9ub25fb3B0aW9uIDwgYXJnYykKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICIlczogZXJyb3I6IC0tYWxsIGNhbm5vdCBiZSB1c2VkIHdpdGggVkFSIG9yICIKKyAgICAgICAgICAgICAgICJWQVI9VkFMIGFyZ3VtZW50c1xuIiwgUFJPR05BTUUpOworICAgICAgZXhpdCAoRVhfVVNBR0UpOworICAgIH0KKworICBjb25uID0gZGJ1c19idXNfZ2V0IChEQlVTX0JVU19TRVNTSU9OLCAmZXJyb3IpOworCisgIGlmIChjb25uID09IE5VTEwpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLAorICAgICAgICAgICIlczogZXJyb3I6IHVuYWJsZSB0byBjb25uZWN0IHRvIEQtQnVzOiAlc1xuIiwgUFJPR05BTUUsCisgICAgICAgICAgZXJyb3IubWVzc2FnZSk7CisgICAgICBleGl0IChFWF9PU0VSUik7CisgICAgfQorCisgIG1zZyA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX2NhbGwgKERCVVNfU0VSVklDRV9EQlVTLCBEQlVTX1BBVEhfREJVUywKKyAgICAgIERCVVNfSU5URVJGQUNFX0RCVVMsICJVcGRhdGVBY3RpdmF0aW9uRW52aXJvbm1lbnQiKTsKKworICBpZiAobXNnID09IE5VTEwpCisgICAgb29tICgpOworCisgIGRidXNfbWVzc2FnZV9pdGVyX2luaXRfYXBwZW5kIChtc2csICZtc2dfaXRlcik7CisKKyAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9vcGVuX2NvbnRhaW5lciAoJm1zZ19pdGVyLCBEQlVTX1RZUEVfQVJSQVksCisgICAgICAie3NzfSIsICZhcnJheV9pdGVyKSkKKyAgICBvb20gKCk7CisKKyNpZmRlZiBfX2xpbnV4X18KKyAgaWYgKHN5c3RlbWQpCisgICAgeworICAgICAgaWYgKCFzeXN0ZW1kX3VzZXJfcnVubmluZyAoKSkKKyAgICAgICAgeworICAgICAgICAgIC8qIFRoaXMgaXMgb25seSBiZXN0LWVmZm9ydC4gKi8KKyAgICAgICAgICBzYXkgKCJzeXN0ZW1kIC0tdXNlciBub3QgZm91bmQsIGlnbm9yaW5nIC0tc3lzdGVtZCBhcmd1bWVudCIpOworICAgICAgICAgIHN5c3RlbWQgPSBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICBpZiAoc3lzdGVtZCkKKyAgICB7CisgICAgICBzZF9tc2cgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9jYWxsICgib3JnLmZyZWVkZXNrdG9wLnN5c3RlbWQxIiwKKyAgICAgICAgICAiL29yZy9mcmVlZGVza3RvcC9zeXN0ZW1kMSIsICJvcmcuZnJlZWRlc2t0b3Auc3lzdGVtZDEuTWFuYWdlciIsCisgICAgICAgICAgIlNldEVudmlyb25tZW50Iik7CisKKyAgICAgIGlmIChzZF9tc2cgPT0gTlVMTCkKKyAgICAgICAgb29tICgpOworCisgICAgICBkYnVzX21lc3NhZ2VfaXRlcl9pbml0X2FwcGVuZCAoc2RfbXNnLCAmc2RfbXNnX2l0ZXIpOworCisgICAgICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX29wZW5fY29udGFpbmVyICgmc2RfbXNnX2l0ZXIsIERCVVNfVFlQRV9BUlJBWSwKKyAgICAgICAgICAicyIsICZzZF9hcnJheV9pdGVyKSkKKyAgICAgICAgb29tICgpOworICAgIH0KKyNlbmRpZgorCisgIGZvciAoaSA9IGFsbCA/IDAgOiBmaXJzdF9ub25fb3B0aW9uOworICAgICAgYWxsID8gZW52aXJvbltpXSAhPSBOVUxMIDogaSA8IGFyZ2M7CisgICAgICBpKyspCisgICAgeworICAgICAgY29uc3QgY2hhciAqdmFyOworICAgICAgY2hhciAqY29weTsKKyAgICAgIGNoYXIgKmVxOworICAgICAgY29uc3QgY2hhciAqdmFsOworICAgICAgREJ1c01lc3NhZ2VJdGVyIHBhaXJfaXRlcjsKKworICAgICAgaWYgKGFsbCkKKyAgICAgICAgdmFyID0gZW52aXJvbltpXTsKKyAgICAgIGVsc2UKKyAgICAgICAgdmFyID0gYXJndltpXTsKKworICAgICAgY29weSA9IHN0cmR1cCAodmFyKTsKKworICAgICAgaWYgKGNvcHkgPT0gTlVMTCkKKyAgICAgICAgb29tICgpOworCisgICAgICBpZiAoIWRidXNfdmFsaWRhdGVfdXRmOCAodmFyLCBOVUxMKSkKKyAgICAgICAgeworICAgICAgICAgIC8qIHZhciBpcyBlaXRoZXIgb2YgdGhlIGZvcm0gVkFSIG9yIFZBUj1WQUwgKi8KKyAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsCisgICAgICAgICAgICAgICIlczogd2FybmluZzogZW52aXJvbm1lbnQgdmFyaWFibGUgbm90IFVURi04OiAlc1xuIiwKKyAgICAgICAgICAgICAgUFJPR05BTUUsIHZhcik7CisgICAgICAgICAgZ290byBuZXh0OworICAgICAgICB9CisKKyAgICAgIGVxID0gc3RyY2hyIChjb3B5LCAnPScpOworCisgICAgICBpZiAoZXEgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGlmIChhbGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8qIGl0ZW1zIGluIHRoZSBlbnZpcm9ubWVudCBibG9jayBzaG91bGQgYmUgb2YgdGhlIGZvcm0KKyAgICAgICAgICAgICAgICogVkFSPVZBTCAqLworICAgICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsCisgICAgICAgICAgICAgICAgICAiJXM6IHdhcm5pbmc6IGVudmlyb25tZW50IHZhcmlhYmxlIHdpdGhvdXQgJz0nOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgIFBST0dOQU1FLCB2YXIpOworICAgICAgICAgICAgICBnb3RvIG5leHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvKiBpdGVtcyBvbiB0aGUgY29tbWFuZC1saW5lIG1heSBiZSBvZiB0aGUgZm9ybSBWQVIKKyAgICAgICAgICAgICAgICogaW4gd2hpY2ggY2FzZSB3ZSBpbmZlciB0aGUgdmFsdWUgZnJvbSB0aGUgZW52aXJvbm1lbnQgKi8KKyAgICAgICAgICAgICAgdmFsID0gZ2V0ZW52ICh2YXIpOworCisgICAgICAgICAgICAgIGlmICh2YWwgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAvKiBub3RoaW5nIHRvIGJlIGRvbmUgaGVyZSAqLworICAgICAgICAgICAgICAgICAgZ290byBuZXh0OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBpZiAoIWRidXNfdmFsaWRhdGVfdXRmOCAodmFsLCBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsCisgICAgICAgICAgICAgICAgICAgICAgIiVzOiB3YXJuaW5nOiBlbnZpcm9ubWVudCB2YXJpYWJsZSBub3QgVVRGLTg6ICVzPSVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgIFBST0dOQU1FLCB2YXIsIHZhbCk7CisgICAgICAgICAgICAgICAgICBnb3RvIG5leHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvKiBzcGxpdCBWQVI9VkFMIGludG8gVkFSIGFuZCBWQUwgKi8KKyAgICAgICAgICAqZXEgPSAnXDAnOworICAgICAgICAgIHZhbCA9IGVxICsgMTsKKyAgICAgICAgfQorCisjaWZkZWYgX19saW51eF9fCisgICAgICBpZiAoc3lzdGVtZCkKKyAgICAgICAgeworICAgICAgICAgIGNoYXIgKmNvbWJpbmVkOworCisgICAgICAgICAgLyogcmVjb21iaW5lIGlmIG5lY2Vzc2FyeSAqLworICAgICAgICAgIGlmIChhc3ByaW50ZiAoJmNvbWJpbmVkLCAiJXM9JXMiLCBjb3B5LCB2YWwpIDwgMCkKKyAgICAgICAgICAgIG9vbSAoKTsKKworICAgICAgICAgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfYXBwZW5kX2Jhc2ljICgmc2RfYXJyYXlfaXRlciwKKyAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmY29tYmluZWQpKQorICAgICAgICAgICAgb29tICgpOworCisgICAgICAgICAgZnJlZSAoY29tYmluZWQpOworICAgICAgICB9CisjZW5kaWYKKworICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9vcGVuX2NvbnRhaW5lciAoJmFycmF5X2l0ZXIsCisgICAgICAgICAgICAgIERCVVNfVFlQRV9ESUNUX0VOVFJZLCBOVUxMLCAmcGFpcl9pdGVyKSkKKyAgICAgICAgb29tICgpOworCisgICAgICBzYXkgKCJzZXR0aW5nICVzPSVzIiwgY29weSwgdmFsKTsKKworICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9hcHBlbmRfYmFzaWMgKCZwYWlyX2l0ZXIsIERCVVNfVFlQRV9TVFJJTkcsCisgICAgICAgICAgICAgICZjb3B5KSkKKyAgICAgICAgb29tICgpOworCisgICAgICBpZiAoIWRidXNfbWVzc2FnZV9pdGVyX2FwcGVuZF9iYXNpYyAoJnBhaXJfaXRlciwgREJVU19UWVBFX1NUUklORywKKyAgICAgICAgICAgICAgJnZhbCkpCisgICAgICAgIG9vbSAoKTsKKworICAgICAgaWYgKCFkYnVzX21lc3NhZ2VfaXRlcl9jbG9zZV9jb250YWluZXIgKCZhcnJheV9pdGVyLCAmcGFpcl9pdGVyKSkKKyAgICAgICAgb29tICgpOworCituZXh0OgorICAgICAgZnJlZSAoY29weSk7CisgICAgfQorCisgIGlmICghZGJ1c19tZXNzYWdlX2l0ZXJfY2xvc2VfY29udGFpbmVyICgmbXNnX2l0ZXIsICZhcnJheV9pdGVyKSkKKyAgICBvb20gKCk7CisKKyNpZmRlZiBfX2xpbnV4X18KKyAgaWYgKHN5c3RlbWQgJiYKKyAgICAgICFkYnVzX21lc3NhZ2VfaXRlcl9jbG9zZV9jb250YWluZXIgKCZzZF9tc2dfaXRlciwgJnNkX2FycmF5X2l0ZXIpKQorICAgIG9vbSAoKTsKKyNlbmRpZgorCisgIHJlcGx5ID0gZGJ1c19jb25uZWN0aW9uX3NlbmRfd2l0aF9yZXBseV9hbmRfYmxvY2sgKGNvbm4sIG1zZywgLTEsICZlcnJvcik7CisKKyAgaWYgKHJlcGx5ID09IE5VTEwpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLAorICAgICAgICAgICIlczogZXJyb3Igc2VuZGluZyB0byBkYnVzLWRhZW1vbjogJXM6ICVzXG4iLAorICAgICAgICAgIFBST0dOQU1FLCBlcnJvci5uYW1lLCBlcnJvci5tZXNzYWdlKTsKKyAgICAgIGV4aXQgKEVYX1VOQVZBSUxBQkxFKTsKKyAgICB9CisKKyAgaWYgKGRidXNfc2V0X2Vycm9yX2Zyb21fbWVzc2FnZSAoJmVycm9yLCBtc2cpIHx8CisgICAgICAhZGJ1c19tZXNzYWdlX2dldF9hcmdzIChtc2csICZlcnJvciwgREJVU19UWVBFX0lOVkFMSUQpKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwKKyAgICAgICAgICAiJXM6IGVycm9yIGZyb20gZGJ1cy1kYWVtb246ICVzOiAlc1xuIiwKKyAgICAgICAgICBQUk9HTkFNRSwgZXJyb3IubmFtZSwgZXJyb3IubWVzc2FnZSk7CisgICAgICBleGl0IChFWF9VTkFWQUlMQUJMRSk7CisgICAgfQorCisgIGRidXNfbWVzc2FnZV91bnJlZiAocmVwbHkpOworCisjaWZkZWYgX19saW51eF9fCisgIGlmIChzeXN0ZW1kKQorICAgIHsKKyAgICAgIHJlcGx5ID0gZGJ1c19jb25uZWN0aW9uX3NlbmRfd2l0aF9yZXBseV9hbmRfYmxvY2sgKGNvbm4sIHNkX21zZywgLTEsCisgICAgICAgICAgJmVycm9yKTsKKworICAgICAgLyogbm9uLWZhdGFsLCB0aGUgbWFpbiBwdXJwb3NlIG9mIHRoaXMgdGhpbmcgaXMgdG8gY29tbXVuaWNhdGUKKyAgICAgICAqIHdpdGggZGJ1cy1kYWVtb24gKi8KKyAgICAgIGlmIChyZXBseSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLAorICAgICAgICAgICAgICAiJXM6IHdhcm5pbmc6IGVycm9yIHNlbmRpbmcgdG8gc3lzdGVtZDogJXM6ICVzXG4iLAorICAgICAgICAgICAgICBQUk9HTkFNRSwgZXJyb3IubmFtZSwgZXJyb3IubWVzc2FnZSk7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKGRidXNfc2V0X2Vycm9yX2Zyb21fbWVzc2FnZSAoJmVycm9yLCBtc2cpIHx8CisgICAgICAgICAgIWRidXNfbWVzc2FnZV9nZXRfYXJncyAobXNnLCAmZXJyb3IsIERCVVNfVFlQRV9JTlZBTElEKSkKKyAgICAgICAgeworICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwKKyAgICAgICAgICAgICAgIiVzOiB3YXJuaW5nOiBlcnJvciBmcm9tIHN5c3RlbWQ6ICVzOiAlc1xuIiwKKyAgICAgICAgICAgICAgUFJPR05BTUUsIGVycm9yLm5hbWUsIGVycm9yLm1lc3NhZ2UpOworICAgICAgICB9CisKKyAgICAgIGlmIChyZXBseSAhPSBOVUxMKQorICAgICAgICBkYnVzX21lc3NhZ2VfdW5yZWYgKHJlcGx5KTsKKworICAgICAgZGJ1c19tZXNzYWdlX3VucmVmIChzZF9tc2cpOworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgIH0KKyNlbmRpZgorCisgIGRidXNfbWVzc2FnZV91bnJlZiAobXNnKTsKKyAgZGJ1c19jb25uZWN0aW9uX3VucmVmIChjb25uKTsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90b29scy9kYnVzLXV1aWRnZW4uYyBiL3Rvb2xzL2RidXMtdXVpZGdlbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzN2JkZDAKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9kYnVzLXV1aWRnZW4uYwpAQCAtMCwwICsxLDE2MyBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXV1aWRnZW4uYyAgVXRpbGl0eSBwcm9ncmFtIHRvIGNyZWF0ZSBVVUlEcworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBSZWQgSGF0LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLXV1aWRnZW4uaD4KKyNpbmNsdWRlIDxkYnVzL2RidXMuaD4KKworc3RhdGljIHZvaWQgdXNhZ2UgKGNvbnN0IGNoYXIgKm5hbWUsIGludCBlY29kZSkgX0RCVVNfR05VQ19OT1JFVFVSTjsKKworc3RhdGljIHZvaWQKK3VzYWdlIChjb25zdCBjaGFyICpuYW1lLAorICAgICAgIGludCBlY29kZSkKK3sKKyAgaWYgKG5hbWUgPT0gTlVMTCkKKyAgICBuYW1lID0gImRidXMtdXVpZGdlbiI7CisgIAorICBmcHJpbnRmIChzdGRlcnIsICJVc2FnZTogJXMgWy0tZW5zdXJlWz1GSUxFTkFNRV1dIFstLWdldFs9RklMRU5BTUVdXVxuIiwgbmFtZSk7CisgIGV4aXQgKGVjb2RlKTsKK30KKworc3RhdGljIHZvaWQgdmVyc2lvbiAodm9pZCkgX0RCVVNfR05VQ19OT1JFVFVSTjsKKworc3RhdGljIHZvaWQKK3ZlcnNpb24gKHZvaWQpCit7CisgIHByaW50ZiAoIkQtQnVzIFVVSUQgR2VuZXJhdG9yICVzXG4iCisgICAgICAgICAgIkNvcHlyaWdodCAoQykgMjAwNiBSZWQgSGF0LCBJbmMuXG4iCisgICAgICAgICAgIlRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgc2VlIHRoZSBzb3VyY2UgZm9yIGNvcHlpbmcgY29uZGl0aW9ucy5cbiIKKyAgICAgICAgICAiVGhlcmUgaXMgTk8gd2FycmFudHk7IG5vdCBldmVuIGZvciBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuXG4iLAorICAgICAgICAgIFZFUlNJT04pOworICBleGl0ICgwKTsKK30KKworc3RhdGljIGRidXNfYm9vbF90CitnZXRfYXJnIChjb25zdCBjaGFyICAqYXJnLAorICAgICAgICAgY29uc3QgY2hhciAgKm9wdGlvbiwKKyAgICAgICAgIGNvbnN0IGNoYXIgKip2YWx1ZV9wKQoreworICBjb25zdCBjaGFyICpmbjsKKworICBpZiAoc3RybGVuKGFyZykgPCBzdHJsZW4ob3B0aW9uKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIAorICBmbiA9IGFyZyArIHN0cmxlbihvcHRpb24pOworCisgIGlmICghKCpmbiA9PSAnPScgfHwgKmZuID09ICcgJyB8fCAqZm4gPT0gJ1wwJykpCisgICAgeworICAgICAgdXNhZ2UgKE5VTEwsIDEpOworICAgIH0KKyAgCisgIGlmICgqZm4gPT0gJz0nKQorICAgICsrZm47CisgIAorICB3aGlsZSAoKmZuID09ICcgJyAmJiAqZm4gIT0gJ1wwJykKKyAgICArK2ZuOworICAKKyAgaWYgKCpmbiAhPSAnXDAnKQorICAgIHsKKyAgICAgICp2YWx1ZV9wID0gZm47CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgcmV0dXJuIEZBTFNFOworfQorCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgIGludCBpOworICBjb25zdCBjaGFyICpmaWxlbmFtZTsKKyAgZGJ1c19ib29sX3QgZW5zdXJlX3V1aWQ7CisgIGRidXNfYm9vbF90IGdldF91dWlkOworICBEQnVzRXJyb3IgZXJyb3I7CisKKyAgZW5zdXJlX3V1aWQgPSBGQUxTRTsKKyAgZ2V0X3V1aWQgPSBGQUxTRTsKKyAgCisgIGZpbGVuYW1lID0gTlVMTDsKKworICBmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKQorICAgIHsKKyAgICAgIGNoYXIgKmFyZyA9IGFyZ3ZbaV07CisKKyAgICAgIGlmIChzdHJuY21wIChhcmcsICItLWVuc3VyZSIsIHN0cmxlbigiLS1lbnN1cmUiKSkgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIGdldF9hcmcgKGFyZywgIi0tZW5zdXJlIiwgJmZpbGVuYW1lKTsKKyAgICAgICAgICBlbnN1cmVfdXVpZCA9IFRSVUU7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHN0cm5jbXAgKGFyZywgIi0tZ2V0Iiwgc3RybGVuKCItLWdldCIpKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgZ2V0X2FyZyAoYXJnLCAiLS1nZXQiLCAmZmlsZW5hbWUpOworICAgICAgICAgIGdldF91dWlkID0gVFJVRTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICItLWhlbHAiKSA9PSAwKQorCXVzYWdlIChhcmd2WzBdLCAwKTsKKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAiLS12ZXJzaW9uIikgPT0gMCkKKyAgICAgICAgdmVyc2lvbiAoKTsKKyAgICAgIGVsc2UKKyAgICAgICAgdXNhZ2UgKGFyZ3ZbMF0sIDEpOworICAgIH0KKworICBpZiAoZ2V0X3V1aWQgJiYgZW5zdXJlX3V1aWQpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiQ2FuJ3Qgc3BlY2lmeSBib3RoIC0tZ2V0IGFuZCAtLWVuc3VyZVxuIik7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgZGJ1c19lcnJvcl9pbml0ICgmZXJyb3IpOworICAKKyAgaWYgKGdldF91dWlkIHx8IGVuc3VyZV91dWlkKQorICAgIHsKKyAgICAgIGNoYXIgKnV1aWQ7CisgICAgICBpZiAoZGJ1c19pbnRlcm5hbF9kb19ub3RfdXNlX2dldF91dWlkIChmaWxlbmFtZSwgJnV1aWQsIGVuc3VyZV91dWlkLCAmZXJyb3IpKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGdldF91dWlkKSAvKiBwcmludCBub3RoaW5nIG9uIC0tZW5zdXJlICovCisgICAgICAgICAgICBwcmludGYgKCIlc1xuIiwgdXVpZCk7CisgICAgICAgICAgZGJ1c19mcmVlICh1dWlkKTsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGNoYXIgKnV1aWQ7CisKKyAgICAgIGlmIChfZGJ1c19jcmVhdGVfdXVpZCAoJnV1aWQsICZlcnJvcikpCisgICAgICAgIHsKKyAgICAgICAgICBwcmludGYgKCIlc1xuIiwgdXVpZCk7CisgICAgICAgICAgZGJ1c19mcmVlICh1dWlkKTsKKyAgICAgICAgfQorICAgIH0KKworICBpZiAoZGJ1c19lcnJvcl9pc19zZXQgKCZlcnJvcikpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXNcbiIsIGVycm9yLm1lc3NhZ2UpOworICAgICAgZGJ1c19lcnJvcl9mcmVlICgmZXJyb3IpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZXhpdCAoMCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcnVuLXdpdGgtdG1wLXNlc3Npb24tYnVzLnNoIGIvdG9vbHMvcnVuLXdpdGgtdG1wLXNlc3Npb24tYnVzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjY4OGY5ZTQKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9ydW4td2l0aC10bXAtc2Vzc2lvbi1idXMuc2gKQEAgLTAsMCArMSw1NyBAQAorIyEgL2Jpbi9zaAorCitTQ1JJUFROQU1FPSIkMCIKK1dSQVBQRURfU0NSSVBUPSIkMSIKK3NoaWZ0CisKK0NPTkZJR19GSUxFPS4vdG1wLXNlc3Npb24tYnVzLiQkLmNvbmYKKworZGllICgpCit7CisgICAgZWNobyAiJFNDUklQVE5BTUU6ICQqIiA+JjIKKyAgICBybSAtZiAiJENPTkZJR19GSUxFIgorICAgIGV4aXQgMQorfQorCitpZiB0ZXN0IC16ICIkREJVU19UT1BfQlVJTERESVIiIDsgdGhlbgorICAgIGRpZSAiTXVzdCBzZXQgREJVU19UT1BfQlVJTERESVIiCitmaQorCitTRVJWSUNFX0RJUj0iJERCVVNfVE9QX0JVSUxERElSL3Rlc3QvZGF0YS92YWxpZC1zZXJ2aWNlLWZpbGVzIgorRVNDQVBFRF9TRVJWSUNFX0RJUj1gZWNobyAkU0VSVklDRV9ESVIgfCBzZWQgLWUgJ3MvXC8vXFxcXFxcLy9nJ2AKK2VjaG8gImVzY2FwZWQgc2VydmljZSBkaXIgaXM6ICRFU0NBUEVEX1NFUlZJQ0VfRElSIiA+JjIKKworaWYgdGVzdCAteiAiJFNPVVJDRV9DT05GSUdfRklMRSI7IHRoZW4KKyAgICBTT1VSQ0VfQ09ORklHX0ZJTEU9IiREQlVTX1RPUF9CVUlMRERJUi9idXMvc2Vzc2lvbi5jb25mIjsKK2ZpCisjIyBjcmVhdGUgYSBjb25maWd1cmF0aW9uIGZpbGUgYmFzZWQgb24gdGhlIHN0YW5kYXJkIHNlc3Npb24uY29uZgorY2F0ICRTT1VSQ0VfQ09ORklHX0ZJTEUgfCAgXAorICAgIHNlZCAtZSAncy88c3RhbmRhcmRfc2Vzc2lvbl9zZXJ2aWNlZGlycy4qJC88c2VydmljZWRpcj4nJEVTQ0FQRURfU0VSVklDRV9ESVInPFwvc2VydmljZWRpcj4vZycgfCAgXAorICAgIHNlZCAtZSAncy88aW5jbHVkZS4qJC8vZycgICAgICAgICAgICAgICAgXAorICA+ICRDT05GSUdfRklMRQorCitlY2hvICJDcmVhdGVkIGNvbmZpZ3VyYXRpb24gZmlsZSAkQ09ORklHX0ZJTEUiID4mMgorCitpZiAhIHRlc3QgLWUgIiREQlVTX1RPUF9CVUlMRERJUiIvYnVzL2RidXMtZGFlbW9uIDsgdGhlbgorICAgIGRpZSAiJERCVVNfVE9QX0JVSUxERElSL2J1cy9kYnVzLWRhZW1vbiBkb2VzIG5vdCBleGlzdCIKK2ZpCisKK1BBVEg9IiREQlVTX1RPUF9CVUlMRERJUiIvYnVzOiRQQVRICitleHBvcnQgUEFUSAorCisjIyB0aGUgbGlidG9vbCBzY3JpcHQgZm91bmQgYnkgdGhlIHBhdGggc2VhcmNoIHNob3VsZCBhbHJlYWR5IGRvIHRoaXMsIGJ1dAorTERfTElCUkFSWV9QQVRIPSREQlVTX1RPUF9CVUlMRERJUi9kYnVzLy5saWJzOiRMRF9MSUJSQVJZX1BBVEgKK2V4cG9ydCBMRF9MSUJSQVJZX1BBVEgKK3Vuc2V0IERCVVNfU0VTU0lPTl9CVVNfQUREUkVTUwordW5zZXQgREJVU19TRVNTSU9OX0JVU19QSUQKKworJERCVVNfVE9QX0JVSUxERElSL3Rvb2xzL2RidXMtcnVuLXNlc3Npb24gXAorICAgIC0tY29uZmlnLWZpbGU9IiRDT05GSUdfRklMRSIgXAorICAgIC0tZGJ1cy1kYWVtb249IiREQlVTX1RPUF9CVUlMRERJUi9idXMvZGJ1cy1kYWVtb24iIFwKKyAgICAtLSBcCisgICAgIiRXUkFQUEVEX1NDUklQVCIgIiRAIgorZXJyb3I9JD8KKworIyBjbGVhbiB1cAorcm0gLWYgIiRDT05GSUdfRklMRSIKK2V4aXQgJGVycm9yCmRpZmYgLS1naXQgYS90b29scy9zdHJ0b2xsLmMgYi90b29scy9zdHJ0b2xsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM2MGM2MwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3N0cnRvbGwuYwpAQCAtMCwwICsxLDE2NyBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDE5OTIsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpZmRlZiBIQVZFX0VSUk5PX0gKKyNpbmNsdWRlIDxlcnJuby5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaWZkZWYgREJVU19XSU5DRQorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNlbmRpZgorCisjaWZuZGVmIGlzc3BhY2UKKyNkZWZpbmUgaXNzcGFjZShjKSAoKGMpID09ICcgJyB8fCAoYykgPT0gJ1x0JyB8fCAoYykgPT0gJ1xyJyB8fCAoYykgPT0gJ1xuJykKKyNlbmRpZgorCisvKiBNaW5pbXVtIGFuZCBtYXhpbXVtIHZhbHVlcyBhIGBzaWduZWQgbG9uZyBsb25nIGludCcgY2FuIGhvbGQuICAqLworI2lmbmRlZiBMTE9OR19NQVgKKyMgICBkZWZpbmUgTExPTkdfTUFYCTkyMjMzNzIwMzY4NTQ3NzU4MDdMTAorI2VuZGlmCisKKyNpZm5kZWYgTExPTkdfTUlOCisjICAgZGVmaW5lIExMT05HX01JTgkoLUxMT05HX01BWCAtIDFMTCkKKyNlbmRpZgorLyogTWF4aW11bSB2YWx1ZSBhbiBgdW5zaWduZWQgbG9uZyBsb25nIGludCcgY2FuIGhvbGQuICAoTWluaW11bSBpcyAwLikgICovCisjaWZuZGVmIFVMTE9OR19NQVgKKyMgICBkZWZpbmUgVUxMT05HX01BWAkxODQ0Njc0NDA3MzcwOTU1MTYxNVVMTAorI2VuZGlmCisvKgorICogQ29udmVydCBhIHN0cmluZyB0byBhIGxvbmcgbG9uZyBpbnRlZ2VyLgorICoKKyAqIEFzc3VtZXMgdGhhdCB0aGUgdXBwZXIgYW5kIGxvd2VyIGNhc2UKKyAqIGFscGhhYmV0cyBhbmQgZGlnaXRzIGFyZSBlYWNoIGNvbnRpZ3VvdXMuCisgKi8KK2xvbmcgbG9uZyBzdHJ0b2xsIChjb25zdCBjaGFyKiwgY2hhciAqKiwgaW50KTsKKworbG9uZyBsb25nCitzdHJ0b2xsKGNvbnN0IGNoYXIgKiBucHRyLCBjaGFyICoqIGVuZHB0ciwgaW50IGJhc2UpCit7CisJY29uc3QgY2hhciAqczsKKwl1bnNpZ25lZCBsb25nIGxvbmcgYWNjOworCWNoYXIgYzsKKwl1bnNpZ25lZCBsb25nIGxvbmcgY3V0b2ZmOworCWludCBuZWcsIGFueSwgY3V0bGltOworCisJLyoKKwkgKiBTa2lwIHdoaXRlIHNwYWNlIGFuZCBwaWNrIHVwIGxlYWRpbmcgKy8tIHNpZ24gaWYgYW55LgorCSAqIElmIGJhc2UgaXMgMCwgYWxsb3cgMHggZm9yIGhleCBhbmQgMCBmb3Igb2N0YWwsIGVsc2UKKwkgKiBhc3N1bWUgZGVjaW1hbDsgaWYgYmFzZSBpcyBhbHJlYWR5IDE2LCBhbGxvdyAweC4KKwkgKi8KKwlzID0gbnB0cjsKKwlkbyB7CisJCWMgPSAqcysrOworCX0gd2hpbGUgKGlzc3BhY2UoKHVuc2lnbmVkIGNoYXIpYykpOworCWlmIChjID09ICctJykgeworCQluZWcgPSAxOworCQljID0gKnMrKzsKKwl9IGVsc2UgeworCQluZWcgPSAwOworCQlpZiAoYyA9PSAnKycpCisJCQljID0gKnMrKzsKKwl9CisJaWYgKChiYXNlID09IDAgfHwgYmFzZSA9PSAxNikgJiYKKwkgICAgYyA9PSAnMCcgJiYgKCpzID09ICd4JyB8fCAqcyA9PSAnWCcpICYmCisJICAgICgoc1sxXSA+PSAnMCcgJiYgc1sxXSA8PSAnOScpIHx8CisJICAgIChzWzFdID49ICdBJyAmJiBzWzFdIDw9ICdGJykgfHwKKwkgICAgKHNbMV0gPj0gJ2EnICYmIHNbMV0gPD0gJ2YnKSkpIHsKKwkJYyA9IHNbMV07CisJCXMgKz0gMjsKKwkJYmFzZSA9IDE2OworCX0KKwlpZiAoYmFzZSA9PSAwKQorCQliYXNlID0gYyA9PSAnMCcgPyA4IDogMTA7CisJYWNjID0gYW55ID0gMDsKKwlpZiAoYmFzZSA8IDIgfHwgYmFzZSA+IDM2KQorCQlnb3RvIG5vY29udjsKKworCS8qCisJICogQ29tcHV0ZSB0aGUgY3V0b2ZmIHZhbHVlIGJldHdlZW4gbGVnYWwgbnVtYmVycyBhbmQgaWxsZWdhbAorCSAqIG51bWJlcnMuICBUaGF0IGlzIHRoZSBsYXJnZXN0IGxlZ2FsIHZhbHVlLCBkaXZpZGVkIGJ5IHRoZQorCSAqIGJhc2UuICBBbiBpbnB1dCBudW1iZXIgdGhhdCBpcyBncmVhdGVyIHRoYW4gdGhpcyB2YWx1ZSwgaWYKKwkgKiBmb2xsb3dlZCBieSBhIGxlZ2FsIGlucHV0IGNoYXJhY3RlciwgaXMgdG9vIGJpZy4gIE9uZSB0aGF0CisJICogaXMgZXF1YWwgdG8gdGhpcyB2YWx1ZSBtYXkgYmUgdmFsaWQgb3Igbm90OyB0aGUgbGltaXQKKwkgKiBiZXR3ZWVuIHZhbGlkIGFuZCBpbnZhbGlkIG51bWJlcnMgaXMgdGhlbiBiYXNlZCBvbiB0aGUgbGFzdAorCSAqIGRpZ2l0LiAgRm9yIGluc3RhbmNlLCBpZiB0aGUgcmFuZ2UgZm9yIHF1YWRzIGlzCisJICogWy05MjIzMzcyMDM2ODU0Nzc1ODA4Li45MjIzMzcyMDM2ODU0Nzc1ODA3XSBhbmQgdGhlIGlucHV0IGJhc2UKKwkgKiBpcyAxMCwgY3V0b2ZmIHdpbGwgYmUgc2V0IHRvIDkyMjMzNzIwMzY4NTQ3NzU4MCBhbmQgY3V0bGltIHRvCisJICogZWl0aGVyIDcgKG5lZz09MCkgb3IgOCAobmVnPT0xKSwgbWVhbmluZyB0aGF0IGlmIHdlIGhhdmUKKwkgKiBhY2N1bXVsYXRlZCBhIHZhbHVlID4gOTIyMzM3MjAzNjg1NDc3NTgwLCBvciBlcXVhbCBidXQgdGhlCisJICogbmV4dCBkaWdpdCBpcyA+IDcgKG9yIDgpLCB0aGUgbnVtYmVyIGlzIHRvbyBiaWcsIGFuZCB3ZSB3aWxsCisJICogcmV0dXJuIGEgcmFuZ2UgZXJyb3IuCisJICoKKwkgKiBTZXQgJ2FueScgaWYgYW55IGBkaWdpdHMnIGNvbnN1bWVkOyBtYWtlIGl0IG5lZ2F0aXZlIHRvIGluZGljYXRlCisJICogb3ZlcmZsb3cuCisJICovCisJY3V0b2ZmID0gbmVnID8gKHVuc2lnbmVkIGxvbmcgbG9uZyktKExMT05HX01JTiArIExMT05HX01BWCkgKyBMTE9OR19NQVgKKwkgICAgOiBMTE9OR19NQVg7CisJY3V0bGltID0gY3V0b2ZmICUgYmFzZTsKKwljdXRvZmYgLz0gYmFzZTsKKwlmb3IgKCA7IDsgYyA9ICpzKyspIHsKKwkJaWYgKGMgPj0gJzAnICYmIGMgPD0gJzknKQorCQkJYyAtPSAnMCc7CisJCWVsc2UgaWYgKGMgPj0gJ0EnICYmIGMgPD0gJ1onKQorCQkJYyAtPSAnQScgLSAxMDsKKwkJZWxzZSBpZiAoYyA+PSAnYScgJiYgYyA8PSAneicpCisJCQljIC09ICdhJyAtIDEwOworCQllbHNlCisJCQlicmVhazsKKwkJaWYgKGMgPj0gYmFzZSkKKwkJCWJyZWFrOworCQlpZiAoYW55IDwgMCB8fCBhY2MgPiBjdXRvZmYgfHwgKGFjYyA9PSBjdXRvZmYgJiYgYyA+IGN1dGxpbSkpCisJCQlhbnkgPSAtMTsKKwkJZWxzZSB7CisJCQlhbnkgPSAxOworCQkJYWNjICo9IGJhc2U7CisJCQlhY2MgKz0gYzsKKwkJfQorCX0KKwlpZiAoYW55IDwgMCkgeworCQlhY2MgPSBuZWcgPyBMTE9OR19NSU4gOiBMTE9OR19NQVg7CisjaWZkZWYgREJVU19XSU5DRQorCQlTZXRMYXN0RXJyb3IgKEVSUk9SX0FSSVRITUVUSUNfT1ZFUkZMT1cpOworI2Vsc2UKKwkJZXJybm8gPSBFUkFOR0U7CisjZW5kaWYKKwl9IGVsc2UgaWYgKCFhbnkpIHsKK25vY29udjoKKyNpZmRlZiBEQlVTX1dJTkNFCisJCVNldExhc3RFcnJvciAoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOworI2Vsc2UKKwkJZXJybm8gPSBFSU5WQUw7CisjZW5kaWYKKwl9IGVsc2UgaWYgKG5lZykKKwkJYWNjID0gLWFjYzsKKwlpZiAoZW5kcHRyICE9IE5VTEwpCisJCSplbmRwdHIgPSAoY2hhciAqKShhbnkgPyBzIC0gMSA6IG5wdHIpOworCXJldHVybiAoYWNjKTsKK30KKwpkaWZmIC0tZ2l0IGEvdG9vbHMvc3RydG91bGwuYyBiL3Rvb2xzL3N0cnRvdWxsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU1OTU1NAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3N0cnRvdWxsLmMKQEAgLTAsMCArMSwxNDUgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAxOTkyLCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaW5jbHVkZSA8bGltaXRzLmg+CisjaWZkZWYgSEFWRV9FUlJOT19ICisjaW5jbHVkZSA8ZXJybm8uaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2lmZGVmIERCVVNfV0lOQ0UKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjZW5kaWYKKworI2lmbmRlZiBpc3NwYWNlCisjZGVmaW5lIGlzc3BhY2UoYykgKChjKSA9PSAnICcgfHwgKGMpID09ICdcdCcgfHwgKGMpID09ICdccicgfHwgKGMpID09ICdcbicpCisjZW5kaWYKKworLyogTWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZXMgYSBgc2lnbmVkIGxvbmcgbG9uZyBpbnQnIGNhbiBob2xkLiAgKi8KKyNpZm5kZWYgTExPTkdfTUFYCisjICAgZGVmaW5lIExMT05HX01BWAk5MjIzMzcyMDM2ODU0Nzc1ODA3TEwKKyNlbmRpZgorCisjaWZuZGVmIExMT05HX01JTgorIyAgIGRlZmluZSBMTE9OR19NSU4JKC1MTE9OR19NQVggLSAxTEwpCisjZW5kaWYKKy8qIE1heGltdW0gdmFsdWUgYW4gYHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQnIGNhbiBob2xkLiAgKE1pbmltdW0gaXMgMC4pICAqLworI2lmbmRlZiBVTExPTkdfTUFYCisjICAgZGVmaW5lIFVMTE9OR19NQVgJMTg0NDY3NDQwNzM3MDk1NTE2MTVVTEwKKyNlbmRpZgorCisvKgorICogQ29udmVydCBhIHN0cmluZyB0byBhbiB1bnNpZ25lZCBsb25nIGxvbmcgaW50ZWdlci4KKyAqCisgKiBBc3N1bWVzIHRoYXQgdGhlIHVwcGVyIGFuZCBsb3dlciBjYXNlCisgKiBhbHBoYWJldHMgYW5kIGRpZ2l0cyBhcmUgZWFjaCBjb250aWd1b3VzLgorICovCit1bnNpZ25lZCBsb25nIGxvbmcgc3RydG91bGwgKGNvbnN0IGNoYXIgKiwgY2hhciAqKiwgaW50KTsKKwordW5zaWduZWQgbG9uZyBsb25nCitzdHJ0b3VsbChjb25zdCBjaGFyICogbnB0ciwgY2hhciAqKiBlbmRwdHIsIGludCBiYXNlKQoreworCWNvbnN0IGNoYXIgKnM7CisJdW5zaWduZWQgbG9uZyBsb25nIGFjYzsKKwljaGFyIGM7CisJdW5zaWduZWQgbG9uZyBsb25nIGN1dG9mZjsKKwlpbnQgbmVnLCBhbnksIGN1dGxpbTsKKworCS8qCisJICogU2VlIHN0cnRvcSBmb3IgY29tbWVudHMgYXMgdG8gdGhlIGxvZ2ljIHVzZWQuCisJICovCisJcyA9IG5wdHI7CisJZG8geworCQljID0gKnMrKzsKKwl9IHdoaWxlIChpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKWMpKTsKKwlpZiAoYyA9PSAnLScpIHsKKwkJbmVnID0gMTsKKwkJYyA9ICpzKys7CisJfSBlbHNlIHsKKwkJbmVnID0gMDsKKwkJaWYgKGMgPT0gJysnKQorCQkJYyA9ICpzKys7CisJfQorCWlmICgoYmFzZSA9PSAwIHx8IGJhc2UgPT0gMTYpICYmCisJICAgIGMgPT0gJzAnICYmICgqcyA9PSAneCcgfHwgKnMgPT0gJ1gnKSAmJgorCSAgICAoKHNbMV0gPj0gJzAnICYmIHNbMV0gPD0gJzknKSB8fAorCSAgICAoc1sxXSA+PSAnQScgJiYgc1sxXSA8PSAnRicpIHx8CisJICAgIChzWzFdID49ICdhJyAmJiBzWzFdIDw9ICdmJykpKSB7CisJCWMgPSBzWzFdOworCQlzICs9IDI7CisJCWJhc2UgPSAxNjsKKwl9CisJaWYgKGJhc2UgPT0gMCkKKwkJYmFzZSA9IGMgPT0gJzAnID8gOCA6IDEwOworCWFjYyA9IGFueSA9IDA7CisJaWYgKGJhc2UgPCAyIHx8IGJhc2UgPiAzNikKKwkJZ290byBub2NvbnY7CisKKwljdXRvZmYgPSBVTExPTkdfTUFYIC8gYmFzZTsKKwljdXRsaW0gPSBVTExPTkdfTUFYICUgYmFzZTsKKwlmb3IgKCA7IDsgYyA9ICpzKyspIHsKKwkJaWYgKGMgPj0gJzAnICYmIGMgPD0gJzknKQorCQkJYyAtPSAnMCc7CisJCWVsc2UgaWYgKGMgPj0gJ0EnICYmIGMgPD0gJ1onKQorCQkJYyAtPSAnQScgLSAxMDsKKwkJZWxzZSBpZiAoYyA+PSAnYScgJiYgYyA8PSAneicpCisJCQljIC09ICdhJyAtIDEwOworCQllbHNlCisJCQlicmVhazsKKwkJaWYgKGMgPj0gYmFzZSkKKwkJCWJyZWFrOworCQlpZiAoYW55IDwgMCB8fCBhY2MgPiBjdXRvZmYgfHwgKGFjYyA9PSBjdXRvZmYgJiYgYyA+IGN1dGxpbSkpCisJCQlhbnkgPSAtMTsKKwkJZWxzZSB7CisJCQlhbnkgPSAxOworCQkJYWNjICo9IGJhc2U7CisJCQlhY2MgKz0gYzsKKwkJfQorCX0KKwlpZiAoYW55IDwgMCkgeworCQlhY2MgPSBVTExPTkdfTUFYOworI2lmZGVmIERCVVNfV0lOQ0UKKwkJU2V0TGFzdEVycm9yIChFUlJPUl9BUklUSE1FVElDX09WRVJGTE9XKTsKKyNlbHNlCisJCWVycm5vID0gRVJBTkdFOworI2VuZGlmCisJfSBlbHNlIGlmICghYW55KSB7Citub2NvbnY6CisjaWZkZWYgREJVU19XSU5DRQorCQlTZXRMYXN0RXJyb3IgKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKKyNlbHNlCisJCWVycm5vID0gRUlOVkFMOworI2VuZGlmCisJfSBlbHNlIGlmIChuZWcpCisJCWFjYyA9IC1hY2M7CisJaWYgKGVuZHB0ciAhPSBOVUxMKQorCQkqZW5kcHRyID0gKGNoYXIgKikoYW55ID8gcyAtIDEgOiBucHRyKTsKKwlyZXR1cm4gKGFjYyk7Cit9CmRpZmYgLS1naXQgYS90b29scy90ZXN0LXRvb2wuYyBiL3Rvb2xzL3Rlc3QtdG9vbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0OWMxMGEKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy90ZXN0LXRvb2wuYwpAQCAtMCwwICsxLDg4IEBACisvKiAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyAtKi0gKi8KKy8qIGRidXMtdGVzdC10b29sIC0gRC1CdXMgc3dpc3MgYXJteSBrbmlmZQorICoKKyAqIENvcHlyaWdodCDCqSAyMDAzIFBoaWxpcCBCbHVuZGVsbCA8cGhpbGJAZ251Lm9yZz4KKyAqIENvcHlyaWdodCDCqSAyMDExIE5va2lhIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgwqkgMjAxNCBDb2xsYWJvcmEgTHRkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAidGVzdC10b29sLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLmg+CisKK3N0YXRpYyBzdHJ1Y3QgeworICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgaW50ICgqY2FsbGJhY2spIChpbnQsIGNoYXIgKiopOworfSBzdWJjb21tYW5kc1tdID0geworICAgICAgeyAiYmxhY2staG9sZSIsIGRidXNfdGVzdF90b29sX2JsYWNrX2hvbGUgfSwKKyAgICAgIHsgImVjaG8iLCAgICAgICBkYnVzX3Rlc3RfdG9vbF9lY2hvIH0sCisgICAgICB7ICJzcGFtIiwgICAgICAgZGJ1c190ZXN0X3Rvb2xfc3BhbSB9LAorICAgICAgeyBOVUxMLCBOVUxMIH0KK307CisKK3N0YXRpYyB2b2lkIHVzYWdlIChpbnQgZXhpdF93aXRoKSBfREJVU19HTlVDX05PUkVUVVJOOworCitzdGF0aWMgdm9pZAordXNhZ2UgKGludCBleGl0X3dpdGgpCit7CisgIGludCBpOworCisgIGZwcmludGYgKHN0ZGVyciwKKyAgICAgICAgICAgIlVzYWdlOiBkYnVzLXRlc3QtdG9vbCBTVUJDT01NQU5EIFtPUFRJT05TXVxuIgorICAgICAgICAgICAiXG4iCisgICAgICAgICAgICJLbm93biBTVUJDT01NQU5EcyBhcmU6XG4iCisgICAgICAgICAgICJcbiIKKyAgICAgICAgICAgKTsKKworICBmb3IgKGkgPSAwOyBzdWJjb21tYW5kc1tpXS5uYW1lICE9IE5VTEw7IGkrKykKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICItICVzXG4iLCBzdWJjb21tYW5kc1tpXS5uYW1lKTsKKyAgICB9CisKKyAgZnByaW50ZiAoc3RkZXJyLAorICAgICAgICAgICAiXG4iCisgICAgICAgICAgICJGb3IgbW9yZSBpbmZvcm1hdGlvbjogZGJ1cy10ZXN0LXRvb2wgU1VCQ09NTUFORCAtLWhlbHBcbiIKKyAgICAgICAgICAgKTsKKworICBleGl0IChleGl0X3dpdGgpOworfQorCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgaW50IGk7CisKKyAgaWYgKGFyZ2MgPCAyKQorICAgIHsKKyAgICAgIHVzYWdlICgyKTsKKyAgICB9CisKKyAgZm9yIChpID0gMDsgc3ViY29tbWFuZHNbaV0ubmFtZSAhPSBOVUxMOyBpKyspCisgICAgeworICAgICAgaWYgKCFzdHJjbXAgKGFyZ3ZbMV0sIHN1YmNvbW1hbmRzW2ldLm5hbWUpKQorICAgICAgICByZXR1cm4gc3ViY29tbWFuZHNbaV0uY2FsbGJhY2sgKGFyZ2MsIGFyZ3YpOworICAgIH0KKworICB1c2FnZSAoMik7CisgIHJldHVybiAyOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdC10b29sLmggYi90b29scy90ZXN0LXRvb2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTQzY2Q1Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvdGVzdC10b29sLmgKQEAgLTAsMCArMSwzMSBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiBkYnVzLXRlc3QtdG9vbCAtIEQtQnVzIHN3aXNzIGFybXkga25pZmUKKyAqCisgKiBDb3B5cmlnaHQgwqkgMjAwMyBQaGlsaXAgQmx1bmRlbGwgPHBoaWxiQGdudS5vcmc+CisgKiBDb3B5cmlnaHQgwqkgMjAxMSBOb2tpYSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IMKpIDIwMTQgQ29sbGFib3JhIEx0ZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBEQlVTX1RFU1RfVE9PTF9ICisjZGVmaW5lIERCVVNfVEVTVF9UT09MX0gKKworaW50IGRidXNfdGVzdF90b29sX2JsYWNrX2hvbGUgKGludCBhcmdjLCBjaGFyICoqYXJndik7CitpbnQgZGJ1c190ZXN0X3Rvb2xfZWNobyAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KTsKK2ludCBkYnVzX3Rlc3RfdG9vbF9zcGFtIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rvb2wtY29tbW9uLmMgYi90b29scy90b29sLWNvbW1vbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyMDIwMzIKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy90b29sLWNvbW1vbi5jCkBAIC0wLDAgKzEsODIgQEAKKy8qIC0qLSBtb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IC0qLSAqLworLyogdG9vbC1jb21tb24gLSBjb21tb24gZnVuY3Rpb25hbGl0eSBmb3IgZGJ1cy10ZXN0LXRvb2wgbW9kdWxlcworICoKKyAqIENvcHlyaWdodCDCqSAyMDAzIFBoaWxpcCBCbHVuZGVsbCA8cGhpbGJAZ251Lm9yZz4KKyAqIENvcHlyaWdodCDCqSAyMDExIE5va2lhIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgwqkgMjAxNCBDb2xsYWJvcmEgTHRkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAidG9vbC1jb21tb24uaCIKKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisKKyNpZmRlZiBEQlVTX1dJTgorI2luY2x1ZGUgPGlvLmg+CisjaW5jbHVkZSA8d2luZG93cy5oPgorI2Vsc2UKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorCit2b2lkCit0b29sX29vbSAoY29uc3QgY2hhciAqZG9pbmcpCit7CisgIGZwcmludGYgKHN0ZGVyciwgIk9PTSB3aGlsZSAlc1xuIiwgZG9pbmcpOworICBleGl0ICgxKTsKK30KKworI2lmZGVmIERCVVNfV0lOCit0eXBlZGVmIGludCBXcml0ZVJlc3VsdDsKKyNkZWZpbmUgd3JpdGUoZmQsIGJ1ZiwgbGVuKSBfd3JpdGUoZmQsIGJ1ZiwgbGVuKQorI2Vsc2UKK3R5cGVkZWYgc3NpemVfdCBXcml0ZVJlc3VsdDsKKyNlbmRpZgorCitkYnVzX2Jvb2xfdAordG9vbF93cml0ZV9hbGwgKGludCBmZCwKKyAgICBjb25zdCB2b2lkICpidWYsCisgICAgc2l6ZV90IHNpemUpCit7CisgIGNvbnN0IGNoYXIgKnAgPSBidWY7CisgIHNpemVfdCBieXRlc193cml0dGVuID0gMDsKKworICB3aGlsZSAoc2l6ZSA+IGJ5dGVzX3dyaXR0ZW4pCisgICAgeworICAgICAgV3JpdGVSZXN1bHQgcmVzID0gd3JpdGUgKGZkLCBwLCBzaXplIC0gYnl0ZXNfd3JpdHRlbik7CisKKyAgICAgIGlmIChyZXMgPCAwKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGVycm5vID09IEVJTlRSKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBzaXplX3QgdGhpc190aW1lID0gKHNpemVfdCkgcmVzOworICAgICAgICAgIHAgKz0gdGhpc190aW1lOworICAgICAgICAgIGJ5dGVzX3dyaXR0ZW4gKz0gdGhpc190aW1lOworICAgICAgICB9CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvdG9vbC1jb21tb24uaCBiL3Rvb2xzL3Rvb2wtY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTYzOTdmZgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Rvb2wtY29tbW9uLmgKQEAgLTAsMCArMSwzOCBAQAorLyogLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImdudSI7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgLSotICovCisvKiB0b29sLWNvbW1vbiAtIGNvbW1vbiBmdW5jdGlvbmFsaXR5IGZvciBkYnVzLXRlc3QtdG9vbCBtb2R1bGVzCisgKgorICogQ29weXJpZ2h0IMKpIDIwMDMgUGhpbGlwIEJsdW5kZWxsIDxwaGlsYkBnbnUub3JnPgorICogQ29weXJpZ2h0IMKpIDIwMTEgTm9raWEgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCDCqSAyMDE0IENvbGxhYm9yYSBMdGQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpZm5kZWYgREJVU19UT09MX0NPTU1PTl9ICisjZGVmaW5lIERCVVNfVE9PTF9DT01NT05fSAorCisjaW5jbHVkZSA8ZGJ1cy9kYnVzLmg+CisKKyNpZiAwCisjZGVmaW5lIFZFUkJPU0UgZnByaW50ZgorI2Vsc2UKKyNkZWZpbmUgVkVSQk9TRSguLi4pIGRvIHt9IHdoaWxlICgwKQorI2VuZGlmCisKK3ZvaWQgdG9vbF9vb20gKGNvbnN0IGNoYXIgKmRvaW5nKSBfREJVU19HTlVDX05PUkVUVVJOOworZGJ1c19ib29sX3QgdG9vbF93cml0ZV9hbGwgKGludCBmZCwgY29uc3Qgdm9pZCAqYnVmLCBzaXplX3Qgc2l6ZSk7CisKKyNlbmRpZgo=